ZGlmZiAtLWdpdCBhLy5ienJpZ25vcmUgYi8uYnpyaWdub3JlCmluZGV4IDI1MjcwNTIuLmFiY2E2YjEgMTAwNjQ0Ci0tLSBhLy5ienJpZ25vcmUKKysrIGIvLmJ6cmlnbm9yZQpAQCAtMTEsNiArMTEsNyBAQAogYnVpbGQKIE1ha2VmaWxlLnByZQogcGxhdGZvcm0KK3B5YnVpbGRkaXIudHh0CiBweWNvbmZpZy5oCiBsaWJweXRob24qLmEKIGxpYnB5dGhvbiouc28qCmRpZmYgLS1naXQgYS8uaGdlb2wgYi8uaGdlb2wKaW5kZXggZmU2NjYwNS4uNzlkODQ5ZSAxMDA2NDQKLS0tIGEvLmhnZW9sCisrKyBiLy5oZ2VvbApAQCAtMTAsNiArMTAsOCBAQAogKioudnNwcm9wcyA9IEJJTgogCiAqKi5haWYgID0gQklOCisqKi5haWZjID0gQklOCisqKi5haWZmID0gQklOCiAqKi5hdSAgID0gQklOCiAqKi5ibXAgID0gQklOCiAqKi5kYiAgID0gQklOCkBAIC0yMyw2ICsyNSw3IEBACiAqKi5wbmcgID0gQklOCiAqKi5wc2QgID0gQklOCiAqKi50YXIgID0gQklOCisqKi53YXYgID0gQklOCiAqKi54YXIgID0gQklOCiAqKi56aXAgID0gQklOCiAKZGlmZiAtLWdpdCBhLy5oZ2lnbm9yZSBiLy5oZ2lnbm9yZQppbmRleCA4YzQwMmZmLi5lMzBlYzg2IDEwMDY0NAotLS0gYS8uaGdpZ25vcmUKKysrIGIvLmhnaWdub3JlCkBAIC0xLDYgKzEsOCBAQAogLmdkYl9oaXN0b3J5CiAucHVyaWZ5CiAuc3ZuLworXi5pZGVhLworLkRTX1N0b3JlCiBNYWtlZmlsZSQKIE1ha2VmaWxlLnByZSQKIFRBR1MkCkBAIC0zNCw2ICszNiw3IEBACiBQYXJzZXIvcGdlbi5zdGFtcCQKIF5jb3JlCiBecHl0aG9uLWdkYi5weQorXnB5YnVpbGRkaXIudHh0CiAKIHN5bnRheDogZ2xvYgogcHl0aG9uLmV4ZS1nZGIucHkKZGlmZiAtLWdpdCBhLy5oZ3RhZ3MgYi8uaGd0YWdzCmluZGV4IDJlNTk3OTEuLjczMTFhOWQgMTAwNjQ0Ci0tLSBhLy5oZ3RhZ3MKKysrIGIvLmhndGFncwpAQCAtMTM3LDYgKzEzNyw5IEBACiBjMWRjOWU3OTg2YTJhOGUxMDcwZWM3YmVlNzQ4NTIwZmViZWYzODJlIHYyLjYuNnJjMQogZTE4OWRjOGZkNjYxNTRlZjQ2ZDljZDIyNTg0ZDU2NjY5YjU0NGNhMyB2Mi42LjZyYzIKIDlmODc3MWUwOTA1Mjc3ZjhiM2MyNzk5MTEzYTA2MmZkYTQxNjQ5OTUgdjIuNi42CitjYWFiMDhjZDJiM2ViNWE2Zjc4NDc5YjI1MTNiNjVkMzZjNzU0ZjQxIHYyLjYuOHJjMQorMWQxYjdiOWZhZDQ4YmQwZGM2MGRjOGEwNmNjYTQ0NTllZjI3MzEyNyB2Mi42LjhyYzIKK2M5OTEwZmQwMjJmYzg0MmU1NTc4ZTFiZjVhMzBiYTU1YTM3MjM5ZmMgdjIuNi44CiBiNDEwN2ViMDBiNDI3MWZiNzNhOWUxYjczNmQ0ZjIzNDYwOTUwNzc4IHYyLjdhMQogYWRjODVlYmM3MjcxY2MyMmUyNGU4MTY3ODJiYjJiOGQ3ZmEzYTZiMyB2Mi43YTIKIDQxODA1NTdiN2E5YmI5ZGQ1MzQxYTE4YWYxOTlmODQzZjE5OWU0NmUgdjIuN2EzCkBAIC0xNTAsMyArMTUzLDE2IEBACiA1Mzk1Zjk2NTg4ZDRmMDE5OWQzMjljYjc5ZWIxMDk2NDhkYzRlZjVlIHYyLjcuMQogZjQ4NzU2Njg1NDA2ZThkMGZhOWQyM2Q4NDFmY2ViMDdlMzZhNTY1NiB2Mi43LjJyYzEKIDg1Mjc0Mjc5MTRhMjlkODk1YmNiMzBiZTc2YTQ2NTE0Mzk5M2E3OTMgdjIuNy4yCitiMmM2YWZmOTZlMTI1MWE0ZjAzY2Y4NjZlN2U3NWZiODIzMjg2OWYyIHYyLjcuM3JjMQorZDQ2YzE5NzNkM2M0MDdlY2FhNmE4ZWUxNmQzZmFkM2VmNTA2YjUxZiB2Mi43LjNyYzIKKzcwMjc0ZDUzYzFkZGM2MGM1ZjlhMmI4YTQyMmE0OTg4NDAyMTQ0N2MgdjIuNy4zCithOGQxODc4MGJjMmJjY2YxNmJmNTgwNTg3ZTFlM2M5MzRhOThmNmE3IHYyLjcuNHJjMQorMDI2ZWUwMDU3ZTJkMzMwNWY5MGE5ZGE0MWRhZjdjM2Y5ZWIxZTgxNCB2Mi43LjQKK2FiMDVlN2RkMjc4ODliOTNmMjBkOTdiYWU4NjE3MGFhYmZlNDVhY2UgdjIuNy41CithMDAyNTAzN2YxMWE3M2RmNWE3ZGQwM2U1YTQwMjdhZGFkNGNiOTRlIHYyLjYuOXJjMQorZmNiM2VjMjg0MmY5OTQ1NDMyMjQ5MmRkMGVjMmNmMDEzMjJkZjA5MyB2Mi42LjkKKzQ5MTNkMGU5YmUzMDY2NjIxOGNjNGQ3MTM5MzdlODFjMGU3ZjM0NmEgdjIuNy42cmMxCiszYTFkYjBkMjc0N2VjMmQ0N2E4NjkzZWQ1NjUwZjM1NjcxNjFhMjAwIHYyLjcuNgorZTMyZTNhOWYzOTAyMTI0NjNjMjI1MDlkMGY5YWVhZDgwNTFjZWU2MyB2Mi43LjdyYzEKK2Y4OTIxNjA1OWVkZjc3NjYwZWYxZWIyYTk4ZTg4MzUyNTUxZGExZDYgdjIuNy43CitlZTg3OWMwZmZhMTFjYWFhMzRiZjAxNTM3ZTFjNDQxMWRkOTQ4NTUyIHYyLjcuOApkaWZmIC0tZ2l0IGEvRGVtby9jb21wYXJpc29ucy9wYXR0ZXJucyBiL0RlbW8vY29tcGFyaXNvbnMvcGF0dGVybnMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvRGVtby9jdXJzZXMvbmN1cnNlcy5weSBiL0RlbW8vY3Vyc2VzL25jdXJzZXMucHkKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQpkaWZmIC0tZ2l0IGEvRGVtby9jdXJzZXMvcmFpbi5weSBiL0RlbW8vY3Vyc2VzL3JhaW4ucHkKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQpkaWZmIC0tZ2l0IGEvRGVtby9jdXJzZXMvdGNsb2NrLnB5IGIvRGVtby9jdXJzZXMvdGNsb2NrLnB5Cm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKZGlmZiAtLWdpdCBhL0RlbW8vbWQ1dGVzdC9mb28gYi9EZW1vL21kNXRlc3QvZm9vCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL0RlbW8vbmV3bWV0YWNsYXNzZXMvRWlmZmVsLnB5IGIvRGVtby9uZXdtZXRhY2xhc3Nlcy9FaWZmZWwucHkKaW5kZXggNzMwYTg1ZC4uZjNmMTE2ZiAxMDA2NDQKLS0tIGEvRGVtby9uZXdtZXRhY2xhc3Nlcy9FaWZmZWwucHkKKysrIGIvRGVtby9uZXdtZXRhY2xhc3Nlcy9FaWZmZWwucHkKQEAgLTI5LDcgKzI5LDcgQEAKICAgICAgICAgICAgIHByZSA9IGRpY3QuZ2V0KCIlc19wcmUiICUgbSkKICAgICAgICAgICAgIHBvc3QgPSBkaWN0LmdldCgiJXNfcG9zdCIgJSBtKQogICAgICAgICAgICAgaWYgcHJlIG9yIHBvc3Q6Ci0gICAgICAgICAgICAgICAgZGljdFtrXSA9IGNscy5tYWtlX2VpZmZlbF9tZXRob2QoZGljdFttXSwgcHJlLCBwb3N0KQorICAgICAgICAgICAgICAgIGRpY3RbbV0gPSBjbHMubWFrZV9laWZmZWxfbWV0aG9kKGRpY3RbbV0sIHByZSwgcG9zdCkKIAogY2xhc3MgRWlmZmVsTWV0YUNsYXNzMShFaWZmZWxCYXNlTWV0YUNsYXNzKToKICAgICAjIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSAiZWlmZmVsIiBtZXRhIGNsYXNzIHRoYXQgdXNlcyBuZXN0ZWQgZnVuY3Rpb25zCmRpZmYgLS1naXQgYS9EZW1vL3NjcmlwdHMvbmV3c2xpc3QuZG9jIGIvRGVtby9zY3JpcHRzL25ld3NsaXN0LmRvYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9EZW1vL3RpeC9iaXRtYXBzL2Fib3V0LnhwbSBiL0RlbW8vdGl4L2JpdG1hcHMvYWJvdXQueHBtCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL0RlbW8vdGl4L2JpdG1hcHMvYm9sZC54Ym0gYi9EZW1vL3RpeC9iaXRtYXBzL2JvbGQueGJtCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL0RlbW8vdGl4L2JpdG1hcHMvY2FwaXRhbC54Ym0gYi9EZW1vL3RpeC9iaXRtYXBzL2NhcGl0YWwueGJtCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL0RlbW8vdGl4L2JpdG1hcHMvY2VudGVyai54Ym0gYi9EZW1vL3RpeC9iaXRtYXBzL2NlbnRlcmoueGJtCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL0RlbW8vdGl4L2JpdG1hcHMvY29tYm9ib3gueGJtIGIvRGVtby90aXgvYml0bWFwcy9jb21ib2JveC54Ym0Kb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvRGVtby90aXgvYml0bWFwcy9jb21ib2JveC54cG0gYi9EZW1vL3RpeC9iaXRtYXBzL2NvbWJvYm94LnhwbQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9EZW1vL3RpeC9iaXRtYXBzL2NvbWJvYm94LnhwbS4xIGIvRGVtby90aXgvYml0bWFwcy9jb21ib2JveC54cG0uMQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9EZW1vL3RpeC9iaXRtYXBzL2RyaXZlYS54Ym0gYi9EZW1vL3RpeC9iaXRtYXBzL2RyaXZlYS54Ym0Kb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvRGVtby90aXgvYml0bWFwcy9kcml2ZWEueHBtIGIvRGVtby90aXgvYml0bWFwcy9kcml2ZWEueHBtCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL0RlbW8vdGl4L2JpdG1hcHMvZXhpdC54cG0gYi9EZW1vL3RpeC9iaXRtYXBzL2V4aXQueHBtCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL0RlbW8vdGl4L2JpdG1hcHMvZmlsZWJveC54Ym0gYi9EZW1vL3RpeC9iaXRtYXBzL2ZpbGVib3gueGJtCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL0RlbW8vdGl4L2JpdG1hcHMvZmlsZWJveC54cG0gYi9EZW1vL3RpeC9iaXRtYXBzL2ZpbGVib3gueHBtCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL0RlbW8vdGl4L2JpdG1hcHMvaXRhbGljLnhibSBiL0RlbW8vdGl4L2JpdG1hcHMvaXRhbGljLnhibQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9EZW1vL3RpeC9iaXRtYXBzL2p1c3RpZnkueGJtIGIvRGVtby90aXgvYml0bWFwcy9qdXN0aWZ5LnhibQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9EZW1vL3RpeC9iaXRtYXBzL2xlZnRqLnhibSBiL0RlbW8vdGl4L2JpdG1hcHMvbGVmdGoueGJtCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL0RlbW8vdGl4L2JpdG1hcHMvbmV0dy54Ym0gYi9EZW1vL3RpeC9iaXRtYXBzL25ldHcueGJtCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL0RlbW8vdGl4L2JpdG1hcHMvbmV0dy54cG0gYi9EZW1vL3RpeC9iaXRtYXBzL25ldHcueHBtCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL0RlbW8vdGl4L2JpdG1hcHMvb3B0bWVudS54cG0gYi9EZW1vL3RpeC9iaXRtYXBzL29wdG1lbnUueHBtCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL0RlbW8vdGl4L2JpdG1hcHMvcmlnaHRqLnhibSBiL0RlbW8vdGl4L2JpdG1hcHMvcmlnaHRqLnhibQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9EZW1vL3RpeC9iaXRtYXBzL3NlbGVjdC54cG0gYi9EZW1vL3RpeC9iaXRtYXBzL3NlbGVjdC54cG0Kb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvRGVtby90aXgvYml0bWFwcy91bmRlcmxpbmUueGJtIGIvRGVtby90aXgvYml0bWFwcy91bmRlcmxpbmUueGJtCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9ndWlkby9jYW52YXNldmVudHMucHkgYi9EZW1vL3RraW50ZXIvZ3VpZG8vY2FudmFzZXZlbnRzLnB5Cm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9ndWlkby9uZXdtZW51YmFyZGVtby5weSBiL0RlbW8vdGtpbnRlci9ndWlkby9uZXdtZW51YmFyZGVtby5weQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmRpZmYgLS1naXQgYS9EZW1vL3RraW50ZXIvZ3VpZG8vc29ydHZpc3UucHkgYi9EZW1vL3RraW50ZXIvZ3VpZG8vc29ydHZpc3UucHkKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQpkaWZmIC0tZ2l0IGEvRGVtby90dXJ0bGUvZGVtb2hlbHAudHh0IGIvRGVtby90dXJ0bGUvZGVtb2hlbHAudHh0CmluZGV4IGQ1NjU2OTEuLjdkMTM3NjMgMTAwNjQ0Ci0tLSBhL0RlbW8vdHVydGxlL2RlbW9oZWxwLnR4dAorKysgYi9EZW1vL3R1cnRsZS9kZW1vaGVscC50eHQKQEAgLTIsNyArMiw3IEBACiAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0gICAgICB4dHVydGxlRGVtbyAtIEhlbHAKKyAgICAgIHR1cnRsZURlbW8gLSBIZWxwCiAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC01MiwyNCArNTIsMzMgQEAKIAogCiAgICAoMikgSG93IHRvIGFkZCB5b3VyIG93biBkZW1vcyB0byB0aGUgZGVtbyByZXBvc2l0b3J5CisgICAgIElNUE9SVEFOVCEgV2hlbiBpbXBvcnRlZCwgdGhlIGRlbW8gc2hvdWxkIG5vdCBtb2RpZnkgdGhlIHN5c3RlbQorICAgICBieSBjYWxsaW5nIGZ1bmN0aW9ucyBpbiBvdGhlciBtb2R1bGVzLCBzdWNoIGFzIHN5cywgdGtpbnRlciwgb3IKKyAgICAgdHVydGxlLiBHbG9iYWwgdmFyaWFibGVzIHNob3VsZCBiZSBpbml0aWFsaXplZCBpbiBtYWluKCkuCiAKLSAgIC0gc2NyaXB0bmFtZTogbXVzdCBiZWdpbiB3aXRoIHRkZW1vXyAsCisgICAtIFRoZSBzY3JpcHQgbmFtZSBtdXN0IGJlZ2luIHdpdGggdGRlbW9fICwKICAgICAgc28gaXQgbXVzdCBoYXZlIHRoZSBmb3JtIHRkZW1vXzx5b3VyLXNjcmlwdC1uYW1lPi5weQogCi0gICAtIHBsYWNlOiBzYW1lIGRpcmVjdG9yeSBhcyB4dHVydGxlRGVtby5weSBvciBzb21lCi0gICAgIHN1YmRpcmVjdG9yeSwgdGhlIG5hbWUgb2Ygd2hpY2ggbXVzdCBhbHNvIGJlZ2luIHdpdGgKLSAgICAgdGRlbW9fLi4uLi4KKyAgIC0gVGhlIGNvZGUgbXVzdCBjb250YWluIGEgbWFpbigpIGZ1bmN0aW9uIHdoaWNoIHdpbGwKKyAgICAgYmUgZXhlY3V0ZWQgYnkgdGhlIHZpZXdlciAoc2VlIHByb3ZpZGVkIGV4YW1wbGUgc2NyaXB0cykuCisgICAgIEl0IG1heSByZXR1cm4gYSBzdHJpbmcgd2hpY2ggd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIExhYmVsIGJlbG93CisgICAgIHRoZSBzb3VyY2UgY29kZSB3aW5kb3cgKHdoZW4gZXhlY3V0aW9uIGhhcyBmaW5pc2hlZC4pCisJICAgCisgICAtIEluIG9yZGVyIHRvIHJ1biBteWRlbW8ucHkgYnkgaXRzZWxmLCBzdWNoIGFzIGR1cmluZyBkZXZlbG9wbWVudCwKKyAgICAgYWRkIHRoZSBmb2xsb3dpbmcgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZToKIAotICAgLSByZXF1aXJlbWVudHMgb24gc291cmNlIGNvZGU6Ci0gICAgICAgY29kZSBtdXN0IGNvbnRhaW4gYSBtYWluKCkgZnVuY3Rpb24gd2hpY2ggd2lsbAotICAgICAgIGJlIGV4ZWN1dGVkIGJ5IHRoZSB2aWV3ZXIgKHNlZSBwcm92aWRlZCBleGFtcGxlIHNjcmlwdHMpCi0gICAgICAgbWFpbigpIG1heSByZXR1cm4gYSBzdHJpbmcgd2hpY2ggd2lsbCBiZSBkaXNwbGF5ZWQKLSAgICAgICBpbiB0aGUgTGFiZWwgYmVsb3cgdGhlIHNvdXJjZSBjb2RlIHdpbmRvdyAod2hlbiBleGVjdXRpb24KLSAgICAgICBoYXMgZmluaXNoZWQuKSAKKyAgICBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgICAgICBtYWluKCkKKyAgICAgICAgbWFpbmxvb3AoKSAgIyBrZWVwIHdpbmRvdyAKIAotICAgICAgICEhIEZvciBwcm9ncmFtcywgd2hpY2ggYXJlIEVWRU5UIERSSVZFTiwgbWFpbiBtdXN0IHJldHVybgotICAgICAgICEhIHRoZSBzdHJpbmcgIkVWRU5UTE9PUCIuIFRoaXMgaW5mb3JtcyB0aGUgdmlld2VyLCB0aGF0IHRoZQotICAgICAgICEhIHNjcmlwdCBpcyBzdGlsbCBydW5uaW5nIGFuZCBtdXN0IGJlIHN0b3BwZWQgYnkgdGhlIHVzZXIhCisgICAgcHl0aG9uIC1tIHR1cnRsZWRlbW8ubXlkZW1vICAjIHdpbGwgdGhlbiBydW4gaXQKIAotICAgICAgICAKLSAgCisgICAtIElmIHRoZSBkZW1vIGlzIEVWRU5UIERSSVZFTiwgbWFpbiBtdXN0IHJldHVybiB0aGUgc3RyaW5nCisgICAgICJFVkVOVExPT1AiLiBUaGlzIGluZm9ybXMgdGhlIGRlbW8gdmlld2VyIHRoYXQgdGhlIHNjcmlwdCBpcworICAgICBzdGlsbCBydW5uaW5nIGFuZCBtdXN0IGJlIHN0b3BwZWQgYnkgdGhlIHVzZXIhCisKKyAgICAgSWYgYW4gIkVWRU5UTE9PUCIgZGVtbyBydW5zIGJ5IGl0c2VsZiwgYXMgd2l0aCBjbG9jaywgd2hpY2ggdXNlcworICAgICBvbnRpbWVyLCBvciBtaW5pbWFsX2hhbm9pLCB3aGljaCBsb29wcyBieSByZWN1cnNpb24sIHRoZW4gdGhlCisgICAgIGNvZGUgc2hvdWxkIGNhdGNoIHRoZSB0dXJ0bGUuVGVybWluYXRvciBleGNlcHRpb24gdGhhdCB3aWxsIGJlCisgICAgIHJhaXNlZCB3aGVuIHRoZSB1c2VyIHByZXNzZXMgdGhlIFNUT1AgYnV0dG9uLiAgKFBhaW50IGlzIG5vdCBzdWNoCisgICAgIGEgZGVtbzsgaXQgb25seSBhY3RzIGluIHJlc3BvbnNlIHRvIG1vdXNlIGNsaWNrcyBhbmQgbW92ZW1lbnRzLikKZGlmZiAtLWdpdCBhL0RlbW8vdHVydGxlL3RkZW1vX0lfZG9udGxpa2VfdGlsdGRlbW8ucHkgYi9EZW1vL3R1cnRsZS90ZGVtb19JX2RvbnRsaWtlX3RpbHRkZW1vLnB5Cm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKZGlmZiAtLWdpdCBhL0RlbW8vdHVydGxlL3RkZW1vX2J5dGVkZXNpZ24ucHkgYi9EZW1vL3R1cnRsZS90ZGVtb19ieXRlZGVzaWduLnB5Cm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKZGlmZiAtLWdpdCBhL0RlbW8vdHVydGxlL3RkZW1vX2Nsb2NrLnB5IGIvRGVtby90dXJ0bGUvdGRlbW9fY2xvY2sucHkKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBiNjI4MGJiLi4xZDZlYjgwCi0tLSBhL0RlbW8vdHVydGxlL3RkZW1vX2Nsb2NrLnB5CisrKyBiL0RlbW8vdHVydGxlL3RkZW1vX2Nsb2NrLnB5CkBAIC0xMyw4ICsxMyw2IEBACiBmcm9tIHR1cnRsZSBpbXBvcnQgKgogZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUKIAotbW9kZSgibG9nbyIpCi0KIGRlZiBqdW1wKGRpc3RhbnosIHdpbmtlbD0wKToKICAgICBwZW51cCgpCiAgICAgcmlnaHQod2lua2VsKQpAQCAtNDIsNyArNDAsNiBAQAogICAgIGhhbmRfZm9ybSA9IGdldF9wb2x5KCkKICAgICByZWdpc3Rlcl9zaGFwZShuYW1lLCBoYW5kX2Zvcm0pCiAKLQogZGVmIGNsb2NrZmFjZShyYWRpdXMpOgogICAgIHJlc2V0KCkKICAgICBwZW5zaXplKDcpCkBAIC04Myw3ICs4MCw2IEBACiAgICAgd3JpdGVyLnB1KCkKICAgICB3cml0ZXIuYmsoODUpCiAKLQogZGVmIHdvY2hlbnRhZyh0KToKICAgICB3b2NoZW50YWcgPSBbIk1vbmRheSIsICJUdWVzZGF5IiwgIldlZG5lc2RheSIsCiAgICAgICAgICJUaHVyc2RheSIsICJGcmlkYXkiLCAiU2F0dXJkYXkiLCAiU3VuZGF5Il0KQEAgLTEwMiwyMiArOTgsMjUgQEAKICAgICBzZWt1bmRlID0gdC5zZWNvbmQgKyB0Lm1pY3Jvc2Vjb25kKjAuMDAwMDAxCiAgICAgbWludXRlID0gdC5taW51dGUgKyBzZWt1bmRlLzYwLjAKICAgICBzdHVuZGUgPSB0LmhvdXIgKyBtaW51dGUvNjAuMAotICAgIHRyYWNlcihGYWxzZSkKLSAgICB3cml0ZXIuY2xlYXIoKQotICAgIHdyaXRlci5ob21lKCkKLSAgICB3cml0ZXIuZm9yd2FyZCg2NSkKLSAgICB3cml0ZXIud3JpdGUod29jaGVudGFnKHQpLAotICAgICAgICAgICAgICAgICBhbGlnbj0iY2VudGVyIiwgZm9udD0oIkNvdXJpZXIiLCAxNCwgImJvbGQiKSkKLSAgICB3cml0ZXIuYmFjaygxNTApCi0gICAgd3JpdGVyLndyaXRlKGRhdHVtKHQpLAotICAgICAgICAgICAgICAgICBhbGlnbj0iY2VudGVyIiwgZm9udD0oIkNvdXJpZXIiLCAxNCwgImJvbGQiKSkKLSAgICB3cml0ZXIuZm9yd2FyZCg4NSkKLSAgICB0cmFjZXIoVHJ1ZSkKLSAgICBzZWNvbmRfaGFuZC5zZXRoZWFkaW5nKDYqc2VrdW5kZSkKLSAgICBtaW51dGVfaGFuZC5zZXRoZWFkaW5nKDYqbWludXRlKQotICAgIGhvdXJfaGFuZC5zZXRoZWFkaW5nKDMwKnN0dW5kZSkKLSAgICB0cmFjZXIoVHJ1ZSkKLSAgICBvbnRpbWVyKHRpY2ssIDEwMCkKKyAgICB0cnk6CisgICAgICAgIHRyYWNlcihGYWxzZSkgICMgVGVybWluYXRvciBjYW4gb2NjdXIgaGVyZQorICAgICAgICB3cml0ZXIuY2xlYXIoKQorICAgICAgICB3cml0ZXIuaG9tZSgpCisgICAgICAgIHdyaXRlci5mb3J3YXJkKDY1KQorICAgICAgICB3cml0ZXIud3JpdGUod29jaGVudGFnKHQpLAorICAgICAgICAgICAgICAgICAgICAgYWxpZ249ImNlbnRlciIsIGZvbnQ9KCJDb3VyaWVyIiwgMTQsICJib2xkIikpCisgICAgICAgIHdyaXRlci5iYWNrKDE1MCkKKyAgICAgICAgd3JpdGVyLndyaXRlKGRhdHVtKHQpLAorICAgICAgICAgICAgICAgICAgICAgYWxpZ249ImNlbnRlciIsIGZvbnQ9KCJDb3VyaWVyIiwgMTQsICJib2xkIikpCisgICAgICAgIHdyaXRlci5mb3J3YXJkKDg1KQorICAgICAgICB0cmFjZXIoVHJ1ZSkKKyAgICAgICAgc2Vjb25kX2hhbmQuc2V0aGVhZGluZyg2KnNla3VuZGUpICAjIG9yIGhlcmUKKyAgICAgICAgbWludXRlX2hhbmQuc2V0aGVhZGluZyg2Km1pbnV0ZSkKKyAgICAgICAgaG91cl9oYW5kLnNldGhlYWRpbmcoMzAqc3R1bmRlKQorICAgICAgICB0cmFjZXIoVHJ1ZSkKKyAgICAgICAgb250aW1lcih0aWNrLCAxMDApCisgICAgZXhjZXB0IFRlcm1pbmF0b3I6CisgICAgICAgIHBhc3MgICMgdHVydGxlZGVtbyB1c2VyIHByZXNzZWQgU1RPUAogCiBkZWYgbWFpbigpOgogICAgIHRyYWNlcihGYWxzZSkKQEAgLTEyNyw2ICsxMjYsNyBAQAogICAgIHJldHVybiAiRVZFTlRMT09QIgogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1vZGUoImxvZ28iKQogICAgIG1zZyA9IG1haW4oKQogICAgIHByaW50IG1zZwotICAgIG1haW5sb29wKCkKKyAgICBtYWlubG9vcCgpICAjIGtlZXAgd2luZG93IG9wZW4KZGlmZiAtLWdpdCBhL0RlbW8vdHVydGxlL3RkZW1vX2ZyYWN0YWxjdXJ2ZXMucHkgYi9EZW1vL3R1cnRsZS90ZGVtb19mcmFjdGFsY3VydmVzLnB5Cm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKZGlmZiAtLWdpdCBhL0RlbW8vdHVydGxlL3RkZW1vX2xpbmRlbm1heWVyX2luZGlhbi5weSBiL0RlbW8vdHVydGxlL3RkZW1vX2xpbmRlbm1heWVyX2luZGlhbi5weQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmRpZmYgLS1naXQgYS9EZW1vL3R1cnRsZS90ZGVtb19taW5pbWFsX2hhbm9pLnB5IGIvRGVtby90dXJ0bGUvdGRlbW9fbWluaW1hbF9oYW5vaS5weQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDhhMWNhYTguLjg2MDAxYjYKLS0tIGEvRGVtby90dXJ0bGUvdGRlbW9fbWluaW1hbF9oYW5vaS5weQorKysgYi9EZW1vL3R1cnRsZS90ZGVtb19taW5pbWFsX2hhbm9pLnB5CkBAIC01MCw5ICs1MCwxMiBAQAogZGVmIHBsYXkoKToKICAgICBvbmtleShOb25lLCJzcGFjZSIpCiAgICAgY2xlYXIoKQotICAgIGhhbm9pKDYsIHQxLCB0MiwgdDMpCi0gICAgd3JpdGUoInByZXNzIFNUT1AgYnV0dG9uIHRvIGV4aXQiLAotICAgICAgICAgIGFsaWduPSJjZW50ZXIiLCBmb250PSgiQ291cmllciIsIDE2LCAiYm9sZCIpKQorICAgIHRyeToKKyAgICAgICAgaGFub2koNiwgdDEsIHQyLCB0MykKKyAgICAgICAgd3JpdGUoInByZXNzIFNUT1AgYnV0dG9uIHRvIGV4aXQiLAorICAgICAgICAgICAgICBhbGlnbj0iY2VudGVyIiwgZm9udD0oIkNvdXJpZXIiLCAxNiwgImJvbGQiKSkKKyAgICBleGNlcHQgVGVybWluYXRvcjoKKyAgICAgICAgcGFzcyAgIyB0dXJ0bGVkZW1vIHVzZXIgcHJlc3NlZCBTVE9QCiAKIGRlZiBtYWluKCk6CiAgICAgZ2xvYmFsIHQxLCB0MiwgdDMKZGlmZiAtLWdpdCBhL0RlbW8vdHVydGxlL3RkZW1vX25pbS5weSBiL0RlbW8vdHVydGxlL3RkZW1vX25pbS5weQppbmRleCA4ZTY2ZDdlLi5kNzM5NDU3IDEwMDY0NAotLS0gYS9EZW1vL3R1cnRsZS90ZGVtb19uaW0ucHkKKysrIGIvRGVtby90dXJ0bGUvdGRlbW9fbmltLnB5CkBAIC0xLDcgKzEsNyBAQAogIiIiICAgICAgdHVydGxlLWV4YW1wbGUtc3VpdGU6CiAKICAgICAgICAgICAgIHRkZW1vX25pbS5weQotICAgICAgICAgCisKIFBsYXkgbmltIGFnYWluc3QgdGhlIGNvbXB1dGVyLiBUaGUgcGxheWVyCiB3aG8gdGFrZXMgdGhlIGxhc3Qgc3RpY2sgaXMgdGhlIHdpbm5lci4KIApAQCAtNDEsNyArNDEsNyBAQAogICAgICAgICAgICAgcmV0dXJuIG1vdmUKIAogZGVmIHJhbmRvbW1vdmUoc3RhdGUpOgotICAgIG0gPSBtYXgoc3RhdGUpICAgCisgICAgbSA9IG1heChzdGF0ZSkKICAgICB3aGlsZSBUcnVlOgogICAgICAgICB6ID0gcmFuZG9tLnJhbmRpbnQoMCwyKQogICAgICAgICBpZiBzdGF0ZVt6XSA+IChtID4gMSk6CkBAIC02Miw3ICs2Miw3IEBACiAgICAgICAgIHNlbGYud2lubmVyID0gTm9uZQogICAgICAgICBzZWxmLmdhbWUudmlldy5zZXR1cCgpCiAgICAgICAgIHNlbGYuZ2FtZS5zdGF0ZSA9IE5pbS5SVU5OSU5HCi0gICAgICAgIAorCiAgICAgZGVmIG1vdmUoc2VsZiwgcm93LCBjb2wpOgogICAgICAgICBtYXhzcGFsdGUgPSBzZWxmLnN0aWNrc1tyb3ddCiAgICAgICAgIHNlbGYuc3RpY2tzW3Jvd10gPSBjb2wKQEAgLTc2LDcgKzc2LDcgQEAKICAgICAgICAgICAgIHJvdywgY29sID0gY29tcHV0ZXJ6dWcoc2VsZi5zdGlja3MpCiAgICAgICAgICAgICBzZWxmLm1vdmUocm93LCBjb2wpCiAgICAgICAgICAgICBzZWxmLnBsYXllciA9IDAKLSAgICAgICAgCisKICAgICBkZWYgZ2FtZV9vdmVyKHNlbGYpOgogICAgICAgICByZXR1cm4gc2VsZi5zdGlja3MgPT0gWzAsIDAsIDBdCiAKQEAgLTEwMCwxMyArMTAwLDEzIEBACiAgICAgICAgIHNlbGYuZ290byh4LHkpCiAgICAgICAgIHNlbGYuY29sb3IoIndoaXRlIikKICAgICAgICAgc2VsZi5zaG93dHVydGxlKCkKLSAgICAgICAgICAgIAorCiAgICAgZGVmIGNvb3JkcyhzZWxmLCByb3csIGNvbCk6CiAgICAgICAgIHBhY2tldCwgcmVtYWluZGVyID0gZGl2bW9kKGNvbCwgNSkKICAgICAgICAgeCA9ICgzICsgMTEgKiBwYWNrZXQgKyAyICogcmVtYWluZGVyKSAqIFdVTklUCiAgICAgICAgIHkgPSAoMiArIDMgKiByb3cpICogSFVOSVQKICAgICAgICAgcmV0dXJuIHggLSBTQ1JFRU5XSURUSCAvLyAyICsgV1VOSVQgLy8gMiwgU0NSRUVOSEVJR0hUIC8vIDIgLSB5IC0gSFVOSVQgLy8gMgotICAgICAgICAKKwogICAgIGRlZiBtYWtlbW92ZShzZWxmLCB4LCB5KToKICAgICAgICAgaWYgc2VsZi5nYW1lLnN0YXRlICE9IE5pbS5SVU5OSU5HOgogICAgICAgICAgICAgcmV0dXJuCkBAIC0xNDIsNyArMTQyLDcgQEAKICAgICAgICAgc2VsZi53cml0ZXIucGVuY29sb3IoImJsYWNrIikKICAgICAgICAgc2VsZi53cml0ZXIud3JpdGUobXNnMSwgYWxpZ249ImNlbnRlciIsIGZvbnQ9KCJDb3VyaWVyIiwxNCwiYm9sZCIpKQogICAgICAgICBzZWxmLnNjcmVlbi50cmFjZXIoVHJ1ZSkKLSAgICAgICAgCisKIAogICAgIGRlZiBzZXR1cChzZWxmKToKICAgICAgICAgc2VsZi5zY3JlZW4udHJhY2VyKEZhbHNlKQpAQCAtMTgxLDYgKzE4MSw3IEBACiAgICAgICAgIGlmIHNlbGYuZ2FtZS5zdGF0ZSA9PSBOaW0uT1ZFUjoKICAgICAgICAgICAgIHNlbGYuc2NyZWVuLmNsZWFyKCkKIAorCiBjbGFzcyBOaW1Db250cm9sbGVyKG9iamVjdCk6CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgZ2FtZSk6CkBAIC0yMDAsMjggKzIwMSwyNiBAQAogICAgICAgICBzZWxmLkJVU1kgPSBUcnVlCiAgICAgICAgIHNlbGYuZ2FtZS5tb2RlbC5ub3RpZnlfbW92ZShyb3csIGNvbCkKICAgICAgICAgc2VsZi5CVVNZID0gRmFsc2UKLSAgICAgICAgICAgICAgICAKKwogY2xhc3MgTmltKG9iamVjdCk6CiAgICAgQ1JFQVRFRCA9IDAKICAgICBSVU5OSU5HID0gMQogICAgIE9WRVIgPSAyCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNjcmVlbik6Ci0gICAgICAgIHNlbGYuc3RhdGUgPSBOaW0uQ1JFQVRFRCAKKyAgICAgICAgc2VsZi5zdGF0ZSA9IE5pbS5DUkVBVEVECiAgICAgICAgIHNlbGYuc2NyZWVuID0gc2NyZWVuCiAgICAgICAgIHNlbGYubW9kZWwgPSBOaW1Nb2RlbChzZWxmKQogICAgICAgICBzZWxmLnZpZXcgPSBOaW1WaWV3KHNlbGYpCiAgICAgICAgIHNlbGYuY29udHJvbGxlciA9IE5pbUNvbnRyb2xsZXIoc2VsZikKLSAgICAgICAgCiAKLW1haW5zY3JlZW4gPSB0dXJ0bGUuU2NyZWVuKCkKLW1haW5zY3JlZW4ubW9kZSgic3RhbmRhcmQiKQotbWFpbnNjcmVlbi5zZXR1cChTQ1JFRU5XSURUSCwgU0NSRUVOSEVJR0hUKQogCiBkZWYgbWFpbigpOgorICAgIG1haW5zY3JlZW4gPSB0dXJ0bGUuU2NyZWVuKCkKKyAgICBtYWluc2NyZWVuLm1vZGUoInN0YW5kYXJkIikKKyAgICBtYWluc2NyZWVuLnNldHVwKFNDUkVFTldJRFRILCBTQ1JFRU5IRUlHSFQpCiAgICAgbmltID0gTmltKG1haW5zY3JlZW4pCiAgICAgcmV0dXJuICJFVkVOVExPT1AhIgogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIG1haW4oKQogICAgIHR1cnRsZS5tYWlubG9vcCgpCi0gICAgCmRpZmYgLS1naXQgYS9EZW1vL3R1cnRsZS90ZGVtb19wYWludC5weSBiL0RlbW8vdHVydGxlL3RkZW1vX3BhaW50LnB5Cm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggZTFkNjMwMy4uMTA1YTA2YgotLS0gYS9EZW1vL3R1cnRsZS90ZGVtb19wYWludC5weQorKysgYi9EZW1vL3R1cnRsZS90ZGVtb19wYWludC5weQpAQCAtMywxMSArMywxNSBAQAogCiAgICAgICAgICAgICB0ZGVtb19wYWludC5weQogCi1BIHNpbXBsZSAgZXZlbnRkcml2ZW4gcGFpbnQgcHJvZ3JhbQorQSBzaW1wbGUgIGV2ZW50LWRyaXZlbiBwYWludCBwcm9ncmFtCiAKLS0gdXNlIGxlZnQgbW91c2UgYnV0dG9uIHRvIG1vdmUgdHVydGxlCi0tIG1pZGRsZSBtb3VzZSBidXR0b24gdG8gY2hhbmdlIGNvbG9yCi0tIHJpZ2h0IG1vdXNlIGJ1dHRvbiBkbyB0dXJuIGZpbGxpbmcgb24vb2ZmCistIGxlZnQgbW91c2UgYnV0dG9uIG1vdmVzIHR1cnRsZQorLSBtaWRkbGUgbW91c2UgYnV0dG9uIGNoYW5nZXMgY29sb3IKKy0gcmlnaHQgbW91c2UgYnV0dG9uIHRvb2dsZXMgYmV0d2VlbSBwZW4gdXAKKyhubyBsaW5lIGRyYXduIHdoZW4gdGhlIHR1cnRsZSBtb3ZlcykgYW5kCitwZW4gZG93biAobGluZSBpcyBkcmF3bikuIElmIHBlbiB1cCBmb2xsb3dzCithdCBsZWFzdCB0d28gcGVuLWRvd24gbW92ZXMsIHRoZSBwb2x5Z29uIHRoYXQKK2luY2x1ZGVzIHRoZSBzdGFydGluZyBwb2ludCBpcyBmaWxsZWQuCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIFBsYXkgYXJvdW5kIGJ5IGNsaWNraW5nIGludG8gdGhlIGNhbnZhcwogIHVzaW5nIGFsbCB0aHJlZSBtb3VzZSBidXR0b25zLgpkaWZmIC0tZ2l0IGEvRGVtby90dXJ0bGUvdGRlbW9fcGVhY2UucHkgYi9EZW1vL3R1cnRsZS90ZGVtb19wZWFjZS5weQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDEzMDQ0YzkuLjhiZmE5MjAKLS0tIGEvRGVtby90dXJ0bGUvdGRlbW9fcGVhY2UucHkKKysrIGIvRGVtby90dXJ0bGUvdGRlbW9fcGVhY2UucHkKQEAgLTMsMTQgKzMsMTAgQEAKIAogICAgICAgICAgICAgICB0ZGVtb19wZWFjZS5weQogCi1BIHZlcnkgc2ltcGxlIGRyYXdpbmcgc3VpdGFibGUgYXMgYSBiZWdpbm5lcidzCi1wcm9ncmFtbWluZyBleGFtcGxlLgotCi1Vc2VzIG9ubHkgY29tbWFuZHMsIHdoaWNoIGFyZSBhbHNvIGF2YWlsYWJsZSBpbgotb2xkIHR1cnRsZS5weS4KLQotSW50ZW50aW9uYWxseSBubyB2YXJpYWJsZXMgYXJlIHVzZWQgZXhjZXB0IGZvciB0aGUKLWNvbG9ybG9vcDoKK0Egc2ltcGxlIGRyYXdpbmcgc3VpdGFibGUgYXMgYSBiZWdpbm5lcidzCitwcm9ncmFtbWluZyBleGFtcGxlLiBBc2lkZSBmcm9tIHRoZQorcGVhY2Vjb2xvcnMgYXNzaWdubWVudCBhbmQgdGhlIGZvciBsb29wLAoraXQgb25seSB1c2VzIHR1cnRsZSBjb21tYW5kcy4KICIiIgogCiBmcm9tIHR1cnRsZSBpbXBvcnQgKgpAQCAtMjEsNyArMTcsNyBAQAogICAgICAgICAgICAgICAgICAgICJyb3lhbGJsdWUxIiwgImRvZGdlcmJsdWU0IikKIAogICAgIHJlc2V0KCkKLSAgICBzID0gU2NyZWVuKCkKKyAgICBTY3JlZW4oKQogICAgIHVwKCkKICAgICBnb3RvKC0zMjAsLTE5NSkKICAgICB3aWR0aCg3MCkKQEAgLTU4LDcgKzU0LDcgQEAKICAgICB1cCgpCiAKICAgICBnb3RvKDAsMzAwKSAjIHZhbmlzaCBpZiBoaWRldHVydGxlKCkgaXMgbm90IGF2YWlsYWJsZSA7LSkKLSAgICByZXR1cm4gIkRvbmUhISIKKyAgICByZXR1cm4gIkRvbmUhIgogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvRGVtby90dXJ0bGUvdGRlbW9fcGVucm9zZS5weSBiL0RlbW8vdHVydGxlL3RkZW1vX3BlbnJvc2UucHkKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQpkaWZmIC0tZ2l0IGEvRGVtby90dXJ0bGUvdGRlbW9fcGxhbmV0X2FuZF9tb29uLnB5IGIvRGVtby90dXJ0bGUvdGRlbW9fcGxhbmV0X2FuZF9tb29uLnB5Cm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMjIzZDg3Yi4uYTAyODBkNwotLS0gYS9EZW1vL3R1cnRsZS90ZGVtb19wbGFuZXRfYW5kX21vb24ucHkKKysrIGIvRGVtby90dXJ0bGUvdGRlbW9fcGxhbmV0X2FuZF9tb29uLnB5CkBAIC0xMiw5ICsxMiw5IEBACiBQbGFuZXQgaGFzIGEgY2lyY3VsYXIgb3JiaXQsIG1vb24gYSBzdGFibGUKIG9yYml0IGFyb3VuZCB0aGUgcGxhbmV0LgogCi1Zb3UgY2FuIGhvbGQgdGhlIG1vdmVtZW50IHRlbXBvcmFyaWx5IGJ5IHByZXNzaW5nCi10aGUgbGVmdCBtb3VzZSBidXR0b24gd2l0aCBtb3VzZSBvdmVyIHRoZQotc2Nyb2xsYmFyIG9mIHRoZSBjYW52YXMuCitZb3UgY2FuIGhvbGQgdGhlIG1vdmVtZW50IHRlbXBvcmFyaWx5IGJ5CitwcmVzc2luZyB0aGUgbGVmdCBtb3VzZSBidXR0b24gd2l0aCB0aGUKK21vdXNlIG92ZXIgdGhlIHNjcm9sbGJhciBvZiB0aGUgY2FudmFzLgogCiAiIiIKIGZyb20gdHVydGxlIGltcG9ydCBTaGFwZSwgVHVydGxlLCBtYWlubG9vcCwgVmVjMkQgYXMgVmVjCkBAIC0xMDgsNiArMTA4LDUgQEAKICAgICByZXR1cm4gIkRvbmUhIgogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIG1zZyA9IG1haW4oKQotICAgIHByaW50IG1zZworICAgIG1haW4oKQogICAgIG1haW5sb29wKCkKZGlmZiAtLWdpdCBhL0RlbW8vdHVydGxlL3RkZW1vX3RyZWUucHkgYi9EZW1vL3R1cnRsZS90ZGVtb190cmVlLnB5Cm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggNmZjODczNS4uNmM2MTIxYQotLS0gYS9EZW1vL3R1cnRsZS90ZGVtb190cmVlLnB5CisrKyBiL0RlbW8vdHVydGxlL3RkZW1vX3RyZWUucHkKQEAgLTExLDkgKzExLDkgQEAKICgxKSBhIHRyZWUtZ2VuZXJhdG9yLCB3aGVyZSB0aGUgZHJhd2luZyBpcwogcXVhc2kgdGhlIHNpZGUtZWZmZWN0LCB3aGVyZWFzIHRoZSBnZW5lcmF0b3IKIGFsd2F5cyB5aWVsZHMgTm9uZS4KLSgyKSBUdXJ0bGUtY2xvbmluZzogQXQgZWFjaCBicmFuY2hpbmcgcG9pbnQgdGhlCi1jdXJyZW50IHBlbiBpcyBjbG9uZWQuIFNvIGluIHRoZSBlbmQgdGhlcmUKLWFyZSAxMDI0IHR1cnRsZXMuCisoMikgVHVydGxlLWNsb25pbmc6IEF0IGVhY2ggYnJhbmNoaW5nIHBvaW50Cit0aGUgY3VycmVudCBwZW4gaXMgY2xvbmVkLiBTbyBpbiB0aGUgZW5kCit0aGVyZSBhcmUgMTAyNCB0dXJ0bGVzLgogIiIiCiBmcm9tIHR1cnRsZSBpbXBvcnQgVHVydGxlLCBtYWlubG9vcAogZnJvbSB0aW1lIGltcG9ydCBjbG9jawpkaWZmIC0tZ2l0IGEvRGVtby90dXJ0bGUvdGRlbW9fdHdvX2NhbnZhc2VzLnB5IGIvRGVtby90dXJ0bGUvdGRlbW9fdHdvX2NhbnZhc2VzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Nzk4NzYKLS0tIC9kZXYvbnVsbAorKysgYi9EZW1vL3R1cnRsZS90ZGVtb190d29fY2FudmFzZXMucHkKQEAgLTAsMCArMSw1NCBAQAorIiIidHVydGxlZGVtby50d29fY2FudmFzZXMKKworVXNlIFR1cnRsZVNjcmVlbiBhbmQgUmF3VHVydGxlIHRvIGRyYXcgb24gdHdvCitkaXN0aW5jdCBjYW52YXNlcyBpbiBhIHNlcGFyYXRlIHdpbmRvd3MuIFRoZQorbmV3IHdpbmRvdyBtdXN0IGJlIHNlcGFyYXRlbHkgY2xvc2VkIGluCithZGRpdGlvbiB0byBwcmVzc2luZyB0aGUgU1RPUCBidXR0b24uCisiIiIKKworZnJvbSB0dXJ0bGUgaW1wb3J0IFR1cnRsZVNjcmVlbiwgUmF3VHVydGxlLCBUSworCitkZWYgbWFpbigpOgorICAgIHJvb3QgPSBUSy5UaygpCisgICAgY3YxID0gVEsuQ2FudmFzKHJvb3QsIHdpZHRoPTMwMCwgaGVpZ2h0PTIwMCwgYmc9IiNkZGZmZmYiKQorICAgIGN2MiA9IFRLLkNhbnZhcyhyb290LCB3aWR0aD0zMDAsIGhlaWdodD0yMDAsIGJnPSIjZmZlZWVlIikKKyAgICBjdjEucGFjaygpCisgICAgY3YyLnBhY2soKQorCisgICAgczEgPSBUdXJ0bGVTY3JlZW4oY3YxKQorICAgIHMxLmJnY29sb3IoMC44NSwgMC44NSwgMSkKKyAgICBzMiA9IFR1cnRsZVNjcmVlbihjdjIpCisgICAgczIuYmdjb2xvcigxLCAwLjg1LCAwLjg1KQorCisgICAgcCA9IFJhd1R1cnRsZShzMSkKKyAgICBxID0gUmF3VHVydGxlKHMyKQorCisgICAgcC5jb2xvcigicmVkIiwgKDEsIDAuODUsIDAuODUpKQorICAgIHAud2lkdGgoMykKKyAgICBxLmNvbG9yKCJibHVlIiwgKDAuODUsIDAuODUsIDEpKQorICAgIHEud2lkdGgoMykKKworICAgIGZvciB0IGluIHAscToKKyAgICAgICAgdC5zaGFwZSgidHVydGxlIikKKyAgICAgICAgdC5sdCgzNikKKworICAgIHEubHQoMTgwKQorCisgICAgZm9yIHQgaW4gcCwgcToKKyAgICAgICAgdC5iZWdpbl9maWxsKCkKKyAgICBmb3IgaSBpbiByYW5nZSg1KToKKyAgICAgICAgZm9yIHQgaW4gcCwgcToKKyAgICAgICAgICAgIHQuZmQoNTApCisgICAgICAgICAgICB0Lmx0KDcyKQorICAgIGZvciB0IGluIHAscToKKyAgICAgICAgdC5lbmRfZmlsbCgpCisgICAgICAgIHQubHQoNTQpCisgICAgICAgIHQucHUoKQorICAgICAgICB0LmJrKDUwKQorCisgICAgcmV0dXJuICJFVkVOVExPT1AiCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBtYWluKCkKKyAgICBUSy5tYWlubG9vcCgpICAjIGtlZXAgd2luZG93IG9wZW4gdW50aWwgdXNlciBjbG9zZXMgaXQKZGlmZiAtLWdpdCBhL0RlbW8vdHVydGxlL3RkZW1vX3lpbnlhbmcucHkgYi9EZW1vL3R1cnRsZS90ZGVtb195aW55YW5nLnB5Cm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKZGlmZiAtLWdpdCBhL0RlbW8vdHVydGxlL3R1cnRsZURlbW8ucHkgYi9EZW1vL3R1cnRsZS90dXJ0bGVEZW1vLnB5Cm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMzBiNWU1Yi4uNWVjOTgwZQotLS0gYS9EZW1vL3R1cnRsZS90dXJ0bGVEZW1vLnB5CisrKyBiL0RlbW8vdHVydGxlL3R1cnRsZURlbW8ucHkKQEAgLTUsMTEgKzUsMTcgQEAKIGZyb20gVGtpbnRlciBpbXBvcnQgKgogZnJvbSBpZGxlbGliLlBlcmNvbGF0b3IgaW1wb3J0IFBlcmNvbGF0b3IKIGZyb20gaWRsZWxpYi5Db2xvckRlbGVnYXRvciBpbXBvcnQgQ29sb3JEZWxlZ2F0b3IKLWZyb20gaWRsZWxpYi50ZXh0VmlldyBpbXBvcnQgVGV4dFZpZXdlcgorZnJvbSBpZGxlbGliLnRleHRWaWV3IGltcG9ydCB2aWV3X2ZpbGUKIAogaW1wb3J0IHR1cnRsZQogaW1wb3J0IHRpbWUKIAorZGVtb19kaXIgPSBvcy5nZXRjd2QoKQoraWYgInR1cnRsZURlbW8ucHkiIG5vdCBpbiBvcy5saXN0ZGlyKGRlbW9fZGlyKToKKyAgICBwcmludCAiRGlyZWN0b3J5IG9mIHR1cnRsZURlbW8gbXVzdCBiZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5ISIKKyAgICBwcmludCAiQnV0IGluIHlvdXIgY2FzZSB0aGlzIGlzIiwgZGVtb19kaXIKKyAgICBzeXMuZXhpdCgpCisKIFNUQVJUVVAgPSAxCiBSRUFEWSA9IDIKIFJVTk5JTkcgPSAzCkBAIC0yMSwxMiArMjcsNyBAQAogdHh0Zm9udCA9ICgnTHVjaWRhIENvbnNvbGUnLCA4LCAnbm9ybWFsJykKIAogZGVmIGdldEV4YW1wbGVFbnRyaWVzKCk6Ci0gICAgY3dkID0gb3MuZ2V0Y3dkKCkKLSAgICBpZiAidHVydGxlRGVtby5weSIgbm90IGluIG9zLmxpc3RkaXIoY3dkKToKLSAgICAgICAgcHJpbnQgIkRpcmVjdG9yeSBvZiB0dXJ0bGVEZW1vIG11c3QgYmUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSEiCi0gICAgICAgIHByaW50ICJCdXQgaW4geW91ciBjYXNlIHRoaXMgaXMiLCBjd2QKLSAgICAgICAgc3lzLmV4aXQoKQotICAgIGVudHJpZXMxID0gW2VudHJ5IGZvciBlbnRyeSBpbiBvcy5saXN0ZGlyKGN3ZCkgaWYKKyAgICBlbnRyaWVzMSA9IFtlbnRyeSBmb3IgZW50cnkgaW4gb3MubGlzdGRpcihkZW1vX2RpcikgaWYKICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnN0YXJ0c3dpdGgoInRkZW1vXyIpIGFuZAogICAgICAgICAgICAgICAgICAgICAgbm90IGVudHJ5LmVuZHN3aXRoKCIucHljIildCiAgICAgZW50cmllczIgPSBbXQpAQCAtMzQsNyArMzUsNyBAQAogICAgICAgICBpZiBlbnRyeS5lbmRzd2l0aCgiLnB5Iik6CiAgICAgICAgICAgICBlbnRyaWVzMi5hcHBlbmQoZW50cnkpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGN3ZCxlbnRyeSkKKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oZGVtb19kaXIsIGVudHJ5KQogICAgICAgICAgICAgc3lzLnBhdGguYXBwZW5kKHBhdGgpCiAgICAgICAgICAgICBzdWJkaXIgPSBbZW50cnldCiAgICAgICAgICAgICBzY3JpcHRzID0gW3NjcmlwdCBmb3Igc2NyaXB0IGluIG9zLmxpc3RkaXIocGF0aCkgaWYKQEAgLTQzLDgzICs0NCw1NCBAQAogICAgICAgICAgICAgZW50cmllczIuYXBwZW5kKHN1YmRpcitzY3JpcHRzKQogICAgIHJldHVybiBlbnRyaWVzMgogCi1kZWYgc2hvd0RlbW9IZWxwKCk6Ci0gICAgVGV4dFZpZXdlcihkZW1vLnJvb3QsICJIZWxwIG9uIHR1cnRsZURlbW8iLCAiZGVtb2hlbHAudHh0IikKLQotZGVmIHNob3dBYm91dERlbW8oKToKLSAgICBUZXh0Vmlld2VyKGRlbW8ucm9vdCwgIkFib3V0IHR1cnRsZURlbW8iLCAiYWJvdXRfdHVydGxlZGVtby50eHQiKQotCi1kZWYgc2hvd0Fib3V0VHVydGxlKCk6Ci0gICAgVGV4dFZpZXdlcihkZW1vLnJvb3QsICJBYm91dCB0aGUgbmV3IHR1cnRsZSBtb2R1bGUiLCAiYWJvdXRfdHVydGxlLnR4dCIpCitoZWxwX2VudHJpZXMgPSAoICAjIChoZWxwX2xhYmVsLCAgaGVscF9maWxlKQorICAgICgnVHVydGxlZGVtbyBoZWxwJywgImRlbW9oZWxwLnR4dCIpLAorICAgICgnQWJvdXQgdHVydGxlZGVtbycsICJhYm91dF90dXJ0bGVkZW1vLnR4dCIpLAorICAgICgnQWJvdXQgdHVydGxlIG1vZHVsZScsICJhYm91dF90dXJ0bGUudHh0IiksCisgICAgKQogCiBjbGFzcyBEZW1vV2luZG93KG9iamVjdCk6CiAKLSAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWU9Tm9uZSk6ICAgIywgcm9vdD1Ob25lKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWU9Tm9uZSk6CiAgICAgICAgIHNlbGYucm9vdCA9IHJvb3QgPSB0dXJ0bGUuX3Jvb3QgPSBUaygpCisgICAgICAgIHJvb3QudGl0bGUoJ1B5dGhvbiB0dXJ0bGUtZ3JhcGhpY3MgZXhhbXBsZXMnKQogICAgICAgICByb290LndtX3Byb3RvY29sKCJXTV9ERUxFVEVfV0lORE9XIiwgc2VsZi5fZGVzdHJveSkKIAotICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIwotICAgICAgICBzZWxmLm1CYXIgPSBGcmFtZShyb290LCByZWxpZWY9UkFJU0VELCBib3JkZXJ3aWR0aD0yKQotICAgICAgICBzZWxmLm1CYXIucGFjayhmaWxsPVgpCisgICAgICAgIHJvb3QuZ3JpZF9yb3djb25maWd1cmUoMSwgd2VpZ2h0PTEpCisgICAgICAgIHJvb3QuZ3JpZF9jb2x1bW5jb25maWd1cmUoMCwgd2VpZ2h0PTEpCisgICAgICAgIHJvb3QuZ3JpZF9jb2x1bW5jb25maWd1cmUoMSwgbWluc2l6ZT05MCwgd2VpZ2h0PTEpCisgICAgICAgIHJvb3QuZ3JpZF9jb2x1bW5jb25maWd1cmUoMiwgbWluc2l6ZT05MCwgd2VpZ2h0PTEpCisgICAgICAgIHJvb3QuZ3JpZF9jb2x1bW5jb25maWd1cmUoMywgbWluc2l6ZT05MCwgd2VpZ2h0PTEpCiAKKyAgICAgICAgc2VsZi5tQmFyID0gRnJhbWUocm9vdCwgcmVsaWVmPVJBSVNFRCwgYm9yZGVyd2lkdGg9MikKICAgICAgICAgc2VsZi5FeGFtcGxlc0J0biA9IHNlbGYubWFrZUxvYWREZW1vTWVudSgpCiAgICAgICAgIHNlbGYuT3B0aW9uc0J0biA9IHNlbGYubWFrZUhlbHBNZW51KCkKLSAgICAgICAgc2VsZi5tQmFyLnRrX21lbnVCYXIoc2VsZi5FeGFtcGxlc0J0biwgc2VsZi5PcHRpb25zQnRuKSAjLCBRdWl0QnRuKQorICAgICAgICBzZWxmLm1CYXIuZ3JpZChyb3c9MCwgY29sdW1uc3Bhbj00LCBzdGlja3k9J25ld3MnKQogCi0gICAgICAgIHJvb3QudGl0bGUoJ1B5dGhvbiB0dXJ0bGUtZ3JhcGhpY3MgZXhhbXBsZXMnKQotICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIwotICAgICAgICBzZWxmLmxlZnRfZnJhbWUgPSBsZWZ0X2ZyYW1lID0gRnJhbWUocm9vdCkKLSAgICAgICAgc2VsZi50ZXh0X2ZyYW1lID0gdGV4dF9mcmFtZSA9IEZyYW1lKGxlZnRfZnJhbWUpCi0gICAgICAgIHNlbGYudmJhciA9IHZiYXIgPVNjcm9sbGJhcih0ZXh0X2ZyYW1lLCBuYW1lPSd2YmFyJykKLSAgICAgICAgc2VsZi50ZXh0ID0gdGV4dCA9IFRleHQodGV4dF9mcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ndGV4dCcsIHBhZHg9NSwgd3JhcD0nbm9uZScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTQ1KQotICAgICAgICB2YmFyWydjb21tYW5kJ10gPSB0ZXh0Lnl2aWV3Ci0gICAgICAgIHZiYXIucGFjayhzaWRlPUxFRlQsIGZpbGw9WSkKLSAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICAgICAgIHNlbGYuaGJhciA9IGhiYXIgPVNjcm9sbGJhcih0ZXh0X2ZyYW1lLCBuYW1lPSdoYmFyJywgb3JpZW50PUhPUklaT05UQUwpCi0gICAgICAgIGhiYXJbJ2NvbW1hbmQnXSA9IHRleHQueHZpZXcKLSAgICAgICAgaGJhci5wYWNrKHNpZGU9Qk9UVE9NLCBmaWxsPVgpCi0gICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgICAgICB0ZXh0Wyd5c2Nyb2xsY29tbWFuZCddID0gdmJhci5zZXQKLSAgICAgICAgdGV4dC5jb25maWcoZm9udD10eHRmb250KQotICAgICAgICB0ZXh0LmNvbmZpZyh4c2Nyb2xsY29tbWFuZD1oYmFyLnNldCkKLSAgICAgICAgdGV4dC5wYWNrKHNpZGU9TEVGVCwgZmlsbD1ZLCBleHBhbmQ9MSkKLSAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICAgICAgIHNlbGYub3V0cHV0X2xibCA9IExhYmVsKGxlZnRfZnJhbWUsIGhlaWdodD0gMSx0ZXh0PSIgLS0tICIsIGJnID0gIiNkZGYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250ID0gKCJBcmlhbCIsIDE2LCAnbm9ybWFsJykpCi0gICAgICAgIHNlbGYub3V0cHV0X2xibC5wYWNrKHNpZGU9Qk9UVE9NLCBleHBhbmQ9MCwgZmlsbD1YKQotICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgICAgICAgdGV4dF9mcmFtZS5wYWNrKHNpZGU9TEVGVCwgZmlsbD1CT1RILCBleHBhbmQ9MCkKLSAgICAgICAgbGVmdF9mcmFtZS5wYWNrKHNpZGU9TEVGVCwgZmlsbD1CT1RILCBleHBhbmQ9MCkKLSAgICAgICAgc2VsZi5ncmFwaF9mcmFtZSA9IGdfZnJhbWUgPSBGcmFtZShyb290KQorICAgICAgICBwYW5lID0gUGFuZWRXaW5kb3cob3JpZW50PUhPUklaT05UQUwsIHNhc2h3aWR0aD01LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FzaHJlbGllZj1TT0xJRCwgYmc9JyNkZGQnKQorICAgICAgICBwYW5lLmFkZChzZWxmLm1ha2VUZXh0RnJhbWUocGFuZSkpCisgICAgICAgIHBhbmUuYWRkKHNlbGYubWFrZUdyYXBoRnJhbWUocGFuZSkpCisgICAgICAgIHBhbmUuZ3JpZChyb3c9MSwgY29sdW1uc3Bhbj00LCBzdGlja3k9J25ld3MnKQogCi0gICAgICAgIHR1cnRsZS5fU2NyZWVuLl9yb290ID0gZ19mcmFtZQotICAgICAgICB0dXJ0bGUuX1NjcmVlbi5fY2FudmFzID0gdHVydGxlLlNjcm9sbGVkQ2FudmFzKGdfZnJhbWUsIDgwMCwgNjAwLCAxMDAwLCA4MDApCi0gICAgICAgICN4dHVydGxlLlNjcmVlbi5fY2FudmFzLnBhY2soZXhwYW5kPTEsIGZpbGw9ImJvdGgiKQotICAgICAgICBzZWxmLnNjcmVlbiA9IF9zXyA9IHR1cnRsZS5TY3JlZW4oKQotICAgICAgICB0dXJ0bGUuVHVydGxlU2NyZWVuLl9faW5pdF9fKF9zXywgX3NfLl9jYW52YXMpCi0gICAgICAgIHNlbGYuc2NhbnZhcyA9IF9zXy5fY2FudmFzCi0gICAgICAgICN4dHVydGxlLlJhd1R1cnRsZS5jYW52YXNlcyA9IFtzZWxmLnNjYW52YXNdCi0gICAgICAgIHR1cnRsZS5SYXdUdXJ0bGUuc2NyZWVucyA9IFtfc19dCisgICAgICAgIHNlbGYub3V0cHV0X2xibCA9IExhYmVsKHJvb3QsIGhlaWdodD0gMSwgdGV4dD0iIC0tLSAiLCBiZz0iI2RkZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQ9KCJBcmlhbCIsIDE2LCAnbm9ybWFsJyksIGJvcmRlcndpZHRoPTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGllZj1SSURHRSkKKyAgICAgICAgc2VsZi5zdGFydF9idG4gPSBCdXR0b24ocm9vdCwgdGV4dD0iIFNUQVJUICIsIGZvbnQ9YnRuZm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmc9IndoaXRlIiwgZGlzYWJsZWRmb3JlZ3JvdW5kID0gIiNmZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYuc3RhcnREZW1vKQorICAgICAgICBzZWxmLnN0b3BfYnRuID0gQnV0dG9uKHJvb3QsIHRleHQ9IiBTVE9QICIsIGZvbnQ9YnRuZm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZz0id2hpdGUiLCBkaXNhYmxlZGZvcmVncm91bmQgPSAiI2ZlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLnN0b3BJdCkKKyAgICAgICAgc2VsZi5jbGVhcl9idG4gPSBCdXR0b24ocm9vdCwgdGV4dD0iIENMRUFSICIsIGZvbnQ9YnRuZm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmc9IndoaXRlIiwgZGlzYWJsZWRmb3JlZ3JvdW5kPSIjZmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9IHNlbGYuY2xlYXJDYW52YXMpCisgICAgICAgIHNlbGYub3V0cHV0X2xibC5ncmlkKHJvdz0yLCBjb2x1bW49MCwgc3RpY2t5PSduZXdzJywgcGFkeD0oMCw1KSkKKyAgICAgICAgc2VsZi5zdGFydF9idG4uZ3JpZChyb3c9MiwgY29sdW1uPTEsIHN0aWNreT0nZXcnKQorICAgICAgICBzZWxmLnN0b3BfYnRuLmdyaWQocm93PTIsIGNvbHVtbj0yLCBzdGlja3k9J2V3JykKKyAgICAgICAgc2VsZi5jbGVhcl9idG4uZ3JpZChyb3c9MiwgY29sdW1uPTMsIHN0aWNreT0nZXcnKQogCi0gICAgICAgIHNlbGYuc2NhbnZhcy5wYWNrKHNpZGU9VE9QLCBmaWxsPUJPVEgsIGV4cGFuZD0xKQotCi0gICAgICAgIHNlbGYuYnRuX2ZyYW1lID0gYnRuX2ZyYW1lID0gRnJhbWUoZ19mcmFtZSwgaGVpZ2h0PTEwMCkKLSAgICAgICAgc2VsZi5zdGFydF9idG4gPSBCdXR0b24oYnRuX2ZyYW1lLCB0ZXh0PSIgU1RBUlQgIiwgZm9udD1idG5mb250LCBmZyA9ICJ3aGl0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkZm9yZWdyb3VuZCA9ICIjZmVkIiwgY29tbWFuZD1zZWxmLnN0YXJ0RGVtbykKLSAgICAgICAgc2VsZi5zdGFydF9idG4ucGFjayhzaWRlPUxFRlQsIGZpbGw9WCwgZXhwYW5kPTEpCi0gICAgICAgIHNlbGYuc3RvcF9idG4gPSBCdXR0b24oYnRuX2ZyYW1lLCB0ZXh0PSIgU1RPUCAiLCAgZm9udD1idG5mb250LCBmZyA9ICJ3aGl0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkZm9yZWdyb3VuZCA9ICIjZmVkIiwgY29tbWFuZCA9IHNlbGYuc3RvcEl0KQotICAgICAgICBzZWxmLnN0b3BfYnRuLnBhY2soc2lkZT1MRUZULCBmaWxsPVgsIGV4cGFuZD0xKQotICAgICAgICBzZWxmLmNsZWFyX2J0biA9IEJ1dHRvbihidG5fZnJhbWUsIHRleHQ9IiBDTEVBUiAiLCAgZm9udD1idG5mb250LCBmZyA9ICJ3aGl0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkZm9yZWdyb3VuZCA9ICIjZmVkIiwgY29tbWFuZCA9IHNlbGYuY2xlYXJDYW52YXMpCi0gICAgICAgIHNlbGYuY2xlYXJfYnRuLnBhY2soc2lkZT1MRUZULCBmaWxsPVgsIGV4cGFuZD0xKQotCi0gICAgICAgIHNlbGYuYnRuX2ZyYW1lLnBhY2soc2lkZT1UT1AsIGZpbGw9Qk9USCwgZXhwYW5kPTApCi0gICAgICAgIHNlbGYuZ3JhcGhfZnJhbWUucGFjayhzaWRlPVRPUCwgZmlsbD1CT1RILCBleHBhbmQ9MSkKLQotICAgICAgICBQZXJjb2xhdG9yKHRleHQpLmluc2VydGZpbHRlcihDb2xvckRlbGVnYXRvcigpKQorICAgICAgICBQZXJjb2xhdG9yKHNlbGYudGV4dCkuaW5zZXJ0ZmlsdGVyKENvbG9yRGVsZWdhdG9yKCkpCiAgICAgICAgIHNlbGYuZGlydHkgPSBGYWxzZQogICAgICAgICBzZWxmLmV4aXRmbGFnID0gRmFsc2UKICAgICAgICAgaWYgZmlsZW5hbWU6CkBAIC0xMjgsMzcgKzEwMCw2MSBAQAogICAgICAgICAgICAgICAgICAgICAgICAiQ2hvb3NlIGV4YW1wbGUgZnJvbSBtZW51IiwgImJsYWNrIikKICAgICAgICAgc2VsZi5zdGF0ZSA9IFNUQVJUVVAKIAotICAgIGRlZiBfZGVzdHJveShzZWxmKToKLSAgICAgICAgc2VsZi5yb290LmRlc3Ryb3koKQotICAgICAgICBzeXMuZXhpdCgpCisKKyAgICBkZWYgb25SZXNpemUoc2VsZiwgZXZlbnQpOgorICAgICAgICBjd2lkdGggPSBzZWxmLl9jYW52YXMud2luZm9fd2lkdGgoKQorICAgICAgICBjaGVpZ2h0ID0gc2VsZi5fY2FudmFzLndpbmZvX2hlaWdodCgpCisgICAgICAgIHNlbGYuX2NhbnZhcy54dmlld19tb3ZldG8oMC41KihzZWxmLmNhbnZ3aWR0aC1jd2lkdGgpL3NlbGYuY2FudndpZHRoKQorICAgICAgICBzZWxmLl9jYW52YXMueXZpZXdfbW92ZXRvKDAuNSooc2VsZi5jYW52aGVpZ2h0LWNoZWlnaHQpL3NlbGYuY2FudmhlaWdodCkKKworICAgIGRlZiBtYWtlVGV4dEZyYW1lKHNlbGYsIHJvb3QpOgorICAgICAgICBzZWxmLnRleHRfZnJhbWUgPSB0ZXh0X2ZyYW1lID0gRnJhbWUocm9vdCkKKyAgICAgICAgc2VsZi50ZXh0ID0gdGV4dCA9IFRleHQodGV4dF9mcmFtZSwgbmFtZT0ndGV4dCcsIHBhZHg9NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcD0nbm9uZScsIHdpZHRoPTQ1KQorCisgICAgICAgIHNlbGYudmJhciA9IHZiYXIgPSBTY3JvbGxiYXIodGV4dF9mcmFtZSwgbmFtZT0ndmJhcicpCisgICAgICAgIHZiYXJbJ2NvbW1hbmQnXSA9IHRleHQueXZpZXcKKyAgICAgICAgdmJhci5wYWNrKHNpZGU9TEVGVCwgZmlsbD1ZKQorICAgICAgICBzZWxmLmhiYXIgPSBoYmFyID0gU2Nyb2xsYmFyKHRleHRfZnJhbWUsIG5hbWU9J2hiYXInLCBvcmllbnQ9SE9SSVpPTlRBTCkKKyAgICAgICAgaGJhclsnY29tbWFuZCddID0gdGV4dC54dmlldworICAgICAgICBoYmFyLnBhY2soc2lkZT1CT1RUT00sIGZpbGw9WCkKKworICAgICAgICB0ZXh0Wydmb250J10gPSB0eHRmb250CisgICAgICAgIHRleHRbJ3lzY3JvbGxjb21tYW5kJ10gPSB2YmFyLnNldAorICAgICAgICB0ZXh0Wyd4c2Nyb2xsY29tbWFuZCddID0gaGJhci5zZXQKKyAgICAgICAgdGV4dC5wYWNrKHNpZGU9TEVGVCwgZmlsbD1CT1RILCBleHBhbmQ9MSkKKyAgICAgICAgcmV0dXJuIHRleHRfZnJhbWUKKworICAgIGRlZiBtYWtlR3JhcGhGcmFtZShzZWxmLCByb290KToKKyAgICAgICAgdHVydGxlLl9TY3JlZW4uX3Jvb3QgPSByb290CisgICAgICAgIHNlbGYuY2FudndpZHRoID0gMTAwMAorICAgICAgICBzZWxmLmNhbnZoZWlnaHQgPSA4MDAKKyAgICAgICAgdHVydGxlLl9TY3JlZW4uX2NhbnZhcyA9IHNlbGYuX2NhbnZhcyA9IGNhbnZhcyA9IHR1cnRsZS5TY3JvbGxlZENhbnZhcygKKyAgICAgICAgICAgICAgICByb290LCA4MDAsIDYwMCwgc2VsZi5jYW52d2lkdGgsIHNlbGYuY2FudmhlaWdodCkKKyAgICAgICAgY2FudmFzLmFkanVzdFNjcm9sbHMoKQorICAgICAgICBjYW52YXMuX3Jvb3R3aW5kb3cuYmluZCgnPENvbmZpZ3VyZT4nLCBzZWxmLm9uUmVzaXplKQorICAgICAgICBjYW52YXMuX2NhbnZhc1snYm9yZGVyd2lkdGgnXSA9IDAKKworICAgICAgICBzZWxmLnNjcmVlbiA9IF9zXyA9IHR1cnRsZS5TY3JlZW4oKQorICAgICAgICB0dXJ0bGUuVHVydGxlU2NyZWVuLl9faW5pdF9fKF9zXywgX3NfLl9jYW52YXMpCisgICAgICAgIHNlbGYuc2NhbnZhcyA9IF9zXy5fY2FudmFzCisgICAgICAgIHR1cnRsZS5SYXdUdXJ0bGUuc2NyZWVucyA9IFtfc19dCisgICAgICAgIHJldHVybiBjYW52YXMKIAogICAgIGRlZiBjb25maWdHVUkoc2VsZiwgbWVudSwgc3RhcnQsIHN0b3AsIGNsZWFyLCB0eHQ9IiIsIGNvbG9yPSJibHVlIik6CiAgICAgICAgIHNlbGYuRXhhbXBsZXNCdG4uY29uZmlnKHN0YXRlPW1lbnUpCiAKLSAgICAgICAgc2VsZi5zdGFydF9idG4uY29uZmlnKHN0YXRlPXN0YXJ0KQotICAgICAgICBpZiBzdGFydD09Tk9STUFMOgotICAgICAgICAgICAgc2VsZi5zdGFydF9idG4uY29uZmlnKGJnPSIjZDAwIikKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuc3RhcnRfYnRuLmNvbmZpZyhiZz0iI2ZjYSIpCi0KLSAgICAgICAgc2VsZi5zdG9wX2J0bi5jb25maWcoc3RhdGU9c3RvcCkKLSAgICAgICAgaWYgc3RvcD09Tk9STUFMOgotICAgICAgICAgICAgc2VsZi5zdG9wX2J0bi5jb25maWcoYmc9IiNkMDAiKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5zdG9wX2J0bi5jb25maWcoYmc9IiNmY2EiKQotICAgICAgICBzZWxmLmNsZWFyX2J0bi5jb25maWcoc3RhdGU9Y2xlYXIpCi0KLSAgICAgICAgc2VsZi5jbGVhcl9idG4uY29uZmlnKHN0YXRlPWNsZWFyKQotICAgICAgICBpZiBjbGVhcj09Tk9STUFMOgotICAgICAgICAgICAgc2VsZi5jbGVhcl9idG4uY29uZmlnKGJnPSIjZDAwIikKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuY2xlYXJfYnRuLmNvbmZpZyhiZz0iI2ZjYSIpCi0KKyAgICAgICAgc2VsZi5zdGFydF9idG4uY29uZmlnKHN0YXRlPXN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmc9IiNkMDAiIGlmIHN0YXJ0ID09IE5PUk1BTCBlbHNlICIjZmNhIikKKyAgICAgICAgc2VsZi5zdG9wX2J0bi5jb25maWcoc3RhdGU9c3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmc9IiNkMDAiIGlmIHN0b3AgPT0gTk9STUFMIGVsc2UgIiNmY2EiKQorICAgICAgICBzZWxmLmNsZWFyX2J0bi5jb25maWcoc3RhdGU9Y2xlYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZz0iI2QwMCIgaWYgY2xlYXIgPT0gTk9STUFMIGVsc2UiI2ZjYSIpCiAgICAgICAgIHNlbGYub3V0cHV0X2xibC5jb25maWcodGV4dD10eHQsIGZnPWNvbG9yKQogCi0KICAgICBkZWYgbWFrZUxvYWREZW1vTWVudShzZWxmKToKLSAgICAgICAgQ21kQnRuID0gTWVudWJ1dHRvbihzZWxmLm1CYXIsIHRleHQ9J0V4YW1wbGVzJywgdW5kZXJsaW5lPTAsIGZvbnQ9bWVudWZvbnQpCisgICAgICAgIENtZEJ0biA9IE1lbnVidXR0b24oc2VsZi5tQmFyLCB0ZXh0PSdFeGFtcGxlcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJsaW5lPTAsIGZvbnQ9bWVudWZvbnQpCiAgICAgICAgIENtZEJ0bi5wYWNrKHNpZGU9TEVGVCwgcGFkeD0iMm0iKQogICAgICAgICBDbWRCdG4ubWVudSA9IE1lbnUoQ21kQnRuKQogCkBAIC0xNjgsMzAgKzE2NCwzMSBAQAogICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWRmaWxlKHgpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXQKICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZW50cnksc3RyKToKLSAgICAgICAgICAgICAgICBDbWRCdG4ubWVudS5hZGRfY29tbWFuZChsYWJlbD1lbnRyeVs2Oi0zXSwgdW5kZXJsaW5lPTAsIGZvbnQ9bWVudWZvbnQsCisgICAgICAgICAgICAgICAgQ21kQnRuLm1lbnUuYWRkX2NvbW1hbmQobGFiZWw9ZW50cnlbNjotM10sIHVuZGVybGluZT0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQ9bWVudWZvbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1sb2FkZXhhbXBsZShlbnRyeSkpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIF9kaXIsIGVudHJpZXMgPSBlbnRyeVswXSwgZW50cnlbMTpdCiAgICAgICAgICAgICAgICAgQ21kQnRuLm1lbnUuY2hvaWNlcyA9IE1lbnUoQ21kQnRuLm1lbnUpCiAgICAgICAgICAgICAgICAgZm9yIGUgaW4gZW50cmllczoKLSAgICAgICAgICAgICAgICAgICAgQ21kQnRuLm1lbnUuY2hvaWNlcy5hZGRfY29tbWFuZChsYWJlbD1lWzY6LTNdLCB1bmRlcmxpbmU9MCwgZm9udD1tZW51Zm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSBsb2FkZXhhbXBsZShvcy5wYXRoLmpvaW4oX2RpcixlKSkpCi0KLSAgICAgICAgICAgICAgICBDbWRCdG4ubWVudS5hZGRfY2FzY2FkZShsYWJlbD1fZGlyWzY6XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51ID0gQ21kQnRuLm1lbnUuY2hvaWNlcywgZm9udD1tZW51Zm9udCApCisgICAgICAgICAgICAgICAgICAgIENtZEJ0bi5tZW51LmNob2ljZXMuYWRkX2NvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9ZVs2Oi0zXSwgdW5kZXJsaW5lPTAsIGZvbnQ9bWVudWZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9IGxvYWRleGFtcGxlKG9zLnBhdGguam9pbihfZGlyLGUpKSkKKyAgICAgICAgICAgICAgICBDbWRCdG4ubWVudS5hZGRfY2FzY2FkZSgKKyAgICAgICAgICAgICAgICAgICAgbGFiZWw9X2Rpcls2Ol0sIG1lbnUgPSBDbWRCdG4ubWVudS5jaG9pY2VzLCBmb250PW1lbnVmb250KQogCiAgICAgICAgIENtZEJ0blsnbWVudSddID0gQ21kQnRuLm1lbnUKICAgICAgICAgcmV0dXJuIENtZEJ0bgogCi0KICAgICBkZWYgbWFrZUhlbHBNZW51KHNlbGYpOgogICAgICAgICBDbWRCdG4gPSBNZW51YnV0dG9uKHNlbGYubUJhciwgdGV4dD0nSGVscCcsIHVuZGVybGluZT0wLCBmb250ID0gbWVudWZvbnQpCiAgICAgICAgIENtZEJ0bi5wYWNrKHNpZGU9TEVGVCwgcGFkeD0nMm0nKQogICAgICAgICBDbWRCdG4ubWVudSA9IE1lbnUoQ21kQnRuKQogCi0gICAgICAgIENtZEJ0bi5tZW51LmFkZF9jb21tYW5kKGxhYmVsPSdBYm91dCB0dXJ0bGUucHknLCBmb250PW1lbnVmb250LCBjb21tYW5kPXNob3dBYm91dFR1cnRsZSkKLSAgICAgICAgQ21kQnRuLm1lbnUuYWRkX2NvbW1hbmQobGFiZWw9J3R1cnRsZURlbW8gLSBIZWxwJywgZm9udD1tZW51Zm9udCwgY29tbWFuZD1zaG93RGVtb0hlbHApCi0gICAgICAgIENtZEJ0bi5tZW51LmFkZF9jb21tYW5kKGxhYmVsPSdBYm91dCB0dXJ0bGVEZW1vJywgZm9udD1tZW51Zm9udCwgY29tbWFuZD1zaG93QWJvdXREZW1vKQorICAgICAgICBmb3IgaGVscF9sYWJlbCwgaGVscF9maWxlIGluIGhlbHBfZW50cmllczoKKyAgICAgICAgICAgIGRlZiBzaG93KGhlbHBfbGFiZWw9aGVscF9sYWJlbCwgaGVscF9maWxlPWhlbHBfZmlsZSk6CisgICAgICAgICAgICAgICAgdmlld19maWxlKHNlbGYucm9vdCwgaGVscF9sYWJlbCwgb3MucGF0aC5qb2luKGRlbW9fZGlyLCBoZWxwX2ZpbGUpKQorICAgICAgICAgICAgQ21kQnRuLm1lbnUuYWRkX2NvbW1hbmQobGFiZWw9aGVscF9sYWJlbCwgZm9udD1tZW51Zm9udCwgY29tbWFuZD1zaG93KQogCiAgICAgICAgIENtZEJ0blsnbWVudSddID0gQ21kQnRuLm1lbnUKICAgICAgICAgcmV0dXJuIENtZEJ0bgpAQCAtMTk5LDcgKzE5Niw2IEBACiAgICAgZGVmIHJlZnJlc2hDYW52YXMoc2VsZik6CiAgICAgICAgIGlmIG5vdCBzZWxmLmRpcnR5OiByZXR1cm4KICAgICAgICAgc2VsZi5zY3JlZW4uY2xlYXIoKQotICAgICAgICAjc2VsZi5zY3JlZW4ubW9kZSgic3RhbmRhcmQiKQogICAgICAgICBzZWxmLmRpcnR5PUZhbHNlCiAKICAgICBkZWYgbG9hZGZpbGUoc2VsZixmaWxlbmFtZSk6CkBAIC0yNTgsMjMgKzI1NCwxNiBAQAogICAgICAgICAgICAgc2VsZi5jb25maWdHVUkoTk9STUFMLCBOT1JNQUwsIERJU0FCTEVELCBESVNBQkxFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTVE9QUEVEISIsICJyZWQiKQogICAgICAgICAgICAgdHVydGxlLlR1cnRsZVNjcmVlbi5fUlVOTklORyA9IEZhbHNlCi0gICAgICAgICAgICAjcHJpbnQgInN0b3BJVDogZXhpdGZsYWcgPSBUcnVlIgogICAgICAgICBlbHNlOgogICAgICAgICAgICAgdHVydGxlLlR1cnRsZVNjcmVlbi5fUlVOTklORyA9IEZhbHNlCi0gICAgICAgICAgICAjcHJpbnQgInN0b3BJdDogZXhpdGZsYWcgPSBGYWxzZSIKKworICAgIGRlZiBfZGVzdHJveShzZWxmKToKKyAgICAgICAgc2VsZi5yb290LmRlc3Ryb3koKQorICAgICAgICAjc3lzLmV4aXQoKQorCitkZWYgbWFpbigpOgorICAgIGRlbW8gPSBEZW1vV2luZG93KCkKKyAgICBkZW1vLnJvb3QubWFpbmxvb3AoKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIGRlbW8gPSBEZW1vV2luZG93KCkKLSAgICBSVU4gPSBUcnVlCi0gICAgd2hpbGUgUlVOOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBwcmludCAiRU5URVJJTkcgbWFpbmxvb3AiCi0gICAgICAgICAgICBkZW1vLnJvb3QubWFpbmxvb3AoKQotICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICBwcmludCAiQ1JBU0ghISEtIFdBSVQgQSBNT01FTlQhIgotICAgICAgICAgICAgdGltZS5zbGVlcCgwLjMpCi0gICAgICAgICAgICBwcmludCAiR09JTkcgT04gLi4iCi0gICAgICAgICAgICBkZW1vLnJlZnJlc2hDYW52YXMoKQotIyMgICAgICAgICAgICB0aW1lLnNsZWVwKDEpCi0gICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIFJVTiA9IEZBTFNFCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9EZW1vL3R1cnRsZS90dXJ0bGVkZW1vX3R3b19jYW52YXNlcy5weSBiL0RlbW8vdHVydGxlL3R1cnRsZWRlbW9fdHdvX2NhbnZhc2VzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTk4MzFkLi4wMDAwMDAwCi0tLSBhL0RlbW8vdHVydGxlL3R1cnRsZWRlbW9fdHdvX2NhbnZhc2VzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jIyBERU1PTlNUUkFURVMgVVNFIE9GIDIgQ0FOVkFTRVMsIFNPIENBTk5PVCBCRSBSVU4gSU4gREVNT1ZJRVdFUiEKLSIiInR1cnRsZSBleGFtcGxlOiBVc2luZyBUdXJ0bGVTY3JlZW4gYW5kIFJhd1R1cnRsZQotZm9yIGRyYXdpbmcgb24gdHdvIGRpc3RpbmN0IGNhbnZhc2VzLgotIiIiCi1mcm9tIHR1cnRsZSBpbXBvcnQgVHVydGxlU2NyZWVuLCBSYXdUdXJ0bGUsIFRLCi0KLXJvb3QgPSBUSy5UaygpCi1jdjEgPSBUSy5DYW52YXMocm9vdCwgd2lkdGg9MzAwLCBoZWlnaHQ9MjAwLCBiZz0iI2RkZmZmZiIpCi1jdjIgPSBUSy5DYW52YXMocm9vdCwgd2lkdGg9MzAwLCBoZWlnaHQ9MjAwLCBiZz0iI2ZmZWVlZSIpCi1jdjEucGFjaygpCi1jdjIucGFjaygpCi0KLXMxID0gVHVydGxlU2NyZWVuKGN2MSkKLXMxLmJnY29sb3IoMC44NSwgMC44NSwgMSkKLXMyID0gVHVydGxlU2NyZWVuKGN2MikKLXMyLmJnY29sb3IoMSwgMC44NSwgMC44NSkKLQotcCA9IFJhd1R1cnRsZShzMSkKLXEgPSBSYXdUdXJ0bGUoczIpCi0KLXAuY29sb3IoInJlZCIsICJ3aGl0ZSIpCi1wLndpZHRoKDMpCi1xLmNvbG9yKCJibHVlIiwgImJsYWNrIikKLXEud2lkdGgoMykKLQotZm9yIHQgaW4gcCxxOgotICAgIHQuc2hhcGUoInR1cnRsZSIpCi0gICAgdC5sdCgzNikKLQotcS5sdCgxODApCi0KLWZvciBpIGluIHJhbmdlKDUpOgotICAgIGZvciB0IGluIHAsIHE6Ci0gICAgICAgIHQuZmQoNTApCi0gICAgICAgIHQubHQoNzIpCi1mb3IgdCBpbiBwLHE6Ci0gICAgdC5sdCg1NCkKLSAgICB0LnB1KCkKLSAgICB0LmJrKDUwKQotCi0jIyBXYW50IHRvIGdldCBzb21lIGluZm8/Ci0KLXByaW50IHMxLCBzMgotcHJpbnQgcCwgcQotcHJpbnQgczEudHVydGxlcygpCi1wcmludCBzMi50dXJ0bGVzKCkKLQotVEsubWFpbmxvb3AoKQpkaWZmIC0tZ2l0IGEvRG9jL0FDS1MudHh0IGIvRG9jL0FDS1MudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzllZmIwLi4wMDAwMDAwCi0tLSBhL0RvYy9BQ0tTLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi1Db250cmlidXRvcnMgdG8gdGhlIFB5dGhvbiBEb2N1bWVudGF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoaXMgc2VjdGlvbiBsaXN0cyBwZW9wbGUgd2hvIGhhdmUgY29udHJpYnV0ZWQgaW4gc29tZSB3YXkgdG8gdGhlIFB5dGhvbgotZG9jdW1lbnRhdGlvbi4gIEl0IGlzIHByb2JhYmx5IG5vdCBjb21wbGV0ZSAtLSBpZiB5b3UgZmVlbCB0aGF0IHlvdSBvcgotYW55b25lIGVsc2Ugc2hvdWxkIGJlIG9uIHRoaXMgbGlzdCwgcGxlYXNlIGxldCB1cyBrbm93IChzZW5kIGVtYWlsIHRvCi1kb2NzQHB5dGhvbi5vcmcpLCBhbmQgd2UnbGwgYmUgZ2xhZCB0byBjb3JyZWN0IHRoZSBwcm9ibGVtLgotCi0uLiBhY2tzOjoKLQotICAgKiBBYWh6Ci0gICAqIE1pY2hhZWwgQWJib3R0Ci0gICAqIFN0ZXZlIEFsZXhhbmRlcgotICAgKiBKaW0gQWhsc3Ryb20KLSAgICogRnJlZCBBbGxlbgotICAgKiBBLiBBbW9yb3NvCi0gICAqIFBlaHIgQW5kZXJzb24KLSAgICogT2xpdmVyIEFuZHJpY2gKLSAgICogSGVpZGkgQW5uZXhzdGFkCi0gICAqIEplc8O6cyBDZWEgQXZpw7NuCi0gICAqIE1hbnVlbCBCYWxzZXJhCi0gICAqIERhbmllbCBCYXJjbGF5Ci0gICAqIENocmlzIEJhcmtlcgotICAgKiBEb24gQmFzaGZvcmQKLSAgICogQW50aG9ueSBCYXh0ZXIKLSAgICogQWxleGFuZGVyIEJlbG9wb2xza3kKLSAgICogQmVubmV0dCBCZW5zb24KLSAgICogSm9uYXRoYW4gQmxhY2sKLSAgICogUm9iaW4gQm9lcmRpamsKLSAgICogTWljaGFsIEJvem9uCi0gICAqIEFhcm9uIEJyYW5jb3R0aQotICAgKiBHZW9yZyBCcmFuZGwKLSAgICogS2VpdGggQnJpZ2dzCi0gICAqIElhbiBCcnVudGxldHQKLSAgICogTGVlIEJ1c2J5Ci0gICAqIExvcmVuem8gTS4gQ2F0dWNjaQotICAgKiBDYXJsIENlcmVja2UKLSAgICogTWF1cm8gQ2ljb2duaW5pCi0gICAqIEdpbGxlcyBDaXZhcmlvCi0gICAqIE1pa2UgQ2xhcmtzb24KLSAgICogU3RldmUgQ2xpZnQKLSAgICogRGF2ZSBDb2xlCi0gICAqIE1hdHRoZXcgQ293bGVzCi0gICAqIEplcmVteSBDcmF2ZW4KLSAgICogQW5kcmV3IERhbGtlCi0gICAqIEJlbiBEYXJuZWxsCi0gICAqIEwuIFBldGVyIERldXRzY2gKLSAgICogUm9iZXJ0IERvbm9odWUKLSAgICogRnJlZCBMLiBEcmFrZSwgSnIuCi0gICAqIEpvc2lwIER6b2xvbmdhCi0gICAqIEplZmYgRXBsZXIKLSAgICogTWljaGFlbCBFcm5zdAotICAgKiBCbGFtZSBBbmR5IEVza2lsc3NvbgotICAgKiBDYXJleSBFdmFucwotICAgKiBNYXJ0aWpuIEZhYXNzZW4KLSAgICogQ2FybCBGZXlubWFuCi0gICAqIERhbiBGaW5uaWUKLSAgICogSGVybsOhbiBNYXJ0w61uZXogRm9mZmFuaQotICAgKiBTdGVmYW4gRnJhbmtlCi0gICAqIEppbSBGdWx0b24KLSAgICogUGV0ZXIgRnVuawotICAgKiBMZWxlIEdhaWZheAotICAgKiBNYXR0aGV3IEdhbGxhZ2hlcgotICAgKiBHYWJyaWVsIEdlbmVsbGluYQotICAgKiBCZW4gR2VydHpmaWVsZAotICAgKiBOYWRpbSBHaGF6bmF2aQotICAgKiBKb25hdGhhbiBHaWRkeQotICAgKiBTaGVsbGV5IEdvb2NoCi0gICAqIE5hdGhhbmllbCBHcmF5Ci0gICAqIEdyYW50IEdyaWZmaW4KLSAgICogVGhvbWFzIEd1ZXR0bGVyCi0gICAqIEFuZGVycyBIYW1tYXJxdWlzdAotICAgKiBNYXJrIEhhbW1vbmQKLSAgICogSGFyYWxkIEhhbmNoZS1PbHNlbgotICAgKiBNYW51cyBIYW5kCi0gICAqIEdlcmhhcmQgSMOkcmluZwotICAgKiBUcmF2aXMgQi4gSGFydHdlbGwKLSAgICogVGltIEhhdGNoCi0gICAqIEphbmtvIEhhdXNlcgotICAgKiBCZW4gSGF5ZGVuCi0gICAqIFRob21hcyBIZWxsZXIKLSAgICogQmVybmhhcmQgSGVyem9nCi0gICAqIE1hZ251cyBMLiBIZXRsYW5kCi0gICAqIEtvbnJhZCBIaW5zZW4KLSAgICogU3RlZmFuIEhvZmZtZWlzdGVyCi0gICAqIEFsYmVydCBIb2ZrYW1wCi0gICAqIEdyZWdvciBIb2ZmbGVpdAotICAgKiBTdGV2ZSBIb2xkZW4KLSAgICogVGhvbWFzIEhvbGVuc3RlaW4KLSAgICogR2Vycml0IEhvbGwKLSAgICogUm9iIEhvb2Z0Ci0gICAqIEJyaWFuIEhvb3BlcgotICAgKiBSYW5kYWxsIEhvcHBlcgotICAgKiBNaWNoYWVsIEh1ZHNvbgotICAgKiBFcmljIEh1c3MKLSAgICogSmVyZW15IEh5bHRvbgotICAgKiBSb2dlciBJcndpbgotICAgKiBKYWNrIEphbnNlbgotICAgKiBQaGlsaXAgSC4gSmVuc2VuCi0gICAqIFBlZHJvIERpYXogSmltZW5legotICAgKiBLZW50IEpvaG5zb24KLSAgICogTHVjYXMgZGUgSm9uZ2UKLSAgICogQW5kcmVhcyBKdW5nCi0gICAqIFJvYmVydCBLZXJuCi0gICAqIEppbSBLZXJyCi0gICAqIEphbiBLaW0KLSAgICogS2FtaWwgS2lzaWVsCi0gICAqIEdyZWcgS29jaGFuc2tpCi0gICAqIEd1aWRvIEtvbGxlcmllCi0gICAqIFBldGVyIEEuIEtvcmVuCi0gICAqIERhbmllbCBLb3phbgotICAgKiBBbmRyZXcgTS4gS3VjaGxpbmcKLSAgICogRGF2ZSBLdWhsbWFuCi0gICAqIEVybm8gS3V1c2VsYQotICAgKiBSb3NzIExhZ2Vyd2FsbAotICAgKiBUaG9tYXMgTGFtYgotICAgKiBEZXRsZWYgTGFubmVydAotICAgKiBQaWVycyBMYXVkZXIKLSAgICogR2x5cGggTGVma293aXR6Ci0gICAqIFJvYmVydCBMZWhtYW5uCi0gICAqIE1hcmMtQW5kcsOpIExlbWJ1cmcKLSAgICogUm9zcyBMaWdodAotICAgKiBVbGYgQS4gTGluZGdyZW4KLSAgICogRXZlcmV0dCBMaXBtYW4KLSAgICogTWlya28gTGlzcwotICAgKiBNYXJ0aW4gdm9uIEzDtndpcwotICAgKiBGcmVkcmlrIEx1bmRoCi0gICAqIEplZmYgTWFjRG9uYWxkCi0gICAqIEpvaG4gTWFjaGluCi0gICAqIEFuZHJldyBNYWNJbnR5cmUKLSAgICogVmxhZGltaXIgTWFyYW5nb3pvdgotICAgKiBWaW5jZW50IE1hcmNoZXR0aQotICAgKiBXZXN0bGV5IE1hcnTDrW5legotICAgKiBMYXVyYSBNYXRzb24KLSAgICogRGFuaWVsIE1heQotICAgKiBSZWJlY2NhIE1jQ3JlYXJ5Ci0gICAqIERvdWcgTWVubmVsbGEKLSAgICogUGFvbG8gTWlsYW5pCi0gICAqIFNraXAgTW9udGFuYXJvCi0gICAqIFBhdWwgTW9vcmUKLSAgICogUm9zcyBNb29yZQotICAgKiBTam9lcmQgTXVsbGVuZGVyCi0gICAqIERhbGUgTmFnYXRhCi0gICAqIE1pY2hhbCBOb3dpa293c2tpCi0gICAqIFN0ZWZmZW4gRGFvZGUgTnVycG1lc28KLSAgICogTmcgUGhlbmcgU2lvbmcKLSAgICogS29yYXkgT25lcgotICAgKiBUb21hcyBPcHBlbHN0cnVwCi0gICAqIERlbmlzIFMuIE90a2lkYWNoCi0gICAqIFpvb2tvIE8nV2hpZWxhY3JvbngKLSAgICogU2hyaXBoYW5pIFBhbGFrb2RldHkKLSAgICogV2lsbGlhbSBQYXJrCi0gICAqIEpvb25hcyBQYWFsYXNtYWEKLSAgICogSGFycmkgUGFzYW5lbgotICAgKiBCbyBQZW5nCi0gICAqIFRpbSBQZXRlcnMKLSAgICogQmVuamFtaW4gUGV0ZXJzb24KLSAgICogQ2hyaXN0b3BoZXIgUGV0cmlsbGkKLSAgICogSnVzdGluIEQuIFBldHRpdAotICAgKiBDaHJpcyBQaG9lbml4Ci0gICAqIEZyYW7Dp29pcyBQaW5hcmQKLSAgICogUGF1bCBQcmVzY29kCi0gICAqIEVyaWMgUy4gUmF5bW9uZAotICAgKiBFZHdhcmQgSy4gUmVhbQotICAgKiBUZXJyeSBKLiBSZWVkeQotICAgKiBTZWFuIFJlaWZzY2huZWlkZXIKLSAgICogQmVybmhhcmQgUmVpdGVyCi0gICAqIEFybWluIFJpZ28KLSAgICogV2VzIFJpc2hlbAotICAgKiBBcm1pbiBSb25hY2hlcgotICAgKiBKaW0gUm9za2luZAotICAgKiBHdWlkbyB2YW4gUm9zc3VtCi0gICAqIERvbmFsZCBXYWxsYWNlIFJvdXNlIElJCi0gICAqIE1hcmsgUnVzc2VsbAotICAgKiBOaWNrIFJ1c3NvCi0gICAqIENocmlzIFJ5bGFuZAotICAgKiBDb25zdGFudGluYSBTLgotICAgKiBIdWdoIFNhc3NlCi0gICAqIEJvYiBTYXZhZ2UKLSAgICogU2NvdHQgU2NocmFtCi0gICAqIE5laWwgU2NoZW1lbmF1ZXIKLSAgICogQmFycnkgU2NvdHQKLSAgICogSm9ha2ltIFNlcm5icmFudAotICAgKiBKdXN0aW4gU2hlZWh5Ci0gICAqIENoYXJsaWUgU2hlcGhlcmQKLSAgICogWXVlIFNodWFpamllCi0gICAqIE1pY2hhZWwgU2ltY2ljaAotICAgKiBJb25lbCBTaW1pb25lc2N1Ci0gICAqIE1pY2hhZWwgU2xvYW4KLSAgICogR3JlZ29yeSBQLiBTbWl0aAotICAgKiBSb3kgU21pdGgKLSAgICogQ2xheSBTcGVuY2UKLSAgICogTmljaG9sYXMgU3BpZXMKLSAgICogVGFnZSBTdGFiZWxsLUt1bG8KLSAgICogRnJhbmsgU3RhamFubwotICAgKiBBbnRob255IFN0YXJrcwotICAgKiBHcmVnIFN0ZWluCi0gICAqIFBldGVyIFN0b2VocgotICAgKiBNYXJrIFN1bW1lcmZpZWxkCi0gICAqIFJldWJlbiBTdW1uZXIKLSAgICogS2FsbGUgU3ZlbnNzb24KLSAgICogSmltIFRpdHRzbGVyCi0gICAqIERhdmlkIFR1cm5lcgotICAgKiBTYW5kcm8gVG9zaQotICAgKiBWaWxsZSBWYWluaW8KLSAgICogTWFydGlqbiBWcmllcwotICAgKiBDaGFybGVzIEcuIFdhbGRtYW4KLSAgICogR3JlZyBXYXJkCi0gICAqIEJhcnJ5IFdhcnNhdwotICAgKiBDb3JyYW4gV2Vic3RlcgotICAgKiBHbHluIFdlYnN0ZXIKLSAgICogQm9iIFdlaW5lcgotICAgKiBFZGR5IFdlbGJvdXJuZQotICAgKiBKZWZmIFdoZWVsZXIKLSAgICogTWF0cyBXaWNobWFubgotICAgKiBHZXJyeSBXaWVuZXIKLSAgICogVGltb3RoeSBXaWxkCi0gICAqIFBhdWwgV2lua2xlcgotICAgKiBDb2xsaW4gV2ludGVyCi0gICAqIEJsYWtlIFdpbnRvbgotICAgKiBEYW4gV29sZmUKLSAgICogQWRhbSBXb29kYmVjawotICAgKiBTdGV2ZW4gV29yawotICAgKiBUaG9tYXMgV291dGVycwotICAgKiBLYS1QaW5nIFllZQotICAgKiBSb3J5IFlvcmtlCi0gICAqIE1vc2hlIFphZGthCi0gICAqIE1pbGFuIFphbWF6YWwKLSAgICogQ2hlbmcgWmhhbmcKZGlmZiAtLWdpdCBhL0RvYy9NYWtlZmlsZSBiL0RvYy9NYWtlZmlsZQppbmRleCAyMDQ5OTg2Li4wN2JmOWIyIDEwMDY0NAotLS0gYS9Eb2MvTWFrZWZpbGUKKysrIGIvRG9jL01ha2VmaWxlCkBAIC00MCw3ICs0MCw3IEBACiBjaGVja291dDoKIAlAaWYgWyAhIC1kIHRvb2xzL3NwaGlueCBdOyB0aGVuIFwKIAkgIGVjaG8gIkNoZWNraW5nIG91dCBTcGhpbnguLi4iOyBcCi0JICBzdm4gY2hlY2tvdXQgJChTVk5ST09UKS9leHRlcm5hbC9TcGhpbngtMC42Ljcvc3BoaW54IHRvb2xzL3NwaGlueDsgXAorCSAgc3ZuIGNoZWNrb3V0ICQoU1ZOUk9PVCkvZXh0ZXJuYWwvU3BoaW54LTEuMC43L3NwaGlueCB0b29scy9zcGhpbng7IFwKIAlmaQogCUBpZiBbICEgLWQgdG9vbHMvZG9jdXRpbHMgXTsgdGhlbiBcCiAJICBlY2hvICJDaGVja2luZyBvdXQgRG9jdXRpbHMuLi4iOyBcCkBAIC04NiwyNCArODYsMzAgQEAKIAlAZWNobyAiVGhlIG92ZXJ2aWV3IGZpbGUgaXMgaW4gYnVpbGQvY2hhbmdlcy4iCiAKIGxpbmtjaGVjazogQlVJTERFUiA9IGxpbmtjaGVjawotbGlua2NoZWNrOiBidWlsZAotCUBlY2hvICJMaW5rIGNoZWNrIGNvbXBsZXRlOyBsb29rIGZvciBhbnkgZXJyb3JzIGluIHRoZSBhYm92ZSBvdXRwdXQiIFwKLQkgICAgICAib3IgaW4gYnVpbGQvJChCVUlMREVSKS9vdXRwdXQudHh0IgorbGlua2NoZWNrOgorCUAkKE1BS0UpIGJ1aWxkIEJVSUxERVI9JChCVUlMREVSKSB8fCB7IFwKKwllY2hvICJMaW5rIGNoZWNrIGNvbXBsZXRlOyBsb29rIGZvciBhbnkgZXJyb3JzIGluIHRoZSBhYm92ZSBvdXRwdXQiIFwKKwkgICAgICJvciBpbiBidWlsZC8kKEJVSUxERVIpL291dHB1dC50eHQiOyBcCisJZmFsc2U7IH0KIAogc3VzcGljaW91czogQlVJTERFUiA9IHN1c3BpY2lvdXMKLXN1c3BpY2lvdXM6IGJ1aWxkCi0JQGVjaG8gIlN1c3BpY2lvdXMgY2hlY2sgY29tcGxldGU7IGxvb2sgZm9yIGFueSBlcnJvcnMgaW4gdGhlIGFib3ZlIG91dHB1dCIgXAotCSAgICAgICJvciBpbiBidWlsZC8kKEJVSUxERVIpL3N1c3BpY2lvdXMuY3N2LiAgSWYgYWxsIGlzc3VlcyBhcmUgZmFsc2UiIFwKLQkgICAgICAicG9zaXRpdmVzLCBhcHBlbmQgdGhhdCBmaWxlIHRvIHRvb2xzL3NwaGlueGV4dC9zdXNwLWlnbm9yZWQuY3N2LiIKK3N1c3BpY2lvdXM6CisJQCQoTUFLRSkgYnVpbGQgQlVJTERFUj0kKEJVSUxERVIpIHx8IHsgXAorCWVjaG8gIlN1c3BpY2lvdXMgY2hlY2sgY29tcGxldGU7IGxvb2sgZm9yIGFueSBlcnJvcnMgaW4gdGhlIGFib3ZlIG91dHB1dCIgXAorCSAgICAgIm9yIGluIGJ1aWxkLyQoQlVJTERFUikvc3VzcGljaW91cy5jc3YuICBJZiBhbGwgaXNzdWVzIGFyZSBmYWxzZSIgXAorCSAgICAgInBvc2l0aXZlcywgYXBwZW5kIHRoYXQgZmlsZSB0byB0b29scy9zcGhpbnhleHQvc3VzcC1pZ25vcmVkLmNzdi4iOyBcCisJZmFsc2U7IH0KIAogY292ZXJhZ2U6IEJVSUxERVIgPSBjb3ZlcmFnZQogY292ZXJhZ2U6IGJ1aWxkCiAJQGVjaG8gIkNvdmVyYWdlIGZpbmlzaGVkOyBzZWUgYy50eHQgYW5kIHB5dGhvbi50eHQgaW4gYnVpbGQvY292ZXJhZ2UiCiAKIGRvY3Rlc3Q6IEJVSUxERVIgPSBkb2N0ZXN0Ci1kb2N0ZXN0OiBidWlsZAotCUBlY2hvICJUZXN0aW5nIG9mIGRvY3Rlc3RzIGluIHRoZSBzb3VyY2VzIGZpbmlzaGVkLCBsb29rIGF0IHRoZSIgXAotCSAgICAgICJyZXN1bHRzIGluIGJ1aWxkL2RvY3Rlc3Qvb3V0cHV0LnR4dCIKK2RvY3Rlc3Q6CisJQCQoTUFLRSkgYnVpbGQgQlVJTERFUj0kKEJVSUxERVIpIHx8IHsgXAorCWVjaG8gIlRlc3Rpbmcgb2YgZG9jdGVzdHMgaW4gdGhlIHNvdXJjZXMgZmluaXNoZWQsIGxvb2sgYXQgdGhlIiBcCisJICAgICAicmVzdWx0cyBpbiBidWlsZC9kb2N0ZXN0L291dHB1dC50eHQiOyBcCisJZmFsc2U7IH0KIAogcHlkb2MtdG9waWNzOiBCVUlMREVSID0gcHlkb2MtdG9waWNzCiBweWRvYy10b3BpY3M6IGJ1aWxkCkBAIC0xNjksMTIgKzE3NSwxOSBAQAogIyBmb3IgZGV2ZWxvcG1lbnQgcmVsZWFzZXM6IGFsd2F5cyBidWlsZAogYXV0b2J1aWxkLWRldjoKIAltYWtlIHVwZGF0ZQotCW1ha2UgZGlzdCBTUEhJTlhPUFRTPSctQSBkYWlseT0xJworCW1ha2UgZGlzdCBTUEhJTlhPUFRTPSctQSBkYWlseT0xIC1BIHZlcnNpb25zd2l0Y2hlcj0xJworCS1tYWtlIHN1c3BpY2lvdXMKIAotIyBmb3Igc3RhYmxlIHJlbGVhc2VzOiBvbmx5IGJ1aWxkIGlmIG5vdCBpbiBwcmUtcmVsZWFzZSBzdGFnZSAoYWxwaGEsIGJldGEsIHJjKQorIyBmb3IgcXVpY2sgcmVidWlsZHMgKEhUTUwgb25seSkKK2F1dG9idWlsZC1odG1sOgorCW1ha2UgaHRtbCBTUEhJTlhPUFRTPSctQSBkYWlseT0xIC1BIHZlcnNpb25zd2l0Y2hlcj0xJworCisjIGZvciBzdGFibGUgcmVsZWFzZXM6IG9ubHkgYnVpbGQgaWYgbm90IGluIHByZS1yZWxlYXNlIHN0YWdlIChhbHBoYSwgYmV0YSkKKyMgcmVsZWFzZSBjYW5kaWRhdGUgZG93bmxvYWRzIGFyZSBva2F5LCBzaW5jZSB0aGUgc3RhYmxlIHRyZWUgY2FuIGJlIGluIHRoYXQgc3RhZ2UKIGF1dG9idWlsZC1zdGFibGU6Ci0JQGNhc2UgJChESVNUVkVSU0lPTikgaW4gKlthYmNdKikgXAorCUBjYXNlICQoRElTVFZFUlNJT04pIGluICpbYWJdKikgXAogCQllY2hvICJOb3QgYnVpbGRpbmc7ICQoRElTVFZFUlNJT04pIGlzIG5vdCBhIHJlbGVhc2UgdmVyc2lvbi4iOyBcCiAJCWV4aXQgMTs7IFwKIAllc2FjCiAJQG1ha2UgYXV0b2J1aWxkLWRldgorCmRpZmYgLS1naXQgYS9Eb2MvUkVBRE1FLnR4dCBiL0RvYy9SRUFETUUudHh0CmluZGV4IDBlNzBiZTUuLmI4ZmY0N2YgMTAwNjQ0Ci0tLSBhL0RvYy9SRUFETUUudHh0CisrKyBiL0RvYy9SRUFETUUudHh0CkBAIC0zLDE4ICszLDE3IEBACiAKIFRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSByZVN0cnVjdHVyZWRUZXh0IChyZVNUKSBzb3VyY2VzIHRvIHRoZSBQeXRob24KIGRvY3VtZW50YXRpb24uICBZb3UgZG9uJ3QgbmVlZCB0byBidWlsZCB0aGVtIHlvdXJzZWxmLCBwcmVidWlsdCB2ZXJzaW9ucyBhcmUKLWF2YWlsYWJsZSBhdCBodHRwOi8vZG9jcy5weXRob24ub3JnL2Rvd25sb2FkLy4KK2F2YWlsYWJsZSBhdCBodHRwczovL2RvY3MucHl0aG9uLm9yZy8yL2Rvd25sb2FkLmh0bWwKIAogRG9jdW1lbnRhdGlvbiBvbiB0aGUgYXV0aG9yaW5nIFB5dGhvbiBkb2N1bWVudGF0aW9uLCBpbmNsdWRpbmcgaW5mb3JtYXRpb24gYWJvdXQKIGJvdGggc3R5bGUgYW5kIG1hcmt1cCwgaXMgYXZhaWxhYmxlIGluIHRoZSAiRG9jdW1lbnRpbmcgUHl0aG9uIiBjaGFwdGVyIG9mIHRoZQotZG9jdW1lbnRhdGlvbi4gIFRoZXJlJ3MgYWxzbyBhIGNoYXB0ZXIgaW50ZW5kZWQgdG8gcG9pbnQgb3V0IGRpZmZlcmVuY2VzIHRvCi10aG9zZSBmYW1pbGlhciB3aXRoIHRoZSBwcmV2aW91cyBkb2NzIHdyaXR0ZW4gaW4gTGFUZVguCitkb2N1bWVudGF0aW9uLgogCiAKIEJ1aWxkaW5nIHRoZSBkb2NzCiA9PT09PT09PT09PT09PT09PQogCi1Zb3UgbmVlZCB0byBoYXZlIFB5dGhvbiAyLjQgb3IgaGlnaGVyIGluc3RhbGxlZDsgdGhlIHRvb2xzZXQgdXNlZCB0byBidWlsZCB0aGUKK1lvdSBuZWVkIHRvIGhhdmUgUHl0aG9uIDIgaW5zdGFsbGVkOyB0aGUgdG9vbHNldCB1c2VkIHRvIGJ1aWxkIHRoZQogZG9jcyBpcyB3cml0dGVuIGluIFB5dGhvbi4gIEl0IGlzIGNhbGxlZCAqU3BoaW54KiwgaXQgaXMgbm90IGluY2x1ZGVkIGluIHRoaXMKIHRyZWUsIGJ1dCBtYWludGFpbmVkIHNlcGFyYXRlbHkuICBBbHNvIG5lZWRlZCBhcmUgdGhlIGRvY3V0aWxzLCBzdXBwbHlpbmcgdGhlCiBiYXNlIG1hcmt1cCB0aGF0IFNwaGlueCB1c2VzLCBKaW5qYSwgYSB0ZW1wbGF0aW5nIGVuZ2luZSwgYW5kIG9wdGlvbmFsbHkKQEAgLTMzLDYgKzMyLDkgQEAKIEhUTUwgb3V0cHV0IGZpbGVzLiAgVG8gdmlldyB0aGUgZ2VuZXJhdGVkIEhUTUwsIHBvaW50IHlvdXIgZmF2b3JpdGUgYnJvd3NlciBhdAogdGhlIHRvcC1sZXZlbCBpbmRleCBgYnVpbGQvaHRtbC9pbmRleC5odG1sYCBhZnRlciBydW5uaW5nICJtYWtlIi4KIAorT24gV2luZG93cywgd2UgdHJ5IHRvIGVtdWxhdGUgdGhlIE1ha2VmaWxlIGFzIGNsb3NlbHkgYXMgcG9zc2libGUgd2l0aCBhCitgYG1ha2UuYmF0YGAgZmlsZS4KKwogQXZhaWxhYmxlIG1ha2UgdGFyZ2V0cyBhcmU6CiAKICAqICJodG1sIiwgd2hpY2ggYnVpbGRzIHN0YW5kYWxvbmUgSFRNTCBmaWxlcyBmb3Igb2ZmbGluZSB2aWV3aW5nLgpAQCAtNjUsNDMgKzY3LDIzIEBACiAgICBgdG9vbHMvc3BoaW54ZXh0L3B5c3BlY2lmaWMucHlgIC0tIHB5ZG9jIG5lZWRzIHRoZXNlIHRvIHNob3cgdG9waWMgYW5kCiAgICBrZXl3b3JkIGhlbHAuCiAKKyAqICJzdXNwaWNpb3VzIiwgd2hpY2ggY2hlY2tzIHRoZSBwYXJzZWQgbWFya3VwIGZvciB0ZXh0IHRoYXQgbG9va3MgbGlrZQorICAgbWFsZm9ybWVkIGFuZCB0aHVzIHVuY29udmVydGVkIHJlU1QuCisKIEEgIm1ha2UgdXBkYXRlIiB1cGRhdGVzIHRoZSBTdWJ2ZXJzaW9uIGNoZWNrb3V0cyBpbiBgdG9vbHMvYC4KIAogCiBXaXRob3V0IG1ha2UKIC0tLS0tLS0tLS0tLQogCi1Zb3UnbGwgbmVlZCB0byBpbnN0YWxsIHRoZSBTcGhpbnggcGFja2FnZSwgZWl0aGVyIGJ5IGNoZWNraW5nIGl0IG91dCB2aWEgOjoKK0luc3RhbGwgdGhlIFNwaGlueCBwYWNrYWdlIGFuZCBpdHMgZGVwZW5kZW5jaWVzIGZyb20gUHlQSS4KIAotICAgc3ZuIGNvIGh0dHA6Ly9zdm4ucHl0aG9uLm9yZy9wcm9qZWN0cy9leHRlcm5hbC9TcGhpbngtMC42Ljcvc3BoaW54IHRvb2xzL3NwaGlueAorVGhlbiwgZnJvbSB0aGUgYGBEb2NzYGAgZGlyZWN0b3J5LCBydW4gOjoKIAotb3IgYnkgaW5zdGFsbGluZyBpdCBmcm9tIFB5UEkuCisgICBzcGhpbngtYnVpbGQgLWI8YnVpbGRlcj4gLiBidWlsZC88YnVpbGRlcj4KIAotVGhlbiwgeW91IG5lZWQgdG8gaW5zdGFsbCBEb2N1dGlscywgZWl0aGVyIGJ5IGNoZWNraW5nIGl0IG91dCB2aWEgOjoKLQotICAgc3ZuIGNvIGh0dHA6Ly9zdm4ucHl0aG9uLm9yZy9wcm9qZWN0cy9leHRlcm5hbC9kb2N1dGlscy0wLjYvZG9jdXRpbHMgdG9vbHMvZG9jdXRpbHMKLQotb3IgYnkgaW5zdGFsbGluZyBpdCBmcm9tIGh0dHA6Ly9kb2N1dGlscy5zZi5uZXQvLgotCi1Zb3UgYWxzbyBuZWVkIEppbmphMiwgZWl0aGVyIGJ5IGNoZWNraW5nIGl0IG91dCB2aWEgOjoKLQotICAgc3ZuIGNvIGh0dHA6Ly9zdm4ucHl0aG9uLm9yZy9wcm9qZWN0cy9leHRlcm5hbC9KaW5qYS0yLjMuMS9qaW5qYTIgdG9vbHMvamluamEyCi0KLW9yIGJ5IGluc3RhbGxpbmcgaXQgZnJvbSBQeVBJLgotCi1Zb3UgY2FuIG9wdGlvbmFsbHkgYWxzbyBpbnN0YWxsIFB5Z21lbnRzLCBlaXRoZXIgYXMgYSBjaGVja291dCB2aWEgOjoKLQotICAgc3ZuIGNvIGh0dHA6Ly9zdm4ucHl0aG9uLm9yZy9wcm9qZWN0cy9leHRlcm5hbC9QeWdtZW50cy0xLjMuMS9weWdtZW50cyB0b29scy9weWdtZW50cwotCi1vciBmcm9tIFB5UEkgYXQgaHR0cDovL3B5cGkucHl0aG9uLm9yZy9weXBpL1B5Z21lbnRzLgotCi0KLVRoZW4sIG1ha2UgYW4gb3V0cHV0IGRpcmVjdG9yeSwgZS5nLiB1bmRlciBgYnVpbGQvYCwgYW5kIHJ1biA6OgotCi0gICBweXRob24gdG9vbHMvc3BoaW54LWJ1aWxkLnB5IC1iPGJ1aWxkZXI+IC4gYnVpbGQvPG91dHB1dGRpcmVjdG9yeT4KLQotd2hlcmUgYDxidWlsZGVyPmAgaXMgb25lIG9mIGh0bWwsIHRleHQsIGxhdGV4LCBvciBodG1saGVscCAoZm9yIGV4cGxhbmF0aW9ucyBzZWUKLXRoZSBtYWtlIHRhcmdldHMgYWJvdmUpLgord2hlcmUgYGA8YnVpbGRlcj5gYCBpcyBvbmUgb2YgaHRtbCwgdGV4dCwgbGF0ZXgsIG9yIGh0bWxoZWxwIChmb3IgZXhwbGFuYXRpb25zCitzZWUgdGhlIG1ha2UgdGFyZ2V0cyBhYm92ZSkuCiAKIAogQ29udHJpYnV0aW5nCkBAIC0xMjcsNyArMTA5LDcgQEAKIGFzIGxvbmcgYXMgeW91IGRvbid0IGNoYW5nZSBvciByZW1vdmUgdGhlIGNvcHlyaWdodCBub3RpY2U6CiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAwMC0yMDA4IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorQ29weXJpZ2h0IChjKSAyMDAwLTIwMTQgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uCiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiBDb3B5cmlnaHQgKGMpIDIwMDAgQmVPcGVuLmNvbS4KZGlmZiAtLWdpdCBhL0RvYy9hYm91dC5yc3QgYi9Eb2MvYWJvdXQucnN0CmluZGV4IDJjMjI5ZTYuLjY3ODE2OGIgMTAwNjQ0Ci0tLSBhL0RvYy9hYm91dC5yc3QKKysrIGIvRG9jL2Fib3V0LnJzdApAQCAtNywxNCArNywxNSBAQAogZG9jdW1lbnQgcHJvY2Vzc29yIHNwZWNpZmljYWxseSB3cml0dGVuIGZvciB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24uCiAKIC4uIF9yZVN0cnVjdHVyZWRUZXh0OiBodHRwOi8vZG9jdXRpbHMuc2YubmV0L3JzdC5odG1sCi0uLiBfU3BoaW54OiBodHRwOi8vc3BoaW54LnBvY29vLm9yZy8KKy4uIF9TcGhpbng6IGh0dHA6Ly9zcGhpbngtZG9jLm9yZy8KIAogLi4gSW4gdGhlIG9ubGluZSB2ZXJzaW9uIG9mIHRoZXNlIGRvY3VtZW50cywgeW91IGNhbiBzdWJtaXQgY29tbWVudHMgYW5kIHN1Z2dlc3QKICAgIGNoYW5nZXMgZGlyZWN0bHkgb24gdGhlIGRvY3VtZW50YXRpb24gcGFnZXMuCiAKLURldmVsb3BtZW50IG9mIHRoZSBkb2N1bWVudGF0aW9uIGFuZCBpdHMgdG9vbGNoYWluIHRha2VzIHBsYWNlIG9uIHRoZQotZG9jc0BweXRob24ub3JnIG1haWxpbmcgbGlzdC4gIFdlJ3JlIGFsd2F5cyBsb29raW5nIGZvciB2b2x1bnRlZXJzIHdhbnRpbmcKLXRvIGhlbHAgd2l0aCB0aGUgZG9jcywgc28gZmVlbCBmcmVlIHRvIHNlbmQgYSBtYWlsIHRoZXJlIQorRGV2ZWxvcG1lbnQgb2YgdGhlIGRvY3VtZW50YXRpb24gYW5kIGl0cyB0b29sY2hhaW4gaXMgYW4gZW50aXJlbHkgdm9sdW50ZWVyCitlZmZvcnQsIGp1c3QgbGlrZSBQeXRob24gaXRzZWxmLiAgSWYgeW91IHdhbnQgdG8gY29udHJpYnV0ZSwgcGxlYXNlIHRha2UgYQorbG9vayBhdCB0aGUgOnJlZjpgcmVwb3J0aW5nLWJ1Z3NgIHBhZ2UgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBkbyBzby4gIE5ldwordm9sdW50ZWVycyBhcmUgYWx3YXlzIHdlbGNvbWUhCiAKIE1hbnkgdGhhbmtzIGdvIHRvOgogCkBAIC0yNiwxMSArMjcsMTMgQEAKICAgPGh0dHA6Ly9lZmZib3Qub3JnL3pvbmUvcHlyZWYuaHRtPmBfIHByb2plY3QgZnJvbSB3aGljaCBTcGhpbnggZ290IG1hbnkgZ29vZAogICBpZGVhcy4KIAotU2VlIDpyZWY6YHJlcG9ydGluZy1idWdzYCBmb3IgaW5mb3JtYXRpb24gaG93IHRvIHJlcG9ydCBidWdzIGluIHRoaXMKLWRvY3VtZW50YXRpb24sIG9yIFB5dGhvbiBpdHNlbGYuCiAKLS4uIGluY2x1ZGluZyB0aGUgQUNLUyBmaWxlIGhlcmUgc28gdGhhdCBpdCBjYW4gYmUgbWFpbnRhaW5lZCBzZXBhcmF0ZWx5Ci0uLiBpbmNsdWRlOjogQUNLUy50eHQKK0NvbnRyaWJ1dG9ycyB0byB0aGUgUHl0aG9uIERvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTWFueSBwZW9wbGUgaGF2ZSBjb250cmlidXRlZCB0byB0aGUgUHl0aG9uIGxhbmd1YWdlLCB0aGUgUHl0aG9uIHN0YW5kYXJkCitsaWJyYXJ5LCBhbmQgdGhlIFB5dGhvbiBkb2N1bWVudGF0aW9uLiAgU2VlIDpzb3VyY2U6YE1pc2MvQUNLU2AgaW4gdGhlIFB5dGhvbgorc291cmNlIGRpc3RyaWJ1dGlvbiBmb3IgYSBwYXJ0aWFsIGxpc3Qgb2YgY29udHJpYnV0b3JzLgogCiBJdCBpcyBvbmx5IHdpdGggdGhlIGlucHV0IGFuZCBjb250cmlidXRpb25zIG9mIHRoZSBQeXRob24gY29tbXVuaXR5CiB0aGF0IFB5dGhvbiBoYXMgc3VjaCB3b25kZXJmdWwgZG9jdW1lbnRhdGlvbiAtLSBUaGFuayBZb3UhCmRpZmYgLS1naXQgYS9Eb2MvYnVncy5yc3QgYi9Eb2MvYnVncy5yc3QKaW5kZXggYTlhNDhjNy4uODQ3YzAxMCAxMDA2NDQKLS0tIGEvRG9jL2J1Z3MucnN0CisrKyBiL0RvYy9idWdzLnJzdApAQCAtMTMsMTUgKzEzLDE3IEBACiA9PT09PT09PT09PT09PT09PT0KIAogSWYgeW91IGZpbmQgYSBidWcgaW4gdGhpcyBkb2N1bWVudGF0aW9uIG9yIHdvdWxkIGxpa2UgdG8gcHJvcG9zZSBhbiBpbXByb3ZlbWVudCwKLXBsZWFzZSBzZW5kIGFuIGUtbWFpbCB0byBkb2NzQHB5dGhvbi5vcmcgZGVzY3JpYmluZyB0aGUgYnVnIGFuZCB3aGVyZSB5b3UgZm91bmQKLWl0LiAgSWYgeW91IGhhdmUgYSBzdWdnZXN0aW9uIGhvdyB0byBmaXggaXQsIGluY2x1ZGUgdGhhdCBhcyB3ZWxsLgorcGxlYXNlIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgb24gdGhlIDpyZWY6YHRyYWNrZXIgPHVzaW5nLXRoZS10cmFja2VyPmAuICBJZiB5b3UKK2hhdmUgYSBzdWdnZXN0aW9uIGhvdyB0byBmaXggaXQsIGluY2x1ZGUgdGhhdCBhcyB3ZWxsLgogCi1kb2NzQHB5dGhvbi5vcmcgaXMgYSBtYWlsaW5nIGxpc3QgcnVuIGJ5IHZvbHVudGVlcnM7IHlvdXIgcmVxdWVzdCB3aWxsIGJlCi1ub3RpY2VkLCBldmVuIGlmIGl0IHRha2VzIGEgd2hpbGUgdG8gYmUgcHJvY2Vzc2VkLgorSWYgeW91J3JlIHNob3J0IG9uIHRpbWUsIHlvdSBjYW4gYWxzbyBlbWFpbCB5b3VyIGJ1ZyByZXBvcnQgdG8gZG9jc0BweXRob24ub3JnLgorJ2RvY3NAJyBpcyBhIG1haWxpbmcgbGlzdCBydW4gYnkgdm9sdW50ZWVyczsgeW91ciByZXF1ZXN0IHdpbGwgYmUgbm90aWNlZCwKK3Rob3VnaCBpdCBtYXkgdGFrZSBhIHdoaWxlIHRvIGJlIHByb2Nlc3NlZC4KIAotT2YgY291cnNlLCBpZiB5b3Ugd2FudCBhIG1vcmUgcGVyc2lzdGVudCByZWNvcmQgb2YgeW91ciBpc3N1ZSwgeW91IGNhbiB1c2UgdGhlCi1pc3N1ZSB0cmFja2VyIGZvciBkb2N1bWVudGF0aW9uIGJ1Z3MgYXMgd2VsbC4KKy4uIHNlZWFsc286OgorICAgYERvY3VtZW50YXRpb24gYnVnc2BfIG9uIHRoZSBQeXRob24gaXNzdWUgdHJhY2tlcgogCisuLiBfdXNpbmctdGhlLXRyYWNrZXI6CiAKIFVzaW5nIHRoZSBQeXRob24gaXNzdWUgdHJhY2tlcgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC01Nyw4ICs1OSw3IEBACiAKIEVhY2ggYnVnIHJlcG9ydCB3aWxsIGJlIGFzc2lnbmVkIHRvIGEgZGV2ZWxvcGVyIHdobyB3aWxsIGRldGVybWluZSB3aGF0IG5lZWRzIHRvCiBiZSBkb25lIHRvIGNvcnJlY3QgdGhlIHByb2JsZW0uICBZb3Ugd2lsbCByZWNlaXZlIGFuIHVwZGF0ZSBlYWNoIHRpbWUgYWN0aW9uIGlzCi10YWtlbiBvbiB0aGUgYnVnLiAgU2VlIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kZXYvd29ya2Zsb3cvIGZvciBhIGRldGFpbGVkCi1kZXNjcmlwdGlvbiBvZiB0aGUgaXNzdWUgd29ya2Zsb3cuCit0YWtlbiBvbiB0aGUgYnVnLgogCiAKIC4uIHNlZWFsc286OgpAQCAtNzEsMyArNzIsMTYgQEAKICAgICAgIEluZm9ybWF0aW9uIGFib3V0IHdyaXRpbmcgYSBnb29kIGJ1ZyByZXBvcnQuICBTb21lIG9mIHRoaXMgaXMgc3BlY2lmaWMgdG8gdGhlCiAgICAgICBNb3ppbGxhIHByb2plY3QsIGJ1dCBkZXNjcmliZXMgZ2VuZXJhbCBnb29kIHByYWN0aWNlcy4KIAorCitHZXR0aW5nIHN0YXJ0ZWQgY29udHJpYnV0aW5nIHRvIFB5dGhvbiB5b3Vyc2VsZgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQmV5b25kIGp1c3QgcmVwb3J0aW5nIGJ1Z3MgdGhhdCB5b3UgZmluZCwgeW91IGFyZSBhbHNvIHdlbGNvbWUgdG8gc3VibWl0CitwYXRjaGVzIHRvIGZpeCB0aGVtLiAgWW91IGNhbiBmaW5kIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGdldCBzdGFydGVkCitwYXRjaGluZyBQeXRob24gaW4gdGhlIGBQeXRob24gRGV2ZWxvcGVyJ3MgR3VpZGVgXy4gIElmIHlvdSBoYXZlIHF1ZXN0aW9ucywKK3RoZSBgY29yZS1tZW50b3JzaGlwIG1haWxpbmcgbGlzdGBfIGlzIGEgZnJpZW5kbHkgcGxhY2UgdG8gZ2V0IGFuc3dlcnMgdG8KK2FueSBhbmQgYWxsIHF1ZXN0aW9ucyBwZXJ0YWluaW5nIHRvIHRoZSBwcm9jZXNzIG9mIGZpeGluZyBpc3N1ZXMgaW4gUHl0aG9uLgorCisuLiBfRG9jdW1lbnRhdGlvbiBidWdzOiBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlP0BmaWx0ZXI9c3RhdHVzJkBmaWx0ZXI9Y29tcG9uZW50cyZjb21wb25lbnRzPTQmc3RhdHVzPTEmQGNvbHVtbnM9aWQsYWN0aXZpdHksdGl0bGUsc3RhdHVzJkBzb3J0PS1hY3Rpdml0eQorLi4gX1B5dGhvbiBEZXZlbG9wZXIncyBHdWlkZTogaHR0cDovL2RvY3MucHl0aG9uLm9yZy9kZXZndWlkZS8KKy4uIF9jb3JlLW1lbnRvcnNoaXAgbWFpbGluZyBsaXN0OiBodHRwczovL21haWwucHl0aG9uLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2NvcmUtbWVudG9yc2hpcC8KZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9hYnN0cmFjdC5yc3QgYi9Eb2MvYy1hcGkvYWJzdHJhY3QucnN0CmluZGV4IDU5ZTRjYzQuLmJjOTAwMWMgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS9hYnN0cmFjdC5yc3QKKysrIGIvRG9jL2MtYXBpL2Fic3RyYWN0LnJzdApAQCAtMTMsNyArMTMsNyBAQAogd2lsbCByYWlzZSBhIFB5dGhvbiBleGNlcHRpb24uCiAKIEl0IGlzIG5vdCBwb3NzaWJsZSB0byB1c2UgdGhlc2UgZnVuY3Rpb25zIG9uIG9iamVjdHMgdGhhdCBhcmUgbm90IHByb3Blcmx5Ci1pbml0aWFsaXplZCwgc3VjaCBhcyBhIGxpc3Qgb2JqZWN0IHRoYXQgaGFzIGJlZW4gY3JlYXRlZCBieSA6Y2Z1bmM6YFB5TGlzdF9OZXdgLAoraW5pdGlhbGl6ZWQsIHN1Y2ggYXMgYSBsaXN0IG9iamVjdCB0aGF0IGhhcyBiZWVuIGNyZWF0ZWQgYnkgOmM6ZnVuYzpgUHlMaXN0X05ld2AsCiBidXQgd2hvc2UgaXRlbXMgaGF2ZSBub3QgYmVlbiBzZXQgdG8gc29tZSBub24tXCBgYE5VTExgYCB2YWx1ZSB5ZXQuCiAKIC4uIHRvY3RyZWU6OgpkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL2FsbG9jYXRpb24ucnN0IGIvRG9jL2MtYXBpL2FsbG9jYXRpb24ucnN0CmluZGV4IDI4YjljNTYuLjMyYTQxNGIgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS9hbGxvY2F0aW9uLnJzdAorKysgYi9Eb2MvYy1hcGkvYWxsb2NhdGlvbi5yc3QKQEAgLTYsMjAgKzYsMjAgQEAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBfUHlPYmplY3RfTmV3KFB5VHlwZU9iamVjdCAqdHlwZSkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogX1B5T2JqZWN0X05ldyhQeVR5cGVPYmplY3QgKnR5cGUpCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlWYXJPYmplY3QqIF9QeU9iamVjdF9OZXdWYXIoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeV9zc2l6ZV90IHNpemUpCisuLiBjOmZ1bmN0aW9uOjogUHlWYXJPYmplY3QqIF9QeU9iamVjdF9OZXdWYXIoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeV9zc2l6ZV90IHNpemUpCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUgZm9yICpzaXplKi4gVGhpcyBtaWdodCByZXF1aXJlCisgICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmM6dHlwZTpgaW50YCB0eXBlIGZvciAqc2l6ZSouIFRoaXMgbWlnaHQgcmVxdWlyZQogICAgICAgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBfUHlPYmplY3RfRGVsKFB5T2JqZWN0ICpvcCkKKy4uIGM6ZnVuY3Rpb246OiB2b2lkIF9QeU9iamVjdF9EZWwoUHlPYmplY3QgKm9wKQogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU9iamVjdF9Jbml0KFB5T2JqZWN0ICpvcCwgUHlUeXBlT2JqZWN0ICp0eXBlKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU9iamVjdF9Jbml0KFB5T2JqZWN0ICpvcCwgUHlUeXBlT2JqZWN0ICp0eXBlKQogCiAgICBJbml0aWFsaXplIGEgbmV3bHktYWxsb2NhdGVkIG9iamVjdCAqb3AqIHdpdGggaXRzIHR5cGUgYW5kIGluaXRpYWwKICAgIHJlZmVyZW5jZS4gIFJldHVybnMgdGhlIGluaXRpYWxpemVkIG9iamVjdC4gIElmICp0eXBlKiBpbmRpY2F0ZXMgdGhhdCB0aGUKQEAgLTI4LDUxICsyOCw1MSBAQAogICAgYWZmZWN0ZWQuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlWYXJPYmplY3QqIFB5T2JqZWN0X0luaXRWYXIoUHlWYXJPYmplY3QgKm9wLCBQeVR5cGVPYmplY3QgKnR5cGUsIFB5X3NzaXplX3Qgc2l6ZSkKKy4uIGM6ZnVuY3Rpb246OiBQeVZhck9iamVjdCogUHlPYmplY3RfSW5pdFZhcihQeVZhck9iamVjdCAqb3AsIFB5VHlwZU9iamVjdCAqdHlwZSwgUHlfc3NpemVfdCBzaXplKQogCi0gICBUaGlzIGRvZXMgZXZlcnl0aGluZyA6Y2Z1bmM6YFB5T2JqZWN0X0luaXRgIGRvZXMsIGFuZCBhbHNvIGluaXRpYWxpemVzIHRoZQorICAgVGhpcyBkb2VzIGV2ZXJ5dGhpbmcgOmM6ZnVuYzpgUHlPYmplY3RfSW5pdGAgZG9lcywgYW5kIGFsc28gaW5pdGlhbGl6ZXMgdGhlCiAgICBsZW5ndGggaW5mb3JtYXRpb24gZm9yIGEgdmFyaWFibGUtc2l6ZSBvYmplY3QuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUgZm9yICpzaXplKi4gVGhpcyBtaWdodCByZXF1aXJlCisgICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmM6dHlwZTpgaW50YCB0eXBlIGZvciAqc2l6ZSouIFRoaXMgbWlnaHQgcmVxdWlyZQogICAgICAgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogVFlQRSogUHlPYmplY3RfTmV3KFRZUEUsIFB5VHlwZU9iamVjdCAqdHlwZSkKKy4uIGM6ZnVuY3Rpb246OiBUWVBFKiBQeU9iamVjdF9OZXcoVFlQRSwgUHlUeXBlT2JqZWN0ICp0eXBlKQogCiAgICBBbGxvY2F0ZSBhIG5ldyBQeXRob24gb2JqZWN0IHVzaW5nIHRoZSBDIHN0cnVjdHVyZSB0eXBlICpUWVBFKiBhbmQgdGhlCiAgICBQeXRob24gdHlwZSBvYmplY3QgKnR5cGUqLiAgRmllbGRzIG5vdCBkZWZpbmVkIGJ5IHRoZSBQeXRob24gb2JqZWN0IGhlYWRlcgogICAgYXJlIG5vdCBpbml0aWFsaXplZDsgdGhlIG9iamVjdCdzIHJlZmVyZW5jZSBjb3VudCB3aWxsIGJlIG9uZS4gIFRoZSBzaXplIG9mCi0gICB0aGUgbWVtb3J5IGFsbG9jYXRpb24gaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSA6YXR0cjpgdHBfYmFzaWNzaXplYCBmaWVsZCBvZgorICAgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIGlzIGRldGVybWluZWQgZnJvbSB0aGUgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2Jhc2ljc2l6ZWAgZmllbGQgb2YKICAgIHRoZSB0eXBlIG9iamVjdC4KIAogCi0uLiBjZnVuY3Rpb246OiBUWVBFKiBQeU9iamVjdF9OZXdWYXIoVFlQRSwgUHlUeXBlT2JqZWN0ICp0eXBlLCBQeV9zc2l6ZV90IHNpemUpCisuLiBjOmZ1bmN0aW9uOjogVFlQRSogUHlPYmplY3RfTmV3VmFyKFRZUEUsIFB5VHlwZU9iamVjdCAqdHlwZSwgUHlfc3NpemVfdCBzaXplKQogCiAgICBBbGxvY2F0ZSBhIG5ldyBQeXRob24gb2JqZWN0IHVzaW5nIHRoZSBDIHN0cnVjdHVyZSB0eXBlICpUWVBFKiBhbmQgdGhlCiAgICBQeXRob24gdHlwZSBvYmplY3QgKnR5cGUqLiAgRmllbGRzIG5vdCBkZWZpbmVkIGJ5IHRoZSBQeXRob24gb2JqZWN0IGhlYWRlcgogICAgYXJlIG5vdCBpbml0aWFsaXplZC4gIFRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFsbG93cyBmb3IgdGhlICpUWVBFKiBzdHJ1Y3R1cmUKLSAgIHBsdXMgKnNpemUqIGZpZWxkcyBvZiB0aGUgc2l6ZSBnaXZlbiBieSB0aGUgOmF0dHI6YHRwX2l0ZW1zaXplYCBmaWVsZCBvZgorICAgcGx1cyAqc2l6ZSogZmllbGRzIG9mIHRoZSBzaXplIGdpdmVuIGJ5IHRoZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfaXRlbXNpemVgIGZpZWxkIG9mCiAgICAqdHlwZSouICBUaGlzIGlzIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIG9iamVjdHMgbGlrZSB0dXBsZXMsIHdoaWNoIGFyZQogICAgYWJsZSB0byBkZXRlcm1pbmUgdGhlaXIgc2l6ZSBhdCBjb25zdHJ1Y3Rpb24gdGltZS4gIEVtYmVkZGluZyB0aGUgYXJyYXkgb2YKICAgIGZpZWxkcyBpbnRvIHRoZSBzYW1lIGFsbG9jYXRpb24gZGVjcmVhc2VzIHRoZSBudW1iZXIgb2YgYWxsb2NhdGlvbnMsCiAgICBpbXByb3ZpbmcgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IGVmZmljaWVuY3kuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUgZm9yICpzaXplKi4gVGhpcyBtaWdodCByZXF1aXJlCisgICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmM6dHlwZTpgaW50YCB0eXBlIGZvciAqc2l6ZSouIFRoaXMgbWlnaHQgcmVxdWlyZQogICAgICAgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBQeU9iamVjdF9EZWwoUHlPYmplY3QgKm9wKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlPYmplY3RfRGVsKFB5T2JqZWN0ICpvcCkKIAotICAgUmVsZWFzZXMgbWVtb3J5IGFsbG9jYXRlZCB0byBhbiBvYmplY3QgdXNpbmcgOmNmdW5jOmBQeU9iamVjdF9OZXdgIG9yCi0gICA6Y2Z1bmM6YFB5T2JqZWN0X05ld1ZhcmAuICBUaGlzIGlzIG5vcm1hbGx5IGNhbGxlZCBmcm9tIHRoZQotICAgOmF0dHI6YHRwX2RlYWxsb2NgIGhhbmRsZXIgc3BlY2lmaWVkIGluIHRoZSBvYmplY3QncyB0eXBlLiAgVGhlIGZpZWxkcyBvZgorICAgUmVsZWFzZXMgbWVtb3J5IGFsbG9jYXRlZCB0byBhbiBvYmplY3QgdXNpbmcgOmM6ZnVuYzpgUHlPYmplY3RfTmV3YCBvcgorICAgOmM6ZnVuYzpgUHlPYmplY3RfTmV3VmFyYC4gIFRoaXMgaXMgbm9ybWFsbHkgY2FsbGVkIGZyb20gdGhlCisgICA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfZGVhbGxvY2AgaGFuZGxlciBzcGVjaWZpZWQgaW4gdGhlIG9iamVjdCdzIHR5cGUuICBUaGUgZmllbGRzIG9mCiAgICB0aGUgb2JqZWN0IHNob3VsZCBub3QgYmUgYWNjZXNzZWQgYWZ0ZXIgdGhpcyBjYWxsIGFzIHRoZSBtZW1vcnkgaXMgbm8KICAgIGxvbmdlciBhIHZhbGlkIFB5dGhvbiBvYmplY3QuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5X0luaXRNb2R1bGUoY2hhciAqbmFtZSwgUHlNZXRob2REZWYgKm1ldGhvZHMpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5X0luaXRNb2R1bGUoY2hhciAqbmFtZSwgUHlNZXRob2REZWYgKm1ldGhvZHMpCiAKICAgIENyZWF0ZSBhIG5ldyBtb2R1bGUgb2JqZWN0IGJhc2VkIG9uIGEgbmFtZSBhbmQgdGFibGUgb2YgZnVuY3Rpb25zLAogICAgcmV0dXJuaW5nIHRoZSBuZXcgbW9kdWxlIG9iamVjdC4KQEAgLTgyLDcgKzgyLDcgQEAKICAgICAgICptZXRob2RzKiBhcmd1bWVudC4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlfSW5pdE1vZHVsZTMoY2hhciAqbmFtZSwgUHlNZXRob2REZWYgKm1ldGhvZHMsIGNoYXIgKmRvYykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlfSW5pdE1vZHVsZTMoY2hhciAqbmFtZSwgUHlNZXRob2REZWYgKm1ldGhvZHMsIGNoYXIgKmRvYykKIAogICAgQ3JlYXRlIGEgbmV3IG1vZHVsZSBvYmplY3QgYmFzZWQgb24gYSBuYW1lIGFuZCB0YWJsZSBvZiBmdW5jdGlvbnMsCiAgICByZXR1cm5pbmcgdGhlIG5ldyBtb2R1bGUgb2JqZWN0LiAgSWYgKmRvYyogaXMgbm9uLSpOVUxMKiwgaXQgd2lsbCBiZSB1c2VkCkBAIC05Myw3ICs5Myw3IEBACiAgICAgICAqbWV0aG9kcyogYXJndW1lbnQuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5X0luaXRNb2R1bGU0KGNoYXIgKm5hbWUsIFB5TWV0aG9kRGVmICptZXRob2RzLCBjaGFyICpkb2MsIFB5T2JqZWN0ICpzZWxmLCBpbnQgYXBpdmVyKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeV9Jbml0TW9kdWxlNChjaGFyICpuYW1lLCBQeU1ldGhvZERlZiAqbWV0aG9kcywgY2hhciAqZG9jLCBQeU9iamVjdCAqc2VsZiwgaW50IGFwaXZlcikKIAogICAgQ3JlYXRlIGEgbmV3IG1vZHVsZSBvYmplY3QgYmFzZWQgb24gYSBuYW1lIGFuZCB0YWJsZSBvZiBmdW5jdGlvbnMsCiAgICByZXR1cm5pbmcgdGhlIG5ldyBtb2R1bGUgb2JqZWN0LiAgSWYgKmRvYyogaXMgbm9uLSpOVUxMKiwgaXQgd2lsbCBiZSB1c2VkCkBAIC0xMDcsNyArMTA3LDcgQEAKICAgIC4uIG5vdGU6OgogCiAgICAgICBNb3N0IHVzZXMgb2YgdGhpcyBmdW5jdGlvbiBzaG91bGQgcHJvYmFibHkgYmUgdXNpbmcgdGhlCi0gICAgICA6Y2Z1bmM6YFB5X0luaXRNb2R1bGUzYCBpbnN0ZWFkOyBvbmx5IHVzZSB0aGlzIGlmIHlvdSBhcmUgc3VyZSB5b3UgbmVlZAorICAgICAgOmM6ZnVuYzpgUHlfSW5pdE1vZHVsZTNgIGluc3RlYWQ7IG9ubHkgdXNlIHRoaXMgaWYgeW91IGFyZSBzdXJlIHlvdSBuZWVkCiAgICAgICBpdC4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjMKQEAgLTExNSw3ICsxMTUsNyBAQAogICAgICAgKm1ldGhvZHMqIGFyZ3VtZW50LgogCiAKLS4uIGN2YXI6OiBQeU9iamVjdCBfUHlfTm9uZVN0cnVjdAorLi4gYzp2YXI6OiBQeU9iamVjdCBfUHlfTm9uZVN0cnVjdAogCiAgICBPYmplY3Qgd2hpY2ggaXMgdmlzaWJsZSBpbiBQeXRob24gYXMgYGBOb25lYGAuICBUaGlzIHNob3VsZCBvbmx5IGJlCiAgICBhY2Nlc3NlZCB1c2luZyB0aGUgYGBQeV9Ob25lYGAgbWFjcm8sIHdoaWNoIGV2YWx1YXRlcyB0byBhIHBvaW50ZXIgdG8gdGhpcwpkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL2FyZy5yc3QgYi9Eb2MvYy1hcGkvYXJnLnJzdAppbmRleCA2NTk5ZDgyLi44ZmJkYzUwIDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvYXJnLnJzdAorKysgYi9Eb2MvYy1hcGkvYXJnLnJzdApAQCAtOSw4ICs5LDggQEAKIG1ldGhvZHMuICBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFuZCBleGFtcGxlcyBhcmUgYXZhaWxhYmxlIGluCiA6cmVmOmBleHRlbmRpbmctaW5kZXhgLgogCi1UaGUgZmlyc3QgdGhyZWUgb2YgdGhlc2UgZnVuY3Rpb25zIGRlc2NyaWJlZCwgOmNmdW5jOmBQeUFyZ19QYXJzZVR1cGxlYCwKLTpjZnVuYzpgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzYCwgYW5kIDpjZnVuYzpgUHlBcmdfUGFyc2VgLCBhbGwgdXNlCitUaGUgZmlyc3QgdGhyZWUgb2YgdGhlc2UgZnVuY3Rpb25zIGRlc2NyaWJlZCwgOmM6ZnVuYzpgUHlBcmdfUGFyc2VUdXBsZWAsCis6YzpmdW5jOmBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNgLCBhbmQgOmM6ZnVuYzpgUHlBcmdfUGFyc2VgLCBhbGwgdXNlCiAqZm9ybWF0IHN0cmluZ3MqIHdoaWNoIGFyZSB1c2VkIHRvIHRlbGwgdGhlIGZ1bmN0aW9uIGFib3V0IHRoZSBleHBlY3RlZAogYXJndW1lbnRzLiAgVGhlIGZvcm1hdCBzdHJpbmdzIHVzZSB0aGUgc2FtZSBzeW50YXggZm9yIGVhY2ggb2YgdGhlc2UKIGZ1bmN0aW9ucy4KQEAgLTI0LDYgKzI0LDExIEBACiB0aGF0IG1hdGNoZXMgdGhlIGZvcm1hdCB1bml0OyBhbmQgdGhlIGVudHJ5IGluIFtzcXVhcmVdIGJyYWNrZXRzIGlzIHRoZSB0eXBlCiBvZiB0aGUgQyB2YXJpYWJsZShzKSB3aG9zZSBhZGRyZXNzIHNob3VsZCBiZSBwYXNzZWQuCiAKK1RoZXNlIGZvcm1hdHMgYWxsb3cgdG8gYWNjZXNzIGFuIG9iamVjdCBhcyBhIGNvbnRpZ3VvdXMgY2h1bmsgb2YgbWVtb3J5LgorWW91IGRvbid0IGhhdmUgdG8gcHJvdmlkZSByYXcgc3RvcmFnZSBmb3IgdGhlIHJldHVybmVkIHVuaWNvZGUgb3IgYnl0ZXMKK2FyZWEuICBBbHNvLCB5b3Ugd29uJ3QgaGF2ZSB0byByZWxlYXNlIGFueSBtZW1vcnkgeW91cnNlbGYsIGV4Y2VwdCB3aXRoIHRoZQorYGBlc2BgLCBgYGVzI2BgLCBgYGV0YGAgYW5kIGBgZXQjYGAgZm9ybWF0cy4KKwogYGBzYGAgKHN0cmluZyBvciBVbmljb2RlKSBbY29uc3QgY2hhciBcKl0KICAgIENvbnZlcnQgYSBQeXRob24gc3RyaW5nIG9yIFVuaWNvZGUgb2JqZWN0IHRvIGEgQyBwb2ludGVyIHRvIGEgY2hhcmFjdGVyCiAgICBzdHJpbmcuICBZb3UgbXVzdCBub3QgcHJvdmlkZSBzdG9yYWdlIGZvciB0aGUgc3RyaW5nIGl0c2VsZjsgYSBwb2ludGVyIHRvCkBAIC0zMyw3ICszOCw3IEBACiAgICByYWlzZWQuIFVuaWNvZGUgb2JqZWN0cyBhcmUgY29udmVydGVkIHRvIEMgc3RyaW5ncyB1c2luZyB0aGUgZGVmYXVsdAogICAgZW5jb2RpbmcuICBJZiB0aGlzIGNvbnZlcnNpb24gZmFpbHMsIGEgOmV4YzpgVW5pY29kZUVycm9yYCBpcyByYWlzZWQuCiAKLWBgcyNgYCAoc3RyaW5nLCBVbmljb2RlIG9yIGFueSByZWFkIGJ1ZmZlciBjb21wYXRpYmxlIG9iamVjdCkgW2NvbnN0IGNoYXIgXCosIGludCAob3IgOmN0eXBlOmBQeV9zc2l6ZV90YCwgc2VlIGJlbG93KV0KK2BgcyNgYCAoc3RyaW5nLCBVbmljb2RlIG9yIGFueSByZWFkIGJ1ZmZlciBjb21wYXRpYmxlIG9iamVjdCkgW2NvbnN0IGNoYXIgXCosIGludCAob3IgOmM6dHlwZTpgUHlfc3NpemVfdGAsIHNlZSBiZWxvdyldCiAgICBUaGlzIHZhcmlhbnQgb24gYGBzYGAgc3RvcmVzIGludG8gdHdvIEMgdmFyaWFibGVzLCB0aGUgZmlyc3Qgb25lIGEgcG9pbnRlcgogICAgdG8gYSBjaGFyYWN0ZXIgc3RyaW5nLCB0aGUgc2Vjb25kIG9uZSBpdHMgbGVuZ3RoLiAgSW4gdGhpcyBjYXNlIHRoZSBQeXRob24KICAgIHN0cmluZyBtYXkgY29udGFpbiBlbWJlZGRlZCBudWxsIGJ5dGVzLiAgVW5pY29kZSBvYmplY3RzIHBhc3MgYmFjayBhCkBAIC00Miw4ICs0Nyw4IEBACiAgICBhIHJlZmVyZW5jZSB0byB0aGUgcmF3IGludGVybmFsIGRhdGEgcmVwcmVzZW50YXRpb24uCiAKICAgIFN0YXJ0aW5nIHdpdGggUHl0aG9uIDIuNSB0aGUgdHlwZSBvZiB0aGUgbGVuZ3RoIGFyZ3VtZW50IGNhbiBiZSBjb250cm9sbGVkCi0gICBieSBkZWZpbmluZyB0aGUgbWFjcm8gOmNtYWNybzpgUFlfU1NJWkVfVF9DTEVBTmAgYmVmb3JlIGluY2x1ZGluZwotICAgOmZpbGU6YFB5dGhvbi5oYC4gIElmIHRoZSBtYWNybyBpcyBkZWZpbmVkLCBsZW5ndGggaXMgYSA6Y3R5cGU6YFB5X3NzaXplX3RgCisgICBieSBkZWZpbmluZyB0aGUgbWFjcm8gOmM6bWFjcm86YFBZX1NTSVpFX1RfQ0xFQU5gIGJlZm9yZSBpbmNsdWRpbmcKKyAgIDpmaWxlOmBQeXRob24uaGAuICBJZiB0aGUgbWFjcm8gaXMgZGVmaW5lZCwgbGVuZ3RoIGlzIGEgOmM6dHlwZTpgUHlfc3NpemVfdGAKICAgIHJhdGhlciB0aGFuIGFuIGludC4KIAogYGBzKmBgIChzdHJpbmcsIFVuaWNvZGUsIG9yIGFueSBidWZmZXIgY29tcGF0aWJsZSBvYmplY3QpIFtQeV9idWZmZXJdCkBAIC03MSwxNCArNzYsMTQgQEAKICAgIENvbnZlcnQgYSBQeXRob24gVW5pY29kZSBvYmplY3QgdG8gYSBDIHBvaW50ZXIgdG8gYSBOVUwtdGVybWluYXRlZCBidWZmZXIKICAgIG9mIDE2LWJpdCBVbmljb2RlIChVVEYtMTYpIGRhdGEuICBBcyB3aXRoIGBgc2BgLCB0aGVyZSBpcyBubyBuZWVkIHRvCiAgICBwcm92aWRlIHN0b3JhZ2UgZm9yIHRoZSBVbmljb2RlIGRhdGEgYnVmZmVyOyBhIHBvaW50ZXIgdG8gdGhlIGV4aXN0aW5nCi0gICBVbmljb2RlIGRhdGEgaXMgc3RvcmVkIGludG8gdGhlIDpjdHlwZTpgUHlfVU5JQ09ERWAgcG9pbnRlciB2YXJpYWJsZSB3aG9zZQorICAgVW5pY29kZSBkYXRhIGlzIHN0b3JlZCBpbnRvIHRoZSA6Yzp0eXBlOmBQeV9VTklDT0RFYCBwb2ludGVyIHZhcmlhYmxlIHdob3NlCiAgICBhZGRyZXNzIHlvdSBwYXNzLgogCiBgYHUjYGAgKFVuaWNvZGUpIFtQeV9VTklDT0RFIFwqLCBpbnRdCiAgICBUaGlzIHZhcmlhbnQgb24gYGB1YGAgc3RvcmVzIGludG8gdHdvIEMgdmFyaWFibGVzLCB0aGUgZmlyc3Qgb25lIGEgcG9pbnRlcgogICAgdG8gYSBVbmljb2RlIGRhdGEgYnVmZmVyLCB0aGUgc2Vjb25kIG9uZSBpdHMgbGVuZ3RoLiBOb24tVW5pY29kZSBvYmplY3RzCiAgICBhcmUgaGFuZGxlZCBieSBpbnRlcnByZXRpbmcgdGhlaXIgcmVhZC1idWZmZXIgcG9pbnRlciBhcyBwb2ludGVyIHRvIGEKLSAgIDpjdHlwZTpgUHlfVU5JQ09ERWAgYXJyYXkuCisgICA6Yzp0eXBlOmBQeV9VTklDT0RFYCBhcnJheS4KIAogYGBlc2BgIChzdHJpbmcsIFVuaWNvZGUgb3IgY2hhcmFjdGVyIGJ1ZmZlciBjb21wYXRpYmxlIG9iamVjdCkgW2NvbnN0IGNoYXIgXCplbmNvZGluZywgY2hhciBcKlwqYnVmZmVyXQogICAgVGhpcyB2YXJpYW50IG9uIGBgc2BgIGlzIHVzZWQgZm9yIGVuY29kaW5nIFVuaWNvZGUgYW5kIG9iamVjdHMgY29udmVydGlibGUKQEAgLTg2LDE4ICs5MSwxOCBAQAogICAgZW1iZWRkZWQgTlVMIGJ5dGVzLgogCiAgICBUaGlzIGZvcm1hdCByZXF1aXJlcyB0d28gYXJndW1lbnRzLiAgVGhlIGZpcnN0IGlzIG9ubHkgdXNlZCBhcyBpbnB1dCwgYW5kCi0gICBtdXN0IGJlIGEgOmN0eXBlOmBjb25zdCBjaGFyXCpgIHdoaWNoIHBvaW50cyB0byB0aGUgbmFtZSBvZiBhbiBlbmNvZGluZyBhcworICAgbXVzdCBiZSBhIDpjOnR5cGU6YGNvbnN0IGNoYXJcKmAgd2hpY2ggcG9pbnRzIHRvIHRoZSBuYW1lIG9mIGFuIGVuY29kaW5nIGFzCiAgICBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZywgb3IgKk5VTEwqLCBpbiB3aGljaCBjYXNlIHRoZSBkZWZhdWx0IGVuY29kaW5nIGlzCiAgICB1c2VkLiAgQW4gZXhjZXB0aW9uIGlzIHJhaXNlZCBpZiB0aGUgbmFtZWQgZW5jb2RpbmcgaXMgbm90IGtub3duIHRvIFB5dGhvbi4KLSAgIFRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIDpjdHlwZTpgY2hhclwqXCpgOyB0aGUgdmFsdWUgb2YgdGhlIHBvaW50ZXIKKyAgIFRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIDpjOnR5cGU6YGNoYXJcKlwqYDsgdGhlIHZhbHVlIG9mIHRoZSBwb2ludGVyCiAgICBpdCByZWZlcmVuY2VzIHdpbGwgYmUgc2V0IHRvIGEgYnVmZmVyIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZSBhcmd1bWVudAogICAgdGV4dC4gIFRoZSB0ZXh0IHdpbGwgYmUgZW5jb2RlZCBpbiB0aGUgZW5jb2Rpbmcgc3BlY2lmaWVkIGJ5IHRoZSBmaXJzdAogICAgYXJndW1lbnQuCiAKLSAgIDpjZnVuYzpgUHlBcmdfUGFyc2VUdXBsZWAgd2lsbCBhbGxvY2F0ZSBhIGJ1ZmZlciBvZiB0aGUgbmVlZGVkIHNpemUsIGNvcHkKKyAgIDpjOmZ1bmM6YFB5QXJnX1BhcnNlVHVwbGVgIHdpbGwgYWxsb2NhdGUgYSBidWZmZXIgb2YgdGhlIG5lZWRlZCBzaXplLCBjb3B5CiAgICB0aGUgZW5jb2RlZCBkYXRhIGludG8gdGhpcyBidWZmZXIgYW5kIGFkanVzdCAqXCpidWZmZXIqIHRvIHJlZmVyZW5jZSB0aGUKICAgIG5ld2x5IGFsbG9jYXRlZCBzdG9yYWdlLiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZwotICAgOmNmdW5jOmBQeU1lbV9GcmVlYCB0byBmcmVlIHRoZSBhbGxvY2F0ZWQgYnVmZmVyIGFmdGVyIHVzZS4KKyAgIDpjOmZ1bmM6YFB5TWVtX0ZyZWVgIHRvIGZyZWUgdGhlIGFsbG9jYXRlZCBidWZmZXIgYWZ0ZXIgdXNlLgogCiBgYGV0YGAgKHN0cmluZywgVW5pY29kZSBvciBjaGFyYWN0ZXIgYnVmZmVyIGNvbXBhdGlibGUgb2JqZWN0KSBbY29uc3QgY2hhciBcKmVuY29kaW5nLCBjaGFyIFwqXCpidWZmZXJdCiAgICBTYW1lIGFzIGBgZXNgYCBleGNlcHQgdGhhdCA4LWJpdCBzdHJpbmcgb2JqZWN0cyBhcmUgcGFzc2VkIHRocm91Z2ggd2l0aG91dApAQCAtMTEwLDEwICsxMTUsMTAgQEAKICAgIGFsbG93cyBpbnB1dCBkYXRhIHdoaWNoIGNvbnRhaW5zIE5VTCBjaGFyYWN0ZXJzLgogCiAgICBJdCByZXF1aXJlcyB0aHJlZSBhcmd1bWVudHMuICBUaGUgZmlyc3QgaXMgb25seSB1c2VkIGFzIGlucHV0LCBhbmQgbXVzdCBiZQotICAgYSA6Y3R5cGU6YGNvbnN0IGNoYXJcKmAgd2hpY2ggcG9pbnRzIHRvIHRoZSBuYW1lIG9mIGFuIGVuY29kaW5nIGFzIGEKKyAgIGEgOmM6dHlwZTpgY29uc3QgY2hhclwqYCB3aGljaCBwb2ludHMgdG8gdGhlIG5hbWUgb2YgYW4gZW5jb2RpbmcgYXMgYQogICAgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nLCBvciAqTlVMTCosIGluIHdoaWNoIGNhc2UgdGhlIGRlZmF1bHQgZW5jb2RpbmcgaXMKICAgIHVzZWQuICBBbiBleGNlcHRpb24gaXMgcmFpc2VkIGlmIHRoZSBuYW1lZCBlbmNvZGluZyBpcyBub3Qga25vd24gdG8gUHl0aG9uLgotICAgVGhlIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgOmN0eXBlOmBjaGFyXCpcKmA7IHRoZSB2YWx1ZSBvZiB0aGUgcG9pbnRlcgorICAgVGhlIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgOmM6dHlwZTpgY2hhclwqXCpgOyB0aGUgdmFsdWUgb2YgdGhlIHBvaW50ZXIKICAgIGl0IHJlZmVyZW5jZXMgd2lsbCBiZSBzZXQgdG8gYSBidWZmZXIgd2l0aCB0aGUgY29udGVudHMgb2YgdGhlIGFyZ3VtZW50CiAgICB0ZXh0LiAgVGhlIHRleHQgd2lsbCBiZSBlbmNvZGVkIGluIHRoZSBlbmNvZGluZyBzcGVjaWZpZWQgYnkgdGhlIGZpcnN0CiAgICBhcmd1bWVudC4gIFRoZSB0aGlyZCBhcmd1bWVudCBtdXN0IGJlIGEgcG9pbnRlciB0byBhbiBpbnRlZ2VyOyB0aGUKQEAgLTEyNCwxMSArMTI5LDExIEBACiAgICBJZiAqXCpidWZmZXIqIHBvaW50cyBhICpOVUxMKiBwb2ludGVyLCB0aGUgZnVuY3Rpb24gd2lsbCBhbGxvY2F0ZSBhIGJ1ZmZlcgogICAgb2YgdGhlIG5lZWRlZCBzaXplLCBjb3B5IHRoZSBlbmNvZGVkIGRhdGEgaW50byB0aGlzIGJ1ZmZlciBhbmQgc2V0CiAgICAqXCpidWZmZXIqIHRvIHJlZmVyZW5jZSB0aGUgbmV3bHkgYWxsb2NhdGVkIHN0b3JhZ2UuICBUaGUgY2FsbGVyIGlzCi0gICByZXNwb25zaWJsZSBmb3IgY2FsbGluZyA6Y2Z1bmM6YFB5TWVtX0ZyZWVgIHRvIGZyZWUgdGhlIGFsbG9jYXRlZCBidWZmZXIKKyAgIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIDpjOmZ1bmM6YFB5TWVtX0ZyZWVgIHRvIGZyZWUgdGhlIGFsbG9jYXRlZCBidWZmZXIKICAgIGFmdGVyIHVzYWdlLgogCiAgICBJZiAqXCpidWZmZXIqIHBvaW50cyB0byBhIG5vbi0qTlVMTCogcG9pbnRlciAoYW4gYWxyZWFkeSBhbGxvY2F0ZWQgYnVmZmVyKSwKLSAgIDpjZnVuYzpgUHlBcmdfUGFyc2VUdXBsZWAgd2lsbCB1c2UgdGhpcyBsb2NhdGlvbiBhcyB0aGUgYnVmZmVyIGFuZAorICAgOmM6ZnVuYzpgUHlBcmdfUGFyc2VUdXBsZWAgd2lsbCB1c2UgdGhpcyBsb2NhdGlvbiBhcyB0aGUgYnVmZmVyIGFuZAogICAgaW50ZXJwcmV0IHRoZSBpbml0aWFsIHZhbHVlIG9mICpcKmJ1ZmZlcl9sZW5ndGgqIGFzIHRoZSBidWZmZXIgc2l6ZS4gIEl0CiAgICB3aWxsIHRoZW4gY29weSB0aGUgZW5jb2RlZCBkYXRhIGludG8gdGhlIGJ1ZmZlciBhbmQgTlVMLXRlcm1pbmF0ZSBpdC4gIElmCiAgICB0aGUgYnVmZmVyIGlzIG5vdCBsYXJnZSBlbm91Z2gsIGEgOmV4YzpgVmFsdWVFcnJvcmAgd2lsbCBiZSBzZXQuCkBAIC0xNDMsNzEgKzE0OCw3MSBAQAogCiBgYGJgYCAoaW50ZWdlcikgW3Vuc2lnbmVkIGNoYXJdCiAgICBDb252ZXJ0IGEgbm9ubmVnYXRpdmUgUHl0aG9uIGludGVnZXIgdG8gYW4gdW5zaWduZWQgdGlueSBpbnQsIHN0b3JlZCBpbiBhIEMKLSAgIDpjdHlwZTpgdW5zaWduZWQgY2hhcmAuCisgICA6Yzp0eXBlOmB1bnNpZ25lZCBjaGFyYC4KIAogYGBCYGAgKGludGVnZXIpIFt1bnNpZ25lZCBjaGFyXQogICAgQ29udmVydCBhIFB5dGhvbiBpbnRlZ2VyIHRvIGEgdGlueSBpbnQgd2l0aG91dCBvdmVyZmxvdyBjaGVja2luZywgc3RvcmVkIGluCi0gICBhIEMgOmN0eXBlOmB1bnNpZ25lZCBjaGFyYC4KKyAgIGEgQyA6Yzp0eXBlOmB1bnNpZ25lZCBjaGFyYC4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4zCiAKIGBgaGBgIChpbnRlZ2VyKSBbc2hvcnQgaW50XQotICAgQ29udmVydCBhIFB5dGhvbiBpbnRlZ2VyIHRvIGEgQyA6Y3R5cGU6YHNob3J0IGludGAuCisgICBDb252ZXJ0IGEgUHl0aG9uIGludGVnZXIgdG8gYSBDIDpjOnR5cGU6YHNob3J0IGludGAuCiAKIGBgSGBgIChpbnRlZ2VyKSBbdW5zaWduZWQgc2hvcnQgaW50XQotICAgQ29udmVydCBhIFB5dGhvbiBpbnRlZ2VyIHRvIGEgQyA6Y3R5cGU6YHVuc2lnbmVkIHNob3J0IGludGAsIHdpdGhvdXQKKyAgIENvbnZlcnQgYSBQeXRob24gaW50ZWdlciB0byBhIEMgOmM6dHlwZTpgdW5zaWduZWQgc2hvcnQgaW50YCwgd2l0aG91dAogICAgb3ZlcmZsb3cgY2hlY2tpbmcuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMwogCiBgYGlgYCAoaW50ZWdlcikgW2ludF0KLSAgIENvbnZlcnQgYSBQeXRob24gaW50ZWdlciB0byBhIHBsYWluIEMgOmN0eXBlOmBpbnRgLgorICAgQ29udmVydCBhIFB5dGhvbiBpbnRlZ2VyIHRvIGEgcGxhaW4gQyA6Yzp0eXBlOmBpbnRgLgogCiBgYElgYCAoaW50ZWdlcikgW3Vuc2lnbmVkIGludF0KLSAgIENvbnZlcnQgYSBQeXRob24gaW50ZWdlciB0byBhIEMgOmN0eXBlOmB1bnNpZ25lZCBpbnRgLCB3aXRob3V0IG92ZXJmbG93CisgICBDb252ZXJ0IGEgUHl0aG9uIGludGVnZXIgdG8gYSBDIDpjOnR5cGU6YHVuc2lnbmVkIGludGAsIHdpdGhvdXQgb3ZlcmZsb3cKICAgIGNoZWNraW5nLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjMKIAogYGBsYGAgKGludGVnZXIpIFtsb25nIGludF0KLSAgIENvbnZlcnQgYSBQeXRob24gaW50ZWdlciB0byBhIEMgOmN0eXBlOmBsb25nIGludGAuCisgICBDb252ZXJ0IGEgUHl0aG9uIGludGVnZXIgdG8gYSBDIDpjOnR5cGU6YGxvbmcgaW50YC4KIAogYGBrYGAgKGludGVnZXIpIFt1bnNpZ25lZCBsb25nXQotICAgQ29udmVydCBhIFB5dGhvbiBpbnRlZ2VyIG9yIGxvbmcgaW50ZWdlciB0byBhIEMgOmN0eXBlOmB1bnNpZ25lZCBsb25nYAorICAgQ29udmVydCBhIFB5dGhvbiBpbnRlZ2VyIG9yIGxvbmcgaW50ZWdlciB0byBhIEMgOmM6dHlwZTpgdW5zaWduZWQgbG9uZ2AKICAgIHdpdGhvdXQgb3ZlcmZsb3cgY2hlY2tpbmcuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMwogCiBgYExgYCAoaW50ZWdlcikgW1BZX0xPTkdfTE9OR10KLSAgIENvbnZlcnQgYSBQeXRob24gaW50ZWdlciB0byBhIEMgOmN0eXBlOmBsb25nIGxvbmdgLiAgVGhpcyBmb3JtYXQgaXMgb25seQotICAgYXZhaWxhYmxlIG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgOmN0eXBlOmBsb25nIGxvbmdgIChvciA6Y3R5cGU6YF9pbnQ2NGAKKyAgIENvbnZlcnQgYSBQeXRob24gaW50ZWdlciB0byBhIEMgOmM6dHlwZTpgbG9uZyBsb25nYC4gIFRoaXMgZm9ybWF0IGlzIG9ubHkKKyAgIGF2YWlsYWJsZSBvbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IDpjOnR5cGU6YGxvbmcgbG9uZ2AgKG9yIDpjOnR5cGU6YF9pbnQ2NGAKICAgIG9uIFdpbmRvd3MpLgogCiBgYEtgYCAoaW50ZWdlcikgW3Vuc2lnbmVkIFBZX0xPTkdfTE9OR10KLSAgIENvbnZlcnQgYSBQeXRob24gaW50ZWdlciBvciBsb25nIGludGVnZXIgdG8gYSBDIDpjdHlwZTpgdW5zaWduZWQgbG9uZyBsb25nYAorICAgQ29udmVydCBhIFB5dGhvbiBpbnRlZ2VyIG9yIGxvbmcgaW50ZWdlciB0byBhIEMgOmM6dHlwZTpgdW5zaWduZWQgbG9uZyBsb25nYAogICAgd2l0aG91dCBvdmVyZmxvdyBjaGVja2luZy4gIFRoaXMgZm9ybWF0IGlzIG9ubHkgYXZhaWxhYmxlIG9uIHBsYXRmb3JtcyB0aGF0Ci0gICBzdXBwb3J0IDpjdHlwZTpgdW5zaWduZWQgbG9uZyBsb25nYCAob3IgOmN0eXBlOmB1bnNpZ25lZCBfaW50NjRgIG9uCisgICBzdXBwb3J0IDpjOnR5cGU6YHVuc2lnbmVkIGxvbmcgbG9uZ2AgKG9yIDpjOnR5cGU6YHVuc2lnbmVkIF9pbnQ2NGAgb24KICAgIFdpbmRvd3MpLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjMKIAogYGBuYGAgKGludGVnZXIpIFtQeV9zc2l6ZV90XQotICAgQ29udmVydCBhIFB5dGhvbiBpbnRlZ2VyIG9yIGxvbmcgaW50ZWdlciB0byBhIEMgOmN0eXBlOmBQeV9zc2l6ZV90YC4KKyAgIENvbnZlcnQgYSBQeXRob24gaW50ZWdlciBvciBsb25nIGludGVnZXIgdG8gYSBDIDpjOnR5cGU6YFB5X3NzaXplX3RgLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjUKIAogYGBjYGAgKHN0cmluZyBvZiBsZW5ndGggMSkgW2NoYXJdCiAgICBDb252ZXJ0IGEgUHl0aG9uIGNoYXJhY3RlciwgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcgb2YgbGVuZ3RoIDEsIHRvIGEgQwotICAgOmN0eXBlOmBjaGFyYC4KKyAgIDpjOnR5cGU6YGNoYXJgLgogCiBgYGZgYCAoZmxvYXQpIFtmbG9hdF0KLSAgIENvbnZlcnQgYSBQeXRob24gZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHRvIGEgQyA6Y3R5cGU6YGZsb2F0YC4KKyAgIENvbnZlcnQgYSBQeXRob24gZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHRvIGEgQyA6Yzp0eXBlOmBmbG9hdGAuCiAKIGBgZGBgIChmbG9hdCkgW2RvdWJsZV0KLSAgIENvbnZlcnQgYSBQeXRob24gZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHRvIGEgQyA6Y3R5cGU6YGRvdWJsZWAuCisgICBDb252ZXJ0IGEgUHl0aG9uIGZsb2F0aW5nIHBvaW50IG51bWJlciB0byBhIEMgOmM6dHlwZTpgZG91YmxlYC4KIAogYGBEYGAgKGNvbXBsZXgpIFtQeV9jb21wbGV4XQotICAgQ29udmVydCBhIFB5dGhvbiBjb21wbGV4IG51bWJlciB0byBhIEMgOmN0eXBlOmBQeV9jb21wbGV4YCBzdHJ1Y3R1cmUuCisgICBDb252ZXJ0IGEgUHl0aG9uIGNvbXBsZXggbnVtYmVyIHRvIGEgQyA6Yzp0eXBlOmBQeV9jb21wbGV4YCBzdHJ1Y3R1cmUuCiAKIGBgT2BgIChvYmplY3QpIFtQeU9iamVjdCBcKl0KICAgIFN0b3JlIGEgUHl0aG9uIG9iamVjdCAod2l0aG91dCBhbnkgY29udmVyc2lvbikgaW4gYSBDIG9iamVjdCBwb2ludGVyLiAgVGhlCkBAIC0yMTcsMjAgKzIyMiwyMCBAQAogYGBPIWBgIChvYmplY3QpIFsqdHlwZW9iamVjdCosIFB5T2JqZWN0IFwqXQogICAgU3RvcmUgYSBQeXRob24gb2JqZWN0IGluIGEgQyBvYmplY3QgcG9pbnRlci4gIFRoaXMgaXMgc2ltaWxhciB0byBgYE9gYCwgYnV0CiAgICB0YWtlcyB0d28gQyBhcmd1bWVudHM6IHRoZSBmaXJzdCBpcyB0aGUgYWRkcmVzcyBvZiBhIFB5dGhvbiB0eXBlIG9iamVjdCwKLSAgIHRoZSBzZWNvbmQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIEMgdmFyaWFibGUgKG9mIHR5cGUgOmN0eXBlOmBQeU9iamVjdFwqYCkKKyAgIHRoZSBzZWNvbmQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIEMgdmFyaWFibGUgKG9mIHR5cGUgOmM6dHlwZTpgUHlPYmplY3RcKmApCiAgICBpbnRvIHdoaWNoIHRoZSBvYmplY3QgcG9pbnRlciBpcyBzdG9yZWQuICBJZiB0aGUgUHl0aG9uIG9iamVjdCBkb2VzIG5vdAogICAgaGF2ZSB0aGUgcmVxdWlyZWQgdHlwZSwgOmV4YzpgVHlwZUVycm9yYCBpcyByYWlzZWQuCiAKIGBgTyZgYCAob2JqZWN0KSBbKmNvbnZlcnRlciosICphbnl0aGluZypdCiAgICBDb252ZXJ0IGEgUHl0aG9uIG9iamVjdCB0byBhIEMgdmFyaWFibGUgdGhyb3VnaCBhICpjb252ZXJ0ZXIqIGZ1bmN0aW9uLgogICAgVGhpcyB0YWtlcyB0d28gYXJndW1lbnRzOiB0aGUgZmlyc3QgaXMgYSBmdW5jdGlvbiwgdGhlIHNlY29uZCBpcyB0aGUKLSAgIGFkZHJlc3Mgb2YgYSBDIHZhcmlhYmxlIChvZiBhcmJpdHJhcnkgdHlwZSksIGNvbnZlcnRlZCB0byA6Y3R5cGU6YHZvaWQgXCpgLgorICAgYWRkcmVzcyBvZiBhIEMgdmFyaWFibGUgKG9mIGFyYml0cmFyeSB0eXBlKSwgY29udmVydGVkIHRvIDpjOnR5cGU6YHZvaWQgXCpgLgogICAgVGhlICpjb252ZXJ0ZXIqIGZ1bmN0aW9uIGluIHR1cm4gaXMgY2FsbGVkIGFzIGZvbGxvd3M6OgogCiAgICAgICBzdGF0dXMgPSBjb252ZXJ0ZXIob2JqZWN0LCBhZGRyZXNzKTsKIAogICAgd2hlcmUgKm9iamVjdCogaXMgdGhlIFB5dGhvbiBvYmplY3QgdG8gYmUgY29udmVydGVkIGFuZCAqYWRkcmVzcyogaXMgdGhlCi0gICA6Y3R5cGU6YHZvaWRcKmAgYXJndW1lbnQgdGhhdCB3YXMgcGFzc2VkIHRvIHRoZSA6Y2Z1bmM6YFB5QXJnX1BhcnNlXCpgCisgICA6Yzp0eXBlOmB2b2lkXCpgIGFyZ3VtZW50IHRoYXQgd2FzIHBhc3NlZCB0byB0aGUgOmM6ZnVuYzpgUHlBcmdfUGFyc2VcKmAKICAgIGZ1bmN0aW9uLiAgVGhlIHJldHVybmVkICpzdGF0dXMqIHNob3VsZCBiZSBgYDFgYCBmb3IgYSBzdWNjZXNzZnVsCiAgICBjb252ZXJzaW9uIGFuZCBgYDBgYCBpZiB0aGUgY29udmVyc2lvbiBoYXMgZmFpbGVkLiAgV2hlbiB0aGUgY29udmVyc2lvbgogICAgZmFpbHMsIHRoZSAqY29udmVydGVyKiBmdW5jdGlvbiBzaG91bGQgcmFpc2UgYW4gZXhjZXB0aW9uIGFuZCBsZWF2ZSB0aGUKQEAgLTIzOSwxNyArMjQ0LDE3IEBACiBgYFNgYCAoc3RyaW5nKSBbUHlTdHJpbmdPYmplY3QgXCpdCiAgICBMaWtlIGBgT2BgIGJ1dCByZXF1aXJlcyB0aGF0IHRoZSBQeXRob24gb2JqZWN0IGlzIGEgc3RyaW5nIG9iamVjdC4gIFJhaXNlcwogICAgOmV4YzpgVHlwZUVycm9yYCBpZiB0aGUgb2JqZWN0IGlzIG5vdCBhIHN0cmluZyBvYmplY3QuICBUaGUgQyB2YXJpYWJsZSBtYXkKLSAgIGFsc28gYmUgZGVjbGFyZWQgYXMgOmN0eXBlOmBQeU9iamVjdFwqYC4KKyAgIGFsc28gYmUgZGVjbGFyZWQgYXMgOmM6dHlwZTpgUHlPYmplY3RcKmAuCiAKIGBgVWBgIChVbmljb2RlIHN0cmluZykgW1B5VW5pY29kZU9iamVjdCBcKl0KICAgIExpa2UgYGBPYGAgYnV0IHJlcXVpcmVzIHRoYXQgdGhlIFB5dGhvbiBvYmplY3QgaXMgYSBVbmljb2RlIG9iamVjdC4gIFJhaXNlcwogICAgOmV4YzpgVHlwZUVycm9yYCBpZiB0aGUgb2JqZWN0IGlzIG5vdCBhIFVuaWNvZGUgb2JqZWN0LiAgVGhlIEMgdmFyaWFibGUgbWF5Ci0gICBhbHNvIGJlIGRlY2xhcmVkIGFzIDpjdHlwZTpgUHlPYmplY3RcKmAuCisgICBhbHNvIGJlIGRlY2xhcmVkIGFzIDpjOnR5cGU6YFB5T2JqZWN0XCpgLgogCiBgYHQjYGAgKHJlYWQtb25seSBjaGFyYWN0ZXIgYnVmZmVyKSBbY2hhciBcKiwgaW50XQogICAgTGlrZSBgYHMjYGAsIGJ1dCBhY2NlcHRzIGFueSBvYmplY3Qgd2hpY2ggaW1wbGVtZW50cyB0aGUgcmVhZC1vbmx5IGJ1ZmZlcgotICAgaW50ZXJmYWNlLiAgVGhlIDpjdHlwZTpgY2hhclwqYCB2YXJpYWJsZSBpcyBzZXQgdG8gcG9pbnQgdG8gdGhlIGZpcnN0IGJ5dGUKLSAgIG9mIHRoZSBidWZmZXIsIGFuZCB0aGUgOmN0eXBlOmBpbnRgIGlzIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIuCisgICBpbnRlcmZhY2UuICBUaGUgOmM6dHlwZTpgY2hhclwqYCB2YXJpYWJsZSBpcyBzZXQgdG8gcG9pbnQgdG8gdGhlIGZpcnN0IGJ5dGUKKyAgIG9mIHRoZSBidWZmZXIsIGFuZCB0aGUgOmM6dHlwZTpgaW50YCBpcyBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyLgogICAgT25seSBzaW5nbGUtc2VnbWVudCBidWZmZXIgb2JqZWN0cyBhcmUgYWNjZXB0ZWQ7IDpleGM6YFR5cGVFcnJvcmAgaXMgcmFpc2VkCiAgICBmb3IgYWxsIG90aGVycy4KIApAQCAtMjYxLDggKzI2Niw4IEBACiAKIGBgdyNgYCAocmVhZC13cml0ZSBjaGFyYWN0ZXIgYnVmZmVyKSBbY2hhciBcKiwgUHlfc3NpemVfdF0KICAgIExpa2UgYGBzI2BgLCBidXQgYWNjZXB0cyBhbnkgb2JqZWN0IHdoaWNoIGltcGxlbWVudHMgdGhlIHJlYWQtd3JpdGUgYnVmZmVyCi0gICBpbnRlcmZhY2UuICBUaGUgOmN0eXBlOmBjaGFyIFwqYCB2YXJpYWJsZSBpcyBzZXQgdG8gcG9pbnQgdG8gdGhlIGZpcnN0IGJ5dGUKLSAgIG9mIHRoZSBidWZmZXIsIGFuZCB0aGUgOmN0eXBlOmBQeV9zc2l6ZV90YCBpcyBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUKKyAgIGludGVyZmFjZS4gIFRoZSA6Yzp0eXBlOmBjaGFyIFwqYCB2YXJpYWJsZSBpcyBzZXQgdG8gcG9pbnQgdG8gdGhlIGZpcnN0IGJ5dGUKKyAgIG9mIHRoZSBidWZmZXIsIGFuZCB0aGUgOmM6dHlwZTpgUHlfc3NpemVfdGAgaXMgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlCiAgICBidWZmZXIuICBPbmx5IHNpbmdsZS1zZWdtZW50IGJ1ZmZlciBvYmplY3RzIGFyZSBhY2NlcHRlZDsgOmV4YzpgVHlwZUVycm9yYAogICAgaXMgcmFpc2VkIGZvciBhbGwgb3RoZXJzLgogCkBAIC0yOTcsMTMgKzMwMiwxMyBAQAogICAgSW5kaWNhdGVzIHRoYXQgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgaW4gdGhlIFB5dGhvbiBhcmd1bWVudCBsaXN0IGFyZQogICAgb3B0aW9uYWwuICBUaGUgQyB2YXJpYWJsZXMgY29ycmVzcG9uZGluZyB0byBvcHRpb25hbCBhcmd1bWVudHMgc2hvdWxkIGJlCiAgICBpbml0aWFsaXplZCB0byB0aGVpciBkZWZhdWx0IHZhbHVlIC0tLSB3aGVuIGFuIG9wdGlvbmFsIGFyZ3VtZW50IGlzIG5vdAotICAgc3BlY2lmaWVkLCA6Y2Z1bmM6YFB5QXJnX1BhcnNlVHVwbGVgIGRvZXMgbm90IHRvdWNoIHRoZSBjb250ZW50cyBvZiB0aGUKKyAgIHNwZWNpZmllZCwgOmM6ZnVuYzpgUHlBcmdfUGFyc2VUdXBsZWAgZG9lcyBub3QgdG91Y2ggdGhlIGNvbnRlbnRzIG9mIHRoZQogICAgY29ycmVzcG9uZGluZyBDIHZhcmlhYmxlKHMpLgogCiBgYDpgYAogICAgVGhlIGxpc3Qgb2YgZm9ybWF0IHVuaXRzIGVuZHMgaGVyZTsgdGhlIHN0cmluZyBhZnRlciB0aGUgY29sb24gaXMgdXNlZCBhcwogICAgdGhlIGZ1bmN0aW9uIG5hbWUgaW4gZXJyb3IgbWVzc2FnZXMgKHRoZSAiYXNzb2NpYXRlZCB2YWx1ZSIgb2YgdGhlCi0gICBleGNlcHRpb24gdGhhdCA6Y2Z1bmM6YFB5QXJnX1BhcnNlVHVwbGVgIHJhaXNlcykuCisgICBleGNlcHRpb24gdGhhdCA6YzpmdW5jOmBQeUFyZ19QYXJzZVR1cGxlYCByYWlzZXMpLgogCiBgYDtgYAogICAgVGhlIGxpc3Qgb2YgZm9ybWF0IHVuaXRzIGVuZHMgaGVyZTsgdGhlIHN0cmluZyBhZnRlciB0aGUgc2VtaWNvbG9uIGlzIHVzZWQKQEAgLTMyMCw0MCArMzI1LDQwIEBACiBzaG91bGQgbWF0Y2ggd2hhdCBpcyBzcGVjaWZpZWQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGZvcm1hdCB1bml0IGluIHRoYXQgY2FzZS4KIAogRm9yIHRoZSBjb252ZXJzaW9uIHRvIHN1Y2NlZWQsIHRoZSAqYXJnKiBvYmplY3QgbXVzdCBtYXRjaCB0aGUgZm9ybWF0IGFuZCB0aGUKLWZvcm1hdCBtdXN0IGJlIGV4aGF1c3RlZC4gIE9uIHN1Y2Nlc3MsIHRoZSA6Y2Z1bmM6YFB5QXJnX1BhcnNlXCpgIGZ1bmN0aW9ucworZm9ybWF0IG11c3QgYmUgZXhoYXVzdGVkLiAgT24gc3VjY2VzcywgdGhlIDpjOmZ1bmM6YFB5QXJnX1BhcnNlXCpgIGZ1bmN0aW9ucwogcmV0dXJuIHRydWUsIG90aGVyd2lzZSB0aGV5IHJldHVybiBmYWxzZSBhbmQgcmFpc2UgYW4gYXBwcm9wcmlhdGUgZXhjZXB0aW9uLgotV2hlbiB0aGUgOmNmdW5jOmBQeUFyZ19QYXJzZVwqYCBmdW5jdGlvbnMgZmFpbCBkdWUgdG8gY29udmVyc2lvbiBmYWlsdXJlIGluCitXaGVuIHRoZSA6YzpmdW5jOmBQeUFyZ19QYXJzZVwqYCBmdW5jdGlvbnMgZmFpbCBkdWUgdG8gY29udmVyc2lvbiBmYWlsdXJlIGluCiBvbmUgb2YgdGhlIGZvcm1hdCB1bml0cywgdGhlIHZhcmlhYmxlcyBhdCB0aGUgYWRkcmVzc2VzIGNvcnJlc3BvbmRpbmcgdG8gdGhhdAogYW5kIHRoZSBmb2xsb3dpbmcgZm9ybWF0IHVuaXRzIGFyZSBsZWZ0IHVudG91Y2hlZC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlBcmdfUGFyc2VUdXBsZShQeU9iamVjdCAqYXJncywgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5QXJnX1BhcnNlVHVwbGUoUHlPYmplY3QgKmFyZ3MsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogCiAgICBQYXJzZSB0aGUgcGFyYW1ldGVycyBvZiBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgb25seSBwb3NpdGlvbmFsIHBhcmFtZXRlcnMKICAgIGludG8gbG9jYWwgdmFyaWFibGVzLiAgUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3M7IG9uIGZhaWx1cmUsIGl0IHJldHVybnMKICAgIGZhbHNlIGFuZCByYWlzZXMgdGhlIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbi4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlBcmdfVmFQYXJzZShQeU9iamVjdCAqYXJncywgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhcmdzKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUFyZ19WYVBhcnNlKFB5T2JqZWN0ICphcmdzLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgdmFyZ3MpCiAKLSAgIElkZW50aWNhbCB0byA6Y2Z1bmM6YFB5QXJnX1BhcnNlVHVwbGVgLCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGEgdmFfbGlzdAorICAgSWRlbnRpY2FsIHRvIDpjOmZ1bmM6YFB5QXJnX1BhcnNlVHVwbGVgLCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGEgdmFfbGlzdAogICAgcmF0aGVyIHRoYW4gYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdywgY29uc3QgY2hhciAqZm9ybWF0LCBjaGFyICprZXl3b3Jkc1tdLCAuLi4pCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3LCBjb25zdCBjaGFyICpmb3JtYXQsIGNoYXIgKmtleXdvcmRzW10sIC4uLikKIAogICAgUGFyc2UgdGhlIHBhcmFtZXRlcnMgb2YgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGJvdGggcG9zaXRpb25hbCBhbmQga2V5d29yZAogICAgcGFyYW1ldGVycyBpbnRvIGxvY2FsIHZhcmlhYmxlcy4gIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzOyBvbiBmYWlsdXJlLCBpdAogICAgcmV0dXJucyBmYWxzZSBhbmQgcmFpc2VzIHRoZSBhcHByb3ByaWF0ZSBleGNlcHRpb24uCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzKFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3csIGNvbnN0IGNoYXIgKmZvcm1hdCwgY2hhciAqa2V5d29yZHNbXSwgdmFfbGlzdCB2YXJncykKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHMoUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdywgY29uc3QgY2hhciAqZm9ybWF0LCBjaGFyICprZXl3b3Jkc1tdLCB2YV9saXN0IHZhcmdzKQogCi0gICBJZGVudGljYWwgdG8gOmNmdW5jOmBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNgLCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGEKKyAgIElkZW50aWNhbCB0byA6YzpmdW5jOmBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNgLCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGEKICAgIHZhX2xpc3QgcmF0aGVyIHRoYW4gYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUFyZ19QYXJzZShQeU9iamVjdCAqYXJncywgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5QXJnX1BhcnNlKFB5T2JqZWN0ICphcmdzLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIAogICAgRnVuY3Rpb24gdXNlZCB0byBkZWNvbnN0cnVjdCB0aGUgYXJndW1lbnQgbGlzdHMgb2YgIm9sZC1zdHlsZSIgZnVuY3Rpb25zCiAgICAtLS0gdGhlc2UgYXJlIGZ1bmN0aW9ucyB3aGljaCB1c2UgdGhlIDpjb25zdDpgTUVUSF9PTERBUkdTYCBwYXJhbWV0ZXIKQEAgLTM2NCw3ICszNjksNyBAQAogICAgcHVycG9zZS4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlBcmdfVW5wYWNrVHVwbGUoUHlPYmplY3QgKmFyZ3MsIGNvbnN0IGNoYXIgKm5hbWUsIFB5X3NzaXplX3QgbWluLCBQeV9zc2l6ZV90IG1heCwgLi4uKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUFyZ19VbnBhY2tUdXBsZShQeU9iamVjdCAqYXJncywgY29uc3QgY2hhciAqbmFtZSwgUHlfc3NpemVfdCBtaW4sIFB5X3NzaXplX3QgbWF4LCAuLi4pCiAKICAgIEEgc2ltcGxlciBmb3JtIG9mIHBhcmFtZXRlciByZXRyaWV2YWwgd2hpY2ggZG9lcyBub3QgdXNlIGEgZm9ybWF0IHN0cmluZyB0bwogICAgc3BlY2lmeSB0aGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cy4gIEZ1bmN0aW9ucyB3aGljaCB1c2UgdGhpcyBtZXRob2QgdG8KQEAgLTM3Myw3ICszNzgsNyBAQAogICAgc2hvdWxkIGJlIHBhc3NlZCBhcyAqYXJncyo7IGl0IG11c3QgYWN0dWFsbHkgYmUgYSB0dXBsZS4gIFRoZSBsZW5ndGggb2YgdGhlCiAgICB0dXBsZSBtdXN0IGJlIGF0IGxlYXN0ICptaW4qIGFuZCBubyBtb3JlIHRoYW4gKm1heCo7ICptaW4qIGFuZCAqbWF4KiBtYXkgYmUKICAgIGVxdWFsLiAgQWRkaXRpb25hbCBhcmd1bWVudHMgbXVzdCBiZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLCBlYWNoIG9mIHdoaWNoCi0gICBzaG91bGQgYmUgYSBwb2ludGVyIHRvIGEgOmN0eXBlOmBQeU9iamVjdFwqYCB2YXJpYWJsZTsgdGhlc2Ugd2lsbCBiZSBmaWxsZWQKKyAgIHNob3VsZCBiZSBhIHBvaW50ZXIgdG8gYSA6Yzp0eXBlOmBQeU9iamVjdFwqYCB2YXJpYWJsZTsgdGhlc2Ugd2lsbCBiZSBmaWxsZWQKICAgIGluIHdpdGggdGhlIHZhbHVlcyBmcm9tICphcmdzKjsgdGhleSB3aWxsIGNvbnRhaW4gYm9ycm93ZWQgcmVmZXJlbmNlcy4gIFRoZQogICAgdmFyaWFibGVzIHdoaWNoIGNvcnJlc3BvbmQgdG8gb3B0aW9uYWwgcGFyYW1ldGVycyBub3QgZ2l2ZW4gYnkgKmFyZ3MqIHdpbGwKICAgIG5vdCBiZSBmaWxsZWQgaW47IHRoZXNlIHNob3VsZCBiZSBpbml0aWFsaXplZCBieSB0aGUgY2FsbGVyLiBUaGlzIGZ1bmN0aW9uCkBAIC0zOTYsMjYgKzQwMSwyNiBAQAogICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICB9CiAKLSAgIFRoZSBjYWxsIHRvIDpjZnVuYzpgUHlBcmdfVW5wYWNrVHVwbGVgIGluIHRoaXMgZXhhbXBsZSBpcyBlbnRpcmVseQotICAgZXF1aXZhbGVudCB0byB0aGlzIGNhbGwgdG8gOmNmdW5jOmBQeUFyZ19QYXJzZVR1cGxlYDo6CisgICBUaGUgY2FsbCB0byA6YzpmdW5jOmBQeUFyZ19VbnBhY2tUdXBsZWAgaW4gdGhpcyBleGFtcGxlIGlzIGVudGlyZWx5CisgICBlcXVpdmFsZW50IHRvIHRoaXMgY2FsbCB0byA6YzpmdW5jOmBQeUFyZ19QYXJzZVR1cGxlYDo6CiAKICAgICAgIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TzpyZWYiLCAmb2JqZWN0LCAmY2FsbGJhY2spCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjdHlwZTpgaW50YCB0eXBlIGZvciAqbWluKiBhbmQgKm1heCouIFRoaXMgbWlnaHQKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgZm9yICptaW4qIGFuZCAqbWF4Ki4gVGhpcyBtaWdodAogICAgICAgcmVxdWlyZSBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlfQnVpbGRWYWx1ZShjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlfQnVpbGRWYWx1ZShjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIAogICAgQ3JlYXRlIGEgbmV3IHZhbHVlIGJhc2VkIG9uIGEgZm9ybWF0IHN0cmluZyBzaW1pbGFyIHRvIHRob3NlIGFjY2VwdGVkIGJ5Ci0gICB0aGUgOmNmdW5jOmBQeUFyZ19QYXJzZVwqYCBmYW1pbHkgb2YgZnVuY3Rpb25zIGFuZCBhIHNlcXVlbmNlIG9mIHZhbHVlcy4KKyAgIHRoZSA6YzpmdW5jOmBQeUFyZ19QYXJzZVwqYCBmYW1pbHkgb2YgZnVuY3Rpb25zIGFuZCBhIHNlcXVlbmNlIG9mIHZhbHVlcy4KICAgIFJldHVybnMgdGhlIHZhbHVlIG9yICpOVUxMKiBpbiB0aGUgY2FzZSBvZiBhbiBlcnJvcjsgYW4gZXhjZXB0aW9uIHdpbGwgYmUKICAgIHJhaXNlZCBpZiAqTlVMTCogaXMgcmV0dXJuZWQuCiAKLSAgIDpjZnVuYzpgUHlfQnVpbGRWYWx1ZWAgZG9lcyBub3QgYWx3YXlzIGJ1aWxkIGEgdHVwbGUuICBJdCBidWlsZHMgYSB0dXBsZQorICAgOmM6ZnVuYzpgUHlfQnVpbGRWYWx1ZWAgZG9lcyBub3QgYWx3YXlzIGJ1aWxkIGEgdHVwbGUuICBJdCBidWlsZHMgYSB0dXBsZQogICAgb25seSBpZiBpdHMgZm9ybWF0IHN0cmluZyBjb250YWlucyB0d28gb3IgbW9yZSBmb3JtYXQgdW5pdHMuICBJZiB0aGUgZm9ybWF0CiAgICBzdHJpbmcgaXMgZW1wdHksIGl0IHJldHVybnMgYGBOb25lYGA7IGlmIGl0IGNvbnRhaW5zIGV4YWN0bHkgb25lIGZvcm1hdAogICAgdW5pdCwgaXQgcmV0dXJucyB3aGF0ZXZlciBvYmplY3QgaXMgZGVzY3JpYmVkIGJ5IHRoYXQgZm9ybWF0IHVuaXQuICBUbwpAQCAtNDI1LDEwICs0MzAsMTAgQEAKICAgIFdoZW4gbWVtb3J5IGJ1ZmZlcnMgYXJlIHBhc3NlZCBhcyBwYXJhbWV0ZXJzIHRvIHN1cHBseSBkYXRhIHRvIGJ1aWxkCiAgICBvYmplY3RzLCBhcyBmb3IgdGhlIGBgc2BgIGFuZCBgYHMjYGAgZm9ybWF0cywgdGhlIHJlcXVpcmVkIGRhdGEgaXMgY29waWVkLgogICAgQnVmZmVycyBwcm92aWRlZCBieSB0aGUgY2FsbGVyIGFyZSBuZXZlciByZWZlcmVuY2VkIGJ5IHRoZSBvYmplY3RzIGNyZWF0ZWQKLSAgIGJ5IDpjZnVuYzpgUHlfQnVpbGRWYWx1ZWAuICBJbiBvdGhlciB3b3JkcywgaWYgeW91ciBjb2RlIGludm9rZXMKLSAgIDpjZnVuYzpgbWFsbG9jYCBhbmQgcGFzc2VzIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IHRvIDpjZnVuYzpgUHlfQnVpbGRWYWx1ZWAsCi0gICB5b3VyIGNvZGUgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgOmNmdW5jOmBmcmVlYCBmb3IgdGhhdCBtZW1vcnkgb25jZQotICAgOmNmdW5jOmBQeV9CdWlsZFZhbHVlYCByZXR1cm5zLgorICAgYnkgOmM6ZnVuYzpgUHlfQnVpbGRWYWx1ZWAuICBJbiBvdGhlciB3b3JkcywgaWYgeW91ciBjb2RlIGludm9rZXMKKyAgIDpjOmZ1bmM6YG1hbGxvY2AgYW5kIHBhc3NlcyB0aGUgYWxsb2NhdGVkIG1lbW9yeSB0byA6YzpmdW5jOmBQeV9CdWlsZFZhbHVlYCwKKyAgIHlvdXIgY29kZSBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyA6YzpmdW5jOmBmcmVlYCBmb3IgdGhhdCBtZW1vcnkgb25jZQorICAgOmM6ZnVuYzpgUHlfQnVpbGRWYWx1ZWAgcmV0dXJucy4KIAogICAgSW4gdGhlIGZvbGxvd2luZyBkZXNjcmlwdGlvbiwgdGhlIHF1b3RlZCBmb3JtIGlzIHRoZSBmb3JtYXQgdW5pdDsgdGhlIGVudHJ5CiAgICBpbiAocm91bmQpIHBhcmVudGhlc2VzIGlzIHRoZSBQeXRob24gb2JqZWN0IHR5cGUgdGhhdCB0aGUgZm9ybWF0IHVuaXQgd2lsbApAQCAtNDY0LDYyICs0NjksNjIgQEAKICAgICAgIGxlbmd0aCBpcyBpZ25vcmVkIGFuZCBgYE5vbmVgYCBpcyByZXR1cm5lZC4KIAogICAgYGBpYGAgKGludGVnZXIpIFtpbnRdCi0gICAgICBDb252ZXJ0IGEgcGxhaW4gQyA6Y3R5cGU6YGludGAgdG8gYSBQeXRob24gaW50ZWdlciBvYmplY3QuCisgICAgICBDb252ZXJ0IGEgcGxhaW4gQyA6Yzp0eXBlOmBpbnRgIHRvIGEgUHl0aG9uIGludGVnZXIgb2JqZWN0LgogCiAgICBgYGJgYCAoaW50ZWdlcikgW2NoYXJdCi0gICAgICBDb252ZXJ0IGEgcGxhaW4gQyA6Y3R5cGU6YGNoYXJgIHRvIGEgUHl0aG9uIGludGVnZXIgb2JqZWN0LgorICAgICAgQ29udmVydCBhIHBsYWluIEMgOmM6dHlwZTpgY2hhcmAgdG8gYSBQeXRob24gaW50ZWdlciBvYmplY3QuCiAKICAgIGBgaGBgIChpbnRlZ2VyKSBbc2hvcnQgaW50XQotICAgICAgQ29udmVydCBhIHBsYWluIEMgOmN0eXBlOmBzaG9ydCBpbnRgIHRvIGEgUHl0aG9uIGludGVnZXIgb2JqZWN0LgorICAgICAgQ29udmVydCBhIHBsYWluIEMgOmM6dHlwZTpgc2hvcnQgaW50YCB0byBhIFB5dGhvbiBpbnRlZ2VyIG9iamVjdC4KIAogICAgYGBsYGAgKGludGVnZXIpIFtsb25nIGludF0KLSAgICAgIENvbnZlcnQgYSBDIDpjdHlwZTpgbG9uZyBpbnRgIHRvIGEgUHl0aG9uIGludGVnZXIgb2JqZWN0LgorICAgICAgQ29udmVydCBhIEMgOmM6dHlwZTpgbG9uZyBpbnRgIHRvIGEgUHl0aG9uIGludGVnZXIgb2JqZWN0LgogCiAgICBgYEJgYCAoaW50ZWdlcikgW3Vuc2lnbmVkIGNoYXJdCi0gICAgICBDb252ZXJ0IGEgQyA6Y3R5cGU6YHVuc2lnbmVkIGNoYXJgIHRvIGEgUHl0aG9uIGludGVnZXIgb2JqZWN0LgorICAgICAgQ29udmVydCBhIEMgOmM6dHlwZTpgdW5zaWduZWQgY2hhcmAgdG8gYSBQeXRob24gaW50ZWdlciBvYmplY3QuCiAKICAgIGBgSGBgIChpbnRlZ2VyKSBbdW5zaWduZWQgc2hvcnQgaW50XQotICAgICAgQ29udmVydCBhIEMgOmN0eXBlOmB1bnNpZ25lZCBzaG9ydCBpbnRgIHRvIGEgUHl0aG9uIGludGVnZXIgb2JqZWN0LgorICAgICAgQ29udmVydCBhIEMgOmM6dHlwZTpgdW5zaWduZWQgc2hvcnQgaW50YCB0byBhIFB5dGhvbiBpbnRlZ2VyIG9iamVjdC4KIAogICAgYGBJYGAgKGludGVnZXIvbG9uZykgW3Vuc2lnbmVkIGludF0KLSAgICAgIENvbnZlcnQgYSBDIDpjdHlwZTpgdW5zaWduZWQgaW50YCB0byBhIFB5dGhvbiBpbnRlZ2VyIG9iamVjdCBvciBhIFB5dGhvbgorICAgICAgQ29udmVydCBhIEMgOmM6dHlwZTpgdW5zaWduZWQgaW50YCB0byBhIFB5dGhvbiBpbnRlZ2VyIG9iamVjdCBvciBhIFB5dGhvbgogICAgICAgbG9uZyBpbnRlZ2VyIG9iamVjdCwgaWYgaXQgaXMgbGFyZ2VyIHRoYW4gYGBzeXMubWF4aW50YGAuCiAKICAgIGBga2BgIChpbnRlZ2VyL2xvbmcpIFt1bnNpZ25lZCBsb25nXQotICAgICAgQ29udmVydCBhIEMgOmN0eXBlOmB1bnNpZ25lZCBsb25nYCB0byBhIFB5dGhvbiBpbnRlZ2VyIG9iamVjdCBvciBhCisgICAgICBDb252ZXJ0IGEgQyA6Yzp0eXBlOmB1bnNpZ25lZCBsb25nYCB0byBhIFB5dGhvbiBpbnRlZ2VyIG9iamVjdCBvciBhCiAgICAgICBQeXRob24gbG9uZyBpbnRlZ2VyIG9iamVjdCwgaWYgaXQgaXMgbGFyZ2VyIHRoYW4gYGBzeXMubWF4aW50YGAuCiAKICAgIGBgTGBgIChsb25nKSBbUFlfTE9OR19MT05HXQotICAgICAgQ29udmVydCBhIEMgOmN0eXBlOmBsb25nIGxvbmdgIHRvIGEgUHl0aG9uIGxvbmcgaW50ZWdlciBvYmplY3QuIE9ubHkKLSAgICAgIGF2YWlsYWJsZSBvbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IDpjdHlwZTpgbG9uZyBsb25nYC4KKyAgICAgIENvbnZlcnQgYSBDIDpjOnR5cGU6YGxvbmcgbG9uZ2AgdG8gYSBQeXRob24gbG9uZyBpbnRlZ2VyIG9iamVjdC4gT25seQorICAgICAgYXZhaWxhYmxlIG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgOmM6dHlwZTpgbG9uZyBsb25nYC4KIAogICAgYGBLYGAgKGxvbmcpIFt1bnNpZ25lZCBQWV9MT05HX0xPTkddCi0gICAgICBDb252ZXJ0IGEgQyA6Y3R5cGU6YHVuc2lnbmVkIGxvbmcgbG9uZ2AgdG8gYSBQeXRob24gbG9uZyBpbnRlZ2VyIG9iamVjdC4KLSAgICAgIE9ubHkgYXZhaWxhYmxlIG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgOmN0eXBlOmB1bnNpZ25lZCBsb25nIGxvbmdgLgorICAgICAgQ29udmVydCBhIEMgOmM6dHlwZTpgdW5zaWduZWQgbG9uZyBsb25nYCB0byBhIFB5dGhvbiBsb25nIGludGVnZXIgb2JqZWN0LgorICAgICAgT25seSBhdmFpbGFibGUgb24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCA6Yzp0eXBlOmB1bnNpZ25lZCBsb25nIGxvbmdgLgogCiAgICBgYG5gYCAoaW50KSBbUHlfc3NpemVfdF0KLSAgICAgIENvbnZlcnQgYSBDIDpjdHlwZTpgUHlfc3NpemVfdGAgdG8gYSBQeXRob24gaW50ZWdlciBvciBsb25nIGludGVnZXIuCisgICAgICBDb252ZXJ0IGEgQyA6Yzp0eXBlOmBQeV9zc2l6ZV90YCB0byBhIFB5dGhvbiBpbnRlZ2VyIG9yIGxvbmcgaW50ZWdlci4KIAogICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMi41CiAKICAgIGBgY2BgIChzdHJpbmcgb2YgbGVuZ3RoIDEpIFtjaGFyXQotICAgICAgQ29udmVydCBhIEMgOmN0eXBlOmBpbnRgIHJlcHJlc2VudGluZyBhIGNoYXJhY3RlciB0byBhIFB5dGhvbiBzdHJpbmcgb2YKKyAgICAgIENvbnZlcnQgYSBDIDpjOnR5cGU6YGludGAgcmVwcmVzZW50aW5nIGEgY2hhcmFjdGVyIHRvIGEgUHl0aG9uIHN0cmluZyBvZgogICAgICAgbGVuZ3RoIDEuCiAKICAgIGBgZGBgIChmbG9hdCkgW2RvdWJsZV0KLSAgICAgIENvbnZlcnQgYSBDIDpjdHlwZTpgZG91YmxlYCB0byBhIFB5dGhvbiBmbG9hdGluZyBwb2ludCBudW1iZXIuCisgICAgICBDb252ZXJ0IGEgQyA6Yzp0eXBlOmBkb3VibGVgIHRvIGEgUHl0aG9uIGZsb2F0aW5nIHBvaW50IG51bWJlci4KIAogICAgYGBmYGAgKGZsb2F0KSBbZmxvYXRdCiAgICAgICBTYW1lIGFzIGBgZGBgLgogCiAgICBgYERgYCAoY29tcGxleCkgW1B5X2NvbXBsZXggXCpdCi0gICAgICBDb252ZXJ0IGEgQyA6Y3R5cGU6YFB5X2NvbXBsZXhgIHN0cnVjdHVyZSB0byBhIFB5dGhvbiBjb21wbGV4IG51bWJlci4KKyAgICAgIENvbnZlcnQgYSBDIDpjOnR5cGU6YFB5X2NvbXBsZXhgIHN0cnVjdHVyZSB0byBhIFB5dGhvbiBjb21wbGV4IG51bWJlci4KIAogICAgYGBPYGAgKG9iamVjdCkgW1B5T2JqZWN0IFwqXQogICAgICAgUGFzcyBhIFB5dGhvbiBvYmplY3QgdW50b3VjaGVkIChleGNlcHQgZm9yIGl0cyByZWZlcmVuY2UgY291bnQsIHdoaWNoIGlzCiAgICAgICBpbmNyZW1lbnRlZCBieSBvbmUpLiAgSWYgdGhlIG9iamVjdCBwYXNzZWQgaW4gaXMgYSAqTlVMTCogcG9pbnRlciwgaXQgaXMKICAgICAgIGFzc3VtZWQgdGhhdCB0aGlzIHdhcyBjYXVzZWQgYmVjYXVzZSB0aGUgY2FsbCBwcm9kdWNpbmcgdGhlIGFyZ3VtZW50Ci0gICAgICBmb3VuZCBhbiBlcnJvciBhbmQgc2V0IGFuIGV4Y2VwdGlvbi4gVGhlcmVmb3JlLCA6Y2Z1bmM6YFB5X0J1aWxkVmFsdWVgCisgICAgICBmb3VuZCBhbiBlcnJvciBhbmQgc2V0IGFuIGV4Y2VwdGlvbi4gVGhlcmVmb3JlLCA6YzpmdW5jOmBQeV9CdWlsZFZhbHVlYAogICAgICAgd2lsbCByZXR1cm4gKk5VTEwqIGJ1dCB3b24ndCByYWlzZSBhbiBleGNlcHRpb24uICBJZiBubyBleGNlcHRpb24gaGFzCiAgICAgICBiZWVuIHJhaXNlZCB5ZXQsIDpleGM6YFN5c3RlbUVycm9yYCBpcyBzZXQuCiAKQEAgLTUzNCw3ICs1MzksNyBAQAogICAgYGBPJmBgIChvYmplY3QpIFsqY29udmVydGVyKiwgKmFueXRoaW5nKl0KICAgICAgIENvbnZlcnQgKmFueXRoaW5nKiB0byBhIFB5dGhvbiBvYmplY3QgdGhyb3VnaCBhICpjb252ZXJ0ZXIqIGZ1bmN0aW9uLgogICAgICAgVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoICphbnl0aGluZyogKHdoaWNoIHNob3VsZCBiZSBjb21wYXRpYmxlIHdpdGgKLSAgICAgIDpjdHlwZTpgdm9pZCBcKmApIGFzIGl0cyBhcmd1bWVudCBhbmQgc2hvdWxkIHJldHVybiBhICJuZXciIFB5dGhvbgorICAgICAgOmM6dHlwZTpgdm9pZCBcKmApIGFzIGl0cyBhcmd1bWVudCBhbmQgc2hvdWxkIHJldHVybiBhICJuZXciIFB5dGhvbgogICAgICAgb2JqZWN0LCBvciAqTlVMTCogaWYgYW4gZXJyb3Igb2NjdXJyZWQuCiAKICAgIGBgKGl0ZW1zKWBgICh0dXBsZSkgWyptYXRjaGluZy1pdGVtcypdCkBAIC01NTMsNyArNTU4LDcgQEAKICAgIElmIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBmb3JtYXQgc3RyaW5nLCB0aGUgOmV4YzpgU3lzdGVtRXJyb3JgIGV4Y2VwdGlvbgogICAgaXMgc2V0IGFuZCAqTlVMTCogcmV0dXJuZWQuCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeV9WYUJ1aWxkVmFsdWUoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhcmdzKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeV9WYUJ1aWxkVmFsdWUoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhcmdzKQogCi0gICBJZGVudGljYWwgdG8gOmNmdW5jOmBQeV9CdWlsZFZhbHVlYCwgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhIHZhX2xpc3QKKyAgIElkZW50aWNhbCB0byA6YzpmdW5jOmBQeV9CdWlsZFZhbHVlYCwgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhIHZhX2xpc3QKICAgIHJhdGhlciB0aGFuIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9ib29sLnJzdCBiL0RvYy9jLWFwaS9ib29sLnJzdAppbmRleCAyYmY2ZTdlLi5mZWRlMzQ4IDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvYm9vbC5yc3QKKysrIGIvRG9jL2MtYXBpL2Jvb2wucnN0CkBAIC0xMSwyNiArMTEsMjYgQEAKIGFyZSBhdmFpbGFibGUsIGhvd2V2ZXIuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5Qm9vbF9DaGVjayhQeU9iamVjdCAqbykKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlCb29sX0NoZWNrKFB5T2JqZWN0ICpvKQogCi0gICBSZXR1cm4gdHJ1ZSBpZiAqbyogaXMgb2YgdHlwZSA6Y2RhdGE6YFB5Qm9vbF9UeXBlYC4KKyAgIFJldHVybiB0cnVlIGlmICpvKiBpcyBvZiB0eXBlIDpjOmRhdGE6YFB5Qm9vbF9UeXBlYC4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4zCiAKIAotLi4gY3Zhcjo6IFB5T2JqZWN0KiBQeV9GYWxzZQorLi4gYzp2YXI6OiBQeU9iamVjdCogUHlfRmFsc2UKIAogICAgVGhlIFB5dGhvbiBgYEZhbHNlYGAgb2JqZWN0LiAgVGhpcyBvYmplY3QgaGFzIG5vIG1ldGhvZHMuICBJdCBuZWVkcyB0byBiZQogICAgdHJlYXRlZCBqdXN0IGxpa2UgYW55IG90aGVyIG9iamVjdCB3aXRoIHJlc3BlY3QgdG8gcmVmZXJlbmNlIGNvdW50cy4KIAogCi0uLiBjdmFyOjogUHlPYmplY3QqIFB5X1RydWUKKy4uIGM6dmFyOjogUHlPYmplY3QqIFB5X1RydWUKIAogICAgVGhlIFB5dGhvbiBgYFRydWVgYCBvYmplY3QuICBUaGlzIG9iamVjdCBoYXMgbm8gbWV0aG9kcy4gIEl0IG5lZWRzIHRvIGJlIHRyZWF0ZWQKICAgIGp1c3QgbGlrZSBhbnkgb3RoZXIgb2JqZWN0IHdpdGggcmVzcGVjdCB0byByZWZlcmVuY2UgY291bnRzLgogCiAKLS4uIGNtYWNybzo6IFB5X1JFVFVSTl9GQUxTRQorLi4gYzptYWNybzo6IFB5X1JFVFVSTl9GQUxTRQogCiAgICBSZXR1cm4gOmNvbnN0OmBQeV9GYWxzZWAgZnJvbSBhIGZ1bmN0aW9uLCBwcm9wZXJseSBpbmNyZW1lbnRpbmcgaXRzIHJlZmVyZW5jZQogICAgY291bnQuCkBAIC0zOCw3ICszOCw3IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjQKIAogCi0uLiBjbWFjcm86OiBQeV9SRVRVUk5fVFJVRQorLi4gYzptYWNybzo6IFB5X1JFVFVSTl9UUlVFCiAKICAgIFJldHVybiA6Y29uc3Q6YFB5X1RydWVgIGZyb20gYSBmdW5jdGlvbiwgcHJvcGVybHkgaW5jcmVtZW50aW5nIGl0cyByZWZlcmVuY2UKICAgIGNvdW50LgpAQCAtNDYsNyArNDYsNyBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi40CiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5Qm9vbF9Gcm9tTG9uZyhsb25nIHYpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5Qm9vbF9Gcm9tTG9uZyhsb25nIHYpCiAKICAgIFJldHVybiBhIG5ldyByZWZlcmVuY2UgdG8gOmNvbnN0OmBQeV9UcnVlYCBvciA6Y29uc3Q6YFB5X0ZhbHNlYCBkZXBlbmRpbmcgb24gdGhlCiAgICB0cnV0aCB2YWx1ZSBvZiAqdiouCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvYnVmZmVyLnJzdCBiL0RvYy9jLWFwaS9idWZmZXIucnN0CmluZGV4IDIxZThjNGEuLjc0NjkzYWMgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS9idWZmZXIucnN0CisrKyBiL0RvYy9jLWFwaS9idWZmZXIucnN0CkBAIC0yMSwxOSArMjEsMjEgQEAKIAogVHdvIGV4YW1wbGVzIG9mIG9iamVjdHMgdGhhdCBzdXBwb3J0IHRoZSBidWZmZXIgaW50ZXJmYWNlIGFyZSBzdHJpbmdzIGFuZAogYXJyYXlzLiBUaGUgc3RyaW5nIG9iamVjdCBleHBvc2VzIHRoZSBjaGFyYWN0ZXIgY29udGVudHMgaW4gdGhlIGJ1ZmZlcgotaW50ZXJmYWNlJ3MgYnl0ZS1vcmllbnRlZCBmb3JtLiBBbiBhcnJheSBjYW4gYWxzbyBleHBvc2UgaXRzIGNvbnRlbnRzLCBidXQgaXQKLXNob3VsZCBiZSBub3RlZCB0aGF0IGFycmF5IGVsZW1lbnRzIG1heSBiZSBtdWx0aS1ieXRlIHZhbHVlcy4KK2ludGVyZmFjZSdzIGJ5dGUtb3JpZW50ZWQgZm9ybS4gQW4gYXJyYXkgY2FuIG9ubHkgZXhwb3NlIGl0cyBjb250ZW50cyB2aWEgdGhlCitvbGQtc3R5bGUgYnVmZmVyIGludGVyZmFjZS4gVGhpcyBsaW1pdGF0aW9uIGRvZXMgbm90IGFwcGx5IHRvIFB5dGhvbiAzLAord2hlcmUgOmNsYXNzOmBtZW1vcnl2aWV3YCBvYmplY3RzIGNhbiBiZSBjb25zdHJ1Y3RlZCBmcm9tIGFycmF5cywgdG9vLgorQXJyYXkgZWxlbWVudHMgbWF5IGJlIG11bHRpLWJ5dGUgdmFsdWVzLgogCiBBbiBleGFtcGxlIHVzZXIgb2YgdGhlIGJ1ZmZlciBpbnRlcmZhY2UgaXMgdGhlIGZpbGUgb2JqZWN0J3MgOm1ldGg6YHdyaXRlYAogbWV0aG9kLiBBbnkgb2JqZWN0IHRoYXQgY2FuIGV4cG9ydCBhIHNlcmllcyBvZiBieXRlcyB0aHJvdWdoIHRoZSBidWZmZXIKIGludGVyZmFjZSBjYW4gYmUgd3JpdHRlbiB0byBhIGZpbGUuIFRoZXJlIGFyZSBhIG51bWJlciBvZiBmb3JtYXQgY29kZXMgdG8KLTpjZnVuYzpgUHlBcmdfUGFyc2VUdXBsZWAgdGhhdCBvcGVyYXRlIGFnYWluc3QgYW4gb2JqZWN0J3MgYnVmZmVyIGludGVyZmFjZSwKKzpjOmZ1bmM6YFB5QXJnX1BhcnNlVHVwbGVgIHRoYXQgb3BlcmF0ZSBhZ2FpbnN0IGFuIG9iamVjdCdzIGJ1ZmZlciBpbnRlcmZhY2UsCiByZXR1cm5pbmcgZGF0YSBmcm9tIHRoZSB0YXJnZXQgb2JqZWN0LgogCiBTdGFydGluZyBmcm9tIHZlcnNpb24gMS42LCBQeXRob24gaGFzIGJlZW4gcHJvdmlkaW5nIFB5dGhvbi1sZXZlbCBidWZmZXIKIG9iamVjdHMgYW5kIGEgQy1sZXZlbCBidWZmZXIgQVBJIHNvIHRoYXQgYW55IGJ1aWx0LWluIG9yIHVzZWQtZGVmaW5lZCB0eXBlIGNhbgogZXhwb3NlIGl0cyBjaGFyYWN0ZXJpc3RpY3MuIEJvdGgsIGhvd2V2ZXIsIGhhdmUgYmVlbiBkZXByZWNhdGVkIGJlY2F1c2Ugb2YKLXZhcmlvdXMgc2hvcnRjb21pbmdzLCBhbmQgaGF2ZSBiZWVuIG9mZmljaWFsbHkgcmVtb3ZlZCBpbiBQeXRob24gMy4wIGluIGZhdm91cgordmFyaW91cyBzaG9ydGNvbWluZ3MsIGFuZCBoYXZlIGJlZW4gb2ZmaWNpYWxseSByZW1vdmVkIGluIFB5dGhvbiAzIGluIGZhdm91cgogb2YgYSBuZXcgQy1sZXZlbCBidWZmZXIgQVBJIGFuZCBhIG5ldyBQeXRob24tbGV2ZWwgb2JqZWN0IG5hbWVkCiA6Y2xhc3M6YG1lbW9yeXZpZXdgLgogCkBAIC00Nyw0OSArNDksNDkgQEAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiAKLS4uIGN0eXBlOjogUHlfYnVmZmVyCisuLiBjOnR5cGU6OiBQeV9idWZmZXIKIAotICAgLi4gY21lbWJlcjo6IHZvaWQgKmJ1ZgorICAgLi4gYzptZW1iZXI6OiB2b2lkICpidWYKIAogICAgICAgQSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbWVtb3J5IGZvciB0aGUgb2JqZWN0LgogCi0gICAuLiBjbWVtYmVyOjogUHlfc3NpemVfdCBsZW4KKyAgIC4uIGM6bWVtYmVyOjogUHlfc3NpemVfdCBsZW4KICAgICAgIDpub2luZGV4OgogCiAgICAgICBUaGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBtZW1vcnkgaW4gYnl0ZXMuCiAKLSAgIC4uIGNtZW1iZXI6OiBpbnQgcmVhZG9ubHkKKyAgIC4uIGM6bWVtYmVyOjogaW50IHJlYWRvbmx5CiAKICAgICAgIEFuIGluZGljYXRvciBvZiB3aGV0aGVyIHRoZSBidWZmZXIgaXMgcmVhZCBvbmx5LgogCi0gICAuLiBjbWVtYmVyOjogY29uc3QgY2hhciAqZm9ybWF0CisgICAuLiBjOm1lbWJlcjo6IGNvbnN0IGNoYXIgKmZvcm1hdAogICAgICAgOm5vaW5kZXg6CiAKICAgICAgIEEgKk5VTEwqIHRlcm1pbmF0ZWQgc3RyaW5nIGluIDptb2Q6YHN0cnVjdGAgbW9kdWxlIHN0eWxlIHN5bnRheCBnaXZpbmcKICAgICAgIHRoZSBjb250ZW50cyBvZiB0aGUgZWxlbWVudHMgYXZhaWxhYmxlIHRocm91Z2ggdGhlIGJ1ZmZlci4gIElmIHRoaXMgaXMKICAgICAgICpOVUxMKiwgYGAiQiJgYCAodW5zaWduZWQgYnl0ZXMpIGlzIGFzc3VtZWQuCiAKLSAgIC4uIGNtZW1iZXI6OiBpbnQgbmRpbQorICAgLi4gYzptZW1iZXI6OiBpbnQgbmRpbQogCiAgICAgICBUaGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgdGhlIG1lbW9yeSByZXByZXNlbnRzIGFzIGEgbXVsdGktZGltZW5zaW9uYWwKLSAgICAgIGFycmF5LiAgSWYgaXQgaXMgMCwgOmNkYXRhOmBzdHJpZGVzYCBhbmQgOmNkYXRhOmBzdWJvZmZzZXRzYCBtdXN0IGJlCisgICAgICBhcnJheS4gIElmIGl0IGlzIDAsIDpjOmRhdGE6YHN0cmlkZXNgIGFuZCA6YzpkYXRhOmBzdWJvZmZzZXRzYCBtdXN0IGJlCiAgICAgICAqTlVMTCouCiAKLSAgIC4uIGNtZW1iZXI6OiBQeV9zc2l6ZV90ICpzaGFwZQorICAgLi4gYzptZW1iZXI6OiBQeV9zc2l6ZV90ICpzaGFwZQogCi0gICAgICBBbiBhcnJheSBvZiA6Y3R5cGU6YFB5X3NzaXplX3RgXHMgdGhlIGxlbmd0aCBvZiA6Y2RhdGE6YG5kaW1gIGdpdmluZyB0aGUKKyAgICAgIEFuIGFycmF5IG9mIDpjOnR5cGU6YFB5X3NzaXplX3RgXHMgdGhlIGxlbmd0aCBvZiA6YzpkYXRhOmBuZGltYCBnaXZpbmcgdGhlCiAgICAgICBzaGFwZSBvZiB0aGUgbWVtb3J5IGFzIGEgbXVsdGktZGltZW5zaW9uYWwgYXJyYXkuICBOb3RlIHRoYXQKICAgICAgIGBgKCgqc2hhcGUpWzBdICogLi4uICogKCpzaGFwZSlbbmRpbXMtMV0pKml0ZW1zaXplYGAgc2hvdWxkIGJlIGVxdWFsIHRvCi0gICAgICA6Y2RhdGE6YGxlbmAuCisgICAgICA6YzpkYXRhOmBsZW5gLgogCi0gICAuLiBjbWVtYmVyOjogUHlfc3NpemVfdCAqc3RyaWRlcworICAgLi4gYzptZW1iZXI6OiBQeV9zc2l6ZV90ICpzdHJpZGVzCiAKLSAgICAgIEFuIGFycmF5IG9mIDpjdHlwZTpgUHlfc3NpemVfdGBccyB0aGUgbGVuZ3RoIG9mIDpjZGF0YTpgbmRpbWAgZ2l2aW5nIHRoZQorICAgICAgQW4gYXJyYXkgb2YgOmM6dHlwZTpgUHlfc3NpemVfdGBccyB0aGUgbGVuZ3RoIG9mIDpjOmRhdGE6YG5kaW1gIGdpdmluZyB0aGUKICAgICAgIG51bWJlciBvZiBieXRlcyB0byBza2lwIHRvIGdldCB0byBhIG5ldyBlbGVtZW50IGluIGVhY2ggZGltZW5zaW9uLgogCi0gICAuLiBjbWVtYmVyOjogUHlfc3NpemVfdCAqc3Vib2Zmc2V0cworICAgLi4gYzptZW1iZXI6OiBQeV9zc2l6ZV90ICpzdWJvZmZzZXRzCiAKLSAgICAgIEFuIGFycmF5IG9mIDpjdHlwZTpgUHlfc3NpemVfdGBccyB0aGUgbGVuZ3RoIG9mIDpjZGF0YTpgbmRpbWAuICBJZiB0aGVzZQorICAgICAgQW4gYXJyYXkgb2YgOmM6dHlwZTpgUHlfc3NpemVfdGBccyB0aGUgbGVuZ3RoIG9mIDpjOmRhdGE6YG5kaW1gLiAgSWYgdGhlc2UKICAgICAgIHN1Ym9mZnNldCBudW1iZXJzIGFyZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCwgdGhlbiB0aGUgdmFsdWUgc3RvcmVkCiAgICAgICBhbG9uZyB0aGUgaW5kaWNhdGVkIGRpbWVuc2lvbiBpcyBhIHBvaW50ZXIgYW5kIHRoZSBzdWJvZmZzZXQgdmFsdWUKICAgICAgIGRpY3RhdGVzIGhvdyBtYW55IGJ5dGVzIHRvIGFkZCB0byB0aGUgcG9pbnRlciBhZnRlciBkZS1yZWZlcmVuY2luZy4gQQpAQCAtMTE0LDE2ICsxMTYsMTYgQEAKICAgICAgICAgICAgfQogCiAKLSAgIC4uIGNtZW1iZXI6OiBQeV9zc2l6ZV90IGl0ZW1zaXplCisgICAuLiBjOm1lbWJlcjo6IFB5X3NzaXplX3QgaXRlbXNpemUKIAogICAgICAgVGhpcyBpcyBhIHN0b3JhZ2UgZm9yIHRoZSBpdGVtc2l6ZSAoaW4gYnl0ZXMpIG9mIGVhY2ggZWxlbWVudCBvZiB0aGUKICAgICAgIHNoYXJlZCBtZW1vcnkuIEl0IGlzIHRlY2huaWNhbGx5IHVuLW5lY2Vzc2FyeSBhcyBpdCBjYW4gYmUgb2J0YWluZWQKLSAgICAgIHVzaW5nIDpjZnVuYzpgUHlCdWZmZXJfU2l6ZUZyb21Gb3JtYXRgLCBob3dldmVyIGFuIGV4cG9ydGVyIG1heSBrbm93CisgICAgICB1c2luZyA6YzpmdW5jOmBQeUJ1ZmZlcl9TaXplRnJvbUZvcm1hdGAsIGhvd2V2ZXIgYW4gZXhwb3J0ZXIgbWF5IGtub3cKICAgICAgIHRoaXMgaW5mb3JtYXRpb24gd2l0aG91dCBwYXJzaW5nIHRoZSBmb3JtYXQgc3RyaW5nIGFuZCBpdCBpcyBuZWNlc3NhcnkKICAgICAgIHRvIGtub3cgdGhlIGl0ZW1zaXplIGZvciBwcm9wZXIgaW50ZXJwcmV0YXRpb24gb2Ygc3RyaWRpbmcuIFRoZXJlZm9yZSwKICAgICAgIHN0b3JpbmcgaXQgaXMgbW9yZSBjb252ZW5pZW50IGFuZCBmYXN0ZXIuCiAKLSAgIC4uIGNtZW1iZXI6OiB2b2lkICppbnRlcm5hbAorICAgLi4gYzptZW1iZXI6OiB2b2lkICppbnRlcm5hbAogCiAgICAgICBUaGlzIGlzIGZvciB1c2UgaW50ZXJuYWxseSBieSB0aGUgZXhwb3J0aW5nIG9iamVjdC4gRm9yIGV4YW1wbGUsIHRoaXMKICAgICAgIG1pZ2h0IGJlIHJlLWNhc3QgYXMgYW4gaW50ZWdlciBieSB0aGUgZXhwb3J0ZXIgYW5kIHVzZWQgdG8gc3RvcmUgZmxhZ3MKQEAgLTEzNiwxNCArMTM4LDE0IEBACiA9PT09PT09PT09PT09PT09PT09PT09PT0KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlPYmplY3RfQ2hlY2tCdWZmZXIoUHlPYmplY3QgKm9iaikKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlPYmplY3RfQ2hlY2tCdWZmZXIoUHlPYmplY3QgKm9iaikKIAogICAgUmV0dXJuIDEgaWYgKm9iaiogc3VwcG9ydHMgdGhlIGJ1ZmZlciBpbnRlcmZhY2Ugb3RoZXJ3aXNlIDAuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5T2JqZWN0X0dldEJ1ZmZlcihQeU9iamVjdCAqb2JqLCBQeV9idWZmZXIgKnZpZXcsIGludCBmbGFncykKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlPYmplY3RfR2V0QnVmZmVyKFB5T2JqZWN0ICpvYmosIFB5X2J1ZmZlciAqdmlldywgaW50IGZsYWdzKQogCi0gICAgICBFeHBvcnQgKm9iaiogaW50byBhIDpjdHlwZTpgUHlfYnVmZmVyYCwgKnZpZXcqLiAgVGhlc2UgYXJndW1lbnRzIG11c3QKKyAgICAgIEV4cG9ydCAqb2JqKiBpbnRvIGEgOmM6dHlwZTpgUHlfYnVmZmVyYCwgKnZpZXcqLiAgVGhlc2UgYXJndW1lbnRzIG11c3QKICAgICAgIG5ldmVyIGJlICpOVUxMKi4gIFRoZSAqZmxhZ3MqIGFyZ3VtZW50IGlzIGEgYml0IGZpZWxkIGluZGljYXRpbmcgd2hhdAogICAgICAga2luZCBvZiBidWZmZXIgdGhlIGNhbGxlciBpcyBwcmVwYXJlZCB0byBkZWFsIHdpdGggYW5kIHRoZXJlZm9yZSB3aGF0CiAgICAgICBraW5kIG9mIGJ1ZmZlciB0aGUgZXhwb3J0ZXIgaXMgYWxsb3dlZCB0byByZXR1cm4uICBUaGUgYnVmZmVyIGludGVyZmFjZQpAQCAtMTU2LDEzMSArMTU4LDEzMSBAQAogICAgICAganVzdCBub3QgcG9zc2libGUuIFRoZXNlIGVycm9ycyBzaG91bGQgYmUgYSA6ZXhjOmBCdWZmZXJFcnJvcmAgdW5sZXNzCiAgICAgICB0aGVyZSBpcyBhbm90aGVyIGVycm9yIHRoYXQgaXMgYWN0dWFsbHkgY2F1c2luZyB0aGUgcHJvYmxlbS4gVGhlCiAgICAgICBleHBvcnRlciBjYW4gdXNlIGZsYWdzIGluZm9ybWF0aW9uIHRvIHNpbXBsaWZ5IGhvdyBtdWNoIG9mIHRoZQotICAgICAgOmNkYXRhOmBQeV9idWZmZXJgIHN0cnVjdHVyZSBpcyBmaWxsZWQgaW4gd2l0aCBub24tZGVmYXVsdCB2YWx1ZXMgYW5kL29yCisgICAgICA6YzpkYXRhOmBQeV9idWZmZXJgIHN0cnVjdHVyZSBpcyBmaWxsZWQgaW4gd2l0aCBub24tZGVmYXVsdCB2YWx1ZXMgYW5kL29yCiAgICAgICByYWlzZSBhbiBlcnJvciBpZiB0aGUgb2JqZWN0IGNhbid0IHN1cHBvcnQgYSBzaW1wbGVyIHZpZXcgb2YgaXRzIG1lbW9yeS4KIAogICAgICAgMCBpcyByZXR1cm5lZCBvbiBzdWNjZXNzIGFuZCAtMSBvbiBlcnJvci4KIAogICAgICAgVGhlIGZvbGxvd2luZyB0YWJsZSBnaXZlcyBwb3NzaWJsZSB2YWx1ZXMgdG8gdGhlICpmbGFncyogYXJndW1lbnRzLgogCi0gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgICAgIHwgRmxhZyAgICAgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCi0gICAgICB8IDpjbWFjcm86YFB5QlVGX1NJTVBMRWAgICAgICAgfCBUaGlzIGlzIHRoZSBkZWZhdWx0IGZsYWcgc3RhdGUuICBUaGUgcmV0dXJuZWQgICAgIHwKLSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJ1ZmZlciBtYXkgb3IgbWF5IG5vdCBoYXZlIHdyaXRhYmxlIG1lbW9yeS4gIFRoZSAgfAotICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZm9ybWF0IG9mIHRoZSBkYXRhIHdpbGwgYmUgYXNzdW1lZCB0byBiZSB1bnNpZ25lZCB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBieXRlcy4gIFRoaXMgaXMgYSAic3RhbmQtYWxvbmUiIGZsYWcgY29uc3RhbnQuIEl0IHwKLSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG5ldmVyIG5lZWRzIHRvIGJlICd8J2QgdG8gdGhlIG90aGVycy4gVGhlIGV4cG9ydGVyfAotICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd2lsbCByYWlzZSBhbiBlcnJvciBpZiBpdCBjYW5ub3QgcHJvdmlkZSBzdWNoIGEgICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjb250aWd1b3VzIGJ1ZmZlciBvZiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICAgICB8IDpjbWFjcm86YFB5QlVGX1dSSVRBQkxFYCAgICAgfCBUaGUgcmV0dXJuZWQgYnVmZmVyIG11c3QgYmUgd3JpdGFibGUuICBJZiBpdCBpcyAgIHwKLSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG5vdCB3cml0YWJsZSwgdGhlbiByYWlzZSBhbiBlcnJvci4gICAgICAgICAgICAgICAgfAotICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICAgICB8IDpjbWFjcm86YFB5QlVGX1NUUklERVNgICAgICAgfCBUaGlzIGltcGxpZXMgOmNtYWNybzpgUHlCVUZfTkRgLiBUaGUgcmV0dXJuZWQgICAgIHwKLSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJ1ZmZlciBtdXN0IHByb3ZpZGUgc3RyaWRlcyBpbmZvcm1hdGlvbiAoaS5lLiB0aGUgfAotICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaWRlcyBjYW5ub3QgYmUgTlVMTCkuIFRoaXMgd291bGQgYmUgdXNlZCB3aGVuICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0aGUgY29uc3VtZXIgY2FuIGhhbmRsZSBzdHJpZGVkLCBkaXNjb250aWd1b3VzICAgIHwKLSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFycmF5cy4gIEhhbmRsaW5nIHN0cmlkZXMgYXV0b21hdGljYWxseSBhc3N1bWVzICAgfAotICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeW91IGNhbiBoYW5kbGUgc2hhcGUuICBUaGUgZXhwb3J0ZXIgY2FuIHJhaXNlIGFuICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlcnJvciBpZiBhIHN0cmlkZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRhdGEgaXMgIHwKLSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG5vdCBwb3NzaWJsZSAoaS5lLiB3aXRob3V0IHRoZSBzdWJvZmZzZXRzKS4gICAgICAgfAotICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgICAgIHwgOmNtYWNybzpgUHlCVUZfTkRgICAgICAgICAgICB8IFRoZSByZXR1cm5lZCBidWZmZXIgbXVzdCBwcm92aWRlIHNoYXBlICAgICAgICAgICAgfAotICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW5mb3JtYXRpb24uIFRoZSBtZW1vcnkgd2lsbCBiZSBhc3N1bWVkIEMtc3R5bGUgICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjb250aWd1b3VzIChsYXN0IGRpbWVuc2lvbiB2YXJpZXMgdGhlICAgICAgICAgICAgIHwKLSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZhc3Rlc3QpLiBUaGUgZXhwb3J0ZXIgbWF5IHJhaXNlIGFuIGVycm9yIGlmIGl0ICAgfAotICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2Fubm90IHByb3ZpZGUgdGhpcyBraW5kIG9mIGNvbnRpZ3VvdXMgYnVmZmVyLiBJZiB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0aGlzIGlzIG5vdCBnaXZlbiB0aGVuIHNoYXBlIHdpbGwgYmUgKk5VTEwqLiAgICAgIHwKLSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICAgfDpjbWFjcm86YFB5QlVGX0NfQ09OVElHVU9VU2AgIHwgVGhlc2UgZmxhZ3MgaW5kaWNhdGUgdGhhdCB0aGUgY29udGlndWl0eSByZXR1cm5lZCB8Ci0gICAgICB8OmNtYWNybzpgUHlCVUZfRl9DT05USUdVT1VTYCAgfCBidWZmZXIgbXVzdCBiZSByZXNwZWN0aXZlbHksIEMtY29udGlndW91cyAobGFzdCAgIHwKLSAgICAgIHw6Y21hY3JvOmBQeUJVRl9BTllfQ09OVElHVU9VU2B8IGRpbWVuc2lvbiB2YXJpZXMgdGhlIGZhc3Rlc3QpLCBGb3J0cmFuIGNvbnRpZ3VvdXMgfAotICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKGZpcnN0IGRpbWVuc2lvbiB2YXJpZXMgdGhlIGZhc3Rlc3QpIG9yIGVpdGhlciAgICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvbmUuICBBbGwgb2YgdGhlc2UgZmxhZ3MgaW1wbHkgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDpjbWFjcm86YFB5QlVGX1NUUklERVNgIGFuZCBndWFyYW50ZWUgdGhhdCB0aGUgICAgfAotICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaWRlcyBidWZmZXIgaW5mbyBzdHJ1Y3R1cmUgd2lsbCBiZSBmaWxsZWQgaW4gICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjb3JyZWN0bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICAgICB8IDpjbWFjcm86YFB5QlVGX0lORElSRUNUYCAgICAgfCBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoZSByZXR1cm5lZCBidWZmZXIgbXVzdCBoYXZlIHwKLSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN1Ym9mZnNldHMgaW5mb3JtYXRpb24gKHdoaWNoIGNhbiBiZSBOVUxMIGlmIG5vICAgfAotICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3Vib2Zmc2V0cyBhcmUgbmVlZGVkKS4gIFRoaXMgY2FuIGJlIHVzZWQgd2hlbiAgICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0aGUgY29uc3VtZXIgY2FuIGhhbmRsZSBpbmRpcmVjdCBhcnJheSAgICAgICAgICAgIHwKLSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlZmVyZW5jaW5nIGltcGxpZWQgYnkgdGhlc2Ugc3Vib2Zmc2V0cy4gVGhpcyAgICAgfAotICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW1wbGllcyA6Y21hY3JvOmBQeUJVRl9TVFJJREVTYC4gICAgICAgICAgICAgICAgICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgICAgIHwgOmNtYWNybzpgUHlCVUZfRk9STUFUYCAgICAgICB8IFRoZSByZXR1cm5lZCBidWZmZXIgbXVzdCBoYXZlIHRydWUgZm9ybWF0ICAgICAgICAgfAotICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW5mb3JtYXRpb24gaWYgdGhpcyBmbGFnIGlzIHByb3ZpZGVkLiBUaGlzIHdvdWxkICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiZSB1c2VkIHdoZW4gdGhlIGNvbnN1bWVyIGlzIGdvaW5nIHRvIGJlIGNoZWNraW5nIHwKLSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZvciB3aGF0ICdraW5kJyBvZiBkYXRhIGlzIGFjdHVhbGx5IHN0b3JlZC4gQW4gICAgfAotICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZXhwb3J0ZXIgc2hvdWxkIGFsd2F5cyBiZSBhYmxlIHRvIHByb3ZpZGUgdGhpcyAgICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbmZvcm1hdGlvbiBpZiByZXF1ZXN0ZWQuIElmIGZvcm1hdCBpcyBub3QgICAgICAgIHwKLSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGV4cGxpY2l0bHkgcmVxdWVzdGVkIHRoZW4gdGhlIGZvcm1hdCBtdXN0IGJlICAgICAgfAotICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmV0dXJuZWQgYXMgKk5VTEwqICh3aGljaCBtZWFucyBgYCdCJ2BgLCBvciAgICAgICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1bnNpZ25lZCBieXRlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICAgfCA6Y21hY3JvOmBQeUJVRl9TVFJJREVEYCAgICAgIHwgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBgKFB5QlVGX1NUUklERVMgfCAgICAgICAgICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQeUJVRl9XUklUQUJMRSlgYC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICAgfCA6Y21hY3JvOmBQeUJVRl9TVFJJREVEX1JPYCAgIHwgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBgKFB5QlVGX1NUUklERVMpYGAuICAgICAgICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICAgfCA6Y21hY3JvOmBQeUJVRl9SRUNPUkRTYCAgICAgIHwgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBgKFB5QlVGX1NUUklERVMgfCAgICAgICAgICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQeUJVRl9GT1JNQVQgfCBQeUJVRl9XUklUQUJMRSlgYC4gICAgICAgICAgICAgICAgIHwKLSAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICAgfCA6Y21hY3JvOmBQeUJVRl9SRUNPUkRTX1JPYCAgIHwgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBgKFB5QlVGX1NUUklERVMgfCAgICAgICAgICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQeUJVRl9GT1JNQVQpYGAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICAgfCA6Y21hY3JvOmBQeUJVRl9GVUxMYCAgICAgICAgIHwgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBgKFB5QlVGX0lORElSRUNUIHwgICAgICAgICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQeUJVRl9GT1JNQVQgfCBQeUJVRl9XUklUQUJMRSlgYC4gICAgICAgICAgICAgICAgIHwKLSAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICAgfCA6Y21hY3JvOmBQeUJVRl9GVUxMX1JPYCAgICAgIHwgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBgKFB5QlVGX0lORElSRUNUIHwgICAgICAgICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQeUJVRl9GT1JNQVQpYGAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICAgfCA6Y21hY3JvOmBQeUJVRl9DT05USUdgICAgICAgIHwgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBgKFB5QlVGX05EIHwgICAgICAgICAgICAgICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQeUJVRl9XUklUQUJMRSlgYC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICAgfCA6Y21hY3JvOmBQeUJVRl9DT05USUdfUk9gICAgIHwgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBgKFB5QlVGX05EKWBgLiAgICAgICAgICAgICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgfCBGbGFnICAgICAgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KworICAgICAgfCA6YzptYWNybzpgUHlCVUZfU0lNUExFYCAgICAgICB8IFRoaXMgaXMgdGhlIGRlZmF1bHQgZmxhZyBzdGF0ZS4gIFRoZSByZXR1cm5lZCAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJ1ZmZlciBtYXkgb3IgbWF5IG5vdCBoYXZlIHdyaXRhYmxlIG1lbW9yeS4gIFRoZSAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZvcm1hdCBvZiB0aGUgZGF0YSB3aWxsIGJlIGFzc3VtZWQgdG8gYmUgdW5zaWduZWQgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJ5dGVzLiAgVGhpcyBpcyBhICJzdGFuZC1hbG9uZSIgZmxhZyBjb25zdGFudC4gSXQgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG5ldmVyIG5lZWRzIHRvIGJlICd8J2QgdG8gdGhlIG90aGVycy4gVGhlIGV4cG9ydGVyfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHdpbGwgcmFpc2UgYW4gZXJyb3IgaWYgaXQgY2Fubm90IHByb3ZpZGUgc3VjaCBhICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNvbnRpZ3VvdXMgYnVmZmVyIG9mIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgfCA6YzptYWNybzpgUHlCVUZfV1JJVEFCTEVgICAgICB8IFRoZSByZXR1cm5lZCBidWZmZXIgbXVzdCBiZSB3cml0YWJsZS4gIElmIGl0IGlzICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG5vdCB3cml0YWJsZSwgdGhlbiByYWlzZSBhbiBlcnJvci4gICAgICAgICAgICAgICAgfAorICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgfCA6YzptYWNybzpgUHlCVUZfU1RSSURFU2AgICAgICB8IFRoaXMgaW1wbGllcyA6YzptYWNybzpgUHlCVUZfTkRgLiBUaGUgcmV0dXJuZWQgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJ1ZmZlciBtdXN0IHByb3ZpZGUgc3RyaWRlcyBpbmZvcm1hdGlvbiAoaS5lLiB0aGUgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmlkZXMgY2Fubm90IGJlIE5VTEwpLiBUaGlzIHdvdWxkIGJlIHVzZWQgd2hlbiAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoZSBjb25zdW1lciBjYW4gaGFuZGxlIHN0cmlkZWQsIGRpc2NvbnRpZ3VvdXMgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFycmF5cy4gIEhhbmRsaW5nIHN0cmlkZXMgYXV0b21hdGljYWxseSBhc3N1bWVzICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHlvdSBjYW4gaGFuZGxlIHNoYXBlLiAgVGhlIGV4cG9ydGVyIGNhbiByYWlzZSBhbiAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVycm9yIGlmIGEgc3RyaWRlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGF0YSBpcyAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG5vdCBwb3NzaWJsZSAoaS5lLiB3aXRob3V0IHRoZSBzdWJvZmZzZXRzKS4gICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgfCA6YzptYWNybzpgUHlCVUZfTkRgICAgICAgICAgICB8IFRoZSByZXR1cm5lZCBidWZmZXIgbXVzdCBwcm92aWRlIHNoYXBlICAgICAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGluZm9ybWF0aW9uLiBUaGUgbWVtb3J5IHdpbGwgYmUgYXNzdW1lZCBDLXN0eWxlICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNvbnRpZ3VvdXMgKGxhc3QgZGltZW5zaW9uIHZhcmllcyB0aGUgICAgICAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZhc3Rlc3QpLiBUaGUgZXhwb3J0ZXIgbWF5IHJhaXNlIGFuIGVycm9yIGlmIGl0ICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNhbm5vdCBwcm92aWRlIHRoaXMga2luZCBvZiBjb250aWd1b3VzIGJ1ZmZlci4gSWYgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoaXMgaXMgbm90IGdpdmVuIHRoZW4gc2hhcGUgd2lsbCBiZSAqTlVMTCouICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgfDpjOm1hY3JvOmBQeUJVRl9DX0NPTlRJR1VPVVNgICB8IFRoZXNlIGZsYWdzIGluZGljYXRlIHRoYXQgdGhlIGNvbnRpZ3VpdHkgcmV0dXJuZWQgfAorICAgICAgfDpjOm1hY3JvOmBQeUJVRl9GX0NPTlRJR1VPVVNgICB8IGJ1ZmZlciBtdXN0IGJlIHJlc3BlY3RpdmVseSwgQy1jb250aWd1b3VzIChsYXN0ICAgfAorICAgICAgfDpjOm1hY3JvOmBQeUJVRl9BTllfQ09OVElHVU9VU2B8IGRpbWVuc2lvbiB2YXJpZXMgdGhlIGZhc3Rlc3QpLCBGb3J0cmFuIGNvbnRpZ3VvdXMgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChmaXJzdCBkaW1lbnNpb24gdmFyaWVzIHRoZSBmYXN0ZXN0KSBvciBlaXRoZXIgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9uZS4gIEFsbCBvZiB0aGVzZSBmbGFncyBpbXBseSAgICAgICAgICAgICAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDpjOm1hY3JvOmBQeUJVRl9TVFJJREVTYCBhbmQgZ3VhcmFudGVlIHRoYXQgdGhlICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmlkZXMgYnVmZmVyIGluZm8gc3RydWN0dXJlIHdpbGwgYmUgZmlsbGVkIGluICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNvcnJlY3RseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgfCA6YzptYWNybzpgUHlCVUZfSU5ESVJFQ1RgICAgICB8IFRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhlIHJldHVybmVkIGJ1ZmZlciBtdXN0IGhhdmUgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN1Ym9mZnNldHMgaW5mb3JtYXRpb24gKHdoaWNoIGNhbiBiZSBOVUxMIGlmIG5vICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN1Ym9mZnNldHMgYXJlIG5lZWRlZCkuICBUaGlzIGNhbiBiZSB1c2VkIHdoZW4gICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoZSBjb25zdW1lciBjYW4gaGFuZGxlIGluZGlyZWN0IGFycmF5ICAgICAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlZmVyZW5jaW5nIGltcGxpZWQgYnkgdGhlc2Ugc3Vib2Zmc2V0cy4gVGhpcyAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGltcGxpZXMgOmM6bWFjcm86YFB5QlVGX1NUUklERVNgLiAgICAgICAgICAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgfCA6YzptYWNybzpgUHlCVUZfRk9STUFUYCAgICAgICB8IFRoZSByZXR1cm5lZCBidWZmZXIgbXVzdCBoYXZlIHRydWUgZm9ybWF0ICAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGluZm9ybWF0aW9uIGlmIHRoaXMgZmxhZyBpcyBwcm92aWRlZC4gVGhpcyB3b3VsZCAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJlIHVzZWQgd2hlbiB0aGUgY29uc3VtZXIgaXMgZ29pbmcgdG8gYmUgY2hlY2tpbmcgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZvciB3aGF0ICdraW5kJyBvZiBkYXRhIGlzIGFjdHVhbGx5IHN0b3JlZC4gQW4gICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGV4cG9ydGVyIHNob3VsZCBhbHdheXMgYmUgYWJsZSB0byBwcm92aWRlIHRoaXMgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGluZm9ybWF0aW9uIGlmIHJlcXVlc3RlZC4gSWYgZm9ybWF0IGlzIG5vdCAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGV4cGxpY2l0bHkgcmVxdWVzdGVkIHRoZW4gdGhlIGZvcm1hdCBtdXN0IGJlICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJldHVybmVkIGFzICpOVUxMKiAod2hpY2ggbWVhbnMgYGAnQidgYCwgb3IgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHVuc2lnbmVkIGJ5dGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgfCA6YzptYWNybzpgUHlCVUZfU1RSSURFRGAgICAgICB8IFRoaXMgaXMgZXF1aXZhbGVudCB0byBgYChQeUJVRl9TVFJJREVTIHwgICAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFB5QlVGX1dSSVRBQkxFKWBgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgfCA6YzptYWNybzpgUHlCVUZfU1RSSURFRF9ST2AgICB8IFRoaXMgaXMgZXF1aXZhbGVudCB0byBgYChQeUJVRl9TVFJJREVTKWBgLiAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgfCA6YzptYWNybzpgUHlCVUZfUkVDT1JEU2AgICAgICB8IFRoaXMgaXMgZXF1aXZhbGVudCB0byBgYChQeUJVRl9TVFJJREVTIHwgICAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFB5QlVGX0ZPUk1BVCB8IFB5QlVGX1dSSVRBQkxFKWBgLiAgICAgICAgICAgICAgICAgfAorICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgfCA6YzptYWNybzpgUHlCVUZfUkVDT1JEU19ST2AgICB8IFRoaXMgaXMgZXF1aXZhbGVudCB0byBgYChQeUJVRl9TVFJJREVTIHwgICAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFB5QlVGX0ZPUk1BVClgYC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgfCA6YzptYWNybzpgUHlCVUZfRlVMTGAgICAgICAgICB8IFRoaXMgaXMgZXF1aXZhbGVudCB0byBgYChQeUJVRl9JTkRJUkVDVCB8ICAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFB5QlVGX0ZPUk1BVCB8IFB5QlVGX1dSSVRBQkxFKWBgLiAgICAgICAgICAgICAgICAgfAorICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgfCA6YzptYWNybzpgUHlCVUZfRlVMTF9ST2AgICAgICB8IFRoaXMgaXMgZXF1aXZhbGVudCB0byBgYChQeUJVRl9JTkRJUkVDVCB8ICAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFB5QlVGX0ZPUk1BVClgYC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgfCA6YzptYWNybzpgUHlCVUZfQ09OVElHYCAgICAgICB8IFRoaXMgaXMgZXF1aXZhbGVudCB0byBgYChQeUJVRl9ORCB8ICAgICAgICAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFB5QlVGX1dSSVRBQkxFKWBgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgfCA6YzptYWNybzpgUHlCVUZfQ09OVElHX1JPYCAgICB8IFRoaXMgaXMgZXF1aXZhbGVudCB0byBgYChQeUJVRl9ORClgYC4gICAgICAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgUHlCdWZmZXJfUmVsZWFzZShQeV9idWZmZXIgKnZpZXcpCisuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeUJ1ZmZlcl9SZWxlYXNlKFB5X2J1ZmZlciAqdmlldykKIAogICAgUmVsZWFzZSB0aGUgYnVmZmVyICp2aWV3Ki4gIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBidWZmZXIKICAgIGlzIG5vIGxvbmdlciBiZWluZyB1c2VkIGFzIGl0IG1heSBmcmVlIG1lbW9yeSBmcm9tIGl0LgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5X3NzaXplX3QgUHlCdWZmZXJfU2l6ZUZyb21Gb3JtYXQoY29uc3QgY2hhciAqKQorLi4gYzpmdW5jdGlvbjo6IFB5X3NzaXplX3QgUHlCdWZmZXJfU2l6ZUZyb21Gb3JtYXQoY29uc3QgY2hhciAqKQogCi0gICBSZXR1cm4gdGhlIGltcGxpZWQgOmNkYXRhOmB+UHlfYnVmZmVyLml0ZW1zaXplYCBmcm9tIHRoZSBzdHJ1Y3Qtc3R5cGUKLSAgIDpjZGF0YTpgflB5X2J1ZmZlci5mb3JtYXRgLgorICAgUmV0dXJuIHRoZSBpbXBsaWVkIDpjOmRhdGE6YH5QeV9idWZmZXIuaXRlbXNpemVgIGZyb20gdGhlIHN0cnVjdC1zdHlwZQorICAgOmM6ZGF0YTpgflB5X2J1ZmZlci5mb3JtYXRgLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUJ1ZmZlcl9Jc0NvbnRpZ3VvdXMoUHlfYnVmZmVyICp2aWV3LCBjaGFyIGZvcnRyYW4pCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5QnVmZmVyX0lzQ29udGlndW91cyhQeV9idWZmZXIgKnZpZXcsIGNoYXIgZm9ydHJhbikKIAogICAgUmV0dXJuIDEgaWYgdGhlIG1lbW9yeSBkZWZpbmVkIGJ5IHRoZSAqdmlldyogaXMgQy1zdHlsZSAoKmZvcnRyYW4qIGlzCiAgICBgYCdDJ2BgKSBvciBGb3J0cmFuLXN0eWxlICgqZm9ydHJhbiogaXMgYGAnRidgYCkgY29udGlndW91cyBvciBlaXRoZXIgb25lCiAgICAoKmZvcnRyYW4qIGlzIGBgJ0EnYGApLiAgUmV0dXJuIDAgb3RoZXJ3aXNlLgogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgUHlCdWZmZXJfRmlsbENvbnRpZ3VvdXNTdHJpZGVzKGludCBuZGltLCBQeV9zc2l6ZV90ICpzaGFwZSwgUHlfc3NpemVfdCAqc3RyaWRlcywgUHlfc3NpemVfdCBpdGVtc2l6ZSwgY2hhciBmb3J0cmFuKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlCdWZmZXJfRmlsbENvbnRpZ3VvdXNTdHJpZGVzKGludCBuZGltLCBQeV9zc2l6ZV90ICpzaGFwZSwgUHlfc3NpemVfdCAqc3RyaWRlcywgUHlfc3NpemVfdCBpdGVtc2l6ZSwgY2hhciBmb3J0cmFuKQogCiAgICBGaWxsIHRoZSAqc3RyaWRlcyogYXJyYXkgd2l0aCBieXRlLXN0cmlkZXMgb2YgYSBjb250aWd1b3VzIChDLXN0eWxlIGlmCiAgICAqZm9ydHJhbiogaXMgYGAnQydgYCBvciBGb3J0cmFuLXN0eWxlIGlmICpmb3J0cmFuKiBpcyBgYCdGJ2BgKSBhcnJheSBvZiB0aGUKICAgIGdpdmVuIHNoYXBlIHdpdGggdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcyBwZXIgZWxlbWVudC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlCdWZmZXJfRmlsbEluZm8oUHlfYnVmZmVyICp2aWV3LCBQeU9iamVjdCAqb2JqLCB2b2lkICpidWYsIFB5X3NzaXplX3QgbGVuLCBpbnQgcmVhZG9ubHksIGludCBpbmZvZmxhZ3MpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5QnVmZmVyX0ZpbGxJbmZvKFB5X2J1ZmZlciAqdmlldywgUHlPYmplY3QgKm9iaiwgdm9pZCAqYnVmLCBQeV9zc2l6ZV90IGxlbiwgaW50IHJlYWRvbmx5LCBpbnQgaW5mb2ZsYWdzKQogCiAgICBGaWxsIGluIGEgYnVmZmVyLWluZm8gc3RydWN0dXJlLCAqdmlldyosIGNvcnJlY3RseSBmb3IgYW4gZXhwb3J0ZXIgdGhhdCBjYW4KICAgIG9ubHkgc2hhcmUgYSBjb250aWd1b3VzIGNodW5rIG9mIG1lbW9yeSBvZiAidW5zaWduZWQgYnl0ZXMiIG9mIHRoZSBnaXZlbgpAQCAtMjk1LDEzICsyOTcsMTMgQEAKIEEgOmNsYXNzOmBtZW1vcnl2aWV3YCBvYmplY3QgZXhwb3NlcyB0aGUgbmV3IEMgbGV2ZWwgYnVmZmVyIGludGVyZmFjZSBhcyBhCiBQeXRob24gb2JqZWN0IHdoaWNoIGNhbiB0aGVuIGJlIHBhc3NlZCBhcm91bmQgbGlrZSBhbnkgb3RoZXIgb2JqZWN0LgogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCAqUHlNZW1vcnlWaWV3X0Zyb21PYmplY3QoUHlPYmplY3QgKm9iaikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCAqUHlNZW1vcnlWaWV3X0Zyb21PYmplY3QoUHlPYmplY3QgKm9iaikKIAogICAgQ3JlYXRlIGEgbWVtb3J5dmlldyBvYmplY3QgZnJvbSBhbiBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBuZXcgYnVmZmVyCiAgICBpbnRlcmZhY2UuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QgKlB5TWVtb3J5Vmlld19Gcm9tQnVmZmVyKFB5X2J1ZmZlciAqdmlldykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCAqUHlNZW1vcnlWaWV3X0Zyb21CdWZmZXIoUHlfYnVmZmVyICp2aWV3KQogCiAgICBDcmVhdGUgYSBtZW1vcnl2aWV3IG9iamVjdCB3cmFwcGluZyB0aGUgZ2l2ZW4gYnVmZmVyLWluZm8gc3RydWN0dXJlICp2aWV3Ki4KICAgIFRoZSBtZW1vcnl2aWV3IG9iamVjdCB0aGVuIG93bnMgdGhlIGJ1ZmZlciwgd2hpY2ggbWVhbnMgeW91IHNob3VsZG4ndApAQCAtMzA5LDcgKzMxMSw3IEBACiAgICBtZW1vcnl2aWV3IG9iamVjdC4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCAqUHlNZW1vcnlWaWV3X0dldENvbnRpZ3VvdXMoUHlPYmplY3QgKm9iaiwgaW50IGJ1ZmZlcnR5cGUsIGNoYXIgb3JkZXIpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QgKlB5TWVtb3J5Vmlld19HZXRDb250aWd1b3VzKFB5T2JqZWN0ICpvYmosIGludCBidWZmZXJ0eXBlLCBjaGFyIG9yZGVyKQogCiAgICBDcmVhdGUgYSBtZW1vcnl2aWV3IG9iamVjdCB0byBhIGNvbnRpZ3VvdXMgY2h1bmsgb2YgbWVtb3J5IChpbiBlaXRoZXIKICAgICdDJyBvciAnRidvcnRyYW4gKm9yZGVyKikgZnJvbSBhbiBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBidWZmZXIKQEAgLTMxOCwxMyArMzIwLDEzIEBACiAgICBuZXcgYnl0ZXMgb2JqZWN0LgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeU1lbW9yeVZpZXdfQ2hlY2soUHlPYmplY3QgKm9iaikKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlNZW1vcnlWaWV3X0NoZWNrKFB5T2JqZWN0ICpvYmopCiAKICAgIFJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgKm9iaiogaXMgYSBtZW1vcnl2aWV3IG9iamVjdC4gIEl0IGlzIG5vdAogICAgY3VycmVudGx5IGFsbG93ZWQgdG8gY3JlYXRlIHN1YmNsYXNzZXMgb2YgOmNsYXNzOmBtZW1vcnl2aWV3YC4KIAogCi0uLiBjZnVuY3Rpb246OiBQeV9idWZmZXIgKlB5TWVtb3J5Vmlld19HRVRfQlVGRkVSKFB5T2JqZWN0ICpvYmopCisuLiBjOmZ1bmN0aW9uOjogUHlfYnVmZmVyICpQeU1lbW9yeVZpZXdfR0VUX0JVRkZFUihQeU9iamVjdCAqb2JqKQogCiAgICBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBidWZmZXItaW5mbyBzdHJ1Y3R1cmUgd3JhcHBlZCBieSB0aGUgZ2l2ZW4KICAgIG9iamVjdC4gIFRoZSBvYmplY3QgKiptdXN0KiogYmUgYSBtZW1vcnl2aWV3IGluc3RhbmNlOyB0aGlzIG1hY3JvIGRvZXNuJ3QKQEAgLTMzNyw3ICszMzksNyBAQAogLi4gaW5kZXg6OiBzaW5nbGU6IFB5QnVmZmVyUHJvY3MKIAogTW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgb2xkIGJ1ZmZlciBpbnRlcmZhY2UgaXMgcHJvdmlkZWQgaW4gdGhlIHNlY3Rpb24KLTpyZWY6YGJ1ZmZlci1zdHJ1Y3RzYCwgdW5kZXIgdGhlIGRlc2NyaXB0aW9uIGZvciA6Y3R5cGU6YFB5QnVmZmVyUHJvY3NgLgorOnJlZjpgYnVmZmVyLXN0cnVjdHNgLCB1bmRlciB0aGUgZGVzY3JpcHRpb24gZm9yIDpjOnR5cGU6YFB5QnVmZmVyUHJvY3NgLgogCiBBICJidWZmZXIgb2JqZWN0IiBpcyBkZWZpbmVkIGluIHRoZSA6ZmlsZTpgYnVmZmVyb2JqZWN0LmhgIGhlYWRlciAoaW5jbHVkZWQgYnkKIDpmaWxlOmBQeXRob24uaGApLiBUaGVzZSBvYmplY3RzIGxvb2sgdmVyeSBzaW1pbGFyIHRvIHN0cmluZyBvYmplY3RzIGF0IHRoZQpAQCAtMzU2LDM2ICszNTgsMzYgQEAKIG5hdGl2ZSwgaW4tbWVtb3J5IGZvcm1hdC4KIAogCi0uLiBjdHlwZTo6IFB5QnVmZmVyT2JqZWN0CisuLiBjOnR5cGU6OiBQeUJ1ZmZlck9iamVjdAogCi0gICBUaGlzIHN1YnR5cGUgb2YgOmN0eXBlOmBQeU9iamVjdGAgcmVwcmVzZW50cyBhIGJ1ZmZlciBvYmplY3QuCisgICBUaGlzIHN1YnR5cGUgb2YgOmM6dHlwZTpgUHlPYmplY3RgIHJlcHJlc2VudHMgYSBidWZmZXIgb2JqZWN0LgogCiAKLS4uIGN2YXI6OiBQeVR5cGVPYmplY3QgUHlCdWZmZXJfVHlwZQorLi4gYzp2YXI6OiBQeVR5cGVPYmplY3QgUHlCdWZmZXJfVHlwZQogCiAgICAuLiBpbmRleDo6IHNpbmdsZTogQnVmZmVyVHlwZSAoaW4gbW9kdWxlIHR5cGVzKQogCi0gICBUaGUgaW5zdGFuY2Ugb2YgOmN0eXBlOmBQeVR5cGVPYmplY3RgIHdoaWNoIHJlcHJlc2VudHMgdGhlIFB5dGhvbiBidWZmZXIgdHlwZTsKKyAgIFRoZSBpbnN0YW5jZSBvZiA6Yzp0eXBlOmBQeVR5cGVPYmplY3RgIHdoaWNoIHJlcHJlc2VudHMgdGhlIFB5dGhvbiBidWZmZXIgdHlwZTsKICAgIGl0IGlzIHRoZSBzYW1lIG9iamVjdCBhcyBgYGJ1ZmZlcmBgIGFuZCAgYGB0eXBlcy5CdWZmZXJUeXBlYGAgaW4gdGhlIFB5dGhvbgogICAgbGF5ZXIuIC4KIAogCi0uLiBjdmFyOjogaW50IFB5X0VORF9PRl9CVUZGRVIKKy4uIGM6dmFyOjogaW50IFB5X0VORF9PRl9CVUZGRVIKIAogICAgVGhpcyBjb25zdGFudCBtYXkgYmUgcGFzc2VkIGFzIHRoZSAqc2l6ZSogcGFyYW1ldGVyIHRvCi0gICA6Y2Z1bmM6YFB5QnVmZmVyX0Zyb21PYmplY3RgIG9yIDpjZnVuYzpgUHlCdWZmZXJfRnJvbVJlYWRXcml0ZU9iamVjdGAuICBJdAotICAgaW5kaWNhdGVzIHRoYXQgdGhlIG5ldyA6Y3R5cGU6YFB5QnVmZmVyT2JqZWN0YCBzaG91bGQgcmVmZXIgdG8gKmJhc2UqCisgICA6YzpmdW5jOmBQeUJ1ZmZlcl9Gcm9tT2JqZWN0YCBvciA6YzpmdW5jOmBQeUJ1ZmZlcl9Gcm9tUmVhZFdyaXRlT2JqZWN0YC4gIEl0CisgICBpbmRpY2F0ZXMgdGhhdCB0aGUgbmV3IDpjOnR5cGU6YFB5QnVmZmVyT2JqZWN0YCBzaG91bGQgcmVmZXIgdG8gKmJhc2UqCiAgICBvYmplY3QgZnJvbSB0aGUgc3BlY2lmaWVkICpvZmZzZXQqIHRvIHRoZSBlbmQgb2YgaXRzIGV4cG9ydGVkIGJ1ZmZlci4KICAgIFVzaW5nIHRoaXMgZW5hYmxlcyB0aGUgY2FsbGVyIHRvIGF2b2lkIHF1ZXJ5aW5nIHRoZSAqYmFzZSogb2JqZWN0IGZvciBpdHMKICAgIGxlbmd0aC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlCdWZmZXJfQ2hlY2soUHlPYmplY3QgKnApCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5QnVmZmVyX0NoZWNrKFB5T2JqZWN0ICpwKQogCi0gICBSZXR1cm4gdHJ1ZSBpZiB0aGUgYXJndW1lbnQgaGFzIHR5cGUgOmNkYXRhOmBQeUJ1ZmZlcl9UeXBlYC4KKyAgIFJldHVybiB0cnVlIGlmIHRoZSBhcmd1bWVudCBoYXMgdHlwZSA6YzpkYXRhOmBQeUJ1ZmZlcl9UeXBlYC4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlCdWZmZXJfRnJvbU9iamVjdChQeU9iamVjdCAqYmFzZSwgUHlfc3NpemVfdCBvZmZzZXQsIFB5X3NzaXplX3Qgc2l6ZSkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlCdWZmZXJfRnJvbU9iamVjdChQeU9iamVjdCAqYmFzZSwgUHlfc3NpemVfdCBvZmZzZXQsIFB5X3NzaXplX3Qgc2l6ZSkKIAogICAgUmV0dXJuIGEgbmV3IHJlYWQtb25seSBidWZmZXIgb2JqZWN0LiAgVGhpcyByYWlzZXMgOmV4YzpgVHlwZUVycm9yYCBpZgogICAgKmJhc2UqIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgcmVhZC1vbmx5IGJ1ZmZlciBwcm90b2NvbCBvciBkb2Vzbid0IHByb3ZpZGUKQEAgLTM5NywyNCArMzk5LDI0IEBACiAgICBsZW5ndGggb2YgdGhlICpiYXNlKiBvYmplY3QncyBleHBvcnRlZCBidWZmZXIgZGF0YS4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Y3R5cGU6YGludGAgdHlwZSBmb3IgKm9mZnNldCogYW5kICpzaXplKi4gVGhpcworICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjOnR5cGU6YGludGAgdHlwZSBmb3IgKm9mZnNldCogYW5kICpzaXplKi4gVGhpcwogICAgICAgbWlnaHQgcmVxdWlyZSBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQKICAgICAgIHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5QnVmZmVyX0Zyb21SZWFkV3JpdGVPYmplY3QoUHlPYmplY3QgKmJhc2UsIFB5X3NzaXplX3Qgb2Zmc2V0LCBQeV9zc2l6ZV90IHNpemUpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5QnVmZmVyX0Zyb21SZWFkV3JpdGVPYmplY3QoUHlPYmplY3QgKmJhc2UsIFB5X3NzaXplX3Qgb2Zmc2V0LCBQeV9zc2l6ZV90IHNpemUpCiAKICAgIFJldHVybiBhIG5ldyB3cml0YWJsZSBidWZmZXIgb2JqZWN0LiAgUGFyYW1ldGVycyBhbmQgZXhjZXB0aW9ucyBhcmUgc2ltaWxhcgotICAgdG8gdGhvc2UgZm9yIDpjZnVuYzpgUHlCdWZmZXJfRnJvbU9iamVjdGAuICBJZiB0aGUgKmJhc2UqIG9iamVjdCBkb2VzIG5vdAorICAgdG8gdGhvc2UgZm9yIDpjOmZ1bmM6YFB5QnVmZmVyX0Zyb21PYmplY3RgLiAgSWYgdGhlICpiYXNlKiBvYmplY3QgZG9lcyBub3QKICAgIGV4cG9ydCB0aGUgd3JpdGVhYmxlIGJ1ZmZlciBwcm90b2NvbCwgdGhlbiA6ZXhjOmBUeXBlRXJyb3JgIGlzIHJhaXNlZC4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Y3R5cGU6YGludGAgdHlwZSBmb3IgKm9mZnNldCogYW5kICpzaXplKi4gVGhpcworICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjOnR5cGU6YGludGAgdHlwZSBmb3IgKm9mZnNldCogYW5kICpzaXplKi4gVGhpcwogICAgICAgbWlnaHQgcmVxdWlyZSBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQKICAgICAgIHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5QnVmZmVyX0Zyb21NZW1vcnkodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5QnVmZmVyX0Zyb21NZW1vcnkodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiAKICAgIFJldHVybiBhIG5ldyByZWFkLW9ubHkgYnVmZmVyIG9iamVjdCB0aGF0IHJlYWRzIGZyb20gYSBzcGVjaWZpZWQgbG9jYXRpb24KICAgIGluIG1lbW9yeSwgd2l0aCBhIHNwZWNpZmllZCBzaXplLiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcKQEAgLTQyNCwyNyArNDI2LDI3IEBACiAgICAqc2l6ZSogcGFyYW1ldGVyOyA6ZXhjOmBWYWx1ZUVycm9yYCB3aWxsIGJlIHJhaXNlZCBpbiB0aGF0IGNhc2UuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUgZm9yICpzaXplKi4gVGhpcyBtaWdodCByZXF1aXJlCisgICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmM6dHlwZTpgaW50YCB0eXBlIGZvciAqc2l6ZSouIFRoaXMgbWlnaHQgcmVxdWlyZQogICAgICAgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5QnVmZmVyX0Zyb21SZWFkV3JpdGVNZW1vcnkodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5QnVmZmVyX0Zyb21SZWFkV3JpdGVNZW1vcnkodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiAKLSAgIFNpbWlsYXIgdG8gOmNmdW5jOmBQeUJ1ZmZlcl9Gcm9tTWVtb3J5YCwgYnV0IHRoZSByZXR1cm5lZCBidWZmZXIgaXMKKyAgIFNpbWlsYXIgdG8gOmM6ZnVuYzpgUHlCdWZmZXJfRnJvbU1lbW9yeWAsIGJ1dCB0aGUgcmV0dXJuZWQgYnVmZmVyIGlzCiAgICB3cml0YWJsZS4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Y3R5cGU6YGludGAgdHlwZSBmb3IgKnNpemUqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgZm9yICpzaXplKi4gVGhpcyBtaWdodCByZXF1aXJlCiAgICAgICBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlCdWZmZXJfTmV3KFB5X3NzaXplX3Qgc2l6ZSkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlCdWZmZXJfTmV3KFB5X3NzaXplX3Qgc2l6ZSkKIAogICAgUmV0dXJuIGEgbmV3IHdyaXRhYmxlIGJ1ZmZlciBvYmplY3QgdGhhdCBtYWludGFpbnMgaXRzIG93biBtZW1vcnkgYnVmZmVyIG9mCiAgICAqc2l6ZSogYnl0ZXMuICA6ZXhjOmBWYWx1ZUVycm9yYCBpcyByZXR1cm5lZCBpZiAqc2l6ZSogaXMgbm90IHplcm8gb3IKICAgIHBvc2l0aXZlLiAgTm90ZSB0aGF0IHRoZSBtZW1vcnkgYnVmZmVyIChhcyByZXR1cm5lZCBieQotICAgOmNmdW5jOmBQeU9iamVjdF9Bc1dyaXRlQnVmZmVyYCkgaXMgbm90IHNwZWNpZmljYWxseSBhbGlnbmVkLgorICAgOmM6ZnVuYzpgUHlPYmplY3RfQXNXcml0ZUJ1ZmZlcmApIGlzIG5vdCBzcGVjaWZpY2FsbHkgYWxpZ25lZC4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Y3R5cGU6YGludGAgdHlwZSBmb3IgKnNpemUqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgZm9yICpzaXplKi4gVGhpcyBtaWdodCByZXF1aXJlCiAgICAgICBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9ieXRlYXJyYXkucnN0IGIvRG9jL2MtYXBpL2J5dGVhcnJheS5yc3QKaW5kZXggYTYwNTA5MS4uODU4YzhkYiAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL2J5dGVhcnJheS5yc3QKKysrIGIvRG9jL2MtYXBpL2J5dGVhcnJheS5yc3QKQEAgLTEwLDI2ICsxMCwyNiBAQAogLi4gdmVyc2lvbmFkZGVkOjogMi42CiAKIAotLi4gY3R5cGU6OiBQeUJ5dGVBcnJheU9iamVjdAorLi4gYzp0eXBlOjogUHlCeXRlQXJyYXlPYmplY3QKIAotICAgVGhpcyBzdWJ0eXBlIG9mIDpjdHlwZTpgUHlPYmplY3RgIHJlcHJlc2VudHMgYSBQeXRob24gYnl0ZWFycmF5IG9iamVjdC4KKyAgIFRoaXMgc3VidHlwZSBvZiA6Yzp0eXBlOmBQeU9iamVjdGAgcmVwcmVzZW50cyBhIFB5dGhvbiBieXRlYXJyYXkgb2JqZWN0LgogCiAKLS4uIGN2YXI6OiBQeVR5cGVPYmplY3QgUHlCeXRlQXJyYXlfVHlwZQorLi4gYzp2YXI6OiBQeVR5cGVPYmplY3QgUHlCeXRlQXJyYXlfVHlwZQogCi0gICBUaGlzIGluc3RhbmNlIG9mIDpjdHlwZTpgUHlUeXBlT2JqZWN0YCByZXByZXNlbnRzIHRoZSBQeXRob24gYnl0ZWFycmF5IHR5cGU7CisgICBUaGlzIGluc3RhbmNlIG9mIDpjOnR5cGU6YFB5VHlwZU9iamVjdGAgcmVwcmVzZW50cyB0aGUgUHl0aG9uIGJ5dGVhcnJheSB0eXBlOwogICAgaXQgaXMgdGhlIHNhbWUgb2JqZWN0IGFzIGBgYnl0ZWFycmF5YGAgaW4gdGhlIFB5dGhvbiBsYXllci4KIAogVHlwZSBjaGVjayBtYWNyb3MKIF5eXl5eXl5eXl5eXl5eXl5eCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUJ5dGVBcnJheV9DaGVjayhQeU9iamVjdCAqbykKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlCeXRlQXJyYXlfQ2hlY2soUHlPYmplY3QgKm8pCiAKICAgIFJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgKm8qIGlzIGEgYnl0ZWFycmF5IG9iamVjdCBvciBhbiBpbnN0YW5jZSBvZiBhCiAgICBzdWJ0eXBlIG9mIHRoZSBieXRlYXJyYXkgdHlwZS4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlCeXRlQXJyYXlfQ2hlY2tFeGFjdChQeU9iamVjdCAqbykKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlCeXRlQXJyYXlfQ2hlY2tFeGFjdChQeU9iamVjdCAqbykKIAogICAgUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCAqbyogaXMgYSBieXRlYXJyYXkgb2JqZWN0LCBidXQgbm90IGFuIGluc3RhbmNlIG9mIGEKICAgIHN1YnR5cGUgb2YgdGhlIGJ5dGVhcnJheSB0eXBlLgpAQCAtMzgsNyArMzgsNyBAQAogRGlyZWN0IEFQSSBmdW5jdGlvbnMKIF5eXl5eXl5eXl5eXl5eXl5eXl5eCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUJ5dGVBcnJheV9Gcm9tT2JqZWN0KFB5T2JqZWN0ICpvKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUJ5dGVBcnJheV9Gcm9tT2JqZWN0KFB5T2JqZWN0ICpvKQogCiAgICBSZXR1cm4gYSBuZXcgYnl0ZWFycmF5IG9iamVjdCBmcm9tIGFueSBvYmplY3QsICpvKiwgdGhhdCBpbXBsZW1lbnRzIHRoZQogICAgYnVmZmVyIHByb3RvY29sLgpAQCAtNDYsMjkgKzQ2LDI5IEBACiAgICAuLiBYWFggZXhwYW5kIGFib3V0IHRoZSBidWZmZXIgcHJvdG9jb2wsIGF0IGxlYXN0IHNvbWV3aGVyZQogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZShjb25zdCBjaGFyICpzdHJpbmcsIFB5X3NzaXplX3QgbGVuKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZShjb25zdCBjaGFyICpzdHJpbmcsIFB5X3NzaXplX3QgbGVuKQogCiAgICBDcmVhdGUgYSBuZXcgYnl0ZWFycmF5IG9iamVjdCBmcm9tICpzdHJpbmcqIGFuZCBpdHMgbGVuZ3RoLCAqbGVuKi4gIE9uCiAgICBmYWlsdXJlLCAqTlVMTCogaXMgcmV0dXJuZWQuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5Qnl0ZUFycmF5X0NvbmNhdChQeU9iamVjdCAqYSwgUHlPYmplY3QgKmIpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5Qnl0ZUFycmF5X0NvbmNhdChQeU9iamVjdCAqYSwgUHlPYmplY3QgKmIpCiAKICAgIENvbmNhdCBieXRlYXJyYXlzICphKiBhbmQgKmIqIGFuZCByZXR1cm4gYSBuZXcgYnl0ZWFycmF5IHdpdGggdGhlIHJlc3VsdC4KIAogCi0uLiBjZnVuY3Rpb246OiBQeV9zc2l6ZV90IFB5Qnl0ZUFycmF5X1NpemUoUHlPYmplY3QgKmJ5dGVhcnJheSkKKy4uIGM6ZnVuY3Rpb246OiBQeV9zc2l6ZV90IFB5Qnl0ZUFycmF5X1NpemUoUHlPYmplY3QgKmJ5dGVhcnJheSkKIAogICAgUmV0dXJuIHRoZSBzaXplIG9mICpieXRlYXJyYXkqIGFmdGVyIGNoZWNraW5nIGZvciBhICpOVUxMKiBwb2ludGVyLgogCiAKLS4uIGNmdW5jdGlvbjo6IGNoYXIqIFB5Qnl0ZUFycmF5X0FzU3RyaW5nKFB5T2JqZWN0ICpieXRlYXJyYXkpCisuLiBjOmZ1bmN0aW9uOjogY2hhciogUHlCeXRlQXJyYXlfQXNTdHJpbmcoUHlPYmplY3QgKmJ5dGVhcnJheSkKIAogICAgUmV0dXJuIHRoZSBjb250ZW50cyBvZiAqYnl0ZWFycmF5KiBhcyBhIGNoYXIgYXJyYXkgYWZ0ZXIgY2hlY2tpbmcgZm9yIGEKICAgICpOVUxMKiBwb2ludGVyLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUJ5dGVBcnJheV9SZXNpemUoUHlPYmplY3QgKmJ5dGVhcnJheSwgUHlfc3NpemVfdCBsZW4pCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5Qnl0ZUFycmF5X1Jlc2l6ZShQeU9iamVjdCAqYnl0ZWFycmF5LCBQeV9zc2l6ZV90IGxlbikKIAogICAgUmVzaXplIHRoZSBpbnRlcm5hbCBidWZmZXIgb2YgKmJ5dGVhcnJheSogdG8gKmxlbiouCiAKQEAgLTc3LDExICs3NywxMSBAQAogCiBUaGVzZSBtYWNyb3MgdHJhZGUgc2FmZXR5IGZvciBzcGVlZCBhbmQgdGhleSBkb24ndCBjaGVjayBwb2ludGVycy4KIAotLi4gY2Z1bmN0aW9uOjogY2hhciogUHlCeXRlQXJyYXlfQVNfU1RSSU5HKFB5T2JqZWN0ICpieXRlYXJyYXkpCisuLiBjOmZ1bmN0aW9uOjogY2hhciogUHlCeXRlQXJyYXlfQVNfU1RSSU5HKFB5T2JqZWN0ICpieXRlYXJyYXkpCiAKLSAgIE1hY3JvIHZlcnNpb24gb2YgOmNmdW5jOmBQeUJ5dGVBcnJheV9Bc1N0cmluZ2AuCisgICBNYWNybyB2ZXJzaW9uIG9mIDpjOmZ1bmM6YFB5Qnl0ZUFycmF5X0FzU3RyaW5nYC4KIAogCi0uLiBjZnVuY3Rpb246OiBQeV9zc2l6ZV90IFB5Qnl0ZUFycmF5X0dFVF9TSVpFKFB5T2JqZWN0ICpieXRlYXJyYXkpCisuLiBjOmZ1bmN0aW9uOjogUHlfc3NpemVfdCBQeUJ5dGVBcnJheV9HRVRfU0laRShQeU9iamVjdCAqYnl0ZWFycmF5KQogCi0gICBNYWNybyB2ZXJzaW9uIG9mIDpjZnVuYzpgUHlCeXRlQXJyYXlfU2l6ZWAuCisgICBNYWNybyB2ZXJzaW9uIG9mIDpjOmZ1bmM6YFB5Qnl0ZUFycmF5X1NpemVgLgpkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL2NhcHN1bGUucnN0IGIvRG9jL2MtYXBpL2NhcHN1bGUucnN0CmluZGV4IDI5MzkzMTQuLjZmNjI1MGYgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS9jYXBzdWxlLnJzdAorKysgYi9Eb2MvYy1hcGkvY2Fwc3VsZS5yc3QKQEAgLTEwLDMzICsxMCwzMyBAQAogUmVmZXIgdG8gOnJlZjpgdXNpbmctY2Fwc3VsZXNgIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHVzaW5nIHRoZXNlIG9iamVjdHMuCiAKIAotLi4gY3R5cGU6OiBQeUNhcHN1bGUKKy4uIGM6dHlwZTo6IFB5Q2Fwc3VsZQogCi0gICBUaGlzIHN1YnR5cGUgb2YgOmN0eXBlOmBQeU9iamVjdGAgcmVwcmVzZW50cyBhbiBvcGFxdWUgdmFsdWUsIHVzZWZ1bCBmb3IgQwotICAgZXh0ZW5zaW9uIG1vZHVsZXMgd2hvIG5lZWQgdG8gcGFzcyBhbiBvcGFxdWUgdmFsdWUgKGFzIGEgOmN0eXBlOmB2b2lkXCpgCisgICBUaGlzIHN1YnR5cGUgb2YgOmM6dHlwZTpgUHlPYmplY3RgIHJlcHJlc2VudHMgYW4gb3BhcXVlIHZhbHVlLCB1c2VmdWwgZm9yIEMKKyAgIGV4dGVuc2lvbiBtb2R1bGVzIHdobyBuZWVkIHRvIHBhc3MgYW4gb3BhcXVlIHZhbHVlIChhcyBhIDpjOnR5cGU6YHZvaWRcKmAKICAgIHBvaW50ZXIpIHRocm91Z2ggUHl0aG9uIGNvZGUgdG8gb3RoZXIgQyBjb2RlLiAgSXQgaXMgb2Z0ZW4gdXNlZCB0byBtYWtlIGEgQwogICAgZnVuY3Rpb24gcG9pbnRlciBkZWZpbmVkIGluIG9uZSBtb2R1bGUgYXZhaWxhYmxlIHRvIG90aGVyIG1vZHVsZXMsIHNvIHRoZQogICAgcmVndWxhciBpbXBvcnQgbWVjaGFuaXNtIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyBDIEFQSXMgZGVmaW5lZCBpbiBkeW5hbWljYWxseQogICAgbG9hZGVkIG1vZHVsZXMuCiAKLS4uIGN0eXBlOjogUHlDYXBzdWxlX0Rlc3RydWN0b3IKKy4uIGM6dHlwZTo6IFB5Q2Fwc3VsZV9EZXN0cnVjdG9yCiAKICAgIFRoZSB0eXBlIG9mIGEgZGVzdHJ1Y3RvciBjYWxsYmFjayBmb3IgYSBjYXBzdWxlLiAgRGVmaW5lZCBhczo6CiAKICAgICAgIHR5cGVkZWYgdm9pZCAoKlB5Q2Fwc3VsZV9EZXN0cnVjdG9yKShQeU9iamVjdCAqKTsKIAotICAgU2VlIDpjZnVuYzpgUHlDYXBzdWxlX05ld2AgZm9yIHRoZSBzZW1hbnRpY3Mgb2YgUHlDYXBzdWxlX0Rlc3RydWN0b3IKKyAgIFNlZSA6YzpmdW5jOmBQeUNhcHN1bGVfTmV3YCBmb3IgdGhlIHNlbWFudGljcyBvZiBQeUNhcHN1bGVfRGVzdHJ1Y3RvcgogICAgY2FsbGJhY2tzLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUNhcHN1bGVfQ2hlY2tFeGFjdChQeU9iamVjdCAqcCkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlDYXBzdWxlX0NoZWNrRXhhY3QoUHlPYmplY3QgKnApCiAKLSAgIFJldHVybiB0cnVlIGlmIGl0cyBhcmd1bWVudCBpcyBhIDpjdHlwZTpgUHlDYXBzdWxlYC4KKyAgIFJldHVybiB0cnVlIGlmIGl0cyBhcmd1bWVudCBpcyBhIDpjOnR5cGU6YFB5Q2Fwc3VsZWAuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5Q2Fwc3VsZV9OZXcodm9pZCAqcG9pbnRlciwgY29uc3QgY2hhciAqbmFtZSwgUHlDYXBzdWxlX0Rlc3RydWN0b3IgZGVzdHJ1Y3RvcikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlDYXBzdWxlX05ldyh2b2lkICpwb2ludGVyLCBjb25zdCBjaGFyICpuYW1lLCBQeUNhcHN1bGVfRGVzdHJ1Y3RvciBkZXN0cnVjdG9yKQogCi0gICBDcmVhdGUgYSA6Y3R5cGU6YFB5Q2Fwc3VsZWAgZW5jYXBzdWxhdGluZyB0aGUgKnBvaW50ZXIqLiAgVGhlICpwb2ludGVyKgorICAgQ3JlYXRlIGEgOmM6dHlwZTpgUHlDYXBzdWxlYCBlbmNhcHN1bGF0aW5nIHRoZSAqcG9pbnRlciouICBUaGUgKnBvaW50ZXIqCiAgICBhcmd1bWVudCBtYXkgbm90IGJlICpOVUxMKi4KIAogICAgT24gZmFpbHVyZSwgc2V0IGFuIGV4Y2VwdGlvbiBhbmQgcmV0dXJuICpOVUxMKi4KQEAgLTUwLDkxICs1MCw5MSBAQAogCiAgICBJZiB0aGlzIGNhcHN1bGUgd2lsbCBiZSBzdG9yZWQgYXMgYW4gYXR0cmlidXRlIG9mIGEgbW9kdWxlLCB0aGUgKm5hbWUqIHNob3VsZAogICAgYmUgc3BlY2lmaWVkIGFzIGBgbW9kdWxlbmFtZS5hdHRyaWJ1dGVuYW1lYGAuICBUaGlzIHdpbGwgZW5hYmxlIG90aGVyIG1vZHVsZXMKLSAgIHRvIGltcG9ydCB0aGUgY2Fwc3VsZSB1c2luZyA6Y2Z1bmM6YFB5Q2Fwc3VsZV9JbXBvcnRgLgorICAgdG8gaW1wb3J0IHRoZSBjYXBzdWxlIHVzaW5nIDpjOmZ1bmM6YFB5Q2Fwc3VsZV9JbXBvcnRgLgogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQqIFB5Q2Fwc3VsZV9HZXRQb2ludGVyKFB5T2JqZWN0ICpjYXBzdWxlLCBjb25zdCBjaGFyICpuYW1lKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQqIFB5Q2Fwc3VsZV9HZXRQb2ludGVyKFB5T2JqZWN0ICpjYXBzdWxlLCBjb25zdCBjaGFyICpuYW1lKQogCiAgICBSZXRyaWV2ZSB0aGUgKnBvaW50ZXIqIHN0b3JlZCBpbiB0aGUgY2Fwc3VsZS4gIE9uIGZhaWx1cmUsIHNldCBhbiBleGNlcHRpb24KICAgIGFuZCByZXR1cm4gKk5VTEwqLgogCiAgICBUaGUgKm5hbWUqIHBhcmFtZXRlciBtdXN0IGNvbXBhcmUgZXhhY3RseSB0byB0aGUgbmFtZSBzdG9yZWQgaW4gdGhlIGNhcHN1bGUuCiAgICBJZiB0aGUgbmFtZSBzdG9yZWQgaW4gdGhlIGNhcHN1bGUgaXMgKk5VTEwqLCB0aGUgKm5hbWUqIHBhc3NlZCBpbiBtdXN0IGFsc28KLSAgIGJlICpOVUxMKi4gIFB5dGhvbiB1c2VzIHRoZSBDIGZ1bmN0aW9uIDpjZnVuYzpgc3RyY21wYCB0byBjb21wYXJlIGNhcHN1bGUKKyAgIGJlICpOVUxMKi4gIFB5dGhvbiB1c2VzIHRoZSBDIGZ1bmN0aW9uIDpjOmZ1bmM6YHN0cmNtcGAgdG8gY29tcGFyZSBjYXBzdWxlCiAgICBuYW1lcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeUNhcHN1bGVfRGVzdHJ1Y3RvciBQeUNhcHN1bGVfR2V0RGVzdHJ1Y3RvcihQeU9iamVjdCAqY2Fwc3VsZSkKKy4uIGM6ZnVuY3Rpb246OiBQeUNhcHN1bGVfRGVzdHJ1Y3RvciBQeUNhcHN1bGVfR2V0RGVzdHJ1Y3RvcihQeU9iamVjdCAqY2Fwc3VsZSkKIAogICAgUmV0dXJuIHRoZSBjdXJyZW50IGRlc3RydWN0b3Igc3RvcmVkIGluIHRoZSBjYXBzdWxlLiAgT24gZmFpbHVyZSwgc2V0IGFuCiAgICBleGNlcHRpb24gYW5kIHJldHVybiAqTlVMTCouCiAKICAgIEl0IGlzIGxlZ2FsIGZvciBhIGNhcHN1bGUgdG8gaGF2ZSBhICpOVUxMKiBkZXN0cnVjdG9yLiAgVGhpcyBtYWtlcyBhICpOVUxMKgotICAgcmV0dXJuIGNvZGUgc29tZXdoYXQgYW1iaWd1b3VzOyB1c2UgOmNmdW5jOmBQeUNhcHN1bGVfSXNWYWxpZGAgb3IKLSAgIDpjZnVuYzpgUHlFcnJfT2NjdXJyZWRgIHRvIGRpc2FtYmlndWF0ZS4KKyAgIHJldHVybiBjb2RlIHNvbWV3aGF0IGFtYmlndW91czsgdXNlIDpjOmZ1bmM6YFB5Q2Fwc3VsZV9Jc1ZhbGlkYCBvcgorICAgOmM6ZnVuYzpgUHlFcnJfT2NjdXJyZWRgIHRvIGRpc2FtYmlndWF0ZS4KIAogCi0uLiBjZnVuY3Rpb246OiB2b2lkKiBQeUNhcHN1bGVfR2V0Q29udGV4dChQeU9iamVjdCAqY2Fwc3VsZSkKKy4uIGM6ZnVuY3Rpb246OiB2b2lkKiBQeUNhcHN1bGVfR2V0Q29udGV4dChQeU9iamVjdCAqY2Fwc3VsZSkKIAogICAgUmV0dXJuIHRoZSBjdXJyZW50IGNvbnRleHQgc3RvcmVkIGluIHRoZSBjYXBzdWxlLiAgT24gZmFpbHVyZSwgc2V0IGFuCiAgICBleGNlcHRpb24gYW5kIHJldHVybiAqTlVMTCouCiAKICAgIEl0IGlzIGxlZ2FsIGZvciBhIGNhcHN1bGUgdG8gaGF2ZSBhICpOVUxMKiBjb250ZXh0LiAgVGhpcyBtYWtlcyBhICpOVUxMKgotICAgcmV0dXJuIGNvZGUgc29tZXdoYXQgYW1iaWd1b3VzOyB1c2UgOmNmdW5jOmBQeUNhcHN1bGVfSXNWYWxpZGAgb3IKLSAgIDpjZnVuYzpgUHlFcnJfT2NjdXJyZWRgIHRvIGRpc2FtYmlndWF0ZS4KKyAgIHJldHVybiBjb2RlIHNvbWV3aGF0IGFtYmlndW91czsgdXNlIDpjOmZ1bmM6YFB5Q2Fwc3VsZV9Jc1ZhbGlkYCBvcgorICAgOmM6ZnVuYzpgUHlFcnJfT2NjdXJyZWRgIHRvIGRpc2FtYmlndWF0ZS4KIAogCi0uLiBjZnVuY3Rpb246OiBjb25zdCBjaGFyKiBQeUNhcHN1bGVfR2V0TmFtZShQeU9iamVjdCAqY2Fwc3VsZSkKKy4uIGM6ZnVuY3Rpb246OiBjb25zdCBjaGFyKiBQeUNhcHN1bGVfR2V0TmFtZShQeU9iamVjdCAqY2Fwc3VsZSkKIAogICAgUmV0dXJuIHRoZSBjdXJyZW50IG5hbWUgc3RvcmVkIGluIHRoZSBjYXBzdWxlLiAgT24gZmFpbHVyZSwgc2V0IGFuIGV4Y2VwdGlvbgogICAgYW5kIHJldHVybiAqTlVMTCouCiAKICAgIEl0IGlzIGxlZ2FsIGZvciBhIGNhcHN1bGUgdG8gaGF2ZSBhICpOVUxMKiBuYW1lLiAgVGhpcyBtYWtlcyBhICpOVUxMKiByZXR1cm4KLSAgIGNvZGUgc29tZXdoYXQgYW1iaWd1b3VzOyB1c2UgOmNmdW5jOmBQeUNhcHN1bGVfSXNWYWxpZGAgb3IKLSAgIDpjZnVuYzpgUHlFcnJfT2NjdXJyZWRgIHRvIGRpc2FtYmlndWF0ZS4KKyAgIGNvZGUgc29tZXdoYXQgYW1iaWd1b3VzOyB1c2UgOmM6ZnVuYzpgUHlDYXBzdWxlX0lzVmFsaWRgIG9yCisgICA6YzpmdW5jOmBQeUVycl9PY2N1cnJlZGAgdG8gZGlzYW1iaWd1YXRlLgogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQqIFB5Q2Fwc3VsZV9JbXBvcnQoY29uc3QgY2hhciAqbmFtZSwgaW50IG5vX2Jsb2NrKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQqIFB5Q2Fwc3VsZV9JbXBvcnQoY29uc3QgY2hhciAqbmFtZSwgaW50IG5vX2Jsb2NrKQogCiAgICBJbXBvcnQgYSBwb2ludGVyIHRvIGEgQyBvYmplY3QgZnJvbSBhIGNhcHN1bGUgYXR0cmlidXRlIGluIGEgbW9kdWxlLiAgVGhlCiAgICAqbmFtZSogcGFyYW1ldGVyIHNob3VsZCBzcGVjaWZ5IHRoZSBmdWxsIG5hbWUgdG8gdGhlIGF0dHJpYnV0ZSwgYXMgaW4KICAgIGBgbW9kdWxlLmF0dHJpYnV0ZWBgLiAgVGhlICpuYW1lKiBzdG9yZWQgaW4gdGhlIGNhcHN1bGUgbXVzdCBtYXRjaCB0aGlzCiAgICBzdHJpbmcgZXhhY3RseS4gIElmICpub19ibG9jayogaXMgdHJ1ZSwgaW1wb3J0IHRoZSBtb2R1bGUgd2l0aG91dCBibG9ja2luZwotICAgKHVzaW5nIDpjZnVuYzpgUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9ja2ApLiAgSWYgKm5vX2Jsb2NrKiBpcyBmYWxzZSwKLSAgIGltcG9ydCB0aGUgbW9kdWxlIGNvbnZlbnRpb25hbGx5ICh1c2luZyA6Y2Z1bmM6YFB5SW1wb3J0X0ltcG9ydE1vZHVsZWApLgorICAgKHVzaW5nIDpjOmZ1bmM6YFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2tgKS4gIElmICpub19ibG9jayogaXMgZmFsc2UsCisgICBpbXBvcnQgdGhlIG1vZHVsZSBjb252ZW50aW9uYWxseSAodXNpbmcgOmM6ZnVuYzpgUHlJbXBvcnRfSW1wb3J0TW9kdWxlYCkuCiAKICAgIFJldHVybiB0aGUgY2Fwc3VsZSdzIGludGVybmFsICpwb2ludGVyKiBvbiBzdWNjZXNzLiAgT24gZmFpbHVyZSwgc2V0IGFuCi0gICBleGNlcHRpb24gYW5kIHJldHVybiAqTlVMTCouICBIb3dldmVyLCBpZiA6Y2Z1bmM6YFB5Q2Fwc3VsZV9JbXBvcnRgIGZhaWxlZCB0bworICAgZXhjZXB0aW9uIGFuZCByZXR1cm4gKk5VTEwqLiAgSG93ZXZlciwgaWYgOmM6ZnVuYzpgUHlDYXBzdWxlX0ltcG9ydGAgZmFpbGVkIHRvCiAgICBpbXBvcnQgdGhlIG1vZHVsZSwgYW5kICpub19ibG9jayogd2FzIHRydWUsIG5vIGV4Y2VwdGlvbiBpcyBzZXQuCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUNhcHN1bGVfSXNWYWxpZChQeU9iamVjdCAqY2Fwc3VsZSwgY29uc3QgY2hhciAqbmFtZSkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlDYXBzdWxlX0lzVmFsaWQoUHlPYmplY3QgKmNhcHN1bGUsIGNvbnN0IGNoYXIgKm5hbWUpCiAKICAgIERldGVybWluZXMgd2hldGhlciBvciBub3QgKmNhcHN1bGUqIGlzIGEgdmFsaWQgY2Fwc3VsZS4gIEEgdmFsaWQgY2Fwc3VsZSBpcwotICAgbm9uLSpOVUxMKiwgcGFzc2VzIDpjZnVuYzpgUHlDYXBzdWxlX0NoZWNrRXhhY3RgLCBoYXMgYSBub24tKk5VTEwqIHBvaW50ZXIKKyAgIG5vbi0qTlVMTCosIHBhc3NlcyA6YzpmdW5jOmBQeUNhcHN1bGVfQ2hlY2tFeGFjdGAsIGhhcyBhIG5vbi0qTlVMTCogcG9pbnRlcgogICAgc3RvcmVkIGluIGl0LCBhbmQgaXRzIGludGVybmFsIG5hbWUgbWF0Y2hlcyB0aGUgKm5hbWUqIHBhcmFtZXRlci4gIChTZWUKLSAgIDpjZnVuYzpgUHlDYXBzdWxlX0dldFBvaW50ZXJgIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgY2Fwc3VsZSBuYW1lcyBhcmUKKyAgIDpjOmZ1bmM6YFB5Q2Fwc3VsZV9HZXRQb2ludGVyYCBmb3IgaW5mb3JtYXRpb24gb24gaG93IGNhcHN1bGUgbmFtZXMgYXJlCiAgICBjb21wYXJlZC4pCiAKLSAgIEluIG90aGVyIHdvcmRzLCBpZiA6Y2Z1bmM6YFB5Q2Fwc3VsZV9Jc1ZhbGlkYCByZXR1cm5zIGEgdHJ1ZSB2YWx1ZSwgY2FsbHMgdG8KLSAgIGFueSBvZiB0aGUgYWNjZXNzb3JzIChhbnkgZnVuY3Rpb24gc3RhcnRpbmcgd2l0aCA6Y2Z1bmM6YFB5Q2Fwc3VsZV9HZXRgKSBhcmUKKyAgIEluIG90aGVyIHdvcmRzLCBpZiA6YzpmdW5jOmBQeUNhcHN1bGVfSXNWYWxpZGAgcmV0dXJucyBhIHRydWUgdmFsdWUsIGNhbGxzIHRvCisgICBhbnkgb2YgdGhlIGFjY2Vzc29ycyAoYW55IGZ1bmN0aW9uIHN0YXJ0aW5nIHdpdGggOmM6ZnVuYzpgUHlDYXBzdWxlX0dldGApIGFyZQogICAgZ3VhcmFudGVlZCB0byBzdWNjZWVkLgogCiAgICBSZXR1cm4gYSBub256ZXJvIHZhbHVlIGlmIHRoZSBvYmplY3QgaXMgdmFsaWQgYW5kIG1hdGNoZXMgdGhlIG5hbWUgcGFzc2VkIGluLgogICAgUmV0dXJuIDAgb3RoZXJ3aXNlLiAgVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBmYWlsLgogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlDYXBzdWxlX1NldENvbnRleHQoUHlPYmplY3QgKmNhcHN1bGUsIHZvaWQgKmNvbnRleHQpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5Q2Fwc3VsZV9TZXRDb250ZXh0KFB5T2JqZWN0ICpjYXBzdWxlLCB2b2lkICpjb250ZXh0KQogCiAgICBTZXQgdGhlIGNvbnRleHQgcG9pbnRlciBpbnNpZGUgKmNhcHN1bGUqIHRvICpjb250ZXh0Ki4KIAogICAgUmV0dXJuIDAgb24gc3VjY2Vzcy4gIFJldHVybiBub256ZXJvIGFuZCBzZXQgYW4gZXhjZXB0aW9uIG9uIGZhaWx1cmUuCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUNhcHN1bGVfU2V0RGVzdHJ1Y3RvcihQeU9iamVjdCAqY2Fwc3VsZSwgUHlDYXBzdWxlX0Rlc3RydWN0b3IgZGVzdHJ1Y3RvcikKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlDYXBzdWxlX1NldERlc3RydWN0b3IoUHlPYmplY3QgKmNhcHN1bGUsIFB5Q2Fwc3VsZV9EZXN0cnVjdG9yIGRlc3RydWN0b3IpCiAKICAgIFNldCB0aGUgZGVzdHJ1Y3RvciBpbnNpZGUgKmNhcHN1bGUqIHRvICpkZXN0cnVjdG9yKi4KIAogICAgUmV0dXJuIDAgb24gc3VjY2Vzcy4gIFJldHVybiBub256ZXJvIGFuZCBzZXQgYW4gZXhjZXB0aW9uIG9uIGZhaWx1cmUuCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUNhcHN1bGVfU2V0TmFtZShQeU9iamVjdCAqY2Fwc3VsZSwgY29uc3QgY2hhciAqbmFtZSkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlDYXBzdWxlX1NldE5hbWUoUHlPYmplY3QgKmNhcHN1bGUsIGNvbnN0IGNoYXIgKm5hbWUpCiAKICAgIFNldCB0aGUgbmFtZSBpbnNpZGUgKmNhcHN1bGUqIHRvICpuYW1lKi4gIElmIG5vbi0qTlVMTCosIHRoZSBuYW1lIG11c3QKICAgIG91dGxpdmUgdGhlIGNhcHN1bGUuICBJZiB0aGUgcHJldmlvdXMgKm5hbWUqIHN0b3JlZCBpbiB0aGUgY2Fwc3VsZSB3YXMgbm90CkBAIC0xNDIsNyArMTQyLDcgQEAKIAogICAgUmV0dXJuIDAgb24gc3VjY2Vzcy4gIFJldHVybiBub256ZXJvIGFuZCBzZXQgYW4gZXhjZXB0aW9uIG9uIGZhaWx1cmUuCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUNhcHN1bGVfU2V0UG9pbnRlcihQeU9iamVjdCAqY2Fwc3VsZSwgdm9pZCAqcG9pbnRlcikKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlDYXBzdWxlX1NldFBvaW50ZXIoUHlPYmplY3QgKmNhcHN1bGUsIHZvaWQgKnBvaW50ZXIpCiAKICAgIFNldCB0aGUgdm9pZCBwb2ludGVyIGluc2lkZSAqY2Fwc3VsZSogdG8gKnBvaW50ZXIqLiAgVGhlIHBvaW50ZXIgbWF5IG5vdCBiZQogICAgKk5VTEwqLgpkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL2NlbGwucnN0IGIvRG9jL2MtYXBpL2NlbGwucnN0CmluZGV4IDM1NjJlZDkuLjQyNzI1OWMgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS9jZWxsLnJzdAorKysgYi9Eb2MvYy1hcGkvY2VsbC5yc3QKQEAgLTE1LDM5ICsxNSwzOSBAQAogQ2VsbCBvYmplY3RzIGFyZSBub3QgbGlrZWx5IHRvIGJlIHVzZWZ1bCBlbHNld2hlcmUuCiAKIAotLi4gY3R5cGU6OiBQeUNlbGxPYmplY3QKKy4uIGM6dHlwZTo6IFB5Q2VsbE9iamVjdAogCiAgICBUaGUgQyBzdHJ1Y3R1cmUgdXNlZCBmb3IgY2VsbCBvYmplY3RzLgogCiAKLS4uIGN2YXI6OiBQeVR5cGVPYmplY3QgUHlDZWxsX1R5cGUKKy4uIGM6dmFyOjogUHlUeXBlT2JqZWN0IFB5Q2VsbF9UeXBlCiAKICAgIFRoZSB0eXBlIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIGNlbGwgb2JqZWN0cy4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlDZWxsX0NoZWNrKG9iKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUNlbGxfQ2hlY2sob2IpCiAKICAgIFJldHVybiB0cnVlIGlmICpvYiogaXMgYSBjZWxsIG9iamVjdDsgKm9iKiBtdXN0IG5vdCBiZSAqTlVMTCouCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5Q2VsbF9OZXcoUHlPYmplY3QgKm9iKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUNlbGxfTmV3KFB5T2JqZWN0ICpvYikKIAogICAgQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgY2VsbCBvYmplY3QgY29udGFpbmluZyB0aGUgdmFsdWUgKm9iKi4gVGhlIHBhcmFtZXRlciBtYXkKICAgIGJlICpOVUxMKi4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlDZWxsX0dldChQeU9iamVjdCAqY2VsbCkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlDZWxsX0dldChQeU9iamVjdCAqY2VsbCkKIAogICAgUmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgY2VsbCAqY2VsbCouCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5Q2VsbF9HRVQoUHlPYmplY3QgKmNlbGwpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5Q2VsbF9HRVQoUHlPYmplY3QgKmNlbGwpCiAKICAgIFJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIGNlbGwgKmNlbGwqLCBidXQgd2l0aG91dCBjaGVja2luZyB0aGF0ICpjZWxsKiBpcwogICAgbm9uLSpOVUxMKiBhbmQgYSBjZWxsIG9iamVjdC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlDZWxsX1NldChQeU9iamVjdCAqY2VsbCwgUHlPYmplY3QgKnZhbHVlKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUNlbGxfU2V0KFB5T2JqZWN0ICpjZWxsLCBQeU9iamVjdCAqdmFsdWUpCiAKICAgIFNldCB0aGUgY29udGVudHMgb2YgdGhlIGNlbGwgb2JqZWN0ICpjZWxsKiB0byAqdmFsdWUqLiAgVGhpcyByZWxlYXNlcyB0aGUKICAgIHJlZmVyZW5jZSB0byBhbnkgY3VycmVudCBjb250ZW50IG9mIHRoZSBjZWxsLiAqdmFsdWUqIG1heSBiZSAqTlVMTCouICAqY2VsbCoKQEAgLTU1LDcgKzU1LDcgQEAKICAgIHN1Y2Nlc3MsIGBgMGBgIHdpbGwgYmUgcmV0dXJuZWQuCiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBQeUNlbGxfU0VUKFB5T2JqZWN0ICpjZWxsLCBQeU9iamVjdCAqdmFsdWUpCisuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeUNlbGxfU0VUKFB5T2JqZWN0ICpjZWxsLCBQeU9iamVjdCAqdmFsdWUpCiAKICAgIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBjZWxsIG9iamVjdCAqY2VsbCogdG8gKnZhbHVlKi4gIE5vIHJlZmVyZW5jZSBjb3VudHMgYXJlCiAgICBhZGp1c3RlZCwgYW5kIG5vIGNoZWNrcyBhcmUgbWFkZSBmb3Igc2FmZXR5OyAqY2VsbCogbXVzdCBiZSBub24tKk5VTEwqIGFuZCBtdXN0CmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvY2xhc3MucnN0IGIvRG9jL2MtYXBpL2NsYXNzLnJzdAppbmRleCA1NzZhZjM4Li40ZGJlNTA4IDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvY2xhc3MucnN0CisrKyBiL0RvYy9jLWFwaS9jbGFzcy5yc3QKQEAgLTEyLDEyICsxMiwxMiBAQAogd2lsbCB3YW50IHRvIHdvcmsgd2l0aCB0eXBlIG9iamVjdHMgKHNlY3Rpb24gOnJlZjpgdHlwZW9iamVjdHNgKS4KIAogCi0uLiBjdHlwZTo6IFB5Q2xhc3NPYmplY3QKKy4uIGM6dHlwZTo6IFB5Q2xhc3NPYmplY3QKIAogICAgVGhlIEMgc3RydWN0dXJlIG9mIHRoZSBvYmplY3RzIHVzZWQgdG8gZGVzY3JpYmUgYnVpbHQtaW4gY2xhc3Nlcy4KIAogCi0uLiBjdmFyOjogUHlPYmplY3QqIFB5Q2xhc3NfVHlwZQorLi4gYzp2YXI6OiBQeU9iamVjdCogUHlDbGFzc19UeXBlCiAKICAgIC4uIGluZGV4Ojogc2luZ2xlOiBDbGFzc1R5cGUgKGluIG1vZHVsZSB0eXBlcykKIApAQCAtMjUsMTMgKzI1LDEzIEBACiAgICBgYHR5cGVzLkNsYXNzVHlwZWBgIGluIHRoZSBQeXRob24gbGF5ZXIuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5Q2xhc3NfQ2hlY2soUHlPYmplY3QgKm8pCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5Q2xhc3NfQ2hlY2soUHlPYmplY3QgKm8pCiAKICAgIFJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgKm8qIGlzIGEgY2xhc3Mgb2JqZWN0LCBpbmNsdWRpbmcgaW5zdGFuY2VzIG9mIHR5cGVzCiAgICBkZXJpdmVkIGZyb20gdGhlIHN0YW5kYXJkIGNsYXNzIG9iamVjdC4gIFJldHVybiBmYWxzZSBpbiBhbGwgb3RoZXIgY2FzZXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5Q2xhc3NfSXNTdWJjbGFzcyhQeU9iamVjdCAqa2xhc3MsIFB5T2JqZWN0ICpiYXNlKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUNsYXNzX0lzU3ViY2xhc3MoUHlPYmplY3QgKmtsYXNzLCBQeU9iamVjdCAqYmFzZSkKIAogICAgUmV0dXJuIHRydWUgaWYgKmtsYXNzKiBpcyBhIHN1YmNsYXNzIG9mICpiYXNlKi4gUmV0dXJuIGZhbHNlIGluIGFsbCBvdGhlciBjYXNlcy4KIApAQCAtNDEsMjMgKzQxLDIzIEBACiBUaGVyZSBhcmUgdmVyeSBmZXcgZnVuY3Rpb25zIHNwZWNpZmljIHRvIGluc3RhbmNlIG9iamVjdHMuCiAKIAotLi4gY3Zhcjo6IFB5VHlwZU9iamVjdCBQeUluc3RhbmNlX1R5cGUKKy4uIGM6dmFyOjogUHlUeXBlT2JqZWN0IFB5SW5zdGFuY2VfVHlwZQogCiAgICBUeXBlIG9iamVjdCBmb3IgY2xhc3MgaW5zdGFuY2VzLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUluc3RhbmNlX0NoZWNrKFB5T2JqZWN0ICpvYmopCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5SW5zdGFuY2VfQ2hlY2soUHlPYmplY3QgKm9iaikKIAogICAgUmV0dXJuIHRydWUgaWYgKm9iaiogaXMgYW4gaW5zdGFuY2UuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5SW5zdGFuY2VfTmV3KFB5T2JqZWN0ICpjbGFzcywgUHlPYmplY3QgKmFyZywgUHlPYmplY3QgKmt3KQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUluc3RhbmNlX05ldyhQeU9iamVjdCAqY2xhc3MsIFB5T2JqZWN0ICphcmcsIFB5T2JqZWN0ICprdykKIAogICAgQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgc3BlY2lmaWMgY2xhc3MuICBUaGUgcGFyYW1ldGVycyAqYXJnKiBhbmQgKmt3KiBhcmUKICAgIHVzZWQgYXMgdGhlIHBvc2l0aW9uYWwgYW5kIGtleXdvcmQgcGFyYW1ldGVycyB0byB0aGUgb2JqZWN0J3MgY29uc3RydWN0b3IuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5SW5zdGFuY2VfTmV3UmF3KFB5T2JqZWN0ICpjbGFzcywgUHlPYmplY3QgKmRpY3QpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5SW5zdGFuY2VfTmV3UmF3KFB5T2JqZWN0ICpjbGFzcywgUHlPYmplY3QgKmRpY3QpCiAKICAgIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIHNwZWNpZmljIGNsYXNzIHdpdGhvdXQgY2FsbGluZyBpdHMgY29uc3RydWN0b3IuCiAgICAqY2xhc3MqIGlzIHRoZSBjbGFzcyBvZiBuZXcgb2JqZWN0LiAgVGhlICpkaWN0KiBwYXJhbWV0ZXIgd2lsbCBiZSB1c2VkIGFzIHRoZQpkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL2NvYmplY3QucnN0IGIvRG9jL2MtYXBpL2NvYmplY3QucnN0CmluZGV4IDczZmJiZjUuLmVhZmFjMGUgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS9jb2JqZWN0LnJzdAorKysgYi9Eb2MvYy1hcGkvY29iamVjdC5yc3QKQEAgLTEzLDQ3ICsxMyw0NyBAQAogICAgVGhlIENPYmplY3QgQVBJIGlzIGRlcHJlY2F0ZWQgYXMgb2YgUHl0aG9uIDIuNy4gIFBsZWFzZSBzd2l0Y2ggdG8gdGhlIG5ldwogICAgOnJlZjpgY2Fwc3VsZXNgIEFQSS4KIAotLi4gY3R5cGU6OiBQeUNPYmplY3QKKy4uIGM6dHlwZTo6IFB5Q09iamVjdAogCi0gICBUaGlzIHN1YnR5cGUgb2YgOmN0eXBlOmBQeU9iamVjdGAgcmVwcmVzZW50cyBhbiBvcGFxdWUgdmFsdWUsIHVzZWZ1bCBmb3IgQwotICAgZXh0ZW5zaW9uIG1vZHVsZXMgd2hvIG5lZWQgdG8gcGFzcyBhbiBvcGFxdWUgdmFsdWUgKGFzIGEgOmN0eXBlOmB2b2lkXCpgCisgICBUaGlzIHN1YnR5cGUgb2YgOmM6dHlwZTpgUHlPYmplY3RgIHJlcHJlc2VudHMgYW4gb3BhcXVlIHZhbHVlLCB1c2VmdWwgZm9yIEMKKyAgIGV4dGVuc2lvbiBtb2R1bGVzIHdobyBuZWVkIHRvIHBhc3MgYW4gb3BhcXVlIHZhbHVlIChhcyBhIDpjOnR5cGU6YHZvaWRcKmAKICAgIHBvaW50ZXIpIHRocm91Z2ggUHl0aG9uIGNvZGUgdG8gb3RoZXIgQyBjb2RlLiAgSXQgaXMgb2Z0ZW4gdXNlZCB0byBtYWtlIGEgQwogICAgZnVuY3Rpb24gcG9pbnRlciBkZWZpbmVkIGluIG9uZSBtb2R1bGUgYXZhaWxhYmxlIHRvIG90aGVyIG1vZHVsZXMsIHNvIHRoZQogICAgcmVndWxhciBpbXBvcnQgbWVjaGFuaXNtIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyBDIEFQSXMgZGVmaW5lZCBpbiBkeW5hbWljYWxseQogICAgbG9hZGVkIG1vZHVsZXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5Q09iamVjdF9DaGVjayhQeU9iamVjdCAqcCkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlDT2JqZWN0X0NoZWNrKFB5T2JqZWN0ICpwKQogCi0gICBSZXR1cm4gdHJ1ZSBpZiBpdHMgYXJndW1lbnQgaXMgYSA6Y3R5cGU6YFB5Q09iamVjdGAuCisgICBSZXR1cm4gdHJ1ZSBpZiBpdHMgYXJndW1lbnQgaXMgYSA6Yzp0eXBlOmBQeUNPYmplY3RgLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUNPYmplY3RfRnJvbVZvaWRQdHIodm9pZCogY29iaiwgdm9pZCAoKmRlc3RyKSh2b2lkICopKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUNPYmplY3RfRnJvbVZvaWRQdHIodm9pZCogY29iaiwgdm9pZCAoKmRlc3RyKSh2b2lkICopKQogCi0gICBDcmVhdGUgYSA6Y3R5cGU6YFB5Q09iamVjdGAgZnJvbSB0aGUgYGB2b2lkICpgYCAqY29iaiouICBUaGUgKmRlc3RyKiBmdW5jdGlvbgorICAgQ3JlYXRlIGEgOmM6dHlwZTpgUHlDT2JqZWN0YCBmcm9tIHRoZSBgYHZvaWQgKmBgICpjb2JqKi4gIFRoZSAqZGVzdHIqIGZ1bmN0aW9uCiAgICB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBvYmplY3QgaXMgcmVjbGFpbWVkLCB1bmxlc3MgaXQgaXMgKk5VTEwqLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUNPYmplY3RfRnJvbVZvaWRQdHJBbmREZXNjKHZvaWQqIGNvYmosIHZvaWQqIGRlc2MsIHZvaWQgKCpkZXN0cikodm9pZCAqLCB2b2lkICopKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUNPYmplY3RfRnJvbVZvaWRQdHJBbmREZXNjKHZvaWQqIGNvYmosIHZvaWQqIGRlc2MsIHZvaWQgKCpkZXN0cikodm9pZCAqLCB2b2lkICopKQogCi0gICBDcmVhdGUgYSA6Y3R5cGU6YFB5Q09iamVjdGAgZnJvbSB0aGUgOmN0eXBlOmB2b2lkIFwqYCAqY29iaiouICBUaGUgKmRlc3RyKgorICAgQ3JlYXRlIGEgOmM6dHlwZTpgUHlDT2JqZWN0YCBmcm9tIHRoZSA6Yzp0eXBlOmB2b2lkIFwqYCAqY29iaiouICBUaGUgKmRlc3RyKgogICAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgb2JqZWN0IGlzIHJlY2xhaW1lZC4gVGhlICpkZXNjKiBhcmd1bWVudCBjYW4KICAgIGJlIHVzZWQgdG8gcGFzcyBleHRyYSBjYWxsYmFjayBkYXRhIGZvciB0aGUgZGVzdHJ1Y3RvciBmdW5jdGlvbi4KIAogCi0uLiBjZnVuY3Rpb246OiB2b2lkKiBQeUNPYmplY3RfQXNWb2lkUHRyKFB5T2JqZWN0KiBzZWxmKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQqIFB5Q09iamVjdF9Bc1ZvaWRQdHIoUHlPYmplY3QqIHNlbGYpCiAKLSAgIFJldHVybiB0aGUgb2JqZWN0IDpjdHlwZTpgdm9pZCBcKmAgdGhhdCB0aGUgOmN0eXBlOmBQeUNPYmplY3RgICpzZWxmKiB3YXMKKyAgIFJldHVybiB0aGUgb2JqZWN0IDpjOnR5cGU6YHZvaWQgXCpgIHRoYXQgdGhlIDpjOnR5cGU6YFB5Q09iamVjdGAgKnNlbGYqIHdhcwogICAgY3JlYXRlZCB3aXRoLgogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQqIFB5Q09iamVjdF9HZXREZXNjKFB5T2JqZWN0KiBzZWxmKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQqIFB5Q09iamVjdF9HZXREZXNjKFB5T2JqZWN0KiBzZWxmKQogCi0gICBSZXR1cm4gdGhlIGRlc2NyaXB0aW9uIDpjdHlwZTpgdm9pZCBcKmAgdGhhdCB0aGUgOmN0eXBlOmBQeUNPYmplY3RgICpzZWxmKiB3YXMKKyAgIFJldHVybiB0aGUgZGVzY3JpcHRpb24gOmM6dHlwZTpgdm9pZCBcKmAgdGhhdCB0aGUgOmM6dHlwZTpgUHlDT2JqZWN0YCAqc2VsZiogd2FzCiAgICBjcmVhdGVkIHdpdGguCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5Q09iamVjdF9TZXRWb2lkUHRyKFB5T2JqZWN0KiBzZWxmLCB2b2lkKiBjb2JqKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUNPYmplY3RfU2V0Vm9pZFB0cihQeU9iamVjdCogc2VsZiwgdm9pZCogY29iaikKIAotICAgU2V0IHRoZSB2b2lkIHBvaW50ZXIgaW5zaWRlICpzZWxmKiB0byAqY29iaiouIFRoZSA6Y3R5cGU6YFB5Q09iamVjdGAgbXVzdCBub3QKKyAgIFNldCB0aGUgdm9pZCBwb2ludGVyIGluc2lkZSAqc2VsZiogdG8gKmNvYmoqLiBUaGUgOmM6dHlwZTpgUHlDT2JqZWN0YCBtdXN0IG5vdAogICAgaGF2ZSBhbiBhc3NvY2lhdGVkIGRlc3RydWN0b3IuIFJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUuCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvY29kZS5yc3QgYi9Eb2MvYy1hcGkvY29kZS5yc3QKaW5kZXggYzZjYThjNS4uN2Q5YjRiNiAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL2NvZGUucnN0CisrKyBiL0RvYy9jLWFwaS9jb2RlLnJzdApAQCAtMTUsMzUgKzE1LDM1IEBACiBFYWNoIG9uZSByZXByZXNlbnRzIGEgY2h1bmsgb2YgZXhlY3V0YWJsZSBjb2RlIHRoYXQgaGFzbid0IHlldCBiZWVuCiBib3VuZCBpbnRvIGEgZnVuY3Rpb24uCiAKLS4uIGN0eXBlOjogUHlDb2RlT2JqZWN0CisuLiBjOnR5cGU6OiBQeUNvZGVPYmplY3QKIAogICAgVGhlIEMgc3RydWN0dXJlIG9mIHRoZSBvYmplY3RzIHVzZWQgdG8gZGVzY3JpYmUgY29kZSBvYmplY3RzLiAgVGhlCiAgICBmaWVsZHMgb2YgdGhpcyB0eXBlIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBhdCBhbnkgdGltZS4KIAogCi0uLiBjdmFyOjogUHlUeXBlT2JqZWN0IFB5Q29kZV9UeXBlCisuLiBjOnZhcjo6IFB5VHlwZU9iamVjdCBQeUNvZGVfVHlwZQogCi0gICBUaGlzIGlzIGFuIGluc3RhbmNlIG9mIDpjdHlwZTpgUHlUeXBlT2JqZWN0YCByZXByZXNlbnRpbmcgdGhlIFB5dGhvbgorICAgVGhpcyBpcyBhbiBpbnN0YW5jZSBvZiA6Yzp0eXBlOmBQeVR5cGVPYmplY3RgIHJlcHJlc2VudGluZyB0aGUgUHl0aG9uCiAgICA6Y2xhc3M6YGNvZGVgIHR5cGUuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5Q29kZV9DaGVjayhQeU9iamVjdCAqY28pCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5Q29kZV9DaGVjayhQeU9iamVjdCAqY28pCiAKICAgIFJldHVybiB0cnVlIGlmICpjbyogaXMgYSA6Y2xhc3M6YGNvZGVgIG9iamVjdAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlDb2RlX0dldE51bUZyZWUoUHlPYmplY3QgKmNvKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUNvZGVfR2V0TnVtRnJlZShQeU9iamVjdCAqY28pCiAKICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGZyZWUgdmFyaWFibGVzIGluICpjbyouCiAKLS4uIGNmdW5jdGlvbjo6IFB5Q29kZU9iamVjdCAqUHlDb2RlX05ldyhpbnQgYXJnY291bnQsIGludCBubG9jYWxzLCBpbnQgc3RhY2tzaXplLCBpbnQgZmxhZ3MsIFB5T2JqZWN0ICpjb2RlLCBQeU9iamVjdCAqY29uc3RzLCBQeU9iamVjdCAqbmFtZXMsIFB5T2JqZWN0ICp2YXJuYW1lcywgUHlPYmplY3QgKmZyZWV2YXJzLCBQeU9iamVjdCAqY2VsbHZhcnMsIFB5T2JqZWN0ICpmaWxlbmFtZSwgUHlPYmplY3QgKm5hbWUsIGludCBmaXJzdGxpbmVubywgUHlPYmplY3QgKmxub3RhYikKKy4uIGM6ZnVuY3Rpb246OiBQeUNvZGVPYmplY3QgKlB5Q29kZV9OZXcoaW50IGFyZ2NvdW50LCBpbnQgbmxvY2FscywgaW50IHN0YWNrc2l6ZSwgaW50IGZsYWdzLCBQeU9iamVjdCAqY29kZSwgUHlPYmplY3QgKmNvbnN0cywgUHlPYmplY3QgKm5hbWVzLCBQeU9iamVjdCAqdmFybmFtZXMsIFB5T2JqZWN0ICpmcmVldmFycywgUHlPYmplY3QgKmNlbGx2YXJzLCBQeU9iamVjdCAqZmlsZW5hbWUsIFB5T2JqZWN0ICpuYW1lLCBpbnQgZmlyc3RsaW5lbm8sIFB5T2JqZWN0ICpsbm90YWIpCiAKICAgIFJldHVybiBhIG5ldyBjb2RlIG9iamVjdC4gIElmIHlvdSBuZWVkIGEgZHVtbXkgY29kZSBvYmplY3QgdG8KLSAgIGNyZWF0ZSBhIGZyYW1lLCB1c2UgOmNmdW5jOmBQeUNvZGVfTmV3RW1wdHlgIGluc3RlYWQuICBDYWxsaW5nCi0gICA6Y2Z1bmM6YFB5Q29kZV9OZXdgIGRpcmVjdGx5IGNhbiBiaW5kIHlvdSB0byBhIHByZWNpc2UgUHl0aG9uCisgICBjcmVhdGUgYSBmcmFtZSwgdXNlIDpjOmZ1bmM6YFB5Q29kZV9OZXdFbXB0eWAgaW5zdGVhZC4gIENhbGxpbmcKKyAgIDpjOmZ1bmM6YFB5Q29kZV9OZXdgIGRpcmVjdGx5IGNhbiBiaW5kIHlvdSB0byBhIHByZWNpc2UgUHl0aG9uCiAgICB2ZXJzaW9uIHNpbmNlIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBieXRlY29kZSBjaGFuZ2VzIG9mdGVuLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUNvZGVfTmV3RW1wdHkoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmZ1bmNuYW1lLCBpbnQgZmlyc3RsaW5lbm8pCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5Q29kZV9OZXdFbXB0eShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqZnVuY25hbWUsIGludCBmaXJzdGxpbmVubykKIAogICAgUmV0dXJuIGEgbmV3IGVtcHR5IGNvZGUgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBmaWxlbmFtZSwKICAgIGZ1bmN0aW9uIG5hbWUsIGFuZCBmaXJzdCBsaW5lIG51bWJlci4gIEl0IGlzIGlsbGVnYWwgdG8KZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9jb2RlYy5yc3QgYi9Eb2MvYy1hcGkvY29kZWMucnN0CmluZGV4IDI1OTdkMzguLjgzMjUyYWYgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS9jb2RlYy5yc3QKKysrIGIvRG9jL2MtYXBpL2NvZGVjLnJzdApAQCAtMywxOSArMywxOSBAQAogQ29kZWMgcmVnaXN0cnkgYW5kIHN1cHBvcnQgZnVuY3Rpb25zCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5Q29kZWNfUmVnaXN0ZXIoUHlPYmplY3QgKnNlYXJjaF9mdW5jdGlvbikKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlDb2RlY19SZWdpc3RlcihQeU9iamVjdCAqc2VhcmNoX2Z1bmN0aW9uKQogCiAgICBSZWdpc3RlciBhIG5ldyBjb2RlYyBzZWFyY2ggZnVuY3Rpb24uCiAKICAgIEFzIHNpZGUgZWZmZWN0LCB0aGlzIHRyaWVzIHRvIGxvYWQgdGhlIDptb2Q6YGVuY29kaW5nc2AgcGFja2FnZSwgaWYgbm90IHlldAogICAgZG9uZSwgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaXMgYWx3YXlzIGZpcnN0IGluIHRoZSBsaXN0IG9mIHNlYXJjaCBmdW5jdGlvbnMuCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUNvZGVjX0tub3duRW5jb2RpbmcoY29uc3QgY2hhciAqZW5jb2RpbmcpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5Q29kZWNfS25vd25FbmNvZGluZyhjb25zdCBjaGFyICplbmNvZGluZykKIAogICAgUmV0dXJuIGBgMWBgIG9yIGBgMGBgIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZXJlIGlzIGEgcmVnaXN0ZXJlZCBjb2RlYyBmb3IKICAgIHRoZSBnaXZlbiAqZW5jb2RpbmcqLgogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlDb2RlY19FbmNvZGUoUHlPYmplY3QgKm9iamVjdCwgY29uc3QgY2hhciAqZW5jb2RpbmcsIGNvbnN0IGNoYXIgKmVycm9ycykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlDb2RlY19FbmNvZGUoUHlPYmplY3QgKm9iamVjdCwgY29uc3QgY2hhciAqZW5jb2RpbmcsIGNvbnN0IGNoYXIgKmVycm9ycykKIAogICAgR2VuZXJpYyBjb2RlYyBiYXNlZCBlbmNvZGluZyBBUEkuCiAKQEAgLTI0LDcgKzI0LDcgQEAKICAgIGJlICpOVUxMKiB0byB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kIGRlZmluZWQgZm9yIHRoZSBjb2RlYy4gIFJhaXNlcyBhCiAgICA6ZXhjOmBMb29rdXBFcnJvcmAgaWYgbm8gZW5jb2RlciBjYW4gYmUgZm91bmQuCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUNvZGVjX0RlY29kZShQeU9iamVjdCAqb2JqZWN0LCBjb25zdCBjaGFyICplbmNvZGluZywgY29uc3QgY2hhciAqZXJyb3JzKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUNvZGVjX0RlY29kZShQeU9iamVjdCAqb2JqZWN0LCBjb25zdCBjaGFyICplbmNvZGluZywgY29uc3QgY2hhciAqZXJyb3JzKQogCiAgICBHZW5lcmljIGNvZGVjIGJhc2VkIGRlY29kaW5nIEFQSS4KIApAQCAtNDIsMzUgKzQyLDM1IEBACiBlZmZlY3RpdmVseSBjYXNlLWluc2Vuc2l0aXZlLiAgSWYgbm8gY29kZWMgaXMgZm91bmQsIGEgOmV4YzpgS2V5RXJyb3JgIGlzIHNldAogYW5kICpOVUxMKiByZXR1cm5lZC4KIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5Q29kZWNfRW5jb2Rlcihjb25zdCBjaGFyICplbmNvZGluZykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlDb2RlY19FbmNvZGVyKGNvbnN0IGNoYXIgKmVuY29kaW5nKQogCiAgICBHZXQgYW4gZW5jb2RlciBmdW5jdGlvbiBmb3IgdGhlIGdpdmVuICplbmNvZGluZyouCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUNvZGVjX0RlY29kZXIoY29uc3QgY2hhciAqZW5jb2RpbmcpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5Q29kZWNfRGVjb2Rlcihjb25zdCBjaGFyICplbmNvZGluZykKIAogICAgR2V0IGEgZGVjb2RlciBmdW5jdGlvbiBmb3IgdGhlIGdpdmVuICplbmNvZGluZyouCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUNvZGVjX0luY3JlbWVudGFsRW5jb2Rlcihjb25zdCBjaGFyICplbmNvZGluZywgY29uc3QgY2hhciAqZXJyb3JzKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUNvZGVjX0luY3JlbWVudGFsRW5jb2Rlcihjb25zdCBjaGFyICplbmNvZGluZywgY29uc3QgY2hhciAqZXJyb3JzKQogCi0gICBHZXQgYW4gOmNsYXNzOmBJbmNyZW1lbnRhbEVuY29kZXJgIG9iamVjdCBmb3IgdGhlIGdpdmVuICplbmNvZGluZyouCisgICBHZXQgYW4gOmNsYXNzOmB+Y29kZWNzLkluY3JlbWVudGFsRW5jb2RlcmAgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gKmVuY29kaW5nKi4KIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5Q29kZWNfSW5jcmVtZW50YWxEZWNvZGVyKGNvbnN0IGNoYXIgKmVuY29kaW5nLCBjb25zdCBjaGFyICplcnJvcnMpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5Q29kZWNfSW5jcmVtZW50YWxEZWNvZGVyKGNvbnN0IGNoYXIgKmVuY29kaW5nLCBjb25zdCBjaGFyICplcnJvcnMpCiAKLSAgIEdldCBhbiA6Y2xhc3M6YEluY3JlbWVudGFsRGVjb2RlcmAgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gKmVuY29kaW5nKi4KKyAgIEdldCBhbiA6Y2xhc3M6YH5jb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyYCBvYmplY3QgZm9yIHRoZSBnaXZlbiAqZW5jb2RpbmcqLgogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlDb2RlY19TdHJlYW1SZWFkZXIoY29uc3QgY2hhciAqZW5jb2RpbmcsIFB5T2JqZWN0ICpzdHJlYW0sIGNvbnN0IGNoYXIgKmVycm9ycykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlDb2RlY19TdHJlYW1SZWFkZXIoY29uc3QgY2hhciAqZW5jb2RpbmcsIFB5T2JqZWN0ICpzdHJlYW0sIGNvbnN0IGNoYXIgKmVycm9ycykKIAotICAgR2V0IGEgOmNsYXNzOmBTdHJlYW1SZWFkZXJgIGZhY3RvcnkgZnVuY3Rpb24gZm9yIHRoZSBnaXZlbiAqZW5jb2RpbmcqLgorICAgR2V0IGEgOmNsYXNzOmB+Y29kZWNzLlN0cmVhbVJlYWRlcmAgZmFjdG9yeSBmdW5jdGlvbiBmb3IgdGhlIGdpdmVuICplbmNvZGluZyouCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUNvZGVjX1N0cmVhbVdyaXRlcihjb25zdCBjaGFyICplbmNvZGluZywgUHlPYmplY3QgKnN0cmVhbSwgY29uc3QgY2hhciAqZXJyb3JzKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUNvZGVjX1N0cmVhbVdyaXRlcihjb25zdCBjaGFyICplbmNvZGluZywgUHlPYmplY3QgKnN0cmVhbSwgY29uc3QgY2hhciAqZXJyb3JzKQogCi0gICBHZXQgYSA6Y2xhc3M6YFN0cmVhbVdyaXRlcmAgZmFjdG9yeSBmdW5jdGlvbiBmb3IgdGhlIGdpdmVuICplbmNvZGluZyouCisgICBHZXQgYSA6Y2xhc3M6YH5jb2RlY3MuU3RyZWFtV3JpdGVyYCBmYWN0b3J5IGZ1bmN0aW9uIGZvciB0aGUgZ2l2ZW4gKmVuY29kaW5nKi4KIAogCiBSZWdpc3RyeSBBUEkgZm9yIFVuaWNvZGUgZW5jb2RpbmcgZXJyb3IgaGFuZGxlcnMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlDb2RlY19SZWdpc3RlckVycm9yKGNvbnN0IGNoYXIgKm5hbWUsIFB5T2JqZWN0ICplcnJvcikKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlDb2RlY19SZWdpc3RlckVycm9yKGNvbnN0IGNoYXIgKm5hbWUsIFB5T2JqZWN0ICplcnJvcikKIAogICAgUmVnaXN0ZXIgdGhlIGVycm9yIGhhbmRsaW5nIGNhbGxiYWNrIGZ1bmN0aW9uICplcnJvciogdW5kZXIgdGhlIGdpdmVuICpuYW1lKi4KICAgIFRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYnkgYSBjb2RlYyB3aGVuIGl0IGVuY291bnRlcnMKQEAgLTg5LDI5ICs4OSwyOSBAQAogCiAgICBSZXR1cm4gYGAwYGAgb24gc3VjY2VzcywgYGAtMWBgIG9uIGVycm9yLgogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlDb2RlY19Mb29rdXBFcnJvcihjb25zdCBjaGFyICpuYW1lKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUNvZGVjX0xvb2t1cEVycm9yKGNvbnN0IGNoYXIgKm5hbWUpCiAKICAgIExvb2t1cCB0aGUgZXJyb3IgaGFuZGxpbmcgY2FsbGJhY2sgZnVuY3Rpb24gcmVnaXN0ZXJlZCB1bmRlciAqbmFtZSouICBBcyBhCiAgICBzcGVjaWFsIGNhc2UgKk5VTEwqIGNhbiBiZSBwYXNzZWQsIGluIHdoaWNoIGNhc2UgdGhlIGVycm9yIGhhbmRsaW5nIGNhbGxiYWNrCiAgICBmb3IgInN0cmljdCIgd2lsbCBiZSByZXR1cm5lZC4KIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5Q29kZWNfU3RyaWN0RXJyb3JzKFB5T2JqZWN0ICpleGMpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5Q29kZWNfU3RyaWN0RXJyb3JzKFB5T2JqZWN0ICpleGMpCiAKICAgIFJhaXNlICpleGMqIGFzIGFuIGV4Y2VwdGlvbi4KIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5Q29kZWNfSWdub3JlRXJyb3JzKFB5T2JqZWN0ICpleGMpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5Q29kZWNfSWdub3JlRXJyb3JzKFB5T2JqZWN0ICpleGMpCiAKICAgIElnbm9yZSB0aGUgdW5pY29kZSBlcnJvciwgc2tpcHBpbmcgdGhlIGZhdWx0eSBpbnB1dC4KIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5Q29kZWNfUmVwbGFjZUVycm9ycyhQeU9iamVjdCAqZXhjKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUNvZGVjX1JlcGxhY2VFcnJvcnMoUHlPYmplY3QgKmV4YykKIAogICAgUmVwbGFjZSB0aGUgdW5pY29kZSBlbmNvZGUgZXJyb3Igd2l0aCBgYD9gYCBvciBgYFUrRkZGRGBgLgogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlDb2RlY19YTUxDaGFyUmVmUmVwbGFjZUVycm9ycyhQeU9iamVjdCAqZXhjKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUNvZGVjX1hNTENoYXJSZWZSZXBsYWNlRXJyb3JzKFB5T2JqZWN0ICpleGMpCiAKICAgIFJlcGxhY2UgdGhlIHVuaWNvZGUgZW5jb2RlIGVycm9yIHdpdGggWE1MIGNoYXJhY3RlciByZWZlcmVuY2VzLgogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlDb2RlY19CYWNrc2xhc2hSZXBsYWNlRXJyb3JzKFB5T2JqZWN0ICpleGMpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5Q29kZWNfQmFja3NsYXNoUmVwbGFjZUVycm9ycyhQeU9iamVjdCAqZXhjKQogCiAgICBSZXBsYWNlIHRoZSB1bmljb2RlIGVuY29kZSBlcnJvciB3aXRoIGJhY2tzbGFzaCBlc2NhcGVzIChgYFx4YGAsIGBgXHVgYCBhbmQKICAgIGBgXFVgYCkuCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvY29tcGxleC5yc3QgYi9Eb2MvYy1hcGkvY29tcGxleC5yc3QKaW5kZXggMzY0YWI3OC4uMjU0N2MxYyAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL2NvbXBsZXgucnN0CisrKyBiL0RvYy9jLWFwaS9jb21wbGV4LnJzdApAQCAtMjEsNyArMjEsNyBAQAogcG9pbnRlcnMuICBUaGlzIGlzIGNvbnNpc3RlbnQgdGhyb3VnaG91dCB0aGUgQVBJLgogCiAKLS4uIGN0eXBlOjogUHlfY29tcGxleAorLi4gYzp0eXBlOjogUHlfY29tcGxleAogCiAgICBUaGUgQyBzdHJ1Y3R1cmUgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIHBvcnRpb24gb2YgYSBQeXRob24gY29tcGxleAogICAgbnVtYmVyIG9iamVjdC4gIE1vc3Qgb2YgdGhlIGZ1bmN0aW9ucyBmb3IgZGVhbGluZyB3aXRoIGNvbXBsZXggbnVtYmVyIG9iamVjdHMKQEAgLTM0LDk3ICszNCwxMDQgQEAKICAgICAgIH0gUHlfY29tcGxleDsKIAogCi0uLiBjZnVuY3Rpb246OiBQeV9jb21wbGV4IF9QeV9jX3N1bShQeV9jb21wbGV4IGxlZnQsIFB5X2NvbXBsZXggcmlnaHQpCisuLiBjOmZ1bmN0aW9uOjogUHlfY29tcGxleCBfUHlfY19zdW0oUHlfY29tcGxleCBsZWZ0LCBQeV9jb21wbGV4IHJpZ2h0KQogCi0gICBSZXR1cm4gdGhlIHN1bSBvZiB0d28gY29tcGxleCBudW1iZXJzLCB1c2luZyB0aGUgQyA6Y3R5cGU6YFB5X2NvbXBsZXhgCisgICBSZXR1cm4gdGhlIHN1bSBvZiB0d28gY29tcGxleCBudW1iZXJzLCB1c2luZyB0aGUgQyA6Yzp0eXBlOmBQeV9jb21wbGV4YAogICAgcmVwcmVzZW50YXRpb24uCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlfY29tcGxleCBfUHlfY19kaWZmKFB5X2NvbXBsZXggbGVmdCwgUHlfY29tcGxleCByaWdodCkKKy4uIGM6ZnVuY3Rpb246OiBQeV9jb21wbGV4IF9QeV9jX2RpZmYoUHlfY29tcGxleCBsZWZ0LCBQeV9jb21wbGV4IHJpZ2h0KQogCiAgICBSZXR1cm4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gY29tcGxleCBudW1iZXJzLCB1c2luZyB0aGUgQwotICAgOmN0eXBlOmBQeV9jb21wbGV4YCByZXByZXNlbnRhdGlvbi4KKyAgIDpjOnR5cGU6YFB5X2NvbXBsZXhgIHJlcHJlc2VudGF0aW9uLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5X2NvbXBsZXggX1B5X2NfbmVnKFB5X2NvbXBsZXggY29tcGxleCkKKy4uIGM6ZnVuY3Rpb246OiBQeV9jb21wbGV4IF9QeV9jX25lZyhQeV9jb21wbGV4IGNvbXBsZXgpCiAKICAgIFJldHVybiB0aGUgbmVnYXRpb24gb2YgdGhlIGNvbXBsZXggbnVtYmVyICpjb21wbGV4KiwgdXNpbmcgdGhlIEMKLSAgIDpjdHlwZTpgUHlfY29tcGxleGAgcmVwcmVzZW50YXRpb24uCisgICA6Yzp0eXBlOmBQeV9jb21wbGV4YCByZXByZXNlbnRhdGlvbi4KIAogCi0uLiBjZnVuY3Rpb246OiBQeV9jb21wbGV4IF9QeV9jX3Byb2QoUHlfY29tcGxleCBsZWZ0LCBQeV9jb21wbGV4IHJpZ2h0KQorLi4gYzpmdW5jdGlvbjo6IFB5X2NvbXBsZXggX1B5X2NfcHJvZChQeV9jb21wbGV4IGxlZnQsIFB5X2NvbXBsZXggcmlnaHQpCiAKLSAgIFJldHVybiB0aGUgcHJvZHVjdCBvZiB0d28gY29tcGxleCBudW1iZXJzLCB1c2luZyB0aGUgQyA6Y3R5cGU6YFB5X2NvbXBsZXhgCisgICBSZXR1cm4gdGhlIHByb2R1Y3Qgb2YgdHdvIGNvbXBsZXggbnVtYmVycywgdXNpbmcgdGhlIEMgOmM6dHlwZTpgUHlfY29tcGxleGAKICAgIHJlcHJlc2VudGF0aW9uLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5X2NvbXBsZXggX1B5X2NfcXVvdChQeV9jb21wbGV4IGRpdmlkZW5kLCBQeV9jb21wbGV4IGRpdmlzb3IpCisuLiBjOmZ1bmN0aW9uOjogUHlfY29tcGxleCBfUHlfY19xdW90KFB5X2NvbXBsZXggZGl2aWRlbmQsIFB5X2NvbXBsZXggZGl2aXNvcikKIAotICAgUmV0dXJuIHRoZSBxdW90aWVudCBvZiB0d28gY29tcGxleCBudW1iZXJzLCB1c2luZyB0aGUgQyA6Y3R5cGU6YFB5X2NvbXBsZXhgCisgICBSZXR1cm4gdGhlIHF1b3RpZW50IG9mIHR3byBjb21wbGV4IG51bWJlcnMsIHVzaW5nIHRoZSBDIDpjOnR5cGU6YFB5X2NvbXBsZXhgCiAgICByZXByZXNlbnRhdGlvbi4KIAorICAgSWYgKmRpdmlzb3IqIGlzIG51bGwsIHRoaXMgbWV0aG9kIHJldHVybnMgemVybyBhbmQgc2V0cworICAgOmM6ZGF0YTpgZXJybm9gIHRvIDpjOmRhdGE6YEVET01gLgogCi0uLiBjZnVuY3Rpb246OiBQeV9jb21wbGV4IF9QeV9jX3BvdyhQeV9jb21wbGV4IG51bSwgUHlfY29tcGxleCBleHApCiAKLSAgIFJldHVybiB0aGUgZXhwb25lbnRpYXRpb24gb2YgKm51bSogYnkgKmV4cCosIHVzaW5nIHRoZSBDIDpjdHlwZTpgUHlfY29tcGxleGAKKy4uIGM6ZnVuY3Rpb246OiBQeV9jb21wbGV4IF9QeV9jX3BvdyhQeV9jb21wbGV4IG51bSwgUHlfY29tcGxleCBleHApCisKKyAgIFJldHVybiB0aGUgZXhwb25lbnRpYXRpb24gb2YgKm51bSogYnkgKmV4cCosIHVzaW5nIHRoZSBDIDpjOnR5cGU6YFB5X2NvbXBsZXhgCiAgICByZXByZXNlbnRhdGlvbi4KIAorICAgSWYgKm51bSogaXMgbnVsbCBhbmQgKmV4cCogaXMgbm90IGEgcG9zaXRpdmUgcmVhbCBudW1iZXIsCisgICB0aGlzIG1ldGhvZCByZXR1cm5zIHplcm8gYW5kIHNldHMgOmM6ZGF0YTpgZXJybm9gIHRvIDpjOmRhdGE6YEVET01gLgorCiAKIENvbXBsZXggTnVtYmVycyBhcyBQeXRob24gT2JqZWN0cwogXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCiAKIAotLi4gY3R5cGU6OiBQeUNvbXBsZXhPYmplY3QKKy4uIGM6dHlwZTo6IFB5Q29tcGxleE9iamVjdAogCi0gICBUaGlzIHN1YnR5cGUgb2YgOmN0eXBlOmBQeU9iamVjdGAgcmVwcmVzZW50cyBhIFB5dGhvbiBjb21wbGV4IG51bWJlciBvYmplY3QuCisgICBUaGlzIHN1YnR5cGUgb2YgOmM6dHlwZTpgUHlPYmplY3RgIHJlcHJlc2VudHMgYSBQeXRob24gY29tcGxleCBudW1iZXIgb2JqZWN0LgogCiAKLS4uIGN2YXI6OiBQeVR5cGVPYmplY3QgUHlDb21wbGV4X1R5cGUKKy4uIGM6dmFyOjogUHlUeXBlT2JqZWN0IFB5Q29tcGxleF9UeXBlCiAKLSAgIFRoaXMgaW5zdGFuY2Ugb2YgOmN0eXBlOmBQeVR5cGVPYmplY3RgIHJlcHJlc2VudHMgdGhlIFB5dGhvbiBjb21wbGV4IG51bWJlcgorICAgVGhpcyBpbnN0YW5jZSBvZiA6Yzp0eXBlOmBQeVR5cGVPYmplY3RgIHJlcHJlc2VudHMgdGhlIFB5dGhvbiBjb21wbGV4IG51bWJlcgogICAgdHlwZS4gSXQgaXMgdGhlIHNhbWUgb2JqZWN0IGFzIGBgY29tcGxleGBgIGFuZCBgYHR5cGVzLkNvbXBsZXhUeXBlYGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5Q29tcGxleF9DaGVjayhQeU9iamVjdCAqcCkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlDb21wbGV4X0NoZWNrKFB5T2JqZWN0ICpwKQogCi0gICBSZXR1cm4gdHJ1ZSBpZiBpdHMgYXJndW1lbnQgaXMgYSA6Y3R5cGU6YFB5Q29tcGxleE9iamVjdGAgb3IgYSBzdWJ0eXBlIG9mCi0gICA6Y3R5cGU6YFB5Q29tcGxleE9iamVjdGAuCisgICBSZXR1cm4gdHJ1ZSBpZiBpdHMgYXJndW1lbnQgaXMgYSA6Yzp0eXBlOmBQeUNvbXBsZXhPYmplY3RgIG9yIGEgc3VidHlwZSBvZgorICAgOmM6dHlwZTpgUHlDb21wbGV4T2JqZWN0YC4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjIKICAgICAgIEFsbG93ZWQgc3VidHlwZXMgdG8gYmUgYWNjZXB0ZWQuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5Q29tcGxleF9DaGVja0V4YWN0KFB5T2JqZWN0ICpwKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUNvbXBsZXhfQ2hlY2tFeGFjdChQeU9iamVjdCAqcCkKIAotICAgUmV0dXJuIHRydWUgaWYgaXRzIGFyZ3VtZW50IGlzIGEgOmN0eXBlOmBQeUNvbXBsZXhPYmplY3RgLCBidXQgbm90IGEgc3VidHlwZSBvZgotICAgOmN0eXBlOmBQeUNvbXBsZXhPYmplY3RgLgorICAgUmV0dXJuIHRydWUgaWYgaXRzIGFyZ3VtZW50IGlzIGEgOmM6dHlwZTpgUHlDb21wbGV4T2JqZWN0YCwgYnV0IG5vdCBhIHN1YnR5cGUgb2YKKyAgIDpjOnR5cGU6YFB5Q29tcGxleE9iamVjdGAuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KFB5X2NvbXBsZXggdikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlDb21wbGV4X0Zyb21DQ29tcGxleChQeV9jb21wbGV4IHYpCiAKLSAgIENyZWF0ZSBhIG5ldyBQeXRob24gY29tcGxleCBudW1iZXIgb2JqZWN0IGZyb20gYSBDIDpjdHlwZTpgUHlfY29tcGxleGAgdmFsdWUuCisgICBDcmVhdGUgYSBuZXcgUHl0aG9uIGNvbXBsZXggbnVtYmVyIG9iamVjdCBmcm9tIGEgQyA6Yzp0eXBlOmBQeV9jb21wbGV4YCB2YWx1ZS4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlDb21wbGV4X0Zyb21Eb3VibGVzKGRvdWJsZSByZWFsLCBkb3VibGUgaW1hZykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlDb21wbGV4X0Zyb21Eb3VibGVzKGRvdWJsZSByZWFsLCBkb3VibGUgaW1hZykKIAotICAgUmV0dXJuIGEgbmV3IDpjdHlwZTpgUHlDb21wbGV4T2JqZWN0YCBvYmplY3QgZnJvbSAqcmVhbCogYW5kICppbWFnKi4KKyAgIFJldHVybiBhIG5ldyA6Yzp0eXBlOmBQeUNvbXBsZXhPYmplY3RgIG9iamVjdCBmcm9tICpyZWFsKiBhbmQgKmltYWcqLgogCiAKLS4uIGNmdW5jdGlvbjo6IGRvdWJsZSBQeUNvbXBsZXhfUmVhbEFzRG91YmxlKFB5T2JqZWN0ICpvcCkKKy4uIGM6ZnVuY3Rpb246OiBkb3VibGUgUHlDb21wbGV4X1JlYWxBc0RvdWJsZShQeU9iamVjdCAqb3ApCiAKLSAgIFJldHVybiB0aGUgcmVhbCBwYXJ0IG9mICpvcCogYXMgYSBDIDpjdHlwZTpgZG91YmxlYC4KKyAgIFJldHVybiB0aGUgcmVhbCBwYXJ0IG9mICpvcCogYXMgYSBDIDpjOnR5cGU6YGRvdWJsZWAuCiAKIAotLi4gY2Z1bmN0aW9uOjogZG91YmxlIFB5Q29tcGxleF9JbWFnQXNEb3VibGUoUHlPYmplY3QgKm9wKQorLi4gYzpmdW5jdGlvbjo6IGRvdWJsZSBQeUNvbXBsZXhfSW1hZ0FzRG91YmxlKFB5T2JqZWN0ICpvcCkKIAotICAgUmV0dXJuIHRoZSBpbWFnaW5hcnkgcGFydCBvZiAqb3AqIGFzIGEgQyA6Y3R5cGU6YGRvdWJsZWAuCisgICBSZXR1cm4gdGhlIGltYWdpbmFyeSBwYXJ0IG9mICpvcCogYXMgYSBDIDpjOnR5cGU6YGRvdWJsZWAuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlfY29tcGxleCBQeUNvbXBsZXhfQXNDQ29tcGxleChQeU9iamVjdCAqb3ApCisuLiBjOmZ1bmN0aW9uOjogUHlfY29tcGxleCBQeUNvbXBsZXhfQXNDQ29tcGxleChQeU9iamVjdCAqb3ApCiAKLSAgIFJldHVybiB0aGUgOmN0eXBlOmBQeV9jb21wbGV4YCB2YWx1ZSBvZiB0aGUgY29tcGxleCBudW1iZXIgKm9wKi4KKyAgIFJldHVybiB0aGUgOmM6dHlwZTpgUHlfY29tcGxleGAgdmFsdWUgb2YgdGhlIGNvbXBsZXggbnVtYmVyICpvcCouCisgICBVcG9uIGZhaWx1cmUsIHRoaXMgbWV0aG9kIHJldHVybnMgYGAtMS4wYGAgYXMgYSByZWFsIHZhbHVlLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNgogICAgICAgSWYgKm9wKiBpcyBub3QgYSBQeXRob24gY29tcGxleCBudW1iZXIgb2JqZWN0IGJ1dCBoYXMgYSA6bWV0aDpgX19jb21wbGV4X19gCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvY29uY3JldGUucnN0IGIvRG9jL2MtYXBpL2NvbmNyZXRlLnJzdAppbmRleCA1ZWU2MTFiLi4zMGViNzhkIDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvY29uY3JldGUucnN0CisrKyBiL0RvYy9jLWFwaS9jb25jcmV0ZS5yc3QKQEAgLTExLDcgKzExLDcgQEAKIFBhc3NpbmcgdGhlbSBhbiBvYmplY3Qgb2YgdGhlIHdyb25nIHR5cGUgaXMgbm90IGEgZ29vZCBpZGVhOyBpZiB5b3UgcmVjZWl2ZSBhbgogb2JqZWN0IGZyb20gYSBQeXRob24gcHJvZ3JhbSBhbmQgeW91IGFyZSBub3Qgc3VyZSB0aGF0IGl0IGhhcyB0aGUgcmlnaHQgdHlwZSwKIHlvdSBtdXN0IHBlcmZvcm0gYSB0eXBlIGNoZWNrIGZpcnN0OyBmb3IgZXhhbXBsZSwgdG8gY2hlY2sgdGhhdCBhbiBvYmplY3QgaXMgYQotZGljdGlvbmFyeSwgdXNlIDpjZnVuYzpgUHlEaWN0X0NoZWNrYC4gIFRoZSBjaGFwdGVyIGlzIHN0cnVjdHVyZWQgbGlrZSB0aGUKK2RpY3Rpb25hcnksIHVzZSA6YzpmdW5jOmBQeURpY3RfQ2hlY2tgLiAgVGhlIGNoYXB0ZXIgaXMgc3RydWN0dXJlZCBsaWtlIHRoZQogImZhbWlseSB0cmVlIiBvZiBQeXRob24gb2JqZWN0IHR5cGVzLgogCiAuLiB3YXJuaW5nOjoKZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9jb252ZXJzaW9uLnJzdCBiL0RvYy9jLWFwaS9jb252ZXJzaW9uLnJzdAppbmRleCBiMzIxMDBiLi5iOTg3NDY5IDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvY29udmVyc2lvbi5yc3QKKysrIGIvRG9jL2MtYXBpL2NvbnZlcnNpb24ucnN0CkBAIC04LDIwICs4LDIwIEBACiBGdW5jdGlvbnMgZm9yIG51bWJlciBjb252ZXJzaW9uIGFuZCBmb3JtYXR0ZWQgc3RyaW5nIG91dHB1dC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlPU19zbnByaW50ZihjaGFyICpzdHIsIHNpemVfdCBzaXplLCAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5T1Nfc25wcmludGYoY2hhciAqc3RyLCBzaXplX3Qgc2l6ZSwgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogCiAgICBPdXRwdXQgbm90IG1vcmUgdGhhbiAqc2l6ZSogYnl0ZXMgdG8gKnN0ciogYWNjb3JkaW5nIHRvIHRoZSBmb3JtYXQgc3RyaW5nCiAgICAqZm9ybWF0KiBhbmQgdGhlIGV4dHJhIGFyZ3VtZW50cy4gU2VlIHRoZSBVbml4IG1hbiBwYWdlIDptYW5wYWdlOmBzbnByaW50ZigyKWAuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5T1NfdnNucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCB2YSkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlPU192c25wcmludGYoY2hhciAqc3RyLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhKQogCiAgICBPdXRwdXQgbm90IG1vcmUgdGhhbiAqc2l6ZSogYnl0ZXMgdG8gKnN0ciogYWNjb3JkaW5nIHRvIHRoZSBmb3JtYXQgc3RyaW5nCiAgICAqZm9ybWF0KiBhbmQgdGhlIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3QgKnZhKi4gVW5peCBtYW4gcGFnZQogICAgOm1hbnBhZ2U6YHZzbnByaW50ZigyKWAuCiAKLTpjZnVuYzpgUHlPU19zbnByaW50ZmAgYW5kIDpjZnVuYzpgUHlPU192c25wcmludGZgIHdyYXAgdGhlIFN0YW5kYXJkIEMgbGlicmFyeQotZnVuY3Rpb25zIDpjZnVuYzpgc25wcmludGZgIGFuZCA6Y2Z1bmM6YHZzbnByaW50ZmAuIFRoZWlyIHB1cnBvc2UgaXMgdG8KKzpjOmZ1bmM6YFB5T1Nfc25wcmludGZgIGFuZCA6YzpmdW5jOmBQeU9TX3ZzbnByaW50ZmAgd3JhcCB0aGUgU3RhbmRhcmQgQyBsaWJyYXJ5CitmdW5jdGlvbnMgOmM6ZnVuYzpgc25wcmludGZgIGFuZCA6YzpmdW5jOmB2c25wcmludGZgLiBUaGVpciBwdXJwb3NlIGlzIHRvCiBndWFyYW50ZWUgY29uc2lzdGVudCBiZWhhdmlvciBpbiBjb3JuZXIgY2FzZXMsIHdoaWNoIHRoZSBTdGFuZGFyZCBDIGZ1bmN0aW9ucyBkbwogbm90LgogCkBAIC0zMCw3ICszMCw3IEBACiBCb3RoIGZ1bmN0aW9ucyByZXF1aXJlIHRoYXQgYGBzdHIgIT0gTlVMTGBgLCBgYHNpemUgPiAwYGAgYW5kIGBgZm9ybWF0ICE9CiBOVUxMYGAuCiAKLUlmIHRoZSBwbGF0Zm9ybSBkb2Vzbid0IGhhdmUgOmNmdW5jOmB2c25wcmludGZgIGFuZCB0aGUgYnVmZmVyIHNpemUgbmVlZGVkIHRvCitJZiB0aGUgcGxhdGZvcm0gZG9lc24ndCBoYXZlIDpjOmZ1bmM6YHZzbnByaW50ZmAgYW5kIHRoZSBidWZmZXIgc2l6ZSBuZWVkZWQgdG8KIGF2b2lkIHRydW5jYXRpb24gZXhjZWVkcyAqc2l6ZSogYnkgbW9yZSB0aGFuIDUxMiBieXRlcywgUHl0aG9uIGFib3J0cyB3aXRoIGEKICpQeV9GYXRhbEVycm9yKi4KIApAQCAtNTEsOSArNTEsOSBAQAogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgcHJvdmlkZSBsb2NhbGUtaW5kZXBlbmRlbnQgc3RyaW5nIHRvIG51bWJlciBjb252ZXJzaW9ucy4KIAogCi0uLiBjZnVuY3Rpb246OiBkb3VibGUgUHlPU19zdHJpbmdfdG9fZG91YmxlKGNvbnN0IGNoYXIgKnMsIGNoYXIgKiplbmRwdHIsIFB5T2JqZWN0ICpvdmVyZmxvd19leGNlcHRpb24pCisuLiBjOmZ1bmN0aW9uOjogZG91YmxlIFB5T1Nfc3RyaW5nX3RvX2RvdWJsZShjb25zdCBjaGFyICpzLCBjaGFyICoqZW5kcHRyLCBQeU9iamVjdCAqb3ZlcmZsb3dfZXhjZXB0aW9uKQogCi0gICBDb252ZXJ0IGEgc3RyaW5nIGBgc2BgIHRvIGEgOmN0eXBlOmBkb3VibGVgLCByYWlzaW5nIGEgUHl0aG9uCisgICBDb252ZXJ0IGEgc3RyaW5nIGBgc2BgIHRvIGEgOmM6dHlwZTpgZG91YmxlYCwgcmFpc2luZyBhIFB5dGhvbgogICAgZXhjZXB0aW9uIG9uIGZhaWx1cmUuICBUaGUgc2V0IG9mIGFjY2VwdGVkIHN0cmluZ3MgY29ycmVzcG9uZHMgdG8KICAgIHRoZSBzZXQgb2Ygc3RyaW5ncyBhY2NlcHRlZCBieSBQeXRob24ncyA6ZnVuYzpgZmxvYXRgIGNvbnN0cnVjdG9yLAogICAgZXhjZXB0IHRoYXQgYGBzYGAgbXVzdCBub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UuCkBAIC04NSwxMyArODUsMTMgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNwogCiAKLS4uIGNmdW5jdGlvbjo6IGRvdWJsZSBQeU9TX2FzY2lpX3N0cnRvZChjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyKQorLi4gYzpmdW5jdGlvbjo6IGRvdWJsZSBQeU9TX2FzY2lpX3N0cnRvZChjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyKQogCi0gICBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgOmN0eXBlOmBkb3VibGVgLiBUaGlzIGZ1bmN0aW9uIGJlaGF2ZXMgbGlrZSB0aGUgU3RhbmRhcmQgQwotICAgZnVuY3Rpb24gOmNmdW5jOmBzdHJ0b2RgIGRvZXMgaW4gdGhlIEMgbG9jYWxlLiBJdCBkb2VzIHRoaXMgd2l0aG91dCBjaGFuZ2luZyB0aGUKKyAgIENvbnZlcnQgYSBzdHJpbmcgdG8gYSA6Yzp0eXBlOmBkb3VibGVgLiBUaGlzIGZ1bmN0aW9uIGJlaGF2ZXMgbGlrZSB0aGUgU3RhbmRhcmQgQworICAgZnVuY3Rpb24gOmM6ZnVuYzpgc3RydG9kYCBkb2VzIGluIHRoZSBDIGxvY2FsZS4gSXQgZG9lcyB0aGlzIHdpdGhvdXQgY2hhbmdpbmcgdGhlCiAgICBjdXJyZW50IGxvY2FsZSwgc2luY2UgdGhhdCB3b3VsZCBub3QgYmUgdGhyZWFkLXNhZmUuCiAKLSAgIDpjZnVuYzpgUHlPU19hc2NpaV9zdHJ0b2RgIHNob3VsZCB0eXBpY2FsbHkgYmUgdXNlZCBmb3IgcmVhZGluZyBjb25maWd1cmF0aW9uCisgICA6YzpmdW5jOmBQeU9TX2FzY2lpX3N0cnRvZGAgc2hvdWxkIHR5cGljYWxseSBiZSB1c2VkIGZvciByZWFkaW5nIGNvbmZpZ3VyYXRpb24KICAgIGZpbGVzIG9yIG90aGVyIG5vbi11c2VyIGlucHV0IHRoYXQgc2hvdWxkIGJlIGxvY2FsZSBpbmRlcGVuZGVudC4KIAogICAgU2VlIHRoZSBVbml4IG1hbiBwYWdlIDptYW5wYWdlOmBzdHJ0b2QoMilgIGZvciBkZXRhaWxzLgpAQCAtOTksMTQgKzk5LDE0IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjQKIAogICAgLi4gZGVwcmVjYXRlZDo6IDIuNwotICAgICAgVXNlIDpjZnVuYzpgUHlPU19zdHJpbmdfdG9fZG91YmxlYCBpbnN0ZWFkLgorICAgICAgVXNlIDpjOmZ1bmM6YFB5T1Nfc3RyaW5nX3RvX2RvdWJsZWAgaW5zdGVhZC4KIAogCiAKLS4uIGNmdW5jdGlvbjo6IGNoYXIqIFB5T1NfYXNjaWlfZm9ybWF0ZChjaGFyICpidWZmZXIsIHNpemVfdCBidWZfbGVuLCBjb25zdCBjaGFyICpmb3JtYXQsIGRvdWJsZSBkKQorLi4gYzpmdW5jdGlvbjo6IGNoYXIqIFB5T1NfYXNjaWlfZm9ybWF0ZChjaGFyICpidWZmZXIsIHNpemVfdCBidWZfbGVuLCBjb25zdCBjaGFyICpmb3JtYXQsIGRvdWJsZSBkKQogCi0gICBDb252ZXJ0IGEgOmN0eXBlOmBkb3VibGVgIHRvIGEgc3RyaW5nIHVzaW5nIHRoZSBgYCcuJ2BgIGFzIHRoZSBkZWNpbWFsCi0gICBzZXBhcmF0b3IuICpmb3JtYXQqIGlzIGEgOmNmdW5jOmBwcmludGZgXCAtc3R5bGUgZm9ybWF0IHN0cmluZyBzcGVjaWZ5aW5nIHRoZQorICAgQ29udmVydCBhIDpjOnR5cGU6YGRvdWJsZWAgdG8gYSBzdHJpbmcgdXNpbmcgdGhlIGBgJy4nYGAgYXMgdGhlIGRlY2ltYWwKKyAgIHNlcGFyYXRvci4gKmZvcm1hdCogaXMgYSA6YzpmdW5jOmBwcmludGZgXCAtc3R5bGUgZm9ybWF0IHN0cmluZyBzcGVjaWZ5aW5nIHRoZQogICAgbnVtYmVyIGZvcm1hdC4gQWxsb3dlZCBjb252ZXJzaW9uIGNoYXJhY3RlcnMgYXJlIGBgJ2UnYGAsIGBgJ0UnYGAsIGBgJ2YnYGAsCiAgICBgYCdGJ2BgLCBgYCdnJ2BgIGFuZCBgYCdHJ2BgLgogCkBAIC0xMTksOSArMTE5LDkgQEAKICAgICAgIGluc3RlYWQuCiAKIAotLi4gY2Z1bmN0aW9uOjogY2hhciogUHlPU19kb3VibGVfdG9fc3RyaW5nKGRvdWJsZSB2YWwsIGNoYXIgZm9ybWF0X2NvZGUsIGludCBwcmVjaXNpb24sIGludCBmbGFncywgaW50ICpwdHlwZSkKKy4uIGM6ZnVuY3Rpb246OiBjaGFyKiBQeU9TX2RvdWJsZV90b19zdHJpbmcoZG91YmxlIHZhbCwgY2hhciBmb3JtYXRfY29kZSwgaW50IHByZWNpc2lvbiwgaW50IGZsYWdzLCBpbnQgKnB0eXBlKQogCi0gICBDb252ZXJ0IGEgOmN0eXBlOmBkb3VibGVgICp2YWwqIHRvIGEgc3RyaW5nIHVzaW5nIHN1cHBsaWVkCisgICBDb252ZXJ0IGEgOmM6dHlwZTpgZG91YmxlYCAqdmFsKiB0byBhIHN0cmluZyB1c2luZyBzdXBwbGllZAogICAgKmZvcm1hdF9jb2RlKiwgKnByZWNpc2lvbiosIGFuZCAqZmxhZ3MqLgogCiAgICAqZm9ybWF0X2NvZGUqIG11c3QgYmUgb25lIG9mIGBgJ2UnYGAsIGBgJ0UnYGAsIGBgJ2YnYGAsIGBgJ0YnYGAsCkBAIC0xMzksNyArMTM5LDcgQEAKICAgICAgbGlrZSBhbiBpbnRlZ2VyLgogCiAgICAqICpQeV9EVFNGX0FMVCogbWVhbnMgdG8gYXBwbHkgImFsdGVybmF0ZSIgZm9ybWF0dGluZyBydWxlcy4gIFNlZSB0aGUKLSAgICAgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIDpjZnVuYzpgUHlPU19zbnByaW50ZmAgYGAnIydgYCBzcGVjaWZpZXIgZm9yCisgICAgIGRvY3VtZW50YXRpb24gZm9yIHRoZSA6YzpmdW5jOmBQeU9TX3NucHJpbnRmYCBgYCcjJ2BgIHNwZWNpZmllciBmb3IKICAgICAgZGV0YWlscy4KIAogICAgSWYgKnB0eXBlKiBpcyBub24tTlVMTCwgdGhlbiB0aGUgdmFsdWUgaXQgcG9pbnRzIHRvIHdpbGwgYmUgc2V0IHRvIG9uZSBvZgpAQCAtMTQ4LDM0ICsxNDgsMzQgQEAKIAogICAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHBvaW50ZXIgdG8gKmJ1ZmZlciogd2l0aCB0aGUgY29udmVydGVkIHN0cmluZyBvcgogICAgKk5VTEwqIGlmIHRoZSBjb252ZXJzaW9uIGZhaWxlZC4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyB0aGUKLSAgIHJldHVybmVkIHN0cmluZyBieSBjYWxsaW5nIDpjZnVuYzpgUHlNZW1fRnJlZWAuCisgICByZXR1cm5lZCBzdHJpbmcgYnkgY2FsbGluZyA6YzpmdW5jOmBQeU1lbV9GcmVlYC4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi43CiAKIAotLi4gY2Z1bmN0aW9uOjogZG91YmxlIFB5T1NfYXNjaWlfYXRvZihjb25zdCBjaGFyICpucHRyKQorLi4gYzpmdW5jdGlvbjo6IGRvdWJsZSBQeU9TX2FzY2lpX2F0b2YoY29uc3QgY2hhciAqbnB0cikKIAotICAgQ29udmVydCBhIHN0cmluZyB0byBhIDpjdHlwZTpgZG91YmxlYCBpbiBhIGxvY2FsZS1pbmRlcGVuZGVudCB3YXkuCisgICBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgOmM6dHlwZTpgZG91YmxlYCBpbiBhIGxvY2FsZS1pbmRlcGVuZGVudCB3YXkuCiAKICAgIFNlZSB0aGUgVW5peCBtYW4gcGFnZSA6bWFucGFnZTpgYXRvZigyKWAgZm9yIGRldGFpbHMuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNAogCiAgICAuLiBkZXByZWNhdGVkOjogMy4xCi0gICAgICBVc2UgOmNmdW5jOmBQeU9TX3N0cmluZ190b19kb3VibGVgIGluc3RlYWQuCisgICAgICBVc2UgOmM6ZnVuYzpgUHlPU19zdHJpbmdfdG9fZG91YmxlYCBpbnN0ZWFkLgogCiAKLS4uIGNmdW5jdGlvbjo6IGNoYXIqIFB5T1Nfc3RyaWNtcChjaGFyICpzMSwgY2hhciAqczIpCisuLiBjOmZ1bmN0aW9uOjogY2hhciogUHlPU19zdHJpY21wKGNoYXIgKnMxLCBjaGFyICpzMikKIAogICAgQ2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJpc29uIG9mIHN0cmluZ3MuIFRoZSBmdW5jdGlvbiB3b3JrcyBhbG1vc3QKLSAgIGlkZW50aWNhbGx5IHRvIDpjZnVuYzpgc3RyY21wYCBleGNlcHQgdGhhdCBpdCBpZ25vcmVzIHRoZSBjYXNlLgorICAgaWRlbnRpY2FsbHkgdG8gOmM6ZnVuYzpgc3RyY21wYCBleGNlcHQgdGhhdCBpdCBpZ25vcmVzIHRoZSBjYXNlLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjYKIAogCi0uLiBjZnVuY3Rpb246OiBjaGFyKiBQeU9TX3N0cm5pY21wKGNoYXIgKnMxLCBjaGFyICpzMiwgUHlfc3NpemVfdCAgc2l6ZSkKKy4uIGM6ZnVuY3Rpb246OiBjaGFyKiBQeU9TX3N0cm5pY21wKGNoYXIgKnMxLCBjaGFyICpzMiwgUHlfc3NpemVfdCAgc2l6ZSkKIAogICAgQ2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJpc29uIG9mIHN0cmluZ3MuIFRoZSBmdW5jdGlvbiB3b3JrcyBhbG1vc3QKLSAgIGlkZW50aWNhbGx5IHRvIDpjZnVuYzpgc3RybmNtcGAgZXhjZXB0IHRoYXQgaXQgaWdub3JlcyB0aGUgY2FzZS4KKyAgIGlkZW50aWNhbGx5IHRvIDpjOmZ1bmM6YHN0cm5jbXBgIGV4Y2VwdCB0aGF0IGl0IGlnbm9yZXMgdGhlIGNhc2UuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNgpkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL2RhdGV0aW1lLnJzdCBiL0RvYy9jLWFwaS9kYXRldGltZS5yc3QKaW5kZXggMGU5YjM3Ni4uZTJkODMyYyAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL2RhdGV0aW1lLnJzdAorKysgYi9Eb2MvYy1hcGkvZGF0ZXRpbWUucnN0CkBAIC04LDg5ICs4LDg5IEBACiBWYXJpb3VzIGRhdGUgYW5kIHRpbWUgb2JqZWN0cyBhcmUgc3VwcGxpZWQgYnkgdGhlIDptb2Q6YGRhdGV0aW1lYCBtb2R1bGUuCiBCZWZvcmUgdXNpbmcgYW55IG9mIHRoZXNlIGZ1bmN0aW9ucywgdGhlIGhlYWRlciBmaWxlIDpmaWxlOmBkYXRldGltZS5oYCBtdXN0IGJlCiBpbmNsdWRlZCBpbiB5b3VyIHNvdXJjZSAobm90ZSB0aGF0IHRoaXMgaXMgbm90IGluY2x1ZGVkIGJ5IDpmaWxlOmBQeXRob24uaGApLAotYW5kIHRoZSBtYWNybyA6Y21hY3JvOmBQeURhdGVUaW1lX0lNUE9SVGAgbXVzdCBiZSBpbnZva2VkLCB1c3VhbGx5IGFzIHBhcnQgb2YKK2FuZCB0aGUgbWFjcm8gOmM6bWFjcm86YFB5RGF0ZVRpbWVfSU1QT1JUYCBtdXN0IGJlIGludm9rZWQsIHVzdWFsbHkgYXMgcGFydCBvZgogdGhlIG1vZHVsZSBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbi4gIFRoZSBtYWNybyBwdXRzIGEgcG9pbnRlciB0byBhIEMgc3RydWN0dXJlCi1pbnRvIGEgc3RhdGljIHZhcmlhYmxlLCA6Y2RhdGE6YFB5RGF0ZVRpbWVBUElgLCB0aGF0IGlzIHVzZWQgYnkgdGhlIGZvbGxvd2luZworaW50byBhIHN0YXRpYyB2YXJpYWJsZSwgOmM6ZGF0YTpgUHlEYXRlVGltZUFQSWAsIHRoYXQgaXMgdXNlZCBieSB0aGUgZm9sbG93aW5nCiBtYWNyb3MuCiAKIFR5cGUtY2hlY2sgbWFjcm9zOgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeURhdGVfQ2hlY2soUHlPYmplY3QgKm9iKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeURhdGVfQ2hlY2soUHlPYmplY3QgKm9iKQogCi0gICBSZXR1cm4gdHJ1ZSBpZiAqb2IqIGlzIG9mIHR5cGUgOmNkYXRhOmBQeURhdGVUaW1lX0RhdGVUeXBlYCBvciBhIHN1YnR5cGUgb2YKLSAgIDpjZGF0YTpgUHlEYXRlVGltZV9EYXRlVHlwZWAuICAqb2IqIG11c3Qgbm90IGJlICpOVUxMKi4KKyAgIFJldHVybiB0cnVlIGlmICpvYiogaXMgb2YgdHlwZSA6YzpkYXRhOmBQeURhdGVUaW1lX0RhdGVUeXBlYCBvciBhIHN1YnR5cGUgb2YKKyAgIDpjOmRhdGE6YFB5RGF0ZVRpbWVfRGF0ZVR5cGVgLiAgKm9iKiBtdXN0IG5vdCBiZSAqTlVMTCouCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNAogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeURhdGVfQ2hlY2tFeGFjdChQeU9iamVjdCAqb2IpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5RGF0ZV9DaGVja0V4YWN0KFB5T2JqZWN0ICpvYikKIAotICAgUmV0dXJuIHRydWUgaWYgKm9iKiBpcyBvZiB0eXBlIDpjZGF0YTpgUHlEYXRlVGltZV9EYXRlVHlwZWAuICpvYiogbXVzdCBub3QgYmUKKyAgIFJldHVybiB0cnVlIGlmICpvYiogaXMgb2YgdHlwZSA6YzpkYXRhOmBQeURhdGVUaW1lX0RhdGVUeXBlYC4gKm9iKiBtdXN0IG5vdCBiZQogICAgKk5VTEwqLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjQKIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlEYXRlVGltZV9DaGVjayhQeU9iamVjdCAqb2IpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5RGF0ZVRpbWVfQ2hlY2soUHlPYmplY3QgKm9iKQogCi0gICBSZXR1cm4gdHJ1ZSBpZiAqb2IqIGlzIG9mIHR5cGUgOmNkYXRhOmBQeURhdGVUaW1lX0RhdGVUaW1lVHlwZWAgb3IgYSBzdWJ0eXBlIG9mCi0gICA6Y2RhdGE6YFB5RGF0ZVRpbWVfRGF0ZVRpbWVUeXBlYC4gICpvYiogbXVzdCBub3QgYmUgKk5VTEwqLgorICAgUmV0dXJuIHRydWUgaWYgKm9iKiBpcyBvZiB0eXBlIDpjOmRhdGE6YFB5RGF0ZVRpbWVfRGF0ZVRpbWVUeXBlYCBvciBhIHN1YnR5cGUgb2YKKyAgIDpjOmRhdGE6YFB5RGF0ZVRpbWVfRGF0ZVRpbWVUeXBlYC4gICpvYiogbXVzdCBub3QgYmUgKk5VTEwqLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjQKIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlEYXRlVGltZV9DaGVja0V4YWN0KFB5T2JqZWN0ICpvYikKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlEYXRlVGltZV9DaGVja0V4YWN0KFB5T2JqZWN0ICpvYikKIAotICAgUmV0dXJuIHRydWUgaWYgKm9iKiBpcyBvZiB0eXBlIDpjZGF0YTpgUHlEYXRlVGltZV9EYXRlVGltZVR5cGVgLiAqb2IqIG11c3Qgbm90CisgICBSZXR1cm4gdHJ1ZSBpZiAqb2IqIGlzIG9mIHR5cGUgOmM6ZGF0YTpgUHlEYXRlVGltZV9EYXRlVGltZVR5cGVgLiAqb2IqIG11c3Qgbm90CiAgICBiZSAqTlVMTCouCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNAogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeVRpbWVfQ2hlY2soUHlPYmplY3QgKm9iKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeVRpbWVfQ2hlY2soUHlPYmplY3QgKm9iKQogCi0gICBSZXR1cm4gdHJ1ZSBpZiAqb2IqIGlzIG9mIHR5cGUgOmNkYXRhOmBQeURhdGVUaW1lX1RpbWVUeXBlYCBvciBhIHN1YnR5cGUgb2YKLSAgIDpjZGF0YTpgUHlEYXRlVGltZV9UaW1lVHlwZWAuICAqb2IqIG11c3Qgbm90IGJlICpOVUxMKi4KKyAgIFJldHVybiB0cnVlIGlmICpvYiogaXMgb2YgdHlwZSA6YzpkYXRhOmBQeURhdGVUaW1lX1RpbWVUeXBlYCBvciBhIHN1YnR5cGUgb2YKKyAgIDpjOmRhdGE6YFB5RGF0ZVRpbWVfVGltZVR5cGVgLiAgKm9iKiBtdXN0IG5vdCBiZSAqTlVMTCouCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNAogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeVRpbWVfQ2hlY2tFeGFjdChQeU9iamVjdCAqb2IpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5VGltZV9DaGVja0V4YWN0KFB5T2JqZWN0ICpvYikKIAotICAgUmV0dXJuIHRydWUgaWYgKm9iKiBpcyBvZiB0eXBlIDpjZGF0YTpgUHlEYXRlVGltZV9UaW1lVHlwZWAuICpvYiogbXVzdCBub3QgYmUKKyAgIFJldHVybiB0cnVlIGlmICpvYiogaXMgb2YgdHlwZSA6YzpkYXRhOmBQeURhdGVUaW1lX1RpbWVUeXBlYC4gKm9iKiBtdXN0IG5vdCBiZQogICAgKk5VTEwqLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjQKIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlEZWx0YV9DaGVjayhQeU9iamVjdCAqb2IpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5RGVsdGFfQ2hlY2soUHlPYmplY3QgKm9iKQogCi0gICBSZXR1cm4gdHJ1ZSBpZiAqb2IqIGlzIG9mIHR5cGUgOmNkYXRhOmBQeURhdGVUaW1lX0RlbHRhVHlwZWAgb3IgYSBzdWJ0eXBlIG9mCi0gICA6Y2RhdGE6YFB5RGF0ZVRpbWVfRGVsdGFUeXBlYC4gICpvYiogbXVzdCBub3QgYmUgKk5VTEwqLgorICAgUmV0dXJuIHRydWUgaWYgKm9iKiBpcyBvZiB0eXBlIDpjOmRhdGE6YFB5RGF0ZVRpbWVfRGVsdGFUeXBlYCBvciBhIHN1YnR5cGUgb2YKKyAgIDpjOmRhdGE6YFB5RGF0ZVRpbWVfRGVsdGFUeXBlYC4gICpvYiogbXVzdCBub3QgYmUgKk5VTEwqLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjQKIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlEZWx0YV9DaGVja0V4YWN0KFB5T2JqZWN0ICpvYikKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlEZWx0YV9DaGVja0V4YWN0KFB5T2JqZWN0ICpvYikKIAotICAgUmV0dXJuIHRydWUgaWYgKm9iKiBpcyBvZiB0eXBlIDpjZGF0YTpgUHlEYXRlVGltZV9EZWx0YVR5cGVgLiAqb2IqIG11c3Qgbm90IGJlCisgICBSZXR1cm4gdHJ1ZSBpZiAqb2IqIGlzIG9mIHR5cGUgOmM6ZGF0YTpgUHlEYXRlVGltZV9EZWx0YVR5cGVgLiAqb2IqIG11c3Qgbm90IGJlCiAgICAqTlVMTCouCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNAogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeVRaSW5mb19DaGVjayhQeU9iamVjdCAqb2IpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5VFpJbmZvX0NoZWNrKFB5T2JqZWN0ICpvYikKIAotICAgUmV0dXJuIHRydWUgaWYgKm9iKiBpcyBvZiB0eXBlIDpjZGF0YTpgUHlEYXRlVGltZV9UWkluZm9UeXBlYCBvciBhIHN1YnR5cGUgb2YKLSAgIDpjZGF0YTpgUHlEYXRlVGltZV9UWkluZm9UeXBlYC4gICpvYiogbXVzdCBub3QgYmUgKk5VTEwqLgorICAgUmV0dXJuIHRydWUgaWYgKm9iKiBpcyBvZiB0eXBlIDpjOmRhdGE6YFB5RGF0ZVRpbWVfVFpJbmZvVHlwZWAgb3IgYSBzdWJ0eXBlIG9mCisgICA6YzpkYXRhOmBQeURhdGVUaW1lX1RaSW5mb1R5cGVgLiAgKm9iKiBtdXN0IG5vdCBiZSAqTlVMTCouCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNAogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeVRaSW5mb19DaGVja0V4YWN0KFB5T2JqZWN0ICpvYikKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlUWkluZm9fQ2hlY2tFeGFjdChQeU9iamVjdCAqb2IpCiAKLSAgIFJldHVybiB0cnVlIGlmICpvYiogaXMgb2YgdHlwZSA6Y2RhdGE6YFB5RGF0ZVRpbWVfVFpJbmZvVHlwZWAuICpvYiogbXVzdCBub3QgYmUKKyAgIFJldHVybiB0cnVlIGlmICpvYiogaXMgb2YgdHlwZSA6YzpkYXRhOmBQeURhdGVUaW1lX1RaSW5mb1R5cGVgLiAqb2IqIG11c3Qgbm90IGJlCiAgICAqTlVMTCouCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNApAQCAtOTgsMTQgKzk4LDE0IEBACiBNYWNyb3MgdG8gY3JlYXRlIG9iamVjdHM6CiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5RGF0ZV9Gcm9tRGF0ZShpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5KQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeURhdGVfRnJvbURhdGUoaW50IHllYXIsIGludCBtb250aCwgaW50IGRheSkKIAogICAgUmV0dXJuIGEgYGBkYXRldGltZS5kYXRlYGAgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCB5ZWFyLCBtb250aCBhbmQgZGF5LgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjQKIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlEYXRlVGltZV9Gcm9tRGF0ZUFuZFRpbWUoaW50IHllYXIsIGludCBtb250aCwgaW50IGRheSwgaW50IGhvdXIsIGludCBtaW51dGUsIGludCBzZWNvbmQsIGludCB1c2Vjb25kKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeURhdGVUaW1lX0Zyb21EYXRlQW5kVGltZShpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5LCBpbnQgaG91ciwgaW50IG1pbnV0ZSwgaW50IHNlY29uZCwgaW50IHVzZWNvbmQpCiAKICAgIFJldHVybiBhIGBgZGF0ZXRpbWUuZGF0ZXRpbWVgYCBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIHllYXIsIG1vbnRoLCBkYXksIGhvdXIsCiAgICBtaW51dGUsIHNlY29uZCBhbmQgbWljcm9zZWNvbmQuCkBAIC0xMTMsNyArMTEzLDcgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNAogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVRpbWVfRnJvbVRpbWUoaW50IGhvdXIsIGludCBtaW51dGUsIGludCBzZWNvbmQsIGludCB1c2Vjb25kKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVRpbWVfRnJvbVRpbWUoaW50IGhvdXIsIGludCBtaW51dGUsIGludCBzZWNvbmQsIGludCB1c2Vjb25kKQogCiAgICBSZXR1cm4gYSBgYGRhdGV0aW1lLnRpbWVgYCBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIGhvdXIsIG1pbnV0ZSwgc2Vjb25kIGFuZAogICAgbWljcm9zZWNvbmQuCkBAIC0xMjEsNyArMTIxLDcgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNAogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeURlbHRhX0Zyb21EU1UoaW50IGRheXMsIGludCBzZWNvbmRzLCBpbnQgdXNlY29uZHMpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5RGVsdGFfRnJvbURTVShpbnQgZGF5cywgaW50IHNlY29uZHMsIGludCB1c2Vjb25kcykKIAogICAgUmV0dXJuIGEgYGBkYXRldGltZS50aW1lZGVsdGFgYCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBudW1iZXIgb2YgZGF5cywKICAgIHNlY29uZHMgYW5kIG1pY3Jvc2Vjb25kcy4gIE5vcm1hbGl6YXRpb24gaXMgcGVyZm9ybWVkIHNvIHRoYXQgdGhlIHJlc3VsdGluZwpAQCAtMTMxLDkwICsxMzEsOTAgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNAogCiBNYWNyb3MgdG8gZXh0cmFjdCBmaWVsZHMgZnJvbSBkYXRlIG9iamVjdHMuICBUaGUgYXJndW1lbnQgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZgotOmNkYXRhOmBQeURhdGVUaW1lX0RhdGVgLCBpbmNsdWRpbmcgc3ViY2xhc3NlcyAoc3VjaCBhcwotOmNkYXRhOmBQeURhdGVUaW1lX0RhdGVUaW1lYCkuICBUaGUgYXJndW1lbnQgbXVzdCBub3QgYmUgKk5VTEwqLCBhbmQgdGhlIHR5cGUgaXMKKzpjOmRhdGE6YFB5RGF0ZVRpbWVfRGF0ZWAsIGluY2x1ZGluZyBzdWJjbGFzc2VzIChzdWNoIGFzCis6YzpkYXRhOmBQeURhdGVUaW1lX0RhdGVUaW1lYCkuICBUaGUgYXJndW1lbnQgbXVzdCBub3QgYmUgKk5VTEwqLCBhbmQgdGhlIHR5cGUgaXMKIG5vdCBjaGVja2VkOgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeURhdGVUaW1lX0dFVF9ZRUFSKFB5RGF0ZVRpbWVfRGF0ZSAqbykKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlEYXRlVGltZV9HRVRfWUVBUihQeURhdGVUaW1lX0RhdGUgKm8pCiAKICAgIFJldHVybiB0aGUgeWVhciwgYXMgYSBwb3NpdGl2ZSBpbnQuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNAogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeURhdGVUaW1lX0dFVF9NT05USChQeURhdGVUaW1lX0RhdGUgKm8pCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5RGF0ZVRpbWVfR0VUX01PTlRIKFB5RGF0ZVRpbWVfRGF0ZSAqbykKIAogICAgUmV0dXJuIHRoZSBtb250aCwgYXMgYW4gaW50IGZyb20gMSB0aHJvdWdoIDEyLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjQKIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlEYXRlVGltZV9HRVRfREFZKFB5RGF0ZVRpbWVfRGF0ZSAqbykKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlEYXRlVGltZV9HRVRfREFZKFB5RGF0ZVRpbWVfRGF0ZSAqbykKIAogICAgUmV0dXJuIHRoZSBkYXksIGFzIGFuIGludCBmcm9tIDEgdGhyb3VnaCAzMS4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi40CiAKIE1hY3JvcyB0byBleHRyYWN0IGZpZWxkcyBmcm9tIGRhdGV0aW1lIG9iamVjdHMuICBUaGUgYXJndW1lbnQgbXVzdCBiZSBhbgotaW5zdGFuY2Ugb2YgOmNkYXRhOmBQeURhdGVUaW1lX0RhdGVUaW1lYCwgaW5jbHVkaW5nIHN1YmNsYXNzZXMuIFRoZSBhcmd1bWVudAoraW5zdGFuY2Ugb2YgOmM6ZGF0YTpgUHlEYXRlVGltZV9EYXRlVGltZWAsIGluY2x1ZGluZyBzdWJjbGFzc2VzLiBUaGUgYXJndW1lbnQKIG11c3Qgbm90IGJlICpOVUxMKiwgYW5kIHRoZSB0eXBlIGlzIG5vdCBjaGVja2VkOgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeURhdGVUaW1lX0RBVEVfR0VUX0hPVVIoUHlEYXRlVGltZV9EYXRlVGltZSAqbykKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlEYXRlVGltZV9EQVRFX0dFVF9IT1VSKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKm8pCiAKICAgIFJldHVybiB0aGUgaG91ciwgYXMgYW4gaW50IGZyb20gMCB0aHJvdWdoIDIzLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjQKIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlEYXRlVGltZV9EQVRFX0dFVF9NSU5VVEUoUHlEYXRlVGltZV9EYXRlVGltZSAqbykKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlEYXRlVGltZV9EQVRFX0dFVF9NSU5VVEUoUHlEYXRlVGltZV9EYXRlVGltZSAqbykKIAogICAgUmV0dXJuIHRoZSBtaW51dGUsIGFzIGFuIGludCBmcm9tIDAgdGhyb3VnaCA1OS4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi40CiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5RGF0ZVRpbWVfREFURV9HRVRfU0VDT05EKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKm8pCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5RGF0ZVRpbWVfREFURV9HRVRfU0VDT05EKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKm8pCiAKICAgIFJldHVybiB0aGUgc2Vjb25kLCBhcyBhbiBpbnQgZnJvbSAwIHRocm91Z2ggNTkuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNAogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeURhdGVUaW1lX0RBVEVfR0VUX01JQ1JPU0VDT05EKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKm8pCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5RGF0ZVRpbWVfREFURV9HRVRfTUlDUk9TRUNPTkQoUHlEYXRlVGltZV9EYXRlVGltZSAqbykKIAogICAgUmV0dXJuIHRoZSBtaWNyb3NlY29uZCwgYXMgYW4gaW50IGZyb20gMCB0aHJvdWdoIDk5OTk5OS4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi40CiAKIE1hY3JvcyB0byBleHRyYWN0IGZpZWxkcyBmcm9tIHRpbWUgb2JqZWN0cy4gIFRoZSBhcmd1bWVudCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mCi06Y2RhdGE6YFB5RGF0ZVRpbWVfVGltZWAsIGluY2x1ZGluZyBzdWJjbGFzc2VzLiBUaGUgYXJndW1lbnQgbXVzdCBub3QgYmUgKk5VTEwqLAorOmM6ZGF0YTpgUHlEYXRlVGltZV9UaW1lYCwgaW5jbHVkaW5nIHN1YmNsYXNzZXMuIFRoZSBhcmd1bWVudCBtdXN0IG5vdCBiZSAqTlVMTCosCiBhbmQgdGhlIHR5cGUgaXMgbm90IGNoZWNrZWQ6CiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5RGF0ZVRpbWVfVElNRV9HRVRfSE9VUihQeURhdGVUaW1lX1RpbWUgKm8pCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5RGF0ZVRpbWVfVElNRV9HRVRfSE9VUihQeURhdGVUaW1lX1RpbWUgKm8pCiAKICAgIFJldHVybiB0aGUgaG91ciwgYXMgYW4gaW50IGZyb20gMCB0aHJvdWdoIDIzLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjQKIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlEYXRlVGltZV9USU1FX0dFVF9NSU5VVEUoUHlEYXRlVGltZV9UaW1lICpvKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeURhdGVUaW1lX1RJTUVfR0VUX01JTlVURShQeURhdGVUaW1lX1RpbWUgKm8pCiAKICAgIFJldHVybiB0aGUgbWludXRlLCBhcyBhbiBpbnQgZnJvbSAwIHRocm91Z2ggNTkuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNAogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeURhdGVUaW1lX1RJTUVfR0VUX1NFQ09ORChQeURhdGVUaW1lX1RpbWUgKm8pCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5RGF0ZVRpbWVfVElNRV9HRVRfU0VDT05EKFB5RGF0ZVRpbWVfVGltZSAqbykKIAogICAgUmV0dXJuIHRoZSBzZWNvbmQsIGFzIGFuIGludCBmcm9tIDAgdGhyb3VnaCA1OS4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi40CiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5RGF0ZVRpbWVfVElNRV9HRVRfTUlDUk9TRUNPTkQoUHlEYXRlVGltZV9UaW1lICpvKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeURhdGVUaW1lX1RJTUVfR0VUX01JQ1JPU0VDT05EKFB5RGF0ZVRpbWVfVGltZSAqbykKIAogICAgUmV0dXJuIHRoZSBtaWNyb3NlY29uZCwgYXMgYW4gaW50IGZyb20gMCB0aHJvdWdoIDk5OTk5OS4KIApAQCAtMjIzLDcgKzIyMyw3IEBACiBNYWNyb3MgZm9yIHRoZSBjb252ZW5pZW5jZSBvZiBtb2R1bGVzIGltcGxlbWVudGluZyB0aGUgREIgQVBJOgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeURhdGVUaW1lX0Zyb21UaW1lc3RhbXAoUHlPYmplY3QgKmFyZ3MpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5RGF0ZVRpbWVfRnJvbVRpbWVzdGFtcChQeU9iamVjdCAqYXJncykKIAogICAgQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgYGBkYXRldGltZS5kYXRldGltZWBgIG9iamVjdCBnaXZlbiBhbiBhcmd1bWVudCB0dXBsZQogICAgc3VpdGFibGUgZm9yIHBhc3NpbmcgdG8gYGBkYXRldGltZS5kYXRldGltZS5mcm9tdGltZXN0YW1wKClgYC4KQEAgLTIzMSw3ICsyMzEsNyBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi40CiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5RGF0ZV9Gcm9tVGltZXN0YW1wKFB5T2JqZWN0ICphcmdzKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeURhdGVfRnJvbVRpbWVzdGFtcChQeU9iamVjdCAqYXJncykKIAogICAgQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgYGBkYXRldGltZS5kYXRlYGAgb2JqZWN0IGdpdmVuIGFuIGFyZ3VtZW50IHR1cGxlCiAgICBzdWl0YWJsZSBmb3IgcGFzc2luZyB0byBgYGRhdGV0aW1lLmRhdGUuZnJvbXRpbWVzdGFtcCgpYGAuCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvZGVzY3JpcHRvci5yc3QgYi9Eb2MvYy1hcGkvZGVzY3JpcHRvci5yc3QKaW5kZXggNmVkODQzMy4uNDNiYWVhZiAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL2Rlc2NyaXB0b3IucnN0CisrKyBiL0RvYy9jLWFwaS9kZXNjcmlwdG9yLnJzdApAQCAtOSwzOSArOSwzOSBAQAogZm91bmQgaW4gdGhlIGRpY3Rpb25hcnkgb2YgdHlwZSBvYmplY3RzLgogCiAKLS4uIGN2YXI6OiBQeVR5cGVPYmplY3QgUHlQcm9wZXJ0eV9UeXBlCisuLiBjOnZhcjo6IFB5VHlwZU9iamVjdCBQeVByb3BlcnR5X1R5cGUKIAogICAgVGhlIHR5cGUgb2JqZWN0IGZvciB0aGUgYnVpbHQtaW4gZGVzY3JpcHRvciB0eXBlcy4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4yCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5RGVzY3JfTmV3R2V0U2V0KFB5VHlwZU9iamVjdCAqdHlwZSwgc3RydWN0IFB5R2V0U2V0RGVmICpnZXRzZXQpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5RGVzY3JfTmV3R2V0U2V0KFB5VHlwZU9iamVjdCAqdHlwZSwgc3RydWN0IFB5R2V0U2V0RGVmICpnZXRzZXQpCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeURlc2NyX05ld01lbWJlcihQeVR5cGVPYmplY3QgKnR5cGUsIHN0cnVjdCBQeU1lbWJlckRlZiAqbWV0aCkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlEZXNjcl9OZXdNZW1iZXIoUHlUeXBlT2JqZWN0ICp0eXBlLCBzdHJ1Y3QgUHlNZW1iZXJEZWYgKm1ldGgpCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeURlc2NyX05ld01ldGhvZChQeVR5cGVPYmplY3QgKnR5cGUsIHN0cnVjdCBQeU1ldGhvZERlZiAqbWV0aCkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlEZXNjcl9OZXdNZXRob2QoUHlUeXBlT2JqZWN0ICp0eXBlLCBzdHJ1Y3QgUHlNZXRob2REZWYgKm1ldGgpCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeURlc2NyX05ld1dyYXBwZXIoUHlUeXBlT2JqZWN0ICp0eXBlLCBzdHJ1Y3Qgd3JhcHBlcmJhc2UgKndyYXBwZXIsIHZvaWQgKndyYXBwZWQpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5RGVzY3JfTmV3V3JhcHBlcihQeVR5cGVPYmplY3QgKnR5cGUsIHN0cnVjdCB3cmFwcGVyYmFzZSAqd3JhcHBlciwgdm9pZCAqd3JhcHBlZCkKIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4yCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5RGVzY3JfTmV3Q2xhc3NNZXRob2QoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU1ldGhvZERlZiAqbWV0aG9kKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeURlc2NyX05ld0NsYXNzTWV0aG9kKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlNZXRob2REZWYgKm1ldGhvZCkKIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4zCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5RGVzY3JfSXNEYXRhKFB5T2JqZWN0ICpkZXNjcikKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlEZXNjcl9Jc0RhdGEoUHlPYmplY3QgKmRlc2NyKQogCiAgICBSZXR1cm4gdHJ1ZSBpZiB0aGUgZGVzY3JpcHRvciBvYmplY3RzICpkZXNjciogZGVzY3JpYmVzIGEgZGF0YSBhdHRyaWJ1dGUsIG9yCiAgICBmYWxzZSBpZiBpdCBkZXNjcmliZXMgYSBtZXRob2QuICAqZGVzY3IqIG11c3QgYmUgYSBkZXNjcmlwdG9yIG9iamVjdDsgdGhlcmUgaXMKQEAgLTUwLDYgKzUwLDYgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVdyYXBwZXJfTmV3KFB5T2JqZWN0ICosIFB5T2JqZWN0ICopCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5V3JhcHBlcl9OZXcoUHlPYmplY3QgKiwgUHlPYmplY3QgKikKIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4yCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvZGljdC5yc3QgYi9Eb2MvYy1hcGkvZGljdC5yc3QKaW5kZXggMDY2ZTdmMS4uMzAwNmI2YyAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL2RpY3QucnN0CisrKyBiL0RvYy9jLWFwaS9kaWN0LnJzdApAQCAtOCwyMyArOCwyMyBAQAogLi4gaW5kZXg6OiBvYmplY3Q6IGRpY3Rpb25hcnkKIAogCi0uLiBjdHlwZTo6IFB5RGljdE9iamVjdAorLi4gYzp0eXBlOjogUHlEaWN0T2JqZWN0CiAKLSAgIFRoaXMgc3VidHlwZSBvZiA6Y3R5cGU6YFB5T2JqZWN0YCByZXByZXNlbnRzIGEgUHl0aG9uIGRpY3Rpb25hcnkgb2JqZWN0LgorICAgVGhpcyBzdWJ0eXBlIG9mIDpjOnR5cGU6YFB5T2JqZWN0YCByZXByZXNlbnRzIGEgUHl0aG9uIGRpY3Rpb25hcnkgb2JqZWN0LgogCiAKLS4uIGN2YXI6OiBQeVR5cGVPYmplY3QgUHlEaWN0X1R5cGUKKy4uIGM6dmFyOjogUHlUeXBlT2JqZWN0IFB5RGljdF9UeXBlCiAKICAgIC4uIGluZGV4OjoKICAgICAgIHNpbmdsZTogRGljdFR5cGUgKGluIG1vZHVsZSB0eXBlcykKICAgICAgIHNpbmdsZTogRGljdGlvbmFyeVR5cGUgKGluIG1vZHVsZSB0eXBlcykKIAotICAgVGhpcyBpbnN0YW5jZSBvZiA6Y3R5cGU6YFB5VHlwZU9iamVjdGAgcmVwcmVzZW50cyB0aGUgUHl0aG9uIGRpY3Rpb25hcnkKKyAgIFRoaXMgaW5zdGFuY2Ugb2YgOmM6dHlwZTpgUHlUeXBlT2JqZWN0YCByZXByZXNlbnRzIHRoZSBQeXRob24gZGljdGlvbmFyeQogICAgdHlwZS4gIFRoaXMgaXMgZXhwb3NlZCB0byBQeXRob24gcHJvZ3JhbXMgYXMgYGBkaWN0YGAgYW5kCiAgICBgYHR5cGVzLkRpY3RUeXBlYGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5RGljdF9DaGVjayhQeU9iamVjdCAqcCkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlEaWN0X0NoZWNrKFB5T2JqZWN0ICpwKQogCiAgICBSZXR1cm4gdHJ1ZSBpZiAqcCogaXMgYSBkaWN0IG9iamVjdCBvciBhbiBpbnN0YW5jZSBvZiBhIHN1YnR5cGUgb2YgdGhlIGRpY3QKICAgIHR5cGUuCkBAIC0zMyw3ICszMyw3IEBACiAgICAgICBBbGxvd2VkIHN1YnR5cGVzIHRvIGJlIGFjY2VwdGVkLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeURpY3RfQ2hlY2tFeGFjdChQeU9iamVjdCAqcCkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlEaWN0X0NoZWNrRXhhY3QoUHlPYmplY3QgKnApCiAKICAgIFJldHVybiB0cnVlIGlmICpwKiBpcyBhIGRpY3Qgb2JqZWN0LCBidXQgbm90IGFuIGluc3RhbmNlIG9mIGEgc3VidHlwZSBvZgogICAgdGhlIGRpY3QgdHlwZS4KQEAgLTQxLDEyICs0MSwxMiBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi40CiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5RGljdF9OZXcoKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeURpY3RfTmV3KCkKIAogICAgUmV0dXJuIGEgbmV3IGVtcHR5IGRpY3Rpb25hcnksIG9yICpOVUxMKiBvbiBmYWlsdXJlLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeURpY3RQcm94eV9OZXcoUHlPYmplY3QgKmRpY3QpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5RGljdFByb3h5X05ldyhQeU9iamVjdCAqZGljdCkKIAogICAgUmV0dXJuIGEgcHJveHkgb2JqZWN0IGZvciBhIG1hcHBpbmcgd2hpY2ggZW5mb3JjZXMgcmVhZC1vbmx5IGJlaGF2aW9yLgogICAgVGhpcyBpcyBub3JtYWxseSB1c2VkIHRvIGNyZWF0ZSBhIHByb3h5IHRvIHByZXZlbnQgbW9kaWZpY2F0aW9uIG9mIHRoZQpAQCAtNTUsMTIgKzU1LDEyIEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjIKIAogCi0uLiBjZnVuY3Rpb246OiB2b2lkIFB5RGljdF9DbGVhcihQeU9iamVjdCAqcCkKKy4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5RGljdF9DbGVhcihQeU9iamVjdCAqcCkKIAogICAgRW1wdHkgYW4gZXhpc3RpbmcgZGljdGlvbmFyeSBvZiBhbGwga2V5LXZhbHVlIHBhaXJzLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeURpY3RfQ29udGFpbnMoUHlPYmplY3QgKnAsIFB5T2JqZWN0ICprZXkpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5RGljdF9Db250YWlucyhQeU9iamVjdCAqcCwgUHlPYmplY3QgKmtleSkKIAogICAgRGV0ZXJtaW5lIGlmIGRpY3Rpb25hcnkgKnAqIGNvbnRhaW5zICprZXkqLiAgSWYgYW4gaXRlbSBpbiAqcCogaXMgbWF0Y2hlcwogICAgKmtleSosIHJldHVybiBgYDFgYCwgb3RoZXJ3aXNlIHJldHVybiBgYDBgYC4gIE9uIGVycm9yLCByZXR1cm4gYGAtMWBgLgpAQCAtNjksNzQgKzY5LDc0IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjQKIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlEaWN0X0NvcHkoUHlPYmplY3QgKnApCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5RGljdF9Db3B5KFB5T2JqZWN0ICpwKQogCiAgICBSZXR1cm4gYSBuZXcgZGljdGlvbmFyeSB0aGF0IGNvbnRhaW5zIHRoZSBzYW1lIGtleS12YWx1ZSBwYWlycyBhcyAqcCouCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuNgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeURpY3RfU2V0SXRlbShQeU9iamVjdCAqcCwgUHlPYmplY3QgKmtleSwgUHlPYmplY3QgKnZhbCkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlEaWN0X1NldEl0ZW0oUHlPYmplY3QgKnAsIFB5T2JqZWN0ICprZXksIFB5T2JqZWN0ICp2YWwpCiAKICAgIEluc2VydCAqdmFsdWUqIGludG8gdGhlIGRpY3Rpb25hcnkgKnAqIHdpdGggYSBrZXkgb2YgKmtleSouICAqa2V5KiBtdXN0IGJlCiAgICA6dGVybTpgaGFzaGFibGVgOyBpZiBpdCBpc24ndCwgOmV4YzpgVHlwZUVycm9yYCB3aWxsIGJlIHJhaXNlZC4gUmV0dXJuCiAgICBgYDBgYCBvbiBzdWNjZXNzIG9yIGBgLTFgYCBvbiBmYWlsdXJlLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeURpY3RfU2V0SXRlbVN0cmluZyhQeU9iamVjdCAqcCwgY29uc3QgY2hhciAqa2V5LCBQeU9iamVjdCAqdmFsKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeURpY3RfU2V0SXRlbVN0cmluZyhQeU9iamVjdCAqcCwgY29uc3QgY2hhciAqa2V5LCBQeU9iamVjdCAqdmFsKQogCiAgICAuLiBpbmRleDo6IHNpbmdsZTogUHlTdHJpbmdfRnJvbVN0cmluZygpCiAKICAgIEluc2VydCAqdmFsdWUqIGludG8gdGhlIGRpY3Rpb25hcnkgKnAqIHVzaW5nICprZXkqIGFzIGEga2V5LiAqa2V5KiBzaG91bGQKLSAgIGJlIGEgOmN0eXBlOmBjaGFyXCpgLiAgVGhlIGtleSBvYmplY3QgaXMgY3JlYXRlZCB1c2luZworICAgYmUgYSA6Yzp0eXBlOmBjaGFyXCpgLiAgVGhlIGtleSBvYmplY3QgaXMgY3JlYXRlZCB1c2luZwogICAgYGBQeVN0cmluZ19Gcm9tU3RyaW5nKGtleSlgYC4gIFJldHVybiBgYDBgYCBvbiBzdWNjZXNzIG9yIGBgLTFgYCBvbgogICAgZmFpbHVyZS4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlEaWN0X0RlbEl0ZW0oUHlPYmplY3QgKnAsIFB5T2JqZWN0ICprZXkpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5RGljdF9EZWxJdGVtKFB5T2JqZWN0ICpwLCBQeU9iamVjdCAqa2V5KQogCiAgICBSZW1vdmUgdGhlIGVudHJ5IGluIGRpY3Rpb25hcnkgKnAqIHdpdGgga2V5ICprZXkqLiAqa2V5KiBtdXN0IGJlIGhhc2hhYmxlOwogICAgaWYgaXQgaXNuJ3QsIDpleGM6YFR5cGVFcnJvcmAgaXMgcmFpc2VkLiAgUmV0dXJuIGBgMGBgIG9uIHN1Y2Nlc3Mgb3IgYGAtMWBgCiAgICBvbiBmYWlsdXJlLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeURpY3RfRGVsSXRlbVN0cmluZyhQeU9iamVjdCAqcCwgY2hhciAqa2V5KQorLi4gYzpmdW5jdGlvbjo6IGludCBQeURpY3RfRGVsSXRlbVN0cmluZyhQeU9iamVjdCAqcCwgY2hhciAqa2V5KQogCiAgICBSZW1vdmUgdGhlIGVudHJ5IGluIGRpY3Rpb25hcnkgKnAqIHdoaWNoIGhhcyBhIGtleSBzcGVjaWZpZWQgYnkgdGhlIHN0cmluZwogICAgKmtleSouICBSZXR1cm4gYGAwYGAgb24gc3VjY2VzcyBvciBgYC0xYGAgb24gZmFpbHVyZS4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlEaWN0X0dldEl0ZW0oUHlPYmplY3QgKnAsIFB5T2JqZWN0ICprZXkpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5RGljdF9HZXRJdGVtKFB5T2JqZWN0ICpwLCBQeU9iamVjdCAqa2V5KQogCiAgICBSZXR1cm4gdGhlIG9iamVjdCBmcm9tIGRpY3Rpb25hcnkgKnAqIHdoaWNoIGhhcyBhIGtleSAqa2V5Ki4gIFJldHVybiAqTlVMTCoKICAgIGlmIHRoZSBrZXkgKmtleSogaXMgbm90IHByZXNlbnQsIGJ1dCAqd2l0aG91dCogc2V0dGluZyBhbiBleGNlcHRpb24uCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5RGljdF9HZXRJdGVtU3RyaW5nKFB5T2JqZWN0ICpwLCBjb25zdCBjaGFyICprZXkpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5RGljdF9HZXRJdGVtU3RyaW5nKFB5T2JqZWN0ICpwLCBjb25zdCBjaGFyICprZXkpCiAKLSAgIFRoaXMgaXMgdGhlIHNhbWUgYXMgOmNmdW5jOmBQeURpY3RfR2V0SXRlbWAsIGJ1dCAqa2V5KiBpcyBzcGVjaWZpZWQgYXMgYQotICAgOmN0eXBlOmBjaGFyXCpgLCByYXRoZXIgdGhhbiBhIDpjdHlwZTpgUHlPYmplY3RcKmAuCisgICBUaGlzIGlzIHRoZSBzYW1lIGFzIDpjOmZ1bmM6YFB5RGljdF9HZXRJdGVtYCwgYnV0ICprZXkqIGlzIHNwZWNpZmllZCBhcyBhCisgICA6Yzp0eXBlOmBjaGFyXCpgLCByYXRoZXIgdGhhbiBhIDpjOnR5cGU6YFB5T2JqZWN0XCpgLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeURpY3RfSXRlbXMoUHlPYmplY3QgKnApCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5RGljdF9JdGVtcyhQeU9iamVjdCAqcCkKIAotICAgUmV0dXJuIGEgOmN0eXBlOmBQeUxpc3RPYmplY3RgIGNvbnRhaW5pbmcgYWxsIHRoZSBpdGVtcyBmcm9tIHRoZQorICAgUmV0dXJuIGEgOmM6dHlwZTpgUHlMaXN0T2JqZWN0YCBjb250YWluaW5nIGFsbCB0aGUgaXRlbXMgZnJvbSB0aGUKICAgIGRpY3Rpb25hcnksIGFzIGluIHRoZSBkaWN0aW9uYXJ5IG1ldGhvZCA6bWV0aDpgZGljdC5pdGVtc2AuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5RGljdF9LZXlzKFB5T2JqZWN0ICpwKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeURpY3RfS2V5cyhQeU9iamVjdCAqcCkKIAotICAgUmV0dXJuIGEgOmN0eXBlOmBQeUxpc3RPYmplY3RgIGNvbnRhaW5pbmcgYWxsIHRoZSBrZXlzIGZyb20gdGhlIGRpY3Rpb25hcnksCisgICBSZXR1cm4gYSA6Yzp0eXBlOmBQeUxpc3RPYmplY3RgIGNvbnRhaW5pbmcgYWxsIHRoZSBrZXlzIGZyb20gdGhlIGRpY3Rpb25hcnksCiAgICBhcyBpbiB0aGUgZGljdGlvbmFyeSBtZXRob2QgOm1ldGg6YGRpY3Qua2V5c2AuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5RGljdF9WYWx1ZXMoUHlPYmplY3QgKnApCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5RGljdF9WYWx1ZXMoUHlPYmplY3QgKnApCiAKLSAgIFJldHVybiBhIDpjdHlwZTpgUHlMaXN0T2JqZWN0YCBjb250YWluaW5nIGFsbCB0aGUgdmFsdWVzIGZyb20gdGhlCisgICBSZXR1cm4gYSA6Yzp0eXBlOmBQeUxpc3RPYmplY3RgIGNvbnRhaW5pbmcgYWxsIHRoZSB2YWx1ZXMgZnJvbSB0aGUKICAgIGRpY3Rpb25hcnkgKnAqLCBhcyBpbiB0aGUgZGljdGlvbmFyeSBtZXRob2QgOm1ldGg6YGRpY3QudmFsdWVzYC4KIAogCi0uLiBjZnVuY3Rpb246OiBQeV9zc2l6ZV90IFB5RGljdF9TaXplKFB5T2JqZWN0ICpwKQorLi4gYzpmdW5jdGlvbjo6IFB5X3NzaXplX3QgUHlEaWN0X1NpemUoUHlPYmplY3QgKnApCiAKICAgIC4uIGluZGV4OjogYnVpbHRpbjogbGVuCiAKQEAgLTE0NCwxOCArMTQ0LDE4IEBACiAgICBgYGxlbihwKWBgIG9uIGEgZGljdGlvbmFyeS4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJuZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUuICBUaGlzIG1pZ2h0IHJlcXVpcmUgY2hhbmdlcworICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5lZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUuICBUaGlzIG1pZ2h0IHJlcXVpcmUgY2hhbmdlcwogICAgICAgaW4geW91ciBjb2RlIGZvciBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeURpY3RfTmV4dChQeU9iamVjdCAqcCwgUHlfc3NpemVfdCAqcHBvcywgUHlPYmplY3QgKipwa2V5LCBQeU9iamVjdCAqKnB2YWx1ZSkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlEaWN0X05leHQoUHlPYmplY3QgKnAsIFB5X3NzaXplX3QgKnBwb3MsIFB5T2JqZWN0ICoqcGtleSwgUHlPYmplY3QgKipwdmFsdWUpCiAKICAgIEl0ZXJhdGUgb3ZlciBhbGwga2V5LXZhbHVlIHBhaXJzIGluIHRoZSBkaWN0aW9uYXJ5ICpwKi4gIFRoZQotICAgOmN0eXBlOmBQeV9zc2l6ZV90YCByZWZlcnJlZCB0byBieSAqcHBvcyogbXVzdCBiZSBpbml0aWFsaXplZCB0byBgYDBgYAorICAgOmM6dHlwZTpgUHlfc3NpemVfdGAgcmVmZXJyZWQgdG8gYnkgKnBwb3MqIG11c3QgYmUgaW5pdGlhbGl6ZWQgdG8gYGAwYGAKICAgIHByaW9yIHRvIHRoZSBmaXJzdCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gdG8gc3RhcnQgdGhlIGl0ZXJhdGlvbjsgdGhlCiAgICBmdW5jdGlvbiByZXR1cm5zIHRydWUgZm9yIGVhY2ggcGFpciBpbiB0aGUgZGljdGlvbmFyeSwgYW5kIGZhbHNlIG9uY2UgYWxsCiAgICBwYWlycyBoYXZlIGJlZW4gcmVwb3J0ZWQuICBUaGUgcGFyYW1ldGVycyAqcGtleSogYW5kICpwdmFsdWUqIHNob3VsZCBlaXRoZXIKLSAgIHBvaW50IHRvIDpjdHlwZTpgUHlPYmplY3RcKmAgdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBmaWxsZWQgaW4gd2l0aCBlYWNoIGtleQorICAgcG9pbnQgdG8gOmM6dHlwZTpgUHlPYmplY3RcKmAgdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBmaWxsZWQgaW4gd2l0aCBlYWNoIGtleQogICAgYW5kIHZhbHVlLCByZXNwZWN0aXZlbHksIG9yIG1heSBiZSAqTlVMTCouICBBbnkgcmVmZXJlbmNlcyByZXR1cm5lZCB0aHJvdWdoCiAgICB0aGVtIGFyZSBib3Jyb3dlZC4gICpwcG9zKiBzaG91bGQgbm90IGJlIGFsdGVyZWQgZHVyaW5nIGl0ZXJhdGlvbi4gSXRzCiAgICB2YWx1ZSByZXByZXNlbnRzIG9mZnNldHMgd2l0aGluIHRoZSBpbnRlcm5hbCBkaWN0aW9uYXJ5IHN0cnVjdHVyZSwgYW5kCkBAIC0xOTIsMTUgKzE5MiwxNSBAQAogICAgICAgfQogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjdHlwZTpgaW50ICpgIHR5cGUgZm9yICpwcG9zKi4gVGhpcyBtaWdodCByZXF1aXJlCisgICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmM6dHlwZTpgaW50ICpgIHR5cGUgZm9yICpwcG9zKi4gVGhpcyBtaWdodCByZXF1aXJlCiAgICAgICBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlEaWN0X01lcmdlKFB5T2JqZWN0ICphLCBQeU9iamVjdCAqYiwgaW50IG92ZXJyaWRlKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeURpY3RfTWVyZ2UoUHlPYmplY3QgKmEsIFB5T2JqZWN0ICpiLCBpbnQgb3ZlcnJpZGUpCiAKICAgIEl0ZXJhdGUgb3ZlciBtYXBwaW5nIG9iamVjdCAqYiogYWRkaW5nIGtleS12YWx1ZSBwYWlycyB0byBkaWN0aW9uYXJ5ICphKi4KLSAgICpiKiBtYXkgYmUgYSBkaWN0aW9uYXJ5LCBvciBhbnkgb2JqZWN0IHN1cHBvcnRpbmcgOmNmdW5jOmBQeU1hcHBpbmdfS2V5c2AKLSAgIGFuZCA6Y2Z1bmM6YFB5T2JqZWN0X0dldEl0ZW1gLiBJZiAqb3ZlcnJpZGUqIGlzIHRydWUsIGV4aXN0aW5nIHBhaXJzIGluICphKgorICAgKmIqIG1heSBiZSBhIGRpY3Rpb25hcnksIG9yIGFueSBvYmplY3Qgc3VwcG9ydGluZyA6YzpmdW5jOmBQeU1hcHBpbmdfS2V5c2AKKyAgIGFuZCA6YzpmdW5jOmBQeU9iamVjdF9HZXRJdGVtYC4gSWYgKm92ZXJyaWRlKiBpcyB0cnVlLCBleGlzdGluZyBwYWlycyBpbiAqYSoKICAgIHdpbGwgYmUgcmVwbGFjZWQgaWYgYSBtYXRjaGluZyBrZXkgaXMgZm91bmQgaW4gKmIqLCBvdGhlcndpc2UgcGFpcnMgd2lsbAogICAgb25seSBiZSBhZGRlZCBpZiB0aGVyZSBpcyBub3QgYSBtYXRjaGluZyBrZXkgaW4gKmEqLiBSZXR1cm4gYGAwYGAgb24KICAgIHN1Y2Nlc3Mgb3IgYGAtMWBgIGlmIGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkLgpAQCAtMjA4LDE1ICsyMDgsMTggQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeURpY3RfVXBkYXRlKFB5T2JqZWN0ICphLCBQeU9iamVjdCAqYikKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlEaWN0X1VwZGF0ZShQeU9iamVjdCAqYSwgUHlPYmplY3QgKmIpCiAKLSAgIFRoaXMgaXMgdGhlIHNhbWUgYXMgYGBQeURpY3RfTWVyZ2UoYSwgYiwgMSlgYCBpbiBDLCBvciBgYGEudXBkYXRlKGIpYGAgaW4KLSAgIFB5dGhvbi4gIFJldHVybiBgYDBgYCBvbiBzdWNjZXNzIG9yIGBgLTFgYCBpZiBhbiBleGNlcHRpb24gd2FzIHJhaXNlZC4KKyAgIFRoaXMgaXMgdGhlIHNhbWUgYXMgYGBQeURpY3RfTWVyZ2UoYSwgYiwgMSlgYCBpbiBDLCBhbmQgaXMgc2ltaWxhciB0bworICAgYGBhLnVwZGF0ZShiKWBgIGluIFB5dGhvbiBleGNlcHQgdGhhdCA6YzpmdW5jOmBQeURpY3RfVXBkYXRlYCBkb2Vzbid0IGZhbGwKKyAgIGJhY2sgdG8gdGhlIGl0ZXJhdGluZyBvdmVyIGEgc2VxdWVuY2Ugb2Yga2V5IHZhbHVlIHBhaXJzIGlmIHRoZSBzZWNvbmQKKyAgIGFyZ3VtZW50IGhhcyBubyAia2V5cyIgYXR0cmlidXRlLiAgUmV0dXJuIGBgMGBgIG9uIHN1Y2Nlc3Mgb3IgYGAtMWBgIGlmIGFuCisgICBleGNlcHRpb24gd2FzIHJhaXNlZC4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4yCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5RGljdF9NZXJnZUZyb21TZXEyKFB5T2JqZWN0ICphLCBQeU9iamVjdCAqc2VxMiwgaW50IG92ZXJyaWRlKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeURpY3RfTWVyZ2VGcm9tU2VxMihQeU9iamVjdCAqYSwgUHlPYmplY3QgKnNlcTIsIGludCBvdmVycmlkZSkKIAogICAgVXBkYXRlIG9yIG1lcmdlIGludG8gZGljdGlvbmFyeSAqYSosIGZyb20gdGhlIGtleS12YWx1ZSBwYWlycyBpbiAqc2VxMiouCiAgICAqc2VxMiogbXVzdCBiZSBhbiBpdGVyYWJsZSBvYmplY3QgcHJvZHVjaW5nIGl0ZXJhYmxlIG9iamVjdHMgb2YgbGVuZ3RoIDIsCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvZXhjZXB0aW9ucy5yc3QgYi9Eb2MvYy1hcGkvZXhjZXB0aW9ucy5yc3QKaW5kZXggYmVlZGZiZS4uOTE5NjRkMCAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL2V4Y2VwdGlvbnMucnN0CisrKyBiL0RvYy9jLWFwaS9leGNlcHRpb25zLnJzdApAQCAtOSwxMiArOSwxMiBAQAogCiBUaGUgZnVuY3Rpb25zIGRlc2NyaWJlZCBpbiB0aGlzIGNoYXB0ZXIgd2lsbCBsZXQgeW91IGhhbmRsZSBhbmQgcmFpc2UgUHl0aG9uCiBleGNlcHRpb25zLiAgSXQgaXMgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgc29tZSBvZiB0aGUgYmFzaWNzIG9mIFB5dGhvbgotZXhjZXB0aW9uIGhhbmRsaW5nLiAgSXQgd29ya3Mgc29tZXdoYXQgbGlrZSB0aGUgVW5peCA6Y2RhdGE6YGVycm5vYCB2YXJpYWJsZToKK2V4Y2VwdGlvbiBoYW5kbGluZy4gIEl0IHdvcmtzIHNvbWV3aGF0IGxpa2UgdGhlIFVuaXggOmM6ZGF0YTpgZXJybm9gIHZhcmlhYmxlOgogdGhlcmUgaXMgYSBnbG9iYWwgaW5kaWNhdG9yIChwZXIgdGhyZWFkKSBvZiB0aGUgbGFzdCBlcnJvciB0aGF0IG9jY3VycmVkLiAgTW9zdAogZnVuY3Rpb25zIGRvbid0IGNsZWFyIHRoaXMgb24gc3VjY2VzcywgYnV0IHdpbGwgc2V0IGl0IHRvIGluZGljYXRlIHRoZSBjYXVzZSBvZgogdGhlIGVycm9yIG9uIGZhaWx1cmUuICBNb3N0IGZ1bmN0aW9ucyBhbHNvIHJldHVybiBhbiBlcnJvciBpbmRpY2F0b3IsIHVzdWFsbHkKICpOVUxMKiBpZiB0aGV5IGFyZSBzdXBwb3NlZCB0byByZXR1cm4gYSBwb2ludGVyLCBvciBgYC0xYGAgaWYgdGhleSByZXR1cm4gYW4KLWludGVnZXIgKGV4Y2VwdGlvbjogdGhlIDpjZnVuYzpgUHlBcmdfXCpgIGZ1bmN0aW9ucyByZXR1cm4gYGAxYGAgZm9yIHN1Y2Nlc3MgYW5kCitpbnRlZ2VyIChleGNlcHRpb246IHRoZSA6YzpmdW5jOmBQeUFyZ19cKmAgZnVuY3Rpb25zIHJldHVybiBgYDFgYCBmb3Igc3VjY2VzcyBhbmQKIGBgMGBgIGZvciBmYWlsdXJlKS4KIAogV2hlbiBhIGZ1bmN0aW9uIG11c3QgZmFpbCBiZWNhdXNlIHNvbWUgZnVuY3Rpb24gaXQgY2FsbGVkIGZhaWxlZCwgaXQgZ2VuZXJhbGx5CkBAIC00MSw3ICs0MSw3IEBACiAgICBFaXRoZXIgYWxwaGFiZXRpY2FsIG9yIHNvbWUga2luZCBvZiBzdHJ1Y3R1cmUuCiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBQeUVycl9QcmludEV4KGludCBzZXRfc3lzX2xhc3RfdmFycykKKy4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5RXJyX1ByaW50RXgoaW50IHNldF9zeXNfbGFzdF92YXJzKQogCiAgICBQcmludCBhIHN0YW5kYXJkIHRyYWNlYmFjayB0byBgYHN5cy5zdGRlcnJgYCBhbmQgY2xlYXIgdGhlIGVycm9yIGluZGljYXRvci4KICAgIENhbGwgdGhpcyBmdW5jdGlvbiBvbmx5IHdoZW4gdGhlIGVycm9yIGluZGljYXRvciBpcyBzZXQuICAoT3RoZXJ3aXNlIGl0IHdpbGwKQEAgLTUyLDM1ICs1MiwzNSBAQAogICAgdHlwZSwgdmFsdWUgYW5kIHRyYWNlYmFjayBvZiB0aGUgcHJpbnRlZCBleGNlcHRpb24sIHJlc3BlY3RpdmVseS4KIAogCi0uLiBjZnVuY3Rpb246OiB2b2lkIFB5RXJyX1ByaW50KCkKKy4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5RXJyX1ByaW50KCkKIAogICAgQWxpYXMgZm9yIGBgUHlFcnJfUHJpbnRFeCgxKWBgLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUVycl9PY2N1cnJlZCgpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5RXJyX09jY3VycmVkKCkKIAogICAgVGVzdCB3aGV0aGVyIHRoZSBlcnJvciBpbmRpY2F0b3IgaXMgc2V0LiAgSWYgc2V0LCByZXR1cm4gdGhlIGV4Y2VwdGlvbiAqdHlwZSoKLSAgICh0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGxhc3QgY2FsbCB0byBvbmUgb2YgdGhlIDpjZnVuYzpgUHlFcnJfU2V0XCpgCi0gICBmdW5jdGlvbnMgb3IgdG8gOmNmdW5jOmBQeUVycl9SZXN0b3JlYCkuICBJZiBub3Qgc2V0LCByZXR1cm4gKk5VTEwqLiAgWW91IGRvIG5vdAotICAgb3duIGEgcmVmZXJlbmNlIHRvIHRoZSByZXR1cm4gdmFsdWUsIHNvIHlvdSBkbyBub3QgbmVlZCB0byA6Y2Z1bmM6YFB5X0RFQ1JFRmAKKyAgICh0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGxhc3QgY2FsbCB0byBvbmUgb2YgdGhlIDpjOmZ1bmM6YFB5RXJyX1NldFwqYAorICAgZnVuY3Rpb25zIG9yIHRvIDpjOmZ1bmM6YFB5RXJyX1Jlc3RvcmVgKS4gIElmIG5vdCBzZXQsIHJldHVybiAqTlVMTCouICBZb3UgZG8gbm90CisgICBvd24gYSByZWZlcmVuY2UgdG8gdGhlIHJldHVybiB2YWx1ZSwgc28geW91IGRvIG5vdCBuZWVkIHRvIDpjOmZ1bmM6YFB5X0RFQ1JFRmAKICAgIGl0LgogCiAgICAuLiBub3RlOjoKIAogICAgICAgRG8gbm90IGNvbXBhcmUgdGhlIHJldHVybiB2YWx1ZSB0byBhIHNwZWNpZmljIGV4Y2VwdGlvbjsgdXNlCi0gICAgICA6Y2Z1bmM6YFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXNgIGluc3RlYWQsIHNob3duIGJlbG93LiAgKFRoZSBjb21wYXJpc29uIGNvdWxkCisgICAgICA6YzpmdW5jOmBQeUVycl9FeGNlcHRpb25NYXRjaGVzYCBpbnN0ZWFkLCBzaG93biBiZWxvdy4gIChUaGUgY29tcGFyaXNvbiBjb3VsZAogICAgICAgZWFzaWx5IGZhaWwgc2luY2UgdGhlIGV4Y2VwdGlvbiBtYXkgYmUgYW4gaW5zdGFuY2UgaW5zdGVhZCBvZiBhIGNsYXNzLCBpbiB0aGUKICAgICAgIGNhc2Ugb2YgYSBjbGFzcyBleGNlcHRpb24sIG9yIGl0IG1heSB0aGUgYSBzdWJjbGFzcyBvZiB0aGUgZXhwZWN0ZWQgZXhjZXB0aW9uLikKIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeU9iamVjdCAqZXhjKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5T2JqZWN0ICpleGMpCiAKICAgIEVxdWl2YWxlbnQgdG8gYGBQeUVycl9HaXZlbkV4Y2VwdGlvbk1hdGNoZXMoUHlFcnJfT2NjdXJyZWQoKSwgZXhjKWBgLiAgVGhpcwogICAgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gYW4gZXhjZXB0aW9uIGlzIGFjdHVhbGx5IHNldDsgYSBtZW1vcnkgYWNjZXNzCiAgICB2aW9sYXRpb24gd2lsbCBvY2N1ciBpZiBubyBleGNlcHRpb24gaGFzIGJlZW4gcmFpc2VkLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUVycl9HaXZlbkV4Y2VwdGlvbk1hdGNoZXMoUHlPYmplY3QgKmdpdmVuLCBQeU9iamVjdCAqZXhjKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUVycl9HaXZlbkV4Y2VwdGlvbk1hdGNoZXMoUHlPYmplY3QgKmdpdmVuLCBQeU9iamVjdCAqZXhjKQogCiAgICBSZXR1cm4gdHJ1ZSBpZiB0aGUgKmdpdmVuKiBleGNlcHRpb24gbWF0Y2hlcyB0aGUgZXhjZXB0aW9uIGluICpleGMqLiAgSWYKICAgICpleGMqIGlzIGEgY2xhc3Mgb2JqZWN0LCB0aGlzIGFsc28gcmV0dXJucyB0cnVlIHdoZW4gKmdpdmVuKiBpcyBhbiBpbnN0YW5jZQpAQCAtODgsMjIgKzg4LDIyIEBACiAgICByZWN1cnNpdmVseSBpbiBzdWJ0dXBsZXMpIGFyZSBzZWFyY2hlZCBmb3IgYSBtYXRjaC4KIAogCi0uLiBjZnVuY3Rpb246OiB2b2lkIFB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbihQeU9iamVjdCoqZXhjLCBQeU9iamVjdCoqdmFsLCBQeU9iamVjdCoqdGIpCisuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeUVycl9Ob3JtYWxpemVFeGNlcHRpb24oUHlPYmplY3QqKmV4YywgUHlPYmplY3QqKnZhbCwgUHlPYmplY3QqKnRiKQogCi0gICBVbmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgOmNmdW5jOmBQeUVycl9GZXRjaGAgYmVsb3cKKyAgIFVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcywgdGhlIHZhbHVlcyByZXR1cm5lZCBieSA6YzpmdW5jOmBQeUVycl9GZXRjaGAgYmVsb3cKICAgIGNhbiBiZSAidW5ub3JtYWxpemVkIiwgbWVhbmluZyB0aGF0IGBgKmV4Y2BgIGlzIGEgY2xhc3Mgb2JqZWN0IGJ1dCBgYCp2YWxgYCBpcwogICAgbm90IGFuIGluc3RhbmNlIG9mIHRoZSAgc2FtZSBjbGFzcy4gIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW5zdGFudGlhdGUKICAgIHRoZSBjbGFzcyBpbiB0aGF0IGNhc2UuICBJZiB0aGUgdmFsdWVzIGFyZSBhbHJlYWR5IG5vcm1hbGl6ZWQsIG5vdGhpbmcgaGFwcGVucy4KICAgIFRoZSBkZWxheWVkIG5vcm1hbGl6YXRpb24gaXMgaW1wbGVtZW50ZWQgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KIAogCi0uLiBjZnVuY3Rpb246OiB2b2lkIFB5RXJyX0NsZWFyKCkKKy4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5RXJyX0NsZWFyKCkKIAogICAgQ2xlYXIgdGhlIGVycm9yIGluZGljYXRvci4gIElmIHRoZSBlcnJvciBpbmRpY2F0b3IgaXMgbm90IHNldCwgdGhlcmUgaXMgbm8KICAgIGVmZmVjdC4KIAogCi0uLiBjZnVuY3Rpb246OiB2b2lkIFB5RXJyX0ZldGNoKFB5T2JqZWN0ICoqcHR5cGUsIFB5T2JqZWN0ICoqcHZhbHVlLCBQeU9iamVjdCAqKnB0cmFjZWJhY2spCisuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeUVycl9GZXRjaChQeU9iamVjdCAqKnB0eXBlLCBQeU9iamVjdCAqKnB2YWx1ZSwgUHlPYmplY3QgKipwdHJhY2ViYWNrKQogCiAgICBSZXRyaWV2ZSB0aGUgZXJyb3IgaW5kaWNhdG9yIGludG8gdGhyZWUgdmFyaWFibGVzIHdob3NlIGFkZHJlc3NlcyBhcmUgcGFzc2VkLgogICAgSWYgdGhlIGVycm9yIGluZGljYXRvciBpcyBub3Qgc2V0LCBzZXQgYWxsIHRocmVlIHZhcmlhYmxlcyB0byAqTlVMTCouICBJZiBpdCBpcwpAQCAtMTE2LDcgKzExNiw3IEBACiAgICAgICBieSBjb2RlIHRoYXQgbmVlZHMgdG8gc2F2ZSBhbmQgcmVzdG9yZSB0aGUgZXJyb3IgaW5kaWNhdG9yIHRlbXBvcmFyaWx5LgogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgUHlFcnJfUmVzdG9yZShQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlLCBQeU9iamVjdCAqdHJhY2ViYWNrKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlFcnJfUmVzdG9yZShQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlLCBQeU9iamVjdCAqdHJhY2ViYWNrKQogCiAgICBTZXQgIHRoZSBlcnJvciBpbmRpY2F0b3IgZnJvbSB0aGUgdGhyZWUgb2JqZWN0cy4gIElmIHRoZSBlcnJvciBpbmRpY2F0b3IgaXMKICAgIGFscmVhZHkgc2V0LCBpdCBpcyBjbGVhcmVkIGZpcnN0LiAgSWYgdGhlIG9iamVjdHMgYXJlICpOVUxMKiwgdGhlIGVycm9yCkBAIC0xMzEsMTExICsxMzEsMTMzIEBACiAgICAuLiBub3RlOjoKIAogICAgICAgVGhpcyBmdW5jdGlvbiBpcyBub3JtYWxseSBvbmx5IHVzZWQgYnkgY29kZSB0aGF0IG5lZWRzIHRvIHNhdmUgYW5kIHJlc3RvcmUgdGhlCi0gICAgICBlcnJvciBpbmRpY2F0b3IgdGVtcG9yYXJpbHk7IHVzZSA6Y2Z1bmM6YFB5RXJyX0ZldGNoYCB0byBzYXZlIHRoZSBjdXJyZW50CisgICAgICBlcnJvciBpbmRpY2F0b3IgdGVtcG9yYXJpbHk7IHVzZSA6YzpmdW5jOmBQeUVycl9GZXRjaGAgdG8gc2F2ZSB0aGUgY3VycmVudAogICAgICAgZXhjZXB0aW9uIHN0YXRlLgogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgUHlFcnJfU2V0U3RyaW5nKFB5T2JqZWN0ICp0eXBlLCBjb25zdCBjaGFyICptZXNzYWdlKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlFcnJfU2V0U3RyaW5nKFB5T2JqZWN0ICp0eXBlLCBjb25zdCBjaGFyICptZXNzYWdlKQogCiAgICBUaGlzIGlzIHRoZSBtb3N0IGNvbW1vbiB3YXkgdG8gc2V0IHRoZSBlcnJvciBpbmRpY2F0b3IuICBUaGUgZmlyc3QgYXJndW1lbnQKICAgIHNwZWNpZmllcyB0aGUgZXhjZXB0aW9uIHR5cGU7IGl0IGlzIG5vcm1hbGx5IG9uZSBvZiB0aGUgc3RhbmRhcmQgZXhjZXB0aW9ucywKLSAgIGUuZy4gOmNkYXRhOmBQeUV4Y19SdW50aW1lRXJyb3JgLiAgWW91IG5lZWQgbm90IGluY3JlbWVudCBpdHMgcmVmZXJlbmNlIGNvdW50LgorICAgZS5nLiA6YzpkYXRhOmBQeUV4Y19SdW50aW1lRXJyb3JgLiAgWW91IG5lZWQgbm90IGluY3JlbWVudCBpdHMgcmVmZXJlbmNlIGNvdW50LgogICAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyBhbiBlcnJvciBtZXNzYWdlOyBpdCBpcyBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgb2JqZWN0LgogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgUHlFcnJfU2V0T2JqZWN0KFB5T2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqdmFsdWUpCisuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeUVycl9TZXRPYmplY3QoUHlPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICp2YWx1ZSkKIAotICAgVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIDpjZnVuYzpgUHlFcnJfU2V0U3RyaW5nYCBidXQgbGV0cyB5b3Ugc3BlY2lmeSBhbgorICAgVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIDpjOmZ1bmM6YFB5RXJyX1NldFN0cmluZ2AgYnV0IGxldHMgeW91IHNwZWNpZnkgYW4KICAgIGFyYml0cmFyeSBQeXRob24gb2JqZWN0IGZvciB0aGUgInZhbHVlIiBvZiB0aGUgZXhjZXB0aW9uLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUVycl9Gb3JtYXQoUHlPYmplY3QgKmV4Y2VwdGlvbiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5RXJyX0Zvcm1hdChQeU9iamVjdCAqZXhjZXB0aW9uLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIAogICAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBlcnJvciBpbmRpY2F0b3IgYW5kIHJldHVybnMgKk5VTEwqLiAgKmV4Y2VwdGlvbioKICAgIHNob3VsZCBiZSBhIFB5dGhvbiBleGNlcHRpb24gY2xhc3MuICBUaGUgKmZvcm1hdCogYW5kIHN1YnNlcXVlbnQKICAgIHBhcmFtZXRlcnMgaGVscCBmb3JtYXQgdGhlIGVycm9yIG1lc3NhZ2U7IHRoZXkgaGF2ZSB0aGUgc2FtZSBtZWFuaW5nIGFuZAotICAgdmFsdWVzIGFzIGluIDpjZnVuYzpgUHlTdHJpbmdfRnJvbUZvcm1hdGAuCisgICB2YWx1ZXMgYXMgaW4gOmM6ZnVuYzpgUHlTdHJpbmdfRnJvbUZvcm1hdGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBQeUVycl9TZXROb25lKFB5T2JqZWN0ICp0eXBlKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlFcnJfU2V0Tm9uZShQeU9iamVjdCAqdHlwZSkKIAogICAgVGhpcyBpcyBhIHNob3J0aGFuZCBmb3IgYGBQeUVycl9TZXRPYmplY3QodHlwZSwgUHlfTm9uZSlgYC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlFcnJfQmFkQXJndW1lbnQoKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUVycl9CYWRBcmd1bWVudCgpCiAKICAgIFRoaXMgaXMgYSBzaG9ydGhhbmQgZm9yIGBgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgbWVzc2FnZSlgYCwgd2hlcmUKICAgICptZXNzYWdlKiBpbmRpY2F0ZXMgdGhhdCBhIGJ1aWx0LWluIG9wZXJhdGlvbiB3YXMgaW52b2tlZCB3aXRoIGFuIGlsbGVnYWwKICAgIGFyZ3VtZW50LiAgSXQgaXMgbW9zdGx5IGZvciBpbnRlcm5hbCB1c2UuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5RXJyX05vTWVtb3J5KCkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlFcnJfTm9NZW1vcnkoKQogCiAgICBUaGlzIGlzIGEgc2hvcnRoYW5kIGZvciBgYFB5RXJyX1NldE5vbmUoUHlFeGNfTWVtb3J5RXJyb3IpYGA7IGl0IHJldHVybnMgKk5VTEwqCiAgICBzbyBhbiBvYmplY3QgYWxsb2NhdGlvbiBmdW5jdGlvbiBjYW4gd3JpdGUgYGByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTtgYCB3aGVuIGl0CiAgICBydW5zIG91dCBvZiBtZW1vcnkuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5RXJyX1NldEZyb21FcnJubyhQeU9iamVjdCAqdHlwZSkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlFcnJfU2V0RnJvbUVycm5vKFB5T2JqZWN0ICp0eXBlKQogCiAgICAuLiBpbmRleDo6IHNpbmdsZTogc3RyZXJyb3IoKQogCiAgICBUaGlzIGlzIGEgY29udmVuaWVuY2UgZnVuY3Rpb24gdG8gcmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4gYSBDIGxpYnJhcnkgZnVuY3Rpb24KLSAgIGhhcyByZXR1cm5lZCBhbiBlcnJvciBhbmQgc2V0IHRoZSBDIHZhcmlhYmxlIDpjZGF0YTpgZXJybm9gLiAgSXQgY29uc3RydWN0cyBhCi0gICB0dXBsZSBvYmplY3Qgd2hvc2UgZmlyc3QgaXRlbSBpcyB0aGUgaW50ZWdlciA6Y2RhdGE6YGVycm5vYCB2YWx1ZSBhbmQgd2hvc2UKLSAgIHNlY29uZCBpdGVtIGlzIHRoZSBjb3JyZXNwb25kaW5nIGVycm9yIG1lc3NhZ2UgKGdvdHRlbiBmcm9tIDpjZnVuYzpgc3RyZXJyb3JgKSwKKyAgIGhhcyByZXR1cm5lZCBhbiBlcnJvciBhbmQgc2V0IHRoZSBDIHZhcmlhYmxlIDpjOmRhdGE6YGVycm5vYC4gIEl0IGNvbnN0cnVjdHMgYQorICAgdHVwbGUgb2JqZWN0IHdob3NlIGZpcnN0IGl0ZW0gaXMgdGhlIGludGVnZXIgOmM6ZGF0YTpgZXJybm9gIHZhbHVlIGFuZCB3aG9zZQorICAgc2Vjb25kIGl0ZW0gaXMgdGhlIGNvcnJlc3BvbmRpbmcgZXJyb3IgbWVzc2FnZSAoZ290dGVuIGZyb20gOmM6ZnVuYzpgc3RyZXJyb3JgKSwKICAgIGFuZCB0aGVuIGNhbGxzIGBgUHlFcnJfU2V0T2JqZWN0KHR5cGUsIG9iamVjdClgYC4gIE9uIFVuaXgsIHdoZW4gdGhlCi0gICA6Y2RhdGE6YGVycm5vYCB2YWx1ZSBpcyA6Y29uc3Q6YEVJTlRSYCwgaW5kaWNhdGluZyBhbiBpbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCwKLSAgIHRoaXMgY2FsbHMgOmNmdW5jOmBQeUVycl9DaGVja1NpZ25hbHNgLCBhbmQgaWYgdGhhdCBzZXQgdGhlIGVycm9yIGluZGljYXRvciwKKyAgIDpjOmRhdGE6YGVycm5vYCB2YWx1ZSBpcyA6Y29uc3Q6YEVJTlRSYCwgaW5kaWNhdGluZyBhbiBpbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCwKKyAgIHRoaXMgY2FsbHMgOmM6ZnVuYzpgUHlFcnJfQ2hlY2tTaWduYWxzYCwgYW5kIGlmIHRoYXQgc2V0IHRoZSBlcnJvciBpbmRpY2F0b3IsCiAgICBsZWF2ZXMgaXQgc2V0IHRvIHRoYXQuICBUaGUgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgKk5VTEwqLCBzbyBhIHdyYXBwZXIKICAgIGZ1bmN0aW9uIGFyb3VuZCBhIHN5c3RlbSBjYWxsIGNhbiB3cml0ZSBgYHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8odHlwZSk7YGAKICAgIHdoZW4gdGhlIHN5c3RlbSBjYWxsIHJldHVybnMgYW4gZXJyb3IuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZShQeU9iamVjdCAqdHlwZSwgY29uc3QgY2hhciAqZmlsZW5hbWUpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdChQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmZpbGVuYW1lT2JqZWN0KQogCi0gICBTaW1pbGFyIHRvIDpjZnVuYzpgUHlFcnJfU2V0RnJvbUVycm5vYCwgd2l0aCB0aGUgYWRkaXRpb25hbCBiZWhhdmlvciB0aGF0IGlmCi0gICAqZmlsZW5hbWUqIGlzIG5vdCAqTlVMTCosIGl0IGlzIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3Igb2YgKnR5cGUqIGFzIGEgdGhpcmQKLSAgIHBhcmFtZXRlci4gIEluIHRoZSBjYXNlIG9mIGV4Y2VwdGlvbnMgc3VjaCBhcyA6ZXhjOmBJT0Vycm9yYCBhbmQgOmV4YzpgT1NFcnJvcmAsCi0gICB0aGlzIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSA6YXR0cjpgZmlsZW5hbWVgIGF0dHJpYnV0ZSBvZiB0aGUgZXhjZXB0aW9uIGluc3RhbmNlLgorICAgU2ltaWxhciB0byA6YzpmdW5jOmBQeUVycl9TZXRGcm9tRXJybm9gLCB3aXRoIHRoZSBhZGRpdGlvbmFsIGJlaGF2aW9yIHRoYXQgaWYKKyAgICpmaWxlbmFtZU9iamVjdCogaXMgbm90ICpOVUxMKiwgaXQgaXMgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciBvZiAqdHlwZSogYXMKKyAgIGEgdGhpcmQgcGFyYW1ldGVyLiAgSW4gdGhlIGNhc2Ugb2YgZXhjZXB0aW9ucyBzdWNoIGFzIDpleGM6YElPRXJyb3JgIGFuZAorICAgOmV4YzpgT1NFcnJvcmAsIHRoaXMgaXMgdXNlZCB0byBkZWZpbmUgdGhlIDphdHRyOmBmaWxlbmFtZWAgYXR0cmlidXRlIG9mIHRoZQorICAgZXhjZXB0aW9uIGluc3RhbmNlLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUVycl9TZXRGcm9tV2luZG93c0VycihpbnQgaWVycikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lKFB5T2JqZWN0ICp0eXBlLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKKworICAgU2ltaWxhciB0byA6YzpmdW5jOmBQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWVPYmplY3RgLCBidXQgdGhlIGZpbGVuYW1lCisgICBpcyBnaXZlbiBhcyBhIEMgc3RyaW5nLgorCisKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoaW50IGllcnIpCiAKICAgIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiB0byByYWlzZSA6ZXhjOmBXaW5kb3dzRXJyb3JgLiBJZiBjYWxsZWQgd2l0aAotICAgKmllcnIqIG9mIDpjZGF0YTpgMGAsIHRoZSBlcnJvciBjb2RlIHJldHVybmVkIGJ5IGEgY2FsbCB0byA6Y2Z1bmM6YEdldExhc3RFcnJvcmAKLSAgIGlzIHVzZWQgaW5zdGVhZC4gIEl0IGNhbGxzIHRoZSBXaW4zMiBmdW5jdGlvbiA6Y2Z1bmM6YEZvcm1hdE1lc3NhZ2VgIHRvIHJldHJpZXZlCi0gICB0aGUgV2luZG93cyBkZXNjcmlwdGlvbiBvZiBlcnJvciBjb2RlIGdpdmVuIGJ5ICppZXJyKiBvciA6Y2Z1bmM6YEdldExhc3RFcnJvcmAsCisgICAqaWVyciogb2YgOmM6ZGF0YTpgMGAsIHRoZSBlcnJvciBjb2RlIHJldHVybmVkIGJ5IGEgY2FsbCB0byA6YzpmdW5jOmBHZXRMYXN0RXJyb3JgCisgICBpcyB1c2VkIGluc3RlYWQuICBJdCBjYWxscyB0aGUgV2luMzIgZnVuY3Rpb24gOmM6ZnVuYzpgRm9ybWF0TWVzc2FnZWAgdG8gcmV0cmlldmUKKyAgIHRoZSBXaW5kb3dzIGRlc2NyaXB0aW9uIG9mIGVycm9yIGNvZGUgZ2l2ZW4gYnkgKmllcnIqIG9yIDpjOmZ1bmM6YEdldExhc3RFcnJvcmAsCiAgICB0aGVuIGl0IGNvbnN0cnVjdHMgYSB0dXBsZSBvYmplY3Qgd2hvc2UgZmlyc3QgaXRlbSBpcyB0aGUgKmllcnIqIHZhbHVlIGFuZCB3aG9zZQogICAgc2Vjb25kIGl0ZW0gaXMgdGhlIGNvcnJlc3BvbmRpbmcgZXJyb3IgbWVzc2FnZSAoZ290dGVuIGZyb20KLSAgIDpjZnVuYzpgRm9ybWF0TWVzc2FnZWApLCBhbmQgdGhlbiBjYWxscyBgYFB5RXJyX1NldE9iamVjdChQeUV4Y19XaW5kb3dzRXJyb3IsCisgICA6YzpmdW5jOmBGb3JtYXRNZXNzYWdlYCksIGFuZCB0aGVuIGNhbGxzIGBgUHlFcnJfU2V0T2JqZWN0KFB5RXhjX1dpbmRvd3NFcnJvciwKICAgIG9iamVjdClgYC4gVGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyAqTlVMTCouIEF2YWlsYWJpbGl0eTogV2luZG93cy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnIoUHlPYmplY3QgKnR5cGUsIGludCBpZXJyKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycihQeU9iamVjdCAqdHlwZSwgaW50IGllcnIpCiAKLSAgIFNpbWlsYXIgdG8gOmNmdW5jOmBQeUVycl9TZXRGcm9tV2luZG93c0VycmAsIHdpdGggYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIKKyAgIFNpbWlsYXIgdG8gOmM6ZnVuYzpgUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJgLCB3aXRoIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyCiAgICBzcGVjaWZ5aW5nIHRoZSBleGNlcHRpb24gdHlwZSB0byBiZSByYWlzZWQuIEF2YWlsYWJpbGl0eTogV2luZG93cy4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4zCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lKGludCBpZXJyLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWVPYmplY3QoaW50IGllcnIsIFB5T2JqZWN0ICpmaWxlbmFtZU9iamVjdCkKIAotICAgU2ltaWxhciB0byA6Y2Z1bmM6YFB5RXJyX1NldEZyb21XaW5kb3dzRXJyYCwgd2l0aCB0aGUgYWRkaXRpb25hbCBiZWhhdmlvciB0aGF0Ci0gICBpZiAqZmlsZW5hbWUqIGlzIG5vdCAqTlVMTCosIGl0IGlzIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3Igb2YKKyAgIFNpbWlsYXIgdG8gOmM6ZnVuYzpgUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJgLCB3aXRoIHRoZSBhZGRpdGlvbmFsIGJlaGF2aW9yIHRoYXQKKyAgIGlmICpmaWxlbmFtZU9iamVjdCogaXMgbm90ICpOVUxMKiwgaXQgaXMgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciBvZgogICAgOmV4YzpgV2luZG93c0Vycm9yYCBhcyBhIHRoaXJkIHBhcmFtZXRlci4gQXZhaWxhYmlsaXR5OiBXaW5kb3dzLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZShQeU9iamVjdCAqdHlwZSwgaW50IGllcnIsIGNoYXIgKmZpbGVuYW1lKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZShpbnQgaWVyciwgY29uc3QgY2hhciAqZmlsZW5hbWUpCiAKLSAgIFNpbWlsYXIgdG8gOmNmdW5jOmBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZWAsIHdpdGggYW4gYWRkaXRpb25hbAorICAgU2ltaWxhciB0byA6YzpmdW5jOmBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZU9iamVjdGAsIGJ1dCB0aGUKKyAgIGZpbGVuYW1lIGlzIGdpdmVuIGFzIGEgQyBzdHJpbmcuIEF2YWlsYWJpbGl0eTogV2luZG93cy4KKworCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lT2JqZWN0KFB5T2JqZWN0ICp0eXBlLCBpbnQgaWVyciwgUHlPYmplY3QgKmZpbGVuYW1lKQorCisgICBTaW1pbGFyIHRvIDpjOmZ1bmM6YFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lT2JqZWN0YCwgd2l0aCBhbgorICAgYWRkaXRpb25hbCBwYXJhbWV0ZXIgc3BlY2lmeWluZyB0aGUgZXhjZXB0aW9uIHR5cGUgdG8gYmUgcmFpc2VkLgorICAgQXZhaWxhYmlsaXR5OiBXaW5kb3dzLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjMKKworCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lKFB5T2JqZWN0ICp0eXBlLCBpbnQgaWVyciwgY29uc3QgY2hhciAqZmlsZW5hbWUpCisKKyAgIFNpbWlsYXIgdG8gOmM6ZnVuYzpgUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWVgLCB3aXRoIGFuIGFkZGl0aW9uYWwKICAgIHBhcmFtZXRlciBzcGVjaWZ5aW5nIHRoZSBleGNlcHRpb24gdHlwZSB0byBiZSByYWlzZWQuIEF2YWlsYWJpbGl0eTogV2luZG93cy4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4zCiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBQeUVycl9CYWRJbnRlcm5hbENhbGwoKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCkKIAogICAgVGhpcyBpcyBhIHNob3J0aGFuZCBmb3IgYGBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsIG1lc3NhZ2UpYGAsCiAgICB3aGVyZSAqbWVzc2FnZSogaW5kaWNhdGVzIHRoYXQgYW4gaW50ZXJuYWwgb3BlcmF0aW9uIChlLmcuIGEgUHl0aG9uL0MgQVBJCkBAIC0yNDMsMTMgKzI2NSwxMyBAQAogICAgdXNlLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUVycl9XYXJuRXgoUHlPYmplY3QgKmNhdGVnb3J5LCBjaGFyICptZXNzYWdlLCBpbnQgc3RhY2tsZXZlbCkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlFcnJfV2FybkV4KFB5T2JqZWN0ICpjYXRlZ29yeSwgY2hhciAqbWVzc2FnZSwgaW50IHN0YWNrbGV2ZWwpCiAKICAgIElzc3VlIGEgd2FybmluZyBtZXNzYWdlLiAgVGhlICpjYXRlZ29yeSogYXJndW1lbnQgaXMgYSB3YXJuaW5nIGNhdGVnb3J5IChzZWUKICAgIGJlbG93KSBvciAqTlVMTCo7IHRoZSAqbWVzc2FnZSogYXJndW1lbnQgaXMgYSBtZXNzYWdlIHN0cmluZy4gICpzdGFja2xldmVsKiBpcyBhCiAgICBwb3NpdGl2ZSBudW1iZXIgZ2l2aW5nIGEgbnVtYmVyIG9mIHN0YWNrIGZyYW1lczsgdGhlIHdhcm5pbmcgd2lsbCBiZSBpc3N1ZWQgZnJvbQogICAgdGhlICBjdXJyZW50bHkgZXhlY3V0aW5nIGxpbmUgb2YgY29kZSBpbiB0aGF0IHN0YWNrIGZyYW1lLiAgQSAqc3RhY2tsZXZlbCogb2YgMQotICAgaXMgdGhlIGZ1bmN0aW9uIGNhbGxpbmcgOmNmdW5jOmBQeUVycl9XYXJuRXhgLCAyIGlzICB0aGUgZnVuY3Rpb24gYWJvdmUgdGhhdCwKKyAgIGlzIHRoZSBmdW5jdGlvbiBjYWxsaW5nIDpjOmZ1bmM6YFB5RXJyX1dhcm5FeGAsIDIgaXMgIHRoZSBmdW5jdGlvbiBhYm92ZSB0aGF0LAogICAgYW5kIHNvIGZvcnRoLgogCiAgICBUaGlzIGZ1bmN0aW9uIG5vcm1hbGx5IHByaW50cyBhIHdhcm5pbmcgbWVzc2FnZSB0byAqc3lzLnN0ZGVycio7IGhvd2V2ZXIsIGl0IGlzCkBAIC0yNjEsMzYgKzI4MywzNiBAQAogICAgaXMgcmFpc2VkLiAgKEl0IGlzIG5vdCBwb3NzaWJsZSB0byBkZXRlcm1pbmUgd2hldGhlciBhIHdhcm5pbmcgbWVzc2FnZSBpcwogICAgYWN0dWFsbHkgcHJpbnRlZCwgbm9yIHdoYXQgdGhlIHJlYXNvbiBpcyBmb3IgdGhlIGV4Y2VwdGlvbjsgdGhpcyBpcwogICAgaW50ZW50aW9uYWwuKSAgSWYgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZCwgdGhlIGNhbGxlciBzaG91bGQgZG8gaXRzIG5vcm1hbAotICAgZXhjZXB0aW9uIGhhbmRsaW5nIChmb3IgZXhhbXBsZSwgOmNmdW5jOmBQeV9ERUNSRUZgIG93bmVkIHJlZmVyZW5jZXMgYW5kIHJldHVybgorICAgZXhjZXB0aW9uIGhhbmRsaW5nIChmb3IgZXhhbXBsZSwgOmM6ZnVuYzpgUHlfREVDUkVGYCBvd25lZCByZWZlcmVuY2VzIGFuZCByZXR1cm4KICAgIGFuIGVycm9yIHZhbHVlKS4KIAotICAgV2FybmluZyBjYXRlZ29yaWVzIG11c3QgYmUgc3ViY2xhc3NlcyBvZiA6Y2RhdGE6YFdhcm5pbmdgOyB0aGUgZGVmYXVsdCB3YXJuaW5nCi0gICBjYXRlZ29yeSBpcyA6Y2RhdGE6YFJ1bnRpbWVXYXJuaW5nYC4gIFRoZSBzdGFuZGFyZCBQeXRob24gd2FybmluZyBjYXRlZ29yaWVzIGFyZQorICAgV2FybmluZyBjYXRlZ29yaWVzIG11c3QgYmUgc3ViY2xhc3NlcyBvZiA6YzpkYXRhOmBXYXJuaW5nYDsgdGhlIGRlZmF1bHQgd2FybmluZworICAgY2F0ZWdvcnkgaXMgOmM6ZGF0YTpgUnVudGltZVdhcm5pbmdgLiAgVGhlIHN0YW5kYXJkIFB5dGhvbiB3YXJuaW5nIGNhdGVnb3JpZXMgYXJlCiAgICBhdmFpbGFibGUgYXMgZ2xvYmFsIHZhcmlhYmxlcyB3aG9zZSBuYW1lcyBhcmUgYGBQeUV4Y19gYCBmb2xsb3dlZCBieSB0aGUgUHl0aG9uCi0gICBleGNlcHRpb24gbmFtZS4gVGhlc2UgaGF2ZSB0aGUgdHlwZSA6Y3R5cGU6YFB5T2JqZWN0XCpgOyB0aGV5IGFyZSBhbGwgY2xhc3MKLSAgIG9iamVjdHMuIFRoZWlyIG5hbWVzIGFyZSA6Y2RhdGE6YFB5RXhjX1dhcm5pbmdgLCA6Y2RhdGE6YFB5RXhjX1VzZXJXYXJuaW5nYCwKLSAgIDpjZGF0YTpgUHlFeGNfVW5pY29kZVdhcm5pbmdgLCA6Y2RhdGE6YFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZ2AsCi0gICA6Y2RhdGE6YFB5RXhjX1N5bnRheFdhcm5pbmdgLCA6Y2RhdGE6YFB5RXhjX1J1bnRpbWVXYXJuaW5nYCwgYW5kCi0gICA6Y2RhdGE6YFB5RXhjX0Z1dHVyZVdhcm5pbmdgLiAgOmNkYXRhOmBQeUV4Y19XYXJuaW5nYCBpcyBhIHN1YmNsYXNzIG9mCi0gICA6Y2RhdGE6YFB5RXhjX0V4Y2VwdGlvbmA7IHRoZSBvdGhlciB3YXJuaW5nIGNhdGVnb3JpZXMgYXJlIHN1YmNsYXNzZXMgb2YKLSAgIDpjZGF0YTpgUHlFeGNfV2FybmluZ2AuCisgICBleGNlcHRpb24gbmFtZS4gVGhlc2UgaGF2ZSB0aGUgdHlwZSA6Yzp0eXBlOmBQeU9iamVjdFwqYDsgdGhleSBhcmUgYWxsIGNsYXNzCisgICBvYmplY3RzLiBUaGVpciBuYW1lcyBhcmUgOmM6ZGF0YTpgUHlFeGNfV2FybmluZ2AsIDpjOmRhdGE6YFB5RXhjX1VzZXJXYXJuaW5nYCwKKyAgIDpjOmRhdGE6YFB5RXhjX1VuaWNvZGVXYXJuaW5nYCwgOmM6ZGF0YTpgUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nYCwKKyAgIDpjOmRhdGE6YFB5RXhjX1N5bnRheFdhcm5pbmdgLCA6YzpkYXRhOmBQeUV4Y19SdW50aW1lV2FybmluZ2AsIGFuZAorICAgOmM6ZGF0YTpgUHlFeGNfRnV0dXJlV2FybmluZ2AuICA6YzpkYXRhOmBQeUV4Y19XYXJuaW5nYCBpcyBhIHN1YmNsYXNzIG9mCisgICA6YzpkYXRhOmBQeUV4Y19FeGNlcHRpb25gOyB0aGUgb3RoZXIgd2FybmluZyBjYXRlZ29yaWVzIGFyZSBzdWJjbGFzc2VzIG9mCisgICA6YzpkYXRhOmBQeUV4Y19XYXJuaW5nYC4KIAogICAgRm9yIGluZm9ybWF0aW9uIGFib3V0IHdhcm5pbmcgY29udHJvbCwgc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUKICAgIDptb2Q6YHdhcm5pbmdzYCBtb2R1bGUgYW5kIHRoZSA6b3B0aW9uOmAtV2Agb3B0aW9uIGluIHRoZSBjb21tYW5kIGxpbmUKICAgIGRvY3VtZW50YXRpb24uICBUaGVyZSBpcyBubyBDIEFQSSBmb3Igd2FybmluZyBjb250cm9sLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUVycl9XYXJuKFB5T2JqZWN0ICpjYXRlZ29yeSwgY2hhciAqbWVzc2FnZSkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlFcnJfV2FybihQeU9iamVjdCAqY2F0ZWdvcnksIGNoYXIgKm1lc3NhZ2UpCiAKICAgIElzc3VlIGEgd2FybmluZyBtZXNzYWdlLiAgVGhlICpjYXRlZ29yeSogYXJndW1lbnQgaXMgYSB3YXJuaW5nIGNhdGVnb3J5IChzZWUKICAgIGJlbG93KSBvciAqTlVMTCo7IHRoZSAqbWVzc2FnZSogYXJndW1lbnQgaXMgYSBtZXNzYWdlIHN0cmluZy4gIFRoZSB3YXJuaW5nIHdpbGwKLSAgIGFwcGVhciB0byBiZSBpc3N1ZWQgZnJvbSB0aGUgZnVuY3Rpb24gY2FsbGluZyA6Y2Z1bmM6YFB5RXJyX1dhcm5gLCBlcXVpdmFsZW50IHRvCi0gICBjYWxsaW5nIDpjZnVuYzpgUHlFcnJfV2FybkV4YCB3aXRoIGEgKnN0YWNrbGV2ZWwqIG9mIDEuCisgICBhcHBlYXIgdG8gYmUgaXNzdWVkIGZyb20gdGhlIGZ1bmN0aW9uIGNhbGxpbmcgOmM6ZnVuYzpgUHlFcnJfV2FybmAsIGVxdWl2YWxlbnQgdG8KKyAgIGNhbGxpbmcgOmM6ZnVuYzpgUHlFcnJfV2FybkV4YCB3aXRoIGEgKnN0YWNrbGV2ZWwqIG9mIDEuCiAKLSAgIERlcHJlY2F0ZWQ7IHVzZSA6Y2Z1bmM6YFB5RXJyX1dhcm5FeGAgaW5zdGVhZC4KKyAgIERlcHJlY2F0ZWQ7IHVzZSA6YzpmdW5jOmBQeUVycl9XYXJuRXhgIGluc3RlYWQuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5RXJyX1dhcm5FeHBsaWNpdChQeU9iamVjdCAqY2F0ZWdvcnksIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW5vLCBjb25zdCBjaGFyICptb2R1bGUsIFB5T2JqZWN0ICpyZWdpc3RyeSkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlFcnJfV2FybkV4cGxpY2l0KFB5T2JqZWN0ICpjYXRlZ29yeSwgY29uc3QgY2hhciAqbWVzc2FnZSwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBsaW5lbm8sIGNvbnN0IGNoYXIgKm1vZHVsZSwgUHlPYmplY3QgKnJlZ2lzdHJ5KQogCiAgICBJc3N1ZSBhIHdhcm5pbmcgbWVzc2FnZSB3aXRoIGV4cGxpY2l0IGNvbnRyb2wgb3ZlciBhbGwgd2FybmluZyBhdHRyaWJ1dGVzLiAgVGhpcwogICAgaXMgYSBzdHJhaWdodGZvcndhcmQgd3JhcHBlciBhcm91bmQgdGhlIFB5dGhvbiBmdW5jdGlvbgpAQCAtMjk5LDE1ICszMjEsMTUgQEAKICAgIGRlc2NyaWJlZCB0aGVyZS4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlFcnJfV2FyblB5M2soY2hhciAqbWVzc2FnZSwgaW50IHN0YWNrbGV2ZWwpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5RXJyX1dhcm5QeTNrKGNoYXIgKm1lc3NhZ2UsIGludCBzdGFja2xldmVsKQogCiAgICBJc3N1ZSBhIDpleGM6YERlcHJlY2F0aW9uV2FybmluZ2Agd2l0aCB0aGUgZ2l2ZW4gKm1lc3NhZ2UqIGFuZCAqc3RhY2tsZXZlbCoKLSAgIGlmIHRoZSA6Y2RhdGE6YFB5X1B5M2tXYXJuaW5nRmxhZ2AgZmxhZyBpcyBlbmFibGVkLgorICAgaWYgdGhlIDpjOmRhdGE6YFB5X1B5M2tXYXJuaW5nRmxhZ2AgZmxhZyBpcyBlbmFibGVkLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjYKIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlFcnJfQ2hlY2tTaWduYWxzKCkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlFcnJfQ2hlY2tTaWduYWxzKCkKIAogICAgLi4gaW5kZXg6OgogICAgICAgbW9kdWxlOiBzaWduYWwKQEAgLTMyNCwyMSArMzQ2LDIxIEBACiAgICBjbGVhcmVkIGlmIGl0IHdhcyBwcmV2aW91c2x5IHNldC4KIAogCi0uLiBjZnVuY3Rpb246OiB2b2lkIFB5RXJyX1NldEludGVycnVwdCgpCisuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeUVycl9TZXRJbnRlcnJ1cHQoKQogCiAgICAuLiBpbmRleDo6CiAgICAgICBzaW5nbGU6IFNJR0lOVAogICAgICAgc2luZ2xlOiBLZXlib2FyZEludGVycnVwdCAoYnVpbHQtaW4gZXhjZXB0aW9uKQogCiAgICBUaGlzIGZ1bmN0aW9uIHNpbXVsYXRlcyB0aGUgZWZmZWN0IG9mIGEgOmNvbnN0OmBTSUdJTlRgIHNpZ25hbCBhcnJpdmluZyAtLS0gdGhlCi0gICBuZXh0IHRpbWUgOmNmdW5jOmBQeUVycl9DaGVja1NpZ25hbHNgIGlzIGNhbGxlZCwgIDpleGM6YEtleWJvYXJkSW50ZXJydXB0YCB3aWxsCisgICBuZXh0IHRpbWUgOmM6ZnVuYzpgUHlFcnJfQ2hlY2tTaWduYWxzYCBpcyBjYWxsZWQsICA6ZXhjOmBLZXlib2FyZEludGVycnVwdGAgd2lsbAogICAgYmUgcmFpc2VkLiAgSXQgbWF5IGJlIGNhbGxlZCB3aXRob3V0IGhvbGRpbmcgdGhlIGludGVycHJldGVyIGxvY2suCiAKICAgIC4uICUgWFhYIFRoaXMgd2FzIGRlc2NyaWJlZCBhcyBvYnNvbGV0ZSwgYnV0IGlzIHVzZWQgaW4KICAgIC4uICUgdGhyZWFkLmludGVycnVwdF9tYWluKCkgKHVzZWQgZnJvbSBJRExFKSwgc28gaXQncyBzdGlsbCBuZWVkZWQuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5U2lnbmFsX1NldFdha2V1cEZkKGludCBmZCkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlTaWduYWxfU2V0V2FrZXVwRmQoaW50IGZkKQogCiAgICBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gc3BlY2lmaWVzIGEgZmlsZSBkZXNjcmlwdG9yIHRvIHdoaWNoIGEgYGAnXDAnYGAgYnl0ZSB3aWxsCiAgICBiZSB3cml0dGVuIHdoZW5ldmVyIGEgc2lnbmFsIGlzIHJlY2VpdmVkLiAgSXQgcmV0dXJucyB0aGUgcHJldmlvdXMgc3VjaCBmaWxlCkBAIC0zNTAsMTMgKzM3MiwxMyBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi42CiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5RXJyX05ld0V4Y2VwdGlvbihjaGFyICpuYW1lLCBQeU9iamVjdCAqYmFzZSwgUHlPYmplY3QgKmRpY3QpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5RXJyX05ld0V4Y2VwdGlvbihjaGFyICpuYW1lLCBQeU9iamVjdCAqYmFzZSwgUHlPYmplY3QgKmRpY3QpCiAKICAgIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBjcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGV4Y2VwdGlvbiBjbGFzcy4gVGhlICpuYW1lKgogICAgYXJndW1lbnQgbXVzdCBiZSB0aGUgbmFtZSBvZiB0aGUgbmV3IGV4Y2VwdGlvbiwgYSBDIHN0cmluZyBvZiB0aGUgZm9ybQogICAgYGBtb2R1bGUuY2xhc3NuYW1lYGAuICBUaGUgKmJhc2UqIGFuZCAqZGljdCogYXJndW1lbnRzIGFyZSBub3JtYWxseSAqTlVMTCouCiAgICBUaGlzIGNyZWF0ZXMgYSBjbGFzcyBvYmplY3QgZGVyaXZlZCBmcm9tIDpleGM6YEV4Y2VwdGlvbmAgKGFjY2Vzc2libGUgaW4gQyBhcwotICAgOmNkYXRhOmBQeUV4Y19FeGNlcHRpb25gKS4KKyAgIDpjOmRhdGE6YFB5RXhjX0V4Y2VwdGlvbmApLgogCiAgICBUaGUgOmF0dHI6YF9fbW9kdWxlX19gIGF0dHJpYnV0ZSBvZiB0aGUgbmV3IGNsYXNzIGlzIHNldCB0byB0aGUgZmlyc3QgcGFydCAodXAKICAgIHRvIHRoZSBsYXN0IGRvdCkgb2YgdGhlICpuYW1lKiBhcmd1bWVudCwgYW5kIHRoZSBjbGFzcyBuYW1lIGlzIHNldCB0byB0aGUgbGFzdApAQCAtMzY1LDE2ICszODcsMTYgQEAKICAgIGFyZ3VtZW50IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBkaWN0aW9uYXJ5IG9mIGNsYXNzIHZhcmlhYmxlcyBhbmQgbWV0aG9kcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlFcnJfTmV3RXhjZXB0aW9uV2l0aERvYyhjaGFyICpuYW1lLCBjaGFyICpkb2MsIFB5T2JqZWN0ICpiYXNlLCBQeU9iamVjdCAqZGljdCkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlFcnJfTmV3RXhjZXB0aW9uV2l0aERvYyhjaGFyICpuYW1lLCBjaGFyICpkb2MsIFB5T2JqZWN0ICpiYXNlLCBQeU9iamVjdCAqZGljdCkKIAotICAgU2FtZSBhcyA6Y2Z1bmM6YFB5RXJyX05ld0V4Y2VwdGlvbmAsIGV4Y2VwdCB0aGF0IHRoZSBuZXcgZXhjZXB0aW9uIGNsYXNzIGNhbgorICAgU2FtZSBhcyA6YzpmdW5jOmBQeUVycl9OZXdFeGNlcHRpb25gLCBleGNlcHQgdGhhdCB0aGUgbmV3IGV4Y2VwdGlvbiBjbGFzcyBjYW4KICAgIGVhc2lseSBiZSBnaXZlbiBhIGRvY3N0cmluZzogSWYgKmRvYyogaXMgbm9uLSpOVUxMKiwgaXQgd2lsbCBiZSB1c2VkIGFzIHRoZQogICAgZG9jc3RyaW5nIGZvciB0aGUgZXhjZXB0aW9uIGNsYXNzLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjcKIAogCi0uLiBjZnVuY3Rpb246OiB2b2lkIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShQeU9iamVjdCAqb2JqKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKFB5T2JqZWN0ICpvYmopCiAKICAgIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBwcmludHMgYSB3YXJuaW5nIG1lc3NhZ2UgdG8gYGBzeXMuc3RkZXJyYGAgd2hlbiBhbgogICAgZXhjZXB0aW9uIGhhcyBiZWVuIHNldCBidXQgaXQgaXMgaW1wb3NzaWJsZSBmb3IgdGhlIGludGVycHJldGVyIHRvIGFjdHVhbGx5CkBAIC0zOTMsMzMgKzQxNSwzMyBAQAogCiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBjcmVhdGUgYW5kIG1vZGlmeSBVbmljb2RlIGV4Y2VwdGlvbnMgZnJvbSBDLgogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlRGVjb2RlRXJyb3JfQ3JlYXRlKGNvbnN0IGNoYXIgKmVuY29kaW5nLCBjb25zdCBjaGFyICpvYmplY3QsIFB5X3NzaXplX3QgbGVuZ3RoLCBQeV9zc2l6ZV90IHN0YXJ0LCBQeV9zc2l6ZV90IGVuZCwgY29uc3QgY2hhciAqcmVhc29uKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVEZWNvZGVFcnJvcl9DcmVhdGUoY29uc3QgY2hhciAqZW5jb2RpbmcsIGNvbnN0IGNoYXIgKm9iamVjdCwgUHlfc3NpemVfdCBsZW5ndGgsIFB5X3NzaXplX3Qgc3RhcnQsIFB5X3NzaXplX3QgZW5kLCBjb25zdCBjaGFyICpyZWFzb24pCiAKICAgIENyZWF0ZSBhIDpjbGFzczpgVW5pY29kZURlY29kZUVycm9yYCBvYmplY3Qgd2l0aCB0aGUgYXR0cmlidXRlcyAqZW5jb2RpbmcqLAogICAgKm9iamVjdCosICpsZW5ndGgqLCAqc3RhcnQqLCAqZW5kKiBhbmQgKnJlYXNvbiouCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVFbmNvZGVFcnJvcl9DcmVhdGUoY29uc3QgY2hhciAqZW5jb2RpbmcsIGNvbnN0IFB5X1VOSUNPREUgKm9iamVjdCwgUHlfc3NpemVfdCBsZW5ndGgsIFB5X3NzaXplX3Qgc3RhcnQsIFB5X3NzaXplX3QgZW5kLCBjb25zdCBjaGFyICpyZWFzb24pCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZUVuY29kZUVycm9yX0NyZWF0ZShjb25zdCBjaGFyICplbmNvZGluZywgY29uc3QgUHlfVU5JQ09ERSAqb2JqZWN0LCBQeV9zc2l6ZV90IGxlbmd0aCwgUHlfc3NpemVfdCBzdGFydCwgUHlfc3NpemVfdCBlbmQsIGNvbnN0IGNoYXIgKnJlYXNvbikKIAogICAgQ3JlYXRlIGEgOmNsYXNzOmBVbmljb2RlRW5jb2RlRXJyb3JgIG9iamVjdCB3aXRoIHRoZSBhdHRyaWJ1dGVzICplbmNvZGluZyosCiAgICAqb2JqZWN0KiwgKmxlbmd0aCosICpzdGFydCosICplbmQqIGFuZCAqcmVhc29uKi4KIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0NyZWF0ZShjb25zdCBQeV9VTklDT0RFICpvYmplY3QsIFB5X3NzaXplX3QgbGVuZ3RoLCBQeV9zc2l6ZV90IHN0YXJ0LCBQeV9zc2l6ZV90IGVuZCwgY29uc3QgY2hhciAqcmVhc29uKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9DcmVhdGUoY29uc3QgUHlfVU5JQ09ERSAqb2JqZWN0LCBQeV9zc2l6ZV90IGxlbmd0aCwgUHlfc3NpemVfdCBzdGFydCwgUHlfc3NpemVfdCBlbmQsIGNvbnN0IGNoYXIgKnJlYXNvbikKIAogICAgQ3JlYXRlIGEgOmNsYXNzOmBVbmljb2RlVHJhbnNsYXRlRXJyb3JgIG9iamVjdCB3aXRoIHRoZSBhdHRyaWJ1dGVzICpvYmplY3QqLAogICAgKmxlbmd0aCosICpzdGFydCosICplbmQqIGFuZCAqcmVhc29uKi4KIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZURlY29kZUVycm9yX0dldEVuY29kaW5nKFB5T2JqZWN0ICpleGMpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZURlY29kZUVycm9yX0dldEVuY29kaW5nKFB5T2JqZWN0ICpleGMpCiAgICAgICAgICAgICAgICBQeU9iamVjdCogUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5jb2RpbmcoUHlPYmplY3QgKmV4YykKIAogICAgUmV0dXJuIHRoZSAqZW5jb2RpbmcqIGF0dHJpYnV0ZSBvZiB0aGUgZ2l2ZW4gZXhjZXB0aW9uIG9iamVjdC4KIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZURlY29kZUVycm9yX0dldE9iamVjdChQeU9iamVjdCAqZXhjKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRPYmplY3QoUHlPYmplY3QgKmV4YykKICAgICAgICAgICAgICAgIFB5T2JqZWN0KiBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRPYmplY3QoUHlPYmplY3QgKmV4YykKICAgICAgICAgICAgICAgIFB5T2JqZWN0KiBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRPYmplY3QoUHlPYmplY3QgKmV4YykKIAogICAgUmV0dXJuIHRoZSAqb2JqZWN0KiBhdHRyaWJ1dGUgb2YgdGhlIGdpdmVuIGV4Y2VwdGlvbiBvYmplY3QuCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRTdGFydChQeU9iamVjdCAqZXhjLCBQeV9zc2l6ZV90ICpzdGFydCkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0U3RhcnQoUHlPYmplY3QgKmV4YywgUHlfc3NpemVfdCAqc3RhcnQpCiAgICAgICAgICAgICAgICBpbnQgUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0U3RhcnQoUHlPYmplY3QgKmV4YywgUHlfc3NpemVfdCAqc3RhcnQpCiAgICAgICAgICAgICAgICBpbnQgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0U3RhcnQoUHlPYmplY3QgKmV4YywgUHlfc3NpemVfdCAqc3RhcnQpCiAKQEAgLTQyNywxNCArNDQ5LDE0IEBACiAgICAqXCpzdGFydCouICAqc3RhcnQqIG11c3Qgbm90IGJlICpOVUxMKi4gIFJldHVybiBgYDBgYCBvbiBzdWNjZXNzLCBgYC0xYGAgb24KICAgIGZhaWx1cmUuCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRTdGFydChQeU9iamVjdCAqZXhjLCBQeV9zc2l6ZV90IHN0YXJ0KQorLi4gYzpmdW5jdGlvbjo6IGludCBQeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRTdGFydChQeU9iamVjdCAqZXhjLCBQeV9zc2l6ZV90IHN0YXJ0KQogICAgICAgICAgICAgICAgaW50IFB5VW5pY29kZUVuY29kZUVycm9yX1NldFN0YXJ0KFB5T2JqZWN0ICpleGMsIFB5X3NzaXplX3Qgc3RhcnQpCiAgICAgICAgICAgICAgICBpbnQgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0U3RhcnQoUHlPYmplY3QgKmV4YywgUHlfc3NpemVfdCBzdGFydCkKIAogICAgU2V0IHRoZSAqc3RhcnQqIGF0dHJpYnV0ZSBvZiB0aGUgZ2l2ZW4gZXhjZXB0aW9uIG9iamVjdCB0byAqc3RhcnQqLiAgUmV0dXJuCiAgICBgYDBgYCBvbiBzdWNjZXNzLCBgYC0xYGAgb24gZmFpbHVyZS4KIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5VW5pY29kZURlY29kZUVycm9yX0dldEVuZChQeU9iamVjdCAqZXhjLCBQeV9zc2l6ZV90ICplbmQpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5VW5pY29kZURlY29kZUVycm9yX0dldEVuZChQeU9iamVjdCAqZXhjLCBQeV9zc2l6ZV90ICplbmQpCiAgICAgICAgICAgICAgICBpbnQgUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5kKFB5T2JqZWN0ICpleGMsIFB5X3NzaXplX3QgKmVuZCkKICAgICAgICAgICAgICAgIGludCBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRFbmQoUHlPYmplY3QgKmV4YywgUHlfc3NpemVfdCAqZW5kKQogCkBAIC00NDIsMjAgKzQ2NCwyMCBAQAogICAgKlwqZW5kKi4gICplbmQqIG11c3Qgbm90IGJlICpOVUxMKi4gIFJldHVybiBgYDBgYCBvbiBzdWNjZXNzLCBgYC0xYGAgb24KICAgIGZhaWx1cmUuCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRFbmQoUHlPYmplY3QgKmV4YywgUHlfc3NpemVfdCBlbmQpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5VW5pY29kZURlY29kZUVycm9yX1NldEVuZChQeU9iamVjdCAqZXhjLCBQeV9zc2l6ZV90IGVuZCkKICAgICAgICAgICAgICAgIGludCBQeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRFbmQoUHlPYmplY3QgKmV4YywgUHlfc3NpemVfdCBlbmQpCiAgICAgICAgICAgICAgICBpbnQgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0RW5kKFB5T2JqZWN0ICpleGMsIFB5X3NzaXplX3QgZW5kKQogCiAgICBTZXQgdGhlICplbmQqIGF0dHJpYnV0ZSBvZiB0aGUgZ2l2ZW4gZXhjZXB0aW9uIG9iamVjdCB0byAqZW5kKi4gIFJldHVybiBgYDBgYAogICAgb24gc3VjY2VzcywgYGAtMWBgIG9uIGZhaWx1cmUuCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRSZWFzb24oUHlPYmplY3QgKmV4YykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0UmVhc29uKFB5T2JqZWN0ICpleGMpCiAgICAgICAgICAgICAgICBQeU9iamVjdCogUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0UmVhc29uKFB5T2JqZWN0ICpleGMpCiAgICAgICAgICAgICAgICBQeU9iamVjdCogUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0UmVhc29uKFB5T2JqZWN0ICpleGMpCiAKICAgIFJldHVybiB0aGUgKnJlYXNvbiogYXR0cmlidXRlIG9mIHRoZSBnaXZlbiBleGNlcHRpb24gb2JqZWN0LgogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0UmVhc29uKFB5T2JqZWN0ICpleGMsIGNvbnN0IGNoYXIgKnJlYXNvbikKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0UmVhc29uKFB5T2JqZWN0ICpleGMsIGNvbnN0IGNoYXIgKnJlYXNvbikKICAgICAgICAgICAgICAgIGludCBQeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRSZWFzb24oUHlPYmplY3QgKmV4YywgY29uc3QgY2hhciAqcmVhc29uKQogICAgICAgICAgICAgICAgaW50IFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldFJlYXNvbihQeU9iamVjdCAqZXhjLCBjb25zdCBjaGFyICpyZWFzb24pCiAKQEAgLTQ3MSwxMiArNDkzLDEyIEBACiByZWN1cnNpdmUgY29kZSBkb2VzIG5vdCBuZWNlc3NhcmlseSBpbnZva2UgUHl0aG9uIGNvZGUgKHdoaWNoIHRyYWNrcyBpdHMKIHJlY3Vyc2lvbiBkZXB0aCBhdXRvbWF0aWNhbGx5KS4KIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5X0VudGVyUmVjdXJzaXZlQ2FsbChjaGFyICp3aGVyZSkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlfRW50ZXJSZWN1cnNpdmVDYWxsKGNoYXIgKndoZXJlKQogCiAgICBNYXJrcyBhIHBvaW50IHdoZXJlIGEgcmVjdXJzaXZlIEMtbGV2ZWwgY2FsbCBpcyBhYm91dCB0byBiZSBwZXJmb3JtZWQuCiAKICAgIElmIDpjb25zdDpgVVNFX1NUQUNLQ0hFQ0tgIGlzIGRlZmluZWQsIHRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBPUwotICAgc3RhY2sgb3ZlcmZsb3dlZCB1c2luZyA6Y2Z1bmM6YFB5T1NfQ2hlY2tTdGFja2AuICBJbiB0aGlzIGlzIHRoZSBjYXNlLCBpdAorICAgc3RhY2sgb3ZlcmZsb3dlZCB1c2luZyA6YzpmdW5jOmBQeU9TX0NoZWNrU3RhY2tgLiAgSW4gdGhpcyBpcyB0aGUgY2FzZSwgaXQKICAgIHNldHMgYSA6ZXhjOmBNZW1vcnlFcnJvcmAgYW5kIHJldHVybnMgYSBub256ZXJvIHZhbHVlLgogCiAgICBUaGUgZnVuY3Rpb24gdGhlbiBjaGVja3MgaWYgdGhlIHJlY3Vyc2lvbiBsaW1pdCBpcyByZWFjaGVkLiAgSWYgdGhpcyBpcyB0aGUKQEAgLTQ4NywxMCArNTA5LDEwIEBACiAgICBjb25jYXRlbmF0ZWQgdG8gdGhlIDpleGM6YFJ1bnRpbWVFcnJvcmAgbWVzc2FnZSBjYXVzZWQgYnkgdGhlIHJlY3Vyc2lvbiBkZXB0aAogICAgbGltaXQuCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCkKKy4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpCiAKLSAgIEVuZHMgYSA6Y2Z1bmM6YFB5X0VudGVyUmVjdXJzaXZlQ2FsbGAuICBNdXN0IGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoCi0gICAqc3VjY2Vzc2Z1bCogaW52b2NhdGlvbiBvZiA6Y2Z1bmM6YFB5X0VudGVyUmVjdXJzaXZlQ2FsbGAuCisgICBFbmRzIGEgOmM6ZnVuYzpgUHlfRW50ZXJSZWN1cnNpdmVDYWxsYC4gIE11c3QgYmUgY2FsbGVkIG9uY2UgZm9yIGVhY2gKKyAgICpzdWNjZXNzZnVsKiBpbnZvY2F0aW9uIG9mIDpjOmZ1bmM6YFB5X0VudGVyUmVjdXJzaXZlQ2FsbGAuCiAKIAogLi4gX3N0YW5kYXJkZXhjZXB0aW9uczoKQEAgLTUwMCw3MCArNTIyLDcwIEBACiAKIEFsbCBzdGFuZGFyZCBQeXRob24gZXhjZXB0aW9ucyBhcmUgYXZhaWxhYmxlIGFzIGdsb2JhbCB2YXJpYWJsZXMgd2hvc2UgbmFtZXMgYXJlCiBgYFB5RXhjX2BgIGZvbGxvd2VkIGJ5IHRoZSBQeXRob24gZXhjZXB0aW9uIG5hbWUuICBUaGVzZSBoYXZlIHRoZSB0eXBlCi06Y3R5cGU6YFB5T2JqZWN0XCpgOyB0aGV5IGFyZSBhbGwgY2xhc3Mgb2JqZWN0cy4gIEZvciBjb21wbGV0ZW5lc3MsIGhlcmUgYXJlIGFsbAorOmM6dHlwZTpgUHlPYmplY3RcKmA7IHRoZXkgYXJlIGFsbCBjbGFzcyBvYmplY3RzLiAgRm9yIGNvbXBsZXRlbmVzcywgaGVyZSBhcmUgYWxsCiB0aGUgdmFyaWFibGVzOgogCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKLXwgQyBOYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFB5dGhvbiBOYW1lICAgICAgICAgICAgICAgIHwgTm90ZXMgICAgfAotKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT0rCi18IDpjZGF0YTpgUHlFeGNfQmFzZUV4Y2VwdGlvbmAgICAgICAgfCA6ZXhjOmBCYXNlRXhjZXB0aW9uYCAgICAgICB8ICgxKSwgKDQpIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKwotfCA6Y2RhdGE6YFB5RXhjX0V4Y2VwdGlvbmAgICAgICAgICAgIHwgOmV4YzpgRXhjZXB0aW9uYCAgICAgICAgICAgfCBcKDEpICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKLXwgOmNkYXRhOmBQeUV4Y19TdGFuZGFyZEVycm9yYCAgICAgICB8IDpleGM6YFN0YW5kYXJkRXJyb3JgICAgICAgIHwgXCgxKSAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCi18IDpjZGF0YTpgUHlFeGNfQXJpdGhtZXRpY0Vycm9yYCAgICAgfCA6ZXhjOmBBcml0aG1ldGljRXJyb3JgICAgICB8IFwoMSkgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKwotfCA6Y2RhdGE6YFB5RXhjX0xvb2t1cEVycm9yYCAgICAgICAgIHwgOmV4YzpgTG9va3VwRXJyb3JgICAgICAgICAgfCBcKDEpICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKLXwgOmNkYXRhOmBQeUV4Y19Bc3NlcnRpb25FcnJvcmAgICAgICB8IDpleGM6YEFzc2VydGlvbkVycm9yYCAgICAgIHwgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCi18IDpjZGF0YTpgUHlFeGNfQXR0cmlidXRlRXJyb3JgICAgICAgfCA6ZXhjOmBBdHRyaWJ1dGVFcnJvcmAgICAgICB8ICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKwotfCA6Y2RhdGE6YFB5RXhjX0VPRkVycm9yYCAgICAgICAgICAgIHwgOmV4YzpgRU9GRXJyb3JgICAgICAgICAgICAgfCAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKLXwgOmNkYXRhOmBQeUV4Y19FbnZpcm9ubWVudEVycm9yYCAgICB8IDpleGM6YEVudmlyb25tZW50RXJyb3JgICAgIHwgXCgxKSAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCi18IDpjZGF0YTpgUHlFeGNfRmxvYXRpbmdQb2ludEVycm9yYCAgfCA6ZXhjOmBGbG9hdGluZ1BvaW50RXJyb3JgICB8ICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKwotfCA6Y2RhdGE6YFB5RXhjX0lPRXJyb3JgICAgICAgICAgICAgIHwgOmV4YzpgSU9FcnJvcmAgICAgICAgICAgICAgfCAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKLXwgOmNkYXRhOmBQeUV4Y19JbXBvcnRFcnJvcmAgICAgICAgICB8IDpleGM6YEltcG9ydEVycm9yYCAgICAgICAgIHwgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCi18IDpjZGF0YTpgUHlFeGNfSW5kZXhFcnJvcmAgICAgICAgICAgfCA6ZXhjOmBJbmRleEVycm9yYCAgICAgICAgICB8ICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKwotfCA6Y2RhdGE6YFB5RXhjX0tleUVycm9yYCAgICAgICAgICAgIHwgOmV4YzpgS2V5RXJyb3JgICAgICAgICAgICAgfCAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKLXwgOmNkYXRhOmBQeUV4Y19LZXlib2FyZEludGVycnVwdGAgICB8IDpleGM6YEtleWJvYXJkSW50ZXJydXB0YCAgIHwgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCi18IDpjZGF0YTpgUHlFeGNfTWVtb3J5RXJyb3JgICAgICAgICAgfCA6ZXhjOmBNZW1vcnlFcnJvcmAgICAgICAgICB8ICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKwotfCA6Y2RhdGE6YFB5RXhjX05hbWVFcnJvcmAgICAgICAgICAgIHwgOmV4YzpgTmFtZUVycm9yYCAgICAgICAgICAgfCAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKLXwgOmNkYXRhOmBQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yYCB8IDpleGM6YE5vdEltcGxlbWVudGVkRXJyb3JgIHwgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCi18IDpjZGF0YTpgUHlFeGNfT1NFcnJvcmAgICAgICAgICAgICAgfCA6ZXhjOmBPU0Vycm9yYCAgICAgICAgICAgICB8ICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKwotfCA6Y2RhdGE6YFB5RXhjX092ZXJmbG93RXJyb3JgICAgICAgIHwgOmV4YzpgT3ZlcmZsb3dFcnJvcmAgICAgICAgfCAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKLXwgOmNkYXRhOmBQeUV4Y19SZWZlcmVuY2VFcnJvcmAgICAgICB8IDpleGM6YFJlZmVyZW5jZUVycm9yYCAgICAgIHwgXCgyKSAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCi18IDpjZGF0YTpgUHlFeGNfUnVudGltZUVycm9yYCAgICAgICAgfCA6ZXhjOmBSdW50aW1lRXJyb3JgICAgICAgICB8ICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKwotfCA6Y2RhdGE6YFB5RXhjX1N5bnRheEVycm9yYCAgICAgICAgIHwgOmV4YzpgU3ludGF4RXJyb3JgICAgICAgICAgfCAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKLXwgOmNkYXRhOmBQeUV4Y19TeXN0ZW1FcnJvcmAgICAgICAgICB8IDpleGM6YFN5c3RlbUVycm9yYCAgICAgICAgIHwgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCi18IDpjZGF0YTpgUHlFeGNfU3lzdGVtRXhpdGAgICAgICAgICAgfCA6ZXhjOmBTeXN0ZW1FeGl0YCAgICAgICAgICB8ICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKwotfCA6Y2RhdGE6YFB5RXhjX1R5cGVFcnJvcmAgICAgICAgICAgIHwgOmV4YzpgVHlwZUVycm9yYCAgICAgICAgICAgfCAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKLXwgOmNkYXRhOmBQeUV4Y19WYWx1ZUVycm9yYCAgICAgICAgICB8IDpleGM6YFZhbHVlRXJyb3JgICAgICAgICAgIHwgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCi18IDpjZGF0YTpgUHlFeGNfV2luZG93c0Vycm9yYCAgICAgICAgfCA6ZXhjOmBXaW5kb3dzRXJyb3JgICAgICAgICB8IFwoMykgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKwotfCA6Y2RhdGE6YFB5RXhjX1plcm9EaXZpc2lvbkVycm9yYCAgIHwgOmV4YzpgWmVyb0RpdmlzaW9uRXJyb3JgICAgfCAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgQyBOYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQeXRob24gTmFtZSAgICAgICAgICAgICAgICB8IE5vdGVzICAgIHwKKys9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PSsKK3wgOmM6ZGF0YTpgUHlFeGNfQmFzZUV4Y2VwdGlvbmAgICAgICAgfCA6ZXhjOmBCYXNlRXhjZXB0aW9uYCAgICAgICB8ICgxKSwgKDQpIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfRXhjZXB0aW9uYCAgICAgICAgICAgfCA6ZXhjOmBFeGNlcHRpb25gICAgICAgICAgICB8IFwoMSkgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfU3RhbmRhcmRFcnJvcmAgICAgICAgfCA6ZXhjOmBTdGFuZGFyZEVycm9yYCAgICAgICB8IFwoMSkgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfQXJpdGhtZXRpY0Vycm9yYCAgICAgfCA6ZXhjOmBBcml0aG1ldGljRXJyb3JgICAgICB8IFwoMSkgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfTG9va3VwRXJyb3JgICAgICAgICAgfCA6ZXhjOmBMb29rdXBFcnJvcmAgICAgICAgICB8IFwoMSkgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfQXNzZXJ0aW9uRXJyb3JgICAgICAgfCA6ZXhjOmBBc3NlcnRpb25FcnJvcmAgICAgICB8ICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfQXR0cmlidXRlRXJyb3JgICAgICAgfCA6ZXhjOmBBdHRyaWJ1dGVFcnJvcmAgICAgICB8ICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfRU9GRXJyb3JgICAgICAgICAgICAgfCA6ZXhjOmBFT0ZFcnJvcmAgICAgICAgICAgICB8ICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfRW52aXJvbm1lbnRFcnJvcmAgICAgfCA6ZXhjOmBFbnZpcm9ubWVudEVycm9yYCAgICB8IFwoMSkgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfRmxvYXRpbmdQb2ludEVycm9yYCAgfCA6ZXhjOmBGbG9hdGluZ1BvaW50RXJyb3JgICB8ICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfSU9FcnJvcmAgICAgICAgICAgICAgfCA6ZXhjOmBJT0Vycm9yYCAgICAgICAgICAgICB8ICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfSW1wb3J0RXJyb3JgICAgICAgICAgfCA6ZXhjOmBJbXBvcnRFcnJvcmAgICAgICAgICB8ICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfSW5kZXhFcnJvcmAgICAgICAgICAgfCA6ZXhjOmBJbmRleEVycm9yYCAgICAgICAgICB8ICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfS2V5RXJyb3JgICAgICAgICAgICAgfCA6ZXhjOmBLZXlFcnJvcmAgICAgICAgICAgICB8ICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfS2V5Ym9hcmRJbnRlcnJ1cHRgICAgfCA6ZXhjOmBLZXlib2FyZEludGVycnVwdGAgICB8ICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfTWVtb3J5RXJyb3JgICAgICAgICAgfCA6ZXhjOmBNZW1vcnlFcnJvcmAgICAgICAgICB8ICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfTmFtZUVycm9yYCAgICAgICAgICAgfCA6ZXhjOmBOYW1lRXJyb3JgICAgICAgICAgICB8ICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvcmAgfCA6ZXhjOmBOb3RJbXBsZW1lbnRlZEVycm9yYCB8ICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfT1NFcnJvcmAgICAgICAgICAgICAgfCA6ZXhjOmBPU0Vycm9yYCAgICAgICAgICAgICB8ICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfT3ZlcmZsb3dFcnJvcmAgICAgICAgfCA6ZXhjOmBPdmVyZmxvd0Vycm9yYCAgICAgICB8ICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfUmVmZXJlbmNlRXJyb3JgICAgICAgfCA6ZXhjOmBSZWZlcmVuY2VFcnJvcmAgICAgICB8IFwoMikgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfUnVudGltZUVycm9yYCAgICAgICAgfCA6ZXhjOmBSdW50aW1lRXJyb3JgICAgICAgICB8ICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfU3ludGF4RXJyb3JgICAgICAgICAgfCA6ZXhjOmBTeW50YXhFcnJvcmAgICAgICAgICB8ICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfU3lzdGVtRXJyb3JgICAgICAgICAgfCA6ZXhjOmBTeXN0ZW1FcnJvcmAgICAgICAgICB8ICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfU3lzdGVtRXhpdGAgICAgICAgICAgfCA6ZXhjOmBTeXN0ZW1FeGl0YCAgICAgICAgICB8ICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfVHlwZUVycm9yYCAgICAgICAgICAgfCA6ZXhjOmBUeXBlRXJyb3JgICAgICAgICAgICB8ICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfVmFsdWVFcnJvcmAgICAgICAgICAgfCA6ZXhjOmBWYWx1ZUVycm9yYCAgICAgICAgICB8ICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfV2luZG93c0Vycm9yYCAgICAgICAgfCA6ZXhjOmBXaW5kb3dzRXJyb3JgICAgICAgICB8IFwoMykgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgOmM6ZGF0YTpgUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3JgICAgfCA6ZXhjOmBaZXJvRGl2aXNpb25FcnJvcmAgICB8ICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKIAogLi4gaW5kZXg6OgogICAgc2luZ2xlOiBQeUV4Y19CYXNlRXhjZXB0aW9uCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvZmlsZS5yc3QgYi9Eb2MvYy1hcGkvZmlsZS5yc3QKaW5kZXggOTNmNmI2NC4uYmJkNDIyMyAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL2ZpbGUucnN0CisrKyBiL0RvYy9jLWFwaS9maWxlLnJzdApAQCAtNyw3OSArNyw3OSBAQAogCiAuLiBpbmRleDo6IG9iamVjdDogZmlsZQogCi1QeXRob24ncyBidWlsdC1pbiBmaWxlIG9iamVjdHMgYXJlIGltcGxlbWVudGVkIGVudGlyZWx5IG9uIHRoZSA6Y3R5cGU6YEZJTEVcKmAKK1B5dGhvbidzIGJ1aWx0LWluIGZpbGUgb2JqZWN0cyBhcmUgaW1wbGVtZW50ZWQgZW50aXJlbHkgb24gdGhlIDpjOnR5cGU6YEZJTEVcKmAKIHN1cHBvcnQgZnJvbSB0aGUgQyBzdGFuZGFyZCBsaWJyYXJ5LiAgVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgYW5kIG1heQogY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlcyBvZiBQeXRob24uCiAKIAotLi4gY3R5cGU6OiBQeUZpbGVPYmplY3QKKy4uIGM6dHlwZTo6IFB5RmlsZU9iamVjdAogCi0gICBUaGlzIHN1YnR5cGUgb2YgOmN0eXBlOmBQeU9iamVjdGAgcmVwcmVzZW50cyBhIFB5dGhvbiBmaWxlIG9iamVjdC4KKyAgIFRoaXMgc3VidHlwZSBvZiA6Yzp0eXBlOmBQeU9iamVjdGAgcmVwcmVzZW50cyBhIFB5dGhvbiBmaWxlIG9iamVjdC4KIAogCi0uLiBjdmFyOjogUHlUeXBlT2JqZWN0IFB5RmlsZV9UeXBlCisuLiBjOnZhcjo6IFB5VHlwZU9iamVjdCBQeUZpbGVfVHlwZQogCiAgICAuLiBpbmRleDo6IHNpbmdsZTogRmlsZVR5cGUgKGluIG1vZHVsZSB0eXBlcykKIAotICAgVGhpcyBpbnN0YW5jZSBvZiA6Y3R5cGU6YFB5VHlwZU9iamVjdGAgcmVwcmVzZW50cyB0aGUgUHl0aG9uIGZpbGUgdHlwZS4gIFRoaXMgaXMKKyAgIFRoaXMgaW5zdGFuY2Ugb2YgOmM6dHlwZTpgUHlUeXBlT2JqZWN0YCByZXByZXNlbnRzIHRoZSBQeXRob24gZmlsZSB0eXBlLiAgVGhpcyBpcwogICAgZXhwb3NlZCB0byBQeXRob24gcHJvZ3JhbXMgYXMgYGBmaWxlYGAgYW5kIGBgdHlwZXMuRmlsZVR5cGVgYC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlGaWxlX0NoZWNrKFB5T2JqZWN0ICpwKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUZpbGVfQ2hlY2soUHlPYmplY3QgKnApCiAKLSAgIFJldHVybiB0cnVlIGlmIGl0cyBhcmd1bWVudCBpcyBhIDpjdHlwZTpgUHlGaWxlT2JqZWN0YCBvciBhIHN1YnR5cGUgb2YKLSAgIDpjdHlwZTpgUHlGaWxlT2JqZWN0YC4KKyAgIFJldHVybiB0cnVlIGlmIGl0cyBhcmd1bWVudCBpcyBhIDpjOnR5cGU6YFB5RmlsZU9iamVjdGAgb3IgYSBzdWJ0eXBlIG9mCisgICA6Yzp0eXBlOmBQeUZpbGVPYmplY3RgLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuMgogICAgICAgQWxsb3dlZCBzdWJ0eXBlcyB0byBiZSBhY2NlcHRlZC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlGaWxlX0NoZWNrRXhhY3QoUHlPYmplY3QgKnApCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5RmlsZV9DaGVja0V4YWN0KFB5T2JqZWN0ICpwKQogCi0gICBSZXR1cm4gdHJ1ZSBpZiBpdHMgYXJndW1lbnQgaXMgYSA6Y3R5cGU6YFB5RmlsZU9iamVjdGAsIGJ1dCBub3QgYSBzdWJ0eXBlIG9mCi0gICA6Y3R5cGU6YFB5RmlsZU9iamVjdGAuCisgICBSZXR1cm4gdHJ1ZSBpZiBpdHMgYXJndW1lbnQgaXMgYSA6Yzp0eXBlOmBQeUZpbGVPYmplY3RgLCBidXQgbm90IGEgc3VidHlwZSBvZgorICAgOmM6dHlwZTpgUHlGaWxlT2JqZWN0YC4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4yCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5RmlsZV9Gcm9tU3RyaW5nKGNoYXIgKmZpbGVuYW1lLCBjaGFyICptb2RlKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUZpbGVfRnJvbVN0cmluZyhjaGFyICpmaWxlbmFtZSwgY2hhciAqbW9kZSkKIAogICAgLi4gaW5kZXg6OiBzaW5nbGU6IGZvcGVuKCkKIAogICAgT24gc3VjY2VzcywgcmV0dXJuIGEgbmV3IGZpbGUgb2JqZWN0IHRoYXQgaXMgb3BlbmVkIG9uIHRoZSBmaWxlIGdpdmVuIGJ5CiAgICAqZmlsZW5hbWUqLCB3aXRoIGEgZmlsZSBtb2RlIGdpdmVuIGJ5ICptb2RlKiwgd2hlcmUgKm1vZGUqIGhhcyB0aGUgc2FtZQotICAgc2VtYW50aWNzIGFzIHRoZSBzdGFuZGFyZCBDIHJvdXRpbmUgOmNmdW5jOmBmb3BlbmAuICBPbiBmYWlsdXJlLCByZXR1cm4gKk5VTEwqLgorICAgc2VtYW50aWNzIGFzIHRoZSBzdGFuZGFyZCBDIHJvdXRpbmUgOmM6ZnVuYzpgZm9wZW5gLiAgT24gZmFpbHVyZSwgcmV0dXJuICpOVUxMKi4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlGaWxlX0Zyb21GaWxlKEZJTEUgKmZwLCBjaGFyICpuYW1lLCBjaGFyICptb2RlLCBpbnQgKCpjbG9zZSkoRklMRSopKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUZpbGVfRnJvbUZpbGUoRklMRSAqZnAsIGNoYXIgKm5hbWUsIGNoYXIgKm1vZGUsIGludCAoKmNsb3NlKShGSUxFKikpCiAKLSAgIENyZWF0ZSBhIG5ldyA6Y3R5cGU6YFB5RmlsZU9iamVjdGAgZnJvbSB0aGUgYWxyZWFkeS1vcGVuIHN0YW5kYXJkIEMgZmlsZQorICAgQ3JlYXRlIGEgbmV3IDpjOnR5cGU6YFB5RmlsZU9iamVjdGAgZnJvbSB0aGUgYWxyZWFkeS1vcGVuIHN0YW5kYXJkIEMgZmlsZQogICAgcG9pbnRlciwgKmZwKi4gIFRoZSBmdW5jdGlvbiAqY2xvc2UqIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGZpbGUgc2hvdWxkIGJlCiAgICBjbG9zZWQuICBSZXR1cm4gKk5VTEwqIGFuZCBjbG9zZSB0aGUgZmlsZSB1c2luZyAqY2xvc2UqIG9uIGZhaWx1cmUuCiAgICAqY2xvc2UqIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgc2V0IHRvICpOVUxMKi4KIAogCi0uLiBjZnVuY3Rpb246OiBGSUxFKiBQeUZpbGVfQXNGaWxlKFB5T2JqZWN0IFwqcCkKKy4uIGM6ZnVuY3Rpb246OiBGSUxFKiBQeUZpbGVfQXNGaWxlKFB5T2JqZWN0IFwqcCkKIAotICAgUmV0dXJuIHRoZSBmaWxlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggKnAqIGFzIGEgOmN0eXBlOmBGSUxFXCpgLgorICAgUmV0dXJuIHRoZSBmaWxlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggKnAqIGFzIGEgOmM6dHlwZTpgRklMRVwqYC4KIAotICAgSWYgdGhlIGNhbGxlciB3aWxsIGV2ZXIgdXNlIHRoZSByZXR1cm5lZCA6Y3R5cGU6YEZJTEVcKmAgb2JqZWN0IHdoaWxlCi0gICB0aGUgOnRlcm06YEdJTGAgaXMgcmVsZWFzZWQgaXQgbXVzdCBhbHNvIGNhbGwgdGhlIDpjZnVuYzpgUHlGaWxlX0luY1VzZUNvdW50YCBhbmQKLSAgIDpjZnVuYzpgUHlGaWxlX0RlY1VzZUNvdW50YCBmdW5jdGlvbnMgZGVzY3JpYmVkIGJlbG93IGFzIGFwcHJvcHJpYXRlLgorICAgSWYgdGhlIGNhbGxlciB3aWxsIGV2ZXIgdXNlIHRoZSByZXR1cm5lZCA6Yzp0eXBlOmBGSUxFXCpgIG9iamVjdCB3aGlsZQorICAgdGhlIDp0ZXJtOmBHSUxgIGlzIHJlbGVhc2VkIGl0IG11c3QgYWxzbyBjYWxsIHRoZSA6YzpmdW5jOmBQeUZpbGVfSW5jVXNlQ291bnRgIGFuZAorICAgOmM6ZnVuYzpgUHlGaWxlX0RlY1VzZUNvdW50YCBmdW5jdGlvbnMgZGVzY3JpYmVkIGJlbG93IGFzIGFwcHJvcHJpYXRlLgogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgUHlGaWxlX0luY1VzZUNvdW50KFB5RmlsZU9iamVjdCBcKnApCisuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeUZpbGVfSW5jVXNlQ291bnQoUHlGaWxlT2JqZWN0IFwqcCkKIAogICAgSW5jcmVtZW50cyB0aGUgUHlGaWxlT2JqZWN0J3MgaW50ZXJuYWwgdXNlIGNvdW50IHRvIGluZGljYXRlCi0gICB0aGF0IHRoZSB1bmRlcmx5aW5nIDpjdHlwZTpgRklMRVwqYCBpcyBiZWluZyB1c2VkLgorICAgdGhhdCB0aGUgdW5kZXJseWluZyA6Yzp0eXBlOmBGSUxFXCpgIGlzIGJlaW5nIHVzZWQuCiAgICBUaGlzIHByZXZlbnRzIFB5dGhvbiBmcm9tIGNhbGxpbmcgZl9jbG9zZSgpIG9uIGl0IGZyb20gYW5vdGhlciB0aHJlYWQuCi0gICBDYWxsZXJzIG9mIHRoaXMgbXVzdCBjYWxsIDpjZnVuYzpgUHlGaWxlX0RlY1VzZUNvdW50YCB3aGVuIHRoZXkgYXJlCi0gICBmaW5pc2hlZCB3aXRoIHRoZSA6Y3R5cGU6YEZJTEVcKmAuICBPdGhlcndpc2UgdGhlIGZpbGUgb2JqZWN0IHdpbGwKKyAgIENhbGxlcnMgb2YgdGhpcyBtdXN0IGNhbGwgOmM6ZnVuYzpgUHlGaWxlX0RlY1VzZUNvdW50YCB3aGVuIHRoZXkgYXJlCisgICBmaW5pc2hlZCB3aXRoIHRoZSA6Yzp0eXBlOmBGSUxFXCpgLiAgT3RoZXJ3aXNlIHRoZSBmaWxlIG9iamVjdCB3aWxsCiAgICBuZXZlciBiZSBjbG9zZWQgYnkgUHl0aG9uLgogCiAgICBUaGUgOnRlcm06YEdJTGAgbXVzdCBiZSBoZWxkIHdoaWxlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KIAotICAgVGhlIHN1Z2dlc3RlZCB1c2UgaXMgdG8gY2FsbCB0aGlzIGFmdGVyIDpjZnVuYzpgUHlGaWxlX0FzRmlsZWAgYW5kIGJlZm9yZQorICAgVGhlIHN1Z2dlc3RlZCB1c2UgaXMgdG8gY2FsbCB0aGlzIGFmdGVyIDpjOmZ1bmM6YFB5RmlsZV9Bc0ZpbGVgIGFuZCBiZWZvcmUKICAgIHlvdSByZWxlYXNlIHRoZSBHSUw6OgogCiAgICAgICBGSUxFICpmcCA9IFB5RmlsZV9Bc0ZpbGUocCk7CkBAIC05NCwxMSArOTQsMTEgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNgogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgUHlGaWxlX0RlY1VzZUNvdW50KFB5RmlsZU9iamVjdCBcKnApCisuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeUZpbGVfRGVjVXNlQ291bnQoUHlGaWxlT2JqZWN0IFwqcCkKIAogICAgRGVjcmVtZW50cyB0aGUgUHlGaWxlT2JqZWN0J3MgaW50ZXJuYWwgdW5sb2NrZWRfY291bnQgbWVtYmVyIHRvCi0gICBpbmRpY2F0ZSB0aGF0IHRoZSBjYWxsZXIgaXMgZG9uZSB3aXRoIGl0cyBvd24gdXNlIG9mIHRoZSA6Y3R5cGU6YEZJTEVcKmAuCi0gICBUaGlzIG1heSBvbmx5IGJlIGNhbGxlZCB0byB1bmRvIGEgcHJpb3IgY2FsbCB0byA6Y2Z1bmM6YFB5RmlsZV9JbmNVc2VDb3VudGAuCisgICBpbmRpY2F0ZSB0aGF0IHRoZSBjYWxsZXIgaXMgZG9uZSB3aXRoIGl0cyBvd24gdXNlIG9mIHRoZSA6Yzp0eXBlOmBGSUxFXCpgLgorICAgVGhpcyBtYXkgb25seSBiZSBjYWxsZWQgdG8gdW5kbyBhIHByaW9yIGNhbGwgdG8gOmM6ZnVuYzpgUHlGaWxlX0luY1VzZUNvdW50YC4KIAogICAgVGhlIDp0ZXJtOmBHSUxgIG11c3QgYmUgaGVsZCB3aGlsZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gKHNlZSB0aGUgZXhhbXBsZQogICAgYWJvdmUpLgpAQCAtMTA2LDEyICsxMDYsMTMgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUZpbGVfR2V0TGluZShQeU9iamVjdCAqcCwgaW50IG4pCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5RmlsZV9HZXRMaW5lKFB5T2JqZWN0ICpwLCBpbnQgbikKIAogICAgLi4gaW5kZXg6OiBzaW5nbGU6IEVPRkVycm9yIChidWlsdC1pbiBleGNlcHRpb24pCiAKICAgIEVxdWl2YWxlbnQgdG8gYGBwLnJlYWRsaW5lKFtuXSlgYCwgdGhpcyBmdW5jdGlvbiByZWFkcyBvbmUgbGluZSBmcm9tIHRoZQotICAgb2JqZWN0ICpwKi4gICpwKiBtYXkgYmUgYSBmaWxlIG9iamVjdCBvciBhbnkgb2JqZWN0IHdpdGggYSA6bWV0aDpgcmVhZGxpbmVgCisgICBvYmplY3QgKnAqLiAgKnAqIG1heSBiZSBhIGZpbGUgb2JqZWN0IG9yIGFueSBvYmplY3Qgd2l0aCBhCisgICA6bWV0aDpgfmlvLklPQmFzZS5yZWFkbGluZWAKICAgIG1ldGhvZC4gIElmICpuKiBpcyBgYDBgYCwgZXhhY3RseSBvbmUgbGluZSBpcyByZWFkLCByZWdhcmRsZXNzIG9mIHRoZSBsZW5ndGggb2YKICAgIHRoZSBsaW5lLiAgSWYgKm4qIGlzIGdyZWF0ZXIgdGhhbiBgYDBgYCwgbm8gbW9yZSB0aGFuICpuKiBieXRlcyB3aWxsIGJlIHJlYWQKICAgIGZyb20gdGhlIGZpbGU7IGEgcGFydGlhbCBsaW5lIGNhbiBiZSByZXR1cm5lZC4gIEluIGJvdGggY2FzZXMsIGFuIGVtcHR5IHN0cmluZwpAQCAtMTIwLDIwICsxMjEsMjAgQEAKICAgIHJhaXNlZCBpZiB0aGUgZW5kIG9mIHRoZSBmaWxlIGlzIHJlYWNoZWQgaW1tZWRpYXRlbHkuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5RmlsZV9OYW1lKFB5T2JqZWN0ICpwKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUZpbGVfTmFtZShQeU9iamVjdCAqcCkKIAogICAgUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHNwZWNpZmllZCBieSAqcCogYXMgYSBzdHJpbmcgb2JqZWN0LgogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgUHlGaWxlX1NldEJ1ZlNpemUoUHlGaWxlT2JqZWN0ICpwLCBpbnQgbikKKy4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5RmlsZV9TZXRCdWZTaXplKFB5RmlsZU9iamVjdCAqcCwgaW50IG4pCiAKICAgIC4uIGluZGV4Ojogc2luZ2xlOiBzZXR2YnVmKCkKIAotICAgQXZhaWxhYmxlIG9uIHN5c3RlbXMgd2l0aCA6Y2Z1bmM6YHNldHZidWZgIG9ubHkuICBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZAorICAgQXZhaWxhYmxlIG9uIHN5c3RlbXMgd2l0aCA6YzpmdW5jOmBzZXR2YnVmYCBvbmx5LiAgVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQKICAgIGltbWVkaWF0ZWx5IGFmdGVyIGZpbGUgb2JqZWN0IGNyZWF0aW9uLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUZpbGVfU2V0RW5jb2RpbmcoUHlGaWxlT2JqZWN0ICpwLCBjb25zdCBjaGFyICplbmMpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5RmlsZV9TZXRFbmNvZGluZyhQeUZpbGVPYmplY3QgKnAsIGNvbnN0IGNoYXIgKmVuYykKIAogICAgU2V0IHRoZSBmaWxlJ3MgZW5jb2RpbmcgZm9yIFVuaWNvZGUgb3V0cHV0IHRvICplbmMqLiBSZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwCiAgICBvbiBmYWlsdXJlLgpAQCAtMTQxLDcgKzE0Miw3IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjMKIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlGaWxlX1NldEVuY29kaW5nQW5kRXJyb3JzKFB5RmlsZU9iamVjdCAqcCwgY29uc3QgY2hhciAqZW5jLCAqZXJyb3JzKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUZpbGVfU2V0RW5jb2RpbmdBbmRFcnJvcnMoUHlGaWxlT2JqZWN0ICpwLCBjb25zdCBjaGFyICplbmMsICplcnJvcnMpCiAKICAgIFNldCB0aGUgZmlsZSdzIGVuY29kaW5nIGZvciBVbmljb2RlIG91dHB1dCB0byAqZW5jKiwgYW5kIGl0cyBlcnJvcgogICAgbW9kZSB0byAqZXJyKi4gUmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBvbiBmYWlsdXJlLgpAQCAtMTQ5LDcgKzE1MCw3IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjYKIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlGaWxlX1NvZnRTcGFjZShQeU9iamVjdCAqcCwgaW50IG5ld2ZsYWcpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5RmlsZV9Tb2Z0U3BhY2UoUHlPYmplY3QgKnAsIGludCBuZXdmbGFnKQogCiAgICAuLiBpbmRleDo6IHNpbmdsZTogc29mdHNwYWNlIChmaWxlIGF0dHJpYnV0ZSkKIApAQCAtMTYzLDcgKzE2NCw3IEBACiAgICBidXQgZG9pbmcgc28gc2hvdWxkIG5vdCBiZSBuZWVkZWQuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5RmlsZV9Xcml0ZU9iamVjdChQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqcCwgaW50IGZsYWdzKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUZpbGVfV3JpdGVPYmplY3QoUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKnAsIGludCBmbGFncykKIAogICAgLi4gaW5kZXg6OiBzaW5nbGU6IFB5X1BSSU5UX1JBVwogCkBAIC0xNzMsNyArMTc0LDcgQEAKICAgIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbiB3aWxsIGJlIHNldC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlGaWxlX1dyaXRlU3RyaW5nKGNvbnN0IGNoYXIgKnMsIFB5T2JqZWN0ICpwKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUZpbGVfV3JpdGVTdHJpbmcoY29uc3QgY2hhciAqcywgUHlPYmplY3QgKnApCiAKICAgIFdyaXRlIHN0cmluZyAqcyogdG8gZmlsZSBvYmplY3QgKnAqLiAgUmV0dXJuIGBgMGBgIG9uIHN1Y2Nlc3Mgb3IgYGAtMWBgIG9uCiAgICBmYWlsdXJlOyB0aGUgYXBwcm9wcmlhdGUgZXhjZXB0aW9uIHdpbGwgYmUgc2V0LgpkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL2Zsb2F0LnJzdCBiL0RvYy9jLWFwaS9mbG9hdC5yc3QKaW5kZXggMjk1ZmI5MC4uM2FhN2QxOCAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL2Zsb2F0LnJzdAorKysgYi9Eb2MvYy1hcGkvZmxvYXQucnN0CkBAIC04LDYyICs4LDY0IEBACiAuLiBpbmRleDo6IG9iamVjdDogZmxvYXRpbmcgcG9pbnQKIAogCi0uLiBjdHlwZTo6IFB5RmxvYXRPYmplY3QKKy4uIGM6dHlwZTo6IFB5RmxvYXRPYmplY3QKIAotICAgVGhpcyBzdWJ0eXBlIG9mIDpjdHlwZTpgUHlPYmplY3RgIHJlcHJlc2VudHMgYSBQeXRob24gZmxvYXRpbmcgcG9pbnQgb2JqZWN0LgorICAgVGhpcyBzdWJ0eXBlIG9mIDpjOnR5cGU6YFB5T2JqZWN0YCByZXByZXNlbnRzIGEgUHl0aG9uIGZsb2F0aW5nIHBvaW50IG9iamVjdC4KIAogCi0uLiBjdmFyOjogUHlUeXBlT2JqZWN0IFB5RmxvYXRfVHlwZQorLi4gYzp2YXI6OiBQeVR5cGVPYmplY3QgUHlGbG9hdF9UeXBlCiAKICAgIC4uIGluZGV4Ojogc2luZ2xlOiBGbG9hdFR5cGUgKGluIG1vZHVsZXMgdHlwZXMpCiAKLSAgIFRoaXMgaW5zdGFuY2Ugb2YgOmN0eXBlOmBQeVR5cGVPYmplY3RgIHJlcHJlc2VudHMgdGhlIFB5dGhvbiBmbG9hdGluZyBwb2ludAorICAgVGhpcyBpbnN0YW5jZSBvZiA6Yzp0eXBlOmBQeVR5cGVPYmplY3RgIHJlcHJlc2VudHMgdGhlIFB5dGhvbiBmbG9hdGluZyBwb2ludAogICAgdHlwZS4gIFRoaXMgaXMgdGhlIHNhbWUgb2JqZWN0IGFzIGBgZmxvYXRgYCBhbmQgYGB0eXBlcy5GbG9hdFR5cGVgYC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlGbG9hdF9DaGVjayhQeU9iamVjdCAqcCkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlGbG9hdF9DaGVjayhQeU9iamVjdCAqcCkKIAotICAgUmV0dXJuIHRydWUgaWYgaXRzIGFyZ3VtZW50IGlzIGEgOmN0eXBlOmBQeUZsb2F0T2JqZWN0YCBvciBhIHN1YnR5cGUgb2YKLSAgIDpjdHlwZTpgUHlGbG9hdE9iamVjdGAuCisgICBSZXR1cm4gdHJ1ZSBpZiBpdHMgYXJndW1lbnQgaXMgYSA6Yzp0eXBlOmBQeUZsb2F0T2JqZWN0YCBvciBhIHN1YnR5cGUgb2YKKyAgIDpjOnR5cGU6YFB5RmxvYXRPYmplY3RgLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuMgogICAgICAgQWxsb3dlZCBzdWJ0eXBlcyB0byBiZSBhY2NlcHRlZC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlGbG9hdF9DaGVja0V4YWN0KFB5T2JqZWN0ICpwKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUZsb2F0X0NoZWNrRXhhY3QoUHlPYmplY3QgKnApCiAKLSAgIFJldHVybiB0cnVlIGlmIGl0cyBhcmd1bWVudCBpcyBhIDpjdHlwZTpgUHlGbG9hdE9iamVjdGAsIGJ1dCBub3QgYSBzdWJ0eXBlIG9mCi0gICA6Y3R5cGU6YFB5RmxvYXRPYmplY3RgLgorICAgUmV0dXJuIHRydWUgaWYgaXRzIGFyZ3VtZW50IGlzIGEgOmM6dHlwZTpgUHlGbG9hdE9iamVjdGAsIGJ1dCBub3QgYSBzdWJ0eXBlIG9mCisgICA6Yzp0eXBlOmBQeUZsb2F0T2JqZWN0YC4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4yCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5RmxvYXRfRnJvbVN0cmluZyhQeU9iamVjdCAqc3RyLCBjaGFyICoqcGVuZCkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlGbG9hdF9Gcm9tU3RyaW5nKFB5T2JqZWN0ICpzdHIsIGNoYXIgKipwZW5kKQogCi0gICBDcmVhdGUgYSA6Y3R5cGU6YFB5RmxvYXRPYmplY3RgIG9iamVjdCBiYXNlZCBvbiB0aGUgc3RyaW5nIHZhbHVlIGluICpzdHIqLCBvcgorICAgQ3JlYXRlIGEgOmM6dHlwZTpgUHlGbG9hdE9iamVjdGAgb2JqZWN0IGJhc2VkIG9uIHRoZSBzdHJpbmcgdmFsdWUgaW4gKnN0ciosIG9yCiAgICAqTlVMTCogb24gZmFpbHVyZS4gIFRoZSAqcGVuZCogYXJndW1lbnQgaXMgaWdub3JlZC4gIEl0IHJlbWFpbnMgb25seSBmb3IKICAgIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5RmxvYXRfRnJvbURvdWJsZShkb3VibGUgdikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlGbG9hdF9Gcm9tRG91YmxlKGRvdWJsZSB2KQogCi0gICBDcmVhdGUgYSA6Y3R5cGU6YFB5RmxvYXRPYmplY3RgIG9iamVjdCBmcm9tICp2Kiwgb3IgKk5VTEwqIG9uIGZhaWx1cmUuCisgICBDcmVhdGUgYSA6Yzp0eXBlOmBQeUZsb2F0T2JqZWN0YCBvYmplY3QgZnJvbSAqdiosIG9yICpOVUxMKiBvbiBmYWlsdXJlLgogCiAKLS4uIGNmdW5jdGlvbjo6IGRvdWJsZSBQeUZsb2F0X0FzRG91YmxlKFB5T2JqZWN0ICpweWZsb2F0KQorLi4gYzpmdW5jdGlvbjo6IGRvdWJsZSBQeUZsb2F0X0FzRG91YmxlKFB5T2JqZWN0ICpweWZsb2F0KQogCi0gICBSZXR1cm4gYSBDIDpjdHlwZTpgZG91YmxlYCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29udGVudHMgb2YgKnB5ZmxvYXQqLiAgSWYKKyAgIFJldHVybiBhIEMgOmM6dHlwZTpgZG91YmxlYCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29udGVudHMgb2YgKnB5ZmxvYXQqLiAgSWYKICAgICpweWZsb2F0KiBpcyBub3QgYSBQeXRob24gZmxvYXRpbmcgcG9pbnQgb2JqZWN0IGJ1dCBoYXMgYSA6bWV0aDpgX19mbG9hdF9fYAogICAgbWV0aG9kLCB0aGlzIG1ldGhvZCB3aWxsIGZpcnN0IGJlIGNhbGxlZCB0byBjb252ZXJ0ICpweWZsb2F0KiBpbnRvIGEgZmxvYXQuCisgICBUaGlzIG1ldGhvZCByZXR1cm5zIGBgLTEuMGBgIHVwb24gZmFpbHVyZSwgc28gb25lIHNob3VsZCBjYWxsCisgICA6YzpmdW5jOmBQeUVycl9PY2N1cnJlZGAgdG8gY2hlY2sgZm9yIGVycm9ycy4KIAogCi0uLiBjZnVuY3Rpb246OiBkb3VibGUgUHlGbG9hdF9BU19ET1VCTEUoUHlPYmplY3QgKnB5ZmxvYXQpCisuLiBjOmZ1bmN0aW9uOjogZG91YmxlIFB5RmxvYXRfQVNfRE9VQkxFKFB5T2JqZWN0ICpweWZsb2F0KQogCi0gICBSZXR1cm4gYSBDIDpjdHlwZTpgZG91YmxlYCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29udGVudHMgb2YgKnB5ZmxvYXQqLCBidXQKKyAgIFJldHVybiBhIEMgOmM6dHlwZTpgZG91YmxlYCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29udGVudHMgb2YgKnB5ZmxvYXQqLCBidXQKICAgIHdpdGhvdXQgZXJyb3IgY2hlY2tpbmcuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5RmxvYXRfR2V0SW5mbyh2b2lkKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUZsb2F0X0dldEluZm8odm9pZCkKIAogICAgUmV0dXJuIGEgc3RydWN0c2VxIGluc3RhbmNlIHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZQogICAgcHJlY2lzaW9uLCBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBvZiBhIGZsb2F0LiBJdCdzIGEgdGhpbiB3cmFwcGVyCkBAIC03MiwyMSArNzQsMjEgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNgogCiAKLS4uIGNmdW5jdGlvbjo6IGRvdWJsZSBQeUZsb2F0X0dldE1heCgpCisuLiBjOmZ1bmN0aW9uOjogZG91YmxlIFB5RmxvYXRfR2V0TWF4KCkKIAotICAgUmV0dXJuIHRoZSBtYXhpbXVtIHJlcHJlc2VudGFibGUgZmluaXRlIGZsb2F0ICpEQkxfTUFYKiBhcyBDIDpjdHlwZTpgZG91YmxlYC4KKyAgIFJldHVybiB0aGUgbWF4aW11bSByZXByZXNlbnRhYmxlIGZpbml0ZSBmbG9hdCAqREJMX01BWCogYXMgQyA6Yzp0eXBlOmBkb3VibGVgLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjYKIAogCi0uLiBjZnVuY3Rpb246OiBkb3VibGUgUHlGbG9hdF9HZXRNaW4oKQorLi4gYzpmdW5jdGlvbjo6IGRvdWJsZSBQeUZsb2F0X0dldE1pbigpCiAKLSAgIFJldHVybiB0aGUgbWluaW11bSBub3JtYWxpemVkIHBvc2l0aXZlIGZsb2F0ICpEQkxfTUlOKiBhcyBDIDpjdHlwZTpgZG91YmxlYC4KKyAgIFJldHVybiB0aGUgbWluaW11bSBub3JtYWxpemVkIHBvc2l0aXZlIGZsb2F0ICpEQkxfTUlOKiBhcyBDIDpjOnR5cGU6YGRvdWJsZWAuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUZsb2F0X0NsZWFyRnJlZUxpc3QoKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUZsb2F0X0NsZWFyRnJlZUxpc3QoKQogCiAgICBDbGVhciB0aGUgZmxvYXQgZnJlZSBsaXN0LiBSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IGNvdWxkIG5vdAogICAgYmUgZnJlZWQuCkBAIC05NCw3ICs5Niw3IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjYKIAogCi0uLiBjZnVuY3Rpb246OiB2b2lkIFB5RmxvYXRfQXNTdHJpbmcoY2hhciAqYnVmLCBQeUZsb2F0T2JqZWN0ICp2KQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlGbG9hdF9Bc1N0cmluZyhjaGFyICpidWYsIFB5RmxvYXRPYmplY3QgKnYpCiAKICAgIENvbnZlcnQgdGhlIGFyZ3VtZW50ICp2KiB0byBhIHN0cmluZywgdXNpbmcgdGhlIHNhbWUgcnVsZXMgYXMKICAgIDpmdW5jOmBzdHJgLiBUaGUgbGVuZ3RoIG9mICpidWYqIHNob3VsZCBiZSBhdCBsZWFzdCAxMDAuCkBAIC0xMDYsNyArMTA4LDcgQEAKICAgICAgIFVzZSA6ZnVuYzpgUHlPYmplY3RfU3RyYCBvciA6ZnVuYzpgUHlPU19kb3VibGVfdG9fc3RyaW5nYCBpbnN0ZWFkLgogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgUHlGbG9hdF9Bc1JlcHJTdHJpbmcoY2hhciAqYnVmLCBQeUZsb2F0T2JqZWN0ICp2KQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlGbG9hdF9Bc1JlcHJTdHJpbmcoY2hhciAqYnVmLCBQeUZsb2F0T2JqZWN0ICp2KQogCiAgICBTYW1lIGFzIFB5RmxvYXRfQXNTdHJpbmcsIGV4Y2VwdCB1c2VzIHRoZSBzYW1lIHJ1bGVzIGFzCiAgICA6ZnVuYzpgcmVwcmAuICBUaGUgbGVuZ3RoIG9mICpidWYqIHNob3VsZCBiZSBhdCBsZWFzdCAxMDAuCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvZnVuY3Rpb24ucnN0IGIvRG9jL2MtYXBpL2Z1bmN0aW9uLnJzdAppbmRleCBlOWVkMmFiLi42NmY4Njc1IDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvZnVuY3Rpb24ucnN0CisrKyBiL0RvYy9jLWFwaS9mdW5jdGlvbi5yc3QKQEAgLTEwLDI2ICsxMCwyNiBAQAogVGhlcmUgYXJlIGEgZmV3IGZ1bmN0aW9ucyBzcGVjaWZpYyB0byBQeXRob24gZnVuY3Rpb25zLgogCiAKLS4uIGN0eXBlOjogUHlGdW5jdGlvbk9iamVjdAorLi4gYzp0eXBlOjogUHlGdW5jdGlvbk9iamVjdAogCiAgICBUaGUgQyBzdHJ1Y3R1cmUgdXNlZCBmb3IgZnVuY3Rpb25zLgogCiAKLS4uIGN2YXI6OiBQeVR5cGVPYmplY3QgUHlGdW5jdGlvbl9UeXBlCisuLiBjOnZhcjo6IFB5VHlwZU9iamVjdCBQeUZ1bmN0aW9uX1R5cGUKIAogICAgLi4gaW5kZXg6OiBzaW5nbGU6IE1ldGhvZFR5cGUgKGluIG1vZHVsZSB0eXBlcykKIAotICAgVGhpcyBpcyBhbiBpbnN0YW5jZSBvZiA6Y3R5cGU6YFB5VHlwZU9iamVjdGAgYW5kIHJlcHJlc2VudHMgdGhlIFB5dGhvbiBmdW5jdGlvbgorICAgVGhpcyBpcyBhbiBpbnN0YW5jZSBvZiA6Yzp0eXBlOmBQeVR5cGVPYmplY3RgIGFuZCByZXByZXNlbnRzIHRoZSBQeXRob24gZnVuY3Rpb24KICAgIHR5cGUuICBJdCBpcyBleHBvc2VkIHRvIFB5dGhvbiBwcm9ncmFtbWVycyBhcyBgYHR5cGVzLkZ1bmN0aW9uVHlwZWBgLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUZ1bmN0aW9uX0NoZWNrKFB5T2JqZWN0ICpvKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUZ1bmN0aW9uX0NoZWNrKFB5T2JqZWN0ICpvKQogCi0gICBSZXR1cm4gdHJ1ZSBpZiAqbyogaXMgYSBmdW5jdGlvbiBvYmplY3QgKGhhcyB0eXBlIDpjZGF0YTpgUHlGdW5jdGlvbl9UeXBlYCkuCisgICBSZXR1cm4gdHJ1ZSBpZiAqbyogaXMgYSBmdW5jdGlvbiBvYmplY3QgKGhhcyB0eXBlIDpjOmRhdGE6YFB5RnVuY3Rpb25fVHlwZWApLgogICAgVGhlIHBhcmFtZXRlciBtdXN0IG5vdCBiZSAqTlVMTCouCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5RnVuY3Rpb25fTmV3KFB5T2JqZWN0ICpjb2RlLCBQeU9iamVjdCAqZ2xvYmFscykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlGdW5jdGlvbl9OZXcoUHlPYmplY3QgKmNvZGUsIFB5T2JqZWN0ICpnbG9iYWxzKQogCiAgICBSZXR1cm4gYSBuZXcgZnVuY3Rpb24gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgY29kZSBvYmplY3QgKmNvZGUqLiAqZ2xvYmFscyoKICAgIG11c3QgYmUgYSBkaWN0aW9uYXJ5IHdpdGggdGhlIGdsb2JhbCB2YXJpYWJsZXMgYWNjZXNzaWJsZSB0byB0aGUgZnVuY3Rpb24uCkBAIC0zOCwzMCArMzgsMzAgQEAKICAgIG9iamVjdCwgdGhlIGFyZ3VtZW50IGRlZmF1bHRzIGFuZCBjbG9zdXJlIGFyZSBzZXQgdG8gKk5VTEwqLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUZ1bmN0aW9uX0dldENvZGUoUHlPYmplY3QgKm9wKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUZ1bmN0aW9uX0dldENvZGUoUHlPYmplY3QgKm9wKQogCiAgICBSZXR1cm4gdGhlIGNvZGUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZnVuY3Rpb24gb2JqZWN0ICpvcCouCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5RnVuY3Rpb25fR2V0R2xvYmFscyhQeU9iamVjdCAqb3ApCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5RnVuY3Rpb25fR2V0R2xvYmFscyhQeU9iamVjdCAqb3ApCiAKICAgIFJldHVybiB0aGUgZ2xvYmFscyBkaWN0aW9uYXJ5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZnVuY3Rpb24gb2JqZWN0ICpvcCouCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5RnVuY3Rpb25fR2V0TW9kdWxlKFB5T2JqZWN0ICpvcCkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlGdW5jdGlvbl9HZXRNb2R1bGUoUHlPYmplY3QgKm9wKQogCiAgICBSZXR1cm4gdGhlICpfX21vZHVsZV9fKiBhdHRyaWJ1dGUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdCAqb3AqLiBUaGlzIGlzIG5vcm1hbGx5CiAgICBhIHN0cmluZyBjb250YWluaW5nIHRoZSBtb2R1bGUgbmFtZSwgYnV0IGNhbiBiZSBzZXQgdG8gYW55IG90aGVyIG9iamVjdCBieQogICAgUHl0aG9uIGNvZGUuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5RnVuY3Rpb25fR2V0RGVmYXVsdHMoUHlPYmplY3QgKm9wKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUZ1bmN0aW9uX0dldERlZmF1bHRzKFB5T2JqZWN0ICpvcCkKIAogICAgUmV0dXJuIHRoZSBhcmd1bWVudCBkZWZhdWx0IHZhbHVlcyBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0ICpvcCouIFRoaXMgY2FuIGJlIGEKICAgIHR1cGxlIG9mIGFyZ3VtZW50cyBvciAqTlVMTCouCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5RnVuY3Rpb25fU2V0RGVmYXVsdHMoUHlPYmplY3QgKm9wLCBQeU9iamVjdCAqZGVmYXVsdHMpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5RnVuY3Rpb25fU2V0RGVmYXVsdHMoUHlPYmplY3QgKm9wLCBQeU9iamVjdCAqZGVmYXVsdHMpCiAKICAgIFNldCB0aGUgYXJndW1lbnQgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBmdW5jdGlvbiBvYmplY3QgKm9wKi4gKmRlZmF1bHRzKiBtdXN0IGJlCiAgICAqUHlfTm9uZSogb3IgYSB0dXBsZS4KQEAgLTY5LDEzICs2OSwxMyBAQAogICAgUmFpc2VzIDpleGM6YFN5c3RlbUVycm9yYCBhbmQgcmV0dXJucyBgYC0xYGAgb24gZmFpbHVyZS4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlGdW5jdGlvbl9HZXRDbG9zdXJlKFB5T2JqZWN0ICpvcCkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlGdW5jdGlvbl9HZXRDbG9zdXJlKFB5T2JqZWN0ICpvcCkKIAogICAgUmV0dXJuIHRoZSBjbG9zdXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZnVuY3Rpb24gb2JqZWN0ICpvcCouIFRoaXMgY2FuIGJlICpOVUxMKgogICAgb3IgYSB0dXBsZSBvZiBjZWxsIG9iamVjdHMuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5RnVuY3Rpb25fU2V0Q2xvc3VyZShQeU9iamVjdCAqb3AsIFB5T2JqZWN0ICpjbG9zdXJlKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUZ1bmN0aW9uX1NldENsb3N1cmUoUHlPYmplY3QgKm9wLCBQeU9iamVjdCAqY2xvc3VyZSkKIAogICAgU2V0IHRoZSBjbG9zdXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZnVuY3Rpb24gb2JqZWN0ICpvcCouICpjbG9zdXJlKiBtdXN0IGJlCiAgICAqUHlfTm9uZSogb3IgYSB0dXBsZSBvZiBjZWxsIG9iamVjdHMuCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvZ2NzdXBwb3J0LnJzdCBiL0RvYy9jLWFwaS9nY3N1cHBvcnQucnN0CmluZGV4IDQ1MTc5MjkuLmIwYTJkNWMgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS9nY3N1cHBvcnQucnN0CisrKyBiL0RvYy9jLWFwaS9nY3N1cHBvcnQucnN0CkBAIC0xNSwxMCArMTUsMTAgQEAKIC4uIEFuIGV4YW1wbGUgc2hvd2luZyB0aGUgdXNlIG9mIHRoZXNlIGludGVyZmFjZXMgY2FuIGJlIGZvdW5kIGluICJTdXBwb3J0aW5nIHRoZQogLi4gQ3ljbGUgQ29sbGVjdG9yIChYWFggbm90IGZvdW5kOiAuLi9leHQvZXhhbXBsZS1jeWNsZS1zdXBwb3J0Lmh0bWwpIi4KIAotVG8gY3JlYXRlIGEgY29udGFpbmVyIHR5cGUsIHRoZSA6YXR0cjpgdHBfZmxhZ3NgIGZpZWxkIG9mIHRoZSB0eXBlIG9iamVjdCBtdXN0CitUbyBjcmVhdGUgYSBjb250YWluZXIgdHlwZSwgdGhlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9mbGFnc2AgZmllbGQgb2YgdGhlIHR5cGUgb2JqZWN0IG11c3QKIGluY2x1ZGUgdGhlIDpjb25zdDpgUHlfVFBGTEFHU19IQVZFX0dDYCBhbmQgcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLTphdHRyOmB0cF90cmF2ZXJzZWAgaGFuZGxlci4gIElmIGluc3RhbmNlcyBvZiB0aGUgdHlwZSBhcmUgbXV0YWJsZSwgYQotOmF0dHI6YHRwX2NsZWFyYCBpbXBsZW1lbnRhdGlvbiBtdXN0IGFsc28gYmUgcHJvdmlkZWQuCis6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfdHJhdmVyc2VgIGhhbmRsZXIuICBJZiBpbnN0YW5jZXMgb2YgdGhlIHR5cGUgYXJlIG11dGFibGUsIGEKKzpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9jbGVhcmAgaW1wbGVtZW50YXRpb24gbXVzdCBhbHNvIGJlIHByb3ZpZGVkLgogCiAKIC4uIGRhdGE6OiBQeV9UUEZMQUdTX0hBVkVfR0MKQEAgLTMwLDk4ICszMCw5OCBAQAogCiBDb25zdHJ1Y3RvcnMgZm9yIGNvbnRhaW5lciB0eXBlcyBtdXN0IGNvbmZvcm0gdG8gdHdvIHJ1bGVzOgogCi0jLiBUaGUgbWVtb3J5IGZvciB0aGUgb2JqZWN0IG11c3QgYmUgYWxsb2NhdGVkIHVzaW5nIDpjZnVuYzpgUHlPYmplY3RfR0NfTmV3YAotICAgb3IgOmNmdW5jOmBQeU9iamVjdF9HQ19OZXdWYXJgLgorIy4gVGhlIG1lbW9yeSBmb3IgdGhlIG9iamVjdCBtdXN0IGJlIGFsbG9jYXRlZCB1c2luZyA6YzpmdW5jOmBQeU9iamVjdF9HQ19OZXdgCisgICBvciA6YzpmdW5jOmBQeU9iamVjdF9HQ19OZXdWYXJgLgogCiAjLiBPbmNlIGFsbCB0aGUgZmllbGRzIHdoaWNoIG1heSBjb250YWluIHJlZmVyZW5jZXMgdG8gb3RoZXIgY29udGFpbmVycyBhcmUKLSAgIGluaXRpYWxpemVkLCBpdCBtdXN0IGNhbGwgOmNmdW5jOmBQeU9iamVjdF9HQ19UcmFja2AuCisgICBpbml0aWFsaXplZCwgaXQgbXVzdCBjYWxsIDpjOmZ1bmM6YFB5T2JqZWN0X0dDX1RyYWNrYC4KIAogCi0uLiBjZnVuY3Rpb246OiBUWVBFKiBQeU9iamVjdF9HQ19OZXcoVFlQRSwgUHlUeXBlT2JqZWN0ICp0eXBlKQorLi4gYzpmdW5jdGlvbjo6IFRZUEUqIFB5T2JqZWN0X0dDX05ldyhUWVBFLCBQeVR5cGVPYmplY3QgKnR5cGUpCiAKLSAgIEFuYWxvZ291cyB0byA6Y2Z1bmM6YFB5T2JqZWN0X05ld2AgYnV0IGZvciBjb250YWluZXIgb2JqZWN0cyB3aXRoIHRoZQorICAgQW5hbG9nb3VzIHRvIDpjOmZ1bmM6YFB5T2JqZWN0X05ld2AgYnV0IGZvciBjb250YWluZXIgb2JqZWN0cyB3aXRoIHRoZQogICAgOmNvbnN0OmBQeV9UUEZMQUdTX0hBVkVfR0NgIGZsYWcgc2V0LgogCiAKLS4uIGNmdW5jdGlvbjo6IFRZUEUqIFB5T2JqZWN0X0dDX05ld1ZhcihUWVBFLCBQeVR5cGVPYmplY3QgKnR5cGUsIFB5X3NzaXplX3Qgc2l6ZSkKKy4uIGM6ZnVuY3Rpb246OiBUWVBFKiBQeU9iamVjdF9HQ19OZXdWYXIoVFlQRSwgUHlUeXBlT2JqZWN0ICp0eXBlLCBQeV9zc2l6ZV90IHNpemUpCiAKLSAgIEFuYWxvZ291cyB0byA6Y2Z1bmM6YFB5T2JqZWN0X05ld1ZhcmAgYnV0IGZvciBjb250YWluZXIgb2JqZWN0cyB3aXRoIHRoZQorICAgQW5hbG9nb3VzIHRvIDpjOmZ1bmM6YFB5T2JqZWN0X05ld1ZhcmAgYnV0IGZvciBjb250YWluZXIgb2JqZWN0cyB3aXRoIHRoZQogICAgOmNvbnN0OmBQeV9UUEZMQUdTX0hBVkVfR0NgIGZsYWcgc2V0LgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjdHlwZTpgaW50YCB0eXBlIGZvciAqc2l6ZSouIFRoaXMgbWlnaHQgcmVxdWlyZQorICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjOnR5cGU6YGludGAgdHlwZSBmb3IgKnNpemUqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKICAgICAgIGNoYW5nZXMgaW4geW91ciBjb2RlIGZvciBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCiAKLS4uIGNmdW5jdGlvbjo6IFRZUEUqIFB5T2JqZWN0X0dDX1Jlc2l6ZShUWVBFLCBQeVZhck9iamVjdCAqb3AsIFB5X3NzaXplX3QgbmV3c2l6ZSkKKy4uIGM6ZnVuY3Rpb246OiBUWVBFKiBQeU9iamVjdF9HQ19SZXNpemUoVFlQRSwgUHlWYXJPYmplY3QgKm9wLCBQeV9zc2l6ZV90IG5ld3NpemUpCiAKLSAgIFJlc2l6ZSBhbiBvYmplY3QgYWxsb2NhdGVkIGJ5IDpjZnVuYzpgUHlPYmplY3RfTmV3VmFyYC4gIFJldHVybnMgdGhlCisgICBSZXNpemUgYW4gb2JqZWN0IGFsbG9jYXRlZCBieSA6YzpmdW5jOmBQeU9iamVjdF9OZXdWYXJgLiAgUmV0dXJucyB0aGUKICAgIHJlc2l6ZWQgb2JqZWN0IG9yICpOVUxMKiBvbiBmYWlsdXJlLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjdHlwZTpgaW50YCB0eXBlIGZvciAqbmV3c2l6ZSouIFRoaXMgbWlnaHQKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgZm9yICpuZXdzaXplKi4gVGhpcyBtaWdodAogICAgICAgcmVxdWlyZSBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiB2b2lkIFB5T2JqZWN0X0dDX1RyYWNrKFB5T2JqZWN0ICpvcCkKKy4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5T2JqZWN0X0dDX1RyYWNrKFB5T2JqZWN0ICpvcCkKIAogICAgQWRkcyB0aGUgb2JqZWN0ICpvcCogdG8gdGhlIHNldCBvZiBjb250YWluZXIgb2JqZWN0cyB0cmFja2VkIGJ5IHRoZQogICAgY29sbGVjdG9yLiAgVGhlIGNvbGxlY3RvciBjYW4gcnVuIGF0IHVuZXhwZWN0ZWQgdGltZXMgc28gb2JqZWN0cyBtdXN0IGJlCiAgICB2YWxpZCB3aGlsZSBiZWluZyB0cmFja2VkLiAgVGhpcyBzaG91bGQgYmUgY2FsbGVkIG9uY2UgYWxsIHRoZSBmaWVsZHMKLSAgIGZvbGxvd2VkIGJ5IHRoZSA6YXR0cjpgdHBfdHJhdmVyc2VgIGhhbmRsZXIgYmVjb21lIHZhbGlkLCB1c3VhbGx5IG5lYXIgdGhlCisgICBmb2xsb3dlZCBieSB0aGUgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX3RyYXZlcnNlYCBoYW5kbGVyIGJlY29tZSB2YWxpZCwgdXN1YWxseSBuZWFyIHRoZQogICAgZW5kIG9mIHRoZSBjb25zdHJ1Y3Rvci4KIAogCi0uLiBjZnVuY3Rpb246OiB2b2lkIF9QeU9iamVjdF9HQ19UUkFDSyhQeU9iamVjdCAqb3ApCisuLiBjOmZ1bmN0aW9uOjogdm9pZCBfUHlPYmplY3RfR0NfVFJBQ0soUHlPYmplY3QgKm9wKQogCi0gICBBIG1hY3JvIHZlcnNpb24gb2YgOmNmdW5jOmBQeU9iamVjdF9HQ19UcmFja2AuICBJdCBzaG91bGQgbm90IGJlIHVzZWQgZm9yCisgICBBIG1hY3JvIHZlcnNpb24gb2YgOmM6ZnVuYzpgUHlPYmplY3RfR0NfVHJhY2tgLiAgSXQgc2hvdWxkIG5vdCBiZSB1c2VkIGZvcgogICAgZXh0ZW5zaW9uIG1vZHVsZXMuCiAKIFNpbWlsYXJseSwgdGhlIGRlYWxsb2NhdG9yIGZvciB0aGUgb2JqZWN0IG11c3QgY29uZm9ybSB0byBhIHNpbWlsYXIgcGFpciBvZgogcnVsZXM6CiAKICMuIEJlZm9yZSBmaWVsZHMgd2hpY2ggcmVmZXIgdG8gb3RoZXIgY29udGFpbmVycyBhcmUgaW52YWxpZGF0ZWQsCi0gICA6Y2Z1bmM6YFB5T2JqZWN0X0dDX1VuVHJhY2tgIG11c3QgYmUgY2FsbGVkLgorICAgOmM6ZnVuYzpgUHlPYmplY3RfR0NfVW5UcmFja2AgbXVzdCBiZSBjYWxsZWQuCiAKLSMuIFRoZSBvYmplY3QncyBtZW1vcnkgbXVzdCBiZSBkZWFsbG9jYXRlZCB1c2luZyA6Y2Z1bmM6YFB5T2JqZWN0X0dDX0RlbGAuCisjLiBUaGUgb2JqZWN0J3MgbWVtb3J5IG11c3QgYmUgZGVhbGxvY2F0ZWQgdXNpbmcgOmM6ZnVuYzpgUHlPYmplY3RfR0NfRGVsYC4KIAogCi0uLiBjZnVuY3Rpb246OiB2b2lkIFB5T2JqZWN0X0dDX0RlbCh2b2lkICpvcCkKKy4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5T2JqZWN0X0dDX0RlbCh2b2lkICpvcCkKIAotICAgUmVsZWFzZXMgbWVtb3J5IGFsbG9jYXRlZCB0byBhbiBvYmplY3QgdXNpbmcgOmNmdW5jOmBQeU9iamVjdF9HQ19OZXdgIG9yCi0gICA6Y2Z1bmM6YFB5T2JqZWN0X0dDX05ld1ZhcmAuCisgICBSZWxlYXNlcyBtZW1vcnkgYWxsb2NhdGVkIHRvIGFuIG9iamVjdCB1c2luZyA6YzpmdW5jOmBQeU9iamVjdF9HQ19OZXdgIG9yCisgICA6YzpmdW5jOmBQeU9iamVjdF9HQ19OZXdWYXJgLgogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgUHlPYmplY3RfR0NfVW5UcmFjayh2b2lkICpvcCkKKy4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5T2JqZWN0X0dDX1VuVHJhY2sodm9pZCAqb3ApCiAKICAgIFJlbW92ZSB0aGUgb2JqZWN0ICpvcCogZnJvbSB0aGUgc2V0IG9mIGNvbnRhaW5lciBvYmplY3RzIHRyYWNrZWQgYnkgdGhlCi0gICBjb2xsZWN0b3IuICBOb3RlIHRoYXQgOmNmdW5jOmBQeU9iamVjdF9HQ19UcmFja2AgY2FuIGJlIGNhbGxlZCBhZ2FpbiBvbgorICAgY29sbGVjdG9yLiAgTm90ZSB0aGF0IDpjOmZ1bmM6YFB5T2JqZWN0X0dDX1RyYWNrYCBjYW4gYmUgY2FsbGVkIGFnYWluIG9uCiAgICB0aGlzIG9iamVjdCB0byBhZGQgaXQgYmFjayB0byB0aGUgc2V0IG9mIHRyYWNrZWQgb2JqZWN0cy4gIFRoZSBkZWFsbG9jYXRvcgotICAgKDphdHRyOmB0cF9kZWFsbG9jYCBoYW5kbGVyKSBzaG91bGQgY2FsbCB0aGlzIGZvciB0aGUgb2JqZWN0IGJlZm9yZSBhbnkgb2YKLSAgIHRoZSBmaWVsZHMgdXNlZCBieSB0aGUgOmF0dHI6YHRwX3RyYXZlcnNlYCBoYW5kbGVyIGJlY29tZSBpbnZhbGlkLgorICAgKDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9kZWFsbG9jYCBoYW5kbGVyKSBzaG91bGQgY2FsbCB0aGlzIGZvciB0aGUgb2JqZWN0IGJlZm9yZSBhbnkgb2YKKyAgIHRoZSBmaWVsZHMgdXNlZCBieSB0aGUgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX3RyYXZlcnNlYCBoYW5kbGVyIGJlY29tZSBpbnZhbGlkLgogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgX1B5T2JqZWN0X0dDX1VOVFJBQ0soUHlPYmplY3QgKm9wKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgX1B5T2JqZWN0X0dDX1VOVFJBQ0soUHlPYmplY3QgKm9wKQogCi0gICBBIG1hY3JvIHZlcnNpb24gb2YgOmNmdW5jOmBQeU9iamVjdF9HQ19VblRyYWNrYC4gIEl0IHNob3VsZCBub3QgYmUgdXNlZCBmb3IKKyAgIEEgbWFjcm8gdmVyc2lvbiBvZiA6YzpmdW5jOmBQeU9iamVjdF9HQ19VblRyYWNrYC4gIEl0IHNob3VsZCBub3QgYmUgdXNlZCBmb3IKICAgIGV4dGVuc2lvbiBtb2R1bGVzLgogCi1UaGUgOmF0dHI6YHRwX3RyYXZlcnNlYCBoYW5kbGVyIGFjY2VwdHMgYSBmdW5jdGlvbiBwYXJhbWV0ZXIgb2YgdGhpcyB0eXBlOgorVGhlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF90cmF2ZXJzZWAgaGFuZGxlciBhY2NlcHRzIGEgZnVuY3Rpb24gcGFyYW1ldGVyIG9mIHRoaXMgdHlwZToKIAogCi0uLiBjdHlwZTo6IGludCAoKnZpc2l0cHJvYykoUHlPYmplY3QgKm9iamVjdCwgdm9pZCAqYXJnKQorLi4gYzp0eXBlOjogaW50ICgqdmlzaXRwcm9jKShQeU9iamVjdCAqb2JqZWN0LCB2b2lkICphcmcpCiAKLSAgIFR5cGUgb2YgdGhlIHZpc2l0b3IgZnVuY3Rpb24gcGFzc2VkIHRvIHRoZSA6YXR0cjpgdHBfdHJhdmVyc2VgIGhhbmRsZXIuCisgICBUeXBlIG9mIHRoZSB2aXNpdG9yIGZ1bmN0aW9uIHBhc3NlZCB0byB0aGUgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX3RyYXZlcnNlYCBoYW5kbGVyLgogICAgVGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBhbiBvYmplY3QgdG8gdHJhdmVyc2UgYXMgKm9iamVjdCogYW5kCi0gICB0aGUgdGhpcmQgcGFyYW1ldGVyIHRvIHRoZSA6YXR0cjpgdHBfdHJhdmVyc2VgIGhhbmRsZXIgYXMgKmFyZyouICBUaGUKKyAgIHRoZSB0aGlyZCBwYXJhbWV0ZXIgdG8gdGhlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF90cmF2ZXJzZWAgaGFuZGxlciBhcyAqYXJnKi4gIFRoZQogICAgUHl0aG9uIGNvcmUgdXNlcyBzZXZlcmFsIHZpc2l0b3IgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBjeWNsaWMgZ2FyYmFnZQogICAgZGV0ZWN0aW9uOyBpdCdzIG5vdCBleHBlY3RlZCB0aGF0IHVzZXJzIHdpbGwgbmVlZCB0byB3cml0ZSB0aGVpciBvd24KICAgIHZpc2l0b3IgZnVuY3Rpb25zLgogCi1UaGUgOmF0dHI6YHRwX3RyYXZlcnNlYCBoYW5kbGVyIG11c3QgaGF2ZSB0aGUgZm9sbG93aW5nIHR5cGU6CitUaGUgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX3RyYXZlcnNlYCBoYW5kbGVyIG11c3QgaGF2ZSB0aGUgZm9sbG93aW5nIHR5cGU6CiAKIAotLi4gY3R5cGU6OiBpbnQgKCp0cmF2ZXJzZXByb2MpKFB5T2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKKy4uIGM6dHlwZTo6IGludCAoKnRyYXZlcnNlcHJvYykoUHlPYmplY3QgKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogCiAgICBUcmF2ZXJzYWwgZnVuY3Rpb24gZm9yIGEgY29udGFpbmVyIG9iamVjdC4gIEltcGxlbWVudGF0aW9ucyBtdXN0IGNhbGwgdGhlCiAgICAqdmlzaXQqIGZ1bmN0aW9uIGZvciBlYWNoIG9iamVjdCBkaXJlY3RseSBjb250YWluZWQgYnkgKnNlbGYqLCB3aXRoIHRoZQpAQCAtMTMwLDE1ICsxMzAsMTUgQEAKICAgIG9iamVjdCBhcmd1bWVudC4gIElmICp2aXNpdCogcmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlIHRoYXQgdmFsdWUgc2hvdWxkIGJlCiAgICByZXR1cm5lZCBpbW1lZGlhdGVseS4KIAotVG8gc2ltcGxpZnkgd3JpdGluZyA6YXR0cjpgdHBfdHJhdmVyc2VgIGhhbmRsZXJzLCBhIDpjZnVuYzpgUHlfVklTSVRgIG1hY3JvIGlzCi1wcm92aWRlZC4gIEluIG9yZGVyIHRvIHVzZSB0aGlzIG1hY3JvLCB0aGUgOmF0dHI6YHRwX3RyYXZlcnNlYCBpbXBsZW1lbnRhdGlvbgorVG8gc2ltcGxpZnkgd3JpdGluZyA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfdHJhdmVyc2VgIGhhbmRsZXJzLCBhIDpjOmZ1bmM6YFB5X1ZJU0lUYCBtYWNybyBpcworcHJvdmlkZWQuICBJbiBvcmRlciB0byB1c2UgdGhpcyBtYWNybywgdGhlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF90cmF2ZXJzZWAgaW1wbGVtZW50YXRpb24KIG11c3QgbmFtZSBpdHMgYXJndW1lbnRzIGV4YWN0bHkgKnZpc2l0KiBhbmQgKmFyZyo6CiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBQeV9WSVNJVChQeU9iamVjdCAqbykKKy4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5X1ZJU0lUKFB5T2JqZWN0ICpvKQogCiAgICBDYWxsIHRoZSAqdmlzaXQqIGNhbGxiYWNrLCB3aXRoIGFyZ3VtZW50cyAqbyogYW5kICphcmcqLiBJZiAqdmlzaXQqIHJldHVybnMKLSAgIGEgbm9uLXplcm8gdmFsdWUsIHRoZW4gcmV0dXJuIGl0LiAgVXNpbmcgdGhpcyBtYWNybywgOmF0dHI6YHRwX3RyYXZlcnNlYAorICAgYSBub24temVybyB2YWx1ZSwgdGhlbiByZXR1cm4gaXQuICBVc2luZyB0aGlzIG1hY3JvLCA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfdHJhdmVyc2VgCiAgICBoYW5kbGVycyBsb29rIGxpa2U6OgogCiAgICAgICBzdGF0aWMgaW50CkBAIC0xNTEsMTUgKzE1MSwxNSBAQAogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjQKIAotVGhlIDphdHRyOmB0cF9jbGVhcmAgaGFuZGxlciBtdXN0IGJlIG9mIHRoZSA6Y3R5cGU6YGlucXVpcnlgIHR5cGUsIG9yICpOVUxMKgorVGhlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9jbGVhcmAgaGFuZGxlciBtdXN0IGJlIG9mIHRoZSA6Yzp0eXBlOmBpbnF1aXJ5YCB0eXBlLCBvciAqTlVMTCoKIGlmIHRoZSBvYmplY3QgaXMgaW1tdXRhYmxlLgogCiAKLS4uIGN0eXBlOjogaW50ICgqaW5xdWlyeSkoUHlPYmplY3QgKnNlbGYpCisuLiBjOnR5cGU6OiBpbnQgKCppbnF1aXJ5KShQeU9iamVjdCAqc2VsZikKIAogICAgRHJvcCByZWZlcmVuY2VzIHRoYXQgbWF5IGhhdmUgY3JlYXRlZCByZWZlcmVuY2UgY3ljbGVzLiAgSW1tdXRhYmxlIG9iamVjdHMKICAgIGRvIG5vdCBoYXZlIHRvIGRlZmluZSB0aGlzIG1ldGhvZCBzaW5jZSB0aGV5IGNhbiBuZXZlciBkaXJlY3RseSBjcmVhdGUKICAgIHJlZmVyZW5jZSBjeWNsZXMuICBOb3RlIHRoYXQgdGhlIG9iamVjdCBtdXN0IHN0aWxsIGJlIHZhbGlkIGFmdGVyIGNhbGxpbmcKLSAgIHRoaXMgbWV0aG9kIChkb24ndCBqdXN0IGNhbGwgOmNmdW5jOmBQeV9ERUNSRUZgIG9uIGEgcmVmZXJlbmNlKS4gIFRoZQorICAgdGhpcyBtZXRob2QgKGRvbid0IGp1c3QgY2FsbCA6YzpmdW5jOmBQeV9ERUNSRUZgIG9uIGEgcmVmZXJlbmNlKS4gIFRoZQogICAgY29sbGVjdG9yIHdpbGwgY2FsbCB0aGlzIG1ldGhvZCBpZiBpdCBkZXRlY3RzIHRoYXQgdGhpcyBvYmplY3QgaXMgaW52b2x2ZWQKICAgIGluIGEgcmVmZXJlbmNlIGN5Y2xlLgpkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL2dlbi5yc3QgYi9Eb2MvYy1hcGkvZ2VuLnJzdAppbmRleCAwZDM3ODlhLi4zM2NkMjdhIDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvZ2VuLnJzdAorKysgYi9Eb2MvYy1hcGkvZ2VuLnJzdApAQCAtNywzMSArNywzMSBAQAogCiBHZW5lcmF0b3Igb2JqZWN0cyBhcmUgd2hhdCBQeXRob24gdXNlcyB0byBpbXBsZW1lbnQgZ2VuZXJhdG9yIGl0ZXJhdG9ycy4gVGhleQogYXJlIG5vcm1hbGx5IGNyZWF0ZWQgYnkgaXRlcmF0aW5nIG92ZXIgYSBmdW5jdGlvbiB0aGF0IHlpZWxkcyB2YWx1ZXMsIHJhdGhlcgotdGhhbiBleHBsaWNpdGx5IGNhbGxpbmcgOmNmdW5jOmBQeUdlbl9OZXdgLgordGhhbiBleHBsaWNpdGx5IGNhbGxpbmcgOmM6ZnVuYzpgUHlHZW5fTmV3YC4KIAogCi0uLiBjdHlwZTo6IFB5R2VuT2JqZWN0CisuLiBjOnR5cGU6OiBQeUdlbk9iamVjdAogCiAgICBUaGUgQyBzdHJ1Y3R1cmUgdXNlZCBmb3IgZ2VuZXJhdG9yIG9iamVjdHMuCiAKIAotLi4gY3Zhcjo6IFB5VHlwZU9iamVjdCBQeUdlbl9UeXBlCisuLiBjOnZhcjo6IFB5VHlwZU9iamVjdCBQeUdlbl9UeXBlCiAKICAgIFRoZSB0eXBlIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIGdlbmVyYXRvciBvYmplY3RzCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5R2VuX0NoZWNrKG9iKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUdlbl9DaGVjayhvYikKIAogICAgUmV0dXJuIHRydWUgaWYgKm9iKiBpcyBhIGdlbmVyYXRvciBvYmplY3Q7ICpvYiogbXVzdCBub3QgYmUgKk5VTEwqLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUdlbl9DaGVja0V4YWN0KG9iKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUdlbl9DaGVja0V4YWN0KG9iKQogCiAgICBSZXR1cm4gdHJ1ZSBpZiAqb2IqJ3MgdHlwZSBpcyAqUHlHZW5fVHlwZSogaXMgYSBnZW5lcmF0b3Igb2JqZWN0OyAqb2IqIG11c3Qgbm90CiAgICBiZSAqTlVMTCouCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5R2VuX05ldyhQeUZyYW1lT2JqZWN0ICpmcmFtZSkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlHZW5fTmV3KFB5RnJhbWVPYmplY3QgKmZyYW1lKQogCiAgICBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBnZW5lcmF0b3Igb2JqZWN0IGJhc2VkIG9uIHRoZSAqZnJhbWUqIG9iamVjdC4gQQogICAgcmVmZXJlbmNlIHRvICpmcmFtZSogaXMgc3RvbGVuIGJ5IHRoaXMgZnVuY3Rpb24uIFRoZSBwYXJhbWV0ZXIgbXVzdCBub3QgYmUKZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9pbXBvcnQucnN0IGIvRG9jL2MtYXBpL2ltcG9ydC5yc3QKaW5kZXggM2RhMTQxNS4uNmY1Njc4YyAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL2ltcG9ydC5yc3QKKysrIGIvRG9jL2MtYXBpL2ltcG9ydC5yc3QKQEAgLTYsMTQgKzYsMTQgQEAKID09PT09PT09PT09PT09PT09CiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5SW1wb3J0X0ltcG9ydE1vZHVsZShjb25zdCBjaGFyICpuYW1lKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUltcG9ydF9JbXBvcnRNb2R1bGUoY29uc3QgY2hhciAqbmFtZSkKIAogICAgLi4gaW5kZXg6OgogICAgICAgc2luZ2xlOiBwYWNrYWdlIHZhcmlhYmxlOyBfX2FsbF9fCiAgICAgICBzaW5nbGU6IF9fYWxsX18gKHBhY2thZ2UgdmFyaWFibGUpCiAgICAgICBzaW5nbGU6IG1vZHVsZXMgKGluIG1vZHVsZSBzeXMpCiAKLSAgIFRoaXMgaXMgYSBzaW1wbGlmaWVkIGludGVyZmFjZSB0byA6Y2Z1bmM6YFB5SW1wb3J0X0ltcG9ydE1vZHVsZUV4YCBiZWxvdywKKyAgIFRoaXMgaXMgYSBzaW1wbGlmaWVkIGludGVyZmFjZSB0byA6YzpmdW5jOmBQeUltcG9ydF9JbXBvcnRNb2R1bGVFeGAgYmVsb3csCiAgICBsZWF2aW5nIHRoZSAqZ2xvYmFscyogYW5kICpsb2NhbHMqIGFyZ3VtZW50cyBzZXQgdG8gKk5VTEwqIGFuZCAqbGV2ZWwqIHNldAogICAgdG8gMC4gIFdoZW4gdGhlICpuYW1lKgogICAgYXJndW1lbnQgY29udGFpbnMgYSBkb3QgKHdoZW4gaXQgc3BlY2lmaWVzIGEgc3VibW9kdWxlIG9mIGEgcGFja2FnZSksIHRoZQpAQCAtMzQsMjAgKzM0LDIwIEBACiAgICAgICBBbHdheXMgdXNlcyBhYnNvbHV0ZSBpbXBvcnRzLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKGNvbnN0IGNoYXIgKm5hbWUpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soY29uc3QgY2hhciAqbmFtZSkKIAotICAgVGhpcyB2ZXJzaW9uIG9mIDpjZnVuYzpgUHlJbXBvcnRfSW1wb3J0TW9kdWxlYCBkb2VzIG5vdCBibG9jay4gSXQncyBpbnRlbmRlZAorICAgVGhpcyB2ZXJzaW9uIG9mIDpjOmZ1bmM6YFB5SW1wb3J0X0ltcG9ydE1vZHVsZWAgZG9lcyBub3QgYmxvY2suIEl0J3MgaW50ZW5kZWQKICAgIHRvIGJlIHVzZWQgaW4gQyBmdW5jdGlvbnMgdGhhdCBpbXBvcnQgb3RoZXIgbW9kdWxlcyB0byBleGVjdXRlIGEgZnVuY3Rpb24uCiAgICBUaGUgaW1wb3J0IG1heSBibG9jayBpZiBhbm90aGVyIHRocmVhZCBob2xkcyB0aGUgaW1wb3J0IGxvY2suIFRoZSBmdW5jdGlvbgotICAgOmNmdW5jOmBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrYCBuZXZlciBibG9ja3MuIEl0IGZpcnN0IHRyaWVzIHRvIGZldGNoCi0gICB0aGUgbW9kdWxlIGZyb20gc3lzLm1vZHVsZXMgYW5kIGZhbGxzIGJhY2sgdG8gOmNmdW5jOmBQeUltcG9ydF9JbXBvcnRNb2R1bGVgCisgICA6YzpmdW5jOmBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrYCBuZXZlciBibG9ja3MuIEl0IGZpcnN0IHRyaWVzIHRvIGZldGNoCisgICB0aGUgbW9kdWxlIGZyb20gc3lzLm1vZHVsZXMgYW5kIGZhbGxzIGJhY2sgdG8gOmM6ZnVuYzpgUHlJbXBvcnRfSW1wb3J0TW9kdWxlYAogICAgdW5sZXNzIHRoZSBsb2NrIGlzIGhlbGQsIGluIHdoaWNoIGNhc2UgdGhlIGZ1bmN0aW9uIHdpbGwgcmFpc2UgYW4KICAgIDpleGM6YEltcG9ydEVycm9yYC4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi42CiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5SW1wb3J0X0ltcG9ydE1vZHVsZUV4KGNoYXIgKm5hbWUsIFB5T2JqZWN0ICpnbG9iYWxzLCBQeU9iamVjdCAqbG9jYWxzLCBQeU9iamVjdCAqZnJvbWxpc3QpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5SW1wb3J0X0ltcG9ydE1vZHVsZUV4KGNoYXIgKm5hbWUsIFB5T2JqZWN0ICpnbG9iYWxzLCBQeU9iamVjdCAqbG9jYWxzLCBQeU9iamVjdCAqZnJvbWxpc3QpCiAKICAgIC4uIGluZGV4OjogYnVpbHRpbjogX19pbXBvcnRfXwogCkBAIC02NSwxMSArNjUsMTEgQEAKICAgICAgIEZhaWxpbmcgaW1wb3J0cyByZW1vdmUgaW5jb21wbGV0ZSBtb2R1bGUgb2JqZWN0cy4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjYKLSAgICAgIFRoZSBmdW5jdGlvbiBpcyBhbiBhbGlhcyBmb3IgOmNmdW5jOmBQeUltcG9ydF9JbXBvcnRNb2R1bGVMZXZlbGAgd2l0aAorICAgICAgVGhlIGZ1bmN0aW9uIGlzIGFuIGFsaWFzIGZvciA6YzpmdW5jOmBQeUltcG9ydF9JbXBvcnRNb2R1bGVMZXZlbGAgd2l0aAogICAgICAgLTEgYXMgbGV2ZWwsIG1lYW5pbmcgcmVsYXRpdmUgaW1wb3J0LgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUltcG9ydF9JbXBvcnRNb2R1bGVMZXZlbChjaGFyICpuYW1lLCBQeU9iamVjdCAqZ2xvYmFscywgUHlPYmplY3QgKmxvY2FscywgUHlPYmplY3QgKmZyb21saXN0LCBpbnQgbGV2ZWwpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5SW1wb3J0X0ltcG9ydE1vZHVsZUxldmVsKGNoYXIgKm5hbWUsIFB5T2JqZWN0ICpnbG9iYWxzLCBQeU9iamVjdCAqbG9jYWxzLCBQeU9iamVjdCAqZnJvbWxpc3QsIGludCBsZXZlbCkKIAogICAgSW1wb3J0IGEgbW9kdWxlLiAgVGhpcyBpcyBiZXN0IGRlc2NyaWJlZCBieSByZWZlcnJpbmcgdG8gdGhlIGJ1aWx0LWluIFB5dGhvbgogICAgZnVuY3Rpb24gOmZ1bmM6YF9faW1wb3J0X19gLCBhcyB0aGUgc3RhbmRhcmQgOmZ1bmM6YF9faW1wb3J0X19gIGZ1bmN0aW9uIGNhbGxzCkBAIC04Myw3ICs4Myw3IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjUKIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlJbXBvcnRfSW1wb3J0KFB5T2JqZWN0ICpuYW1lKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUltcG9ydF9JbXBvcnQoUHlPYmplY3QgKm5hbWUpCiAKICAgIC4uIGluZGV4OjoKICAgICAgIG1vZHVsZTogcmV4ZWMKQEAgLTk4LDcgKzk4LDcgQEAKICAgICAgIEFsd2F5cyB1c2VzIGFic29sdXRlIGltcG9ydHMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5SW1wb3J0X1JlbG9hZE1vZHVsZShQeU9iamVjdCAqbSkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlJbXBvcnRfUmVsb2FkTW9kdWxlKFB5T2JqZWN0ICptKQogCiAgICAuLiBpbmRleDo6IGJ1aWx0aW46IHJlbG9hZAogCkBAIC0xMDgsNyArMTA4LDcgQEAKICAgIHdpdGggYW4gZXhjZXB0aW9uIHNldCBvbiBmYWlsdXJlICh0aGUgbW9kdWxlIHN0aWxsIGV4aXN0cyBpbiB0aGlzIGNhc2UpLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUltcG9ydF9BZGRNb2R1bGUoY29uc3QgY2hhciAqbmFtZSkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlJbXBvcnRfQWRkTW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpCiAKICAgIFJldHVybiB0aGUgbW9kdWxlIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIGEgbW9kdWxlIG5hbWUuICBUaGUgKm5hbWUqIGFyZ3VtZW50CiAgICBtYXkgYmUgb2YgdGhlIGZvcm0gYGBwYWNrYWdlLm1vZHVsZWBgLiBGaXJzdCBjaGVjayB0aGUgbW9kdWxlcyBkaWN0aW9uYXJ5IGlmCkBAIC0xMTgsMTIgKzExOCwxMiBAQAogICAgLi4gbm90ZTo6CiAKICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgbG9hZCBvciBpbXBvcnQgdGhlIG1vZHVsZTsgaWYgdGhlIG1vZHVsZSB3YXNuJ3QgYWxyZWFkeQotICAgICAgbG9hZGVkLCB5b3Ugd2lsbCBnZXQgYW4gZW1wdHkgbW9kdWxlIG9iamVjdC4gVXNlIDpjZnVuYzpgUHlJbXBvcnRfSW1wb3J0TW9kdWxlYAorICAgICAgbG9hZGVkLCB5b3Ugd2lsbCBnZXQgYW4gZW1wdHkgbW9kdWxlIG9iamVjdC4gVXNlIDpjOmZ1bmM6YFB5SW1wb3J0X0ltcG9ydE1vZHVsZWAKICAgICAgIG9yIG9uZSBvZiBpdHMgdmFyaWFudHMgdG8gaW1wb3J0IGEgbW9kdWxlLiAgUGFja2FnZSBzdHJ1Y3R1cmVzIGltcGxpZWQgYnkgYQogICAgICAgZG90dGVkIG5hbWUgZm9yICpuYW1lKiBhcmUgbm90IGNyZWF0ZWQgaWYgbm90IGFscmVhZHkgcHJlc2VudC4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGUoY2hhciAqbmFtZSwgUHlPYmplY3QgKmNvKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZShjaGFyICpuYW1lLCBQeU9iamVjdCAqY28pCiAKICAgIC4uIGluZGV4OjogYnVpbHRpbjogY29tcGlsZQogCkBAIC0xMzMsMTYgKzEzMywxNiBAQAogICAgb3IgKk5VTEwqIHdpdGggYW4gZXhjZXB0aW9uIHNldCBpZiBhbiBlcnJvciBvY2N1cnJlZC4gIEJlZm9yZSBQeXRob24gMi40LCB0aGUKICAgIG1vZHVsZSBjb3VsZCBzdGlsbCBiZSBjcmVhdGVkIGluIGVycm9yIGNhc2VzLiAgU3RhcnRpbmcgd2l0aCBQeXRob24gMi40LCAqbmFtZSoKICAgIGlzIHJlbW92ZWQgZnJvbSA6YXR0cjpgc3lzLm1vZHVsZXNgIGluIGVycm9yIGNhc2VzLCBhbmQgZXZlbiBpZiAqbmFtZSogd2FzIGFscmVhZHkKLSAgIGluIDphdHRyOmBzeXMubW9kdWxlc2Agb24gZW50cnkgdG8gOmNmdW5jOmBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZWAuICBMZWF2aW5nCisgICBpbiA6YXR0cjpgc3lzLm1vZHVsZXNgIG9uIGVudHJ5IHRvIDpjOmZ1bmM6YFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlYC4gIExlYXZpbmcKICAgIGluY29tcGxldGVseSBpbml0aWFsaXplZCBtb2R1bGVzIGluIDphdHRyOmBzeXMubW9kdWxlc2AgaXMgZGFuZ2Vyb3VzLCBhcyBpbXBvcnRzIG9mCiAgICBzdWNoIG1vZHVsZXMgaGF2ZSBubyB3YXkgdG8ga25vdyB0aGF0IHRoZSBtb2R1bGUgb2JqZWN0IGlzIGFuIHVua25vd24gKGFuZAogICAgcHJvYmFibHkgZGFtYWdlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIG1vZHVsZSBhdXRob3IncyBpbnRlbnRzKSBzdGF0ZS4KIAogICAgVGhlIG1vZHVsZSdzIDphdHRyOmBfX2ZpbGVfX2AgYXR0cmlidXRlIHdpbGwgYmUgc2V0IHRvIHRoZSBjb2RlIG9iamVjdCdzCi0gICA6Y21lbWJlcjpgY29fZmlsZW5hbWVgLgorICAgOmM6bWVtYmVyOmBjb19maWxlbmFtZWAuCiAKICAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZWxvYWQgdGhlIG1vZHVsZSBpZiBpdCB3YXMgYWxyZWFkeSBpbXBvcnRlZC4gIFNlZQotICAgOmNmdW5jOmBQeUltcG9ydF9SZWxvYWRNb2R1bGVgIGZvciB0aGUgaW50ZW5kZWQgd2F5IHRvIHJlbG9hZCBhIG1vZHVsZS4KKyAgIDpjOmZ1bmM6YFB5SW1wb3J0X1JlbG9hZE1vZHVsZWAgZm9yIHRoZSBpbnRlbmRlZCB3YXkgdG8gcmVsb2FkIGEgbW9kdWxlLgogCiAgICBJZiAqbmFtZSogcG9pbnRzIHRvIGEgZG90dGVkIG5hbWUgb2YgdGhlIGZvcm0gYGBwYWNrYWdlLm1vZHVsZWBgLCBhbnkgcGFja2FnZQogICAgc3RydWN0dXJlcyBub3QgYWxyZWFkeSBjcmVhdGVkIHdpbGwgc3RpbGwgbm90IGJlIGNyZWF0ZWQuCkBAIC0xNTEsMjYgKzE1MSwyNiBAQAogICAgICAgKm5hbWUqIGlzIHJlbW92ZWQgZnJvbSA6YXR0cjpgc3lzLm1vZHVsZXNgIGluIGVycm9yIGNhc2VzLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZUV4KGNoYXIgKm5hbWUsIFB5T2JqZWN0ICpjbywgY2hhciAqcGF0aG5hbWUpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlRXgoY2hhciAqbmFtZSwgUHlPYmplY3QgKmNvLCBjaGFyICpwYXRobmFtZSkKIAotICAgTGlrZSA6Y2Z1bmM6YFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlYCwgYnV0IHRoZSA6YXR0cjpgX19maWxlX19gIGF0dHJpYnV0ZSBvZgorICAgTGlrZSA6YzpmdW5jOmBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZWAsIGJ1dCB0aGUgOmF0dHI6YF9fZmlsZV9fYCBhdHRyaWJ1dGUgb2YKICAgIHRoZSBtb2R1bGUgb2JqZWN0IGlzIHNldCB0byAqcGF0aG5hbWUqIGlmIGl0IGlzIG5vbi1gYE5VTExgYC4KIAogCi0uLiBjZnVuY3Rpb246OiBsb25nIFB5SW1wb3J0X0dldE1hZ2ljTnVtYmVyKCkKKy4uIGM6ZnVuY3Rpb246OiBsb25nIFB5SW1wb3J0X0dldE1hZ2ljTnVtYmVyKCkKIAogICAgUmV0dXJuIHRoZSBtYWdpYyBudW1iZXIgZm9yIFB5dGhvbiBieXRlY29kZSBmaWxlcyAoYS5rLmEuIDpmaWxlOmAucHljYCBhbmQKICAgIDpmaWxlOmAucHlvYCBmaWxlcykuICBUaGUgbWFnaWMgbnVtYmVyIHNob3VsZCBiZSBwcmVzZW50IGluIHRoZSBmaXJzdCBmb3VyIGJ5dGVzCiAgICBvZiB0aGUgYnl0ZWNvZGUgZmlsZSwgaW4gbGl0dGxlLWVuZGlhbiBieXRlIG9yZGVyLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlJbXBvcnRfR2V0TW9kdWxlRGljdCgpCiAKICAgIFJldHVybiB0aGUgZGljdGlvbmFyeSB1c2VkIGZvciB0aGUgbW9kdWxlIGFkbWluaXN0cmF0aW9uIChhLmsuYS4KICAgIGBgc3lzLm1vZHVsZXNgYCkuICBOb3RlIHRoYXQgdGhpcyBpcyBhIHBlci1pbnRlcnByZXRlciB2YXJpYWJsZS4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlJbXBvcnRfR2V0SW1wb3J0ZXIoUHlPYmplY3QgKnBhdGgpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5SW1wb3J0X0dldEltcG9ydGVyKFB5T2JqZWN0ICpwYXRoKQogCiAgICBSZXR1cm4gYW4gaW1wb3J0ZXIgb2JqZWN0IGZvciBhIDpkYXRhOmBzeXMucGF0aGAvOmF0dHI6YHBrZy5fX3BhdGhfX2AgaXRlbQogICAgKnBhdGgqLCBwb3NzaWJseSBieSBmZXRjaGluZyBpdCBmcm9tIHRoZSA6ZGF0YTpgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGVgCkBAIC0xODMsNDEgKzE4Myw0MSBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi42CiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBfUHlJbXBvcnRfSW5pdCgpCisuLiBjOmZ1bmN0aW9uOjogdm9pZCBfUHlJbXBvcnRfSW5pdCgpCiAKICAgIEluaXRpYWxpemUgdGhlIGltcG9ydCBtZWNoYW5pc20uICBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBQeUltcG9ydF9DbGVhbnVwKCkKKy4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5SW1wb3J0X0NsZWFudXAoKQogCiAgICBFbXB0eSB0aGUgbW9kdWxlIHRhYmxlLiAgRm9yIGludGVybmFsIHVzZSBvbmx5LgogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgX1B5SW1wb3J0X0ZpbmkoKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgX1B5SW1wb3J0X0ZpbmkoKQogCiAgICBGaW5hbGl6ZSB0aGUgaW1wb3J0IG1lY2hhbmlzbS4gIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogX1B5SW1wb3J0X0ZpbmRFeHRlbnNpb24oY2hhciAqLCBjaGFyICopCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIF9QeUltcG9ydF9GaW5kRXh0ZW5zaW9uKGNoYXIgKiwgY2hhciAqKQogCiAgICBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIF9QeUltcG9ydF9GaXh1cEV4dGVuc2lvbihjaGFyICosIGNoYXIgKikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogX1B5SW1wb3J0X0ZpeHVwRXh0ZW5zaW9uKGNoYXIgKiwgY2hhciAqKQogCiAgICBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5SW1wb3J0X0ltcG9ydEZyb3plbk1vZHVsZShjaGFyICpuYW1lKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUltcG9ydF9JbXBvcnRGcm96ZW5Nb2R1bGUoY2hhciAqbmFtZSkKIAogICAgTG9hZCBhIGZyb3plbiBtb2R1bGUgbmFtZWQgKm5hbWUqLiAgUmV0dXJuIGBgMWBgIGZvciBzdWNjZXNzLCBgYDBgYCBpZiB0aGUKICAgIG1vZHVsZSBpcyBub3QgZm91bmQsIGFuZCBgYC0xYGAgd2l0aCBhbiBleGNlcHRpb24gc2V0IGlmIHRoZSBpbml0aWFsaXphdGlvbgogICAgZmFpbGVkLiAgVG8gYWNjZXNzIHRoZSBpbXBvcnRlZCBtb2R1bGUgb24gYSBzdWNjZXNzZnVsIGxvYWQsIHVzZQotICAgOmNmdW5jOmBQeUltcG9ydF9JbXBvcnRNb2R1bGVgLiAgKE5vdGUgdGhlIG1pc25vbWVyIC0tLSB0aGlzIGZ1bmN0aW9uIHdvdWxkCisgICA6YzpmdW5jOmBQeUltcG9ydF9JbXBvcnRNb2R1bGVgLiAgKE5vdGUgdGhlIG1pc25vbWVyIC0tLSB0aGlzIGZ1bmN0aW9uIHdvdWxkCiAgICByZWxvYWQgdGhlIG1vZHVsZSBpZiBpdCB3YXMgYWxyZWFkeSBpbXBvcnRlZC4pCiAKIAotLi4gY3R5cGU6OiBzdHJ1Y3QgX2Zyb3plbgorLi4gYzp0eXBlOjogc3RydWN0IF9mcm96ZW4KIAogICAgLi4gaW5kZXg6OiBzaW5nbGU6IGZyZWV6ZSB1dGlsaXR5CiAKQEAgLTIzMywzMCArMjMzLDMwIEBACiAgICAgICB9OwogCiAKLS4uIGN2YXI6OiBzdHJ1Y3QgX2Zyb3plbiogUHlJbXBvcnRfRnJvemVuTW9kdWxlcworLi4gYzp2YXI6OiBzdHJ1Y3QgX2Zyb3plbiogUHlJbXBvcnRfRnJvemVuTW9kdWxlcwogCi0gICBUaGlzIHBvaW50ZXIgaXMgaW5pdGlhbGl6ZWQgdG8gcG9pbnQgdG8gYW4gYXJyYXkgb2YgOmN0eXBlOmBzdHJ1Y3QgX2Zyb3plbmAKKyAgIFRoaXMgcG9pbnRlciBpcyBpbml0aWFsaXplZCB0byBwb2ludCB0byBhbiBhcnJheSBvZiA6Yzp0eXBlOmBzdHJ1Y3QgX2Zyb3plbmAKICAgIHJlY29yZHMsIHRlcm1pbmF0ZWQgYnkgb25lIHdob3NlIG1lbWJlcnMgYXJlIGFsbCAqTlVMTCogb3IgemVyby4gIFdoZW4gYSBmcm96ZW4KICAgIG1vZHVsZSBpcyBpbXBvcnRlZCwgaXQgaXMgc2VhcmNoZWQgaW4gdGhpcyB0YWJsZS4gIFRoaXJkLXBhcnR5IGNvZGUgY291bGQgcGxheQogICAgdHJpY2tzIHdpdGggdGhpcyB0byBwcm92aWRlIGEgZHluYW1pY2FsbHkgY3JlYXRlZCBjb2xsZWN0aW9uIG9mIGZyb3plbiBtb2R1bGVzLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUltcG9ydF9BcHBlbmRJbml0dGFiKGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKCppbml0ZnVuYykodm9pZCkpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5SW1wb3J0X0FwcGVuZEluaXR0YWIoY29uc3QgY2hhciAqbmFtZSwgdm9pZCAoKmluaXRmdW5jKSh2b2lkKSkKIAogICAgQWRkIGEgc2luZ2xlIG1vZHVsZSB0byB0aGUgZXhpc3RpbmcgdGFibGUgb2YgYnVpbHQtaW4gbW9kdWxlcy4gIFRoaXMgaXMgYQotICAgY29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgOmNmdW5jOmBQeUltcG9ydF9FeHRlbmRJbml0dGFiYCwgcmV0dXJuaW5nIGBgLTFgYCBpZgorICAgY29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgOmM6ZnVuYzpgUHlJbXBvcnRfRXh0ZW5kSW5pdHRhYmAsIHJldHVybmluZyBgYC0xYGAgaWYKICAgIHRoZSB0YWJsZSBjb3VsZCBub3QgYmUgZXh0ZW5kZWQuICBUaGUgbmV3IG1vZHVsZSBjYW4gYmUgaW1wb3J0ZWQgYnkgdGhlIG5hbWUKICAgICpuYW1lKiwgYW5kIHVzZXMgdGhlIGZ1bmN0aW9uICppbml0ZnVuYyogYXMgdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGNhbGxlZAogICAgb24gdGhlIGZpcnN0IGF0dGVtcHRlZCBpbXBvcnQuICBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlCi0gICA6Y2Z1bmM6YFB5X0luaXRpYWxpemVgLgorICAgOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAuCiAKIAotLi4gY3R5cGU6OiBzdHJ1Y3QgX2luaXR0YWIKKy4uIGM6dHlwZTo6IHN0cnVjdCBfaW5pdHRhYgogCiAgICBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIHNpbmdsZSBlbnRyeSBpbiB0aGUgbGlzdCBvZiBidWlsdC1pbiBtb2R1bGVzLiAgRWFjaCBvZgogICAgdGhlc2Ugc3RydWN0dXJlcyBnaXZlcyB0aGUgbmFtZSBhbmQgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gZm9yIGEgbW9kdWxlIGJ1aWx0CiAgICBpbnRvIHRoZSBpbnRlcnByZXRlci4gIFByb2dyYW1zIHdoaWNoIGVtYmVkIFB5dGhvbiBtYXkgdXNlIGFuIGFycmF5IG9mIHRoZXNlCi0gICBzdHJ1Y3R1cmVzIGluIGNvbmp1bmN0aW9uIHdpdGggOmNmdW5jOmBQeUltcG9ydF9FeHRlbmRJbml0dGFiYCB0byBwcm92aWRlCisgICBzdHJ1Y3R1cmVzIGluIGNvbmp1bmN0aW9uIHdpdGggOmM6ZnVuYzpgUHlJbXBvcnRfRXh0ZW5kSW5pdHRhYmAgdG8gcHJvdmlkZQogICAgYWRkaXRpb25hbCBidWlsdC1pbiBtb2R1bGVzLiAgVGhlIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluCiAgICA6ZmlsZTpgSW5jbHVkZS9pbXBvcnQuaGAgYXM6OgogCkBAIC0yNjYsMTEgKzI2NiwxMSBAQAogICAgICAgfTsKIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlJbXBvcnRfRXh0ZW5kSW5pdHRhYihzdHJ1Y3QgX2luaXR0YWIgKm5ld3RhYikKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlJbXBvcnRfRXh0ZW5kSW5pdHRhYihzdHJ1Y3QgX2luaXR0YWIgKm5ld3RhYikKIAogICAgQWRkIGEgY29sbGVjdGlvbiBvZiBtb2R1bGVzIHRvIHRoZSB0YWJsZSBvZiBidWlsdC1pbiBtb2R1bGVzLiAgVGhlICpuZXd0YWIqCiAgICBhcnJheSBtdXN0IGVuZCB3aXRoIGEgc2VudGluZWwgZW50cnkgd2hpY2ggY29udGFpbnMgKk5VTEwqIGZvciB0aGUgOmF0dHI6YG5hbWVgCiAgICBmaWVsZDsgZmFpbHVyZSB0byBwcm92aWRlIHRoZSBzZW50aW5lbCB2YWx1ZSBjYW4gcmVzdWx0IGluIGEgbWVtb3J5IGZhdWx0LgogICAgUmV0dXJucyBgYDBgYCBvbiBzdWNjZXNzIG9yIGBgLTFgYCBpZiBpbnN1ZmZpY2llbnQgbWVtb3J5IGNvdWxkIGJlIGFsbG9jYXRlZCB0bwogICAgZXh0ZW5kIHRoZSBpbnRlcm5hbCB0YWJsZS4gIEluIHRoZSBldmVudCBvZiBmYWlsdXJlLCBubyBtb2R1bGVzIGFyZSBhZGRlZCB0byB0aGUKLSAgIGludGVybmFsIHRhYmxlLiAgVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSA6Y2Z1bmM6YFB5X0luaXRpYWxpemVgLgorICAgaW50ZXJuYWwgdGFibGUuICBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgLgpkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL2luZGV4LnJzdCBiL0RvYy9jLWFwaS9pbmRleC5yc3QKaW5kZXggMTJhMWVjNy4uMmNlN2I5OCAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL2luZGV4LnJzdAorKysgYi9Eb2MvYy1hcGkvaW5kZXgucnN0CkBAIC00LDkgKzQsNiBAQAogICBQeXRob24vQyBBUEkgUmVmZXJlbmNlIE1hbnVhbAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi06UmVsZWFzZTogfHZlcnNpb258Ci06RGF0ZTogfHRvZGF5fAotCiBUaGlzIG1hbnVhbCBkb2N1bWVudHMgdGhlIEFQSSB1c2VkIGJ5IEMgYW5kIEMrKyBwcm9ncmFtbWVycyB3aG8gd2FudCB0byB3cml0ZQogZXh0ZW5zaW9uIG1vZHVsZXMgb3IgZW1iZWQgUHl0aG9uLiAgSXQgaXMgYSBjb21wYW5pb24gdG8gOnJlZjpgZXh0ZW5kaW5nLWluZGV4YCwKIHdoaWNoIGRlc2NyaWJlcyB0aGUgZ2VuZXJhbCBwcmluY2lwbGVzIG9mIGV4dGVuc2lvbiB3cml0aW5nIGJ1dCBkb2VzIG5vdApkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL2luaXQucnN0IGIvRG9jL2MtYXBpL2luaXQucnN0CmluZGV4IGMzMjNlZWYuLjQ2ZmM5M2YgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS9pbml0LnJzdAorKysgYi9Eb2MvYy1hcGkvaW5pdC5yc3QKQEAgLTEyLDcgKzEyLDcgQEAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogCi0uLiBjZnVuY3Rpb246OiB2b2lkIFB5X0luaXRpYWxpemUoKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlfSW5pdGlhbGl6ZSgpCiAKICAgIC4uIGluZGV4OjoKICAgICAgIHNpbmdsZTogUHlfU2V0UHJvZ3JhbU5hbWUoKQpAQCAtMzEsNDAgKzMxLDQwIEBACiAKICAgIEluaXRpYWxpemUgdGhlIFB5dGhvbiBpbnRlcnByZXRlci4gIEluIGFuIGFwcGxpY2F0aW9uIGVtYmVkZGluZyAgUHl0aG9uLCB0aGlzCiAgICBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB1c2luZyBhbnkgb3RoZXIgUHl0aG9uL0MgQVBJIGZ1bmN0aW9uczsgd2l0aCB0aGUKLSAgIGV4Y2VwdGlvbiBvZiA6Y2Z1bmM6YFB5X1NldFByb2dyYW1OYW1lYCwgOmNmdW5jOmBQeUV2YWxfSW5pdFRocmVhZHNgLAotICAgOmNmdW5jOmBQeUV2YWxfUmVsZWFzZUxvY2tgLCBhbmQgOmNmdW5jOmBQeUV2YWxfQWNxdWlyZUxvY2tgLiBUaGlzIGluaXRpYWxpemVzCisgICBleGNlcHRpb24gb2YgOmM6ZnVuYzpgUHlfU2V0UHJvZ3JhbU5hbWVgLCA6YzpmdW5jOmBQeV9TZXRQeXRob25Ib21lYCwgOmM6ZnVuYzpgUHlFdmFsX0luaXRUaHJlYWRzYCwKKyAgIDpjOmZ1bmM6YFB5RXZhbF9SZWxlYXNlTG9ja2AsIGFuZCA6YzpmdW5jOmBQeUV2YWxfQWNxdWlyZUxvY2tgLiBUaGlzIGluaXRpYWxpemVzCiAgICB0aGUgdGFibGUgb2YgbG9hZGVkIG1vZHVsZXMgKGBgc3lzLm1vZHVsZXNgYCksIGFuZCBjcmVhdGVzIHRoZSBmdW5kYW1lbnRhbAogICAgbW9kdWxlcyA6bW9kOmBfX2J1aWx0aW5fX2AsIDptb2Q6YF9fbWFpbl9fYCBhbmQgOm1vZDpgc3lzYC4gIEl0IGFsc28gaW5pdGlhbGl6ZXMKICAgIHRoZSBtb2R1bGUgc2VhcmNoIHBhdGggKGBgc3lzLnBhdGhgYCkuIEl0IGRvZXMgbm90IHNldCBgYHN5cy5hcmd2YGA7IHVzZQotICAgOmNmdW5jOmBQeVN5c19TZXRBcmd2RXhgIGZvciB0aGF0LiAgVGhpcyBpcyBhIG5vLW9wIHdoZW4gY2FsbGVkIGZvciBhIHNlY29uZCB0aW1lCi0gICAod2l0aG91dCBjYWxsaW5nIDpjZnVuYzpgUHlfRmluYWxpemVgIGZpcnN0KS4gIFRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZTsgaXQgaXMgYQorICAgOmM6ZnVuYzpgUHlTeXNfU2V0QXJndkV4YCBmb3IgdGhhdC4gIFRoaXMgaXMgYSBuby1vcCB3aGVuIGNhbGxlZCBmb3IgYSBzZWNvbmQgdGltZQorICAgKHdpdGhvdXQgY2FsbGluZyA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAgZmlyc3QpLiAgVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlOyBpdCBpcyBhCiAgICBmYXRhbCBlcnJvciBpZiB0aGUgaW5pdGlhbGl6YXRpb24gZmFpbHMuCiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBQeV9Jbml0aWFsaXplRXgoaW50IGluaXRzaWdzKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlfSW5pdGlhbGl6ZUV4KGludCBpbml0c2lncykKIAotICAgVGhpcyBmdW5jdGlvbiB3b3JrcyBsaWtlIDpjZnVuYzpgUHlfSW5pdGlhbGl6ZWAgaWYgKmluaXRzaWdzKiBpcyAxLiBJZgorICAgVGhpcyBmdW5jdGlvbiB3b3JrcyBsaWtlIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgIGlmICppbml0c2lncyogaXMgMS4gSWYKICAgICppbml0c2lncyogaXMgMCwgaXQgc2tpcHMgaW5pdGlhbGl6YXRpb24gcmVnaXN0cmF0aW9uIG9mIHNpZ25hbCBoYW5kbGVycywgd2hpY2gKICAgIG1pZ2h0IGJlIHVzZWZ1bCB3aGVuIFB5dGhvbiBpcyBlbWJlZGRlZC4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi40CiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5X0lzSW5pdGlhbGl6ZWQoKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeV9Jc0luaXRpYWxpemVkKCkKIAogICAgUmV0dXJuIHRydWUgKG5vbnplcm8pIHdoZW4gdGhlIFB5dGhvbiBpbnRlcnByZXRlciBoYXMgYmVlbiBpbml0aWFsaXplZCwgZmFsc2UKLSAgICh6ZXJvKSBpZiBub3QuICBBZnRlciA6Y2Z1bmM6YFB5X0ZpbmFsaXplYCBpcyBjYWxsZWQsIHRoaXMgcmV0dXJucyBmYWxzZSB1bnRpbAotICAgOmNmdW5jOmBQeV9Jbml0aWFsaXplYCBpcyBjYWxsZWQgYWdhaW4uCisgICAoemVybykgaWYgbm90LiAgQWZ0ZXIgOmM6ZnVuYzpgUHlfRmluYWxpemVgIGlzIGNhbGxlZCwgdGhpcyByZXR1cm5zIGZhbHNlIHVudGlsCisgICA6YzpmdW5jOmBQeV9Jbml0aWFsaXplYCBpcyBjYWxsZWQgYWdhaW4uCiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBQeV9GaW5hbGl6ZSgpCisuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeV9GaW5hbGl6ZSgpCiAKLSAgIFVuZG8gYWxsIGluaXRpYWxpemF0aW9ucyBtYWRlIGJ5IDpjZnVuYzpgUHlfSW5pdGlhbGl6ZWAgYW5kIHN1YnNlcXVlbnQgdXNlIG9mCisgICBVbmRvIGFsbCBpbml0aWFsaXphdGlvbnMgbWFkZSBieSA6YzpmdW5jOmBQeV9Jbml0aWFsaXplYCBhbmQgc3Vic2VxdWVudCB1c2Ugb2YKICAgIFB5dGhvbi9DIEFQSSBmdW5jdGlvbnMsIGFuZCBkZXN0cm95IGFsbCBzdWItaW50ZXJwcmV0ZXJzIChzZWUKLSAgIDpjZnVuYzpgUHlfTmV3SW50ZXJwcmV0ZXJgIGJlbG93KSB0aGF0IHdlcmUgY3JlYXRlZCBhbmQgbm90IHlldCBkZXN0cm95ZWQgc2luY2UKLSAgIHRoZSBsYXN0IGNhbGwgdG8gOmNmdW5jOmBQeV9Jbml0aWFsaXplYC4gIElkZWFsbHksIHRoaXMgZnJlZXMgYWxsIG1lbW9yeQorICAgOmM6ZnVuYzpgUHlfTmV3SW50ZXJwcmV0ZXJgIGJlbG93KSB0aGF0IHdlcmUgY3JlYXRlZCBhbmQgbm90IHlldCBkZXN0cm95ZWQgc2luY2UKKyAgIHRoZSBsYXN0IGNhbGwgdG8gOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAuICBJZGVhbGx5LCB0aGlzIGZyZWVzIGFsbCBtZW1vcnkKICAgIGFsbG9jYXRlZCBieSB0aGUgUHl0aG9uIGludGVycHJldGVyLiAgVGhpcyBpcyBhIG5vLW9wIHdoZW4gY2FsbGVkIGZvciBhIHNlY29uZAotICAgdGltZSAod2l0aG91dCBjYWxsaW5nIDpjZnVuYzpgUHlfSW5pdGlhbGl6ZWAgYWdhaW4gZmlyc3QpLiAgVGhlcmUgaXMgbm8gcmV0dXJuCisgICB0aW1lICh3aXRob3V0IGNhbGxpbmcgOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAgYWdhaW4gZmlyc3QpLiAgVGhlcmUgaXMgbm8gcmV0dXJuCiAgICB2YWx1ZTsgZXJyb3JzIGR1cmluZyBmaW5hbGl6YXRpb24gYXJlIGlnbm9yZWQuCiAKICAgIFRoaXMgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZm9yIGEgbnVtYmVyIG9mIHJlYXNvbnMuICBBbiBlbWJlZGRpbmcgYXBwbGljYXRpb24KQEAgLTgzLDI1ICs4MywyNSBAQAogICAgcGxlYXNlIHJlcG9ydCBpdCkuICBNZW1vcnkgdGllZCB1cCBpbiBjaXJjdWxhciByZWZlcmVuY2VzIGJldHdlZW4gb2JqZWN0cyBpcyBub3QKICAgIGZyZWVkLiAgU29tZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IGV4dGVuc2lvbiBtb2R1bGVzIG1heSBub3QgYmUgZnJlZWQuICBTb21lCiAgICBleHRlbnNpb25zIG1heSBub3Qgd29yayBwcm9wZXJseSBpZiB0aGVpciBpbml0aWFsaXphdGlvbiByb3V0aW5lIGlzIGNhbGxlZCBtb3JlCi0gICB0aGFuIG9uY2U7IHRoaXMgY2FuIGhhcHBlbiBpZiBhbiBhcHBsaWNhdGlvbiBjYWxscyA6Y2Z1bmM6YFB5X0luaXRpYWxpemVgIGFuZAotICAgOmNmdW5jOmBQeV9GaW5hbGl6ZWAgbW9yZSB0aGFuIG9uY2UuCisgICB0aGFuIG9uY2U7IHRoaXMgY2FuIGhhcHBlbiBpZiBhbiBhcHBsaWNhdGlvbiBjYWxscyA6YzpmdW5jOmBQeV9Jbml0aWFsaXplYCBhbmQKKyAgIDpjOmZ1bmM6YFB5X0ZpbmFsaXplYCBtb3JlIHRoYW4gb25jZS4KIAogCiBQcm9jZXNzLXdpZGUgcGFyYW1ldGVycwogPT09PT09PT09PT09PT09PT09PT09PT0KIAogCi0uLiBjZnVuY3Rpb246OiB2b2lkIFB5X1NldFByb2dyYW1OYW1lKGNoYXIgKm5hbWUpCisuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeV9TZXRQcm9ncmFtTmFtZShjaGFyICpuYW1lKQogCiAgICAuLiBpbmRleDo6CiAgICAgICBzaW5nbGU6IFB5X0luaXRpYWxpemUoKQogICAgICAgc2luZ2xlOiBtYWluKCkKICAgICAgIHNpbmdsZTogUHlfR2V0UGF0aCgpCiAKLSAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgOmNmdW5jOmBQeV9Jbml0aWFsaXplYCBpcyBjYWxsZWQgZm9yCisgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgIGlzIGNhbGxlZCBmb3IKICAgIHRoZSBmaXJzdCB0aW1lLCBpZiBpdCBpcyBjYWxsZWQgYXQgYWxsLiAgSXQgdGVsbHMgdGhlIGludGVycHJldGVyIHRoZSB2YWx1ZQotICAgb2YgdGhlIGBgYXJndlswXWBgIGFyZ3VtZW50IHRvIHRoZSA6Y2Z1bmM6YG1haW5gIGZ1bmN0aW9uIG9mIHRoZSBwcm9ncmFtLgotICAgVGhpcyBpcyB1c2VkIGJ5IDpjZnVuYzpgUHlfR2V0UGF0aGAgYW5kIHNvbWUgb3RoZXIgZnVuY3Rpb25zIGJlbG93IHRvIGZpbmQKKyAgIG9mIHRoZSBgYGFyZ3ZbMF1gYCBhcmd1bWVudCB0byB0aGUgOmM6ZnVuYzpgbWFpbmAgZnVuY3Rpb24gb2YgdGhlIHByb2dyYW0uCisgICBUaGlzIGlzIHVzZWQgYnkgOmM6ZnVuYzpgUHlfR2V0UGF0aGAgYW5kIHNvbWUgb3RoZXIgZnVuY3Rpb25zIGJlbG93IHRvIGZpbmQKICAgIHRoZSBQeXRob24gcnVuLXRpbWUgbGlicmFyaWVzIHJlbGF0aXZlIHRvIHRoZSBpbnRlcnByZXRlciBleGVjdXRhYmxlLiAgVGhlCiAgICBkZWZhdWx0IHZhbHVlIGlzIGBgJ3B5dGhvbidgYC4gIFRoZSBhcmd1bWVudCBzaG91bGQgcG9pbnQgdG8gYQogICAgemVyby10ZXJtaW5hdGVkIGNoYXJhY3RlciBzdHJpbmcgaW4gc3RhdGljIHN0b3JhZ2Ugd2hvc2UgY29udGVudHMgd2lsbCBub3QKQEAgLTEwOSwyMCArMTA5LDIwIEBACiAgICBpbnRlcnByZXRlciB3aWxsIGNoYW5nZSB0aGUgY29udGVudHMgb2YgdGhpcyBzdG9yYWdlLgogCiAKLS4uIGNmdW5jdGlvbjo6IGNoYXIqIFB5X0dldFByb2dyYW1OYW1lKCkKKy4uIGM6ZnVuY3Rpb246OiBjaGFyKiBQeV9HZXRQcm9ncmFtTmFtZSgpCiAKICAgIC4uIGluZGV4Ojogc2luZ2xlOiBQeV9TZXRQcm9ncmFtTmFtZSgpCiAKLSAgIFJldHVybiB0aGUgcHJvZ3JhbSBuYW1lIHNldCB3aXRoIDpjZnVuYzpgUHlfU2V0UHJvZ3JhbU5hbWVgLCBvciB0aGUgZGVmYXVsdC4KKyAgIFJldHVybiB0aGUgcHJvZ3JhbSBuYW1lIHNldCB3aXRoIDpjOmZ1bmM6YFB5X1NldFByb2dyYW1OYW1lYCwgb3IgdGhlIGRlZmF1bHQuCiAgICBUaGUgcmV0dXJuZWQgc3RyaW5nIHBvaW50cyBpbnRvIHN0YXRpYyBzdG9yYWdlOyB0aGUgY2FsbGVyIHNob3VsZCBub3QgbW9kaWZ5IGl0cwogICAgdmFsdWUuCiAKIAotLi4gY2Z1bmN0aW9uOjogY2hhciogUHlfR2V0UHJlZml4KCkKKy4uIGM6ZnVuY3Rpb246OiBjaGFyKiBQeV9HZXRQcmVmaXgoKQogCiAgICBSZXR1cm4gdGhlICpwcmVmaXgqIGZvciBpbnN0YWxsZWQgcGxhdGZvcm0taW5kZXBlbmRlbnQgZmlsZXMuIFRoaXMgaXMgZGVyaXZlZAogICAgdGhyb3VnaCBhIG51bWJlciBvZiBjb21wbGljYXRlZCBydWxlcyBmcm9tIHRoZSBwcm9ncmFtIG5hbWUgc2V0IHdpdGgKLSAgIDpjZnVuYzpgUHlfU2V0UHJvZ3JhbU5hbWVgIGFuZCBzb21lIGVudmlyb25tZW50IHZhcmlhYmxlczsgZm9yIGV4YW1wbGUsIGlmIHRoZQorICAgOmM6ZnVuYzpgUHlfU2V0UHJvZ3JhbU5hbWVgIGFuZCBzb21lIGVudmlyb25tZW50IHZhcmlhYmxlczsgZm9yIGV4YW1wbGUsIGlmIHRoZQogICAgcHJvZ3JhbSBuYW1lIGlzIGBgJy91c3IvbG9jYWwvYmluL3B5dGhvbidgYCwgdGhlIHByZWZpeCBpcyBgYCcvdXNyL2xvY2FsJ2BgLiBUaGUKICAgIHJldHVybmVkIHN0cmluZyBwb2ludHMgaW50byBzdGF0aWMgc3RvcmFnZTsgdGhlIGNhbGxlciBzaG91bGQgbm90IG1vZGlmeSBpdHMKICAgIHZhbHVlLiAgVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgOm1ha2V2YXI6YHByZWZpeGAgdmFyaWFibGUgaW4gdGhlIHRvcC1sZXZlbApAQCAtMTMxLDExICsxMzEsMTEgQEAKICAgIEl0IGlzIG9ubHkgdXNlZnVsIG9uIFVuaXguICBTZWUgYWxzbyB0aGUgbmV4dCBmdW5jdGlvbi4KIAogCi0uLiBjZnVuY3Rpb246OiBjaGFyKiBQeV9HZXRFeGVjUHJlZml4KCkKKy4uIGM6ZnVuY3Rpb246OiBjaGFyKiBQeV9HZXRFeGVjUHJlZml4KCkKIAogICAgUmV0dXJuIHRoZSAqZXhlYy1wcmVmaXgqIGZvciBpbnN0YWxsZWQgcGxhdGZvcm0tKmRlcGVuZGVudCogZmlsZXMuICBUaGlzIGlzCiAgICBkZXJpdmVkIHRocm91Z2ggYSBudW1iZXIgb2YgY29tcGxpY2F0ZWQgcnVsZXMgZnJvbSB0aGUgcHJvZ3JhbSBuYW1lIHNldCB3aXRoCi0gICA6Y2Z1bmM6YFB5X1NldFByb2dyYW1OYW1lYCBhbmQgc29tZSBlbnZpcm9ubWVudCB2YXJpYWJsZXM7IGZvciBleGFtcGxlLCBpZiB0aGUKKyAgIDpjOmZ1bmM6YFB5X1NldFByb2dyYW1OYW1lYCBhbmQgc29tZSBlbnZpcm9ubWVudCB2YXJpYWJsZXM7IGZvciBleGFtcGxlLCBpZiB0aGUKICAgIHByb2dyYW0gbmFtZSBpcyBgYCcvdXNyL2xvY2FsL2Jpbi9weXRob24nYGAsIHRoZSBleGVjLXByZWZpeCBpcwogICAgYGAnL3Vzci9sb2NhbCdgYC4gIFRoZSByZXR1cm5lZCBzdHJpbmcgcG9pbnRzIGludG8gc3RhdGljIHN0b3JhZ2U7IHRoZSBjYWxsZXIKICAgIHNob3VsZCBub3QgbW9kaWZ5IGl0cyB2YWx1ZS4gIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIDptYWtldmFyOmBleGVjX3ByZWZpeGAKQEAgLTE2Niw3ICsxNjYsNyBAQAogICAgcGxhdGZvcm0uCiAKIAotLi4gY2Z1bmN0aW9uOjogY2hhciogUHlfR2V0UHJvZ3JhbUZ1bGxQYXRoKCkKKy4uIGM6ZnVuY3Rpb246OiBjaGFyKiBQeV9HZXRQcm9ncmFtRnVsbFBhdGgoKQogCiAgICAuLiBpbmRleDo6CiAgICAgICBzaW5nbGU6IFB5X1NldFByb2dyYW1OYW1lKCkKQEAgLTE3NCwxOSArMTc0LDE5IEBACiAKICAgIFJldHVybiB0aGUgZnVsbCBwcm9ncmFtIG5hbWUgb2YgdGhlIFB5dGhvbiBleGVjdXRhYmxlOyB0aGlzIGlzICBjb21wdXRlZCBhcyBhCiAgICBzaWRlLWVmZmVjdCBvZiBkZXJpdmluZyB0aGUgZGVmYXVsdCBtb2R1bGUgc2VhcmNoIHBhdGggIGZyb20gdGhlIHByb2dyYW0gbmFtZQotICAgKHNldCBieSA6Y2Z1bmM6YFB5X1NldFByb2dyYW1OYW1lYCBhYm92ZSkuIFRoZSByZXR1cm5lZCBzdHJpbmcgcG9pbnRzIGludG8KKyAgIChzZXQgYnkgOmM6ZnVuYzpgUHlfU2V0UHJvZ3JhbU5hbWVgIGFib3ZlKS4gVGhlIHJldHVybmVkIHN0cmluZyBwb2ludHMgaW50bwogICAgc3RhdGljIHN0b3JhZ2U7IHRoZSBjYWxsZXIgc2hvdWxkIG5vdCBtb2RpZnkgaXRzIHZhbHVlLiAgVGhlIHZhbHVlIGlzIGF2YWlsYWJsZQogICAgdG8gUHl0aG9uIGNvZGUgYXMgYGBzeXMuZXhlY3V0YWJsZWBgLgogCiAKLS4uIGNmdW5jdGlvbjo6IGNoYXIqIFB5X0dldFBhdGgoKQorLi4gYzpmdW5jdGlvbjo6IGNoYXIqIFB5X0dldFBhdGgoKQogCiAgICAuLiBpbmRleDo6CiAgICAgICB0cmlwbGU6IG1vZHVsZTsgc2VhcmNoOyBwYXRoCiAgICAgICBzaW5nbGU6IHBhdGggKGluIG1vZHVsZSBzeXMpCiAKICAgIFJldHVybiB0aGUgZGVmYXVsdCBtb2R1bGUgc2VhcmNoIHBhdGg7IHRoaXMgaXMgY29tcHV0ZWQgZnJvbSB0aGUgcHJvZ3JhbSBuYW1lCi0gICAoc2V0IGJ5IDpjZnVuYzpgUHlfU2V0UHJvZ3JhbU5hbWVgIGFib3ZlKSBhbmQgc29tZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisgICAoc2V0IGJ5IDpjOmZ1bmM6YFB5X1NldFByb2dyYW1OYW1lYCBhYm92ZSkgYW5kIHNvbWUgZW52aXJvbm1lbnQgdmFyaWFibGVzLgogICAgVGhlIHJldHVybmVkIHN0cmluZyBjb25zaXN0cyBvZiBhIHNlcmllcyBvZiBkaXJlY3RvcnkgbmFtZXMgc2VwYXJhdGVkIGJ5IGEKICAgIHBsYXRmb3JtIGRlcGVuZGVudCBkZWxpbWl0ZXIgY2hhcmFjdGVyLiAgVGhlIGRlbGltaXRlciBjaGFyYWN0ZXIgaXMgYGAnOidgYAogICAgb24gVW5peCBhbmQgTWFjIE9TIFgsIGBgJzsnYGAgb24gV2luZG93cy4gIFRoZSByZXR1cm5lZCBzdHJpbmcgcG9pbnRzIGludG8KQEAgLTE5OCw3ICsxOTgsNyBAQAogICAgLi4gWFhYIHNob3VsZCBnaXZlIHRoZSBleGFjdCBydWxlcwogCiAKLS4uIGNmdW5jdGlvbjo6IGNvbnN0IGNoYXIqIFB5X0dldFZlcnNpb24oKQorLi4gYzpmdW5jdGlvbjo6IGNvbnN0IGNoYXIqIFB5X0dldFZlcnNpb24oKQogCiAgICBSZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhpcyBQeXRob24gaW50ZXJwcmV0ZXIuICBUaGlzIGlzIGEgc3RyaW5nIHRoYXQgbG9va3MKICAgIHNvbWV0aGluZyBsaWtlIDo6CkBAIC0yMTMsNyArMjEzLDcgQEAKICAgIG1vZGlmeSBpdHMgdmFsdWUuICBUaGUgdmFsdWUgaXMgYXZhaWxhYmxlIHRvIFB5dGhvbiBjb2RlIGFzIGBgc3lzLnZlcnNpb25gYC4KIAogCi0uLiBjZnVuY3Rpb246OiBjb25zdCBjaGFyKiBQeV9HZXRQbGF0Zm9ybSgpCisuLiBjOmZ1bmN0aW9uOjogY29uc3QgY2hhciogUHlfR2V0UGxhdGZvcm0oKQogCiAgICAuLiBpbmRleDo6IHNpbmdsZTogcGxhdGZvcm0gKGluIG1vZHVsZSBzeXMpCiAKQEAgLTIyNiw3ICsyMjYsNyBAQAogICAgdG8gUHl0aG9uIGNvZGUgYXMgYGBzeXMucGxhdGZvcm1gYC4KIAogCi0uLiBjZnVuY3Rpb246OiBjb25zdCBjaGFyKiBQeV9HZXRDb3B5cmlnaHQoKQorLi4gYzpmdW5jdGlvbjo6IGNvbnN0IGNoYXIqIFB5X0dldENvcHlyaWdodCgpCiAKICAgIFJldHVybiB0aGUgb2ZmaWNpYWwgY29weXJpZ2h0IHN0cmluZyBmb3IgdGhlIGN1cnJlbnQgUHl0aG9uIHZlcnNpb24sIGZvciBleGFtcGxlCiAKQEAgLTIzOCw3ICsyMzgsNyBAQAogICAgdmFsdWUuICBUaGUgdmFsdWUgaXMgYXZhaWxhYmxlIHRvIFB5dGhvbiBjb2RlIGFzIGBgc3lzLmNvcHlyaWdodGBgLgogCiAKLS4uIGNmdW5jdGlvbjo6IGNvbnN0IGNoYXIqIFB5X0dldENvbXBpbGVyKCkKKy4uIGM6ZnVuY3Rpb246OiBjb25zdCBjaGFyKiBQeV9HZXRDb21waWxlcigpCiAKICAgIFJldHVybiBhbiBpbmRpY2F0aW9uIG9mIHRoZSBjb21waWxlciB1c2VkIHRvIGJ1aWxkIHRoZSBjdXJyZW50IFB5dGhvbiB2ZXJzaW9uLAogICAgaW4gc3F1YXJlIGJyYWNrZXRzLCBmb3IgZXhhbXBsZTo6CkBAIC0yNTIsNyArMjUyLDcgQEAKICAgIGBgc3lzLnZlcnNpb25gYC4KIAogCi0uLiBjZnVuY3Rpb246OiBjb25zdCBjaGFyKiBQeV9HZXRCdWlsZEluZm8oKQorLi4gYzpmdW5jdGlvbjo6IGNvbnN0IGNoYXIqIFB5X0dldEJ1aWxkSW5mbygpCiAKICAgIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VxdWVuY2UgbnVtYmVyIGFuZCBidWlsZCBkYXRlIGFuZCB0aW1lICBvZiB0aGUKICAgIGN1cnJlbnQgUHl0aG9uIGludGVycHJldGVyIGluc3RhbmNlLCBmb3IgZXhhbXBsZSA6OgpAQCAtMjY2LDcgKzI2Niw3IEBACiAgICBgYHN5cy52ZXJzaW9uYGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBQeVN5c19TZXRBcmd2RXgoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBpbnQgdXBkYXRlcGF0aCkKKy4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5U3lzX1NldEFyZ3ZFeChpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGludCB1cGRhdGVwYXRoKQogCiAgICAuLiBpbmRleDo6CiAgICAgICBzaW5nbGU6IG1haW4oKQpAQCAtMjc0LDEyICsyNzQsMTIgQEAKICAgICAgIHNpbmdsZTogYXJndiAoaW4gbW9kdWxlIHN5cykKIAogICAgU2V0IDpkYXRhOmBzeXMuYXJndmAgYmFzZWQgb24gKmFyZ2MqIGFuZCAqYXJndiouICBUaGVzZSBwYXJhbWV0ZXJzIGFyZQotICAgc2ltaWxhciB0byB0aG9zZSBwYXNzZWQgdG8gdGhlIHByb2dyYW0ncyA6Y2Z1bmM6YG1haW5gIGZ1bmN0aW9uIHdpdGggdGhlCisgICBzaW1pbGFyIHRvIHRob3NlIHBhc3NlZCB0byB0aGUgcHJvZ3JhbSdzIDpjOmZ1bmM6YG1haW5gIGZ1bmN0aW9uIHdpdGggdGhlCiAgICBkaWZmZXJlbmNlIHRoYXQgdGhlIGZpcnN0IGVudHJ5IHNob3VsZCByZWZlciB0byB0aGUgc2NyaXB0IGZpbGUgdG8gYmUKICAgIGV4ZWN1dGVkIHJhdGhlciB0aGFuIHRoZSBleGVjdXRhYmxlIGhvc3RpbmcgdGhlIFB5dGhvbiBpbnRlcnByZXRlci4gIElmIHRoZXJlCiAgICBpc24ndCBhIHNjcmlwdCB0aGF0IHdpbGwgYmUgcnVuLCB0aGUgZmlyc3QgZW50cnkgaW4gKmFyZ3YqIGNhbiBiZSBhbiBlbXB0eQogICAgc3RyaW5nLiAgSWYgdGhpcyBmdW5jdGlvbiBmYWlscyB0byBpbml0aWFsaXplIDpkYXRhOmBzeXMuYXJndmAsIGEgZmF0YWwKLSAgIGNvbmRpdGlvbiBpcyBzaWduYWxsZWQgdXNpbmcgOmNmdW5jOmBQeV9GYXRhbEVycm9yYC4KKyAgIGNvbmRpdGlvbiBpcyBzaWduYWxsZWQgdXNpbmcgOmM6ZnVuYzpgUHlfRmF0YWxFcnJvcmAuCiAKICAgIElmICp1cGRhdGVwYXRoKiBpcyB6ZXJvLCB0aGlzIGlzIGFsbCB0aGUgZnVuY3Rpb24gZG9lcy4gIElmICp1cGRhdGVwYXRoKgogICAgaXMgbm9uLXplcm8sIHRoZSBmdW5jdGlvbiBhbHNvIG1vZGlmaWVzIDpkYXRhOmBzeXMucGF0aGAgYWNjb3JkaW5nIHRvIHRoZQpAQCAtMzAxLDcgKzMwMSw3IEBACiAKICAgICAgIE9uIHZlcnNpb25zIGJlZm9yZSAyLjYuNiwgeW91IGNhbiBhY2hpZXZlIHRoZSBzYW1lIGVmZmVjdCBieSBtYW51YWxseQogICAgICAgcG9wcGluZyB0aGUgZmlyc3QgOmRhdGE6YHN5cy5wYXRoYCBlbGVtZW50IGFmdGVyIGhhdmluZyBjYWxsZWQKLSAgICAgIDpjZnVuYzpgUHlTeXNfU2V0QXJndmAsIGZvciBleGFtcGxlIHVzaW5nOjoKKyAgICAgIDpjOmZ1bmM6YFB5U3lzX1NldEFyZ3ZgLCBmb3IgZXhhbXBsZSB1c2luZzo6CiAKICAgICAgICAgIFB5UnVuX1NpbXBsZVN0cmluZygiaW1wb3J0IHN5czsgc3lzLnBhdGgucG9wKDApXG4iKTsKIApAQCAtMzExLDEyICszMTEsMTIgQEAKICAgICAgIGNoZWNrIHcvIEd1aWRvLgogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgUHlTeXNfU2V0QXJndihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeVN5c19TZXRBcmd2KGludCBhcmdjLCBjaGFyICoqYXJndikKIAotICAgVGhpcyBmdW5jdGlvbiB3b3JrcyBsaWtlIDpjZnVuYzpgUHlTeXNfU2V0QXJndkV4YCB3aXRoICp1cGRhdGVwYXRoKiBzZXQgdG8gMS4KKyAgIFRoaXMgZnVuY3Rpb24gd29ya3MgbGlrZSA6YzpmdW5jOmBQeVN5c19TZXRBcmd2RXhgIHdpdGggKnVwZGF0ZXBhdGgqIHNldCB0byAxLgogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgUHlfU2V0UHl0aG9uSG9tZShjaGFyICpob21lKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlfU2V0UHl0aG9uSG9tZShjaGFyICpob21lKQogCiAgICBTZXQgdGhlIGRlZmF1bHQgImhvbWUiIGRpcmVjdG9yeSwgdGhhdCBpcywgdGhlIGxvY2F0aW9uIG9mIHRoZSBzdGFuZGFyZAogICAgUHl0aG9uIGxpYnJhcmllcy4gIFNlZSA6ZW52dmFyOmBQWVRIT05IT01FYCBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlCkBAIC0zMjgsMTAgKzMyOCwxMCBAQAogICAgdGhpcyBzdG9yYWdlLgogCiAKLS4uIGNmdW5jdGlvbjo6IGNoYXIqIFB5X0dldFB5dGhvbkhvbWUoKQorLi4gYzpmdW5jdGlvbjo6IGNoYXIqIFB5X0dldFB5dGhvbkhvbWUoKQogCiAgICBSZXR1cm4gdGhlIGRlZmF1bHQgImhvbWUiLCB0aGF0IGlzLCB0aGUgdmFsdWUgc2V0IGJ5IGEgcHJldmlvdXMgY2FsbCB0bwotICAgOmNmdW5jOmBQeV9TZXRQeXRob25Ib21lYCwgb3IgdGhlIHZhbHVlIG9mIHRoZSA6ZW52dmFyOmBQWVRIT05IT01FYAorICAgOmM6ZnVuYzpgUHlfU2V0UHl0aG9uSG9tZWAsIG9yIHRoZSB2YWx1ZSBvZiB0aGUgOmVudnZhcjpgUFlUSE9OSE9NRWAKICAgIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIGl0IGlzIHNldC4KIAogCkBAIC0zNjgsOSArMzY4LDkgQEAKICAgIHNpbmdsZTogUHlUaHJlYWRTdGF0ZQogCiBUaGUgUHl0aG9uIGludGVycHJldGVyIGtlZXBzIHNvbWUgdGhyZWFkLXNwZWNpZmljIGJvb2trZWVwaW5nIGluZm9ybWF0aW9uCi1pbnNpZGUgYSBkYXRhIHN0cnVjdHVyZSBjYWxsZWQgOmN0eXBlOmBQeVRocmVhZFN0YXRlYC4gIFRoZXJlJ3MgYWxzbyBvbmUKLWdsb2JhbCB2YXJpYWJsZSBwb2ludGluZyB0byB0aGUgY3VycmVudCA6Y3R5cGU6YFB5VGhyZWFkU3RhdGVgOiBpdCBjYW4KLWJlIHJldHJpZXZlZCB1c2luZyA6Y2Z1bmM6YFB5VGhyZWFkU3RhdGVfR2V0YC4KK2luc2lkZSBhIGRhdGEgc3RydWN0dXJlIGNhbGxlZCA6Yzp0eXBlOmBQeVRocmVhZFN0YXRlYC4gIFRoZXJlJ3MgYWxzbyBvbmUKK2dsb2JhbCB2YXJpYWJsZSBwb2ludGluZyB0byB0aGUgY3VycmVudCA6Yzp0eXBlOmBQeVRocmVhZFN0YXRlYDogaXQgY2FuCitiZSByZXRyaWV2ZWQgdXNpbmcgOmM6ZnVuYzpgUHlUaHJlYWRTdGF0ZV9HZXRgLgogCiBSZWxlYXNpbmcgdGhlIEdJTCBmcm9tIGV4dGVuc2lvbiBjb2RlCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zOTQsOCArMzk0LDggQEAKICAgIHNpbmdsZTogUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgc2luZ2xlOiBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi1UaGUgOmNtYWNybzpgUHlfQkVHSU5fQUxMT1dfVEhSRUFEU2AgbWFjcm8gb3BlbnMgYSBuZXcgYmxvY2sgYW5kIGRlY2xhcmVzIGEKLWhpZGRlbiBsb2NhbCB2YXJpYWJsZTsgdGhlIDpjbWFjcm86YFB5X0VORF9BTExPV19USFJFQURTYCBtYWNybyBjbG9zZXMgdGhlCitUaGUgOmM6bWFjcm86YFB5X0JFR0lOX0FMTE9XX1RIUkVBRFNgIG1hY3JvIG9wZW5zIGEgbmV3IGJsb2NrIGFuZCBkZWNsYXJlcyBhCitoaWRkZW4gbG9jYWwgdmFyaWFibGU7IHRoZSA6YzptYWNybzpgUHlfRU5EX0FMTE9XX1RIUkVBRFNgIG1hY3JvIGNsb3NlcyB0aGUKIGJsb2NrLiAgVGhlc2UgdHdvIG1hY3JvcyBhcmUgc3RpbGwgYXZhaWxhYmxlIHdoZW4gUHl0aG9uIGlzIGNvbXBpbGVkIHdpdGhvdXQKIHRocmVhZCBzdXBwb3J0ICh0aGV5IHNpbXBseSBoYXZlIGFuIGVtcHR5IGV4cGFuc2lvbikuCiAKQEAgLTQyNyw2ICs0MjcsOSBAQAogICAgc3RhbmRhcmQgOm1vZDpgemxpYmAgYW5kIDptb2Q6YGhhc2hsaWJgIG1vZHVsZXMgcmVsZWFzZSB0aGUgR0lMIHdoZW4KICAgIGNvbXByZXNzaW5nIG9yIGhhc2hpbmcgZGF0YS4KIAorCisuLiBfZ2lsc3RhdGU6CisKIE5vbi1QeXRob24gY3JlYXRlZCB0aHJlYWRzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC00NDUsNyArNDQ4LDcgQEAKIEFQSS4gIFdoZW4geW91IGFyZSBkb25lLCB5b3Ugc2hvdWxkIHJlc2V0IHRoZSB0aHJlYWQgc3RhdGUgcG9pbnRlciwgcmVsZWFzZQogdGhlIEdJTCwgYW5kIGZpbmFsbHkgZnJlZSB0aGUgdGhyZWFkIHN0YXRlIGRhdGEgc3RydWN0dXJlLgogCi1UaGUgOmNmdW5jOmBQeUdJTFN0YXRlX0Vuc3VyZWAgYW5kIDpjZnVuYzpgUHlHSUxTdGF0ZV9SZWxlYXNlYCBmdW5jdGlvbnMgZG8KK1RoZSA6YzpmdW5jOmBQeUdJTFN0YXRlX0Vuc3VyZWAgYW5kIDpjOmZ1bmM6YFB5R0lMU3RhdGVfUmVsZWFzZWAgZnVuY3Rpb25zIGRvCiBhbGwgb2YgdGhlIGFib3ZlIGF1dG9tYXRpY2FsbHkuICBUaGUgdHlwaWNhbCBpZGlvbSBmb3IgY2FsbGluZyBpbnRvIFB5dGhvbgogZnJvbSBhIEMgdGhyZWFkIGlzOjoKIApAQCAtNDU5LDE0ICs0NjIsMTQgQEAKICAgIC8qIFJlbGVhc2UgdGhlIHRocmVhZC4gTm8gUHl0aG9uIEFQSSBhbGxvd2VkIGJleW9uZCB0aGlzIHBvaW50LiAqLwogICAgUHlHSUxTdGF0ZV9SZWxlYXNlKGdzdGF0ZSk7CiAKLU5vdGUgdGhhdCB0aGUgOmNmdW5jOmBQeUdJTFN0YXRlX1wqYCBmdW5jdGlvbnMgYXNzdW1lIHRoZXJlIGlzIG9ubHkgb25lIGdsb2JhbAotaW50ZXJwcmV0ZXIgKGNyZWF0ZWQgYXV0b21hdGljYWxseSBieSA6Y2Z1bmM6YFB5X0luaXRpYWxpemVgKS4gIFB5dGhvbgorTm90ZSB0aGF0IHRoZSA6YzpmdW5jOmBQeUdJTFN0YXRlX1wqYCBmdW5jdGlvbnMgYXNzdW1lIHRoZXJlIGlzIG9ubHkgb25lIGdsb2JhbAoraW50ZXJwcmV0ZXIgKGNyZWF0ZWQgYXV0b21hdGljYWxseSBieSA6YzpmdW5jOmBQeV9Jbml0aWFsaXplYCkuICBQeXRob24KIHN1cHBvcnRzIHRoZSBjcmVhdGlvbiBvZiBhZGRpdGlvbmFsIGludGVycHJldGVycyAodXNpbmcKLTpjZnVuYzpgUHlfTmV3SW50ZXJwcmV0ZXJgKSwgYnV0IG1peGluZyBtdWx0aXBsZSBpbnRlcnByZXRlcnMgYW5kIHRoZQotOmNmdW5jOmBQeUdJTFN0YXRlX1wqYCBBUEkgaXMgdW5zdXBwb3J0ZWQuCis6YzpmdW5jOmBQeV9OZXdJbnRlcnByZXRlcmApLCBidXQgbWl4aW5nIG11bHRpcGxlIGludGVycHJldGVycyBhbmQgdGhlCis6YzpmdW5jOmBQeUdJTFN0YXRlX1wqYCBBUEkgaXMgdW5zdXBwb3J0ZWQuCiAKIEFub3RoZXIgaW1wb3J0YW50IHRoaW5nIHRvIG5vdGUgYWJvdXQgdGhyZWFkcyBpcyB0aGVpciBiZWhhdmlvdXIgaW4gdGhlIGZhY2UKLW9mIHRoZSBDIDpjZnVuYzpgZm9ya2AgY2FsbC4gT24gbW9zdCBzeXN0ZW1zIHdpdGggOmNmdW5jOmBmb3JrYCwgYWZ0ZXIgYQorb2YgdGhlIEMgOmM6ZnVuYzpgZm9ya2AgY2FsbC4gT24gbW9zdCBzeXN0ZW1zIHdpdGggOmM6ZnVuYzpgZm9ya2AsIGFmdGVyIGEKIHByb2Nlc3MgZm9ya3Mgb25seSB0aGUgdGhyZWFkIHRoYXQgaXNzdWVkIHRoZSBmb3JrIHdpbGwgZXhpc3QuIFRoYXQgYWxzbwogbWVhbnMgYW55IGxvY2tzIGhlbGQgYnkgb3RoZXIgdGhyZWFkcyB3aWxsIG5ldmVyIGJlIHJlbGVhc2VkLiBQeXRob24gc29sdmVzCiB0aGlzIGZvciA6ZnVuYzpgb3MuZm9ya2AgYnkgYWNxdWlyaW5nIHRoZSBsb2NrcyBpdCB1c2VzIGludGVybmFsbHkgYmVmb3JlCkBAIC00NzQsMTIgKzQ3NywxMiBAQAogOnJlZjpgbG9jay1vYmplY3RzYCBpbiB0aGUgY2hpbGQuIFdoZW4gZXh0ZW5kaW5nIG9yIGVtYmVkZGluZyBQeXRob24sIHRoZXJlCiBpcyBubyB3YXkgdG8gaW5mb3JtIFB5dGhvbiBvZiBhZGRpdGlvbmFsIChub24tUHl0aG9uKSBsb2NrcyB0aGF0IG5lZWQgdG8gYmUKIGFjcXVpcmVkIGJlZm9yZSBvciByZXNldCBhZnRlciBhIGZvcmsuIE9TIGZhY2lsaXRpZXMgc3VjaCBhcwotOmNmdW5jOmBwdGhyZWFkX2F0Zm9ya2Agd291bGQgbmVlZCB0byBiZSB1c2VkIHRvIGFjY29tcGxpc2ggdGhlIHNhbWUgdGhpbmcuCi1BZGRpdGlvbmFsbHksIHdoZW4gZXh0ZW5kaW5nIG9yIGVtYmVkZGluZyBQeXRob24sIGNhbGxpbmcgOmNmdW5jOmBmb3JrYAorOmM6ZnVuYzpgcHRocmVhZF9hdGZvcmtgIHdvdWxkIG5lZWQgdG8gYmUgdXNlZCB0byBhY2NvbXBsaXNoIHRoZSBzYW1lIHRoaW5nLgorQWRkaXRpb25hbGx5LCB3aGVuIGV4dGVuZGluZyBvciBlbWJlZGRpbmcgUHl0aG9uLCBjYWxsaW5nIDpjOmZ1bmM6YGZvcmtgCiBkaXJlY3RseSByYXRoZXIgdGhhbiB0aHJvdWdoIDpmdW5jOmBvcy5mb3JrYCAoYW5kIHJldHVybmluZyB0byBvciBjYWxsaW5nCiBpbnRvIFB5dGhvbikgbWF5IHJlc3VsdCBpbiBhIGRlYWRsb2NrIGJ5IG9uZSBvZiBQeXRob24ncyBpbnRlcm5hbCBsb2NrcwogYmVpbmcgaGVsZCBieSBhIHRocmVhZCB0aGF0IGlzIGRlZnVuY3QgYWZ0ZXIgdGhlIGZvcmsuCi06Y2Z1bmM6YFB5T1NfQWZ0ZXJGb3JrYCB0cmllcyB0byByZXNldCB0aGUgbmVjZXNzYXJ5IGxvY2tzLCBidXQgaXMgbm90Cis6YzpmdW5jOmBQeU9TX0FmdGVyRm9ya2AgdHJpZXMgdG8gcmVzZXQgdGhlIG5lY2Vzc2FyeSBsb2NrcywgYnV0IGlzIG5vdAogYWx3YXlzIGFibGUgdG8uCiAKIApAQCAtNDg5LDcgKzQ5Miw3IEBACiBUaGVzZSBhcmUgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCB0eXBlcyBhbmQgZnVuY3Rpb25zIHdoZW4gd3JpdGluZyBDIGV4dGVuc2lvbgogY29kZSwgb3Igd2hlbiBlbWJlZGRpbmcgdGhlIFB5dGhvbiBpbnRlcnByZXRlcjoKIAotLi4gY3R5cGU6OiBQeUludGVycHJldGVyU3RhdGUKKy4uIGM6dHlwZTo6IFB5SW50ZXJwcmV0ZXJTdGF0ZQogCiAgICBUaGlzIGRhdGEgc3RydWN0dXJlIHJlcHJlc2VudHMgdGhlIHN0YXRlIHNoYXJlZCBieSBhIG51bWJlciBvZiBjb29wZXJhdGluZwogICAgdGhyZWFkcy4gIFRocmVhZHMgYmVsb25naW5nIHRvIHRoZSBzYW1lIGludGVycHJldGVyIHNoYXJlIHRoZWlyIG1vZHVsZQpAQCAtNTAyLDE0ICs1MDUsMTQgQEAKICAgIGludGVycHJldGVyIHRoZXkgYmVsb25nLgogCiAKLS4uIGN0eXBlOjogUHlUaHJlYWRTdGF0ZQorLi4gYzp0eXBlOjogUHlUaHJlYWRTdGF0ZQogCiAgICBUaGlzIGRhdGEgc3RydWN0dXJlIHJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIGEgc2luZ2xlIHRocmVhZC4gIFRoZSBvbmx5IHB1YmxpYwotICAgZGF0YSBtZW1iZXIgaXMgOmN0eXBlOmBQeUludGVycHJldGVyU3RhdGUgXCpgOmF0dHI6YGludGVycGAsIHdoaWNoIHBvaW50cyB0bworICAgZGF0YSBtZW1iZXIgaXMgOmM6dHlwZTpgUHlJbnRlcnByZXRlclN0YXRlIFwqYDphdHRyOmBpbnRlcnBgLCB3aGljaCBwb2ludHMgdG8KICAgIHRoaXMgdGhyZWFkJ3MgaW50ZXJwcmV0ZXIgc3RhdGUuCiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBQeUV2YWxfSW5pdFRocmVhZHMoKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlFdmFsX0luaXRUaHJlYWRzKCkKIAogICAgLi4gaW5kZXg6OgogICAgICAgc2luZ2xlOiBQeUV2YWxfUmVsZWFzZUxvY2soKQpAQCAtNTE5LDE4ICs1MjIsMTkgQEAKIAogICAgSW5pdGlhbGl6ZSBhbmQgYWNxdWlyZSB0aGUgZ2xvYmFsIGludGVycHJldGVyIGxvY2suICBJdCBzaG91bGQgYmUgY2FsbGVkIGluIHRoZQogICAgbWFpbiB0aHJlYWQgYmVmb3JlIGNyZWF0aW5nIGEgc2Vjb25kIHRocmVhZCBvciBlbmdhZ2luZyBpbiBhbnkgb3RoZXIgdGhyZWFkCi0gICBvcGVyYXRpb25zIHN1Y2ggYXMgOmNmdW5jOmBQeUV2YWxfUmVsZWFzZUxvY2tgIG9yCisgICBvcGVyYXRpb25zIHN1Y2ggYXMgOmM6ZnVuYzpgUHlFdmFsX1JlbGVhc2VMb2NrYCBvcgogICAgYGBQeUV2YWxfUmVsZWFzZVRocmVhZCh0c3RhdGUpYGAuIEl0IGlzIG5vdCBuZWVkZWQgYmVmb3JlIGNhbGxpbmcKLSAgIDpjZnVuYzpgUHlFdmFsX1NhdmVUaHJlYWRgIG9yIDpjZnVuYzpgUHlFdmFsX1Jlc3RvcmVUaHJlYWRgLgorICAgOmM6ZnVuYzpgUHlFdmFsX1NhdmVUaHJlYWRgIG9yIDpjOmZ1bmM6YFB5RXZhbF9SZXN0b3JlVGhyZWFkYC4KIAogICAgLi4gaW5kZXg6OiBzaW5nbGU6IFB5X0luaXRpYWxpemUoKQogCiAgICBUaGlzIGlzIGEgbm8tb3Agd2hlbiBjYWxsZWQgZm9yIGEgc2Vjb25kIHRpbWUuICBJdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbgotICAgYmVmb3JlIGNhbGxpbmcgOmNmdW5jOmBQeV9Jbml0aWFsaXplYC4KKyAgIGJlZm9yZSBjYWxsaW5nIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgLgogCiAgICAuLiBpbmRleDo6IG1vZHVsZTogdGhyZWFkCiAKICAgIC4uIG5vdGU6OgorCiAgICAgICBXaGVuIG9ubHkgdGhlIG1haW4gdGhyZWFkIGV4aXN0cywgbm8gR0lMIG9wZXJhdGlvbnMgYXJlIG5lZWRlZC4gVGhpcyBpcyBhCiAgICAgICBjb21tb24gc2l0dWF0aW9uIChtb3N0IFB5dGhvbiBwcm9ncmFtcyBkbyBub3QgdXNlIHRocmVhZHMpLCBhbmQgdGhlIGxvY2sKICAgICAgIG9wZXJhdGlvbnMgc2xvdyB0aGUgaW50ZXJwcmV0ZXIgZG93biBhIGJpdC4gVGhlcmVmb3JlLCB0aGUgbG9jayBpcyBub3QKQEAgLTUzOSw3ICs1NDMsNyBAQAogICAgICAgd2hlbiB0aGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBnbG9iYWwgaW50ZXJwcmV0ZXIgbG9jaywgaXQgYWxzbyBhY3F1aXJlcwogICAgICAgaXQuICBCZWZvcmUgdGhlIFB5dGhvbiA6bW9kOmBfdGhyZWFkYCBtb2R1bGUgY3JlYXRlcyBhIG5ldyB0aHJlYWQsIGtub3dpbmcKICAgICAgIHRoYXQgZWl0aGVyIGl0IGhhcyB0aGUgbG9jayBvciB0aGUgbG9jayBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldCwgaXQgY2FsbHMKLSAgICAgIDpjZnVuYzpgUHlFdmFsX0luaXRUaHJlYWRzYC4gIFdoZW4gdGhpcyBjYWxsIHJldHVybnMsIGl0IGlzIGd1YXJhbnRlZWQgdGhhdAorICAgICAgOmM6ZnVuYzpgUHlFdmFsX0luaXRUaHJlYWRzYC4gIFdoZW4gdGhpcyBjYWxsIHJldHVybnMsIGl0IGlzIGd1YXJhbnRlZWQgdGhhdAogICAgICAgdGhlIGxvY2sgaGFzIGJlZW4gY3JlYXRlZCBhbmQgdGhhdCB0aGUgY2FsbGluZyB0aHJlYWQgaGFzIGFjcXVpcmVkIGl0LgogCiAgICAgICBJdCBpcyAqKm5vdCoqIHNhZmUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gaXQgaXMgdW5rbm93biB3aGljaCB0aHJlYWQgKGlmCkBAIC01NDgsOSArNTUyLDkgQEAKICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IGF2YWlsYWJsZSB3aGVuIHRocmVhZCBzdXBwb3J0IGlzIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZS4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlFdmFsX1RocmVhZHNJbml0aWFsaXplZCgpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5RXZhbF9UaHJlYWRzSW5pdGlhbGl6ZWQoKQogCi0gICBSZXR1cm5zIGEgbm9uLXplcm8gdmFsdWUgaWYgOmNmdW5jOmBQeUV2YWxfSW5pdFRocmVhZHNgIGhhcyBiZWVuIGNhbGxlZC4gIFRoaXMKKyAgIFJldHVybnMgYSBub24temVybyB2YWx1ZSBpZiA6YzpmdW5jOmBQeUV2YWxfSW5pdFRocmVhZHNgIGhhcyBiZWVuIGNhbGxlZC4gIFRoaXMKICAgIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgd2l0aG91dCBob2xkaW5nIHRoZSBHSUwsIGFuZCB0aGVyZWZvcmUgY2FuIGJlIHVzZWQgdG8KICAgIGF2b2lkIGNhbGxzIHRvIHRoZSBsb2NraW5nIEFQSSB3aGVuIHJ1bm5pbmcgc2luZ2xlLXRocmVhZGVkLiAgVGhpcyBmdW5jdGlvbiBpcwogICAgbm90IGF2YWlsYWJsZSB3aGVuIHRocmVhZCBzdXBwb3J0IGlzIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZS4KQEAgLTU1OCw3ICs1NjIsNyBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi40CiAKIAotLi4gY2Z1bmN0aW9uOjogUHlUaHJlYWRTdGF0ZSogUHlFdmFsX1NhdmVUaHJlYWQoKQorLi4gYzpmdW5jdGlvbjo6IFB5VGhyZWFkU3RhdGUqIFB5RXZhbF9TYXZlVGhyZWFkKCkKIAogICAgUmVsZWFzZSB0aGUgZ2xvYmFsIGludGVycHJldGVyIGxvY2sgKGlmIGl0IGhhcyBiZWVuIGNyZWF0ZWQgYW5kIHRocmVhZAogICAgc3VwcG9ydCBpcyBlbmFibGVkKSBhbmQgcmVzZXQgdGhlIHRocmVhZCBzdGF0ZSB0byAqTlVMTCosIHJldHVybmluZyB0aGUKQEAgLTU2Nyw3ICs1NzEsNyBAQAogICAgd2hlbiB0aHJlYWQgc3VwcG9ydCBpcyBkaXNhYmxlZCBhdCBjb21waWxlIHRpbWUuKQogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgUHlFdmFsX1Jlc3RvcmVUaHJlYWQoUHlUaHJlYWRTdGF0ZSAqdHN0YXRlKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlFdmFsX1Jlc3RvcmVUaHJlYWQoUHlUaHJlYWRTdGF0ZSAqdHN0YXRlKQogCiAgICBBY3F1aXJlIHRoZSBnbG9iYWwgaW50ZXJwcmV0ZXIgbG9jayAoaWYgaXQgaGFzIGJlZW4gY3JlYXRlZCBhbmQgdGhyZWFkCiAgICBzdXBwb3J0IGlzIGVuYWJsZWQpIGFuZCBzZXQgdGhlIHRocmVhZCBzdGF0ZSB0byAqdHN0YXRlKiwgd2hpY2ggbXVzdCBub3QgYmUKQEAgLTU3NiwyMyArNTgwLDIzIEBACiAgICB3aGVuIHRocmVhZCBzdXBwb3J0IGlzIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZS4pCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlUaHJlYWRTdGF0ZSogUHlUaHJlYWRTdGF0ZV9HZXQoKQorLi4gYzpmdW5jdGlvbjo6IFB5VGhyZWFkU3RhdGUqIFB5VGhyZWFkU3RhdGVfR2V0KCkKIAogICAgUmV0dXJuIHRoZSBjdXJyZW50IHRocmVhZCBzdGF0ZS4gIFRoZSBnbG9iYWwgaW50ZXJwcmV0ZXIgbG9jayBtdXN0IGJlIGhlbGQuCiAgICBXaGVuIHRoZSBjdXJyZW50IHRocmVhZCBzdGF0ZSBpcyAqTlVMTCosIHRoaXMgaXNzdWVzIGEgZmF0YWwgZXJyb3IgKHNvIHRoYXQKICAgIHRoZSBjYWxsZXIgbmVlZG4ndCBjaGVjayBmb3IgKk5VTEwqKS4KIAogCi0uLiBjZnVuY3Rpb246OiBQeVRocmVhZFN0YXRlKiBQeVRocmVhZFN0YXRlX1N3YXAoUHlUaHJlYWRTdGF0ZSAqdHN0YXRlKQorLi4gYzpmdW5jdGlvbjo6IFB5VGhyZWFkU3RhdGUqIFB5VGhyZWFkU3RhdGVfU3dhcChQeVRocmVhZFN0YXRlICp0c3RhdGUpCiAKICAgIFN3YXAgdGhlIGN1cnJlbnQgdGhyZWFkIHN0YXRlIHdpdGggdGhlIHRocmVhZCBzdGF0ZSBnaXZlbiBieSB0aGUgYXJndW1lbnQKICAgICp0c3RhdGUqLCB3aGljaCBtYXkgYmUgKk5VTEwqLiAgVGhlIGdsb2JhbCBpbnRlcnByZXRlciBsb2NrIG11c3QgYmUgaGVsZAogICAgYW5kIGlzIG5vdCByZWxlYXNlZC4KIAogCi0uLiBjZnVuY3Rpb246OiB2b2lkIFB5RXZhbF9SZUluaXRUaHJlYWRzKCkKKy4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5RXZhbF9SZUluaXRUaHJlYWRzKCkKIAotICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSA6Y2Z1bmM6YFB5T1NfQWZ0ZXJGb3JrYCB0byBlbnN1cmUgdGhhdCBuZXdseQorICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSA6YzpmdW5jOmBQeU9TX0FmdGVyRm9ya2AgdG8gZW5zdXJlIHRoYXQgbmV3bHkKICAgIGNyZWF0ZWQgY2hpbGQgcHJvY2Vzc2VzIGRvbid0IGhvbGQgbG9ja3MgcmVmZXJyaW5nIHRvIHRocmVhZHMgd2hpY2gKICAgIGFyZSBub3QgcnVubmluZyBpbiB0aGUgY2hpbGQgcHJvY2Vzcy4KIApAQCAtNjAwLDI0ICs2MDQsMjQgQEAKIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHVzZSB0aHJlYWQtbG9jYWwgc3RvcmFnZSwgYW5kIGFyZSBub3QgY29tcGF0aWJsZQogd2l0aCBzdWItaW50ZXJwcmV0ZXJzOgogCi0uLiBjZnVuY3Rpb246OiBQeUdJTFN0YXRlX1NUQVRFIFB5R0lMU3RhdGVfRW5zdXJlKCkKKy4uIGM6ZnVuY3Rpb246OiBQeUdJTFN0YXRlX1NUQVRFIFB5R0lMU3RhdGVfRW5zdXJlKCkKIAogICAgRW5zdXJlIHRoYXQgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIHJlYWR5IHRvIGNhbGwgdGhlIFB5dGhvbiBDIEFQSSByZWdhcmRsZXNzCiAgICBvZiB0aGUgY3VycmVudCBzdGF0ZSBvZiBQeXRob24sIG9yIG9mIHRoZSBnbG9iYWwgaW50ZXJwcmV0ZXIgbG9jay4gVGhpcyBtYXkKICAgIGJlIGNhbGxlZCBhcyBtYW55IHRpbWVzIGFzIGRlc2lyZWQgYnkgYSB0aHJlYWQgYXMgbG9uZyBhcyBlYWNoIGNhbGwgaXMKLSAgIG1hdGNoZWQgd2l0aCBhIGNhbGwgdG8gOmNmdW5jOmBQeUdJTFN0YXRlX1JlbGVhc2VgLiBJbiBnZW5lcmFsLCBvdGhlcgotICAgdGhyZWFkLXJlbGF0ZWQgQVBJcyBtYXkgYmUgdXNlZCBiZXR3ZWVuIDpjZnVuYzpgUHlHSUxTdGF0ZV9FbnN1cmVgIGFuZAotICAgOmNmdW5jOmBQeUdJTFN0YXRlX1JlbGVhc2VgIGNhbGxzIGFzIGxvbmcgYXMgdGhlIHRocmVhZCBzdGF0ZSBpcyByZXN0b3JlZCB0bworICAgbWF0Y2hlZCB3aXRoIGEgY2FsbCB0byA6YzpmdW5jOmBQeUdJTFN0YXRlX1JlbGVhc2VgLiBJbiBnZW5lcmFsLCBvdGhlcgorICAgdGhyZWFkLXJlbGF0ZWQgQVBJcyBtYXkgYmUgdXNlZCBiZXR3ZWVuIDpjOmZ1bmM6YFB5R0lMU3RhdGVfRW5zdXJlYCBhbmQKKyAgIDpjOmZ1bmM6YFB5R0lMU3RhdGVfUmVsZWFzZWAgY2FsbHMgYXMgbG9uZyBhcyB0aGUgdGhyZWFkIHN0YXRlIGlzIHJlc3RvcmVkIHRvCiAgICBpdHMgcHJldmlvdXMgc3RhdGUgYmVmb3JlIHRoZSBSZWxlYXNlKCkuICBGb3IgZXhhbXBsZSwgbm9ybWFsIHVzYWdlIG9mIHRoZQotICAgOmNtYWNybzpgUHlfQkVHSU5fQUxMT1dfVEhSRUFEU2AgYW5kIDpjbWFjcm86YFB5X0VORF9BTExPV19USFJFQURTYCBtYWNyb3MgaXMKKyAgIDpjOm1hY3JvOmBQeV9CRUdJTl9BTExPV19USFJFQURTYCBhbmQgOmM6bWFjcm86YFB5X0VORF9BTExPV19USFJFQURTYCBtYWNyb3MgaXMKICAgIGFjY2VwdGFibGUuCiAKICAgIFRoZSByZXR1cm4gdmFsdWUgaXMgYW4gb3BhcXVlICJoYW5kbGUiIHRvIHRoZSB0aHJlYWQgc3RhdGUgd2hlbgotICAgOmNmdW5jOmBQeUdJTFN0YXRlX0Vuc3VyZWAgd2FzIGNhbGxlZCwgYW5kIG11c3QgYmUgcGFzc2VkIHRvCi0gICA6Y2Z1bmM6YFB5R0lMU3RhdGVfUmVsZWFzZWAgdG8gZW5zdXJlIFB5dGhvbiBpcyBsZWZ0IGluIHRoZSBzYW1lIHN0YXRlLiBFdmVuCisgICA6YzpmdW5jOmBQeUdJTFN0YXRlX0Vuc3VyZWAgd2FzIGNhbGxlZCwgYW5kIG11c3QgYmUgcGFzc2VkIHRvCisgICA6YzpmdW5jOmBQeUdJTFN0YXRlX1JlbGVhc2VgIHRvIGVuc3VyZSBQeXRob24gaXMgbGVmdCBpbiB0aGUgc2FtZSBzdGF0ZS4gRXZlbgogICAgdGhvdWdoIHJlY3Vyc2l2ZSBjYWxscyBhcmUgYWxsb3dlZCwgdGhlc2UgaGFuZGxlcyAqY2Fubm90KiBiZSBzaGFyZWQgLSBlYWNoCi0gICB1bmlxdWUgY2FsbCB0byA6Y2Z1bmM6YFB5R0lMU3RhdGVfRW5zdXJlYCBtdXN0IHNhdmUgdGhlIGhhbmRsZSBmb3IgaXRzIGNhbGwKLSAgIHRvIDpjZnVuYzpgUHlHSUxTdGF0ZV9SZWxlYXNlYC4KKyAgIHVuaXF1ZSBjYWxsIHRvIDpjOmZ1bmM6YFB5R0lMU3RhdGVfRW5zdXJlYCBtdXN0IHNhdmUgdGhlIGhhbmRsZSBmb3IgaXRzIGNhbGwKKyAgIHRvIDpjOmZ1bmM6YFB5R0lMU3RhdGVfUmVsZWFzZWAuCiAKICAgIFdoZW4gdGhlIGZ1bmN0aW9uIHJldHVybnMsIHRoZSBjdXJyZW50IHRocmVhZCB3aWxsIGhvbGQgdGhlIEdJTCBhbmQgYmUgYWJsZQogICAgdG8gY2FsbCBhcmJpdHJhcnkgUHl0aG9uIGNvZGUuICBGYWlsdXJlIGlzIGEgZmF0YWwgZXJyb3IuCkBAIC02MjUsMjAgKzYyOSwyMCBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4zCiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBQeUdJTFN0YXRlX1JlbGVhc2UoUHlHSUxTdGF0ZV9TVEFURSkKKy4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5R0lMU3RhdGVfUmVsZWFzZShQeUdJTFN0YXRlX1NUQVRFKQogCiAgICBSZWxlYXNlIGFueSByZXNvdXJjZXMgcHJldmlvdXNseSBhY3F1aXJlZC4gIEFmdGVyIHRoaXMgY2FsbCwgUHl0aG9uJ3Mgc3RhdGUgd2lsbAotICAgYmUgdGhlIHNhbWUgYXMgaXQgd2FzIHByaW9yIHRvIHRoZSBjb3JyZXNwb25kaW5nIDpjZnVuYzpgUHlHSUxTdGF0ZV9FbnN1cmVgIGNhbGwKKyAgIGJlIHRoZSBzYW1lIGFzIGl0IHdhcyBwcmlvciB0byB0aGUgY29ycmVzcG9uZGluZyA6YzpmdW5jOmBQeUdJTFN0YXRlX0Vuc3VyZWAgY2FsbAogICAgKGJ1dCBnZW5lcmFsbHkgdGhpcyBzdGF0ZSB3aWxsIGJlIHVua25vd24gdG8gdGhlIGNhbGxlciwgaGVuY2UgdGhlIHVzZSBvZiB0aGUKICAgIEdJTFN0YXRlIEFQSSkuCiAKLSAgIEV2ZXJ5IGNhbGwgdG8gOmNmdW5jOmBQeUdJTFN0YXRlX0Vuc3VyZWAgbXVzdCBiZSBtYXRjaGVkIGJ5IGEgY2FsbCB0bwotICAgOmNmdW5jOmBQeUdJTFN0YXRlX1JlbGVhc2VgIG9uIHRoZSBzYW1lIHRocmVhZC4KKyAgIEV2ZXJ5IGNhbGwgdG8gOmM6ZnVuYzpgUHlHSUxTdGF0ZV9FbnN1cmVgIG11c3QgYmUgbWF0Y2hlZCBieSBhIGNhbGwgdG8KKyAgIDpjOmZ1bmM6YFB5R0lMU3RhdGVfUmVsZWFzZWAgb24gdGhlIHNhbWUgdGhyZWFkLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjMKIAogCi0uLiBjZnVuY3Rpb246OiBQeVRocmVhZFN0YXRlIFB5R0lMU3RhdGVfR2V0VGhpc1RocmVhZFN0YXRlKCkKKy4uIGM6ZnVuY3Rpb246OiBQeVRocmVhZFN0YXRlIFB5R0lMU3RhdGVfR2V0VGhpc1RocmVhZFN0YXRlKCkKIAogICAgR2V0IHRoZSBjdXJyZW50IHRocmVhZCBzdGF0ZSBmb3IgdGhpcyB0aHJlYWQuICBNYXkgcmV0dXJuIGBgTlVMTGBgIGlmIG5vCiAgICBHSUxTdGF0ZSBBUEkgaGFzIGJlZW4gdXNlZCBvbiB0aGUgY3VycmVudCB0aHJlYWQuICBOb3RlIHRoYXQgdGhlIG1haW4gdGhyZWFkCkBAIC02NTIsMzMgKzY1NiwzMyBAQAogZXhhbXBsZSB1c2FnZSBpbiB0aGUgUHl0aG9uIHNvdXJjZSBkaXN0cmlidXRpb24uCiAKIAotLi4gY21hY3JvOjogUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworLi4gYzptYWNybzo6IFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKIAogICAgVGhpcyBtYWNybyBleHBhbmRzIHRvIGBgeyBQeVRocmVhZFN0YXRlICpfc2F2ZTsgX3NhdmUgPSBQeUV2YWxfU2F2ZVRocmVhZCgpO2BgLgogICAgTm90ZSB0aGF0IGl0IGNvbnRhaW5zIGFuIG9wZW5pbmcgYnJhY2U7IGl0IG11c3QgYmUgbWF0Y2hlZCB3aXRoIGEgZm9sbG93aW5nCi0gICA6Y21hY3JvOmBQeV9FTkRfQUxMT1dfVEhSRUFEU2AgbWFjcm8uICBTZWUgYWJvdmUgZm9yIGZ1cnRoZXIgZGlzY3Vzc2lvbiBvZiB0aGlzCisgICA6YzptYWNybzpgUHlfRU5EX0FMTE9XX1RIUkVBRFNgIG1hY3JvLiAgU2VlIGFib3ZlIGZvciBmdXJ0aGVyIGRpc2N1c3Npb24gb2YgdGhpcwogICAgbWFjcm8uICBJdCBpcyBhIG5vLW9wIHdoZW4gdGhyZWFkIHN1cHBvcnQgaXMgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lLgogCiAKLS4uIGNtYWNybzo6IFB5X0VORF9BTExPV19USFJFQURTCisuLiBjOm1hY3JvOjogUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAogICAgVGhpcyBtYWNybyBleHBhbmRzIHRvIGBgUHlFdmFsX1Jlc3RvcmVUaHJlYWQoX3NhdmUpOyB9YGAuIE5vdGUgdGhhdCBpdCBjb250YWlucwogICAgYSBjbG9zaW5nIGJyYWNlOyBpdCBtdXN0IGJlIG1hdGNoZWQgd2l0aCBhbiBlYXJsaWVyCi0gICA6Y21hY3JvOmBQeV9CRUdJTl9BTExPV19USFJFQURTYCBtYWNyby4gIFNlZSBhYm92ZSBmb3IgZnVydGhlciBkaXNjdXNzaW9uIG9mCisgICA6YzptYWNybzpgUHlfQkVHSU5fQUxMT1dfVEhSRUFEU2AgbWFjcm8uICBTZWUgYWJvdmUgZm9yIGZ1cnRoZXIgZGlzY3Vzc2lvbiBvZgogICAgdGhpcyBtYWNyby4gIEl0IGlzIGEgbm8tb3Agd2hlbiB0aHJlYWQgc3VwcG9ydCBpcyBkaXNhYmxlZCBhdCBjb21waWxlIHRpbWUuCiAKIAotLi4gY21hY3JvOjogUHlfQkxPQ0tfVEhSRUFEUworLi4gYzptYWNybzo6IFB5X0JMT0NLX1RIUkVBRFMKIAogICAgVGhpcyBtYWNybyBleHBhbmRzIHRvIGBgUHlFdmFsX1Jlc3RvcmVUaHJlYWQoX3NhdmUpO2BgOiBpdCBpcyBlcXVpdmFsZW50IHRvCi0gICA6Y21hY3JvOmBQeV9FTkRfQUxMT1dfVEhSRUFEU2Agd2l0aG91dCB0aGUgY2xvc2luZyBicmFjZS4gIEl0IGlzIGEgbm8tb3Agd2hlbgorICAgOmM6bWFjcm86YFB5X0VORF9BTExPV19USFJFQURTYCB3aXRob3V0IHRoZSBjbG9zaW5nIGJyYWNlLiAgSXQgaXMgYSBuby1vcCB3aGVuCiAgICB0aHJlYWQgc3VwcG9ydCBpcyBkaXNhYmxlZCBhdCBjb21waWxlIHRpbWUuCiAKIAotLi4gY21hY3JvOjogUHlfVU5CTE9DS19USFJFQURTCisuLiBjOm1hY3JvOjogUHlfVU5CTE9DS19USFJFQURTCiAKICAgIFRoaXMgbWFjcm8gZXhwYW5kcyB0byBgYF9zYXZlID0gUHlFdmFsX1NhdmVUaHJlYWQoKTtgYDogaXQgaXMgZXF1aXZhbGVudCB0bwotICAgOmNtYWNybzpgUHlfQkVHSU5fQUxMT1dfVEhSRUFEU2Agd2l0aG91dCB0aGUgb3BlbmluZyBicmFjZSBhbmQgdmFyaWFibGUKKyAgIDpjOm1hY3JvOmBQeV9CRUdJTl9BTExPV19USFJFQURTYCB3aXRob3V0IHRoZSBvcGVuaW5nIGJyYWNlIGFuZCB2YXJpYWJsZQogICAgZGVjbGFyYXRpb24uICBJdCBpcyBhIG5vLW9wIHdoZW4gdGhyZWFkIHN1cHBvcnQgaXMgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lLgogCiAKQEAgLTY5MCw0NyArNjk0LDQ3IEBACiBiZWVuIGNyZWF0ZWQuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlJbnRlcnByZXRlclN0YXRlKiBQeUludGVycHJldGVyU3RhdGVfTmV3KCkKKy4uIGM6ZnVuY3Rpb246OiBQeUludGVycHJldGVyU3RhdGUqIFB5SW50ZXJwcmV0ZXJTdGF0ZV9OZXcoKQogCiAgICBDcmVhdGUgYSBuZXcgaW50ZXJwcmV0ZXIgc3RhdGUgb2JqZWN0LiAgVGhlIGdsb2JhbCBpbnRlcnByZXRlciBsb2NrIG5lZWQgbm90CiAgICBiZSBoZWxkLCBidXQgbWF5IGJlIGhlbGQgaWYgaXQgaXMgbmVjZXNzYXJ5IHRvIHNlcmlhbGl6ZSBjYWxscyB0byB0aGlzCiAgICBmdW5jdGlvbi4KIAogCi0uLiBjZnVuY3Rpb246OiB2b2lkIFB5SW50ZXJwcmV0ZXJTdGF0ZV9DbGVhcihQeUludGVycHJldGVyU3RhdGUgKmludGVycCkKKy4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5SW50ZXJwcmV0ZXJTdGF0ZV9DbGVhcihQeUludGVycHJldGVyU3RhdGUgKmludGVycCkKIAogICAgUmVzZXQgYWxsIGluZm9ybWF0aW9uIGluIGFuIGludGVycHJldGVyIHN0YXRlIG9iamVjdC4gIFRoZSBnbG9iYWwgaW50ZXJwcmV0ZXIKICAgIGxvY2sgbXVzdCBiZSBoZWxkLgogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgUHlJbnRlcnByZXRlclN0YXRlX0RlbGV0ZShQeUludGVycHJldGVyU3RhdGUgKmludGVycCkKKy4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5SW50ZXJwcmV0ZXJTdGF0ZV9EZWxldGUoUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnApCiAKICAgIERlc3Ryb3kgYW4gaW50ZXJwcmV0ZXIgc3RhdGUgb2JqZWN0LiAgVGhlIGdsb2JhbCBpbnRlcnByZXRlciBsb2NrIG5lZWQgbm90IGJlCiAgICBoZWxkLiAgVGhlIGludGVycHJldGVyIHN0YXRlIG11c3QgaGF2ZSBiZWVuIHJlc2V0IHdpdGggYSBwcmV2aW91cyBjYWxsIHRvCi0gICA6Y2Z1bmM6YFB5SW50ZXJwcmV0ZXJTdGF0ZV9DbGVhcmAuCisgICA6YzpmdW5jOmBQeUludGVycHJldGVyU3RhdGVfQ2xlYXJgLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5VGhyZWFkU3RhdGUqIFB5VGhyZWFkU3RhdGVfTmV3KFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwKQorLi4gYzpmdW5jdGlvbjo6IFB5VGhyZWFkU3RhdGUqIFB5VGhyZWFkU3RhdGVfTmV3KFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwKQogCiAgICBDcmVhdGUgYSBuZXcgdGhyZWFkIHN0YXRlIG9iamVjdCBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIGludGVycHJldGVyIG9iamVjdC4KICAgIFRoZSBnbG9iYWwgaW50ZXJwcmV0ZXIgbG9jayBuZWVkIG5vdCBiZSBoZWxkLCBidXQgbWF5IGJlIGhlbGQgaWYgaXQgaXMKICAgIG5lY2Vzc2FyeSB0byBzZXJpYWxpemUgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbi4KIAogCi0uLiBjZnVuY3Rpb246OiB2b2lkIFB5VGhyZWFkU3RhdGVfQ2xlYXIoUHlUaHJlYWRTdGF0ZSAqdHN0YXRlKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlUaHJlYWRTdGF0ZV9DbGVhcihQeVRocmVhZFN0YXRlICp0c3RhdGUpCiAKICAgIFJlc2V0IGFsbCBpbmZvcm1hdGlvbiBpbiBhIHRocmVhZCBzdGF0ZSBvYmplY3QuICBUaGUgZ2xvYmFsIGludGVycHJldGVyIGxvY2sKICAgIG11c3QgYmUgaGVsZC4KIAogCi0uLiBjZnVuY3Rpb246OiB2b2lkIFB5VGhyZWFkU3RhdGVfRGVsZXRlKFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSkKKy4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5VGhyZWFkU3RhdGVfRGVsZXRlKFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSkKIAogICAgRGVzdHJveSBhIHRocmVhZCBzdGF0ZSBvYmplY3QuICBUaGUgZ2xvYmFsIGludGVycHJldGVyIGxvY2sgbmVlZCBub3QgYmUgaGVsZC4KICAgIFRoZSB0aHJlYWQgc3RhdGUgbXVzdCBoYXZlIGJlZW4gcmVzZXQgd2l0aCBhIHByZXZpb3VzIGNhbGwgdG8KLSAgIDpjZnVuYzpgUHlUaHJlYWRTdGF0ZV9DbGVhcmAuCisgICA6YzpmdW5jOmBQeVRocmVhZFN0YXRlX0NsZWFyYC4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlUaHJlYWRTdGF0ZV9HZXREaWN0KCkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlUaHJlYWRTdGF0ZV9HZXREaWN0KCkKIAogICAgUmV0dXJuIGEgZGljdGlvbmFyeSBpbiB3aGljaCBleHRlbnNpb25zIGNhbiBzdG9yZSB0aHJlYWQtc3BlY2lmaWMgc3RhdGUKICAgIGluZm9ybWF0aW9uLiAgRWFjaCBleHRlbnNpb24gc2hvdWxkIHVzZSBhIHVuaXF1ZSBrZXkgdG8gdXNlIHRvIHN0b3JlIHN0YXRlIGluCkBAIC03NDMsNyArNzQ3LDcgQEAKICAgICAgIG1lYW50IHRoYXQgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5VGhyZWFkU3RhdGVfU2V0QXN5bmNFeGMobG9uZyBpZCwgUHlPYmplY3QgKmV4YykKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlUaHJlYWRTdGF0ZV9TZXRBc3luY0V4Yyhsb25nIGlkLCBQeU9iamVjdCAqZXhjKQogCiAgICBBc3luY2hyb25vdXNseSByYWlzZSBhbiBleGNlcHRpb24gaW4gYSB0aHJlYWQuIFRoZSAqaWQqIGFyZ3VtZW50IGlzIHRoZSB0aHJlYWQKICAgIGlkIG9mIHRoZSB0YXJnZXQgdGhyZWFkOyAqZXhjKiBpcyB0aGUgZXhjZXB0aW9uIG9iamVjdCB0byBiZSByYWlzZWQuIFRoaXMKQEAgLTc1NiwxOCArNzYwLDE4IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjMKIAogCi0uLiBjZnVuY3Rpb246OiB2b2lkIFB5RXZhbF9BY3F1aXJlVGhyZWFkKFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSkKKy4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5RXZhbF9BY3F1aXJlVGhyZWFkKFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSkKIAogICAgQWNxdWlyZSB0aGUgZ2xvYmFsIGludGVycHJldGVyIGxvY2sgYW5kIHNldCB0aGUgY3VycmVudCB0aHJlYWQgc3RhdGUgdG8KICAgICp0c3RhdGUqLCB3aGljaCBzaG91bGQgbm90IGJlICpOVUxMKi4gIFRoZSBsb2NrIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgZWFybGllci4KICAgIElmIHRoaXMgdGhyZWFkIGFscmVhZHkgaGFzIHRoZSBsb2NrLCBkZWFkbG9jayBlbnN1ZXMuCiAKLSAgIDpjZnVuYzpgUHlFdmFsX1Jlc3RvcmVUaHJlYWRgIGlzIGEgaGlnaGVyLWxldmVsIGZ1bmN0aW9uIHdoaWNoIGlzIGFsd2F5cworICAgOmM6ZnVuYzpgUHlFdmFsX1Jlc3RvcmVUaHJlYWRgIGlzIGEgaGlnaGVyLWxldmVsIGZ1bmN0aW9uIHdoaWNoIGlzIGFsd2F5cwogICAgYXZhaWxhYmxlIChldmVuIHdoZW4gdGhyZWFkIHN1cHBvcnQgaXNuJ3QgZW5hYmxlZCBvciB3aGVuIHRocmVhZHMgaGF2ZQogICAgbm90IGJlZW4gaW5pdGlhbGl6ZWQpLgogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgUHlFdmFsX1JlbGVhc2VUaHJlYWQoUHlUaHJlYWRTdGF0ZSAqdHN0YXRlKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlFdmFsX1JlbGVhc2VUaHJlYWQoUHlUaHJlYWRTdGF0ZSAqdHN0YXRlKQogCiAgICBSZXNldCB0aGUgY3VycmVudCB0aHJlYWQgc3RhdGUgdG8gKk5VTEwqIGFuZCByZWxlYXNlIHRoZSBnbG9iYWwgaW50ZXJwcmV0ZXIKICAgIGxvY2suICBUaGUgbG9jayBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIGVhcmxpZXIgYW5kIG11c3QgYmUgaGVsZCBieSB0aGUgY3VycmVudApAQCAtNzc1LDI5ICs3NzksMjkgQEAKICAgIHRoYXQgaXQgcmVwcmVzZW50cyB0aGUgY3VycmVudCB0aHJlYWQgc3RhdGUgLS0tIGlmIGl0IGlzbid0LCBhIGZhdGFsIGVycm9yIGlzCiAgICByZXBvcnRlZC4KIAotICAgOmNmdW5jOmBQeUV2YWxfU2F2ZVRocmVhZGAgaXMgYSBoaWdoZXItbGV2ZWwgZnVuY3Rpb24gd2hpY2ggaXMgYWx3YXlzCisgICA6YzpmdW5jOmBQeUV2YWxfU2F2ZVRocmVhZGAgaXMgYSBoaWdoZXItbGV2ZWwgZnVuY3Rpb24gd2hpY2ggaXMgYWx3YXlzCiAgICBhdmFpbGFibGUgKGV2ZW4gd2hlbiB0aHJlYWQgc3VwcG9ydCBpc24ndCBlbmFibGVkIG9yIHdoZW4gdGhyZWFkcyBoYXZlCiAgICBub3QgYmVlbiBpbml0aWFsaXplZCkuCiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBQeUV2YWxfQWNxdWlyZUxvY2soKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlFdmFsX0FjcXVpcmVMb2NrKCkKIAogICAgQWNxdWlyZSB0aGUgZ2xvYmFsIGludGVycHJldGVyIGxvY2suICBUaGUgbG9jayBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIGVhcmxpZXIuCiAgICBJZiB0aGlzIHRocmVhZCBhbHJlYWR5IGhhcyB0aGUgbG9jaywgYSBkZWFkbG9jayBlbnN1ZXMuCiAKICAgIC4uIHdhcm5pbmc6OgogICAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGN1cnJlbnQgdGhyZWFkIHN0YXRlLiAgUGxlYXNlIHVzZQotICAgICAgOmNmdW5jOmBQeUV2YWxfUmVzdG9yZVRocmVhZGAgb3IgOmNmdW5jOmBQeUV2YWxfQWNxdWlyZVRocmVhZGAKKyAgICAgIDpjOmZ1bmM6YFB5RXZhbF9SZXN0b3JlVGhyZWFkYCBvciA6YzpmdW5jOmBQeUV2YWxfQWNxdWlyZVRocmVhZGAKICAgICAgIGluc3RlYWQuCiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBQeUV2YWxfUmVsZWFzZUxvY2soKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlFdmFsX1JlbGVhc2VMb2NrKCkKIAogICAgUmVsZWFzZSB0aGUgZ2xvYmFsIGludGVycHJldGVyIGxvY2suICBUaGUgbG9jayBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIGVhcmxpZXIuCiAKICAgIC4uIHdhcm5pbmc6OgogICAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGN1cnJlbnQgdGhyZWFkIHN0YXRlLiAgUGxlYXNlIHVzZQotICAgICAgOmNmdW5jOmBQeUV2YWxfU2F2ZVRocmVhZGAgb3IgOmNmdW5jOmBQeUV2YWxfUmVsZWFzZVRocmVhZGAKKyAgICAgIDpjOmZ1bmM6YFB5RXZhbF9TYXZlVGhyZWFkYCBvciA6YzpmdW5jOmBQeUV2YWxfUmVsZWFzZVRocmVhZGAKICAgICAgIGluc3RlYWQuCiAKIApAQCAtODA4LDExICs4MTIsMTEgQEAKIGFyZSBjYXNlcyB3aGVyZSB5b3UgbmVlZCB0byBjcmVhdGUgc2V2ZXJhbCBpbmRlcGVuZGVudCBpbnRlcnByZXRlcnMgaW4gdGhlCiBzYW1lIHByb2Nlc3MgYW5kIHBlcmhhcHMgZXZlbiBpbiB0aGUgc2FtZSB0aHJlYWQuICBTdWItaW50ZXJwcmV0ZXJzIGFsbG93CiB5b3UgdG8gZG8gdGhhdC4gIFlvdSBjYW4gc3dpdGNoIGJldHdlZW4gc3ViLWludGVycHJldGVycyB1c2luZyB0aGUKLTpjZnVuYzpgUHlUaHJlYWRTdGF0ZV9Td2FwYCBmdW5jdGlvbi4gIFlvdSBjYW4gY3JlYXRlIGFuZCBkZXN0cm95IHRoZW0KKzpjOmZ1bmM6YFB5VGhyZWFkU3RhdGVfU3dhcGAgZnVuY3Rpb24uICBZb3UgY2FuIGNyZWF0ZSBhbmQgZGVzdHJveSB0aGVtCiB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKIAogCi0uLiBjZnVuY3Rpb246OiBQeVRocmVhZFN0YXRlKiBQeV9OZXdJbnRlcnByZXRlcigpCisuLiBjOmZ1bmN0aW9uOjogUHlUaHJlYWRTdGF0ZSogUHlfTmV3SW50ZXJwcmV0ZXIoKQogCiAgICAuLiBpbmRleDo6CiAgICAgICBtb2R1bGU6IGJ1aWx0aW5zCkBAIC04NTQsMTMgKzg1OCwxMyBAQAogICAgYW5kIGZpbGxlZCB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGlzIGNvcHk7IHRoZSBleHRlbnNpb24ncyBgYGluaXRgYCBmdW5jdGlvbiBpcwogICAgbm90IGNhbGxlZC4gIE5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudCBmcm9tIHdoYXQgaGFwcGVucyB3aGVuIGFuIGV4dGVuc2lvbiBpcwogICAgaW1wb3J0ZWQgYWZ0ZXIgdGhlIGludGVycHJldGVyIGhhcyBiZWVuIGNvbXBsZXRlbHkgcmUtaW5pdGlhbGl6ZWQgYnkgY2FsbGluZwotICAgOmNmdW5jOmBQeV9GaW5hbGl6ZWAgYW5kIDpjZnVuYzpgUHlfSW5pdGlhbGl6ZWA7IGluIHRoYXQgY2FzZSwgdGhlIGV4dGVuc2lvbidzCisgICA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAgYW5kIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgOyBpbiB0aGF0IGNhc2UsIHRoZSBleHRlbnNpb24ncwogICAgYGBpbml0bW9kdWxlYGAgZnVuY3Rpb24gKmlzKiBjYWxsZWQgYWdhaW4uCiAKICAgIC4uIGluZGV4Ojogc2luZ2xlOiBjbG9zZSgpIChpbiBtb2R1bGUgb3MpCiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBQeV9FbmRJbnRlcnByZXRlcihQeVRocmVhZFN0YXRlICp0c3RhdGUpCisuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeV9FbmRJbnRlcnByZXRlcihQeVRocmVhZFN0YXRlICp0c3RhdGUpCiAKICAgIC4uIGluZGV4Ojogc2luZ2xlOiBQeV9GaW5hbGl6ZSgpCiAKQEAgLTg2OSw3ICs4NzMsNyBAQAogICAgc3RhdGVzIGJlbG93LiAgV2hlbiB0aGUgY2FsbCByZXR1cm5zLCB0aGUgY3VycmVudCB0aHJlYWQgc3RhdGUgaXMgKk5VTEwqLiAgQWxsCiAgICB0aHJlYWQgc3RhdGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGludGVycHJldGVyIGFyZSBkZXN0cm95ZWQuICAoVGhlIGdsb2JhbAogICAgaW50ZXJwcmV0ZXIgbG9jayBtdXN0IGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBhbmQgaXMgc3RpbGwgaGVsZAotICAgd2hlbiBpdCByZXR1cm5zLikgIDpjZnVuYzpgUHlfRmluYWxpemVgIHdpbGwgZGVzdHJveSBhbGwgc3ViLWludGVycHJldGVycyB0aGF0CisgICB3aGVuIGl0IHJldHVybnMuKSAgOmM6ZnVuYzpgUHlfRmluYWxpemVgIHdpbGwgZGVzdHJveSBhbGwgc3ViLWludGVycHJldGVycyB0aGF0CiAgICBoYXZlbid0IGJlZW4gZXhwbGljaXRseSBkZXN0cm95ZWQgYXQgdGhhdCBwb2ludC4KIAogCkBAIC04OTAsMTEgKzg5NCwxMSBAQAogYnkgc3VjaCBvYmplY3RzIG1heSBhZmZlY3QgdGhlIHdyb25nIChzdWItKWludGVycHJldGVyJ3MgZGljdGlvbmFyeSBvZiBsb2FkZWQKIG1vZHVsZXMuCiAKLUFsc28gbm90ZSB0aGF0IGNvbWJpbmluZyB0aGlzIGZ1bmN0aW9uYWxpdHkgd2l0aCA6Y2Z1bmM6YFB5R0lMU3RhdGVfXCpgIEFQSXMKK0Fsc28gbm90ZSB0aGF0IGNvbWJpbmluZyB0aGlzIGZ1bmN0aW9uYWxpdHkgd2l0aCA6YzpmdW5jOmBQeUdJTFN0YXRlX1wqYCBBUElzCiBpcyBkZWxpY2F0ZSwgYmVjYXVzZSB0aGVzZSBBUElzIGFzc3VtZSBhIGJpamVjdGlvbiBiZXR3ZWVuIFB5dGhvbiB0aHJlYWQgc3RhdGVzCiBhbmQgT1MtbGV2ZWwgdGhyZWFkcywgYW4gYXNzdW1wdGlvbiBicm9rZW4gYnkgdGhlIHByZXNlbmNlIG9mIHN1Yi1pbnRlcnByZXRlcnMuCiBJdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgZG9uJ3Qgc3dpdGNoIHN1Yi1pbnRlcnByZXRlcnMgYmV0d2VlbiBhIHBhaXIKLW9mIG1hdGNoaW5nIDpjZnVuYzpgUHlHSUxTdGF0ZV9FbnN1cmVgIGFuZCA6Y2Z1bmM6YFB5R0lMU3RhdGVfUmVsZWFzZWAgY2FsbHMuCitvZiBtYXRjaGluZyA6YzpmdW5jOmBQeUdJTFN0YXRlX0Vuc3VyZWAgYW5kIDpjOmZ1bmM6YFB5R0lMU3RhdGVfUmVsZWFzZWAgY2FsbHMuCiBGdXJ0aGVybW9yZSwgZXh0ZW5zaW9ucyAoc3VjaCBhcyA6bW9kOmBjdHlwZXNgKSB1c2luZyB0aGVzZSBBUElzIHRvIGFsbG93IGNhbGxpbmcKIG9mIFB5dGhvbiBjb2RlIGZyb20gbm9uLVB5dGhvbiBjcmVhdGVkIHRocmVhZHMgd2lsbCBwcm9iYWJseSBiZSBicm9rZW4gd2hlbiB1c2luZwogc3ViLWludGVycHJldGVycy4KQEAgLTkwNSw0MyArOTA5LDQ1IEBACiAKIEEgbWVjaGFuaXNtIGlzIHByb3ZpZGVkIHRvIG1ha2UgYXN5bmNocm9ub3VzIG5vdGlmaWNhdGlvbnMgdG8gdGhlIG1haW4KIGludGVycHJldGVyIHRocmVhZC4gIFRoZXNlIG5vdGlmaWNhdGlvbnMgdGFrZSB0aGUgZm9ybSBvZiBhIGZ1bmN0aW9uCi1wb2ludGVyIGFuZCBhIHZvaWQgYXJndW1lbnQuCitwb2ludGVyIGFuZCBhIHZvaWQgcG9pbnRlciBhcmd1bWVudC4KIAotLi4gaW5kZXg6OiBzaW5nbGU6IHNldGNoZWNraW50ZXJ2YWwoKSAoaW4gbW9kdWxlIHN5cykKIAotRXZlcnkgY2hlY2sgaW50ZXJ2YWwsIHdoZW4gdGhlIGdsb2JhbCBpbnRlcnByZXRlciBsb2NrIGlzIHJlbGVhc2VkIGFuZAotcmVhY3F1aXJlZCwgUHl0aG9uIHdpbGwgYWxzbyBjYWxsIGFueSBzdWNoIHByb3ZpZGVkIGZ1bmN0aW9ucy4gIFRoaXMgY2FuIGJlIHVzZWQKLWZvciBleGFtcGxlIGJ5IGFzeW5jaHJvbm91cyBJTyBoYW5kbGVycy4gIFRoZSBub3RpZmljYXRpb24gY2FuIGJlIHNjaGVkdWxlZCBmcm9tCi1hIHdvcmtlciB0aHJlYWQgYW5kIHRoZSBhY3R1YWwgY2FsbCB0aGFuIG1hZGUgYXQgdGhlIGVhcmxpZXN0IGNvbnZlbmllbmNlIGJ5IHRoZQotbWFpbiB0aHJlYWQgd2hlcmUgaXQgaGFzIHBvc3Nlc3Npb24gb2YgdGhlIGdsb2JhbCBpbnRlcnByZXRlciBsb2NrIGFuZCBjYW4KLXBlcmZvcm0gYW55IFB5dGhvbiBBUEkgY2FsbHMuCi0KLS4uIGNmdW5jdGlvbjo6IGludCBQeV9BZGRQZW5kaW5nQ2FsbChpbnQgKCpmdW5jKSh2b2lkICopLCB2b2lkICphcmcpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5X0FkZFBlbmRpbmdDYWxsKGludCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmFyZykKIAogICAgLi4gaW5kZXg6OiBzaW5nbGU6IFB5X0FkZFBlbmRpbmdDYWxsKCkKIAotICAgUG9zdCBhIG5vdGlmaWNhdGlvbiB0byB0aGUgUHl0aG9uIG1haW4gdGhyZWFkLiAgSWYgc3VjY2Vzc2Z1bCwgKmZ1bmMqIHdpbGwgYmUKLSAgIGNhbGxlZCB3aXRoIHRoZSBhcmd1bWVudCAqYXJnKiBhdCB0aGUgZWFybGllc3QgY29udmVuaWVuY2UuICAqZnVuYyogd2lsbCBiZQotICAgY2FsbGVkIGhhdmluZyB0aGUgZ2xvYmFsIGludGVycHJldGVyIGxvY2sgaGVsZCBhbmQgY2FuIHRodXMgdXNlIHRoZSBmdWxsCi0gICBQeXRob24gQVBJIGFuZCBjYW4gdGFrZSBhbnkgYWN0aW9uIHN1Y2ggYXMgc2V0dGluZyBvYmplY3QgYXR0cmlidXRlcyB0bwotICAgc2lnbmFsIElPIGNvbXBsZXRpb24uICBJdCBtdXN0IHJldHVybiAwIG9uIHN1Y2Nlc3MsIG9yIC0xIHNpZ25hbGxpbmcgYW4KLSAgIGV4Y2VwdGlvbi4gIFRoZSBub3RpZmljYXRpb24gZnVuY3Rpb24gd29uJ3QgYmUgaW50ZXJydXB0ZWQgdG8gcGVyZm9ybSBhbm90aGVyCi0gICBhc3luY2hyb25vdXMgbm90aWZpY2F0aW9uIHJlY3Vyc2l2ZWx5LCBidXQgaXQgY2FuIHN0aWxsIGJlIGludGVycnVwdGVkIHRvCi0gICBzd2l0Y2ggdGhyZWFkcyBpZiB0aGUgZ2xvYmFsIGludGVycHJldGVyIGxvY2sgaXMgcmVsZWFzZWQsIGZvciBleGFtcGxlLCBpZiBpdAotICAgY2FsbHMgYmFjayBpbnRvIFB5dGhvbiBjb2RlLgorICAgU2NoZWR1bGUgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgZnJvbSB0aGUgbWFpbiBpbnRlcnByZXRlciB0aHJlYWQuICBPbgorICAgc3VjY2VzcywgMCBpcyByZXR1cm5lZCBhbmQgKmZ1bmMqIGlzIHF1ZXVlZCBmb3IgYmVpbmcgY2FsbGVkIGluIHRoZQorICAgbWFpbiB0aHJlYWQuICBPbiBmYWlsdXJlLCAtMSBpcyByZXR1cm5lZCB3aXRob3V0IHNldHRpbmcgYW55IGV4Y2VwdGlvbi4KIAotICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIDAgb24gc3VjY2VzcyBpbiB3aGljaCBjYXNlIHRoZSBub3RpZmljYXRpb24gaGFzIGJlZW4KLSAgIHNjaGVkdWxlZC4gIE90aGVyd2lzZSwgZm9yIGV4YW1wbGUgaWYgdGhlIG5vdGlmaWNhdGlvbiBidWZmZXIgaXMgZnVsbCwgaXQKLSAgIHJldHVybnMgLTEgd2l0aG91dCBzZXR0aW5nIGFueSBleGNlcHRpb24uCisgICBXaGVuIHN1Y2Nlc3NmdWxseSBxdWV1ZWQsICpmdW5jKiB3aWxsIGJlICpldmVudHVhbGx5KiBjYWxsZWQgZnJvbSB0aGUKKyAgIG1haW4gaW50ZXJwcmV0ZXIgdGhyZWFkIHdpdGggdGhlIGFyZ3VtZW50ICphcmcqLiAgSXQgd2lsbCBiZSBjYWxsZWQKKyAgIGFzeW5jaHJvbm91c2x5IHdpdGggcmVzcGVjdCB0byBub3JtYWxseSBydW5uaW5nIFB5dGhvbiBjb2RlLCBidXQgd2l0aAorICAgYm90aCB0aGVzZSBjb25kaXRpb25zIG1ldDoKIAotICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIG9uIGFueSB0aHJlYWQsIGJlIGl0IGEgUHl0aG9uIHRocmVhZCBvciBzb21lCi0gICBvdGhlciBzeXN0ZW0gdGhyZWFkLiAgSWYgaXQgaXMgYSBQeXRob24gdGhyZWFkLCBpdCBkb2Vzbid0IG1hdHRlciBpZiBpdCBob2xkcwotICAgdGhlIGdsb2JhbCBpbnRlcnByZXRlciBsb2NrIG9yIG5vdC4KKyAgICogb24gYSA6dGVybTpgYnl0ZWNvZGVgIGJvdW5kYXJ5OworICAgKiB3aXRoIHRoZSBtYWluIHRocmVhZCBob2xkaW5nIHRoZSA6dGVybTpgZ2xvYmFsIGludGVycHJldGVyIGxvY2tgCisgICAgICgqZnVuYyogY2FuIHRoZXJlZm9yZSB1c2UgdGhlIGZ1bGwgQyBBUEkpLgorCisgICAqZnVuYyogbXVzdCByZXR1cm4gMCBvbiBzdWNjZXNzLCBvciAtMSBvbiBmYWlsdXJlIHdpdGggYW4gZXhjZXB0aW9uCisgICBzZXQuICAqZnVuYyogd29uJ3QgYmUgaW50ZXJydXB0ZWQgdG8gcGVyZm9ybSBhbm90aGVyIGFzeW5jaHJvbm91cworICAgbm90aWZpY2F0aW9uIHJlY3Vyc2l2ZWx5LCBidXQgaXQgY2FuIHN0aWxsIGJlIGludGVycnVwdGVkIHRvIHN3aXRjaAorICAgdGhyZWFkcyBpZiB0aGUgZ2xvYmFsIGludGVycHJldGVyIGxvY2sgaXMgcmVsZWFzZWQuCisKKyAgIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBuZWVkIGEgY3VycmVudCB0aHJlYWQgc3RhdGUgdG8gcnVuLCBhbmQgaXQgZG9lc24ndAorICAgbmVlZCB0aGUgZ2xvYmFsIGludGVycHJldGVyIGxvY2suCisKKyAgIC4uIHdhcm5pbmc6OgorICAgICAgVGhpcyBpcyBhIGxvdy1sZXZlbCBmdW5jdGlvbiwgb25seSB1c2VmdWwgZm9yIHZlcnkgc3BlY2lhbCBjYXNlcy4KKyAgICAgIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0ICpmdW5jKiB3aWxsIGJlIGNhbGxlZCBhcyBxdWljayBhcworICAgICAgcG9zc2libGUuICBJZiB0aGUgbWFpbiB0aHJlYWQgaXMgYnVzeSBleGVjdXRpbmcgYSBzeXN0ZW0gY2FsbCwKKyAgICAgICpmdW5jKiB3b24ndCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBzeXN0ZW0gY2FsbCByZXR1cm5zLiAgVGhpcworICAgICAgZnVuY3Rpb24gaXMgZ2VuZXJhbGx5ICoqbm90Kiogc3VpdGFibGUgZm9yIGNhbGxpbmcgUHl0aG9uIGNvZGUgZnJvbQorICAgICAgYXJiaXRyYXJ5IEMgdGhyZWFkcy4gIEluc3RlYWQsIHVzZSB0aGUgOnJlZjpgUHlHSUxTdGF0ZSBBUEk8Z2lsc3RhdGU+YC4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi43CiAKIAotCiAuLiBfcHJvZmlsaW5nOgogCiBQcm9maWxpbmcgYW5kIFRyYWNpbmcKQEAgLTk2NCwxMCArOTcwLDEwIEBACiBpbiBwcmV2aW91cyB2ZXJzaW9ucy4KIAogCi0uLiBjdHlwZTo6IGludCAoKlB5X3RyYWNlZnVuYykoUHlPYmplY3QgKm9iaiwgUHlGcmFtZU9iamVjdCAqZnJhbWUsIGludCB3aGF0LCBQeU9iamVjdCAqYXJnKQorLi4gYzp0eXBlOjogaW50ICgqUHlfdHJhY2VmdW5jKShQeU9iamVjdCAqb2JqLCBQeUZyYW1lT2JqZWN0ICpmcmFtZSwgaW50IHdoYXQsIFB5T2JqZWN0ICphcmcpCiAKLSAgIFRoZSB0eXBlIG9mIHRoZSB0cmFjZSBmdW5jdGlvbiByZWdpc3RlcmVkIHVzaW5nIDpjZnVuYzpgUHlFdmFsX1NldFByb2ZpbGVgIGFuZAotICAgOmNmdW5jOmBQeUV2YWxfU2V0VHJhY2VgLiBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSBvYmplY3QgcGFzc2VkIHRvIHRoZQorICAgVGhlIHR5cGUgb2YgdGhlIHRyYWNlIGZ1bmN0aW9uIHJlZ2lzdGVyZWQgdXNpbmcgOmM6ZnVuYzpgUHlFdmFsX1NldFByb2ZpbGVgIGFuZAorICAgOmM6ZnVuYzpgUHlFdmFsX1NldFRyYWNlYC4gVGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgb2JqZWN0IHBhc3NlZCB0byB0aGUKICAgIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBhcyAqb2JqKiwgKmZyYW1lKiBpcyB0aGUgZnJhbWUgb2JqZWN0IHRvIHdoaWNoIHRoZSBldmVudAogICAgcGVydGFpbnMsICp3aGF0KiBpcyBvbmUgb2YgdGhlIGNvbnN0YW50cyA6Y29uc3Q6YFB5VHJhY2VfQ0FMTGAsCiAgICA6Y29uc3Q6YFB5VHJhY2VfRVhDRVBUSU9OYCwgOmNvbnN0OmBQeVRyYWNlX0xJTkVgLCA6Y29uc3Q6YFB5VHJhY2VfUkVUVVJOYCwKQEAgLTk5NSwxOCArMTAwMSwxOCBAQAogICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKIAogCi0uLiBjdmFyOjogaW50IFB5VHJhY2VfQ0FMTAorLi4gYzp2YXI6OiBpbnQgUHlUcmFjZV9DQUxMCiAKLSAgIFRoZSB2YWx1ZSBvZiB0aGUgKndoYXQqIHBhcmFtZXRlciB0byBhIDpjdHlwZTpgUHlfdHJhY2VmdW5jYCBmdW5jdGlvbiB3aGVuIGEgbmV3CisgICBUaGUgdmFsdWUgb2YgdGhlICp3aGF0KiBwYXJhbWV0ZXIgdG8gYSA6Yzp0eXBlOmBQeV90cmFjZWZ1bmNgIGZ1bmN0aW9uIHdoZW4gYSBuZXcKICAgIGNhbGwgdG8gYSBmdW5jdGlvbiBvciBtZXRob2QgaXMgYmVpbmcgcmVwb3J0ZWQsIG9yIGEgbmV3IGVudHJ5IGludG8gYSBnZW5lcmF0b3IuCiAgICBOb3RlIHRoYXQgdGhlIGNyZWF0aW9uIG9mIHRoZSBpdGVyYXRvciBmb3IgYSBnZW5lcmF0b3IgZnVuY3Rpb24gaXMgbm90IHJlcG9ydGVkCiAgICBhcyB0aGVyZSBpcyBubyBjb250cm9sIHRyYW5zZmVyIHRvIHRoZSBQeXRob24gYnl0ZWNvZGUgaW4gdGhlIGNvcnJlc3BvbmRpbmcKICAgIGZyYW1lLgogCiAKLS4uIGN2YXI6OiBpbnQgUHlUcmFjZV9FWENFUFRJT04KKy4uIGM6dmFyOjogaW50IFB5VHJhY2VfRVhDRVBUSU9OCiAKLSAgIFRoZSB2YWx1ZSBvZiB0aGUgKndoYXQqIHBhcmFtZXRlciB0byBhIDpjdHlwZTpgUHlfdHJhY2VmdW5jYCBmdW5jdGlvbiB3aGVuIGFuCisgICBUaGUgdmFsdWUgb2YgdGhlICp3aGF0KiBwYXJhbWV0ZXIgdG8gYSA6Yzp0eXBlOmBQeV90cmFjZWZ1bmNgIGZ1bmN0aW9uIHdoZW4gYW4KICAgIGV4Y2VwdGlvbiBoYXMgYmVlbiByYWlzZWQuICBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhpcyB2YWx1ZSBmb3IKICAgICp3aGF0KiB3aGVuIGFmdGVyIGFueSBieXRlY29kZSBpcyBwcm9jZXNzZWQgYWZ0ZXIgd2hpY2ggdGhlIGV4Y2VwdGlvbiBiZWNvbWVzCiAgICBzZXQgd2l0aGluIHRoZSBmcmFtZSBiZWluZyBleGVjdXRlZC4gIFRoZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IGFzIGV4Y2VwdGlvbgpAQCAtMTAxNSwzNyArMTAyMSwzNyBAQAogICAgdGhlc2UgZXZlbnRzOyB0aGV5IGFyZSBub3QgbmVlZGVkIGJ5IHRoZSBwcm9maWxlci4KIAogCi0uLiBjdmFyOjogaW50IFB5VHJhY2VfTElORQorLi4gYzp2YXI6OiBpbnQgUHlUcmFjZV9MSU5FCiAKICAgIFRoZSB2YWx1ZSBwYXNzZWQgYXMgdGhlICp3aGF0KiBwYXJhbWV0ZXIgdG8gYSB0cmFjZSBmdW5jdGlvbiAoYnV0IG5vdCBhCiAgICBwcm9maWxpbmcgZnVuY3Rpb24pIHdoZW4gYSBsaW5lLW51bWJlciBldmVudCBpcyBiZWluZyByZXBvcnRlZC4KIAogCi0uLiBjdmFyOjogaW50IFB5VHJhY2VfUkVUVVJOCisuLiBjOnZhcjo6IGludCBQeVRyYWNlX1JFVFVSTgogCi0gICBUaGUgdmFsdWUgZm9yIHRoZSAqd2hhdCogcGFyYW1ldGVyIHRvIDpjdHlwZTpgUHlfdHJhY2VmdW5jYCBmdW5jdGlvbnMgd2hlbiBhCisgICBUaGUgdmFsdWUgZm9yIHRoZSAqd2hhdCogcGFyYW1ldGVyIHRvIDpjOnR5cGU6YFB5X3RyYWNlZnVuY2AgZnVuY3Rpb25zIHdoZW4gYQogICAgY2FsbCBpcyByZXR1cm5pbmcgd2l0aG91dCBwcm9wYWdhdGluZyBhbiBleGNlcHRpb24uCiAKIAotLi4gY3Zhcjo6IGludCBQeVRyYWNlX0NfQ0FMTAorLi4gYzp2YXI6OiBpbnQgUHlUcmFjZV9DX0NBTEwKIAotICAgVGhlIHZhbHVlIGZvciB0aGUgKndoYXQqIHBhcmFtZXRlciB0byA6Y3R5cGU6YFB5X3RyYWNlZnVuY2AgZnVuY3Rpb25zIHdoZW4gYSBDCisgICBUaGUgdmFsdWUgZm9yIHRoZSAqd2hhdCogcGFyYW1ldGVyIHRvIDpjOnR5cGU6YFB5X3RyYWNlZnVuY2AgZnVuY3Rpb25zIHdoZW4gYSBDCiAgICBmdW5jdGlvbiBpcyBhYm91dCB0byBiZSBjYWxsZWQuCiAKIAotLi4gY3Zhcjo6IGludCBQeVRyYWNlX0NfRVhDRVBUSU9OCisuLiBjOnZhcjo6IGludCBQeVRyYWNlX0NfRVhDRVBUSU9OCiAKLSAgIFRoZSB2YWx1ZSBmb3IgdGhlICp3aGF0KiBwYXJhbWV0ZXIgdG8gOmN0eXBlOmBQeV90cmFjZWZ1bmNgIGZ1bmN0aW9ucyB3aGVuIGEgQworICAgVGhlIHZhbHVlIGZvciB0aGUgKndoYXQqIHBhcmFtZXRlciB0byA6Yzp0eXBlOmBQeV90cmFjZWZ1bmNgIGZ1bmN0aW9ucyB3aGVuIGEgQwogICAgZnVuY3Rpb24gaGFzIHJhaXNlZCBhbiBleGNlcHRpb24uCiAKIAotLi4gY3Zhcjo6IGludCBQeVRyYWNlX0NfUkVUVVJOCisuLiBjOnZhcjo6IGludCBQeVRyYWNlX0NfUkVUVVJOCiAKLSAgIFRoZSB2YWx1ZSBmb3IgdGhlICp3aGF0KiBwYXJhbWV0ZXIgdG8gOmN0eXBlOmBQeV90cmFjZWZ1bmNgIGZ1bmN0aW9ucyB3aGVuIGEgQworICAgVGhlIHZhbHVlIGZvciB0aGUgKndoYXQqIHBhcmFtZXRlciB0byA6Yzp0eXBlOmBQeV90cmFjZWZ1bmNgIGZ1bmN0aW9ucyB3aGVuIGEgQwogICAgZnVuY3Rpb24gaGFzIHJldHVybmVkLgogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgUHlFdmFsX1NldFByb2ZpbGUoUHlfdHJhY2VmdW5jIGZ1bmMsIFB5T2JqZWN0ICpvYmopCisuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeUV2YWxfU2V0UHJvZmlsZShQeV90cmFjZWZ1bmMgZnVuYywgUHlPYmplY3QgKm9iaikKIAogICAgU2V0IHRoZSBwcm9maWxlciBmdW5jdGlvbiB0byAqZnVuYyouICBUaGUgKm9iaiogcGFyYW1ldGVyIGlzIHBhc3NlZCB0byB0aGUKICAgIGZ1bmN0aW9uIGFzIGl0cyBmaXJzdCBwYXJhbWV0ZXIsIGFuZCBtYXkgYmUgYW55IFB5dGhvbiBvYmplY3QsIG9yICpOVUxMKi4gIElmCkBAIC0xMDU1LDEzICsxMDYxLDEzIEBACiAgICBldmVudHMuCiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBQeUV2YWxfU2V0VHJhY2UoUHlfdHJhY2VmdW5jIGZ1bmMsIFB5T2JqZWN0ICpvYmopCisuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeUV2YWxfU2V0VHJhY2UoUHlfdHJhY2VmdW5jIGZ1bmMsIFB5T2JqZWN0ICpvYmopCiAKICAgIFNldCB0aGUgdHJhY2luZyBmdW5jdGlvbiB0byAqZnVuYyouICBUaGlzIGlzIHNpbWlsYXIgdG8KLSAgIDpjZnVuYzpgUHlFdmFsX1NldFByb2ZpbGVgLCBleGNlcHQgdGhlIHRyYWNpbmcgZnVuY3Rpb24gZG9lcyByZWNlaXZlIGxpbmUtbnVtYmVyCisgICA6YzpmdW5jOmBQeUV2YWxfU2V0UHJvZmlsZWAsIGV4Y2VwdCB0aGUgdHJhY2luZyBmdW5jdGlvbiBkb2VzIHJlY2VpdmUgbGluZS1udW1iZXIKICAgIGV2ZW50cy4KIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5RXZhbF9HZXRDYWxsU3RhdHMoUHlPYmplY3QgKnNlbGYpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5RXZhbF9HZXRDYWxsU3RhdHMoUHlPYmplY3QgKnNlbGYpCiAKICAgIFJldHVybiBhIHR1cGxlIG9mIGZ1bmN0aW9uIGNhbGwgY291bnRzLiAgVGhlcmUgYXJlIGNvbnN0YW50cyBkZWZpbmVkIGZvciB0aGUKICAgIHBvc2l0aW9ucyB3aXRoaW4gdGhlIHR1cGxlOgpAQCAtMTExMywxNCArMTExOSwxNCBAQAogVGhlc2UgZnVuY3Rpb25zIGFyZSBvbmx5IGludGVuZGVkIHRvIGJlIHVzZWQgYnkgYWR2YW5jZWQgZGVidWdnaW5nIHRvb2xzLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5SW50ZXJwcmV0ZXJTdGF0ZSogUHlJbnRlcnByZXRlclN0YXRlX0hlYWQoKQorLi4gYzpmdW5jdGlvbjo6IFB5SW50ZXJwcmV0ZXJTdGF0ZSogUHlJbnRlcnByZXRlclN0YXRlX0hlYWQoKQogCiAgICBSZXR1cm4gdGhlIGludGVycHJldGVyIHN0YXRlIG9iamVjdCBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCBvZiBhbGwgc3VjaCBvYmplY3RzLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjIKIAogCi0uLiBjZnVuY3Rpb246OiBQeUludGVycHJldGVyU3RhdGUqIFB5SW50ZXJwcmV0ZXJTdGF0ZV9OZXh0KFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwKQorLi4gYzpmdW5jdGlvbjo6IFB5SW50ZXJwcmV0ZXJTdGF0ZSogUHlJbnRlcnByZXRlclN0YXRlX05leHQoUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnApCiAKICAgIFJldHVybiB0aGUgbmV4dCBpbnRlcnByZXRlciBzdGF0ZSBvYmplY3QgYWZ0ZXIgKmludGVycCogZnJvbSB0aGUgbGlzdCBvZiBhbGwKICAgIHN1Y2ggb2JqZWN0cy4KQEAgLTExMjgsMTggKzExMzQsMTggQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5VGhyZWFkU3RhdGUgKiBQeUludGVycHJldGVyU3RhdGVfVGhyZWFkSGVhZChQeUludGVycHJldGVyU3RhdGUgKmludGVycCkKKy4uIGM6ZnVuY3Rpb246OiBQeVRocmVhZFN0YXRlICogUHlJbnRlcnByZXRlclN0YXRlX1RocmVhZEhlYWQoUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnApCiAKLSAgIFJldHVybiB0aGUgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCA6Y3R5cGU6YFB5VGhyZWFkU3RhdGVgIG9iamVjdCBpbiB0aGUgbGlzdCBvZgorICAgUmV0dXJuIHRoZSBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IDpjOnR5cGU6YFB5VGhyZWFkU3RhdGVgIG9iamVjdCBpbiB0aGUgbGlzdCBvZgogICAgdGhyZWFkcyBhc3NvY2lhdGVkIHdpdGggdGhlIGludGVycHJldGVyICppbnRlcnAqLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjIKIAogCi0uLiBjZnVuY3Rpb246OiBQeVRocmVhZFN0YXRlKiBQeVRocmVhZFN0YXRlX05leHQoUHlUaHJlYWRTdGF0ZSAqdHN0YXRlKQorLi4gYzpmdW5jdGlvbjo6IFB5VGhyZWFkU3RhdGUqIFB5VGhyZWFkU3RhdGVfTmV4dChQeVRocmVhZFN0YXRlICp0c3RhdGUpCiAKICAgIFJldHVybiB0aGUgbmV4dCB0aHJlYWQgc3RhdGUgb2JqZWN0IGFmdGVyICp0c3RhdGUqIGZyb20gdGhlIGxpc3Qgb2YgYWxsIHN1Y2gKLSAgIG9iamVjdHMgYmVsb25naW5nIHRvIHRoZSBzYW1lIDpjdHlwZTpgUHlJbnRlcnByZXRlclN0YXRlYCBvYmplY3QuCisgICBvYmplY3RzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSA6Yzp0eXBlOmBQeUludGVycHJldGVyU3RhdGVgIG9iamVjdC4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4yCiAKZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9pbnQucnN0IGIvRG9jL2MtYXBpL2ludC5yc3QKaW5kZXggYzU2MWJjMi4uMjU0MjE5YyAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL2ludC5yc3QKKysrIGIvRG9jL2MtYXBpL2ludC5yc3QKQEAgLTgsMzkgKzgsMzkgQEAKIC4uIGluZGV4Ojogb2JqZWN0OiBpbnRlZ2VyCiAKIAotLi4gY3R5cGU6OiBQeUludE9iamVjdAorLi4gYzp0eXBlOjogUHlJbnRPYmplY3QKIAotICAgVGhpcyBzdWJ0eXBlIG9mIDpjdHlwZTpgUHlPYmplY3RgIHJlcHJlc2VudHMgYSBQeXRob24gaW50ZWdlciBvYmplY3QuCisgICBUaGlzIHN1YnR5cGUgb2YgOmM6dHlwZTpgUHlPYmplY3RgIHJlcHJlc2VudHMgYSBQeXRob24gaW50ZWdlciBvYmplY3QuCiAKIAotLi4gY3Zhcjo6IFB5VHlwZU9iamVjdCBQeUludF9UeXBlCisuLiBjOnZhcjo6IFB5VHlwZU9iamVjdCBQeUludF9UeXBlCiAKICAgIC4uIGluZGV4Ojogc2luZ2xlOiBJbnRUeXBlIChpbiBtb2R1bGVzIHR5cGVzKQogCi0gICBUaGlzIGluc3RhbmNlIG9mIDpjdHlwZTpgUHlUeXBlT2JqZWN0YCByZXByZXNlbnRzIHRoZSBQeXRob24gcGxhaW4gaW50ZWdlciB0eXBlLgorICAgVGhpcyBpbnN0YW5jZSBvZiA6Yzp0eXBlOmBQeVR5cGVPYmplY3RgIHJlcHJlc2VudHMgdGhlIFB5dGhvbiBwbGFpbiBpbnRlZ2VyIHR5cGUuCiAgICBUaGlzIGlzIHRoZSBzYW1lIG9iamVjdCBhcyBgYGludGBgIGFuZCBgYHR5cGVzLkludFR5cGVgYC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlJbnRfQ2hlY2soUHlPYmplY3QgKm8pCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5SW50X0NoZWNrKFB5T2JqZWN0ICpvKQogCi0gICBSZXR1cm4gdHJ1ZSBpZiAqbyogaXMgb2YgdHlwZSA6Y2RhdGE6YFB5SW50X1R5cGVgIG9yIGEgc3VidHlwZSBvZgotICAgOmNkYXRhOmBQeUludF9UeXBlYC4KKyAgIFJldHVybiB0cnVlIGlmICpvKiBpcyBvZiB0eXBlIDpjOmRhdGE6YFB5SW50X1R5cGVgIG9yIGEgc3VidHlwZSBvZgorICAgOmM6ZGF0YTpgUHlJbnRfVHlwZWAuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi4yCiAgICAgICBBbGxvd2VkIHN1YnR5cGVzIHRvIGJlIGFjY2VwdGVkLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUludF9DaGVja0V4YWN0KFB5T2JqZWN0ICpvKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUludF9DaGVja0V4YWN0KFB5T2JqZWN0ICpvKQogCi0gICBSZXR1cm4gdHJ1ZSBpZiAqbyogaXMgb2YgdHlwZSA6Y2RhdGE6YFB5SW50X1R5cGVgLCBidXQgbm90IGEgc3VidHlwZSBvZgotICAgOmNkYXRhOmBQeUludF9UeXBlYC4KKyAgIFJldHVybiB0cnVlIGlmICpvKiBpcyBvZiB0eXBlIDpjOmRhdGE6YFB5SW50X1R5cGVgLCBidXQgbm90IGEgc3VidHlwZSBvZgorICAgOmM6ZGF0YTpgUHlJbnRfVHlwZWAuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUludF9Gcm9tU3RyaW5nKGNoYXIgKnN0ciwgY2hhciAqKnBlbmQsIGludCBiYXNlKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUludF9Gcm9tU3RyaW5nKGNoYXIgKnN0ciwgY2hhciAqKnBlbmQsIGludCBiYXNlKQogCi0gICBSZXR1cm4gYSBuZXcgOmN0eXBlOmBQeUludE9iamVjdGAgb3IgOmN0eXBlOmBQeUxvbmdPYmplY3RgIGJhc2VkIG9uIHRoZSBzdHJpbmcKKyAgIFJldHVybiBhIG5ldyA6Yzp0eXBlOmBQeUludE9iamVjdGAgb3IgOmM6dHlwZTpgUHlMb25nT2JqZWN0YCBiYXNlZCBvbiB0aGUgc3RyaW5nCiAgICB2YWx1ZSBpbiAqc3RyKiwgd2hpY2ggaXMgaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIHRoZSByYWRpeCBpbiAqYmFzZSouICBJZgogICAgKnBlbmQqIGlzIG5vbi0qTlVMTCosIGBgKnBlbmRgYCB3aWxsIHBvaW50IHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gKnN0ciogd2hpY2gKICAgIGZvbGxvd3MgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBudW1iZXIuICBJZiAqYmFzZSogaXMgYGAwYGAsIHRoZSByYWRpeCB3aWxsIGJlCkBAIC00OSwxMyArNDksMTMgQEAKICAgIDggd2lsbCBiZSB1c2VkOyBvdGhlcndpc2UgcmFkaXggMTAgd2lsbCBiZSB1c2VkLiAgSWYgKmJhc2UqIGlzIG5vdCBgYDBgYCwgaXQKICAgIG11c3QgYmUgYmV0d2VlbiBgYDJgYCBhbmQgYGAzNmBgLCBpbmNsdXNpdmUuICBMZWFkaW5nIHNwYWNlcyBhcmUgaWdub3JlZC4gIElmCiAgICB0aGVyZSBhcmUgbm8gZGlnaXRzLCA6ZXhjOmBWYWx1ZUVycm9yYCB3aWxsIGJlIHJhaXNlZC4gIElmIHRoZSBzdHJpbmcgcmVwcmVzZW50cwotICAgYSBudW1iZXIgdG9vIGxhcmdlIHRvIGJlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIG1hY2hpbmUncyA6Y3R5cGU6YGxvbmcgaW50YCB0eXBlCi0gICBhbmQgb3ZlcmZsb3cgd2FybmluZ3MgYXJlIGJlaW5nIHN1cHByZXNzZWQsIGEgOmN0eXBlOmBQeUxvbmdPYmplY3RgIHdpbGwgYmUKKyAgIGEgbnVtYmVyIHRvbyBsYXJnZSB0byBiZSBjb250YWluZWQgd2l0aGluIHRoZSBtYWNoaW5lJ3MgOmM6dHlwZTpgbG9uZyBpbnRgIHR5cGUKKyAgIGFuZCBvdmVyZmxvdyB3YXJuaW5ncyBhcmUgYmVpbmcgc3VwcHJlc3NlZCwgYSA6Yzp0eXBlOmBQeUxvbmdPYmplY3RgIHdpbGwgYmUKICAgIHJldHVybmVkLiAgSWYgb3ZlcmZsb3cgd2FybmluZ3MgYXJlIG5vdCBiZWluZyBzdXBwcmVzc2VkLCAqTlVMTCogd2lsbCBiZQogICAgcmV0dXJuZWQgaW4gdGhpcyBjYXNlLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUludF9Gcm9tTG9uZyhsb25nIGl2YWwpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5SW50X0Zyb21Mb25nKGxvbmcgaXZhbCkKIAogICAgQ3JlYXRlIGEgbmV3IGludGVnZXIgb2JqZWN0IHdpdGggYSB2YWx1ZSBvZiAqaXZhbCouCiAKQEAgLTY2LDcgKzY2LDcgQEAKICAgIHVuZGVmaW5lZC4gOi0pCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5SW50X0Zyb21Tc2l6ZV90KFB5X3NzaXplX3QgaXZhbCkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlJbnRfRnJvbVNzaXplX3QoUHlfc3NpemVfdCBpdmFsKQogCiAgICBDcmVhdGUgYSBuZXcgaW50ZWdlciBvYmplY3Qgd2l0aCBhIHZhbHVlIG9mICppdmFsKi4gSWYgdGhlIHZhbHVlIGlzIGxhcmdlcgogICAgdGhhbiBgYExPTkdfTUFYYGAgb3Igc21hbGxlciB0aGFuIGBgTE9OR19NSU5gYCwgYSBsb25nIGludGVnZXIgb2JqZWN0IGlzCkBAIC03NSw3ICs3NSw3IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjUKIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlJbnRfRnJvbVNpemVfdChzaXplX3QgaXZhbCkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlJbnRfRnJvbVNpemVfdChzaXplX3QgaXZhbCkKIAogICAgQ3JlYXRlIGEgbmV3IGludGVnZXIgb2JqZWN0IHdpdGggYSB2YWx1ZSBvZiAqaXZhbCouIElmIHRoZSB2YWx1ZSBleGNlZWRzCiAgICBgYExPTkdfTUFYYGAsIGEgbG9uZyBpbnRlZ2VyIG9iamVjdCBpcyByZXR1cm5lZC4KQEAgLTgzLDQ3ICs4Myw0NyBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi41CiAKIAotLi4gY2Z1bmN0aW9uOjogbG9uZyBQeUludF9Bc0xvbmcoUHlPYmplY3QgKmlvKQorLi4gYzpmdW5jdGlvbjo6IGxvbmcgUHlJbnRfQXNMb25nKFB5T2JqZWN0ICppbykKIAotICAgV2lsbCBmaXJzdCBhdHRlbXB0IHRvIGNhc3QgdGhlIG9iamVjdCB0byBhIDpjdHlwZTpgUHlJbnRPYmplY3RgLCBpZiBpdCBpcyBub3QKKyAgIFdpbGwgZmlyc3QgYXR0ZW1wdCB0byBjYXN0IHRoZSBvYmplY3QgdG8gYSA6Yzp0eXBlOmBQeUludE9iamVjdGAsIGlmIGl0IGlzIG5vdAogICAgYWxyZWFkeSBvbmUsIGFuZCB0aGVuIHJldHVybiBpdHMgdmFsdWUuIElmIHRoZXJlIGlzIGFuIGVycm9yLCBgYC0xYGAgaXMKICAgIHJldHVybmVkLCBhbmQgdGhlIGNhbGxlciBzaG91bGQgY2hlY2sgYGBQeUVycl9PY2N1cnJlZCgpYGAgdG8gZmluZCBvdXQgd2hldGhlcgogICAgdGhlcmUgd2FzIGFuIGVycm9yLCBvciB3aGV0aGVyIHRoZSB2YWx1ZSBqdXN0IGhhcHBlbmVkIHRvIGJlIC0xLgogCiAKLS4uIGNmdW5jdGlvbjo6IGxvbmcgUHlJbnRfQVNfTE9ORyhQeU9iamVjdCAqaW8pCisuLiBjOmZ1bmN0aW9uOjogbG9uZyBQeUludF9BU19MT05HKFB5T2JqZWN0ICppbykKIAogICAgUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgb2JqZWN0ICppbyouICBObyBlcnJvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCiAKIAotLi4gY2Z1bmN0aW9uOjogdW5zaWduZWQgbG9uZyBQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2soUHlPYmplY3QgKmlvKQorLi4gYzpmdW5jdGlvbjo6IHVuc2lnbmVkIGxvbmcgUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKFB5T2JqZWN0ICppbykKIAotICAgV2lsbCBmaXJzdCBhdHRlbXB0IHRvIGNhc3QgdGhlIG9iamVjdCB0byBhIDpjdHlwZTpgUHlJbnRPYmplY3RgIG9yCi0gICA6Y3R5cGU6YFB5TG9uZ09iamVjdGAsIGlmIGl0IGlzIG5vdCBhbHJlYWR5IG9uZSwgYW5kIHRoZW4gcmV0dXJuIGl0cyB2YWx1ZSBhcworICAgV2lsbCBmaXJzdCBhdHRlbXB0IHRvIGNhc3QgdGhlIG9iamVjdCB0byBhIDpjOnR5cGU6YFB5SW50T2JqZWN0YCBvcgorICAgOmM6dHlwZTpgUHlMb25nT2JqZWN0YCwgaWYgaXQgaXMgbm90IGFscmVhZHkgb25lLCBhbmQgdGhlbiByZXR1cm4gaXRzIHZhbHVlIGFzCiAgICB1bnNpZ25lZCBsb25nLiAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjaGVjayBmb3Igb3ZlcmZsb3cuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMwogCiAKLS4uIGNmdW5jdGlvbjo6IHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBQeUludF9Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKFB5T2JqZWN0ICppbykKKy4uIGM6ZnVuY3Rpb246OiB1bnNpZ25lZCBQWV9MT05HX0xPTkcgUHlJbnRfQXNVbnNpZ25lZExvbmdMb25nTWFzayhQeU9iamVjdCAqaW8pCiAKLSAgIFdpbGwgZmlyc3QgYXR0ZW1wdCB0byBjYXN0IHRoZSBvYmplY3QgdG8gYSA6Y3R5cGU6YFB5SW50T2JqZWN0YCBvcgotICAgOmN0eXBlOmBQeUxvbmdPYmplY3RgLCBpZiBpdCBpcyBub3QgYWxyZWFkeSBvbmUsIGFuZCB0aGVuIHJldHVybiBpdHMgdmFsdWUgYXMKKyAgIFdpbGwgZmlyc3QgYXR0ZW1wdCB0byBjYXN0IHRoZSBvYmplY3QgdG8gYSA6Yzp0eXBlOmBQeUludE9iamVjdGAgb3IKKyAgIDpjOnR5cGU6YFB5TG9uZ09iamVjdGAsIGlmIGl0IGlzIG5vdCBhbHJlYWR5IG9uZSwgYW5kIHRoZW4gcmV0dXJuIGl0cyB2YWx1ZSBhcwogICAgdW5zaWduZWQgbG9uZyBsb25nLCB3aXRob3V0IGNoZWNraW5nIGZvciBvdmVyZmxvdy4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4zCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlfc3NpemVfdCBQeUludF9Bc1NzaXplX3QoUHlPYmplY3QgKmlvKQorLi4gYzpmdW5jdGlvbjo6IFB5X3NzaXplX3QgUHlJbnRfQXNTc2l6ZV90KFB5T2JqZWN0ICppbykKIAotICAgV2lsbCBmaXJzdCBhdHRlbXB0IHRvIGNhc3QgdGhlIG9iamVjdCB0byBhIDpjdHlwZTpgUHlJbnRPYmplY3RgIG9yCi0gICA6Y3R5cGU6YFB5TG9uZ09iamVjdGAsIGlmIGl0IGlzIG5vdCBhbHJlYWR5IG9uZSwgYW5kIHRoZW4gcmV0dXJuIGl0cyB2YWx1ZSBhcwotICAgOmN0eXBlOmBQeV9zc2l6ZV90YC4KKyAgIFdpbGwgZmlyc3QgYXR0ZW1wdCB0byBjYXN0IHRoZSBvYmplY3QgdG8gYSA6Yzp0eXBlOmBQeUludE9iamVjdGAgb3IKKyAgIDpjOnR5cGU6YFB5TG9uZ09iamVjdGAsIGlmIGl0IGlzIG5vdCBhbHJlYWR5IG9uZSwgYW5kIHRoZW4gcmV0dXJuIGl0cyB2YWx1ZSBhcworICAgOmM6dHlwZTpgUHlfc3NpemVfdGAuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNQogCiAKLS4uIGNmdW5jdGlvbjo6IGxvbmcgUHlJbnRfR2V0TWF4KCkKKy4uIGM6ZnVuY3Rpb246OiBsb25nIFB5SW50X0dldE1heCgpCiAKICAgIC4uIGluZGV4Ojogc2luZ2xlOiBMT05HX01BWAogCkBAIC0xMzEsNyArMTMxLDcgQEAKICAgICg6Y29uc3Q6YExPTkdfTUFYYCwgYXMgZGVmaW5lZCBpbiB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcykuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5SW50X0NsZWFyRnJlZUxpc3QoKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUludF9DbGVhckZyZWVMaXN0KCkKIAogICAgQ2xlYXIgdGhlIGludGVnZXIgZnJlZSBsaXN0LiBSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IGNvdWxkIG5vdAogICAgYmUgZnJlZWQuCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvaW50cm8ucnN0IGIvRG9jL2MtYXBpL2ludHJvLnJzdAppbmRleCA5NGFmMGY1Li42NDE0Mjc3IDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvaW50cm8ucnN0CisrKyBiL0RvYy9jLWFwaS9pbnRyby5yc3QKQEAgLTg4LDE1ICs4OCwxNSBAQAogLi4gaW5kZXg6OiBvYmplY3Q6IHR5cGUKIAogTW9zdCBQeXRob24vQyBBUEkgZnVuY3Rpb25zIGhhdmUgb25lIG9yIG1vcmUgYXJndW1lbnRzIGFzIHdlbGwgYXMgYSByZXR1cm4gdmFsdWUKLW9mIHR5cGUgOmN0eXBlOmBQeU9iamVjdFwqYC4gIFRoaXMgdHlwZSBpcyBhIHBvaW50ZXIgdG8gYW4gb3BhcXVlIGRhdGEgdHlwZQorb2YgdHlwZSA6Yzp0eXBlOmBQeU9iamVjdFwqYC4gIFRoaXMgdHlwZSBpcyBhIHBvaW50ZXIgdG8gYW4gb3BhcXVlIGRhdGEgdHlwZQogcmVwcmVzZW50aW5nIGFuIGFyYml0cmFyeSBQeXRob24gb2JqZWN0LiAgU2luY2UgYWxsIFB5dGhvbiBvYmplY3QgdHlwZXMgYXJlCiB0cmVhdGVkIHRoZSBzYW1lIHdheSBieSB0aGUgUHl0aG9uIGxhbmd1YWdlIGluIG1vc3Qgc2l0dWF0aW9ucyAoZS5nLiwKIGFzc2lnbm1lbnRzLCBzY29wZSBydWxlcywgYW5kIGFyZ3VtZW50IHBhc3NpbmcpLCBpdCBpcyBvbmx5IGZpdHRpbmcgdGhhdCB0aGV5CiBzaG91bGQgYmUgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgQyB0eXBlLiAgQWxtb3N0IGFsbCBQeXRob24gb2JqZWN0cyBsaXZlIG9uIHRoZQogaGVhcDogeW91IG5ldmVyIGRlY2xhcmUgYW4gYXV0b21hdGljIG9yIHN0YXRpYyB2YXJpYWJsZSBvZiB0eXBlCi06Y3R5cGU6YFB5T2JqZWN0YCwgb25seSBwb2ludGVyIHZhcmlhYmxlcyBvZiB0eXBlIDpjdHlwZTpgUHlPYmplY3RcKmAgY2FuICBiZQorOmM6dHlwZTpgUHlPYmplY3RgLCBvbmx5IHBvaW50ZXIgdmFyaWFibGVzIG9mIHR5cGUgOmM6dHlwZTpgUHlPYmplY3RcKmAgY2FuICBiZQogZGVjbGFyZWQuICBUaGUgc29sZSBleGNlcHRpb24gYXJlIHRoZSB0eXBlIG9iamVjdHM7IHNpbmNlIHRoZXNlIG11c3QgbmV2ZXIgYmUKLWRlYWxsb2NhdGVkLCB0aGV5IGFyZSB0eXBpY2FsbHkgc3RhdGljIDpjdHlwZTpgUHlUeXBlT2JqZWN0YCBvYmplY3RzLgorZGVhbGxvY2F0ZWQsIHRoZXkgYXJlIHR5cGljYWxseSBzdGF0aWMgOmM6dHlwZTpgUHlUeXBlT2JqZWN0YCBvYmplY3RzLgogCiBBbGwgUHl0aG9uIG9iamVjdHMgKGV2ZW4gUHl0aG9uIGludGVnZXJzKSBoYXZlIGEgOmRmbjpgdHlwZWAgYW5kIGEKIDpkZm46YHJlZmVyZW5jZSBjb3VudGAuICBBbiBvYmplY3QncyB0eXBlIGRldGVybWluZXMgd2hhdCBraW5kIG9mIG9iamVjdCBpdCBpcwpAQCAtMTI3LDggKzEyNyw4IEBACiAgICBzaW5nbGU6IFB5X0RFQ1JFRigpCiAKIFJlZmVyZW5jZSBjb3VudHMgYXJlIGFsd2F5cyBtYW5pcHVsYXRlZCBleHBsaWNpdGx5LiAgVGhlIG5vcm1hbCB3YXkgaXMgIHRvIHVzZQotdGhlIG1hY3JvIDpjZnVuYzpgUHlfSU5DUkVGYCB0byBpbmNyZW1lbnQgYW4gb2JqZWN0J3MgcmVmZXJlbmNlIGNvdW50IGJ5IG9uZSwKLWFuZCA6Y2Z1bmM6YFB5X0RFQ1JFRmAgdG8gZGVjcmVtZW50IGl0IGJ5ICAgb25lLiAgVGhlIDpjZnVuYzpgUHlfREVDUkVGYCBtYWNybwordGhlIG1hY3JvIDpjOmZ1bmM6YFB5X0lOQ1JFRmAgdG8gaW5jcmVtZW50IGFuIG9iamVjdCdzIHJlZmVyZW5jZSBjb3VudCBieSBvbmUsCithbmQgOmM6ZnVuYzpgUHlfREVDUkVGYCB0byBkZWNyZW1lbnQgaXQgYnkgICBvbmUuICBUaGUgOmM6ZnVuYzpgUHlfREVDUkVGYCBtYWNybwogaXMgY29uc2lkZXJhYmx5IG1vcmUgY29tcGxleCB0aGFuIHRoZSBpbmNyZWYgb25lLCBzaW5jZSBpdCBtdXN0IGNoZWNrIHdoZXRoZXIKIHRoZSByZWZlcmVuY2UgY291bnQgYmVjb21lcyB6ZXJvIGFuZCB0aGVuIGNhdXNlIHRoZSBvYmplY3QncyBkZWFsbG9jYXRvciB0byBiZQogY2FsbGVkLiBUaGUgZGVhbGxvY2F0b3IgaXMgYSBmdW5jdGlvbiBwb2ludGVyIGNvbnRhaW5lZCBpbiB0aGUgb2JqZWN0J3MgdHlwZQpAQCAtMTU5LDEzICsxNTksMTMgQEAKIGNvbmNlaXZhYmx5IHJlbW92ZSB0aGUgb2JqZWN0IGZyb20gdGhlIGxpc3QsIGRlY3JlbWVudGluZyBpdHMgcmVmZXJlbmNlIGNvdW50CiBhbmQgcG9zc2libGUgZGVhbGxvY2F0aW5nIGl0LiBUaGUgcmVhbCBkYW5nZXIgaXMgdGhhdCBpbm5vY2VudC1sb29raW5nCiBvcGVyYXRpb25zIG1heSBpbnZva2UgYXJiaXRyYXJ5IFB5dGhvbiBjb2RlIHdoaWNoIGNvdWxkIGRvIHRoaXM7IHRoZXJlIGlzIGEgY29kZQotcGF0aCB3aGljaCBhbGxvd3MgY29udHJvbCB0byBmbG93IGJhY2sgdG8gdGhlIHVzZXIgZnJvbSBhIDpjZnVuYzpgUHlfREVDUkVGYCwgc28KK3BhdGggd2hpY2ggYWxsb3dzIGNvbnRyb2wgdG8gZmxvdyBiYWNrIHRvIHRoZSB1c2VyIGZyb20gYSA6YzpmdW5jOmBQeV9ERUNSRUZgLCBzbwogYWxtb3N0IGFueSBvcGVyYXRpb24gaXMgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzLgogCiBBIHNhZmUgYXBwcm9hY2ggaXMgdG8gYWx3YXlzIHVzZSB0aGUgZ2VuZXJpYyBvcGVyYXRpb25zIChmdW5jdGlvbnMgIHdob3NlIG5hbWUKIGJlZ2lucyB3aXRoIGBgUHlPYmplY3RfYGAsIGBgUHlOdW1iZXJfYGAsIGBgUHlTZXF1ZW5jZV9gYCBvciBgYFB5TWFwcGluZ19gYCkuCiBUaGVzZSBvcGVyYXRpb25zIGFsd2F5cyBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgb2JqZWN0IHRoZXkgcmV0dXJuLgotVGhpcyBsZWF2ZXMgdGhlIGNhbGxlciB3aXRoIHRoZSByZXNwb25zaWJpbGl0eSB0byBjYWxsIDpjZnVuYzpgUHlfREVDUkVGYCB3aGVuCitUaGlzIGxlYXZlcyB0aGUgY2FsbGVyIHdpdGggdGhlIHJlc3BvbnNpYmlsaXR5IHRvIGNhbGwgOmM6ZnVuYzpgUHlfREVDUkVGYCB3aGVuCiB0aGV5IGFyZSBkb25lIHdpdGggdGhlIHJlc3VsdDsgdGhpcyBzb29uIGJlY29tZXMgc2Vjb25kIG5hdHVyZS4KIAogCkBAIC0xODAsNyArMTgwLDcgQEAKIHJlZmVyZW5jZSIgbWVhbnMgYmVpbmcgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgUHlfREVDUkVGIG9uIGl0IHdoZW4gdGhlCiByZWZlcmVuY2UgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gIE93bmVyc2hpcCBjYW4gYWxzbyBiZSB0cmFuc2ZlcnJlZCwgbWVhbmluZyB0aGF0CiB0aGUgY29kZSB0aGF0IHJlY2VpdmVzIG93bmVyc2hpcCBvZiB0aGUgcmVmZXJlbmNlIHRoZW4gYmVjb21lcyByZXNwb25zaWJsZSBmb3IKLWV2ZW50dWFsbHkgZGVjcmVmJ2luZyBpdCBieSBjYWxsaW5nIDpjZnVuYzpgUHlfREVDUkVGYCBvciA6Y2Z1bmM6YFB5X1hERUNSRUZgCitldmVudHVhbGx5IGRlY3JlZidpbmcgaXQgYnkgY2FsbGluZyA6YzpmdW5jOmBQeV9ERUNSRUZgIG9yIDpjOmZ1bmM6YFB5X1hERUNSRUZgCiB3aGVuIGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZC0tLW9yIHBhc3Npbmcgb24gdGhpcyByZXNwb25zaWJpbGl0eSAodXN1YWxseSB0byBpdHMKIGNhbGxlcikuIFdoZW4gYSBmdW5jdGlvbiBwYXNzZXMgb3duZXJzaGlwIG9mIGEgcmVmZXJlbmNlIG9uIHRvIGl0cyBjYWxsZXIsIHRoZQogY2FsbGVyIGlzIHNhaWQgdG8gcmVjZWl2ZSBhICpuZXcqIHJlZmVyZW5jZS4gIFdoZW4gbm8gb3duZXJzaGlwIGlzIHRyYW5zZmVycmVkLApAQCAtMTk4LDcgKzE5OCw3IEBACiAgICBzaW5nbGU6IFB5VHVwbGVfU2V0SXRlbSgpCiAKIEZldyBmdW5jdGlvbnMgc3RlYWwgcmVmZXJlbmNlczsgdGhlIHR3byBub3RhYmxlIGV4Y2VwdGlvbnMgYXJlCi06Y2Z1bmM6YFB5TGlzdF9TZXRJdGVtYCBhbmQgOmNmdW5jOmBQeVR1cGxlX1NldEl0ZW1gLCB3aGljaCAgc3RlYWwgYSByZWZlcmVuY2UKKzpjOmZ1bmM6YFB5TGlzdF9TZXRJdGVtYCBhbmQgOmM6ZnVuYzpgUHlUdXBsZV9TZXRJdGVtYCwgd2hpY2ggIHN0ZWFsIGEgcmVmZXJlbmNlCiB0byB0aGUgaXRlbSAoYnV0IG5vdCB0byB0aGUgdHVwbGUgb3IgbGlzdCBpbnRvIHdoaWNoIHRoZSBpdGVtIGlzIHB1dCEpLiAgVGhlc2UKIGZ1bmN0aW9ucyB3ZXJlIGRlc2lnbmVkIHRvIHN0ZWFsIGEgcmVmZXJlbmNlIGJlY2F1c2Ugb2YgYSBjb21tb24gaWRpb20gZm9yCiBwb3B1bGF0aW5nIGEgdHVwbGUgb3IgbGlzdCB3aXRoIG5ld2x5IGNyZWF0ZWQgb2JqZWN0czsgZm9yIGV4YW1wbGUsIHRoZSBjb2RlIHRvCkBAIC0yMTIsMjEgKzIxMiwyMSBAQAogICAgUHlUdXBsZV9TZXRJdGVtKHQsIDEsIFB5SW50X0Zyb21Mb25nKDJMKSk7CiAgICBQeVR1cGxlX1NldEl0ZW0odCwgMiwgUHlTdHJpbmdfRnJvbVN0cmluZygidGhyZWUiKSk7CiAKLUhlcmUsIDpjZnVuYzpgUHlJbnRfRnJvbUxvbmdgIHJldHVybnMgYSBuZXcgcmVmZXJlbmNlIHdoaWNoIGlzIGltbWVkaWF0ZWx5Ci1zdG9sZW4gYnkgOmNmdW5jOmBQeVR1cGxlX1NldEl0ZW1gLiAgV2hlbiB5b3Ugd2FudCB0byBrZWVwIHVzaW5nIGFuIG9iamVjdAotYWx0aG91Z2ggdGhlIHJlZmVyZW5jZSB0byBpdCB3aWxsIGJlIHN0b2xlbiwgdXNlIDpjZnVuYzpgUHlfSU5DUkVGYCB0byBncmFiCitIZXJlLCA6YzpmdW5jOmBQeUludF9Gcm9tTG9uZ2AgcmV0dXJucyBhIG5ldyByZWZlcmVuY2Ugd2hpY2ggaXMgaW1tZWRpYXRlbHkKK3N0b2xlbiBieSA6YzpmdW5jOmBQeVR1cGxlX1NldEl0ZW1gLiAgV2hlbiB5b3Ugd2FudCB0byBrZWVwIHVzaW5nIGFuIG9iamVjdAorYWx0aG91Z2ggdGhlIHJlZmVyZW5jZSB0byBpdCB3aWxsIGJlIHN0b2xlbiwgdXNlIDpjOmZ1bmM6YFB5X0lOQ1JFRmAgdG8gZ3JhYgogYW5vdGhlciByZWZlcmVuY2UgYmVmb3JlIGNhbGxpbmcgdGhlIHJlZmVyZW5jZS1zdGVhbGluZyBmdW5jdGlvbi4KIAotSW5jaWRlbnRhbGx5LCA6Y2Z1bmM6YFB5VHVwbGVfU2V0SXRlbWAgaXMgdGhlICpvbmx5KiB3YXkgdG8gc2V0IHR1cGxlIGl0ZW1zOwotOmNmdW5jOmBQeVNlcXVlbmNlX1NldEl0ZW1gIGFuZCA6Y2Z1bmM6YFB5T2JqZWN0X1NldEl0ZW1gIHJlZnVzZSB0byBkbyB0aGlzCitJbmNpZGVudGFsbHksIDpjOmZ1bmM6YFB5VHVwbGVfU2V0SXRlbWAgaXMgdGhlICpvbmx5KiB3YXkgdG8gc2V0IHR1cGxlIGl0ZW1zOworOmM6ZnVuYzpgUHlTZXF1ZW5jZV9TZXRJdGVtYCBhbmQgOmM6ZnVuYzpgUHlPYmplY3RfU2V0SXRlbWAgcmVmdXNlIHRvIGRvIHRoaXMKIHNpbmNlIHR1cGxlcyBhcmUgYW4gaW1tdXRhYmxlIGRhdGEgdHlwZS4gIFlvdSBzaG91bGQgb25seSB1c2UKLTpjZnVuYzpgUHlUdXBsZV9TZXRJdGVtYCBmb3IgdHVwbGVzIHRoYXQgeW91IGFyZSBjcmVhdGluZyB5b3Vyc2VsZi4KKzpjOmZ1bmM6YFB5VHVwbGVfU2V0SXRlbWAgZm9yIHR1cGxlcyB0aGF0IHlvdSBhcmUgY3JlYXRpbmcgeW91cnNlbGYuCiAKLUVxdWl2YWxlbnQgY29kZSBmb3IgcG9wdWxhdGluZyBhIGxpc3QgY2FuIGJlIHdyaXR0ZW4gdXNpbmcgOmNmdW5jOmBQeUxpc3RfTmV3YAotYW5kIDpjZnVuYzpgUHlMaXN0X1NldEl0ZW1gLgorRXF1aXZhbGVudCBjb2RlIGZvciBwb3B1bGF0aW5nIGEgbGlzdCBjYW4gYmUgd3JpdHRlbiB1c2luZyA6YzpmdW5jOmBQeUxpc3RfTmV3YAorYW5kIDpjOmZ1bmM6YFB5TGlzdF9TZXRJdGVtYC4KIAogSG93ZXZlciwgaW4gcHJhY3RpY2UsIHlvdSB3aWxsIHJhcmVseSB1c2UgdGhlc2Ugd2F5cyBvZiBjcmVhdGluZyBhbmQgcG9wdWxhdGluZwotYSB0dXBsZSBvciBsaXN0LiAgVGhlcmUncyBhIGdlbmVyaWMgZnVuY3Rpb24sIDpjZnVuYzpgUHlfQnVpbGRWYWx1ZWAsIHRoYXQgY2FuCithIHR1cGxlIG9yIGxpc3QuICBUaGVyZSdzIGEgZ2VuZXJpYyBmdW5jdGlvbiwgOmM6ZnVuYzpgUHlfQnVpbGRWYWx1ZWAsIHRoYXQgY2FuCiBjcmVhdGUgbW9zdCBjb21tb24gb2JqZWN0cyBmcm9tIEMgdmFsdWVzLCBkaXJlY3RlZCBieSBhIDpkZm46YGZvcm1hdCBzdHJpbmdgLgogRm9yIGV4YW1wbGUsIHRoZSBhYm92ZSB0d28gYmxvY2tzIG9mIGNvZGUgY291bGQgYmUgcmVwbGFjZWQgYnkgdGhlIGZvbGxvd2luZwogKHdoaWNoIGFsc28gdGFrZXMgY2FyZSBvZiB0aGUgZXJyb3IgY2hlY2tpbmcpOjoKQEAgLTIzNiw3ICsyMzYsNyBAQAogICAgdHVwbGUgPSBQeV9CdWlsZFZhbHVlKCIoaWlzKSIsIDEsIDIsICJ0aHJlZSIpOwogICAgbGlzdCA9IFB5X0J1aWxkVmFsdWUoIltpaXNdIiwgMSwgMiwgInRocmVlIik7CiAKLUl0IGlzIG11Y2ggbW9yZSBjb21tb24gdG8gdXNlIDpjZnVuYzpgUHlPYmplY3RfU2V0SXRlbWAgYW5kIGZyaWVuZHMgd2l0aCBpdGVtcworSXQgaXMgbXVjaCBtb3JlIGNvbW1vbiB0byB1c2UgOmM6ZnVuYzpgUHlPYmplY3RfU2V0SXRlbWAgYW5kIGZyaWVuZHMgd2l0aCBpdGVtcwogd2hvc2UgcmVmZXJlbmNlcyB5b3UgYXJlIG9ubHkgYm9ycm93aW5nLCBsaWtlIGFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIGluIHRvCiB0aGUgZnVuY3Rpb24geW91IGFyZSB3cml0aW5nLiAgSW4gdGhhdCBjYXNlLCB0aGVpciBiZWhhdmlvdXIgcmVnYXJkaW5nIHJlZmVyZW5jZQogY291bnRzIGlzIG11Y2ggc2FuZXIsIHNpbmNlIHlvdSBkb24ndCBoYXZlIHRvIGluY3JlbWVudCBhIHJlZmVyZW5jZSBjb3VudCBzbyB5b3UKQEAgLTI1NSw4ICsyNTUsMTAgQEAKICAgICAgICAgICAgUHlPYmplY3QgKmluZGV4ID0gUHlJbnRfRnJvbUxvbmcoaSk7CiAgICAgICAgICAgIGlmICghaW5kZXgpCiAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgIGlmIChQeU9iamVjdF9TZXRJdGVtKHRhcmdldCwgaW5kZXgsIGl0ZW0pIDwgMCkKKyAgICAgICAgICAgaWYgKFB5T2JqZWN0X1NldEl0ZW0odGFyZ2V0LCBpbmRleCwgaXRlbSkgPCAwKSB7CisgICAgICAgICAgICAgICBQeV9ERUNSRUYoaW5kZXgpOwogICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgIH0KICAgICAgICAgICAgUHlfREVDUkVGKGluZGV4KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDA7CkBAIC0yNzAsMTUgKzI3MiwxNSBAQAogeW91IG93bmVyc2hpcCBvZiB0aGUgcmVmZXJlbmNlLiBUaGUgcmVhc29uIGlzIHNpbXBsZTogaW4gbWFueSBjYXNlcywgdGhlCiByZXR1cm5lZCBvYmplY3QgaXMgY3JlYXRlZCAgb24gdGhlIGZseSwgYW5kIHRoZSByZWZlcmVuY2UgeW91IGdldCBpcyB0aGUgb25seQogcmVmZXJlbmNlIHRvIHRoZSAgb2JqZWN0LiAgVGhlcmVmb3JlLCB0aGUgZ2VuZXJpYyBmdW5jdGlvbnMgdGhhdCByZXR1cm4gb2JqZWN0Ci1yZWZlcmVuY2VzLCBsaWtlIDpjZnVuYzpgUHlPYmplY3RfR2V0SXRlbWAgYW5kICA6Y2Z1bmM6YFB5U2VxdWVuY2VfR2V0SXRlbWAsCityZWZlcmVuY2VzLCBsaWtlIDpjOmZ1bmM6YFB5T2JqZWN0X0dldEl0ZW1gIGFuZCAgOmM6ZnVuYzpgUHlTZXF1ZW5jZV9HZXRJdGVtYCwKIGFsd2F5cyByZXR1cm4gYSBuZXcgcmVmZXJlbmNlICh0aGUgY2FsbGVyIGJlY29tZXMgdGhlIG93bmVyIG9mIHRoZSByZWZlcmVuY2UpLgogCiBJdCBpcyBpbXBvcnRhbnQgdG8gcmVhbGl6ZSB0aGF0IHdoZXRoZXIgeW91IG93biBhIHJlZmVyZW5jZSByZXR1cm5lZCAgYnkgYQogZnVuY3Rpb24gZGVwZW5kcyBvbiB3aGljaCBmdW5jdGlvbiB5b3UgY2FsbCBvbmx5IC0tLSAqdGhlIHBsdW1hZ2UqICh0aGUgdHlwZSBvZgogdGhlIG9iamVjdCBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gdGhlIGZ1bmN0aW9uKSAqZG9lc24ndCBlbnRlciBpbnRvIGl0ISoKLVRodXMsIGlmIHlvdSAgZXh0cmFjdCBhbiBpdGVtIGZyb20gYSBsaXN0IHVzaW5nIDpjZnVuYzpgUHlMaXN0X0dldEl0ZW1gLCB5b3UKK1RodXMsIGlmIHlvdSAgZXh0cmFjdCBhbiBpdGVtIGZyb20gYSBsaXN0IHVzaW5nIDpjOmZ1bmM6YFB5TGlzdF9HZXRJdGVtYCwgeW91CiBkb24ndCBvd24gdGhlIHJlZmVyZW5jZSAtLS0gYnV0IGlmIHlvdSBvYnRhaW4gdGhlIHNhbWUgaXRlbSBmcm9tIHRoZSBzYW1lIGxpc3QKLXVzaW5nIDpjZnVuYzpgUHlTZXF1ZW5jZV9HZXRJdGVtYCAod2hpY2ggaGFwcGVucyB0byB0YWtlIGV4YWN0bHkgdGhlIHNhbWUKK3VzaW5nIDpjOmZ1bmM6YFB5U2VxdWVuY2VfR2V0SXRlbWAgKHdoaWNoIGhhcHBlbnMgdG8gdGFrZSBleGFjdGx5IHRoZSBzYW1lCiBhcmd1bWVudHMpLCB5b3UgZG8gb3duIGEgcmVmZXJlbmNlIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCiAKIC4uIGluZGV4OjoKQEAgLTI4Niw4ICsyODgsOCBAQAogICAgc2luZ2xlOiBQeVNlcXVlbmNlX0dldEl0ZW0oKQogCiBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgaG93IHlvdSBjb3VsZCB3cml0ZSBhIGZ1bmN0aW9uIHRoYXQgY29tcHV0ZXMgdGhlIHN1bSBvZgotdGhlIGl0ZW1zIGluIGEgbGlzdCBvZiBpbnRlZ2Vyczsgb25jZSB1c2luZyAgOmNmdW5jOmBQeUxpc3RfR2V0SXRlbWAsIGFuZCBvbmNlCi11c2luZyA6Y2Z1bmM6YFB5U2VxdWVuY2VfR2V0SXRlbWAuIDo6Cit0aGUgaXRlbXMgaW4gYSBsaXN0IG9mIGludGVnZXJzOyBvbmNlIHVzaW5nICA6YzpmdW5jOmBQeUxpc3RfR2V0SXRlbWAsIGFuZCBvbmNlCit1c2luZyA6YzpmdW5jOmBQeVNlcXVlbmNlX0dldEl0ZW1gLiA6OgogCiAgICBsb25nCiAgICBzdW1fbGlzdChQeU9iamVjdCAqbGlzdCkKQEAgLTM0MCw4ICszNDIsOCBAQAogLS0tLS0KIAogVGhlcmUgYXJlIGZldyBvdGhlciBkYXRhIHR5cGVzIHRoYXQgcGxheSBhIHNpZ25pZmljYW50IHJvbGUgaW4gIHRoZSBQeXRob24vQwotQVBJOyBtb3N0IGFyZSBzaW1wbGUgQyB0eXBlcyBzdWNoIGFzIDpjdHlwZTpgaW50YCwgIDpjdHlwZTpgbG9uZ2AsCi06Y3R5cGU6YGRvdWJsZWAgYW5kIDpjdHlwZTpgY2hhclwqYC4gIEEgZmV3IHN0cnVjdHVyZSB0eXBlcyAgYXJlIHVzZWQgdG8KK0FQSTsgbW9zdCBhcmUgc2ltcGxlIEMgdHlwZXMgc3VjaCBhcyA6Yzp0eXBlOmBpbnRgLCAgOmM6dHlwZTpgbG9uZ2AsCis6Yzp0eXBlOmBkb3VibGVgIGFuZCA6Yzp0eXBlOmBjaGFyXCpgLiAgQSBmZXcgc3RydWN0dXJlIHR5cGVzICBhcmUgdXNlZCB0bwogZGVzY3JpYmUgc3RhdGljIHRhYmxlcyB1c2VkIHRvIGxpc3QgdGhlIGZ1bmN0aW9ucyBleHBvcnRlZCAgYnkgYSBtb2R1bGUgb3IgdGhlCiBkYXRhIGF0dHJpYnV0ZXMgb2YgYSBuZXcgb2JqZWN0IHR5cGUsIGFuZCBhbm90aGVyIGlzIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHZhbHVlCiBvZiBhIGNvbXBsZXggbnVtYmVyLiAgVGhlc2Ugd2lsbCAgYmUgZGlzY3Vzc2VkIHRvZ2V0aGVyIHdpdGggdGhlIGZ1bmN0aW9ucyB0aGF0CkBAIC0zNzAsNyArMzcyLDcgQEAKIEEgZmV3IGZ1bmN0aW9ucyByZXR1cm4gYSBCb29sZWFuIHRydWUvZmFsc2UgcmVzdWx0LCB3aXRoIGZhbHNlIGluZGljYXRpbmcgYW4KIGVycm9yLiAgVmVyeSBmZXcgZnVuY3Rpb25zIHJldHVybiBubyBleHBsaWNpdCBlcnJvciBpbmRpY2F0b3Igb3IgaGF2ZSBhbgogYW1iaWd1b3VzIHJldHVybiB2YWx1ZSwgYW5kIHJlcXVpcmUgZXhwbGljaXQgdGVzdGluZyBmb3IgZXJyb3JzIHdpdGgKLTpjZnVuYzpgUHlFcnJfT2NjdXJyZWRgLiAgVGhlc2UgZXhjZXB0aW9ucyBhcmUgYWx3YXlzIGV4cGxpY2l0bHkgZG9jdW1lbnRlZC4KKzpjOmZ1bmM6YFB5RXJyX09jY3VycmVkYC4gIFRoZXNlIGV4Y2VwdGlvbnMgYXJlIGFsd2F5cyBleHBsaWNpdGx5IGRvY3VtZW50ZWQuCiAKIC4uIGluZGV4OjoKICAgIHNpbmdsZTogUHlFcnJfU2V0U3RyaW5nKCkKQEAgLTM3OSwxMSArMzgxLDExIEBACiBFeGNlcHRpb24gc3RhdGUgaXMgbWFpbnRhaW5lZCBpbiBwZXItdGhyZWFkIHN0b3JhZ2UgKHRoaXMgaXMgIGVxdWl2YWxlbnQgdG8KIHVzaW5nIGdsb2JhbCBzdG9yYWdlIGluIGFuIHVudGhyZWFkZWQgYXBwbGljYXRpb24pLiAgQSAgdGhyZWFkIGNhbiBiZSBpbiBvbmUgb2YKIHR3byBzdGF0ZXM6IGFuIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQsIG9yIG5vdC4gVGhlIGZ1bmN0aW9uCi06Y2Z1bmM6YFB5RXJyX09jY3VycmVkYCBjYW4gYmUgdXNlZCB0byBjaGVjayBmb3IgdGhpczogaXQgcmV0dXJucyBhIGJvcnJvd2VkCis6YzpmdW5jOmBQeUVycl9PY2N1cnJlZGAgY2FuIGJlIHVzZWQgdG8gY2hlY2sgZm9yIHRoaXM6IGl0IHJldHVybnMgYSBib3Jyb3dlZAogcmVmZXJlbmNlIHRvIHRoZSBleGNlcHRpb24gdHlwZSBvYmplY3Qgd2hlbiBhbiBleGNlcHRpb24gaGFzIG9jY3VycmVkLCBhbmQKICpOVUxMKiBvdGhlcndpc2UuICBUaGVyZSBhcmUgYSBudW1iZXIgb2YgZnVuY3Rpb25zIHRvIHNldCB0aGUgZXhjZXB0aW9uIHN0YXRlOgotOmNmdW5jOmBQeUVycl9TZXRTdHJpbmdgIGlzIHRoZSBtb3N0IGNvbW1vbiAodGhvdWdoIG5vdCB0aGUgbW9zdCBnZW5lcmFsKQotZnVuY3Rpb24gdG8gc2V0IHRoZSBleGNlcHRpb24gc3RhdGUsIGFuZCA6Y2Z1bmM6YFB5RXJyX0NsZWFyYCBjbGVhcnMgdGhlCis6YzpmdW5jOmBQeUVycl9TZXRTdHJpbmdgIGlzIHRoZSBtb3N0IGNvbW1vbiAodGhvdWdoIG5vdCB0aGUgbW9zdCBnZW5lcmFsKQorZnVuY3Rpb24gdG8gc2V0IHRoZSBleGNlcHRpb24gc3RhdGUsIGFuZCA6YzpmdW5jOmBQeUVycl9DbGVhcmAgY2xlYXJzIHRoZQogZXhjZXB0aW9uIHN0YXRlLgogCiAuLiBpbmRleDo6CkBAIC00MjQsNyArNDI2LDcgQEAKIC4uIGluZGV4Ojogc2luZ2xlOiBzdW1fc2VxdWVuY2UoKQogCiBBIHNpbXBsZSBleGFtcGxlIG9mIGRldGVjdGluZyBleGNlcHRpb25zIGFuZCBwYXNzaW5nIHRoZW0gb24gaXMgc2hvd24gaW4gdGhlCi06Y2Z1bmM6YHN1bV9zZXF1ZW5jZWAgZXhhbXBsZSBhYm92ZS4gIEl0IHNvIGhhcHBlbnMgdGhhdCB0aGF0IGV4YW1wbGUgZG9lc24ndAorOmM6ZnVuYzpgc3VtX3NlcXVlbmNlYCBleGFtcGxlIGFib3ZlLiAgSXQgc28gaGFwcGVucyB0aGF0IHRoaXMgZXhhbXBsZSBkb2Vzbid0CiBuZWVkIHRvIGNsZWFuIHVwIGFueSBvd25lZCByZWZlcmVuY2VzIHdoZW4gaXQgZGV0ZWN0cyBhbiBlcnJvci4gIFRoZSBmb2xsb3dpbmcKIGV4YW1wbGUgZnVuY3Rpb24gc2hvd3Mgc29tZSBlcnJvciBjbGVhbnVwLiAgRmlyc3QsIHRvIHJlbWluZCB5b3Ugd2h5IHlvdSBsaWtlCiBQeXRob24sIHdlIHNob3cgdGhlIGVxdWl2YWxlbnQgUHl0aG9uIGNvZGU6OgpAQCAtNDkxLDEwICs0OTMsMTAgQEAKICAgIHNpbmdsZTogUHlfWERFQ1JFRigpCiAKIFRoaXMgZXhhbXBsZSByZXByZXNlbnRzIGFuIGVuZG9yc2VkIHVzZSBvZiB0aGUgYGBnb3RvYGAgc3RhdGVtZW50ICBpbiBDIQotSXQgaWxsdXN0cmF0ZXMgdGhlIHVzZSBvZiA6Y2Z1bmM6YFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXNgIGFuZAotOmNmdW5jOmBQeUVycl9DbGVhcmAgdG8gaGFuZGxlIHNwZWNpZmljIGV4Y2VwdGlvbnMsIGFuZCB0aGUgdXNlIG9mCi06Y2Z1bmM6YFB5X1hERUNSRUZgIHRvIGRpc3Bvc2Ugb2Ygb3duZWQgcmVmZXJlbmNlcyB0aGF0IG1heSBiZSAqTlVMTCogKG5vdGUgdGhlCi1gYCdYJ2BgIGluIHRoZSBuYW1lOyA6Y2Z1bmM6YFB5X0RFQ1JFRmAgd291bGQgY3Jhc2ggd2hlbiBjb25mcm9udGVkIHdpdGggYQorSXQgaWxsdXN0cmF0ZXMgdGhlIHVzZSBvZiA6YzpmdW5jOmBQeUVycl9FeGNlcHRpb25NYXRjaGVzYCBhbmQKKzpjOmZ1bmM6YFB5RXJyX0NsZWFyYCB0byBoYW5kbGUgc3BlY2lmaWMgZXhjZXB0aW9ucywgYW5kIHRoZSB1c2Ugb2YKKzpjOmZ1bmM6YFB5X1hERUNSRUZgIHRvIGRpc3Bvc2Ugb2Ygb3duZWQgcmVmZXJlbmNlcyB0aGF0IG1heSBiZSAqTlVMTCogKG5vdGUgdGhlCitgYCdYJ2BgIGluIHRoZSBuYW1lOyA6YzpmdW5jOmBQeV9ERUNSRUZgIHdvdWxkIGNyYXNoIHdoZW4gY29uZnJvbnRlZCB3aXRoIGEKICpOVUxMKiByZWZlcmVuY2UpLiAgSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIHZhcmlhYmxlcyB1c2VkIHRvIGhvbGQgb3duZWQKIHJlZmVyZW5jZXMgYXJlIGluaXRpYWxpemVkIHRvICpOVUxMKiBmb3IgdGhpcyB0byB3b3JrOyBsaWtld2lzZSwgdGhlIHByb3Bvc2VkCiByZXR1cm4gdmFsdWUgaXMgaW5pdGlhbGl6ZWQgdG8gYGAtMWBgIChmYWlsdXJlKSBhbmQgb25seSBzZXQgdG8gc3VjY2VzcyBhZnRlcgpAQCAtNTIwLDIwICs1MjIsMjAgQEAKICAgIHRyaXBsZTogbW9kdWxlOyBzZWFyY2g7IHBhdGgKICAgIHNpbmdsZTogcGF0aCAoaW4gbW9kdWxlIHN5cykKIAotVGhlIGJhc2ljIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGlzIDpjZnVuYzpgUHlfSW5pdGlhbGl6ZWAuIFRoaXMgaW5pdGlhbGl6ZXMKK1RoZSBiYXNpYyBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBpcyA6YzpmdW5jOmBQeV9Jbml0aWFsaXplYC4gVGhpcyBpbml0aWFsaXplcwogdGhlIHRhYmxlIG9mIGxvYWRlZCBtb2R1bGVzLCBhbmQgY3JlYXRlcyB0aGUgZnVuZGFtZW50YWwgbW9kdWxlcwogOm1vZDpgX19idWlsdGluX19gLCA6bW9kOmBfX21haW5fX2AsIDptb2Q6YHN5c2AsIGFuZCA6bW9kOmBleGNlcHRpb25zYC4gIEl0IGFsc28KIGluaXRpYWxpemVzIHRoZSBtb2R1bGUgc2VhcmNoIHBhdGggKGBgc3lzLnBhdGhgYCkuCiAKIC4uIGluZGV4Ojogc2luZ2xlOiBQeVN5c19TZXRBcmd2RXgoKQogCi06Y2Z1bmM6YFB5X0luaXRpYWxpemVgIGRvZXMgbm90IHNldCB0aGUgInNjcmlwdCBhcmd1bWVudCBsaXN0IiAgKGBgc3lzLmFyZ3ZgYCkuCis6YzpmdW5jOmBQeV9Jbml0aWFsaXplYCBkb2VzIG5vdCBzZXQgdGhlICJzY3JpcHQgYXJndW1lbnQgbGlzdCIgIChgYHN5cy5hcmd2YGApLgogSWYgdGhpcyB2YXJpYWJsZSBpcyBuZWVkZWQgYnkgUHl0aG9uIGNvZGUgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGxhdGVyLCBpdCBtdXN0CiBiZSBzZXQgZXhwbGljaXRseSB3aXRoIGEgY2FsbCB0byAgYGBQeVN5c19TZXRBcmd2RXgoYXJnYywgYXJndiwgdXBkYXRlcGF0aClgYAotYWZ0ZXIgdGhlIGNhbGwgdG8gOmNmdW5jOmBQeV9Jbml0aWFsaXplYC4KK2FmdGVyIHRoZSBjYWxsIHRvIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgLgogCiBPbiBtb3N0IHN5c3RlbXMgKGluIHBhcnRpY3VsYXIsIG9uIFVuaXggYW5kIFdpbmRvd3MsIGFsdGhvdWdoIHRoZSBkZXRhaWxzIGFyZQotc2xpZ2h0bHkgZGlmZmVyZW50KSwgOmNmdW5jOmBQeV9Jbml0aWFsaXplYCBjYWxjdWxhdGVzIHRoZSBtb2R1bGUgc2VhcmNoIHBhdGgKK3NsaWdodGx5IGRpZmZlcmVudCksIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgIGNhbGN1bGF0ZXMgdGhlIG1vZHVsZSBzZWFyY2ggcGF0aAogYmFzZWQgdXBvbiBpdHMgYmVzdCBndWVzcyBmb3IgdGhlIGxvY2F0aW9uIG9mIHRoZSBzdGFuZGFyZCBQeXRob24gaW50ZXJwcmV0ZXIKIGV4ZWN1dGFibGUsIGFzc3VtaW5nIHRoYXQgdGhlIFB5dGhvbiBsaWJyYXJ5IGlzIGZvdW5kIGluIGEgZml4ZWQgbG9jYXRpb24KIHJlbGF0aXZlIHRvIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgZXhlY3V0YWJsZS4gIEluIHBhcnRpY3VsYXIsIGl0IGxvb2tzIGZvciBhCkBAIC01NTcsMjIgKzU1OSwyMiBAQAogICAgc2luZ2xlOiBQeV9HZXRQcm9ncmFtRnVsbFBhdGgoKQogCiBUaGUgZW1iZWRkaW5nIGFwcGxpY2F0aW9uIGNhbiBzdGVlciB0aGUgc2VhcmNoIGJ5IGNhbGxpbmcKLWBgUHlfU2V0UHJvZ3JhbU5hbWUoZmlsZSlgYCAqYmVmb3JlKiBjYWxsaW5nICA6Y2Z1bmM6YFB5X0luaXRpYWxpemVgLiAgTm90ZSB0aGF0CitgYFB5X1NldFByb2dyYW1OYW1lKGZpbGUpYGAgKmJlZm9yZSogY2FsbGluZyAgOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAuICBOb3RlIHRoYXQKIDplbnZ2YXI6YFBZVEhPTkhPTUVgIHN0aWxsIG92ZXJyaWRlcyB0aGlzIGFuZCA6ZW52dmFyOmBQWVRIT05QQVRIYCBpcyBzdGlsbAogaW5zZXJ0ZWQgaW4gZnJvbnQgb2YgdGhlIHN0YW5kYXJkIHBhdGguICBBbiBhcHBsaWNhdGlvbiB0aGF0IHJlcXVpcmVzIHRvdGFsCi1jb250cm9sIGhhcyB0byBwcm92aWRlIGl0cyBvd24gaW1wbGVtZW50YXRpb24gb2YgOmNmdW5jOmBQeV9HZXRQYXRoYCwKLTpjZnVuYzpgUHlfR2V0UHJlZml4YCwgOmNmdW5jOmBQeV9HZXRFeGVjUHJlZml4YCwgYW5kCi06Y2Z1bmM6YFB5X0dldFByb2dyYW1GdWxsUGF0aGAgKGFsbCBkZWZpbmVkIGluIDpmaWxlOmBNb2R1bGVzL2dldHBhdGguY2ApLgorY29udHJvbCBoYXMgdG8gcHJvdmlkZSBpdHMgb3duIGltcGxlbWVudGF0aW9uIG9mIDpjOmZ1bmM6YFB5X0dldFBhdGhgLAorOmM6ZnVuYzpgUHlfR2V0UHJlZml4YCwgOmM6ZnVuYzpgUHlfR2V0RXhlY1ByZWZpeGAsIGFuZAorOmM6ZnVuYzpgUHlfR2V0UHJvZ3JhbUZ1bGxQYXRoYCAoYWxsIGRlZmluZWQgaW4gOmZpbGU6YE1vZHVsZXMvZ2V0cGF0aC5jYCkuCiAKIC4uIGluZGV4Ojogc2luZ2xlOiBQeV9Jc0luaXRpYWxpemVkKCkKIAogU29tZXRpbWVzLCBpdCBpcyBkZXNpcmFibGUgdG8gInVuaW5pdGlhbGl6ZSIgUHl0aG9uLiAgRm9yIGluc3RhbmNlLCAgdGhlCiBhcHBsaWNhdGlvbiBtYXkgd2FudCB0byBzdGFydCBvdmVyIChtYWtlIGFub3RoZXIgY2FsbCB0bwotOmNmdW5jOmBQeV9Jbml0aWFsaXplYCkgb3IgdGhlIGFwcGxpY2F0aW9uIGlzIHNpbXBseSBkb25lIHdpdGggaXRzICB1c2Ugb2YKKzpjOmZ1bmM6YFB5X0luaXRpYWxpemVgKSBvciB0aGUgYXBwbGljYXRpb24gaXMgc2ltcGx5IGRvbmUgd2l0aCBpdHMgIHVzZSBvZgogUHl0aG9uIGFuZCB3YW50cyB0byBmcmVlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgUHl0aG9uLiAgVGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkCi1ieSBjYWxsaW5nIDpjZnVuYzpgUHlfRmluYWxpemVgLiAgVGhlIGZ1bmN0aW9uIDpjZnVuYzpgUHlfSXNJbml0aWFsaXplZGAgcmV0dXJucworYnkgY2FsbGluZyA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAuICBUaGUgZnVuY3Rpb24gOmM6ZnVuYzpgUHlfSXNJbml0aWFsaXplZGAgcmV0dXJucwogdHJ1ZSBpZiBQeXRob24gaXMgY3VycmVudGx5IGluIHRoZSBpbml0aWFsaXplZCBzdGF0ZS4gIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQKLXRoZXNlIGZ1bmN0aW9ucyBpcyBnaXZlbiBpbiBhIGxhdGVyIGNoYXB0ZXIuIE5vdGljZSB0aGF0IDpjZnVuYzpgUHlfRmluYWxpemVgCit0aGVzZSBmdW5jdGlvbnMgaXMgZ2l2ZW4gaW4gYSBsYXRlciBjaGFwdGVyLiBOb3RpY2UgdGhhdCA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAKIGRvZXMgKm5vdCogZnJlZSBhbGwgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGUgUHl0aG9uIGludGVycHJldGVyLCBlLmcuIG1lbW9yeQogYWxsb2NhdGVkIGJ5IGV4dGVuc2lvbiBtb2R1bGVzIGN1cnJlbnRseSBjYW5ub3QgYmUgcmVsZWFzZWQuCiAKQEAgLTU5MiwxMSArNTk0LDExIEBACiBhbGxvY2F0b3IsIG9yIGxvdy1sZXZlbCBwcm9maWxpbmcgb2YgdGhlIG1haW4gaW50ZXJwcmV0ZXIgbG9vcC4gIE9ubHkgdGhlIG1vc3QKIGZyZXF1ZW50bHktdXNlZCBidWlsZHMgd2lsbCBiZSBkZXNjcmliZWQgaW4gdGhlIHJlbWFpbmRlciBvZiB0aGlzIHNlY3Rpb24uCiAKLUNvbXBpbGluZyB0aGUgaW50ZXJwcmV0ZXIgd2l0aCB0aGUgOmNtYWNybzpgUHlfREVCVUdgIG1hY3JvIGRlZmluZWQgcHJvZHVjZXMKLXdoYXQgaXMgZ2VuZXJhbGx5IG1lYW50IGJ5ICJhIGRlYnVnIGJ1aWxkIiBvZiBQeXRob24uIDpjbWFjcm86YFB5X0RFQlVHYCBpcworQ29tcGlsaW5nIHRoZSBpbnRlcnByZXRlciB3aXRoIHRoZSA6YzptYWNybzpgUHlfREVCVUdgIG1hY3JvIGRlZmluZWQgcHJvZHVjZXMKK3doYXQgaXMgZ2VuZXJhbGx5IG1lYW50IGJ5ICJhIGRlYnVnIGJ1aWxkIiBvZiBQeXRob24uIDpjOm1hY3JvOmBQeV9ERUJVR2AgaXMKIGVuYWJsZWQgaW4gdGhlIFVuaXggYnVpbGQgYnkgYWRkaW5nIGBgLS13aXRoLXB5ZGVidWdgYCB0byB0aGUKIDpmaWxlOmAuL2NvbmZpZ3VyZWAgY29tbWFuZC4gIEl0IGlzIGFsc28gaW1wbGllZCBieSB0aGUgcHJlc2VuY2Ugb2YgdGhlCi1ub3QtUHl0aG9uLXNwZWNpZmljIDpjbWFjcm86YF9ERUJVR2AgbWFjcm8uICBXaGVuIDpjbWFjcm86YFB5X0RFQlVHYCBpcyBlbmFibGVkCitub3QtUHl0aG9uLXNwZWNpZmljIDpjOm1hY3JvOmBfREVCVUdgIG1hY3JvLiAgV2hlbiA6YzptYWNybzpgUHlfREVCVUdgIGlzIGVuYWJsZWQKIGluIHRoZSBVbml4IGJ1aWxkLCBjb21waWxlciBvcHRpbWl6YXRpb24gaXMgZGlzYWJsZWQuCiAKIEluIGFkZGl0aW9uIHRvIHRoZSByZWZlcmVuY2UgY291bnQgZGVidWdnaW5nIGRlc2NyaWJlZCBiZWxvdywgdGhlIGZvbGxvd2luZwpAQCAtNjI1LDExICs2MjcsMTEgQEAKIAogVGhlcmUgbWF5IGJlIGFkZGl0aW9uYWwgY2hlY2tzIG5vdCBtZW50aW9uZWQgaGVyZS4KIAotRGVmaW5pbmcgOmNtYWNybzpgUHlfVFJBQ0VfUkVGU2AgZW5hYmxlcyByZWZlcmVuY2UgdHJhY2luZy4gIFdoZW4gZGVmaW5lZCwgYQorRGVmaW5pbmcgOmM6bWFjcm86YFB5X1RSQUNFX1JFRlNgIGVuYWJsZXMgcmVmZXJlbmNlIHRyYWNpbmcuICBXaGVuIGRlZmluZWQsIGEKIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdCBvZiBhY3RpdmUgb2JqZWN0cyBpcyBtYWludGFpbmVkIGJ5IGFkZGluZyB0d28gZXh0cmEKLWZpZWxkcyB0byBldmVyeSA6Y3R5cGU6YFB5T2JqZWN0YC4gIFRvdGFsIGFsbG9jYXRpb25zIGFyZSB0cmFja2VkIGFzIHdlbGwuICBVcG9uCitmaWVsZHMgdG8gZXZlcnkgOmM6dHlwZTpgUHlPYmplY3RgLiAgVG90YWwgYWxsb2NhdGlvbnMgYXJlIHRyYWNrZWQgYXMgd2VsbC4gIFVwb24KIGV4aXQsIGFsbCBleGlzdGluZyByZWZlcmVuY2VzIGFyZSBwcmludGVkLiAgKEluIGludGVyYWN0aXZlIG1vZGUgdGhpcyBoYXBwZW5zCi1hZnRlciBldmVyeSBzdGF0ZW1lbnQgcnVuIGJ5IHRoZSBpbnRlcnByZXRlci4pICBJbXBsaWVkIGJ5IDpjbWFjcm86YFB5X0RFQlVHYC4KK2FmdGVyIGV2ZXJ5IHN0YXRlbWVudCBydW4gYnkgdGhlIGludGVycHJldGVyLikgIEltcGxpZWQgYnkgOmM6bWFjcm86YFB5X0RFQlVHYC4KIAogUGxlYXNlIHJlZmVyIHRvIDpmaWxlOmBNaXNjL1NwZWNpYWxCdWlsZHMudHh0YCBpbiB0aGUgUHl0aG9uIHNvdXJjZSBkaXN0cmlidXRpb24KIGZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uLgpkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL2l0ZXIucnN0IGIvRG9jL2MtYXBpL2l0ZXIucnN0CmluZGV4IDU2MGNkOTMuLjhkMTU2N2MgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS9pdGVyLnJzdAorKysgYi9Eb2MvYy1hcGkvaXRlci5yc3QKQEAgLTcsMjEgKzcsMjAgQEAKIAogLi4gdmVyc2lvbmFkZGVkOjogMi4yCiAKLVRoZXJlIGFyZSBvbmx5IGEgY291cGxlIG9mIGZ1bmN0aW9ucyBzcGVjaWZpY2FsbHkgZm9yIHdvcmtpbmcgd2l0aCBpdGVyYXRvcnMuCitUaGVyZSBhcmUgdHdvIGZ1bmN0aW9ucyBzcGVjaWZpY2FsbHkgZm9yIHdvcmtpbmcgd2l0aCBpdGVyYXRvcnMuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5SXRlcl9DaGVjayhQeU9iamVjdCAqbykKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlJdGVyX0NoZWNrKFB5T2JqZWN0ICpvKQogCiAgICBSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0ICpvKiBzdXBwb3J0cyB0aGUgaXRlcmF0b3IgcHJvdG9jb2wuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5SXRlcl9OZXh0KFB5T2JqZWN0ICpvKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUl0ZXJfTmV4dChQeU9iamVjdCAqbykKIAotICAgUmV0dXJuIHRoZSBuZXh0IHZhbHVlIGZyb20gdGhlIGl0ZXJhdGlvbiAqbyouICBJZiB0aGUgb2JqZWN0IGlzIGFuIGl0ZXJhdG9yLAotICAgdGhpcyByZXRyaWV2ZXMgdGhlIG5leHQgdmFsdWUgZnJvbSB0aGUgaXRlcmF0aW9uLCBhbmQgcmV0dXJucyAqTlVMTCogd2l0aCBubwotICAgZXhjZXB0aW9uIHNldCBpZiB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIGl0ZW1zLiAgSWYgdGhlIG9iamVjdCBpcyBub3QgYW4KLSAgIGl0ZXJhdG9yLCA6ZXhjOmBUeXBlRXJyb3JgIGlzIHJhaXNlZCwgb3IgaWYgdGhlcmUgaXMgYW4gZXJyb3IgaW4gcmV0cmlldmluZyB0aGUKLSAgIGl0ZW0sIHJldHVybnMgKk5VTEwqIGFuZCBwYXNzZXMgYWxvbmcgdGhlIGV4Y2VwdGlvbi4KKyAgIFJldHVybiB0aGUgbmV4dCB2YWx1ZSBmcm9tIHRoZSBpdGVyYXRpb24gKm8qLiAgVGhlIG9iamVjdCBtdXN0IGJlIGFuIGl0ZXJhdG9yCisgICAoaXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBjaGVjayB0aGlzKS4gIElmIHRoZXJlIGFyZSBubyByZW1haW5pbmcgdmFsdWVzLAorICAgcmV0dXJucyAqTlVMTCogd2l0aCBubyBleGNlcHRpb24gc2V0LiAgSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHJldHJpZXZpbmcKKyAgIHRoZSBpdGVtLCByZXR1cm5zICpOVUxMKiBhbmQgcGFzc2VzIGFsb25nIHRoZSBleGNlcHRpb24uCiAKIFRvIHdyaXRlIGEgbG9vcCB3aGljaCBpdGVyYXRlcyBvdmVyIGFuIGl0ZXJhdG9yLCB0aGUgQyBjb2RlIHNob3VsZCBsb29rCiBzb21ldGhpbmcgbGlrZSB0aGlzOjoKZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9pdGVyYXRvci5yc3QgYi9Eb2MvYy1hcGkvaXRlcmF0b3IucnN0CmluZGV4IGNkMmZhMzMuLjM5MzFiYjkgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS9pdGVyYXRvci5yc3QKKysrIGIvRG9jL2MtYXBpL2l0ZXJhdG9yLnJzdApAQCAtMTIsMjMgKzEyLDIzIEBACiBzZW50aW5lbCB2YWx1ZSBpcyByZXR1cm5lZC4KIAogCi0uLiBjdmFyOjogUHlUeXBlT2JqZWN0IFB5U2VxSXRlcl9UeXBlCisuLiBjOnZhcjo6IFB5VHlwZU9iamVjdCBQeVNlcUl0ZXJfVHlwZQogCi0gICBUeXBlIG9iamVjdCBmb3IgaXRlcmF0b3Igb2JqZWN0cyByZXR1cm5lZCBieSA6Y2Z1bmM6YFB5U2VxSXRlcl9OZXdgIGFuZCB0aGUKKyAgIFR5cGUgb2JqZWN0IGZvciBpdGVyYXRvciBvYmplY3RzIHJldHVybmVkIGJ5IDpjOmZ1bmM6YFB5U2VxSXRlcl9OZXdgIGFuZCB0aGUKICAgIG9uZS1hcmd1bWVudCBmb3JtIG9mIHRoZSA6ZnVuYzpgaXRlcmAgYnVpbHQtaW4gZnVuY3Rpb24gZm9yIGJ1aWx0LWluIHNlcXVlbmNlCiAgICB0eXBlcy4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4yCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5U2VxSXRlcl9DaGVjayhvcCkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlTZXFJdGVyX0NoZWNrKG9wKQogCi0gICBSZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBvZiAqb3AqIGlzIDpjZGF0YTpgUHlTZXFJdGVyX1R5cGVgLgorICAgUmV0dXJuIHRydWUgaWYgdGhlIHR5cGUgb2YgKm9wKiBpcyA6YzpkYXRhOmBQeVNlcUl0ZXJfVHlwZWAuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVNlcUl0ZXJfTmV3KFB5T2JqZWN0ICpzZXEpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5U2VxSXRlcl9OZXcoUHlPYmplY3QgKnNlcSkKIAogICAgUmV0dXJuIGFuIGl0ZXJhdG9yIHRoYXQgd29ya3Mgd2l0aCBhIGdlbmVyYWwgc2VxdWVuY2Ugb2JqZWN0LCAqc2VxKi4gIFRoZQogICAgaXRlcmF0aW9uIGVuZHMgd2hlbiB0aGUgc2VxdWVuY2UgcmFpc2VzIDpleGM6YEluZGV4RXJyb3JgIGZvciB0aGUgc3Vic2NyaXB0aW5nCkBAIC0zNywyMiArMzcsMjIgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMgogCiAKLS4uIGN2YXI6OiBQeVR5cGVPYmplY3QgUHlDYWxsSXRlcl9UeXBlCisuLiBjOnZhcjo6IFB5VHlwZU9iamVjdCBQeUNhbGxJdGVyX1R5cGUKIAotICAgVHlwZSBvYmplY3QgZm9yIGl0ZXJhdG9yIG9iamVjdHMgcmV0dXJuZWQgYnkgOmNmdW5jOmBQeUNhbGxJdGVyX05ld2AgYW5kIHRoZQorICAgVHlwZSBvYmplY3QgZm9yIGl0ZXJhdG9yIG9iamVjdHMgcmV0dXJuZWQgYnkgOmM6ZnVuYzpgUHlDYWxsSXRlcl9OZXdgIGFuZCB0aGUKICAgIHR3by1hcmd1bWVudCBmb3JtIG9mIHRoZSA6ZnVuYzpgaXRlcmAgYnVpbHQtaW4gZnVuY3Rpb24uCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUNhbGxJdGVyX0NoZWNrKG9wKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUNhbGxJdGVyX0NoZWNrKG9wKQogCi0gICBSZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBvZiAqb3AqIGlzIDpjZGF0YTpgUHlDYWxsSXRlcl9UeXBlYC4KKyAgIFJldHVybiB0cnVlIGlmIHRoZSB0eXBlIG9mICpvcCogaXMgOmM6ZGF0YTpgUHlDYWxsSXRlcl9UeXBlYC4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4yCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5Q2FsbEl0ZXJfTmV3KFB5T2JqZWN0ICpjYWxsYWJsZSwgUHlPYmplY3QgKnNlbnRpbmVsKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUNhbGxJdGVyX05ldyhQeU9iamVjdCAqY2FsbGFibGUsIFB5T2JqZWN0ICpzZW50aW5lbCkKIAogICAgUmV0dXJuIGEgbmV3IGl0ZXJhdG9yLiAgVGhlIGZpcnN0IHBhcmFtZXRlciwgKmNhbGxhYmxlKiwgY2FuIGJlIGFueSBQeXRob24KICAgIGNhbGxhYmxlIG9iamVjdCB0aGF0IGNhbiBiZSBjYWxsZWQgd2l0aCBubyBwYXJhbWV0ZXJzOyBlYWNoIGNhbGwgdG8gaXQgc2hvdWxkCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvbGlzdC5yc3QgYi9Eb2MvYy1hcGkvbGlzdC5yc3QKaW5kZXggZDI0YWE3Mi4uMGFlZDBmMyAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL2xpc3QucnN0CisrKyBiL0RvYy9jLWFwaS9saXN0LnJzdApAQCAtOCwxOCArOCwxOCBAQAogLi4gaW5kZXg6OiBvYmplY3Q6IGxpc3QKIAogCi0uLiBjdHlwZTo6IFB5TGlzdE9iamVjdAorLi4gYzp0eXBlOjogUHlMaXN0T2JqZWN0CiAKLSAgIFRoaXMgc3VidHlwZSBvZiA6Y3R5cGU6YFB5T2JqZWN0YCByZXByZXNlbnRzIGEgUHl0aG9uIGxpc3Qgb2JqZWN0LgorICAgVGhpcyBzdWJ0eXBlIG9mIDpjOnR5cGU6YFB5T2JqZWN0YCByZXByZXNlbnRzIGEgUHl0aG9uIGxpc3Qgb2JqZWN0LgogCiAKLS4uIGN2YXI6OiBQeVR5cGVPYmplY3QgUHlMaXN0X1R5cGUKKy4uIGM6dmFyOjogUHlUeXBlT2JqZWN0IFB5TGlzdF9UeXBlCiAKLSAgIFRoaXMgaW5zdGFuY2Ugb2YgOmN0eXBlOmBQeVR5cGVPYmplY3RgIHJlcHJlc2VudHMgdGhlIFB5dGhvbiBsaXN0IHR5cGUuICBUaGlzCisgICBUaGlzIGluc3RhbmNlIG9mIDpjOnR5cGU6YFB5VHlwZU9iamVjdGAgcmVwcmVzZW50cyB0aGUgUHl0aG9uIGxpc3QgdHlwZS4gIFRoaXMKICAgIGlzIHRoZSBzYW1lIG9iamVjdCBhcyBgYGxpc3RgYCBpbiB0aGUgUHl0aG9uIGxheWVyLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUxpc3RfQ2hlY2soUHlPYmplY3QgKnApCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5TGlzdF9DaGVjayhQeU9iamVjdCAqcCkKIAogICAgUmV0dXJuIHRydWUgaWYgKnAqIGlzIGEgbGlzdCBvYmplY3Qgb3IgYW4gaW5zdGFuY2Ugb2YgYSBzdWJ0eXBlIG9mIHRoZSBsaXN0CiAgICB0eXBlLgpAQCAtMjgsNyArMjgsNyBAQAogICAgICAgQWxsb3dlZCBzdWJ0eXBlcyB0byBiZSBhY2NlcHRlZC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlMaXN0X0NoZWNrRXhhY3QoUHlPYmplY3QgKnApCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5TGlzdF9DaGVja0V4YWN0KFB5T2JqZWN0ICpwKQogCiAgICBSZXR1cm4gdHJ1ZSBpZiAqcCogaXMgYSBsaXN0IG9iamVjdCwgYnV0IG5vdCBhbiBpbnN0YW5jZSBvZiBhIHN1YnR5cGUgb2YKICAgIHRoZSBsaXN0IHR5cGUuCkBAIC0zNiw3ICszNiw3IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjIKIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlMaXN0X05ldyhQeV9zc2l6ZV90IGxlbikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlMaXN0X05ldyhQeV9zc2l6ZV90IGxlbikKIAogICAgUmV0dXJuIGEgbmV3IGxpc3Qgb2YgbGVuZ3RoICpsZW4qIG9uIHN1Y2Nlc3MsIG9yICpOVUxMKiBvbiBmYWlsdXJlLgogCkBAIC00NCwxNSArNDQsMTUgQEAKIAogICAgICAgSWYgKmxlbiogaXMgZ3JlYXRlciB0aGFuIHplcm8sIHRoZSByZXR1cm5lZCBsaXN0IG9iamVjdCdzIGl0ZW1zIGFyZQogICAgICAgc2V0IHRvIGBgTlVMTGBgLiAgVGh1cyB5b3UgY2Fubm90IHVzZSBhYnN0cmFjdCBBUEkgZnVuY3Rpb25zIHN1Y2ggYXMKLSAgICAgIDpjZnVuYzpgUHlTZXF1ZW5jZV9TZXRJdGVtYCAgb3IgZXhwb3NlIHRoZSBvYmplY3QgdG8gUHl0aG9uIGNvZGUgYmVmb3JlCi0gICAgICBzZXR0aW5nIGFsbCBpdGVtcyB0byBhIHJlYWwgb2JqZWN0IHdpdGggOmNmdW5jOmBQeUxpc3RfU2V0SXRlbWAuCisgICAgICA6YzpmdW5jOmBQeVNlcXVlbmNlX1NldEl0ZW1gICBvciBleHBvc2UgdGhlIG9iamVjdCB0byBQeXRob24gY29kZSBiZWZvcmUKKyAgICAgIHNldHRpbmcgYWxsIGl0ZW1zIHRvIGEgcmVhbCBvYmplY3Qgd2l0aCA6YzpmdW5jOmBQeUxpc3RfU2V0SXRlbWAuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnRgIGZvciAqc2l6ZSouIFRoaXMgbWlnaHQgcmVxdWlyZQorICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjOnR5cGU6YGludGAgZm9yICpzaXplKi4gVGhpcyBtaWdodCByZXF1aXJlCiAgICAgICBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeV9zc2l6ZV90IFB5TGlzdF9TaXplKFB5T2JqZWN0ICpsaXN0KQorLi4gYzpmdW5jdGlvbjo6IFB5X3NzaXplX3QgUHlMaXN0X1NpemUoUHlPYmplY3QgKmxpc3QpCiAKICAgIC4uIGluZGV4OjogYnVpbHRpbjogbGVuCiAKQEAgLTYwLDIwICs2MCwyMCBAQAogICAgYGBsZW4obGlzdClgYCBvbiBhIGxpc3Qgb2JqZWN0LgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5lZCBhbiA6Y3R5cGU6YGludGAuIFRoaXMgbWlnaHQgcmVxdWlyZSBjaGFuZ2VzIGluCisgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybmVkIGFuIDpjOnR5cGU6YGludGAuIFRoaXMgbWlnaHQgcmVxdWlyZSBjaGFuZ2VzIGluCiAgICAgICB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlfc3NpemVfdCBQeUxpc3RfR0VUX1NJWkUoUHlPYmplY3QgKmxpc3QpCisuLiBjOmZ1bmN0aW9uOjogUHlfc3NpemVfdCBQeUxpc3RfR0VUX1NJWkUoUHlPYmplY3QgKmxpc3QpCiAKLSAgIE1hY3JvIGZvcm0gb2YgOmNmdW5jOmBQeUxpc3RfU2l6ZWAgd2l0aG91dCBlcnJvciBjaGVja2luZy4KKyAgIE1hY3JvIGZvcm0gb2YgOmM6ZnVuYzpgUHlMaXN0X1NpemVgIHdpdGhvdXQgZXJyb3IgY2hlY2tpbmcuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIG1hY3JvIHJldHVybmVkIGFuIDpjdHlwZTpgaW50YC4gVGhpcyBtaWdodCByZXF1aXJlIGNoYW5nZXMgaW4geW91cgorICAgICAgVGhpcyBtYWNybyByZXR1cm5lZCBhbiA6Yzp0eXBlOmBpbnRgLiBUaGlzIG1pZ2h0IHJlcXVpcmUgY2hhbmdlcyBpbiB5b3VyCiAgICAgICBjb2RlIGZvciBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUxpc3RfR2V0SXRlbShQeU9iamVjdCAqbGlzdCwgUHlfc3NpemVfdCBpbmRleCkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlMaXN0X0dldEl0ZW0oUHlPYmplY3QgKmxpc3QsIFB5X3NzaXplX3QgaW5kZXgpCiAKICAgIFJldHVybiB0aGUgb2JqZWN0IGF0IHBvc2l0aW9uICppbmRleCogaW4gdGhlIGxpc3QgcG9pbnRlZCB0byBieSAqbGlzdCouICBUaGUKICAgIHBvc2l0aW9uIG11c3QgYmUgcG9zaXRpdmUsIGluZGV4aW5nIGZyb20gdGhlIGVuZCBvZiB0aGUgbGlzdCBpcyBub3QKQEAgLTgxLDIwICs4MSwyMCBAQAogICAgOmV4YzpgSW5kZXhFcnJvcmAgZXhjZXB0aW9uLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjdHlwZTpgaW50YCBmb3IgKmluZGV4Ki4gVGhpcyBtaWdodCByZXF1aXJlCisgICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmM6dHlwZTpgaW50YCBmb3IgKmluZGV4Ki4gVGhpcyBtaWdodCByZXF1aXJlCiAgICAgICBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlMaXN0X0dFVF9JVEVNKFB5T2JqZWN0ICpsaXN0LCBQeV9zc2l6ZV90IGkpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5TGlzdF9HRVRfSVRFTShQeU9iamVjdCAqbGlzdCwgUHlfc3NpemVfdCBpKQogCi0gICBNYWNybyBmb3JtIG9mIDpjZnVuYzpgUHlMaXN0X0dldEl0ZW1gIHdpdGhvdXQgZXJyb3IgY2hlY2tpbmcuCisgICBNYWNybyBmb3JtIG9mIDpjOmZ1bmM6YFB5TGlzdF9HZXRJdGVtYCB3aXRob3V0IGVycm9yIGNoZWNraW5nLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBtYWNybyB1c2VkIGFuIDpjdHlwZTpgaW50YCBmb3IgKmkqLiBUaGlzIG1pZ2h0IHJlcXVpcmUgY2hhbmdlcyBpbgorICAgICAgVGhpcyBtYWNybyB1c2VkIGFuIDpjOnR5cGU6YGludGAgZm9yICppKi4gVGhpcyBtaWdodCByZXF1aXJlIGNoYW5nZXMgaW4KICAgICAgIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlMaXN0X1NldEl0ZW0oUHlPYmplY3QgKmxpc3QsIFB5X3NzaXplX3QgaW5kZXgsIFB5T2JqZWN0ICppdGVtKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUxpc3RfU2V0SXRlbShQeU9iamVjdCAqbGlzdCwgUHlfc3NpemVfdCBpbmRleCwgUHlPYmplY3QgKml0ZW0pCiAKICAgIFNldCB0aGUgaXRlbSBhdCBpbmRleCAqaW5kZXgqIGluIGxpc3QgdG8gKml0ZW0qLiAgUmV0dXJuIGBgMGBgIG9uIHN1Y2Nlc3MKICAgIG9yIGBgLTFgYCBvbiBmYWlsdXJlLgpAQCAtMTA1LDQ2ICsxMDUsNDYgQEAKICAgICAgIGFuIGl0ZW0gYWxyZWFkeSBpbiB0aGUgbGlzdCBhdCB0aGUgYWZmZWN0ZWQgcG9zaXRpb24uCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnRgIGZvciAqaW5kZXgqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIGZvciAqaW5kZXgqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKICAgICAgIGNoYW5nZXMgaW4geW91ciBjb2RlIGZvciBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgUHlMaXN0X1NFVF9JVEVNKFB5T2JqZWN0ICpsaXN0LCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICpvKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlMaXN0X1NFVF9JVEVNKFB5T2JqZWN0ICpsaXN0LCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICpvKQogCi0gICBNYWNybyBmb3JtIG9mIDpjZnVuYzpgUHlMaXN0X1NldEl0ZW1gIHdpdGhvdXQgZXJyb3IgY2hlY2tpbmcuIFRoaXMgaXMKKyAgIE1hY3JvIGZvcm0gb2YgOmM6ZnVuYzpgUHlMaXN0X1NldEl0ZW1gIHdpdGhvdXQgZXJyb3IgY2hlY2tpbmcuIFRoaXMgaXMKICAgIG5vcm1hbGx5IG9ubHkgdXNlZCB0byBmaWxsIGluIG5ldyBsaXN0cyB3aGVyZSB0aGVyZSBpcyBubyBwcmV2aW91cyBjb250ZW50LgogCiAgICAuLiBub3RlOjoKIAogICAgICAgVGhpcyBtYWNybyAic3RlYWxzIiBhIHJlZmVyZW5jZSB0byAqaXRlbSosIGFuZCwgdW5saWtlCi0gICAgICA6Y2Z1bmM6YFB5TGlzdF9TZXRJdGVtYCwgZG9lcyAqbm90KiBkaXNjYXJkIGEgcmVmZXJlbmNlIHRvIGFueSBpdGVtIHRoYXQKKyAgICAgIDpjOmZ1bmM6YFB5TGlzdF9TZXRJdGVtYCwgZG9lcyAqbm90KiBkaXNjYXJkIGEgcmVmZXJlbmNlIHRvIGFueSBpdGVtIHRoYXQKICAgICAgIGl0IGJlaW5nIHJlcGxhY2VkOyBhbnkgcmVmZXJlbmNlIGluICpsaXN0KiBhdCBwb3NpdGlvbiAqaSogd2lsbCBiZQogICAgICAgbGVha2VkLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBtYWNybyB1c2VkIGFuIDpjdHlwZTpgaW50YCBmb3IgKmkqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKKyAgICAgIFRoaXMgbWFjcm8gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIGZvciAqaSouIFRoaXMgbWlnaHQgcmVxdWlyZQogICAgICAgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5TGlzdF9JbnNlcnQoUHlPYmplY3QgKmxpc3QsIFB5X3NzaXplX3QgaW5kZXgsIFB5T2JqZWN0ICppdGVtKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUxpc3RfSW5zZXJ0KFB5T2JqZWN0ICpsaXN0LCBQeV9zc2l6ZV90IGluZGV4LCBQeU9iamVjdCAqaXRlbSkKIAogICAgSW5zZXJ0IHRoZSBpdGVtICppdGVtKiBpbnRvIGxpc3QgKmxpc3QqIGluIGZyb250IG9mIGluZGV4ICppbmRleCouICBSZXR1cm4KICAgIGBgMGBgIGlmIHN1Y2Nlc3NmdWw7IHJldHVybiBgYC0xYGAgYW5kIHNldCBhbiBleGNlcHRpb24gaWYgdW5zdWNjZXNzZnVsLgogICAgQW5hbG9nb3VzIHRvIGBgbGlzdC5pbnNlcnQoaW5kZXgsIGl0ZW0pYGAuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnRgIGZvciAqaW5kZXgqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIGZvciAqaW5kZXgqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKICAgICAgIGNoYW5nZXMgaW4geW91ciBjb2RlIGZvciBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUxpc3RfQXBwZW5kKFB5T2JqZWN0ICpsaXN0LCBQeU9iamVjdCAqaXRlbSkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlMaXN0X0FwcGVuZChQeU9iamVjdCAqbGlzdCwgUHlPYmplY3QgKml0ZW0pCiAKICAgIEFwcGVuZCB0aGUgb2JqZWN0ICppdGVtKiBhdCB0aGUgZW5kIG9mIGxpc3QgKmxpc3QqLiBSZXR1cm4gYGAwYGAgaWYKICAgIHN1Y2Nlc3NmdWw7IHJldHVybiBgYC0xYGAgYW5kIHNldCBhbiBleGNlcHRpb24gaWYgdW5zdWNjZXNzZnVsLiAgQW5hbG9nb3VzCiAgICB0byBgYGxpc3QuYXBwZW5kKGl0ZW0pYGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TGlzdF9HZXRTbGljZShQeU9iamVjdCAqbGlzdCwgUHlfc3NpemVfdCBsb3csIFB5X3NzaXplX3QgaGlnaCkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlMaXN0X0dldFNsaWNlKFB5T2JqZWN0ICpsaXN0LCBQeV9zc2l6ZV90IGxvdywgUHlfc3NpemVfdCBoaWdoKQogCiAgICBSZXR1cm4gYSBsaXN0IG9mIHRoZSBvYmplY3RzIGluICpsaXN0KiBjb250YWluaW5nIHRoZSBvYmplY3RzICpiZXR3ZWVuKiAqbG93KgogICAgYW5kICpoaWdoKi4gIFJldHVybiAqTlVMTCogYW5kIHNldCBhbiBleGNlcHRpb24gaWYgdW5zdWNjZXNzZnVsLiAgQW5hbG9nb3VzCkBAIC0xNTIsMTEgKzE1MiwxMSBAQAogICAgc3VwcG9ydGVkLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjdHlwZTpgaW50YCBmb3IgKmxvdyogYW5kICpoaWdoKi4gVGhpcyBtaWdodAorICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjOnR5cGU6YGludGAgZm9yICpsb3cqIGFuZCAqaGlnaCouIFRoaXMgbWlnaHQKICAgICAgIHJlcXVpcmUgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5TGlzdF9TZXRTbGljZShQeU9iamVjdCAqbGlzdCwgUHlfc3NpemVfdCBsb3csIFB5X3NzaXplX3QgaGlnaCwgUHlPYmplY3QgKml0ZW1saXN0KQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUxpc3RfU2V0U2xpY2UoUHlPYmplY3QgKmxpc3QsIFB5X3NzaXplX3QgbG93LCBQeV9zc2l6ZV90IGhpZ2gsIFB5T2JqZWN0ICppdGVtbGlzdCkKIAogICAgU2V0IHRoZSBzbGljZSBvZiAqbGlzdCogYmV0d2VlbiAqbG93KiBhbmQgKmhpZ2gqIHRvIHRoZSBjb250ZW50cyBvZgogICAgKml0ZW1saXN0Ki4gIEFuYWxvZ291cyB0byBgYGxpc3RbbG93OmhpZ2hdID0gaXRlbWxpc3RgYC4gVGhlICppdGVtbGlzdCogbWF5CkBAIC0xNjUsMjMgKzE2NSwyMyBAQAogICAgc2xpY2luZyBmcm9tIFB5dGhvbiwgYXJlIG5vdCBzdXBwb3J0ZWQuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnRgIGZvciAqbG93KiBhbmQgKmhpZ2gqLiBUaGlzIG1pZ2h0CisgICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmM6dHlwZTpgaW50YCBmb3IgKmxvdyogYW5kICpoaWdoKi4gVGhpcyBtaWdodAogICAgICAgcmVxdWlyZSBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlMaXN0X1NvcnQoUHlPYmplY3QgKmxpc3QpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5TGlzdF9Tb3J0KFB5T2JqZWN0ICpsaXN0KQogCiAgICBTb3J0IHRoZSBpdGVtcyBvZiAqbGlzdCogaW4gcGxhY2UuICBSZXR1cm4gYGAwYGAgb24gc3VjY2VzcywgYGAtMWBgIG9uCiAgICBmYWlsdXJlLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBgbGlzdC5zb3J0KClgYC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlMaXN0X1JldmVyc2UoUHlPYmplY3QgKmxpc3QpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5TGlzdF9SZXZlcnNlKFB5T2JqZWN0ICpsaXN0KQogCiAgICBSZXZlcnNlIHRoZSBpdGVtcyBvZiAqbGlzdCogaW4gcGxhY2UuICBSZXR1cm4gYGAwYGAgb24gc3VjY2VzcywgYGAtMWBgIG9uCiAgICBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiBgYGxpc3QucmV2ZXJzZSgpYGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TGlzdF9Bc1R1cGxlKFB5T2JqZWN0ICpsaXN0KQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUxpc3RfQXNUdXBsZShQeU9iamVjdCAqbGlzdCkKIAogICAgLi4gaW5kZXg6OiBidWlsdGluOiB0dXBsZQogCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvbG9uZy5yc3QgYi9Eb2MvYy1hcGkvbG9uZy5yc3QKaW5kZXggMTFkMjkwOC4uNWE4ZTUxZCAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL2xvbmcucnN0CisrKyBiL0RvYy9jLWFwaS9sb25nLnJzdApAQCAtOCwxMDAgKzgsMTAwIEBACiAuLiBpbmRleDo6IG9iamVjdDogbG9uZyBpbnRlZ2VyCiAKIAotLi4gY3R5cGU6OiBQeUxvbmdPYmplY3QKKy4uIGM6dHlwZTo6IFB5TG9uZ09iamVjdAogCi0gICBUaGlzIHN1YnR5cGUgb2YgOmN0eXBlOmBQeU9iamVjdGAgcmVwcmVzZW50cyBhIFB5dGhvbiBsb25nIGludGVnZXIgb2JqZWN0LgorICAgVGhpcyBzdWJ0eXBlIG9mIDpjOnR5cGU6YFB5T2JqZWN0YCByZXByZXNlbnRzIGEgUHl0aG9uIGxvbmcgaW50ZWdlciBvYmplY3QuCiAKIAotLi4gY3Zhcjo6IFB5VHlwZU9iamVjdCBQeUxvbmdfVHlwZQorLi4gYzp2YXI6OiBQeVR5cGVPYmplY3QgUHlMb25nX1R5cGUKIAogICAgLi4gaW5kZXg6OiBzaW5nbGU6IExvbmdUeXBlIChpbiBtb2R1bGVzIHR5cGVzKQogCi0gICBUaGlzIGluc3RhbmNlIG9mIDpjdHlwZTpgUHlUeXBlT2JqZWN0YCByZXByZXNlbnRzIHRoZSBQeXRob24gbG9uZyBpbnRlZ2VyIHR5cGUuCisgICBUaGlzIGluc3RhbmNlIG9mIDpjOnR5cGU6YFB5VHlwZU9iamVjdGAgcmVwcmVzZW50cyB0aGUgUHl0aG9uIGxvbmcgaW50ZWdlciB0eXBlLgogICAgVGhpcyBpcyB0aGUgc2FtZSBvYmplY3QgYXMgYGBsb25nYGAgYW5kIGBgdHlwZXMuTG9uZ1R5cGVgYC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlMb25nX0NoZWNrKFB5T2JqZWN0ICpwKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUxvbmdfQ2hlY2soUHlPYmplY3QgKnApCiAKLSAgIFJldHVybiB0cnVlIGlmIGl0cyBhcmd1bWVudCBpcyBhIDpjdHlwZTpgUHlMb25nT2JqZWN0YCBvciBhIHN1YnR5cGUgb2YKLSAgIDpjdHlwZTpgUHlMb25nT2JqZWN0YC4KKyAgIFJldHVybiB0cnVlIGlmIGl0cyBhcmd1bWVudCBpcyBhIDpjOnR5cGU6YFB5TG9uZ09iamVjdGAgb3IgYSBzdWJ0eXBlIG9mCisgICA6Yzp0eXBlOmBQeUxvbmdPYmplY3RgLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuMgogICAgICAgQWxsb3dlZCBzdWJ0eXBlcyB0byBiZSBhY2NlcHRlZC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlMb25nX0NoZWNrRXhhY3QoUHlPYmplY3QgKnApCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5TG9uZ19DaGVja0V4YWN0KFB5T2JqZWN0ICpwKQogCi0gICBSZXR1cm4gdHJ1ZSBpZiBpdHMgYXJndW1lbnQgaXMgYSA6Y3R5cGU6YFB5TG9uZ09iamVjdGAsIGJ1dCBub3QgYSBzdWJ0eXBlIG9mCi0gICA6Y3R5cGU6YFB5TG9uZ09iamVjdGAuCisgICBSZXR1cm4gdHJ1ZSBpZiBpdHMgYXJndW1lbnQgaXMgYSA6Yzp0eXBlOmBQeUxvbmdPYmplY3RgLCBidXQgbm90IGEgc3VidHlwZSBvZgorICAgOmM6dHlwZTpgUHlMb25nT2JqZWN0YC4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4yCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TG9uZ19Gcm9tTG9uZyhsb25nIHYpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5TG9uZ19Gcm9tTG9uZyhsb25nIHYpCiAKLSAgIFJldHVybiBhIG5ldyA6Y3R5cGU6YFB5TG9uZ09iamVjdGAgb2JqZWN0IGZyb20gKnYqLCBvciAqTlVMTCogb24gZmFpbHVyZS4KKyAgIFJldHVybiBhIG5ldyA6Yzp0eXBlOmBQeUxvbmdPYmplY3RgIG9iamVjdCBmcm9tICp2Kiwgb3IgKk5VTEwqIG9uIGZhaWx1cmUuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHVuc2lnbmVkIGxvbmcgdikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlMb25nX0Zyb21VbnNpZ25lZExvbmcodW5zaWduZWQgbG9uZyB2KQogCi0gICBSZXR1cm4gYSBuZXcgOmN0eXBlOmBQeUxvbmdPYmplY3RgIG9iamVjdCBmcm9tIGEgQyA6Y3R5cGU6YHVuc2lnbmVkIGxvbmdgLCBvcgorICAgUmV0dXJuIGEgbmV3IDpjOnR5cGU6YFB5TG9uZ09iamVjdGAgb2JqZWN0IGZyb20gYSBDIDpjOnR5cGU6YHVuc2lnbmVkIGxvbmdgLCBvcgogICAgKk5VTEwqIG9uIGZhaWx1cmUuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TG9uZ19Gcm9tU3NpemVfdChQeV9zc2l6ZV90IHYpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5TG9uZ19Gcm9tU3NpemVfdChQeV9zc2l6ZV90IHYpCiAKLSAgIFJldHVybiBhIG5ldyA6Y3R5cGU6YFB5TG9uZ09iamVjdGAgb2JqZWN0IGZyb20gYSBDIDpjdHlwZTpgUHlfc3NpemVfdGAsIG9yCisgICBSZXR1cm4gYSBuZXcgOmM6dHlwZTpgUHlMb25nT2JqZWN0YCBvYmplY3QgZnJvbSBhIEMgOmM6dHlwZTpgUHlfc3NpemVfdGAsIG9yCiAgICAqTlVMTCogb24gZmFpbHVyZS4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi42CiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TG9uZ19Gcm9tU2l6ZV90KHNpemVfdCB2KQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUxvbmdfRnJvbVNpemVfdChzaXplX3QgdikKIAotICAgUmV0dXJuIGEgbmV3IDpjdHlwZTpgUHlMb25nT2JqZWN0YCBvYmplY3QgZnJvbSBhIEMgOmN0eXBlOmBzaXplX3RgLCBvcgorICAgUmV0dXJuIGEgbmV3IDpjOnR5cGU6YFB5TG9uZ09iamVjdGAgb2JqZWN0IGZyb20gYSBDIDpjOnR5cGU6YHNpemVfdGAsIG9yCiAgICAqTlVMTCogb24gZmFpbHVyZS4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi42CiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TG9uZ19Gcm9tU3NpemVfdChQeV9zc2l6ZV90IHYpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5TG9uZ19Gcm9tU3NpemVfdChQeV9zc2l6ZV90IHYpCiAKLSAgIFJldHVybiBhIG5ldyA6Y3R5cGU6YFB5TG9uZ09iamVjdGAgb2JqZWN0IHdpdGggYSB2YWx1ZSBvZiAqdiosIG9yICpOVUxMKgorICAgUmV0dXJuIGEgbmV3IDpjOnR5cGU6YFB5TG9uZ09iamVjdGAgb2JqZWN0IHdpdGggYSB2YWx1ZSBvZiAqdiosIG9yICpOVUxMKgogICAgb24gZmFpbHVyZS4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi42CiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TG9uZ19Gcm9tU2l6ZV90KHNpemVfdCB2KQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUxvbmdfRnJvbVNpemVfdChzaXplX3QgdikKIAotICAgUmV0dXJuIGEgbmV3IDpjdHlwZTpgUHlMb25nT2JqZWN0YCBvYmplY3Qgd2l0aCBhIHZhbHVlIG9mICp2Kiwgb3IgKk5VTEwqCisgICBSZXR1cm4gYSBuZXcgOmM6dHlwZTpgUHlMb25nT2JqZWN0YCBvYmplY3Qgd2l0aCBhIHZhbHVlIG9mICp2Kiwgb3IgKk5VTEwqCiAgICBvbiBmYWlsdXJlLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjYKIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlMb25nX0Zyb21Mb25nTG9uZyhQWV9MT05HX0xPTkcgdikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlMb25nX0Zyb21Mb25nTG9uZyhQWV9MT05HX0xPTkcgdikKIAotICAgUmV0dXJuIGEgbmV3IDpjdHlwZTpgUHlMb25nT2JqZWN0YCBvYmplY3QgZnJvbSBhIEMgOmN0eXBlOmBsb25nIGxvbmdgLCBvciAqTlVMTCoKKyAgIFJldHVybiBhIG5ldyA6Yzp0eXBlOmBQeUxvbmdPYmplY3RgIG9iamVjdCBmcm9tIGEgQyA6Yzp0eXBlOmBsb25nIGxvbmdgLCBvciAqTlVMTCoKICAgIG9uIGZhaWx1cmUuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyh1bnNpZ25lZCBQWV9MT05HX0xPTkcgdikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB2KQogCi0gICBSZXR1cm4gYSBuZXcgOmN0eXBlOmBQeUxvbmdPYmplY3RgIG9iamVjdCBmcm9tIGEgQyA6Y3R5cGU6YHVuc2lnbmVkIGxvbmcgbG9uZ2AsCisgICBSZXR1cm4gYSBuZXcgOmM6dHlwZTpgUHlMb25nT2JqZWN0YCBvYmplY3QgZnJvbSBhIEMgOmM6dHlwZTpgdW5zaWduZWQgbG9uZyBsb25nYCwKICAgIG9yICpOVUxMKiBvbiBmYWlsdXJlLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUxvbmdfRnJvbURvdWJsZShkb3VibGUgdikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlMb25nX0Zyb21Eb3VibGUoZG91YmxlIHYpCiAKLSAgIFJldHVybiBhIG5ldyA6Y3R5cGU6YFB5TG9uZ09iamVjdGAgb2JqZWN0IGZyb20gdGhlIGludGVnZXIgcGFydCBvZiAqdiosIG9yCisgICBSZXR1cm4gYSBuZXcgOmM6dHlwZTpgUHlMb25nT2JqZWN0YCBvYmplY3QgZnJvbSB0aGUgaW50ZWdlciBwYXJ0IG9mICp2Kiwgb3IKICAgICpOVUxMKiBvbiBmYWlsdXJlLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUxvbmdfRnJvbVN0cmluZyhjaGFyICpzdHIsIGNoYXIgKipwZW5kLCBpbnQgYmFzZSkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlMb25nX0Zyb21TdHJpbmcoY2hhciAqc3RyLCBjaGFyICoqcGVuZCwgaW50IGJhc2UpCiAKLSAgIFJldHVybiBhIG5ldyA6Y3R5cGU6YFB5TG9uZ09iamVjdGAgYmFzZWQgb24gdGhlIHN0cmluZyB2YWx1ZSBpbiAqc3RyKiwgd2hpY2ggaXMKKyAgIFJldHVybiBhIG5ldyA6Yzp0eXBlOmBQeUxvbmdPYmplY3RgIGJhc2VkIG9uIHRoZSBzdHJpbmcgdmFsdWUgaW4gKnN0ciosIHdoaWNoIGlzCiAgICBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gdGhlIHJhZGl4IGluICpiYXNlKi4gIElmICpwZW5kKiBpcyBub24tKk5VTEwqLAogICAgKlwqcGVuZCogd2lsbCBwb2ludCB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIGluICpzdHIqIHdoaWNoIGZvbGxvd3MgdGhlCiAgICByZXByZXNlbnRhdGlvbiBvZiB0aGUgbnVtYmVyLiAgSWYgKmJhc2UqIGlzIGBgMGBgLCB0aGUgcmFkaXggd2lsbCBiZSBkZXRlcm1pbmVkCkBAIC0xMTIsNyArMTEyLDcgQEAKICAgIG5vIGRpZ2l0cywgOmV4YzpgVmFsdWVFcnJvcmAgd2lsbCBiZSByYWlzZWQuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TG9uZ19Gcm9tVW5pY29kZShQeV9VTklDT0RFICp1LCBQeV9zc2l6ZV90IGxlbmd0aCwgaW50IGJhc2UpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5TG9uZ19Gcm9tVW5pY29kZShQeV9VTklDT0RFICp1LCBQeV9zc2l6ZV90IGxlbmd0aCwgaW50IGJhc2UpCiAKICAgIENvbnZlcnQgYSBzZXF1ZW5jZSBvZiBVbmljb2RlIGRpZ2l0cyB0byBhIFB5dGhvbiBsb25nIGludGVnZXIgdmFsdWUuICBUaGUgZmlyc3QKICAgIHBhcmFtZXRlciwgKnUqLCBwb2ludHMgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgVW5pY29kZSBzdHJpbmcsICpsZW5ndGgqCkBAIC0xMjMsMTQgKzEyMywxNCBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMS42CiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnRgIGZvciAqbGVuZ3RoKi4gVGhpcyBtaWdodCByZXF1aXJlCisgICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmM6dHlwZTpgaW50YCBmb3IgKmxlbmd0aCouIFRoaXMgbWlnaHQgcmVxdWlyZQogICAgICAgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TG9uZ19Gcm9tVm9pZFB0cih2b2lkICpwKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUxvbmdfRnJvbVZvaWRQdHIodm9pZCAqcCkKIAogICAgQ3JlYXRlIGEgUHl0aG9uIGludGVnZXIgb3IgbG9uZyBpbnRlZ2VyIGZyb20gdGhlIHBvaW50ZXIgKnAqLiBUaGUgcG9pbnRlciB2YWx1ZQotICAgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSByZXN1bHRpbmcgdmFsdWUgdXNpbmcgOmNmdW5jOmBQeUxvbmdfQXNWb2lkUHRyYC4KKyAgIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVzdWx0aW5nIHZhbHVlIHVzaW5nIDpjOmZ1bmM6YFB5TG9uZ19Bc1ZvaWRQdHJgLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjUuMgogCkBAIC0xMzgsMjAgKzEzOCwyMCBAQAogICAgICAgSWYgdGhlIGludGVnZXIgaXMgbGFyZ2VyIHRoYW4gTE9OR19NQVgsIGEgcG9zaXRpdmUgbG9uZyBpbnRlZ2VyIGlzIHJldHVybmVkLgogCiAKLS4uIGNmdW5jdGlvbjo6IGxvbmcgUHlMb25nX0FzTG9uZyhQeU9iamVjdCAqcHlsb25nKQorLi4gYzpmdW5jdGlvbjo6IGxvbmcgUHlMb25nX0FzTG9uZyhQeU9iamVjdCAqcHlsb25nKQogCiAgICAuLiBpbmRleDo6CiAgICAgICBzaW5nbGU6IExPTkdfTUFYCiAgICAgICBzaW5nbGU6IE92ZXJmbG93RXJyb3IgKGJ1aWx0LWluIGV4Y2VwdGlvbikKIAotICAgUmV0dXJuIGEgQyA6Y3R5cGU6YGxvbmdgIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb250ZW50cyBvZiAqcHlsb25nKi4gIElmCisgICBSZXR1cm4gYSBDIDpjOnR5cGU6YGxvbmdgIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb250ZW50cyBvZiAqcHlsb25nKi4gIElmCiAgICAqcHlsb25nKiBpcyBncmVhdGVyIHRoYW4gOmNvbnN0OmBMT05HX01BWGAsIGFuIDpleGM6YE92ZXJmbG93RXJyb3JgIGlzIHJhaXNlZAogICAgYW5kIGBgLTFgYCB3aWxsIGJlIHJldHVybmVkLgogCiAKLS4uIGNmdW5jdGlvbjo6IGxvbmcgUHlMb25nX0FzTG9uZ0FuZE92ZXJmbG93KFB5T2JqZWN0ICpweWxvbmcsIGludCAqb3ZlcmZsb3cpCisuLiBjOmZ1bmN0aW9uOjogbG9uZyBQeUxvbmdfQXNMb25nQW5kT3ZlcmZsb3coUHlPYmplY3QgKnB5bG9uZywgaW50ICpvdmVyZmxvdykKIAotICAgUmV0dXJuIGEgQyA6Y3R5cGU6YGxvbmdgIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb250ZW50cyBvZgorICAgUmV0dXJuIGEgQyA6Yzp0eXBlOmBsb25nYCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29udGVudHMgb2YKICAgICpweWxvbmcqLiAgSWYgKnB5bG9uZyogaXMgZ3JlYXRlciB0aGFuIDpjb25zdDpgTE9OR19NQVhgIG9yIGxlc3MKICAgIHRoYW4gOmNvbnN0OmBMT05HX01JTmAsIHNldCAqXCpvdmVyZmxvdyogdG8gYGAxYGAgb3IgYGAtMWBgLAogICAgcmVzcGVjdGl2ZWx5LCBhbmQgcmV0dXJuIGBgLTFgYDsgb3RoZXJ3aXNlLCBzZXQgKlwqb3ZlcmZsb3cqIHRvCkBAIC0xNjIsOSArMTYyLDkgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNwogCiAKLS4uIGNmdW5jdGlvbjo6IFBZX0xPTkdfTE9ORyBQeUxvbmdfQXNMb25nTG9uZ0FuZE92ZXJmbG93KFB5T2JqZWN0ICpweWxvbmcsIGludCAqb3ZlcmZsb3cpCisuLiBjOmZ1bmN0aW9uOjogUFlfTE9OR19MT05HIFB5TG9uZ19Bc0xvbmdMb25nQW5kT3ZlcmZsb3coUHlPYmplY3QgKnB5bG9uZywgaW50ICpvdmVyZmxvdykKIAotICAgUmV0dXJuIGEgQyA6Y3R5cGU6YGxvbmcgbG9uZ2AgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbnRlbnRzIG9mCisgICBSZXR1cm4gYSBDIDpjOnR5cGU6YGxvbmcgbG9uZ2AgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbnRlbnRzIG9mCiAgICAqcHlsb25nKi4gIElmICpweWxvbmcqIGlzIGdyZWF0ZXIgdGhhbiA6Y29uc3Q6YFBZX0xMT05HX01BWGAgb3IgbGVzcwogICAgdGhhbiA6Y29uc3Q6YFBZX0xMT05HX01JTmAsIHNldCAqXCpvdmVyZmxvdyogdG8gYGAxYGAgb3IgYGAtMWBgLAogICAgcmVzcGVjdGl2ZWx5LCBhbmQgcmV0dXJuIGBgLTFgYDsgb3RoZXJ3aXNlLCBzZXQgKlwqb3ZlcmZsb3cqIHRvCkBAIC0xNzUsNjEgKzE3NSw2MSBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi43CiAKIAotLi4gY2Z1bmN0aW9uOjogUHlfc3NpemVfdCBQeUxvbmdfQXNTc2l6ZV90KFB5T2JqZWN0ICpweWxvbmcpCisuLiBjOmZ1bmN0aW9uOjogUHlfc3NpemVfdCBQeUxvbmdfQXNTc2l6ZV90KFB5T2JqZWN0ICpweWxvbmcpCiAKICAgIC4uIGluZGV4OjoKICAgICAgIHNpbmdsZTogUFlfU1NJWkVfVF9NQVgKICAgICAgIHNpbmdsZTogT3ZlcmZsb3dFcnJvciAoYnVpbHQtaW4gZXhjZXB0aW9uKQogCi0gICBSZXR1cm4gYSBDIDpjdHlwZTpgUHlfc3NpemVfdGAgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbnRlbnRzIG9mICpweWxvbmcqLiAgSWYKKyAgIFJldHVybiBhIEMgOmM6dHlwZTpgUHlfc3NpemVfdGAgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbnRlbnRzIG9mICpweWxvbmcqLiAgSWYKICAgICpweWxvbmcqIGlzIGdyZWF0ZXIgdGhhbiA6Y29uc3Q6YFBZX1NTSVpFX1RfTUFYYCwgYW4gOmV4YzpgT3ZlcmZsb3dFcnJvcmAgaXMgcmFpc2VkCiAgICBhbmQgYGAtMWBgIHdpbGwgYmUgcmV0dXJuZWQuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNgogCiAKLS4uIGNmdW5jdGlvbjo6IHVuc2lnbmVkIGxvbmcgUHlMb25nX0FzVW5zaWduZWRMb25nKFB5T2JqZWN0ICpweWxvbmcpCisuLiBjOmZ1bmN0aW9uOjogdW5zaWduZWQgbG9uZyBQeUxvbmdfQXNVbnNpZ25lZExvbmcoUHlPYmplY3QgKnB5bG9uZykKIAogICAgLi4gaW5kZXg6OgogICAgICAgc2luZ2xlOiBVTE9OR19NQVgKICAgICAgIHNpbmdsZTogT3ZlcmZsb3dFcnJvciAoYnVpbHQtaW4gZXhjZXB0aW9uKQogCi0gICBSZXR1cm4gYSBDIDpjdHlwZTpgdW5zaWduZWQgbG9uZ2AgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbnRlbnRzIG9mICpweWxvbmcqLgorICAgUmV0dXJuIGEgQyA6Yzp0eXBlOmB1bnNpZ25lZCBsb25nYCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29udGVudHMgb2YgKnB5bG9uZyouCiAgICBJZiAqcHlsb25nKiBpcyBncmVhdGVyIHRoYW4gOmNvbnN0OmBVTE9OR19NQVhgLCBhbiA6ZXhjOmBPdmVyZmxvd0Vycm9yYCBpcwogICAgcmFpc2VkLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5X3NzaXplX3QgUHlMb25nX0FzU3NpemVfdChQeU9iamVjdCAqcHlsb25nKQorLi4gYzpmdW5jdGlvbjo6IFB5X3NzaXplX3QgUHlMb25nX0FzU3NpemVfdChQeU9iamVjdCAqcHlsb25nKQogCiAgICAuLiBpbmRleDo6CiAgICAgICBzaW5nbGU6IFBZX1NTSVpFX1RfTUFYCiAKLSAgIFJldHVybiBhIDpjdHlwZTpgUHlfc3NpemVfdGAgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbnRlbnRzIG9mICpweWxvbmcqLiAgSWYKKyAgIFJldHVybiBhIDpjOnR5cGU6YFB5X3NzaXplX3RgIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb250ZW50cyBvZiAqcHlsb25nKi4gIElmCiAgICAqcHlsb25nKiBpcyBncmVhdGVyIHRoYW4gOmNvbnN0OmBQWV9TU0laRV9UX01BWGAsIGFuIDpleGM6YE92ZXJmbG93RXJyb3JgIGlzCiAgICByYWlzZWQuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNgogCiAKLS4uIGNmdW5jdGlvbjo6IFBZX0xPTkdfTE9ORyBQeUxvbmdfQXNMb25nTG9uZyhQeU9iamVjdCAqcHlsb25nKQorLi4gYzpmdW5jdGlvbjo6IFBZX0xPTkdfTE9ORyBQeUxvbmdfQXNMb25nTG9uZyhQeU9iamVjdCAqcHlsb25nKQogCiAgICAuLiBpbmRleDo6CiAgICAgICBzaW5nbGU6IE92ZXJmbG93RXJyb3IgKGJ1aWx0LWluIGV4Y2VwdGlvbikKIAotICAgUmV0dXJuIGEgQyA6Y3R5cGU6YGxvbmcgbG9uZ2AgZnJvbSBhIFB5dGhvbiBsb25nIGludGVnZXIuICBJZgotICAgKnB5bG9uZyogY2Fubm90IGJlIHJlcHJlc2VudGVkIGFzIGEgOmN0eXBlOmBsb25nIGxvbmdgLCBhbgorICAgUmV0dXJuIGEgQyA6Yzp0eXBlOmBsb25nIGxvbmdgIGZyb20gYSBQeXRob24gbG9uZyBpbnRlZ2VyLiAgSWYKKyAgICpweWxvbmcqIGNhbm5vdCBiZSByZXByZXNlbnRlZCBhcyBhIDpjOnR5cGU6YGxvbmcgbG9uZ2AsIGFuCiAgICA6ZXhjOmBPdmVyZmxvd0Vycm9yYCBpcyByYWlzZWQgYW5kIGBgLTFgYCBpcyByZXR1cm5lZC4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4yCiAKIAotLi4gY2Z1bmN0aW9uOjogdW5zaWduZWQgUFlfTE9OR19MT05HIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcoUHlPYmplY3QgKnB5bG9uZykKKy4uIGM6ZnVuY3Rpb246OiB1bnNpZ25lZCBQWV9MT05HX0xPTkcgUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZyhQeU9iamVjdCAqcHlsb25nKQogCiAgICAuLiBpbmRleDo6CiAgICAgICBzaW5nbGU6IE92ZXJmbG93RXJyb3IgKGJ1aWx0LWluIGV4Y2VwdGlvbikKIAotICAgUmV0dXJuIGEgQyA6Y3R5cGU6YHVuc2lnbmVkIGxvbmcgbG9uZ2AgZnJvbSBhIFB5dGhvbiBsb25nIGludGVnZXIuIElmCi0gICAqcHlsb25nKiBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXMgYW4gOmN0eXBlOmB1bnNpZ25lZCBsb25nIGxvbmdgLCBhbgorICAgUmV0dXJuIGEgQyA6Yzp0eXBlOmB1bnNpZ25lZCBsb25nIGxvbmdgIGZyb20gYSBQeXRob24gbG9uZyBpbnRlZ2VyLiBJZgorICAgKnB5bG9uZyogY2Fubm90IGJlIHJlcHJlc2VudGVkIGFzIGFuIDpjOnR5cGU6YHVuc2lnbmVkIGxvbmcgbG9uZ2AsIGFuCiAgICA6ZXhjOmBPdmVyZmxvd0Vycm9yYCBpcyByYWlzZWQgYW5kIGBgKHVuc2lnbmVkIGxvbmcgbG9uZyktMWBgIGlzCiAgICByZXR1cm5lZC4KIApAQCAtMjQwLDM1ICsyNDAsMzUgQEAKICAgICAgIDpleGM6YFR5cGVFcnJvcmAuCiAKIAotLi4gY2Z1bmN0aW9uOjogdW5zaWduZWQgbG9uZyBQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrKFB5T2JqZWN0ICppbykKKy4uIGM6ZnVuY3Rpb246OiB1bnNpZ25lZCBsb25nIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2soUHlPYmplY3QgKmlvKQogCi0gICBSZXR1cm4gYSBDIDpjdHlwZTpgdW5zaWduZWQgbG9uZ2AgZnJvbSBhIFB5dGhvbiBsb25nIGludGVnZXIsIHdpdGhvdXQgY2hlY2tpbmcKKyAgIFJldHVybiBhIEMgOmM6dHlwZTpgdW5zaWduZWQgbG9uZ2AgZnJvbSBhIFB5dGhvbiBsb25nIGludGVnZXIsIHdpdGhvdXQgY2hlY2tpbmcKICAgIGZvciBvdmVyZmxvdy4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4zCiAKIAotLi4gY2Z1bmN0aW9uOjogdW5zaWduZWQgUFlfTE9OR19MT05HIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKFB5T2JqZWN0ICppbykKKy4uIGM6ZnVuY3Rpb246OiB1bnNpZ25lZCBQWV9MT05HX0xPTkcgUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZ01hc2soUHlPYmplY3QgKmlvKQogCi0gICBSZXR1cm4gYSBDIDpjdHlwZTpgdW5zaWduZWQgbG9uZyBsb25nYCBmcm9tIGEgUHl0aG9uIGxvbmcgaW50ZWdlciwgd2l0aG91dAorICAgUmV0dXJuIGEgQyA6Yzp0eXBlOmB1bnNpZ25lZCBsb25nIGxvbmdgIGZyb20gYSBQeXRob24gbG9uZyBpbnRlZ2VyLCB3aXRob3V0CiAgICBjaGVja2luZyBmb3Igb3ZlcmZsb3cuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMwogCiAKLS4uIGNmdW5jdGlvbjo6IGRvdWJsZSBQeUxvbmdfQXNEb3VibGUoUHlPYmplY3QgKnB5bG9uZykKKy4uIGM6ZnVuY3Rpb246OiBkb3VibGUgUHlMb25nX0FzRG91YmxlKFB5T2JqZWN0ICpweWxvbmcpCiAKLSAgIFJldHVybiBhIEMgOmN0eXBlOmBkb3VibGVgIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb250ZW50cyBvZiAqcHlsb25nKi4gIElmCi0gICAqcHlsb25nKiBjYW5ub3QgYmUgYXBwcm94aW1hdGVseSByZXByZXNlbnRlZCBhcyBhIDpjdHlwZTpgZG91YmxlYCwgYW4KKyAgIFJldHVybiBhIEMgOmM6dHlwZTpgZG91YmxlYCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29udGVudHMgb2YgKnB5bG9uZyouICBJZgorICAgKnB5bG9uZyogY2Fubm90IGJlIGFwcHJveGltYXRlbHkgcmVwcmVzZW50ZWQgYXMgYSA6Yzp0eXBlOmBkb3VibGVgLCBhbgogICAgOmV4YzpgT3ZlcmZsb3dFcnJvcmAgZXhjZXB0aW9uIGlzIHJhaXNlZCBhbmQgYGAtMS4wYGAgd2lsbCBiZSByZXR1cm5lZC4KIAogCi0uLiBjZnVuY3Rpb246OiB2b2lkKiBQeUxvbmdfQXNWb2lkUHRyKFB5T2JqZWN0ICpweWxvbmcpCisuLiBjOmZ1bmN0aW9uOjogdm9pZCogUHlMb25nX0FzVm9pZFB0cihQeU9iamVjdCAqcHlsb25nKQogCi0gICBDb252ZXJ0IGEgUHl0aG9uIGludGVnZXIgb3IgbG9uZyBpbnRlZ2VyICpweWxvbmcqIHRvIGEgQyA6Y3R5cGU6YHZvaWRgIHBvaW50ZXIuCisgICBDb252ZXJ0IGEgUHl0aG9uIGludGVnZXIgb3IgbG9uZyBpbnRlZ2VyICpweWxvbmcqIHRvIGEgQyA6Yzp0eXBlOmB2b2lkYCBwb2ludGVyLgogICAgSWYgKnB5bG9uZyogY2Fubm90IGJlIGNvbnZlcnRlZCwgYW4gOmV4YzpgT3ZlcmZsb3dFcnJvcmAgd2lsbCBiZSByYWlzZWQuICBUaGlzCi0gICBpcyBvbmx5IGFzc3VyZWQgdG8gcHJvZHVjZSBhIHVzYWJsZSA6Y3R5cGU6YHZvaWRgIHBvaW50ZXIgZm9yIHZhbHVlcyBjcmVhdGVkCi0gICB3aXRoIDpjZnVuYzpgUHlMb25nX0Zyb21Wb2lkUHRyYC4KKyAgIGlzIG9ubHkgYXNzdXJlZCB0byBwcm9kdWNlIGEgdXNhYmxlIDpjOnR5cGU6YHZvaWRgIHBvaW50ZXIgZm9yIHZhbHVlcyBjcmVhdGVkCisgICB3aXRoIDpjOmZ1bmM6YFB5TG9uZ19Gcm9tVm9pZFB0cmAuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuNS4yCiAKZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9tYXBwaW5nLnJzdCBiL0RvYy9jLWFwaS9tYXBwaW5nLnJzdAppbmRleCA3ODc4N2UzLi43YTgzYTUwIDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvbWFwcGluZy5yc3QKKysrIGIvRG9jL2MtYXBpL21hcHBpbmcucnN0CkBAIC02LDEzICs2LDEzIEBACiA9PT09PT09PT09PT09PT09CiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5TWFwcGluZ19DaGVjayhQeU9iamVjdCAqbykKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlNYXBwaW5nX0NoZWNrKFB5T2JqZWN0ICpvKQogCiAgICBSZXR1cm4gYGAxYGAgaWYgdGhlIG9iamVjdCBwcm92aWRlcyBtYXBwaW5nIHByb3RvY29sLCBhbmQgYGAwYGAgb3RoZXJ3aXNlLiAgVGhpcwogICAgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5X3NzaXplX3QgUHlNYXBwaW5nX1NpemUoUHlPYmplY3QgKm8pCisuLiBjOmZ1bmN0aW9uOjogUHlfc3NpemVfdCBQeU1hcHBpbmdfU2l6ZShQeU9iamVjdCAqbykKICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgUHlNYXBwaW5nX0xlbmd0aChQeU9iamVjdCAqbykKIAogICAgLi4gaW5kZXg6OiBidWlsdGluOiBsZW4KQEAgLTIyLDYyICsyMiw2MiBAQAogICAgZXhwcmVzc2lvbiBgYGxlbihvKWBgLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhlc2UgZnVuY3Rpb25zIHJldHVybmVkIGFuIDpjdHlwZTpgaW50YCB0eXBlLiBUaGlzIG1pZ2h0IHJlcXVpcmUKKyAgICAgIFRoZXNlIGZ1bmN0aW9ucyByZXR1cm5lZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUuIFRoaXMgbWlnaHQgcmVxdWlyZQogICAgICAgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5TWFwcGluZ19EZWxJdGVtU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICprZXkpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5TWFwcGluZ19EZWxJdGVtU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICprZXkpCiAKICAgIFJlbW92ZSB0aGUgbWFwcGluZyBmb3Igb2JqZWN0ICprZXkqIGZyb20gdGhlIG9iamVjdCAqbyouIFJldHVybiBgYC0xYGAgb24KICAgIGZhaWx1cmUuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbiBzdGF0ZW1lbnQgYGBkZWwgb1trZXldYGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5TWFwcGluZ19EZWxJdGVtKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqa2V5KQorLi4gYzpmdW5jdGlvbjo6IGludCBQeU1hcHBpbmdfRGVsSXRlbShQeU9iamVjdCAqbywgUHlPYmplY3QgKmtleSkKIAogICAgUmVtb3ZlIHRoZSBtYXBwaW5nIGZvciBvYmplY3QgKmtleSogZnJvbSB0aGUgb2JqZWN0ICpvKi4gUmV0dXJuIGBgLTFgYCBvbgogICAgZmFpbHVyZS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIHN0YXRlbWVudCBgYGRlbCBvW2tleV1gYC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlNYXBwaW5nX0hhc0tleVN0cmluZyhQeU9iamVjdCAqbywgY2hhciAqa2V5KQorLi4gYzpmdW5jdGlvbjo6IGludCBQeU1hcHBpbmdfSGFzS2V5U3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICprZXkpCiAKICAgIE9uIHN1Y2Nlc3MsIHJldHVybiBgYDFgYCBpZiB0aGUgbWFwcGluZyBvYmplY3QgaGFzIHRoZSBrZXkgKmtleSogYW5kIGBgMGBgCiAgICBvdGhlcndpc2UuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYGBvW2tleV1gYCwgcmV0dXJuaW5nIGBgVHJ1ZWBgIG9uIHN1Y2Nlc3MKICAgIGFuZCBgYEZhbHNlYGAgb24gYW4gZXhjZXB0aW9uLiAgVGhpcyBmdW5jdGlvbiBhbHdheXMgc3VjY2VlZHMuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5TWFwcGluZ19IYXNLZXkoUHlPYmplY3QgKm8sIFB5T2JqZWN0ICprZXkpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5TWFwcGluZ19IYXNLZXkoUHlPYmplY3QgKm8sIFB5T2JqZWN0ICprZXkpCiAKICAgIFJldHVybiBgYDFgYCBpZiB0aGUgbWFwcGluZyBvYmplY3QgaGFzIHRoZSBrZXkgKmtleSogYW5kIGBgMGBgIG90aGVyd2lzZS4KICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byBgYG9ba2V5XWBgLCByZXR1cm5pbmcgYGBUcnVlYGAgb24gc3VjY2VzcyBhbmQgYGBGYWxzZWBgCiAgICBvbiBhbiBleGNlcHRpb24uICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBzdWNjZWVkcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlNYXBwaW5nX0tleXMoUHlPYmplY3QgKm8pCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5TWFwcGluZ19LZXlzKFB5T2JqZWN0ICpvKQogCiAgICBPbiBzdWNjZXNzLCByZXR1cm4gYSBsaXN0IG9mIHRoZSBrZXlzIGluIG9iamVjdCAqbyouICBPbiBmYWlsdXJlLCByZXR1cm4gKk5VTEwqLgogICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbiBgYG8ua2V5cygpYGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TWFwcGluZ19WYWx1ZXMoUHlPYmplY3QgKm8pCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5TWFwcGluZ19WYWx1ZXMoUHlPYmplY3QgKm8pCiAKICAgIE9uIHN1Y2Nlc3MsIHJldHVybiBhIGxpc3Qgb2YgdGhlIHZhbHVlcyBpbiBvYmplY3QgKm8qLiAgT24gZmFpbHVyZSwgcmV0dXJuCiAgICAqTlVMTCouIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb24gYGBvLnZhbHVlcygpYGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TWFwcGluZ19JdGVtcyhQeU9iamVjdCAqbykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlNYXBwaW5nX0l0ZW1zKFB5T2JqZWN0ICpvKQogCiAgICBPbiBzdWNjZXNzLCByZXR1cm4gYSBsaXN0IG9mIHRoZSBpdGVtcyBpbiBvYmplY3QgKm8qLCB3aGVyZSBlYWNoIGl0ZW0gaXMgYSB0dXBsZQogICAgY29udGFpbmluZyBhIGtleS12YWx1ZSBwYWlyLiAgT24gZmFpbHVyZSwgcmV0dXJuICpOVUxMKi4gVGhpcyBpcyBlcXVpdmFsZW50IHRvCiAgICB0aGUgUHl0aG9uIGV4cHJlc3Npb24gYGBvLml0ZW1zKClgYC4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlNYXBwaW5nX0dldEl0ZW1TdHJpbmcoUHlPYmplY3QgKm8sIGNoYXIgKmtleSkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlNYXBwaW5nX0dldEl0ZW1TdHJpbmcoUHlPYmplY3QgKm8sIGNoYXIgKmtleSkKIAogICAgUmV0dXJuIGVsZW1lbnQgb2YgKm8qIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG9iamVjdCAqa2V5KiBvciAqTlVMTCogb24gZmFpbHVyZS4KICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uIGBgb1trZXldYGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5TWFwcGluZ19TZXRJdGVtU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICprZXksIFB5T2JqZWN0ICp2KQorLi4gYzpmdW5jdGlvbjo6IGludCBQeU1hcHBpbmdfU2V0SXRlbVN0cmluZyhQeU9iamVjdCAqbywgY2hhciAqa2V5LCBQeU9iamVjdCAqdikKIAogICAgTWFwIHRoZSBvYmplY3QgKmtleSogdG8gdGhlIHZhbHVlICp2KiBpbiBvYmplY3QgKm8qLiBSZXR1cm5zIGBgLTFgYCBvbiBmYWlsdXJlLgogICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudCBgYG9ba2V5XSA9IHZgYC4KZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9tYXJzaGFsLnJzdCBiL0RvYy9jLWFwaS9tYXJzaGFsLnJzdAppbmRleCAzNGE4M2Y0Li5iODJjYzk2IDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvbWFyc2hhbC5yc3QKKysrIGIvRG9jL2MtYXBpL21hcnNoYWwucnN0CkBAIC0yMCwxNyArMjAsMTcgQEAKIGZpbGUgZm9ybWF0IChjdXJyZW50bHkgMikuCiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBQeU1hcnNoYWxfV3JpdGVMb25nVG9GaWxlKGxvbmcgdmFsdWUsIEZJTEUgKmZpbGUsIGludCB2ZXJzaW9uKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlNYXJzaGFsX1dyaXRlTG9uZ1RvRmlsZShsb25nIHZhbHVlLCBGSUxFICpmaWxlLCBpbnQgdmVyc2lvbikKIAotICAgTWFyc2hhbCBhIDpjdHlwZTpgbG9uZ2AgaW50ZWdlciwgKnZhbHVlKiwgdG8gKmZpbGUqLiAgVGhpcyB3aWxsIG9ubHkgd3JpdGUKKyAgIE1hcnNoYWwgYSA6Yzp0eXBlOmBsb25nYCBpbnRlZ2VyLCAqdmFsdWUqLCB0byAqZmlsZSouICBUaGlzIHdpbGwgb25seSB3cml0ZQogICAgdGhlIGxlYXN0LXNpZ25pZmljYW50IDMyIGJpdHMgb2YgKnZhbHVlKjsgcmVnYXJkbGVzcyBvZiB0aGUgc2l6ZSBvZiB0aGUKLSAgIG5hdGl2ZSA6Y3R5cGU6YGxvbmdgIHR5cGUuCisgICBuYXRpdmUgOmM6dHlwZTpgbG9uZ2AgdHlwZS4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjQKICAgICAgICp2ZXJzaW9uKiBpbmRpY2F0ZXMgdGhlIGZpbGUgZm9ybWF0LgogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgUHlNYXJzaGFsX1dyaXRlT2JqZWN0VG9GaWxlKFB5T2JqZWN0ICp2YWx1ZSwgRklMRSAqZmlsZSwgaW50IHZlcnNpb24pCisuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeU1hcnNoYWxfV3JpdGVPYmplY3RUb0ZpbGUoUHlPYmplY3QgKnZhbHVlLCBGSUxFICpmaWxlLCBpbnQgdmVyc2lvbikKIAogICAgTWFyc2hhbCBhIFB5dGhvbiBvYmplY3QsICp2YWx1ZSosIHRvICpmaWxlKi4KIApAQCAtMzgsNyArMzgsNyBAQAogICAgICAgKnZlcnNpb24qIGluZGljYXRlcyB0aGUgZmlsZSBmb3JtYXQuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TWFyc2hhbF9Xcml0ZU9iamVjdFRvU3RyaW5nKFB5T2JqZWN0ICp2YWx1ZSwgaW50IHZlcnNpb24pCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5TWFyc2hhbF9Xcml0ZU9iamVjdFRvU3RyaW5nKFB5T2JqZWN0ICp2YWx1ZSwgaW50IHZlcnNpb24pCiAKICAgIFJldHVybiBhIHN0cmluZyBvYmplY3QgY29udGFpbmluZyB0aGUgbWFyc2hhbGxlZCByZXByZXNlbnRhdGlvbiBvZiAqdmFsdWUqLgogCkBAIC01NSwzMSArNTUsMzEgQEAKIHdyaXR0ZW4gdXNpbmcgdGhlc2Ugcm91dGluZXM/CiAKIAotLi4gY2Z1bmN0aW9uOjogbG9uZyBQeU1hcnNoYWxfUmVhZExvbmdGcm9tRmlsZShGSUxFICpmaWxlKQorLi4gYzpmdW5jdGlvbjo6IGxvbmcgUHlNYXJzaGFsX1JlYWRMb25nRnJvbUZpbGUoRklMRSAqZmlsZSkKIAotICAgUmV0dXJuIGEgQyA6Y3R5cGU6YGxvbmdgIGZyb20gdGhlIGRhdGEgc3RyZWFtIGluIGEgOmN0eXBlOmBGSUxFXCpgIG9wZW5lZAorICAgUmV0dXJuIGEgQyA6Yzp0eXBlOmBsb25nYCBmcm9tIHRoZSBkYXRhIHN0cmVhbSBpbiBhIDpjOnR5cGU6YEZJTEVcKmAgb3BlbmVkCiAgICBmb3IgcmVhZGluZy4gIE9ubHkgYSAzMi1iaXQgdmFsdWUgY2FuIGJlIHJlYWQgaW4gdXNpbmcgdGhpcyBmdW5jdGlvbiwKLSAgIHJlZ2FyZGxlc3Mgb2YgdGhlIG5hdGl2ZSBzaXplIG9mIDpjdHlwZTpgbG9uZ2AuCisgICByZWdhcmRsZXNzIG9mIHRoZSBuYXRpdmUgc2l6ZSBvZiA6Yzp0eXBlOmBsb25nYC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlNYXJzaGFsX1JlYWRTaG9ydEZyb21GaWxlKEZJTEUgKmZpbGUpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5TWFyc2hhbF9SZWFkU2hvcnRGcm9tRmlsZShGSUxFICpmaWxlKQogCi0gICBSZXR1cm4gYSBDIDpjdHlwZTpgc2hvcnRgIGZyb20gdGhlIGRhdGEgc3RyZWFtIGluIGEgOmN0eXBlOmBGSUxFXCpgIG9wZW5lZAorICAgUmV0dXJuIGEgQyA6Yzp0eXBlOmBzaG9ydGAgZnJvbSB0aGUgZGF0YSBzdHJlYW0gaW4gYSA6Yzp0eXBlOmBGSUxFXCpgIG9wZW5lZAogICAgZm9yIHJlYWRpbmcuICBPbmx5IGEgMTYtYml0IHZhbHVlIGNhbiBiZSByZWFkIGluIHVzaW5nIHRoaXMgZnVuY3Rpb24sCi0gICByZWdhcmRsZXNzIG9mIHRoZSBuYXRpdmUgc2l6ZSBvZiA6Y3R5cGU6YHNob3J0YC4KKyAgIHJlZ2FyZGxlc3Mgb2YgdGhlIG5hdGl2ZSBzaXplIG9mIDpjOnR5cGU6YHNob3J0YC4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlNYXJzaGFsX1JlYWRPYmplY3RGcm9tRmlsZShGSUxFICpmaWxlKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU1hcnNoYWxfUmVhZE9iamVjdEZyb21GaWxlKEZJTEUgKmZpbGUpCiAKLSAgIFJldHVybiBhIFB5dGhvbiBvYmplY3QgZnJvbSB0aGUgZGF0YSBzdHJlYW0gaW4gYSA6Y3R5cGU6YEZJTEVcKmAgb3BlbmVkIGZvcgorICAgUmV0dXJuIGEgUHl0aG9uIG9iamVjdCBmcm9tIHRoZSBkYXRhIHN0cmVhbSBpbiBhIDpjOnR5cGU6YEZJTEVcKmAgb3BlbmVkIGZvcgogICAgcmVhZGluZy4gIE9uIGVycm9yLCBzZXRzIHRoZSBhcHByb3ByaWF0ZSBleGNlcHRpb24gKDpleGM6YEVPRkVycm9yYCBvcgogICAgOmV4YzpgVHlwZUVycm9yYCkgYW5kIHJldHVybnMgKk5VTEwqLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU1hcnNoYWxfUmVhZExhc3RPYmplY3RGcm9tRmlsZShGSUxFICpmaWxlKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU1hcnNoYWxfUmVhZExhc3RPYmplY3RGcm9tRmlsZShGSUxFICpmaWxlKQogCi0gICBSZXR1cm4gYSBQeXRob24gb2JqZWN0IGZyb20gdGhlIGRhdGEgc3RyZWFtIGluIGEgOmN0eXBlOmBGSUxFXCpgIG9wZW5lZCBmb3IKLSAgIHJlYWRpbmcuICBVbmxpa2UgOmNmdW5jOmBQeU1hcnNoYWxfUmVhZE9iamVjdEZyb21GaWxlYCwgdGhpcyBmdW5jdGlvbgorICAgUmV0dXJuIGEgUHl0aG9uIG9iamVjdCBmcm9tIHRoZSBkYXRhIHN0cmVhbSBpbiBhIDpjOnR5cGU6YEZJTEVcKmAgb3BlbmVkIGZvcgorICAgcmVhZGluZy4gIFVubGlrZSA6YzpmdW5jOmBQeU1hcnNoYWxfUmVhZE9iamVjdEZyb21GaWxlYCwgdGhpcyBmdW5jdGlvbgogICAgYXNzdW1lcyB0aGF0IG5vIGZ1cnRoZXIgb2JqZWN0cyB3aWxsIGJlIHJlYWQgZnJvbSB0aGUgZmlsZSwgYWxsb3dpbmcgaXQgdG8KICAgIGFnZ3Jlc3NpdmVseSBsb2FkIGZpbGUgZGF0YSBpbnRvIG1lbW9yeSBzbyB0aGF0IHRoZSBkZS1zZXJpYWxpemF0aW9uIGNhbgogICAgb3BlcmF0ZSBmcm9tIGRhdGEgaW4gbWVtb3J5IHJhdGhlciB0aGFuIHJlYWRpbmcgYSBieXRlIGF0IGEgdGltZSBmcm9tIHRoZQpAQCAtODgsNyArODgsNyBAQAogICAgKDpleGM6YEVPRkVycm9yYCBvciA6ZXhjOmBUeXBlRXJyb3JgKSBhbmQgcmV0dXJucyAqTlVMTCouCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TWFyc2hhbF9SZWFkT2JqZWN0RnJvbVN0cmluZyhjaGFyICpzdHJpbmcsIFB5X3NzaXplX3QgbGVuKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU1hcnNoYWxfUmVhZE9iamVjdEZyb21TdHJpbmcoY2hhciAqc3RyaW5nLCBQeV9zc2l6ZV90IGxlbikKIAogICAgUmV0dXJuIGEgUHl0aG9uIG9iamVjdCBmcm9tIHRoZSBkYXRhIHN0cmVhbSBpbiBhIGNoYXJhY3RlciBidWZmZXIKICAgIGNvbnRhaW5pbmcgKmxlbiogYnl0ZXMgcG9pbnRlZCB0byBieSAqc3RyaW5nKi4gIE9uIGVycm9yLCBzZXRzIHRoZQpAQCAtOTYsNSArOTYsNSBAQAogICAgKk5VTEwqLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjdHlwZTpgaW50YCB0eXBlIGZvciAqbGVuKi4gVGhpcyBtaWdodCByZXF1aXJlCisgICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmM6dHlwZTpgaW50YCB0eXBlIGZvciAqbGVuKi4gVGhpcyBtaWdodCByZXF1aXJlCiAgICAgICBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9tZW1vcnkucnN0IGIvRG9jL2MtYXBpL21lbW9yeS5yc3QKaW5kZXggODFkN2NkOS4uNTQ2NTU3MSAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL21lbW9yeS5yc3QKKysrIGIvRG9jL2MtYXBpL21lbW9yeS5yc3QKQEAgLTQ3LDggKzQ3LDggQEAKICAgIHNpbmdsZTogZnJlZSgpCiAKIFRvIGF2b2lkIG1lbW9yeSBjb3JydXB0aW9uLCBleHRlbnNpb24gd3JpdGVycyBzaG91bGQgbmV2ZXIgdHJ5IHRvIG9wZXJhdGUgb24KLVB5dGhvbiBvYmplY3RzIHdpdGggdGhlIGZ1bmN0aW9ucyBleHBvcnRlZCBieSB0aGUgQyBsaWJyYXJ5OiA6Y2Z1bmM6YG1hbGxvY2AsCi06Y2Z1bmM6YGNhbGxvY2AsIDpjZnVuYzpgcmVhbGxvY2AgYW5kIDpjZnVuYzpgZnJlZWAuICBUaGlzIHdpbGwgcmVzdWx0IGluICBtaXhlZAorUHl0aG9uIG9iamVjdHMgd2l0aCB0aGUgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IHRoZSBDIGxpYnJhcnk6IDpjOmZ1bmM6YG1hbGxvY2AsCis6YzpmdW5jOmBjYWxsb2NgLCA6YzpmdW5jOmByZWFsbG9jYCBhbmQgOmM6ZnVuYzpgZnJlZWAuICBUaGlzIHdpbGwgcmVzdWx0IGluICBtaXhlZAogY2FsbHMgYmV0d2VlbiB0aGUgQyBhbGxvY2F0b3IgYW5kIHRoZSBQeXRob24gbWVtb3J5IG1hbmFnZXIgd2l0aCBmYXRhbAogY29uc2VxdWVuY2VzLCBiZWNhdXNlIHRoZXkgaW1wbGVtZW50IGRpZmZlcmVudCBhbGdvcml0aG1zIGFuZCBvcGVyYXRlIG9uCiBkaWZmZXJlbnQgaGVhcHMuICBIb3dldmVyLCBvbmUgbWF5IHNhZmVseSBhbGxvY2F0ZSBhbmQgcmVsZWFzZSBtZW1vcnkgYmxvY2tzCkBAIC05NCw2NSArOTQsNjUgQEAKIG1lbW9yeSBmcm9tIHRoZSBQeXRob24gaGVhcDoKIAogCi0uLiBjZnVuY3Rpb246OiB2b2lkKiBQeU1lbV9NYWxsb2Moc2l6ZV90IG4pCisuLiBjOmZ1bmN0aW9uOjogdm9pZCogUHlNZW1fTWFsbG9jKHNpemVfdCBuKQogCi0gICBBbGxvY2F0ZXMgKm4qIGJ5dGVzIGFuZCByZXR1cm5zIGEgcG9pbnRlciBvZiB0eXBlIDpjdHlwZTpgdm9pZFwqYCB0byB0aGUKKyAgIEFsbG9jYXRlcyAqbiogYnl0ZXMgYW5kIHJldHVybnMgYSBwb2ludGVyIG9mIHR5cGUgOmM6dHlwZTpgdm9pZFwqYCB0byB0aGUKICAgIGFsbG9jYXRlZCBtZW1vcnksIG9yICpOVUxMKiBpZiB0aGUgcmVxdWVzdCBmYWlscy4gUmVxdWVzdGluZyB6ZXJvIGJ5dGVzIHJldHVybnMKLSAgIGEgZGlzdGluY3Qgbm9uLSpOVUxMKiBwb2ludGVyIGlmIHBvc3NpYmxlLCBhcyBpZiA6Y2Z1bmM6YFB5TWVtX01hbGxvYygxKWAgaGFkCisgICBhIGRpc3RpbmN0IG5vbi0qTlVMTCogcG9pbnRlciBpZiBwb3NzaWJsZSwgYXMgaWYgYGBQeU1lbV9NYWxsb2MoMSlgYCBoYWQKICAgIGJlZW4gY2FsbGVkIGluc3RlYWQuIFRoZSBtZW1vcnkgd2lsbCBub3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGluIGFueSB3YXkuCiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCogUHlNZW1fUmVhbGxvYyh2b2lkICpwLCBzaXplX3QgbikKKy4uIGM6ZnVuY3Rpb246OiB2b2lkKiBQeU1lbV9SZWFsbG9jKHZvaWQgKnAsIHNpemVfdCBuKQogCiAgICBSZXNpemVzIHRoZSBtZW1vcnkgYmxvY2sgcG9pbnRlZCB0byBieSAqcCogdG8gKm4qIGJ5dGVzLiBUaGUgY29udGVudHMgd2lsbCBiZQogICAgdW5jaGFuZ2VkIHRvIHRoZSBtaW5pbXVtIG9mIHRoZSBvbGQgYW5kIHRoZSBuZXcgc2l6ZXMuIElmICpwKiBpcyAqTlVMTCosIHRoZQotICAgY2FsbCBpcyBlcXVpdmFsZW50IHRvIDpjZnVuYzpgUHlNZW1fTWFsbG9jKG4pYDsgZWxzZSBpZiAqbiogaXMgZXF1YWwgdG8gemVybywKKyAgIGNhbGwgaXMgZXF1aXZhbGVudCB0byBgYFB5TWVtX01hbGxvYyhuKWBgOyBlbHNlIGlmICpuKiBpcyBlcXVhbCB0byB6ZXJvLAogICAgdGhlIG1lbW9yeSBibG9jayBpcyByZXNpemVkIGJ1dCBpcyBub3QgZnJlZWQsIGFuZCB0aGUgcmV0dXJuZWQgcG9pbnRlciBpcwogICAgbm9uLSpOVUxMKi4gIFVubGVzcyAqcCogaXMgKk5VTEwqLCBpdCBtdXN0IGhhdmUgYmVlbiByZXR1cm5lZCBieSBhIHByZXZpb3VzIGNhbGwKLSAgIHRvIDpjZnVuYzpgUHlNZW1fTWFsbG9jYCBvciA6Y2Z1bmM6YFB5TWVtX1JlYWxsb2NgLiBJZiB0aGUgcmVxdWVzdCBmYWlscywKLSAgIDpjZnVuYzpgUHlNZW1fUmVhbGxvY2AgcmV0dXJucyAqTlVMTCogYW5kICpwKiByZW1haW5zIGEgdmFsaWQgcG9pbnRlciB0byB0aGUKKyAgIHRvIDpjOmZ1bmM6YFB5TWVtX01hbGxvY2Agb3IgOmM6ZnVuYzpgUHlNZW1fUmVhbGxvY2AuIElmIHRoZSByZXF1ZXN0IGZhaWxzLAorICAgOmM6ZnVuYzpgUHlNZW1fUmVhbGxvY2AgcmV0dXJucyAqTlVMTCogYW5kICpwKiByZW1haW5zIGEgdmFsaWQgcG9pbnRlciB0byB0aGUKICAgIHByZXZpb3VzIG1lbW9yeSBhcmVhLgogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgUHlNZW1fRnJlZSh2b2lkICpwKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlNZW1fRnJlZSh2b2lkICpwKQogCiAgICBGcmVlcyB0aGUgbWVtb3J5IGJsb2NrIHBvaW50ZWQgdG8gYnkgKnAqLCB3aGljaCBtdXN0IGhhdmUgYmVlbiByZXR1cm5lZCBieSBhCi0gICBwcmV2aW91cyBjYWxsIHRvIDpjZnVuYzpgUHlNZW1fTWFsbG9jYCBvciA6Y2Z1bmM6YFB5TWVtX1JlYWxsb2NgLiAgT3RoZXJ3aXNlLCBvcgotICAgaWYgOmNmdW5jOmBQeU1lbV9GcmVlKHApYCBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB1bmRlZmluZWQgYmVoYXZpb3Igb2NjdXJzLiBJZgorICAgcHJldmlvdXMgY2FsbCB0byA6YzpmdW5jOmBQeU1lbV9NYWxsb2NgIG9yIDpjOmZ1bmM6YFB5TWVtX1JlYWxsb2NgLiAgT3RoZXJ3aXNlLCBvcgorICAgaWYgYGBQeU1lbV9GcmVlKHApYGAgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSwgdW5kZWZpbmVkIGJlaGF2aW9yIG9jY3Vycy4gSWYKICAgICpwKiBpcyAqTlVMTCosIG5vIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQuCiAKIFRoZSBmb2xsb3dpbmcgdHlwZS1vcmllbnRlZCBtYWNyb3MgYXJlIHByb3ZpZGVkIGZvciBjb252ZW5pZW5jZS4gIE5vdGUgIHRoYXQKICpUWVBFKiByZWZlcnMgdG8gYW55IEMgdHlwZS4KIAogCi0uLiBjZnVuY3Rpb246OiBUWVBFKiBQeU1lbV9OZXcoVFlQRSwgc2l6ZV90IG4pCisuLiBjOmZ1bmN0aW9uOjogVFlQRSogUHlNZW1fTmV3KFRZUEUsIHNpemVfdCBuKQogCi0gICBTYW1lIGFzIDpjZnVuYzpgUHlNZW1fTWFsbG9jYCwgYnV0IGFsbG9jYXRlcyBgYChuICogc2l6ZW9mKFRZUEUpKWBgIGJ5dGVzIG9mCi0gICBtZW1vcnkuICBSZXR1cm5zIGEgcG9pbnRlciBjYXN0IHRvIDpjdHlwZTpgVFlQRVwqYC4gIFRoZSBtZW1vcnkgd2lsbCBub3QgaGF2ZQorICAgU2FtZSBhcyA6YzpmdW5jOmBQeU1lbV9NYWxsb2NgLCBidXQgYWxsb2NhdGVzIGBgKG4gKiBzaXplb2YoVFlQRSkpYGAgYnl0ZXMgb2YKKyAgIG1lbW9yeS4gIFJldHVybnMgYSBwb2ludGVyIGNhc3QgdG8gOmM6dHlwZTpgVFlQRVwqYC4gIFRoZSBtZW1vcnkgd2lsbCBub3QgaGF2ZQogICAgYmVlbiBpbml0aWFsaXplZCBpbiBhbnkgd2F5LgogCiAKLS4uIGNmdW5jdGlvbjo6IFRZUEUqIFB5TWVtX1Jlc2l6ZSh2b2lkICpwLCBUWVBFLCBzaXplX3QgbikKKy4uIGM6ZnVuY3Rpb246OiBUWVBFKiBQeU1lbV9SZXNpemUodm9pZCAqcCwgVFlQRSwgc2l6ZV90IG4pCiAKLSAgIFNhbWUgYXMgOmNmdW5jOmBQeU1lbV9SZWFsbG9jYCwgYnV0IHRoZSBtZW1vcnkgYmxvY2sgaXMgcmVzaXplZCB0byBgYChuICoKLSAgIHNpemVvZihUWVBFKSlgYCBieXRlcy4gIFJldHVybnMgYSBwb2ludGVyIGNhc3QgdG8gOmN0eXBlOmBUWVBFXCpgLiBPbiByZXR1cm4sCisgICBTYW1lIGFzIDpjOmZ1bmM6YFB5TWVtX1JlYWxsb2NgLCBidXQgdGhlIG1lbW9yeSBibG9jayBpcyByZXNpemVkIHRvIGBgKG4gKgorICAgc2l6ZW9mKFRZUEUpKWBgIGJ5dGVzLiAgUmV0dXJucyBhIHBvaW50ZXIgY2FzdCB0byA6Yzp0eXBlOmBUWVBFXCpgLiBPbiByZXR1cm4sCiAgICAqcCogd2lsbCBiZSBhIHBvaW50ZXIgdG8gdGhlIG5ldyBtZW1vcnkgYXJlYSwgb3IgKk5VTEwqIGluIHRoZSBldmVudCBvZgogICAgZmFpbHVyZS4gIFRoaXMgaXMgYSBDIHByZXByb2Nlc3NvciBtYWNybzsgcCBpcyBhbHdheXMgcmVhc3NpZ25lZC4gIFNhdmUKICAgIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiBwIHRvIGF2b2lkIGxvc2luZyBtZW1vcnkgd2hlbiBoYW5kbGluZyBlcnJvcnMuCiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBQeU1lbV9EZWwodm9pZCAqcCkKKy4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5TWVtX0RlbCh2b2lkICpwKQogCi0gICBTYW1lIGFzIDpjZnVuYzpgUHlNZW1fRnJlZWAuCisgICBTYW1lIGFzIDpjOmZ1bmM6YFB5TWVtX0ZyZWVgLgogCiBJbiBhZGRpdGlvbiwgdGhlIGZvbGxvd2luZyBtYWNybyBzZXRzIGFyZSBwcm92aWRlZCBmb3IgY2FsbGluZyB0aGUgUHl0aG9uIG1lbW9yeQogYWxsb2NhdG9yIGRpcmVjdGx5LCB3aXRob3V0IGludm9sdmluZyB0aGUgQyBBUEkgZnVuY3Rpb25zIGxpc3RlZCBhYm92ZS4gSG93ZXZlciwKIG5vdGUgdGhhdCB0aGVpciB1c2UgZG9lcyBub3QgcHJlc2VydmUgYmluYXJ5IGNvbXBhdGliaWxpdHkgYWNyb3NzIFB5dGhvbgogdmVyc2lvbnMgYW5kIGlzIHRoZXJlZm9yZSBkZXByZWNhdGVkIGluIGV4dGVuc2lvbiBtb2R1bGVzLgogCi06Y2Z1bmM6YFB5TWVtX01BTExPQ2AsIDpjZnVuYzpgUHlNZW1fUkVBTExPQ2AsIDpjZnVuYzpgUHlNZW1fRlJFRWAuCis6YzpmdW5jOmBQeU1lbV9NQUxMT0NgLCA6YzpmdW5jOmBQeU1lbV9SRUFMTE9DYCwgOmM6ZnVuYzpgUHlNZW1fRlJFRWAuCiAKLTpjZnVuYzpgUHlNZW1fTkVXYCwgOmNmdW5jOmBQeU1lbV9SRVNJWkVgLCA6Y2Z1bmM6YFB5TWVtX0RFTGAuCis6YzpmdW5jOmBQeU1lbV9ORVdgLCA6YzpmdW5jOmBQeU1lbV9SRVNJWkVgLCA6YzpmdW5jOmBQeU1lbV9ERUxgLgogCiAKIC4uIF9tZW1vcnlleGFtcGxlczoKQEAgLTIwMSw4ICsyMDEsOCBAQAogICAgZnJlZShidWYxKTsgICAgICAgLyogRmF0YWwgLS0gc2hvdWxkIGJlIFB5TWVtX0RlbCgpICAqLwogCiBJbiBhZGRpdGlvbiB0byB0aGUgZnVuY3Rpb25zIGFpbWVkIGF0IGhhbmRsaW5nIHJhdyBtZW1vcnkgYmxvY2tzIGZyb20gdGhlIFB5dGhvbgotaGVhcCwgb2JqZWN0cyBpbiBQeXRob24gYXJlIGFsbG9jYXRlZCBhbmQgcmVsZWFzZWQgd2l0aCA6Y2Z1bmM6YFB5T2JqZWN0X05ld2AsCi06Y2Z1bmM6YFB5T2JqZWN0X05ld1ZhcmAgYW5kIDpjZnVuYzpgUHlPYmplY3RfRGVsYC4KK2hlYXAsIG9iamVjdHMgaW4gUHl0aG9uIGFyZSBhbGxvY2F0ZWQgYW5kIHJlbGVhc2VkIHdpdGggOmM6ZnVuYzpgUHlPYmplY3RfTmV3YCwKKzpjOmZ1bmM6YFB5T2JqZWN0X05ld1ZhcmAgYW5kIDpjOmZ1bmM6YFB5T2JqZWN0X0RlbGAuCiAKIFRoZXNlIHdpbGwgYmUgZXhwbGFpbmVkIGluIHRoZSBuZXh0IGNoYXB0ZXIgb24gZGVmaW5pbmcgYW5kIGltcGxlbWVudGluZyBuZXcKIG9iamVjdCB0eXBlcyBpbiBDLgpkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL21ldGhvZC5yc3QgYi9Eb2MvYy1hcGkvbWV0aG9kLnJzdAppbmRleCBhZGQxZjBmLi43MWRkZWRhIDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvbWV0aG9kLnJzdAorKysgYi9Eb2MvYy1hcGkvbWV0aG9kLnJzdApAQCAtMTAsMjEgKzEwLDIxIEBACiBUaGVyZSBhcmUgc29tZSB1c2VmdWwgZnVuY3Rpb25zIHRoYXQgYXJlIHVzZWZ1bCBmb3Igd29ya2luZyB3aXRoIG1ldGhvZCBvYmplY3RzLgogCiAKLS4uIGN2YXI6OiBQeVR5cGVPYmplY3QgUHlNZXRob2RfVHlwZQorLi4gYzp2YXI6OiBQeVR5cGVPYmplY3QgUHlNZXRob2RfVHlwZQogCiAgICAuLiBpbmRleDo6IHNpbmdsZTogTWV0aG9kVHlwZSAoaW4gbW9kdWxlIHR5cGVzKQogCi0gICBUaGlzIGluc3RhbmNlIG9mIDpjdHlwZTpgUHlUeXBlT2JqZWN0YCByZXByZXNlbnRzIHRoZSBQeXRob24gbWV0aG9kIHR5cGUuICBUaGlzCisgICBUaGlzIGluc3RhbmNlIG9mIDpjOnR5cGU6YFB5VHlwZU9iamVjdGAgcmVwcmVzZW50cyB0aGUgUHl0aG9uIG1ldGhvZCB0eXBlLiAgVGhpcwogICAgaXMgZXhwb3NlZCB0byBQeXRob24gcHJvZ3JhbXMgYXMgYGB0eXBlcy5NZXRob2RUeXBlYGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5TWV0aG9kX0NoZWNrKFB5T2JqZWN0ICpvKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeU1ldGhvZF9DaGVjayhQeU9iamVjdCAqbykKIAotICAgUmV0dXJuIHRydWUgaWYgKm8qIGlzIGEgbWV0aG9kIG9iamVjdCAoaGFzIHR5cGUgOmNkYXRhOmBQeU1ldGhvZF9UeXBlYCkuICBUaGUKKyAgIFJldHVybiB0cnVlIGlmICpvKiBpcyBhIG1ldGhvZCBvYmplY3QgKGhhcyB0eXBlIDpjOmRhdGE6YFB5TWV0aG9kX1R5cGVgKS4gIFRoZQogICAgcGFyYW1ldGVyIG11c3Qgbm90IGJlICpOVUxMKi4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlNZXRob2RfTmV3KFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmNsYXNzKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU1ldGhvZF9OZXcoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqY2xhc3MpCiAKICAgIFJldHVybiBhIG5ldyBtZXRob2Qgb2JqZWN0LCB3aXRoICpmdW5jKiBiZWluZyBhbnkgY2FsbGFibGUgb2JqZWN0OyB0aGlzIGlzIHRoZQogICAgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBtZXRob2QgaXMgY2FsbGVkLiAgSWYgdGhpcyBtZXRob2Qgc2hvdWxkCkBAIC0zMywzOSArMzMsMzkgQEAKICAgIGNsYXNzIHdoaWNoIHByb3ZpZGVzIHRoZSB1bmJvdW5kIG1ldGhvZC4uCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TWV0aG9kX0NsYXNzKFB5T2JqZWN0ICptZXRoKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU1ldGhvZF9DbGFzcyhQeU9iamVjdCAqbWV0aCkKIAogICAgUmV0dXJuIHRoZSBjbGFzcyBvYmplY3QgZnJvbSB3aGljaCB0aGUgbWV0aG9kICptZXRoKiB3YXMgY3JlYXRlZDsgaWYgdGhpcyB3YXMKICAgIGNyZWF0ZWQgZnJvbSBhbiBpbnN0YW5jZSwgaXQgd2lsbCBiZSB0aGUgY2xhc3Mgb2YgdGhlIGluc3RhbmNlLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU1ldGhvZF9HRVRfQ0xBU1MoUHlPYmplY3QgKm1ldGgpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5TWV0aG9kX0dFVF9DTEFTUyhQeU9iamVjdCAqbWV0aCkKIAotICAgTWFjcm8gdmVyc2lvbiBvZiA6Y2Z1bmM6YFB5TWV0aG9kX0NsYXNzYCB3aGljaCBhdm9pZHMgZXJyb3IgY2hlY2tpbmcuCisgICBNYWNybyB2ZXJzaW9uIG9mIDpjOmZ1bmM6YFB5TWV0aG9kX0NsYXNzYCB3aGljaCBhdm9pZHMgZXJyb3IgY2hlY2tpbmcuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TWV0aG9kX0Z1bmN0aW9uKFB5T2JqZWN0ICptZXRoKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU1ldGhvZF9GdW5jdGlvbihQeU9iamVjdCAqbWV0aCkKIAogICAgUmV0dXJuIHRoZSBmdW5jdGlvbiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXRob2QgKm1ldGgqLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU1ldGhvZF9HRVRfRlVOQ1RJT04oUHlPYmplY3QgKm1ldGgpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5TWV0aG9kX0dFVF9GVU5DVElPTihQeU9iamVjdCAqbWV0aCkKIAotICAgTWFjcm8gdmVyc2lvbiBvZiA6Y2Z1bmM6YFB5TWV0aG9kX0Z1bmN0aW9uYCB3aGljaCBhdm9pZHMgZXJyb3IgY2hlY2tpbmcuCisgICBNYWNybyB2ZXJzaW9uIG9mIDpjOmZ1bmM6YFB5TWV0aG9kX0Z1bmN0aW9uYCB3aGljaCBhdm9pZHMgZXJyb3IgY2hlY2tpbmcuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TWV0aG9kX1NlbGYoUHlPYmplY3QgKm1ldGgpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5TWV0aG9kX1NlbGYoUHlPYmplY3QgKm1ldGgpCiAKICAgIFJldHVybiB0aGUgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXRob2QgKm1ldGgqIGlmIGl0IGlzIGJvdW5kLCBvdGhlcndpc2UKICAgIHJldHVybiAqTlVMTCouCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TWV0aG9kX0dFVF9TRUxGKFB5T2JqZWN0ICptZXRoKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU1ldGhvZF9HRVRfU0VMRihQeU9iamVjdCAqbWV0aCkKIAotICAgTWFjcm8gdmVyc2lvbiBvZiA6Y2Z1bmM6YFB5TWV0aG9kX1NlbGZgIHdoaWNoIGF2b2lkcyBlcnJvciBjaGVja2luZy4KKyAgIE1hY3JvIHZlcnNpb24gb2YgOmM6ZnVuYzpgUHlNZXRob2RfU2VsZmAgd2hpY2ggYXZvaWRzIGVycm9yIGNoZWNraW5nLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeU1ldGhvZF9DbGVhckZyZWVMaXN0KCkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlNZXRob2RfQ2xlYXJGcmVlTGlzdCgpCiAKICAgIENsZWFyIHRoZSBmcmVlIGxpc3QuIFJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGZyZWVkIGl0ZW1zLgogCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvbW9kdWxlLnJzdCBiL0RvYy9jLWFwaS9tb2R1bGUucnN0CmluZGV4IDY0OWM3MjMuLjU2ZTYzY2YgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS9tb2R1bGUucnN0CisrKyBiL0RvYy9jLWFwaS9tb2R1bGUucnN0CkBAIC0xMCwxNSArMTAsMTUgQEAKIFRoZXJlIGFyZSBvbmx5IGEgZmV3IGZ1bmN0aW9ucyBzcGVjaWFsIHRvIG1vZHVsZSBvYmplY3RzLgogCiAKLS4uIGN2YXI6OiBQeVR5cGVPYmplY3QgUHlNb2R1bGVfVHlwZQorLi4gYzp2YXI6OiBQeVR5cGVPYmplY3QgUHlNb2R1bGVfVHlwZQogCiAgICAuLiBpbmRleDo6IHNpbmdsZTogTW9kdWxlVHlwZSAoaW4gbW9kdWxlIHR5cGVzKQogCi0gICBUaGlzIGluc3RhbmNlIG9mIDpjdHlwZTpgUHlUeXBlT2JqZWN0YCByZXByZXNlbnRzIHRoZSBQeXRob24gbW9kdWxlIHR5cGUuICBUaGlzCisgICBUaGlzIGluc3RhbmNlIG9mIDpjOnR5cGU6YFB5VHlwZU9iamVjdGAgcmVwcmVzZW50cyB0aGUgUHl0aG9uIG1vZHVsZSB0eXBlLiAgVGhpcwogICAgaXMgZXhwb3NlZCB0byBQeXRob24gcHJvZ3JhbXMgYXMgYGB0eXBlcy5Nb2R1bGVUeXBlYGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5TW9kdWxlX0NoZWNrKFB5T2JqZWN0ICpwKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeU1vZHVsZV9DaGVjayhQeU9iamVjdCAqcCkKIAogICAgUmV0dXJuIHRydWUgaWYgKnAqIGlzIGEgbW9kdWxlIG9iamVjdCwgb3IgYSBzdWJ0eXBlIG9mIGEgbW9kdWxlIG9iamVjdC4KIApAQCAtMjYsMTUgKzI2LDE1IEBACiAgICAgICBBbGxvd2VkIHN1YnR5cGVzIHRvIGJlIGFjY2VwdGVkLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeU1vZHVsZV9DaGVja0V4YWN0KFB5T2JqZWN0ICpwKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeU1vZHVsZV9DaGVja0V4YWN0KFB5T2JqZWN0ICpwKQogCiAgICBSZXR1cm4gdHJ1ZSBpZiAqcCogaXMgYSBtb2R1bGUgb2JqZWN0LCBidXQgbm90IGEgc3VidHlwZSBvZgotICAgOmNkYXRhOmBQeU1vZHVsZV9UeXBlYC4KKyAgIDpjOmRhdGE6YFB5TW9kdWxlX1R5cGVgLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjIKIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlNb2R1bGVfTmV3KGNvbnN0IGNoYXIgKm5hbWUpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5TW9kdWxlX05ldyhjb25zdCBjaGFyICpuYW1lKQogCiAgICAuLiBpbmRleDo6CiAgICAgICBzaW5nbGU6IF9fbmFtZV9fIChtb2R1bGUgYXR0cmlidXRlKQpAQCAtNDYsMTggKzQ2LDE4IEBACiAgICB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgYSA6YXR0cjpgX19maWxlX19gIGF0dHJpYnV0ZS4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlNb2R1bGVfR2V0RGljdChQeU9iamVjdCAqbW9kdWxlKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU1vZHVsZV9HZXREaWN0KFB5T2JqZWN0ICptb2R1bGUpCiAKICAgIC4uIGluZGV4Ojogc2luZ2xlOiBfX2RpY3RfXyAobW9kdWxlIGF0dHJpYnV0ZSkKIAogICAgUmV0dXJuIHRoZSBkaWN0aW9uYXJ5IG9iamVjdCB0aGF0IGltcGxlbWVudHMgKm1vZHVsZSoncyBuYW1lc3BhY2U7IHRoaXMgb2JqZWN0CiAgICBpcyB0aGUgc2FtZSBhcyB0aGUgOmF0dHI6YF9fZGljdF9fYCBhdHRyaWJ1dGUgb2YgdGhlIG1vZHVsZSBvYmplY3QuICBUaGlzCiAgICBmdW5jdGlvbiBuZXZlciBmYWlscy4gIEl0IGlzIHJlY29tbWVuZGVkIGV4dGVuc2lvbnMgdXNlIG90aGVyCi0gICA6Y2Z1bmM6YFB5TW9kdWxlX1wqYCBhbmQgOmNmdW5jOmBQeU9iamVjdF9cKmAgZnVuY3Rpb25zIHJhdGhlciB0aGFuIGRpcmVjdGx5CisgICA6YzpmdW5jOmBQeU1vZHVsZV9cKmAgYW5kIDpjOmZ1bmM6YFB5T2JqZWN0X1wqYCBmdW5jdGlvbnMgcmF0aGVyIHRoYW4gZGlyZWN0bHkKICAgIG1hbmlwdWxhdGUgYSBtb2R1bGUncyA6YXR0cjpgX19kaWN0X19gLgogCiAKLS4uIGNmdW5jdGlvbjo6IGNoYXIqIFB5TW9kdWxlX0dldE5hbWUoUHlPYmplY3QgKm1vZHVsZSkKKy4uIGM6ZnVuY3Rpb246OiBjaGFyKiBQeU1vZHVsZV9HZXROYW1lKFB5T2JqZWN0ICptb2R1bGUpCiAKICAgIC4uIGluZGV4OjoKICAgICAgIHNpbmdsZTogX19uYW1lX18gKG1vZHVsZSBhdHRyaWJ1dGUpCkBAIC02Nyw3ICs2Nyw3IEBACiAgICBvciBpZiBpdCBpcyBub3QgYSBzdHJpbmcsIDpleGM6YFN5c3RlbUVycm9yYCBpcyByYWlzZWQgYW5kICpOVUxMKiBpcyByZXR1cm5lZC4KIAogCi0uLiBjZnVuY3Rpb246OiBjaGFyKiBQeU1vZHVsZV9HZXRGaWxlbmFtZShQeU9iamVjdCAqbW9kdWxlKQorLi4gYzpmdW5jdGlvbjo6IGNoYXIqIFB5TW9kdWxlX0dldEZpbGVuYW1lKFB5T2JqZWN0ICptb2R1bGUpCiAKICAgIC4uIGluZGV4OjoKICAgICAgIHNpbmdsZTogX19maWxlX18gKG1vZHVsZSBhdHRyaWJ1dGUpCkBAIC03OCw3ICs3OCw3IEBACiAgICByYWlzZSA6ZXhjOmBTeXN0ZW1FcnJvcmAgYW5kIHJldHVybiAqTlVMTCouCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5TW9kdWxlX0FkZE9iamVjdChQeU9iamVjdCAqbW9kdWxlLCBjb25zdCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdmFsdWUpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5TW9kdWxlX0FkZE9iamVjdChQeU9iamVjdCAqbW9kdWxlLCBjb25zdCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdmFsdWUpCiAKICAgIEFkZCBhbiBvYmplY3QgdG8gKm1vZHVsZSogYXMgKm5hbWUqLiAgVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHdoaWNoIGNhbgogICAgYmUgdXNlZCBmcm9tIHRoZSBtb2R1bGUncyBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4gIFRoaXMgc3RlYWxzIGEgcmVmZXJlbmNlIHRvCkBAIC04Nyw3ICs4Nyw3IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjAKIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQoUHlPYmplY3QgKm1vZHVsZSwgY29uc3QgY2hhciAqbmFtZSwgbG9uZyB2YWx1ZSkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQoUHlPYmplY3QgKm1vZHVsZSwgY29uc3QgY2hhciAqbmFtZSwgbG9uZyB2YWx1ZSkKIAogICAgQWRkIGFuIGludGVnZXIgY29uc3RhbnQgdG8gKm1vZHVsZSogYXMgKm5hbWUqLiAgVGhpcyBjb252ZW5pZW5jZSBmdW5jdGlvbiBjYW4gYmUKICAgIHVzZWQgZnJvbSB0aGUgbW9kdWxlJ3MgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uIFJldHVybiBgYC0xYGAgb24gZXJyb3IsIGBgMGBgIG9uCkBAIC05Niw3ICs5Niw3IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjAKIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQoUHlPYmplY3QgKm1vZHVsZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KFB5T2JqZWN0ICptb2R1bGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQogCiAgICBBZGQgYSBzdHJpbmcgY29uc3RhbnQgdG8gKm1vZHVsZSogYXMgKm5hbWUqLiAgVGhpcyBjb252ZW5pZW5jZSBmdW5jdGlvbiBjYW4gYmUKICAgIHVzZWQgZnJvbSB0aGUgbW9kdWxlJ3MgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uICBUaGUgc3RyaW5nICp2YWx1ZSogbXVzdCBiZQpAQCAtMTA0LDcgKzEwNCw3IEBACiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlNb2R1bGVfQWRkSW50TWFjcm8oUHlPYmplY3QgKm1vZHVsZSwgbWFjcm8pCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5TW9kdWxlX0FkZEludE1hY3JvKFB5T2JqZWN0ICptb2R1bGUsIG1hY3JvKQogCiAgICBBZGQgYW4gaW50IGNvbnN0YW50IHRvICptb2R1bGUqLiBUaGUgbmFtZSBhbmQgdGhlIHZhbHVlIGFyZSB0YWtlbiBmcm9tCiAgICAqbWFjcm8qLiBGb3IgZXhhbXBsZSBgYFB5TW9kdWxlX0FkZEludE1hY3JvKG1vZHVsZSwgQUZfSU5FVClgYCBhZGRzIHRoZSBpbnQKQEAgLTExMyw3ICsxMTMsNyBAQAogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjYKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5TW9kdWxlX0FkZFN0cmluZ01hY3JvKFB5T2JqZWN0ICptb2R1bGUsIG1hY3JvKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeU1vZHVsZV9BZGRTdHJpbmdNYWNybyhQeU9iamVjdCAqbW9kdWxlLCBtYWNybykKIAogICAgQWRkIGEgc3RyaW5nIGNvbnN0YW50IHRvICptb2R1bGUqLgogCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvbm9uZS5yc3QgYi9Eb2MvYy1hcGkvbm9uZS5yc3QKaW5kZXggMWJiNjAzZS4uYWVhY2E5NyAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL25vbmUucnN0CisrKyBiL0RvYy9jLWFwaS9ub25lLnJzdApAQCAtNywyMiArNywyMiBAQAogCiAuLiBpbmRleDo6IG9iamVjdDogTm9uZQogCi1Ob3RlIHRoYXQgdGhlIDpjdHlwZTpgUHlUeXBlT2JqZWN0YCBmb3IgYGBOb25lYGAgaXMgbm90IGRpcmVjdGx5IGV4cG9zZWQgaW4gdGhlCitOb3RlIHRoYXQgdGhlIDpjOnR5cGU6YFB5VHlwZU9iamVjdGAgZm9yIGBgTm9uZWBgIGlzIG5vdCBkaXJlY3RseSBleHBvc2VkIGluIHRoZQogUHl0aG9uL0MgQVBJLiAgU2luY2UgYGBOb25lYGAgaXMgYSBzaW5nbGV0b24sIHRlc3RpbmcgZm9yIG9iamVjdCBpZGVudGl0eSAodXNpbmcKLWBgPT1gYCBpbiBDKSBpcyBzdWZmaWNpZW50LiBUaGVyZSBpcyBubyA6Y2Z1bmM6YFB5Tm9uZV9DaGVja2AgZnVuY3Rpb24gZm9yIHRoZQorYGA9PWBgIGluIEMpIGlzIHN1ZmZpY2llbnQuIFRoZXJlIGlzIG5vIDpjOmZ1bmM6YFB5Tm9uZV9DaGVja2AgZnVuY3Rpb24gZm9yIHRoZQogc2FtZSByZWFzb24uCiAKIAotLi4gY3Zhcjo6IFB5T2JqZWN0KiBQeV9Ob25lCisuLiBjOnZhcjo6IFB5T2JqZWN0KiBQeV9Ob25lCiAKICAgIFRoZSBQeXRob24gYGBOb25lYGAgb2JqZWN0LCBkZW5vdGluZyBsYWNrIG9mIHZhbHVlLiAgVGhpcyBvYmplY3QgaGFzIG5vIG1ldGhvZHMuCiAgICBJdCBuZWVkcyB0byBiZSB0cmVhdGVkIGp1c3QgbGlrZSBhbnkgb3RoZXIgb2JqZWN0IHdpdGggcmVzcGVjdCB0byByZWZlcmVuY2UKICAgIGNvdW50cy4KIAogCi0uLiBjbWFjcm86OiBQeV9SRVRVUk5fTk9ORQorLi4gYzptYWNybzo6IFB5X1JFVFVSTl9OT05FCiAKLSAgIFByb3Blcmx5IGhhbmRsZSByZXR1cm5pbmcgOmNkYXRhOmBQeV9Ob25lYCBmcm9tIHdpdGhpbiBhIEMgZnVuY3Rpb24uCisgICBQcm9wZXJseSBoYW5kbGUgcmV0dXJuaW5nIDpjOmRhdGE6YFB5X05vbmVgIGZyb20gd2l0aGluIGEgQyBmdW5jdGlvbi4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi40CiAKZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9udW1iZXIucnN0IGIvRG9jL2MtYXBpL251bWJlci5yc3QKaW5kZXggZmZjMjU4NS4uNzViNzM0MSAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL251bWJlci5yc3QKKysrIGIvRG9jL2MtYXBpL251bWJlci5yc3QKQEAgLTYsMzcgKzYsMzcgQEAKID09PT09PT09PT09PT09PQogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeU51bWJlcl9DaGVjayhQeU9iamVjdCAqbykKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlOdW1iZXJfQ2hlY2soUHlPYmplY3QgKm8pCiAKICAgIFJldHVybnMgYGAxYGAgaWYgdGhlIG9iamVjdCAqbyogcHJvdmlkZXMgbnVtZXJpYyBwcm90b2NvbHMsIGFuZCBmYWxzZSBvdGhlcndpc2UuCiAgICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBzdWNjZWVkcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlOdW1iZXJfQWRkKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU51bWJlcl9BZGQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpCiAKICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhZGRpbmcgKm8xKiBhbmQgKm8yKiwgb3IgKk5VTEwqIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZQogICAgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb24gYGBvMSArIG8yYGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TnVtYmVyX1N1YnRyYWN0KFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU51bWJlcl9TdWJ0cmFjdChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMikKIAogICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHN1YnRyYWN0aW5nICpvMiogZnJvbSAqbzEqLCBvciAqTlVMTCogb24gZmFpbHVyZS4gIFRoaXMgaXMKICAgIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbiBgYG8xIC0gbzJgYC4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlOdW1iZXJfTXVsdGlwbHkoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5TnVtYmVyX011bHRpcGx5KFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKQogCiAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgbXVsdGlwbHlpbmcgKm8xKiBhbmQgKm8yKiwgb3IgKk5VTEwqIG9uIGZhaWx1cmUuICBUaGlzIGlzCiAgICB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb24gYGBvMSAqIG8yYGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TnVtYmVyX0RpdmlkZShQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlOdW1iZXJfRGl2aWRlKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKQogCiAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgZGl2aWRpbmcgKm8xKiBieSAqbzIqLCBvciAqTlVMTCogb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlCiAgICBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbiBgYG8xIC8gbzJgYC4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlOdW1iZXJfRmxvb3JEaXZpZGUoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5TnVtYmVyX0Zsb29yRGl2aWRlKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKQogCiAgICBSZXR1cm4gdGhlIGZsb29yIG9mICpvMSogZGl2aWRlZCBieSAqbzIqLCBvciAqTlVMTCogb24gZmFpbHVyZS4gIFRoaXMgaXMKICAgIGVxdWl2YWxlbnQgdG8gdGhlICJjbGFzc2ljIiBkaXZpc2lvbiBvZiBpbnRlZ2Vycy4KQEAgLTQ0LDcgKzQ0LDcgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU51bWJlcl9UcnVlRGl2aWRlKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU51bWJlcl9UcnVlRGl2aWRlKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKQogCiAgICBSZXR1cm4gYSByZWFzb25hYmxlIGFwcHJveGltYXRpb24gZm9yIHRoZSBtYXRoZW1hdGljYWwgdmFsdWUgb2YgKm8xKiBkaXZpZGVkIGJ5CiAgICAqbzIqLCBvciAqTlVMTCogb24gZmFpbHVyZS4gIFRoZSByZXR1cm4gdmFsdWUgaXMgImFwcHJveGltYXRlIiBiZWNhdXNlIGJpbmFyeQpAQCAtNTUsMTMgKzU1LDEzIEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjIKIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlOdW1iZXJfUmVtYWluZGVyKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU51bWJlcl9SZW1haW5kZXIoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpCiAKICAgIFJldHVybnMgdGhlIHJlbWFpbmRlciBvZiBkaXZpZGluZyAqbzEqIGJ5ICpvMiosIG9yICpOVUxMKiBvbiBmYWlsdXJlLiAgVGhpcyBpcwogICAgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uIGBgbzEgJSBvMmBgLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU51bWJlcl9EaXZtb2QoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5TnVtYmVyX0Rpdm1vZChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMikKIAogICAgLi4gaW5kZXg6OiBidWlsdGluOiBkaXZtb2QKIApAQCAtNjksMjkgKzY5LDI5IEBACiAgICB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb24gYGBkaXZtb2QobzEsIG8yKWBgLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU51bWJlcl9Qb3dlcihQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMiwgUHlPYmplY3QgKm8zKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU51bWJlcl9Qb3dlcihQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMiwgUHlPYmplY3QgKm8zKQogCiAgICAuLiBpbmRleDo6IGJ1aWx0aW46IHBvdwogCiAgICBTZWUgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIDpmdW5jOmBwb3dgLiBSZXR1cm5zICpOVUxMKiBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUKICAgIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uIGBgcG93KG8xLCBvMiwgbzMpYGAsIHdoZXJlICpvMyogaXMgb3B0aW9uYWwuCi0gICBJZiAqbzMqIGlzIHRvIGJlIGlnbm9yZWQsIHBhc3MgOmNkYXRhOmBQeV9Ob25lYCBpbiBpdHMgcGxhY2UgKHBhc3NpbmcgKk5VTEwqIGZvcgorICAgSWYgKm8zKiBpcyB0byBiZSBpZ25vcmVkLCBwYXNzIDpjOmRhdGE6YFB5X05vbmVgIGluIGl0cyBwbGFjZSAocGFzc2luZyAqTlVMTCogZm9yCiAgICAqbzMqIHdvdWxkIGNhdXNlIGFuIGlsbGVnYWwgbWVtb3J5IGFjY2VzcykuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TnVtYmVyX05lZ2F0aXZlKFB5T2JqZWN0ICpvKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU51bWJlcl9OZWdhdGl2ZShQeU9iamVjdCAqbykKIAogICAgUmV0dXJucyB0aGUgbmVnYXRpb24gb2YgKm8qIG9uIHN1Y2Nlc3MsIG9yICpOVUxMKiBvbiBmYWlsdXJlLiBUaGlzIGlzIHRoZQogICAgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb24gYGAtb2BgLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU51bWJlcl9Qb3NpdGl2ZShQeU9iamVjdCAqbykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlOdW1iZXJfUG9zaXRpdmUoUHlPYmplY3QgKm8pCiAKICAgIFJldHVybnMgKm8qIG9uIHN1Y2Nlc3MsIG9yICpOVUxMKiBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUKICAgIFB5dGhvbiBleHByZXNzaW9uIGBgK29gYC4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlOdW1iZXJfQWJzb2x1dGUoUHlPYmplY3QgKm8pCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5TnVtYmVyX0Fic29sdXRlKFB5T2JqZWN0ICpvKQogCiAgICAuLiBpbmRleDo6IGJ1aWx0aW46IGFicwogCkBAIC05OSw3MSArOTksNzEgQEAKICAgIG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbiBgYGFicyhvKWBgLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU51bWJlcl9JbnZlcnQoUHlPYmplY3QgKm8pCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5TnVtYmVyX0ludmVydChQeU9iamVjdCAqbykKIAogICAgUmV0dXJucyB0aGUgYml0d2lzZSBuZWdhdGlvbiBvZiAqbyogb24gc3VjY2Vzcywgb3IgKk5VTEwqIG9uIGZhaWx1cmUuICBUaGlzIGlzCiAgICB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb24gYGB+b2BgLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU51bWJlcl9Mc2hpZnQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5TnVtYmVyX0xzaGlmdChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMikKIAogICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGxlZnQgc2hpZnRpbmcgKm8xKiBieSAqbzIqIG9uIHN1Y2Nlc3MsIG9yICpOVUxMKiBvbgogICAgZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uIGBgbzEgPDwgbzJgYC4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlOdW1iZXJfUnNoaWZ0KFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU51bWJlcl9Sc2hpZnQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpCiAKICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiByaWdodCBzaGlmdGluZyAqbzEqIGJ5ICpvMiogb24gc3VjY2Vzcywgb3IgKk5VTEwqIG9uCiAgICBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb24gYGBvMSA+PiBvMmBgLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU51bWJlcl9BbmQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5TnVtYmVyX0FuZChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMikKIAogICAgUmV0dXJucyB0aGUgImJpdHdpc2UgYW5kIiBvZiAqbzEqIGFuZCAqbzIqIG9uIHN1Y2Nlc3MgYW5kICpOVUxMKiBvbiBmYWlsdXJlLgogICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb24gYGBvMSAmIG8yYGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TnVtYmVyX1hvcihQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlOdW1iZXJfWG9yKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKQogCiAgICBSZXR1cm5zIHRoZSAiYml0d2lzZSBleGNsdXNpdmUgb3IiIG9mICpvMSogYnkgKm8yKiBvbiBzdWNjZXNzLCBvciAqTlVMTCogb24KICAgIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbiBgYG8xIF4gbzJgYC4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlOdW1iZXJfT3IoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5TnVtYmVyX09yKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKQogCiAgICBSZXR1cm5zIHRoZSAiYml0d2lzZSBvciIgb2YgKm8xKiBhbmQgKm8yKiBvbiBzdWNjZXNzLCBvciAqTlVMTCogb24gZmFpbHVyZS4KICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uIGBgbzEgfCBvMmBgLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU51bWJlcl9JblBsYWNlQWRkKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU51bWJlcl9JblBsYWNlQWRkKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKQogCiAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYWRkaW5nICpvMSogYW5kICpvMiosIG9yICpOVUxMKiBvbiBmYWlsdXJlLiAgVGhlIG9wZXJhdGlvbgogICAgaXMgZG9uZSAqaW4tcGxhY2UqIHdoZW4gKm8xKiBzdXBwb3J0cyBpdC4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgogICAgc3RhdGVtZW50IGBgbzEgKz0gbzJgYC4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlOdW1iZXJfSW5QbGFjZVN1YnRyYWN0KFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU51bWJlcl9JblBsYWNlU3VidHJhY3QoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpCiAKICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzdWJ0cmFjdGluZyAqbzIqIGZyb20gKm8xKiwgb3IgKk5VTEwqIG9uIGZhaWx1cmUuICBUaGUKICAgIG9wZXJhdGlvbiBpcyBkb25lICppbi1wbGFjZSogd2hlbiAqbzEqIHN1cHBvcnRzIGl0LiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZgogICAgdGhlIFB5dGhvbiBzdGF0ZW1lbnQgYGBvMSAtPSBvMmBgLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU51bWJlcl9JblBsYWNlTXVsdGlwbHkoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5TnVtYmVyX0luUGxhY2VNdWx0aXBseShQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMikKIAogICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIG11bHRpcGx5aW5nICpvMSogYW5kICpvMiosIG9yICpOVUxMKiBvbiBmYWlsdXJlLiAgVGhlCiAgICBvcGVyYXRpb24gaXMgZG9uZSAqaW4tcGxhY2UqIHdoZW4gKm8xKiBzdXBwb3J0cyBpdC4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YKICAgIHRoZSBQeXRob24gc3RhdGVtZW50IGBgbzEgKj0gbzJgYC4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlOdW1iZXJfSW5QbGFjZURpdmlkZShQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlOdW1iZXJfSW5QbGFjZURpdmlkZShQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMikKIAogICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nICpvMSogYnkgKm8yKiwgb3IgKk5VTEwqIG9uIGZhaWx1cmUuICBUaGUKICAgIG9wZXJhdGlvbiBpcyBkb25lICppbi1wbGFjZSogd2hlbiAqbzEqIHN1cHBvcnRzIGl0LiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mCiAgICB0aGUgUHl0aG9uIHN0YXRlbWVudCBgYG8xIC89IG8yYGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TnVtYmVyX0luUGxhY2VGbG9vckRpdmlkZShQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlOdW1iZXJfSW5QbGFjZUZsb29yRGl2aWRlKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKQogCiAgICBSZXR1cm5zIHRoZSBtYXRoZW1hdGljYWwgZmxvb3Igb2YgZGl2aWRpbmcgKm8xKiBieSAqbzIqLCBvciAqTlVMTCogb24gZmFpbHVyZS4KICAgIFRoZSBvcGVyYXRpb24gaXMgZG9uZSAqaW4tcGxhY2UqIHdoZW4gKm8xKiBzdXBwb3J0cyBpdC4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQKQEAgLTE3Miw3ICsxNzIsNyBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4yCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TnVtYmVyX0luUGxhY2VUcnVlRGl2aWRlKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU51bWJlcl9JblBsYWNlVHJ1ZURpdmlkZShQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMikKIAogICAgUmV0dXJuIGEgcmVhc29uYWJsZSBhcHByb3hpbWF0aW9uIGZvciB0aGUgbWF0aGVtYXRpY2FsIHZhbHVlIG9mICpvMSogZGl2aWRlZCBieQogICAgKm8yKiwgb3IgKk5VTEwqIG9uIGZhaWx1cmUuICBUaGUgcmV0dXJuIHZhbHVlIGlzICJhcHByb3hpbWF0ZSIgYmVjYXVzZSBiaW5hcnkKQEAgLTE4Myw2NCArMTgzLDY0IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjIKIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlOdW1iZXJfSW5QbGFjZVJlbWFpbmRlcihQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlOdW1iZXJfSW5QbGFjZVJlbWFpbmRlcihQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMikKIAogICAgUmV0dXJucyB0aGUgcmVtYWluZGVyIG9mIGRpdmlkaW5nICpvMSogYnkgKm8yKiwgb3IgKk5VTEwqIG9uIGZhaWx1cmUuICBUaGUKICAgIG9wZXJhdGlvbiBpcyBkb25lICppbi1wbGFjZSogd2hlbiAqbzEqIHN1cHBvcnRzIGl0LiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZgogICAgdGhlIFB5dGhvbiBzdGF0ZW1lbnQgYGBvMSAlPSBvMmBgLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU51bWJlcl9JblBsYWNlUG93ZXIoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIsIFB5T2JqZWN0ICpvMykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlOdW1iZXJfSW5QbGFjZVBvd2VyKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yLCBQeU9iamVjdCAqbzMpCiAKICAgIC4uIGluZGV4OjogYnVpbHRpbjogcG93CiAKICAgIFNlZSB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gOmZ1bmM6YHBvd2AuIFJldHVybnMgKk5VTEwqIG9uIGZhaWx1cmUuICBUaGUgb3BlcmF0aW9uCiAgICBpcyBkb25lICppbi1wbGFjZSogd2hlbiAqbzEqIHN1cHBvcnRzIGl0LiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCi0gICBzdGF0ZW1lbnQgYGBvMSAqKj0gbzJgYCB3aGVuIG8zIGlzIDpjZGF0YTpgUHlfTm9uZWAsIG9yIGFuIGluLXBsYWNlIHZhcmlhbnQgb2YKLSAgIGBgcG93KG8xLCBvMiwgbzMpYGAgb3RoZXJ3aXNlLiBJZiAqbzMqIGlzIHRvIGJlIGlnbm9yZWQsIHBhc3MgOmNkYXRhOmBQeV9Ob25lYAorICAgc3RhdGVtZW50IGBgbzEgKio9IG8yYGAgd2hlbiBvMyBpcyA6YzpkYXRhOmBQeV9Ob25lYCwgb3IgYW4gaW4tcGxhY2UgdmFyaWFudCBvZgorICAgYGBwb3cobzEsIG8yLCBvMylgYCBvdGhlcndpc2UuIElmICpvMyogaXMgdG8gYmUgaWdub3JlZCwgcGFzcyA6YzpkYXRhOmBQeV9Ob25lYAogICAgaW4gaXRzIHBsYWNlIChwYXNzaW5nICpOVUxMKiBmb3IgKm8zKiB3b3VsZCBjYXVzZSBhbiBpbGxlZ2FsIG1lbW9yeSBhY2Nlc3MpLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU51bWJlcl9JblBsYWNlTHNoaWZ0KFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU51bWJlcl9JblBsYWNlTHNoaWZ0KFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKQogCiAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgbGVmdCBzaGlmdGluZyAqbzEqIGJ5ICpvMiogb24gc3VjY2Vzcywgb3IgKk5VTEwqIG9uCiAgICBmYWlsdXJlLiAgVGhlIG9wZXJhdGlvbiBpcyBkb25lICppbi1wbGFjZSogd2hlbiAqbzEqIHN1cHBvcnRzIGl0LiAgVGhpcyBpcyB0aGUKICAgIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBzdGF0ZW1lbnQgYGBvMSA8PD0gbzJgYC4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlOdW1iZXJfSW5QbGFjZVJzaGlmdChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlOdW1iZXJfSW5QbGFjZVJzaGlmdChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMikKIAogICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJpZ2h0IHNoaWZ0aW5nICpvMSogYnkgKm8yKiBvbiBzdWNjZXNzLCBvciAqTlVMTCogb24KICAgIGZhaWx1cmUuICBUaGUgb3BlcmF0aW9uIGlzIGRvbmUgKmluLXBsYWNlKiB3aGVuICpvMSogc3VwcG9ydHMgaXQuICBUaGlzIGlzIHRoZQogICAgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudCBgYG8xID4+PSBvMmBgLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU51bWJlcl9JblBsYWNlQW5kKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU51bWJlcl9JblBsYWNlQW5kKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKQogCiAgICBSZXR1cm5zIHRoZSAiYml0d2lzZSBhbmQiIG9mICpvMSogYW5kICpvMiogb24gc3VjY2VzcyBhbmQgKk5VTEwqIG9uIGZhaWx1cmUuIFRoZQogICAgb3BlcmF0aW9uIGlzIGRvbmUgKmluLXBsYWNlKiB3aGVuICpvMSogc3VwcG9ydHMgaXQuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mCiAgICB0aGUgUHl0aG9uIHN0YXRlbWVudCBgYG8xICY9IG8yYGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TnVtYmVyX0luUGxhY2VYb3IoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5TnVtYmVyX0luUGxhY2VYb3IoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpCiAKICAgIFJldHVybnMgdGhlICJiaXR3aXNlIGV4Y2x1c2l2ZSBvciIgb2YgKm8xKiBieSAqbzIqIG9uIHN1Y2Nlc3MsIG9yICpOVUxMKiBvbgogICAgZmFpbHVyZS4gIFRoZSBvcGVyYXRpb24gaXMgZG9uZSAqaW4tcGxhY2UqIHdoZW4gKm8xKiBzdXBwb3J0cyBpdC4gIFRoaXMgaXMgdGhlCiAgICBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gc3RhdGVtZW50IGBgbzEgXj0gbzJgYC4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlOdW1iZXJfSW5QbGFjZU9yKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU51bWJlcl9JblBsYWNlT3IoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpCiAKICAgIFJldHVybnMgdGhlICJiaXR3aXNlIG9yIiBvZiAqbzEqIGFuZCAqbzIqIG9uIHN1Y2Nlc3MsIG9yICpOVUxMKiBvbiBmYWlsdXJlLiAgVGhlCiAgICBvcGVyYXRpb24gaXMgZG9uZSAqaW4tcGxhY2UqIHdoZW4gKm8xKiBzdXBwb3J0cyBpdC4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YKICAgIHRoZSBQeXRob24gc3RhdGVtZW50IGBgbzEgfD0gbzJgYC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlOdW1iZXJfQ29lcmNlKFB5T2JqZWN0ICoqcDEsIFB5T2JqZWN0ICoqcDIpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5TnVtYmVyX0NvZXJjZShQeU9iamVjdCAqKnAxLCBQeU9iamVjdCAqKnAyKQogCiAgICAuLiBpbmRleDo6IGJ1aWx0aW46IGNvZXJjZQogCi0gICBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBhZGRyZXNzZXMgb2YgdHdvIHZhcmlhYmxlcyBvZiB0eXBlIDpjdHlwZTpgUHlPYmplY3RcKmAuCisgICBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBhZGRyZXNzZXMgb2YgdHdvIHZhcmlhYmxlcyBvZiB0eXBlIDpjOnR5cGU6YFB5T2JqZWN0XCpgLgogICAgSWYgdGhlIG9iamVjdHMgcG9pbnRlZCB0byBieSBgYCpwMWBgIGFuZCBgYCpwMmBgIGhhdmUgdGhlIHNhbWUgdHlwZSwgaW5jcmVtZW50CiAgICB0aGVpciByZWZlcmVuY2UgY291bnQgYW5kIHJldHVybiBgYDBgYCAoc3VjY2VzcykuIElmIHRoZSBvYmplY3RzIGNhbiBiZQogICAgY29udmVydGVkIHRvIGEgY29tbW9uIG51bWVyaWMgdHlwZSwgcmVwbGFjZSBgYCpwMWBgIGFuZCBgYCpwMmBgIGJ5IHRoZWlyCkBAIC0yNTAsMTQgKzI1MCwxNCBAQAogICAgJm8yKWBgIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbiBzdGF0ZW1lbnQgYGBvMSwgbzIgPSBjb2VyY2UobzEsIG8yKWBgLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeU51bWJlcl9Db2VyY2VFeChQeU9iamVjdCAqKnAxLCBQeU9iamVjdCAqKnAyKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeU51bWJlcl9Db2VyY2VFeChQeU9iamVjdCAqKnAxLCBQeU9iamVjdCAqKnAyKQogCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gOmNmdW5jOmBQeU51bWJlcl9Db2VyY2VgLCBleGNlcHQgdGhhdCBpdCByZXR1cm5zCisgICBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gOmM6ZnVuYzpgUHlOdW1iZXJfQ29lcmNlYCwgZXhjZXB0IHRoYXQgaXQgcmV0dXJucwogICAgYGAxYGAgd2hlbiB0aGUgY29udmVyc2lvbiBpcyBub3QgcG9zc2libGUgYW5kIHdoZW4gbm8gZXJyb3IgaXMgcmFpc2VkLgogICAgUmVmZXJlbmNlIGNvdW50cyBhcmUgc3RpbGwgbm90IGluY3JlYXNlZCBpbiB0aGlzIGNhc2UuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TnVtYmVyX0ludChQeU9iamVjdCAqbykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlOdW1iZXJfSW50KFB5T2JqZWN0ICpvKQogCiAgICAuLiBpbmRleDo6IGJ1aWx0aW46IGludAogCkBAIC0yNjYsNyArMjY2LDcgQEAKICAgIGluc3RlYWQuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uIGBgaW50KG8pYGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5TnVtYmVyX0xvbmcoUHlPYmplY3QgKm8pCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5TnVtYmVyX0xvbmcoUHlPYmplY3QgKm8pCiAKICAgIC4uIGluZGV4OjogYnVpbHRpbjogbG9uZwogCkBAIC0yNzQsNyArMjc0LDcgQEAKICAgIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbiBgYGxvbmcobylgYC4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlOdW1iZXJfRmxvYXQoUHlPYmplY3QgKm8pCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5TnVtYmVyX0Zsb2F0KFB5T2JqZWN0ICpvKQogCiAgICAuLiBpbmRleDo6IGJ1aWx0aW46IGZsb2F0CiAKQEAgLTI4Miw3ICsyODIsNyBAQAogICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb24gYGBmbG9hdChvKWBgLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU51bWJlcl9JbmRleChQeU9iamVjdCAqbykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlOdW1iZXJfSW5kZXgoUHlPYmplY3QgKm8pCiAKICAgIFJldHVybnMgdGhlICpvKiBjb252ZXJ0ZWQgdG8gYSBQeXRob24gaW50IG9yIGxvbmcgb24gc3VjY2VzcyBvciAqTlVMTCogd2l0aCBhCiAgICA6ZXhjOmBUeXBlRXJyb3JgIGV4Y2VwdGlvbiByYWlzZWQgb24gZmFpbHVyZS4KQEAgLTI5MCwxOCArMjkwLDE4IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjUKIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlOdW1iZXJfVG9CYXNlKFB5T2JqZWN0ICpuLCBpbnQgYmFzZSkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlOdW1iZXJfVG9CYXNlKFB5T2JqZWN0ICpuLCBpbnQgYmFzZSkKIAogICAgUmV0dXJucyB0aGUgaW50ZWdlciAqbiogY29udmVydGVkIHRvICpiYXNlKiBhcyBhIHN0cmluZyB3aXRoIGEgYmFzZQogICAgbWFya2VyIG9mIGBgJzBiJ2BgLCBgYCcwbydgYCwgb3IgYGAnMHgnYGAgaWYgYXBwbGljYWJsZS4gIFdoZW4KICAgICpiYXNlKiBpcyBub3QgMiwgOCwgMTAsIG9yIDE2LCB0aGUgZm9ybWF0IGlzIGBgJ3gjbnVtJ2BgIHdoZXJlIHggaXMgdGhlCiAgICBiYXNlLiBJZiAqbiogaXMgbm90IGFuIGludCBvYmplY3QsIGl0IGlzIGNvbnZlcnRlZCB3aXRoCi0gICA6Y2Z1bmM6YFB5TnVtYmVyX0luZGV4YCBmaXJzdC4KKyAgIDpjOmZ1bmM6YFB5TnVtYmVyX0luZGV4YCBmaXJzdC4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi42CiAKIAotLi4gY2Z1bmN0aW9uOjogUHlfc3NpemVfdCBQeU51bWJlcl9Bc1NzaXplX3QoUHlPYmplY3QgKm8sIFB5T2JqZWN0ICpleGMpCisuLiBjOmZ1bmN0aW9uOjogUHlfc3NpemVfdCBQeU51bWJlcl9Bc1NzaXplX3QoUHlPYmplY3QgKm8sIFB5T2JqZWN0ICpleGMpCiAKICAgIFJldHVybnMgKm8qIGNvbnZlcnRlZCB0byBhIFB5X3NzaXplX3QgdmFsdWUgaWYgKm8qIGNhbiBiZSBpbnRlcnByZXRlZCBhcyBhbgogICAgaW50ZWdlci4gSWYgKm8qIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBQeXRob24gaW50IG9yIGxvbmcgYnV0IHRoZSBhdHRlbXB0IHRvCkBAIC0zMTQsNyArMzE0LDcgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNQogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUluZGV4X0NoZWNrKFB5T2JqZWN0ICpvKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUluZGV4X0NoZWNrKFB5T2JqZWN0ICpvKQogCiAgICBSZXR1cm5zIFRydWUgaWYgKm8qIGlzIGFuIGluZGV4IGludGVnZXIgKGhhcyB0aGUgbmJfaW5kZXggc2xvdCBvZiAgdGhlCiAgICB0cF9hc19udW1iZXIgc3RydWN0dXJlIGZpbGxlZCBpbikuCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvb2JqYnVmZmVyLnJzdCBiL0RvYy9jLWFwaS9vYmpidWZmZXIucnN0CmluZGV4IDkzZjVmZjAuLmM1MjI4YzYgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS9vYmpidWZmZXIucnN0CisrKyBiL0RvYy9jLWFwaS9vYmpidWZmZXIucnN0CkBAIC04LDEyICs4LDEyIEBACiAKIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIGxlZ2FjeSBidWZmZXIgcHJvdG9jb2wsIHdoaWNoIGhhcyBiZWVuIGludHJvZHVjZWQKIGluIFB5dGhvbiAxLjYuIEl0IGlzIHN0aWxsIHN1cHBvcnRlZCBidXQgZGVwcmVjYXRlZCBpbiB0aGUgUHl0aG9uIDIueCBzZXJpZXMuCi1QeXRob24gMy4wIGludHJvZHVjZXMgYSBuZXcgYnVmZmVyIHByb3RvY29sIHdoaWNoIGZpeGVzIHdlYWtuZXNzZXMgYW5kCitQeXRob24gMyBpbnRyb2R1Y2VzIGEgbmV3IGJ1ZmZlciBwcm90b2NvbCB3aGljaCBmaXhlcyB3ZWFrbmVzc2VzIGFuZAogc2hvcnRjb21pbmdzIG9mIHRoZSBwcm90b2NvbCwgYW5kIGhhcyBiZWVuIGJhY2twb3J0ZWQgdG8gUHl0aG9uIDIuNi4gIFNlZQogOnJlZjpgYnVmZmVyb2JqZWN0c2AgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihQeU9iamVjdCAqb2JqLCBjb25zdCBjaGFyICoqYnVmZmVyLCBQeV9zc2l6ZV90ICpidWZmZXJfbGVuKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeU9iamVjdF9Bc0NoYXJCdWZmZXIoUHlPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqKmJ1ZmZlciwgUHlfc3NpemVfdCAqYnVmZmVyX2xlbikKIAogICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gYSByZWFkLW9ubHkgbWVtb3J5IGxvY2F0aW9uIHVzYWJsZSBhcyBjaGFyYWN0ZXItYmFzZWQKICAgIGlucHV0LiAgVGhlICpvYmoqIGFyZ3VtZW50IG11c3Qgc3VwcG9ydCB0aGUgc2luZ2xlLXNlZ21lbnQgY2hhcmFjdGVyIGJ1ZmZlcgpAQCAtMjQsMTEgKzI0LDExIEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjYKIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Y3R5cGU6YGludCAqYCB0eXBlIGZvciAqYnVmZmVyX2xlbiouIFRoaXMgbWlnaHQKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnQgKmAgdHlwZSBmb3IgKmJ1ZmZlcl9sZW4qLiBUaGlzIG1pZ2h0CiAgICAgICByZXF1aXJlIGNoYW5nZXMgaW4geW91ciBjb2RlIGZvciBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeU9iamVjdF9Bc1JlYWRCdWZmZXIoUHlPYmplY3QgKm9iaiwgY29uc3Qgdm9pZCAqKmJ1ZmZlciwgUHlfc3NpemVfdCAqYnVmZmVyX2xlbikKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlPYmplY3RfQXNSZWFkQnVmZmVyKFB5T2JqZWN0ICpvYmosIGNvbnN0IHZvaWQgKipidWZmZXIsIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW4pCiAKICAgIFJldHVybnMgYSBwb2ludGVyIHRvIGEgcmVhZC1vbmx5IG1lbW9yeSBsb2NhdGlvbiBjb250YWluaW5nIGFyYml0cmFyeSBkYXRhLgogICAgVGhlICpvYmoqIGFyZ3VtZW50IG11c3Qgc3VwcG9ydCB0aGUgc2luZ2xlLXNlZ21lbnQgcmVhZGFibGUgYnVmZmVyCkBAIC0zOSwxMSArMzksMTEgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuNgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjdHlwZTpgaW50ICpgIHR5cGUgZm9yICpidWZmZXJfbGVuKi4gVGhpcyBtaWdodAorICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjOnR5cGU6YGludCAqYCB0eXBlIGZvciAqYnVmZmVyX2xlbiouIFRoaXMgbWlnaHQKICAgICAgIHJlcXVpcmUgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5T2JqZWN0X0NoZWNrUmVhZEJ1ZmZlcihQeU9iamVjdCAqbykKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlPYmplY3RfQ2hlY2tSZWFkQnVmZmVyKFB5T2JqZWN0ICpvKQogCiAgICBSZXR1cm5zIGBgMWBgIGlmICpvKiBzdXBwb3J0cyB0aGUgc2luZ2xlLXNlZ21lbnQgcmVhZGFibGUgYnVmZmVyIGludGVyZmFjZS4KICAgIE90aGVyd2lzZSByZXR1cm5zIGBgMGBgLgpAQCAtNTEsNyArNTEsNyBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4yCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5T2JqZWN0X0FzV3JpdGVCdWZmZXIoUHlPYmplY3QgKm9iaiwgdm9pZCAqKmJ1ZmZlciwgUHlfc3NpemVfdCAqYnVmZmVyX2xlbikKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlPYmplY3RfQXNXcml0ZUJ1ZmZlcihQeU9iamVjdCAqb2JqLCB2b2lkICoqYnVmZmVyLCBQeV9zc2l6ZV90ICpidWZmZXJfbGVuKQogCiAgICBSZXR1cm5zIGEgcG9pbnRlciB0byBhIHdyaXRlYWJsZSBtZW1vcnkgbG9jYXRpb24uICBUaGUgKm9iaiogYXJndW1lbnQgbXVzdAogICAgc3VwcG9ydCB0aGUgc2luZ2xlLXNlZ21lbnQsIGNoYXJhY3RlciBidWZmZXIgaW50ZXJmYWNlLiAgT24gc3VjY2VzcywKQEAgLTYxLDYgKzYxLDYgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuNgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjdHlwZTpgaW50ICpgIHR5cGUgZm9yICpidWZmZXJfbGVuKi4gVGhpcyBtaWdodAorICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjOnR5cGU6YGludCAqYCB0eXBlIGZvciAqYnVmZmVyX2xlbiouIFRoaXMgbWlnaHQKICAgICAgIHJlcXVpcmUgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9vYmplY3QucnN0IGIvRG9jL2MtYXBpL29iamVjdC5yc3QKaW5kZXggNzE3ZmIwOC4uNTBiODNlOSAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL29iamVjdC5yc3QKKysrIGIvRG9jL2MtYXBpL29iamVjdC5yc3QKQEAgLTYsNyArNiw3IEBACiA9PT09PT09PT09PT09PT0KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlPYmplY3RfUHJpbnQoUHlPYmplY3QgKm8sIEZJTEUgKmZwLCBpbnQgZmxhZ3MpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5T2JqZWN0X1ByaW50KFB5T2JqZWN0ICpvLCBGSUxFICpmcCwgaW50IGZsYWdzKQogCiAgICBQcmludCBhbiBvYmplY3QgKm8qLCBvbiBmaWxlICpmcCouICBSZXR1cm5zIGBgLTFgYCBvbiBlcnJvci4gIFRoZSBmbGFncyBhcmd1bWVudAogICAgaXMgdXNlZCB0byBlbmFibGUgY2VydGFpbiBwcmludGluZyBvcHRpb25zLiAgVGhlIG9ubHkgb3B0aW9uIGN1cnJlbnRseSBzdXBwb3J0ZWQKQEAgLTE0LDgxICsxNCw4MSBAQAogICAgaW5zdGVhZCBvZiB0aGUgOmZ1bmM6YHJlcHJgLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeU9iamVjdF9IYXNBdHRyKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqYXR0cl9uYW1lKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeU9iamVjdF9IYXNBdHRyKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqYXR0cl9uYW1lKQogCiAgICBSZXR1cm5zIGBgMWBgIGlmICpvKiBoYXMgdGhlIGF0dHJpYnV0ZSAqYXR0cl9uYW1lKiwgYW5kIGBgMGBgIG90aGVyd2lzZS4gIFRoaXMKICAgIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbiBleHByZXNzaW9uIGBgaGFzYXR0cihvLCBhdHRyX25hbWUpYGAuICBUaGlzIGZ1bmN0aW9uCiAgICBhbHdheXMgc3VjY2VlZHMuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcoUHlPYmplY3QgKm8sIGNvbnN0IGNoYXIgKmF0dHJfbmFtZSkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlPYmplY3RfSGFzQXR0clN0cmluZyhQeU9iamVjdCAqbywgY29uc3QgY2hhciAqYXR0cl9uYW1lKQogCiAgICBSZXR1cm5zIGBgMWBgIGlmICpvKiBoYXMgdGhlIGF0dHJpYnV0ZSAqYXR0cl9uYW1lKiwgYW5kIGBgMGBgIG90aGVyd2lzZS4gIFRoaXMKICAgIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbiBleHByZXNzaW9uIGBgaGFzYXR0cihvLCBhdHRyX25hbWUpYGAuICBUaGlzIGZ1bmN0aW9uCiAgICBhbHdheXMgc3VjY2VlZHMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5T2JqZWN0X0dldEF0dHIoUHlPYmplY3QgKm8sIFB5T2JqZWN0ICphdHRyX25hbWUpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5T2JqZWN0X0dldEF0dHIoUHlPYmplY3QgKm8sIFB5T2JqZWN0ICphdHRyX25hbWUpCiAKICAgIFJldHJpZXZlIGFuIGF0dHJpYnV0ZSBuYW1lZCAqYXR0cl9uYW1lKiBmcm9tIG9iamVjdCAqbyouIFJldHVybnMgdGhlIGF0dHJpYnV0ZQogICAgdmFsdWUgb24gc3VjY2Vzcywgb3IgKk5VTEwqIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KICAgIGV4cHJlc3Npb24gYGBvLmF0dHJfbmFtZWBgLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKFB5T2JqZWN0ICpvLCBjb25zdCBjaGFyICphdHRyX25hbWUpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoUHlPYmplY3QgKm8sIGNvbnN0IGNoYXIgKmF0dHJfbmFtZSkKIAogICAgUmV0cmlldmUgYW4gYXR0cmlidXRlIG5hbWVkICphdHRyX25hbWUqIGZyb20gb2JqZWN0ICpvKi4gUmV0dXJucyB0aGUgYXR0cmlidXRlCiAgICB2YWx1ZSBvbiBzdWNjZXNzLCBvciAqTlVMTCogb24gZmFpbHVyZS4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCiAgICBleHByZXNzaW9uIGBgby5hdHRyX25hbWVgYC4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlPYmplY3RfR2VuZXJpY0dldEF0dHIoUHlPYmplY3QgKm8sIFB5T2JqZWN0ICpuYW1lKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU9iamVjdF9HZW5lcmljR2V0QXR0cihQeU9iamVjdCAqbywgUHlPYmplY3QgKm5hbWUpCiAKICAgIEdlbmVyaWMgYXR0cmlidXRlIGdldHRlciBmdW5jdGlvbiB0aGF0IGlzIG1lYW50IHRvIGJlIHB1dCBpbnRvIGEgdHlwZQogICAgb2JqZWN0J3MgYGB0cF9nZXRhdHRyb2BgIHNsb3QuICBJdCBsb29rcyBmb3IgYSBkZXNjcmlwdG9yIGluIHRoZSBkaWN0aW9uYXJ5CiAgICBvZiBjbGFzc2VzIGluIHRoZSBvYmplY3QncyBNUk8gYXMgd2VsbCBhcyBhbiBhdHRyaWJ1dGUgaW4gdGhlIG9iamVjdCdzCi0gICA6YXR0cjpgX19kaWN0X19gIChpZiBwcmVzZW50KS4gIEFzIG91dGxpbmVkIGluIDpyZWY6YGRlc2NyaXB0b3JzYCwgZGF0YQotICAgZGVzY3JpcHRvcnMgdGFrZSBwcmVmZXJlbmNlIG92ZXIgaW5zdGFuY2UgYXR0cmlidXRlcywgd2hpbGUgbm9uLWRhdGEKKyAgIDphdHRyOmB+b2JqZWN0Ll9fZGljdF9fYCAoaWYgcHJlc2VudCkuICBBcyBvdXRsaW5lZCBpbiA6cmVmOmBkZXNjcmlwdG9yc2AsCisgICBkYXRhIGRlc2NyaXB0b3JzIHRha2UgcHJlZmVyZW5jZSBvdmVyIGluc3RhbmNlIGF0dHJpYnV0ZXMsIHdoaWxlIG5vbi1kYXRhCiAgICBkZXNjcmlwdG9ycyBkb24ndC4gIE90aGVyd2lzZSwgYW4gOmV4YzpgQXR0cmlidXRlRXJyb3JgIGlzIHJhaXNlZC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlPYmplY3RfU2V0QXR0cihQeU9iamVjdCAqbywgUHlPYmplY3QgKmF0dHJfbmFtZSwgUHlPYmplY3QgKnYpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5T2JqZWN0X1NldEF0dHIoUHlPYmplY3QgKm8sIFB5T2JqZWN0ICphdHRyX25hbWUsIFB5T2JqZWN0ICp2KQogCiAgICBTZXQgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgbmFtZWQgKmF0dHJfbmFtZSosIGZvciBvYmplY3QgKm8qLCB0byB0aGUgdmFsdWUKICAgICp2Ki4gUmV0dXJucyBgYC0xYGAgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBzdGF0ZW1lbnQKICAgIGBgby5hdHRyX25hbWUgPSB2YGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoUHlPYmplY3QgKm8sIGNvbnN0IGNoYXIgKmF0dHJfbmFtZSwgUHlPYmplY3QgKnYpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoUHlPYmplY3QgKm8sIGNvbnN0IGNoYXIgKmF0dHJfbmFtZSwgUHlPYmplY3QgKnYpCiAKICAgIFNldCB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBuYW1lZCAqYXR0cl9uYW1lKiwgZm9yIG9iamVjdCAqbyosIHRvIHRoZSB2YWx1ZQogICAgKnYqLiBSZXR1cm5zIGBgLTFgYCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudAogICAgYGBvLmF0dHJfbmFtZSA9IHZgYC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIoUHlPYmplY3QgKm8sIFB5T2JqZWN0ICpuYW1lLCBQeU9iamVjdCAqdmFsdWUpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqbmFtZSwgUHlPYmplY3QgKnZhbHVlKQogCiAgICBHZW5lcmljIGF0dHJpYnV0ZSBzZXR0ZXIgZnVuY3Rpb24gdGhhdCBpcyBtZWFudCB0byBiZSBwdXQgaW50byBhIHR5cGUKICAgIG9iamVjdCdzIGBgdHBfc2V0YXR0cm9gYCBzbG90LiAgSXQgbG9va3MgZm9yIGEgZGF0YSBkZXNjcmlwdG9yIGluIHRoZQogICAgZGljdGlvbmFyeSBvZiBjbGFzc2VzIGluIHRoZSBvYmplY3QncyBNUk8sIGFuZCBpZiBmb3VuZCBpdCB0YWtlcyBwcmVmZXJlbmNlCiAgICBvdmVyIHNldHRpbmcgdGhlIGF0dHJpYnV0ZSBpbiB0aGUgaW5zdGFuY2UgZGljdGlvbmFyeS4gT3RoZXJ3aXNlLCB0aGUKLSAgIGF0dHJpYnV0ZSBpcyBzZXQgaW4gdGhlIG9iamVjdCdzIDphdHRyOmBfX2RpY3RfX2AgKGlmIHByZXNlbnQpLiAgT3RoZXJ3aXNlLAotICAgYW4gOmV4YzpgQXR0cmlidXRlRXJyb3JgIGlzIHJhaXNlZCBhbmQgYGAtMWBgIGlzIHJldHVybmVkLgorICAgYXR0cmlidXRlIGlzIHNldCBpbiB0aGUgb2JqZWN0J3MgOmF0dHI6YH5vYmplY3QuX19kaWN0X19gIChpZiBwcmVzZW50KS4KKyAgIE90aGVyd2lzZSwgYW4gOmV4YzpgQXR0cmlidXRlRXJyb3JgIGlzIHJhaXNlZCBhbmQgYGAtMWBgIGlzIHJldHVybmVkLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeU9iamVjdF9EZWxBdHRyKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqYXR0cl9uYW1lKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeU9iamVjdF9EZWxBdHRyKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqYXR0cl9uYW1lKQogCiAgICBEZWxldGUgYXR0cmlidXRlIG5hbWVkICphdHRyX25hbWUqLCBmb3Igb2JqZWN0ICpvKi4gUmV0dXJucyBgYC0xYGAgb24gZmFpbHVyZS4KICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBzdGF0ZW1lbnQgYGBkZWwgby5hdHRyX25hbWVgYC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlPYmplY3RfRGVsQXR0clN0cmluZyhQeU9iamVjdCAqbywgY29uc3QgY2hhciAqYXR0cl9uYW1lKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeU9iamVjdF9EZWxBdHRyU3RyaW5nKFB5T2JqZWN0ICpvLCBjb25zdCBjaGFyICphdHRyX25hbWUpCiAKICAgIERlbGV0ZSBhdHRyaWJ1dGUgbmFtZWQgKmF0dHJfbmFtZSosIGZvciBvYmplY3QgKm8qLiBSZXR1cm5zIGBgLTFgYCBvbiBmYWlsdXJlLgogICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudCBgYGRlbCBvLmF0dHJfbmFtZWBgLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU9iamVjdF9SaWNoQ29tcGFyZShQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMiwgaW50IG9waWQpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5T2JqZWN0X1JpY2hDb21wYXJlKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yLCBpbnQgb3BpZCkKIAogICAgQ29tcGFyZSB0aGUgdmFsdWVzIG9mICpvMSogYW5kICpvMiogdXNpbmcgdGhlIG9wZXJhdGlvbiBzcGVjaWZpZWQgYnkgKm9waWQqLAogICAgd2hpY2ggbXVzdCBiZSBvbmUgb2YgOmNvbnN0OmBQeV9MVGAsIDpjb25zdDpgUHlfTEVgLCA6Y29uc3Q6YFB5X0VRYCwKQEAgLTk4LDcgKzk4LDcgQEAKICAgIHRvICpvcGlkKi4gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGNvbXBhcmlzb24gb24gc3VjY2Vzcywgb3IgKk5VTEwqIG9uIGZhaWx1cmUuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMiwgaW50IG9waWQpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMiwgaW50IG9waWQpCiAKICAgIENvbXBhcmUgdGhlIHZhbHVlcyBvZiAqbzEqIGFuZCAqbzIqIHVzaW5nIHRoZSBvcGVyYXRpb24gc3BlY2lmaWVkIGJ5ICpvcGlkKiwKICAgIHdoaWNoIG11c3QgYmUgb25lIG9mIDpjb25zdDpgUHlfTFRgLCA6Y29uc3Q6YFB5X0xFYCwgOmNvbnN0OmBQeV9FUWAsCkBAIC0xMDksMTAgKzEwOSwxMCBAQAogICAgKm9waWQqLgogCiAuLiBub3RlOjoKLSAgIElmICpvMSogYW5kICpvMiogYXJlIHRoZSBzYW1lIG9iamVjdCwgOmNmdW5jOmBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2xgCisgICBJZiAqbzEqIGFuZCAqbzIqIGFyZSB0aGUgc2FtZSBvYmplY3QsIDpjOmZ1bmM6YFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbGAKICAgIHdpbGwgYWx3YXlzIHJldHVybiBgYDFgYCBmb3IgOmNvbnN0OmBQeV9FUWAgYW5kIGBgMGBgIGZvciA6Y29uc3Q6YFB5X05FYC4KIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5T2JqZWN0X0NtcChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMiwgaW50ICpyZXN1bHQpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5T2JqZWN0X0NtcChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMiwgaW50ICpyZXN1bHQpCiAKICAgIC4uIGluZGV4OjogYnVpbHRpbjogY21wCiAKQEAgLTEyMiwxOCArMTIyLDE4IEBACiAgICB0aGUgUHl0aG9uIHN0YXRlbWVudCBgYHJlc3VsdCA9IGNtcChvMSwgbzIpYGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5T2JqZWN0X0NvbXBhcmUoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5T2JqZWN0X0NvbXBhcmUoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpCiAKICAgIC4uIGluZGV4OjogYnVpbHRpbjogY21wCiAKICAgIENvbXBhcmUgdGhlIHZhbHVlcyBvZiAqbzEqIGFuZCAqbzIqIHVzaW5nIGEgcm91dGluZSBwcm92aWRlZCBieSAqbzEqLCBpZiBvbmUKICAgIGV4aXN0cywgb3RoZXJ3aXNlIHdpdGggYSByb3V0aW5lIHByb3ZpZGVkIGJ5ICpvMiouICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlCiAgICBjb21wYXJpc29uIG9uIHN1Y2Nlc3MuICBPbiBlcnJvciwgdGhlIHZhbHVlIHJldHVybmVkIGlzIHVuZGVmaW5lZDsgdXNlCi0gICA6Y2Z1bmM6YFB5RXJyX09jY3VycmVkYCB0byBkZXRlY3QgYW4gZXJyb3IuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbgorICAgOmM6ZnVuYzpgUHlFcnJfT2NjdXJyZWRgIHRvIGRldGVjdCBhbiBlcnJvci4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uCiAgICBleHByZXNzaW9uIGBgY21wKG8xLCBvMilgYC4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlPYmplY3RfUmVwcihQeU9iamVjdCAqbykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlPYmplY3RfUmVwcihQeU9iamVjdCAqbykKIAogICAgLi4gaW5kZXg6OiBidWlsdGluOiByZXByCiAKQEAgLTE0Myw3ICsxNDMsNyBAQAogICAgYnkgcmV2ZXJzZSBxdW90ZXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5T2JqZWN0X1N0cihQeU9iamVjdCAqbykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlPYmplY3RfU3RyKFB5T2JqZWN0ICpvKQogCiAgICAuLiBpbmRleDo6IGJ1aWx0aW46IHN0cgogCkBAIC0xNTMsMTUgKzE1MywxNSBAQAogICAgYnkgdGhlIDprZXl3b3JkOmBwcmludGAgc3RhdGVtZW50LgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU9iamVjdF9CeXRlcyhQeU9iamVjdCAqbykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlPYmplY3RfQnl0ZXMoUHlPYmplY3QgKm8pCiAKICAgIC4uIGluZGV4OjogYnVpbHRpbjogYnl0ZXMKIAogICAgQ29tcHV0ZSBhIGJ5dGVzIHJlcHJlc2VudGF0aW9uIG9mIG9iamVjdCAqbyouICBJbiAyLngsIHRoaXMgaXMganVzdCBhIGFsaWFzCi0gICBmb3IgOmNmdW5jOmBQeU9iamVjdF9TdHJgLgorICAgZm9yIDpjOmZ1bmM6YFB5T2JqZWN0X1N0cmAuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5T2JqZWN0X1VuaWNvZGUoUHlPYmplY3QgKm8pCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5T2JqZWN0X1VuaWNvZGUoUHlPYmplY3QgKm8pCiAKICAgIC4uIGluZGV4OjogYnVpbHRpbjogdW5pY29kZQogCkBAIC0xNzEsMTggKzE3MSwxOCBAQAogICAgZnVuY3Rpb24uCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5T2JqZWN0X0lzSW5zdGFuY2UoUHlPYmplY3QgKmluc3QsIFB5T2JqZWN0ICpjbHMpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5T2JqZWN0X0lzSW5zdGFuY2UoUHlPYmplY3QgKmluc3QsIFB5T2JqZWN0ICpjbHMpCiAKICAgIFJldHVybnMgYGAxYGAgaWYgKmluc3QqIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyAqY2xzKiBvciBhIHN1YmNsYXNzIG9mCiAgICAqY2xzKiwgb3IgYGAwYGAgaWYgbm90LiAgT24gZXJyb3IsIHJldHVybnMgYGAtMWBgIGFuZCBzZXRzIGFuIGV4Y2VwdGlvbi4gIElmCi0gICAqY2xzKiBpcyBhIHR5cGUgb2JqZWN0IHJhdGhlciB0aGFuIGEgY2xhc3Mgb2JqZWN0LCA6Y2Z1bmM6YFB5T2JqZWN0X0lzSW5zdGFuY2VgCisgICAqY2xzKiBpcyBhIHR5cGUgb2JqZWN0IHJhdGhlciB0aGFuIGEgY2xhc3Mgb2JqZWN0LCA6YzpmdW5jOmBQeU9iamVjdF9Jc0luc3RhbmNlYAogICAgcmV0dXJucyBgYDFgYCBpZiAqaW5zdCogaXMgb2YgdHlwZSAqY2xzKi4gIElmICpjbHMqIGlzIGEgdHVwbGUsIHRoZSBjaGVjayB3aWxsCiAgICBiZSBkb25lIGFnYWluc3QgZXZlcnkgZW50cnkgaW4gKmNscyouIFRoZSByZXN1bHQgd2lsbCBiZSBgYDFgYCB3aGVuIGF0IGxlYXN0IG9uZQogICAgb2YgdGhlIGNoZWNrcyByZXR1cm5zIGBgMWBgLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBgYDBgYC4gSWYgKmluc3QqIGlzIG5vdCBhCiAgICBjbGFzcyBpbnN0YW5jZSBhbmQgKmNscyogaXMgbmVpdGhlciBhIHR5cGUgb2JqZWN0LCBub3IgYSBjbGFzcyBvYmplY3QsIG5vciBhCi0gICB0dXBsZSwgKmluc3QqIG11c3QgaGF2ZSBhIDphdHRyOmBfX2NsYXNzX19gIGF0dHJpYnV0ZSAtLS0gdGhlIGNsYXNzIHJlbGF0aW9uc2hpcAotICAgb2YgdGhlIHZhbHVlIG9mIHRoYXQgYXR0cmlidXRlIHdpdGggKmNscyogd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgcmVzdWx0Ci0gICBvZiB0aGlzIGZ1bmN0aW9uLgorICAgdHVwbGUsICppbnN0KiBtdXN0IGhhdmUgYSA6YXR0cjpgfmluc3RhbmNlLl9fY2xhc3NfX2AgYXR0cmlidXRlIC0tLSB0aGUKKyAgIGNsYXNzIHJlbGF0aW9uc2hpcCBvZiB0aGUgdmFsdWUgb2YgdGhhdCBhdHRyaWJ1dGUgd2l0aCAqY2xzKiB3aWxsIGJlIHVzZWQKKyAgIHRvIGRldGVybWluZSB0aGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24uCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMQogCkBAIC0xOTUsMTMgKzE5NSwxMyBAQAogOmNsYXNzOmBBYCBpZiBpdCBpbmhlcml0cyBmcm9tIDpjbGFzczpgQWAgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuICBJZgogZWl0aGVyIGlzIG5vdCBhIGNsYXNzIG9iamVjdCwgYSBtb3JlIGdlbmVyYWwgbWVjaGFuaXNtIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZQogY2xhc3MgcmVsYXRpb25zaGlwIG9mIHRoZSB0d28gb2JqZWN0cy4gIFdoZW4gdGVzdGluZyBpZiAqQiogaXMgYSBzdWJjbGFzcyBvZgotKkEqLCBpZiAqQSogaXMgKkIqLCA6Y2Z1bmM6YFB5T2JqZWN0X0lzU3ViY2xhc3NgIHJldHVybnMgdHJ1ZS4gIElmICpBKiBhbmQgKkIqCi1hcmUgZGlmZmVyZW50IG9iamVjdHMsICpCKidzIDphdHRyOmBfX2Jhc2VzX19gIGF0dHJpYnV0ZSBpcyBzZWFyY2hlZCBpbiBhCi1kZXB0aC1maXJzdCBmYXNoaW9uIGZvciAqQSogLS0tIHRoZSBwcmVzZW5jZSBvZiB0aGUgOmF0dHI6YF9fYmFzZXNfX2AgYXR0cmlidXRlCi1pcyBjb25zaWRlcmVkIHN1ZmZpY2llbnQgZm9yIHRoaXMgZGV0ZXJtaW5hdGlvbi4KKypBKiwgaWYgKkEqIGlzICpCKiwgOmM6ZnVuYzpgUHlPYmplY3RfSXNTdWJjbGFzc2AgcmV0dXJucyB0cnVlLiAgSWYgKkEqIGFuZCAqQioKK2FyZSBkaWZmZXJlbnQgb2JqZWN0cywgKkIqJ3MgOmF0dHI6YH5jbGFzcy5fX2Jhc2VzX19gIGF0dHJpYnV0ZSBpcyBzZWFyY2hlZCBpbgorYSBkZXB0aC1maXJzdCBmYXNoaW9uIGZvciAqQSogLS0tIHRoZSBwcmVzZW5jZSBvZiB0aGUgOmF0dHI6YH5jbGFzcy5fX2Jhc2VzX19gCithdHRyaWJ1dGUgaXMgY29uc2lkZXJlZCBzdWZmaWNpZW50IGZvciB0aGlzIGRldGVybWluYXRpb24uCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5T2JqZWN0X0lzU3ViY2xhc3MoUHlPYmplY3QgKmRlcml2ZWQsIFB5T2JqZWN0ICpjbHMpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5T2JqZWN0X0lzU3ViY2xhc3MoUHlPYmplY3QgKmRlcml2ZWQsIFB5T2JqZWN0ICpjbHMpCiAKICAgIFJldHVybnMgYGAxYGAgaWYgdGhlIGNsYXNzICpkZXJpdmVkKiBpcyBpZGVudGljYWwgdG8gb3IgZGVyaXZlZCBmcm9tIHRoZSBjbGFzcwogICAgKmNscyosIG90aGVyd2lzZSByZXR1cm5zIGBgMGBgLiAgSW4gY2FzZSBvZiBhbiBlcnJvciwgcmV0dXJucyBgYC0xYGAuIElmICpjbHMqCkBAIC0yMTYsMTMgKzIxNiwxMyBAQAogICAgICAgT2xkZXIgdmVyc2lvbnMgb2YgUHl0aG9uIGRpZCBub3Qgc3VwcG9ydCBhIHR1cGxlIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5Q2FsbGFibGVfQ2hlY2soUHlPYmplY3QgKm8pCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5Q2FsbGFibGVfQ2hlY2soUHlPYmplY3QgKm8pCiAKICAgIERldGVybWluZSBpZiB0aGUgb2JqZWN0ICpvKiBpcyBjYWxsYWJsZS4gIFJldHVybiBgYDFgYCBpZiB0aGUgb2JqZWN0IGlzIGNhbGxhYmxlCiAgICBhbmQgYGAwYGAgb3RoZXJ3aXNlLiAgVGhpcyBmdW5jdGlvbiBhbHdheXMgc3VjY2VlZHMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5T2JqZWN0X0NhbGwoUHlPYmplY3QgKmNhbGxhYmxlX29iamVjdCwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlPYmplY3RfQ2FsbChQeU9iamVjdCAqY2FsbGFibGVfb2JqZWN0LCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogCiAgICAuLiBpbmRleDo6IGJ1aWx0aW46IGFwcGx5CiAKQEAgLTIzNiw3ICsyMzYsNyBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4yCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5T2JqZWN0X0NhbGxPYmplY3QoUHlPYmplY3QgKmNhbGxhYmxlX29iamVjdCwgUHlPYmplY3QgKmFyZ3MpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5T2JqZWN0X0NhbGxPYmplY3QoUHlPYmplY3QgKmNhbGxhYmxlX29iamVjdCwgUHlPYmplY3QgKmFyZ3MpCiAKICAgIC4uIGluZGV4OjogYnVpbHRpbjogYXBwbHkKIApAQCAtMjQ3LDUyICsyNDcsNTIgQEAKICAgIGBgY2FsbGFibGVfb2JqZWN0KCphcmdzKWBgLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU9iamVjdF9DYWxsRnVuY3Rpb24oUHlPYmplY3QgKmNhbGxhYmxlLCBjaGFyICpmb3JtYXQsIC4uLikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKFB5T2JqZWN0ICpjYWxsYWJsZSwgY2hhciAqZm9ybWF0LCAuLi4pCiAKICAgIC4uIGluZGV4OjogYnVpbHRpbjogYXBwbHkKIAogICAgQ2FsbCBhIGNhbGxhYmxlIFB5dGhvbiBvYmplY3QgKmNhbGxhYmxlKiwgd2l0aCBhIHZhcmlhYmxlIG51bWJlciBvZiBDIGFyZ3VtZW50cy4KLSAgIFRoZSBDIGFyZ3VtZW50cyBhcmUgZGVzY3JpYmVkIHVzaW5nIGEgOmNmdW5jOmBQeV9CdWlsZFZhbHVlYCBzdHlsZSBmb3JtYXQKKyAgIFRoZSBDIGFyZ3VtZW50cyBhcmUgZGVzY3JpYmVkIHVzaW5nIGEgOmM6ZnVuYzpgUHlfQnVpbGRWYWx1ZWAgc3R5bGUgZm9ybWF0CiAgICBzdHJpbmcuICBUaGUgZm9ybWF0IG1heSBiZSAqTlVMTCosIGluZGljYXRpbmcgdGhhdCBubyBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLgogICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBjYWxsIG9uIHN1Y2Nlc3MsIG9yICpOVUxMKiBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUKICAgIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uIGBgYXBwbHkoY2FsbGFibGUsIGFyZ3MpYGAgb3IKLSAgIGBgY2FsbGFibGUoKmFyZ3MpYGAuIE5vdGUgdGhhdCBpZiB5b3Ugb25seSBwYXNzIDpjdHlwZTpgUHlPYmplY3QgXCpgIGFyZ3MsCi0gICA6Y2Z1bmM6YFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3NgIGlzIGEgZmFzdGVyIGFsdGVybmF0aXZlLgorICAgYGBjYWxsYWJsZSgqYXJncylgYC4gTm90ZSB0aGF0IGlmIHlvdSBvbmx5IHBhc3MgOmM6dHlwZTpgUHlPYmplY3QgXCpgIGFyZ3MsCisgICA6YzpmdW5jOmBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzYCBpcyBhIGZhc3RlciBhbHRlcm5hdGl2ZS4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlPYmplY3RfQ2FsbE1ldGhvZChQeU9iamVjdCAqbywgY2hhciAqbWV0aG9kLCBjaGFyICpmb3JtYXQsIC4uLikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlPYmplY3RfQ2FsbE1ldGhvZChQeU9iamVjdCAqbywgY2hhciAqbWV0aG9kLCBjaGFyICpmb3JtYXQsIC4uLikKIAogICAgQ2FsbCB0aGUgbWV0aG9kIG5hbWVkICptZXRob2QqIG9mIG9iamVjdCAqbyogd2l0aCBhIHZhcmlhYmxlIG51bWJlciBvZiBDCi0gICBhcmd1bWVudHMuICBUaGUgQyBhcmd1bWVudHMgYXJlIGRlc2NyaWJlZCBieSBhIDpjZnVuYzpgUHlfQnVpbGRWYWx1ZWAgZm9ybWF0CisgICBhcmd1bWVudHMuICBUaGUgQyBhcmd1bWVudHMgYXJlIGRlc2NyaWJlZCBieSBhIDpjOmZ1bmM6YFB5X0J1aWxkVmFsdWVgIGZvcm1hdAogICAgc3RyaW5nIHRoYXQgc2hvdWxkICBwcm9kdWNlIGEgdHVwbGUuICBUaGUgZm9ybWF0IG1heSBiZSAqTlVMTCosIGluZGljYXRpbmcgdGhhdAogICAgbm8gYXJndW1lbnRzIGFyZSBwcm92aWRlZC4gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBjYWxsIG9uIHN1Y2Nlc3MsIG9yICpOVUxMKgogICAgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uIGBgby5tZXRob2QoYXJncylgYC4KLSAgIE5vdGUgdGhhdCBpZiB5b3Ugb25seSBwYXNzIDpjdHlwZTpgUHlPYmplY3QgXCpgIGFyZ3MsCi0gICA6Y2Z1bmM6YFB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzYCBpcyBhIGZhc3RlciBhbHRlcm5hdGl2ZS4KKyAgIE5vdGUgdGhhdCBpZiB5b3Ugb25seSBwYXNzIDpjOnR5cGU6YFB5T2JqZWN0IFwqYCBhcmdzLAorICAgOmM6ZnVuYzpgUHlPYmplY3RfQ2FsbE1ldGhvZE9iakFyZ3NgIGlzIGEgZmFzdGVyIGFsdGVybmF0aXZlLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKFB5T2JqZWN0ICpjYWxsYWJsZSwgLi4uLCBOVUxMKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKFB5T2JqZWN0ICpjYWxsYWJsZSwgLi4uLCBOVUxMKQogCiAgICBDYWxsIGEgY2FsbGFibGUgUHl0aG9uIG9iamVjdCAqY2FsbGFibGUqLCB3aXRoIGEgdmFyaWFibGUgbnVtYmVyIG9mCi0gICA6Y3R5cGU6YFB5T2JqZWN0XCpgIGFyZ3VtZW50cy4gIFRoZSBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIGFzIGEgdmFyaWFibGUgbnVtYmVyCisgICA6Yzp0eXBlOmBQeU9iamVjdFwqYCBhcmd1bWVudHMuICBUaGUgYXJndW1lbnRzIGFyZSBwcm92aWRlZCBhcyBhIHZhcmlhYmxlIG51bWJlcgogICAgb2YgcGFyYW1ldGVycyBmb2xsb3dlZCBieSAqTlVMTCouIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgY2FsbCBvbiBzdWNjZXNzLCBvcgogICAgKk5VTEwqIG9uIGZhaWx1cmUuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJncyhQeU9iamVjdCAqbywgUHlPYmplY3QgKm5hbWUsIC4uLiwgTlVMTCkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlPYmplY3RfQ2FsbE1ldGhvZE9iakFyZ3MoUHlPYmplY3QgKm8sIFB5T2JqZWN0ICpuYW1lLCAuLi4sIE5VTEwpCiAKICAgIENhbGxzIGEgbWV0aG9kIG9mIHRoZSBvYmplY3QgKm8qLCB3aGVyZSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGlzIGdpdmVuIGFzIGEKICAgIFB5dGhvbiBzdHJpbmcgb2JqZWN0IGluICpuYW1lKi4gIEl0IGlzIGNhbGxlZCB3aXRoIGEgdmFyaWFibGUgbnVtYmVyIG9mCi0gICA6Y3R5cGU6YFB5T2JqZWN0XCpgIGFyZ3VtZW50cy4gIFRoZSBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIGFzIGEgdmFyaWFibGUgbnVtYmVyCisgICA6Yzp0eXBlOmBQeU9iamVjdFwqYCBhcmd1bWVudHMuICBUaGUgYXJndW1lbnRzIGFyZSBwcm92aWRlZCBhcyBhIHZhcmlhYmxlIG51bWJlcgogICAgb2YgcGFyYW1ldGVycyBmb2xsb3dlZCBieSAqTlVMTCouIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgY2FsbCBvbiBzdWNjZXNzLCBvcgogICAgKk5VTEwqIG9uIGZhaWx1cmUuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMgogCiAKLS4uIGNmdW5jdGlvbjo6IGxvbmcgUHlPYmplY3RfSGFzaChQeU9iamVjdCAqbykKKy4uIGM6ZnVuY3Rpb246OiBsb25nIFB5T2JqZWN0X0hhc2goUHlPYmplY3QgKm8pCiAKICAgIC4uIGluZGV4OjogYnVpbHRpbjogaGFzaAogCkBAIC0zMDAsNyArMzAwLDcgQEAKICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uIGBgaGFzaChvKWBgLgogCiAKLS4uIGNmdW5jdGlvbjo6IGxvbmcgUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkKFB5T2JqZWN0ICpvKQorLi4gYzpmdW5jdGlvbjo6IGxvbmcgUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkKFB5T2JqZWN0ICpvKQogCiAgICBTZXQgYSA6ZXhjOmBUeXBlRXJyb3JgIGluZGljYXRpbmcgdGhhdCBgYHR5cGUobylgYCBpcyBub3QgaGFzaGFibGUgYW5kIHJldHVybiBgYC0xYGAuCiAgICBUaGlzIGZ1bmN0aW9uIHJlY2VpdmVzIHNwZWNpYWwgdHJlYXRtZW50IHdoZW4gc3RvcmVkIGluIGEgYGB0cF9oYXNoYGAgc2xvdCwKQEAgLTMxMCwyMSArMzEwLDIxIEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjYKIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlPYmplY3RfSXNUcnVlKFB5T2JqZWN0ICpvKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeU9iamVjdF9Jc1RydWUoUHlPYmplY3QgKm8pCiAKICAgIFJldHVybnMgYGAxYGAgaWYgdGhlIG9iamVjdCAqbyogaXMgY29uc2lkZXJlZCB0byBiZSB0cnVlLCBhbmQgYGAwYGAgb3RoZXJ3aXNlLgogICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbiBgYG5vdCBub3Qgb2BgLiAgT24gZmFpbHVyZSwgcmV0dXJuCiAgICBgYC0xYGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5T2JqZWN0X05vdChQeU9iamVjdCAqbykKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlPYmplY3RfTm90KFB5T2JqZWN0ICpvKQogCiAgICBSZXR1cm5zIGBgMGBgIGlmIHRoZSBvYmplY3QgKm8qIGlzIGNvbnNpZGVyZWQgdG8gYmUgdHJ1ZSwgYW5kIGBgMWBgIG90aGVyd2lzZS4KICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb24gYGBub3Qgb2BgLiAgT24gZmFpbHVyZSwgcmV0dXJuCiAgICBgYC0xYGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5T2JqZWN0X1R5cGUoUHlPYmplY3QgKm8pCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5T2JqZWN0X1R5cGUoUHlPYmplY3QgKm8pCiAKICAgIC4uIGluZGV4OjogYnVpbHRpbjogdHlwZQogCkBAIC0zMzMsMTEgKzMzMywxMSBAQAogICAgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb24gYGB0eXBlKG8pYGAuIFRoaXMgZnVuY3Rpb24gaW5jcmVtZW50cyB0aGUKICAgIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgcmV0dXJuIHZhbHVlLiBUaGVyZSdzIHJlYWxseSBubyByZWFzb24gdG8gdXNlIHRoaXMKICAgIGZ1bmN0aW9uIGluc3RlYWQgb2YgdGhlIGNvbW1vbiBleHByZXNzaW9uIGBgby0+b2JfdHlwZWBgLCB3aGljaCByZXR1cm5zIGEKLSAgIHBvaW50ZXIgb2YgdHlwZSA6Y3R5cGU6YFB5VHlwZU9iamVjdFwqYCwgZXhjZXB0IHdoZW4gdGhlIGluY3JlbWVudGVkIHJlZmVyZW5jZQorICAgcG9pbnRlciBvZiB0eXBlIDpjOnR5cGU6YFB5VHlwZU9iamVjdFwqYCwgZXhjZXB0IHdoZW4gdGhlIGluY3JlbWVudGVkIHJlZmVyZW5jZQogICAgY291bnQgaXMgbmVlZGVkLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeU9iamVjdF9UeXBlQ2hlY2soUHlPYmplY3QgKm8sIFB5VHlwZU9iamVjdCAqdHlwZSkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlPYmplY3RfVHlwZUNoZWNrKFB5T2JqZWN0ICpvLCBQeVR5cGVPYmplY3QgKnR5cGUpCiAKICAgIFJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgKm8qIGlzIG9mIHR5cGUgKnR5cGUqIG9yIGEgc3VidHlwZSBvZiAqdHlwZSouICBCb3RoCiAgICBwYXJhbWV0ZXJzIG11c3QgYmUgbm9uLSpOVUxMKi4KQEAgLTM0NSw3ICszNDUsNyBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4yCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlfc3NpemVfdCBQeU9iamVjdF9MZW5ndGgoUHlPYmplY3QgKm8pCisuLiBjOmZ1bmN0aW9uOjogUHlfc3NpemVfdCBQeU9iamVjdF9MZW5ndGgoUHlPYmplY3QgKm8pCiAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IFB5T2JqZWN0X1NpemUoUHlPYmplY3QgKm8pCiAKICAgIC4uIGluZGV4OjogYnVpbHRpbjogbGVuCkBAIC0zNTUsMjkgKzM1NSwyOSBAQAogICAgcmV0dXJuZWQuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbiBgYGxlbihvKWBgLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhlc2UgZnVuY3Rpb25zIHJldHVybmVkIGFuIDpjdHlwZTpgaW50YCB0eXBlLiBUaGlzIG1pZ2h0IHJlcXVpcmUKKyAgICAgIFRoZXNlIGZ1bmN0aW9ucyByZXR1cm5lZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUuIFRoaXMgbWlnaHQgcmVxdWlyZQogICAgICAgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5T2JqZWN0X0dldEl0ZW0oUHlPYmplY3QgKm8sIFB5T2JqZWN0ICprZXkpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5T2JqZWN0X0dldEl0ZW0oUHlPYmplY3QgKm8sIFB5T2JqZWN0ICprZXkpCiAKICAgIFJldHVybiBlbGVtZW50IG9mICpvKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBvYmplY3QgKmtleSogb3IgKk5VTEwqIG9uIGZhaWx1cmUuCiAgICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbiBgYG9ba2V5XWBgLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeU9iamVjdF9TZXRJdGVtKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqa2V5LCBQeU9iamVjdCAqdikKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlPYmplY3RfU2V0SXRlbShQeU9iamVjdCAqbywgUHlPYmplY3QgKmtleSwgUHlPYmplY3QgKnYpCiAKICAgIE1hcCB0aGUgb2JqZWN0ICprZXkqIHRvIHRoZSB2YWx1ZSAqdiouICBSZXR1cm5zIGBgLTFgYCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUKICAgIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBzdGF0ZW1lbnQgYGBvW2tleV0gPSB2YGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5T2JqZWN0X0RlbEl0ZW0oUHlPYmplY3QgKm8sIFB5T2JqZWN0ICprZXkpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5T2JqZWN0X0RlbEl0ZW0oUHlPYmplY3QgKm8sIFB5T2JqZWN0ICprZXkpCiAKICAgIERlbGV0ZSB0aGUgbWFwcGluZyBmb3IgKmtleSogZnJvbSAqbyouICBSZXR1cm5zIGBgLTFgYCBvbiBmYWlsdXJlLiBUaGlzIGlzIHRoZQogICAgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudCBgYGRlbCBvW2tleV1gYC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcihQeU9iamVjdCAqbykKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcihQeU9iamVjdCAqbykKIAogICAgRGVyaXZlcyBhIGZpbGUgZGVzY3JpcHRvciBmcm9tIGEgUHl0aG9uIG9iamVjdC4gIElmIHRoZSBvYmplY3QgaXMgYW4gaW50ZWdlciBvcgogICAgbG9uZyBpbnRlZ2VyLCBpdHMgdmFsdWUgaXMgcmV0dXJuZWQuICBJZiBub3QsIHRoZSBvYmplY3QncyA6bWV0aDpgZmlsZW5vYCBtZXRob2QKQEAgLTM4NSwxNiArMzg1LDE2IEBACiAgICBpcyByZXR1cm5lZCBhcyB0aGUgZmlsZSBkZXNjcmlwdG9yIHZhbHVlLiAgUmV0dXJucyBgYC0xYGAgb24gZmFpbHVyZS4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlPYmplY3RfRGlyKFB5T2JqZWN0ICpvKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU9iamVjdF9EaXIoUHlPYmplY3QgKm8pCiAKICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb24gYGBkaXIobylgYCwgcmV0dXJuaW5nIGEgKHBvc3NpYmx5CiAgICBlbXB0eSkgbGlzdCBvZiBzdHJpbmdzIGFwcHJvcHJpYXRlIGZvciB0aGUgb2JqZWN0IGFyZ3VtZW50LCBvciAqTlVMTCogaWYgdGhlcmUKICAgIHdhcyBhbiBlcnJvci4gIElmIHRoZSBhcmd1bWVudCBpcyAqTlVMTCosIHRoaXMgaXMgbGlrZSB0aGUgUHl0aG9uIGBgZGlyKClgYCwKICAgIHJldHVybmluZyB0aGUgbmFtZXMgb2YgdGhlIGN1cnJlbnQgbG9jYWxzOyBpbiB0aGlzIGNhc2UsIGlmIG5vIGV4ZWN1dGlvbiBmcmFtZQotICAgaXMgYWN0aXZlIHRoZW4gKk5VTEwqIGlzIHJldHVybmVkIGJ1dCA6Y2Z1bmM6YFB5RXJyX09jY3VycmVkYCB3aWxsIHJldHVybiBmYWxzZS4KKyAgIGlzIGFjdGl2ZSB0aGVuICpOVUxMKiBpcyByZXR1cm5lZCBidXQgOmM6ZnVuYzpgUHlFcnJfT2NjdXJyZWRgIHdpbGwgcmV0dXJuIGZhbHNlLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU9iamVjdF9HZXRJdGVyKFB5T2JqZWN0ICpvKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU9iamVjdF9HZXRJdGVyKFB5T2JqZWN0ICpvKQogCiAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbiBleHByZXNzaW9uIGBgaXRlcihvKWBgLiBJdCByZXR1cm5zIGEgbmV3CiAgICBpdGVyYXRvciBmb3IgdGhlIG9iamVjdCBhcmd1bWVudCwgb3IgdGhlIG9iamVjdCAgaXRzZWxmIGlmIHRoZSBvYmplY3QgaXMgYWxyZWFkeQpkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL3JlZmNvdW50aW5nLnJzdCBiL0RvYy9jLWFwaS9yZWZjb3VudGluZy5yc3QKaW5kZXggZDNmZDQ3Zi4uNDk2NzVhOCAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL3JlZmNvdW50aW5nLnJzdAorKysgYi9Eb2MvYy1hcGkvcmVmY291bnRpbmcucnN0CkBAIC0xMSwyMiArMTEsMjIgQEAKIG9iamVjdHMuCiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBQeV9JTkNSRUYoUHlPYmplY3QgKm8pCisuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeV9JTkNSRUYoUHlPYmplY3QgKm8pCiAKICAgIEluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IGZvciBvYmplY3QgKm8qLiAgVGhlIG9iamVjdCBtdXN0IG5vdCBiZSAqTlVMTCo7IGlmCi0gICB5b3UgYXJlbid0IHN1cmUgdGhhdCBpdCBpc24ndCAqTlVMTCosIHVzZSA6Y2Z1bmM6YFB5X1hJTkNSRUZgLgorICAgeW91IGFyZW4ndCBzdXJlIHRoYXQgaXQgaXNuJ3QgKk5VTEwqLCB1c2UgOmM6ZnVuYzpgUHlfWElOQ1JFRmAuCiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBQeV9YSU5DUkVGKFB5T2JqZWN0ICpvKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlfWElOQ1JFRihQeU9iamVjdCAqbykKIAogICAgSW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgZm9yIG9iamVjdCAqbyouICBUaGUgb2JqZWN0IG1heSBiZSAqTlVMTCosIGluCiAgICB3aGljaCBjYXNlIHRoZSBtYWNybyBoYXMgbm8gZWZmZWN0LgogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgUHlfREVDUkVGKFB5T2JqZWN0ICpvKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlfREVDUkVGKFB5T2JqZWN0ICpvKQogCiAgICBEZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBmb3Igb2JqZWN0ICpvKi4gIFRoZSBvYmplY3QgbXVzdCBub3QgYmUgKk5VTEwqOyBpZgotICAgeW91IGFyZW4ndCBzdXJlIHRoYXQgaXQgaXNuJ3QgKk5VTEwqLCB1c2UgOmNmdW5jOmBQeV9YREVDUkVGYC4gIElmIHRoZSByZWZlcmVuY2UKKyAgIHlvdSBhcmVuJ3Qgc3VyZSB0aGF0IGl0IGlzbid0ICpOVUxMKiwgdXNlIDpjOmZ1bmM6YFB5X1hERUNSRUZgLiAgSWYgdGhlIHJlZmVyZW5jZQogICAgY291bnQgcmVhY2hlcyB6ZXJvLCB0aGUgb2JqZWN0J3MgdHlwZSdzIGRlYWxsb2NhdGlvbiBmdW5jdGlvbiAod2hpY2ggbXVzdCBub3QgYmUKICAgICpOVUxMKikgaXMgaW52b2tlZC4KIApAQCAtMzYsMjUgKzM2LDI1IEBACiAgICAgICB3aGVuIGEgY2xhc3MgaW5zdGFuY2Ugd2l0aCBhIDptZXRoOmBfX2RlbF9fYCBtZXRob2QgaXMgZGVhbGxvY2F0ZWQpLiAgV2hpbGUKICAgICAgIGV4Y2VwdGlvbnMgaW4gc3VjaCBjb2RlIGFyZSBub3QgcHJvcGFnYXRlZCwgdGhlIGV4ZWN1dGVkIGNvZGUgaGFzIGZyZWUgYWNjZXNzIHRvCiAgICAgICBhbGwgUHl0aG9uIGdsb2JhbCB2YXJpYWJsZXMuICBUaGlzIG1lYW5zIHRoYXQgYW55IG9iamVjdCB0aGF0IGlzIHJlYWNoYWJsZSBmcm9tCi0gICAgICBhIGdsb2JhbCB2YXJpYWJsZSBzaG91bGQgYmUgaW4gYSBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSA6Y2Z1bmM6YFB5X0RFQ1JFRmAgaXMKKyAgICAgIGEgZ2xvYmFsIHZhcmlhYmxlIHNob3VsZCBiZSBpbiBhIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIDpjOmZ1bmM6YFB5X0RFQ1JFRmAgaXMKICAgICAgIGludm9rZWQuICBGb3IgZXhhbXBsZSwgY29kZSB0byBkZWxldGUgYW4gb2JqZWN0IGZyb20gYSBsaXN0IHNob3VsZCBjb3B5IGEKICAgICAgIHJlZmVyZW5jZSB0byB0aGUgZGVsZXRlZCBvYmplY3QgaW4gYSB0ZW1wb3JhcnkgdmFyaWFibGUsIHVwZGF0ZSB0aGUgbGlzdCBkYXRhCi0gICAgICBzdHJ1Y3R1cmUsIGFuZCB0aGVuIGNhbGwgOmNmdW5jOmBQeV9ERUNSRUZgIGZvciB0aGUgdGVtcG9yYXJ5IHZhcmlhYmxlLgorICAgICAgc3RydWN0dXJlLCBhbmQgdGhlbiBjYWxsIDpjOmZ1bmM6YFB5X0RFQ1JFRmAgZm9yIHRoZSB0ZW1wb3JhcnkgdmFyaWFibGUuCiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBQeV9YREVDUkVGKFB5T2JqZWN0ICpvKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlfWERFQ1JFRihQeU9iamVjdCAqbykKIAogICAgRGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgZm9yIG9iamVjdCAqbyouICBUaGUgb2JqZWN0IG1heSBiZSAqTlVMTCosIGluCiAgICB3aGljaCBjYXNlIHRoZSBtYWNybyBoYXMgbm8gZWZmZWN0OyBvdGhlcndpc2UgdGhlIGVmZmVjdCBpcyB0aGUgc2FtZSBhcyBmb3IKLSAgIDpjZnVuYzpgUHlfREVDUkVGYCwgYW5kIHRoZSBzYW1lIHdhcm5pbmcgYXBwbGllcy4KKyAgIDpjOmZ1bmM6YFB5X0RFQ1JFRmAsIGFuZCB0aGUgc2FtZSB3YXJuaW5nIGFwcGxpZXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBQeV9DTEVBUihQeU9iamVjdCAqbykKKy4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5X0NMRUFSKFB5T2JqZWN0ICpvKQogCiAgICBEZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBmb3Igb2JqZWN0ICpvKi4gIFRoZSBvYmplY3QgbWF5IGJlICpOVUxMKiwgaW4KICAgIHdoaWNoIGNhc2UgdGhlIG1hY3JvIGhhcyBubyBlZmZlY3Q7IG90aGVyd2lzZSB0aGUgZWZmZWN0IGlzIHRoZSBzYW1lIGFzIGZvcgotICAgOmNmdW5jOmBQeV9ERUNSRUZgLCBleGNlcHQgdGhhdCB0aGUgYXJndW1lbnQgaXMgYWxzbyBzZXQgdG8gKk5VTEwqLiAgVGhlIHdhcm5pbmcKLSAgIGZvciA6Y2Z1bmM6YFB5X0RFQ1JFRmAgZG9lcyBub3QgYXBwbHkgd2l0aCByZXNwZWN0IHRvIHRoZSBvYmplY3QgcGFzc2VkIGJlY2F1c2UKKyAgIDpjOmZ1bmM6YFB5X0RFQ1JFRmAsIGV4Y2VwdCB0aGF0IHRoZSBhcmd1bWVudCBpcyBhbHNvIHNldCB0byAqTlVMTCouICBUaGUgd2FybmluZworICAgZm9yIDpjOmZ1bmM6YFB5X0RFQ1JFRmAgZG9lcyBub3QgYXBwbHkgd2l0aCByZXNwZWN0IHRvIHRoZSBvYmplY3QgcGFzc2VkIGJlY2F1c2UKICAgIHRoZSBtYWNybyBjYXJlZnVsbHkgdXNlcyBhIHRlbXBvcmFyeSB2YXJpYWJsZSBhbmQgc2V0cyB0aGUgYXJndW1lbnQgdG8gKk5VTEwqCiAgICBiZWZvcmUgZGVjcmVtZW50aW5nIGl0cyByZWZlcmVuY2UgY291bnQuCiAKQEAgLTY1LDEwICs2NSwxMCBAQAogCiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZm9yIHJ1bnRpbWUgZHluYW1pYyBlbWJlZGRpbmcgb2YgUHl0aG9uOgogYGBQeV9JbmNSZWYoUHlPYmplY3QgKm8pYGAsIGBgUHlfRGVjUmVmKFB5T2JqZWN0ICpvKWBgLiBUaGV5IGFyZQotc2ltcGx5IGV4cG9ydGVkIGZ1bmN0aW9uIHZlcnNpb25zIG9mIDpjZnVuYzpgUHlfWElOQ1JFRmAgYW5kCi06Y2Z1bmM6YFB5X1hERUNSRUZgLCByZXNwZWN0aXZlbHkuCitzaW1wbHkgZXhwb3J0ZWQgZnVuY3Rpb24gdmVyc2lvbnMgb2YgOmM6ZnVuYzpgUHlfWElOQ1JFRmAgYW5kCis6YzpmdW5jOmBQeV9YREVDUkVGYCwgcmVzcGVjdGl2ZWx5LgogCiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBvciBtYWNyb3MgYXJlIG9ubHkgZm9yIHVzZSB3aXRoaW4gdGhlIGludGVycHJldGVyIGNvcmU6Ci06Y2Z1bmM6YF9QeV9EZWFsbG9jYCwgOmNmdW5jOmBfUHlfRm9yZ2V0UmVmZXJlbmNlYCwgOmNmdW5jOmBfUHlfTmV3UmVmZXJlbmNlYCwKLWFzIHdlbGwgYXMgdGhlIGdsb2JhbCB2YXJpYWJsZSA6Y2RhdGE6YF9QeV9SZWZUb3RhbGAuCis6YzpmdW5jOmBfUHlfRGVhbGxvY2AsIDpjOmZ1bmM6YF9QeV9Gb3JnZXRSZWZlcmVuY2VgLCA6YzpmdW5jOmBfUHlfTmV3UmVmZXJlbmNlYCwKK2FzIHdlbGwgYXMgdGhlIGdsb2JhbCB2YXJpYWJsZSA6YzpkYXRhOmBfUHlfUmVmVG90YWxgLgogCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvcmVmbGVjdGlvbi5yc3QgYi9Eb2MvYy1hcGkvcmVmbGVjdGlvbi5yc3QKaW5kZXggMzk5NmMxZi4uNTllZGJiMyAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL3JlZmxlY3Rpb24ucnN0CisrKyBiL0RvYy9jLWFwaS9yZWZsZWN0aW9uLnJzdApAQCAtNSw1MSArNSw1MSBAQAogUmVmbGVjdGlvbgogPT09PT09PT09PQogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlFdmFsX0dldEJ1aWx0aW5zKCkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlFdmFsX0dldEJ1aWx0aW5zKCkKIAogICAgUmV0dXJuIGEgZGljdGlvbmFyeSBvZiB0aGUgYnVpbHRpbnMgaW4gdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGZyYW1lLAogICAgb3IgdGhlIGludGVycHJldGVyIG9mIHRoZSB0aHJlYWQgc3RhdGUgaWYgbm8gZnJhbWUgaXMgY3VycmVudGx5IGV4ZWN1dGluZy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlFdmFsX0dldExvY2FscygpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5RXZhbF9HZXRMb2NhbHMoKQogCiAgICBSZXR1cm4gYSBkaWN0aW9uYXJ5IG9mIHRoZSBsb2NhbCB2YXJpYWJsZXMgaW4gdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGZyYW1lLAogICAgb3IgKk5VTEwqIGlmIG5vIGZyYW1lIGlzIGN1cnJlbnRseSBleGVjdXRpbmcuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5RXZhbF9HZXRHbG9iYWxzKCkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlFdmFsX0dldEdsb2JhbHMoKQogCiAgICBSZXR1cm4gYSBkaWN0aW9uYXJ5IG9mIHRoZSBnbG9iYWwgdmFyaWFibGVzIGluIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBmcmFtZSwKICAgIG9yICpOVUxMKiBpZiBubyBmcmFtZSBpcyBjdXJyZW50bHkgZXhlY3V0aW5nLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5RnJhbWVPYmplY3QqIFB5RXZhbF9HZXRGcmFtZSgpCisuLiBjOmZ1bmN0aW9uOjogUHlGcmFtZU9iamVjdCogUHlFdmFsX0dldEZyYW1lKCkKIAogICAgUmV0dXJuIHRoZSBjdXJyZW50IHRocmVhZCBzdGF0ZSdzIGZyYW1lLCB3aGljaCBpcyAqTlVMTCogaWYgbm8gZnJhbWUgaXMKICAgIGN1cnJlbnRseSBleGVjdXRpbmcuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5RnJhbWVfR2V0TGluZU51bWJlcihQeUZyYW1lT2JqZWN0ICpmcmFtZSkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlGcmFtZV9HZXRMaW5lTnVtYmVyKFB5RnJhbWVPYmplY3QgKmZyYW1lKQogCiAgICBSZXR1cm4gdGhlIGxpbmUgbnVtYmVyIHRoYXQgKmZyYW1lKiBpcyBjdXJyZW50bHkgZXhlY3V0aW5nLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUV2YWxfR2V0UmVzdHJpY3RlZCgpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5RXZhbF9HZXRSZXN0cmljdGVkKCkKIAogICAgSWYgdGhlcmUgaXMgYSBjdXJyZW50IGZyYW1lIGFuZCBpdCBpcyBleGVjdXRpbmcgaW4gcmVzdHJpY3RlZCBtb2RlLCByZXR1cm4gdHJ1ZSwKICAgIG90aGVyd2lzZSBmYWxzZS4KIAogCi0uLiBjZnVuY3Rpb246OiBjb25zdCBjaGFyKiBQeUV2YWxfR2V0RnVuY05hbWUoUHlPYmplY3QgKmZ1bmMpCisuLiBjOmZ1bmN0aW9uOjogY29uc3QgY2hhciogUHlFdmFsX0dldEZ1bmNOYW1lKFB5T2JqZWN0ICpmdW5jKQogCiAgICBSZXR1cm4gdGhlIG5hbWUgb2YgKmZ1bmMqIGlmIGl0IGlzIGEgZnVuY3Rpb24sIGNsYXNzIG9yIGluc3RhbmNlIG9iamVjdCwgZWxzZSB0aGUKICAgIG5hbWUgb2YgKmZ1bmMqXHMgdHlwZS4KIAogCi0uLiBjZnVuY3Rpb246OiBjb25zdCBjaGFyKiBQeUV2YWxfR2V0RnVuY0Rlc2MoUHlPYmplY3QgKmZ1bmMpCisuLiBjOmZ1bmN0aW9uOjogY29uc3QgY2hhciogUHlFdmFsX0dldEZ1bmNEZXNjKFB5T2JqZWN0ICpmdW5jKQogCiAgICBSZXR1cm4gYSBkZXNjcmlwdGlvbiBzdHJpbmcsIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiAqZnVuYyouCiAgICBSZXR1cm4gdmFsdWVzIGluY2x1ZGUgIigpIiBmb3IgZnVuY3Rpb25zIGFuZCBtZXRob2RzLCAiIGNvbnN0cnVjdG9yIiwKICAgICIgaW5zdGFuY2UiLCBhbmQgIiBvYmplY3QiLiAgQ29uY2F0ZW5hdGVkIHdpdGggdGhlIHJlc3VsdCBvZgotICAgOmNmdW5jOmBQeUV2YWxfR2V0RnVuY05hbWVgLCB0aGUgcmVzdWx0IHdpbGwgYmUgYSBkZXNjcmlwdGlvbiBvZgorICAgOmM6ZnVuYzpgUHlFdmFsX0dldEZ1bmNOYW1lYCwgdGhlIHJlc3VsdCB3aWxsIGJlIGEgZGVzY3JpcHRpb24gb2YKICAgICpmdW5jKi4KZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9zZXF1ZW5jZS5yc3QgYi9Eb2MvYy1hcGkvc2VxdWVuY2UucnN0CmluZGV4IDI1ZmVhYzAuLjY1M2Y5YWQgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS9zZXF1ZW5jZS5yc3QKKysrIGIvRG9jL2MtYXBpL3NlcXVlbmNlLnJzdApAQCAtNiwxMyArNiwxMyBAQAogPT09PT09PT09PT09PT09PT0KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlTZXF1ZW5jZV9DaGVjayhQeU9iamVjdCAqbykKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlTZXF1ZW5jZV9DaGVjayhQeU9iamVjdCAqbykKIAogICAgUmV0dXJuIGBgMWBgIGlmIHRoZSBvYmplY3QgcHJvdmlkZXMgc2VxdWVuY2UgcHJvdG9jb2wsIGFuZCBgYDBgYCBvdGhlcndpc2UuCiAgICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBzdWNjZWVkcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeV9zc2l6ZV90IFB5U2VxdWVuY2VfU2l6ZShQeU9iamVjdCAqbykKKy4uIGM6ZnVuY3Rpb246OiBQeV9zc2l6ZV90IFB5U2VxdWVuY2VfU2l6ZShQeU9iamVjdCAqbykKICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgUHlTZXF1ZW5jZV9MZW5ndGgoUHlPYmplY3QgKm8pCiAKICAgIC4uIGluZGV4OjogYnVpbHRpbjogbGVuCkBAIC0yMiwxNDAgKzIyLDE0MCBAQAogICAgUHl0aG9uIGV4cHJlc3Npb24gYGBsZW4obylgYC4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoZXNlIGZ1bmN0aW9ucyByZXR1cm5lZCBhbiA6Y3R5cGU6YGludGAgdHlwZS4gVGhpcyBtaWdodCByZXF1aXJlCisgICAgICBUaGVzZSBmdW5jdGlvbnMgcmV0dXJuZWQgYW4gOmM6dHlwZTpgaW50YCB0eXBlLiBUaGlzIG1pZ2h0IHJlcXVpcmUKICAgICAgIGNoYW5nZXMgaW4geW91ciBjb2RlIGZvciBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVNlcXVlbmNlX0NvbmNhdChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlTZXF1ZW5jZV9Db25jYXQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpCiAKICAgIFJldHVybiB0aGUgY29uY2F0ZW5hdGlvbiBvZiAqbzEqIGFuZCAqbzIqIG9uIHN1Y2Nlc3MsIGFuZCAqTlVMTCogb24gZmFpbHVyZS4KICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uIGBgbzEgKyBvMmBgLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVNlcXVlbmNlX1JlcGVhdChQeU9iamVjdCAqbywgUHlfc3NpemVfdCBjb3VudCkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlTZXF1ZW5jZV9SZXBlYXQoUHlPYmplY3QgKm8sIFB5X3NzaXplX3QgY291bnQpCiAKICAgIFJldHVybiB0aGUgcmVzdWx0IG9mIHJlcGVhdGluZyBzZXF1ZW5jZSBvYmplY3QgKm8qICpjb3VudCogdGltZXMsIG9yICpOVUxMKiBvbgogICAgZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uIGBgbyAqIGNvdW50YGAuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUgZm9yICpjb3VudCouIFRoaXMgbWlnaHQgcmVxdWlyZQorICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjOnR5cGU6YGludGAgdHlwZSBmb3IgKmNvdW50Ki4gVGhpcyBtaWdodCByZXF1aXJlCiAgICAgICBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlTZXF1ZW5jZV9JblBsYWNlQ29uY2F0KFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVNlcXVlbmNlX0luUGxhY2VDb25jYXQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpCiAKICAgIFJldHVybiB0aGUgY29uY2F0ZW5hdGlvbiBvZiAqbzEqIGFuZCAqbzIqIG9uIHN1Y2Nlc3MsIGFuZCAqTlVMTCogb24gZmFpbHVyZS4KICAgIFRoZSBvcGVyYXRpb24gaXMgZG9uZSAqaW4tcGxhY2UqIHdoZW4gKm8xKiBzdXBwb3J0cyBpdC4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQKICAgIG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbiBgYG8xICs9IG8yYGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5U2VxdWVuY2VfSW5QbGFjZVJlcGVhdChQeU9iamVjdCAqbywgUHlfc3NpemVfdCBjb3VudCkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlTZXF1ZW5jZV9JblBsYWNlUmVwZWF0KFB5T2JqZWN0ICpvLCBQeV9zc2l6ZV90IGNvdW50KQogCiAgICBSZXR1cm4gdGhlIHJlc3VsdCBvZiByZXBlYXRpbmcgc2VxdWVuY2Ugb2JqZWN0ICpvKiAqY291bnQqIHRpbWVzLCBvciAqTlVMTCogb24KICAgIGZhaWx1cmUuICBUaGUgb3BlcmF0aW9uIGlzIGRvbmUgKmluLXBsYWNlKiB3aGVuICpvKiBzdXBwb3J0cyBpdC4gIFRoaXMgaXMgdGhlCiAgICBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbiBgYG8gKj0gY291bnRgYC4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Y3R5cGU6YGludGAgdHlwZSBmb3IgKmNvdW50Ki4gVGhpcyBtaWdodCByZXF1aXJlCisgICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmM6dHlwZTpgaW50YCB0eXBlIGZvciAqY291bnQqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKICAgICAgIGNoYW5nZXMgaW4geW91ciBjb2RlIGZvciBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVNlcXVlbmNlX0dldEl0ZW0oUHlPYmplY3QgKm8sIFB5X3NzaXplX3QgaSkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlTZXF1ZW5jZV9HZXRJdGVtKFB5T2JqZWN0ICpvLCBQeV9zc2l6ZV90IGkpCiAKICAgIFJldHVybiB0aGUgKmkqXCB0aCBlbGVtZW50IG9mICpvKiwgb3IgKk5VTEwqIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YKICAgIHRoZSBQeXRob24gZXhwcmVzc2lvbiBgYG9baV1gYC4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Y3R5cGU6YGludGAgdHlwZSBmb3IgKmkqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgZm9yICppKi4gVGhpcyBtaWdodCByZXF1aXJlCiAgICAgICBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlTZXF1ZW5jZV9HZXRTbGljZShQeU9iamVjdCAqbywgUHlfc3NpemVfdCBpMSwgUHlfc3NpemVfdCBpMikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlTZXF1ZW5jZV9HZXRTbGljZShQeU9iamVjdCAqbywgUHlfc3NpemVfdCBpMSwgUHlfc3NpemVfdCBpMikKIAogICAgUmV0dXJuIHRoZSBzbGljZSBvZiBzZXF1ZW5jZSBvYmplY3QgKm8qIGJldHdlZW4gKmkxKiBhbmQgKmkyKiwgb3IgKk5VTEwqIG9uCiAgICBmYWlsdXJlLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbiBgYG9baTE6aTJdYGAuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUgZm9yICppMSogYW5kICppMiouIFRoaXMgbWlnaHQKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgZm9yICppMSogYW5kICppMiouIFRoaXMgbWlnaHQKICAgICAgIHJlcXVpcmUgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5U2VxdWVuY2VfU2V0SXRlbShQeU9iamVjdCAqbywgUHlfc3NpemVfdCBpLCBQeU9iamVjdCAqdikKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlTZXF1ZW5jZV9TZXRJdGVtKFB5T2JqZWN0ICpvLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICp2KQogCiAgICBBc3NpZ24gb2JqZWN0ICp2KiB0byB0aGUgKmkqXCB0aCBlbGVtZW50IG9mICpvKi4gIFJldHVybnMgYGAtMWBgIG9uIGZhaWx1cmUuICBUaGlzCiAgICBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudCBgYG9baV0gPSB2YGAuICBUaGlzIGZ1bmN0aW9uICpkb2VzCiAgICBub3QqIHN0ZWFsIGEgcmVmZXJlbmNlIHRvICp2Ki4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Y3R5cGU6YGludGAgdHlwZSBmb3IgKmkqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgZm9yICppKi4gVGhpcyBtaWdodCByZXF1aXJlCiAgICAgICBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlTZXF1ZW5jZV9EZWxJdGVtKFB5T2JqZWN0ICpvLCBQeV9zc2l6ZV90IGkpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5U2VxdWVuY2VfRGVsSXRlbShQeU9iamVjdCAqbywgUHlfc3NpemVfdCBpKQogCiAgICBEZWxldGUgdGhlICppKlwgdGggZWxlbWVudCBvZiBvYmplY3QgKm8qLiAgUmV0dXJucyBgYC0xYGAgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlCiAgICBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gc3RhdGVtZW50IGBgZGVsIG9baV1gYC4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Y3R5cGU6YGludGAgdHlwZSBmb3IgKmkqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgZm9yICppKi4gVGhpcyBtaWdodCByZXF1aXJlCiAgICAgICBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlTZXF1ZW5jZV9TZXRTbGljZShQeU9iamVjdCAqbywgUHlfc3NpemVfdCBpMSwgUHlfc3NpemVfdCBpMiwgUHlPYmplY3QgKnYpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5U2VxdWVuY2VfU2V0U2xpY2UoUHlPYmplY3QgKm8sIFB5X3NzaXplX3QgaTEsIFB5X3NzaXplX3QgaTIsIFB5T2JqZWN0ICp2KQogCiAgICBBc3NpZ24gdGhlIHNlcXVlbmNlIG9iamVjdCAqdiogdG8gdGhlIHNsaWNlIGluIHNlcXVlbmNlIG9iamVjdCAqbyogZnJvbSAqaTEqIHRvCiAgICAqaTIqLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudCBgYG9baTE6aTJdID0gdmBgLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjdHlwZTpgaW50YCB0eXBlIGZvciAqaTEqIGFuZCAqaTIqLiBUaGlzIG1pZ2h0CisgICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmM6dHlwZTpgaW50YCB0eXBlIGZvciAqaTEqIGFuZCAqaTIqLiBUaGlzIG1pZ2h0CiAgICAgICByZXF1aXJlIGNoYW5nZXMgaW4geW91ciBjb2RlIGZvciBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeVNlcXVlbmNlX0RlbFNsaWNlKFB5T2JqZWN0ICpvLCBQeV9zc2l6ZV90IGkxLCBQeV9zc2l6ZV90IGkyKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeVNlcXVlbmNlX0RlbFNsaWNlKFB5T2JqZWN0ICpvLCBQeV9zc2l6ZV90IGkxLCBQeV9zc2l6ZV90IGkyKQogCiAgICBEZWxldGUgdGhlIHNsaWNlIGluIHNlcXVlbmNlIG9iamVjdCAqbyogZnJvbSAqaTEqIHRvICppMiouICBSZXR1cm5zIGBgLTFgYCBvbgogICAgZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBzdGF0ZW1lbnQgYGBkZWwgb1tpMTppMl1gYC4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Y3R5cGU6YGludGAgdHlwZSBmb3IgKmkxKiBhbmQgKmkyKi4gVGhpcyBtaWdodAorICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjOnR5cGU6YGludGAgdHlwZSBmb3IgKmkxKiBhbmQgKmkyKi4gVGhpcyBtaWdodAogICAgICAgcmVxdWlyZSBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeV9zc2l6ZV90IFB5U2VxdWVuY2VfQ291bnQoUHlPYmplY3QgKm8sIFB5T2JqZWN0ICp2YWx1ZSkKKy4uIGM6ZnVuY3Rpb246OiBQeV9zc2l6ZV90IFB5U2VxdWVuY2VfQ291bnQoUHlPYmplY3QgKm8sIFB5T2JqZWN0ICp2YWx1ZSkKIAogICAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgKnZhbHVlKiBpbiAqbyosIHRoYXQgaXMsIHJldHVybiB0aGUgbnVtYmVyCiAgICBvZiBrZXlzIGZvciB3aGljaCBgYG9ba2V5XSA9PSB2YWx1ZWBgLiAgT24gZmFpbHVyZSwgcmV0dXJuIGBgLTFgYC4gIFRoaXMgaXMKICAgIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbiBleHByZXNzaW9uIGBgby5jb3VudCh2YWx1ZSlgYC4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJuZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUuIFRoaXMgbWlnaHQgcmVxdWlyZSBjaGFuZ2VzCisgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybmVkIGFuIDpjOnR5cGU6YGludGAgdHlwZS4gVGhpcyBtaWdodCByZXF1aXJlIGNoYW5nZXMKICAgICAgIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlTZXF1ZW5jZV9Db250YWlucyhQeU9iamVjdCAqbywgUHlPYmplY3QgKnZhbHVlKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeVNlcXVlbmNlX0NvbnRhaW5zKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqdmFsdWUpCiAKICAgIERldGVybWluZSBpZiAqbyogY29udGFpbnMgKnZhbHVlKi4gIElmIGFuIGl0ZW0gaW4gKm8qIGlzIGVxdWFsIHRvICp2YWx1ZSosCiAgICByZXR1cm4gYGAxYGAsIG90aGVyd2lzZSByZXR1cm4gYGAwYGAuIE9uIGVycm9yLCByZXR1cm4gYGAtMWBgLiAgVGhpcyBpcwogICAgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb24gYGB2YWx1ZSBpbiBvYGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlfc3NpemVfdCBQeVNlcXVlbmNlX0luZGV4KFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqdmFsdWUpCisuLiBjOmZ1bmN0aW9uOjogUHlfc3NpemVfdCBQeVNlcXVlbmNlX0luZGV4KFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqdmFsdWUpCiAKICAgIFJldHVybiB0aGUgZmlyc3QgaW5kZXggKmkqIGZvciB3aGljaCBgYG9baV0gPT0gdmFsdWVgYC4gIE9uIGVycm9yLCByZXR1cm4KICAgIGBgLTFgYC4gICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbiBgYG8uaW5kZXgodmFsdWUpYGAuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybmVkIGFuIDpjdHlwZTpgaW50YCB0eXBlLiBUaGlzIG1pZ2h0IHJlcXVpcmUgY2hhbmdlcworICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5lZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUuIFRoaXMgbWlnaHQgcmVxdWlyZSBjaGFuZ2VzCiAgICAgICBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5U2VxdWVuY2VfTGlzdChQeU9iamVjdCAqbykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlTZXF1ZW5jZV9MaXN0KFB5T2JqZWN0ICpvKQogCiAgICBSZXR1cm4gYSBsaXN0IG9iamVjdCB3aXRoIHRoZSBzYW1lIGNvbnRlbnRzIGFzIHRoZSBhcmJpdHJhcnkgc2VxdWVuY2UgKm8qLiAgVGhlCiAgICByZXR1cm5lZCBsaXN0IGlzIGd1YXJhbnRlZWQgdG8gYmUgbmV3LgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVNlcXVlbmNlX1R1cGxlKFB5T2JqZWN0ICpvKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVNlcXVlbmNlX1R1cGxlKFB5T2JqZWN0ICpvKQogCiAgICAuLiBpbmRleDo6IGJ1aWx0aW46IHR1cGxlCiAKQEAgLTE2NSwyOCArMTY1LDI4IEBACiAgICBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbiBgYHR1cGxlKG8pYGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5U2VxdWVuY2VfRmFzdChQeU9iamVjdCAqbywgY29uc3QgY2hhciAqbSkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlTZXF1ZW5jZV9GYXN0KFB5T2JqZWN0ICpvLCBjb25zdCBjaGFyICptKQogCi0gICBSZXR1cm5zIHRoZSBzZXF1ZW5jZSAqbyogYXMgYSB0dXBsZSwgdW5sZXNzIGl0IGlzIGFscmVhZHkgYSB0dXBsZSBvciBsaXN0LCBpbgotICAgd2hpY2ggY2FzZSAqbyogaXMgcmV0dXJuZWQuICBVc2UgOmNmdW5jOmBQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU1gIHRvIGFjY2VzcyB0aGUKLSAgIG1lbWJlcnMgb2YgdGhlIHJlc3VsdC4gIFJldHVybnMgKk5VTEwqIG9uIGZhaWx1cmUuICBJZiB0aGUgb2JqZWN0IGlzIG5vdCBhCi0gICBzZXF1ZW5jZSwgcmFpc2VzIDpleGM6YFR5cGVFcnJvcmAgd2l0aCAqbSogYXMgdGhlIG1lc3NhZ2UgdGV4dC4KKyAgIFJldHVybiB0aGUgc2VxdWVuY2UgKm8qIGFzIGEgbGlzdCwgdW5sZXNzIGl0IGlzIGFscmVhZHkgYSB0dXBsZSBvciBsaXN0LCBpbgorICAgd2hpY2ggY2FzZSAqbyogaXMgcmV0dXJuZWQuICBVc2UgOmM6ZnVuYzpgUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNYCB0byBhY2Nlc3MKKyAgIHRoZSBtZW1iZXJzIG9mIHRoZSByZXN1bHQuICBSZXR1cm5zICpOVUxMKiBvbiBmYWlsdXJlLiAgSWYgdGhlIG9iamVjdCBpcyBub3QKKyAgIGEgc2VxdWVuY2UsIHJhaXNlcyA6ZXhjOmBUeXBlRXJyb3JgIHdpdGggKm0qIGFzIHRoZSBtZXNzYWdlIHRleHQuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5U2VxdWVuY2VfRmFzdF9HRVRfSVRFTShQeU9iamVjdCAqbywgUHlfc3NpemVfdCBpKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0oUHlPYmplY3QgKm8sIFB5X3NzaXplX3QgaSkKIAogICAgUmV0dXJuIHRoZSAqaSpcIHRoIGVsZW1lbnQgb2YgKm8qLCBhc3N1bWluZyB0aGF0ICpvKiB3YXMgcmV0dXJuZWQgYnkKLSAgIDpjZnVuYzpgUHlTZXF1ZW5jZV9GYXN0YCwgKm8qIGlzIG5vdCAqTlVMTCosIGFuZCB0aGF0ICppKiBpcyB3aXRoaW4gYm91bmRzLgorICAgOmM6ZnVuYzpgUHlTZXF1ZW5jZV9GYXN0YCwgKm8qIGlzIG5vdCAqTlVMTCosIGFuZCB0aGF0ICppKiBpcyB3aXRoaW4gYm91bmRzLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjdHlwZTpgaW50YCB0eXBlIGZvciAqaSouIFRoaXMgbWlnaHQgcmVxdWlyZQorICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjOnR5cGU6YGludGAgdHlwZSBmb3IgKmkqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKICAgICAgIGNoYW5nZXMgaW4geW91ciBjb2RlIGZvciBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiogUHlTZXF1ZW5jZV9GYXN0X0lURU1TKFB5T2JqZWN0ICpvKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiogUHlTZXF1ZW5jZV9GYXN0X0lURU1TKFB5T2JqZWN0ICpvKQogCiAgICBSZXR1cm4gdGhlIHVuZGVybHlpbmcgYXJyYXkgb2YgUHlPYmplY3QgcG9pbnRlcnMuICBBc3N1bWVzIHRoYXQgKm8qIHdhcyByZXR1cm5lZAotICAgYnkgOmNmdW5jOmBQeVNlcXVlbmNlX0Zhc3RgIGFuZCAqbyogaXMgbm90ICpOVUxMKi4KKyAgIGJ5IDpjOmZ1bmM6YFB5U2VxdWVuY2VfRmFzdGAgYW5kICpvKiBpcyBub3QgKk5VTEwqLgogCiAgICBOb3RlLCBpZiBhIGxpc3QgZ2V0cyByZXNpemVkLCB0aGUgcmVhbGxvY2F0aW9uIG1heSByZWxvY2F0ZSB0aGUgaXRlbXMgYXJyYXkuCiAgICBTbywgb25seSB1c2UgdGhlIHVuZGVybHlpbmcgYXJyYXkgcG9pbnRlciBpbiBjb250ZXh0cyB3aGVyZSB0aGUgc2VxdWVuY2UKQEAgLTE5NSwyNCArMTk1LDI0IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjQKIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlTZXF1ZW5jZV9JVEVNKFB5T2JqZWN0ICpvLCBQeV9zc2l6ZV90IGkpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5U2VxdWVuY2VfSVRFTShQeU9iamVjdCAqbywgUHlfc3NpemVfdCBpKQogCiAgICBSZXR1cm4gdGhlICppKlwgdGggZWxlbWVudCBvZiAqbyogb3IgKk5VTEwqIG9uIGZhaWx1cmUuIE1hY3JvIGZvcm0gb2YKLSAgIDpjZnVuYzpgUHlTZXF1ZW5jZV9HZXRJdGVtYCBidXQgd2l0aG91dCBjaGVja2luZyB0aGF0Ci0gICA6Y2Z1bmM6YFB5U2VxdWVuY2VfQ2hlY2tgIG9uICpvKiBpcyB0cnVlIGFuZCB3aXRob3V0IGFkanVzdG1lbnQgZm9yIG5lZ2F0aXZlCisgICA6YzpmdW5jOmBQeVNlcXVlbmNlX0dldEl0ZW1gIGJ1dCB3aXRob3V0IGNoZWNraW5nIHRoYXQKKyAgIDpjOmZ1bmM6YFB5U2VxdWVuY2VfQ2hlY2tgIG9uICpvKiBpcyB0cnVlIGFuZCB3aXRob3V0IGFkanVzdG1lbnQgZm9yIG5lZ2F0aXZlCiAgICBpbmRpY2VzLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjMKIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Y3R5cGU6YGludGAgdHlwZSBmb3IgKmkqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgZm9yICppKi4gVGhpcyBtaWdodCByZXF1aXJlCiAgICAgICBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeV9zc2l6ZV90IFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShQeU9iamVjdCAqbykKKy4uIGM6ZnVuY3Rpb246OiBQeV9zc2l6ZV90IFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShQeU9iamVjdCAqbykKIAogICAgUmV0dXJucyB0aGUgbGVuZ3RoIG9mICpvKiwgYXNzdW1pbmcgdGhhdCAqbyogd2FzIHJldHVybmVkIGJ5Ci0gICA6Y2Z1bmM6YFB5U2VxdWVuY2VfRmFzdGAgYW5kIHRoYXQgKm8qIGlzIG5vdCAqTlVMTCouICBUaGUgc2l6ZSBjYW4gYWxzbyBiZQotICAgZ290dGVuIGJ5IGNhbGxpbmcgOmNmdW5jOmBQeVNlcXVlbmNlX1NpemVgIG9uICpvKiwgYnV0Ci0gICA6Y2Z1bmM6YFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRWAgaXMgZmFzdGVyIGJlY2F1c2UgaXQgY2FuIGFzc3VtZSAqbyogaXMgYSBsaXN0CisgICA6YzpmdW5jOmBQeVNlcXVlbmNlX0Zhc3RgIGFuZCB0aGF0ICpvKiBpcyBub3QgKk5VTEwqLiAgVGhlIHNpemUgY2FuIGFsc28gYmUKKyAgIGdvdHRlbiBieSBjYWxsaW5nIDpjOmZ1bmM6YFB5U2VxdWVuY2VfU2l6ZWAgb24gKm8qLCBidXQKKyAgIDpjOmZ1bmM6YFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRWAgaXMgZmFzdGVyIGJlY2F1c2UgaXQgY2FuIGFzc3VtZSAqbyogaXMgYSBsaXN0CiAgICBvciB0dXBsZS4KZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9zZXQucnN0IGIvRG9jL2MtYXBpL3NldC5yc3QKaW5kZXggNGJhYzk2Yi4uMjU4NTMwYiAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL3NldC5yc3QKKysrIGIvRG9jL2MtYXBpL3NldC5yc3QKQEAgLTE2LDIwICsxNiwyMCBAQAogCiBUaGlzIHNlY3Rpb24gZGV0YWlscyB0aGUgcHVibGljIEFQSSBmb3IgOmNsYXNzOmBzZXRgIGFuZCA6Y2xhc3M6YGZyb3plbnNldGAKIG9iamVjdHMuICBBbnkgZnVuY3Rpb25hbGl0eSBub3QgbGlzdGVkIGJlbG93IGlzIGJlc3QgYWNjZXNzZWQgdXNpbmcgdGhlIGVpdGhlcgotdGhlIGFic3RyYWN0IG9iamVjdCBwcm90b2NvbCAoaW5jbHVkaW5nIDpjZnVuYzpgUHlPYmplY3RfQ2FsbE1ldGhvZGAsCi06Y2Z1bmM6YFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbGAsIDpjZnVuYzpgUHlPYmplY3RfSGFzaGAsCi06Y2Z1bmM6YFB5T2JqZWN0X1JlcHJgLCA6Y2Z1bmM6YFB5T2JqZWN0X0lzVHJ1ZWAsIDpjZnVuYzpgUHlPYmplY3RfUHJpbnRgLCBhbmQKLTpjZnVuYzpgUHlPYmplY3RfR2V0SXRlcmApIG9yIHRoZSBhYnN0cmFjdCBudW1iZXIgcHJvdG9jb2wgKGluY2x1ZGluZwotOmNmdW5jOmBQeU51bWJlcl9BbmRgLCA6Y2Z1bmM6YFB5TnVtYmVyX1N1YnRyYWN0YCwgOmNmdW5jOmBQeU51bWJlcl9PcmAsCi06Y2Z1bmM6YFB5TnVtYmVyX1hvcmAsIDpjZnVuYzpgUHlOdW1iZXJfSW5QbGFjZUFuZGAsCi06Y2Z1bmM6YFB5TnVtYmVyX0luUGxhY2VTdWJ0cmFjdGAsIDpjZnVuYzpgUHlOdW1iZXJfSW5QbGFjZU9yYCwgYW5kCi06Y2Z1bmM6YFB5TnVtYmVyX0luUGxhY2VYb3JgKS4KK3RoZSBhYnN0cmFjdCBvYmplY3QgcHJvdG9jb2wgKGluY2x1ZGluZyA6YzpmdW5jOmBQeU9iamVjdF9DYWxsTWV0aG9kYCwKKzpjOmZ1bmM6YFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbGAsIDpjOmZ1bmM6YFB5T2JqZWN0X0hhc2hgLAorOmM6ZnVuYzpgUHlPYmplY3RfUmVwcmAsIDpjOmZ1bmM6YFB5T2JqZWN0X0lzVHJ1ZWAsIDpjOmZ1bmM6YFB5T2JqZWN0X1ByaW50YCwgYW5kCis6YzpmdW5jOmBQeU9iamVjdF9HZXRJdGVyYCkgb3IgdGhlIGFic3RyYWN0IG51bWJlciBwcm90b2NvbCAoaW5jbHVkaW5nCis6YzpmdW5jOmBQeU51bWJlcl9BbmRgLCA6YzpmdW5jOmBQeU51bWJlcl9TdWJ0cmFjdGAsIDpjOmZ1bmM6YFB5TnVtYmVyX09yYCwKKzpjOmZ1bmM6YFB5TnVtYmVyX1hvcmAsIDpjOmZ1bmM6YFB5TnVtYmVyX0luUGxhY2VBbmRgLAorOmM6ZnVuYzpgUHlOdW1iZXJfSW5QbGFjZVN1YnRyYWN0YCwgOmM6ZnVuYzpgUHlOdW1iZXJfSW5QbGFjZU9yYCwgYW5kCis6YzpmdW5jOmBQeU51bWJlcl9JblBsYWNlWG9yYCkuCiAKIAotLi4gY3R5cGU6OiBQeVNldE9iamVjdAorLi4gYzp0eXBlOjogUHlTZXRPYmplY3QKIAotICAgVGhpcyBzdWJ0eXBlIG9mIDpjdHlwZTpgUHlPYmplY3RgIGlzIHVzZWQgdG8gaG9sZCB0aGUgaW50ZXJuYWwgZGF0YSBmb3IgYm90aAotICAgOmNsYXNzOmBzZXRgIGFuZCA6Y2xhc3M6YGZyb3plbnNldGAgb2JqZWN0cy4gIEl0IGlzIGxpa2UgYSA6Y3R5cGU6YFB5RGljdE9iamVjdGAKKyAgIFRoaXMgc3VidHlwZSBvZiA6Yzp0eXBlOmBQeU9iamVjdGAgaXMgdXNlZCB0byBob2xkIHRoZSBpbnRlcm5hbCBkYXRhIGZvciBib3RoCisgICA6Y2xhc3M6YHNldGAgYW5kIDpjbGFzczpgZnJvemVuc2V0YCBvYmplY3RzLiAgSXQgaXMgbGlrZSBhIDpjOnR5cGU6YFB5RGljdE9iamVjdGAKICAgIGluIHRoYXQgaXQgaXMgYSBmaXhlZCBzaXplIGZvciBzbWFsbCBzZXRzIChtdWNoIGxpa2UgdHVwbGUgc3RvcmFnZSkgYW5kIHdpbGwKICAgIHBvaW50IHRvIGEgc2VwYXJhdGUsIHZhcmlhYmxlIHNpemVkIGJsb2NrIG9mIG1lbW9yeSBmb3IgbWVkaXVtIGFuZCBsYXJnZSBzaXplZAogICAgc2V0cyAobXVjaCBsaWtlIGxpc3Qgc3RvcmFnZSkuIE5vbmUgb2YgdGhlIGZpZWxkcyBvZiB0aGlzIHN0cnVjdHVyZSBzaG91bGQgYmUKQEAgLTM3LDUzICszNyw1MyBAQAogICAgdGhlIGRvY3VtZW50ZWQgQVBJIHJhdGhlciB0aGFuIGJ5IG1hbmlwdWxhdGluZyB0aGUgdmFsdWVzIGluIHRoZSBzdHJ1Y3R1cmUuCiAKIAotLi4gY3Zhcjo6IFB5VHlwZU9iamVjdCBQeVNldF9UeXBlCisuLiBjOnZhcjo6IFB5VHlwZU9iamVjdCBQeVNldF9UeXBlCiAKLSAgIFRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YgOmN0eXBlOmBQeVR5cGVPYmplY3RgIHJlcHJlc2VudGluZyB0aGUgUHl0aG9uCisgICBUaGlzIGlzIGFuIGluc3RhbmNlIG9mIDpjOnR5cGU6YFB5VHlwZU9iamVjdGAgcmVwcmVzZW50aW5nIHRoZSBQeXRob24KICAgIDpjbGFzczpgc2V0YCB0eXBlLgogCiAKLS4uIGN2YXI6OiBQeVR5cGVPYmplY3QgUHlGcm96ZW5TZXRfVHlwZQorLi4gYzp2YXI6OiBQeVR5cGVPYmplY3QgUHlGcm96ZW5TZXRfVHlwZQogCi0gICBUaGlzIGlzIGFuIGluc3RhbmNlIG9mIDpjdHlwZTpgUHlUeXBlT2JqZWN0YCByZXByZXNlbnRpbmcgdGhlIFB5dGhvbgorICAgVGhpcyBpcyBhbiBpbnN0YW5jZSBvZiA6Yzp0eXBlOmBQeVR5cGVPYmplY3RgIHJlcHJlc2VudGluZyB0aGUgUHl0aG9uCiAgICA6Y2xhc3M6YGZyb3plbnNldGAgdHlwZS4KIAogVGhlIGZvbGxvd2luZyB0eXBlIGNoZWNrIG1hY3JvcyB3b3JrIG9uIHBvaW50ZXJzIHRvIGFueSBQeXRob24gb2JqZWN0LiBMaWtld2lzZSwKIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgd29yayB3aXRoIGFueSBpdGVyYWJsZSBQeXRob24gb2JqZWN0LgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeVNldF9DaGVjayhQeU9iamVjdCAqcCkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlTZXRfQ2hlY2soUHlPYmplY3QgKnApCiAKICAgIFJldHVybiB0cnVlIGlmICpwKiBpcyBhIDpjbGFzczpgc2V0YCBvYmplY3Qgb3IgYW4gaW5zdGFuY2Ugb2YgYSBzdWJ0eXBlLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjYKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5RnJvemVuU2V0X0NoZWNrKFB5T2JqZWN0ICpwKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUZyb3plblNldF9DaGVjayhQeU9iamVjdCAqcCkKIAogICAgUmV0dXJuIHRydWUgaWYgKnAqIGlzIGEgOmNsYXNzOmBmcm96ZW5zZXRgIG9iamVjdCBvciBhbiBpbnN0YW5jZSBvZiBhCiAgICBzdWJ0eXBlLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjYKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5QW55U2V0X0NoZWNrKFB5T2JqZWN0ICpwKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUFueVNldF9DaGVjayhQeU9iamVjdCAqcCkKIAogICAgUmV0dXJuIHRydWUgaWYgKnAqIGlzIGEgOmNsYXNzOmBzZXRgIG9iamVjdCwgYSA6Y2xhc3M6YGZyb3plbnNldGAgb2JqZWN0LCBvciBhbgogICAgaW5zdGFuY2Ugb2YgYSBzdWJ0eXBlLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUFueVNldF9DaGVja0V4YWN0KFB5T2JqZWN0ICpwKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeUFueVNldF9DaGVja0V4YWN0KFB5T2JqZWN0ICpwKQogCiAgICBSZXR1cm4gdHJ1ZSBpZiAqcCogaXMgYSA6Y2xhc3M6YHNldGAgb2JqZWN0IG9yIGEgOmNsYXNzOmBmcm96ZW5zZXRgIG9iamVjdCBidXQKICAgIG5vdCBhbiBpbnN0YW5jZSBvZiBhIHN1YnR5cGUuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5RnJvemVuU2V0X0NoZWNrRXhhY3QoUHlPYmplY3QgKnApCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5RnJvemVuU2V0X0NoZWNrRXhhY3QoUHlPYmplY3QgKnApCiAKICAgIFJldHVybiB0cnVlIGlmICpwKiBpcyBhIDpjbGFzczpgZnJvemVuc2V0YCBvYmplY3QgYnV0IG5vdCBhbiBpbnN0YW5jZSBvZiBhCiAgICBzdWJ0eXBlLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVNldF9OZXcoUHlPYmplY3QgKml0ZXJhYmxlKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVNldF9OZXcoUHlPYmplY3QgKml0ZXJhYmxlKQogCiAgICBSZXR1cm4gYSBuZXcgOmNsYXNzOmBzZXRgIGNvbnRhaW5pbmcgb2JqZWN0cyByZXR1cm5lZCBieSB0aGUgKml0ZXJhYmxlKi4gIFRoZQogICAgKml0ZXJhYmxlKiBtYXkgYmUgKk5VTEwqIHRvIGNyZWF0ZSBhIG5ldyBlbXB0eSBzZXQuICBSZXR1cm4gdGhlIG5ldyBzZXQgb24KQEAgLTkyLDcgKzkyLDcgQEAKICAgIChgYGM9c2V0KHMpYGApLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUZyb3plblNldF9OZXcoUHlPYmplY3QgKml0ZXJhYmxlKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUZyb3plblNldF9OZXcoUHlPYmplY3QgKml0ZXJhYmxlKQogCiAgICBSZXR1cm4gYSBuZXcgOmNsYXNzOmBmcm96ZW5zZXRgIGNvbnRhaW5pbmcgb2JqZWN0cyByZXR1cm5lZCBieSB0aGUgKml0ZXJhYmxlKi4KICAgIFRoZSAqaXRlcmFibGUqIG1heSBiZSAqTlVMTCogdG8gY3JlYXRlIGEgbmV3IGVtcHR5IGZyb3plbnNldC4gIFJldHVybiB0aGUgbmV3CkBAIC0xMDgsNyArMTA4LDcgQEAKIG9yIDpjbGFzczpgZnJvemVuc2V0YCBvciBpbnN0YW5jZXMgb2YgdGhlaXIgc3VidHlwZXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlfc3NpemVfdCBQeVNldF9TaXplKFB5T2JqZWN0ICphbnlzZXQpCisuLiBjOmZ1bmN0aW9uOjogUHlfc3NpemVfdCBQeVNldF9TaXplKFB5T2JqZWN0ICphbnlzZXQpCiAKICAgIC4uIGluZGV4OjogYnVpbHRpbjogbGVuCiAKQEAgLTExNywxNiArMTE3LDE2IEBACiAgICA6Y2xhc3M6YHNldGAsIDpjbGFzczpgZnJvemVuc2V0YCwgb3IgYW4gaW5zdGFuY2Ugb2YgYSBzdWJ0eXBlLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5lZCBhbiA6Y3R5cGU6YGludGAuIFRoaXMgbWlnaHQgcmVxdWlyZSBjaGFuZ2VzIGluCisgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybmVkIGFuIDpjOnR5cGU6YGludGAuIFRoaXMgbWlnaHQgcmVxdWlyZSBjaGFuZ2VzIGluCiAgICAgICB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlfc3NpemVfdCBQeVNldF9HRVRfU0laRShQeU9iamVjdCAqYW55c2V0KQorLi4gYzpmdW5jdGlvbjo6IFB5X3NzaXplX3QgUHlTZXRfR0VUX1NJWkUoUHlPYmplY3QgKmFueXNldCkKIAotICAgTWFjcm8gZm9ybSBvZiA6Y2Z1bmM6YFB5U2V0X1NpemVgIHdpdGhvdXQgZXJyb3IgY2hlY2tpbmcuCisgICBNYWNybyBmb3JtIG9mIDpjOmZ1bmM6YFB5U2V0X1NpemVgIHdpdGhvdXQgZXJyb3IgY2hlY2tpbmcuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5U2V0X0NvbnRhaW5zKFB5T2JqZWN0ICphbnlzZXQsIFB5T2JqZWN0ICprZXkpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5U2V0X0NvbnRhaW5zKFB5T2JqZWN0ICphbnlzZXQsIFB5T2JqZWN0ICprZXkpCiAKICAgIFJldHVybiAxIGlmIGZvdW5kLCAwIGlmIG5vdCBmb3VuZCwgYW5kIC0xIGlmIGFuIGVycm9yIGlzIGVuY291bnRlcmVkLiAgVW5saWtlCiAgICB0aGUgUHl0aG9uIDptZXRoOmBfX2NvbnRhaW5zX19gIG1ldGhvZCwgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5CkBAIC0xMzUsNyArMTM1LDcgQEAKICAgIDpjbGFzczpgc2V0YCwgOmNsYXNzOmBmcm96ZW5zZXRgLCBvciBhbiBpbnN0YW5jZSBvZiBhIHN1YnR5cGUuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5U2V0X0FkZChQeU9iamVjdCAqc2V0LCBQeU9iamVjdCAqa2V5KQorLi4gYzpmdW5jdGlvbjo6IGludCBQeVNldF9BZGQoUHlPYmplY3QgKnNldCwgUHlPYmplY3QgKmtleSkKIAogICAgQWRkICprZXkqIHRvIGEgOmNsYXNzOmBzZXRgIGluc3RhbmNlLiAgRG9lcyBub3QgYXBwbHkgdG8gOmNsYXNzOmBmcm96ZW5zZXRgCiAgICBpbnN0YW5jZXMuICBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIC0xIG9uIGZhaWx1cmUuIFJhaXNlIGEgOmV4YzpgVHlwZUVycm9yYCBpZgpAQCAtMTQ1LDI0ICsxNDUsMjQgQEAKIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjYKICAgICAgIE5vdyB3b3JrcyB3aXRoIGluc3RhbmNlcyBvZiA6Y2xhc3M6YGZyb3plbnNldGAgb3IgaXRzIHN1YnR5cGVzLgotICAgICAgTGlrZSA6Y2Z1bmM6YFB5VHVwbGVfU2V0SXRlbWAgaW4gdGhhdCBpdCBjYW4gYmUgdXNlZCB0byBmaWxsLWluIHRoZQorICAgICAgTGlrZSA6YzpmdW5jOmBQeVR1cGxlX1NldEl0ZW1gIGluIHRoYXQgaXQgY2FuIGJlIHVzZWQgdG8gZmlsbC1pbiB0aGUKICAgICAgIHZhbHVlcyBvZiBicmFuZCBuZXcgZnJvemVuc2V0cyBiZWZvcmUgdGhleSBhcmUgZXhwb3NlZCB0byBvdGhlciBjb2RlLgogCiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIGZvciBpbnN0YW5jZXMgb2YgOmNsYXNzOmBzZXRgIG9yIGl0cwogc3VidHlwZXMgYnV0IG5vdCBmb3IgaW5zdGFuY2VzIG9mIDpjbGFzczpgZnJvemVuc2V0YCBvciBpdHMgc3VidHlwZXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5U2V0X0Rpc2NhcmQoUHlPYmplY3QgKnNldCwgUHlPYmplY3QgKmtleSkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlTZXRfRGlzY2FyZChQeU9iamVjdCAqc2V0LCBQeU9iamVjdCAqa2V5KQogCiAgICBSZXR1cm4gMSBpZiBmb3VuZCBhbmQgcmVtb3ZlZCwgMCBpZiBub3QgZm91bmQgKG5vIGFjdGlvbiB0YWtlbiksIGFuZCAtMSBpZiBhbgogICAgZXJyb3IgaXMgZW5jb3VudGVyZWQuICBEb2VzIG5vdCByYWlzZSA6ZXhjOmBLZXlFcnJvcmAgZm9yIG1pc3Npbmcga2V5cy4gIFJhaXNlIGEKLSAgIDpleGM6YFR5cGVFcnJvcmAgaWYgdGhlICprZXkqIGlzIHVuaGFzaGFibGUuICBVbmxpa2UgdGhlIFB5dGhvbiA6bWV0aDpgZGlzY2FyZGAKKyAgIDpleGM6YFR5cGVFcnJvcmAgaWYgdGhlICprZXkqIGlzIHVuaGFzaGFibGUuICBVbmxpa2UgdGhlIFB5dGhvbiA6bWV0aDpgfnNldC5kaXNjYXJkYAogICAgbWV0aG9kLCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgY29udmVydCB1bmhhc2hhYmxlIHNldHMgaW50bwogICAgdGVtcG9yYXJ5IGZyb3plbnNldHMuIFJhaXNlIDpleGM6YFB5RXhjX1N5c3RlbUVycm9yYCBpZiAqc2V0KiBpcyBhbiBub3QgYW4KICAgIGluc3RhbmNlIG9mIDpjbGFzczpgc2V0YCBvciBpdHMgc3VidHlwZS4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlTZXRfUG9wKFB5T2JqZWN0ICpzZXQpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5U2V0X1BvcChQeU9iamVjdCAqc2V0KQogCiAgICBSZXR1cm4gYSBuZXcgcmVmZXJlbmNlIHRvIGFuIGFyYml0cmFyeSBvYmplY3QgaW4gdGhlICpzZXQqLCBhbmQgcmVtb3ZlcyB0aGUKICAgIG9iamVjdCBmcm9tIHRoZSAqc2V0Ki4gIFJldHVybiAqTlVMTCogb24gZmFpbHVyZS4gIFJhaXNlIDpleGM6YEtleUVycm9yYCBpZiB0aGUKQEAgLTE3MCw2ICsxNzAsNiBAQAogICAgOmNsYXNzOmBzZXRgIG9yIGl0cyBzdWJ0eXBlLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeVNldF9DbGVhcihQeU9iamVjdCAqc2V0KQorLi4gYzpmdW5jdGlvbjo6IGludCBQeVNldF9DbGVhcihQeU9iamVjdCAqc2V0KQogCiAgICBFbXB0eSBhbiBleGlzdGluZyBzZXQgb2YgYWxsIGVsZW1lbnRzLgpkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL3NsaWNlLnJzdCBiL0RvYy9jLWFwaS9zbGljZS5yc3QKaW5kZXggMTRjMWQ0OS4uZjc0MjMwYSAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL3NsaWNlLnJzdAorKysgYi9Eb2MvYy1hcGkvc2xpY2UucnN0CkBAIC02LDcgKzYsNyBAQAogLS0tLS0tLS0tLS0tLQogCiAKLS4uIGN2YXI6OiBQeVR5cGVPYmplY3QgUHlTbGljZV9UeXBlCisuLiBjOnZhcjo6IFB5VHlwZU9iamVjdCBQeVNsaWNlX1R5cGUKIAogICAgLi4gaW5kZXg6OiBzaW5nbGU6IFNsaWNlVHlwZSAoaW4gbW9kdWxlIHR5cGVzKQogCkBAIC0xNCwxMiArMTQsMTIgQEAKICAgIGBgdHlwZXMuU2xpY2VUeXBlYGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5U2xpY2VfQ2hlY2soUHlPYmplY3QgKm9iKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeVNsaWNlX0NoZWNrKFB5T2JqZWN0ICpvYikKIAogICAgUmV0dXJuIHRydWUgaWYgKm9iKiBpcyBhIHNsaWNlIG9iamVjdDsgKm9iKiBtdXN0IG5vdCBiZSAqTlVMTCouCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5U2xpY2VfTmV3KFB5T2JqZWN0ICpzdGFydCwgUHlPYmplY3QgKnN0b3AsIFB5T2JqZWN0ICpzdGVwKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVNsaWNlX05ldyhQeU9iamVjdCAqc3RhcnQsIFB5T2JqZWN0ICpzdG9wLCBQeU9iamVjdCAqc3RlcCkKIAogICAgUmV0dXJuIGEgbmV3IHNsaWNlIG9iamVjdCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXMuICBUaGUgKnN0YXJ0KiwgKnN0b3AqLCBhbmQKICAgICpzdGVwKiBwYXJhbWV0ZXJzIGFyZSB1c2VkIGFzIHRoZSB2YWx1ZXMgb2YgdGhlIHNsaWNlIG9iamVjdCBhdHRyaWJ1dGVzIG9mCkBAIC0yOCw3ICsyOCw3IEBACiAgICB0aGUgbmV3IG9iamVjdCBjb3VsZCBub3QgYmUgYWxsb2NhdGVkLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeVNsaWNlX0dldEluZGljZXMoUHlTbGljZU9iamVjdCAqc2xpY2UsIFB5X3NzaXplX3QgbGVuZ3RoLCBQeV9zc2l6ZV90ICpzdGFydCwgUHlfc3NpemVfdCAqc3RvcCwgUHlfc3NpemVfdCAqc3RlcCkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlTbGljZV9HZXRJbmRpY2VzKFB5U2xpY2VPYmplY3QgKnNsaWNlLCBQeV9zc2l6ZV90IGxlbmd0aCwgUHlfc3NpemVfdCAqc3RhcnQsIFB5X3NzaXplX3QgKnN0b3AsIFB5X3NzaXplX3QgKnN0ZXApCiAKICAgIFJldHJpZXZlIHRoZSBzdGFydCwgc3RvcCBhbmQgc3RlcCBpbmRpY2VzIGZyb20gdGhlIHNsaWNlIG9iamVjdCAqc2xpY2UqLAogICAgYXNzdW1pbmcgYSBzZXF1ZW5jZSBvZiBsZW5ndGggKmxlbmd0aCouIFRyZWF0cyBpbmRpY2VzIGdyZWF0ZXIgdGhhbgpAQCAtNDAsMTggKzQwLDE4IEBACiAKICAgIFlvdSBwcm9iYWJseSBkbyBub3Qgd2FudCB0byB1c2UgdGhpcyBmdW5jdGlvbi4gIElmIHlvdSB3YW50IHRvIHVzZSBzbGljZQogICAgb2JqZWN0cyBpbiB2ZXJzaW9ucyBvZiBQeXRob24gcHJpb3IgdG8gMi4zLCB5b3Ugd291bGQgcHJvYmFibHkgZG8gd2VsbCB0bwotICAgaW5jb3Jwb3JhdGUgdGhlIHNvdXJjZSBvZiA6Y2Z1bmM6YFB5U2xpY2VfR2V0SW5kaWNlc0V4YCwgc3VpdGFibHkgcmVuYW1lZCwKKyAgIGluY29ycG9yYXRlIHRoZSBzb3VyY2Ugb2YgOmM6ZnVuYzpgUHlTbGljZV9HZXRJbmRpY2VzRXhgLCBzdWl0YWJseSByZW5hbWVkLAogICAgaW4gdGhlIHNvdXJjZSBvZiB5b3VyIGV4dGVuc2lvbi4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Y3R5cGU6YGludGAgdHlwZSBmb3IgKmxlbmd0aCogYW5kIGFuCi0gICAgICA6Y3R5cGU6YGludCAqYCB0eXBlIGZvciAqc3RhcnQqLCAqc3RvcCosIGFuZCAqc3RlcCouIFRoaXMgbWlnaHQgcmVxdWlyZQorICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjOnR5cGU6YGludGAgdHlwZSBmb3IgKmxlbmd0aCogYW5kIGFuCisgICAgICA6Yzp0eXBlOmBpbnQgKmAgdHlwZSBmb3IgKnN0YXJ0KiwgKnN0b3AqLCBhbmQgKnN0ZXAqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKICAgICAgIGNoYW5nZXMgaW4geW91ciBjb2RlIGZvciBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeVNsaWNlX0dldEluZGljZXNFeChQeVNsaWNlT2JqZWN0ICpzbGljZSwgUHlfc3NpemVfdCBsZW5ndGgsIFB5X3NzaXplX3QgKnN0YXJ0LCBQeV9zc2l6ZV90ICpzdG9wLCBQeV9zc2l6ZV90ICpzdGVwLCBQeV9zc2l6ZV90ICpzbGljZWxlbmd0aCkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlTbGljZV9HZXRJbmRpY2VzRXgoUHlTbGljZU9iamVjdCAqc2xpY2UsIFB5X3NzaXplX3QgbGVuZ3RoLCBQeV9zc2l6ZV90ICpzdGFydCwgUHlfc3NpemVfdCAqc3RvcCwgUHlfc3NpemVfdCAqc3RlcCwgUHlfc3NpemVfdCAqc2xpY2VsZW5ndGgpCiAKLSAgIFVzYWJsZSByZXBsYWNlbWVudCBmb3IgOmNmdW5jOmBQeVNsaWNlX0dldEluZGljZXNgLiAgUmV0cmlldmUgdGhlIHN0YXJ0LAorICAgVXNhYmxlIHJlcGxhY2VtZW50IGZvciA6YzpmdW5jOmBQeVNsaWNlX0dldEluZGljZXNgLiAgUmV0cmlldmUgdGhlIHN0YXJ0LAogICAgc3RvcCwgYW5kIHN0ZXAgaW5kaWNlcyBmcm9tIHRoZSBzbGljZSBvYmplY3QgKnNsaWNlKiBhc3N1bWluZyBhIHNlcXVlbmNlIG9mCiAgICBsZW5ndGggKmxlbmd0aCosIGFuZCBzdG9yZSB0aGUgbGVuZ3RoIG9mIHRoZSBzbGljZSBpbiAqc2xpY2VsZW5ndGgqLiAgT3V0CiAgICBvZiBib3VuZHMgaW5kaWNlcyBhcmUgY2xpcHBlZCBpbiBhIG1hbm5lciBjb25zaXN0ZW50IHdpdGggdGhlIGhhbmRsaW5nIG9mCkBAIC02Miw3ICs2Miw3IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjMKIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Y3R5cGU6YGludGAgdHlwZSBmb3IgKmxlbmd0aCogYW5kIGFuCi0gICAgICA6Y3R5cGU6YGludCAqYCB0eXBlIGZvciAqc3RhcnQqLCAqc3RvcCosICpzdGVwKiwgYW5kICpzbGljZWxlbmd0aCouIFRoaXMKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgZm9yICpsZW5ndGgqIGFuZCBhbgorICAgICAgOmM6dHlwZTpgaW50ICpgIHR5cGUgZm9yICpzdGFydCosICpzdG9wKiwgKnN0ZXAqLCBhbmQgKnNsaWNlbGVuZ3RoKi4gVGhpcwogICAgICAgbWlnaHQgcmVxdWlyZSBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQKICAgICAgIHN5c3RlbXMuCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvc3RyaW5nLnJzdCBiL0RvYy9jLWFwaS9zdHJpbmcucnN0CmluZGV4IDliOTU4NTkuLjMyZGMyNzQgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS9zdHJpbmcucnN0CisrKyBiL0RvYy9jLWFwaS9zdHJpbmcucnN0CkBAIC0xNywyMCArMTcsMjAgQEAKIC4uIGluZGV4Ojogb2JqZWN0OiBzdHJpbmcKIAogCi0uLiBjdHlwZTo6IFB5U3RyaW5nT2JqZWN0CisuLiBjOnR5cGU6OiBQeVN0cmluZ09iamVjdAogCi0gICBUaGlzIHN1YnR5cGUgb2YgOmN0eXBlOmBQeU9iamVjdGAgcmVwcmVzZW50cyBhIFB5dGhvbiBzdHJpbmcgb2JqZWN0LgorICAgVGhpcyBzdWJ0eXBlIG9mIDpjOnR5cGU6YFB5T2JqZWN0YCByZXByZXNlbnRzIGEgUHl0aG9uIHN0cmluZyBvYmplY3QuCiAKIAotLi4gY3Zhcjo6IFB5VHlwZU9iamVjdCBQeVN0cmluZ19UeXBlCisuLiBjOnZhcjo6IFB5VHlwZU9iamVjdCBQeVN0cmluZ19UeXBlCiAKICAgIC4uIGluZGV4Ojogc2luZ2xlOiBTdHJpbmdUeXBlIChpbiBtb2R1bGUgdHlwZXMpCiAKLSAgIFRoaXMgaW5zdGFuY2Ugb2YgOmN0eXBlOmBQeVR5cGVPYmplY3RgIHJlcHJlc2VudHMgdGhlIFB5dGhvbiBzdHJpbmcgdHlwZTsgaXQgaXMKKyAgIFRoaXMgaW5zdGFuY2Ugb2YgOmM6dHlwZTpgUHlUeXBlT2JqZWN0YCByZXByZXNlbnRzIHRoZSBQeXRob24gc3RyaW5nIHR5cGU7IGl0IGlzCiAgICB0aGUgc2FtZSBvYmplY3QgYXMgYGBzdHJgYCBhbmQgYGB0eXBlcy5TdHJpbmdUeXBlYGAgaW4gdGhlIFB5dGhvbiBsYXllci4gLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeVN0cmluZ19DaGVjayhQeU9iamVjdCAqbykKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlTdHJpbmdfQ2hlY2soUHlPYmplY3QgKm8pCiAKICAgIFJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgKm8qIGlzIGEgc3RyaW5nIG9iamVjdCBvciBhbiBpbnN0YW5jZSBvZiBhIHN1YnR5cGUgb2YKICAgIHRoZSBzdHJpbmcgdHlwZS4KQEAgLTM5LDcgKzM5LDcgQEAKICAgICAgIEFsbG93ZWQgc3VidHlwZXMgdG8gYmUgYWNjZXB0ZWQuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5U3RyaW5nX0NoZWNrRXhhY3QoUHlPYmplY3QgKm8pCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5U3RyaW5nX0NoZWNrRXhhY3QoUHlPYmplY3QgKm8pCiAKICAgIFJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgKm8qIGlzIGEgc3RyaW5nIG9iamVjdCwgYnV0IG5vdCBhbiBpbnN0YW5jZSBvZiBhCiAgICBzdWJ0eXBlIG9mIHRoZSBzdHJpbmcgdHlwZS4KQEAgLTQ3LDI3ICs0NywyNyBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4yCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5U3RyaW5nX0Zyb21TdHJpbmcoY29uc3QgY2hhciAqdikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlTdHJpbmdfRnJvbVN0cmluZyhjb25zdCBjaGFyICp2KQogCiAgICBSZXR1cm4gYSBuZXcgc3RyaW5nIG9iamVjdCB3aXRoIGEgY29weSBvZiB0aGUgc3RyaW5nICp2KiBhcyB2YWx1ZSBvbiBzdWNjZXNzLAogICAgYW5kICpOVUxMKiBvbiBmYWlsdXJlLiAgVGhlIHBhcmFtZXRlciAqdiogbXVzdCBub3QgYmUgKk5VTEwqOyBpdCB3aWxsIG5vdCBiZQogICAgY2hlY2tlZC4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoY29uc3QgY2hhciAqdiwgUHlfc3NpemVfdCBsZW4pCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGNvbnN0IGNoYXIgKnYsIFB5X3NzaXplX3QgbGVuKQogCiAgICBSZXR1cm4gYSBuZXcgc3RyaW5nIG9iamVjdCB3aXRoIGEgY29weSBvZiB0aGUgc3RyaW5nICp2KiBhcyB2YWx1ZSBhbmQgbGVuZ3RoCiAgICAqbGVuKiBvbiBzdWNjZXNzLCBhbmQgKk5VTEwqIG9uIGZhaWx1cmUuICBJZiAqdiogaXMgKk5VTEwqLCB0aGUgY29udGVudHMgb2YgdGhlCiAgICBzdHJpbmcgYXJlIHVuaW5pdGlhbGl6ZWQuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUgZm9yICpsZW4qLiBUaGlzIG1pZ2h0IHJlcXVpcmUKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgZm9yICpsZW4qLiBUaGlzIG1pZ2h0IHJlcXVpcmUKICAgICAgIGNoYW5nZXMgaW4geW91ciBjb2RlIGZvciBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVN0cmluZ19Gcm9tRm9ybWF0KGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVN0cmluZ19Gcm9tRm9ybWF0KGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogCi0gICBUYWtlIGEgQyA6Y2Z1bmM6YHByaW50ZmBcIC1zdHlsZSAqZm9ybWF0KiBzdHJpbmcgYW5kIGEgdmFyaWFibGUgbnVtYmVyIG9mCisgICBUYWtlIGEgQyA6YzpmdW5jOmBwcmludGZgXCAtc3R5bGUgKmZvcm1hdCogc3RyaW5nIGFuZCBhIHZhcmlhYmxlIG51bWJlciBvZgogICAgYXJndW1lbnRzLCBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHJlc3VsdGluZyBQeXRob24gc3RyaW5nIGFuZCByZXR1cm4gYSBzdHJpbmcKICAgIHdpdGggdGhlIHZhbHVlcyBmb3JtYXR0ZWQgaW50byBpdC4gIFRoZSB2YXJpYWJsZSBhcmd1bWVudHMgbXVzdCBiZSBDIHR5cGVzIGFuZAogICAgbXVzdCBjb3JyZXNwb25kIGV4YWN0bHkgdG8gdGhlIGZvcm1hdCBjaGFyYWN0ZXJzIGluIHRoZSAqZm9ybWF0KiBzdHJpbmcuICBUaGUKQEAgLTE0NCwzMSArMTQ0LDMxIEBACiAgICAgICBTdXBwb3J0IGZvciBgIiVsbGQiYCBhbmQgYCIlbGx1ImAgYWRkZWQuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5U3RyaW5nX0Zyb21Gb3JtYXRWKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCB2YXJncykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlTdHJpbmdfRnJvbUZvcm1hdFYoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhcmdzKQogCi0gICBJZGVudGljYWwgdG8gOmNmdW5jOmBQeVN0cmluZ19Gcm9tRm9ybWF0YCBleGNlcHQgdGhhdCBpdCB0YWtlcyBleGFjdGx5IHR3bworICAgSWRlbnRpY2FsIHRvIDpjOmZ1bmM6YFB5U3RyaW5nX0Zyb21Gb3JtYXRgIGV4Y2VwdCB0aGF0IGl0IHRha2VzIGV4YWN0bHkgdHdvCiAgICBhcmd1bWVudHMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlfc3NpemVfdCBQeVN0cmluZ19TaXplKFB5T2JqZWN0ICpzdHJpbmcpCisuLiBjOmZ1bmN0aW9uOjogUHlfc3NpemVfdCBQeVN0cmluZ19TaXplKFB5T2JqZWN0ICpzdHJpbmcpCiAKICAgIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaW4gc3RyaW5nIG9iamVjdCAqc3RyaW5nKi4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJuZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUuIFRoaXMgbWlnaHQgcmVxdWlyZSBjaGFuZ2VzCisgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybmVkIGFuIDpjOnR5cGU6YGludGAgdHlwZS4gVGhpcyBtaWdodCByZXF1aXJlIGNoYW5nZXMKICAgICAgIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeV9zc2l6ZV90IFB5U3RyaW5nX0dFVF9TSVpFKFB5T2JqZWN0ICpzdHJpbmcpCisuLiBjOmZ1bmN0aW9uOjogUHlfc3NpemVfdCBQeVN0cmluZ19HRVRfU0laRShQeU9iamVjdCAqc3RyaW5nKQogCi0gICBNYWNybyBmb3JtIG9mIDpjZnVuYzpgUHlTdHJpbmdfU2l6ZWAgYnV0IHdpdGhvdXQgZXJyb3IgY2hlY2tpbmcuCisgICBNYWNybyBmb3JtIG9mIDpjOmZ1bmM6YFB5U3RyaW5nX1NpemVgIGJ1dCB3aXRob3V0IGVycm9yIGNoZWNraW5nLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBtYWNybyByZXR1cm5lZCBhbiA6Y3R5cGU6YGludGAgdHlwZS4gVGhpcyBtaWdodCByZXF1aXJlIGNoYW5nZXMgaW4KKyAgICAgIFRoaXMgbWFjcm8gcmV0dXJuZWQgYW4gOmM6dHlwZTpgaW50YCB0eXBlLiBUaGlzIG1pZ2h0IHJlcXVpcmUgY2hhbmdlcyBpbgogICAgICAgeW91ciBjb2RlIGZvciBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCiAKLS4uIGNmdW5jdGlvbjo6IGNoYXIqIFB5U3RyaW5nX0FzU3RyaW5nKFB5T2JqZWN0ICpzdHJpbmcpCisuLiBjOmZ1bmN0aW9uOjogY2hhciogUHlTdHJpbmdfQXNTdHJpbmcoUHlPYmplY3QgKnN0cmluZykKIAogICAgUmV0dXJuIGEgTlVMLXRlcm1pbmF0ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbnRlbnRzIG9mICpzdHJpbmcqLiAgVGhlIHBvaW50ZXIKICAgIHJlZmVycyB0byB0aGUgaW50ZXJuYWwgYnVmZmVyIG9mICpzdHJpbmcqLCBub3QgYSBjb3B5LiAgVGhlIGRhdGEgbXVzdCBub3QgYmUKQEAgLTE3NiwxNiArMTc2LDE2IEBACiAgICBgYFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNpemUpYGAuIEl0IG11c3Qgbm90IGJlIGRlYWxsb2NhdGVkLiAgSWYKICAgICpzdHJpbmcqIGlzIGEgVW5pY29kZSBvYmplY3QsIHRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGRlZmF1bHQgZW5jb2Rpbmcgb2YKICAgICpzdHJpbmcqIGFuZCBvcGVyYXRlcyBvbiB0aGF0LiAgSWYgKnN0cmluZyogaXMgbm90IGEgc3RyaW5nIG9iamVjdCBhdCBhbGwsCi0gICA6Y2Z1bmM6YFB5U3RyaW5nX0FzU3RyaW5nYCByZXR1cm5zICpOVUxMKiBhbmQgcmFpc2VzIDpleGM6YFR5cGVFcnJvcmAuCisgICA6YzpmdW5jOmBQeVN0cmluZ19Bc1N0cmluZ2AgcmV0dXJucyAqTlVMTCogYW5kIHJhaXNlcyA6ZXhjOmBUeXBlRXJyb3JgLgogCiAKLS4uIGNmdW5jdGlvbjo6IGNoYXIqIFB5U3RyaW5nX0FTX1NUUklORyhQeU9iamVjdCAqc3RyaW5nKQorLi4gYzpmdW5jdGlvbjo6IGNoYXIqIFB5U3RyaW5nX0FTX1NUUklORyhQeU9iamVjdCAqc3RyaW5nKQogCi0gICBNYWNybyBmb3JtIG9mIDpjZnVuYzpgUHlTdHJpbmdfQXNTdHJpbmdgIGJ1dCB3aXRob3V0IGVycm9yIGNoZWNraW5nLiAgT25seQorICAgTWFjcm8gZm9ybSBvZiA6YzpmdW5jOmBQeVN0cmluZ19Bc1N0cmluZ2AgYnV0IHdpdGhvdXQgZXJyb3IgY2hlY2tpbmcuICBPbmx5CiAgICBzdHJpbmcgb2JqZWN0cyBhcmUgc3VwcG9ydGVkOyBubyBVbmljb2RlIG9iamVjdHMgc2hvdWxkIGJlIHBhc3NlZC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKFB5T2JqZWN0ICpvYmosIGNoYXIgKipidWZmZXIsIFB5X3NzaXplX3QgKmxlbmd0aCkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKFB5T2JqZWN0ICpvYmosIGNoYXIgKipidWZmZXIsIFB5X3NzaXplX3QgKmxlbmd0aCkKIAogICAgUmV0dXJuIGEgTlVMLXRlcm1pbmF0ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgKm9iaioKICAgIHRocm91Z2ggdGhlIG91dHB1dCB2YXJpYWJsZXMgKmJ1ZmZlciogYW5kICpsZW5ndGgqLgpAQCAtMjAwLDE0ICsyMDAsMTQgQEAKICAgIGBgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2l6ZSlgYC4gIEl0IG11c3Qgbm90IGJlIGRlYWxsb2NhdGVkLiAgSWYKICAgICpzdHJpbmcqIGlzIGEgVW5pY29kZSBvYmplY3QsIHRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGRlZmF1bHQgZW5jb2Rpbmcgb2YKICAgICpzdHJpbmcqIGFuZCBvcGVyYXRlcyBvbiB0aGF0LiAgSWYgKnN0cmluZyogaXMgbm90IGEgc3RyaW5nIG9iamVjdCBhdCBhbGwsCi0gICA6Y2Z1bmM6YFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZWAgcmV0dXJucyBgYC0xYGAgYW5kIHJhaXNlcyA6ZXhjOmBUeXBlRXJyb3JgLgorICAgOmM6ZnVuYzpgUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplYCByZXR1cm5zIGBgLTFgYCBhbmQgcmFpc2VzIDpleGM6YFR5cGVFcnJvcmAuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnQgKmAgdHlwZSBmb3IgKmxlbmd0aCouIFRoaXMgbWlnaHQKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnQgKmAgdHlwZSBmb3IgKmxlbmd0aCouIFRoaXMgbWlnaHQKICAgICAgIHJlcXVpcmUgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBQeVN0cmluZ19Db25jYXQoUHlPYmplY3QgKipzdHJpbmcsIFB5T2JqZWN0ICpuZXdwYXJ0KQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlTdHJpbmdfQ29uY2F0KFB5T2JqZWN0ICoqc3RyaW5nLCBQeU9iamVjdCAqbmV3cGFydCkKIAogICAgQ3JlYXRlIGEgbmV3IHN0cmluZyBvYmplY3QgaW4gKlwqc3RyaW5nKiBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiAqbmV3cGFydCoKICAgIGFwcGVuZGVkIHRvICpzdHJpbmcqOyB0aGUgY2FsbGVyIHdpbGwgb3duIHRoZSBuZXcgcmVmZXJlbmNlLiAgVGhlIHJlZmVyZW5jZSB0bwpAQCAtMjE2LDEzICsyMTYsMTMgQEAKICAgICpcKnN0cmluZyogd2lsbCBiZSBzZXQgdG8gKk5VTEwqOyB0aGUgYXBwcm9wcmlhdGUgZXhjZXB0aW9uIHdpbGwgYmUgc2V0LgogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKFB5T2JqZWN0ICoqc3RyaW5nLCBQeU9iamVjdCAqbmV3cGFydCkKKy4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5U3RyaW5nX0NvbmNhdEFuZERlbChQeU9iamVjdCAqKnN0cmluZywgUHlPYmplY3QgKm5ld3BhcnQpCiAKICAgIENyZWF0ZSBhIG5ldyBzdHJpbmcgb2JqZWN0IGluICpcKnN0cmluZyogY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgKm5ld3BhcnQqCiAgICBhcHBlbmRlZCB0byAqc3RyaW5nKi4gIFRoaXMgdmVyc2lvbiBkZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgKm5ld3BhcnQqLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBfUHlTdHJpbmdfUmVzaXplKFB5T2JqZWN0ICoqc3RyaW5nLCBQeV9zc2l6ZV90IG5ld3NpemUpCisuLiBjOmZ1bmN0aW9uOjogaW50IF9QeVN0cmluZ19SZXNpemUoUHlPYmplY3QgKipzdHJpbmcsIFB5X3NzaXplX3QgbmV3c2l6ZSkKIAogICAgQSB3YXkgdG8gcmVzaXplIGEgc3RyaW5nIG9iamVjdCBldmVuIHRob3VnaCBpdCBpcyAiaW1tdXRhYmxlIi4gT25seSB1c2UgdGhpcyB0bwogICAgYnVpbGQgdXAgYSBicmFuZCBuZXcgc3RyaW5nIG9iamVjdDsgZG9uJ3QgdXNlIHRoaXMgaWYgdGhlIHN0cmluZyBtYXkgYWxyZWFkeSBiZQpAQCAtMjM1LDE2ICsyMzUsMTYgQEAKICAgIHNldCB0byAqTlVMTCosIGEgbWVtb3J5IGV4Y2VwdGlvbiBpcyBzZXQsIGFuZCBgYC0xYGAgaXMgcmV0dXJuZWQuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUgZm9yICpuZXdzaXplKi4gVGhpcyBtaWdodAorICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjOnR5cGU6YGludGAgdHlwZSBmb3IgKm5ld3NpemUqLiBUaGlzIG1pZ2h0CiAgICAgICByZXF1aXJlIGNoYW5nZXMgaW4geW91ciBjb2RlIGZvciBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlTdHJpbmdfRm9ybWF0KFB5T2JqZWN0ICpmb3JtYXQsIFB5T2JqZWN0ICphcmdzKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVN0cmluZ19Gb3JtYXQoUHlPYmplY3QgKmZvcm1hdCwgUHlPYmplY3QgKmFyZ3MpCiAKICAgIFJldHVybiBhIG5ldyBzdHJpbmcgb2JqZWN0IGZyb20gKmZvcm1hdCogYW5kICphcmdzKi4gQW5hbG9nb3VzIHRvIGBgZm9ybWF0ICUKLSAgIGFyZ3NgYC4gIFRoZSAqYXJncyogYXJndW1lbnQgbXVzdCBiZSBhIHR1cGxlLgorICAgYXJnc2BgLiAgVGhlICphcmdzKiBhcmd1bWVudCBtdXN0IGJlIGEgdHVwbGUgb3IgZGljdC4KIAogCi0uLiBjZnVuY3Rpb246OiB2b2lkIFB5U3RyaW5nX0ludGVybkluUGxhY2UoUHlPYmplY3QgKipzdHJpbmcpCisuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeVN0cmluZ19JbnRlcm5JblBsYWNlKFB5T2JqZWN0ICoqc3RyaW5nKQogCiAgICBJbnRlcm4gdGhlIGFyZ3VtZW50ICpcKnN0cmluZyogaW4gcGxhY2UuICBUaGUgYXJndW1lbnQgbXVzdCBiZSB0aGUgYWRkcmVzcyBvZiBhCiAgICBwb2ludGVyIHZhcmlhYmxlIHBvaW50aW5nIHRvIGEgUHl0aG9uIHN0cmluZyBvYmplY3QuICBJZiB0aGVyZSBpcyBhbiBleGlzdGluZwpAQCAtMjYxLDEwICsyNjEsMTAgQEAKICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IGF2YWlsYWJsZSBpbiAzLnggYW5kIGRvZXMgbm90IGhhdmUgYSBQeUJ5dGVzIGFsaWFzLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKGNvbnN0IGNoYXIgKnYpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoY29uc3QgY2hhciAqdikKIAotICAgQSBjb21iaW5hdGlvbiBvZiA6Y2Z1bmM6YFB5U3RyaW5nX0Zyb21TdHJpbmdgIGFuZAotICAgOmNmdW5jOmBQeVN0cmluZ19JbnRlcm5JblBsYWNlYCwgcmV0dXJuaW5nIGVpdGhlciBhIG5ldyBzdHJpbmcgb2JqZWN0IHRoYXQgaGFzCisgICBBIGNvbWJpbmF0aW9uIG9mIDpjOmZ1bmM6YFB5U3RyaW5nX0Zyb21TdHJpbmdgIGFuZAorICAgOmM6ZnVuYzpgUHlTdHJpbmdfSW50ZXJuSW5QbGFjZWAsIHJldHVybmluZyBlaXRoZXIgYSBuZXcgc3RyaW5nIG9iamVjdCB0aGF0IGhhcwogICAgYmVlbiBpbnRlcm5lZCwgb3IgYSBuZXcgKCJvd25lZCIpIHJlZmVyZW5jZSB0byBhbiBlYXJsaWVyIGludGVybmVkIHN0cmluZyBvYmplY3QKICAgIHdpdGggdGhlIHNhbWUgdmFsdWUuCiAKQEAgLTI3Myw3ICsyNzMsNyBAQAogICAgICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgYXZhaWxhYmxlIGluIDMueCBhbmQgZG9lcyBub3QgaGF2ZSBhIFB5Qnl0ZXMgYWxpYXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5U3RyaW5nX0RlY29kZShjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmVuY29kaW5nLCBjb25zdCBjaGFyICplcnJvcnMpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5U3RyaW5nX0RlY29kZShjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmVuY29kaW5nLCBjb25zdCBjaGFyICplcnJvcnMpCiAKICAgIENyZWF0ZSBhbiBvYmplY3QgYnkgZGVjb2RpbmcgKnNpemUqIGJ5dGVzIG9mIHRoZSBlbmNvZGVkIGJ1ZmZlciAqcyogdXNpbmcgdGhlCiAgICBjb2RlYyByZWdpc3RlcmVkIGZvciAqZW5jb2RpbmcqLiAgKmVuY29kaW5nKiBhbmQgKmVycm9ycyogaGF2ZSB0aGUgc2FtZSBtZWFuaW5nCkBAIC0yODYsMTEgKzI4NiwxMSBAQAogICAgICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgYXZhaWxhYmxlIGluIDMueCBhbmQgZG9lcyBub3QgaGF2ZSBhIFB5Qnl0ZXMgYWxpYXMuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUgZm9yICpzaXplKi4gVGhpcyBtaWdodCByZXF1aXJlCisgICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmM6dHlwZTpgaW50YCB0eXBlIGZvciAqc2l6ZSouIFRoaXMgbWlnaHQgcmVxdWlyZQogICAgICAgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5U3RyaW5nX0FzRGVjb2RlZE9iamVjdChQeU9iamVjdCAqc3RyLCBjb25zdCBjaGFyICplbmNvZGluZywgY29uc3QgY2hhciAqZXJyb3JzKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVN0cmluZ19Bc0RlY29kZWRPYmplY3QoUHlPYmplY3QgKnN0ciwgY29uc3QgY2hhciAqZW5jb2RpbmcsIGNvbnN0IGNoYXIgKmVycm9ycykKIAogICAgRGVjb2RlIGEgc3RyaW5nIG9iamVjdCBieSBwYXNzaW5nIGl0IHRvIHRoZSBjb2RlYyByZWdpc3RlcmVkIGZvciAqZW5jb2RpbmcqIGFuZAogICAgcmV0dXJuIHRoZSByZXN1bHQgYXMgUHl0aG9uIG9iamVjdC4gKmVuY29kaW5nKiBhbmQgKmVycm9ycyogaGF2ZSB0aGUgc2FtZQpAQCAtMzAzLDkgKzMwMyw5IEBACiAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBhdmFpbGFibGUgaW4gMy54IGFuZCBkb2VzIG5vdCBoYXZlIGEgUHlCeXRlcyBhbGlhcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlTdHJpbmdfRW5jb2RlKGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZW5jb2RpbmcsIGNvbnN0IGNoYXIgKmVycm9ycykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlTdHJpbmdfRW5jb2RlKGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZW5jb2RpbmcsIGNvbnN0IGNoYXIgKmVycm9ycykKIAotICAgRW5jb2RlIHRoZSA6Y3R5cGU6YGNoYXJgIGJ1ZmZlciBvZiB0aGUgZ2l2ZW4gc2l6ZSBieSBwYXNzaW5nIGl0IHRvIHRoZSBjb2RlYworICAgRW5jb2RlIHRoZSA6Yzp0eXBlOmBjaGFyYCBidWZmZXIgb2YgdGhlIGdpdmVuIHNpemUgYnkgcGFzc2luZyBpdCB0byB0aGUgY29kZWMKICAgIHJlZ2lzdGVyZWQgZm9yICplbmNvZGluZyogYW5kIHJldHVybiBhIFB5dGhvbiBvYmplY3QuICplbmNvZGluZyogYW5kICplcnJvcnMqCiAgICBoYXZlIHRoZSBzYW1lIG1lYW5pbmcgYXMgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc3RyaW5nCiAgICA6bWV0aDpgZW5jb2RlYCBtZXRob2QuIFRoZSBjb2RlYyB0byBiZSB1c2VkIGlzIGxvb2tlZCB1cCB1c2luZyB0aGUgUHl0aG9uIGNvZGVjCkBAIC0zMTYsMTEgKzMxNiwxMSBAQAogICAgICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgYXZhaWxhYmxlIGluIDMueCBhbmQgZG9lcyBub3QgaGF2ZSBhIFB5Qnl0ZXMgYWxpYXMuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUgZm9yICpzaXplKi4gVGhpcyBtaWdodCByZXF1aXJlCisgICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmM6dHlwZTpgaW50YCB0eXBlIGZvciAqc2l6ZSouIFRoaXMgbWlnaHQgcmVxdWlyZQogICAgICAgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5U3RyaW5nX0FzRW5jb2RlZE9iamVjdChQeU9iamVjdCAqc3RyLCBjb25zdCBjaGFyICplbmNvZGluZywgY29uc3QgY2hhciAqZXJyb3JzKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVN0cmluZ19Bc0VuY29kZWRPYmplY3QoUHlPYmplY3QgKnN0ciwgY29uc3QgY2hhciAqZW5jb2RpbmcsIGNvbnN0IGNoYXIgKmVycm9ycykKIAogICAgRW5jb2RlIGEgc3RyaW5nIG9iamVjdCB1c2luZyB0aGUgY29kZWMgcmVnaXN0ZXJlZCBmb3IgKmVuY29kaW5nKiBhbmQgcmV0dXJuIHRoZQogICAgcmVzdWx0IGFzIFB5dGhvbiBvYmplY3QuICplbmNvZGluZyogYW5kICplcnJvcnMqIGhhdmUgdGhlIHNhbWUgbWVhbmluZyBhcyB0aGUKZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9zdHJ1Y3R1cmVzLnJzdCBiL0RvYy9jLWFwaS9zdHJ1Y3R1cmVzLnJzdAppbmRleCA1YmU4OGFjLi5lMzE2ODdmIDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvc3RydWN0dXJlcy5yc3QKKysrIGIvRG9jL2MtYXBpL3N0cnVjdHVyZXMucnN0CkBAIC0xMSwxMiArMTEsMTIgQEAKIAogQWxsIFB5dGhvbiBvYmplY3RzIHVsdGltYXRlbHkgc2hhcmUgYSBzbWFsbCBudW1iZXIgb2YgZmllbGRzIGF0IHRoZSBiZWdpbm5pbmcKIG9mIHRoZSBvYmplY3QncyByZXByZXNlbnRhdGlvbiBpbiBtZW1vcnkuICBUaGVzZSBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlCi06Y3R5cGU6YFB5T2JqZWN0YCBhbmQgOmN0eXBlOmBQeVZhck9iamVjdGAgdHlwZXMsIHdoaWNoIGFyZSBkZWZpbmVkLCBpbiB0dXJuLAorOmM6dHlwZTpgUHlPYmplY3RgIGFuZCA6Yzp0eXBlOmBQeVZhck9iamVjdGAgdHlwZXMsIHdoaWNoIGFyZSBkZWZpbmVkLCBpbiB0dXJuLAogYnkgdGhlIGV4cGFuc2lvbnMgb2Ygc29tZSBtYWNyb3MgYWxzbyB1c2VkLCB3aGV0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIGluCiB0aGUgZGVmaW5pdGlvbiBvZiBhbGwgb3RoZXIgUHl0aG9uIG9iamVjdHMuCiAKIAotLi4gY3R5cGU6OiBQeU9iamVjdAorLi4gYzp0eXBlOjogUHlPYmplY3QKIAogICAgQWxsIG9iamVjdCB0eXBlcyBhcmUgZXh0ZW5zaW9ucyBvZiB0aGlzIHR5cGUuICBUaGlzIGlzIGEgdHlwZSB3aGljaAogICAgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIFB5dGhvbiBuZWVkcyB0byB0cmVhdCBhIHBvaW50ZXIgdG8gYW4gb2JqZWN0IGFzIGFuCkBAIC0yNiw3OSArMjYsNzkgQEAKICAgIG1hY3JvLgogCiAKLS4uIGN0eXBlOjogUHlWYXJPYmplY3QKKy4uIGM6dHlwZTo6IFB5VmFyT2JqZWN0CiAKLSAgIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIG9mIDpjdHlwZTpgUHlPYmplY3RgIHRoYXQgYWRkcyB0aGUgOmF0dHI6YG9iX3NpemVgCisgICBUaGlzIGlzIGFuIGV4dGVuc2lvbiBvZiA6Yzp0eXBlOmBQeU9iamVjdGAgdGhhdCBhZGRzIHRoZSA6YXR0cjpgb2Jfc2l6ZWAKICAgIGZpZWxkLiAgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIG9iamVjdHMgdGhhdCBoYXZlIHNvbWUgbm90aW9uIG9mICpsZW5ndGgqLgogICAgVGhpcyB0eXBlIGRvZXMgbm90IG9mdGVuIGFwcGVhciBpbiB0aGUgUHl0aG9uL0MgQVBJLiAgSXQgY29ycmVzcG9uZHMgdG8gdGhlCiAgICBmaWVsZHMgZGVmaW5lZCBieSB0aGUgZXhwYW5zaW9uIG9mIHRoZSBgYFB5T2JqZWN0X1ZBUl9IRUFEYGAgbWFjcm8uCiAKLVRoZXNlIG1hY3JvcyBhcmUgdXNlZCBpbiB0aGUgZGVmaW5pdGlvbiBvZiA6Y3R5cGU6YFB5T2JqZWN0YCBhbmQKLTpjdHlwZTpgUHlWYXJPYmplY3RgOgorVGhlc2UgbWFjcm9zIGFyZSB1c2VkIGluIHRoZSBkZWZpbml0aW9uIG9mIDpjOnR5cGU6YFB5T2JqZWN0YCBhbmQKKzpjOnR5cGU6YFB5VmFyT2JqZWN0YDoKIAogCi0uLiBjbWFjcm86OiBQeU9iamVjdF9IRUFECisuLiBjOm1hY3JvOjogUHlPYmplY3RfSEVBRAogCiAgICBUaGlzIGlzIGEgbWFjcm8gd2hpY2ggZXhwYW5kcyB0byB0aGUgZGVjbGFyYXRpb25zIG9mIHRoZSBmaWVsZHMgb2YgdGhlCi0gICA6Y3R5cGU6YFB5T2JqZWN0YCB0eXBlOyBpdCBpcyB1c2VkIHdoZW4gZGVjbGFyaW5nIG5ldyB0eXBlcyB3aGljaCByZXByZXNlbnQKKyAgIDpjOnR5cGU6YFB5T2JqZWN0YCB0eXBlOyBpdCBpcyB1c2VkIHdoZW4gZGVjbGFyaW5nIG5ldyB0eXBlcyB3aGljaCByZXByZXNlbnQKICAgIG9iamVjdHMgd2l0aG91dCBhIHZhcnlpbmcgbGVuZ3RoLiAgVGhlIHNwZWNpZmljIGZpZWxkcyBpdCBleHBhbmRzIHRvIGRlcGVuZAotICAgb24gdGhlIGRlZmluaXRpb24gb2YgOmNtYWNybzpgUHlfVFJBQ0VfUkVGU2AuICBCeSBkZWZhdWx0LCB0aGF0IG1hY3JvIGlzCi0gICBub3QgZGVmaW5lZCwgYW5kIDpjbWFjcm86YFB5T2JqZWN0X0hFQURgIGV4cGFuZHMgdG86OgorICAgb24gdGhlIGRlZmluaXRpb24gb2YgOmM6bWFjcm86YFB5X1RSQUNFX1JFRlNgLiAgQnkgZGVmYXVsdCwgdGhhdCBtYWNybyBpcworICAgbm90IGRlZmluZWQsIGFuZCA6YzptYWNybzpgUHlPYmplY3RfSEVBRGAgZXhwYW5kcyB0bzo6CiAKICAgICAgIFB5X3NzaXplX3Qgb2JfcmVmY250OwogICAgICAgUHlUeXBlT2JqZWN0ICpvYl90eXBlOwogCi0gICBXaGVuIDpjbWFjcm86YFB5X1RSQUNFX1JFRlNgIGlzIGRlZmluZWQsIGl0IGV4cGFuZHMgdG86OgorICAgV2hlbiA6YzptYWNybzpgUHlfVFJBQ0VfUkVGU2AgaXMgZGVmaW5lZCwgaXQgZXhwYW5kcyB0bzo6CiAKICAgICAgIFB5T2JqZWN0ICpfb2JfbmV4dCwgKl9vYl9wcmV2OwogICAgICAgUHlfc3NpemVfdCBvYl9yZWZjbnQ7CiAgICAgICBQeVR5cGVPYmplY3QgKm9iX3R5cGU7CiAKIAotLi4gY21hY3JvOjogUHlPYmplY3RfVkFSX0hFQUQKKy4uIGM6bWFjcm86OiBQeU9iamVjdF9WQVJfSEVBRAogCiAgICBUaGlzIGlzIGEgbWFjcm8gd2hpY2ggZXhwYW5kcyB0byB0aGUgZGVjbGFyYXRpb25zIG9mIHRoZSBmaWVsZHMgb2YgdGhlCi0gICA6Y3R5cGU6YFB5VmFyT2JqZWN0YCB0eXBlOyBpdCBpcyB1c2VkIHdoZW4gZGVjbGFyaW5nIG5ldyB0eXBlcyB3aGljaAorICAgOmM6dHlwZTpgUHlWYXJPYmplY3RgIHR5cGU7IGl0IGlzIHVzZWQgd2hlbiBkZWNsYXJpbmcgbmV3IHR5cGVzIHdoaWNoCiAgICByZXByZXNlbnQgb2JqZWN0cyB3aXRoIGEgbGVuZ3RoIHRoYXQgdmFyaWVzIGZyb20gaW5zdGFuY2UgdG8gaW5zdGFuY2UuCiAgICBUaGlzIG1hY3JvIGFsd2F5cyBleHBhbmRzIHRvOjoKIAogICAgICAgUHlPYmplY3RfSEVBRAogICAgICAgUHlfc3NpemVfdCBvYl9zaXplOwogCi0gICBOb3RlIHRoYXQgOmNtYWNybzpgUHlPYmplY3RfSEVBRGAgaXMgcGFydCBvZiB0aGUgZXhwYW5zaW9uLCBhbmQgdGhhdCBpdHMgb3duCi0gICBleHBhbnNpb24gdmFyaWVzIGRlcGVuZGluZyBvbiB0aGUgZGVmaW5pdGlvbiBvZiA6Y21hY3JvOmBQeV9UUkFDRV9SRUZTYC4KKyAgIE5vdGUgdGhhdCA6YzptYWNybzpgUHlPYmplY3RfSEVBRGAgaXMgcGFydCBvZiB0aGUgZXhwYW5zaW9uLCBhbmQgdGhhdCBpdHMgb3duCisgICBleHBhbnNpb24gdmFyaWVzIGRlcGVuZGluZyBvbiB0aGUgZGVmaW5pdGlvbiBvZiA6YzptYWNybzpgUHlfVFJBQ0VfUkVGU2AuCiAKIAotLi4gY21hY3JvOjogUHlPYmplY3RfSEVBRF9JTklUKHR5cGUpCisuLiBjOm1hY3JvOjogUHlPYmplY3RfSEVBRF9JTklUKHR5cGUpCiAKICAgIFRoaXMgaXMgYSBtYWNybyB3aGljaCBleHBhbmRzIHRvIGluaXRpYWxpemF0aW9uIHZhbHVlcyBmb3IgYSBuZXcKLSAgIDpjdHlwZTpgUHlPYmplY3RgIHR5cGUuICBUaGlzIG1hY3JvIGV4cGFuZHMgdG86OgorICAgOmM6dHlwZTpgUHlPYmplY3RgIHR5cGUuICBUaGlzIG1hY3JvIGV4cGFuZHMgdG86OgogCiAgICAgICBfUHlPYmplY3RfRVhUUkFfSU5JVAogICAgICAgMSwgdHlwZSwKIAogCi0uLiBjbWFjcm86OiBQeVZhck9iamVjdF9IRUFEX0lOSVQodHlwZSwgc2l6ZSkKKy4uIGM6bWFjcm86OiBQeVZhck9iamVjdF9IRUFEX0lOSVQodHlwZSwgc2l6ZSkKIAogICAgVGhpcyBpcyBhIG1hY3JvIHdoaWNoIGV4cGFuZHMgdG8gaW5pdGlhbGl6YXRpb24gdmFsdWVzIGZvciBhIG5ldwotICAgOmN0eXBlOmBQeVZhck9iamVjdGAgdHlwZSwgaW5jbHVkaW5nIHRoZSA6YXR0cjpgb2Jfc2l6ZWAgZmllbGQuCisgICA6Yzp0eXBlOmBQeVZhck9iamVjdGAgdHlwZSwgaW5jbHVkaW5nIHRoZSA6YXR0cjpgb2Jfc2l6ZWAgZmllbGQuCiAgICBUaGlzIG1hY3JvIGV4cGFuZHMgdG86OgogCiAgICAgICBfUHlPYmplY3RfRVhUUkFfSU5JVAogICAgICAgMSwgdHlwZSwgc2l6ZSwKIAogCi0uLiBjdHlwZTo6IFB5Q0Z1bmN0aW9uCisuLiBjOnR5cGU6OiBQeUNGdW5jdGlvbgogCiAgICBUeXBlIG9mIHRoZSBmdW5jdGlvbnMgdXNlZCB0byBpbXBsZW1lbnQgbW9zdCBQeXRob24gY2FsbGFibGVzIGluIEMuCi0gICBGdW5jdGlvbnMgb2YgdGhpcyB0eXBlIHRha2UgdHdvIDpjdHlwZTpgUHlPYmplY3RcKmAgcGFyYW1ldGVycyBhbmQgcmV0dXJuCisgICBGdW5jdGlvbnMgb2YgdGhpcyB0eXBlIHRha2UgdHdvIDpjOnR5cGU6YFB5T2JqZWN0XCpgIHBhcmFtZXRlcnMgYW5kIHJldHVybgogICAgb25lIHN1Y2ggdmFsdWUuICBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzICpOVUxMKiwgYW4gZXhjZXB0aW9uIHNoYWxsIGhhdmUKICAgIGJlZW4gc2V0LiAgSWYgbm90ICpOVUxMKiwgdGhlIHJldHVybiB2YWx1ZSBpcyBpbnRlcnByZXRlZCBhcyB0aGUgcmV0dXJuCiAgICB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gYXMgZXhwb3NlZCBpbiBQeXRob24uICBUaGUgZnVuY3Rpb24gbXVzdCByZXR1cm4gYSBuZXcKICAgIHJlZmVyZW5jZS4KIAogCi0uLiBjdHlwZTo6IFB5TWV0aG9kRGVmCisuLiBjOnR5cGU6OiBQeU1ldGhvZERlZgogCiAgICBTdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSBhIG1ldGhvZCBvZiBhbiBleHRlbnNpb24gdHlwZS4gIFRoaXMgc3RydWN0dXJlIGhhcwogICAgZm91ciBmaWVsZHM6CkBAIC0xMTksMTAgKzExOSwxMCBAQAogICAgKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAKIFRoZSA6YXR0cjpgbWxfbWV0aGAgaXMgYSBDIGZ1bmN0aW9uIHBvaW50ZXIuICBUaGUgZnVuY3Rpb25zIG1heSBiZSBvZiBkaWZmZXJlbnQKLXR5cGVzLCBidXQgdGhleSBhbHdheXMgcmV0dXJuIDpjdHlwZTpgUHlPYmplY3RcKmAuICBJZiB0aGUgZnVuY3Rpb24gaXMgbm90IG9mCi10aGUgOmN0eXBlOmBQeUNGdW5jdGlvbmAsIHRoZSBjb21waWxlciB3aWxsIHJlcXVpcmUgYSBjYXN0IGluIHRoZSBtZXRob2QgdGFibGUuCi1FdmVuIHRob3VnaCA6Y3R5cGU6YFB5Q0Z1bmN0aW9uYCBkZWZpbmVzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgYXMKLTpjdHlwZTpgUHlPYmplY3RcKmAsIGl0IGlzIGNvbW1vbiB0aGF0IHRoZSBtZXRob2QgaW1wbGVtZW50YXRpb24gdXNlcyBhIHRoZQordHlwZXMsIGJ1dCB0aGV5IGFsd2F5cyByZXR1cm4gOmM6dHlwZTpgUHlPYmplY3RcKmAuICBJZiB0aGUgZnVuY3Rpb24gaXMgbm90IG9mCit0aGUgOmM6dHlwZTpgUHlDRnVuY3Rpb25gLCB0aGUgY29tcGlsZXIgd2lsbCByZXF1aXJlIGEgY2FzdCBpbiB0aGUgbWV0aG9kIHRhYmxlLgorRXZlbiB0aG91Z2ggOmM6dHlwZTpgUHlDRnVuY3Rpb25gIGRlZmluZXMgdGhlIGZpcnN0IHBhcmFtZXRlciBhcworOmM6dHlwZTpgUHlPYmplY3RcKmAsIGl0IGlzIGNvbW1vbiB0aGF0IHRoZSBtZXRob2QgaW1wbGVtZW50YXRpb24gdXNlcyBhIHRoZQogc3BlY2lmaWMgQyB0eXBlIG9mIHRoZSAqc2VsZiogb2JqZWN0LgogCiBUaGUgOmF0dHI6YG1sX2ZsYWdzYCBmaWVsZCBpcyBhIGJpdGZpZWxkIHdoaWNoIGNhbiBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgZmxhZ3MuCkBAIC0xMzYsMjcgKzEzNiwyNyBAQAogLi4gZGF0YTo6IE1FVEhfVkFSQVJHUwogCiAgICBUaGlzIGlzIHRoZSB0eXBpY2FsIGNhbGxpbmcgY29udmVudGlvbiwgd2hlcmUgdGhlIG1ldGhvZHMgaGF2ZSB0aGUgdHlwZQotICAgOmN0eXBlOmBQeUNGdW5jdGlvbmAuIFRoZSBmdW5jdGlvbiBleHBlY3RzIHR3byA6Y3R5cGU6YFB5T2JqZWN0XCpgIHZhbHVlcy4KKyAgIDpjOnR5cGU6YFB5Q0Z1bmN0aW9uYC4gVGhlIGZ1bmN0aW9uIGV4cGVjdHMgdHdvIDpjOnR5cGU6YFB5T2JqZWN0XCpgIHZhbHVlcy4KICAgIFRoZSBmaXJzdCBvbmUgaXMgdGhlICpzZWxmKiBvYmplY3QgZm9yIG1ldGhvZHM7IGZvciBtb2R1bGUgZnVuY3Rpb25zLCBpdCBpcwogICAgdGhlIG1vZHVsZSBvYmplY3QuICBUaGUgc2Vjb25kIHBhcmFtZXRlciAob2Z0ZW4gY2FsbGVkICphcmdzKikgaXMgYSB0dXBsZQogICAgb2JqZWN0IHJlcHJlc2VudGluZyBhbGwgYXJndW1lbnRzLiAgVGhpcyBwYXJhbWV0ZXIgaXMgdHlwaWNhbGx5IHByb2Nlc3NlZAotICAgdXNpbmcgOmNmdW5jOmBQeUFyZ19QYXJzZVR1cGxlYCBvciA6Y2Z1bmM6YFB5QXJnX1VucGFja1R1cGxlYC4KKyAgIHVzaW5nIDpjOmZ1bmM6YFB5QXJnX1BhcnNlVHVwbGVgIG9yIDpjOmZ1bmM6YFB5QXJnX1VucGFja1R1cGxlYC4KIAogCiAuLiBkYXRhOjogTUVUSF9LRVlXT1JEUwogCi0gICBNZXRob2RzIHdpdGggdGhlc2UgZmxhZ3MgbXVzdCBiZSBvZiB0eXBlIDpjdHlwZTpgUHlDRnVuY3Rpb25XaXRoS2V5d29yZHNgLgorICAgTWV0aG9kcyB3aXRoIHRoZXNlIGZsYWdzIG11c3QgYmUgb2YgdHlwZSA6Yzp0eXBlOmBQeUNGdW5jdGlvbldpdGhLZXl3b3Jkc2AuCiAgICBUaGUgZnVuY3Rpb24gZXhwZWN0cyB0aHJlZSBwYXJhbWV0ZXJzOiAqc2VsZiosICphcmdzKiwgYW5kIGEgZGljdGlvbmFyeSBvZgogICAgYWxsIHRoZSBrZXl3b3JkIGFyZ3VtZW50cy4gIFRoZSBmbGFnIGlzIHR5cGljYWxseSBjb21iaW5lZCB3aXRoCiAgICA6Y29uc3Q6YE1FVEhfVkFSQVJHU2AsIGFuZCB0aGUgcGFyYW1ldGVycyBhcmUgdHlwaWNhbGx5IHByb2Nlc3NlZCB1c2luZwotICAgOmNmdW5jOmBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNgLgorICAgOmM6ZnVuYzpgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzYC4KIAogCiAuLiBkYXRhOjogTUVUSF9OT0FSR1MKIAogICAgTWV0aG9kcyB3aXRob3V0IHBhcmFtZXRlcnMgZG9uJ3QgbmVlZCB0byBjaGVjayB3aGV0aGVyIGFyZ3VtZW50cyBhcmUgZ2l2ZW4gaWYKICAgIHRoZXkgYXJlIGxpc3RlZCB3aXRoIHRoZSA6Y29uc3Q6YE1FVEhfTk9BUkdTYCBmbGFnLiAgVGhleSBuZWVkIHRvIGJlIG9mIHR5cGUKLSAgIDpjdHlwZTpgUHlDRnVuY3Rpb25gLiAgVGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0eXBpY2FsbHkgbmFtZWQgYGBzZWxmYGAgYW5kCisgICA6Yzp0eXBlOmBQeUNGdW5jdGlvbmAuICBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIHR5cGljYWxseSBuYW1lZCBgYHNlbGZgYCBhbmQKICAgIHdpbGwgaG9sZCBhIHJlZmVyZW5jZSB0byB0aGUgbW9kdWxlIG9yIG9iamVjdCBpbnN0YW5jZS4gIEluIGFsbCBjYXNlcyB0aGUKICAgIHNlY29uZCBwYXJhbWV0ZXIgd2lsbCBiZSAqTlVMTCouCiAKQEAgLTE2NCwxNSArMTY0LDE1IEBACiAuLiBkYXRhOjogTUVUSF9PCiAKICAgIE1ldGhvZHMgd2l0aCBhIHNpbmdsZSBvYmplY3QgYXJndW1lbnQgY2FuIGJlIGxpc3RlZCB3aXRoIHRoZSA6Y29uc3Q6YE1FVEhfT2AKLSAgIGZsYWcsIGluc3RlYWQgb2YgaW52b2tpbmcgOmNmdW5jOmBQeUFyZ19QYXJzZVR1cGxlYCB3aXRoIGEgYGAiTyJgYCBhcmd1bWVudC4KLSAgIFRoZXkgaGF2ZSB0aGUgdHlwZSA6Y3R5cGU6YFB5Q0Z1bmN0aW9uYCwgd2l0aCB0aGUgKnNlbGYqIHBhcmFtZXRlciwgYW5kIGEKLSAgIDpjdHlwZTpgUHlPYmplY3RcKmAgcGFyYW1ldGVyIHJlcHJlc2VudGluZyB0aGUgc2luZ2xlIGFyZ3VtZW50LgorICAgZmxhZywgaW5zdGVhZCBvZiBpbnZva2luZyA6YzpmdW5jOmBQeUFyZ19QYXJzZVR1cGxlYCB3aXRoIGEgYGAiTyJgYCBhcmd1bWVudC4KKyAgIFRoZXkgaGF2ZSB0aGUgdHlwZSA6Yzp0eXBlOmBQeUNGdW5jdGlvbmAsIHdpdGggdGhlICpzZWxmKiBwYXJhbWV0ZXIsIGFuZCBhCisgICA6Yzp0eXBlOmBQeU9iamVjdFwqYCBwYXJhbWV0ZXIgcmVwcmVzZW50aW5nIHRoZSBzaW5nbGUgYXJndW1lbnQuCiAKIAogLi4gZGF0YTo6IE1FVEhfT0xEQVJHUwogCiAgICBUaGlzIGNhbGxpbmcgY29udmVudGlvbiBpcyBkZXByZWNhdGVkLiAgVGhlIG1ldGhvZCBtdXN0IGJlIG9mIHR5cGUKLSAgIDpjdHlwZTpgUHlDRnVuY3Rpb25gLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyAqTlVMTCogaWYgbm8gYXJndW1lbnRzIGFyZQorICAgOmM6dHlwZTpgUHlDRnVuY3Rpb25gLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyAqTlVMTCogaWYgbm8gYXJndW1lbnRzIGFyZQogICAgZ2l2ZW4sIGEgc2luZ2xlIG9iamVjdCBpZiBleGFjdGx5IG9uZSBhcmd1bWVudCBpcyBnaXZlbiwgYW5kIGEgdHVwbGUgb2YKICAgIG9iamVjdHMgaWYgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCBpcyBnaXZlbi4gIFRoZXJlIGlzIG5vIHdheSBmb3IgYSBmdW5jdGlvbgogICAgdXNpbmcgdGhpcyBjb252ZW50aW9uIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBjYWxsIHdpdGggbXVsdGlwbGUgYXJndW1lbnRzCkBAIC0yMjUsNyArMjI1LDcgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNAogCiAKLS4uIGN0eXBlOjogUHlNZW1iZXJEZWYKKy4uIGM6dHlwZTo6IFB5TWVtYmVyRGVmCiAKICAgIFN0cnVjdHVyZSB3aGljaCBkZXNjcmliZXMgYW4gYXR0cmlidXRlIG9mIGEgdHlwZSB3aGljaCBjb3JyZXNwb25kcyB0byBhIEMKICAgIHN0cnVjdCBtZW1iZXIuICBJdHMgZmllbGRzIGFyZToKQEAgLTI3NywyMiArMjc3LDIyIEBACiAgICBUX1BZU1NJWkVUICAgICAgUHlfc3NpemVfdAogICAgPT09PT09PT09PT09PT09ID09PT09PT09PT09PT09PT09PQogCi0gICA6Y21hY3JvOmBUX09CSkVDVGAgYW5kIDpjbWFjcm86YFRfT0JKRUNUX0VYYCBkaWZmZXIgaW4gdGhhdAotICAgOmNtYWNybzpgVF9PQkpFQ1RgIHJldHVybnMgYGBOb25lYGAgaWYgdGhlIG1lbWJlciBpcyAqTlVMTCogYW5kCi0gICA6Y21hY3JvOmBUX09CSkVDVF9FWGAgcmFpc2VzIGFuIDpleGM6YEF0dHJpYnV0ZUVycm9yYC4gIFRyeSB0byB1c2UKLSAgIDpjbWFjcm86YFRfT0JKRUNUX0VYYCBvdmVyIDpjbWFjcm86YFRfT0JKRUNUYCBiZWNhdXNlIDpjbWFjcm86YFRfT0JKRUNUX0VYYAorICAgOmM6bWFjcm86YFRfT0JKRUNUYCBhbmQgOmM6bWFjcm86YFRfT0JKRUNUX0VYYCBkaWZmZXIgaW4gdGhhdAorICAgOmM6bWFjcm86YFRfT0JKRUNUYCByZXR1cm5zIGBgTm9uZWBgIGlmIHRoZSBtZW1iZXIgaXMgKk5VTEwqIGFuZAorICAgOmM6bWFjcm86YFRfT0JKRUNUX0VYYCByYWlzZXMgYW4gOmV4YzpgQXR0cmlidXRlRXJyb3JgLiAgVHJ5IHRvIHVzZQorICAgOmM6bWFjcm86YFRfT0JKRUNUX0VYYCBvdmVyIDpjOm1hY3JvOmBUX09CSkVDVGAgYmVjYXVzZSA6YzptYWNybzpgVF9PQkpFQ1RfRVhgCiAgICBoYW5kbGVzIHVzZSBvZiB0aGUgOmtleXdvcmQ6YGRlbGAgc3RhdGVtZW50IG9uIHRoYXQgYXR0cmlidXRlIG1vcmUgY29ycmVjdGx5Ci0gICB0aGFuIDpjbWFjcm86YFRfT0JKRUNUYC4KKyAgIHRoYW4gOmM6bWFjcm86YFRfT0JKRUNUYC4KIAotICAgOmF0dHI6YGZsYWdzYCBjYW4gYmUgMCBmb3Igd3JpdGUgYW5kIHJlYWQgYWNjZXNzIG9yIDpjbWFjcm86YFJFQURPTkxZYCBmb3IKLSAgIHJlYWQtb25seSBhY2Nlc3MuICBVc2luZyA6Y21hY3JvOmBUX1NUUklOR2AgZm9yIDphdHRyOmB0eXBlYCBpbXBsaWVzCi0gICA6Y21hY3JvOmBSRUFET05MWWAuICBPbmx5IDpjbWFjcm86YFRfT0JKRUNUYCBhbmQgOmNtYWNybzpgVF9PQkpFQ1RfRVhgCisgICA6YXR0cjpgZmxhZ3NgIGNhbiBiZSAwIGZvciB3cml0ZSBhbmQgcmVhZCBhY2Nlc3Mgb3IgOmM6bWFjcm86YFJFQURPTkxZYCBmb3IKKyAgIHJlYWQtb25seSBhY2Nlc3MuICBVc2luZyA6YzptYWNybzpgVF9TVFJJTkdgIGZvciA6YXR0cjpgdHlwZWAgaW1wbGllcworICAgOmM6bWFjcm86YFJFQURPTkxZYC4gIE9ubHkgOmM6bWFjcm86YFRfT0JKRUNUYCBhbmQgOmM6bWFjcm86YFRfT0JKRUNUX0VYYAogICAgbWVtYmVycyBjYW4gYmUgZGVsZXRlZC4gIChUaGV5IGFyZSBzZXQgdG8gKk5VTEwqKS4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlfRmluZE1ldGhvZChQeU1ldGhvZERlZiB0YWJsZVtdLCBQeU9iamVjdCAqb2IsIGNoYXIgKm5hbWUpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5X0ZpbmRNZXRob2QoUHlNZXRob2REZWYgdGFibGVbXSwgUHlPYmplY3QgKm9iLCBjaGFyICpuYW1lKQogCiAgICBSZXR1cm4gYSBib3VuZCBtZXRob2Qgb2JqZWN0IGZvciBhbiBleHRlbnNpb24gdHlwZSBpbXBsZW1lbnRlZCBpbiBDLiAgVGhpcwotICAgY2FuIGJlIHVzZWZ1bCBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgYSA6YXR0cjpgdHBfZ2V0YXR0cm9gIG9yCi0gICA6YXR0cjpgdHBfZ2V0YXR0cmAgaGFuZGxlciB0aGF0IGRvZXMgbm90IHVzZSB0aGUKLSAgIDpjZnVuYzpgUHlPYmplY3RfR2VuZXJpY0dldEF0dHJgIGZ1bmN0aW9uLgorICAgY2FuIGJlIHVzZWZ1bCBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgYSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfZ2V0YXR0cm9gIG9yCisgICA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfZ2V0YXR0cmAgaGFuZGxlciB0aGF0IGRvZXMgbm90IHVzZSB0aGUKKyAgIDpjOmZ1bmM6YFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyYCBmdW5jdGlvbi4KZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9zeXMucnN0IGIvRG9jL2MtYXBpL3N5cy5yc3QKaW5kZXggNjc4OGJjOS4uZDM1NGU5ZiAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL3N5cy5yc3QKKysrIGIvRG9jL2MtYXBpL3N5cy5yc3QKQEAgLTYsMTYgKzYsMTYgQEAKID09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5X0ZkSXNJbnRlcmFjdGl2ZShGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5X0ZkSXNJbnRlcmFjdGl2ZShGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCiAKICAgIFJldHVybiB0cnVlIChub256ZXJvKSBpZiB0aGUgc3RhbmRhcmQgSS9PIGZpbGUgKmZwKiB3aXRoIG5hbWUgKmZpbGVuYW1lKiBpcwogICAgZGVlbWVkIGludGVyYWN0aXZlLiAgVGhpcyBpcyB0aGUgY2FzZSBmb3IgZmlsZXMgZm9yIHdoaWNoIGBgaXNhdHR5KGZpbGVubyhmcCkpYGAKLSAgIGlzIHRydWUuICBJZiB0aGUgZ2xvYmFsIGZsYWcgOmNkYXRhOmBQeV9JbnRlcmFjdGl2ZUZsYWdgIGlzIHRydWUsIHRoaXMgZnVuY3Rpb24KKyAgIGlzIHRydWUuICBJZiB0aGUgZ2xvYmFsIGZsYWcgOmM6ZGF0YTpgUHlfSW50ZXJhY3RpdmVGbGFnYCBpcyB0cnVlLCB0aGlzIGZ1bmN0aW9uCiAgICBhbHNvIHJldHVybnMgdHJ1ZSBpZiB0aGUgKmZpbGVuYW1lKiBwb2ludGVyIGlzICpOVUxMKiBvciBpZiB0aGUgbmFtZSBpcyBlcXVhbCB0bwogICAgb25lIG9mIHRoZSBzdHJpbmdzIGBgJzxzdGRpbj4nYGAgb3IgYGAnPz8/J2BgLgogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgUHlPU19BZnRlckZvcmsoKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlPU19BZnRlckZvcmsoKQogCiAgICBGdW5jdGlvbiB0byB1cGRhdGUgc29tZSBpbnRlcm5hbCBzdGF0ZSBhZnRlciBhIHByb2Nlc3MgZm9yazsgdGhpcyBzaG91bGQgYmUKICAgIGNhbGxlZCBpbiB0aGUgbmV3IHByb2Nlc3MgaWYgdGhlIFB5dGhvbiBpbnRlcnByZXRlciB3aWxsIGNvbnRpbnVlIHRvIGJlIHVzZWQuCkBAIC0yMyw3ICsyMyw3IEBACiAgICB0byBiZSBjYWxsZWQuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5T1NfQ2hlY2tTdGFjaygpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5T1NfQ2hlY2tTdGFjaygpCiAKICAgIFJldHVybiB0cnVlIHdoZW4gdGhlIGludGVycHJldGVyIHJ1bnMgb3V0IG9mIHN0YWNrIHNwYWNlLiAgVGhpcyBpcyBhIHJlbGlhYmxlCiAgICBjaGVjaywgYnV0IGlzIG9ubHkgYXZhaWxhYmxlIHdoZW4gOmNvbnN0OmBVU0VfU1RBQ0tDSEVDS2AgaXMgZGVmaW5lZCAoY3VycmVudGx5CkBAIC0zMiwyMCArMzIsMjAgQEAKICAgIG93biBjb2RlLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T1Nfc2lnaGFuZGxlcl90IFB5T1NfZ2V0c2lnKGludCBpKQorLi4gYzpmdW5jdGlvbjo6IFB5T1Nfc2lnaGFuZGxlcl90IFB5T1NfZ2V0c2lnKGludCBpKQogCiAgICBSZXR1cm4gdGhlIGN1cnJlbnQgc2lnbmFsIGhhbmRsZXIgZm9yIHNpZ25hbCAqaSouICBUaGlzIGlzIGEgdGhpbiB3cmFwcGVyIGFyb3VuZAotICAgZWl0aGVyIDpjZnVuYzpgc2lnYWN0aW9uYCBvciA6Y2Z1bmM6YHNpZ25hbGAuICBEbyBub3QgY2FsbCB0aG9zZSBmdW5jdGlvbnMKLSAgIGRpcmVjdGx5ISA6Y3R5cGU6YFB5T1Nfc2lnaGFuZGxlcl90YCBpcyBhIHR5cGVkZWYgYWxpYXMgZm9yIDpjdHlwZTpgdm9pZAorICAgZWl0aGVyIDpjOmZ1bmM6YHNpZ2FjdGlvbmAgb3IgOmM6ZnVuYzpgc2lnbmFsYC4gIERvIG5vdCBjYWxsIHRob3NlIGZ1bmN0aW9ucworICAgZGlyZWN0bHkhIDpjOnR5cGU6YFB5T1Nfc2lnaGFuZGxlcl90YCBpcyBhIHR5cGVkZWYgYWxpYXMgZm9yIDpjOnR5cGU6YHZvaWQKICAgIChcKikoaW50KWAuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPU19zaWdoYW5kbGVyX3QgUHlPU19zZXRzaWcoaW50IGksIFB5T1Nfc2lnaGFuZGxlcl90IGgpCisuLiBjOmZ1bmN0aW9uOjogUHlPU19zaWdoYW5kbGVyX3QgUHlPU19zZXRzaWcoaW50IGksIFB5T1Nfc2lnaGFuZGxlcl90IGgpCiAKICAgIFNldCB0aGUgc2lnbmFsIGhhbmRsZXIgZm9yIHNpZ25hbCAqaSogdG8gYmUgKmgqOyByZXR1cm4gdGhlIG9sZCBzaWduYWwgaGFuZGxlci4KLSAgIFRoaXMgaXMgYSB0aGluIHdyYXBwZXIgYXJvdW5kIGVpdGhlciA6Y2Z1bmM6YHNpZ2FjdGlvbmAgb3IgOmNmdW5jOmBzaWduYWxgLiAgRG8KLSAgIG5vdCBjYWxsIHRob3NlIGZ1bmN0aW9ucyBkaXJlY3RseSEgIDpjdHlwZTpgUHlPU19zaWdoYW5kbGVyX3RgIGlzIGEgdHlwZWRlZgotICAgYWxpYXMgZm9yIDpjdHlwZTpgdm9pZCAoXCopKGludClgLgorICAgVGhpcyBpcyBhIHRoaW4gd3JhcHBlciBhcm91bmQgZWl0aGVyIDpjOmZ1bmM6YHNpZ2FjdGlvbmAgb3IgOmM6ZnVuYzpgc2lnbmFsYC4gIERvCisgICBub3QgY2FsbCB0aG9zZSBmdW5jdGlvbnMgZGlyZWN0bHkhICA6Yzp0eXBlOmBQeU9TX3NpZ2hhbmRsZXJfdGAgaXMgYSB0eXBlZGVmCisgICBhbGlhcyBmb3IgOmM6dHlwZTpgdm9pZCAoXCopKGludClgLgogCiAuLiBfc3lzdGVtZnVuY3Rpb25zOgogCkBAIC01NiwzOCArNTYsMzggQEAKIGFjY2Vzc2libGUgdG8gQyBjb2RlLiAgVGhleSBhbGwgd29yayB3aXRoIHRoZSBjdXJyZW50IGludGVycHJldGVyIHRocmVhZCdzCiA6bW9kOmBzeXNgIG1vZHVsZSdzIGRpY3QsIHdoaWNoIGlzIGNvbnRhaW5lZCBpbiB0aGUgaW50ZXJuYWwgdGhyZWFkIHN0YXRlIHN0cnVjdHVyZS4KIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QgKlB5U3lzX0dldE9iamVjdChjaGFyICpuYW1lKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0ICpQeVN5c19HZXRPYmplY3QoY2hhciAqbmFtZSkKIAogICAgUmV0dXJuIHRoZSBvYmplY3QgKm5hbWUqIGZyb20gdGhlIDptb2Q6YHN5c2AgbW9kdWxlIG9yICpOVUxMKiBpZiBpdCBkb2VzCiAgICBub3QgZXhpc3QsIHdpdGhvdXQgc2V0dGluZyBhbiBleGNlcHRpb24uCiAKLS4uIGNmdW5jdGlvbjo6IEZJTEUgKlB5U3lzX0dldEZpbGUoY2hhciAqbmFtZSwgRklMRSAqZGVmKQorLi4gYzpmdW5jdGlvbjo6IEZJTEUgKlB5U3lzX0dldEZpbGUoY2hhciAqbmFtZSwgRklMRSAqZGVmKQogCi0gICBSZXR1cm4gdGhlIDpjdHlwZTpgRklMRSpgIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0ICpuYW1lKiBpbiB0aGUKKyAgIFJldHVybiB0aGUgOmM6dHlwZTpgRklMRSpgIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0ICpuYW1lKiBpbiB0aGUKICAgIDptb2Q6YHN5c2AgbW9kdWxlLCBvciAqZGVmKiBpZiAqbmFtZSogaXMgbm90IGluIHRoZSBtb2R1bGUgb3IgaXMgbm90IGFzc29jaWF0ZWQKLSAgIHdpdGggYSA6Y3R5cGU6YEZJTEUqYC4KKyAgIHdpdGggYSA6Yzp0eXBlOmBGSUxFKmAuCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeVN5c19TZXRPYmplY3QoY2hhciAqbmFtZSwgUHlPYmplY3QgKnYpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5U3lzX1NldE9iamVjdChjaGFyICpuYW1lLCBQeU9iamVjdCAqdikKIAogICAgU2V0ICpuYW1lKiBpbiB0aGUgOm1vZDpgc3lzYCBtb2R1bGUgdG8gKnYqIHVubGVzcyAqdiogaXMgKk5VTEwqLCBpbiB3aGljaAogICAgY2FzZSAqbmFtZSogaXMgZGVsZXRlZCBmcm9tIHRoZSBzeXMgbW9kdWxlLiBSZXR1cm5zIGBgMGBgIG9uIHN1Y2Nlc3MsIGBgLTFgYAogICAgb24gZXJyb3IuCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgUHlTeXNfUmVzZXRXYXJuT3B0aW9ucygpCisuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeVN5c19SZXNldFdhcm5PcHRpb25zKCkKIAogICAgUmVzZXQgOmRhdGE6YHN5cy53YXJub3B0aW9uc2AgdG8gYW4gZW1wdHkgbGlzdC4KIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBQeVN5c19BZGRXYXJuT3B0aW9uKGNoYXIgKnMpCisuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeVN5c19BZGRXYXJuT3B0aW9uKGNoYXIgKnMpCiAKICAgIEFwcGVuZCAqcyogdG8gOmRhdGE6YHN5cy53YXJub3B0aW9uc2AuCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgUHlTeXNfU2V0UGF0aChjaGFyICpwYXRoKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlTeXNfU2V0UGF0aChjaGFyICpwYXRoKQogCiAgICBTZXQgOmRhdGE6YHN5cy5wYXRoYCB0byBhIGxpc3Qgb2JqZWN0IG9mIHBhdGhzIGZvdW5kIGluICpwYXRoKiB3aGljaCBzaG91bGQKICAgIGJlIGEgbGlzdCBvZiBwYXRocyBzZXBhcmF0ZWQgd2l0aCB0aGUgcGxhdGZvcm0ncyBzZWFyY2ggcGF0aCBkZWxpbWl0ZXIKICAgIChgYDpgYCBvbiBVbml4LCBgYDtgYCBvbiBXaW5kb3dzKS4KIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBQeVN5c19Xcml0ZVN0ZG91dChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKKy4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5U3lzX1dyaXRlU3Rkb3V0KGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogCiAgICBXcml0ZSB0aGUgb3V0cHV0IHN0cmluZyBkZXNjcmliZWQgYnkgKmZvcm1hdCogdG8gOmRhdGE6YHN5cy5zdGRvdXRgLiAgTm8KICAgIGV4Y2VwdGlvbnMgYXJlIHJhaXNlZCwgZXZlbiBpZiB0cnVuY2F0aW9uIG9jY3VycyAoc2VlIGJlbG93KS4KQEAgLTEwMyw3ICsxMDMsNyBAQAogICAgSWYgYSBwcm9ibGVtIG9jY3Vycywgb3IgOmRhdGE6YHN5cy5zdGRvdXRgIGlzIHVuc2V0LCB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UKICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHJlYWwgKEMgbGV2ZWwpICpzdGRvdXQqLgogCi0uLiBjZnVuY3Rpb246OiB2b2lkIFB5U3lzX1dyaXRlU3RkZXJyKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlTeXNfV3JpdGVTdGRlcnIoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCiAKICAgIEFzIGFib3ZlLCBidXQgd3JpdGUgdG8gOmRhdGE6YHN5cy5zdGRlcnJgIG9yICpzdGRlcnIqIGluc3RlYWQuCiAKQEAgLTExNCw3ICsxMTQsNyBAQAogPT09PT09PT09PT09PT09CiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBQeV9GYXRhbEVycm9yKGNvbnN0IGNoYXIgKm1lc3NhZ2UpCisuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeV9GYXRhbEVycm9yKGNvbnN0IGNoYXIgKm1lc3NhZ2UpCiAKICAgIC4uIGluZGV4Ojogc2luZ2xlOiBhYm9ydCgpCiAKQEAgLTEyMiwzMCArMTIyLDMwIEBACiAgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGludm9rZWQgd2hlbiBhIGNvbmRpdGlvbiBpcyBkZXRlY3RlZCB0aGF0IHdvdWxkCiAgICBtYWtlIGl0IGRhbmdlcm91cyB0byBjb250aW51ZSB1c2luZyB0aGUgUHl0aG9uIGludGVycHJldGVyOyBlLmcuLCB3aGVuIHRoZQogICAgb2JqZWN0IGFkbWluaXN0cmF0aW9uIGFwcGVhcnMgdG8gYmUgY29ycnVwdGVkLiAgT24gVW5peCwgdGhlIHN0YW5kYXJkIEMgbGlicmFyeQotICAgZnVuY3Rpb24gOmNmdW5jOmBhYm9ydGAgaXMgY2FsbGVkIHdoaWNoIHdpbGwgYXR0ZW1wdCB0byBwcm9kdWNlIGEgOmZpbGU6YGNvcmVgCisgICBmdW5jdGlvbiA6YzpmdW5jOmBhYm9ydGAgaXMgY2FsbGVkIHdoaWNoIHdpbGwgYXR0ZW1wdCB0byBwcm9kdWNlIGEgOmZpbGU6YGNvcmVgCiAgICBmaWxlLgogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgUHlfRXhpdChpbnQgc3RhdHVzKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlfRXhpdChpbnQgc3RhdHVzKQogCiAgICAuLiBpbmRleDo6CiAgICAgICBzaW5nbGU6IFB5X0ZpbmFsaXplKCkKICAgICAgIHNpbmdsZTogZXhpdCgpCiAKLSAgIEV4aXQgdGhlIGN1cnJlbnQgcHJvY2Vzcy4gIFRoaXMgY2FsbHMgOmNmdW5jOmBQeV9GaW5hbGl6ZWAgYW5kIHRoZW4gY2FsbHMgdGhlCisgICBFeGl0IHRoZSBjdXJyZW50IHByb2Nlc3MuICBUaGlzIGNhbGxzIDpjOmZ1bmM6YFB5X0ZpbmFsaXplYCBhbmQgdGhlbiBjYWxscyB0aGUKICAgIHN0YW5kYXJkIEMgbGlicmFyeSBmdW5jdGlvbiBgYGV4aXQoc3RhdHVzKWBgLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeV9BdEV4aXQodm9pZCAoKmZ1bmMpICgpKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeV9BdEV4aXQodm9pZCAoKmZ1bmMpICgpKQogCiAgICAuLiBpbmRleDo6CiAgICAgICBzaW5nbGU6IFB5X0ZpbmFsaXplKCkKICAgICAgIHNpbmdsZTogY2xlYW51cCBmdW5jdGlvbnMKIAotICAgUmVnaXN0ZXIgYSBjbGVhbnVwIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBieSA6Y2Z1bmM6YFB5X0ZpbmFsaXplYC4gIFRoZSBjbGVhbnVwCisgICBSZWdpc3RlciBhIGNsZWFudXAgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJ5IDpjOmZ1bmM6YFB5X0ZpbmFsaXplYC4gIFRoZSBjbGVhbnVwCiAgICBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cyBhbmQgc2hvdWxkIHJldHVybiBubyB2YWx1ZS4gIEF0IG1vc3QKICAgIDMyIGNsZWFudXAgZnVuY3Rpb25zIGNhbiBiZSByZWdpc3RlcmVkLiAgV2hlbiB0aGUgcmVnaXN0cmF0aW9uIGlzIHN1Y2Nlc3NmdWwsCi0gICA6Y2Z1bmM6YFB5X0F0RXhpdGAgcmV0dXJucyBgYDBgYDsgb24gZmFpbHVyZSwgaXQgcmV0dXJucyBgYC0xYGAuICBUaGUgY2xlYW51cAorICAgOmM6ZnVuYzpgUHlfQXRFeGl0YCByZXR1cm5zIGBgMGBgOyBvbiBmYWlsdXJlLCBpdCByZXR1cm5zIGBgLTFgYC4gIFRoZSBjbGVhbnVwCiAgICBmdW5jdGlvbiByZWdpc3RlcmVkIGxhc3QgaXMgY2FsbGVkIGZpcnN0LiBFYWNoIGNsZWFudXAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQKICAgIGF0IG1vc3Qgb25jZS4gIFNpbmNlIFB5dGhvbidzIGludGVybmFsIGZpbmFsaXphdGlvbiB3aWxsIGhhdmUgY29tcGxldGVkIGJlZm9yZQogICAgdGhlIGNsZWFudXAgZnVuY3Rpb24sIG5vIFB5dGhvbiBBUElzIHNob3VsZCBiZSBjYWxsZWQgYnkgKmZ1bmMqLgpkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL3R1cGxlLnJzdCBiL0RvYy9jLWFwaS90dXBsZS5yc3QKaW5kZXggZWI0NzlkNS4uMTZkZTQ1ZiAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL3R1cGxlLnJzdAorKysgYi9Eb2MvYy1hcGkvdHVwbGUucnN0CkBAIC04LDIwICs4LDIwIEBACiAuLiBpbmRleDo6IG9iamVjdDogdHVwbGUKIAogCi0uLiBjdHlwZTo6IFB5VHVwbGVPYmplY3QKKy4uIGM6dHlwZTo6IFB5VHVwbGVPYmplY3QKIAotICAgVGhpcyBzdWJ0eXBlIG9mIDpjdHlwZTpgUHlPYmplY3RgIHJlcHJlc2VudHMgYSBQeXRob24gdHVwbGUgb2JqZWN0LgorICAgVGhpcyBzdWJ0eXBlIG9mIDpjOnR5cGU6YFB5T2JqZWN0YCByZXByZXNlbnRzIGEgUHl0aG9uIHR1cGxlIG9iamVjdC4KIAogCi0uLiBjdmFyOjogUHlUeXBlT2JqZWN0IFB5VHVwbGVfVHlwZQorLi4gYzp2YXI6OiBQeVR5cGVPYmplY3QgUHlUdXBsZV9UeXBlCiAKICAgIC4uIGluZGV4Ojogc2luZ2xlOiBUdXBsZVR5cGUgKGluIG1vZHVsZSB0eXBlcykKIAotICAgVGhpcyBpbnN0YW5jZSBvZiA6Y3R5cGU6YFB5VHlwZU9iamVjdGAgcmVwcmVzZW50cyB0aGUgUHl0aG9uIHR1cGxlIHR5cGU7IGl0IGlzCisgICBUaGlzIGluc3RhbmNlIG9mIDpjOnR5cGU6YFB5VHlwZU9iamVjdGAgcmVwcmVzZW50cyB0aGUgUHl0aG9uIHR1cGxlIHR5cGU7IGl0IGlzCiAgICB0aGUgc2FtZSBvYmplY3QgYXMgYGB0dXBsZWBgIGFuZCBgYHR5cGVzLlR1cGxlVHlwZWBgIGluIHRoZSBQeXRob24gbGF5ZXIuLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeVR1cGxlX0NoZWNrKFB5T2JqZWN0ICpwKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeVR1cGxlX0NoZWNrKFB5T2JqZWN0ICpwKQogCiAgICBSZXR1cm4gdHJ1ZSBpZiAqcCogaXMgYSB0dXBsZSBvYmplY3Qgb3IgYW4gaW5zdGFuY2Ugb2YgYSBzdWJ0eXBlIG9mIHRoZSB0dXBsZQogICAgdHlwZS4KQEAgLTMwLDcgKzMwLDcgQEAKICAgICAgIEFsbG93ZWQgc3VidHlwZXMgdG8gYmUgYWNjZXB0ZWQuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5VHVwbGVfQ2hlY2tFeGFjdChQeU9iamVjdCAqcCkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlUdXBsZV9DaGVja0V4YWN0KFB5T2JqZWN0ICpwKQogCiAgICBSZXR1cm4gdHJ1ZSBpZiAqcCogaXMgYSB0dXBsZSBvYmplY3QsIGJ1dCBub3QgYW4gaW5zdGFuY2Ugb2YgYSBzdWJ0eXBlIG9mIHRoZQogICAgdHVwbGUgdHlwZS4KQEAgLTM4LDE2ICszOCwxNiBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4yCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5VHVwbGVfTmV3KFB5X3NzaXplX3QgbGVuKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVR1cGxlX05ldyhQeV9zc2l6ZV90IGxlbikKIAogICAgUmV0dXJuIGEgbmV3IHR1cGxlIG9iamVjdCBvZiBzaXplICpsZW4qLCBvciAqTlVMTCogb24gZmFpbHVyZS4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Y3R5cGU6YGludGAgdHlwZSBmb3IgKmxlbiouIFRoaXMgbWlnaHQgcmVxdWlyZQorICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjOnR5cGU6YGludGAgdHlwZSBmb3IgKmxlbiouIFRoaXMgbWlnaHQgcmVxdWlyZQogICAgICAgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5VHVwbGVfUGFjayhQeV9zc2l6ZV90IG4sIC4uLikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlUdXBsZV9QYWNrKFB5X3NzaXplX3QgbiwgLi4uKQogCiAgICBSZXR1cm4gYSBuZXcgdHVwbGUgb2JqZWN0IG9mIHNpemUgKm4qLCBvciAqTlVMTCogb24gZmFpbHVyZS4gVGhlIHR1cGxlIHZhbHVlcwogICAgYXJlIGluaXRpYWxpemVkIHRvIHRoZSBzdWJzZXF1ZW50ICpuKiBDIGFyZ3VtZW50cyBwb2ludGluZyB0byBQeXRob24gb2JqZWN0cy4KQEAgLTU2LDU5ICs1Niw1OSBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi40CiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUgZm9yICpuKi4gVGhpcyBtaWdodCByZXF1aXJlCisgICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmM6dHlwZTpgaW50YCB0eXBlIGZvciAqbiouIFRoaXMgbWlnaHQgcmVxdWlyZQogICAgICAgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlfc3NpemVfdCBQeVR1cGxlX1NpemUoUHlPYmplY3QgKnApCisuLiBjOmZ1bmN0aW9uOjogUHlfc3NpemVfdCBQeVR1cGxlX1NpemUoUHlPYmplY3QgKnApCiAKICAgIFRha2UgYSBwb2ludGVyIHRvIGEgdHVwbGUgb2JqZWN0LCBhbmQgcmV0dXJuIHRoZSBzaXplIG9mIHRoYXQgdHVwbGUuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybmVkIGFuIDpjdHlwZTpgaW50YCB0eXBlLiBUaGlzIG1pZ2h0IHJlcXVpcmUgY2hhbmdlcworICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5lZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUuIFRoaXMgbWlnaHQgcmVxdWlyZSBjaGFuZ2VzCiAgICAgICBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlfc3NpemVfdCBQeVR1cGxlX0dFVF9TSVpFKFB5T2JqZWN0ICpwKQorLi4gYzpmdW5jdGlvbjo6IFB5X3NzaXplX3QgUHlUdXBsZV9HRVRfU0laRShQeU9iamVjdCAqcCkKIAogICAgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSB0dXBsZSAqcCosIHdoaWNoIG11c3QgYmUgbm9uLSpOVUxMKiBhbmQgcG9pbnQgdG8gYSB0dXBsZTsKICAgIG5vIGVycm9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJuZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUuIFRoaXMgbWlnaHQgcmVxdWlyZSBjaGFuZ2VzCisgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybmVkIGFuIDpjOnR5cGU6YGludGAgdHlwZS4gVGhpcyBtaWdodCByZXF1aXJlIGNoYW5nZXMKICAgICAgIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlUdXBsZV9HZXRJdGVtKFB5T2JqZWN0ICpwLCBQeV9zc2l6ZV90IHBvcykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlUdXBsZV9HZXRJdGVtKFB5T2JqZWN0ICpwLCBQeV9zc2l6ZV90IHBvcykKIAogICAgUmV0dXJuIHRoZSBvYmplY3QgYXQgcG9zaXRpb24gKnBvcyogaW4gdGhlIHR1cGxlIHBvaW50ZWQgdG8gYnkgKnAqLiAgSWYgKnBvcyogaXMKICAgIG91dCBvZiBib3VuZHMsIHJldHVybiAqTlVMTCogYW5kIHNldHMgYW4gOmV4YzpgSW5kZXhFcnJvcmAgZXhjZXB0aW9uLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjdHlwZTpgaW50YCB0eXBlIGZvciAqcG9zKi4gVGhpcyBtaWdodCByZXF1aXJlCisgICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmM6dHlwZTpgaW50YCB0eXBlIGZvciAqcG9zKi4gVGhpcyBtaWdodCByZXF1aXJlCiAgICAgICBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlUdXBsZV9HRVRfSVRFTShQeU9iamVjdCAqcCwgUHlfc3NpemVfdCBwb3MpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5VHVwbGVfR0VUX0lURU0oUHlPYmplY3QgKnAsIFB5X3NzaXplX3QgcG9zKQogCi0gICBMaWtlIDpjZnVuYzpgUHlUdXBsZV9HZXRJdGVtYCwgYnV0IGRvZXMgbm8gY2hlY2tpbmcgb2YgaXRzIGFyZ3VtZW50cy4KKyAgIExpa2UgOmM6ZnVuYzpgUHlUdXBsZV9HZXRJdGVtYCwgYnV0IGRvZXMgbm8gY2hlY2tpbmcgb2YgaXRzIGFyZ3VtZW50cy4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Y3R5cGU6YGludGAgdHlwZSBmb3IgKnBvcyouIFRoaXMgbWlnaHQgcmVxdWlyZQorICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjOnR5cGU6YGludGAgdHlwZSBmb3IgKnBvcyouIFRoaXMgbWlnaHQgcmVxdWlyZQogICAgICAgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5VHVwbGVfR2V0U2xpY2UoUHlPYmplY3QgKnAsIFB5X3NzaXplX3QgbG93LCBQeV9zc2l6ZV90IGhpZ2gpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5VHVwbGVfR2V0U2xpY2UoUHlPYmplY3QgKnAsIFB5X3NzaXplX3QgbG93LCBQeV9zc2l6ZV90IGhpZ2gpCiAKICAgIFRha2UgYSBzbGljZSBvZiB0aGUgdHVwbGUgcG9pbnRlZCB0byBieSAqcCogZnJvbSAqbG93KiB0byAqaGlnaCogYW5kIHJldHVybiBpdAogICAgYXMgYSBuZXcgdHVwbGUuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUgZm9yICpsb3cqIGFuZCAqaGlnaCouIFRoaXMgbWlnaHQKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgZm9yICpsb3cqIGFuZCAqaGlnaCouIFRoaXMgbWlnaHQKICAgICAgIHJlcXVpcmUgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5VHVwbGVfU2V0SXRlbShQeU9iamVjdCAqcCwgUHlfc3NpemVfdCBwb3MsIFB5T2JqZWN0ICpvKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeVR1cGxlX1NldEl0ZW0oUHlPYmplY3QgKnAsIFB5X3NzaXplX3QgcG9zLCBQeU9iamVjdCAqbykKIAogICAgSW5zZXJ0IGEgcmVmZXJlbmNlIHRvIG9iamVjdCAqbyogYXQgcG9zaXRpb24gKnBvcyogb2YgdGhlIHR1cGxlIHBvaW50ZWQgdG8gYnkKICAgICpwKi4gUmV0dXJuIGBgMGBgIG9uIHN1Y2Nlc3MuCkBAIC0xMTgsMTMgKzExOCwxMyBAQAogICAgICAgVGhpcyBmdW5jdGlvbiAic3RlYWxzIiBhIHJlZmVyZW5jZSB0byAqbyouCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUgZm9yICpwb3MqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgZm9yICpwb3MqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKICAgICAgIGNoYW5nZXMgaW4geW91ciBjb2RlIGZvciBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCiAKLS4uIGNmdW5jdGlvbjo6IHZvaWQgUHlUdXBsZV9TRVRfSVRFTShQeU9iamVjdCAqcCwgUHlfc3NpemVfdCBwb3MsIFB5T2JqZWN0ICpvKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlUdXBsZV9TRVRfSVRFTShQeU9iamVjdCAqcCwgUHlfc3NpemVfdCBwb3MsIFB5T2JqZWN0ICpvKQogCi0gICBMaWtlIDpjZnVuYzpgUHlUdXBsZV9TZXRJdGVtYCwgYnV0IGRvZXMgbm8gZXJyb3IgY2hlY2tpbmcsIGFuZCBzaG91bGQgKm9ubHkqIGJlCisgICBMaWtlIDpjOmZ1bmM6YFB5VHVwbGVfU2V0SXRlbWAsIGJ1dCBkb2VzIG5vIGVycm9yIGNoZWNraW5nLCBhbmQgc2hvdWxkICpvbmx5KiBiZQogICAgdXNlZCB0byBmaWxsIGluIGJyYW5kIG5ldyB0dXBsZXMuCiAKICAgIC4uIG5vdGU6OgpAQCAtMTMyLDExICsxMzIsMTEgQEAKICAgICAgIFRoaXMgZnVuY3Rpb24gInN0ZWFscyIgYSByZWZlcmVuY2UgdG8gKm8qLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjdHlwZTpgaW50YCB0eXBlIGZvciAqcG9zKi4gVGhpcyBtaWdodCByZXF1aXJlCisgICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmM6dHlwZTpgaW50YCB0eXBlIGZvciAqcG9zKi4gVGhpcyBtaWdodCByZXF1aXJlCiAgICAgICBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgX1B5VHVwbGVfUmVzaXplKFB5T2JqZWN0ICoqcCwgUHlfc3NpemVfdCBuZXdzaXplKQorLi4gYzpmdW5jdGlvbjo6IGludCBfUHlUdXBsZV9SZXNpemUoUHlPYmplY3QgKipwLCBQeV9zc2l6ZV90IG5ld3NpemUpCiAKICAgIENhbiBiZSB1c2VkIHRvIHJlc2l6ZSBhIHR1cGxlLiAgKm5ld3NpemUqIHdpbGwgYmUgdGhlIG5ldyBsZW5ndGggb2YgdGhlIHR1cGxlLgogICAgQmVjYXVzZSB0dXBsZXMgYXJlICpzdXBwb3NlZCogdG8gYmUgaW1tdXRhYmxlLCB0aGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgdGhlcmUKQEAgLTE1MywxMSArMTUzLDExIEBACiAgICAgICBSZW1vdmVkIHVudXNlZCB0aGlyZCBwYXJhbWV0ZXIsICpsYXN0X2lzX3N0aWNreSouCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUgZm9yICpuZXdzaXplKi4gVGhpcyBtaWdodAorICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjOnR5cGU6YGludGAgdHlwZSBmb3IgKm5ld3NpemUqLiBUaGlzIG1pZ2h0CiAgICAgICByZXF1aXJlIGNoYW5nZXMgaW4geW91ciBjb2RlIGZvciBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeVR1cGxlX0NsZWFyRnJlZUxpc3QoKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeVR1cGxlX0NsZWFyRnJlZUxpc3QoKQogCiAgICBDbGVhciB0aGUgZnJlZSBsaXN0LiBSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBmcmVlZCBpdGVtcy4KIApkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL3R5cGUucnN0IGIvRG9jL2MtYXBpL3R5cGUucnN0CmluZGV4IDdkMWM3NzMuLjIyZjdkZDAgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS90eXBlLnJzdAorKysgYi9Eb2MvYy1hcGkvdHlwZS5yc3QKQEAgLTgsMTIgKzgsMTIgQEAKIC4uIGluZGV4Ojogb2JqZWN0OiB0eXBlCiAKIAotLi4gY3R5cGU6OiBQeVR5cGVPYmplY3QKKy4uIGM6dHlwZTo6IFB5VHlwZU9iamVjdAogCiAgICBUaGUgQyBzdHJ1Y3R1cmUgb2YgdGhlIG9iamVjdHMgdXNlZCB0byBkZXNjcmliZSBidWlsdC1pbiB0eXBlcy4KIAogCi0uLiBjdmFyOjogUHlPYmplY3QqIFB5VHlwZV9UeXBlCisuLiBjOnZhcjo6IFB5T2JqZWN0KiBQeVR5cGVfVHlwZQogCiAgICAuLiBpbmRleDo6IHNpbmdsZTogVHlwZVR5cGUgKGluIG1vZHVsZSB0eXBlcykKIApAQCAtMjEsMTMgKzIxLDEzIEBACiAgICBgYHR5cGVzLlR5cGVUeXBlYGAgaW4gdGhlIFB5dGhvbiBsYXllci4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlUeXBlX0NoZWNrKFB5T2JqZWN0ICpvKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeVR5cGVfQ2hlY2soUHlPYmplY3QgKm8pCiAKICAgIFJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgKm8qIGlzIGEgdHlwZSBvYmplY3QsIGluY2x1ZGluZyBpbnN0YW5jZXMgb2YgdHlwZXMKICAgIGRlcml2ZWQgZnJvbSB0aGUgc3RhbmRhcmQgdHlwZSBvYmplY3QuICBSZXR1cm4gZmFsc2UgaW4gYWxsIG90aGVyIGNhc2VzLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeVR5cGVfQ2hlY2tFeGFjdChQeU9iamVjdCAqbykKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlUeXBlX0NoZWNrRXhhY3QoUHlPYmplY3QgKm8pCiAKICAgIFJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgKm8qIGlzIGEgdHlwZSBvYmplY3QsIGJ1dCBub3QgYSBzdWJ0eXBlIG9mIHRoZQogICAgc3RhbmRhcmQgdHlwZSBvYmplY3QuICBSZXR1cm4gZmFsc2UgaW4gYWxsIG90aGVyIGNhc2VzLgpAQCAtMzUsMTQgKzM1LDE0IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjIKIAogCi0uLiBjZnVuY3Rpb246OiB1bnNpZ25lZCBpbnQgUHlUeXBlX0NsZWFyQ2FjaGUoKQorLi4gYzpmdW5jdGlvbjo6IHVuc2lnbmVkIGludCBQeVR5cGVfQ2xlYXJDYWNoZSgpCiAKICAgIENsZWFyIHRoZSBpbnRlcm5hbCBsb29rdXAgY2FjaGUuIFJldHVybiB0aGUgY3VycmVudCB2ZXJzaW9uIHRhZy4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi42CiAKIAotLi4gY2Z1bmN0aW9uOjogdm9pZCBQeVR5cGVfTW9kaWZpZWQoUHlUeXBlT2JqZWN0ICp0eXBlKQorLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlUeXBlX01vZGlmaWVkKFB5VHlwZU9iamVjdCAqdHlwZSkKIAogICAgSW52YWxpZGF0ZSB0aGUgaW50ZXJuYWwgbG9va3VwIGNhY2hlIGZvciB0aGUgdHlwZSBhbmQgYWxsIG9mIGl0cwogICAgc3VidHlwZXMuICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIGFueSBtYW51YWwKQEAgLTUxLDEzICs1MSwxMyBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi42CiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5VHlwZV9IYXNGZWF0dXJlKFB5T2JqZWN0ICpvLCBpbnQgZmVhdHVyZSkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlUeXBlX0hhc0ZlYXR1cmUoUHlPYmplY3QgKm8sIGludCBmZWF0dXJlKQogCiAgICBSZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBvYmplY3QgKm8qIHNldHMgdGhlIGZlYXR1cmUgKmZlYXR1cmUqLiAgVHlwZSBmZWF0dXJlcwogICAgYXJlIGRlbm90ZWQgYnkgc2luZ2xlIGJpdCBmbGFncy4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlUeXBlX0lTX0dDKFB5T2JqZWN0ICpvKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeVR5cGVfSVNfR0MoUHlPYmplY3QgKm8pCiAKICAgIFJldHVybiB0cnVlIGlmIHRoZSB0eXBlIG9iamVjdCBpbmNsdWRlcyBzdXBwb3J0IGZvciB0aGUgY3ljbGUgZGV0ZWN0b3I7IHRoaXMKICAgIHRlc3RzIHRoZSB0eXBlIGZsYWcgOmNvbnN0OmBQeV9UUEZMQUdTX0hBVkVfR0NgLgpAQCAtNjUsMjggKzY1LDI4IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjAKIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlUeXBlX0lzU3VidHlwZShQeVR5cGVPYmplY3QgKmEsIFB5VHlwZU9iamVjdCAqYikKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlUeXBlX0lzU3VidHlwZShQeVR5cGVPYmplY3QgKmEsIFB5VHlwZU9iamVjdCAqYikKIAogICAgUmV0dXJuIHRydWUgaWYgKmEqIGlzIGEgc3VidHlwZSBvZiAqYiouCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVR5cGVfR2VuZXJpY0FsbG9jKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlfc3NpemVfdCBuaXRlbXMpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5VHlwZV9HZW5lcmljQWxsb2MoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeV9zc2l6ZV90IG5pdGVtcykKIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4yCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUgZm9yICpuaXRlbXMqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgZm9yICpuaXRlbXMqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKICAgICAgIGNoYW5nZXMgaW4geW91ciBjb2RlIGZvciBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVR5cGVfR2VuZXJpY05ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlUeXBlX0dlbmVyaWNOZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeVR5cGVfUmVhZHkoUHlUeXBlT2JqZWN0ICp0eXBlKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeVR5cGVfUmVhZHkoUHlUeXBlT2JqZWN0ICp0eXBlKQogCiAgICBGaW5hbGl6ZSBhIHR5cGUgb2JqZWN0LiAgVGhpcyBzaG91bGQgYmUgY2FsbGVkIG9uIGFsbCB0eXBlIG9iamVjdHMgdG8gZmluaXNoCiAgICB0aGVpciBpbml0aWFsaXphdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGFkZGluZyBpbmhlcml0ZWQgc2xvdHMKZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS90eXBlb2JqLnJzdCBiL0RvYy9jLWFwaS90eXBlb2JqLnJzdAppbmRleCA5YWY0Y2ZjLi5iNTQ1YjA2IDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvdHlwZW9iai5yc3QKKysrIGIvRG9jL2MtYXBpL3R5cGVvYmoucnN0CkBAIC02LDkgKzYsOSBAQAogPT09PT09PT09PT09CiAKIFBlcmhhcHMgb25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCBzdHJ1Y3R1cmVzIG9mIHRoZSBQeXRob24gb2JqZWN0IHN5c3RlbSBpcyB0aGUKLXN0cnVjdHVyZSB0aGF0IGRlZmluZXMgYSBuZXcgdHlwZTogdGhlIDpjdHlwZTpgUHlUeXBlT2JqZWN0YCBzdHJ1Y3R1cmUuICBUeXBlCi1vYmplY3RzIGNhbiBiZSBoYW5kbGVkIHVzaW5nIGFueSBvZiB0aGUgOmNmdW5jOmBQeU9iamVjdF9cKmAgb3IKLTpjZnVuYzpgUHlUeXBlX1wqYCBmdW5jdGlvbnMsIGJ1dCBkbyBub3Qgb2ZmZXIgbXVjaCB0aGF0J3MgaW50ZXJlc3RpbmcgdG8gbW9zdAorc3RydWN0dXJlIHRoYXQgZGVmaW5lcyBhIG5ldyB0eXBlOiB0aGUgOmM6dHlwZTpgUHlUeXBlT2JqZWN0YCBzdHJ1Y3R1cmUuICBUeXBlCitvYmplY3RzIGNhbiBiZSBoYW5kbGVkIHVzaW5nIGFueSBvZiB0aGUgOmM6ZnVuYzpgUHlPYmplY3RfXCpgIG9yCis6YzpmdW5jOmBQeVR5cGVfXCpgIGZ1bmN0aW9ucywgYnV0IGRvIG5vdCBvZmZlciBtdWNoIHRoYXQncyBpbnRlcmVzdGluZyB0byBtb3N0CiBQeXRob24gYXBwbGljYXRpb25zLiBUaGVzZSBvYmplY3RzIGFyZSBmdW5kYW1lbnRhbCB0byBob3cgb2JqZWN0cyBiZWhhdmUsIHNvCiB0aGV5IGFyZSB2ZXJ5IGltcG9ydGFudCB0byB0aGUgaW50ZXJwcmV0ZXIgaXRzZWxmIGFuZCB0byBhbnkgZXh0ZW5zaW9uIG1vZHVsZQogdGhhdCBpbXBsZW1lbnRzIG5ldyB0eXBlcy4KQEAgLTI1LDIxICsyNSwyMSBAQAogZnJlZWZ1bmMsIHByaW50ZnVuYywgZ2V0YXR0cmZ1bmMsIGdldGF0dHJvZnVuYywgc2V0YXR0cmZ1bmMsIHNldGF0dHJvZnVuYywKIGNtcGZ1bmMsIHJlcHJmdW5jLCBoYXNoZnVuYwogCi1UaGUgc3RydWN0dXJlIGRlZmluaXRpb24gZm9yIDpjdHlwZTpgUHlUeXBlT2JqZWN0YCBjYW4gYmUgZm91bmQgaW4KK1RoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgOmM6dHlwZTpgUHlUeXBlT2JqZWN0YCBjYW4gYmUgZm91bmQgaW4KIDpmaWxlOmBJbmNsdWRlL29iamVjdC5oYC4gIEZvciBjb252ZW5pZW5jZSBvZiByZWZlcmVuY2UsIHRoaXMgcmVwZWF0cyB0aGUKIGRlZmluaXRpb24gZm91bmQgdGhlcmU6CiAKIC4uIGxpdGVyYWxpbmNsdWRlOjogLi4vaW5jbHVkZXMvdHlwZXN0cnVjdC5oCiAKIAotVGhlIHR5cGUgb2JqZWN0IHN0cnVjdHVyZSBleHRlbmRzIHRoZSA6Y3R5cGU6YFB5VmFyT2JqZWN0YCBzdHJ1Y3R1cmUuIFRoZQorVGhlIHR5cGUgb2JqZWN0IHN0cnVjdHVyZSBleHRlbmRzIHRoZSA6Yzp0eXBlOmBQeVZhck9iamVjdGAgc3RydWN0dXJlLiBUaGUKIDphdHRyOmBvYl9zaXplYCBmaWVsZCBpcyB1c2VkIGZvciBkeW5hbWljIHR5cGVzIChjcmVhdGVkIGJ5ICA6ZnVuYzpgdHlwZV9uZXdgLAotdXN1YWxseSBjYWxsZWQgZnJvbSBhIGNsYXNzIHN0YXRlbWVudCkuIE5vdGUgdGhhdCA6Y2RhdGE6YFB5VHlwZV9UeXBlYCAodGhlCi1tZXRhdHlwZSkgaW5pdGlhbGl6ZXMgOmF0dHI6YHRwX2l0ZW1zaXplYCwgd2hpY2ggbWVhbnMgdGhhdCBpdHMgaW5zdGFuY2VzIChpLmUuCit1c3VhbGx5IGNhbGxlZCBmcm9tIGEgY2xhc3Mgc3RhdGVtZW50KS4gTm90ZSB0aGF0IDpjOmRhdGE6YFB5VHlwZV9UeXBlYCAodGhlCittZXRhdHlwZSkgaW5pdGlhbGl6ZXMgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2l0ZW1zaXplYCwgd2hpY2ggbWVhbnMgdGhhdCBpdHMgaW5zdGFuY2VzIChpLmUuCiB0eXBlIG9iamVjdHMpICptdXN0KiBoYXZlIHRoZSA6YXR0cjpgb2Jfc2l6ZWAgZmllbGQuCiAKIAotLi4gY21lbWJlcjo6IFB5T2JqZWN0KiBQeU9iamVjdC5fb2JfbmV4dAorLi4gYzptZW1iZXI6OiBQeU9iamVjdCogUHlPYmplY3QuX29iX25leHQKICAgICAgICAgICAgICBQeU9iamVjdCogUHlPYmplY3QuX29iX3ByZXYKIAogICAgVGhlc2UgZmllbGRzIGFyZSBvbmx5IHByZXNlbnQgd2hlbiB0aGUgbWFjcm8gYGBQeV9UUkFDRV9SRUZTYGAgaXMgZGVmaW5lZC4KQEAgLTU0LDcgKzU0LDcgQEAKICAgIFRoZXNlIGZpZWxkcyBhcmUgbm90IGluaGVyaXRlZCBieSBzdWJ0eXBlcy4KIAogCi0uLiBjbWVtYmVyOjogUHlfc3NpemVfdCBQeU9iamVjdC5vYl9yZWZjbnQKKy4uIGM6bWVtYmVyOjogUHlfc3NpemVfdCBQeU9iamVjdC5vYl9yZWZjbnQKIAogICAgVGhpcyBpcyB0aGUgdHlwZSBvYmplY3QncyByZWZlcmVuY2UgY291bnQsIGluaXRpYWxpemVkIHRvIGBgMWBgIGJ5IHRoZQogICAgYGBQeU9iamVjdF9IRUFEX0lOSVRgYCBtYWNyby4gIE5vdGUgdGhhdCBmb3Igc3RhdGljYWxseSBhbGxvY2F0ZWQgdHlwZSBvYmplY3RzLApAQCAtNjUsMTEgKzY1LDExIEBACiAgICBUaGlzIGZpZWxkIGlzIG5vdCBpbmhlcml0ZWQgYnkgc3VidHlwZXMuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZpZWxkIHVzZWQgdG8gYmUgYW4gOmN0eXBlOmBpbnRgIHR5cGUuIFRoaXMgbWlnaHQgcmVxdWlyZSBjaGFuZ2VzCisgICAgICBUaGlzIGZpZWxkIHVzZWQgdG8gYmUgYW4gOmM6dHlwZTpgaW50YCB0eXBlLiBUaGlzIG1pZ2h0IHJlcXVpcmUgY2hhbmdlcwogICAgICAgaW4geW91ciBjb2RlIGZvciBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCiAKLS4uIGNtZW1iZXI6OiBQeVR5cGVPYmplY3QqIFB5T2JqZWN0Lm9iX3R5cGUKKy4uIGM6bWVtYmVyOjogUHlUeXBlT2JqZWN0KiBQeU9iamVjdC5vYl90eXBlCiAKICAgIFRoaXMgaXMgdGhlIHR5cGUncyB0eXBlLCBpbiBvdGhlciB3b3JkcyBpdHMgbWV0YXR5cGUuICBJdCBpcyBpbml0aWFsaXplZCBieSB0aGUKICAgIGFyZ3VtZW50IHRvIHRoZSBgYFB5T2JqZWN0X0hFQURfSU5JVGBgIG1hY3JvLCBhbmQgaXRzIHZhbHVlIHNob3VsZCBub3JtYWxseSBiZQpAQCAtODMsMTYgKzgzLDE2IEBACiAgICAgICBGb29fVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwogCiAgICBUaGlzIHNob3VsZCBiZSBkb25lIGJlZm9yZSBhbnkgaW5zdGFuY2VzIG9mIHRoZSB0eXBlIGFyZSBjcmVhdGVkLgotICAgOmNmdW5jOmBQeVR5cGVfUmVhZHlgIGNoZWNrcyBpZiA6YXR0cjpgb2JfdHlwZWAgaXMgKk5VTEwqLCBhbmQgaWYgc28sCisgICA6YzpmdW5jOmBQeVR5cGVfUmVhZHlgIGNoZWNrcyBpZiA6YXR0cjpgb2JfdHlwZWAgaXMgKk5VTEwqLCBhbmQgaWYgc28sCiAgICBpbml0aWFsaXplcyBpdDogaW4gUHl0aG9uIDIuMiwgaXQgaXMgc2V0IHRvIGBgJlB5VHlwZV9UeXBlYGA7IGluIFB5dGhvbiAyLjIuMQogICAgYW5kIGxhdGVyIGl0IGlzIGluaXRpYWxpemVkIHRvIHRoZSA6YXR0cjpgb2JfdHlwZWAgZmllbGQgb2YgdGhlIGJhc2UgY2xhc3MuCi0gICA6Y2Z1bmM6YFB5VHlwZV9SZWFkeWAgd2lsbCBub3QgY2hhbmdlIHRoaXMgZmllbGQgaWYgaXQgaXMgbm9uLXplcm8uCisgICA6YzpmdW5jOmBQeVR5cGVfUmVhZHlgIHdpbGwgbm90IGNoYW5nZSB0aGlzIGZpZWxkIGlmIGl0IGlzIG5vbi16ZXJvLgogCiAgICBJbiBQeXRob24gMi4yLCB0aGlzIGZpZWxkIGlzIG5vdCBpbmhlcml0ZWQgYnkgc3VidHlwZXMuICBJbiAyLjIuMSwgYW5kIGluIDIuMwogICAgYW5kIGJleW9uZCwgaXQgaXMgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzLgogCiAKLS4uIGNtZW1iZXI6OiBQeV9zc2l6ZV90IFB5VmFyT2JqZWN0Lm9iX3NpemUKKy4uIGM6bWVtYmVyOjogUHlfc3NpemVfdCBQeVZhck9iamVjdC5vYl9zaXplCiAKICAgIEZvciBzdGF0aWNhbGx5IGFsbG9jYXRlZCB0eXBlIG9iamVjdHMsIHRoaXMgc2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIHplcm8uICBGb3IKICAgIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCB0eXBlIG9iamVjdHMsIHRoaXMgZmllbGQgaGFzIGEgc3BlY2lhbCBpbnRlcm5hbCBtZWFuaW5nLgpAQCAtMTAwLDcgKzEwMCw3IEBACiAgICBUaGlzIGZpZWxkIGlzIG5vdCBpbmhlcml0ZWQgYnkgc3VidHlwZXMuCiAKIAotLi4gY21lbWJlcjo6IGNoYXIqIFB5VHlwZU9iamVjdC50cF9uYW1lCisuLiBjOm1lbWJlcjo6IGNoYXIqIFB5VHlwZU9iamVjdC50cF9uYW1lCiAKICAgIFBvaW50ZXIgdG8gYSBOVUwtdGVybWluYXRlZCBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgdHlwZS4gRm9yIHR5cGVzCiAgICB0aGF0IGFyZSBhY2Nlc3NpYmxlIGFzIG1vZHVsZSBnbG9iYWxzLCB0aGUgc3RyaW5nIHNob3VsZCBiZSB0aGUgZnVsbCBtb2R1bGUKQEAgLTEwOCw3ICsxMDgsNyBAQAogICAgc2hvdWxkIGJlIGp1c3QgdGhlIHR5cGUgbmFtZS4gIElmIHRoZSBtb2R1bGUgaXMgYSBzdWJtb2R1bGUgb2YgYSBwYWNrYWdlLCB0aGUKICAgIGZ1bGwgcGFja2FnZSBuYW1lIGlzIHBhcnQgb2YgdGhlIGZ1bGwgbW9kdWxlIG5hbWUuICBGb3IgZXhhbXBsZSwgYSB0eXBlIG5hbWVkCiAgICA6Y2xhc3M6YFRgIGRlZmluZWQgaW4gbW9kdWxlIDptb2Q6YE1gIGluIHN1YnBhY2thZ2UgOm1vZDpgUWAgaW4gcGFja2FnZSA6bW9kOmBQYAotICAgc2hvdWxkIGhhdmUgdGhlIDphdHRyOmB0cF9uYW1lYCBpbml0aWFsaXplciBgYCJQLlEuTS5UImBgLgorICAgc2hvdWxkIGhhdmUgdGhlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9uYW1lYCBpbml0aWFsaXplciBgYCJQLlEuTS5UImBgLgogCiAgICBGb3IgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHR5cGUgb2JqZWN0cywgdGhpcyBzaG91bGQganVzdCBiZSB0aGUgdHlwZSBuYW1lLCBhbmQKICAgIHRoZSBtb2R1bGUgbmFtZSBleHBsaWNpdGx5IHN0b3JlZCBpbiB0aGUgdHlwZSBkaWN0IGFzIHRoZSB2YWx1ZSBmb3Iga2V5CkBAIC0xMTksNyArMTE5LDcgQEAKICAgIGF0dHJpYnV0ZSwgYW5kIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGxhc3QgZG90IGlzIG1hZGUgYWNjZXNzaWJsZSBhcyB0aGUKICAgIDphdHRyOmBfX25hbWVfX2AgYXR0cmlidXRlLgogCi0gICBJZiBubyBkb3QgaXMgcHJlc2VudCwgdGhlIGVudGlyZSA6YXR0cjpgdHBfbmFtZWAgZmllbGQgaXMgbWFkZSBhY2Nlc3NpYmxlIGFzIHRoZQorICAgSWYgbm8gZG90IGlzIHByZXNlbnQsIHRoZSBlbnRpcmUgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX25hbWVgIGZpZWxkIGlzIG1hZGUgYWNjZXNzaWJsZSBhcyB0aGUKICAgIDphdHRyOmBfX25hbWVfX2AgYXR0cmlidXRlLCBhbmQgdGhlIDphdHRyOmBfX21vZHVsZV9fYCBhdHRyaWJ1dGUgaXMgdW5kZWZpbmVkCiAgICAodW5sZXNzIGV4cGxpY2l0bHkgc2V0IGluIHRoZSBkaWN0aW9uYXJ5LCBhcyBleHBsYWluZWQgYWJvdmUpLiAgVGhpcyBtZWFucyB5b3VyCiAgICB0eXBlIHdpbGwgYmUgaW1wb3NzaWJsZSB0byBwaWNrbGUuCkBAIC0xMjcsMTkgKzEyNywxOSBAQAogICAgVGhpcyBmaWVsZCBpcyBub3QgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzLgogCiAKLS4uIGNtZW1iZXI6OiBQeV9zc2l6ZV90IFB5VHlwZU9iamVjdC50cF9iYXNpY3NpemUKKy4uIGM6bWVtYmVyOjogUHlfc3NpemVfdCBQeVR5cGVPYmplY3QudHBfYmFzaWNzaXplCiAgICAgICAgICAgICAgUHlfc3NpemVfdCBQeVR5cGVPYmplY3QudHBfaXRlbXNpemUKIAogICAgVGhlc2UgZmllbGRzIGFsbG93IGNhbGN1bGF0aW5nIHRoZSBzaXplIGluIGJ5dGVzIG9mIGluc3RhbmNlcyBvZiB0aGUgdHlwZS4KIAogICAgVGhlcmUgYXJlIHR3byBraW5kcyBvZiB0eXBlczogdHlwZXMgd2l0aCBmaXhlZC1sZW5ndGggaW5zdGFuY2VzIGhhdmUgYSB6ZXJvCi0gICA6YXR0cjpgdHBfaXRlbXNpemVgIGZpZWxkLCB0eXBlcyB3aXRoIHZhcmlhYmxlLWxlbmd0aCBpbnN0YW5jZXMgaGF2ZSBhIG5vbi16ZXJvCi0gICA6YXR0cjpgdHBfaXRlbXNpemVgIGZpZWxkLiAgRm9yIGEgdHlwZSB3aXRoIGZpeGVkLWxlbmd0aCBpbnN0YW5jZXMsIGFsbAotICAgaW5zdGFuY2VzIGhhdmUgdGhlIHNhbWUgc2l6ZSwgZ2l2ZW4gaW4gOmF0dHI6YHRwX2Jhc2ljc2l6ZWAuCisgICA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfaXRlbXNpemVgIGZpZWxkLCB0eXBlcyB3aXRoIHZhcmlhYmxlLWxlbmd0aCBpbnN0YW5jZXMgaGF2ZSBhIG5vbi16ZXJvCisgICA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfaXRlbXNpemVgIGZpZWxkLiAgRm9yIGEgdHlwZSB3aXRoIGZpeGVkLWxlbmd0aCBpbnN0YW5jZXMsIGFsbAorICAgaW5zdGFuY2VzIGhhdmUgdGhlIHNhbWUgc2l6ZSwgZ2l2ZW4gaW4gOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2Jhc2ljc2l6ZWAuCiAKICAgIEZvciBhIHR5cGUgd2l0aCB2YXJpYWJsZS1sZW5ndGggaW5zdGFuY2VzLCB0aGUgaW5zdGFuY2VzIG11c3QgaGF2ZSBhbgotICAgOmF0dHI6YG9iX3NpemVgIGZpZWxkLCBhbmQgdGhlIGluc3RhbmNlIHNpemUgaXMgOmF0dHI6YHRwX2Jhc2ljc2l6ZWAgcGx1cyBOCi0gICB0aW1lcyA6YXR0cjpgdHBfaXRlbXNpemVgLCB3aGVyZSBOIGlzIHRoZSAibGVuZ3RoIiBvZiB0aGUgb2JqZWN0LiAgVGhlIHZhbHVlIG9mCisgICA6YXR0cjpgb2Jfc2l6ZWAgZmllbGQsIGFuZCB0aGUgaW5zdGFuY2Ugc2l6ZSBpcyA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfYmFzaWNzaXplYCBwbHVzIE4KKyAgIHRpbWVzIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9pdGVtc2l6ZWAsIHdoZXJlIE4gaXMgdGhlICJsZW5ndGgiIG9mIHRoZSBvYmplY3QuICBUaGUgdmFsdWUgb2YKICAgIE4gaXMgdHlwaWNhbGx5IHN0b3JlZCBpbiB0aGUgaW5zdGFuY2UncyA6YXR0cjpgb2Jfc2l6ZWAgZmllbGQuICBUaGVyZSBhcmUKICAgIGV4Y2VwdGlvbnM6ICBmb3IgZXhhbXBsZSwgbG9uZyBpbnRzIHVzZSBhIG5lZ2F0aXZlIDphdHRyOmBvYl9zaXplYCB0byBpbmRpY2F0ZSBhCiAgICBuZWdhdGl2ZSBudW1iZXIsIGFuZCBOIGlzIGBgYWJzKG9iX3NpemUpYGAgdGhlcmUuICBBbHNvLCB0aGUgcHJlc2VuY2Ugb2YgYW4KQEAgLTE0OSwxMzEgKzE0OSwxMzEgQEAKICAgIGZpZWxkKS4KIAogICAgVGhlIGJhc2ljIHNpemUgaW5jbHVkZXMgdGhlIGZpZWxkcyBpbiB0aGUgaW5zdGFuY2UgZGVjbGFyZWQgYnkgdGhlIG1hY3JvCi0gICA6Y21hY3JvOmBQeU9iamVjdF9IRUFEYCBvciA6Y21hY3JvOmBQeU9iamVjdF9WQVJfSEVBRGAgKHdoaWNoZXZlciBpcyB1c2VkIHRvCisgICA6YzptYWNybzpgUHlPYmplY3RfSEVBRGAgb3IgOmM6bWFjcm86YFB5T2JqZWN0X1ZBUl9IRUFEYCAod2hpY2hldmVyIGlzIHVzZWQgdG8KICAgIGRlY2xhcmUgdGhlIGluc3RhbmNlIHN0cnVjdCkgYW5kIHRoaXMgaW4gdHVybiBpbmNsdWRlcyB0aGUgOmF0dHI6YF9vYl9wcmV2YCBhbmQKICAgIDphdHRyOmBfb2JfbmV4dGAgZmllbGRzIGlmIHRoZXkgYXJlIHByZXNlbnQuICBUaGlzIG1lYW5zIHRoYXQgdGhlIG9ubHkgY29ycmVjdAotICAgd2F5IHRvIGdldCBhbiBpbml0aWFsaXplciBmb3IgdGhlIDphdHRyOmB0cF9iYXNpY3NpemVgIGlzIHRvIHVzZSB0aGUKKyAgIHdheSB0byBnZXQgYW4gaW5pdGlhbGl6ZXIgZm9yIHRoZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfYmFzaWNzaXplYCBpcyB0byB1c2UgdGhlCiAgICBgYHNpemVvZmBgIG9wZXJhdG9yIG9uIHRoZSBzdHJ1Y3QgdXNlZCB0byBkZWNsYXJlIHRoZSBpbnN0YW5jZSBsYXlvdXQuCiAgICBUaGUgYmFzaWMgc2l6ZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBHQyBoZWFkZXIgc2l6ZSAodGhpcyBpcyBuZXcgaW4gUHl0aG9uIDIuMjsKLSAgIGluIDIuMSBhbmQgMi4wLCB0aGUgR0MgaGVhZGVyIHNpemUgd2FzIGluY2x1ZGVkIGluIDphdHRyOmB0cF9iYXNpY3NpemVgKS4KKyAgIGluIDIuMSBhbmQgMi4wLCB0aGUgR0MgaGVhZGVyIHNpemUgd2FzIGluY2x1ZGVkIGluIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9iYXNpY3NpemVgKS4KIAogICAgVGhlc2UgZmllbGRzIGFyZSBpbmhlcml0ZWQgc2VwYXJhdGVseSBieSBzdWJ0eXBlcy4gIElmIHRoZSBiYXNlIHR5cGUgaGFzIGEKLSAgIG5vbi16ZXJvIDphdHRyOmB0cF9pdGVtc2l6ZWAsIGl0IGlzIGdlbmVyYWxseSBub3Qgc2FmZSB0byBzZXQKLSAgIDphdHRyOmB0cF9pdGVtc2l6ZWAgdG8gYSBkaWZmZXJlbnQgbm9uLXplcm8gdmFsdWUgaW4gYSBzdWJ0eXBlICh0aG91Z2ggdGhpcworICAgbm9uLXplcm8gOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2l0ZW1zaXplYCwgaXQgaXMgZ2VuZXJhbGx5IG5vdCBzYWZlIHRvIHNldAorICAgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2l0ZW1zaXplYCB0byBhIGRpZmZlcmVudCBub24temVybyB2YWx1ZSBpbiBhIHN1YnR5cGUgKHRob3VnaCB0aGlzCiAgICBkZXBlbmRzIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYmFzZSB0eXBlKS4KIAogICAgQSBub3RlIGFib3V0IGFsaWdubWVudDogaWYgdGhlIHZhcmlhYmxlIGl0ZW1zIHJlcXVpcmUgYSBwYXJ0aWN1bGFyIGFsaWdubWVudCwKLSAgIHRoaXMgc2hvdWxkIGJlIHRha2VuIGNhcmUgb2YgYnkgdGhlIHZhbHVlIG9mIDphdHRyOmB0cF9iYXNpY3NpemVgLiAgRXhhbXBsZToKLSAgIHN1cHBvc2UgYSB0eXBlIGltcGxlbWVudHMgYW4gYXJyYXkgb2YgYGBkb3VibGVgYC4gOmF0dHI6YHRwX2l0ZW1zaXplYCBpcworICAgdGhpcyBzaG91bGQgYmUgdGFrZW4gY2FyZSBvZiBieSB0aGUgdmFsdWUgb2YgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2Jhc2ljc2l6ZWAuICBFeGFtcGxlOgorICAgc3VwcG9zZSBhIHR5cGUgaW1wbGVtZW50cyBhbiBhcnJheSBvZiBgYGRvdWJsZWBgLiA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfaXRlbXNpemVgIGlzCiAgICBgYHNpemVvZihkb3VibGUpYGAuIEl0IGlzIHRoZSBwcm9ncmFtbWVyJ3MgcmVzcG9uc2liaWxpdHkgdGhhdAotICAgOmF0dHI6YHRwX2Jhc2ljc2l6ZWAgaXMgYSBtdWx0aXBsZSBvZiBgYHNpemVvZihkb3VibGUpYGAgKGFzc3VtaW5nIHRoaXMgaXMgdGhlCisgICA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfYmFzaWNzaXplYCBpcyBhIG11bHRpcGxlIG9mIGBgc2l6ZW9mKGRvdWJsZSlgYCAoYXNzdW1pbmcgdGhpcyBpcyB0aGUKICAgIGFsaWdubWVudCByZXF1aXJlbWVudCBmb3IgYGBkb3VibGVgYCkuCiAKIAotLi4gY21lbWJlcjo6IGRlc3RydWN0b3IgUHlUeXBlT2JqZWN0LnRwX2RlYWxsb2MKKy4uIGM6bWVtYmVyOjogZGVzdHJ1Y3RvciBQeVR5cGVPYmplY3QudHBfZGVhbGxvYwogCiAgICBBIHBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGRlc3RydWN0b3IgZnVuY3Rpb24uICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgZGVmaW5lZAogICAgdW5sZXNzIHRoZSB0eXBlIGd1YXJhbnRlZXMgdGhhdCBpdHMgaW5zdGFuY2VzIHdpbGwgbmV2ZXIgYmUgZGVhbGxvY2F0ZWQgKGFzIGlzCiAgICB0aGUgY2FzZSBmb3IgdGhlIHNpbmdsZXRvbnMgYGBOb25lYGAgYW5kIGBgRWxsaXBzaXNgYCkuCiAKLSAgIFRoZSBkZXN0cnVjdG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgOmNmdW5jOmBQeV9ERUNSRUZgIGFuZAotICAgOmNmdW5jOmBQeV9YREVDUkVGYCBtYWNyb3Mgd2hlbiB0aGUgbmV3IHJlZmVyZW5jZSBjb3VudCBpcyB6ZXJvLiAgQXQgdGhpcyBwb2ludCwKKyAgIFRoZSBkZXN0cnVjdG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgOmM6ZnVuYzpgUHlfREVDUkVGYCBhbmQKKyAgIDpjOmZ1bmM6YFB5X1hERUNSRUZgIG1hY3JvcyB3aGVuIHRoZSBuZXcgcmVmZXJlbmNlIGNvdW50IGlzIHplcm8uICBBdCB0aGlzIHBvaW50LAogICAgdGhlIGluc3RhbmNlIGlzIHN0aWxsIGluIGV4aXN0ZW5jZSwgYnV0IHRoZXJlIGFyZSBubyByZWZlcmVuY2VzIHRvIGl0LiAgVGhlCiAgICBkZXN0cnVjdG9yIGZ1bmN0aW9uIHNob3VsZCBmcmVlIGFsbCByZWZlcmVuY2VzIHdoaWNoIHRoZSBpbnN0YW5jZSBvd25zLCBmcmVlIGFsbAogICAgbWVtb3J5IGJ1ZmZlcnMgb3duZWQgYnkgdGhlIGluc3RhbmNlICh1c2luZyB0aGUgZnJlZWluZyBmdW5jdGlvbiBjb3JyZXNwb25kaW5nCiAgICB0byB0aGUgYWxsb2NhdGlvbiBmdW5jdGlvbiB1c2VkIHRvIGFsbG9jYXRlIHRoZSBidWZmZXIpLCBhbmQgZmluYWxseSAoYXMgaXRzCi0gICBsYXN0IGFjdGlvbikgY2FsbCB0aGUgdHlwZSdzIDphdHRyOmB0cF9mcmVlYCBmdW5jdGlvbi4gIElmIHRoZSB0eXBlIGlzIG5vdAorICAgbGFzdCBhY3Rpb24pIGNhbGwgdGhlIHR5cGUncyA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfZnJlZWAgZnVuY3Rpb24uICBJZiB0aGUgdHlwZSBpcyBub3QKICAgIHN1YnR5cGFibGUgKGRvZXNuJ3QgaGF2ZSB0aGUgOmNvbnN0OmBQeV9UUEZMQUdTX0JBU0VUWVBFYCBmbGFnIGJpdCBzZXQpLCBpdCBpcwogICAgcGVybWlzc2libGUgdG8gY2FsbCB0aGUgb2JqZWN0IGRlYWxsb2NhdG9yIGRpcmVjdGx5IGluc3RlYWQgb2YgdmlhCi0gICA6YXR0cjpgdHBfZnJlZWAuICBUaGUgb2JqZWN0IGRlYWxsb2NhdG9yIHNob3VsZCBiZSB0aGUgb25lIHVzZWQgdG8gYWxsb2NhdGUgdGhlCi0gICBpbnN0YW5jZTsgdGhpcyBpcyBub3JtYWxseSA6Y2Z1bmM6YFB5T2JqZWN0X0RlbGAgaWYgdGhlIGluc3RhbmNlIHdhcyBhbGxvY2F0ZWQKLSAgIHVzaW5nIDpjZnVuYzpgUHlPYmplY3RfTmV3YCBvciA6Y2Z1bmM6YFB5T2JqZWN0X1Zhck5ld2AsIG9yCi0gICA6Y2Z1bmM6YFB5T2JqZWN0X0dDX0RlbGAgaWYgdGhlIGluc3RhbmNlIHdhcyBhbGxvY2F0ZWQgdXNpbmcKLSAgIDpjZnVuYzpgUHlPYmplY3RfR0NfTmV3YCBvciA6Y2Z1bmM6YFB5T2JqZWN0X0dDX05ld1ZhcmAuCisgICA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfZnJlZWAuICBUaGUgb2JqZWN0IGRlYWxsb2NhdG9yIHNob3VsZCBiZSB0aGUgb25lIHVzZWQgdG8gYWxsb2NhdGUgdGhlCisgICBpbnN0YW5jZTsgdGhpcyBpcyBub3JtYWxseSA6YzpmdW5jOmBQeU9iamVjdF9EZWxgIGlmIHRoZSBpbnN0YW5jZSB3YXMgYWxsb2NhdGVkCisgICB1c2luZyA6YzpmdW5jOmBQeU9iamVjdF9OZXdgIG9yIDpjOmZ1bmM6YFB5T2JqZWN0X1Zhck5ld2AsIG9yCisgICA6YzpmdW5jOmBQeU9iamVjdF9HQ19EZWxgIGlmIHRoZSBpbnN0YW5jZSB3YXMgYWxsb2NhdGVkIHVzaW5nCisgICA6YzpmdW5jOmBQeU9iamVjdF9HQ19OZXdgIG9yIDpjOmZ1bmM6YFB5T2JqZWN0X0dDX05ld1ZhcmAuCiAKICAgIFRoaXMgZmllbGQgaXMgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzLgogCiAKLS4uIGNtZW1iZXI6OiBwcmludGZ1bmMgUHlUeXBlT2JqZWN0LnRwX3ByaW50CisuLiBjOm1lbWJlcjo6IHByaW50ZnVuYyBQeVR5cGVPYmplY3QudHBfcHJpbnQKIAogICAgQW4gb3B0aW9uYWwgcG9pbnRlciB0byB0aGUgaW5zdGFuY2UgcHJpbnQgZnVuY3Rpb24uCiAKICAgIFRoZSBwcmludCBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCB3aGVuIHRoZSBpbnN0YW5jZSBpcyBwcmludGVkIHRvIGEgKnJlYWwqIGZpbGU7Ci0gICB3aGVuIGl0IGlzIHByaW50ZWQgdG8gYSBwc2V1ZG8tZmlsZSAobGlrZSBhIDpjbGFzczpgU3RyaW5nSU9gIGluc3RhbmNlKSwgdGhlCi0gICBpbnN0YW5jZSdzIDphdHRyOmB0cF9yZXByYCBvciA6YXR0cjpgdHBfc3RyYCBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY29udmVydCBpdCB0bwotICAgYSBzdHJpbmcuICBUaGVzZSBhcmUgYWxzbyBjYWxsZWQgd2hlbiB0aGUgdHlwZSdzIDphdHRyOmB0cF9wcmludGAgZmllbGQgaXMKLSAgICpOVUxMKi4gIEEgdHlwZSBzaG91bGQgbmV2ZXIgaW1wbGVtZW50IDphdHRyOmB0cF9wcmludGAgaW4gYSB3YXkgdGhhdCBwcm9kdWNlcwotICAgZGlmZmVyZW50IG91dHB1dCB0aGFuIDphdHRyOmB0cF9yZXByYCBvciA6YXR0cjpgdHBfc3RyYCB3b3VsZC4KKyAgIHdoZW4gaXQgaXMgcHJpbnRlZCB0byBhIHBzZXVkby1maWxlIChsaWtlIGEgOmNsYXNzOmB+U3RyaW5nSU8uU3RyaW5nSU9gIGluc3RhbmNlKSwgdGhlCisgICBpbnN0YW5jZSdzIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9yZXByYCBvciA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfc3RyYCBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY29udmVydCBpdCB0bworICAgYSBzdHJpbmcuICBUaGVzZSBhcmUgYWxzbyBjYWxsZWQgd2hlbiB0aGUgdHlwZSdzIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9wcmludGAgZmllbGQgaXMKKyAgICpOVUxMKi4gIEEgdHlwZSBzaG91bGQgbmV2ZXIgaW1wbGVtZW50IDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9wcmludGAgaW4gYSB3YXkgdGhhdCBwcm9kdWNlcworICAgZGlmZmVyZW50IG91dHB1dCB0aGFuIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9yZXByYCBvciA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfc3RyYCB3b3VsZC4KIAotICAgVGhlIHByaW50IGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyA6Y2Z1bmM6YFB5T2JqZWN0X1ByaW50YDoKKyAgIFRoZSBwcmludCBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgYXMgOmM6ZnVuYzpgUHlPYmplY3RfUHJpbnRgOgogICAgYGBpbnQgdHBfcHJpbnQoUHlPYmplY3QgKnNlbGYsIEZJTEUgKmZpbGUsIGludCBmbGFncylgYC4gIFRoZSAqc2VsZiogYXJndW1lbnQgaXMKICAgIHRoZSBpbnN0YW5jZSB0byBiZSBwcmludGVkLiAgVGhlICpmaWxlKiBhcmd1bWVudCBpcyB0aGUgc3RkaW8gZmlsZSB0byB3aGljaCBpdAogICAgaXMgdG8gYmUgcHJpbnRlZC4gIFRoZSAqZmxhZ3MqIGFyZ3VtZW50IGlzIGNvbXBvc2VkIG9mIGZsYWcgYml0cy4gVGhlIG9ubHkgZmxhZwogICAgYml0IGN1cnJlbnRseSBkZWZpbmVkIGlzIDpjb25zdDpgUHlfUFJJTlRfUkFXYC4gV2hlbiB0aGUgOmNvbnN0OmBQeV9QUklOVF9SQVdgCi0gICBmbGFnIGJpdCBpcyBzZXQsIHRoZSBpbnN0YW5jZSBzaG91bGQgYmUgcHJpbnRlZCB0aGUgc2FtZSB3YXkgYXMgOmF0dHI6YHRwX3N0cmAKKyAgIGZsYWcgYml0IGlzIHNldCwgdGhlIGluc3RhbmNlIHNob3VsZCBiZSBwcmludGVkIHRoZSBzYW1lIHdheSBhcyA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfc3RyYAogICAgd291bGQgZm9ybWF0IGl0OyB3aGVuIHRoZSA6Y29uc3Q6YFB5X1BSSU5UX1JBV2AgZmxhZyBiaXQgaXMgY2xlYXIsIHRoZSBpbnN0YW5jZQotICAgc2hvdWxkIGJlIHByaW50ZWQgdGhlIHNhbWUgd2FzIGFzIDphdHRyOmB0cF9yZXByYCB3b3VsZCBmb3JtYXQgaXQuIEl0IHNob3VsZAorICAgc2hvdWxkIGJlIHByaW50ZWQgdGhlIHNhbWUgd2FzIGFzIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9yZXByYCB3b3VsZCBmb3JtYXQgaXQuIEl0IHNob3VsZAogICAgcmV0dXJuIGBgLTFgYCBhbmQgc2V0IGFuIGV4Y2VwdGlvbiBjb25kaXRpb24gd2hlbiBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlCiAgICBjb21wYXJpc29uLgogCi0gICBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSA6YXR0cjpgdHBfcHJpbnRgIGZpZWxkIHdpbGwgYmUgZGVwcmVjYXRlZC4gSW4gYW55IGNhc2UsCi0gICBpdCBpcyByZWNvbW1lbmRlZCBub3QgdG8gZGVmaW5lIDphdHRyOmB0cF9wcmludGAsIGJ1dCBpbnN0ZWFkIHRvIHJlbHkgb24KLSAgIDphdHRyOmB0cF9yZXByYCBhbmQgOmF0dHI6YHRwX3N0cmAgZm9yIHByaW50aW5nLgorICAgSXQgaXMgcG9zc2libGUgdGhhdCB0aGUgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX3ByaW50YCBmaWVsZCB3aWxsIGJlIGRlcHJlY2F0ZWQuIEluIGFueSBjYXNlLAorICAgaXQgaXMgcmVjb21tZW5kZWQgbm90IHRvIGRlZmluZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfcHJpbnRgLCBidXQgaW5zdGVhZCB0byByZWx5IG9uCisgICA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfcmVwcmAgYW5kIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9zdHJgIGZvciBwcmludGluZy4KIAogICAgVGhpcyBmaWVsZCBpcyBpbmhlcml0ZWQgYnkgc3VidHlwZXMuCiAKIAotLi4gY21lbWJlcjo6IGdldGF0dHJmdW5jIFB5VHlwZU9iamVjdC50cF9nZXRhdHRyCisuLiBjOm1lbWJlcjo6IGdldGF0dHJmdW5jIFB5VHlwZU9iamVjdC50cF9nZXRhdHRyCiAKICAgIEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gdGhlIGdldC1hdHRyaWJ1dGUtc3RyaW5nIGZ1bmN0aW9uLgogCiAgICBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQuICBXaGVuIGl0IGlzIGRlZmluZWQsIGl0IHNob3VsZCBwb2ludCB0byBhIGZ1bmN0aW9uCi0gICB0aGF0IGFjdHMgdGhlIHNhbWUgYXMgdGhlIDphdHRyOmB0cF9nZXRhdHRyb2AgZnVuY3Rpb24sIGJ1dCB0YWtpbmcgYSBDIHN0cmluZworICAgdGhhdCBhY3RzIHRoZSBzYW1lIGFzIHRoZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfZ2V0YXR0cm9gIGZ1bmN0aW9uLCBidXQgdGFraW5nIGEgQyBzdHJpbmcKICAgIGluc3RlYWQgb2YgYSBQeXRob24gc3RyaW5nIG9iamVjdCB0byBnaXZlIHRoZSBhdHRyaWJ1dGUgbmFtZS4gIFRoZSBzaWduYXR1cmUgaXMKLSAgIHRoZSBzYW1lIGFzIGZvciA6Y2Z1bmM6YFB5T2JqZWN0X0dldEF0dHJTdHJpbmdgLgorICAgdGhlIHNhbWUgYXMgZm9yIDpjOmZ1bmM6YFB5T2JqZWN0X0dldEF0dHJTdHJpbmdgLgogCi0gICBUaGlzIGZpZWxkIGlzIGluaGVyaXRlZCBieSBzdWJ0eXBlcyB0b2dldGhlciB3aXRoIDphdHRyOmB0cF9nZXRhdHRyb2A6IGEgc3VidHlwZQotICAgaW5oZXJpdHMgYm90aCA6YXR0cjpgdHBfZ2V0YXR0cmAgYW5kIDphdHRyOmB0cF9nZXRhdHRyb2AgZnJvbSBpdHMgYmFzZSB0eXBlIHdoZW4KLSAgIHRoZSBzdWJ0eXBlJ3MgOmF0dHI6YHRwX2dldGF0dHJgIGFuZCA6YXR0cjpgdHBfZ2V0YXR0cm9gIGFyZSBib3RoICpOVUxMKi4KKyAgIFRoaXMgZmllbGQgaXMgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzIHRvZ2V0aGVyIHdpdGggOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2dldGF0dHJvYDogYSBzdWJ0eXBlCisgICBpbmhlcml0cyBib3RoIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9nZXRhdHRyYCBhbmQgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2dldGF0dHJvYCBmcm9tIGl0cyBiYXNlIHR5cGUgd2hlbgorICAgdGhlIHN1YnR5cGUncyA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfZ2V0YXR0cmAgYW5kIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9nZXRhdHRyb2AgYXJlIGJvdGggKk5VTEwqLgogCiAKLS4uIGNtZW1iZXI6OiBzZXRhdHRyZnVuYyBQeVR5cGVPYmplY3QudHBfc2V0YXR0cgorLi4gYzptZW1iZXI6OiBzZXRhdHRyZnVuYyBQeVR5cGVPYmplY3QudHBfc2V0YXR0cgogCiAgICBBbiBvcHRpb25hbCBwb2ludGVyIHRvIHRoZSBzZXQtYXR0cmlidXRlLXN0cmluZyBmdW5jdGlvbi4KIAogICAgVGhpcyBmaWVsZCBpcyBkZXByZWNhdGVkLiAgV2hlbiBpdCBpcyBkZWZpbmVkLCBpdCBzaG91bGQgcG9pbnQgdG8gYSBmdW5jdGlvbgotICAgdGhhdCBhY3RzIHRoZSBzYW1lIGFzIHRoZSA6YXR0cjpgdHBfc2V0YXR0cm9gIGZ1bmN0aW9uLCBidXQgdGFraW5nIGEgQyBzdHJpbmcKKyAgIHRoYXQgYWN0cyB0aGUgc2FtZSBhcyB0aGUgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX3NldGF0dHJvYCBmdW5jdGlvbiwgYnV0IHRha2luZyBhIEMgc3RyaW5nCiAgICBpbnN0ZWFkIG9mIGEgUHl0aG9uIHN0cmluZyBvYmplY3QgdG8gZ2l2ZSB0aGUgYXR0cmlidXRlIG5hbWUuICBUaGUgc2lnbmF0dXJlIGlzCi0gICB0aGUgc2FtZSBhcyBmb3IgOmNmdW5jOmBQeU9iamVjdF9TZXRBdHRyU3RyaW5nYC4KKyAgIHRoZSBzYW1lIGFzIGZvciA6YzpmdW5jOmBQeU9iamVjdF9TZXRBdHRyU3RyaW5nYC4KIAotICAgVGhpcyBmaWVsZCBpcyBpbmhlcml0ZWQgYnkgc3VidHlwZXMgdG9nZXRoZXIgd2l0aCA6YXR0cjpgdHBfc2V0YXR0cm9gOiBhIHN1YnR5cGUKLSAgIGluaGVyaXRzIGJvdGggOmF0dHI6YHRwX3NldGF0dHJgIGFuZCA6YXR0cjpgdHBfc2V0YXR0cm9gIGZyb20gaXRzIGJhc2UgdHlwZSB3aGVuCi0gICB0aGUgc3VidHlwZSdzIDphdHRyOmB0cF9zZXRhdHRyYCBhbmQgOmF0dHI6YHRwX3NldGF0dHJvYCBhcmUgYm90aCAqTlVMTCouCisgICBUaGlzIGZpZWxkIGlzIGluaGVyaXRlZCBieSBzdWJ0eXBlcyB0b2dldGhlciB3aXRoIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9zZXRhdHRyb2A6IGEgc3VidHlwZQorICAgaW5oZXJpdHMgYm90aCA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfc2V0YXR0cmAgYW5kIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9zZXRhdHRyb2AgZnJvbSBpdHMgYmFzZSB0eXBlIHdoZW4KKyAgIHRoZSBzdWJ0eXBlJ3MgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX3NldGF0dHJgIGFuZCA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfc2V0YXR0cm9gIGFyZSBib3RoICpOVUxMKi4KIAogCi0uLiBjbWVtYmVyOjogY21wZnVuYyBQeVR5cGVPYmplY3QudHBfY29tcGFyZQorLi4gYzptZW1iZXI6OiBjbXBmdW5jIFB5VHlwZU9iamVjdC50cF9jb21wYXJlCiAKICAgIEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gdGhlIHRocmVlLXdheSBjb21wYXJpc29uIGZ1bmN0aW9uLgogCi0gICBUaGUgc2lnbmF0dXJlIGlzIHRoZSBzYW1lIGFzIGZvciA6Y2Z1bmM6YFB5T2JqZWN0X0NvbXBhcmVgLiBUaGUgZnVuY3Rpb24gc2hvdWxkCisgICBUaGUgc2lnbmF0dXJlIGlzIHRoZSBzYW1lIGFzIGZvciA6YzpmdW5jOmBQeU9iamVjdF9Db21wYXJlYC4gVGhlIGZ1bmN0aW9uIHNob3VsZAogICAgcmV0dXJuIGBgMWBgIGlmICpzZWxmKiBncmVhdGVyIHRoYW4gKm90aGVyKiwgYGAwYGAgaWYgKnNlbGYqIGlzIGVxdWFsIHRvCiAgICAqb3RoZXIqLCBhbmQgYGAtMWBgIGlmICpzZWxmKiBsZXNzIHRoYW4gKm90aGVyKi4gIEl0IHNob3VsZCByZXR1cm4gYGAtMWBgIGFuZAogICAgc2V0IGFuIGV4Y2VwdGlvbiBjb25kaXRpb24gd2hlbiBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIGNvbXBhcmlzb24uCiAKLSAgIFRoaXMgZmllbGQgaXMgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzIHRvZ2V0aGVyIHdpdGggOmF0dHI6YHRwX3JpY2hjb21wYXJlYCBhbmQKLSAgIDphdHRyOmB0cF9oYXNoYDogYSBzdWJ0eXBlcyBpbmhlcml0cyBhbGwgdGhyZWUgb2YgOmF0dHI6YHRwX2NvbXBhcmVgLAotICAgOmF0dHI6YHRwX3JpY2hjb21wYXJlYCwgYW5kIDphdHRyOmB0cF9oYXNoYCB3aGVuIHRoZSBzdWJ0eXBlJ3MKLSAgIDphdHRyOmB0cF9jb21wYXJlYCwgOmF0dHI6YHRwX3JpY2hjb21wYXJlYCwgYW5kIDphdHRyOmB0cF9oYXNoYCBhcmUgYWxsICpOVUxMKi4KKyAgIFRoaXMgZmllbGQgaXMgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzIHRvZ2V0aGVyIHdpdGggOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX3JpY2hjb21wYXJlYCBhbmQKKyAgIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9oYXNoYDogYSBzdWJ0eXBlcyBpbmhlcml0cyBhbGwgdGhyZWUgb2YgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2NvbXBhcmVgLAorICAgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX3JpY2hjb21wYXJlYCwgYW5kIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9oYXNoYCB3aGVuIHRoZSBzdWJ0eXBlJ3MKKyAgIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9jb21wYXJlYCwgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX3JpY2hjb21wYXJlYCwgYW5kIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9oYXNoYCBhcmUgYWxsICpOVUxMKi4KIAogCi0uLiBjbWVtYmVyOjogcmVwcmZ1bmMgUHlUeXBlT2JqZWN0LnRwX3JlcHIKKy4uIGM6bWVtYmVyOjogcmVwcmZ1bmMgUHlUeXBlT2JqZWN0LnRwX3JlcHIKIAogICAgLi4gaW5kZXg6OiBidWlsdGluOiByZXByCiAKICAgIEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uCiAgICA6ZnVuYzpgcmVwcmAuCiAKLSAgIFRoZSBzaWduYXR1cmUgaXMgdGhlIHNhbWUgYXMgZm9yIDpjZnVuYzpgUHlPYmplY3RfUmVwcmA7IGl0IG11c3QgcmV0dXJuIGEgc3RyaW5nCisgICBUaGUgc2lnbmF0dXJlIGlzIHRoZSBzYW1lIGFzIGZvciA6YzpmdW5jOmBQeU9iamVjdF9SZXByYDsgaXQgbXVzdCByZXR1cm4gYSBzdHJpbmcKICAgIG9yIGEgVW5pY29kZSBvYmplY3QuICBJZGVhbGx5LCB0aGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYSBzdHJpbmcgdGhhdCwgd2hlbgogICAgcGFzc2VkIHRvIDpmdW5jOmBldmFsYCwgZ2l2ZW4gYSBzdWl0YWJsZSBlbnZpcm9ubWVudCwgcmV0dXJucyBhbiBvYmplY3Qgd2l0aCB0aGUKICAgIHNhbWUgdmFsdWUuICBJZiB0aGlzIGlzIG5vdCBmZWFzaWJsZSwgaXQgc2hvdWxkIHJldHVybiBhIHN0cmluZyBzdGFydGluZyB3aXRoCkBAIC0yODYsMTM2ICsyODYsMTM2IEBACiAKICAgIFRoaXMgZmllbGQgaXMgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzLgogCi0uLiBjbWVtYmVyOjogUHlOdW1iZXJNZXRob2RzKiB0cF9hc19udW1iZXIKKy4uIGM6bWVtYmVyOjogUHlOdW1iZXJNZXRob2RzKiB0cF9hc19udW1iZXIKIAogICAgUG9pbnRlciB0byBhbiBhZGRpdGlvbmFsIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIGZpZWxkcyByZWxldmFudCBvbmx5IHRvCiAgICBvYmplY3RzIHdoaWNoIGltcGxlbWVudCB0aGUgbnVtYmVyIHByb3RvY29sLiAgVGhlc2UgZmllbGRzIGFyZSBkb2N1bWVudGVkIGluCiAgICA6cmVmOmBudW1iZXItc3RydWN0c2AuCiAKLSAgIFRoZSA6YXR0cjpgdHBfYXNfbnVtYmVyYCBmaWVsZCBpcyBub3QgaW5oZXJpdGVkLCBidXQgdGhlIGNvbnRhaW5lZCBmaWVsZHMgYXJlCisgICBUaGUgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2FzX251bWJlcmAgZmllbGQgaXMgbm90IGluaGVyaXRlZCwgYnV0IHRoZSBjb250YWluZWQgZmllbGRzIGFyZQogICAgaW5oZXJpdGVkIGluZGl2aWR1YWxseS4KIAogCi0uLiBjbWVtYmVyOjogUHlTZXF1ZW5jZU1ldGhvZHMqIHRwX2FzX3NlcXVlbmNlCisuLiBjOm1lbWJlcjo6IFB5U2VxdWVuY2VNZXRob2RzKiB0cF9hc19zZXF1ZW5jZQogCiAgICBQb2ludGVyIHRvIGFuIGFkZGl0aW9uYWwgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgZmllbGRzIHJlbGV2YW50IG9ubHkgdG8KICAgIG9iamVjdHMgd2hpY2ggaW1wbGVtZW50IHRoZSBzZXF1ZW5jZSBwcm90b2NvbC4gIFRoZXNlIGZpZWxkcyBhcmUgZG9jdW1lbnRlZAogICAgaW4gOnJlZjpgc2VxdWVuY2Utc3RydWN0c2AuCiAKLSAgIFRoZSA6YXR0cjpgdHBfYXNfc2VxdWVuY2VgIGZpZWxkIGlzIG5vdCBpbmhlcml0ZWQsIGJ1dCB0aGUgY29udGFpbmVkIGZpZWxkcworICAgVGhlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9hc19zZXF1ZW5jZWAgZmllbGQgaXMgbm90IGluaGVyaXRlZCwgYnV0IHRoZSBjb250YWluZWQgZmllbGRzCiAgICBhcmUgaW5oZXJpdGVkIGluZGl2aWR1YWxseS4KIAogCi0uLiBjbWVtYmVyOjogUHlNYXBwaW5nTWV0aG9kcyogdHBfYXNfbWFwcGluZworLi4gYzptZW1iZXI6OiBQeU1hcHBpbmdNZXRob2RzKiB0cF9hc19tYXBwaW5nCiAKICAgIFBvaW50ZXIgdG8gYW4gYWRkaXRpb25hbCBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBmaWVsZHMgcmVsZXZhbnQgb25seSB0bwogICAgb2JqZWN0cyB3aGljaCBpbXBsZW1lbnQgdGhlIG1hcHBpbmcgcHJvdG9jb2wuICBUaGVzZSBmaWVsZHMgYXJlIGRvY3VtZW50ZWQgaW4KICAgIDpyZWY6YG1hcHBpbmctc3RydWN0c2AuCiAKLSAgIFRoZSA6YXR0cjpgdHBfYXNfbWFwcGluZ2AgZmllbGQgaXMgbm90IGluaGVyaXRlZCwgYnV0IHRoZSBjb250YWluZWQgZmllbGRzCisgICBUaGUgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2FzX21hcHBpbmdgIGZpZWxkIGlzIG5vdCBpbmhlcml0ZWQsIGJ1dCB0aGUgY29udGFpbmVkIGZpZWxkcwogICAgYXJlIGluaGVyaXRlZCBpbmRpdmlkdWFsbHkuCiAKIAotLi4gY21lbWJlcjo6IGhhc2hmdW5jIFB5VHlwZU9iamVjdC50cF9oYXNoCisuLiBjOm1lbWJlcjo6IGhhc2hmdW5jIFB5VHlwZU9iamVjdC50cF9oYXNoCiAKICAgIC4uIGluZGV4OjogYnVpbHRpbjogaGFzaAogCiAgICBBbiBvcHRpb25hbCBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCBpbXBsZW1lbnRzIHRoZSBidWlsdC1pbiBmdW5jdGlvbgogICAgOmZ1bmM6YGhhc2hgLgogCi0gICBUaGUgc2lnbmF0dXJlIGlzIHRoZSBzYW1lIGFzIGZvciA6Y2Z1bmM6YFB5T2JqZWN0X0hhc2hgOyBpdCBtdXN0IHJldHVybiBhIEMKKyAgIFRoZSBzaWduYXR1cmUgaXMgdGhlIHNhbWUgYXMgZm9yIDpjOmZ1bmM6YFB5T2JqZWN0X0hhc2hgOyBpdCBtdXN0IHJldHVybiBhIEMKICAgIGxvbmcuICBUaGUgdmFsdWUgYGAtMWBgIHNob3VsZCBub3QgYmUgcmV0dXJuZWQgYXMgYSBub3JtYWwgcmV0dXJuIHZhbHVlOyB3aGVuIGFuCiAgICBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBjb21wdXRhdGlvbiBvZiB0aGUgaGFzaCB2YWx1ZSwgdGhlIGZ1bmN0aW9uIHNob3VsZCBzZXQKICAgIGFuIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIGBgLTFgYC4KIAotICAgVGhpcyBmaWVsZCBjYW4gYmUgc2V0IGV4cGxpY2l0bHkgdG8gOmNmdW5jOmBQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWRgIHRvCisgICBUaGlzIGZpZWxkIGNhbiBiZSBzZXQgZXhwbGljaXRseSB0byA6YzpmdW5jOmBQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWRgIHRvCiAgICBibG9jayBpbmhlcml0YW5jZSBvZiB0aGUgaGFzaCBtZXRob2QgZnJvbSBhIHBhcmVudCB0eXBlLiBUaGlzIGlzIGludGVycHJldGVkCiAgICBhcyB0aGUgZXF1aXZhbGVudCBvZiBgYF9faGFzaF9fID0gTm9uZWBgIGF0IHRoZSBQeXRob24gbGV2ZWwsIGNhdXNpbmcKICAgIGBgaXNpbnN0YW5jZShvLCBjb2xsZWN0aW9ucy5IYXNoYWJsZSlgYCB0byBjb3JyZWN0bHkgcmV0dXJuIGBgRmFsc2VgYC4gTm90ZQogICAgdGhhdCB0aGUgY29udmVyc2UgaXMgYWxzbyB0cnVlIC0gc2V0dGluZyBgYF9faGFzaF9fID0gTm9uZWBgIG9uIGEgY2xhc3MgYXQKICAgIHRoZSBQeXRob24gbGV2ZWwgd2lsbCByZXN1bHQgaW4gdGhlIGBgdHBfaGFzaGBgIHNsb3QgYmVpbmcgc2V0IHRvCi0gICA6Y2Z1bmM6YFB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZGAuCisgICA6YzpmdW5jOmBQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWRgLgogCi0gICBXaGVuIHRoaXMgZmllbGQgaXMgbm90IHNldCwgdHdvIHBvc3NpYmlsaXRpZXMgZXhpc3Q6IGlmIHRoZSA6YXR0cjpgdHBfY29tcGFyZWAKLSAgIGFuZCA6YXR0cjpgdHBfcmljaGNvbXBhcmVgIGZpZWxkcyBhcmUgYm90aCAqTlVMTCosIGEgZGVmYXVsdCBoYXNoIHZhbHVlIGJhc2VkIG9uCisgICBXaGVuIHRoaXMgZmllbGQgaXMgbm90IHNldCwgdHdvIHBvc3NpYmlsaXRpZXMgZXhpc3Q6IGlmIHRoZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfY29tcGFyZWAKKyAgIGFuZCA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfcmljaGNvbXBhcmVgIGZpZWxkcyBhcmUgYm90aCAqTlVMTCosIGEgZGVmYXVsdCBoYXNoIHZhbHVlIGJhc2VkIG9uCiAgICB0aGUgb2JqZWN0J3MgYWRkcmVzcyBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlLCBhIDpleGM6YFR5cGVFcnJvcmAgaXMgcmFpc2VkLgogCi0gICBUaGlzIGZpZWxkIGlzIGluaGVyaXRlZCBieSBzdWJ0eXBlcyB0b2dldGhlciB3aXRoIDphdHRyOmB0cF9yaWNoY29tcGFyZWAgYW5kCi0gICA6YXR0cjpgdHBfY29tcGFyZWA6IGEgc3VidHlwZXMgaW5oZXJpdHMgYWxsIHRocmVlIG9mIDphdHRyOmB0cF9jb21wYXJlYCwKLSAgIDphdHRyOmB0cF9yaWNoY29tcGFyZWAsIGFuZCA6YXR0cjpgdHBfaGFzaGAsIHdoZW4gdGhlIHN1YnR5cGUncwotICAgOmF0dHI6YHRwX2NvbXBhcmVgLCA6YXR0cjpgdHBfcmljaGNvbXBhcmVgIGFuZCA6YXR0cjpgdHBfaGFzaGAgYXJlIGFsbCAqTlVMTCouCisgICBUaGlzIGZpZWxkIGlzIGluaGVyaXRlZCBieSBzdWJ0eXBlcyB0b2dldGhlciB3aXRoIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9yaWNoY29tcGFyZWAgYW5kCisgICA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfY29tcGFyZWA6IGEgc3VidHlwZXMgaW5oZXJpdHMgYWxsIHRocmVlIG9mIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9jb21wYXJlYCwKKyAgIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9yaWNoY29tcGFyZWAsIGFuZCA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfaGFzaGAsIHdoZW4gdGhlIHN1YnR5cGUncworICAgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2NvbXBhcmVgLCA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfcmljaGNvbXBhcmVgIGFuZCA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfaGFzaGAgYXJlIGFsbCAqTlVMTCouCiAKIAotLi4gY21lbWJlcjo6IHRlcm5hcnlmdW5jIFB5VHlwZU9iamVjdC50cF9jYWxsCisuLiBjOm1lbWJlcjo6IHRlcm5hcnlmdW5jIFB5VHlwZU9iamVjdC50cF9jYWxsCiAKICAgIEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgY2FsbGluZyB0aGUgb2JqZWN0LiAgVGhpcwogICAgc2hvdWxkIGJlICpOVUxMKiBpZiB0aGUgb2JqZWN0IGlzIG5vdCBjYWxsYWJsZS4gIFRoZSBzaWduYXR1cmUgaXMgdGhlIHNhbWUgYXMKLSAgIGZvciA6Y2Z1bmM6YFB5T2JqZWN0X0NhbGxgLgorICAgZm9yIDpjOmZ1bmM6YFB5T2JqZWN0X0NhbGxgLgogCiAgICBUaGlzIGZpZWxkIGlzIGluaGVyaXRlZCBieSBzdWJ0eXBlcy4KIAogCi0uLiBjbWVtYmVyOjogcmVwcmZ1bmMgUHlUeXBlT2JqZWN0LnRwX3N0cgorLi4gYzptZW1iZXI6OiByZXByZnVuYyBQeVR5cGVPYmplY3QudHBfc3RyCiAKICAgIEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgdGhlIGJ1aWx0LWluIG9wZXJhdGlvbgogICAgOmZ1bmM6YHN0cmAuICAoTm90ZSB0aGF0IDpjbGFzczpgc3RyYCBpcyBhIHR5cGUgbm93LCBhbmQgOmZ1bmM6YHN0cmAgY2FsbHMgdGhlCi0gICBjb25zdHJ1Y3RvciBmb3IgdGhhdCB0eXBlLiAgVGhpcyBjb25zdHJ1Y3RvciBjYWxscyA6Y2Z1bmM6YFB5T2JqZWN0X1N0cmAgdG8gZG8KLSAgIHRoZSBhY3R1YWwgd29yaywgYW5kIDpjZnVuYzpgUHlPYmplY3RfU3RyYCB3aWxsIGNhbGwgdGhpcyBoYW5kbGVyLikKKyAgIGNvbnN0cnVjdG9yIGZvciB0aGF0IHR5cGUuICBUaGlzIGNvbnN0cnVjdG9yIGNhbGxzIDpjOmZ1bmM6YFB5T2JqZWN0X1N0cmAgdG8gZG8KKyAgIHRoZSBhY3R1YWwgd29yaywgYW5kIDpjOmZ1bmM6YFB5T2JqZWN0X1N0cmAgd2lsbCBjYWxsIHRoaXMgaGFuZGxlci4pCiAKLSAgIFRoZSBzaWduYXR1cmUgaXMgdGhlIHNhbWUgYXMgZm9yIDpjZnVuYzpgUHlPYmplY3RfU3RyYDsgaXQgbXVzdCByZXR1cm4gYSBzdHJpbmcKKyAgIFRoZSBzaWduYXR1cmUgaXMgdGhlIHNhbWUgYXMgZm9yIDpjOmZ1bmM6YFB5T2JqZWN0X1N0cmA7IGl0IG11c3QgcmV0dXJuIGEgc3RyaW5nCiAgICBvciBhIFVuaWNvZGUgb2JqZWN0LiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGEgImZyaWVuZGx5IiBzdHJpbmcKICAgIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QsIGFzIHRoaXMgaXMgdGhlIHJlcHJlc2VudGF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIGJ5CiAgICB0aGUgcHJpbnQgc3RhdGVtZW50LgogCi0gICBXaGVuIHRoaXMgZmllbGQgaXMgbm90IHNldCwgOmNmdW5jOmBQeU9iamVjdF9SZXByYCBpcyBjYWxsZWQgdG8gcmV0dXJuIGEgc3RyaW5nCisgICBXaGVuIHRoaXMgZmllbGQgaXMgbm90IHNldCwgOmM6ZnVuYzpgUHlPYmplY3RfUmVwcmAgaXMgY2FsbGVkIHRvIHJldHVybiBhIHN0cmluZwogICAgcmVwcmVzZW50YXRpb24uCiAKICAgIFRoaXMgZmllbGQgaXMgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzLgogCiAKLS4uIGNtZW1iZXI6OiBnZXRhdHRyb2Z1bmMgUHlUeXBlT2JqZWN0LnRwX2dldGF0dHJvCisuLiBjOm1lbWJlcjo6IGdldGF0dHJvZnVuYyBQeVR5cGVPYmplY3QudHBfZ2V0YXR0cm8KIAogICAgQW4gb3B0aW9uYWwgcG9pbnRlciB0byB0aGUgZ2V0LWF0dHJpYnV0ZSBmdW5jdGlvbi4KIAotICAgVGhlIHNpZ25hdHVyZSBpcyB0aGUgc2FtZSBhcyBmb3IgOmNmdW5jOmBQeU9iamVjdF9HZXRBdHRyYC4gIEl0IGlzIHVzdWFsbHkKLSAgIGNvbnZlbmllbnQgdG8gc2V0IHRoaXMgZmllbGQgdG8gOmNmdW5jOmBQeU9iamVjdF9HZW5lcmljR2V0QXR0cmAsIHdoaWNoCisgICBUaGUgc2lnbmF0dXJlIGlzIHRoZSBzYW1lIGFzIGZvciA6YzpmdW5jOmBQeU9iamVjdF9HZXRBdHRyYC4gIEl0IGlzIHVzdWFsbHkKKyAgIGNvbnZlbmllbnQgdG8gc2V0IHRoaXMgZmllbGQgdG8gOmM6ZnVuYzpgUHlPYmplY3RfR2VuZXJpY0dldEF0dHJgLCB3aGljaAogICAgaW1wbGVtZW50cyB0aGUgbm9ybWFsIHdheSBvZiBsb29raW5nIGZvciBvYmplY3QgYXR0cmlidXRlcy4KIAotICAgVGhpcyBmaWVsZCBpcyBpbmhlcml0ZWQgYnkgc3VidHlwZXMgdG9nZXRoZXIgd2l0aCA6YXR0cjpgdHBfZ2V0YXR0cmA6IGEgc3VidHlwZQotICAgaW5oZXJpdHMgYm90aCA6YXR0cjpgdHBfZ2V0YXR0cmAgYW5kIDphdHRyOmB0cF9nZXRhdHRyb2AgZnJvbSBpdHMgYmFzZSB0eXBlIHdoZW4KLSAgIHRoZSBzdWJ0eXBlJ3MgOmF0dHI6YHRwX2dldGF0dHJgIGFuZCA6YXR0cjpgdHBfZ2V0YXR0cm9gIGFyZSBib3RoICpOVUxMKi4KKyAgIFRoaXMgZmllbGQgaXMgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzIHRvZ2V0aGVyIHdpdGggOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2dldGF0dHJgOiBhIHN1YnR5cGUKKyAgIGluaGVyaXRzIGJvdGggOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2dldGF0dHJgIGFuZCA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfZ2V0YXR0cm9gIGZyb20gaXRzIGJhc2UgdHlwZSB3aGVuCisgICB0aGUgc3VidHlwZSdzIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9nZXRhdHRyYCBhbmQgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2dldGF0dHJvYCBhcmUgYm90aCAqTlVMTCouCiAKIAotLi4gY21lbWJlcjo6IHNldGF0dHJvZnVuYyBQeVR5cGVPYmplY3QudHBfc2V0YXR0cm8KKy4uIGM6bWVtYmVyOjogc2V0YXR0cm9mdW5jIFB5VHlwZU9iamVjdC50cF9zZXRhdHRybwogCiAgICBBbiBvcHRpb25hbCBwb2ludGVyIHRvIHRoZSBzZXQtYXR0cmlidXRlIGZ1bmN0aW9uLgogCi0gICBUaGUgc2lnbmF0dXJlIGlzIHRoZSBzYW1lIGFzIGZvciA6Y2Z1bmM6YFB5T2JqZWN0X1NldEF0dHJgLiAgSXQgaXMgdXN1YWxseQotICAgY29udmVuaWVudCB0byBzZXQgdGhpcyBmaWVsZCB0byA6Y2Z1bmM6YFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyYCwgd2hpY2gKKyAgIFRoZSBzaWduYXR1cmUgaXMgdGhlIHNhbWUgYXMgZm9yIDpjOmZ1bmM6YFB5T2JqZWN0X1NldEF0dHJgLiAgSXQgaXMgdXN1YWxseQorICAgY29udmVuaWVudCB0byBzZXQgdGhpcyBmaWVsZCB0byA6YzpmdW5jOmBQeU9iamVjdF9HZW5lcmljU2V0QXR0cmAsIHdoaWNoCiAgICBpbXBsZW1lbnRzIHRoZSBub3JtYWwgd2F5IG9mIHNldHRpbmcgb2JqZWN0IGF0dHJpYnV0ZXMuCiAKLSAgIFRoaXMgZmllbGQgaXMgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzIHRvZ2V0aGVyIHdpdGggOmF0dHI6YHRwX3NldGF0dHJgOiBhIHN1YnR5cGUKLSAgIGluaGVyaXRzIGJvdGggOmF0dHI6YHRwX3NldGF0dHJgIGFuZCA6YXR0cjpgdHBfc2V0YXR0cm9gIGZyb20gaXRzIGJhc2UgdHlwZSB3aGVuCi0gICB0aGUgc3VidHlwZSdzIDphdHRyOmB0cF9zZXRhdHRyYCBhbmQgOmF0dHI6YHRwX3NldGF0dHJvYCBhcmUgYm90aCAqTlVMTCouCisgICBUaGlzIGZpZWxkIGlzIGluaGVyaXRlZCBieSBzdWJ0eXBlcyB0b2dldGhlciB3aXRoIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9zZXRhdHRyYDogYSBzdWJ0eXBlCisgICBpbmhlcml0cyBib3RoIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9zZXRhdHRyYCBhbmQgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX3NldGF0dHJvYCBmcm9tIGl0cyBiYXNlIHR5cGUgd2hlbgorICAgdGhlIHN1YnR5cGUncyA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfc2V0YXR0cmAgYW5kIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9zZXRhdHRyb2AgYXJlIGJvdGggKk5VTEwqLgogCiAKLS4uIGNtZW1iZXI6OiBQeUJ1ZmZlclByb2NzKiBQeVR5cGVPYmplY3QudHBfYXNfYnVmZmVyCisuLiBjOm1lbWJlcjo6IFB5QnVmZmVyUHJvY3MqIFB5VHlwZU9iamVjdC50cF9hc19idWZmZXIKIAogICAgUG9pbnRlciB0byBhbiBhZGRpdGlvbmFsIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIGZpZWxkcyByZWxldmFudCBvbmx5IHRvIG9iamVjdHMKICAgIHdoaWNoIGltcGxlbWVudCB0aGUgYnVmZmVyIGludGVyZmFjZS4gIFRoZXNlIGZpZWxkcyBhcmUgZG9jdW1lbnRlZCBpbgogICAgOnJlZjpgYnVmZmVyLXN0cnVjdHNgLgogCi0gICBUaGUgOmF0dHI6YHRwX2FzX2J1ZmZlcmAgZmllbGQgaXMgbm90IGluaGVyaXRlZCwgYnV0IHRoZSBjb250YWluZWQgZmllbGRzIGFyZQorICAgVGhlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9hc19idWZmZXJgIGZpZWxkIGlzIG5vdCBpbmhlcml0ZWQsIGJ1dCB0aGUgY29udGFpbmVkIGZpZWxkcyBhcmUKICAgIGluaGVyaXRlZCBpbmRpdmlkdWFsbHkuCiAKIAotLi4gY21lbWJlcjo6IGxvbmcgUHlUeXBlT2JqZWN0LnRwX2ZsYWdzCisuLiBjOm1lbWJlcjo6IGxvbmcgUHlUeXBlT2JqZWN0LnRwX2ZsYWdzCiAKICAgIFRoaXMgZmllbGQgaXMgYSBiaXQgbWFzayBvZiB2YXJpb3VzIGZsYWdzLiAgU29tZSBmbGFncyBpbmRpY2F0ZSB2YXJpYW50CiAgICBzZW1hbnRpY3MgZm9yIGNlcnRhaW4gc2l0dWF0aW9uczsgb3RoZXJzIGFyZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgY2VydGFpbgogICAgZmllbGRzIGluIHRoZSB0eXBlIG9iamVjdCAob3IgaW4gdGhlIGV4dGVuc2lvbiBzdHJ1Y3R1cmVzIHJlZmVyZW5jZWQgdmlhCi0gICA6YXR0cjpgdHBfYXNfbnVtYmVyYCwgOmF0dHI6YHRwX2FzX3NlcXVlbmNlYCwgOmF0dHI6YHRwX2FzX21hcHBpbmdgLCBhbmQKLSAgIDphdHRyOmB0cF9hc19idWZmZXJgKSB0aGF0IHdlcmUgaGlzdG9yaWNhbGx5IG5vdCBhbHdheXMgcHJlc2VudCBhcmUgdmFsaWQ7IGlmCisgICA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfYXNfbnVtYmVyYCwgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2FzX3NlcXVlbmNlYCwgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2FzX21hcHBpbmdgLCBhbmQKKyAgIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9hc19idWZmZXJgKSB0aGF0IHdlcmUgaGlzdG9yaWNhbGx5IG5vdCBhbHdheXMgcHJlc2VudCBhcmUgdmFsaWQ7IGlmCiAgICBzdWNoIGEgZmxhZyBiaXQgaXMgY2xlYXIsIHRoZSB0eXBlIGZpZWxkcyBpdCBndWFyZHMgbXVzdCBub3QgYmUgYWNjZXNzZWQgYW5kCiAgICBtdXN0IGJlIGNvbnNpZGVyZWQgdG8gaGF2ZSBhIHplcm8gb3IgKk5VTEwqIHZhbHVlIGluc3RlYWQuCiAKQEAgLTQyNSwyOCArNDI1LDI4IEBACiAgICBpbmhlcml0ZWQgaWYgdGhlIGV4dGVuc2lvbiBzdHJ1Y3R1cmUgaXMgaW5oZXJpdGVkLCBpLmUuIHRoZSBiYXNlIHR5cGUncyB2YWx1ZSBvZgogICAgdGhlIGZsYWcgYml0IGlzIGNvcGllZCBpbnRvIHRoZSBzdWJ0eXBlIHRvZ2V0aGVyIHdpdGggYSBwb2ludGVyIHRvIHRoZSBleHRlbnNpb24KICAgIHN0cnVjdHVyZS4gIFRoZSA6Y29uc3Q6YFB5X1RQRkxBR1NfSEFWRV9HQ2AgZmxhZyBiaXQgaXMgaW5oZXJpdGVkIHRvZ2V0aGVyIHdpdGgKLSAgIHRoZSA6YXR0cjpgdHBfdHJhdmVyc2VgIGFuZCA6YXR0cjpgdHBfY2xlYXJgIGZpZWxkcywgaS5lLiBpZiB0aGUKKyAgIHRoZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfdHJhdmVyc2VgIGFuZCA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfY2xlYXJgIGZpZWxkcywgaS5lLiBpZiB0aGUKICAgIDpjb25zdDpgUHlfVFBGTEFHU19IQVZFX0dDYCBmbGFnIGJpdCBpcyBjbGVhciBpbiB0aGUgc3VidHlwZSBhbmQgdGhlCi0gICA6YXR0cjpgdHBfdHJhdmVyc2VgIGFuZCA6YXR0cjpgdHBfY2xlYXJgIGZpZWxkcyBpbiB0aGUgc3VidHlwZSBleGlzdCAoYXMKKyAgIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF90cmF2ZXJzZWAgYW5kIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9jbGVhcmAgZmllbGRzIGluIHRoZSBzdWJ0eXBlIGV4aXN0IChhcwogICAgaW5kaWNhdGVkIGJ5IHRoZSA6Y29uc3Q6YFB5X1RQRkxBR1NfSEFWRV9SSUNIQ09NUEFSRWAgZmxhZyBiaXQpIGFuZCBoYXZlICpOVUxMKgogICAgdmFsdWVzLgogCiAgICBUaGUgZm9sbG93aW5nIGJpdCBtYXNrcyBhcmUgY3VycmVudGx5IGRlZmluZWQ7IHRoZXNlIGNhbiBiZSBPUmVkIHRvZ2V0aGVyIHVzaW5nCi0gICB0aGUgYGB8YGAgb3BlcmF0b3IgdG8gZm9ybSB0aGUgdmFsdWUgb2YgdGhlIDphdHRyOmB0cF9mbGFnc2AgZmllbGQuICBUaGUgbWFjcm8KLSAgIDpjZnVuYzpgUHlUeXBlX0hhc0ZlYXR1cmVgIHRha2VzIGEgdHlwZSBhbmQgYSBmbGFncyB2YWx1ZSwgKnRwKiBhbmQgKmYqLCBhbmQKKyAgIHRoZSBgYHxgYCBvcGVyYXRvciB0byBmb3JtIHRoZSB2YWx1ZSBvZiB0aGUgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2ZsYWdzYCBmaWVsZC4gIFRoZSBtYWNybworICAgOmM6ZnVuYzpgUHlUeXBlX0hhc0ZlYXR1cmVgIHRha2VzIGEgdHlwZSBhbmQgYSBmbGFncyB2YWx1ZSwgKnRwKiBhbmQgKmYqLCBhbmQKICAgIGNoZWNrcyB3aGV0aGVyIGBgdHAtPnRwX2ZsYWdzICYgZmBgIGlzIG5vbi16ZXJvLgogCiAKICAgIC4uIGRhdGE6OiBQeV9UUEZMQUdTX0hBVkVfR0VUQ0hBUkJVRkZFUgogCi0gICAgICBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZSA6Y3R5cGU6YFB5QnVmZmVyUHJvY3NgIHN0cnVjdCByZWZlcmVuY2VkIGJ5Ci0gICAgICA6YXR0cjpgdHBfYXNfYnVmZmVyYCBoYXMgdGhlIDphdHRyOmBiZl9nZXRjaGFyYnVmZmVyYCBmaWVsZC4KKyAgICAgIElmIHRoaXMgYml0IGlzIHNldCwgdGhlIDpjOnR5cGU6YFB5QnVmZmVyUHJvY3NgIHN0cnVjdCByZWZlcmVuY2VkIGJ5CisgICAgICA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfYXNfYnVmZmVyYCBoYXMgdGhlIDphdHRyOmBiZl9nZXRjaGFyYnVmZmVyYCBmaWVsZC4KIAogCiAgICAuLiBkYXRhOjogUHlfVFBGTEFHU19IQVZFX1NFUVVFTkNFX0lOCiAKLSAgICAgIElmIHRoaXMgYml0IGlzIHNldCwgdGhlIDpjdHlwZTpgUHlTZXF1ZW5jZU1ldGhvZHNgIHN0cnVjdCByZWZlcmVuY2VkIGJ5Ci0gICAgICA6YXR0cjpgdHBfYXNfc2VxdWVuY2VgIGhhcyB0aGUgOmF0dHI6YHNxX2NvbnRhaW5zYCBmaWVsZC4KKyAgICAgIElmIHRoaXMgYml0IGlzIHNldCwgdGhlIDpjOnR5cGU6YFB5U2VxdWVuY2VNZXRob2RzYCBzdHJ1Y3QgcmVmZXJlbmNlZCBieQorICAgICAgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2FzX3NlcXVlbmNlYCBoYXMgdGhlIDphdHRyOmBzcV9jb250YWluc2AgZmllbGQuCiAKIAogICAgLi4gZGF0YTo6IFB5X1RQRkxBR1NfR0MKQEAgLTQ1NywyMyArNDU3LDIzIEBACiAKICAgIC4uIGRhdGE6OiBQeV9UUEZMQUdTX0hBVkVfSU5QTEFDRU9QUwogCi0gICAgICBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZSA6Y3R5cGU6YFB5U2VxdWVuY2VNZXRob2RzYCBzdHJ1Y3QgcmVmZXJlbmNlZCBieQotICAgICAgOmF0dHI6YHRwX2FzX3NlcXVlbmNlYCBhbmQgdGhlIDpjdHlwZTpgUHlOdW1iZXJNZXRob2RzYCBzdHJ1Y3R1cmUgcmVmZXJlbmNlZCBieQotICAgICAgOmF0dHI6YHRwX2FzX251bWJlcmAgY29udGFpbiB0aGUgZmllbGRzIGZvciBpbi1wbGFjZSBvcGVyYXRvcnMuIEluIHBhcnRpY3VsYXIsCi0gICAgICB0aGlzIG1lYW5zIHRoYXQgdGhlIDpjdHlwZTpgUHlOdW1iZXJNZXRob2RzYCBzdHJ1Y3R1cmUgaGFzIHRoZSBmaWVsZHMKKyAgICAgIElmIHRoaXMgYml0IGlzIHNldCwgdGhlIDpjOnR5cGU6YFB5U2VxdWVuY2VNZXRob2RzYCBzdHJ1Y3QgcmVmZXJlbmNlZCBieQorICAgICAgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2FzX3NlcXVlbmNlYCBhbmQgdGhlIDpjOnR5cGU6YFB5TnVtYmVyTWV0aG9kc2Agc3RydWN0dXJlIHJlZmVyZW5jZWQgYnkKKyAgICAgIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9hc19udW1iZXJgIGNvbnRhaW4gdGhlIGZpZWxkcyBmb3IgaW4tcGxhY2Ugb3BlcmF0b3JzLiBJbiBwYXJ0aWN1bGFyLAorICAgICAgdGhpcyBtZWFucyB0aGF0IHRoZSA6Yzp0eXBlOmBQeU51bWJlck1ldGhvZHNgIHN0cnVjdHVyZSBoYXMgdGhlIGZpZWxkcwogICAgICAgOmF0dHI6YG5iX2lucGxhY2VfYWRkYCwgOmF0dHI6YG5iX2lucGxhY2Vfc3VidHJhY3RgLAogICAgICAgOmF0dHI6YG5iX2lucGxhY2VfbXVsdGlwbHlgLCA6YXR0cjpgbmJfaW5wbGFjZV9kaXZpZGVgLAogICAgICAgOmF0dHI6YG5iX2lucGxhY2VfcmVtYWluZGVyYCwgOmF0dHI6YG5iX2lucGxhY2VfcG93ZXJgLAogICAgICAgOmF0dHI6YG5iX2lucGxhY2VfbHNoaWZ0YCwgOmF0dHI6YG5iX2lucGxhY2VfcnNoaWZ0YCwgOmF0dHI6YG5iX2lucGxhY2VfYW5kYCwKICAgICAgIDphdHRyOmBuYl9pbnBsYWNlX3hvcmAsIGFuZCA6YXR0cjpgbmJfaW5wbGFjZV9vcmA7IGFuZCB0aGUKLSAgICAgIDpjdHlwZTpgUHlTZXF1ZW5jZU1ldGhvZHNgIHN0cnVjdCBoYXMgdGhlIGZpZWxkcyA6YXR0cjpgc3FfaW5wbGFjZV9jb25jYXRgIGFuZAorICAgICAgOmM6dHlwZTpgUHlTZXF1ZW5jZU1ldGhvZHNgIHN0cnVjdCBoYXMgdGhlIGZpZWxkcyA6YXR0cjpgc3FfaW5wbGFjZV9jb25jYXRgIGFuZAogICAgICAgOmF0dHI6YHNxX2lucGxhY2VfcmVwZWF0YC4KIAogCiAgICAuLiBkYXRhOjogUHlfVFBGTEFHU19DSEVDS1RZUEVTCiAKICAgICAgIElmIHRoaXMgYml0IGlzIHNldCwgdGhlIGJpbmFyeSBhbmQgdGVybmFyeSBvcGVyYXRpb25zIGluIHRoZQotICAgICAgOmN0eXBlOmBQeU51bWJlck1ldGhvZHNgIHN0cnVjdHVyZSByZWZlcmVuY2VkIGJ5IDphdHRyOmB0cF9hc19udW1iZXJgIGFjY2VwdAorICAgICAgOmM6dHlwZTpgUHlOdW1iZXJNZXRob2RzYCBzdHJ1Y3R1cmUgcmVmZXJlbmNlZCBieSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfYXNfbnVtYmVyYCBhY2NlcHQKICAgICAgIGFyZ3VtZW50cyBvZiBhcmJpdHJhcnkgb2JqZWN0IHR5cGVzLCBhbmQgZG8gdGhlaXIgb3duIHR5cGUgY29udmVyc2lvbnMgaWYKICAgICAgIG5lZWRlZC4gIElmIHRoaXMgYml0IGlzIGNsZWFyLCB0aG9zZSBvcGVyYXRpb25zIHJlcXVpcmUgdGhhdCBhbGwgYXJndW1lbnRzIGhhdmUKICAgICAgIHRoZSBjdXJyZW50IHR5cGUgYXMgdGhlaXIgdHlwZSwgYW5kIHRoZSBjYWxsZXIgaXMgc3VwcG9zZWQgdG8gcGVyZm9ybSBhIGNvZXJjaW9uCkBAIC00ODUsMzEgKzQ4NSwzMSBAQAogCiAgICAuLiBkYXRhOjogUHlfVFBGTEFHU19IQVZFX1JJQ0hDT01QQVJFCiAKLSAgICAgIElmIHRoaXMgYml0IGlzIHNldCwgdGhlIHR5cGUgb2JqZWN0IGhhcyB0aGUgOmF0dHI6YHRwX3JpY2hjb21wYXJlYCBmaWVsZCwgYXMKLSAgICAgIHdlbGwgYXMgdGhlIDphdHRyOmB0cF90cmF2ZXJzZWAgYW5kIHRoZSA6YXR0cjpgdHBfY2xlYXJgIGZpZWxkcy4KKyAgICAgIElmIHRoaXMgYml0IGlzIHNldCwgdGhlIHR5cGUgb2JqZWN0IGhhcyB0aGUgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX3JpY2hjb21wYXJlYCBmaWVsZCwgYXMKKyAgICAgIHdlbGwgYXMgdGhlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF90cmF2ZXJzZWAgYW5kIHRoZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfY2xlYXJgIGZpZWxkcy4KIAogCiAgICAuLiBkYXRhOjogUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTCiAKLSAgICAgIElmIHRoaXMgYml0IGlzIHNldCwgdGhlIDphdHRyOmB0cF93ZWFrbGlzdG9mZnNldGAgZmllbGQgaXMgZGVmaW5lZC4gIEluc3RhbmNlcwotICAgICAgb2YgYSB0eXBlIGFyZSB3ZWFrbHkgcmVmZXJlbmNlYWJsZSBpZiB0aGUgdHlwZSdzIDphdHRyOmB0cF93ZWFrbGlzdG9mZnNldGAgZmllbGQKKyAgICAgIElmIHRoaXMgYml0IGlzIHNldCwgdGhlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF93ZWFrbGlzdG9mZnNldGAgZmllbGQgaXMgZGVmaW5lZC4gIEluc3RhbmNlcworICAgICAgb2YgYSB0eXBlIGFyZSB3ZWFrbHkgcmVmZXJlbmNlYWJsZSBpZiB0aGUgdHlwZSdzIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF93ZWFrbGlzdG9mZnNldGAgZmllbGQKICAgICAgIGhhcyBhIHZhbHVlIGdyZWF0ZXIgdGhhbiB6ZXJvLgogCiAKICAgIC4uIGRhdGE6OiBQeV9UUEZMQUdTX0hBVkVfSVRFUgogCi0gICAgICBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZSB0eXBlIG9iamVjdCBoYXMgdGhlIDphdHRyOmB0cF9pdGVyYCBhbmQKLSAgICAgIDphdHRyOmB0cF9pdGVybmV4dGAgZmllbGRzLgorICAgICAgSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGUgdHlwZSBvYmplY3QgaGFzIHRoZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfaXRlcmAgYW5kCisgICAgICA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfaXRlcm5leHRgIGZpZWxkcy4KIAogCiAgICAuLiBkYXRhOjogUHlfVFBGTEFHU19IQVZFX0NMQVNTCiAKICAgICAgIElmIHRoaXMgYml0IGlzIHNldCwgdGhlIHR5cGUgb2JqZWN0IGhhcyBzZXZlcmFsIG5ldyBmaWVsZHMgZGVmaW5lZCBzdGFydGluZyBpbgotICAgICAgUHl0aG9uIDIuMjogOmF0dHI6YHRwX21ldGhvZHNgLCA6YXR0cjpgdHBfbWVtYmVyc2AsIDphdHRyOmB0cF9nZXRzZXRgLAotICAgICAgOmF0dHI6YHRwX2Jhc2VgLCA6YXR0cjpgdHBfZGljdGAsIDphdHRyOmB0cF9kZXNjcl9nZXRgLCA6YXR0cjpgdHBfZGVzY3Jfc2V0YCwKLSAgICAgIDphdHRyOmB0cF9kaWN0b2Zmc2V0YCwgOmF0dHI6YHRwX2luaXRgLCA6YXR0cjpgdHBfYWxsb2NgLCA6YXR0cjpgdHBfbmV3YCwKLSAgICAgIDphdHRyOmB0cF9mcmVlYCwgOmF0dHI6YHRwX2lzX2djYCwgOmF0dHI6YHRwX2Jhc2VzYCwgOmF0dHI6YHRwX21yb2AsCi0gICAgICA6YXR0cjpgdHBfY2FjaGVgLCA6YXR0cjpgdHBfc3ViY2xhc3Nlc2AsIGFuZCA6YXR0cjpgdHBfd2Vha2xpc3RgLgorICAgICAgUHl0aG9uIDIuMjogOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX21ldGhvZHNgLCA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfbWVtYmVyc2AsIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9nZXRzZXRgLAorICAgICAgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2Jhc2VgLCA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfZGljdGAsIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9kZXNjcl9nZXRgLCA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfZGVzY3Jfc2V0YCwKKyAgICAgIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9kaWN0b2Zmc2V0YCwgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2luaXRgLCA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfYWxsb2NgLCA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfbmV3YCwKKyAgICAgIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9mcmVlYCwgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2lzX2djYCwgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2Jhc2VzYCwgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX21yb2AsCisgICAgICA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfY2FjaGVgLCA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfc3ViY2xhc3Nlc2AsIGFuZCA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfd2Vha2xpc3RgLgogCiAKICAgIC4uIGRhdGE6OiBQeV9UUEZMQUdTX0hFQVBUWVBFCkBAIC01MzIsMjIgKzUzMiwyMiBAQAogICAgLi4gZGF0YTo6IFB5X1RQRkxBR1NfUkVBRFkKIAogICAgICAgVGhpcyBiaXQgaXMgc2V0IHdoZW4gdGhlIHR5cGUgb2JqZWN0IGhhcyBiZWVuIGZ1bGx5IGluaXRpYWxpemVkIGJ5Ci0gICAgICA6Y2Z1bmM6YFB5VHlwZV9SZWFkeWAuCisgICAgICA6YzpmdW5jOmBQeVR5cGVfUmVhZHlgLgogCiAKICAgIC4uIGRhdGE6OiBQeV9UUEZMQUdTX1JFQURZSU5HCiAKLSAgICAgIFRoaXMgYml0IGlzIHNldCB3aGlsZSA6Y2Z1bmM6YFB5VHlwZV9SZWFkeWAgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgaW5pdGlhbGl6aW5nCisgICAgICBUaGlzIGJpdCBpcyBzZXQgd2hpbGUgOmM6ZnVuYzpgUHlUeXBlX1JlYWR5YCBpcyBpbiB0aGUgcHJvY2VzcyBvZiBpbml0aWFsaXppbmcKICAgICAgIHRoZSB0eXBlIG9iamVjdC4KIAogCiAgICAuLiBkYXRhOjogUHlfVFBGTEFHU19IQVZFX0dDCiAKICAgICAgIFRoaXMgYml0IGlzIHNldCB3aGVuIHRoZSBvYmplY3Qgc3VwcG9ydHMgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgSWYgdGhpcyBiaXQKLSAgICAgIGlzIHNldCwgaW5zdGFuY2VzIG11c3QgYmUgY3JlYXRlZCB1c2luZyA6Y2Z1bmM6YFB5T2JqZWN0X0dDX05ld2AgYW5kCi0gICAgICBkZXN0cm95ZWQgdXNpbmcgOmNmdW5jOmBQeU9iamVjdF9HQ19EZWxgLiAgTW9yZSBpbmZvcm1hdGlvbiBpbiBzZWN0aW9uCisgICAgICBpcyBzZXQsIGluc3RhbmNlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcgOmM6ZnVuYzpgUHlPYmplY3RfR0NfTmV3YCBhbmQKKyAgICAgIGRlc3Ryb3llZCB1c2luZyA6YzpmdW5jOmBQeU9iamVjdF9HQ19EZWxgLiAgTW9yZSBpbmZvcm1hdGlvbiBpbiBzZWN0aW9uCiAgICAgICA6cmVmOmBzdXBwb3J0aW5nLWN5Y2xlLWRldGVjdGlvbmAuICBUaGlzIGJpdCBhbHNvIGltcGxpZXMgdGhhdCB0aGUKLSAgICAgIEdDLXJlbGF0ZWQgZmllbGRzIDphdHRyOmB0cF90cmF2ZXJzZWAgYW5kIDphdHRyOmB0cF9jbGVhcmAgYXJlIHByZXNlbnQgaW4KKyAgICAgIEdDLXJlbGF0ZWQgZmllbGRzIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF90cmF2ZXJzZWAgYW5kIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9jbGVhcmAgYXJlIHByZXNlbnQgaW4KICAgICAgIHRoZSB0eXBlIG9iamVjdDsgYnV0IHRob3NlIGZpZWxkcyBhbHNvIGV4aXN0IHdoZW4KICAgICAgIDpjb25zdDpgUHlfVFBGTEFHU19IQVZFX0dDYCBpcyBjbGVhciBidXQKICAgICAgIDpjb25zdDpgUHlfVFBGTEFHU19IQVZFX1JJQ0hDT01QQVJFYCBpcyBzZXQuCkBAIC01NjMsNyArNTYzLDcgQEAKICAgICAgIDpjb25zdDpgUHlfVFBGTEFHU19IQVZFX0lURVJgLCBhbmQgOmNvbnN0OmBQeV9UUEZMQUdTX0hBVkVfQ0xBU1NgLgogCiAKLS4uIGNtZW1iZXI6OiBjaGFyKiBQeVR5cGVPYmplY3QudHBfZG9jCisuLiBjOm1lbWJlcjo6IGNoYXIqIFB5VHlwZU9iamVjdC50cF9kb2MKIAogICAgQW4gb3B0aW9uYWwgcG9pbnRlciB0byBhIE5VTC10ZXJtaW5hdGVkIEMgc3RyaW5nIGdpdmluZyB0aGUgZG9jc3RyaW5nIGZvciB0aGlzCiAgICB0eXBlIG9iamVjdC4gIFRoaXMgaXMgZXhwb3NlZCBhcyB0aGUgOmF0dHI6YF9fZG9jX19gIGF0dHJpYnV0ZSBvbiB0aGUgdHlwZSBhbmQKQEAgLTU3NSwxNyArNTc1LDE3IEBACiA6Y29uc3Q6YFB5X1RQRkxBR1NfSEFWRV9SSUNIQ09NUEFSRWAgZmxhZyBiaXQgaXMgc2V0LgogCiAKLS4uIGNtZW1iZXI6OiB0cmF2ZXJzZXByb2MgUHlUeXBlT2JqZWN0LnRwX3RyYXZlcnNlCisuLiBjOm1lbWJlcjo6IHRyYXZlcnNlcHJvYyBQeVR5cGVPYmplY3QudHBfdHJhdmVyc2UKIAogICAgQW4gb3B0aW9uYWwgcG9pbnRlciB0byBhIHRyYXZlcnNhbCBmdW5jdGlvbiBmb3IgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLiAgVGhpcyBpcwogICAgb25seSB1c2VkIGlmIHRoZSA6Y29uc3Q6YFB5X1RQRkxBR1NfSEFWRV9HQ2AgZmxhZyBiaXQgaXMgc2V0LiAgTW9yZSBpbmZvcm1hdGlvbgogICAgYWJvdXQgUHl0aG9uJ3MgZ2FyYmFnZSBjb2xsZWN0aW9uIHNjaGVtZSBjYW4gYmUgZm91bmQgaW4gc2VjdGlvbgogICAgOnJlZjpgc3VwcG9ydGluZy1jeWNsZS1kZXRlY3Rpb25gLgogCi0gICBUaGUgOmF0dHI6YHRwX3RyYXZlcnNlYCBwb2ludGVyIGlzIHVzZWQgYnkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIHRvIGRldGVjdAotICAgcmVmZXJlbmNlIGN5Y2xlcy4gQSB0eXBpY2FsIGltcGxlbWVudGF0aW9uIG9mIGEgOmF0dHI6YHRwX3RyYXZlcnNlYCBmdW5jdGlvbgotICAgc2ltcGx5IGNhbGxzIDpjZnVuYzpgUHlfVklTSVRgIG9uIGVhY2ggb2YgdGhlIGluc3RhbmNlJ3MgbWVtYmVycyB0aGF0IGFyZSBQeXRob24KLSAgIG9iamVjdHMuICBGb3IgZXhhbXBsZSwgdGhpcyBpcyBmdW5jdGlvbiA6Y2Z1bmM6YGxvY2FsX3RyYXZlcnNlYCBmcm9tIHRoZQorICAgVGhlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF90cmF2ZXJzZWAgcG9pbnRlciBpcyB1c2VkIGJ5IHRoZSBnYXJiYWdlIGNvbGxlY3RvciB0byBkZXRlY3QKKyAgIHJlZmVyZW5jZSBjeWNsZXMuIEEgdHlwaWNhbCBpbXBsZW1lbnRhdGlvbiBvZiBhIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF90cmF2ZXJzZWAgZnVuY3Rpb24KKyAgIHNpbXBseSBjYWxscyA6YzpmdW5jOmBQeV9WSVNJVGAgb24gZWFjaCBvZiB0aGUgaW5zdGFuY2UncyBtZW1iZXJzIHRoYXQgYXJlIFB5dGhvbgorICAgb2JqZWN0cy4gIEZvciBleGFtcGxlLCB0aGlzIGlzIGZ1bmN0aW9uIDpjOmZ1bmM6YGxvY2FsX3RyYXZlcnNlYCBmcm9tIHRoZQogICAgOm1vZDpgdGhyZWFkYCBleHRlbnNpb24gbW9kdWxlOjoKIAogICAgICAgc3RhdGljIGludApAQCAtNTk3LDQxICs1OTcsNDEgQEAKICAgICAgICAgICByZXR1cm4gMDsKICAgICAgIH0KIAotICAgTm90ZSB0aGF0IDpjZnVuYzpgUHlfVklTSVRgIGlzIGNhbGxlZCBvbmx5IG9uIHRob3NlIG1lbWJlcnMgdGhhdCBjYW4gcGFydGljaXBhdGUKKyAgIE5vdGUgdGhhdCA6YzpmdW5jOmBQeV9WSVNJVGAgaXMgY2FsbGVkIG9ubHkgb24gdGhvc2UgbWVtYmVycyB0aGF0IGNhbiBwYXJ0aWNpcGF0ZQogICAgaW4gcmVmZXJlbmNlIGN5Y2xlcy4gIEFsdGhvdWdoIHRoZXJlIGlzIGFsc28gYSBgYHNlbGYtPmtleWBgIG1lbWJlciwgaXQgY2FuIG9ubHkKICAgIGJlICpOVUxMKiBvciBhIFB5dGhvbiBzdHJpbmcgYW5kIHRoZXJlZm9yZSBjYW5ub3QgYmUgcGFydCBvZiBhIHJlZmVyZW5jZSBjeWNsZS4KIAogICAgT24gdGhlIG90aGVyIGhhbmQsIGV2ZW4gaWYgeW91IGtub3cgYSBtZW1iZXIgY2FuIG5ldmVyIGJlIHBhcnQgb2YgYSBjeWNsZSwgYXMgYQogICAgZGVidWdnaW5nIGFpZCB5b3UgbWF5IHdhbnQgdG8gdmlzaXQgaXQgYW55d2F5IGp1c3Qgc28gdGhlIDptb2Q6YGdjYCBtb2R1bGUncwotICAgOmZ1bmM6YGdldF9yZWZlcmVudHNgIGZ1bmN0aW9uIHdpbGwgaW5jbHVkZSBpdC4KKyAgIDpmdW5jOmB+Z2MuZ2V0X3JlZmVyZW50c2AgZnVuY3Rpb24gd2lsbCBpbmNsdWRlIGl0LgogCi0gICBOb3RlIHRoYXQgOmNmdW5jOmBQeV9WSVNJVGAgcmVxdWlyZXMgdGhlICp2aXNpdCogYW5kICphcmcqIHBhcmFtZXRlcnMgdG8KLSAgIDpjZnVuYzpgbG9jYWxfdHJhdmVyc2VgIHRvIGhhdmUgdGhlc2Ugc3BlY2lmaWMgbmFtZXM7IGRvbid0IG5hbWUgdGhlbSBqdXN0CisgICBOb3RlIHRoYXQgOmM6ZnVuYzpgUHlfVklTSVRgIHJlcXVpcmVzIHRoZSAqdmlzaXQqIGFuZCAqYXJnKiBwYXJhbWV0ZXJzIHRvCisgICA6YzpmdW5jOmBsb2NhbF90cmF2ZXJzZWAgdG8gaGF2ZSB0aGVzZSBzcGVjaWZpYyBuYW1lczsgZG9uJ3QgbmFtZSB0aGVtIGp1c3QKICAgIGFueXRoaW5nLgogCi0gICBUaGlzIGZpZWxkIGlzIGluaGVyaXRlZCBieSBzdWJ0eXBlcyB0b2dldGhlciB3aXRoIDphdHRyOmB0cF9jbGVhcmAgYW5kIHRoZQotICAgOmNvbnN0OmBQeV9UUEZMQUdTX0hBVkVfR0NgIGZsYWcgYml0OiB0aGUgZmxhZyBiaXQsIDphdHRyOmB0cF90cmF2ZXJzZWAsIGFuZAotICAgOmF0dHI6YHRwX2NsZWFyYCBhcmUgYWxsIGluaGVyaXRlZCBmcm9tIHRoZSBiYXNlIHR5cGUgaWYgdGhleSBhcmUgYWxsIHplcm8gaW4KKyAgIFRoaXMgZmllbGQgaXMgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzIHRvZ2V0aGVyIHdpdGggOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2NsZWFyYCBhbmQgdGhlCisgICA6Y29uc3Q6YFB5X1RQRkxBR1NfSEFWRV9HQ2AgZmxhZyBiaXQ6IHRoZSBmbGFnIGJpdCwgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX3RyYXZlcnNlYCwgYW5kCisgICA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfY2xlYXJgIGFyZSBhbGwgaW5oZXJpdGVkIGZyb20gdGhlIGJhc2UgdHlwZSBpZiB0aGV5IGFyZSBhbGwgemVybyBpbgogICAgdGhlIHN1YnR5cGUgKmFuZCogdGhlIHN1YnR5cGUgaGFzIHRoZSA6Y29uc3Q6YFB5X1RQRkxBR1NfSEFWRV9SSUNIQ09NUEFSRWAgZmxhZwogICAgYml0IHNldC4KIAogCi0uLiBjbWVtYmVyOjogaW5xdWlyeSBQeVR5cGVPYmplY3QudHBfY2xlYXIKKy4uIGM6bWVtYmVyOjogaW5xdWlyeSBQeVR5cGVPYmplY3QudHBfY2xlYXIKIAogICAgQW4gb3B0aW9uYWwgcG9pbnRlciB0byBhIGNsZWFyIGZ1bmN0aW9uIGZvciB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuIFRoaXMgaXMgb25seQogICAgdXNlZCBpZiB0aGUgOmNvbnN0OmBQeV9UUEZMQUdTX0hBVkVfR0NgIGZsYWcgYml0IGlzIHNldC4KIAotICAgVGhlIDphdHRyOmB0cF9jbGVhcmAgbWVtYmVyIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYnJlYWsgcmVmZXJlbmNlIGN5Y2xlcyBpbiBjeWNsaWMKLSAgIGdhcmJhZ2UgZGV0ZWN0ZWQgYnkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLiAgVGFrZW4gdG9nZXRoZXIsIGFsbCA6YXR0cjpgdHBfY2xlYXJgCisgICBUaGUgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2NsZWFyYCBtZW1iZXIgZnVuY3Rpb24gaXMgdXNlZCB0byBicmVhayByZWZlcmVuY2UgY3ljbGVzIGluIGN5Y2xpYworICAgZ2FyYmFnZSBkZXRlY3RlZCBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuICBUYWtlbiB0b2dldGhlciwgYWxsIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9jbGVhcmAKICAgIGZ1bmN0aW9ucyBpbiB0aGUgc3lzdGVtIG11c3QgY29tYmluZSB0byBicmVhayBhbGwgcmVmZXJlbmNlIGN5Y2xlcy4gIFRoaXMgaXMKLSAgIHN1YnRsZSwgYW5kIGlmIGluIGFueSBkb3VidCBzdXBwbHkgYSA6YXR0cjpgdHBfY2xlYXJgIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGUsCi0gICB0aGUgdHVwbGUgdHlwZSBkb2VzIG5vdCBpbXBsZW1lbnQgYSA6YXR0cjpgdHBfY2xlYXJgIGZ1bmN0aW9uLCBiZWNhdXNlIGl0J3MKKyAgIHN1YnRsZSwgYW5kIGlmIGluIGFueSBkb3VidCBzdXBwbHkgYSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfY2xlYXJgIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGUsCisgICB0aGUgdHVwbGUgdHlwZSBkb2VzIG5vdCBpbXBsZW1lbnQgYSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfY2xlYXJgIGZ1bmN0aW9uLCBiZWNhdXNlIGl0J3MKICAgIHBvc3NpYmxlIHRvIHByb3ZlIHRoYXQgbm8gcmVmZXJlbmNlIGN5Y2xlIGNhbiBiZSBjb21wb3NlZCBlbnRpcmVseSBvZiB0dXBsZXMuCi0gICBUaGVyZWZvcmUgdGhlIDphdHRyOmB0cF9jbGVhcmAgZnVuY3Rpb25zIG9mIG90aGVyIHR5cGVzIG11c3QgYmUgc3VmZmljaWVudCB0bworICAgVGhlcmVmb3JlIHRoZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfY2xlYXJgIGZ1bmN0aW9ucyBvZiBvdGhlciB0eXBlcyBtdXN0IGJlIHN1ZmZpY2llbnQgdG8KICAgIGJyZWFrIGFueSBjeWNsZSBjb250YWluaW5nIGEgdHVwbGUuICBUaGlzIGlzbid0IGltbWVkaWF0ZWx5IG9idmlvdXMsIGFuZCB0aGVyZSdzCi0gICByYXJlbHkgYSBnb29kIHJlYXNvbiB0byBhdm9pZCBpbXBsZW1lbnRpbmcgOmF0dHI6YHRwX2NsZWFyYC4KKyAgIHJhcmVseSBhIGdvb2QgcmVhc29uIHRvIGF2b2lkIGltcGxlbWVudGluZyA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfY2xlYXJgLgogCi0gICBJbXBsZW1lbnRhdGlvbnMgb2YgOmF0dHI6YHRwX2NsZWFyYCBzaG91bGQgZHJvcCB0aGUgaW5zdGFuY2UncyByZWZlcmVuY2VzIHRvCisgICBJbXBsZW1lbnRhdGlvbnMgb2YgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2NsZWFyYCBzaG91bGQgZHJvcCB0aGUgaW5zdGFuY2UncyByZWZlcmVuY2VzIHRvCiAgICB0aG9zZSBvZiBpdHMgbWVtYmVycyB0aGF0IG1heSBiZSBQeXRob24gb2JqZWN0cywgYW5kIHNldCBpdHMgcG9pbnRlcnMgdG8gdGhvc2UKICAgIG1lbWJlcnMgdG8gKk5VTEwqLCBhcyBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6OgogCkBAIC02NDUsNyArNjQ1LDcgQEAKICAgICAgICAgICByZXR1cm4gMDsKICAgICAgIH0KIAotICAgVGhlIDpjZnVuYzpgUHlfQ0xFQVJgIG1hY3JvIHNob3VsZCBiZSB1c2VkLCBiZWNhdXNlIGNsZWFyaW5nIHJlZmVyZW5jZXMgaXMKKyAgIFRoZSA6YzpmdW5jOmBQeV9DTEVBUmAgbWFjcm8gc2hvdWxkIGJlIHVzZWQsIGJlY2F1c2UgY2xlYXJpbmcgcmVmZXJlbmNlcyBpcwogICAgZGVsaWNhdGU6ICB0aGUgcmVmZXJlbmNlIHRvIHRoZSBjb250YWluZWQgb2JqZWN0IG11c3Qgbm90IGJlIGRlY3JlbWVudGVkIHVudGlsCiAgICBhZnRlciB0aGUgcG9pbnRlciB0byB0aGUgY29udGFpbmVkIG9iamVjdCBpcyBzZXQgdG8gKk5VTEwqLiAgVGhpcyBpcyBiZWNhdXNlCiAgICBkZWNyZW1lbnRpbmcgdGhlIHJlZmVyZW5jZSBjb3VudCBtYXkgY2F1c2UgdGhlIGNvbnRhaW5lZCBvYmplY3QgdG8gYmVjb21lIHRyYXNoLApAQCAtNjU0LDI1ICs2NTQsMjUgQEAKICAgIGNvbnRhaW5lZCBvYmplY3QpLiBJZiBpdCdzIHBvc3NpYmxlIGZvciBzdWNoIGNvZGUgdG8gcmVmZXJlbmNlICpzZWxmKiBhZ2FpbiwKICAgIGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIHBvaW50ZXIgdG8gdGhlIGNvbnRhaW5lZCBvYmplY3QgYmUgKk5VTEwqIGF0IHRoYXQgdGltZSwKICAgIHNvIHRoYXQgKnNlbGYqIGtub3dzIHRoZSBjb250YWluZWQgb2JqZWN0IGNhbiBubyBsb25nZXIgYmUgdXNlZC4gIFRoZQotICAgOmNmdW5jOmBQeV9DTEVBUmAgbWFjcm8gcGVyZm9ybXMgdGhlIG9wZXJhdGlvbnMgaW4gYSBzYWZlIG9yZGVyLgorICAgOmM6ZnVuYzpgUHlfQ0xFQVJgIG1hY3JvIHBlcmZvcm1zIHRoZSBvcGVyYXRpb25zIGluIGEgc2FmZSBvcmRlci4KIAotICAgQmVjYXVzZSB0aGUgZ29hbCBvZiA6YXR0cjpgdHBfY2xlYXJgIGZ1bmN0aW9ucyBpcyB0byBicmVhayByZWZlcmVuY2UgY3ljbGVzLAorICAgQmVjYXVzZSB0aGUgZ29hbCBvZiA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfY2xlYXJgIGZ1bmN0aW9ucyBpcyB0byBicmVhayByZWZlcmVuY2UgY3ljbGVzLAogICAgaXQncyBub3QgbmVjZXNzYXJ5IHRvIGNsZWFyIGNvbnRhaW5lZCBvYmplY3RzIGxpa2UgUHl0aG9uIHN0cmluZ3Mgb3IgUHl0aG9uCiAgICBpbnRlZ2Vycywgd2hpY2ggY2FuJ3QgcGFydGljaXBhdGUgaW4gcmVmZXJlbmNlIGN5Y2xlcy4gT24gdGhlIG90aGVyIGhhbmQsIGl0IG1heQogICAgYmUgY29udmVuaWVudCB0byBjbGVhciBhbGwgY29udGFpbmVkIFB5dGhvbiBvYmplY3RzLCBhbmQgd3JpdGUgdGhlIHR5cGUncwotICAgOmF0dHI6YHRwX2RlYWxsb2NgIGZ1bmN0aW9uIHRvIGludm9rZSA6YXR0cjpgdHBfY2xlYXJgLgorICAgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2RlYWxsb2NgIGZ1bmN0aW9uIHRvIGludm9rZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfY2xlYXJgLgogCiAgICBNb3JlIGluZm9ybWF0aW9uIGFib3V0IFB5dGhvbidzIGdhcmJhZ2UgY29sbGVjdGlvbiBzY2hlbWUgY2FuIGJlIGZvdW5kIGluCiAgICBzZWN0aW9uIDpyZWY6YHN1cHBvcnRpbmctY3ljbGUtZGV0ZWN0aW9uYC4KIAotICAgVGhpcyBmaWVsZCBpcyBpbmhlcml0ZWQgYnkgc3VidHlwZXMgdG9nZXRoZXIgd2l0aCA6YXR0cjpgdHBfdHJhdmVyc2VgIGFuZCB0aGUKLSAgIDpjb25zdDpgUHlfVFBGTEFHU19IQVZFX0dDYCBmbGFnIGJpdDogdGhlIGZsYWcgYml0LCA6YXR0cjpgdHBfdHJhdmVyc2VgLCBhbmQKLSAgIDphdHRyOmB0cF9jbGVhcmAgYXJlIGFsbCBpbmhlcml0ZWQgZnJvbSB0aGUgYmFzZSB0eXBlIGlmIHRoZXkgYXJlIGFsbCB6ZXJvIGluCisgICBUaGlzIGZpZWxkIGlzIGluaGVyaXRlZCBieSBzdWJ0eXBlcyB0b2dldGhlciB3aXRoIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF90cmF2ZXJzZWAgYW5kIHRoZQorICAgOmNvbnN0OmBQeV9UUEZMQUdTX0hBVkVfR0NgIGZsYWcgYml0OiB0aGUgZmxhZyBiaXQsIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF90cmF2ZXJzZWAsIGFuZAorICAgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2NsZWFyYCBhcmUgYWxsIGluaGVyaXRlZCBmcm9tIHRoZSBiYXNlIHR5cGUgaWYgdGhleSBhcmUgYWxsIHplcm8gaW4KICAgIHRoZSBzdWJ0eXBlICphbmQqIHRoZSBzdWJ0eXBlIGhhcyB0aGUgOmNvbnN0OmBQeV9UUEZMQUdTX0hBVkVfUklDSENPTVBBUkVgIGZsYWcKICAgIGJpdCBzZXQuCiAKIAotLi4gY21lbWJlcjo6IHJpY2hjbXBmdW5jIFB5VHlwZU9iamVjdC50cF9yaWNoY29tcGFyZQorLi4gYzptZW1iZXI6OiByaWNoY21wZnVuYyBQeVR5cGVPYmplY3QudHBfcmljaGNvbXBhcmUKIAogICAgQW4gb3B0aW9uYWwgcG9pbnRlciB0byB0aGUgcmljaCBjb21wYXJpc29uIGZ1bmN0aW9uLCB3aG9zZSBzaWduYXR1cmUgaXMKICAgIGBgUHlPYmplY3QgKnRwX3JpY2hjb21wYXJlKFB5T2JqZWN0ICphLCBQeU9iamVjdCAqYiwgaW50IG9wKWBgLgpAQCAtNjg4LDEzICs2ODgsMTMgQEAKICAgICAgIGNvbXBhcmlzb25zIG1ha2VzIHNlbnNlIChlLmcuIGBgPT1gYCBhbmQgYGAhPWBgLCBidXQgbm90IGBgPGBgIGFuZAogICAgICAgZnJpZW5kcyksIGRpcmVjdGx5IHJhaXNlIDpleGM6YFR5cGVFcnJvcmAgaW4gdGhlIHJpY2ggY29tcGFyaXNvbiBmdW5jdGlvbi4KIAotICAgVGhpcyBmaWVsZCBpcyBpbmhlcml0ZWQgYnkgc3VidHlwZXMgdG9nZXRoZXIgd2l0aCA6YXR0cjpgdHBfY29tcGFyZWAgYW5kCi0gICA6YXR0cjpgdHBfaGFzaGA6IGEgc3VidHlwZSBpbmhlcml0cyBhbGwgdGhyZWUgb2YgOmF0dHI6YHRwX2NvbXBhcmVgLAotICAgOmF0dHI6YHRwX3JpY2hjb21wYXJlYCwgYW5kIDphdHRyOmB0cF9oYXNoYCwgd2hlbiB0aGUgc3VidHlwZSdzCi0gICA6YXR0cjpgdHBfY29tcGFyZWAsIDphdHRyOmB0cF9yaWNoY29tcGFyZWAsIGFuZCA6YXR0cjpgdHBfaGFzaGAgYXJlIGFsbCAqTlVMTCouCisgICBUaGlzIGZpZWxkIGlzIGluaGVyaXRlZCBieSBzdWJ0eXBlcyB0b2dldGhlciB3aXRoIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9jb21wYXJlYCBhbmQKKyAgIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9oYXNoYDogYSBzdWJ0eXBlIGluaGVyaXRzIGFsbCB0aHJlZSBvZiA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfY29tcGFyZWAsCisgICA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfcmljaGNvbXBhcmVgLCBhbmQgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2hhc2hgLCB3aGVuIHRoZSBzdWJ0eXBlJ3MKKyAgIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9jb21wYXJlYCwgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX3JpY2hjb21wYXJlYCwgYW5kIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9oYXNoYCBhcmUgYWxsICpOVUxMKi4KIAogICAgVGhlIGZvbGxvd2luZyBjb25zdGFudHMgYXJlIGRlZmluZWQgdG8gYmUgdXNlZCBhcyB0aGUgdGhpcmQgYXJndW1lbnQgZm9yCi0gICA6YXR0cjpgdHBfcmljaGNvbXBhcmVgIGFuZCBmb3IgOmNmdW5jOmBQeU9iamVjdF9SaWNoQ29tcGFyZWA6CisgICA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfcmljaGNvbXBhcmVgIGFuZCBmb3IgOmM6ZnVuYzpgUHlPYmplY3RfUmljaENvbXBhcmVgOgogCiAgICArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCiAgICB8IENvbnN0YW50ICAgICAgIHwgQ29tcGFyaXNvbiB8CkBAIC03MTYsNTQgKzcxNiw1NCBAQAogVGhlIG5leHQgZmllbGQgb25seSBleGlzdHMgaWYgdGhlIDpjb25zdDpgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTYCBmbGFnIGJpdCBpcwogc2V0LgogCi0uLiBjbWVtYmVyOjogbG9uZyBQeVR5cGVPYmplY3QudHBfd2Vha2xpc3RvZmZzZXQKKy4uIGM6bWVtYmVyOjogbG9uZyBQeVR5cGVPYmplY3QudHBfd2Vha2xpc3RvZmZzZXQKIAogICAgSWYgdGhlIGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgYXJlIHdlYWtseSByZWZlcmVuY2VhYmxlLCB0aGlzIGZpZWxkIGlzIGdyZWF0ZXIKICAgIHRoYW4gemVybyBhbmQgY29udGFpbnMgdGhlIG9mZnNldCBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlIG9mIHRoZSB3ZWFrCiAgICByZWZlcmVuY2UgbGlzdCBoZWFkIChpZ25vcmluZyB0aGUgR0MgaGVhZGVyLCBpZiBwcmVzZW50KTsgdGhpcyBvZmZzZXQgaXMgdXNlZCBieQotICAgOmNmdW5jOmBQeU9iamVjdF9DbGVhcldlYWtSZWZzYCBhbmQgdGhlIDpjZnVuYzpgUHlXZWFrcmVmX1wqYCBmdW5jdGlvbnMuICBUaGUKLSAgIGluc3RhbmNlIHN0cnVjdHVyZSBuZWVkcyB0byBpbmNsdWRlIGEgZmllbGQgb2YgdHlwZSA6Y3R5cGU6YFB5T2JqZWN0XCpgIHdoaWNoIGlzCisgICA6YzpmdW5jOmBQeU9iamVjdF9DbGVhcldlYWtSZWZzYCBhbmQgdGhlIDpjOmZ1bmM6YFB5V2Vha3JlZl9cKmAgZnVuY3Rpb25zLiAgVGhlCisgICBpbnN0YW5jZSBzdHJ1Y3R1cmUgbmVlZHMgdG8gaW5jbHVkZSBhIGZpZWxkIG9mIHR5cGUgOmM6dHlwZTpgUHlPYmplY3RcKmAgd2hpY2ggaXMKICAgIGluaXRpYWxpemVkIHRvICpOVUxMKi4KIAotICAgRG8gbm90IGNvbmZ1c2UgdGhpcyBmaWVsZCB3aXRoIDphdHRyOmB0cF93ZWFrbGlzdGA7IHRoYXQgaXMgdGhlIGxpc3QgaGVhZCBmb3IKKyAgIERvIG5vdCBjb25mdXNlIHRoaXMgZmllbGQgd2l0aCA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfd2Vha2xpc3RgOyB0aGF0IGlzIHRoZSBsaXN0IGhlYWQgZm9yCiAgICB3ZWFrIHJlZmVyZW5jZXMgdG8gdGhlIHR5cGUgb2JqZWN0IGl0c2VsZi4KIAogICAgVGhpcyBmaWVsZCBpcyBpbmhlcml0ZWQgYnkgc3VidHlwZXMsIGJ1dCBzZWUgdGhlIHJ1bGVzIGxpc3RlZCBiZWxvdy4gQSBzdWJ0eXBlCiAgICBtYXkgb3ZlcnJpZGUgdGhpcyBvZmZzZXQ7IHRoaXMgbWVhbnMgdGhhdCB0aGUgc3VidHlwZSB1c2VzIGEgZGlmZmVyZW50IHdlYWsKICAgIHJlZmVyZW5jZSBsaXN0IGhlYWQgdGhhbiB0aGUgYmFzZSB0eXBlLiAgU2luY2UgdGhlIGxpc3QgaGVhZCBpcyBhbHdheXMgZm91bmQgdmlhCi0gICA6YXR0cjpgdHBfd2Vha2xpc3RvZmZzZXRgLCB0aGlzIHNob3VsZCBub3QgYmUgYSBwcm9ibGVtLgorICAgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX3dlYWtsaXN0b2Zmc2V0YCwgdGhpcyBzaG91bGQgbm90IGJlIGEgcHJvYmxlbS4KIAotICAgV2hlbiBhIHR5cGUgZGVmaW5lZCBieSBhIGNsYXNzIHN0YXRlbWVudCBoYXMgbm8gOmF0dHI6YF9fc2xvdHNfX2AgZGVjbGFyYXRpb24sCisgICBXaGVuIGEgdHlwZSBkZWZpbmVkIGJ5IGEgY2xhc3Mgc3RhdGVtZW50IGhhcyBubyA6YXR0cjpgfm9iamVjdC5fX3Nsb3RzX19gIGRlY2xhcmF0aW9uLAogICAgYW5kIG5vbmUgb2YgaXRzIGJhc2UgdHlwZXMgYXJlIHdlYWtseSByZWZlcmVuY2VhYmxlLCB0aGUgdHlwZSBpcyBtYWRlIHdlYWtseQogICAgcmVmZXJlbmNlYWJsZSBieSBhZGRpbmcgYSB3ZWFrIHJlZmVyZW5jZSBsaXN0IGhlYWQgc2xvdCB0byB0aGUgaW5zdGFuY2UgbGF5b3V0Ci0gICBhbmQgc2V0dGluZyB0aGUgOmF0dHI6YHRwX3dlYWtsaXN0b2Zmc2V0YCBvZiB0aGF0IHNsb3QncyBvZmZzZXQuCisgICBhbmQgc2V0dGluZyB0aGUgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX3dlYWtsaXN0b2Zmc2V0YCBvZiB0aGF0IHNsb3QncyBvZmZzZXQuCiAKICAgIFdoZW4gYSB0eXBlJ3MgOmF0dHI6YF9fc2xvdHNfX2AgZGVjbGFyYXRpb24gY29udGFpbnMgYSBzbG90IG5hbWVkCiAgICA6YXR0cjpgX193ZWFrcmVmX19gLCB0aGF0IHNsb3QgYmVjb21lcyB0aGUgd2VhayByZWZlcmVuY2UgbGlzdCBoZWFkIGZvcgogICAgaW5zdGFuY2VzIG9mIHRoZSB0eXBlLCBhbmQgdGhlIHNsb3QncyBvZmZzZXQgaXMgc3RvcmVkIGluIHRoZSB0eXBlJ3MKLSAgIDphdHRyOmB0cF93ZWFrbGlzdG9mZnNldGAuCisgICA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfd2Vha2xpc3RvZmZzZXRgLgogCiAgICBXaGVuIGEgdHlwZSdzIDphdHRyOmBfX3Nsb3RzX19gIGRlY2xhcmF0aW9uIGRvZXMgbm90IGNvbnRhaW4gYSBzbG90IG5hbWVkCi0gICA6YXR0cjpgX193ZWFrcmVmX19gLCB0aGUgdHlwZSBpbmhlcml0cyBpdHMgOmF0dHI6YHRwX3dlYWtsaXN0b2Zmc2V0YCBmcm9tIGl0cworICAgOmF0dHI6YF9fd2Vha3JlZl9fYCwgdGhlIHR5cGUgaW5oZXJpdHMgaXRzIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF93ZWFrbGlzdG9mZnNldGAgZnJvbSBpdHMKICAgIGJhc2UgdHlwZS4KIAogVGhlIG5leHQgdHdvIGZpZWxkcyBvbmx5IGV4aXN0IGlmIHRoZSA6Y29uc3Q6YFB5X1RQRkxBR1NfSEFWRV9JVEVSYCBmbGFnIGJpdCBpcwogc2V0LgogCiAKLS4uIGNtZW1iZXI6OiBnZXRpdGVyZnVuYyBQeVR5cGVPYmplY3QudHBfaXRlcgorLi4gYzptZW1iZXI6OiBnZXRpdGVyZnVuYyBQeVR5cGVPYmplY3QudHBfaXRlcgogCiAgICBBbiBvcHRpb25hbCBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciB0aGUgb2JqZWN0LiAgSXRzCiAgICBwcmVzZW5jZSBub3JtYWxseSBzaWduYWxzIHRoYXQgdGhlIGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgYXJlIGl0ZXJhYmxlIChhbHRob3VnaAogICAgc2VxdWVuY2VzIG1heSBiZSBpdGVyYWJsZSB3aXRob3V0IHRoaXMgZnVuY3Rpb24sIGFuZCBjbGFzc2ljIGluc3RhbmNlcyBhbHdheXMKICAgIGhhdmUgdGhpcyBmdW5jdGlvbiwgZXZlbiBpZiB0aGV5IGRvbid0IGRlZmluZSBhbiA6bWV0aDpgX19pdGVyX19gIG1ldGhvZCkuCiAKLSAgIFRoaXMgZnVuY3Rpb24gaGFzIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyA6Y2Z1bmM6YFB5T2JqZWN0X0dldEl0ZXJgLgorICAgVGhpcyBmdW5jdGlvbiBoYXMgdGhlIHNhbWUgc2lnbmF0dXJlIGFzIDpjOmZ1bmM6YFB5T2JqZWN0X0dldEl0ZXJgLgogCiAgICBUaGlzIGZpZWxkIGlzIGluaGVyaXRlZCBieSBzdWJ0eXBlcy4KIAogCi0uLiBjbWVtYmVyOjogaXRlcm5leHRmdW5jIFB5VHlwZU9iamVjdC50cF9pdGVybmV4dAorLi4gYzptZW1iZXI6OiBpdGVybmV4dGZ1bmMgUHlUeXBlT2JqZWN0LnRwX2l0ZXJuZXh0CiAKICAgIEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG5leHQgaXRlbSBpbiBhbiBpdGVyYXRvci4KICAgIFdoZW4gdGhlIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCwgaXQgbXVzdCByZXR1cm4gKk5VTEwqOyBhIDpleGM6YFN0b3BJdGVyYXRpb25gCkBAIC03NzIsNTAgKzc3Miw1MCBAQAogICAgYXJlIGl0ZXJhdG9ycyAoYWx0aG91Z2ggY2xhc3NpYyBpbnN0YW5jZXMgYWx3YXlzIGhhdmUgdGhpcyBmdW5jdGlvbiwgZXZlbiBpZgogICAgdGhleSBkb24ndCBkZWZpbmUgYSA6bWV0aDpgbmV4dGAgbWV0aG9kKS4KIAotICAgSXRlcmF0b3IgdHlwZXMgc2hvdWxkIGFsc28gZGVmaW5lIHRoZSA6YXR0cjpgdHBfaXRlcmAgZnVuY3Rpb24sIGFuZCB0aGF0CisgICBJdGVyYXRvciB0eXBlcyBzaG91bGQgYWxzbyBkZWZpbmUgdGhlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9pdGVyYCBmdW5jdGlvbiwgYW5kIHRoYXQKICAgIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIGl0ZXJhdG9yIGluc3RhbmNlIGl0c2VsZiAobm90IGEgbmV3IGl0ZXJhdG9yCiAgICBpbnN0YW5jZSkuCiAKLSAgIFRoaXMgZnVuY3Rpb24gaGFzIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyA6Y2Z1bmM6YFB5SXRlcl9OZXh0YC4KKyAgIFRoaXMgZnVuY3Rpb24gaGFzIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyA6YzpmdW5jOmBQeUl0ZXJfTmV4dGAuCiAKICAgIFRoaXMgZmllbGQgaXMgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzLgogCi1UaGUgbmV4dCBmaWVsZHMsIHVwIHRvIGFuZCBpbmNsdWRpbmcgOmF0dHI6YHRwX3dlYWtsaXN0YCwgb25seSBleGlzdCBpZiB0aGUKK1RoZSBuZXh0IGZpZWxkcywgdXAgdG8gYW5kIGluY2x1ZGluZyA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfd2Vha2xpc3RgLCBvbmx5IGV4aXN0IGlmIHRoZQogOmNvbnN0OmBQeV9UUEZMQUdTX0hBVkVfQ0xBU1NgIGZsYWcgYml0IGlzIHNldC4KIAogCi0uLiBjbWVtYmVyOjogc3RydWN0IFB5TWV0aG9kRGVmKiBQeVR5cGVPYmplY3QudHBfbWV0aG9kcworLi4gYzptZW1iZXI6OiBzdHJ1Y3QgUHlNZXRob2REZWYqIFB5VHlwZU9iamVjdC50cF9tZXRob2RzCiAKLSAgIEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gYSBzdGF0aWMgKk5VTEwqLXRlcm1pbmF0ZWQgYXJyYXkgb2YgOmN0eXBlOmBQeU1ldGhvZERlZmAKKyAgIEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gYSBzdGF0aWMgKk5VTEwqLXRlcm1pbmF0ZWQgYXJyYXkgb2YgOmM6dHlwZTpgUHlNZXRob2REZWZgCiAgICBzdHJ1Y3R1cmVzLCBkZWNsYXJpbmcgcmVndWxhciBtZXRob2RzIG9mIHRoaXMgdHlwZS4KIAogICAgRm9yIGVhY2ggZW50cnkgaW4gdGhlIGFycmF5LCBhbiBlbnRyeSBpcyBhZGRlZCB0byB0aGUgdHlwZSdzIGRpY3Rpb25hcnkgKHNlZQotICAgOmF0dHI6YHRwX2RpY3RgIGJlbG93KSBjb250YWluaW5nIGEgbWV0aG9kIGRlc2NyaXB0b3IuCisgICA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfZGljdGAgYmVsb3cpIGNvbnRhaW5pbmcgYSBtZXRob2QgZGVzY3JpcHRvci4KIAogICAgVGhpcyBmaWVsZCBpcyBub3QgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzIChtZXRob2RzIGFyZSBpbmhlcml0ZWQgdGhyb3VnaCBhCiAgICBkaWZmZXJlbnQgbWVjaGFuaXNtKS4KIAogCi0uLiBjbWVtYmVyOjogc3RydWN0IFB5TWVtYmVyRGVmKiBQeVR5cGVPYmplY3QudHBfbWVtYmVycworLi4gYzptZW1iZXI6OiBzdHJ1Y3QgUHlNZW1iZXJEZWYqIFB5VHlwZU9iamVjdC50cF9tZW1iZXJzCiAKLSAgIEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gYSBzdGF0aWMgKk5VTEwqLXRlcm1pbmF0ZWQgYXJyYXkgb2YgOmN0eXBlOmBQeU1lbWJlckRlZmAKKyAgIEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gYSBzdGF0aWMgKk5VTEwqLXRlcm1pbmF0ZWQgYXJyYXkgb2YgOmM6dHlwZTpgUHlNZW1iZXJEZWZgCiAgICBzdHJ1Y3R1cmVzLCBkZWNsYXJpbmcgcmVndWxhciBkYXRhIG1lbWJlcnMgKGZpZWxkcyBvciBzbG90cykgb2YgaW5zdGFuY2VzIG9mCiAgICB0aGlzIHR5cGUuCiAKICAgIEZvciBlYWNoIGVudHJ5IGluIHRoZSBhcnJheSwgYW4gZW50cnkgaXMgYWRkZWQgdG8gdGhlIHR5cGUncyBkaWN0aW9uYXJ5IChzZWUKLSAgIDphdHRyOmB0cF9kaWN0YCBiZWxvdykgY29udGFpbmluZyBhIG1lbWJlciBkZXNjcmlwdG9yLgorICAgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2RpY3RgIGJlbG93KSBjb250YWluaW5nIGEgbWVtYmVyIGRlc2NyaXB0b3IuCiAKICAgIFRoaXMgZmllbGQgaXMgbm90IGluaGVyaXRlZCBieSBzdWJ0eXBlcyAobWVtYmVycyBhcmUgaW5oZXJpdGVkIHRocm91Z2ggYQogICAgZGlmZmVyZW50IG1lY2hhbmlzbSkuCiAKIAotLi4gY21lbWJlcjo6IHN0cnVjdCBQeUdldFNldERlZiogUHlUeXBlT2JqZWN0LnRwX2dldHNldAorLi4gYzptZW1iZXI6OiBzdHJ1Y3QgUHlHZXRTZXREZWYqIFB5VHlwZU9iamVjdC50cF9nZXRzZXQKIAotICAgQW4gb3B0aW9uYWwgcG9pbnRlciB0byBhIHN0YXRpYyAqTlVMTCotdGVybWluYXRlZCBhcnJheSBvZiA6Y3R5cGU6YFB5R2V0U2V0RGVmYAorICAgQW4gb3B0aW9uYWwgcG9pbnRlciB0byBhIHN0YXRpYyAqTlVMTCotdGVybWluYXRlZCBhcnJheSBvZiA6Yzp0eXBlOmBQeUdldFNldERlZmAKICAgIHN0cnVjdHVyZXMsIGRlY2xhcmluZyBjb21wdXRlZCBhdHRyaWJ1dGVzIG9mIGluc3RhbmNlcyBvZiB0aGlzIHR5cGUuCiAKICAgIEZvciBlYWNoIGVudHJ5IGluIHRoZSBhcnJheSwgYW4gZW50cnkgaXMgYWRkZWQgdG8gdGhlIHR5cGUncyBkaWN0aW9uYXJ5IChzZWUKLSAgIDphdHRyOmB0cF9kaWN0YCBiZWxvdykgY29udGFpbmluZyBhIGdldHNldCBkZXNjcmlwdG9yLgorICAgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2RpY3RgIGJlbG93KSBjb250YWluaW5nIGEgZ2V0c2V0IGRlc2NyaXB0b3IuCiAKICAgIFRoaXMgZmllbGQgaXMgbm90IGluaGVyaXRlZCBieSBzdWJ0eXBlcyAoY29tcHV0ZWQgYXR0cmlidXRlcyBhcmUgaW5oZXJpdGVkCiAgICB0aHJvdWdoIGEgZGlmZmVyZW50IG1lY2hhbmlzbSkuCkBAIC04MzYsNyArODM2LDcgQEAKICAgICAgIH0gUHlHZXRTZXREZWY7CiAKIAotLi4gY21lbWJlcjo6IFB5VHlwZU9iamVjdCogUHlUeXBlT2JqZWN0LnRwX2Jhc2UKKy4uIGM6bWVtYmVyOjogUHlUeXBlT2JqZWN0KiBQeVR5cGVPYmplY3QudHBfYmFzZQogCiAgICBBbiBvcHRpb25hbCBwb2ludGVyIHRvIGEgYmFzZSB0eXBlIGZyb20gd2hpY2ggdHlwZSBwcm9wZXJ0aWVzIGFyZSBpbmhlcml0ZWQuICBBdAogICAgdGhpcyBsZXZlbCwgb25seSBzaW5nbGUgaW5oZXJpdGFuY2UgaXMgc3VwcG9ydGVkOyBtdWx0aXBsZSBpbmhlcml0YW5jZSByZXF1aXJlCkBAIC04NDcsMTMgKzg0NywxMyBAQAogICAgOmNsYXNzOmBvYmplY3RgKS4KIAogCi0uLiBjbWVtYmVyOjogUHlPYmplY3QqIFB5VHlwZU9iamVjdC50cF9kaWN0CisuLiBjOm1lbWJlcjo6IFB5T2JqZWN0KiBQeVR5cGVPYmplY3QudHBfZGljdAogCi0gICBUaGUgdHlwZSdzIGRpY3Rpb25hcnkgaXMgc3RvcmVkIGhlcmUgYnkgOmNmdW5jOmBQeVR5cGVfUmVhZHlgLgorICAgVGhlIHR5cGUncyBkaWN0aW9uYXJ5IGlzIHN0b3JlZCBoZXJlIGJ5IDpjOmZ1bmM6YFB5VHlwZV9SZWFkeWAuCiAKICAgIFRoaXMgZmllbGQgc2hvdWxkIG5vcm1hbGx5IGJlIGluaXRpYWxpemVkIHRvICpOVUxMKiBiZWZvcmUgUHlUeXBlX1JlYWR5IGlzCiAgICBjYWxsZWQ7IGl0IG1heSBhbHNvIGJlIGluaXRpYWxpemVkIHRvIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGluaXRpYWwgYXR0cmlidXRlcwotICAgZm9yIHRoZSB0eXBlLiAgT25jZSA6Y2Z1bmM6YFB5VHlwZV9SZWFkeWAgaGFzIGluaXRpYWxpemVkIHRoZSB0eXBlLCBleHRyYQorICAgZm9yIHRoZSB0eXBlLiAgT25jZSA6YzpmdW5jOmBQeVR5cGVfUmVhZHlgIGhhcyBpbml0aWFsaXplZCB0aGUgdHlwZSwgZXh0cmEKICAgIGF0dHJpYnV0ZXMgZm9yIHRoZSB0eXBlIG1heSBiZSBhZGRlZCB0byB0aGlzIGRpY3Rpb25hcnkgb25seSBpZiB0aGV5IGRvbid0CiAgICBjb3JyZXNwb25kIHRvIG92ZXJsb2FkZWQgb3BlcmF0aW9ucyAobGlrZSA6bWV0aDpgX19hZGRfX2ApLgogCkBAIC04NjEsNyArODYxLDcgQEAKICAgIGFyZSBpbmhlcml0ZWQgdGhyb3VnaCBhIGRpZmZlcmVudCBtZWNoYW5pc20pLgogCiAKLS4uIGNtZW1iZXI6OiBkZXNjcmdldGZ1bmMgUHlUeXBlT2JqZWN0LnRwX2Rlc2NyX2dldAorLi4gYzptZW1iZXI6OiBkZXNjcmdldGZ1bmMgUHlUeXBlT2JqZWN0LnRwX2Rlc2NyX2dldAogCiAgICBBbiBvcHRpb25hbCBwb2ludGVyIHRvIGEgImRlc2NyaXB0b3IgZ2V0IiBmdW5jdGlvbi4KIApAQCAtODc0LDcgKzg3NCw3IEBACiAgICBUaGlzIGZpZWxkIGlzIGluaGVyaXRlZCBieSBzdWJ0eXBlcy4KIAogCi0uLiBjbWVtYmVyOjogZGVzY3JzZXRmdW5jIFB5VHlwZU9iamVjdC50cF9kZXNjcl9zZXQKKy4uIGM6bWVtYmVyOjogZGVzY3JzZXRmdW5jIFB5VHlwZU9iamVjdC50cF9kZXNjcl9zZXQKIAogICAgQW4gb3B0aW9uYWwgcG9pbnRlciB0byBhICJkZXNjcmlwdG9yIHNldCIgZnVuY3Rpb24uCiAKQEAgLTg4NywxNCArODg3LDE0IEBACiAgICAuLiBYWFggZXhwbGFpbi4KIAogCi0uLiBjbWVtYmVyOjogbG9uZyBQeVR5cGVPYmplY3QudHBfZGljdG9mZnNldAorLi4gYzptZW1iZXI6OiBsb25nIFB5VHlwZU9iamVjdC50cF9kaWN0b2Zmc2V0CiAKICAgIElmIHRoZSBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIGhhdmUgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgaW5zdGFuY2UgdmFyaWFibGVzLAogICAgdGhpcyBmaWVsZCBpcyBub24temVybyBhbmQgY29udGFpbnMgdGhlIG9mZnNldCBpbiB0aGUgaW5zdGFuY2VzIG9mIHRoZSB0eXBlIG9mCiAgICB0aGUgaW5zdGFuY2UgdmFyaWFibGUgZGljdGlvbmFyeTsgdGhpcyBvZmZzZXQgaXMgdXNlZCBieQotICAgOmNmdW5jOmBQeU9iamVjdF9HZW5lcmljR2V0QXR0cmAuCisgICA6YzpmdW5jOmBQeU9iamVjdF9HZW5lcmljR2V0QXR0cmAuCiAKLSAgIERvIG5vdCBjb25mdXNlIHRoaXMgZmllbGQgd2l0aCA6YXR0cjpgdHBfZGljdGA7IHRoYXQgaXMgdGhlIGRpY3Rpb25hcnkgZm9yCisgICBEbyBub3QgY29uZnVzZSB0aGlzIGZpZWxkIHdpdGggOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2RpY3RgOyB0aGF0IGlzIHRoZSBkaWN0aW9uYXJ5IGZvcgogICAgYXR0cmlidXRlcyBvZiB0aGUgdHlwZSBvYmplY3QgaXRzZWxmLgogCiAgICBJZiB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZCBpcyBncmVhdGVyIHRoYW4gemVybywgaXQgc3BlY2lmaWVzIHRoZSBvZmZzZXQgZnJvbQpAQCAtOTAzLDQ0ICs5MDMsNDQgQEAKICAgIG9mZnNldCBpcyBtb3JlIGV4cGVuc2l2ZSB0byB1c2UsIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gdGhlIGluc3RhbmNlCiAgICBzdHJ1Y3R1cmUgY29udGFpbnMgYSB2YXJpYWJsZS1sZW5ndGggcGFydC4gIFRoaXMgaXMgdXNlZCBmb3IgZXhhbXBsZSB0byBhZGQgYW4KICAgIGluc3RhbmNlIHZhcmlhYmxlIGRpY3Rpb25hcnkgdG8gc3VidHlwZXMgb2YgOmNsYXNzOmBzdHJgIG9yIDpjbGFzczpgdHVwbGVgLiBOb3RlCi0gICB0aGF0IHRoZSA6YXR0cjpgdHBfYmFzaWNzaXplYCBmaWVsZCBzaG91bGQgYWNjb3VudCBmb3IgdGhlIGRpY3Rpb25hcnkgYWRkZWQgdG8KKyAgIHRoYXQgdGhlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9iYXNpY3NpemVgIGZpZWxkIHNob3VsZCBhY2NvdW50IGZvciB0aGUgZGljdGlvbmFyeSBhZGRlZCB0bwogICAgdGhlIGVuZCBpbiB0aGF0IGNhc2UsIGV2ZW4gdGhvdWdoIHRoZSBkaWN0aW9uYXJ5IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgYmFzaWMKICAgIG9iamVjdCBsYXlvdXQuICBPbiBhIHN5c3RlbSB3aXRoIGEgcG9pbnRlciBzaXplIG9mIDQgYnl0ZXMsCi0gICA6YXR0cjpgdHBfZGljdG9mZnNldGAgc2hvdWxkIGJlIHNldCB0byBgYC00YGAgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZGljdGlvbmFyeSBpcworICAgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2RpY3RvZmZzZXRgIHNob3VsZCBiZSBzZXQgdG8gYGAtNGBgIHRvIGluZGljYXRlIHRoYXQgdGhlIGRpY3Rpb25hcnkgaXMKICAgIGF0IHRoZSB2ZXJ5IGVuZCBvZiB0aGUgc3RydWN0dXJlLgogCiAgICBUaGUgcmVhbCBkaWN0aW9uYXJ5IG9mZnNldCBpbiBhbiBpbnN0YW5jZSBjYW4gYmUgY29tcHV0ZWQgZnJvbSBhIG5lZ2F0aXZlCi0gICA6YXR0cjpgdHBfZGljdG9mZnNldGAgYXMgZm9sbG93czo6CisgICA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfZGljdG9mZnNldGAgYXMgZm9sbG93czo6CiAKICAgICAgIGRpY3RvZmZzZXQgPSB0cF9iYXNpY3NpemUgKyBhYnMob2Jfc2l6ZSkqdHBfaXRlbXNpemUgKyB0cF9kaWN0b2Zmc2V0CiAgICAgICBpZiBkaWN0b2Zmc2V0IGlzIG5vdCBhbGlnbmVkIG9uIHNpemVvZih2b2lkKik6CiAgICAgICAgICAgcm91bmQgdXAgdG8gc2l6ZW9mKHZvaWQqKQogCi0gICB3aGVyZSA6YXR0cjpgdHBfYmFzaWNzaXplYCwgOmF0dHI6YHRwX2l0ZW1zaXplYCBhbmQgOmF0dHI6YHRwX2RpY3RvZmZzZXRgIGFyZQorICAgd2hlcmUgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2Jhc2ljc2l6ZWAsIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9pdGVtc2l6ZWAgYW5kIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9kaWN0b2Zmc2V0YCBhcmUKICAgIHRha2VuIGZyb20gdGhlIHR5cGUgb2JqZWN0LCBhbmQgOmF0dHI6YG9iX3NpemVgIGlzIHRha2VuIGZyb20gdGhlIGluc3RhbmNlLiAgVGhlCiAgICBhYnNvbHV0ZSB2YWx1ZSBpcyB0YWtlbiBiZWNhdXNlIGxvbmcgaW50cyB1c2UgdGhlIHNpZ24gb2YgOmF0dHI6YG9iX3NpemVgIHRvCiAgICBzdG9yZSB0aGUgc2lnbiBvZiB0aGUgbnVtYmVyLiAgKFRoZXJlJ3MgbmV2ZXIgYSBuZWVkIHRvIGRvIHRoaXMgY2FsY3VsYXRpb24KLSAgIHlvdXJzZWxmOyBpdCBpcyBkb25lIGZvciB5b3UgYnkgOmNmdW5jOmBfUHlPYmplY3RfR2V0RGljdFB0cmAuKQorICAgeW91cnNlbGY7IGl0IGlzIGRvbmUgZm9yIHlvdSBieSA6YzpmdW5jOmBfUHlPYmplY3RfR2V0RGljdFB0cmAuKQogCiAgICBUaGlzIGZpZWxkIGlzIGluaGVyaXRlZCBieSBzdWJ0eXBlcywgYnV0IHNlZSB0aGUgcnVsZXMgbGlzdGVkIGJlbG93LiBBIHN1YnR5cGUKICAgIG1heSBvdmVycmlkZSB0aGlzIG9mZnNldDsgdGhpcyBtZWFucyB0aGF0IHRoZSBzdWJ0eXBlIGluc3RhbmNlcyBzdG9yZSB0aGUKICAgIGRpY3Rpb25hcnkgYXQgYSBkaWZmZXJlbmNlIG9mZnNldCB0aGFuIHRoZSBiYXNlIHR5cGUuICBTaW5jZSB0aGUgZGljdGlvbmFyeSBpcwotICAgYWx3YXlzIGZvdW5kIHZpYSA6YXR0cjpgdHBfZGljdG9mZnNldGAsIHRoaXMgc2hvdWxkIG5vdCBiZSBhIHByb2JsZW0uCisgICBhbHdheXMgZm91bmQgdmlhIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9kaWN0b2Zmc2V0YCwgdGhpcyBzaG91bGQgbm90IGJlIGEgcHJvYmxlbS4KIAotICAgV2hlbiBhIHR5cGUgZGVmaW5lZCBieSBhIGNsYXNzIHN0YXRlbWVudCBoYXMgbm8gOmF0dHI6YF9fc2xvdHNfX2AgZGVjbGFyYXRpb24sCisgICBXaGVuIGEgdHlwZSBkZWZpbmVkIGJ5IGEgY2xhc3Mgc3RhdGVtZW50IGhhcyBubyA6YXR0cjpgfm9iamVjdC5fX3Nsb3RzX19gIGRlY2xhcmF0aW9uLAogICAgYW5kIG5vbmUgb2YgaXRzIGJhc2UgdHlwZXMgaGFzIGFuIGluc3RhbmNlIHZhcmlhYmxlIGRpY3Rpb25hcnksIGEgZGljdGlvbmFyeQotICAgc2xvdCBpcyBhZGRlZCB0byB0aGUgaW5zdGFuY2UgbGF5b3V0IGFuZCB0aGUgOmF0dHI6YHRwX2RpY3RvZmZzZXRgIGlzIHNldCB0bworICAgc2xvdCBpcyBhZGRlZCB0byB0aGUgaW5zdGFuY2UgbGF5b3V0IGFuZCB0aGUgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2RpY3RvZmZzZXRgIGlzIHNldCB0bwogICAgdGhhdCBzbG90J3Mgb2Zmc2V0LgogCiAgICBXaGVuIGEgdHlwZSBkZWZpbmVkIGJ5IGEgY2xhc3Mgc3RhdGVtZW50IGhhcyBhIDphdHRyOmBfX3Nsb3RzX19gIGRlY2xhcmF0aW9uLAotICAgdGhlIHR5cGUgaW5oZXJpdHMgaXRzIDphdHRyOmB0cF9kaWN0b2Zmc2V0YCBmcm9tIGl0cyBiYXNlIHR5cGUuCisgICB0aGUgdHlwZSBpbmhlcml0cyBpdHMgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2RpY3RvZmZzZXRgIGZyb20gaXRzIGJhc2UgdHlwZS4KIAotICAgKEFkZGluZyBhIHNsb3QgbmFtZWQgOmF0dHI6YF9fZGljdF9fYCB0byB0aGUgOmF0dHI6YF9fc2xvdHNfX2AgZGVjbGFyYXRpb24gZG9lcworICAgKEFkZGluZyBhIHNsb3QgbmFtZWQgOmF0dHI6YH5vYmplY3QuX19kaWN0X19gIHRvIHRoZSA6YXR0cjpgX19zbG90c19fYCBkZWNsYXJhdGlvbiBkb2VzCiAgICBub3QgaGF2ZSB0aGUgZXhwZWN0ZWQgZWZmZWN0LCBpdCBqdXN0IGNhdXNlcyBjb25mdXNpb24uICBNYXliZSB0aGlzIHNob3VsZCBiZQogICAgYWRkZWQgYXMgYSBmZWF0dXJlIGp1c3QgbGlrZSA6YXR0cjpgX193ZWFrcmVmX19gIHRob3VnaC4pCiAKIAotLi4gY21lbWJlcjo6IGluaXRwcm9jIFB5VHlwZU9iamVjdC50cF9pbml0CisuLiBjOm1lbWJlcjo6IGluaXRwcm9jIFB5VHlwZU9iamVjdC50cF9pbml0CiAKICAgIEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gYW4gaW5zdGFuY2UgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uCiAKQEAgLTk1NywyMCArOTU3LDIwIEBACiAgICBhcmd1bWVudHMgcmVwcmVzZW50IHBvc2l0aW9uYWwgYW5kIGtleXdvcmQgYXJndW1lbnRzIG9mIHRoZSBjYWxsIHRvCiAgICA6bWV0aDpgX19pbml0X19gLgogCi0gICBUaGUgOmF0dHI6YHRwX2luaXRgIGZ1bmN0aW9uLCBpZiBub3QgKk5VTEwqLCBpcyBjYWxsZWQgd2hlbiBhbiBpbnN0YW5jZSBpcwotICAgY3JlYXRlZCBub3JtYWxseSBieSBjYWxsaW5nIGl0cyB0eXBlLCBhZnRlciB0aGUgdHlwZSdzIDphdHRyOmB0cF9uZXdgIGZ1bmN0aW9uCi0gICBoYXMgcmV0dXJuZWQgYW4gaW5zdGFuY2Ugb2YgdGhlIHR5cGUuICBJZiB0aGUgOmF0dHI6YHRwX25ld2AgZnVuY3Rpb24gcmV0dXJucyBhbgorICAgVGhlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9pbml0YCBmdW5jdGlvbiwgaWYgbm90ICpOVUxMKiwgaXMgY2FsbGVkIHdoZW4gYW4gaW5zdGFuY2UgaXMKKyAgIGNyZWF0ZWQgbm9ybWFsbHkgYnkgY2FsbGluZyBpdHMgdHlwZSwgYWZ0ZXIgdGhlIHR5cGUncyA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfbmV3YCBmdW5jdGlvbgorICAgaGFzIHJldHVybmVkIGFuIGluc3RhbmNlIG9mIHRoZSB0eXBlLiAgSWYgdGhlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9uZXdgIGZ1bmN0aW9uIHJldHVybnMgYW4KICAgIGluc3RhbmNlIG9mIHNvbWUgb3RoZXIgdHlwZSB0aGF0IGlzIG5vdCBhIHN1YnR5cGUgb2YgdGhlIG9yaWdpbmFsIHR5cGUsIG5vCi0gICA6YXR0cjpgdHBfaW5pdGAgZnVuY3Rpb24gaXMgY2FsbGVkOyBpZiA6YXR0cjpgdHBfbmV3YCByZXR1cm5zIGFuIGluc3RhbmNlIG9mIGEKLSAgIHN1YnR5cGUgb2YgdGhlIG9yaWdpbmFsIHR5cGUsIHRoZSBzdWJ0eXBlJ3MgOmF0dHI6YHRwX2luaXRgIGlzIGNhbGxlZC4gIChWRVJTSU9OCisgICA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfaW5pdGAgZnVuY3Rpb24gaXMgY2FsbGVkOyBpZiA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfbmV3YCByZXR1cm5zIGFuIGluc3RhbmNlIG9mIGEKKyAgIHN1YnR5cGUgb2YgdGhlIG9yaWdpbmFsIHR5cGUsIHRoZSBzdWJ0eXBlJ3MgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2luaXRgIGlzIGNhbGxlZC4gIChWRVJTSU9OCiAgICBOT1RFOiBkZXNjcmliZWQgaGVyZSBpcyB3aGF0IGlzIGltcGxlbWVudGVkIGluIFB5dGhvbiAyLjIuMSBhbmQgbGF0ZXIuICBJbgotICAgUHl0aG9uIDIuMiwgdGhlIDphdHRyOmB0cF9pbml0YCBvZiB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IHJldHVybmVkIGJ5Ci0gICA6YXR0cjpgdHBfbmV3YCB3YXMgYWx3YXlzIGNhbGxlZCwgaWYgbm90ICpOVUxMKi4pCisgICBQeXRob24gMi4yLCB0aGUgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2luaXRgIG9mIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkKKyAgIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9uZXdgIHdhcyBhbHdheXMgY2FsbGVkLCBpZiBub3QgKk5VTEwqLikKIAogICAgVGhpcyBmaWVsZCBpcyBpbmhlcml0ZWQgYnkgc3VidHlwZXMuCiAKIAotLi4gY21lbWJlcjo6IGFsbG9jZnVuYyBQeVR5cGVPYmplY3QudHBfYWxsb2MKKy4uIGM6bWVtYmVyOjogYWxsb2NmdW5jIFB5VHlwZU9iamVjdC50cF9hbGxvYwogCiAgICBBbiBvcHRpb25hbCBwb2ludGVyIHRvIGFuIGluc3RhbmNlIGFsbG9jYXRpb24gZnVuY3Rpb24uCiAKQEAgLTk4MiwyMiArOTgyLDIyIEBACiAgICBpbml0aWFsaXphdGlvbi4gIEl0IHNob3VsZCByZXR1cm4gYSBwb2ludGVyIHRvIGEgYmxvY2sgb2YgbWVtb3J5IG9mIGFkZXF1YXRlCiAgICBsZW5ndGggZm9yIHRoZSBpbnN0YW5jZSwgc3VpdGFibHkgYWxpZ25lZCwgYW5kIGluaXRpYWxpemVkIHRvIHplcm9zLCBidXQgd2l0aAogICAgOmF0dHI6YG9iX3JlZmNudGAgc2V0IHRvIGBgMWBgIGFuZCA6YXR0cjpgb2JfdHlwZWAgc2V0IHRvIHRoZSB0eXBlIGFyZ3VtZW50LiAgSWYKLSAgIHRoZSB0eXBlJ3MgOmF0dHI6YHRwX2l0ZW1zaXplYCBpcyBub24temVybywgdGhlIG9iamVjdCdzIDphdHRyOmBvYl9zaXplYCBmaWVsZAorICAgdGhlIHR5cGUncyA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfaXRlbXNpemVgIGlzIG5vbi16ZXJvLCB0aGUgb2JqZWN0J3MgOmF0dHI6YG9iX3NpemVgIGZpZWxkCiAgICBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgdG8gKm5pdGVtcyogYW5kIHRoZSBsZW5ndGggb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2sKICAgIHNob3VsZCBiZSBgYHRwX2Jhc2ljc2l6ZSArIG5pdGVtcyp0cF9pdGVtc2l6ZWBgLCByb3VuZGVkIHVwIHRvIGEgbXVsdGlwbGUgb2YKICAgIGBgc2l6ZW9mKHZvaWQqKWBgOyBvdGhlcndpc2UsICpuaXRlbXMqIGlzIG5vdCB1c2VkIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBibG9jawotICAgc2hvdWxkIGJlIDphdHRyOmB0cF9iYXNpY3NpemVgLgorICAgc2hvdWxkIGJlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9iYXNpY3NpemVgLgogCiAgICBEbyBub3QgdXNlIHRoaXMgZnVuY3Rpb24gdG8gZG8gYW55IG90aGVyIGluc3RhbmNlIGluaXRpYWxpemF0aW9uLCBub3QgZXZlbiB0bwotICAgYWxsb2NhdGUgYWRkaXRpb25hbCBtZW1vcnk7IHRoYXQgc2hvdWxkIGJlIGRvbmUgYnkgOmF0dHI6YHRwX25ld2AuCisgICBhbGxvY2F0ZSBhZGRpdGlvbmFsIG1lbW9yeTsgdGhhdCBzaG91bGQgYmUgZG9uZSBieSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfbmV3YC4KIAogICAgVGhpcyBmaWVsZCBpcyBpbmhlcml0ZWQgYnkgc3RhdGljIHN1YnR5cGVzLCBidXQgbm90IGJ5IGR5bmFtaWMgc3VidHlwZXMKICAgIChzdWJ0eXBlcyBjcmVhdGVkIGJ5IGEgY2xhc3Mgc3RhdGVtZW50KTsgaW4gdGhlIGxhdHRlciwgdGhpcyBmaWVsZCBpcyBhbHdheXMgc2V0Ci0gICB0byA6Y2Z1bmM6YFB5VHlwZV9HZW5lcmljQWxsb2NgLCB0byBmb3JjZSBhIHN0YW5kYXJkIGhlYXAgYWxsb2NhdGlvbiBzdHJhdGVneS4KKyAgIHRvIDpjOmZ1bmM6YFB5VHlwZV9HZW5lcmljQWxsb2NgLCB0byBmb3JjZSBhIHN0YW5kYXJkIGhlYXAgYWxsb2NhdGlvbiBzdHJhdGVneS4KICAgIFRoYXQgaXMgYWxzbyB0aGUgcmVjb21tZW5kZWQgdmFsdWUgZm9yIHN0YXRpY2FsbHkgZGVmaW5lZCB0eXBlcy4KIAogCi0uLiBjbWVtYmVyOjogbmV3ZnVuYyBQeVR5cGVPYmplY3QudHBfbmV3CisuLiBjOm1lbWJlcjo6IG5ld2Z1bmMgUHlUeXBlT2JqZWN0LnRwX25ldwogCiAgICBBbiBvcHRpb25hbCBwb2ludGVyIHRvIGFuIGluc3RhbmNlIGNyZWF0aW9uIGZ1bmN0aW9uLgogCkBAIC0xMDExLDM0ICsxMDExLDM0IEBACiAKICAgIFRoZSBzdWJ0eXBlIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgYmVpbmcgY3JlYXRlZDsgdGhlICphcmdzKiBhbmQKICAgICprd2RzKiBhcmd1bWVudHMgcmVwcmVzZW50IHBvc2l0aW9uYWwgYW5kIGtleXdvcmQgYXJndW1lbnRzIG9mIHRoZSBjYWxsIHRvIHRoZQotICAgdHlwZS4gIE5vdGUgdGhhdCBzdWJ0eXBlIGRvZXNuJ3QgaGF2ZSB0byBlcXVhbCB0aGUgdHlwZSB3aG9zZSA6YXR0cjpgdHBfbmV3YAorICAgdHlwZS4gIE5vdGUgdGhhdCBzdWJ0eXBlIGRvZXNuJ3QgaGF2ZSB0byBlcXVhbCB0aGUgdHlwZSB3aG9zZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfbmV3YAogICAgZnVuY3Rpb24gaXMgY2FsbGVkOyBpdCBtYXkgYmUgYSBzdWJ0eXBlIG9mIHRoYXQgdHlwZSAoYnV0IG5vdCBhbiB1bnJlbGF0ZWQKICAgIHR5cGUpLgogCi0gICBUaGUgOmF0dHI6YHRwX25ld2AgZnVuY3Rpb24gc2hvdWxkIGNhbGwgYGBzdWJ0eXBlLT50cF9hbGxvYyhzdWJ0eXBlLCBuaXRlbXMpYGAKKyAgIFRoZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfbmV3YCBmdW5jdGlvbiBzaG91bGQgY2FsbCBgYHN1YnR5cGUtPnRwX2FsbG9jKHN1YnR5cGUsIG5pdGVtcylgYAogICAgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBvYmplY3QsIGFuZCB0aGVuIGRvIG9ubHkgYXMgbXVjaCBmdXJ0aGVyCiAgICBpbml0aWFsaXphdGlvbiBhcyBpcyBhYnNvbHV0ZWx5IG5lY2Vzc2FyeS4gIEluaXRpYWxpemF0aW9uIHRoYXQgY2FuIHNhZmVseSBiZQotICAgaWdub3JlZCBvciByZXBlYXRlZCBzaG91bGQgYmUgcGxhY2VkIGluIHRoZSA6YXR0cjpgdHBfaW5pdGAgaGFuZGxlci4gIEEgZ29vZAorICAgaWdub3JlZCBvciByZXBlYXRlZCBzaG91bGQgYmUgcGxhY2VkIGluIHRoZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfaW5pdGAgaGFuZGxlci4gIEEgZ29vZAogICAgcnVsZSBvZiB0aHVtYiBpcyB0aGF0IGZvciBpbW11dGFibGUgdHlwZXMsIGFsbCBpbml0aWFsaXphdGlvbiBzaG91bGQgdGFrZSBwbGFjZQotICAgaW4gOmF0dHI6YHRwX25ld2AsIHdoaWxlIGZvciBtdXRhYmxlIHR5cGVzLCBtb3N0IGluaXRpYWxpemF0aW9uIHNob3VsZCBiZQotICAgZGVmZXJyZWQgdG8gOmF0dHI6YHRwX2luaXRgLgorICAgaW4gOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX25ld2AsIHdoaWxlIGZvciBtdXRhYmxlIHR5cGVzLCBtb3N0IGluaXRpYWxpemF0aW9uIHNob3VsZCBiZQorICAgZGVmZXJyZWQgdG8gOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2luaXRgLgogCiAgICBUaGlzIGZpZWxkIGlzIGluaGVyaXRlZCBieSBzdWJ0eXBlcywgZXhjZXB0IGl0IGlzIG5vdCBpbmhlcml0ZWQgYnkgc3RhdGljIHR5cGVzCi0gICB3aG9zZSA6YXR0cjpgdHBfYmFzZWAgaXMgKk5VTEwqIG9yIGBgJlB5QmFzZU9iamVjdF9UeXBlYGAuICBUaGUgbGF0dGVyIGV4Y2VwdGlvbgorICAgd2hvc2UgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2Jhc2VgIGlzICpOVUxMKiBvciBgYCZQeUJhc2VPYmplY3RfVHlwZWBgLiAgVGhlIGxhdHRlciBleGNlcHRpb24KICAgIGlzIGEgcHJlY2F1dGlvbiBzbyB0aGF0IG9sZCBleHRlbnNpb24gdHlwZXMgZG9uJ3QgYmVjb21lIGNhbGxhYmxlIHNpbXBseSBieQogICAgYmVpbmcgbGlua2VkIHdpdGggUHl0aG9uIDIuMi4KIAogCi0uLiBjbWVtYmVyOjogZGVzdHJ1Y3RvciBQeVR5cGVPYmplY3QudHBfZnJlZQorLi4gYzptZW1iZXI6OiBkZXN0cnVjdG9yIFB5VHlwZU9iamVjdC50cF9mcmVlCiAKICAgIEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gYW4gaW5zdGFuY2UgZGVhbGxvY2F0aW9uIGZ1bmN0aW9uLgogCiAgICBUaGUgc2lnbmF0dXJlIG9mIHRoaXMgZnVuY3Rpb24gaGFzIGNoYW5nZWQgc2xpZ2h0bHk6IGluIFB5dGhvbiAyLjIgYW5kIDIuMi4xLAotICAgaXRzIHNpZ25hdHVyZSBpcyA6Y3R5cGU6YGRlc3RydWN0b3JgOjoKKyAgIGl0cyBzaWduYXR1cmUgaXMgOmM6dHlwZTpgZGVzdHJ1Y3RvcmA6OgogCiAgICAgICB2b2lkIHRwX2ZyZWUoUHlPYmplY3QgKikKIAotICAgSW4gUHl0aG9uIDIuMyBhbmQgYmV5b25kLCBpdHMgc2lnbmF0dXJlIGlzIDpjdHlwZTpgZnJlZWZ1bmNgOjoKKyAgIEluIFB5dGhvbiAyLjMgYW5kIGJleW9uZCwgaXRzIHNpZ25hdHVyZSBpcyA6Yzp0eXBlOmBmcmVlZnVuY2A6OgogCiAgICAgICB2b2lkIHRwX2ZyZWUodm9pZCAqKQogCkBAIC0xMDQ3LDE3ICsxMDQ3LDE3IEBACiAKICAgIFRoaXMgZmllbGQgaXMgaW5oZXJpdGVkIGJ5IHN0YXRpYyBzdWJ0eXBlcywgYnV0IG5vdCBieSBkeW5hbWljIHN1YnR5cGVzCiAgICAoc3VidHlwZXMgY3JlYXRlZCBieSBhIGNsYXNzIHN0YXRlbWVudCk7IGluIHRoZSBsYXR0ZXIsIHRoaXMgZmllbGQgaXMgc2V0IHRvIGEKLSAgIGRlYWxsb2NhdG9yIHN1aXRhYmxlIHRvIG1hdGNoIDpjZnVuYzpgUHlUeXBlX0dlbmVyaWNBbGxvY2AgYW5kIHRoZSB2YWx1ZSBvZiB0aGUKKyAgIGRlYWxsb2NhdG9yIHN1aXRhYmxlIHRvIG1hdGNoIDpjOmZ1bmM6YFB5VHlwZV9HZW5lcmljQWxsb2NgIGFuZCB0aGUgdmFsdWUgb2YgdGhlCiAgICA6Y29uc3Q6YFB5X1RQRkxBR1NfSEFWRV9HQ2AgZmxhZyBiaXQuCiAKIAotLi4gY21lbWJlcjo6IGlucXVpcnkgUHlUeXBlT2JqZWN0LnRwX2lzX2djCisuLiBjOm1lbWJlcjo6IGlucXVpcnkgUHlUeXBlT2JqZWN0LnRwX2lzX2djCiAKICAgIEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiBjYWxsZWQgYnkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLgogCiAgICBUaGUgZ2FyYmFnZSBjb2xsZWN0b3IgbmVlZHMgdG8ga25vdyB3aGV0aGVyIGEgcGFydGljdWxhciBvYmplY3QgaXMgY29sbGVjdGlibGUKICAgIG9yIG5vdC4gIE5vcm1hbGx5LCBpdCBpcyBzdWZmaWNpZW50IHRvIGxvb2sgYXQgdGhlIG9iamVjdCdzIHR5cGUncwotICAgOmF0dHI6YHRwX2ZsYWdzYCBmaWVsZCwgYW5kIGNoZWNrIHRoZSA6Y29uc3Q6YFB5X1RQRkxBR1NfSEFWRV9HQ2AgZmxhZyBiaXQuICBCdXQKKyAgIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9mbGFnc2AgZmllbGQsIGFuZCBjaGVjayB0aGUgOmNvbnN0OmBQeV9UUEZMQUdTX0hBVkVfR0NgIGZsYWcgYml0LiAgQnV0CiAgICBzb21lIHR5cGVzIGhhdmUgYSBtaXh0dXJlIG9mIHN0YXRpY2FsbHkgYW5kIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBpbnN0YW5jZXMsIGFuZAogICAgdGhlIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGluc3RhbmNlcyBhcmUgbm90IGNvbGxlY3RpYmxlLiAgU3VjaCB0eXBlcyBzaG91bGQKICAgIGRlZmluZSB0aGlzIGZ1bmN0aW9uOyBpdCBzaG91bGQgcmV0dXJuIGBgMWBgIGZvciBhIGNvbGxlY3RpYmxlIGluc3RhbmNlLCBhbmQKQEAgLTEwNjYsMTQgKzEwNjYsMTQgQEAKICAgICAgIGludCB0cF9pc19nYyhQeU9iamVjdCAqc2VsZikKIAogICAgKFRoZSBvbmx5IGV4YW1wbGUgb2YgdGhpcyBhcmUgdHlwZXMgdGhlbXNlbHZlcy4gIFRoZSBtZXRhdHlwZSwKLSAgIDpjZGF0YTpgUHlUeXBlX1R5cGVgLCBkZWZpbmVzIHRoaXMgZnVuY3Rpb24gdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBzdGF0aWNhbGx5CisgICA6YzpkYXRhOmBQeVR5cGVfVHlwZWAsIGRlZmluZXMgdGhpcyBmdW5jdGlvbiB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHN0YXRpY2FsbHkKICAgIGFuZCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgdHlwZXMuKQogCiAgICBUaGlzIGZpZWxkIGlzIGluaGVyaXRlZCBieSBzdWJ0eXBlcy4gIChWRVJTSU9OIE5PVEU6IGluIFB5dGhvbiAyLjIsIGl0IHdhcyBub3QKICAgIGluaGVyaXRlZC4gIEl0IGlzIGluaGVyaXRlZCBpbiAyLjIuMSBhbmQgbGF0ZXIgdmVyc2lvbnMuKQogCiAKLS4uIGNtZW1iZXI6OiBQeU9iamVjdCogUHlUeXBlT2JqZWN0LnRwX2Jhc2VzCisuLiBjOm1lbWJlcjo6IFB5T2JqZWN0KiBQeVR5cGVPYmplY3QudHBfYmFzZXMKIAogICAgVHVwbGUgb2YgYmFzZSB0eXBlcy4KIApAQCAtMTA4MywyNSArMTA4MywyNSBAQAogICAgVGhpcyBmaWVsZCBpcyBub3QgaW5oZXJpdGVkLgogCiAKLS4uIGNtZW1iZXI6OiBQeU9iamVjdCogUHlUeXBlT2JqZWN0LnRwX21ybworLi4gYzptZW1iZXI6OiBQeU9iamVjdCogUHlUeXBlT2JqZWN0LnRwX21ybwogCiAgICBUdXBsZSBjb250YWluaW5nIHRoZSBleHBhbmRlZCBzZXQgb2YgYmFzZSB0eXBlcywgc3RhcnRpbmcgd2l0aCB0aGUgdHlwZSBpdHNlbGYKICAgIGFuZCBlbmRpbmcgd2l0aCA6Y2xhc3M6YG9iamVjdGAsIGluIE1ldGhvZCBSZXNvbHV0aW9uIE9yZGVyLgogCi0gICBUaGlzIGZpZWxkIGlzIG5vdCBpbmhlcml0ZWQ7IGl0IGlzIGNhbGN1bGF0ZWQgZnJlc2ggYnkgOmNmdW5jOmBQeVR5cGVfUmVhZHlgLgorICAgVGhpcyBmaWVsZCBpcyBub3QgaW5oZXJpdGVkOyBpdCBpcyBjYWxjdWxhdGVkIGZyZXNoIGJ5IDpjOmZ1bmM6YFB5VHlwZV9SZWFkeWAuCiAKIAotLi4gY21lbWJlcjo6IFB5T2JqZWN0KiBQeVR5cGVPYmplY3QudHBfY2FjaGUKKy4uIGM6bWVtYmVyOjogUHlPYmplY3QqIFB5VHlwZU9iamVjdC50cF9jYWNoZQogCiAgICBVbnVzZWQuICBOb3QgaW5oZXJpdGVkLiAgSW50ZXJuYWwgdXNlIG9ubHkuCiAKIAotLi4gY21lbWJlcjo6IFB5T2JqZWN0KiBQeVR5cGVPYmplY3QudHBfc3ViY2xhc3NlcworLi4gYzptZW1iZXI6OiBQeU9iamVjdCogUHlUeXBlT2JqZWN0LnRwX3N1YmNsYXNzZXMKIAogICAgTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgdG8gc3ViY2xhc3Nlcy4gIE5vdCBpbmhlcml0ZWQuICBJbnRlcm5hbCB1c2Ugb25seS4KIAogCi0uLiBjbWVtYmVyOjogUHlPYmplY3QqIFB5VHlwZU9iamVjdC50cF93ZWFrbGlzdAorLi4gYzptZW1iZXI6OiBQeU9iamVjdCogUHlUeXBlT2JqZWN0LnRwX3dlYWtsaXN0CiAKICAgIFdlYWsgcmVmZXJlbmNlIGxpc3QgaGVhZCwgZm9yIHdlYWsgcmVmZXJlbmNlcyB0byB0aGlzIHR5cGUgb2JqZWN0LiAgTm90CiAgICBpbmhlcml0ZWQuICBJbnRlcm5hbCB1c2Ugb25seS4KQEAgLTExMTIsMjQgKzExMTIsMjQgQEAKIHN1YnR5cGVzLgogCiAKLS4uIGNtZW1iZXI6OiBQeV9zc2l6ZV90IFB5VHlwZU9iamVjdC50cF9hbGxvY3MKKy4uIGM6bWVtYmVyOjogUHlfc3NpemVfdCBQeVR5cGVPYmplY3QudHBfYWxsb2NzCiAKICAgIE51bWJlciBvZiBhbGxvY2F0aW9ucy4KIAogCi0uLiBjbWVtYmVyOjogUHlfc3NpemVfdCBQeVR5cGVPYmplY3QudHBfZnJlZXMKKy4uIGM6bWVtYmVyOjogUHlfc3NpemVfdCBQeVR5cGVPYmplY3QudHBfZnJlZXMKIAogICAgTnVtYmVyIG9mIGZyZWVzLgogCiAKLS4uIGNtZW1iZXI6OiBQeV9zc2l6ZV90IFB5VHlwZU9iamVjdC50cF9tYXhhbGxvYworLi4gYzptZW1iZXI6OiBQeV9zc2l6ZV90IFB5VHlwZU9iamVjdC50cF9tYXhhbGxvYwogCiAgICBNYXhpbXVtIHNpbXVsdGFuZW91c2x5IGFsbG9jYXRlZCBvYmplY3RzLgogCiAKLS4uIGNtZW1iZXI6OiBQeVR5cGVPYmplY3QqIFB5VHlwZU9iamVjdC50cF9uZXh0CisuLiBjOm1lbWJlcjo6IFB5VHlwZU9iamVjdCogUHlUeXBlT2JqZWN0LnRwX25leHQKIAotICAgUG9pbnRlciB0byB0aGUgbmV4dCB0eXBlIG9iamVjdCB3aXRoIGEgbm9uLXplcm8gOmF0dHI6YHRwX2FsbG9jc2AgZmllbGQuCisgICBQb2ludGVyIHRvIHRoZSBuZXh0IHR5cGUgb2JqZWN0IHdpdGggYSBub24temVybyA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfYWxsb2NzYCBmaWVsZC4KIAogQWxzbywgbm90ZSB0aGF0LCBpbiBhIGdhcmJhZ2UgY29sbGVjdGVkIFB5dGhvbiwgdHBfZGVhbGxvYyBtYXkgYmUgY2FsbGVkIGZyb20KIGFueSBQeXRob24gdGhyZWFkLCBub3QganVzdCB0aGUgdGhyZWFkIHdoaWNoIGNyZWF0ZWQgdGhlIG9iamVjdCAoaWYgdGhlIG9iamVjdApAQCAtMTE1MCw3ICsxMTUwLDcgQEAKIC4uIHNlY3Rpb25hdXRob3I6OiBBbWF1cnkgRm9yZ2VvdCBkJ0FyYwogCiAKLS4uIGN0eXBlOjogUHlOdW1iZXJNZXRob2RzCisuLiBjOnR5cGU6OiBQeU51bWJlck1ldGhvZHMKIAogICAgVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgcG9pbnRlcnMgdG8gdGhlIGZ1bmN0aW9ucyB3aGljaCBhbiBvYmplY3QgdXNlcyB0bwogICAgaW1wbGVtZW50IHRoZSBudW1iZXIgcHJvdG9jb2wuICBBbG1vc3QgZXZlcnkgZnVuY3Rpb24gYmVsb3cgaXMgdXNlZCBieSB0aGUKQEAgLTEyMTUsOSArMTIxNSw5IEBACiAgIHRoZSBjb2VyY2lvbiBtZXRob2Qgc3BlY2lmaWVkIGJ5IHRoZSA6YXR0cjpgbmJfY29lcmNlYCBtZW1iZXIgdG8gY29udmVydCB0aGUKICAgYXJndW1lbnRzOgogCi0gIC4uIGNtZW1iZXI6OiBjb2VyY2lvbiBQeU51bWJlck1ldGhvZHMubmJfY29lcmNlCisgIC4uIGM6bWVtYmVyOjogY29lcmNpb24gUHlOdW1iZXJNZXRob2RzLm5iX2NvZXJjZQogCi0gICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSA6Y2Z1bmM6YFB5TnVtYmVyX0NvZXJjZUV4YCBhbmQgaGFzIHRoZSBzYW1lCisgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSA6YzpmdW5jOmBQeU51bWJlcl9Db2VyY2VFeGAgYW5kIGhhcyB0aGUgc2FtZQogICAgICBzaWduYXR1cmUuICBUaGUgZmlyc3QgYXJndW1lbnQgaXMgYWx3YXlzIGEgcG9pbnRlciB0byBhbiBvYmplY3Qgb2YgdGhlCiAgICAgIGRlZmluZWQgdHlwZS4gIElmIHRoZSBjb252ZXJzaW9uIHRvIGEgY29tbW9uICJsYXJnZXIiIHR5cGUgaXMgcG9zc2libGUsIHRoZQogICAgICBmdW5jdGlvbiByZXBsYWNlcyB0aGUgcG9pbnRlcnMgd2l0aCBuZXcgcmVmZXJlbmNlcyB0byB0aGUgY29udmVydGVkIG9iamVjdHMKQEAgLTEyMjcsNyArMTIyNyw3IEBACiAtIElmIHRoZSA6Y29uc3Q6YFB5X1RQRkxBR1NfQ0hFQ0tUWVBFU2AgZmxhZyBpcyBzZXQsIGJpbmFyeSBhbmQgdGVybmFyeQogICBmdW5jdGlvbnMgbXVzdCBjaGVjayB0aGUgdHlwZSBvZiBhbGwgdGhlaXIgb3BlcmFuZHMsIGFuZCBpbXBsZW1lbnQgdGhlCiAgIG5lY2Vzc2FyeSBjb252ZXJzaW9ucyAoYXQgbGVhc3Qgb25lIG9mIHRoZSBvcGVyYW5kcyBpcyBhbiBpbnN0YW5jZSBvZiB0aGUKLSAgZGVmaW5lZCB0eXBlKS4gIFRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIHdheTsgd2l0aCBQeXRob24gMy4wIGNvZXJjaW9uIHdpbGwKKyAgZGVmaW5lZCB0eXBlKS4gIFRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIHdheTsgd2l0aCBQeXRob24gMyBjb2VyY2lvbiB3aWxsCiAgIGRpc2FwcGVhciBjb21wbGV0ZWx5LgogCiBJZiB0aGUgb3BlcmF0aW9uIGlzIG5vdCBkZWZpbmVkIGZvciB0aGUgZ2l2ZW4gb3BlcmFuZHMsIGJpbmFyeSBhbmQgdGVybmFyeQpAQCAtMTI0MywyNiArMTI0MywyNiBAQAogLi4gc2VjdGlvbmF1dGhvcjo6IEFtYXVyeSBGb3JnZW90IGQnQXJjCiAKIAotLi4gY3R5cGU6OiBQeU1hcHBpbmdNZXRob2RzCisuLiBjOnR5cGU6OiBQeU1hcHBpbmdNZXRob2RzCiAKICAgIFRoaXMgc3RydWN0dXJlIGhvbGRzIHBvaW50ZXJzIHRvIHRoZSBmdW5jdGlvbnMgd2hpY2ggYW4gb2JqZWN0IHVzZXMgdG8KICAgIGltcGxlbWVudCB0aGUgbWFwcGluZyBwcm90b2NvbC4gIEl0IGhhcyB0aHJlZSBtZW1iZXJzOgogCi0uLiBjbWVtYmVyOjogbGVuZnVuYyBQeU1hcHBpbmdNZXRob2RzLm1wX2xlbmd0aAorLi4gYzptZW1iZXI6OiBsZW5mdW5jIFB5TWFwcGluZ01ldGhvZHMubXBfbGVuZ3RoCiAKLSAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSA6Y2Z1bmM6YFB5TWFwcGluZ19MZW5ndGhgIGFuZAotICAgOmNmdW5jOmBQeU9iamVjdF9TaXplYCwgYW5kIGhhcyB0aGUgc2FtZSBzaWduYXR1cmUuICBUaGlzIHNsb3QgbWF5IGJlIHNldCB0bworICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IDpjOmZ1bmM6YFB5TWFwcGluZ19MZW5ndGhgIGFuZAorICAgOmM6ZnVuYzpgUHlPYmplY3RfU2l6ZWAsIGFuZCBoYXMgdGhlIHNhbWUgc2lnbmF0dXJlLiAgVGhpcyBzbG90IG1heSBiZSBzZXQgdG8KICAgICpOVUxMKiBpZiB0aGUgb2JqZWN0IGhhcyBubyBkZWZpbmVkIGxlbmd0aC4KIAotLi4gY21lbWJlcjo6IGJpbmFyeWZ1bmMgUHlNYXBwaW5nTWV0aG9kcy5tcF9zdWJzY3JpcHQKKy4uIGM6bWVtYmVyOjogYmluYXJ5ZnVuYyBQeU1hcHBpbmdNZXRob2RzLm1wX3N1YnNjcmlwdAogCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgOmNmdW5jOmBQeU9iamVjdF9HZXRJdGVtYCBhbmQgaGFzIHRoZSBzYW1lCi0gICBzaWduYXR1cmUuICBUaGlzIHNsb3QgbXVzdCBiZSBmaWxsZWQgZm9yIHRoZSA6Y2Z1bmM6YFB5TWFwcGluZ19DaGVja2AKKyAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSA6YzpmdW5jOmBQeU9iamVjdF9HZXRJdGVtYCBhbmQgaGFzIHRoZSBzYW1lCisgICBzaWduYXR1cmUuICBUaGlzIHNsb3QgbXVzdCBiZSBmaWxsZWQgZm9yIHRoZSA6YzpmdW5jOmBQeU1hcHBpbmdfQ2hlY2tgCiAgICBmdW5jdGlvbiB0byByZXR1cm4gYGAxYGAsIGl0IGNhbiBiZSAqTlVMTCogb3RoZXJ3aXNlLgogCi0uLiBjbWVtYmVyOjogb2Jqb2JqYXJncHJvYyBQeU1hcHBpbmdNZXRob2RzLm1wX2Fzc19zdWJzY3JpcHQKKy4uIGM6bWVtYmVyOjogb2Jqb2JqYXJncHJvYyBQeU1hcHBpbmdNZXRob2RzLm1wX2Fzc19zdWJzY3JpcHQKIAotICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IDpjZnVuYzpgUHlPYmplY3RfU2V0SXRlbWAgYW5kIGhhcyB0aGUgc2FtZQorICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IDpjOmZ1bmM6YFB5T2JqZWN0X1NldEl0ZW1gIGFuZCBoYXMgdGhlIHNhbWUKICAgIHNpZ25hdHVyZS4gIElmIHRoaXMgc2xvdCBpcyAqTlVMTCosIHRoZSBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpdGVtCiAgICBhc3NpZ25tZW50LgogCkBAIC0xMjc1LDMyICsxMjc1LDMzIEBACiAuLiBzZWN0aW9uYXV0aG9yOjogQW1hdXJ5IEZvcmdlb3QgZCdBcmMKIAogCi0uLiBjdHlwZTo6IFB5U2VxdWVuY2VNZXRob2RzCisuLiBjOnR5cGU6OiBQeVNlcXVlbmNlTWV0aG9kcwogCiAgICBUaGlzIHN0cnVjdHVyZSBob2xkcyBwb2ludGVycyB0byB0aGUgZnVuY3Rpb25zIHdoaWNoIGFuIG9iamVjdCB1c2VzIHRvCiAgICBpbXBsZW1lbnQgdGhlIHNlcXVlbmNlIHByb3RvY29sLgogCi0uLiBjbWVtYmVyOjogbGVuZnVuYyBQeVNlcXVlbmNlTWV0aG9kcy5zcV9sZW5ndGgKKy4uIGM6bWVtYmVyOjogbGVuZnVuYyBQeVNlcXVlbmNlTWV0aG9kcy5zcV9sZW5ndGgKIAotICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IDpjZnVuYzpgUHlTZXF1ZW5jZV9TaXplYCBhbmQgOmNmdW5jOmBQeU9iamVjdF9TaXplYCwKKyAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSA6YzpmdW5jOmBQeVNlcXVlbmNlX1NpemVgIGFuZCA6YzpmdW5jOmBQeU9iamVjdF9TaXplYCwKICAgIGFuZCBoYXMgdGhlIHNhbWUgc2lnbmF0dXJlLgogCi0uLiBjbWVtYmVyOjogYmluYXJ5ZnVuYyBQeVNlcXVlbmNlTWV0aG9kcy5zcV9jb25jYXQKKy4uIGM6bWVtYmVyOjogYmluYXJ5ZnVuYyBQeVNlcXVlbmNlTWV0aG9kcy5zcV9jb25jYXQKIAotICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IDpjZnVuYzpgUHlTZXF1ZW5jZV9Db25jYXRgIGFuZCBoYXMgdGhlIHNhbWUKKyAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSA6YzpmdW5jOmBQeVNlcXVlbmNlX0NvbmNhdGAgYW5kIGhhcyB0aGUgc2FtZQogICAgc2lnbmF0dXJlLiAgSXQgaXMgYWxzbyB1c2VkIGJ5IHRoZSBgYCtgYCBvcGVyYXRvciwgYWZ0ZXIgdHJ5aW5nIHRoZSBudW1lcmljCi0gICBhZGRpdGlvbiB2aWEgdGhlIDphdHRyOmB0cF9hc19udW1iZXIubmJfYWRkYCBzbG90LgorICAgYWRkaXRpb24gdmlhIHRoZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfYXNfbnVtYmVyLm5iX2FkZGAgc2xvdC4KIAotLi4gY21lbWJlcjo6IHNzaXplYXJnZnVuYyBQeVNlcXVlbmNlTWV0aG9kcy5zcV9yZXBlYXQKKy4uIGM6bWVtYmVyOjogc3NpemVhcmdmdW5jIFB5U2VxdWVuY2VNZXRob2RzLnNxX3JlcGVhdAogCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgOmNmdW5jOmBQeVNlcXVlbmNlX1JlcGVhdGAgYW5kIGhhcyB0aGUgc2FtZQorICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IDpjOmZ1bmM6YFB5U2VxdWVuY2VfUmVwZWF0YCBhbmQgaGFzIHRoZSBzYW1lCiAgICBzaWduYXR1cmUuICBJdCBpcyBhbHNvIHVzZWQgYnkgdGhlIGBgKmBgIG9wZXJhdG9yLCBhZnRlciB0cnlpbmcgbnVtZXJpYwotICAgbXVsdGlwbGljYXRpb24gdmlhIHRoZSA6YXR0cjpgdHBfYXNfbnVtYmVyLm5iX211bGAgc2xvdC4KKyAgIG11bHRpcGxpY2F0aW9uIHZpYSB0aGUgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2FzX251bWJlci5uYl9tdWx0aXBseWAKKyAgIHNsb3QuCiAKLS4uIGNtZW1iZXI6OiBzc2l6ZWFyZ2Z1bmMgUHlTZXF1ZW5jZU1ldGhvZHMuc3FfaXRlbQorLi4gYzptZW1iZXI6OiBzc2l6ZWFyZ2Z1bmMgUHlTZXF1ZW5jZU1ldGhvZHMuc3FfaXRlbQogCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgOmNmdW5jOmBQeVNlcXVlbmNlX0dldEl0ZW1gIGFuZCBoYXMgdGhlIHNhbWUKLSAgIHNpZ25hdHVyZS4gIFRoaXMgc2xvdCBtdXN0IGJlIGZpbGxlZCBmb3IgdGhlIDpjZnVuYzpgUHlTZXF1ZW5jZV9DaGVja2AKKyAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSA6YzpmdW5jOmBQeVNlcXVlbmNlX0dldEl0ZW1gIGFuZCBoYXMgdGhlIHNhbWUKKyAgIHNpZ25hdHVyZS4gIFRoaXMgc2xvdCBtdXN0IGJlIGZpbGxlZCBmb3IgdGhlIDpjOmZ1bmM6YFB5U2VxdWVuY2VfQ2hlY2tgCiAgICBmdW5jdGlvbiB0byByZXR1cm4gYGAxYGAsIGl0IGNhbiBiZSAqTlVMTCogb3RoZXJ3aXNlLgogCiAgICBOZWdhdGl2ZSBpbmRleGVzIGFyZSBoYW5kbGVkIGFzIGZvbGxvd3M6IGlmIHRoZSA6YXR0cjpgc3FfbGVuZ3RoYCBzbG90IGlzCkBAIC0xMzA4LDI3ICsxMzA5LDI3IEBACiAgICBpbmRleCB3aGljaCBpcyBwYXNzZWQgdG8gOmF0dHI6YHNxX2l0ZW1gLiAgSWYgOmF0dHI6YHNxX2xlbmd0aGAgaXMgKk5VTEwqLAogICAgdGhlIGluZGV4IGlzIHBhc3NlZCBhcyBpcyB0byB0aGUgZnVuY3Rpb24uCiAKLS4uIGNtZW1iZXI6OiBzc2l6ZW9iamFyZ3Byb2MgUHlTZXF1ZW5jZU1ldGhvZHMuc3FfYXNzX2l0ZW0KKy4uIGM6bWVtYmVyOjogc3NpemVvYmphcmdwcm9jIFB5U2VxdWVuY2VNZXRob2RzLnNxX2Fzc19pdGVtCiAKLSAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSA6Y2Z1bmM6YFB5U2VxdWVuY2VfU2V0SXRlbWAgYW5kIGhhcyB0aGUgc2FtZQorICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IDpjOmZ1bmM6YFB5U2VxdWVuY2VfU2V0SXRlbWAgYW5kIGhhcyB0aGUgc2FtZQogICAgc2lnbmF0dXJlLiAgVGhpcyBzbG90IG1heSBiZSBsZWZ0IHRvICpOVUxMKiBpZiB0aGUgb2JqZWN0IGRvZXMgbm90IHN1cHBvcnQKICAgIGl0ZW0gYXNzaWdubWVudC4KIAotLi4gY21lbWJlcjo6IG9iam9ianByb2MgUHlTZXF1ZW5jZU1ldGhvZHMuc3FfY29udGFpbnMKKy4uIGM6bWVtYmVyOjogb2Jqb2JqcHJvYyBQeVNlcXVlbmNlTWV0aG9kcy5zcV9jb250YWlucwogCi0gICBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIGJ5IDpjZnVuYzpgUHlTZXF1ZW5jZV9Db250YWluc2AgYW5kIGhhcyB0aGUgc2FtZQorICAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZCBieSA6YzpmdW5jOmBQeVNlcXVlbmNlX0NvbnRhaW5zYCBhbmQgaGFzIHRoZSBzYW1lCiAgICBzaWduYXR1cmUuICBUaGlzIHNsb3QgbWF5IGJlIGxlZnQgdG8gKk5VTEwqLCBpbiB0aGlzIGNhc2UKLSAgIDpjZnVuYzpgUHlTZXF1ZW5jZV9Db250YWluc2Agc2ltcGx5IHRyYXZlcnNlcyB0aGUgc2VxdWVuY2UgdW50aWwgaXQgZmluZHMgYQorICAgOmM6ZnVuYzpgUHlTZXF1ZW5jZV9Db250YWluc2Agc2ltcGx5IHRyYXZlcnNlcyB0aGUgc2VxdWVuY2UgdW50aWwgaXQgZmluZHMgYQogICAgbWF0Y2guCiAKLS4uIGNtZW1iZXI6OiBiaW5hcnlmdW5jIFB5U2VxdWVuY2VNZXRob2RzLnNxX2lucGxhY2VfY29uY2F0CisuLiBjOm1lbWJlcjo6IGJpbmFyeWZ1bmMgUHlTZXF1ZW5jZU1ldGhvZHMuc3FfaW5wbGFjZV9jb25jYXQKIAotICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IDpjZnVuYzpgUHlTZXF1ZW5jZV9JblBsYWNlQ29uY2F0YCBhbmQgaGFzIHRoZSBzYW1lCisgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgOmM6ZnVuYzpgUHlTZXF1ZW5jZV9JblBsYWNlQ29uY2F0YCBhbmQgaGFzIHRoZSBzYW1lCiAgICBzaWduYXR1cmUuICBJdCBzaG91bGQgbW9kaWZ5IGl0cyBmaXJzdCBvcGVyYW5kLCBhbmQgcmV0dXJuIGl0LgogCi0uLiBjbWVtYmVyOjogc3NpemVhcmdmdW5jIFB5U2VxdWVuY2VNZXRob2RzLnNxX2lucGxhY2VfcmVwZWF0CisuLiBjOm1lbWJlcjo6IHNzaXplYXJnZnVuYyBQeVNlcXVlbmNlTWV0aG9kcy5zcV9pbnBsYWNlX3JlcGVhdAogCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgOmNmdW5jOmBQeVNlcXVlbmNlX0luUGxhY2VSZXBlYXRgIGFuZCBoYXMgdGhlIHNhbWUKKyAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSA6YzpmdW5jOmBQeVNlcXVlbmNlX0luUGxhY2VSZXBlYXRgIGFuZCBoYXMgdGhlIHNhbWUKICAgIHNpZ25hdHVyZS4gIEl0IHNob3VsZCBtb2RpZnkgaXRzIGZpcnN0IG9wZXJhbmQsIGFuZCByZXR1cm4gaXQuCiAKIC4uIFhYWCBuZWVkIHRvIGV4cGxhaW4gcHJlY2VkZW5jZSBiZXR3ZWVuIG1hcHBpbmcgYW5kIHNlcXVlbmNlCkBAIC0xMzQ4LDQ2ICsxMzQ5LDQ2IEBACiBwb2ludGVyL2xlbmd0aCBwYWlyLiAgVGhlc2UgY2h1bmtzIGFyZSBjYWxsZWQgOmRmbjpgc2VnbWVudHNgIGFuZCBhcmUgcHJlc3VtZWQKIHRvIGJlIG5vbi1jb250aWd1b3VzIGluIG1lbW9yeS4KIAotSWYgYW4gb2JqZWN0IGRvZXMgbm90IGV4cG9ydCB0aGUgYnVmZmVyIGludGVyZmFjZSwgdGhlbiBpdHMgOmF0dHI6YHRwX2FzX2J1ZmZlcmAKLW1lbWJlciBpbiB0aGUgOmN0eXBlOmBQeVR5cGVPYmplY3RgIHN0cnVjdHVyZSBzaG91bGQgYmUgKk5VTEwqLiAgT3RoZXJ3aXNlLCB0aGUKLTphdHRyOmB0cF9hc19idWZmZXJgIHdpbGwgcG9pbnQgdG8gYSA6Y3R5cGU6YFB5QnVmZmVyUHJvY3NgIHN0cnVjdHVyZS4KK0lmIGFuIG9iamVjdCBkb2VzIG5vdCBleHBvcnQgdGhlIGJ1ZmZlciBpbnRlcmZhY2UsIHRoZW4gaXRzIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9hc19idWZmZXJgCittZW1iZXIgaW4gdGhlIDpjOnR5cGU6YFB5VHlwZU9iamVjdGAgc3RydWN0dXJlIHNob3VsZCBiZSAqTlVMTCouICBPdGhlcndpc2UsIHRoZQorOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2FzX2J1ZmZlcmAgd2lsbCBwb2ludCB0byBhIDpjOnR5cGU6YFB5QnVmZmVyUHJvY3NgIHN0cnVjdHVyZS4KIAogLi4gbm90ZTo6CiAKLSAgIEl0IGlzIHZlcnkgaW1wb3J0YW50IHRoYXQgeW91ciA6Y3R5cGU6YFB5VHlwZU9iamVjdGAgc3RydWN0dXJlIHVzZXMKLSAgIDpjb25zdDpgUHlfVFBGTEFHU19ERUZBVUxUYCBmb3IgdGhlIHZhbHVlIG9mIHRoZSA6YXR0cjpgdHBfZmxhZ3NgIG1lbWJlciByYXRoZXIKLSAgIHRoYW4gYGAwYGAuICBUaGlzIHRlbGxzIHRoZSBQeXRob24gcnVudGltZSB0aGF0IHlvdXIgOmN0eXBlOmBQeUJ1ZmZlclByb2NzYAorICAgSXQgaXMgdmVyeSBpbXBvcnRhbnQgdGhhdCB5b3VyIDpjOnR5cGU6YFB5VHlwZU9iamVjdGAgc3RydWN0dXJlIHVzZXMKKyAgIDpjb25zdDpgUHlfVFBGTEFHU19ERUZBVUxUYCBmb3IgdGhlIHZhbHVlIG9mIHRoZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfZmxhZ3NgIG1lbWJlciByYXRoZXIKKyAgIHRoYW4gYGAwYGAuICBUaGlzIHRlbGxzIHRoZSBQeXRob24gcnVudGltZSB0aGF0IHlvdXIgOmM6dHlwZTpgUHlCdWZmZXJQcm9jc2AKICAgIHN0cnVjdHVyZSBjb250YWlucyB0aGUgOmF0dHI6YGJmX2dldGNoYXJidWZmZXJgIHNsb3QuIE9sZGVyIHZlcnNpb25zIG9mIFB5dGhvbgogICAgZGlkIG5vdCBoYXZlIHRoaXMgbWVtYmVyLCBzbyBhIG5ldyBQeXRob24gaW50ZXJwcmV0ZXIgdXNpbmcgYW4gb2xkIGV4dGVuc2lvbgogICAgbmVlZHMgdG8gYmUgYWJsZSB0byB0ZXN0IGZvciBpdHMgcHJlc2VuY2UgYmVmb3JlIHVzaW5nIGl0LgogCiAKLS4uIGN0eXBlOjogUHlCdWZmZXJQcm9jcworLi4gYzp0eXBlOjogUHlCdWZmZXJQcm9jcwogCiAgICBTdHJ1Y3R1cmUgdXNlZCB0byBob2xkIHRoZSBmdW5jdGlvbiBwb2ludGVycyB3aGljaCBkZWZpbmUgYW4gaW1wbGVtZW50YXRpb24gb2YKICAgIHRoZSBidWZmZXIgcHJvdG9jb2wuCiAKLSAgIFRoZSBmaXJzdCBzbG90IGlzIDphdHRyOmBiZl9nZXRyZWFkYnVmZmVyYCwgb2YgdHlwZSA6Y3R5cGU6YGdldHJlYWRidWZmZXJwcm9jYC4KKyAgIFRoZSBmaXJzdCBzbG90IGlzIDphdHRyOmBiZl9nZXRyZWFkYnVmZmVyYCwgb2YgdHlwZSA6Yzp0eXBlOmBnZXRyZWFkYnVmZmVycHJvY2AuCiAgICBJZiB0aGlzIHNsb3QgaXMgKk5VTEwqLCB0aGVuIHRoZSBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nIGZyb20gdGhlCiAgICBpbnRlcm5hbCBkYXRhLiAgVGhpcyBpcyBub24tc2Vuc2ljYWwsIHNvIGltcGxlbWVudG9ycyBzaG91bGQgZmlsbCB0aGlzIGluLCBidXQKICAgIGNhbGxlcnMgc2hvdWxkIHRlc3QgdGhhdCB0aGUgc2xvdCBjb250YWlucyBhIG5vbi0qTlVMTCogdmFsdWUuCiAKICAgIFRoZSBuZXh0IHNsb3QgaXMgOmF0dHI6YGJmX2dldHdyaXRlYnVmZmVyYCBoYXZpbmcgdHlwZQotICAgOmN0eXBlOmBnZXR3cml0ZWJ1ZmZlcnByb2NgLiAgVGhpcyBzbG90IG1heSBiZSAqTlVMTCogaWYgdGhlIG9iamVjdCBkb2VzIG5vdAorICAgOmM6dHlwZTpgZ2V0d3JpdGVidWZmZXJwcm9jYC4gIFRoaXMgc2xvdCBtYXkgYmUgKk5VTEwqIGlmIHRoZSBvYmplY3QgZG9lcyBub3QKICAgIGFsbG93IHdyaXRpbmcgaW50byBpdHMgcmV0dXJuZWQgYnVmZmVycy4KIAotICAgVGhlIHRoaXJkIHNsb3QgaXMgOmF0dHI6YGJmX2dldHNlZ2NvdW50YCwgd2l0aCB0eXBlIDpjdHlwZTpgZ2V0c2VnY291bnRwcm9jYC4KKyAgIFRoZSB0aGlyZCBzbG90IGlzIDphdHRyOmBiZl9nZXRzZWdjb3VudGAsIHdpdGggdHlwZSA6Yzp0eXBlOmBnZXRzZWdjb3VudHByb2NgLgogICAgVGhpcyBzbG90IG11c3Qgbm90IGJlICpOVUxMKiBhbmQgaXMgdXNlZCB0byBpbmZvcm0gdGhlIGNhbGxlciBob3cgbWFueSBzZWdtZW50cwotICAgdGhlIG9iamVjdCBjb250YWlucy4gIFNpbXBsZSBvYmplY3RzIHN1Y2ggYXMgOmN0eXBlOmBQeVN0cmluZ19UeXBlYCBhbmQKLSAgIDpjdHlwZTpgUHlCdWZmZXJfVHlwZWAgb2JqZWN0cyBjb250YWluIGEgc2luZ2xlIHNlZ21lbnQuCisgICB0aGUgb2JqZWN0IGNvbnRhaW5zLiAgU2ltcGxlIG9iamVjdHMgc3VjaCBhcyA6Yzp0eXBlOmBQeVN0cmluZ19UeXBlYCBhbmQKKyAgIDpjOnR5cGU6YFB5QnVmZmVyX1R5cGVgIG9iamVjdHMgY29udGFpbiBhIHNpbmdsZSBzZWdtZW50LgogCiAgICAuLiBpbmRleDo6IHNpbmdsZTogUHlUeXBlX0hhc0ZlYXR1cmUoKQogCi0gICBUaGUgbGFzdCBzbG90IGlzIDphdHRyOmBiZl9nZXRjaGFyYnVmZmVyYCwgb2YgdHlwZSA6Y3R5cGU6YGdldGNoYXJidWZmZXJwcm9jYC4KKyAgIFRoZSBsYXN0IHNsb3QgaXMgOmF0dHI6YGJmX2dldGNoYXJidWZmZXJgLCBvZiB0eXBlIDpjOnR5cGU6YGdldGNoYXJidWZmZXJwcm9jYC4KICAgIFRoaXMgc2xvdCB3aWxsIG9ubHkgYmUgcHJlc2VudCBpZiB0aGUgOmNvbnN0OmBQeV9UUEZMQUdTX0hBVkVfR0VUQ0hBUkJVRkZFUmAKLSAgIGZsYWcgaXMgcHJlc2VudCBpbiB0aGUgOmF0dHI6YHRwX2ZsYWdzYCBmaWVsZCBvZiB0aGUgb2JqZWN0J3MKLSAgIDpjdHlwZTpgUHlUeXBlT2JqZWN0YC4gQmVmb3JlIHVzaW5nIHRoaXMgc2xvdCwgdGhlIGNhbGxlciBzaG91bGQgdGVzdCB3aGV0aGVyIGl0Ci0gICBpcyBwcmVzZW50IGJ5IHVzaW5nIHRoZSA6Y2Z1bmM6YFB5VHlwZV9IYXNGZWF0dXJlYCBmdW5jdGlvbi4gIElmIHRoZSBmbGFnIGlzCisgICBmbGFnIGlzIHByZXNlbnQgaW4gdGhlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9mbGFnc2AgZmllbGQgb2YgdGhlIG9iamVjdCdzCisgICA6Yzp0eXBlOmBQeVR5cGVPYmplY3RgLiBCZWZvcmUgdXNpbmcgdGhpcyBzbG90LCB0aGUgY2FsbGVyIHNob3VsZCB0ZXN0IHdoZXRoZXIgaXQKKyAgIGlzIHByZXNlbnQgYnkgdXNpbmcgdGhlIDpjOmZ1bmM6YFB5VHlwZV9IYXNGZWF0dXJlYCBmdW5jdGlvbi4gIElmIHRoZSBmbGFnIGlzCiAgICBwcmVzZW50LCA6YXR0cjpgYmZfZ2V0Y2hhcmJ1ZmZlcmAgbWF5IGJlICpOVUxMKiwgaW5kaWNhdGluZyB0aGF0IHRoZSBvYmplY3QncwogICAgY29udGVudHMgY2Fubm90IGJlIHVzZWQgYXMgKjgtYml0IGNoYXJhY3RlcnMqLiBUaGUgc2xvdCBmdW5jdGlvbiBtYXkgYWxzbyByYWlzZQogICAgYW4gZXJyb3IgaWYgdGhlIG9iamVjdCdzIGNvbnRlbnRzIGNhbm5vdCBiZSBpbnRlcnByZXRlZCBhcyA4LWJpdCBjaGFyYWN0ZXJzLgpAQCAtMTQxMSw3ICsxNDEyLDcgQEAKICAgIGJ1ZmZlciBpbnRlcmZhY2Ugb3IgdGhhdCB0aGUgOmF0dHI6YGJmX2dldGNoYXJidWZmZXJgIHNsb3QgaXMgbm9uLSpOVUxMKi4KIAogCi0uLiBjdHlwZTo6IFB5X3NzaXplX3QgKCpyZWFkYnVmZmVycHJvYykgKFB5T2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IHNlZ21lbnQsIHZvaWQgKipwdHJwdHIpCisuLiBjOnR5cGU6OiBQeV9zc2l6ZV90ICgqcmVhZGJ1ZmZlcnByb2MpIChQeU9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBzZWdtZW50LCB2b2lkICoqcHRycHRyKQogCiAgICBSZXR1cm4gYSBwb2ludGVyIHRvIGEgcmVhZGFibGUgc2VnbWVudCBvZiB0aGUgYnVmZmVyIGluIGBgKnB0cnB0cmBgLiAgVGhpcwogICAgZnVuY3Rpb24gaXMgYWxsb3dlZCB0byByYWlzZSBhbiBleGNlcHRpb24sIGluIHdoaWNoIGNhc2UgaXQgbXVzdCByZXR1cm4gYGAtMWBgLgpAQCAtMTQyMSw3ICsxNDIyLDcgQEAKICAgIGBgKnB0cnB0cmBgIHRvIGEgcG9pbnRlciB0byB0aGF0IG1lbW9yeS4KIAogCi0uLiBjdHlwZTo6IFB5X3NzaXplX3QgKCp3cml0ZWJ1ZmZlcnByb2MpIChQeU9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBzZWdtZW50LCB2b2lkICoqcHRycHRyKQorLi4gYzp0eXBlOjogUHlfc3NpemVfdCAoKndyaXRlYnVmZmVycHJvYykgKFB5T2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IHNlZ21lbnQsIHZvaWQgKipwdHJwdHIpCiAKICAgIFJldHVybiBhIHBvaW50ZXIgdG8gYSB3cml0YWJsZSBtZW1vcnkgYnVmZmVyIGluIGBgKnB0cnB0cmBgLCBhbmQgdGhlIGxlbmd0aCBvZgogICAgdGhhdCBzZWdtZW50IGFzIHRoZSBmdW5jdGlvbiByZXR1cm4gdmFsdWUuICBUaGUgbWVtb3J5IGJ1ZmZlciBtdXN0IGNvcnJlc3BvbmQgdG8KQEAgLTE0MzUsMTQgKzE0MzYsMTQgQEAKICAgICAgIHNlZ21lbnQuIFRoYXQgaW5kaWNhdGVzIGEgYmxhdGFudCBwcm9ncmFtbWluZyBlcnJvciBpbiB0aGUgQyBjb2RlLgogCiAKLS4uIGN0eXBlOjogUHlfc3NpemVfdCAoKnNlZ2NvdW50cHJvYykgKFB5T2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90ICpsZW5wKQorLi4gYzp0eXBlOjogUHlfc3NpemVfdCAoKnNlZ2NvdW50cHJvYykgKFB5T2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90ICpsZW5wKQogCiAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBtZW1vcnkgc2VnbWVudHMgd2hpY2ggY29tcHJpc2UgdGhlIGJ1ZmZlci4gIElmICpsZW5wKiBpcwogICAgbm90ICpOVUxMKiwgdGhlIGltcGxlbWVudGF0aW9uIG11c3QgcmVwb3J0IHRoZSBzdW0gb2YgdGhlIHNpemVzIChpbiBieXRlcykgb2YKICAgIGFsbCBzZWdtZW50cyBpbiBgYCpsZW5wYGAuIFRoZSBmdW5jdGlvbiBjYW5ub3QgZmFpbC4KIAogCi0uLiBjdHlwZTo6IFB5X3NzaXplX3QgKCpjaGFyYnVmZmVycHJvYykgKFB5T2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IHNlZ21lbnQsIGNvbnN0IGNoYXIgKipwdHJwdHIpCisuLiBjOnR5cGU6OiBQeV9zc2l6ZV90ICgqY2hhcmJ1ZmZlcnByb2MpIChQeU9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBzZWdtZW50LCBjb25zdCBjaGFyICoqcHRycHRyKQogCiAgICBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHNlZ21lbnQgKnNlZ21lbnQqIHRoYXQgKnB0cnB0ciogIGlzIHNldCB0by4gIGBgKnB0cnB0cmBgCiAgICBpcyBzZXQgdG8gdGhlIG1lbW9yeSBidWZmZXIuIFJldHVybnMgYGAtMWBgIG9uIGVycm9yLgpkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL3VuaWNvZGUucnN0IGIvRG9jL2MtYXBpL3VuaWNvZGUucnN0CmluZGV4IDAwMTE5MmMuLjRlZjQzN2MgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS91bmljb2RlLnJzdAorKysgYi9Eb2MvYy1hcGkvdW5pY29kZS5yc3QKQEAgLTE4LDM5ICsxOCwzOSBAQAogUHl0aG9uOgogCiAKLS4uIGN0eXBlOjogUHlfVU5JQ09ERQorLi4gYzp0eXBlOjogUHlfVU5JQ09ERQogCiAgICBUaGlzIHR5cGUgcmVwcmVzZW50cyB0aGUgc3RvcmFnZSB0eXBlIHdoaWNoIGlzIHVzZWQgYnkgUHl0aG9uIGludGVybmFsbHkgYXMKICAgIGJhc2lzIGZvciBob2xkaW5nIFVuaWNvZGUgb3JkaW5hbHMuICBQeXRob24ncyBkZWZhdWx0IGJ1aWxkcyB1c2UgYSAxNi1iaXQgdHlwZQotICAgZm9yIDpjdHlwZTpgUHlfVU5JQ09ERWAgYW5kIHN0b3JlIFVuaWNvZGUgdmFsdWVzIGludGVybmFsbHkgYXMgVUNTMi4gSXQgaXMgYWxzbworICAgZm9yIDpjOnR5cGU6YFB5X1VOSUNPREVgIGFuZCBzdG9yZSBVbmljb2RlIHZhbHVlcyBpbnRlcm5hbGx5IGFzIFVDUzIuIEl0IGlzIGFsc28KICAgIHBvc3NpYmxlIHRvIGJ1aWxkIGEgVUNTNCB2ZXJzaW9uIG9mIFB5dGhvbiAobW9zdCByZWNlbnQgTGludXggZGlzdHJpYnV0aW9ucyBjb21lCiAgICB3aXRoIFVDUzQgYnVpbGRzIG9mIFB5dGhvbikuIFRoZXNlIGJ1aWxkcyB0aGVuIHVzZSBhIDMyLWJpdCB0eXBlIGZvcgotICAgOmN0eXBlOmBQeV9VTklDT0RFYCBhbmQgc3RvcmUgVW5pY29kZSBkYXRhIGludGVybmFsbHkgYXMgVUNTNC4gT24gcGxhdGZvcm1zCi0gICB3aGVyZSA6Y3R5cGU6YHdjaGFyX3RgIGlzIGF2YWlsYWJsZSBhbmQgY29tcGF0aWJsZSB3aXRoIHRoZSBjaG9zZW4gUHl0aG9uCi0gICBVbmljb2RlIGJ1aWxkIHZhcmlhbnQsIDpjdHlwZTpgUHlfVU5JQ09ERWAgaXMgYSB0eXBlZGVmIGFsaWFzIGZvcgotICAgOmN0eXBlOmB3Y2hhcl90YCB0byBlbmhhbmNlIG5hdGl2ZSBwbGF0Zm9ybSBjb21wYXRpYmlsaXR5LiBPbiBhbGwgb3RoZXIKLSAgIHBsYXRmb3JtcywgOmN0eXBlOmBQeV9VTklDT0RFYCBpcyBhIHR5cGVkZWYgYWxpYXMgZm9yIGVpdGhlciA6Y3R5cGU6YHVuc2lnbmVkCi0gICBzaG9ydGAgKFVDUzIpIG9yIDpjdHlwZTpgdW5zaWduZWQgbG9uZ2AgKFVDUzQpLgorICAgOmM6dHlwZTpgUHlfVU5JQ09ERWAgYW5kIHN0b3JlIFVuaWNvZGUgZGF0YSBpbnRlcm5hbGx5IGFzIFVDUzQuIE9uIHBsYXRmb3JtcworICAgd2hlcmUgOmM6dHlwZTpgd2NoYXJfdGAgaXMgYXZhaWxhYmxlIGFuZCBjb21wYXRpYmxlIHdpdGggdGhlIGNob3NlbiBQeXRob24KKyAgIFVuaWNvZGUgYnVpbGQgdmFyaWFudCwgOmM6dHlwZTpgUHlfVU5JQ09ERWAgaXMgYSB0eXBlZGVmIGFsaWFzIGZvcgorICAgOmM6dHlwZTpgd2NoYXJfdGAgdG8gZW5oYW5jZSBuYXRpdmUgcGxhdGZvcm0gY29tcGF0aWJpbGl0eS4gT24gYWxsIG90aGVyCisgICBwbGF0Zm9ybXMsIDpjOnR5cGU6YFB5X1VOSUNPREVgIGlzIGEgdHlwZWRlZiBhbGlhcyBmb3IgZWl0aGVyIDpjOnR5cGU6YHVuc2lnbmVkCisgICBzaG9ydGAgKFVDUzIpIG9yIDpjOnR5cGU6YHVuc2lnbmVkIGxvbmdgIChVQ1M0KS4KIAogTm90ZSB0aGF0IFVDUzIgYW5kIFVDUzQgUHl0aG9uIGJ1aWxkcyBhcmUgbm90IGJpbmFyeSBjb21wYXRpYmxlLiBQbGVhc2Uga2VlcAogdGhpcyBpbiBtaW5kIHdoZW4gd3JpdGluZyBleHRlbnNpb25zIG9yIGludGVyZmFjZXMuCiAKIAotLi4gY3R5cGU6OiBQeVVuaWNvZGVPYmplY3QKKy4uIGM6dHlwZTo6IFB5VW5pY29kZU9iamVjdAogCi0gICBUaGlzIHN1YnR5cGUgb2YgOmN0eXBlOmBQeU9iamVjdGAgcmVwcmVzZW50cyBhIFB5dGhvbiBVbmljb2RlIG9iamVjdC4KKyAgIFRoaXMgc3VidHlwZSBvZiA6Yzp0eXBlOmBQeU9iamVjdGAgcmVwcmVzZW50cyBhIFB5dGhvbiBVbmljb2RlIG9iamVjdC4KIAogCi0uLiBjdmFyOjogUHlUeXBlT2JqZWN0IFB5VW5pY29kZV9UeXBlCisuLiBjOnZhcjo6IFB5VHlwZU9iamVjdCBQeVVuaWNvZGVfVHlwZQogCi0gICBUaGlzIGluc3RhbmNlIG9mIDpjdHlwZTpgUHlUeXBlT2JqZWN0YCByZXByZXNlbnRzIHRoZSBQeXRob24gVW5pY29kZSB0eXBlLiAgSXQKKyAgIFRoaXMgaW5zdGFuY2Ugb2YgOmM6dHlwZTpgUHlUeXBlT2JqZWN0YCByZXByZXNlbnRzIHRoZSBQeXRob24gVW5pY29kZSB0eXBlLiAgSXQKICAgIGlzIGV4cG9zZWQgdG8gUHl0aG9uIGNvZGUgYXMgYGB1bmljb2RlYGAgYW5kIGBgdHlwZXMuVW5pY29kZVR5cGVgYC4KIAogVGhlIGZvbGxvd2luZyBBUElzIGFyZSByZWFsbHkgQyBtYWNyb3MgYW5kIGNhbiBiZSB1c2VkIHRvIGRvIGZhc3QgY2hlY2tzIGFuZCB0bwogYWNjZXNzIGludGVybmFsIHJlYWQtb25seSBkYXRhIG9mIFVuaWNvZGUgb2JqZWN0czoKIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlVbmljb2RlX0NoZWNrKFB5T2JqZWN0ICpvKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeVVuaWNvZGVfQ2hlY2soUHlPYmplY3QgKm8pCiAKICAgIFJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgKm8qIGlzIGEgVW5pY29kZSBvYmplY3Qgb3IgYW4gaW5zdGFuY2Ugb2YgYSBVbmljb2RlCiAgICBzdWJ0eXBlLgpAQCAtNTksNyArNTksNyBAQAogICAgICAgQWxsb3dlZCBzdWJ0eXBlcyB0byBiZSBhY2NlcHRlZC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlVbmljb2RlX0NoZWNrRXhhY3QoUHlPYmplY3QgKm8pCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5VW5pY29kZV9DaGVja0V4YWN0KFB5T2JqZWN0ICpvKQogCiAgICBSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0ICpvKiBpcyBhIFVuaWNvZGUgb2JqZWN0LCBidXQgbm90IGFuIGluc3RhbmNlIG9mIGEKICAgIHN1YnR5cGUuCkBAIC02NywzOSArNjcsMzkgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5X3NzaXplX3QgUHlVbmljb2RlX0dFVF9TSVpFKFB5T2JqZWN0ICpvKQorLi4gYzpmdW5jdGlvbjo6IFB5X3NzaXplX3QgUHlVbmljb2RlX0dFVF9TSVpFKFB5T2JqZWN0ICpvKQogCi0gICBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIG9iamVjdC4gICpvKiBoYXMgdG8gYmUgYSA6Y3R5cGU6YFB5VW5pY29kZU9iamVjdGAgKG5vdAorICAgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBvYmplY3QuICAqbyogaGFzIHRvIGJlIGEgOmM6dHlwZTpgUHlVbmljb2RlT2JqZWN0YCAobm90CiAgICBjaGVja2VkKS4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJuZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUuIFRoaXMgbWlnaHQgcmVxdWlyZSBjaGFuZ2VzCisgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybmVkIGFuIDpjOnR5cGU6YGludGAgdHlwZS4gVGhpcyBtaWdodCByZXF1aXJlIGNoYW5nZXMKICAgICAgIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeV9zc2l6ZV90IFB5VW5pY29kZV9HRVRfREFUQV9TSVpFKFB5T2JqZWN0ICpvKQorLi4gYzpmdW5jdGlvbjo6IFB5X3NzaXplX3QgUHlVbmljb2RlX0dFVF9EQVRBX1NJWkUoUHlPYmplY3QgKm8pCiAKICAgIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgb2JqZWN0J3MgaW50ZXJuYWwgYnVmZmVyIGluIGJ5dGVzLiAgKm8qIGhhcyB0byBiZSBhCi0gICA6Y3R5cGU6YFB5VW5pY29kZU9iamVjdGAgKG5vdCBjaGVja2VkKS4KKyAgIDpjOnR5cGU6YFB5VW5pY29kZU9iamVjdGAgKG5vdCBjaGVja2VkKS4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJuZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUuIFRoaXMgbWlnaHQgcmVxdWlyZSBjaGFuZ2VzCisgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybmVkIGFuIDpjOnR5cGU6YGludGAgdHlwZS4gVGhpcyBtaWdodCByZXF1aXJlIGNoYW5nZXMKICAgICAgIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeV9VTklDT0RFKiBQeVVuaWNvZGVfQVNfVU5JQ09ERShQeU9iamVjdCAqbykKKy4uIGM6ZnVuY3Rpb246OiBQeV9VTklDT0RFKiBQeVVuaWNvZGVfQVNfVU5JQ09ERShQeU9iamVjdCAqbykKIAotICAgUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgaW50ZXJuYWwgOmN0eXBlOmBQeV9VTklDT0RFYCBidWZmZXIgb2YgdGhlIG9iamVjdC4gICpvKgotICAgaGFzIHRvIGJlIGEgOmN0eXBlOmBQeVVuaWNvZGVPYmplY3RgIChub3QgY2hlY2tlZCkuCisgICBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBpbnRlcm5hbCA6Yzp0eXBlOmBQeV9VTklDT0RFYCBidWZmZXIgb2YgdGhlIG9iamVjdC4gICpvKgorICAgaGFzIHRvIGJlIGEgOmM6dHlwZTpgUHlVbmljb2RlT2JqZWN0YCAobm90IGNoZWNrZWQpLgogCiAKLS4uIGNmdW5jdGlvbjo6IGNvbnN0IGNoYXIqIFB5VW5pY29kZV9BU19EQVRBKFB5T2JqZWN0ICpvKQorLi4gYzpmdW5jdGlvbjo6IGNvbnN0IGNoYXIqIFB5VW5pY29kZV9BU19EQVRBKFB5T2JqZWN0ICpvKQogCiAgICBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBpbnRlcm5hbCBidWZmZXIgb2YgdGhlIG9iamVjdC4gKm8qIGhhcyB0byBiZSBhCi0gICA6Y3R5cGU6YFB5VW5pY29kZU9iamVjdGAgKG5vdCBjaGVja2VkKS4KKyAgIDpjOnR5cGU6YFB5VW5pY29kZU9iamVjdGAgKG5vdCBjaGVja2VkKS4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlVbmljb2RlX0NsZWFyRnJlZUxpc3QoKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeVVuaWNvZGVfQ2xlYXJGcmVlTGlzdCgpCiAKICAgIENsZWFyIHRoZSBmcmVlIGxpc3QuIFJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGZyZWVkIGl0ZW1zLgogCkBAIC0xMTQsODYgKzExNCw4NiBAQAogdGhlIFB5dGhvbiBjb25maWd1cmF0aW9uLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeV9VTklDT0RFX0lTU1BBQ0UoUHlfVU5JQ09ERSBjaCkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlfVU5JQ09ERV9JU1NQQUNFKFB5X1VOSUNPREUgY2gpCiAKICAgIFJldHVybiAxIG9yIDAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgKmNoKiBpcyBhIHdoaXRlc3BhY2UgY2hhcmFjdGVyLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeV9VTklDT0RFX0lTTE9XRVIoUHlfVU5JQ09ERSBjaCkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlfVU5JQ09ERV9JU0xPV0VSKFB5X1VOSUNPREUgY2gpCiAKICAgIFJldHVybiAxIG9yIDAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgKmNoKiBpcyBhIGxvd2VyY2FzZSBjaGFyYWN0ZXIuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5X1VOSUNPREVfSVNVUFBFUihQeV9VTklDT0RFIGNoKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeV9VTklDT0RFX0lTVVBQRVIoUHlfVU5JQ09ERSBjaCkKIAogICAgUmV0dXJuIDEgb3IgMCBkZXBlbmRpbmcgb24gd2hldGhlciAqY2gqIGlzIGFuIHVwcGVyY2FzZSBjaGFyYWN0ZXIuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5X1VOSUNPREVfSVNUSVRMRShQeV9VTklDT0RFIGNoKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeV9VTklDT0RFX0lTVElUTEUoUHlfVU5JQ09ERSBjaCkKIAogICAgUmV0dXJuIDEgb3IgMCBkZXBlbmRpbmcgb24gd2hldGhlciAqY2gqIGlzIGEgdGl0bGVjYXNlIGNoYXJhY3Rlci4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlfVU5JQ09ERV9JU0xJTkVCUkVBSyhQeV9VTklDT0RFIGNoKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeV9VTklDT0RFX0lTTElORUJSRUFLKFB5X1VOSUNPREUgY2gpCiAKICAgIFJldHVybiAxIG9yIDAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgKmNoKiBpcyBhIGxpbmVicmVhayBjaGFyYWN0ZXIuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5X1VOSUNPREVfSVNERUNJTUFMKFB5X1VOSUNPREUgY2gpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5X1VOSUNPREVfSVNERUNJTUFMKFB5X1VOSUNPREUgY2gpCiAKICAgIFJldHVybiAxIG9yIDAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgKmNoKiBpcyBhIGRlY2ltYWwgY2hhcmFjdGVyLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeV9VTklDT0RFX0lTRElHSVQoUHlfVU5JQ09ERSBjaCkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlfVU5JQ09ERV9JU0RJR0lUKFB5X1VOSUNPREUgY2gpCiAKICAgIFJldHVybiAxIG9yIDAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgKmNoKiBpcyBhIGRpZ2l0IGNoYXJhY3Rlci4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlfVU5JQ09ERV9JU05VTUVSSUMoUHlfVU5JQ09ERSBjaCkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlfVU5JQ09ERV9JU05VTUVSSUMoUHlfVU5JQ09ERSBjaCkKIAogICAgUmV0dXJuIDEgb3IgMCBkZXBlbmRpbmcgb24gd2hldGhlciAqY2gqIGlzIGEgbnVtZXJpYyBjaGFyYWN0ZXIuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5X1VOSUNPREVfSVNBTFBIQShQeV9VTklDT0RFIGNoKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeV9VTklDT0RFX0lTQUxQSEEoUHlfVU5JQ09ERSBjaCkKIAogICAgUmV0dXJuIDEgb3IgMCBkZXBlbmRpbmcgb24gd2hldGhlciAqY2gqIGlzIGFuIGFscGhhYmV0aWMgY2hhcmFjdGVyLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeV9VTklDT0RFX0lTQUxOVU0oUHlfVU5JQ09ERSBjaCkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlfVU5JQ09ERV9JU0FMTlVNKFB5X1VOSUNPREUgY2gpCiAKICAgIFJldHVybiAxIG9yIDAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgKmNoKiBpcyBhbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVyLgogCiBUaGVzZSBBUElzIGNhbiBiZSB1c2VkIGZvciBmYXN0IGRpcmVjdCBjaGFyYWN0ZXIgY29udmVyc2lvbnM6CiAKIAotLi4gY2Z1bmN0aW9uOjogUHlfVU5JQ09ERSBQeV9VTklDT0RFX1RPTE9XRVIoUHlfVU5JQ09ERSBjaCkKKy4uIGM6ZnVuY3Rpb246OiBQeV9VTklDT0RFIFB5X1VOSUNPREVfVE9MT1dFUihQeV9VTklDT0RFIGNoKQogCiAgICBSZXR1cm4gdGhlIGNoYXJhY3RlciAqY2gqIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5X1VOSUNPREUgUHlfVU5JQ09ERV9UT1VQUEVSKFB5X1VOSUNPREUgY2gpCisuLiBjOmZ1bmN0aW9uOjogUHlfVU5JQ09ERSBQeV9VTklDT0RFX1RPVVBQRVIoUHlfVU5JQ09ERSBjaCkKIAogICAgUmV0dXJuIHRoZSBjaGFyYWN0ZXIgKmNoKiBjb252ZXJ0ZWQgdG8gdXBwZXIgY2FzZS4KIAogCi0uLiBjZnVuY3Rpb246OiBQeV9VTklDT0RFIFB5X1VOSUNPREVfVE9USVRMRShQeV9VTklDT0RFIGNoKQorLi4gYzpmdW5jdGlvbjo6IFB5X1VOSUNPREUgUHlfVU5JQ09ERV9UT1RJVExFKFB5X1VOSUNPREUgY2gpCiAKICAgIFJldHVybiB0aGUgY2hhcmFjdGVyICpjaCogY29udmVydGVkIHRvIHRpdGxlIGNhc2UuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5X1VOSUNPREVfVE9ERUNJTUFMKFB5X1VOSUNPREUgY2gpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5X1VOSUNPREVfVE9ERUNJTUFMKFB5X1VOSUNPREUgY2gpCiAKICAgIFJldHVybiB0aGUgY2hhcmFjdGVyICpjaCogY29udmVydGVkIHRvIGEgZGVjaW1hbCBwb3NpdGl2ZSBpbnRlZ2VyLiAgUmV0dXJuCiAgICBgYC0xYGAgaWYgdGhpcyBpcyBub3QgcG9zc2libGUuICBUaGlzIG1hY3JvIGRvZXMgbm90IHJhaXNlIGV4Y2VwdGlvbnMuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5X1VOSUNPREVfVE9ESUdJVChQeV9VTklDT0RFIGNoKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeV9VTklDT0RFX1RPRElHSVQoUHlfVU5JQ09ERSBjaCkKIAogICAgUmV0dXJuIHRoZSBjaGFyYWN0ZXIgKmNoKiBjb252ZXJ0ZWQgdG8gYSBzaW5nbGUgZGlnaXQgaW50ZWdlci4gUmV0dXJuIGBgLTFgYCBpZgogICAgdGhpcyBpcyBub3QgcG9zc2libGUuICBUaGlzIG1hY3JvIGRvZXMgbm90IHJhaXNlIGV4Y2VwdGlvbnMuCiAKIAotLi4gY2Z1bmN0aW9uOjogZG91YmxlIFB5X1VOSUNPREVfVE9OVU1FUklDKFB5X1VOSUNPREUgY2gpCisuLiBjOmZ1bmN0aW9uOjogZG91YmxlIFB5X1VOSUNPREVfVE9OVU1FUklDKFB5X1VOSUNPREUgY2gpCiAKICAgIFJldHVybiB0aGUgY2hhcmFjdGVyICpjaCogY29udmVydGVkIHRvIGEgZG91YmxlLiBSZXR1cm4gYGAtMS4wYGAgaWYgdGhpcyBpcyBub3QKICAgIHBvc3NpYmxlLiAgVGhpcyBtYWNybyBkb2VzIG5vdCByYWlzZSBleGNlcHRpb25zLgpAQCAtMjA2LDcgKzIwNiw3IEBACiBBUElzOgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoY29uc3QgUHlfVU5JQ09ERSAqdSwgUHlfc3NpemVfdCBzaXplKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoY29uc3QgUHlfVU5JQ09ERSAqdSwgUHlfc3NpemVfdCBzaXplKQogCiAgICBDcmVhdGUgYSBVbmljb2RlIG9iamVjdCBmcm9tIHRoZSBQeV9VTklDT0RFIGJ1ZmZlciAqdSogb2YgdGhlIGdpdmVuIHNpemUuICp1KgogICAgbWF5IGJlICpOVUxMKiB3aGljaCBjYXVzZXMgdGhlIGNvbnRlbnRzIHRvIGJlIHVuZGVmaW5lZC4gSXQgaXMgdGhlIHVzZXIncwpAQCAtMjE2LDExICsyMTYsMTEgQEAKICAgIGlzICpOVUxMKi4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Y3R5cGU6YGludGAgdHlwZSBmb3IgKnNpemUqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgZm9yICpzaXplKi4gVGhpcyBtaWdodCByZXF1aXJlCiAgICAgICBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0Zyb21TdHJpbmdBbmRTaXplKGNvbnN0IGNoYXIgKnUsIFB5X3NzaXplX3Qgc2l6ZSkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0Zyb21TdHJpbmdBbmRTaXplKGNvbnN0IGNoYXIgKnUsIFB5X3NzaXplX3Qgc2l6ZSkKIAogICAgQ3JlYXRlIGEgVW5pY29kZSBvYmplY3QgZnJvbSB0aGUgY2hhciBidWZmZXIgKnUqLiAgVGhlIGJ5dGVzIHdpbGwgYmUgaW50ZXJwcmV0ZWQKICAgIGFzIGJlaW5nIFVURi04IGVuY29kZWQuICAqdSogbWF5IGFsc28gYmUgKk5VTEwqIHdoaWNoCkBAIC0yMzIsNyArMjMyLDcgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0ICpQeVVuaWNvZGVfRnJvbVN0cmluZyhjb25zdCBjaGFyICp1KQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0ICpQeVVuaWNvZGVfRnJvbVN0cmluZyhjb25zdCBjaGFyICp1KQogCiAgICBDcmVhdGUgYSBVbmljb2RlIG9iamVjdCBmcm9tIGFuIFVURi04IGVuY29kZWQgbnVsbC10ZXJtaW5hdGVkIGNoYXIgYnVmZmVyCiAgICAqdSouCkBAIC0yNDAsOSArMjQwLDkgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfRnJvbUZvcm1hdChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0Zyb21Gb3JtYXQoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCiAKLSAgIFRha2UgYSBDIDpjZnVuYzpgcHJpbnRmYFwgLXN0eWxlICpmb3JtYXQqIHN0cmluZyBhbmQgYSB2YXJpYWJsZSBudW1iZXIgb2YKKyAgIFRha2UgYSBDIDpjOmZ1bmM6YHByaW50ZmBcIC1zdHlsZSAqZm9ybWF0KiBzdHJpbmcgYW5kIGEgdmFyaWFibGUgbnVtYmVyIG9mCiAgICBhcmd1bWVudHMsIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIFB5dGhvbiB1bmljb2RlIHN0cmluZyBhbmQgcmV0dXJuCiAgICBhIHN0cmluZyB3aXRoIHRoZSB2YWx1ZXMgZm9ybWF0dGVkIGludG8gaXQuICBUaGUgdmFyaWFibGUgYXJndW1lbnRzIG11c3QgYmUgQwogICAgdHlwZXMgYW5kIG11c3QgY29ycmVzcG9uZCBleGFjdGx5IHRvIHRoZSBmb3JtYXQgY2hhcmFjdGVycyBpbiB0aGUgKmZvcm1hdCoKQEAgLTI1Miw2ICsyNTIsOCBAQAogICAgLi4gJSBiZWNhdXNlIG5vdCBhbGwgY29tcGlsZXJzIHN1cHBvcnQgdGhlICV6IHdpZHRoIG1vZGlmaWVyIC0tIHdlIGZha2UgaXQKICAgIC4uICUgd2hlbiBuZWNlc3NhcnkgdmlhIGludGVycG9sYXRpbmcgUFlfRk9STUFUX1NJWkVfVC4KIAorICAgLi4gdGFidWxhcmNvbHVtbnM6OiB8bHxsfEx8CisKICAgICstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgIHwgRm9ybWF0IENoYXJhY3RlcnMgfCBUeXBlICAgICAgICAgICAgICAgIHwgQ29tbWVudCAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICs9PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKQEAgLTMxNyw3ICszMTksNyBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi42CiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9Gcm9tRm9ybWF0Vihjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgdmFyZ3MpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9Gcm9tRm9ybWF0Vihjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgdmFyZ3MpCiAKICAgIElkZW50aWNhbCB0byA6ZnVuYzpgUHlVbmljb2RlX0Zyb21Gb3JtYXRgIGV4Y2VwdCB0aGF0IGl0IHRha2VzIGV4YWN0bHkgdHdvCiAgICBhcmd1bWVudHMuCkBAIC0zMjUsMjIgKzMyNywyNSBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi42CiAKIAotLi4gY2Z1bmN0aW9uOjogUHlfVU5JQ09ERSogUHlVbmljb2RlX0FzVW5pY29kZShQeU9iamVjdCAqdW5pY29kZSkKKy4uIGM6ZnVuY3Rpb246OiBQeV9VTklDT0RFKiBQeVVuaWNvZGVfQXNVbmljb2RlKFB5T2JqZWN0ICp1bmljb2RlKQogCi0gICBSZXR1cm4gYSByZWFkLW9ubHkgcG9pbnRlciB0byB0aGUgVW5pY29kZSBvYmplY3QncyBpbnRlcm5hbCA6Y3R5cGU6YFB5X1VOSUNPREVgCi0gICBidWZmZXIsICpOVUxMKiBpZiAqdW5pY29kZSogaXMgbm90IGEgVW5pY29kZSBvYmplY3QuCisgICBSZXR1cm4gYSByZWFkLW9ubHkgcG9pbnRlciB0byB0aGUgVW5pY29kZSBvYmplY3QncyBpbnRlcm5hbAorICAgOmM6dHlwZTpgUHlfVU5JQ09ERWAgYnVmZmVyLCAqTlVMTCogaWYgKnVuaWNvZGUqIGlzIG5vdCBhIFVuaWNvZGUgb2JqZWN0LgorICAgTm90ZSB0aGF0IHRoZSByZXN1bHRpbmcgOmM6dHlwZTpgUHlfVU5JQ09ERSpgIHN0cmluZyBtYXkgY29udGFpbiBlbWJlZGRlZAorICAgbnVsbCBjaGFyYWN0ZXJzLCB3aGljaCB3b3VsZCBjYXVzZSB0aGUgc3RyaW5nIHRvIGJlIHRydW5jYXRlZCB3aGVuIHVzZWQgaW4KKyAgIG1vc3QgQyBmdW5jdGlvbnMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlfc3NpemVfdCBQeVVuaWNvZGVfR2V0U2l6ZShQeU9iamVjdCAqdW5pY29kZSkKKy4uIGM6ZnVuY3Rpb246OiBQeV9zc2l6ZV90IFB5VW5pY29kZV9HZXRTaXplKFB5T2JqZWN0ICp1bmljb2RlKQogCiAgICBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgVW5pY29kZSBvYmplY3QuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybmVkIGFuIDpjdHlwZTpgaW50YCB0eXBlLiBUaGlzIG1pZ2h0IHJlcXVpcmUgY2hhbmdlcworICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5lZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUuIFRoaXMgbWlnaHQgcmVxdWlyZSBjaGFuZ2VzCiAgICAgICBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdChQeU9iamVjdCAqb2JqLCBjb25zdCBjaGFyICplbmNvZGluZywgY29uc3QgY2hhciAqZXJyb3JzKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QoUHlPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqZW5jb2RpbmcsIGNvbnN0IGNoYXIgKmVycm9ycykKIAogICAgQ29lcmNlIGFuIGVuY29kZWQgb2JqZWN0ICpvYmoqIHRvIGFuIFVuaWNvZGUgb2JqZWN0IGFuZCByZXR1cm4gYSByZWZlcmVuY2Ugd2l0aAogICAgaW5jcmVtZW50ZWQgcmVmY291bnQuCkBAIC0zNTcsNDQgKzM2Miw0NiBAQAogICAgZGVjcmVmJ2luZyB0aGUgcmV0dXJuZWQgb2JqZWN0cy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0Zyb21PYmplY3QoUHlPYmplY3QgKm9iaikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0Zyb21PYmplY3QoUHlPYmplY3QgKm9iaikKIAogICAgU2hvcnRjdXQgZm9yIGBgUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KG9iaiwgTlVMTCwgInN0cmljdCIpYGAgd2hpY2ggaXMgdXNlZAogICAgdGhyb3VnaG91dCB0aGUgaW50ZXJwcmV0ZXIgd2hlbmV2ZXIgY29lcmNpb24gdG8gVW5pY29kZSBpcyBuZWVkZWQuCiAKLUlmIHRoZSBwbGF0Zm9ybSBzdXBwb3J0cyA6Y3R5cGU6YHdjaGFyX3RgIGFuZCBwcm92aWRlcyBhIGhlYWRlciBmaWxlIHdjaGFyLmgsCitJZiB0aGUgcGxhdGZvcm0gc3VwcG9ydHMgOmM6dHlwZTpgd2NoYXJfdGAgYW5kIHByb3ZpZGVzIGEgaGVhZGVyIGZpbGUgd2NoYXIuaCwKIFB5dGhvbiBjYW4gaW50ZXJmYWNlIGRpcmVjdGx5IHRvIHRoaXMgdHlwZSB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucy4KLVN1cHBvcnQgaXMgb3B0aW1pemVkIGlmIFB5dGhvbidzIG93biA6Y3R5cGU6YFB5X1VOSUNPREVgIHR5cGUgaXMgaWRlbnRpY2FsIHRvCi10aGUgc3lzdGVtJ3MgOmN0eXBlOmB3Y2hhcl90YC4KK1N1cHBvcnQgaXMgb3B0aW1pemVkIGlmIFB5dGhvbidzIG93biA6Yzp0eXBlOmBQeV9VTklDT0RFYCB0eXBlIGlzIGlkZW50aWNhbCB0bwordGhlIHN5c3RlbSdzIDpjOnR5cGU6YHdjaGFyX3RgLgogCiAKIHdjaGFyX3QgU3VwcG9ydAogIiIiIiIiIiIiIiIiIiIiCiAKLTpjdHlwZTpgd2NoYXJfdGAgc3VwcG9ydCBmb3IgcGxhdGZvcm1zIHdoaWNoIHN1cHBvcnQgaXQ6Cis6Yzp0eXBlOmB3Y2hhcl90YCBzdXBwb3J0IGZvciBwbGF0Zm9ybXMgd2hpY2ggc3VwcG9ydCBpdDoKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIoY29uc3Qgd2NoYXJfdCAqdywgUHlfc3NpemVfdCBzaXplKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKGNvbnN0IHdjaGFyX3QgKncsIFB5X3NzaXplX3Qgc2l6ZSkKIAotICAgQ3JlYXRlIGEgVW5pY29kZSBvYmplY3QgZnJvbSB0aGUgOmN0eXBlOmB3Y2hhcl90YCBidWZmZXIgKncqIG9mIHRoZSBnaXZlbiAqc2l6ZSouCisgICBDcmVhdGUgYSBVbmljb2RlIG9iamVjdCBmcm9tIHRoZSA6Yzp0eXBlOmB3Y2hhcl90YCBidWZmZXIgKncqIG9mIHRoZSBnaXZlbiAqc2l6ZSouCiAgICBSZXR1cm4gKk5VTEwqIG9uIGZhaWx1cmUuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUgZm9yICpzaXplKi4gVGhpcyBtaWdodCByZXF1aXJlCisgICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmM6dHlwZTpgaW50YCB0eXBlIGZvciAqc2l6ZSouIFRoaXMgbWlnaHQgcmVxdWlyZQogICAgICAgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlfc3NpemVfdCBQeVVuaWNvZGVfQXNXaWRlQ2hhcihQeVVuaWNvZGVPYmplY3QgKnVuaWNvZGUsIHdjaGFyX3QgKncsIFB5X3NzaXplX3Qgc2l6ZSkKKy4uIGM6ZnVuY3Rpb246OiBQeV9zc2l6ZV90IFB5VW5pY29kZV9Bc1dpZGVDaGFyKFB5VW5pY29kZU9iamVjdCAqdW5pY29kZSwgd2NoYXJfdCAqdywgUHlfc3NpemVfdCBzaXplKQogCi0gICBDb3B5IHRoZSBVbmljb2RlIG9iamVjdCBjb250ZW50cyBpbnRvIHRoZSA6Y3R5cGU6YHdjaGFyX3RgIGJ1ZmZlciAqdyouICBBdCBtb3N0Ci0gICAqc2l6ZSogOmN0eXBlOmB3Y2hhcl90YCBjaGFyYWN0ZXJzIGFyZSBjb3BpZWQgKGV4Y2x1ZGluZyBhIHBvc3NpYmx5IHRyYWlsaW5nCi0gICAwLXRlcm1pbmF0aW9uIGNoYXJhY3RlcikuICBSZXR1cm4gdGhlIG51bWJlciBvZiA6Y3R5cGU6YHdjaGFyX3RgIGNoYXJhY3RlcnMKLSAgIGNvcGllZCBvciAtMSBpbiBjYXNlIG9mIGFuIGVycm9yLiAgTm90ZSB0aGF0IHRoZSByZXN1bHRpbmcgOmN0eXBlOmB3Y2hhcl90YAorICAgQ29weSB0aGUgVW5pY29kZSBvYmplY3QgY29udGVudHMgaW50byB0aGUgOmM6dHlwZTpgd2NoYXJfdGAgYnVmZmVyICp3Ki4gIEF0IG1vc3QKKyAgICpzaXplKiA6Yzp0eXBlOmB3Y2hhcl90YCBjaGFyYWN0ZXJzIGFyZSBjb3BpZWQgKGV4Y2x1ZGluZyBhIHBvc3NpYmx5IHRyYWlsaW5nCisgICAwLXRlcm1pbmF0aW9uIGNoYXJhY3RlcikuICBSZXR1cm4gdGhlIG51bWJlciBvZiA6Yzp0eXBlOmB3Y2hhcl90YCBjaGFyYWN0ZXJzCisgICBjb3BpZWQgb3IgLTEgaW4gY2FzZSBvZiBhbiBlcnJvci4gIE5vdGUgdGhhdCB0aGUgcmVzdWx0aW5nIDpjOnR5cGU6YHdjaGFyX3RgCiAgICBzdHJpbmcgbWF5IG9yIG1heSBub3QgYmUgMC10ZXJtaW5hdGVkLiAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIKLSAgIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSA6Y3R5cGU6YHdjaGFyX3RgIHN0cmluZyBpcyAwLXRlcm1pbmF0ZWQgaW4gY2FzZSB0aGlzIGlzCi0gICByZXF1aXJlZCBieSB0aGUgYXBwbGljYXRpb24uCisgICB0byBtYWtlIHN1cmUgdGhhdCB0aGUgOmM6dHlwZTpgd2NoYXJfdGAgc3RyaW5nIGlzIDAtdGVybWluYXRlZCBpbiBjYXNlIHRoaXMgaXMKKyAgIHJlcXVpcmVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gQWxzbywgbm90ZSB0aGF0IHRoZSA6Yzp0eXBlOmB3Y2hhcl90KmAgc3RyaW5nCisgICBtaWdodCBjb250YWluIG51bGwgY2hhcmFjdGVycywgd2hpY2ggd291bGQgY2F1c2UgdGhlIHN0cmluZyB0byBiZSB0cnVuY2F0ZWQKKyAgIHdoZW4gdXNlZCB3aXRoIG1vc3QgQyBmdW5jdGlvbnMuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybmVkIGFuIDpjdHlwZTpgaW50YCB0eXBlIGFuZCB1c2VkIGFuIDpjdHlwZTpgaW50YAorICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5lZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgYW5kIHVzZWQgYW4gOmM6dHlwZTpgaW50YAogICAgICAgdHlwZSBmb3IgKnNpemUqLiBUaGlzIG1pZ2h0IHJlcXVpcmUgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5CiAgICAgICBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCkBAIC00MTIsNyArNDE5LDcgQEAKIG9iamVjdCBjb25zdHJ1Y3Rvci4KIAogU2V0dGluZyBlbmNvZGluZyB0byAqTlVMTCogY2F1c2VzIHRoZSBkZWZhdWx0IGVuY29kaW5nIHRvIGJlIHVzZWQgd2hpY2ggaXMKLUFTQ0lJLiAgVGhlIGZpbGUgc3lzdGVtIGNhbGxzIHNob3VsZCB1c2UgOmNkYXRhOmBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nYAorQVNDSUkuICBUaGUgZmlsZSBzeXN0ZW0gY2FsbHMgc2hvdWxkIHVzZSA6YzpkYXRhOmBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nYAogYXMgdGhlIGVuY29kaW5nIGZvciBmaWxlIG5hbWVzLiBUaGlzIHZhcmlhYmxlIHNob3VsZCBiZSB0cmVhdGVkIGFzIHJlYWQtb25seTogb24KIHNvbWUgc3lzdGVtcywgaXQgd2lsbCBiZSBhIHBvaW50ZXIgdG8gYSBzdGF0aWMgc3RyaW5nLCBvbiBvdGhlcnMsIGl0IHdpbGwgY2hhbmdlCiBhdCBydW4tdGltZSAoc3VjaCBhcyB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpbnZva2VzIHNldGxvY2FsZSkuCkBAIC00MzEsNyArNDM4LDcgQEAKIFRoZXNlIGFyZSB0aGUgZ2VuZXJpYyBjb2RlYyBBUElzOgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfRGVjb2RlKGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZW5jb2RpbmcsIGNvbnN0IGNoYXIgKmVycm9ycykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0RlY29kZShjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmVuY29kaW5nLCBjb25zdCBjaGFyICplcnJvcnMpCiAKICAgIENyZWF0ZSBhIFVuaWNvZGUgb2JqZWN0IGJ5IGRlY29kaW5nICpzaXplKiBieXRlcyBvZiB0aGUgZW5jb2RlZCBzdHJpbmcgKnMqLgogICAgKmVuY29kaW5nKiBhbmQgKmVycm9ycyogaGF2ZSB0aGUgc2FtZSBtZWFuaW5nIGFzIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBzYW1lIG5hbWUKQEAgLTQ0MCwyNCArNDQ3LDI0IEBACiAgICB0aGUgY29kZWMuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUgZm9yICpzaXplKi4gVGhpcyBtaWdodCByZXF1aXJlCisgICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmM6dHlwZTpgaW50YCB0eXBlIGZvciAqc2l6ZSouIFRoaXMgbWlnaHQgcmVxdWlyZQogICAgICAgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9FbmNvZGUoY29uc3QgUHlfVU5JQ09ERSAqcywgUHlfc3NpemVfdCBzaXplLCBjb25zdCBjaGFyICplbmNvZGluZywgY29uc3QgY2hhciAqZXJyb3JzKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfRW5jb2RlKGNvbnN0IFB5X1VOSUNPREUgKnMsIFB5X3NzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZW5jb2RpbmcsIGNvbnN0IGNoYXIgKmVycm9ycykKIAotICAgRW5jb2RlIHRoZSA6Y3R5cGU6YFB5X1VOSUNPREVgIGJ1ZmZlciAqcyogb2YgdGhlIGdpdmVuICpzaXplKiBhbmQgcmV0dXJuIGEgUHl0aG9uCisgICBFbmNvZGUgdGhlIDpjOnR5cGU6YFB5X1VOSUNPREVgIGJ1ZmZlciAqcyogb2YgdGhlIGdpdmVuICpzaXplKiBhbmQgcmV0dXJuIGEgUHl0aG9uCiAgICBzdHJpbmcgb2JqZWN0LiAgKmVuY29kaW5nKiBhbmQgKmVycm9ycyogaGF2ZSB0aGUgc2FtZSBtZWFuaW5nIGFzIHRoZSBwYXJhbWV0ZXJzCi0gICBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBVbmljb2RlIDptZXRoOmBlbmNvZGVgIG1ldGhvZC4gIFRoZSBjb2RlYyB0byBiZSB1c2VkIGlzCi0gICBsb29rZWQgdXAgdXNpbmcgdGhlIFB5dGhvbiBjb2RlYyByZWdpc3RyeS4gIFJldHVybiAqTlVMTCogaWYgYW4gZXhjZXB0aW9uIHdhcwotICAgcmFpc2VkIGJ5IHRoZSBjb2RlYy4KKyAgIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlIFVuaWNvZGUgOm1ldGg6YH51bmljb2RlLmVuY29kZWAgbWV0aG9kLiAgVGhlIGNvZGVjCisgICB0byBiZSB1c2VkIGlzIGxvb2tlZCB1cCB1c2luZyB0aGUgUHl0aG9uIGNvZGVjIHJlZ2lzdHJ5LiAgUmV0dXJuICpOVUxMKiBpZgorICAgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQgYnkgdGhlIGNvZGVjLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjdHlwZTpgaW50YCB0eXBlIGZvciAqc2l6ZSouIFRoaXMgbWlnaHQgcmVxdWlyZQorICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjOnR5cGU6YGludGAgdHlwZSBmb3IgKnNpemUqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKICAgICAgIGNoYW5nZXMgaW4geW91ciBjb2RlIGZvciBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKFB5T2JqZWN0ICp1bmljb2RlLCBjb25zdCBjaGFyICplbmNvZGluZywgY29uc3QgY2hhciAqZXJyb3JzKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKFB5T2JqZWN0ICp1bmljb2RlLCBjb25zdCBjaGFyICplbmNvZGluZywgY29uc3QgY2hhciAqZXJyb3JzKQogCiAgICBFbmNvZGUgYSBVbmljb2RlIG9iamVjdCBhbmQgcmV0dXJuIHRoZSByZXN1bHQgYXMgUHl0aG9uIHN0cmluZyBvYmplY3QuCiAgICAqZW5jb2RpbmcqIGFuZCAqZXJyb3JzKiBoYXZlIHRoZSBzYW1lIG1lYW5pbmcgYXMgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIHNhbWUgbmFtZQpAQCAtNDcyLDE5ICs0NzksMTkgQEAKIFRoZXNlIGFyZSB0aGUgVVRGLTggY29kZWMgQVBJczoKIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0RlY29kZVVURjgoY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBzaXplLCBjb25zdCBjaGFyICplcnJvcnMpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9EZWNvZGVVVEY4KGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZXJyb3JzKQogCiAgICBDcmVhdGUgYSBVbmljb2RlIG9iamVjdCBieSBkZWNvZGluZyAqc2l6ZSogYnl0ZXMgb2YgdGhlIFVURi04IGVuY29kZWQgc3RyaW5nCiAgICAqcyouIFJldHVybiAqTlVMTCogaWYgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQgYnkgdGhlIGNvZGVjLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjdHlwZTpgaW50YCB0eXBlIGZvciAqc2l6ZSouIFRoaXMgbWlnaHQgcmVxdWlyZQorICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjOnR5cGU6YGludGAgdHlwZSBmb3IgKnNpemUqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKICAgICAgIGNoYW5nZXMgaW4geW91ciBjb2RlIGZvciBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfRGVjb2RlVVRGOFN0YXRlZnVsKGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZXJyb3JzLCBQeV9zc2l6ZV90ICpjb25zdW1lZCkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0RlY29kZVVURjhTdGF0ZWZ1bChjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmVycm9ycywgUHlfc3NpemVfdCAqY29uc3VtZWQpCiAKLSAgIElmICpjb25zdW1lZCogaXMgKk5VTEwqLCBiZWhhdmUgbGlrZSA6Y2Z1bmM6YFB5VW5pY29kZV9EZWNvZGVVVEY4YC4gSWYKKyAgIElmICpjb25zdW1lZCogaXMgKk5VTEwqLCBiZWhhdmUgbGlrZSA6YzpmdW5jOmBQeVVuaWNvZGVfRGVjb2RlVVRGOGAuIElmCiAgICAqY29uc3VtZWQqIGlzIG5vdCAqTlVMTCosIHRyYWlsaW5nIGluY29tcGxldGUgVVRGLTggYnl0ZSBzZXF1ZW5jZXMgd2lsbCBub3QgYmUKICAgIHRyZWF0ZWQgYXMgYW4gZXJyb3IuIFRob3NlIGJ5dGVzIHdpbGwgbm90IGJlIGRlY29kZWQgYW5kIHRoZSBudW1iZXIgb2YgYnl0ZXMKICAgIHRoYXQgaGF2ZSBiZWVuIGRlY29kZWQgd2lsbCBiZSBzdG9yZWQgaW4gKmNvbnN1bWVkKi4KQEAgLTQ5MiwyMSArNDk5LDIxIEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjQKIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Y3R5cGU6YGludGAgdHlwZSBmb3IgKnNpemUqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgZm9yICpzaXplKi4gVGhpcyBtaWdodCByZXF1aXJlCiAgICAgICBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0VuY29kZVVURjgoY29uc3QgUHlfVU5JQ09ERSAqcywgUHlfc3NpemVfdCBzaXplLCBjb25zdCBjaGFyICplcnJvcnMpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9FbmNvZGVVVEY4KGNvbnN0IFB5X1VOSUNPREUgKnMsIFB5X3NzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZXJyb3JzKQogCi0gICBFbmNvZGUgdGhlIDpjdHlwZTpgUHlfVU5JQ09ERWAgYnVmZmVyICpzKiBvZiB0aGUgZ2l2ZW4gKnNpemUqIHVzaW5nIFVURi04IGFuZCByZXR1cm4gYQorICAgRW5jb2RlIHRoZSA6Yzp0eXBlOmBQeV9VTklDT0RFYCBidWZmZXIgKnMqIG9mIHRoZSBnaXZlbiAqc2l6ZSogdXNpbmcgVVRGLTggYW5kIHJldHVybiBhCiAgICBQeXRob24gc3RyaW5nIG9iamVjdC4gIFJldHVybiAqTlVMTCogaWYgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQgYnkgdGhlIGNvZGVjLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjdHlwZTpgaW50YCB0eXBlIGZvciAqc2l6ZSouIFRoaXMgbWlnaHQgcmVxdWlyZQorICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjOnR5cGU6YGludGAgdHlwZSBmb3IgKnNpemUqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKICAgICAgIGNoYW5nZXMgaW4geW91ciBjb2RlIGZvciBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKFB5T2JqZWN0ICp1bmljb2RlKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKFB5T2JqZWN0ICp1bmljb2RlKQogCiAgICBFbmNvZGUgYSBVbmljb2RlIG9iamVjdCB1c2luZyBVVEYtOCBhbmQgcmV0dXJuIHRoZSByZXN1bHQgYXMgUHl0aG9uIHN0cmluZwogICAgb2JqZWN0LiAgRXJyb3IgaGFuZGxpbmcgaXMgInN0cmljdCIuICBSZXR1cm4gKk5VTEwqIGlmIGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkCkBAIC01MTksNyArNTI2LDcgQEAKIFRoZXNlIGFyZSB0aGUgVVRGLTMyIGNvZGVjIEFQSXM6CiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9EZWNvZGVVVEYzMihjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmVycm9ycywgaW50ICpieXRlb3JkZXIpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9EZWNvZGVVVEYzMihjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmVycm9ycywgaW50ICpieXRlb3JkZXIpCiAKICAgIERlY29kZSAqc2l6ZSogYnl0ZXMgZnJvbSBhIFVURi0zMiBlbmNvZGVkIGJ1ZmZlciBzdHJpbmcgYW5kIHJldHVybiB0aGUKICAgIGNvcnJlc3BvbmRpbmcgVW5pY29kZSBvYmplY3QuICAqZXJyb3JzKiAoaWYgbm9uLSpOVUxMKikgZGVmaW5lcyB0aGUgZXJyb3IKQEAgLTU0OSwxMCArNTU2LDEwIEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjYKIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0RlY29kZVVURjMyU3RhdGVmdWwoY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBzaXplLCBjb25zdCBjaGFyICplcnJvcnMsIGludCAqYnl0ZW9yZGVyLCBQeV9zc2l6ZV90ICpjb25zdW1lZCkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0RlY29kZVVURjMyU3RhdGVmdWwoY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBzaXplLCBjb25zdCBjaGFyICplcnJvcnMsIGludCAqYnl0ZW9yZGVyLCBQeV9zc2l6ZV90ICpjb25zdW1lZCkKIAotICAgSWYgKmNvbnN1bWVkKiBpcyAqTlVMTCosIGJlaGF2ZSBsaWtlIDpjZnVuYzpgUHlVbmljb2RlX0RlY29kZVVURjMyYC4gSWYKLSAgICpjb25zdW1lZCogaXMgbm90ICpOVUxMKiwgOmNmdW5jOmBQeVVuaWNvZGVfRGVjb2RlVVRGMzJTdGF0ZWZ1bGAgd2lsbCBub3QgdHJlYXQKKyAgIElmICpjb25zdW1lZCogaXMgKk5VTEwqLCBiZWhhdmUgbGlrZSA6YzpmdW5jOmBQeVVuaWNvZGVfRGVjb2RlVVRGMzJgLiBJZgorICAgKmNvbnN1bWVkKiBpcyBub3QgKk5VTEwqLCA6YzpmdW5jOmBQeVVuaWNvZGVfRGVjb2RlVVRGMzJTdGF0ZWZ1bGAgd2lsbCBub3QgdHJlYXQKICAgIHRyYWlsaW5nIGluY29tcGxldGUgVVRGLTMyIGJ5dGUgc2VxdWVuY2VzIChzdWNoIGFzIGEgbnVtYmVyIG9mIGJ5dGVzIG5vdCBkaXZpc2libGUKICAgIGJ5IGZvdXIpIGFzIGFuIGVycm9yLiBUaG9zZSBieXRlcyB3aWxsIG5vdCBiZSBkZWNvZGVkIGFuZCB0aGUgbnVtYmVyIG9mIGJ5dGVzCiAgICB0aGF0IGhhdmUgYmVlbiBkZWNvZGVkIHdpbGwgYmUgc3RvcmVkIGluICpjb25zdW1lZCouCkBAIC01NjAsNyArNTY3LDcgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfRW5jb2RlVVRGMzIoY29uc3QgUHlfVU5JQ09ERSAqcywgUHlfc3NpemVfdCBzaXplLCBjb25zdCBjaGFyICplcnJvcnMsIGludCBieXRlb3JkZXIpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9FbmNvZGVVVEYzMihjb25zdCBQeV9VTklDT0RFICpzLCBQeV9zc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmVycm9ycywgaW50IGJ5dGVvcmRlcikKIAogICAgUmV0dXJuIGEgUHl0aG9uIGJ5dGVzIG9iamVjdCBob2xkaW5nIHRoZSBVVEYtMzIgZW5jb2RlZCB2YWx1ZSBvZiB0aGUgVW5pY29kZQogICAgZGF0YSBpbiAqcyouICBPdXRwdXQgaXMgd3JpdHRlbiBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBieXRlIG9yZGVyOjoKQEAgLTU4MCw3ICs1ODcsNyBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi42CiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9Bc1VURjMyU3RyaW5nKFB5T2JqZWN0ICp1bmljb2RlKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfQXNVVEYzMlN0cmluZyhQeU9iamVjdCAqdW5pY29kZSkKIAogICAgUmV0dXJuIGEgUHl0aG9uIHN0cmluZyB1c2luZyB0aGUgVVRGLTMyIGVuY29kaW5nIGluIG5hdGl2ZSBieXRlIG9yZGVyLiBUaGUKICAgIHN0cmluZyBhbHdheXMgc3RhcnRzIHdpdGggYSBCT00gbWFyay4gIEVycm9yIGhhbmRsaW5nIGlzICJzdHJpY3QiLiAgUmV0dXJuCkBAIC01OTUsNyArNjAyLDcgQEAKIFRoZXNlIGFyZSB0aGUgVVRGLTE2IGNvZGVjIEFQSXM6CiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9EZWNvZGVVVEYxNihjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmVycm9ycywgaW50ICpieXRlb3JkZXIpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9EZWNvZGVVVEYxNihjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmVycm9ycywgaW50ICpieXRlb3JkZXIpCiAKICAgIERlY29kZSAqc2l6ZSogYnl0ZXMgZnJvbSBhIFVURi0xNiBlbmNvZGVkIGJ1ZmZlciBzdHJpbmcgYW5kIHJldHVybiB0aGUKICAgIGNvcnJlc3BvbmRpbmcgVW5pY29kZSBvYmplY3QuICAqZXJyb3JzKiAoaWYgbm9uLSpOVUxMKikgZGVmaW5lcyB0aGUgZXJyb3IKQEAgLTYyMiwxNCArNjI5LDE0IEBACiAgICBSZXR1cm4gKk5VTEwqIGlmIGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkIGJ5IHRoZSBjb2RlYy4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Y3R5cGU6YGludGAgdHlwZSBmb3IgKnNpemUqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgZm9yICpzaXplKi4gVGhpcyBtaWdodCByZXF1aXJlCiAgICAgICBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0RlY29kZVVURjE2U3RhdGVmdWwoY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBzaXplLCBjb25zdCBjaGFyICplcnJvcnMsIGludCAqYnl0ZW9yZGVyLCBQeV9zc2l6ZV90ICpjb25zdW1lZCkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0RlY29kZVVURjE2U3RhdGVmdWwoY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBzaXplLCBjb25zdCBjaGFyICplcnJvcnMsIGludCAqYnl0ZW9yZGVyLCBQeV9zc2l6ZV90ICpjb25zdW1lZCkKIAotICAgSWYgKmNvbnN1bWVkKiBpcyAqTlVMTCosIGJlaGF2ZSBsaWtlIDpjZnVuYzpgUHlVbmljb2RlX0RlY29kZVVURjE2YC4gSWYKLSAgICpjb25zdW1lZCogaXMgbm90ICpOVUxMKiwgOmNmdW5jOmBQeVVuaWNvZGVfRGVjb2RlVVRGMTZTdGF0ZWZ1bGAgd2lsbCBub3QgdHJlYXQKKyAgIElmICpjb25zdW1lZCogaXMgKk5VTEwqLCBiZWhhdmUgbGlrZSA6YzpmdW5jOmBQeVVuaWNvZGVfRGVjb2RlVVRGMTZgLiBJZgorICAgKmNvbnN1bWVkKiBpcyBub3QgKk5VTEwqLCA6YzpmdW5jOmBQeVVuaWNvZGVfRGVjb2RlVVRGMTZTdGF0ZWZ1bGAgd2lsbCBub3QgdHJlYXQKICAgIHRyYWlsaW5nIGluY29tcGxldGUgVVRGLTE2IGJ5dGUgc2VxdWVuY2VzIChzdWNoIGFzIGFuIG9kZCBudW1iZXIgb2YgYnl0ZXMgb3IgYQogICAgc3BsaXQgc3Vycm9nYXRlIHBhaXIpIGFzIGFuIGVycm9yLiBUaG9zZSBieXRlcyB3aWxsIG5vdCBiZSBkZWNvZGVkIGFuZCB0aGUKICAgIG51bWJlciBvZiBieXRlcyB0aGF0IGhhdmUgYmVlbiBkZWNvZGVkIHdpbGwgYmUgc3RvcmVkIGluICpjb25zdW1lZCouCkBAIC02MzcsMTIgKzY0NCwxMiBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi40CiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUgZm9yICpzaXplKiBhbmQgYW4gOmN0eXBlOmBpbnQgKmAKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgZm9yICpzaXplKiBhbmQgYW4gOmM6dHlwZTpgaW50ICpgCiAgICAgICB0eXBlIGZvciAqY29uc3VtZWQqLiBUaGlzIG1pZ2h0IHJlcXVpcmUgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yCiAgICAgICBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfRW5jb2RlVVRGMTYoY29uc3QgUHlfVU5JQ09ERSAqcywgUHlfc3NpemVfdCBzaXplLCBjb25zdCBjaGFyICplcnJvcnMsIGludCBieXRlb3JkZXIpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9FbmNvZGVVVEYxNihjb25zdCBQeV9VTklDT0RFICpzLCBQeV9zc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmVycm9ycywgaW50IGJ5dGVvcmRlcikKIAogICAgUmV0dXJuIGEgUHl0aG9uIHN0cmluZyBvYmplY3QgaG9sZGluZyB0aGUgVVRGLTE2IGVuY29kZWQgdmFsdWUgb2YgdGhlIFVuaWNvZGUKICAgIGRhdGEgaW4gKnMqLiAgT3V0cHV0IGlzIHdyaXR0ZW4gYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgYnl0ZSBvcmRlcjo6CkBAIC02NTQsMTggKzY2MSwxOCBAQAogICAgSWYgYnl0ZW9yZGVyIGlzIGBgMGBgLCB0aGUgb3V0cHV0IHN0cmluZyB3aWxsIGFsd2F5cyBzdGFydCB3aXRoIHRoZSBVbmljb2RlIEJPTQogICAgbWFyayAoVStGRUZGKS4gSW4gdGhlIG90aGVyIHR3byBtb2Rlcywgbm8gQk9NIG1hcmsgaXMgcHJlcGVuZGVkLgogCi0gICBJZiAqUHlfVU5JQ09ERV9XSURFKiBpcyBkZWZpbmVkLCBhIHNpbmdsZSA6Y3R5cGU6YFB5X1VOSUNPREVgIHZhbHVlIG1heSBnZXQKLSAgIHJlcHJlc2VudGVkIGFzIGEgc3Vycm9nYXRlIHBhaXIuIElmIGl0IGlzIG5vdCBkZWZpbmVkLCBlYWNoIDpjdHlwZTpgUHlfVU5JQ09ERWAKKyAgIElmICpQeV9VTklDT0RFX1dJREUqIGlzIGRlZmluZWQsIGEgc2luZ2xlIDpjOnR5cGU6YFB5X1VOSUNPREVgIHZhbHVlIG1heSBnZXQKKyAgIHJlcHJlc2VudGVkIGFzIGEgc3Vycm9nYXRlIHBhaXIuIElmIGl0IGlzIG5vdCBkZWZpbmVkLCBlYWNoIDpjOnR5cGU6YFB5X1VOSUNPREVgCiAgICB2YWx1ZXMgaXMgaW50ZXJwcmV0ZWQgYXMgYW4gVUNTLTIgY2hhcmFjdGVyLgogCiAgICBSZXR1cm4gKk5VTEwqIGlmIGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkIGJ5IHRoZSBjb2RlYy4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Y3R5cGU6YGludGAgdHlwZSBmb3IgKnNpemUqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgZm9yICpzaXplKi4gVGhpcyBtaWdodCByZXF1aXJlCiAgICAgICBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0FzVVRGMTZTdHJpbmcoUHlPYmplY3QgKnVuaWNvZGUpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9Bc1VURjE2U3RyaW5nKFB5T2JqZWN0ICp1bmljb2RlKQogCiAgICBSZXR1cm4gYSBQeXRob24gc3RyaW5nIHVzaW5nIHRoZSBVVEYtMTYgZW5jb2RpbmcgaW4gbmF0aXZlIGJ5dGUgb3JkZXIuIFRoZQogICAgc3RyaW5nIGFsd2F5cyBzdGFydHMgd2l0aCBhIEJPTSBtYXJrLiAgRXJyb3IgaGFuZGxpbmcgaXMgInN0cmljdCIuICBSZXR1cm4KQEAgLTY3OCwyMyArNjg1LDIzIEBACiBUaGVzZSBhcmUgdGhlIFVURi03IGNvZGVjIEFQSXM6CiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9EZWNvZGVVVEY3KGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZXJyb3JzKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfRGVjb2RlVVRGNyhjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmVycm9ycykKIAogICAgQ3JlYXRlIGEgVW5pY29kZSBvYmplY3QgYnkgZGVjb2RpbmcgKnNpemUqIGJ5dGVzIG9mIHRoZSBVVEYtNyBlbmNvZGVkIHN0cmluZwogICAgKnMqLiAgUmV0dXJuICpOVUxMKiBpZiBhbiBleGNlcHRpb24gd2FzIHJhaXNlZCBieSB0aGUgY29kZWMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9EZWNvZGVVVEY3U3RhdGVmdWwoY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBzaXplLCBjb25zdCBjaGFyICplcnJvcnMsIFB5X3NzaXplX3QgKmNvbnN1bWVkKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfRGVjb2RlVVRGN1N0YXRlZnVsKGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZXJyb3JzLCBQeV9zc2l6ZV90ICpjb25zdW1lZCkKIAotICAgSWYgKmNvbnN1bWVkKiBpcyAqTlVMTCosIGJlaGF2ZSBsaWtlIDpjZnVuYzpgUHlVbmljb2RlX0RlY29kZVVURjdgLiAgSWYKKyAgIElmICpjb25zdW1lZCogaXMgKk5VTEwqLCBiZWhhdmUgbGlrZSA6YzpmdW5jOmBQeVVuaWNvZGVfRGVjb2RlVVRGN2AuICBJZgogICAgKmNvbnN1bWVkKiBpcyBub3QgKk5VTEwqLCB0cmFpbGluZyBpbmNvbXBsZXRlIFVURi03IGJhc2UtNjQgc2VjdGlvbnMgd2lsbCBub3QKICAgIGJlIHRyZWF0ZWQgYXMgYW4gZXJyb3IuICBUaG9zZSBieXRlcyB3aWxsIG5vdCBiZSBkZWNvZGVkIGFuZCB0aGUgbnVtYmVyIG9mCiAgICBieXRlcyB0aGF0IGhhdmUgYmVlbiBkZWNvZGVkIHdpbGwgYmUgc3RvcmVkIGluICpjb25zdW1lZCouCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9FbmNvZGVVVEY3KGNvbnN0IFB5X1VOSUNPREUgKnMsIFB5X3NzaXplX3Qgc2l6ZSwgaW50IGJhc2U2NFNldE8sIGludCBiYXNlNjRXaGl0ZVNwYWNlLCBjb25zdCBjaGFyICplcnJvcnMpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9FbmNvZGVVVEY3KGNvbnN0IFB5X1VOSUNPREUgKnMsIFB5X3NzaXplX3Qgc2l6ZSwgaW50IGJhc2U2NFNldE8sIGludCBiYXNlNjRXaGl0ZVNwYWNlLCBjb25zdCBjaGFyICplcnJvcnMpCiAKLSAgIEVuY29kZSB0aGUgOmN0eXBlOmBQeV9VTklDT0RFYCBidWZmZXIgb2YgdGhlIGdpdmVuIHNpemUgdXNpbmcgVVRGLTcgYW5kCisgICBFbmNvZGUgdGhlIDpjOnR5cGU6YFB5X1VOSUNPREVgIGJ1ZmZlciBvZiB0aGUgZ2l2ZW4gc2l6ZSB1c2luZyBVVEYtNyBhbmQKICAgIHJldHVybiBhIFB5dGhvbiBieXRlcyBvYmplY3QuICBSZXR1cm4gKk5VTEwqIGlmIGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkIGJ5CiAgICB0aGUgY29kZWMuCiAKQEAgLTcxMCwyOCArNzE3LDI4IEBACiBUaGVzZSBhcmUgdGhlICJVbmljb2RlIEVzY2FwZSIgY29kZWMgQVBJczoKIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0RlY29kZVVuaWNvZGVFc2NhcGUoY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBzaXplLCBjb25zdCBjaGFyICplcnJvcnMpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9EZWNvZGVVbmljb2RlRXNjYXBlKGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZXJyb3JzKQogCiAgICBDcmVhdGUgYSBVbmljb2RlIG9iamVjdCBieSBkZWNvZGluZyAqc2l6ZSogYnl0ZXMgb2YgdGhlIFVuaWNvZGUtRXNjYXBlIGVuY29kZWQKICAgIHN0cmluZyAqcyouICBSZXR1cm4gKk5VTEwqIGlmIGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkIGJ5IHRoZSBjb2RlYy4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Y3R5cGU6YGludGAgdHlwZSBmb3IgKnNpemUqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgZm9yICpzaXplKi4gVGhpcyBtaWdodCByZXF1aXJlCiAgICAgICBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0VuY29kZVVuaWNvZGVFc2NhcGUoY29uc3QgUHlfVU5JQ09ERSAqcywgUHlfc3NpemVfdCBzaXplKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfRW5jb2RlVW5pY29kZUVzY2FwZShjb25zdCBQeV9VTklDT0RFICpzLCBQeV9zc2l6ZV90IHNpemUpCiAKLSAgIEVuY29kZSB0aGUgOmN0eXBlOmBQeV9VTklDT0RFYCBidWZmZXIgb2YgdGhlIGdpdmVuICpzaXplKiB1c2luZyBVbmljb2RlLUVzY2FwZSBhbmQKKyAgIEVuY29kZSB0aGUgOmM6dHlwZTpgUHlfVU5JQ09ERWAgYnVmZmVyIG9mIHRoZSBnaXZlbiAqc2l6ZSogdXNpbmcgVW5pY29kZS1Fc2NhcGUgYW5kCiAgICByZXR1cm4gYSBQeXRob24gc3RyaW5nIG9iamVjdC4gIFJldHVybiAqTlVMTCogaWYgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQgYnkgdGhlCiAgICBjb2RlYy4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Y3R5cGU6YGludGAgdHlwZSBmb3IgKnNpemUqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgZm9yICpzaXplKi4gVGhpcyBtaWdodCByZXF1aXJlCiAgICAgICBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0FzVW5pY29kZUVzY2FwZVN0cmluZyhQeU9iamVjdCAqdW5pY29kZSkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0FzVW5pY29kZUVzY2FwZVN0cmluZyhQeU9iamVjdCAqdW5pY29kZSkKIAogICAgRW5jb2RlIGEgVW5pY29kZSBvYmplY3QgdXNpbmcgVW5pY29kZS1Fc2NhcGUgYW5kIHJldHVybiB0aGUgcmVzdWx0IGFzIFB5dGhvbgogICAgc3RyaW5nIG9iamVjdC4gIEVycm9yIGhhbmRsaW5nIGlzICJzdHJpY3QiLiBSZXR1cm4gKk5VTEwqIGlmIGFuIGV4Y2VwdGlvbiB3YXMKQEAgLTc0NCwyOCArNzUxLDI4IEBACiBUaGVzZSBhcmUgdGhlICJSYXcgVW5pY29kZSBFc2NhcGUiIGNvZGVjIEFQSXM6CiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9EZWNvZGVSYXdVbmljb2RlRXNjYXBlKGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZXJyb3JzKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfRGVjb2RlUmF3VW5pY29kZUVzY2FwZShjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmVycm9ycykKIAogICAgQ3JlYXRlIGEgVW5pY29kZSBvYmplY3QgYnkgZGVjb2RpbmcgKnNpemUqIGJ5dGVzIG9mIHRoZSBSYXctVW5pY29kZS1Fc2NhcGUKICAgIGVuY29kZWQgc3RyaW5nICpzKi4gIFJldHVybiAqTlVMTCogaWYgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQgYnkgdGhlIGNvZGVjLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjdHlwZTpgaW50YCB0eXBlIGZvciAqc2l6ZSouIFRoaXMgbWlnaHQgcmVxdWlyZQorICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjOnR5cGU6YGludGAgdHlwZSBmb3IgKnNpemUqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKICAgICAgIGNoYW5nZXMgaW4geW91ciBjb2RlIGZvciBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfRW5jb2RlUmF3VW5pY29kZUVzY2FwZShjb25zdCBQeV9VTklDT0RFICpzLCBQeV9zc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmVycm9ycykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0VuY29kZVJhd1VuaWNvZGVFc2NhcGUoY29uc3QgUHlfVU5JQ09ERSAqcywgUHlfc3NpemVfdCBzaXplLCBjb25zdCBjaGFyICplcnJvcnMpCiAKLSAgIEVuY29kZSB0aGUgOmN0eXBlOmBQeV9VTklDT0RFYCBidWZmZXIgb2YgdGhlIGdpdmVuICpzaXplKiB1c2luZyBSYXctVW5pY29kZS1Fc2NhcGUKKyAgIEVuY29kZSB0aGUgOmM6dHlwZTpgUHlfVU5JQ09ERWAgYnVmZmVyIG9mIHRoZSBnaXZlbiAqc2l6ZSogdXNpbmcgUmF3LVVuaWNvZGUtRXNjYXBlCiAgICBhbmQgcmV0dXJuIGEgUHl0aG9uIHN0cmluZyBvYmplY3QuICBSZXR1cm4gKk5VTEwqIGlmIGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkIGJ5CiAgICB0aGUgY29kZWMuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUgZm9yICpzaXplKi4gVGhpcyBtaWdodCByZXF1aXJlCisgICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmM6dHlwZTpgaW50YCB0eXBlIGZvciAqc2l6ZSouIFRoaXMgbWlnaHQgcmVxdWlyZQogICAgICAgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9Bc1Jhd1VuaWNvZGVFc2NhcGVTdHJpbmcoUHlPYmplY3QgKnVuaWNvZGUpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9Bc1Jhd1VuaWNvZGVFc2NhcGVTdHJpbmcoUHlPYmplY3QgKnVuaWNvZGUpCiAKICAgIEVuY29kZSBhIFVuaWNvZGUgb2JqZWN0IHVzaW5nIFJhdy1Vbmljb2RlLUVzY2FwZSBhbmQgcmV0dXJuIHRoZSByZXN1bHQgYXMKICAgIFB5dGhvbiBzdHJpbmcgb2JqZWN0LiBFcnJvciBoYW5kbGluZyBpcyAic3RyaWN0Ii4gUmV0dXJuICpOVUxMKiBpZiBhbiBleGNlcHRpb24KQEAgLTc3OSwyNyArNzg2LDI3IEBACiBvcmRpbmFscyBhbmQgb25seSB0aGVzZSBhcmUgYWNjZXB0ZWQgYnkgdGhlIGNvZGVjcyBkdXJpbmcgZW5jb2RpbmcuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9EZWNvZGVMYXRpbjEoY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBzaXplLCBjb25zdCBjaGFyICplcnJvcnMpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9EZWNvZGVMYXRpbjEoY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBzaXplLCBjb25zdCBjaGFyICplcnJvcnMpCiAKICAgIENyZWF0ZSBhIFVuaWNvZGUgb2JqZWN0IGJ5IGRlY29kaW5nICpzaXplKiBieXRlcyBvZiB0aGUgTGF0aW4tMSBlbmNvZGVkIHN0cmluZwogICAgKnMqLiAgUmV0dXJuICpOVUxMKiBpZiBhbiBleGNlcHRpb24gd2FzIHJhaXNlZCBieSB0aGUgY29kZWMuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUgZm9yICpzaXplKi4gVGhpcyBtaWdodCByZXF1aXJlCisgICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmM6dHlwZTpgaW50YCB0eXBlIGZvciAqc2l6ZSouIFRoaXMgbWlnaHQgcmVxdWlyZQogICAgICAgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9FbmNvZGVMYXRpbjEoY29uc3QgUHlfVU5JQ09ERSAqcywgUHlfc3NpemVfdCBzaXplLCBjb25zdCBjaGFyICplcnJvcnMpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9FbmNvZGVMYXRpbjEoY29uc3QgUHlfVU5JQ09ERSAqcywgUHlfc3NpemVfdCBzaXplLCBjb25zdCBjaGFyICplcnJvcnMpCiAKLSAgIEVuY29kZSB0aGUgOmN0eXBlOmBQeV9VTklDT0RFYCBidWZmZXIgb2YgdGhlIGdpdmVuICpzaXplKiB1c2luZyBMYXRpbi0xIGFuZCByZXR1cm4KKyAgIEVuY29kZSB0aGUgOmM6dHlwZTpgUHlfVU5JQ09ERWAgYnVmZmVyIG9mIHRoZSBnaXZlbiAqc2l6ZSogdXNpbmcgTGF0aW4tMSBhbmQgcmV0dXJuCiAgICBhIFB5dGhvbiBzdHJpbmcgb2JqZWN0LiAgUmV0dXJuICpOVUxMKiBpZiBhbiBleGNlcHRpb24gd2FzIHJhaXNlZCBieSB0aGUgY29kZWMuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUgZm9yICpzaXplKi4gVGhpcyBtaWdodCByZXF1aXJlCisgICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmM6dHlwZTpgaW50YCB0eXBlIGZvciAqc2l6ZSouIFRoaXMgbWlnaHQgcmVxdWlyZQogICAgICAgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9Bc0xhdGluMVN0cmluZyhQeU9iamVjdCAqdW5pY29kZSkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0FzTGF0aW4xU3RyaW5nKFB5T2JqZWN0ICp1bmljb2RlKQogCiAgICBFbmNvZGUgYSBVbmljb2RlIG9iamVjdCB1c2luZyBMYXRpbi0xIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcyBQeXRob24gc3RyaW5nCiAgICBvYmplY3QuICBFcnJvciBoYW5kbGluZyBpcyAic3RyaWN0Ii4gIFJldHVybiAqTlVMTCogaWYgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQKQEAgLTgxMywyNyArODIwLDI3IEBACiBjb2RlcyBnZW5lcmF0ZSBlcnJvcnMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9EZWNvZGVBU0NJSShjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmVycm9ycykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0RlY29kZUFTQ0lJKGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZXJyb3JzKQogCiAgICBDcmVhdGUgYSBVbmljb2RlIG9iamVjdCBieSBkZWNvZGluZyAqc2l6ZSogYnl0ZXMgb2YgdGhlIEFTQ0lJIGVuY29kZWQgc3RyaW5nCiAgICAqcyouICBSZXR1cm4gKk5VTEwqIGlmIGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkIGJ5IHRoZSBjb2RlYy4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Y3R5cGU6YGludGAgdHlwZSBmb3IgKnNpemUqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgZm9yICpzaXplKi4gVGhpcyBtaWdodCByZXF1aXJlCiAgICAgICBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0VuY29kZUFTQ0lJKGNvbnN0IFB5X1VOSUNPREUgKnMsIFB5X3NzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZXJyb3JzKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfRW5jb2RlQVNDSUkoY29uc3QgUHlfVU5JQ09ERSAqcywgUHlfc3NpemVfdCBzaXplLCBjb25zdCBjaGFyICplcnJvcnMpCiAKLSAgIEVuY29kZSB0aGUgOmN0eXBlOmBQeV9VTklDT0RFYCBidWZmZXIgb2YgdGhlIGdpdmVuICpzaXplKiB1c2luZyBBU0NJSSBhbmQgcmV0dXJuIGEKKyAgIEVuY29kZSB0aGUgOmM6dHlwZTpgUHlfVU5JQ09ERWAgYnVmZmVyIG9mIHRoZSBnaXZlbiAqc2l6ZSogdXNpbmcgQVNDSUkgYW5kIHJldHVybiBhCiAgICBQeXRob24gc3RyaW5nIG9iamVjdC4gIFJldHVybiAqTlVMTCogaWYgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQgYnkgdGhlIGNvZGVjLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjdHlwZTpgaW50YCB0eXBlIGZvciAqc2l6ZSouIFRoaXMgbWlnaHQgcmVxdWlyZQorICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjOnR5cGU6YGludGAgdHlwZSBmb3IgKnNpemUqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKICAgICAgIGNoYW5nZXMgaW4geW91ciBjb2RlIGZvciBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfQXNBU0NJSVN0cmluZyhQeU9iamVjdCAqdW5pY29kZSkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0FzQVNDSUlTdHJpbmcoUHlPYmplY3QgKnVuaWNvZGUpCiAKICAgIEVuY29kZSBhIFVuaWNvZGUgb2JqZWN0IHVzaW5nIEFTQ0lJIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcyBQeXRob24gc3RyaW5nCiAgICBvYmplY3QuICBFcnJvciBoYW5kbGluZyBpcyAic3RyaWN0Ii4gIFJldHVybiAqTlVMTCogaWYgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQKQEAgLTg2Niw3ICs4NzMsNyBAQAogCiBUaGVzZSBhcmUgdGhlIG1hcHBpbmcgY29kZWMgQVBJczoKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9EZWNvZGVDaGFybWFwKGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3Qgc2l6ZSwgUHlPYmplY3QgKm1hcHBpbmcsIGNvbnN0IGNoYXIgKmVycm9ycykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0RlY29kZUNoYXJtYXAoY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBzaXplLCBQeU9iamVjdCAqbWFwcGluZywgY29uc3QgY2hhciAqZXJyb3JzKQogCiAgICBDcmVhdGUgYSBVbmljb2RlIG9iamVjdCBieSBkZWNvZGluZyAqc2l6ZSogYnl0ZXMgb2YgdGhlIGVuY29kZWQgc3RyaW5nICpzKiB1c2luZwogICAgdGhlIGdpdmVuICptYXBwaW5nKiBvYmplY3QuICBSZXR1cm4gKk5VTEwqIGlmIGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkIGJ5IHRoZQpAQCAtODc5LDIyICs4ODYsMjIgQEAKICAgICAgIEFsbG93ZWQgdW5pY29kZSBzdHJpbmcgYXMgbWFwcGluZyBhcmd1bWVudC4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Y3R5cGU6YGludGAgdHlwZSBmb3IgKnNpemUqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgZm9yICpzaXplKi4gVGhpcyBtaWdodCByZXF1aXJlCiAgICAgICBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0VuY29kZUNoYXJtYXAoY29uc3QgUHlfVU5JQ09ERSAqcywgUHlfc3NpemVfdCBzaXplLCBQeU9iamVjdCAqbWFwcGluZywgY29uc3QgY2hhciAqZXJyb3JzKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfRW5jb2RlQ2hhcm1hcChjb25zdCBQeV9VTklDT0RFICpzLCBQeV9zc2l6ZV90IHNpemUsIFB5T2JqZWN0ICptYXBwaW5nLCBjb25zdCBjaGFyICplcnJvcnMpCiAKLSAgIEVuY29kZSB0aGUgOmN0eXBlOmBQeV9VTklDT0RFYCBidWZmZXIgb2YgdGhlIGdpdmVuICpzaXplKiB1c2luZyB0aGUgZ2l2ZW4KKyAgIEVuY29kZSB0aGUgOmM6dHlwZTpgUHlfVU5JQ09ERWAgYnVmZmVyIG9mIHRoZSBnaXZlbiAqc2l6ZSogdXNpbmcgdGhlIGdpdmVuCiAgICAqbWFwcGluZyogb2JqZWN0IGFuZCByZXR1cm4gYSBQeXRob24gc3RyaW5nIG9iamVjdC4gUmV0dXJuICpOVUxMKiBpZiBhbgogICAgZXhjZXB0aW9uIHdhcyByYWlzZWQgYnkgdGhlIGNvZGVjLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjdHlwZTpgaW50YCB0eXBlIGZvciAqc2l6ZSouIFRoaXMgbWlnaHQgcmVxdWlyZQorICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjOnR5cGU6YGludGAgdHlwZSBmb3IgKnNpemUqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKICAgICAgIGNoYW5nZXMgaW4geW91ciBjb2RlIGZvciBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfQXNDaGFybWFwU3RyaW5nKFB5T2JqZWN0ICp1bmljb2RlLCBQeU9iamVjdCAqbWFwcGluZykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0FzQ2hhcm1hcFN0cmluZyhQeU9iamVjdCAqdW5pY29kZSwgUHlPYmplY3QgKm1hcHBpbmcpCiAKICAgIEVuY29kZSBhIFVuaWNvZGUgb2JqZWN0IHVzaW5nIHRoZSBnaXZlbiAqbWFwcGluZyogb2JqZWN0IGFuZCByZXR1cm4gdGhlIHJlc3VsdAogICAgYXMgUHl0aG9uIHN0cmluZyBvYmplY3QuICBFcnJvciBoYW5kbGluZyBpcyAic3RyaWN0Ii4gIFJldHVybiAqTlVMTCogaWYgYW4KQEAgLTkwMyw5ICs5MTAsOSBAQAogVGhlIGZvbGxvd2luZyBjb2RlYyBBUEkgaXMgc3BlY2lhbCBpbiB0aGF0IG1hcHMgVW5pY29kZSB0byBVbmljb2RlLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfVHJhbnNsYXRlQ2hhcm1hcChjb25zdCBQeV9VTklDT0RFICpzLCBQeV9zc2l6ZV90IHNpemUsIFB5T2JqZWN0ICp0YWJsZSwgY29uc3QgY2hhciAqZXJyb3JzKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfVHJhbnNsYXRlQ2hhcm1hcChjb25zdCBQeV9VTklDT0RFICpzLCBQeV9zc2l6ZV90IHNpemUsIFB5T2JqZWN0ICp0YWJsZSwgY29uc3QgY2hhciAqZXJyb3JzKQogCi0gICBUcmFuc2xhdGUgYSA6Y3R5cGU6YFB5X1VOSUNPREVgIGJ1ZmZlciBvZiB0aGUgZ2l2ZW4gKnNpemUqIGJ5IGFwcGx5aW5nIGEKKyAgIFRyYW5zbGF0ZSBhIDpjOnR5cGU6YFB5X1VOSUNPREVgIGJ1ZmZlciBvZiB0aGUgZ2l2ZW4gKnNpemUqIGJ5IGFwcGx5aW5nIGEKICAgIGNoYXJhY3RlciBtYXBwaW5nICp0YWJsZSogdG8gaXQgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIFVuaWNvZGUgb2JqZWN0LiAgUmV0dXJuCiAgICAqTlVMTCogd2hlbiBhbiBleGNlcHRpb24gd2FzIHJhaXNlZCBieSB0aGUgY29kZWMuCiAKQEAgLTkxNyw3ICs5MjQsNyBAQAogICAgOmV4YzpgTG9va3VwRXJyb3JgKSBhcmUgbGVmdCB1bnRvdWNoZWQgYW5kIGFyZSBjb3BpZWQgYXMtaXMuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmN0eXBlOmBpbnRgIHR5cGUgZm9yICpzaXplKi4gVGhpcyBtaWdodCByZXF1aXJlCisgICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmM6dHlwZTpgaW50YCB0eXBlIGZvciAqc2l6ZSouIFRoaXMgbWlnaHQgcmVxdWlyZQogICAgICAgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIApAQCAtOTMwLDM3ICs5MzcsMzcgQEAKIHRoZSB1c2VyIHNldHRpbmdzIG9uIHRoZSBtYWNoaW5lIHJ1bm5pbmcgdGhlIGNvZGVjLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfRGVjb2RlTUJDUyhjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmVycm9ycykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0RlY29kZU1CQ1MoY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBzaXplLCBjb25zdCBjaGFyICplcnJvcnMpCiAKICAgIENyZWF0ZSBhIFVuaWNvZGUgb2JqZWN0IGJ5IGRlY29kaW5nICpzaXplKiBieXRlcyBvZiB0aGUgTUJDUyBlbmNvZGVkIHN0cmluZyAqcyouCiAgICBSZXR1cm4gKk5VTEwqIGlmIGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkIGJ5IHRoZSBjb2RlYy4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Y3R5cGU6YGludGAgdHlwZSBmb3IgKnNpemUqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgZm9yICpzaXplKi4gVGhpcyBtaWdodCByZXF1aXJlCiAgICAgICBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0RlY29kZU1CQ1NTdGF0ZWZ1bChjb25zdCBjaGFyICpzLCBpbnQgc2l6ZSwgY29uc3QgY2hhciAqZXJyb3JzLCBpbnQgKmNvbnN1bWVkKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfRGVjb2RlTUJDU1N0YXRlZnVsKGNvbnN0IGNoYXIgKnMsIGludCBzaXplLCBjb25zdCBjaGFyICplcnJvcnMsIGludCAqY29uc3VtZWQpCiAKLSAgIElmICpjb25zdW1lZCogaXMgKk5VTEwqLCBiZWhhdmUgbGlrZSA6Y2Z1bmM6YFB5VW5pY29kZV9EZWNvZGVNQkNTYC4gSWYKLSAgICpjb25zdW1lZCogaXMgbm90ICpOVUxMKiwgOmNmdW5jOmBQeVVuaWNvZGVfRGVjb2RlTUJDU1N0YXRlZnVsYCB3aWxsIG5vdCBkZWNvZGUKKyAgIElmICpjb25zdW1lZCogaXMgKk5VTEwqLCBiZWhhdmUgbGlrZSA6YzpmdW5jOmBQeVVuaWNvZGVfRGVjb2RlTUJDU2AuIElmCisgICAqY29uc3VtZWQqIGlzIG5vdCAqTlVMTCosIDpjOmZ1bmM6YFB5VW5pY29kZV9EZWNvZGVNQkNTU3RhdGVmdWxgIHdpbGwgbm90IGRlY29kZQogICAgdHJhaWxpbmcgbGVhZCBieXRlIGFuZCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIGRlY29kZWQgd2lsbCBiZSBzdG9yZWQKICAgIGluICpjb25zdW1lZCouCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNQogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfRW5jb2RlTUJDUyhjb25zdCBQeV9VTklDT0RFICpzLCBQeV9zc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmVycm9ycykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0VuY29kZU1CQ1MoY29uc3QgUHlfVU5JQ09ERSAqcywgUHlfc3NpemVfdCBzaXplLCBjb25zdCBjaGFyICplcnJvcnMpCiAKLSAgIEVuY29kZSB0aGUgOmN0eXBlOmBQeV9VTklDT0RFYCBidWZmZXIgb2YgdGhlIGdpdmVuICpzaXplKiB1c2luZyBNQkNTIGFuZCByZXR1cm4gYQorICAgRW5jb2RlIHRoZSA6Yzp0eXBlOmBQeV9VTklDT0RFYCBidWZmZXIgb2YgdGhlIGdpdmVuICpzaXplKiB1c2luZyBNQkNTIGFuZCByZXR1cm4gYQogICAgUHl0aG9uIHN0cmluZyBvYmplY3QuICBSZXR1cm4gKk5VTEwqIGlmIGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkIGJ5IHRoZSBjb2RlYy4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Y3R5cGU6YGludGAgdHlwZSBmb3IgKnNpemUqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgZm9yICpzaXplKi4gVGhpcyBtaWdodCByZXF1aXJlCiAgICAgICBjaGFuZ2VzIGluIHlvdXIgY29kZSBmb3IgcHJvcGVybHkgc3VwcG9ydGluZyA2NC1iaXQgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0FzTUJDU1N0cmluZyhQeU9iamVjdCAqdW5pY29kZSkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0FzTUJDU1N0cmluZyhQeU9iamVjdCAqdW5pY29kZSkKIAogICAgRW5jb2RlIGEgVW5pY29kZSBvYmplY3QgdXNpbmcgTUJDUyBhbmQgcmV0dXJuIHRoZSByZXN1bHQgYXMgUHl0aG9uIHN0cmluZwogICAgb2JqZWN0LiAgRXJyb3IgaGFuZGxpbmcgaXMgInN0cmljdCIuICBSZXR1cm4gKk5VTEwqIGlmIGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkCkBAIC05ODIsMTIgKzk4OSwxMiBAQAogVGhleSBhbGwgcmV0dXJuICpOVUxMKiBvciBgYC0xYGAgaWYgYW4gZXhjZXB0aW9uIG9jY3Vycy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0NvbmNhdChQeU9iamVjdCAqbGVmdCwgUHlPYmplY3QgKnJpZ2h0KQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfQ29uY2F0KFB5T2JqZWN0ICpsZWZ0LCBQeU9iamVjdCAqcmlnaHQpCiAKICAgIENvbmNhdCB0d28gc3RyaW5ncyBnaXZpbmcgYSBuZXcgVW5pY29kZSBzdHJpbmcuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9TcGxpdChQeU9iamVjdCAqcywgUHlPYmplY3QgKnNlcCwgUHlfc3NpemVfdCBtYXhzcGxpdCkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX1NwbGl0KFB5T2JqZWN0ICpzLCBQeU9iamVjdCAqc2VwLCBQeV9zc2l6ZV90IG1heHNwbGl0KQogCiAgICBTcGxpdCBhIHN0cmluZyBnaXZpbmcgYSBsaXN0IG9mIFVuaWNvZGUgc3RyaW5ncy4gIElmICpzZXAqIGlzICpOVUxMKiwgc3BsaXR0aW5nCiAgICB3aWxsIGJlIGRvbmUgYXQgYWxsIHdoaXRlc3BhY2Ugc3Vic3RyaW5ncy4gIE90aGVyd2lzZSwgc3BsaXRzIG9jY3VyIGF0IHRoZSBnaXZlbgpAQCAtOTk1LDE4ICsxMDAyLDE4IEBACiAgICBzZXQuICBTZXBhcmF0b3JzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBsaXN0LgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjdHlwZTpgaW50YCB0eXBlIGZvciAqbWF4c3BsaXQqLiBUaGlzIG1pZ2h0IHJlcXVpcmUKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgZm9yICptYXhzcGxpdCouIFRoaXMgbWlnaHQgcmVxdWlyZQogICAgICAgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0IHN5c3RlbXMuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9TcGxpdGxpbmVzKFB5T2JqZWN0ICpzLCBpbnQga2VlcGVuZCkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX1NwbGl0bGluZXMoUHlPYmplY3QgKnMsIGludCBrZWVwZW5kKQogCiAgICBTcGxpdCBhIFVuaWNvZGUgc3RyaW5nIGF0IGxpbmUgYnJlYWtzLCByZXR1cm5pbmcgYSBsaXN0IG9mIFVuaWNvZGUgc3RyaW5ncy4KICAgIENSTEYgaXMgY29uc2lkZXJlZCB0byBiZSBvbmUgbGluZSBicmVhay4gIElmICprZWVwZW5kKiBpcyAwLCB0aGUgTGluZSBicmVhawogICAgY2hhcmFjdGVycyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgc3RyaW5ncy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX1RyYW5zbGF0ZShQeU9iamVjdCAqc3RyLCBQeU9iamVjdCAqdGFibGUsIGNvbnN0IGNoYXIgKmVycm9ycykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX1RyYW5zbGF0ZShQeU9iamVjdCAqc3RyLCBQeU9iamVjdCAqdGFibGUsIGNvbnN0IGNoYXIgKmVycm9ycykKIAogICAgVHJhbnNsYXRlIGEgc3RyaW5nIGJ5IGFwcGx5aW5nIGEgY2hhcmFjdGVyIG1hcHBpbmcgdGFibGUgdG8gaXQgYW5kIHJldHVybiB0aGUKICAgIHJlc3VsdGluZyBVbmljb2RlIG9iamVjdC4KQEAgLTEwMjIsMjUgKzEwMjksMjUgQEAKICAgIHVzZSB0aGUgZGVmYXVsdCBlcnJvciBoYW5kbGluZy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0pvaW4oUHlPYmplY3QgKnNlcGFyYXRvciwgUHlPYmplY3QgKnNlcSkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0pvaW4oUHlPYmplY3QgKnNlcGFyYXRvciwgUHlPYmplY3QgKnNlcSkKIAogICAgSm9pbiBhIHNlcXVlbmNlIG9mIHN0cmluZ3MgdXNpbmcgdGhlIGdpdmVuICpzZXBhcmF0b3IqIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZwogICAgVW5pY29kZSBzdHJpbmcuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5VW5pY29kZV9UYWlsbWF0Y2goUHlPYmplY3QgKnN0ciwgUHlPYmplY3QgKnN1YnN0ciwgUHlfc3NpemVfdCBzdGFydCwgUHlfc3NpemVfdCBlbmQsIGludCBkaXJlY3Rpb24pCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5VW5pY29kZV9UYWlsbWF0Y2goUHlPYmplY3QgKnN0ciwgUHlPYmplY3QgKnN1YnN0ciwgUHlfc3NpemVfdCBzdGFydCwgUHlfc3NpemVfdCBlbmQsIGludCBkaXJlY3Rpb24pCiAKICAgIFJldHVybiAxIGlmICpzdWJzdHIqIG1hdGNoZXMgYGBzdHJbc3RhcnQ6ZW5kXWBgIGF0IHRoZSBnaXZlbiB0YWlsIGVuZAogICAgKCpkaXJlY3Rpb24qID09IC0xIG1lYW5zIHRvIGRvIGEgcHJlZml4IG1hdGNoLCAqZGlyZWN0aW9uKiA9PSAxIGEgc3VmZml4IG1hdGNoKSwKICAgIDAgb3RoZXJ3aXNlLiBSZXR1cm4gYGAtMWBgIGlmIGFuIGVycm9yIG9jY3VycmVkLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjdHlwZTpgaW50YCB0eXBlIGZvciAqc3RhcnQqIGFuZCAqZW5kKi4gVGhpcworICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjOnR5cGU6YGludGAgdHlwZSBmb3IgKnN0YXJ0KiBhbmQgKmVuZCouIFRoaXMKICAgICAgIG1pZ2h0IHJlcXVpcmUgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yIHByb3Blcmx5IHN1cHBvcnRpbmcgNjQtYml0CiAgICAgICBzeXN0ZW1zLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5X3NzaXplX3QgUHlVbmljb2RlX0ZpbmQoUHlPYmplY3QgKnN0ciwgUHlPYmplY3QgKnN1YnN0ciwgUHlfc3NpemVfdCBzdGFydCwgUHlfc3NpemVfdCBlbmQsIGludCBkaXJlY3Rpb24pCisuLiBjOmZ1bmN0aW9uOjogUHlfc3NpemVfdCBQeVVuaWNvZGVfRmluZChQeU9iamVjdCAqc3RyLCBQeU9iamVjdCAqc3Vic3RyLCBQeV9zc2l6ZV90IHN0YXJ0LCBQeV9zc2l6ZV90IGVuZCwgaW50IGRpcmVjdGlvbikKIAogICAgUmV0dXJuIHRoZSBmaXJzdCBwb3NpdGlvbiBvZiAqc3Vic3RyKiBpbiBgYHN0cltzdGFydDplbmRdYGAgdXNpbmcgdGhlIGdpdmVuCiAgICAqZGlyZWN0aW9uKiAoKmRpcmVjdGlvbiogPT0gMSBtZWFucyB0byBkbyBhIGZvcndhcmQgc2VhcmNoLCAqZGlyZWN0aW9uKiA9PSAtMSBhCkBAIC0xMDQ5LDQwICsxMDU2LDQwIEBACiAgICBvY2N1cnJlZCBhbmQgYW4gZXhjZXB0aW9uIGhhcyBiZWVuIHNldC4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKLSAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Y3R5cGU6YGludGAgdHlwZSBmb3IgKnN0YXJ0KiBhbmQgKmVuZCouIFRoaXMKKyAgICAgIFRoaXMgZnVuY3Rpb24gdXNlZCBhbiA6Yzp0eXBlOmBpbnRgIHR5cGUgZm9yICpzdGFydCogYW5kICplbmQqLiBUaGlzCiAgICAgICBtaWdodCByZXF1aXJlIGNoYW5nZXMgaW4geW91ciBjb2RlIGZvciBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdAogICAgICAgc3lzdGVtcy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeV9zc2l6ZV90IFB5VW5pY29kZV9Db3VudChQeU9iamVjdCAqc3RyLCBQeU9iamVjdCAqc3Vic3RyLCBQeV9zc2l6ZV90IHN0YXJ0LCBQeV9zc2l6ZV90IGVuZCkKKy4uIGM6ZnVuY3Rpb246OiBQeV9zc2l6ZV90IFB5VW5pY29kZV9Db3VudChQeU9iamVjdCAqc3RyLCBQeU9iamVjdCAqc3Vic3RyLCBQeV9zc2l6ZV90IHN0YXJ0LCBQeV9zc2l6ZV90IGVuZCkKIAogICAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2VzIG9mICpzdWJzdHIqIGluCiAgICBgYHN0cltzdGFydDplbmRdYGAuICBSZXR1cm4gYGAtMWBgIGlmIGFuIGVycm9yIG9jY3VycmVkLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5lZCBhbiA6Y3R5cGU6YGludGAgdHlwZSBhbmQgdXNlZCBhbiA6Y3R5cGU6YGludGAKKyAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJuZWQgYW4gOmM6dHlwZTpgaW50YCB0eXBlIGFuZCB1c2VkIGFuIDpjOnR5cGU6YGludGAKICAgICAgIHR5cGUgZm9yICpzdGFydCogYW5kICplbmQqLiBUaGlzIG1pZ2h0IHJlcXVpcmUgY2hhbmdlcyBpbiB5b3VyIGNvZGUgZm9yCiAgICAgICBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVVuaWNvZGVfUmVwbGFjZShQeU9iamVjdCAqc3RyLCBQeU9iamVjdCAqc3Vic3RyLCBQeU9iamVjdCAqcmVwbHN0ciwgUHlfc3NpemVfdCBtYXhjb3VudCkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX1JlcGxhY2UoUHlPYmplY3QgKnN0ciwgUHlPYmplY3QgKnN1YnN0ciwgUHlPYmplY3QgKnJlcGxzdHIsIFB5X3NzaXplX3QgbWF4Y291bnQpCiAKICAgIFJlcGxhY2UgYXQgbW9zdCAqbWF4Y291bnQqIG9jY3VycmVuY2VzIG9mICpzdWJzdHIqIGluICpzdHIqIHdpdGggKnJlcGxzdHIqIGFuZAogICAgcmV0dXJuIHRoZSByZXN1bHRpbmcgVW5pY29kZSBvYmplY3QuICptYXhjb3VudCogPT0gLTEgbWVhbnMgcmVwbGFjZSBhbGwKICAgIG9jY3VycmVuY2VzLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhpcyBmdW5jdGlvbiB1c2VkIGFuIDpjdHlwZTpgaW50YCB0eXBlIGZvciAqbWF4Y291bnQqLiBUaGlzIG1pZ2h0CisgICAgICBUaGlzIGZ1bmN0aW9uIHVzZWQgYW4gOmM6dHlwZTpgaW50YCB0eXBlIGZvciAqbWF4Y291bnQqLiBUaGlzIG1pZ2h0CiAgICAgICByZXF1aXJlIGNoYW5nZXMgaW4geW91ciBjb2RlIGZvciBwcm9wZXJseSBzdXBwb3J0aW5nIDY0LWJpdCBzeXN0ZW1zLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeVVuaWNvZGVfQ29tcGFyZShQeU9iamVjdCAqbGVmdCwgUHlPYmplY3QgKnJpZ2h0KQorLi4gYzpmdW5jdGlvbjo6IGludCBQeVVuaWNvZGVfQ29tcGFyZShQeU9iamVjdCAqbGVmdCwgUHlPYmplY3QgKnJpZ2h0KQogCiAgICBDb21wYXJlIHR3byBzdHJpbmdzIGFuZCByZXR1cm4gLTEsIDAsIDEgZm9yIGxlc3MgdGhhbiwgZXF1YWwsIGFuZCBncmVhdGVyIHRoYW4sCiAgICByZXNwZWN0aXZlbHkuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5VW5pY29kZV9SaWNoQ29tcGFyZShQeU9iamVjdCAqbGVmdCwgIFB5T2JqZWN0ICpyaWdodCwgIGludCBvcCkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlVbmljb2RlX1JpY2hDb21wYXJlKFB5T2JqZWN0ICpsZWZ0LCAgUHlPYmplY3QgKnJpZ2h0LCAgaW50IG9wKQogCiAgICBSaWNoIGNvbXBhcmUgdHdvIHVuaWNvZGUgc3RyaW5ncyBhbmQgcmV0dXJuIG9uZSBvZiB0aGUgZm9sbG93aW5nOgogCkBAIC0xMDk4LDEzICsxMTA1LDEzIEBACiAgICA6Y29uc3Q6YFB5X05FYCwgOmNvbnN0OmBQeV9MVGAsIGFuZCA6Y29uc3Q6YFB5X0xFYC4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0Zvcm1hdChQeU9iamVjdCAqZm9ybWF0LCBQeU9iamVjdCAqYXJncykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0Zvcm1hdChQeU9iamVjdCAqZm9ybWF0LCBQeU9iamVjdCAqYXJncykKIAogICAgUmV0dXJuIGEgbmV3IHN0cmluZyBvYmplY3QgZnJvbSAqZm9ybWF0KiBhbmQgKmFyZ3MqOyB0aGlzIGlzIGFuYWxvZ291cyB0bwotICAgYGBmb3JtYXQgJSBhcmdzYGAuICBUaGUgKmFyZ3MqIGFyZ3VtZW50IG11c3QgYmUgYSB0dXBsZS4KKyAgIGBgZm9ybWF0ICUgYXJnc2BgLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeVVuaWNvZGVfQ29udGFpbnMoUHlPYmplY3QgKmNvbnRhaW5lciwgUHlPYmplY3QgKmVsZW1lbnQpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5VW5pY29kZV9Db250YWlucyhQeU9iamVjdCAqY29udGFpbmVyLCBQeU9iamVjdCAqZWxlbWVudCkKIAogICAgQ2hlY2sgd2hldGhlciAqZWxlbWVudCogaXMgY29udGFpbmVkIGluICpjb250YWluZXIqIGFuZCByZXR1cm4gdHJ1ZSBvciBmYWxzZQogICAgYWNjb3JkaW5nbHkuCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvdmVyeWhpZ2gucnN0IGIvRG9jL2MtYXBpL3ZlcnloaWdoLnJzdAppbmRleCAxODhmYWM4Li42MTA3NjY1IDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvdmVyeWhpZ2gucnN0CisrKyBiL0RvYy9jLWFwaS92ZXJ5aGlnaC5yc3QKQEAgLTE2LDIwICsxNiwyMCBAQAogOmNvbnN0OmBQeV9maWxlX2lucHV0YCwgYW5kIDpjb25zdDpgUHlfc2luZ2xlX2lucHV0YC4gIFRoZXNlIGFyZSBkZXNjcmliZWQKIGZvbGxvd2luZyB0aGUgZnVuY3Rpb25zIHdoaWNoIGFjY2VwdCB0aGVtIGFzIHBhcmFtZXRlcnMuCiAKLU5vdGUgYWxzbyB0aGF0IHNldmVyYWwgb2YgdGhlc2UgZnVuY3Rpb25zIHRha2UgOmN0eXBlOmBGSUxFXCpgIHBhcmFtZXRlcnMuICBPbmUKLXBhcnRpY3VsYXIgaXNzdWUgd2hpY2ggbmVlZHMgdG8gYmUgaGFuZGxlZCBjYXJlZnVsbHkgaXMgdGhhdCB0aGUgOmN0eXBlOmBGSUxFYAorTm90ZSBhbHNvIHRoYXQgc2V2ZXJhbCBvZiB0aGVzZSBmdW5jdGlvbnMgdGFrZSA6Yzp0eXBlOmBGSUxFXCpgIHBhcmFtZXRlcnMuICBPbmUKK3BhcnRpY3VsYXIgaXNzdWUgd2hpY2ggbmVlZHMgdG8gYmUgaGFuZGxlZCBjYXJlZnVsbHkgaXMgdGhhdCB0aGUgOmM6dHlwZTpgRklMRWAKIHN0cnVjdHVyZSBmb3IgZGlmZmVyZW50IEMgbGlicmFyaWVzIGNhbiBiZSBkaWZmZXJlbnQgYW5kIGluY29tcGF0aWJsZS4gIFVuZGVyCiBXaW5kb3dzIChhdCBsZWFzdCksIGl0IGlzIHBvc3NpYmxlIGZvciBkeW5hbWljYWxseSBsaW5rZWQgZXh0ZW5zaW9ucyB0byBhY3R1YWxseQotdXNlIGRpZmZlcmVudCBsaWJyYXJpZXMsIHNvIGNhcmUgc2hvdWxkIGJlIHRha2VuIHRoYXQgOmN0eXBlOmBGSUxFXCpgIHBhcmFtZXRlcnMKK3VzZSBkaWZmZXJlbnQgbGlicmFyaWVzLCBzbyBjYXJlIHNob3VsZCBiZSB0YWtlbiB0aGF0IDpjOnR5cGU6YEZJTEVcKmAgcGFyYW1ldGVycwogYXJlIG9ubHkgcGFzc2VkIHRvIHRoZXNlIGZ1bmN0aW9ucyBpZiBpdCBpcyBjZXJ0YWluIHRoYXQgdGhleSB3ZXJlIGNyZWF0ZWQgYnkKIHRoZSBzYW1lIGxpYnJhcnkgdGhhdCB0aGUgUHl0aG9uIHJ1bnRpbWUgaXMgdXNpbmcuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5X01haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorLi4gYzpmdW5jdGlvbjo6IGludCBQeV9NYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIAogICAgVGhlIG1haW4gcHJvZ3JhbSBmb3IgdGhlIHN0YW5kYXJkIGludGVycHJldGVyLiAgVGhpcyBpcyBtYWRlIGF2YWlsYWJsZSBmb3IKICAgIHByb2dyYW1zIHdoaWNoIGVtYmVkIFB5dGhvbi4gIFRoZSAqYXJnYyogYW5kICphcmd2KiBwYXJhbWV0ZXJzIHNob3VsZCBiZQotICAgcHJlcGFyZWQgZXhhY3RseSBhcyB0aG9zZSB3aGljaCBhcmUgcGFzc2VkIHRvIGEgQyBwcm9ncmFtJ3MgOmNmdW5jOmBtYWluYAorICAgcHJlcGFyZWQgZXhhY3RseSBhcyB0aG9zZSB3aGljaCBhcmUgcGFzc2VkIHRvIGEgQyBwcm9ncmFtJ3MgOmM6ZnVuYzpgbWFpbmAKICAgIGZ1bmN0aW9uLiAgSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgYXJndW1lbnQgbGlzdCBtYXkgYmUgbW9kaWZpZWQgKGJ1dAogICAgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmdzIHBvaW50ZWQgdG8gYnkgdGhlIGFyZ3VtZW50IGxpc3QgYXJlIG5vdCkuIFRoZSByZXR1cm4KICAgIHZhbHVlIHdpbGwgYmUgYGAwYGAgaWYgdGhlIGludGVycHJldGVyIGV4aXRzIG5vcm1hbGx5IChpZSwgd2l0aG91dCBhbgpAQCAtNDEsNDAgKzQxLDQwIEBACiAgICBgYFB5X0luc3BlY3RGbGFnYGAgaXMgbm90IHNldC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlSdW5fQW55RmlsZShGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5UnVuX0FueUZpbGUoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQogCi0gICBUaGlzIGlzIGEgc2ltcGxpZmllZCBpbnRlcmZhY2UgdG8gOmNmdW5jOmBQeVJ1bl9BbnlGaWxlRXhGbGFnc2AgYmVsb3csIGxlYXZpbmcKKyAgIFRoaXMgaXMgYSBzaW1wbGlmaWVkIGludGVyZmFjZSB0byA6YzpmdW5jOmBQeVJ1bl9BbnlGaWxlRXhGbGFnc2AgYmVsb3csIGxlYXZpbmcKICAgICpjbG9zZWl0KiBzZXQgdG8gYGAwYGAgYW5kICpmbGFncyogc2V0IHRvICpOVUxMKi4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlSdW5fQW55RmlsZUZsYWdzKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgUHlDb21waWxlckZsYWdzICpmbGFncykKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlSdW5fQW55RmlsZUZsYWdzKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgUHlDb21waWxlckZsYWdzICpmbGFncykKIAotICAgVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW50ZXJmYWNlIHRvIDpjZnVuYzpgUHlSdW5fQW55RmlsZUV4RmxhZ3NgIGJlbG93LCBsZWF2aW5nCisgICBUaGlzIGlzIGEgc2ltcGxpZmllZCBpbnRlcmZhY2UgdG8gOmM6ZnVuYzpgUHlSdW5fQW55RmlsZUV4RmxhZ3NgIGJlbG93LCBsZWF2aW5nCiAgICB0aGUgKmNsb3NlaXQqIGFyZ3VtZW50IHNldCB0byBgYDBgYC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlSdW5fQW55RmlsZUV4KEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGNsb3NlaXQpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5UnVuX0FueUZpbGVFeChGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBjbG9zZWl0KQogCi0gICBUaGlzIGlzIGEgc2ltcGxpZmllZCBpbnRlcmZhY2UgdG8gOmNmdW5jOmBQeVJ1bl9BbnlGaWxlRXhGbGFnc2AgYmVsb3csIGxlYXZpbmcKKyAgIFRoaXMgaXMgYSBzaW1wbGlmaWVkIGludGVyZmFjZSB0byA6YzpmdW5jOmBQeVJ1bl9BbnlGaWxlRXhGbGFnc2AgYmVsb3csIGxlYXZpbmcKICAgIHRoZSAqZmxhZ3MqIGFyZ3VtZW50IHNldCB0byAqTlVMTCouCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5UnVuX0FueUZpbGVFeEZsYWdzKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGNsb3NlaXQsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5UnVuX0FueUZpbGVFeEZsYWdzKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGNsb3NlaXQsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCiAKICAgIElmICpmcCogcmVmZXJzIHRvIGEgZmlsZSBhc3NvY2lhdGVkIHdpdGggYW4gaW50ZXJhY3RpdmUgZGV2aWNlIChjb25zb2xlIG9yCiAgICB0ZXJtaW5hbCBpbnB1dCBvciBVbml4IHBzZXVkby10ZXJtaW5hbCksIHJldHVybiB0aGUgdmFsdWUgb2YKLSAgIDpjZnVuYzpgUHlSdW5fSW50ZXJhY3RpdmVMb29wYCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgcmVzdWx0IG9mCi0gICA6Y2Z1bmM6YFB5UnVuX1NpbXBsZUZpbGVgLiAgSWYgKmZpbGVuYW1lKiBpcyAqTlVMTCosIHRoaXMgZnVuY3Rpb24gdXNlcworICAgOmM6ZnVuYzpgUHlSdW5fSW50ZXJhY3RpdmVMb29wYCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgcmVzdWx0IG9mCisgICA6YzpmdW5jOmBQeVJ1bl9TaW1wbGVGaWxlYC4gIElmICpmaWxlbmFtZSogaXMgKk5VTEwqLCB0aGlzIGZ1bmN0aW9uIHVzZXMKICAgIGBgIj8/PyJgYCBhcyB0aGUgZmlsZW5hbWUuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5UnVuX1NpbXBsZVN0cmluZyhjb25zdCBjaGFyICpjb21tYW5kKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeVJ1bl9TaW1wbGVTdHJpbmcoY29uc3QgY2hhciAqY29tbWFuZCkKIAotICAgVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW50ZXJmYWNlIHRvIDpjZnVuYzpgUHlSdW5fU2ltcGxlU3RyaW5nRmxhZ3NgIGJlbG93LAorICAgVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW50ZXJmYWNlIHRvIDpjOmZ1bmM6YFB5UnVuX1NpbXBsZVN0cmluZ0ZsYWdzYCBiZWxvdywKICAgIGxlYXZpbmcgdGhlICpQeUNvbXBpbGVyRmxhZ3NcKiogYXJndW1lbnQgc2V0IHRvIE5VTEwuCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5UnVuX1NpbXBsZVN0cmluZ0ZsYWdzKGNvbnN0IGNoYXIgKmNvbW1hbmQsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5UnVuX1NpbXBsZVN0cmluZ0ZsYWdzKGNvbnN0IGNoYXIgKmNvbW1hbmQsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCiAKICAgIEV4ZWN1dGVzIHRoZSBQeXRob24gc291cmNlIGNvZGUgZnJvbSAqY29tbWFuZCogaW4gdGhlIDptb2Q6YF9fbWFpbl9fYCBtb2R1bGUKICAgIGFjY29yZGluZyB0byB0aGUgKmZsYWdzKiBhcmd1bWVudC4gSWYgOm1vZDpgX19tYWluX19gIGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIGl0CkBAIC04NywzOSArODcsMzkgQEAKICAgIGBgUHlfSW5zcGVjdEZsYWdgYCBpcyBub3Qgc2V0LgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeVJ1bl9TaW1wbGVGaWxlKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlSdW5fU2ltcGxlRmlsZShGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCiAKLSAgIFRoaXMgaXMgYSBzaW1wbGlmaWVkIGludGVyZmFjZSB0byA6Y2Z1bmM6YFB5UnVuX1NpbXBsZUZpbGVFeEZsYWdzYCBiZWxvdywKKyAgIFRoaXMgaXMgYSBzaW1wbGlmaWVkIGludGVyZmFjZSB0byA6YzpmdW5jOmBQeVJ1bl9TaW1wbGVGaWxlRXhGbGFnc2AgYmVsb3csCiAgICBsZWF2aW5nICpjbG9zZWl0KiBzZXQgdG8gYGAwYGAgYW5kICpmbGFncyogc2V0IHRvICpOVUxMKi4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlSdW5fU2ltcGxlRmlsZUZsYWdzKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgUHlDb21waWxlckZsYWdzICpmbGFncykKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlSdW5fU2ltcGxlRmlsZUZsYWdzKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgUHlDb21waWxlckZsYWdzICpmbGFncykKIAotICAgVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW50ZXJmYWNlIHRvIDpjZnVuYzpgUHlSdW5fU2ltcGxlRmlsZUV4RmxhZ3NgIGJlbG93LAorICAgVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW50ZXJmYWNlIHRvIDpjOmZ1bmM6YFB5UnVuX1NpbXBsZUZpbGVFeEZsYWdzYCBiZWxvdywKICAgIGxlYXZpbmcgKmNsb3NlaXQqIHNldCB0byBgYDBgYC4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlSdW5fU2ltcGxlRmlsZUV4KEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGNsb3NlaXQpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5UnVuX1NpbXBsZUZpbGVFeChGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBjbG9zZWl0KQogCi0gICBUaGlzIGlzIGEgc2ltcGxpZmllZCBpbnRlcmZhY2UgdG8gOmNmdW5jOmBQeVJ1bl9TaW1wbGVGaWxlRXhGbGFnc2AgYmVsb3csCisgICBUaGlzIGlzIGEgc2ltcGxpZmllZCBpbnRlcmZhY2UgdG8gOmM6ZnVuYzpgUHlSdW5fU2ltcGxlRmlsZUV4RmxhZ3NgIGJlbG93LAogICAgbGVhdmluZyAqZmxhZ3MqIHNldCB0byAqTlVMTCouCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5UnVuX1NpbXBsZUZpbGVFeEZsYWdzKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGNsb3NlaXQsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5UnVuX1NpbXBsZUZpbGVFeEZsYWdzKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGNsb3NlaXQsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCiAKLSAgIFNpbWlsYXIgdG8gOmNmdW5jOmBQeVJ1bl9TaW1wbGVTdHJpbmdGbGFnc2AsIGJ1dCB0aGUgUHl0aG9uIHNvdXJjZSBjb2RlIGlzIHJlYWQKKyAgIFNpbWlsYXIgdG8gOmM6ZnVuYzpgUHlSdW5fU2ltcGxlU3RyaW5nRmxhZ3NgLCBidXQgdGhlIFB5dGhvbiBzb3VyY2UgY29kZSBpcyByZWFkCiAgICBmcm9tICpmcCogaW5zdGVhZCBvZiBhbiBpbi1tZW1vcnkgc3RyaW5nLiAqZmlsZW5hbWUqIHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUKICAgIGZpbGUuICBJZiAqY2xvc2VpdCogaXMgdHJ1ZSwgdGhlIGZpbGUgaXMgY2xvc2VkIGJlZm9yZSBQeVJ1bl9TaW1wbGVGaWxlRXhGbGFncwogICAgcmV0dXJucy4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlSdW5fSW50ZXJhY3RpdmVPbmUoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeVJ1bl9JbnRlcmFjdGl2ZU9uZShGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCiAKLSAgIFRoaXMgaXMgYSBzaW1wbGlmaWVkIGludGVyZmFjZSB0byA6Y2Z1bmM6YFB5UnVuX0ludGVyYWN0aXZlT25lRmxhZ3NgIGJlbG93LAorICAgVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW50ZXJmYWNlIHRvIDpjOmZ1bmM6YFB5UnVuX0ludGVyYWN0aXZlT25lRmxhZ3NgIGJlbG93LAogICAgbGVhdmluZyAqZmxhZ3MqIHNldCB0byAqTlVMTCouCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5UnVuX0ludGVyYWN0aXZlT25lRmxhZ3MoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeVJ1bl9JbnRlcmFjdGl2ZU9uZUZsYWdzKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgUHlDb21waWxlckZsYWdzICpmbGFncykKIAogICAgUmVhZCBhbmQgZXhlY3V0ZSBhIHNpbmdsZSBzdGF0ZW1lbnQgZnJvbSBhIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGFuCiAgICBpbnRlcmFjdGl2ZSBkZXZpY2UgYWNjb3JkaW5nIHRvIHRoZSAqZmxhZ3MqIGFyZ3VtZW50LiAgVGhlIHVzZXIgd2lsbCBiZQpAQCAtMTMwLDM0ICsxMzAsMzQgQEAKICAgIDpmaWxlOmBQeXRob24uaGAsIHNvIG11c3QgYmUgaW5jbHVkZWQgc3BlY2lmaWNhbGx5IGlmIG5lZWRlZC4pCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5UnVuX0ludGVyYWN0aXZlTG9vcChGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5UnVuX0ludGVyYWN0aXZlTG9vcChGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCiAKLSAgIFRoaXMgaXMgYSBzaW1wbGlmaWVkIGludGVyZmFjZSB0byA6Y2Z1bmM6YFB5UnVuX0ludGVyYWN0aXZlTG9vcEZsYWdzYCBiZWxvdywKKyAgIFRoaXMgaXMgYSBzaW1wbGlmaWVkIGludGVyZmFjZSB0byA6YzpmdW5jOmBQeVJ1bl9JbnRlcmFjdGl2ZUxvb3BGbGFnc2AgYmVsb3csCiAgICBsZWF2aW5nICpmbGFncyogc2V0IHRvICpOVUxMKi4KIAogCi0uLiBjZnVuY3Rpb246OiBpbnQgUHlSdW5fSW50ZXJhY3RpdmVMb29wRmxhZ3MoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeVJ1bl9JbnRlcmFjdGl2ZUxvb3BGbGFncyhGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCiAKICAgIFJlYWQgYW5kIGV4ZWN1dGUgc3RhdGVtZW50cyBmcm9tIGEgZmlsZSBhc3NvY2lhdGVkIHdpdGggYW4gaW50ZXJhY3RpdmUgZGV2aWNlCiAgICB1bnRpbCBFT0YgaXMgcmVhY2hlZC4gIFRoZSB1c2VyIHdpbGwgYmUgcHJvbXB0ZWQgdXNpbmcgYGBzeXMucHMxYGAgYW5kCiAgICBgYHN5cy5wczJgYC4gIFJldHVybnMgYGAwYGAgYXQgRU9GLgogCiAKLS4uIGNmdW5jdGlvbjo6IHN0cnVjdCBfbm9kZSogUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmcoY29uc3QgY2hhciAqc3RyLCBpbnQgc3RhcnQpCisuLiBjOmZ1bmN0aW9uOjogc3RydWN0IF9ub2RlKiBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZyhjb25zdCBjaGFyICpzdHIsIGludCBzdGFydCkKIAogICAgVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW50ZXJmYWNlIHRvCi0gICA6Y2Z1bmM6YFB5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nRmxhZ3NGaWxlbmFtZWAgYmVsb3csIGxlYXZpbmcgICpmaWxlbmFtZSogc2V0CisgICA6YzpmdW5jOmBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZ0ZsYWdzRmlsZW5hbWVgIGJlbG93LCBsZWF2aW5nICAqZmlsZW5hbWUqIHNldAogICAgdG8gKk5VTEwqIGFuZCAqZmxhZ3MqIHNldCB0byBgYDBgYC4KIAogCi0uLiBjZnVuY3Rpb246OiBzdHJ1Y3QgX25vZGUqIFB5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nRmxhZ3MoIGNvbnN0IGNoYXIgKnN0ciwgaW50IHN0YXJ0LCBpbnQgZmxhZ3MpCisuLiBjOmZ1bmN0aW9uOjogc3RydWN0IF9ub2RlKiBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZ0ZsYWdzKCBjb25zdCBjaGFyICpzdHIsIGludCBzdGFydCwgaW50IGZsYWdzKQogCiAgICBUaGlzIGlzIGEgc2ltcGxpZmllZCBpbnRlcmZhY2UgdG8KLSAgIDpjZnVuYzpgUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lYCBiZWxvdywgbGVhdmluZyAgKmZpbGVuYW1lKiBzZXQKKyAgIDpjOmZ1bmM6YFB5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nRmxhZ3NGaWxlbmFtZWAgYmVsb3csIGxlYXZpbmcgICpmaWxlbmFtZSogc2V0CiAgICB0byAqTlVMTCouCiAKIAotLi4gY2Z1bmN0aW9uOjogc3RydWN0IF9ub2RlKiBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZ0ZsYWdzRmlsZW5hbWUoIGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBzdGFydCwgaW50IGZsYWdzKQorLi4gYzpmdW5jdGlvbjo6IHN0cnVjdCBfbm9kZSogUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lKCBjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgc3RhcnQsIGludCBmbGFncykKIAogICAgUGFyc2UgUHl0aG9uIHNvdXJjZSBjb2RlIGZyb20gKnN0ciogdXNpbmcgdGhlIHN0YXJ0IHRva2VuICpzdGFydCogYWNjb3JkaW5nIHRvCiAgICB0aGUgKmZsYWdzKiBhcmd1bWVudC4gIFRoZSByZXN1bHQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgY29kZSBvYmplY3Qgd2hpY2ggY2FuCkBAIC0xNjUsMjUgKzE2NSwyNSBAQAogICAgbWFueSB0aW1lcy4KIAogCi0uLiBjZnVuY3Rpb246OiBzdHJ1Y3QgX25vZGUqIFB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZShGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBzdGFydCkKKy4uIGM6ZnVuY3Rpb246OiBzdHJ1Y3QgX25vZGUqIFB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZShGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBzdGFydCkKIAotICAgVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW50ZXJmYWNlIHRvIDpjZnVuYzpgUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlRmxhZ3NgIGJlbG93LAorICAgVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW50ZXJmYWNlIHRvIDpjOmZ1bmM6YFB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZUZsYWdzYCBiZWxvdywKICAgIGxlYXZpbmcgKmZsYWdzKiBzZXQgdG8gYGAwYGAKIAogCi0uLiBjZnVuY3Rpb246OiBzdHJ1Y3QgX25vZGUqIFB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZUZsYWdzKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IHN0YXJ0LCBpbnQgZmxhZ3MpCisuLiBjOmZ1bmN0aW9uOjogc3RydWN0IF9ub2RlKiBQeVBhcnNlcl9TaW1wbGVQYXJzZUZpbGVGbGFncyhGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBzdGFydCwgaW50IGZsYWdzKQogCi0gICBTaW1pbGFyIHRvIDpjZnVuYzpgUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lYCwgYnV0IHRoZSBQeXRob24KKyAgIFNpbWlsYXIgdG8gOmM6ZnVuYzpgUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lYCwgYnV0IHRoZSBQeXRob24KICAgIHNvdXJjZSBjb2RlIGlzIHJlYWQgZnJvbSAqZnAqIGluc3RlYWQgb2YgYW4gaW4tbWVtb3J5IHN0cmluZy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlSdW5fU3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgaW50IHN0YXJ0LCBQeU9iamVjdCAqZ2xvYmFscywgUHlPYmplY3QgKmxvY2FscykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlSdW5fU3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgaW50IHN0YXJ0LCBQeU9iamVjdCAqZ2xvYmFscywgUHlPYmplY3QgKmxvY2FscykKIAotICAgVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW50ZXJmYWNlIHRvIDpjZnVuYzpgUHlSdW5fU3RyaW5nRmxhZ3NgIGJlbG93LCBsZWF2aW5nCisgICBUaGlzIGlzIGEgc2ltcGxpZmllZCBpbnRlcmZhY2UgdG8gOmM6ZnVuYzpgUHlSdW5fU3RyaW5nRmxhZ3NgIGJlbG93LCBsZWF2aW5nCiAgICAqZmxhZ3MqIHNldCB0byAqTlVMTCouCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5UnVuX1N0cmluZ0ZsYWdzKGNvbnN0IGNoYXIgKnN0ciwgaW50IHN0YXJ0LCBQeU9iamVjdCAqZ2xvYmFscywgUHlPYmplY3QgKmxvY2FscywgUHlDb21waWxlckZsYWdzICpmbGFncykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlSdW5fU3RyaW5nRmxhZ3MoY29uc3QgY2hhciAqc3RyLCBpbnQgc3RhcnQsIFB5T2JqZWN0ICpnbG9iYWxzLCBQeU9iamVjdCAqbG9jYWxzLCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQogCiAgICBFeGVjdXRlIFB5dGhvbiBzb3VyY2UgY29kZSBmcm9tICpzdHIqIGluIHRoZSBjb250ZXh0IHNwZWNpZmllZCBieSB0aGUKICAgIGRpY3Rpb25hcmllcyAqZ2xvYmFscyogYW5kICpsb2NhbHMqIHdpdGggdGhlIGNvbXBpbGVyIGZsYWdzIHNwZWNpZmllZCBieQpAQCAtMTk0LDM5ICsxOTQsMzkgQEAKICAgIGV4Y2VwdGlvbiB3YXMgcmFpc2VkLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVJ1bl9GaWxlKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IHN0YXJ0LCBQeU9iamVjdCAqZ2xvYmFscywgUHlPYmplY3QgKmxvY2FscykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlSdW5fRmlsZShGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBzdGFydCwgUHlPYmplY3QgKmdsb2JhbHMsIFB5T2JqZWN0ICpsb2NhbHMpCiAKLSAgIFRoaXMgaXMgYSBzaW1wbGlmaWVkIGludGVyZmFjZSB0byA6Y2Z1bmM6YFB5UnVuX0ZpbGVFeEZsYWdzYCBiZWxvdywgbGVhdmluZworICAgVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW50ZXJmYWNlIHRvIDpjOmZ1bmM6YFB5UnVuX0ZpbGVFeEZsYWdzYCBiZWxvdywgbGVhdmluZwogICAgKmNsb3NlaXQqIHNldCB0byBgYDBgYCBhbmQgKmZsYWdzKiBzZXQgdG8gKk5VTEwqLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVJ1bl9GaWxlRXgoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgc3RhcnQsIFB5T2JqZWN0ICpnbG9iYWxzLCBQeU9iamVjdCAqbG9jYWxzLCBpbnQgY2xvc2VpdCkKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlSdW5fRmlsZUV4KEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IHN0YXJ0LCBQeU9iamVjdCAqZ2xvYmFscywgUHlPYmplY3QgKmxvY2FscywgaW50IGNsb3NlaXQpCiAKLSAgIFRoaXMgaXMgYSBzaW1wbGlmaWVkIGludGVyZmFjZSB0byA6Y2Z1bmM6YFB5UnVuX0ZpbGVFeEZsYWdzYCBiZWxvdywgbGVhdmluZworICAgVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW50ZXJmYWNlIHRvIDpjOmZ1bmM6YFB5UnVuX0ZpbGVFeEZsYWdzYCBiZWxvdywgbGVhdmluZwogICAgKmZsYWdzKiBzZXQgdG8gKk5VTEwqLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVJ1bl9GaWxlRmxhZ3MoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgc3RhcnQsIFB5T2JqZWN0ICpnbG9iYWxzLCBQeU9iamVjdCAqbG9jYWxzLCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVJ1bl9GaWxlRmxhZ3MoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgc3RhcnQsIFB5T2JqZWN0ICpnbG9iYWxzLCBQeU9iamVjdCAqbG9jYWxzLCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQogCi0gICBUaGlzIGlzIGEgc2ltcGxpZmllZCBpbnRlcmZhY2UgdG8gOmNmdW5jOmBQeVJ1bl9GaWxlRXhGbGFnc2AgYmVsb3csIGxlYXZpbmcKKyAgIFRoaXMgaXMgYSBzaW1wbGlmaWVkIGludGVyZmFjZSB0byA6YzpmdW5jOmBQeVJ1bl9GaWxlRXhGbGFnc2AgYmVsb3csIGxlYXZpbmcKICAgICpjbG9zZWl0KiBzZXQgdG8gYGAwYGAuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5UnVuX0ZpbGVFeEZsYWdzKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IHN0YXJ0LCBQeU9iamVjdCAqZ2xvYmFscywgUHlPYmplY3QgKmxvY2FscywgaW50IGNsb3NlaXQsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5UnVuX0ZpbGVFeEZsYWdzKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IHN0YXJ0LCBQeU9iamVjdCAqZ2xvYmFscywgUHlPYmplY3QgKmxvY2FscywgaW50IGNsb3NlaXQsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCiAKLSAgIFNpbWlsYXIgdG8gOmNmdW5jOmBQeVJ1bl9TdHJpbmdGbGFnc2AsIGJ1dCB0aGUgUHl0aG9uIHNvdXJjZSBjb2RlIGlzIHJlYWQgZnJvbQorICAgU2ltaWxhciB0byA6YzpmdW5jOmBQeVJ1bl9TdHJpbmdGbGFnc2AsIGJ1dCB0aGUgUHl0aG9uIHNvdXJjZSBjb2RlIGlzIHJlYWQgZnJvbQogICAgKmZwKiBpbnN0ZWFkIG9mIGFuIGluLW1lbW9yeSBzdHJpbmcuICpmaWxlbmFtZSogc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgotICAgSWYgKmNsb3NlaXQqIGlzIHRydWUsIHRoZSBmaWxlIGlzIGNsb3NlZCBiZWZvcmUgOmNmdW5jOmBQeVJ1bl9GaWxlRXhGbGFnc2AKKyAgIElmICpjbG9zZWl0KiBpcyB0cnVlLCB0aGUgZmlsZSBpcyBjbG9zZWQgYmVmb3JlIDpjOmZ1bmM6YFB5UnVuX0ZpbGVFeEZsYWdzYAogICAgcmV0dXJucy4KIAogCi0uLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlfQ29tcGlsZVN0cmluZyhjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgc3RhcnQpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5X0NvbXBpbGVTdHJpbmcoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IHN0YXJ0KQogCi0gICBUaGlzIGlzIGEgc2ltcGxpZmllZCBpbnRlcmZhY2UgdG8gOmNmdW5jOmBQeV9Db21waWxlU3RyaW5nRmxhZ3NgIGJlbG93LCBsZWF2aW5nCisgICBUaGlzIGlzIGEgc2ltcGxpZmllZCBpbnRlcmZhY2UgdG8gOmM6ZnVuYzpgUHlfQ29tcGlsZVN0cmluZ0ZsYWdzYCBiZWxvdywgbGVhdmluZwogICAgKmZsYWdzKiBzZXQgdG8gKk5VTEwqLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeV9Db21waWxlU3RyaW5nRmxhZ3MoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IHN0YXJ0LCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeV9Db21waWxlU3RyaW5nRmxhZ3MoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IHN0YXJ0LCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQogCiAgICBQYXJzZSBhbmQgY29tcGlsZSB0aGUgUHl0aG9uIHNvdXJjZSBjb2RlIGluICpzdHIqLCByZXR1cm5pbmcgdGhlIHJlc3VsdGluZyBjb2RlCiAgICBvYmplY3QuICBUaGUgc3RhcnQgdG9rZW4gaXMgZ2l2ZW4gYnkgKnN0YXJ0KjsgdGhpcyBjYW4gYmUgdXNlZCB0byBjb25zdHJhaW4gdGhlCkBAIC0yMzcsMTQgKzIzNywxNCBAQAogICAgYmUgcGFyc2VkIG9yIGNvbXBpbGVkLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUV2YWxfRXZhbENvZGUoUHlDb2RlT2JqZWN0ICpjbywgUHlPYmplY3QgKmdsb2JhbHMsIFB5T2JqZWN0ICpsb2NhbHMpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5RXZhbF9FdmFsQ29kZShQeUNvZGVPYmplY3QgKmNvLCBQeU9iamVjdCAqZ2xvYmFscywgUHlPYmplY3QgKmxvY2FscykKIAotICAgVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW50ZXJmYWNlIHRvIDpjZnVuYzpgUHlFdmFsX0V2YWxDb2RlRXhgLCB3aXRoIGp1c3QKKyAgIFRoaXMgaXMgYSBzaW1wbGlmaWVkIGludGVyZmFjZSB0byA6YzpmdW5jOmBQeUV2YWxfRXZhbENvZGVFeGAsIHdpdGgganVzdAogICAgdGhlIGNvZGUgb2JqZWN0LCBhbmQgdGhlIGRpY3Rpb25hcmllcyBvZiBnbG9iYWwgYW5kIGxvY2FsIHZhcmlhYmxlcy4KICAgIFRoZSBvdGhlciBhcmd1bWVudHMgYXJlIHNldCB0byAqTlVMTCouCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5RXZhbF9FdmFsQ29kZUV4KFB5Q29kZU9iamVjdCAqY28sIFB5T2JqZWN0ICpnbG9iYWxzLCBQeU9iamVjdCAqbG9jYWxzLCBQeU9iamVjdCAqKmFyZ3MsIGludCBhcmdjb3VudCwgUHlPYmplY3QgKiprd3MsIGludCBrd2NvdW50LCBQeU9iamVjdCAqKmRlZnMsIGludCBkZWZjb3VudCwgUHlPYmplY3QgKmNsb3N1cmUpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5RXZhbF9FdmFsQ29kZUV4KFB5Q29kZU9iamVjdCAqY28sIFB5T2JqZWN0ICpnbG9iYWxzLCBQeU9iamVjdCAqbG9jYWxzLCBQeU9iamVjdCAqKmFyZ3MsIGludCBhcmdjb3VudCwgUHlPYmplY3QgKiprd3MsIGludCBrd2NvdW50LCBQeU9iamVjdCAqKmRlZnMsIGludCBkZWZjb3VudCwgUHlPYmplY3QgKmNsb3N1cmUpCiAKICAgIEV2YWx1YXRlIGEgcHJlY29tcGlsZWQgY29kZSBvYmplY3QsIGdpdmVuIGEgcGFydGljdWxhciBlbnZpcm9ubWVudCBmb3IgaXRzCiAgICBldmFsdWF0aW9uLiAgVGhpcyBlbnZpcm9ubWVudCBjb25zaXN0cyBvZiBkaWN0aW9uYXJpZXMgb2YgZ2xvYmFsIGFuZCBsb2NhbApAQCAtMjUyLDU1ICsyNTIsNTUgQEAKICAgIGNlbGxzLgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUV2YWxfRXZhbEZyYW1lKFB5RnJhbWVPYmplY3QgKmYpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5RXZhbF9FdmFsRnJhbWUoUHlGcmFtZU9iamVjdCAqZikKIAogICAgRXZhbHVhdGUgYW4gZXhlY3V0aW9uIGZyYW1lLiAgVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW50ZXJmYWNlIHRvCiAgICBQeUV2YWxfRXZhbEZyYW1lRXgsIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUV2YWxfRXZhbEZyYW1lRXgoUHlGcmFtZU9iamVjdCAqZiwgaW50IHRocm93ZmxhZykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlFdmFsX0V2YWxGcmFtZUV4KFB5RnJhbWVPYmplY3QgKmYsIGludCB0aHJvd2ZsYWcpCiAKICAgIFRoaXMgaXMgdGhlIG1haW4sIHVudmFybmlzaGVkIGZ1bmN0aW9uIG9mIFB5dGhvbiBpbnRlcnByZXRhdGlvbi4gIEl0IGlzCiAgICBsaXRlcmFsbHkgMjAwMCBsaW5lcyBsb25nLiAgVGhlIGNvZGUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhlY3V0aW9uCiAgICBmcmFtZSAqZiogaXMgZXhlY3V0ZWQsIGludGVycHJldGluZyBieXRlY29kZSBhbmQgZXhlY3V0aW5nIGNhbGxzIGFzIG5lZWRlZC4KICAgIFRoZSBhZGRpdGlvbmFsICp0aHJvd2ZsYWcqIHBhcmFtZXRlciBjYW4gbW9zdGx5IGJlIGlnbm9yZWQgLSBpZiB0cnVlLCB0aGVuCiAgICBpdCBjYXVzZXMgYW4gZXhjZXB0aW9uIHRvIGltbWVkaWF0ZWx5IGJlIHRocm93bjsgdGhpcyBpcyB1c2VkIGZvciB0aGUKLSAgIDptZXRoOmB0aHJvd2AgbWV0aG9kcyBvZiBnZW5lcmF0b3Igb2JqZWN0cy4KKyAgIDptZXRoOmB+Z2VuZXJhdG9yLnRocm93YCBtZXRob2RzIG9mIGdlbmVyYXRvciBvYmplY3RzLgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeUV2YWxfTWVyZ2VDb21waWxlckZsYWdzKFB5Q29tcGlsZXJGbGFncyAqY2YpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5RXZhbF9NZXJnZUNvbXBpbGVyRmxhZ3MoUHlDb21waWxlckZsYWdzICpjZikKIAogICAgVGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHRoZSBmbGFncyBvZiB0aGUgY3VycmVudCBldmFsdWF0aW9uIGZyYW1lLCBhbmQgcmV0dXJucwogICAgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLgogCiAKLS4uIGN2YXI6OiBpbnQgUHlfZXZhbF9pbnB1dAorLi4gYzp2YXI6OiBpbnQgUHlfZXZhbF9pbnB1dAogCiAgICAuLiBpbmRleDo6IHNpbmdsZTogUHlfQ29tcGlsZVN0cmluZygpCiAKICAgIFRoZSBzdGFydCBzeW1ib2wgZnJvbSB0aGUgUHl0aG9uIGdyYW1tYXIgZm9yIGlzb2xhdGVkIGV4cHJlc3Npb25zOyBmb3IgdXNlIHdpdGgKLSAgIDpjZnVuYzpgUHlfQ29tcGlsZVN0cmluZ2AuCisgICA6YzpmdW5jOmBQeV9Db21waWxlU3RyaW5nYC4KIAogCi0uLiBjdmFyOjogaW50IFB5X2ZpbGVfaW5wdXQKKy4uIGM6dmFyOjogaW50IFB5X2ZpbGVfaW5wdXQKIAogICAgLi4gaW5kZXg6OiBzaW5nbGU6IFB5X0NvbXBpbGVTdHJpbmcoKQogCiAgICBUaGUgc3RhcnQgc3ltYm9sIGZyb20gdGhlIFB5dGhvbiBncmFtbWFyIGZvciBzZXF1ZW5jZXMgb2Ygc3RhdGVtZW50cyBhcyByZWFkCi0gICBmcm9tIGEgZmlsZSBvciBvdGhlciBzb3VyY2U7IGZvciB1c2Ugd2l0aCA6Y2Z1bmM6YFB5X0NvbXBpbGVTdHJpbmdgLiAgVGhpcyBpcworICAgZnJvbSBhIGZpbGUgb3Igb3RoZXIgc291cmNlOyBmb3IgdXNlIHdpdGggOmM6ZnVuYzpgUHlfQ29tcGlsZVN0cmluZ2AuICBUaGlzIGlzCiAgICB0aGUgc3ltYm9sIHRvIHVzZSB3aGVuIGNvbXBpbGluZyBhcmJpdHJhcmlseSBsb25nIFB5dGhvbiBzb3VyY2UgY29kZS4KIAogCi0uLiBjdmFyOjogaW50IFB5X3NpbmdsZV9pbnB1dAorLi4gYzp2YXI6OiBpbnQgUHlfc2luZ2xlX2lucHV0CiAKICAgIC4uIGluZGV4Ojogc2luZ2xlOiBQeV9Db21waWxlU3RyaW5nKCkKIAogICAgVGhlIHN0YXJ0IHN5bWJvbCBmcm9tIHRoZSBQeXRob24gZ3JhbW1hciBmb3IgYSBzaW5nbGUgc3RhdGVtZW50OyBmb3IgdXNlIHdpdGgKLSAgIDpjZnVuYzpgUHlfQ29tcGlsZVN0cmluZ2AuIFRoaXMgaXMgdGhlIHN5bWJvbCB1c2VkIGZvciB0aGUgaW50ZXJhY3RpdmUKKyAgIDpjOmZ1bmM6YFB5X0NvbXBpbGVTdHJpbmdgLiBUaGlzIGlzIHRoZSBzeW1ib2wgdXNlZCBmb3IgdGhlIGludGVyYWN0aXZlCiAgICBpbnRlcnByZXRlciBsb29wLgogCiAKLS4uIGN0eXBlOjogc3RydWN0IFB5Q29tcGlsZXJGbGFncworLi4gYzp0eXBlOjogc3RydWN0IFB5Q29tcGlsZXJGbGFncwogCiAgICBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGNvbXBpbGVyIGZsYWdzLiAgSW4gY2FzZXMgd2hlcmUgY29kZSBpcyBvbmx5CiAgICBiZWluZyBjb21waWxlZCwgaXQgaXMgcGFzc2VkIGFzIGBgaW50IGZsYWdzYGAsIGFuZCBpbiBjYXNlcyB3aGVyZSBjb2RlIGlzIGJlaW5nCkBAIC0zMTYsNyArMzE2LDcgQEAKICAgICAgIH0KIAogCi0uLiBjdmFyOjogaW50IENPX0ZVVFVSRV9ESVZJU0lPTgorLi4gYzp2YXI6OiBpbnQgQ09fRlVUVVJFX0RJVklTSU9OCiAKICAgIFRoaXMgYml0IGNhbiBiZSBzZXQgaW4gKmZsYWdzKiB0byBjYXVzZSBkaXZpc2lvbiBvcGVyYXRvciBgYC9gYCB0byBiZQogICAgaW50ZXJwcmV0ZWQgYXMgInRydWUgZGl2aXNpb24iIGFjY29yZGluZyB0byA6cGVwOmAyMzhgLgpkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL3dlYWtyZWYucnN0IGIvRG9jL2MtYXBpL3dlYWtyZWYucnN0CmluZGV4IDIyNmVjMzguLjI0M2NmZDEgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS93ZWFrcmVmLnJzdAorKysgYi9Eb2MvYy1hcGkvd2Vha3JlZi5yc3QKQEAgLTExLDI4ICsxMSwyOCBAQAogYXMgbXVjaCBhcyBpdCBjYW4uCiAKIAotLi4gY2Z1bmN0aW9uOjogaW50IFB5V2Vha3JlZl9DaGVjayhvYikKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlXZWFrcmVmX0NoZWNrKG9iKQogCiAgICBSZXR1cm4gdHJ1ZSBpZiAqb2IqIGlzIGVpdGhlciBhIHJlZmVyZW5jZSBvciBwcm94eSBvYmplY3QuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeVdlYWtyZWZfQ2hlY2tSZWYob2IpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5V2Vha3JlZl9DaGVja1JlZihvYikKIAogICAgUmV0dXJuIHRydWUgaWYgKm9iKiBpcyBhIHJlZmVyZW5jZSBvYmplY3QuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMgogCiAKLS4uIGNmdW5jdGlvbjo6IGludCBQeVdlYWtyZWZfQ2hlY2tQcm94eShvYikKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlXZWFrcmVmX0NoZWNrUHJveHkob2IpCiAKICAgIFJldHVybiB0cnVlIGlmICpvYiogaXMgYSBwcm94eSBvYmplY3QuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMgogCiAKLS4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVdlYWtyZWZfTmV3UmVmKFB5T2JqZWN0ICpvYiwgUHlPYmplY3QgKmNhbGxiYWNrKQorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVdlYWtyZWZfTmV3UmVmKFB5T2JqZWN0ICpvYiwgUHlPYmplY3QgKmNhbGxiYWNrKQogCiAgICBSZXR1cm4gYSB3ZWFrIHJlZmVyZW5jZSBvYmplY3QgZm9yIHRoZSBvYmplY3QgKm9iKi4gIFRoaXMgd2lsbCBhbHdheXMgcmV0dXJuCiAgICBhIG5ldyByZWZlcmVuY2UsIGJ1dCBpcyBub3QgZ3VhcmFudGVlZCB0byBjcmVhdGUgYSBuZXcgb2JqZWN0OyBhbiBleGlzdGluZwpAQCAtNDYsNyArNDYsNyBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4yCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5V2Vha3JlZl9OZXdQcm94eShQeU9iamVjdCAqb2IsIFB5T2JqZWN0ICpjYWxsYmFjaykKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlXZWFrcmVmX05ld1Byb3h5KFB5T2JqZWN0ICpvYiwgUHlPYmplY3QgKmNhbGxiYWNrKQogCiAgICBSZXR1cm4gYSB3ZWFrIHJlZmVyZW5jZSBwcm94eSBvYmplY3QgZm9yIHRoZSBvYmplY3QgKm9iKi4gIFRoaXMgd2lsbCBhbHdheXMKICAgIHJldHVybiBhIG5ldyByZWZlcmVuY2UsIGJ1dCBpcyBub3QgZ3VhcmFudGVlZCB0byBjcmVhdGUgYSBuZXcgb2JqZWN0OyBhbgpAQCAtNjAsNyArNjAsNyBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4yCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5V2Vha3JlZl9HZXRPYmplY3QoUHlPYmplY3QgKnJlZikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlXZWFrcmVmX0dldE9iamVjdChQeU9iamVjdCAqcmVmKQogCiAgICBSZXR1cm4gdGhlIHJlZmVyZW5jZWQgb2JqZWN0IGZyb20gYSB3ZWFrIHJlZmVyZW5jZSwgKnJlZiouICBJZiB0aGUgcmVmZXJlbnQgaXMKICAgIG5vIGxvbmdlciBsaXZlLCByZXR1cm5zIDpjb25zdDpgUHlfTm9uZWAuCkBAIC03MCwxNCArNzAsMTQgQEAKICAgIC4uIHdhcm5pbmc6OgogCiAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSAqKmJvcnJvd2VkIHJlZmVyZW5jZSoqIHRvIHRoZSByZWZlcmVuY2VkIG9iamVjdC4KLSAgICAgIFRoaXMgbWVhbnMgdGhhdCB5b3Ugc2hvdWxkIGFsd2F5cyBjYWxsIDpjZnVuYzpgUHlfSU5DUkVGYCBvbiB0aGUgb2JqZWN0CisgICAgICBUaGlzIG1lYW5zIHRoYXQgeW91IHNob3VsZCBhbHdheXMgY2FsbCA6YzpmdW5jOmBQeV9JTkNSRUZgIG9uIHRoZSBvYmplY3QKICAgICAgIGV4Y2VwdCBpZiB5b3Uga25vdyB0aGF0IGl0IGNhbm5vdCBiZSBkZXN0cm95ZWQgd2hpbGUgeW91IGFyZSBzdGlsbAogICAgICAgdXNpbmcgaXQuCiAKIAotLi4gY2Z1bmN0aW9uOjogUHlPYmplY3QqIFB5V2Vha3JlZl9HRVRfT0JKRUNUKFB5T2JqZWN0ICpyZWYpCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5V2Vha3JlZl9HRVRfT0JKRUNUKFB5T2JqZWN0ICpyZWYpCiAKLSAgIFNpbWlsYXIgdG8gOmNmdW5jOmBQeVdlYWtyZWZfR2V0T2JqZWN0YCwgYnV0IGltcGxlbWVudGVkIGFzIGEgbWFjcm8gdGhhdCBkb2VzIG5vCisgICBTaW1pbGFyIHRvIDpjOmZ1bmM6YFB5V2Vha3JlZl9HZXRPYmplY3RgLCBidXQgaW1wbGVtZW50ZWQgYXMgYSBtYWNybyB0aGF0IGRvZXMgbm8KICAgIGVycm9yIGNoZWNraW5nLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjIKZGlmZiAtLWdpdCBhL0RvYy9jb25mLnB5IGIvRG9jL2NvbmYucHkKaW5kZXggYjUxNGJmZi4uYjZkMjEyZCAxMDA2NDQKLS0tIGEvRG9jL2NvbmYucHkKKysrIGIvRG9jL2NvbmYucHkKQEAgLTYzLDYgKzYzLDkgQEAKICMgT3B0aW9ucyBmb3IgSFRNTCBvdXRwdXQKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAoraHRtbF90aGVtZSA9ICdkZWZhdWx0JworaHRtbF90aGVtZV9vcHRpb25zID0geydjb2xsYXBzaWJsZXNpZGViYXInOiBUcnVlfQorCiAjIElmIG5vdCAnJywgYSAnTGFzdCB1cGRhdGVkIG9uOicgdGltZXN0YW1wIGlzIGluc2VydGVkIGF0IGV2ZXJ5IHBhZ2UgYm90dG9tLAogIyB1c2luZyB0aGUgZ2l2ZW4gc3RyZnRpbWUgZm9ybWF0LgogaHRtbF9sYXN0X3VwZGF0ZWRfZm10ID0gJyViICVkLCAlWScKQEAgLTgzLDcgKzg2LDcgQEAKIH0KIAogIyBPdXRwdXQgYW4gT3BlblNlYXJjaCBkZXNjcmlwdGlvbiBmaWxlLgotaHRtbF91c2Vfb3BlbnNlYXJjaCA9ICdodHRwOi8vZG9jcy5weXRob24ub3JnL2RldicKK2h0bWxfdXNlX29wZW5zZWFyY2ggPSAnaHR0cDovL2RvY3MucHl0aG9uLm9yZy8nCiAKICMgQWRkaXRpb25hbCBzdGF0aWMgZmlsZXMuCiBodG1sX3N0YXRpY19wYXRoID0gWyd0b29scy9zcGhpbnhleHQvc3RhdGljJ10KQEAgLTExMiw4ICsxMTUsNiBAQAogICAgICAnVGhlIFB5dGhvbi9DIEFQSScsIF9zdGRhdXRob3IsICdtYW51YWwnKSwKICAgICAoJ2Rpc3R1dGlscy9pbmRleCcsICdkaXN0dXRpbHMudGV4JywKICAgICAgJ0Rpc3RyaWJ1dGluZyBQeXRob24gTW9kdWxlcycsIF9zdGRhdXRob3IsICdtYW51YWwnKSwKLSAgICAoJ2RvY3VtZW50aW5nL2luZGV4JywgJ2RvY3VtZW50aW5nLnRleCcsCi0gICAgICdEb2N1bWVudGluZyBQeXRob24nLCAnR2VvcmcgQnJhbmRsJywgJ21hbnVhbCcpLAogICAgICgnZXh0ZW5kaW5nL2luZGV4JywgJ2V4dGVuZGluZy50ZXgnLAogICAgICAnRXh0ZW5kaW5nIGFuZCBFbWJlZGRpbmcgUHl0aG9uJywgX3N0ZGF1dGhvciwgJ21hbnVhbCcpLAogICAgICgnaW5zdGFsbC9pbmRleCcsICdpbnN0YWxsLnRleCcsCkBAIC0xNTEsNyArMTUyLDcgQEAKIGxhdGV4X2FwcGVuZGljZXMgPSBbJ2dsb3NzYXJ5JywgJ2Fib3V0JywgJ2xpY2Vuc2UnLCAnY29weXJpZ2h0J10KIAogIyBHZXQgTGFUZVggdG8gaGFuZGxlIFVuaWNvZGUgY29ycmVjdGx5Ci1sYXRleF9lbGVtZW50cyA9IHsnaW5wdXRlbmMnOiByJ1x1c2VwYWNrYWdlW3V0Zjh4XXtpbnB1dGVuY30nfQorbGF0ZXhfZWxlbWVudHMgPSB7J2lucHV0ZW5jJzogcidcdXNlcGFja2FnZVt1dGY4eF17aW5wdXRlbmN9JywgJ3V0ZjhleHRyYSc6ICcnfQogCiAjIE9wdGlvbnMgZm9yIHRoZSBjb3ZlcmFnZSBjaGVja2VyCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2MvY29udGVudHMucnN0IGIvRG9jL2NvbnRlbnRzLnJzdAppbmRleCBlOTM4ZmNkLi5jMGM2YWYzIDEwMDY0NAotLS0gYS9Eb2MvY29udGVudHMucnN0CisrKyBiL0RvYy9jb250ZW50cy5yc3QKQEAgLTEzLDcgKzEzLDYgQEAKICAgIGMtYXBpL2luZGV4LnJzdAogICAgZGlzdHV0aWxzL2luZGV4LnJzdAogICAgaW5zdGFsbC9pbmRleC5yc3QKLSAgIGRvY3VtZW50aW5nL2luZGV4LnJzdAogICAgaG93dG8vaW5kZXgucnN0CiAgICBmYXEvaW5kZXgucnN0CiAgICBnbG9zc2FyeS5yc3QKZGlmZiAtLWdpdCBhL0RvYy9jb3B5cmlnaHQucnN0IGIvRG9jL2NvcHlyaWdodC5yc3QKaW5kZXggODkzYjU0MS4uYmU0N2U4YSAxMDA2NDQKLS0tIGEvRG9jL2NvcHlyaWdodC5yc3QKKysrIGIvRG9jL2NvcHlyaWdodC5yc3QKQEAgLTQsNyArNCw3IEBACiAKIFB5dGhvbiBhbmQgdGhpcyBkb2N1bWVudGF0aW9uIGlzOgogCi1Db3B5cmlnaHQgwqkgMjAwMS0yMDEwIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorQ29weXJpZ2h0IMKpIDIwMDEtMjAxNCBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogQ29weXJpZ2h0IMKpIDIwMDAgQmVPcGVuLmNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIApkaWZmIC0tZ2l0IGEvRG9jL2RhdGEvcmVmY291bnRzLmRhdCBiL0RvYy9kYXRhL3JlZmNvdW50cy5kYXQKaW5kZXggMWZjODk2Zi4uMDZjMTlkMCAxMDA2NDQKLS0tIGEvRG9jL2RhdGEvcmVmY291bnRzLmRhdAorKysgYi9Eb2MvZGF0YS9yZWZjb3VudHMuZGF0CkBAIC05MzIsNyArOTMyLDcgQEAKIAogUHlPYmplY3RfQ2FsbE1ldGhvZE9iakFyZ3M6UHlPYmplY3QqOjorMToKIFB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzOlB5T2JqZWN0KjpvOjA6Ci1QeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJnczpjaGFyKjpuYW1lOjoKK1B5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzOlB5T2JqZWN0KjpuYW1lOjA6CiBQeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJnczo6Li4uOjoKIAogUHlPYmplY3RfQ2FsbE9iamVjdDpQeU9iamVjdCo6OisxOgpkaWZmIC0tZ2l0IGEvRG9jL2Rpc3R1dGlscy9hcGlyZWYucnN0IGIvRG9jL2Rpc3R1dGlscy9hcGlyZWYucnN0CmluZGV4IGMzOTRlZWUuLmQxMjAxZWYgMTAwNjQ0Ci0tLSBhL0RvYy9kaXN0dXRpbHMvYXBpcmVmLnJzdAorKysgYi9Eb2MvZGlzdHV0aWxzL2FwaXJlZi5yc3QKQEAgLTI2LDYgKzI2LDggQEAKICAgIFRoZSBzZXR1cCBmdW5jdGlvbiB0YWtlcyBhIGxhcmdlIG51bWJlciBvZiBhcmd1bWVudHMuIFRoZXNlIGFyZSBsYWlkIG91dCBpbiB0aGUKICAgIGZvbGxvd2luZyB0YWJsZS4KIAorICAgLi4gdGFidWxhcmNvbHVtbnM6OiB8bHxMfEx8CisKICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICAgfCBhcmd1bWVudCBuYW1lICAgICAgfCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICArPT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKQEAgLTQ4LDcgKzUwLDEwIEBACiAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgIHwgKm1haW50YWluZXIqICAgICAgIHwgVGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgICAgICAgIHwgYSBzdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgfCAgICAgICAgICAgICAgICAgICAgfCBtYWludGFpbmVyLCBpZiBkaWZmZXJlbnQgZnJvbSAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICB8ICAgICAgICAgICAgICAgICAgICB8IHRoZSBhdXRob3IgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgIHwgICAgICAgICAgICAgICAgICAgIHwgdGhlIGF1dGhvci4gTm90ZSB0aGF0IGlmICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgfCAgICAgICAgICAgICAgICAgICAgfCB0aGUgbWFpbnRhaW5lciBpcyBwcm92aWRlZCwgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICB8ICAgICAgICAgICAgICAgICAgICB8IGRpc3R1dGlscyB3aWxsIHVzZSBpdCBhcyB0aGUgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgIHwgICAgICAgICAgICAgICAgICAgIHwgYXV0aG9yIGluIDpmaWxlOmBQS0ctSU5GT2AgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgICB8ICptYWludGFpbmVyX2VtYWlsKiB8IFRoZSBlbWFpbCBhZGRyZXNzIG9mIHRoZSAgICAgICB8IGEgc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgIHwgICAgICAgICAgICAgICAgICAgIHwgY3VycmVudCBtYWludGFpbmVyLCBpZiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfApAQCAtMTIyLDYgKzEyNyw4IEBACiAKICAgICpzdG9wX2FmdGVyKiB0ZWxscyA6ZnVuYzpgc2V0dXBgIHdoZW4gdG8gc3RvcCBwcm9jZXNzaW5nOyBwb3NzaWJsZSAgdmFsdWVzOgogCisgICAuLiB0YWJ1bGFyY29sdW1uczo6IHxsfEx8CisKICAgICstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICAgfCB2YWx1ZSAgICAgICAgIHwgZGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICArPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKQEAgLTE2Miw2ICsxNjksOCBAQAogICAgVGhlIEV4dGVuc2lvbiBjbGFzcyBkZXNjcmliZXMgYSBzaW5nbGUgQyBvciBDKytleHRlbnNpb24gbW9kdWxlIGluIGEgc2V0dXAKICAgIHNjcmlwdC4gSXQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGtleXdvcmQgYXJndW1lbnRzIGluIGl0cyBjb25zdHJ1Y3RvcgogCisgICAuLiB0YWJ1bGFyY29sdW1uczo6IHxsfEx8bHwKKwogICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgICB8IGFyZ3VtZW50IG5hbWUgICAgICAgICAgfCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0eXBlICAgICAgICAgICAgICAgICAgICAgIHwKICAgICs9PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09KwpAQCAtMjYxLDExICsyNzAsNiBAQAogICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgZnJvbSB0aGUgc291cmNlIGV4dGVuc2lvbnMgaWYgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgfCBub3QgcHJvdmlkZWQuICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCAqb3B0aW9uYWwqICAgICAgICAgICAgIHwgc3BlY2lmaWVzIHRoYXQgYSBidWlsZCBmYWlsdXJlIHwgYSBib29sZWFuICAgICAgICAgICAgICAgICB8Ci0gICB8ICAgICAgICAgICAgICAgICAgICAgICAgfCBpbiB0aGUgZXh0ZW5zaW9uIHNob3VsZCBub3QgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8IGFib3J0IHRoZSBidWlsZCBwcm9jZXNzLCBidXQgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgc2ltcGx5IHNraXAgdGhlIGV4dGVuc2lvbi4gICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKIAogCiAuLiBjbGFzczo6IERpc3RyaWJ1dGlvbgpAQCAtNDQ5LDcgKzQ1Myw5IEBACiAgICAgICBEZWZpbmUgYSBwcmVwcm9jZXNzb3IgbWFjcm8gZm9yIGFsbCBjb21waWxhdGlvbnMgZHJpdmVuIGJ5IHRoaXMgY29tcGlsZXIgb2JqZWN0LgogICAgICAgVGhlIG9wdGlvbmFsIHBhcmFtZXRlciAqdmFsdWUqIHNob3VsZCBiZSBhIHN0cmluZzsgaWYgaXQgaXMgbm90IHN1cHBsaWVkLCB0aGVuCiAgICAgICB0aGUgbWFjcm8gd2lsbCBiZSBkZWZpbmVkIHdpdGhvdXQgYW4gZXhwbGljaXQgdmFsdWUgYW5kIHRoZSBleGFjdCBvdXRjb21lCi0gICAgICBkZXBlbmRzIG9uIHRoZSBjb21waWxlciB1c2VkIChYWFggdHJ1ZT8gZG9lcyBBTlNJIHNheSBhbnl0aGluZyBhYm91dCB0aGlzPykKKyAgICAgIGRlcGVuZHMgb24gdGhlIGNvbXBpbGVyIHVzZWQuCisKKyAgICAgIC4uIFhYWCB0cnVlPyBkb2VzIEFOU0kgc2F5IGFueXRoaW5nIGFib3V0IHRoaXM/CiAKIAogICAgLi4gbWV0aG9kOjogQ0NvbXBpbGVyLnVuZGVmaW5lX21hY3JvKG5hbWUpCkBAIC02MDMsNyArNjA5LDkgQEAKIAogICAgICAgKm91dHB1dF9saWJuYW1lKiBzaG91bGQgYmUgYSBsaWJyYXJ5IG5hbWUsIG5vdCBhIGZpbGVuYW1lOyB0aGUgZmlsZW5hbWUgd2lsbCBiZQogICAgICAgaW5mZXJyZWQgZnJvbSB0aGUgbGlicmFyeSBuYW1lLiAgKm91dHB1dF9kaXIqIGlzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGxpYnJhcnkKLSAgICAgIGZpbGUgd2lsbCBiZSBwdXQuIFhYWCBkZWZhdWx0cyB0byB3aGF0PworICAgICAgZmlsZSB3aWxsIGJlIHB1dC4KKworICAgICAgLi4gWFhYIGRlZmF1bHRzIHRvIHdoYXQ/CiAKICAgICAgICpkZWJ1ZyogaXMgYSBib29sZWFuOyBpZiB0cnVlLCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUKICAgICAgIGxpYnJhcnkgKG5vdGUgdGhhdCBvbiBtb3N0IHBsYXRmb3JtcywgaXQgaXMgdGhlIGNvbXBpbGUgc3RlcCB3aGVyZSB0aGlzIG1hdHRlcnM6CkBAIC03MjEsMzIgKzcyOSwzMSBAQAogCiAgICAuLiBtZXRob2Q6OiBDQ29tcGlsZXIuZXhlY3V0ZShmdW5jLCBhcmdzWywgbXNnPU5vbmUsIGxldmVsPTFdKQogCi0gICAgICBJbnZva2VzIDpmdW5jOmBkaXN0dXRpbHMudXRpbC5leGVjdXRlYCBUaGlzIG1ldGhvZCBpbnZva2VzIGEgIFB5dGhvbiBmdW5jdGlvbgorICAgICAgSW52b2tlcyA6ZnVuYzpgZGlzdHV0aWxzLnV0aWwuZXhlY3V0ZWAuIFRoaXMgbWV0aG9kIGludm9rZXMgYSAgUHl0aG9uIGZ1bmN0aW9uCiAgICAgICAqZnVuYyogd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzICphcmdzKiwgYWZ0ZXIgIGxvZ2dpbmcgYW5kIHRha2luZyBpbnRvIGFjY291bnQKLSAgICAgIHRoZSAqZHJ5X3J1biogZmxhZy4gWFhYIHNlZSBhbHNvLgorICAgICAgdGhlICpkcnlfcnVuKiBmbGFnLgogCiAKICAgIC4uIG1ldGhvZDo6IENDb21waWxlci5zcGF3bihjbWQpCiAKICAgICAgIEludm9rZXMgOmZ1bmM6YGRpc3R1dGlscy51dGlsLnNwYXduYC4gVGhpcyBpbnZva2VzIGFuIGV4dGVybmFsICBwcm9jZXNzIHRvIHJ1bgotICAgICAgdGhlIGdpdmVuIGNvbW1hbmQuIFhYWCBzZWUgYWxzby4KKyAgICAgIHRoZSBnaXZlbiBjb21tYW5kLgogCiAKICAgIC4uIG1ldGhvZDo6IENDb21waWxlci5ta3BhdGgobmFtZVssIG1vZGU9NTExXSkKIAogICAgICAgSW52b2tlcyA6ZnVuYzpgZGlzdHV0aWxzLmRpcl91dGlsLm1rcGF0aGAuIFRoaXMgY3JlYXRlcyBhIGRpcmVjdG9yeSAgYW5kIGFueQotICAgICAgbWlzc2luZyBhbmNlc3RvciBkaXJlY3Rvcmllcy4gWFhYIHNlZSBhbHNvLgorICAgICAgbWlzc2luZyBhbmNlc3RvciBkaXJlY3Rvcmllcy4KIAogCiAgICAuLiBtZXRob2Q6OiBDQ29tcGlsZXIubW92ZV9maWxlKHNyYywgZHN0KQogCi0gICAgICBJbnZva2VzIDptZXRoOmBkaXN0dXRpbHMuZmlsZV91dGlsLm1vdmVfZmlsZWAuIFJlbmFtZXMgKnNyYyogdG8gICpkc3QqLiAgWFhYIHNlZQotICAgICAgYWxzby4KKyAgICAgIEludm9rZXMgOm1ldGg6YGRpc3R1dGlscy5maWxlX3V0aWwubW92ZV9maWxlYC4gUmVuYW1lcyAqc3JjKiB0byAgKmRzdCouCiAKIAogICAgLi4gbWV0aG9kOjogQ0NvbXBpbGVyLmFubm91bmNlKG1zZ1ssIGxldmVsPTFdKQogCi0gICAgICBXcml0ZSBhIG1lc3NhZ2UgdXNpbmcgOmZ1bmM6YGRpc3R1dGlscy5sb2cuZGVidWdgLiBYWFggc2VlIGFsc28uCisgICAgICBXcml0ZSBhIG1lc3NhZ2UgdXNpbmcgOmZ1bmM6YGRpc3R1dGlscy5sb2cuZGVidWdgLgogCiAKICAgIC4uIG1ldGhvZDo6IENDb21waWxlci53YXJuKG1zZykKQEAgLTg3NCw4ICs4ODEsNiBAQAogICAgcHJlZml4IG9mIGFsbCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgaW4gdGhlIGFyY2hpdmUuICAqcm9vdF9kaXIqIGFuZCAqYmFzZV9kaXIqCiAgICBib3RoIGRlZmF1bHQgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgYXJjaGl2ZSBmaWxlLgogCi0gICAuLiBYWFggVGhpcyBzaG91bGQgYmUgY2hhbmdlZCB0byBzdXBwb3J0IGJ6MiBmaWxlcy4KLQogCiAuLiBmdW5jdGlvbjo6IG1ha2VfdGFyYmFsbChiYXNlX25hbWUsIGJhc2VfZGlyWywgY29tcHJlc3M9J2d6aXAnLCB2ZXJib3NlPTAsIGRyeV9ydW49MF0pCiAKQEAgLTg4Nyw4ICs4OTIsNiBAQAogICAgcG9zc2libHkgcGx1cyB0aGUgYXBwcm9wcmlhdGUgY29tcHJlc3Npb24gZXh0ZW5zaW9uICg6ZmlsZTpgLmd6YCwgOmZpbGU6YC5iejJgCiAgICBvciA6ZmlsZTpgLlpgKS4gIFJldHVybiB0aGUgb3V0cHV0IGZpbGVuYW1lLgogCi0gICAuLiBYWFggVGhpcyBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBjYWxscyB0byB0aGUgOm1vZDpgdGFyZmlsZWAgbW9kdWxlLgotCiAKIC4uIGZ1bmN0aW9uOjogbWFrZV96aXBmaWxlKGJhc2VfbmFtZSwgYmFzZV9kaXJbLCB2ZXJib3NlPTAsIGRyeV9ydW49MF0pCiAKQEAgLTk3OSwyMCArOTgyLDI4IEBACiAgICBDb3B5IGFuIGVudGlyZSBkaXJlY3RvcnkgdHJlZSAqc3JjKiB0byBhIG5ldyBsb2NhdGlvbiAqZHN0Ki4gIEJvdGggKnNyYyogYW5kCiAgICAqZHN0KiBtdXN0IGJlIGRpcmVjdG9yeSBuYW1lcy4gIElmICpzcmMqIGlzIG5vdCBhIGRpcmVjdG9yeSwgcmFpc2UKICAgIDpleGM6YERpc3R1dGlsc0ZpbGVFcnJvcmAuICBJZiAqZHN0KiBkb2VzICBub3QgZXhpc3QsIGl0IGlzIGNyZWF0ZWQgd2l0aAotICAgOmZ1bmM6YG1rcGF0aGAuICBUaGUgZW5kIHJlc3VsdCBvZiB0aGUgIGNvcHkgaXMgdGhhdCBldmVyeSBmaWxlIGluICpzcmMqIGlzCi0gICBjb3BpZWQgdG8gKmRzdCosIGFuZCAgZGlyZWN0b3JpZXMgdW5kZXIgKnNyYyogYXJlIHJlY3Vyc2l2ZWx5IGNvcGllZCB0byAqZHN0Ki4KKyAgIDpmdW5jOmBta3BhdGhgLiAgVGhlIGVuZCByZXN1bHQgb2YgdGhlIGNvcHkgaXMgdGhhdCBldmVyeSBmaWxlIGluICpzcmMqIGlzCisgICBjb3BpZWQgdG8gKmRzdCosIGFuZCBkaXJlY3RvcmllcyB1bmRlciAqc3JjKiBhcmUgcmVjdXJzaXZlbHkgY29waWVkIHRvICpkc3QqLgogICAgUmV0dXJuIHRoZSBsaXN0IG9mIGZpbGVzIHRoYXQgd2VyZSBjb3BpZWQgb3IgbWlnaHQgaGF2ZSBiZWVuIGNvcGllZCwgdXNpbmcgdGhlaXIKICAgIG91dHB1dCBuYW1lLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHVuYWZmZWN0ZWQgYnkgKnVwZGF0ZSogb3IgKmRyeV9ydW4qOiBpdCBpcwogICAgc2ltcGx5IHRoZSBsaXN0IG9mIGFsbCBmaWxlcyB1bmRlciAqc3JjKiwgd2l0aCB0aGUgbmFtZXMgY2hhbmdlZCB0byBiZSB1bmRlcgogICAgKmRzdCouCiAKLSAgICpwcmVzZXJ2ZV9tb2RlKiBhbmQgKnByZXNlcnZlX3RpbWVzKiBhcmUgdGhlIHNhbWUgYXMgZm9yIDpmdW5jOmBjb3B5X2ZpbGVgIGluCi0gICA6bW9kOmBkaXN0dXRpbHMuZmlsZV91dGlsYDsgbm90ZSB0aGF0IHRoZXkgb25seSBhcHBseSB0byByZWd1bGFyIGZpbGVzLCBub3QgdG8KKyAgICpwcmVzZXJ2ZV9tb2RlKiBhbmQgKnByZXNlcnZlX3RpbWVzKiBhcmUgdGhlIHNhbWUgYXMgZm9yCisgICA6ZnVuYzpgZGlzdHV0aWxzLmZpbGVfdXRpbC5jb3B5X2ZpbGVgOyBub3RlIHRoYXQgdGhleSBvbmx5IGFwcGx5IHRvCisgICByZWd1bGFyIGZpbGVzLCBub3QgdG8KICAgIGRpcmVjdG9yaWVzLiAgSWYgKnByZXNlcnZlX3N5bWxpbmtzKiBpcyB0cnVlLCBzeW1saW5rcyB3aWxsIGJlIGNvcGllZCBhcwogICAgc3ltbGlua3MgKG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgdGhlbSEpOyBvdGhlcndpc2UgKHRoZSBkZWZhdWx0KSwgdGhlCiAgICBkZXN0aW5hdGlvbiBvZiB0aGUgc3ltbGluayB3aWxsIGJlIGNvcGllZC4gICp1cGRhdGUqIGFuZCAqdmVyYm9zZSogYXJlIHRoZSBzYW1lCiAgICBhcyBmb3IgOmZ1bmM6YGNvcHlfZmlsZWAuCiAKKyAgIEZpbGVzIGluICpzcmMqIHRoYXQgYmVnaW4gd2l0aCA6ZmlsZTpgLm5mc2AgYXJlIHNraXBwZWQgKG1vcmUgaW5mb3JtYXRpb24gb24KKyAgIHRoZXNlIGZpbGVzIGlzIGF2YWlsYWJsZSBpbiBhbnN3ZXIgRDIgb2YgdGhlIGBORlMgRkFRIHBhZ2UKKyAgIDxodHRwOi8vbmZzLnNvdXJjZWZvcmdlLm5ldC8jc2VjdGlvbl9kPmBfLgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNy40CisgICAgICBORlMgZmlsZXMgYXJlIGlnbm9yZWQuCisKIAogLi4gZnVuY3Rpb246OiByZW1vdmVfdHJlZShkaXJlY3RvcnlbLCB2ZXJib3NlPTAsIGRyeV9ydW49MF0pCiAKQEAgLTEwMDAsOCArMTAxMSw2IEBACiAgICBlcnJvcnMgYXJlIGlnbm9yZWQgKGFwYXJ0IGZyb20gYmVpbmcgcmVwb3J0ZWQgdG8gYGBzeXMuc3Rkb3V0YGAgaWYgKnZlcmJvc2UqIGlzCiAgICB0cnVlKS4KIAotLi4gWFhYIFNvbWUgb2YgdGhpcyBjb3VsZCBiZSByZXBsYWNlZCB3aXRoIHRoZSBzaHV0aWwgbW9kdWxlPwotCiAKIDptb2Q6YGRpc3R1dGlscy5maWxlX3V0aWxgIC0tLSBTaW5nbGUgZmlsZSBvcGVyYXRpb25zCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTExNSw4ICsxMTI0LDYgQEAKIAogICAgKiBgYG1hY29zeC0xMC42LWludGVsYGAKIAotICAgLi4gJSBYWFggaXNuJ3QgdGhpcyBhbHNvIHByb3ZpZGVkIGJ5IHNvbWUgb3RoZXIgbm9uLWRpc3R1dGlscyBtb2R1bGU/Ci0KIAogLi4gZnVuY3Rpb246OiBjb252ZXJ0X3BhdGgocGF0aG5hbWUpCiAKQEAgLTExNjAsMTUgKzExNjcsNiBAQAogICAgdW5kZXJzY29yZS4gTm8geyB9IG9yICggKSBzdHlsZSBxdW90aW5nIGlzIGF2YWlsYWJsZS4KIAogCi0uLiBmdW5jdGlvbjo6IGdyb2tfZW52aXJvbm1lbnRfZXJyb3IoZXhjWywgcHJlZml4PSdlcnJvcjogJ10pCi0KLSAgIEdlbmVyYXRlIGEgdXNlZnVsIGVycm9yIG1lc3NhZ2UgZnJvbSBhbiA6ZXhjOmBFbnZpcm9ubWVudEVycm9yYCAgKDpleGM6YElPRXJyb3JgCi0gICBvciA6ZXhjOmBPU0Vycm9yYCkgZXhjZXB0aW9uIG9iamVjdC4gICBIYW5kbGVzIFB5dGhvbiAxLjUuMSBhbmQgbGF0ZXIgc3R5bGVzLAotICAgYW5kIGRvZXMgd2hhdCBpdCBjYW4gdG8gZGVhbCB3aXRoICBleGNlcHRpb24gb2JqZWN0cyB0aGF0IGRvbid0IGhhdmUgYSBmaWxlbmFtZQotICAgKHdoaWNoIGhhcHBlbnMgd2hlbiB0aGUgZXJyb3IgIGlzIGR1ZSB0byBhIHR3by1maWxlIG9wZXJhdGlvbiwgc3VjaCBhcwotICAgOmZ1bmM6YHJlbmFtZWAgb3IgIDpmdW5jOmBsaW5rYCkuICBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIGFzIGEgc3RyaW5nCi0gICBwcmVmaXhlZCAgd2l0aCAqcHJlZml4Ki4KLQogCiAuLiBmdW5jdGlvbjo6IHNwbGl0X3F1b3RlZChzKQogCkBAIC0xMjUxLDggKzEyNDksOCBAQAogICAgICAgICAgICAgICBidWlsdC9pbnN0YWxsZWQvZGlzdHJpYnV0ZWQKIAogCi1UaGlzIG1vZHVsZSBwcm92aWRlcyB0aGUgOmNsYXNzOmBEaXN0cmlidXRpb25gIGNsYXNzLCB3aGljaCByZXByZXNlbnRzIHRoZQotbW9kdWxlIGRpc3RyaWJ1dGlvbiBiZWluZyBidWlsdC9pbnN0YWxsZWQvZGlzdHJpYnV0ZWQuCitUaGlzIG1vZHVsZSBwcm92aWRlcyB0aGUgOmNsYXNzOmB+ZGlzdHV0aWxzLmNvcmUuRGlzdHJpYnV0aW9uYCBjbGFzcywgd2hpY2gKK3JlcHJlc2VudHMgdGhlIG1vZHVsZSBkaXN0cmlidXRpb24gYmVpbmcgYnVpbHQvaW5zdGFsbGVkL2Rpc3RyaWJ1dGVkLgogCiAKIDptb2Q6YGRpc3R1dGlscy5leHRlbnNpb25gIC0tLSBUaGUgRXh0ZW5zaW9uIGNsYXNzCkBAIC0xMzE2LDggKzEzMTQsNiBAQAogICB0aGUgIm5lZ2F0aXZlIGFsaWFzIiBvZiA6b3B0aW9uOmAtLXZlcmJvc2VgLCB0aGVuIDpvcHRpb246YC0tcXVpZXRgIG9uIHRoZQogICBjb21tYW5kIGxpbmUgc2V0cyAqdmVyYm9zZSogdG8gZmFsc2UuCiAKLS4uIFhYWCBTaG91bGQgYmUgcmVwbGFjZWQgd2l0aCA6bW9kOmBvcHRwYXJzZWAuCi0KIAogLi4gZnVuY3Rpb246OiBmYW5jeV9nZXRvcHQob3B0aW9ucywgbmVnYXRpdmVfb3B0LCBvYmplY3QsIGFyZ3MpCiAKQEAgLTEzMzQsOCArMTMzMCw2IEBACiAKICAgIFdyYXBzICp0ZXh0KiB0byBsZXNzIHRoYW4gKndpZHRoKiB3aWRlLgogCi0gICAuLiBYWFggU2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggOm1vZDpgdGV4dHdyYXBgICh3aGljaCBpcyBhdmFpbGFibGUgaW4gUHl0aG9uCi0gICAgICAyLjMgYW5kIGxhdGVyKS4KIAogCiAuLiBjbGFzczo6IEZhbmN5R2V0b3B0KFtvcHRpb25fdGFibGU9Tm9uZV0pCkBAIC0xMzk5LDEwICsxMzkzLDYgQEAKICAgIDpzeW5vcHNpczogQSBzaW1wbGUgbG9nZ2luZyBtZWNoYW5pc20sIDI4Mi1zdHlsZQogCiAKLS4uIFhYWCBTaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBzdGFuZGFyZCA6bW9kOmBsb2dnaW5nYCBtb2R1bGUuCi0KLQotCiA6bW9kOmBkaXN0dXRpbHMuc3Bhd25gIC0tLSBTcGF3biBhIHN1Yi1wcm9jZXNzCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTE1NjQsNiArMTU1NCw4IEBACiAKICAgIFRoZSBvcHRpb25zIGFyZSBhbGwgYm9vbGVhbiwgYW5kIGFmZmVjdCB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IDptZXRoOmByZWFkbGluZWAKIAorICAgLi4gdGFidWxhcmNvbHVtbnM6OiB8bHxMfGx8CisKICAgICstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwogICAgfCBvcHRpb24gbmFtZSAgICAgIHwgZGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgIHwgZGVmYXVsdCB8CiAgICArPT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PSsKQEAgLTE3MDYsOCArMTY5OCw4IEBACiAgICBvcHRpb25zLCBpcyB0aGUgOm1ldGg6YHJ1bmAgbWV0aG9kLCB3aGljaCBtdXN0IGFsc28gYmUgaW1wbGVtZW50ZWQgYnkgZXZlcnkKICAgIGNvbW1hbmQgY2xhc3MuCiAKLSAgIFRoZSBjbGFzcyBjb25zdHJ1Y3RvciB0YWtlcyBhIHNpbmdsZSBhcmd1bWVudCAqZGlzdCosIGEgOmNsYXNzOmBEaXN0cmlidXRpb25gCi0gICBpbnN0YW5jZS4KKyAgIFRoZSBjbGFzcyBjb25zdHJ1Y3RvciB0YWtlcyBhIHNpbmdsZSBhcmd1bWVudCAqZGlzdCosIGEKKyAgIDpjbGFzczpgfmRpc3R1dGlscy5jb3JlLkRpc3RyaWJ1dGlvbmAgaW5zdGFuY2UuCiAKIAogQ3JlYXRpbmcgYSBuZXcgRGlzdHV0aWxzIGNvbW1hbmQKQEAgLTE4OTksOSArMTg5MSw2IEBACiAgICA6c3lub3BzaXM6IEJ1aWxkIHRoZSAucHkvLnB5YyBmaWxlcyBvZiBhIHBhY2thZ2UKIAogCi0uLiAlIHRvZG8KLQotCiA6bW9kOmBkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9zY3JpcHRzYCAtLS0gQnVpbGQgdGhlIHNjcmlwdHMgb2YgYSBwYWNrYWdlCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTE5MTgsOCArMTkwNywxMiBAQAogLi4gbW9kdWxlOjogZGlzdHV0aWxzLmNvbW1hbmQuY2xlYW4KICAgIDpzeW5vcHNpczogQ2xlYW4gYSBwYWNrYWdlIGJ1aWxkIGFyZWEKIAorVGhpcyBjb21tYW5kIHJlbW92ZXMgdGhlIHRlbXBvcmFyeSBmaWxlcyBjcmVhdGVkIGJ5IDpjb21tYW5kOmBidWlsZGAKK2FuZCBpdHMgc3ViY29tbWFuZHMsIGxpa2UgaW50ZXJtZWRpYXJ5IGNvbXBpbGVkIG9iamVjdCBmaWxlcy4gIFdpdGgKK3RoZSBgYC0tYWxsYGAgb3B0aW9uLCB0aGUgY29tcGxldGUgYnVpbGQgZGlyZWN0b3J5IHdpbGwgYmUgcmVtb3ZlZC4KIAotLi4gJSB0b2RvCitFeHRlbnNpb24gbW9kdWxlcyBidWlsdCA6cmVmOmBpbiBwbGFjZSA8ZGlzdHV0aWxzLWJ1aWxkLWV4dC1pbnBsYWNlPmAKK3dpbGwgbm90IGJlIGNsZWFuZWQsIGFzIHRoZXkgYXJlIG5vdCBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5LgogCiAKIDptb2Q6YGRpc3R1dGlscy5jb21tYW5kLmNvbmZpZ2AgLS0tIFBlcmZvcm0gcGFja2FnZSBjb25maWd1cmF0aW9uCmRpZmYgLS1naXQgYS9Eb2MvZGlzdHV0aWxzL2J1aWx0ZGlzdC5yc3QgYi9Eb2MvZGlzdHV0aWxzL2J1aWx0ZGlzdC5yc3QKaW5kZXggYjRmMmYxYS4uN2ExMTQ1OSAxMDA2NDQKLS0tIGEvRG9jL2Rpc3R1dGlscy9idWlsdGRpc3QucnN0CisrKyBiL0RvYy9kaXN0dXRpbHMvYnVpbHRkaXN0LnJzdApAQCAtNDI2LDcgKzQyNiw3IEBACiAKICAgIFdoaWNoIGZvbGRlcnMgYXJlIGF2YWlsYWJsZSBkZXBlbmRzIG9uIHRoZSBleGFjdCBXaW5kb3dzIHZlcnNpb24sIGFuZCBwcm9iYWJseQogICAgYWxzbyB0aGUgY29uZmlndXJhdGlvbi4gIEZvciBkZXRhaWxzIHJlZmVyIHRvIE1pY3Jvc29mdCdzIGRvY3VtZW50YXRpb24gb2YgdGhlCi0gICA6Y2Z1bmM6YFNIR2V0U3BlY2lhbEZvbGRlclBhdGhgIGZ1bmN0aW9uLgorICAgOmM6ZnVuYzpgU0hHZXRTcGVjaWFsRm9sZGVyUGF0aGAgZnVuY3Rpb24uCiAKIAogLi4gZnVuY3Rpb246OiBjcmVhdGVfc2hvcnRjdXQodGFyZ2V0LCBkZXNjcmlwdGlvbiwgZmlsZW5hbWVbLCBhcmd1bWVudHNbLCB3b3JrZGlyWywgaWNvbnBhdGhbLCBpY29uaW5kZXhdXV1dKQpkaWZmIC0tZ2l0IGEvRG9jL2Rpc3R1dGlscy9jb25maWdmaWxlLnJzdCBiL0RvYy9kaXN0dXRpbHMvY29uZmlnZmlsZS5yc3QKaW5kZXggODkwMDQ3Yy4uYWM3OTY3MSAxMDA2NDQKLS0tIGEvRG9jL2Rpc3R1dGlscy9jb25maWdmaWxlLnJzdAorKysgYi9Eb2MvZGlzdHV0aWxzL2NvbmZpZ2ZpbGUucnN0CkBAIC02OSw2ICs2OSw4IEBACiBOb3RlIHRoYXQgYW4gb3B0aW9uIHNwZWxsZWQgOm9wdGlvbjpgLS1mb28tYmFyYCBvbiB0aGUgY29tbWFuZC1saW5lICBpcyBzcGVsbGVkCiA6b3B0aW9uOmBmb29fYmFyYCBpbiBjb25maWd1cmF0aW9uIGZpbGVzLgogCisuLiBfZGlzdHV0aWxzLWJ1aWxkLWV4dC1pbnBsYWNlOgorCiBGb3IgZXhhbXBsZSwgc2F5IHlvdSB3YW50IHlvdXIgZXh0ZW5zaW9ucyB0byBiZSBidWlsdCAiaW4tcGxhY2UiLS0tdGhhdCBpcywgeW91CiBoYXZlIGFuIGV4dGVuc2lvbiA6bW9kOmBwa2cuZXh0YCwgYW5kIHlvdSB3YW50IHRoZSBjb21waWxlZCBleHRlbnNpb24gZmlsZQogKDpmaWxlOmBleHQuc29gIG9uIFVuaXgsIHNheSkgdG8gYmUgcHV0IGluIHRoZSBzYW1lIHNvdXJjZSBkaXJlY3RvcnkgYXMgeW91cgpkaWZmIC0tZ2l0IGEvRG9jL2Rpc3R1dGlscy9leGFtcGxlcy5yc3QgYi9Eb2MvZGlzdHV0aWxzL2V4YW1wbGVzLnJzdAppbmRleCBiNDk1OTI4Li4zYzZjN2JjIDEwMDY0NAotLS0gYS9Eb2MvZGlzdHV0aWxzL2V4YW1wbGVzLnJzdAorKysgYi9Eb2MvZGlzdHV0aWxzL2V4YW1wbGVzLnJzdApAQCAtMTkzLDkgKzE5Myw2IEBACiAgICAgICAgICBwYWNrYWdlcz1bJ2Zvb2JhcicsICdmb29iYXIuc3ViZm9vJ10sCiAgICAgICAgICApCiAKLShBZ2FpbiwgdGhlIGVtcHR5IHN0cmluZyBpbiA6b3B0aW9uOmBwYWNrYWdlX2RpcmAgc3RhbmRzIGZvciB0aGUgY3VycmVudAotZGlyZWN0b3J5LikKLQogCiAuLiBfc2luZ2xlLWV4dDoKIApkaWZmIC0tZ2l0IGEvRG9jL2Rpc3R1dGlscy9pbmRleC5yc3QgYi9Eb2MvZGlzdHV0aWxzL2luZGV4LnJzdAppbmRleCBhY2U4MjgwLi4xYTZmMDRjIDEwMDY0NAotLS0gYS9Eb2MvZGlzdHV0aWxzL2luZGV4LnJzdAorKysgYi9Eb2MvZGlzdHV0aWxzL2luZGV4LnJzdApAQCAtNiwxNCArNiwyMiBAQAogCiA6QXV0aG9yczogR3JlZyBXYXJkLCBBbnRob255IEJheHRlcgogOkVtYWlsOiBkaXN0dXRpbHMtc2lnQHB5dGhvbi5vcmcKLTpSZWxlYXNlOiB8dmVyc2lvbnwKLTpEYXRlOiB8dG9kYXl8CiAKIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBQeXRob24gRGlzdHJpYnV0aW9uIFV0aWxpdGllcyAoIkRpc3R1dGlscyIpIGZyb20KIHRoZSBtb2R1bGUgZGV2ZWxvcGVyJ3MgcG9pbnQgb2YgdmlldywgZGVzY3JpYmluZyBob3cgdG8gdXNlIHRoZSBEaXN0dXRpbHMgdG8KIG1ha2UgUHl0aG9uIG1vZHVsZXMgYW5kIGV4dGVuc2lvbnMgZWFzaWx5IGF2YWlsYWJsZSB0byBhIHdpZGVyIGF1ZGllbmNlIHdpdGgKIHZlcnkgbGl0dGxlIG92ZXJoZWFkIGZvciBidWlsZC9yZWxlYXNlL2luc3RhbGwgbWVjaGFuaWNzLgogCisuLiBub3RlOjoKKworICAgVGhpcyBndWlkZSBvbmx5IGNvdmVycyB0aGUgYmFzaWMgdG9vbHMgZm9yIGJ1aWxkaW5nIGFuZCBkaXN0cmlidXRpbmcKKyAgIGV4dGVuc2lvbnMgdGhhdCBhcmUgcHJvdmlkZWQgYXMgcGFydCBvZiB0aGlzIHZlcnNpb24gb2YgUHl0aG9uLiBUaGlyZAorICAgcGFydHkgdG9vbHMgb2ZmZXIgZWFzaWVyIHRvIHVzZSBhbmQgbW9yZSBzZWN1cmUgYWx0ZXJuYXRpdmVzLiBSZWZlciB0byB0aGUKKyAgIGBxdWljayByZWNvbW1lbmRhdGlvbnMgc2VjdGlvbgorICAgPGh0dHBzOi8vcHl0aG9uLXBhY2thZ2luZy11c2VyLWd1aWRlLnJlYWR0aGVkb2NzLm9yZy9lbi9sYXRlc3QvY3VycmVudC5odG1sPmBfXworICAgaW4gdGhlIFB5dGhvbiBQYWNrYWdpbmcgVXNlciBHdWlkZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworCiAuLiB0b2N0cmVlOjoKICAgIDptYXhkZXB0aDogMgogICAgOm51bWJlcmVkOgpAQCAtMjQsNyArMzIsNiBAQAogICAgc291cmNlZGlzdC5yc3QKICAgIGJ1aWx0ZGlzdC5yc3QKICAgIHBhY2thZ2VpbmRleC5yc3QKLSAgIHVwbG9hZGluZy5yc3QKICAgIGV4YW1wbGVzLnJzdAogICAgZXh0ZW5kaW5nLnJzdAogICAgY29tbWFuZHJlZi5yc3QKZGlmZiAtLWdpdCBhL0RvYy9kaXN0dXRpbHMvcGFja2FnZWluZGV4LnJzdCBiL0RvYy9kaXN0dXRpbHMvcGFja2FnZWluZGV4LnJzdAppbmRleCAxNDk4Mzk0Li4xZDcyNGUyIDEwMDY0NAotLS0gYS9Eb2MvZGlzdHV0aWxzL3BhY2thZ2VpbmRleC5yc3QKKysrIGIvRG9jL2Rpc3R1dGlscy9wYWNrYWdlaW5kZXgucnN0CkBAIC0xLDEyICsxLDMzIEBACisuLiBpbmRleDo6CisgICBzaW5nbGU6IFB5dGhvbiBQYWNrYWdlIEluZGV4IChQeVBJKQorICAgc2luZ2xlOiBQeVBJOyAoc2VlIFB5dGhvbiBQYWNrYWdlIEluZGV4IChQeVBJKSkKKwogLi4gX3BhY2thZ2UtaW5kZXg6CiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJlZ2lzdGVyaW5nIHdpdGggdGhlIFBhY2thZ2UgSW5kZXgKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1RoZSBQeXRob24gUGFja2FnZSBJbmRleCAoUHlQSSkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotVGhlIFB5dGhvbiBQYWNrYWdlIEluZGV4IChQeVBJKSBob2xkcyBtZXRhLWRhdGEgZGVzY3JpYmluZyBkaXN0cmlidXRpb25zCi1wYWNrYWdlZCB3aXRoIGRpc3R1dGlscy4gVGhlIGRpc3R1dGlscyBjb21tYW5kIDpjb21tYW5kOmByZWdpc3RlcmAgaXMgdXNlZCB0bwotc3VibWl0IHlvdXIgZGlzdHJpYnV0aW9uJ3MgbWV0YS1kYXRhIHRvIHRoZSBpbmRleC4gSXQgaXMgaW52b2tlZCBhcyBmb2xsb3dzOjoKK1RoZSBgUHl0aG9uIFBhY2thZ2UgSW5kZXggKFB5UEkpYF8gaG9sZHMgOnJlZjpgbWV0YS1kYXRhIDxtZXRhLWRhdGE+YAorZGVzY3JpYmluZyBkaXN0cmlidXRpb25zIHBhY2thZ2VkIHdpdGggZGlzdHV0aWxzLCBhcyB3ZWxsIGFzIHBhY2thZ2UgZGF0YSBsaWtlCitkaXN0cmlidXRpb24gZmlsZXMgaWYgdGhlIHBhY2thZ2UgYXV0aG9yIHdpc2hlcy4KKworRGlzdHV0aWxzIGV4cG9zZXMgdHdvIGNvbW1hbmRzIGZvciBzdWJtaXR0aW5nIHBhY2thZ2UgZGF0YSB0byBQeVBJOiB0aGUKKzpyZWY6YHJlZ2lzdGVyIDxwYWNrYWdlLXJlZ2lzdGVyPmAgY29tbWFuZCBmb3Igc3VibWl0dGluZyBtZXRhLWRhdGEgdG8gUHlQSQorYW5kIHRoZSA6cmVmOmB1cGxvYWQgPHBhY2thZ2UtdXBsb2FkPmAgY29tbWFuZCBmb3Igc3VibWl0dGluZyBkaXN0cmlidXRpb24KK2ZpbGVzLiAgQm90aCBjb21tYW5kcyByZWFkIGNvbmZpZ3VyYXRpb24gZGF0YSBmcm9tIGEgc3BlY2lhbCBmaWxlIGNhbGxlZCB0aGUKKzpyZWY6YC5weXBpcmMgZmlsZSA8cHlwaXJjPmAuICBQeVBJIDpyZWY6YGRpc3BsYXlzIGEgaG9tZSBwYWdlCis8cGFja2FnZS1kaXNwbGF5PmAgZm9yIGVhY2ggcGFja2FnZSBjcmVhdGVkIGZyb20gdGhlIGBgbG9uZ19kZXNjcmlwdGlvbmBgCitzdWJtaXR0ZWQgYnkgdGhlIDpjb21tYW5kOmByZWdpc3RlcmAgY29tbWFuZC4KKworCisuLiBfcGFja2FnZS1yZWdpc3RlcjoKKworUmVnaXN0ZXJpbmcgUGFja2FnZXMKKz09PT09PT09PT09PT09PT09PT09CisKK1RoZSBkaXN0dXRpbHMgY29tbWFuZCA6Y29tbWFuZDpgcmVnaXN0ZXJgIGlzIHVzZWQgdG8gc3VibWl0IHlvdXIgZGlzdHJpYnV0aW9uJ3MKK21ldGEtZGF0YSB0byB0aGUgaW5kZXguIEl0IGlzIGludm9rZWQgYXMgZm9sbG93czo6CiAKICAgICBweXRob24gc2V0dXAucHkgcmVnaXN0ZXIKIApAQCAtNDMsMTEgKzY0LDU5IEBACiBNYWludGFpbmVycyBtYXkgZWRpdCB0aGUgcGFja2FnZSBpbmZvcm1hdGlvbiwgYnV0IG5vdCBkZXNpZ25hdGUgb3RoZXIgT3duZXJzIG9yCiBNYWludGFpbmVycy4KIAotQnkgZGVmYXVsdCBQeVBJIHdpbGwgbGlzdCBhbGwgdmVyc2lvbnMgb2YgYSBnaXZlbiBwYWNrYWdlLiBUbyBoaWRlIGNlcnRhaW4KLXZlcnNpb25zLCB0aGUgSGlkZGVuIHByb3BlcnR5IHNob3VsZCBiZSBzZXQgdG8geWVzLiBUaGlzIG11c3QgYmUgZWRpdGVkIHRocm91Z2gKLXRoZSB3ZWIgaW50ZXJmYWNlLgorQnkgZGVmYXVsdCBQeVBJIGRpc3BsYXlzIG9ubHkgdGhlIG5ld2VzdCB2ZXJzaW9uIG9mIGEgZ2l2ZW4gcGFja2FnZS4gVGhlIHdlYgoraW50ZXJmYWNlIGxldHMgb25lIGNoYW5nZSB0aGlzIGRlZmF1bHQgYmVoYXZpb3IgYW5kIG1hbnVhbGx5IHNlbGVjdCB3aGljaAordmVyc2lvbnMgdG8gZGlzcGxheSBhbmQgaGlkZS4KIAogCisuLiBfcGFja2FnZS11cGxvYWQ6CisKK1VwbG9hZGluZyBQYWNrYWdlcworPT09PT09PT09PT09PT09PT09CisKKy4uIHZlcnNpb25hZGRlZDo6IDIuNQorCitUaGUgZGlzdHV0aWxzIGNvbW1hbmQgOmNvbW1hbmQ6YHVwbG9hZGAgcHVzaGVzIHRoZSBkaXN0cmlidXRpb24gZmlsZXMgdG8gUHlQSS4KKworVGhlIGNvbW1hbmQgaXMgaW52b2tlZCBpbW1lZGlhdGVseSBhZnRlciBidWlsZGluZyBvbmUgb3IgbW9yZSBkaXN0cmlidXRpb24KK2ZpbGVzLiAgRm9yIGV4YW1wbGUsIHRoZSBjb21tYW5kIDo6CisKKyAgICBweXRob24gc2V0dXAucHkgc2Rpc3QgYmRpc3Rfd2luaW5zdCB1cGxvYWQKKword2lsbCBjYXVzZSB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiBhbmQgdGhlIFdpbmRvd3MgaW5zdGFsbGVyIHRvIGJlIHVwbG9hZGVkIHRvCitQeVBJLiAgTm90ZSB0aGF0IHRoZXNlIHdpbGwgYmUgdXBsb2FkZWQgZXZlbiBpZiB0aGV5IGFyZSBidWlsdCB1c2luZyBhbiBlYXJsaWVyCitpbnZvY2F0aW9uIG9mIDpmaWxlOmBzZXR1cC5weWAsIGJ1dCB0aGF0IG9ubHkgZGlzdHJpYnV0aW9ucyBuYW1lZCBvbiB0aGUgY29tbWFuZAorbGluZSBmb3IgdGhlIGludm9jYXRpb24gaW5jbHVkaW5nIHRoZSA6Y29tbWFuZDpgdXBsb2FkYCBjb21tYW5kIGFyZSB1cGxvYWRlZC4KKworVGhlIDpjb21tYW5kOmB1cGxvYWRgIGNvbW1hbmQgdXNlcyB0aGUgdXNlcm5hbWUsIHBhc3N3b3JkLCBhbmQgcmVwb3NpdG9yeSBVUkwKK2Zyb20gdGhlIDpmaWxlOmAkSE9NRS8ucHlwaXJjYCBmaWxlIChzZWUgc2VjdGlvbiA6cmVmOmBweXBpcmNgIGZvciBtb3JlIG9uIHRoaXMKK2ZpbGUpLiBJZiBhIDpjb21tYW5kOmByZWdpc3RlcmAgY29tbWFuZCB3YXMgcHJldmlvdXNseSBjYWxsZWQgaW4gdGhlIHNhbWUgY29tbWFuZCwKK2FuZCBpZiB0aGUgcGFzc3dvcmQgd2FzIGVudGVyZWQgaW4gdGhlIHByb21wdCwgOmNvbW1hbmQ6YHVwbG9hZGAgd2lsbCByZXVzZSB0aGUKK2VudGVyZWQgcGFzc3dvcmQuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBkbyBub3Qgd2FudCB0byBzdG9yZSBhIGNsZWFyIHRleHQKK3Bhc3N3b3JkIGluIHRoZSA6ZmlsZTpgJEhPTUUvLnB5cGlyY2AgZmlsZS4KKworWW91IGNhbiBzcGVjaWZ5IGFub3RoZXIgUHlQSSBzZXJ2ZXIgd2l0aCB0aGUgYGAtLXJlcG9zaXRvcnk9dXJsYGAgb3B0aW9uOjoKKworICAgIHB5dGhvbiBzZXR1cC5weSBzZGlzdCBiZGlzdF93aW5pbnN0IHVwbG9hZCAtciBodHRwOi8vZXhhbXBsZS5jb20vcHlwaQorCitTZWUgc2VjdGlvbiA6cmVmOmBweXBpcmNgIGZvciBtb3JlIG9uIGRlZmluaW5nIHNldmVyYWwgc2VydmVycy4KKworWW91IGNhbiB1c2UgdGhlIGBgLS1zaWduYGAgb3B0aW9uIHRvIHRlbGwgOmNvbW1hbmQ6YHVwbG9hZGAgdG8gc2lnbiBlYWNoCit1cGxvYWRlZCBmaWxlIHVzaW5nIEdQRyAoR05VIFByaXZhY3kgR3VhcmQpLiAgVGhlICA6cHJvZ3JhbTpgZ3BnYCBwcm9ncmFtIG11c3QKK2JlIGF2YWlsYWJsZSBmb3IgZXhlY3V0aW9uIG9uIHRoZSBzeXN0ZW0gOmVudnZhcjpgUEFUSGAuICBZb3UgY2FuIGFsc28gc3BlY2lmeQord2hpY2gga2V5IHRvIHVzZSBmb3Igc2lnbmluZyB1c2luZyB0aGUgYGAtLWlkZW50aXR5PW5hbWVgYCBvcHRpb24uCisKK090aGVyIDpjb21tYW5kOmB1cGxvYWRgIG9wdGlvbnMgaW5jbHVkZSBgYC0tcmVwb3NpdG9yeT11cmxgYCBvcgorYGAtLXJlcG9zaXRvcnk9c2VjdGlvbmBgIHdoZXJlICp1cmwqIGlzIHRoZSB1cmwgb2YgdGhlIHNlcnZlciBhbmQKKypzZWN0aW9uKiB0aGUgbmFtZSBvZiB0aGUgc2VjdGlvbiBpbiA6ZmlsZTpgJEhPTUUvLnB5cGlyY2AsIGFuZAorYGAtLXNob3ctcmVzcG9uc2VgYCAod2hpY2ggZGlzcGxheXMgdGhlIGZ1bGwgcmVzcG9uc2UgdGV4dCBmcm9tIHRoZSBQeVBJCitzZXJ2ZXIgZm9yIGhlbHAgaW4gZGVidWdnaW5nIHVwbG9hZCBwcm9ibGVtcykuCisKKworLi4gaW5kZXg6OgorICAgc2luZ2xlOiAucHlwaXJjIGZpbGUKKyAgIHNpbmdsZTogUHl0aG9uIFBhY2thZ2UgSW5kZXggKFB5UEkpOyAucHlwaXJjIGZpbGUKKwogLi4gX3B5cGlyYzoKIAogVGhlIC5weXBpcmMgZmlsZQpAQCAtMTAyLDMgKzE3MSw0NSBAQAogbWF5IGFsc28gYmUgdXNlZDo6CiAKICAgICBweXRob24gc2V0dXAucHkgcmVnaXN0ZXIgLXIgb3RoZXIKKworCisuLiBfcGFja2FnZS1kaXNwbGF5OgorCitQeVBJIHBhY2thZ2UgZGlzcGxheQorPT09PT09PT09PT09PT09PT09PT0KKworVGhlIGBgbG9uZ19kZXNjcmlwdGlvbmBgIGZpZWxkIHBsYXlzIGEgc3BlY2lhbCByb2xlIGF0IFB5UEkuIEl0IGlzIHVzZWQgYnkKK3RoZSBzZXJ2ZXIgdG8gZGlzcGxheSBhIGhvbWUgcGFnZSBmb3IgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZS4KKworSWYgeW91IHVzZSB0aGUgYHJlU3RydWN0dXJlZFRleHQgPGh0dHA6Ly9kb2N1dGlscy5zb3VyY2Vmb3JnZS5uZXQvcnN0Lmh0bWw+YF8KK3N5bnRheCBmb3IgdGhpcyBmaWVsZCwgUHlQSSB3aWxsIHBhcnNlIGl0IGFuZCBkaXNwbGF5IGFuIEhUTUwgb3V0cHV0IGZvcgordGhlIHBhY2thZ2UgaG9tZSBwYWdlLgorCitUaGUgYGBsb25nX2Rlc2NyaXB0aW9uYGAgZmllbGQgY2FuIGJlIGF0dGFjaGVkIHRvIGEgdGV4dCBmaWxlIGxvY2F0ZWQKK2luIHRoZSBwYWNrYWdlOjoKKworICAgIGZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwCisKKyAgICB3aXRoIG9wZW4oJ1JFQURNRS50eHQnKSBhcyBmaWxlOgorICAgICAgICBsb25nX2Rlc2NyaXB0aW9uID0gZmlsZS5yZWFkKCkKKworICAgIHNldHVwKG5hbWU9J0Rpc3R1dGlscycsCisgICAgICAgICAgbG9uZ19kZXNjcmlwdGlvbj1sb25nX2Rlc2NyaXB0aW9uKQorCitJbiB0aGF0IGNhc2UsIDpmaWxlOmBSRUFETUUudHh0YCBpcyBhIHJlZ3VsYXIgcmVTdHJ1Y3R1cmVkVGV4dCB0ZXh0IGZpbGUgbG9jYXRlZAoraW4gdGhlIHJvb3Qgb2YgdGhlIHBhY2thZ2UgYmVzaWRlcyA6ZmlsZTpgc2V0dXAucHlgLgorCitUbyBwcmV2ZW50IHJlZ2lzdGVyaW5nIGJyb2tlbiByZVN0cnVjdHVyZWRUZXh0IGNvbnRlbnQsIHlvdSBjYW4gdXNlIHRoZQorOnByb2dyYW06YHJzdDJodG1sYCBwcm9ncmFtIHRoYXQgaXMgcHJvdmlkZWQgYnkgdGhlIDptb2Q6YGRvY3V0aWxzYCBwYWNrYWdlIGFuZAorY2hlY2sgdGhlIGBgbG9uZ19kZXNjcmlwdGlvbmBgIGZyb20gdGhlIGNvbW1hbmQgbGluZTo6CisKKyAgICAkIHB5dGhvbiBzZXR1cC5weSAtLWxvbmctZGVzY3JpcHRpb24gfCByc3QyaHRtbC5weSA+IG91dHB1dC5odG1sCisKKzptb2Q6YGRvY3V0aWxzYCB3aWxsIGRpc3BsYXkgYSB3YXJuaW5nIGlmIHRoZXJlJ3Mgc29tZXRoaW5nIHdyb25nIHdpdGggeW91cgorc3ludGF4LiAgQmVjYXVzZSBQeVBJIGFwcGxpZXMgYWRkaXRpb25hbCBjaGVja3MgKGUuZy4gYnkgcGFzc2luZyBgYC0tbm8tcmF3YGAKK3RvIGBgcnN0Mmh0bWwucHlgYCBpbiB0aGUgY29tbWFuZCBhYm92ZSksIGJlaW5nIGFibGUgdG8gcnVuIHRoZSBjb21tYW5kIGFib3ZlCit3aXRob3V0IHdhcm5pbmdzIGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IFB5UEkgd2lsbCBjb252ZXJ0IHRoZSBjb250ZW50CitzdWNjZXNzZnVsbHkuCisKKworLi4gX1B5dGhvbiBQYWNrYWdlIEluZGV4IChQeVBJKTogaHR0cDovL3B5cGkucHl0aG9uLm9yZy8KZGlmZiAtLWdpdCBhL0RvYy9kaXN0dXRpbHMvc2V0dXBzY3JpcHQucnN0IGIvRG9jL2Rpc3R1dGlscy9zZXR1cHNjcmlwdC5yc3QKaW5kZXggY2NlNzhiMC4uMTVmMTMwZiAxMDA2NDQKLS0tIGEvRG9jL2Rpc3R1dGlscy9zZXR1cHNjcmlwdC5yc3QKKysrIGIvRG9jL2Rpc3R1dGlscy9zZXR1cHNjcmlwdC5yc3QKQEAgLTEzOSw3ICsxMzksOCBAQAogCiBBbGwgb2YgdGhpcyBpcyBkb25lIHRocm91Z2ggYW5vdGhlciBrZXl3b3JkIGFyZ3VtZW50IHRvIDpmdW5jOmBzZXR1cGAsIHRoZQogOm9wdGlvbjpgZXh0X21vZHVsZXNgIG9wdGlvbi4gIDpvcHRpb246YGV4dF9tb2R1bGVzYCBpcyBqdXN0IGEgbGlzdCBvZgotOmNsYXNzOmBFeHRlbnNpb25gIGluc3RhbmNlcywgZWFjaCBvZiB3aGljaCBkZXNjcmliZXMgYSBzaW5nbGUgZXh0ZW5zaW9uIG1vZHVsZS4KKzpjbGFzczpgfmRpc3R1dGlscy5jb3JlLkV4dGVuc2lvbmAgaW5zdGFuY2VzLCBlYWNoIG9mIHdoaWNoIGRlc2NyaWJlcyBhCitzaW5nbGUgZXh0ZW5zaW9uIG1vZHVsZS4KIFN1cHBvc2UgeW91ciBkaXN0cmlidXRpb24gaW5jbHVkZXMgYSBzaW5nbGUgZXh0ZW5zaW9uLCBjYWxsZWQgOm1vZDpgZm9vYCBhbmQKIGltcGxlbWVudGVkIGJ5IDpmaWxlOmBmb28uY2AuICBJZiBubyBhZGRpdGlvbmFsIGluc3RydWN0aW9ucyB0byB0aGUKIGNvbXBpbGVyL2xpbmtlciBhcmUgbmVlZGVkLCBkZXNjcmliaW5nIHRoaXMgZXh0ZW5zaW9uIGlzIHF1aXRlIHNpbXBsZTo6CkBAIC0xNjUsOCArMTY2LDggQEAKIEV4dGVuc2lvbiBuYW1lcyBhbmQgcGFja2FnZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotVGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSA6Y2xhc3M6YEV4dGVuc2lvbmAgY29uc3RydWN0b3IgaXMgYWx3YXlzIHRoZSBuYW1lIG9mCi10aGUgZXh0ZW5zaW9uLCBpbmNsdWRpbmcgYW55IHBhY2thZ2UgbmFtZXMuICBGb3IgZXhhbXBsZSwgOjoKK1RoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgOmNsYXNzOmB+ZGlzdHV0aWxzLmNvcmUuRXh0ZW5zaW9uYCBjb25zdHJ1Y3RvciBpcworYWx3YXlzIHRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24sIGluY2x1ZGluZyBhbnkgcGFja2FnZSBuYW1lcy4gIEZvciBleGFtcGxlLCA6OgogCiAgICAgRXh0ZW5zaW9uKCdmb28nLCBbJ3NyYy9mb28xLmMnLCAnc3JjL2ZvbzIuYyddKQogCkBAIC0xOTYsNyArMTk3LDggQEAKIEV4dGVuc2lvbiBzb3VyY2UgZmlsZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotVGhlIHNlY29uZCBhcmd1bWVudCB0byB0aGUgOmNsYXNzOmBFeHRlbnNpb25gIGNvbnN0cnVjdG9yIGlzIGEgbGlzdCBvZiBzb3VyY2UKK1RoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIDpjbGFzczpgfmRpc3R1dGlscy5jb3JlLkV4dGVuc2lvbmAgY29uc3RydWN0b3IgaXMKK2EgbGlzdCBvZiBzb3VyY2UKIGZpbGVzLiAgU2luY2UgdGhlIERpc3R1dGlscyBjdXJyZW50bHkgb25seSBzdXBwb3J0IEMsIEMrKywgYW5kIE9iamVjdGl2ZS1DCiBleHRlbnNpb25zLCB0aGVzZSBhcmUgbm9ybWFsbHkgQy9DKysvT2JqZWN0aXZlLUMgc291cmNlIGZpbGVzLiAgKEJlIHN1cmUgdG8gdXNlCiBhcHByb3ByaWF0ZSBleHRlbnNpb25zIHRvIGRpc3Rpbmd1aXNoIEMrK1wgc291cmNlIGZpbGVzOiA6ZmlsZTpgLmNjYCBhbmQKQEAgLTIzMiw5ICsyMzQsOSBAQAogUHJlcHJvY2Vzc29yIG9wdGlvbnMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVRocmVlIG9wdGlvbmFsIGFyZ3VtZW50cyB0byA6Y2xhc3M6YEV4dGVuc2lvbmAgd2lsbCBoZWxwIGlmIHlvdSBuZWVkIHRvIHNwZWNpZnkKLWluY2x1ZGUgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIG9yIHByZXByb2Nlc3NvciBtYWNyb3MgdG8gZGVmaW5lL3VuZGVmaW5lOgotYGBpbmNsdWRlX2RpcnNgYCwgYGBkZWZpbmVfbWFjcm9zYGAsIGFuZCBgYHVuZGVmX21hY3Jvc2BgLgorVGhyZWUgb3B0aW9uYWwgYXJndW1lbnRzIHRvIDpjbGFzczpgfmRpc3R1dGlscy5jb3JlLkV4dGVuc2lvbmAgd2lsbCBoZWxwIGlmCit5b3UgbmVlZCB0byBzcGVjaWZ5IGluY2x1ZGUgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIG9yIHByZXByb2Nlc3NvciBtYWNyb3MgdG8KK2RlZmluZS91bmRlZmluZTogYGBpbmNsdWRlX2RpcnNgYCwgYGBkZWZpbmVfbWFjcm9zYGAsIGFuZCBgYHVuZGVmX21hY3Jvc2BgLgogCiBGb3IgZXhhbXBsZSwgaWYgeW91ciBleHRlbnNpb24gcmVxdWlyZXMgaGVhZGVyIGZpbGVzIGluIHRoZSA6ZmlsZTpgaW5jbHVkZWAKIGRpcmVjdG9yeSB1bmRlciB5b3VyIGRpc3RyaWJ1dGlvbiByb290LCB1c2UgdGhlIGBgaW5jbHVkZV9kaXJzYGAgb3B0aW9uOjoKQEAgLTMzNCwxMCArMzM2LDYgQEAKIAogVGhlcmUgYXJlIHN0aWxsIHNvbWUgb3RoZXIgb3B0aW9ucyB3aGljaCBjYW4gYmUgdXNlZCB0byBoYW5kbGUgc3BlY2lhbCBjYXNlcy4KIAotVGhlIDpvcHRpb246YG9wdGlvbmFsYCBvcHRpb24gaXMgYSBib29sZWFuOyBpZiBpdCBpcyB0cnVlLAotYSBidWlsZCBmYWlsdXJlIGluIHRoZSBleHRlbnNpb24gd2lsbCBub3QgYWJvcnQgdGhlIGJ1aWxkIHByb2Nlc3MsIGJ1dAotaW5zdGVhZCBzaW1wbHkgbm90IGluc3RhbGwgdGhlIGZhaWxpbmcgZXh0ZW5zaW9uLgotCiBUaGUgOm9wdGlvbjpgZXh0cmFfb2JqZWN0c2Agb3B0aW9uIGlzIGEgbGlzdCBvZiBvYmplY3QgZmlsZXMgdG8gYmUgcGFzc2VkIHRvIHRoZQogbGlua2VyLiBUaGVzZSBmaWxlcyBtdXN0IG5vdCBoYXZlIGV4dGVuc2lvbnMsIGFzIHRoZSBkZWZhdWx0IGV4dGVuc2lvbiBmb3IgdGhlCiBjb21waWxlciBpcyB1c2VkLgpAQCAtNjAyLDcgKzYwMCw4IEBACiAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB2ZXJzaW9ucyB0YWtlIHRoZSBmb3JtICptYWpvci5taW5vclsucGF0Y2hbLnN1Yl1dKi4KIAogKDMpCi0gICAgRWl0aGVyIHRoZSBhdXRob3Igb3IgdGhlIG1haW50YWluZXIgbXVzdCBiZSBpZGVudGlmaWVkLgorICAgIEVpdGhlciB0aGUgYXV0aG9yIG9yIHRoZSBtYWludGFpbmVyIG11c3QgYmUgaWRlbnRpZmllZC4gSWYgbWFpbnRhaW5lciBpcworICAgIHByb3ZpZGVkLCBkaXN0dXRpbHMgbGlzdHMgaXQgYXMgdGhlIGF1dGhvciBpbiA6ZmlsZTpgUEtHLUlORk9gLgogCiAoNCkKICAgICBUaGVzZSBmaWVsZHMgc2hvdWxkIG5vdCBiZSB1c2VkIGlmIHlvdXIgcGFja2FnZSBpcyB0byBiZSBjb21wYXRpYmxlIHdpdGggUHl0aG9uCkBAIC02MTAsOCArNjA5LDkgQEAKICAgICA8aHR0cDovL3B5cGkucHl0aG9uLm9yZy9weXBpPmBfLgogCiAoNSkKLSAgICBUaGUgYGBsb25nX2Rlc2NyaXB0aW9uYGAgZmllbGQgaXMgdXNlZCBieSBQeVBJIHdoZW4geW91IGFyZSByZWdpc3RlcmluZyBhCi0gICAgcGFja2FnZSwgdG8gYnVpbGQgaXRzIGhvbWUgcGFnZS4KKyAgICBUaGUgYGBsb25nX2Rlc2NyaXB0aW9uYGAgZmllbGQgaXMgdXNlZCBieSBQeVBJIHdoZW4geW91IGFyZQorICAgIDpyZWY6YHJlZ2lzdGVyaW5nIDxwYWNrYWdlLXJlZ2lzdGVyPmAgYSBwYWNrYWdlLCB0bworICAgIDpyZWY6YGJ1aWxkIGl0cyBob21lIHBhZ2UgPHBhY2thZ2UtZGlzcGxheT5gLgogCiAoNikKICAgICBUaGUgYGBsaWNlbnNlYGAgZmllbGQgaXMgYSB0ZXh0IGluZGljYXRpbmcgdGhlIGxpY2Vuc2UgY292ZXJpbmcgdGhlCkBAIC02ODQsNiArNjg0LDggQEAKICAgICAgICAgRGlzdHJpYnV0aW9uTWV0YWRhdGEuZG93bmxvYWRfdXJsID0gTm9uZQogCiAKKy4uIF9kZWJ1Zy1zZXR1cC1zY3JpcHQ6CisKIERlYnVnZ2luZyB0aGUgc2V0dXAgc2NyaXB0CiA9PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC02OTksNyArNzAxLDggQEAKIGFuZCBzZWUgdGhhdCBpdCdzIGEgcGVybWlzc2lvbiBwcm9ibGVtLgogCiBPbiB0aGUgb3RoZXIgaGFuZCwgdGhpcyBkb2Vzbid0IGhlbHAgdGhlIGRldmVsb3BlciB0byBmaW5kIHRoZSBjYXVzZSBvZiB0aGUKLWZhaWx1cmUuIEZvciB0aGlzIHB1cnBvc2UsIHRoZSBESVNUVVRJTFNfREVCVUcgZW52aXJvbm1lbnQgdmFyaWFibGUgY2FuIGJlIHNldAorZmFpbHVyZS4gRm9yIHRoaXMgcHVycG9zZSwgdGhlIDplbnZ2YXI6YERJU1RVVElMU19ERUJVR2AgZW52aXJvbm1lbnQgdmFyaWFibGUgY2FuIGJlIHNldAogdG8gYW55dGhpbmcgZXhjZXB0IGFuIGVtcHR5IHN0cmluZywgYW5kIGRpc3R1dGlscyB3aWxsIG5vdyBwcmludCBkZXRhaWxlZAotaW5mb3JtYXRpb24gd2hhdCBpdCBpcyBkb2luZywgYW5kIHByaW50cyB0aGUgZnVsbCB0cmFjZWJhY2sgaW4gY2FzZSBhbiBleGNlcHRpb24KLW9jY3Vycy4KK2luZm9ybWF0aW9uIGFib3V0IHdoYXQgaXQgaXMgZG9pbmcsIGR1bXAgdGhlIGZ1bGwgdHJhY2ViYWNrIHdoZW4gYW4gZXhjZXB0aW9uCitvY2N1cnMsIGFuZCBwcmludCB0aGUgd2hvbGUgY29tbWFuZCBsaW5lIHdoZW4gYW4gZXh0ZXJuYWwgcHJvZ3JhbSAobGlrZSBhIEMKK2NvbXBpbGVyKSBmYWlscy4KZGlmZiAtLWdpdCBhL0RvYy9kaXN0dXRpbHMvc291cmNlZGlzdC5yc3QgYi9Eb2MvZGlzdHV0aWxzL3NvdXJjZWRpc3QucnN0CmluZGV4IGE5ODU4ZDAuLmIxNjk1YTIgMTAwNjQ0Ci0tLSBhL0RvYy9kaXN0dXRpbHMvc291cmNlZGlzdC5yc3QKKysrIGIvRG9jL2Rpc3R1dGlscy9zb3VyY2VkaXN0LnJzdApAQCAtNTEsOCArNTEsNyBAQAogICAgb2YgdGhlIHN0YW5kYXJkIFB5dGhvbiBsaWJyYXJ5IHNpbmNlIFB5dGhvbiAxLjYpCiAKICg0KQotICAgcmVxdWlyZXMgdGhlIDpwcm9ncmFtOmBjb21wcmVzc2AgcHJvZ3JhbS4gTm90aWNlIHRoYXQgdGhpcyBmb3JtYXQgaXMgbm93Ci0gICBwZW5kaW5nIGZvciBkZXByZWNhdGlvbiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUgdmVyc2lvbnMgb2YgUHl0aG9uLgorICAgcmVxdWlyZXMgdGhlIDpwcm9ncmFtOmBjb21wcmVzc2AgcHJvZ3JhbS4KIAogV2hlbiB1c2luZyBhbnkgYGB0YXJgYCBmb3JtYXQgKGBgZ3p0YXJgYCwgYGBienRhcmBgLCBgYHp0YXJgYCBvcgogYGB0YXJgYCkgdW5kZXIgVW5peCwgeW91IGNhbiBzcGVjaWZ5IHRoZSBgYG93bmVyYGAgYW5kIGBgZ3JvdXBgYCBuYW1lcwpkaWZmIC0tZ2l0IGEvRG9jL2Rpc3R1dGlscy91cGxvYWRpbmcucnN0IGIvRG9jL2Rpc3R1dGlscy91cGxvYWRpbmcucnN0CmluZGV4IDkzNjQwMmIuLjRiY2U2OTkgMTAwNjQ0Ci0tLSBhL0RvYy9kaXN0dXRpbHMvdXBsb2FkaW5nLnJzdAorKysgYi9Eb2MvZGlzdHV0aWxzL3VwbG9hZGluZy5yc3QKQEAgLTEsNzcgKzEsNyBAQAotLi4gX3BhY2thZ2UtdXBsb2FkOgorOm9ycGhhbjoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBVcGxvYWRpbmcgUGFja2FnZXMgdG8gdGhlIFBhY2thZ2UgSW5kZXgKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0uLiB2ZXJzaW9uYWRkZWQ6OiAyLjUKLQotVGhlIFB5dGhvbiBQYWNrYWdlIEluZGV4IChQeVBJKSBub3Qgb25seSBzdG9yZXMgdGhlIHBhY2thZ2UgaW5mbywgYnV0IGFsc28gIHRoZQotcGFja2FnZSBkYXRhIGlmIHRoZSBhdXRob3Igb2YgdGhlIHBhY2thZ2Ugd2lzaGVzIHRvLiBUaGUgZGlzdHV0aWxzIGNvbW1hbmQKLTpjb21tYW5kOmB1cGxvYWRgIHB1c2hlcyB0aGUgZGlzdHJpYnV0aW9uIGZpbGVzIHRvIFB5UEkuCi0KLVRoZSBjb21tYW5kIGlzIGludm9rZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgYnVpbGRpbmcgb25lIG9yIG1vcmUgZGlzdHJpYnV0aW9uCi1maWxlcy4gIEZvciBleGFtcGxlLCB0aGUgY29tbWFuZCA6OgotCi0gICAgcHl0aG9uIHNldHVwLnB5IHNkaXN0IGJkaXN0X3dpbmluc3QgdXBsb2FkCi0KLXdpbGwgY2F1c2UgdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gYW5kIHRoZSBXaW5kb3dzIGluc3RhbGxlciB0byBiZSB1cGxvYWRlZCB0bwotUHlQSS4gIE5vdGUgdGhhdCB0aGVzZSB3aWxsIGJlIHVwbG9hZGVkIGV2ZW4gaWYgdGhleSBhcmUgYnVpbHQgdXNpbmcgYW4gZWFybGllcgotaW52b2NhdGlvbiBvZiA6ZmlsZTpgc2V0dXAucHlgLCBidXQgdGhhdCBvbmx5IGRpc3RyaWJ1dGlvbnMgbmFtZWQgb24gdGhlIGNvbW1hbmQKLWxpbmUgZm9yIHRoZSBpbnZvY2F0aW9uIGluY2x1ZGluZyB0aGUgOmNvbW1hbmQ6YHVwbG9hZGAgY29tbWFuZCBhcmUgdXBsb2FkZWQuCi0KLVRoZSA6Y29tbWFuZDpgdXBsb2FkYCBjb21tYW5kIHVzZXMgdGhlIHVzZXJuYW1lLCBwYXNzd29yZCwgYW5kIHJlcG9zaXRvcnkgVVJMCi1mcm9tIHRoZSA6ZmlsZTpgJEhPTUUvLnB5cGlyY2AgZmlsZSAoc2VlIHNlY3Rpb24gOnJlZjpgcHlwaXJjYCBmb3IgbW9yZSBvbiB0aGlzCi1maWxlKS4gSWYgYSA6Y29tbWFuZDpgcmVnaXN0ZXJgIGNvbW1hbmQgd2FzIHByZXZpb3VzbHkgY2FsbGVkIGluIHRoZSBzYW1lIGNvbW1hbmQsCi1hbmQgaWYgdGhlIHBhc3N3b3JkIHdhcyBlbnRlcmVkIGluIHRoZSBwcm9tcHQsIDpjb21tYW5kOmB1cGxvYWRgIHdpbGwgcmV1c2UgdGhlCi1lbnRlcmVkIHBhc3N3b3JkLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgZG8gbm90IHdhbnQgdG8gc3RvcmUgYSBjbGVhciB0ZXh0Ci1wYXNzd29yZCBpbiB0aGUgOmZpbGU6YCRIT01FLy5weXBpcmNgIGZpbGUuCi0KLVlvdSBjYW4gc3BlY2lmeSBhbm90aGVyIFB5UEkgc2VydmVyIHdpdGggdGhlIDpvcHRpb246YC0tcmVwb3NpdG9yeT0qdXJsKmAgb3B0aW9uOjoKLQotICAgIHB5dGhvbiBzZXR1cC5weSBzZGlzdCBiZGlzdF93aW5pbnN0IHVwbG9hZCAtciBodHRwOi8vZXhhbXBsZS5jb20vcHlwaQotCi1TZWUgc2VjdGlvbiA6cmVmOmBweXBpcmNgIGZvciBtb3JlIG9uIGRlZmluaW5nIHNldmVyYWwgc2VydmVycy4KLQotWW91IGNhbiB1c2UgdGhlIDpvcHRpb246YC0tc2lnbmAgb3B0aW9uIHRvIHRlbGwgOmNvbW1hbmQ6YHVwbG9hZGAgdG8gc2lnbiBlYWNoCi11cGxvYWRlZCBmaWxlIHVzaW5nIEdQRyAoR05VIFByaXZhY3kgR3VhcmQpLiAgVGhlICA6cHJvZ3JhbTpgZ3BnYCBwcm9ncmFtIG11c3QKLWJlIGF2YWlsYWJsZSBmb3IgZXhlY3V0aW9uIG9uIHRoZSBzeXN0ZW0gOmVudnZhcjpgUEFUSGAuICBZb3UgY2FuIGFsc28gc3BlY2lmeQotd2hpY2gga2V5IHRvIHVzZSBmb3Igc2lnbmluZyB1c2luZyB0aGUgOm9wdGlvbjpgLS1pZGVudGl0eT0qbmFtZSpgIG9wdGlvbi4KLQotT3RoZXIgOmNvbW1hbmQ6YHVwbG9hZGAgb3B0aW9ucyBpbmNsdWRlIDpvcHRpb246YC0tcmVwb3NpdG9yeT08dXJsPmAgb3IKLTpvcHRpb246YC0tcmVwb3NpdG9yeT08c2VjdGlvbj5gIHdoZXJlICp1cmwqIGlzIHRoZSB1cmwgb2YgdGhlIHNlcnZlciBhbmQKLSpzZWN0aW9uKiB0aGUgbmFtZSBvZiB0aGUgc2VjdGlvbiBpbiA6ZmlsZTpgJEhPTUUvLnB5cGlyY2AsIGFuZAotOm9wdGlvbjpgLS1zaG93LXJlc3BvbnNlYCAod2hpY2ggZGlzcGxheXMgdGhlIGZ1bGwgcmVzcG9uc2UgdGV4dCBmcm9tIHRoZSBQeVBJCi1zZXJ2ZXIgZm9yIGhlbHAgaW4gZGVidWdnaW5nIHVwbG9hZCBwcm9ibGVtcykuCi0KLVB5UEkgcGFja2FnZSBkaXNwbGF5Ci09PT09PT09PT09PT09PT09PT09PQotCi1UaGUgYGBsb25nX2Rlc2NyaXB0aW9uYGAgZmllbGQgcGxheXMgYSBzcGVjaWFsIHJvbGUgYXQgUHlQSS4gSXQgaXMgdXNlZCBieQotdGhlIHNlcnZlciB0byBkaXNwbGF5IGEgaG9tZSBwYWdlIGZvciB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLgotCi1JZiB5b3UgdXNlIHRoZSBgcmVTdHJ1Y3R1cmVkVGV4dCA8aHR0cDovL2RvY3V0aWxzLnNvdXJjZWZvcmdlLm5ldC9yc3QuaHRtbD5gXwotc3ludGF4IGZvciB0aGlzIGZpZWxkLCBQeVBJIHdpbGwgcGFyc2UgaXQgYW5kIGRpc3BsYXkgYW4gSFRNTCBvdXRwdXQgZm9yCi10aGUgcGFja2FnZSBob21lIHBhZ2UuCi0KLVRoZSBgYGxvbmdfZGVzY3JpcHRpb25gYCBmaWVsZCBjYW4gYmUgYXR0YWNoZWQgdG8gYSB0ZXh0IGZpbGUgbG9jYXRlZAotaW4gdGhlIHBhY2thZ2U6OgotCi0gICAgZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAKLQotICAgIHdpdGggb3BlbignUkVBRE1FLnR4dCcpIGFzIGZpbGU6Ci0gICAgICAgIGxvbmdfZGVzY3JpcHRpb24gPSBmaWxlLnJlYWQoKQotCi0gICAgc2V0dXAobmFtZT0nRGlzdHV0aWxzJywKLSAgICAgICAgICBsb25nX2Rlc2NyaXB0aW9uPWxvbmdfZGVzY3JpcHRpb24pCi0KLUluIHRoYXQgY2FzZSwgOmZpbGU6YFJFQURNRS50eHRgIGlzIGEgcmVndWxhciByZVN0cnVjdHVyZWRUZXh0IHRleHQgZmlsZSBsb2NhdGVkCi1pbiB0aGUgcm9vdCBvZiB0aGUgcGFja2FnZSBiZXNpZGVzIDpmaWxlOmBzZXR1cC5weWAuCi0KLVRvIHByZXZlbnQgcmVnaXN0ZXJpbmcgYnJva2VuIHJlU3RydWN0dXJlZFRleHQgY29udGVudCwgeW91IGNhbiB1c2UgdGhlCi06cHJvZ3JhbTpgcnN0Mmh0bWxgIHByb2dyYW0gdGhhdCBpcyBwcm92aWRlZCBieSB0aGUgOm1vZDpgZG9jdXRpbHNgIHBhY2thZ2UKLWFuZCBjaGVjayB0aGUgYGBsb25nX2Rlc2NyaXB0aW9uYGAgZnJvbSB0aGUgY29tbWFuZCBsaW5lOjoKLQotICAgICQgcHl0aG9uIHNldHVwLnB5IC0tbG9uZy1kZXNjcmlwdGlvbiB8IHJzdDJodG1sLnB5ID4gb3V0cHV0Lmh0bWwKLQotOm1vZDpgZG9jdXRpbHNgIHdpbGwgZGlzcGxheSBhIHdhcm5pbmcgaWYgdGhlcmUncyBzb21ldGhpbmcgd3Jvbmcgd2l0aCB5b3VyIHN5bnRheC4KK1RoZSBjb250ZW50cyBvZiB0aGlzIHBhZ2UgaGF2ZSBtb3ZlZCB0byB0aGUgc2VjdGlvbiA6cmVmOmBwYWNrYWdlLWluZGV4YC4KZGlmZiAtLWdpdCBhL0RvYy9kb2N1bWVudGluZy9idWlsZGluZy5yc3QgYi9Eb2MvZG9jdW1lbnRpbmcvYnVpbGRpbmcucnN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzFjNmEwLi4wMDAwMDAwCi0tLSBhL0RvYy9kb2N1bWVudGluZy9idWlsZGluZy5yc3QKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi1CdWlsZGluZyB0aGUgZG9jdW1lbnRhdGlvbgotPT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotWW91IG5lZWQgdG8gaGF2ZSBQeXRob24gMi40IG9yIGhpZ2hlciBpbnN0YWxsZWQ7IHRoZSB0b29sc2V0IHVzZWQgdG8gYnVpbGQgdGhlCi1kb2NzIGlzIHdyaXR0ZW4gaW4gUHl0aG9uLiAgSXQgaXMgY2FsbGVkICpTcGhpbngqLCBpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhpcwotdHJlZSwgYnV0IG1haW50YWluZWQgc2VwYXJhdGVseS4gIEFsc28gbmVlZGVkIGFyZSB0aGUgZG9jdXRpbHMsIHN1cHBseWluZyB0aGUKLWJhc2UgbWFya3VwIHRoYXQgU3BoaW54IHVzZXMsIEppbmphLCBhIHRlbXBsYXRpbmcgZW5naW5lLCBhbmQgb3B0aW9uYWxseQotUHlnbWVudHMsIGEgY29kZSBoaWdobGlnaHRlci4KLQotCi1Vc2luZyBtYWtlCi0tLS0tLS0tLS0tCi0KLUx1Y2tpbHksIGEgTWFrZWZpbGUgaGFzIGJlZW4gcHJlcGFyZWQgc28gdGhhdCBvbiBVbml4LCBwcm92aWRlZCB5b3UgaGF2ZQotaW5zdGFsbGVkIFB5dGhvbiBhbmQgU3VidmVyc2lvbiwgeW91IGNhbiBqdXN0IHJ1biA6OgotCi0gICBjZCBEb2MKLSAgIG1ha2UgaHRtbAotCi10byBjaGVjayBvdXQgdGhlIG5lY2Vzc2FyeSB0b29sc2V0IGluIHRoZSA6ZmlsZTpgdG9vbHMvYCBzdWJkaXJlY3RvcnkgYW5kIGJ1aWxkCi10aGUgSFRNTCBvdXRwdXQgZmlsZXMuICBUbyB2aWV3IHRoZSBnZW5lcmF0ZWQgSFRNTCwgcG9pbnQgeW91ciBmYXZvcml0ZSBicm93c2VyCi1hdCB0aGUgdG9wLWxldmVsIGluZGV4IDpmaWxlOmBidWlsZC9odG1sL2luZGV4Lmh0bWxgIGFmdGVyIHJ1bm5pbmcgIm1ha2UiLgotCi1BdmFpbGFibGUgbWFrZSB0YXJnZXRzIGFyZToKLQotICogImh0bWwiLCB3aGljaCBidWlsZHMgc3RhbmRhbG9uZSBIVE1MIGZpbGVzIGZvciBvZmZsaW5lIHZpZXdpbmcuCi0KLSAqICJodG1saGVscCIsIHdoaWNoIGJ1aWxkcyBIVE1MIGZpbGVzIGFuZCBhIEhUTUwgSGVscCBwcm9qZWN0IGZpbGUgdXNhYmxlIHRvCi0gICBjb252ZXJ0IHRoZW0gaW50byBhIHNpbmdsZSBDb21waWxlZCBIVE1MICguY2htKSBmaWxlIC0tIHRoZXNlIGFyZSBwb3B1bGFyCi0gICB1bmRlciBNaWNyb3NvZnQgV2luZG93cywgYnV0IHZlcnkgaGFuZHkgb24gZXZlcnkgcGxhdGZvcm0uCi0KLSAgIFRvIGNyZWF0ZSB0aGUgQ0hNIGZpbGUsIHlvdSBuZWVkIHRvIHJ1biB0aGUgTWljcm9zb2Z0IEhUTUwgSGVscCBXb3Jrc2hvcAotICAgb3ZlciB0aGUgZ2VuZXJhdGVkIHByb2plY3QgKC5oaHApIGZpbGUuCi0KLSAqICJsYXRleCIsIHdoaWNoIGJ1aWxkcyBMYVRlWCBzb3VyY2UgZmlsZXMgYXMgaW5wdXQgdG8gInBkZmxhdGV4IiB0byBwcm9kdWNlCi0gICBQREYgZG9jdW1lbnRzLgotCi0gKiAidGV4dCIsIHdoaWNoIGJ1aWxkcyBhIHBsYWluIHRleHQgZmlsZSBmb3IgZWFjaCBzb3VyY2UgZmlsZS4KLQotICogImxpbmtjaGVjayIsIHdoaWNoIGNoZWNrcyBhbGwgZXh0ZXJuYWwgcmVmZXJlbmNlcyB0byBzZWUgd2hldGhlciB0aGV5IGFyZQotICAgYnJva2VuLCByZWRpcmVjdGVkIG9yIG1hbGZvcm1lZCwgYW5kIG91dHB1dHMgdGhpcyBpbmZvcm1hdGlvbiB0byBzdGRvdXQKLSAgIGFzIHdlbGwgYXMgYSBwbGFpbi10ZXh0ICgudHh0KSBmaWxlLgotCi0gKiAiY2hhbmdlcyIsIHdoaWNoIGJ1aWxkcyBhbiBvdmVydmlldyBvdmVyIGFsbCB2ZXJzaW9uYWRkZWQvdmVyc2lvbmNoYW5nZWQvCi0gICBkZXByZWNhdGVkIGl0ZW1zIGluIHRoZSBjdXJyZW50IHZlcnNpb24uIFRoaXMgaXMgbWVhbnQgYXMgYSBoZWxwIGZvciB0aGUKLSAgIHdyaXRlciBvZiB0aGUgIldoYXQncyBOZXciIGRvY3VtZW50LgotCi0gKiAiY292ZXJhZ2UiLCB3aGljaCBidWlsZHMgYSBjb3ZlcmFnZSBvdmVydmlldyBmb3Igc3RhbmRhcmQgbGlicmFyeSBtb2R1bGVzCi0gICBhbmQgQyBBUEkuCi0KLSAqICJweWRvYy10b3BpY3MiLCB3aGljaCBidWlsZHMgYSBQeXRob24gbW9kdWxlIGNvbnRhaW5pbmcgYSBkaWN0aW9uYXJ5IHdpdGgKLSAgIHBsYWluIHRleHQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGxhYmVscyBkZWZpbmVkIGluCi0gICA6ZmlsZTpgdG9vbHMvc3BoaW54ZXh0L3B5c3BlY2lmaWMucHlgIC0tIHB5ZG9jIG5lZWRzIHRoZXNlIHRvIHNob3cgdG9waWMgYW5kCi0gICBrZXl3b3JkIGhlbHAuCi0KLUEgIm1ha2UgdXBkYXRlIiB1cGRhdGVzIHRoZSBTdWJ2ZXJzaW9uIGNoZWNrb3V0cyBpbiA6ZmlsZTpgdG9vbHMvYC4KLQotCi1XaXRob3V0IG1ha2UKLS0tLS0tLS0tLS0tLQotCi1Zb3UnbGwgbmVlZCB0byBpbnN0YWxsIHRoZSBTcGhpbnggcGFja2FnZSwgZWl0aGVyIGJ5IGNoZWNraW5nIGl0IG91dCB2aWEgOjoKLQotICAgc3ZuIGNvIGh0dHA6Ly9zdm4ucHl0aG9uLm9yZy9wcm9qZWN0cy9leHRlcm5hbC9TcGhpbngtMC42LjUvc3BoaW54IHRvb2xzL3NwaGlueAotCi1vciBieSBpbnN0YWxsaW5nIGl0IGZyb20gUHlQSS4KLQotVGhlbiwgeW91IG5lZWQgdG8gaW5zdGFsbCBEb2N1dGlscywgZWl0aGVyIGJ5IGNoZWNraW5nIGl0IG91dCB2aWEgOjoKLQotICAgc3ZuIGNvIGh0dHA6Ly9zdm4ucHl0aG9uLm9yZy9wcm9qZWN0cy9leHRlcm5hbC9kb2N1dGlscy0wLjYvZG9jdXRpbHMgdG9vbHMvZG9jdXRpbHMKLQotb3IgYnkgaW5zdGFsbGluZyBpdCBmcm9tIGh0dHA6Ly9kb2N1dGlscy5zZi5uZXQvLgotCi1Zb3UgYWxzbyBuZWVkIEppbmphMiwgZWl0aGVyIGJ5IGNoZWNraW5nIGl0IG91dCB2aWEgOjoKLQotICAgc3ZuIGNvIGh0dHA6Ly9zdm4ucHl0aG9uLm9yZy9wcm9qZWN0cy9leHRlcm5hbC9KaW5qYS0yLjMuMS9qaW5qYTIgdG9vbHMvamluamEyCi0KLW9yIGJ5IGluc3RhbGxpbmcgaXQgZnJvbSBQeVBJLgotCi1Zb3UgY2FuIG9wdGlvbmFsbHkgYWxzbyBpbnN0YWxsIFB5Z21lbnRzLCBlaXRoZXIgYXMgYSBjaGVja291dCB2aWEgOjoKLQotICAgc3ZuIGNvIGh0dHA6Ly9zdm4ucHl0aG9uLm9yZy9wcm9qZWN0cy9leHRlcm5hbC9QeWdtZW50cy0xLjMuMS9weWdtZW50cyB0b29scy9weWdtZW50cwotCi1vciBmcm9tIFB5UEkgYXQgaHR0cDovL3B5cGkucHl0aG9uLm9yZy9weXBpL1B5Z21lbnRzLgotCi0KLVRoZW4sIG1ha2UgYW4gb3V0cHV0IGRpcmVjdG9yeSwgZS5nLiB1bmRlciBgYnVpbGQvYCwgYW5kIHJ1biA6OgotCi0gICBweXRob24gdG9vbHMvc3BoaW54LWJ1aWxkLnB5IC1iPGJ1aWxkZXI+IC4gYnVpbGQvPG91dHB1dGRpcmVjdG9yeT4KLQotd2hlcmUgYDxidWlsZGVyPmAgaXMgb25lIG9mIGh0bWwsIHRleHQsIGxhdGV4LCBvciBodG1saGVscCAoZm9yIGV4cGxhbmF0aW9ucyBzZWUKLXRoZSBtYWtlIHRhcmdldHMgYWJvdmUpLgpkaWZmIC0tZ2l0IGEvRG9jL2RvY3VtZW50aW5nL2Zyb21sYXRleC5yc3QgYi9Eb2MvZG9jdW1lbnRpbmcvZnJvbWxhdGV4LnJzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE2NTI0YS4uMDAwMDAwMAotLS0gYS9Eb2MvZG9jdW1lbnRpbmcvZnJvbWxhdGV4LnJzdAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0uLiBoaWdobGlnaHRsYW5nOjogcmVzdAotCi1EaWZmZXJlbmNlcyB0byB0aGUgTGFUZVggbWFya3VwCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRob3VnaCB0aGUgbWFya3VwIGxhbmd1YWdlIGlzIGRpZmZlcmVudCwgbW9zdCBvZiB0aGUgY29uY2VwdHMgYW5kIG1hcmt1cCB0eXBlcwotb2YgdGhlIG9sZCBMYVRlWCBkb2NzIGhhdmUgYmVlbiBrZXB0IC0tIGVudmlyb25tZW50cyBhcyByZVNUIGRpcmVjdGl2ZXMsIGlubGluZQotY29tbWFuZHMgYXMgcmVTVCByb2xlcyBhbmQgc28gZm9ydGguCi0KLUhvd2V2ZXIsIHRoZXJlIGFyZSBzb21lIGRpZmZlcmVuY2VzIGluIHRoZSB3YXkgdGhlc2Ugd29yaywgcGFydGx5IGR1ZSB0byB0aGUKLWRpZmZlcmVuY2VzIGluIHRoZSBtYXJrdXAgbGFuZ3VhZ2VzLCBwYXJ0bHkgZHVlIHRvIGltcHJvdmVtZW50cyBpbiBTcGhpbnguICBUaGlzCi1zZWN0aW9uIGxpc3RzIHRoZXNlIGRpZmZlcmVuY2VzLCBpbiBvcmRlciB0byBnaXZlIHRob3NlIGZhbWlsaWFyIHdpdGggdGhlIG9sZAotZm9ybWF0IGEgcXVpY2sgb3ZlcnZpZXcgb2Ygd2hhdCB0aGV5IG1pZ2h0IHJ1biBpbnRvLgotCi1JbmxpbmUgbWFya3VwCi0tLS0tLS0tLS0tLS0tCi0KLVRoZXNlIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdG8gaW5saW5lIG1hcmt1cDoKLQotKiAqKkNyb3NzLXJlZmVyZW5jZSByb2xlcyoqCi0KLSAgTW9zdCBvZiB0aGUgZm9sbG93aW5nIHNlbWFudGljIHJvbGVzIGV4aXN0ZWQgcHJldmlvdXNseSBhcyBpbmxpbmUgY29tbWFuZHMsCi0gIGJ1dCBkaWRuJ3QgZG8gYW55dGhpbmcgZXhjZXB0IGZvcm1hdHRpbmcgdGhlIGNvbnRlbnQgYXMgY29kZS4gIE5vdywgdGhleQotICBjcm9zcy1yZWZlcmVuY2UgdG8ga25vd24gdGFyZ2V0cyAoc29tZSBuYW1lcyBoYXZlIGFsc28gYmVlbiBzaG9ydGVuZWQpOgotCi0gIHwgKm1vZCogKHByZXZpb3VzbHkgKnJlZm1vZHVsZSogb3IgKm1vZHVsZSopCi0gIHwgKmZ1bmMqIChwcmV2aW91c2x5ICpmdW5jdGlvbiopCi0gIHwgKmRhdGEqIChuZXcpCi0gIHwgKmNvbnN0KgotICB8ICpjbGFzcyoKLSAgfCAqbWV0aCogKHByZXZpb3VzbHkgKm1ldGhvZCopCi0gIHwgKmF0dHIqIChwcmV2aW91c2x5ICptZW1iZXIqKQotICB8ICpleGMqIChwcmV2aW91c2x5ICpleGNlcHRpb24qKQotICB8ICpjZGF0YSoKLSAgfCAqY2Z1bmMqIChwcmV2aW91c2x5ICpjZnVuY3Rpb24qKQotICB8ICpjbWFjcm8qIChwcmV2aW91c2x5ICpjc2ltcGxlbWFjcm8qKQotICB8ICpjdHlwZSoKLQotICBBbHNvIGRpZmZlcmVudCBpcyB0aGUgaGFuZGxpbmcgb2YgKmZ1bmMqIGFuZCAqbWV0aCo6IHdoaWxlIHByZXZpb3VzbHkKLSAgcGFyZW50aGVzZXMgd2VyZSBhZGRlZCB0byB0aGUgY2FsbGFibGUgbmFtZSAobGlrZSBgYFxmdW5je3N0cigpfWBgKSwgdGhleSBhcmUKLSAgbm93IGFwcGVuZGVkIGJ5IHRoZSBidWlsZCBzeXN0ZW0gLS0gYXBwZW5kaW5nIHRoZW0gaW4gdGhlIHNvdXJjZSB3aWxsIHJlc3VsdAotICBpbiBkb3VibGUgcGFyZW50aGVzZXMuICBUaGlzIGFsc28gbWVhbnMgdGhhdCBgYDpmdW5jOmBzdHIob2JqZWN0KWBgYCB3aWxsIG5vdAotICB3b3JrIGFzIGV4cGVjdGVkIC0tIHVzZSBgYGBgc3RyKG9iamVjdClgYGBgIGluc3RlYWQhCi0KLSogKipJbmxpbmUgY29tbWFuZHMgaW1wbGVtZW50ZWQgYXMgZGlyZWN0aXZlcyoqCi0KLSAgVGhlc2Ugd2VyZSBpbmxpbmUgY29tbWFuZHMgaW4gTGFUZVgsIGJ1dCBhcmUgbm93IGRpcmVjdGl2ZXMgaW4gcmVTVDoKLQotICB8ICpkZXByZWNhdGVkKgotICB8ICp2ZXJzaW9uYWRkZWQqCi0gIHwgKnZlcnNpb25jaGFuZ2VkKgotCi0gIFRoZXNlIGFyZSB1c2VkIGxpa2Ugc286OgotCi0gICAgIC4uIGRlcHJlY2F0ZWQ6OiAyLjUKLSAgICAgICAgUmVhc29uIG9mIGRlcHJlY2F0aW9uLgotCi0gIEFsc28sIG5vIHBlcmlvZCBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dCBmb3IgKnZlcnNpb25hZGRlZCogYW5kCi0gICp2ZXJzaW9uY2hhbmdlZCouCi0KLSAgfCAqbm90ZSoKLSAgfCAqd2FybmluZyoKLQotICBUaGVzZSBhcmUgdXNlZCBsaWtlIHNvOjoKLQotICAgICAuLiBub3RlOjoKLQotICAgICAgICBDb250ZW50IG9mIG5vdGUuCi0KLSogKipPdGhlcndpc2UgY2hhbmdlZCBjb21tYW5kcyoqCi0KLSAgVGhlICpzYW1wKiBjb21tYW5kIHByZXZpb3VzbHkgZm9ybWF0dGVkIGNvZGUgYW5kIGFkZGVkIHF1b3RhdGlvbiBtYXJrcyBhcm91bmQKLSAgaXQuICBUaGUgKnNhbXAqIHJvbGUsIGhvd2V2ZXIsIGZlYXR1cmVzIGEgbmV3IGhpZ2hsaWdodGluZyBzeXN0ZW0ganVzdCBsaWtlCi0gICpmaWxlKiBkb2VzOgotCi0gICAgIGBgOnNhbXA6YG9wZW4oe2ZpbGVuYW1lfSwge21vZGV9KWBgYCByZXN1bHRzIGluIDpzYW1wOmBvcGVuKHtmaWxlbmFtZX0sIHttb2RlfSlgCi0KLSogKipEcm9wcGVkIGNvbW1hbmRzKioKLQotICBUaGVzZSB3ZXJlIGNvbW1hbmRzIGluIExhVGVYLCBidXQgYXJlIG5vdCBhdmFpbGFibGUgYXMgcm9sZXM6Ci0KLSAgfCAqYmZjb2RlKgotICB8ICpjaGFyYWN0ZXIqICh1c2UgOnNhbXA6YFxgXGAnYydcYFxgYCkKLSAgfCAqY2l0ZXRpdGxlKiAodXNlIGBgYFRpdGxlIDxVUkw+YF9gYCkKLSAgfCAqY29kZSogKHVzZSBgYGBgY29kZWBgYGApCi0gIHwgKmVtYWlsKiAoanVzdCB3cml0ZSB0aGUgYWRkcmVzcyBpbiBib2R5IHRleHQpCi0gIHwgKmZpbGVucSoKLSAgfCAqZmlsZXZhciogKHVzZSB0aGUgYGB7Li4ufWBgIGhpZ2hsaWdodGluZyBmZWF0dXJlIG9mICpmaWxlKikKLSAgfCAqcHJvZ3JhbW9wdCosICpsb25ncHJvZ3JhbW9wdCogKHVzZSAqb3B0aW9uKikKLSAgfCAqdWxpbmsqICh1c2UgYGBgVGl0bGUgPFVSTD5gX2BgKQotICB8ICp1cmwqIChqdXN0IHdyaXRlIHRoZSBVUkwgaW4gYm9keSB0ZXh0KQotICB8ICp2YXIqICh1c2UgYGAqdmFyKmBgKQotICB8ICppbmZpbml0eSosICpwbHVzbWludXMqICh1c2UgdGhlIFVuaWNvZGUgY2hhcmFjdGVyKQotICB8ICpzaG9ydHZlcnNpb24qLCAqdmVyc2lvbiogKHVzZSB0aGUgYGB8dmVyc2lvbnxgYCBhbmQgYGB8cmVsZWFzZXxgYCBzdWJzdGl0dXRpb25zKQotICB8ICplbXBoKiwgKnN0cm9uZyogKHVzZSB0aGUgcmVTVCBtYXJrdXApCi0KLSogKipCYWNrc2xhc2ggZXNjYXBpbmcqKgotCi0gIEluIHJlU1QsIGEgYmFja3NsYXNoIG11c3QgYmUgZXNjYXBlZCBpbiBub3JtYWwgdGV4dCwgYW5kIGluIHRoZSBjb250ZW50IG9mCi0gIHJvbGVzLiAgSG93ZXZlciwgaW4gY29kZSBsaXRlcmFscyBhbmQgbGl0ZXJhbCBibG9ja3MsIGl0IG11c3Qgbm90IGJlIGVzY2FwZWQuCi0gIEV4YW1wbGU6IGBgOmZpbGU6YEM6XFxUZW1wXFxteS50bXBgYGAgdnMuIGBgYGBvcGVuKCJDOlxUZW1wXG15LnRtcCIpYGBgYC4KLQotCi1JbmZvcm1hdGlvbiB1bml0cwotLS0tLS0tLS0tLS0tLS0tLS0KLQotSW5mb3JtYXRpb24gdW5pdHMgKCouLi5kZXNjKiBlbnZpcm9ubWVudHMpIGhhdmUgYmVlbiBtYWRlIHJlU1QgZGlyZWN0aXZlcy4KLVRoZXNlIGNoYW5nZXMgdG8gaW5mb3JtYXRpb24gdW5pdHMgc2hvdWxkIGJlIG5vdGVkOgotCi0qICoqTmV3IG5hbWVzKioKLQotICAiZGVzYyIgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGV2ZXJ5IG5hbWUuICBBZGRpdGlvbmFsbHksIHRoZXNlIGRpcmVjdGl2ZXMgaGF2ZQotICBuZXcgbmFtZXM6Ci0KLSAgfCAqY2Z1bmN0aW9uKiAocHJldmlvdXNseSAqY2Z1bmNkZXNjKikKLSAgfCAqY21hY3JvKiAocHJldmlvdXNseSAqY3NpbXBsZW1hY3JvZGVzYyopCi0gIHwgKmV4Y2VwdGlvbiogKHByZXZpb3VzbHkgKmV4Y2Rlc2MqKQotICB8ICpmdW5jdGlvbiogKHByZXZpb3VzbHkgKmZ1bmNkZXNjKikKLSAgfCAqYXR0cmlidXRlKiAocHJldmlvdXNseSAqbWVtYmVyZGVzYyopCi0KLSAgVGhlICpjbGFzc2Rlc2NcKiogYW5kICpleGNjbGFzc2Rlc2MqIGVudmlyb25tZW50cyBoYXZlIGJlZW4gZHJvcHBlZCwgdGhlCi0gICpjbGFzcyogYW5kICpleGNlcHRpb24qIGRpcmVjdGl2ZXMgc3VwcG9ydCBjbGFzc2VzIGRvY3VtZW50ZWQgd2l0aCBhbmQgd2l0aG91dAotICBjb25zdHJ1Y3RvciBhcmd1bWVudHMuCi0KLSogKipNdWx0aXBsZSBvYmplY3RzKioKLQotICBUaGUgZXF1aXZhbGVudCBvZiB0aGUgKi4uLmxpbmUqIGNvbW1hbmRzIGlzOjoKLQotICAgICAuLiBmdW5jdGlvbjo6IGRvX2ZvbyhiYXIpCi0gICAgICAgICAgICAgICAgICAgZG9fYmFyKGJheikKLQotICAgICAgICBEZXNjcmlwdGlvbiBvZiB0aGUgZnVuY3Rpb25zLgotCi0gIElPVywganVzdCBnaXZlIG9uZSBzaWduYXR1cmVzIHBlciBsaW5lLCBhdCB0aGUgc2FtZSBpbmRlbnRhdGlvbiBsZXZlbC4KLQotKiAqKkFyZ3VtZW50cyoqCi0KLSAgVGhlcmUgaXMgbm8gKm9wdGlvbmFsKiBjb21tYW5kLiAgSnVzdCBnaXZlIGZ1bmN0aW9uIHNpZ25hdHVyZXMgbGlrZSB0aGV5Ci0gIHNob3VsZCBhcHBlYXIgaW4gdGhlIG91dHB1dDo6Ci0KLSAgICAgLi4gZnVuY3Rpb246OiBvcGVuKGZpbGVuYW1lWywgbW9kZVssIGJ1ZmZlcmluZ11dKQotCi0gICAgICAgIERlc2NyaXB0aW9uLgotCi0gIE5vdGU6IG1hcmt1cCBpbiB0aGUgc2lnbmF0dXJlIGlzIG5vdCBzdXBwb3J0ZWQuCi0KLSogKipJbmRleGluZyoqCi0KLSAgVGhlICouLi5kZXNjbmkqIGVudmlyb25tZW50cyBoYXZlIGJlZW4gZHJvcHBlZC4gIFRvIG1hcmsgYW4gaW5mb3JtYXRpb24gdW5pdAotICBhcyB1bnN1aXRhYmxlIGZvciBpbmRleCBlbnRyeSBnZW5lcmF0aW9uLCB1c2UgdGhlICpub2luZGV4KiBvcHRpb24gbGlrZSBzbzo6Ci0KLSAgICAgLi4gZnVuY3Rpb246OiBmb29fKgotICAgICAgICA6bm9pbmRleDoKLQotICAgICAgICBEZXNjcmlwdGlvbi4KLQotKiAqKk5ldyBpbmZvcm1hdGlvbiB1bml0cyoqCi0KLSAgVGhlcmUgYXJlIG5ldyBnZW5lcmljIGluZm9ybWF0aW9uIHVuaXRzOiBPbmUgaXMgY2FsbGVkICJkZXNjcmliZSIgYW5kIGNhbiBiZQotICB1c2VkIHRvIGRvY3VtZW50IHRoaW5ncyB0aGF0IGFyZSBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgdW5pdHM6OgotCi0gICAgIC4uIGRlc2NyaWJlOjogYSA9PSBiCi0KLSAgICAgICAgVGhlIGVxdWFscyBvcGVyYXRvci4KLQotICBUaGUgb3RoZXJzIGFyZTo6Ci0KLSAgICAgLi4gY21kb3B0aW9uOjogLU8KLQotICAgICAgICBEZXNjcmliZXMgYSBjb21tYW5kLWxpbmUgb3B0aW9uLgotCi0gICAgIC4uIGVudnZhcjo6IFBZVEhPTklOU1BFQ1QKLQotICAgICAgICBEZXNjcmliZXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuCi0KLQotU3RydWN0dXJlCi0tLS0tLS0tLS0KLQotVGhlIExhVGVYIGRvY3Mgd2VyZSBzcGxpdCBpbiBzZXZlcmFsIHRvcGxldmVsIG1hbnVhbHMuICBOb3csIGFsbCBmaWxlcyBhcmUgcGFydAotb2YgdGhlIHNhbWUgZG9jdW1lbnRhdGlvbiB0cmVlLCBhcyBpbmRpY2F0ZWQgYnkgdGhlICp0b2N0cmVlKiBkaXJlY3RpdmVzIGluIHRoZQotc291cmNlcyAodGhvdWdoIGluZGl2aWR1YWwgb3V0cHV0IGZvcm1hdHMgbWF5IGNob29zZSB0byBzcGxpdCB0aGVtIHVwIGludG8gcGFydHMKLWFnYWluKS4gIEV2ZXJ5ICp0b2N0cmVlKiBkaXJlY3RpdmUgZW1iZWRzIG90aGVyIGZpbGVzIGFzIHN1YmRvY3VtZW50cyBvZiB0aGUKLWN1cnJlbnQgZmlsZSAodGhpcyBzdHJ1Y3R1cmUgaXMgbm90IG5lY2Vzc2FyaWx5IG1pcnJvcmVkIGluIHRoZSBmaWxlc3lzdGVtCi1sYXlvdXQpLiAgVGhlIHRvcGxldmVsIGZpbGUgaXMgOmZpbGU6YGNvbnRlbnRzLnJzdGAuCi0KLUhvd2V2ZXIsIG1vc3Qgb2YgdGhlIG9sZCBkaXJlY3Rvcnkgc3RydWN0dXJlIGhhcyBiZWVuIGtlcHQsIHdpdGggdGhlCi1kaXJlY3RvcmllcyByZW5hbWVkIGFzIGZvbGxvd3M6Ci0KLSogOmZpbGU6YGFwaWAgLT4gOmZpbGU6YGMtYXBpYAotKiA6ZmlsZTpgZGlzdGAgLT4gOmZpbGU6YGRpc3R1dGlsc2AsIHdpdGggdGhlIHNpbmdsZSBUZVggZmlsZSBzcGxpdCB1cAotKiA6ZmlsZTpgZG9jYCAtPiA6ZmlsZTpgZG9jdW1lbnRpbmdgCi0qIDpmaWxlOmBleHRgIC0+IDpmaWxlOmBleHRlbmRpbmdgCi0qIDpmaWxlOmBpbnN0YCAtPiA6ZmlsZTpgaW5zdGFsbGluZ2AKLSogOmZpbGU6YGxpYmAgLT4gOmZpbGU6YGxpYnJhcnlgCi0qIDpmaWxlOmBtYWNgIC0+IG1lcmdlZCBpbnRvIDpmaWxlOmBsaWJyYXJ5YCwgd2l0aCA6ZmlsZTpgbWFjL3VzaW5nLnRleGAKLSAgbW92ZWQgdG8gOmZpbGU6YHVzaW5nL21hYy5yc3RgCi0qIDpmaWxlOmByZWZgIC0+IDpmaWxlOmByZWZlcmVuY2VgCi0qIDpmaWxlOmB0dXRgIC0+IDpmaWxlOmB0dXRvcmlhbGAsIHdpdGggdGhlIHNpbmdsZSBUZVggZmlsZSBzcGxpdCB1cAotCi0KLS4uIFhYWCBtb3JlIChpbmRleC1nZW5lcmF0aW5nLCBwcm9kdWN0aW9uIGxpc3RzLCAuLi4pCmRpZmYgLS1naXQgYS9Eb2MvZG9jdW1lbnRpbmcvaW5kZXgucnN0IGIvRG9jL2RvY3VtZW50aW5nL2luZGV4LnJzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMxODZhNy4uMDAwMDAwMAotLS0gYS9Eb2MvZG9jdW1lbnRpbmcvaW5kZXgucnN0CisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLi4gX2RvY3VtZW50aW5nLWluZGV4OgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gIERvY3VtZW50aW5nIFB5dGhvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0KLVRoZSBQeXRob24gbGFuZ3VhZ2UgaGFzIGEgc3Vic3RhbnRpYWwgYm9keSBvZiBkb2N1bWVudGF0aW9uLCBtdWNoIG9mIGl0Ci1jb250cmlidXRlZCBieSB2YXJpb3VzIGF1dGhvcnMuIFRoZSBtYXJrdXAgdXNlZCBmb3IgdGhlIFB5dGhvbiBkb2N1bWVudGF0aW9uIGlzCi1gcmVTdHJ1Y3R1cmVkVGV4dGBfLCBkZXZlbG9wZWQgYnkgdGhlIGBkb2N1dGlsc2BfIHByb2plY3QsIGFtZW5kZWQgYnkgY3VzdG9tCi1kaXJlY3RpdmVzIGFuZCB1c2luZyBhIHRvb2xzZXQgbmFtZWQgYFNwaGlueGBfIHRvIHBvc3Rwcm9jZXNzIHRoZSBIVE1MIG91dHB1dC4KLQotVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIHN0eWxlIGd1aWRlIGZvciBvdXIgZG9jdW1lbnRhdGlvbiBhcyB3ZWxsIGFzIHRoZQotY3VzdG9tIHJlU3RydWN0dXJlZFRleHQgbWFya3VwIGludHJvZHVjZWQgYnkgU3BoaW54IHRvIHN1cHBvcnQgUHl0aG9uCi1kb2N1bWVudGF0aW9uIGFuZCBob3cgaXQgc2hvdWxkIGJlIHVzZWQuCi0KLS4uIF9yZVN0cnVjdHVyZWRUZXh0OiBodHRwOi8vZG9jdXRpbHMuc2YubmV0L3JzdC5odG1sCi0uLiBfZG9jdXRpbHM6IGh0dHA6Ly9kb2N1dGlscy5zZi5uZXQvCi0uLiBfU3BoaW54OiBodHRwOi8vc3BoaW54LnBvY29vLm9yZy8KLQotLi4gbm90ZTo6Ci0KLSAgIElmIHlvdSdyZSBpbnRlcmVzdGVkIGluIGNvbnRyaWJ1dGluZyB0byBQeXRob24ncyBkb2N1bWVudGF0aW9uLCB0aGVyZSdzIG5vCi0gICBuZWVkIHRvIHdyaXRlIHJlU3RydWN0dXJlZFRleHQgaWYgeW91J3JlIG5vdCBzbyBpbmNsaW5lZDsgcGxhaW4gdGV4dAotICAgY29udHJpYnV0aW9ucyBhcmUgbW9yZSB0aGFuIHdlbGNvbWUgYXMgd2VsbC4gIFNlbmQgYW4gZS1tYWlsIHRvCi0gICBkb2NzQHB5dGhvbi5vcmcgb3Igb3BlbiBhbiBpc3N1ZSBvbiB0aGUgOnJlZjpgdHJhY2tlciA8cmVwb3J0aW5nLWJ1Z3M+YC4KLQotCi0uLiB0b2N0cmVlOjoKLSAgIDpudW1iZXJlZDoKLSAgIDptYXhkZXB0aDogMQotCi0gICBpbnRyby5yc3QKLSAgIHN0eWxlLnJzdAotICAgcmVzdC5yc3QKLSAgIG1hcmt1cC5yc3QKLSAgIGZyb21sYXRleC5yc3QKLSAgIGJ1aWxkaW5nLnJzdApkaWZmIC0tZ2l0IGEvRG9jL2RvY3VtZW50aW5nL2ludHJvLnJzdCBiL0RvYy9kb2N1bWVudGluZy9pbnRyby5yc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMmFkN2QuLjAwMDAwMDAKLS0tIGEvRG9jL2RvY3VtZW50aW5nL2ludHJvLnJzdAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLUludHJvZHVjdGlvbgotPT09PT09PT09PT09Ci0KLVB5dGhvbidzIGRvY3VtZW50YXRpb24gaGFzIGxvbmcgYmVlbiBjb25zaWRlcmVkIHRvIGJlIGdvb2QgZm9yIGEgZnJlZQotcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuICBUaGVyZSBhcmUgYSBudW1iZXIgb2YgcmVhc29ucyBmb3IgdGhpcywgdGhlIG1vc3QKLWltcG9ydGFudCBiZWluZyB0aGUgZWFybHkgY29tbWl0bWVudCBvZiBQeXRob24ncyBjcmVhdG9yLCBHdWlkbyB2YW4gUm9zc3VtLCB0bwotcHJvdmlkaW5nIGRvY3VtZW50YXRpb24gb24gdGhlIGxhbmd1YWdlIGFuZCBpdHMgbGlicmFyaWVzLCBhbmQgdGhlIGNvbnRpbnVpbmcKLWludm9sdmVtZW50IG9mIHRoZSB1c2VyIGNvbW11bml0eSBpbiBwcm92aWRpbmcgYXNzaXN0YW5jZSBmb3IgY3JlYXRpbmcgYW5kCi1tYWludGFpbmluZyBkb2N1bWVudGF0aW9uLgotCi1UaGUgaW52b2x2ZW1lbnQgb2YgdGhlIGNvbW11bml0eSB0YWtlcyBtYW55IGZvcm1zLCBmcm9tIGF1dGhvcmluZyB0byBidWcgcmVwb3J0cwotdG8ganVzdCBwbGFpbiBjb21wbGFpbmluZyB3aGVuIHRoZSBkb2N1bWVudGF0aW9uIGNvdWxkIGJlIG1vcmUgY29tcGxldGUgb3IKLWVhc2llciB0byB1c2UuCi0KLVRoaXMgZG9jdW1lbnQgaXMgYWltZWQgYXQgYXV0aG9ycyBhbmQgcG90ZW50aWFsIGF1dGhvcnMgb2YgZG9jdW1lbnRhdGlvbiBmb3IKLVB5dGhvbi4gIE1vcmUgc3BlY2lmaWNhbGx5LCBpdCBpcyBmb3IgcGVvcGxlIGNvbnRyaWJ1dGluZyB0byB0aGUgc3RhbmRhcmQKLWRvY3VtZW50YXRpb24gYW5kIGRldmVsb3BpbmcgYWRkaXRpb25hbCBkb2N1bWVudHMgdXNpbmcgdGhlIHNhbWUgdG9vbHMgYXMgdGhlCi1zdGFuZGFyZCBkb2N1bWVudHMuICBUaGlzIGd1aWRlIHdpbGwgYmUgbGVzcyB1c2VmdWwgZm9yIGF1dGhvcnMgdXNpbmcgdGhlIFB5dGhvbgotZG9jdW1lbnRhdGlvbiB0b29scyBmb3IgdG9waWNzIG90aGVyIHRoYW4gUHl0aG9uLCBhbmQgbGVzcyB1c2VmdWwgc3RpbGwgZm9yCi1hdXRob3JzIG5vdCB1c2luZyB0aGUgdG9vbHMgYXQgYWxsLgotCi1JZiB5b3VyIGludGVyZXN0IGlzIGluIGNvbnRyaWJ1dGluZyB0byB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24sIGJ1dCB5b3UgZG9uJ3QKLWhhdmUgdGhlIHRpbWUgb3IgaW5jbGluYXRpb24gdG8gbGVhcm4gcmVTdHJ1Y3R1cmVkVGV4dCBhbmQgdGhlIG1hcmt1cCBzdHJ1Y3R1cmVzCi1kb2N1bWVudGVkIGhlcmUsIHRoZXJlJ3MgYSB3ZWxjb21pbmcgcGxhY2UgZm9yIHlvdSBhbW9uZyB0aGUgUHl0aG9uIGNvbnRyaWJ1dG9ycwotYXMgd2VsbC4gIEFueSB0aW1lIHlvdSBmZWVsIHRoYXQgeW91IGNhbiBjbGFyaWZ5IGV4aXN0aW5nIGRvY3VtZW50YXRpb24gb3IKLXByb3ZpZGUgZG9jdW1lbnRhdGlvbiB0aGF0J3MgbWlzc2luZywgdGhlIGV4aXN0aW5nIGRvY3VtZW50YXRpb24gdGVhbSB3aWxsCi1nbGFkbHkgd29yayB3aXRoIHlvdSB0byBpbnRlZ3JhdGUgeW91ciB0ZXh0LCBkZWFsaW5nIHdpdGggdGhlIG1hcmt1cCBmb3IgeW91LgotUGxlYXNlIGRvbid0IGxldCB0aGUgbWF0ZXJpYWwgaW4gdGhpcyBkb2N1bWVudCBzdGFuZCBiZXR3ZWVuIHRoZSBkb2N1bWVudGF0aW9uCi1hbmQgeW91ciBkZXNpcmUgdG8gaGVscCBvdXQhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRG9jL2RvY3VtZW50aW5nL21hcmt1cC5yc3QgYi9Eb2MvZG9jdW1lbnRpbmcvbWFya3VwLnJzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU4MDFjNy4uMDAwMDAwMAotLS0gYS9Eb2MvZG9jdW1lbnRpbmcvbWFya3VwLnJzdAorKysgL2Rldi9udWxsCkBAIC0xLDg2MSArMCwwIEBACi0uLiBoaWdobGlnaHRsYW5nOjogcmVzdAotCi1BZGRpdGlvbmFsIE1hcmt1cCBDb25zdHJ1Y3RzCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVNwaGlueCBhZGRzIGEgbG90IG9mIG5ldyBkaXJlY3RpdmVzIGFuZCBpbnRlcnByZXRlZCB0ZXh0IHJvbGVzIHRvIHN0YW5kYXJkIHJlU1QKLW1hcmt1cC4gIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgcmVmZXJlbmNlIG1hdGVyaWFsIGZvciB0aGVzZSBmYWNpbGl0aWVzLgotRG9jdW1lbnRhdGlvbiBmb3IgInN0YW5kYXJkIiByZVNUIGNvbnN0cnVjdHMgaXMgbm90IGluY2x1ZGVkIGhlcmUsIHRob3VnaAotdGhleSBhcmUgdXNlZCBpbiB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24uCi0KLS4uIG5vdGU6OgotCi0gICBUaGlzIGlzIGp1c3QgYW4gb3ZlcnZpZXcgb2YgU3BoaW54JyBleHRlbmRlZCBtYXJrdXAgY2FwYWJpbGl0aWVzOyBmdWxsCi0gICBjb3ZlcmFnZSBjYW4gYmUgZm91bmQgaW4gYGl0cyBvd24gZG9jdW1lbnRhdGlvbgotICAgPGh0dHA6Ly9zcGhpbngucG9jb28ub3JnL2NvbnRlbnRzLmh0bWw+YF8uCi0KLQotTWV0YS1pbmZvcm1hdGlvbiBtYXJrdXAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS4uIGRlc2NyaWJlOjogc2VjdGlvbmF1dGhvcgotCi0gICBJZGVudGlmaWVzIHRoZSBhdXRob3Igb2YgdGhlIGN1cnJlbnQgc2VjdGlvbi4gIFRoZSBhcmd1bWVudCBzaG91bGQgaW5jbHVkZQotICAgdGhlIGF1dGhvcidzIG5hbWUgc3VjaCB0aGF0IGl0IGNhbiBiZSB1c2VkIGZvciBwcmVzZW50YXRpb24gKHRob3VnaCBpdCBpc24ndCkKLSAgIGFuZCBlbWFpbCBhZGRyZXNzLiAgVGhlIGRvbWFpbiBuYW1lIHBvcnRpb24gb2YgdGhlIGFkZHJlc3Mgc2hvdWxkIGJlIGxvd2VyCi0gICBjYXNlLiAgRXhhbXBsZTo6Ci0KLSAgICAgIC4uIHNlY3Rpb25hdXRob3I6OiBHdWlkbyB2YW4gUm9zc3VtIDxndWlkb0BweXRob24ub3JnPgotCi0gICBDdXJyZW50bHksIHRoaXMgbWFya3VwIGlzbid0IHJlZmxlY3RlZCBpbiB0aGUgb3V0cHV0IGluIGFueSB3YXksIGJ1dCBpdCBoZWxwcwotICAga2VlcCB0cmFjayBvZiBjb250cmlidXRpb25zLgotCi0KLU1vZHVsZS1zcGVjaWZpYyBtYXJrdXAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIG1hcmt1cCBkZXNjcmliZWQgaW4gdGhpcyBzZWN0aW9uIGlzIHVzZWQgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCBhCi1tb2R1bGUgYmVpbmcgZG9jdW1lbnRlZC4gIEVhY2ggbW9kdWxlIHNob3VsZCBiZSBkb2N1bWVudGVkIGluIGl0cyBvd24gZmlsZS4KLU5vcm1hbGx5IHRoaXMgbWFya3VwIGFwcGVhcnMgYWZ0ZXIgdGhlIHRpdGxlIGhlYWRpbmcgb2YgdGhhdCBmaWxlOyBhIHR5cGljYWwKLWZpbGUgbWlnaHQgc3RhcnQgbGlrZSB0aGlzOjoKLQotICAgOm1vZDpgcGFycm90YCAtLSBEZWFkIHBhcnJvdCBhY2Nlc3MKLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgIC4uIG1vZHVsZTo6IHBhcnJvdAotICAgICAgOnBsYXRmb3JtOiBVbml4LCBXaW5kb3dzCi0gICAgICA6c3lub3BzaXM6IEFuYWx5emUgYW5kIHJlYW5pbWF0ZSBkZWFkIHBhcnJvdHMuCi0gICAuLiBtb2R1bGVhdXRob3I6OiBFcmljIENsZWVzZSA8ZXJpY0BweXRob24uaW52YWxpZD4KLSAgIC4uIG1vZHVsZWF1dGhvcjo6IEpvaG4gSWRsZSA8am9obkBweXRob24uaW52YWxpZD4KLQotQXMgeW91IGNhbiBzZWUsIHRoZSBtb2R1bGUtc3BlY2lmaWMgbWFya3VwIGNvbnNpc3RzIG9mIHR3byBkaXJlY3RpdmVzLCB0aGUKLWBgbW9kdWxlYGAgZGlyZWN0aXZlIGFuZCB0aGUgYGBtb2R1bGVhdXRob3JgYCBkaXJlY3RpdmUuCi0KLS4uIGRlc2NyaWJlOjogbW9kdWxlCi0KLSAgIFRoaXMgZGlyZWN0aXZlIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRlc2NyaXB0aW9uIG9mIGEgbW9kdWxlIChvciBwYWNrYWdlCi0gICBzdWJtb2R1bGUsIGluIHdoaWNoIGNhc2UgdGhlIG5hbWUgc2hvdWxkIGJlIGZ1bGx5IHF1YWxpZmllZCwgaW5jbHVkaW5nIHRoZQotICAgcGFja2FnZSBuYW1lKS4KLQotICAgVGhlIGBgcGxhdGZvcm1gYCBvcHRpb24sIGlmIHByZXNlbnQsIGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlCi0gICBwbGF0Zm9ybXMgb24gd2hpY2ggdGhlIG1vZHVsZSBpcyBhdmFpbGFibGUgKGlmIGl0IGlzIGF2YWlsYWJsZSBvbiBhbGwKLSAgIHBsYXRmb3JtcywgdGhlIG9wdGlvbiBzaG91bGQgYmUgb21pdHRlZCkuICBUaGUga2V5cyBhcmUgc2hvcnQgaWRlbnRpZmllcnM7Ci0gICBleGFtcGxlcyB0aGF0IGFyZSBpbiB1c2UgaW5jbHVkZSAiSVJJWCIsICJNYWMiLCAiV2luZG93cyIsIGFuZCAiVW5peCIuICBJdCBpcwotICAgaW1wb3J0YW50IHRvIHVzZSBhIGtleSB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgd2hlbiBhcHBsaWNhYmxlLgotCi0gICBUaGUgYGBzeW5vcHNpc2BgIG9wdGlvbiBzaG91bGQgY29uc2lzdCBvZiBvbmUgc2VudGVuY2UgZGVzY3JpYmluZyB0aGUKLSAgIG1vZHVsZSdzIHB1cnBvc2UgLS0gaXQgaXMgY3VycmVudGx5IG9ubHkgdXNlZCBpbiB0aGUgR2xvYmFsIE1vZHVsZSBJbmRleC4KLQotICAgVGhlIGBgZGVwcmVjYXRlZGBgIG9wdGlvbiBjYW4gYmUgZ2l2ZW4gKHdpdGggbm8gdmFsdWUpIHRvIG1hcmsgYSBtb2R1bGUgYXMKLSAgIGRlcHJlY2F0ZWQ7IGl0IHdpbGwgYmUgZGVzaWduYXRlZCBhcyBzdWNoIGluIHZhcmlvdXMgbG9jYXRpb25zIHRoZW4uCi0KLS4uIGRlc2NyaWJlOjogbW9kdWxlYXV0aG9yCi0KLSAgIFRoZSBgYG1vZHVsZWF1dGhvcmBgIGRpcmVjdGl2ZSwgd2hpY2ggY2FuIGFwcGVhciBtdWx0aXBsZSB0aW1lcywgbmFtZXMgdGhlCi0gICBhdXRob3JzIG9mIHRoZSBtb2R1bGUgY29kZSwganVzdCBsaWtlIGBgc2VjdGlvbmF1dGhvcmBgIG5hbWVzIHRoZSBhdXRob3IocykKLSAgIG9mIGEgcGllY2Ugb2YgZG9jdW1lbnRhdGlvbi4gIEl0IHRvbyBkb2VzIG5vdCByZXN1bHQgaW4gYW55IG91dHB1dCBjdXJyZW50bHkuCi0KLS4uIG5vdGU6OgotCi0gICBJdCBpcyBpbXBvcnRhbnQgdG8gbWFrZSB0aGUgc2VjdGlvbiB0aXRsZSBvZiBhIG1vZHVsZS1kZXNjcmliaW5nIGZpbGUKLSAgIG1lYW5pbmdmdWwgc2luY2UgdGhhdCB2YWx1ZSB3aWxsIGJlIGluc2VydGVkIGluIHRoZSB0YWJsZS1vZi1jb250ZW50cyB0cmVlcwotICAgaW4gb3ZlcnZpZXcgZmlsZXMuCi0KLQotSW5mb3JtYXRpb24gdW5pdHMKLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZXJlIGFyZSBhIG51bWJlciBvZiBkaXJlY3RpdmVzIHVzZWQgdG8gZGVzY3JpYmUgc3BlY2lmaWMgZmVhdHVyZXMgcHJvdmlkZWQgYnkKLW1vZHVsZXMuICBFYWNoIGRpcmVjdGl2ZSByZXF1aXJlcyBvbmUgb3IgbW9yZSBzaWduYXR1cmVzIHRvIHByb3ZpZGUgYmFzaWMKLWluZm9ybWF0aW9uIGFib3V0IHdoYXQgaXMgYmVpbmcgZGVzY3JpYmVkLCBhbmQgdGhlIGNvbnRlbnQgc2hvdWxkIGJlIHRoZQotZGVzY3JpcHRpb24uICBUaGUgYmFzaWMgdmVyc2lvbiBtYWtlcyBlbnRyaWVzIGluIHRoZSBnZW5lcmFsIGluZGV4OyBpZiBubyBpbmRleAotZW50cnkgaXMgZGVzaXJlZCwgeW91IGNhbiBnaXZlIHRoZSBkaXJlY3RpdmUgb3B0aW9uIGZsYWcgYGA6bm9pbmRleDpgYC4gIFRoZQotZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgYWxsIG9mIHRoZSBmZWF0dXJlcyBvZiB0aGlzIGRpcmVjdGl2ZSB0eXBlOjoKLQotICAgIC4uIGZ1bmN0aW9uOjogc3BhbShlZ2dzKQotICAgICAgICAgICAgICAgICAgaGFtKGVnZ3MpCi0gICAgICAgOm5vaW5kZXg6Ci0KLSAgICAgICBTcGFtIG9yIGhhbSB0aGUgZm9vLgotCi1UaGUgc2lnbmF0dXJlcyBvZiBvYmplY3QgbWV0aG9kcyBvciBkYXRhIGF0dHJpYnV0ZXMgc2hvdWxkIG5vdCBpbmNsdWRlIHRoZQotY2xhc3MgbmFtZSwgYnV0IGJlIG5lc3RlZCBpbiBhIGNsYXNzIGRpcmVjdGl2ZS4gIFRoZSBnZW5lcmF0ZWQgZmlsZXMgd2lsbAotcmVmbGVjdCB0aGlzIG5lc3RpbmcsIGFuZCB0aGUgdGFyZ2V0IGlkZW50aWZpZXJzIChmb3IgSFRNTCBvdXRwdXQpIHdpbGwgdXNlCi1ib3RoIHRoZSBjbGFzcyBhbmQgbWV0aG9kIG5hbWUsIHRvIGVuYWJsZSBjb25zaXN0ZW50IGNyb3NzLXJlZmVyZW5jZXMuICBJZiB5b3UKLWRlc2NyaWJlIG1ldGhvZHMgYmVsb25naW5nIHRvIGFuIGFic3RyYWN0IHByb3RvY29sIHN1Y2ggYXMgY29udGV4dCBtYW5hZ2VycywKLXVzZSBhIGNsYXNzIGRpcmVjdGl2ZSB3aXRoIGEgKHBzZXVkby0pdHlwZSBuYW1lIHRvbyB0byBtYWtlIHRoZQotaW5kZXggZW50cmllcyBtb3JlIGluZm9ybWF0aXZlLgotCi1UaGUgZGlyZWN0aXZlcyBhcmU6Ci0KLS4uIGRlc2NyaWJlOjogY2Z1bmN0aW9uCi0KLSAgIERlc2NyaWJlcyBhIEMgZnVuY3Rpb24uIFRoZSBzaWduYXR1cmUgc2hvdWxkIGJlIGdpdmVuIGFzIGluIEMsIGUuZy46OgotCi0gICAgICAuLiBjZnVuY3Rpb246OiBQeU9iamVjdCogUHlUeXBlX0dlbmVyaWNBbGxvYyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5X3NzaXplX3Qgbml0ZW1zKQotCi0gICBUaGlzIGlzIGFsc28gdXNlZCB0byBkZXNjcmliZSBmdW5jdGlvbi1saWtlIHByZXByb2Nlc3NvciBtYWNyb3MuICBUaGUgbmFtZXMKLSAgIG9mIHRoZSBhcmd1bWVudHMgc2hvdWxkIGJlIGdpdmVuIHNvIHRoZXkgbWF5IGJlIHVzZWQgaW4gdGhlIGRlc2NyaXB0aW9uLgotCi0gICBOb3RlIHRoYXQgeW91IGRvbid0IGhhdmUgdG8gYmFja3NsYXNoLWVzY2FwZSBhc3Rlcmlza3MgaW4gdGhlIHNpZ25hdHVyZSwKLSAgIGFzIGl0IGlzIG5vdCBwYXJzZWQgYnkgdGhlIHJlU1QgaW5saW5lci4KLQotLi4gZGVzY3JpYmU6OiBjbWVtYmVyCi0KLSAgIERlc2NyaWJlcyBhIEMgc3RydWN0IG1lbWJlci4gRXhhbXBsZSBzaWduYXR1cmU6OgotCi0gICAgICAuLiBjbWVtYmVyOjogUHlPYmplY3QqIFB5VHlwZU9iamVjdC50cF9iYXNlcwotCi0gICBUaGUgdGV4dCBvZiB0aGUgZGVzY3JpcHRpb24gc2hvdWxkIGluY2x1ZGUgdGhlIHJhbmdlIG9mIHZhbHVlcyBhbGxvd2VkLCBob3cKLSAgIHRoZSB2YWx1ZSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQsIGFuZCB3aGV0aGVyIHRoZSB2YWx1ZSBjYW4gYmUgY2hhbmdlZC4KLSAgIFJlZmVyZW5jZXMgdG8gc3RydWN0dXJlIG1lbWJlcnMgaW4gdGV4dCBzaG91bGQgdXNlIHRoZSBgYG1lbWJlcmBgIHJvbGUuCi0KLS4uIGRlc2NyaWJlOjogY21hY3JvCi0KLSAgIERlc2NyaWJlcyBhICJzaW1wbGUiIEMgbWFjcm8uICBTaW1wbGUgbWFjcm9zIGFyZSBtYWNyb3Mgd2hpY2ggYXJlIHVzZWQKLSAgIGZvciBjb2RlIGV4cGFuc2lvbiwgYnV0IHdoaWNoIGRvIG5vdCB0YWtlIGFyZ3VtZW50cyBzbyBjYW5ub3QgYmUgZGVzY3JpYmVkIGFzCi0gICBmdW5jdGlvbnMuICBUaGlzIGlzIG5vdCB0byBiZSB1c2VkIGZvciBzaW1wbGUgY29uc3RhbnQgZGVmaW5pdGlvbnMuICBFeGFtcGxlcwotICAgb2YgaXRzIHVzZSBpbiB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24gaW5jbHVkZSA6Y21hY3JvOmBQeU9iamVjdF9IRUFEYCBhbmQKLSAgIDpjbWFjcm86YFB5X0JFR0lOX0FMTE9XX1RIUkVBRFNgLgotCi0uLiBkZXNjcmliZTo6IGN0eXBlCi0KLSAgIERlc2NyaWJlcyBhIEMgdHlwZS4gVGhlIHNpZ25hdHVyZSBzaG91bGQganVzdCBiZSB0aGUgdHlwZSBuYW1lLgotCi0uLiBkZXNjcmliZTo6IGN2YXIKLQotICAgRGVzY3JpYmVzIGEgZ2xvYmFsIEMgdmFyaWFibGUuICBUaGUgc2lnbmF0dXJlIHNob3VsZCBpbmNsdWRlIHRoZSB0eXBlLCBzdWNoCi0gICBhczo6Ci0KLSAgICAgIC4uIGN2YXI6OiBQeU9iamVjdCogUHlDbGFzc19UeXBlCi0KLS4uIGRlc2NyaWJlOjogZGF0YQotCi0gICBEZXNjcmliZXMgZ2xvYmFsIGRhdGEgaW4gYSBtb2R1bGUsIGluY2x1ZGluZyBib3RoIHZhcmlhYmxlcyBhbmQgdmFsdWVzIHVzZWQKLSAgIGFzICJkZWZpbmVkIGNvbnN0YW50cy4iICBDbGFzcyBhbmQgb2JqZWN0IGF0dHJpYnV0ZXMgYXJlIG5vdCBkb2N1bWVudGVkCi0gICB1c2luZyB0aGlzIGRpcmVjdGl2ZS4KLQotLi4gZGVzY3JpYmU6OiBleGNlcHRpb24KLQotICAgRGVzY3JpYmVzIGFuIGV4Y2VwdGlvbiBjbGFzcy4gIFRoZSBzaWduYXR1cmUgY2FuLCBidXQgbmVlZCBub3QgaW5jbHVkZQotICAgcGFyZW50aGVzZXMgd2l0aCBjb25zdHJ1Y3RvciBhcmd1bWVudHMuCi0KLS4uIGRlc2NyaWJlOjogZnVuY3Rpb24KLQotICAgRGVzY3JpYmVzIGEgbW9kdWxlLWxldmVsIGZ1bmN0aW9uLiAgVGhlIHNpZ25hdHVyZSBzaG91bGQgaW5jbHVkZSB0aGUKLSAgIHBhcmFtZXRlcnMsIGVuY2xvc2luZyBvcHRpb25hbCBwYXJhbWV0ZXJzIGluIGJyYWNrZXRzLiAgRGVmYXVsdCB2YWx1ZXMgY2FuIGJlCi0gICBnaXZlbiBpZiBpdCBlbmhhbmNlcyBjbGFyaXR5LiAgRm9yIGV4YW1wbGU6OgotCi0gICAgICAuLiBmdW5jdGlvbjo6IHJlcGVhdChbcmVwZWF0PTNbLCBudW1iZXI9MTAwMDAwMF1dKQotCi0gICBPYmplY3QgbWV0aG9kcyBhcmUgbm90IGRvY3VtZW50ZWQgdXNpbmcgdGhpcyBkaXJlY3RpdmUuIEJvdW5kIG9iamVjdCBtZXRob2RzCi0gICBwbGFjZWQgaW4gdGhlIG1vZHVsZSBuYW1lc3BhY2UgYXMgcGFydCBvZiB0aGUgcHVibGljIGludGVyZmFjZSBvZiB0aGUgbW9kdWxlCi0gICBhcmUgZG9jdW1lbnRlZCB1c2luZyB0aGlzLCBhcyB0aGV5IGFyZSBlcXVpdmFsZW50IHRvIG5vcm1hbCBmdW5jdGlvbnMgZm9yCi0gICBtb3N0IHB1cnBvc2VzLgotCi0gICBUaGUgZGVzY3JpcHRpb24gc2hvdWxkIGluY2x1ZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhcmFtZXRlcnMgcmVxdWlyZWQgYW5kCi0gICBob3cgdGhleSBhcmUgdXNlZCAoZXNwZWNpYWxseSB3aGV0aGVyIG11dGFibGUgb2JqZWN0cyBwYXNzZWQgYXMgcGFyYW1ldGVycwotICAgYXJlIG1vZGlmaWVkKSwgc2lkZSBlZmZlY3RzLCBhbmQgcG9zc2libGUgZXhjZXB0aW9ucy4gIEEgc21hbGwgZXhhbXBsZSBtYXkgYmUKLSAgIHByb3ZpZGVkLgotCi0uLiBkZXNjcmliZTo6IGNsYXNzCi0KLSAgIERlc2NyaWJlcyBhIGNsYXNzLiAgVGhlIHNpZ25hdHVyZSBjYW4gaW5jbHVkZSBwYXJlbnRoZXNlcyB3aXRoIHBhcmFtZXRlcnMKLSAgIHdoaWNoIHdpbGwgYmUgc2hvd24gYXMgdGhlIGNvbnN0cnVjdG9yIGFyZ3VtZW50cy4KLQotLi4gZGVzY3JpYmU6OiBhdHRyaWJ1dGUKLQotICAgRGVzY3JpYmVzIGFuIG9iamVjdCBkYXRhIGF0dHJpYnV0ZS4gIFRoZSBkZXNjcmlwdGlvbiBzaG91bGQgaW5jbHVkZQotICAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2YgdGhlIGRhdGEgdG8gYmUgZXhwZWN0ZWQgYW5kIHdoZXRoZXIgaXQgbWF5IGJlCi0gICBjaGFuZ2VkIGRpcmVjdGx5LiAgVGhpcyBkaXJlY3RpdmUgc2hvdWxkIGJlIG5lc3RlZCBpbiBhIGNsYXNzIGRpcmVjdGl2ZSwKLSAgIGxpa2UgaW4gdGhpcyBleGFtcGxlOjoKLQotICAgICAgLi4gY2xhc3M6OiBTcGFtCi0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uIG9mIHRoZSBjbGFzcy4KLQotICAgICAgICAgICAgLi4gZGF0YTo6IGhhbQotCi0gICAgICAgICAgICAgICBEZXNjcmlwdGlvbiBvZiB0aGUgYXR0cmlidXRlLgotCi0gICBJZiBpcyBhbHNvIHBvc3NpYmxlIHRvIGRvY3VtZW50IGFuIGF0dHJpYnV0ZSBvdXRzaWRlIG9mIGEgY2xhc3MgZGlyZWN0aXZlLAotICAgZm9yIGV4YW1wbGUgaWYgdGhlIGRvY3VtZW50YXRpb24gZm9yIGRpZmZlcmVudCBhdHRyaWJ1dGVzIGFuZCBtZXRob2RzIGlzCi0gICBzcGxpdCBpbiBtdWx0aXBsZSBzZWN0aW9ucy4gIFRoZSBjbGFzcyBuYW1lIHNob3VsZCB0aGVuIGJlIGluY2x1ZGVkCi0gICBleHBsaWNpdGx5OjoKLQotICAgICAgLi4gZGF0YTo6IFNwYW0uZWdncwotCi0uLiBkZXNjcmliZTo6IG1ldGhvZAotCi0gICBEZXNjcmliZXMgYW4gb2JqZWN0IG1ldGhvZC4gIFRoZSBwYXJhbWV0ZXJzIHNob3VsZCBub3QgaW5jbHVkZSB0aGUgYGBzZWxmYGAKLSAgIHBhcmFtZXRlci4gIFRoZSBkZXNjcmlwdGlvbiBzaG91bGQgaW5jbHVkZSBzaW1pbGFyIGluZm9ybWF0aW9uIHRvIHRoYXQKLSAgIGRlc2NyaWJlZCBmb3IgYGBmdW5jdGlvbmBgLiAgVGhpcyBkaXJlY3RpdmUgc2hvdWxkIGJlIG5lc3RlZCBpbiBhIGNsYXNzCi0gICBkaXJlY3RpdmUsIGxpa2UgaW4gdGhlIGV4YW1wbGUgYWJvdmUuCi0KLS4uIGRlc2NyaWJlOjogb3Bjb2RlCi0KLSAgIERlc2NyaWJlcyBhIFB5dGhvbiA6dGVybTpgYnl0ZWNvZGVgIGluc3RydWN0aW9uLgotCi0uLiBkZXNjcmliZTo6IGNtZG9wdGlvbgotCi0gICBEZXNjcmliZXMgYSBQeXRob24gY29tbWFuZCBsaW5lIG9wdGlvbiBvciBzd2l0Y2guICBPcHRpb24gYXJndW1lbnQgbmFtZXMKLSAgIHNob3VsZCBiZSBlbmNsb3NlZCBpbiBhbmdsZSBicmFja2V0cy4gIEV4YW1wbGU6OgotCi0gICAgICAuLiBjbWRvcHRpb246OiAtbSA8bW9kdWxlPgotCi0gICAgICAgICBSdW4gYSBtb2R1bGUgYXMgYSBzY3JpcHQuCi0KLS4uIGRlc2NyaWJlOjogZW52dmFyCi0KLSAgIERlc2NyaWJlcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0aGF0IFB5dGhvbiB1c2VzIG9yIGRlZmluZXMuCi0KLQotVGhlcmUgaXMgYWxzbyBhIGdlbmVyaWMgdmVyc2lvbiBvZiB0aGVzZSBkaXJlY3RpdmVzOgotCi0uLiBkZXNjcmliZTo6IGRlc2NyaWJlCi0KLSAgIFRoaXMgZGlyZWN0aXZlIHByb2R1Y2VzIHRoZSBzYW1lIGZvcm1hdHRpbmcgYXMgdGhlIHNwZWNpZmljIG9uZXMgZXhwbGFpbmVkCi0gICBhYm92ZSBidXQgZG9lcyBub3QgY3JlYXRlIGluZGV4IGVudHJpZXMgb3IgY3Jvc3MtcmVmZXJlbmNpbmcgdGFyZ2V0cy4gIEl0IGlzCi0gICB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gZGVzY3JpYmUgdGhlIGRpcmVjdGl2ZXMgaW4gdGhpcyBkb2N1bWVudC4gRXhhbXBsZTo6Ci0KLSAgICAgIC4uIGRlc2NyaWJlOjogb3Bjb2RlCi0KLSAgICAgICAgIERlc2NyaWJlcyBhIFB5dGhvbiBieXRlY29kZSBpbnN0cnVjdGlvbi4KLQotCi1TaG93aW5nIGNvZGUgZXhhbXBsZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1FeGFtcGxlcyBvZiBQeXRob24gc291cmNlIGNvZGUgb3IgaW50ZXJhY3RpdmUgc2Vzc2lvbnMgYXJlIHJlcHJlc2VudGVkIHVzaW5nCi1zdGFuZGFyZCByZVNUIGxpdGVyYWwgYmxvY2tzLiAgVGhleSBhcmUgc3RhcnRlZCBieSBhIGBgOjpgYCBhdCB0aGUgZW5kIG9mIHRoZQotcHJlY2VkaW5nIHBhcmFncmFwaCBhbmQgZGVsaW1pdGVkIGJ5IGluZGVudGF0aW9uLgotCi1SZXByZXNlbnRpbmcgYW4gaW50ZXJhY3RpdmUgc2Vzc2lvbiByZXF1aXJlcyBpbmNsdWRpbmcgdGhlIHByb21wdHMgYW5kIG91dHB1dAotYWxvbmcgd2l0aCB0aGUgUHl0aG9uIGNvZGUuICBObyBzcGVjaWFsIG1hcmt1cCBpcyByZXF1aXJlZCBmb3IgaW50ZXJhY3RpdmUKLXNlc3Npb25zLiAgQWZ0ZXIgdGhlIGxhc3QgbGluZSBvZiBpbnB1dCBvciBvdXRwdXQgcHJlc2VudGVkLCB0aGVyZSBzaG91bGQgbm90IGJlCi1hbiAidW51c2VkIiBwcmltYXJ5IHByb21wdDsgdGhpcyBpcyBhbiBleGFtcGxlIG9mIHdoYXQgKm5vdCogdG8gZG86OgotCi0gICA+Pj4gMSArIDEKLSAgIDIKLSAgID4+PgotCi1TeW50YXggaGlnaGxpZ2h0aW5nIGlzIGhhbmRsZWQgaW4gYSBzbWFydCB3YXk6Ci0KLSogVGhlcmUgaXMgYSAiaGlnaGxpZ2h0aW5nIGxhbmd1YWdlIiBmb3IgZWFjaCBzb3VyY2UgZmlsZS4gIFBlciBkZWZhdWx0LAotICB0aGlzIGlzIGBgJ3B5dGhvbidgYCBhcyB0aGUgbWFqb3JpdHkgb2YgZmlsZXMgd2lsbCBoYXZlIHRvIGhpZ2hsaWdodCBQeXRob24KLSAgc25pcHBldHMuCi0KLSogV2l0aGluIFB5dGhvbiBoaWdobGlnaHRpbmcgbW9kZSwgaW50ZXJhY3RpdmUgc2Vzc2lvbnMgYXJlIHJlY29nbml6ZWQKLSAgYXV0b21hdGljYWxseSBhbmQgaGlnaGxpZ2h0ZWQgYXBwcm9wcmlhdGVseS4KLQotKiBUaGUgaGlnaGxpZ2h0aW5nIGxhbmd1YWdlIGNhbiBiZSBjaGFuZ2VkIHVzaW5nIHRoZSBgYGhpZ2hsaWdodGxhbmdgYAotICBkaXJlY3RpdmUsIHVzZWQgYXMgZm9sbG93czo6Ci0KLSAgICAgLi4gaGlnaGxpZ2h0bGFuZzo6IGMKLQotICBUaGlzIGxhbmd1YWdlIGlzIHVzZWQgdW50aWwgdGhlIG5leHQgYGBoaWdobGlnaHRsYW5nYGAgZGlyZWN0aXZlIGlzCi0gIGVuY291bnRlcmVkLgotCi0qIFRoZSB2YWx1ZXMgbm9ybWFsbHkgdXNlZCBmb3IgdGhlIGhpZ2hsaWdodGluZyBsYW5ndWFnZSBhcmU6Ci0KLSAgKiBgYHB5dGhvbmBgICh0aGUgZGVmYXVsdCkKLSAgKiBgYGNgYAotICAqIGBgcmVzdGBgCi0gICogYGBub25lYGAgKG5vIGhpZ2hsaWdodGluZykKLQotKiBJZiBoaWdobGlnaHRpbmcgd2l0aCB0aGUgY3VycmVudCBsYW5ndWFnZSBmYWlscywgdGhlIGJsb2NrIGlzIG5vdCBoaWdobGlnaHRlZAotICBpbiBhbnkgd2F5LgotCi1Mb25nZXIgZGlzcGxheXMgb2YgdmVyYmF0aW0gdGV4dCBtYXkgYmUgaW5jbHVkZWQgYnkgc3RvcmluZyB0aGUgZXhhbXBsZSB0ZXh0IGluCi1hbiBleHRlcm5hbCBmaWxlIGNvbnRhaW5pbmcgb25seSBwbGFpbiB0ZXh0LiAgVGhlIGZpbGUgbWF5IGJlIGluY2x1ZGVkIHVzaW5nIHRoZQotYGBsaXRlcmFsaW5jbHVkZWBgIGRpcmVjdGl2ZS4gWzFdXyBGb3IgZXhhbXBsZSwgdG8gaW5jbHVkZSB0aGUgUHl0aG9uIHNvdXJjZSBmaWxlCi06ZmlsZTpgZXhhbXBsZS5weWAsIHVzZTo6Ci0KLSAgIC4uIGxpdGVyYWxpbmNsdWRlOjogZXhhbXBsZS5weQotCi1UaGUgZmlsZSBuYW1lIGlzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGZpbGUncyBwYXRoLiAgRG9jdW1lbnRhdGlvbi1zcGVjaWZpYwotaW5jbHVkZSBmaWxlcyBzaG91bGQgYmUgcGxhY2VkIGluIHRoZSBgYERvYy9pbmNsdWRlc2BgIHN1YmRpcmVjdG9yeS4KLQotCi1JbmxpbmUgbWFya3VwCi0tLS0tLS0tLS0tLS0tCi0KLUFzIHNhaWQgYmVmb3JlLCBTcGhpbnggdXNlcyBpbnRlcnByZXRlZCB0ZXh0IHJvbGVzIHRvIGluc2VydCBzZW1hbnRpYyBtYXJrdXAgaW4KLWRvY3VtZW50cy4KLQotTmFtZXMgb2YgbG9jYWwgdmFyaWFibGVzLCBzdWNoIGFzIGZ1bmN0aW9uL21ldGhvZCBhcmd1bWVudHMsIGFyZSBhbiBleGNlcHRpb24sCi10aGV5IHNob3VsZCBiZSBtYXJrZWQgc2ltcGx5IHdpdGggYGAqdmFyKmBgLgotCi1Gb3IgYWxsIG90aGVyIHJvbGVzLCB5b3UgaGF2ZSB0byB3cml0ZSBgYDpyb2xlbmFtZTpgY29udGVudGBgYC4KLQotVGhlcmUgYXJlIHNvbWUgYWRkaXRpb25hbCBmYWNpbGl0aWVzIHRoYXQgbWFrZSBjcm9zcy1yZWZlcmVuY2luZyByb2xlcyBtb3JlCi12ZXJzYXRpbGU6Ci0KLSogWW91IG1heSBzdXBwbHkgYW4gZXhwbGljaXQgdGl0bGUgYW5kIHJlZmVyZW5jZSB0YXJnZXQsIGxpa2UgaW4gcmVTVCBkaXJlY3QKLSAgaHlwZXJsaW5rczogYGA6cm9sZTpgdGl0bGUgPHRhcmdldD5gYGAgd2lsbCByZWZlciB0byAqdGFyZ2V0KiwgYnV0IHRoZSBsaW5rCi0gIHRleHQgd2lsbCBiZSAqdGl0bGUqLgotCi0qIElmIHlvdSBwcmVmaXggdGhlIGNvbnRlbnQgd2l0aCBgYCFgYCwgbm8gcmVmZXJlbmNlL2h5cGVybGluayB3aWxsIGJlIGNyZWF0ZWQuCi0KLSogRm9yIHRoZSBQeXRob24gb2JqZWN0IHJvbGVzLCBpZiB5b3UgcHJlZml4IHRoZSBjb250ZW50IHdpdGggYGB+YGAsIHRoZSBsaW5rCi0gIHRleHQgd2lsbCBvbmx5IGJlIHRoZSBsYXN0IGNvbXBvbmVudCBvZiB0aGUgdGFyZ2V0LiAgRm9yIGV4YW1wbGUsCi0gIGBgOm1ldGg6YH5RdWV1ZS5RdWV1ZS5nZXRgYGAgd2lsbCByZWZlciB0byBgYFF1ZXVlLlF1ZXVlLmdldGBgIGJ1dCBvbmx5Ci0gIGRpc3BsYXkgYGBnZXRgYCBhcyB0aGUgbGluayB0ZXh0LgotCi0gIEluIEhUTUwgb3V0cHV0LCB0aGUgbGluaydzIGBgdGl0bGVgYCBhdHRyaWJ1dGUgKHRoYXQgaXMgZS5nLiBzaG93biBhcyBhCi0gIHRvb2wtdGlwIG9uIG1vdXNlLWhvdmVyKSB3aWxsIGFsd2F5cyBiZSB0aGUgZnVsbCB0YXJnZXQgbmFtZS4KLQotVGhlIGZvbGxvd2luZyByb2xlcyByZWZlciB0byBvYmplY3RzIGluIG1vZHVsZXMgYW5kIGFyZSBwb3NzaWJseSBoeXBlcmxpbmtlZCBpZgotYSBtYXRjaGluZyBpZGVudGlmaWVyIGlzIGZvdW5kOgotCi0uLiBkZXNjcmliZTo6IG1vZAotCi0gICBUaGUgbmFtZSBvZiBhIG1vZHVsZTsgYSBkb3R0ZWQgbmFtZSBtYXkgYmUgdXNlZC4gIFRoaXMgc2hvdWxkIGFsc28gYmUgdXNlZCBmb3IKLSAgIHBhY2thZ2UgbmFtZXMuCi0KLS4uIGRlc2NyaWJlOjogZnVuYwotCi0gICBUaGUgbmFtZSBvZiBhIFB5dGhvbiBmdW5jdGlvbjsgZG90dGVkIG5hbWVzIG1heSBiZSB1c2VkLiAgVGhlIHJvbGUgdGV4dAotICAgc2hvdWxkIG5vdCBpbmNsdWRlIHRyYWlsaW5nIHBhcmVudGhlc2VzIHRvIGVuaGFuY2UgcmVhZGFiaWxpdHkuICBUaGUKLSAgIHBhcmVudGhlc2VzIGFyZSBzdHJpcHBlZCB3aGVuIHNlYXJjaGluZyBmb3IgaWRlbnRpZmllcnMuCi0KLS4uIGRlc2NyaWJlOjogZGF0YQotCi0gICBUaGUgbmFtZSBvZiBhIG1vZHVsZS1sZXZlbCB2YXJpYWJsZSBvciBjb25zdGFudC4KLQotLi4gZGVzY3JpYmU6OiBjb25zdAotCi0gICBUaGUgbmFtZSBvZiBhICJkZWZpbmVkIiBjb25zdGFudC4gIFRoaXMgbWF5IGJlIGEgQy1sYW5ndWFnZSBgYCNkZWZpbmVgYAotICAgb3IgYSBQeXRob24gdmFyaWFibGUgdGhhdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgY2hhbmdlZC4KLQotLi4gZGVzY3JpYmU6OiBjbGFzcwotCi0gICBBIGNsYXNzIG5hbWU7IGEgZG90dGVkIG5hbWUgbWF5IGJlIHVzZWQuCi0KLS4uIGRlc2NyaWJlOjogbWV0aAotCi0gICBUaGUgbmFtZSBvZiBhIG1ldGhvZCBvZiBhbiBvYmplY3QuICBUaGUgcm9sZSB0ZXh0IHNob3VsZCBpbmNsdWRlIHRoZSB0eXBlCi0gICBuYW1lIGFuZCB0aGUgbWV0aG9kIG5hbWUuICBBIGRvdHRlZCBuYW1lIG1heSBiZSB1c2VkLgotCi0uLiBkZXNjcmliZTo6IGF0dHIKLQotICAgVGhlIG5hbWUgb2YgYSBkYXRhIGF0dHJpYnV0ZSBvZiBhbiBvYmplY3QuCi0KLS4uIGRlc2NyaWJlOjogZXhjCi0KLSAgIFRoZSBuYW1lIG9mIGFuIGV4Y2VwdGlvbi4gQSBkb3R0ZWQgbmFtZSBtYXkgYmUgdXNlZC4KLQotVGhlIG5hbWUgZW5jbG9zZWQgaW4gdGhpcyBtYXJrdXAgY2FuIGluY2x1ZGUgYSBtb2R1bGUgbmFtZSBhbmQvb3IgYSBjbGFzcyBuYW1lLgotRm9yIGV4YW1wbGUsIGBgOmZ1bmM6YGZpbHRlcmBgYCBjb3VsZCByZWZlciB0byBhIGZ1bmN0aW9uIG5hbWVkIGBgZmlsdGVyYGAgaW4KLXRoZSBjdXJyZW50IG1vZHVsZSwgb3IgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIG9mIHRoYXQgbmFtZS4gIEluIGNvbnRyYXN0LAotYGA6ZnVuYzpgZm9vLmZpbHRlcmBgYCBjbGVhcmx5IHJlZmVycyB0byB0aGUgYGBmaWx0ZXJgYCBmdW5jdGlvbiBpbiB0aGUgYGBmb29gYAotbW9kdWxlLgotCi1Ob3JtYWxseSwgbmFtZXMgaW4gdGhlc2Ugcm9sZXMgYXJlIHNlYXJjaGVkIGZpcnN0IHdpdGhvdXQgYW55IGZ1cnRoZXIKLXF1YWxpZmljYXRpb24sIHRoZW4gd2l0aCB0aGUgY3VycmVudCBtb2R1bGUgbmFtZSBwcmVwZW5kZWQsIHRoZW4gd2l0aCB0aGUKLWN1cnJlbnQgbW9kdWxlIGFuZCBjbGFzcyBuYW1lIChpZiBhbnkpIHByZXBlbmRlZC4gIElmIHlvdSBwcmVmaXggdGhlIG5hbWUgd2l0aCBhCi1kb3QsIHRoaXMgb3JkZXIgaXMgcmV2ZXJzZWQuICBGb3IgZXhhbXBsZSwgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlCi06bW9kOmBjb2RlY3NgIG1vZHVsZSwgYGA6ZnVuYzpgb3BlbmBgYCBhbHdheXMgcmVmZXJzIHRvIHRoZSBidWlsdC1pbiBmdW5jdGlvbiwKLXdoaWxlIGBgOmZ1bmM6YC5vcGVuYGBgIHJlZmVycyB0byA6ZnVuYzpgY29kZWNzLm9wZW5gLgotCi1BIHNpbWlsYXIgaGV1cmlzdGljIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIG5hbWUgaXMgYW4gYXR0cmlidXRlIG9mCi10aGUgY3VycmVudGx5IGRvY3VtZW50ZWQgY2xhc3MuCi0KLVRoZSBmb2xsb3dpbmcgcm9sZXMgY3JlYXRlIGNyb3NzLXJlZmVyZW5jZXMgdG8gQy1sYW5ndWFnZSBjb25zdHJ1Y3RzIGlmIHRoZXkKLWFyZSBkZWZpbmVkIGluIHRoZSBBUEkgZG9jdW1lbnRhdGlvbjoKLQotLi4gZGVzY3JpYmU6OiBjZGF0YQotCi0gICBUaGUgbmFtZSBvZiBhIEMtbGFuZ3VhZ2UgdmFyaWFibGUuCi0KLS4uIGRlc2NyaWJlOjogY2Z1bmMKLQotICAgVGhlIG5hbWUgb2YgYSBDLWxhbmd1YWdlIGZ1bmN0aW9uLiBTaG91bGQgaW5jbHVkZSB0cmFpbGluZyBwYXJlbnRoZXNlcy4KLQotLi4gZGVzY3JpYmU6OiBjbWFjcm8KLQotICAgVGhlIG5hbWUgb2YgYSAic2ltcGxlIiBDIG1hY3JvLCBhcyBkZWZpbmVkIGFib3ZlLgotCi0uLiBkZXNjcmliZTo6IGN0eXBlCi0KLSAgIFRoZSBuYW1lIG9mIGEgQy1sYW5ndWFnZSB0eXBlLgotCi0KLVRoZSBmb2xsb3dpbmcgcm9sZSBkb2VzIHBvc3NpYmx5IGNyZWF0ZSBhIGNyb3NzLXJlZmVyZW5jZSwgYnV0IGRvZXMgbm90IHJlZmVyCi10byBvYmplY3RzOgotCi0uLiBkZXNjcmliZTo6IHRva2VuCi0KLSAgIFRoZSBuYW1lIG9mIGEgZ3JhbW1hciB0b2tlbiAodXNlZCBpbiB0aGUgcmVmZXJlbmNlIG1hbnVhbCB0byBjcmVhdGUgbGlua3MKLSAgIGJldHdlZW4gcHJvZHVjdGlvbiBkaXNwbGF5cykuCi0KLQotVGhlIGZvbGxvd2luZyByb2xlIGNyZWF0ZXMgYSBjcm9zcy1yZWZlcmVuY2UgdG8gdGhlIHRlcm0gaW4gdGhlIGdsb3NzYXJ5OgotCi0uLiBkZXNjcmliZTo6IHRlcm0KLQotICAgUmVmZXJlbmNlIHRvIGEgdGVybSBpbiB0aGUgZ2xvc3NhcnkuICBUaGUgZ2xvc3NhcnkgaXMgY3JlYXRlZCB1c2luZyB0aGUKLSAgIGBgZ2xvc3NhcnlgYCBkaXJlY3RpdmUgY29udGFpbmluZyBhIGRlZmluaXRpb24gbGlzdCB3aXRoIHRlcm1zIGFuZAotICAgZGVmaW5pdGlvbnMuICBJdCBkb2VzIG5vdCBoYXZlIHRvIGJlIGluIHRoZSBzYW1lIGZpbGUgYXMgdGhlIGBgdGVybWBgCi0gICBtYXJrdXAsIGluIGZhY3QsIGJ5IGRlZmF1bHQgdGhlIFB5dGhvbiBkb2NzIGhhdmUgb25lIGdsb2JhbCBnbG9zc2FyeQotICAgaW4gdGhlIGBgZ2xvc3NhcnkucnN0YGAgZmlsZS4KLQotICAgSWYgeW91IHVzZSBhIHRlcm0gdGhhdCdzIG5vdCBleHBsYWluZWQgaW4gYSBnbG9zc2FyeSwgeW91J2xsIGdldCBhIHdhcm5pbmcKLSAgIGR1cmluZyBidWlsZC4KLQotLS0tLS0tLS0tCi0KLVRoZSBmb2xsb3dpbmcgcm9sZXMgZG9uJ3QgZG8gYW55dGhpbmcgc3BlY2lhbCBleGNlcHQgZm9ybWF0dGluZyB0aGUgdGV4dAotaW4gYSBkaWZmZXJlbnQgc3R5bGU6Ci0KLS4uIGRlc2NyaWJlOjogY29tbWFuZAotCi0gICBUaGUgbmFtZSBvZiBhbiBPUy1sZXZlbCBjb21tYW5kLCBzdWNoIGFzIGBgcm1gYC4KLQotLi4gZGVzY3JpYmU6OiBkZm4KLQotICAgTWFyayB0aGUgZGVmaW5pbmcgaW5zdGFuY2Ugb2YgYSB0ZXJtIGluIHRoZSB0ZXh0LiAgKE5vIGluZGV4IGVudHJpZXMgYXJlCi0gICBnZW5lcmF0ZWQuKQotCi0uLiBkZXNjcmliZTo6IGVudnZhcgotCi0gICBBbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIEluZGV4IGVudHJpZXMgYXJlIGdlbmVyYXRlZC4KLQotLi4gZGVzY3JpYmU6OiBmaWxlCi0KLSAgIFRoZSBuYW1lIG9mIGEgZmlsZSBvciBkaXJlY3RvcnkuICBXaXRoaW4gdGhlIGNvbnRlbnRzLCB5b3UgY2FuIHVzZSBjdXJseQotICAgYnJhY2VzIHRvIGluZGljYXRlIGEgInZhcmlhYmxlIiBwYXJ0LCBmb3IgZXhhbXBsZTo6Ci0KLSAgICAgIC4uLiBpcyBpbnN0YWxsZWQgaW4gOmZpbGU6YC91c3IvbGliL3B5dGhvbjIue3h9L3NpdGUtcGFja2FnZXNgIC4uLgotCi0gICBJbiB0aGUgYnVpbHQgZG9jdW1lbnRhdGlvbiwgdGhlIGBgeGBgIHdpbGwgYmUgZGlzcGxheWVkIGRpZmZlcmVudGx5IHRvCi0gICBpbmRpY2F0ZSB0aGF0IGl0IGlzIHRvIGJlIHJlcGxhY2VkIGJ5IHRoZSBQeXRob24gbWlub3IgdmVyc2lvbi4KLQotLi4gZGVzY3JpYmU6OiBndWlsYWJlbAotCi0gICBMYWJlbHMgcHJlc2VudGVkIGFzIHBhcnQgb2YgYW4gaW50ZXJhY3RpdmUgdXNlciBpbnRlcmZhY2Ugc2hvdWxkIGJlIG1hcmtlZAotICAgdXNpbmcgYGBndWlsYWJlbGBgLiAgVGhpcyBpbmNsdWRlcyBsYWJlbHMgZnJvbSB0ZXh0LWJhc2VkIGludGVyZmFjZXMgc3VjaCBhcwotICAgdGhvc2UgY3JlYXRlZCB1c2luZyA6bW9kOmBjdXJzZXNgIG9yIG90aGVyIHRleHQtYmFzZWQgbGlicmFyaWVzLiAgQW55IGxhYmVsCi0gICB1c2VkIGluIHRoZSBpbnRlcmZhY2Ugc2hvdWxkIGJlIG1hcmtlZCB3aXRoIHRoaXMgcm9sZSwgaW5jbHVkaW5nIGJ1dHRvbgotICAgbGFiZWxzLCB3aW5kb3cgdGl0bGVzLCBmaWVsZCBuYW1lcywgbWVudSBhbmQgbWVudSBzZWxlY3Rpb24gbmFtZXMsIGFuZCBldmVuCi0gICB2YWx1ZXMgaW4gc2VsZWN0aW9uIGxpc3RzLgotCi0uLiBkZXNjcmliZTo6IGtiZAotCi0gICBNYXJrIGEgc2VxdWVuY2Ugb2Yga2V5c3Ryb2tlcy4gIFdoYXQgZm9ybSB0aGUga2V5IHNlcXVlbmNlIHRha2VzIG1heSBkZXBlbmQKLSAgIG9uIHBsYXRmb3JtLSBvciBhcHBsaWNhdGlvbi1zcGVjaWZpYyBjb252ZW50aW9ucy4gIFdoZW4gdGhlcmUgYXJlIG5vIHJlbGV2YW50Ci0gICBjb252ZW50aW9ucywgdGhlIG5hbWVzIG9mIG1vZGlmaWVyIGtleXMgc2hvdWxkIGJlIHNwZWxsZWQgb3V0LCB0byBpbXByb3ZlCi0gICBhY2Nlc3NpYmlsaXR5IGZvciBuZXcgdXNlcnMgYW5kIG5vbi1uYXRpdmUgc3BlYWtlcnMuICBGb3IgZXhhbXBsZSwgYW4KLSAgICp4ZW1hY3MqIGtleSBzZXF1ZW5jZSBtYXkgYmUgbWFya2VkIGxpa2UgYGA6a2JkOmBDLXggQy1mYGBgLCBidXQgd2l0aG91dAotICAgcmVmZXJlbmNlIHRvIGEgc3BlY2lmaWMgYXBwbGljYXRpb24gb3IgcGxhdGZvcm0sIHRoZSBzYW1lIHNlcXVlbmNlIHNob3VsZCBiZQotICAgbWFya2VkIGFzIGBgOmtiZDpgQ29udHJvbC14IENvbnRyb2wtZmBgYC4KLQotLi4gZGVzY3JpYmU6OiBrZXl3b3JkCi0KLSAgIFRoZSBuYW1lIG9mIGEgUHl0aG9uIGtleXdvcmQuICBVc2luZyB0aGlzIHJvbGUgd2lsbCBnZW5lcmF0ZSBhIGxpbmsgdG8gdGhlCi0gICBkb2N1bWVudGF0aW9uIG9mIHRoZSBrZXl3b3JkLiAgYGBUcnVlYGAsIGBgRmFsc2VgYCBhbmQgYGBOb25lYGAgZG8gbm90IHVzZQotICAgdGhpcyByb2xlLCBidXQgc2ltcGxlIGNvZGUgbWFya3VwIChgYGBgVHJ1ZWBgYGApLCBnaXZlbiB0aGF0IHRoZXkncmUKLSAgIGZ1bmRhbWVudGFsIHRvIHRoZSBsYW5ndWFnZSBhbmQgc2hvdWxkIGJlIGtub3duIHRvIGFueSBwcm9ncmFtbWVyLgotCi0uLiBkZXNjcmliZTo6IG1haWxoZWFkZXIKLQotICAgVGhlIG5hbWUgb2YgYW4gUkZDIDgyMi1zdHlsZSBtYWlsIGhlYWRlci4gIFRoaXMgbWFya3VwIGRvZXMgbm90IGltcGx5IHRoYXQKLSAgIHRoZSBoZWFkZXIgaXMgYmVpbmcgdXNlZCBpbiBhbiBlbWFpbCBtZXNzYWdlLCBidXQgY2FuIGJlIHVzZWQgdG8gcmVmZXIgdG8gYW55Ci0gICBoZWFkZXIgb2YgdGhlIHNhbWUgInN0eWxlLiIgIFRoaXMgaXMgYWxzbyB1c2VkIGZvciBoZWFkZXJzIGRlZmluZWQgYnkgdGhlCi0gICB2YXJpb3VzIE1JTUUgc3BlY2lmaWNhdGlvbnMuICBUaGUgaGVhZGVyIG5hbWUgc2hvdWxkIGJlIGVudGVyZWQgaW4gdGhlIHNhbWUKLSAgIHdheSBpdCB3b3VsZCBub3JtYWxseSBiZSBmb3VuZCBpbiBwcmFjdGljZSwgd2l0aCB0aGUgY2FtZWwtY2FzaW5nIGNvbnZlbnRpb25zCi0gICBiZWluZyBwcmVmZXJyZWQgd2hlcmUgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBjb21tb24gdXNhZ2UuIEZvciBleGFtcGxlOgotICAgYGA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYGBgLgotCi0uLiBkZXNjcmliZTo6IG1ha2V2YXIKLQotICAgVGhlIG5hbWUgb2YgYSA6Y29tbWFuZDpgbWFrZWAgdmFyaWFibGUuCi0KLS4uIGRlc2NyaWJlOjogbWFucGFnZQotCi0gICBBIHJlZmVyZW5jZSB0byBhIFVuaXggbWFudWFsIHBhZ2UgaW5jbHVkaW5nIHRoZSBzZWN0aW9uLAotICAgZS5nLiBgYDptYW5wYWdlOmBscygxKWBgYC4KLQotLi4gZGVzY3JpYmU6OiBtZW51c2VsZWN0aW9uCi0KLSAgIE1lbnUgc2VsZWN0aW9ucyBzaG91bGQgYmUgbWFya2VkIHVzaW5nIHRoZSBgYG1lbnVzZWxlY3Rpb25gYCByb2xlLiAgVGhpcyBpcwotICAgdXNlZCB0byBtYXJrIGEgY29tcGxldGUgc2VxdWVuY2Ugb2YgbWVudSBzZWxlY3Rpb25zLCBpbmNsdWRpbmcgc2VsZWN0aW5nCi0gICBzdWJtZW51cyBhbmQgY2hvb3NpbmcgYSBzcGVjaWZpYyBvcGVyYXRpb24sIG9yIGFueSBzdWJzZXF1ZW5jZSBvZiBzdWNoIGEKLSAgIHNlcXVlbmNlLiAgVGhlIG5hbWVzIG9mIGluZGl2aWR1YWwgc2VsZWN0aW9ucyBzaG91bGQgYmUgc2VwYXJhdGVkIGJ5Ci0gICBgYC0tPmBgLgotCi0gICBGb3IgZXhhbXBsZSwgdG8gbWFyayB0aGUgc2VsZWN0aW9uICJTdGFydCA+IFByb2dyYW1zIiwgdXNlIHRoaXMgbWFya3VwOjoKLQotICAgICAgOm1lbnVzZWxlY3Rpb246YFN0YXJ0IC0tPiBQcm9ncmFtc2AKLQotICAgV2hlbiBpbmNsdWRpbmcgYSBzZWxlY3Rpb24gdGhhdCBpbmNsdWRlcyBzb21lIHRyYWlsaW5nIGluZGljYXRvciwgc3VjaCBhcyB0aGUKLSAgIGVsbGlwc2lzIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMgdXNlIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbW1hbmQgb3BlbnMgYQotICAgZGlhbG9nLCB0aGUgaW5kaWNhdG9yIHNob3VsZCBiZSBvbWl0dGVkIGZyb20gdGhlIHNlbGVjdGlvbiBuYW1lLgotCi0uLiBkZXNjcmliZTo6IG1pbWV0eXBlCi0KLSAgIFRoZSBuYW1lIG9mIGEgTUlNRSB0eXBlLCBvciBhIGNvbXBvbmVudCBvZiBhIE1JTUUgdHlwZSAodGhlIG1ham9yIG9yIG1pbm9yCi0gICBwb3J0aW9uLCB0YWtlbiBhbG9uZSkuCi0KLS4uIGRlc2NyaWJlOjogbmV3c2dyb3VwCi0KLSAgIFRoZSBuYW1lIG9mIGEgVXNlbmV0IG5ld3Nncm91cC4KLQotLi4gZGVzY3JpYmU6OiBvcHRpb24KLQotICAgQSBjb21tYW5kLWxpbmUgb3B0aW9uIG9mIFB5dGhvbi4gIFRoZSBsZWFkaW5nIGh5cGhlbihzKSBtdXN0IGJlIGluY2x1ZGVkLgotICAgSWYgYSBtYXRjaGluZyBgYGNtZG9wdGlvbmBgIGRpcmVjdGl2ZSBleGlzdHMsIGl0IGlzIGxpbmtlZCB0by4gIEZvciBvcHRpb25zCi0gICBvZiBvdGhlciBwcm9ncmFtcyBvciBzY3JpcHRzLCB1c2Ugc2ltcGxlIGBgYGBjb2RlYGBgYCBtYXJrdXAuCi0KLS4uIGRlc2NyaWJlOjogcHJvZ3JhbQotCi0gICBUaGUgbmFtZSBvZiBhbiBleGVjdXRhYmxlIHByb2dyYW0uICBUaGlzIG1heSBkaWZmZXIgZnJvbSB0aGUgZmlsZSBuYW1lIGZvcgotICAgdGhlIGV4ZWN1dGFibGUgZm9yIHNvbWUgcGxhdGZvcm1zLiAgSW4gcGFydGljdWxhciwgdGhlIGBgLmV4ZWBgIChvciBvdGhlcikKLSAgIGV4dGVuc2lvbiBzaG91bGQgYmUgb21pdHRlZCBmb3IgV2luZG93cyBwcm9ncmFtcy4KLQotLi4gZGVzY3JpYmU6OiByZWdleHAKLQotICAgQSByZWd1bGFyIGV4cHJlc3Npb24uIFF1b3RlcyBzaG91bGQgbm90IGJlIGluY2x1ZGVkLgotCi0uLiBkZXNjcmliZTo6IHNhbXAKLQotICAgQSBwaWVjZSBvZiBsaXRlcmFsIHRleHQsIHN1Y2ggYXMgY29kZS4gIFdpdGhpbiB0aGUgY29udGVudHMsIHlvdSBjYW4gdXNlCi0gICBjdXJseSBicmFjZXMgdG8gaW5kaWNhdGUgYSAidmFyaWFibGUiIHBhcnQsIGFzIGluIGBgOmZpbGU6YGAuCi0KLSAgIElmIHlvdSBkb24ndCBuZWVkIHRoZSAidmFyaWFibGUgcGFydCIgaW5kaWNhdGlvbiwgdXNlIHRoZSBzdGFuZGFyZAotICAgYGBgYGNvZGVgYGBgIGluc3RlYWQuCi0KLQotVGhlIGZvbGxvd2luZyByb2xlcyBnZW5lcmF0ZSBleHRlcm5hbCBsaW5rczoKLQotLi4gZGVzY3JpYmU6OiBwZXAKLQotICAgQSByZWZlcmVuY2UgdG8gYSBQeXRob24gRW5oYW5jZW1lbnQgUHJvcG9zYWwuICBUaGlzIGdlbmVyYXRlcyBhcHByb3ByaWF0ZQotICAgaW5kZXggZW50cmllcy4gVGhlIHRleHQgIlBFUCAqbnVtYmVyKlwgIiBpcyBnZW5lcmF0ZWQ7IGluIHRoZSBIVE1MIG91dHB1dCwKLSAgIHRoaXMgdGV4dCBpcyBhIGh5cGVybGluayB0byBhbiBvbmxpbmUgY29weSBvZiB0aGUgc3BlY2lmaWVkIFBFUC4KLQotLi4gZGVzY3JpYmU6OiByZmMKLQotICAgQSByZWZlcmVuY2UgdG8gYW4gSW50ZXJuZXQgUmVxdWVzdCBmb3IgQ29tbWVudHMuICBUaGlzIGdlbmVyYXRlcyBhcHByb3ByaWF0ZQotICAgaW5kZXggZW50cmllcy4gVGhlIHRleHQgIlJGQyAqbnVtYmVyKlwgIiBpcyBnZW5lcmF0ZWQ7IGluIHRoZSBIVE1MIG91dHB1dCwKLSAgIHRoaXMgdGV4dCBpcyBhIGh5cGVybGluayB0byBhbiBvbmxpbmUgY29weSBvZiB0aGUgc3BlY2lmaWVkIFJGQy4KLQotCi1Ob3RlIHRoYXQgdGhlcmUgYXJlIG5vIHNwZWNpYWwgcm9sZXMgZm9yIGluY2x1ZGluZyBoeXBlcmxpbmtzIGFzIHlvdSBjYW4gdXNlCi10aGUgc3RhbmRhcmQgcmVTVCBtYXJrdXAgZm9yIHRoYXQgcHVycG9zZS4KLQotCi0uLiBfZG9jLXJlZi1yb2xlOgotCi1Dcm9zcy1saW5raW5nIG1hcmt1cAotLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVG8gc3VwcG9ydCBjcm9zcy1yZWZlcmVuY2luZyB0byBhcmJpdHJhcnkgc2VjdGlvbnMgaW4gdGhlIGRvY3VtZW50YXRpb24sIHRoZQotc3RhbmRhcmQgcmVTVCBsYWJlbHMgYXJlICJhYnVzZWQiIGEgYml0OiBFdmVyeSBsYWJlbCBtdXN0IHByZWNlZGUgYSBzZWN0aW9uCi10aXRsZTsgYW5kIGV2ZXJ5IGxhYmVsIG5hbWUgbXVzdCBiZSB1bmlxdWUgdGhyb3VnaG91dCB0aGUgZW50aXJlIGRvY3VtZW50YXRpb24KLXNvdXJjZS4KLQotWW91IGNhbiB0aGVuIHJlZmVyZW5jZSB0byB0aGVzZSBzZWN0aW9ucyB1c2luZyB0aGUgYGA6cmVmOmBsYWJlbC1uYW1lYGBgIHJvbGUuCi0KLUV4YW1wbGU6OgotCi0gICAuLiBfbXktcmVmZXJlbmNlLWxhYmVsOgotCi0gICBTZWN0aW9uIHRvIGNyb3NzLXJlZmVyZW5jZQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgVGhpcyBpcyB0aGUgdGV4dCBvZiB0aGUgc2VjdGlvbi4KLQotICAgSXQgcmVmZXJzIHRvIHRoZSBzZWN0aW9uIGl0c2VsZiwgc2VlIDpyZWY6YG15LXJlZmVyZW5jZS1sYWJlbGAuCi0KLVRoZSBgYDpyZWY6YGAgaW52b2NhdGlvbiBpcyByZXBsYWNlZCB3aXRoIHRoZSBzZWN0aW9uIHRpdGxlLgotCi0KLVBhcmFncmFwaC1sZXZlbCBtYXJrdXAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlc2UgZGlyZWN0aXZlcyBjcmVhdGUgc2hvcnQgcGFyYWdyYXBocyBhbmQgY2FuIGJlIHVzZWQgaW5zaWRlIGluZm9ybWF0aW9uCi11bml0cyBhcyB3ZWxsIGFzIG5vcm1hbCB0ZXh0OgotCi0uLiBkZXNjcmliZTo6IG5vdGUKLQotICAgQW4gZXNwZWNpYWxseSBpbXBvcnRhbnQgYml0IG9mIGluZm9ybWF0aW9uIGFib3V0IGFuIEFQSSB0aGF0IGEgdXNlciBzaG91bGQgYmUKLSAgIGF3YXJlIG9mIHdoZW4gdXNpbmcgd2hhdGV2ZXIgYml0IG9mIEFQSSB0aGUgbm90ZSBwZXJ0YWlucyB0by4gIFRoZSBjb250ZW50IG9mCi0gICB0aGUgZGlyZWN0aXZlIHNob3VsZCBiZSB3cml0dGVuIGluIGNvbXBsZXRlIHNlbnRlbmNlcyBhbmQgaW5jbHVkZSBhbGwKLSAgIGFwcHJvcHJpYXRlIHB1bmN0dWF0aW9uLgotCi0gICBFeGFtcGxlOjoKLQotICAgICAgLi4gbm90ZTo6Ci0KLSAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHN1aXRhYmxlIGZvciBzZW5kaW5nIHNwYW0gZS1tYWlscy4KLQotLi4gZGVzY3JpYmU6OiB3YXJuaW5nCi0KLSAgIEFuIGltcG9ydGFudCBiaXQgb2YgaW5mb3JtYXRpb24gYWJvdXQgYW4gQVBJIHRoYXQgYSB1c2VyIHNob3VsZCBiZSBhd2FyZSBvZgotICAgd2hlbiB1c2luZyB3aGF0ZXZlciBiaXQgb2YgQVBJIHRoZSB3YXJuaW5nIHBlcnRhaW5zIHRvLiAgVGhlIGNvbnRlbnQgb2YgdGhlCi0gICBkaXJlY3RpdmUgc2hvdWxkIGJlIHdyaXR0ZW4gaW4gY29tcGxldGUgc2VudGVuY2VzIGFuZCBpbmNsdWRlIGFsbCBhcHByb3ByaWF0ZQotICAgcHVuY3R1YXRpb24uICBJbiB0aGUgaW50ZXJlc3Qgb2Ygbm90IHNjYXJpbmcgdXNlcnMgYXdheSBmcm9tIHBhZ2VzIGZpbGxlZAotICAgd2l0aCB3YXJuaW5ncywgdGhpcyBkaXJlY3RpdmUgc2hvdWxkIG9ubHkgYmUgY2hvc2VuIG92ZXIgYGBub3RlYGAgZm9yCi0gICBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIHBvc3NpYmlsaXR5IG9mIGNyYXNoZXMsIGRhdGEgbG9zcywgb3Igc2VjdXJpdHkKLSAgIGltcGxpY2F0aW9ucy4KLQotLi4gZGVzY3JpYmU6OiB2ZXJzaW9uYWRkZWQKLQotICAgVGhpcyBkaXJlY3RpdmUgZG9jdW1lbnRzIHRoZSB2ZXJzaW9uIG9mIFB5dGhvbiB3aGljaCBhZGRlZCB0aGUgZGVzY3JpYmVkCi0gICBmZWF0dXJlIHRvIHRoZSBsaWJyYXJ5IG9yIEMgQVBJLiBXaGVuIHRoaXMgYXBwbGllcyB0byBhbiBlbnRpcmUgbW9kdWxlLCBpdAotICAgc2hvdWxkIGJlIHBsYWNlZCBhdCB0aGUgdG9wIG9mIHRoZSBtb2R1bGUgc2VjdGlvbiBiZWZvcmUgYW55IHByb3NlLgotCi0gICBUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBnaXZlbiBhbmQgaXMgdGhlIHZlcnNpb24gaW4gcXVlc3Rpb247IHlvdSBjYW4gYWRkCi0gICBhIHNlY29uZCBhcmd1bWVudCBjb25zaXN0aW5nIG9mIGEgKmJyaWVmKiBleHBsYW5hdGlvbiBvZiB0aGUgY2hhbmdlLgotCi0gICBFeGFtcGxlOjoKLQotICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMi41Ci0gICAgICAgICBUaGUgKnNwYW0qIHBhcmFtZXRlci4KLQotICAgTm90ZSB0aGF0IHRoZXJlIG11c3QgYmUgbm8gYmxhbmsgbGluZSBiZXR3ZWVuIHRoZSBkaXJlY3RpdmUgaGVhZCBhbmQgdGhlCi0gICBleHBsYW5hdGlvbjsgdGhpcyBpcyB0byBtYWtlIHRoZXNlIGJsb2NrcyB2aXN1YWxseSBjb250aW51b3VzIGluIHRoZSBtYXJrdXAuCi0KLS4uIGRlc2NyaWJlOjogdmVyc2lvbmNoYW5nZWQKLQotICAgU2ltaWxhciB0byBgYHZlcnNpb25hZGRlZGBgLCBidXQgZGVzY3JpYmVzIHdoZW4gYW5kIHdoYXQgY2hhbmdlZCBpbiB0aGUgbmFtZWQKLSAgIGZlYXR1cmUgaW4gc29tZSB3YXkgKG5ldyBwYXJhbWV0ZXJzLCBjaGFuZ2VkIHNpZGUgZWZmZWN0cywgZXRjLikuCi0KLS0tLS0tLS0tLS0tLS0tCi0KLS4uIGRlc2NyaWJlOjogaW1wbC1kZXRhaWwKLQotICAgVGhpcyBkaXJlY3RpdmUgaXMgdXNlZCB0byBtYXJrIENQeXRob24tc3BlY2lmaWMgaW5mb3JtYXRpb24uICBVc2UgZWl0aGVyIHdpdGgKLSAgIGEgYmxvY2sgY29udGVudCBvciBhIHNpbmdsZSBzZW50ZW5jZSBhcyBhbiBhcmd1bWVudCwgaS5lLiBlaXRoZXIgOjoKLQotICAgICAgLi4gaW1wbC1kZXRhaWw6OgotCi0gICAgICAgICBUaGlzIGRlc2NyaWJlcyBzb21lIGltcGxlbWVudGF0aW9uIGRldGFpbC4KLQotICAgICAgICAgTW9yZSBleHBsYW5hdGlvbi4KLQotICAgb3IgOjoKLQotICAgICAgLi4gaW1wbC1kZXRhaWw6OiBUaGlzIHNob3J0bHkgbWVudGlvbnMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLgotCi0gICAiXCAqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqXCAiIGlzIGF1dG9tYXRpY2FsbHkgcHJlcGVuZGVkIHRvIHRoZQotICAgY29udGVudC4KLQotLi4gZGVzY3JpYmU6OiBzZWVhbHNvCi0KLSAgIE1hbnkgc2VjdGlvbnMgaW5jbHVkZSBhIGxpc3Qgb2YgcmVmZXJlbmNlcyB0byBtb2R1bGUgZG9jdW1lbnRhdGlvbiBvcgotICAgZXh0ZXJuYWwgZG9jdW1lbnRzLiAgVGhlc2UgbGlzdHMgYXJlIGNyZWF0ZWQgdXNpbmcgdGhlIGBgc2VlYWxzb2BgIGRpcmVjdGl2ZS4KLQotICAgVGhlIGBgc2VlYWxzb2BgIGRpcmVjdGl2ZSBpcyB0eXBpY2FsbHkgcGxhY2VkIGluIGEgc2VjdGlvbiBqdXN0IGJlZm9yZSBhbnkKLSAgIHN1Yi1zZWN0aW9ucy4gIEZvciB0aGUgSFRNTCBvdXRwdXQsIGl0IGlzIHNob3duIGJveGVkIG9mZiBmcm9tIHRoZSBtYWluIGZsb3cKLSAgIG9mIHRoZSB0ZXh0LgotCi0gICBUaGUgY29udGVudCBvZiB0aGUgYGBzZWVhbHNvYGAgZGlyZWN0aXZlIHNob3VsZCBiZSBhIHJlU1QgZGVmaW5pdGlvbiBsaXN0LgotICAgRXhhbXBsZTo6Ci0KLSAgICAgIC4uIHNlZWFsc286OgotCi0gICAgICAgICBNb2R1bGUgOm1vZDpgemlwZmlsZWAKLSAgICAgICAgICAgIERvY3VtZW50YXRpb24gb2YgdGhlIDptb2Q6YHppcGZpbGVgIHN0YW5kYXJkIG1vZHVsZS4KLQotICAgICAgICAgYEdOVSB0YXIgbWFudWFsLCBCYXNpYyBUYXIgRm9ybWF0IDxodHRwOi8vbGluaz5gXwotICAgICAgICAgICAgRG9jdW1lbnRhdGlvbiBmb3IgdGFyIGFyY2hpdmUgZmlsZXMsIGluY2x1ZGluZyBHTlUgdGFyIGV4dGVuc2lvbnMuCi0KLS4uIGRlc2NyaWJlOjogcnVicmljCi0KLSAgIFRoaXMgZGlyZWN0aXZlIGNyZWF0ZXMgYSBwYXJhZ3JhcGggaGVhZGluZyB0aGF0IGlzIG5vdCB1c2VkIHRvIGNyZWF0ZSBhCi0gICB0YWJsZSBvZiBjb250ZW50cyBub2RlLiAgSXQgaXMgY3VycmVudGx5IHVzZWQgZm9yIHRoZSAiRm9vdG5vdGVzIiBjYXB0aW9uLgotCi0uLiBkZXNjcmliZTo6IGNlbnRlcmVkCi0KLSAgIFRoaXMgZGlyZWN0aXZlIGNyZWF0ZXMgYSBjZW50ZXJlZCBib2xkZmFjZWQgcGFyYWdyYXBoLiAgVXNlIGl0IGFzIGZvbGxvd3M6OgotCi0gICAgICAuLiBjZW50ZXJlZDo6Ci0KLSAgICAgICAgIFBhcmFncmFwaCBjb250ZW50cy4KLQotCi1UYWJsZS1vZi1jb250ZW50cyBtYXJrdXAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1TaW5jZSByZVNUIGRvZXMgbm90IGhhdmUgZmFjaWxpdGllcyB0byBpbnRlcmNvbm5lY3Qgc2V2ZXJhbCBkb2N1bWVudHMsIG9yIHNwbGl0Ci1kb2N1bWVudHMgaW50byBtdWx0aXBsZSBvdXRwdXQgZmlsZXMsIFNwaGlueCB1c2VzIGEgY3VzdG9tIGRpcmVjdGl2ZSB0byBhZGQKLXJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBzaW5nbGUgZmlsZXMgdGhlIGRvY3VtZW50YXRpb24gaXMgbWFkZSBvZiwgYXMgd2VsbCBhcwotdGFibGVzIG9mIGNvbnRlbnRzLiAgVGhlIGBgdG9jdHJlZWBgIGRpcmVjdGl2ZSBpcyB0aGUgY2VudHJhbCBlbGVtZW50LgotCi0uLiBkZXNjcmliZTo6IHRvY3RyZWUKLQotICAgVGhpcyBkaXJlY3RpdmUgaW5zZXJ0cyBhICJUT0MgdHJlZSIgYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24sIHVzaW5nIHRoZQotICAgaW5kaXZpZHVhbCBUT0NzIChpbmNsdWRpbmcgInN1Yi1UT0MgdHJlZXMiKSBvZiB0aGUgZmlsZXMgZ2l2ZW4gaW4gdGhlCi0gICBkaXJlY3RpdmUgYm9keS4gIEEgbnVtZXJpYyBgYG1heGRlcHRoYGAgb3B0aW9uIG1heSBiZSBnaXZlbiB0byBpbmRpY2F0ZSB0aGUKLSAgIGRlcHRoIG9mIHRoZSB0cmVlOyBieSBkZWZhdWx0LCBhbGwgbGV2ZWxzIGFyZSBpbmNsdWRlZC4KLQotICAgQ29uc2lkZXIgdGhpcyBleGFtcGxlICh0YWtlbiBmcm9tIHRoZSBsaWJyYXJ5IHJlZmVyZW5jZSBpbmRleCk6OgotCi0gICAgICAuLiB0b2N0cmVlOjoKLSAgICAgICAgIDptYXhkZXB0aDogMgotCi0gICAgICAgICBpbnRybwotICAgICAgICAgc3RyaW5ncwotICAgICAgICAgZGF0YXR5cGVzCi0gICAgICAgICBudW1lcmljCi0gICAgICAgICAobWFueSBtb3JlIGZpbGVzIGxpc3RlZCBoZXJlKQotCi0gICBUaGlzIGFjY29tcGxpc2hlcyB0d28gdGhpbmdzOgotCi0gICAqIFRhYmxlcyBvZiBjb250ZW50cyBmcm9tIGFsbCB0aG9zZSBmaWxlcyBhcmUgaW5zZXJ0ZWQsIHdpdGggYSBtYXhpbXVtIGRlcHRoCi0gICAgIG9mIHR3bywgdGhhdCBtZWFucyBvbmUgbmVzdGVkIGhlYWRpbmcuICBgYHRvY3RyZWVgYCBkaXJlY3RpdmVzIGluIHRob3NlCi0gICAgIGZpbGVzIGFyZSBhbHNvIHRha2VuIGludG8gYWNjb3VudC4KLSAgICogU3BoaW54IGtub3dzIHRoYXQgdGhlIHJlbGF0aXZlIG9yZGVyIG9mIHRoZSBmaWxlcyBgYGludHJvYGAsCi0gICAgIGBgc3RyaW5nc2BgIGFuZCBzbyBmb3J0aCwgYW5kIGl0IGtub3dzIHRoYXQgdGhleSBhcmUgY2hpbGRyZW4gb2YgdGhlCi0gICAgIHNob3duIGZpbGUsIHRoZSBsaWJyYXJ5IGluZGV4LiAgRnJvbSB0aGlzIGluZm9ybWF0aW9uIGl0IGdlbmVyYXRlcyAibmV4dAotICAgICBjaGFwdGVyIiwgInByZXZpb3VzIGNoYXB0ZXIiIGFuZCAicGFyZW50IGNoYXB0ZXIiIGxpbmtzLgotCi0gICBJbiB0aGUgZW5kLCBhbGwgZmlsZXMgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkIHByb2Nlc3MgbXVzdCBvY2N1ciBpbiBvbmUKLSAgIGBgdG9jdHJlZWBgIGRpcmVjdGl2ZTsgU3BoaW54IHdpbGwgZW1pdCBhIHdhcm5pbmcgaWYgaXQgZmluZHMgYSBmaWxlIHRoYXQgaXMKLSAgIG5vdCBpbmNsdWRlZCwgYmVjYXVzZSB0aGF0IG1lYW5zIHRoYXQgdGhpcyBmaWxlIHdpbGwgbm90IGJlIHJlYWNoYWJsZSB0aHJvdWdoCi0gICBzdGFuZGFyZCBuYXZpZ2F0aW9uLgotCi0gICBUaGUgc3BlY2lhbCBmaWxlIGBgY29udGVudHMucnN0YGAgYXQgdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSBkaXJlY3RvcnkgaXMgdGhlCi0gICAicm9vdCIgb2YgdGhlIFRPQyB0cmVlIGhpZXJhcmNoeTsgZnJvbSBpdCB0aGUgIkNvbnRlbnRzIiBwYWdlIGlzIGdlbmVyYXRlZC4KLQotCi1JbmRleC1nZW5lcmF0aW5nIG1hcmt1cAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotU3BoaW54IGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBpbmRleCBlbnRyaWVzIGZyb20gYWxsIGluZm9ybWF0aW9uIHVuaXRzIChsaWtlCi1mdW5jdGlvbnMsIGNsYXNzZXMgb3IgYXR0cmlidXRlcykgbGlrZSBkaXNjdXNzZWQgYmVmb3JlLgotCi1Ib3dldmVyLCB0aGVyZSBpcyBhbHNvIGFuIGV4cGxpY2l0IGRpcmVjdGl2ZSBhdmFpbGFibGUsIHRvIG1ha2UgdGhlIGluZGV4IG1vcmUKLWNvbXByZWhlbnNpdmUgYW5kIGVuYWJsZSBpbmRleCBlbnRyaWVzIGluIGRvY3VtZW50cyB3aGVyZSBpbmZvcm1hdGlvbiBpcyBub3QKLW1haW5seSBjb250YWluZWQgaW4gaW5mb3JtYXRpb24gdW5pdHMsIHN1Y2ggYXMgdGhlIGxhbmd1YWdlIHJlZmVyZW5jZS4KLQotVGhlIGRpcmVjdGl2ZSBpcyBgYGluZGV4YGAgYW5kIGNvbnRhaW5zIG9uZSBvciBtb3JlIGluZGV4IGVudHJpZXMuICBFYWNoIGVudHJ5Ci1jb25zaXN0cyBvZiBhIHR5cGUgYW5kIGEgdmFsdWUsIHNlcGFyYXRlZCBieSBhIGNvbG9uLgotCi1Gb3IgZXhhbXBsZTo6Ci0KLSAgIC4uIGluZGV4OjoKLSAgICAgIHNpbmdsZTogZXhlY3V0aW9uOyBjb250ZXh0Ci0gICAgICBtb2R1bGU6IF9fbWFpbl9fCi0gICAgICBtb2R1bGU6IHN5cwotICAgICAgdHJpcGxlOiBtb2R1bGU7IHNlYXJjaDsgcGF0aAotCi1UaGlzIGRpcmVjdGl2ZSBjb250YWlucyBmaXZlIGVudHJpZXMsIHdoaWNoIHdpbGwgYmUgY29udmVydGVkIHRvIGVudHJpZXMgaW4gdGhlCi1nZW5lcmF0ZWQgaW5kZXggd2hpY2ggbGluayB0byB0aGUgZXhhY3QgbG9jYXRpb24gb2YgdGhlIGluZGV4IHN0YXRlbWVudCAob3IsIGluCi1jYXNlIG9mIG9mZmxpbmUgbWVkaWEsIHRoZSBjb3JyZXNwb25kaW5nIHBhZ2UgbnVtYmVyKS4KLQotVGhlIHBvc3NpYmxlIGVudHJ5IHR5cGVzIGFyZToKLQotc2luZ2xlCi0gICBDcmVhdGVzIGEgc2luZ2xlIGluZGV4IGVudHJ5LiAgQ2FuIGJlIG1hZGUgYSBzdWJlbnRyeSBieSBzZXBhcmF0aW5nIHRoZQotICAgc3ViZW50cnkgdGV4dCB3aXRoIGEgc2VtaWNvbG9uICh0aGlzIG5vdGF0aW9uIGlzIGFsc28gdXNlZCBiZWxvdyB0byBkZXNjcmliZQotICAgd2hhdCBlbnRyaWVzIGFyZSBjcmVhdGVkKS4KLXBhaXIKLSAgIGBgcGFpcjogbG9vcDsgc3RhdGVtZW50YGAgaXMgYSBzaG9ydGN1dCB0aGF0IGNyZWF0ZXMgdHdvIGluZGV4IGVudHJpZXMsCi0gICBuYW1lbHkgYGBsb29wOyBzdGF0ZW1lbnRgYCBhbmQgYGBzdGF0ZW1lbnQ7IGxvb3BgYC4KLXRyaXBsZQotICAgTGlrZXdpc2UsIGBgdHJpcGxlOiBtb2R1bGU7IHNlYXJjaDsgcGF0aGBgIGlzIGEgc2hvcnRjdXQgdGhhdCBjcmVhdGVzIHRocmVlCi0gICBpbmRleCBlbnRyaWVzLCB3aGljaCBhcmUgYGBtb2R1bGU7IHNlYXJjaCBwYXRoYGAsIGBgc2VhcmNoOyBwYXRoLCBtb2R1bGVgYCBhbmQKLSAgIGBgcGF0aDsgbW9kdWxlIHNlYXJjaGBgLgotbW9kdWxlLCBrZXl3b3JkLCBvcGVyYXRvciwgb2JqZWN0LCBleGNlcHRpb24sIHN0YXRlbWVudCwgYnVpbHRpbgotICAgVGhlc2UgYWxsIGNyZWF0ZSB0d28gaW5kZXggZW50cmllcy4gIEZvciBleGFtcGxlLCBgYG1vZHVsZTogaGFzaGxpYmBgIGNyZWF0ZXMKLSAgIHRoZSBlbnRyaWVzIGBgbW9kdWxlOyBoYXNobGliYGAgYW5kIGBgaGFzaGxpYjsgbW9kdWxlYGAuCi0KLUZvciBpbmRleCBkaXJlY3RpdmVzIGNvbnRhaW5pbmcgb25seSAic2luZ2xlIiBlbnRyaWVzLCB0aGVyZSBpcyBhIHNob3J0aGFuZAotbm90YXRpb246OgotCi0gICAuLiBpbmRleDo6IEJORiwgZ3JhbW1hciwgc3ludGF4LCBub3RhdGlvbgotCi1UaGlzIGNyZWF0ZXMgZm91ciBpbmRleCBlbnRyaWVzLgotCi0KLUdyYW1tYXIgcHJvZHVjdGlvbiBkaXNwbGF5cwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVNwZWNpYWwgbWFya3VwIGlzIGF2YWlsYWJsZSBmb3IgZGlzcGxheWluZyB0aGUgcHJvZHVjdGlvbnMgb2YgYSBmb3JtYWwgZ3JhbW1hci4KLVRoZSBtYXJrdXAgaXMgc2ltcGxlIGFuZCBkb2VzIG5vdCBhdHRlbXB0IHRvIG1vZGVsIGFsbCBhc3BlY3RzIG9mIEJORiAob3IgYW55Ci1kZXJpdmVkIGZvcm1zKSwgYnV0IHByb3ZpZGVzIGVub3VnaCB0byBhbGxvdyBjb250ZXh0LWZyZWUgZ3JhbW1hcnMgdG8gYmUKLWRpc3BsYXllZCBpbiBhIHdheSB0aGF0IGNhdXNlcyB1c2VzIG9mIGEgc3ltYm9sIHRvIGJlIHJlbmRlcmVkIGFzIGh5cGVybGlua3MgdG8KLXRoZSBkZWZpbml0aW9uIG9mIHRoZSBzeW1ib2wuICBUaGVyZSBpcyB0aGlzIGRpcmVjdGl2ZToKLQotLi4gZGVzY3JpYmU6OiBwcm9kdWN0aW9ubGlzdAotCi0gICBUaGlzIGRpcmVjdGl2ZSBpcyB1c2VkIHRvIGVuY2xvc2UgYSBncm91cCBvZiBwcm9kdWN0aW9ucy4gIEVhY2ggcHJvZHVjdGlvbiBpcwotICAgZ2l2ZW4gb24gYSBzaW5nbGUgbGluZSBhbmQgY29uc2lzdHMgb2YgYSBuYW1lLCBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBmcm9tIHRoZQotICAgZm9sbG93aW5nIGRlZmluaXRpb24uICBJZiB0aGUgZGVmaW5pdGlvbiBzcGFucyBtdWx0aXBsZSBsaW5lcywgZWFjaAotICAgY29udGludWF0aW9uIGxpbmUgbXVzdCBiZWdpbiB3aXRoIGEgY29sb24gcGxhY2VkIGF0IHRoZSBzYW1lIGNvbHVtbiBhcyBpbiB0aGUKLSAgIGZpcnN0IGxpbmUuCi0KLSAgIEJsYW5rIGxpbmVzIGFyZSBub3QgYWxsb3dlZCB3aXRoaW4gYGBwcm9kdWN0aW9ubGlzdGBgIGRpcmVjdGl2ZSBhcmd1bWVudHMuCi0KLSAgIFRoZSBkZWZpbml0aW9uIGNhbiBjb250YWluIHRva2VuIG5hbWVzIHdoaWNoIGFyZSBtYXJrZWQgYXMgaW50ZXJwcmV0ZWQgdGV4dAotICAgKGUuZy4gYGB1bmFyeW5lZyA6Oj0gIi0iIGBpbnRlZ2VyYGBgKSAtLSB0aGlzIGdlbmVyYXRlcyBjcm9zcy1yZWZlcmVuY2VzCi0gICB0byB0aGUgcHJvZHVjdGlvbnMgb2YgdGhlc2UgdG9rZW5zLgotCi0gICBOb3RlIHRoYXQgbm8gZnVydGhlciByZVNUIHBhcnNpbmcgaXMgZG9uZSBpbiB0aGUgcHJvZHVjdGlvbiwgc28gdGhhdCB5b3UKLSAgIGRvbid0IGhhdmUgdG8gZXNjYXBlIGBgKmBgIG9yIGBgfGBgIGNoYXJhY3RlcnMuCi0KLQotLi4gWFhYIGRlc2NyaWJlIG9wdGlvbmFsIGZpcnN0IHBhcmFtZXRlcgotCi1UaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgdGFrZW4gZnJvbSB0aGUgUHl0aG9uIFJlZmVyZW5jZSBNYW51YWw6OgotCi0gICAuLiBwcm9kdWN0aW9ubGlzdDo6Ci0gICAgICB0cnlfc3RtdDogdHJ5MV9zdG10IHwgdHJ5Ml9zdG10Ci0gICAgICB0cnkxX3N0bXQ6ICJ0cnkiICI6IiBgc3VpdGVgCi0gICAgICAgICAgICAgICA6ICgiZXhjZXB0IiBbYGV4cHJlc3Npb25gIFsiLCIgYHRhcmdldGBdXSAiOiIgYHN1aXRlYCkrCi0gICAgICAgICAgICAgICA6IFsiZWxzZSIgIjoiIGBzdWl0ZWBdCi0gICAgICAgICAgICAgICA6IFsiZmluYWxseSIgIjoiIGBzdWl0ZWBdCi0gICAgICB0cnkyX3N0bXQ6ICJ0cnkiICI6IiBgc3VpdGVgCi0gICAgICAgICAgICAgICA6ICJmaW5hbGx5IiAiOiIgYHN1aXRlYAotCi0KLVN1YnN0aXR1dGlvbnMKLS0tLS0tLS0tLS0tLS0KLQotVGhlIGRvY3VtZW50YXRpb24gc3lzdGVtIHByb3ZpZGVzIHRocmVlIHN1YnN0aXR1dGlvbnMgdGhhdCBhcmUgZGVmaW5lZCBieSBkZWZhdWx0LgotVGhleSBhcmUgc2V0IGluIHRoZSBidWlsZCBjb25maWd1cmF0aW9uIGZpbGUgOmZpbGU6YGNvbmYucHlgLgotCi0uLiBkZXNjcmliZTo6IHxyZWxlYXNlfAotCi0gICBSZXBsYWNlZCBieSB0aGUgUHl0aG9uIHJlbGVhc2UgdGhlIGRvY3VtZW50YXRpb24gcmVmZXJzIHRvLiAgVGhpcyBpcyB0aGUgZnVsbAotICAgdmVyc2lvbiBzdHJpbmcgaW5jbHVkaW5nIGFscGhhL2JldGEvcmVsZWFzZSBjYW5kaWRhdGUgdGFncywgZS5nLiBgYDIuNS4yYjNgYC4KLQotLi4gZGVzY3JpYmU6OiB8dmVyc2lvbnwKLQotICAgUmVwbGFjZWQgYnkgdGhlIFB5dGhvbiB2ZXJzaW9uIHRoZSBkb2N1bWVudGF0aW9uIHJlZmVycyB0by4gVGhpcyBjb25zaXN0cwotICAgb25seSBvZiB0aGUgbWFqb3IgYW5kIG1pbm9yIHZlcnNpb24gcGFydHMsIGUuZy4gYGAyLjVgYCwgZXZlbiBmb3IgdmVyc2lvbgotICAgMi41LjEuCi0KLS4uIGRlc2NyaWJlOjogfHRvZGF5fAotCi0gICBSZXBsYWNlZCBieSBlaXRoZXIgdG9kYXkncyBkYXRlLCBvciB0aGUgZGF0ZSBzZXQgaW4gdGhlIGJ1aWxkIGNvbmZpZ3VyYXRpb24KLSAgIGZpbGUuICBOb3JtYWxseSBoYXMgdGhlIGZvcm1hdCBgYEFwcmlsIDE0LCAyMDA3YGAuCi0KLQotLi4gcnVicmljOjogRm9vdG5vdGVzCi0KLS4uIFsxXSBUaGVyZSBpcyBhIHN0YW5kYXJkIGBgLi4gaW5jbHVkZWBgIGRpcmVjdGl2ZSwgYnV0IGl0IHJhaXNlcyBlcnJvcnMgaWYgdGhlCi0gICAgICAgZmlsZSBpcyBub3QgZm91bmQuICBUaGlzIG9uZSBvbmx5IGVtaXRzIGEgd2FybmluZy4KZGlmZiAtLWdpdCBhL0RvYy9kb2N1bWVudGluZy9yZXN0LnJzdCBiL0RvYy9kb2N1bWVudGluZy9yZXN0LnJzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI2Yjg5Yi4uMDAwMDAwMAotLS0gYS9Eb2MvZG9jdW1lbnRpbmcvcmVzdC5yc3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLi4gaGlnaGxpZ2h0bGFuZzo6IHJlc3QKLQotcmVTdHJ1Y3R1cmVkVGV4dCBQcmltZXIKLT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgc2VjdGlvbiBpcyBhIGJyaWVmIGludHJvZHVjdGlvbiB0byByZVN0cnVjdHVyZWRUZXh0IChyZVNUKSBjb25jZXB0cyBhbmQKLXN5bnRheCwgaW50ZW5kZWQgdG8gcHJvdmlkZSBhdXRob3JzIHdpdGggZW5vdWdoIGluZm9ybWF0aW9uIHRvIGF1dGhvciBkb2N1bWVudHMKLXByb2R1Y3RpdmVseS4gIFNpbmNlIHJlU1Qgd2FzIGRlc2lnbmVkIHRvIGJlIGEgc2ltcGxlLCB1bm9idHJ1c2l2ZSBtYXJrdXAKLWxhbmd1YWdlLCB0aGlzIHdpbGwgbm90IHRha2UgdG9vIGxvbmcuCi0KLS4uIHNlZWFsc286OgotCi0gICAgVGhlIGF1dGhvcml0YXRpdmUgYHJlU3RydWN0dXJlZFRleHQgVXNlcgotICAgIERvY3VtZW50YXRpb24gPGh0dHA6Ly9kb2N1dGlscy5zb3VyY2Vmb3JnZS5uZXQvcnN0Lmh0bWw+YF8uCi0KLQotUGFyYWdyYXBocwotLS0tLS0tLS0tLQotCi1UaGUgcGFyYWdyYXBoIGlzIHRoZSBtb3N0IGJhc2ljIGJsb2NrIGluIGEgcmVTVCBkb2N1bWVudC4gIFBhcmFncmFwaHMgYXJlIHNpbXBseQotY2h1bmtzIG9mIHRleHQgc2VwYXJhdGVkIGJ5IG9uZSBvciBtb3JlIGJsYW5rIGxpbmVzLiAgQXMgaW4gUHl0aG9uLCBpbmRlbnRhdGlvbgotaXMgc2lnbmlmaWNhbnQgaW4gcmVTVCwgc28gYWxsIGxpbmVzIG9mIHRoZSBzYW1lIHBhcmFncmFwaCBtdXN0IGJlIGxlZnQtYWxpZ25lZAotdG8gdGhlIHNhbWUgbGV2ZWwgb2YgaW5kZW50YXRpb24uCi0KLQotSW5saW5lIG1hcmt1cAotLS0tLS0tLS0tLS0tLQotCi1UaGUgc3RhbmRhcmQgcmVTVCBpbmxpbmUgbWFya3VwIGlzIHF1aXRlIHNpbXBsZTogdXNlCi0KLSogb25lIGFzdGVyaXNrOiBgYCp0ZXh0KmBgIGZvciBlbXBoYXNpcyAoaXRhbGljcyksCi0qIHR3byBhc3Rlcmlza3M6IGBgKip0ZXh0KipgYCBmb3Igc3Ryb25nIGVtcGhhc2lzIChib2xkZmFjZSksIGFuZAotKiBiYWNrcXVvdGVzOiBgYGBgdGV4dGBgYGAgZm9yIGNvZGUgc2FtcGxlcy4KLQotSWYgYXN0ZXJpc2tzIG9yIGJhY2txdW90ZXMgYXBwZWFyIGluIHJ1bm5pbmcgdGV4dCBhbmQgY291bGQgYmUgY29uZnVzZWQgd2l0aAotaW5saW5lIG1hcmt1cCBkZWxpbWl0ZXJzLCB0aGV5IGhhdmUgdG8gYmUgZXNjYXBlZCB3aXRoIGEgYmFja3NsYXNoLgotCi1CZSBhd2FyZSBvZiBzb21lIHJlc3RyaWN0aW9ucyBvZiB0aGlzIG1hcmt1cDoKLQotKiBpdCBtYXkgbm90IGJlIG5lc3RlZCwKLSogY29udGVudCBtYXkgbm90IHN0YXJ0IG9yIGVuZCB3aXRoIHdoaXRlc3BhY2U6IGBgKiB0ZXh0KmBgIGlzIHdyb25nLAotKiBpdCBtdXN0IGJlIHNlcGFyYXRlZCBmcm9tIHN1cnJvdW5kaW5nIHRleHQgYnkgbm9uLXdvcmQgY2hhcmFjdGVycy4gIFVzZSBhCi0gIGJhY2tzbGFzaCBlc2NhcGVkIHNwYWNlIHRvIHdvcmsgYXJvdW5kIHRoYXQ6IGBgdGhpc2lzXCAqb25lKlwgd29yZGBgLgotCi1UaGVzZSByZXN0cmljdGlvbnMgbWF5IGJlIGxpZnRlZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlIGRvY3V0aWxzLgotCi1yZVNUIGFsc28gYWxsb3dzIGZvciBjdXN0b20gImludGVycHJldGVkIHRleHQgcm9sZXMiJywgd2hpY2ggc2lnbmlmeSB0aGF0IHRoZQotZW5jbG9zZWQgdGV4dCBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgaW4gYSBzcGVjaWZpYyB3YXkuICBTcGhpbnggdXNlcyB0aGlzIHRvCi1wcm92aWRlIHNlbWFudGljIG1hcmt1cCBhbmQgY3Jvc3MtcmVmZXJlbmNpbmcgb2YgaWRlbnRpZmllcnMsIGFzIGRlc2NyaWJlZCBpbgotdGhlIGFwcHJvcHJpYXRlIHNlY3Rpb24uICBUaGUgZ2VuZXJhbCBzeW50YXggaXMgYGA6cm9sZW5hbWU6YGNvbnRlbnRgYGAuCi0KLQotTGlzdHMgYW5kIFF1b3RlcwotLS0tLS0tLS0tLS0tLS0tLQotCi1MaXN0IG1hcmt1cCBpcyBuYXR1cmFsOiBqdXN0IHBsYWNlIGFuIGFzdGVyaXNrIGF0IHRoZSBzdGFydCBvZiBhIHBhcmFncmFwaCBhbmQKLWluZGVudCBwcm9wZXJseS4gIFRoZSBzYW1lIGdvZXMgZm9yIG51bWJlcmVkIGxpc3RzOyB0aGV5IGNhbiBhbHNvIGJlCi1hdXRvbnVtYmVyZWQgdXNpbmcgYSBgYCNgYCBzaWduOjoKLQotICAgKiBUaGlzIGlzIGEgYnVsbGV0ZWQgbGlzdC4KLSAgICogSXQgaGFzIHR3byBpdGVtcywgdGhlIHNlY29uZAotICAgICBpdGVtIHVzZXMgdHdvIGxpbmVzLgotCi0gICAxLiBUaGlzIGlzIGEgbnVtYmVyZWQgbGlzdC4KLSAgIDIuIEl0IGhhcyB0d28gaXRlbXMgdG9vLgotCi0gICAjLiBUaGlzIGlzIGEgbnVtYmVyZWQgbGlzdC4KLSAgICMuIEl0IGhhcyB0d28gaXRlbXMgdG9vLgotCi0KLU5lc3RlZCBsaXN0cyBhcmUgcG9zc2libGUsIGJ1dCBiZSBhd2FyZSB0aGF0IHRoZXkgbXVzdCBiZSBzZXBhcmF0ZWQgZnJvbSB0aGUKLXBhcmVudCBsaXN0IGl0ZW1zIGJ5IGJsYW5rIGxpbmVzOjoKLQotICAgKiB0aGlzIGlzCi0gICAqIGEgbGlzdAotCi0gICAgICogd2l0aCBhIG5lc3RlZCBsaXN0Ci0gICAgICogYW5kIHNvbWUgc3ViaXRlbXMKLQotICAgKiBhbmQgaGVyZSB0aGUgcGFyZW50IGxpc3QgY29udGludWVzCi0KLURlZmluaXRpb24gbGlzdHMgYXJlIGNyZWF0ZWQgYXMgZm9sbG93czo6Ci0KLSAgIHRlcm0gKHVwIHRvIGEgbGluZSBvZiB0ZXh0KQotICAgICAgRGVmaW5pdGlvbiBvZiB0aGUgdGVybSwgd2hpY2ggbXVzdCBiZSBpbmRlbnRlZAotCi0gICAgICBhbmQgY2FuIGV2ZW4gY29uc2lzdCBvZiBtdWx0aXBsZSBwYXJhZ3JhcGhzCi0KLSAgIG5leHQgdGVybQotICAgICAgRGVzY3JpcHRpb24uCi0KLQotUGFyYWdyYXBocyBhcmUgcXVvdGVkIGJ5IGp1c3QgaW5kZW50aW5nIHRoZW0gbW9yZSB0aGFuIHRoZSBzdXJyb3VuZGluZwotcGFyYWdyYXBocy4KLQotCi1Tb3VyY2UgQ29kZQotLS0tLS0tLS0tLS0KLQotTGl0ZXJhbCBjb2RlIGJsb2NrcyBhcmUgaW50cm9kdWNlZCBieSBlbmRpbmcgYSBwYXJhZ3JhcGggd2l0aCB0aGUgc3BlY2lhbCBtYXJrZXIKLWBgOjpgYC4gIFRoZSBsaXRlcmFsIGJsb2NrIG11c3QgYmUgaW5kZW50ZWQ6OgotCi0gICBUaGlzIGlzIGEgbm9ybWFsIHRleHQgcGFyYWdyYXBoLiBUaGUgbmV4dCBwYXJhZ3JhcGggaXMgYSBjb2RlIHNhbXBsZTo6Ci0KLSAgICAgIEl0IGlzIG5vdCBwcm9jZXNzZWQgaW4gYW55IHdheSwgZXhjZXB0Ci0gICAgICB0aGF0IHRoZSBpbmRlbnRhdGlvbiBpcyByZW1vdmVkLgotCi0gICAgICBJdCBjYW4gc3BhbiBtdWx0aXBsZSBsaW5lcy4KLQotICAgVGhpcyBpcyBhIG5vcm1hbCB0ZXh0IHBhcmFncmFwaCBhZ2Fpbi4KLQotVGhlIGhhbmRsaW5nIG9mIHRoZSBgYDo6YGAgbWFya2VyIGlzIHNtYXJ0OgotCi0qIElmIGl0IG9jY3VycyBhcyBhIHBhcmFncmFwaCBvZiBpdHMgb3duLCB0aGF0IHBhcmFncmFwaCBpcyBjb21wbGV0ZWx5IGxlZnQKLSAgb3V0IG9mIHRoZSBkb2N1bWVudC4KLSogSWYgaXQgaXMgcHJlY2VkZWQgYnkgd2hpdGVzcGFjZSwgdGhlIG1hcmtlciBpcyByZW1vdmVkLgotKiBJZiBpdCBpcyBwcmVjZWRlZCBieSBub24td2hpdGVzcGFjZSwgdGhlIG1hcmtlciBpcyByZXBsYWNlZCBieSBhIHNpbmdsZQotICBjb2xvbi4KLQotVGhhdCB3YXksIHRoZSBzZWNvbmQgc2VudGVuY2UgaW4gdGhlIGFib3ZlIGV4YW1wbGUncyBmaXJzdCBwYXJhZ3JhcGggd291bGQgYmUKLXJlbmRlcmVkIGFzICJUaGUgbmV4dCBwYXJhZ3JhcGggaXMgYSBjb2RlIHNhbXBsZToiLgotCi0KLUh5cGVybGlua3MKLS0tLS0tLS0tLS0KLQotRXh0ZXJuYWwgbGlua3MKLV5eXl5eXl5eXl5eXl5eCi0KLVVzZSBgYGBMaW5rIHRleHQgPGh0dHA6Ly90YXJnZXQ+YF9gYCBmb3IgaW5saW5lIHdlYiBsaW5rcy4gIElmIHRoZSBsaW5rIHRleHQKLXNob3VsZCBiZSB0aGUgd2ViIGFkZHJlc3MsIHlvdSBkb24ndCBuZWVkIHNwZWNpYWwgbWFya3VwIGF0IGFsbCwgdGhlIHBhcnNlcgotZmluZHMgbGlua3MgYW5kIG1haWwgYWRkcmVzc2VzIGluIG9yZGluYXJ5IHRleHQuCi0KLUludGVybmFsIGxpbmtzCi1eXl5eXl5eXl5eXl5eXgotCi1JbnRlcm5hbCBsaW5raW5nIGlzIGRvbmUgdmlhIGEgc3BlY2lhbCByZVNUIHJvbGUsIHNlZSB0aGUgc2VjdGlvbiBvbiBzcGVjaWZpYwotbWFya3VwLCA6cmVmOmBkb2MtcmVmLXJvbGVgLgotCi0KLVNlY3Rpb25zCi0tLS0tLS0tLQotCi1TZWN0aW9uIGhlYWRlcnMgYXJlIGNyZWF0ZWQgYnkgdW5kZXJsaW5pbmcgKGFuZCBvcHRpb25hbGx5IG92ZXJsaW5pbmcpIHRoZQotc2VjdGlvbiB0aXRsZSB3aXRoIGEgcHVuY3R1YXRpb24gY2hhcmFjdGVyLCBhdCBsZWFzdCBhcyBsb25nIGFzIHRoZSB0ZXh0OjoKLQotICAgPT09PT09PT09PT09PT09PT0KLSAgIFRoaXMgaXMgYSBoZWFkaW5nCi0gICA9PT09PT09PT09PT09PT09PQotCi1Ob3JtYWxseSwgdGhlcmUgYXJlIG5vIGhlYWRpbmcgbGV2ZWxzIGFzc2lnbmVkIHRvIGNlcnRhaW4gY2hhcmFjdGVycyBhcyB0aGUKLXN0cnVjdHVyZSBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIHN1Y2Nlc3Npb24gb2YgaGVhZGluZ3MuICBIb3dldmVyLCBmb3IgdGhlCi1QeXRob24gZG9jdW1lbnRhdGlvbiwgd2UgdXNlIHRoaXMgY29udmVudGlvbjoKLQotKiBgYCNgYCB3aXRoIG92ZXJsaW5lLCBmb3IgcGFydHMKLSogYGAqYGAgd2l0aCBvdmVybGluZSwgZm9yIGNoYXB0ZXJzCi0qIGBgPWBgLCBmb3Igc2VjdGlvbnMKLSogYGAtYGAsIGZvciBzdWJzZWN0aW9ucwotKiBgYF5gYCwgZm9yIHN1YnN1YnNlY3Rpb25zCi0qIGBgImBgLCBmb3IgcGFyYWdyYXBocwotCi0KLUV4cGxpY2l0IE1hcmt1cAotLS0tLS0tLS0tLS0tLS0tCi0KLSJFeHBsaWNpdCBtYXJrdXAiIGlzIHVzZWQgaW4gcmVTVCBmb3IgbW9zdCBjb25zdHJ1Y3RzIHRoYXQgbmVlZCBzcGVjaWFsCi1oYW5kbGluZywgc3VjaCBhcyBmb290bm90ZXMsIHNwZWNpYWxseS1oaWdobGlnaHRlZCBwYXJhZ3JhcGhzLCBjb21tZW50cywgYW5kCi1nZW5lcmljIGRpcmVjdGl2ZXMuCi0KLUFuIGV4cGxpY2l0IG1hcmt1cCBibG9jayBiZWdpbnMgd2l0aCBhIGxpbmUgc3RhcnRpbmcgd2l0aCBgYC4uYGAgZm9sbG93ZWQgYnkKLXdoaXRlc3BhY2UgYW5kIGlzIHRlcm1pbmF0ZWQgYnkgdGhlIG5leHQgcGFyYWdyYXBoIGF0IHRoZSBzYW1lIGxldmVsIG9mCi1pbmRlbnRhdGlvbi4gIChUaGVyZSBuZWVkcyB0byBiZSBhIGJsYW5rIGxpbmUgYmV0d2VlbiBleHBsaWNpdCBtYXJrdXAgYW5kIG5vcm1hbAotcGFyYWdyYXBocy4gIFRoaXMgbWF5IGFsbCBzb3VuZCBhIGJpdCBjb21wbGljYXRlZCwgYnV0IGl0IGlzIGludHVpdGl2ZSBlbm91Z2gKLXdoZW4geW91IHdyaXRlIGl0LikKLQotCi1EaXJlY3RpdmVzCi0tLS0tLS0tLS0tCi0KLUEgZGlyZWN0aXZlIGlzIGEgZ2VuZXJpYyBibG9jayBvZiBleHBsaWNpdCBtYXJrdXAuICBCZXNpZGVzIHJvbGVzLCBpdCBpcyBvbmUgb2YKLXRoZSBleHRlbnNpb24gbWVjaGFuaXNtcyBvZiByZVNULCBhbmQgU3BoaW54IG1ha2VzIGhlYXZ5IHVzZSBvZiBpdC4KLQotQmFzaWNhbGx5LCBhIGRpcmVjdGl2ZSBjb25zaXN0cyBvZiBhIG5hbWUsIGFyZ3VtZW50cywgb3B0aW9ucyBhbmQgY29udGVudC4gKEtlZXAKLXRoaXMgdGVybWlub2xvZ3kgaW4gbWluZCwgaXQgaXMgdXNlZCBpbiB0aGUgbmV4dCBjaGFwdGVyIGRlc2NyaWJpbmcgY3VzdG9tCi1kaXJlY3RpdmVzLikgIExvb2tpbmcgYXQgdGhpcyBleGFtcGxlLCA6OgotCi0gICAuLiBmdW5jdGlvbjo6IGZvbyh4KQotICAgICAgICAgICAgICAgICBmb28oeSwgeikKLSAgICAgIDpiYXI6IG5vCi0KLSAgICAgIFJldHVybiBhIGxpbmUgb2YgdGV4dCBpbnB1dCBmcm9tIHRoZSB1c2VyLgotCi1gYGZ1bmN0aW9uYGAgaXMgdGhlIGRpcmVjdGl2ZSBuYW1lLiAgSXQgaXMgZ2l2ZW4gdHdvIGFyZ3VtZW50cyBoZXJlLCB0aGUKLXJlbWFpbmRlciBvZiB0aGUgZmlyc3QgbGluZSBhbmQgdGhlIHNlY29uZCBsaW5lLCBhcyB3ZWxsIGFzIG9uZSBvcHRpb24gYGBiYXJgYAotKGFzIHlvdSBjYW4gc2VlLCBvcHRpb25zIGFyZSBnaXZlbiBpbiB0aGUgbGluZXMgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZQotYXJndW1lbnRzIGFuZCBpbmRpY2F0ZWQgYnkgdGhlIGNvbG9ucykuCi0KLVRoZSBkaXJlY3RpdmUgY29udGVudCBmb2xsb3dzIGFmdGVyIGEgYmxhbmsgbGluZSBhbmQgaXMgaW5kZW50ZWQgcmVsYXRpdmUgdG8gdGhlCi1kaXJlY3RpdmUgc3RhcnQuCi0KLQotRm9vdG5vdGVzCi0tLS0tLS0tLS0KLQotRm9yIGZvb3Rub3RlcywgdXNlIGBgWyNdX2BgIHRvIG1hcmsgdGhlIGZvb3Rub3RlIGxvY2F0aW9uLCBhbmQgYWRkIHRoZSBmb290bm90ZQotYm9keSBhdCB0aGUgYm90dG9tIG9mIHRoZSBkb2N1bWVudCBhZnRlciBhICJGb290bm90ZXMiIHJ1YnJpYyBoZWFkaW5nLCBsaWtlIHNvOjoKLQotICAgTG9yZW0gaXBzdW0gWyNdXyBkb2xvciBzaXQgYW1ldCAuLi4gWyNdXwotCi0gICAuLiBydWJyaWM6OiBGb290bm90ZXMKLQotICAgLi4gWyNdIFRleHQgb2YgdGhlIGZpcnN0IGZvb3Rub3RlLgotICAgLi4gWyNdIFRleHQgb2YgdGhlIHNlY29uZCBmb290bm90ZS4KLQotWW91IGNhbiBhbHNvIGV4cGxpY2l0bHkgbnVtYmVyIHRoZSBmb290bm90ZXMgZm9yIGJldHRlciBjb250ZXh0LgotCi0KLUNvbW1lbnRzCi0tLS0tLS0tLQotCi1FdmVyeSBleHBsaWNpdCBtYXJrdXAgYmxvY2sgd2hpY2ggaXNuJ3QgYSB2YWxpZCBtYXJrdXAgY29uc3RydWN0IChsaWtlIHRoZQotZm9vdG5vdGVzIGFib3ZlKSBpcyByZWdhcmRlZCBhcyBhIGNvbW1lbnQuCi0KLQotU291cmNlIGVuY29kaW5nCi0tLS0tLS0tLS0tLS0tLS0KLQotU2luY2UgdGhlIGVhc2llc3Qgd2F5IHRvIGluY2x1ZGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGxpa2UgZW0gZGFzaGVzIG9yIGNvcHlyaWdodAotc2lnbnMgaW4gcmVTVCBpcyB0byBkaXJlY3RseSB3cml0ZSB0aGVtIGFzIFVuaWNvZGUgY2hhcmFjdGVycywgb25lIGhhcyB0bwotc3BlY2lmeSBhbiBlbmNvZGluZzoKLQotQWxsIFB5dGhvbiBkb2N1bWVudGF0aW9uIHNvdXJjZSBmaWxlcyBtdXN0IGJlIGluIFVURi04IGVuY29kaW5nLCBhbmQgdGhlIEhUTUwKLWRvY3VtZW50cyB3cml0dGVuIGZyb20gdGhlbSB3aWxsIGJlIGluIHRoYXQgZW5jb2RpbmcgYXMgd2VsbC4KLQotCi1Hb3RjaGFzCi0tLS0tLS0tCi0KLVRoZXJlIGFyZSBzb21lIHByb2JsZW1zIG9uZSBjb21tb25seSBydW5zIGludG8gd2hpbGUgYXV0aG9yaW5nIHJlU1QgZG9jdW1lbnRzOgotCi0qICoqU2VwYXJhdGlvbiBvZiBpbmxpbmUgbWFya3VwOioqIEFzIHNhaWQgYWJvdmUsIGlubGluZSBtYXJrdXAgc3BhbnMgbXVzdCBiZQotICBzZXBhcmF0ZWQgZnJvbSB0aGUgc3Vycm91bmRpbmcgdGV4dCBieSBub24td29yZCBjaGFyYWN0ZXJzLCB5b3UgaGF2ZSB0byB1c2UKLSAgYW4gZXNjYXBlZCBzcGFjZSB0byBnZXQgYXJvdW5kIHRoYXQuCmRpZmYgLS1naXQgYS9Eb2MvZG9jdW1lbnRpbmcvc3R5bGUucnN0IGIvRG9jL2RvY3VtZW50aW5nL3N0eWxlLnJzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkyODk0MC4uMDAwMDAwMAotLS0gYS9Eb2MvZG9jdW1lbnRpbmcvc3R5bGUucnN0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS4uIGhpZ2hsaWdodGxhbmc6OiByZXN0Ci0KLVN0eWxlIEd1aWRlCi09PT09PT09PT09PQotCi1UaGUgUHl0aG9uIGRvY3VtZW50YXRpb24gc2hvdWxkIGZvbGxvdyB0aGUgYEFwcGxlIFB1YmxpY2F0aW9ucyBTdHlsZSBHdWlkZWBfCi13aGVyZXZlciBwb3NzaWJsZS4gVGhpcyBwYXJ0aWN1bGFyIHN0eWxlIGd1aWRlIHdhcyBzZWxlY3RlZCBtb3N0bHkgYmVjYXVzZSBpdAotc2VlbXMgcmVhc29uYWJsZSBhbmQgaXMgZWFzeSB0byBnZXQgb25saW5lLgotCi1Ub3BpY3Mgd2hpY2ggYXJlIG5vdCBjb3ZlcmVkIGluIEFwcGxlJ3Mgc3R5bGUgZ3VpZGUgd2lsbCBiZSBkaXNjdXNzZWQgaW4KLXRoaXMgZG9jdW1lbnQuCi0KLUFsbCByZVNUIGZpbGVzIHVzZSBhbiBpbmRlbnRhdGlvbiBvZiAzIHNwYWNlcy4gIFRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoIGlzIDgwCi1jaGFyYWN0ZXJzIGZvciBub3JtYWwgdGV4dCwgYnV0IHRhYmxlcywgZGVlcGx5IGluZGVudGVkIGNvZGUgc2FtcGxlcyBhbmQgbG9uZwotbGlua3MgbWF5IGV4dGVuZCBiZXlvbmQgdGhhdC4KLQotTWFrZSBnZW5lcm91cyB1c2Ugb2YgYmxhbmsgbGluZXMgd2hlcmUgYXBwbGljYWJsZTsgdGhleSBoZWxwIGdyb3VwaW5nIHRoaW5ncwotdG9nZXRoZXIuCi0KLUEgc2VudGVuY2UtZW5kaW5nIHBlcmlvZCBtYXkgYmUgZm9sbG93ZWQgYnkgb25lIG9yIHR3byBzcGFjZXM7IHdoaWxlIHJlU1QKLWlnbm9yZXMgdGhlIHNlY29uZCBzcGFjZSwgaXQgaXMgY3VzdG9tYXJpbHkgcHV0IGluIGJ5IHNvbWUgdXNlcnMsIGZvciBleGFtcGxlCi10byBhaWQgRW1hY3MnIGF1dG8tZmlsbCBtb2RlLgotCi1Gb290bm90ZXMgYXJlIGdlbmVyYWxseSBkaXNjb3VyYWdlZCwgdGhvdWdoIHRoZXkgbWF5IGJlIHVzZWQgd2hlbiB0aGV5IGFyZSB0aGUKLWJlc3Qgd2F5IHRvIHByZXNlbnQgc3BlY2lmaWMgaW5mb3JtYXRpb24uIFdoZW4gYSBmb290bm90ZSByZWZlcmVuY2UgaXMgYWRkZWQgYXQKLXRoZSBlbmQgb2YgdGhlIHNlbnRlbmNlLCBpdCBzaG91bGQgZm9sbG93IHRoZSBzZW50ZW5jZS1lbmRpbmcgcHVuY3R1YXRpb24uIFRoZQotcmVTVCBtYXJrdXAgc2hvdWxkIGFwcGVhciBzb21ldGhpbmcgbGlrZSB0aGlzOjoKLQotICAgIFRoaXMgc2VudGVuY2UgaGFzIGEgZm9vdG5vdGUgcmVmZXJlbmNlLiBbI11fIFRoaXMgaXMgdGhlIG5leHQgc2VudGVuY2UuCi0KLUZvb3Rub3RlcyBzaG91bGQgYmUgZ2F0aGVyZWQgYXQgdGhlIGVuZCBvZiBhIGZpbGUsIG9yIGlmIHRoZSBmaWxlIGlzIHZlcnkgbG9uZywKLWF0IHRoZSBlbmQgb2YgYSBzZWN0aW9uLiBUaGUgZG9jdXRpbHMgd2lsbCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBiYWNrbGlua3MgdG8KLXRoZSBmb290bm90ZSByZWZlcmVuY2UuCi0KLUZvb3Rub3RlcyBtYXkgYXBwZWFyIGluIHRoZSBtaWRkbGUgb2Ygc2VudGVuY2VzIHdoZXJlIGFwcHJvcHJpYXRlLgotCi1NYW55IHNwZWNpYWwgbmFtZXMgYXJlIHVzZWQgaW4gdGhlIFB5dGhvbiBkb2N1bWVudGF0aW9uLCBpbmNsdWRpbmcgdGhlIG5hbWVzIG9mCi1vcGVyYXRpbmcgc3lzdGVtcywgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLCBzdGFuZGFyZHMgYm9kaWVzLCBhbmQgdGhlIGxpa2UuIE1vc3QKLW9mIHRoZXNlIGVudGl0aWVzIGFyZSBub3QgYXNzaWduZWQgYW55IHNwZWNpYWwgbWFya3VwLCBidXQgdGhlIHByZWZlcnJlZAotc3BlbGxpbmdzIGFyZSBnaXZlbiBoZXJlIHRvIGFpZCBhdXRob3JzIGluIG1haW50YWluaW5nIHRoZSBjb25zaXN0ZW5jeSBvZgotcHJlc2VudGF0aW9uIGluIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbi4KLQotT3RoZXIgdGVybXMgYW5kIHdvcmRzIGRlc2VydmUgc3BlY2lhbCBtZW50aW9uIGFzIHdlbGw7IHRoZXNlIGNvbnZlbnRpb25zIHNob3VsZAotYmUgdXNlZCB0byBlbnN1cmUgY29uc2lzdGVuY3kgdGhyb3VnaG91dCB0aGUgZG9jdW1lbnRhdGlvbjoKLQotQ1BVCi0gICAgRm9yICJjZW50cmFsIHByb2Nlc3NpbmcgdW5pdC4iIE1hbnkgc3R5bGUgZ3VpZGVzIHNheSB0aGlzIHNob3VsZCBiZSBzcGVsbGVkCi0gICAgb3V0IG9uIHRoZSBmaXJzdCB1c2UgKGFuZCBpZiB5b3UgbXVzdCB1c2UgaXQsIGRvIHNvISkuIEZvciB0aGUgUHl0aG9uCi0gICAgZG9jdW1lbnRhdGlvbiwgdGhpcyBhYmJyZXZpYXRpb24gc2hvdWxkIGJlIGF2b2lkZWQgc2luY2UgdGhlcmUncyBubwotICAgIHJlYXNvbmFibGUgd2F5IHRvIHByZWRpY3Qgd2hpY2ggb2NjdXJyZW5jZSB3aWxsIGJlIHRoZSBmaXJzdCBzZWVuIGJ5IHRoZQotICAgIHJlYWRlci4gSXQgaXMgYmV0dGVyIHRvIHVzZSB0aGUgd29yZCAicHJvY2Vzc29yIiBpbnN0ZWFkLgotCi1QT1NJWAotICAgIFRoZSBuYW1lIGFzc2lnbmVkIHRvIGEgcGFydGljdWxhciBncm91cCBvZiBzdGFuZGFyZHMuIFRoaXMgaXMgYWx3YXlzCi0gICAgdXBwZXJjYXNlLgotCi1QeXRob24KLSAgICBUaGUgbmFtZSBvZiBvdXIgZmF2b3JpdGUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgaXMgYWx3YXlzIGNhcGl0YWxpemVkLgotCi1Vbmljb2RlCi0gICAgVGhlIG5hbWUgb2YgYSBjaGFyYWN0ZXIgc2V0IGFuZCBtYXRjaGluZyBlbmNvZGluZy4gVGhpcyBpcyBhbHdheXMgd3JpdHRlbgotICAgIGNhcGl0YWxpemVkLgotCi1Vbml4Ci0gICAgVGhlIG5hbWUgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gZGV2ZWxvcGVkIGF0IEFUJlQgQmVsbCBMYWJzIGluIHRoZSBlYXJseQotICAgIDE5NzBzLgotCi1BZmZpcm1hdGl2ZSBUb25lCi0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBkb2N1bWVudGF0aW9uIGZvY3VzZXMgb24gYWZmaXJtYXRpdmVseSBzdGF0aW5nIHdoYXQgdGhlIGxhbmd1YWdlIGRvZXMgYW5kCi1ob3cgdG8gdXNlIGl0IGVmZmVjdGl2ZWx5LgotCi1FeGNlcHQgZm9yIGNlcnRhaW4gc2VjdXJpdHkgcmlza3Mgb3Igc2VnZmF1bHQgcmlza3MsIHRoZSBkb2NzIHNob3VsZCBhdm9pZAotd29yZGluZyBhbG9uZyB0aGUgbGluZXMgb2YgImZlYXR1cmUgeCBpcyBkYW5nZXJvdXMiIG9yICJleHBlcnRzIG9ubHkiLiAgVGhlc2UKLWtpbmRzIG9mIHZhbHVlIGp1ZGdtZW50cyBiZWxvbmcgaW4gZXh0ZXJuYWwgYmxvZ3MgYW5kIHdpa2lzLCBub3QgaW4gdGhlIGNvcmUKLWRvY3VtZW50YXRpb24uCi0KLUJhZCBleGFtcGxlIChjcmVhdGluZyB3b3JyeSBpbiB0aGUgbWluZCBvZiBhIHJlYWRlcik6Ci0KLSAgICBXYXJuaW5nOiBmYWlsaW5nIHRvIGV4cGxpY2l0bHkgY2xvc2UgYSBmaWxlIGNvdWxkIHJlc3VsdCBpbiBsb3N0IGRhdGEgb3IKLSAgICBleGNlc3NpdmUgcmVzb3VyY2UgY29uc3VtcHRpb24uICBOZXZlciByZWx5IG9uIHJlZmVyZW5jZSBjb3VudGluZyB0bwotICAgIGF1dG9tYXRpY2FsbHkgY2xvc2UgYSBmaWxlLgotCi1Hb29kIGV4YW1wbGUgKGVzdGFibGlzaGluZyBjb25maWRlbnQga25vd2xlZGdlIGluIHRoZSBlZmZlY3RpdmUgdXNlIG9mIHRoZSBsYW5ndWFnZSk6Ci0KLSAgICBBIGJlc3QgcHJhY3RpY2UgZm9yIHVzaW5nIGZpbGVzIGlzIHVzZSBhIHRyeS9maW5hbGx5IHBhaXIgdG8gZXhwbGljaXRseQotICAgIGNsb3NlIGEgZmlsZSBhZnRlciBpdCBpcyB1c2VkLiAgQWx0ZXJuYXRpdmVseSwgdXNpbmcgYSB3aXRoLXN0YXRlbWVudCBjYW4KLSAgICBhY2hpZXZlIHRoZSBzYW1lIGVmZmVjdC4gIFRoaXMgYXNzdXJlcyB0aGF0IGZpbGVzIGFyZSBmbHVzaGVkIGFuZCBmaWxlCi0gICAgZGVzY3JpcHRvciByZXNvdXJjZXMgYXJlIHJlbGVhc2VkIGluIGEgdGltZWx5IG1hbm5lci4KLQotRWNvbm9teSBvZiBFeHByZXNzaW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTW9yZSBkb2N1bWVudGF0aW9uIGlzIG5vdCBuZWNlc3NhcmlseSBiZXR0ZXIgZG9jdW1lbnRhdGlvbi4gIEVyciBvbiB0aGUgc2lkZQotb2YgYmVpbmcgc3VjY2luY3QuCi0KLUl0IGlzIGFuIHVuZm9ydHVuYXRlIGZhY3QgdGhhdCBtYWtpbmcgZG9jdW1lbnRhdGlvbiBsb25nZXIgY2FuIGJlIGFuIGltcGVkaW1lbnQKLXRvIHVuZGVyc3RhbmRpbmcgYW5kIGNhbiByZXN1bHQgaW4gZXZlbiBtb3JlIHdheXMgdG8gbWlzcmVhZCBvciBtaXNpbnRlcnByZXQgdGhlCi10ZXh0LiAgTG9uZyBkZXNjcmlwdGlvbnMgZnVsbCBvZiBjb3JuZXIgY2FzZXMgYW5kIGNhdmVhdHMgY2FuIGNyZWF0ZSB0aGUKLWltcHJlc3Npb24gdGhhdCBhIGZ1bmN0aW9uIGlzIG1vcmUgY29tcGxleCBvciBoYXJkZXIgdG8gdXNlIHRoYW4gaXQgYWN0dWFsbHkgaXMuCi0KLVRoZSBkb2N1bWVudGF0aW9uIGZvciA6ZnVuYzpgc3VwZXJgIGlzIGFuIGV4YW1wbGUgb2Ygd2hlcmUgYSBnb29kIGRlYWwgb2YKLWluZm9ybWF0aW9uIHdhcyBjb25kZW5zZWQgaW50byBhIGZldyBzaG9ydCBwYXJhZ3JhcGhzLiAgRGlzY3Vzc2lvbiBvZgotOmZ1bmM6YHN1cGVyYCBjb3VsZCBoYXZlIGZpbGxlZCBhIGNoYXB0ZXIgaW4gYSBib29rLCBidXQgaXQgaXMgb2Z0ZW4gZWFzaWVyIHRvCi1ncmFzcCBhIHRlcnNlIGRlc2NyaXB0aW9uIHRoYW4gYSBsZW5ndGh5IG5hcnJhdGl2ZS4KLQotCi1Db2RlIEV4YW1wbGVzCi0tLS0tLS0tLS0tLS0tCi0KLVNob3J0IGNvZGUgZXhhbXBsZXMgY2FuIGJlIGEgdXNlZnVsIGFkanVuY3QgdG8gdW5kZXJzdGFuZGluZy4gIFJlYWRlcnMgY2FuIG9mdGVuCi1ncmFzcCBhIHNpbXBsZSBleGFtcGxlIG1vcmUgcXVpY2tseSB0aGFuIHRoZXkgY2FuIGRpZ2VzdCBhIGZvcm1hbCBkZXNjcmlwdGlvbiBpbgotcHJvc2UuCi0KLVBlb3BsZSBsZWFybiBmYXN0ZXIgd2l0aCBjb25jcmV0ZSwgbW90aXZhdGluZyBleGFtcGxlcyB0aGF0IG1hdGNoIHRoZSBjb250ZXh0IG9mCi1hIHR5cGljYWwgdXNlIGNhc2UuICBGb3IgaW5zdGFuY2UsIHRoZSA6ZnVuYzpgc3RyLnJwYXJ0aXRpb25gIG1ldGhvZCBpcyBiZXR0ZXIKLWRlbW9uc3RyYXRlZCB3aXRoIGFuIGV4YW1wbGUgc3BsaXR0aW5nIHRoZSBkb21haW4gZnJvbSBhIFVSTCB0aGFuIGl0IHdvdWxkIGJlCi13aXRoIGFuIGV4YW1wbGUgb2YgcmVtb3ZpbmcgdGhlIGxhc3Qgd29yZCBmcm9tIGEgbGluZSBvZiBNb250eSBQeXRob24gZGlhbG9nLgotCi1UaGUgZWxsaXBzaXMgZm9yIHRoZSA6YXR0cjpgc3lzLnBzMmAgc2Vjb25kYXJ5IGludGVycHJldGVyIHByb21wdCBzaG91bGQgb25seSBiZQotdXNlZCBzcGFyaW5nbHksIHdoZXJlIGl0IGlzIG5lY2Vzc2FyeSB0byBjbGVhcmx5IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBpbnB1dAotbGluZXMgYW5kIG91dHB1dCBsaW5lcy4gIEJlc2lkZXMgY29udHJpYnV0aW5nIHZpc3VhbCBjbHV0dGVyLCBpdCBtYWtlcyBpdAotZGlmZmljdWx0IGZvciByZWFkZXJzIHRvIGN1dC1hbmQtcGFzdGUgZXhhbXBsZXMgc28gdGhleSBjYW4gZXhwZXJpbWVudCB3aXRoCi12YXJpYXRpb25zLgotCi1Db2RlIEVxdWl2YWxlbnRzCi0tLS0tLS0tLS0tLS0tLS0tCi0KLUdpdmluZyBwdXJlIFB5dGhvbiBjb2RlIGVxdWl2YWxlbnRzIChvciBhcHByb3hpbWF0ZSBlcXVpdmFsZW50cykgY2FuIGJlIGEgdXNlZnVsCi1hZGp1bmN0IHRvIGEgcHJvc2UgZGVzY3JpcHRpb24uICBBIGRvY3VtZW50ZXIgc2hvdWxkIGNhcmVmdWxseSB3ZWlnaCB3aGV0aGVyIHRoZQotY29kZSBlcXVpdmFsZW50IGFkZHMgdmFsdWUuCi0KLUEgZ29vZCBleGFtcGxlIGlzIHRoZSBjb2RlIGVxdWl2YWxlbnQgZm9yIDpmdW5jOmBhbGxgLiAgVGhlIHNob3J0IDQtbGluZSBjb2RlCi1lcXVpdmFsZW50IGlzIGVhc2lseSBkaWdlc3RlZDsgaXQgcmUtZW1waGFzaXplcyB0aGUgZWFybHktb3V0IGJlaGF2aW9yOyBhbmQgaXQKLWNsYXJpZmllcyB0aGUgaGFuZGxpbmcgb2YgdGhlIGNvcm5lci1jYXNlIHdoZXJlIHRoZSBpdGVyYWJsZSBpcyBlbXB0eS4gIEluCi1hZGRpdGlvbiwgaXQgc2VydmVzIGFzIGEgbW9kZWwgZm9yIHBlb3BsZSB3YW50aW5nIHRvIGltcGxlbWVudCBhIGNvbW1vbmx5Ci1yZXF1ZXN0ZWQgYWx0ZXJuYXRpdmUgd2hlcmUgOmZ1bmM6YGFsbGAgd291bGQgcmV0dXJuIHRoZSBzcGVjaWZpYyBvYmplY3QKLWV2YWx1YXRpbmcgdG8gRmFsc2Ugd2hlbmV2ZXIgdGhlIGZ1bmN0aW9uIHRlcm1pbmF0ZXMgZWFybHkuCi0KLUEgbW9yZSBxdWVzdGlvbmFibGUgZXhhbXBsZSBpcyB0aGUgY29kZSBmb3IgOmZ1bmM6YGl0ZXJ0b29scy5ncm91cGJ5YC4gIEl0cyBjb2RlCi1lcXVpdmFsZW50IGJvcmRlcnMgb24gYmVpbmcgdG9vIGNvbXBsZXggdG8gYmUgYSBxdWljayBhaWQgdG8gdW5kZXJzdGFuZGluZy4KLURlc3BpdGUgaXRzIGNvbXBsZXhpdHksIHRoZSBjb2RlIGVxdWl2YWxlbnQgd2FzIGtlcHQgYmVjYXVzZSBpdCBzZXJ2ZXMgYXMgYQotbW9kZWwgdG8gYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb25zIGFuZCBiZWNhdXNlIHRoZSBvcGVyYXRpb24gb2YgdGhlICJncm91cGVyIgotaXMgbW9yZSBlYXNpbHkgc2hvd24gaW4gY29kZSB0aGFuIGluIEVuZ2xpc2ggcHJvc2UuCi0KLUFuIGV4YW1wbGUgb2Ygd2hlbiBub3QgdG8gdXNlIGEgY29kZSBlcXVpdmFsZW50IGlzIGZvciB0aGUgOmZ1bmM6YG9jdGAgZnVuY3Rpb24uCi1UaGUgZXhhY3Qgc3RlcHMgaW4gY29udmVydGluZyBhIG51bWJlciB0byBvY3RhbCBkb2Vzbid0IGFkZCB2YWx1ZSBmb3IgYSB1c2VyCi10cnlpbmcgdG8gbGVhcm4gd2hhdCB0aGUgZnVuY3Rpb24gZG9lcy4KLQotQXVkaWVuY2UKLS0tLS0tLS0tCi0KLVRoZSB0b25lIG9mIHRoZSB0dXRvcmlhbCAoYW5kIGFsbCB0aGUgZG9jcykgbmVlZHMgdG8gYmUgcmVzcGVjdGZ1bCBvZiB0aGUKLXJlYWRlcidzIGludGVsbGlnZW5jZS4gIERvbid0IHByZXN1bWUgdGhhdCB0aGUgcmVhZGVycyBhcmUgc3R1cGlkLiAgTGF5IG91dCB0aGUKLXJlbGV2YW50IGluZm9ybWF0aW9uLCBzaG93IG1vdGl2YXRpbmcgdXNlIGNhc2VzLCBwcm92aWRlIGdsb3NzYXJ5IGxpbmtzLCBhbmQgZG8KLXlvdXIgYmVzdCB0byBjb25uZWN0IHRoZSBkb3RzLCBidXQgZG9uJ3QgdGFsayBkb3duIHRvIHRoZW0gb3Igd2FzdGUgdGhlaXIgdGltZS4KLQotVGhlIHR1dG9yaWFsIGlzIG1lYW50IGZvciBuZXdjb21lcnMsIG1hbnkgb2Ygd2hvbSB3aWxsIGJlIHVzaW5nIHRoZSB0dXRvcmlhbCB0bwotZXZhbHVhdGUgdGhlIGxhbmd1YWdlIGFzIGEgd2hvbGUuICBUaGUgZXhwZXJpZW5jZSBuZWVkcyB0byBiZSBwb3NpdGl2ZSBhbmQgbm90Ci1sZWF2ZSB0aGUgcmVhZGVyIHdpdGggd29ycmllcyB0aGF0IHNvbWV0aGluZyBiYWQgd2lsbCBoYXBwZW4gaWYgdGhleSBtYWtlIGEKLW1pc3N0ZXAuICBUaGUgdHV0b3JpYWwgc2VydmVzIGFzIGd1aWRlIGZvciBpbnRlbGxpZ2VudCBhbmQgY3VyaW91cyByZWFkZXJzLAotc2F2aW5nIGRldGFpbHMgZm9yIHRoZSBob3ctdG8gZ3VpZGVzIGFuZCBvdGhlciBzb3VyY2VzLgotCi1CZSBjYXJlZnVsIGFjY2VwdGluZyByZXF1ZXN0cyBmb3IgZG9jdW1lbnRhdGlvbiBjaGFuZ2VzIGZyb20gdGhlIHJhcmUgYnV0IHZvY2FsCi1jYXRlZ29yeSBvZiByZWFkZXIgd2hvIGlzIGxvb2tpbmcgZm9yIHZpbmRpY2F0aW9uIGZvciBvbmUgb2YgdGhlaXIgcHJvZ3JhbW1pbmcKLWVycm9ycyAoIkkgbWFkZSBhIG1pc3Rha2UsIHRoZXJlZm9yZSB0aGUgZG9jcyBtdXN0IGJlIHdyb25nIC4uLiIpLiAgVHlwaWNhbGx5LAotdGhlIGRvY3VtZW50YXRpb24gd2Fzbid0IGNvbnN1bHRlZCB1bnRpbCBhZnRlciB0aGUgZXJyb3Igd2FzIG1hZGUuICBJdCBpcwotdW5mb3J0dW5hdGUsIGJ1dCB0eXBpY2FsbHkgbm8gZG9jdW1lbnRhdGlvbiBlZGl0IHdvdWxkIGhhdmUgc2F2ZWQgdGhlIHVzZXIgZnJvbQotbWFraW5nIGZhbHNlIGFzc3VtcHRpb25zIGFib3V0IHRoZSBsYW5ndWFnZSAoIkkgd2FzIHN1cnByaXNlZCBieSAuLi4iKS4KLQotCi0uLiBfQXBwbGUgUHVibGljYXRpb25zIFN0eWxlIEd1aWRlOiBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9tYWMvbGlicmFyeS9kb2N1bWVudGF0aW9uL1VzZXJFeHBlcmllbmNlL0NvbmNlcHR1YWwvQVBTdHlsZUd1aWRlL0FQU0dfMjAwOS5wZGYKLQpkaWZmIC0tZ2l0IGEvRG9jL2V4dGVuZGluZy9idWlsZGluZy5yc3QgYi9Eb2MvZXh0ZW5kaW5nL2J1aWxkaW5nLnJzdAppbmRleCBmNGQ5NWIyLi4wOGIwY2MyIDEwMDY0NAotLS0gYS9Eb2MvZXh0ZW5kaW5nL2J1aWxkaW5nLnJzdAorKysgYi9Eb2MvZXh0ZW5kaW5nL2J1aWxkaW5nLnJzdApAQCAtNTgsOCArNTgsOSBAQAogSXQgaXMgY29tbW9uIHRvIHByZS1jb21wdXRlIGFyZ3VtZW50cyB0byA6ZnVuYzpgc2V0dXBgLCB0byBiZXR0ZXIgc3RydWN0dXJlIHRoZQogZHJpdmVyIHNjcmlwdC4gSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHRoZVwgYGBleHRfbW9kdWxlc2BgIGFyZ3VtZW50IHRvCiA6ZnVuYzpgc2V0dXBgIGlzIGEgbGlzdCBvZiBleHRlbnNpb24gbW9kdWxlcywgZWFjaCBvZiB3aGljaCBpcyBhbiBpbnN0YW5jZSBvZgotdGhlIDpjbGFzczpgRXh0ZW5zaW9uYC4gSW4gdGhlIGV4YW1wbGUsIHRoZSBpbnN0YW5jZSBkZWZpbmVzIGFuIGV4dGVuc2lvbiBuYW1lZAotYGBkZW1vYGAgd2hpY2ggaXMgYnVpbGQgYnkgY29tcGlsaW5nIGEgc2luZ2xlIHNvdXJjZSBmaWxlLCA6ZmlsZTpgZGVtby5jYC4KK3RoZSA6Y2xhc3M6YH5kaXN0dXRpbHMuZXh0ZW5zaW9uLkV4dGVuc2lvbmAuIEluIHRoZSBleGFtcGxlLCB0aGUgaW5zdGFuY2UKK2RlZmluZXMgYW4gZXh0ZW5zaW9uIG5hbWVkIGBgZGVtb2BgIHdoaWNoIGlzIGJ1aWxkIGJ5IGNvbXBpbGluZyBhIHNpbmdsZSBzb3VyY2UKK2ZpbGUsIDpmaWxlOmBkZW1vLmNgLgogCiBJbiBtYW55IGNhc2VzLCBidWlsZGluZyBhbiBleHRlbnNpb24gaXMgbW9yZSBjb21wbGV4LCBzaW5jZSBhZGRpdGlvbmFsCiBwcmVwcm9jZXNzb3IgZGVmaW5lcyBhbmQgbGlicmFyaWVzIG1heSBiZSBuZWVkZWQuIFRoaXMgaXMgZGVtb25zdHJhdGVkIGluIHRoZQpkaWZmIC0tZ2l0IGEvRG9jL2V4dGVuZGluZy9lbWJlZGRpbmcucnN0IGIvRG9jL2V4dGVuZGluZy9lbWJlZGRpbmcucnN0CmluZGV4IGI4OWUyMjQuLjk4MWUxZDUgMTAwNjQ0Ci0tLSBhL0RvYy9leHRlbmRpbmcvZW1iZWRkaW5nLnJzdAorKysgYi9Eb2MvZXh0ZW5kaW5nL2VtYmVkZGluZy5yc3QKQEAgLTI1LDE0ICsyNSwxNCBAQAogCiBTbyBpZiB5b3UgYXJlIGVtYmVkZGluZyBQeXRob24sIHlvdSBhcmUgcHJvdmlkaW5nIHlvdXIgb3duIG1haW4gcHJvZ3JhbS4gIE9uZSBvZgogdGhlIHRoaW5ncyB0aGlzIG1haW4gcHJvZ3JhbSBoYXMgdG8gZG8gaXMgaW5pdGlhbGl6ZSB0aGUgUHl0aG9uIGludGVycHJldGVyLiAgQXQKLXRoZSB2ZXJ5IGxlYXN0LCB5b3UgaGF2ZSB0byBjYWxsIHRoZSBmdW5jdGlvbiA6Y2Z1bmM6YFB5X0luaXRpYWxpemVgLiAgVGhlcmUgYXJlCit0aGUgdmVyeSBsZWFzdCwgeW91IGhhdmUgdG8gY2FsbCB0aGUgZnVuY3Rpb24gOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAuICBUaGVyZSBhcmUKIG9wdGlvbmFsIGNhbGxzIHRvIHBhc3MgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0byBQeXRob24uICBUaGVuIGxhdGVyIHlvdSBjYW4KIGNhbGwgdGhlIGludGVycHJldGVyIGZyb20gYW55IHBhcnQgb2YgdGhlIGFwcGxpY2F0aW9uLgogCiBUaGVyZSBhcmUgc2V2ZXJhbCBkaWZmZXJlbnQgd2F5cyB0byBjYWxsIHRoZSBpbnRlcnByZXRlcjogeW91IGNhbiBwYXNzIGEgc3RyaW5nCi1jb250YWluaW5nIFB5dGhvbiBzdGF0ZW1lbnRzIHRvIDpjZnVuYzpgUHlSdW5fU2ltcGxlU3RyaW5nYCwgb3IgeW91IGNhbiBwYXNzIGEKK2NvbnRhaW5pbmcgUHl0aG9uIHN0YXRlbWVudHMgdG8gOmM6ZnVuYzpgUHlSdW5fU2ltcGxlU3RyaW5nYCwgb3IgeW91IGNhbiBwYXNzIGEKIHN0ZGlvIGZpbGUgcG9pbnRlciBhbmQgYSBmaWxlIG5hbWUgKGZvciBpZGVudGlmaWNhdGlvbiBpbiBlcnJvciBtZXNzYWdlcyBvbmx5KQotdG8gOmNmdW5jOmBQeVJ1bl9TaW1wbGVGaWxlYC4gIFlvdSBjYW4gYWxzbyBjYWxsIHRoZSBsb3dlci1sZXZlbCBvcGVyYXRpb25zCit0byA6YzpmdW5jOmBQeVJ1bl9TaW1wbGVGaWxlYC4gIFlvdSBjYW4gYWxzbyBjYWxsIHRoZSBsb3dlci1sZXZlbCBvcGVyYXRpb25zCiBkZXNjcmliZWQgaW4gdGhlIHByZXZpb3VzIGNoYXB0ZXJzIHRvIGNvbnN0cnVjdCBhbmQgdXNlIFB5dGhvbiBvYmplY3RzLgogCiBBIHNpbXBsZSBkZW1vIG9mIGVtYmVkZGluZyBQeXRob24gY2FuIGJlIGZvdW5kIGluIHRoZSBkaXJlY3RvcnkKQEAgLTYxLDYgKzYxLDcgQEAKICAgIGludAogICAgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogICAgeworICAgICBQeV9TZXRQcm9ncmFtTmFtZShhcmd2WzBdKTsgIC8qIG9wdGlvbmFsIGJ1dCByZWNvbW1lbmRlZCAqLwogICAgICBQeV9Jbml0aWFsaXplKCk7CiAgICAgIFB5UnVuX1NpbXBsZVN0cmluZygiZnJvbSB0aW1lIGltcG9ydCB0aW1lLGN0aW1lXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAicHJpbnQgJ1RvZGF5IGlzJyxjdGltZSh0aW1lKCkpXG4iKTsKQEAgLTY4LDEzICs2OSwxNSBAQAogICAgICByZXR1cm4gMDsKICAgIH0KIAotVGhlIGFib3ZlIGNvZGUgZmlyc3QgaW5pdGlhbGl6ZXMgdGhlIFB5dGhvbiBpbnRlcnByZXRlciB3aXRoCi06Y2Z1bmM6YFB5X0luaXRpYWxpemVgLCBmb2xsb3dlZCBieSB0aGUgZXhlY3V0aW9uIG9mIGEgaGFyZC1jb2RlZCBQeXRob24gc2NyaXB0Ci10aGF0IHByaW50IHRoZSBkYXRlIGFuZCB0aW1lLiAgQWZ0ZXJ3YXJkcywgdGhlIDpjZnVuYzpgUHlfRmluYWxpemVgIGNhbGwgc2h1dHMKK1RoZSA6YzpmdW5jOmBQeV9TZXRQcm9ncmFtTmFtZWAgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUKKzpjOmZ1bmM6YFB5X0luaXRpYWxpemVgIHRvIGluZm9ybSB0aGUgaW50ZXJwcmV0ZXIgYWJvdXQgcGF0aHMgdG8gUHl0aG9uIHJ1bi10aW1lCitsaWJyYXJpZXMuICBOZXh0LCB0aGUgUHl0aG9uIGludGVycHJldGVyIGlzIGluaXRpYWxpemVkIHdpdGgKKzpjOmZ1bmM6YFB5X0luaXRpYWxpemVgLCBmb2xsb3dlZCBieSB0aGUgZXhlY3V0aW9uIG9mIGEgaGFyZC1jb2RlZCBQeXRob24gc2NyaXB0Cit0aGF0IHByaW50cyB0aGUgZGF0ZSBhbmQgdGltZS4gIEFmdGVyd2FyZHMsIHRoZSA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAgY2FsbCBzaHV0cwogdGhlIGludGVycHJldGVyIGRvd24sIGZvbGxvd2VkIGJ5IHRoZSBlbmQgb2YgdGhlIHByb2dyYW0uICBJbiBhIHJlYWwgcHJvZ3JhbSwKIHlvdSBtYXkgd2FudCB0byBnZXQgdGhlIFB5dGhvbiBzY3JpcHQgZnJvbSBhbm90aGVyIHNvdXJjZSwgcGVyaGFwcyBhIHRleHQtZWRpdG9yCiByb3V0aW5lLCBhIGZpbGUsIG9yIGEgZGF0YWJhc2UuICBHZXR0aW5nIHRoZSBQeXRob24gY29kZSBmcm9tIGEgZmlsZSBjYW4gYmV0dGVyCi1iZSBkb25lIGJ5IHVzaW5nIHRoZSA6Y2Z1bmM6YFB5UnVuX1NpbXBsZUZpbGVgIGZ1bmN0aW9uLCB3aGljaCBzYXZlcyB5b3UgdGhlCitiZSBkb25lIGJ5IHVzaW5nIHRoZSA6YzpmdW5jOmBQeVJ1bl9TaW1wbGVGaWxlYCBmdW5jdGlvbiwgd2hpY2ggc2F2ZXMgeW91IHRoZQogdHJvdWJsZSBvZiBhbGxvY2F0aW5nIG1lbW9yeSBzcGFjZSBhbmQgbG9hZGluZyB0aGUgZmlsZSBjb250ZW50cy4KIAogCkBAIC0xMzcsNyArMTQwLDkgQEAKIFRoaXMgY29kZSBsb2FkcyBhIFB5dGhvbiBzY3JpcHQgdXNpbmcgYGBhcmd2WzFdYGAsIGFuZCBjYWxscyB0aGUgZnVuY3Rpb24gbmFtZWQKIGluIGBgYXJndlsyXWBgLiAgSXRzIGludGVnZXIgYXJndW1lbnRzIGFyZSB0aGUgb3RoZXIgdmFsdWVzIG9mIHRoZSBgYGFyZ3ZgYAogYXJyYXkuICBJZiB5b3UgY29tcGlsZSBhbmQgbGluayB0aGlzIHByb2dyYW0gKGxldCdzIGNhbGwgdGhlIGZpbmlzaGVkIGV4ZWN1dGFibGUKLTpwcm9ncmFtOmBjYWxsYCksIGFuZCB1c2UgaXQgdG8gZXhlY3V0ZSBhIFB5dGhvbiBzY3JpcHQsIHN1Y2ggYXM6OgorOnByb2dyYW06YGNhbGxgKSwgYW5kIHVzZSBpdCB0byBleGVjdXRlIGEgUHl0aG9uIHNjcmlwdCwgc3VjaCBhczoKKworLi4gY29kZS1ibG9jazo6IHB5dGhvbgogCiAgICBkZWYgbXVsdGlwbHkoYSxiKToKICAgICAgICBwcmludCAiV2lsbCBjb21wdXRlIiwgYSwgInRpbWVzIiwgYgpAQCAtMTYyLDggKzE2Nyw4IEBACiAgICBwTW9kdWxlID0gUHlJbXBvcnRfSW1wb3J0KHBOYW1lKTsKIAogQWZ0ZXIgaW5pdGlhbGl6aW5nIHRoZSBpbnRlcnByZXRlciwgdGhlIHNjcmlwdCBpcyBsb2FkZWQgdXNpbmcKLTpjZnVuYzpgUHlJbXBvcnRfSW1wb3J0YC4gIFRoaXMgcm91dGluZSBuZWVkcyBhIFB5dGhvbiBzdHJpbmcgYXMgaXRzIGFyZ3VtZW50LAotd2hpY2ggaXMgY29uc3RydWN0ZWQgdXNpbmcgdGhlIDpjZnVuYzpgUHlTdHJpbmdfRnJvbVN0cmluZ2AgZGF0YSBjb252ZXJzaW9uCis6YzpmdW5jOmBQeUltcG9ydF9JbXBvcnRgLiAgVGhpcyByb3V0aW5lIG5lZWRzIGEgUHl0aG9uIHN0cmluZyBhcyBpdHMgYXJndW1lbnQsCit3aGljaCBpcyBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgOmM6ZnVuYzpgUHlTdHJpbmdfRnJvbVN0cmluZ2AgZGF0YSBjb252ZXJzaW9uCiByb3V0aW5lLiA6OgogCiAgICBwRnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcocE1vZHVsZSwgYXJndlsyXSk7CkBAIC0xNzUsNyArMTgwLDcgQEAKICAgIFB5X1hERUNSRUYocEZ1bmMpOwogCiBPbmNlIHRoZSBzY3JpcHQgaXMgbG9hZGVkLCB0aGUgbmFtZSB3ZSdyZSBsb29raW5nIGZvciBpcyByZXRyaWV2ZWQgdXNpbmcKLTpjZnVuYzpgUHlPYmplY3RfR2V0QXR0clN0cmluZ2AuICBJZiB0aGUgbmFtZSBleGlzdHMsIGFuZCB0aGUgb2JqZWN0IHJldHVybmVkIGlzCis6YzpmdW5jOmBQeU9iamVjdF9HZXRBdHRyU3RyaW5nYC4gIElmIHRoZSBuYW1lIGV4aXN0cywgYW5kIHRoZSBvYmplY3QgcmV0dXJuZWQgaXMKIGNhbGxhYmxlLCB5b3UgY2FuIHNhZmVseSBhc3N1bWUgdGhhdCBpdCBpcyBhIGZ1bmN0aW9uLiAgVGhlIHByb2dyYW0gdGhlbgogcHJvY2VlZHMgYnkgY29uc3RydWN0aW5nIGEgdHVwbGUgb2YgYXJndW1lbnRzIGFzIG5vcm1hbC4gIFRoZSBjYWxsIHRvIHRoZSBQeXRob24KIGZ1bmN0aW9uIGlzIHRoZW4gbWFkZSB3aXRoOjoKQEAgLTIxOCwxNSArMjIzLDE3IEBACiAgICAgICAge05VTEwsIE5VTEwsIDAsIE5VTEx9CiAgICB9OwogCi1JbnNlcnQgdGhlIGFib3ZlIGNvZGUganVzdCBhYm92ZSB0aGUgOmNmdW5jOmBtYWluYCBmdW5jdGlvbi4gQWxzbywgaW5zZXJ0IHRoZQotZm9sbG93aW5nIHR3byBzdGF0ZW1lbnRzIGRpcmVjdGx5IGFmdGVyIDpjZnVuYzpgUHlfSW5pdGlhbGl6ZWA6OgorSW5zZXJ0IHRoZSBhYm92ZSBjb2RlIGp1c3QgYWJvdmUgdGhlIDpjOmZ1bmM6YG1haW5gIGZ1bmN0aW9uLiBBbHNvLCBpbnNlcnQgdGhlCitmb2xsb3dpbmcgdHdvIHN0YXRlbWVudHMgZGlyZWN0bHkgYWZ0ZXIgOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWA6OgogCiAgICBudW1hcmdzID0gYXJnYzsKICAgIFB5X0luaXRNb2R1bGUoImVtYiIsIEVtYk1ldGhvZHMpOwogCiBUaGVzZSB0d28gbGluZXMgaW5pdGlhbGl6ZSB0aGUgYGBudW1hcmdzYGAgdmFyaWFibGUsIGFuZCBtYWtlIHRoZQogOmZ1bmM6YGVtYi5udW1hcmdzYCBmdW5jdGlvbiBhY2Nlc3NpYmxlIHRvIHRoZSBlbWJlZGRlZCBQeXRob24gaW50ZXJwcmV0ZXIuCi1XaXRoIHRoZXNlIGV4dGVuc2lvbnMsIHRoZSBQeXRob24gc2NyaXB0IGNhbiBkbyB0aGluZ3MgbGlrZSA6OgorV2l0aCB0aGVzZSBleHRlbnNpb25zLCB0aGUgUHl0aG9uIHNjcmlwdCBjYW4gZG8gdGhpbmdzIGxpa2UKKworLi4gY29kZS1ibG9jazo6IHB5dGhvbgogCiAgICBpbXBvcnQgZW1iCiAgICBwcmludCAiTnVtYmVyIG9mIGFyZ3VtZW50cyIsIGVtYi5udW1hcmdzKCkKQEAgLTI1MSwzNSArMjU4LDU1IEBACiAKIC4uIF9saW5rLXJlcXM6CiAKLUxpbmtpbmcgUmVxdWlyZW1lbnRzCi09PT09PT09PT09PT09PT09PT09PQorQ29tcGlsaW5nIGFuZCBMaW5raW5nIHVuZGVyIFVuaXgtbGlrZSBzeXN0ZW1zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotV2hpbGUgdGhlIDpwcm9ncmFtOmBjb25maWd1cmVgIHNjcmlwdCBzaGlwcGVkIHdpdGggdGhlIFB5dGhvbiBzb3VyY2VzIHdpbGwKLWNvcnJlY3RseSBidWlsZCBQeXRob24gdG8gZXhwb3J0IHRoZSBzeW1ib2xzIG5lZWRlZCBieSBkeW5hbWljYWxseSBsaW5rZWQKLWV4dGVuc2lvbnMsIHRoaXMgaXMgbm90IGF1dG9tYXRpY2FsbHkgaW5oZXJpdGVkIGJ5IGFwcGxpY2F0aW9ucyB3aGljaCBlbWJlZCB0aGUKLVB5dGhvbiBsaWJyYXJ5IHN0YXRpY2FsbHksIGF0IGxlYXN0IG9uIFVuaXguICBUaGlzIGlzIGFuIGlzc3VlIHdoZW4gdGhlCi1hcHBsaWNhdGlvbiBpcyBsaW5rZWQgdG8gdGhlIHN0YXRpYyBydW50aW1lIGxpYnJhcnkgKDpmaWxlOmBsaWJweXRob24uYWApIGFuZAotbmVlZHMgdG8gbG9hZCBkeW5hbWljIGV4dGVuc2lvbnMgKGltcGxlbWVudGVkIGFzIDpmaWxlOmAuc29gIGZpbGVzKS4KK0l0IGlzIG5vdCBuZWNlc3NhcmlseSB0cml2aWFsIHRvIGZpbmQgdGhlIHJpZ2h0IGZsYWdzIHRvIHBhc3MgdG8geW91cgorY29tcGlsZXIgKGFuZCBsaW5rZXIpIGluIG9yZGVyIHRvIGVtYmVkIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaW50byB5b3VyCithcHBsaWNhdGlvbiwgcGFydGljdWxhcmx5IGJlY2F1c2UgUHl0aG9uIG5lZWRzIHRvIGxvYWQgbGlicmFyeSBtb2R1bGVzCitpbXBsZW1lbnRlZCBhcyBDIGR5bmFtaWMgZXh0ZW5zaW9ucyAoOmZpbGU6YC5zb2AgZmlsZXMpIGxpbmtlZCBhZ2FpbnN0CitpdC4KIAotVGhlIHByb2JsZW0gaXMgdGhhdCBzb21lIGVudHJ5IHBvaW50cyBhcmUgZGVmaW5lZCBieSB0aGUgUHl0aG9uIHJ1bnRpbWUgc29sZWx5Ci1mb3IgZXh0ZW5zaW9uIG1vZHVsZXMgdG8gdXNlLiAgSWYgdGhlIGVtYmVkZGluZyBhcHBsaWNhdGlvbiBkb2VzIG5vdCB1c2UgYW55IG9mCi10aGVzZSBlbnRyeSBwb2ludHMsIHNvbWUgbGlua2VycyB3aWxsIG5vdCBpbmNsdWRlIHRob3NlIGVudHJpZXMgaW4gdGhlIHN5bWJvbAotdGFibGUgb2YgdGhlIGZpbmlzaGVkIGV4ZWN1dGFibGUuICBTb21lIGFkZGl0aW9uYWwgb3B0aW9ucyBhcmUgbmVlZGVkIHRvIGluZm9ybQotdGhlIGxpbmtlciBub3QgdG8gcmVtb3ZlIHRoZXNlIHN5bWJvbHMuCitUbyBmaW5kIG91dCB0aGUgcmVxdWlyZWQgY29tcGlsZXIgYW5kIGxpbmtlciBmbGFncywgeW91IGNhbiBleGVjdXRlIHRoZQorOmZpbGU6YHB5dGhvbntYLll9LWNvbmZpZ2Agc2NyaXB0IHdoaWNoIGlzIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoZQoraW5zdGFsbGF0aW9uIHByb2Nlc3MgKGEgOmZpbGU6YHB5dGhvbi1jb25maWdgIHNjcmlwdCBtYXkgYWxzbyBiZQorYXZhaWxhYmxlKS4gIFRoaXMgc2NyaXB0IGhhcyBzZXZlcmFsIG9wdGlvbnMsIG9mIHdoaWNoIHRoZSBmb2xsb3dpbmcgd2lsbAorYmUgZGlyZWN0bHkgdXNlZnVsIHRvIHlvdToKIAotRGV0ZXJtaW5pbmcgdGhlIHJpZ2h0IG9wdGlvbnMgdG8gdXNlIGZvciBhbnkgZ2l2ZW4gcGxhdGZvcm0gY2FuIGJlIHF1aXRlCi1kaWZmaWN1bHQsIGJ1dCBmb3J0dW5hdGVseSB0aGUgUHl0aG9uIGNvbmZpZ3VyYXRpb24gYWxyZWFkeSBoYXMgdGhvc2UgdmFsdWVzLgotVG8gcmV0cmlldmUgdGhlbSBmcm9tIGFuIGluc3RhbGxlZCBQeXRob24gaW50ZXJwcmV0ZXIsIHN0YXJ0IGFuIGludGVyYWN0aXZlCi1pbnRlcnByZXRlciBhbmQgaGF2ZSBhIHNob3J0IHNlc3Npb24gbGlrZSB0aGlzOjoKKyogYGBweXRob25YLlktY29uZmlnIC0tY2ZsYWdzYGAgd2lsbCBnaXZlIHlvdSB0aGUgcmVjb21tZW5kZWQgZmxhZ3Mgd2hlbgorICBjb21waWxpbmc6OgogCi0gICA+Pj4gaW1wb3J0IGRpc3R1dGlscy5zeXNjb25maWcKLSAgID4+PiBkaXN0dXRpbHMuc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdMSU5LRk9SU0hBUkVEJykKKyAgICQgL29wdC9iaW4vcHl0aG9uMi43LWNvbmZpZyAtLWNmbGFncworICAgLUkvb3B0L2luY2x1ZGUvcHl0aG9uMi43IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1ETkRFQlVHIC1nIC1md3JhcHYgLU8zIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMKKworKiBgYHB5dGhvblguWS1jb25maWcgLS1sZGZsYWdzYGAgd2lsbCBnaXZlIHlvdSB0aGUgcmVjb21tZW5kZWQgZmxhZ3Mgd2hlbgorICBsaW5raW5nOjoKKworICAgJCAvb3B0L2Jpbi9weXRob24yLjctY29uZmlnIC0tbGRmbGFncworICAgLUwvb3B0L2xpYi9weXRob24yLjcvY29uZmlnIC1scHRocmVhZCAtbGRsIC1sdXRpbCAtbG0gLWxweXRob24yLjcgLVhsaW5rZXIgLWV4cG9ydC1keW5hbWljCisKKy4uIG5vdGU6OgorICAgVG8gYXZvaWQgY29uZnVzaW9uIGJldHdlZW4gc2V2ZXJhbCBQeXRob24gaW5zdGFsbGF0aW9ucyAoYW5kIGVzcGVjaWFsbHkKKyAgIGJldHdlZW4gdGhlIHN5c3RlbSBQeXRob24gYW5kIHlvdXIgb3duIGNvbXBpbGVkIFB5dGhvbiksIGl0IGlzIHJlY29tbWVuZGVkCisgICB0aGF0IHlvdSB1c2UgdGhlIGFic29sdXRlIHBhdGggdG8gOmZpbGU6YHB5dGhvbntYLll9LWNvbmZpZ2AsIGFzIGluIHRoZSBhYm92ZQorICAgZXhhbXBsZS4KKworSWYgdGhpcyBwcm9jZWR1cmUgZG9lc24ndCB3b3JrIGZvciB5b3UgKGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIHdvcmsgZm9yCithbGwgVW5peC1saWtlIHBsYXRmb3JtczsgaG93ZXZlciwgd2Ugd2VsY29tZSA6cmVmOmBidWcgcmVwb3J0cyA8cmVwb3J0aW5nLWJ1Z3M+YCkKK3lvdSB3aWxsIGhhdmUgdG8gcmVhZCB5b3VyIHN5c3RlbSdzIGRvY3VtZW50YXRpb24gYWJvdXQgZHluYW1pYyBsaW5raW5nIGFuZC9vcgorZXhhbWluZSBQeXRob24ncyA6ZmlsZTpgTWFrZWZpbGVgICh1c2UgOmZ1bmM6YHN5c2NvbmZpZy5nZXRfbWFrZWZpbGVfZmlsZW5hbWVgCit0byBmaW5kIGl0cyBsb2NhdGlvbikgYW5kIGNvbXBpbGF0aW9uCitvcHRpb25zLiAgSW4gdGhpcyBjYXNlLCB0aGUgOm1vZDpgc3lzY29uZmlnYCBtb2R1bGUgaXMgYSB1c2VmdWwgdG9vbCB0bworcHJvZ3JhbW1hdGljYWxseSBleHRyYWN0IHRoZSBjb25maWd1cmF0aW9uIHZhbHVlcyB0aGF0IHlvdSB3aWxsIHdhbnQgdG8KK2NvbWJpbmUgdG9nZXRoZXIuICBGb3IgZXhhbXBsZToKKworLi4gY29kZS1ibG9jazo6IHB5dGhvbgorCisgICA+Pj4gaW1wb3J0IHN5c2NvbmZpZworICAgPj4+IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignTElCUycpCisgICAnLWxwdGhyZWFkIC1sZGwgIC1sdXRpbCcKKyAgID4+PiBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ0xJTktGT1JTSEFSRUQnKQogICAgJy1YbGlua2VyIC1leHBvcnQtZHluYW1pYycKIAotLi4gaW5kZXg6OiBtb2R1bGU6IGRpc3R1dGlscy5zeXNjb25maWcKIAotVGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcgcHJlc2VudGVkIHdpbGwgYmUgdGhlIG9wdGlvbnMgdGhhdCBzaG91bGQgYmUgdXNlZC4KLUlmIHRoZSBzdHJpbmcgaXMgZW1wdHksIHRoZXJlJ3Mgbm8gbmVlZCB0byBhZGQgYW55IGFkZGl0aW9uYWwgb3B0aW9ucy4gIFRoZQotOmNvbnN0OmBMSU5LRk9SU0hBUkVEYCBkZWZpbml0aW9uIGNvcnJlc3BvbmRzIHRvIHRoZSB2YXJpYWJsZSBvZiB0aGUgc2FtZSBuYW1lCi1pbiBQeXRob24ncyB0b3AtbGV2ZWwgOmZpbGU6YE1ha2VmaWxlYC4KLQorLi4gWFhYIHNpbWlsYXIgZG9jdW1lbnRhdGlvbiBmb3IgV2luZG93cyBtaXNzaW5nCmRpZmYgLS1naXQgYS9Eb2MvZXh0ZW5kaW5nL2V4dGVuZGluZy5yc3QgYi9Eb2MvZXh0ZW5kaW5nL2V4dGVuZGluZy5yc3QKaW5kZXggYWQ2YTlmMy4uOGU4YzNhYiAxMDA2NDQKLS0tIGEvRG9jL2V4dGVuZGluZy9leHRlbmRpbmcucnN0CisrKyBiL0RvYy9leHRlbmRpbmcvZXh0ZW5kaW5nLnJzdApAQCAtMzUsNyArMzUsNyBAQAogCiBMZXQncyBjcmVhdGUgYW4gZXh0ZW5zaW9uIG1vZHVsZSBjYWxsZWQgYGBzcGFtYGAgKHRoZSBmYXZvcml0ZSBmb29kIG9mIE1vbnR5CiBQeXRob24gZmFucy4uLikgYW5kIGxldCdzIHNheSB3ZSB3YW50IHRvIGNyZWF0ZSBhIFB5dGhvbiBpbnRlcmZhY2UgdG8gdGhlIEMKLWxpYnJhcnkgZnVuY3Rpb24gOmNmdW5jOmBzeXN0ZW1gLiBbI11fIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBudWxsLXRlcm1pbmF0ZWQKK2xpYnJhcnkgZnVuY3Rpb24gOmM6ZnVuYzpgc3lzdGVtYC4gWyNdXyBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgbnVsbC10ZXJtaW5hdGVkCiBjaGFyYWN0ZXIgc3RyaW5nIGFzIGFyZ3VtZW50IGFuZCByZXR1cm5zIGFuIGludGVnZXIuICBXZSB3YW50IHRoaXMgZnVuY3Rpb24gdG8KIGJlIGNhbGxhYmxlIGZyb20gUHl0aG9uIGFzIGZvbGxvd3M6OgogCkBAIC02NSw4ICs2NSw4IEBACiBzaW5jZSB0aGV5IGFyZSB1c2VkIGV4dGVuc2l2ZWx5IGJ5IHRoZSBQeXRob24gaW50ZXJwcmV0ZXIsIGBgIlB5dGhvbi5oImBgCiBpbmNsdWRlcyBhIGZldyBzdGFuZGFyZCBoZWFkZXIgZmlsZXM6IGBgPHN0ZGlvLmg+YGAsIGBgPHN0cmluZy5oPmBgLAogYGA8ZXJybm8uaD5gYCwgYW5kIGBgPHN0ZGxpYi5oPmBgLiAgSWYgdGhlIGxhdHRlciBoZWFkZXIgZmlsZSBkb2VzIG5vdCBleGlzdCBvbgoteW91ciBzeXN0ZW0sIGl0IGRlY2xhcmVzIHRoZSBmdW5jdGlvbnMgOmNmdW5jOmBtYWxsb2NgLCA6Y2Z1bmM6YGZyZWVgIGFuZAotOmNmdW5jOmByZWFsbG9jYCBkaXJlY3RseS4KK3lvdXIgc3lzdGVtLCBpdCBkZWNsYXJlcyB0aGUgZnVuY3Rpb25zIDpjOmZ1bmM6YG1hbGxvY2AsIDpjOmZ1bmM6YGZyZWVgIGFuZAorOmM6ZnVuYzpgcmVhbGxvY2AgZGlyZWN0bHkuCiAKIFRoZSBuZXh0IHRoaW5nIHdlIGFkZCB0byBvdXIgbW9kdWxlIGZpbGUgaXMgdGhlIEMgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZAogd2hlbiB0aGUgUHl0aG9uIGV4cHJlc3Npb24gYGBzcGFtLnN5c3RlbShzdHJpbmcpYGAgaXMgZXZhbHVhdGVkICh3ZSdsbCBzZWUKQEAgLTk2LDEyICs5NiwxMiBAQAogYXJndW1lbnRzLiAgRWFjaCBpdGVtIG9mIHRoZSB0dXBsZSBjb3JyZXNwb25kcyB0byBhbiBhcmd1bWVudCBpbiB0aGUgY2FsbCdzCiBhcmd1bWVudCBsaXN0LiAgVGhlIGFyZ3VtZW50cyBhcmUgUHl0aG9uIG9iamVjdHMgLS0tIGluIG9yZGVyIHRvIGRvIGFueXRoaW5nCiB3aXRoIHRoZW0gaW4gb3VyIEMgZnVuY3Rpb24gd2UgaGF2ZSB0byBjb252ZXJ0IHRoZW0gdG8gQyB2YWx1ZXMuICBUaGUgZnVuY3Rpb24KLTpjZnVuYzpgUHlBcmdfUGFyc2VUdXBsZWAgaW4gdGhlIFB5dGhvbiBBUEkgY2hlY2tzIHRoZSBhcmd1bWVudCB0eXBlcyBhbmQKKzpjOmZ1bmM6YFB5QXJnX1BhcnNlVHVwbGVgIGluIHRoZSBQeXRob24gQVBJIGNoZWNrcyB0aGUgYXJndW1lbnQgdHlwZXMgYW5kCiBjb252ZXJ0cyB0aGVtIHRvIEMgdmFsdWVzLiAgSXQgdXNlcyBhIHRlbXBsYXRlIHN0cmluZyB0byBkZXRlcm1pbmUgdGhlIHJlcXVpcmVkCiB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIGFzIHdlbGwgYXMgdGhlIHR5cGVzIG9mIHRoZSBDIHZhcmlhYmxlcyBpbnRvIHdoaWNoIHRvCiBzdG9yZSB0aGUgY29udmVydGVkIHZhbHVlcy4gIE1vcmUgYWJvdXQgdGhpcyBsYXRlci4KIAotOmNmdW5jOmBQeUFyZ19QYXJzZVR1cGxlYCByZXR1cm5zIHRydWUgKG5vbnplcm8pIGlmIGFsbCBhcmd1bWVudHMgaGF2ZSB0aGUgcmlnaHQKKzpjOmZ1bmM6YFB5QXJnX1BhcnNlVHVwbGVgIHJldHVybnMgdHJ1ZSAobm9uemVybykgaWYgYWxsIGFyZ3VtZW50cyBoYXZlIHRoZSByaWdodAogdHlwZSBhbmQgaXRzIGNvbXBvbmVudHMgaGF2ZSBiZWVuIHN0b3JlZCBpbiB0aGUgdmFyaWFibGVzIHdob3NlIGFkZHJlc3NlcyBhcmUKIHBhc3NlZC4gIEl0IHJldHVybnMgZmFsc2UgKHplcm8pIGlmIGFuIGludmFsaWQgYXJndW1lbnQgbGlzdCB3YXMgcGFzc2VkLiAgSW4gdGhlCiBsYXR0ZXIgY2FzZSBpdCBhbHNvIHJhaXNlcyBhbiBhcHByb3ByaWF0ZSBleGNlcHRpb24gc28gdGhlIGNhbGxpbmcgZnVuY3Rpb24gY2FuCkBAIC0xMjcsNzcgKzEyNyw3NyBAQAogCiBUaGUgUHl0aG9uIEFQSSBkZWZpbmVzIGEgbnVtYmVyIG9mIGZ1bmN0aW9ucyB0byBzZXQgdmFyaW91cyB0eXBlcyBvZiBleGNlcHRpb25zLgogCi1UaGUgbW9zdCBjb21tb24gb25lIGlzIDpjZnVuYzpgUHlFcnJfU2V0U3RyaW5nYC4gIEl0cyBhcmd1bWVudHMgYXJlIGFuIGV4Y2VwdGlvbgorVGhlIG1vc3QgY29tbW9uIG9uZSBpcyA6YzpmdW5jOmBQeUVycl9TZXRTdHJpbmdgLiAgSXRzIGFyZ3VtZW50cyBhcmUgYW4gZXhjZXB0aW9uCiBvYmplY3QgYW5kIGEgQyBzdHJpbmcuICBUaGUgZXhjZXB0aW9uIG9iamVjdCBpcyB1c3VhbGx5IGEgcHJlZGVmaW5lZCBvYmplY3QgbGlrZQotOmNkYXRhOmBQeUV4Y19aZXJvRGl2aXNpb25FcnJvcmAuICBUaGUgQyBzdHJpbmcgaW5kaWNhdGVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IKKzpjOmRhdGE6YFB5RXhjX1plcm9EaXZpc2lvbkVycm9yYC4gIFRoZSBDIHN0cmluZyBpbmRpY2F0ZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvcgogYW5kIGlzIGNvbnZlcnRlZCB0byBhIFB5dGhvbiBzdHJpbmcgb2JqZWN0IGFuZCBzdG9yZWQgYXMgdGhlICJhc3NvY2lhdGVkIHZhbHVlIgogb2YgdGhlIGV4Y2VwdGlvbi4KIAotQW5vdGhlciB1c2VmdWwgZnVuY3Rpb24gaXMgOmNmdW5jOmBQeUVycl9TZXRGcm9tRXJybm9gLCB3aGljaCBvbmx5IHRha2VzIGFuCitBbm90aGVyIHVzZWZ1bCBmdW5jdGlvbiBpcyA6YzpmdW5jOmBQeUVycl9TZXRGcm9tRXJybm9gLCB3aGljaCBvbmx5IHRha2VzIGFuCiBleGNlcHRpb24gYXJndW1lbnQgYW5kIGNvbnN0cnVjdHMgdGhlIGFzc29jaWF0ZWQgdmFsdWUgYnkgaW5zcGVjdGlvbiBvZiB0aGUKLWdsb2JhbCB2YXJpYWJsZSA6Y2RhdGE6YGVycm5vYC4gIFRoZSBtb3N0IGdlbmVyYWwgZnVuY3Rpb24gaXMKLTpjZnVuYzpgUHlFcnJfU2V0T2JqZWN0YCwgd2hpY2ggdGFrZXMgdHdvIG9iamVjdCBhcmd1bWVudHMsIHRoZSBleGNlcHRpb24gYW5kCi1pdHMgYXNzb2NpYXRlZCB2YWx1ZS4gIFlvdSBkb24ndCBuZWVkIHRvIDpjZnVuYzpgUHlfSU5DUkVGYCB0aGUgb2JqZWN0cyBwYXNzZWQKK2dsb2JhbCB2YXJpYWJsZSA6YzpkYXRhOmBlcnJub2AuICBUaGUgbW9zdCBnZW5lcmFsIGZ1bmN0aW9uIGlzCis6YzpmdW5jOmBQeUVycl9TZXRPYmplY3RgLCB3aGljaCB0YWtlcyB0d28gb2JqZWN0IGFyZ3VtZW50cywgdGhlIGV4Y2VwdGlvbiBhbmQKK2l0cyBhc3NvY2lhdGVkIHZhbHVlLiAgWW91IGRvbid0IG5lZWQgdG8gOmM6ZnVuYzpgUHlfSU5DUkVGYCB0aGUgb2JqZWN0cyBwYXNzZWQKIHRvIGFueSBvZiB0aGVzZSBmdW5jdGlvbnMuCiAKIFlvdSBjYW4gdGVzdCBub24tZGVzdHJ1Y3RpdmVseSB3aGV0aGVyIGFuIGV4Y2VwdGlvbiBoYXMgYmVlbiBzZXQgd2l0aAotOmNmdW5jOmBQeUVycl9PY2N1cnJlZGAuICBUaGlzIHJldHVybnMgdGhlIGN1cnJlbnQgZXhjZXB0aW9uIG9iamVjdCwgb3IgKk5VTEwqCis6YzpmdW5jOmBQeUVycl9PY2N1cnJlZGAuICBUaGlzIHJldHVybnMgdGhlIGN1cnJlbnQgZXhjZXB0aW9uIG9iamVjdCwgb3IgKk5VTEwqCiBpZiBubyBleGNlcHRpb24gaGFzIG9jY3VycmVkLiAgWW91IG5vcm1hbGx5IGRvbid0IG5lZWQgdG8gY2FsbAotOmNmdW5jOmBQeUVycl9PY2N1cnJlZGAgdG8gc2VlIHdoZXRoZXIgYW4gZXJyb3Igb2NjdXJyZWQgaW4gYSBmdW5jdGlvbiBjYWxsLAorOmM6ZnVuYzpgUHlFcnJfT2NjdXJyZWRgIHRvIHNlZSB3aGV0aGVyIGFuIGVycm9yIG9jY3VycmVkIGluIGEgZnVuY3Rpb24gY2FsbCwKIHNpbmNlIHlvdSBzaG91bGQgYmUgYWJsZSB0byB0ZWxsIGZyb20gdGhlIHJldHVybiB2YWx1ZS4KIAogV2hlbiBhIGZ1bmN0aW9uICpmKiB0aGF0IGNhbGxzIGFub3RoZXIgZnVuY3Rpb24gKmcqIGRldGVjdHMgdGhhdCB0aGUgbGF0dGVyCiBmYWlscywgKmYqIHNob3VsZCBpdHNlbGYgcmV0dXJuIGFuIGVycm9yIHZhbHVlICh1c3VhbGx5ICpOVUxMKiBvciBgYC0xYGApLiAgSXQKLXNob3VsZCAqbm90KiBjYWxsIG9uZSBvZiB0aGUgOmNmdW5jOmBQeUVycl9cKmAgZnVuY3Rpb25zIC0tLSBvbmUgaGFzIGFscmVhZHkKK3Nob3VsZCAqbm90KiBjYWxsIG9uZSBvZiB0aGUgOmM6ZnVuYzpgUHlFcnJfXCpgIGZ1bmN0aW9ucyAtLS0gb25lIGhhcyBhbHJlYWR5CiBiZWVuIGNhbGxlZCBieSAqZyouICpmKidzIGNhbGxlciBpcyB0aGVuIHN1cHBvc2VkIHRvIGFsc28gcmV0dXJuIGFuIGVycm9yCi1pbmRpY2F0aW9uIHRvICppdHMqIGNhbGxlciwgYWdhaW4gKndpdGhvdXQqIGNhbGxpbmcgOmNmdW5jOmBQeUVycl9cKmAsIGFuZCBzbyBvbgoraW5kaWNhdGlvbiB0byAqaXRzKiBjYWxsZXIsIGFnYWluICp3aXRob3V0KiBjYWxsaW5nIDpjOmZ1bmM6YFB5RXJyX1wqYCwgYW5kIHNvIG9uCiAtLS0gdGhlIG1vc3QgZGV0YWlsZWQgY2F1c2Ugb2YgdGhlIGVycm9yIHdhcyBhbHJlYWR5IHJlcG9ydGVkIGJ5IHRoZSBmdW5jdGlvbgogdGhhdCBmaXJzdCBkZXRlY3RlZCBpdC4gIE9uY2UgdGhlIGVycm9yIHJlYWNoZXMgdGhlIFB5dGhvbiBpbnRlcnByZXRlcidzIG1haW4KIGxvb3AsIHRoaXMgYWJvcnRzIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIFB5dGhvbiBjb2RlIGFuZCB0cmllcyB0byBmaW5kIGFuCiBleGNlcHRpb24gaGFuZGxlciBzcGVjaWZpZWQgYnkgdGhlIFB5dGhvbiBwcm9ncmFtbWVyLgogCiAoVGhlcmUgYXJlIHNpdHVhdGlvbnMgd2hlcmUgYSBtb2R1bGUgY2FuIGFjdHVhbGx5IGdpdmUgYSBtb3JlIGRldGFpbGVkIGVycm9yCi1tZXNzYWdlIGJ5IGNhbGxpbmcgYW5vdGhlciA6Y2Z1bmM6YFB5RXJyX1wqYCBmdW5jdGlvbiwgYW5kIGluIHN1Y2ggY2FzZXMgaXQgaXMKK21lc3NhZ2UgYnkgY2FsbGluZyBhbm90aGVyIDpjOmZ1bmM6YFB5RXJyX1wqYCBmdW5jdGlvbiwgYW5kIGluIHN1Y2ggY2FzZXMgaXQgaXMKIGZpbmUgdG8gZG8gc28uICBBcyBhIGdlbmVyYWwgcnVsZSwgaG93ZXZlciwgdGhpcyBpcyBub3QgbmVjZXNzYXJ5LCBhbmQgY2FuIGNhdXNlCiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yIHRvIGJlIGxvc3Q6IG1vc3Qgb3BlcmF0aW9ucyBjYW4gZmFpbAogZm9yIGEgdmFyaWV0eSBvZiByZWFzb25zLikKIAogVG8gaWdub3JlIGFuIGV4Y2VwdGlvbiBzZXQgYnkgYSBmdW5jdGlvbiBjYWxsIHRoYXQgZmFpbGVkLCB0aGUgZXhjZXB0aW9uCi1jb25kaXRpb24gbXVzdCBiZSBjbGVhcmVkIGV4cGxpY2l0bHkgYnkgY2FsbGluZyA6Y2Z1bmM6YFB5RXJyX0NsZWFyYC4gIFRoZSBvbmx5Ci10aW1lIEMgY29kZSBzaG91bGQgY2FsbCA6Y2Z1bmM6YFB5RXJyX0NsZWFyYCBpcyBpZiBpdCBkb2Vzbid0IHdhbnQgdG8gcGFzcyB0aGUKK2NvbmRpdGlvbiBtdXN0IGJlIGNsZWFyZWQgZXhwbGljaXRseSBieSBjYWxsaW5nIDpjOmZ1bmM6YFB5RXJyX0NsZWFyYC4gIFRoZSBvbmx5Cit0aW1lIEMgY29kZSBzaG91bGQgY2FsbCA6YzpmdW5jOmBQeUVycl9DbGVhcmAgaXMgaWYgaXQgZG9lc24ndCB3YW50IHRvIHBhc3MgdGhlCiBlcnJvciBvbiB0byB0aGUgaW50ZXJwcmV0ZXIgYnV0IHdhbnRzIHRvIGhhbmRsZSBpdCBjb21wbGV0ZWx5IGJ5IGl0c2VsZgogKHBvc3NpYmx5IGJ5IHRyeWluZyBzb21ldGhpbmcgZWxzZSwgb3IgcHJldGVuZGluZyBub3RoaW5nIHdlbnQgd3JvbmcpLgogCi1FdmVyeSBmYWlsaW5nIDpjZnVuYzpgbWFsbG9jYCBjYWxsIG11c3QgYmUgdHVybmVkIGludG8gYW4gZXhjZXB0aW9uIC0tLSB0aGUKLWRpcmVjdCBjYWxsZXIgb2YgOmNmdW5jOmBtYWxsb2NgIChvciA6Y2Z1bmM6YHJlYWxsb2NgKSBtdXN0IGNhbGwKLTpjZnVuYzpgUHlFcnJfTm9NZW1vcnlgIGFuZCByZXR1cm4gYSBmYWlsdXJlIGluZGljYXRvciBpdHNlbGYuICBBbGwgdGhlCi1vYmplY3QtY3JlYXRpbmcgZnVuY3Rpb25zIChmb3IgZXhhbXBsZSwgOmNmdW5jOmBQeUludF9Gcm9tTG9uZ2ApIGFscmVhZHkgZG8KLXRoaXMsIHNvIHRoaXMgbm90ZSBpcyBvbmx5IHJlbGV2YW50IHRvIHRob3NlIHdobyBjYWxsIDpjZnVuYzpgbWFsbG9jYCBkaXJlY3RseS4KK0V2ZXJ5IGZhaWxpbmcgOmM6ZnVuYzpgbWFsbG9jYCBjYWxsIG11c3QgYmUgdHVybmVkIGludG8gYW4gZXhjZXB0aW9uIC0tLSB0aGUKK2RpcmVjdCBjYWxsZXIgb2YgOmM6ZnVuYzpgbWFsbG9jYCAob3IgOmM6ZnVuYzpgcmVhbGxvY2ApIG11c3QgY2FsbAorOmM6ZnVuYzpgUHlFcnJfTm9NZW1vcnlgIGFuZCByZXR1cm4gYSBmYWlsdXJlIGluZGljYXRvciBpdHNlbGYuICBBbGwgdGhlCitvYmplY3QtY3JlYXRpbmcgZnVuY3Rpb25zIChmb3IgZXhhbXBsZSwgOmM6ZnVuYzpgUHlJbnRfRnJvbUxvbmdgKSBhbHJlYWR5IGRvCit0aGlzLCBzbyB0aGlzIG5vdGUgaXMgb25seSByZWxldmFudCB0byB0aG9zZSB3aG8gY2FsbCA6YzpmdW5jOmBtYWxsb2NgIGRpcmVjdGx5LgogCi1BbHNvIG5vdGUgdGhhdCwgd2l0aCB0aGUgaW1wb3J0YW50IGV4Y2VwdGlvbiBvZiA6Y2Z1bmM6YFB5QXJnX1BhcnNlVHVwbGVgIGFuZAorQWxzbyBub3RlIHRoYXQsIHdpdGggdGhlIGltcG9ydGFudCBleGNlcHRpb24gb2YgOmM6ZnVuYzpgUHlBcmdfUGFyc2VUdXBsZWAgYW5kCiBmcmllbmRzLCBmdW5jdGlvbnMgdGhhdCByZXR1cm4gYW4gaW50ZWdlciBzdGF0dXMgdXN1YWxseSByZXR1cm4gYSBwb3NpdGl2ZSB2YWx1ZQogb3IgemVybyBmb3Igc3VjY2VzcyBhbmQgYGAtMWBgIGZvciBmYWlsdXJlLCBsaWtlIFVuaXggc3lzdGVtIGNhbGxzLgogCi1GaW5hbGx5LCBiZSBjYXJlZnVsIHRvIGNsZWFuIHVwIGdhcmJhZ2UgKGJ5IG1ha2luZyA6Y2Z1bmM6YFB5X1hERUNSRUZgIG9yCi06Y2Z1bmM6YFB5X0RFQ1JFRmAgY2FsbHMgZm9yIG9iamVjdHMgeW91IGhhdmUgYWxyZWFkeSBjcmVhdGVkKSB3aGVuIHlvdSByZXR1cm4KK0ZpbmFsbHksIGJlIGNhcmVmdWwgdG8gY2xlYW4gdXAgZ2FyYmFnZSAoYnkgbWFraW5nIDpjOmZ1bmM6YFB5X1hERUNSRUZgIG9yCis6YzpmdW5jOmBQeV9ERUNSRUZgIGNhbGxzIGZvciBvYmplY3RzIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZCkgd2hlbiB5b3UgcmV0dXJuCiBhbiBlcnJvciBpbmRpY2F0b3IhCiAKIFRoZSBjaG9pY2Ugb2Ygd2hpY2ggZXhjZXB0aW9uIHRvIHJhaXNlIGlzIGVudGlyZWx5IHlvdXJzLiAgVGhlcmUgYXJlIHByZWRlY2xhcmVkCiBDIG9iamVjdHMgY29ycmVzcG9uZGluZyB0byBhbGwgYnVpbHQtaW4gUHl0aG9uIGV4Y2VwdGlvbnMsIHN1Y2ggYXMKLTpjZGF0YTpgUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3JgLCB3aGljaCB5b3UgY2FuIHVzZSBkaXJlY3RseS4gT2YgY291cnNlLCB5b3UKLXNob3VsZCBjaG9vc2UgZXhjZXB0aW9ucyB3aXNlbHkgLS0tIGRvbid0IHVzZSA6Y2RhdGE6YFB5RXhjX1R5cGVFcnJvcmAgdG8gbWVhbgotdGhhdCBhIGZpbGUgY291bGRuJ3QgYmUgb3BlbmVkICh0aGF0IHNob3VsZCBwcm9iYWJseSBiZSA6Y2RhdGE6YFB5RXhjX0lPRXJyb3JgKS4KLUlmIHNvbWV0aGluZydzIHdyb25nIHdpdGggdGhlIGFyZ3VtZW50IGxpc3QsIHRoZSA6Y2Z1bmM6YFB5QXJnX1BhcnNlVHVwbGVgCi1mdW5jdGlvbiB1c3VhbGx5IHJhaXNlcyA6Y2RhdGE6YFB5RXhjX1R5cGVFcnJvcmAuICBJZiB5b3UgaGF2ZSBhbiBhcmd1bWVudCB3aG9zZQorOmM6ZGF0YTpgUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3JgLCB3aGljaCB5b3UgY2FuIHVzZSBkaXJlY3RseS4gT2YgY291cnNlLCB5b3UKK3Nob3VsZCBjaG9vc2UgZXhjZXB0aW9ucyB3aXNlbHkgLS0tIGRvbid0IHVzZSA6YzpkYXRhOmBQeUV4Y19UeXBlRXJyb3JgIHRvIG1lYW4KK3RoYXQgYSBmaWxlIGNvdWxkbid0IGJlIG9wZW5lZCAodGhhdCBzaG91bGQgcHJvYmFibHkgYmUgOmM6ZGF0YTpgUHlFeGNfSU9FcnJvcmApLgorSWYgc29tZXRoaW5nJ3Mgd3Jvbmcgd2l0aCB0aGUgYXJndW1lbnQgbGlzdCwgdGhlIDpjOmZ1bmM6YFB5QXJnX1BhcnNlVHVwbGVgCitmdW5jdGlvbiB1c3VhbGx5IHJhaXNlcyA6YzpkYXRhOmBQeUV4Y19UeXBlRXJyb3JgLiAgSWYgeW91IGhhdmUgYW4gYXJndW1lbnQgd2hvc2UKIHZhbHVlIG11c3QgYmUgaW4gYSBwYXJ0aWN1bGFyIHJhbmdlIG9yIG11c3Qgc2F0aXNmeSBvdGhlciBjb25kaXRpb25zLAotOmNkYXRhOmBQeUV4Y19WYWx1ZUVycm9yYCBpcyBhcHByb3ByaWF0ZS4KKzpjOmRhdGE6YFB5RXhjX1ZhbHVlRXJyb3JgIGlzIGFwcHJvcHJpYXRlLgogCiBZb3UgY2FuIGFsc28gZGVmaW5lIGEgbmV3IGV4Y2VwdGlvbiB0aGF0IGlzIHVuaXF1ZSB0byB5b3VyIG1vZHVsZS4gRm9yIHRoaXMsIHlvdQogdXN1YWxseSBkZWNsYXJlIGEgc3RhdGljIG9iamVjdCB2YXJpYWJsZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHlvdXIgZmlsZTo6CiAKICAgIHN0YXRpYyBQeU9iamVjdCAqU3BhbUVycm9yOwogCi1hbmQgaW5pdGlhbGl6ZSBpdCBpbiB5b3VyIG1vZHVsZSdzIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uICg6Y2Z1bmM6YGluaXRzcGFtYCkKK2FuZCBpbml0aWFsaXplIGl0IGluIHlvdXIgbW9kdWxlJ3MgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gKDpjOmZ1bmM6YGluaXRzcGFtYCkKIHdpdGggYW4gZXhjZXB0aW9uIG9iamVjdCAobGVhdmluZyBvdXQgdGhlIGVycm9yIGNoZWNraW5nIGZvciBub3cpOjoKIAogICAgUHlNT0RJTklUX0ZVTkMKQEAgLTIxNSwxNCArMjE1LDE0IEBACiAgICB9CiAKIE5vdGUgdGhhdCB0aGUgUHl0aG9uIG5hbWUgZm9yIHRoZSBleGNlcHRpb24gb2JqZWN0IGlzIDpleGM6YHNwYW0uZXJyb3JgLiAgVGhlCi06Y2Z1bmM6YFB5RXJyX05ld0V4Y2VwdGlvbmAgZnVuY3Rpb24gbWF5IGNyZWF0ZSBhIGNsYXNzIHdpdGggdGhlIGJhc2UgY2xhc3MKKzpjOmZ1bmM6YFB5RXJyX05ld0V4Y2VwdGlvbmAgZnVuY3Rpb24gbWF5IGNyZWF0ZSBhIGNsYXNzIHdpdGggdGhlIGJhc2UgY2xhc3MKIGJlaW5nIDpleGM6YEV4Y2VwdGlvbmAgKHVubGVzcyBhbm90aGVyIGNsYXNzIGlzIHBhc3NlZCBpbiBpbnN0ZWFkIG9mICpOVUxMKiksCiBkZXNjcmliZWQgaW4gOnJlZjpgYmx0aW4tZXhjZXB0aW9uc2AuCiAKLU5vdGUgYWxzbyB0aGF0IHRoZSA6Y2RhdGE6YFNwYW1FcnJvcmAgdmFyaWFibGUgcmV0YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgbmV3bHkKK05vdGUgYWxzbyB0aGF0IHRoZSA6YzpkYXRhOmBTcGFtRXJyb3JgIHZhcmlhYmxlIHJldGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIG5ld2x5CiBjcmVhdGVkIGV4Y2VwdGlvbiBjbGFzczsgdGhpcyBpcyBpbnRlbnRpb25hbCEgIFNpbmNlIHRoZSBleGNlcHRpb24gY291bGQgYmUKIHJlbW92ZWQgZnJvbSB0aGUgbW9kdWxlIGJ5IGV4dGVybmFsIGNvZGUsIGFuIG93bmVkIHJlZmVyZW5jZSB0byB0aGUgY2xhc3MgaXMKLW5lZWRlZCB0byBlbnN1cmUgdGhhdCBpdCB3aWxsIG5vdCBiZSBkaXNjYXJkZWQsIGNhdXNpbmcgOmNkYXRhOmBTcGFtRXJyb3JgIHRvCituZWVkZWQgdG8gZW5zdXJlIHRoYXQgaXQgd2lsbCBub3QgYmUgZGlzY2FyZGVkLCBjYXVzaW5nIDpjOmRhdGE6YFNwYW1FcnJvcmAgdG8KIGJlY29tZSBhIGRhbmdsaW5nIHBvaW50ZXIuIFNob3VsZCBpdCBiZWNvbWUgYSBkYW5nbGluZyBwb2ludGVyLCBDIGNvZGUgd2hpY2gKIHJhaXNlcyB0aGUgZXhjZXB0aW9uIGNvdWxkIGNhdXNlIGEgY29yZSBkdW1wIG9yIG90aGVyIHVuaW50ZW5kZWQgc2lkZSBlZmZlY3RzLgogCkBAIC0yMzAsNyArMjMwLDcgQEAKIHNhbXBsZS4KIAogVGhlIDpleGM6YHNwYW0uZXJyb3JgIGV4Y2VwdGlvbiBjYW4gYmUgcmFpc2VkIGluIHlvdXIgZXh0ZW5zaW9uIG1vZHVsZSB1c2luZyBhCi1jYWxsIHRvIDpjZnVuYzpgUHlFcnJfU2V0U3RyaW5nYCBhcyBzaG93biBiZWxvdzo6CitjYWxsIHRvIDpjOmZ1bmM6YFB5RXJyX1NldFN0cmluZ2AgYXMgc2hvd24gYmVsb3c6OgogCiAgICBzdGF0aWMgUHlPYmplY3QgKgogICAgc3BhbV9zeXN0ZW0oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQpAQCAtMjYyLDIyICsyNjIsMjIgQEAKIAogSXQgcmV0dXJucyAqTlVMTCogKHRoZSBlcnJvciBpbmRpY2F0b3IgZm9yIGZ1bmN0aW9ucyByZXR1cm5pbmcgb2JqZWN0IHBvaW50ZXJzKQogaWYgYW4gZXJyb3IgaXMgZGV0ZWN0ZWQgaW4gdGhlIGFyZ3VtZW50IGxpc3QsIHJlbHlpbmcgb24gdGhlIGV4Y2VwdGlvbiBzZXQgYnkKLTpjZnVuYzpgUHlBcmdfUGFyc2VUdXBsZWAuICBPdGhlcndpc2UgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgYXJndW1lbnQgaGFzIGJlZW4KLWNvcGllZCB0byB0aGUgbG9jYWwgdmFyaWFibGUgOmNkYXRhOmBjb21tYW5kYC4gIFRoaXMgaXMgYSBwb2ludGVyIGFzc2lnbm1lbnQgYW5kCis6YzpmdW5jOmBQeUFyZ19QYXJzZVR1cGxlYC4gIE90aGVyd2lzZSB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBhcmd1bWVudCBoYXMgYmVlbgorY29waWVkIHRvIHRoZSBsb2NhbCB2YXJpYWJsZSA6YzpkYXRhOmBjb21tYW5kYC4gIFRoaXMgaXMgYSBwb2ludGVyIGFzc2lnbm1lbnQgYW5kCiB5b3UgYXJlIG5vdCBzdXBwb3NlZCB0byBtb2RpZnkgdGhlIHN0cmluZyB0byB3aGljaCBpdCBwb2ludHMgKHNvIGluIFN0YW5kYXJkIEMsCi10aGUgdmFyaWFibGUgOmNkYXRhOmBjb21tYW5kYCBzaG91bGQgcHJvcGVybHkgYmUgZGVjbGFyZWQgYXMgYGBjb25zdCBjaGFyCit0aGUgdmFyaWFibGUgOmM6ZGF0YTpgY29tbWFuZGAgc2hvdWxkIHByb3Blcmx5IGJlIGRlY2xhcmVkIGFzIGBgY29uc3QgY2hhcgogKmNvbW1hbmRgYCkuCiAKLVRoZSBuZXh0IHN0YXRlbWVudCBpcyBhIGNhbGwgdG8gdGhlIFVuaXggZnVuY3Rpb24gOmNmdW5jOmBzeXN0ZW1gLCBwYXNzaW5nIGl0Ci10aGUgc3RyaW5nIHdlIGp1c3QgZ290IGZyb20gOmNmdW5jOmBQeUFyZ19QYXJzZVR1cGxlYDo6CitUaGUgbmV4dCBzdGF0ZW1lbnQgaXMgYSBjYWxsIHRvIHRoZSBVbml4IGZ1bmN0aW9uIDpjOmZ1bmM6YHN5c3RlbWAsIHBhc3NpbmcgaXQKK3RoZSBzdHJpbmcgd2UganVzdCBnb3QgZnJvbSA6YzpmdW5jOmBQeUFyZ19QYXJzZVR1cGxlYDo6CiAKICAgIHN0cyA9IHN5c3RlbShjb21tYW5kKTsKIAotT3VyIDpmdW5jOmBzcGFtLnN5c3RlbWAgZnVuY3Rpb24gbXVzdCByZXR1cm4gdGhlIHZhbHVlIG9mIDpjZGF0YTpgc3RzYCBhcyBhCi1QeXRob24gb2JqZWN0LiAgVGhpcyBpcyBkb25lIHVzaW5nIHRoZSBmdW5jdGlvbiA6Y2Z1bmM6YFB5X0J1aWxkVmFsdWVgLCB3aGljaCBpcwotc29tZXRoaW5nIGxpa2UgdGhlIGludmVyc2Ugb2YgOmNmdW5jOmBQeUFyZ19QYXJzZVR1cGxlYDogaXQgdGFrZXMgYSBmb3JtYXQKK091ciA6ZnVuYzpgc3BhbS5zeXN0ZW1gIGZ1bmN0aW9uIG11c3QgcmV0dXJuIHRoZSB2YWx1ZSBvZiA6YzpkYXRhOmBzdHNgIGFzIGEKK1B5dGhvbiBvYmplY3QuICBUaGlzIGlzIGRvbmUgdXNpbmcgdGhlIGZ1bmN0aW9uIDpjOmZ1bmM6YFB5X0J1aWxkVmFsdWVgLCB3aGljaCBpcworc29tZXRoaW5nIGxpa2UgdGhlIGludmVyc2Ugb2YgOmM6ZnVuYzpgUHlBcmdfUGFyc2VUdXBsZWA6IGl0IHRha2VzIGEgZm9ybWF0CiBzdHJpbmcgYW5kIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgQyB2YWx1ZXMsIGFuZCByZXR1cm5zIGEgbmV3IFB5dGhvbiBvYmplY3QuCi1Nb3JlIGluZm8gb24gOmNmdW5jOmBQeV9CdWlsZFZhbHVlYCBpcyBnaXZlbiBsYXRlci4gOjoKK01vcmUgaW5mbyBvbiA6YzpmdW5jOmBQeV9CdWlsZFZhbHVlYCBpcyBnaXZlbiBsYXRlci4gOjoKIAogICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdHMpOwogCkBAIC0yODUsMTQgKzI4NSwxNCBAQAogb24gdGhlIGhlYXAgaW4gUHl0aG9uISkKIAogSWYgeW91IGhhdmUgYSBDIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBubyB1c2VmdWwgYXJndW1lbnQgKGEgZnVuY3Rpb24gcmV0dXJuaW5nCi06Y3R5cGU6YHZvaWRgKSwgdGhlIGNvcnJlc3BvbmRpbmcgUHl0aG9uIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGBgTm9uZWBgLiAgIFlvdQotbmVlZCB0aGlzIGlkaW9tIHRvIGRvIHNvICh3aGljaCBpcyBpbXBsZW1lbnRlZCBieSB0aGUgOmNtYWNybzpgUHlfUkVUVVJOX05PTkVgCis6Yzp0eXBlOmB2b2lkYCksIHRoZSBjb3JyZXNwb25kaW5nIFB5dGhvbiBmdW5jdGlvbiBtdXN0IHJldHVybiBgYE5vbmVgYC4gICBZb3UKK25lZWQgdGhpcyBpZGlvbSB0byBkbyBzbyAod2hpY2ggaXMgaW1wbGVtZW50ZWQgYnkgdGhlIDpjOm1hY3JvOmBQeV9SRVRVUk5fTk9ORWAKIG1hY3JvKTo6CiAKICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgIHJldHVybiBQeV9Ob25lOwogCi06Y2RhdGE6YFB5X05vbmVgIGlzIHRoZSBDIG5hbWUgZm9yIHRoZSBzcGVjaWFsIFB5dGhvbiBvYmplY3QgYGBOb25lYGAuICBJdCBpcyBhCis6YzpkYXRhOmBQeV9Ob25lYCBpcyB0aGUgQyBuYW1lIGZvciB0aGUgc3BlY2lhbCBQeXRob24gb2JqZWN0IGBgTm9uZWBgLiAgSXQgaXMgYQogZ2VudWluZSBQeXRob24gb2JqZWN0IHJhdGhlciB0aGFuIGEgKk5VTEwqIHBvaW50ZXIsIHdoaWNoIG1lYW5zICJlcnJvciIgaW4gbW9zdAogY29udGV4dHMsIGFzIHdlIGhhdmUgc2Vlbi4KIApAQCAtMzAyLDcgKzMwMiw3IEBACiBUaGUgTW9kdWxlJ3MgTWV0aG9kIFRhYmxlIGFuZCBJbml0aWFsaXphdGlvbiBGdW5jdGlvbgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotSSBwcm9taXNlZCB0byBzaG93IGhvdyA6Y2Z1bmM6YHNwYW1fc3lzdGVtYCBpcyBjYWxsZWQgZnJvbSBQeXRob24gcHJvZ3JhbXMuCitJIHByb21pc2VkIHRvIHNob3cgaG93IDpjOmZ1bmM6YHNwYW1fc3lzdGVtYCBpcyBjYWxsZWQgZnJvbSBQeXRob24gcHJvZ3JhbXMuCiBGaXJzdCwgd2UgbmVlZCB0byBsaXN0IGl0cyBuYW1lIGFuZCBhZGRyZXNzIGluIGEgIm1ldGhvZCB0YWJsZSI6OgogCiAgICBzdGF0aWMgUHlNZXRob2REZWYgU3BhbU1ldGhvZHNbXSA9IHsKQEAgLTMxNiwyMSArMzE2LDIxIEBACiBOb3RlIHRoZSB0aGlyZCBlbnRyeSAoYGBNRVRIX1ZBUkFSR1NgYCkuICBUaGlzIGlzIGEgZmxhZyB0ZWxsaW5nIHRoZSBpbnRlcnByZXRlcgogdGhlIGNhbGxpbmcgY29udmVudGlvbiB0byBiZSB1c2VkIGZvciB0aGUgQyBmdW5jdGlvbi4gIEl0IHNob3VsZCBub3JtYWxseSBhbHdheXMKIGJlIGBgTUVUSF9WQVJBUkdTYGAgb3IgYGBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTYGA7IGEgdmFsdWUgb2YgYGAwYGAgbWVhbnMKLXRoYXQgYW4gb2Jzb2xldGUgdmFyaWFudCBvZiA6Y2Z1bmM6YFB5QXJnX1BhcnNlVHVwbGVgIGlzIHVzZWQuCit0aGF0IGFuIG9ic29sZXRlIHZhcmlhbnQgb2YgOmM6ZnVuYzpgUHlBcmdfUGFyc2VUdXBsZWAgaXMgdXNlZC4KIAogV2hlbiB1c2luZyBvbmx5IGBgTUVUSF9WQVJBUkdTYGAsIHRoZSBmdW5jdGlvbiBzaG91bGQgZXhwZWN0IHRoZSBQeXRob24tbGV2ZWwKIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIGluIGFzIGEgdHVwbGUgYWNjZXB0YWJsZSBmb3IgcGFyc2luZyB2aWEKLTpjZnVuYzpgUHlBcmdfUGFyc2VUdXBsZWA7IG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBmdW5jdGlvbiBpcyBwcm92aWRlZCBiZWxvdy4KKzpjOmZ1bmM6YFB5QXJnX1BhcnNlVHVwbGVgOyBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgZnVuY3Rpb24gaXMgcHJvdmlkZWQgYmVsb3cuCiAKIFRoZSA6Y29uc3Q6YE1FVEhfS0VZV09SRFNgIGJpdCBtYXkgYmUgc2V0IGluIHRoZSB0aGlyZCBmaWVsZCBpZiBrZXl3b3JkCiBhcmd1bWVudHMgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uICBJbiB0aGlzIGNhc2UsIHRoZSBDIGZ1bmN0aW9uIHNob3VsZAogYWNjZXB0IGEgdGhpcmQgYGBQeU9iamVjdCAqYGAgcGFyYW1ldGVyIHdoaWNoIHdpbGwgYmUgYSBkaWN0aW9uYXJ5IG9mIGtleXdvcmRzLgotVXNlIDpjZnVuYzpgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzYCB0byBwYXJzZSB0aGUgYXJndW1lbnRzIHRvIHN1Y2ggYQorVXNlIDpjOmZ1bmM6YFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc2AgdG8gcGFyc2UgdGhlIGFyZ3VtZW50cyB0byBzdWNoIGEKIGZ1bmN0aW9uLgogCiBUaGUgbWV0aG9kIHRhYmxlIG11c3QgYmUgcGFzc2VkIHRvIHRoZSBpbnRlcnByZXRlciBpbiB0aGUgbW9kdWxlJ3MKIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLiAgVGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIG11c3QgYmUgbmFtZWQKLTpjZnVuYzpgaW5pdG5hbWVgLCB3aGVyZSAqbmFtZSogaXMgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSwgYW5kIHNob3VsZCBiZSB0aGUKKzpjOmZ1bmM6YGluaXRuYW1lYCwgd2hlcmUgKm5hbWUqIGlzIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUsIGFuZCBzaG91bGQgYmUgdGhlCiBvbmx5IG5vbi1cIGBgc3RhdGljYGAgaXRlbSBkZWZpbmVkIGluIHRoZSBtb2R1bGUgZmlsZTo6CiAKICAgIFB5TU9ESU5JVF9GVU5DCkBAIC0zNDQsMjEgKzM0NCwyMSBAQAogZGVjbGFyZXMgdGhlIGZ1bmN0aW9uIGFzIGBgZXh0ZXJuICJDImBgLgogCiBXaGVuIHRoZSBQeXRob24gcHJvZ3JhbSBpbXBvcnRzIG1vZHVsZSA6bW9kOmBzcGFtYCBmb3IgdGhlIGZpcnN0IHRpbWUsCi06Y2Z1bmM6YGluaXRzcGFtYCBpcyBjYWxsZWQuIChTZWUgYmVsb3cgZm9yIGNvbW1lbnRzIGFib3V0IGVtYmVkZGluZyBQeXRob24uKQotSXQgY2FsbHMgOmNmdW5jOmBQeV9Jbml0TW9kdWxlYCwgd2hpY2ggY3JlYXRlcyBhICJtb2R1bGUgb2JqZWN0IiAod2hpY2ggaXMKKzpjOmZ1bmM6YGluaXRzcGFtYCBpcyBjYWxsZWQuIChTZWUgYmVsb3cgZm9yIGNvbW1lbnRzIGFib3V0IGVtYmVkZGluZyBQeXRob24uKQorSXQgY2FsbHMgOmM6ZnVuYzpgUHlfSW5pdE1vZHVsZWAsIHdoaWNoIGNyZWF0ZXMgYSAibW9kdWxlIG9iamVjdCIgKHdoaWNoIGlzCiBpbnNlcnRlZCBpbiB0aGUgZGljdGlvbmFyeSBgYHN5cy5tb2R1bGVzYGAgdW5kZXIgdGhlIGtleSBgYCJzcGFtImBgKSwgYW5kCiBpbnNlcnRzIGJ1aWx0LWluIGZ1bmN0aW9uIG9iamVjdHMgaW50byB0aGUgbmV3bHkgY3JlYXRlZCBtb2R1bGUgYmFzZWQgdXBvbiB0aGUKLXRhYmxlIChhbiBhcnJheSBvZiA6Y3R5cGU6YFB5TWV0aG9kRGVmYCBzdHJ1Y3R1cmVzKSB0aGF0IHdhcyBwYXNzZWQgYXMgaXRzCi1zZWNvbmQgYXJndW1lbnQuIDpjZnVuYzpgUHlfSW5pdE1vZHVsZWAgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG1vZHVsZSBvYmplY3QKK3RhYmxlIChhbiBhcnJheSBvZiA6Yzp0eXBlOmBQeU1ldGhvZERlZmAgc3RydWN0dXJlcykgdGhhdCB3YXMgcGFzc2VkIGFzIGl0cworc2Vjb25kIGFyZ3VtZW50LiA6YzpmdW5jOmBQeV9Jbml0TW9kdWxlYCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbW9kdWxlIG9iamVjdAogdGhhdCBpdCBjcmVhdGVzICh3aGljaCBpcyB1bnVzZWQgaGVyZSkuICBJdCBtYXkgYWJvcnQgd2l0aCBhIGZhdGFsIGVycm9yIGZvcgogY2VydGFpbiBlcnJvcnMsIG9yIHJldHVybiAqTlVMTCogaWYgdGhlIG1vZHVsZSBjb3VsZCBub3QgYmUgaW5pdGlhbGl6ZWQKIHNhdGlzZmFjdG9yaWx5LgogCi1XaGVuIGVtYmVkZGluZyBQeXRob24sIHRoZSA6Y2Z1bmM6YGluaXRzcGFtYCBmdW5jdGlvbiBpcyBub3QgY2FsbGVkCi1hdXRvbWF0aWNhbGx5IHVubGVzcyB0aGVyZSdzIGFuIGVudHJ5IGluIHRoZSA6Y2RhdGE6YF9QeUltcG9ydF9Jbml0dGFiYCB0YWJsZS4KK1doZW4gZW1iZWRkaW5nIFB5dGhvbiwgdGhlIDpjOmZ1bmM6YGluaXRzcGFtYCBmdW5jdGlvbiBpcyBub3QgY2FsbGVkCithdXRvbWF0aWNhbGx5IHVubGVzcyB0aGVyZSdzIGFuIGVudHJ5IGluIHRoZSA6YzpkYXRhOmBfUHlJbXBvcnRfSW5pdHRhYmAgdGFibGUuCiBUaGUgZWFzaWVzdCB3YXkgdG8gaGFuZGxlIHRoaXMgaXMgdG8gc3RhdGljYWxseSBpbml0aWFsaXplIHlvdXIKLXN0YXRpY2FsbHktbGlua2VkIG1vZHVsZXMgYnkgZGlyZWN0bHkgY2FsbGluZyA6Y2Z1bmM6YGluaXRzcGFtYCBhZnRlciB0aGUgY2FsbAotdG8gOmNmdW5jOmBQeV9Jbml0aWFsaXplYDo6CitzdGF0aWNhbGx5LWxpbmtlZCBtb2R1bGVzIGJ5IGRpcmVjdGx5IGNhbGxpbmcgOmM6ZnVuYzpgaW5pdHNwYW1gIGFmdGVyIHRoZSBjYWxsCit0byA6YzpmdW5jOmBQeV9Jbml0aWFsaXplYDo6CiAKICAgIGludAogICAgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQpAQCAtMzcyLDE4ICszNzIsMjAgQEAKICAgICAgICAvKiBBZGQgYSBzdGF0aWMgbW9kdWxlICovCiAgICAgICAgaW5pdHNwYW0oKTsKIAorICAgICAgIC4uLgorCiBBbiBleGFtcGxlIG1heSBiZSBmb3VuZCBpbiB0aGUgZmlsZSA6ZmlsZTpgRGVtby9lbWJlZC9kZW1vLmNgIGluIHRoZSBQeXRob24KIHNvdXJjZSBkaXN0cmlidXRpb24uCiAKIC4uIG5vdGU6OgogCiAgICBSZW1vdmluZyBlbnRyaWVzIGZyb20gYGBzeXMubW9kdWxlc2BgIG9yIGltcG9ydGluZyBjb21waWxlZCBtb2R1bGVzIGludG8KLSAgIG11bHRpcGxlIGludGVycHJldGVycyB3aXRoaW4gYSBwcm9jZXNzIChvciBmb2xsb3dpbmcgYSA6Y2Z1bmM6YGZvcmtgIHdpdGhvdXQgYW4KLSAgIGludGVydmVuaW5nIDpjZnVuYzpgZXhlY2ApIGNhbiBjcmVhdGUgcHJvYmxlbXMgZm9yIHNvbWUgZXh0ZW5zaW9uIG1vZHVsZXMuCisgICBtdWx0aXBsZSBpbnRlcnByZXRlcnMgd2l0aGluIGEgcHJvY2VzcyAob3IgZm9sbG93aW5nIGEgOmM6ZnVuYzpgZm9ya2Agd2l0aG91dCBhbgorICAgaW50ZXJ2ZW5pbmcgOmM6ZnVuYzpgZXhlY2ApIGNhbiBjcmVhdGUgcHJvYmxlbXMgZm9yIHNvbWUgZXh0ZW5zaW9uIG1vZHVsZXMuCiAgICBFeHRlbnNpb24gbW9kdWxlIGF1dGhvcnMgc2hvdWxkIGV4ZXJjaXNlIGNhdXRpb24gd2hlbiBpbml0aWFsaXppbmcgaW50ZXJuYWwgZGF0YQogICAgc3RydWN0dXJlcy4gTm90ZSBhbHNvIHRoYXQgdGhlIDpmdW5jOmByZWxvYWRgIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHdpdGgKICAgIGV4dGVuc2lvbiBtb2R1bGVzLCBhbmQgd2lsbCBjYWxsIHRoZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KLSAgICg6Y2Z1bmM6YGluaXRzcGFtYCBpbiB0aGUgZXhhbXBsZSksIGJ1dCB3aWxsIG5vdCBsb2FkIHRoZSBtb2R1bGUgYWdhaW4gaWYgaXQgd2FzCisgICAoOmM6ZnVuYzpgaW5pdHNwYW1gIGluIHRoZSBleGFtcGxlKSwgYnV0IHdpbGwgbm90IGxvYWQgdGhlIG1vZHVsZSBhZ2FpbiBpZiBpdCB3YXMKICAgIGxvYWRlZCBmcm9tIGEgZHluYW1pY2FsbHkgbG9hZGFibGUgb2JqZWN0IGZpbGUgKDpmaWxlOmAuc29gIG9uIFVuaXgsCiAgICA6ZmlsZTpgLmRsbGAgb24gV2luZG93cykuCiAKQEAgLTQ0Nyw3ICs0NDksNyBAQAogQ2FsbGluZyBhIFB5dGhvbiBmdW5jdGlvbiBpcyBlYXN5LiAgRmlyc3QsIHRoZSBQeXRob24gcHJvZ3JhbSBtdXN0IHNvbWVob3cgcGFzcwogeW91IHRoZSBQeXRob24gZnVuY3Rpb24gb2JqZWN0LiAgWW91IHNob3VsZCBwcm92aWRlIGEgZnVuY3Rpb24gKG9yIHNvbWUgb3RoZXIKIGludGVyZmFjZSkgdG8gZG8gdGhpcy4gIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIHNhdmUgYSBwb2ludGVyIHRvIHRoZQotUHl0aG9uIGZ1bmN0aW9uIG9iamVjdCAoYmUgY2FyZWZ1bCB0byA6Y2Z1bmM6YFB5X0lOQ1JFRmAgaXQhKSBpbiBhIGdsb2JhbAorUHl0aG9uIGZ1bmN0aW9uIG9iamVjdCAoYmUgY2FyZWZ1bCB0byA6YzpmdW5jOmBQeV9JTkNSRUZgIGl0ISkgaW4gYSBnbG9iYWwKIHZhcmlhYmxlIC0tLSBvciB3aGVyZXZlciB5b3Ugc2VlIGZpdC4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gbWlnaHQKIGJlIHBhcnQgb2YgYSBtb2R1bGUgZGVmaW5pdGlvbjo6CiAKQEAgLTQ3NiwxMCArNDc4LDEwIEBACiAKIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggdGhlIGludGVycHJldGVyIHVzaW5nIHRoZQogOmNvbnN0OmBNRVRIX1ZBUkFSR1NgIGZsYWc7IHRoaXMgaXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gOnJlZjpgbWV0aG9kdGFibGVgLiAgVGhlCi06Y2Z1bmM6YFB5QXJnX1BhcnNlVHVwbGVgIGZ1bmN0aW9uIGFuZCBpdHMgYXJndW1lbnRzIGFyZSBkb2N1bWVudGVkIGluIHNlY3Rpb24KKzpjOmZ1bmM6YFB5QXJnX1BhcnNlVHVwbGVgIGZ1bmN0aW9uIGFuZCBpdHMgYXJndW1lbnRzIGFyZSBkb2N1bWVudGVkIGluIHNlY3Rpb24KIDpyZWY6YHBhcnNldHVwbGVgLgogCi1UaGUgbWFjcm9zIDpjZnVuYzpgUHlfWElOQ1JFRmAgYW5kIDpjZnVuYzpgUHlfWERFQ1JFRmAgaW5jcmVtZW50L2RlY3JlbWVudCB0aGUKK1RoZSBtYWNyb3MgOmM6ZnVuYzpgUHlfWElOQ1JFRmAgYW5kIDpjOmZ1bmM6YFB5X1hERUNSRUZgIGluY3JlbWVudC9kZWNyZW1lbnQgdGhlCiByZWZlcmVuY2UgY291bnQgb2YgYW4gb2JqZWN0IGFuZCBhcmUgc2FmZSBpbiB0aGUgcHJlc2VuY2Ugb2YgKk5VTEwqIHBvaW50ZXJzCiAoYnV0IG5vdGUgdGhhdCAqdGVtcCogd2lsbCBub3QgYmUgICpOVUxMKiBpbiB0aGlzIGNvbnRleHQpLiAgTW9yZSBpbmZvIG9uIHRoZW0KIGluIHNlY3Rpb24gOnJlZjpgcmVmY291bnRzYC4KQEAgLTQ4NywxMiArNDg5LDEyIEBACiAuLiBpbmRleDo6IHNpbmdsZTogUHlPYmplY3RfQ2FsbE9iamVjdCgpCiAKIExhdGVyLCB3aGVuIGl0IGlzIHRpbWUgdG8gY2FsbCB0aGUgZnVuY3Rpb24sIHlvdSBjYWxsIHRoZSBDIGZ1bmN0aW9uCi06Y2Z1bmM6YFB5T2JqZWN0X0NhbGxPYmplY3RgLiAgVGhpcyBmdW5jdGlvbiBoYXMgdHdvIGFyZ3VtZW50cywgYm90aCBwb2ludGVycyB0bworOmM6ZnVuYzpgUHlPYmplY3RfQ2FsbE9iamVjdGAuICBUaGlzIGZ1bmN0aW9uIGhhcyB0d28gYXJndW1lbnRzLCBib3RoIHBvaW50ZXJzIHRvCiBhcmJpdHJhcnkgUHl0aG9uIG9iamVjdHM6IHRoZSBQeXRob24gZnVuY3Rpb24sIGFuZCB0aGUgYXJndW1lbnQgbGlzdC4gIFRoZQogYXJndW1lbnQgbGlzdCBtdXN0IGFsd2F5cyBiZSBhIHR1cGxlIG9iamVjdCwgd2hvc2UgbGVuZ3RoIGlzIHRoZSBudW1iZXIgb2YKIGFyZ3VtZW50cy4gIFRvIGNhbGwgdGhlIFB5dGhvbiBmdW5jdGlvbiB3aXRoIG5vIGFyZ3VtZW50cywgcGFzcyBpbiBOVUxMLCBvcgogYW4gZW1wdHkgdHVwbGU7IHRvIGNhbGwgaXQgd2l0aCBvbmUgYXJndW1lbnQsIHBhc3MgYSBzaW5nbGV0b24gdHVwbGUuCi06Y2Z1bmM6YFB5X0J1aWxkVmFsdWVgIHJldHVybnMgYSB0dXBsZSB3aGVuIGl0cyBmb3JtYXQgc3RyaW5nIGNvbnNpc3RzIG9mIHplcm8KKzpjOmZ1bmM6YFB5X0J1aWxkVmFsdWVgIHJldHVybnMgYSB0dXBsZSB3aGVuIGl0cyBmb3JtYXQgc3RyaW5nIGNvbnNpc3RzIG9mIHplcm8KIG9yIG1vcmUgZm9ybWF0IGNvZGVzIGJldHdlZW4gcGFyZW50aGVzZXMuICBGb3IgZXhhbXBsZTo6CiAKICAgIGludCBhcmc7CkBAIC01MDYsMjUgKzUwOCwyNSBAQAogICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE9iamVjdChteV9jYWxsYmFjaywgYXJnbGlzdCk7CiAgICBQeV9ERUNSRUYoYXJnbGlzdCk7CiAKLTpjZnVuYzpgUHlPYmplY3RfQ2FsbE9iamVjdGAgcmV0dXJucyBhIFB5dGhvbiBvYmplY3QgcG9pbnRlcjogdGhpcyBpcyB0aGUgcmV0dXJuCi12YWx1ZSBvZiB0aGUgUHl0aG9uIGZ1bmN0aW9uLiAgOmNmdW5jOmBQeU9iamVjdF9DYWxsT2JqZWN0YCBpcworOmM6ZnVuYzpgUHlPYmplY3RfQ2FsbE9iamVjdGAgcmV0dXJucyBhIFB5dGhvbiBvYmplY3QgcG9pbnRlcjogdGhpcyBpcyB0aGUgcmV0dXJuCit2YWx1ZSBvZiB0aGUgUHl0aG9uIGZ1bmN0aW9uLiAgOmM6ZnVuYzpgUHlPYmplY3RfQ2FsbE9iamVjdGAgaXMKICJyZWZlcmVuY2UtY291bnQtbmV1dHJhbCIgd2l0aCByZXNwZWN0IHRvIGl0cyBhcmd1bWVudHMuICBJbiB0aGUgZXhhbXBsZSBhIG5ldwotdHVwbGUgd2FzIGNyZWF0ZWQgdG8gc2VydmUgYXMgdGhlIGFyZ3VtZW50IGxpc3QsIHdoaWNoIGlzIDpjZnVuYzpgUHlfREVDUkVGYFwKLS1lZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgY2FsbC4KK3R1cGxlIHdhcyBjcmVhdGVkIHRvIHNlcnZlIGFzIHRoZSBhcmd1bWVudCBsaXN0LCB3aGljaCBpcyA6YzpmdW5jOmBQeV9ERUNSRUZgXAorLWVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSA6YzpmdW5jOmBQeU9iamVjdF9DYWxsT2JqZWN0YCBjYWxsLgogCi1UaGUgcmV0dXJuIHZhbHVlIG9mIDpjZnVuYzpgUHlPYmplY3RfQ2FsbE9iamVjdGAgaXMgIm5ldyI6IGVpdGhlciBpdCBpcyBhIGJyYW5kCitUaGUgcmV0dXJuIHZhbHVlIG9mIDpjOmZ1bmM6YFB5T2JqZWN0X0NhbGxPYmplY3RgIGlzICJuZXciOiBlaXRoZXIgaXQgaXMgYSBicmFuZAogbmV3IG9iamVjdCwgb3IgaXQgaXMgYW4gZXhpc3Rpbmcgb2JqZWN0IHdob3NlIHJlZmVyZW5jZSBjb3VudCBoYXMgYmVlbgogaW5jcmVtZW50ZWQuICBTbywgdW5sZXNzIHlvdSB3YW50IHRvIHNhdmUgaXQgaW4gYSBnbG9iYWwgdmFyaWFibGUsIHlvdSBzaG91bGQKLXNvbWVob3cgOmNmdW5jOmBQeV9ERUNSRUZgIHRoZSByZXN1bHQsIGV2ZW4gKGVzcGVjaWFsbHkhKSBpZiB5b3UgYXJlIG5vdAorc29tZWhvdyA6YzpmdW5jOmBQeV9ERUNSRUZgIHRoZSByZXN1bHQsIGV2ZW4gKGVzcGVjaWFsbHkhKSBpZiB5b3UgYXJlIG5vdAogaW50ZXJlc3RlZCBpbiBpdHMgdmFsdWUuCiAKIEJlZm9yZSB5b3UgZG8gdGhpcywgaG93ZXZlciwgaXQgaXMgaW1wb3J0YW50IHRvIGNoZWNrIHRoYXQgdGhlIHJldHVybiB2YWx1ZQogaXNuJ3QgKk5VTEwqLiAgSWYgaXQgaXMsIHRoZSBQeXRob24gZnVuY3Rpb24gdGVybWluYXRlZCBieSByYWlzaW5nIGFuIGV4Y2VwdGlvbi4KLUlmIHRoZSBDIGNvZGUgdGhhdCBjYWxsZWQgOmNmdW5jOmBQeU9iamVjdF9DYWxsT2JqZWN0YCBpcyBjYWxsZWQgZnJvbSBQeXRob24sIGl0CitJZiB0aGUgQyBjb2RlIHRoYXQgY2FsbGVkIDpjOmZ1bmM6YFB5T2JqZWN0X0NhbGxPYmplY3RgIGlzIGNhbGxlZCBmcm9tIFB5dGhvbiwgaXQKIHNob3VsZCBub3cgcmV0dXJuIGFuIGVycm9yIGluZGljYXRpb24gdG8gaXRzIFB5dGhvbiBjYWxsZXIsIHNvIHRoZSBpbnRlcnByZXRlcgogY2FuIHByaW50IGEgc3RhY2sgdHJhY2UsIG9yIHRoZSBjYWxsaW5nIFB5dGhvbiBjb2RlIGNhbiBoYW5kbGUgdGhlIGV4Y2VwdGlvbi4KIElmIHRoaXMgaXMgbm90IHBvc3NpYmxlIG9yIGRlc2lyYWJsZSwgdGhlIGV4Y2VwdGlvbiBzaG91bGQgYmUgY2xlYXJlZCBieSBjYWxsaW5nCi06Y2Z1bmM6YFB5RXJyX0NsZWFyYC4gIEZvciBleGFtcGxlOjoKKzpjOmZ1bmM6YFB5RXJyX0NsZWFyYC4gIEZvciBleGFtcGxlOjoKIAogICAgaWYgKHJlc3VsdCA9PSBOVUxMKQogICAgICAgIHJldHVybiBOVUxMOyAvKiBQYXNzIGVycm9yIGJhY2sgKi8KQEAgLTUzMiwxMiArNTM0LDEyIEBACiAgICBQeV9ERUNSRUYocmVzdWx0KTsKIAogRGVwZW5kaW5nIG9uIHRoZSBkZXNpcmVkIGludGVyZmFjZSB0byB0aGUgUHl0aG9uIGNhbGxiYWNrIGZ1bmN0aW9uLCB5b3UgbWF5IGFsc28KLWhhdmUgdG8gcHJvdmlkZSBhbiBhcmd1bWVudCBsaXN0IHRvIDpjZnVuYzpgUHlPYmplY3RfQ2FsbE9iamVjdGAuICBJbiBzb21lIGNhc2VzCitoYXZlIHRvIHByb3ZpZGUgYW4gYXJndW1lbnQgbGlzdCB0byA6YzpmdW5jOmBQeU9iamVjdF9DYWxsT2JqZWN0YC4gIEluIHNvbWUgY2FzZXMKIHRoZSBhcmd1bWVudCBsaXN0IGlzIGFsc28gcHJvdmlkZWQgYnkgdGhlIFB5dGhvbiBwcm9ncmFtLCB0aHJvdWdoIHRoZSBzYW1lCiBpbnRlcmZhY2UgdGhhdCBzcGVjaWZpZWQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLiAgSXQgY2FuIHRoZW4gYmUgc2F2ZWQgYW5kIHVzZWQKIGluIHRoZSBzYW1lIG1hbm5lciBhcyB0aGUgZnVuY3Rpb24gb2JqZWN0LiAgSW4gb3RoZXIgY2FzZXMsIHlvdSBtYXkgaGF2ZSB0bwogY29uc3RydWN0IGEgbmV3IHR1cGxlIHRvIHBhc3MgYXMgdGhlIGFyZ3VtZW50IGxpc3QuICBUaGUgc2ltcGxlc3Qgd2F5IHRvIGRvIHRoaXMKLWlzIHRvIGNhbGwgOmNmdW5jOmBQeV9CdWlsZFZhbHVlYC4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBwYXNzIGFuIGludGVncmFsCitpcyB0byBjYWxsIDpjOmZ1bmM6YFB5X0J1aWxkVmFsdWVgLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHBhc3MgYW4gaW50ZWdyYWwKIGV2ZW50IGNvZGUsIHlvdSBtaWdodCB1c2UgdGhlIGZvbGxvd2luZyBjb2RlOjoKIAogICAgUHlPYmplY3QgKmFyZ2xpc3Q7CkBAIC01NTIsMTEgKzU1NCwxMSBAQAogCiBOb3RlIHRoZSBwbGFjZW1lbnQgb2YgYGBQeV9ERUNSRUYoYXJnbGlzdClgYCBpbW1lZGlhdGVseSBhZnRlciB0aGUgY2FsbCwgYmVmb3JlCiB0aGUgZXJyb3IgY2hlY2shICBBbHNvIG5vdGUgdGhhdCBzdHJpY3RseSBzcGVha2luZyB0aGlzIGNvZGUgaXMgbm90IGNvbXBsZXRlOgotOmNmdW5jOmBQeV9CdWlsZFZhbHVlYCBtYXkgcnVuIG91dCBvZiBtZW1vcnksIGFuZCB0aGlzIHNob3VsZCBiZSBjaGVja2VkLgorOmM6ZnVuYzpgUHlfQnVpbGRWYWx1ZWAgbWF5IHJ1biBvdXQgb2YgbWVtb3J5LCBhbmQgdGhpcyBzaG91bGQgYmUgY2hlY2tlZC4KIAogWW91IG1heSBhbHNvIGNhbGwgYSBmdW5jdGlvbiB3aXRoIGtleXdvcmQgYXJndW1lbnRzIGJ5IHVzaW5nCi06Y2Z1bmM6YFB5T2JqZWN0X0NhbGxgLCB3aGljaCBzdXBwb3J0cyBhcmd1bWVudHMgYW5kIGtleXdvcmQgYXJndW1lbnRzLiAgQXMgaW4KLXRoZSBhYm92ZSBleGFtcGxlLCB3ZSB1c2UgOmNmdW5jOmBQeV9CdWlsZFZhbHVlYCB0byBjb25zdHJ1Y3QgdGhlIGRpY3Rpb25hcnkuIDo6Cis6YzpmdW5jOmBQeU9iamVjdF9DYWxsYCwgd2hpY2ggc3VwcG9ydHMgYXJndW1lbnRzIGFuZCBrZXl3b3JkIGFyZ3VtZW50cy4gIEFzIGluCit0aGUgYWJvdmUgZXhhbXBsZSwgd2UgdXNlIDpjOmZ1bmM6YFB5X0J1aWxkVmFsdWVgIHRvIGNvbnN0cnVjdCB0aGUgZGljdGlvbmFyeS4gOjoKIAogICAgUHlPYmplY3QgKmRpY3Q7CiAgICAuLi4KQEAgLTU3Niw3ICs1NzgsNyBAQAogCiAuLiBpbmRleDo6IHNpbmdsZTogUHlBcmdfUGFyc2VUdXBsZSgpCiAKLVRoZSA6Y2Z1bmM6YFB5QXJnX1BhcnNlVHVwbGVgIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGFzIGZvbGxvd3M6OgorVGhlIDpjOmZ1bmM6YFB5QXJnX1BhcnNlVHVwbGVgIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGFzIGZvbGxvd3M6OgogCiAgICBpbnQgUHlBcmdfUGFyc2VUdXBsZShQeU9iamVjdCAqYXJnLCBjaGFyICpmb3JtYXQsIC4uLik7CiAKQEAgLTU4Niw3ICs1ODgsNyBAQAogTWFudWFsLiAgVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgbXVzdCBiZSBhZGRyZXNzZXMgb2YgdmFyaWFibGVzIHdob3NlIHR5cGUgaXMKIGRldGVybWluZWQgYnkgdGhlIGZvcm1hdCBzdHJpbmcuCiAKLU5vdGUgdGhhdCB3aGlsZSA6Y2Z1bmM6YFB5QXJnX1BhcnNlVHVwbGVgIGNoZWNrcyB0aGF0IHRoZSBQeXRob24gYXJndW1lbnRzIGhhdmUKK05vdGUgdGhhdCB3aGlsZSA6YzpmdW5jOmBQeUFyZ19QYXJzZVR1cGxlYCBjaGVja3MgdGhhdCB0aGUgUHl0aG9uIGFyZ3VtZW50cyBoYXZlCiB0aGUgcmVxdWlyZWQgdHlwZXMsIGl0IGNhbm5vdCBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIGFkZHJlc3NlcyBvZiBDIHZhcmlhYmxlcwogcGFzc2VkIHRvIHRoZSBjYWxsOiBpZiB5b3UgbWFrZSBtaXN0YWtlcyB0aGVyZSwgeW91ciBjb2RlIHdpbGwgcHJvYmFibHkgY3Jhc2ggb3IKIGF0IGxlYXN0IG92ZXJ3cml0ZSByYW5kb20gYml0cyBpbiBtZW1vcnkuICBTbyBiZSBjYXJlZnVsIQpAQCAtNjYzLDE3ICs2NjUsMTcgQEAKIAogLi4gaW5kZXg6OiBzaW5nbGU6IFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcygpCiAKLVRoZSA6Y2Z1bmM6YFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc2AgZnVuY3Rpb24gaXMgZGVjbGFyZWQgYXMgZm9sbG93czo6CitUaGUgOmM6ZnVuYzpgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzYCBmdW5jdGlvbiBpcyBkZWNsYXJlZCBhcyBmb2xsb3dzOjoKIAogICAgaW50IFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhQeU9iamVjdCAqYXJnLCBQeU9iamVjdCAqa3dkaWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmb3JtYXQsIGNoYXIgKmt3bGlzdFtdLCAuLi4pOwogCiBUaGUgKmFyZyogYW5kICpmb3JtYXQqIHBhcmFtZXRlcnMgYXJlIGlkZW50aWNhbCB0byB0aG9zZSBvZiB0aGUKLTpjZnVuYzpgUHlBcmdfUGFyc2VUdXBsZWAgZnVuY3Rpb24uICBUaGUgKmt3ZGljdCogcGFyYW1ldGVyIGlzIHRoZSBkaWN0aW9uYXJ5IG9mCis6YzpmdW5jOmBQeUFyZ19QYXJzZVR1cGxlYCBmdW5jdGlvbi4gIFRoZSAqa3dkaWN0KiBwYXJhbWV0ZXIgaXMgdGhlIGRpY3Rpb25hcnkgb2YKIGtleXdvcmRzIHJlY2VpdmVkIGFzIHRoZSB0aGlyZCBwYXJhbWV0ZXIgZnJvbSB0aGUgUHl0aG9uIHJ1bnRpbWUuICBUaGUgKmt3bGlzdCoKIHBhcmFtZXRlciBpcyBhICpOVUxMKi10ZXJtaW5hdGVkIGxpc3Qgb2Ygc3RyaW5ncyB3aGljaCBpZGVudGlmeSB0aGUgcGFyYW1ldGVyczsKIHRoZSBuYW1lcyBhcmUgbWF0Y2hlZCB3aXRoIHRoZSB0eXBlIGluZm9ybWF0aW9uIGZyb20gKmZvcm1hdCogZnJvbSBsZWZ0IHRvCi1yaWdodC4gIE9uIHN1Y2Nlc3MsIDpjZnVuYzpgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzYCByZXR1cm5zIHRydWUsIG90aGVyd2lzZQorcmlnaHQuICBPbiBzdWNjZXNzLCA6YzpmdW5jOmBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNgIHJldHVybnMgdHJ1ZSwgb3RoZXJ3aXNlCiBpdCByZXR1cm5zIGZhbHNlIGFuZCByYWlzZXMgYW4gYXBwcm9wcmlhdGUgZXhjZXB0aW9uLgogCiAuLiBub3RlOjoKQEAgLTczNywxOSArNzM5LDE5IEBACiBCdWlsZGluZyBBcmJpdHJhcnkgVmFsdWVzCiA9PT09PT09PT09PT09PT09PT09PT09PT09CiAKLVRoaXMgZnVuY3Rpb24gaXMgdGhlIGNvdW50ZXJwYXJ0IHRvIDpjZnVuYzpgUHlBcmdfUGFyc2VUdXBsZWAuICBJdCBpcyBkZWNsYXJlZAorVGhpcyBmdW5jdGlvbiBpcyB0aGUgY291bnRlcnBhcnQgdG8gOmM6ZnVuYzpgUHlBcmdfUGFyc2VUdXBsZWAuICBJdCBpcyBkZWNsYXJlZAogYXMgZm9sbG93czo6CiAKICAgIFB5T2JqZWN0ICpQeV9CdWlsZFZhbHVlKGNoYXIgKmZvcm1hdCwgLi4uKTsKIAogSXQgcmVjb2duaXplcyBhIHNldCBvZiBmb3JtYXQgdW5pdHMgc2ltaWxhciB0byB0aGUgb25lcyByZWNvZ25pemVkIGJ5Ci06Y2Z1bmM6YFB5QXJnX1BhcnNlVHVwbGVgLCBidXQgdGhlIGFyZ3VtZW50cyAod2hpY2ggYXJlIGlucHV0IHRvIHRoZSBmdW5jdGlvbiwKKzpjOmZ1bmM6YFB5QXJnX1BhcnNlVHVwbGVgLCBidXQgdGhlIGFyZ3VtZW50cyAod2hpY2ggYXJlIGlucHV0IHRvIHRoZSBmdW5jdGlvbiwKIG5vdCBvdXRwdXQpIG11c3Qgbm90IGJlIHBvaW50ZXJzLCBqdXN0IHZhbHVlcy4gIEl0IHJldHVybnMgYSBuZXcgUHl0aG9uIG9iamVjdCwKIHN1aXRhYmxlIGZvciByZXR1cm5pbmcgZnJvbSBhIEMgZnVuY3Rpb24gY2FsbGVkIGZyb20gUHl0aG9uLgogCi1PbmUgZGlmZmVyZW5jZSB3aXRoIDpjZnVuYzpgUHlBcmdfUGFyc2VUdXBsZWA6IHdoaWxlIHRoZSBsYXR0ZXIgcmVxdWlyZXMgaXRzCitPbmUgZGlmZmVyZW5jZSB3aXRoIDpjOmZ1bmM6YFB5QXJnX1BhcnNlVHVwbGVgOiB3aGlsZSB0aGUgbGF0dGVyIHJlcXVpcmVzIGl0cwogZmlyc3QgYXJndW1lbnQgdG8gYmUgYSB0dXBsZSAoc2luY2UgUHl0aG9uIGFyZ3VtZW50IGxpc3RzIGFyZSBhbHdheXMgcmVwcmVzZW50ZWQKLWFzIHR1cGxlcyBpbnRlcm5hbGx5KSwgOmNmdW5jOmBQeV9CdWlsZFZhbHVlYCBkb2VzIG5vdCBhbHdheXMgYnVpbGQgYSB0dXBsZS4gIEl0CithcyB0dXBsZXMgaW50ZXJuYWxseSksIDpjOmZ1bmM6YFB5X0J1aWxkVmFsdWVgIGRvZXMgbm90IGFsd2F5cyBidWlsZCBhIHR1cGxlLiAgSXQKIGJ1aWxkcyBhIHR1cGxlIG9ubHkgaWYgaXRzIGZvcm1hdCBzdHJpbmcgY29udGFpbnMgdHdvIG9yIG1vcmUgZm9ybWF0IHVuaXRzLiBJZgogdGhlIGZvcm1hdCBzdHJpbmcgaXMgZW1wdHksIGl0IHJldHVybnMgYGBOb25lYGA7IGlmIGl0IGNvbnRhaW5zIGV4YWN0bHkgb25lCiBmb3JtYXQgdW5pdCwgaXQgcmV0dXJucyB3aGF0ZXZlciBvYmplY3QgaXMgZGVzY3JpYmVkIGJ5IHRoYXQgZm9ybWF0IHVuaXQuICBUbwpAQCAtNzgxLDE4ICs3ODMsMTggQEAKIAogSW4gbGFuZ3VhZ2VzIGxpa2UgQyBvciBDKyssIHRoZSBwcm9ncmFtbWVyIGlzIHJlc3BvbnNpYmxlIGZvciBkeW5hbWljIGFsbG9jYXRpb24KIGFuZCBkZWFsbG9jYXRpb24gb2YgbWVtb3J5IG9uIHRoZSBoZWFwLiAgSW4gQywgdGhpcyBpcyBkb25lIHVzaW5nIHRoZSBmdW5jdGlvbnMKLTpjZnVuYzpgbWFsbG9jYCBhbmQgOmNmdW5jOmBmcmVlYC4gIEluIEMrKywgdGhlIG9wZXJhdG9ycyBgYG5ld2BgIGFuZAorOmM6ZnVuYzpgbWFsbG9jYCBhbmQgOmM6ZnVuYzpgZnJlZWAuICBJbiBDKyssIHRoZSBvcGVyYXRvcnMgYGBuZXdgYCBhbmQKIGBgZGVsZXRlYGAgYXJlIHVzZWQgd2l0aCBlc3NlbnRpYWxseSB0aGUgc2FtZSBtZWFuaW5nIGFuZCB3ZSdsbCByZXN0cmljdAogdGhlIGZvbGxvd2luZyBkaXNjdXNzaW9uIHRvIHRoZSBDIGNhc2UuCiAKLUV2ZXJ5IGJsb2NrIG9mIG1lbW9yeSBhbGxvY2F0ZWQgd2l0aCA6Y2Z1bmM6YG1hbGxvY2Agc2hvdWxkIGV2ZW50dWFsbHkgYmUKLXJldHVybmVkIHRvIHRoZSBwb29sIG9mIGF2YWlsYWJsZSBtZW1vcnkgYnkgZXhhY3RseSBvbmUgY2FsbCB0byA6Y2Z1bmM6YGZyZWVgLgotSXQgaXMgaW1wb3J0YW50IHRvIGNhbGwgOmNmdW5jOmBmcmVlYCBhdCB0aGUgcmlnaHQgdGltZS4gIElmIGEgYmxvY2sncyBhZGRyZXNzCi1pcyBmb3Jnb3R0ZW4gYnV0IDpjZnVuYzpgZnJlZWAgaXMgbm90IGNhbGxlZCBmb3IgaXQsIHRoZSBtZW1vcnkgaXQgb2NjdXBpZXMKK0V2ZXJ5IGJsb2NrIG9mIG1lbW9yeSBhbGxvY2F0ZWQgd2l0aCA6YzpmdW5jOmBtYWxsb2NgIHNob3VsZCBldmVudHVhbGx5IGJlCityZXR1cm5lZCB0byB0aGUgcG9vbCBvZiBhdmFpbGFibGUgbWVtb3J5IGJ5IGV4YWN0bHkgb25lIGNhbGwgdG8gOmM6ZnVuYzpgZnJlZWAuCitJdCBpcyBpbXBvcnRhbnQgdG8gY2FsbCA6YzpmdW5jOmBmcmVlYCBhdCB0aGUgcmlnaHQgdGltZS4gIElmIGEgYmxvY2sncyBhZGRyZXNzCitpcyBmb3Jnb3R0ZW4gYnV0IDpjOmZ1bmM6YGZyZWVgIGlzIG5vdCBjYWxsZWQgZm9yIGl0LCB0aGUgbWVtb3J5IGl0IG9jY3VwaWVzCiBjYW5ub3QgYmUgcmV1c2VkIHVudGlsIHRoZSBwcm9ncmFtIHRlcm1pbmF0ZXMuICBUaGlzIGlzIGNhbGxlZCBhIDpkZm46YG1lbW9yeQotbGVha2AuICBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgYSBwcm9ncmFtIGNhbGxzIDpjZnVuYzpgZnJlZWAgZm9yIGEgYmxvY2sgYW5kIHRoZW4KK2xlYWtgLiAgT24gdGhlIG90aGVyIGhhbmQsIGlmIGEgcHJvZ3JhbSBjYWxscyA6YzpmdW5jOmBmcmVlYCBmb3IgYSBibG9jayBhbmQgdGhlbgogY29udGludWVzIHRvIHVzZSB0aGUgYmxvY2ssIGl0IGNyZWF0ZXMgYSBjb25mbGljdCB3aXRoIHJlLXVzZSBvZiB0aGUgYmxvY2sKLXRocm91Z2ggYW5vdGhlciA6Y2Z1bmM6YG1hbGxvY2AgY2FsbC4gIFRoaXMgaXMgY2FsbGVkIDpkZm46YHVzaW5nIGZyZWVkIG1lbW9yeWAuCit0aHJvdWdoIGFub3RoZXIgOmM6ZnVuYzpgbWFsbG9jYCBjYWxsLiAgVGhpcyBpcyBjYWxsZWQgOmRmbjpgdXNpbmcgZnJlZWQgbWVtb3J5YC4KIEl0IGhhcyB0aGUgc2FtZSBiYWQgY29uc2VxdWVuY2VzIGFzIHJlZmVyZW5jaW5nIHVuaW5pdGlhbGl6ZWQgZGF0YSAtLS0gY29yZQogZHVtcHMsIHdyb25nIHJlc3VsdHMsIG15c3RlcmlvdXMgY3Jhc2hlcy4KIApAQCAtODA5LDcgKzgxMSw3IEBACiBpbXBvcnRhbnQgdG8gcHJldmVudCBsZWFrcyBmcm9tIGhhcHBlbmluZyBieSBoYXZpbmcgYSBjb2RpbmcgY29udmVudGlvbiBvcgogc3RyYXRlZ3kgdGhhdCBtaW5pbWl6ZXMgdGhpcyBraW5kIG9mIGVycm9ycy4KIAotU2luY2UgUHl0aG9uIG1ha2VzIGhlYXZ5IHVzZSBvZiA6Y2Z1bmM6YG1hbGxvY2AgYW5kIDpjZnVuYzpgZnJlZWAsIGl0IG5lZWRzIGEKK1NpbmNlIFB5dGhvbiBtYWtlcyBoZWF2eSB1c2Ugb2YgOmM6ZnVuYzpgbWFsbG9jYCBhbmQgOmM6ZnVuYzpgZnJlZWAsIGl0IG5lZWRzIGEKIHN0cmF0ZWd5IHRvIGF2b2lkIG1lbW9yeSBsZWFrcyBhcyB3ZWxsIGFzIHRoZSB1c2Ugb2YgZnJlZWQgbWVtb3J5LiAgVGhlIGNob3NlbgogbWV0aG9kIGlzIGNhbGxlZCA6ZGZuOmByZWZlcmVuY2UgY291bnRpbmdgLiAgVGhlIHByaW5jaXBsZSBpcyBzaW1wbGU6IGV2ZXJ5CiBvYmplY3QgY29udGFpbnMgYSBjb3VudGVyLCB3aGljaCBpcyBpbmNyZW1lbnRlZCB3aGVuIGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QKQEAgLTgyMSwxMSArODIzLDExIEBACiAoU29tZXRpbWVzLCByZWZlcmVuY2UgY291bnRpbmcgaXMgYWxzbyByZWZlcnJlZCB0byBhcyBhIGdhcmJhZ2UgY29sbGVjdGlvbgogc3RyYXRlZ3ksIGhlbmNlIG15IHVzZSBvZiAiYXV0b21hdGljIiB0byBkaXN0aW5ndWlzaCB0aGUgdHdvLikgIFRoZSBiaWcKIGFkdmFudGFnZSBvZiBhdXRvbWF0aWMgZ2FyYmFnZSBjb2xsZWN0aW9uIGlzIHRoYXQgdGhlIHVzZXIgZG9lc24ndCBuZWVkIHRvIGNhbGwKLTpjZnVuYzpgZnJlZWAgZXhwbGljaXRseS4gIChBbm90aGVyIGNsYWltZWQgYWR2YW50YWdlIGlzIGFuIGltcHJvdmVtZW50IGluIHNwZWVkCis6YzpmdW5jOmBmcmVlYCBleHBsaWNpdGx5LiAgKEFub3RoZXIgY2xhaW1lZCBhZHZhbnRhZ2UgaXMgYW4gaW1wcm92ZW1lbnQgaW4gc3BlZWQKIG9yIG1lbW9yeSB1c2FnZSAtLS0gdGhpcyBpcyBubyBoYXJkIGZhY3QgaG93ZXZlci4pICBUaGUgZGlzYWR2YW50YWdlIGlzIHRoYXQgZm9yCiBDLCB0aGVyZSBpcyBubyB0cnVseSBwb3J0YWJsZSBhdXRvbWF0aWMgZ2FyYmFnZSBjb2xsZWN0b3IsIHdoaWxlIHJlZmVyZW5jZQotY291bnRpbmcgY2FuIGJlIGltcGxlbWVudGVkIHBvcnRhYmx5IChhcyBsb25nIGFzIHRoZSBmdW5jdGlvbnMgOmNmdW5jOmBtYWxsb2NgCi1hbmQgOmNmdW5jOmBmcmVlYCBhcmUgYXZhaWxhYmxlIC0tLSB3aGljaCB0aGUgQyBTdGFuZGFyZCBndWFyYW50ZWVzKS4gTWF5YmUgc29tZQorY291bnRpbmcgY2FuIGJlIGltcGxlbWVudGVkIHBvcnRhYmx5IChhcyBsb25nIGFzIHRoZSBmdW5jdGlvbnMgOmM6ZnVuYzpgbWFsbG9jYAorYW5kIDpjOmZ1bmM6YGZyZWVgIGFyZSBhdmFpbGFibGUgLS0tIHdoaWNoIHRoZSBDIFN0YW5kYXJkIGd1YXJhbnRlZXMpLiBNYXliZSBzb21lCiBkYXkgYSBzdWZmaWNpZW50bHkgcG9ydGFibGUgYXV0b21hdGljIGdhcmJhZ2UgY29sbGVjdG9yIHdpbGwgYmUgYXZhaWxhYmxlIGZvciBDLgogVW50aWwgdGhlbiwgd2UnbGwgaGF2ZSB0byBsaXZlIHdpdGggcmVmZXJlbmNlIGNvdW50cy4KIApAQCAtODQzLDkgKzg0NSw5IEBACiBUaGUgY3ljbGUgZGV0ZWN0b3IgaXMgYWJsZSB0byBkZXRlY3QgZ2FyYmFnZSBjeWNsZXMgYW5kIGNhbiByZWNsYWltIHRoZW0gc28gbG9uZwogYXMgdGhlcmUgYXJlIG5vIGZpbmFsaXplcnMgaW1wbGVtZW50ZWQgaW4gUHl0aG9uICg6bWV0aDpgX19kZWxfX2AgbWV0aG9kcykuCiBXaGVuIHRoZXJlIGFyZSBzdWNoIGZpbmFsaXplcnMsIHRoZSBkZXRlY3RvciBleHBvc2VzIHRoZSBjeWNsZXMgdGhyb3VnaCB0aGUKLTptb2Q6YGdjYCBtb2R1bGUgKHNwZWNpZmljYWxseSwgdGhlCi1gYGdhcmJhZ2VgYCB2YXJpYWJsZSBpbiB0aGF0IG1vZHVsZSkuICBUaGUgOm1vZDpgZ2NgIG1vZHVsZSBhbHNvIGV4cG9zZXMgYSB3YXkKLXRvIHJ1biB0aGUgZGV0ZWN0b3IgKHRoZSA6ZnVuYzpgY29sbGVjdGAgZnVuY3Rpb24pLCBhcyB3ZWxsIGFzIGNvbmZpZ3VyYXRpb24KKzptb2Q6YGdjYCBtb2R1bGUgKHNwZWNpZmljYWxseSwgdGhlIDphdHRyOmB+Z2MuZ2FyYmFnZWAgdmFyaWFibGUgaW4gdGhhdCBtb2R1bGUpLgorVGhlIDptb2Q6YGdjYCBtb2R1bGUgYWxzbyBleHBvc2VzIGEgd2F5IHRvIHJ1biB0aGUgZGV0ZWN0b3IgKHRoZQorOmZ1bmM6YH5nYy5jb2xsZWN0YCBmdW5jdGlvbiksIGFzIHdlbGwgYXMgY29uZmlndXJhdGlvbgogaW50ZXJmYWNlcyBhbmQgdGhlIGFiaWxpdHkgdG8gZGlzYWJsZSB0aGUgZGV0ZWN0b3IgYXQgcnVudGltZS4gIFRoZSBjeWNsZQogZGV0ZWN0b3IgaXMgY29uc2lkZXJlZCBhbiBvcHRpb25hbCBjb21wb25lbnQ7IHRob3VnaCBpdCBpcyBpbmNsdWRlZCBieSBkZWZhdWx0LAogaXQgY2FuIGJlIGRpc2FibGVkIGF0IGJ1aWxkIHRpbWUgdXNpbmcgdGhlIDpvcHRpb246YC0td2l0aG91dC1jeWNsZS1nY2Agb3B0aW9uCkBAIC04NjEsOSArODYzLDkgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogVGhlcmUgYXJlIHR3byBtYWNyb3MsIGBgUHlfSU5DUkVGKHgpYGAgYW5kIGBgUHlfREVDUkVGKHgpYGAsIHdoaWNoIGhhbmRsZSB0aGUKLWluY3JlbWVudGluZyBhbmQgZGVjcmVtZW50aW5nIG9mIHRoZSByZWZlcmVuY2UgY291bnQuIDpjZnVuYzpgUHlfREVDUkVGYCBhbHNvCitpbmNyZW1lbnRpbmcgYW5kIGRlY3JlbWVudGluZyBvZiB0aGUgcmVmZXJlbmNlIGNvdW50LiA6YzpmdW5jOmBQeV9ERUNSRUZgIGFsc28KIGZyZWVzIHRoZSBvYmplY3Qgd2hlbiB0aGUgY291bnQgcmVhY2hlcyB6ZXJvLiBGb3IgZmxleGliaWxpdHksIGl0IGRvZXNuJ3QgY2FsbAotOmNmdW5jOmBmcmVlYCBkaXJlY3RseSAtLS0gcmF0aGVyLCBpdCBtYWtlcyBhIGNhbGwgdGhyb3VnaCBhIGZ1bmN0aW9uIHBvaW50ZXIgaW4KKzpjOmZ1bmM6YGZyZWVgIGRpcmVjdGx5IC0tLSByYXRoZXIsIGl0IG1ha2VzIGEgY2FsbCB0aHJvdWdoIGEgZnVuY3Rpb24gcG9pbnRlciBpbgogdGhlIG9iamVjdCdzIDpkZm46YHR5cGUgb2JqZWN0YC4gIEZvciB0aGlzIHB1cnBvc2UgKGFuZCBvdGhlcnMpLCBldmVyeSBvYmplY3QKIGFsc28gY29udGFpbnMgYSBwb2ludGVyIHRvIGl0cyB0eXBlIG9iamVjdC4KIApAQCAtODcxLDEzICs4NzMsMTMgQEAKIExldCdzIGZpcnN0IGludHJvZHVjZSBzb21lIHRlcm1zLiAgTm9ib2R5ICJvd25zIiBhbiBvYmplY3Q7IGhvd2V2ZXIsIHlvdSBjYW4KIDpkZm46YG93biBhIHJlZmVyZW5jZWAgdG8gYW4gb2JqZWN0LiAgQW4gb2JqZWN0J3MgcmVmZXJlbmNlIGNvdW50IGlzIG5vdyBkZWZpbmVkCiBhcyB0aGUgbnVtYmVyIG9mIG93bmVkIHJlZmVyZW5jZXMgdG8gaXQuICBUaGUgb3duZXIgb2YgYSByZWZlcmVuY2UgaXMKLXJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIDpjZnVuYzpgUHlfREVDUkVGYCB3aGVuIHRoZSByZWZlcmVuY2UgaXMgbm8gbG9uZ2VyCityZXNwb25zaWJsZSBmb3IgY2FsbGluZyA6YzpmdW5jOmBQeV9ERUNSRUZgIHdoZW4gdGhlIHJlZmVyZW5jZSBpcyBubyBsb25nZXIKIG5lZWRlZC4gIE93bmVyc2hpcCBvZiBhIHJlZmVyZW5jZSBjYW4gYmUgdHJhbnNmZXJyZWQuICBUaGVyZSBhcmUgdGhyZWUgd2F5cyB0bwotZGlzcG9zZSBvZiBhbiBvd25lZCByZWZlcmVuY2U6IHBhc3MgaXQgb24sIHN0b3JlIGl0LCBvciBjYWxsIDpjZnVuYzpgUHlfREVDUkVGYC4KK2Rpc3Bvc2Ugb2YgYW4gb3duZWQgcmVmZXJlbmNlOiBwYXNzIGl0IG9uLCBzdG9yZSBpdCwgb3IgY2FsbCA6YzpmdW5jOmBQeV9ERUNSRUZgLgogRm9yZ2V0dGluZyB0byBkaXNwb3NlIG9mIGFuIG93bmVkIHJlZmVyZW5jZSBjcmVhdGVzIGEgbWVtb3J5IGxlYWsuCiAKIEl0IGlzIGFsc28gcG9zc2libGUgdG8gOmRmbjpgYm9ycm93YCBbI11fIGEgcmVmZXJlbmNlIHRvIGFuIG9iamVjdC4gIFRoZQotYm9ycm93ZXIgb2YgYSByZWZlcmVuY2Ugc2hvdWxkIG5vdCBjYWxsIDpjZnVuYzpgUHlfREVDUkVGYC4gIFRoZSBib3Jyb3dlciBtdXN0Citib3Jyb3dlciBvZiBhIHJlZmVyZW5jZSBzaG91bGQgbm90IGNhbGwgOmM6ZnVuYzpgUHlfREVDUkVGYC4gIFRoZSBib3Jyb3dlciBtdXN0CiBub3QgaG9sZCBvbiB0byB0aGUgb2JqZWN0IGxvbmdlciB0aGFuIHRoZSBvd25lciBmcm9tIHdoaWNoIGl0IHdhcyBib3Jyb3dlZC4KIFVzaW5nIGEgYm9ycm93ZWQgcmVmZXJlbmNlIGFmdGVyIHRoZSBvd25lciBoYXMgZGlzcG9zZWQgb2YgaXQgcmlza3MgdXNpbmcgZnJlZWQKIG1lbW9yeSBhbmQgc2hvdWxkIGJlIGF2b2lkZWQgY29tcGxldGVseS4gWyNdXwpAQCAtODkxLDcgKzg5Myw3IEBACiBkaXNwb3NlZCBvZiBpdC4KIAogQSBib3Jyb3dlZCByZWZlcmVuY2UgY2FuIGJlIGNoYW5nZWQgaW50byBhbiBvd25lZCByZWZlcmVuY2UgYnkgY2FsbGluZwotOmNmdW5jOmBQeV9JTkNSRUZgLiAgVGhpcyBkb2VzIG5vdCBhZmZlY3QgdGhlIHN0YXR1cyBvZiB0aGUgb3duZXIgZnJvbSB3aGljaCB0aGUKKzpjOmZ1bmM6YFB5X0lOQ1JFRmAuICBUaGlzIGRvZXMgbm90IGFmZmVjdCB0aGUgc3RhdHVzIG9mIHRoZSBvd25lciBmcm9tIHdoaWNoIHRoZQogcmVmZXJlbmNlIHdhcyBib3Jyb3dlZCAtLS0gaXQgY3JlYXRlcyBhIG5ldyBvd25lZCByZWZlcmVuY2UsIGFuZCBnaXZlcyBmdWxsCiBvd25lciByZXNwb25zaWJpbGl0aWVzICh0aGUgbmV3IG93bmVyIG11c3QgZGlzcG9zZSBvZiB0aGUgcmVmZXJlbmNlIHByb3Blcmx5LCBhcwogd2VsbCBhcyB0aGUgcHJldmlvdXMgb3duZXIpLgpAQCAtOTA4LDM2ICs5MTAsMzYgQEAKIAogTW9zdCBmdW5jdGlvbnMgdGhhdCByZXR1cm4gYSByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IHBhc3Mgb24gb3duZXJzaGlwIHdpdGggdGhlCiByZWZlcmVuY2UuICBJbiBwYXJ0aWN1bGFyLCBhbGwgZnVuY3Rpb25zIHdob3NlIGZ1bmN0aW9uIGl0IGlzIHRvIGNyZWF0ZSBhIG5ldwotb2JqZWN0LCBzdWNoIGFzIDpjZnVuYzpgUHlJbnRfRnJvbUxvbmdgIGFuZCA6Y2Z1bmM6YFB5X0J1aWxkVmFsdWVgLCBwYXNzCitvYmplY3QsIHN1Y2ggYXMgOmM6ZnVuYzpgUHlJbnRfRnJvbUxvbmdgIGFuZCA6YzpmdW5jOmBQeV9CdWlsZFZhbHVlYCwgcGFzcwogb3duZXJzaGlwIHRvIHRoZSByZWNlaXZlci4gIEV2ZW4gaWYgdGhlIG9iamVjdCBpcyBub3QgYWN0dWFsbHkgbmV3LCB5b3Ugc3RpbGwKIHJlY2VpdmUgb3duZXJzaGlwIG9mIGEgbmV3IHJlZmVyZW5jZSB0byB0aGF0IG9iamVjdC4gIEZvciBpbnN0YW5jZSwKLTpjZnVuYzpgUHlJbnRfRnJvbUxvbmdgIG1haW50YWlucyBhIGNhY2hlIG9mIHBvcHVsYXIgdmFsdWVzIGFuZCBjYW4gcmV0dXJuIGEKKzpjOmZ1bmM6YFB5SW50X0Zyb21Mb25nYCBtYWludGFpbnMgYSBjYWNoZSBvZiBwb3B1bGFyIHZhbHVlcyBhbmQgY2FuIHJldHVybiBhCiByZWZlcmVuY2UgdG8gYSBjYWNoZWQgaXRlbS4KIAogTWFueSBmdW5jdGlvbnMgdGhhdCBleHRyYWN0IG9iamVjdHMgZnJvbSBvdGhlciBvYmplY3RzIGFsc28gdHJhbnNmZXIgb3duZXJzaGlwCi13aXRoIHRoZSByZWZlcmVuY2UsIGZvciBpbnN0YW5jZSA6Y2Z1bmM6YFB5T2JqZWN0X0dldEF0dHJTdHJpbmdgLiAgVGhlIHBpY3R1cmUKK3dpdGggdGhlIHJlZmVyZW5jZSwgZm9yIGluc3RhbmNlIDpjOmZ1bmM6YFB5T2JqZWN0X0dldEF0dHJTdHJpbmdgLiAgVGhlIHBpY3R1cmUKIGlzIGxlc3MgY2xlYXIsIGhlcmUsIGhvd2V2ZXIsIHNpbmNlIGEgZmV3IGNvbW1vbiByb3V0aW5lcyBhcmUgZXhjZXB0aW9uczoKLTpjZnVuYzpgUHlUdXBsZV9HZXRJdGVtYCwgOmNmdW5jOmBQeUxpc3RfR2V0SXRlbWAsIDpjZnVuYzpgUHlEaWN0X0dldEl0ZW1gLCBhbmQKLTpjZnVuYzpgUHlEaWN0X0dldEl0ZW1TdHJpbmdgIGFsbCByZXR1cm4gcmVmZXJlbmNlcyB0aGF0IHlvdSBib3Jyb3cgZnJvbSB0aGUKKzpjOmZ1bmM6YFB5VHVwbGVfR2V0SXRlbWAsIDpjOmZ1bmM6YFB5TGlzdF9HZXRJdGVtYCwgOmM6ZnVuYzpgUHlEaWN0X0dldEl0ZW1gLCBhbmQKKzpjOmZ1bmM6YFB5RGljdF9HZXRJdGVtU3RyaW5nYCBhbGwgcmV0dXJuIHJlZmVyZW5jZXMgdGhhdCB5b3UgYm9ycm93IGZyb20gdGhlCiB0dXBsZSwgbGlzdCBvciBkaWN0aW9uYXJ5LgogCi1UaGUgZnVuY3Rpb24gOmNmdW5jOmBQeUltcG9ydF9BZGRNb2R1bGVgIGFsc28gcmV0dXJucyBhIGJvcnJvd2VkIHJlZmVyZW5jZSwgZXZlbgorVGhlIGZ1bmN0aW9uIDpjOmZ1bmM6YFB5SW1wb3J0X0FkZE1vZHVsZWAgYWxzbyByZXR1cm5zIGEgYm9ycm93ZWQgcmVmZXJlbmNlLCBldmVuCiB0aG91Z2ggaXQgbWF5IGFjdHVhbGx5IGNyZWF0ZSB0aGUgb2JqZWN0IGl0IHJldHVybnM6IHRoaXMgaXMgcG9zc2libGUgYmVjYXVzZSBhbgogb3duZWQgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgaXMgc3RvcmVkIGluIGBgc3lzLm1vZHVsZXNgYC4KIAogV2hlbiB5b3UgcGFzcyBhbiBvYmplY3QgcmVmZXJlbmNlIGludG8gYW5vdGhlciBmdW5jdGlvbiwgaW4gZ2VuZXJhbCwgdGhlCiBmdW5jdGlvbiBib3Jyb3dzIHRoZSByZWZlcmVuY2UgZnJvbSB5b3UgLS0tIGlmIGl0IG5lZWRzIHRvIHN0b3JlIGl0LCBpdCB3aWxsIHVzZQotOmNmdW5jOmBQeV9JTkNSRUZgIHRvIGJlY29tZSBhbiBpbmRlcGVuZGVudCBvd25lci4gIFRoZXJlIGFyZSBleGFjdGx5IHR3bwotaW1wb3J0YW50IGV4Y2VwdGlvbnMgdG8gdGhpcyBydWxlOiA6Y2Z1bmM6YFB5VHVwbGVfU2V0SXRlbWAgYW5kCi06Y2Z1bmM6YFB5TGlzdF9TZXRJdGVtYC4gIFRoZXNlIGZ1bmN0aW9ucyB0YWtlIG92ZXIgb3duZXJzaGlwIG9mIHRoZSBpdGVtIHBhc3NlZAotdG8gdGhlbSAtLS0gZXZlbiBpZiB0aGV5IGZhaWwhICAoTm90ZSB0aGF0IDpjZnVuYzpgUHlEaWN0X1NldEl0ZW1gIGFuZCBmcmllbmRzCis6YzpmdW5jOmBQeV9JTkNSRUZgIHRvIGJlY29tZSBhbiBpbmRlcGVuZGVudCBvd25lci4gIFRoZXJlIGFyZSBleGFjdGx5IHR3bworaW1wb3J0YW50IGV4Y2VwdGlvbnMgdG8gdGhpcyBydWxlOiA6YzpmdW5jOmBQeVR1cGxlX1NldEl0ZW1gIGFuZAorOmM6ZnVuYzpgUHlMaXN0X1NldEl0ZW1gLiAgVGhlc2UgZnVuY3Rpb25zIHRha2Ugb3ZlciBvd25lcnNoaXAgb2YgdGhlIGl0ZW0gcGFzc2VkCit0byB0aGVtIC0tLSBldmVuIGlmIHRoZXkgZmFpbCEgIChOb3RlIHRoYXQgOmM6ZnVuYzpgUHlEaWN0X1NldEl0ZW1gIGFuZCBmcmllbmRzCiBkb24ndCB0YWtlIG92ZXIgb3duZXJzaGlwIC0tLSB0aGV5IGFyZSAibm9ybWFsLiIpCiAKIFdoZW4gYSBDIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIFB5dGhvbiwgaXQgYm9ycm93cyByZWZlcmVuY2VzIHRvIGl0cyBhcmd1bWVudHMKIGZyb20gdGhlIGNhbGxlci4gIFRoZSBjYWxsZXIgb3ducyBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0LCBzbyB0aGUgYm9ycm93ZWQKIHJlZmVyZW5jZSdzIGxpZmV0aW1lIGlzIGd1YXJhbnRlZWQgdW50aWwgdGhlIGZ1bmN0aW9uIHJldHVybnMuICBPbmx5IHdoZW4gc3VjaCBhCiBib3Jyb3dlZCByZWZlcmVuY2UgbXVzdCBiZSBzdG9yZWQgb3IgcGFzc2VkIG9uLCBpdCBtdXN0IGJlIHR1cm5lZCBpbnRvIGFuIG93bmVkCi1yZWZlcmVuY2UgYnkgY2FsbGluZyA6Y2Z1bmM6YFB5X0lOQ1JFRmAuCityZWZlcmVuY2UgYnkgY2FsbGluZyA6YzpmdW5jOmBQeV9JTkNSRUZgLgogCiBUaGUgb2JqZWN0IHJlZmVyZW5jZSByZXR1cm5lZCBmcm9tIGEgQyBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBmcm9tIFB5dGhvbiBtdXN0CiBiZSBhbiBvd25lZCByZWZlcmVuY2UgLS0tIG93bmVyc2hpcCBpcyB0cmFuc2ZlcnJlZCBmcm9tIHRoZSBmdW5jdGlvbiB0byBpdHMKQEAgLTk1Myw3ICs5NTUsNyBAQAogY2FuIGxlYWQgdG8gcHJvYmxlbXMuICBUaGVzZSBhbGwgaGF2ZSB0byBkbyB3aXRoIGltcGxpY2l0IGludm9jYXRpb25zIG9mIHRoZQogaW50ZXJwcmV0ZXIsIHdoaWNoIGNhbiBjYXVzZSB0aGUgb3duZXIgb2YgYSByZWZlcmVuY2UgdG8gZGlzcG9zZSBvZiBpdC4KIAotVGhlIGZpcnN0IGFuZCBtb3N0IGltcG9ydGFudCBjYXNlIHRvIGtub3cgYWJvdXQgaXMgdXNpbmcgOmNmdW5jOmBQeV9ERUNSRUZgIG9uCitUaGUgZmlyc3QgYW5kIG1vc3QgaW1wb3J0YW50IGNhc2UgdG8ga25vdyBhYm91dCBpcyB1c2luZyA6YzpmdW5jOmBQeV9ERUNSRUZgIG9uCiBhbiB1bnJlbGF0ZWQgb2JqZWN0IHdoaWxlIGJvcnJvd2luZyBhIHJlZmVyZW5jZSB0byBhIGxpc3QgaXRlbS4gIEZvciBpbnN0YW5jZTo6CiAKICAgIHZvaWQKQEAgLTk2OSw3ICs5NzEsNyBAQAogYGBsaXN0WzFdYGAgd2l0aCB0aGUgdmFsdWUgYGAwYGAsIGFuZCBmaW5hbGx5IHByaW50cyB0aGUgYm9ycm93ZWQgcmVmZXJlbmNlLgogTG9va3MgaGFybWxlc3MsIHJpZ2h0PyAgQnV0IGl0J3Mgbm90IQogCi1MZXQncyBmb2xsb3cgdGhlIGNvbnRyb2wgZmxvdyBpbnRvIDpjZnVuYzpgUHlMaXN0X1NldEl0ZW1gLiAgVGhlIGxpc3Qgb3ducworTGV0J3MgZm9sbG93IHRoZSBjb250cm9sIGZsb3cgaW50byA6YzpmdW5jOmBQeUxpc3RfU2V0SXRlbWAuICBUaGUgbGlzdCBvd25zCiByZWZlcmVuY2VzIHRvIGFsbCBpdHMgaXRlbXMsIHNvIHdoZW4gaXRlbSAxIGlzIHJlcGxhY2VkLCBpdCBoYXMgdG8gZGlzcG9zZSBvZgogdGhlIG9yaWdpbmFsIGl0ZW0gMS4gIE5vdyBsZXQncyBzdXBwb3NlIHRoZSBvcmlnaW5hbCBpdGVtIDEgd2FzIGFuIGluc3RhbmNlIG9mIGEKIHVzZXItZGVmaW5lZCBjbGFzcywgYW5kIGxldCdzIGZ1cnRoZXIgc3VwcG9zZSB0aGF0IHRoZSBjbGFzcyBkZWZpbmVkIGEKQEAgLTk3OCw4ICs5ODAsOCBAQAogCiBTaW5jZSBpdCBpcyB3cml0dGVuIGluIFB5dGhvbiwgdGhlIDptZXRoOmBfX2RlbF9fYCBtZXRob2QgY2FuIGV4ZWN1dGUgYXJiaXRyYXJ5CiBQeXRob24gY29kZS4gIENvdWxkIGl0IHBlcmhhcHMgZG8gc29tZXRoaW5nIHRvIGludmFsaWRhdGUgdGhlIHJlZmVyZW5jZSB0bwotYGBpdGVtYGAgaW4gOmNmdW5jOmBidWdgPyAgWW91IGJldCEgIEFzc3VtaW5nIHRoYXQgdGhlIGxpc3QgcGFzc2VkIGludG8KLTpjZnVuYzpgYnVnYCBpcyBhY2Nlc3NpYmxlIHRvIHRoZSA6bWV0aDpgX19kZWxfX2AgbWV0aG9kLCBpdCBjb3VsZCBleGVjdXRlIGEKK2BgaXRlbWBgIGluIDpjOmZ1bmM6YGJ1Z2A/ICBZb3UgYmV0ISAgQXNzdW1pbmcgdGhhdCB0aGUgbGlzdCBwYXNzZWQgaW50bworOmM6ZnVuYzpgYnVnYCBpcyBhY2Nlc3NpYmxlIHRvIHRoZSA6bWV0aDpgX19kZWxfX2AgbWV0aG9kLCBpdCBjb3VsZCBleGVjdXRlIGEKIHN0YXRlbWVudCB0byB0aGUgZWZmZWN0IG9mIGBgZGVsIGxpc3RbMF1gYCwgYW5kIGFzc3VtaW5nIHRoaXMgd2FzIHRoZSBsYXN0CiByZWZlcmVuY2UgdG8gdGhhdCBvYmplY3QsIGl0IHdvdWxkIGZyZWUgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggaXQsIHRoZXJlYnkKIGludmFsaWRhdGluZyBgYGl0ZW1gYC4KQEAgLTEwMDYsOCArMTAwOCw4IEBACiB0aHJlYWRzLiAgTm9ybWFsbHksIG11bHRpcGxlIHRocmVhZHMgaW4gdGhlIFB5dGhvbiBpbnRlcnByZXRlciBjYW4ndCBnZXQgaW4gZWFjaAogb3RoZXIncyB3YXksIGJlY2F1c2UgdGhlcmUgaXMgYSBnbG9iYWwgbG9jayBwcm90ZWN0aW5nIFB5dGhvbidzIGVudGlyZSBvYmplY3QKIHNwYWNlLiAgSG93ZXZlciwgaXQgaXMgcG9zc2libGUgdG8gdGVtcG9yYXJpbHkgcmVsZWFzZSB0aGlzIGxvY2sgdXNpbmcgdGhlIG1hY3JvCi06Y21hY3JvOmBQeV9CRUdJTl9BTExPV19USFJFQURTYCwgYW5kIHRvIHJlLWFjcXVpcmUgaXQgdXNpbmcKLTpjbWFjcm86YFB5X0VORF9BTExPV19USFJFQURTYC4gIFRoaXMgaXMgY29tbW9uIGFyb3VuZCBibG9ja2luZyBJL08gY2FsbHMsIHRvCis6YzptYWNybzpgUHlfQkVHSU5fQUxMT1dfVEhSRUFEU2AsIGFuZCB0byByZS1hY3F1aXJlIGl0IHVzaW5nCis6YzptYWNybzpgUHlfRU5EX0FMTE9XX1RIUkVBRFNgLiAgVGhpcyBpcyBjb21tb24gYXJvdW5kIGJsb2NraW5nIEkvTyBjYWxscywgdG8KIGxldCBvdGhlciB0aHJlYWRzIHVzZSB0aGUgcHJvY2Vzc29yIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBJL08gdG8gY29tcGxldGUuCiBPYnZpb3VzbHksIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaGFzIHRoZSBzYW1lIHByb2JsZW0gYXMgdGhlIHByZXZpb3VzIG9uZTo6CiAKQEAgLTEwMzYsMTEgKzEwMzgsMTEgQEAKIHJlZHVuZGFudCB0ZXN0cyBhbmQgdGhlIGNvZGUgd291bGQgcnVuIG1vcmUgc2xvd2x5LgogCiBJdCBpcyBiZXR0ZXIgdG8gdGVzdCBmb3IgKk5VTEwqIG9ubHkgYXQgdGhlICJzb3VyY2U6IiB3aGVuIGEgcG9pbnRlciB0aGF0IG1heSBiZQotKk5VTEwqIGlzIHJlY2VpdmVkLCBmb3IgZXhhbXBsZSwgZnJvbSA6Y2Z1bmM6YG1hbGxvY2Agb3IgZnJvbSBhIGZ1bmN0aW9uIHRoYXQKKypOVUxMKiBpcyByZWNlaXZlZCwgZm9yIGV4YW1wbGUsIGZyb20gOmM6ZnVuYzpgbWFsbG9jYCBvciBmcm9tIGEgZnVuY3Rpb24gdGhhdAogbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbi4KIAotVGhlIG1hY3JvcyA6Y2Z1bmM6YFB5X0lOQ1JFRmAgYW5kIDpjZnVuYzpgUHlfREVDUkVGYCBkbyBub3QgY2hlY2sgZm9yICpOVUxMKgotcG9pbnRlcnMgLS0tIGhvd2V2ZXIsIHRoZWlyIHZhcmlhbnRzIDpjZnVuYzpgUHlfWElOQ1JFRmAgYW5kIDpjZnVuYzpgUHlfWERFQ1JFRmAKK1RoZSBtYWNyb3MgOmM6ZnVuYzpgUHlfSU5DUkVGYCBhbmQgOmM6ZnVuYzpgUHlfREVDUkVGYCBkbyBub3QgY2hlY2sgZm9yICpOVUxMKgorcG9pbnRlcnMgLS0tIGhvd2V2ZXIsIHRoZWlyIHZhcmlhbnRzIDpjOmZ1bmM6YFB5X1hJTkNSRUZgIGFuZCA6YzpmdW5jOmBQeV9YREVDUkVGYAogZG8uCiAKIFRoZSBtYWNyb3MgZm9yIGNoZWNraW5nIGZvciBhIHBhcnRpY3VsYXIgb2JqZWN0IHR5cGUgKGBgUHl0eXBlX0NoZWNrKClgYCkgZG9uJ3QKQEAgLTExMTQsNyArMTExNiw3IEBACiAKIFB5dGhvbiBwcm92aWRlcyBhIHNwZWNpYWwgbWVjaGFuaXNtIHRvIHBhc3MgQy1sZXZlbCBpbmZvcm1hdGlvbiAocG9pbnRlcnMpIGZyb20KIG9uZSBleHRlbnNpb24gbW9kdWxlIHRvIGFub3RoZXIgb25lOiBDYXBzdWxlcy4gQSBDYXBzdWxlIGlzIGEgUHl0aG9uIGRhdGEgdHlwZQotd2hpY2ggc3RvcmVzIGEgcG9pbnRlciAoOmN0eXBlOmB2b2lkIFwqYCkuICBDYXBzdWxlcyBjYW4gb25seSBiZSBjcmVhdGVkIGFuZAord2hpY2ggc3RvcmVzIGEgcG9pbnRlciAoOmM6dHlwZTpgdm9pZCBcKmApLiAgQ2Fwc3VsZXMgY2FuIG9ubHkgYmUgY3JlYXRlZCBhbmQKIGFjY2Vzc2VkIHZpYSB0aGVpciBDIEFQSSwgYnV0IHRoZXkgY2FuIGJlIHBhc3NlZCBhcm91bmQgbGlrZSBhbnkgb3RoZXIgUHl0aG9uCiBvYmplY3QuIEluIHBhcnRpY3VsYXIsICB0aGV5IGNhbiBiZSBhc3NpZ25lZCB0byBhIG5hbWUgaW4gYW4gZXh0ZW5zaW9uIG1vZHVsZSdzCiBuYW1lc3BhY2UuIE90aGVyIGV4dGVuc2lvbiBtb2R1bGVzIGNhbiB0aGVuIGltcG9ydCB0aGlzIG1vZHVsZSwgcmV0cmlldmUgdGhlCkBAIC0xMTI3LDggKzExMjksOCBAQAogZGlmZmVyZW50IHdheXMgYmV0d2VlbiB0aGUgbW9kdWxlIHByb3ZpZGluZyB0aGUgY29kZSBhbmQgdGhlIGNsaWVudCBtb2R1bGVzLgogCiBXaGljaGV2ZXIgbWV0aG9kIHlvdSBjaG9vc2UsIGl0J3MgaW1wb3J0YW50IHRvIG5hbWUgeW91ciBDYXBzdWxlcyBwcm9wZXJseS4KLVRoZSBmdW5jdGlvbiA6Y2Z1bmM6YFB5Q2Fwc3VsZV9OZXdgIHRha2VzIGEgbmFtZSBwYXJhbWV0ZXIKLSg6Y3R5cGU6YGNvbnN0IGNoYXIgXCpgKTsgeW91J3JlIHBlcm1pdHRlZCB0byBwYXNzIGluIGEgKk5VTEwqIG5hbWUsIGJ1dAorVGhlIGZ1bmN0aW9uIDpjOmZ1bmM6YFB5Q2Fwc3VsZV9OZXdgIHRha2VzIGEgbmFtZSBwYXJhbWV0ZXIKKyg6Yzp0eXBlOmBjb25zdCBjaGFyIFwqYCk7IHlvdSdyZSBwZXJtaXR0ZWQgdG8gcGFzcyBpbiBhICpOVUxMKiBuYW1lLCBidXQKIHdlIHN0cm9uZ2x5IGVuY291cmFnZSB5b3UgdG8gc3BlY2lmeSBhIG5hbWUuICBQcm9wZXJseSBuYW1lZCBDYXBzdWxlcyBwcm92aWRlCiBhIGRlZ3JlZSBvZiBydW50aW1lIHR5cGUtc2FmZXR5OyB0aGVyZSBpcyBubyBmZWFzaWJsZSB3YXkgdG8gdGVsbCBvbmUgdW5uYW1lZAogQ2Fwc3VsZSBmcm9tIGFub3RoZXIuCkBAIC0xMTM4LDcgKzExNDAsNyBAQAogCiAgICAgbW9kdWxlbmFtZS5hdHRyaWJ1dGVuYW1lCiAKLVRoZSBjb252ZW5pZW5jZSBmdW5jdGlvbiA6Y2Z1bmM6YFB5Q2Fwc3VsZV9JbXBvcnRgIG1ha2VzIGl0IGVhc3kgdG8KK1RoZSBjb252ZW5pZW5jZSBmdW5jdGlvbiA6YzpmdW5jOmBQeUNhcHN1bGVfSW1wb3J0YCBtYWtlcyBpdCBlYXN5IHRvCiBsb2FkIGEgQyBBUEkgcHJvdmlkZWQgdmlhIGEgQ2Fwc3VsZSwgYnV0IG9ubHkgaWYgdGhlIENhcHN1bGUncyBuYW1lCiBtYXRjaGVzIHRoaXMgY29udmVudGlvbi4gIFRoaXMgYmVoYXZpb3IgZ2l2ZXMgQyBBUEkgdXNlcnMgYSBoaWdoIGRlZ3JlZQogb2YgY2VydGFpbnR5IHRoYXQgdGhlIENhcHN1bGUgdGhleSBsb2FkIGNvbnRhaW5zIHRoZSBjb3JyZWN0IEMgQVBJLgpAQCAtMTE0NiwxOSArMTE0OCwxOSBAQAogVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlbW9uc3RyYXRlcyBhbiBhcHByb2FjaCB0aGF0IHB1dHMgbW9zdCBvZiB0aGUgYnVyZGVuIG9uCiB0aGUgd3JpdGVyIG9mIHRoZSBleHBvcnRpbmcgbW9kdWxlLCB3aGljaCBpcyBhcHByb3ByaWF0ZSBmb3IgY29tbW9ubHkgdXNlZAogbGlicmFyeSBtb2R1bGVzLiBJdCBzdG9yZXMgYWxsIEMgQVBJIHBvaW50ZXJzIChqdXN0IG9uZSBpbiB0aGUgZXhhbXBsZSEpIGluIGFuCi1hcnJheSBvZiA6Y3R5cGU6YHZvaWRgIHBvaW50ZXJzIHdoaWNoIGJlY29tZXMgdGhlIHZhbHVlIG9mIGEgQ2Fwc3VsZS4gVGhlIGhlYWRlcgorYXJyYXkgb2YgOmM6dHlwZTpgdm9pZGAgcG9pbnRlcnMgd2hpY2ggYmVjb21lcyB0aGUgdmFsdWUgb2YgYSBDYXBzdWxlLiBUaGUgaGVhZGVyCiBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1vZHVsZSBwcm92aWRlcyBhIG1hY3JvIHRoYXQgdGFrZXMgY2FyZSBvZiBpbXBvcnRpbmcKIHRoZSBtb2R1bGUgYW5kIHJldHJpZXZpbmcgaXRzIEMgQVBJIHBvaW50ZXJzOyBjbGllbnQgbW9kdWxlcyBvbmx5IGhhdmUgdG8gY2FsbAogdGhpcyBtYWNybyBiZWZvcmUgYWNjZXNzaW5nIHRoZSBDIEFQSS4KIAogVGhlIGV4cG9ydGluZyBtb2R1bGUgaXMgYSBtb2RpZmljYXRpb24gb2YgdGhlIDptb2Q6YHNwYW1gIG1vZHVsZSBmcm9tIHNlY3Rpb24KIDpyZWY6YGV4dGVuZGluZy1zaW1wbGVleGFtcGxlYC4gVGhlIGZ1bmN0aW9uIDpmdW5jOmBzcGFtLnN5c3RlbWAgZG9lcyBub3QgY2FsbAotdGhlIEMgbGlicmFyeSBmdW5jdGlvbiA6Y2Z1bmM6YHN5c3RlbWAgZGlyZWN0bHksIGJ1dCBhIGZ1bmN0aW9uCi06Y2Z1bmM6YFB5U3BhbV9TeXN0ZW1gLCB3aGljaCB3b3VsZCBvZiBjb3Vyc2UgZG8gc29tZXRoaW5nIG1vcmUgY29tcGxpY2F0ZWQgaW4KK3RoZSBDIGxpYnJhcnkgZnVuY3Rpb24gOmM6ZnVuYzpgc3lzdGVtYCBkaXJlY3RseSwgYnV0IGEgZnVuY3Rpb24KKzpjOmZ1bmM6YFB5U3BhbV9TeXN0ZW1gLCB3aGljaCB3b3VsZCBvZiBjb3Vyc2UgZG8gc29tZXRoaW5nIG1vcmUgY29tcGxpY2F0ZWQgaW4KIHJlYWxpdHkgKHN1Y2ggYXMgYWRkaW5nICJzcGFtIiB0byBldmVyeSBjb21tYW5kKS4gVGhpcyBmdW5jdGlvbgotOmNmdW5jOmBQeVNwYW1fU3lzdGVtYCBpcyBhbHNvIGV4cG9ydGVkIHRvIG90aGVyIGV4dGVuc2lvbiBtb2R1bGVzLgorOmM6ZnVuYzpgUHlTcGFtX1N5c3RlbWAgaXMgYWxzbyBleHBvcnRlZCB0byBvdGhlciBleHRlbnNpb24gbW9kdWxlcy4KIAotVGhlIGZ1bmN0aW9uIDpjZnVuYzpgUHlTcGFtX1N5c3RlbWAgaXMgYSBwbGFpbiBDIGZ1bmN0aW9uLCBkZWNsYXJlZAorVGhlIGZ1bmN0aW9uIDpjOmZ1bmM6YFB5U3BhbV9TeXN0ZW1gIGlzIGEgcGxhaW4gQyBmdW5jdGlvbiwgZGVjbGFyZWQKIGBgc3RhdGljYGAgbGlrZSBldmVyeXRoaW5nIGVsc2U6OgogCiAgICBzdGF0aWMgaW50CkBAIC0xMTY3LDcgKzExNjksNyBAQAogICAgICAgIHJldHVybiBzeXN0ZW0oY29tbWFuZCk7CiAgICB9CiAKLVRoZSBmdW5jdGlvbiA6Y2Z1bmM6YHNwYW1fc3lzdGVtYCBpcyBtb2RpZmllZCBpbiBhIHRyaXZpYWwgd2F5OjoKK1RoZSBmdW5jdGlvbiA6YzpmdW5jOmBzcGFtX3N5c3RlbWAgaXMgbW9kaWZpZWQgaW4gYSB0cml2aWFsIHdheTo6CiAKICAgIHN0YXRpYyBQeU9iamVjdCAqCiAgICBzcGFtX3N5c3RlbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCkBAIC0xMjcwLDggKzEyNzIsOCBAQAogICAgI2VuZGlmIC8qICFkZWZpbmVkKFB5X1NQQU1NT0RVTEVfSCkgKi8KIAogQWxsIHRoYXQgYSBjbGllbnQgbW9kdWxlIG11c3QgZG8gaW4gb3JkZXIgdG8gaGF2ZSBhY2Nlc3MgdG8gdGhlIGZ1bmN0aW9uCi06Y2Z1bmM6YFB5U3BhbV9TeXN0ZW1gIGlzIHRvIGNhbGwgdGhlIGZ1bmN0aW9uIChvciByYXRoZXIgbWFjcm8pCi06Y2Z1bmM6YGltcG9ydF9zcGFtYCBpbiBpdHMgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb246OgorOmM6ZnVuYzpgUHlTcGFtX1N5c3RlbWAgaXMgdG8gY2FsbCB0aGUgZnVuY3Rpb24gKG9yIHJhdGhlciBtYWNybykKKzpjOmZ1bmM6YGltcG9ydF9zcGFtYCBpbiBpdHMgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb246OgogCiAgICBQeU1PRElOSVRfRlVOQwogICAgaW5pdGNsaWVudCh2b2lkKQpkaWZmIC0tZ2l0IGEvRG9jL2V4dGVuZGluZy9pbmRleC5yc3QgYi9Eb2MvZXh0ZW5kaW5nL2luZGV4LnJzdAppbmRleCA5MmU2MTMyLi40NGE3ZjkyIDEwMDY0NAotLS0gYS9Eb2MvZXh0ZW5kaW5nL2luZGV4LnJzdAorKysgYi9Eb2MvZXh0ZW5kaW5nL2luZGV4LnJzdApAQCAtNCwxNiArNCwxMyBAQAogICBFeHRlbmRpbmcgYW5kIEVtYmVkZGluZyB0aGUgUHl0aG9uIEludGVycHJldGVyCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi06UmVsZWFzZTogfHZlcnNpb258Ci06RGF0ZTogfHRvZGF5fAotCiBUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBob3cgdG8gd3JpdGUgbW9kdWxlcyBpbiBDIG9yIEMrKyB0byBleHRlbmQgdGhlIFB5dGhvbgotaW50ZXJwcmV0ZXIgd2l0aCBuZXcgbW9kdWxlcy4gIFRob3NlIG1vZHVsZXMgY2FuIGRlZmluZSBuZXcgZnVuY3Rpb25zIGJ1dCBhbHNvCi1uZXcgb2JqZWN0IHR5cGVzIGFuZCB0aGVpciBtZXRob2RzLiAgVGhlIGRvY3VtZW50IGFsc28gZGVzY3JpYmVzIGhvdyB0byBlbWJlZAotdGhlIFB5dGhvbiBpbnRlcnByZXRlciBpbiBhbm90aGVyIGFwcGxpY2F0aW9uLCBmb3IgdXNlIGFzIGFuIGV4dGVuc2lvbiBsYW5ndWFnZS4KLUZpbmFsbHksIGl0IHNob3dzIGhvdyB0byBjb21waWxlIGFuZCBsaW5rIGV4dGVuc2lvbiBtb2R1bGVzIHNvIHRoYXQgdGhleSBjYW4gYmUKLWxvYWRlZCBkeW5hbWljYWxseSAoYXQgcnVuIHRpbWUpIGludG8gdGhlIGludGVycHJldGVyLCBpZiB0aGUgdW5kZXJseWluZwotb3BlcmF0aW5nIHN5c3RlbSBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuCitpbnRlcnByZXRlciB3aXRoIG5ldyBtb2R1bGVzLiAgVGhvc2UgbW9kdWxlcyBjYW4gbm90IG9ubHkgZGVmaW5lIG5ldyBmdW5jdGlvbnMKK2J1dCBhbHNvIG5ldyBvYmplY3QgdHlwZXMgYW5kIHRoZWlyIG1ldGhvZHMuICBUaGUgZG9jdW1lbnQgYWxzbyBkZXNjcmliZXMgaG93Cit0byBlbWJlZCB0aGUgUHl0aG9uIGludGVycHJldGVyIGluIGFub3RoZXIgYXBwbGljYXRpb24sIGZvciB1c2UgYXMgYW4gZXh0ZW5zaW9uCitsYW5ndWFnZS4gIEZpbmFsbHksIGl0IHNob3dzIGhvdyB0byBjb21waWxlIGFuZCBsaW5rIGV4dGVuc2lvbiBtb2R1bGVzIHNvIHRoYXQKK3RoZXkgY2FuIGJlIGxvYWRlZCBkeW5hbWljYWxseSAoYXQgcnVuIHRpbWUpIGludG8gdGhlIGludGVycHJldGVyLCBpZiB0aGUKK3VuZGVybHlpbmcgb3BlcmF0aW5nIHN5c3RlbSBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuCiAKIFRoaXMgZG9jdW1lbnQgYXNzdW1lcyBiYXNpYyBrbm93bGVkZ2UgYWJvdXQgUHl0aG9uLiAgRm9yIGFuIGluZm9ybWFsCiBpbnRyb2R1Y3Rpb24gdG8gdGhlIGxhbmd1YWdlLCBzZWUgOnJlZjpgdHV0b3JpYWwtaW5kZXhgLiAgOnJlZjpgcmVmZXJlbmNlLWluZGV4YApAQCAtMjQsNiArMjEsMTUgQEAKIEZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSB3aG9sZSBQeXRob24vQyBBUEksIHNlZSB0aGUgc2VwYXJhdGUKIDpyZWY6YGMtYXBpLWluZGV4YC4KIAorLi4gbm90ZTo6CisKKyAgIFRoaXMgZ3VpZGUgb25seSBjb3ZlcnMgdGhlIGJhc2ljIHRvb2xzIGZvciBjcmVhdGluZyBleHRlbnNpb25zIHByb3ZpZGVkCisgICBhcyBwYXJ0IG9mIHRoaXMgdmVyc2lvbiBvZiBDUHl0aG9uLiBUaGlyZCBwYXJ0eSB0b29scyBtYXkgb2ZmZXIgc2ltcGxlcgorICAgYWx0ZXJuYXRpdmVzLiBSZWZlciB0byB0aGUgYGJpbmFyeSBleHRlbnNpb25zIHNlY3Rpb24KKyAgIDxodHRwczovL3B5dGhvbi1wYWNrYWdpbmctdXNlci1ndWlkZS5yZWFkdGhlZG9jcy5vcmcvZW4vbGF0ZXN0L2V4dGVuc2lvbnMuaHRtbD5gX18KKyAgIGluIHRoZSBQeXRob24gUGFja2FnaW5nIFVzZXIgR3VpZGUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKwogLi4gdG9jdHJlZTo6CiAgICA6bWF4ZGVwdGg6IDIKICAgIDpudW1iZXJlZDoKZGlmZiAtLWdpdCBhL0RvYy9leHRlbmRpbmcvbmV3dHlwZXMucnN0IGIvRG9jL2V4dGVuZGluZy9uZXd0eXBlcy5yc3QKaW5kZXggZjRjM2MwMi4uZDc2YWEyNCAxMDA2NDQKLS0tIGEvRG9jL2V4dGVuZGluZy9uZXd0eXBlcy5yc3QKKysrIGIvRG9jL2V4dGVuZGluZy9uZXd0eXBlcy5yc3QKQEAgLTM0LDcgKzM0LDcgQEAKID09PT09PT09PT0KIAogVGhlIFB5dGhvbiBydW50aW1lIHNlZXMgYWxsIFB5dGhvbiBvYmplY3RzIGFzIHZhcmlhYmxlcyBvZiB0eXBlCi06Y3R5cGU6YFB5T2JqZWN0XCpgLiAgQSA6Y3R5cGU6YFB5T2JqZWN0YCBpcyBub3QgYSB2ZXJ5IG1hZ25pZmljZW50IG9iamVjdCAtIGl0Cis6Yzp0eXBlOmBQeU9iamVjdFwqYC4gIEEgOmM6dHlwZTpgUHlPYmplY3RgIGlzIG5vdCBhIHZlcnkgbWFnbmlmaWNlbnQgb2JqZWN0IC0gaXQKIGp1c3QgY29udGFpbnMgdGhlIHJlZmNvdW50IGFuZCBhIHBvaW50ZXIgdG8gdGhlIG9iamVjdCdzICJ0eXBlIG9iamVjdCIuICBUaGlzIGlzCiB3aGVyZSB0aGUgYWN0aW9uIGlzOyB0aGUgdHlwZSBvYmplY3QgZGV0ZXJtaW5lcyB3aGljaCAoQykgZnVuY3Rpb25zIGdldCBjYWxsZWQKIHdoZW4sIGZvciBpbnN0YW5jZSwgYW4gYXR0cmlidXRlIGdldHMgbG9va2VkIHVwIG9uIGFuIG9iamVjdCBvciBpdCBpcyBtdWx0aXBsaWVkCkBAIC0xMDMsNyArMTAzLDcgQEAKICAgICAgICAiTm9kZHkgb2JqZWN0cyIsICAgICAgICAgICAvKiB0cF9kb2MgKi8KICAgIH07CiAKLU5vdyBpZiB5b3UgZ28gYW5kIGxvb2sgdXAgdGhlIGRlZmluaXRpb24gb2YgOmN0eXBlOmBQeVR5cGVPYmplY3RgIGluCitOb3cgaWYgeW91IGdvIGFuZCBsb29rIHVwIHRoZSBkZWZpbml0aW9uIG9mIDpjOnR5cGU6YFB5VHlwZU9iamVjdGAgaW4KIDpmaWxlOmBvYmplY3QuaGAgeW91J2xsIHNlZSB0aGF0IGl0IGhhcyBtYW55IG1vcmUgZmllbGRzIHRoYXQgdGhlIGRlZmluaXRpb24KIGFib3ZlLiAgVGhlIHJlbWFpbmluZyBmaWVsZHMgd2lsbCBiZSBmaWxsZWQgd2l0aCB6ZXJvcyBieSB0aGUgQyBjb21waWxlciwgYW5kCiBpdCdzIGNvbW1vbiBwcmFjdGljZSB0byBub3Qgc3BlY2lmeSB0aGVtIGV4cGxpY2l0bHkgdW5sZXNzIHlvdSBuZWVkIHRoZW0uCkBAIC0xMTksNyArMTE5LDcgQEAKIAogYXMgdGhlIHR5cGUgb2YgYSB0eXBlIG9iamVjdCBpcyAidHlwZSIsIGJ1dCB0aGlzIGlzbid0IHN0cmljdGx5IGNvbmZvcm1pbmcgQyBhbmQKIHNvbWUgY29tcGlsZXJzIGNvbXBsYWluLiAgRm9ydHVuYXRlbHksIHRoaXMgbWVtYmVyIHdpbGwgYmUgZmlsbGVkIGluIGZvciB1cyBieQotOmNmdW5jOmBQeVR5cGVfUmVhZHlgLiA6OgorOmM6ZnVuYzpgUHlUeXBlX1JlYWR5YC4gOjoKIAogICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iX3NpemUgKi8KIApAQCAtMTQ1LDE2ICsxNDUsMTYgQEAKICAgIHNpemVvZihub2RkeV9Ob2RkeU9iamVjdCksICAvKiB0cF9iYXNpY3NpemUgKi8KIAogVGhpcyBpcyBzbyB0aGF0IFB5dGhvbiBrbm93cyBob3cgbXVjaCBtZW1vcnkgdG8gYWxsb2NhdGUgd2hlbiB5b3UgY2FsbAotOmNmdW5jOmBQeU9iamVjdF9OZXdgLgorOmM6ZnVuYzpgUHlPYmplY3RfTmV3YC4KIAogLi4gbm90ZTo6CiAKICAgIElmIHlvdSB3YW50IHlvdXIgdHlwZSB0byBiZSBzdWJjbGFzc2FibGUgZnJvbSBQeXRob24sIGFuZCB5b3VyIHR5cGUgaGFzIHRoZSBzYW1lCi0gICA6YXR0cjpgdHBfYmFzaWNzaXplYCBhcyBpdHMgYmFzZSB0eXBlLCB5b3UgbWF5IGhhdmUgcHJvYmxlbXMgd2l0aCBtdWx0aXBsZQorICAgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2Jhc2ljc2l6ZWAgYXMgaXRzIGJhc2UgdHlwZSwgeW91IG1heSBoYXZlIHByb2JsZW1zIHdpdGggbXVsdGlwbGUKICAgIGluaGVyaXRhbmNlLiAgQSBQeXRob24gc3ViY2xhc3Mgb2YgeW91ciB0eXBlIHdpbGwgaGF2ZSB0byBsaXN0IHlvdXIgdHlwZSBmaXJzdAotICAgaW4gaXRzIDphdHRyOmBfX2Jhc2VzX19gLCBvciBlbHNlIGl0IHdpbGwgbm90IGJlIGFibGUgdG8gY2FsbCB5b3VyIHR5cGUncworICAgaW4gaXRzIDphdHRyOmB+Y2xhc3MuX19iYXNlc19fYCwgb3IgZWxzZSBpdCB3aWxsIG5vdCBiZSBhYmxlIHRvIGNhbGwgeW91ciB0eXBlJ3MKICAgIDptZXRoOmBfX25ld19fYCBtZXRob2Qgd2l0aG91dCBnZXR0aW5nIGFuIGVycm9yLiAgWW91IGNhbiBhdm9pZCB0aGlzIHByb2JsZW0gYnkKLSAgIGVuc3VyaW5nIHRoYXQgeW91ciB0eXBlIGhhcyBhIGxhcmdlciB2YWx1ZSBmb3IgOmF0dHI6YHRwX2Jhc2ljc2l6ZWAgdGhhbiBpdHMKKyAgIGVuc3VyaW5nIHRoYXQgeW91ciB0eXBlIGhhcyBhIGxhcmdlciB2YWx1ZSBmb3IgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2Jhc2ljc2l6ZWAgdGhhbiBpdHMKICAgIGJhc2UgdHlwZSBkb2VzLiAgTW9zdCBvZiB0aGUgdGltZSwgdGhpcyB3aWxsIGJlIHRydWUgYW55d2F5LCBiZWNhdXNlIGVpdGhlciB5b3VyCiAgICBiYXNlIHR5cGUgd2lsbCBiZSA6Y2xhc3M6YG9iamVjdGAsIG9yIGVsc2UgeW91IHdpbGwgYmUgYWRkaW5nIGRhdGEgbWVtYmVycyB0bwogICAgeW91ciBiYXNlIHR5cGUsIGFuZCB0aGVyZWZvcmUgaW5jcmVhc2luZyBpdHMgc2l6ZS4KQEAgLTE3NCw3ICsxNzQsNyBAQAogQWxsIHR5cGVzIHNob3VsZCBpbmNsdWRlIHRoaXMgY29uc3RhbnQgaW4gdGhlaXIgZmxhZ3MuICBJdCBlbmFibGVzIGFsbCBvZiB0aGUKIG1lbWJlcnMgZGVmaW5lZCBieSB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIFB5dGhvbi4KIAotV2UgcHJvdmlkZSBhIGRvYyBzdHJpbmcgZm9yIHRoZSB0eXBlIGluIDphdHRyOmB0cF9kb2NgLiA6OgorV2UgcHJvdmlkZSBhIGRvYyBzdHJpbmcgZm9yIHRoZSB0eXBlIGluIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9kb2NgLiA6OgogCiAgICAiTm9kZHkgb2JqZWN0cyIsICAgICAgICAgICAvKiB0cF9kb2MgKi8KIApAQCAtMTgzLDE0ICsxODMsMTQgQEAKIHRoZSBtb2R1bGUuICBXZSdsbCBleHBhbmQgdGhpcyBleGFtcGxlIGxhdGVyIHRvIGhhdmUgbW9yZSBpbnRlcmVzdGluZyBiZWhhdmlvci4KIAogRm9yIG5vdywgYWxsIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBkbyBpcyB0byBjcmVhdGUgbmV3IDpjbGFzczpgTm9kZHlgIG9iamVjdHMuCi1UbyBlbmFibGUgb2JqZWN0IGNyZWF0aW9uLCB3ZSBoYXZlIHRvIHByb3ZpZGUgYSA6YXR0cjpgdHBfbmV3YCBpbXBsZW1lbnRhdGlvbi4KK1RvIGVuYWJsZSBvYmplY3QgY3JlYXRpb24sIHdlIGhhdmUgdG8gcHJvdmlkZSBhIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9uZXdgIGltcGxlbWVudGF0aW9uLgogSW4gdGhpcyBjYXNlLCB3ZSBjYW4ganVzdCB1c2UgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhlIEFQSQotZnVuY3Rpb24gOmNmdW5jOmBQeVR5cGVfR2VuZXJpY05ld2AuICBXZSdkIGxpa2UgdG8ganVzdCBhc3NpZ24gdGhpcyB0byB0aGUKLTphdHRyOmB0cF9uZXdgIHNsb3QsIGJ1dCB3ZSBjYW4ndCwgZm9yIHBvcnRhYmlsaXR5IHNha2UsIE9uIHNvbWUgcGxhdGZvcm1zIG9yCitmdW5jdGlvbiA6YzpmdW5jOmBQeVR5cGVfR2VuZXJpY05ld2AuICBXZSdkIGxpa2UgdG8ganVzdCBhc3NpZ24gdGhpcyB0byB0aGUKKzpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9uZXdgIHNsb3QsIGJ1dCB3ZSBjYW4ndCwgZm9yIHBvcnRhYmlsaXR5IHNha2UsIE9uIHNvbWUgcGxhdGZvcm1zIG9yCiBjb21waWxlcnMsIHdlIGNhbid0IHN0YXRpY2FsbHkgaW5pdGlhbGl6ZSBhIHN0cnVjdHVyZSBtZW1iZXIgd2l0aCBhIGZ1bmN0aW9uCi1kZWZpbmVkIGluIGFub3RoZXIgQyBtb2R1bGUsIHNvLCBpbnN0ZWFkLCB3ZSdsbCBhc3NpZ24gdGhlIDphdHRyOmB0cF9uZXdgIHNsb3QKK2RlZmluZWQgaW4gYW5vdGhlciBDIG1vZHVsZSwgc28sIGluc3RlYWQsIHdlJ2xsIGFzc2lnbiB0aGUgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX25ld2Agc2xvdAogaW4gdGhlIG1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBqdXN0IGJlZm9yZSBjYWxsaW5nCi06Y2Z1bmM6YFB5VHlwZV9SZWFkeWA6OgorOmM6ZnVuYzpgUHlUeXBlX1JlYWR5YDo6CiAKICAgIG5vZGR5X05vZGR5VHlwZS50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKICAgIGlmIChQeVR5cGVfUmVhZHkoJm5vZGR5X05vZGR5VHlwZSkgPCAwKQpAQCAtMjAwLDcgKzIwMCw3IEBACiBmb3IgYSBsYXRlciBzZWN0aW9uIQogCiBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIGZpbGUgc2hvdWxkIGJlIGZhbWlsaWFyLCBleGNlcHQgZm9yIHNvbWUgY29kZSBpbgotOmNmdW5jOmBpbml0bm9kZHlgOjoKKzpjOmZ1bmM6YGluaXRub2RkeWA6OgogCiAgICBpZiAoUHlUeXBlX1JlYWR5KCZub2RkeV9Ob2RkeVR5cGUpIDwgMCkKICAgICAgICByZXR1cm47CkBAIC0yODMsMTMgKzI4MywxMyBAQAogICAgICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKICAgIH0KIAotd2hpY2ggaXMgYXNzaWduZWQgdG8gdGhlIDphdHRyOmB0cF9kZWFsbG9jYCBtZW1iZXI6Ogord2hpY2ggaXMgYXNzaWduZWQgdG8gdGhlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9kZWFsbG9jYCBtZW1iZXI6OgogCiAgICAoZGVzdHJ1Y3RvcilOb2RkeV9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwogCiBUaGlzIG1ldGhvZCBkZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnRzIG9mIHRoZSB0d28gUHl0aG9uIGF0dHJpYnV0ZXMuIFdlIHVzZQotOmNmdW5jOmBQeV9YREVDUkVGYCBoZXJlIGJlY2F1c2UgdGhlIDphdHRyOmBmaXJzdGAgYW5kIDphdHRyOmBsYXN0YCBtZW1iZXJzCi1jb3VsZCBiZSAqTlVMTCouICBJdCB0aGVuIGNhbGxzIHRoZSA6YXR0cjpgdHBfZnJlZWAgbWVtYmVyIG9mIHRoZSBvYmplY3QncyB0eXBlCis6YzpmdW5jOmBQeV9YREVDUkVGYCBoZXJlIGJlY2F1c2UgdGhlIDphdHRyOmBmaXJzdGAgYW5kIDphdHRyOmBsYXN0YCBtZW1iZXJzCitjb3VsZCBiZSAqTlVMTCouICBJdCB0aGVuIGNhbGxzIHRoZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfZnJlZWAgbWVtYmVyIG9mIHRoZSBvYmplY3QncyB0eXBlCiB0byBmcmVlIHRoZSBvYmplY3QncyBtZW1vcnkuICBOb3RlIHRoYXQgdGhlIG9iamVjdCdzIHR5cGUgbWlnaHQgbm90IGJlCiA6Y2xhc3M6YE5vZGR5VHlwZWAsIGJlY2F1c2UgdGhlIG9iamVjdCBtYXkgYmUgYW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcy4KIApAQCAtMzIzLDcgKzMyMyw3IEBACiAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CiAgICB9CiAKLWFuZCBpbnN0YWxsIGl0IGluIHRoZSA6YXR0cjpgdHBfbmV3YCBtZW1iZXI6OgorYW5kIGluc3RhbGwgaXQgaW4gdGhlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9uZXdgIG1lbWJlcjo6CiAKICAgIE5vZGR5X25ldywgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogCkBAIC0zMzQsOCArMzM0LDggQEAKIHRoZSBpbml0aWFsIHZhbHVlcyBvZiBpbnN0YW5jZSB2YXJpYWJsZXMuICBJbiB0aGlzIGNhc2UsIHdlIHVzZSB0aGUgbmV3IG1ldGhvZAogdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBtZW1iZXJzIDphdHRyOmBmaXJzdGAgYW5kCiA6YXR0cjpgbGFzdGAgYXJlIG5vdCAqTlVMTCouIElmIHdlIGRpZG4ndCBjYXJlIHdoZXRoZXIgdGhlIGluaXRpYWwgdmFsdWVzIHdlcmUKLSpOVUxMKiwgd2UgY291bGQgaGF2ZSB1c2VkIDpjZnVuYzpgUHlUeXBlX0dlbmVyaWNOZXdgIGFzIG91ciBuZXcgbWV0aG9kLCBhcyB3ZQotZGlkIGJlZm9yZS4gIDpjZnVuYzpgUHlUeXBlX0dlbmVyaWNOZXdgIGluaXRpYWxpemVzIGFsbCBvZiB0aGUgaW5zdGFuY2UgdmFyaWFibGUKKypOVUxMKiwgd2UgY291bGQgaGF2ZSB1c2VkIDpjOmZ1bmM6YFB5VHlwZV9HZW5lcmljTmV3YCBhcyBvdXIgbmV3IG1ldGhvZCwgYXMgd2UKK2RpZCBiZWZvcmUuICA6YzpmdW5jOmBQeVR5cGVfR2VuZXJpY05ld2AgaW5pdGlhbGl6ZXMgYWxsIG9mIHRoZSBpbnN0YW5jZSB2YXJpYWJsZQogbWVtYmVycyB0byAqTlVMTCouCiAKIFRoZSBuZXcgbWV0aG9kIGlzIGEgc3RhdGljIG1ldGhvZCB0aGF0IGlzIHBhc3NlZCB0aGUgdHlwZSBiZWluZyBpbnN0YW50aWF0ZWQgYW5kCkBAIC0zNDQsMTYgKzM0NCwxNiBAQAogb2Z0ZW4gaWdub3JlIHRoZSBhcmd1bWVudHMsIGxlYXZpbmcgdGhlIGFyZ3VtZW50IGhhbmRsaW5nIHRvIGluaXRpYWxpemVyCiBtZXRob2RzLiBOb3RlIHRoYXQgaWYgdGhlIHR5cGUgc3VwcG9ydHMgc3ViY2xhc3NpbmcsIHRoZSB0eXBlIHBhc3NlZCBtYXkgbm90IGJlCiB0aGUgdHlwZSBiZWluZyBkZWZpbmVkLiAgVGhlIG5ldyBtZXRob2QgY2FsbHMgdGhlIHRwX2FsbG9jIHNsb3QgdG8gYWxsb2NhdGUKLW1lbW9yeS4gV2UgZG9uJ3QgZmlsbCB0aGUgOmF0dHI6YHRwX2FsbG9jYCBzbG90IG91cnNlbHZlcy4gUmF0aGVyCi06Y2Z1bmM6YFB5VHlwZV9SZWFkeWAgZmlsbHMgaXQgZm9yIHVzIGJ5IGluaGVyaXRpbmcgaXQgZnJvbSBvdXIgYmFzZSBjbGFzcywKK21lbW9yeS4gV2UgZG9uJ3QgZmlsbCB0aGUgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2FsbG9jYCBzbG90IG91cnNlbHZlcy4gUmF0aGVyCis6YzpmdW5jOmBQeVR5cGVfUmVhZHlgIGZpbGxzIGl0IGZvciB1cyBieSBpbmhlcml0aW5nIGl0IGZyb20gb3VyIGJhc2UgY2xhc3MsCiB3aGljaCBpcyA6Y2xhc3M6YG9iamVjdGAgYnkgZGVmYXVsdC4gIE1vc3QgdHlwZXMgdXNlIHRoZSBkZWZhdWx0IGFsbG9jYXRpb24uCiAKIC4uIG5vdGU6OgogCi0gICBJZiB5b3UgYXJlIGNyZWF0aW5nIGEgY28tb3BlcmF0aXZlIDphdHRyOmB0cF9uZXdgIChvbmUgdGhhdCBjYWxscyBhIGJhc2UgdHlwZSdzCi0gICA6YXR0cjpgdHBfbmV3YCBvciA6bWV0aDpgX19uZXdfX2ApLCB5b3UgbXVzdCAqbm90KiB0cnkgdG8gZGV0ZXJtaW5lIHdoYXQgbWV0aG9kCisgICBJZiB5b3UgYXJlIGNyZWF0aW5nIGEgY28tb3BlcmF0aXZlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9uZXdgIChvbmUgdGhhdCBjYWxscyBhIGJhc2UgdHlwZSdzCisgICA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfbmV3YCBvciA6bWV0aDpgX19uZXdfX2ApLCB5b3UgbXVzdCAqbm90KiB0cnkgdG8gZGV0ZXJtaW5lIHdoYXQgbWV0aG9kCiAgICB0byBjYWxsIHVzaW5nIG1ldGhvZCByZXNvbHV0aW9uIG9yZGVyIGF0IHJ1bnRpbWUuICBBbHdheXMgc3RhdGljYWxseSBkZXRlcm1pbmUKLSAgIHdoYXQgdHlwZSB5b3UgYXJlIGdvaW5nIHRvIGNhbGwsIGFuZCBjYWxsIGl0cyA6YXR0cjpgdHBfbmV3YCBkaXJlY3RseSwgb3IgdmlhCisgICB3aGF0IHR5cGUgeW91IGFyZSBnb2luZyB0byBjYWxsLCBhbmQgY2FsbCBpdHMgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX25ld2AgZGlyZWN0bHksIG9yIHZpYQogICAgYGB0eXBlLT50cF9iYXNlLT50cF9uZXdgYC4gIElmIHlvdSBkbyBub3QgZG8gdGhpcywgUHl0aG9uIHN1YmNsYXNzZXMgb2YgeW91cgogICAgdHlwZSB0aGF0IGFsc28gaW5oZXJpdCBmcm9tIG90aGVyIFB5dGhvbi1kZWZpbmVkIGNsYXNzZXMgbWF5IG5vdCB3b3JrIGNvcnJlY3RseS4KICAgIChTcGVjaWZpY2FsbHksIHlvdSBtYXkgbm90IGJlIGFibGUgdG8gY3JlYXRlIGluc3RhbmNlcyBvZiBzdWNoIHN1YmNsYXNzZXMKQEAgLTM5MCwxMSArMzkwLDExIEBACiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAKLWJ5IGZpbGxpbmcgdGhlIDphdHRyOmB0cF9pbml0YCBzbG90LiA6OgorYnkgZmlsbGluZyB0aGUgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2luaXRgIHNsb3QuIDo6CiAKICAgIChpbml0cHJvYylOb2RkeV9pbml0LCAgICAgICAgIC8qIHRwX2luaXQgKi8KIAotVGhlIDphdHRyOmB0cF9pbml0YCBzbG90IGlzIGV4cG9zZWQgaW4gUHl0aG9uIGFzIHRoZSA6bWV0aDpgX19pbml0X19gIG1ldGhvZC4gSXQKK1RoZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfaW5pdGAgc2xvdCBpcyBleHBvc2VkIGluIFB5dGhvbiBhcyB0aGUgOm1ldGg6YF9faW5pdF9fYCBtZXRob2QuIEl0CiBpcyB1c2VkIHRvIGluaXRpYWxpemUgYW4gb2JqZWN0IGFmdGVyIGl0J3MgY3JlYXRlZC4gVW5saWtlIHRoZSBuZXcgbWV0aG9kLCB3ZQogY2FuJ3QgZ3VhcmFudGVlIHRoYXQgdGhlIGluaXRpYWxpemVyIGlzIGNhbGxlZC4gIFRoZSBpbml0aWFsaXplciBpc24ndCBjYWxsZWQKIHdoZW4gdW5waWNrbGluZyBvYmplY3RzIGFuZCBpdCBjYW4gYmUgb3ZlcnJpZGRlbi4gIE91ciBpbml0aWFsaXplciBhY2NlcHRzCkBAIC00MjQsNyArNDI0LDcgQEAKICogd2hlbiB3ZSBrbm93IHRoYXQgZGVhbGxvY2F0aW9uIG9mIHRoZSBvYmplY3QgWyNdXyB3aWxsIG5vdCBjYXVzZSBhbnkgY2FsbHMKICAgYmFjayBpbnRvIG91ciB0eXBlJ3MgY29kZQogCi0qIHdoZW4gZGVjcmVtZW50aW5nIGEgcmVmZXJlbmNlIGNvdW50IGluIGEgOmF0dHI6YHRwX2RlYWxsb2NgIGhhbmRsZXIgd2hlbgorKiB3aGVuIGRlY3JlbWVudGluZyBhIHJlZmVyZW5jZSBjb3VudCBpbiBhIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9kZWFsbG9jYCBoYW5kbGVyIHdoZW4KICAgZ2FyYmFnZS1jb2xsZWN0aW9ucyBpcyBub3Qgc3VwcG9ydGVkIFsjXV8KIAogV2Ugd2FudCB0byBleHBvc2Ugb3VyIGluc3RhbmNlIHZhcmlhYmxlcyBhcyBhdHRyaWJ1dGVzLiBUaGVyZSBhcmUgYQpAQCAtNDQwLDcgKzQ0MCw3IEBACiAgICAgICAge05VTEx9ICAvKiBTZW50aW5lbCAqLwogICAgfTsKIAotYW5kIHB1dCB0aGUgZGVmaW5pdGlvbnMgaW4gdGhlIDphdHRyOmB0cF9tZW1iZXJzYCBzbG90OjoKK2FuZCBwdXQgdGhlIGRlZmluaXRpb25zIGluIHRoZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfbWVtYmVyc2Agc2xvdDo6CiAKICAgIE5vZGR5X21lbWJlcnMsICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KIApAQCAtNTE2LDcgKzUxNiw3IEBACiAgICAgICAge05VTEx9ICAvKiBTZW50aW5lbCAqLwogICAgfTsKIAotYW5kIGFzc2lnbiB0aGVtIHRvIHRoZSA6YXR0cjpgdHBfbWV0aG9kc2Agc2xvdDo6CithbmQgYXNzaWduIHRoZW0gdG8gdGhlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9tZXRob2RzYCBzbG90OjoKIAogICAgTm9kZHlfbWV0aG9kcywgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwogCkBAIC01MzAsOCArNTMwLDggQEAKIAogICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyp0cF9mbGFncyovCiAKLVdlIHJlbmFtZSA6Y2Z1bmM6YGluaXRub2RkeWAgdG8gOmNmdW5jOmBpbml0bm9kZHkyYCBhbmQgdXBkYXRlIHRoZSBtb2R1bGUgbmFtZQotcGFzc2VkIHRvIDpjZnVuYzpgUHlfSW5pdE1vZHVsZTNgLgorV2UgcmVuYW1lIDpjOmZ1bmM6YGluaXRub2RkeWAgdG8gOmM6ZnVuYzpgaW5pdG5vZGR5MmAgYW5kIHVwZGF0ZSB0aGUgbW9kdWxlIG5hbWUKK3Bhc3NlZCB0byA6YzpmdW5jOmBQeV9Jbml0TW9kdWxlM2AuCiAKIEZpbmFsbHksIHdlIHVwZGF0ZSBvdXIgOmZpbGU6YHNldHVwLnB5YCBmaWxlIHRvIGJ1aWxkIHRoZSBuZXcgbW9kdWxlOjoKIApAQCAtNTk3LDcgKzU5Nyw3IEBACiBkZWxldGVkLiAgSW4gb3VyIHNldHRlciwgd2UgcmFpc2UgYW4gZXJyb3IgaWYgdGhlIGF0dHJpYnV0ZSBpcyBkZWxldGVkIG9yIGlmIHRoZQogYXR0cmlidXRlIHZhbHVlIGlzIG5vdCBhIHN0cmluZy4KIAotV2UgY3JlYXRlIGFuIGFycmF5IG9mIDpjdHlwZTpgUHlHZXRTZXREZWZgIHN0cnVjdHVyZXM6OgorV2UgY3JlYXRlIGFuIGFycmF5IG9mIDpjOnR5cGU6YFB5R2V0U2V0RGVmYCBzdHJ1Y3R1cmVzOjoKIAogICAgc3RhdGljIFB5R2V0U2V0RGVmIE5vZGR5X2dldHNldGVyc1tdID0gewogICAgICAgIHsiZmlyc3QiLApAQCAtNjExLDEzICs2MTEsMTMgQEAKICAgICAgICB7TlVMTH0gIC8qIFNlbnRpbmVsICovCiAgICB9OwogCi1hbmQgcmVnaXN0ZXIgaXQgaW4gdGhlIDphdHRyOmB0cF9nZXRzZXRgIHNsb3Q6OgorYW5kIHJlZ2lzdGVyIGl0IGluIHRoZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfZ2V0c2V0YCBzbG90OjoKIAogICAgTm9kZHlfZ2V0c2V0ZXJzLCAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCiAKIHRvIHJlZ2lzdGVyIG91ciBhdHRyaWJ1dGUgZ2V0dGVycyBhbmQgc2V0dGVycy4KIAotVGhlIGxhc3QgaXRlbSBpbiBhIDpjdHlwZTpgUHlHZXRTZXREZWZgIHN0cnVjdHVyZSBpcyB0aGUgY2xvc3VyZSBtZW50aW9uZWQKK1RoZSBsYXN0IGl0ZW0gaW4gYSA6Yzp0eXBlOmBQeUdldFNldERlZmAgc3RydWN0dXJlIGlzIHRoZSBjbG9zdXJlIG1lbnRpb25lZAogYWJvdmUuIEluIHRoaXMgY2FzZSwgd2UgYXJlbid0IHVzaW5nIHRoZSBjbG9zdXJlLCBzbyB3ZSBqdXN0IHBhc3MgKk5VTEwqLgogCiBXZSBhbHNvIHJlbW92ZSB0aGUgbWVtYmVyIGRlZmluaXRpb25zIGZvciB0aGVzZSBhdHRyaWJ1dGVzOjoKQEAgLTYyOCw3ICs2MjgsNyBAQAogICAgICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KICAgIH07CiAKLVdlIGFsc28gbmVlZCB0byB1cGRhdGUgdGhlIDphdHRyOmB0cF9pbml0YCBoYW5kbGVyIHRvIG9ubHkgYWxsb3cgc3RyaW5ncyBbI11fIHRvCitXZSBhbHNvIG5lZWQgdG8gdXBkYXRlIHRoZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfaW5pdGAgaGFuZGxlciB0byBvbmx5IGFsbG93IHN0cmluZ3MgWyNdXyB0bwogYmUgcGFzc2VkOjoKIAogICAgc3RhdGljIGludApAQCAtNjYyLDggKzY2Miw4IEBACiAKIFdpdGggdGhlc2UgY2hhbmdlcywgd2UgY2FuIGFzc3VyZSB0aGF0IHRoZSA6YXR0cjpgZmlyc3RgIGFuZCA6YXR0cjpgbGFzdGAKIG1lbWJlcnMgYXJlIG5ldmVyICpOVUxMKiBzbyB3ZSBjYW4gcmVtb3ZlIGNoZWNrcyBmb3IgKk5VTEwqIHZhbHVlcyBpbiBhbG1vc3QgYWxsCi1jYXNlcy4gVGhpcyBtZWFucyB0aGF0IG1vc3Qgb2YgdGhlIDpjZnVuYzpgUHlfWERFQ1JFRmAgY2FsbHMgY2FuIGJlIGNvbnZlcnRlZCB0bwotOmNmdW5jOmBQeV9ERUNSRUZgIGNhbGxzLiBUaGUgb25seSBwbGFjZSB3ZSBjYW4ndCBjaGFuZ2UgdGhlc2UgY2FsbHMgaXMgaW4gdGhlCitjYXNlcy4gVGhpcyBtZWFucyB0aGF0IG1vc3Qgb2YgdGhlIDpjOmZ1bmM6YFB5X1hERUNSRUZgIGNhbGxzIGNhbiBiZSBjb252ZXJ0ZWQgdG8KKzpjOmZ1bmM6YFB5X0RFQ1JFRmAgY2FsbHMuIFRoZSBvbmx5IHBsYWNlIHdlIGNhbid0IGNoYW5nZSB0aGVzZSBjYWxscyBpcyBpbiB0aGUKIGRlYWxsb2NhdG9yLCB3aGVyZSB0aGVyZSBpcyB0aGUgcG9zc2liaWxpdHkgdGhhdCB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlc2UKIG1lbWJlcnMgZmFpbGVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KIApAQCAtNzI4LDEzICs3MjgsMTMgQEAKICAgIH0KIAogRm9yIGVhY2ggc3Vib2JqZWN0IHRoYXQgY2FuIHBhcnRpY2lwYXRlIGluIGN5Y2xlcywgd2UgbmVlZCB0byBjYWxsIHRoZQotOmNmdW5jOmB2aXNpdGAgZnVuY3Rpb24sIHdoaWNoIGlzIHBhc3NlZCB0byB0aGUgdHJhdmVyc2FsIG1ldGhvZC4gVGhlCi06Y2Z1bmM6YHZpc2l0YCBmdW5jdGlvbiB0YWtlcyBhcyBhcmd1bWVudHMgdGhlIHN1Ym9iamVjdCBhbmQgdGhlIGV4dHJhIGFyZ3VtZW50Cis6YzpmdW5jOmB2aXNpdGAgZnVuY3Rpb24sIHdoaWNoIGlzIHBhc3NlZCB0byB0aGUgdHJhdmVyc2FsIG1ldGhvZC4gVGhlCis6YzpmdW5jOmB2aXNpdGAgZnVuY3Rpb24gdGFrZXMgYXMgYXJndW1lbnRzIHRoZSBzdWJvYmplY3QgYW5kIHRoZSBleHRyYSBhcmd1bWVudAogKmFyZyogcGFzc2VkIHRvIHRoZSB0cmF2ZXJzYWwgbWV0aG9kLiAgSXQgcmV0dXJucyBhbiBpbnRlZ2VyIHZhbHVlIHRoYXQgbXVzdCBiZQogcmV0dXJuZWQgaWYgaXQgaXMgbm9uLXplcm8uCiAKLVB5dGhvbiAyLjQgYW5kIGhpZ2hlciBwcm92aWRlIGEgOmNmdW5jOmBQeV9WSVNJVGAgbWFjcm8gdGhhdCBhdXRvbWF0ZXMgY2FsbGluZwotdmlzaXQgZnVuY3Rpb25zLiAgV2l0aCA6Y2Z1bmM6YFB5X1ZJU0lUYCwgOmNmdW5jOmBOb2RkeV90cmF2ZXJzZWAgY2FuIGJlCitQeXRob24gMi40IGFuZCBoaWdoZXIgcHJvdmlkZSBhIDpjOmZ1bmM6YFB5X1ZJU0lUYCBtYWNybyB0aGF0IGF1dG9tYXRlcyBjYWxsaW5nCit2aXNpdCBmdW5jdGlvbnMuICBXaXRoIDpjOmZ1bmM6YFB5X1ZJU0lUYCwgOmM6ZnVuYzpgTm9kZHlfdHJhdmVyc2VgIGNhbiBiZQogc2ltcGxpZmllZDo6CiAKICAgIHN0YXRpYyBpbnQKQEAgLTc0Nyw4ICs3NDcsOCBAQAogCiAuLiBub3RlOjoKIAotICAgTm90ZSB0aGF0IHRoZSA6YXR0cjpgdHBfdHJhdmVyc2VgIGltcGxlbWVudGF0aW9uIG11c3QgbmFtZSBpdHMgYXJndW1lbnRzIGV4YWN0bHkKLSAgICp2aXNpdCogYW5kICphcmcqIGluIG9yZGVyIHRvIHVzZSA6Y2Z1bmM6YFB5X1ZJU0lUYC4gIFRoaXMgaXMgdG8gZW5jb3VyYWdlCisgICBOb3RlIHRoYXQgdGhlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF90cmF2ZXJzZWAgaW1wbGVtZW50YXRpb24gbXVzdCBuYW1lIGl0cyBhcmd1bWVudHMgZXhhY3RseQorICAgKnZpc2l0KiBhbmQgKmFyZyogaW4gb3JkZXIgdG8gdXNlIDpjOmZ1bmM6YFB5X1ZJU0lUYC4gIFRoaXMgaXMgdG8gZW5jb3VyYWdlCiAgICB1bmlmb3JtaXR5IGFjcm9zcyB0aGVzZSBib3JpbmcgaW1wbGVtZW50YXRpb25zLgogCiBXZSBhbHNvIG5lZWQgdG8gcHJvdmlkZSBhIG1ldGhvZCBmb3IgY2xlYXJpbmcgYW55IHN1Ym9iamVjdHMgdGhhdCBjYW4KQEAgLTc3OCwxOSArNzc4LDE5IEBACiAgICAgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QqKXNlbGYpOwogICAgfQogCi1Ob3RpY2UgdGhlIHVzZSBvZiBhIHRlbXBvcmFyeSB2YXJpYWJsZSBpbiA6Y2Z1bmM6YE5vZGR5X2NsZWFyYC4gV2UgdXNlIHRoZQorTm90aWNlIHRoZSB1c2Ugb2YgYSB0ZW1wb3JhcnkgdmFyaWFibGUgaW4gOmM6ZnVuYzpgTm9kZHlfY2xlYXJgLiBXZSB1c2UgdGhlCiB0ZW1wb3JhcnkgdmFyaWFibGUgc28gdGhhdCB3ZSBjYW4gc2V0IGVhY2ggbWVtYmVyIHRvICpOVUxMKiBiZWZvcmUgZGVjcmVtZW50aW5nCiBpdHMgcmVmZXJlbmNlIGNvdW50LiAgV2UgZG8gdGhpcyBiZWNhdXNlLCBhcyB3YXMgZGlzY3Vzc2VkIGVhcmxpZXIsIGlmIHRoZQogcmVmZXJlbmNlIGNvdW50IGRyb3BzIHRvIHplcm8sIHdlIG1pZ2h0IGNhdXNlIGNvZGUgdG8gcnVuIHRoYXQgY2FsbHMgYmFjayBpbnRvCiB0aGUgb2JqZWN0LiAgSW4gYWRkaXRpb24sIGJlY2F1c2Ugd2Ugbm93IHN1cHBvcnQgZ2FyYmFnZSBjb2xsZWN0aW9uLCB3ZSBhbHNvCiBoYXZlIHRvIHdvcnJ5IGFib3V0IGNvZGUgYmVpbmcgcnVuIHRoYXQgdHJpZ2dlcnMgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgSWYgZ2FyYmFnZQotY29sbGVjdGlvbiBpcyBydW4sIG91ciA6YXR0cjpgdHBfdHJhdmVyc2VgIGhhbmRsZXIgY291bGQgZ2V0IGNhbGxlZC4gV2UgY2FuJ3QKLXRha2UgYSBjaGFuY2Ugb2YgaGF2aW5nIDpjZnVuYzpgTm9kZHlfdHJhdmVyc2VgIGNhbGxlZCB3aGVuIGEgbWVtYmVyJ3MgcmVmZXJlbmNlCitjb2xsZWN0aW9uIGlzIHJ1biwgb3VyIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF90cmF2ZXJzZWAgaGFuZGxlciBjb3VsZCBnZXQgY2FsbGVkLiBXZSBjYW4ndAordGFrZSBhIGNoYW5jZSBvZiBoYXZpbmcgOmM6ZnVuYzpgTm9kZHlfdHJhdmVyc2VgIGNhbGxlZCB3aGVuIGEgbWVtYmVyJ3MgcmVmZXJlbmNlCiBjb3VudCBoYXMgZHJvcHBlZCB0byB6ZXJvIGFuZCBpdHMgdmFsdWUgaGFzbid0IGJlZW4gc2V0IHRvICpOVUxMKi4KIAotUHl0aG9uIDIuNCBhbmQgaGlnaGVyIHByb3ZpZGUgYSA6Y2Z1bmM6YFB5X0NMRUFSYCB0aGF0IGF1dG9tYXRlcyB0aGUgY2FyZWZ1bAotZGVjcmVtZW50aW5nIG9mIHJlZmVyZW5jZSBjb3VudHMuICBXaXRoIDpjZnVuYzpgUHlfQ0xFQVJgLCB0aGUKLTpjZnVuYzpgTm9kZHlfY2xlYXJgIGZ1bmN0aW9uIGNhbiBiZSBzaW1wbGlmaWVkOjoKK1B5dGhvbiAyLjQgYW5kIGhpZ2hlciBwcm92aWRlIGEgOmM6ZnVuYzpgUHlfQ0xFQVJgIHRoYXQgYXV0b21hdGVzIHRoZSBjYXJlZnVsCitkZWNyZW1lbnRpbmcgb2YgcmVmZXJlbmNlIGNvdW50cy4gIFdpdGggOmM6ZnVuYzpgUHlfQ0xFQVJgLCB0aGUKKzpjOmZ1bmM6YE5vZGR5X2NsZWFyYCBmdW5jdGlvbiBjYW4gYmUgc2ltcGxpZmllZDo6CiAKICAgIHN0YXRpYyBpbnQKICAgIE5vZGR5X2NsZWFyKE5vZGR5ICpzZWxmKQpAQCAtODA0LDggKzgwNCw4IEBACiAKICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qdHBfZmxhZ3MqLwogCi1UaGF0J3MgcHJldHR5IG11Y2ggaXQuICBJZiB3ZSBoYWQgd3JpdHRlbiBjdXN0b20gOmF0dHI6YHRwX2FsbG9jYCBvcgotOmF0dHI6YHRwX2ZyZWVgIHNsb3RzLCB3ZSdkIG5lZWQgdG8gbW9kaWZ5IHRoZW0gZm9yIGN5Y2xpYy1nYXJiYWdlIGNvbGxlY3Rpb24uCitUaGF0J3MgcHJldHR5IG11Y2ggaXQuICBJZiB3ZSBoYWQgd3JpdHRlbiBjdXN0b20gOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2FsbG9jYCBvcgorOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2ZyZWVgIHNsb3RzLCB3ZSdkIG5lZWQgdG8gbW9kaWZ5IHRoZW0gZm9yIGN5Y2xpYy1nYXJiYWdlIGNvbGxlY3Rpb24uCiBNb3N0IGV4dGVuc2lvbnMgd2lsbCB1c2UgdGhlIHZlcnNpb25zIGF1dG9tYXRpY2FsbHkgcHJvdmlkZWQuCiAKIApAQCAtODQ1LDcgKzg0NSw3IEBACiAKIFRoZSBwcmltYXJ5IGRpZmZlcmVuY2UgZm9yIGRlcml2ZWQgdHlwZSBvYmplY3RzIGlzIHRoYXQgdGhlIGJhc2UgdHlwZSdzIG9iamVjdAogc3RydWN0dXJlIG11c3QgYmUgdGhlIGZpcnN0IHZhbHVlLiBUaGUgYmFzZSB0eXBlIHdpbGwgYWxyZWFkeSBpbmNsdWRlIHRoZQotOmNmdW5jOmBQeU9iamVjdF9IRUFEYCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBzdHJ1Y3R1cmUuCis6YzpmdW5jOmBQeU9iamVjdF9IRUFEYCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBzdHJ1Y3R1cmUuCiAKIFdoZW4gYSBQeXRob24gb2JqZWN0IGlzIGEgOmNsYXNzOmBTaG9kZHlgIGluc3RhbmNlLCBpdHMgKlB5T2JqZWN0XCoqIHBvaW50ZXIgY2FuCiBiZSBzYWZlbHkgY2FzdCB0byBib3RoICpQeUxpc3RPYmplY3RcKiogYW5kICpTaG9kZHlcKiouIDo6CkBAIC04NjQsMTMgKzg2NCwxMyBAQAogCiBUaGlzIHBhdHRlcm4gaXMgaW1wb3J0YW50IHdoZW4gd3JpdGluZyBhIHR5cGUgd2l0aCBjdXN0b20gOmF0dHI6YG5ld2AgYW5kCiA6YXR0cjpgZGVhbGxvY2AgbWV0aG9kcy4gVGhlIDphdHRyOmBuZXdgIG1ldGhvZCBzaG91bGQgbm90IGFjdHVhbGx5IGNyZWF0ZSB0aGUKLW1lbW9yeSBmb3IgdGhlIG9iamVjdCB3aXRoIDphdHRyOmB0cF9hbGxvY2AsIHRoYXQgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBiYXNlCi1jbGFzcyB3aGVuIGNhbGxpbmcgaXRzIDphdHRyOmB0cF9uZXdgLgorbWVtb3J5IGZvciB0aGUgb2JqZWN0IHdpdGggOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2FsbG9jYCwgdGhhdCB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIGJhc2UKK2NsYXNzIHdoZW4gY2FsbGluZyBpdHMgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX25ld2AuCiAKLVdoZW4gZmlsbGluZyBvdXQgdGhlIDpjZnVuYzpgUHlUeXBlT2JqZWN0YCBmb3IgdGhlIDpjbGFzczpgU2hvZGR5YCB0eXBlLCB5b3Ugc2VlCi1hIHNsb3QgZm9yIDpjZnVuYzpgdHBfYmFzZWAuIER1ZSB0byBjcm9zcyBwbGF0Zm9ybSBjb21waWxlciBpc3N1ZXMsIHlvdSBjYW4ndAotZmlsbCB0aGF0IGZpZWxkIGRpcmVjdGx5IHdpdGggdGhlIDpjZnVuYzpgUHlMaXN0X1R5cGVgOyBpdCBjYW4gYmUgZG9uZSBsYXRlciBpbgotdGhlIG1vZHVsZSdzIDpjZnVuYzpgaW5pdGAgZnVuY3Rpb24uIDo6CitXaGVuIGZpbGxpbmcgb3V0IHRoZSA6YzpmdW5jOmBQeVR5cGVPYmplY3RgIGZvciB0aGUgOmNsYXNzOmBTaG9kZHlgIHR5cGUsIHlvdSBzZWUKK2Egc2xvdCBmb3IgOmM6ZnVuYzpgdHBfYmFzZWAuIER1ZSB0byBjcm9zcyBwbGF0Zm9ybSBjb21waWxlciBpc3N1ZXMsIHlvdSBjYW4ndAorZmlsbCB0aGF0IGZpZWxkIGRpcmVjdGx5IHdpdGggdGhlIDpjOmZ1bmM6YFB5TGlzdF9UeXBlYDsgaXQgY2FuIGJlIGRvbmUgbGF0ZXIgaW4KK3RoZSBtb2R1bGUncyA6YzpmdW5jOmBpbml0YCBmdW5jdGlvbi4gOjoKIAogICAgUHlNT0RJTklUX0ZVTkMKICAgIGluaXRzaG9kZHkodm9pZCkKQEAgLTg4OSwxMiArODg5LDEyIEBACiAgICAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTaG9kZHkiLCAoUHlPYmplY3QgKikgJlNob2RkeVR5cGUpOwogICAgfQogCi1CZWZvcmUgY2FsbGluZyA6Y2Z1bmM6YFB5VHlwZV9SZWFkeWAsIHRoZSB0eXBlIHN0cnVjdHVyZSBtdXN0IGhhdmUgdGhlCi06YXR0cjpgdHBfYmFzZWAgc2xvdCBmaWxsZWQgaW4uIFdoZW4gd2UgYXJlIGRlcml2aW5nIGEgbmV3IHR5cGUsIGl0IGlzIG5vdAotbmVjZXNzYXJ5IHRvIGZpbGwgb3V0IHRoZSA6YXR0cjpgdHBfYWxsb2NgIHNsb3Qgd2l0aCA6Y2Z1bmM6YFB5VHlwZV9HZW5lcmljTmV3YAorQmVmb3JlIGNhbGxpbmcgOmM6ZnVuYzpgUHlUeXBlX1JlYWR5YCwgdGhlIHR5cGUgc3RydWN0dXJlIG11c3QgaGF2ZSB0aGUKKzpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9iYXNlYCBzbG90IGZpbGxlZCBpbi4gV2hlbiB3ZSBhcmUgZGVyaXZpbmcgYSBuZXcgdHlwZSwgaXQgaXMgbm90CituZWNlc3NhcnkgdG8gZmlsbCBvdXQgdGhlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9hbGxvY2Agc2xvdCB3aXRoIDpjOmZ1bmM6YFB5VHlwZV9HZW5lcmljTmV3YAogLS0gdGhlIGFsbG9jYXRlIGZ1bmN0aW9uIGZyb20gdGhlIGJhc2UgdHlwZSB3aWxsIGJlIGluaGVyaXRlZC4KIAotQWZ0ZXIgdGhhdCwgY2FsbGluZyA6Y2Z1bmM6YFB5VHlwZV9SZWFkeWAgYW5kIGFkZGluZyB0aGUgdHlwZSBvYmplY3QgdG8gdGhlCitBZnRlciB0aGF0LCBjYWxsaW5nIDpjOmZ1bmM6YFB5VHlwZV9SZWFkeWAgYW5kIGFkZGluZyB0aGUgdHlwZSBvYmplY3QgdG8gdGhlCiBtb2R1bGUgaXMgdGhlIHNhbWUgYXMgd2l0aCB0aGUgYmFzaWMgOmNsYXNzOmBOb2RkeWAgZXhhbXBsZXMuCiAKIApAQCAtOTA2LDcgKzkwNiw3IEBACiBUaGlzIHNlY3Rpb24gYWltcyB0byBnaXZlIGEgcXVpY2sgZmx5LWJ5IG9uIHRoZSB2YXJpb3VzIHR5cGUgbWV0aG9kcyB5b3UgY2FuCiBpbXBsZW1lbnQgYW5kIHdoYXQgdGhleSBkby4KIAotSGVyZSBpcyB0aGUgZGVmaW5pdGlvbiBvZiA6Y3R5cGU6YFB5VHlwZU9iamVjdGAsIHdpdGggc29tZSBmaWVsZHMgb25seSB1c2VkIGluCitIZXJlIGlzIHRoZSBkZWZpbml0aW9uIG9mIDpjOnR5cGU6YFB5VHlwZU9iamVjdGAsIHdpdGggc29tZSBmaWVsZHMgb25seSB1c2VkIGluCiBkZWJ1ZyBidWlsZHMgb21pdHRlZDoKIAogLi4gbGl0ZXJhbGluY2x1ZGU6OiAuLi9pbmNsdWRlcy90eXBlc3RydWN0LmgKQEAgLTkzNCw3ICs5MzQsNyBAQAogCiBUaGVzZSBmaWVsZHMgdGVsbCB0aGUgcnVudGltZSBob3cgbXVjaCBtZW1vcnkgdG8gYWxsb2NhdGUgd2hlbiBuZXcgb2JqZWN0cyBvZgogdGhpcyB0eXBlIGFyZSBjcmVhdGVkLiAgUHl0aG9uIGhhcyBzb21lIGJ1aWx0LWluIHN1cHBvcnQgZm9yIHZhcmlhYmxlIGxlbmd0aAotc3RydWN0dXJlcyAodGhpbms6IHN0cmluZ3MsIGxpc3RzKSB3aGljaCBpcyB3aGVyZSB0aGUgOmF0dHI6YHRwX2l0ZW1zaXplYCBmaWVsZAorc3RydWN0dXJlcyAodGhpbms6IHN0cmluZ3MsIGxpc3RzKSB3aGljaCBpcyB3aGVyZSB0aGUgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2l0ZW1zaXplYCBmaWVsZAogY29tZXMgaW4uICBUaGlzIHdpbGwgYmUgZGVhbHQgd2l0aCBsYXRlci4gOjoKIAogICAgY2hhciAqdHBfZG9jOwpAQCAtOTg0LDggKzk4NCw4IEBACiBleGVjdXRlZCBtYXkgZGV0ZWN0IHRoYXQgYW4gZXhjZXB0aW9uIGhhcyBiZWVuIHNldC4gIFRoaXMgY2FuIGxlYWQgdG8gbWlzbGVhZGluZwogZXJyb3JzIGZyb20gdGhlIGludGVycHJldGVyLiAgVGhlIHByb3BlciB3YXkgdG8gcHJvdGVjdCBhZ2FpbnN0IHRoaXMgaXMgdG8gc2F2ZQogYSBwZW5kaW5nIGV4Y2VwdGlvbiBiZWZvcmUgcGVyZm9ybWluZyB0aGUgdW5zYWZlIGFjdGlvbiwgYW5kIHJlc3RvcmluZyBpdCB3aGVuCi1kb25lLiAgVGhpcyBjYW4gYmUgZG9uZSB1c2luZyB0aGUgOmNmdW5jOmBQeUVycl9GZXRjaGAgYW5kCi06Y2Z1bmM6YFB5RXJyX1Jlc3RvcmVgIGZ1bmN0aW9uczo6Citkb25lLiAgVGhpcyBjYW4gYmUgZG9uZSB1c2luZyB0aGUgOmM6ZnVuYzpgUHlFcnJfRmV0Y2hgIGFuZAorOmM6ZnVuYzpgUHlFcnJfUmVzdG9yZWAgZnVuY3Rpb25zOjoKIAogICAgc3RhdGljIHZvaWQKICAgIG15X2RlYWxsb2MoUHlPYmplY3QgKm9iaikKQEAgLTEwMjYsMTkgKzEwMjYsMTkgQEAKIG9iamVjdDogdGhlIDpmdW5jOmByZXByYCBmdW5jdGlvbiAob3IgZXF1aXZhbGVudCBiYWNrLXRpY2sgc3ludGF4KSwgdGhlCiA6ZnVuYzpgc3RyYCBmdW5jdGlvbiwgYW5kIHRoZSA6a2V5d29yZDpgcHJpbnRgIHN0YXRlbWVudC4gIEZvciBtb3N0IG9iamVjdHMsIHRoZQogOmtleXdvcmQ6YHByaW50YCBzdGF0ZW1lbnQgaXMgZXF1aXZhbGVudCB0byB0aGUgOmZ1bmM6YHN0cmAgZnVuY3Rpb24sIGJ1dCBpdCBpcwotcG9zc2libGUgdG8gc3BlY2lhbC1jYXNlIHByaW50aW5nIHRvIGEgOmN0eXBlOmBGSUxFXCpgIGlmIG5lY2Vzc2FyeTsgdGhpcyBzaG91bGQKK3Bvc3NpYmxlIHRvIHNwZWNpYWwtY2FzZSBwcmludGluZyB0byBhIDpjOnR5cGU6YEZJTEVcKmAgaWYgbmVjZXNzYXJ5OyB0aGlzIHNob3VsZAogb25seSBiZSBkb25lIGlmIGVmZmljaWVuY3kgaXMgaWRlbnRpZmllZCBhcyBhIHByb2JsZW0gYW5kIHByb2ZpbGluZyBzdWdnZXN0cwogdGhhdCBjcmVhdGluZyBhIHRlbXBvcmFyeSBzdHJpbmcgb2JqZWN0IHRvIGJlIHdyaXR0ZW4gdG8gYSBmaWxlIGlzIHRvbwogZXhwZW5zaXZlLgogCiBUaGVzZSBoYW5kbGVycyBhcmUgYWxsIG9wdGlvbmFsLCBhbmQgbW9zdCB0eXBlcyBhdCBtb3N0IG5lZWQgdG8gaW1wbGVtZW50IHRoZQotOmF0dHI6YHRwX3N0cmAgYW5kIDphdHRyOmB0cF9yZXByYCBoYW5kbGVycy4gOjoKKzpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9zdHJgIGFuZCA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfcmVwcmAgaGFuZGxlcnMuIDo6CiAKICAgIHJlcHJmdW5jIHRwX3JlcHI7CiAgICByZXByZnVuYyB0cF9zdHI7CiAgICBwcmludGZ1bmMgdHBfcHJpbnQ7CiAKLVRoZSA6YXR0cjpgdHBfcmVwcmAgaGFuZGxlciBzaG91bGQgcmV0dXJuIGEgc3RyaW5nIG9iamVjdCBjb250YWluaW5nIGEKK1RoZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfcmVwcmAgaGFuZGxlciBzaG91bGQgcmV0dXJuIGEgc3RyaW5nIG9iamVjdCBjb250YWluaW5nIGEKIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnN0YW5jZSBmb3Igd2hpY2ggaXQgaXMgY2FsbGVkLiAgSGVyZSBpcyBhIHNpbXBsZQogZXhhbXBsZTo6CiAKQEAgLTEwNDksMTUgKzEwNDksMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmotPm9ial9VbmRlcmx5aW5nRGF0YXR5cGVQdHItPnNpemUpOwogICAgfQogCi1JZiBubyA6YXR0cjpgdHBfcmVwcmAgaGFuZGxlciBpcyBzcGVjaWZpZWQsIHRoZSBpbnRlcnByZXRlciB3aWxsIHN1cHBseSBhCi1yZXByZXNlbnRhdGlvbiB0aGF0IHVzZXMgdGhlIHR5cGUncyA6YXR0cjpgdHBfbmFtZWAgYW5kIGEgdW5pcXVlbHktaWRlbnRpZnlpbmcKK0lmIG5vIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9yZXByYCBoYW5kbGVyIGlzIHNwZWNpZmllZCwgdGhlIGludGVycHJldGVyIHdpbGwgc3VwcGx5IGEKK3JlcHJlc2VudGF0aW9uIHRoYXQgdXNlcyB0aGUgdHlwZSdzIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9uYW1lYCBhbmQgYSB1bmlxdWVseS1pZGVudGlmeWluZwogdmFsdWUgZm9yIHRoZSBvYmplY3QuCiAKLVRoZSA6YXR0cjpgdHBfc3RyYCBoYW5kbGVyIGlzIHRvIDpmdW5jOmBzdHJgIHdoYXQgdGhlIDphdHRyOmB0cF9yZXByYCBoYW5kbGVyCitUaGUgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX3N0cmAgaGFuZGxlciBpcyB0byA6ZnVuYzpgc3RyYCB3aGF0IHRoZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfcmVwcmAgaGFuZGxlcgogZGVzY3JpYmVkIGFib3ZlIGlzIHRvIDpmdW5jOmByZXByYDsgdGhhdCBpcywgaXQgaXMgY2FsbGVkIHdoZW4gUHl0aG9uIGNvZGUgY2FsbHMKIDpmdW5jOmBzdHJgIG9uIGFuIGluc3RhbmNlIG9mIHlvdXIgb2JqZWN0LiAgSXRzIGltcGxlbWVudGF0aW9uIGlzIHZlcnkgc2ltaWxhcgotdG8gdGhlIDphdHRyOmB0cF9yZXByYCBmdW5jdGlvbiwgYnV0IHRoZSByZXN1bHRpbmcgc3RyaW5nIGlzIGludGVuZGVkIGZvciBodW1hbgotY29uc3VtcHRpb24uICBJZiA6YXR0cjpgdHBfc3RyYCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgOmF0dHI6YHRwX3JlcHJgIGhhbmRsZXIgaXMKK3RvIHRoZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfcmVwcmAgZnVuY3Rpb24sIGJ1dCB0aGUgcmVzdWx0aW5nIHN0cmluZyBpcyBpbnRlbmRlZCBmb3IgaHVtYW4KK2NvbnN1bXB0aW9uLiAgSWYgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX3N0cmAgaXMgbm90IHNwZWNpZmllZCwgdGhlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9yZXByYCBoYW5kbGVyIGlzCiB1c2VkIGluc3RlYWQuCiAKIEhlcmUgaXMgYSBzaW1wbGUgZXhhbXBsZTo6CkBAIC0xMTEwLDggKzExMTAsOCBAQAogCiBQeXRob24gc3VwcG9ydHMgdHdvIHBhaXJzIG9mIGF0dHJpYnV0ZSBoYW5kbGVyczsgYSB0eXBlIHRoYXQgc3VwcG9ydHMgYXR0cmlidXRlcwogb25seSBuZWVkcyB0byBpbXBsZW1lbnQgdGhlIGZ1bmN0aW9ucyBmb3Igb25lIHBhaXIuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IG9uZQotcGFpciB0YWtlcyB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIGFzIGEgOmN0eXBlOmBjaGFyXCpgLCB3aGlsZSB0aGUgb3RoZXIKLWFjY2VwdHMgYSA6Y3R5cGU6YFB5T2JqZWN0XCpgLiAgRWFjaCB0eXBlIGNhbiB1c2Ugd2hpY2hldmVyIHBhaXIgbWFrZXMgbW9yZQorcGFpciB0YWtlcyB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIGFzIGEgOmM6dHlwZTpgY2hhclwqYCwgd2hpbGUgdGhlIG90aGVyCithY2NlcHRzIGEgOmM6dHlwZTpgUHlPYmplY3RcKmAuICBFYWNoIHR5cGUgY2FuIHVzZSB3aGljaGV2ZXIgcGFpciBtYWtlcyBtb3JlCiBzZW5zZSBmb3IgdGhlIGltcGxlbWVudGF0aW9uJ3MgY29udmVuaWVuY2UuIDo6CiAKICAgIGdldGF0dHJmdW5jICB0cF9nZXRhdHRyOyAgICAgICAgLyogY2hhciAqIHZlcnNpb24gKi8KQEAgLTExMjIsNyArMTEyMiw3IEBACiAKIElmIGFjY2Vzc2luZyBhdHRyaWJ1dGVzIG9mIGFuIG9iamVjdCBpcyBhbHdheXMgYSBzaW1wbGUgb3BlcmF0aW9uICh0aGlzIHdpbGwgYmUKIGV4cGxhaW5lZCBzaG9ydGx5KSwgdGhlcmUgYXJlIGdlbmVyaWMgaW1wbGVtZW50YXRpb25zIHdoaWNoIGNhbiBiZSB1c2VkIHRvCi1wcm92aWRlIHRoZSA6Y3R5cGU6YFB5T2JqZWN0XCpgIHZlcnNpb24gb2YgdGhlIGF0dHJpYnV0ZSBtYW5hZ2VtZW50IGZ1bmN0aW9ucy4KK3Byb3ZpZGUgdGhlIDpjOnR5cGU6YFB5T2JqZWN0XCpgIHZlcnNpb24gb2YgdGhlIGF0dHJpYnV0ZSBtYW5hZ2VtZW50IGZ1bmN0aW9ucy4KIFRoZSBhY3R1YWwgbmVlZCBmb3IgdHlwZS1zcGVjaWZpYyBhdHRyaWJ1dGUgaGFuZGxlcnMgYWxtb3N0IGNvbXBsZXRlbHkKIGRpc2FwcGVhcmVkIHN0YXJ0aW5nIHdpdGggUHl0aG9uIDIuMiwgdGhvdWdoIHRoZXJlIGFyZSBtYW55IGV4YW1wbGVzIHdoaWNoIGhhdmUKIG5vdCBiZWVuIHVwZGF0ZWQgdG8gdXNlIHNvbWUgb2YgdGhlIG5ldyBnZW5lcmljIG1lY2hhbmlzbSB0aGF0IGlzIGF2YWlsYWJsZS4KQEAgLTExMzgsNyArMTEzOCw3IEBACiBNb3N0IGV4dGVuc2lvbiB0eXBlcyBvbmx5IHVzZSAqc2ltcGxlKiBhdHRyaWJ1dGVzLiAgU28sIHdoYXQgbWFrZXMgdGhlCiBhdHRyaWJ1dGVzIHNpbXBsZT8gIFRoZXJlIGFyZSBvbmx5IGEgY291cGxlIG9mIGNvbmRpdGlvbnMgdGhhdCBtdXN0IGJlIG1ldDoKIAotIy4gVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZXMgbXVzdCBiZSBrbm93biB3aGVuIDpjZnVuYzpgUHlUeXBlX1JlYWR5YCBpcworIy4gVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZXMgbXVzdCBiZSBrbm93biB3aGVuIDpjOmZ1bmM6YFB5VHlwZV9SZWFkeWAgaXMKICAgIGNhbGxlZC4KIAogIy4gTm8gc3BlY2lhbCBwcm9jZXNzaW5nIGlzIG5lZWRlZCB0byByZWNvcmQgdGhhdCBhbiBhdHRyaWJ1dGUgd2FzIGxvb2tlZCB1cCBvcgpAQCAtMTE0NywxMiArMTE0NywxMiBAQAogTm90ZSB0aGF0IHRoaXMgbGlzdCBkb2VzIG5vdCBwbGFjZSBhbnkgcmVzdHJpY3Rpb25zIG9uIHRoZSB2YWx1ZXMgb2YgdGhlCiBhdHRyaWJ1dGVzLCB3aGVuIHRoZSB2YWx1ZXMgYXJlIGNvbXB1dGVkLCBvciBob3cgcmVsZXZhbnQgZGF0YSBpcyBzdG9yZWQuCiAKLVdoZW4gOmNmdW5jOmBQeVR5cGVfUmVhZHlgIGlzIGNhbGxlZCwgaXQgdXNlcyB0aHJlZSB0YWJsZXMgcmVmZXJlbmNlZCBieSB0aGUKK1doZW4gOmM6ZnVuYzpgUHlUeXBlX1JlYWR5YCBpcyBjYWxsZWQsIGl0IHVzZXMgdGhyZWUgdGFibGVzIHJlZmVyZW5jZWQgYnkgdGhlCiB0eXBlIG9iamVjdCB0byBjcmVhdGUgOnRlcm06YGRlc2NyaXB0b3JgXHMgd2hpY2ggYXJlIHBsYWNlZCBpbiB0aGUgZGljdGlvbmFyeSBvZiB0aGUKIHR5cGUgb2JqZWN0LiAgRWFjaCBkZXNjcmlwdG9yIGNvbnRyb2xzIGFjY2VzcyB0byBvbmUgYXR0cmlidXRlIG9mIHRoZSBpbnN0YW5jZQogb2JqZWN0LiAgRWFjaCBvZiB0aGUgdGFibGVzIGlzIG9wdGlvbmFsOyBpZiBhbGwgdGhyZWUgYXJlICpOVUxMKiwgaW5zdGFuY2VzIG9mCiB0aGUgdHlwZSB3aWxsIG9ubHkgaGF2ZSBhdHRyaWJ1dGVzIHRoYXQgYXJlIGluaGVyaXRlZCBmcm9tIHRoZWlyIGJhc2UgdHlwZSwgYW5kCi1zaG91bGQgbGVhdmUgdGhlIDphdHRyOmB0cF9nZXRhdHRyb2AgYW5kIDphdHRyOmB0cF9zZXRhdHRyb2AgZmllbGRzICpOVUxMKiBhcworc2hvdWxkIGxlYXZlIHRoZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfZ2V0YXR0cm9gIGFuZCA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfc2V0YXR0cm9gIGZpZWxkcyAqTlVMTCogYXMKIHdlbGwsIGFsbG93aW5nIHRoZSBiYXNlIHR5cGUgdG8gaGFuZGxlIGF0dHJpYnV0ZXMuCiAKIFRoZSB0YWJsZXMgYXJlIGRlY2xhcmVkIGFzIHRocmVlIGZpZWxkcyBvZiB0aGUgdHlwZSBvYmplY3Q6OgpAQCAtMTE2MSw4ICsxMTYxLDggQEAKICAgIHN0cnVjdCBQeU1lbWJlckRlZiAqdHBfbWVtYmVyczsKICAgIHN0cnVjdCBQeUdldFNldERlZiAqdHBfZ2V0c2V0OwogCi1JZiA6YXR0cjpgdHBfbWV0aG9kc2AgaXMgbm90ICpOVUxMKiwgaXQgbXVzdCByZWZlciB0byBhbiBhcnJheSBvZgotOmN0eXBlOmBQeU1ldGhvZERlZmAgc3RydWN0dXJlcy4gIEVhY2ggZW50cnkgaW4gdGhlIHRhYmxlIGlzIGFuIGluc3RhbmNlIG9mIHRoaXMKK0lmIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9tZXRob2RzYCBpcyBub3QgKk5VTEwqLCBpdCBtdXN0IHJlZmVyIHRvIGFuIGFycmF5IG9mCis6Yzp0eXBlOmBQeU1ldGhvZERlZmAgc3RydWN0dXJlcy4gIEVhY2ggZW50cnkgaW4gdGhlIHRhYmxlIGlzIGFuIGluc3RhbmNlIG9mIHRoaXMKIHN0cnVjdHVyZTo6CiAKICAgIHR5cGVkZWYgc3RydWN0IFB5TWV0aG9kRGVmIHsKQEAgLTEyMjUsMTMgKzEyMjUsMTMgQEAKICAgIHNpbmdsZTogV1JJVEVfUkVTVFJJQ1RFRAogICAgc2luZ2xlOiBSRVNUUklDVEVECiAKLUFuIGludGVyZXN0aW5nIGFkdmFudGFnZSBvZiB1c2luZyB0aGUgOmF0dHI6YHRwX21lbWJlcnNgIHRhYmxlIHRvIGJ1aWxkCitBbiBpbnRlcmVzdGluZyBhZHZhbnRhZ2Ugb2YgdXNpbmcgdGhlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9tZW1iZXJzYCB0YWJsZSB0byBidWlsZAogZGVzY3JpcHRvcnMgdGhhdCBhcmUgdXNlZCBhdCBydW50aW1lIGlzIHRoYXQgYW55IGF0dHJpYnV0ZSBkZWZpbmVkIHRoaXMgd2F5IGNhbgogaGF2ZSBhbiBhc3NvY2lhdGVkIGRvYyBzdHJpbmcgc2ltcGx5IGJ5IHByb3ZpZGluZyB0aGUgdGV4dCBpbiB0aGUgdGFibGUuICBBbgogYXBwbGljYXRpb24gY2FuIHVzZSB0aGUgaW50cm9zcGVjdGlvbiBBUEkgdG8gcmV0cmlldmUgdGhlIGRlc2NyaXB0b3IgZnJvbSB0aGUKIGNsYXNzIG9iamVjdCwgYW5kIGdldCB0aGUgZG9jIHN0cmluZyB1c2luZyBpdHMgOmF0dHI6YF9fZG9jX19gIGF0dHJpYnV0ZS4KIAotQXMgd2l0aCB0aGUgOmF0dHI6YHRwX21ldGhvZHNgIHRhYmxlLCBhIHNlbnRpbmVsIGVudHJ5IHdpdGggYSA6YXR0cjpgbmFtZWAgdmFsdWUKK0FzIHdpdGggdGhlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9tZXRob2RzYCB0YWJsZSwgYSBzZW50aW5lbCBlbnRyeSB3aXRoIGEgOmF0dHI6YG5hbWVgIHZhbHVlCiBvZiAqTlVMTCogaXMgcmVxdWlyZWQuCiAKIC4uIFhYWCBEZXNjcmlwdG9ycyBuZWVkIHRvIGJlIGV4cGxhaW5lZCBpbiBtb3JlIGRldGFpbCBzb21ld2hlcmUsIGJ1dCBub3QgaGVyZS4KQEAgLTEyNDcsOSArMTI0Nyw5IEBACiBUeXBlLXNwZWNpZmljIEF0dHJpYnV0ZSBNYW5hZ2VtZW50CiBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCiAKLUZvciBzaW1wbGljaXR5LCBvbmx5IHRoZSA6Y3R5cGU6YGNoYXJcKmAgdmVyc2lvbiB3aWxsIGJlIGRlbW9uc3RyYXRlZCBoZXJlOyB0aGUKLXR5cGUgb2YgdGhlIG5hbWUgcGFyYW1ldGVyIGlzIHRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgOmN0eXBlOmBjaGFyXCpgCi1hbmQgOmN0eXBlOmBQeU9iamVjdFwqYCBmbGF2b3JzIG9mIHRoZSBpbnRlcmZhY2UuIFRoaXMgZXhhbXBsZSBlZmZlY3RpdmVseSBkb2VzCitGb3Igc2ltcGxpY2l0eSwgb25seSB0aGUgOmM6dHlwZTpgY2hhclwqYCB2ZXJzaW9uIHdpbGwgYmUgZGVtb25zdHJhdGVkIGhlcmU7IHRoZQordHlwZSBvZiB0aGUgbmFtZSBwYXJhbWV0ZXIgaXMgdGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSA6Yzp0eXBlOmBjaGFyXCpgCithbmQgOmM6dHlwZTpgUHlPYmplY3RcKmAgZmxhdm9ycyBvZiB0aGUgaW50ZXJmYWNlLiBUaGlzIGV4YW1wbGUgZWZmZWN0aXZlbHkgZG9lcwogdGhlIHNhbWUgdGhpbmcgYXMgdGhlIGdlbmVyaWMgZXhhbXBsZSBhYm92ZSwgYnV0IGRvZXMgbm90IHVzZSB0aGUgZ2VuZXJpYwogc3VwcG9ydCBhZGRlZCBpbiBQeXRob24gMi4yLiAgVGhlIHZhbHVlIGluIHNob3dpbmcgdGhpcyBpcyB0d28tZm9sZDogaXQKIGRlbW9uc3RyYXRlcyBob3cgYmFzaWMgYXR0cmlidXRlIG1hbmFnZW1lbnQgY2FuIGJlIGRvbmUgaW4gYSB3YXkgdGhhdCBpcwpAQCAtMTI1NywxNSArMTI1NywxNSBAQAogY2FsbGVkLCBzbyB0aGF0IGlmIHlvdSBkbyBuZWVkIHRvIGV4dGVuZCB0aGVpciBmdW5jdGlvbmFsaXR5LCB5b3UnbGwgdW5kZXJzdGFuZAogd2hhdCBuZWVkcyB0byBiZSBkb25lLgogCi1UaGUgOmF0dHI6YHRwX2dldGF0dHJgIGhhbmRsZXIgaXMgY2FsbGVkIHdoZW4gdGhlIG9iamVjdCByZXF1aXJlcyBhbiBhdHRyaWJ1dGUKK1RoZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfZ2V0YXR0cmAgaGFuZGxlciBpcyBjYWxsZWQgd2hlbiB0aGUgb2JqZWN0IHJlcXVpcmVzIGFuIGF0dHJpYnV0ZQogbG9vay11cC4gIEl0IGlzIGNhbGxlZCBpbiB0aGUgc2FtZSBzaXR1YXRpb25zIHdoZXJlIHRoZSA6bWV0aDpgX19nZXRhdHRyX19gCiBtZXRob2Qgb2YgYSBjbGFzcyB3b3VsZCBiZSBjYWxsZWQuCiAKIEEgbGlrZWx5IHdheSB0byBoYW5kbGUgdGhpcyBpcyAoMSkgdG8gaW1wbGVtZW50IGEgc2V0IG9mIGZ1bmN0aW9ucyAoc3VjaCBhcwotOmNmdW5jOmBuZXdkYXRhdHlwZV9nZXRTaXplYCBhbmQgOmNmdW5jOmBuZXdkYXRhdHlwZV9zZXRTaXplYCBpbiB0aGUgZXhhbXBsZQorOmM6ZnVuYzpgbmV3ZGF0YXR5cGVfZ2V0U2l6ZWAgYW5kIDpjOmZ1bmM6YG5ld2RhdGF0eXBlX3NldFNpemVgIGluIHRoZSBleGFtcGxlCiBiZWxvdyksICgyKSBwcm92aWRlIGEgbWV0aG9kIHRhYmxlIGxpc3RpbmcgdGhlc2UgZnVuY3Rpb25zLCBhbmQgKDMpIHByb3ZpZGUgYQogZ2V0YXR0ciBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBhIGxvb2t1cCBpbiB0aGF0IHRhYmxlLiAgVGhlIG1ldGhvZAotdGFibGUgdXNlcyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgdGhlIDphdHRyOmB0cF9tZXRob2RzYCBmaWVsZCBvZiB0aGUgdHlwZQordGFibGUgdXNlcyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgdGhlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9tZXRob2RzYCBmaWVsZCBvZiB0aGUgdHlwZQogb2JqZWN0LgogCiBIZXJlIGlzIGFuIGV4YW1wbGU6OgpAQCAtMTI4NCwxMSArMTI4NCwxMSBAQAogICAgICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKG5ld2RhdGF0eXBlX21ldGhvZHMsIChQeU9iamVjdCAqKW9iaiwgbmFtZSk7CiAgICB9CiAKLVRoZSA6YXR0cjpgdHBfc2V0YXR0cmAgaGFuZGxlciBpcyBjYWxsZWQgd2hlbiB0aGUgOm1ldGg6YF9fc2V0YXR0cl9fYCBvcgorVGhlIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9zZXRhdHRyYCBoYW5kbGVyIGlzIGNhbGxlZCB3aGVuIHRoZSA6bWV0aDpgX19zZXRhdHRyX19gIG9yCiA6bWV0aDpgX19kZWxhdHRyX19gIG1ldGhvZCBvZiBhIGNsYXNzIGluc3RhbmNlIHdvdWxkIGJlIGNhbGxlZC4gIFdoZW4gYW4KIGF0dHJpYnV0ZSBzaG91bGQgYmUgZGVsZXRlZCwgdGhlIHRoaXJkIHBhcmFtZXRlciB3aWxsIGJlICpOVUxMKi4gIEhlcmUgaXMgYW4KIGV4YW1wbGUgdGhhdCBzaW1wbHkgcmFpc2VzIGFuIGV4Y2VwdGlvbjsgaWYgdGhpcyB3ZXJlIHJlYWxseSBhbGwgeW91IHdhbnRlZCwgdGhlCi06YXR0cjpgdHBfc2V0YXR0cmAgaGFuZGxlciBzaG91bGQgYmUgc2V0IHRvICpOVUxMKi4gOjoKKzpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9zZXRhdHRyYCBoYW5kbGVyIHNob3VsZCBiZSBzZXQgdG8gKk5VTEwqLiA6OgogCiAgICBzdGF0aWMgaW50CiAgICBuZXdkYXRhdHlwZV9zZXRhdHRyKG5ld2RhdGF0eXBlb2JqZWN0ICpvYmosIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp2KQpAQCAtMTMwNSwxMCArMTMwNSwxMCBAQAogCiAgICBjbXBmdW5jIHRwX2NvbXBhcmU7CiAKLVRoZSA6YXR0cjpgdHBfY29tcGFyZWAgaGFuZGxlciBpcyBjYWxsZWQgd2hlbiBjb21wYXJpc29ucyBhcmUgbmVlZGVkIGFuZCB0aGUKK1RoZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfY29tcGFyZWAgaGFuZGxlciBpcyBjYWxsZWQgd2hlbiBjb21wYXJpc29ucyBhcmUgbmVlZGVkIGFuZCB0aGUKIG9iamVjdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIHNwZWNpZmljIHJpY2ggY29tcGFyaXNvbiBtZXRob2Qgd2hpY2ggbWF0Y2hlcyB0aGUKIHJlcXVlc3RlZCBjb21wYXJpc29uLiAgKEl0IGlzIGFsd2F5cyB1c2VkIGlmIGRlZmluZWQgYW5kIHRoZQotOmNmdW5jOmBQeU9iamVjdF9Db21wYXJlYCBvciA6Y2Z1bmM6YFB5T2JqZWN0X0NtcGAgZnVuY3Rpb25zIGFyZSB1c2VkLCBvciBpZgorOmM6ZnVuYzpgUHlPYmplY3RfQ29tcGFyZWAgb3IgOmM6ZnVuYzpgUHlPYmplY3RfQ21wYCBmdW5jdGlvbnMgYXJlIHVzZWQsIG9yIGlmCiA6ZnVuYzpgY21wYCBpcyB1c2VkIGZyb20gUHl0aG9uLikgSXQgaXMgYW5hbG9nb3VzIHRvIHRoZSA6bWV0aDpgX19jbXBfX2AgbWV0aG9kLgogVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGBgLTFgYCBpZiAqb2JqMSogaXMgbGVzcyB0aGFuICpvYmoyKiwgYGAwYGAgaWYgdGhleQogYXJlIGVxdWFsLCBhbmQgYGAxYGAgaWYgKm9iajEqIGlzIGdyZWF0ZXIgdGhhbiAqb2JqMiouIChJdCB3YXMgcHJldmlvdXNseQpAQCAtMTMxNiw5ICsxMzE2LDkgQEAKIGdyZWF0ZXIgdGhhbiwgcmVzcGVjdGl2ZWx5OyBhcyBvZiBQeXRob24gMi4yLCB0aGlzIGlzIG5vIGxvbmdlciBhbGxvd2VkLiAgSW4gdGhlCiBmdXR1cmUsIG90aGVyIHJldHVybiB2YWx1ZXMgbWF5IGJlIGFzc2lnbmVkIGEgZGlmZmVyZW50IG1lYW5pbmcuKQogCi1BIDphdHRyOmB0cF9jb21wYXJlYCBoYW5kbGVyIG1heSByYWlzZSBhbiBleGNlcHRpb24uICBJbiB0aGlzIGNhc2UgaXQgc2hvdWxkCitBIDpjOm1lbWJlcjpgflB5VHlwZU9iamVjdC50cF9jb21wYXJlYCBoYW5kbGVyIG1heSByYWlzZSBhbiBleGNlcHRpb24uICBJbiB0aGlzIGNhc2UgaXQgc2hvdWxkCiByZXR1cm4gYSBuZWdhdGl2ZSB2YWx1ZS4gIFRoZSBjYWxsZXIgaGFzIHRvIHRlc3QgZm9yIHRoZSBleGNlcHRpb24gdXNpbmcKLTpjZnVuYzpgUHlFcnJfT2NjdXJyZWRgLgorOmM6ZnVuYzpgUHlFcnJfT2NjdXJyZWRgLgogCiBIZXJlIGlzIGEgc2FtcGxlIGltcGxlbWVudGF0aW9uOjoKIApAQCAtMTM2MCwxNCArMTM2MCwxNCBAQAogYml0IGRvZXMgbm90IGluZGljYXRlIHRoYXQgdGhlIHNsb3QgdmFsdWVzIGFyZSBub24tKk5VTEwqLiBUaGUgZmxhZyBtYXkgYmUgc2V0CiB0byBpbmRpY2F0ZSB0aGUgcHJlc2VuY2Ugb2YgYSBzbG90LCBidXQgYSBzbG90IG1heSBzdGlsbCBiZSB1bmZpbGxlZC4pIDo6CiAKLSAgIFB5TnVtYmVyTWV0aG9kcyAgIHRwX2FzX251bWJlcjsKLSAgIFB5U2VxdWVuY2VNZXRob2RzIHRwX2FzX3NlcXVlbmNlOwotICAgUHlNYXBwaW5nTWV0aG9kcyAgdHBfYXNfbWFwcGluZzsKKyAgIFB5TnVtYmVyTWV0aG9kcyAgICp0cF9hc19udW1iZXI7CisgICBQeVNlcXVlbmNlTWV0aG9kcyAqdHBfYXNfc2VxdWVuY2U7CisgICBQeU1hcHBpbmdNZXRob2RzICAqdHBfYXNfbWFwcGluZzsKIAogSWYgeW91IHdpc2ggeW91ciBvYmplY3QgdG8gYmUgYWJsZSB0byBhY3QgbGlrZSBhIG51bWJlciwgYSBzZXF1ZW5jZSwgb3IgYQogbWFwcGluZyBvYmplY3QsIHRoZW4geW91IHBsYWNlIHRoZSBhZGRyZXNzIG9mIGEgc3RydWN0dXJlIHRoYXQgaW1wbGVtZW50cyB0aGUgQwotdHlwZSA6Y3R5cGU6YFB5TnVtYmVyTWV0aG9kc2AsIDpjdHlwZTpgUHlTZXF1ZW5jZU1ldGhvZHNgLCBvcgotOmN0eXBlOmBQeU1hcHBpbmdNZXRob2RzYCwgcmVzcGVjdGl2ZWx5LiBJdCBpcyB1cCB0byB5b3UgdG8gZmlsbCBpbiB0aGlzCit0eXBlIDpjOnR5cGU6YFB5TnVtYmVyTWV0aG9kc2AsIDpjOnR5cGU6YFB5U2VxdWVuY2VNZXRob2RzYCwgb3IKKzpjOnR5cGU6YFB5TWFwcGluZ01ldGhvZHNgLCByZXNwZWN0aXZlbHkuIEl0IGlzIHVwIHRvIHlvdSB0byBmaWxsIGluIHRoaXMKIHN0cnVjdHVyZSB3aXRoIGFwcHJvcHJpYXRlIHZhbHVlcy4gWW91IGNhbiBmaW5kIGV4YW1wbGVzIG9mIHRoZSB1c2Ugb2YgZWFjaCBvZgogdGhlc2UgaW4gdGhlIDpmaWxlOmBPYmplY3RzYCBkaXJlY3Rvcnkgb2YgdGhlIFB5dGhvbiBzb3VyY2UgZGlzdHJpYnV0aW9uLiA6OgogCkBAIC0xMzkxLDcgKzEzOTEsNyBAQAogCiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFuIGluc3RhbmNlIG9mIHlvdXIgZGF0YSB0eXBlIGlzICJjYWxsZWQiLCBmb3IKIGV4YW1wbGUsIGlmIGBgb2JqMWBgIGlzIGFuIGluc3RhbmNlIG9mIHlvdXIgZGF0YSB0eXBlIGFuZCB0aGUgUHl0aG9uIHNjcmlwdAotY29udGFpbnMgYGBvYmoxKCdoZWxsbycpYGAsIHRoZSA6YXR0cjpgdHBfY2FsbGAgaGFuZGxlciBpcyBpbnZva2VkLgorY29udGFpbnMgYGBvYmoxKCdoZWxsbycpYGAsIHRoZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfY2FsbGAgaGFuZGxlciBpcyBpbnZva2VkLgogCiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRocmVlIGFyZ3VtZW50czoKIApAQCAtMTM5OSwxMSArMTM5OSwxMSBAQAogICAgdGhlIGNhbGwgaXMgYGBvYmoxKCdoZWxsbycpYGAsIHRoZW4gKmFyZzEqIGlzIGBgb2JqMWBgLgogCiAjLiAqYXJnMiogaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBhcmd1bWVudHMgdG8gdGhlIGNhbGwuICBZb3UgY2FuIHVzZQotICAgOmNmdW5jOmBQeUFyZ19QYXJzZVR1cGxlYCB0byBleHRyYWN0IHRoZSBhcmd1bWVudHMuCisgICA6YzpmdW5jOmBQeUFyZ19QYXJzZVR1cGxlYCB0byBleHRyYWN0IHRoZSBhcmd1bWVudHMuCiAKICMuICphcmczKiBpcyBhIGRpY3Rpb25hcnkgb2Yga2V5d29yZCBhcmd1bWVudHMgdGhhdCB3ZXJlIHBhc3NlZC4gSWYgdGhpcyBpcwogICAgbm9uLSpOVUxMKiBhbmQgeW91IHN1cHBvcnQga2V5d29yZCBhcmd1bWVudHMsIHVzZQotICAgOmNmdW5jOmBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNgIHRvIGV4dHJhY3QgdGhlIGFyZ3VtZW50cy4gIElmIHlvdSBkbyBub3QKKyAgIDpjOmZ1bmM6YFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc2AgdG8gZXh0cmFjdCB0aGUgYXJndW1lbnRzLiAgSWYgeW91IGRvIG5vdAogICAgd2FudCB0byBzdXBwb3J0IGtleXdvcmQgYXJndW1lbnRzIGFuZCB0aGlzIGlzIG5vbi0qTlVMTCosIHJhaXNlIGEKICAgIDpleGM6YFR5cGVFcnJvcmAgd2l0aCBhIG1lc3NhZ2Ugc2F5aW5nIHRoYXQga2V5d29yZCBhcmd1bWVudHMgYXJlIG5vdCBzdXBwb3J0ZWQuCiAKQEAgLTE0NzgsOSArMTQ3OCw5IEBACiB0aG9zZSBvYmplY3RzIHdoaWNoIGRvIG5vdCBiZW5lZml0IGJ5IHdlYWsgcmVmZXJlbmNpbmcgKHN1Y2ggYXMgbnVtYmVycykuCiAKIEZvciBhbiBvYmplY3QgdG8gYmUgd2Vha2x5IHJlZmVyZW5jYWJsZSwgdGhlIGV4dGVuc2lvbiBtdXN0IGluY2x1ZGUgYQotOmN0eXBlOmBQeU9iamVjdFwqYCBmaWVsZCBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlIGZvciB0aGUgdXNlIG9mIHRoZSB3ZWFrCis6Yzp0eXBlOmBQeU9iamVjdFwqYCBmaWVsZCBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlIGZvciB0aGUgdXNlIG9mIHRoZSB3ZWFrCiByZWZlcmVuY2UgbWVjaGFuaXNtOyBpdCBtdXN0IGJlIGluaXRpYWxpemVkIHRvICpOVUxMKiBieSB0aGUgb2JqZWN0J3MKLWNvbnN0cnVjdG9yLiAgSXQgbXVzdCBhbHNvIHNldCB0aGUgOmF0dHI6YHRwX3dlYWtsaXN0b2Zmc2V0YCBmaWVsZCBvZiB0aGUKK2NvbnN0cnVjdG9yLiAgSXQgbXVzdCBhbHNvIHNldCB0aGUgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX3dlYWtsaXN0b2Zmc2V0YCBmaWVsZCBvZiB0aGUKIGNvcnJlc3BvbmRpbmcgdHlwZSBvYmplY3QgdG8gdGhlIG9mZnNldCBvZiB0aGUgZmllbGQuIEZvciBleGFtcGxlLCB0aGUgaW5zdGFuY2UKIHR5cGUgaXMgZGVmaW5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOjoKIApAQCAtMTUyMSw5ICsxNTIxLDggQEAKICAgIH0KIAogVGhlIG9ubHkgZnVydGhlciBhZGRpdGlvbiBpcyB0aGF0IHRoZSBkZXN0cnVjdG9yIG5lZWRzIHRvIGNhbGwgdGhlIHdlYWsKLXJlZmVyZW5jZSBtYW5hZ2VyIHRvIGNsZWFyIGFueSB3ZWFrIHJlZmVyZW5jZXMuICBUaGlzIHNob3VsZCBiZSBkb25lIGJlZm9yZSBhbnkKLW90aGVyIHBhcnRzIG9mIHRoZSBkZXN0cnVjdGlvbiBoYXZlIG9jY3VycmVkLCBidXQgaXMgb25seSByZXF1aXJlZCBpZiB0aGUgd2VhawotcmVmZXJlbmNlIGxpc3QgaXMgbm9uLSpOVUxMKjo6CityZWZlcmVuY2UgbWFuYWdlciB0byBjbGVhciBhbnkgd2VhayByZWZlcmVuY2VzLiAgVGhpcyBpcyBvbmx5IHJlcXVpcmVkIGlmIHRoZQord2VhayByZWZlcmVuY2UgbGlzdCBpcyBub24tKk5VTEwqOjoKIAogICAgc3RhdGljIHZvaWQKICAgIGluc3RhbmNlX2RlYWxsb2MoUHlJbnN0YW5jZU9iamVjdCAqaW5zdCkKQEAgLTE1NTQsNyArMTU1Myw3IEBACiBleGFtcGxlcyBvZiB0aGUgZnVuY3Rpb24geW91IHdhbnQgdG8gaW1wbGVtZW50LgogCiBXaGVuIHlvdSBuZWVkIHRvIHZlcmlmeSB0aGF0IGFuIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgdHlwZSB5b3UgYXJlCi1pbXBsZW1lbnRpbmcsIHVzZSB0aGUgOmNmdW5jOmBQeU9iamVjdF9UeXBlQ2hlY2tgIGZ1bmN0aW9uLiBBIHNhbXBsZSBvZiBpdHMgdXNlCitpbXBsZW1lbnRpbmcsIHVzZSB0aGUgOmM6ZnVuYzpgUHlPYmplY3RfVHlwZUNoZWNrYCBmdW5jdGlvbi4gQSBzYW1wbGUgb2YgaXRzIHVzZQogbWlnaHQgYmUgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZzo6CiAKICAgIGlmICghIFB5T2JqZWN0X1R5cGVDaGVjayhzb21lX29iamVjdCwgJk15VHlwZSkpIHsKQEAgLTE1NjcsNyArMTU2Niw3IEBACiAuLiBbI10gVGhpcyBpcyB0cnVlIHdoZW4gd2Uga25vdyB0aGF0IHRoZSBvYmplY3QgaXMgYSBiYXNpYyB0eXBlLCBsaWtlIGEgc3RyaW5nIG9yIGEKICAgIGZsb2F0LgogCi0uLiBbI10gV2UgcmVsaWVkIG9uIHRoaXMgaW4gdGhlIDphdHRyOmB0cF9kZWFsbG9jYCBoYW5kbGVyIGluIHRoaXMgZXhhbXBsZSwgYmVjYXVzZSBvdXIKKy4uIFsjXSBXZSByZWxpZWQgb24gdGhpcyBpbiB0aGUgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2RlYWxsb2NgIGhhbmRsZXIgaW4gdGhpcyBleGFtcGxlLCBiZWNhdXNlIG91cgogICAgdHlwZSBkb2Vzbid0IHN1cHBvcnQgZ2FyYmFnZSBjb2xsZWN0aW9uLiBFdmVuIGlmIGEgdHlwZSBzdXBwb3J0cyBnYXJiYWdlCiAgICBjb2xsZWN0aW9uLCB0aGVyZSBhcmUgY2FsbHMgdGhhdCBjYW4gYmUgbWFkZSB0byAidW50cmFjayIgdGhlIG9iamVjdCBmcm9tCiAgICBnYXJiYWdlIGNvbGxlY3Rpb24sIGhvd2V2ZXIsIHRoZXNlIGNhbGxzIGFyZSBhZHZhbmNlZCBhbmQgbm90IGNvdmVyZWQgaGVyZS4KZGlmZiAtLWdpdCBhL0RvYy9leHRlbmRpbmcvd2luZG93cy5yc3QgYi9Eb2MvZXh0ZW5kaW5nL3dpbmRvd3MucnN0CmluZGV4IGJlYjJlZTQuLjY2YjUxOGQgMTAwNjQ0Ci0tLSBhL0RvYy9leHRlbmRpbmcvd2luZG93cy5yc3QKKysrIGIvRG9jL2V4dGVuZGluZy93aW5kb3dzLnJzdApAQCAtOTgsOCArOTgsOCBAQAogICAgaXQuICBDb3B5IHlvdXIgQyBzb3VyY2VzIGludG8gaXQuICBOb3RlIHRoYXQgdGhlIG1vZHVsZSBzb3VyY2UgZmlsZSBuYW1lIGRvZXMKICAgIG5vdCBuZWNlc3NhcmlseSBoYXZlIHRvIG1hdGNoIHRoZSBtb2R1bGUgbmFtZSwgYnV0IHRoZSBuYW1lIG9mIHRoZQogICAgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gc2hvdWxkIG1hdGNoIHRoZSBtb2R1bGUgbmFtZSAtLS0geW91IGNhbiBvbmx5IGltcG9ydCBhCi0gICBtb2R1bGUgOm1vZDpgc3BhbWAgaWYgaXRzIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGlzIGNhbGxlZCA6Y2Z1bmM6YGluaXRzcGFtYCwKLSAgIGFuZCBpdCBzaG91bGQgY2FsbCA6Y2Z1bmM6YFB5X0luaXRNb2R1bGVgIHdpdGggdGhlIHN0cmluZyBgYCJzcGFtImBgIGFzIGl0cworICAgbW9kdWxlIDptb2Q6YHNwYW1gIGlmIGl0cyBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBpcyBjYWxsZWQgOmM6ZnVuYzpgaW5pdHNwYW1gLAorICAgYW5kIGl0IHNob3VsZCBjYWxsIDpjOmZ1bmM6YFB5X0luaXRNb2R1bGVgIHdpdGggdGhlIHN0cmluZyBgYCJzcGFtImBgIGFzIGl0cwogICAgZmlyc3QgYXJndW1lbnQgKHVzZSB0aGUgbWluaW1hbCA6ZmlsZTpgZXhhbXBsZS5jYCBpbiB0aGlzIGRpcmVjdG9yeSBhcyBhIGd1aWRlKS4KICAgIEJ5IGNvbnZlbnRpb24sIGl0IGxpdmVzIGluIGEgZmlsZSBjYWxsZWQgOmZpbGU6YHNwYW0uY2Agb3IgOmZpbGU6YHNwYW1tb2R1bGUuY2AuCiAgICBUaGUgb3V0cHV0IGZpbGUgc2hvdWxkIGJlIGNhbGxlZCA6ZmlsZTpgc3BhbS5weWRgIChpbiBSZWxlYXNlIG1vZGUpIG9yCkBAIC0yNjMsNyArMjYzLDcgQEAKIAogVGhlIGZpcnN0IGNvbW1hbmQgY3JlYXRlZCB0aHJlZSBmaWxlczogOmZpbGU6YHNwYW0ub2JqYCwgOmZpbGU6YHNwYW0uZGxsYCBhbmQKIDpmaWxlOmBzcGFtLmxpYmAuICA6ZmlsZTpgU3BhbS5kbGxgIGRvZXMgbm90IGNvbnRhaW4gYW55IFB5dGhvbiBmdW5jdGlvbnMgKHN1Y2gKLWFzIDpjZnVuYzpgUHlBcmdfUGFyc2VUdXBsZWApLCBidXQgaXQgZG9lcyBrbm93IGhvdyB0byBmaW5kIHRoZSBQeXRob24gY29kZQorYXMgOmM6ZnVuYzpgUHlBcmdfUGFyc2VUdXBsZWApLCBidXQgaXQgZG9lcyBrbm93IGhvdyB0byBmaW5kIHRoZSBQeXRob24gY29kZQogdGhhbmtzIHRvIDpmaWxlOmBweXRob25YWS5saWJgLgogCiBUaGUgc2Vjb25kIGNvbW1hbmQgY3JlYXRlZCA6ZmlsZTpgbmkuZGxsYCAoYW5kIDpmaWxlOmAub2JqYCBhbmQgOmZpbGU6YC5saWJgKSwKZGlmZiAtLWdpdCBhL0RvYy9mYXEvZGVzaWduLnJzdCBiL0RvYy9mYXEvZGVzaWduLnJzdAppbmRleCA5NjJiNGVmLi42NmIwNjUyIDEwMDY0NAotLS0gYS9Eb2MvZmFxL2Rlc2lnbi5yc3QKKysrIGIvRG9jL2ZhcS9kZXNpZ24ucnN0CkBAIC0yMjUsNyArMjI1LDcgQEAKIGdlbmVyaWMgZm9yIGEgZ3JvdXAgb2YgdHlwZXMgYW5kIHdoaWNoIHdlcmUgaW50ZW5kZWQgdG8gd29yayBldmVuIGZvciBvYmplY3RzCiB0aGF0IGRpZG4ndCBoYXZlIG1ldGhvZHMgYXQgYWxsIChlLmcuIHR1cGxlcykuICBJdCBpcyBhbHNvIGNvbnZlbmllbnQgdG8gaGF2ZSBhCiBmdW5jdGlvbiB0aGF0IGNhbiByZWFkaWx5IGJlIGFwcGxpZWQgdG8gYW4gYW1vcnBob3VzIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyB3aGVuCi15b3UgdXNlIHRoZSBmdW5jdGlvbmFsIGZlYXR1cmVzIG9mIFB5dGhvbiAoYGBtYXAoKWBgLCBgYGFwcGx5KClgYCBldCBhbCkuCit5b3UgdXNlIHRoZSBmdW5jdGlvbmFsIGZlYXR1cmVzIG9mIFB5dGhvbiAoYGBtYXAoKWBgLCBgYHppcCgpYGAgZXQgYWwpLgogCiBJbiBmYWN0LCBpbXBsZW1lbnRpbmcgYGBsZW4oKWBgLCBgYG1heCgpYGAsIGBgbWluKClgYCBhcyBhIGJ1aWx0LWluIGZ1bmN0aW9uIGlzCiBhY3R1YWxseSBsZXNzIGNvZGUgdGhhbiBpbXBsZW1lbnRpbmcgdGhlbSBhcyBtZXRob2RzIGZvciBlYWNoIHR5cGUuICBPbmUgY2FuCkBAIC0yOTcsOCArMjk3LDkgQEAKIEhvdyBmYXN0IGFyZSBleGNlcHRpb25zPwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUEgdHJ5L2V4Y2VwdCBibG9jayBpcyBleHRyZW1lbHkgZWZmaWNpZW50LiAgQWN0dWFsbHkgY2F0Y2hpbmcgYW4gZXhjZXB0aW9uIGlzCi1leHBlbnNpdmUuICBJbiB2ZXJzaW9ucyBvZiBQeXRob24gcHJpb3IgdG8gMi4wIGl0IHdhcyBjb21tb24gdG8gdXNlIHRoaXMgaWRpb206OgorQSB0cnkvZXhjZXB0IGJsb2NrIGlzIGV4dHJlbWVseSBlZmZpY2llbnQgaWYgbm8gZXhjZXB0aW9ucyBhcmUgcmFpc2VkLiAgQWN0dWFsbHkKK2NhdGNoaW5nIGFuIGV4Y2VwdGlvbiBpcyBleHBlbnNpdmUuICBJbiB2ZXJzaW9ucyBvZiBQeXRob24gcHJpb3IgdG8gMi4wIGl0IHdhcworY29tbW9uIHRvIHVzZSB0aGlzIGlkaW9tOjoKIAogICAgdHJ5OgogICAgICAgIHZhbHVlID0gbXlkaWN0W2tleV0KQEAgLTMwOSwxMSArMzEwLDEwIEBACiBUaGlzIG9ubHkgbWFkZSBzZW5zZSB3aGVuIHlvdSBleHBlY3RlZCB0aGUgZGljdCB0byBoYXZlIHRoZSBrZXkgYWxtb3N0IGFsbCB0aGUKIHRpbWUuICBJZiB0aGF0IHdhc24ndCB0aGUgY2FzZSwgeW91IGNvZGVkIGl0IGxpa2UgdGhpczo6CiAKLSAgIGlmIG15ZGljdC5oYXNfa2V5KGtleSk6CisgICBpZiBrZXkgaW4gbXlkaWN0OgogICAgICAgIHZhbHVlID0gbXlkaWN0W2tleV0KICAgIGVsc2U6Ci0gICAgICAgbXlkaWN0W2tleV0gPSBnZXR2YWx1ZShrZXkpCi0gICAgICAgdmFsdWUgPSBteWRpY3Rba2V5XQorICAgICAgIHZhbHVlID0gbXlkaWN0W2tleV0gPSBnZXR2YWx1ZShrZXkpCiAKIC4uIG5vdGU6OgogCkBAIC0zNzAsMjUgKzM3MCwyMiBAQAogCiBBbnN3ZXIgMjogRm9ydHVuYXRlbHksIHRoZXJlIGlzIGBTdGFja2xlc3MgUHl0aG9uIDxodHRwOi8vd3d3LnN0YWNrbGVzcy5jb20+YF8sCiB3aGljaCBoYXMgYSBjb21wbGV0ZWx5IHJlZGVzaWduZWQgaW50ZXJwcmV0ZXIgbG9vcCB0aGF0IGF2b2lkcyB0aGUgQyBzdGFjay4KLUl0J3Mgc3RpbGwgZXhwZXJpbWVudGFsIGJ1dCBsb29rcyB2ZXJ5IHByb21pc2luZy4gIEFsdGhvdWdoIGl0IGlzIGJpbmFyeQotY29tcGF0aWJsZSB3aXRoIHN0YW5kYXJkIFB5dGhvbiwgaXQncyBzdGlsbCB1bmNsZWFyIHdoZXRoZXIgU3RhY2tsZXNzIHdpbGwgbWFrZQotaXQgaW50byB0aGUgY29yZSAtLSBtYXliZSBpdCdzIGp1c3QgdG9vIHJldm9sdXRpb25hcnkuCiAKIAotV2h5IGNhbid0IGxhbWJkYSBmb3JtcyBjb250YWluIHN0YXRlbWVudHM/Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1doeSBjYW4ndCBsYW1iZGEgZXhwcmVzc2lvbnMgY29udGFpbiBzdGF0ZW1lbnRzPworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVB5dGhvbiBsYW1iZGEgZm9ybXMgY2Fubm90IGNvbnRhaW4gc3RhdGVtZW50cyBiZWNhdXNlIFB5dGhvbidzIHN5bnRhY3RpYworUHl0aG9uIGxhbWJkYSBleHByZXNzaW9ucyBjYW5ub3QgY29udGFpbiBzdGF0ZW1lbnRzIGJlY2F1c2UgUHl0aG9uJ3Mgc3ludGFjdGljCiBmcmFtZXdvcmsgY2FuJ3QgaGFuZGxlIHN0YXRlbWVudHMgbmVzdGVkIGluc2lkZSBleHByZXNzaW9ucy4gIEhvd2V2ZXIsIGluCiBQeXRob24sIHRoaXMgaXMgbm90IGEgc2VyaW91cyBwcm9ibGVtLiAgVW5saWtlIGxhbWJkYSBmb3JtcyBpbiBvdGhlciBsYW5ndWFnZXMsCiB3aGVyZSB0aGV5IGFkZCBmdW5jdGlvbmFsaXR5LCBQeXRob24gbGFtYmRhcyBhcmUgb25seSBhIHNob3J0aGFuZCBub3RhdGlvbiBpZgogeW91J3JlIHRvbyBsYXp5IHRvIGRlZmluZSBhIGZ1bmN0aW9uLgogCiBGdW5jdGlvbnMgYXJlIGFscmVhZHkgZmlyc3QgY2xhc3Mgb2JqZWN0cyBpbiBQeXRob24sIGFuZCBjYW4gYmUgZGVjbGFyZWQgaW4gYQotbG9jYWwgc2NvcGUuICBUaGVyZWZvcmUgdGhlIG9ubHkgYWR2YW50YWdlIG9mIHVzaW5nIGEgbGFtYmRhIGZvcm0gaW5zdGVhZCBvZiBhCitsb2NhbCBzY29wZS4gIFRoZXJlZm9yZSB0aGUgb25seSBhZHZhbnRhZ2Ugb2YgdXNpbmcgYSBsYW1iZGEgaW5zdGVhZCBvZiBhCiBsb2NhbGx5LWRlZmluZWQgZnVuY3Rpb24gaXMgdGhhdCB5b3UgZG9uJ3QgbmVlZCB0byBpbnZlbnQgYSBuYW1lIGZvciB0aGUKIGZ1bmN0aW9uIC0tIGJ1dCB0aGF0J3MganVzdCBhIGxvY2FsIHZhcmlhYmxlIHRvIHdoaWNoIHRoZSBmdW5jdGlvbiBvYmplY3QgKHdoaWNoCi1pcyBleGFjdGx5IHRoZSBzYW1lIHR5cGUgb2Ygb2JqZWN0IHRoYXQgYSBsYW1iZGEgZm9ybSB5aWVsZHMpIGlzIGFzc2lnbmVkIQoraXMgZXhhY3RseSB0aGUgc2FtZSB0eXBlIG9mIG9iamVjdCB0aGF0IGEgbGFtYmRhIGV4cHJlc3Npb24geWllbGRzKSBpcyBhc3NpZ25lZCEKIAogCiBDYW4gUHl0aG9uIGJlIGNvbXBpbGVkIHRvIG1hY2hpbmUgY29kZSwgQyBvciBzb21lIG90aGVyIGxhbmd1YWdlPwpAQCAtNjg1LDcgKzY4Miw4IEBACiAoQUJDcykuICBZb3UgY2FuIHRoZW4gdXNlIDpmdW5jOmBpc2luc3RhbmNlYCBhbmQgOmZ1bmM6YGlzc3ViY2xhc3NgIHRvIGNoZWNrCiB3aGV0aGVyIGFuIGluc3RhbmNlIG9yIGEgY2xhc3MgaW1wbGVtZW50cyBhIHBhcnRpY3VsYXIgQUJDLiAgVGhlCiA6bW9kOmBjb2xsZWN0aW9uc2AgbW9kdWxlIGRlZmluZXMgYSBzZXQgb2YgdXNlZnVsIEFCQ3Mgc3VjaCBhcwotOmNsYXNzOmBJdGVyYWJsZWAsIDpjbGFzczpgQ29udGFpbmVyYCwgYW5kIDpjbGFzczpgTXV0YWJsZU1hcHBpbmdgLgorOmNsYXNzOmB+Y29sbGVjdGlvbnMuSXRlcmFibGVgLCA6Y2xhc3M6YH5jb2xsZWN0aW9ucy5Db250YWluZXJgLCBhbmQKKzpjbGFzczpgfmNvbGxlY3Rpb25zLk11dGFibGVNYXBwaW5nYC4KIAogRm9yIFB5dGhvbiwgbWFueSBvZiB0aGUgYWR2YW50YWdlcyBvZiBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgY2FuIGJlIG9idGFpbmVkCiBieSBhbiBhcHByb3ByaWF0ZSB0ZXN0IGRpc2NpcGxpbmUgZm9yIGNvbXBvbmVudHMuICBUaGVyZSBpcyBhbHNvIGEgdG9vbCwKQEAgLTcxNCw2MiArNzEyLDYgQEAKIHNsb3BweSBhbmQgbm90IHdyaXRlIHRlc3QgY2FzZXMgYXQgYWxsLgogCiAKLVdoeSBhcmUgZGVmYXVsdCB2YWx1ZXMgc2hhcmVkIGJldHdlZW4gb2JqZWN0cz8KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhpcyB0eXBlIG9mIGJ1ZyBjb21tb25seSBiaXRlcyBuZW9waHl0ZSBwcm9ncmFtbWVycy4gIENvbnNpZGVyIHRoaXMgZnVuY3Rpb246OgotCi0gICBkZWYgZm9vKG15ZGljdD17fSk6ICAjIERhbmdlcjogc2hhcmVkIHJlZmVyZW5jZSB0byBvbmUgZGljdCBmb3IgYWxsIGNhbGxzCi0gICAgICAgLi4uIGNvbXB1dGUgc29tZXRoaW5nIC4uLgotICAgICAgIG15ZGljdFtrZXldID0gdmFsdWUKLSAgICAgICByZXR1cm4gbXlkaWN0Ci0KLVRoZSBmaXJzdCB0aW1lIHlvdSBjYWxsIHRoaXMgZnVuY3Rpb24sIGBgbXlkaWN0YGAgY29udGFpbnMgYSBzaW5nbGUgaXRlbS4gIFRoZQotc2Vjb25kIHRpbWUsIGBgbXlkaWN0YGAgY29udGFpbnMgdHdvIGl0ZW1zIGJlY2F1c2Ugd2hlbiBgYGZvbygpYGAgYmVnaW5zCi1leGVjdXRpbmcsIGBgbXlkaWN0YGAgc3RhcnRzIG91dCB3aXRoIGFuIGl0ZW0gYWxyZWFkeSBpbiBpdC4KLQotSXQgaXMgb2Z0ZW4gZXhwZWN0ZWQgdGhhdCBhIGZ1bmN0aW9uIGNhbGwgY3JlYXRlcyBuZXcgb2JqZWN0cyBmb3IgZGVmYXVsdAotdmFsdWVzLiBUaGlzIGlzIG5vdCB3aGF0IGhhcHBlbnMuIERlZmF1bHQgdmFsdWVzIGFyZSBjcmVhdGVkIGV4YWN0bHkgb25jZSwgd2hlbgotdGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQuICBJZiB0aGF0IG9iamVjdCBpcyBjaGFuZ2VkLCBsaWtlIHRoZSBkaWN0aW9uYXJ5IGluIHRoaXMKLWV4YW1wbGUsIHN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIGZ1bmN0aW9uIHdpbGwgcmVmZXIgdG8gdGhpcyBjaGFuZ2VkIG9iamVjdC4KLQotQnkgZGVmaW5pdGlvbiwgaW1tdXRhYmxlIG9iamVjdHMgc3VjaCBhcyBudW1iZXJzLCBzdHJpbmdzLCB0dXBsZXMsIGFuZCBgYE5vbmVgYCwKLWFyZSBzYWZlIGZyb20gY2hhbmdlLiBDaGFuZ2VzIHRvIG11dGFibGUgb2JqZWN0cyBzdWNoIGFzIGRpY3Rpb25hcmllcywgbGlzdHMsCi1hbmQgY2xhc3MgaW5zdGFuY2VzIGNhbiBsZWFkIHRvIGNvbmZ1c2lvbi4KLQotQmVjYXVzZSBvZiB0aGlzIGZlYXR1cmUsIGl0IGlzIGdvb2QgcHJvZ3JhbW1pbmcgcHJhY3RpY2UgdG8gbm90IHVzZSBtdXRhYmxlCi1vYmplY3RzIGFzIGRlZmF1bHQgdmFsdWVzLiAgSW5zdGVhZCwgdXNlIGBgTm9uZWBgIGFzIHRoZSBkZWZhdWx0IHZhbHVlIGFuZAotaW5zaWRlIHRoZSBmdW5jdGlvbiwgY2hlY2sgaWYgdGhlIHBhcmFtZXRlciBpcyBgYE5vbmVgYCBhbmQgY3JlYXRlIGEgbmV3Ci1saXN0L2RpY3Rpb25hcnkvd2hhdGV2ZXIgaWYgaXQgaXMuICBGb3IgZXhhbXBsZSwgZG9uJ3Qgd3JpdGU6OgotCi0gICBkZWYgZm9vKG15ZGljdD17fSk6Ci0gICAgICAgLi4uCi0KLWJ1dDo6Ci0KLSAgIGRlZiBmb28obXlkaWN0PU5vbmUpOgotICAgICAgIGlmIG15ZGljdCBpcyBOb25lOgotICAgICAgICAgICBteWRpY3QgPSB7fSAgIyBjcmVhdGUgYSBuZXcgZGljdCBmb3IgbG9jYWwgbmFtZXNwYWNlCi0KLVRoaXMgZmVhdHVyZSBjYW4gYmUgdXNlZnVsLiAgV2hlbiB5b3UgaGF2ZSBhIGZ1bmN0aW9uIHRoYXQncyB0aW1lLWNvbnN1bWluZyB0bwotY29tcHV0ZSwgYSBjb21tb24gdGVjaG5pcXVlIGlzIHRvIGNhY2hlIHRoZSBwYXJhbWV0ZXJzIGFuZCB0aGUgcmVzdWx0aW5nIHZhbHVlCi1vZiBlYWNoIGNhbGwgdG8gdGhlIGZ1bmN0aW9uLCBhbmQgcmV0dXJuIHRoZSBjYWNoZWQgdmFsdWUgaWYgdGhlIHNhbWUgdmFsdWUgaXMKLXJlcXVlc3RlZCBhZ2Fpbi4gIFRoaXMgaXMgY2FsbGVkICJtZW1vaXppbmciLCBhbmQgY2FuIGJlIGltcGxlbWVudGVkIGxpa2UgdGhpczo6Ci0KLSAgICMgQ2FsbGVycyB3aWxsIG5ldmVyIHByb3ZpZGUgYSB0aGlyZCBwYXJhbWV0ZXIgZm9yIHRoaXMgZnVuY3Rpb24uCi0gICBkZWYgZXhwZW5zaXZlIChhcmcxLCBhcmcyLCBfY2FjaGU9e30pOgotICAgICAgIGlmIChhcmcxLCBhcmcyKSBpbiBfY2FjaGU6Ci0gICAgICAgICAgIHJldHVybiBfY2FjaGVbKGFyZzEsIGFyZzIpXQotCi0gICAgICAgIyBDYWxjdWxhdGUgdGhlIHZhbHVlCi0gICAgICAgcmVzdWx0ID0gLi4uIGV4cGVuc2l2ZSBjb21wdXRhdGlvbiAuLi4KLSAgICAgICBfY2FjaGVbKGFyZzEsIGFyZzIpXSA9IHJlc3VsdCAgICAgICAgICAgIyBTdG9yZSByZXN1bHQgaW4gdGhlIGNhY2hlCi0gICAgICAgcmV0dXJuIHJlc3VsdAotCi1Zb3UgY291bGQgdXNlIGEgZ2xvYmFsIHZhcmlhYmxlIGNvbnRhaW5pbmcgYSBkaWN0aW9uYXJ5IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQKLXZhbHVlOyBpdCdzIGEgbWF0dGVyIG9mIHRhc3RlLgotCi0KIFdoeSBpcyB0aGVyZSBubyBnb3RvPwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTc4Miw3ICs3MjQsNyBAQAogCiAgICB0cnk6CiAgICAgICAgIC4uLgotICAgICAgICBpZiAoY29uZGl0aW9uKTogcmFpc2UgbGFiZWwoKSAgIyBnb3RvIGxhYmVsCisgICAgICAgIGlmIGNvbmRpdGlvbjogcmFpc2UgbGFiZWwoKSAgIyBnb3RvIGxhYmVsCiAgICAgICAgIC4uLgogICAgZXhjZXB0IGxhYmVsOiAgIyB3aGVyZSB0byBnb3RvCiAgICAgICAgIHBhc3MKQEAgLTkxMyw4ICs4NTUsOCBAQAogCiBXaGVuIHlvdSBoYXZlIGEgbGl0ZXJhbCB2YWx1ZSBmb3IgYSBsaXN0LCB0dXBsZSwgb3IgZGljdGlvbmFyeSBzcHJlYWQgYWNyb3NzCiBtdWx0aXBsZSBsaW5lcywgaXQncyBlYXNpZXIgdG8gYWRkIG1vcmUgZWxlbWVudHMgYmVjYXVzZSB5b3UgZG9uJ3QgaGF2ZSB0bwotcmVtZW1iZXIgdG8gYWRkIGEgY29tbWEgdG8gdGhlIHByZXZpb3VzIGxpbmUuICBUaGUgbGluZXMgY2FuIGFsc28gYmUgc29ydGVkIGluCi15b3VyIGVkaXRvciB3aXRob3V0IGNyZWF0aW5nIGEgc3ludGF4IGVycm9yLgorcmVtZW1iZXIgdG8gYWRkIGEgY29tbWEgdG8gdGhlIHByZXZpb3VzIGxpbmUuICBUaGUgbGluZXMgY2FuIGFsc28gYmUgcmVvcmRlcmVkCit3aXRob3V0IGNyZWF0aW5nIGEgc3ludGF4IGVycm9yLgogCiBBY2NpZGVudGFsbHkgb21pdHRpbmcgdGhlIGNvbW1hIGNhbiBsZWFkIHRvIGVycm9ycyB0aGF0IGFyZSBoYXJkIHRvIGRpYWdub3NlLgogRm9yIGV4YW1wbGU6OgpkaWZmIC0tZ2l0IGEvRG9jL2ZhcS9leHRlbmRpbmcucnN0IGIvRG9jL2ZhcS9leHRlbmRpbmcucnN0CmluZGV4IGJlNWM1MWMuLjRmM2NhYmYgMTAwNjQ0Ci0tLSBhL0RvYy9mYXEvZXh0ZW5kaW5nLnJzdAorKysgYi9Eb2MvZmFxL2V4dGVuZGluZy5yc3QKQEAgLTIsNyArMiw5IEBACiBFeHRlbmRpbmcvRW1iZWRkaW5nIEZBUQogPT09PT09PT09PT09PT09PT09PT09PT0KIAotLi4gY29udGVudHM6OgorLi4gb25seTo6IGh0bWwKKworICAgLi4gY29udGVudHM6OgogCiAuLiBoaWdobGlnaHQ6OiBjCiAKQEAgLTYwLDQxICs2Miw0MSBAQAogSG93IGNhbiBJIGV4ZWN1dGUgYXJiaXRyYXJ5IFB5dGhvbiBzdGF0ZW1lbnRzIGZyb20gQz8KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVRoZSBoaWdoZXN0LWxldmVsIGZ1bmN0aW9uIHRvIGRvIHRoaXMgaXMgOmNmdW5jOmBQeVJ1bl9TaW1wbGVTdHJpbmdgIHdoaWNoIHRha2VzCitUaGUgaGlnaGVzdC1sZXZlbCBmdW5jdGlvbiB0byBkbyB0aGlzIGlzIDpjOmZ1bmM6YFB5UnVuX1NpbXBsZVN0cmluZ2Agd2hpY2ggdGFrZXMKIGEgc2luZ2xlIHN0cmluZyBhcmd1bWVudCB0byBiZSBleGVjdXRlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgbW9kdWxlCiBgYF9fbWFpbl9fYGAgYW5kIHJldHVybnMgMCBmb3Igc3VjY2VzcyBhbmQgLTEgd2hlbiBhbiBleGNlcHRpb24gb2NjdXJyZWQKIChpbmNsdWRpbmcgYGBTeW50YXhFcnJvcmBgKS4gIElmIHlvdSB3YW50IG1vcmUgY29udHJvbCwgdXNlCi06Y2Z1bmM6YFB5UnVuX1N0cmluZ2A7IHNlZSB0aGUgc291cmNlIGZvciA6Y2Z1bmM6YFB5UnVuX1NpbXBsZVN0cmluZ2AgaW4KKzpjOmZ1bmM6YFB5UnVuX1N0cmluZ2A7IHNlZSB0aGUgc291cmNlIGZvciA6YzpmdW5jOmBQeVJ1bl9TaW1wbGVTdHJpbmdgIGluCiBgYFB5dGhvbi9weXRob25ydW4uY2BgLgogCiAKIEhvdyBjYW4gSSBldmFsdWF0ZSBhbiBhcmJpdHJhcnkgUHl0aG9uIGV4cHJlc3Npb24gZnJvbSBDPwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUNhbGwgdGhlIGZ1bmN0aW9uIDpjZnVuYzpgUHlSdW5fU3RyaW5nYCBmcm9tIHRoZSBwcmV2aW91cyBxdWVzdGlvbiB3aXRoIHRoZQotc3RhcnQgc3ltYm9sIDpjZGF0YTpgUHlfZXZhbF9pbnB1dGA7IGl0IHBhcnNlcyBhbiBleHByZXNzaW9uLCBldmFsdWF0ZXMgaXQgYW5kCitDYWxsIHRoZSBmdW5jdGlvbiA6YzpmdW5jOmBQeVJ1bl9TdHJpbmdgIGZyb20gdGhlIHByZXZpb3VzIHF1ZXN0aW9uIHdpdGggdGhlCitzdGFydCBzeW1ib2wgOmM6ZGF0YTpgUHlfZXZhbF9pbnB1dGA7IGl0IHBhcnNlcyBhbiBleHByZXNzaW9uLCBldmFsdWF0ZXMgaXQgYW5kCiByZXR1cm5zIGl0cyB2YWx1ZS4KIAogCiBIb3cgZG8gSSBleHRyYWN0IEMgdmFsdWVzIGZyb20gYSBQeXRob24gb2JqZWN0PwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotVGhhdCBkZXBlbmRzIG9uIHRoZSBvYmplY3QncyB0eXBlLiAgSWYgaXQncyBhIHR1cGxlLCA6Y2Z1bmM6YFB5VHVwbGVfU2l6ZWAKLXJldHVybnMgaXRzIGxlbmd0aCBhbmQgOmNmdW5jOmBQeVR1cGxlX0dldEl0ZW1gIHJldHVybnMgdGhlIGl0ZW0gYXQgYSBzcGVjaWZpZWQKLWluZGV4LiAgTGlzdHMgaGF2ZSBzaW1pbGFyIGZ1bmN0aW9ucywgOmNmdW5jOmBQeUxpc3RTaXplYCBhbmQKLTpjZnVuYzpgUHlMaXN0X0dldEl0ZW1gLgorVGhhdCBkZXBlbmRzIG9uIHRoZSBvYmplY3QncyB0eXBlLiAgSWYgaXQncyBhIHR1cGxlLCA6YzpmdW5jOmBQeVR1cGxlX1NpemVgCityZXR1cm5zIGl0cyBsZW5ndGggYW5kIDpjOmZ1bmM6YFB5VHVwbGVfR2V0SXRlbWAgcmV0dXJucyB0aGUgaXRlbSBhdCBhIHNwZWNpZmllZAoraW5kZXguICBMaXN0cyBoYXZlIHNpbWlsYXIgZnVuY3Rpb25zLCA6YzpmdW5jOmBQeUxpc3RTaXplYCBhbmQKKzpjOmZ1bmM6YFB5TGlzdF9HZXRJdGVtYC4KIAotRm9yIHN0cmluZ3MsIDpjZnVuYzpgUHlTdHJpbmdfU2l6ZWAgcmV0dXJucyBpdHMgbGVuZ3RoIGFuZAotOmNmdW5jOmBQeVN0cmluZ19Bc1N0cmluZ2AgYSBwb2ludGVyIHRvIGl0cyB2YWx1ZS4gIE5vdGUgdGhhdCBQeXRob24gc3RyaW5ncyBtYXkKLWNvbnRhaW4gbnVsbCBieXRlcyBzbyBDJ3MgOmNmdW5jOmBzdHJsZW5gIHNob3VsZCBub3QgYmUgdXNlZC4KK0ZvciBzdHJpbmdzLCA6YzpmdW5jOmBQeVN0cmluZ19TaXplYCByZXR1cm5zIGl0cyBsZW5ndGggYW5kCis6YzpmdW5jOmBQeVN0cmluZ19Bc1N0cmluZ2AgYSBwb2ludGVyIHRvIGl0cyB2YWx1ZS4gIE5vdGUgdGhhdCBQeXRob24gc3RyaW5ncyBtYXkKK2NvbnRhaW4gbnVsbCBieXRlcyBzbyBDJ3MgOmM6ZnVuYzpgc3RybGVuYCBzaG91bGQgbm90IGJlIHVzZWQuCiAKIFRvIHRlc3QgdGhlIHR5cGUgb2YgYW4gb2JqZWN0LCBmaXJzdCBtYWtlIHN1cmUgaXQgaXNuJ3QgKk5VTEwqLCBhbmQgdGhlbiB1c2UKLTpjZnVuYzpgUHlTdHJpbmdfQ2hlY2tgLCA6Y2Z1bmM6YFB5VHVwbGVfQ2hlY2tgLCA6Y2Z1bmM6YFB5TGlzdF9DaGVja2AsIGV0Yy4KKzpjOmZ1bmM6YFB5U3RyaW5nX0NoZWNrYCwgOmM6ZnVuYzpgUHlUdXBsZV9DaGVja2AsIDpjOmZ1bmM6YFB5TGlzdF9DaGVja2AsIGV0Yy4KIAogVGhlcmUgaXMgYWxzbyBhIGhpZ2gtbGV2ZWwgQVBJIHRvIFB5dGhvbiBvYmplY3RzIHdoaWNoIGlzIHByb3ZpZGVkIGJ5IHRoZQogc28tY2FsbGVkICdhYnN0cmFjdCcgaW50ZXJmYWNlIC0tIHJlYWQgYGBJbmNsdWRlL2Fic3RyYWN0LmhgYCBmb3IgZnVydGhlcgogZGV0YWlscy4gIEl0IGFsbG93cyBpbnRlcmZhY2luZyB3aXRoIGFueSBraW5kIG9mIFB5dGhvbiBzZXF1ZW5jZSB1c2luZyBjYWxscwotbGlrZSA6Y2Z1bmM6YFB5U2VxdWVuY2VfTGVuZ3RoYCwgOmNmdW5jOmBQeVNlcXVlbmNlX0dldEl0ZW1gLCBldGMuKSAgYXMgd2VsbCBhcworbGlrZSA6YzpmdW5jOmBQeVNlcXVlbmNlX0xlbmd0aGAsIDpjOmZ1bmM6YFB5U2VxdWVuY2VfR2V0SXRlbWAsIGV0Yy4pICBhcyB3ZWxsIGFzCiBtYW55IG90aGVyIHVzZWZ1bCBwcm90b2NvbHMuCiAKIApAQCAtMTAzLDcgKzEwNSw3IEBACiAKIFlvdSBjYW4ndC4gIFVzZSBgYHQgPSBQeVR1cGxlX05ldyhuKWBgIGluc3RlYWQsIGFuZCBmaWxsIGl0IHdpdGggb2JqZWN0cyB1c2luZwogYGBQeVR1cGxlX1NldEl0ZW0odCwgaSwgbylgYCAtLSBub3RlIHRoYXQgdGhpcyAiZWF0cyIgYSByZWZlcmVuY2UgY291bnQgb2YKLWBgb2BgLCBzbyB5b3UgaGF2ZSB0byA6Y2Z1bmM6YFB5X0lOQ1JFRmAgaXQuICBMaXN0cyBoYXZlIHNpbWlsYXIgZnVuY3Rpb25zCitgYG9gYCwgc28geW91IGhhdmUgdG8gOmM6ZnVuYzpgUHlfSU5DUkVGYCBpdC4gIExpc3RzIGhhdmUgc2ltaWxhciBmdW5jdGlvbnMKIGBgUHlMaXN0X05ldyhuKWBgIGFuZCBgYFB5TGlzdF9TZXRJdGVtKGwsIGksIG8pYGAuICBOb3RlIHRoYXQgeW91ICptdXN0KiBzZXQgYWxsCiB0aGUgdHVwbGUgaXRlbXMgdG8gc29tZSB2YWx1ZSBiZWZvcmUgeW91IHBhc3MgdGhlIHR1cGxlIHRvIFB5dGhvbiBjb2RlIC0tCiBgYFB5VHVwbGVfTmV3KG4pYGAgaW5pdGlhbGl6ZXMgdGhlbSB0byBOVUxMLCB3aGljaCBpc24ndCBhIHZhbGlkIFB5dGhvbiB2YWx1ZS4KQEAgLTExMiw5ICsxMTQsOSBAQAogSG93IGRvIEkgY2FsbCBhbiBvYmplY3QncyBtZXRob2QgZnJvbSBDPwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1UaGUgOmNmdW5jOmBQeU9iamVjdF9DYWxsTWV0aG9kYCBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjYWxsIGFuIGFyYml0cmFyeQorVGhlIDpjOmZ1bmM6YFB5T2JqZWN0X0NhbGxNZXRob2RgIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNhbGwgYW4gYXJiaXRyYXJ5CiBtZXRob2Qgb2YgYW4gb2JqZWN0LiAgVGhlIHBhcmFtZXRlcnMgYXJlIHRoZSBvYmplY3QsIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8KLWNhbGwsIGEgZm9ybWF0IHN0cmluZyBsaWtlIHRoYXQgdXNlZCB3aXRoIDpjZnVuYzpgUHlfQnVpbGRWYWx1ZWAsIGFuZCB0aGUKK2NhbGwsIGEgZm9ybWF0IHN0cmluZyBsaWtlIHRoYXQgdXNlZCB3aXRoIDpjOmZ1bmM6YFB5X0J1aWxkVmFsdWVgLCBhbmQgdGhlCiBhcmd1bWVudCB2YWx1ZXM6OgogCiAgICBQeU9iamVjdCAqCkBAIC0xMjIsNyArMTI0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYXJnX2Zvcm1hdCwgLi4uKTsKIAogVGhpcyB3b3JrcyBmb3IgYW55IG9iamVjdCB0aGF0IGhhcyBtZXRob2RzIC0tIHdoZXRoZXIgYnVpbHQtaW4gb3IgdXNlci1kZWZpbmVkLgotWW91IGFyZSByZXNwb25zaWJsZSBmb3IgZXZlbnR1YWxseSA6Y2Z1bmM6YFB5X0RFQ1JFRmBcICdpbmcgdGhlIHJldHVybiB2YWx1ZS4KK1lvdSBhcmUgcmVzcG9uc2libGUgZm9yIGV2ZW50dWFsbHkgOmM6ZnVuYzpgUHlfREVDUkVGYFwgJ2luZyB0aGUgcmV0dXJuIHZhbHVlLgogCiBUbyBjYWxsLCBlLmcuLCBhIGZpbGUgb2JqZWN0J3MgInNlZWsiIG1ldGhvZCB3aXRoIGFyZ3VtZW50cyAxMCwgMCAoYXNzdW1pbmcgdGhlCiBmaWxlIG9iamVjdCBwb2ludGVyIGlzICJmIik6OgpAQCAtMTM1LDcgKzEzNyw3IEBACiAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOwogICAgfQogCi1Ob3RlIHRoYXQgc2luY2UgOmNmdW5jOmBQeU9iamVjdF9DYWxsT2JqZWN0YCAqYWx3YXlzKiB3YW50cyBhIHR1cGxlIGZvciB0aGUKK05vdGUgdGhhdCBzaW5jZSA6YzpmdW5jOmBQeU9iamVjdF9DYWxsT2JqZWN0YCAqYWx3YXlzKiB3YW50cyBhIHR1cGxlIGZvciB0aGUKIGFyZ3VtZW50IGxpc3QsIHRvIGNhbGwgYSBmdW5jdGlvbiB3aXRob3V0IGFyZ3VtZW50cywgcGFzcyAiKCkiIGZvciB0aGUgZm9ybWF0LAogYW5kIHRvIGNhbGwgYSBmdW5jdGlvbiB3aXRoIG9uZSBhcmd1bWVudCwgc3Vycm91bmQgdGhlIGFyZ3VtZW50IGluIHBhcmVudGhlc2VzLAogZS5nLiAiKGkpIi4KQEAgLTE4Niw3ICsxODgsNyBAQAogCiAgICBhdHRyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhtb2R1bGUsICI8YXR0cm5hbWU+Iik7CiAKLUNhbGxpbmcgOmNmdW5jOmBQeU9iamVjdF9TZXRBdHRyU3RyaW5nYCB0byBhc3NpZ24gdG8gdmFyaWFibGVzIGluIHRoZSBtb2R1bGUKK0NhbGxpbmcgOmM6ZnVuYzpgUHlPYmplY3RfU2V0QXR0clN0cmluZ2AgdG8gYXNzaWduIHRvIHZhcmlhYmxlcyBpbiB0aGUgbW9kdWxlCiBhbHNvIHdvcmtzLgogCiAKQEAgLTI2NywxNiArMjY5LDE2IEBACiBJbiBQeXRob24geW91IGNhbiB1c2UgdGhlIDptb2Q6YGNvZGVvcGAgbW9kdWxlLCB3aGljaCBhcHByb3hpbWF0ZXMgdGhlIHBhcnNlcidzCiBiZWhhdmlvciBzdWZmaWNpZW50bHkuICBJRExFIHVzZXMgdGhpcywgZm9yIGV4YW1wbGUuCiAKLVRoZSBlYXNpZXN0IHdheSB0byBkbyBpdCBpbiBDIGlzIHRvIGNhbGwgOmNmdW5jOmBQeVJ1bl9JbnRlcmFjdGl2ZUxvb3BgIChwZXJoYXBzCitUaGUgZWFzaWVzdCB3YXkgdG8gZG8gaXQgaW4gQyBpcyB0byBjYWxsIDpjOmZ1bmM6YFB5UnVuX0ludGVyYWN0aXZlTG9vcGAgKHBlcmhhcHMKIGluIGEgc2VwYXJhdGUgdGhyZWFkKSBhbmQgbGV0IHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaGFuZGxlIHRoZSBpbnB1dCBmb3IKLXlvdS4gWW91IGNhbiBhbHNvIHNldCB0aGUgOmNmdW5jOmBQeU9TX1JlYWRsaW5lRnVuY3Rpb25Qb2ludGVyYCB0byBwb2ludCBhdCB5b3VyCit5b3UuIFlvdSBjYW4gYWxzbyBzZXQgdGhlIDpjOmZ1bmM6YFB5T1NfUmVhZGxpbmVGdW5jdGlvblBvaW50ZXJgIHRvIHBvaW50IGF0IHlvdXIKIGN1c3RvbSBpbnB1dCBmdW5jdGlvbi4gU2VlIGBgTW9kdWxlcy9yZWFkbGluZS5jYGAgYW5kIGBgUGFyc2VyL215cmVhZGxpbmUuY2BgCiBmb3IgbW9yZSBoaW50cy4KIAogSG93ZXZlciBzb21ldGltZXMgeW91IGhhdmUgdG8gcnVuIHRoZSBlbWJlZGRlZCBQeXRob24gaW50ZXJwcmV0ZXIgaW4gdGhlIHNhbWUKIHRocmVhZCBhcyB5b3VyIHJlc3QgYXBwbGljYXRpb24gYW5kIHlvdSBjYW4ndCBhbGxvdyB0aGUKLTpjZnVuYzpgUHlSdW5fSW50ZXJhY3RpdmVMb29wYCB0byBzdG9wIHdoaWxlIHdhaXRpbmcgZm9yIHVzZXIgaW5wdXQuICBUaGUgb25lCi1zb2x1dGlvbiB0aGVuIGlzIHRvIGNhbGwgOmNmdW5jOmBQeVBhcnNlcl9QYXJzZVN0cmluZ2AgYW5kIHRlc3QgZm9yIGBgZS5lcnJvcmBgCis6YzpmdW5jOmBQeVJ1bl9JbnRlcmFjdGl2ZUxvb3BgIHRvIHN0b3Agd2hpbGUgd2FpdGluZyBmb3IgdXNlciBpbnB1dC4gIFRoZSBvbmUKK3NvbHV0aW9uIHRoZW4gaXMgdG8gY2FsbCA6YzpmdW5jOmBQeVBhcnNlcl9QYXJzZVN0cmluZ2AgYW5kIHRlc3QgZm9yIGBgZS5lcnJvcmBgCiBlcXVhbCB0byBgYEVfRU9GYGAsIHdoaWNoIG1lYW5zIHRoZSBpbnB1dCBpcyBpbmNvbXBsZXRlKS4gIEhlcmUncyBhIHNhbXBsZSBjb2RlCiBmcmFnbWVudCwgdW50ZXN0ZWQsIGluc3BpcmVkIGJ5IGNvZGUgZnJvbSBBbGV4IEZhcmJlcjo6CiAKQEAgLTMwNyw4ICszMDksOCBAQAogICAgfQogCiBBbm90aGVyIHNvbHV0aW9uIGlzIHRyeWluZyB0byBjb21waWxlIHRoZSByZWNlaXZlZCBzdHJpbmcgd2l0aAotOmNmdW5jOmBQeV9Db21waWxlU3RyaW5nYC4gSWYgaXQgY29tcGlsZXMgd2l0aG91dCBlcnJvcnMsIHRyeSB0byBleGVjdXRlIHRoZQotcmV0dXJuZWQgY29kZSBvYmplY3QgYnkgY2FsbGluZyA6Y2Z1bmM6YFB5RXZhbF9FdmFsQ29kZWAuIE90aGVyd2lzZSBzYXZlIHRoZQorOmM6ZnVuYzpgUHlfQ29tcGlsZVN0cmluZ2AuIElmIGl0IGNvbXBpbGVzIHdpdGhvdXQgZXJyb3JzLCB0cnkgdG8gZXhlY3V0ZSB0aGUKK3JldHVybmVkIGNvZGUgb2JqZWN0IGJ5IGNhbGxpbmcgOmM6ZnVuYzpgUHlFdmFsX0V2YWxDb2RlYC4gT3RoZXJ3aXNlIHNhdmUgdGhlCiBpbnB1dCBmb3IgbGF0ZXIuIElmIHRoZSBjb21waWxhdGlvbiBmYWlscywgZmluZCBvdXQgaWYgaXQncyBhbiBlcnJvciBvciBqdXN0CiBtb3JlIGlucHV0IGlzIHJlcXVpcmVkIC0gYnkgZXh0cmFjdGluZyB0aGUgbWVzc2FnZSBzdHJpbmcgZnJvbSB0aGUgZXhjZXB0aW9uCiB0dXBsZSBhbmQgY29tcGFyaW5nIGl0IHRvIHRoZSBzdHJpbmcgInVuZXhwZWN0ZWQgRU9GIHdoaWxlIHBhcnNpbmciLiAgSGVyZSBpcyBhCkBAIC00NjAsOCArNDYyLDggQEAKIDcueCwgaW4gcGFydGljdWxhciwgcHJvdmlkZWQgYSAicHl0aG9uMiIgYmluYXJ5IHRoYXQgaXMgY29tcGlsZWQgd2l0aCA0LWJ5dGUKIFVuaWNvZGUuICBUaGlzIG9ubHkgY2F1c2VzIHRoZSBsaW5rIGZhaWx1cmUgaWYgdGhlIGV4dGVuc2lvbiB1c2VzIGFueSBvZiB0aGUKIGBgUHlVbmljb2RlXyooKWBgIGZ1bmN0aW9ucy4gIEl0IGlzIGFsc28gYSBwcm9ibGVtIGlmIGFuIGV4dGVuc2lvbiB1c2VzIGFueSBvZgotdGhlIFVuaWNvZGUtcmVsYXRlZCBmb3JtYXQgc3BlY2lmaWVycyBmb3IgOmNmdW5jOmBQeV9CdWlsZFZhbHVlYCAob3Igc2ltaWxhcikgb3IKLXBhcmFtZXRlciBzcGVjaWZpY2F0aW9ucyBmb3IgOmNmdW5jOmBQeUFyZ19QYXJzZVR1cGxlYC4KK3RoZSBVbmljb2RlLXJlbGF0ZWQgZm9ybWF0IHNwZWNpZmllcnMgZm9yIDpjOmZ1bmM6YFB5X0J1aWxkVmFsdWVgIChvciBzaW1pbGFyKSBvcgorcGFyYW1ldGVyIHNwZWNpZmljYXRpb25zIGZvciA6YzpmdW5jOmBQeUFyZ19QYXJzZVR1cGxlYC4KIAogWW91IGNhbiBjaGVjayB0aGUgc2l6ZSBvZiB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgYSBQeXRob24gaW50ZXJwcmV0ZXIgaXMgdXNpbmcgYnkKIGNoZWNraW5nIHRoZSB2YWx1ZSBvZiBzeXMubWF4dW5pY29kZToKZGlmZiAtLWdpdCBhL0RvYy9mYXEvZ2VuZXJhbC5yc3QgYi9Eb2MvZmFxL2dlbmVyYWwucnN0CmluZGV4IDAxYjQ4NjYuLmFhODA3NWMgMTAwNjQ0Ci0tLSBhL0RvYy9mYXEvZ2VuZXJhbC5yc3QKKysrIGIvRG9jL2ZhcS9nZW5lcmFsLnJzdApAQCAtNCw3ICs0LDEwIEBACiBHZW5lcmFsIFB5dGhvbiBGQVEKID09PT09PT09PT09PT09PT09PQogCi0uLiBjb250ZW50czo6CisuLiBvbmx5OjogaHRtbAorCisgICAuLiBjb250ZW50czo6CisKIAogR2VuZXJhbCBJbmZvcm1hdGlvbgogPT09PT09PT09PT09PT09PT09PQpAQCAtMTU3LDcgKzE2MCw3IEBACiAKIFRoZSBsYXRlc3QgUHl0aG9uIHNvdXJjZSBkaXN0cmlidXRpb24gaXMgYWx3YXlzIGF2YWlsYWJsZSBmcm9tIHB5dGhvbi5vcmcsIGF0CiBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG93bmxvYWQvLiAgVGhlIGxhdGVzdCBkZXZlbG9wbWVudCBzb3VyY2VzIGNhbiBiZSBvYnRhaW5lZAotdmlhIGFub255bW91cyBTdWJ2ZXJzaW9uIGF0IGh0dHA6Ly9zdm4ucHl0aG9uLm9yZy9wcm9qZWN0cy9weXRob24vdHJ1bmsuCit2aWEgYW5vbnltb3VzIE1lcmN1cmlhbCBhY2Nlc3MgYXQgaHR0cDovL2hnLnB5dGhvbi5vcmcvY3B5dGhvbi4KIAogVGhlIHNvdXJjZSBkaXN0cmlidXRpb24gaXMgYSBnemlwcGVkIHRhciBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvbXBsZXRlIEMgc291cmNlLAogU3BoaW54LWZvcm1hdHRlZCBkb2N1bWVudGF0aW9uLCBQeXRob24gbGlicmFyeSBtb2R1bGVzLCBleGFtcGxlIHByb2dyYW1zLCBhbmQKQEAgLTE3OCw4ICsxODEsOCBAQAogYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9kb3dubG9hZC5odG1sLgogCiBUaGUgZG9jdW1lbnRhdGlvbiBpcyB3cml0dGVuIGluIHJlU3RydWN0dXJlZFRleHQgYW5kIHByb2Nlc3NlZCBieSBgdGhlIFNwaGlueAotZG9jdW1lbnRhdGlvbiB0b29sIDxodHRwOi8vc3BoaW54LnBvY29vLm9yZy8+YF9fLiAgVGhlIHJlU3RydWN0dXJlZFRleHQgc291cmNlCi1mb3IgdGhlIGRvY3VtZW50YXRpb24gaXMgcGFydCBvZiB0aGUgUHl0aG9uIHNvdXJjZSBkaXN0cmlidXRpb24uCitkb2N1bWVudGF0aW9uIHRvb2wgPGh0dHA6Ly9zcGhpbngtZG9jLm9yZy8+YF9fLiAgVGhlIHJlU3RydWN0dXJlZFRleHQgc291cmNlIGZvcgordGhlIGRvY3VtZW50YXRpb24gaXMgcGFydCBvZiB0aGUgUHl0aG9uIHNvdXJjZSBkaXN0cmlidXRpb24uCiAKIAogSSd2ZSBuZXZlciBwcm9ncmFtbWVkIGJlZm9yZS4gSXMgdGhlcmUgYSBQeXRob24gdHV0b3JpYWw/CkBAIC0yNjUsOSArMjY4LDEzIEBACiBXaGVyZSBpbiB0aGUgd29ybGQgaXMgd3d3LnB5dGhvbi5vcmcgbG9jYXRlZD8KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1JdCdzIGN1cnJlbnRseSBpbiBBbXN0ZXJkYW0sIGdyYWNpb3VzbHkgaG9zdGVkIGJ5IGBYUzRBTEwKLTxodHRwOi8vd3d3LnhzNGFsbC5ubD5gXy4gIFRoYW5rcyB0byBUaG9tYXMgV291dGVycyBmb3IgaGlzIHdvcmsgaW4gYXJyYW5naW5nCi1weXRob24ub3JnJ3MgaG9zdGluZy4KK1RoZSBQeXRob24gcHJvamVjdCdzIGluZnJhc3RydWN0dXJlIGlzIGxvY2F0ZWQgYWxsIG92ZXIgdGhlIHdvcmxkLgorYHd3dy5weXRob24ub3JnIDxodHRwOi8vd3d3LnB5dGhvbi5vcmc+YF8gaXMgY3VycmVudGx5IGluIEFtc3RlcmRhbSwgZ3JhY2lvdXNseQoraG9zdGVkIGJ5IGBYUzRBTEwgPGh0dHA6Ly93d3cueHM0YWxsLm5sPmBfLiAgYFVwZnJvbnQgU3lzdGVtcworPGh0dHA6Ly93d3cudXBmcm9udHN5c3RlbXMuY28uemE+YF8gaG9zdHMgYGJ1Z3MucHl0aG9uLm9yZworPGh0dHA6Ly9idWdzLnB5dGhvbi5vcmc+YF8uICBNb3N0IG90aGVyIFB5dGhvbiBzZXJ2aWNlcyBsaWtlIGBQeVBJCis8aHR0cHM6Ly9weXBpLnB5dGhvbi5vcmc+YF8gYW5kIGhnLnB5dGhvbi5vcmcgYXJlIGhvc3RlZCBieSBgT3JlZ29uIFN0YXRlCitVbml2ZXJzaXR5IE9wZW4gU291cmNlIExhYiA8aHR0cHM6Ly9vc3Vvc2wub3JnPmBfLgogCiAKIFdoeSBpcyBpdCBjYWxsZWQgUHl0aG9uPwpAQCAtNDY0LDcgKzQ3MSw4IEBACiBFbWFjcyB1c2VycyB3aWxsIGJlIGhhcHB5IHRvIGtub3cgdGhhdCB0aGVyZSBpcyBhIHZlcnkgZ29vZCBQeXRob24gbW9kZSBmb3IKIEVtYWNzLiAgQWxsIG9mIHRoZXNlIHByb2dyYW1taW5nIGVudmlyb25tZW50cyBwcm92aWRlIHN5bnRheCBoaWdobGlnaHRpbmcsCiBhdXRvLWluZGVudGluZywgYW5kIGFjY2VzcyB0byB0aGUgaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgd2hpbGUgY29kaW5nLiAgQ29uc3VsdAotaHR0cDovL3d3dy5weXRob24ub3JnL2VkaXRvcnMvIGZvciBhIGZ1bGwgbGlzdCBvZiBQeXRob24gZWRpdGluZyBlbnZpcm9ubWVudHMuCitgdGhlIFB5dGhvbiB3aWtpIDxodHRwczovL3dpa2kucHl0aG9uLm9yZy9tb2luL1B5dGhvbkVkaXRvcnM+YF8gZm9yIGEgZnVsbCBsaXN0CitvZiBQeXRob24gZWRpdGluZyBlbnZpcm9ubWVudHMuCiAKIElmIHlvdSB3YW50IHRvIGRpc2N1c3MgUHl0aG9uJ3MgdXNlIGluIGVkdWNhdGlvbiwgeW91IG1heSBiZSBpbnRlcmVzdGVkIGluCiBqb2luaW5nIGB0aGUgZWR1LXNpZyBtYWlsaW5nIGxpc3QKZGlmZiAtLWdpdCBhL0RvYy9mYXEvZ3VpLnJzdCBiL0RvYy9mYXEvZ3VpLnJzdAppbmRleCBkMzdmNDgwLi40MmQ5NWJkIDEwMDY0NAotLS0gYS9Eb2MvZmFxL2d1aS5yc3QKKysrIGIvRG9jL2ZhcS9ndWkucnN0CkBAIC00LDcgKzQsOSBAQAogR3JhcGhpYyBVc2VyIEludGVyZmFjZSBGQVEKID09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLS4uIGNvbnRlbnRzOjoKKy4uIG9ubHk6OiBodG1sCisKKyAgIC4uIGNvbnRlbnRzOjoKIAogV2hhdCBwbGF0Zm9ybS1pbmRlcGVuZGVudCBHVUkgdG9vbGtpdHMgZXhpc3QgZm9yIFB5dGhvbj8KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xOSwxNSArMjEsMTUgQEAKIFN0YW5kYXJkIGJ1aWxkcyBvZiBQeXRob24gaW5jbHVkZSBhbiBvYmplY3Qtb3JpZW50ZWQgaW50ZXJmYWNlIHRvIHRoZSBUY2wvVGsKIHdpZGdldCBzZXQsIGNhbGxlZCBUa2ludGVyLiAgVGhpcyBpcyBwcm9iYWJseSB0aGUgZWFzaWVzdCB0byBpbnN0YWxsIGFuZCB1c2UuCiBGb3IgbW9yZSBpbmZvIGFib3V0IFRrLCBpbmNsdWRpbmcgcG9pbnRlcnMgdG8gdGhlIHNvdXJjZSwgc2VlIHRoZSBUY2wvVGsgaG9tZQotcGFnZSBhdCBodHRwOi8vd3d3LnRjbC50ay4gIFRjbC9UayBpcyBmdWxseSBwb3J0YWJsZSB0byB0aGUgTWFjT1MsIFdpbmRvd3MsIGFuZAotVW5peCBwbGF0Zm9ybXMuCitwYWdlIGF0IGh0dHA6Ly93d3cudGNsLnRrLiAgVGNsL1RrIGlzIGZ1bGx5IHBvcnRhYmxlIHRvIHRoZSBNYWMgT1MgWCwgV2luZG93cywKK2FuZCBVbml4IHBsYXRmb3Jtcy4KIAogd3hXaWRnZXRzCiAtLS0tLS0tLS0KIAogd3hXaWRnZXRzIChodHRwOi8vd3d3Lnd4d2lkZ2V0cy5vcmcpIGlzIGEgZnJlZSwgcG9ydGFibGUgR1VJIGNsYXNzCiBsaWJyYXJ5IHdyaXR0ZW4gaW4gQysrIHRoYXQgcHJvdmlkZXMgYSBuYXRpdmUgbG9vayBhbmQgZmVlbCBvbiBhCi1udW1iZXIgb2YgcGxhdGZvcm1zLCB3aXRoIFdpbmRvd3MsIE1hY09TIFgsIEdUSywgWDExLCBhbGwgbGlzdGVkIGFzCitudW1iZXIgb2YgcGxhdGZvcm1zLCB3aXRoIFdpbmRvd3MsIE1hYyBPUyBYLCBHVEssIFgxMSwgYWxsIGxpc3RlZCBhcwogY3VycmVudCBzdGFibGUgdGFyZ2V0cy4gIExhbmd1YWdlIGJpbmRpbmdzIGFyZSBhdmFpbGFibGUgZm9yIGEgbnVtYmVyCiBvZiBsYW5ndWFnZXMgaW5jbHVkaW5nIFB5dGhvbiwgUGVybCwgUnVieSwgZXRjLgogCkBAIC00NSwxMyArNDcsMTUgQEAKIFF0CiAtLS0KIAotVGhlcmUgYXJlIGJpbmRpbmdzIGF2YWlsYWJsZSBmb3IgdGhlIFF0IHRvb2xraXQgKGBQeVF0Ci08aHR0cDovL3d3dy5yaXZlcmJhbmtjb21wdXRpbmcuY28udWsvc29mdHdhcmUvcHlxdC8+YF8pIGFuZCBmb3IgS0RFIChgUHlLREUgPGh0dHA6Ly93d3cucml2ZXJiYW5rY29tcHV0aW5nLmNvLnVrL3NvZnR3YXJlL3B5a2RlL2ludHJvPmBfXykuICBJZgoteW91J3JlIHdyaXRpbmcgb3BlbiBzb3VyY2Ugc29mdHdhcmUsIHlvdSBkb24ndCBuZWVkIHRvIHBheSBmb3IgUHlRdCwgYnV0IGlmIHlvdQotd2FudCB0byB3cml0ZSBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMsIHlvdSBtdXN0IGJ1eSBhIFB5UXQgbGljZW5zZSBmcm9tCi1gUml2ZXJiYW5rIENvbXB1dGluZyA8aHR0cDovL3d3dy5yaXZlcmJhbmtjb21wdXRpbmcuY28udWs+YF8gYW5kICh1cCB0byBRdCA0LjQ7Ci1RdCA0LjUgdXB3YXJkcyBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTEdQTCBsaWNlbnNlKSBhIFF0IGxpY2Vuc2UgZnJvbSBgVHJvbGx0ZWNoCi08aHR0cDovL3d3dy50cm9sbHRlY2guY29tPmBfLgorVGhlcmUgYXJlIGJpbmRpbmdzIGF2YWlsYWJsZSBmb3IgdGhlIFF0IHRvb2xraXQgKHVzaW5nIGVpdGhlciBgUHlRdAorPGh0dHA6Ly93d3cucml2ZXJiYW5rY29tcHV0aW5nLmNvLnVrL3NvZnR3YXJlL3B5cXQvPmBfIG9yIGBQeVNpZGUKKzxodHRwOi8vd3d3LnB5c2lkZS5vcmcvPmBfKSBhbmQgZm9yIEtERSAoYFB5S0RFIDxodHRwOi8vd3d3LnJpdmVyYmFua2NvbXB1dGluZy5jby51ay9zb2Z0d2FyZS9weWtkZS9pbnRybz5gXykuCitQeVF0IGlzIGN1cnJlbnRseSBtb3JlIG1hdHVyZSB0aGFuIFB5U2lkZSwgYnV0IHlvdSBtdXN0IGJ1eSBhIFB5UXQgbGljZW5zZSBmcm9tCitgUml2ZXJiYW5rIENvbXB1dGluZyA8aHR0cDovL3d3dy5yaXZlcmJhbmtjb21wdXRpbmcuY28udWsvc29mdHdhcmUvcHlxdC9saWNlbnNlPmBfCitpZiB5b3Ugd2FudCB0byB3cml0ZSBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMuICBQeVNpZGUgaXMgZnJlZSBmb3IgYWxsIGFwcGxpY2F0aW9ucy4KKworUXQgNC41IHVwd2FyZHMgaXMgbGljZW5zZWQgdW5kZXIgdGhlIExHUEwgbGljZW5zZTsgYWxzbywgY29tbWVyY2lhbCBsaWNlbnNlcworYXJlIGF2YWlsYWJsZSBmcm9tIGBOb2tpYSA8aHR0cDovL3F0Lm5va2lhLmNvbS8+YF8uCiAKIEd0aysKIC0tLS0KQEAgLTg0LDEzICs4OCw5IEBACiBXaGF0IHBsYXRmb3JtLXNwZWNpZmljIEdVSSB0b29sa2l0cyBleGlzdCBmb3IgUHl0aG9uPwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotYFRoZSBNYWMgcG9ydCA8aHR0cDovL3B5dGhvbi5vcmcvZG93bmxvYWQvbWFjPmBfIGJ5IEphY2sgSmFuc2VuIGhhcyBhIHJpY2ggYW5kCi1ldmVyLWdyb3dpbmcgc2V0IG9mIG1vZHVsZXMgdGhhdCBzdXBwb3J0IHRoZSBuYXRpdmUgTWFjIHRvb2xib3ggY2FsbHMuICBUaGUgcG9ydAotc3VwcG9ydHMgTWFjT1MgWCdzIENhcmJvbiBsaWJyYXJpZXMuCi0KIEJ5IGluc3RhbGxpbmcgdGhlIGBQeU9iamMgT2JqZWN0aXZlLUMgYnJpZGdlCi08aHR0cDovL3B5b2JqYy5zb3VyY2Vmb3JnZS5uZXQ+YF8sIFB5dGhvbiBwcm9ncmFtcyBjYW4gdXNlIE1hY09TIFgncwotQ29jb2EgbGlicmFyaWVzLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gdGhhdCBjb21lcyB3aXRoIHRoZSBNYWMgcG9ydC4KKzxodHRwOi8vcHlvYmpjLnNvdXJjZWZvcmdlLm5ldD5gXywgUHl0aG9uIHByb2dyYW1zIGNhbiB1c2UgTWFjIE9TIFgncworQ29jb2EgbGlicmFyaWVzLgogCiA6cmVmOmBQeXRob253aW4gPHdpbmRvd3MtZmFxPmAgYnkgTWFyayBIYW1tb25kIGluY2x1ZGVzIGFuIGludGVyZmFjZSB0byB0aGUKIE1pY3Jvc29mdCBGb3VuZGF0aW9uIENsYXNzZXMgYW5kIGEgUHl0aG9uIHByb2dyYW1taW5nIGVudmlyb25tZW50CkBAIC0xMTcsNyArMTE3LDcgQEAKIChodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC8pLgogCiBCdWlsZCBUaXggd2l0aCBTQU0gZW5hYmxlZCwgcGVyZm9ybSB0aGUgYXBwcm9wcmlhdGUgY2FsbCB0bwotOmNmdW5jOmBUY2xzYW1faW5pdGAsIGV0Yy4gaW5zaWRlIFB5dGhvbidzCis6YzpmdW5jOmBUY2xzYW1faW5pdGAsIGV0Yy4gaW5zaWRlIFB5dGhvbidzCiA6ZmlsZTpgTW9kdWxlcy90a2FwcGluaXQuY2AsIGFuZCBsaW5rIHdpdGggbGlidGNsc2FtIGFuZCBsaWJ0a3NhbSAoeW91CiBtaWdodCBpbmNsdWRlIHRoZSBUaXggbGlicmFyaWVzIGFzIHdlbGwpLgogCkBAIC0xMjYsNyArMTI2LDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBZZXMsIGFuZCB5b3UgZG9uJ3QgZXZlbiBuZWVkIHRocmVhZHMhICBCdXQgeW91J2xsIGhhdmUgdG8gcmVzdHJ1Y3R1cmUgeW91ciBJL08KLWNvZGUgYSBiaXQuICBUayBoYXMgdGhlIGVxdWl2YWxlbnQgb2YgWHQncyA6Y2Z1bmM6YFh0QWRkSW5wdXQoKWAgY2FsbCwgd2hpY2ggYWxsb3dzIHlvdQorY29kZSBhIGJpdC4gIFRrIGhhcyB0aGUgZXF1aXZhbGVudCBvZiBYdCdzIDpjOmZ1bmM6YFh0QWRkSW5wdXQoKWAgY2FsbCwgd2hpY2ggYWxsb3dzIHlvdQogdG8gcmVnaXN0ZXIgYSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIGNhbGxlZCBmcm9tIHRoZSBUayBtYWlubG9vcCB3aGVuCiBJL08gaXMgcG9zc2libGUgb24gYSBmaWxlIGRlc2NyaXB0b3IuICBIZXJlJ3Mgd2hhdCB5b3UgbmVlZDo6CiAKZGlmZiAtLWdpdCBhL0RvYy9mYXEvaW5kZXgucnN0IGIvRG9jL2ZhcS9pbmRleC5yc3QKaW5kZXggY2FiYTQyNS4uNDZlZDNkYiAxMDA2NDQKLS0tIGEvRG9jL2ZhcS9pbmRleC5yc3QKKysrIGIvRG9jL2ZhcS9pbmRleC5yc3QKQEAgLTEsMTAgKzEsOSBAQAorLi4gX2ZhcS1pbmRleDoKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgUHl0aG9uIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi06UmVsZWFzZTogfHZlcnNpb258Ci06RGF0ZTogfHRvZGF5fAotCiAuLiB0b2N0cmVlOjoKICAgIDptYXhkZXB0aDogMQogCmRpZmYgLS1naXQgYS9Eb2MvZmFxL2xpYnJhcnkucnN0IGIvRG9jL2ZhcS9saWJyYXJ5LnJzdAppbmRleCBjMTIyZDcyLi4wZDgwZjc2IDEwMDY0NAotLS0gYS9Eb2MvZmFxL2xpYnJhcnkucnN0CisrKyBiL0RvYy9mYXEvbGlicmFyeS5yc3QKQEAgLTQsNyArNCw5IEBACiBMaWJyYXJ5IGFuZCBFeHRlbnNpb24gRkFRCiA9PT09PT09PT09PT09PT09PT09PT09PT09CiAKLS4uIGNvbnRlbnRzOjoKKy4uIG9ubHk6OiBodG1sCisKKyAgIC4uIGNvbnRlbnRzOjoKIAogR2VuZXJhbCBMaWJyYXJ5IFF1ZXN0aW9ucwogPT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTQsNyArMTYsNyBAQAogCiBDaGVjayA6cmVmOmB0aGUgTGlicmFyeSBSZWZlcmVuY2UgPGxpYnJhcnktaW5kZXg+YCB0byBzZWUgaWYgdGhlcmUncyBhIHJlbGV2YW50CiBzdGFuZGFyZCBsaWJyYXJ5IG1vZHVsZS4gIChFdmVudHVhbGx5IHlvdSdsbCBsZWFybiB3aGF0J3MgaW4gdGhlIHN0YW5kYXJkCi1saWJyYXJ5IGFuZCB3aWxsIGFibGUgdG8gc2tpcCB0aGlzIHN0ZXAuKQorbGlicmFyeSBhbmQgd2lsbCBiZSBhYmxlIHRvIHNraXAgdGhpcyBzdGVwLikKIAogRm9yIHRoaXJkLXBhcnR5IHBhY2thZ2VzLCBzZWFyY2ggdGhlIGBQeXRob24gUGFja2FnZSBJbmRleAogPGh0dHA6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaT5gXyBvciB0cnkgYEdvb2dsZSA8aHR0cDovL3d3dy5nb29nbGUuY29tPmBfIG9yCkBAIC0yOCw3ICszMCw3IEBACiBJZiB5b3UgY2FuJ3QgZmluZCBhIHNvdXJjZSBmaWxlIGZvciBhIG1vZHVsZSBpdCBtYXkgYmUgYSBidWlsdC1pbiBvcgogZHluYW1pY2FsbHkgbG9hZGVkIG1vZHVsZSBpbXBsZW1lbnRlZCBpbiBDLCBDKysgb3Igb3RoZXIgY29tcGlsZWQgbGFuZ3VhZ2UuCiBJbiB0aGlzIGNhc2UgeW91IG1heSBub3QgaGF2ZSB0aGUgc291cmNlIGZpbGUgb3IgaXQgbWF5IGJlIHNvbWV0aGluZyBsaWtlCi1tYXRobW9kdWxlLmMsIHNvbWV3aGVyZSBpbiBhIEMgc291cmNlIGRpcmVjdG9yeSAobm90IG9uIHRoZSBQeXRob24gUGF0aCkuCis6ZmlsZTpgbWF0aG1vZHVsZS5jYCwgc29tZXdoZXJlIGluIGEgQyBzb3VyY2UgZGlyZWN0b3J5IChub3Qgb24gdGhlIFB5dGhvbiBQYXRoKS4KIAogVGhlcmUgYXJlIChhdCBsZWFzdCkgdGhyZWUga2luZHMgb2YgbW9kdWxlcyBpbiBQeXRob246CiAKQEAgLTYwLDE4ICs2MiwxOCBAQAogaW50ZXJwcmV0ZXIgaXMgaW5zdGFsbGVkIG9uIHlvdXIgcGxhdGZvcm0uCiAKIElmIHlvdSB3b3VsZCBsaWtlIHRoZSBzY3JpcHQgdG8gYmUgaW5kZXBlbmRlbnQgb2Ygd2hlcmUgdGhlIFB5dGhvbiBpbnRlcnByZXRlcgotbGl2ZXMsIHlvdSBjYW4gdXNlIHRoZSAiZW52IiBwcm9ncmFtLiAgQWxtb3N0IGFsbCBVbml4IHZhcmlhbnRzIHN1cHBvcnQgdGhlCi1mb2xsb3dpbmcsIGFzc3VtaW5nIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaXMgaW4gYSBkaXJlY3Rvcnkgb24gdGhlIHVzZXIncwotJFBBVEg6OgorbGl2ZXMsIHlvdSBjYW4gdXNlIHRoZSA6cHJvZ3JhbTpgZW52YCBwcm9ncmFtLiAgQWxtb3N0IGFsbCBVbml4IHZhcmlhbnRzIHN1cHBvcnQKK3RoZSBmb2xsb3dpbmcsIGFzc3VtaW5nIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaXMgaW4gYSBkaXJlY3Rvcnkgb24gdGhlIHVzZXIncworOmVudnZhcjpgUEFUSGA6OgogCiAgICMhL3Vzci9iaW4vZW52IHB5dGhvbgogCi0qRG9uJ3QqIGRvIHRoaXMgZm9yIENHSSBzY3JpcHRzLiAgVGhlICRQQVRIIHZhcmlhYmxlIGZvciBDR0kgc2NyaXB0cyBpcyBvZnRlbgotdmVyeSBtaW5pbWFsLCBzbyB5b3UgbmVlZCB0byB1c2UgdGhlIGFjdHVhbCBhYnNvbHV0ZSBwYXRobmFtZSBvZiB0aGUKKypEb24ndCogZG8gdGhpcyBmb3IgQ0dJIHNjcmlwdHMuICBUaGUgOmVudnZhcjpgUEFUSGAgdmFyaWFibGUgZm9yIENHSSBzY3JpcHRzIGlzCitvZnRlbiB2ZXJ5IG1pbmltYWwsIHNvIHlvdSBuZWVkIHRvIHVzZSB0aGUgYWN0dWFsIGFic29sdXRlIHBhdGhuYW1lIG9mIHRoZQogaW50ZXJwcmV0ZXIuCiAKLU9jY2FzaW9uYWxseSwgYSB1c2VyJ3MgZW52aXJvbm1lbnQgaXMgc28gZnVsbCB0aGF0IHRoZSAvdXNyL2Jpbi9lbnYgcHJvZ3JhbQotZmFpbHM7IG9yIHRoZXJlJ3Mgbm8gZW52IHByb2dyYW0gYXQgYWxsLiAgSW4gdGhhdCBjYXNlLCB5b3UgY2FuIHRyeSB0aGUKK09jY2FzaW9uYWxseSwgYSB1c2VyJ3MgZW52aXJvbm1lbnQgaXMgc28gZnVsbCB0aGF0IHRoZSA6cHJvZ3JhbTpgL3Vzci9iaW4vZW52YAorcHJvZ3JhbSBmYWlsczsgb3IgdGhlcmUncyBubyBlbnYgcHJvZ3JhbSBhdCBhbGwuICBJbiB0aGF0IGNhc2UsIHlvdSBjYW4gdHJ5IHRoZQogZm9sbG93aW5nIGhhY2sgKGR1ZSB0byBBbGV4IFJlemluc2t5KTo6CiAKICAgICMhIC9iaW4vc2gKQEAgLTkxLDEyICs5MywxMiBAQAogCiAuLiBYWFggY3Vyc2VzICppcyogYnVpbHQgYnkgZGVmYXVsdCwgaXNuJ3QgaXQ/CiAKLUZvciBVbml4IHZhcmlhbnRzOiBUaGUgc3RhbmRhcmQgUHl0aG9uIHNvdXJjZSBkaXN0cmlidXRpb24gY29tZXMgd2l0aCBhIGN1cnNlcwotbW9kdWxlIGluIHRoZSBgYE1vZHVsZXMvYGAgc3ViZGlyZWN0b3J5LCB0aG91Z2ggaXQncyBub3QgY29tcGlsZWQgYnkgZGVmYXVsdAotKG5vdGUgdGhhdCB0aGlzIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIFdpbmRvd3MgZGlzdHJpYnV0aW9uIC0tIHRoZXJlIGlzIG5vCi1jdXJzZXMgbW9kdWxlIGZvciBXaW5kb3dzKS4KK0ZvciBVbml4IHZhcmlhbnRzIHRoZSBzdGFuZGFyZCBQeXRob24gc291cmNlIGRpc3RyaWJ1dGlvbiBjb21lcyB3aXRoIGEgY3Vyc2VzCittb2R1bGUgaW4gdGhlIDpzb3VyY2U6YE1vZHVsZXNgIHN1YmRpcmVjdG9yeSwgdGhvdWdoIGl0J3Mgbm90IGNvbXBpbGVkIGJ5IGRlZmF1bHQuCisoTm90ZSB0aGF0IHRoaXMgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgV2luZG93cyBkaXN0cmlidXRpb24gLS0gdGhlcmUgaXMgbm8KK2N1cnNlcyBtb2R1bGUgZm9yIFdpbmRvd3MuKQogCi1UaGUgY3Vyc2VzIG1vZHVsZSBzdXBwb3J0cyBiYXNpYyBjdXJzZXMgZmVhdHVyZXMgYXMgd2VsbCBhcyBtYW55IGFkZGl0aW9uYWwKK1RoZSA6bW9kOmBjdXJzZXNgIG1vZHVsZSBzdXBwb3J0cyBiYXNpYyBjdXJzZXMgZmVhdHVyZXMgYXMgd2VsbCBhcyBtYW55IGFkZGl0aW9uYWwKIGZ1bmN0aW9ucyBmcm9tIG5jdXJzZXMgYW5kIFNZU1YgY3Vyc2VzIHN1Y2ggYXMgY29sb3VyLCBhbHRlcm5hdGl2ZSBjaGFyYWN0ZXIgc2V0CiBzdXBwb3J0LCBwYWRzLCBhbmQgbW91c2Ugc3VwcG9ydC4gVGhpcyBtZWFucyB0aGUgbW9kdWxlIGlzbid0IGNvbXBhdGlibGUgd2l0aAogb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCBvbmx5IGhhdmUgQlNEIGN1cnNlcywgYnV0IHRoZXJlIGRvbid0IHNlZW0gdG8gYmUgYW55CkBAIC0xMTAsNyArMTEyLDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogVGhlIDptb2Q6YGF0ZXhpdGAgbW9kdWxlIHByb3ZpZGVzIGEgcmVnaXN0ZXIgZnVuY3Rpb24gdGhhdCBpcyBzaW1pbGFyIHRvIEMncwotb25leGl0LgorOmM6ZnVuYzpgb25leGl0YC4KIAogCiBXaHkgZG9uJ3QgbXkgc2lnbmFsIGhhbmRsZXJzIHdvcms/CkBAIC0xNDAsOCArMTQyLDggQEAKIFRoZSA6bW9kOmB1bml0dGVzdGAgbW9kdWxlIGlzIGEgZmFuY2llciB0ZXN0aW5nIGZyYW1ld29yayBtb2RlbGxlZCBvbiBKYXZhIGFuZAogU21hbGx0YWxrIHRlc3RpbmcgZnJhbWV3b3Jrcy4KIAotRm9yIHRlc3RpbmcsIGl0IGhlbHBzIHRvIHdyaXRlIHRoZSBwcm9ncmFtIHNvIHRoYXQgaXQgbWF5IGJlIGVhc2lseSB0ZXN0ZWQgYnkKLXVzaW5nIGdvb2QgbW9kdWxhciBkZXNpZ24uICBZb3VyIHByb2dyYW0gc2hvdWxkIGhhdmUgYWxtb3N0IGFsbCBmdW5jdGlvbmFsaXR5CitUbyBtYWtlIHRlc3RpbmcgZWFzaWVyLCB5b3Ugc2hvdWxkIHVzZSBnb29kIG1vZHVsYXIgZGVzaWduIGluIHlvdXIgcHJvZ3JhbS4KK1lvdXIgcHJvZ3JhbSBzaG91bGQgaGF2ZSBhbG1vc3QgYWxsIGZ1bmN0aW9uYWxpdHkKIGVuY2Fwc3VsYXRlZCBpbiBlaXRoZXIgZnVuY3Rpb25zIG9yIGNsYXNzIG1ldGhvZHMgLS0gYW5kIHRoaXMgc29tZXRpbWVzIGhhcyB0aGUKIHN1cnByaXNpbmcgYW5kIGRlbGlnaHRmdWwgZWZmZWN0IG9mIG1ha2luZyB0aGUgcHJvZ3JhbSBydW4gZmFzdGVyIChiZWNhdXNlIGxvY2FsCiB2YXJpYWJsZSBhY2Nlc3NlcyBhcmUgZmFzdGVyIHRoYW4gZ2xvYmFsIGFjY2Vzc2VzKS4gIEZ1cnRoZXJtb3JlIHRoZSBwcm9ncmFtCkBAIC0xNTcsNyArMTU5LDcgQEAKIAogT25jZSB5b3VyIHByb2dyYW0gaXMgb3JnYW5pemVkIGFzIGEgdHJhY3RhYmxlIGNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zIGFuZCBjbGFzcwogYmVoYXZpb3VycyB5b3Ugc2hvdWxkIHdyaXRlIHRlc3QgZnVuY3Rpb25zIHRoYXQgZXhlcmNpc2UgdGhlIGJlaGF2aW91cnMuICBBIHRlc3QKLXN1aXRlIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZWFjaCBtb2R1bGUgd2hpY2ggYXV0b21hdGVzIGEgc2VxdWVuY2Ugb2YgdGVzdHMuCitzdWl0ZSB0aGF0IGF1dG9tYXRlcyBhIHNlcXVlbmNlIG9mIHRlc3RzIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZWFjaCBtb2R1bGUuCiBUaGlzIHNvdW5kcyBsaWtlIGEgbG90IG9mIHdvcmssIGJ1dCBzaW5jZSBQeXRob24gaXMgc28gdGVyc2UgYW5kIGZsZXhpYmxlIGl0J3MKIHN1cnByaXNpbmdseSBlYXN5LiAgWW91IGNhbiBtYWtlIGNvZGluZyBtdWNoIG1vcmUgcGxlYXNhbnQgYW5kIGZ1biBieSB3cml0aW5nCiB5b3VyIHRlc3QgZnVuY3Rpb25zIGluIHBhcmFsbGVsIHdpdGggdGhlICJwcm9kdWN0aW9uIGNvZGUiLCBzaW5jZSB0aGlzIG1ha2VzIGl0CkBAIC0xODYsNyArMTg4LDcgQEAKIEhvdyBkbyBJIGdldCBhIHNpbmdsZSBrZXlwcmVzcyBhdCBhIHRpbWU/CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1Gb3IgVW5peCB2YXJpYW50czogVGhlcmUgYXJlIHNldmVyYWwgc29sdXRpb25zLiAgSXQncyBzdHJhaWdodGZvcndhcmQgdG8gZG8gdGhpcworRm9yIFVuaXggdmFyaWFudHMgdGhlcmUgYXJlIHNldmVyYWwgc29sdXRpb25zLiAgSXQncyBzdHJhaWdodGZvcndhcmQgdG8gZG8gdGhpcwogdXNpbmcgY3Vyc2VzLCBidXQgY3Vyc2VzIGlzIGEgZmFpcmx5IGxhcmdlIG1vZHVsZSB0byBsZWFybi4gIEhlcmUncyBhIHNvbHV0aW9uCiB3aXRob3V0IGN1cnNlczo6CiAKQEAgLTI3Myw3ICsyNzUsNyBAQAogCiAgICB0aW1lLnNsZWVwKDEwKQogCi1JbnN0ZWFkIG9mIHRyeWluZyB0byBndWVzcyBob3cgbG9uZyBhIDpmdW5jOmB0aW1lLnNsZWVwYCBkZWxheSB3aWxsIGJlIGVub3VnaCwKK0luc3RlYWQgb2YgdHJ5aW5nIHRvIGd1ZXNzIGEgZ29vZCBkZWxheSB2YWx1ZSBmb3IgOmZ1bmM6YHRpbWUuc2xlZXBgLAogaXQncyBiZXR0ZXIgdG8gdXNlIHNvbWUga2luZCBvZiBzZW1hcGhvcmUgbWVjaGFuaXNtLiAgT25lIGlkZWEgaXMgdG8gdXNlIHRoZQogOm1vZDpgUXVldWVgIG1vZHVsZSB0byBjcmVhdGUgYSBxdWV1ZSBvYmplY3QsIGxldCBlYWNoIHRocmVhZCBhcHBlbmQgYSB0b2tlbiB0bwogdGhlIHF1ZXVlIHdoZW4gaXQgZmluaXNoZXMsIGFuZCBsZXQgdGhlIG1haW4gdGhyZWFkIHJlYWQgYXMgbWFueSB0b2tlbnMgZnJvbSB0aGUKQEAgLTI4NCwxMCArMjg2LDEwIEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogVXNlIHRoZSA6bW9kOmBRdWV1ZWAgbW9kdWxlIHRvIGNyZWF0ZSBhIHF1ZXVlIGNvbnRhaW5pbmcgYSBsaXN0IG9mIGpvYnMuICBUaGUKLTpjbGFzczpgflF1ZXVlLlF1ZXVlYCBjbGFzcyBtYWludGFpbnMgYSBsaXN0IG9mIG9iamVjdHMgd2l0aCBgYC5wdXQob2JqKWBgIHRvCi1hZGQgYW4gaXRlbSB0byB0aGUgcXVldWUgYW5kIGBgLmdldCgpYGAgdG8gcmV0dXJuIGFuIGl0ZW0uICBUaGUgY2xhc3Mgd2lsbCB0YWtlCi1jYXJlIG9mIHRoZSBsb2NraW5nIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhhdCBlYWNoIGpvYiBpcyBoYW5kZWQgb3V0IGV4YWN0bHkKLW9uY2UuCis6Y2xhc3M6YH5RdWV1ZS5RdWV1ZWAgY2xhc3MgbWFpbnRhaW5zIGEgbGlzdCBvZiBvYmplY3RzIGFuZCBoYXMgYSBgYC5wdXQob2JqKWBgCittZXRob2QgdGhhdCBhZGRzIGl0ZW1zIHRvIHRoZSBxdWV1ZSBhbmQgYSBgYC5nZXQoKWBgIG1ldGhvZCB0byByZXR1cm4gdGhlbS4KK1RoZSBjbGFzcyB3aWxsIHRha2UgY2FyZSBvZiB0aGUgbG9ja2luZyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgZWFjaCBqb2IgaXMKK2hhbmRlZCBvdXQgZXhhY3RseSBvbmNlLgogCiBIZXJlJ3MgYSB0cml2aWFsIGV4YW1wbGU6OgogCkBAIC0yOTYsNyArMjk4LDcgQEAKICAgICMgVGhlIHdvcmtlciB0aHJlYWQgZ2V0cyBqb2JzIG9mZiB0aGUgcXVldWUuICBXaGVuIHRoZSBxdWV1ZSBpcyBlbXB0eSwgaXQKICAgICMgYXNzdW1lcyB0aGVyZSB3aWxsIGJlIG5vIG1vcmUgd29yayBhbmQgZXhpdHMuCiAgICAjIChSZWFsaXN0aWNhbGx5IHdvcmtlcnMgd2lsbCBydW4gdW50aWwgdGVybWluYXRlZC4pCi0gICBkZWYgd29ya2VyICgpOgorICAgZGVmIHdvcmtlcigpOgogICAgICAgIHByaW50ICdSdW5uaW5nIHdvcmtlcicKICAgICAgICB0aW1lLnNsZWVwKDAuMSkKICAgICAgICB3aGlsZSBUcnVlOgpAQCAtMzI5LDYgKzMzMSw4IEBACiAKIFdoZW4gcnVuLCB0aGlzIHdpbGwgcHJvZHVjZSB0aGUgZm9sbG93aW5nIG91dHB1dDoKIAorLi4gY29kZS1ibG9jazo6IG5vbmUKKwogICAgUnVubmluZyB3b3JrZXIKICAgIFJ1bm5pbmcgd29ya2VyCiAgICBSdW5uaW5nIHdvcmtlcgpAQCAtMzQzLDE1ICszNDcsMTUgQEAKICAgIFdvcmtlciA8VGhyZWFkKHdvcmtlciAxLCBzdGFydGVkKT4gcnVubmluZyB3aXRoIGFyZ3VtZW50IDUKICAgIC4uLgogCi1Db25zdWx0IHRoZSBtb2R1bGUncyBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHM7IHRoZSBgYFF1ZXVlYGAgY2xhc3MKLXByb3ZpZGVzIGEgZmVhdHVyZWZ1bCBpbnRlcmZhY2UuCitDb25zdWx0IHRoZSBtb2R1bGUncyBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHM7IHRoZSA6Y2xhc3M6YH5RdWV1ZS5RdWV1ZWAKK2NsYXNzIHByb3ZpZGVzIGEgZmVhdHVyZWZ1bCBpbnRlcmZhY2UuCiAKIAogV2hhdCBraW5kcyBvZiBnbG9iYWwgdmFsdWUgbXV0YXRpb24gYXJlIHRocmVhZC1zYWZlPwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1BIGdsb2JhbCBpbnRlcnByZXRlciBsb2NrIChHSUwpIGlzIHVzZWQgaW50ZXJuYWxseSB0byBlbnN1cmUgdGhhdCBvbmx5IG9uZQotdGhyZWFkIHJ1bnMgaW4gdGhlIFB5dGhvbiBWTSBhdCBhIHRpbWUuICBJbiBnZW5lcmFsLCBQeXRob24gb2ZmZXJzIHRvIHN3aXRjaAorQSA6dGVybTpgZ2xvYmFsIGludGVycHJldGVyIGxvY2tgIChHSUwpIGlzIHVzZWQgaW50ZXJuYWxseSB0byBlbnN1cmUgdGhhdCBvbmx5CitvbmUgdGhyZWFkIHJ1bnMgaW4gdGhlIFB5dGhvbiBWTSBhdCBhIHRpbWUuICBJbiBnZW5lcmFsLCBQeXRob24gb2ZmZXJzIHRvIHN3aXRjaAogYW1vbmcgdGhyZWFkcyBvbmx5IGJldHdlZW4gYnl0ZWNvZGUgaW5zdHJ1Y3Rpb25zOyBob3cgZnJlcXVlbnRseSBpdCBzd2l0Y2hlcyBjYW4KIGJlIHNldCB2aWEgOmZ1bmM6YHN5cy5zZXRjaGVja2ludGVydmFsYC4gIEVhY2ggYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24gYW5kCiB0aGVyZWZvcmUgYWxsIHRoZSBDIGltcGxlbWVudGF0aW9uIGNvZGUgcmVhY2hlZCBmcm9tIGVhY2ggaW5zdHJ1Y3Rpb24gaXMKQEAgLTM5Niw3ICs0MDAsNyBAQAogLi4gWFhYIG1lbnRpb24gbXVsdGlwcm9jZXNzaW5nCiAuLiBYWFggbGluayB0byBkYmVhemxleSdzIHRhbGsgYWJvdXQgR0lMPwogCi1UaGUgR2xvYmFsIEludGVycHJldGVyIExvY2sgKEdJTCkgaXMgb2Z0ZW4gc2VlbiBhcyBhIGhpbmRyYW5jZSB0byBQeXRob24ncworVGhlIDp0ZXJtOmBnbG9iYWwgaW50ZXJwcmV0ZXIgbG9ja2AgKEdJTCkgaXMgb2Z0ZW4gc2VlbiBhcyBhIGhpbmRyYW5jZSB0byBQeXRob24ncwogZGVwbG95bWVudCBvbiBoaWdoLWVuZCBtdWx0aXByb2Nlc3NvciBzZXJ2ZXIgbWFjaGluZXMsIGJlY2F1c2UgYSBtdWx0aS10aHJlYWRlZAogUHl0aG9uIHByb2dyYW0gZWZmZWN0aXZlbHkgb25seSB1c2VzIG9uZSBDUFUsIGR1ZSB0byB0aGUgaW5zaXN0ZW5jZSB0aGF0CiAoYWxtb3N0KSBhbGwgUHl0aG9uIGNvZGUgY2FuIG9ubHkgcnVuIHdoaWxlIHRoZSBHSUwgaXMgaGVsZC4KQEAgLTQxMCw3ICs0MTQsNyBAQAogCiBTaW5jZSB0aGVuLCB0aGUgaWRlYSBvZiBnZXR0aW5nIHJpZCBvZiB0aGUgR0lMIGhhcyBvY2Nhc2lvbmFsbHkgY29tZSB1cCBidXQKIG5vYm9keSBoYXMgZm91bmQgYSB3YXkgdG8gZGVhbCB3aXRoIHRoZSBleHBlY3RlZCBzbG93ZG93biwgYW5kIHVzZXJzIHdobyBkb24ndAotdXNlIHRocmVhZHMgd291bGQgbm90IGJlIGhhcHB5IGlmIHRoZWlyIGNvZGUgcmFuIGF0IGhhbGYgYXQgdGhlIHNwZWVkLiAgR3JlZydzCit1c2UgdGhyZWFkcyB3b3VsZCBub3QgYmUgaGFwcHkgaWYgdGhlaXIgY29kZSByYW4gYXQgaGFsZiB0aGUgc3BlZWQuICBHcmVnJ3MKIGZyZWUgdGhyZWFkaW5nIHBhdGNoIHNldCBoYXMgbm90IGJlZW4ga2VwdCB1cC10by1kYXRlIGZvciBsYXRlciBQeXRob24gdmVyc2lvbnMuCiAKIFRoaXMgZG9lc24ndCBtZWFuIHRoYXQgeW91IGNhbid0IG1ha2UgZ29vZCB1c2Ugb2YgUHl0aG9uIG9uIG11bHRpLUNQVSBtYWNoaW5lcyEKQEAgLTQ1OSw3ICs0NjMsNyBAQAogVG8gdHJ1bmNhdGUgYSBmaWxlLCBvcGVuIGl0IHVzaW5nIGBgZiA9IG9wZW4oZmlsZW5hbWUsICJyKyIpYGAsIGFuZCB1c2UKIGBgZi50cnVuY2F0ZShvZmZzZXQpYGA7IG9mZnNldCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBzZWVrIHBvc2l0aW9uLiAgVGhlcmUncwogYWxzbyBgYG9zLmZ0cnVuY2F0ZShmZCwgb2Zmc2V0KWBgIGZvciBmaWxlcyBvcGVuZWQgd2l0aCA6ZnVuYzpgb3Mub3BlbmAsIHdoZXJlCi1gYGZkYGAgaXMgdGhlIGZpbGUgZGVzY3JpcHRvciAoYSBzbWFsbCBpbnRlZ2VyKS4KKypmZCogaXMgdGhlIGZpbGUgZGVzY3JpcHRvciAoYSBzbWFsbCBpbnRlZ2VyKS4KIAogVGhlIDptb2Q6YHNodXRpbGAgbW9kdWxlIGFsc28gY29udGFpbnMgYSBudW1iZXIgb2YgZnVuY3Rpb25zIHRvIHdvcmsgb24gZmlsZXMKIGluY2x1ZGluZyA6ZnVuYzpgfnNodXRpbC5jb3B5ZmlsZWAsIDpmdW5jOmB+c2h1dGlsLmNvcHl0cmVlYCwgYW5kCkBAIC00OTMsNyArNDk3LDcgQEAKICJzaG9ydCBpbnRlZ2VyIiAoMiBieXRlcyksIGFuZCAnbCcgcmVhZHMgb25lICJsb25nIGludGVnZXIiICg0IGJ5dGVzKSBmcm9tIHRoZQogc3RyaW5nLgogCi1Gb3IgZGF0YSB0aGF0IGlzIG1vcmUgcmVndWxhciAoZS5nLiBhIGhvbW9nZW5lb3VzIGxpc3Qgb2YgaW50cyBvciB0aGVmbG9hdHMpLAorRm9yIGRhdGEgdGhhdCBpcyBtb3JlIHJlZ3VsYXIgKGUuZy4gYSBob21vZ2VuZW91cyBsaXN0IG9mIGludHMgb3IgZmxvYXRzKSwKIHlvdSBjYW4gYWxzbyB1c2UgdGhlIDptb2Q6YGFycmF5YCBtb2R1bGUuCiAKIApAQCAtNTAzLDcgKzUwNyw3IEBACiA6ZnVuYzpgb3MucmVhZGAgaXMgYSBsb3ctbGV2ZWwgZnVuY3Rpb24gd2hpY2ggdGFrZXMgYSBmaWxlIGRlc2NyaXB0b3IsIGEgc21hbGwKIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBvcGVuZWQgZmlsZS4gIDpmdW5jOmBvcy5wb3BlbmAgY3JlYXRlcyBhIGhpZ2gtbGV2ZWwKIGZpbGUgb2JqZWN0LCB0aGUgc2FtZSB0eXBlIHJldHVybmVkIGJ5IHRoZSBidWlsdC1pbiA6ZnVuYzpgb3BlbmAgZnVuY3Rpb24uCi1UaHVzLCB0byByZWFkIG4gYnl0ZXMgZnJvbSBhIHBpcGUgcCBjcmVhdGVkIHdpdGggOmZ1bmM6YG9zLnBvcGVuYCwgeW91IG5lZWQgdG8KK1RodXMsIHRvIHJlYWQgKm4qIGJ5dGVzIGZyb20gYSBwaXBlICpwKiBjcmVhdGVkIHdpdGggOmZ1bmM6YG9zLnBvcGVuYCwgeW91IG5lZWQgdG8KIHVzZSBgYHAucmVhZChuKWBgLgogCiAKQEAgLTUyMiw5ICs1MjYsOSBAQAogCiBXYXJuaW5nOiBpbiBnZW5lcmFsIGl0IGlzIHVud2lzZSB0byBkbyB0aGlzIGJlY2F1c2UgeW91IGNhbiBlYXNpbHkgY2F1c2UgYQogZGVhZGxvY2sgd2hlcmUgeW91ciBwcm9jZXNzIGlzIGJsb2NrZWQgd2FpdGluZyBmb3Igb3V0cHV0IGZyb20gdGhlIGNoaWxkIHdoaWxlCi10aGUgY2hpbGQgaXMgYmxvY2tlZCB3YWl0aW5nIGZvciBpbnB1dCBmcm9tIHlvdS4gIFRoaXMgY2FuIGJlIGNhdXNlZCBiZWNhdXNlIHRoZQotcGFyZW50IGV4cGVjdHMgdGhlIGNoaWxkIHRvIG91dHB1dCBtb3JlIHRleHQgdGhhbiBpdCBkb2VzLCBvciBpdCBjYW4gYmUgY2F1c2VkCi1ieSBkYXRhIGJlaW5nIHN0dWNrIGluIHN0ZGlvIGJ1ZmZlcnMgZHVlIHRvIGxhY2sgb2YgZmx1c2hpbmcuICBUaGUgUHl0aG9uIHBhcmVudAordGhlIGNoaWxkIGlzIGJsb2NrZWQgd2FpdGluZyBmb3IgaW5wdXQgZnJvbSB5b3UuICBUaGlzIGNhbiBiZSBjYXVzZWQgYnkgdGhlCitwYXJlbnQgZXhwZWN0aW5nIHRoZSBjaGlsZCB0byBvdXRwdXQgbW9yZSB0ZXh0IHRoYW4gaXQgZG9lcyBvciBieSBkYXRhIGJlaW5nCitzdHVjayBpbiBzdGRpbyBidWZmZXJzIGR1ZSB0byBsYWNrIG9mIGZsdXNoaW5nLiAgVGhlIFB5dGhvbiBwYXJlbnQKIGNhbiBvZiBjb3Vyc2UgZXhwbGljaXRseSBmbHVzaCB0aGUgZGF0YSBpdCBzZW5kcyB0byB0aGUgY2hpbGQgYmVmb3JlIGl0IHJlYWRzCiBhbnkgb3V0cHV0LCBidXQgaWYgdGhlIGNoaWxkIGlzIGEgbmFpdmUgQyBwcm9ncmFtIGl0IG1heSBoYXZlIGJlZW4gd3JpdHRlbiB0bwogbmV2ZXIgZXhwbGljaXRseSBmbHVzaCBpdHMgb3V0cHV0LCBldmVuIGlmIGl0IGlzIGludGVyYWN0aXZlLCBzaW5jZSBmbHVzaGluZyBpcwpAQCAtNTQ0LDggKzU0OCw4IEBACiBJbiBtYW55IGNhc2VzLCBhbGwgeW91IHJlYWxseSBuZWVkIGlzIHRvIHJ1biBzb21lIGRhdGEgdGhyb3VnaCBhIGNvbW1hbmQgYW5kIGdldAogdGhlIHJlc3VsdCBiYWNrLiAgVW5sZXNzIHRoZSBhbW91bnQgb2YgZGF0YSBpcyB2ZXJ5IGxhcmdlLCB0aGUgZWFzaWVzdCB3YXkgdG8gZG8KIHRoaXMgaXMgdG8gd3JpdGUgaXQgdG8gYSB0ZW1wb3JhcnkgZmlsZSBhbmQgcnVuIHRoZSBjb21tYW5kIHdpdGggdGhhdCB0ZW1wb3JhcnkKLWZpbGUgYXMgaW5wdXQuICBUaGUgc3RhbmRhcmQgbW9kdWxlIDptb2Q6YHRlbXBmaWxlYCBleHBvcnRzIGEgYGBta3RlbXAoKWBgCi1mdW5jdGlvbiB0byBnZW5lcmF0ZSB1bmlxdWUgdGVtcG9yYXJ5IGZpbGUgbmFtZXMuIDo6CitmaWxlIGFzIGlucHV0LiAgVGhlIHN0YW5kYXJkIG1vZHVsZSA6bW9kOmB0ZW1wZmlsZWAgZXhwb3J0cyBhCis6ZnVuYzpgfnRlbXBmaWxlLm1rdGVtcGAgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgdW5pcXVlIHRlbXBvcmFyeSBmaWxlIG5hbWVzLiA6OgogCiAgICBpbXBvcnQgdGVtcGZpbGUKICAgIGltcG9ydCBvcwpAQCAtNjM2LDcgKzY0MCw3IEBACiAuLiBYWFggY2hlY2sgaWYgd2lraSBwYWdlIGlzIHN0aWxsIHVwIHRvIGRhdGUKIAogQSBzdW1tYXJ5IG9mIGF2YWlsYWJsZSBmcmFtZXdvcmtzIGlzIG1haW50YWluZWQgYnkgUGF1bCBCb2RkaWUgYXQKLWh0dHA6Ly93aWtpLnB5dGhvbi5vcmcvbW9pbi9XZWJQcm9ncmFtbWluZyAuCitodHRwOi8vd2lraS5weXRob24ub3JnL21vaW4vV2ViUHJvZ3JhbW1pbmdcIC4KIAogQ2FtZXJvbiBMYWlyZCBtYWludGFpbnMgYSB1c2VmdWwgc2V0IG9mIHBhZ2VzIGFib3V0IFB5dGhvbiB3ZWIgdGVjaG5vbG9naWVzIGF0CiBodHRwOi8vcGhhc2VpdC5uZXQvY2xhaXJkL2NvbXAubGFuZy5weXRob24vd2ViX3B5dGhvbi4KQEAgLTY3MywxNSArNjc3LDEyIEBACiAgICAgICAgc3lzLnN0ZG91dC53cml0ZShodHRwb2JqLmdldGZpbGUoKS5yZWFkKCkpCiAKIE5vdGUgdGhhdCBpbiBnZW5lcmFsIGZvciBwZXJjZW50LWVuY29kZWQgUE9TVCBvcGVyYXRpb25zLCBxdWVyeSBzdHJpbmdzIG11c3QgYmUKLXF1b3RlZCB1c2luZyA6ZnVuYzpgdXJsbGliLnF1b3RlYC4gIEZvciBleGFtcGxlIHRvIHNlbmQgbmFtZT0iR3V5IFN0ZWVsZSwgSnIuIjo6CitxdW90ZWQgdXNpbmcgOmZ1bmM6YHVybGxpYi51cmxlbmNvZGVgLiAgRm9yIGV4YW1wbGUsIHRvIHNlbmQKK2BgbmFtZT1HdXkgU3RlZWxlLCBKci5gYDo6CiAKLSAgID4+PiBmcm9tIHVybGxpYiBpbXBvcnQgcXVvdGUKLSAgID4+PiB4ID0gcXVvdGUoIkd1eSBTdGVlbGUsIEpyLiIpCi0gICA+Pj4geAotICAgJ0d1eSUyMFN0ZWVsZSwlMjBKci4nCi0gICA+Pj4gcXVlcnlfc3RyaW5nID0gIm5hbWU9Iit4Ci0gICA+Pj4gcXVlcnlfc3RyaW5nCi0gICAnbmFtZT1HdXklMjBTdGVlbGUsJTIwSnIuJworICAgPj4+IGltcG9ydCB1cmxsaWIKKyAgID4+PiB1cmxsaWIudXJsZW5jb2RlKHsnbmFtZSc6ICdHdXkgU3RlZWxlLCBKci4nfSkKKyAgICduYW1lPUd1eStTdGVlbGUlMkMrSnIuJwogCiAKIFdoYXQgbW9kdWxlIHNob3VsZCBJIHVzZSB0byBoZWxwIHdpdGggZ2VuZXJhdGluZyBIVE1MPwpAQCAtNjg5LDE5ICs2OTAsOCBAQAogCiAuLiBYWFggYWRkIG1vZGVybiB0ZW1wbGF0ZSBsYW5ndWFnZXMKIAotVGhlcmUgYXJlIG1hbnkgZGlmZmVyZW50IG1vZHVsZXMgYXZhaWxhYmxlOgotCi0qIEhUTUxnZW4gaXMgYSBjbGFzcyBsaWJyYXJ5IG9mIG9iamVjdHMgY29ycmVzcG9uZGluZyB0byBhbGwgdGhlIEhUTUwgMy4yIG1hcmt1cAotICB0YWdzLiBJdCdzIHVzZWQgd2hlbiB5b3UgYXJlIHdyaXRpbmcgaW4gUHl0aG9uIGFuZCB3aXNoIHRvIHN5bnRoZXNpemUgSFRNTAotICBwYWdlcyBmb3IgZ2VuZXJhdGluZyBhIHdlYiBvciBmb3IgQ0dJIGZvcm1zLCBldGMuCi0KLSogRG9jdW1lbnRUZW1wbGF0ZSBhbmQgWm9wZSBQYWdlIFRlbXBsYXRlcyBhcmUgdHdvIGRpZmZlcmVudCBzeXN0ZW1zIHRoYXQgYXJlCi0gIHBhcnQgb2YgWm9wZS4KLQotKiBRdWl4b3RlJ3MgUFRMIHVzZXMgUHl0aG9uIHN5bnRheCB0byBhc3NlbWJsZSBzdHJpbmdzIG9mIHRleHQuCi0KLUNvbnN1bHQgdGhlIGBXZWIgUHJvZ3JhbW1pbmcgd2lraSBwYWdlcwotPGh0dHA6Ly93aWtpLnB5dGhvbi5vcmcvbW9pbi9XZWJQcm9ncmFtbWluZz5gXyBmb3IgbW9yZSBsaW5rcy4KK1lvdSBjYW4gZmluZCBhIGNvbGxlY3Rpb24gb2YgdXNlZnVsIGxpbmtzIG9uIHRoZSBgV2ViIFByb2dyYW1taW5nIHdpa2kgcGFnZQorPGh0dHA6Ly93aWtpLnB5dGhvbi5vcmcvbW9pbi9XZWJQcm9ncmFtbWluZz5gXy4KIAogCiBIb3cgZG8gSSBzZW5kIG1haWwgZnJvbSBhIFB5dGhvbiBzY3JpcHQ/CkBAIC03MzAsNyArNzIwLDcgQEAKICAgIHNlcnZlci5xdWl0KCkKIAogQSBVbml4LW9ubHkgYWx0ZXJuYXRpdmUgdXNlcyBzZW5kbWFpbC4gIFRoZSBsb2NhdGlvbiBvZiB0aGUgc2VuZG1haWwgcHJvZ3JhbQotdmFyaWVzIGJldHdlZW4gc3lzdGVtczsgc29tZXRpbWVzIGl0IGlzIGBgL3Vzci9saWIvc2VuZG1haWxgYCwgc29tZXRpbWUKK3ZhcmllcyBiZXR3ZWVuIHN5c3RlbXM7IHNvbWV0aW1lcyBpdCBpcyBgYC91c3IvbGliL3NlbmRtYWlsYGAsIHNvbWV0aW1lcwogYGAvdXNyL3NiaW4vc2VuZG1haWxgYC4gIFRoZSBzZW5kbWFpbCBtYW51YWwgcGFnZSB3aWxsIGhlbHAgeW91IG91dC4gIEhlcmUncwogc29tZSBzYW1wbGUgY29kZTo6CiAKQEAgLTc5Nyw3ICs3ODcsNyBAQAogVGhlIDptb2Q6YG1hcnNoYWxgIG1vZHVsZSBwcm92aWRlcyB2ZXJ5IGZhc3Qgd2F5cyB0byBzdG9yZSBub25jaXJjdWxhciBiYXNpYwogUHl0aG9uIHR5cGVzIHRvIGZpbGVzIGFuZCBzdHJpbmdzLCBhbmQgYmFjayBhZ2Fpbi4gIEFsdGhvdWdoIG1hcnNoYWwgZG9lcyBub3QgZG8KIGZhbmN5IHRoaW5ncyBsaWtlIHN0b3JlIGluc3RhbmNlcyBvciBoYW5kbGUgc2hhcmVkIHJlZmVyZW5jZXMgcHJvcGVybHksIGl0IGRvZXMKLXJ1biBleHRyZW1lbHkgZmFzdC4gIEZvciBleGFtcGxlIGxvYWRpbmcgYSBoYWxmIG1lZ2FieXRlIG9mIGRhdGEgbWF5IHRha2UgbGVzcworcnVuIGV4dHJlbWVseSBmYXN0LiAgRm9yIGV4YW1wbGUsIGxvYWRpbmcgYSBoYWxmIG1lZ2FieXRlIG9mIGRhdGEgbWF5IHRha2UgbGVzcwogdGhhbiBhIHRoaXJkIG9mIGEgc2Vjb25kLiAgVGhpcyBvZnRlbiBiZWF0cyBkb2luZyBzb21ldGhpbmcgbW9yZSBjb21wbGV4IGFuZAogZ2VuZXJhbCBzdWNoIGFzIHVzaW5nIGdkYm0gd2l0aCBwaWNrbGUvc2hlbHZlLgogCkBAIC04MDcsOSArNzk3LDkgQEAKIAogLi4gWFhYIHVwZGF0ZSB0aGlzLCBkZWZhdWx0IHByb3RvY29sIGlzIDIvMwogCi1UaGUgZGVmYXVsdCBmb3JtYXQgdXNlZCBieSB0aGUgcGlja2xlIG1vZHVsZSBpcyBhIHNsb3cgb25lIHRoYXQgcmVzdWx0cyBpbgotcmVhZGFibGUgcGlja2xlcy4gIE1ha2luZyBpdCB0aGUgZGVmYXVsdCwgYnV0IGl0IHdvdWxkIGJyZWFrIGJhY2t3YXJkCi1jb21wYXRpYmlsaXR5OjoKK0J5IGRlZmF1bHQgOm1vZDpgcGlja2xlYCB1c2VzIGEgcmVsYXRpdmVseSBvbGQgYW5kIHNsb3cgZm9ybWF0IGZvciBiYWNrd2FyZAorY29tcGF0aWJpbGl0eS4gIFlvdSBjYW4gaG93ZXZlciBzcGVjaWZ5IG90aGVyIHByb3RvY29sIHZlcnNpb25zIHRoYXQgYXJlCitmYXN0ZXI6OgogCiAgICAgbGFyZ2VTdHJpbmcgPSAneicgKiAoMTAwICogMTAyNCkKICAgICBteVBpY2tsZSA9IGNQaWNrbGUuZHVtcHMobGFyZ2VTdHJpbmcsIHByb3RvY29sPTEpCmRpZmYgLS1naXQgYS9Eb2MvZmFxL3Byb2dyYW1taW5nLnJzdCBiL0RvYy9mYXEvcHJvZ3JhbW1pbmcucnN0CmluZGV4IDI2OGI5MTguLmUzODMzOTMgMTAwNjQ0Ci0tLSBhL0RvYy9mYXEvcHJvZ3JhbW1pbmcucnN0CisrKyBiL0RvYy9mYXEvcHJvZ3JhbW1pbmcucnN0CkBAIC00LDcgKzQsOSBAQAogUHJvZ3JhbW1pbmcgRkFRCiA9PT09PT09PT09PT09PT0KIAotLi4gY29udGVudHM6OgorLi4gb25seTo6IGh0bWwKKworICAgLi4gY29udGVudHM6OgogCiBHZW5lcmFsIFF1ZXN0aW9ucwogPT09PT09PT09PT09PT09PT0KQEAgLTE0Nyw3ICsxNDksNyBAQAogPGh0dHA6Ly93aWtpLnB5dGhvbi5vcmcvbW9pbi9QeXRob25TcGVlZC9QZXJmb3JtYW5jZVRpcHM+YF8uCiAKIEd1aWRvIHZhbiBSb3NzdW0gaGFzIHdyaXR0ZW4gdXAgYW4gYW5lY2RvdGUgcmVsYXRlZCB0byBvcHRpbWl6YXRpb24gYXQKLWh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvZXNzYXlzL2xpc3Qyc3RyLmh0bWwuCitodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL2Vzc2F5cy9saXN0MnN0ci4KIAogT25lIHRoaW5nIHRvIG5vdGljZSBpcyB0aGF0IGZ1bmN0aW9uIGFuZCAoZXNwZWNpYWxseSkgbWV0aG9kIGNhbGxzIGFyZSByYXRoZXIKIGV4cGVuc2l2ZTsgaWYgeW91IGhhdmUgZGVzaWduZWQgYSBwdXJlbHkgT08gaW50ZXJmYWNlIHdpdGggbG90cyBvZiB0aW55CkBAIC0zNTIsNiArMzU0LDU4IEBACiBkZWNsYXJhdGlvbiBmb3IgaWRlbnRpZnlpbmcgc2lkZS1lZmZlY3RzLgogCiAKK1doeSBkbyBsYW1iZGFzIGRlZmluZWQgaW4gYSBsb29wIHdpdGggZGlmZmVyZW50IHZhbHVlcyBhbGwgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdD8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQXNzdW1lIHlvdSB1c2UgYSBmb3IgbG9vcCB0byBkZWZpbmUgYSBmZXcgZGlmZmVyZW50IGxhbWJkYXMgKG9yIGV2ZW4gcGxhaW4KK2Z1bmN0aW9ucyksIGUuZy46OgorCisgICA+Pj4gc3F1YXJlcyA9IFtdCisgICA+Pj4gZm9yIHggaW4gcmFuZ2UoNSk6CisgICAuLi4gICAgc3F1YXJlcy5hcHBlbmQobGFtYmRhOiB4KioyKQorCitUaGlzIGdpdmVzIHlvdSBhIGxpc3QgdGhhdCBjb250YWlucyA1IGxhbWJkYXMgdGhhdCBjYWxjdWxhdGUgYGB4KioyYGAuICBZb3UKK21pZ2h0IGV4cGVjdCB0aGF0LCB3aGVuIGNhbGxlZCwgdGhleSB3b3VsZCByZXR1cm4sIHJlc3BlY3RpdmVseSwgYGAwYGAsIGBgMWBgLAorYGA0YGAsIGBgOWBgLCBhbmQgYGAxNmBgLiAgSG93ZXZlciwgd2hlbiB5b3UgYWN0dWFsbHkgdHJ5IHlvdSB3aWxsIHNlZSB0aGF0Cit0aGV5IGFsbCByZXR1cm4gYGAxNmBgOjoKKworICAgPj4+IHNxdWFyZXNbMl0oKQorICAgMTYKKyAgID4+PiBzcXVhcmVzWzRdKCkKKyAgIDE2CisKK1RoaXMgaGFwcGVucyBiZWNhdXNlIGBgeGBgIGlzIG5vdCBsb2NhbCB0byB0aGUgbGFtYmRhcywgYnV0IGlzIGRlZmluZWQgaW4KK3RoZSBvdXRlciBzY29wZSwgYW5kIGl0IGlzIGFjY2Vzc2VkIHdoZW4gdGhlIGxhbWJkYSBpcyBjYWxsZWQgLS0tIG5vdCB3aGVuIGl0CitpcyBkZWZpbmVkLiAgQXQgdGhlIGVuZCBvZiB0aGUgbG9vcCwgdGhlIHZhbHVlIG9mIGBgeGBgIGlzIGBgNGBgLCBzbyBhbGwgdGhlCitmdW5jdGlvbnMgbm93IHJldHVybiBgYDQqKjJgYCwgaS5lLiBgYDE2YGAuICBZb3UgY2FuIGFsc28gdmVyaWZ5IHRoaXMgYnkKK2NoYW5naW5nIHRoZSB2YWx1ZSBvZiBgYHhgYCBhbmQgc2VlIGhvdyB0aGUgcmVzdWx0cyBvZiB0aGUgbGFtYmRhcyBjaGFuZ2U6OgorCisgICA+Pj4geCA9IDgKKyAgID4+PiBzcXVhcmVzWzJdKCkKKyAgIDY0CisKK0luIG9yZGVyIHRvIGF2b2lkIHRoaXMsIHlvdSBuZWVkIHRvIHNhdmUgdGhlIHZhbHVlcyBpbiB2YXJpYWJsZXMgbG9jYWwgdG8gdGhlCitsYW1iZGFzLCBzbyB0aGF0IHRoZXkgZG9uJ3QgcmVseSBvbiB0aGUgdmFsdWUgb2YgdGhlIGdsb2JhbCBgYHhgYDo6CisKKyAgID4+PiBzcXVhcmVzID0gW10KKyAgID4+PiBmb3IgeCBpbiByYW5nZSg1KToKKyAgIC4uLiAgICBzcXVhcmVzLmFwcGVuZChsYW1iZGEgbj14OiBuKioyKQorCitIZXJlLCBgYG49eGBgIGNyZWF0ZXMgYSBuZXcgdmFyaWFibGUgYGBuYGAgbG9jYWwgdG8gdGhlIGxhbWJkYSBhbmQgY29tcHV0ZWQKK3doZW4gdGhlIGxhbWJkYSBpcyBkZWZpbmVkIHNvIHRoYXQgaXQgaGFzIHRoZSBzYW1lIHZhbHVlIHRoYXQgYGB4YGAgaGFkIGF0Cit0aGF0IHBvaW50IGluIHRoZSBsb29wLiAgVGhpcyBtZWFucyB0aGF0IHRoZSB2YWx1ZSBvZiBgYG5gYCB3aWxsIGJlIGBgMGBgCitpbiB0aGUgZmlyc3QgbGFtYmRhLCBgYDFgYCBpbiB0aGUgc2Vjb25kLCBgYDJgYCBpbiB0aGUgdGhpcmQsIGFuZCBzbyBvbi4KK1RoZXJlZm9yZSBlYWNoIGxhbWJkYSB3aWxsIG5vdyByZXR1cm4gdGhlIGNvcnJlY3QgcmVzdWx0OjoKKworICAgPj4+IHNxdWFyZXNbMl0oKQorICAgNAorICAgPj4+IHNxdWFyZXNbNF0oKQorICAgMTYKKworTm90ZSB0aGF0IHRoaXMgYmVoYXZpb3VyIGlzIG5vdCBwZWN1bGlhciB0byBsYW1iZGFzLCBidXQgYXBwbGllcyB0byByZWd1bGFyCitmdW5jdGlvbnMgdG9vLgorCisKIEhvdyBkbyBJIHNoYXJlIGdsb2JhbCB2YXJpYWJsZXMgYWNyb3NzIG1vZHVsZXM/CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtNDQ1LDYgKzQ5OSw2MiBAQAogb2NjdXIgd2hlbiB0aGUgbW9kdWxlIGlzIGluaXRpYWxpemVkLgogCiAKK1doeSBhcmUgZGVmYXVsdCB2YWx1ZXMgc2hhcmVkIGJldHdlZW4gb2JqZWN0cz8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyB0eXBlIG9mIGJ1ZyBjb21tb25seSBiaXRlcyBuZW9waHl0ZSBwcm9ncmFtbWVycy4gIENvbnNpZGVyIHRoaXMgZnVuY3Rpb246OgorCisgICBkZWYgZm9vKG15ZGljdD17fSk6ICAjIERhbmdlcjogc2hhcmVkIHJlZmVyZW5jZSB0byBvbmUgZGljdCBmb3IgYWxsIGNhbGxzCisgICAgICAgLi4uIGNvbXB1dGUgc29tZXRoaW5nIC4uLgorICAgICAgIG15ZGljdFtrZXldID0gdmFsdWUKKyAgICAgICByZXR1cm4gbXlkaWN0CisKK1RoZSBmaXJzdCB0aW1lIHlvdSBjYWxsIHRoaXMgZnVuY3Rpb24sIGBgbXlkaWN0YGAgY29udGFpbnMgYSBzaW5nbGUgaXRlbS4gIFRoZQorc2Vjb25kIHRpbWUsIGBgbXlkaWN0YGAgY29udGFpbnMgdHdvIGl0ZW1zIGJlY2F1c2Ugd2hlbiBgYGZvbygpYGAgYmVnaW5zCitleGVjdXRpbmcsIGBgbXlkaWN0YGAgc3RhcnRzIG91dCB3aXRoIGFuIGl0ZW0gYWxyZWFkeSBpbiBpdC4KKworSXQgaXMgb2Z0ZW4gZXhwZWN0ZWQgdGhhdCBhIGZ1bmN0aW9uIGNhbGwgY3JlYXRlcyBuZXcgb2JqZWN0cyBmb3IgZGVmYXVsdAordmFsdWVzLiBUaGlzIGlzIG5vdCB3aGF0IGhhcHBlbnMuIERlZmF1bHQgdmFsdWVzIGFyZSBjcmVhdGVkIGV4YWN0bHkgb25jZSwgd2hlbgordGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQuICBJZiB0aGF0IG9iamVjdCBpcyBjaGFuZ2VkLCBsaWtlIHRoZSBkaWN0aW9uYXJ5IGluIHRoaXMKK2V4YW1wbGUsIHN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIGZ1bmN0aW9uIHdpbGwgcmVmZXIgdG8gdGhpcyBjaGFuZ2VkIG9iamVjdC4KKworQnkgZGVmaW5pdGlvbiwgaW1tdXRhYmxlIG9iamVjdHMgc3VjaCBhcyBudW1iZXJzLCBzdHJpbmdzLCB0dXBsZXMsIGFuZCBgYE5vbmVgYCwKK2FyZSBzYWZlIGZyb20gY2hhbmdlLiBDaGFuZ2VzIHRvIG11dGFibGUgb2JqZWN0cyBzdWNoIGFzIGRpY3Rpb25hcmllcywgbGlzdHMsCithbmQgY2xhc3MgaW5zdGFuY2VzIGNhbiBsZWFkIHRvIGNvbmZ1c2lvbi4KKworQmVjYXVzZSBvZiB0aGlzIGZlYXR1cmUsIGl0IGlzIGdvb2QgcHJvZ3JhbW1pbmcgcHJhY3RpY2UgdG8gbm90IHVzZSBtdXRhYmxlCitvYmplY3RzIGFzIGRlZmF1bHQgdmFsdWVzLiAgSW5zdGVhZCwgdXNlIGBgTm9uZWBgIGFzIHRoZSBkZWZhdWx0IHZhbHVlIGFuZAoraW5zaWRlIHRoZSBmdW5jdGlvbiwgY2hlY2sgaWYgdGhlIHBhcmFtZXRlciBpcyBgYE5vbmVgYCBhbmQgY3JlYXRlIGEgbmV3CitsaXN0L2RpY3Rpb25hcnkvd2hhdGV2ZXIgaWYgaXQgaXMuICBGb3IgZXhhbXBsZSwgZG9uJ3Qgd3JpdGU6OgorCisgICBkZWYgZm9vKG15ZGljdD17fSk6CisgICAgICAgLi4uCisKK2J1dDo6CisKKyAgIGRlZiBmb28obXlkaWN0PU5vbmUpOgorICAgICAgIGlmIG15ZGljdCBpcyBOb25lOgorICAgICAgICAgICBteWRpY3QgPSB7fSAgIyBjcmVhdGUgYSBuZXcgZGljdCBmb3IgbG9jYWwgbmFtZXNwYWNlCisKK1RoaXMgZmVhdHVyZSBjYW4gYmUgdXNlZnVsLiAgV2hlbiB5b3UgaGF2ZSBhIGZ1bmN0aW9uIHRoYXQncyB0aW1lLWNvbnN1bWluZyB0bworY29tcHV0ZSwgYSBjb21tb24gdGVjaG5pcXVlIGlzIHRvIGNhY2hlIHRoZSBwYXJhbWV0ZXJzIGFuZCB0aGUgcmVzdWx0aW5nIHZhbHVlCitvZiBlYWNoIGNhbGwgdG8gdGhlIGZ1bmN0aW9uLCBhbmQgcmV0dXJuIHRoZSBjYWNoZWQgdmFsdWUgaWYgdGhlIHNhbWUgdmFsdWUgaXMKK3JlcXVlc3RlZCBhZ2Fpbi4gIFRoaXMgaXMgY2FsbGVkICJtZW1vaXppbmciLCBhbmQgY2FuIGJlIGltcGxlbWVudGVkIGxpa2UgdGhpczo6CisKKyAgICMgQ2FsbGVycyB3aWxsIG5ldmVyIHByb3ZpZGUgYSB0aGlyZCBwYXJhbWV0ZXIgZm9yIHRoaXMgZnVuY3Rpb24uCisgICBkZWYgZXhwZW5zaXZlKGFyZzEsIGFyZzIsIF9jYWNoZT17fSk6CisgICAgICAgaWYgKGFyZzEsIGFyZzIpIGluIF9jYWNoZToKKyAgICAgICAgICAgcmV0dXJuIF9jYWNoZVsoYXJnMSwgYXJnMildCisKKyAgICAgICAjIENhbGN1bGF0ZSB0aGUgdmFsdWUKKyAgICAgICByZXN1bHQgPSAuLi4gZXhwZW5zaXZlIGNvbXB1dGF0aW9uIC4uLgorICAgICAgIF9jYWNoZVsoYXJnMSwgYXJnMildID0gcmVzdWx0ICAjIFN0b3JlIHJlc3VsdCBpbiB0aGUgY2FjaGUKKyAgICAgICByZXR1cm4gcmVzdWx0CisKK1lvdSBjb3VsZCB1c2UgYSBnbG9iYWwgdmFyaWFibGUgY29udGFpbmluZyBhIGRpY3Rpb25hcnkgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdAordmFsdWU7IGl0J3MgYSBtYXR0ZXIgb2YgdGFzdGUuCisKKwogSG93IGNhbiBJIHBhc3Mgb3B0aW9uYWwgb3Iga2V5d29yZCBwYXJhbWV0ZXJzIGZyb20gb25lIGZ1bmN0aW9uIHRvIGFub3RoZXI/CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtNDY5LDYgKzU3OSwzMSBAQAogICAgICAgIGFwcGx5KGcsICh4LCkrYXJncywga3dhcmdzKQogCiAKKy4uIGluZGV4OjoKKyAgIHNpbmdsZTogYXJndW1lbnQ7IGRpZmZlcmVuY2UgZnJvbSBwYXJhbWV0ZXIKKyAgIHNpbmdsZTogcGFyYW1ldGVyOyBkaWZmZXJlbmNlIGZyb20gYXJndW1lbnQKKworLi4gX2ZhcS1hcmd1bWVudC12cy1wYXJhbWV0ZXI6CisKK1doYXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhcmd1bWVudHMgYW5kIHBhcmFtZXRlcnM/CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis6dGVybTpgUGFyYW1ldGVycyA8cGFyYW1ldGVyPmAgYXJlIGRlZmluZWQgYnkgdGhlIG5hbWVzIHRoYXQgYXBwZWFyIGluIGEKK2Z1bmN0aW9uIGRlZmluaXRpb24sIHdoZXJlYXMgOnRlcm06YGFyZ3VtZW50cyA8YXJndW1lbnQ+YCBhcmUgdGhlIHZhbHVlcworYWN0dWFsbHkgcGFzc2VkIHRvIGEgZnVuY3Rpb24gd2hlbiBjYWxsaW5nIGl0LiAgUGFyYW1ldGVycyBkZWZpbmUgd2hhdCB0eXBlcyBvZgorYXJndW1lbnRzIGEgZnVuY3Rpb24gY2FuIGFjY2VwdC4gIEZvciBleGFtcGxlLCBnaXZlbiB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbjo6CisKKyAgIGRlZiBmdW5jKGZvbywgYmFyPU5vbmUsICoqa3dhcmdzKToKKyAgICAgICBwYXNzCisKKypmb28qLCAqYmFyKiBhbmQgKmt3YXJncyogYXJlIHBhcmFtZXRlcnMgb2YgYGBmdW5jYGAuICBIb3dldmVyLCB3aGVuIGNhbGxpbmcKK2BgZnVuY2BgLCBmb3IgZXhhbXBsZTo6CisKKyAgIGZ1bmMoNDIsIGJhcj0zMTQsIGV4dHJhPXNvbWV2YXIpCisKK3RoZSB2YWx1ZXMgYGA0MmBgLCBgYDMxNGBgLCBhbmQgYGBzb21ldmFyYGAgYXJlIGFyZ3VtZW50cy4KKworCiBIb3cgZG8gSSB3cml0ZSBhIGZ1bmN0aW9uIHdpdGggb3V0cHV0IHBhcmFtZXRlcnMgKGNhbGwgYnkgcmVmZXJlbmNlKT8KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC02NjksMTEgKzgwNCwxMSBAQAogU2luY2UgdGhlIGNvbW1hIGlzIG5vdCBhbiBvcGVyYXRvciwgYnV0IGEgc2VwYXJhdG9yIGJldHdlZW4gZXhwcmVzc2lvbnMgdGhlCiBhYm92ZSBpcyBldmFsdWF0ZWQgYXMgaWYgeW91IGhhZCBlbnRlcmVkOjoKIAotICAgID4+PiAoImEiIGluICJiIiksICJhIgorICAgICgiYSIgaW4gImIiKSwgImEiCiAKIG5vdDo6CiAKLSAgICA+Pj4gImEiIGluICgiYiIsICJhIikKKyAgICAiYSIgaW4gKCJiIiwgImEiKQogCiBUaGUgc2FtZSBpcyB0cnVlIG9mIHRoZSB2YXJpb3VzIGFzc2lnbm1lbnQgb3BlcmF0b3JzIChgYD1gYCwgYGArPWBgIGV0YykuICBUaGV5CiBhcmUgbm90IHRydWx5IG9wZXJhdG9ycyBidXQgc3ludGFjdGljIGRlbGltaXRlcnMgaW4gYXNzaWdubWVudCBzdGF0ZW1lbnRzLgpAQCAtNjkyLDUyICs4MjcsNiBAQAogCiBGb3IgdmVyc2lvbnMgcHJldmlvdXMgdG8gMi41IHRoZSBhbnN3ZXIgd291bGQgYmUgJ05vJy4KIAotLi4gWFhYIHJlbW92ZSByZXN0PwotCi1JbiBtYW55IGNhc2VzIHlvdSBjYW4gbWltaWMgYGBhID8gYiA6IGNgYCB3aXRoIGBgYSBhbmQgYiBvciBjYGAsIGJ1dCB0aGVyZSdzIGEKLWZsYXc6IGlmICpiKiBpcyB6ZXJvIChvciBlbXB0eSwgb3IgYGBOb25lYGAgLS0gYW55dGhpbmcgdGhhdCB0ZXN0cyBmYWxzZSkgdGhlbgotKmMqIHdpbGwgYmUgc2VsZWN0ZWQgaW5zdGVhZC4gIEluIG1hbnkgY2FzZXMgeW91IGNhbiBwcm92ZSBieSBsb29raW5nIGF0IHRoZQotY29kZSB0aGF0IHRoaXMgY2FuJ3QgaGFwcGVuIChlLmcuIGJlY2F1c2UgKmIqIGlzIGEgY29uc3RhbnQgb3IgaGFzIGEgdHlwZSB0aGF0Ci1jYW4gbmV2ZXIgYmUgZmFsc2UpLCBidXQgaW4gZ2VuZXJhbCB0aGlzIGNhbiBiZSBhIHByb2JsZW0uCi0KLVRpbSBQZXRlcnMgKHdobyB3aXNoZXMgaXQgd2FzIFN0ZXZlIE1hamV3c2tpKSBzdWdnZXN0ZWQgdGhlIGZvbGxvd2luZyBzb2x1dGlvbjoKLWBgKGEgYW5kIFtiXSBvciBbY10pWzBdYGAuICBCZWNhdXNlIGBgW2JdYGAgaXMgYSBzaW5nbGV0b24gbGlzdCBpdCBpcyBuZXZlcgotZmFsc2UsIHNvIHRoZSB3cm9uZyBwYXRoIGlzIG5ldmVyIHRha2VuOyB0aGVuIGFwcGx5aW5nIGBgWzBdYGAgdG8gdGhlIHdob2xlCi10aGluZyBnZXRzIHRoZSAqYiogb3IgKmMqIHRoYXQgeW91IHJlYWxseSB3YW50ZWQuICBVZ2x5LCBidXQgaXQgZ2V0cyB5b3UgdGhlcmUKLWluIHRoZSByYXJlIGNhc2VzIHdoZXJlIGl0IGlzIHJlYWxseSBpbmNvbnZlbmllbnQgdG8gcmV3cml0ZSB5b3VyIGNvZGUgdXNpbmcKLSdpZicuCi0KLVRoZSBiZXN0IGNvdXJzZSBpcyB1c3VhbGx5IHRvIHdyaXRlIGEgc2ltcGxlIGBgaWYuLi5lbHNlYGAgc3RhdGVtZW50LiAgQW5vdGhlcgotc29sdXRpb24gaXMgdG8gaW1wbGVtZW50IHRoZSBgYD86YGAgb3BlcmF0b3IgYXMgYSBmdW5jdGlvbjo6Ci0KLSAgIGRlZiBxKGNvbmQsIG9uX3RydWUsIG9uX2ZhbHNlKToKLSAgICAgICBpZiBjb25kOgotICAgICAgICAgICBpZiBub3QgaXNmdW5jdGlvbihvbl90cnVlKToKLSAgICAgICAgICAgICAgIHJldHVybiBvbl90cnVlCi0gICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICByZXR1cm4gb25fdHJ1ZSgpCi0gICAgICAgZWxzZToKLSAgICAgICAgICAgaWYgbm90IGlzZnVuY3Rpb24ob25fZmFsc2UpOgotICAgICAgICAgICAgICAgcmV0dXJuIG9uX2ZhbHNlCi0gICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICByZXR1cm4gb25fZmFsc2UoKQotCi1JbiBtb3N0IGNhc2VzIHlvdSdsbCBwYXNzIGIgYW5kIGMgZGlyZWN0bHk6IGBgcShhLCBiLCBjKWBgLiAgVG8gYXZvaWQgZXZhbHVhdGluZwotYiBvciBjIHdoZW4gdGhleSBzaG91bGRuJ3QgYmUsIGVuY2Fwc3VsYXRlIHRoZW0gd2l0aGluIGEgbGFtYmRhIGZ1bmN0aW9uLCBlLmcuOgotYGBxKGEsIGxhbWJkYTogYiwgbGFtYmRhOiBjKWBgLgotCi1JdCBoYXMgYmVlbiBhc2tlZCAqd2h5KiBQeXRob24gaGFzIG5vIGlmLXRoZW4tZWxzZSBleHByZXNzaW9uLiAgVGhlcmUgYXJlCi1zZXZlcmFsIGFuc3dlcnM6IG1hbnkgbGFuZ3VhZ2VzIGRvIGp1c3QgZmluZSB3aXRob3V0IG9uZTsgaXQgY2FuIGVhc2lseSBsZWFkIHRvCi1sZXNzIHJlYWRhYmxlIGNvZGU7IG5vIHN1ZmZpY2llbnRseSAiUHl0aG9uaWMiIHN5bnRheCBoYXMgYmVlbiBkaXNjb3ZlcmVkOyBhCi1zZWFyY2ggb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkgZm91bmQgcmVtYXJrYWJseSBmZXcgcGxhY2VzIHdoZXJlIHVzaW5nIGFuCi1pZi10aGVuLWVsc2UgZXhwcmVzc2lvbiB3b3VsZCBtYWtlIHRoZSBjb2RlIG1vcmUgdW5kZXJzdGFuZGFibGUuCi0KLUluIDIwMDIsIDpwZXA6YDMwOGAgd2FzIHdyaXR0ZW4gcHJvcG9zaW5nIHNldmVyYWwgcG9zc2libGUgc3ludGF4ZXMgYW5kIHRoZQotY29tbXVuaXR5IHdhcyBhc2tlZCB0byB2b3RlIG9uIHRoZSBpc3N1ZS4gIFRoZSB2b3RlIHdhcyBpbmNvbmNsdXNpdmUuICBNb3N0Ci1wZW9wbGUgbGlrZWQgb25lIG9mIHRoZSBzeW50YXhlcywgYnV0IGFsc28gaGF0ZWQgb3RoZXIgc3ludGF4ZXM7IG1hbnkgdm90ZXMKLWltcGxpZWQgdGhhdCBwZW9wbGUgcHJlZmVycmVkIG5vIHRlcm5hcnkgb3BlcmF0b3IgcmF0aGVyIHRoYW4gaGF2aW5nIGEgc3ludGF4Ci10aGV5IGhhdGVkLgotCiAKIElzIGl0IHBvc3NpYmxlIHRvIHdyaXRlIG9iZnVzY2F0ZWQgb25lLWxpbmVycyBpbiBQeXRob24/CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtODY0LDYgKzk1Myw3IEBACiBZb3UgY2FuJ3QsIGJlY2F1c2Ugc3RyaW5ncyBhcmUgaW1tdXRhYmxlLiAgSWYgeW91IG5lZWQgYW4gb2JqZWN0IHdpdGggdGhpcwogYWJpbGl0eSwgdHJ5IGNvbnZlcnRpbmcgdGhlIHN0cmluZyB0byBhIGxpc3Qgb3IgdXNlIHRoZSBhcnJheSBtb2R1bGU6OgogCisgICA+Pj4gaW1wb3J0IGlvCiAgICA+Pj4gcyA9ICJIZWxsbywgd29ybGQiCiAgICA+Pj4gYSA9IGxpc3QocykKICAgID4+PiBwcmludCBhCkBAIC04NzYsOCArOTY2LDggQEAKICAgID4+PiBhID0gYXJyYXkuYXJyYXkoJ2MnLCBzKQogICAgPj4+IHByaW50IGEKICAgIGFycmF5KCdjJywgJ0hlbGxvLCB3b3JsZCcpCi0gICA+Pj4gYVswXSA9ICd5JyA7IHByaW50IGEKLSAgIGFycmF5KCdjJywgJ3llbGxvIHdvcmxkJykKKyAgID4+PiBhWzBdID0gJ3knOyBwcmludCBhCisgICBhcnJheSgnYycsICd5ZWxsbywgd29ybGQnKQogICAgPj4+IGEudG9zdHJpbmcoKQogICAgJ3llbGxvLCB3b3JsZCcKIApAQCAtOTgwLDcgKzEwNzAsNyBAQAogaWYgdGhlIGxpbmUgdXNlcyBzb21ldGhpbmcgb3RoZXIgdGhhbiB3aGl0ZXNwYWNlIGFzIGEgc2VwYXJhdG9yLgogCiBGb3IgbW9yZSBjb21wbGljYXRlZCBpbnB1dCBwYXJzaW5nLCByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBtb3JlIHBvd2VyZnVsCi10aGFuIEMncyA6Y2Z1bmM6YHNzY2FuZmAgYW5kIGJldHRlciBzdWl0ZWQgZm9yIHRoZSB0YXNrLgordGhhbiBDJ3MgOmM6ZnVuYzpgc3NjYW5mYCBhbmQgYmV0dGVyIHN1aXRlZCBmb3IgdGhlIHRhc2suCiAKIAogV2hhdCBkb2VzICdVbmljb2RlRXJyb3I6IEFTQ0lJIFtkZWNvZGluZyxlbmNvZGluZ10gZXJyb3I6IG9yZGluYWwgbm90IGluIHJhbmdlKDEyOCknIG1lYW4/CkBAIC0xMTM5LDcgKzEyMjksNyBAQAogCiBZb3UgcHJvYmFibHkgdHJpZWQgdG8gbWFrZSBhIG11bHRpZGltZW5zaW9uYWwgYXJyYXkgbGlrZSB0aGlzOjoKIAotICAgQSA9IFtbTm9uZV0gKiAyXSAqIDMKKyAgID4+PiBBID0gW1tOb25lXSAqIDJdICogMwogCiBUaGlzIGxvb2tzIGNvcnJlY3QgaWYgeW91IHByaW50IGl0OjoKIApAQCAtMTE3MSw3ICsxMjYxLDcgQEAKICAgIEEgPSBbW05vbmVdICogdyBmb3IgaSBpbiByYW5nZShoKV0KIAogT3IsIHlvdSBjYW4gdXNlIGFuIGV4dGVuc2lvbiB0aGF0IHByb3ZpZGVzIGEgbWF0cml4IGRhdGF0eXBlOyBgTnVtZXJpYyBQeXRob24KLTxodHRwOi8vbnVtcHkuc2NpcHkub3JnLz5gXyBpcyB0aGUgYmVzdCBrbm93bi4KKzxodHRwOi8vd3d3Lm51bXB5Lm9yZy8+YF8gaXMgdGhlIGJlc3Qga25vd24uCiAKIAogSG93IGRvIEkgYXBwbHkgYSBtZXRob2QgdG8gYSBzZXF1ZW5jZSBvZiBvYmplY3RzPwpAQCAtMTE5MCw2ICsxMjgwLDkyIEBACiAgICAgICAgcmV0dXJuIG1hcChhcHBseSwgbWV0aG9kcywgW2FyZ3VtZW50c10qbm9iamVjdHMpCiAKIAorV2h5IGRvZXMgYV90dXBsZVtpXSArPSBbJ2l0ZW0nXSByYWlzZSBhbiBleGNlcHRpb24gd2hlbiB0aGUgYWRkaXRpb24gd29ya3M/CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBpcyBiZWNhdXNlIG9mIGEgY29tYmluYXRpb24gb2YgdGhlIGZhY3QgdGhhdCBhdWdtZW50ZWQgYXNzaWdubWVudAorb3BlcmF0b3JzIGFyZSAqYXNzaWdubWVudCogb3BlcmF0b3JzLCBhbmQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBtdXRhYmxlIGFuZAoraW1tdXRhYmxlIG9iamVjdHMgaW4gUHl0aG9uLgorCitUaGlzIGRpc2N1c3Npb24gYXBwbGllcyBpbiBnZW5lcmFsIHdoZW4gYXVnbWVudGVkIGFzc2lnbm1lbnQgb3BlcmF0b3JzIGFyZQorYXBwbGllZCB0byBlbGVtZW50cyBvZiBhIHR1cGxlIHRoYXQgcG9pbnQgdG8gbXV0YWJsZSBvYmplY3RzLCBidXQgd2UnbGwgdXNlCithIGBgbGlzdGBgIGFuZCBgYCs9YGAgYXMgb3VyIGV4ZW1wbGFyLgorCitJZiB5b3Ugd3JvdGU6OgorCisgICA+Pj4gYV90dXBsZSA9ICgxLCAyKQorICAgPj4+IGFfdHVwbGVbMF0gKz0gMQorICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICBUeXBlRXJyb3I6ICd0dXBsZScgb2JqZWN0IGRvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50CisKK1RoZSByZWFzb24gZm9yIHRoZSBleGNlcHRpb24gc2hvdWxkIGJlIGltbWVkaWF0ZWx5IGNsZWFyOiBgYDFgYCBpcyBhZGRlZCB0byB0aGUKK29iamVjdCBgYGFfdHVwbGVbMF1gYCBwb2ludHMgdG8gKGBgMWBgKSwgcHJvZHVjaW5nIHRoZSByZXN1bHQgb2JqZWN0LCBgYDJgYCwKK2J1dCB3aGVuIHdlIGF0dGVtcHQgdG8gYXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGNvbXB1dGF0aW9uLCBgYDJgYCwgdG8gZWxlbWVudAorYGAwYGAgb2YgdGhlIHR1cGxlLCB3ZSBnZXQgYW4gZXJyb3IgYmVjYXVzZSB3ZSBjYW4ndCBjaGFuZ2Ugd2hhdCBhbiBlbGVtZW50IG9mCithIHR1cGxlIHBvaW50cyB0by4KKworVW5kZXIgdGhlIGNvdmVycywgd2hhdCB0aGlzIGF1Z21lbnRlZCBhc3NpZ25tZW50IHN0YXRlbWVudCBpcyBkb2luZyBpcworYXBwcm94aW1hdGVseSB0aGlzOjoKKworICAgPj4+IHJlc3VsdCA9IGFfdHVwbGVbMF0gKyAxCisgICA+Pj4gYV90dXBsZVswXSA9IHJlc3VsdAorICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAuLi4KKyAgIFR5cGVFcnJvcjogJ3R1cGxlJyBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQKKworSXQgaXMgdGhlIGFzc2lnbm1lbnQgcGFydCBvZiB0aGUgb3BlcmF0aW9uIHRoYXQgcHJvZHVjZXMgdGhlIGVycm9yLCBzaW5jZSBhCit0dXBsZSBpcyBpbW11dGFibGUuCisKK1doZW4geW91IHdyaXRlIHNvbWV0aGluZyBsaWtlOjoKKworICAgPj4+IGFfdHVwbGUgPSAoWydmb28nXSwgJ2JhcicpCisgICA+Pj4gYV90dXBsZVswXSArPSBbJ2l0ZW0nXQorICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAuLi4KKyAgIFR5cGVFcnJvcjogJ3R1cGxlJyBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQKKworVGhlIGV4Y2VwdGlvbiBpcyBhIGJpdCBtb3JlIHN1cnByaXNpbmcsIGFuZCBldmVuIG1vcmUgc3VycHJpc2luZyBpcyB0aGUgZmFjdAordGhhdCBldmVuIHRob3VnaCB0aGVyZSB3YXMgYW4gZXJyb3IsIHRoZSBhcHBlbmQgd29ya2VkOjoKKworICAgID4+PiBhX3R1cGxlWzBdCisgICAgWydmb28nLCAnaXRlbSddCisKK1RvIHNlZSB3aHkgdGhpcyBoYXBwZW5zLCB5b3UgbmVlZCB0byBrbm93IHRoYXQgKGEpIGlmIGFuIG9iamVjdCBpbXBsZW1lbnRzIGFuCitgYF9faWFkZF9fYGAgbWFnaWMgbWV0aG9kLCBpdCBnZXRzIGNhbGxlZCB3aGVuIHRoZSBgYCs9YGAgYXVnbWVudGVkIGFzc2lnbm1lbnQKK2lzIGV4ZWN1dGVkLCBhbmQgaXRzIHJldHVybiB2YWx1ZSBpcyB3aGF0IGdldHMgdXNlZCBpbiB0aGUgYXNzaWdubWVudCBzdGF0ZW1lbnQ7CithbmQgKGIpIGZvciBsaXN0cywgYGBfX2lhZGRfX2BgIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBgYGV4dGVuZGBgIG9uIHRoZSBsaXN0CithbmQgcmV0dXJuaW5nIHRoZSBsaXN0LiAgVGhhdCdzIHdoeSB3ZSBzYXkgdGhhdCBmb3IgbGlzdHMsIGBgKz1gYCBpcyBhCisic2hvcnRoYW5kIiBmb3IgYGBsaXN0LmV4dGVuZGBgOjoKKworICAgID4+PiBhX2xpc3QgPSBbXQorICAgID4+PiBhX2xpc3QgKz0gWzFdCisgICAgPj4+IGFfbGlzdAorICAgIFsxXQorCitUaGlzIGlzIGVxdWl2YWxlbnQgdG86OgorCisgICAgPj4+IHJlc3VsdCA9IGFfbGlzdC5fX2lhZGRfXyhbMV0pCisgICAgPj4+IGFfbGlzdCA9IHJlc3VsdAorCitUaGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgYV9saXN0IGhhcyBiZWVuIG11dGF0ZWQsIGFuZCB0aGUgcG9pbnRlciB0byB0aGUKK211dGF0ZWQgb2JqZWN0IGlzIGFzc2lnbmVkIGJhY2sgdG8gYGBhX2xpc3RgYC4gIFRoZSBlbmQgcmVzdWx0IG9mIHRoZQorYXNzaWdubWVudCBpcyBhIG5vLW9wLCBzaW5jZSBpdCBpcyBhIHBvaW50ZXIgdG8gdGhlIHNhbWUgb2JqZWN0IHRoYXQgYGBhX2xpc3RgYAord2FzIHByZXZpb3VzbHkgcG9pbnRpbmcgdG8sIGJ1dCB0aGUgYXNzaWdubWVudCBzdGlsbCBoYXBwZW5zLgorCitUaHVzLCBpbiBvdXIgdHVwbGUgZXhhbXBsZSB3aGF0IGlzIGhhcHBlbmluZyBpcyBlcXVpdmFsZW50IHRvOjoKKworICAgPj4+IHJlc3VsdCA9IGFfdHVwbGVbMF0uX19pYWRkX18oWydpdGVtJ10pCisgICA+Pj4gYV90dXBsZVswXSA9IHJlc3VsdAorICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAuLi4KKyAgIFR5cGVFcnJvcjogJ3R1cGxlJyBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQKKworVGhlIGBgX19pYWRkX19gYCBzdWNjZWVkcywgYW5kIHRodXMgdGhlIGxpc3QgaXMgZXh0ZW5kZWQsIGJ1dCBldmVuIHRob3VnaAorYGByZXN1bHRgYCBwb2ludHMgdG8gdGhlIHNhbWUgb2JqZWN0IHRoYXQgYGBhX3R1cGxlWzBdYGAgYWxyZWFkeSBwb2ludHMgdG8sCit0aGF0IGZpbmFsIGFzc2lnbm1lbnQgc3RpbGwgcmVzdWx0cyBpbiBhbiBlcnJvciwgYmVjYXVzZSB0dXBsZXMgYXJlIGltbXV0YWJsZS4KKworCiBEaWN0aW9uYXJpZXMKID09PT09PT09PT09PQogCkBAIC0xNjA0LDYgKzE3ODAsMzIgQEAKIGtlZXBpbmcgYSBsaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyB0byBlYWNoIGluc3RhbmNlLgogCiAKK1doeSBkb2VzIHRoZSByZXN1bHQgb2YgYGBpZCgpYGAgYXBwZWFyIHRvIGJlIG5vdCB1bmlxdWU/CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgOmZ1bmM6YGlkYCBidWlsdGluIHJldHVybnMgYW4gaW50ZWdlciB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgdW5pcXVlIGR1cmluZwordGhlIGxpZmV0aW1lIG9mIHRoZSBvYmplY3QuICBTaW5jZSBpbiBDUHl0aG9uLCB0aGlzIGlzIHRoZSBvYmplY3QncyBtZW1vcnkKK2FkZHJlc3MsIGl0IGhhcHBlbnMgZnJlcXVlbnRseSB0aGF0IGFmdGVyIGFuIG9iamVjdCBpcyBkZWxldGVkIGZyb20gbWVtb3J5LCB0aGUKK25leHQgZnJlc2hseSBjcmVhdGVkIG9iamVjdCBpcyBhbGxvY2F0ZWQgYXQgdGhlIHNhbWUgcG9zaXRpb24gaW4gbWVtb3J5LiAgVGhpcworaXMgaWxsdXN0cmF0ZWQgYnkgdGhpcyBleGFtcGxlOgorCis+Pj4gaWQoMTAwMCkKKzEzOTAxMjcyCis+Pj4gaWQoMjAwMCkKKzEzOTAxMjcyCisKK1RoZSB0d28gaWRzIGJlbG9uZyB0byBkaWZmZXJlbnQgaW50ZWdlciBvYmplY3RzIHRoYXQgYXJlIGNyZWF0ZWQgYmVmb3JlLCBhbmQKK2RlbGV0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZXhlY3V0aW9uIG9mIHRoZSBgYGlkKClgYCBjYWxsLiAgVG8gYmUgc3VyZSB0aGF0CitvYmplY3RzIHdob3NlIGlkIHlvdSB3YW50IHRvIGV4YW1pbmUgYXJlIHN0aWxsIGFsaXZlLCBjcmVhdGUgYW5vdGhlciByZWZlcmVuY2UKK3RvIHRoZSBvYmplY3Q6CisKKz4+PiBhID0gMTAwMDsgYiA9IDIwMDAKKz4+PiBpZChhKQorMTM5MDEyNzIKKz4+PiBpZChiKQorMTM4OTEyOTYKKworCiBNb2R1bGVzCiA9PT09PT09CiAKQEAgLTE2MjEsMTMgKzE4MjMsMTMgQEAKIChwZXJtaXNzaW9ucywgZnJlZSBzcGFjZSwgZXRjLi4uKSB0byB3cml0ZSB0aGUgY29tcGlsZWQgbW9kdWxlIGJhY2sgdG8gdGhlCiBkaXJlY3RvcnkuCiAKLVJ1bm5pbmcgUHl0aG9uIG9uIGEgdG9wIGxldmVsIHNjcmlwdCBpcyBub3QgY29uc2lkZXJlZCBhbiBpbXBvcnQgYW5kIG5vIGBgLnB5Y2BgCi13aWxsIGJlIGNyZWF0ZWQuICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSB0b3AtbGV2ZWwgbW9kdWxlIGBgYWJjLnB5YGAgdGhhdAotaW1wb3J0cyBhbm90aGVyIG1vZHVsZSBgYHh5ei5weWBgLCB3aGVuIHlvdSBydW4gYWJjLCBgYHh5ei5weWNgYCB3aWxsIGJlIGNyZWF0ZWQKLXNpbmNlIHh5eiBpcyBpbXBvcnRlZCwgYnV0IG5vIGBgYWJjLnB5Y2BgIGZpbGUgd2lsbCBiZSBjcmVhdGVkIHNpbmNlIGBgYWJjLnB5YGAKLWlzbid0IGJlaW5nIGltcG9ydGVkLgorUnVubmluZyBQeXRob24gb24gYSB0b3AgbGV2ZWwgc2NyaXB0IGlzIG5vdCBjb25zaWRlcmVkIGFuIGltcG9ydCBhbmQgbm8KK2BgLnB5Y2BgIHdpbGwgYmUgY3JlYXRlZC4gIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIHRvcC1sZXZlbCBtb2R1bGUKK2BgZm9vLnB5YGAgdGhhdCBpbXBvcnRzIGFub3RoZXIgbW9kdWxlIGBgeHl6LnB5YGAsIHdoZW4geW91IHJ1biBgYGZvb2BgLAorYGB4eXoucHljYGAgd2lsbCBiZSBjcmVhdGVkIHNpbmNlIGBgeHl6YGAgaXMgaW1wb3J0ZWQsIGJ1dCBubyBgYGZvby5weWNgYCBmaWxlCit3aWxsIGJlIGNyZWF0ZWQgc2luY2UgYGBmb28ucHlgYCBpc24ndCBiZWluZyBpbXBvcnRlZC4KIAotSWYgeW91IG5lZWQgdG8gY3JlYXRlIGFiYy5weWMgLS0gdGhhdCBpcywgdG8gY3JlYXRlIGEgLnB5YyBmaWxlIGZvciBhIG1vZHVsZQorSWYgeW91IG5lZWQgdG8gY3JlYXRlIGBgZm9vLnB5Y2BgIC0tIHRoYXQgaXMsIHRvIGNyZWF0ZSBhIGBgLnB5Y2BgIGZpbGUgZm9yIGEgbW9kdWxlCiB0aGF0IGlzIG5vdCBpbXBvcnRlZCAtLSB5b3UgY2FuLCB1c2luZyB0aGUgOm1vZDpgcHlfY29tcGlsZWAgYW5kCiA6bW9kOmBjb21waWxlYWxsYCBtb2R1bGVzLgogCkBAIC0xNjM1LDkgKzE4MzcsOSBAQAogdGhlIGBgY29tcGlsZSgpYGAgZnVuY3Rpb24gaW4gdGhhdCBtb2R1bGUgaW50ZXJhY3RpdmVseTo6CiAKICAgID4+PiBpbXBvcnQgcHlfY29tcGlsZQotICAgPj4+IHB5X2NvbXBpbGUuY29tcGlsZSgnYWJjLnB5JykKKyAgID4+PiBweV9jb21waWxlLmNvbXBpbGUoJ2Zvby5weScpICAgICAgICAgICAgICAgICAjIGRvY3Rlc3Q6ICtTS0lQCiAKLVRoaXMgd2lsbCB3cml0ZSB0aGUgYGAucHljYGAgdG8gdGhlIHNhbWUgbG9jYXRpb24gYXMgYGBhYmMucHlgYCAob3IgeW91IGNhbgorVGhpcyB3aWxsIHdyaXRlIHRoZSBgYC5weWNgYCB0byB0aGUgc2FtZSBsb2NhdGlvbiBhcyBgYGZvby5weWBgIChvciB5b3UgY2FuCiBvdmVycmlkZSB0aGF0IHdpdGggdGhlIG9wdGlvbmFsIHBhcmFtZXRlciBgYGNmaWxlYGApLgogCiBZb3UgY2FuIGFsc28gYXV0b21hdGljYWxseSBjb21waWxlIGFsbCBmaWxlcyBpbiBhIGRpcmVjdG9yeSBvciBkaXJlY3RvcmllcyB1c2luZwpkaWZmIC0tZ2l0IGEvRG9jL2ZhcS93aW5kb3dzLnJzdCBiL0RvYy9mYXEvd2luZG93cy5yc3QKaW5kZXggOTZkMWM1MS4uMDM3OWJhYyAxMDA2NDQKLS0tIGEvRG9jL2ZhcS93aW5kb3dzLnJzdAorKysgYi9Eb2MvZmFxL3dpbmRvd3MucnN0CkBAIC02LDE2ICs2LDE2IEBACiBQeXRob24gb24gV2luZG93cyBGQVEKID09PT09PT09PT09PT09PT09PT09PQogCi0uLiBjb250ZW50czo6CisuLiBvbmx5OjogaHRtbAorCisgICAuLiBjb250ZW50czo6CiAKIEhvdyBkbyBJIHJ1biBhIFB5dGhvbiBwcm9ncmFtIHVuZGVyIFdpbmRvd3M/CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBUaGlzIGlzIG5vdCBuZWNlc3NhcmlseSBhIHN0cmFpZ2h0Zm9yd2FyZCBxdWVzdGlvbi4gSWYgeW91IGFyZSBhbHJlYWR5IGZhbWlsaWFyCiB3aXRoIHJ1bm5pbmcgcHJvZ3JhbXMgZnJvbSB0aGUgV2luZG93cyBjb21tYW5kIGxpbmUgdGhlbiBldmVyeXRoaW5nIHdpbGwgc2VlbQotb2J2aW91czsgb3RoZXJ3aXNlLCB5b3UgbWlnaHQgbmVlZCBhIGxpdHRsZSBtb3JlIGd1aWRhbmNlLiAgVGhlcmUgYXJlIGFsc28KLWRpZmZlcmVuY2VzIGJldHdlZW4gV2luZG93cyA5NSwgOTgsIE5ULCBNRSwgMjAwMCBhbmQgWFAgd2hpY2ggY2FuIGFkZCB0byB0aGUKLWNvbmZ1c2lvbi4KK29idmlvdXM7IG90aGVyd2lzZSwgeW91IG1pZ2h0IG5lZWQgYSBsaXR0bGUgbW9yZSBndWlkYW5jZS4KIAogLi4gc2lkZWJhcjo6IHxQeXRob24gRGV2ZWxvcG1lbnQgb24gWFB8XwogICAgOnN1YnRpdGxlOiBgUHl0aG9uIERldmVsb3BtZW50IG9uIFhQYF8KQEAgLTMyLDcgKzMyLDcgQEAKIFVubGVzcyB5b3UgdXNlIHNvbWUgc29ydCBvZiBpbnRlZ3JhdGVkIGRldmVsb3BtZW50IGVudmlyb25tZW50LCB5b3Ugd2lsbCBlbmQgdXAKICp0eXBpbmcqIFdpbmRvd3MgY29tbWFuZHMgaW50byB3aGF0IGlzIHZhcmlvdXNseSByZWZlcnJlZCB0byBhcyBhICJET1Mgd2luZG93Igogb3IgIkNvbW1hbmQgcHJvbXB0IHdpbmRvdyIuICBVc3VhbGx5IHlvdSBjYW4gY3JlYXRlIHN1Y2ggYSB3aW5kb3cgZnJvbSB5b3VyCi1TdGFydCBtZW51OyB1bmRlciBXaW5kb3dzIDIwMDAgdGhlIG1lbnUgc2VsZWN0aW9uIGlzIDptZW51c2VsZWN0aW9uOmBTdGFydCAtLT4KK1N0YXJ0IG1lbnU7IHVuZGVyIFdpbmRvd3MgNyB0aGUgbWVudSBzZWxlY3Rpb24gaXMgOm1lbnVzZWxlY3Rpb246YFN0YXJ0IC0tPgogUHJvZ3JhbXMgLS0+IEFjY2Vzc29yaWVzIC0tPiBDb21tYW5kIFByb21wdGAuICBZb3Ugc2hvdWxkIGJlIGFibGUgdG8gcmVjb2duaXplCiB3aGVuIHlvdSBoYXZlIHN0YXJ0ZWQgc3VjaCBhIHdpbmRvdyBiZWNhdXNlIHlvdSB3aWxsIHNlZSBhIFdpbmRvd3MgImNvbW1hbmQKIHByb21wdCIsIHdoaWNoIHVzdWFsbHkgbG9va3MgbGlrZSB0aGlzOjoKQEAgLTQyLDIzICs0MiwyNyBAQAogVGhlIGxldHRlciBtYXkgYmUgZGlmZmVyZW50LCBhbmQgdGhlcmUgbWlnaHQgYmUgb3RoZXIgdGhpbmdzIGFmdGVyIGl0LCBzbyB5b3UKIG1pZ2h0IGp1c3QgYXMgZWFzaWx5IHNlZSBzb21ldGhpbmcgbGlrZTo6CiAKLSAgIEQ6XFN0ZXZlXFByb2plY3RzXFB5dGhvbj4KKyAgIEQ6XFlvdXJOYW1lXFByb2plY3RzXFB5dGhvbj4KIAogZGVwZW5kaW5nIG9uIGhvdyB5b3VyIGNvbXB1dGVyIGhhcyBiZWVuIHNldCB1cCBhbmQgd2hhdCBlbHNlIHlvdSBoYXZlIHJlY2VudGx5CiBkb25lIHdpdGggaXQuICBPbmNlIHlvdSBoYXZlIHN0YXJ0ZWQgc3VjaCBhIHdpbmRvdywgeW91IGFyZSB3ZWxsIG9uIHRoZSB3YXkgdG8KIHJ1bm5pbmcgUHl0aG9uIHByb2dyYW1zLgogCiBZb3UgbmVlZCB0byByZWFsaXplIHRoYXQgeW91ciBQeXRob24gc2NyaXB0cyBoYXZlIHRvIGJlIHByb2Nlc3NlZCBieSBhbm90aGVyCi1wcm9ncmFtIGNhbGxlZCB0aGUgUHl0aG9uIGludGVycHJldGVyLiAgVGhlIGludGVycHJldGVyIHJlYWRzIHlvdXIgc2NyaXB0LAorcHJvZ3JhbSBjYWxsZWQgdGhlIFB5dGhvbiAqaW50ZXJwcmV0ZXIqLiAgVGhlIGludGVycHJldGVyIHJlYWRzIHlvdXIgc2NyaXB0LAogY29tcGlsZXMgaXQgaW50byBieXRlY29kZXMsIGFuZCB0aGVuIGV4ZWN1dGVzIHRoZSBieXRlY29kZXMgdG8gcnVuIHlvdXIKIHByb2dyYW0uIFNvLCBob3cgZG8geW91IGFycmFuZ2UgZm9yIHRoZSBpbnRlcnByZXRlciB0byBoYW5kbGUgeW91ciBQeXRob24/CiAKIEZpcnN0LCB5b3UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB5b3VyIGNvbW1hbmQgd2luZG93IHJlY29nbmlzZXMgdGhlIHdvcmQKICJweXRob24iIGFzIGFuIGluc3RydWN0aW9uIHRvIHN0YXJ0IHRoZSBpbnRlcnByZXRlci4gIElmIHlvdSBoYXZlIG9wZW5lZCBhCiBjb21tYW5kIHdpbmRvdywgeW91IHNob3VsZCB0cnkgZW50ZXJpbmcgdGhlIGNvbW1hbmQgYGBweXRob25gYCBhbmQgaGl0dGluZwotcmV0dXJuLiAgWW91IHNob3VsZCB0aGVuIHNlZSBzb21ldGhpbmcgbGlrZTo6CityZXR1cm4uOjoKIAotICAgUHl0aG9uIDIuMiAoIzI4LCBEZWMgMjEgMjAwMSwgMTI6MjE6MjIpIFtNU0MgMzIgYml0IChJbnRlbCldIG9uIHdpbjMyCisgICBDOlxVc2Vyc1xZb3VyTmFtZT4gcHl0aG9uCisKK1lvdSBzaG91bGQgdGhlbiBzZWUgc29tZXRoaW5nIGxpa2U6OgorCisgICBQeXRob24gMi43LjMgKGRlZmF1bHQsIEFwciAxMCAyMDEyLCAyMi43MToyNikgW01TQyB2LjE1MDAgMzIgYml0IChJbnRlbCldIG9uIHdpbjMyCiAgICBUeXBlICJoZWxwIiwgImNvcHlyaWdodCIsICJjcmVkaXRzIiBvciAibGljZW5zZSIgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICA+Pj4KIApAQCAtNzgsNyArODIsNyBAQAogV2luZG93cyBjb21tYW5kIHByb21wdC4KIAogWW91IG1heSBhbHNvIGZpbmQgdGhhdCB5b3UgaGF2ZSBhIFN0YXJ0LW1lbnUgZW50cnkgc3VjaCBhcyA6bWVudXNlbGVjdGlvbjpgU3RhcnQKLS0tPiBQcm9ncmFtcyAtLT4gUHl0aG9uIDIuMiAtLT4gUHl0aG9uIChjb21tYW5kIGxpbmUpYCB0aGF0IHJlc3VsdHMgaW4geW91CistLT4gUHJvZ3JhbXMgLS0+IFB5dGhvbiAyLjcgLS0+IFB5dGhvbiAoY29tbWFuZCBsaW5lKWAgdGhhdCByZXN1bHRzIGluIHlvdQogc2VlaW5nIHRoZSBgYD4+PmBgIHByb21wdCBpbiBhIG5ldyB3aW5kb3cuICBJZiBzbywgdGhlIHdpbmRvdyB3aWxsIGRpc2FwcGVhcgogYWZ0ZXIgeW91IGVudGVyIHRoZSBDdHJsLVogY2hhcmFjdGVyOyBXaW5kb3dzIGlzIHJ1bm5pbmcgYSBzaW5nbGUgInB5dGhvbiIKIGNvbW1hbmQgaW4gdGhlIHdpbmRvdywgYW5kIGNsb3NlcyBpdCB3aGVuIHlvdSB0ZXJtaW5hdGUgdGhlIGludGVycHJldGVyLgpAQCAtODYsOCArOTAsNyBAQAogSWYgdGhlIGBgcHl0aG9uYGAgY29tbWFuZCwgaW5zdGVhZCBvZiBkaXNwbGF5aW5nIHRoZSBpbnRlcnByZXRlciBwcm9tcHQgYGA+Pj5gYCwKIGdpdmVzIHlvdSBhIG1lc3NhZ2UgbGlrZTo6CiAKLSAgICdweXRob24nIGlzIG5vdCByZWNvZ25pemVkIGFzIGFuIGludGVybmFsIG9yIGV4dGVybmFsIGNvbW1hbmQsCi0gICBvcGVyYWJsZSBwcm9ncmFtIG9yIGJhdGNoIGZpbGUuCisgICAncHl0aG9uJyBpcyBub3QgcmVjb2duaXplZCBhcyBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBjb21tYW5kLCBvcGVyYWJsZSBwcm9ncmFtIG9yIGJhdGNoIGZpbGUuCiAKIC4uIHNpZGViYXI6OiB8QWRkaW5nIFB5dGhvbiB0byBET1MgUGF0aHxfCiAgICA6c3VidGl0bGU6IGBBZGRpbmcgUHl0aG9uIHRvIERPUyBQYXRoYF8KQEAgLTExNiwxMTUgKzExOSwzMyBAQAogICAgZGlyIEM6XHB5KgogCiB3aWxsIHByb2JhYmx5IHRlbGwgeW91IHdoZXJlIGl0IGlzIGluc3RhbGxlZDsgdGhlIHVzdWFsIGxvY2F0aW9uIGlzIHNvbWV0aGluZwotbGlrZSBgYEM6XFB5dGhvbjIzYGAuICBPdGhlcndpc2UgeW91IHdpbGwgYmUgcmVkdWNlZCB0byBhIHNlYXJjaCBvZiB5b3VyIHdob2xlCitsaWtlIGBgQzpcUHl0aG9uMjdgYC4gIE90aGVyd2lzZSB5b3Ugd2lsbCBiZSByZWR1Y2VkIHRvIGEgc2VhcmNoIG9mIHlvdXIgd2hvbGUKIGRpc2sgLi4uIHVzZSA6bWVudXNlbGVjdGlvbjpgVG9vbHMgLS0+IEZpbmRgIG9yIGhpdCB0aGUgOmd1aWxhYmVsOmBTZWFyY2hgCiBidXR0b24gYW5kIGxvb2sgZm9yICJweXRob24uZXhlIi4gIFN1cHBvc2luZyB5b3UgZGlzY292ZXIgdGhhdCBQeXRob24gaXMKLWluc3RhbGxlZCBpbiB0aGUgYGBDOlxQeXRob24yM2BgIGRpcmVjdG9yeSAodGhlIGRlZmF1bHQgYXQgdGhlIHRpbWUgb2Ygd3JpdGluZyksCitpbnN0YWxsZWQgaW4gdGhlIGBgQzpcUHl0aG9uMjdgYCBkaXJlY3RvcnkgKHRoZSBkZWZhdWx0IGF0IHRoZSB0aW1lIG9mIHdyaXRpbmcpLAogeW91IHNob3VsZCBtYWtlIHN1cmUgdGhhdCBlbnRlcmluZyB0aGUgY29tbWFuZCA6OgogCi0gICBjOlxQeXRob24yM1xweXRob24KKyAgIGM6XFB5dGhvbjI3XHB5dGhvbgogCiBzdGFydHMgdXAgdGhlIGludGVycHJldGVyIGFzIGFib3ZlIChhbmQgZG9uJ3QgZm9yZ2V0IHlvdSdsbCBuZWVkIGEgIkNUUkwtWiIgYW5kCi1hbiAiRW50ZXIiIHRvIGdldCBvdXQgb2YgaXQpLiBPbmNlIHlvdSBoYXZlIHZlcmlmaWVkIHRoZSBkaXJlY3RvcnksIHlvdSBuZWVkIHRvCi1hZGQgaXQgdG8gdGhlIHN0YXJ0LXVwIHJvdXRpbmVzIHlvdXIgY29tcHV0ZXIgZ29lcyB0aHJvdWdoLiAgRm9yIG9sZGVyIHZlcnNpb25zCi1vZiBXaW5kb3dzIHRoZSBlYXNpZXN0IHdheSB0byBkbyB0aGlzIGlzIHRvIGVkaXQgdGhlIGBgQzpcQVVUT0VYRUMuQkFUYGAKLWZpbGUuIFlvdSB3b3VsZCB3YW50IHRvIGFkZCBhIGxpbmUgbGlrZSB0aGUgZm9sbG93aW5nIHRvIGBgQVVUT0VYRUMuQkFUYGA6OgorYW4gIkVudGVyIiB0byBnZXQgb3V0IG9mIGl0KS4gT25jZSB5b3UgaGF2ZSB2ZXJpZmllZCB0aGUgZGlyZWN0b3J5LCB5b3UgY2FuCithZGQgaXQgdG8gdGhlIHN5c3RlbSBwYXRoIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHN0YXJ0IFB5dGhvbiBieSBqdXN0IHJ1bm5pbmcKK3RoZSBgYHB5dGhvbmBgIGNvbW1hbmQuIFRoaXMgaXMgY3VycmVudGx5IGFuIG9wdGlvbiBpbiB0aGUgaW5zdGFsbGVyIGFzIG9mCitDUHl0aG9uIDIuNy4KIAotICAgUEFUSCBDOlxQeXRob24yMzslUEFUSCUKLQotRm9yIFdpbmRvd3MgTlQsIDIwMDAgYW5kIChJIGFzc3VtZSkgWFAsIHlvdSB3aWxsIG5lZWQgdG8gYWRkIGEgc3RyaW5nIHN1Y2ggYXMgOjoKLQotICAgO0M6XFB5dGhvbjIzCi0KLXRvIHRoZSBjdXJyZW50IHNldHRpbmcgZm9yIHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLCB3aGljaCB5b3Ugd2lsbCBmaW5kIGluCi10aGUgcHJvcGVydGllcyB3aW5kb3cgb2YgIk15IENvbXB1dGVyIiB1bmRlciB0aGUgIkFkdmFuY2VkIiB0YWIuICBOb3RlIHRoYXQgaWYKLXlvdSBoYXZlIHN1ZmZpY2llbnQgcHJpdmlsZWdlIHlvdSBtaWdodCBnZXQgYSBjaG9pY2Ugb2YgaW5zdGFsbGluZyB0aGUgc2V0dGluZ3MKLWVpdGhlciBmb3IgdGhlIEN1cnJlbnQgVXNlciBvciBmb3IgU3lzdGVtLiAgVGhlIGxhdHRlciBpcyBwcmVmZXJyZWQgaWYgeW91IHdhbnQKLWV2ZXJ5Ym9keSB0byBiZSBhYmxlIHRvIHJ1biBQeXRob24gb24gdGhlIG1hY2hpbmUuCi0KLUlmIHlvdSBhcmVuJ3QgY29uZmlkZW50IGRvaW5nIGFueSBvZiB0aGVzZSBtYW5pcHVsYXRpb25zIHlvdXJzZWxmLCBhc2sgZm9yIGhlbHAhCi1BdCB0aGlzIHN0YWdlIHlvdSBtYXkgd2FudCB0byByZWJvb3QgeW91ciBzeXN0ZW0gdG8gbWFrZSBhYnNvbHV0ZWx5IHN1cmUgdGhlIG5ldwotc2V0dGluZyBoYXMgdGFrZW4gZWZmZWN0LiAgWW91IHByb2JhYmx5IHdvbid0IG5lZWQgdG8gcmVib290IGZvciBXaW5kb3dzIE5ULCBYUAotb3IgMjAwMC4gIFlvdSBjYW4gYWxzbyBhdm9pZCBpdCBpbiBlYXJsaWVyIHZlcnNpb25zIGJ5IGVkaXRpbmcgdGhlIGZpbGUKLWBgQzpcV0lORE9XU1xDT01NQU5EXENNRElOSVQuQkFUYGAgaW5zdGVhZCBvZiBgYEFVVE9FWEVDLkJBVGBgLgotCi1Zb3Ugc2hvdWxkIG5vdyBiZSBhYmxlIHRvIHN0YXJ0IGEgbmV3IGNvbW1hbmQgd2luZG93LCBlbnRlciBgYHB5dGhvbmBgIGF0IHRoZQotYGBDOlw+YGAgKG9yIHdoYXRldmVyKSBwcm9tcHQsIGFuZCBzZWUgdGhlIGBgPj4+YGAgcHJvbXB0IHRoYXQgaW5kaWNhdGVzIHRoZQotUHl0aG9uIGludGVycHJldGVyIGlzIHJlYWRpbmcgaW50ZXJhY3RpdmUgY29tbWFuZHMuCi0KLUxldCdzIHN1cHBvc2UgeW91IGhhdmUgYSBwcm9ncmFtIGNhbGxlZCBgYHB5dGVzdC5weWBgIGluIGRpcmVjdG9yeQotYGBDOlxTdGV2ZVxQcm9qZWN0c1xQeXRob25gYC4gIEEgc2Vzc2lvbiB0byBydW4gdGhhdCBwcm9ncmFtIG1pZ2h0IGxvb2sgbGlrZQotdGhpczo6Ci0KLSAgIEM6XD4gY2QgXFN0ZXZlXFByb2plY3RzXFB5dGhvbgotICAgQzpcU3RldmVcUHJvamVjdHNcUHl0aG9uPiBweXRob24gcHl0ZXN0LnB5Ci0KLUJlY2F1c2UgeW91IGFkZGVkIGEgZmlsZSBuYW1lIHRvIHRoZSBjb21tYW5kIHRvIHN0YXJ0IHRoZSBpbnRlcnByZXRlciwgd2hlbiBpdAotc3RhcnRzIHVwIGl0IHJlYWRzIHRoZSBQeXRob24gc2NyaXB0IGluIHRoZSBuYW1lZCBmaWxlLCBjb21waWxlcyBpdCwgZXhlY3V0ZXMKLWl0LCBhbmQgdGVybWluYXRlcywgc28geW91IHNlZSBhbm90aGVyIGBgQzpcPmBgIHByb21wdC4gIFlvdSBtaWdodCBhbHNvIGhhdmUKLWVudGVyZWQgOjoKLQotICAgQzpcPiBweXRob24gXFN0ZXZlXFByb2plY3RzXFB5dGhvblxweXRlc3QucHkKLQotaWYgeW91IGhhZG4ndCB3YW50ZWQgdG8gY2hhbmdlIHlvdXIgY3VycmVudCBkaXJlY3RvcnkuCi0KLVVuZGVyIE5ULCAyMDAwIGFuZCBYUCB5b3UgbWF5IHdlbGwgZmluZCB0aGF0IHRoZSBpbnN0YWxsYXRpb24gcHJvY2VzcyBoYXMgYWxzbwotYXJyYW5nZWQgdGhhdCB0aGUgY29tbWFuZCBgYHB5dGVzdC5weWBgIChvciwgaWYgdGhlIGZpbGUgaXNuJ3QgaW4gdGhlIGN1cnJlbnQKLWRpcmVjdG9yeSwgYGBDOlxTdGV2ZVxQcm9qZWN0c1xQeXRob25ccHl0ZXN0LnB5YGApIHdpbGwgYXV0b21hdGljYWxseSByZWNvZ25pemUKLXRoZSAiLnB5IiBleHRlbnNpb24gYW5kIHJ1biB0aGUgUHl0aG9uIGludGVycHJldGVyIG9uIHRoZSBuYW1lZCBmaWxlLiBVc2luZyB0aGlzCi1mZWF0dXJlIGlzIGZpbmUsIGJ1dCAqc29tZSogdmVyc2lvbnMgb2YgV2luZG93cyBoYXZlIGJ1Z3Mgd2hpY2ggbWVhbiB0aGF0IHRoaXMKLWZvcm0gaXNuJ3QgZXhhY3RseSBlcXVpdmFsZW50IHRvIHVzaW5nIHRoZSBpbnRlcnByZXRlciBleHBsaWNpdGx5LCBzbyBiZQotY2FyZWZ1bC4KLQotVGhlIGltcG9ydGFudCB0aGluZ3MgdG8gcmVtZW1iZXIgYXJlOgotCi0xLiBTdGFydCBQeXRob24gZnJvbSB0aGUgU3RhcnQgTWVudSwgb3IgbWFrZSBzdXJlIHRoZSBQQVRIIGlzIHNldCBjb3JyZWN0bHkgc28KLSAgIFdpbmRvd3MgY2FuIGZpbmQgdGhlIFB5dGhvbiBpbnRlcnByZXRlci4gOjoKLQotICAgICAgcHl0aG9uCi0KLSAgIHNob3VsZCBnaXZlIHlvdSBhICc+Pj4nIHByb21wdCBmcm9tIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIuIERvbid0IGZvcmdldCB0aGUKLSAgIENUUkwtWiBhbmQgRU5URVIgdG8gdGVybWluYXRlIHRoZSBpbnRlcnByZXRlciAoYW5kLCBpZiB5b3Ugc3RhcnRlZCB0aGUgd2luZG93Ci0gICBmcm9tIHRoZSBTdGFydCBNZW51LCBtYWtlIHRoZSB3aW5kb3cgZGlzYXBwZWFyKS4KLQotMi4gT25jZSB0aGlzIHdvcmtzLCB5b3UgcnVuIHByb2dyYW1zIHdpdGggY29tbWFuZHM6OgotCi0gICAgICBweXRob24ge3Byb2dyYW0tZmlsZX0KLQotMy4gV2hlbiB5b3Uga25vdyB0aGUgY29tbWFuZHMgdG8gdXNlIHlvdSBjYW4gYnVpbGQgV2luZG93cyBzaG9ydGN1dHMgdG8gcnVuIHRoZQotICAgUHl0aG9uIGludGVycHJldGVyIG9uIGFueSBvZiB5b3VyIHNjcmlwdHMsIG5hbWluZyBwYXJ0aWN1bGFyIHdvcmtpbmcKLSAgIGRpcmVjdG9yaWVzLCBhbmQgYWRkaW5nIHRoZW0gdG8geW91ciBtZW51cy4gIFRha2UgYSBsb29rIGF0IDo6Ci0KLSAgICAgIHB5dGhvbiAtLWhlbHAKLQotICAgaWYgeW91ciBuZWVkcyBhcmUgY29tcGxleC4KLQotNC4gSW50ZXJhY3RpdmUgbW9kZSAod2hlcmUgeW91IHNlZSB0aGUgYGA+Pj5gYCBwcm9tcHQpIGlzIGJlc3QgdXNlZCBmb3IgY2hlY2tpbmcKLSAgIHRoYXQgaW5kaXZpZHVhbCBzdGF0ZW1lbnRzIGFuZCBleHByZXNzaW9ucyBkbyB3aGF0IHlvdSB0aGluayB0aGV5IHdpbGwsIGFuZAotICAgZm9yIGRldmVsb3BpbmcgY29kZSBieSBleHBlcmltZW50LgotCitNb3JlIGluZm9ybWF0aW9uIGFib3V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBjYW4gYmUgZm91bmQgb24gdGhlCis6cmVmOmBVc2luZyBQeXRob24gb24gV2luZG93cyA8c2V0dGluZy1lbnZ2YXJzPmAgcGFnZS4KIAogSG93IGRvIEkgbWFrZSBQeXRob24gc2NyaXB0cyBleGVjdXRhYmxlPwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1PbiBXaW5kb3dzIDIwMDAsIHRoZSBzdGFuZGFyZCBQeXRob24gaW5zdGFsbGVyIGFscmVhZHkgYXNzb2NpYXRlcyB0aGUgLnB5CitPbiBXaW5kb3dzLCB0aGUgc3RhbmRhcmQgUHl0aG9uIGluc3RhbGxlciBhbHJlYWR5IGFzc29jaWF0ZXMgdGhlIC5weQogZXh0ZW5zaW9uIHdpdGggYSBmaWxlIHR5cGUgKFB5dGhvbi5GaWxlKSBhbmQgZ2l2ZXMgdGhhdCBmaWxlIHR5cGUgYW4gb3BlbgogY29tbWFuZCB0aGF0IHJ1bnMgdGhlIGludGVycHJldGVyIChgYEQ6XFByb2dyYW0gRmlsZXNcUHl0aG9uXHB5dGhvbi5leGUgIiUxIgogJSpgYCkuICBUaGlzIGlzIGVub3VnaCB0byBtYWtlIHNjcmlwdHMgZXhlY3V0YWJsZSBmcm9tIHRoZSBjb21tYW5kIHByb21wdCBhcwogJ2Zvby5weScuICBJZiB5b3UnZCByYXRoZXIgYmUgYWJsZSB0byBleGVjdXRlIHRoZSBzY3JpcHQgYnkgc2ltcGxlIHR5cGluZyAnZm9vJwogd2l0aCBubyBleHRlbnNpb24geW91IG5lZWQgdG8gYWRkIC5weSB0byB0aGUgUEFUSEVYVCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KIAotT24gV2luZG93cyBOVCwgdGhlIHN0ZXBzIHRha2VuIGJ5IHRoZSBpbnN0YWxsZXIgYXMgZGVzY3JpYmVkIGFib3ZlIGFsbG93IHlvdSB0bwotcnVuIGEgc2NyaXB0IHdpdGggJ2Zvby5weScsIGJ1dCBhIGxvbmd0aW1lIGJ1ZyBpbiB0aGUgTlQgY29tbWFuZCBwcm9jZXNzb3IKLXByZXZlbnRzIHlvdSBmcm9tIHJlZGlyZWN0aW5nIHRoZSBpbnB1dCBvciBvdXRwdXQgb2YgYW55IHNjcmlwdCBleGVjdXRlZCBpbiB0aGlzCi13YXkuICBUaGlzIGlzIG9mdGVuIGltcG9ydGFudC4KLQotVGhlIGluY2FudGF0aW9uIGZvciBtYWtpbmcgYSBQeXRob24gc2NyaXB0IGV4ZWN1dGFibGUgdW5kZXIgV2luTlQgaXMgdG8gZ2l2ZSB0aGUKLWZpbGUgYW4gZXh0ZW5zaW9uIG9mIC5jbWQgYW5kIGFkZCB0aGUgZm9sbG93aW5nIGFzIHRoZSBmaXJzdCBsaW5lOjoKLQotICAgQHNldGxvY2FsIGVuYWJsZWV4dGVuc2lvbnMgJiBweXRob24gLXggJX5mMCAlKiAmIGdvdG8gOkVPRgotCi0KIFdoeSBkb2VzIFB5dGhvbiBzb21ldGltZXMgdGFrZSBzbyBsb25nIHRvIHN0YXJ0PwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTI0MiwyMiArMTYzLDExIEBACiBvZmZlbmRlci4KIAogCi1XaGVyZSBpcyBGcmVlemUgZm9yIFdpbmRvd3M/Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitIb3cgZG8gSSBtYWtlIGFuIGV4ZWN1dGFibGUgZnJvbSBhIFB5dGhvbiBzY3JpcHQ/CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSJGcmVlemUiIGlzIGEgcHJvZ3JhbSB0aGF0IGFsbG93cyB5b3UgdG8gc2hpcCBhIFB5dGhvbiBwcm9ncmFtIGFzIGEgc2luZ2xlCi1zdGFuZC1hbG9uZSBleGVjdXRhYmxlIGZpbGUuICBJdCBpcyAqbm90KiBhIGNvbXBpbGVyOyB5b3VyIHByb2dyYW1zIGRvbid0IHJ1bgotYW55IGZhc3RlciwgYnV0IHRoZXkgYXJlIG1vcmUgZWFzaWx5IGRpc3RyaWJ1dGFibGUsIGF0IGxlYXN0IHRvIHBsYXRmb3JtcyB3aXRoCi10aGUgc2FtZSBPUyBhbmQgQ1BVLiAgUmVhZCB0aGUgUkVBRE1FIGZpbGUgb2YgdGhlIGZyZWV6ZSBwcm9ncmFtIGZvciBtb3JlCi1kaXNjbGFpbWVycy4KLQotWW91IGNhbiB1c2UgZnJlZXplIG9uIFdpbmRvd3MsIGJ1dCB5b3UgbXVzdCBkb3dubG9hZCB0aGUgc291cmNlIHRyZWUgKHNlZQotaHR0cDovL3d3dy5weXRob24ub3JnL2Rvd25sb2FkL3NvdXJjZSkuICBUaGUgZnJlZXplIHByb2dyYW0gaXMgaW4gdGhlCi1gYFRvb2xzXGZyZWV6ZWBgIHN1YmRpcmVjdG9yeSBvZiB0aGUgc291cmNlIHRyZWUuCi0KLVlvdSBuZWVkIHRoZSBNaWNyb3NvZnQgVkMrKyBjb21waWxlciwgYW5kIHlvdSBwcm9iYWJseSBuZWVkIHRvIGJ1aWxkIFB5dGhvbi4KLVRoZSByZXF1aXJlZCBwcm9qZWN0IGZpbGVzIGFyZSBpbiB0aGUgUENidWlsZCBkaXJlY3RvcnkuCi0KK1NlZSBodHRwOi8vd3d3LnB5MmV4ZS5vcmcvIGZvciBhIGRpc3R1dGlscyBleHRlbnNpb24gdGhhdCBhbGxvd3MgeW91Cit0byBjcmVhdGUgY29uc29sZSBhbmQgR1VJIGV4ZWN1dGFibGVzIGZyb20gUHl0aG9uIGNvZGUuCiAKIElzIGEgYGAqLnB5ZGBgIGZpbGUgdGhlIHNhbWUgYXMgYSBETEw/CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjg4LDcgKzE5OCw3IEBACiAgICBiZSBhIERMTCB0byBoYW5kbGUgaW1wb3J0aW5nIG1vZHVsZXMgdGhhdCBhcmUgdGhlbXNlbHZlcyBETEwncy4gIChUaGlzIGlzIHRoZQogICAgZmlyc3Qga2V5IHVuZG9jdW1lbnRlZCBmYWN0LikgIEluc3RlYWQsIGxpbmsgdG8gOmZpbGU6YHB5dGhvbntOTn0uZGxsYDsgaXQgaXMKICAgIHR5cGljYWxseSBpbnN0YWxsZWQgaW4gYGBDOlxXaW5kb3dzXFN5c3RlbWBgLiAgKk5OKiBpcyB0aGUgUHl0aG9uIHZlcnNpb24sIGEKLSAgIG51bWJlciBzdWNoIGFzICIyMyIgZm9yIFB5dGhvbiAyLjMuCisgICBudW1iZXIgc3VjaCBhcyAiMjciIGZvciBQeXRob24gMi43LgogCiAgICBZb3UgY2FuIGxpbmsgdG8gUHl0aG9uIGluIHR3byBkaWZmZXJlbnQgd2F5cy4gIExvYWQtdGltZSBsaW5raW5nIG1lYW5zCiAgICBsaW5raW5nIGFnYWluc3QgOmZpbGU6YHB5dGhvbntOTn0ubGliYCwgd2hpbGUgcnVuLXRpbWUgbGlua2luZyBtZWFucyBsaW5raW5nCkBAIC0zMzMsNyArMjQzLDcgQEAKICAgICAgIC4uLgogICAgICAgUHlfSW5pdGlhbGl6ZSgpOyAgLy8gSW5pdGlhbGl6ZSBQeXRob24uCiAgICAgICBpbml0bXlBcHBjKCk7ICAvLyBJbml0aWFsaXplIChpbXBvcnQpIHRoZSBoZWxwZXIgY2xhc3MuCi0gICAgICBQeVJ1bl9TaW1wbGVTdHJpbmcoImltcG9ydCBteUFwcCIpIDsgIC8vIEltcG9ydCB0aGUgc2hhZG93IGNsYXNzLgorICAgICAgUHlSdW5fU2ltcGxlU3RyaW5nKCJpbXBvcnQgbXlBcHAiKTsgIC8vIEltcG9ydCB0aGUgc2hhZG93IGNsYXNzLgogCiA1LiBUaGVyZSBhcmUgdHdvIHByb2JsZW1zIHdpdGggUHl0aG9uJ3MgQyBBUEkgd2hpY2ggd2lsbCBiZWNvbWUgYXBwYXJlbnQgaWYgeW91CiAgICB1c2UgYSBjb21waWxlciBvdGhlciB0aGFuIE1TVkMsIHRoZSBjb21waWxlciB1c2VkIHRvIGJ1aWxkIHB5dGhvbk5OLmRsbC4KQEAgLTM3Miw0NyArMjgyLDYgQEAKICAgIG9iamVjdCB0aGF0IHN1cHBvcnRzIHJlYWQgYW5kIHdyaXRlLCBzbyBhbGwgeW91IG5lZWQgaXMgYSBQeXRob24gb2JqZWN0CiAgICAoZGVmaW5lZCBpbiB5b3VyIGV4dGVuc2lvbiBtb2R1bGUpIHRoYXQgY29udGFpbnMgcmVhZCgpIGFuZCB3cml0ZSgpIG1ldGhvZHMuCiAKLQotSG93IGRvIEkgdXNlIFB5dGhvbiBmb3IgQ0dJPwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1PbiB0aGUgTWljcm9zb2Z0IElJUyBzZXJ2ZXIgb3Igb24gdGhlIFdpbjk1IE1TIFBlcnNvbmFsIFdlYiBTZXJ2ZXIgeW91IHNldCB1cAotUHl0aG9uIGluIHRoZSBzYW1lIHdheSB0aGF0IHlvdSB3b3VsZCBzZXQgdXAgYW55IG90aGVyIHNjcmlwdGluZyBlbmdpbmUuCi0KLVJ1biByZWdlZHQzMiBhbmQgZ28gdG86OgotCi0gICAgSEtFWV9MT0NBTF9NQUNISU5FXFNZU1RFTVxDdXJyZW50Q29udHJvbFNldFxTZXJ2aWNlc1xXM1NWQ1xQYXJhbWV0ZXJzXFNjcmlwdE1hcAotCi1hbmQgZW50ZXIgdGhlIGZvbGxvd2luZyBsaW5lIChtYWtpbmcgYW55IHNwZWNpZmljIGNoYW5nZXMgdGhhdCB5b3VyIHN5c3RlbSBtYXkKLW5lZWQpOjoKLQotICAgIC5weSA6UkVHX1NaOiBjOlw8cGF0aCB0byBweXRob24+XHB5dGhvbi5leGUgLXUgJXMgJXMKLQotVGhpcyBsaW5lIHdpbGwgYWxsb3cgeW91IHRvIGNhbGwgeW91ciBzY3JpcHQgd2l0aCBhIHNpbXBsZSByZWZlcmVuY2UgbGlrZToKLWBgaHR0cDovL3lvdXJzZXJ2ZXIvc2NyaXB0cy95b3Vyc2NyaXB0LnB5YGAgcHJvdmlkZWQgInNjcmlwdHMiIGlzIGFuCi0iZXhlY3V0YWJsZSIgZGlyZWN0b3J5IGZvciB5b3VyIHNlcnZlciAod2hpY2ggaXQgdXN1YWxseSBpcyBieSBkZWZhdWx0KS4gIFRoZQotOm9wdGlvbjpgLXVgIGZsYWcgc3BlY2lmaWVzIHVuYnVmZmVyZWQgYW5kIGJpbmFyeSBtb2RlIGZvciBzdGRpbiAtIG5lZWRlZCB3aGVuCi13b3JraW5nIHdpdGggYmluYXJ5IGRhdGEuCi0KLUluIGFkZGl0aW9uLCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHVzaW5nICIucHkiIG1heSBub3QgYmUgYSBnb29kIGlkZWEgZm9yIHRoZQotZmlsZSBleHRlbnNpb25zIHdoZW4gdXNlZCBpbiB0aGlzIGNvbnRleHQgKHlvdSBtaWdodCB3YW50IHRvIHJlc2VydmUgYGAqLnB5YGAKLWZvciBzdXBwb3J0IG1vZHVsZXMgYW5kIHVzZSBgYCouY2dpYGAgb3IgYGAqLmNncGBgIGZvciAibWFpbiBwcm9ncmFtIiBzY3JpcHRzKS4KLQotSW4gb3JkZXIgdG8gc2V0IHVwIEludGVybmV0IEluZm9ybWF0aW9uIFNlcnZpY2VzIDUgdG8gdXNlIFB5dGhvbiBmb3IgQ0dJCi1wcm9jZXNzaW5nLCBwbGVhc2Ugc2VlIHRoZSBmb2xsb3dpbmcgbGlua3M6Ci0KLSAgIGh0dHA6Ly93d3cuZS1jb2xpLm5ldC9weWlpc19zZXJ2ZXIuaHRtbCAoZm9yIFdpbjJrIFNlcnZlcikKLSAgIGh0dHA6Ly93d3cuZS1jb2xpLm5ldC9weWlpcy5odG1sIChmb3IgV2luMmsgcHJvKQotCi1Db25maWd1cmluZyBBcGFjaGUgaXMgbXVjaCBzaW1wbGVyLiAgSW4gdGhlIEFwYWNoZSBjb25maWd1cmF0aW9uIGZpbGUKLWBgaHR0cGQuY29uZmBgLCBhZGQgdGhlIGZvbGxvd2luZyBsaW5lIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGU6OgotCi0gICAgU2NyaXB0SW50ZXJwcmV0ZXJTb3VyY2UgUmVnaXN0cnkKLQotVGhlbiwgZ2l2ZSB5b3VyIFB5dGhvbiBDR0ktc2NyaXB0cyB0aGUgZXh0ZW5zaW9uIC5weSBhbmQgcHV0IHRoZW0gaW4gdGhlIGNnaS1iaW4KLWRpcmVjdG9yeS4KLQotCiBIb3cgZG8gSSBrZWVwIGVkaXRvcnMgZnJvbSBpbnNlcnRpbmcgdGFicyBpbnRvIG15IFB5dGhvbiBzb3VyY2U/CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTQ1NiwxMTYgKzMyNSw2IEBACiB0byBjb25zb2xlIHN1YnByb2Nlc3NlcyB3aGljaCBhcmUgZGVzaWduZWQgdG8gaGFuZGxlIHRob3NlIHNpZ25hbHMuIFNlZQogOmZ1bmM6YG9zLmtpbGxgIGZvciBmdXJ0aGVyIGRldGFpbHMuCiAKLQotV2h5IGRvZXMgb3MucGF0aC5pc2RpcigpIGZhaWwgb24gTlQgc2hhcmVkIGRpcmVjdG9yaWVzPwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgc29sdXRpb24gYXBwZWFycyB0byBiZSBhbHdheXMgYXBwZW5kIHRoZSAiXFwiIG9uIHRoZSBlbmQgb2Ygc2hhcmVkCi1kcml2ZXMuCi0KLSAgID4+PiBpbXBvcnQgb3MKLSAgID4+PiBvcy5wYXRoLmlzZGlyKCAnXFxcXHJvcnNjaGFjaFxccHVibGljJykKLSAgIDAKLSAgID4+PiBvcy5wYXRoLmlzZGlyKCAnXFxcXHJvcnNjaGFjaFxccHVibGljXFwnKQotICAgMQotCi1JdCBoZWxwcyB0byB0aGluayBvZiBzaGFyZSBwb2ludHMgYXMgYmVpbmcgbGlrZSBkcml2ZSBsZXR0ZXJzLiAgRXhhbXBsZTo6Ci0KLSAgIGs6IGlzIG5vdCBhIGRpcmVjdG9yeQotICAgazpcIGlzIGEgZGlyZWN0b3J5Ci0gICBrOlxtZWRpYSBpcyBhIGRpcmVjdG9yeQotICAgazpcbWVkaWFcIGlzIG5vdCBhIGRpcmVjdG9yeQotCi1UaGUgc2FtZSBydWxlcyBhcHBseSBpZiB5b3Ugc3Vic3RpdHV0ZSAiazoiIHdpdGggIlxcY29ua3lcZm9vIjo6Ci0KLSAgIFxcY29ua3lcZm9vICBpcyBub3QgYSBkaXJlY3RvcnkKLSAgIFxcY29ua3lcZm9vXCBpcyBhIGRpcmVjdG9yeQotICAgXFxjb25reVxmb29cbWVkaWEgaXMgYSBkaXJlY3RvcnkKLSAgIFxcY29ua3lcZm9vXG1lZGlhXCBpcyBub3QgYSBkaXJlY3RvcnkKLQotCi1jZ2kucHkgKG9yIG90aGVyIENHSSBwcm9ncmFtbWluZykgZG9lc24ndCB3b3JrIHNvbWV0aW1lcyBvbiBOVCBvciB3aW45NSEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1CZSBzdXJlIHlvdSBoYXZlIHRoZSBsYXRlc3QgcHl0aG9uLmV4ZSwgdGhhdCB5b3UgYXJlIHVzaW5nIHB5dGhvbi5leGUgcmF0aGVyCi10aGFuIGEgR1VJIHZlcnNpb24gb2YgUHl0aG9uIGFuZCB0aGF0IHlvdSBoYXZlIGNvbmZpZ3VyZWQgdGhlIHNlcnZlciB0byBleGVjdXRlCi06OgotCi0gICAiLi4uXHB5dGhvbi5leGUgLXUgLi4uIgotCi1mb3IgdGhlIENHSSBleGVjdXRpb24uICBUaGUgOm9wdGlvbjpgLXVgICh1bmJ1ZmZlcmVkKSBvcHRpb24gb24gTlQgYW5kIFdpbjk1Ci1wcmV2ZW50cyB0aGUgaW50ZXJwcmV0ZXIgZnJvbSBhbHRlcmluZyBuZXdsaW5lcyBpbiB0aGUgc3RhbmRhcmQgaW5wdXQgYW5kCi1vdXRwdXQuICBXaXRob3V0IGl0IHBvc3QvbXVsdGlwYXJ0IHJlcXVlc3RzIHdpbGwgc2VlbSB0byBoYXZlIHRoZSB3cm9uZyBsZW5ndGgKLWFuZCBiaW5hcnkgKGUuZy4gR0lGKSByZXNwb25zZXMgbWF5IGdldCBnYXJibGVkIChyZXN1bHRpbmcgaW4gYnJva2VuIGltYWdlcywgUERGCi1maWxlcywgYW5kIG90aGVyIGJpbmFyeSBkb3dubG9hZHMgZmFpbGluZykuCi0KLQotV2h5IGRvZXNuJ3Qgb3MucG9wZW4oKSB3b3JrIGluIFB5dGhvbldpbiBvbiBOVD8KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSByZWFzb24gdGhhdCBvcy5wb3BlbigpIGRvZXNuJ3Qgd29yayBmcm9tIHdpdGhpbiBQeXRob25XaW4gaXMgZHVlIHRvIGEgYnVnIGluCi1NaWNyb3NvZnQncyBDIFJ1bnRpbWUgTGlicmFyeSAoQ1JUKS4gVGhlIENSVCBhc3N1bWVzIHlvdSBoYXZlIGEgV2luMzIgY29uc29sZQotYXR0YWNoZWQgdG8gdGhlIHByb2Nlc3MuCi0KLVlvdSBzaG91bGQgdXNlIHRoZSB3aW4zMnBpcGUgbW9kdWxlJ3MgcG9wZW4oKSBpbnN0ZWFkIHdoaWNoIGRvZXNuJ3QgZGVwZW5kIG9uCi1oYXZpbmcgYW4gYXR0YWNoZWQgV2luMzIgY29uc29sZS4KLQotRXhhbXBsZTo6Ci0KLSAgIGltcG9ydCB3aW4zMnBpcGUKLSAgIGYgPSB3aW4zMnBpcGUucG9wZW4oJ2RpciAvYyBjOlxcJykKLSAgIHByaW50IGYucmVhZGxpbmVzKCkKLSAgIGYuY2xvc2UoKQotCi0KLVdoeSBkb2Vzbid0IG9zLnBvcGVuKCkvd2luMzJwaXBlLnBvcGVuKCkgd29yayBvbiBXaW45eD8KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlcmUgaXMgYSBidWcgaW4gV2luOXggdGhhdCBwcmV2ZW50cyBvcy5wb3Blbi93aW4zMnBpcGUucG9wZW4qIGZyb20KLXdvcmtpbmcuIFRoZSBnb29kIG5ld3MgaXMgdGhlcmUgaXMgYSB3YXkgdG8gd29yayBhcm91bmQgdGhpcyBwcm9ibGVtLiAgVGhlCi1NaWNyb3NvZnQgS25vd2xlZGdlIEJhc2UgYXJ0aWNsZSB0aGF0IHlvdSBuZWVkIHRvIGxvb2t1cCBpczogUTE1MDk1Ni4gWW91IHdpbGwKLWZpbmQgbGlua3MgdG8gdGhlIGtub3dsZWRnZSBiYXNlIGF0OiBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tLy4KLQotCi1QeVJ1bl9TaW1wbGVGaWxlKCkgY3Jhc2hlcyBvbiBXaW5kb3dzIGJ1dCBub3Qgb24gVW5peDsgd2h5PwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhpcyBpcyB2ZXJ5IHNlbnNpdGl2ZSB0byB0aGUgY29tcGlsZXIgdmVuZG9yLCB2ZXJzaW9uIGFuZCAocGVyaGFwcykgZXZlbgotb3B0aW9ucy4gIElmIHRoZSBGSUxFKiBzdHJ1Y3R1cmUgaW4geW91ciBlbWJlZGRpbmcgcHJvZ3JhbSBpc24ndCB0aGUgc2FtZSBhcyBpcwotYXNzdW1lZCBieSB0aGUgUHl0aG9uIGludGVycHJldGVyIGl0IHdvbid0IHdvcmsuCi0KLVRoZSBQeXRob24gMS41LiogRExMcyAoYGBweXRob24xNS5kbGxgYCkgYXJlIGFsbCBjb21waWxlZCB3aXRoIE1TIFZDKysgNS4wIGFuZAotd2l0aCBtdWx0aXRocmVhZGluZy1ETEwgb3B0aW9ucyAoYGAvTURgYCkuCi0KLUlmIHlvdSBjYW4ndCBjaGFuZ2UgY29tcGlsZXJzIG9yIGZsYWdzLCB0cnkgdXNpbmcgOmNmdW5jOmBQeV9SdW5TaW1wbGVTdHJpbmdgLgotQSB0cmljayB0byBnZXQgaXQgdG8gcnVuIGFuIGFyYml0cmFyeSBmaWxlIGlzIHRvIGNvbnN0cnVjdCBhIGNhbGwgdG8KLTpmdW5jOmBleGVjZmlsZWAgd2l0aCB0aGUgbmFtZSBvZiB5b3VyIGZpbGUgYXMgYXJndW1lbnQuCi0KLUFsc28gbm90ZSB0aGF0IHlvdSBjYW4gbm90IG1peC1hbmQtbWF0Y2ggRGVidWcgYW5kIFJlbGVhc2UgdmVyc2lvbnMuICBJZiB5b3UKLXdpc2ggdG8gdXNlIHRoZSBEZWJ1ZyBNdWx0aXRocmVhZGVkIERMTCwgdGhlbiB5b3VyIG1vZHVsZSAqbXVzdCogaGF2ZSBgYF9kYGAKLWFwcGVuZGVkIHRvIHRoZSBiYXNlIG5hbWUuCi0KLQotSW1wb3J0aW5nIF90a2ludGVyIGZhaWxzIG9uIFdpbmRvd3MgOTUvOTg6IHdoeT8KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Tb21ldGltZXMsIHRoZSBpbXBvcnQgb2YgX3RraW50ZXIgZmFpbHMgb24gV2luZG93cyA5NSBvciA5OCwgY29tcGxhaW5pbmcgd2l0aCBhCi1tZXNzYWdlIGxpa2UgdGhlIGZvbGxvd2luZzo6Ci0KLSAgIEltcG9ydEVycm9yOiBETEwgbG9hZCBmYWlsZWQ6IE9uZSBvZiB0aGUgbGlicmFyeSBmaWxlcyBuZWVkZWQKLSAgIHRvIHJ1biB0aGlzIGFwcGxpY2F0aW9uIGNhbm5vdCBiZSBmb3VuZC4KLQotSXQgY291bGQgYmUgdGhhdCB5b3UgaGF2ZW4ndCBpbnN0YWxsZWQgVGNsL1RrLCBidXQgaWYgeW91IGRpZCBpbnN0YWxsIFRjbC9UaywKLWFuZCB0aGUgV2lzaCBhcHBsaWNhdGlvbiB3b3JrcyBjb3JyZWN0bHksIHRoZSBwcm9ibGVtIG1heSBiZSB0aGF0IGl0cyBpbnN0YWxsZXIKLWRpZG4ndCBtYW5hZ2UgdG8gZWRpdCB0aGUgYXV0b2V4ZWMuYmF0IGZpbGUgY29ycmVjdGx5LiAgSXQgdHJpZXMgdG8gYWRkIGEKLXN0YXRlbWVudCB0aGF0IGNoYW5nZXMgdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gaW5jbHVkZSB0aGUgVGNsL1RrICdiaW4nCi1zdWJkaXJlY3RvcnksIGJ1dCBzb21ldGltZXMgdGhpcyBlZGl0IGRvZXNuJ3QgcXVpdGUgd29yay4gIE9wZW5pbmcgaXQgd2l0aAotbm90ZXBhZCB1c3VhbGx5IHJldmVhbHMgd2hhdCB0aGUgcHJvYmxlbSBpcy4KLQotKE9uZSBhZGRpdGlvbmFsIGhpbnQsIG5vdGVkIGJ5IERhdmlkIFN6YWZyYW5za2k6IHlvdSBjYW4ndCB1c2UgbG9uZyBmaWxlbmFtZXMKLWhlcmU7IGUuZy4gdXNlIGBgQzpcUFJPR1JBfjFcVGNsXGJpbmBgIGluc3RlYWQgb2YgYGBDOlxQcm9ncmFtIEZpbGVzXFRjbFxiaW5gYC4pCi0KLQogSG93IGRvIEkgZXh0cmFjdCB0aGUgZG93bmxvYWRlZCBkb2N1bWVudGF0aW9uIG9uIFdpbmRvd3M/CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtNTc3LDM4ICszMzYsMyBAQAogYWJsZSB0byBoYW5kbGUgaXQuICAoSWYgeW91ciBjb3B5IG9mIFdpblppcCBkb2Vzbid0LCBnZXQgYSBuZXdlciBvbmUgZnJvbQogaHR0cDovL3d3dy53aW56aXAuY29tLikKIAotCi1NaXNzaW5nIGN3MzIxNW10LmRsbCAob3IgbWlzc2luZyBjdzMyMTUuZGxsKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotU29tZXRpbWVzLCB3aGVuIHVzaW5nIFRraW50ZXIgb24gV2luZG93cywgeW91IGdldCBhbiBlcnJvciB0aGF0IGN3MzIxNW10LmRsbCBvcgotY3czMjE1LmRsbCBpcyBtaXNzaW5nLgotCi1DYXVzZTogeW91IGhhdmUgYW4gb2xkIFRjbC9UayBETEwgYnVpbHQgd2l0aCBjeWd3aW4gaW4geW91ciBwYXRoIChwcm9iYWJseQotYGBDOlxXaW5kb3dzYGApLiAgWW91IG11c3QgdXNlIHRoZSBUY2wvVGsgRExMcyBmcm9tIHRoZSBzdGFuZGFyZCBUY2wvVGsKLWluc3RhbGxhdGlvbiAoUHl0aG9uIDEuNS4yIGNvbWVzIHdpdGggb25lKS4KLQotCi1XYXJuaW5nIGFib3V0IENUTDNEMzIgdmVyc2lvbiBmcm9tIGluc3RhbGxlcgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIFB5dGhvbiBpbnN0YWxsZXIgaXNzdWVzIGEgd2FybmluZyBsaWtlIHRoaXM6OgotCi0gICBUaGlzIHZlcnNpb24gdXNlcyBDVEwzRDMyLkRMTCB3aGljaCBpcyBub3QgdGhlIGNvcnJlY3QgdmVyc2lvbi4KLSAgIFRoaXMgdmVyc2lvbiBpcyB1c2VkIGZvciB3aW5kb3dzIE5UIGFwcGxpY2F0aW9ucyBvbmx5LgotCi1UaW0gUGV0ZXJzOgotCi0gICBUaGlzIGlzIGEgTWljcm9zb2Z0IERMTCwgYW5kIGEgbm90b3Jpb3VzIHNvdXJjZSBvZiBwcm9ibGVtcy4gIFRoZSBtZXNzYWdlCi0gICBtZWFucyB3aGF0IGl0IHNheXM6IHlvdSBoYXZlIHRoZSB3cm9uZyB2ZXJzaW9uIG9mIHRoaXMgRExMIGZvciB5b3VyIG9wZXJhdGluZwotICAgc3lzdGVtLiAgVGhlIFB5dGhvbiBpbnN0YWxsYXRpb24gZGlkIG5vdCBjYXVzZSB0aGlzIC0tIHNvbWV0aGluZyBlbHNlIHlvdQotICAgaW5zdGFsbGVkIHByZXZpb3VzIHRvIHRoaXMgb3Zlcndyb3RlIHRoZSBETEwgdGhhdCBjYW1lIHdpdGggeW91ciBPUyAocHJvYmFibHkKLSAgIG9sZGVyIHNoYXJld2FyZSBvZiBzb21lIHNvcnQsIGJ1dCB0aGVyZSdzIG5vIHdheSB0byB0ZWxsIG5vdykuICBJZiB5b3Ugc2VhcmNoCi0gICBmb3IgIkNUTDNEMzIiIHVzaW5nIGFueSBzZWFyY2ggZW5naW5lIChBbHRhVmlzdGEsIGZvciBleGFtcGxlKSwgeW91J2xsIGZpbmQKLSAgIGh1bmRyZWRzIGFuZCBodW5kcmVkcyBvZiB3ZWIgcGFnZXMgY29tcGxhaW5pbmcgYWJvdXQgdGhlIHNhbWUgcHJvYmxlbSB3aXRoCi0gICBhbGwgc29ydHMgb2YgaW5zdGFsbGF0aW9uIHByb2dyYW1zLiAgVGhleSdsbCBwb2ludCB5b3UgdG8gd2F5cyB0byBnZXQgdGhlCi0gICBjb3JyZWN0IHZlcnNpb24gcmVpbnN0YWxsZWQgb24geW91ciBzeXN0ZW0gKHNpbmNlIFB5dGhvbiBkb2Vzbid0IGNhdXNlIHRoaXMsCi0gICB3ZSBjYW4ndCBmaXggaXQpLgotCi1EYXZpZCBBIEJ1cnRvbiBoYXMgd3JpdHRlbiBhIGxpdHRsZSBwcm9ncmFtIHRvIGZpeCB0aGlzLiAgR28gdG8KLWh0dHA6Ly93d3cuYnVydG9uc3lzLmNvbS9kb3dubG9hZHMuaHRtbCBhbmQgY2xpY2sgb24gImN0bDNkZml4LnppcCIuCmRpZmYgLS1naXQgYS9Eb2MvZ2xvc3NhcnkucnN0IGIvRG9jL2dsb3NzYXJ5LnJzdAppbmRleCAzN2ZhOWIwLi5iNWU4MTcxIDEwMDY0NAotLS0gYS9Eb2MvZ2xvc3NhcnkucnN0CisrKyBiL0RvYy9nbG9zc2FyeS5yc3QKQEAgLTM5LDE2ICszOSwzNCBAQAogICAgICAgY3JlYXRlIHlvdXIgb3duIEFCQ3Mgd2l0aCB0aGUgOm1vZDpgYWJjYCBtb2R1bGUuCiAKICAgIGFyZ3VtZW50Ci0gICAgICBBIHZhbHVlIHBhc3NlZCB0byBhIGZ1bmN0aW9uIG9yIG1ldGhvZCwgYXNzaWduZWQgdG8gYSBuYW1lZCBsb2NhbAotICAgICAgdmFyaWFibGUgaW4gdGhlIGZ1bmN0aW9uIGJvZHkuICBBIGZ1bmN0aW9uIG9yIG1ldGhvZCBtYXkgaGF2ZSBib3RoCi0gICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50cyBhbmQga2V5d29yZCBhcmd1bWVudHMgaW4gaXRzIGRlZmluaXRpb24uCi0gICAgICBQb3NpdGlvbmFsIGFuZCBrZXl3b3JkIGFyZ3VtZW50cyBtYXkgYmUgdmFyaWFibGUtbGVuZ3RoOiBgYCpgYCBhY2NlcHRzCi0gICAgICBvciBwYXNzZXMgKGlmIGluIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIG9yIGNhbGwpIHNldmVyYWwgcG9zaXRpb25hbAotICAgICAgYXJndW1lbnRzIGluIGEgbGlzdCwgd2hpbGUgYGAqKmBgIGRvZXMgdGhlIHNhbWUgZm9yIGtleXdvcmQgYXJndW1lbnRzCi0gICAgICBpbiBhIGRpY3Rpb25hcnkuCisgICAgICBBIHZhbHVlIHBhc3NlZCB0byBhIDp0ZXJtOmBmdW5jdGlvbmAgKG9yIDp0ZXJtOmBtZXRob2RgKSB3aGVuIGNhbGxpbmcgdGhlCisgICAgICBmdW5jdGlvbi4gIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgYXJndW1lbnRzOgogCi0gICAgICBBbnkgZXhwcmVzc2lvbiBtYXkgYmUgdXNlZCB3aXRoaW4gdGhlIGFyZ3VtZW50IGxpc3QsIGFuZCB0aGUgZXZhbHVhdGVkCi0gICAgICB2YWx1ZSBpcyBwYXNzZWQgdG8gdGhlIGxvY2FsIHZhcmlhYmxlLgorICAgICAgKiA6ZGZuOmBrZXl3b3JkIGFyZ3VtZW50YDogYW4gYXJndW1lbnQgcHJlY2VkZWQgYnkgYW4gaWRlbnRpZmllciAoZS5nLgorICAgICAgICBgYG5hbWU9YGApIGluIGEgZnVuY3Rpb24gY2FsbCBvciBwYXNzZWQgYXMgYSB2YWx1ZSBpbiBhIGRpY3Rpb25hcnkKKyAgICAgICAgcHJlY2VkZWQgYnkgYGAqKmBgLiAgRm9yIGV4YW1wbGUsIGBgM2BgIGFuZCBgYDVgYCBhcmUgYm90aCBrZXl3b3JkCisgICAgICAgIGFyZ3VtZW50cyBpbiB0aGUgZm9sbG93aW5nIGNhbGxzIHRvIDpmdW5jOmBjb21wbGV4YDo6CisKKyAgICAgICAgICAgY29tcGxleChyZWFsPTMsIGltYWc9NSkKKyAgICAgICAgICAgY29tcGxleCgqKnsncmVhbCc6IDMsICdpbWFnJzogNX0pCisKKyAgICAgICogOmRmbjpgcG9zaXRpb25hbCBhcmd1bWVudGA6IGFuIGFyZ3VtZW50IHRoYXQgaXMgbm90IGEga2V5d29yZCBhcmd1bWVudC4KKyAgICAgICAgUG9zaXRpb25hbCBhcmd1bWVudHMgY2FuIGFwcGVhciBhdCB0aGUgYmVnaW5uaW5nIG9mIGFuIGFyZ3VtZW50IGxpc3QKKyAgICAgICAgYW5kL29yIGJlIHBhc3NlZCBhcyBlbGVtZW50cyBvZiBhbiA6dGVybTpgaXRlcmFibGVgIHByZWNlZGVkIGJ5IGBgKmBgLgorICAgICAgICBGb3IgZXhhbXBsZSwgYGAzYGAgYW5kIGBgNWBgIGFyZSBib3RoIHBvc2l0aW9uYWwgYXJndW1lbnRzIGluIHRoZQorICAgICAgICBmb2xsb3dpbmcgY2FsbHM6OgorCisgICAgICAgICAgIGNvbXBsZXgoMywgNSkKKyAgICAgICAgICAgY29tcGxleCgqKDMsIDUpKQorCisgICAgICBBcmd1bWVudHMgYXJlIGFzc2lnbmVkIHRvIHRoZSBuYW1lZCBsb2NhbCB2YXJpYWJsZXMgaW4gYSBmdW5jdGlvbiBib2R5LgorICAgICAgU2VlIHRoZSA6cmVmOmBjYWxsc2Agc2VjdGlvbiBmb3IgdGhlIHJ1bGVzIGdvdmVybmluZyB0aGlzIGFzc2lnbm1lbnQuCisgICAgICBTeW50YWN0aWNhbGx5LCBhbnkgZXhwcmVzc2lvbiBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQgYW4gYXJndW1lbnQ7IHRoZQorICAgICAgZXZhbHVhdGVkIHZhbHVlIGlzIGFzc2lnbmVkIHRvIHRoZSBsb2NhbCB2YXJpYWJsZS4KKworICAgICAgU2VlIGFsc28gdGhlIDp0ZXJtOmBwYXJhbWV0ZXJgIGdsb3NzYXJ5IGVudHJ5IGFuZCB0aGUgRkFRIHF1ZXN0aW9uIG9uCisgICAgICA6cmVmOmB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGFyZ3VtZW50cyBhbmQgcGFyYW1ldGVycworICAgICAgPGZhcS1hcmd1bWVudC12cy1wYXJhbWV0ZXI+YC4KIAogICAgYXR0cmlidXRlCiAgICAgICBBIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhbiBvYmplY3Qgd2hpY2ggaXMgcmVmZXJlbmNlZCBieSBuYW1lIHVzaW5nCkBAIC01OSw2ICs3NywxNCBAQAogICAgICAgQmVuZXZvbGVudCBEaWN0YXRvciBGb3IgTGlmZSwgYS5rLmEuIGBHdWlkbyB2YW4gUm9zc3VtCiAgICAgICA8aHR0cDovL3d3dy5weXRob24ub3JnL35ndWlkby8+YF8sIFB5dGhvbidzIGNyZWF0b3IuCiAKKyAgIGJ5dGVzLWxpa2Ugb2JqZWN0CisgICAgICBBbiBvYmplY3QgdGhhdCBzdXBwb3J0cyB0aGUgOnJlZjpgYnVmZmVyIHByb3RvY29sIDxidWZmZXJvYmplY3RzPmAsCisgICAgICBsaWtlIDpjbGFzczpgc3RyYCwgOmNsYXNzOmBieXRlYXJyYXlgIG9yIDpjbGFzczpgbWVtb3J5dmlld2AuCisgICAgICBCeXRlcy1saWtlIG9iamVjdHMgY2FuIGJlIHVzZWQgZm9yIHZhcmlvdXMgb3BlcmF0aW9ucyB0aGF0IGV4cGVjdAorICAgICAgYmluYXJ5IGRhdGEsIHN1Y2ggYXMgY29tcHJlc3Npb24sIHNhdmluZyB0byBhIGJpbmFyeSBmaWxlIG9yIHNlbmRpbmcKKyAgICAgIG92ZXIgYSBzb2NrZXQuIFNvbWUgb3BlcmF0aW9ucyBuZWVkIHRoZSBiaW5hcnkgZGF0YSB0byBiZSBtdXRhYmxlLAorICAgICAgaW4gd2hpY2ggY2FzZSBub3QgYWxsIGJ5dGVzLWxpa2Ugb2JqZWN0cyBjYW4gYXBwbHkuCisKICAgIGJ5dGVjb2RlCiAgICAgICBQeXRob24gc291cmNlIGNvZGUgaXMgY29tcGlsZWQgaW50byBieXRlY29kZSwgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uCiAgICAgICBvZiBhIFB5dGhvbiBwcm9ncmFtIGluIHRoZSBDUHl0aG9uIGludGVycHJldGVyLiAgVGhlIGJ5dGVjb2RlIGlzIGFsc28KQEAgLTgwLDcgKzEwNiw3IEBACiAKICAgIGNsYXNzaWMgY2xhc3MKICAgICAgIEFueSBjbGFzcyB3aGljaCBkb2VzIG5vdCBpbmhlcml0IGZyb20gOmNsYXNzOmBvYmplY3RgLiAgU2VlCi0gICAgICA6dGVybTpgbmV3LXN0eWxlIGNsYXNzYC4gIENsYXNzaWMgY2xhc3NlcyB3aWxsIGJlIHJlbW92ZWQgaW4gUHl0aG9uIDMuMC4KKyAgICAgIDp0ZXJtOmBuZXctc3R5bGUgY2xhc3NgLiAgQ2xhc3NpYyBjbGFzc2VzIGhhdmUgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLgogCiAgICBjb2VyY2lvbgogICAgICAgVGhlIGltcGxpY2l0IGNvbnZlcnNpb24gb2YgYW4gaW5zdGFuY2Ugb2Ygb25lIHR5cGUgdG8gYW5vdGhlciBkdXJpbmcgYW4KQEAgLTE1Miw5ICsxNzgsOSBAQAogICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgZGVzY3JpcHRvcnMnIG1ldGhvZHMsIHNlZSA6cmVmOmBkZXNjcmlwdG9yc2AuCiAKICAgIGRpY3Rpb25hcnkKLSAgICAgIEFuIGFzc29jaWF0aXZlIGFycmF5LCB3aGVyZSBhcmJpdHJhcnkga2V5cyBhcmUgbWFwcGVkIHRvIHZhbHVlcy4gIFRoZSBrZXlzCi0gICAgICBjYW4gYmUgYW55IG9iamVjdCB3aXRoIDptZXRoOmBfX2hhc2hfX2AgZnVuY3Rpb24gYW5kIDptZXRoOmBfX2VxX19gCi0gICAgICBtZXRob2RzLiBDYWxsZWQgYSBoYXNoIGluIFBlcmwuCisgICAgICBBbiBhc3NvY2lhdGl2ZSBhcnJheSwgd2hlcmUgYXJiaXRyYXJ5IGtleXMgYXJlIG1hcHBlZCB0byB2YWx1ZXMuICBUaGUKKyAgICAgIGtleXMgY2FuIGJlIGFueSBvYmplY3Qgd2l0aCA6bWV0aDpgX19oYXNoX19gICBhbmQgOm1ldGg6YF9fZXFfX2AgbWV0aG9kcy4KKyAgICAgIENhbGxlZCBhIGhhc2ggaW4gUGVybC4KIAogICAgZG9jc3RyaW5nCiAgICAgICBBIHN0cmluZyBsaXRlcmFsIHdoaWNoIGFwcGVhcnMgYXMgdGhlIGZpcnN0IGV4cHJlc3Npb24gaW4gYSBjbGFzcywKQEAgLTIwMCw3ICsyMjYsNyBAQAogICAgICAgQW4gb2JqZWN0IGV4cG9zaW5nIGEgZmlsZS1vcmllbnRlZCBBUEkgKHdpdGggbWV0aG9kcyBzdWNoIGFzCiAgICAgICA6bWV0aDpgcmVhZCgpYCBvciA6bWV0aDpgd3JpdGUoKWApIHRvIGFuIHVuZGVybHlpbmcgcmVzb3VyY2UuICBEZXBlbmRpbmcKICAgICAgIG9uIHRoZSB3YXkgaXQgd2FzIGNyZWF0ZWQsIGEgZmlsZSBvYmplY3QgY2FuIG1lZGlhdGUgYWNjZXNzIHRvIGEgcmVhbAotICAgICAgb24tZGlzayBmaWxlIG9yIHRvIGFub3RoZXIgb3RoZXIgdHlwZSBvZiBzdG9yYWdlIG9yIGNvbW11bmljYXRpb24gZGV2aWNlCisgICAgICBvbi1kaXNrIGZpbGUgb3IgdG8gYW5vdGhlciB0eXBlIG9mIHN0b3JhZ2Ugb3IgY29tbXVuaWNhdGlvbiBkZXZpY2UKICAgICAgIChmb3IgZXhhbXBsZSBzdGFuZGFyZCBpbnB1dC9vdXRwdXQsIGluLW1lbW9yeSBidWZmZXJzLCBzb2NrZXRzLCBwaXBlcywKICAgICAgIGV0Yy4pLiAgRmlsZSBvYmplY3RzIGFyZSBhbHNvIGNhbGxlZCA6ZGZuOmBmaWxlLWxpa2Ugb2JqZWN0c2Agb3IKICAgICAgIDpkZm46YHN0cmVhbXNgLgpAQCAtMjI3LDggKzI1Myw5IEBACiAKICAgIGZ1bmN0aW9uCiAgICAgICBBIHNlcmllcyBvZiBzdGF0ZW1lbnRzIHdoaWNoIHJldHVybnMgc29tZSB2YWx1ZSB0byBhIGNhbGxlci4gSXQgY2FuIGFsc28KLSAgICAgIGJlIHBhc3NlZCB6ZXJvIG9yIG1vcmUgYXJndW1lbnRzIHdoaWNoIG1heSBiZSB1c2VkIGluIHRoZSBleGVjdXRpb24gb2YKLSAgICAgIHRoZSBib2R5LiBTZWUgYWxzbyA6dGVybTpgYXJndW1lbnRgIGFuZCA6dGVybTpgbWV0aG9kYC4KKyAgICAgIGJlIHBhc3NlZCB6ZXJvIG9yIG1vcmUgOnRlcm06YGFyZ3VtZW50cyA8YXJndW1lbnQ+YCB3aGljaCBtYXkgYmUgdXNlZCBpbgorICAgICAgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYm9keS4gU2VlIGFsc28gOnRlcm06YHBhcmFtZXRlcmAsIDp0ZXJtOmBtZXRob2RgLAorICAgICAgYW5kIHRoZSA6cmVmOmBmdW5jdGlvbmAgc2VjdGlvbi4KIAogICAgX19mdXR1cmVfXwogICAgICAgQSBwc2V1ZG8tbW9kdWxlIHdoaWNoIHByb2dyYW1tZXJzIGNhbiB1c2UgdG8gZW5hYmxlIG5ldyBsYW5ndWFnZSBmZWF0dXJlcwpAQCAtMzExLDcgKzMzOCw4IEBACiAgICAgICBBbGwgb2YgUHl0aG9uJ3MgaW1tdXRhYmxlIGJ1aWx0LWluIG9iamVjdHMgYXJlIGhhc2hhYmxlLCB3aGlsZSBubyBtdXRhYmxlCiAgICAgICBjb250YWluZXJzIChzdWNoIGFzIGxpc3RzIG9yIGRpY3Rpb25hcmllcykgYXJlLiAgT2JqZWN0cyB3aGljaCBhcmUKICAgICAgIGluc3RhbmNlcyBvZiB1c2VyLWRlZmluZWQgY2xhc3NlcyBhcmUgaGFzaGFibGUgYnkgZGVmYXVsdDsgdGhleSBhbGwKLSAgICAgIGNvbXBhcmUgdW5lcXVhbCwgYW5kIHRoZWlyIGhhc2ggdmFsdWUgaXMgdGhlaXIgOmZ1bmM6YGlkYC4KKyAgICAgIGNvbXBhcmUgdW5lcXVhbCAoZXhjZXB0IHdpdGggdGhlbXNlbHZlcyksIGFuZCB0aGVpciBoYXNoIHZhbHVlIGlzIHRoZWlyCisgICAgICA6ZnVuYzpgaWRgLgogCiAgICBJRExFCiAgICAgICBBbiBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IGZvciBQeXRob24uICBJRExFIGlzIGEgYmFzaWMgZWRpdG9yCkBAIC0zMzcsNiArMzY1LDEwIEBACiAgICAgICBmcmFjdGlvbi4gIEludGVnZXIgZGl2aXNpb24gY2FuIGJlIGZvcmNlZCBieSB1c2luZyB0aGUgYGAvL2BgIG9wZXJhdG9yCiAgICAgICBpbnN0ZWFkIG9mIHRoZSBgYC9gYCBvcGVyYXRvci4gIFNlZSBhbHNvIDp0ZXJtOmBfX2Z1dHVyZV9fYC4KIAorICAgaW1wb3J0aW5nCisgICAgICBUaGUgcHJvY2VzcyBieSB3aGljaCBQeXRob24gY29kZSBpbiBvbmUgbW9kdWxlIGlzIG1hZGUgYXZhaWxhYmxlIHRvCisgICAgICBQeXRob24gY29kZSBpbiBhbm90aGVyIG1vZHVsZS4KKwogICAgaW1wb3J0ZXIKICAgICAgIEFuIG9iamVjdCB0aGF0IGJvdGggZmluZHMgYW5kIGxvYWRzIGEgbW9kdWxlOyBib3RoIGEKICAgICAgIDp0ZXJtOmBmaW5kZXJgIGFuZCA6dGVybTpgbG9hZGVyYCBvYmplY3QuCkBAIC0zNTksMTcgKzM5MSwxNyBAQAogICAgICAgc2xvd2x5LiAgU2VlIGFsc28gOnRlcm06YGludGVyYWN0aXZlYC4KIAogICAgaXRlcmFibGUKLSAgICAgIEFuIG9iamVjdCBjYXBhYmxlIG9mIHJldHVybmluZyBpdHMgbWVtYmVycyBvbmUgYXQgYQotICAgICAgdGltZS4gRXhhbXBsZXMgb2YgaXRlcmFibGVzIGluY2x1ZGUgYWxsIHNlcXVlbmNlIHR5cGVzIChzdWNoIGFzCi0gICAgICA6Y2xhc3M6YGxpc3RgLCA6Y2xhc3M6YHN0cmAsIGFuZCA6Y2xhc3M6YHR1cGxlYCkgYW5kIHNvbWUgbm9uLXNlcXVlbmNlCi0gICAgICB0eXBlcyBsaWtlIDpjbGFzczpgZGljdGAgYW5kIDpjbGFzczpgZmlsZWAgYW5kIG9iamVjdHMgb2YgYW55IGNsYXNzZXMgeW91Ci0gICAgICBkZWZpbmUgd2l0aCBhbiA6bWV0aDpgX19pdGVyX19gIG9yIDptZXRoOmBfX2dldGl0ZW1fX2AgbWV0aG9kLiAgSXRlcmFibGVzCi0gICAgICBjYW4gYmUgdXNlZCBpbiBhIDprZXl3b3JkOmBmb3JgIGxvb3AgYW5kIGluIG1hbnkgb3RoZXIgcGxhY2VzIHdoZXJlIGEKLSAgICAgIHNlcXVlbmNlIGlzIG5lZWRlZCAoOmZ1bmM6YHppcGAsIDpmdW5jOmBtYXBgLCAuLi4pLiAgV2hlbiBhbiBpdGVyYWJsZQotICAgICAgb2JqZWN0IGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gOmZ1bmM6YGl0ZXJgLCBpdAotICAgICAgcmV0dXJucyBhbiBpdGVyYXRvciBmb3IgdGhlIG9iamVjdC4gIFRoaXMgaXRlcmF0b3IgaXMgZ29vZCBmb3Igb25lIHBhc3MKLSAgICAgIG92ZXIgdGhlIHNldCBvZiB2YWx1ZXMuICBXaGVuIHVzaW5nIGl0ZXJhYmxlcywgaXQgaXMgdXN1YWxseSBub3QgbmVjZXNzYXJ5Ci0gICAgICB0byBjYWxsIDpmdW5jOmBpdGVyYCBvciBkZWFsIHdpdGggaXRlcmF0b3Igb2JqZWN0cyB5b3Vyc2VsZi4gIFRoZSBgYGZvcmBgCisgICAgICBBbiBvYmplY3QgY2FwYWJsZSBvZiByZXR1cm5pbmcgaXRzIG1lbWJlcnMgb25lIGF0IGEgdGltZS4gRXhhbXBsZXMgb2YKKyAgICAgIGl0ZXJhYmxlcyBpbmNsdWRlIGFsbCBzZXF1ZW5jZSB0eXBlcyAoc3VjaCBhcyA6Y2xhc3M6YGxpc3RgLCA6Y2xhc3M6YHN0cmAsCisgICAgICBhbmQgOmNsYXNzOmB0dXBsZWApIGFuZCBzb21lIG5vbi1zZXF1ZW5jZSB0eXBlcyBsaWtlIDpjbGFzczpgZGljdGAKKyAgICAgIGFuZCA6Y2xhc3M6YGZpbGVgIGFuZCBvYmplY3RzIG9mIGFueSBjbGFzc2VzIHlvdSBkZWZpbmUKKyAgICAgIHdpdGggYW4gOm1ldGg6YF9faXRlcl9fYCBvciA6bWV0aDpgX19nZXRpdGVtX19gIG1ldGhvZC4gIEl0ZXJhYmxlcyBjYW4gYmUKKyAgICAgIHVzZWQgaW4gYSA6a2V5d29yZDpgZm9yYCBsb29wIGFuZCBpbiBtYW55IG90aGVyIHBsYWNlcyB3aGVyZSBhIHNlcXVlbmNlIGlzCisgICAgICBuZWVkZWQgKDpmdW5jOmB6aXBgLCA6ZnVuYzpgbWFwYCwgLi4uKS4gIFdoZW4gYW4gaXRlcmFibGUgb2JqZWN0IGlzIHBhc3NlZAorICAgICAgYXMgYW4gYXJndW1lbnQgdG8gdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIDpmdW5jOmBpdGVyYCwgaXQgcmV0dXJucyBhbgorICAgICAgaXRlcmF0b3IgZm9yIHRoZSBvYmplY3QuICBUaGlzIGl0ZXJhdG9yIGlzIGdvb2QgZm9yIG9uZSBwYXNzIG92ZXIgdGhlIHNldAorICAgICAgb2YgdmFsdWVzLiAgV2hlbiB1c2luZyBpdGVyYWJsZXMsIGl0IGlzIHVzdWFsbHkgbm90IG5lY2Vzc2FyeSB0byBjYWxsCisgICAgICA6ZnVuYzpgaXRlcmAgb3IgZGVhbCB3aXRoIGl0ZXJhdG9yIG9iamVjdHMgeW91cnNlbGYuICBUaGUgYGBmb3JgYAogICAgICAgc3RhdGVtZW50IGRvZXMgdGhhdCBhdXRvbWF0aWNhbGx5IGZvciB5b3UsIGNyZWF0aW5nIGEgdGVtcG9yYXJ5IHVubmFtZWQKICAgICAgIHZhcmlhYmxlIHRvIGhvbGQgdGhlIGl0ZXJhdG9yIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGxvb3AuICBTZWUgYWxzbwogICAgICAgOnRlcm06YGl0ZXJhdG9yYCwgOnRlcm06YHNlcXVlbmNlYCwgYW5kIDp0ZXJtOmBnZW5lcmF0b3JgLgpAQCAtNDA2LDE2ICs0MzgsMTMgQEAKICAgICAgIDptZXRoOmBzdHIubG93ZXJgIG1ldGhvZCBjYW4gc2VydmUgYXMgYSBrZXkgZnVuY3Rpb24gZm9yIGNhc2UgaW5zZW5zaXRpdmUKICAgICAgIHNvcnRzLiAgQWx0ZXJuYXRpdmVseSwgYW4gYWQtaG9jIGtleSBmdW5jdGlvbiBjYW4gYmUgYnVpbHQgZnJvbSBhCiAgICAgICA6a2V5d29yZDpgbGFtYmRhYCBleHByZXNzaW9uIHN1Y2ggYXMgYGBsYW1iZGEgcjogKHJbMF0sIHJbMl0pYGAuICBBbHNvLAotICAgICAgdGhlIDptb2Q6YG9wZXJhdG9yYCBtb2R1bGUgcHJvdmlkZXMgdGhyZWUga2V5IGZ1bmN0aW9uIGNvbnN0dWN0b3JzOgorICAgICAgdGhlIDptb2Q6YG9wZXJhdG9yYCBtb2R1bGUgcHJvdmlkZXMgdGhyZWUga2V5IGZ1bmN0aW9uIGNvbnN0cnVjdG9yczoKICAgICAgIDpmdW5jOmB+b3BlcmF0b3IuYXR0cmdldHRlcmAsIDpmdW5jOmB+b3BlcmF0b3IuaXRlbWdldHRlcmAsIGFuZAogICAgICAgOmZ1bmM6YH5vcGVyYXRvci5tZXRob2RjYWxsZXJgLiAgU2VlIHRoZSA6cmVmOmBTb3J0aW5nIEhPVyBUTwogICAgICAgPHNvcnRpbmdob3d0bz5gIGZvciBleGFtcGxlcyBvZiBob3cgdG8gY3JlYXRlIGFuZCB1c2Uga2V5IGZ1bmN0aW9ucy4KIAogICAga2V5d29yZCBhcmd1bWVudAotICAgICAgQXJndW1lbnRzIHdoaWNoIGFyZSBwcmVjZWRlZCB3aXRoIGEgYGB2YXJpYWJsZV9uYW1lPWBgIGluIHRoZSBjYWxsLgotICAgICAgVGhlIHZhcmlhYmxlIG5hbWUgZGVzaWduYXRlcyB0aGUgbG9jYWwgbmFtZSBpbiB0aGUgZnVuY3Rpb24gdG8gd2hpY2ggdGhlCi0gICAgICB2YWx1ZSBpcyBhc3NpZ25lZC4gIGBgKipgYCBpcyB1c2VkIHRvIGFjY2VwdCBvciBwYXNzIGEgZGljdGlvbmFyeSBvZgotICAgICAga2V5d29yZCBhcmd1bWVudHMuICBTZWUgOnRlcm06YGFyZ3VtZW50YC4KKyAgICAgIFNlZSA6dGVybTpgYXJndW1lbnRgLgogCiAgICBsYW1iZGEKICAgICAgIEFuIGFub255bW91cyBpbmxpbmUgZnVuY3Rpb24gY29uc2lzdGluZyBvZiBhIHNpbmdsZSA6dGVybTpgZXhwcmVzc2lvbmAKQEAgLTQ4NCw2ICs1MTMsMTMgQEAKICAgICAgIGZvciBhIG1lbWJlciBkdXJpbmcgbG9va3VwLiBTZWUgYFRoZSBQeXRob24gMi4zIE1ldGhvZCBSZXNvbHV0aW9uIE9yZGVyCiAgICAgICA8aHR0cDovL3d3dy5weXRob24ub3JnL2Rvd25sb2FkL3JlbGVhc2VzLzIuMy9tcm8vPmBfLgogCisgICBtb2R1bGUKKyAgICAgIEFuIG9iamVjdCB0aGF0IHNlcnZlcyBhcyBhbiBvcmdhbml6YXRpb25hbCB1bml0IG9mIFB5dGhvbiBjb2RlLiAgTW9kdWxlcworICAgICAgaGF2ZSBhIG5hbWVzcGFjZSBjb250YWluaW5nIGFyYml0cmFyeSBQeXRob24gb2JqZWN0cy4gIE1vZHVsZXMgYXJlIGxvYWRlZAorICAgICAgaW50byBQeXRob24gYnkgdGhlIHByb2Nlc3Mgb2YgOnRlcm06YGltcG9ydGluZ2AuCisKKyAgICAgIFNlZSBhbHNvIDp0ZXJtOmBwYWNrYWdlYC4KKwogICAgTVJPCiAgICAgICBTZWUgOnRlcm06YG1ldGhvZCByZXNvbHV0aW9uIG9yZGVyYC4KIApAQCAtNTE5LDE2ICs1NTUsMTUgQEAKICAgIG5lc3RlZCBzY29wZQogICAgICAgVGhlIGFiaWxpdHkgdG8gcmVmZXIgdG8gYSB2YXJpYWJsZSBpbiBhbiBlbmNsb3NpbmcgZGVmaW5pdGlvbi4gIEZvcgogICAgICAgaW5zdGFuY2UsIGEgZnVuY3Rpb24gZGVmaW5lZCBpbnNpZGUgYW5vdGhlciBmdW5jdGlvbiBjYW4gcmVmZXIgdG8KLSAgICAgIHZhcmlhYmxlcyBpbiB0aGUgb3V0ZXIgZnVuY3Rpb24uICBOb3RlIHRoYXQgbmVzdGVkIHNjb3BlcyBieSBkZWZhdWx0IHdvcmsKLSAgICAgIG9ubHkgZm9yIHJlZmVyZW5jZSBhbmQgbm90IGZvciBhc3NpZ25tZW50LiAgTG9jYWwgdmFyaWFibGVzIGJvdGggcmVhZCBhbmQKLSAgICAgIHdyaXRlIGluIHRoZSBpbm5lcm1vc3Qgc2NvcGUuICBMaWtld2lzZSwgZ2xvYmFsIHZhcmlhYmxlcyByZWFkIGFuZCB3cml0ZQotICAgICAgdG8gdGhlIGdsb2JhbCBuYW1lc3BhY2UuICBUaGUgOmtleXdvcmQ6YG5vbmxvY2FsYCBhbGxvd3Mgd3JpdGluZyB0byBvdXRlcgotICAgICAgc2NvcGVzLgorICAgICAgdmFyaWFibGVzIGluIHRoZSBvdXRlciBmdW5jdGlvbi4gIE5vdGUgdGhhdCBuZXN0ZWQgc2NvcGVzIHdvcmsgb25seSBmb3IKKyAgICAgIHJlZmVyZW5jZSBhbmQgbm90IGZvciBhc3NpZ25tZW50IHdoaWNoIHdpbGwgYWx3YXlzIHdyaXRlIHRvIHRoZSBpbm5lcm1vc3QKKyAgICAgIHNjb3BlLiAgSW4gY29udHJhc3QsIGxvY2FsIHZhcmlhYmxlcyBib3RoIHJlYWQgYW5kIHdyaXRlIGluIHRoZSBpbm5lcm1vc3QKKyAgICAgIHNjb3BlLiAgTGlrZXdpc2UsIGdsb2JhbCB2YXJpYWJsZXMgcmVhZCBhbmQgd3JpdGUgdG8gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCiAKICAgIG5ldy1zdHlsZSBjbGFzcwogICAgICAgQW55IGNsYXNzIHdoaWNoIGluaGVyaXRzIGZyb20gOmNsYXNzOmBvYmplY3RgLiAgVGhpcyBpbmNsdWRlcyBhbGwgYnVpbHQtaW4KICAgICAgIHR5cGVzIGxpa2UgOmNsYXNzOmBsaXN0YCBhbmQgOmNsYXNzOmBkaWN0YC4gIE9ubHkgbmV3LXN0eWxlIGNsYXNzZXMgY2FuCi0gICAgICB1c2UgUHl0aG9uJ3MgbmV3ZXIsIHZlcnNhdGlsZSBmZWF0dXJlcyBsaWtlIDphdHRyOmBfX3Nsb3RzX19gLAorICAgICAgdXNlIFB5dGhvbidzIG5ld2VyLCB2ZXJzYXRpbGUgZmVhdHVyZXMgbGlrZSA6YXR0cjpgfm9iamVjdC5fX3Nsb3RzX19gLAogICAgICAgZGVzY3JpcHRvcnMsIHByb3BlcnRpZXMsIGFuZCA6bWV0aDpgX19nZXRhdHRyaWJ1dGVfX2AuCiAKICAgICAgIE1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIDpyZWY6YG5ld3N0eWxlYC4KQEAgLTUzOCwxMiArNTczLDUxIEBACiAgICAgICAobWV0aG9kcykuICBBbHNvIHRoZSB1bHRpbWF0ZSBiYXNlIGNsYXNzIG9mIGFueSA6dGVybTpgbmV3LXN0eWxlCiAgICAgICBjbGFzc2AuCiAKKyAgIHBhY2thZ2UKKyAgICAgIEEgUHl0aG9uIDp0ZXJtOmBtb2R1bGVgIHdoaWNoIGNhbiBjb250YWluIHN1Ym1vZHVsZXMgb3IgcmVjdXJzaXZlbHksCisgICAgICBzdWJwYWNrYWdlcy4gIFRlY2huaWNhbGx5LCBhIHBhY2thZ2UgaXMgYSBQeXRob24gbW9kdWxlIHdpdGggYW4KKyAgICAgIGBgX19wYXRoX19gYCBhdHRyaWJ1dGUuCisKKyAgIHBhcmFtZXRlcgorICAgICAgQSBuYW1lZCBlbnRpdHkgaW4gYSA6dGVybTpgZnVuY3Rpb25gIChvciBtZXRob2QpIGRlZmluaXRpb24gdGhhdAorICAgICAgc3BlY2lmaWVzIGFuIDp0ZXJtOmBhcmd1bWVudGAgKG9yIGluIHNvbWUgY2FzZXMsIGFyZ3VtZW50cykgdGhhdCB0aGUKKyAgICAgIGZ1bmN0aW9uIGNhbiBhY2NlcHQuICBUaGVyZSBhcmUgZm91ciB0eXBlcyBvZiBwYXJhbWV0ZXJzOgorCisgICAgICAqIDpkZm46YHBvc2l0aW9uYWwtb3Ita2V5d29yZGA6IHNwZWNpZmllcyBhbiBhcmd1bWVudCB0aGF0IGNhbiBiZSBwYXNzZWQKKyAgICAgICAgZWl0aGVyIDp0ZXJtOmBwb3NpdGlvbmFsbHkgPGFyZ3VtZW50PmAgb3IgYXMgYSA6dGVybTpga2V5d29yZCBhcmd1bWVudAorICAgICAgICA8YXJndW1lbnQ+YC4gIFRoaXMgaXMgdGhlIGRlZmF1bHQga2luZCBvZiBwYXJhbWV0ZXIsIGZvciBleGFtcGxlICpmb28qCisgICAgICAgIGFuZCAqYmFyKiBpbiB0aGUgZm9sbG93aW5nOjoKKworICAgICAgICAgICBkZWYgZnVuYyhmb28sIGJhcj1Ob25lKTogLi4uCisKKyAgICAgICogOmRmbjpgcG9zaXRpb25hbC1vbmx5YDogc3BlY2lmaWVzIGFuIGFyZ3VtZW50IHRoYXQgY2FuIGJlIHN1cHBsaWVkIG9ubHkKKyAgICAgICAgYnkgcG9zaXRpb24uICBQeXRob24gaGFzIG5vIHN5bnRheCBmb3IgZGVmaW5pbmcgcG9zaXRpb25hbC1vbmx5CisgICAgICAgIHBhcmFtZXRlcnMuICBIb3dldmVyLCBzb21lIGJ1aWx0LWluIGZ1bmN0aW9ucyBoYXZlIHBvc2l0aW9uYWwtb25seQorICAgICAgICBwYXJhbWV0ZXJzIChlLmcuIDpmdW5jOmBhYnNgKS4KKworICAgICAgKiA6ZGZuOmB2YXItcG9zaXRpb25hbGA6IHNwZWNpZmllcyB0aGF0IGFuIGFyYml0cmFyeSBzZXF1ZW5jZSBvZgorICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50cyBjYW4gYmUgcHJvdmlkZWQgKGluIGFkZGl0aW9uIHRvIGFueSBwb3NpdGlvbmFsCisgICAgICAgIGFyZ3VtZW50cyBhbHJlYWR5IGFjY2VwdGVkIGJ5IG90aGVyIHBhcmFtZXRlcnMpLiAgU3VjaCBhIHBhcmFtZXRlciBjYW4KKyAgICAgICAgYmUgZGVmaW5lZCBieSBwcmVwZW5kaW5nIHRoZSBwYXJhbWV0ZXIgbmFtZSB3aXRoIGBgKmBgLCBmb3IgZXhhbXBsZQorICAgICAgICAqYXJncyogaW4gdGhlIGZvbGxvd2luZzo6CisKKyAgICAgICAgICAgZGVmIGZ1bmMoKmFyZ3MsICoqa3dhcmdzKTogLi4uCisKKyAgICAgICogOmRmbjpgdmFyLWtleXdvcmRgOiBzcGVjaWZpZXMgdGhhdCBhcmJpdHJhcmlseSBtYW55IGtleXdvcmQgYXJndW1lbnRzCisgICAgICAgIGNhbiBiZSBwcm92aWRlZCAoaW4gYWRkaXRpb24gdG8gYW55IGtleXdvcmQgYXJndW1lbnRzIGFscmVhZHkgYWNjZXB0ZWQKKyAgICAgICAgYnkgb3RoZXIgcGFyYW1ldGVycykuICBTdWNoIGEgcGFyYW1ldGVyIGNhbiBiZSBkZWZpbmVkIGJ5IHByZXBlbmRpbmcKKyAgICAgICAgdGhlIHBhcmFtZXRlciBuYW1lIHdpdGggYGAqKmBgLCBmb3IgZXhhbXBsZSAqa3dhcmdzKiBpbiB0aGUgZXhhbXBsZQorICAgICAgICBhYm92ZS4KKworICAgICAgUGFyYW1ldGVycyBjYW4gc3BlY2lmeSBib3RoIG9wdGlvbmFsIGFuZCByZXF1aXJlZCBhcmd1bWVudHMsIGFzIHdlbGwgYXMKKyAgICAgIGRlZmF1bHQgdmFsdWVzIGZvciBzb21lIG9wdGlvbmFsIGFyZ3VtZW50cy4KKworICAgICAgU2VlIGFsc28gdGhlIDp0ZXJtOmBhcmd1bWVudGAgZ2xvc3NhcnkgZW50cnksIHRoZSBGQVEgcXVlc3Rpb24gb24KKyAgICAgIDpyZWY6YHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYXJndW1lbnRzIGFuZCBwYXJhbWV0ZXJzCisgICAgICA8ZmFxLWFyZ3VtZW50LXZzLXBhcmFtZXRlcj5gLCBhbmQgdGhlIDpyZWY6YGZ1bmN0aW9uYCBzZWN0aW9uLgorCiAgICBwb3NpdGlvbmFsIGFyZ3VtZW50Ci0gICAgICBUaGUgYXJndW1lbnRzIGFzc2lnbmVkIHRvIGxvY2FsIG5hbWVzIGluc2lkZSBhIGZ1bmN0aW9uIG9yIG1ldGhvZCwKLSAgICAgIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSBnaXZlbiBpbiB0aGUgY2FsbC4gIGBgKmBgIGlzCi0gICAgICB1c2VkIHRvIGVpdGhlciBhY2NlcHQgbXVsdGlwbGUgcG9zaXRpb25hbCBhcmd1bWVudHMgKHdoZW4gaW4gdGhlCi0gICAgICBkZWZpbml0aW9uKSwgb3IgcGFzcyBzZXZlcmFsIGFyZ3VtZW50cyBhcyBhIGxpc3QgdG8gYSBmdW5jdGlvbi4gIFNlZQotICAgICAgOnRlcm06YGFyZ3VtZW50YC4KKyAgICAgIFNlZSA6dGVybTpgYXJndW1lbnRgLgogCiAgICBQeXRob24gMzAwMAogICAgICAgTmlja25hbWUgZm9yIHRoZSBQeXRob24gMy54IHJlbGVhc2UgbGluZSAoY29pbmVkIGxvbmcgYWdvIHdoZW4gdGhlIHJlbGVhc2UKQEAgLTYwNiw3ICs2ODAsNyBAQAogCiAgICBzdGF0ZW1lbnQKICAgICAgIEEgc3RhdGVtZW50IGlzIHBhcnQgb2YgYSBzdWl0ZSAoYSAiYmxvY2siIG9mIGNvZGUpLiAgQSBzdGF0ZW1lbnQgaXMgZWl0aGVyCi0gICAgICBhbiA6dGVybTpgZXhwcmVzc2lvbmAgb3IgYSBvbmUgb2Ygc2V2ZXJhbCBjb25zdHJ1Y3RzIHdpdGggYSBrZXl3b3JkLCBzdWNoCisgICAgICBhbiA6dGVybTpgZXhwcmVzc2lvbmAgb3Igb25lIG9mIHNldmVyYWwgY29uc3RydWN0cyB3aXRoIGEga2V5d29yZCwgc3VjaAogICAgICAgYXMgOmtleXdvcmQ6YGlmYCwgOmtleXdvcmQ6YHdoaWxlYCBvciA6a2V5d29yZDpgZm9yYC4KIAogICAgc3RydWN0IHNlcXVlbmNlCkBAIC02MjksNyArNzAzLDE1IEBACiAgICB0eXBlCiAgICAgICBUaGUgdHlwZSBvZiBhIFB5dGhvbiBvYmplY3QgZGV0ZXJtaW5lcyB3aGF0IGtpbmQgb2Ygb2JqZWN0IGl0IGlzOyBldmVyeQogICAgICAgb2JqZWN0IGhhcyBhIHR5cGUuICBBbiBvYmplY3QncyB0eXBlIGlzIGFjY2Vzc2libGUgYXMgaXRzCi0gICAgICA6YXR0cjpgX19jbGFzc19fYCBhdHRyaWJ1dGUgb3IgY2FuIGJlIHJldHJpZXZlZCB3aXRoIGBgdHlwZShvYmopYGAuCisgICAgICA6YXR0cjpgfmluc3RhbmNlLl9fY2xhc3NfX2AgYXR0cmlidXRlIG9yIGNhbiBiZSByZXRyaWV2ZWQgd2l0aAorICAgICAgYGB0eXBlKG9iailgYC4KKworICAgdW5pdmVyc2FsIG5ld2xpbmVzCisgICAgICBBIG1hbm5lciBvZiBpbnRlcnByZXRpbmcgdGV4dCBzdHJlYW1zIGluIHdoaWNoIGFsbCBvZiB0aGUgZm9sbG93aW5nIGFyZQorICAgICAgcmVjb2duaXplZCBhcyBlbmRpbmcgYSBsaW5lOiB0aGUgVW5peCBlbmQtb2YtbGluZSBjb252ZW50aW9uIGBgJ1xuJ2BgLAorICAgICAgdGhlIFdpbmRvd3MgY29udmVudGlvbiBgYCdcclxuJ2BgLCBhbmQgdGhlIG9sZCBNYWNpbnRvc2ggY29udmVudGlvbgorICAgICAgYGAnXHInYGAuICBTZWUgOnBlcDpgMjc4YCBhbmQgOnBlcDpgMzExNmAsIGFzIHdlbGwgYXMKKyAgICAgIDpmdW5jOmBzdHIuc3BsaXRsaW5lc2AgZm9yIGFuIGFkZGl0aW9uYWwgdXNlLgogCiAgICB2aWV3CiAgICAgICBUaGUgb2JqZWN0cyByZXR1cm5lZCBmcm9tIDptZXRoOmBkaWN0LnZpZXdrZXlzYCwgOm1ldGg6YGRpY3Qudmlld3ZhbHVlc2AsCmRpZmYgLS1naXQgYS9Eb2MvaG93dG8vYWR2b2NhY3kucnN0IGIvRG9jL2hvd3RvL2Fkdm9jYWN5LnJzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY3ZTIwMS4uMDAwMDAwMAotLS0gYS9Eb2MvaG93dG8vYWR2b2NhY3kucnN0CisrKyAvZGV2L251bGwKQEAgLTEsMzU2ICswLDAgQEAKLSoqKioqKioqKioqKioqKioqKioqKioqKioKLSAgUHl0aG9uIEFkdm9jYWN5IEhPV1RPCi0qKioqKioqKioqKioqKioqKioqKioqKioqCi0KLTpBdXRob3I6IEEuTS4gS3VjaGxpbmcKLTpSZWxlYXNlOiAwLjAzCi0KLQotLi4gdG9waWM6OiBBYnN0cmFjdAotCi0gICBJdCdzIHVzdWFsbHkgZGlmZmljdWx0IHRvIGdldCB5b3VyIG1hbmFnZW1lbnQgdG8gYWNjZXB0IG9wZW4gc291cmNlIHNvZnR3YXJlLAotICAgYW5kIFB5dGhvbiBpcyBubyBleGNlcHRpb24gdG8gdGhpcyBydWxlLiAgVGhpcyBkb2N1bWVudCBkaXNjdXNzZXMgcmVhc29ucyB0byB1c2UKLSAgIFB5dGhvbiwgc3RyYXRlZ2llcyBmb3Igd2lubmluZyBhY2NlcHRhbmNlLCBmYWN0cyBhbmQgYXJndW1lbnRzIHlvdSBjYW4gdXNlLCBhbmQKLSAgIGNhc2VzIHdoZXJlIHlvdSAqc2hvdWxkbid0KiB0cnkgdG8gdXNlIFB5dGhvbi4KLQotCi1SZWFzb25zIHRvIFVzZSBQeXRob24KLT09PT09PT09PT09PT09PT09PT09PQotCi1UaGVyZSBhcmUgc2V2ZXJhbCByZWFzb25zIHRvIGluY29ycG9yYXRlIGEgc2NyaXB0aW5nIGxhbmd1YWdlIGludG8geW91cgotZGV2ZWxvcG1lbnQgcHJvY2VzcywgYW5kIHRoaXMgc2VjdGlvbiB3aWxsIGRpc2N1c3MgdGhlbSwgYW5kIHdoeSBQeXRob24gaGFzIHNvbWUKLXByb3BlcnRpZXMgdGhhdCBtYWtlIGl0IGEgcGFydGljdWxhcmx5IGdvb2QgY2hvaWNlLgotCi0KLVByb2dyYW1tYWJpbGl0eQotLS0tLS0tLS0tLS0tLS0tCi0KLVByb2dyYW1zIGFyZSBvZnRlbiBvcmdhbml6ZWQgaW4gYSBtb2R1bGFyIGZhc2hpb24uICBMb3dlci1sZXZlbCBvcGVyYXRpb25zIGFyZQotZ3JvdXBlZCB0b2dldGhlciwgYW5kIGNhbGxlZCBieSBoaWdoZXItbGV2ZWwgZnVuY3Rpb25zLCB3aGljaCBtYXkgaW4gdHVybiBiZQotdXNlZCBhcyBiYXNpYyBvcGVyYXRpb25zIGJ5IHN0aWxsIGZ1cnRoZXIgdXBwZXIgbGV2ZWxzLgotCi1Gb3IgZXhhbXBsZSwgdGhlIGxvd2VzdCBsZXZlbCBtaWdodCBkZWZpbmUgYSB2ZXJ5IGxvdy1sZXZlbCBzZXQgb2YgZnVuY3Rpb25zIGZvcgotYWNjZXNzaW5nIGEgaGFzaCB0YWJsZS4gIFRoZSBuZXh0IGxldmVsIG1pZ2h0IHVzZSBoYXNoIHRhYmxlcyB0byBzdG9yZSB0aGUKLWhlYWRlcnMgb2YgYSBtYWlsIG1lc3NhZ2UsIG1hcHBpbmcgYSBoZWFkZXIgbmFtZSBsaWtlIGBgRGF0ZWBgIHRvIGEgdmFsdWUgc3VjaAotYXMgYGBUdWUsIDEzIE1heSAxOTk3IDIwOjAwOjU0IC0wNDAwYGAuICBBIHlldCBoaWdoZXIgbGV2ZWwgbWF5IG9wZXJhdGUgb24KLW1lc3NhZ2Ugb2JqZWN0cywgd2l0aG91dCBrbm93aW5nIG9yIGNhcmluZyB0aGF0IG1lc3NhZ2UgaGVhZGVycyBhcmUgc3RvcmVkIGluIGEKLWhhc2ggdGFibGUsIGFuZCBzbyBmb3J0aC4KLQotT2Z0ZW4sIHRoZSBsb3dlc3QgbGV2ZWxzIGRvIHZlcnkgc2ltcGxlIHRoaW5nczsgdGhleSBpbXBsZW1lbnQgYSBkYXRhIHN0cnVjdHVyZQotc3VjaCBhcyBhIGJpbmFyeSB0cmVlIG9yIGhhc2ggdGFibGUsIG9yIHRoZXkgcGVyZm9ybSBzb21lIHNpbXBsZSBjb21wdXRhdGlvbiwKLXN1Y2ggYXMgY29udmVydGluZyBhIGRhdGUgc3RyaW5nIHRvIGEgbnVtYmVyLiAgVGhlIGhpZ2hlciBsZXZlbHMgdGhlbiBjb250YWluCi1sb2dpYyBjb25uZWN0aW5nIHRoZXNlIHByaW1pdGl2ZSBvcGVyYXRpb25zLiAgVXNpbmcgdGhlIGFwcHJvYWNoLCB0aGUgcHJpbWl0aXZlcwotY2FuIGJlIHNlZW4gYXMgYmFzaWMgYnVpbGRpbmcgYmxvY2tzIHdoaWNoIGFyZSB0aGVuIGdsdWVkIHRvZ2V0aGVyIHRvIHByb2R1Y2UKLXRoZSBjb21wbGV0ZSBwcm9kdWN0LgotCi1XaHkgaXMgdGhpcyBkZXNpZ24gYXBwcm9hY2ggcmVsZXZhbnQgdG8gUHl0aG9uPyAgQmVjYXVzZSBQeXRob24gaXMgd2VsbCBzdWl0ZWQKLXRvIGZ1bmN0aW9uaW5nIGFzIHN1Y2ggYSBnbHVlIGxhbmd1YWdlLiAgQSBjb21tb24gYXBwcm9hY2ggaXMgdG8gd3JpdGUgYSBQeXRob24KLW1vZHVsZSB0aGF0IGltcGxlbWVudHMgdGhlIGxvd2VyIGxldmVsIG9wZXJhdGlvbnM7IGZvciB0aGUgc2FrZSBvZiBzcGVlZCwgdGhlCi1pbXBsZW1lbnRhdGlvbiBtaWdodCBiZSBpbiBDLCBKYXZhLCBvciBldmVuIEZvcnRyYW4uICBPbmNlIHRoZSBwcmltaXRpdmVzIGFyZQotYXZhaWxhYmxlIHRvIFB5dGhvbiBwcm9ncmFtcywgdGhlIGxvZ2ljIHVuZGVybHlpbmcgaGlnaGVyIGxldmVsIG9wZXJhdGlvbnMgaXMKLXdyaXR0ZW4gaW4gdGhlIGZvcm0gb2YgUHl0aG9uIGNvZGUuICBUaGUgaGlnaC1sZXZlbCBsb2dpYyBpcyB0aGVuIG1vcmUKLXVuZGVyc3RhbmRhYmxlLCBhbmQgZWFzaWVyIHRvIG1vZGlmeS4KLQotSm9obiBPdXN0ZXJob3V0IHdyb3RlIGEgcGFwZXIgdGhhdCBleHBsYWlucyB0aGlzIGlkZWEgYXQgZ3JlYXRlciBsZW5ndGgsCi1lbnRpdGxlZCAiU2NyaXB0aW5nOiBIaWdoZXIgTGV2ZWwgUHJvZ3JhbW1pbmcgZm9yIHRoZSAyMXN0IENlbnR1cnkiLiAgSQotcmVjb21tZW5kIHRoYXQgeW91IHJlYWQgdGhpcyBwYXBlcjsgc2VlIHRoZSByZWZlcmVuY2VzIGZvciB0aGUgVVJMLiAgT3VzdGVyaG91dAotaXMgdGhlIGludmVudG9yIG9mIHRoZSBUY2wgbGFuZ3VhZ2UsIGFuZCB0aGVyZWZvcmUgYXJndWVzIHRoYXQgVGNsIHNob3VsZCBiZQotdXNlZCBmb3IgdGhpcyBwdXJwb3NlOyBoZSBvbmx5IGJyaWVmbHkgcmVmZXJzIHRvIG90aGVyIGxhbmd1YWdlcyBzdWNoIGFzIFB5dGhvbiwKLVBlcmwsIGFuZCBMaXNwL1NjaGVtZSwgYnV0IGluIHJlYWxpdHksIE91c3RlcmhvdXQncyBhcmd1bWVudCBhcHBsaWVzIHRvCi1zY3JpcHRpbmcgbGFuZ3VhZ2VzIGluIGdlbmVyYWwsIHNpbmNlIHlvdSBjb3VsZCBlcXVhbGx5IHdyaXRlIGV4dGVuc2lvbnMgZm9yIGFueQotb2YgdGhlIGxhbmd1YWdlcyBtZW50aW9uZWQgYWJvdmUuCi0KLQotUHJvdG90eXBpbmcKLS0tLS0tLS0tLS0tCi0KLUluICpUaGUgTXl0aGljYWwgTWFuLU1vbnRoKiwgRnJlZHJpY2sgQnJvb2tzIHN1Z2dlc3RzIHRoZSBmb2xsb3dpbmcgcnVsZSB3aGVuCi1wbGFubmluZyBzb2Z0d2FyZSBwcm9qZWN0czogIlBsYW4gdG8gdGhyb3cgb25lIGF3YXk7IHlvdSB3aWxsIGFueXdheS4iICBCcm9va3MKLWlzIHNheWluZyB0aGF0IHRoZSBmaXJzdCBhdHRlbXB0IGF0IGEgc29mdHdhcmUgZGVzaWduIG9mdGVuIHR1cm5zIG91dCB0byBiZQotd3Jvbmc7IHVubGVzcyB0aGUgcHJvYmxlbSBpcyB2ZXJ5IHNpbXBsZSBvciB5b3UncmUgYW4gZXh0cmVtZWx5IGdvb2QgZGVzaWduZXIsCi15b3UnbGwgZmluZCB0aGF0IG5ldyByZXF1aXJlbWVudHMgYW5kIGZlYXR1cmVzIGJlY29tZSBhcHBhcmVudCBvbmNlIGRldmVsb3BtZW50Ci1oYXMgYWN0dWFsbHkgc3RhcnRlZC4gIElmIHRoZXNlIG5ldyByZXF1aXJlbWVudHMgY2FuJ3QgYmUgY2xlYW5seSBpbmNvcnBvcmF0ZWQKLWludG8gdGhlIHByb2dyYW0ncyBzdHJ1Y3R1cmUsIHlvdSdyZSBwcmVzZW50ZWQgd2l0aCB0d28gdW5wbGVhc2FudCBjaG9pY2VzOgotaGFtbWVyIHRoZSBuZXcgZmVhdHVyZXMgaW50byB0aGUgcHJvZ3JhbSBzb21laG93LCBvciBzY3JhcCBldmVyeXRoaW5nIGFuZCB3cml0ZQotYSBuZXcgdmVyc2lvbiBvZiB0aGUgcHJvZ3JhbSwgdGFraW5nIHRoZSBuZXcgZmVhdHVyZXMgaW50byBhY2NvdW50IGZyb20gdGhlCi1iZWdpbm5pbmcuCi0KLVB5dGhvbiBwcm92aWRlcyB5b3Ugd2l0aCBhIGdvb2QgZW52aXJvbm1lbnQgZm9yIHF1aWNrbHkgZGV2ZWxvcGluZyBhbiBpbml0aWFsCi1wcm90b3R5cGUuICBUaGF0IGxldHMgeW91IGdldCB0aGUgb3ZlcmFsbCBwcm9ncmFtIHN0cnVjdHVyZSBhbmQgbG9naWMgcmlnaHQsIGFuZAoteW91IGNhbiBmaW5lLXR1bmUgc21hbGwgZGV0YWlscyBpbiB0aGUgZmFzdCBkZXZlbG9wbWVudCBjeWNsZSB0aGF0IFB5dGhvbgotcHJvdmlkZXMuICBPbmNlIHlvdSdyZSBzYXRpc2ZpZWQgd2l0aCB0aGUgR1VJIGludGVyZmFjZSBvciBwcm9ncmFtIG91dHB1dCwgeW91Ci1jYW4gdHJhbnNsYXRlIHRoZSBQeXRob24gY29kZSBpbnRvIEMrKywgRm9ydHJhbiwgSmF2YSwgb3Igc29tZSBvdGhlciBjb21waWxlZAotbGFuZ3VhZ2UuCi0KLVByb3RvdHlwaW5nIG1lYW5zIHlvdSBoYXZlIHRvIGJlIGNhcmVmdWwgbm90IHRvIHVzZSB0b28gbWFueSBQeXRob24gZmVhdHVyZXMKLXRoYXQgYXJlIGhhcmQgdG8gaW1wbGVtZW50IGluIHlvdXIgb3RoZXIgbGFuZ3VhZ2UuICBVc2luZyBgYGV2YWwoKWBgLCBvciByZWd1bGFyCi1leHByZXNzaW9ucywgb3IgdGhlIDptb2Q6YHBpY2tsZWAgbW9kdWxlLCBtZWFucyB0aGF0IHlvdSdyZSBnb2luZyB0byBuZWVkIEMgb3IKLUphdmEgbGlicmFyaWVzIGZvciBmb3JtdWxhIGV2YWx1YXRpb24sIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIGFuZCBzZXJpYWxpemF0aW9uLAotZm9yIGV4YW1wbGUuICBCdXQgaXQncyBub3QgaGFyZCB0byBhdm9pZCBzdWNoIHRyaWNreSBjb2RlLCBhbmQgaW4gdGhlIGVuZCB0aGUKLXRyYW5zbGF0aW9uIHVzdWFsbHkgaXNuJ3QgdmVyeSBkaWZmaWN1bHQuICBUaGUgcmVzdWx0aW5nIGNvZGUgY2FuIGJlIHJhcGlkbHkKLWRlYnVnZ2VkLCBiZWNhdXNlIGFueSBzZXJpb3VzIGxvZ2ljYWwgZXJyb3JzIHdpbGwgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUKLXByb3RvdHlwZSwgbGVhdmluZyBvbmx5IG1vcmUgbWlub3Igc2xpcC11cHMgaW4gdGhlIHRyYW5zbGF0aW9uIHRvIHRyYWNrIGRvd24uCi0KLVRoaXMgc3RyYXRlZ3kgYnVpbGRzIG9uIHRoZSBlYXJsaWVyIGRpc2N1c3Npb24gb2YgcHJvZ3JhbW1hYmlsaXR5LiBVc2luZyBQeXRob24KLWFzIGdsdWUgdG8gY29ubmVjdCBsb3dlci1sZXZlbCBjb21wb25lbnRzIGhhcyBvYnZpb3VzIHJlbGV2YW5jZSBmb3IgY29uc3RydWN0aW5nCi1wcm90b3R5cGUgc3lzdGVtcy4gIEluIHRoaXMgd2F5IFB5dGhvbiBjYW4gaGVscCB5b3Ugd2l0aCBkZXZlbG9wbWVudCwgZXZlbiBpZgotZW5kIHVzZXJzIG5ldmVyIGNvbWUgaW4gY29udGFjdCB3aXRoIFB5dGhvbiBjb2RlIGF0IGFsbC4gIElmIHRoZSBwZXJmb3JtYW5jZSBvZgotdGhlIFB5dGhvbiB2ZXJzaW9uIGlzIGFkZXF1YXRlIGFuZCBjb3Jwb3JhdGUgcG9saXRpY3MgYWxsb3cgaXQsIHlvdSBtYXkgbm90IG5lZWQKLXRvIGRvIGEgdHJhbnNsYXRpb24gaW50byBDIG9yIEphdmEsIGJ1dCBpdCBjYW4gc3RpbGwgYmUgZmFzdGVyIHRvIGRldmVsb3AgYQotcHJvdG90eXBlIGFuZCB0aGVuIHRyYW5zbGF0ZSBpdCwgaW5zdGVhZCBvZiBhdHRlbXB0aW5nIHRvIHByb2R1Y2UgdGhlIGZpbmFsCi12ZXJzaW9uIGltbWVkaWF0ZWx5LgotCi1PbmUgZXhhbXBsZSBvZiB0aGlzIGRldmVsb3BtZW50IHN0cmF0ZWd5IGlzIE1pY3Jvc29mdCBNZXJjaGFudCBTZXJ2ZXIuIFZlcnNpb24KLTEuMCB3YXMgd3JpdHRlbiBpbiBwdXJlIFB5dGhvbiwgYnkgYSBjb21wYW55IHRoYXQgc3Vic2VxdWVudGx5IHdhcyBwdXJjaGFzZWQgYnkKLU1pY3Jvc29mdC4gIFZlcnNpb24gMi4wIGJlZ2FuIHRvIHRyYW5zbGF0ZSB0aGUgY29kZSBpbnRvIEMrKywgc2hpcHBpbmcgd2l0aCBzb21lCi1DKytjb2RlIGFuZCBzb21lIFB5dGhvbiBjb2RlLiAgVmVyc2lvbiAzLjAgZGlkbid0IGNvbnRhaW4gYW55IFB5dGhvbiBhdCBhbGw7IGFsbAotdGhlIGNvZGUgaGFkIGJlZW4gdHJhbnNsYXRlZCBpbnRvIEMrKy4gIEV2ZW4gdGhvdWdoIHRoZSBwcm9kdWN0IGRvZXNuJ3QgY29udGFpbgotYSBQeXRob24gaW50ZXJwcmV0ZXIsIHRoZSBQeXRob24gbGFuZ3VhZ2UgaGFzIHN0aWxsIHNlcnZlZCBhIHVzZWZ1bCBwdXJwb3NlIGJ5Ci1zcGVlZGluZyB1cCBkZXZlbG9wbWVudC4KLQotVGhpcyBpcyBhIHZlcnkgY29tbW9uIHVzZSBmb3IgUHl0aG9uLiAgUGFzdCBjb25mZXJlbmNlIHBhcGVycyBoYXZlIGFsc28KLWRlc2NyaWJlZCB0aGlzIGFwcHJvYWNoIGZvciBkZXZlbG9waW5nIGhpZ2gtbGV2ZWwgbnVtZXJpY2FsIGFsZ29yaXRobXM7IHNlZQotRGF2aWQgTS4gQmVhemxleSBhbmQgUGV0ZXIgUy4gTG9tZGFobCdzIHBhcGVyICJGZWVkaW5nIGEgTGFyZ2Utc2NhbGUgUGh5c2ljcwotQXBwbGljYXRpb24gdG8gUHl0aG9uIiBpbiB0aGUgcmVmZXJlbmNlcyBmb3IgYSBnb29kIGV4YW1wbGUuICBJZiBhbiBhbGdvcml0aG0ncwotYmFzaWMgb3BlcmF0aW9ucyBhcmUgdGhpbmdzIGxpa2UgIlRha2UgdGhlIGludmVyc2Ugb2YgdGhpcyA0MDAweDQwMDAgbWF0cml4IiwKLWFuZCBhcmUgaW1wbGVtZW50ZWQgaW4gc29tZSBsb3dlci1sZXZlbCBsYW5ndWFnZSwgdGhlbiBQeXRob24gaGFzIGFsbW9zdCBubwotYWRkaXRpb25hbCBwZXJmb3JtYW5jZSBjb3N0OyB0aGUgZXh0cmEgdGltZSByZXF1aXJlZCBmb3IgUHl0aG9uIHRvIGV2YWx1YXRlIGFuCi1leHByZXNzaW9uIGxpa2UgYGBtLmludmVydCgpYGAgaXMgZHdhcmZlZCBieSB0aGUgY29zdCBvZiB0aGUgYWN0dWFsIGNvbXB1dGF0aW9uLgotSXQncyBwYXJ0aWN1bGFybHkgZ29vZCBmb3IgYXBwbGljYXRpb25zIHdoZXJlIHNlZW1pbmdseSBlbmRsZXNzIHR3ZWFraW5nIGlzCi1yZXF1aXJlZCB0byBnZXQgdGhpbmdzIHJpZ2h0LiBHVUkgaW50ZXJmYWNlcyBhbmQgV2ViIHNpdGVzIGFyZSBwcmltZSBleGFtcGxlcy4KLQotVGhlIFB5dGhvbiBjb2RlIGlzIGFsc28gc2hvcnRlciBhbmQgZmFzdGVyIHRvIHdyaXRlIChvbmNlIHlvdSdyZSBmYW1pbGlhciB3aXRoCi1QeXRob24pLCBzbyBpdCdzIGVhc2llciB0byB0aHJvdyBpdCBhd2F5IGlmIHlvdSBkZWNpZGUgeW91ciBhcHByb2FjaCB3YXMgd3Jvbmc7Ci1pZiB5b3UnZCBzcGVudCB0d28gd2Vla3Mgd29ya2luZyBvbiBpdCBpbnN0ZWFkIG9mIGp1c3QgdHdvIGhvdXJzLCB5b3UgbWlnaHQKLXdhc3RlIHRpbWUgdHJ5aW5nIHRvIHBhdGNoIHVwIHdoYXQgeW91J3ZlIGdvdCBvdXQgb2YgYSBuYXR1cmFsIHJlbHVjdGFuY2UgdG8KLWFkbWl0IHRoYXQgdGhvc2UgdHdvIHdlZWtzIHdlcmUgd2FzdGVkLiAgVHJ1dGhmdWxseSwgdGhvc2UgdHdvIHdlZWtzIGhhdmVuJ3QKLWJlZW4gd2FzdGVkLCBzaW5jZSB5b3UndmUgbGVhcm50IHNvbWV0aGluZyBhYm91dCB0aGUgcHJvYmxlbSBhbmQgdGhlIHRlY2hub2xvZ3kKLXlvdSdyZSB1c2luZyB0byBzb2x2ZSBpdCwgYnV0IGl0J3MgaHVtYW4gbmF0dXJlIHRvIHZpZXcgdGhpcyBhcyBhIGZhaWx1cmUgb2YKLXNvbWUgc29ydC4KLQotCi1TaW1wbGljaXR5IGFuZCBFYXNlIG9mIFVuZGVyc3RhbmRpbmcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1QeXRob24gaXMgZGVmaW5pdGVseSAqbm90KiBhIHRveSBsYW5ndWFnZSB0aGF0J3Mgb25seSB1c2FibGUgZm9yIHNtYWxsIHRhc2tzLgotVGhlIGxhbmd1YWdlIGZlYXR1cmVzIGFyZSBnZW5lcmFsIGFuZCBwb3dlcmZ1bCBlbm91Z2ggdG8gZW5hYmxlIGl0IHRvIGJlIHVzZWQKLWZvciBtYW55IGRpZmZlcmVudCBwdXJwb3Nlcy4gIEl0J3MgdXNlZnVsIGF0IHRoZSBzbWFsbCBlbmQsIGZvciAxMC0gb3IgMjAtbGluZQotc2NyaXB0cywgYnV0IGl0IGFsc28gc2NhbGVzIHVwIHRvIGxhcmdlciBzeXN0ZW1zIHRoYXQgY29udGFpbiB0aG91c2FuZHMgb2YgbGluZXMKLW9mIGNvZGUuCi0KLUhvd2V2ZXIsIHRoaXMgZXhwcmVzc2l2ZW5lc3MgZG9lc24ndCBjb21lIGF0IHRoZSBjb3N0IG9mIGFuIG9ic2N1cmUgb3IgdHJpY2t5Ci1zeW50YXguICBXaGlsZSBQeXRob24gaGFzIHNvbWUgZGFyayBjb3JuZXJzIHRoYXQgY2FuIGxlYWQgdG8gb2JzY3VyZSBjb2RlLCB0aGVyZQotYXJlIHJlbGF0aXZlbHkgZmV3IHN1Y2ggY29ybmVycywgYW5kIHByb3BlciBkZXNpZ24gY2FuIGlzb2xhdGUgdGhlaXIgdXNlIHRvIG9ubHkKLWEgZmV3IGNsYXNzZXMgb3IgbW9kdWxlcy4gIEl0J3MgY2VydGFpbmx5IHBvc3NpYmxlIHRvIHdyaXRlIGNvbmZ1c2luZyBjb2RlIGJ5Ci11c2luZyB0b28gbWFueSBmZWF0dXJlcyB3aXRoIHRvbyBsaXR0bGUgY29uY2VybiBmb3IgY2xhcml0eSwgYnV0IG1vc3QgUHl0aG9uCi1jb2RlIGNhbiBsb29rIGEgbG90IGxpa2UgYSBzbGlnaHRseS1mb3JtYWxpemVkIHZlcnNpb24gb2YgaHVtYW4tdW5kZXJzdGFuZGFibGUKLXBzZXVkb2NvZGUuCi0KLUluICpUaGUgTmV3IEhhY2tlcidzIERpY3Rpb25hcnkqLCBFcmljIFMuIFJheW1vbmQgZ2l2ZXMgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uCi1mb3IgImNvbXBhY3QiOgotCi0uLiBlcGlncmFwaDo6Ci0KLSAgIENvbXBhY3QgKmFkai4qICBPZiBhIGRlc2lnbiwgZGVzY3JpYmVzIHRoZSB2YWx1YWJsZSBwcm9wZXJ0eSB0aGF0IGl0IGNhbiBhbGwgYmUKLSAgIGFwcHJlaGVuZGVkIGF0IG9uY2UgaW4gb25lJ3MgaGVhZC4gVGhpcyBnZW5lcmFsbHkgbWVhbnMgdGhlIHRoaW5nIGNyZWF0ZWQgZnJvbQotICAgdGhlIGRlc2lnbiBjYW4gYmUgdXNlZCB3aXRoIGdyZWF0ZXIgZmFjaWxpdHkgYW5kIGZld2VyIGVycm9ycyB0aGFuIGFuIGVxdWl2YWxlbnQKLSAgIHRvb2wgdGhhdCBpcyBub3QgY29tcGFjdC4gQ29tcGFjdG5lc3MgZG9lcyBub3QgaW1wbHkgdHJpdmlhbGl0eSBvciBsYWNrIG9mCi0gICBwb3dlcjsgZm9yIGV4YW1wbGUsIEMgaXMgY29tcGFjdCBhbmQgRk9SVFJBTiBpcyBub3QsIGJ1dCBDIGlzIG1vcmUgcG93ZXJmdWwgdGhhbgotICAgRk9SVFJBTi4gRGVzaWducyBiZWNvbWUgbm9uLWNvbXBhY3QgdGhyb3VnaCBhY2NyZXRpbmcgZmVhdHVyZXMgYW5kIGNydWZ0IHRoYXQKLSAgIGRvbid0IG1lcmdlIGNsZWFubHkgaW50byB0aGUgb3ZlcmFsbCBkZXNpZ24gc2NoZW1lICh0aHVzLCBzb21lIGZhbnMgb2YgQ2xhc3NpYyBDCi0gICBtYWludGFpbiB0aGF0IEFOU0kgQyBpcyBubyBsb25nZXIgY29tcGFjdCkuCi0KLSAgIChGcm9tIGh0dHA6Ly93d3cuY2F0Yi5vcmcvfmVzci9qYXJnb24vaHRtbC9DL2NvbXBhY3QuaHRtbCkKLQotSW4gdGhpcyBzZW5zZSBvZiB0aGUgd29yZCwgUHl0aG9uIGlzIHF1aXRlIGNvbXBhY3QsIGJlY2F1c2UgdGhlIGxhbmd1YWdlIGhhcwotanVzdCBhIGZldyBpZGVhcywgd2hpY2ggYXJlIHVzZWQgaW4gbG90cyBvZiBwbGFjZXMuICBUYWtlIG5hbWVzcGFjZXMsIGZvcgotZXhhbXBsZS4gIEltcG9ydCBhIG1vZHVsZSB3aXRoIGBgaW1wb3J0IG1hdGhgYCwgYW5kIHlvdSBjcmVhdGUgYSBuZXcgbmFtZXNwYWNlCi1jYWxsZWQgYGBtYXRoYGAuICBDbGFzc2VzIGFyZSBhbHNvIG5hbWVzcGFjZXMgdGhhdCBzaGFyZSBtYW55IG9mIHRoZSBwcm9wZXJ0aWVzCi1vZiBtb2R1bGVzLCBhbmQgaGF2ZSBhIGZldyBvZiB0aGVpciBvd247IGZvciBleGFtcGxlLCB5b3UgY2FuIGNyZWF0ZSBpbnN0YW5jZXMKLW9mIGEgY2xhc3MuIEluc3RhbmNlcz8gIFRoZXkncmUgeWV0IGFub3RoZXIgbmFtZXNwYWNlLiAgTmFtZXNwYWNlcyBhcmUgY3VycmVudGx5Ci1pbXBsZW1lbnRlZCBhcyBQeXRob24gZGljdGlvbmFyaWVzLCBzbyB0aGV5IGhhdmUgdGhlIHNhbWUgbWV0aG9kcyBhcyB0aGUKLXN0YW5kYXJkIGRpY3Rpb25hcnkgZGF0YSB0eXBlOiAua2V5cygpIHJldHVybnMgYWxsIHRoZSBrZXlzLCBhbmQgc28gZm9ydGguCi0KLVRoaXMgc2ltcGxpY2l0eSBhcmlzZXMgZnJvbSBQeXRob24ncyBkZXZlbG9wbWVudCBoaXN0b3J5LiAgVGhlIGxhbmd1YWdlIHN5bnRheAotZGVyaXZlcyBmcm9tIGRpZmZlcmVudCBzb3VyY2VzOyBBQkMsIGEgcmVsYXRpdmVseSBvYnNjdXJlIHRlYWNoaW5nIGxhbmd1YWdlLCBpcwotb25lIHByaW1hcnkgaW5mbHVlbmNlLCBhbmQgTW9kdWxhLTMgaXMgYW5vdGhlci4gIChGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBBQkMKLWFuZCBNb2R1bGEtMywgY29uc3VsdCB0aGVpciByZXNwZWN0aXZlIFdlYiBzaXRlcyBhdCBodHRwOi8vd3d3LmN3aS5ubC9+c3RldmVuL2FiYy8KLWFuZCBodHRwOi8vd3d3Lm0zLm9yZy4pICBPdGhlciBmZWF0dXJlcyBoYXZlIGNvbWUgZnJvbSBDLCBJY29uLAotQWxnb2wtNjgsIGFuZCBldmVuIFBlcmwuICBQeXRob24gaGFzbid0IHJlYWxseSBpbm5vdmF0ZWQgdmVyeSBtdWNoLCBidXQgaW5zdGVhZAotaGFzIHRyaWVkIHRvIGtlZXAgdGhlIGxhbmd1YWdlIHNtYWxsIGFuZCBlYXN5IHRvIGxlYXJuLCBidWlsZGluZyBvbiBpZGVhcyB0aGF0Ci1oYXZlIGJlZW4gdHJpZWQgaW4gb3RoZXIgbGFuZ3VhZ2VzIGFuZCBmb3VuZCB1c2VmdWwuCi0KLVNpbXBsaWNpdHkgaXMgYSB2aXJ0dWUgdGhhdCBzaG91bGQgbm90IGJlIHVuZGVyZXN0aW1hdGVkLiAgSXQgbGV0cyB5b3UgbGVhcm4gdGhlCi1sYW5ndWFnZSBtb3JlIHF1aWNrbHksIGFuZCB0aGVuIHJhcGlkbHkgd3JpdGUgY29kZSAtLSBjb2RlIHRoYXQgb2Z0ZW4gd29ya3MgdGhlCi1maXJzdCB0aW1lIHlvdSBydW4gaXQuCi0KLQotSmF2YSBJbnRlZ3JhdGlvbgotLS0tLS0tLS0tLS0tLS0tLQotCi1JZiB5b3UncmUgd29ya2luZyB3aXRoIEphdmEsIEp5dGhvbiAoaHR0cDovL3d3dy5qeXRob24ub3JnLykgaXMgZGVmaW5pdGVseSB3b3J0aAoteW91ciBhdHRlbnRpb24uICBKeXRob24gaXMgYSByZS1pbXBsZW1lbnRhdGlvbiBvZiBQeXRob24gaW4gSmF2YSB0aGF0IGNvbXBpbGVzCi1QeXRob24gY29kZSBpbnRvIEphdmEgYnl0ZWNvZGVzLiAgVGhlIHJlc3VsdGluZyBlbnZpcm9ubWVudCBoYXMgdmVyeSB0aWdodCwKLWFsbW9zdCBzZWFtbGVzcywgaW50ZWdyYXRpb24gd2l0aCBKYXZhLiAgSXQncyB0cml2aWFsIHRvIGFjY2VzcyBKYXZhIGNsYXNzZXMKLWZyb20gUHl0aG9uLCBhbmQgeW91IGNhbiB3cml0ZSBQeXRob24gY2xhc3NlcyB0aGF0IHN1YmNsYXNzIEphdmEgY2xhc3Nlcy4KLUp5dGhvbiBjYW4gYmUgdXNlZCBmb3IgcHJvdG90eXBpbmcgSmF2YSBhcHBsaWNhdGlvbnMgaW4gbXVjaCB0aGUgc2FtZSB3YXkKLUNQeXRob24gaXMgdXNlZCwgYW5kIGl0IGNhbiBhbHNvIGJlIHVzZWQgZm9yIHRlc3Qgc3VpdGVzIGZvciBKYXZhIGNvZGUsIG9yCi1lbWJlZGRlZCBpbiBhIEphdmEgYXBwbGljYXRpb24gdG8gYWRkIHNjcmlwdGluZyBjYXBhYmlsaXRpZXMuCi0KLQotQXJndW1lbnRzIGFuZCBSZWJ1dHRhbHMKLT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUxldCdzIHNheSB0aGF0IHlvdSd2ZSBkZWNpZGVkIHVwb24gUHl0aG9uIGFzIHRoZSBiZXN0IGNob2ljZSBmb3IgeW91cgotYXBwbGljYXRpb24uICBIb3cgY2FuIHlvdSBjb252aW5jZSB5b3VyIG1hbmFnZW1lbnQsIG9yIHlvdXIgZmVsbG93IGRldmVsb3BlcnMsCi10byB1c2UgUHl0aG9uPyAgVGhpcyBzZWN0aW9uIGxpc3RzIHNvbWUgY29tbW9uIGFyZ3VtZW50cyBhZ2FpbnN0IHVzaW5nIFB5dGhvbiwKLWFuZCBwcm92aWRlcyBzb21lIHBvc3NpYmxlIHJlYnV0dGFscy4KLQotKipQeXRob24gaXMgZnJlZWx5IGF2YWlsYWJsZSBzb2Z0d2FyZSB0aGF0IGRvZXNuJ3QgY29zdCBhbnl0aGluZy4gSG93IGdvb2QgY2FuCi1pdCBiZT8qKgotCi1WZXJ5IGdvb2QsIGluZGVlZC4gIFRoZXNlIGRheXMgTGludXggYW5kIEFwYWNoZSwgdHdvIG90aGVyIHBpZWNlcyBvZiBvcGVuIHNvdXJjZQotc29mdHdhcmUsIGFyZSBiZWNvbWluZyBtb3JlIHJlc3BlY3RlZCBhcyBhbHRlcm5hdGl2ZXMgdG8gY29tbWVyY2lhbCBzb2Z0d2FyZSwKLWJ1dCBQeXRob24gaGFzbid0IGhhZCBhbGwgdGhlIHB1YmxpY2l0eS4KLQotUHl0aG9uIGhhcyBiZWVuIGFyb3VuZCBmb3Igc2V2ZXJhbCB5ZWFycywgd2l0aCBtYW55IHVzZXJzIGFuZCBkZXZlbG9wZXJzLgotQWNjb3JkaW5nbHksIHRoZSBpbnRlcnByZXRlciBoYXMgYmVlbiB1c2VkIGJ5IG1hbnkgcGVvcGxlLCBhbmQgaGFzIGdvdHRlbiBtb3N0Ci1vZiB0aGUgYnVncyBzaGFrZW4gb3V0IG9mIGl0LiAgV2hpbGUgYnVncyBhcmUgc3RpbGwgZGlzY292ZXJlZCBhdCBpbnRlcnZhbHMsCi10aGV5J3JlIHVzdWFsbHkgZWl0aGVyIHF1aXRlIG9ic2N1cmUgKHRoZXknZCBoYXZlIHRvIGJlLCBmb3Igbm8gb25lIHRvIGhhdmUgcnVuCi1pbnRvIHRoZW0gYmVmb3JlKSBvciB0aGV5IGludm9sdmUgaW50ZXJmYWNlcyB0byBleHRlcm5hbCBsaWJyYXJpZXMuICBUaGUKLWludGVybmFscyBvZiB0aGUgbGFuZ3VhZ2UgaXRzZWxmIGFyZSBxdWl0ZSBzdGFibGUuCi0KLUhhdmluZyB0aGUgc291cmNlIGNvZGUgc2hvdWxkIGJlIHZpZXdlZCBhcyBtYWtpbmcgdGhlIHNvZnR3YXJlIGF2YWlsYWJsZSBmb3IKLXBlZXIgcmV2aWV3OyBwZW9wbGUgY2FuIGV4YW1pbmUgdGhlIGNvZGUsIHN1Z2dlc3QgKGFuZCBpbXBsZW1lbnQpIGltcHJvdmVtZW50cywKLWFuZCB0cmFjayBkb3duIGJ1Z3MuICBUbyBmaW5kIG91dCBtb3JlIGFib3V0IHRoZSBpZGVhIG9mIG9wZW4gc291cmNlIGNvZGUsIGFsb25nCi13aXRoIGFyZ3VtZW50cyBhbmQgY2FzZSBzdHVkaWVzIHN1cHBvcnRpbmcgaXQsIGdvIHRvIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcuCi0KLSoqV2hvJ3MgZ29pbmcgdG8gc3VwcG9ydCBpdD8qKgotCi1QeXRob24gaGFzIGEgc2l6YWJsZSBjb21tdW5pdHkgb2YgZGV2ZWxvcGVycywgYW5kIHRoZSBudW1iZXIgaXMgc3RpbGwgZ3Jvd2luZy4KLVRoZSBJbnRlcm5ldCBjb21tdW5pdHkgc3Vycm91bmRpbmcgdGhlIGxhbmd1YWdlIGlzIGFuIGFjdGl2ZSBvbmUsIGFuZCBpcyB3b3J0aAotYmVpbmcgY29uc2lkZXJlZCBhbm90aGVyIG9uZSBvZiBQeXRob24ncyBhZHZhbnRhZ2VzLiBNb3N0IHF1ZXN0aW9ucyBwb3N0ZWQgdG8KLXRoZSBjb21wLmxhbmcucHl0aG9uIG5ld3Nncm91cCBhcmUgcXVpY2tseSBhbnN3ZXJlZCBieSBzb21lb25lLgotCi1TaG91bGQgeW91IG5lZWQgdG8gZGlnIGludG8gdGhlIHNvdXJjZSBjb2RlLCB5b3UnbGwgZmluZCBpdCdzIGNsZWFyIGFuZAotd2VsbC1vcmdhbml6ZWQsIHNvIGl0J3Mgbm90IHZlcnkgZGlmZmljdWx0IHRvIHdyaXRlIGV4dGVuc2lvbnMgYW5kIHRyYWNrIGRvd24KLWJ1Z3MgeW91cnNlbGYuICBJZiB5b3UnZCBwcmVmZXIgdG8gcGF5IGZvciBzdXBwb3J0LCB0aGVyZSBhcmUgY29tcGFuaWVzIGFuZAotaW5kaXZpZHVhbHMgd2hvIG9mZmVyIGNvbW1lcmNpYWwgc3VwcG9ydCBmb3IgUHl0aG9uLgotCi0qKldobyB1c2VzIFB5dGhvbiBmb3Igc2VyaW91cyB3b3JrPyoqCi0KLUxvdHMgb2YgcGVvcGxlOyBvbmUgaW50ZXJlc3RpbmcgdGhpbmcgYWJvdXQgUHl0aG9uIGlzIHRoZSBzdXJwcmlzaW5nIGRpdmVyc2l0eQotb2YgYXBwbGljYXRpb25zIHRoYXQgaXQncyBiZWVuIHVzZWQgZm9yLiAgUGVvcGxlIGFyZSB1c2luZyBQeXRob24gdG86Ci0KLSogUnVuIFdlYiBzaXRlcwotCi0qIFdyaXRlIEdVSSBpbnRlcmZhY2VzCi0KLSogQ29udHJvbCBudW1iZXItY3J1bmNoaW5nIGNvZGUgb24gc3VwZXJjb21wdXRlcnMKLQotKiBNYWtlIGEgY29tbWVyY2lhbCBhcHBsaWNhdGlvbiBzY3JpcHRhYmxlIGJ5IGVtYmVkZGluZyB0aGUgUHl0aG9uIGludGVycHJldGVyCi0gIGluc2lkZSBpdAotCi0qIFByb2Nlc3MgbGFyZ2UgWE1MIGRhdGEgc2V0cwotCi0qIEJ1aWxkIHRlc3Qgc3VpdGVzIGZvciBDIG9yIEphdmEgY29kZQotCi1XaGF0ZXZlciB5b3VyIGFwcGxpY2F0aW9uIGRvbWFpbiBpcywgdGhlcmUncyBwcm9iYWJseSBzb21lb25lIHdobydzIHVzZWQgUHl0aG9uCi1mb3Igc29tZXRoaW5nIHNpbWlsYXIuICBZZXQsIGRlc3BpdGUgYmVpbmcgdXNlYWJsZSBmb3Igc3VjaCBoaWdoLWVuZAotYXBwbGljYXRpb25zLCBQeXRob24ncyBzdGlsbCBzaW1wbGUgZW5vdWdoIHRvIHVzZSBmb3IgbGl0dGxlIGpvYnMuCi0KLVNlZSBodHRwOi8vd2lraS5weXRob24ub3JnL21vaW4vT3JnYW5pemF0aW9uc1VzaW5nUHl0aG9uIGZvciBhIGxpc3Qgb2Ygc29tZSBvZgotdGhlICBvcmdhbml6YXRpb25zIHRoYXQgdXNlIFB5dGhvbi4KLQotKipXaGF0IGFyZSB0aGUgcmVzdHJpY3Rpb25zIG9uIFB5dGhvbidzIHVzZT8qKgotCi1UaGV5J3JlIHByYWN0aWNhbGx5IG5vbmV4aXN0ZW50LiAgQ29uc3VsdCB0aGUgOmZpbGU6YE1pc2MvQ09QWVJJR0hUYCBmaWxlIGluIHRoZQotc291cmNlIGRpc3RyaWJ1dGlvbiwgb3IgdGhlIHNlY3Rpb24gOnJlZjpgaGlzdG9yeS1hbmQtbGljZW5zZWAgZm9yIHRoZSBmdWxsCi1sYW5ndWFnZSwgYnV0IGl0IGJvaWxzIGRvd24gdG8gdGhyZWUgY29uZGl0aW9uczoKLQotKiBZb3UgaGF2ZSB0byBsZWF2ZSB0aGUgY29weXJpZ2h0IG5vdGljZSBvbiB0aGUgc29mdHdhcmU7IGlmIHlvdSBkb24ndCBpbmNsdWRlCi0gIHRoZSBzb3VyY2UgY29kZSBpbiBhIHByb2R1Y3QsIHlvdSBoYXZlIHRvIHB1dCB0aGUgY29weXJpZ2h0IG5vdGljZSBpbiB0aGUKLSAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLgotCi0qIERvbid0IGNsYWltIHRoYXQgdGhlIGluc3RpdHV0aW9ucyB0aGF0IGhhdmUgZGV2ZWxvcGVkIFB5dGhvbiBlbmRvcnNlIHlvdXIKLSAgcHJvZHVjdCBpbiBhbnkgd2F5LgotCi0qIElmIHNvbWV0aGluZyBnb2VzIHdyb25nLCB5b3UgY2FuJ3Qgc3VlIGZvciBkYW1hZ2VzLiAgUHJhY3RpY2FsbHkgYWxsIHNvZnR3YXJlCi0gIGxpY2Vuc2VzIGNvbnRhaW4gdGhpcyBjb25kaXRpb24uCi0KLU5vdGljZSB0aGF0IHlvdSBkb24ndCBoYXZlIHRvIHByb3ZpZGUgc291cmNlIGNvZGUgZm9yIGFueXRoaW5nIHRoYXQgY29udGFpbnMKLVB5dGhvbiBvciBpcyBidWlsdCB3aXRoIGl0LiAgQWxzbywgdGhlIFB5dGhvbiBpbnRlcnByZXRlciBhbmQgYWNjb21wYW55aW5nCi1kb2N1bWVudGF0aW9uIGNhbiBiZSBtb2RpZmllZCBhbmQgcmVkaXN0cmlidXRlZCBpbiBhbnkgd2F5IHlvdSBsaWtlLCBhbmQgeW91Ci1kb24ndCBoYXZlIHRvIHBheSBhbnlvbmUgYW55IGxpY2Vuc2luZyBmZWVzIGF0IGFsbC4KLQotKipXaHkgc2hvdWxkIHdlIHVzZSBhbiBvYnNjdXJlIGxhbmd1YWdlIGxpa2UgUHl0aG9uIGluc3RlYWQgb2Ygd2VsbC1rbm93bgotbGFuZ3VhZ2UgWD8qKgotCi1JIGhvcGUgdGhpcyBIT1dUTywgYW5kIHRoZSBkb2N1bWVudHMgbGlzdGVkIGluIHRoZSBmaW5hbCBzZWN0aW9uLCB3aWxsIGhlbHAKLWNvbnZpbmNlIHlvdSB0aGF0IFB5dGhvbiBpc24ndCBvYnNjdXJlLCBhbmQgaGFzIGEgaGVhbHRoaWx5IGdyb3dpbmcgdXNlciBiYXNlLgotT25lIHdvcmQgb2YgYWR2aWNlOiBhbHdheXMgcHJlc2VudCBQeXRob24ncyBwb3NpdGl2ZSBhZHZhbnRhZ2VzLCBpbnN0ZWFkIG9mCi1jb25jZW50cmF0aW5nIG9uIGxhbmd1YWdlIFgncyBmYWlsaW5ncy4gIFBlb3BsZSB3YW50IHRvIGtub3cgd2h5IGEgc29sdXRpb24gaXMKLWdvb2QsIHJhdGhlciB0aGFuIHdoeSBhbGwgdGhlIG90aGVyIHNvbHV0aW9ucyBhcmUgYmFkLiAgU28gaW5zdGVhZCBvZiBhdHRhY2tpbmcKLWEgY29tcGV0aW5nIHNvbHV0aW9uIG9uIHZhcmlvdXMgZ3JvdW5kcywgc2ltcGx5IHNob3cgaG93IFB5dGhvbidzIHZpcnR1ZXMgY2FuCi1oZWxwLgotCi0KLVVzZWZ1bCBSZXNvdXJjZXMKLT09PT09PT09PT09PT09PT0KLQotaHR0cDovL3d3dy5weXRob25vbG9neS5jb20vc3VjY2VzcwotICAgVGhlIFB5dGhvbiBTdWNjZXNzIFN0b3JpZXMgYXJlIGEgY29sbGVjdGlvbiBvZiBzdG9yaWVzIGZyb20gc3VjY2Vzc2Z1bCB1c2VycyBvZgotICAgUHl0aG9uLCB3aXRoIHRoZSBlbXBoYXNpcyBvbiBidXNpbmVzcyBhbmQgY29ycG9yYXRlIHVzZXJzLgotCi0uLiBodHRwOi8vd3d3LmZzYmFzc29jaWF0ZXMuY29tL2Jvb2tzL3B5dGhvbmNocHQxLmh0bQotICAgVGhlIGZpcnN0IGNoYXB0ZXIgb2YgXGVtcGh7SW50ZXJuZXQgUHJvZ3JhbW1pbmcgd2l0aCBQeXRob259IGFsc28KLSAgIGV4YW1pbmVzIHNvbWUgb2YgdGhlIHJlYXNvbnMgZm9yIHVzaW5nIFB5dGhvbi4gIFRoZSBib29rIGlzIHdlbGwgd29ydGgKLSAgIGJ1eWluZywgYnV0IHRoZSBwdWJsaXNoZXJzIGhhdmUgbWFkZSB0aGUgZmlyc3QgY2hhcHRlciBhdmFpbGFibGUgb24KLSAgIHRoZSBXZWIuCi0KLWh0dHA6Ly93d3cudGNsLnRrL2RvYy9zY3JpcHRpbmcuaHRtbAotICAgSm9obiBPdXN0ZXJob3V0J3Mgd2hpdGUgcGFwZXIgb24gc2NyaXB0aW5nIGlzIGEgZ29vZCBhcmd1bWVudCBmb3IgdGhlIHV0aWxpdHkgb2YKLSAgIHNjcmlwdGluZyBsYW5ndWFnZXMsIHRob3VnaCBuYXR1cmFsbHkgZW5vdWdoLCBoZSBlbXBoYXNpemVzIFRjbCwgdGhlIGxhbmd1YWdlIGhlCi0gICBkZXZlbG9wZWQuICBNb3N0IG9mIHRoZSBhcmd1bWVudHMgd291bGQgYXBwbHkgdG8gYW55IHNjcmlwdGluZyBsYW5ndWFnZS4KLQotaHR0cDovL3d3dy5weXRob24ub3JnL3dvcmtzaG9wcy8xOTk3LTEwL3Byb2NlZWRpbmdzL2JlYXpsZXkuaHRtbAotICAgVGhlIGF1dGhvcnMsIERhdmlkIE0uIEJlYXpsZXkgYW5kIFBldGVyIFMuIExvbWRhaGwsICBkZXNjcmliZSB0aGVpciB1c2Ugb2YKLSAgIFB5dGhvbiBhdCBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkuIEl0J3MgYW5vdGhlciBnb29kIGV4YW1wbGUgb2YgaG93Ci0gICBQeXRob24gY2FuIGhlbHAgZ2V0IHJlYWwgd29yayBkb25lLiBUaGlzIHF1b3RhdGlvbiBmcm9tIHRoZSBwYXBlciBoYXMgYmVlbgotICAgZWNob2VkIGJ5IG1hbnkgcGVvcGxlOgotCi0gICAuLiBlcGlncmFwaDo6Ci0KLSAgICAgIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFzIGEgbGFyZ2UgbW9ub2xpdGhpYyBhcHBsaWNhdGlvbiBmb3IgbWFzc2l2ZWx5IHBhcmFsbGVsCi0gICAgICBwcm9jZXNzaW5nIHN5c3RlbXMsIHdlIGhhdmUgdXNlZCBQeXRob24gdG8gdHJhbnNmb3JtIG91ciBhcHBsaWNhdGlvbiBpbnRvIGEKLSAgICAgIGZsZXhpYmxlLCBoaWdobHkgbW9kdWxhciwgYW5kIGV4dHJlbWVseSBwb3dlcmZ1bCBzeXN0ZW0gZm9yIHBlcmZvcm1pbmcKLSAgICAgIHNpbXVsYXRpb24sIGRhdGEgYW5hbHlzaXMsIGFuZCB2aXN1YWxpemF0aW9uLiBJbiBhZGRpdGlvbiwgd2UgZGVzY3JpYmUgaG93Ci0gICAgICBQeXRob24gaGFzIHNvbHZlZCBhIG51bWJlciBvZiBpbXBvcnRhbnQgcHJvYmxlbXMgcmVsYXRlZCB0byB0aGUgZGV2ZWxvcG1lbnQsCi0gICAgICBkZWJ1Z2dpbmcsIGRlcGxveW1lbnQsIGFuZCBtYWludGVuYW5jZSBvZiBzY2llbnRpZmljIHNvZnR3YXJlLgotCi1odHRwOi8vcHl0aG9uam91cm5hbC5jb2duaXpvci5jb20vcHlqMS9FdmVyaXR0LUZlaXRfaW50ZXJ2aWV3OTgtVjEuaHRtbAotICAgVGhpcyBpbnRlcnZpZXcgd2l0aCBBbmR5IEZlaXQsIGRpc2N1c3NpbmcgSW5mb3NlZWsncyB1c2Ugb2YgUHl0aG9uLCBjYW4gYmUgdXNlZAotICAgdG8gc2hvdyB0aGF0IGNob29zaW5nIFB5dGhvbiBkaWRuJ3QgaW50cm9kdWNlIGFueSBkaWZmaWN1bHRpZXMgaW50byBhIGNvbXBhbnkncwotICAgZGV2ZWxvcG1lbnQgcHJvY2VzcywgYW5kIHByb3ZpZGVkIHNvbWUgc3Vic3RhbnRpYWwgYmVuZWZpdHMuCi0KLS4uIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9wc2EvQ29tbWVyY2lhbC5odG1sCi0gICBSb2JpbiBGcmllZHJpY2ggd3JvdGUgdGhpcyBkb2N1bWVudCBvbiBob3cgdG8gc3VwcG9ydCBQeXRob24ncyB1c2UgaW4KLSAgIGNvbW1lcmNpYWwgcHJvamVjdHMuCi0KLWh0dHA6Ly93d3cucHl0aG9uLm9yZy93b3Jrc2hvcHMvMTk5Ny0xMC9wcm9jZWVkaW5ncy9zdGVpbi5wcwotICAgRm9yIHRoZSA2dGggUHl0aG9uIGNvbmZlcmVuY2UsIEdyZWcgU3RlaW4gcHJlc2VudGVkIGEgcGFwZXIgdGhhdCB0cmFjZWQgUHl0aG9uJ3MKLSAgIGFkb3B0aW9uIGFuZCB1c2FnZSBhdCBhIHN0YXJ0dXAgY2FsbGVkIGVTaG9wLCBhbmQgbGF0ZXIgYXQgTWljcm9zb2Z0LgotCi1odHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnCi0gICBNYW5hZ2VtZW50IG1heSBiZSBkb3VidGZ1bCBvZiB0aGUgcmVsaWFiaWxpdHkgYW5kIHVzZWZ1bG5lc3Mgb2Ygc29mdHdhcmUgdGhhdAotICAgd2Fzbid0IHdyaXR0ZW4gY29tbWVyY2lhbGx5LiAgVGhpcyBzaXRlIHByZXNlbnRzIGFyZ3VtZW50cyB0aGF0IHNob3cgaG93IG9wZW4KLSAgIHNvdXJjZSBzb2Z0d2FyZSBjYW4gaGF2ZSBjb25zaWRlcmFibGUgYWR2YW50YWdlcyBvdmVyIGNsb3NlZC1zb3VyY2Ugc29mdHdhcmUuCi0KLWh0dHA6Ly93d3cuZmFxcy5vcmcvZG9jcy9MaW51eC1taW5pL0Fkdm9jYWN5Lmh0bWwKLSAgIFRoZSBMaW51eCBBZHZvY2FjeSBtaW5pLUhPV1RPIHdhcyB0aGUgaW5zcGlyYXRpb24gZm9yIHRoaXMgZG9jdW1lbnQsIGFuZCBpcyBhbHNvCi0gICB3ZWxsIHdvcnRoIHJlYWRpbmcgZm9yIGdlbmVyYWwgc3VnZ2VzdGlvbnMgb24gd2lubmluZyBhY2NlcHRhbmNlIGZvciBhIG5ldwotICAgdGVjaG5vbG9neSwgc3VjaCBhcyBMaW51eCBvciBQeXRob24uICBJbiBnZW5lcmFsLCB5b3Ugd29uJ3QgbWFrZSBtdWNoIHByb2dyZXNzCi0gICBieSBzaW1wbHkgYXR0YWNraW5nIGV4aXN0aW5nIHN5c3RlbXMgYW5kIGNvbXBsYWluaW5nIGFib3V0IHRoZWlyIGluYWRlcXVhY2llczsKLSAgIHRoaXMgb2Z0ZW4gZW5kcyB1cCBsb29raW5nIGxpa2UgdW5mb2N1c2VkIHdoaW5pbmcuICBJdCdzIG11Y2ggYmV0dGVyIHRvIHBvaW50Ci0gICBvdXQgc29tZSBvZiB0aGUgbWFueSBhcmVhcyB3aGVyZSBQeXRob24gaXMgYW4gaW1wcm92ZW1lbnQgb3ZlciBvdGhlciBzeXN0ZW1zLgotCmRpZmYgLS1naXQgYS9Eb2MvaG93dG8vYXJncGFyc2UucnN0IGIvRG9jL2hvd3RvL2FyZ3BhcnNlLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTEwYTU1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jL2hvd3RvL2FyZ3BhcnNlLnJzdApAQCAtMCwwICsxLDc2NCBAQAorKioqKioqKioqKioqKioqKioKK0FyZ3BhcnNlIFR1dG9yaWFsCisqKioqKioqKioqKioqKioqKgorCis6YXV0aG9yOiBUc2hlcGFuZyBMZWtob25raG9iZQorCisuLiBfYXJncGFyc2UtdHV0b3JpYWw6CisKK1RoaXMgdHV0b3JpYWwgaXMgaW50ZW5kZWQgdG8gYmUgYSBnZW50bGUgaW50cm9kdWN0aW9uIHRvIDptb2Q6YGFyZ3BhcnNlYCwgdGhlCityZWNvbW1lbmRlZCBjb21tYW5kLWxpbmUgcGFyc2luZyBtb2R1bGUgaW4gdGhlIFB5dGhvbiBzdGFuZGFyZCBsaWJyYXJ5LgorCisuLiBub3RlOjoKKworICAgVGhlcmUgYXJlIHR3byBvdGhlciBtb2R1bGVzIHRoYXQgZnVsZmlsbCB0aGUgc2FtZSB0YXNrLCBuYW1lbHkKKyAgIDptb2Q6YGdldG9wdGAgKGFuIGVxdWl2YWxlbnQgZm9yIDpjOmZ1bmM6YGdldG9wdGAgZnJvbSB0aGUgQworICAgbGFuZ3VhZ2UpIGFuZCB0aGUgZGVwcmVjYXRlZCA6bW9kOmBvcHRwYXJzZWAuCisgICBOb3RlIGFsc28gdGhhdCA6bW9kOmBhcmdwYXJzZWAgaXMgYmFzZWQgb24gOm1vZDpgb3B0cGFyc2VgLAorICAgYW5kIHRoZXJlZm9yZSB2ZXJ5IHNpbWlsYXIgaW4gdGVybXMgb2YgdXNhZ2UuCisKKworQ29uY2VwdHMKKz09PT09PT09CisKK0xldCdzIHNob3cgdGhlIHNvcnQgb2YgZnVuY3Rpb25hbGl0eSB0aGF0IHdlIGFyZSBnb2luZyB0byBleHBsb3JlIGluIHRoaXMKK2ludHJvZHVjdG9yeSB0dXRvcmlhbCBieSBtYWtpbmcgdXNlIG9mIHRoZSA6Y29tbWFuZDpgbHNgIGNvbW1hbmQ6CisKKy4uIGNvZGUtYmxvY2s6OiBzaAorCisgICAkIGxzCisgICBjcHl0aG9uICBkZXZndWlkZSAgcHJvZy5weSAgcHlweSAgcm0tdW51c2VkLWZ1bmN0aW9uLnBhdGNoCisgICAkIGxzIHB5cHkKKyAgIGN0eXBlc19jb25maWd1cmUgIGRlbW8gIGRvdHZpZXdlciAgaW5jbHVkZSAgbGliX3B5cHkgIGxpYi1weXRob24gLi4uCisgICAkIGxzIC1sCisgICB0b3RhbCAyMAorICAgZHJ3eHIteHIteCAxOSB3ZW5hIHdlbmEgNDA5NiBGZWIgMTggMTg6NTEgY3B5dGhvbgorICAgZHJ3eHIteHIteCAgNCB3ZW5hIHdlbmEgNDA5NiBGZWIgIDggMTI6MDQgZGV2Z3VpZGUKKyAgIC1yd3hyLXhyLXggIDEgd2VuYSB3ZW5hICA1MzUgRmViIDE5IDAwOjA1IHByb2cucHkKKyAgIGRyd3hyLXhyLXggMTQgd2VuYSB3ZW5hIDQwOTYgRmViICA3IDAwOjU5IHB5cHkKKyAgIC1ydy1yLS1yLS0gIDEgd2VuYSB3ZW5hICA3NDEgRmViIDE4IDAxOjAxIHJtLXVudXNlZC1mdW5jdGlvbi5wYXRjaAorICAgJCBscyAtLWhlbHAKKyAgIFVzYWdlOiBscyBbT1BUSU9OXS4uLiBbRklMRV0uLi4KKyAgIExpc3QgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEZJTEVzICh0aGUgY3VycmVudCBkaXJlY3RvcnkgYnkgZGVmYXVsdCkuCisgICBTb3J0IGVudHJpZXMgYWxwaGFiZXRpY2FsbHkgaWYgbm9uZSBvZiAtY2Z0dXZTVVggbm9yIC0tc29ydCBpcyBzcGVjaWZpZWQuCisgICAuLi4KKworQSBmZXcgY29uY2VwdHMgd2UgY2FuIGxlYXJuIGZyb20gdGhlIGZvdXIgY29tbWFuZHM6CisKKyogVGhlIDpjb21tYW5kOmBsc2AgY29tbWFuZCBpcyB1c2VmdWwgd2hlbiBydW4gd2l0aG91dCBhbnkgb3B0aW9ucyBhdCBhbGwuIEl0IGRlZmF1bHRzCisgIHRvIGRpc3BsYXlpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKworKiBJZiB3ZSB3YW50IGJleW9uZCB3aGF0IGl0IHByb3ZpZGVzIGJ5IGRlZmF1bHQsIHdlIHRlbGwgaXQgYSBiaXQgbW9yZS4gSW4KKyAgdGhpcyBjYXNlLCB3ZSB3YW50IGl0IHRvIGRpc3BsYXkgYSBkaWZmZXJlbnQgZGlyZWN0b3J5LCBgYHB5cHlgYC4KKyAgV2hhdCB3ZSBkaWQgaXMgc3BlY2lmeSB3aGF0IGlzIGtub3duIGFzIGEgcG9zaXRpb25hbCBhcmd1bWVudC4gSXQncyBuYW1lZCBzbworICBiZWNhdXNlIHRoZSBwcm9ncmFtIHNob3VsZCBrbm93IHdoYXQgdG8gZG8gd2l0aCB0aGUgdmFsdWUsIHNvbGVseSBiYXNlZCBvbgorICB3aGVyZSBpdCBhcHBlYXJzIG9uIHRoZSBjb21tYW5kIGxpbmUuIFRoaXMgY29uY2VwdCBpcyBtb3JlIHJlbGV2YW50CisgIHRvIGEgY29tbWFuZCBsaWtlIDpjb21tYW5kOmBjcGAsIHdob3NlIG1vc3QgYmFzaWMgdXNhZ2UgaXMgYGBjcCBTUkMgREVTVGBgLgorICBUaGUgZmlyc3QgcG9zaXRpb24gaXMgKndoYXQgeW91IHdhbnQgY29waWVkLCogYW5kIHRoZSBzZWNvbmQKKyAgcG9zaXRpb24gaXMgKndoZXJlIHlvdSB3YW50IGl0IGNvcGllZCB0byouCisKKyogTm93LCBzYXkgd2Ugd2FudCB0byBjaGFuZ2UgYmVoYXZpb3VyIG9mIHRoZSBwcm9ncmFtLiBJbiBvdXIgZXhhbXBsZSwKKyAgd2UgZGlzcGxheSBtb3JlIGluZm8gZm9yIGVhY2ggZmlsZSBpbnN0ZWFkIG9mIGp1c3Qgc2hvd2luZyB0aGUgZmlsZSBuYW1lcy4KKyAgVGhlIGBgLWxgYCBpbiB0aGF0IGNhc2UgaXMga25vd24gYXMgYW4gb3B0aW9uYWwgYXJndW1lbnQuCisKKyogVGhhdCdzIGEgc25pcHBldCBvZiB0aGUgaGVscCB0ZXh0LiBJdCdzIHZlcnkgdXNlZnVsIGluIHRoYXQgeW91IGNhbgorICBjb21lIGFjcm9zcyBhIHByb2dyYW0geW91IGhhdmUgbmV2ZXIgdXNlZCBiZWZvcmUsIGFuZCBjYW4gZmlndXJlIG91dAorICBob3cgaXQgd29ya3Mgc2ltcGx5IGJ5IHJlYWRpbmcgaXRzIGhlbHAgdGV4dC4KKworCitUaGUgYmFzaWNzCis9PT09PT09PT09CisKK0xldCB1cyBzdGFydCB3aXRoIGEgdmVyeSBzaW1wbGUgZXhhbXBsZSB3aGljaCBkb2VzIChhbG1vc3QpIG5vdGhpbmc6OgorCisgICBpbXBvcnQgYXJncGFyc2UKKyAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgIHBhcnNlci5wYXJzZV9hcmdzKCkKKworRm9sbG93aW5nIGlzIGEgcmVzdWx0IG9mIHJ1bm5pbmcgdGhlIGNvZGU6CisKKy4uIGNvZGUtYmxvY2s6OiBzaAorCisgICAkIHB5dGhvbiBwcm9nLnB5CisgICAkIHB5dGhvbiBwcm9nLnB5IC0taGVscAorICAgdXNhZ2U6IHByb2cucHkgWy1oXQorCisgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICQgcHl0aG9uIHByb2cucHkgLS12ZXJib3NlCisgICB1c2FnZTogcHJvZy5weSBbLWhdCisgICBwcm9nLnB5OiBlcnJvcjogdW5yZWNvZ25pemVkIGFyZ3VtZW50czogLS12ZXJib3NlCisgICAkIHB5dGhvbiBwcm9nLnB5IGZvbworICAgdXNhZ2U6IHByb2cucHkgWy1oXQorICAgcHJvZy5weTogZXJyb3I6IHVucmVjb2duaXplZCBhcmd1bWVudHM6IGZvbworCitIZXJlIGlzIHdoYXQgaXMgaGFwcGVuaW5nOgorCisqIFJ1bm5pbmcgdGhlIHNjcmlwdCB3aXRob3V0IGFueSBvcHRpb25zIHJlc3VsdHMgaW4gbm90aGluZyBkaXNwbGF5ZWQgdG8KKyAgc3Rkb3V0LiBOb3Qgc28gdXNlZnVsLgorCisqIFRoZSBzZWNvbmQgb25lIHN0YXJ0cyB0byBkaXNwbGF5IHRoZSB1c2VmdWxuZXNzIG9mIHRoZSA6bW9kOmBhcmdwYXJzZWAKKyAgbW9kdWxlLiBXZSBoYXZlIGRvbmUgYWxtb3N0IG5vdGhpbmcsIGJ1dCBhbHJlYWR5IHdlIGdldCBhIG5pY2UgaGVscCBtZXNzYWdlLgorCisqIFRoZSBgYC0taGVscGBgIG9wdGlvbiwgd2hpY2ggY2FuIGFsc28gYmUgc2hvcnRlbmVkIHRvIGBgLWhgYCwgaXMgdGhlIG9ubHkKKyAgb3B0aW9uIHdlIGdldCBmb3IgZnJlZSAoaS5lLiBubyBuZWVkIHRvIHNwZWNpZnkgaXQpLiBTcGVjaWZ5aW5nIGFueXRoaW5nCisgIGVsc2UgcmVzdWx0cyBpbiBhbiBlcnJvci4gQnV0IGV2ZW4gdGhlbiwgd2UgZG8gZ2V0IGEgdXNlZnVsIHVzYWdlIG1lc3NhZ2UsCisgIGFsc28gZm9yIGZyZWUuCisKKworSW50cm9kdWNpbmcgUG9zaXRpb25hbCBhcmd1bWVudHMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0FuIGV4YW1wbGU6OgorCisgICBpbXBvcnQgYXJncGFyc2UKKyAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgIHBhcnNlci5hZGRfYXJndW1lbnQoImVjaG8iKQorICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKyAgIHByaW50IGFyZ3MuZWNobworCitBbmQgcnVubmluZyB0aGUgY29kZToKKworLi4gY29kZS1ibG9jazo6IHNoCisKKyAgICQgcHl0aG9uIHByb2cucHkKKyAgIHVzYWdlOiBwcm9nLnB5IFstaF0gZWNobworICAgcHJvZy5weTogZXJyb3I6IHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzIGFyZSByZXF1aXJlZDogZWNobworICAgJCBweXRob24gcHJvZy5weSAtLWhlbHAKKyAgIHVzYWdlOiBwcm9nLnB5IFstaF0gZWNobworCisgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgZWNobworCisgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICQgcHl0aG9uIHByb2cucHkgZm9vCisgICBmb28KKworSGVyZSBpcyB3aGF0J3MgaGFwcGVuaW5nOgorCisqIFdlJ3ZlIGFkZGVkIHRoZSA6bWV0aDpgYWRkX2FyZ3VtZW50YCBtZXRob2QsIHdoaWNoIGlzIHdoYXQgd2UgdXNlIHRvIHNwZWNpZnkKKyAgd2hpY2ggY29tbWFuZC1saW5lIG9wdGlvbnMgdGhlIHByb2dyYW0gaXMgd2lsbGluZyB0byBhY2NlcHQuIEluIHRoaXMgY2FzZSwKKyAgSSd2ZSBuYW1lZCBpdCBgYGVjaG9gYCBzbyB0aGF0IGl0J3MgaW4gbGluZSB3aXRoIGl0cyBmdW5jdGlvbi4KKworKiBDYWxsaW5nIG91ciBwcm9ncmFtIG5vdyByZXF1aXJlcyB1cyB0byBzcGVjaWZ5IGFuIG9wdGlvbi4KKworKiBUaGUgOm1ldGg6YHBhcnNlX2FyZ3NgIG1ldGhvZCBhY3R1YWxseSByZXR1cm5zIHNvbWUgZGF0YSBmcm9tIHRoZQorICBvcHRpb25zIHNwZWNpZmllZCwgaW4gdGhpcyBjYXNlLCBgYGVjaG9gYC4KKworKiBUaGUgdmFyaWFibGUgaXMgc29tZSBmb3JtIG9mICdtYWdpYycgdGhhdCA6bW9kOmBhcmdwYXJzZWAgcGVyZm9ybXMgZm9yIGZyZWUKKyAgKGkuZS4gbm8gbmVlZCB0byBzcGVjaWZ5IHdoaWNoIHZhcmlhYmxlIHRoYXQgdmFsdWUgaXMgc3RvcmVkIGluKS4KKyAgWW91IHdpbGwgYWxzbyBub3RpY2UgdGhhdCBpdHMgbmFtZSBtYXRjaGVzIHRoZSBzdHJpbmcgYXJndW1lbnQgZ2l2ZW4KKyAgdG8gdGhlIG1ldGhvZCwgYGBlY2hvYGAuCisKK05vdGUgaG93ZXZlciB0aGF0LCBhbHRob3VnaCB0aGUgaGVscCBkaXNwbGF5IGxvb2tzIG5pY2UgYW5kIGFsbCwgaXQgY3VycmVudGx5CitpcyBub3QgYXMgaGVscGZ1bCBhcyBpdCBjYW4gYmUuIEZvciBleGFtcGxlIHdlIHNlZSB0aGF0IHdlIGdvdCBgYGVjaG9gYCBhcyBhCitwb3NpdGlvbmFsIGFyZ3VtZW50LCBidXQgd2UgZG9uJ3Qga25vdyB3aGF0IGl0IGRvZXMsIG90aGVyIHRoYW4gYnkgZ3Vlc3Npbmcgb3IKK2J5IHJlYWRpbmcgdGhlIHNvdXJjZSBjb2RlLiBTbywgbGV0J3MgbWFrZSBpdCBhIGJpdCBtb3JlIHVzZWZ1bDo6CisKKyAgIGltcG9ydCBhcmdwYXJzZQorICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiZWNobyIsIGhlbHA9ImVjaG8gdGhlIHN0cmluZyB5b3UgdXNlIGhlcmUiKQorICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKyAgIHByaW50IGFyZ3MuZWNobworCitBbmQgd2UgZ2V0OgorCisuLiBjb2RlLWJsb2NrOjogc2gKKworICAgJCBweXRob24gcHJvZy5weSAtaAorICAgdXNhZ2U6IHByb2cucHkgWy1oXSBlY2hvCisKKyAgIHBvc2l0aW9uYWwgYXJndW1lbnRzOgorICAgICBlY2hvICAgICAgICBlY2hvIHRoZSBzdHJpbmcgeW91IHVzZSBoZXJlCisKKyAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgLWgsIC0taGVscCAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorCitOb3csIGhvdyBhYm91dCBkb2luZyBzb21ldGhpbmcgZXZlbiBtb3JlIHVzZWZ1bDo6CisKKyAgIGltcG9ydCBhcmdwYXJzZQorICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgcGFyc2VyLmFkZF9hcmd1bWVudCgic3F1YXJlIiwgaGVscD0iZGlzcGxheSBhIHNxdWFyZSBvZiBhIGdpdmVuIG51bWJlciIpCisgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorICAgcHJpbnQgYXJncy5zcXVhcmUqKjIKKworRm9sbG93aW5nIGlzIGEgcmVzdWx0IG9mIHJ1bm5pbmcgdGhlIGNvZGU6CisKKy4uIGNvZGUtYmxvY2s6OiBzaAorCisgICAkIHB5dGhvbiBwcm9nLnB5IDQKKyAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgRmlsZSAicHJvZy5weSIsIGxpbmUgNSwgaW4gPG1vZHVsZT4KKyAgICAgICBwcmludCBhcmdzLnNxdWFyZSoqMgorICAgVHlwZUVycm9yOiB1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yICoqIG9yIHBvdygpOiAnc3RyJyBhbmQgJ2ludCcKKworVGhhdCBkaWRuJ3QgZ28gc28gd2VsbC4gVGhhdCdzIGJlY2F1c2UgOm1vZDpgYXJncGFyc2VgIHRyZWF0cyB0aGUgb3B0aW9ucyB3ZQorZ2l2ZSBpdCBhcyBzdHJpbmdzLCB1bmxlc3Mgd2UgdGVsbCBpdCBvdGhlcndpc2UuIFNvLCBsZXQncyB0ZWxsCis6bW9kOmBhcmdwYXJzZWAgdG8gdHJlYXQgdGhhdCBpbnB1dCBhcyBhbiBpbnRlZ2VyOjoKKworICAgaW1wb3J0IGFyZ3BhcnNlCisgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCJzcXVhcmUiLCBoZWxwPSJkaXNwbGF5IGEgc3F1YXJlIG9mIGEgZ2l2ZW4gbnVtYmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1pbnQpCisgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorICAgcHJpbnQgYXJncy5zcXVhcmUqKjIKKworRm9sbG93aW5nIGlzIGEgcmVzdWx0IG9mIHJ1bm5pbmcgdGhlIGNvZGU6CisKKy4uIGNvZGUtYmxvY2s6OiBzaAorCisgICAkIHB5dGhvbiBwcm9nLnB5IDQKKyAgIDE2CisgICAkIHB5dGhvbiBwcm9nLnB5IGZvdXIKKyAgIHVzYWdlOiBwcm9nLnB5IFstaF0gc3F1YXJlCisgICBwcm9nLnB5OiBlcnJvcjogYXJndW1lbnQgc3F1YXJlOiBpbnZhbGlkIGludCB2YWx1ZTogJ2ZvdXInCisKK1RoYXQgd2VudCB3ZWxsLiBUaGUgcHJvZ3JhbSBub3cgZXZlbiBoZWxwZnVsbHkgcXVpdHMgb24gYmFkIGlsbGVnYWwgaW5wdXQKK2JlZm9yZSBwcm9jZWVkaW5nLgorCisKK0ludHJvZHVjaW5nIE9wdGlvbmFsIGFyZ3VtZW50cworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1NvIGZhciB3ZSwgaGF2ZSBiZWVuIHBsYXlpbmcgd2l0aCBwb3NpdGlvbmFsIGFyZ3VtZW50cy4gTGV0IHVzCitoYXZlIGEgbG9vayBvbiBob3cgdG8gYWRkIG9wdGlvbmFsIG9uZXM6OgorCisgICBpbXBvcnQgYXJncGFyc2UKKyAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tdmVyYm9zaXR5IiwgaGVscD0iaW5jcmVhc2Ugb3V0cHV0IHZlcmJvc2l0eSIpCisgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorICAgaWYgYXJncy52ZXJib3NpdHk6CisgICAgICAgcHJpbnQgInZlcmJvc2l0eSB0dXJuZWQgb24iCisKK0FuZCB0aGUgb3V0cHV0OgorCisuLiBjb2RlLWJsb2NrOjogc2gKKworICAgJCBweXRob24gcHJvZy5weSAtLXZlcmJvc2l0eSAxCisgICB2ZXJib3NpdHkgdHVybmVkIG9uCisgICAkIHB5dGhvbiBwcm9nLnB5CisgICAkIHB5dGhvbiBwcm9nLnB5IC0taGVscAorICAgdXNhZ2U6IHByb2cucHkgWy1oXSBbLS12ZXJib3NpdHkgVkVSQk9TSVRZXQorCisgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgIC1oLCAtLWhlbHAgICAgICAgICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgIC0tdmVyYm9zaXR5IFZFUkJPU0lUWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jcmVhc2Ugb3V0cHV0IHZlcmJvc2l0eQorICAgJCBweXRob24gcHJvZy5weSAtLXZlcmJvc2l0eQorICAgdXNhZ2U6IHByb2cucHkgWy1oXSBbLS12ZXJib3NpdHkgVkVSQk9TSVRZXQorICAgcHJvZy5weTogZXJyb3I6IGFyZ3VtZW50IC0tdmVyYm9zaXR5OiBleHBlY3RlZCBvbmUgYXJndW1lbnQKKworSGVyZSBpcyB3aGF0IGlzIGhhcHBlbmluZzoKKworKiBUaGUgcHJvZ3JhbSBpcyB3cml0dGVuIHNvIGFzIHRvIGRpc3BsYXkgc29tZXRoaW5nIHdoZW4gYGAtLXZlcmJvc2l0eWBgIGlzCisgIHNwZWNpZmllZCBhbmQgZGlzcGxheSBub3RoaW5nIHdoZW4gbm90LgorCisqIFRvIHNob3cgdGhhdCB0aGUgb3B0aW9uIGlzIGFjdHVhbGx5IG9wdGlvbmFsLCB0aGVyZSBpcyBubyBlcnJvciB3aGVuIHJ1bm5pbmcKKyAgdGhlIHByb2dyYW0gd2l0aG91dCBpdC4gTm90ZSB0aGF0IGJ5IGRlZmF1bHQsIGlmIGFuIG9wdGlvbmFsIGFyZ3VtZW50IGlzbid0CisgIHVzZWQsIHRoZSByZWxldmFudCB2YXJpYWJsZSwgaW4gdGhpcyBjYXNlIDphdHRyOmBhcmdzLnZlcmJvc2l0eWAsIGlzCisgIGdpdmVuIGBgTm9uZWBgIGFzIGEgdmFsdWUsIHdoaWNoIGlzIHRoZSByZWFzb24gaXQgZmFpbHMgdGhlIHRydXRoCisgIHRlc3Qgb2YgdGhlIDprZXl3b3JkOmBpZmAgc3RhdGVtZW50LgorCisqIFRoZSBoZWxwIG1lc3NhZ2UgaXMgYSBiaXQgZGlmZmVyZW50LgorCisqIFdoZW4gdXNpbmcgdGhlIGBgLS12ZXJib3NpdHlgYCBvcHRpb24sIG9uZSBtdXN0IGFsc28gc3BlY2lmeSBzb21lIHZhbHVlLAorICBhbnkgdmFsdWUuCisKK1RoZSBhYm92ZSBleGFtcGxlIGFjY2VwdHMgYXJiaXRyYXJ5IGludGVnZXIgdmFsdWVzIGZvciBgYC0tdmVyYm9zaXR5YGAsIGJ1dCBmb3IKK291ciBzaW1wbGUgcHJvZ3JhbSwgb25seSB0d28gdmFsdWVzIGFyZSBhY3R1YWxseSB1c2VmdWwsIGBgVHJ1ZWBgIG9yIGBgRmFsc2VgYC4KK0xldCdzIG1vZGlmeSB0aGUgY29kZSBhY2NvcmRpbmdseTo6CisKKyAgIGltcG9ydCBhcmdwYXJzZQorICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS12ZXJib3NlIiwgaGVscD0iaW5jcmVhc2Ugb3V0cHV0IHZlcmJvc2l0eSIsCisgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0ic3RvcmVfdHJ1ZSIpCisgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorICAgaWYgYXJncy52ZXJib3NlOgorICAgICAgcHJpbnQgInZlcmJvc2l0eSB0dXJuZWQgb24iCisKK0FuZCB0aGUgb3V0cHV0OgorCisuLiBjb2RlLWJsb2NrOjogc2gKKworICAgJCBweXRob24gcHJvZy5weSAtLXZlcmJvc2UKKyAgIHZlcmJvc2l0eSB0dXJuZWQgb24KKyAgICQgcHl0aG9uIHByb2cucHkgLS12ZXJib3NlIDEKKyAgIHVzYWdlOiBwcm9nLnB5IFstaF0gWy0tdmVyYm9zZV0KKyAgIHByb2cucHk6IGVycm9yOiB1bnJlY29nbml6ZWQgYXJndW1lbnRzOiAxCisgICAkIHB5dGhvbiBwcm9nLnB5IC0taGVscAorICAgdXNhZ2U6IHByb2cucHkgWy1oXSBbLS12ZXJib3NlXQorCisgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgLS12ZXJib3NlICAgaW5jcmVhc2Ugb3V0cHV0IHZlcmJvc2l0eQorCitIZXJlIGlzIHdoYXQgaXMgaGFwcGVuaW5nOgorCisqIFRoZSBvcHRpb24gaXMgbm93IG1vcmUgb2YgYSBmbGFnIHRoYW4gc29tZXRoaW5nIHRoYXQgcmVxdWlyZXMgYSB2YWx1ZS4KKyAgV2UgZXZlbiBjaGFuZ2VkIHRoZSBuYW1lIG9mIHRoZSBvcHRpb24gdG8gbWF0Y2ggdGhhdCBpZGVhLgorICBOb3RlIHRoYXQgd2Ugbm93IHNwZWNpZnkgYSBuZXcga2V5d29yZCwgYGBhY3Rpb25gYCwgYW5kIGdpdmUgaXQgdGhlIHZhbHVlCisgIGBgInN0b3JlX3RydWUiYGAuIFRoaXMgbWVhbnMgdGhhdCwgaWYgdGhlIG9wdGlvbiBpcyBzcGVjaWZpZWQsCisgIGFzc2lnbiB0aGUgdmFsdWUgYGBUcnVlYGAgdG8gOmRhdGE6YGFyZ3MudmVyYm9zZWAuCisgIE5vdCBzcGVjaWZ5aW5nIGl0IGltcGxpZXMgYGBGYWxzZWBgLgorCisqIEl0IGNvbXBsYWlucyB3aGVuIHlvdSBzcGVjaWZ5IGEgdmFsdWUsIGluIHRydWUgc3Bpcml0IG9mIHdoYXQgZmxhZ3MKKyAgYWN0dWFsbHkgYXJlLgorCisqIE5vdGljZSB0aGUgZGlmZmVyZW50IGhlbHAgdGV4dC4KKworCitTaG9ydCBvcHRpb25zCistLS0tLS0tLS0tLS0tCisKK0lmIHlvdSBhcmUgZmFtaWxpYXIgd2l0aCBjb21tYW5kIGxpbmUgdXNhZ2UsCit5b3Ugd2lsbCBub3RpY2UgdGhhdCBJIGhhdmVuJ3QgeWV0IHRvdWNoZWQgb24gdGhlIHRvcGljIG9mIHNob3J0Cit2ZXJzaW9ucyBvZiB0aGUgb3B0aW9ucy4gSXQncyBxdWl0ZSBzaW1wbGU6OgorCisgICBpbXBvcnQgYXJncGFyc2UKKyAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi12IiwgIi0tdmVyYm9zZSIsIGhlbHA9ImluY3JlYXNlIG91dHB1dCB2ZXJib3NpdHkiLAorICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249InN0b3JlX3RydWUiKQorICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKyAgIGlmIGFyZ3MudmVyYm9zZToKKyAgICAgICBwcmludCAidmVyYm9zaXR5IHR1cm5lZCBvbiIKKworQW5kIGhlcmUgZ29lczoKKworLi4gY29kZS1ibG9jazo6IHNoCisKKyAgICQgcHl0aG9uIHByb2cucHkgLXYKKyAgIHZlcmJvc2l0eSB0dXJuZWQgb24KKyAgICQgcHl0aG9uIHByb2cucHkgLS1oZWxwCisgICB1c2FnZTogcHJvZy5weSBbLWhdIFstdl0KKworICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAtaCwgLS1oZWxwICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgIC12LCAtLXZlcmJvc2UgIGluY3JlYXNlIG91dHB1dCB2ZXJib3NpdHkKKworTm90ZSB0aGF0IHRoZSBuZXcgYWJpbGl0eSBpcyBhbHNvIHJlZmxlY3RlZCBpbiB0aGUgaGVscCB0ZXh0LgorCisKK0NvbWJpbmluZyBQb3NpdGlvbmFsIGFuZCBPcHRpb25hbCBhcmd1bWVudHMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworT3VyIHByb2dyYW0ga2VlcHMgZ3Jvd2luZyBpbiBjb21wbGV4aXR5OjoKKworICAgaW1wb3J0IGFyZ3BhcnNlCisgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCJzcXVhcmUiLCB0eXBlPWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iZGlzcGxheSBhIHNxdWFyZSBvZiBhIGdpdmVuIG51bWJlciIpCisgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItdiIsICItLXZlcmJvc2UiLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJpbmNyZWFzZSBvdXRwdXQgdmVyYm9zaXR5IikKKyAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisgICBhbnN3ZXIgPSBhcmdzLnNxdWFyZSoqMgorICAgaWYgYXJncy52ZXJib3NlOgorICAgICAgIHByaW50ICJ0aGUgc3F1YXJlIG9mIHt9IGVxdWFscyB7fSIuZm9ybWF0KGFyZ3Muc3F1YXJlLCBhbnN3ZXIpCisgICBlbHNlOgorICAgICAgIHByaW50IGFuc3dlcgorCitBbmQgbm93IHRoZSBvdXRwdXQ6CisKKy4uIGNvZGUtYmxvY2s6OiBzaAorCisgICAkIHB5dGhvbiBwcm9nLnB5CisgICB1c2FnZTogcHJvZy5weSBbLWhdIFstdl0gc3F1YXJlCisgICBwcm9nLnB5OiBlcnJvcjogdGhlIGZvbGxvd2luZyBhcmd1bWVudHMgYXJlIHJlcXVpcmVkOiBzcXVhcmUKKyAgICQgcHl0aG9uIHByb2cucHkgNAorICAgMTYKKyAgICQgcHl0aG9uIHByb2cucHkgNCAtLXZlcmJvc2UKKyAgIHRoZSBzcXVhcmUgb2YgNCBlcXVhbHMgMTYKKyAgICQgcHl0aG9uIHByb2cucHkgLS12ZXJib3NlIDQKKyAgIHRoZSBzcXVhcmUgb2YgNCBlcXVhbHMgMTYKKworKiBXZSd2ZSBicm91Z2h0IGJhY2sgYSBwb3NpdGlvbmFsIGFyZ3VtZW50LCBoZW5jZSB0aGUgY29tcGxhaW50LgorCisqIE5vdGUgdGhhdCB0aGUgb3JkZXIgZG9lcyBub3QgbWF0dGVyLgorCitIb3cgYWJvdXQgd2UgZ2l2ZSB0aGlzIHByb2dyYW0gb2Ygb3VycyBiYWNrIHRoZSBhYmlsaXR5IHRvIGhhdmUKK211bHRpcGxlIHZlcmJvc2l0eSB2YWx1ZXMsIGFuZCBhY3R1YWxseSBnZXQgdG8gdXNlIHRoZW06OgorCisgICBpbXBvcnQgYXJncGFyc2UKKyAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgIHBhcnNlci5hZGRfYXJndW1lbnQoInNxdWFyZSIsIHR5cGU9aW50LAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJkaXNwbGF5IGEgc3F1YXJlIG9mIGEgZ2l2ZW4gbnVtYmVyIikKKyAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi12IiwgIi0tdmVyYm9zaXR5IiwgdHlwZT1pbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9ImluY3JlYXNlIG91dHB1dCB2ZXJib3NpdHkiKQorICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKyAgIGFuc3dlciA9IGFyZ3Muc3F1YXJlKioyCisgICBpZiBhcmdzLnZlcmJvc2l0eSA9PSAyOgorICAgICAgIHByaW50ICJ0aGUgc3F1YXJlIG9mIHt9IGVxdWFscyB7fSIuZm9ybWF0KGFyZ3Muc3F1YXJlLCBhbnN3ZXIpCisgICBlbGlmIGFyZ3MudmVyYm9zaXR5ID09IDE6CisgICAgICAgcHJpbnQgInt9XjIgPT0ge30iLmZvcm1hdChhcmdzLnNxdWFyZSwgYW5zd2VyKQorICAgZWxzZToKKyAgICAgICBwcmludCBhbnN3ZXIKKworQW5kIHRoZSBvdXRwdXQ6CisKKy4uIGNvZGUtYmxvY2s6OiBzaAorCisgICAkIHB5dGhvbiBwcm9nLnB5IDQKKyAgIDE2CisgICAkIHB5dGhvbiBwcm9nLnB5IDQgLXYKKyAgIHVzYWdlOiBwcm9nLnB5IFstaF0gWy12IFZFUkJPU0lUWV0gc3F1YXJlCisgICBwcm9nLnB5OiBlcnJvcjogYXJndW1lbnQgLXYvLS12ZXJib3NpdHk6IGV4cGVjdGVkIG9uZSBhcmd1bWVudAorICAgJCBweXRob24gcHJvZy5weSA0IC12IDEKKyAgIDReMiA9PSAxNgorICAgJCBweXRob24gcHJvZy5weSA0IC12IDIKKyAgIHRoZSBzcXVhcmUgb2YgNCBlcXVhbHMgMTYKKyAgICQgcHl0aG9uIHByb2cucHkgNCAtdiAzCisgICAxNgorCitUaGVzZSBhbGwgbG9vayBnb29kIGV4Y2VwdCB0aGUgbGFzdCBvbmUsIHdoaWNoIGV4cG9zZXMgYSBidWcgaW4gb3VyIHByb2dyYW0uCitMZXQncyBmaXggaXQgYnkgcmVzdHJpY3RpbmcgdGhlIHZhbHVlcyB0aGUgYGAtLXZlcmJvc2l0eWBgIG9wdGlvbiBjYW4gYWNjZXB0OjoKKworICAgaW1wb3J0IGFyZ3BhcnNlCisgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCJzcXVhcmUiLCB0eXBlPWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iZGlzcGxheSBhIHNxdWFyZSBvZiBhIGdpdmVuIG51bWJlciIpCisgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItdiIsICItLXZlcmJvc2l0eSIsIHR5cGU9aW50LCBjaG9pY2VzPVswLCAxLCAyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iaW5jcmVhc2Ugb3V0cHV0IHZlcmJvc2l0eSIpCisgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorICAgYW5zd2VyID0gYXJncy5zcXVhcmUqKjIKKyAgIGlmIGFyZ3MudmVyYm9zaXR5ID09IDI6CisgICAgICAgcHJpbnQgInRoZSBzcXVhcmUgb2Yge30gZXF1YWxzIHt9Ii5mb3JtYXQoYXJncy5zcXVhcmUsIGFuc3dlcikKKyAgIGVsaWYgYXJncy52ZXJib3NpdHkgPT0gMToKKyAgICAgICBwcmludCAie31eMiA9PSB7fSIuZm9ybWF0KGFyZ3Muc3F1YXJlLCBhbnN3ZXIpCisgICBlbHNlOgorICAgICAgIHByaW50IGFuc3dlcgorCitBbmQgdGhlIG91dHB1dDoKKworLi4gY29kZS1ibG9jazo6IHNoCisKKyAgICQgcHl0aG9uIHByb2cucHkgNCAtdiAzCisgICB1c2FnZTogcHJvZy5weSBbLWhdIFstdiB7MCwxLDJ9XSBzcXVhcmUKKyAgIHByb2cucHk6IGVycm9yOiBhcmd1bWVudCAtdi8tLXZlcmJvc2l0eTogaW52YWxpZCBjaG9pY2U6IDMgKGNob29zZSBmcm9tIDAsIDEsIDIpCisgICAkIHB5dGhvbiBwcm9nLnB5IDQgLWgKKyAgIHVzYWdlOiBwcm9nLnB5IFstaF0gWy12IHswLDEsMn1dIHNxdWFyZQorCisgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgc3F1YXJlICAgICAgICAgICAgICAgIGRpc3BsYXkgYSBzcXVhcmUgb2YgYSBnaXZlbiBudW1iZXIKKworICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAtaCwgLS1oZWxwICAgICAgICAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAtdiB7MCwxLDJ9LCAtLXZlcmJvc2l0eSB7MCwxLDJ9CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZWFzZSBvdXRwdXQgdmVyYm9zaXR5CisKK05vdGUgdGhhdCB0aGUgY2hhbmdlIGFsc28gcmVmbGVjdHMgYm90aCBpbiB0aGUgZXJyb3IgbWVzc2FnZSBhcyB3ZWxsIGFzIHRoZQoraGVscCBzdHJpbmcuCisKK05vdywgbGV0J3MgdXNlIGEgZGlmZmVyZW50IGFwcHJvYWNoIG9mIHBsYXlpbmcgd2l0aCB2ZXJib3NpdHksIHdoaWNoIGlzIHByZXR0eQorY29tbW9uLiBJdCBhbHNvIG1hdGNoZXMgdGhlIHdheSB0aGUgQ1B5dGhvbiBleGVjdXRhYmxlIGhhbmRsZXMgaXRzIG93bgordmVyYm9zaXR5IGFyZ3VtZW50IChjaGVjayB0aGUgb3V0cHV0IG9mIGBgcHl0aG9uIC0taGVscGBgKTo6CisKKyAgIGltcG9ydCBhcmdwYXJzZQorICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgcGFyc2VyLmFkZF9hcmd1bWVudCgic3F1YXJlIiwgdHlwZT1pbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9ImRpc3BsYXkgdGhlIHNxdWFyZSBvZiBhIGdpdmVuIG51bWJlciIpCisgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItdiIsICItLXZlcmJvc2l0eSIsIGFjdGlvbj0iY291bnQiLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJpbmNyZWFzZSBvdXRwdXQgdmVyYm9zaXR5IikKKyAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisgICBhbnN3ZXIgPSBhcmdzLnNxdWFyZSoqMgorICAgaWYgYXJncy52ZXJib3NpdHkgPT0gMjoKKyAgICAgICBwcmludCAidGhlIHNxdWFyZSBvZiB7fSBlcXVhbHMge30iLmZvcm1hdChhcmdzLnNxdWFyZSwgYW5zd2VyKQorICAgZWxpZiBhcmdzLnZlcmJvc2l0eSA9PSAxOgorICAgICAgIHByaW50ICJ7fV4yID09IHt9Ii5mb3JtYXQoYXJncy5zcXVhcmUsIGFuc3dlcikKKyAgIGVsc2U6CisgICAgICAgcHJpbnQgYW5zd2VyCisKK1dlIGhhdmUgaW50cm9kdWNlZCBhbm90aGVyIGFjdGlvbiwgImNvdW50IiwKK3RvIGNvdW50IHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgYSBzcGVjaWZpYyBvcHRpb25hbCBhcmd1bWVudHM6CisKKy4uIGNvZGUtYmxvY2s6OiBzaAorCisgICAkIHB5dGhvbiBwcm9nLnB5IDQKKyAgIDE2CisgICAkIHB5dGhvbiBwcm9nLnB5IDQgLXYKKyAgIDReMiA9PSAxNgorICAgJCBweXRob24gcHJvZy5weSA0IC12dgorICAgdGhlIHNxdWFyZSBvZiA0IGVxdWFscyAxNgorICAgJCBweXRob24gcHJvZy5weSA0IC0tdmVyYm9zaXR5IC0tdmVyYm9zaXR5CisgICB0aGUgc3F1YXJlIG9mIDQgZXF1YWxzIDE2CisgICAkIHB5dGhvbiBwcm9nLnB5IDQgLXYgMQorICAgdXNhZ2U6IHByb2cucHkgWy1oXSBbLXZdIHNxdWFyZQorICAgcHJvZy5weTogZXJyb3I6IHVucmVjb2duaXplZCBhcmd1bWVudHM6IDEKKyAgICQgcHl0aG9uIHByb2cucHkgNCAtaAorICAgdXNhZ2U6IHByb2cucHkgWy1oXSBbLXZdIHNxdWFyZQorCisgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgc3F1YXJlICAgICAgICAgICBkaXNwbGF5IGEgc3F1YXJlIG9mIGEgZ2l2ZW4gbnVtYmVyCisKKyAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgLWgsIC0taGVscCAgICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgIC12LCAtLXZlcmJvc2l0eSAgaW5jcmVhc2Ugb3V0cHV0IHZlcmJvc2l0eQorICAgJCBweXRob24gcHJvZy5weSA0IC12dnYKKyAgIDE2CisKKyogWWVzLCBpdCdzIG5vdyBtb3JlIG9mIGEgZmxhZyAoc2ltaWxhciB0byBgYGFjdGlvbj0ic3RvcmVfdHJ1ZSJgYCkgaW4gdGhlCisgIHByZXZpb3VzIHZlcnNpb24gb2Ygb3VyIHNjcmlwdC4gVGhhdCBzaG91bGQgZXhwbGFpbiB0aGUgY29tcGxhaW50LgorCisqIEl0IGFsc28gYmVoYXZlcyBzaW1pbGFyIHRvICJzdG9yZV90cnVlIiBhY3Rpb24uCisKKyogTm93IGhlcmUncyBhIGRlbW9uc3RyYXRpb24gb2Ygd2hhdCB0aGUgImNvdW50IiBhY3Rpb24gZ2l2ZXMuIFlvdSd2ZSBwcm9iYWJseQorICBzZWVuIHRoaXMgc29ydCBvZiB1c2FnZSBiZWZvcmUuCisKKyogQW5kLCBqdXN0IGxpa2UgdGhlICJzdG9yZV90cnVlIiBhY3Rpb24sIGlmIHlvdSBkb24ndCBzcGVjaWZ5IHRoZSBgYC12YGAgZmxhZywKKyAgdGhhdCBmbGFnIGlzIGNvbnNpZGVyZWQgdG8gaGF2ZSBgYE5vbmVgYCB2YWx1ZS4KKworKiBBcyBzaG91bGQgYmUgZXhwZWN0ZWQsIHNwZWNpZnlpbmcgdGhlIGxvbmcgZm9ybSBvZiB0aGUgZmxhZywgd2Ugc2hvdWxkIGdldAorICB0aGUgc2FtZSBvdXRwdXQuCisKKyogU2FkbHksIG91ciBoZWxwIG91dHB1dCBpc24ndCB2ZXJ5IGluZm9ybWF0aXZlIG9uIHRoZSBuZXcgYWJpbGl0eSBvdXIgc2NyaXB0CisgIGhhcyBhY3F1aXJlZCwgYnV0IHRoYXQgY2FuIGFsd2F5cyBiZSBmaXhlZCBieSBpbXByb3ZpbmcgdGhlIGRvY3VtZW50YXRpb24gZm9yCisgIG91dCBzY3JpcHQgKGUuZy4gdmlhIHRoZSBgYGhlbHBgYCBrZXl3b3JkIGFyZ3VtZW50KS4KKworKiBUaGF0IGxhc3Qgb3V0cHV0IGV4cG9zZXMgYSBidWcgaW4gb3VyIHByb2dyYW0uCisKKworTGV0J3MgZml4OjoKKworICAgaW1wb3J0IGFyZ3BhcnNlCisgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCJzcXVhcmUiLCB0eXBlPWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iZGlzcGxheSBhIHNxdWFyZSBvZiBhIGdpdmVuIG51bWJlciIpCisgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItdiIsICItLXZlcmJvc2l0eSIsIGFjdGlvbj0iY291bnQiLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJpbmNyZWFzZSBvdXRwdXQgdmVyYm9zaXR5IikKKyAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisgICBhbnN3ZXIgPSBhcmdzLnNxdWFyZSoqMgorCisgICAjIGJ1Z2ZpeDogcmVwbGFjZSA9PSB3aXRoID49CisgICBpZiBhcmdzLnZlcmJvc2l0eSA+PSAyOgorICAgICAgIHByaW50ICJ0aGUgc3F1YXJlIG9mIHt9IGVxdWFscyB7fSIuZm9ybWF0KGFyZ3Muc3F1YXJlLCBhbnN3ZXIpCisgICBlbGlmIGFyZ3MudmVyYm9zaXR5ID49IDE6CisgICAgICAgcHJpbnQgInt9XjIgPT0ge30iLmZvcm1hdChhcmdzLnNxdWFyZSwgYW5zd2VyKQorICAgZWxzZToKKyAgICAgICBwcmludCBhbnN3ZXIKKworQW5kIHRoaXMgaXMgd2hhdCBpdCBnaXZlczoKKworLi4gY29kZS1ibG9jazo6IHNoCisKKyAgICQgcHl0aG9uIHByb2cucHkgNCAtdnZ2CisgICB0aGUgc3F1YXJlIG9mIDQgZXF1YWxzIDE2CisgICAkIHB5dGhvbiBwcm9nLnB5IDQgLXZ2dnYKKyAgIHRoZSBzcXVhcmUgb2YgNCBlcXVhbHMgMTYKKyAgICQgcHl0aG9uIHByb2cucHkgNAorICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICBGaWxlICJwcm9nLnB5IiwgbGluZSAxMSwgaW4gPG1vZHVsZT4KKyAgICAgICBpZiBhcmdzLnZlcmJvc2l0eSA+PSAyOgorICAgVHlwZUVycm9yOiB1bm9yZGVyYWJsZSB0eXBlczogTm9uZVR5cGUoKSA+PSBpbnQoKQorCisqIEZpcnN0IG91dHB1dCB3ZW50IHdlbGwsIGFuZCBmaXhlcyB0aGUgYnVnIHdlIGhhZCBiZWZvcmUuCisgIFRoYXQgaXMsIHdlIHdhbnQgYW55IHZhbHVlID49IDIgdG8gYmUgYXMgdmVyYm9zZSBhcyBwb3NzaWJsZS4KKworKiBUaGlyZCBvdXRwdXQgbm90IHNvIGdvb2QuCisKK0xldCdzIGZpeCB0aGF0IGJ1Zzo6CisKKyAgIGltcG9ydCBhcmdwYXJzZQorICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgcGFyc2VyLmFkZF9hcmd1bWVudCgic3F1YXJlIiwgdHlwZT1pbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9ImRpc3BsYXkgYSBzcXVhcmUgb2YgYSBnaXZlbiBudW1iZXIiKQorICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLXYiLCAiLS12ZXJib3NpdHkiLCBhY3Rpb249ImNvdW50IiwgZGVmYXVsdD0wLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJpbmNyZWFzZSBvdXRwdXQgdmVyYm9zaXR5IikKKyAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisgICBhbnN3ZXIgPSBhcmdzLnNxdWFyZSoqMgorICAgaWYgYXJncy52ZXJib3NpdHkgPj0gMjoKKyAgICAgICBwcmludCAidGhlIHNxdWFyZSBvZiB7fSBlcXVhbHMge30iLmZvcm1hdChhcmdzLnNxdWFyZSwgYW5zd2VyKQorICAgZWxpZiBhcmdzLnZlcmJvc2l0eSA+PSAxOgorICAgICAgIHByaW50ICJ7fV4yID09IHt9Ii5mb3JtYXQoYXJncy5zcXVhcmUsIGFuc3dlcikKKyAgIGVsc2U6CisgICAgICAgcHJpbnQgYW5zd2VyCisKK1dlJ3ZlIGp1c3QgaW50cm9kdWNlZCB5ZXQgYW5vdGhlciBrZXl3b3JkLCBgYGRlZmF1bHRgYC4KK1dlJ3ZlIHNldCBpdCB0byBgYDBgYCBpbiBvcmRlciB0byBtYWtlIGl0IGNvbXBhcmFibGUgdG8gdGhlIG90aGVyIGludCB2YWx1ZXMuCitSZW1lbWJlciB0aGF0IGJ5IGRlZmF1bHQsCitpZiBhbiBvcHRpb25hbCBhcmd1bWVudCBpc24ndCBzcGVjaWZpZWQsCitpdCBnZXRzIHRoZSBgYE5vbmVgYCB2YWx1ZSwgYW5kIHRoYXQgY2Fubm90IGJlIGNvbXBhcmVkIHRvIGFuIGludCB2YWx1ZQorKGhlbmNlIHRoZSA6ZXhjOmBUeXBlRXJyb3JgIGV4Y2VwdGlvbikuCisKK0FuZDoKKworLi4gY29kZS1ibG9jazo6IHNoCisKKyAgICQgcHl0aG9uIHByb2cucHkgNAorICAgMTYKKworWW91IGNhbiBnbyBxdWl0ZSBmYXIganVzdCB3aXRoIHdoYXQgd2UndmUgbGVhcm5lZCBzbyBmYXIsCithbmQgd2UgaGF2ZSBvbmx5IHNjcmF0Y2hlZCB0aGUgc3VyZmFjZS4KK1RoZSA6bW9kOmBhcmdwYXJzZWAgbW9kdWxlIGlzIHZlcnkgcG93ZXJmdWwsCithbmQgd2UnbGwgZXhwbG9yZSBhIGJpdCBtb3JlIG9mIGl0IGJlZm9yZSB3ZSBlbmQgdGhpcyB0dXRvcmlhbC4KKworCitHZXR0aW5nIGEgbGl0dGxlIG1vcmUgYWR2YW5jZWQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXaGF0IGlmIHdlIHdhbnRlZCB0byBleHBhbmQgb3VyIHRpbnkgcHJvZ3JhbSB0byBwZXJmb3JtIG90aGVyIHBvd2VycywKK25vdCBqdXN0IHNxdWFyZXM6OgorCisgICBpbXBvcnQgYXJncGFyc2UKKyAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgIHBhcnNlci5hZGRfYXJndW1lbnQoIngiLCB0eXBlPWludCwgaGVscD0idGhlIGJhc2UiKQorICAgcGFyc2VyLmFkZF9hcmd1bWVudCgieSIsIHR5cGU9aW50LCBoZWxwPSJ0aGUgZXhwb25lbnQiKQorICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLXYiLCAiLS12ZXJib3NpdHkiLCBhY3Rpb249ImNvdW50IiwgZGVmYXVsdD0wKQorICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKyAgIGFuc3dlciA9IGFyZ3MueCoqYXJncy55CisgICBpZiBhcmdzLnZlcmJvc2l0eSA+PSAyOgorICAgICAgIHByaW50ICJ7fSB0byB0aGUgcG93ZXIge30gZXF1YWxzIHt9Ii5mb3JtYXQoYXJncy54LCBhcmdzLnksIGFuc3dlcikKKyAgIGVsaWYgYXJncy52ZXJib3NpdHkgPj0gMToKKyAgICAgICBwcmludCAie31ee30gPT0ge30iLmZvcm1hdChhcmdzLngsIGFyZ3MueSwgYW5zd2VyKQorICAgZWxzZToKKyAgICAgICBwcmludCBhbnN3ZXIKKworT3V0cHV0OgorCisuLiBjb2RlLWJsb2NrOjogc2gKKworICAgJCBweXRob24gcHJvZy5weQorICAgdXNhZ2U6IHByb2cucHkgWy1oXSBbLXZdIHggeQorICAgcHJvZy5weTogZXJyb3I6IHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzIGFyZSByZXF1aXJlZDogeCwgeQorICAgJCBweXRob24gcHJvZy5weSAtaAorICAgdXNhZ2U6IHByb2cucHkgWy1oXSBbLXZdIHggeQorCisgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgeCAgICAgICAgICAgICAgICB0aGUgYmFzZQorICAgICB5ICAgICAgICAgICAgICAgIHRoZSBleHBvbmVudAorCisgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgIC1oLCAtLWhlbHAgICAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAtdiwgLS12ZXJib3NpdHkKKyAgICQgcHl0aG9uIHByb2cucHkgNCAyIC12CisgICA0XjIgPT0gMTYKKworCitOb3RpY2UgdGhhdCBzbyBmYXIgd2UndmUgYmVlbiB1c2luZyB2ZXJib3NpdHkgbGV2ZWwgdG8gKmNoYW5nZSogdGhlIHRleHQKK3RoYXQgZ2V0cyBkaXNwbGF5ZWQuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbnN0ZWFkIHVzZXMgdmVyYm9zaXR5IGxldmVsCit0byBkaXNwbGF5ICptb3JlKiB0ZXh0IGluc3RlYWQ6OgorCisgICBpbXBvcnQgYXJncGFyc2UKKyAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgIHBhcnNlci5hZGRfYXJndW1lbnQoIngiLCB0eXBlPWludCwgaGVscD0idGhlIGJhc2UiKQorICAgcGFyc2VyLmFkZF9hcmd1bWVudCgieSIsIHR5cGU9aW50LCBoZWxwPSJ0aGUgZXhwb25lbnQiKQorICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLXYiLCAiLS12ZXJib3NpdHkiLCBhY3Rpb249ImNvdW50IiwgZGVmYXVsdD0wKQorICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKyAgIGFuc3dlciA9IGFyZ3MueCoqYXJncy55CisgICBpZiBhcmdzLnZlcmJvc2l0eSA+PSAyOgorICAgICAgIHByaW50ICJSdW5uaW5nICd7fSciLmZvcm1hdChfX2ZpbGVfXykKKyAgIGlmIGFyZ3MudmVyYm9zaXR5ID49IDE6CisgICAgICAgcHJpbnQgInt9Xnt9ID09Ii5mb3JtYXQoYXJncy54LCBhcmdzLnkpLAorICAgcHJpbnQgYW5zd2VyCisKK091dHB1dDoKKworLi4gY29kZS1ibG9jazo6IHNoCisKKyAgICQgcHl0aG9uIHByb2cucHkgNCAyCisgICAxNgorICAgJCBweXRob24gcHJvZy5weSA0IDIgLXYKKyAgIDReMiA9PSAxNgorICAgJCBweXRob24gcHJvZy5weSA0IDIgLXZ2CisgICBSdW5uaW5nICdwcm9nLnB5JworICAgNF4yID09IDE2CisKKworQ29uZmxpY3Rpbmcgb3B0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTbyBmYXIsIHdlIGhhdmUgYmVlbiB3b3JraW5nIHdpdGggdHdvIG1ldGhvZHMgb2YgYW4KKzpjbGFzczpgYXJncGFyc2UuQXJndW1lbnRQYXJzZXJgIGluc3RhbmNlLiBMZXQncyBpbnRyb2R1Y2UgYSB0aGlyZCBvbmUsCis6bWV0aDpgYWRkX211dHVhbGx5X2V4Y2x1c2l2ZV9ncm91cGAuIEl0IGFsbG93cyBmb3IgdXMgdG8gc3BlY2lmeSBvcHRpb25zIHRoYXQKK2NvbmZsaWN0IHdpdGggZWFjaCBvdGhlci4gTGV0J3MgYWxzbyBjaGFuZ2UgdGhlIHJlc3Qgb2YgdGhlIHByb2dyYW0gc28gdGhhdAordGhlIG5ldyBmdW5jdGlvbmFsaXR5IG1ha2VzIG1vcmUgc2Vuc2U6Cit3ZSdsbCBpbnRyb2R1Y2UgdGhlIGBgLS1xdWlldGBgIG9wdGlvbiwKK3doaWNoIHdpbGwgYmUgdGhlIG9wcG9zaXRlIG9mIHRoZSBgYC0tdmVyYm9zZWBgIG9uZTo6CisKKyAgIGltcG9ydCBhcmdwYXJzZQorCisgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICBncm91cCA9IHBhcnNlci5hZGRfbXV0dWFsbHlfZXhjbHVzaXZlX2dyb3VwKCkKKyAgIGdyb3VwLmFkZF9hcmd1bWVudCgiLXYiLCAiLS12ZXJib3NlIiwgYWN0aW9uPSJzdG9yZV90cnVlIikKKyAgIGdyb3VwLmFkZF9hcmd1bWVudCgiLXEiLCAiLS1xdWlldCIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIpCisgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCJ4IiwgdHlwZT1pbnQsIGhlbHA9InRoZSBiYXNlIikKKyAgIHBhcnNlci5hZGRfYXJndW1lbnQoInkiLCB0eXBlPWludCwgaGVscD0idGhlIGV4cG9uZW50IikKKyAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisgICBhbnN3ZXIgPSBhcmdzLngqKmFyZ3MueQorCisgICBpZiBhcmdzLnF1aWV0OgorICAgICAgIHByaW50IGFuc3dlcgorICAgZWxpZiBhcmdzLnZlcmJvc2U6CisgICAgICAgcHJpbnQgInt9IHRvIHRoZSBwb3dlciB7fSBlcXVhbHMge30iLmZvcm1hdChhcmdzLngsIGFyZ3MueSwgYW5zd2VyKQorICAgZWxzZToKKyAgICAgICBwcmludCAie31ee30gPT0ge30iLmZvcm1hdChhcmdzLngsIGFyZ3MueSwgYW5zd2VyKQorCitPdXIgcHJvZ3JhbSBpcyBub3cgc2ltcGxlciwgYW5kIHdlJ3ZlIGxvc3Qgc29tZSBmdW5jdGlvbmFsaXR5IGZvciB0aGUgc2FrZSBvZgorZGVtb25zdHJhdGlvbi4gQW55d2F5cywgaGVyZSdzIHRoZSBvdXRwdXQ6CisKKy4uIGNvZGUtYmxvY2s6OiBzaAorCisgICAkIHB5dGhvbiBwcm9nLnB5IDQgMgorICAgNF4yID09IDE2CisgICAkIHB5dGhvbiBwcm9nLnB5IDQgMiAtcQorICAgMTYKKyAgICQgcHl0aG9uIHByb2cucHkgNCAyIC12CisgICA0IHRvIHRoZSBwb3dlciAyIGVxdWFscyAxNgorICAgJCBweXRob24gcHJvZy5weSA0IDIgLXZxCisgICB1c2FnZTogcHJvZy5weSBbLWhdIFstdiB8IC1xXSB4IHkKKyAgIHByb2cucHk6IGVycm9yOiBhcmd1bWVudCAtcS8tLXF1aWV0OiBub3QgYWxsb3dlZCB3aXRoIGFyZ3VtZW50IC12Ly0tdmVyYm9zZQorICAgJCBweXRob24gcHJvZy5weSA0IDIgLXYgLS1xdWlldAorICAgdXNhZ2U6IHByb2cucHkgWy1oXSBbLXYgfCAtcV0geCB5CisgICBwcm9nLnB5OiBlcnJvcjogYXJndW1lbnQgLXEvLS1xdWlldDogbm90IGFsbG93ZWQgd2l0aCBhcmd1bWVudCAtdi8tLXZlcmJvc2UKKworVGhhdCBzaG91bGQgYmUgZWFzeSB0byBmb2xsb3cuIEkndmUgYWRkZWQgdGhhdCBsYXN0IG91dHB1dCBzbyB5b3UgY2FuIHNlZSB0aGUKK3NvcnQgb2YgZmxleGliaWxpdHkgeW91IGdldCwgaS5lLiBtaXhpbmcgbG9uZyBmb3JtIG9wdGlvbnMgd2l0aCBzaG9ydCBmb3JtCitvbmVzLgorCitCZWZvcmUgd2UgY29uY2x1ZGUsIHlvdSBwcm9iYWJseSB3YW50IHRvIHRlbGwgeW91ciB1c2VycyB0aGUgbWFpbiBwdXJwb3NlIG9mCit5b3VyIHByb2dyYW0sIGp1c3QgaW4gY2FzZSB0aGV5IGRvbid0IGtub3c6OgorCisgICBpbXBvcnQgYXJncGFyc2UKKworICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249ImNhbGN1bGF0ZSBYIHRvIHRoZSBwb3dlciBvZiBZIikKKyAgIGdyb3VwID0gcGFyc2VyLmFkZF9tdXR1YWxseV9leGNsdXNpdmVfZ3JvdXAoKQorICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCItdiIsICItLXZlcmJvc2UiLCBhY3Rpb249InN0b3JlX3RydWUiKQorICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCItcSIsICItLXF1aWV0IiwgYWN0aW9uPSJzdG9yZV90cnVlIikKKyAgIHBhcnNlci5hZGRfYXJndW1lbnQoIngiLCB0eXBlPWludCwgaGVscD0idGhlIGJhc2UiKQorICAgcGFyc2VyLmFkZF9hcmd1bWVudCgieSIsIHR5cGU9aW50LCBoZWxwPSJ0aGUgZXhwb25lbnQiKQorICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKyAgIGFuc3dlciA9IGFyZ3MueCoqYXJncy55CisKKyAgIGlmIGFyZ3MucXVpZXQ6CisgICAgICAgcHJpbnQgYW5zd2VyCisgICBlbGlmIGFyZ3MudmVyYm9zZToKKyAgICAgICBwcmludCAie30gdG8gdGhlIHBvd2VyIHt9IGVxdWFscyB7fSIuZm9ybWF0KGFyZ3MueCwgYXJncy55LCBhbnN3ZXIpCisgICBlbHNlOgorICAgICAgIHByaW50ICJ7fV57fSA9PSB7fSIuZm9ybWF0KGFyZ3MueCwgYXJncy55LCBhbnN3ZXIpCisKK05vdGUgdGhhdCBzbGlnaHQgZGlmZmVyZW5jZSBpbiB0aGUgdXNhZ2UgdGV4dC4gTm90ZSB0aGUgYGBbLXYgfCAtcV1gYCwKK3doaWNoIHRlbGxzIHVzIHRoYXQgd2UgY2FuIGVpdGhlciB1c2UgYGAtdmBgIG9yIGBgLXFgYCwKK2J1dCBub3QgYm90aCBhdCB0aGUgc2FtZSB0aW1lOgorCisuLiBjb2RlLWJsb2NrOjogc2gKKworICAgJCBweXRob24gcHJvZy5weSAtLWhlbHAKKyAgIHVzYWdlOiBwcm9nLnB5IFstaF0gWy12IHwgLXFdIHggeQorCisgICBjYWxjdWxhdGUgWCB0byB0aGUgcG93ZXIgb2YgWQorCisgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgeCAgICAgICAgICAgICAgdGhlIGJhc2UKKyAgICAgeSAgICAgICAgICAgICAgdGhlIGV4cG9uZW50CisKKyAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgLWgsIC0taGVscCAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAtdiwgLS12ZXJib3NlCisgICAgIC1xLCAtLXF1aWV0CisKKworQ29uY2x1c2lvbgorPT09PT09PT09PQorCitUaGUgOm1vZDpgYXJncGFyc2VgIG1vZHVsZSBvZmZlcnMgYSBsb3QgbW9yZSB0aGFuIHNob3duIGhlcmUuCitJdHMgZG9jcyBhcmUgcXVpdGUgZGV0YWlsZWQgYW5kIHRob3JvdWdoLCBhbmQgZnVsbCBvZiBleGFtcGxlcy4KK0hhdmluZyBnb25lIHRocm91Z2ggdGhpcyB0dXRvcmlhbCwgeW91IHNob3VsZCBlYXNpbHkgZGlnZXN0IHRoZW0KK3dpdGhvdXQgZmVlbGluZyBvdmVyd2hlbG1lZC4KZGlmZiAtLWdpdCBhL0RvYy9ob3d0by9jcG9ydGluZy5yc3QgYi9Eb2MvaG93dG8vY3BvcnRpbmcucnN0CmluZGV4IDViYTVkZjcuLjFhZDc3ZDYgMTAwNjQ0Ci0tLSBhL0RvYy9ob3d0by9jcG9ydGluZy5yc3QKKysrIGIvRG9jL2hvd3RvL2Nwb3J0aW5nLnJzdApAQCAtMiwyNyArMiwyOCBAQAogCiAuLiBfY3BvcnRpbmctaG93dG86CiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1Qb3J0aW5nIEV4dGVuc2lvbiBNb2R1bGVzIHRvIDMuMAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BvcnRpbmcgRXh0ZW5zaW9uIE1vZHVsZXMgdG8gUHl0aG9uIDMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogOmF1dGhvcjogQmVuamFtaW4gUGV0ZXJzb24KIAogCiAuLiB0b3BpYzo6IEFic3RyYWN0CiAKLSAgIEFsdGhvdWdoIGNoYW5naW5nIHRoZSBDLUFQSSB3YXMgbm90IG9uZSBvZiBQeXRob24gMy4wJ3Mgb2JqZWN0aXZlcywgdGhlIG1hbnkKLSAgIFB5dGhvbiBsZXZlbCBjaGFuZ2VzIG1hZGUgbGVhdmluZyAyLngncyBBUEkgaW50YWN0IGltcG9zc2libGUuICBJbiBmYWN0LCBzb21lCi0gICBjaGFuZ2VzIHN1Y2ggYXMgOmZ1bmM6YGludGAgYW5kIDpmdW5jOmBsb25nYCB1bmlmaWNhdGlvbiBhcmUgbW9yZSBvYnZpb3VzIG9uCi0gICB0aGUgQyBsZXZlbC4gIFRoaXMgZG9jdW1lbnQgZW5kZWF2b3JzIHRvIGRvY3VtZW50IGluY29tcGF0aWJpbGl0aWVzIGFuZCBob3cKLSAgIHRoZXkgY2FuIGJlIHdvcmtlZCBhcm91bmQuCisgICBBbHRob3VnaCBjaGFuZ2luZyB0aGUgQy1BUEkgd2FzIG5vdCBvbmUgb2YgUHl0aG9uIDMncyBvYmplY3RpdmVzLAorICAgdGhlIG1hbnkgUHl0aG9uLWxldmVsIGNoYW5nZXMgbWFkZSBsZWF2aW5nIFB5dGhvbiAyJ3MgQVBJIGludGFjdAorICAgaW1wb3NzaWJsZS4gIEluIGZhY3QsIHNvbWUgY2hhbmdlcyBzdWNoIGFzIDpmdW5jOmBpbnRgIGFuZAorICAgOmZ1bmM6YGxvbmdgIHVuaWZpY2F0aW9uIGFyZSBtb3JlIG9idmlvdXMgb24gdGhlIEMgbGV2ZWwuICBUaGlzCisgICBkb2N1bWVudCBlbmRlYXZvcnMgdG8gZG9jdW1lbnQgaW5jb21wYXRpYmlsaXRpZXMgYW5kIGhvdyB0aGV5IGNhbgorICAgYmUgd29ya2VkIGFyb3VuZC4KIAogCiBDb25kaXRpb25hbCBjb21waWxhdGlvbgogPT09PT09PT09PT09PT09PT09PT09PT0KIAotVGhlIGVhc2llc3Qgd2F5IHRvIGNvbXBpbGUgb25seSBzb21lIGNvZGUgZm9yIDMuMCBpcyB0byBjaGVjayBpZgotOmNtYWNybzpgUFlfTUFKT1JfVkVSU0lPTmAgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDMuIDo6CitUaGUgZWFzaWVzdCB3YXkgdG8gY29tcGlsZSBvbmx5IHNvbWUgY29kZSBmb3IgUHl0aG9uIDMgaXMgdG8gY2hlY2sKK2lmIDpjOm1hY3JvOmBQWV9NQUpPUl9WRVJTSU9OYCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMy4gOjoKIAogICAgI2lmIFBZX01BSk9SX1ZFUlNJT04gPj0gMwogICAgI2RlZmluZSBJU19QWTNLCkBAIC0zNSw3ICszNiw3IEBACiBDaGFuZ2VzIHRvIE9iamVjdCBBUElzCiA9PT09PT09PT09PT09PT09PT09PT09CiAKLVB5dGhvbiAzLjAgbWVyZ2VkIHRvZ2V0aGVyIHNvbWUgdHlwZXMgd2l0aCBzaW1pbGFyIGZ1bmN0aW9ucyB3aGlsZSBjbGVhbmx5CitQeXRob24gMyBtZXJnZWQgdG9nZXRoZXIgc29tZSB0eXBlcyB3aXRoIHNpbWlsYXIgZnVuY3Rpb25zIHdoaWxlIGNsZWFubHkKIHNlcGFyYXRpbmcgb3RoZXJzLgogCiAKQEAgLTQzLDE2ICs0NCwxNiBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogCi1QeXRob24gMy4wJ3MgOmZ1bmM6YHN0cmAgKGBgUHlTdHJpbmdfKmBgIGZ1bmN0aW9ucyBpbiBDKSB0eXBlIGlzIGVxdWl2YWxlbnQgdG8KLTIueCdzIDpmdW5jOmB1bmljb2RlYCAoYGBQeVVuaWNvZGVfKmBgKS4gIFRoZSBvbGQgOC1iaXQgc3RyaW5nIHR5cGUgaGFzIGJlY29tZQotOmZ1bmM6YGJ5dGVzYC4gIFB5dGhvbiAyLjYgYW5kIGxhdGVyIHByb3ZpZGUgYSBjb21wYXRpYmlsaXR5IGhlYWRlciwKK1B5dGhvbiAzJ3MgOmZ1bmM6YHN0cmAgKGBgUHlTdHJpbmdfKmBgIGZ1bmN0aW9ucyBpbiBDKSB0eXBlIGlzIGVxdWl2YWxlbnQgdG8KK1B5dGhvbiAyJ3MgOmZ1bmM6YHVuaWNvZGVgIChgYFB5VW5pY29kZV8qYGApLiAgVGhlIG9sZCA4LWJpdCBzdHJpbmcgdHlwZSBoYXMKK2JlY29tZSA6ZnVuYzpgYnl0ZXNgLiAgUHl0aG9uIDIuNiBhbmQgbGF0ZXIgcHJvdmlkZSBhIGNvbXBhdGliaWxpdHkgaGVhZGVyLAogOmZpbGU6YGJ5dGVzb2JqZWN0LmhgLCBtYXBwaW5nIGBgUHlCeXRlc2BgIG5hbWVzIHRvIGBgUHlTdHJpbmdgYCBvbmVzLiAgRm9yIGJlc3QKLWNvbXBhdGliaWxpdHkgd2l0aCAzLjAsIDpjdHlwZTpgUHlVbmljb2RlYCBzaG91bGQgYmUgdXNlZCBmb3IgdGV4dHVhbCBkYXRhIGFuZAotOmN0eXBlOmBQeUJ5dGVzYCBmb3IgYmluYXJ5IGRhdGEuICBJdCdzIGFsc28gaW1wb3J0YW50IHRvIHJlbWVtYmVyIHRoYXQKLTpjdHlwZTpgUHlCeXRlc2AgYW5kIDpjdHlwZTpgUHlVbmljb2RlYCBpbiAzLjAgYXJlIG5vdCBpbnRlcmNoYW5nZWFibGUgbGlrZQotOmN0eXBlOmBQeVN0cmluZ2AgYW5kIDpjdHlwZTpgUHlVbmljb2RlYCBhcmUgaW4gMi54LiAgVGhlIGZvbGxvd2luZyBleGFtcGxlCi1zaG93cyBiZXN0IHByYWN0aWNlcyB3aXRoIHJlZ2FyZHMgdG8gOmN0eXBlOmBQeVVuaWNvZGVgLCA6Y3R5cGU6YFB5U3RyaW5nYCwKLWFuZCA6Y3R5cGU6YFB5Qnl0ZXNgLiA6OgorY29tcGF0aWJpbGl0eSB3aXRoIFB5dGhvbiAzLCA6Yzp0eXBlOmBQeVVuaWNvZGVgIHNob3VsZCBiZSB1c2VkIGZvciB0ZXh0dWFsIGRhdGEgYW5kCis6Yzp0eXBlOmBQeUJ5dGVzYCBmb3IgYmluYXJ5IGRhdGEuICBJdCdzIGFsc28gaW1wb3J0YW50IHRvIHJlbWVtYmVyIHRoYXQKKzpjOnR5cGU6YFB5Qnl0ZXNgIGFuZCA6Yzp0eXBlOmBQeVVuaWNvZGVgIGluIFB5dGhvbiAzIGFyZSBub3QgaW50ZXJjaGFuZ2VhYmxlIGxpa2UKKzpjOnR5cGU6YFB5U3RyaW5nYCBhbmQgOmM6dHlwZTpgUHlVbmljb2RlYCBhcmUgaW4gUHl0aG9uIDIuICBUaGUgZm9sbG93aW5nIGV4YW1wbGUKK3Nob3dzIGJlc3QgcHJhY3RpY2VzIHdpdGggcmVnYXJkcyB0byA6Yzp0eXBlOmBQeVVuaWNvZGVgLCA6Yzp0eXBlOmBQeVN0cmluZ2AsCithbmQgOmM6dHlwZTpgUHlCeXRlc2AuIDo6CiAKICAgICNpbmNsdWRlICJzdGRsaWIuaCIKICAgICNpbmNsdWRlICJQeXRob24uaCIKQEAgLTk0LDM2ICs5NSwyMCBAQAogbG9uZy9pbnQgVW5pZmljYXRpb24KIC0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUluIFB5dGhvbiAzLjAsIHRoZXJlIGlzIG9ubHkgb25lIGludGVnZXIgdHlwZS4gIEl0IGlzIGNhbGxlZCA6ZnVuYzpgaW50YCBvbiB0aGUKLVB5dGhvbiBsZXZlbCwgYnV0IGFjdHVhbGx5IGNvcnJlc3BvbmRzIHRvIDIueCdzIDpmdW5jOmBsb25nYCB0eXBlLiAgSW4gdGhlCi1DLUFQSSwgYGBQeUludF8qYGAgZnVuY3Rpb25zIGFyZSByZXBsYWNlZCBieSB0aGVpciBgYFB5TG9uZ18qYGAgbmVpZ2hib3JzLiAgVGhlCi1iZXN0IGNvdXJzZSBvZiBhY3Rpb24gaGVyZSBpcyB1c2luZyB0aGUgYGBQeUludF8qYGAgZnVuY3Rpb25zIGFsaWFzZWQgdG8KLWBgUHlMb25nXypgYCBmb3VuZCBpbiA6ZmlsZTpgaW50b2JqZWN0LmhgLiAgVGhlIGFic3RyYWN0IGBgUHlOdW1iZXJfKmBgIEFQSXMKLWNhbiBhbHNvIGJlIHVzZWQgaW4gc29tZSBjYXNlcy4gOjoKLQotICAgI2luY2x1ZGUgIlB5dGhvbi5oIgotICAgI2luY2x1ZGUgImludG9iamVjdC5oIgotCi0gICBzdGF0aWMgUHlPYmplY3QgKgotICAgYWRkX2ludHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKSB7Ci0gICAgICAgaW50IG9uZSwgdHdvOwotICAgICAgIFB5T2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOmFkZF9pbnRzIiwgJm9uZSwgJnR3bykpCi0gICAgICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKG9uZSArIHR3byk7Ci0gICB9Ci0KK1B5dGhvbiAzIGhhcyBvbmx5IG9uZSBpbnRlZ2VyIHR5cGUsIDpmdW5jOmBpbnRgLiAgQnV0IGl0IGFjdHVhbGx5Citjb3JyZXNwb25kcyB0byBQeXRob24gMidzIDpmdW5jOmBsb25nYCB0eXBlLS10aGUgOmZ1bmM6YGludGAgdHlwZQordXNlZCBpbiBQeXRob24gMiB3YXMgcmVtb3ZlZC4gIEluIHRoZSBDLUFQSSwgYGBQeUludF8qYGAgZnVuY3Rpb25zCithcmUgcmVwbGFjZWQgYnkgdGhlaXIgYGBQeUxvbmdfKmBgIGVxdWl2YWxlbnRzLgogCiAKIE1vZHVsZSBpbml0aWFsaXphdGlvbiBhbmQgc3RhdGUKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotUHl0aG9uIDMuMCBoYXMgYSByZXZhbXBlZCBleHRlbnNpb24gbW9kdWxlIGluaXRpYWxpemF0aW9uIHN5c3RlbS4gIChTZWUKLTpwZXA6YDMxMjFgLikgIEluc3RlYWQgb2Ygc3RvcmluZyBtb2R1bGUgc3RhdGUgaW4gZ2xvYmFscywgdGhleSBzaG91bGQgYmUgc3RvcmVkCi1pbiBhbiBpbnRlcnByZXRlciBzcGVjaWZpYyBzdHJ1Y3R1cmUuICBDcmVhdGluZyBtb2R1bGVzIHRoYXQgYWN0IGNvcnJlY3RseSBpbgotYm90aCAyLnggYW5kIDMuMCBpcyB0cmlja3kuICBUaGUgZm9sbG93aW5nIHNpbXBsZSBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cuIDo6CitQeXRob24gMyBoYXMgYSByZXZhbXBlZCBleHRlbnNpb24gbW9kdWxlIGluaXRpYWxpemF0aW9uIHN5c3RlbS4gIChTZWUKKzpwZXA6YDMxMjFgLikgIEluc3RlYWQgb2Ygc3RvcmluZyBtb2R1bGUgc3RhdGUgaW4gZ2xvYmFscywgdGhleSBzaG91bGQKK2JlIHN0b3JlZCBpbiBhbiBpbnRlcnByZXRlciBzcGVjaWZpYyBzdHJ1Y3R1cmUuICBDcmVhdGluZyBtb2R1bGVzIHRoYXQKK2FjdCBjb3JyZWN0bHkgaW4gYm90aCBQeXRob24gMiBhbmQgUHl0aG9uIDMgaXMgdHJpY2t5LiAgVGhlIGZvbGxvd2luZworc2ltcGxlIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdy4gOjoKIAogICAgI2luY2x1ZGUgIlB5dGhvbi5oIgogCkBAIC0yMTIsNTAgKzE5Nyw1MyBAQAogQ09iamVjdCByZXBsYWNlZCB3aXRoIENhcHN1bGUKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLVRoZSA6Y3R5cGU6YENhcHN1bGVgIG9iamVjdCB3YXMgaW50cm9kdWNlZCBpbiBQeXRob24gMy4xIGFuZCAyLjcgdG8gcmVwbGFjZQotOmN0eXBlOmBDT2JqZWN0YC4gIENPYmplY3RzIHdlcmUgdXNlZnVsLAotYnV0IHRoZSA6Y3R5cGU6YENPYmplY3RgIEFQSSB3YXMgcHJvYmxlbWF0aWM6IGl0IGRpZG4ndCBwZXJtaXQgZGlzdGluZ3Vpc2hpbmcKK1RoZSA6Yzp0eXBlOmBDYXBzdWxlYCBvYmplY3Qgd2FzIGludHJvZHVjZWQgaW4gUHl0aG9uIDMuMSBhbmQgMi43IHRvIHJlcGxhY2UKKzpjOnR5cGU6YENPYmplY3RgLiAgQ09iamVjdHMgd2VyZSB1c2VmdWwsCitidXQgdGhlIDpjOnR5cGU6YENPYmplY3RgIEFQSSB3YXMgcHJvYmxlbWF0aWM6IGl0IGRpZG4ndCBwZXJtaXQgZGlzdGluZ3Vpc2hpbmcKIGJldHdlZW4gdmFsaWQgQ09iamVjdHMsIHdoaWNoIGFsbG93ZWQgbWlzbWF0Y2hlZCBDT2JqZWN0cyB0byBjcmFzaCB0aGUKIGludGVycHJldGVyLCBhbmQgc29tZSBvZiBpdHMgQVBJcyByZWxpZWQgb24gdW5kZWZpbmVkIGJlaGF2aW9yIGluIEMuCiAoRm9yIGZ1cnRoZXIgcmVhZGluZyBvbiB0aGUgcmF0aW9uYWxlIGJlaGluZCBDYXBzdWxlcywgcGxlYXNlIHNlZSA6aXNzdWU6YDU2MzBgLikKIAogSWYgeW91J3JlIGN1cnJlbnRseSB1c2luZyBDT2JqZWN0cywgYW5kIHlvdSB3YW50IHRvIG1pZ3JhdGUgdG8gMy4xIG9yIG5ld2VyLAogeW91J2xsIG5lZWQgdG8gc3dpdGNoIHRvIENhcHN1bGVzLgotOmN0eXBlOmBDT2JqZWN0YCB3YXMgZGVwcmVjYXRlZCBpbiAzLjEgYW5kIDIuNyBhbmQgY29tcGxldGVseSByZW1vdmVkIGluCis6Yzp0eXBlOmBDT2JqZWN0YCB3YXMgZGVwcmVjYXRlZCBpbiAzLjEgYW5kIDIuNyBhbmQgY29tcGxldGVseSByZW1vdmVkIGluCiBQeXRob24gMy4yLiAgSWYgeW91IG9ubHkgc3VwcG9ydCAyLjcsIG9yIDMuMSBhbmQgYWJvdmUsIHlvdQotY2FuIHNpbXBseSBzd2l0Y2ggdG8gOmN0eXBlOmBDYXBzdWxlYC4gIElmIHlvdSBuZWVkIHRvIHN1cHBvcnQgMy4wIG9yCi12ZXJzaW9ucyBvZiBQeXRob24gZWFybGllciB0aGFuIDIuNyB5b3UnbGwgaGF2ZSB0byBzdXBwb3J0IGJvdGggQ09iamVjdHMKLWFuZCBDYXBzdWxlcy4KK2NhbiBzaW1wbHkgc3dpdGNoIHRvIDpjOnR5cGU6YENhcHN1bGVgLiAgSWYgeW91IG5lZWQgdG8gc3VwcG9ydCBQeXRob24gMy4wLAorb3IgdmVyc2lvbnMgb2YgUHl0aG9uIGVhcmxpZXIgdGhhbiAyLjcsCit5b3UnbGwgaGF2ZSB0byBzdXBwb3J0IGJvdGggQ09iamVjdHMgYW5kIENhcHN1bGVzLgorKE5vdGUgdGhhdCBQeXRob24gMy4wIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQsIGFuZCBpdCBpcyBub3QgcmVjb21tZW5kZWQKK2ZvciBwcm9kdWN0aW9uIHVzZS4pCiAKIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBoZWFkZXIgZmlsZSA6ZmlsZTpgY2Fwc3VsZXRodW5rLmhgIG1heQotc29sdmUgdGhlIHByb2JsZW0gZm9yIHlvdTsKLXNpbXBseSB3cml0ZSB5b3VyIGNvZGUgYWdhaW5zdCB0aGUgOmN0eXBlOmBDYXBzdWxlYCBBUEksIGluY2x1ZGUKLXRoaXMgaGVhZGVyIGZpbGUgYWZ0ZXIgYGAiUHl0aG9uLmgiYGAsIGFuZCB5b3UnbGwgYXV0b21hdGljYWxseSB1c2UgQ09iamVjdHMKLWluIFB5dGhvbiAzLjAgb3IgdmVyc2lvbnMgZWFybGllciB0aGFuIDIuNy4KK3NvbHZlIHRoZSBwcm9ibGVtIGZvciB5b3UuICBTaW1wbHkgd3JpdGUgeW91ciBjb2RlIGFnYWluc3QgdGhlCis6Yzp0eXBlOmBDYXBzdWxlYCBBUEkgYW5kIGluY2x1ZGUgdGhpcyBoZWFkZXIgZmlsZSBhZnRlcgorOmZpbGU6YFB5dGhvbi5oYC4gIFlvdXIgY29kZSB3aWxsIGF1dG9tYXRpY2FsbHkgdXNlIENhcHN1bGVzCitpbiB2ZXJzaW9ucyBvZiBQeXRob24gd2l0aCBDYXBzdWxlcywgYW5kIHN3aXRjaCB0byBDT2JqZWN0cword2hlbiBDYXBzdWxlcyBhcmUgdW5hdmFpbGFibGUuCiAKIDpmaWxlOmBjYXBzdWxldGh1bmsuaGAgc2ltdWxhdGVzIENhcHN1bGVzIHVzaW5nIENPYmplY3RzLiAgSG93ZXZlciwKLTpjdHlwZTpgQ09iamVjdGAgcHJvdmlkZXMgbm8gcGxhY2UgdG8gc3RvcmUgdGhlIGNhcHN1bGUncyAibmFtZSIuICBBcyBhCi1yZXN1bHQgdGhlIHNpbXVsYXRlZCA6Y3R5cGU6YENhcHN1bGVgIG9iamVjdHMgY3JlYXRlZCBieSA6ZmlsZTpgY2Fwc3VsZXRodW5rLmhgCis6Yzp0eXBlOmBDT2JqZWN0YCBwcm92aWRlcyBubyBwbGFjZSB0byBzdG9yZSB0aGUgY2Fwc3VsZSdzICJuYW1lIi4gIEFzIGEKK3Jlc3VsdCB0aGUgc2ltdWxhdGVkIDpjOnR5cGU6YENhcHN1bGVgIG9iamVjdHMgY3JlYXRlZCBieSA6ZmlsZTpgY2Fwc3VsZXRodW5rLmhgCiBiZWhhdmUgc2xpZ2h0bHkgZGlmZmVyZW50bHkgZnJvbSByZWFsIENhcHN1bGVzLiAgU3BlY2lmaWNhbGx5OgogCi0gICogVGhlIG5hbWUgcGFyYW1ldGVyIHBhc3NlZCBpbiB0byA6Y2Z1bmM6YFB5Q2Fwc3VsZV9OZXdgIGlzIGlnbm9yZWQuCisgICogVGhlIG5hbWUgcGFyYW1ldGVyIHBhc3NlZCBpbiB0byA6YzpmdW5jOmBQeUNhcHN1bGVfTmV3YCBpcyBpZ25vcmVkLgogCi0gICogVGhlIG5hbWUgcGFyYW1ldGVyIHBhc3NlZCBpbiB0byA6Y2Z1bmM6YFB5Q2Fwc3VsZV9Jc1ZhbGlkYCBhbmQKLSAgICA6Y2Z1bmM6YFB5Q2Fwc3VsZV9HZXRQb2ludGVyYCBpcyBpZ25vcmVkLCBhbmQgbm8gZXJyb3IgY2hlY2tpbmcKKyAgKiBUaGUgbmFtZSBwYXJhbWV0ZXIgcGFzc2VkIGluIHRvIDpjOmZ1bmM6YFB5Q2Fwc3VsZV9Jc1ZhbGlkYCBhbmQKKyAgICA6YzpmdW5jOmBQeUNhcHN1bGVfR2V0UG9pbnRlcmAgaXMgaWdub3JlZCwgYW5kIG5vIGVycm9yIGNoZWNraW5nCiAgICAgb2YgdGhlIG5hbWUgaXMgcGVyZm9ybWVkLgogCi0gICogOmNmdW5jOmBQeUNhcHN1bGVfR2V0TmFtZWAgYWx3YXlzIHJldHVybnMgTlVMTC4KKyAgKiA6YzpmdW5jOmBQeUNhcHN1bGVfR2V0TmFtZWAgYWx3YXlzIHJldHVybnMgTlVMTC4KIAotICAqIDpjZnVuYzpgUHlDYXBzdWxlX1NldE5hbWVgIGFsd2F5cyB0aHJvd3MgYW4gZXhjZXB0aW9uIGFuZAorICAqIDpjOmZ1bmM6YFB5Q2Fwc3VsZV9TZXROYW1lYCBhbHdheXMgcmFpc2VzIGFuIGV4Y2VwdGlvbiBhbmQKICAgICByZXR1cm5zIGZhaWx1cmUuICAoU2luY2UgdGhlcmUncyBubyB3YXkgdG8gc3RvcmUgYSBuYW1lCi0gICAgaW4gYSBDT2JqZWN0LCBub2lzeSBmYWlsdXJlIG9mIDpjZnVuYzpgUHlDYXBzdWxlX1NldE5hbWVgCisgICAgaW4gYSBDT2JqZWN0LCBub2lzeSBmYWlsdXJlIG9mIDpjOmZ1bmM6YFB5Q2Fwc3VsZV9TZXROYW1lYAogICAgIHdhcyBkZWVtZWQgcHJlZmVyYWJsZSB0byBzaWxlbnQgZmFpbHVyZSBoZXJlLiAgSWYgdGhpcyBpcwotICAgIGluY29udmVpZW50LCBmZWVsIGZyZWUgdG8gbW9kaWZ5IHlvdXIgbG9jYWwKKyAgICBpbmNvbnZlbmllbnQsIGZlZWwgZnJlZSB0byBtb2RpZnkgeW91ciBsb2NhbAogICAgIGNvcHkgYXMgeW91IHNlZSBmaXQuKQogCiBZb3UgY2FuIGZpbmQgOmZpbGU6YGNhcHN1bGV0aHVuay5oYCBpbiB0aGUgUHl0aG9uIHNvdXJjZSBkaXN0cmlidXRpb24KLWluIHRoZSA6ZmlsZTpgRG9jL2luY2x1ZGVzYCBkaXJlY3RvcnkuICBXZSBhbHNvIGluY2x1ZGUgaXQgaGVyZSBmb3IKLXlvdXIgcmVmZXJlbmNlOyBoZXJlIGlzIDpmaWxlOmBjYXBzdWxldGh1bmsuaGA6CithcyA6c291cmNlOmBEb2MvaW5jbHVkZXMvY2Fwc3VsZXRodW5rLmhgLiAgV2UgYWxzbyBpbmNsdWRlIGl0IGhlcmUgZm9yCit5b3VyIGNvbnZlbmllbmNlOgogCiAuLiBsaXRlcmFsaW5jbHVkZTo6IC4uL2luY2x1ZGVzL2NhcHN1bGV0aHVuay5oCiAKQEAgLTI2Niw1ICsyNTQsNSBAQAogCiBJZiB5b3UgYXJlIHdyaXRpbmcgYSBuZXcgZXh0ZW5zaW9uIG1vZHVsZSwgeW91IG1pZ2h0IGNvbnNpZGVyIGBDeXRob24KIDxodHRwOi8vd3d3LmN5dGhvbi5vcmc+YF8uICBJdCB0cmFuc2xhdGVzIGEgUHl0aG9uLWxpa2UgbGFuZ3VhZ2UgdG8gQy4gIFRoZQotZXh0ZW5zaW9uIG1vZHVsZXMgaXQgY3JlYXRlcyBhcmUgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAzLnggYW5kIDIueC4KK2V4dGVuc2lvbiBtb2R1bGVzIGl0IGNyZWF0ZXMgYXJlIGNvbXBhdGlibGUgd2l0aCBQeXRob24gMyBhbmQgUHl0aG9uIDIuCiAKZGlmZiAtLWdpdCBhL0RvYy9ob3d0by9jdXJzZXMucnN0IGIvRG9jL2hvd3RvL2N1cnNlcy5yc3QKaW5kZXggNzFlNjQwYy4uNzRjMWYyYSAxMDA2NDQKLS0tIGEvRG9jL2hvd3RvL2N1cnNlcy5yc3QKKysrIGIvRG9jL2hvd3RvL2N1cnNlcy5yc3QKQEAgLTExOCw3ICsxMTgsNyBAQAogQSBjb21tb24gcHJvYmxlbSB3aGVuIGRlYnVnZ2luZyBhIGN1cnNlcyBhcHBsaWNhdGlvbiBpcyB0byBnZXQgeW91ciB0ZXJtaW5hbAogbWVzc2VkIHVwIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGRpZXMgd2l0aG91dCByZXN0b3JpbmcgdGhlIHRlcm1pbmFsIHRvIGl0cwogcHJldmlvdXMgc3RhdGUuICBJbiBQeXRob24gdGhpcyBjb21tb25seSBoYXBwZW5zIHdoZW4geW91ciBjb2RlIGlzIGJ1Z2d5IGFuZAotcmFpc2VzIGFuIHVuY2F1Z2h0IGV4Y2VwdGlvbi4gIEtleXMgYXJlIG5vIGxvbmdlciBiZSBlY2hvZWQgdG8gdGhlIHNjcmVlbiB3aGVuCityYWlzZXMgYW4gdW5jYXVnaHQgZXhjZXB0aW9uLiAgS2V5cyBhcmUgbm8gbG9uZ2VyIGVjaG9lZCB0byB0aGUgc2NyZWVuIHdoZW4KIHlvdSB0eXBlIHRoZW0sIGZvciBleGFtcGxlLCB3aGljaCBtYWtlcyB1c2luZyB0aGUgc2hlbGwgZGlmZmljdWx0LgogCiBJbiBQeXRob24geW91IGNhbiBhdm9pZCB0aGVzZSBjb21wbGljYXRpb25zIGFuZCBtYWtlIGRlYnVnZ2luZyBtdWNoIGVhc2llciBieQpAQCAtMTQ0LDggKzE0NCw4IEBACiB0byByZWRyYXcgb3IgY2xlYXIgdGhlbSBzZXBhcmF0ZWx5LiBUaGUgOmZ1bmM6YG5ld3dpbmAgZnVuY3Rpb24gY3JlYXRlcyBhIG5ldwogd2luZG93IG9mIGEgZ2l2ZW4gc2l6ZSwgcmV0dXJuaW5nIHRoZSBuZXcgd2luZG93IG9iamVjdC4gOjoKIAotICAgYmVnaW5feCA9IDIwIDsgYmVnaW5feSA9IDcKLSAgIGhlaWdodCA9IDUgOyB3aWR0aCA9IDQwCisgICBiZWdpbl94ID0gMjA7IGJlZ2luX3kgPSA3CisgICBoZWlnaHQgPSA1OyB3aWR0aCA9IDQwCiAgICB3aW4gPSBjdXJzZXMubmV3d2luKGhlaWdodCwgd2lkdGgsIGJlZ2luX3ksIGJlZ2luX3gpCiAKIEEgd29yZCBhYm91dCB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gdXNlZCBpbiBjdXJzZXM6IGNvb3JkaW5hdGVzIGFyZSBhbHdheXMgcGFzc2VkCkBAIC0xODQsMTEgKzE4NCwxMyBAQAogICAgIyBleHBsYWluZWQgaW4gdGhlIG5leHQgc2VjdGlvbgogICAgZm9yIHkgaW4gcmFuZ2UoMCwgMTAwKToKICAgICAgICBmb3IgeCBpbiByYW5nZSgwLCAxMDApOgotICAgICAgICAgICB0cnk6IHBhZC5hZGRjaCh5LHgsIG9yZCgnYScpICsgKHgqeCt5KnkpICUgMjYgKQotICAgICAgICAgICBleGNlcHQgY3Vyc2VzLmVycm9yOiBwYXNzCisgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgIHBhZC5hZGRjaCh5LHgsIG9yZCgnYScpICsgKHgqeCt5KnkpICUgMjYpCisgICAgICAgICAgIGV4Y2VwdCBjdXJzZXMuZXJyb3I6CisgICAgICAgICAgICAgICBwYXNzCiAKICAgICMgIERpc3BsYXlzIGEgc2VjdGlvbiBvZiB0aGUgcGFkIGluIHRoZSBtaWRkbGUgb2YgdGhlIHNjcmVlbgotICAgcGFkLnJlZnJlc2goIDAsMCwgNSw1LCAyMCw3NSkKKyAgIHBhZC5yZWZyZXNoKDAsMCwgNSw1LCAyMCw3NSkKIAogVGhlIDpmdW5jOmByZWZyZXNoYCBjYWxsIGRpc3BsYXlzIGEgc2VjdGlvbiBvZiB0aGUgcGFkIGluIHRoZSByZWN0YW5nbGUKIGV4dGVuZGluZyBmcm9tIGNvb3JkaW5hdGUgKDUsNSkgdG8gY29vcmRpbmF0ZSAoMjAsNzUpIG9uIHRoZSBzY3JlZW47IHRoZSB1cHBlcgpAQCAtMjcxLDcgKzI3Myw3IEBACiBoaWdobGlnaHQgY2VydGFpbiB3b3Jkcy4gIGN1cnNlcyBzdXBwb3J0cyB0aGlzIGJ5IGFsbG93aW5nIHlvdSB0byBzcGVjaWZ5IGFuCiBhdHRyaWJ1dGUgZm9yIGVhY2ggY2VsbCBvbiB0aGUgc2NyZWVuLgogCi1BbiBhdHRyaWJ1dGUgaXMgYSBpbnRlZ2VyLCBlYWNoIGJpdCByZXByZXNlbnRpbmcgYSBkaWZmZXJlbnQgYXR0cmlidXRlLiAgWW91IGNhbgorQW4gYXR0cmlidXRlIGlzIGFuIGludGVnZXIsIGVhY2ggYml0IHJlcHJlc2VudGluZyBhIGRpZmZlcmVudCBhdHRyaWJ1dGUuICBZb3UgY2FuCiB0cnkgdG8gZGlzcGxheSB0ZXh0IHdpdGggbXVsdGlwbGUgYXR0cmlidXRlIGJpdHMgc2V0LCBidXQgY3Vyc2VzIGRvZXNuJ3QKIGd1YXJhbnRlZSB0aGF0IGFsbCB0aGUgcG9zc2libGUgY29tYmluYXRpb25zIGFyZSBhdmFpbGFibGUsIG9yIHRoYXQgdGhleSdyZSBhbGwKIHZpc3VhbGx5IGRpc3RpbmN0LiAgVGhhdCBkZXBlbmRzIG9uIHRoZSBhYmlsaXR5IG9mIHRoZSB0ZXJtaW5hbCBiZWluZyB1c2VkLCBzbwpAQCAtMzAwLDcgKzMwMiw3IEBACiAgICAgICAgICAgICAgICAgIGN1cnNlcy5BX1JFVkVSU0UpCiAgICBzdGRzY3IucmVmcmVzaCgpCiAKLVRoZSBjdXJzZXMgbGlicmFyeSBhbHNvIHN1cHBvcnRzIGNvbG9yIG9uIHRob3NlIHRlcm1pbmFscyB0aGF0IHByb3ZpZGUgaXQsIFRoZQorVGhlIGN1cnNlcyBsaWJyYXJ5IGFsc28gc3VwcG9ydHMgY29sb3Igb24gdGhvc2UgdGVybWluYWxzIHRoYXQgcHJvdmlkZSBpdC4gVGhlCiBtb3N0IGNvbW1vbiBzdWNoIHRlcm1pbmFsIGlzIHByb2JhYmx5IHRoZSBMaW51eCBjb25zb2xlLCBmb2xsb3dlZCBieSBjb2xvcgogeHRlcm1zLgogCkBAIC0zMjEsNyArMzIzLDcgQEAKIAogQW4gZXhhbXBsZSwgd2hpY2ggZGlzcGxheXMgYSBsaW5lIG9mIHRleHQgdXNpbmcgY29sb3IgcGFpciAxOjoKIAotICAgc3Rkc2NyLmFkZHN0ciggIlByZXR0eSB0ZXh0IiwgY3Vyc2VzLmNvbG9yX3BhaXIoMSkgKQorICAgc3Rkc2NyLmFkZHN0cigiUHJldHR5IHRleHQiLCBjdXJzZXMuY29sb3JfcGFpcigxKSkKICAgIHN0ZHNjci5yZWZyZXNoKCkKIAogQXMgSSBzYWlkIGJlZm9yZSwgYSBjb2xvciBwYWlyIGNvbnNpc3RzIG9mIGEgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvci4KQEAgLTM0Myw3ICszNDUsNyBAQAogd2lsbCBjaGFuZ2UgdG8gdGhlIG5ldyBjb2xvcnMuICBZb3UgY2FuIGFsc28gZGlzcGxheSBuZXcgdGV4dCBpbiB0aGlzIGNvbG9yCiB3aXRoOjoKIAotICAgc3Rkc2NyLmFkZHN0cigwLDAsICJSRUQgQUxFUlQhIiwgY3Vyc2VzLmNvbG9yX3BhaXIoMSkgKQorICAgc3Rkc2NyLmFkZHN0cigwLDAsICJSRUQgQUxFUlQhIiwgY3Vyc2VzLmNvbG9yX3BhaXIoMSkpCiAKIFZlcnkgZmFuY3kgdGVybWluYWxzIGNhbiBjaGFuZ2UgdGhlIGRlZmluaXRpb25zIG9mIHRoZSBhY3R1YWwgY29sb3JzIHRvIGEgZ2l2ZW4KIFJHQiB2YWx1ZS4gIFRoaXMgbGV0cyB5b3UgY2hhbmdlIGNvbG9yIDEsIHdoaWNoIGlzIHVzdWFsbHkgcmVkLCB0byBwdXJwbGUgb3IKQEAgLTM4MSw5ICszODMsMTIgQEAKIAogICAgd2hpbGUgMToKICAgICAgICBjID0gc3Rkc2NyLmdldGNoKCkKLSAgICAgICBpZiBjID09IG9yZCgncCcpOiBQcmludERvY3VtZW50KCkKLSAgICAgICBlbGlmIGMgPT0gb3JkKCdxJyk6IGJyZWFrICAjIEV4aXQgdGhlIHdoaWxlKCkKLSAgICAgICBlbGlmIGMgPT0gY3Vyc2VzLktFWV9IT01FOiB4ID0geSA9IDAKKyAgICAgICBpZiBjID09IG9yZCgncCcpOgorICAgICAgICAgICBQcmludERvY3VtZW50KCkKKyAgICAgICBlbGlmIGMgPT0gb3JkKCdxJyk6CisgICAgICAgICAgIGJyZWFrICAjIEV4aXQgdGhlIHdoaWxlKCkKKyAgICAgICBlbGlmIGMgPT0gY3Vyc2VzLktFWV9IT01FOgorICAgICAgICAgICB4ID0geSA9IDAKIAogVGhlIDptb2Q6YGN1cnNlcy5hc2NpaWAgbW9kdWxlIHN1cHBsaWVzIEFTQ0lJIGNsYXNzIG1lbWJlcnNoaXAgZnVuY3Rpb25zIHRoYXQKIHRha2UgZWl0aGVyIGludGVnZXIgb3IgMS1jaGFyYWN0ZXItc3RyaW5nIGFyZ3VtZW50czsgdGhlc2UgbWF5IGJlIHVzZWZ1bCBpbgpAQCAtNDMzLDQgKzQzOCwzIEBACiBhbm90aGVyIGRlbW8uICBXZSBjYW4gYWx3YXlzIHVzZSBtb3JlIG9mIHRoZW0hCiAKIFRoZSBuY3Vyc2VzIEZBUTogaHR0cDovL2ludmlzaWJsZS1pc2xhbmQubmV0L25jdXJzZXMvbmN1cnNlcy5mYXEuaHRtbAotCmRpZmYgLS1naXQgYS9Eb2MvaG93dG8vZGVzY3JpcHRvci5yc3QgYi9Eb2MvaG93dG8vZGVzY3JpcHRvci5yc3QKaW5kZXggNzhjMTQzOS4uMmEzMjNjNyAxMDA2NDQKLS0tIGEvRG9jL2hvd3RvL2Rlc2NyaXB0b3IucnN0CisrKyBiL0RvYy9ob3d0by9kZXNjcmlwdG9yLnJzdApAQCAtOTcsNyArOTcsNyBAQAogaW1wbGVtZW50YXRpb24gd29ya3MgdGhyb3VnaCBhIHByZWNlZGVuY2UgY2hhaW4gdGhhdCBnaXZlcyBkYXRhIGRlc2NyaXB0b3JzCiBwcmlvcml0eSBvdmVyIGluc3RhbmNlIHZhcmlhYmxlcywgaW5zdGFuY2UgdmFyaWFibGVzIHByaW9yaXR5IG92ZXIgbm9uLWRhdGEKIGRlc2NyaXB0b3JzLCBhbmQgYXNzaWducyBsb3dlc3QgcHJpb3JpdHkgdG8gOm1ldGg6YF9fZ2V0YXR0cl9fYCBpZiBwcm92aWRlZC4gIFRoZQotZnVsbCBDIGltcGxlbWVudGF0aW9uIGNhbiBiZSBmb3VuZCBpbiA6Y2Z1bmM6YFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyKClgIGluCitmdWxsIEMgaW1wbGVtZW50YXRpb24gY2FuIGJlIGZvdW5kIGluIDpjOmZ1bmM6YFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyKClgIGluCiBgT2JqZWN0cy9vYmplY3QuYyA8aHR0cDovL3N2bi5weXRob24ub3JnL3ZpZXcvcHl0aG9uL3RydW5rL09iamVjdHMvb2JqZWN0LmM/dmlldz1tYXJrdXA+YF9cLgogCiBGb3IgY2xhc3NlcywgdGhlIG1hY2hpbmVyeSBpcyBpbiA6bWV0aDpgdHlwZS5fX2dldGF0dHJpYnV0ZV9fYCB3aGljaCB0cmFuc2Zvcm1zCkBAIC0xMjQsMTQgKzEyNCwxNCBAQAogVGhlIG9iamVjdCByZXR1cm5lZCBieSBgYHN1cGVyKClgYCBhbHNvIGhhcyBhIGN1c3RvbSA6bWV0aDpgX19nZXRhdHRyaWJ1dGVfX2AKIG1ldGhvZCBmb3IgaW52b2tpbmcgZGVzY3JpcHRvcnMuICBUaGUgY2FsbCBgYHN1cGVyKEIsIG9iaikubSgpYGAgc2VhcmNoZXMKIGBgb2JqLl9fY2xhc3NfXy5fX21yb19fYGAgZm9yIHRoZSBiYXNlIGNsYXNzIGBgQWBgIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBgYEJgYAotYW5kIHRoZW4gcmV0dXJucyBgYEEuX19kaWN0X19bJ20nXS5fX2dldF9fKG9iaiwgQSlgYC4gIElmIG5vdCBhIGRlc2NyaXB0b3IsCithbmQgdGhlbiByZXR1cm5zIGBgQS5fX2RpY3RfX1snbSddLl9fZ2V0X18ob2JqLCBCKWBgLiAgSWYgbm90IGEgZGVzY3JpcHRvciwKIGBgbWBgIGlzIHJldHVybmVkIHVuY2hhbmdlZC4gIElmIG5vdCBpbiB0aGUgZGljdGlvbmFyeSwgYGBtYGAgcmV2ZXJ0cyB0byBhCiBzZWFyY2ggdXNpbmcgOm1ldGg6YG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fYC4KIAogTm90ZSwgaW4gUHl0aG9uIDIuMiwgYGBzdXBlcihCLCBvYmopLm0oKWBgIHdvdWxkIG9ubHkgaW52b2tlIDptZXRoOmBfX2dldF9fYCBpZgogYGBtYGAgd2FzIGEgZGF0YSBkZXNjcmlwdG9yLiAgSW4gUHl0aG9uIDIuMywgbm9uLWRhdGEgZGVzY3JpcHRvcnMgYWxzbyBnZXQKIGludm9rZWQgdW5sZXNzIGFuIG9sZC1zdHlsZSBjbGFzcyBpcyBpbnZvbHZlZC4gIFRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGFyZQotaW4gOmNmdW5jOmBzdXBlcl9nZXRhdHRybygpYCBpbgoraW4gOmM6ZnVuYzpgc3VwZXJfZ2V0YXR0cm8oKWAgaW4KIGBPYmplY3RzL3R5cGVvYmplY3QuYyA8aHR0cDovL3N2bi5weXRob24ub3JnL3ZpZXcvcHl0aG9uL3RydW5rL09iamVjdHMvdHlwZW9iamVjdC5jP3ZpZXc9bWFya3VwPmBfCiBhbmQgYSBwdXJlIFB5dGhvbiBlcXVpdmFsZW50IGNhbiBiZSBmb3VuZCBpbiBgR3VpZG8ncyBUdXRvcmlhbGBfLgogCkBAIC0xNjcsNyArMTY3LDcgQEAKICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbAogCiAgICAgICAgIGRlZiBfX3NldF9fKHNlbGYsIG9iaiwgdmFsKToKLSAgICAgICAgICAgIHByaW50ICdVcGRhdGluZycgLCBzZWxmLm5hbWUKKyAgICAgICAgICAgIHByaW50ICdVcGRhdGluZycsIHNlbGYubmFtZQogICAgICAgICAgICAgc2VsZi52YWwgPSB2YWwKIAogICAgID4+PiBjbGFzcyBNeUNsYXNzKG9iamVjdCk6CkBAIC0yMTgsMjUgKzIxOCwzNiBAQAogICAgICAgICAgICAgc2VsZi5mZ2V0ID0gZmdldAogICAgICAgICAgICAgc2VsZi5mc2V0ID0gZnNldAogICAgICAgICAgICAgc2VsZi5mZGVsID0gZmRlbAorICAgICAgICAgICAgaWYgZG9jIGlzIE5vbmUgYW5kIGZnZXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgZG9jID0gZmdldC5fX2RvY19fCiAgICAgICAgICAgICBzZWxmLl9fZG9jX18gPSBkb2MKIAogICAgICAgICBkZWYgX19nZXRfXyhzZWxmLCBvYmosIG9ianR5cGU9Tm9uZSk6CiAgICAgICAgICAgICBpZiBvYmogaXMgTm9uZToKICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgogICAgICAgICAgICAgaWYgc2VsZi5mZ2V0IGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsICJ1bnJlYWRhYmxlIGF0dHJpYnV0ZSIKKyAgICAgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcigidW5yZWFkYWJsZSBhdHRyaWJ1dGUiKQogICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmdldChvYmopCiAKICAgICAgICAgZGVmIF9fc2V0X18oc2VsZiwgb2JqLCB2YWx1ZSk6CiAgICAgICAgICAgICBpZiBzZWxmLmZzZXQgaXMgTm9uZToKLSAgICAgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgImNhbid0IHNldCBhdHRyaWJ1dGUiCisgICAgICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoImNhbid0IHNldCBhdHRyaWJ1dGUiKQogICAgICAgICAgICAgc2VsZi5mc2V0KG9iaiwgdmFsdWUpCiAKICAgICAgICAgZGVmIF9fZGVsZXRlX18oc2VsZiwgb2JqKToKICAgICAgICAgICAgIGlmIHNlbGYuZmRlbCBpcyBOb25lOgotICAgICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yLCAiY2FuJ3QgZGVsZXRlIGF0dHJpYnV0ZSIKKyAgICAgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcigiY2FuJ3QgZGVsZXRlIGF0dHJpYnV0ZSIpCiAgICAgICAgICAgICBzZWxmLmZkZWwob2JqKQogCisgICAgICAgIGRlZiBnZXR0ZXIoc2VsZiwgZmdldCk6CisgICAgICAgICAgICByZXR1cm4gdHlwZShzZWxmKShmZ2V0LCBzZWxmLmZzZXQsIHNlbGYuZmRlbCwgc2VsZi5fX2RvY19fKQorCisgICAgICAgIGRlZiBzZXR0ZXIoc2VsZiwgZnNldCk6CisgICAgICAgICAgICByZXR1cm4gdHlwZShzZWxmKShzZWxmLmZnZXQsIGZzZXQsIHNlbGYuZmRlbCwgc2VsZi5fX2RvY19fKQorCisgICAgICAgIGRlZiBkZWxldGVyKHNlbGYsIGZkZWwpOgorICAgICAgICAgICAgcmV0dXJuIHR5cGUoc2VsZikoc2VsZi5mZ2V0LCBzZWxmLmZzZXQsIGZkZWwsIHNlbGYuX19kb2NfXykKKwogVGhlIDpmdW5jOmBwcm9wZXJ0eWAgYnVpbHRpbiBoZWxwcyB3aGVuZXZlciBhIHVzZXIgaW50ZXJmYWNlIGhhcyBncmFudGVkCiBhdHRyaWJ1dGUgYWNjZXNzIGFuZCB0aGVuIHN1YnNlcXVlbnQgY2hhbmdlcyByZXF1aXJlIHRoZSBpbnRlcnZlbnRpb24gb2YgYQogbWV0aG9kLgpAQCAtMjk3LDcgKzMwOCw3IEBACiAKIFRoZSBvdXRwdXQgc3VnZ2VzdHMgdGhhdCBib3VuZCBhbmQgdW5ib3VuZCBtZXRob2RzIGFyZSB0d28gZGlmZmVyZW50IHR5cGVzLgogV2hpbGUgdGhleSBjb3VsZCBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgdGhhdCB3YXksIHRoZSBhY3R1YWwgQyBpbXBsZW1lbnRhdGlvbiBvZgotOmN0eXBlOmBQeU1ldGhvZF9UeXBlYCBpbgorOmM6dHlwZTpgUHlNZXRob2RfVHlwZWAgaW4KIGBPYmplY3RzL2NsYXNzb2JqZWN0LmMgPGh0dHA6Ly9zdm4ucHl0aG9uLm9yZy92aWV3L3B5dGhvbi90cnVuay9PYmplY3RzL2NsYXNzb2JqZWN0LmM/dmlldz1tYXJrdXA+YF8KIGlzIGEgc2luZ2xlIG9iamVjdCB3aXRoIHR3byBkaWZmZXJlbnQgcmVwcmVzZW50YXRpb25zIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZQogOmF0dHI6YGltX3NlbGZgIGZpZWxkIGlzIHNldCBvciBpcyAqTlVMTCogKHRoZSBDIGVxdWl2YWxlbnQgb2YgKk5vbmUqKS4KQEAgLTM5OCw3ICs0MDksNyBAQAogOmZ1bmM6YGRpY3QuZnJvbWtleXNgIGNyZWF0ZXMgYSBuZXcgZGljdGlvbmFyeSBmcm9tIGEgbGlzdCBvZiBrZXlzLiAgVGhlIHB1cmUKIFB5dGhvbiBlcXVpdmFsZW50IGlzOjoKIAotICAgIGNsYXNzIERpY3Q6CisgICAgY2xhc3MgRGljdChvYmplY3QpOgogICAgICAgICAuIC4gLgogICAgICAgICBkZWYgZnJvbWtleXMoa2xhc3MsIGl0ZXJhYmxlLCB2YWx1ZT1Ob25lKToKICAgICAgICAgICAgICJFbXVsYXRlIGRpY3RfZnJvbWtleXMoKSBpbiBPYmplY3RzL2RpY3RvYmplY3QuYyIKZGlmZiAtLWdpdCBhL0RvYy9ob3d0by9mdW5jdGlvbmFsLnJzdCBiL0RvYy9ob3d0by9mdW5jdGlvbmFsLnJzdAppbmRleCA0YWUyMTZhLi5jNmQ2YTU2IDEwMDY0NAotLS0gYS9Eb2MvaG93dG8vZnVuY3Rpb25hbC5yc3QKKysrIGIvRG9jL2hvd3RvL2Z1bmN0aW9uYWwucnN0CkBAIC00NCwxNSArNDQsMTQgQEAKICAgZnVuY3Rpb25hbCBsYW5ndWFnZXMgaW5jbHVkZSB0aGUgTUwgZmFtaWx5IChTdGFuZGFyZCBNTCwgT0NhbWwsIGFuZCBvdGhlcgogICB2YXJpYW50cykgYW5kIEhhc2tlbGwuCiAKLVRoZSBkZXNpZ25lcnMgb2Ygc29tZSBjb21wdXRlciBsYW5ndWFnZXMgY2hvb3NlIHRvIGVtcGhhc2l6ZSBvbmUKLXBhcnRpY3VsYXIgYXBwcm9hY2ggdG8gcHJvZ3JhbW1pbmcuICBUaGlzIG9mdGVuIG1ha2VzIGl0IGRpZmZpY3VsdCB0bwotd3JpdGUgcHJvZ3JhbXMgdGhhdCB1c2UgYSBkaWZmZXJlbnQgYXBwcm9hY2guICBPdGhlciBsYW5ndWFnZXMgYXJlCi1tdWx0aS1wYXJhZGlnbSBsYW5ndWFnZXMgdGhhdCBzdXBwb3J0IHNldmVyYWwgZGlmZmVyZW50IGFwcHJvYWNoZXMuCi1MaXNwLCBDKyssIGFuZCBQeXRob24gYXJlIG11bHRpLXBhcmFkaWdtOyB5b3UgY2FuIHdyaXRlIHByb2dyYW1zIG9yCi1saWJyYXJpZXMgdGhhdCBhcmUgbGFyZ2VseSBwcm9jZWR1cmFsLCBvYmplY3Qtb3JpZW50ZWQsIG9yIGZ1bmN0aW9uYWwKLWluIGFsbCBvZiB0aGVzZSBsYW5ndWFnZXMuICBJbiBhIGxhcmdlIHByb2dyYW0sIGRpZmZlcmVudCBzZWN0aW9ucwotbWlnaHQgYmUgd3JpdHRlbiB1c2luZyBkaWZmZXJlbnQgYXBwcm9hY2hlczsgdGhlIEdVSSBtaWdodCBiZQotb2JqZWN0LW9yaWVudGVkIHdoaWxlIHRoZSBwcm9jZXNzaW5nIGxvZ2ljIGlzIHByb2NlZHVyYWwgb3IKK1RoZSBkZXNpZ25lcnMgb2Ygc29tZSBjb21wdXRlciBsYW5ndWFnZXMgY2hvb3NlIHRvIGVtcGhhc2l6ZSBvbmUgcGFydGljdWxhcgorYXBwcm9hY2ggdG8gcHJvZ3JhbW1pbmcuICBUaGlzIG9mdGVuIG1ha2VzIGl0IGRpZmZpY3VsdCB0byB3cml0ZSBwcm9ncmFtcyB0aGF0Cit1c2UgYSBkaWZmZXJlbnQgYXBwcm9hY2guICBPdGhlciBsYW5ndWFnZXMgYXJlIG11bHRpLXBhcmFkaWdtIGxhbmd1YWdlcyB0aGF0CitzdXBwb3J0IHNldmVyYWwgZGlmZmVyZW50IGFwcHJvYWNoZXMuICBMaXNwLCBDKyssIGFuZCBQeXRob24gYXJlCittdWx0aS1wYXJhZGlnbTsgeW91IGNhbiB3cml0ZSBwcm9ncmFtcyBvciBsaWJyYXJpZXMgdGhhdCBhcmUgbGFyZ2VseQorcHJvY2VkdXJhbCwgb2JqZWN0LW9yaWVudGVkLCBvciBmdW5jdGlvbmFsIGluIGFsbCBvZiB0aGVzZSBsYW5ndWFnZXMuICBJbiBhCitsYXJnZSBwcm9ncmFtLCBkaWZmZXJlbnQgc2VjdGlvbnMgbWlnaHQgYmUgd3JpdHRlbiB1c2luZyBkaWZmZXJlbnQgYXBwcm9hY2hlczsKK3RoZSBHVUkgbWlnaHQgYmUgb2JqZWN0LW9yaWVudGVkIHdoaWxlIHRoZSBwcm9jZXNzaW5nIGxvZ2ljIGlzIHByb2NlZHVyYWwgb3IKIGZ1bmN0aW9uYWwsIGZvciBleGFtcGxlLgogCiBJbiBhIGZ1bmN0aW9uYWwgcHJvZ3JhbSwgaW5wdXQgZmxvd3MgdGhyb3VnaCBhIHNldCBvZiBmdW5jdGlvbnMuIEVhY2ggZnVuY3Rpb24KQEAgLTI0NSw5ICsyNDQsOSBAQAogaXRlcmF0b3IgYXJndW1lbnQgYW5kIHdpbGwgcmV0dXJuIHRoZSBsYXJnZXN0IG9yIHNtYWxsZXN0IGVsZW1lbnQuICBUaGUgYGAiaW4iYGAKIGFuZCBgYCJub3QgaW4iYGAgb3BlcmF0b3JzIGFsc28gc3VwcG9ydCBpdGVyYXRvcnM6IGBgWCBpbiBpdGVyYXRvcmBgIGlzIHRydWUgaWYKIFggaXMgZm91bmQgaW4gdGhlIHN0cmVhbSByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IuICBZb3UnbGwgcnVuIGludG8gb2J2aW91cwotcHJvYmxlbXMgaWYgdGhlIGl0ZXJhdG9yIGlzIGluZmluaXRlOyBgYG1heCgpYGAsIGBgbWluKClgYCwgYW5kIGBgIm5vdCBpbiJgYAorcHJvYmxlbXMgaWYgdGhlIGl0ZXJhdG9yIGlzIGluZmluaXRlOyBgYG1heCgpYGAsIGBgbWluKClgYAogd2lsbCBuZXZlciByZXR1cm4sIGFuZCBpZiB0aGUgZWxlbWVudCBYIG5ldmVyIGFwcGVhcnMgaW4gdGhlIHN0cmVhbSwgdGhlCi1gYCJpbiJgYCBvcGVyYXRvciB3b24ndCByZXR1cm4gZWl0aGVyLgorYGAiaW4iYGAgYW5kIGBgIm5vdCBpbiJgYCBvcGVyYXRvcnMgd29uJ3QgcmV0dXJuIGVpdGhlci4KIAogTm90ZSB0aGF0IHlvdSBjYW4gb25seSBnbyBmb3J3YXJkIGluIGFuIGl0ZXJhdG9yOyB0aGVyZSdzIG5vIHdheSB0byBnZXQgdGhlCiBwcmV2aW91cyBlbGVtZW50LCByZXNldCB0aGUgaXRlcmF0b3IsIG9yIG1ha2UgYSBjb3B5IG9mIGl0LiAgSXRlcmF0b3Igb2JqZWN0cwpAQCAtNTg4LDcgKzU4Nyw4IEBACiAKIEJlY2F1c2UgYGB5aWVsZGBgIHdpbGwgb2Z0ZW4gYmUgcmV0dXJuaW5nIGBgTm9uZWBgLCB5b3Ugc2hvdWxkIGFsd2F5cyBjaGVjayBmb3IKIHRoaXMgY2FzZS4gIERvbid0IGp1c3QgdXNlIGl0cyB2YWx1ZSBpbiBleHByZXNzaW9ucyB1bmxlc3MgeW91J3JlIHN1cmUgdGhhdCB0aGUKLWBgc2VuZCgpYGAgbWV0aG9kIHdpbGwgYmUgdGhlIG9ubHkgbWV0aG9kIHVzZWQgcmVzdW1lIHlvdXIgZ2VuZXJhdG9yIGZ1bmN0aW9uLgorYGBzZW5kKClgYCBtZXRob2Qgd2lsbCBiZSB0aGUgb25seSBtZXRob2QgdXNlZCB0byByZXN1bWUgeW91ciBnZW5lcmF0b3IKK2Z1bmN0aW9uLgogCiBJbiBhZGRpdGlvbiB0byBgYHNlbmQoKWBgLCB0aGVyZSBhcmUgdHdvIG90aGVyIG5ldyBtZXRob2RzIG9uIGdlbmVyYXRvcnM6CiAKQEAgLTc0NCw4ICs3NDQsOCBAQAogUHl0aG9uIHdpa2kgYXQgaHR0cDovL3dpa2kucHl0aG9uLm9yZy9tb2luL0hvd1RvL1NvcnRpbmcuKQogCiBUaGUgYGBhbnkoaXRlcilgYCBhbmQgYGBhbGwoaXRlcilgYCBidWlsdC1pbnMgbG9vayBhdCB0aGUgdHJ1dGggdmFsdWVzIG9mIGFuCi1pdGVyYWJsZSdzIGNvbnRlbnRzLiAgOmZ1bmM6YGFueWAgcmV0dXJucyBUcnVlIGlmIGFueSBlbGVtZW50IGluIHRoZSBpdGVyYWJsZSBpcwotYSB0cnVlIHZhbHVlLCBhbmQgOmZ1bmM6YGFsbGAgcmV0dXJucyBUcnVlIGlmIGFsbCBvZiB0aGUgZWxlbWVudHMgYXJlIHRydWUKK2l0ZXJhYmxlJ3MgY29udGVudHMuICA6ZnVuYzpgYW55YCByZXR1cm5zIGBgVHJ1ZWBgIGlmIGFueSBlbGVtZW50IGluIHRoZSBpdGVyYWJsZSBpcworYSB0cnVlIHZhbHVlLCBhbmQgOmZ1bmM6YGFsbGAgcmV0dXJucyBgYFRydWVgYCBpZiBhbGwgb2YgdGhlIGVsZW1lbnRzIGFyZSB0cnVlCiB2YWx1ZXM6CiAKICAgICA+Pj4gYW55KFswLDEsMF0pCkBAIC0xMTE1LDEzMiArMTExNSw2IEBACiBDb25zdWx0IHRoZSBvcGVyYXRvciBtb2R1bGUncyBkb2N1bWVudGF0aW9uIGZvciBhIGNvbXBsZXRlIGxpc3QuCiAKIAotCi1UaGUgZnVuY3Rpb25hbCBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Db2xsaW4gV2ludGVyJ3MgYGZ1bmN0aW9uYWwgbW9kdWxlIDxodHRwOi8vb2Frd2ludGVyLmNvbS9jb2RlL2Z1bmN0aW9uYWwvPmBfXwotcHJvdmlkZXMgYSBudW1iZXIgb2YgbW9yZSBhZHZhbmNlZCB0b29scyBmb3IgZnVuY3Rpb25hbCBwcm9ncmFtbWluZy4gSXQgYWxzbwotcmVpbXBsZW1lbnRzIHNldmVyYWwgUHl0aG9uIGJ1aWx0LWlucywgdHJ5aW5nIHRvIG1ha2UgdGhlbSBtb3JlIGludHVpdGl2ZSB0bwotdGhvc2UgdXNlZCB0byBmdW5jdGlvbmFsIHByb2dyYW1taW5nIGluIG90aGVyIGxhbmd1YWdlcy4KLQotVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGFuIGludHJvZHVjdGlvbiB0byBzb21lIG9mIHRoZSBtb3N0IGltcG9ydGFudCBmdW5jdGlvbnMgaW4KLWBgZnVuY3Rpb25hbGBgOyBmdWxsIGRvY3VtZW50YXRpb24gY2FuIGJlIGZvdW5kIGF0IGB0aGUgcHJvamVjdCdzIHdlYnNpdGUKLTxodHRwOi8vb2Frd2ludGVyLmNvbS9jb2RlL2Z1bmN0aW9uYWwvZG9jdW1lbnRhdGlvbi8+YF9fLgotCi1gYGNvbXBvc2Uob3V0ZXIsIGlubmVyLCB1bnBhY2s9RmFsc2UpYGAKLQotVGhlIGBgY29tcG9zZSgpYGAgZnVuY3Rpb24gaW1wbGVtZW50cyBmdW5jdGlvbiBjb21wb3NpdGlvbi4gIEluIG90aGVyIHdvcmRzLCBpdAotcmV0dXJucyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBgYG91dGVyYGAgYW5kIGBgaW5uZXJgYCBjYWxsYWJsZXMsIHN1Y2ggdGhhdCB0aGUKLXJldHVybiB2YWx1ZSBmcm9tIGBgaW5uZXJgYCBpcyBmZWQgZGlyZWN0bHkgdG8gYGBvdXRlcmBgLiAgVGhhdCBpcywgOjoKLQotICAgID4+PiBkZWYgYWRkKGEsIGIpOgotICAgIC4uLiAgICAgcmV0dXJuIGEgKyBiCi0gICAgLi4uCi0gICAgPj4+IGRlZiBkb3VibGUoYSk6Ci0gICAgLi4uICAgICByZXR1cm4gMiAqIGEKLSAgICAuLi4KLSAgICA+Pj4gY29tcG9zZShkb3VibGUsIGFkZCkoNSwgNikKLSAgICAyMgotCi1pcyBlcXVpdmFsZW50IHRvIDo6Ci0KLSAgICA+Pj4gZG91YmxlKGFkZCg1LCA2KSkKLSAgICAyMgotCi1UaGUgYGB1bnBhY2tgYCBrZXl3b3JkIGlzIHByb3ZpZGVkIHRvIHdvcmsgYXJvdW5kIHRoZSBmYWN0IHRoYXQgUHl0aG9uIGZ1bmN0aW9ucwotYXJlIG5vdCBhbHdheXMgYGZ1bGx5IGN1cnJpZWQgPGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ3Vycnlpbmc+YF9fLiAgQnkKLWRlZmF1bHQsIGl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIGBgaW5uZXJgYCBmdW5jdGlvbiB3aWxsIHJldHVybiBhIHNpbmdsZSBvYmplY3QKLWFuZCB0aGF0IHRoZSBgYG91dGVyYGAgZnVuY3Rpb24gd2lsbCB0YWtlIGEgc2luZ2xlIGFyZ3VtZW50LiBTZXR0aW5nIHRoZQotYGB1bnBhY2tgYCBhcmd1bWVudCBjYXVzZXMgYGBjb21wb3NlYGAgdG8gZXhwZWN0IGEgdHVwbGUgZnJvbSBgYGlubmVyYGAgd2hpY2gKLXdpbGwgYmUgZXhwYW5kZWQgYmVmb3JlIGJlaW5nIHBhc3NlZCB0byBgYG91dGVyYGAuIFB1dCBzaW1wbHksIDo6Ci0KLSAgICBjb21wb3NlKGYsIGcpKDUsIDYpCi0KLWlzIGVxdWl2YWxlbnQgdG86OgotCi0gICAgZihnKDUsIDYpKQotCi13aGlsZSA6OgotCi0gICAgY29tcG9zZShmLCBnLCB1bnBhY2s9VHJ1ZSkoNSwgNikKLQotaXMgZXF1aXZhbGVudCB0bzo6Ci0KLSAgICBmKCpnKDUsIDYpKQotCi1FdmVuIHRob3VnaCBgYGNvbXBvc2UoKWBgIG9ubHkgYWNjZXB0cyB0d28gZnVuY3Rpb25zLCBpdCdzIHRyaXZpYWwgdG8gYnVpbGQgdXAgYQotdmVyc2lvbiB0aGF0IHdpbGwgY29tcG9zZSBhbnkgbnVtYmVyIG9mIGZ1bmN0aW9ucy4gV2UnbGwgdXNlIGBgcmVkdWNlKClgYCwKLWBgY29tcG9zZSgpYGAgYW5kIGBgcGFydGlhbCgpYGAgKHRoZSBsYXN0IG9mIHdoaWNoIGlzIHByb3ZpZGVkIGJ5IGJvdGgKLWBgZnVuY3Rpb25hbGBgIGFuZCBgYGZ1bmN0b29sc2BgKS4gOjoKLQotICAgIGZyb20gZnVuY3Rpb25hbCBpbXBvcnQgY29tcG9zZSwgcGFydGlhbAotCi0gICAgbXVsdGlfY29tcG9zZSA9IHBhcnRpYWwocmVkdWNlLCBjb21wb3NlKQotCi0KLVdlIGNhbiBhbHNvIHVzZSBgYG1hcCgpYGAsIGBgY29tcG9zZSgpYGAgYW5kIGBgcGFydGlhbCgpYGAgdG8gY3JhZnQgYSB2ZXJzaW9uIG9mCi1gYCIiLmpvaW4oLi4uKWBgIHRoYXQgY29udmVydHMgaXRzIGFyZ3VtZW50cyB0byBzdHJpbmc6OgotCi0gICAgZnJvbSBmdW5jdGlvbmFsIGltcG9ydCBjb21wb3NlLCBwYXJ0aWFsCi0KLSAgICBqb2luID0gY29tcG9zZSgiIi5qb2luLCBwYXJ0aWFsKG1hcCwgc3RyKSkKLQotCi1gYGZsaXAoZnVuYylgYAotCi1gYGZsaXAoKWBgIHdyYXBzIHRoZSBjYWxsYWJsZSBpbiBgYGZ1bmNgYCBhbmQgY2F1c2VzIGl0IHRvIHJlY2VpdmUgaXRzCi1ub24ta2V5d29yZCBhcmd1bWVudHMgaW4gcmV2ZXJzZSBvcmRlci4gOjoKLQotICAgID4+PiBkZWYgdHJpcGxlKGEsIGIsIGMpOgotICAgIC4uLiAgICAgcmV0dXJuIChhLCBiLCBjKQotICAgIC4uLgotICAgID4+PiB0cmlwbGUoNSwgNiwgNykKLSAgICAoNSwgNiwgNykKLSAgICA+Pj4KLSAgICA+Pj4gZmxpcHBlZF90cmlwbGUgPSBmbGlwKHRyaXBsZSkKLSAgICA+Pj4gZmxpcHBlZF90cmlwbGUoNSwgNiwgNykKLSAgICAoNywgNiwgNSkKLQotYGBmb2xkbChmdW5jLCBzdGFydCwgaXRlcmFibGUpYGAKLQotYGBmb2xkbCgpYGAgdGFrZXMgYSBiaW5hcnkgZnVuY3Rpb24sIGEgc3RhcnRpbmcgdmFsdWUgKHVzdWFsbHkgc29tZSBraW5kIG9mCi0nemVybycpLCBhbmQgYW4gaXRlcmFibGUuICBUaGUgZnVuY3Rpb24gaXMgYXBwbGllZCB0byB0aGUgc3RhcnRpbmcgdmFsdWUgYW5kIHRoZQotZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCwgdGhlbiB0aGUgcmVzdWx0IG9mIHRoYXQgYW5kIHRoZSBzZWNvbmQgZWxlbWVudCBvZiB0aGUKLWxpc3QsIHRoZW4gdGhlIHJlc3VsdCBvZiB0aGF0IGFuZCB0aGUgdGhpcmQgZWxlbWVudCBvZiB0aGUgbGlzdCwgYW5kIHNvIG9uLgotCi1UaGlzIG1lYW5zIHRoYXQgYSBjYWxsIHN1Y2ggYXM6OgotCi0gICAgZm9sZGwoZiwgMCwgWzEsIDIsIDNdKQotCi1pcyBlcXVpdmFsZW50IHRvOjoKLQotICAgIGYoZihmKDAsIDEpLCAyKSwgMykKLQotCi1gYGZvbGRsKClgYCBpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZyByZWN1cnNpdmUgZnVuY3Rpb246OgotCi0gICAgZGVmIGZvbGRsKGZ1bmMsIHN0YXJ0LCBzZXEpOgotICAgICAgICBpZiBsZW4oc2VxKSA9PSAwOgotICAgICAgICAgICAgcmV0dXJuIHN0YXJ0Ci0KLSAgICAgICAgcmV0dXJuIGZvbGRsKGZ1bmMsIGZ1bmMoc3RhcnQsIHNlcVswXSksIHNlcVsxOl0pCi0KLVNwZWFraW5nIG9mIGVxdWl2YWxlbmNlLCB0aGUgYWJvdmUgYGBmb2xkbGBgIGNhbGwgY2FuIGJlIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZgotdGhlIGJ1aWx0LWluIGBgcmVkdWNlYGAgbGlrZSBzbzo6Ci0KLSAgICByZWR1Y2UoZiwgWzEsIDIsIDNdLCAwKQotCi0KLVdlIGNhbiB1c2UgYGBmb2xkbCgpYGAsIGBgb3BlcmF0b3IuY29uY2F0KClgYCBhbmQgYGBwYXJ0aWFsKClgYCB0byB3cml0ZSBhCi1jbGVhbmVyLCBtb3JlIGFlc3RoZXRpY2FsbHktcGxlYXNpbmcgdmVyc2lvbiBvZiBQeXRob24ncyBgYCIiLmpvaW4oLi4uKWBgCi1pZGlvbTo6Ci0KLSAgICBmcm9tIGZ1bmN0aW9uYWwgaW1wb3J0IGZvbGRsLCBwYXJ0aWFsIGZyb20gb3BlcmF0b3IgaW1wb3J0IGNvbmNhdAotCi0gICAgam9pbiA9IHBhcnRpYWwoZm9sZGwsIGNvbmNhdCwgIiIpCi0KLQogUmV2aXNpb24gSGlzdG9yeSBhbmQgQWNrbm93bGVkZ2VtZW50cwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0xMjk2LDkgKzExNzAsMTAgQEAKIAogTWVydHogYWxzbyB3cm90ZSBhIDMtcGFydCBzZXJpZXMgb2YgYXJ0aWNsZXMgb24gZnVuY3Rpb25hbCBwcm9ncmFtbWluZwogZm9yIElCTSdzIERldmVsb3BlcldvcmtzIHNpdGU7IHNlZQotYHBhcnQgMSA8aHR0cDovL3d3dy0xMjguaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9saWJyYXJ5L2wtcHJvZy5odG1sPmBfXywKLWBwYXJ0IDIgPGh0dHA6Ly93d3ctMTI4LmlibS5jb20vZGV2ZWxvcGVyd29ya3MvbGlicmFyeS9sLXByb2cyLmh0bWw+YF9fLCBhbmQKLWBwYXJ0IDMgPGh0dHA6Ly93d3ctMTI4LmlibS5jb20vZGV2ZWxvcGVyd29ya3MvbGludXgvbGlicmFyeS9sLXByb2czLmh0bWw+YF9fLAorCitgcGFydCAxIDxodHRwOi8vd3d3LmlibS5jb20vZGV2ZWxvcGVyd29ya3MvbGludXgvbGlicmFyeS9sLXByb2cvaW5kZXguaHRtbD5gX18sCitgcGFydCAyIDxodHRwOi8vd3d3LmlibS5jb20vZGV2ZWxvcGVyd29ya3MvbGludXgvbGlicmFyeS9sLXByb2cyL2luZGV4Lmh0bWw+YF9fLCBhbmQKK2BwYXJ0IDMgPGh0dHA6Ly93d3cuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9saW51eC9saWJyYXJ5L2wtcHJvZzMvaW5kZXguaHRtbD5gX18sCiAKIAogUHl0aG9uIGRvY3VtZW50YXRpb24KZGlmZiAtLWdpdCBhL0RvYy9ob3d0by9pbmRleC5yc3QgYi9Eb2MvaG93dG8vaW5kZXgucnN0CmluZGV4IDk0ZWNjOWEuLmU0Yzk1YjEgMTAwNjQ0Ci0tLSBhL0RvYy9ob3d0by9pbmRleC5yc3QKKysrIGIvRG9jL2hvd3RvL2luZGV4LnJzdApAQCAtMTMsNyArMTMsNiBAQAogLi4gdG9jdHJlZTo6CiAgICA6bWF4ZGVwdGg6IDEKIAotICAgYWR2b2NhY3kucnN0CiAgICBweXBvcnRpbmcucnN0CiAgICBjcG9ydGluZy5yc3QKICAgIGN1cnNlcy5yc3QKQEAgLTI4LDQgKzI3LDUgQEAKICAgIHVuaWNvZGUucnN0CiAgICB1cmxsaWIyLnJzdAogICAgd2Vic2VydmVycy5yc3QKKyAgIGFyZ3BhcnNlLnJzdAogCmRpZmYgLS1naXQgYS9Eb2MvaG93dG8vbG9nZ2luZy1jb29rYm9vay5yc3QgYi9Eb2MvaG93dG8vbG9nZ2luZy1jb29rYm9vay5yc3QKaW5kZXggNWUwMmZkYi4uMDdiMDRmOSAxMDA2NDQKLS0tIGEvRG9jL2hvd3RvL2xvZ2dpbmctY29va2Jvb2sucnN0CisrKyBiL0RvYy9ob3d0by9sb2dnaW5nLWNvb2tib29rLnJzdApAQCAtOTcsMTEgKzk3LDExIEBACiBNdWx0aXBsZSBoYW5kbGVycyBhbmQgZm9ybWF0dGVycwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotTG9nZ2VycyBhcmUgcGxhaW4gUHl0aG9uIG9iamVjdHMuICBUaGUgOmZ1bmM6YGFkZEhhbmRsZXJgIG1ldGhvZCBoYXMgbm8gbWluaW11bQotb3IgbWF4aW11bSBxdW90YSBmb3IgdGhlIG51bWJlciBvZiBoYW5kbGVycyB5b3UgbWF5IGFkZC4gIFNvbWV0aW1lcyBpdCB3aWxsIGJlCi1iZW5lZmljaWFsIGZvciBhbiBhcHBsaWNhdGlvbiB0byBsb2cgYWxsIG1lc3NhZ2VzIG9mIGFsbCBzZXZlcml0aWVzIHRvIGEgdGV4dAotZmlsZSB3aGlsZSBzaW11bHRhbmVvdXNseSBsb2dnaW5nIGVycm9ycyBvciBhYm92ZSB0byB0aGUgY29uc29sZS4gIFRvIHNldCB0aGlzCi11cCwgc2ltcGx5IGNvbmZpZ3VyZSB0aGUgYXBwcm9wcmlhdGUgaGFuZGxlcnMuICBUaGUgbG9nZ2luZyBjYWxscyBpbiB0aGUKK0xvZ2dlcnMgYXJlIHBsYWluIFB5dGhvbiBvYmplY3RzLiAgVGhlIDptZXRoOmB+TG9nZ2VyLmFkZEhhbmRsZXJgIG1ldGhvZCBoYXMgbm8KK21pbmltdW0gb3IgbWF4aW11bSBxdW90YSBmb3IgdGhlIG51bWJlciBvZiBoYW5kbGVycyB5b3UgbWF5IGFkZC4gIFNvbWV0aW1lcyBpdAord2lsbCBiZSBiZW5lZmljaWFsIGZvciBhbiBhcHBsaWNhdGlvbiB0byBsb2cgYWxsIG1lc3NhZ2VzIG9mIGFsbCBzZXZlcml0aWVzIHRvIGEKK3RleHQgZmlsZSB3aGlsZSBzaW11bHRhbmVvdXNseSBsb2dnaW5nIGVycm9ycyBvciBhYm92ZSB0byB0aGUgY29uc29sZS4gIFRvIHNldAordGhpcyB1cCwgc2ltcGx5IGNvbmZpZ3VyZSB0aGUgYXBwcm9wcmlhdGUgaGFuZGxlcnMuICBUaGUgbG9nZ2luZyBjYWxscyBpbiB0aGUKIGFwcGxpY2F0aW9uIGNvZGUgd2lsbCByZW1haW4gdW5jaGFuZ2VkLiAgSGVyZSBpcyBhIHNsaWdodCBtb2RpZmljYXRpb24gdG8gdGhlCiBwcmV2aW91cyBzaW1wbGUgbW9kdWxlLWJhc2VkIGNvbmZpZ3VyYXRpb24gZXhhbXBsZTo6CiAKQEAgLTI5NSwxNyArMjk1LDE3IEBACiAgICBsb2dnZXIyLndhcm5pbmcoJ0phaWwgemVzdHkgdml4ZW4gd2hvIGdyYWJiZWQgcGF5IGZyb20gcXVhY2suJykKICAgIGxvZ2dlcjIuZXJyb3IoJ1RoZSBmaXZlIGJveGluZyB3aXphcmRzIGp1bXAgcXVpY2tseS4nKQogCi1BdCB0aGUgcmVjZWl2aW5nIGVuZCwgeW91IGNhbiBzZXQgdXAgYSByZWNlaXZlciB1c2luZyB0aGUgOm1vZDpgc29ja2V0c2VydmVyYAorQXQgdGhlIHJlY2VpdmluZyBlbmQsIHlvdSBjYW4gc2V0IHVwIGEgcmVjZWl2ZXIgdXNpbmcgdGhlIDptb2Q6YFNvY2tldFNlcnZlcmAKIG1vZHVsZS4gSGVyZSBpcyBhIGJhc2ljIHdvcmtpbmcgZXhhbXBsZTo6CiAKICAgIGltcG9ydCBwaWNrbGUKICAgIGltcG9ydCBsb2dnaW5nCiAgICBpbXBvcnQgbG9nZ2luZy5oYW5kbGVycwotICAgaW1wb3J0IHNvY2tldHNlcnZlcgorICAgaW1wb3J0IFNvY2tldFNlcnZlcgogICAgaW1wb3J0IHN0cnVjdAogCiAKLSAgIGNsYXNzIExvZ1JlY29yZFN0cmVhbUhhbmRsZXIoc29ja2V0c2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyKToKKyAgIGNsYXNzIExvZ1JlY29yZFN0cmVhbUhhbmRsZXIoU29ja2V0U2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyKToKICAgICAgICAiIiJIYW5kbGVyIGZvciBhIHN0cmVhbWluZyBsb2dnaW5nIHJlcXVlc3QuCiAKICAgICAgICBUaGlzIGJhc2ljYWxseSBsb2dzIHRoZSByZWNvcmQgdXNpbmcgd2hhdGV2ZXIgbG9nZ2luZyBwb2xpY3kgaXMKQEAgLTM0Nyw3ICszNDcsNyBAQAogICAgICAgICAgICAjIGN5Y2xlcyBhbmQgbmV0d29yayBiYW5kd2lkdGghCiAgICAgICAgICAgIGxvZ2dlci5oYW5kbGUocmVjb3JkKQogCi0gICBjbGFzcyBMb2dSZWNvcmRTb2NrZXRSZWNlaXZlcihzb2NrZXRzZXJ2ZXIuVGhyZWFkaW5nVENQU2VydmVyKToKKyAgIGNsYXNzIExvZ1JlY29yZFNvY2tldFJlY2VpdmVyKFNvY2tldFNlcnZlci5UaHJlYWRpbmdUQ1BTZXJ2ZXIpOgogICAgICAgICIiIgogICAgICAgIFNpbXBsZSBUQ1Agc29ja2V0LWJhc2VkIGxvZ2dpbmcgcmVjZWl2ZXIgc3VpdGFibGUgZm9yIHRlc3RpbmcuCiAgICAgICAgIiIiCkBAIC0zNTcsNyArMzU3LDcgQEAKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nbG9jYWxob3N0JywKICAgICAgICAgICAgICAgICAgICAgcG9ydD1sb2dnaW5nLmhhbmRsZXJzLkRFRkFVTFRfVENQX0xPR0dJTkdfUE9SVCwKICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcj1Mb2dSZWNvcmRTdHJlYW1IYW5kbGVyKToKLSAgICAgICAgICAgc29ja2V0c2VydmVyLlRocmVhZGluZ1RDUFNlcnZlci5fX2luaXRfXyhzZWxmLCAoaG9zdCwgcG9ydCksIGhhbmRsZXIpCisgICAgICAgICAgIFNvY2tldFNlcnZlci5UaHJlYWRpbmdUQ1BTZXJ2ZXIuX19pbml0X18oc2VsZiwgKGhvc3QsIHBvcnQpLCBoYW5kbGVyKQogICAgICAgICAgICBzZWxmLmFib3J0ID0gMAogICAgICAgICAgICBzZWxmLnRpbWVvdXQgPSAxCiAgICAgICAgICAgIHNlbGYubG9nbmFtZSA9IE5vbmUKQEAgLTM5NSw4ICszOTUsOSBAQAogCiBOb3RlIHRoYXQgdGhlcmUgYXJlIHNvbWUgc2VjdXJpdHkgaXNzdWVzIHdpdGggcGlja2xlIGluIHNvbWUgc2NlbmFyaW9zLiBJZgogdGhlc2UgYWZmZWN0IHlvdSwgeW91IGNhbiB1c2UgYW4gYWx0ZXJuYXRpdmUgc2VyaWFsaXphdGlvbiBzY2hlbWUgYnkgb3ZlcnJpZGluZwotdGhlIDptZXRoOmBtYWtlUGlja2xlYCBtZXRob2QgYW5kIGltcGxlbWVudGluZyB5b3VyIGFsdGVybmF0aXZlIHRoZXJlLCBhcwotd2VsbCBhcyBhZGFwdGluZyB0aGUgYWJvdmUgc2NyaXB0IHRvIHVzZSB5b3VyIGFsdGVybmF0aXZlIHNlcmlhbGl6YXRpb24uCit0aGUgOm1ldGg6YH5oYW5kbGVycy5Tb2NrZXRIYW5kbGVyLm1ha2VQaWNrbGVgIG1ldGhvZCBhbmQgaW1wbGVtZW50aW5nIHlvdXIKK2FsdGVybmF0aXZlIHRoZXJlLCBhcyB3ZWxsIGFzIGFkYXB0aW5nIHRoZSBhYm92ZSBzY3JpcHQgdG8gdXNlIHlvdXIgYWx0ZXJuYXRpdmUKK3NlcmlhbGl6YXRpb24uCiAKIAogLi4gX2NvbnRleHQtaW5mbzoKQEAgLTQwNCw2ICs0MDUsOCBAQAogQWRkaW5nIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gdG8geW91ciBsb2dnaW5nIG91dHB1dAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCisuLiBjdXJyZW50bW9kdWxlOjogbG9nZ2luZworCiBTb21ldGltZXMgeW91IHdhbnQgbG9nZ2luZyBvdXRwdXQgdG8gY29udGFpbiBjb250ZXh0dWFsIGluZm9ybWF0aW9uIGluCiBhZGRpdGlvbiB0byB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gdGhlIGxvZ2dpbmcgY2FsbC4gRm9yIGV4YW1wbGUsIGluIGEKIG5ldHdvcmtlZCBhcHBsaWNhdGlvbiwgaXQgbWF5IGJlIGRlc2lyYWJsZSB0byBsb2cgY2xpZW50LXNwZWNpZmljIGluZm9ybWF0aW9uCkBAIC00NDUsOSArNDQ4LDkgQEAKICAgICAgICAgbXNnLCBrd2FyZ3MgPSBzZWxmLnByb2Nlc3MobXNnLCBrd2FyZ3MpCiAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKG1zZywgKmFyZ3MsICoqa3dhcmdzKQogCi1UaGUgOm1ldGg6YHByb2Nlc3NgIG1ldGhvZCBvZiA6Y2xhc3M6YExvZ2dlckFkYXB0ZXJgIGlzIHdoZXJlIHRoZSBjb250ZXh0dWFsCi1pbmZvcm1hdGlvbiBpcyBhZGRlZCB0byB0aGUgbG9nZ2luZyBvdXRwdXQuIEl0J3MgcGFzc2VkIHRoZSBtZXNzYWdlIGFuZAota2V5d29yZCBhcmd1bWVudHMgb2YgdGhlIGxvZ2dpbmcgY2FsbCwgYW5kIGl0IHBhc3NlcyBiYWNrIChwb3RlbnRpYWxseSkKK1RoZSA6bWV0aDpgfkxvZ2dlckFkYXB0ZXIucHJvY2Vzc2AgbWV0aG9kIG9mIDpjbGFzczpgTG9nZ2VyQWRhcHRlcmAgaXMgd2hlcmUgdGhlCitjb250ZXh0dWFsIGluZm9ybWF0aW9uIGlzIGFkZGVkIHRvIHRoZSBsb2dnaW5nIG91dHB1dC4gSXQncyBwYXNzZWQgdGhlIG1lc3NhZ2UKK2FuZCBrZXl3b3JkIGFyZ3VtZW50cyBvZiB0aGUgbG9nZ2luZyBjYWxsLCBhbmQgaXQgcGFzc2VzIGJhY2sgKHBvdGVudGlhbGx5KQogbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlc2UgdG8gdXNlIGluIHRoZSBjYWxsIHRvIHRoZSB1bmRlcmx5aW5nIGxvZ2dlci4gVGhlCiBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGxlYXZlcyB0aGUgbWVzc2FnZSBhbG9uZSwgYnV0IGluc2VydHMKIGFuICdleHRyYScga2V5IGluIHRoZSBrZXl3b3JkIGFyZ3VtZW50IHdob3NlIHZhbHVlIGlzIHRoZSBkaWN0LWxpa2Ugb2JqZWN0CkBAIC00NTksNzAgKzQ2MiwzMiBAQAogY3VzdG9taXplZCBzdHJpbmdzIHdpdGggeW91ciA6Y2xhc3M6YEZvcm1hdHRlcmAgaW5zdGFuY2VzIHdoaWNoIGtub3cgYWJvdXQKIHRoZSBrZXlzIG9mIHRoZSBkaWN0LWxpa2Ugb2JqZWN0LiBJZiB5b3UgbmVlZCBhIGRpZmZlcmVudCBtZXRob2QsIGUuZy4gaWYgeW91CiB3YW50IHRvIHByZXBlbmQgb3IgYXBwZW5kIHRoZSBjb250ZXh0dWFsIGluZm9ybWF0aW9uIHRvIHRoZSBtZXNzYWdlIHN0cmluZywKLXlvdSBqdXN0IG5lZWQgdG8gc3ViY2xhc3MgOmNsYXNzOmBMb2dnZXJBZGFwdGVyYCBhbmQgb3ZlcnJpZGUgOm1ldGg6YHByb2Nlc3NgCi10byBkbyB3aGF0IHlvdSBuZWVkLiBIZXJlJ3MgYW4gZXhhbXBsZSBzY3JpcHQgd2hpY2ggdXNlcyB0aGlzIGNsYXNzLCB3aGljaAotYWxzbyBpbGx1c3RyYXRlcyB3aGF0IGRpY3QtbGlrZSBiZWhhdmlvdXIgaXMgbmVlZGVkIGZyb20gYW4gYXJiaXRyYXJ5Ci0nZGljdC1saWtlJyBvYmplY3QgZm9yIHVzZSBpbiB0aGUgY29uc3RydWN0b3I6OgoreW91IGp1c3QgbmVlZCB0byBzdWJjbGFzcyA6Y2xhc3M6YExvZ2dlckFkYXB0ZXJgIGFuZCBvdmVycmlkZQorOm1ldGg6YH5Mb2dnZXJBZGFwdGVyLnByb2Nlc3NgIHRvIGRvIHdoYXQgeW91IG5lZWQuIEhlcmUgaXMgYSBzaW1wbGUgZXhhbXBsZTo6CiAKLSAgIGltcG9ydCBsb2dnaW5nCisgICAgY2xhc3MgQ3VzdG9tQWRhcHRlcihsb2dnaW5nLkxvZ2dlckFkYXB0ZXIpOgorICAgICAgICAiIiIKKyAgICAgICAgVGhpcyBleGFtcGxlIGFkYXB0ZXIgZXhwZWN0cyB0aGUgcGFzc2VkIGluIGRpY3QtbGlrZSBvYmplY3QgdG8gaGF2ZSBhCisgICAgICAgICdjb25uaWQnIGtleSwgd2hvc2UgdmFsdWUgaW4gYnJhY2tldHMgaXMgcHJlcGVuZGVkIHRvIHRoZSBsb2cgbWVzc2FnZS4KKyAgICAgICAgIiIiCisgICAgICAgIGRlZiBwcm9jZXNzKHNlbGYsIG1zZywga3dhcmdzKToKKyAgICAgICAgICAgIHJldHVybiAnWyVzXSAlcycgJSAoc2VsZi5leHRyYVsnY29ubmlkJ10sIG1zZyksIGt3YXJncwogCi0gICBjbGFzcyBDb25uSW5mbzoKLSAgICAgICAiIiIKLSAgICAgICBBbiBleGFtcGxlIGNsYXNzIHdoaWNoIHNob3dzIGhvdyBhbiBhcmJpdHJhcnkgY2xhc3MgY2FuIGJlIHVzZWQgYXMKLSAgICAgICB0aGUgJ2V4dHJhJyBjb250ZXh0IGluZm9ybWF0aW9uIHJlcG9zaXRvcnkgcGFzc2VkIHRvIGEgTG9nZ2VyQWRhcHRlci4KLSAgICAgICAiIiIKK3doaWNoIHlvdSBjYW4gdXNlIGxpa2UgdGhpczo6CiAKLSAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgbmFtZSk6Ci0gICAgICAgICAgICIiIgotICAgICAgICAgICBUbyBhbGxvdyB0aGlzIGluc3RhbmNlIHRvIGxvb2sgbGlrZSBhIGRpY3QuCi0gICAgICAgICAgICIiIgotICAgICAgICAgICBmcm9tIHJhbmRvbSBpbXBvcnQgY2hvaWNlCi0gICAgICAgICAgIGlmIG5hbWUgPT0gJ2lwJzoKLSAgICAgICAgICAgICAgIHJlc3VsdCA9IGNob2ljZShbJzEyNy4wLjAuMScsICcxOTIuMTY4LjAuMSddKQotICAgICAgICAgICBlbGlmIG5hbWUgPT0gJ3VzZXInOgotICAgICAgICAgICAgICAgcmVzdWx0ID0gY2hvaWNlKFsnamltJywgJ2ZyZWQnLCAnc2hlaWxhJ10pCi0gICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9fZGljdF9fLmdldChuYW1lLCAnPycpCi0gICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKKyAgICBhZGFwdGVyID0gQ3VzdG9tQWRhcHRlcihsb2dnZXIsIHsnY29ubmlkJzogc29tZV9jb25uX2lkfSkKIAotICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKLSAgICAgICAgICAgIiIiCi0gICAgICAgICAgIFRvIGFsbG93IGl0ZXJhdGlvbiBvdmVyIGtleXMsIHdoaWNoIHdpbGwgYmUgbWVyZ2VkIGludG8KLSAgICAgICAgICAgdGhlIExvZ1JlY29yZCBkaWN0IGJlZm9yZSBmb3JtYXR0aW5nIGFuZCBvdXRwdXQuCi0gICAgICAgICAgICIiIgotICAgICAgICAgICBrZXlzID0gWydpcCcsICd1c2VyJ10KLSAgICAgICAgICAga2V5cy5leHRlbmQoc2VsZi5fX2RpY3RfXy5rZXlzKCkpCi0gICAgICAgICAgIHJldHVybiBrZXlzLl9faXRlcl9fKCkKK1RoZW4gYW55IGV2ZW50cyB0aGF0IHlvdSBsb2cgdG8gdGhlIGFkYXB0ZXIgd2lsbCBoYXZlIHRoZSB2YWx1ZSBvZgorYGBzb21lX2Nvbm5faWRgYCBwcmVwZW5kZWQgdG8gdGhlIGxvZyBtZXNzYWdlcy4KIAotICAgaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICAgICBmcm9tIHJhbmRvbSBpbXBvcnQgY2hvaWNlCi0gICAgICAgbGV2ZWxzID0gKGxvZ2dpbmcuREVCVUcsIGxvZ2dpbmcuSU5GTywgbG9nZ2luZy5XQVJOSU5HLCBsb2dnaW5nLkVSUk9SLCBsb2dnaW5nLkNSSVRJQ0FMKQotICAgICAgIGExID0gbG9nZ2luZy5Mb2dnZXJBZGFwdGVyKGxvZ2dpbmcuZ2V0TG9nZ2VyKCdhLmIuYycpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgJ2lwJyA6ICcxMjMuMjMxLjIzMS4xMjMnLCAndXNlcicgOiAnc2hlaWxhJyB9KQotICAgICAgIGxvZ2dpbmcuYmFzaWNDb25maWcobGV2ZWw9bG9nZ2luZy5ERUJVRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdD0nJShhc2N0aW1lKS0xNXMgJShuYW1lKS01cyAlKGxldmVsbmFtZSktOHMgSVA6ICUoaXApLTE1cyBVc2VyOiAlKHVzZXIpLThzICUobWVzc2FnZSlzJykKLSAgICAgICBhMS5kZWJ1ZygnQSBkZWJ1ZyBtZXNzYWdlJykKLSAgICAgICBhMS5pbmZvKCdBbiBpbmZvIG1lc3NhZ2Ugd2l0aCAlcycsICdzb21lIHBhcmFtZXRlcnMnKQotICAgICAgIGEyID0gbG9nZ2luZy5Mb2dnZXJBZGFwdGVyKGxvZ2dpbmcuZ2V0TG9nZ2VyKCdkLmUuZicpLCBDb25uSW5mbygpKQotICAgICAgIGZvciB4IGluIHJhbmdlKDEwKToKLSAgICAgICAgICAgbHZsID0gY2hvaWNlKGxldmVscykKLSAgICAgICAgICAgbHZsbmFtZSA9IGxvZ2dpbmcuZ2V0TGV2ZWxOYW1lKGx2bCkKLSAgICAgICAgICAgYTIubG9nKGx2bCwgJ0EgbWVzc2FnZSBhdCAlcyBsZXZlbCB3aXRoICVkICVzJywgbHZsbmFtZSwgMiwgJ3BhcmFtZXRlcnMnKQorVXNpbmcgb2JqZWN0cyBvdGhlciB0aGFuIGRpY3RzIHRvIHBhc3MgY29udGV4dHVhbCBpbmZvcm1hdGlvbgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogCi1XaGVuIHRoaXMgc2NyaXB0IGlzIHJ1biwgdGhlIG91dHB1dCBzaG91bGQgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOjoKLQotICAgMjAwOC0wMS0xOCAxNDo0OTo1NCwwMjMgYS5iLmMgREVCVUcgICAgSVA6IDEyMy4yMzEuMjMxLjEyMyBVc2VyOiBzaGVpbGEgICBBIGRlYnVnIG1lc3NhZ2UKLSAgIDIwMDgtMDEtMTggMTQ6NDk6NTQsMDIzIGEuYi5jIElORk8gICAgIElQOiAxMjMuMjMxLjIzMS4xMjMgVXNlcjogc2hlaWxhICAgQW4gaW5mbyBtZXNzYWdlIHdpdGggc29tZSBwYXJhbWV0ZXJzCi0gICAyMDA4LTAxLTE4IDE0OjQ5OjU0LDAyMyBkLmUuZiBDUklUSUNBTCBJUDogMTkyLjE2OC4wLjEgICAgIFVzZXI6IGppbSAgICAgIEEgbWVzc2FnZSBhdCBDUklUSUNBTCBsZXZlbCB3aXRoIDIgcGFyYW1ldGVycwotICAgMjAwOC0wMS0xOCAxNDo0OTo1NCwwMzMgZC5lLmYgSU5GTyAgICAgSVA6IDE5Mi4xNjguMC4xICAgICBVc2VyOiBqaW0gICAgICBBIG1lc3NhZ2UgYXQgSU5GTyBsZXZlbCB3aXRoIDIgcGFyYW1ldGVycwotICAgMjAwOC0wMS0xOCAxNDo0OTo1NCwwMzMgZC5lLmYgV0FSTklORyAgSVA6IDE5Mi4xNjguMC4xICAgICBVc2VyOiBzaGVpbGEgICBBIG1lc3NhZ2UgYXQgV0FSTklORyBsZXZlbCB3aXRoIDIgcGFyYW1ldGVycwotICAgMjAwOC0wMS0xOCAxNDo0OTo1NCwwMzMgZC5lLmYgRVJST1IgICAgSVA6IDEyNy4wLjAuMSAgICAgICBVc2VyOiBmcmVkICAgICBBIG1lc3NhZ2UgYXQgRVJST1IgbGV2ZWwgd2l0aCAyIHBhcmFtZXRlcnMKLSAgIDIwMDgtMDEtMTggMTQ6NDk6NTQsMDMzIGQuZS5mIEVSUk9SICAgIElQOiAxMjcuMC4wLjEgICAgICAgVXNlcjogc2hlaWxhICAgQSBtZXNzYWdlIGF0IEVSUk9SIGxldmVsIHdpdGggMiBwYXJhbWV0ZXJzCi0gICAyMDA4LTAxLTE4IDE0OjQ5OjU0LDAzMyBkLmUuZiBXQVJOSU5HICBJUDogMTkyLjE2OC4wLjEgICAgIFVzZXI6IHNoZWlsYSAgIEEgbWVzc2FnZSBhdCBXQVJOSU5HIGxldmVsIHdpdGggMiBwYXJhbWV0ZXJzCi0gICAyMDA4LTAxLTE4IDE0OjQ5OjU0LDAzMyBkLmUuZiBXQVJOSU5HICBJUDogMTkyLjE2OC4wLjEgICAgIFVzZXI6IGppbSAgICAgIEEgbWVzc2FnZSBhdCBXQVJOSU5HIGxldmVsIHdpdGggMiBwYXJhbWV0ZXJzCi0gICAyMDA4LTAxLTE4IDE0OjQ5OjU0LDAzMyBkLmUuZiBJTkZPICAgICBJUDogMTkyLjE2OC4wLjEgICAgIFVzZXI6IGZyZWQgICAgIEEgbWVzc2FnZSBhdCBJTkZPIGxldmVsIHdpdGggMiBwYXJhbWV0ZXJzCi0gICAyMDA4LTAxLTE4IDE0OjQ5OjU0LDAzMyBkLmUuZiBXQVJOSU5HICBJUDogMTkyLjE2OC4wLjEgICAgIFVzZXI6IHNoZWlsYSAgIEEgbWVzc2FnZSBhdCBXQVJOSU5HIGxldmVsIHdpdGggMiBwYXJhbWV0ZXJzCi0gICAyMDA4LTAxLTE4IDE0OjQ5OjU0LDAzMyBkLmUuZiBXQVJOSU5HICBJUDogMTI3LjAuMC4xICAgICAgIFVzZXI6IGppbSAgICAgIEEgbWVzc2FnZSBhdCBXQVJOSU5HIGxldmVsIHdpdGggMiBwYXJhbWV0ZXJzCitZb3UgZG9uJ3QgbmVlZCB0byBwYXNzIGFuIGFjdHVhbCBkaWN0IHRvIGEgOmNsYXNzOmBMb2dnZXJBZGFwdGVyYCAtIHlvdSBjb3VsZAorcGFzcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgYGBfX2dldGl0ZW1fX2BgIGFuZCBgYF9faXRlcl9fYGAgc28KK3RoYXQgaXQgbG9va3MgbGlrZSBhIGRpY3QgdG8gbG9nZ2luZy4gVGhpcyB3b3VsZCBiZSB1c2VmdWwgaWYgeW91IHdhbnQgdG8KK2dlbmVyYXRlIHZhbHVlcyBkeW5hbWljYWxseSAod2hlcmVhcyB0aGUgdmFsdWVzIGluIGEgZGljdCB3b3VsZCBiZSBjb25zdGFudCkuCiAKIAogLi4gX2ZpbHRlcnMtY29udGV4dHVhbDoKQEAgLTYwNywyNSArNTcyLDIzIEBACiAqbXVsdGlwbGUgcHJvY2Vzc2VzKiBpcyAqbm90KiBzdXBwb3J0ZWQsIGJlY2F1c2UgdGhlcmUgaXMgbm8gc3RhbmRhcmQgd2F5IHRvCiBzZXJpYWxpemUgYWNjZXNzIHRvIGEgc2luZ2xlIGZpbGUgYWNyb3NzIG11bHRpcGxlIHByb2Nlc3NlcyBpbiBQeXRob24uIElmIHlvdQogbmVlZCB0byBsb2cgdG8gYSBzaW5nbGUgZmlsZSBmcm9tIG11bHRpcGxlIHByb2Nlc3Nlcywgb25lIHdheSBvZiBkb2luZyB0aGlzIGlzCi10byBoYXZlIGFsbCB0aGUgcHJvY2Vzc2VzIGxvZyB0byBhIDpjbGFzczpgU29ja2V0SGFuZGxlcmAsIGFuZCBoYXZlIGEgc2VwYXJhdGUKLXByb2Nlc3Mgd2hpY2ggaW1wbGVtZW50cyBhIHNvY2tldCBzZXJ2ZXIgd2hpY2ggcmVhZHMgZnJvbSB0aGUgc29ja2V0IGFuZCBsb2dzCi10byBmaWxlLiAoSWYgeW91IHByZWZlciwgeW91IGNhbiBkZWRpY2F0ZSBvbmUgdGhyZWFkIGluIG9uZSBvZiB0aGUgZXhpc3RpbmcKLXByb2Nlc3NlcyB0byBwZXJmb3JtIHRoaXMgZnVuY3Rpb24uKSA6cmVmOmBUaGlzIHNlY3Rpb24gPG5ldHdvcmstbG9nZ2luZz5gCi1kb2N1bWVudHMgdGhpcyBhcHByb2FjaCBpbiBtb3JlIGRldGFpbCBhbmQgaW5jbHVkZXMgYSB3b3JraW5nIHNvY2tldCByZWNlaXZlcgotd2hpY2ggY2FuIGJlIHVzZWQgYXMgYSBzdGFydGluZyBwb2ludCBmb3IgeW91IHRvIGFkYXB0IGluIHlvdXIgb3duCi1hcHBsaWNhdGlvbnMuCit0byBoYXZlIGFsbCB0aGUgcHJvY2Vzc2VzIGxvZyB0byBhIDpjbGFzczpgfmhhbmRsZXJzLlNvY2tldEhhbmRsZXJgLCBhbmQgaGF2ZSBhCitzZXBhcmF0ZSBwcm9jZXNzIHdoaWNoIGltcGxlbWVudHMgYSBzb2NrZXQgc2VydmVyIHdoaWNoIHJlYWRzIGZyb20gdGhlIHNvY2tldAorYW5kIGxvZ3MgdG8gZmlsZS4gKElmIHlvdSBwcmVmZXIsIHlvdSBjYW4gZGVkaWNhdGUgb25lIHRocmVhZCBpbiBvbmUgb2YgdGhlCitleGlzdGluZyBwcm9jZXNzZXMgdG8gcGVyZm9ybSB0aGlzIGZ1bmN0aW9uLikKKzpyZWY6YFRoaXMgc2VjdGlvbiA8bmV0d29yay1sb2dnaW5nPmAgZG9jdW1lbnRzIHRoaXMgYXBwcm9hY2ggaW4gbW9yZSBkZXRhaWwgYW5kCitpbmNsdWRlcyBhIHdvcmtpbmcgc29ja2V0IHJlY2VpdmVyIHdoaWNoIGNhbiBiZSB1c2VkIGFzIGEgc3RhcnRpbmcgcG9pbnQgZm9yIHlvdQordG8gYWRhcHQgaW4geW91ciBvd24gYXBwbGljYXRpb25zLgogCiBJZiB5b3UgYXJlIHVzaW5nIGEgcmVjZW50IHZlcnNpb24gb2YgUHl0aG9uIHdoaWNoIGluY2x1ZGVzIHRoZQogOm1vZDpgbXVsdGlwcm9jZXNzaW5nYCBtb2R1bGUsIHlvdSBjb3VsZCB3cml0ZSB5b3VyIG93biBoYW5kbGVyIHdoaWNoIHVzZXMgdGhlCi06Y2xhc3M6YExvY2tgIGNsYXNzIGZyb20gdGhpcyBtb2R1bGUgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgZmlsZSBmcm9tCi15b3VyIHByb2Nlc3Nlcy4gVGhlIGV4aXN0aW5nIDpjbGFzczpgRmlsZUhhbmRsZXJgIGFuZCBzdWJjbGFzc2VzIGRvIG5vdCBtYWtlCi11c2Ugb2YgOm1vZDpgbXVsdGlwcm9jZXNzaW5nYCBhdCBwcmVzZW50LCB0aG91Z2ggdGhleSBtYXkgZG8gc28gaW4gdGhlIGZ1dHVyZS4KLU5vdGUgdGhhdCBhdCBwcmVzZW50LCB0aGUgOm1vZDpgbXVsdGlwcm9jZXNzaW5nYCBtb2R1bGUgZG9lcyBub3QgcHJvdmlkZQorOmNsYXNzOmB+bXVsdGlwcm9jZXNzaW5nLkxvY2tgIGNsYXNzIGZyb20gdGhpcyBtb2R1bGUgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUKK2ZpbGUgZnJvbSB5b3VyIHByb2Nlc3Nlcy4gVGhlIGV4aXN0aW5nIDpjbGFzczpgRmlsZUhhbmRsZXJgIGFuZCBzdWJjbGFzc2VzIGRvCitub3QgbWFrZSB1c2Ugb2YgOm1vZDpgbXVsdGlwcm9jZXNzaW5nYCBhdCBwcmVzZW50LCB0aG91Z2ggdGhleSBtYXkgZG8gc28gaW4gdGhlCitmdXR1cmUuIE5vdGUgdGhhdCBhdCBwcmVzZW50LCB0aGUgOm1vZDpgbXVsdGlwcm9jZXNzaW5nYCBtb2R1bGUgZG9lcyBub3QgcHJvdmlkZQogd29ya2luZyBsb2NrIGZ1bmN0aW9uYWxpdHkgb24gYWxsIHBsYXRmb3JtcyAoc2VlCiBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMzc3MCkuCiAKLS4uIGN1cnJlbnRtb2R1bGU6OiBsb2dnaW5nLmhhbmRsZXJzCi0KIAogVXNpbmcgZmlsZSByb3RhdGlvbgogLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNjM3LDcgKzYwMCw3IEBACiBmaWxlIGFuZCBsb2cgdG8gdGhhdC4gWW91IG1heSB3YW50IHRvIGtlZXAgYSBjZXJ0YWluIG51bWJlciBvZiB0aGVzZSBmaWxlcywgYW5kCiB3aGVuIHRoYXQgbWFueSBmaWxlcyBoYXZlIGJlZW4gY3JlYXRlZCwgcm90YXRlIHRoZSBmaWxlcyBzbyB0aGF0IHRoZSBudW1iZXIgb2YKIGZpbGVzIGFuZCB0aGUgc2l6ZSBvZiB0aGUgZmlsZXMgYm90aCByZW1haW4gYm91bmRlZC4gRm9yIHRoaXMgdXNhZ2UgcGF0dGVybiwgdGhlCi1sb2dnaW5nIHBhY2thZ2UgcHJvdmlkZXMgYSA6Y2xhc3M6YFJvdGF0aW5nRmlsZUhhbmRsZXJgOjoKK2xvZ2dpbmcgcGFja2FnZSBwcm92aWRlcyBhIDpjbGFzczpgfmhhbmRsZXJzLlJvdGF0aW5nRmlsZUhhbmRsZXJgOjoKIAogICAgaW1wb3J0IGdsb2IKICAgIGltcG9ydCBsb2dnaW5nCkBAIC02ODgsNyArNjUxLDcgQEAKIAogQmVsb3cgaXMgYW4gZXhhbXBsZSBvZiBhIGxvZ2dpbmcgY29uZmlndXJhdGlvbiBkaWN0aW9uYXJ5IC0gaXQncyB0YWtlbiBmcm9tCiB0aGUgYGRvY3VtZW50YXRpb24gb24gdGhlIERqYW5nbyBwcm9qZWN0IDxodHRwczovL2RvY3MuZGphbmdvcHJvamVjdC5jb20vZW4vMS4zL3RvcGljcy9sb2dnaW5nLyNjb25maWd1cmluZy1sb2dnaW5nPmBfLgotVGhpcyBkaWN0aW9uYXJ5IGlzIHBhc3NlZCB0byA6ZnVuYzpgfmxvZ2dpbmcuY29uZmlnLmRpY3RDb25maWdgIHRvIHB1dCB0aGUgY29uZmlndXJhdGlvbiBpbnRvIGVmZmVjdDo6CitUaGlzIGRpY3Rpb25hcnkgaXMgcGFzc2VkIHRvIDpmdW5jOmB+Y29uZmlnLmRpY3RDb25maWdgIHRvIHB1dCB0aGUgY29uZmlndXJhdGlvbiBpbnRvIGVmZmVjdDo6CiAKICAgICBMT0dHSU5HID0gewogICAgICAgICAndmVyc2lvbic6IDEsCkBAIC03NDMsNSArNzA2LDM1MSBAQAogICAgIH0KIAogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjb25maWd1cmF0aW9uLCB5b3UgY2FuIHNlZSB0aGUgYHJlbGV2YW50Ci1zZWN0aW9uIDxodHRwczovL2RvY3MuZGphbmdvcHJvamVjdC5jb20vZW4vMS4zL3RvcGljcy9sb2dnaW5nLyNjb25maWd1cmluZy1sb2dnaW5nPmBfCitzZWN0aW9uIDxodHRwczovL2RvY3MuZGphbmdvcHJvamVjdC5jb20vZW4vMS42L3RvcGljcy9sb2dnaW5nLyNjb25maWd1cmluZy1sb2dnaW5nPmBfCiBvZiB0aGUgRGphbmdvIGRvY3VtZW50YXRpb24uCisKK0luc2VydGluZyBhIEJPTSBpbnRvIG1lc3NhZ2VzIHNlbnQgdG8gYSBTeXNMb2dIYW5kbGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitgUkZDIDU0MjQgPGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzU0MjQ+YF8gcmVxdWlyZXMgdGhhdCBhCitVbmljb2RlIG1lc3NhZ2UgYmUgc2VudCB0byBhIHN5c2xvZyBkYWVtb24gYXMgYSBzZXQgb2YgYnl0ZXMgd2hpY2ggaGF2ZSB0aGUKK2ZvbGxvd2luZyBzdHJ1Y3R1cmU6IGFuIG9wdGlvbmFsIHB1cmUtQVNDSUkgY29tcG9uZW50LCBmb2xsb3dlZCBieSBhIFVURi04IEJ5dGUKK09yZGVyIE1hcmsgKEJPTSksIGZvbGxvd2VkIGJ5IFVuaWNvZGUgZW5jb2RlZCB1c2luZyBVVEYtOC4gKFNlZSB0aGUgYHJlbGV2YW50CitzZWN0aW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uIDxodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1NDI0I3NlY3Rpb24tNj5gXy4pCisKK0luIFB5dGhvbiAyLjYgYW5kIDIuNywgY29kZSB3YXMgYWRkZWQgdG8KKzpjbGFzczpgfmxvZ2dpbmcuaGFuZGxlcnMuU3lzTG9nSGFuZGxlcmAgdG8gaW5zZXJ0IGEgQk9NIGludG8gdGhlIG1lc3NhZ2UsIGJ1dAordW5mb3J0dW5hdGVseSwgaXQgd2FzIGltcGxlbWVudGVkIGluY29ycmVjdGx5LCB3aXRoIHRoZSBCT00gYXBwZWFyaW5nIGF0IHRoZQorYmVnaW5uaW5nIG9mIHRoZSBtZXNzYWdlIGFuZCBoZW5jZSBub3QgYWxsb3dpbmcgYW55IHB1cmUtQVNDSUkgY29tcG9uZW50IHRvCithcHBlYXIgYmVmb3JlIGl0LgorCitBcyB0aGlzIGJlaGF2aW91ciBpcyBicm9rZW4sIHRoZSBpbmNvcnJlY3QgQk9NIGluc2VydGlvbiBjb2RlIGlzIGJlaW5nIHJlbW92ZWQKK2Zyb20gUHl0aG9uIDIuNy40IGFuZCBsYXRlci4gSG93ZXZlciwgaXQgaXMgbm90IGJlaW5nIHJlcGxhY2VkLCBhbmQgaWYgeW91Cit3YW50IHRvIHByb2R1Y2UgUkZDIDU0MjQtY29tcGxpYW50IG1lc3NhZ2VzIHdoaWNoIGluY2x1ZGUgYSBCT00sIGFuIG9wdGlvbmFsCitwdXJlLUFTQ0lJIHNlcXVlbmNlIGJlZm9yZSBpdCBhbmQgYXJiaXRyYXJ5IFVuaWNvZGUgYWZ0ZXIgaXQsIGVuY29kZWQgdXNpbmcKK1VURi04LCB0aGVuIHlvdSBuZWVkIHRvIGRvIHRoZSBmb2xsb3dpbmc6CisKKyMuIEF0dGFjaCBhIDpjbGFzczpgfmxvZ2dpbmcuRm9ybWF0dGVyYCBpbnN0YW5jZSB0byB5b3VyCisgICA6Y2xhc3M6YH5sb2dnaW5nLmhhbmRsZXJzLlN5c0xvZ0hhbmRsZXJgIGluc3RhbmNlLCB3aXRoIGEgZm9ybWF0IHN0cmluZworICAgc3VjaCBhczo6CisKKyAgICAgIHUnQVNDSUkgc2VjdGlvblx1ZmVmZlVuaWNvZGUgc2VjdGlvbicKKworICAgVGhlIFVuaWNvZGUgY29kZSBwb2ludCBgYHUnXHVmZWZmJ2BgLCB3aGVuIGVuY29kZWQgdXNpbmcgVVRGLTgsIHdpbGwgYmUKKyAgIGVuY29kZWQgYXMgYSBVVEYtOCBCT00gLS0gdGhlIGJ5dGUtc3RyaW5nIGBgJ1x4ZWZceGJiXHhiZidgYC4KKworIy4gUmVwbGFjZSB0aGUgQVNDSUkgc2VjdGlvbiB3aXRoIHdoYXRldmVyIHBsYWNlaG9sZGVycyB5b3UgbGlrZSwgYnV0IG1ha2Ugc3VyZQorICAgdGhhdCB0aGUgZGF0YSB0aGF0IGFwcGVhcnMgaW4gdGhlcmUgYWZ0ZXIgc3Vic3RpdHV0aW9uIGlzIGFsd2F5cyBBU0NJSSAodGhhdAorICAgd2F5LCBpdCB3aWxsIHJlbWFpbiB1bmNoYW5nZWQgYWZ0ZXIgVVRGLTggZW5jb2RpbmcpLgorCisjLiBSZXBsYWNlIHRoZSBVbmljb2RlIHNlY3Rpb24gd2l0aCB3aGF0ZXZlciBwbGFjZWhvbGRlcnMgeW91IGxpa2U7IGlmIHRoZSBkYXRhCisgICB3aGljaCBhcHBlYXJzIHRoZXJlIGFmdGVyIHN1YnN0aXR1dGlvbiBjb250YWlucyBjaGFyYWN0ZXJzIG91dHNpZGUgdGhlIEFTQ0lJCisgICByYW5nZSwgdGhhdCdzIGZpbmUgLS0gaXQgd2lsbCBiZSBlbmNvZGVkIHVzaW5nIFVURi04LgorCitJZiB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UgaXMgVW5pY29kZSwgaXQgKndpbGwqIGJlIGVuY29kZWQgdXNpbmcgVVRGLTggZW5jb2RpbmcKK2J5IGBgU3lzTG9nSGFuZGxlcmBgLiBJZiB5b3UgZm9sbG93IHRoZSBhYm92ZSBydWxlcywgeW91IHNob3VsZCBiZSBhYmxlIHRvCitwcm9kdWNlIFJGQyA1NDI0LWNvbXBsaWFudCBtZXNzYWdlcy4gSWYgeW91IGRvbid0LCBsb2dnaW5nIG1heSBub3QgY29tcGxhaW4sCitidXQgeW91ciBtZXNzYWdlcyB3aWxsIG5vdCBiZSBSRkMgNTQyNC1jb21wbGlhbnQsIGFuZCB5b3VyIHN5c2xvZyBkYWVtb24gbWF5Citjb21wbGFpbi4KKworCitJbXBsZW1lbnRpbmcgc3RydWN0dXJlZCBsb2dnaW5nCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FsdGhvdWdoIG1vc3QgbG9nZ2luZyBtZXNzYWdlcyBhcmUgaW50ZW5kZWQgZm9yIHJlYWRpbmcgYnkgaHVtYW5zLCBhbmQgdGh1cyBub3QKK3JlYWRpbHkgbWFjaGluZS1wYXJzZWFibGUsIHRoZXJlIG1pZ2h0IGJlIGNpcnVtc3RhbmNlcyB3aGVyZSB5b3Ugd2FudCB0byBvdXRwdXQKK21lc3NhZ2VzIGluIGEgc3RydWN0dXJlZCBmb3JtYXQgd2hpY2ggKmlzKiBjYXBhYmxlIG9mIGJlaW5nIHBhcnNlZCBieSBhIHByb2dyYW0KKyh3aXRob3V0IG5lZWRpbmcgY29tcGxleCByZWd1bGFyIGV4cHJlc3Npb25zIHRvIHBhcnNlIHRoZSBsb2cgbWVzc2FnZSkuIFRoaXMgaXMKK3N0cmFpZ2h0Zm9yd2FyZCB0byBhY2hpZXZlIHVzaW5nIHRoZSBsb2dnaW5nIHBhY2thZ2UuIFRoZXJlIGFyZSBhIG51bWJlciBvZgord2F5cyBpbiB3aGljaCB0aGlzIGNvdWxkIGJlIGFjaGlldmVkLCBidXQgdGhlIGZvbGxvd2luZyBpcyBhIHNpbXBsZSBhcHByb2FjaAord2hpY2ggdXNlcyBKU09OIHRvIHNlcmlhbGlzZSB0aGUgZXZlbnQgaW4gYSBtYWNoaW5lLXBhcnNlYWJsZSBtYW5uZXI6OgorCisgICAgaW1wb3J0IGpzb24KKyAgICBpbXBvcnQgbG9nZ2luZworCisgICAgY2xhc3MgU3RydWN0dXJlZE1lc3NhZ2Uob2JqZWN0KToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2UsICoqa3dhcmdzKToKKyAgICAgICAgICAgIHNlbGYubWVzc2FnZSA9IG1lc3NhZ2UKKyAgICAgICAgICAgIHNlbGYua3dhcmdzID0ga3dhcmdzCisKKyAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gJyVzID4+PiAlcycgJSAoc2VsZi5tZXNzYWdlLCBqc29uLmR1bXBzKHNlbGYua3dhcmdzKSkKKworICAgIF8gPSBTdHJ1Y3R1cmVkTWVzc2FnZSAgICMgb3B0aW9uYWwsIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkKKworICAgIGxvZ2dpbmcuYmFzaWNDb25maWcobGV2ZWw9bG9nZ2luZy5JTkZPLCBmb3JtYXQ9JyUobWVzc2FnZSlzJykKKyAgICBsb2dnaW5nLmluZm8oXygnbWVzc2FnZSAxJywgZm9vPSdiYXInLCBiYXI9J2JheicsIG51bT0xMjMsIGZudW09MTIzLjQ1NikpCisKK0lmIHRoZSBhYm92ZSBzY3JpcHQgaXMgcnVuLCBpdCBwcmludHM6OgorCisgICAgbWVzc2FnZSAxID4+PiB7ImZudW0iOiAxMjMuNDU2LCAibnVtIjogMTIzLCAiYmFyIjogImJheiIsICJmb28iOiAiYmFyIn0KKworTm90ZSB0aGF0IHRoZSBvcmRlciBvZiBpdGVtcyBtaWdodCBiZSBkaWZmZXJlbnQgYWNjb3JkaW5nIHRvIHRoZSB2ZXJzaW9uIG9mCitQeXRob24gdXNlZC4KKworSWYgeW91IG5lZWQgbW9yZSBzcGVjaWFsaXNlZCBwcm9jZXNzaW5nLCB5b3UgY2FuIHVzZSBhIGN1c3RvbSBKU09OIGVuY29kZXIsCithcyBpbiB0aGUgZm9sbG93aW5nIGNvbXBsZXRlIGV4YW1wbGU6OgorCisgICAgZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzCisKKyAgICBpbXBvcnQganNvbgorICAgIGltcG9ydCBsb2dnaW5nCisKKyAgICAjIFRoaXMgbmV4dCBiaXQgaXMgdG8gZW5zdXJlIHRoZSBzY3JpcHQgcnVucyB1bmNoYW5nZWQgb24gMi54IGFuZCAzLngKKyAgICB0cnk6CisgICAgICAgIHVuaWNvZGUKKyAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICB1bmljb2RlID0gc3RyCisKKyAgICBjbGFzcyBFbmNvZGVyKGpzb24uSlNPTkVuY29kZXIpOgorICAgICAgICBkZWYgZGVmYXVsdChzZWxmLCBvKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobywgc2V0KToKKyAgICAgICAgICAgICAgICByZXR1cm4gdHVwbGUobykKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvLCB1bmljb2RlKToKKyAgICAgICAgICAgICAgICByZXR1cm4gby5lbmNvZGUoJ3VuaWNvZGVfZXNjYXBlJykuZGVjb2RlKCdhc2NpaScpCisgICAgICAgICAgICByZXR1cm4gc3VwZXIoRW5jb2Rlciwgc2VsZikuZGVmYXVsdChvKQorCisgICAgY2xhc3MgU3RydWN0dXJlZE1lc3NhZ2Uob2JqZWN0KToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2UsICoqa3dhcmdzKToKKyAgICAgICAgICAgIHNlbGYubWVzc2FnZSA9IG1lc3NhZ2UKKyAgICAgICAgICAgIHNlbGYua3dhcmdzID0ga3dhcmdzCisKKyAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICBzID0gRW5jb2RlcigpLmVuY29kZShzZWxmLmt3YXJncykKKyAgICAgICAgICAgIHJldHVybiAnJXMgPj4+ICVzJyAlIChzZWxmLm1lc3NhZ2UsIHMpCisKKyAgICBfID0gU3RydWN0dXJlZE1lc3NhZ2UgICAjIG9wdGlvbmFsLCB0byBpbXByb3ZlIHJlYWRhYmlsaXR5CisKKyAgICBkZWYgbWFpbigpOgorICAgICAgICBsb2dnaW5nLmJhc2ljQ29uZmlnKGxldmVsPWxvZ2dpbmcuSU5GTywgZm9ybWF0PSclKG1lc3NhZ2UpcycpCisgICAgICAgIGxvZ2dpbmcuaW5mbyhfKCdtZXNzYWdlIDEnLCBzZXRfdmFsdWU9c2V0KFsxLCAyLCAzXSksIHNub3dtYW49J1x1MjYwMycpKQorCisgICAgaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICAgICAgbWFpbigpCisKK1doZW4gdGhlIGFib3ZlIHNjcmlwdCBpcyBydW4sIGl0IHByaW50czo6CisKKyAgICBtZXNzYWdlIDEgPj4+IHsic25vd21hbiI6ICJcdTI2MDMiLCAic2V0X3ZhbHVlIjogWzEsIDIsIDNdfQorCitOb3RlIHRoYXQgdGhlIG9yZGVyIG9mIGl0ZW1zIG1pZ2h0IGJlIGRpZmZlcmVudCBhY2NvcmRpbmcgdG8gdGhlIHZlcnNpb24gb2YKK1B5dGhvbiB1c2VkLgorCisKKy4uIF9jdXN0b20taGFuZGxlcnM6CisKKy4uIGN1cnJlbnRtb2R1bGU6OiBsb2dnaW5nLmNvbmZpZworCitDdXN0b21pemluZyBoYW5kbGVycyB3aXRoIDpmdW5jOmBkaWN0Q29uZmlnYAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlcmUgYXJlIHRpbWVzIHdoZW4geW91IHdhbnQgdG8gY3VzdG9taXplIGxvZ2dpbmcgaGFuZGxlcnMgaW4gcGFydGljdWxhciB3YXlzLAorYW5kIGlmIHlvdSB1c2UgOmZ1bmM6YGRpY3RDb25maWdgIHlvdSBtYXkgYmUgYWJsZSB0byBkbyB0aGlzIHdpdGhvdXQKK3N1YmNsYXNzaW5nLiBBcyBhbiBleGFtcGxlLCBjb25zaWRlciB0aGF0IHlvdSBtYXkgd2FudCB0byBzZXQgdGhlIG93bmVyc2hpcCBvZiBhCitsb2cgZmlsZS4gT24gUE9TSVgsIHRoaXMgaXMgZWFzaWx5IGRvbmUgdXNpbmcgOmZ1bmM6YHNodXRpbC5jaG93bmAsIGJ1dCB0aGUgZmlsZQoraGFuZGxlcnMgaW4gdGhlIHN0ZGxpYiBkb24ndCBvZmZlciBidWlsdC1pbiBzdXBwb3J0LiBZb3UgY2FuIGN1c3RvbWl6ZSBoYW5kbGVyCitjcmVhdGlvbiB1c2luZyBhIHBsYWluIGZ1bmN0aW9uIHN1Y2ggYXM6OgorCisgICAgZGVmIG93bmVkX2ZpbGVfaGFuZGxlcihmaWxlbmFtZSwgbW9kZT0nYScsIGVuY29kaW5nPU5vbmUsIG93bmVyPU5vbmUpOgorICAgICAgICBpZiBvd25lcjoKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6CisgICAgICAgICAgICAgICAgb3BlbihmaWxlbmFtZSwgJ2EnKS5jbG9zZSgpCisgICAgICAgICAgICBzaHV0aWwuY2hvd24oZmlsZW5hbWUsICpvd25lcikKKyAgICAgICAgcmV0dXJuIGxvZ2dpbmcuRmlsZUhhbmRsZXIoZmlsZW5hbWUsIG1vZGUsIGVuY29kaW5nKQorCitZb3UgY2FuIHRoZW4gc3BlY2lmeSwgaW4gYSBsb2dnaW5nIGNvbmZpZ3VyYXRpb24gcGFzc2VkIHRvIDpmdW5jOmBkaWN0Q29uZmlnYCwKK3RoYXQgYSBsb2dnaW5nIGhhbmRsZXIgYmUgY3JlYXRlZCBieSBjYWxsaW5nIHRoaXMgZnVuY3Rpb246OgorCisgICAgTE9HR0lORyA9IHsKKyAgICAgICAgJ3ZlcnNpb24nOiAxLAorICAgICAgICAnZGlzYWJsZV9leGlzdGluZ19sb2dnZXJzJzogRmFsc2UsCisgICAgICAgICdmb3JtYXR0ZXJzJzogeworICAgICAgICAgICAgJ2RlZmF1bHQnOiB7CisgICAgICAgICAgICAgICAgJ2Zvcm1hdCc6ICclKGFzY3RpbWUpcyAlKGxldmVsbmFtZSlzICUobmFtZSlzICUobWVzc2FnZSlzJworICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2hhbmRsZXJzJzogeworICAgICAgICAgICAgJ2ZpbGUnOnsKKyAgICAgICAgICAgICAgICAjIFRoZSB2YWx1ZXMgYmVsb3cgYXJlIHBvcHBlZCBmcm9tIHRoaXMgZGljdGlvbmFyeSBhbmQKKyAgICAgICAgICAgICAgICAjIHVzZWQgdG8gY3JlYXRlIHRoZSBoYW5kbGVyLCBzZXQgdGhlIGhhbmRsZXIncyBsZXZlbCBhbmQKKyAgICAgICAgICAgICAgICAjIGl0cyBmb3JtYXR0ZXIuCisgICAgICAgICAgICAgICAgJygpJzogb3duZWRfZmlsZV9oYW5kbGVyLAorICAgICAgICAgICAgICAgICdsZXZlbCc6J0RFQlVHJywKKyAgICAgICAgICAgICAgICAnZm9ybWF0dGVyJzogJ2RlZmF1bHQnLAorICAgICAgICAgICAgICAgICMgVGhlIHZhbHVlcyBiZWxvdyBhcmUgcGFzc2VkIHRvIHRoZSBoYW5kbGVyIGNyZWF0b3IgY2FsbGFibGUKKyAgICAgICAgICAgICAgICAjIGFzIGtleXdvcmQgYXJndW1lbnRzLgorICAgICAgICAgICAgICAgICdvd25lcic6IFsncHVsc2UnLCAncHVsc2UnXSwKKyAgICAgICAgICAgICAgICAnZmlsZW5hbWUnOiAnY2hvd250ZXN0LmxvZycsCisgICAgICAgICAgICAgICAgJ21vZGUnOiAndycsCisgICAgICAgICAgICAgICAgJ2VuY29kaW5nJzogJ3V0Zi04JywKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdyb290JzogeworICAgICAgICAgICAgJ2hhbmRsZXJzJzogWydmaWxlJ10sCisgICAgICAgICAgICAnbGV2ZWwnOiAnREVCVUcnLAorICAgICAgICB9LAorICAgIH0KKworSW4gdGhpcyBleGFtcGxlIEkgYW0gc2V0dGluZyB0aGUgb3duZXJzaGlwIHVzaW5nIHRoZSBgYHB1bHNlYGAgdXNlciBhbmQgZ3JvdXAsCitqdXN0IGZvciB0aGUgcHVycG9zZXMgb2YgaWxsdXN0cmF0aW9uLiBQdXR0aW5nIGl0IHRvZ2V0aGVyIGludG8gYSB3b3JraW5nCitzY3JpcHQsIGBgY2hvd250ZXN0LnB5YGA6OgorCisgICAgaW1wb3J0IGxvZ2dpbmcsIGxvZ2dpbmcuY29uZmlnLCBvcywgc2h1dGlsCisKKyAgICBkZWYgb3duZWRfZmlsZV9oYW5kbGVyKGZpbGVuYW1lLCBtb2RlPSdhJywgZW5jb2Rpbmc9Tm9uZSwgb3duZXI9Tm9uZSk6CisgICAgICAgIGlmIG93bmVyOgorICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKKyAgICAgICAgICAgICAgICBvcGVuKGZpbGVuYW1lLCAnYScpLmNsb3NlKCkKKyAgICAgICAgICAgIHNodXRpbC5jaG93bihmaWxlbmFtZSwgKm93bmVyKQorICAgICAgICByZXR1cm4gbG9nZ2luZy5GaWxlSGFuZGxlcihmaWxlbmFtZSwgbW9kZSwgZW5jb2RpbmcpCisKKyAgICBMT0dHSU5HID0geworICAgICAgICAndmVyc2lvbic6IDEsCisgICAgICAgICdkaXNhYmxlX2V4aXN0aW5nX2xvZ2dlcnMnOiBGYWxzZSwKKyAgICAgICAgJ2Zvcm1hdHRlcnMnOiB7CisgICAgICAgICAgICAnZGVmYXVsdCc6IHsKKyAgICAgICAgICAgICAgICAnZm9ybWF0JzogJyUoYXNjdGltZSlzICUobGV2ZWxuYW1lKXMgJShuYW1lKXMgJShtZXNzYWdlKXMnCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAnaGFuZGxlcnMnOiB7CisgICAgICAgICAgICAnZmlsZSc6eworICAgICAgICAgICAgICAgICMgVGhlIHZhbHVlcyBiZWxvdyBhcmUgcG9wcGVkIGZyb20gdGhpcyBkaWN0aW9uYXJ5IGFuZAorICAgICAgICAgICAgICAgICMgdXNlZCB0byBjcmVhdGUgdGhlIGhhbmRsZXIsIHNldCB0aGUgaGFuZGxlcidzIGxldmVsIGFuZAorICAgICAgICAgICAgICAgICMgaXRzIGZvcm1hdHRlci4KKyAgICAgICAgICAgICAgICAnKCknOiBvd25lZF9maWxlX2hhbmRsZXIsCisgICAgICAgICAgICAgICAgJ2xldmVsJzonREVCVUcnLAorICAgICAgICAgICAgICAgICdmb3JtYXR0ZXInOiAnZGVmYXVsdCcsCisgICAgICAgICAgICAgICAgIyBUaGUgdmFsdWVzIGJlbG93IGFyZSBwYXNzZWQgdG8gdGhlIGhhbmRsZXIgY3JlYXRvciBjYWxsYWJsZQorICAgICAgICAgICAgICAgICMgYXMga2V5d29yZCBhcmd1bWVudHMuCisgICAgICAgICAgICAgICAgJ293bmVyJzogWydwdWxzZScsICdwdWxzZSddLAorICAgICAgICAgICAgICAgICdmaWxlbmFtZSc6ICdjaG93bnRlc3QubG9nJywKKyAgICAgICAgICAgICAgICAnbW9kZSc6ICd3JywKKyAgICAgICAgICAgICAgICAnZW5jb2RpbmcnOiAndXRmLTgnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ3Jvb3QnOiB7CisgICAgICAgICAgICAnaGFuZGxlcnMnOiBbJ2ZpbGUnXSwKKyAgICAgICAgICAgICdsZXZlbCc6ICdERUJVRycsCisgICAgICAgIH0sCisgICAgfQorCisgICAgbG9nZ2luZy5jb25maWcuZGljdENvbmZpZyhMT0dHSU5HKQorICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdteWxvZ2dlcicpCisgICAgbG9nZ2VyLmRlYnVnKCdBIGRlYnVnIG1lc3NhZ2UnKQorCitUbyBydW4gdGhpcywgeW91IHdpbGwgcHJvYmFibHkgbmVlZCB0byBydW4gYXMgYGByb290YGA6OgorCisgICAgJCBzdWRvIHB5dGhvbjMuMyBjaG93bnRlc3QucHkKKyAgICAkIGNhdCBjaG93bnRlc3QubG9nCisgICAgMjAxMy0xMS0wNSAwOTozNDo1MSwxMjggREVCVUcgbXlsb2dnZXIgQSBkZWJ1ZyBtZXNzYWdlCisgICAgJCBscyAtbCBjaG93bnRlc3QubG9nCisgICAgLXJ3LXItLXItLSAxIHB1bHNlIHB1bHNlIDU1IDIwMTMtMTEtMDUgMDk6MzQgY2hvd250ZXN0LmxvZworCitOb3RlIHRoYXQgdGhpcyBleGFtcGxlIHVzZXMgUHl0aG9uIDMuMyBiZWNhdXNlIHRoYXQncyB3aGVyZSA6ZnVuYzpgc2h1dGlsLmNob3duYAorbWFrZXMgYW4gYXBwZWFyYW5jZS4gVGhpcyBhcHByb2FjaCBzaG91bGQgd29yayB3aXRoIGFueSBQeXRob24gdmVyc2lvbiB0aGF0CitzdXBwb3J0cyA6ZnVuYzpgZGljdENvbmZpZ2AgLSBuYW1lbHksIFB5dGhvbiAyLjcsIDMuMiBvciBsYXRlci4gV2l0aCBwcmUtMy4zCit2ZXJzaW9ucywgeW91IHdvdWxkIG5lZWQgdG8gaW1wbGVtZW50IHRoZSBhY3R1YWwgb3duZXJzaGlwIGNoYW5nZSB1c2luZyBlLmcuCis6ZnVuYzpgb3MuY2hvd25gLgorCitJbiBwcmFjdGljZSwgdGhlIGhhbmRsZXItY3JlYXRpbmcgZnVuY3Rpb24gbWF5IGJlIGluIGEgdXRpbGl0eSBtb2R1bGUgc29tZXdoZXJlCitpbiB5b3VyIHByb2plY3QuIEluc3RlYWQgb2YgdGhlIGxpbmUgaW4gdGhlIGNvbmZpZ3VyYXRpb246OgorCisgICAgJygpJzogb3duZWRfZmlsZV9oYW5kbGVyLAorCit5b3UgY291bGQgdXNlIGUuZy46OgorCisgICAgJygpJzogJ2V4dDovL3Byb2plY3QudXRpbC5vd25lZF9maWxlX2hhbmRsZXInLAorCit3aGVyZSBgYHByb2plY3QudXRpbGBgIGNhbiBiZSByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwgbmFtZSBvZiB0aGUgcGFja2FnZQord2hlcmUgdGhlIGZ1bmN0aW9uIHJlc2lkZXMuIEluIHRoZSBhYm92ZSB3b3JraW5nIHNjcmlwdCwgdXNpbmcKK2BgJ2V4dDovL19fbWFpbl9fLm93bmVkX2ZpbGVfaGFuZGxlcidgYCBzaG91bGQgd29yay4gSGVyZSwgdGhlIGFjdHVhbCBjYWxsYWJsZQoraXMgcmVzb2x2ZWQgYnkgOmZ1bmM6YGRpY3RDb25maWdgIGZyb20gdGhlIGBgZXh0Oi8vYGAgc3BlY2lmaWNhdGlvbi4KKworVGhpcyBleGFtcGxlIGhvcGVmdWxseSBhbHNvIHBvaW50cyB0aGUgd2F5IHRvIGhvdyB5b3UgY291bGQgaW1wbGVtZW50IG90aGVyCit0eXBlcyBvZiBmaWxlIGNoYW5nZSAtIGUuZy4gc2V0dGluZyBzcGVjaWZpYyBQT1NJWCBwZXJtaXNzaW9uIGJpdHMgLSBpbiB0aGUKK3NhbWUgd2F5LCB1c2luZyA6ZnVuYzpgb3MuY2htb2RgLgorCitPZiBjb3Vyc2UsIHRoZSBhcHByb2FjaCBjb3VsZCBhbHNvIGJlIGV4dGVuZGVkIHRvIHR5cGVzIG9mIGhhbmRsZXIgb3RoZXIgdGhhbiBhCis6Y2xhc3M6YH5sb2dnaW5nLkZpbGVIYW5kbGVyYCAtIGZvciBleGFtcGxlLCBvbmUgb2YgdGhlIHJvdGF0aW5nIGZpbGUgaGFuZGxlcnMsCitvciBhIGRpZmZlcmVudCB0eXBlIG9mIGhhbmRsZXIgYWx0b2dldGhlci4KKworCisuLiBfZmlsdGVycy1kaWN0Y29uZmlnOgorCitDb25maWd1cmluZyBmaWx0ZXJzIHdpdGggOmZ1bmM6YGRpY3RDb25maWdgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1lvdSAqY2FuKiBjb25maWd1cmUgZmlsdGVycyB1c2luZyA6ZnVuYzpgfmxvZ2dpbmcuY29uZmlnLmRpY3RDb25maWdgLCB0aG91Z2ggaXQKK21pZ2h0IG5vdCBiZSBvYnZpb3VzIGF0IGZpcnN0IGdsYW5jZSBob3cgdG8gZG8gaXQgKGhlbmNlIHRoaXMgcmVjaXBlKS4gU2luY2UKKzpjbGFzczpgfmxvZ2dpbmcuRmlsdGVyYCBpcyB0aGUgb25seSBmaWx0ZXIgY2xhc3MgaW5jbHVkZWQgaW4gdGhlIHN0YW5kYXJkCitsaWJyYXJ5LCBhbmQgaXQgaXMgdW5saWtlbHkgdG8gY2F0ZXIgdG8gbWFueSByZXF1aXJlbWVudHMgKGl0J3Mgb25seSB0aGVyZSBhcyBhCitiYXNlIGNsYXNzKSwgeW91IHdpbGwgdHlwaWNhbGx5IG5lZWQgdG8gZGVmaW5lIHlvdXIgb3duIDpjbGFzczpgfmxvZ2dpbmcuRmlsdGVyYAorc3ViY2xhc3Mgd2l0aCBhbiBvdmVycmlkZGVuIDptZXRoOmB+bG9nZ2luZy5GaWx0ZXIuZmlsdGVyYCBtZXRob2QuIFRvIGRvIHRoaXMsCitzcGVjaWZ5IHRoZSBgYCgpYGAga2V5IGluIHRoZSBjb25maWd1cmF0aW9uIGRpY3Rpb25hcnkgZm9yIHRoZSBmaWx0ZXIsCitzcGVjaWZ5aW5nIGEgY2FsbGFibGUgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgZmlsdGVyIChhIGNsYXNzIGlzIHRoZQorbW9zdCBvYnZpb3VzLCBidXQgeW91IGNhbiBwcm92aWRlIGFueSBjYWxsYWJsZSB3aGljaCByZXR1cm5zIGEKKzpjbGFzczpgfmxvZ2dpbmcuRmlsdGVyYCBpbnN0YW5jZSkuIEhlcmUgaXMgYSBjb21wbGV0ZSBleGFtcGxlOjoKKworICAgIGltcG9ydCBsb2dnaW5nCisgICAgaW1wb3J0IGxvZ2dpbmcuY29uZmlnCisgICAgaW1wb3J0IHN5cworCisgICAgY2xhc3MgTXlGaWx0ZXIobG9nZ2luZy5GaWx0ZXIpOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyYW09Tm9uZSk6CisgICAgICAgICAgICBzZWxmLnBhcmFtID0gcGFyYW0KKworICAgICAgICBkZWYgZmlsdGVyKHNlbGYsIHJlY29yZCk6CisgICAgICAgICAgICBpZiBzZWxmLnBhcmFtIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgYWxsb3cgPSBUcnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGFsbG93ID0gc2VsZi5wYXJhbSBub3QgaW4gcmVjb3JkLm1zZworICAgICAgICAgICAgaWYgYWxsb3c6CisgICAgICAgICAgICAgICAgcmVjb3JkLm1zZyA9ICdjaGFuZ2VkOiAnICsgcmVjb3JkLm1zZworICAgICAgICAgICAgcmV0dXJuIGFsbG93CisKKyAgICBMT0dHSU5HID0geworICAgICAgICAndmVyc2lvbic6IDEsCisgICAgICAgICdmaWx0ZXJzJzogeworICAgICAgICAgICAgJ215ZmlsdGVyJzogeworICAgICAgICAgICAgICAgICcoKSc6IE15RmlsdGVyLAorICAgICAgICAgICAgICAgICdwYXJhbSc6ICdub3Nob3cnLAorICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAnaGFuZGxlcnMnOiB7CisgICAgICAgICAgICAnY29uc29sZSc6IHsKKyAgICAgICAgICAgICAgICAnY2xhc3MnOiAnbG9nZ2luZy5TdHJlYW1IYW5kbGVyJywKKyAgICAgICAgICAgICAgICAnZmlsdGVycyc6IFsnbXlmaWx0ZXInXQorICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAncm9vdCc6IHsKKyAgICAgICAgICAgICdsZXZlbCc6ICdERUJVRycsCisgICAgICAgICAgICAnaGFuZGxlcnMnOiBbJ2NvbnNvbGUnXQorICAgICAgICB9LAorICAgIH0KKworICAgIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgICAgIGxvZ2dpbmcuY29uZmlnLmRpY3RDb25maWcoTE9HR0lORykKKyAgICAgICAgbG9nZ2luZy5kZWJ1ZygnaGVsbG8nKQorICAgICAgICBsb2dnaW5nLmRlYnVnKCdoZWxsbyAtIG5vc2hvdycpCisKK1RoaXMgZXhhbXBsZSBzaG93cyBob3cgeW91IGNhbiBwYXNzIGNvbmZpZ3VyYXRpb24gZGF0YSB0byB0aGUgY2FsbGFibGUgd2hpY2gKK2NvbnN0cnVjdHMgdGhlIGluc3RhbmNlLCBpbiB0aGUgZm9ybSBvZiBrZXl3b3JkIHBhcmFtZXRlcnMuIFdoZW4gcnVuLCB0aGUgYWJvdmUKK3NjcmlwdCB3aWxsIHByaW50OjoKKworICAgIGNoYW5nZWQ6IGhlbGxvCisKK3doaWNoIHNob3dzIHRoYXQgdGhlIGZpbHRlciBpcyB3b3JraW5nIGFzIGNvbmZpZ3VyZWQuCisKK0EgY291cGxlIG9mIGV4dHJhIHBvaW50cyB0byBub3RlOgorCisqIElmIHlvdSBjYW4ndCByZWZlciB0byB0aGUgY2FsbGFibGUgZGlyZWN0bHkgaW4gdGhlIGNvbmZpZ3VyYXRpb24gKGUuZy4gaWYgaXQKKyAgbGl2ZXMgaW4gYSBkaWZmZXJlbnQgbW9kdWxlLCBhbmQgeW91IGNhbid0IGltcG9ydCBpdCBkaXJlY3RseSB3aGVyZSB0aGUKKyAgY29uZmlndXJhdGlvbiBkaWN0aW9uYXJ5IGlzKSwgeW91IGNhbiB1c2UgdGhlIGZvcm0gYGBleHQ6Ly8uLi5gYCBhcyBkZXNjcmliZWQKKyAgaW4gOnJlZjpgbG9nZ2luZy1jb25maWctZGljdC1leHRlcm5hbG9iamAuIEZvciBleGFtcGxlLCB5b3UgY291bGQgaGF2ZSB1c2VkCisgIHRoZSB0ZXh0IGBgJ2V4dDovL19fbWFpbl9fLk15RmlsdGVyJ2BgIGluc3RlYWQgb2YgYGBNeUZpbHRlcmBgIGluIHRoZSBhYm92ZQorICBleGFtcGxlLgorCisqIEFzIHdlbGwgYXMgZm9yIGZpbHRlcnMsIHRoaXMgdGVjaG5pcXVlIGNhbiBhbHNvIGJlIHVzZWQgdG8gY29uZmlndXJlIGN1c3RvbQorICBoYW5kbGVycyBhbmQgZm9ybWF0dGVycy4gU2VlIDpyZWY6YGxvZ2dpbmctY29uZmlnLWRpY3QtdXNlcmRlZmAgZm9yIG1vcmUKKyAgaW5mb3JtYXRpb24gb24gaG93IGxvZ2dpbmcgc3VwcG9ydHMgdXNpbmcgdXNlci1kZWZpbmVkIG9iamVjdHMgaW4gaXRzCisgIGNvbmZpZ3VyYXRpb24sIGFuZCBzZWUgdGhlIG90aGVyIGNvb2tib29rIHJlY2lwZSA6cmVmOmBjdXN0b20taGFuZGxlcnNgIGFib3ZlLgorCmRpZmYgLS1naXQgYS9Eb2MvaG93dG8vbG9nZ2luZy5yc3QgYi9Eb2MvaG93dG8vbG9nZ2luZy5yc3QKaW5kZXggMDI5YTBhYi4uZmRiNmM1MyAxMDA2NDQKLS0tIGEvRG9jL2hvd3RvL2xvZ2dpbmcucnN0CisrKyBiL0RvYy9ob3d0by9sb2dnaW5nLnJzdApAQCAtNjMsNiArNjMsOCBAQAogdGhleSBhcmUgdXNlZCB0byB0cmFjay4gVGhlIHN0YW5kYXJkIGxldmVscyBhbmQgdGhlaXIgYXBwbGljYWJpbGl0eSBhcmUKIGRlc2NyaWJlZCBiZWxvdyAoaW4gaW5jcmVhc2luZyBvcmRlciBvZiBzZXZlcml0eSk6CiAKKy4uIHRhYnVsYXJjb2x1bW5zOjogfGx8THwKKwogKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKIHwgTGV2ZWwgICAgICAgIHwgV2hlbiBpdCdzIHVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiArPT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KwpAQCAtMTIwLDcgKzEyMiw4IEBACiBeXl5eXl5eXl5eXl5eXl5eXgogCiBBIHZlcnkgY29tbW9uIHNpdHVhdGlvbiBpcyB0aGF0IG9mIHJlY29yZGluZyBsb2dnaW5nIGV2ZW50cyBpbiBhIGZpbGUsIHNvIGxldCdzCi1sb29rIGF0IHRoYXQgbmV4dDo6Citsb29rIGF0IHRoYXQgbmV4dC4gQmUgc3VyZSB0byB0cnkgdGhlIGZvbGxvd2luZyBpbiBhIG5ld2x5LXN0YXJ0ZWQgUHl0aG9uCitpbnRlcnByZXRlciwgYW5kIGRvbid0IGp1c3QgY29udGludWUgZnJvbSB0aGUgc2Vzc2lvbiBkZXNjcmliZWQgYWJvdmU6OgogCiAgICBpbXBvcnQgbG9nZ2luZwogICAgbG9nZ2luZy5iYXNpY0NvbmZpZyhmaWxlbmFtZT0nZXhhbXBsZS5sb2cnLGxldmVsPWxvZ2dpbmcuREVCVUcpCkBAIC0zMzAsNiArMzMzLDkgQEAKICAgdG8gb3V0cHV0LgogKiBGb3JtYXR0ZXJzIHNwZWNpZnkgdGhlIGxheW91dCBvZiBsb2cgcmVjb3JkcyBpbiB0aGUgZmluYWwgb3V0cHV0LgogCitMb2cgZXZlbnQgaW5mb3JtYXRpb24gaXMgcGFzc2VkIGJldHdlZW4gbG9nZ2VycywgaGFuZGxlcnMsIGZpbHRlcnMgYW5kCitmb3JtYXR0ZXJzIGluIGEgOmNsYXNzOmBMb2dSZWNvcmRgIGluc3RhbmNlLgorCiBMb2dnaW5nIGlzIHBlcmZvcm1lZCBieSBjYWxsaW5nIG1ldGhvZHMgb24gaW5zdGFuY2VzIG9mIHRoZSA6Y2xhc3M6YExvZ2dlcmAKIGNsYXNzIChoZXJlYWZ0ZXIgY2FsbGVkIDpkZm46YGxvZ2dlcnNgKS4gRWFjaCBpbnN0YW5jZSBoYXMgYSBuYW1lLCBhbmQgdGhleSBhcmUKIGNvbmNlcHR1YWxseSBhcnJhbmdlZCBpbiBhIG5hbWVzcGFjZSBoaWVyYXJjaHkgdXNpbmcgZG90cyAocGVyaW9kcykgYXMKQEAgLTM3NCw2ICszODAsMTMgQEAKICpmb3JtYXQqIGtleXdvcmQgYXJndW1lbnQuIEZvciBhbGwgb3B0aW9ucyByZWdhcmRpbmcgaG93IGEgZm9ybWF0IHN0cmluZyBpcwogY29uc3RydWN0ZWQsIHNlZSA6cmVmOmBmb3JtYXR0ZXItb2JqZWN0c2AuCiAKK0xvZ2dpbmcgRmxvdworXl5eXl5eXl5eXl5eCisKK1RoZSBmbG93IG9mIGxvZyBldmVudCBpbmZvcm1hdGlvbiBpbiBsb2dnZXJzIGFuZCBoYW5kbGVycyBpcyBpbGx1c3RyYXRlZCBpbiB0aGUKK2ZvbGxvd2luZyBkaWFncmFtLgorCisuLiBpbWFnZTo6IGxvZ2dpbmdfZmxvdy5wbmcKIAogTG9nZ2VycwogXl5eXl5eXgpAQCAtNDU3LDEyICs0NzAsMTMgQEAKIAogOmNsYXNzOmB+bG9nZ2luZy5IYW5kbGVyYCBvYmplY3RzIGFyZSByZXNwb25zaWJsZSBmb3IgZGlzcGF0Y2hpbmcgdGhlCiBhcHByb3ByaWF0ZSBsb2cgbWVzc2FnZXMgKGJhc2VkIG9uIHRoZSBsb2cgbWVzc2FnZXMnIHNldmVyaXR5KSB0byB0aGUgaGFuZGxlcidzCi1zcGVjaWZpZWQgZGVzdGluYXRpb24uICBMb2dnZXIgb2JqZWN0cyBjYW4gYWRkIHplcm8gb3IgbW9yZSBoYW5kbGVyIG9iamVjdHMgdG8KLXRoZW1zZWx2ZXMgd2l0aCBhbiA6ZnVuYzpgYWRkSGFuZGxlcmAgbWV0aG9kLiAgQXMgYW4gZXhhbXBsZSBzY2VuYXJpbywgYW4KLWFwcGxpY2F0aW9uIG1heSB3YW50IHRvIHNlbmQgYWxsIGxvZyBtZXNzYWdlcyB0byBhIGxvZyBmaWxlLCBhbGwgbG9nIG1lc3NhZ2VzCi1vZiBlcnJvciBvciBoaWdoZXIgdG8gc3Rkb3V0LCBhbmQgYWxsIG1lc3NhZ2VzIG9mIGNyaXRpY2FsIHRvIGFuIGVtYWlsIGFkZHJlc3MuCi1UaGlzIHNjZW5hcmlvIHJlcXVpcmVzIHRocmVlIGluZGl2aWR1YWwgaGFuZGxlcnMgd2hlcmUgZWFjaCBoYW5kbGVyIGlzCi1yZXNwb25zaWJsZSBmb3Igc2VuZGluZyBtZXNzYWdlcyBvZiBhIHNwZWNpZmljIHNldmVyaXR5IHRvIGEgc3BlY2lmaWMgbG9jYXRpb24uCitzcGVjaWZpZWQgZGVzdGluYXRpb24uICA6Y2xhc3M6YExvZ2dlcmAgb2JqZWN0cyBjYW4gYWRkIHplcm8gb3IgbW9yZSBoYW5kbGVyCitvYmplY3RzIHRvIHRoZW1zZWx2ZXMgd2l0aCBhbiA6bWV0aDpgfkxvZ2dlci5hZGRIYW5kbGVyYCBtZXRob2QuICBBcyBhbiBleGFtcGxlCitzY2VuYXJpbywgYW4gYXBwbGljYXRpb24gbWF5IHdhbnQgdG8gc2VuZCBhbGwgbG9nIG1lc3NhZ2VzIHRvIGEgbG9nIGZpbGUsIGFsbAorbG9nIG1lc3NhZ2VzIG9mIGVycm9yIG9yIGhpZ2hlciB0byBzdGRvdXQsIGFuZCBhbGwgbWVzc2FnZXMgb2YgY3JpdGljYWwgdG8gYW4KK2VtYWlsIGFkZHJlc3MuIFRoaXMgc2NlbmFyaW8gcmVxdWlyZXMgdGhyZWUgaW5kaXZpZHVhbCBoYW5kbGVycyB3aGVyZSBlYWNoCitoYW5kbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIG1lc3NhZ2VzIG9mIGEgc3BlY2lmaWMgc2V2ZXJpdHkgdG8gYSBzcGVjaWZpYworbG9jYXRpb24uCiAKIFRoZSBzdGFuZGFyZCBsaWJyYXJ5IGluY2x1ZGVzIHF1aXRlIGEgZmV3IGhhbmRsZXIgdHlwZXMgKHNlZQogOnJlZjpgdXNlZnVsLWhhbmRsZXJzYCk7IHRoZSB0dXRvcmlhbHMgdXNlIG1haW5seSA6Y2xhc3M6YFN0cmVhbUhhbmRsZXJgIGFuZApAQCAtNDczLDE2ICs0ODcsMTcgQEAKIGRldmVsb3BlcnMgd2hvIGFyZSB1c2luZyB0aGUgYnVpbHQtaW4gaGFuZGxlciBvYmplY3RzICh0aGF0IGlzLCBub3QgY3JlYXRpbmcKIGN1c3RvbSBoYW5kbGVycykgYXJlIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBtZXRob2RzOgogCi0qIFRoZSA6bWV0aDpgSGFuZGxlci5zZXRMZXZlbGAgbWV0aG9kLCBqdXN0IGFzIGluIGxvZ2dlciBvYmplY3RzLCBzcGVjaWZpZXMgdGhlCisqIFRoZSA6bWV0aDpgfkhhbmRsZXIuc2V0TGV2ZWxgIG1ldGhvZCwganVzdCBhcyBpbiBsb2dnZXIgb2JqZWN0cywgc3BlY2lmaWVzIHRoZQogICBsb3dlc3Qgc2V2ZXJpdHkgdGhhdCB3aWxsIGJlIGRpc3BhdGNoZWQgdG8gdGhlIGFwcHJvcHJpYXRlIGRlc3RpbmF0aW9uLiAgV2h5CiAgIGFyZSB0aGVyZSB0d28gOmZ1bmM6YHNldExldmVsYCBtZXRob2RzPyAgVGhlIGxldmVsIHNldCBpbiB0aGUgbG9nZ2VyCiAgIGRldGVybWluZXMgd2hpY2ggc2V2ZXJpdHkgb2YgbWVzc2FnZXMgaXQgd2lsbCBwYXNzIHRvIGl0cyBoYW5kbGVycy4gIFRoZSBsZXZlbAogICBzZXQgaW4gZWFjaCBoYW5kbGVyIGRldGVybWluZXMgd2hpY2ggbWVzc2FnZXMgdGhhdCBoYW5kbGVyIHdpbGwgc2VuZCBvbi4KIAotKiA6ZnVuYzpgc2V0Rm9ybWF0dGVyYCBzZWxlY3RzIGEgRm9ybWF0dGVyIG9iamVjdCBmb3IgdGhpcyBoYW5kbGVyIHRvIHVzZS4KKyogOm1ldGg6YH5IYW5kbGVyLnNldEZvcm1hdHRlcmAgc2VsZWN0cyBhIEZvcm1hdHRlciBvYmplY3QgZm9yIHRoaXMgaGFuZGxlciB0bworICB1c2UuCiAKLSogOmZ1bmM6YGFkZEZpbHRlcmAgYW5kIDpmdW5jOmByZW1vdmVGaWx0ZXJgIHJlc3BlY3RpdmVseSBjb25maWd1cmUgYW5kCi0gIGRlY29uZmlndXJlIGZpbHRlciBvYmplY3RzIG9uIGhhbmRsZXJzLgorKiA6bWV0aDpgfkhhbmRsZXIuYWRkRmlsdGVyYCBhbmQgOm1ldGg6YH5IYW5kbGVyLnJlbW92ZUZpbHRlcmAgcmVzcGVjdGl2ZWx5CisgIGNvbmZpZ3VyZSBhbmQgZGVjb25maWd1cmUgZmlsdGVyIG9iamVjdHMgb24gaGFuZGxlcnMuCiAKIEFwcGxpY2F0aW9uIGNvZGUgc2hvdWxkIG5vdCBkaXJlY3RseSBpbnN0YW50aWF0ZSBhbmQgdXNlIGluc3RhbmNlcyBvZgogOmNsYXNzOmBIYW5kbGVyYC4gIEluc3RlYWQsIHRoZSA6Y2xhc3M6YEhhbmRsZXJgIGNsYXNzIGlzIGEgYmFzZSBjbGFzcyB0aGF0CkBAIC02NDIsNiArNjU3LDIxIEBACiBjb2RlIGFwcHJvYWNoLCBtYWlubHkgc2VwYXJhdGlvbiBvZiBjb25maWd1cmF0aW9uIGFuZCBjb2RlIGFuZCB0aGUgYWJpbGl0eSBvZgogbm9uY29kZXJzIHRvIGVhc2lseSBtb2RpZnkgdGhlIGxvZ2dpbmcgcHJvcGVydGllcy4KIAorLi4gd2FybmluZzo6IFRoZSA6ZnVuYzpgZmlsZUNvbmZpZ2AgZnVuY3Rpb24gdGFrZXMgYSBkZWZhdWx0IHBhcmFtZXRlciwKKyAgIGBgZGlzYWJsZV9leGlzdGluZ19sb2dnZXJzYGAsIHdoaWNoIGRlZmF1bHRzIHRvIGBgVHJ1ZWBgIGZvciByZWFzb25zIG9mCisgICBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBUaGlzIG1heSBvciBtYXkgbm90IGJlIHdoYXQgeW91IHdhbnQsIHNpbmNlIGl0CisgICB3aWxsIGNhdXNlIGFueSBsb2dnZXJzIGV4aXN0aW5nIGJlZm9yZSB0aGUgOmZ1bmM6YGZpbGVDb25maWdgIGNhbGwgdG8KKyAgIGJlIGRpc2FibGVkIHVubGVzcyB0aGV5IChvciBhbiBhbmNlc3RvcikgYXJlIGV4cGxpY2l0bHkgbmFtZWQgaW4gdGhlCisgICBjb25maWd1cmF0aW9uLiAgUGxlYXNlIHJlZmVyIHRvIHRoZSByZWZlcmVuY2UgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZQorICAgaW5mb3JtYXRpb24sIGFuZCBzcGVjaWZ5IGBgRmFsc2VgYCBmb3IgdGhpcyBwYXJhbWV0ZXIgaWYgeW91IHdpc2guCisKKyAgIFRoZSBkaWN0aW9uYXJ5IHBhc3NlZCB0byA6ZnVuYzpgZGljdENvbmZpZ2AgY2FuIGFsc28gc3BlY2lmeSBhIEJvb2xlYW4KKyAgIHZhbHVlIHdpdGgga2V5IGBgZGlzYWJsZV9leGlzdGluZ19sb2dnZXJzYGAsIHdoaWNoIGlmIG5vdCBzcGVjaWZpZWQKKyAgIGV4cGxpY2l0bHkgaW4gdGhlIGRpY3Rpb25hcnkgYWxzbyBkZWZhdWx0cyB0byBiZWluZyBpbnRlcnByZXRlZCBhcworICAgYGBUcnVlYGAuICBUaGlzIGxlYWRzIHRvIHRoZSBsb2dnZXItZGlzYWJsaW5nIGJlaGF2aW91ciBkZXNjcmliZWQgYWJvdmUsCisgICB3aGljaCBtYXkgbm90IGJlIHdoYXQgeW91IHdhbnQgLSBpbiB3aGljaCBjYXNlLCBwcm92aWRlIHRoZSBrZXkKKyAgIGV4cGxpY2l0bHkgd2l0aCBhIHZhbHVlIG9mIGBgRmFsc2VgYC4KKwogLi4gY3VycmVudG1vZHVsZTo6IGxvZ2dpbmcKIAogTm90ZSB0aGF0IHRoZSBjbGFzcyBuYW1lcyByZWZlcmVuY2VkIGluIGNvbmZpZyBmaWxlcyBuZWVkIHRvIGJlIGVpdGhlciByZWxhdGl2ZQpAQCAtNzEzLDEyICs3NDMsMTEgQEAKIFdoZW4gZGV2ZWxvcGluZyBhIGxpYnJhcnkgd2hpY2ggdXNlcyBsb2dnaW5nLCB5b3Ugc2hvdWxkIHRha2UgY2FyZSB0bwogZG9jdW1lbnQgaG93IHRoZSBsaWJyYXJ5IHVzZXMgbG9nZ2luZyAtIGZvciBleGFtcGxlLCB0aGUgbmFtZXMgb2YgbG9nZ2VycwogdXNlZC4gU29tZSBjb25zaWRlcmF0aW9uIGFsc28gbmVlZHMgdG8gYmUgZ2l2ZW4gdG8gaXRzIGxvZ2dpbmcgY29uZmlndXJhdGlvbi4KLUlmIHRoZSB1c2luZyBhcHBsaWNhdGlvbiBkb2VzIG5vdCB1c2UgbG9nZ2luZywgYW5kIGxpYnJhcnkgY29kZSBtYWtlcyBsb2dnaW5nCi1jYWxscywgdGhlbiAoYXMgZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uKSBldmVudHMgb2Ygc2V2ZXJpdHkKLWBgV0FSTklOR2BgIGFuZCBncmVhdGVyIHdpbGwgYmUgcHJpbnRlZCB0byBgYHN5cy5zdGRlcnJgYC4gVGhpcyBpcyByZWdhcmRlZCBhcwotdGhlIGJlc3QgZGVmYXVsdCBiZWhhdmlvdXIuCitJZiB0aGUgdXNpbmcgYXBwbGljYXRpb24gZG9lcyBub3QgY29uZmlndXJlIGxvZ2dpbmcsIGFuZCBsaWJyYXJ5IGNvZGUgbWFrZXMKK2xvZ2dpbmcgY2FsbHMsIHRoZW4gKGFzIGRlc2NyaWJlZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbikgYW4gZXJyb3IgbWVzc2FnZQord2lsbCBiZSBwcmludGVkIHRvIGBgc3lzLnN0ZGVycmBgLgogCi1JZiBmb3Igc29tZSByZWFzb24geW91ICpkb24ndCogd2FudCB0aGVzZSBtZXNzYWdlcyBwcmludGVkIGluIHRoZSBhYnNlbmNlIG9mCitJZiBmb3Igc29tZSByZWFzb24geW91ICpkb24ndCogd2FudCB0aGlzIG1lc3NhZ2UgcHJpbnRlZCBpbiB0aGUgYWJzZW5jZSBvZgogYW55IGxvZ2dpbmcgY29uZmlndXJhdGlvbiwgeW91IGNhbiBhdHRhY2ggYSBkby1ub3RoaW5nIGhhbmRsZXIgdG8gdGhlIHRvcC1sZXZlbAogbG9nZ2VyIGZvciB5b3VyIGxpYnJhcnkuIFRoaXMgYXZvaWRzIHRoZSBtZXNzYWdlIGJlaW5nIHByaW50ZWQsIHNpbmNlIGEgaGFuZGxlcgogd2lsbCBiZSBhbHdheXMgYmUgZm91bmQgZm9yIHRoZSBsaWJyYXJ5J3MgZXZlbnRzOiBpdCBqdXN0IGRvZXNuJ3QgcHJvZHVjZSBhbnkKQEAgLTczMCw3ICs3NTksNyBAQAogQSBkby1ub3RoaW5nIGhhbmRsZXIgaXMgaW5jbHVkZWQgaW4gdGhlIGxvZ2dpbmcgcGFja2FnZToKIDpjbGFzczpgfmxvZ2dpbmcuTnVsbEhhbmRsZXJgIChzaW5jZSBQeXRob24gMi43KS4gQW4gaW5zdGFuY2Ugb2YgdGhpcyBoYW5kbGVyCiBjb3VsZCBiZSBhZGRlZCB0byB0aGUgdG9wLWxldmVsIGxvZ2dlciBvZiB0aGUgbG9nZ2luZyBuYW1lc3BhY2UgdXNlZCBieSB0aGUKLWxpYnJhcnkgKCppZiogeW91IHdhbnQgdG8gcHJldmVudCB5b3VyIGxpYnJhcnkncyBsb2dnZWQgZXZlbnRzIGJlaW5nIG91dHB1dCB0bworbGlicmFyeSAoKmlmKiB5b3Ugd2FudCB0byBwcmV2ZW50IGFuIGVycm9yIG1lc3NhZ2UgYmVpbmcgb3V0cHV0IHRvCiBgYHN5cy5zdGRlcnJgYCBpbiB0aGUgYWJzZW5jZSBvZiBsb2dnaW5nIGNvbmZpZ3VyYXRpb24pLiBJZiBhbGwgbG9nZ2luZyBieSBhCiBsaWJyYXJ5ICpmb28qIGlzIGRvbmUgdXNpbmcgbG9nZ2VycyB3aXRoIG5hbWVzIG1hdGNoaW5nICdmb28ueCcsICdmb28ueC55JywKIGV0Yy4gdGhlbiB0aGUgY29kZTo6CkBAIC03NDIsMTMgKzc3MSwxNCBAQAogbGlicmFyaWVzLCB0aGVuIHRoZSBsb2dnZXIgbmFtZSBzcGVjaWZpZWQgY2FuIGJlICdvcmduYW1lLmZvbycgcmF0aGVyIHRoYW4KIGp1c3QgJ2ZvbycuCiAKLSoqUExFQVNFIE5PVEU6KiogSXQgaXMgc3Ryb25nbHkgYWR2aXNlZCB0aGF0IHlvdSAqZG8gbm90IGFkZCBhbnkgaGFuZGxlcnMgb3RoZXIKLXRoYW4qIDpjbGFzczpgfmxvZ2dpbmcuTnVsbEhhbmRsZXJgICp0byB5b3VyIGxpYnJhcnkncyBsb2dnZXJzKi4gVGhpcyBpcwotYmVjYXVzZSB0aGUgY29uZmlndXJhdGlvbiBvZiBoYW5kbGVycyBpcyB0aGUgcHJlcm9nYXRpdmUgb2YgdGhlIGFwcGxpY2F0aW9uCi1kZXZlbG9wZXIgd2hvIHVzZXMgeW91ciBsaWJyYXJ5LiBUaGUgYXBwbGljYXRpb24gZGV2ZWxvcGVyIGtub3dzIHRoZWlyIHRhcmdldAotYXVkaWVuY2UgYW5kIHdoYXQgaGFuZGxlcnMgYXJlIG1vc3QgYXBwcm9wcmlhdGUgZm9yIHRoZWlyIGFwcGxpY2F0aW9uOiBpZiB5b3UKLWFkZCBoYW5kbGVycyAndW5kZXIgdGhlIGhvb2QnLCB5b3UgbWlnaHQgd2VsbCBpbnRlcmZlcmUgd2l0aCB0aGVpciBhYmlsaXR5IHRvCi1jYXJyeSBvdXQgdW5pdCB0ZXN0cyBhbmQgZGVsaXZlciBsb2dzIHdoaWNoIHN1aXQgdGhlaXIgcmVxdWlyZW1lbnRzLgorLi4gbm90ZTo6IEl0IGlzIHN0cm9uZ2x5IGFkdmlzZWQgdGhhdCB5b3UgKmRvIG5vdCBhZGQgYW55IGhhbmRsZXJzIG90aGVyCisgICB0aGFuKiA6Y2xhc3M6YH5sb2dnaW5nLk51bGxIYW5kbGVyYCAqdG8geW91ciBsaWJyYXJ5J3MgbG9nZ2VycyouIFRoaXMgaXMKKyAgIGJlY2F1c2UgdGhlIGNvbmZpZ3VyYXRpb24gb2YgaGFuZGxlcnMgaXMgdGhlIHByZXJvZ2F0aXZlIG9mIHRoZSBhcHBsaWNhdGlvbgorICAgZGV2ZWxvcGVyIHdobyB1c2VzIHlvdXIgbGlicmFyeS4gVGhlIGFwcGxpY2F0aW9uIGRldmVsb3BlciBrbm93cyB0aGVpcgorICAgdGFyZ2V0IGF1ZGllbmNlIGFuZCB3aGF0IGhhbmRsZXJzIGFyZSBtb3N0IGFwcHJvcHJpYXRlIGZvciB0aGVpcgorICAgYXBwbGljYXRpb246IGlmIHlvdSBhZGQgaGFuZGxlcnMgJ3VuZGVyIHRoZSBob29kJywgeW91IG1pZ2h0IHdlbGwgaW50ZXJmZXJlCisgICB3aXRoIHRoZWlyIGFiaWxpdHkgdG8gY2Fycnkgb3V0IHVuaXQgdGVzdHMgYW5kIGRlbGl2ZXIgbG9ncyB3aGljaCBzdWl0IHRoZWlyCisgICByZXF1aXJlbWVudHMuCiAKIAogTG9nZ2luZyBMZXZlbHMKQEAgLTg5MSwxNiArOTIxLDE2IEBACiB1c2Ugd2l0aCB0aGUgJSBvcGVyYXRvciBhbmQgYSBkaWN0aW9uYXJ5LgogCiBGb3IgZm9ybWF0dGluZyBtdWx0aXBsZSBtZXNzYWdlcyBpbiBhIGJhdGNoLCBpbnN0YW5jZXMgb2YKLTpjbGFzczpgQnVmZmVyaW5nRm9ybWF0dGVyYCBjYW4gYmUgdXNlZC4gSW4gYWRkaXRpb24gdG8gdGhlIGZvcm1hdCBzdHJpbmcgKHdoaWNoCi1pcyBhcHBsaWVkIHRvIGVhY2ggbWVzc2FnZSBpbiB0aGUgYmF0Y2gpLCB0aGVyZSBpcyBwcm92aXNpb24gZm9yIGhlYWRlciBhbmQKLXRyYWlsZXIgZm9ybWF0IHN0cmluZ3MuCis6Y2xhc3M6YH5oYW5kbGVycy5CdWZmZXJpbmdGb3JtYXR0ZXJgIGNhbiBiZSB1c2VkLiBJbiBhZGRpdGlvbiB0byB0aGUgZm9ybWF0CitzdHJpbmcgKHdoaWNoIGlzIGFwcGxpZWQgdG8gZWFjaCBtZXNzYWdlIGluIHRoZSBiYXRjaCksIHRoZXJlIGlzIHByb3Zpc2lvbiBmb3IKK2hlYWRlciBhbmQgdHJhaWxlciBmb3JtYXQgc3RyaW5ncy4KIAogV2hlbiBmaWx0ZXJpbmcgYmFzZWQgb24gbG9nZ2VyIGxldmVsIGFuZC9vciBoYW5kbGVyIGxldmVsIGlzIG5vdCBlbm91Z2gsCiBpbnN0YW5jZXMgb2YgOmNsYXNzOmBGaWx0ZXJgIGNhbiBiZSBhZGRlZCB0byBib3RoIDpjbGFzczpgTG9nZ2VyYCBhbmQKLTpjbGFzczpgSGFuZGxlcmAgaW5zdGFuY2VzICh0aHJvdWdoIHRoZWlyIDptZXRoOmBhZGRGaWx0ZXJgIG1ldGhvZCkuIEJlZm9yZQotZGVjaWRpbmcgdG8gcHJvY2VzcyBhIG1lc3NhZ2UgZnVydGhlciwgYm90aCBsb2dnZXJzIGFuZCBoYW5kbGVycyBjb25zdWx0IGFsbAotdGhlaXIgZmlsdGVycyBmb3IgcGVybWlzc2lvbi4gSWYgYW55IGZpbHRlciByZXR1cm5zIGEgZmFsc2UgdmFsdWUsIHRoZSBtZXNzYWdlCi1pcyBub3QgcHJvY2Vzc2VkIGZ1cnRoZXIuCis6Y2xhc3M6YEhhbmRsZXJgIGluc3RhbmNlcyAodGhyb3VnaCB0aGVpciA6bWV0aDpgfkhhbmRsZXIuYWRkRmlsdGVyYCBtZXRob2QpLgorQmVmb3JlIGRlY2lkaW5nIHRvIHByb2Nlc3MgYSBtZXNzYWdlIGZ1cnRoZXIsIGJvdGggbG9nZ2VycyBhbmQgaGFuZGxlcnMgY29uc3VsdAorYWxsIHRoZWlyIGZpbHRlcnMgZm9yIHBlcm1pc3Npb24uIElmIGFueSBmaWx0ZXIgcmV0dXJucyBhIGZhbHNlIHZhbHVlLCB0aGUKK21lc3NhZ2UgaXMgbm90IHByb2Nlc3NlZCBmdXJ0aGVyLgogCiBUaGUgYmFzaWMgOmNsYXNzOmBGaWx0ZXJgIGZ1bmN0aW9uYWxpdHkgYWxsb3dzIGZpbHRlcmluZyBieSBzcGVjaWZpYyBsb2dnZXIKIG5hbWUuIElmIHRoaXMgZmVhdHVyZSBpcyB1c2VkLCBtZXNzYWdlcyBzZW50IHRvIHRoZSBuYW1lZCBsb2dnZXIgYW5kIGl0cwpAQCAtOTE4LDE5ICs5NDgsMjAgQEAKIGNhdXNlIHRoZSBhcHBsaWNhdGlvbiB1c2luZyBsb2dnaW5nIHRvIHRlcm1pbmF0ZSBwcmVtYXR1cmVseS4KIAogOmNsYXNzOmBTeXN0ZW1FeGl0YCBhbmQgOmNsYXNzOmBLZXlib2FyZEludGVycnVwdGAgZXhjZXB0aW9ucyBhcmUgbmV2ZXIKLXN3YWxsb3dlZC4gT3RoZXIgZXhjZXB0aW9ucyB3aGljaCBvY2N1ciBkdXJpbmcgdGhlIDptZXRoOmBlbWl0YCBtZXRob2Qgb2YgYQotOmNsYXNzOmBIYW5kbGVyYCBzdWJjbGFzcyBhcmUgcGFzc2VkIHRvIGl0cyA6bWV0aDpgaGFuZGxlRXJyb3JgIG1ldGhvZC4KK3N3YWxsb3dlZC4gT3RoZXIgZXhjZXB0aW9ucyB3aGljaCBvY2N1ciBkdXJpbmcgdGhlIDptZXRoOmB+SGFuZGxlci5lbWl0YCBtZXRob2QKK29mIGEgOmNsYXNzOmBIYW5kbGVyYCBzdWJjbGFzcyBhcmUgcGFzc2VkIHRvIGl0cyA6bWV0aDpgfkhhbmRsZXIuaGFuZGxlRXJyb3JgCittZXRob2QuCiAKLVRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIDptZXRoOmBoYW5kbGVFcnJvcmAgaW4gOmNsYXNzOmBIYW5kbGVyYCBjaGVja3MKLXRvIHNlZSBpZiBhIG1vZHVsZS1sZXZlbCB2YXJpYWJsZSwgOmRhdGE6YHJhaXNlRXhjZXB0aW9uc2AsIGlzIHNldC4gSWYgc2V0LCBhCi10cmFjZWJhY2sgaXMgcHJpbnRlZCB0byA6ZGF0YTpgc3lzLnN0ZGVycmAuIElmIG5vdCBzZXQsIHRoZSBleGNlcHRpb24gaXMgc3dhbGxvd2VkLgorVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgOm1ldGg6YH5IYW5kbGVyLmhhbmRsZUVycm9yYCBpbiA6Y2xhc3M6YEhhbmRsZXJgCitjaGVja3MgdG8gc2VlIGlmIGEgbW9kdWxlLWxldmVsIHZhcmlhYmxlLCA6ZGF0YTpgcmFpc2VFeGNlcHRpb25zYCwgaXMgc2V0LiBJZgorc2V0LCBhIHRyYWNlYmFjayBpcyBwcmludGVkIHRvIDpkYXRhOmBzeXMuc3RkZXJyYC4gSWYgbm90IHNldCwgdGhlIGV4Y2VwdGlvbiBpcworc3dhbGxvd2VkLgogCi0qKk5vdGU6KiogVGhlIGRlZmF1bHQgdmFsdWUgb2YgOmRhdGE6YHJhaXNlRXhjZXB0aW9uc2AgaXMgYGBUcnVlYGAuIFRoaXMgaXMgYmVjYXVzZQotZHVyaW5nIGRldmVsb3BtZW50LCB5b3UgdHlwaWNhbGx5IHdhbnQgdG8gYmUgbm90aWZpZWQgb2YgYW55IGV4Y2VwdGlvbnMgdGhhdAotb2NjdXIuIEl0J3MgYWR2aXNlZCB0aGF0IHlvdSBzZXQgOmRhdGE6YHJhaXNlRXhjZXB0aW9uc2AgdG8gYGBGYWxzZWBgIGZvciBwcm9kdWN0aW9uCi11c2FnZS4KKy4uIG5vdGU6OiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiA6ZGF0YTpgcmFpc2VFeGNlcHRpb25zYCBpcyBgYFRydWVgYC4gVGhpcyBpcworICAgYmVjYXVzZSBkdXJpbmcgZGV2ZWxvcG1lbnQsIHlvdSB0eXBpY2FsbHkgd2FudCB0byBiZSBub3RpZmllZCBvZiBhbnkKKyAgIGV4Y2VwdGlvbnMgdGhhdCBvY2N1ci4gSXQncyBhZHZpc2VkIHRoYXQgeW91IHNldCA6ZGF0YTpgcmFpc2VFeGNlcHRpb25zYCB0bworICAgYGBGYWxzZWBgIGZvciBwcm9kdWN0aW9uIHVzYWdlLgogCi0uLiBjdXJyZW50bW9kdWxlOjogbG9nZ2luZwogCiAuLiBfYXJiaXRyYXJ5LW9iamVjdC1tZXNzYWdlczoKIApAQCAtOTQwLDExICs5NzEsMTEgQEAKIEluIHRoZSBwcmVjZWRpbmcgc2VjdGlvbnMgYW5kIGV4YW1wbGVzLCBpdCBoYXMgYmVlbiBhc3N1bWVkIHRoYXQgdGhlIG1lc3NhZ2UKIHBhc3NlZCB3aGVuIGxvZ2dpbmcgdGhlIGV2ZW50IGlzIGEgc3RyaW5nLiBIb3dldmVyLCB0aGlzIGlzIG5vdCB0aGUgb25seQogcG9zc2liaWxpdHkuIFlvdSBjYW4gcGFzcyBhbiBhcmJpdHJhcnkgb2JqZWN0IGFzIGEgbWVzc2FnZSwgYW5kIGl0cwotOm1ldGg6YF9fc3RyX19gIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBsb2dnaW5nIHN5c3RlbSBuZWVkcyB0byBjb252ZXJ0Ci1pdCB0byBhIHN0cmluZyByZXByZXNlbnRhdGlvbi4gSW4gZmFjdCwgaWYgeW91IHdhbnQgdG8sIHlvdSBjYW4gYXZvaWQKKzptZXRoOmB+b2JqZWN0Ll9fc3RyX19gIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBsb2dnaW5nIHN5c3RlbSBuZWVkcyB0bworY29udmVydCBpdCB0byBhIHN0cmluZyByZXByZXNlbnRhdGlvbi4gSW4gZmFjdCwgaWYgeW91IHdhbnQgdG8sIHlvdSBjYW4gYXZvaWQKIGNvbXB1dGluZyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBhbHRvZ2V0aGVyIC0gZm9yIGV4YW1wbGUsIHRoZQotOmNsYXNzOmBTb2NrZXRIYW5kbGVyYCBlbWl0cyBhbiBldmVudCBieSBwaWNrbGluZyBpdCBhbmQgc2VuZGluZyBpdCBvdmVyIHRoZQotd2lyZS4KKzpjbGFzczpgfmhhbmRsZXJzLlNvY2tldEhhbmRsZXJgIGVtaXRzIGFuIGV2ZW50IGJ5IHBpY2tsaW5nIGl0IGFuZCBzZW5kaW5nIGl0CitvdmVyIHRoZSB3aXJlLgogCiAKIE9wdGltaXphdGlvbgpAQCAtOTUzLDkgKzk4NCwxMCBAQAogRm9ybWF0dGluZyBvZiBtZXNzYWdlIGFyZ3VtZW50cyBpcyBkZWZlcnJlZCB1bnRpbCBpdCBjYW5ub3QgYmUgYXZvaWRlZC4KIEhvd2V2ZXIsIGNvbXB1dGluZyB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgbG9nZ2luZyBtZXRob2QgY2FuIGFsc28gYmUKIGV4cGVuc2l2ZSwgYW5kIHlvdSBtYXkgd2FudCB0byBhdm9pZCBkb2luZyBpdCBpZiB0aGUgbG9nZ2VyIHdpbGwganVzdCB0aHJvdwotYXdheSB5b3VyIGV2ZW50LiBUbyBkZWNpZGUgd2hhdCB0byBkbywgeW91IGNhbiBjYWxsIHRoZSA6bWV0aDpgaXNFbmFibGVkRm9yYAotbWV0aG9kIHdoaWNoIHRha2VzIGEgbGV2ZWwgYXJndW1lbnQgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgZXZlbnQgd291bGQgYmUKLWNyZWF0ZWQgYnkgdGhlIExvZ2dlciBmb3IgdGhhdCBsZXZlbCBvZiBjYWxsLiBZb3UgY2FuIHdyaXRlIGNvZGUgbGlrZSB0aGlzOjoKK2F3YXkgeW91ciBldmVudC4gVG8gZGVjaWRlIHdoYXQgdG8gZG8sIHlvdSBjYW4gY2FsbCB0aGUKKzptZXRoOmB+TG9nZ2VyLmlzRW5hYmxlZEZvcmAgbWV0aG9kIHdoaWNoIHRha2VzIGEgbGV2ZWwgYXJndW1lbnQgYW5kIHJldHVybnMKK3RydWUgaWYgdGhlIGV2ZW50IHdvdWxkIGJlIGNyZWF0ZWQgYnkgdGhlIExvZ2dlciBmb3IgdGhhdCBsZXZlbCBvZiBjYWxsLgorWW91IGNhbiB3cml0ZSBjb2RlIGxpa2UgdGhpczo6CiAKICAgICBpZiBsb2dnZXIuaXNFbmFibGVkRm9yKGxvZ2dpbmcuREVCVUcpOgogICAgICAgICBsb2dnZXIuZGVidWcoJ01lc3NhZ2Ugd2l0aCAlcywgJXMnLCBleHBlbnNpdmVfZnVuYzEoKSwKQEAgLTk2NCw2ICs5OTYsMTUgQEAKIHNvIHRoYXQgaWYgdGhlIGxvZ2dlcidzIHRocmVzaG9sZCBpcyBzZXQgYWJvdmUgYGBERUJVR2BgLCB0aGUgY2FsbHMgdG8KIDpmdW5jOmBleHBlbnNpdmVfZnVuYzFgIGFuZCA6ZnVuYzpgZXhwZW5zaXZlX2Z1bmMyYCBhcmUgbmV2ZXIgbWFkZS4KIAorLi4gbm90ZTo6IEluIHNvbWUgY2FzZXMsIDptZXRoOmB+TG9nZ2VyLmlzRW5hYmxlZEZvcmAgY2FuIGl0c2VsZiBiZSBtb3JlCisgICBleHBlbnNpdmUgdGhhbiB5b3UnZCBsaWtlIChlLmcuIGZvciBkZWVwbHkgbmVzdGVkIGxvZ2dlcnMgd2hlcmUgYW4gZXhwbGljaXQKKyAgIGxldmVsIGlzIG9ubHkgc2V0IGhpZ2ggdXAgaW4gdGhlIGxvZ2dlciBoaWVyYXJjaHkpLiBJbiBzdWNoIGNhc2VzIChvciBpZiB5b3UKKyAgIHdhbnQgdG8gYXZvaWQgY2FsbGluZyBhIG1ldGhvZCBpbiB0aWdodCBsb29wcyksIHlvdSBjYW4gY2FjaGUgdGhlIHJlc3VsdCBvZiBhCisgICBjYWxsIHRvIDptZXRoOmB+TG9nZ2VyLmlzRW5hYmxlZEZvcmAgaW4gYSBsb2NhbCBvciBpbnN0YW5jZSB2YXJpYWJsZSwgYW5kIHVzZQorICAgdGhhdCBpbnN0ZWFkIG9mIGNhbGxpbmcgdGhlIG1ldGhvZCBlYWNoIHRpbWUuIFN1Y2ggYSBjYWNoZWQgdmFsdWUgd291bGQgb25seQorICAgbmVlZCB0byBiZSByZWNvbXB1dGVkIHdoZW4gdGhlIGxvZ2dpbmcgY29uZmlndXJhdGlvbiBjaGFuZ2VzIGR5bmFtaWNhbGx5CisgICB3aGlsZSB0aGUgYXBwbGljYXRpb24gaXMgcnVubmluZyAod2hpY2ggaXMgbm90IGFsbCB0aGF0IGNvbW1vbikuCisKIFRoZXJlIGFyZSBvdGhlciBvcHRpbWl6YXRpb25zIHdoaWNoIGNhbiBiZSBtYWRlIGZvciBzcGVjaWZpYyBhcHBsaWNhdGlvbnMgd2hpY2gKIG5lZWQgbW9yZSBwcmVjaXNlIGNvbnRyb2wgb3ZlciB3aGF0IGxvZ2dpbmcgaW5mb3JtYXRpb24gaXMgY29sbGVjdGVkLiBIZXJlJ3MgYQogbGlzdCBvZiB0aGluZ3MgeW91IGNhbiBkbyB0byBhdm9pZCBwcm9jZXNzaW5nIGR1cmluZyBsb2dnaW5nIHdoaWNoIHlvdSBkb24ndApAQCAtOTczLDYgKzEwMTQsMTEgQEAKIHwgV2hhdCB5b3UgZG9uJ3Qgd2FudCB0byBjb2xsZWN0ICAgICAgICAgICAgICAgIHwgSG93IHRvIGF2b2lkIGNvbGxlY3RpbmcgaXQgICAgICAgICAgICAgfAogKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCiB8IEluZm9ybWF0aW9uIGFib3V0IHdoZXJlIGNhbGxzIHdlcmUgbWFkZSBmcm9tLiB8IFNldCBgYGxvZ2dpbmcuX3NyY2ZpbGVgYCB0byBgYE5vbmVgYC4gIHwKK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhpcyBhdm9pZHMgY2FsbGluZyAgICAgICAgICAgICAgICAgICAgfAorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6ZnVuYzpgc3lzLl9nZXRmcmFtZWAsIHdoaWNoIG1heSBoZWxwICB8Cit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRvIHNwZWVkIHVwIHlvdXIgY29kZSBpbiBlbnZpcm9ubWVudHMgIHwKK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbGlrZSBQeVB5ICh3aGljaCBjYW4ndCBzcGVlZCB1cCBjb2RlICAgfAorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0aGF0IHVzZXMgOmZ1bmM6YHN5cy5fZ2V0ZnJhbWVgKS4gICAgICB8CiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKIHwgVGhyZWFkaW5nIGluZm9ybWF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgIHwgU2V0IGBgbG9nZ2luZy5sb2dUaHJlYWRzYGAgdG8gYGAwYGAuICAgfAogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCmRpZmYgLS1naXQgYS9Eb2MvaG93dG8vbG9nZ2luZ19mbG93LnBuZyBiL0RvYy9ob3d0by9sb2dnaW5nX2Zsb3cucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE4ODM4MjMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2MvaG93dG8vbG9nZ2luZ19mbG93LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9Eb2MvaG93dG8vcHlwb3J0aW5nLnJzdCBiL0RvYy9ob3d0by9weXBvcnRpbmcucnN0CmluZGV4IDMwOWYzZjcuLjlkN2U4NTkgMTAwNjQ0Ci0tLSBhL0RvYy9ob3d0by9weXBvcnRpbmcucnN0CisrKyBiL0RvYy9ob3d0by9weXBvcnRpbmcucnN0CkBAIC0xMCwyMzggKzEwLDIxMSBAQAogCiAgICBXaXRoIFB5dGhvbiAzIGJlaW5nIHRoZSBmdXR1cmUgb2YgUHl0aG9uIHdoaWxlIFB5dGhvbiAyIGlzIHN0aWxsIGluIGFjdGl2ZQogICAgdXNlLCBpdCBpcyBnb29kIHRvIGhhdmUgeW91ciBwcm9qZWN0IGF2YWlsYWJsZSBmb3IgYm90aCBtYWpvciByZWxlYXNlcyBvZgotICAgUHl0aG9uLiBUaGlzIGd1aWRlIGlzIG1lYW50IHRvIGhlbHAgeW91IGNob29zZSB3aGljaCBzdHJhdGVneSB3b3JrcyBiZXN0Ci0gICBmb3IgeW91ciBwcm9qZWN0IHRvIHN1cHBvcnQgYm90aCBQeXRob24gMiAmIDMgYWxvbmcgd2l0aCBob3cgdG8gZXhlY3V0ZQotICAgdGhhdCBzdHJhdGVneS4KKyAgIFB5dGhvbi4gVGhpcyBndWlkZSBpcyBtZWFudCB0byBoZWxwIHlvdSBmaWd1cmUgb3V0IGhvdyBiZXN0IHRvIHN1cHBvcnQgYm90aAorICAgUHl0aG9uIDIgJiAzIHNpbXVsdGFuZW91c2x5LgogCiAgICBJZiB5b3UgYXJlIGxvb2tpbmcgdG8gcG9ydCBhbiBleHRlbnNpb24gbW9kdWxlIGluc3RlYWQgb2YgcHVyZSBQeXRob24gY29kZSwKICAgIHBsZWFzZSBzZWUgOnJlZjpgY3BvcnRpbmctaG93dG9gLgogCisgICBJZiB5b3Ugd291bGQgbGlrZSB0byByZWFkIG9uZSBjb3JlIFB5dGhvbiBkZXZlbG9wZXIncyB0YWtlIG9uIHdoeSBQeXRob24gMworICAgY2FtZSBpbnRvIGV4aXN0ZW5jZSwgeW91IGNhbiByZWFkIE5pY2sgQ29naGxhbidzIGBQeXRob24gMyBRICYgQWBfLgogCi1DaG9vc2luZyBhIFN0cmF0ZWd5Ci09PT09PT09PT09PT09PT09PT09CisgICBJZiB5b3UgcHJlZmVyIHRvIHJlYWQgYSAoZnJlZSkgYm9vayBvbiBwb3J0aW5nIGEgcHJvamVjdCB0byBQeXRob24gMywKKyAgIGNvbnNpZGVyIHJlYWRpbmcgYFBvcnRpbmcgdG8gUHl0aG9uIDNgXyBieSBMZW5uYXJ0IFJlZ2Vicm8gd2hpY2ggc2hvdWxkIGNvdmVyCisgICBtdWNoIG9mIHdoYXQgaXMgZGlzY3Vzc2VkIGluIHRoaXMgSE9XVE8uCiAKLVdoZW4gYSBwcm9qZWN0IG1ha2VzIHRoZSBkZWNpc2lvbiB0aGF0IGl0J3MgdGltZSB0byBzdXBwb3J0IGJvdGggUHl0aG9uIDIgJiAzLAotYSBkZWNpc2lvbiBuZWVkcyB0byBiZSBtYWRlIGFzIHRvIGhvdyB0byBnbyBhYm91dCBhY2NvbXBsaXNoaW5nIHRoYXQgZ29hbC4KLVRoZSBjaG9zZW4gc3RyYXRlZ3kgd2lsbCBkZXBlbmQgb24gaG93IGxhcmdlIHRoZSBwcm9qZWN0J3MgZXhpc3RpbmcKLWNvZGViYXNlIGlzIGFuZCBob3cgbXVjaCBkaXZlcmdlbmNlIHlvdSB3YW50IGZyb20geW91ciBQeXRob24gMiBjb2RlYmFzZSBmcm9tCi15b3VyIFB5dGhvbiAzIG9uZSAoZS5nLiwgc3RhcnRpbmcgYSBuZXcgdmVyc2lvbiB3aXRoIFB5dGhvbiAzKS4KKyAgIEZvciBoZWxwIHdpdGggcG9ydGluZywgeW91IGNhbiBlbWFpbCB0aGUgcHl0aG9uLXBvcnRpbmdfIG1haWxpbmcgbGlzdCB3aXRoCisgICBxdWVzdGlvbnMuCiAKLUlmIHlvdXIgcHJvamVjdCBpcyBicmFuZC1uZXcgb3IgZG9lcyBub3QgaGF2ZSBhIGxhcmdlIGNvZGViYXNlLCB0aGVuIHlvdSBtYXkKLXdhbnQgdG8gY29uc2lkZXIgd3JpdGluZy9wb3J0aW5nIDpyZWY6YGFsbCBvZiB5b3VyIGNvZGUgZm9yIFB5dGhvbiAzCi1hbmQgdXNlIDN0bzIgPHVzZV8zdG8yPmAgdG8gcG9ydCB5b3VyIGNvZGUgZm9yIFB5dGhvbiAyLgorVGhlIFNob3J0IFZlcnNpb24KKz09PT09PT09PT09PT09PT09CiAKLUlmIHlvdSB3b3VsZCBwcmVmZXIgdG8gbWFpbnRhaW4gYSBjb2RlYmFzZSB3aGljaCBpcyBzZW1hbnRpY2FsbHkgKiphbmQqKgotc3ludGFjdGljYWxseSBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIgJiAzIHNpbXVsdGFuZW91c2x5LCB5b3UgY2FuIHdyaXRlCi06cmVmOmB1c2Vfc2FtZV9zb3VyY2VgLiBXaGlsZSB0aGlzIHRlbmRzIHRvIGxlYWQgdG8gc29tZXdoYXQgbm9uLWlkaW9tYXRpYwotY29kZSwgaXQgZG9lcyBtZWFuIHlvdSBrZWVwIGEgcmFwaWQgZGV2ZWxvcG1lbnQgcHJvY2VzcyBmb3IgeW91LCB0aGUgZGV2ZWxvcGVyLgorKiBEZWNpZGUgd2hhdCdzIHRoZSBvbGRlc3QgdmVyc2lvbiBvZiBQeXRob24gMiB5b3Ugd2FudCB0byBzdXBwb3J0IChpZiBhdCBhbGwpCisqIE1ha2Ugc3VyZSB5b3UgaGF2ZSBhIHRob3JvdWdoIHRlc3Qgc3VpdGUgYW5kIHVzZSBjb250aW51b3VzIGludGVncmF0aW9uCisgIHRlc3RpbmcgdG8gbWFrZSBzdXJlIHlvdSBzdGF5IGNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbnMgb2YgUHl0aG9uIHlvdSBjYXJlCisgIGFib3V0CisqIElmIHlvdSBoYXZlIGRlcGVuZGVuY2llcywgY2hlY2sgdGhlaXIgUHl0aG9uIDMgc3RhdHVzIHVzaW5nIGNhbml1c2VweXRob24zCisgIChgY29tbWFuZC1saW5lIHRvb2wgPGh0dHBzOi8vcHlwaS5weXRob24ub3JnL3B5cGkvY2FuaXVzZXB5dGhvbjM+YF9fLAorICBgd2ViIGFwcCA8aHR0cHM6Ly9jYW5pdXNlcHl0aG9uMy5jb20vPmBfXykKIAotRmluYWxseSwgeW91IGRvIGhhdmUgdGhlIG9wdGlvbiBvZiA6cmVmOmB1c2luZyAydG8zIDx1c2VfMnRvMz5gIHRvIHRyYW5zbGF0ZQotUHl0aG9uIDIgY29kZSBpbnRvIFB5dGhvbiAzIGNvZGUgKHdpdGggc29tZSBtYW51YWwgaGVscCkuIFRoaXMgY2FuIHRha2UgdGhlCi1mb3JtIG9mIGJyYW5jaGluZyB5b3VyIGNvZGUgYW5kIHVzaW5nIDJ0bzMgdG8gc3RhcnQgYSBQeXRob24gMyBicmFuY2guIFlvdSBjYW4KLWFsc28gaGF2ZSB1c2VycyBwZXJmb3JtIHRoZSB0cmFuc2xhdGlvbiBhcyBpbnN0YWxsYXRpb24gdGltZSBhdXRvbWF0aWNhbGx5IHNvCi10aGF0IHlvdSBvbmx5IGhhdmUgdG8gbWFpbnRhaW4gYSBQeXRob24gMiBjb2RlYmFzZS4KK1dpdGggdGhhdCBkb25lLCB5b3VyIG9wdGlvbnMgYXJlOgogCi1SZWdhcmRsZXNzIG9mIHdoaWNoIGFwcHJvYWNoIHlvdSBjaG9vc2UsIHBvcnRpbmcgaXMgbm90IGFzIGhhcmQgb3IKLXRpbWUtY29uc3VtaW5nIGFzIHlvdSBtaWdodCBpbml0aWFsbHkgdGhpbmsuIFlvdSBjYW4gYWxzbyB0YWNrbGUgdGhlIHByb2JsZW0KLXBpZWNlLW1lYWwgYXMgYSBnb29kIHBvcnRpb24gb2YgcG9ydGluZyBpcyBzaW1wbHkgdXBkYXRpbmcgeW91ciBjb2RlIHRvIGZvbGxvdwotY3VycmVudCBiZXN0IHByYWN0aWNlcyBpbiBhIFB5dGhvbiAyLzMgY29tcGF0aWJsZSB3YXkuCisqIElmIHlvdSBhcmUgZHJvcHBpbmcgUHl0aG9uIDIgc3VwcG9ydCwgdXNlIDJ0bzNfIHRvIHBvcnQgdG8gUHl0aG9uIDMKKyogSWYgeW91IGFyZSBrZWVwaW5nIFB5dGhvbiAyIHN1cHBvcnQsIHRoZW4gc3RhcnQgd3JpdGluZyBQeXRob24gMi8zLWNvbXBhdGlibGUKKyAgY29kZSBzdGFydGluZyAqKlRPREFZKioKKworICArIElmIHlvdSBoYXZlIGRlcGVuZGVuY2llcyB0aGF0IGhhdmUgbm90IGJlZW4gcG9ydGVkLCByZWFjaCBvdXQgdG8gdGhlbSB0byBwb3J0CisgICAgdGhlaXIgcHJvamVjdCB3aGlsZSB3b3JraW5nIHRvIG1ha2UgeW91ciBjb2RlIGNvbXBhdGlibGUgd2l0aCBQeXRob24gMyBzbworICAgIHlvdSdyZSByZWFkeSB3aGVuIHlvdXIgZGVwZW5kZW5jaWVzIGFyZSBhbGwgcG9ydGVkCisgICsgSWYgYWxsIHlvdXIgZGVwZW5kZW5jaWVzIGhhdmUgYmVlbiBwb3J0ZWQgKG9yIHlvdSBoYXZlIG5vbmUpLCBnbyBhaGVhZCBhbmQKKyAgICBwb3J0IHRvIFB5dGhvbiAzCisKKyogSWYgeW91IGFyZSBjcmVhdGluZyBhIG5ldyBwcm9qZWN0IHRoYXQgd2FudHMgdG8gaGF2ZSAyLzMgY29tcGF0aWJpbGl0eSwKKyAgY29kZSBpbiBQeXRob24gMyBhbmQgdGhlbiBiYWNrcG9ydCB0byBQeXRob24gMgogCiAKLVVuaXZlcnNhbCBCaXRzIG9mIEFkdmljZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitCZWZvcmUgWW91IEJlZ2luCis9PT09PT09PT09PT09PT09CiAKLVJlZ2FyZGxlc3Mgb2Ygd2hhdCBzdHJhdGVneSB5b3UgcGljaywgdGhlcmUgYXJlIGEgZmV3IHRoaW5ncyB5b3Ugc2hvdWxkCi1jb25zaWRlci4KK0lmIHlvdXIgcHJvamVjdCBpcyBvbiB0aGUgQ2hlZXNlc2hvcF8vUHlQSV8sIG1ha2Ugc3VyZSBpdCBoYXMgdGhlIHByb3BlcgorYHRyb3ZlIGNsYXNzaWZpZXJzYF8gdG8gc2lnbmlmeSB3aGF0IHZlcnNpb25zIG9mIFB5dGhvbiBpdCAqKmN1cnJlbnRseSoqCitzdXBwb3J0cy4gQXQgbWluaW11bSB5b3Ugc2hvdWxkIHNwZWNpZnkgdGhlIG1ham9yIHZlcnNpb24ocyksIGUuZy4KK2BgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDJgYCBpZiB5b3VyIHByb2plY3QgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMKK1B5dGhvbiAyLiBJdCBpcyBwcmVmZXJyYWJsZSB0aGF0IHlvdSBiZSBhcyBzcGVjaWZpYyBhcyBwb3NzaWJsZSBieSBsaXN0aW5nIGV2ZXJ5CittYWpvci9taW5vciB2ZXJzaW9uIG9mIFB5dGhvbiB0aGF0IHlvdSBzdXBwb3J0LCBlLmcuIGlmIHlvdXIgcHJvamVjdCBzdXBwb3J0cworUHl0aG9uIDIuNiBhbmQgMi43LCB0aGVuIHlvdSB3YW50IHRoZSBjbGFzc2lmaWVycyBvZjo6CiAKLU9uZSBpcyBtYWtlIHN1cmUgeW91IGhhdmUgYSByb2J1c3QgdGVzdCBzdWl0ZS4gWW91IG5lZWQgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcKLWNvbnRpbnVlcyB0byB3b3JrLCBqdXN0IGxpa2Ugd2hlbiB5b3Ugc3VwcG9ydCBhIG5ldyBtaW5vciB2ZXJzaW9uIG9mIFB5dGhvbi4KLVRoaXMgbWVhbnMgbWFraW5nIHN1cmUgeW91ciB0ZXN0IHN1aXRlIGlzIHRob3JvdWdoIGFuZCBpcyBwb3J0ZWQgcHJvcGVybHkKLWJldHdlZW4gUHl0aG9uIDIgJiAzLiBZb3Ugd2lsbCBhbHNvIG1vc3QgbGlrZWx5IHdhbnQgdG8gdXNlIHNvbWV0aGluZyBsaWtlIHRveF8KLXRvIGF1dG9tYXRlIHRlc3RpbmcgYmV0d2VlbiBib3RoIGEgUHl0aG9uIDIgYW5kIFB5dGhvbiAzIFZNLgorIFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyCisgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIuNgorIFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyLjcKIAotVHdvLCBvbmNlIHlvdXIgcHJvamVjdCBoYXMgUHl0aG9uIDMgc3VwcG9ydCwgbWFrZSBzdXJlIHRvIGFkZCB0aGUgcHJvcGVyCi1jbGFzc2lmaWVyIG9uIHRoZSBDaGVlc2VzaG9wXyAoUHlQSV8pLiBUbyBoYXZlIHlvdXIgcHJvamVjdCBsaXN0ZWQgYXMgUHl0aG9uIDMKLWNvbXBhdGlibGUgaXQgbXVzdCBoYXZlIHRoZQotYFB5dGhvbiAzIGNsYXNzaWZpZXIgPGh0dHA6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaT86YWN0aW9uPWJyb3dzZSZjPTUzMz5gXwotKGZyb20KLWh0dHA6Ly90ZWNoc3BvdC56enplZWsub3JnLzIwMTEvMDEvMjQvenp6ZWVrLXMtZ3VpZGUtdG8tcHl0aG9uLTMtcG9ydGluZy8pOjoKK09uY2UgeW91ciBwcm9qZWN0IHN1cHBvcnRzIFB5dGhvbiAzIHlvdSB3aWxsIHdhbnQgdG8gZ28gYmFjayBhbmQgYWRkIHRoZQorYXBwcm9wcmlhdGUgY2xhc3NpZmllcnMgZm9yIFB5dGhvbiAzIGFzIHdlbGwuIFRoaXMgaXMgaW1wb3J0YW50IGFzIHNldHRpbmcgdGhlCitgYFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzYGAgY2xhc3NpZmllciB3aWxsIGxlYWQgdG8geW91ciBwcm9qZWN0CitiZWluZyBsaXN0ZWQgdW5kZXIgdGhlIGBQeXRob24gMyBQYWNrYWdlc2BfIHNlY3Rpb24gb2YgUHlQSS4KIAotICAgc2V0dXAoCi0gICAgIG5hbWU9J1lvdXIgTGlicmFyeScsCi0gICAgIHZlcnNpb249JzEuMCcsCi0gICAgIGNsYXNzaWZpZXJzPVsKLSAgICAgICAgICMgbWFrZSBzdXJlIHRvIHVzZSA6OiBQeXRob24gKmFuZCogOjogUHl0aG9uIDo6IDMgc28KLSAgICAgICAgICMgdGhhdCBweXBpIGNhbiBsaXN0IHRoZSBwYWNrYWdlIG9uIHRoZSBweXRob24gMyBwYWdlCi0gICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uJywKLSAgICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMycKLSAgICAgXSwKLSAgICAgcGFja2FnZXM9Wyd5b3VybGlicmFyeSddLAotICAgICAjIG1ha2Ugc3VyZSB0byBhZGQgY3VzdG9tX2ZpeGVycyB0byB0aGUgTUFOSUZFU1QuaW4KLSAgICAgaW5jbHVkZV9wYWNrYWdlX2RhdGE9VHJ1ZSwKLSAgICAgIyAuLi4KLSAgICkKK01ha2Ugc3VyZSB5b3UgaGF2ZSBhIHJvYnVzdCB0ZXN0IHN1aXRlLiBZb3UgbmVlZCB0bworbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgY29udGludWVzIHRvIHdvcmssIGp1c3QgbGlrZSB3aGVuIHlvdSBzdXBwb3J0IGEgbmV3CittaW5vci9mZWF0dXJlIHJlbGVhc2Ugb2YgUHl0aG9uLiBUaGlzIG1lYW5zIG1ha2luZyBzdXJlIHlvdXIgdGVzdCBzdWl0ZSBpcwordGhvcm91Z2ggYW5kIGlzIHBvcnRlZCBwcm9wZXJseSBiZXR3ZWVuIFB5dGhvbiAyICYgMyAoY29uc2lkZXIgdXNpbmcgY292ZXJhZ2VfCit0byBtZWFzdXJlIHRoYXQgeW91IGhhdmUgZWZmZWN0aXZlIHRlc3QgY292ZXJhZ2UpLiBZb3Ugd2lsbCBhbHNvIG1vc3QgbGlrZWx5Cit3YW50IHRvIHVzZSBzb21ldGhpbmcgbGlrZSB0b3hfIHRvIGF1dG9tYXRlIHRlc3RpbmcgYmV0d2VlbiBhbGwgb2YgeW91cgorc3VwcG9ydGVkIHZlcnNpb25zIG9mIFB5dGhvbi4gWW91IHdpbGwgYWxzbyB3YW50IHRvICoqcG9ydCB5b3VyIHRlc3RzIGZpcnN0Kiogc28KK3RoYXQgeW91IGNhbiBtYWtlIHN1cmUgdGhhdCB5b3UgZGV0ZWN0IGJyZWFrYWdlIGR1cmluZyB0aGUgdHJhbnNpdGlvbi4gVGVzdHMgYWxzbwordGVuZCB0byBiZSBzaW1wbGVyIHRoYW4gdGhlIGNvZGUgdGhleSBhcmUgdGVzdGluZyBzbyBpdCBnaXZlcyB5b3UgYW4gaWRlYSBvZiBob3cKK2Vhc3kgaXQgY2FuIGJlIHRvIHBvcnQgY29kZS4KIAotCi1Eb2luZyBzbyB3aWxsIGNhdXNlIHlvdXIgcHJvamVjdCB0byBzaG93IHVwIGluIHRoZQotYFB5dGhvbiAzIHBhY2thZ2VzIGxpc3QKLTxodHRwOi8vcHlwaS5weXRob24ub3JnL3B5cGk/OmFjdGlvbj1icm93c2UmYz01MzMmc2hvdz1hbGw+YF8uIFlvdSB3aWxsIGtub3cKLXlvdSBzZXQgdGhlIGNsYXNzaWZpZXIgcHJvcGVybHkgYXMgdmlzaXRpbmcgeW91ciBwcm9qZWN0IHBhZ2Ugb24gdGhlIENoZWVzZXNob3AKLXdpbGwgc2hvdyBhIFB5dGhvbiAzIGxvZ28gaW4gdGhlIHVwcGVyLWxlZnQgY29ybmVyIG9mIHRoZSBwYWdlLgotCi1UaHJlZSwgdGhlIHNpeF8gcHJvamVjdCBwcm92aWRlcyBhIGxpYnJhcnkgd2hpY2ggaGVscHMgaXJvbiBvdXQgZGlmZmVyZW5jZXMKLWJldHdlZW4gUHl0aG9uIDIgJiAzLiBJZiB5b3UgZmluZCB0aGVyZSBpcyBhIHN0aWNreSBwb2ludCB0aGF0IGlzIGEgY29udGludWFsCi1wb2ludCBvZiBjb250ZW50aW9uIGluIHlvdXIgdHJhbnNsYXRpb24gb3IgbWFpbnRlbmFuY2Ugb2YgY29kZSwgY29uc2lkZXIgdXNpbmcKLWEgc291cmNlLWNvbXBhdGlibGUgc29sdXRpb24gcmVseWluZyBvbiBzaXguIElmIHlvdSBoYXZlIHRvIGNyZWF0ZSB5b3VyIG93bgotUHl0aG9uIDIvMyBjb21wYXRpYmxlIHNvbHV0aW9uLCB5b3UgY2FuIHVzZSBgYHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gM2BgIGFzIGEKLWd1YXJkLgotCi1Gb3VyLCByZWFkIGFsbCB0aGUgYXBwcm9hY2hlcy4gSnVzdCBiZWNhdXNlIHNvbWUgYml0IG9mIGFkdmljZSBhcHBsaWVzIHRvIG9uZQotYXBwcm9hY2ggbW9yZSB0aGFuIGFub3RoZXIgZG9lc24ndCBtZWFuIHRoYXQgc29tZSBhZHZpY2UgZG9lc24ndCBhcHBseSB0byBvdGhlcgotc3RyYXRlZ2llcy4KLQotRml2ZSwgZHJvcCBzdXBwb3J0IGZvciBvbGRlciBQeXRob24gdmVyc2lvbnMgaWYgcG9zc2libGUuIGBQeXRob24gMi41YF8KK0Ryb3Agc3VwcG9ydCBmb3Igb2xkZXIgUHl0aG9uIHZlcnNpb25zIGlmIHBvc3NpYmxlLiBgUHl0aG9uIDIuNWBfCiBpbnRyb2R1Y2VkIGEgbG90IG9mIHVzZWZ1bCBzeW50YXggYW5kIGxpYnJhcmllcyB3aGljaCBoYXZlIGJlY29tZSBpZGlvbWF0aWMKIGluIFB5dGhvbiAzLiBgUHl0aG9uIDIuNmBfIGludHJvZHVjZWQgZnV0dXJlIHN0YXRlbWVudHMgd2hpY2ggbWFrZXMKIGNvbXBhdGliaWxpdHkgbXVjaCBlYXNpZXIgaWYgeW91IGFyZSBnb2luZyBmcm9tIFB5dGhvbiAyIHRvIDMuCi1gUHl0aG9uIDIuN2BfIGNvbnRpbnVlcyB0aGUgdHJlbmQgaW4gdGhlIHN0ZGxpYi4gU28gY2hvb3NlIHRoZSBuZXdlc3QgdmVyc2lvbgorYFB5dGhvbiAyLjdgXyBjb250aW51ZXMgdGhlIHRyZW5kIGluIHRoZSBzdGRsaWIuIENob29zZSB0aGUgbmV3ZXN0IHZlcnNpb24KIG9mIFB5dGhvbiB3aGljaCB5b3UgYmVsaWV2ZSBjYW4gYmUgeW91ciBtaW5pbXVtIHN1cHBvcnQgdmVyc2lvbgogYW5kIHdvcmsgZnJvbSB0aGVyZS4KIAotCi0uLiBfdG94OiBodHRwOi8vY29kZXNwZWFrLm5ldC90b3gvCi0uLiBfQ2hlZXNlc2hvcDoKLS4uIF9QeVBJOiBodHRwOi8vcHlwaS5weXRob24ub3JnLwotLi4gX3NpeDogaHR0cDovL3BhY2thZ2VzLnB5dGhvbi5vcmcvc2l4Ci0uLiBfUHl0aG9uIDIuNzogaHR0cDovL3d3dy5weXRob24ub3JnLzIuNy54Ci0uLiBfUHl0aG9uIDIuNjogaHR0cDovL3d3dy5weXRob24ub3JnLzIuNi54Ci0uLiBfUHl0aG9uIDIuNTogaHR0cDovL3d3dy5weXRob24ub3JnLzIuNS54Ci0uLiBfUHl0aG9uIDIuNDogaHR0cDovL3d3dy5weXRob24ub3JnLzIuNC54Ci0uLiBfUHl0aG9uIDIuMzogaHR0cDovL3d3dy5weXRob24ub3JnLzIuMy54Ci0uLiBfUHl0aG9uIDIuMjogaHR0cDovL3d3dy5weXRob24ub3JnLzIuMi54CitUYXJnZXQgdGhlIG5ld2VzdCB2ZXJzaW9uIG9mIFB5dGhvbiAzIHRoYXQgeW91IGNhbi4gQmV5b25kIGp1c3QgdGhlIHVzdWFsCitidWdmaXhlcywgY29tcGF0aWJpbGl0eSBoYXMgY29udGludWVkIHRvIGltcHJvdmUgYmV0d2VlbiBQeXRob24gMiBhbmQgMyBhcyB0aW1lCitoYXMgcGFzc2VkLiBFLmcuIFB5dGhvbiAzLjMgYWRkZWQgYmFjayB0aGUgYGB1YGAgcHJlZml4IGZvcgorc3RyaW5ncywgbWFraW5nIHNvdXJjZS1jb21wYXRpYmxlIFB5dGhvbiBjb2RlIGVhc2llciB0byB3cml0ZS4KIAogCi0uLiBfdXNlXzN0bzI6CitXcml0aW5nIFNvdXJjZS1Db21wYXRpYmxlIFB5dGhvbiAyLzMgQ29kZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotUHl0aG9uIDMgYW5kIDN0bzIKLT09PT09PT09PT09PT09PT09CitPdmVyIHRoZSB5ZWFycyB0aGUgUHl0aG9uIGNvbW11bml0eSBoYXMgZGlzY292ZXJlZCB0aGF0IHRoZSBlYXNpZXN0IHdheSB0bworc3VwcG9ydCBib3RoIFB5dGhvbiAyIGFuZCAzIGluIHBhcmFsbGVsIGlzIHRvIHdyaXRlIFB5dGhvbiBjb2RlIHRoYXQgd29ya3MgaW4KK2VpdGhlciB2ZXJzaW9uLiBXaGlsZSB0aGlzIG1pZ2h0IHNvdW5kIGNvdW50ZXItaW50dWl0aXZlIGF0IGZpcnN0LCBpdCBhY3R1YWxseQoraXMgbm90IGRpZmZpY3VsdCBhbmQgdHlwaWNhbGx5IG9ubHkgcmVxdWlyZXMgZm9sbG93aW5nIHNvbWUgc2VsZWN0Cisobm9uLWlkaW9tYXRpYykgcHJhY3RpY2VzIGFuZCB1c2luZyBzb21lIGtleSBwcm9qZWN0cyB0byBoZWxwIG1ha2UgYnJpZGdpbmcKK2JldHdlZW4gUHl0aG9uIDIgYW5kIDMgZWFzaWVyLgogCi1JZiB5b3UgYXJlIHN0YXJ0aW5nIGEgbmV3IHByb2plY3Qgb3IgeW91ciBjb2RlYmFzZSBpcyBzbWFsbCBlbm91Z2gsIHlvdSBtYXkKLXdhbnQgdG8gY29uc2lkZXIgd3JpdGluZyB5b3VyIGNvZGUgZm9yIFB5dGhvbiAzIGFuZCBiYWNrcG9ydGluZyB0byBQeXRob24gMgotdXNpbmcgM3RvMl8uIFRoYW5rcyB0byBQeXRob24gMyBiZWluZyBtb3JlIHN0cmljdCBhYm91dCB0aGluZ3MgdGhhbiBQeXRob24gMgotKGUuZy4sIGJ5dGVzIHZzLiBzdHJpbmdzKSwgdGhlIHNvdXJjZSB0cmFuc2xhdGlvbiBjYW4gYmUgZWFzaWVyIGFuZCBtb3JlCi1zdHJhaWdodGZvcndhcmQgdGhhbiBmcm9tIFB5dGhvbiAyIHRvIDMuIFBsdXMgaXQgZ2l2ZXMgeW91IG1vcmUgZGlyZWN0Ci1leHBlcmllbmNlIGRldmVsb3BpbmcgaW4gUHl0aG9uIDMgd2hpY2gsIHNpbmNlIGl0IGlzIHRoZSBmdXR1cmUgb2YgUHl0aG9uLCBpcyBhCi1nb29kIHRoaW5nIGxvbmctdGVybS4KK1Byb2plY3RzIHRvIENvbnNpZGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1BIGRyYXdiYWNrIG9mIHRoaXMgYXBwcm9hY2ggaXMgdGhhdCAzdG8yIGlzIGEgdGhpcmQtcGFydHkgcHJvamVjdC4gVGhpcyBtZWFucwotdGhhdCB0aGUgUHl0aG9uIGNvcmUgZGV2ZWxvcGVycyAoYW5kIHRodXMgdGhpcyBndWlkZSkgY2FuIG1ha2Ugbm8gcHJvbWlzZXMKLWFib3V0IGhvdyB3ZWxsIDN0bzIgd29ya3MgYXQgYW55IHRpbWUuIFRoZXJlIGlzIG5vdGhpbmcgdG8gc3VnZ2VzdCwgdGhvdWdoLAotdGhhdCAzdG8yIGlzIG5vdCBhIGhpZ2gtcXVhbGl0eSBwcm9qZWN0LgorVGhlIGxvd2VzdCBsZXZlbCBsaWJyYXJ5IGZvciBzdXBwb3J0aW5nIFB5dGhvbiAyICYgMyBzaW11bHRhbmVvdXNseSBpcyBzaXhfLgorUmVhZGluZyB0aHJvdWdoIGl0cyBkb2N1bWVudGF0aW9uIHdpbGwgZ2l2ZSB5b3UgYW4gaWRlYSBvZiB3aGVyZSBleGFjdGx5IHRoZQorUHl0aG9uIGxhbmd1YWdlIGNoYW5nZWQgYmV0d2VlbiB2ZXJzaW9ucyAyICYgMyBhbmQgdGh1cyB3aGF0IHlvdSB3aWxsIHdhbnQgdGhlCitsaWJyYXJ5IHRvIGhlbHAgeW91IGNvbnRpbnVlIHRvIHN1cHBvcnQuCisKK1RvIGhlbHAgYXV0b21hdGUgcG9ydGluZyB5b3VyIGNvZGUgb3ZlciB0byB1c2luZyBzaXgsIHlvdSBjYW4gdXNlCittb2Rlcm5pemVfLiBUaGlzIHByb2plY3Qgd2lsbCBhdHRlbXB0IHRvIHJld3JpdGUgeW91ciBjb2RlIHRvIGJlIGFzIG1vZGVybiBhcworcG9zc2libGUgd2hpbGUgdXNpbmcgc2l4IHRvIHNtb290aCBvdXQgYW55IGRpZmZlcmVuY2VzIGJldHdlZW4gUHl0aG9uIDIgJiAzLgorCitJZiB5b3Ugd2FudCB0byB3cml0ZSB5b3VyIGNvbXBhdGlibGUgY29kZSB0byBmZWVsIG1vcmUgbGlrZSBQeXRob24gMyB0aGVyZSBpcwordGhlIGZ1dHVyZV8gcHJvamVjdC4gSXQgdHJpZXMgdG8gcHJvdmlkZSBiYWNrcG9ydHMgb2Ygb2JqZWN0cyBmcm9tIFB5dGhvbiAzIHNvCit0aGF0IHlvdSBjYW4gdXNlIHRoZW0gZnJvbSBQeXRob24gMi1jb21wYXRpYmxlIGNvZGUsIGUuZy4gcmVwbGFjaW5nIHRoZQorYGBieXRlc2BgIHR5cGUgZnJvbSBQeXRob24gMiB3aXRoIHRoZSBvbmUgZnJvbSBQeXRob24gMy4KK0l0IGFsc28gcHJvdmlkZXMgYSB0cmFuc2xhdGlvbiBzY3JpcHQgbGlrZSBtb2Rlcm5pemUgKGl0cyB0cmFuc2xhdGlvbiBjb2RlIGlzCithY3R1YWxseSBwYXJ0aWFsbHkgYmFzZWQgb24gaXQpIHRvIGhlbHAgc3RhcnQgd29ya2luZyB3aXRoIGEgcHJlLWV4aXN0aW5nIGNvZGUKK2Jhc2UuIEl0IGlzIGFsc28gdW5pcXVlIGluIHRoYXQgaXRzIHRyYW5zbGF0aW9uIHNjcmlwdCB3aWxsIGFsc28gcG9ydCBQeXRob24gMworY29kZSBiYWNrd2FyZHMgYXMgd2VsbCBhcyBQeXRob24gMiBjb2RlIGZvcndhcmRzLgogCiAKLS4uIF8zdG8yOiBodHRwczovL2JpdGJ1Y2tldC5vcmcvYW1lbnRham8vbGliM3RvMi9vdmVydmlldworVGlwcyAmIFRyaWNrcworLS0tLS0tLS0tLS0tLQogCi0KLS4uIF91c2VfMnRvMzoKLQotUHl0aG9uIDIgYW5kIDJ0bzMKLT09PT09PT09PT09PT09PT09Ci0KLUluY2x1ZGVkIHdpdGggUHl0aG9uIHNpbmNlIDIuNiwgdGhlIDJ0bzNfIHRvb2wgKGFuZCA6bW9kOmBsaWIydG8zYCBtb2R1bGUpCi1oZWxwcyB3aXRoIHBvcnRpbmcgUHl0aG9uIDIgdG8gUHl0aG9uIDMgYnkgcGVyZm9ybWluZyB2YXJpb3VzIHNvdXJjZQotdHJhbnNsYXRpb25zLiBUaGlzIGlzIGEgcGVyZmVjdCBzb2x1dGlvbiBmb3IgcHJvamVjdHMgd2hpY2ggd2lzaCB0byBicmFuY2gKLXRoZWlyIFB5dGhvbiAzIGNvZGUgZnJvbSB0aGVpciBQeXRob24gMiBjb2RlYmFzZSBhbmQgbWFpbnRhaW4gdGhlbSBhcwotaW5kZXBlbmRlbnQgY29kZWJhc2VzLiBZb3UgY2FuIGV2ZW4gYmVnaW4gcHJlcGFyaW5nIHRvIHVzZSB0aGlzIGFwcHJvYWNoCi10b2RheSBieSB3cml0aW5nIGZ1dHVyZS1jb21wYXRpYmxlIFB5dGhvbiBjb2RlIHdoaWNoIHdvcmtzIGNsZWFubHkgaW4KLVB5dGhvbiAyIGluIGNvbmp1bmN0aW9uIHdpdGggMnRvMzsgYWxsIHN0ZXBzIG91dGxpbmVkIGJlbG93IHdpbGwgd29yawotd2l0aCBQeXRob24gMiBjb2RlIHVwIHRvIHRoZSBwb2ludCB3aGVuIHRoZSBhY3R1YWwgdXNlIG9mIDJ0bzMgb2NjdXJzLgotCi1Vc2Ugb2YgMnRvMyBhcyBhbiBvbi1kZW1hbmQgdHJhbnNsYXRpb24gc3RlcCBhdCBpbnN0YWxsIHRpbWUgaXMgYWxzbyBwb3NzaWJsZSwKLXByZXZlbnRpbmcgdGhlIG5lZWQgdG8gbWFpbnRhaW4gYSBzZXBhcmF0ZSBQeXRob24gMyBjb2RlYmFzZSwgYnV0IHRoaXMgYXBwcm9hY2gKLWRvZXMgY29tZSB3aXRoIHNvbWUgZHJhd2JhY2tzLiBXaGlsZSB1c2VycyB3aWxsIG9ubHkgaGF2ZSB0byBwYXkgdGhlCi10cmFuc2xhdGlvbiBjb3N0IG9uY2UgYXQgaW5zdGFsbGF0aW9uLCB5b3UgYXMgYSBkZXZlbG9wZXIgd2lsbCBuZWVkIHRvIHBheSB0aGUKLWNvc3QgcmVndWxhcmx5IGR1cmluZyBkZXZlbG9wbWVudC4gSWYgeW91ciBjb2RlYmFzZSBpcyBzdWZmaWNpZW50bHkgbGFyZ2UKLWVub3VnaCB0aGVuIHRoZSB0cmFuc2xhdGlvbiBzdGVwIGVuZHMgdXAgYWN0aW5nIGxpa2UgYSBjb21waWxhdGlvbiBzdGVwLAotcm9iYmluZyB5b3Ugb2YgdGhlIHJhcGlkIGRldmVsb3BtZW50IHByb2Nlc3MgeW91IGFyZSB1c2VkIHRvIHdpdGggUHl0aG9uLgotT2J2aW91c2x5IHRoZSB0aW1lIHJlcXVpcmVkIHRvIHRyYW5zbGF0ZSBhIHByb2plY3Qgd2lsbCB2YXJ5LCBzbyBkbyBhbgotZXhwZXJpbWVudGFsIHRyYW5zbGF0aW9uIGp1c3QgdG8gc2VlIGhvdyBsb25nIGl0IHRha2VzIHRvIGV2YWx1YXRlIHdoZXRoZXIgeW91Ci1wcmVmZXIgdGhpcyBhcHByb2FjaCBjb21wYXJlZCB0byB1c2luZyA6cmVmOmB1c2Vfc2FtZV9zb3VyY2VgIG9yIHNpbXBseSBrZWVwaW5nCi1hIHNlcGFyYXRlIFB5dGhvbiAzIGNvZGViYXNlLgotCi1CZWxvdyBhcmUgdGhlIHR5cGljYWwgc3RlcHMgdGFrZW4gYnkgYSBwcm9qZWN0IHdoaWNoIHVzZXMgYSAydG8zLWJhc2VkIGFwcHJvYWNoCi10byBzdXBwb3J0aW5nIFB5dGhvbiAyICYgMy4KLQorVG8gaGVscCB3aXRoIHdyaXRpbmcgc291cmNlLWNvbXBhdGlibGUgY29kZSB1c2luZyBvbmUgb2YgdGhlIHByb2plY3RzIG1lbnRpb25lZAoraW4gYFByb2plY3RzIHRvIENvbnNpZGVyYF8sIGNvbnNpZGVyIGZvbGxvd2luZyB0aGUgYmVsb3cgc3VnZ2VzdGlvbnMuIFNvbWUgb2YKK3RoZW0gYXJlIGhhbmRsZWQgYnkgdGhlIHN1Z2dlc3RlZCBwcm9qZWN0cywgc28gaWYgeW91IGRvIHVzZSBvbmUgb2YgdGhlbSB0aGVuCityZWFkIHRoZWlyIGRvY3VtZW50YXRpb24gZmlyc3QgdG8gc2VlIHdoaWNoIHN1Z2dlc3Rpb25zIGJlbG93IHdpbGwgdGFrZW4gY2FyZSBvZgorZm9yIHlvdS4KIAogU3VwcG9ydCBQeXRob24gMi43Ci0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLy8vLy8vLy8vLy8vLy8vLwogCiBBcyBhIGZpcnN0IHN0ZXAsIG1ha2Ugc3VyZSB0aGF0IHlvdXIgcHJvamVjdCBpcyBjb21wYXRpYmxlIHdpdGggYFB5dGhvbiAyLjdgXy4KIFRoaXMgaXMganVzdCBnb29kIHRvIGRvIGFzIFB5dGhvbiAyLjcgaXMgdGhlIGxhc3QgcmVsZWFzZSBvZiBQeXRob24gMiBhbmQgdGh1cwogd2lsbCBiZSB1c2VkIGZvciBhIHJhdGhlciBsb25nIHRpbWUuIEl0IGFsc28gYWxsb3dzIGZvciB1c2Ugb2YgdGhlIGBgLTNgYCBmbGFnCi10byBQeXRob24gdG8gaGVscCBkaXNjb3ZlciBwbGFjZXMgaW4geW91ciBjb2RlIHdoaWNoIDJ0bzMgY2Fubm90IGhhbmRsZSBidXQgYXJlCi1rbm93biB0byBjYXVzZSBpc3N1ZXMuCit0byBQeXRob24gdG8gaGVscCBkaXNjb3ZlciBwbGFjZXMgaW4geW91ciBjb2RlIHdoZXJlIGNvbXBhdGliaWxpdHkgbWlnaHQgYmUgYW4KK2lzc3VlICh0aGUgYGAtM2BgIGZsYWcgaXMgaW4gUHl0aG9uIDIuNiBidXQgUHl0aG9uIDIuNyBhZGRzIG1vcmUgd2FybmluZ3MpLgogCiBUcnkgdG8gU3VwcG9ydCBgUHl0aG9uIDIuNmBfIGFuZCBOZXdlciBPbmx5Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIFdoaWxlIG5vdCBwb3NzaWJsZSBmb3IgYWxsIHByb2plY3RzLCBpZiB5b3UgY2FuIHN1cHBvcnQgYFB5dGhvbiAyLjZgXyBhbmQgbmV3ZXIKICoqb25seSoqLCB5b3VyIGxpZmUgd2lsbCBiZSBtdWNoIGVhc2llci4gVmFyaW91cyBmdXR1cmUgc3RhdGVtZW50cywgc3RkbGliCiBhZGRpdGlvbnMsIGV0Yy4gZXhpc3Qgb25seSBpbiBQeXRob24gMi42IGFuZCBsYXRlciB3aGljaCBncmVhdGx5IGFzc2lzdCBpbgotcG9ydGluZyB0byBQeXRob24gMy4gQnV0IGlmIHlvdSBwcm9qZWN0IG11c3Qga2VlcCBzdXBwb3J0IGZvciBgUHl0aG9uIDIuNWBfIChvcgotZXZlbiBgUHl0aG9uIDIuNGBfKSB0aGVuIGl0IGlzIHN0aWxsIHBvc3NpYmxlIHRvIHBvcnQgdG8gUHl0aG9uIDMuCitzdXBwb3J0aW5nIFB5dGhvbiAzLiBCdXQgaWYgeW91IHByb2plY3QgbXVzdCBrZWVwIHN1cHBvcnQgZm9yIGBQeXRob24gMi41YF8gdGhlbgoraXQgaXMgc3RpbGwgcG9zc2libGUgdG8gc2ltdWx0YW5lb3VzbHkgc3VwcG9ydCBQeXRob24gMy4KIAogQmVsb3cgYXJlIHRoZSBiZW5lZml0cyB5b3UgZ2FpbiBpZiB5b3Ugb25seSBoYXZlIHRvIHN1cHBvcnQgUHl0aG9uIDIuNiBhbmQKIG5ld2VyLiBTb21lIG9mIHRoZXNlIG9wdGlvbnMgYXJlIHBlcnNvbmFsIGNob2ljZSB3aGlsZSBvdGhlcnMgYXJlCiAqKnN0cm9uZ2x5KiogcmVjb21tZW5kZWQgKHRoZSBvbmVzIHRoYXQgYXJlIG1vcmUgZm9yIHBlcnNvbmFsIGNob2ljZSBhcmUKIGxhYmVsZWQgYXMgc3VjaCkuICBJZiB5b3UgY29udGludWUgdG8gc3VwcG9ydCBvbGRlciB2ZXJzaW9ucyBvZiBQeXRob24gdGhlbiB5b3UKLWF0IGxlYXN0IG5lZWQgdG8gd2F0Y2ggb3V0IGZvciBzaXR1YXRpb25zIHRoYXQgdGhlc2Ugc29sdXRpb25zIGZpeC4KK2F0IGxlYXN0IG5lZWQgdG8gd2F0Y2ggb3V0IGZvciBzaXR1YXRpb25zIHRoYXQgdGhlc2Ugc29sdXRpb25zIGZpeCBhbmQgaGFuZGxlCit0aGVtIGFwcHJvcHJpYXRlbHkgKHdoaWNoIGlzIHdoZXJlIGxpYnJhcnkgaGVscCBmcm9tIGUuZy4gc2l4XyBjb21lcyBpbiBoYW5keSkuCiAKIAogYGBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uYGAKICcnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnCiAKLVRoaXMgaXMgYSBwZXJzb25hbCBjaG9pY2UuIDJ0bzMgaGFuZGxlcyB0aGUgdHJhbnNsYXRpb24gZnJvbSB0aGUgcHJpbnQKLXN0YXRlbWVudCB0byB0aGUgcHJpbnQgZnVuY3Rpb24gcmF0aGVyIHdlbGwgc28gdGhpcyBpcyBhbiBvcHRpb25hbCBzdGVwLiBUaGlzCi1mdXR1cmUgc3RhdGVtZW50IGRvZXMgaGVscCwgdGhvdWdoLCB3aXRoIGdldHRpbmcgdXNlZCB0byB0eXBpbmcKLWBgcHJpbnQoJ0hlbGxvLCBXb3JsZCcpYGAgaW5zdGVhZCBvZiBgYHByaW50ICdIZWxsbywgV29ybGQnYGAuCitJdCB3aWxsIG5vdCBvbmx5IGdldCB5b3UgdXNlZCB0byB0eXBpbmcgYGBwcmludCgpYGAgYXMgYSBmdW5jdGlvbiBpbnN0ZWFkIG9mIGEKK3N0YXRlbWVudCwgYnV0IGl0IHdpbGwgYWxzbyBnaXZlIHlvdSB0aGUgdmFyaW91cyBiZW5lZml0cyB0aGUgZnVuY3Rpb24gaGFzIG92ZXIKK3RoZSBQeXRob24gMiBzdGF0ZW1lbnQgKHNpeF8gcHJvdmlkZXMgYSBmdW5jdGlvbiBpZiB5b3Ugc3VwcG9ydCBQeXRob24gMi41IG9yCitvbGRlcikuCiAKIAogYGBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHVuaWNvZGVfbGl0ZXJhbHNgYAogJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJwogCi1Bbm90aGVyIHBlcnNvbmFsIGNob2ljZS4gWW91IGNhbiBhbHdheXMgbWFyayB3aGF0IHlvdSB3YW50IHRvIGJlIGEgKHVuaWNvZGUpCi1zdHJpbmcgd2l0aCBhIGBgdWBgIHByZWZpeCB0byBnZXQgdGhlIHNhbWUgZWZmZWN0LiBCdXQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyCi15b3UgdXNlIHRoaXMgZnV0dXJlIHN0YXRlbWVudCBvciBub3QsIHlvdSAqKm11c3QqKiBtYWtlIHN1cmUgeW91IGtub3cgZXhhY3RseQotd2hpY2ggUHl0aG9uIDIgc3RyaW5ncyB5b3Ugd2FudCB0byBiZSBieXRlcywgYW5kIHdoaWNoIGFyZSB0byBiZSBzdHJpbmdzLiBUaGlzCi1tZWFucyB5b3Ugc2hvdWxkLCAqKmF0IG1pbmltdW0qKiBtYXJrIGFsbCBzdHJpbmdzIHRoYXQgYXJlIG1lYW50IHRvIGJlIHRleHQKLXN0cmluZ3Mgd2l0aCBhIGBgdWBgIHByZWZpeCBpZiB5b3UgZG8gbm90IHVzZSB0aGlzIGZ1dHVyZSBzdGF0ZW1lbnQuCitJZiB5b3UgY2hvb3NlIHRvIHVzZSB0aGlzIGZ1dHVyZSBzdGF0ZW1lbnQgdGhlbiBhbGwgc3RyaW5nIGxpdGVyYWxzIGluCitQeXRob24gMiB3aWxsIGJlIGFzc3VtZWQgdG8gYmUgVW5pY29kZSAoYXMgaXMgYWxyZWFkeSB0aGUgY2FzZSBpbiBQeXRob24gMykuCitJZiB5b3UgY2hvb3NlIG5vdCB0byB1c2UgdGhpcyBmdXR1cmUgc3RhdGVtZW50IHRoZW4geW91IHNob3VsZCBtYXJrIGFsbCBvZiB5b3VyCit0ZXh0IHN0cmluZ3Mgd2l0aCBhIGBgdWBgIHByZWZpeCBhbmQgb25seSBzdXBwb3J0IFB5dGhvbiAzLjMgb3IgbmV3ZXIuIEJ1dCB5b3UKK2FyZSAqKnN0cm9uZ2x5KiogYWR2aXNlZCB0byBkbyBvbmUgb3IgdGhlIG90aGVyIChzaXhfIHByb3ZpZGVzIGEgZnVuY3Rpb24gaW4KK2Nhc2UgeW91IGRvbid0IHdhbnQgdG8gdXNlIHRoZSBmdXR1cmUgc3RhdGVtZW50ICoqYW5kKiogeW91IHdhbnQgdG8gc3VwcG9ydAorUHl0aG9uIDMuMiBvciBvbGRlcikuCiAKIAotQnl0ZXMgbGl0ZXJhbHMKLScnJycnJycnJycnJycnCitCeXRlcy9zdHJpbmcgbGl0ZXJhbHMKKycnJycnJycnJycnJycnJycnJycnJwogCi1UaGlzIGlzIGEgKip2ZXJ5KiogaW1wb3J0YW50IG9uZS4gVGhlIGFiaWxpdHkgdG8gcHJlZml4IFB5dGhvbiAyIHN0cmluZ3MgdGhhdAotYXJlIG1lYW50IHRvIGNvbnRhaW4gYnl0ZXMgd2l0aCBhIGBgYmBgIHByZWZpeCBoZWxwIHRvIHZlcnkgY2xlYXJseSBkZWxpbmVhdGUKLXdoYXQgaXMgYW5kIGlzIG5vdCBhIFB5dGhvbiAzIHN0cmluZy4gV2hlbiB5b3UgcnVuIDJ0bzMgb24gY29kZSwgYWxsIFB5dGhvbiAyCi1zdHJpbmdzIGJlY29tZSBQeXRob24gMyBzdHJpbmdzICoqdW5sZXNzKiogdGhleSBhcmUgcHJlZml4ZWQgd2l0aCBgYGJgYC4KK1RoaXMgaXMgYSAqKnZlcnkqKiBpbXBvcnRhbnQgb25lLiBQcmVmaXggUHl0aG9uIDIgc3RyaW5ncyB0aGF0CithcmUgbWVhbnQgdG8gY29udGFpbiBieXRlcyB3aXRoIGEgYGBiYGAgcHJlZml4IHRvIHZlcnkgY2xlYXJseSBkZWxpbmVhdGUKK3doYXQgaXMgYW5kIGlzIG5vdCBhIFB5dGhvbiAzIHRleHQgc3RyaW5nIChzaXhfIHByb3ZpZGVzIGEgZnVuY3Rpb24gdG8gdXNlIGZvcgorUHl0aG9uIDIuNSBjb21wYXRpYmlsaXR5KS4KKworVGhpcyBwb2ludCBjYW5ub3QgYmUgc3RyZXNzZWQgZW5vdWdoOiBtYWtlIHN1cmUgeW91IGtub3cgd2hhdCBhbGwgb2YgeW91ciBzdHJpbmcKK2xpdGVyYWxzIGluIFB5dGhvbiAyIGFyZSBtZWFudCB0byBiZSBpbiBQeXRob24gMy4gQW55IHN0cmluZyBsaXRlcmFsIHRoYXQKK3Nob3VsZCBiZSB0cmVhdGVkIGFzIGJ5dGVzIHNob3VsZCBoYXZlIHRoZSBgYGJgYCBwcmVmaXguIEFueSBzdHJpbmcgbGl0ZXJhbAordGhhdCBzaG91bGQgYmUgVW5pY29kZS90ZXh0IGluIFB5dGhvbiAyIHNob3VsZCBlaXRoZXIgaGF2ZSB0aGUgYGB1YGAgbGl0ZXJhbAorKHN1cHBvcnRlZCwgYnV0IGlnbm9yZWQsIGluIFB5dGhvbiAzLjMgYW5kIGxhdGVyKSBvciB5b3Ugc2hvdWxkIGhhdmUKK2BgZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzYGAgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZS4gQnV0IHRoZSBrZXkKK3BvaW50IGlzIHlvdSBzaG91bGQga25vdyBob3cgUHl0aG9uIDMgd2lsbCB0cmVhdCBldmVyeSBvbmUgb25lIG9mIHlvdXIgc3RyaW5nCitsaXRlcmFscyBhbmQgeW91IHNob3VsZCBtYXJrIHRoZW0gYXMgYXBwcm9wcmlhdGUuCiAKIFRoZXJlIGFyZSBzb21lIGRpZmZlcmVuY2VzIGJldHdlZW4gYnl0ZSBsaXRlcmFscyBpbiBQeXRob24gMiBhbmQgdGhvc2UgaW4KIFB5dGhvbiAzIHRoYW5rcyB0byB0aGUgYnl0ZXMgdHlwZSBqdXN0IGJlaW5nIGFuIGFsaWFzIHRvIGBgc3RyYGAgaW4gUHl0aG9uIDIuCi1Qcm9iYWJseSB0aGUgYmlnZ2VzdCAiZ290Y2hhIiBpcyB0aGF0IGluZGV4aW5nIHJlc3VsdHMgaW4gZGlmZmVyZW50IHZhbHVlcy4gSW4KLVB5dGhvbiAyLCB0aGUgdmFsdWUgb2YgYGBiJ3B5J1sxXWBgIGlzIGBgJ3knYGAsIHdoaWxlIGluIFB5dGhvbiAzIGl0J3MgYGAxMjFgYC4KLVlvdSBjYW4gYXZvaWQgdGhpcyBkaXNwYXJpdHkgYnkgYWx3YXlzIHNsaWNpbmcgYXQgdGhlIHNpemUgb2YgYSBzaW5nbGUgZWxlbWVudDoKLWBgYidweSdbMToyXWBgIGlzIGBgJ3knYGAgaW4gUHl0aG9uIDIgYW5kIGBgYid5J2BgIGluIFB5dGhvbiAzIChpLmUuLCBjbG9zZQotZW5vdWdoKS4KK1NlZSB0aGUgYEhhbmRsZSBDb21tb24gIkdvdGNoYXMiYF8gc2VjdGlvbiBmb3Igd2hhdCB0byB3YXRjaCBvdXQgZm9yLgogCi1Zb3UgY2Fubm90IGNvbmNhdGVuYXRlIGJ5dGVzIGFuZCBzdHJpbmdzIGluIFB5dGhvbiAzLiBCdXQgc2luY2UgaW4gUHl0aG9uCi0yIGhhcyBieXRlcyBhbGlhc2VkIHRvIGBgc3RyYGAsIGl0IHdpbGwgc3VjY2VlZDogYGBiJ2EnICsgdSdiJ2BgIHdvcmtzIGluCi1QeXRob24gMiwgYnV0IGBgYidhJyArICdiJ2BgIGluIFB5dGhvbiAzIGlzIGEgOmV4YzpgVHlwZUVycm9yYC4gQSBzaW1pbGFyIGlzc3VlCi1hbHNvIGNvbWVzIGFib3V0IHdoZW4gZG9pbmcgY29tcGFyaXNvbnMgYmV0d2VlbiBieXRlcyBhbmQgc3RyaW5ncy4KK2BgZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnRgYAorJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnCitEaXNjdXNzZWQgaW4gbW9yZSBkZXRhaWwgYmVsb3csIGJ1dCB5b3Ugc2hvdWxkIHVzZSB0aGlzIGZ1dHVyZSBzdGF0ZW1lbnQgdG8KK3ByZXZlbnQgeW91cnNlbGYgZnJvbSBhY2NpZGVudGFsbHkgdXNpbmcgaW1wbGljaXQgcmVsYXRpdmUgaW1wb3J0cy4KIAogCiBTdXBwb3J0aW5nIGBQeXRob24gMi41YF8gYW5kIE5ld2VyIE9ubHkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIElmIHlvdSBhcmUgc3VwcG9ydGluZyBgUHl0aG9uIDIuNWBfIGFuZCBuZXdlciB0aGVyZSBhcmUgc3RpbGwgc29tZSBmZWF0dXJlcyBvZgogUHl0aG9uIHRoYXQgeW91IGNhbiB1dGlsaXplLgpAQCAtMjUxLDcgKzIyNCw3IEBACiAnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycKIAogSW1wbGljaXQgcmVsYXRpdmUgaW1wb3J0cyAoZS5nLiwgaW1wb3J0aW5nIGBgc3BhbS5iYWNvbmBgIGZyb20gd2l0aGluCi1gYHNwYW0uZWdnc2BgIHdpdGggdGhlIHN0YXRlbWVudCBgYGltcG9ydCBiYWNvbmBgKSBkb2VzIG5vdCB3b3JrIGluIFB5dGhvbiAzLgorYGBzcGFtLmVnZ3NgYCB3aXRoIHRoZSBzdGF0ZW1lbnQgYGBpbXBvcnQgYmFjb25gYCkgZG8gbm90IHdvcmsgaW4gUHl0aG9uIDMuCiBUaGlzIGZ1dHVyZSBzdGF0ZW1lbnQgbW92ZXMgYXdheSBmcm9tIHRoYXQgYW5kIGFsbG93cyB0aGUgdXNlIG9mIGV4cGxpY2l0CiByZWxhdGl2ZSBpbXBvcnRzIChlLmcuLCBgYGZyb20gLiBpbXBvcnQgYmFjb25gYCkuCiAKQEAgLTI2MSwxNiArMjM0LDc0IEBACiB0aGUgc3RhdGVtZW50LCBidXQgeW91IHN0aWxsIHdhbnQgdGhlIF9fZnV0dXJlX18gc3RhdGVtZW50IHRvIHByZXZlbnQgaW1wbGljaXQKIHJlbGF0aXZlIGltcG9ydHMuIEluIGBQeXRob24gMi43YF8gdGhlIF9fZnV0dXJlX18gc3RhdGVtZW50IGlzIG5vdCBuZWVkZWQuIEluCiBvdGhlciB3b3JkcywgdW5sZXNzIHlvdSBhcmUgb25seSBzdXBwb3J0aW5nIFB5dGhvbiAyLjcgb3IgYSB2ZXJzaW9uIGVhcmxpZXIKLXRoYW4gUHl0aG9uIDIuNSwgdXNlIHRoZSBfX2Z1dHVyZV9fIHN0YXRlbWVudC4KK3RoYW4gUHl0aG9uIDIuNSwgdXNlIHRoaXMgX19mdXR1cmVfXyBzdGF0ZW1lbnQuCiAKIAorTWFyayBhbGwgVW5pY29kZSBzdHJpbmdzIHdpdGggYSBgYHVgYCBwcmVmaXgKKycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJworCitXaGlsZSBQeXRob24gMi42IGhhcyBhIGBgX19mdXR1cmVfX2BgIHN0YXRlbWVudCB0byBhdXRvbWF0aWNhbGx5IGNhdXNlIFB5dGhvbiAyCit0byB0cmVhdCBhbGwgc3RyaW5nIGxpdGVyYWxzIGFzIFVuaWNvZGUsIFB5dGhvbiAyLjUgZG9lcyBub3QgaGF2ZSB0aGF0IHNob3J0Y3V0LgorVGhpcyBtZWFucyB5b3Ugc2hvdWxkIGdvIHRocm91Z2ggYW5kIG1hcmsgYWxsIHN0cmluZyBsaXRlcmFscyB3aXRoIGEgYGB1YGAKK3ByZWZpeCB0byB0dXJuIHRoZW0gZXhwbGljaXRseSBpbnRvIHRleHQgc3RyaW5ncyB3aGVyZSBhcHByb3ByaWF0ZSBhbmQgb25seQorc3VwcG9ydCBQeXRob24gMy4zIG9yIG5ld2VyLiBPdGhlcndpc2UgdXNlIGEgcHJvamVjdCBsaWtlIHNpeF8gd2hpY2ggcHJvdmlkZXMgYQorZnVuY3Rpb24gdG8gcGFzcyBhbGwgdGV4dCBzdHJpbmcgbGl0ZXJhbHMgdGhyb3VnaC4KKworCitDYXB0dXJpbmcgdGhlIEN1cnJlbnRseSBSYWlzZWQgRXhjZXB0aW9uCisnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnCisKK0luIFB5dGhvbiAyLjUgYW5kIGVhcmxpZXIgdGhlIHN5bnRheCB0byBhY2Nlc3MgdGhlIGN1cnJlbnQgZXhjZXB0aW9uIGlzOjoKKworICAgdHJ5OgorICAgICByYWlzZSBFeGNlcHRpb24oKQorICAgZXhjZXB0IEV4Y2VwdGlvbiwgZXhjOgorICAgICAjIEN1cnJlbnQgZXhjZXB0aW9uIGlzICdleGMnLgorICAgICBwYXNzCisKK1RoaXMgc3ludGF4IGNoYW5nZWQgaW4gUHl0aG9uIDMgKGFuZCBiYWNrcG9ydGVkIHRvIGBQeXRob24gMi42YF8gYW5kIGxhdGVyKQordG86OgorCisgICB0cnk6CisgICAgIHJhaXNlIEV4Y2VwdGlvbigpCisgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKKyAgICAgIyBDdXJyZW50IGV4Y2VwdGlvbiBpcyAnZXhjJy4KKyAgICAgIyBJbiBQeXRob24gMywgJ2V4YycgaXMgcmVzdHJpY3RlZCB0byB0aGUgYmxvY2s7IGluIFB5dGhvbiAyLjYvMi43IGl0IHdpbGwgImxlYWsiLgorICAgICBwYXNzCisKK0JlY2F1c2Ugb2YgdGhpcyBzeW50YXggY2hhbmdlIHlvdSBtdXN0IGNoYW5nZSBob3cgeW91IGNhcHR1cmUgdGhlIGN1cnJlbnQKK2V4Y2VwdGlvbiBpbiBQeXRob24gMi41IGFuZCBlYXJsaWVyIHRvOjoKKworICAgdHJ5OgorICAgICByYWlzZSBFeGNlcHRpb24oKQorICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgaW1wb3J0IHN5cworICAgICBleGMgPSBzeXMuZXhjX2luZm8oKVsxXQorICAgICAjIEN1cnJlbnQgZXhjZXB0aW9uIGlzICdleGMnLgorICAgICBwYXNzCisKK1lvdSBjYW4gZ2V0IG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJhaXNlZCBleGNlcHRpb24gZnJvbQorOmZ1bmM6YHN5cy5leGNfaW5mb2AgdGhhbiBzaW1wbHkgdGhlIGN1cnJlbnQgZXhjZXB0aW9uIGluc3RhbmNlLCBidXQgeW91IG1vc3QKK2xpa2VseSBkb24ndCBuZWVkIGl0LgorCisuLiBub3RlOjoKKyAgIEluIFB5dGhvbiAzLCB0aGUgdHJhY2ViYWNrIGlzIGF0dGFjaGVkIHRvIHRoZSBleGNlcHRpb24gaW5zdGFuY2UKKyAgIHRocm91Z2ggdGhlIGBgX190cmFjZWJhY2tfX2BgIGF0dHJpYnV0ZS4gSWYgdGhlIGluc3RhbmNlIGlzIHNhdmVkIGluCisgICBhIGxvY2FsIHZhcmlhYmxlIHRoYXQgcGVyc2lzdHMgb3V0c2lkZSBvZiB0aGUgYGBleGNlcHRgYCBibG9jaywgdGhlCisgICB0cmFjZWJhY2sgd2lsbCBjcmVhdGUgYSByZWZlcmVuY2UgY3ljbGUgd2l0aCB0aGUgY3VycmVudCBmcmFtZSBhbmQgaXRzCisgICBkaWN0aW9uYXJ5IG9mIGxvY2FsIHZhcmlhYmxlcy4gIFRoaXMgd2lsbCBkZWxheSByZWNsYWltaW5nIGRlYWQKKyAgIHJlc291cmNlcyB1bnRpbCB0aGUgbmV4dCBjeWNsaWMgOnRlcm06YGdhcmJhZ2UgY29sbGVjdGlvbmAgcGFzcy4KKworICAgSW4gUHl0aG9uIDIsIHRoaXMgcHJvYmxlbSBvbmx5IG9jY3VycyBpZiB5b3Ugc2F2ZSB0aGUgdHJhY2ViYWNrIGl0c2VsZgorICAgKGUuZy4gdGhlIHRoaXJkIGVsZW1lbnQgb2YgdGhlIHR1cGxlIHJldHVybmVkIGJ5IDpmdW5jOmBzeXMuZXhjX2luZm9gKQorICAgaW4gYSB2YXJpYWJsZS4KKwogCiBIYW5kbGUgQ29tbW9uICJHb3RjaGFzIgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLVRoZXJlIGFyZSBhIGZldyB0aGluZ3MgdGhhdCBqdXN0IGNvbnNpc3RlbnRseSBjb21lIHVwIGFzIHN0aWNraW5nIHBvaW50cyBmb3IKLXBlb3BsZSB3aGljaCAydG8zIGNhbm5vdCBoYW5kbGUgYXV0b21hdGljYWxseSBvciBjYW4gZWFzaWx5IGJlIGRvbmUgaW4gUHl0aG9uIDIKLXRvIGhlbHAgbW9kZXJuaXplIHlvdXIgY29kZS4KK1RoZXNlIGFyZSB0aGluZ3MgdG8gd2F0Y2ggb3V0IGZvciBubyBtYXR0ZXIgd2hhdCB2ZXJzaW9uIG9mIFB5dGhvbiAyIHlvdSBhcmUKK3N1cHBvcnRpbmcgd2hpY2ggYXJlIG5vdCBzeW50YWN0aWMgY29uc2lkZXJhdGlvbnMuCiAKIAogYGBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uYGAKQEAgLTMyNyw5ICszNTgsOSBAQAogdGhlIGJ5dGVzL3N0cmluZyBkaWNob3RvbXkuIEJlY2F1c2UgUHl0aG9uIDIgYWxsb3dlZCB0aGUgYGBzdHJgYCB0eXBlIHRvIGhvbGQKIHRleHR1YWwgZGF0YSwgcGVvcGxlIGhhdmUgb3ZlciB0aGUgeWVhcnMgYmVlbiByYXRoZXIgbG9vc2UgaW4gdGhlaXIgZGVsaW5lYXRpb24KIG9mIHdoYXQgYGBzdHJgYCBpbnN0YW5jZXMgaGVsZCB0ZXh0IGNvbXBhcmVkIHRvIGJ5dGVzLiBJbiBQeXRob24gMyB5b3UgY2Fubm90Ci1iZSBzbyBjYXJlLWZyZWUgYW55bW9yZSBhbmQgbmVlZCB0byBwcm9wZXJseSBoYW5kbGUgdGhlIGRpZmZlcmVuY2UuIFRoZSBrZXkKLWhhbmRsaW5nIHRoaXMgaXNzdWUgdG8gbWFrZSBzdXJlIHRoYXQgKipldmVyeSoqIHN0cmluZyBsaXRlcmFsIGluIHlvdXIKLVB5dGhvbiAyIGNvZGUgaXMgZWl0aGVyIHN5bnRhY3RpY2FsbHkgb2YgZnVuY3Rpb25hbGx5IG1hcmtlZCBhcyBlaXRoZXIgYnl0ZXMgb3IKK2JlIHNvIGNhcmUtZnJlZSBhbnltb3JlIGFuZCBuZWVkIHRvIHByb3Blcmx5IGhhbmRsZSB0aGUgZGlmZmVyZW5jZS4gVGhlIGtleSB0bworaGFuZGxpbmcgdGhpcyBpc3N1ZSBpcyB0byBtYWtlIHN1cmUgdGhhdCAqKmV2ZXJ5Kiogc3RyaW5nIGxpdGVyYWwgaW4geW91cgorUHl0aG9uIDIgY29kZSBpcyBlaXRoZXIgc3ludGFjdGljYWxseSBvciBmdW5jdGlvbmFsbHkgbWFya2VkIGFzIGVpdGhlciBieXRlcyBvcgogdGV4dCBkYXRhLiBBZnRlciB0aGlzIGlzIGRvbmUgeW91IHRoZW4gbmVlZCB0byBtYWtlIHN1cmUgeW91ciBBUElzIGFyZSBkZXNpZ25lZAogdG8gZWl0aGVyIGhhbmRsZSBhIHNwZWNpZmljIHR5cGUgb3IgbWFkZSB0byBiZSBwcm9wZXJseSBwb2x5bW9ycGhpYy4KIApAQCAtMzQzLDcgKzM3NCw3IEBACiBhbmQgdGhlbiBkZXNpZ25hdGluZyB0ZXh0dWFsIGRhdGEgd2l0aCBhIGBgdWBgIHByZWZpeCBvciB1c2luZyB0aGUKIGBgdW5pY29kZV9saXRlcmFsc2BgIGZ1dHVyZSBzdGF0ZW1lbnQuCiAKLUlmIHlvdXIgcHJvamVjdCBzdXBwb3J0cyB2ZXJzaW9ucyBvZiBQeXRob24gcHJlLWRhdGluZyAyLjYsIHRoZW4geW91IHNob3VsZCB1c2UKK0lmIHlvdXIgcHJvamVjdCBzdXBwb3J0cyB2ZXJzaW9ucyBvZiBQeXRob24gcHJlZGF0aW5nIDIuNiwgdGhlbiB5b3Ugc2hvdWxkIHVzZQogdGhlIHNpeF8gcHJvamVjdCBhbmQgaXRzIGBgYigpYGAgZnVuY3Rpb24gdG8gZGVub3RlIGJ5dGVzIGxpdGVyYWxzLiBGb3IgdGV4dAogbGl0ZXJhbHMgeW91IGNhbiBlaXRoZXIgdXNlIHNpeCdzIGBgdSgpYGAgZnVuY3Rpb24gb3IgdXNlIGEgYGB1YGAgcHJlZml4LgogCkBAIC00MzYsMTQgKzQ2Nyw3IEBACiBoYXBwZW4gdG8gdXNlIHRoZSBgYHVuaWNvZGUoc2VsZikuZW5jb2RlKCd1dGY4JylgYCBpZGlvbSBhcyB0aGUgYm9keSBvZiB5b3VyCiBgYF9fc3RyX18oKWBgIG1ldGhvZCkuCiAKLVRoZXJlIGFyZSB0d28gd2F5cyB0byBzb2x2ZSB0aGlzIGlzc3VlLiBPbmUgaXMgdG8gdXNlIGEgY3VzdG9tIDJ0bzMgZml4ZXIuIFRoZQotYmxvZyBwb3N0IGF0IGh0dHA6Ly9sdWN1bXIucG9jb28ub3JnLzIwMTEvMS8yMi9mb3J3YXJkcy1jb21wYXRpYmxlLXB5dGhvbi8KLXNwZWNpZmllcyBob3cgdG8gZG8gdGhpcy4gVGhhdCB3aWxsIGFsbG93IDJ0bzMgdG8gY2hhbmdlIGFsbCBpbnN0YW5jZXMgb2YgYGBkZWYKLV9fdW5pY29kZShzZWxmKTogLi4uYGAgdG8gYGBkZWYgX19zdHJfXyhzZWxmKTogLi4uYGAuIFRoaXMgZG9lcyByZXF1aXJlIHlvdQotZGVmaW5lIHlvdXIgYGBfX3N0cl9fKClgYCBtZXRob2QgaW4gUHl0aG9uIDIgYmVmb3JlIHlvdXIgYGBfX3VuaWNvZGVfXygpYGAKLW1ldGhvZC4KLQotVGhlIG90aGVyIG9wdGlvbiBpcyB0byB1c2UgYSBtaXhpbiBjbGFzcy4gVGhpcyBhbGxvd3MgeW91IHRvIG9ubHkgZGVmaW5lIGEKK1lvdSBjYW4gdXNlIGEgbWl4aW4gY2xhc3MgdG8gd29yayBhcm91bmQgdGhpcy4gVGhpcyBhbGxvd3MgeW91IHRvIG9ubHkgZGVmaW5lIGEKIGBgX191bmljb2RlX18oKWBgIG1ldGhvZCBmb3IgeW91ciBjbGFzcyBhbmQgbGV0IHRoZSBtaXhpbiBkZXJpdmUKIGBgX19zdHJfXygpYGAgZm9yIHlvdSAoY29kZSBmcm9tCiBodHRwOi8vbHVjdW1yLnBvY29vLm9yZy8yMDExLzEvMjIvZm9yd2FyZHMtY29tcGF0aWJsZS1weXRob24vKTo6CkBAIC00ODYsNiArNTEwLDcgQEAKIAogRXZlbiBiZXR0ZXIgaXMgdG8gdXNlIHRoZSBkb2N1bWVudGVkIGF0dHJpYnV0ZXMgdGhlIGV4Y2VwdGlvbiBwcm92aWRlcy4KIAorCiBEb24ndCB1c2UgYGBfX2dldHNsaWNlX19gYCAmIEZyaWVuZHMKICcnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJwogCkBAIC00OTcsMTg5ICs1MjIsNjIgQEAKIFVwZGF0aW5nIGRvY3Rlc3RzCiAnJycnJycnJycnJycnJycnJwogCi0ydG8zXyB3aWxsIGF0dGVtcHQgdG8gZ2VuZXJhdGUgZml4ZXMgZm9yIGRvY3Rlc3RzIHRoYXQgaXQgY29tZXMgYWNyb3NzLiBJdCdzCi1ub3QgcGVyZmVjdCwgdGhvdWdoLiBJZiB5b3Ugd3JvdGUgYSBtb25vbGl0aGljIHNldCBvZiBkb2N0ZXN0cyAoZS5nLiwgYSBzaW5nbGUKLWRvY3N0cmluZyBjb250YWluaW5nIGFsbCBvZiB5b3VyIGRvY3Rlc3RzKSwgeW91IHNob3VsZCBhdCBsZWFzdCBjb25zaWRlcgotYnJlYWtpbmcgdGhlIGRvY3Rlc3RzIHVwIGludG8gc21hbGxlciBwaWVjZXMgdG8gbWFrZSBpdCBtb3JlIG1hbmFnZWFibGUgdG8gZml4LgotT3RoZXJ3aXNlIGl0IG1pZ2h0IHZlcnkgd2VsbCBiZSB3b3J0aCB5b3VyIHRpbWUgYW5kIGVmZm9ydCB0byBwb3J0IHlvdXIgdGVzdHMKLXRvIDptb2Q6YHVuaXR0ZXN0YC4KK0Rvbid0IGZvcmdldCB0byBtYWtlIHRoZW0gUHl0aG9uIDIvMyBjb21wYXRpYmxlIGFzIHdlbGwuIElmIHlvdSB3cm90ZSBhCittb25vbGl0aGljIHNldCBvZiBkb2N0ZXN0cyAoZS5nLiwgYSBzaW5nbGUgZG9jc3RyaW5nIGNvbnRhaW5pbmcgYWxsIG9mIHlvdXIKK2RvY3Rlc3RzKSwgeW91IHNob3VsZCBhdCBsZWFzdCBjb25zaWRlciBicmVha2luZyB0aGUgZG9jdGVzdHMgdXAgaW50byBzbWFsbGVyCitwaWVjZXMgdG8gbWFrZSBpdCBtb3JlIG1hbmFnZWFibGUgdG8gZml4LiBPdGhlcndpc2UgaXQgbWlnaHQgdmVyeSB3ZWxsIGJlIHdvcnRoCit5b3VyIHRpbWUgYW5kIGVmZm9ydCB0byBwb3J0IHlvdXIgdGVzdHMgdG8gOm1vZDpgdW5pdHRlc3RgLgogCiAKK1VwZGF0ZSBgYG1hcGBgIGZvciBpbWJhbGFuY2VkIGlucHV0IHNlcXVlbmNlcworJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnCisKK1dpdGggUHl0aG9uIDIsIHdoZW4gYGBtYXBgYCB3YXMgZ2l2ZW4gbW9yZSB0aGFuIG9uZSBpbnB1dCBzZXF1ZW5jZSBpdCB3b3VsZCBwYWQKK3RoZSBzaG9ydGVyIHNlcXVlbmNlcyB3aXRoIGBOb25lYCB2YWx1ZXMsIHJldHVybmluZyBhIHNlcXVlbmNlIGFzIGxvbmcgYXMgdGhlCitsb25nZXN0IGlucHV0IHNlcXVlbmNlLgorCitXaXRoIFB5dGhvbiAzLCBpZiB0aGUgaW5wdXQgc2VxdWVuY2VzIHRvIGBgbWFwYGAgYXJlIG9mIHVuZXF1YWwgbGVuZ3RoLCBgYG1hcGBgCit3aWxsIHN0b3AgYXQgdGhlIHRlcm1pbmF0aW9uIG9mIHRoZSBzaG9ydGVzdCBvZiB0aGUgc2VxdWVuY2VzLiBGb3IgZnVsbAorY29tcGF0aWJpbGl0eSB3aXRoIGBgbWFwYGAgZnJvbSBQeXRob24gMi54LCB3cmFwIHRoZSBzZXF1ZW5jZSBhcmd1bWVudHMgaW4KKzpmdW5jOmBpdGVydG9vbHMuemlwX2xvbmdlc3RgLCBlLmcuIGBgbWFwKGZ1bmMsICpzZXF1ZW5jZXMpYGAgYmVjb21lcworYGBsaXN0KG1hcChmdW5jLCBpdGVydG9vbHMuemlwX2xvbmdlc3QoKnNlcXVlbmNlcykpKWBgLgorCiBFbGltaW5hdGUgYGAtM2BgIFdhcm5pbmdzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFdoZW4geW91IHJ1biB5b3VyIGFwcGxpY2F0aW9uJ3MgdGVzdCBzdWl0ZSwgcnVuIGl0IHVzaW5nIHRoZSBgYC0zYGAgZmxhZyBwYXNzZWQKIHRvIFB5dGhvbi4gVGhpcyB3aWxsIGNhdXNlIHZhcmlvdXMgd2FybmluZ3MgdG8gYmUgcmFpc2VkIGR1cmluZyBleGVjdXRpb24gYWJvdXQKLXRoaW5ncyB0aGF0IDJ0bzMgY2Fubm90IGhhbmRsZSBhdXRvbWF0aWNhbGx5IChlLmcuLCBtb2R1bGVzIHRoYXQgaGF2ZSBiZWVuCi1yZW1vdmVkKS4gVHJ5IHRvIGVsaW1pbmF0ZSB0aG9zZSB3YXJuaW5ncyB0byBtYWtlIHlvdXIgY29kZSBldmVuIG1vcmUgcG9ydGFibGUKLXRvIFB5dGhvbiAzLgordGhpbmdzIHRoYXQgYXJlIHNlbWFudGljIGNoYW5nZXMgYmV0d2VlbiBQeXRob24gMiBhbmQgMy4gVHJ5IHRvIGVsaW1pbmF0ZSB0aG9zZQord2FybmluZ3MgdG8gbWFrZSB5b3VyIGNvZGUgZXZlbiBtb3JlIHBvcnRhYmxlIHRvIFB5dGhvbiAzLgogCiAKLVJ1biAydG8zCi0tLS0tLS0tLQorQWx0ZXJuYXRpdmUgQXBwcm9hY2hlcworPT09PT09PT09PT09PT09PT09PT09PQogCi1PbmNlIHlvdSBoYXZlIG1hZGUgeW91ciBQeXRob24gMiBjb2RlIGZ1dHVyZS1jb21wYXRpYmxlIHdpdGggUHl0aG9uIDMsIGl0J3MKLXRpbWUgdG8gdXNlIDJ0bzNfIHRvIGFjdHVhbGx5IHBvcnQgeW91ciBjb2RlLgorV2hpbGUgc3VwcG9ydGluZyBQeXRob24gMiAmIDMgc2ltdWx0YW5lb3VzbHkgaXMgdHlwaWNhbGx5IHRoZSBwcmVmZXJyZWQgY2hvaWNlCitieSBwZW9wbGUgc28gdGhhdCB0aGV5IGNhbiBjb250aW51ZSB0byBpbXByb3ZlIGNvZGUgYW5kIGhhdmUgaXQgd29yayBmb3IgdGhlCittb3N0IG51bWJlciBvZiB1c2VycywgeW91ciBsaWZlIG1heSBiZSBlYXNpZXIgaWYgeW91IG9ubHkgaGF2ZSB0byBzdXBwb3J0IG9uZQorbWFqb3IgdmVyc2lvbiBvZiBQeXRob24gZ29pbmcgZm9yd2FyZC4KKworU3VwcG9ydGluZyBPbmx5IFB5dGhvbiAzIEdvaW5nIEZvcndhcmQgRnJvbSBQeXRob24gMiBDb2RlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSWYgeW91IGhhdmUgUHl0aG9uIDIgY29kZSBidXQgZ29pbmcgZm9yd2FyZCBvbmx5IHdhbnQgdG8gaW1wcm92ZSBpdCBhcyBQeXRob24gMworY29kZSwgdGhlbiB5b3UgY2FuIHVzZSAydG8zXyB0byB0cmFuc2xhdGUgeW91ciBQeXRob24gMiBjb2RlIHRvIFB5dGhvbiAzIGNvZGUuCitUaGlzIGlzIG9ubHkgcmVjb21tZW5kZWQsIHRob3VnaCwgaWYgeW91ciBjdXJyZW50IHZlcnNpb24gb2YgeW91ciBwcm9qZWN0IGlzCitnb2luZyBpbnRvIG1haW50ZW5hbmNlIG1vZGUgYW5kIHlvdSB3YW50IGFsbCBuZXcgZmVhdHVyZXMgdG8gYmUgZXhjbHVzaXZlIHRvCitQeXRob24gMy4KIAogCi1NYW51YWxseQotJycnJycnJycKK0JhY2twb3J0aW5nIFB5dGhvbiAzIGNvZGUgdG8gUHl0aG9uIDIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotVG8gbWFudWFsbHkgY29udmVydCBzb3VyY2UgY29kZSB1c2luZyAydG8zXywgeW91IHVzZSB0aGUgYGAydG8zYGAgc2NyaXB0IHRoYXQKLWlzIGluc3RhbGxlZCB3aXRoIFB5dGhvbiAyLjYgYW5kIGxhdGVyLjo6Ci0KLSAgIDJ0bzMgPGRpcmVjdG9yeSBvciBmaWxlIHRvIGNvbnZlcnQ+Ci0KLVRoaXMgd2lsbCBjYXVzZSAydG8zIHRvIHdyaXRlIG91dCBhIGRpZmYgd2l0aCBhbGwgb2YgdGhlIGZpeGVycyBhcHBsaWVkIGZvciB0aGUKLWNvbnZlcnRlZCBzb3VyY2UgY29kZS4gSWYgeW91IHdvdWxkIGxpa2UgMnRvMyB0byBnbyBhaGVhZCBhbmQgYXBwbHkgdGhlIGNoYW5nZXMKLXlvdSBjYW4gcGFzcyBpdCB0aGUgYGAtd2BgIGZsYWc6OgotCi0gICAydG8zIC13IDxzdHVmZiB0byBjb252ZXJ0PgotCi1UaGVyZSBhcmUgb3RoZXIgZmxhZ3MgYXZhaWxhYmxlIHRvIGNvbnRyb2wgZXhhY3RseSB3aGljaCBmaXhlcnMgYXJlIGFwcGxpZWQsCi1ldGMuCi0KLQotRHVyaW5nIEluc3RhbGxhdGlvbgotJycnJycnJycnJycnJycnJycnJwotCi1XaGVuIGEgdXNlciBpbnN0YWxscyB5b3VyIHByb2plY3QgZm9yIFB5dGhvbiAzLCB5b3UgY2FuIGhhdmUgZWl0aGVyCi06bW9kOmBkaXN0dXRpbHNgIG9yIERpc3RyaWJ1dGVfIHJ1biAydG8zXyBvbiB5b3VyIGJlaGFsZi4KLUZvciBkaXN0dXRpbHMsIHVzZSB0aGUgZm9sbG93aW5nIGlkaW9tOjoKLQotICAgdHJ5OiAgIyBQeXRob24gMwotICAgICBmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX3B5IGltcG9ydCBidWlsZF9weV8ydG8zIGFzIGJ1aWxkX3B5Ci0gICBleGNlcHQgSW1wb3J0RXJyb3I6ICAjIFB5dGhvbiAyCi0gICAgIGZyb20gZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfcHkgaW1wb3J0IGJ1aWxkX3B5Ci0KLSAgIHNldHVwKGNtZGNsYXNzID0geydidWlsZF9weSc6IGJ1aWxkX3B5fSwKLSAgICAgIyAuLi4KLSAgICkKLQotRm9yIERpc3RyaWJ1dGU6OgotCi0gICBzZXR1cCh1c2VfMnRvMz1UcnVlLAotICAgICAjIC4uLgotICAgKQotCi1UaGlzIHdpbGwgYWxsb3cgeW91IHRvIG5vdCBoYXZlIHRvIGRpc3RyaWJ1dGUgYSBzZXBhcmF0ZSBQeXRob24gMyB2ZXJzaW9uIG9mCi15b3VyIHByb2plY3QuIEl0IGRvZXMgcmVxdWlyZSwgdGhvdWdoLCB0aGF0IHdoZW4geW91IHBlcmZvcm0gZGV2ZWxvcG1lbnQgdGhhdAoteW91IGF0IGxlYXN0IGJ1aWxkIHlvdXIgcHJvamVjdCBhbmQgdXNlIHRoZSBidWlsdCBQeXRob24gMyBzb3VyY2UgZm9yIHRlc3RpbmcuCi0KLQotVmVyaWZ5ICYgVGVzdAotLS0tLS0tLS0tLS0tLQotCi1BdCB0aGlzIHBvaW50IHlvdSBzaG91bGQgKGhvcGVmdWxseSkgaGF2ZSB5b3VyIHByb2plY3QgY29udmVydGVkIGluIHN1Y2ggYSB3YXkKLXRoYXQgaXQgd29ya3MgaW4gUHl0aG9uIDMuIFZlcmlmeSBpdCBieSBydW5uaW5nIHlvdXIgdW5pdCB0ZXN0cyBhbmQgbWFraW5nIHN1cmUKLW5vdGhpbmcgaGFzIGdvbmUgYXdyeS4gSWYgeW91IG1pc3Mgc29tZXRoaW5nIHRoZW4gZmlndXJlIG91dCBob3cgdG8gZml4IGl0IGluCi1QeXRob24gMywgYmFja3BvcnQgdG8geW91ciBQeXRob24gMiBjb2RlLCBhbmQgcnVuIHlvdXIgY29kZSB0aHJvdWdoIDJ0bzMgYWdhaW4KLXRvIHZlcmlmeSB0aGUgZml4IHRyYW5zZm9ybXMgcHJvcGVybHkuCi0KLQotLi4gXzJ0bzM6IGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvcHkzay9saWJyYXJ5LzJ0bzMuaHRtbAotLi4gX0Rpc3RyaWJ1dGU6IGh0dHA6Ly9wYWNrYWdlcy5weXRob24ub3JnL2Rpc3RyaWJ1dGUvCi0KLQotLi4gX3VzZV9zYW1lX3NvdXJjZToKLQotUHl0aG9uIDIvMyBDb21wYXRpYmxlIFNvdXJjZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1XaGlsZSBpdCBtYXkgc2VlbSBjb3VudGVyLWludHVpdGl2ZSwgeW91IGNhbiB3cml0ZSBQeXRob24gY29kZSB3aGljaCBpcwotc291cmNlLWNvbXBhdGlibGUgYmV0d2VlbiBQeXRob24gMiAmIDMuIEl0IGRvZXMgbGVhZCB0byBjb2RlIHRoYXQgaXMgbm90Ci1lbnRpcmVseSBpZGlvbWF0aWMgUHl0aG9uIChlLmcuLCBoYXZpbmcgdG8gZXh0cmFjdCB0aGUgY3VycmVudGx5IHJhaXNlZAotZXhjZXB0aW9uIGZyb20gYGBzeXMuZXhjX2luZm8oKVsxXWBgKSwgYnV0IGl0IGNhbiBiZSBydW4gdW5kZXIgUHl0aG9uIDIKLSoqYW5kKiogUHl0aG9uIDMgd2l0aG91dCB1c2luZyAydG8zXyBhcyBhIHRyYW5zbGF0aW9uIHN0ZXAgKGFsdGhvdWdoIHRoZSB0b29sCi1zaG91bGQgYmUgdXNlZCB0byBoZWxwIGZpbmQgcG90ZW50aWFsIHBvcnRhYmlsaXR5IHByb2JsZW1zKS4gVGhpcyBhbGxvd3MgeW91IHRvCi1jb250aW51ZSB0byBoYXZlIGEgcmFwaWQgZGV2ZWxvcG1lbnQgcHJvY2VzcyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgeW91IGFyZQotZGV2ZWxvcGluZyB1bmRlciBQeXRob24gMiBvciBQeXRob24gMy4gV2hldGhlciB0aGlzIGFwcHJvYWNoIG9yIHVzaW5nCi06cmVmOmB1c2VfMnRvM2Agd29ya3MgYmVzdCBmb3IgeW91IHdpbGwgYmUgYSBwZXItcHJvamVjdCBkZWNpc2lvbi4KLQotVG8gZ2V0IGEgY29tcGxldGUgaWRlYSBvZiB3aGF0IGlzc3VlcyB5b3Ugd2lsbCBuZWVkIHRvIGRlYWwgd2l0aCwgc2VlIHRoZQotYFdoYXQncyBOZXcgaW4gUHl0aG9uIDMuMGBfLiBPdGhlcnMgaGF2ZSByZW9yZ2FuaXplZCB0aGUgZGF0YSBpbiBvdGhlciBmb3JtYXRzCi1zdWNoIGFzIGh0dHA6Ly9kb2NzLnB5dGhvbnNwcmludHMuY29tL3B5dGhvbjNfcG9ydGluZy9weS1wb3J0aW5nLmh0bWwgLgotCi1UaGUgZm9sbG93aW5nIGFyZSBzb21lIHN0ZXBzIHRvIHRha2UgdG8gdHJ5IHRvIHN1cHBvcnQgYm90aCBQeXRob24gMiAmIDMgZnJvbQotdGhlIHNhbWUgc291cmNlIGNvZGUuCi0KLQotLi4gX1doYXQncyBOZXcgaW4gUHl0aG9uIDMuMDogaHR0cDovL2RvY3MucHl0aG9uLm9yZy9yZWxlYXNlLzMuMC93aGF0c25ldy8zLjAuaHRtbAotCi0KLUZvbGxvdyBUaGUgU3RlcHMgZm9yIFVzaW5nIDJ0bzNfCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BbGwgb2YgdGhlIHN0ZXBzIG91dGxpbmVkIGluIGhvdyB0bwotOnJlZjpgcG9ydCBQeXRob24gMiBjb2RlIHdpdGggMnRvMyA8dXNlXzJ0bzM+YCBhcHBseQotdG8gY3JlYXRpbmcgYSBQeXRob24gMi8zIGNvZGViYXNlLiBUaGlzIGluY2x1ZGVzIHRyeWluZyBvbmx5IHN1cHBvcnQgUHl0aG9uIDIuNgotb3IgbmV3ZXIgKHRoZSA6bW9kOmBfX2Z1dHVyZV9fYCBzdGF0ZW1lbnRzIHdvcmsgaW4gUHl0aG9uIDMgd2l0aG91dCBpc3N1ZSksCi1lbGltaW5hdGluZyB3YXJuaW5ncyB0aGF0IGFyZSB0cmlnZ2VyZWQgYnkgYGAtM2BgLCBldGMuCi0KLVlvdSBzaG91bGQgZXZlbiBjb25zaWRlciBydW5uaW5nIDJ0bzNfIG92ZXIgeW91ciBjb2RlICh3aXRob3V0IGNvbW1pdHRpbmcgdGhlCi1jaGFuZ2VzKS4gVGhpcyB3aWxsIGxldCB5b3Uga25vdyB3aGVyZSBwb3RlbnRpYWwgcGFpbiBwb2ludHMgYXJlIHdpdGhpbiB5b3VyCi1jb2RlIHNvIHRoYXQgeW91IGNhbiBmaXggdGhlbSBwcm9wZXJseSBiZWZvcmUgdGhleSBiZWNvbWUgYW4gaXNzdWUuCi0KLQotVXNlIHNpeF8KLS0tLS0tLS0tCi0KLVRoZSBzaXhfIHByb2plY3QgY29udGFpbnMgbWFueSB0aGluZ3MgdG8gaGVscCB5b3Ugd3JpdGUgcG9ydGFibGUgUHl0aG9uIGNvZGUuCi1Zb3Ugc2hvdWxkIG1ha2Ugc3VyZSB0byByZWFkIGl0cyBkb2N1bWVudGF0aW9uIGZyb20gYmVnaW5uaW5nIHRvIGVuZCBhbmQgdXNlCi1hbnkgYW5kIGFsbCBmZWF0dXJlcyBpdCBwcm92aWRlcy4gVGhhdCB3YXkgeW91IHdpbGwgbWluaW1pemUgYW55IG1pc3Rha2VzIHlvdQotbWlnaHQgbWFrZSBpbiB3cml0aW5nIGNyb3NzLXZlcnNpb24gY29kZS4KLQotCi1DYXB0dXJpbmcgdGhlIEN1cnJlbnRseSBSYWlzZWQgRXhjZXB0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU9uZSBjaGFuZ2UgYmV0d2VlbiBQeXRob24gMiBhbmQgMyB0aGF0IHdpbGwgcmVxdWlyZSBjaGFuZ2luZyBob3cgeW91IGNvZGUgKGlmCi15b3Ugc3VwcG9ydCBgUHl0aG9uIDIuNWBfIGFuZCBlYXJsaWVyKSBpcwotYWNjZXNzaW5nIHRoZSBjdXJyZW50bHkgcmFpc2VkIGV4Y2VwdGlvbi4gIEluIFB5dGhvbiAyLjUgYW5kIGVhcmxpZXIgdGhlIHN5bnRheAotdG8gYWNjZXNzIHRoZSBjdXJyZW50IGV4Y2VwdGlvbiBpczo6Ci0KLSAgIHRyeToKLSAgICAgcmFpc2UgRXhjZXB0aW9uKCkKLSAgIGV4Y2VwdCBFeGNlcHRpb24sIGV4YzoKLSAgICAgIyBDdXJyZW50IGV4Y2VwdGlvbiBpcyAnZXhjJwotICAgICBwYXNzCi0KLVRoaXMgc3ludGF4IGNoYW5nZWQgaW4gUHl0aG9uIDMgKGFuZCBiYWNrcG9ydGVkIHRvIGBQeXRob24gMi42YF8gYW5kIGxhdGVyKQotdG86OgotCi0gICB0cnk6Ci0gICAgIHJhaXNlIEV4Y2VwdGlvbigpCi0gICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKLSAgICAgIyBDdXJyZW50IGV4Y2VwdGlvbiBpcyAnZXhjJwotICAgICAjIEluIFB5dGhvbiAzLCAnZXhjJyBpcyByZXN0cmljdGVkIHRvIHRoZSBibG9jazsgUHl0aG9uIDIuNiB3aWxsICJsZWFrIgotICAgICBwYXNzCi0KLUJlY2F1c2Ugb2YgdGhpcyBzeW50YXggY2hhbmdlIHlvdSBtdXN0IGNoYW5nZSB0byBjYXB0dXJpbmcgdGhlIGN1cnJlbnQKLWV4Y2VwdGlvbiB0bzo6Ci0KLSAgIHRyeToKLSAgICAgcmFpc2UgRXhjZXB0aW9uKCkKLSAgIGV4Y2VwdCBFeGNlcHRpb246Ci0gICAgIGltcG9ydCBzeXMKLSAgICAgZXhjID0gc3lzLmV4Y19pbmZvKClbMV0KLSAgICAgIyBDdXJyZW50IGV4Y2VwdGlvbiBpcyAnZXhjJwotICAgICBwYXNzCi0KLVlvdSBjYW4gZ2V0IG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJhaXNlZCBleGNlcHRpb24gZnJvbQotOmZ1bmM6YHN5cy5leGNfaW5mb2AgdGhhbiBzaW1wbHkgdGhlIGN1cnJlbnQgZXhjZXB0aW9uIGluc3RhbmNlLCBidXQgeW91IG1vc3QKLWxpa2VseSBkb24ndCBuZWVkIGl0LgotCi0uLiBub3RlOjoKLSAgIEluIFB5dGhvbiAzLCB0aGUgdHJhY2ViYWNrIGlzIGF0dGFjaGVkIHRvIHRoZSBleGNlcHRpb24gaW5zdGFuY2UKLSAgIHRocm91Z2ggdGhlIGBgX190cmFjZWJhY2tfX2BgIGF0dHJpYnV0ZS4gSWYgdGhlIGluc3RhbmNlIGlzIHNhdmVkIGluCi0gICBhIGxvY2FsIHZhcmlhYmxlIHRoYXQgcGVyc2lzdHMgb3V0c2lkZSBvZiB0aGUgYGBleGNlcHRgYCBibG9jaywgdGhlCi0gICB0cmFjZWJhY2sgd2lsbCBjcmVhdGUgYSByZWZlcmVuY2UgY3ljbGUgd2l0aCB0aGUgY3VycmVudCBmcmFtZSBhbmQgaXRzCi0gICBkaWN0aW9uYXJ5IG9mIGxvY2FsIHZhcmlhYmxlcy4gIFRoaXMgd2lsbCBkZWxheSByZWNsYWltaW5nIGRlYWQKLSAgIHJlc291cmNlcyB1bnRpbCB0aGUgbmV4dCBjeWNsaWMgOnRlcm06YGdhcmJhZ2UgY29sbGVjdGlvbmAgcGFzcy4KLQotICAgSW4gUHl0aG9uIDIsIHRoaXMgcHJvYmxlbSBvbmx5IG9jY3VycyBpZiB5b3Ugc2F2ZSB0aGUgdHJhY2ViYWNrIGl0c2VsZgotICAgKGUuZy4gdGhlIHRoaXJkIGVsZW1lbnQgb2YgdGhlIHR1cGxlIHJldHVybmVkIGJ5IDpmdW5jOmBzeXMuZXhjX2luZm9gKQotICAgaW4gYSB2YXJpYWJsZS4KK0lmIHlvdSBoYXZlIFB5dGhvbiAzIGNvZGUgYW5kIGhhdmUgbGl0dGxlIGludGVyZXN0IGluIHN1cHBvcnRpbmcgUHl0aG9uIDIgeW91CitjYW4gdXNlIDN0bzJfIHRvIHRyYW5zbGF0ZSBmcm9tIFB5dGhvbiAzIGNvZGUgdG8gUHl0aG9uIDIgY29kZS4gVGhpcyBpcyBvbmx5CityZWNvbW1lbmRlZCBpZiB5b3UgZG9uJ3QgcGxhbiB0byBoZWF2aWx5IHN1cHBvcnQgUHl0aG9uIDIgdXNlcnMuIE90aGVyd2lzZQord3JpdGUgeW91ciBjb2RlIGZvciBQeXRob24gMyBhbmQgdGhlbiBiYWNrcG9ydCBhcyBmYXIgYmFjayBhcyB5b3Ugd2FudC4gVGhpcworaXMgdHlwaWNhbGx5IGVhc2llciB0aGFuIGdvaW5nIGZyb20gUHl0aG9uIDIgdG8gMyBhcyB5b3Ugd2lsbCBoYXZlIHdvcmtlZCBvdXQKK2FueSBkaWZmaWN1bHRpZXMgd2l0aCBlLmcuIGJ5dGVzL3N0cmluZ3MsIGV0Yy4KIAogCiBPdGhlciBSZXNvdXJjZXMKQEAgLTY4NywxNyArNTg1LDQxIEBACiAKIFRoZSBhdXRob3JzIG9mIHRoZSBmb2xsb3dpbmcgYmxvZyBwb3N0cywgd2lraSBwYWdlcywgYW5kIGJvb2tzIGRlc2VydmUgc3BlY2lhbAogdGhhbmtzIGZvciBtYWtpbmcgcHVibGljIHRoZWlyIHRpcHMgZm9yIHBvcnRpbmcgUHl0aG9uIDIgY29kZSB0byBQeXRob24gMyAoYW5kCi10aHVzIGhlbHBpbmcgcHJvdmlkZSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBkb2N1bWVudCk6Cit0aHVzIGhlbHBpbmcgcHJvdmlkZSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBkb2N1bWVudCBhbmQgaXRzIHZhcmlvdXMgcmV2aXNpb25zCitvdmVyIHRoZSB5ZWFycyk6CiAKKyogaHR0cDovL3dpa2kucHl0aG9uLm9yZy9tb2luL1BvcnRpbmdQeXRob25Ub1B5M2sKICogaHR0cDovL3B5dGhvbjNwb3J0aW5nLmNvbS8KICogaHR0cDovL2RvY3MucHl0aG9uc3ByaW50cy5jb20vcHl0aG9uM19wb3J0aW5nL3B5LXBvcnRpbmcuaHRtbAogKiBodHRwOi8vdGVjaHNwb3Quenp6ZWVrLm9yZy8yMDExLzAxLzI0L3p6emVlay1zLWd1aWRlLXRvLXB5dGhvbi0zLXBvcnRpbmcvCiAqIGh0dHA6Ly9kYWJlYXouYmxvZ3Nwb3QuY29tLzIwMTEvMDEvcG9ydGluZy1weTY1LWFuZC1teS1zdXBlcmJvYXJkLXRvLmh0bWwKICogaHR0cDovL2x1Y3Vtci5wb2Nvby5vcmcvMjAxMS8xLzIyL2ZvcndhcmRzLWNvbXBhdGlibGUtcHl0aG9uLwogKiBodHRwOi8vbHVjdW1yLnBvY29vLm9yZy8yMDEwLzIvMTEvcG9ydGluZy10by1weXRob24tMy1hLWd1aWRlLwotKiBodHRwOi8vd2lraS5weXRob24ub3JnL21vaW4vUG9ydGluZ1B5dGhvblRvUHkzaworKiBodHRwczovL3dpa2kudWJ1bnR1LmNvbS9QeXRob24vMwogCiBJZiB5b3UgZmVlbCB0aGVyZSBpcyBzb21ldGhpbmcgbWlzc2luZyBmcm9tIHRoaXMgZG9jdW1lbnQgdGhhdCBzaG91bGQgYmUgYWRkZWQsCiBwbGVhc2UgZW1haWwgdGhlIHB5dGhvbi1wb3J0aW5nXyBtYWlsaW5nIGxpc3QuCiAKKworCisuLiBfMnRvMzogaHR0cDovL2RvY3MucHl0aG9uLm9yZy8yL2xpYnJhcnkvMnRvMy5odG1sCisuLiBfM3RvMjogaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaS8zdG8yCisuLiBfQ2hlZXNlc2hvcDogUHlQSV8KKy4uIF9jb3ZlcmFnZTogaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaS9jb3ZlcmFnZQorLi4gX2Z1dHVyZTogaHR0cDovL3B5dGhvbi1mdXR1cmUub3JnLworLi4gX21vZGVybml6ZTogaHR0cHM6Ly9naXRodWIuY29tL21pdHN1aGlrby9weXRob24tbW9kZXJuaXplCisuLiBfUG9ydGluZyB0byBQeXRob24gMzogaHR0cDovL3B5dGhvbjNwb3J0aW5nLmNvbS8KKy4uIF9QeVBJOiBodHRwOi8vcHlwaS5weXRob24ub3JnLworLi4gX1B5dGhvbiAyLjI6IGh0dHA6Ly93d3cucHl0aG9uLm9yZy8yLjIueAorLi4gX1B5dGhvbiAyLjU6IGh0dHA6Ly93d3cucHl0aG9uLm9yZy8yLjUueAorLi4gX1B5dGhvbiAyLjY6IGh0dHA6Ly93d3cucHl0aG9uLm9yZy8yLjYueAorLi4gX1B5dGhvbiAyLjc6IGh0dHA6Ly93d3cucHl0aG9uLm9yZy8yLjcueAorLi4gX1B5dGhvbiAyLjU6IGh0dHA6Ly93d3cucHl0aG9uLm9yZy8yLjUueAorLi4gX1B5dGhvbiAzLjM6IGh0dHA6Ly93d3cucHl0aG9uLm9yZy8zLjMueAorLi4gX1B5dGhvbiAzIFBhY2thZ2VzOiBodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpPzphY3Rpb249YnJvd3NlJmM9NTMzJnNob3c9YWxsCisuLiBfUHl0aG9uIDMgUSAmIEE6IGh0dHA6Ly9uY29naGxhbi1kZXZzLXB5dGhvbi1ub3Rlcy5yZWFkdGhlZG9jcy5vcmcvZW4vbGF0ZXN0L3B5dGhvbjMvcXVlc3Rpb25zX2FuZF9hbnN3ZXJzLmh0bWwKIC4uIF9weXRob24tcG9ydGluZzogaHR0cDovL21haWwucHl0aG9uLm9yZy9tYWlsbWFuL2xpc3RpbmZvL3B5dGhvbi1wb3J0aW5nCisuLiBfc2l4OiBodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpL3NpeAorLi4gX3RveDogaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaS90b3gKKy4uIF90cm92ZSBjbGFzc2lmaWVyczogaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaT8lM0FhY3Rpb249bGlzdF9jbGFzc2lmaWVycworCmRpZmYgLS1naXQgYS9Eb2MvaG93dG8vcmVnZXgucnN0IGIvRG9jL2hvd3RvL3JlZ2V4LnJzdAppbmRleCAxNTIzYzQ4Li4yZjU1MmUzIDEwMDY0NAotLS0gYS9Eb2MvaG93dG8vcmVnZXgucnN0CisrKyBiL0RvYy9ob3d0by9yZWdleC5yc3QKQEAgLTI2NSw3ICsyNjUsNyBAQAogCiAgICA+Pj4gaW1wb3J0IHJlCiAgICA+Pj4gcCA9IHJlLmNvbXBpbGUoJ2FiKicpCi0gICA+Pj4gcHJpbnQgcAorICAgPj4+IHAgICNkb2N0ZXN0OiArRUxMSVBTSVMKICAgIDxfc3JlLlNSRV9QYXR0ZXJuIG9iamVjdCBhdCAweC4uLj4KIAogOmZ1bmM6YHJlLmNvbXBpbGVgIGFsc28gYWNjZXB0cyBhbiBvcHRpb25hbCAqZmxhZ3MqIGFyZ3VtZW50LCB1c2VkIHRvIGVuYWJsZQpAQCAtMzU5LDEzICszNTksMTMgQEAKICstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAKIDptZXRoOmBtYXRjaGAgYW5kIDptZXRoOmBzZWFyY2hgIHJldHVybiBgYE5vbmVgYCBpZiBubyBtYXRjaCBjYW4gYmUgZm91bmQuICBJZgotdGhleSdyZSBzdWNjZXNzZnVsLCBhIGBgTWF0Y2hPYmplY3RgYCBpbnN0YW5jZSBpcyByZXR1cm5lZCwgY29udGFpbmluZwotaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1hdGNoOiB3aGVyZSBpdCBzdGFydHMgYW5kIGVuZHMsIHRoZSBzdWJzdHJpbmcgaXQgbWF0Y2hlZCwKLWFuZCBtb3JlLgordGhleSdyZSBzdWNjZXNzZnVsLCBhIDpyZWY6YG1hdGNoIG9iamVjdCA8bWF0Y2gtb2JqZWN0cz5gIGluc3RhbmNlIGlzIHJldHVybmVkLAorY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWF0Y2g6IHdoZXJlIGl0IHN0YXJ0cyBhbmQgZW5kcywgdGhlIHN1YnN0cmluZworaXQgbWF0Y2hlZCwgYW5kIG1vcmUuCiAKIFlvdSBjYW4gbGVhcm4gYWJvdXQgdGhpcyBieSBpbnRlcmFjdGl2ZWx5IGV4cGVyaW1lbnRpbmcgd2l0aCB0aGUgOm1vZDpgcmVgCiBtb2R1bGUuICBJZiB5b3UgaGF2ZSBUa2ludGVyIGF2YWlsYWJsZSwgeW91IG1heSBhbHNvIHdhbnQgdG8gbG9vayBhdAotOmZpbGU6YFRvb2xzL3NjcmlwdHMvcmVkZW1vLnB5YCwgYSBkZW1vbnN0cmF0aW9uIHByb2dyYW0gaW5jbHVkZWQgd2l0aCB0aGUKKzpzb3VyY2U6YFRvb2xzL3NjcmlwdHMvcmVkZW1vLnB5YCwgYSBkZW1vbnN0cmF0aW9uIHByb2dyYW0gaW5jbHVkZWQgd2l0aCB0aGUKIFB5dGhvbiBkaXN0cmlidXRpb24uICBJdCBhbGxvd3MgeW91IHRvIGVudGVyIFJFcyBhbmQgc3RyaW5ncywgYW5kIGRpc3BsYXlzCiB3aGV0aGVyIHRoZSBSRSBtYXRjaGVzIG9yIGZhaWxzLiA6ZmlsZTpgcmVkZW1vLnB5YCBjYW4gYmUgcXVpdGUgdXNlZnVsIHdoZW4KIHRyeWluZyB0byBkZWJ1ZyBhIGNvbXBsaWNhdGVkIFJFLiAgUGhpbCBTY2h3YXJ0eidzIGBLb2RvcwpAQCAtMzc4LDcgKzM3OCw3IEBACiAgICBQeXRob24gMi4yLjIgKCMxLCBGZWIgMTAgMjAwMywgMTI6NTc6MDEpCiAgICA+Pj4gaW1wb3J0IHJlCiAgICA+Pj4gcCA9IHJlLmNvbXBpbGUoJ1thLXpdKycpCi0gICA+Pj4gcAorICAgPj4+IHAgICNkb2N0ZXN0OiArRUxMSVBTSVMKICAgIDxfc3JlLlNSRV9QYXR0ZXJuIG9iamVjdCBhdCAweC4uLj4KIAogTm93LCB5b3UgY2FuIHRyeSBtYXRjaGluZyB2YXJpb3VzIHN0cmluZ3MgYWdhaW5zdCB0aGUgUkUgYGBbYS16XStgYC4gIEFuIGVtcHR5CkBAIC0zOTIsMTYgKzM5MiwxNiBAQAogICAgTm9uZQogCiBOb3csIGxldCdzIHRyeSBpdCBvbiBhIHN0cmluZyB0aGF0IGl0IHNob3VsZCBtYXRjaCwgc3VjaCBhcyBgYHRlbXBvYGAuICBJbiB0aGlzCi1jYXNlLCA6bWV0aDpgbWF0Y2hgIHdpbGwgcmV0dXJuIGEgOmNsYXNzOmBNYXRjaE9iamVjdGAsIHNvIHlvdSBzaG91bGQgc3RvcmUgdGhlCi1yZXN1bHQgaW4gYSB2YXJpYWJsZSBmb3IgbGF0ZXIgdXNlLiA6OgorY2FzZSwgOm1ldGg6YG1hdGNoYCB3aWxsIHJldHVybiBhIDpyZWY6YG1hdGNoIG9iamVjdCA8bWF0Y2gtb2JqZWN0cz5gLCBzbyB5b3UKK3Nob3VsZCBzdG9yZSB0aGUgcmVzdWx0IGluIGEgdmFyaWFibGUgZm9yIGxhdGVyIHVzZS4gOjoKIAogICAgPj4+IG0gPSBwLm1hdGNoKCd0ZW1wbycpCi0gICA+Pj4gcHJpbnQgbQorICAgPj4+IG0gICNkb2N0ZXN0OiArRUxMSVBTSVMKICAgIDxfc3JlLlNSRV9NYXRjaCBvYmplY3QgYXQgMHguLi4+CiAKLU5vdyB5b3UgY2FuIHF1ZXJ5IHRoZSA6Y2xhc3M6YE1hdGNoT2JqZWN0YCBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1hdGNoaW5nCi1zdHJpbmcuICAgOmNsYXNzOmBNYXRjaE9iamVjdGAgaW5zdGFuY2VzIGFsc28gaGF2ZSBzZXZlcmFsIG1ldGhvZHMgYW5kCi1hdHRyaWJ1dGVzOyB0aGUgbW9zdCBpbXBvcnRhbnQgb25lcyBhcmU6CitOb3cgeW91IGNhbiBxdWVyeSB0aGUgOnJlZjpgbWF0Y2ggb2JqZWN0IDxtYXRjaC1vYmplY3RzPmAgZm9yIGluZm9ybWF0aW9uCithYm91dCB0aGUgbWF0Y2hpbmcgc3RyaW5nLiAgOnJlZjpgbWF0Y2ggb2JqZWN0IDxtYXRjaC1vYmplY3RzPmAgaW5zdGFuY2VzCithbHNvIGhhdmUgc2V2ZXJhbCBtZXRob2RzIGFuZCBhdHRyaWJ1dGVzOyB0aGUgbW9zdCBpbXBvcnRhbnQgb25lcyBhcmU6CiAKICstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiB8IE1ldGhvZC9BdHRyaWJ1dGUgfCBQdXJwb3NlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfApAQCAtNDM1LDE1ICs0MzUsMTYgQEAKIAogICAgPj4+IHByaW50IHAubWF0Y2goJzo6OiBtZXNzYWdlJykKICAgIE5vbmUKLSAgID4+PiBtID0gcC5zZWFyY2goJzo6OiBtZXNzYWdlJykgOyBwcmludCBtCisgICA+Pj4gbSA9IHAuc2VhcmNoKCc6OjogbWVzc2FnZScpOyBwcmludCBtICAjZG9jdGVzdDogK0VMTElQU0lTCiAgICA8X3NyZS5TUkVfTWF0Y2ggb2JqZWN0IGF0IDB4Li4uPgogICAgPj4+IG0uZ3JvdXAoKQogICAgJ21lc3NhZ2UnCiAgICA+Pj4gbS5zcGFuKCkKICAgICg0LCAxMSkKIAotSW4gYWN0dWFsIHByb2dyYW1zLCB0aGUgbW9zdCBjb21tb24gc3R5bGUgaXMgdG8gc3RvcmUgdGhlIDpjbGFzczpgTWF0Y2hPYmplY3RgCi1pbiBhIHZhcmlhYmxlLCBhbmQgdGhlbiBjaGVjayBpZiBpdCB3YXMgYGBOb25lYGAuICBUaGlzIHVzdWFsbHkgbG9va3MgbGlrZTo6CitJbiBhY3R1YWwgcHJvZ3JhbXMsIHRoZSBtb3N0IGNvbW1vbiBzdHlsZSBpcyB0byBzdG9yZSB0aGUKKzpyZWY6YG1hdGNoIG9iamVjdCA8bWF0Y2gtb2JqZWN0cz5gIGluIGEgdmFyaWFibGUsIGFuZCB0aGVuIGNoZWNrIGlmIGl0IHdhcworYGBOb25lYGAuICBUaGlzIHVzdWFsbHkgbG9va3MgbGlrZTo6CiAKICAgIHAgPSByZS5jb21waWxlKCAuLi4gKQogICAgbSA9IHAubWF0Y2goICdzdHJpbmcgZ29lcyBoZXJlJyApCkBAIC00NjAsMTIgKzQ2MSwxMiBAQAogICAgWycxMicsICcxMScsICcxMCddCiAKIDptZXRoOmBmaW5kYWxsYCBoYXMgdG8gY3JlYXRlIHRoZSBlbnRpcmUgbGlzdCBiZWZvcmUgaXQgY2FuIGJlIHJldHVybmVkIGFzIHRoZQotcmVzdWx0LiAgVGhlIDptZXRoOmBmaW5kaXRlcmAgbWV0aG9kIHJldHVybnMgYSBzZXF1ZW5jZSBvZiA6Y2xhc3M6YE1hdGNoT2JqZWN0YAotaW5zdGFuY2VzIGFzIGFuIDp0ZXJtOmBpdGVyYXRvcmAuIFsjXV8gOjoKK3Jlc3VsdC4gIFRoZSA6bWV0aDpgZmluZGl0ZXJgIG1ldGhvZCByZXR1cm5zIGEgc2VxdWVuY2Ugb2YKKzpyZWY6YG1hdGNoIG9iamVjdCA8bWF0Y2gtb2JqZWN0cz5gIGluc3RhbmNlcyBhcyBhbiA6dGVybTpgaXRlcmF0b3JgLiBbI11fIDo6CiAKICAgID4+PiBpdGVyYXRvciA9IHAuZmluZGl0ZXIoJzEyIGRydW1tZXJzIGRydW1taW5nLCAxMSAuLi4gMTAgLi4uJykKLSAgID4+PiBpdGVyYXRvcgotICAgPGNhbGxhYmxlLWl0ZXJhdG9yIG9iamVjdCBhdCAweDQwMTgzM2FjPgorICAgPj4+IGl0ZXJhdG9yICAjZG9jdGVzdDogK0VMTElQU0lTCisgICA8Y2FsbGFibGUtaXRlcmF0b3Igb2JqZWN0IGF0IDB4Li4uPgogICAgPj4+IGZvciBtYXRjaCBpbiBpdGVyYXRvcjoKICAgIC4uLiAgICAgcHJpbnQgbWF0Y2guc3BhbigpCiAgICAuLi4KQEAgLTQ4MiwxMSArNDgzLDExIEBACiA6ZnVuYzpgc2VhcmNoYCwgOmZ1bmM6YGZpbmRhbGxgLCA6ZnVuYzpgc3ViYCwgYW5kIHNvIGZvcnRoLiAgVGhlc2UgZnVuY3Rpb25zCiB0YWtlIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyB0aGUgY29ycmVzcG9uZGluZyBwYXR0ZXJuIG1ldGhvZCwgd2l0aAogdGhlIFJFIHN0cmluZyBhZGRlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQsIGFuZCBzdGlsbCByZXR1cm4gZWl0aGVyIGBgTm9uZWBgIG9yIGEKLTpjbGFzczpgTWF0Y2hPYmplY3RgIGluc3RhbmNlLiA6OgorOnJlZjpgbWF0Y2ggb2JqZWN0IDxtYXRjaC1vYmplY3RzPmAgaW5zdGFuY2UuIDo6CiAKICAgID4+PiBwcmludCByZS5tYXRjaChyJ0Zyb21ccysnLCAnRnJvbWFnZSBhbWsnKQogICAgTm9uZQotICAgPj4+IHJlLm1hdGNoKHInRnJvbVxzKycsICdGcm9tIGFtayBUaHUgTWF5IDE0IDE5OjEyOjEwIDE5OTgnKQorICAgPj4+IHJlLm1hdGNoKHInRnJvbVxzKycsICdGcm9tIGFtayBUaHUgTWF5IDE0IDE5OjEyOjEwIDE5OTgnKSAgI2RvY3Rlc3Q6ICtFTExJUFNJUwogICAgPF9zcmUuU1JFX01hdGNoIG9iamVjdCBhdCAweC4uLj4KIAogVW5kZXIgdGhlIGhvb2QsIHRoZXNlIGZ1bmN0aW9ucyBzaW1wbHkgY3JlYXRlIGEgcGF0dGVybiBvYmplY3QgZm9yIHlvdQpAQCAtNTAxLDcgKzUwMiw3IEBACiB0aGUgc2FtZSBvbmVzIGluIHNldmVyYWwgbG9jYXRpb25zLCB0aGVuIGl0IG1pZ2h0IGJlIHdvcnRod2hpbGUgdG8gY29sbGVjdCBhbGwKIHRoZSBkZWZpbml0aW9ucyBpbiBvbmUgcGxhY2UsIGluIGEgc2VjdGlvbiBvZiBjb2RlIHRoYXQgY29tcGlsZXMgYWxsIHRoZSBSRXMKIGFoZWFkIG9mIHRpbWUuICBUbyB0YWtlIGFuIGV4YW1wbGUgZnJvbSB0aGUgc3RhbmRhcmQgbGlicmFyeSwgaGVyZSdzIGFuIGV4dHJhY3QKLWZyb20gOmZpbGU6YHhtbGxpYi5weWA6OgorZnJvbSB0aGUgZGVwcmVjYXRlZCA6bW9kOmB4bWxsaWJgIG1vZHVsZTo6CiAKICAgIHJlZiA9IHJlLmNvbXBpbGUoIC4uLiApCiAgICBlbnRpdHlyZWYgPSByZS5jb21waWxlKCAuLi4gKQpAQCAtNjg3LDcgKzY4OCw3IEBACiAgICBGb3IgZXhhbXBsZSwgaWYgeW91IHdpc2ggdG8gbWF0Y2ggdGhlIHdvcmQgYGBGcm9tYGAgb25seSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEKICAgIGxpbmUsIHRoZSBSRSB0byB1c2UgaXMgYGBeRnJvbWBgLiA6OgogCi0gICAgICA+Pj4gcHJpbnQgcmUuc2VhcmNoKCdeRnJvbScsICdGcm9tIEhlcmUgdG8gRXRlcm5pdHknKQorICAgICAgPj4+IHByaW50IHJlLnNlYXJjaCgnXkZyb20nLCAnRnJvbSBIZXJlIHRvIEV0ZXJuaXR5JykgICNkb2N0ZXN0OiArRUxMSVBTSVMKICAgICAgIDxfc3JlLlNSRV9NYXRjaCBvYmplY3QgYXQgMHguLi4+CiAgICAgICA+Pj4gcHJpbnQgcmUuc2VhcmNoKCdeRnJvbScsICdSZWNpdGluZyBGcm9tIE1lbW9yeScpCiAgICAgICBOb25lCkBAIC02OTksMTEgKzcwMCwxMSBAQAogICAgTWF0Y2hlcyBhdCB0aGUgZW5kIG9mIGEgbGluZSwgd2hpY2ggaXMgZGVmaW5lZCBhcyBlaXRoZXIgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLAogICAgb3IgYW55IGxvY2F0aW9uIGZvbGxvd2VkIGJ5IGEgbmV3bGluZSBjaGFyYWN0ZXIuICAgICA6OgogCi0gICAgICA+Pj4gcHJpbnQgcmUuc2VhcmNoKCd9JCcsICd7YmxvY2t9JykKKyAgICAgID4+PiBwcmludCByZS5zZWFyY2goJ30kJywgJ3tibG9ja30nKSAgI2RvY3Rlc3Q6ICtFTExJUFNJUwogICAgICAgPF9zcmUuU1JFX01hdGNoIG9iamVjdCBhdCAweC4uLj4KICAgICAgID4+PiBwcmludCByZS5zZWFyY2goJ30kJywgJ3tibG9ja30gJykKICAgICAgIE5vbmUKLSAgICAgID4+PiBwcmludCByZS5zZWFyY2goJ30kJywgJ3tibG9ja31cbicpCisgICAgICA+Pj4gcHJpbnQgcmUuc2VhcmNoKCd9JCcsICd7YmxvY2t9XG4nKSAgI2RvY3Rlc3Q6ICtFTExJUFNJUwogICAgICAgPF9zcmUuU1JFX01hdGNoIG9iamVjdCBhdCAweC4uLj4KIAogICAgVG8gbWF0Y2ggYSBsaXRlcmFsIGBgJyQnYGAsIHVzZSBgYFwkYGAgb3IgZW5jbG9zZSBpdCBpbnNpZGUgYSBjaGFyYWN0ZXIgY2xhc3MsCkBAIC03MjgsNyArNzI5LDcgQEAKICAgIG1hdGNoIHdoZW4gaXQncyBjb250YWluZWQgaW5zaWRlIGFub3RoZXIgd29yZC4gOjoKIAogICAgICAgPj4+IHAgPSByZS5jb21waWxlKHInXGJjbGFzc1xiJykKLSAgICAgID4+PiBwcmludCBwLnNlYXJjaCgnbm8gY2xhc3MgYXQgYWxsJykKKyAgICAgID4+PiBwcmludCBwLnNlYXJjaCgnbm8gY2xhc3MgYXQgYWxsJykgICNkb2N0ZXN0OiArRUxMSVBTSVMKICAgICAgIDxfc3JlLlNSRV9NYXRjaCBvYmplY3QgYXQgMHguLi4+CiAgICAgICA+Pj4gcHJpbnQgcC5zZWFyY2goJ3RoZSBkZWNsYXNzaWZpZWQgYWxnb3JpdGhtJykKICAgICAgIE5vbmUKQEAgLTc0Niw3ICs3NDcsNyBAQAogICAgICAgPj4+IHAgPSByZS5jb21waWxlKCdcYmNsYXNzXGInKQogICAgICAgPj4+IHByaW50IHAuc2VhcmNoKCdubyBjbGFzcyBhdCBhbGwnKQogICAgICAgTm9uZQotICAgICAgPj4+IHByaW50IHAuc2VhcmNoKCdcYicgKyAnY2xhc3MnICsgJ1xiJykKKyAgICAgID4+PiBwcmludCBwLnNlYXJjaCgnXGInICsgJ2NsYXNzJyArICdcYicpICAjZG9jdGVzdDogK0VMTElQU0lTCiAgICAgICA8X3NyZS5TUkVfTWF0Y2ggb2JqZWN0IGF0IDB4Li4uPgogCiAgICBTZWNvbmQsIGluc2lkZSBhIGNoYXJhY3RlciBjbGFzcywgd2hlcmUgdGhlcmUncyBubyB1c2UgZm9yIHRoaXMgYXNzZXJ0aW9uLApAQCAtNzkxLDkgKzc5Miw5IEBACiBpbmRleCBvZiB0aGUgdGV4dCB0aGF0IHRoZXkgbWF0Y2g7IHRoaXMgY2FuIGJlIHJldHJpZXZlZCBieSBwYXNzaW5nIGFuIGFyZ3VtZW50CiB0byA6bWV0aDpgZ3JvdXBgLCA6bWV0aDpgc3RhcnRgLCA6bWV0aDpgZW5kYCwgYW5kIDptZXRoOmBzcGFuYC4gIEdyb3VwcyBhcmUKIG51bWJlcmVkIHN0YXJ0aW5nIHdpdGggMC4gIEdyb3VwIDAgaXMgYWx3YXlzIHByZXNlbnQ7IGl0J3MgdGhlIHdob2xlIFJFLCBzbwotOmNsYXNzOmBNYXRjaE9iamVjdGAgbWV0aG9kcyBhbGwgaGF2ZSBncm91cCAwIGFzIHRoZWlyIGRlZmF1bHQgYXJndW1lbnQuICBMYXRlcgotd2UnbGwgc2VlIGhvdyB0byBleHByZXNzIGdyb3VwcyB0aGF0IGRvbid0IGNhcHR1cmUgdGhlIHNwYW4gb2YgdGV4dCB0aGF0IHRoZXkKLW1hdGNoLiA6OgorOnJlZjpgbWF0Y2ggb2JqZWN0IDxtYXRjaC1vYmplY3RzPmAgbWV0aG9kcyBhbGwgaGF2ZSBncm91cCAwIGFzIHRoZWlyIGRlZmF1bHQKK2FyZ3VtZW50LiAgTGF0ZXIgd2UnbGwgc2VlIGhvdyB0byBleHByZXNzIGdyb3VwcyB0aGF0IGRvbid0IGNhcHR1cmUgdGhlIHNwYW4KK29mIHRleHQgdGhhdCB0aGV5IG1hdGNoLiA6OgogCiAgICA+Pj4gcCA9IHJlLmNvbXBpbGUoJyhhKWInKQogICAgPj4+IG0gPSBwLm1hdGNoKCdhYicpCkBAIC05MTMsMTAgKzkxNCwxMCBAQAogVGhlIHN5bnRheCBmb3IgYSBuYW1lZCBncm91cCBpcyBvbmUgb2YgdGhlIFB5dGhvbi1zcGVjaWZpYyBleHRlbnNpb25zOgogYGAoP1A8bmFtZT4uLi4pYGAuICAqbmFtZSogaXMsIG9idmlvdXNseSwgdGhlIG5hbWUgb2YgdGhlIGdyb3VwLiAgTmFtZWQgZ3JvdXBzCiBhbHNvIGJlaGF2ZSBleGFjdGx5IGxpa2UgY2FwdHVyaW5nIGdyb3VwcywgYW5kIGFkZGl0aW9uYWxseSBhc3NvY2lhdGUgYSBuYW1lCi13aXRoIGEgZ3JvdXAuICBUaGUgOmNsYXNzOmBNYXRjaE9iamVjdGAgbWV0aG9kcyB0aGF0IGRlYWwgd2l0aCBjYXB0dXJpbmcgZ3JvdXBzCi1hbGwgYWNjZXB0IGVpdGhlciBpbnRlZ2VycyB0aGF0IHJlZmVyIHRvIHRoZSBncm91cCBieSBudW1iZXIgb3Igc3RyaW5ncyB0aGF0Ci1jb250YWluIHRoZSBkZXNpcmVkIGdyb3VwJ3MgbmFtZS4gIE5hbWVkIGdyb3VwcyBhcmUgc3RpbGwgZ2l2ZW4gbnVtYmVycywgc28geW91Ci1jYW4gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYSBncm91cCBpbiB0d28gd2F5czo6Cit3aXRoIGEgZ3JvdXAuICBUaGUgOnJlZjpgbWF0Y2ggb2JqZWN0IDxtYXRjaC1vYmplY3RzPmAgbWV0aG9kcyB0aGF0IGRlYWwgd2l0aAorY2FwdHVyaW5nIGdyb3VwcyBhbGwgYWNjZXB0IGVpdGhlciBpbnRlZ2VycyB0aGF0IHJlZmVyIHRvIHRoZSBncm91cCBieSBudW1iZXIKK29yIHN0cmluZ3MgdGhhdCBjb250YWluIHRoZSBkZXNpcmVkIGdyb3VwJ3MgbmFtZS4gIE5hbWVkIGdyb3VwcyBhcmUgc3RpbGwKK2dpdmVuIG51bWJlcnMsIHNvIHlvdSBjYW4gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYSBncm91cCBpbiB0d28gd2F5czo6CiAKICAgID4+PiBwID0gcmUuY29tcGlsZShyJyg/UDx3b3JkPlxiXHcrXGIpJykKICAgID4+PiBtID0gcC5zZWFyY2goICcoKCgoIExvdHMgb2YgcHVuY3R1YXRpb24gKSkpJyApCkBAIC0xMTgwLDE2ICsxMTgxLDE2IEBACiAKICpyZXBsYWNlbWVudCogY2FuIGFsc28gYmUgYSBmdW5jdGlvbiwgd2hpY2ggZ2l2ZXMgeW91IGV2ZW4gbW9yZSBjb250cm9sLiAgSWYKICpyZXBsYWNlbWVudCogaXMgYSBmdW5jdGlvbiwgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZXZlcnkgbm9uLW92ZXJsYXBwaW5nCi1vY2N1cnJlbmNlIG9mICpwYXR0ZXJuKi4gIE9uIGVhY2ggY2FsbCwgdGhlIGZ1bmN0aW9uIGlzICBwYXNzZWQgYQotOmNsYXNzOmBNYXRjaE9iamVjdGAgYXJndW1lbnQgZm9yIHRoZSBtYXRjaCBhbmQgY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvCi1jb21wdXRlIHRoZSBkZXNpcmVkIHJlcGxhY2VtZW50IHN0cmluZyBhbmQgcmV0dXJuIGl0Lgorb2NjdXJyZW5jZSBvZiAqcGF0dGVybiouICBPbiBlYWNoIGNhbGwsIHRoZSBmdW5jdGlvbiBpcyBwYXNzZWQgYQorOnJlZjpgbWF0Y2ggb2JqZWN0IDxtYXRjaC1vYmplY3RzPmAgYXJndW1lbnQgZm9yIHRoZSBtYXRjaCBhbmQgY2FuIHVzZSB0aGlzCitpbmZvcm1hdGlvbiB0byBjb21wdXRlIHRoZSBkZXNpcmVkIHJlcGxhY2VtZW50IHN0cmluZyBhbmQgcmV0dXJuIGl0LgogCi1JbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIHRoZSByZXBsYWNlbWVudCBmdW5jdGlvbiB0cmFuc2xhdGVzICBkZWNpbWFscyBpbnRvCitJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIHRoZSByZXBsYWNlbWVudCBmdW5jdGlvbiB0cmFuc2xhdGVzIGRlY2ltYWxzIGludG8KIGhleGFkZWNpbWFsOjoKIAotICAgPj4+IGRlZiBoZXhyZXBsKCBtYXRjaCApOgorICAgPj4+IGRlZiBoZXhyZXBsKG1hdGNoKToKICAgIC4uLiAgICAgIlJldHVybiB0aGUgaGV4IHN0cmluZyBmb3IgYSBkZWNpbWFsIG51bWJlciIKLSAgIC4uLiAgICAgdmFsdWUgPSBpbnQoIG1hdGNoLmdyb3VwKCkgKQorICAgLi4uICAgICB2YWx1ZSA9IGludChtYXRjaC5ncm91cCgpKQogICAgLi4uICAgICByZXR1cm4gaGV4KHZhbHVlKQogICAgLi4uCiAgICA+Pj4gcCA9IHJlLmNvbXBpbGUocidcZCsnKQpkaWZmIC0tZ2l0IGEvRG9jL2hvd3RvL3NvY2tldHMucnN0IGIvRG9jL2hvd3RvL3NvY2tldHMucnN0CmluZGV4IGIwYTNmYTQuLmY4YWMzNDggMTAwNjQ0Ci0tLSBhL0RvYy9ob3d0by9zb2NrZXRzLnJzdAorKysgYi9Eb2MvaG93dG8vc29ja2V0cy5yc3QKQEAgLTEsMyArMSw1IEBACisuLiBfc29ja2V0LWhvd3RvOgorCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgIFNvY2tldCBQcm9ncmFtbWluZyBIT1dUTwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTcsMTIgKzE5LDYgQEAKIFNvY2tldHMKID09PT09PT0KIAotU29ja2V0cyBhcmUgdXNlZCBuZWFybHkgZXZlcnl3aGVyZSwgYnV0IGFyZSBvbmUgb2YgdGhlIG1vc3Qgc2V2ZXJlbHkKLW1pc3VuZGVyc3Rvb2QgdGVjaG5vbG9naWVzIGFyb3VuZC4gVGhpcyBpcyBhIDEwLDAwMCBmb290IG92ZXJ2aWV3IG9mIHNvY2tldHMuCi1JdCdzIG5vdCByZWFsbHkgYSB0dXRvcmlhbCAtIHlvdSdsbCBzdGlsbCBoYXZlIHdvcmsgdG8gZG8gaW4gZ2V0dGluZyB0aGluZ3MKLXdvcmtpbmcuIEl0IGRvZXNuJ3QgY292ZXIgdGhlIGZpbmUgcG9pbnRzIChhbmQgdGhlcmUgYXJlIGEgbG90IG9mIHRoZW0pLCBidXQgSQotaG9wZSBpdCB3aWxsIGdpdmUgeW91IGVub3VnaCBiYWNrZ3JvdW5kIHRvIGJlZ2luIHVzaW5nIHRoZW0gZGVjZW50bHkuCi0KIEknbSBvbmx5IGdvaW5nIHRvIHRhbGsgYWJvdXQgSU5FVCBzb2NrZXRzLCBidXQgdGhleSBhY2NvdW50IGZvciBhdCBsZWFzdCA5OSUgb2YKIHRoZSBzb2NrZXRzIGluIHVzZS4gQW5kIEknbGwgb25seSB0YWxrIGFib3V0IFNUUkVBTSBzb2NrZXRzIC0gdW5sZXNzIHlvdSByZWFsbHkKIGtub3cgd2hhdCB5b3UncmUgZG9pbmcgKGluIHdoaWNoIGNhc2UgdGhpcyBIT1dUTyBpc24ndCBmb3IgeW91ISksIHlvdSdsbCBnZXQKQEAgLTg2LDkgKzgyLDExIEBACiAgICBzZXJ2ZXJzb2NrZXQubGlzdGVuKDUpCiAKIEEgY291cGxlIHRoaW5ncyB0byBub3RpY2U6IHdlIHVzZWQgYGBzb2NrZXQuZ2V0aG9zdG5hbWUoKWBgIHNvIHRoYXQgdGhlIHNvY2tldAotd291bGQgYmUgdmlzaWJsZSB0byB0aGUgb3V0c2lkZSB3b3JsZC4gSWYgd2UgaGFkIHVzZWQgYGBzLmJpbmQoKCcnLCA4MCkpYGAgb3IKLWBgcy5iaW5kKCgnbG9jYWxob3N0JywgODApKWBgIG9yIGBgcy5iaW5kKCgnMTI3LjAuMC4xJywgODApKWBgIHdlIHdvdWxkIHN0aWxsCi1oYXZlIGEgInNlcnZlciIgc29ja2V0LCBidXQgb25lIHRoYXQgd2FzIG9ubHkgdmlzaWJsZSB3aXRoaW4gdGhlIHNhbWUgbWFjaGluZS4KK3dvdWxkIGJlIHZpc2libGUgdG8gdGhlIG91dHNpZGUgd29ybGQuICBJZiB3ZSBoYWQgdXNlZCBgYHMuYmluZCgoJ2xvY2FsaG9zdCcsCis4MCkpYGAgb3IgYGBzLmJpbmQoKCcxMjcuMC4wLjEnLCA4MCkpYGAgd2Ugd291bGQgc3RpbGwgaGF2ZSBhICJzZXJ2ZXIiIHNvY2tldCwKK2J1dCBvbmUgdGhhdCB3YXMgb25seSB2aXNpYmxlIHdpdGhpbiB0aGUgc2FtZSBtYWNoaW5lLiAgYGBzLmJpbmQoKCcnLCA4MCkpYGAKK3NwZWNpZmllcyB0aGF0IHRoZSBzb2NrZXQgaXMgcmVhY2hhYmxlIGJ5IGFueSBhZGRyZXNzIHRoZSBtYWNoaW5lIGhhcHBlbnMgdG8KK2hhdmUuCiAKIEEgc2Vjb25kIHRoaW5nIHRvIG5vdGU6IGxvdyBudW1iZXIgcG9ydHMgYXJlIHVzdWFsbHkgcmVzZXJ2ZWQgZm9yICJ3ZWxsIGtub3duIgogc2VydmljZXMgKEhUVFAsIFNOTVAgZXRjKS4gSWYgeW91J3JlIHBsYXlpbmcgYXJvdW5kLCB1c2UgYSBuaWNlIGhpZ2ggbnVtYmVyICg0CkBAIC0xNTQsNyArMTUyLDcgQEAKIHRoZXJlLCB5b3UgbWF5IHdhaXQgZm9yZXZlciBmb3IgdGhlIHJlcGx5LCBiZWNhdXNlIHRoZSByZXF1ZXN0IG1heSBzdGlsbCBiZSBpbgogeW91ciBvdXRwdXQgYnVmZmVyLgogCi1Ob3cgd2UgY29tZSB0aGUgbWFqb3Igc3R1bWJsaW5nIGJsb2NrIG9mIHNvY2tldHMgLSBgYHNlbmRgYCBhbmQgYGByZWN2YGAgb3BlcmF0ZQorTm93IHdlIGNvbWUgdG8gdGhlIG1ham9yIHN0dW1ibGluZyBibG9jayBvZiBzb2NrZXRzIC0gYGBzZW5kYGAgYW5kIGBgcmVjdmBgIG9wZXJhdGUKIG9uIHRoZSBuZXR3b3JrIGJ1ZmZlcnMuIFRoZXkgZG8gbm90IG5lY2Vzc2FyaWx5IGhhbmRsZSBhbGwgdGhlIGJ5dGVzIHlvdSBoYW5kCiB0aGVtIChvciBleHBlY3QgZnJvbSB0aGVtKSwgYmVjYXVzZSB0aGVpciBtYWpvciBmb2N1cyBpcyBoYW5kbGluZyB0aGUgbmV0d29yawogYnVmZmVycy4gSW4gZ2VuZXJhbCwgdGhleSByZXR1cm4gd2hlbiB0aGUgYXNzb2NpYXRlZCBuZXR3b3JrIGJ1ZmZlcnMgaGF2ZSBiZWVuCkBAIC0xNjUsNyArMTYzLDcgQEAKIFdoZW4gYSBgYHJlY3ZgYCByZXR1cm5zIDAgYnl0ZXMsIGl0IG1lYW5zIHRoZSBvdGhlciBzaWRlIGhhcyBjbG9zZWQgKG9yIGlzIGluCiB0aGUgcHJvY2VzcyBvZiBjbG9zaW5nKSB0aGUgY29ubmVjdGlvbi4gIFlvdSB3aWxsIG5vdCByZWNlaXZlIGFueSBtb3JlIGRhdGEgb24KIHRoaXMgY29ubmVjdGlvbi4gRXZlci4gIFlvdSBtYXkgYmUgYWJsZSB0byBzZW5kIGRhdGEgc3VjY2Vzc2Z1bGx5OyBJJ2xsIHRhbGsKLWFib3V0IHRoYXQgc29tZSBvbiB0aGUgbmV4dCBwYWdlLgorbW9yZSBhYm91dCB0aGlzIGxhdGVyLgogCiBBIHByb3RvY29sIGxpa2UgSFRUUCB1c2VzIGEgc29ja2V0IGZvciBvbmx5IG9uZSB0cmFuc2Zlci4gVGhlIGNsaWVudCBzZW5kcyBhCiByZXF1ZXN0LCB0aGVuIHJlYWRzIGEgcmVwbHkuICBUaGF0J3MgaXQuIFRoZSBzb2NrZXQgaXMgZGlzY2FyZGVkLiBUaGlzIG1lYW5zIHRoYXQKQEAgLTIwOSwxMyArMjA3LDE1IEBACiAgICAgICAgICAgICAgICB0b3RhbHNlbnQgPSB0b3RhbHNlbnQgKyBzZW50CiAKICAgICAgICBkZWYgbXlyZWNlaXZlKHNlbGYpOgotICAgICAgICAgICBtc2cgPSAnJwotICAgICAgICAgICB3aGlsZSBsZW4obXNnKSA8IE1TR0xFTjoKLSAgICAgICAgICAgICAgIGNodW5rID0gc2VsZi5zb2NrLnJlY3YoTVNHTEVOLWxlbihtc2cpKQorICAgICAgICAgICBjaHVua3MgPSBbXQorICAgICAgICAgICBieXRlc19yZWNkID0gMAorICAgICAgICAgICB3aGlsZSBieXRlc19yZWNkIDwgTVNHTEVOOgorICAgICAgICAgICAgICAgY2h1bmsgPSBzZWxmLnNvY2sucmVjdihtaW4oTVNHTEVOIC0gYnl0ZXNfcmVjZCwgMjA0OCkpCiAgICAgICAgICAgICAgICBpZiBjaHVuayA9PSAnJzoKICAgICAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoInNvY2tldCBjb25uZWN0aW9uIGJyb2tlbiIpCi0gICAgICAgICAgICAgICBtc2cgPSBtc2cgKyBjaHVuawotICAgICAgICAgICByZXR1cm4gbXNnCisgICAgICAgICAgICAgICBjaHVua3MuYXBwZW5kKGNodW5rKQorICAgICAgICAgICAgICAgYnl0ZXNfcmVjZCA9IGJ5dGVzX3JlY2QgKyBsZW4oY2h1bmspCisgICAgICAgICAgIHJldHVybiAnJy5qb2luKGNodW5rcykKIAogVGhlIHNlbmRpbmcgY29kZSBoZXJlIGlzIHVzYWJsZSBmb3IgYWxtb3N0IGFueSBtZXNzYWdpbmcgc2NoZW1lIC0gaW4gUHl0aG9uIHlvdQogc2VuZCBzdHJpbmdzLCBhbmQgeW91IGNhbiB1c2UgYGBsZW4oKWBgIHRvIGRldGVybWluZSBpdHMgbGVuZ3RoIChldmVuIGlmIGl0IGhhcwpkaWZmIC0tZ2l0IGEvRG9jL2hvd3RvL3NvcnRpbmcucnN0IGIvRG9jL2hvd3RvL3NvcnRpbmcucnN0CmluZGV4IGFjZGYzYWIuLjU2YjY1YjAgMTAwNjQ0Ci0tLSBhL0RvYy9ob3d0by9zb3J0aW5nLnJzdAorKysgYi9Eb2MvaG93dG8vc29ydGluZy5yc3QKQEAgLTEyNCw3ICsxMjQsNyBAQAogPT09PT09PT09PT09PT09PT09PT09PT09CiAKIEJvdGggOm1ldGg6YGxpc3Quc29ydGAgYW5kIDpmdW5jOmBzb3J0ZWRgIGFjY2VwdCBhICpyZXZlcnNlKiBwYXJhbWV0ZXIgd2l0aCBhCi1ib29sZWFuIHZhbHVlLiBUaGlzIGlzIHVzaW5nIHRvIGZsYWcgZGVzY2VuZGluZyBzb3J0cy4gRm9yIGV4YW1wbGUsIHRvIGdldCB0aGUKK2Jvb2xlYW4gdmFsdWUuIFRoaXMgaXMgdXNlZCB0byBmbGFnIGRlc2NlbmRpbmcgc29ydHMuIEZvciBleGFtcGxlLCB0byBnZXQgdGhlCiBzdHVkZW50IGRhdGEgaW4gcmV2ZXJzZSAqYWdlKiBvcmRlcjoKIAogICAgID4+PiBzb3J0ZWQoc3R1ZGVudF90dXBsZXMsIGtleT1pdGVtZ2V0dGVyKDIpLCByZXZlcnNlPVRydWUpCkBAIC0yMTAsMTEgKzIxMCwxMSBAQAogYXJndW1lbnRzLiBJbnN0ZWFkLCBhbGwgb2YgdGhlIFB5Mi54IHZlcnNpb25zIHN1cHBvcnRlZCBhICpjbXAqIHBhcmFtZXRlciB0bwogaGFuZGxlIHVzZXIgc3BlY2lmaWVkIGNvbXBhcmlzb24gZnVuY3Rpb25zLgogCi1JbiBQeTMuMCwgdGhlICpjbXAqIHBhcmFtZXRlciB3YXMgcmVtb3ZlZCBlbnRpcmVseSAoYXMgcGFydCBvZiBhIGxhcmdlciBlZmZvcnQgdG8KK0luIFB5dGhvbiAzLCB0aGUgKmNtcCogcGFyYW1ldGVyIHdhcyByZW1vdmVkIGVudGlyZWx5IChhcyBwYXJ0IG9mIGEgbGFyZ2VyIGVmZm9ydCB0bwogc2ltcGxpZnkgYW5kIHVuaWZ5IHRoZSBsYW5ndWFnZSwgZWxpbWluYXRpbmcgdGhlIGNvbmZsaWN0IGJldHdlZW4gcmljaAogY29tcGFyaXNvbnMgYW5kIHRoZSA6bWV0aDpgX19jbXBfX2AgbWFnaWMgbWV0aG9kKS4KIAotSW4gUHkyLngsIHNvcnQgYWxsb3dlZCBhbiBvcHRpb25hbCBmdW5jdGlvbiB3aGljaCBjYW4gYmUgY2FsbGVkIGZvciBkb2luZyB0aGUKK0luIFB5dGhvbiAyLCA6bWV0aDpgfmxpc3Quc29ydGAgYWxsb3dlZCBhbiBvcHRpb25hbCBmdW5jdGlvbiB3aGljaCBjYW4gYmUgY2FsbGVkIGZvciBkb2luZyB0aGUKIGNvbXBhcmlzb25zLiBUaGF0IGZ1bmN0aW9uIHNob3VsZCB0YWtlIHR3byBhcmd1bWVudHMgdG8gYmUgY29tcGFyZWQgYW5kIHRoZW4KIHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlIGZvciBsZXNzLXRoYW4sIHJldHVybiB6ZXJvIGlmIHRoZXkgYXJlIGVxdWFsLCBvciByZXR1cm4KIGEgcG9zaXRpdmUgdmFsdWUgZm9yIGdyZWF0ZXItdGhhbi4gRm9yIGV4YW1wbGUsIHdlIGNhbiBkbzoKQEAgLTI3NiwxMSArMjc2LDE1IEBACiAgICAgPj4+IGRhdGEgPSBbKCdyZWQnLCAxKSwgKCdibHVlJywgMSksICgncmVkJywgMiksICgnYmx1ZScsIDIpXQogICAgID4+PiBhc3NlcnQgc29ydGVkKGRhdGEsIHJldmVyc2U9VHJ1ZSkgPT0gbGlzdChyZXZlcnNlZChzb3J0ZWQocmV2ZXJzZWQoZGF0YSkpKSkKIAotKiBUaGUgc29ydCByb3V0aW5lcyBhcmUgZ3VhcmFudGVlZCB0byB1c2UgOm1ldGg6YF9fbHRfX2Agd2hlbiBtYWtpbmcgY29tcGFyaXNvbnMKLSAgYmV0d2VlbiB0d28gb2JqZWN0cy4gU28sIGl0IGlzIGVhc3kgdG8gYWRkIGEgc3RhbmRhcmQgc29ydCBvcmRlciB0byBhIGNsYXNzIGJ5Ci0gIGRlZmluaW5nIGFuIDptZXRoOmBfX2x0X19gIG1ldGhvZDo6CisqIFRvIGNyZWF0ZSBhIHN0YW5kYXJkIHNvcnQgb3JkZXIgZm9yIGEgY2xhc3MsIGp1c3QgYWRkIHRoZSBhcHByb3ByaWF0ZSByaWNoCisgIGNvbXBhcmlzb24gbWV0aG9kczoKIAorICAgID4+PiBTdHVkZW50Ll9fZXFfXyA9IGxhbWJkYSBzZWxmLCBvdGhlcjogc2VsZi5hZ2UgPT0gb3RoZXIuYWdlCisgICAgPj4+IFN0dWRlbnQuX19uZV9fID0gbGFtYmRhIHNlbGYsIG90aGVyOiBzZWxmLmFnZSAhPSBvdGhlci5hZ2UKICAgICA+Pj4gU3R1ZGVudC5fX2x0X18gPSBsYW1iZGEgc2VsZiwgb3RoZXI6IHNlbGYuYWdlIDwgb3RoZXIuYWdlCisgICAgPj4+IFN0dWRlbnQuX19sZV9fID0gbGFtYmRhIHNlbGYsIG90aGVyOiBzZWxmLmFnZSA8PSBvdGhlci5hZ2UKKyAgICA+Pj4gU3R1ZGVudC5fX2d0X18gPSBsYW1iZGEgc2VsZiwgb3RoZXI6IHNlbGYuYWdlID4gb3RoZXIuYWdlCisgICAgPj4+IFN0dWRlbnQuX19nZV9fID0gbGFtYmRhIHNlbGYsIG90aGVyOiBzZWxmLmFnZSA+PSBvdGhlci5hZ2UKICAgICA+Pj4gc29ydGVkKHN0dWRlbnRfb2JqZWN0cykKICAgICBbKCdkYXZlJywgJ0InLCAxMCksICgnamFuZScsICdCJywgMTIpLCAoJ2pvaG4nLCAnQScsIDE1KV0KIApkaWZmIC0tZ2l0IGEvRG9jL2hvd3RvL3VuaWNvZGUucnN0IGIvRG9jL2hvd3RvL3VuaWNvZGUucnN0CmluZGV4IGZmM2M3MjEuLjI5N2U4N2UgMTAwNjQ0Ci0tLSBhL0RvYy9ob3d0by91bmljb2RlLnJzdAorKysgYi9Eb2MvaG93dG8vdW5pY29kZS5yc3QKQEAgLTYsOCArNiw4IEBACiAKIFRoaXMgSE9XVE8gZGlzY3Vzc2VzIFB5dGhvbiAyLngncyBzdXBwb3J0IGZvciBVbmljb2RlLCBhbmQgZXhwbGFpbnMKIHZhcmlvdXMgcHJvYmxlbXMgdGhhdCBwZW9wbGUgY29tbW9ubHkgZW5jb3VudGVyIHdoZW4gdHJ5aW5nIHRvIHdvcmsKLXdpdGggVW5pY29kZS4gIChUaGlzIEhPV1RPIGhhcyBub3QgeWV0IGJlZW4gdXBkYXRlZCB0byBjb3ZlciB0aGUgMy54Ci12ZXJzaW9ucyBvZiBQeXRob24uKQord2l0aCBVbmljb2RlLiAgRm9yIHRoZSBQeXRob24gMyB2ZXJzaW9uLCBzZWUKKzxodHRwOi8vZG9jcy5weXRob24ub3JnL3B5M2svaG93dG8vdW5pY29kZS5odG1sPi4KIAogSW50cm9kdWN0aW9uIHRvIFVuaWNvZGUKID09PT09PT09PT09PT09PT09PT09PT09CkBAIC00OSw3ICs0OSw3IEBACiAKIDI1NSBjaGFyYWN0ZXJzIGFyZW4ndCB2ZXJ5IG1hbnkuICBGb3IgZXhhbXBsZSwgeW91IGNhbid0IGZpdCBib3RoIHRoZSBhY2NlbnRlZAogY2hhcmFjdGVycyB1c2VkIGluIFdlc3Rlcm4gRXVyb3BlIGFuZCB0aGUgQ3lyaWxsaWMgYWxwaGFiZXQgdXNlZCBmb3IgUnVzc2lhbgotaW50byB0aGUgMTI4LTI1NSByYW5nZSBiZWNhdXNlIHRoZXJlIGFyZSBtb3JlIHRoYW4gMTI3IHN1Y2ggY2hhcmFjdGVycy4KK2ludG8gdGhlIDEyOC0yNTUgcmFuZ2UgYmVjYXVzZSB0aGVyZSBhcmUgbW9yZSB0aGFuIDEyOCBzdWNoIGNoYXJhY3RlcnMuCiAKIFlvdSBjb3VsZCB3cml0ZSBmaWxlcyB1c2luZyBkaWZmZXJlbnQgY29kZXMgKGFsbCB5b3VyIFJ1c3NpYW4gZmlsZXMgaW4gYSBjb2RpbmcKIHN5c3RlbSBjYWxsZWQgS09JOCwgYWxsIHlvdXIgRnJlbmNoIGZpbGVzIGluIGEgZGlmZmVyZW50IGNvZGluZyBzeXN0ZW0gY2FsbGVkCkBAIC0yNTMsMTEgKzI1MywxMSBAQAogICAgID4+PiBzID0gdW5pY29kZSgnYWJjZGVmJykKICAgICA+Pj4gdHlwZShzKQogICAgIDx0eXBlICd1bmljb2RlJz4KLSAgICA+Pj4gdW5pY29kZSgnYWJjZGVmJyArIGNocigyNTUpKQorICAgID4+PiB1bmljb2RlKCdhYmNkZWYnICsgY2hyKDI1NSkpICAgICNkb2N0ZXN0OiArTk9STUFMSVpFX1dISVRFU1BBQ0UKICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CisgICAgLi4uCiAgICAgVW5pY29kZURlY29kZUVycm9yOiAnYXNjaWknIGNvZGVjIGNhbid0IGRlY29kZSBieXRlIDB4ZmYgaW4gcG9zaXRpb24gNjoKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yZGluYWwgbm90IGluIHJhbmdlKDEyOCkKKyAgICBvcmRpbmFsIG5vdCBpbiByYW5nZSgxMjgpCiAKIFRoZSBgYGVycm9yc2BgIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgcmVzcG9uc2Ugd2hlbiB0aGUgaW5wdXQgc3RyaW5nIGNhbid0IGJlCiBjb252ZXJ0ZWQgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZydzIHJ1bGVzLiAgTGVnYWwgdmFsdWVzIGZvciB0aGlzIGFyZ3VtZW50IGFyZQpAQCAtMjY1LDExICsyNjUsMTEgQEAKICdSRVBMQUNFTUVOVCBDSEFSQUNURVInKSwgb3IgJ2lnbm9yZScgKGp1c3QgbGVhdmUgdGhlIGNoYXJhY3RlciBvdXQgb2YgdGhlCiBVbmljb2RlIHJlc3VsdCkuICBUaGUgZm9sbG93aW5nIGV4YW1wbGVzIHNob3cgdGhlIGRpZmZlcmVuY2VzOjoKIAotICAgID4+PiB1bmljb2RlKCdceDgwYWJjJywgZXJyb3JzPSdzdHJpY3QnKQorICAgID4+PiB1bmljb2RlKCdceDgwYWJjJywgZXJyb3JzPSdzdHJpY3QnKSAgICAgI2RvY3Rlc3Q6ICtOT1JNQUxJWkVfV0hJVEVTUEFDRQogICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KKyAgICAgICAgLi4uCiAgICAgVW5pY29kZURlY29kZUVycm9yOiAnYXNjaWknIGNvZGVjIGNhbid0IGRlY29kZSBieXRlIDB4ODAgaW4gcG9zaXRpb24gMDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yZGluYWwgbm90IGluIHJhbmdlKDEyOCkKKyAgICBvcmRpbmFsIG5vdCBpbiByYW5nZSgxMjgpCiAgICAgPj4+IHVuaWNvZGUoJ1x4ODBhYmMnLCBlcnJvcnM9J3JlcGxhY2UnKQogICAgIHUnXHVmZmZkYWJjJwogICAgID4+PiB1bmljb2RlKCdceDgwYWJjJywgZXJyb3JzPSdpZ25vcmUnKQpAQCAtMzEyLDEwICszMTIsMTEgQEAKIG9wZXJhdGlvbjsgUHl0aG9uJ3MgZGVmYXVsdCBBU0NJSSBlbmNvZGluZyB3aWxsIGJlIHVzZWQsIHNvIGNoYXJhY3RlcnMgZ3JlYXRlcgogdGhhbiAxMjcgd2lsbCBjYXVzZSBhbiBleGNlcHRpb246OgogCi0gICAgPj4+IHMuZmluZCgnV2FzXHg5ZicpCisgICAgPj4+IHMuZmluZCgnV2FzXHg5ZicpICAgICAgICAgICAgICAgICAgICNkb2N0ZXN0OiArTk9STUFMSVpFX1dISVRFU1BBQ0UKICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/Ci0gICAgVW5pY29kZURlY29kZUVycm9yOiAnYXNjaWknIGNvZGVjIGNhbid0IGRlY29kZSBieXRlIDB4OWYgaW4gcG9zaXRpb24gMzogb3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KQorICAgICAgICAuLi4KKyAgICBVbmljb2RlRGVjb2RlRXJyb3I6ICdhc2NpaScgY29kZWMgY2FuJ3QgZGVjb2RlIGJ5dGUgMHg5ZiBpbiBwb3NpdGlvbiAzOgorICAgIG9yZGluYWwgbm90IGluIHJhbmdlKDEyOCkKICAgICA+Pj4gcy5maW5kKHUnV2FzXHg5ZicpCiAgICAgLTEKIApAQCAtMzMzLDEwICszMzQsMTEgQEAKICAgICA+Pj4gdSA9IHVuaWNocig0MDk2MCkgKyB1J2FiY2QnICsgdW5pY2hyKDE5NzIpCiAgICAgPj4+IHUuZW5jb2RlKCd1dGYtOCcpCiAgICAgJ1x4ZWFceDgwXHg4MGFiY2RceGRlXHhiNCcKLSAgICA+Pj4gdS5lbmNvZGUoJ2FzY2lpJykKKyAgICA+Pj4gdS5lbmNvZGUoJ2FzY2lpJykgICAgICAgICAgICAgICAgICAgICAgICNkb2N0ZXN0OiArTk9STUFMSVpFX1dISVRFU1BBQ0UKICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/Ci0gICAgVW5pY29kZUVuY29kZUVycm9yOiAnYXNjaWknIGNvZGVjIGNhbid0IGVuY29kZSBjaGFyYWN0ZXIgJ1x1YTAwMCcgaW4gcG9zaXRpb24gMDogb3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KQorICAgICAgICAuLi4KKyAgICBVbmljb2RlRW5jb2RlRXJyb3I6ICdhc2NpaScgY29kZWMgY2FuJ3QgZW5jb2RlIGNoYXJhY3RlciB1J1x1YTAwMCcgaW4KKyAgICBwb3NpdGlvbiAwOiBvcmRpbmFsIG5vdCBpbiByYW5nZSgxMjgpCiAgICAgPj4+IHUuZW5jb2RlKCdhc2NpaScsICdpZ25vcmUnKQogICAgICdhYmNkJwogICAgID4+PiB1LmVuY29kZSgnYXNjaWknLCAncmVwbGFjZScpCkBAIC0zODQsOSArMzg2LDkgQEAKIDo6CiAKICAgICA+Pj4gcyA9IHUiYVx4YWNcdTEyMzRcdTIwYWNcVTAwMDA4MDAwIgotICAgICAgICAgICAgICAgXl5eXiB0d28tZGlnaXQgaGV4IGVzY2FwZQotICAgICAgICAgICAgICAgICAgIF5eXl5eXiBmb3VyLWRpZ2l0IFVuaWNvZGUgZXNjYXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXiBlaWdodC1kaWdpdCBVbmljb2RlIGVzY2FwZQorICAgIC4uLiAjICAgICAgXl5eXiB0d28tZGlnaXQgaGV4IGVzY2FwZQorICAgIC4uLiAjICAgICAgICAgIF5eXl5eXiBmb3VyLWRpZ2l0IFVuaWNvZGUgZXNjYXBlCisgICAgLi4uICMgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXiBlaWdodC1kaWdpdCBVbmljb2RlIGVzY2FwZQogICAgID4+PiBmb3IgYyBpbiBzOiAgcHJpbnQgb3JkKGMpLAogICAgIC4uLgogICAgIDk3IDE3MiA0NjYwIDgzNjQgMzI3NjgKZGlmZiAtLWdpdCBhL0RvYy9ob3d0by91cmxsaWIyLnJzdCBiL0RvYy9ob3d0by91cmxsaWIyLnJzdAppbmRleCA2YzgwYzc3Li5kMTNmMTc0IDEwMDY0NAotLS0gYS9Eb2MvaG93dG8vdXJsbGliMi5yc3QKKysrIGIvRG9jL2hvd3RvL3VybGxpYjIucnN0CkBAIC0xOCw3ICsxOCw3IEBACiAuLiBzaWRlYmFyOjogUmVsYXRlZCBBcnRpY2xlcwogCiAgICAgWW91IG1heSBhbHNvIGZpbmQgdXNlZnVsIHRoZSBmb2xsb3dpbmcgYXJ0aWNsZSBvbiBmZXRjaGluZyB3ZWIgcmVzb3VyY2VzCi0gICAgd2l0aCBQeXRob24gOgorICAgIHdpdGggUHl0aG9uOgogCiAgICAgKiBgQmFzaWMgQXV0aGVudGljYXRpb24gPGh0dHA6Ly93d3cudm9pZHNwYWNlLm9yZy51ay9weXRob24vYXJ0aWNsZXMvYXV0aGVudGljYXRpb24uc2h0bWw+YF8KIApAQCAtMTM0LDcgKzEzNCw3IEBACiAgICAgPj4+IGRhdGFbJ2xvY2F0aW9uJ10gPSAnTm9ydGhhbXB0b24nCiAgICAgPj4+IGRhdGFbJ2xhbmd1YWdlJ10gPSAnUHl0aG9uJwogICAgID4+PiB1cmxfdmFsdWVzID0gdXJsbGliLnVybGVuY29kZShkYXRhKQotICAgID4+PiBwcmludCB1cmxfdmFsdWVzCisgICAgPj4+IHByaW50IHVybF92YWx1ZXMgICMgVGhlIG9yZGVyIG1heSBkaWZmZXIuICNkb2N0ZXN0OiArU0tJUAogICAgIG5hbWU9U29tZWJvZHkrSGVyZSZsYW5ndWFnZT1QeXRob24mbG9jYXRpb249Tm9ydGhhbXB0b24KICAgICA+Pj4gdXJsID0gJ2h0dHA6Ly93d3cuZXhhbXBsZS5jb20vZXhhbXBsZS5jZ2knCiAgICAgPj4+IGZ1bGxfdXJsID0gdXJsICsgJz8nICsgdXJsX3ZhbHVlcwpAQCAtMTUwLDcgKzE1MCw3IEBACiB0byB5b3VyIEhUVFAgcmVxdWVzdC4KIAogU29tZSB3ZWJzaXRlcyBbI11fIGRpc2xpa2UgYmVpbmcgYnJvd3NlZCBieSBwcm9ncmFtcywgb3Igc2VuZCBkaWZmZXJlbnQgdmVyc2lvbnMKLXRvIGRpZmZlcmVudCBicm93c2VycyBbI11fIC4gQnkgZGVmYXVsdCB1cmxsaWIyIGlkZW50aWZpZXMgaXRzZWxmIGFzCit0byBkaWZmZXJlbnQgYnJvd3NlcnMgWyNdXy4gQnkgZGVmYXVsdCB1cmxsaWIyIGlkZW50aWZpZXMgaXRzZWxmIGFzCiBgYFB5dGhvbi11cmxsaWIveC55YGAgKHdoZXJlIGBgeGBgIGFuZCBgYHlgYCBhcmUgdGhlIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uCiBudW1iZXJzIG9mIHRoZSBQeXRob24gcmVsZWFzZSwKIGUuZy4gYGBQeXRob24tdXJsbGliLzIuNWBgKSwgd2hpY2ggbWF5IGNvbmZ1c2UgdGhlIHNpdGUsIG9yIGp1c3QgcGxhaW4KQEAgLTIwMSw5ICsyMDEsOSBAQAogCiAgICAgPj4+IHJlcSA9IHVybGxpYjIuUmVxdWVzdCgnaHR0cDovL3d3dy5wcmV0ZW5kX3NlcnZlci5vcmcnKQogICAgID4+PiB0cnk6IHVybGxpYjIudXJsb3BlbihyZXEpCi0gICAgPj4+IGV4Y2VwdCBVUkxFcnJvciwgZToKLSAgICA+Pj4gICAgcHJpbnQgZS5yZWFzb24KLSAgICA+Pj4KKyAgICAuLi4gZXhjZXB0IFVSTEVycm9yIGFzIGU6CisgICAgLi4uICAgIHByaW50IGUucmVhc29uICAgI2RvY3Rlc3Q6ICtTS0lQCisgICAgLi4uCiAgICAgKDQsICdnZXRhZGRyaW5mbyBmYWlsZWQnKQogCiAKQEAgLTMwOSwxOCArMzA5LDE4IEBACiAKICAgICA+Pj4gcmVxID0gdXJsbGliMi5SZXF1ZXN0KCdodHRwOi8vd3d3LnB5dGhvbi5vcmcvZmlzaC5odG1sJykKICAgICA+Pj4gdHJ5OgotICAgID4+PiAgICAgdXJsbGliMi51cmxvcGVuKHJlcSkKLSAgICA+Pj4gZXhjZXB0IEhUVFBFcnJvciwgZToKLSAgICA+Pj4gICAgIHByaW50IGUuY29kZQotICAgID4+PiAgICAgcHJpbnQgZS5yZWFkKCkKLSAgICA+Pj4KKyAgICAuLi4gICAgIHVybGxpYjIudXJsb3BlbihyZXEpCisgICAgLi4uIGV4Y2VwdCB1cmxsaWIyLkhUVFBFcnJvciBhcyBlOgorICAgIC4uLiAgICAgcHJpbnQgZS5jb2RlCisgICAgLi4uICAgICBwcmludCBlLnJlYWQoKSAjZG9jdGVzdDogK0VMTElQU0lTLCArTk9STUFMSVpFX1dISVRFU1BBQ0UKKyAgICAuLi4KICAgICA0MDQKLSAgICA8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLSAgICA8P3htbC1zdHlsZXNoZWV0IGhyZWY9Ii4vY3NzL2h0Mmh0bWwuY3NzIgotICAgICAgICB0eXBlPSJ0ZXh0L2NzcyI/PgotICAgIDxodG1sPjxoZWFkPjx0aXRsZT5FcnJvciA0MDQ6IEZpbGUgTm90IEZvdW5kPC90aXRsZT4KLSAgICAuLi4uLi4gZXRjLi4uCisgICAgPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+CisgICAgLi4uCisgICAgPHRpdGxlPlBhZ2UgTm90IEZvdW5kPC90aXRsZT4KKyAgICAuLi4KKwogCiBXcmFwcGluZyBpdCBVcAogLS0tLS0tLS0tLS0tLS0KQEAgLTMzOCwxMCArMzM4LDEwIEBACiAgICAgcmVxID0gUmVxdWVzdChzb21ldXJsKQogICAgIHRyeToKICAgICAgICAgcmVzcG9uc2UgPSB1cmxvcGVuKHJlcSkKLSAgICBleGNlcHQgSFRUUEVycm9yLCBlOgorICAgIGV4Y2VwdCBIVFRQRXJyb3IgYXMgZToKICAgICAgICAgcHJpbnQgJ1RoZSBzZXJ2ZXIgY291bGRuXCd0IGZ1bGZpbGwgdGhlIHJlcXVlc3QuJwogICAgICAgICBwcmludCAnRXJyb3IgY29kZTogJywgZS5jb2RlCi0gICAgZXhjZXB0IFVSTEVycm9yLCBlOgorICAgIGV4Y2VwdCBVUkxFcnJvciBhcyBlOgogICAgICAgICBwcmludCAnV2UgZmFpbGVkIHRvIHJlYWNoIGEgc2VydmVyLicKICAgICAgICAgcHJpbnQgJ1JlYXNvbjogJywgZS5yZWFzb24KICAgICBlbHNlOgpAQCAtMzYyLDcgKzM2Miw3IEBACiAgICAgcmVxID0gUmVxdWVzdChzb21ldXJsKQogICAgIHRyeToKICAgICAgICAgcmVzcG9uc2UgPSB1cmxvcGVuKHJlcSkKLSAgICBleGNlcHQgVVJMRXJyb3IsIGU6CisgICAgZXhjZXB0IFVSTEVycm9yIGFzIGU6CiAgICAgICAgIGlmIGhhc2F0dHIoZSwgJ3JlYXNvbicpOgogICAgICAgICAgICAgcHJpbnQgJ1dlIGZhaWxlZCB0byByZWFjaCBhIHNlcnZlci4nCiAgICAgICAgICAgICBwcmludCAnUmVhc29uOiAnLCBlLnJlYXNvbgpAQCAtNDM5LDEyICs0MzksMTIgQEAKIAogV2hlbiBhdXRoZW50aWNhdGlvbiBpcyByZXF1aXJlZCwgdGhlIHNlcnZlciBzZW5kcyBhIGhlYWRlciAoYXMgd2VsbCBhcyB0aGUgNDAxCiBlcnJvciBjb2RlKSByZXF1ZXN0aW5nIGF1dGhlbnRpY2F0aW9uLiAgVGhpcyBzcGVjaWZpZXMgdGhlIGF1dGhlbnRpY2F0aW9uIHNjaGVtZQotYW5kIGEgJ3JlYWxtJy4gVGhlIGhlYWRlciBsb29rcyBsaWtlIDogYGBXd3ctYXV0aGVudGljYXRlOiBTQ0hFTUUKK2FuZCBhICdyZWFsbScuIFRoZSBoZWFkZXIgbG9va3MgbGlrZTogYGBXV1ctQXV0aGVudGljYXRlOiBTQ0hFTUUKIHJlYWxtPSJSRUFMTSJgYC4KIAogZS5nLiA6OgogCi0gICAgV3d3LWF1dGhlbnRpY2F0ZTogQmFzaWMgcmVhbG09ImNQYW5lbCBVc2VycyIKKyAgICBXV1ctQXV0aGVudGljYXRlOiBCYXNpYyByZWFsbT0iY1BhbmVsIFVzZXJzIgogCiAKIFRoZSBjbGllbnQgc2hvdWxkIHRoZW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbmFtZSBhbmQgcGFzc3dvcmQKQEAgLTQ4OSw3ICs0ODksOCBAQAogCiAgICAgSW4gdGhlIGFib3ZlIGV4YW1wbGUgd2Ugb25seSBzdXBwbGllZCBvdXIgYGBIVFRQQmFzaWNBdXRoSGFuZGxlcmBgIHRvCiAgICAgYGBidWlsZF9vcGVuZXJgYC4gQnkgZGVmYXVsdCBvcGVuZXJzIGhhdmUgdGhlIGhhbmRsZXJzIGZvciBub3JtYWwgc2l0dWF0aW9ucwotICAgIC0tIGBgUHJveHlIYW5kbGVyYGAsIGBgVW5rbm93bkhhbmRsZXJgYCwgYGBIVFRQSGFuZGxlcmBgLAorICAgIC0tIGBgUHJveHlIYW5kbGVyYGAgKGlmIGEgcHJveHkgc2V0dGluZyBzdWNoIGFzIGFuIDplbnZ2YXI6YGh0dHBfcHJveHlgCisgICAgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0KSwgYGBVbmtub3duSGFuZGxlcmBgLCBgYEhUVFBIYW5kbGVyYGAsCiAgICAgYGBIVFRQRGVmYXVsdEVycm9ySGFuZGxlcmBgLCBgYEhUVFBSZWRpcmVjdEhhbmRsZXJgYCwgYGBGVFBIYW5kbGVyYGAsCiAgICAgYGBGaWxlSGFuZGxlcmBgLCBgYEhUVFBFcnJvclByb2Nlc3NvcmBgLgogCkBAIC01MDYsMTAgKzUwNywxMSBAQAogPT09PT09PQogCiAqKnVybGxpYjIqKiB3aWxsIGF1dG8tZGV0ZWN0IHlvdXIgcHJveHkgc2V0dGluZ3MgYW5kIHVzZSB0aG9zZS4gVGhpcyBpcyB0aHJvdWdoCi10aGUgYGBQcm94eUhhbmRsZXJgYCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBub3JtYWwgaGFuZGxlciBjaGFpbi4gTm9ybWFsbHkgdGhhdCdzCi1hIGdvb2QgdGhpbmcsIGJ1dCB0aGVyZSBhcmUgb2NjYXNpb25zIHdoZW4gaXQgbWF5IG5vdCBiZSBoZWxwZnVsIFsjXV8uIE9uZSB3YXkKLXRvIGRvIHRoaXMgaXMgdG8gc2V0dXAgb3VyIG93biBgYFByb3h5SGFuZGxlcmBgLCB3aXRoIG5vIHByb3hpZXMgZGVmaW5lZC4gVGhpcwotaXMgZG9uZSB1c2luZyBzaW1pbGFyIHN0ZXBzIHRvIHNldHRpbmcgdXAgYSBgQmFzaWMgQXV0aGVudGljYXRpb25gXyBoYW5kbGVyIDogOjoKK3RoZSBgYFByb3h5SGFuZGxlcmBgLCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBub3JtYWwgaGFuZGxlciBjaGFpbiB3aGVuIGEgcHJveHkKK3NldHRpbmcgaXMgZGV0ZWN0ZWQuICBOb3JtYWxseSB0aGF0J3MgYSBnb29kIHRoaW5nLCBidXQgdGhlcmUgYXJlIG9jY2FzaW9ucword2hlbiBpdCBtYXkgbm90IGJlIGhlbHBmdWwgWyNdXy4gT25lIHdheSB0byBkbyB0aGlzIGlzIHRvIHNldHVwIG91ciBvd24KK2BgUHJveHlIYW5kbGVyYGAsIHdpdGggbm8gcHJveGllcyBkZWZpbmVkLiBUaGlzIGlzIGRvbmUgdXNpbmcgc2ltaWxhciBzdGVwcyB0bworc2V0dGluZyB1cCBhIGBCYXNpYyBBdXRoZW50aWNhdGlvbmBfIGhhbmRsZXI6IDo6CiAKICAgICA+Pj4gcHJveHlfc3VwcG9ydCA9IHVybGxpYjIuUHJveHlIYW5kbGVyKHt9KQogICAgID4+PiBvcGVuZXIgPSB1cmxsaWIyLmJ1aWxkX29wZW5lcihwcm94eV9zdXBwb3J0KQpkaWZmIC0tZ2l0IGEvRG9jL2hvd3RvL3dlYnNlcnZlcnMucnN0IGIvRG9jL2hvd3RvL3dlYnNlcnZlcnMucnN0CmluZGV4IDQyY2RmZjguLmMzYjc5ZTQgMTAwNjQ0Ci0tLSBhL0RvYy9ob3d0by93ZWJzZXJ2ZXJzLnJzdAorKysgYi9Eb2MvaG93dG8vd2Vic2VydmVycy5yc3QKQEAgLTI3NCw3ICsyNzQsNyBAQAogRWFjaCB3ZWIgc2VydmVyIHJlcXVpcmVzIGEgc3BlY2lmaWMgbW9kdWxlLgogCiAqIEFwYWNoZSBoYXMgYm90aCBgbW9kX2Zhc3RjZ2kgPGh0dHA6Ly93d3cuZmFzdGNnaS5jb20vZHJ1cGFsLz5gXyBhbmQgYG1vZF9mY2dpZAotICA8aHR0cDovL2Zhc3RjZ2kuY29yZW1haWwuY24vPmBfLiAgYGBtb2RfZmFzdGNnaWBgIGlzIHRoZSBvcmlnaW5hbCBvbmUsIGJ1dCBpdAorICA8aHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvbW9kX2ZjZ2lkLz5gXy4gIGBgbW9kX2Zhc3RjZ2lgYCBpcyB0aGUgb3JpZ2luYWwgb25lLCBidXQgaXQKICAgaGFzIHNvbWUgbGljZW5zaW5nIGlzc3Vlcywgd2hpY2ggaXMgd2h5IGl0IGlzIHNvbWV0aW1lcyBjb25zaWRlcmVkIG5vbi1mcmVlLgogICBgYG1vZF9mY2dpZGBgIGlzIGEgc21hbGxlciwgY29tcGF0aWJsZSBhbHRlcm5hdGl2ZS4gIE9uZSBvZiB0aGVzZSBtb2R1bGVzIG5lZWRzCiAgIHRvIGJlIGxvYWRlZCBieSBBcGFjaGUuCkBAIC0zNjQsNyArMzY0LDcgQEAKIAogQSByZWFsbHkgZ3JlYXQgV1NHSSBmZWF0dXJlIGlzIG1pZGRsZXdhcmUuICBNaWRkbGV3YXJlIGlzIGEgbGF5ZXIgYXJvdW5kIHlvdXIKIHByb2dyYW0gd2hpY2ggY2FuIGFkZCB2YXJpb3VzIGZ1bmN0aW9uYWxpdHkgdG8gaXQuICBUaGVyZSBpcyBxdWl0ZSBhIGJpdCBvZgotYG1pZGRsZXdhcmUgPGh0dHA6Ly93c2dpLm9yZy93c2dpL01pZGRsZXdhcmVfYW5kX1V0aWxpdGllcz5gXyBhbHJlYWR5CitgbWlkZGxld2FyZSA8aHR0cDovL3d3dy53c2dpLm9yZy9lbi9sYXRlc3QvbGlicmFyaWVzLmh0bWw+YF8gYWxyZWFkeQogYXZhaWxhYmxlLiAgRm9yIGV4YW1wbGUsIGluc3RlYWQgb2Ygd3JpdGluZyB5b3VyIG93biBzZXNzaW9uIG1hbmFnZW1lbnQgKEhUVFAKIGlzIGEgc3RhdGVsZXNzIHByb3RvY29sLCBzbyB0byBhc3NvY2lhdGUgbXVsdGlwbGUgSFRUUCByZXF1ZXN0cyB3aXRoIGEgc2luZ2xlCiB1c2VyIHlvdXIgYXBwbGljYXRpb24gbXVzdCBjcmVhdGUgYW5kIG1hbmFnZSBzdWNoIHN0YXRlIHZpYSBhIHNlc3Npb24pLCB5b3UgY2FuCkBAIC0zOTUsOSArMzk1LDkgQEAKIAogLi4gc2VlYWxzbzo6CiAKLSAgIEEgZ29vZCBvdmVydmlldyBvZiBXU0dJLXJlbGF0ZWQgY29kZSBjYW4gYmUgZm91bmQgaW4gdGhlIGBXU0dJIHdpa2kKLSAgIDxodHRwOi8vd3NnaS5vcmcvd3NnaT5gXywgd2hpY2ggY29udGFpbnMgYW4gZXh0ZW5zaXZlIGxpc3Qgb2YgYFdTR0kgc2VydmVycwotICAgPGh0dHA6Ly93c2dpLm9yZy93c2dpL1NlcnZlcnM+YF8gd2hpY2ggY2FuIGJlIHVzZWQgYnkgKmFueSogYXBwbGljYXRpb24KKyAgIEEgZ29vZCBvdmVydmlldyBvZiBXU0dJLXJlbGF0ZWQgY29kZSBjYW4gYmUgZm91bmQgaW4gdGhlIGBXU0dJIGhvbWVwYWdlCisgICA8aHR0cDovL3d3dy53c2dpLm9yZy9lbi9sYXRlc3QvaW5kZXguaHRtbD5gXywgd2hpY2ggY29udGFpbnMgYW4gZXh0ZW5zaXZlIGxpc3Qgb2YgYFdTR0kgc2VydmVycworICAgPGh0dHA6Ly93d3cud3NnaS5vcmcvZW4vbGF0ZXN0L3NlcnZlcnMuaHRtbD5gXyB3aGljaCBjYW4gYmUgdXNlZCBieSAqYW55KiBhcHBsaWNhdGlvbgogICAgc3VwcG9ydGluZyBXU0dJLgogCiAgICBZb3UgbWlnaHQgYmUgaW50ZXJlc3RlZCBpbiBzb21lIFdTR0ktc3VwcG9ydGluZyBtb2R1bGVzIGFscmVhZHkgY29udGFpbmVkIGluCkBAIC02OTEsNyArNjkxLDcgQEAKIFRoZSBuZXdlc3QgdmVyc2lvbiBvZiBUdXJib0dlYXJzLCB2ZXJzaW9uIDIuMCwgbW92ZXMgZXZlbiBmdXJ0aGVyIGluIGRpcmVjdGlvbgogb2YgV1NHSSBzdXBwb3J0IGFuZCBhIGNvbXBvbmVudC1iYXNlZCBhcmNoaXRlY3R1cmUuICBUdXJib0dlYXJzIDIgaXMgYmFzZWQgb24KIHRoZSBXU0dJIHN0YWNrIG9mIGFub3RoZXIgcG9wdWxhciBjb21wb25lbnQtYmFzZWQgd2ViIGZyYW1ld29yaywgYFB5bG9ucwotPGh0dHA6Ly9weWxvbnNocS5jb20vPmBfLgorPGh0dHA6Ly93d3cucHlsb25zcHJvamVjdC5vcmcvPmBfLgogCiAKIFpvcGUKZGlmZiAtLWdpdCBhL0RvYy9pbmNsdWRlcy9lbWFpbC11bnBhY2sucHkgYi9Eb2MvaW5jbHVkZXMvZW1haWwtdW5wYWNrLnB5CmluZGV4IDhmOTlkZWQuLmE4ZjcxMmQgMTAwNjQ0Ci0tLSBhL0RvYy9pbmNsdWRlcy9lbWFpbC11bnBhY2sucHkKKysrIGIvRG9jL2luY2x1ZGVzL2VtYWlsLXVucGFjay5weQpAQCAtMzUsNyArMzUsNyBAQAogCiAgICAgdHJ5OgogICAgICAgICBvcy5ta2RpcihvcHRzLmRpcmVjdG9yeSkKLSAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICBleGNlcHQgT1NFcnJvciBhcyBlOgogICAgICAgICAjIElnbm9yZSBkaXJlY3RvcnkgZXhpc3RzIGVycm9yCiAgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUVYSVNUOgogICAgICAgICAgICAgcmFpc2UKZGlmZiAtLWdpdCBhL0RvYy9pbmNsdWRlcy9zcWxpdGUzL2NvbXBsZXRlX3N0YXRlbWVudC5weSBiL0RvYy9pbmNsdWRlcy9zcWxpdGUzL2NvbXBsZXRlX3N0YXRlbWVudC5weQppbmRleCAyMjUyNWUzLi43NmVhN2Y2IDEwMDY0NAotLS0gYS9Eb2MvaW5jbHVkZXMvc3FsaXRlMy9jb21wbGV0ZV9zdGF0ZW1lbnQucHkKKysrIGIvRG9jL2luY2x1ZGVzL3NxbGl0ZTMvY29tcGxldGVfc3RhdGVtZW50LnB5CkBAIC0yMyw3ICsyMyw3IEBACiAKICAgICAgICAgICAgIGlmIGJ1ZmZlci5sc3RyaXAoKS51cHBlcigpLnN0YXJ0c3dpdGgoIlNFTEVDVCIpOgogICAgICAgICAgICAgICAgIHByaW50IGN1ci5mZXRjaGFsbCgpCi0gICAgICAgIGV4Y2VwdCBzcWxpdGUzLkVycm9yLCBlOgorICAgICAgICBleGNlcHQgc3FsaXRlMy5FcnJvciBhcyBlOgogICAgICAgICAgICAgcHJpbnQgIkFuIGVycm9yIG9jY3VycmVkOiIsIGUuYXJnc1swXQogICAgICAgICBidWZmZXIgPSAiIgogCmRpZmYgLS1naXQgYS9Eb2MvaW5jbHVkZXMvc3FsaXRlMy9leGVjdXRlXzEucHkgYi9Eb2MvaW5jbHVkZXMvc3FsaXRlMy9leGVjdXRlXzEucHkKaW5kZXggZmIzNzg0Zi4uNzYzMTY3YyAxMDA2NDQKLS0tIGEvRG9jL2luY2x1ZGVzL3NxbGl0ZTMvZXhlY3V0ZV8xLnB5CisrKyBiL0RvYy9pbmNsdWRlcy9zcWxpdGUzL2V4ZWN1dGVfMS5weQpAQCAtMSwxMSArMSwxNiBAQAogaW1wb3J0IHNxbGl0ZTMKIAotY29uID0gc3FsaXRlMy5jb25uZWN0KCJteWRiIikKLQorY29uID0gc3FsaXRlMy5jb25uZWN0KCI6bWVtb3J5OiIpCiBjdXIgPSBjb24uY3Vyc29yKCkKK2N1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgcGVvcGxlIChuYW1lX2xhc3QsIGFnZSkiKQogCiB3aG8gPSAiWWVsdHNpbiIKIGFnZSA9IDcyCiAKLWN1ci5leGVjdXRlKCJzZWxlY3QgbmFtZV9sYXN0LCBhZ2UgZnJvbSBwZW9wbGUgd2hlcmUgbmFtZV9sYXN0PT8gYW5kIGFnZT0/IiwgKHdobywgYWdlKSkKKyMgVGhpcyBpcyB0aGUgcW1hcmsgc3R5bGU6CitjdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gcGVvcGxlIHZhbHVlcyAoPywgPykiLCAod2hvLCBhZ2UpKQorCisjIEFuZCB0aGlzIGlzIHRoZSBuYW1lZCBzdHlsZToKK2N1ci5leGVjdXRlKCJzZWxlY3QgKiBmcm9tIHBlb3BsZSB3aGVyZSBuYW1lX2xhc3Q9OndobyBhbmQgYWdlPTphZ2UiLCB7IndobyI6IHdobywgImFnZSI6IGFnZX0pCisKIHByaW50IGN1ci5mZXRjaG9uZSgpCmRpZmYgLS1naXQgYS9Eb2MvaW5jbHVkZXMvc3FsaXRlMy9leGVjdXRlXzIucHkgYi9Eb2MvaW5jbHVkZXMvc3FsaXRlMy9leGVjdXRlXzIucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNmM4OTQuLjAwMDAwMDAKLS0tIGEvRG9jL2luY2x1ZGVzL3NxbGl0ZTMvZXhlY3V0ZV8yLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotaW1wb3J0IHNxbGl0ZTMKLQotY29uID0gc3FsaXRlMy5jb25uZWN0KCJteWRiIikKLQotY3VyID0gY29uLmN1cnNvcigpCi0KLXdobyA9ICJZZWx0c2luIgotYWdlID0gNzIKLQotY3VyLmV4ZWN1dGUoInNlbGVjdCBuYW1lX2xhc3QsIGFnZSBmcm9tIHBlb3BsZSB3aGVyZSBuYW1lX2xhc3Q9OndobyBhbmQgYWdlPTphZ2UiLAotICAgIHsid2hvIjogd2hvLCAiYWdlIjogYWdlfSkKLXByaW50IGN1ci5mZXRjaG9uZSgpCmRpZmYgLS1naXQgYS9Eb2MvaW5jbHVkZXMvc3FsaXRlMy9leGVjdXRlbWFueV8yLnB5IGIvRG9jL2luY2x1ZGVzL3NxbGl0ZTMvZXhlY3V0ZW1hbnlfMi5weQppbmRleCAwNTg1N2MwLi4wYjEyNjg4IDEwMDY0NAotLS0gYS9Eb2MvaW5jbHVkZXMvc3FsaXRlMy9leGVjdXRlbWFueV8yLnB5CisrKyBiL0RvYy9pbmNsdWRlcy9zcWxpdGUzL2V4ZWN1dGVtYW55XzIucHkKQEAgLTEsOCArMSw4IEBACiBpbXBvcnQgc3FsaXRlMworaW1wb3J0IHN0cmluZwogCiBkZWYgY2hhcl9nZW5lcmF0b3IoKToKLSAgICBpbXBvcnQgc3RyaW5nCi0gICAgZm9yIGMgaW4gc3RyaW5nLmxldHRlcnNbOjI2XToKKyAgICBmb3IgYyBpbiBzdHJpbmcubG93ZXJjYXNlOgogICAgICAgICB5aWVsZCAoYywpCiAKIGNvbiA9IHNxbGl0ZTMuY29ubmVjdCgiOm1lbW9yeToiKQpkaWZmIC0tZ2l0IGEvRG9jL2luY2x1ZGVzL3NxbGl0ZTMvcm93Y2xhc3MucHkgYi9Eb2MvaW5jbHVkZXMvc3FsaXRlMy9yb3djbGFzcy5weQppbmRleCAzZmEwYjg3Li45MmI1YWQ2IDEwMDY0NAotLS0gYS9Eb2MvaW5jbHVkZXMvc3FsaXRlMy9yb3djbGFzcy5weQorKysgYi9Eb2MvaW5jbHVkZXMvc3FsaXRlMy9yb3djbGFzcy5weQpAQCAtMSwxMiArMSwxMiBAQAogaW1wb3J0IHNxbGl0ZTMKIAotY29uID0gc3FsaXRlMy5jb25uZWN0KCJteWRiIikKK2NvbiA9IHNxbGl0ZTMuY29ubmVjdCgiOm1lbW9yeToiKQogY29uLnJvd19mYWN0b3J5ID0gc3FsaXRlMy5Sb3cKIAogY3VyID0gY29uLmN1cnNvcigpCi1jdXIuZXhlY3V0ZSgic2VsZWN0IG5hbWVfbGFzdCwgYWdlIGZyb20gcGVvcGxlIikKK2N1ci5leGVjdXRlKCJzZWxlY3QgJ0pvaG4nIGFzIG5hbWUsIDQyIGFzIGFnZSIpCiBmb3Igcm93IGluIGN1cjoKLSAgICBhc3NlcnQgcm93WzBdID09IHJvd1sibmFtZV9sYXN0Il0KLSAgICBhc3NlcnQgcm93WyJuYW1lX2xhc3QiXSA9PSByb3dbIm5BbUVfbEFzVCJdCisgICAgYXNzZXJ0IHJvd1swXSA9PSByb3dbIm5hbWUiXQorICAgIGFzc2VydCByb3dbIm5hbWUiXSA9PSByb3dbIm5BbUUiXQogICAgIGFzc2VydCByb3dbMV0gPT0gcm93WyJhZ2UiXQogICAgIGFzc2VydCByb3dbMV0gPT0gcm93WyJBZ0UiXQpkaWZmIC0tZ2l0IGEvRG9jL2luY2x1ZGVzL3NxbGl0ZTMvc2hvcnRjdXRfbWV0aG9kcy5weSBiL0RvYy9pbmNsdWRlcy9zcWxpdGUzL3Nob3J0Y3V0X21ldGhvZHMucHkKaW5kZXggNzJlZDRiMy4uZTEyOGEzYiAxMDA2NDQKLS0tIGEvRG9jL2luY2x1ZGVzL3NxbGl0ZTMvc2hvcnRjdXRfbWV0aG9kcy5weQorKysgYi9Eb2MvaW5jbHVkZXMvc3FsaXRlMy9zaG9ydGN1dF9tZXRob2RzLnB5CkBAIC0xNyw1ICsxNyw0IEBACiBmb3Igcm93IGluIGNvbi5leGVjdXRlKCJzZWxlY3QgZmlyc3RuYW1lLCBsYXN0bmFtZSBmcm9tIHBlcnNvbiIpOgogICAgIHByaW50IHJvdwogCi0jIFVzaW5nIGEgZHVtbXkgV0hFUkUgY2xhdXNlIHRvIG5vdCBsZXQgU1FMaXRlIHRha2UgdGhlIHNob3J0Y3V0IHRhYmxlIGRlbGV0ZXMuCi1wcmludCAiSSBqdXN0IGRlbGV0ZWQiLCBjb24uZXhlY3V0ZSgiZGVsZXRlIGZyb20gcGVyc29uIHdoZXJlIDE9MSIpLnJvd2NvdW50LCAicm93cyIKK3ByaW50ICJJIGp1c3QgZGVsZXRlZCIsIGNvbi5leGVjdXRlKCJkZWxldGUgZnJvbSBwZXJzb24iKS5yb3djb3VudCwgInJvd3MiCmRpZmYgLS1naXQgYS9Eb2MvaW5jbHVkZXMvc3FsaXRlMy90ZXh0X2ZhY3RvcnkucHkgYi9Eb2MvaW5jbHVkZXMvc3FsaXRlMy90ZXh0X2ZhY3RvcnkucHkKaW5kZXggMTk1OTQ5OC4uNTc3Mzc4ZiAxMDA2NDQKLS0tIGEvRG9jL2luY2x1ZGVzL3NxbGl0ZTMvdGV4dF9mYWN0b3J5LnB5CisrKyBiL0RvYy9pbmNsdWRlcy9zcWxpdGUzL3RleHRfZmFjdG9yeS5weQpAQCAtMyw5ICszLDYgQEAKIGNvbiA9IHNxbGl0ZTMuY29ubmVjdCgiOm1lbW9yeToiKQogY3VyID0gY29uLmN1cnNvcigpCiAKLSMgQ3JlYXRlIHRoZSB0YWJsZQotY29uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBwZXJzb24obGFzdG5hbWUsIGZpcnN0bmFtZSkiKQotCiBBVVNUUklBID0gdSJceGQ2c3RlcnJlaWNoIgogCiAjIGJ5IGRlZmF1bHQsIHJvd3MgYXJlIHJldHVybmVkIGFzIFVuaWNvZGUKQEAgLTE3LDcgKzE0LDcgQEAKIGNvbi50ZXh0X2ZhY3RvcnkgPSBzdHIKIGN1ci5leGVjdXRlKCJzZWxlY3QgPyIsIChBVVNUUklBLCkpCiByb3cgPSBjdXIuZmV0Y2hvbmUoKQotYXNzZXJ0IHR5cGUocm93WzBdKSA9PSBzdHIKK2Fzc2VydCB0eXBlKHJvd1swXSkgaXMgc3RyCiAjIHRoZSBieXRlc3RyaW5ncyB3aWxsIGJlIGVuY29kZWQgaW4gVVRGLTgsIHVubGVzcyB5b3Ugc3RvcmVkIGdhcmJhZ2UgaW4gdGhlCiAjIGRhdGFiYXNlIC4uLgogYXNzZXJ0IHJvd1swXSA9PSBBVVNUUklBLmVuY29kZSgidXRmLTgiKQpAQCAtMjksMTUgKzI2LDE1IEBACiBjdXIuZXhlY3V0ZSgic2VsZWN0ID8iLCAoInRoaXMgaXMgbGF0aW4xIGFuZCB3b3VsZCBub3JtYWxseSBjcmVhdGUgZXJyb3JzIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgdSJceGU0XHhmNlx4ZmMiLmVuY29kZSgibGF0aW4xIiksKSkKIHJvdyA9IGN1ci5mZXRjaG9uZSgpCi1hc3NlcnQgdHlwZShyb3dbMF0pID09IHVuaWNvZGUKK2Fzc2VydCB0eXBlKHJvd1swXSkgaXMgdW5pY29kZQogCiAjIHNxbGl0ZTMgb2ZmZXJzIGEgYnVpbHQtaW4gb3B0aW1pemVkIHRleHRfZmFjdG9yeSB0aGF0IHdpbGwgcmV0dXJuIGJ5dGVzdHJpbmcKICMgb2JqZWN0cywgaWYgdGhlIGRhdGEgaXMgaW4gQVNDSUkgb25seSwgYW5kIG90aGVyd2lzZSByZXR1cm4gdW5pY29kZSBvYmplY3RzCiBjb24udGV4dF9mYWN0b3J5ID0gc3FsaXRlMy5PcHRpbWl6ZWRVbmljb2RlCiBjdXIuZXhlY3V0ZSgic2VsZWN0ID8iLCAoQVVTVFJJQSwpKQogcm93ID0gY3VyLmZldGNob25lKCkKLWFzc2VydCB0eXBlKHJvd1swXSkgPT0gdW5pY29kZQorYXNzZXJ0IHR5cGUocm93WzBdKSBpcyB1bmljb2RlCiAKIGN1ci5leGVjdXRlKCJzZWxlY3QgPyIsICgiR2VybWFueSIsKSkKIHJvdyA9IGN1ci5mZXRjaG9uZSgpCi1hc3NlcnQgdHlwZShyb3dbMF0pID09IHN0cgorYXNzZXJ0IHR5cGUocm93WzBdKSBpcyBzdHIKZGlmZiAtLWdpdCBhL0RvYy9pbnN0YWxsL2luZGV4LnJzdCBiL0RvYy9pbnN0YWxsL2luZGV4LnJzdAppbmRleCBhYmNlODhkLi5hZDkzOWFiIDEwMDY0NAotLS0gYS9Eb2MvaW5zdGFsbC9pbmRleC5yc3QKKysrIGIvRG9jL2luc3RhbGwvaW5kZXgucnN0CkBAIC03LDggKzcsNiBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogOkF1dGhvcjogR3JlZyBXYXJkCi06UmVsZWFzZTogfHZlcnNpb258Ci06RGF0ZTogfHRvZGF5fAogCiAuLiBUT0RPOiBGaWxsIGluIFhYWCBjb21tZW50cwogCkBAIC0yMiwxMiArMjAsMjAgQEAKICAgIEZpbmFsbHksIGl0IG1pZ2h0IGJlIHVzZWZ1bCB0byBpbmNsdWRlIGFsbCB0aGUgbWF0ZXJpYWwgZnJvbSBteSAiQ2FyZQogICAgYW5kIEZlZWRpbmcgb2YgYSBQeXRob24gSW5zdGFsbGF0aW9uIiB0YWxrIGluIGhlcmUgc29tZXdoZXJlLiAgWW93IQogCi0uLiB0b3BpYzo6IEFic3RyYWN0CitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgUHl0aG9uIERpc3RyaWJ1dGlvbiBVdGlsaXRpZXMgKCJEaXN0dXRpbHMiKSBmcm9tIHRoZQorZW5kLXVzZXIncyBwb2ludC1vZi12aWV3LCBkZXNjcmliaW5nIGhvdyB0byBleHRlbmQgdGhlIGNhcGFiaWxpdGllcyBvZiBhCitzdGFuZGFyZCBQeXRob24gaW5zdGFsbGF0aW9uIGJ5IGJ1aWxkaW5nIGFuZCBpbnN0YWxsaW5nIHRoaXJkLXBhcnR5IFB5dGhvbgorbW9kdWxlcyBhbmQgZXh0ZW5zaW9ucy4KIAotICAgVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIFB5dGhvbiBEaXN0cmlidXRpb24gVXRpbGl0aWVzICgiRGlzdHV0aWxzIikgZnJvbSB0aGUKLSAgIGVuZC11c2VyJ3MgcG9pbnQtb2YtdmlldywgZGVzY3JpYmluZyBob3cgdG8gZXh0ZW5kIHRoZSBjYXBhYmlsaXRpZXMgb2YgYQotICAgc3RhbmRhcmQgUHl0aG9uIGluc3RhbGxhdGlvbiBieSBidWlsZGluZyBhbmQgaW5zdGFsbGluZyB0aGlyZC1wYXJ0eSBQeXRob24KLSAgIG1vZHVsZXMgYW5kIGV4dGVuc2lvbnMuCisKKy4uIG5vdGU6OgorCisgICBUaGlzIGd1aWRlIG9ubHkgY292ZXJzIHRoZSBiYXNpYyB0b29scyBmb3IgaW5zdGFsbGluZyBleHRlbnNpb25zIHRoYXQgYXJlCisgICBwcm92aWRlZCBhcyBwYXJ0IG9mIHRoaXMgdmVyc2lvbiBvZiBQeXRob24uIFRoaXJkIHBhcnR5IHRvb2xzIG9mZmVyIGVhc2llcgorICAgdG8gdXNlIGFuZCBtb3JlIHNlY3VyZSBhbHRlcm5hdGl2ZXMuIFJlZmVyIHRvIHRoZQorICAgYHF1aWNrIHJlY29tbWVuZGF0aW9ucyBzZWN0aW9uCisgICA8aHR0cHM6Ly9weXRob24tcGFja2FnaW5nLXVzZXItZ3VpZGUucmVhZHRoZWRvY3Mub3JnL2VuL2xhdGVzdC9jdXJyZW50Lmh0bWw+YF9fCisgICBpbiB0aGUgUHl0aG9uIFBhY2thZ2luZyBVc2VyIEd1aWRlIGZvciBtb3JlIGluZm9ybWF0aW9uLgogCiAKIC4uIF9pbnN0LWludHJvOgpAQCAtNTIsNyArNTgsOSBAQAogZG9jdW1lbnQ7IHRoZXJlIHdpbGwgYmUgc29tZSBicmllZiBmb3JheXMgaW50byB1c2luZyBQeXRob24ncyBpbnRlcmFjdGl2ZSBtb2RlCiB0byBleHBsb3JlIHlvdXIgaW5zdGFsbGF0aW9uLCBidXQgdGhhdCdzIGl0LiAgSWYgeW91J3JlIGxvb2tpbmcgZm9yIGluZm9ybWF0aW9uCiBvbiBob3cgdG8gZGlzdHJpYnV0ZSB5b3VyIG93biBQeXRob24gbW9kdWxlcyBzbyB0aGF0IG90aGVycyBtYXkgdXNlIHRoZW0sIHNlZQotdGhlIDpyZWY6YGRpc3R1dGlscy1pbmRleGAgbWFudWFsLgordGhlIDpyZWY6YGRpc3R1dGlscy1pbmRleGAgbWFudWFsLiAgOnJlZjpgZGVidWctc2V0dXAtc2NyaXB0YCBtYXkgYWxzbyBiZSBvZgoraW50ZXJlc3QuCisKIAogCiAuLiBfaW5zdC10cml2aWFsLWluc3RhbGw6CkBAIC0xOTEsNyArMTk5LDcgQEAKIHRvIGtlZXAgdGhlIHNvdXJjZSB0cmVlIHByaXN0aW5lLCB5b3UgY2FuIGNoYW5nZSB0aGUgYnVpbGQgZGlyZWN0b3J5IHdpdGggdGhlCiA6b3B0aW9uOmAtLWJ1aWxkLWJhc2VgIG9wdGlvbi4gRm9yIGV4YW1wbGU6OgogCi0gICBweXRob24gc2V0dXAucHkgYnVpbGQgLS1idWlsZC1iYXNlPS90bXAvcHlidWlsZC9mb28tMS4wCisgICBweXRob24gc2V0dXAucHkgYnVpbGQgLS1idWlsZC1iYXNlPS9wYXRoL3RvL3B5YnVpbGQvZm9vLTEuMAogCiAoT3IgeW91IGNvdWxkIGRvIHRoaXMgcGVybWFuZW50bHkgd2l0aCBhIGRpcmVjdGl2ZSBpbiB5b3VyIHN5c3RlbSBvciBwZXJzb25hbAogRGlzdHV0aWxzIGNvbmZpZ3VyYXRpb24gZmlsZTsgc2VlIHNlY3Rpb24gOnJlZjpgaW5zdC1jb25maWctZmlsZXNgLikgIE5vcm1hbGx5LCB0aGlzCkBAIC0yMzcsNiArMjQ1LDggQEAKIFVuaXgtYmFzZWQpLCBpdCBhbHNvIGRlcGVuZHMgb24gd2hldGhlciB0aGUgbW9kdWxlIGRpc3RyaWJ1dGlvbiBiZWluZyBpbnN0YWxsZWQKIGlzIHB1cmUgUHl0aG9uIG9yIGNvbnRhaW5zIGV4dGVuc2lvbnMgKCJub24tcHVyZSIpOgogCisuLiB0YWJ1bGFyY29sdW1uczo6IHxsfGx8bHxsfAorCiArLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKIHwgUGxhdGZvcm0gICAgICAgIHwgU3RhbmRhcmQgaW5zdGFsbGF0aW9uIGxvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgIHwgRGVmYXVsdCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgfAogKz09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT0rCkBAIC0xMDQyLDcgKzEwNTIsNyBAQAogZm9yIEJvcmxhbmQncyBDKyssIGJlY2F1c2UgdGhlcmUgaXMgbm8gcHJvZ3JhbSB0byBjb252ZXJ0IHRoZSBsaWJyYXJ5LiAgRmlyc3QKIHlvdSBoYXZlIHRvIGNyZWF0ZSBhIGxpc3Qgb2Ygc3ltYm9scyB3aGljaCB0aGUgUHl0aG9uIERMTCBleHBvcnRzLiAoWW91IGNhbiBmaW5kCiBhIGdvb2QgcHJvZ3JhbSBmb3IgdGhpcyB0YXNrIGF0Ci1odHRwOi8vd3d3LmVtbWVzdGVjaC5jb20vc29mdHdhcmUvcGV4cG9ydHMtMC40My9kb3dubG9hZF9wZXhwb3J0cy5odG1sKS4KK2h0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbWluZ3cvZmlsZXMvTWluR1cvRXh0ZW5zaW9uL3BleHBvcnRzLykuCiAKIC4uIEkgZG9uJ3QgdW5kZXJzdGFuZCB3aGF0IHRoZSBuZXh0IGxpbmUgbWVhbnMuIC0tYW1rCiAuLiAoaW5jbHVzaXZlIHRoZSByZWZlcmVuY2VzIG9uIGRhdGEgc3RydWN0dXJlcy4pCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS8ydG8zLnJzdCBiL0RvYy9saWJyYXJ5LzJ0bzMucnN0CmluZGV4IGJmYzFmMDIuLmE5Mjc1MTAgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5LzJ0bzMucnN0CisrKyBiL0RvYy9saWJyYXJ5LzJ0bzMucnN0CkBAIC0yMyw3ICsyMyw3IEBACiBhbHNvIGxvY2F0ZWQgaW4gdGhlIDpmaWxlOmBUb29scy9zY3JpcHRzYCBkaXJlY3Rvcnkgb2YgdGhlIFB5dGhvbiByb290LgogCiAydG8zJ3MgYmFzaWMgYXJndW1lbnRzIGFyZSBhIGxpc3Qgb2YgZmlsZXMgb3IgZGlyZWN0b3JpZXMgdG8gdHJhbnNmb3JtLiAgVGhlCi1kaXJlY3RvcmllcyBhcmUgdG8gcmVjdXJzaXZlbHkgdHJhdmVyc2VkIGZvciBQeXRob24gc291cmNlcy4KK2RpcmVjdG9yaWVzIGFyZSByZWN1cnNpdmVseSB0cmF2ZXJzZWQgZm9yIFB5dGhvbiBzb3VyY2VzLgogCiBIZXJlIGlzIGEgc2FtcGxlIFB5dGhvbiAyLnggc291cmNlIGZpbGUsIDpmaWxlOmBleGFtcGxlLnB5YDo6CiAKQEAgLTk0LDYgKzk0LDM4IEBACiA6b3B0aW9uOmAtcGAgdG8gcnVuIGZpeGVycyBvbiBjb2RlIHRoYXQgYWxyZWFkeSBoYXMgaGFkIGl0cyBwcmludCBzdGF0ZW1lbnRzCiBjb252ZXJ0ZWQuCiAKK1RoZSA6b3B0aW9uOmAtb2Agb3IgOm9wdGlvbjpgLS1vdXRwdXQtZGlyYCBvcHRpb24gYWxsb3dzIHNwZWNpZmljYXRpb24gb2YgYW4KK2FsdGVybmF0ZSBkaXJlY3RvcnkgZm9yIHByb2Nlc3NlZCBvdXRwdXQgZmlsZXMgdG8gYmUgd3JpdHRlbiB0by4gIFRoZQorOm9wdGlvbjpgLW5gIGZsYWcgaXMgcmVxdWlyZWQgd2hlbiB1c2luZyB0aGlzIGFzIGJhY2t1cCBmaWxlcyBkbyBub3QgbWFrZSBzZW5zZQord2hlbiBub3Qgb3ZlcndyaXRpbmcgdGhlIGlucHV0IGZpbGVzLgorCisuLiB2ZXJzaW9uYWRkZWQ6OiAyLjcuMworICAgVGhlIDpvcHRpb246YC1vYCBvcHRpb24gd2FzIGFkZGVkLgorCitUaGUgOm9wdGlvbjpgLVdgIG9yIDpvcHRpb246YC0td3JpdGUtdW5jaGFuZ2VkLWZpbGVzYCBmbGFnIHRlbGxzIDJ0bzMgdG8gYWx3YXlzCit3cml0ZSBvdXRwdXQgZmlsZXMgZXZlbiBpZiBubyBjaGFuZ2VzIHdlcmUgcmVxdWlyZWQgdG8gdGhlIGZpbGUuICBUaGlzIGlzIG1vc3QKK3VzZWZ1bCB3aXRoIDpvcHRpb246YC1vYCBzbyB0aGF0IGFuIGVudGlyZSBQeXRob24gc291cmNlIHRyZWUgaXMgY29waWVkIHdpdGgKK3RyYW5zbGF0aW9uIGZyb20gb25lIGRpcmVjdG9yeSB0byBhbm90aGVyLgorVGhpcyBvcHRpb24gaW1wbGllcyB0aGUgOm9wdGlvbjpgLXdgIGZsYWcgYXMgaXQgd291bGQgbm90IG1ha2Ugc2Vuc2Ugb3RoZXJ3aXNlLgorCisuLiB2ZXJzaW9uYWRkZWQ6OiAyLjcuMworICAgVGhlIDpvcHRpb246YC1XYCBmbGFnIHdhcyBhZGRlZC4KKworVGhlIDpvcHRpb246YC0tYWRkLXN1ZmZpeGAgb3B0aW9uIHNwZWNpZmllcyBhIHN0cmluZyB0byBhcHBlbmQgdG8gYWxsIG91dHB1dAorZmlsZW5hbWVzLiAgVGhlIDpvcHRpb246YC1uYCBmbGFnIGlzIHJlcXVpcmVkIHdoZW4gc3BlY2lmeWluZyB0aGlzIGFzIGJhY2t1cHMKK2FyZSBub3QgbmVjZXNzYXJ5IHdoZW4gd3JpdGluZyB0byBkaWZmZXJlbnQgZmlsZW5hbWVzLiAgRXhhbXBsZTo6CisKKyAgICQgMnRvMyAtbiAtVyAtLWFkZC1zdWZmaXg9MyBleGFtcGxlLnB5CisKK1dpbGwgY2F1c2UgYSBjb252ZXJ0ZWQgZmlsZSBuYW1lZCBgYGV4YW1wbGUucHkzYGAgdG8gYmUgd3JpdHRlbi4KKworLi4gdmVyc2lvbmFkZGVkOjogMi43LjMKKyAgIFRoZSA6b3B0aW9uOmAtLWFkZC1zdWZmaXhgIG9wdGlvbiB3YXMgYWRkZWQuCisKK1RvIHRyYW5zbGF0ZSBhbiBlbnRpcmUgcHJvamVjdCBmcm9tIG9uZSBkaXJlY3RvcnkgdHJlZSB0byBhbm90aGVyIHVzZTo6CisKKyAgICQgMnRvMyAtLW91dHB1dC1kaXI9cHl0aG9uMy12ZXJzaW9uL215Y29kZSAtVyAtbiBweXRob24yLXZlcnNpb24vbXljb2RlCisKIAogLi4gXzJ0bzMtZml4ZXJzOgogCkBAIC0yMzIsOCArMjY0LDcgQEAKIAogLi4gMnRvM2ZpeGVyOjogbG9uZwogCi0gICBTdHJpcHMgdGhlIGBgTGBgIHN1ZmZpeCBvbiBsb25nIGxpdGVyYWxzIGFuZCByZW5hbWVzIDpjbGFzczpgbG9uZ2AgdG8KLSAgIDpjbGFzczpgaW50YC4KKyAgIFJlbmFtZXMgOmNsYXNzOmBsb25nYCB0byA6Y2xhc3M6YGludGAuCiAKIC4uIDJ0bzNmaXhlcjo6IG1hcAogCkBAIC0yNTksMTEgKzI5MCwxMSBAQAogCiAgICBDb252ZXJ0cyB0aGUgdXNlIG9mIGl0ZXJhdG9yJ3MgOm1ldGg6YH5pdGVyYXRvci5uZXh0YCBtZXRob2RzIHRvIHRoZQogICAgOmZ1bmM6YG5leHRgIGZ1bmN0aW9uLiAgSXQgYWxzbyByZW5hbWVzIDptZXRoOmBuZXh0YCBtZXRob2RzIHRvCi0gICA6bWV0aDpgfm9iamVjdC5fX25leHRfX2AuCisgICA6bWV0aDpgfml0ZXJhdG9yLl9fbmV4dF9fYC4KIAogLi4gMnRvM2ZpeGVyOjogbm9uemVybwogCi0gICBSZW5hbWVzIDptZXRoOmB+b2JqZWN0Ll9fbm9uemVyb19fYCB0byA6bWV0aDpgfm9iamVjdC5fX2Jvb2xfX2AuCisgICBSZW5hbWVzIDptZXRoOmBfX25vbnplcm9fX2AgdG8gOm1ldGg6YH5vYmplY3QuX19ib29sX19gLgogCiAuLiAydG8zZml4ZXI6OiBudW1saXRlcmFscwogCkBAIC0yODIsNyArMzEzLDcgQEAKIAogICAgQ29udmVydHMgYGByYWlzZSBFLCBWYGAgdG8gYGByYWlzZSBFKFYpYGAsIGFuZCBgYHJhaXNlIEUsIFYsIFRgYCB0byBgYHJhaXNlCiAgICBFKFYpLndpdGhfdHJhY2ViYWNrKFQpYGAuICBJZiBgYEVgYCBpcyBhIHR1cGxlLCB0aGUgdHJhbnNsYXRpb24gd2lsbCBiZQotICAgaW5jb3JyZWN0IGJlY2F1c2Ugc3Vic3RpdHV0aW5nIHR1cGxlcyBmb3IgZXhjZXB0aW9ucyBoYXMgYmVlbiByZW1vdmVkIGluIDMuMC4KKyAgIGluY29ycmVjdCBiZWNhdXNlIHN1YnN0aXR1dGluZyB0dXBsZXMgZm9yIGV4Y2VwdGlvbnMgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4KIAogLi4gMnRvM2ZpeGVyOjogcmF3X2lucHV0CiAKQEAgLTMwNSw3ICszMzYsNyBAQAogICAgUmVwbGFjZXMgdXNlIG9mIHRoZSA6Y2xhc3M6YHNldGAgY29uc3RydWN0b3Igd2l0aCBzZXQgbGl0ZXJhbHMuICBUaGlzIGZpeGVyCiAgICBpcyBvcHRpb25hbC4KIAotLi4gMnRvM2ZpeGVyOjogc3RhbmRhcmRfZXJyb3IKKy4uIDJ0bzNmaXhlcjo6IHN0YW5kYXJkZXJyb3IKIAogICAgUmVuYW1lcyA6ZXhjOmBTdGFuZGFyZEVycm9yYCB0byA6ZXhjOmBFeGNlcHRpb25gLgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9fX2Z1dHVyZV9fLnJzdCBiL0RvYy9saWJyYXJ5L19fZnV0dXJlX18ucnN0CmluZGV4IDg3ZTEyMDUuLjMyOWU0MTEgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L19fZnV0dXJlX18ucnN0CisrKyBiL0RvYy9saWJyYXJ5L19fZnV0dXJlX18ucnN0CkBAIC03NSw3ICs3NSw3IEBACiB8IGRpdmlzaW9uICAgICAgICAgfCAyLjIuMGEyICAgICB8IDMuMCAgICAgICAgICB8IDpwZXA6YDIzOGA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfCAqQ2hhbmdpbmcgdGhlIERpdmlzaW9uIE9wZXJhdG9yKiAgICAgICAgICAgIHwKICstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IGFic29sdXRlX2ltcG9ydCAgfCAyLjUuMGExICAgICB8IDIuNyAgICAgICAgICB8IDpwZXA6YDMyOGA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCBhYnNvbHV0ZV9pbXBvcnQgIHwgMi41LjBhMSAgICAgfCAzLjAgICAgICAgICAgfCA6cGVwOmAzMjhgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKIHwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgKkltcG9ydHM6IE11bHRpLUxpbmUgYW5kIEFic29sdXRlL1JlbGF0aXZlKiB8CiArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogfCB3aXRoX3N0YXRlbWVudCAgIHwgMi41LjBhMSAgICAgfCAyLjYgICAgICAgICAgfCA6cGVwOmAzNDNgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L193aW5yZWcucnN0IGIvRG9jL2xpYnJhcnkvX3dpbnJlZy5yc3QKaW5kZXggODI1Y2UxZi4uZjgyZDFjNSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvX3dpbnJlZy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvX3dpbnJlZy5yc3QKQEAgLTcsOSArNyw5IEBACiAuLiBzZWN0aW9uYXV0aG9yOjogTWFyayBIYW1tb25kIDxNYXJrSEBBY3RpdmVTdGF0ZS5jb20+CiAKIC4uIG5vdGU6OgotICAgVGhlIDptb2Q6YF93aW5yZWdgIG1vZHVsZSBoYXMgYmVlbiByZW5hbWVkIHRvIDptb2Q6YHdpbnJlZ2AgaW4gUHl0aG9uIDMuMC4KKyAgIFRoZSA6bW9kOmBfd2lucmVnYCBtb2R1bGUgaGFzIGJlZW4gcmVuYW1lZCB0byA6bW9kOmB3aW5yZWdgIGluIFB5dGhvbiAzLgogICAgVGhlIDp0ZXJtOmAydG8zYCB0b29sIHdpbGwgYXV0b21hdGljYWxseSBhZGFwdCBpbXBvcnRzIHdoZW4gY29udmVydGluZyB5b3VyCi0gICBzb3VyY2VzIHRvIDMuMC4KKyAgIHNvdXJjZXMgdG8gUHl0aG9uIDMuCiAKIAogLi4gdmVyc2lvbmFkZGVkOjogMi4wCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9hYmMucnN0IGIvRG9jL2xpYnJhcnkvYWJjLnJzdAppbmRleCBlZjhiMDhlLi4zYTAwYTljIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9hYmMucnN0CisrKyBiL0RvYy9saWJyYXJ5L2FiYy5yc3QKQEAgLTExMCwxOSArMTEwLDE5IEBACiAgICAgICBNeUl0ZXJhYmxlLnJlZ2lzdGVyKEZvbykKIAogICAgVGhlIEFCQyBgYE15SXRlcmFibGVgYCBkZWZpbmVzIHRoZSBzdGFuZGFyZCBpdGVyYWJsZSBtZXRob2QsCi0gICA6bWV0aDpgX19pdGVyX19gLCBhcyBhbiBhYnN0cmFjdCBtZXRob2QuICBUaGUgaW1wbGVtZW50YXRpb24gZ2l2ZW4gaGVyZSBjYW4KLSAgIHN0aWxsIGJlIGNhbGxlZCBmcm9tIHN1YmNsYXNzZXMuICBUaGUgOm1ldGg6YGdldF9pdGVyYXRvcmAgbWV0aG9kIGlzIGFsc28KLSAgIHBhcnQgb2YgdGhlIGBgTXlJdGVyYWJsZWBgIGFic3RyYWN0IGJhc2UgY2xhc3MsIGJ1dCBpdCBkb2VzIG5vdCBoYXZlIHRvIGJlCi0gICBvdmVycmlkZGVuIGluIG5vbi1hYnN0cmFjdCBkZXJpdmVkIGNsYXNzZXMuCisgICA6bWV0aDpgfml0ZXJhdG9yLl9faXRlcl9fYCwgYXMgYW4gYWJzdHJhY3QgbWV0aG9kLiAgVGhlIGltcGxlbWVudGF0aW9uIGdpdmVuCisgICBoZXJlIGNhbiBzdGlsbCBiZSBjYWxsZWQgZnJvbSBzdWJjbGFzc2VzLiAgVGhlIDptZXRoOmBnZXRfaXRlcmF0b3JgIG1ldGhvZAorICAgaXMgYWxzbyBwYXJ0IG9mIHRoZSBgYE15SXRlcmFibGVgYCBhYnN0cmFjdCBiYXNlIGNsYXNzLCBidXQgaXQgZG9lcyBub3QgaGF2ZQorICAgdG8gYmUgb3ZlcnJpZGRlbiBpbiBub24tYWJzdHJhY3QgZGVyaXZlZCBjbGFzc2VzLgogCiAgICBUaGUgOm1ldGg6YF9fc3ViY2xhc3Nob29rX19gIGNsYXNzIG1ldGhvZCBkZWZpbmVkIGhlcmUgc2F5cyB0aGF0IGFueSBjbGFzcwotICAgdGhhdCBoYXMgYW4gOm1ldGg6YF9faXRlcl9fYCBtZXRob2QgaW4gaXRzIDphdHRyOmBfX2RpY3RfX2AgKG9yIGluIHRoYXQgb2YKLSAgIG9uZSBvZiBpdHMgYmFzZSBjbGFzc2VzLCBhY2Nlc3NlZCB2aWEgdGhlIDphdHRyOmBfX21yb19fYCBsaXN0KSBpcwotICAgY29uc2lkZXJlZCBhIGBgTXlJdGVyYWJsZWBgIHRvby4KKyAgIHRoYXQgaGFzIGFuIDptZXRoOmB+aXRlcmF0b3IuX19pdGVyX19gIG1ldGhvZCBpbiBpdHMKKyAgIDphdHRyOmB+b2JqZWN0Ll9fZGljdF9fYCAob3IgaW4gdGhhdCBvZiBvbmUgb2YgaXRzIGJhc2UgY2xhc3NlcywgYWNjZXNzZWQKKyAgIHZpYSB0aGUgOmF0dHI6YH5jbGFzcy5fX21yb19fYCBsaXN0KSBpcyBjb25zaWRlcmVkIGEgYGBNeUl0ZXJhYmxlYGAgdG9vLgogCiAgICBGaW5hbGx5LCB0aGUgbGFzdCBsaW5lIG1ha2VzIGBgRm9vYGAgYSB2aXJ0dWFsIHN1YmNsYXNzIG9mIGBgTXlJdGVyYWJsZWBgLAotICAgZXZlbiB0aG91Z2ggaXQgZG9lcyBub3QgZGVmaW5lIGFuIDptZXRoOmBfX2l0ZXJfX2AgbWV0aG9kIChpdCB1c2VzIHRoZQotICAgb2xkLXN0eWxlIGl0ZXJhYmxlIHByb3RvY29sLCBkZWZpbmVkIGluIHRlcm1zIG9mIDptZXRoOmBfX2xlbl9fYCBhbmQKKyAgIGV2ZW4gdGhvdWdoIGl0IGRvZXMgbm90IGRlZmluZSBhbiA6bWV0aDpgfml0ZXJhdG9yLl9faXRlcl9fYCBtZXRob2QgKGl0IHVzZXMKKyAgIHRoZSBvbGQtc3R5bGUgaXRlcmFibGUgcHJvdG9jb2wsIGRlZmluZWQgaW4gdGVybXMgb2YgOm1ldGg6YF9fbGVuX19gIGFuZAogICAgOm1ldGg6YF9fZ2V0aXRlbV9fYCkuICBOb3RlIHRoYXQgdGhpcyB3aWxsIG5vdCBtYWtlIGBgZ2V0X2l0ZXJhdG9yYGAKICAgIGF2YWlsYWJsZSBhcyBhIG1ldGhvZCBvZiBgYEZvb2BgLCBzbyBpdCBpcyBwcm92aWRlZCBzZXBhcmF0ZWx5LgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9haWZjLnJzdCBiL0RvYy9saWJyYXJ5L2FpZmMucnN0CmluZGV4IDEyNjU0MjMuLmRlNDE0NGMgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2FpZmMucnN0CisrKyBiL0RvYy9saWJyYXJ5L2FpZmMucnN0CkBAIC0zMCw4ICszMCw4IEBACiBzYW1wbGVkLiAgVGhlIG51bWJlciBvZiBjaGFubmVscyBpbmRpY2F0ZSBpZiB0aGUgYXVkaW8gaXMgbW9ubywgc3RlcmVvLCBvcgogcXVhZHJvLiAgRWFjaCBmcmFtZSBjb25zaXN0cyBvZiBvbmUgc2FtcGxlIHBlciBjaGFubmVsLiAgVGhlIHNhbXBsZSBzaXplIGlzIHRoZQogc2l6ZSBpbiBieXRlcyBvZiBlYWNoIHNhbXBsZS4gIFRodXMgYSBmcmFtZSBjb25zaXN0cyBvZgotKm5jaGFubmVscypcKipzYW1wbGVzaXplKiBieXRlcywgYW5kIGEgc2Vjb25kJ3Mgd29ydGggb2YgYXVkaW8gY29uc2lzdHMgb2YKLSpuY2hhbm5lbHMqXCoqc2FtcGxlc2l6ZSpcKipmcmFtZXJhdGUqIGJ5dGVzLgorKm5jaGFubmVscypcKlwgKnNhbXBsZXNpemUqIGJ5dGVzLCBhbmQgYSBzZWNvbmQncyB3b3J0aCBvZiBhdWRpbyBjb25zaXN0cyBvZgorKm5jaGFubmVscypcKlwgKnNhbXBsZXNpemUqXCpcICpmcmFtZXJhdGUqIGJ5dGVzLgogCiBGb3IgZXhhbXBsZSwgQ0QgcXVhbGl0eSBhdWRpbyBoYXMgYSBzYW1wbGUgc2l6ZSBvZiB0d28gYnl0ZXMgKDE2IGJpdHMpLCB1c2VzIHR3bwogY2hhbm5lbHMgKHN0ZXJlbykgYW5kIGhhcyBhIGZyYW1lIHJhdGUgb2YgNDQsMTAwIGZyYW1lcy9zZWNvbmQuICBUaGlzIGdpdmVzIGEKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2FsLnJzdCBiL0RvYy9saWJyYXJ5L2FsLnJzdAppbmRleCAxMmNlYzQyLi5mNzk2YzVjIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9hbC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvYWwucnN0CkBAIC04LDcgKzgsNyBAQAogICAgOmRlcHJlY2F0ZWQ6CiAKIC4uIGRlcHJlY2F0ZWQ6OiAyLjYKLSAgICBUaGUgOm1vZDpgYWxgIG1vZHVsZSBoYXMgYmVlbiBkZXByZWNhdGVkIGZvciByZW1vdmFsIGluIFB5dGhvbiAzLjAuCisgICAgVGhlIDptb2Q6YGFsYCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4KIAogCiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGF1ZGlvIGZhY2lsaXRpZXMgb2YgdGhlIFNHSSBJbmR5IGFuZCBJbmRpZ28KQEAgLTUzLDcgKzUzLDcgQEAKIC4uIGZ1bmN0aW9uOjogcXVlcnlwYXJhbXMoZGV2aWNlKQogCiAgICBUaGUgZGV2aWNlIGFyZ3VtZW50IGlzIGFuIGludGVnZXIuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgbGlzdCBvZiBpbnRlZ2VycwotICAgY29udGFpbmluZyB0aGUgZGF0YSByZXR1cm5lZCBieSA6Y2Z1bmM6YEFMcXVlcnlwYXJhbXNgLgorICAgY29udGFpbmluZyB0aGUgZGF0YSByZXR1cm5lZCBieSA6YzpmdW5jOmBBTHF1ZXJ5cGFyYW1zYC4KIAogCiAuLiBmdW5jdGlvbjo6IGdldHBhcmFtcyhkZXZpY2UsIGxpc3QpCkBAIC0yMDEsNyArMjAxLDcgQEAKICAgIDpkZXByZWNhdGVkOgogCiAuLiBkZXByZWNhdGVkOjogMi42Ci0gICBUaGUgOm1vZDpgQUxgIG1vZHVsZSBoYXMgYmVlbiBkZXByZWNhdGVkIGZvciByZW1vdmFsIGluIFB5dGhvbiAzLjAuCisgICBUaGUgOm1vZDpgQUxgIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLgogCiAKIFRoaXMgbW9kdWxlIGRlZmluZXMgc3ltYm9saWMgY29uc3RhbnRzIG5lZWRlZCB0byB1c2UgdGhlIGJ1aWx0LWluIG1vZHVsZQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvYW55ZGJtLnJzdCBiL0RvYy9saWJyYXJ5L2FueWRibS5yc3QKaW5kZXggN2M2Zjk5Zi4uMzhlMDFmMyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvYW55ZGJtLnJzdAorKysgYi9Eb2MvbGlicmFyeS9hbnlkYm0ucnN0CkBAIC02LDkgKzYsOSBAQAogCiAKIC4uIG5vdGU6OgotICAgVGhlIDptb2Q6YGFueWRibWAgbW9kdWxlIGhhcyBiZWVuIHJlbmFtZWQgdG8gOm1vZDpgZGJtYCBpbiBQeXRob24gMy4wLiAgVGhlCisgICBUaGUgOm1vZDpgYW55ZGJtYCBtb2R1bGUgaGFzIGJlZW4gcmVuYW1lZCB0byA6bW9kOmBkYm1gIGluIFB5dGhvbiAzLiAgVGhlCiAgICA6dGVybTpgMnRvM2AgdG9vbCB3aWxsIGF1dG9tYXRpY2FsbHkgYWRhcHQgaW1wb3J0cyB3aGVuIGNvbnZlcnRpbmcgeW91cgotICAgc291cmNlcyB0byAzLjAuCisgICBzb3VyY2VzIHRvIFB5dGhvbiAzLgogCiAuLiBpbmRleDo6CiAgICBtb2R1bGU6IGRiaGFzaApAQCAtOTIsNiArOTIsMTQgQEAKICAgIGRiLmNsb3NlKCkKIAogCitJbiBhZGRpdGlvbiB0byB0aGUgZGljdGlvbmFyeS1saWtlIG1ldGhvZHMsIGBgYW55ZGJtYGAgb2JqZWN0cworcHJvdmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZDoKKworLi4gZnVuY3Rpb246OiBjbG9zZSgpCisKKyAgIENsb3NlIHRoZSBgYGFueWRibWBgIGRhdGFiYXNlLgorCisKIC4uIHNlZWFsc286OgogCiAgICBNb2R1bGUgOm1vZDpgZGJoYXNoYApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvYXJjaGl2aW5nLnJzdCBiL0RvYy9saWJyYXJ5L2FyY2hpdmluZy5yc3QKaW5kZXggN2QwZGY1Zi4uNDcyYzYxNyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvYXJjaGl2aW5nLnJzdAorKysgYi9Eb2MvbGlicmFyeS9hcmNoaXZpbmcucnN0CkBAIC03LDYgKzcsNyBAQAogCiBUaGUgbW9kdWxlcyBkZXNjcmliZWQgaW4gdGhpcyBjaGFwdGVyIHN1cHBvcnQgZGF0YSBjb21wcmVzc2lvbiB3aXRoIHRoZSB6bGliLAogZ3ppcCwgYW5kIGJ6aXAyIGFsZ29yaXRobXMsIGFuZCAgdGhlIGNyZWF0aW9uIG9mIFpJUC0gYW5kIHRhci1mb3JtYXQgYXJjaGl2ZXMuCitTZWUgYWxzbyA6cmVmOmBhcmNoaXZpbmctb3BlcmF0aW9uc2AgcHJvdmlkZWQgYnkgdGhlIDptb2Q6YHNodXRpbGAgbW9kdWxlLgogCiAKIC4uIHRvY3RyZWU6OgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvYXJncGFyc2UucnN0IGIvRG9jL2xpYnJhcnkvYXJncGFyc2UucnN0CmluZGV4IGI0N2QwYTUuLjljZmZhOGQgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2FyZ3BhcnNlLnJzdAorKysgYi9Eb2MvbGlicmFyeS9hcmdwYXJzZS5yc3QKQEAgLTEyLDYgKzEyLDEyIEBACiAKIC0tLS0tLS0tLS0tLS0tCiAKKy4uIHNpZGViYXI6OiBUdXRvcmlhbAorCisgICBUaGlzIHBhZ2UgY29udGFpbnMgdGhlIEFQSSByZWZlcmVuY2UgaW5mb3JtYXRpb24uIEZvciBhIG1vcmUgZ2VudGxlCisgICBpbnRyb2R1Y3Rpb24gdG8gUHl0aG9uIGNvbW1hbmQtbGluZSBwYXJzaW5nLCBoYXZlIGEgbG9vayBhdCB0aGUKKyAgIDpyZWY6YGFyZ3BhcnNlIHR1dG9yaWFsIDxhcmdwYXJzZS10dXRvcmlhbD5gLgorCiBUaGUgOm1vZDpgYXJncGFyc2VgIG1vZHVsZSBtYWtlcyBpdCBlYXN5IHRvIHdyaXRlIHVzZXItZnJpZW5kbHkgY29tbWFuZC1saW5lCiBpbnRlcmZhY2VzLiBUaGUgcHJvZ3JhbSBkZWZpbmVzIHdoYXQgYXJndW1lbnRzIGl0IHJlcXVpcmVzLCBhbmQgOm1vZDpgYXJncGFyc2VgCiB3aWxsIGZpZ3VyZSBvdXQgaG93IHRvIHBhcnNlIHRob3NlIG91dCBvZiA6ZGF0YTpgc3lzLmFyZ3ZgLiAgVGhlIDptb2Q6YGFyZ3BhcnNlYApAQCAtNDAsNyArNDYsNyBAQAogQXNzdW1pbmcgdGhlIFB5dGhvbiBjb2RlIGFib3ZlIGlzIHNhdmVkIGludG8gYSBmaWxlIGNhbGxlZCBgYHByb2cucHlgYCwgaXQgY2FuCiBiZSBydW4gYXQgdGhlIGNvbW1hbmQgbGluZSBhbmQgcHJvdmlkZXMgdXNlZnVsIGhlbHAgbWVzc2FnZXM6OgogCi0gICAkIHByb2cucHkgLWgKKyAgICQgcHl0aG9uIHByb2cucHkgLWgKICAgIHVzYWdlOiBwcm9nLnB5IFstaF0gWy0tc3VtXSBOIFtOIC4uLl0KIAogICAgUHJvY2VzcyBzb21lIGludGVnZXJzLgpAQCAtNTUsMTUgKzYxLDE1IEBACiBXaGVuIHJ1biB3aXRoIHRoZSBhcHByb3ByaWF0ZSBhcmd1bWVudHMsIGl0IHByaW50cyBlaXRoZXIgdGhlIHN1bSBvciB0aGUgbWF4IG9mCiB0aGUgY29tbWFuZC1saW5lIGludGVnZXJzOjoKIAotICAgJCBwcm9nLnB5IDEgMiAzIDQKKyAgICQgcHl0aG9uIHByb2cucHkgMSAyIDMgNAogICAgNAogCi0gICAkIHByb2cucHkgMSAyIDMgNCAtLXN1bQorICAgJCBweXRob24gcHJvZy5weSAxIDIgMyA0IC0tc3VtCiAgICAxMAogCiBJZiBpbnZhbGlkIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluLCBpdCB3aWxsIGlzc3VlIGFuIGVycm9yOjoKIAotICAgJCBwcm9nLnB5IGEgYiBjCisgICAkIHB5dGhvbiBwcm9nLnB5IGEgYiBjCiAgICB1c2FnZTogcHJvZy5weSBbLWhdIFstLXN1bV0gTiBbTiAuLi5dCiAgICBwcm9nLnB5OiBlcnJvcjogYXJndW1lbnQgTjogaW52YWxpZCBpbnQgdmFsdWU6ICdhJwogCkBAIC0xMjQsNDIgKzEzMCwxNDMgQEAKIEFyZ3VtZW50UGFyc2VyIG9iamVjdHMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLi4gY2xhc3M6OiBBcmd1bWVudFBhcnNlcihbZGVzY3JpcHRpb25dLCBbZXBpbG9nXSwgW3Byb2ddLCBbdXNhZ2VdLCBbYWRkX2hlbHBdLCBbYXJndW1lbnRfZGVmYXVsdF0sIFtwYXJlbnRzXSwgW3ByZWZpeF9jaGFyc10sIFtjb25mbGljdF9oYW5kbGVyXSwgW2Zvcm1hdHRlcl9jbGFzc10pCisuLiBjbGFzczo6IEFyZ3VtZW50UGFyc2VyKHByb2c9Tm9uZSwgdXNhZ2U9Tm9uZSwgZGVzY3JpcHRpb249Tm9uZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcGlsb2c9Tm9uZSwgcGFyZW50cz1bXSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXJfY2xhc3M9YXJncGFyc2UuSGVscEZvcm1hdHRlciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhfY2hhcnM9Jy0nLCBmcm9tZmlsZV9wcmVmaXhfY2hhcnM9Tm9uZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudF9kZWZhdWx0PU5vbmUsIGNvbmZsaWN0X2hhbmRsZXI9J2Vycm9yJywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfaGVscD1UcnVlKQogCi0gICBDcmVhdGUgYSBuZXcgOmNsYXNzOmBBcmd1bWVudFBhcnNlcmAgb2JqZWN0LiAgRWFjaCBwYXJhbWV0ZXIgaGFzIGl0cyBvd24gbW9yZQotICAgZGV0YWlsZWQgZGVzY3JpcHRpb24gYmVsb3csIGJ1dCBpbiBzaG9ydCB0aGV5IGFyZToKKyAgIENyZWF0ZSBhIG5ldyA6Y2xhc3M6YEFyZ3VtZW50UGFyc2VyYCBvYmplY3QuIEFsbCBwYXJhbWV0ZXJzIHNob3VsZCBiZSBwYXNzZWQKKyAgIGFzIGtleXdvcmQgYXJndW1lbnRzLiBFYWNoIHBhcmFtZXRlciBoYXMgaXRzIG93biBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uCisgICBiZWxvdywgYnV0IGluIHNob3J0IHRoZXkgYXJlOgogCi0gICAqIGRlc2NyaXB0aW9uXyAtIFRleHQgdG8gZGlzcGxheSBiZWZvcmUgdGhlIGFyZ3VtZW50IGhlbHAuCisgICAqIHByb2dfIC0gVGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gKGRlZmF1bHQ6IGBgc3lzLmFyZ3ZbMF1gYCkKIAotICAgKiBlcGlsb2dfIC0gVGV4dCB0byBkaXNwbGF5IGFmdGVyIHRoZSBhcmd1bWVudCBoZWxwLgorICAgKiB1c2FnZV8gLSBUaGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHByb2dyYW0gdXNhZ2UgKGRlZmF1bHQ6IGdlbmVyYXRlZCBmcm9tCisgICAgIGFyZ3VtZW50cyBhZGRlZCB0byBwYXJzZXIpCiAKLSAgICogYWRkX2hlbHBfIC0gQWRkIGEgLWgvLS1oZWxwIG9wdGlvbiB0byB0aGUgcGFyc2VyLiAoZGVmYXVsdDogYGBUcnVlYGApCisgICAqIGRlc2NyaXB0aW9uXyAtIFRleHQgdG8gZGlzcGxheSBiZWZvcmUgdGhlIGFyZ3VtZW50IGhlbHAgKGRlZmF1bHQ6IG5vbmUpCiAKLSAgICogYXJndW1lbnRfZGVmYXVsdF8gLSBTZXQgdGhlIGdsb2JhbCBkZWZhdWx0IHZhbHVlIGZvciBhcmd1bWVudHMuCi0gICAgIChkZWZhdWx0OiBgYE5vbmVgYCkKKyAgICogZXBpbG9nXyAtIFRleHQgdG8gZGlzcGxheSBhZnRlciB0aGUgYXJndW1lbnQgaGVscCAoZGVmYXVsdDogbm9uZSkKIAogICAgKiBwYXJlbnRzXyAtIEEgbGlzdCBvZiA6Y2xhc3M6YEFyZ3VtZW50UGFyc2VyYCBvYmplY3RzIHdob3NlIGFyZ3VtZW50cyBzaG91bGQKLSAgICAgYWxzbyBiZSBpbmNsdWRlZC4KKyAgICAgYWxzbyBiZSBpbmNsdWRlZAogCi0gICAqIHByZWZpeF9jaGFyc18gLSBUaGUgc2V0IG9mIGNoYXJhY3RlcnMgdGhhdCBwcmVmaXggb3B0aW9uYWwgYXJndW1lbnRzLgorICAgKiBmb3JtYXR0ZXJfY2xhc3NfIC0gQSBjbGFzcyBmb3IgY3VzdG9taXppbmcgdGhlIGhlbHAgb3V0cHV0CisKKyAgICogcHJlZml4X2NoYXJzXyAtIFRoZSBzZXQgb2YgY2hhcmFjdGVycyB0aGF0IHByZWZpeCBvcHRpb25hbCBhcmd1bWVudHMKICAgICAgKGRlZmF1bHQ6ICctJykKIAogICAgKiBmcm9tZmlsZV9wcmVmaXhfY2hhcnNfIC0gVGhlIHNldCBvZiBjaGFyYWN0ZXJzIHRoYXQgcHJlZml4IGZpbGVzIGZyb20KLSAgICAgd2hpY2ggYWRkaXRpb25hbCBhcmd1bWVudHMgc2hvdWxkIGJlIHJlYWQuIChkZWZhdWx0OiBgYE5vbmVgYCkKKyAgICAgd2hpY2ggYWRkaXRpb25hbCBhcmd1bWVudHMgc2hvdWxkIGJlIHJlYWQgKGRlZmF1bHQ6IGBgTm9uZWBgKQogCi0gICAqIGZvcm1hdHRlcl9jbGFzc18gLSBBIGNsYXNzIGZvciBjdXN0b21pemluZyB0aGUgaGVscCBvdXRwdXQuCisgICAqIGFyZ3VtZW50X2RlZmF1bHRfIC0gVGhlIGdsb2JhbCBkZWZhdWx0IHZhbHVlIGZvciBhcmd1bWVudHMKKyAgICAgKGRlZmF1bHQ6IGBgTm9uZWBgKQogCi0gICAqIGNvbmZsaWN0X2hhbmRsZXJfIC0gVXN1YWxseSB1bm5lY2Vzc2FyeSwgZGVmaW5lcyBzdHJhdGVneSBmb3IgcmVzb2x2aW5nCi0gICAgIGNvbmZsaWN0aW5nIG9wdGlvbmFscy4KKyAgICogY29uZmxpY3RfaGFuZGxlcl8gLSBUaGUgc3RyYXRlZ3kgZm9yIHJlc29sdmluZyBjb25mbGljdGluZyBvcHRpb25hbHMKKyAgICAgKHVzdWFsbHkgdW5uZWNlc3NhcnkpCiAKLSAgICogcHJvZ18gLSBUaGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSAoZGVmYXVsdDoKLSAgICAgYGBzeXMuYXJndlswXWBgKQotCi0gICAqIHVzYWdlXyAtIFRoZSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcHJvZ3JhbSB1c2FnZSAoZGVmYXVsdDogZ2VuZXJhdGVkKQorICAgKiBhZGRfaGVscF8gLSBBZGQgYSAtaC8tLWhlbHAgb3B0aW9uIHRvIHRoZSBwYXJzZXIgKGRlZmF1bHQ6IGBgVHJ1ZWBgKQogCiBUaGUgZm9sbG93aW5nIHNlY3Rpb25zIGRlc2NyaWJlIGhvdyBlYWNoIG9mIHRoZXNlIGFyZSB1c2VkLgogCiAKK3Byb2cKK15eXl4KKworQnkgZGVmYXVsdCwgOmNsYXNzOmBBcmd1bWVudFBhcnNlcmAgb2JqZWN0cyB1c2VzIGBgc3lzLmFyZ3ZbMF1gYCB0byBkZXRlcm1pbmUKK2hvdyB0byBkaXNwbGF5IHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIGluIGhlbHAgbWVzc2FnZXMuICBUaGlzIGRlZmF1bHQgaXMgYWxtb3N0CithbHdheXMgZGVzaXJhYmxlIGJlY2F1c2UgaXQgd2lsbCBtYWtlIHRoZSBoZWxwIG1lc3NhZ2VzIG1hdGNoIGhvdyB0aGUgcHJvZ3JhbSB3YXMKK2ludm9rZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gIEZvciBleGFtcGxlLCBjb25zaWRlciBhIGZpbGUgbmFtZWQKK2BgbXlwcm9ncmFtLnB5YGAgd2l0aCB0aGUgZm9sbG93aW5nIGNvZGU6OgorCisgICBpbXBvcnQgYXJncGFyc2UKKyAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tZm9vJywgaGVscD0nZm9vIGhlbHAnKQorICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworVGhlIGhlbHAgZm9yIHRoaXMgcHJvZ3JhbSB3aWxsIGRpc3BsYXkgYGBteXByb2dyYW0ucHlgYCBhcyB0aGUgcHJvZ3JhbSBuYW1lCisocmVnYXJkbGVzcyBvZiB3aGVyZSB0aGUgcHJvZ3JhbSB3YXMgaW52b2tlZCBmcm9tKTo6CisKKyAgICQgcHl0aG9uIG15cHJvZ3JhbS5weSAtLWhlbHAKKyAgIHVzYWdlOiBteXByb2dyYW0ucHkgWy1oXSBbLS1mb28gRk9PXQorCisgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgLWgsIC0taGVscCAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgIC0tZm9vIEZPTyAgIGZvbyBoZWxwCisgICAkIGNkIC4uCisgICAkIHB5dGhvbiBzdWJkaXJcbXlwcm9ncmFtLnB5IC0taGVscAorICAgdXNhZ2U6IG15cHJvZ3JhbS5weSBbLWhdIFstLWZvbyBGT09dCisKKyAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgLS1mb28gRk9PICAgZm9vIGhlbHAKKworVG8gY2hhbmdlIHRoaXMgZGVmYXVsdCBiZWhhdmlvciwgYW5vdGhlciB2YWx1ZSBjYW4gYmUgc3VwcGxpZWQgdXNpbmcgdGhlCitgYHByb2c9YGAgYXJndW1lbnQgdG8gOmNsYXNzOmBBcmd1bWVudFBhcnNlcmA6OgorCisgICA+Pj4gcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIocHJvZz0nbXlwcm9ncmFtJykKKyAgID4+PiBwYXJzZXIucHJpbnRfaGVscCgpCisgICB1c2FnZTogbXlwcm9ncmFtIFstaF0KKworICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKworTm90ZSB0aGF0IHRoZSBwcm9ncmFtIG5hbWUsIHdoZXRoZXIgZGV0ZXJtaW5lZCBmcm9tIGBgc3lzLmFyZ3ZbMF1gYCBvciBmcm9tIHRoZQorYGBwcm9nPWBgIGFyZ3VtZW50LCBpcyBhdmFpbGFibGUgdG8gaGVscCBtZXNzYWdlcyB1c2luZyB0aGUgYGAlKHByb2cpc2BgIGZvcm1hdAorc3BlY2lmaWVyLgorCis6OgorCisgICA+Pj4gcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIocHJvZz0nbXlwcm9ncmFtJykKKyAgID4+PiBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWZvbycsIGhlbHA9J2ZvbyBvZiB0aGUgJShwcm9nKXMgcHJvZ3JhbScpCisgICA+Pj4gcGFyc2VyLnByaW50X2hlbHAoKQorICAgdXNhZ2U6IG15cHJvZ3JhbSBbLWhdIFstLWZvbyBGT09dCisKKyAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgLS1mb28gRk9PICAgZm9vIG9mIHRoZSBteXByb2dyYW0gcHJvZ3JhbQorCisKK3VzYWdlCiteXl5eXgorCitCeSBkZWZhdWx0LCA6Y2xhc3M6YEFyZ3VtZW50UGFyc2VyYCBjYWxjdWxhdGVzIHRoZSB1c2FnZSBtZXNzYWdlIGZyb20gdGhlCithcmd1bWVudHMgaXQgY29udGFpbnM6OgorCisgICA+Pj4gcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIocHJvZz0nUFJPRycpCisgICA+Pj4gcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1mb28nLCBuYXJncz0nPycsIGhlbHA9J2ZvbyBoZWxwJykKKyAgID4+PiBwYXJzZXIuYWRkX2FyZ3VtZW50KCdiYXInLCBuYXJncz0nKycsIGhlbHA9J2JhciBoZWxwJykKKyAgID4+PiBwYXJzZXIucHJpbnRfaGVscCgpCisgICB1c2FnZTogUFJPRyBbLWhdIFstLWZvbyBbRk9PXV0gYmFyIFtiYXIgLi4uXQorCisgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICBiYXIgICAgICAgICAgYmFyIGhlbHAKKworICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgIC1oLCAtLWhlbHAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgLS1mb28gW0ZPT10gIGZvbyBoZWxwCisKK1RoZSBkZWZhdWx0IG1lc3NhZ2UgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCB0aGUgYGB1c2FnZT1gYCBrZXl3b3JkIGFyZ3VtZW50OjoKKworICAgPj4+IHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKHByb2c9J1BST0cnLCB1c2FnZT0nJShwcm9nKXMgW29wdGlvbnNdJykKKyAgID4+PiBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWZvbycsIG5hcmdzPSc/JywgaGVscD0nZm9vIGhlbHAnKQorICAgPj4+IHBhcnNlci5hZGRfYXJndW1lbnQoJ2JhcicsIG5hcmdzPScrJywgaGVscD0nYmFyIGhlbHAnKQorICAgPj4+IHBhcnNlci5wcmludF9oZWxwKCkKKyAgIHVzYWdlOiBQUk9HIFtvcHRpb25zXQorCisgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICBiYXIgICAgICAgICAgYmFyIGhlbHAKKworICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgIC1oLCAtLWhlbHAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgLS1mb28gW0ZPT10gIGZvbyBoZWxwCisKK1RoZSBgYCUocHJvZylzYGAgZm9ybWF0IHNwZWNpZmllciBpcyBhdmFpbGFibGUgdG8gZmlsbCBpbiB0aGUgcHJvZ3JhbSBuYW1lIGluCit5b3VyIHVzYWdlIG1lc3NhZ2VzLgorCisKIGRlc2NyaXB0aW9uCiBeXl5eXl5eXl5eXgogCkBAIC0yMDcsMTIyICszMTQsNiBAQAogYXJndW1lbnQgdG8gOmNsYXNzOmBBcmd1bWVudFBhcnNlcmAuCiAKIAotYWRkX2hlbHAKLV5eXl5eXl5eCi0KLUJ5IGRlZmF1bHQsIEFyZ3VtZW50UGFyc2VyIG9iamVjdHMgYWRkIGFuIG9wdGlvbiB3aGljaCBzaW1wbHkgZGlzcGxheXMKLXRoZSBwYXJzZXIncyBoZWxwIG1lc3NhZ2UuIEZvciBleGFtcGxlLCBjb25zaWRlciBhIGZpbGUgbmFtZWQKLWBgbXlwcm9ncmFtLnB5YGAgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIGNvZGU6OgotCi0gICBpbXBvcnQgYXJncGFyc2UKLSAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKLSAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tZm9vJywgaGVscD0nZm9vIGhlbHAnKQotICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKLQotSWYgYGAtaGBgIG9yIGBgLS1oZWxwYGAgaXMgc3VwcGxpZWQgYXQgdGhlIGNvbW1hbmQgbGluZSwgdGhlIEFyZ3VtZW50UGFyc2VyCi1oZWxwIHdpbGwgYmUgcHJpbnRlZDo6Ci0KLSAgICQgcHl0aG9uIG15cHJvZ3JhbS5weSAtLWhlbHAKLSAgIHVzYWdlOiBteXByb2dyYW0ucHkgWy1oXSBbLS1mb28gRk9PXQotCi0gICBvcHRpb25hbCBhcmd1bWVudHM6Ci0gICAgLWgsIC0taGVscCAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAotICAgIC0tZm9vIEZPTyAgIGZvbyBoZWxwCi0KLU9jY2FzaW9uYWxseSwgaXQgbWF5IGJlIHVzZWZ1bCB0byBkaXNhYmxlIHRoZSBhZGRpdGlvbiBvZiB0aGlzIGhlbHAgb3B0aW9uLgotVGhpcyBjYW4gYmUgYWNoaWV2ZWQgYnkgcGFzc2luZyBgYEZhbHNlYGAgYXMgdGhlIGBgYWRkX2hlbHA9YGAgYXJndW1lbnQgdG8KLTpjbGFzczpgQXJndW1lbnRQYXJzZXJgOjoKLQotICAgPj4+IHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKHByb2c9J1BST0cnLCBhZGRfaGVscD1GYWxzZSkKLSAgID4+PiBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWZvbycsIGhlbHA9J2ZvbyBoZWxwJykKLSAgID4+PiBwYXJzZXIucHJpbnRfaGVscCgpCi0gICB1c2FnZTogUFJPRyBbLS1mb28gRk9PXQotCi0gICBvcHRpb25hbCBhcmd1bWVudHM6Ci0gICAgLS1mb28gRk9PICBmb28gaGVscAotCi1UaGUgaGVscCBvcHRpb24gaXMgdHlwaWNhbGx5IGBgLWgvLS1oZWxwYGAuIFRoZSBleGNlcHRpb24gdG8gdGhpcyBpcwotaWYgdGhlIGBgcHJlZml4X2NoYXJzPWBgIGlzIHNwZWNpZmllZCBhbmQgZG9lcyBub3QgaW5jbHVkZSBgYC1gYCwgaW4KLXdoaWNoIGNhc2UgYGAtaGBgIGFuZCBgYC0taGVscGBgIGFyZSBub3QgdmFsaWQgb3B0aW9ucy4gIEluCi10aGlzIGNhc2UsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gYGBwcmVmaXhfY2hhcnNgYCBpcyB1c2VkIHRvIHByZWZpeAotdGhlIGhlbHAgb3B0aW9uczo6Ci0KLSAgID4+PiBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihwcm9nPSdQUk9HJywgcHJlZml4X2NoYXJzPScrLycpCi0gICA+Pj4gcGFyc2VyLnByaW50X2hlbHAoKQotICAgdXNhZ2U6IFBST0cgWytoXQotCi0gICBvcHRpb25hbCBhcmd1bWVudHM6Ci0gICAgICtoLCArK2hlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKLQotCi1wcmVmaXhfY2hhcnMKLV5eXl5eXl5eXl5eXgotCi1Nb3N0IGNvbW1hbmQtbGluZSBvcHRpb25zIHdpbGwgdXNlIGBgLWBgIGFzIHRoZSBwcmVmaXgsIGUuZy4gYGAtZi8tLWZvb2BgLgotUGFyc2VycyB0aGF0IG5lZWQgdG8gc3VwcG9ydCBkaWZmZXJlbnQgb3IgYWRkaXRpb25hbCBwcmVmaXgKLWNoYXJhY3RlcnMsIGUuZy4gZm9yIG9wdGlvbnMKLWxpa2UgYGArZmBgIG9yIGBgL2Zvb2BgLCBtYXkgc3BlY2lmeSB0aGVtIHVzaW5nIHRoZSBgYHByZWZpeF9jaGFycz1gYCBhcmd1bWVudAotdG8gdGhlIEFyZ3VtZW50UGFyc2VyIGNvbnN0cnVjdG9yOjoKLQotICAgPj4+IHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKHByb2c9J1BST0cnLCBwcmVmaXhfY2hhcnM9Jy0rJykKLSAgID4+PiBwYXJzZXIuYWRkX2FyZ3VtZW50KCcrZicpCi0gICA+Pj4gcGFyc2VyLmFkZF9hcmd1bWVudCgnKytiYXInKQotICAgPj4+IHBhcnNlci5wYXJzZV9hcmdzKCcrZiBYICsrYmFyIFknLnNwbGl0KCkpCi0gICBOYW1lc3BhY2UoYmFyPSdZJywgZj0nWCcpCi0KLVRoZSBgYHByZWZpeF9jaGFycz1gYCBhcmd1bWVudCBkZWZhdWx0cyB0byBgYCctJ2BgLiBTdXBwbHlpbmcgYSBzZXQgb2YKLWNoYXJhY3RlcnMgdGhhdCBkb2VzIG5vdCBpbmNsdWRlIGBgLWBgIHdpbGwgY2F1c2UgYGAtZi8tLWZvb2BgIG9wdGlvbnMgdG8gYmUKLWRpc2FsbG93ZWQuCi0KLQotZnJvbWZpbGVfcHJlZml4X2NoYXJzCi1eXl5eXl5eXl5eXl5eXl5eXl5eXl4KLQotU29tZXRpbWVzLCBmb3IgZXhhbXBsZSB3aGVuIGRlYWxpbmcgd2l0aCBhIHBhcnRpY3VsYXJseSBsb25nIGFyZ3VtZW50IGxpc3RzLCBpdAotbWF5IG1ha2Ugc2Vuc2UgdG8ga2VlcCB0aGUgbGlzdCBvZiBhcmd1bWVudHMgaW4gYSBmaWxlIHJhdGhlciB0aGFuIHR5cGluZyBpdCBvdXQKLWF0IHRoZSBjb21tYW5kIGxpbmUuICBJZiB0aGUgYGBmcm9tZmlsZV9wcmVmaXhfY2hhcnM9YGAgYXJndW1lbnQgaXMgZ2l2ZW4gdG8gdGhlCi06Y2xhc3M6YEFyZ3VtZW50UGFyc2VyYCBjb25zdHJ1Y3RvciwgdGhlbiBhcmd1bWVudHMgdGhhdCBzdGFydCB3aXRoIGFueSBvZiB0aGUKLXNwZWNpZmllZCBjaGFyYWN0ZXJzIHdpbGwgYmUgdHJlYXRlZCBhcyBmaWxlcywgYW5kIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlCi1hcmd1bWVudHMgdGhleSBjb250YWluLiAgRm9yIGV4YW1wbGU6OgotCi0gICA+Pj4gd2l0aCBvcGVuKCdhcmdzLnR4dCcsICd3JykgYXMgZnA6Ci0gICAuLi4gICAgZnAud3JpdGUoJy1mXG5iYXInKQotICAgPj4+IHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGZyb21maWxlX3ByZWZpeF9jaGFycz0nQCcpCi0gICA+Pj4gcGFyc2VyLmFkZF9hcmd1bWVudCgnLWYnKQotICAgPj4+IHBhcnNlci5wYXJzZV9hcmdzKFsnLWYnLCAnZm9vJywgJ0BhcmdzLnR4dCddKQotICAgTmFtZXNwYWNlKGY9J2JhcicpCi0KLUFyZ3VtZW50cyByZWFkIGZyb20gYSBmaWxlIG11c3QgYnkgZGVmYXVsdCBiZSBvbmUgcGVyIGxpbmUgKGJ1dCBzZWUgYWxzbwotOm1ldGg6YH5Bcmd1bWVudFBhcnNlci5jb252ZXJ0X2FyZ19saW5lX3RvX2FyZ3NgKSBhbmQgYXJlIHRyZWF0ZWQgYXMgaWYgdGhleQotd2VyZSBpbiB0aGUgc2FtZSBwbGFjZSBhcyB0aGUgb3JpZ2luYWwgZmlsZSByZWZlcmVuY2luZyBhcmd1bWVudCBvbiB0aGUgY29tbWFuZAotbGluZS4gIFNvIGluIHRoZSBleGFtcGxlIGFib3ZlLCB0aGUgZXhwcmVzc2lvbiBgYFsnLWYnLCAnZm9vJywgJ0BhcmdzLnR4dCddYGAKLWlzIGNvbnNpZGVyZWQgZXF1aXZhbGVudCB0byB0aGUgZXhwcmVzc2lvbiBgYFsnLWYnLCAnZm9vJywgJy1mJywgJ2JhciddYGAuCi0KLVRoZSBgYGZyb21maWxlX3ByZWZpeF9jaGFycz1gYCBhcmd1bWVudCBkZWZhdWx0cyB0byBgYE5vbmVgYCwgbWVhbmluZyB0aGF0Ci1hcmd1bWVudHMgd2lsbCBuZXZlciBiZSB0cmVhdGVkIGFzIGZpbGUgcmVmZXJlbmNlcy4KLQotCi1hcmd1bWVudF9kZWZhdWx0Ci1eXl5eXl5eXl5eXl5eXl5eCi0KLUdlbmVyYWxseSwgYXJndW1lbnQgZGVmYXVsdHMgYXJlIHNwZWNpZmllZCBlaXRoZXIgYnkgcGFzc2luZyBhIGRlZmF1bHQgdG8KLTptZXRoOmB+QXJndW1lbnRQYXJzZXIuYWRkX2FyZ3VtZW50YCBvciBieSBjYWxsaW5nIHRoZQotOm1ldGg6YH5Bcmd1bWVudFBhcnNlci5zZXRfZGVmYXVsdHNgIG1ldGhvZHMgd2l0aCBhIHNwZWNpZmljIHNldCBvZiBuYW1lLXZhbHVlCi1wYWlycy4gIFNvbWV0aW1lcyBob3dldmVyLCBpdCBtYXkgYmUgdXNlZnVsIHRvIHNwZWNpZnkgYSBzaW5nbGUgcGFyc2VyLXdpZGUKLWRlZmF1bHQgZm9yIGFyZ3VtZW50cy4gIFRoaXMgY2FuIGJlIGFjY29tcGxpc2hlZCBieSBwYXNzaW5nIHRoZQotYGBhcmd1bWVudF9kZWZhdWx0PWBgIGtleXdvcmQgYXJndW1lbnQgdG8gOmNsYXNzOmBBcmd1bWVudFBhcnNlcmAuICBGb3IgZXhhbXBsZSwKLXRvIGdsb2JhbGx5IHN1cHByZXNzIGF0dHJpYnV0ZSBjcmVhdGlvbiBvbiA6bWV0aDpgfkFyZ3VtZW50UGFyc2VyLnBhcnNlX2FyZ3NgCi1jYWxscywgd2Ugc3VwcGx5IGBgYXJndW1lbnRfZGVmYXVsdD1TVVBQUkVTU2BgOjoKLQotICAgPj4+IHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGFyZ3VtZW50X2RlZmF1bHQ9YXJncGFyc2UuU1VQUFJFU1MpCi0gICA+Pj4gcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1mb28nKQotICAgPj4+IHBhcnNlci5hZGRfYXJndW1lbnQoJ2JhcicsIG5hcmdzPSc/JykKLSAgID4+PiBwYXJzZXIucGFyc2VfYXJncyhbJy0tZm9vJywgJzEnLCAnQkFSJ10pCi0gICBOYW1lc3BhY2UoYmFyPSdCQVInLCBmb289JzEnKQotICAgPj4+IHBhcnNlci5wYXJzZV9hcmdzKFtdKQotICAgTmFtZXNwYWNlKCkKLQotCiBwYXJlbnRzCiBeXl5eXl5eCiAKQEAgLTQ0MSw2ICs0MzIsNzQgQEAKICAgICAtLWZvbyBGT08gICBGT08hIChkZWZhdWx0OiA0MikKIAogCitwcmVmaXhfY2hhcnMKK15eXl5eXl5eXl5eXgorCitNb3N0IGNvbW1hbmQtbGluZSBvcHRpb25zIHdpbGwgdXNlIGBgLWBgIGFzIHRoZSBwcmVmaXgsIGUuZy4gYGAtZi8tLWZvb2BgLgorUGFyc2VycyB0aGF0IG5lZWQgdG8gc3VwcG9ydCBkaWZmZXJlbnQgb3IgYWRkaXRpb25hbCBwcmVmaXgKK2NoYXJhY3RlcnMsIGUuZy4gZm9yIG9wdGlvbnMKK2xpa2UgYGArZmBgIG9yIGBgL2Zvb2BgLCBtYXkgc3BlY2lmeSB0aGVtIHVzaW5nIHRoZSBgYHByZWZpeF9jaGFycz1gYCBhcmd1bWVudAordG8gdGhlIEFyZ3VtZW50UGFyc2VyIGNvbnN0cnVjdG9yOjoKKworICAgPj4+IHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKHByb2c9J1BST0cnLCBwcmVmaXhfY2hhcnM9Jy0rJykKKyAgID4+PiBwYXJzZXIuYWRkX2FyZ3VtZW50KCcrZicpCisgICA+Pj4gcGFyc2VyLmFkZF9hcmd1bWVudCgnKytiYXInKQorICAgPj4+IHBhcnNlci5wYXJzZV9hcmdzKCcrZiBYICsrYmFyIFknLnNwbGl0KCkpCisgICBOYW1lc3BhY2UoYmFyPSdZJywgZj0nWCcpCisKK1RoZSBgYHByZWZpeF9jaGFycz1gYCBhcmd1bWVudCBkZWZhdWx0cyB0byBgYCctJ2BgLiBTdXBwbHlpbmcgYSBzZXQgb2YKK2NoYXJhY3RlcnMgdGhhdCBkb2VzIG5vdCBpbmNsdWRlIGBgLWBgIHdpbGwgY2F1c2UgYGAtZi8tLWZvb2BgIG9wdGlvbnMgdG8gYmUKK2Rpc2FsbG93ZWQuCisKKworZnJvbWZpbGVfcHJlZml4X2NoYXJzCiteXl5eXl5eXl5eXl5eXl5eXl5eXl4KKworU29tZXRpbWVzLCBmb3IgZXhhbXBsZSB3aGVuIGRlYWxpbmcgd2l0aCBhIHBhcnRpY3VsYXJseSBsb25nIGFyZ3VtZW50IGxpc3RzLCBpdAorbWF5IG1ha2Ugc2Vuc2UgdG8ga2VlcCB0aGUgbGlzdCBvZiBhcmd1bWVudHMgaW4gYSBmaWxlIHJhdGhlciB0aGFuIHR5cGluZyBpdCBvdXQKK2F0IHRoZSBjb21tYW5kIGxpbmUuICBJZiB0aGUgYGBmcm9tZmlsZV9wcmVmaXhfY2hhcnM9YGAgYXJndW1lbnQgaXMgZ2l2ZW4gdG8gdGhlCis6Y2xhc3M6YEFyZ3VtZW50UGFyc2VyYCBjb25zdHJ1Y3RvciwgdGhlbiBhcmd1bWVudHMgdGhhdCBzdGFydCB3aXRoIGFueSBvZiB0aGUKK3NwZWNpZmllZCBjaGFyYWN0ZXJzIHdpbGwgYmUgdHJlYXRlZCBhcyBmaWxlcywgYW5kIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlCithcmd1bWVudHMgdGhleSBjb250YWluLiAgRm9yIGV4YW1wbGU6OgorCisgICA+Pj4gd2l0aCBvcGVuKCdhcmdzLnR4dCcsICd3JykgYXMgZnA6CisgICAuLi4gICAgZnAud3JpdGUoJy1mXG5iYXInKQorICAgPj4+IHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGZyb21maWxlX3ByZWZpeF9jaGFycz0nQCcpCisgICA+Pj4gcGFyc2VyLmFkZF9hcmd1bWVudCgnLWYnKQorICAgPj4+IHBhcnNlci5wYXJzZV9hcmdzKFsnLWYnLCAnZm9vJywgJ0BhcmdzLnR4dCddKQorICAgTmFtZXNwYWNlKGY9J2JhcicpCisKK0FyZ3VtZW50cyByZWFkIGZyb20gYSBmaWxlIG11c3QgYnkgZGVmYXVsdCBiZSBvbmUgcGVyIGxpbmUgKGJ1dCBzZWUgYWxzbworOm1ldGg6YH5Bcmd1bWVudFBhcnNlci5jb252ZXJ0X2FyZ19saW5lX3RvX2FyZ3NgKSBhbmQgYXJlIHRyZWF0ZWQgYXMgaWYgdGhleQord2VyZSBpbiB0aGUgc2FtZSBwbGFjZSBhcyB0aGUgb3JpZ2luYWwgZmlsZSByZWZlcmVuY2luZyBhcmd1bWVudCBvbiB0aGUgY29tbWFuZAorbGluZS4gIFNvIGluIHRoZSBleGFtcGxlIGFib3ZlLCB0aGUgZXhwcmVzc2lvbiBgYFsnLWYnLCAnZm9vJywgJ0BhcmdzLnR4dCddYGAKK2lzIGNvbnNpZGVyZWQgZXF1aXZhbGVudCB0byB0aGUgZXhwcmVzc2lvbiBgYFsnLWYnLCAnZm9vJywgJy1mJywgJ2JhciddYGAuCisKK1RoZSBgYGZyb21maWxlX3ByZWZpeF9jaGFycz1gYCBhcmd1bWVudCBkZWZhdWx0cyB0byBgYE5vbmVgYCwgbWVhbmluZyB0aGF0Cithcmd1bWVudHMgd2lsbCBuZXZlciBiZSB0cmVhdGVkIGFzIGZpbGUgcmVmZXJlbmNlcy4KKworCithcmd1bWVudF9kZWZhdWx0CiteXl5eXl5eXl5eXl5eXl5eCisKK0dlbmVyYWxseSwgYXJndW1lbnQgZGVmYXVsdHMgYXJlIHNwZWNpZmllZCBlaXRoZXIgYnkgcGFzc2luZyBhIGRlZmF1bHQgdG8KKzptZXRoOmB+QXJndW1lbnRQYXJzZXIuYWRkX2FyZ3VtZW50YCBvciBieSBjYWxsaW5nIHRoZQorOm1ldGg6YH5Bcmd1bWVudFBhcnNlci5zZXRfZGVmYXVsdHNgIG1ldGhvZHMgd2l0aCBhIHNwZWNpZmljIHNldCBvZiBuYW1lLXZhbHVlCitwYWlycy4gIFNvbWV0aW1lcyBob3dldmVyLCBpdCBtYXkgYmUgdXNlZnVsIHRvIHNwZWNpZnkgYSBzaW5nbGUgcGFyc2VyLXdpZGUKK2RlZmF1bHQgZm9yIGFyZ3VtZW50cy4gIFRoaXMgY2FuIGJlIGFjY29tcGxpc2hlZCBieSBwYXNzaW5nIHRoZQorYGBhcmd1bWVudF9kZWZhdWx0PWBgIGtleXdvcmQgYXJndW1lbnQgdG8gOmNsYXNzOmBBcmd1bWVudFBhcnNlcmAuICBGb3IgZXhhbXBsZSwKK3RvIGdsb2JhbGx5IHN1cHByZXNzIGF0dHJpYnV0ZSBjcmVhdGlvbiBvbiA6bWV0aDpgfkFyZ3VtZW50UGFyc2VyLnBhcnNlX2FyZ3NgCitjYWxscywgd2Ugc3VwcGx5IGBgYXJndW1lbnRfZGVmYXVsdD1TVVBQUkVTU2BgOjoKKworICAgPj4+IHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGFyZ3VtZW50X2RlZmF1bHQ9YXJncGFyc2UuU1VQUFJFU1MpCisgICA+Pj4gcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1mb28nKQorICAgPj4+IHBhcnNlci5hZGRfYXJndW1lbnQoJ2JhcicsIG5hcmdzPSc/JykKKyAgID4+PiBwYXJzZXIucGFyc2VfYXJncyhbJy0tZm9vJywgJzEnLCAnQkFSJ10pCisgICBOYW1lc3BhY2UoYmFyPSdCQVInLCBmb289JzEnKQorICAgPj4+IHBhcnNlci5wYXJzZV9hcmdzKFtdKQorICAgTmFtZXNwYWNlKCkKKworCiBjb25mbGljdF9oYW5kbGVyCiBeXl5eXl5eXl5eXl5eXl5eCiAKQEAgLTQ3OCwyMiArNTM3LDIwIEBACiBzdHJpbmcgd2FzIG92ZXJyaWRkZW4uCiAKIAotcHJvZwotXl5eXgorYWRkX2hlbHAKK15eXl5eXl5eCiAKLUJ5IGRlZmF1bHQsIDpjbGFzczpgQXJndW1lbnRQYXJzZXJgIG9iamVjdHMgdXNlcyBgYHN5cy5hcmd2WzBdYGAgdG8gZGV0ZXJtaW5lCi1ob3cgdG8gZGlzcGxheSB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSBpbiBoZWxwIG1lc3NhZ2VzLiAgVGhpcyBkZWZhdWx0IGlzIGFsbW9zdAotYWx3YXlzIGRlc2lyYWJsZSBiZWNhdXNlIGl0IHdpbGwgbWFrZSB0aGUgaGVscCBtZXNzYWdlcyBtYXRjaCBob3cgdGhlIHByb2dyYW0gd2FzCi1pbnZva2VkIG9uIHRoZSBjb21tYW5kIGxpbmUuICBGb3IgZXhhbXBsZSwgY29uc2lkZXIgYSBmaWxlIG5hbWVkCi1gYG15cHJvZ3JhbS5weWBgIHdpdGggdGhlIGZvbGxvd2luZyBjb2RlOjoKK0J5IGRlZmF1bHQsIEFyZ3VtZW50UGFyc2VyIG9iamVjdHMgYWRkIGFuIG9wdGlvbiB3aGljaCBzaW1wbHkgZGlzcGxheXMKK3RoZSBwYXJzZXIncyBoZWxwIG1lc3NhZ2UuIEZvciBleGFtcGxlLCBjb25zaWRlciBhIGZpbGUgbmFtZWQKK2BgbXlwcm9ncmFtLnB5YGAgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIGNvZGU6OgogCiAgICBpbXBvcnQgYXJncGFyc2UKICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tZm9vJywgaGVscD0nZm9vIGhlbHAnKQogICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKIAotVGhlIGhlbHAgZm9yIHRoaXMgcHJvZ3JhbSB3aWxsIGRpc3BsYXkgYGBteXByb2dyYW0ucHlgYCBhcyB0aGUgcHJvZ3JhbSBuYW1lCi0ocmVnYXJkbGVzcyBvZiB3aGVyZSB0aGUgcHJvZ3JhbSB3YXMgaW52b2tlZCBmcm9tKTo6CitJZiBgYC1oYGAgb3IgYGAtLWhlbHBgYCBpcyBzdXBwbGllZCBhdCB0aGUgY29tbWFuZCBsaW5lLCB0aGUgQXJndW1lbnRQYXJzZXIKK2hlbHAgd2lsbCBiZSBwcmludGVkOjoKIAogICAgJCBweXRob24gbXlwcm9ncmFtLnB5IC0taGVscAogICAgdXNhZ2U6IG15cHJvZ3JhbS5weSBbLWhdIFstLWZvbyBGT09dCkBAIC01MDEsODIgKzU1OCwzOSBAQAogICAgb3B0aW9uYWwgYXJndW1lbnRzOgogICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKICAgICAtLWZvbyBGT08gICBmb28gaGVscAotICAgJCBjZCAuLgotICAgJCBweXRob24gc3ViZGlyXG15cHJvZ3JhbS5weSAtLWhlbHAKLSAgIHVzYWdlOiBteXByb2dyYW0ucHkgWy1oXSBbLS1mb28gRk9PXQogCi0gICBvcHRpb25hbCBhcmd1bWVudHM6Ci0gICAgLWgsIC0taGVscCAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAotICAgIC0tZm9vIEZPTyAgIGZvbyBoZWxwCitPY2Nhc2lvbmFsbHksIGl0IG1heSBiZSB1c2VmdWwgdG8gZGlzYWJsZSB0aGUgYWRkaXRpb24gb2YgdGhpcyBoZWxwIG9wdGlvbi4KK1RoaXMgY2FuIGJlIGFjaGlldmVkIGJ5IHBhc3NpbmcgYGBGYWxzZWBgIGFzIHRoZSBgYGFkZF9oZWxwPWBgIGFyZ3VtZW50IHRvCis6Y2xhc3M6YEFyZ3VtZW50UGFyc2VyYDo6CiAKLVRvIGNoYW5nZSB0aGlzIGRlZmF1bHQgYmVoYXZpb3IsIGFub3RoZXIgdmFsdWUgY2FuIGJlIHN1cHBsaWVkIHVzaW5nIHRoZQotYGBwcm9nPWBgIGFyZ3VtZW50IHRvIDpjbGFzczpgQXJndW1lbnRQYXJzZXJgOjoKLQotICAgPj4+IHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKHByb2c9J215cHJvZ3JhbScpCisgICA+Pj4gcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIocHJvZz0nUFJPRycsIGFkZF9oZWxwPUZhbHNlKQorICAgPj4+IHBhcnNlci5hZGRfYXJndW1lbnQoJy0tZm9vJywgaGVscD0nZm9vIGhlbHAnKQogICAgPj4+IHBhcnNlci5wcmludF9oZWxwKCkKLSAgIHVzYWdlOiBteXByb2dyYW0gWy1oXQorICAgdXNhZ2U6IFBST0cgWy0tZm9vIEZPT10KIAogICAgb3B0aW9uYWwgYXJndW1lbnRzOgotICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAtLWZvbyBGT08gIGZvbyBoZWxwCiAKLU5vdGUgdGhhdCB0aGUgcHJvZ3JhbSBuYW1lLCB3aGV0aGVyIGRldGVybWluZWQgZnJvbSBgYHN5cy5hcmd2WzBdYGAgb3IgZnJvbSB0aGUKLWBgcHJvZz1gYCBhcmd1bWVudCwgaXMgYXZhaWxhYmxlIHRvIGhlbHAgbWVzc2FnZXMgdXNpbmcgdGhlIGBgJShwcm9nKXNgYCBmb3JtYXQKLXNwZWNpZmllci4KK1RoZSBoZWxwIG9wdGlvbiBpcyB0eXBpY2FsbHkgYGAtaC8tLWhlbHBgYC4gVGhlIGV4Y2VwdGlvbiB0byB0aGlzIGlzCitpZiB0aGUgYGBwcmVmaXhfY2hhcnM9YGAgaXMgc3BlY2lmaWVkIGFuZCBkb2VzIG5vdCBpbmNsdWRlIGBgLWBgLCBpbgord2hpY2ggY2FzZSBgYC1oYGAgYW5kIGBgLS1oZWxwYGAgYXJlIG5vdCB2YWxpZCBvcHRpb25zLiAgSW4KK3RoaXMgY2FzZSwgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiBgYHByZWZpeF9jaGFyc2BgIGlzIHVzZWQgdG8gcHJlZml4Cit0aGUgaGVscCBvcHRpb25zOjoKIAotOjoKLQotICAgPj4+IHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKHByb2c9J215cHJvZ3JhbScpCi0gICA+Pj4gcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1mb28nLCBoZWxwPSdmb28gb2YgdGhlICUocHJvZylzIHByb2dyYW0nKQorICAgPj4+IHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKHByb2c9J1BST0cnLCBwcmVmaXhfY2hhcnM9JysvJykKICAgID4+PiBwYXJzZXIucHJpbnRfaGVscCgpCi0gICB1c2FnZTogbXlwcm9ncmFtIFstaF0gWy0tZm9vIEZPT10KKyAgIHVzYWdlOiBQUk9HIFsraF0KIAogICAgb3B0aW9uYWwgYXJndW1lbnRzOgotICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKLSAgICAtLWZvbyBGT08gICBmb28gb2YgdGhlIG15cHJvZ3JhbSBwcm9ncmFtCi0KLQotdXNhZ2UKLV5eXl5eCi0KLUJ5IGRlZmF1bHQsIDpjbGFzczpgQXJndW1lbnRQYXJzZXJgIGNhbGN1bGF0ZXMgdGhlIHVzYWdlIG1lc3NhZ2UgZnJvbSB0aGUKLWFyZ3VtZW50cyBpdCBjb250YWluczo6Ci0KLSAgID4+PiBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihwcm9nPSdQUk9HJykKLSAgID4+PiBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWZvbycsIG5hcmdzPSc/JywgaGVscD0nZm9vIGhlbHAnKQotICAgPj4+IHBhcnNlci5hZGRfYXJndW1lbnQoJ2JhcicsIG5hcmdzPScrJywgaGVscD0nYmFyIGhlbHAnKQotICAgPj4+IHBhcnNlci5wcmludF9oZWxwKCkKLSAgIHVzYWdlOiBQUk9HIFstaF0gWy0tZm9vIFtGT09dXSBiYXIgW2JhciAuLi5dCi0KLSAgIHBvc2l0aW9uYWwgYXJndW1lbnRzOgotICAgIGJhciAgICAgICAgICBiYXIgaGVscAotCi0gICBvcHRpb25hbCBhcmd1bWVudHM6Ci0gICAgLWgsIC0taGVscCAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKLSAgICAtLWZvbyBbRk9PXSAgZm9vIGhlbHAKLQotVGhlIGRlZmF1bHQgbWVzc2FnZSBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIHRoZSBgYHVzYWdlPWBgIGtleXdvcmQgYXJndW1lbnQ6OgotCi0gICA+Pj4gcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIocHJvZz0nUFJPRycsIHVzYWdlPSclKHByb2cpcyBbb3B0aW9uc10nKQotICAgPj4+IHBhcnNlci5hZGRfYXJndW1lbnQoJy0tZm9vJywgbmFyZ3M9Jz8nLCBoZWxwPSdmb28gaGVscCcpCi0gICA+Pj4gcGFyc2VyLmFkZF9hcmd1bWVudCgnYmFyJywgbmFyZ3M9JysnLCBoZWxwPSdiYXIgaGVscCcpCi0gICA+Pj4gcGFyc2VyLnByaW50X2hlbHAoKQotICAgdXNhZ2U6IFBST0cgW29wdGlvbnNdCi0KLSAgIHBvc2l0aW9uYWwgYXJndW1lbnRzOgotICAgIGJhciAgICAgICAgICBiYXIgaGVscAotCi0gICBvcHRpb25hbCBhcmd1bWVudHM6Ci0gICAgLWgsIC0taGVscCAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKLSAgICAtLWZvbyBbRk9PXSAgZm9vIGhlbHAKLQotVGhlIGBgJShwcm9nKXNgYCBmb3JtYXQgc3BlY2lmaWVyIGlzIGF2YWlsYWJsZSB0byBmaWxsIGluIHRoZSBwcm9ncmFtIG5hbWUgaW4KLXlvdXIgdXNhZ2UgbWVzc2FnZXMuCisgICAgICtoLCArK2hlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKIAogCiBUaGUgYWRkX2FyZ3VtZW50KCkgbWV0aG9kCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS4uIG1ldGhvZDo6IEFyZ3VtZW50UGFyc2VyLmFkZF9hcmd1bWVudChuYW1lIG9yIGZsYWdzLi4uLCBbYWN0aW9uXSwgW25hcmdzXSwgW2NvbnN0XSwgW2RlZmF1bHRdLCBbdHlwZV0sIFtjaG9pY2VzXSwgW3JlcXVpcmVkXSwgW2hlbHBdLCBbbWV0YXZhcl0sIFtkZXN0XSkKKy4uIG1ldGhvZDo6IEFyZ3VtZW50UGFyc2VyLmFkZF9hcmd1bWVudChuYW1lIG9yIGZsYWdzLi4uLCBbYWN0aW9uXSwgW25hcmdzXSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnN0XSwgW2RlZmF1bHRdLCBbdHlwZV0sIFtjaG9pY2VzXSwgW3JlcXVpcmVkXSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hlbHBdLCBbbWV0YXZhcl0sIFtkZXN0XSkKIAogICAgRGVmaW5lIGhvdyBhIHNpbmdsZSBjb21tYW5kLWxpbmUgYXJndW1lbnQgc2hvdWxkIGJlIHBhcnNlZC4gIEVhY2ggcGFyYW1ldGVyCiAgICBoYXMgaXRzIG93biBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIGJlbG93LCBidXQgaW4gc2hvcnQgdGhleSBhcmU6CkBAIC03MDMsOSArNzE3LDIyIEBACiAgICAgPj4+IHBhcnNlci5wYXJzZV9hcmdzKCctLXN0ciAtLWludCcuc3BsaXQoKSkKICAgICBOYW1lc3BhY2UodHlwZXM9Wzx0eXBlICdzdHInPiwgPHR5cGUgJ2ludCc+XSkKIAorKiBgYCdjb3VudCdgYCAtIFRoaXMgY291bnRzIHRoZSBudW1iZXIgb2YgdGltZXMgYSBrZXl3b3JkIGFyZ3VtZW50IG9jY3Vycy4gRm9yCisgIGV4YW1wbGUsIHRoaXMgaXMgdXNlZnVsIGZvciBpbmNyZWFzaW5nIHZlcmJvc2l0eSBsZXZlbHM6OgorCisgICAgPj4+IHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICA+Pj4gcGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJib3NlJywgJy12JywgYWN0aW9uPSdjb3VudCcpCisgICAgPj4+IHBhcnNlci5wYXJzZV9hcmdzKCctdnZ2Jy5zcGxpdCgpKQorICAgIE5hbWVzcGFjZSh2ZXJib3NlPTMpCisKKyogYGAnaGVscCdgYCAtIFRoaXMgcHJpbnRzIGEgY29tcGxldGUgaGVscCBtZXNzYWdlIGZvciBhbGwgdGhlIG9wdGlvbnMgaW4gdGhlCisgIGN1cnJlbnQgcGFyc2VyIGFuZCB0aGVuIGV4aXRzLiBCeSBkZWZhdWx0IGEgaGVscCBhY3Rpb24gaXMgYXV0b21hdGljYWxseQorICBhZGRlZCB0byB0aGUgcGFyc2VyLiBTZWUgOmNsYXNzOmBBcmd1bWVudFBhcnNlcmAgZm9yIGRldGFpbHMgb2YgaG93IHRoZQorICBvdXRwdXQgaXMgY3JlYXRlZC4KKwogKiBgYCd2ZXJzaW9uJ2BgIC0gVGhpcyBleHBlY3RzIGEgYGB2ZXJzaW9uPWBgIGtleXdvcmQgYXJndW1lbnQgaW4gdGhlCiAgIDptZXRoOmB+QXJndW1lbnRQYXJzZXIuYWRkX2FyZ3VtZW50YCBjYWxsLCBhbmQgcHJpbnRzIHZlcnNpb24gaW5mb3JtYXRpb24KLSAgYW5kIGV4aXRzIHdoZW4gaW52b2tlZC4KKyAgYW5kIGV4aXRzIHdoZW4gaW52b2tlZDo6CiAKICAgICA+Pj4gaW1wb3J0IGFyZ3BhcnNlCiAgICAgPj4+IHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKHByb2c9J1BST0cnKQpAQCAtNzQ4LDggKzc3NSw4IEBACiBkaWZmZXJlbnQgbnVtYmVyIG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgd2l0aCBhIHNpbmdsZSBhY3Rpb24uICBUaGUgc3VwcG9ydGVkCiB2YWx1ZXMgYXJlOgogCi0qIGBgTmBgIChhbiBpbnRlZ2VyKS4gIGBgTmBgIGFyZ3VtZW50cyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgd2lsbCBiZSBnYXRoZXJlZCB0b2dldGhlciBpbnRvIGEKLSAgbGlzdC4gIEZvciBleGFtcGxlOjoKKyogYGBOYGAgKGFuIGludGVnZXIpLiAgYGBOYGAgYXJndW1lbnRzIGZyb20gdGhlIGNvbW1hbmQgbGluZSB3aWxsIGJlIGdhdGhlcmVkCisgIHRvZ2V0aGVyIGludG8gYSBsaXN0LiAgRm9yIGV4YW1wbGU6OgogCiAgICAgID4+PiBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCiAgICAgID4+PiBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWZvbycsIG5hcmdzPTIpCkBAIC04MTYsNiArODQzLDE3IEBACiAgICAgIHVzYWdlOiBQUk9HIFstaF0gZm9vIFtmb28gLi4uXQogICAgICBQUk9HOiBlcnJvcjogdG9vIGZldyBhcmd1bWVudHMKIAorKiBgYGFyZ3BhcnNlLlJFTUFJTkRFUmBgLiAgQWxsIHRoZSByZW1haW5pbmcgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBhcmUgZ2F0aGVyZWQKKyAgaW50byBhIGxpc3QuICBUaGlzIGlzIGNvbW1vbmx5IHVzZWZ1bCBmb3IgY29tbWFuZCBsaW5lIHV0aWxpdGllcyB0aGF0IGRpc3BhdGNoCisgIHRvIG90aGVyIGNvbW1hbmQgbGluZSB1dGlsaXRpZXM6OgorCisgICAgID4+PiBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihwcm9nPSdQUk9HJykKKyAgICAgPj4+IHBhcnNlci5hZGRfYXJndW1lbnQoJy0tZm9vJykKKyAgICAgPj4+IHBhcnNlci5hZGRfYXJndW1lbnQoJ2NvbW1hbmQnKQorICAgICA+Pj4gcGFyc2VyLmFkZF9hcmd1bWVudCgnYXJncycsIG5hcmdzPWFyZ3BhcnNlLlJFTUFJTkRFUikKKyAgICAgPj4+IHByaW50IHBhcnNlci5wYXJzZV9hcmdzKCctLWZvbyBCIGNtZCAtLWFyZzEgWFggWlonLnNwbGl0KCkpCisgICAgIE5hbWVzcGFjZShhcmdzPVsnLS1hcmcxJywgJ1hYJywgJ1paJ10sIGNvbW1hbmQ9J2NtZCcsIGZvbz0nQicpCisKIElmIHRoZSBgYG5hcmdzYGAga2V5d29yZCBhcmd1bWVudCBpcyBub3QgcHJvdmlkZWQsIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGNvbnN1bWVkCiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhY3Rpb25fLiAgR2VuZXJhbGx5IHRoaXMgbWVhbnMgYSBzaW5nbGUgY29tbWFuZC1saW5lIGFyZ3VtZW50CiB3aWxsIGJlIGNvbnN1bWVkIGFuZCBhIHNpbmdsZSBpdGVtIChub3QgYSBsaXN0KSB3aWxsIGJlIHByb2R1Y2VkLgpAQCAtODMwLDcgKzg2OCw4IEBACiAKICogV2hlbiA6bWV0aDpgfkFyZ3VtZW50UGFyc2VyLmFkZF9hcmd1bWVudGAgaXMgY2FsbGVkIHdpdGgKICAgYGBhY3Rpb249J3N0b3JlX2NvbnN0J2BgIG9yIGBgYWN0aW9uPSdhcHBlbmRfY29uc3QnYGAuICBUaGVzZSBhY3Rpb25zIGFkZCB0aGUKLSAgYGBjb25zdGBgIHZhbHVlIHRvIG9uZSBvZiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IDptZXRoOmB+QXJndW1lbnRQYXJzZXIucGFyc2VfYXJnc2AuIFNlZSB0aGUgYWN0aW9uXyBkZXNjcmlwdGlvbiBmb3IgZXhhbXBsZXMuCisgIGBgY29uc3RgYCB2YWx1ZSB0byBvbmUgb2YgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG9iamVjdCByZXR1cm5lZCBieQorICA6bWV0aDpgfkFyZ3VtZW50UGFyc2VyLnBhcnNlX2FyZ3NgLiBTZWUgdGhlIGFjdGlvbl8gZGVzY3JpcHRpb24gZm9yIGV4YW1wbGVzLgogCiAqIFdoZW4gOm1ldGg6YH5Bcmd1bWVudFBhcnNlci5hZGRfYXJndW1lbnRgIGlzIGNhbGxlZCB3aXRoIG9wdGlvbiBzdHJpbmdzCiAgIChsaWtlIGBgLWZgYCBvciBgYC0tZm9vYGApIGFuZCBgYG5hcmdzPSc/J2BgLiAgVGhpcyBjcmVhdGVzIGFuIG9wdGlvbmFsCkBAIC04NTksNiArODk4LDE3IEBACiAgICA+Pj4gcGFyc2VyLnBhcnNlX2FyZ3MoJycuc3BsaXQoKSkKICAgIE5hbWVzcGFjZShmb289NDIpCiAKK0lmIHRoZSBgYGRlZmF1bHRgYCB2YWx1ZSBpcyBhIHN0cmluZywgdGhlIHBhcnNlciBwYXJzZXMgdGhlIHZhbHVlIGFzIGlmIGl0Cit3ZXJlIGEgY29tbWFuZC1saW5lIGFyZ3VtZW50LiAgSW4gcGFydGljdWxhciwgdGhlIHBhcnNlciBhcHBsaWVzIGFueSB0eXBlXworY29udmVyc2lvbiBhcmd1bWVudCwgaWYgcHJvdmlkZWQsIGJlZm9yZSBzZXR0aW5nIHRoZSBhdHRyaWJ1dGUgb24gdGhlCis6Y2xhc3M6YE5hbWVzcGFjZWAgcmV0dXJuIHZhbHVlLiAgT3RoZXJ3aXNlLCB0aGUgcGFyc2VyIHVzZXMgdGhlIHZhbHVlIGFzIGlzOjoKKworICAgPj4+IHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgID4+PiBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWxlbmd0aCcsIGRlZmF1bHQ9JzEwJywgdHlwZT1pbnQpCisgICA+Pj4gcGFyc2VyLmFkZF9hcmd1bWVudCgnLS13aWR0aCcsIGRlZmF1bHQ9MTAuNSwgdHlwZT1pbnQpCisgICA+Pj4gcGFyc2VyLnBhcnNlX2FyZ3MoKQorICAgTmFtZXNwYWNlKGxlbmd0aD0xMCwgd2lkdGg9MTAuNSkKKwogRm9yIHBvc2l0aW9uYWwgYXJndW1lbnRzIHdpdGggbmFyZ3NfIGVxdWFsIHRvIGBgP2BgIG9yIGBgKmBgLCB0aGUgYGBkZWZhdWx0YGAgdmFsdWUKIGlzIHVzZWQgd2hlbiBubyBjb21tYW5kLWxpbmUgYXJndW1lbnQgd2FzIHByZXNlbnQ6OgogCkBAIC04OTcsNiArOTQ3LDkgQEAKICAgID4+PiBwYXJzZXIucGFyc2VfYXJncygnMiB0ZW1wLnR4dCcuc3BsaXQoKSkKICAgIE5hbWVzcGFjZShiYXI9PG9wZW4gZmlsZSAndGVtcC50eHQnLCBtb2RlICdyJyBhdCAweC4uLj4sIGZvbz0yKQogCitTZWUgdGhlIHNlY3Rpb24gb24gdGhlIGRlZmF1bHRfIGtleXdvcmQgYXJndW1lbnQgZm9yIGluZm9ybWF0aW9uIG9uIHdoZW4gdGhlCitgYHR5cGVgYCBhcmd1bWVudCBpcyBhcHBsaWVkIHRvIGRlZmF1bHQgYXJndW1lbnRzLgorCiBUbyBlYXNlIHRoZSB1c2Ugb2YgdmFyaW91cyB0eXBlcyBvZiBmaWxlcywgdGhlIGFyZ3BhcnNlIG1vZHVsZSBwcm92aWRlcyB0aGUKIGZhY3RvcnkgRmlsZVR5cGUgd2hpY2ggdGFrZXMgdGhlIGBgbW9kZT1gYCBhbmQgYGBidWZzaXplPWBgIGFyZ3VtZW50cyBvZiB0aGUKIGBgZmlsZWBgIG9iamVjdC4gIEZvciBleGFtcGxlLCBgYEZpbGVUeXBlKCd3JylgYCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYQpAQCAtOTQ0LDMyICs5OTcsMzMgQEAKIF5eXl5eXl4KIAogU29tZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHNob3VsZCBiZSBzZWxlY3RlZCBmcm9tIGEgcmVzdHJpY3RlZCBzZXQgb2YgdmFsdWVzLgotVGhlc2UgY2FuIGJlIGhhbmRsZWQgYnkgcGFzc2luZyBhIGNvbnRhaW5lciBvYmplY3QgYXMgdGhlIGBgY2hvaWNlc2BgIGtleXdvcmQKK1RoZXNlIGNhbiBiZSBoYW5kbGVkIGJ5IHBhc3NpbmcgYSBjb250YWluZXIgb2JqZWN0IGFzIHRoZSAqY2hvaWNlcyoga2V5d29yZAogYXJndW1lbnQgdG8gOm1ldGg6YH5Bcmd1bWVudFBhcnNlci5hZGRfYXJndW1lbnRgLiAgV2hlbiB0aGUgY29tbWFuZCBsaW5lIGlzCi1wYXJzZWQsIGFyZ3VtZW50IHZhbHVlcyB3aWxsIGJlIGNoZWNrZWQsIGFuZCBhbiBlcnJvciBtZXNzYWdlIHdpbGwgYmUgZGlzcGxheWVkIGlmCi10aGUgYXJndW1lbnQgd2FzIG5vdCBvbmUgb2YgdGhlIGFjY2VwdGFibGUgdmFsdWVzOjoKK3BhcnNlZCwgYXJndW1lbnQgdmFsdWVzIHdpbGwgYmUgY2hlY2tlZCwgYW5kIGFuIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBkaXNwbGF5ZWQKK2lmIHRoZSBhcmd1bWVudCB3YXMgbm90IG9uZSBvZiB0aGUgYWNjZXB0YWJsZSB2YWx1ZXM6OgogCi0gICA+Pj4gcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIocHJvZz0nUFJPRycpCi0gICA+Pj4gcGFyc2VyLmFkZF9hcmd1bWVudCgnZm9vJywgY2hvaWNlcz0nYWJjJykKLSAgID4+PiBwYXJzZXIucGFyc2VfYXJncygnYycuc3BsaXQoKSkKLSAgIE5hbWVzcGFjZShmb289J2MnKQotICAgPj4+IHBhcnNlci5wYXJzZV9hcmdzKCdYJy5zcGxpdCgpKQotICAgdXNhZ2U6IFBST0cgWy1oXSB7YSxiLGN9Ci0gICBQUk9HOiBlcnJvcjogYXJndW1lbnQgZm9vOiBpbnZhbGlkIGNob2ljZTogJ1gnIChjaG9vc2UgZnJvbSAnYScsICdiJywgJ2MnKQorICAgPj4+IHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKHByb2c9J2dhbWUucHknKQorICAgPj4+IHBhcnNlci5hZGRfYXJndW1lbnQoJ21vdmUnLCBjaG9pY2VzPVsncm9jaycsICdwYXBlcicsICdzY2lzc29ycyddKQorICAgPj4+IHBhcnNlci5wYXJzZV9hcmdzKFsncm9jayddKQorICAgTmFtZXNwYWNlKG1vdmU9J3JvY2snKQorICAgPj4+IHBhcnNlci5wYXJzZV9hcmdzKFsnZmlyZSddKQorICAgdXNhZ2U6IGdhbWUucHkgWy1oXSB7cm9jayxwYXBlcixzY2lzc29yc30KKyAgIGdhbWUucHk6IGVycm9yOiBhcmd1bWVudCBtb3ZlOiBpbnZhbGlkIGNob2ljZTogJ2ZpcmUnIChjaG9vc2UgZnJvbSAncm9jaycsCisgICAncGFwZXInLCAnc2Npc3NvcnMnKQogCi1Ob3RlIHRoYXQgaW5jbHVzaW9uIGluIHRoZSBgYGNob2ljZXNgYCBjb250YWluZXIgaXMgY2hlY2tlZCBhZnRlciBhbnkgdHlwZV8KLWNvbnZlcnNpb25zIGhhdmUgYmVlbiBwZXJmb3JtZWQsIHNvIHRoZSB0eXBlIG9mIHRoZSBvYmplY3RzIGluIHRoZSBgYGNob2ljZXNgYAorTm90ZSB0aGF0IGluY2x1c2lvbiBpbiB0aGUgKmNob2ljZXMqIGNvbnRhaW5lciBpcyBjaGVja2VkIGFmdGVyIGFueSB0eXBlXworY29udmVyc2lvbnMgaGF2ZSBiZWVuIHBlcmZvcm1lZCwgc28gdGhlIHR5cGUgb2YgdGhlIG9iamVjdHMgaW4gdGhlICpjaG9pY2VzKgogY29udGFpbmVyIHNob3VsZCBtYXRjaCB0aGUgdHlwZV8gc3BlY2lmaWVkOjoKIAotICAgPj4+IHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKHByb2c9J1BST0cnKQotICAgPj4+IHBhcnNlci5hZGRfYXJndW1lbnQoJ2ZvbycsIHR5cGU9Y29tcGxleCwgY2hvaWNlcz1bMSwgMWpdKQotICAgPj4+IHBhcnNlci5wYXJzZV9hcmdzKCcxaicuc3BsaXQoKSkKLSAgIE5hbWVzcGFjZShmb289MWopCi0gICA+Pj4gcGFyc2VyLnBhcnNlX2FyZ3MoJy0tIC00Jy5zcGxpdCgpKQotICAgdXNhZ2U6IFBST0cgWy1oXSB7MSwxan0KLSAgIFBST0c6IGVycm9yOiBhcmd1bWVudCBmb286IGludmFsaWQgY2hvaWNlOiAoLTQrMGopIChjaG9vc2UgZnJvbSAxLCAxaikKKyAgID4+PiBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihwcm9nPSdkb29ycy5weScpCisgICA+Pj4gcGFyc2VyLmFkZF9hcmd1bWVudCgnZG9vcicsIHR5cGU9aW50LCBjaG9pY2VzPXJhbmdlKDEsIDQpKQorICAgPj4+IHByaW50KHBhcnNlci5wYXJzZV9hcmdzKFsnMyddKSkKKyAgIE5hbWVzcGFjZShkb29yPTMpCisgICA+Pj4gcGFyc2VyLnBhcnNlX2FyZ3MoWyc0J10pCisgICB1c2FnZTogZG9vcnMucHkgWy1oXSB7MSwyLDN9CisgICBkb29ycy5weTogZXJyb3I6IGFyZ3VtZW50IGRvb3I6IGludmFsaWQgY2hvaWNlOiA0IChjaG9vc2UgZnJvbSAxLCAyLCAzKQogCi1Bbnkgb2JqZWN0IHRoYXQgc3VwcG9ydHMgdGhlIGBgaW5gYCBvcGVyYXRvciBjYW4gYmUgcGFzc2VkIGFzIHRoZSBgYGNob2ljZXNgYAorQW55IG9iamVjdCB0aGF0IHN1cHBvcnRzIHRoZSBgYGluYGAgb3BlcmF0b3IgY2FuIGJlIHBhc3NlZCBhcyB0aGUgKmNob2ljZXMqCiB2YWx1ZSwgc28gOmNsYXNzOmBkaWN0YCBvYmplY3RzLCA6Y2xhc3M6YHNldGAgb2JqZWN0cywgY3VzdG9tIGNvbnRhaW5lcnMsCiBldGMuIGFyZSBhbGwgc3VwcG9ydGVkLgogCkBAIC0xMDQwLDExICsxMDk0LDIyIEBACiAgICBvcHRpb25hbCBhcmd1bWVudHM6CiAgICAgLWgsIC0taGVscCAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAogCis6bW9kOmBhcmdwYXJzZWAgc3VwcG9ydHMgc2lsZW5jaW5nIHRoZSBoZWxwIGVudHJ5IGZvciBjZXJ0YWluIG9wdGlvbnMsIGJ5CitzZXR0aW5nIHRoZSBgYGhlbHBgYCB2YWx1ZSB0byBgYGFyZ3BhcnNlLlNVUFBSRVNTYGA6OgorCisgICA+Pj4gcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIocHJvZz0nZnJvYmJsZScpCisgICA+Pj4gcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1mb28nLCBoZWxwPWFyZ3BhcnNlLlNVUFBSRVNTKQorICAgPj4+IHBhcnNlci5wcmludF9oZWxwKCkKKyAgIHVzYWdlOiBmcm9iYmxlIFstaF0KKworICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisKIAogbWV0YXZhcgogXl5eXl5eXgogCi1XaGVuIDpjbGFzczpgQXJndW1lbnRQYXJzZXJgIGdlbmVyYXRlcyBoZWxwIG1lc3NhZ2VzLCBpdCBuZWVkIHNvbWUgd2F5IHRvIHJlZmVyCitXaGVuIDpjbGFzczpgQXJndW1lbnRQYXJzZXJgIGdlbmVyYXRlcyBoZWxwIG1lc3NhZ2VzLCBpdCBuZWVkcyBzb21lIHdheSB0byByZWZlcgogdG8gZWFjaCBleHBlY3RlZCBhcmd1bWVudC4gIEJ5IGRlZmF1bHQsIEFyZ3VtZW50UGFyc2VyIG9iamVjdHMgdXNlIHRoZSBkZXN0XwogdmFsdWUgYXMgdGhlICJuYW1lIiBvZiBlYWNoIG9iamVjdC4gIEJ5IGRlZmF1bHQsIGZvciBwb3NpdGlvbmFsIGFyZ3VtZW50CiBhY3Rpb25zLCB0aGUgZGVzdF8gdmFsdWUgaXMgdXNlZCBkaXJlY3RseSwgYW5kIGZvciBvcHRpb25hbCBhcmd1bWVudCBhY3Rpb25zLApAQCAtMTMyMCwxMiArMTM4NSwxNCBAQAogICAgPj4+IHBhcnNlci5wYXJzZV9hcmdzKFsnLS0nLCAnLWYnXSkKICAgIE5hbWVzcGFjZShmb289Jy1mJywgb25lPU5vbmUpCiAKKy4uIF9wcmVmaXgtbWF0Y2hpbmc6CiAKLUFyZ3VtZW50IGFiYnJldmlhdGlvbnMKLV5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KK0FyZ3VtZW50IGFiYnJldmlhdGlvbnMgKHByZWZpeCBtYXRjaGluZykKK15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KIAogVGhlIDptZXRoOmB+QXJndW1lbnRQYXJzZXIucGFyc2VfYXJnc2AgbWV0aG9kIGFsbG93cyBsb25nIG9wdGlvbnMgdG8gYmUKLWFiYnJldmlhdGVkIGlmIHRoZSBhYmJyZXZpYXRpb24gaXMgdW5hbWJpZ3VvdXM6OgorYWJicmV2aWF0ZWQgdG8gYSBwcmVmaXgsIGlmIHRoZSBhYmJyZXZpYXRpb24gaXMgdW5hbWJpZ3VvdXMgKHRoZSBwcmVmaXggbWF0Y2hlcworYSB1bmlxdWUgb3B0aW9uKTo6CiAKICAgID4+PiBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihwcm9nPSdQUk9HJykKICAgID4+PiBwYXJzZXIuYWRkX2FyZ3VtZW50KCctYmFjb24nKQpAQCAtMTQwMSw3ICsxNDY4LDEwIEBACiBTdWItY29tbWFuZHMKIF5eXl5eXl5eXl5eXgogCi0uLiBtZXRob2Q6OiBBcmd1bWVudFBhcnNlci5hZGRfc3VicGFyc2VycygpCisuLiBtZXRob2Q6OiBBcmd1bWVudFBhcnNlci5hZGRfc3VicGFyc2VycyhbdGl0bGVdLCBbZGVzY3JpcHRpb25dLCBbcHJvZ10sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYXJzZXJfY2xhc3NdLCBbYWN0aW9uXSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbl9zdHJpbmddLCBbZGVzdF0sIFtoZWxwXSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21ldGF2YXJdKQogCiAgICBNYW55IHByb2dyYW1zIHNwbGl0IHVwIHRoZWlyIGZ1bmN0aW9uYWxpdHkgaW50byBhIG51bWJlciBvZiBzdWItY29tbWFuZHMsCiAgICBmb3IgZXhhbXBsZSwgdGhlIGBgc3ZuYGAgcHJvZ3JhbSBjYW4gaW52b2tlIHN1Yi1jb21tYW5kcyBsaWtlIGBgc3ZuCkBAIC0xNDEwLDExICsxNDgwLDM1IEBACiAgICBkaWZmZXJlbnQgZnVuY3Rpb25zIHdoaWNoIHJlcXVpcmUgZGlmZmVyZW50IGtpbmRzIG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuCiAgICA6Y2xhc3M6YEFyZ3VtZW50UGFyc2VyYCBzdXBwb3J0cyB0aGUgY3JlYXRpb24gb2Ygc3VjaCBzdWItY29tbWFuZHMgd2l0aCB0aGUKICAgIDptZXRoOmBhZGRfc3VicGFyc2Vyc2AgbWV0aG9kLiAgVGhlIDptZXRoOmBhZGRfc3VicGFyc2Vyc2AgbWV0aG9kIGlzIG5vcm1hbGx5Ci0gICBjYWxsZWQgd2l0aCBubyBhcmd1bWVudHMgYW5kIHJldHVybnMgYW4gc3BlY2lhbCBhY3Rpb24gb2JqZWN0LiAgVGhpcyBvYmplY3QKKyAgIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cyBhbmQgcmV0dXJucyBhIHNwZWNpYWwgYWN0aW9uIG9iamVjdC4gIFRoaXMgb2JqZWN0CiAgICBoYXMgYSBzaW5nbGUgbWV0aG9kLCA6bWV0aDpgfkFyZ3VtZW50UGFyc2VyLmFkZF9wYXJzZXJgLCB3aGljaCB0YWtlcyBhCiAgICBjb21tYW5kIG5hbWUgYW5kIGFueSA6Y2xhc3M6YEFyZ3VtZW50UGFyc2VyYCBjb25zdHJ1Y3RvciBhcmd1bWVudHMsIGFuZAogICAgcmV0dXJucyBhbiA6Y2xhc3M6YEFyZ3VtZW50UGFyc2VyYCBvYmplY3QgdGhhdCBjYW4gYmUgbW9kaWZpZWQgYXMgdXN1YWwuCiAKKyAgIERlc2NyaXB0aW9uIG9mIHBhcmFtZXRlcnM6CisKKyAgICogdGl0bGUgLSB0aXRsZSBmb3IgdGhlIHN1Yi1wYXJzZXIgZ3JvdXAgaW4gaGVscCBvdXRwdXQ7IGJ5IGRlZmF1bHQKKyAgICAgInN1YmNvbW1hbmRzIiBpZiBkZXNjcmlwdGlvbiBpcyBwcm92aWRlZCwgb3RoZXJ3aXNlIHVzZXMgdGl0bGUgZm9yCisgICAgIHBvc2l0aW9uYWwgYXJndW1lbnRzCisKKyAgICogZGVzY3JpcHRpb24gLSBkZXNjcmlwdGlvbiBmb3IgdGhlIHN1Yi1wYXJzZXIgZ3JvdXAgaW4gaGVscCBvdXRwdXQsIGJ5CisgICAgIGRlZmF1bHQgTm9uZQorCisgICAqIHByb2cgLSB1c2FnZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIHdpdGggc3ViLWNvbW1hbmQgaGVscCwKKyAgICAgYnkgZGVmYXVsdCB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSBhbmQgYW55IHBvc2l0aW9uYWwgYXJndW1lbnRzIGJlZm9yZSB0aGUKKyAgICAgc3VicGFyc2VyIGFyZ3VtZW50CisKKyAgICogcGFyc2VyX2NsYXNzIC0gY2xhc3Mgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBzdWItcGFyc2VyIGluc3RhbmNlcywgYnkKKyAgICAgZGVmYXVsdCB0aGUgY2xhc3Mgb2YgdGhlIGN1cnJlbnQgcGFyc2VyIChlLmcuIEFyZ3VtZW50UGFyc2VyKQorCisgICAqIGRlc3QgLSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdW5kZXIgd2hpY2ggc3ViLWNvbW1hbmQgbmFtZSB3aWxsIGJlCisgICAgIHN0b3JlZDsgYnkgZGVmYXVsdCBOb25lIGFuZCBubyB2YWx1ZSBpcyBzdG9yZWQKKworICAgKiBoZWxwIC0gaGVscCBmb3Igc3ViLXBhcnNlciBncm91cCBpbiBoZWxwIG91dHB1dCwgYnkgZGVmYXVsdCBOb25lCisKKyAgICogbWV0YXZhciAtIHN0cmluZyBwcmVzZW50aW5nIGF2YWlsYWJsZSBzdWItY29tbWFuZHMgaW4gaGVscDsgYnkgZGVmYXVsdCBpdAorICAgICBpcyBOb25lIGFuZCBwcmVzZW50cyBzdWItY29tbWFuZHMgaW4gZm9ybSB7Y21kMSwgY21kMiwgLi59CisKICAgIFNvbWUgZXhhbXBsZSB1c2FnZTo6CiAKICAgICAgPj4+ICMgY3JlYXRlIHRoZSB0b3AtbGV2ZWwgcGFyc2VyCkBAIC0xNDU2LDggKzE1NTAsOCBAQAogCiAgICAgIHBvc2l0aW9uYWwgYXJndW1lbnRzOgogICAgICAgIHthLGJ9ICAgc3ViLWNvbW1hbmQgaGVscAotICAgICBhICAgICBhIGhlbHAKLSAgICAgYiAgICAgYiBoZWxwCisgICAgICAgICBhICAgICBhIGhlbHAKKyAgICAgICAgIGIgICAgIGIgaGVscAogCiAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKICAgICAgICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CkBAIC0xNTM4LDcgKzE2MzIsNyBAQAogICAgICA+Pj4gYXJncy5mdW5jKGFyZ3MpCiAgICAgICgoWFlaWVgpKQogCi0gICBUaGlzIHdheSwgeW91IGNhbiBsZXQgOm1ldGg6YHBhcnNlX2FyZ3NgIGRvZXMgdGhlIGpvYiBvZiBjYWxsaW5nIHRoZQorICAgVGhpcyB3YXksIHlvdSBjYW4gbGV0IDptZXRoOmBwYXJzZV9hcmdzYCBkbyB0aGUgam9iIG9mIGNhbGxpbmcgdGhlCiAgICBhcHByb3ByaWF0ZSBmdW5jdGlvbiBhZnRlciBhcmd1bWVudCBwYXJzaW5nIGlzIGNvbXBsZXRlLiAgQXNzb2NpYXRpbmcKICAgIGZ1bmN0aW9ucyB3aXRoIGFjdGlvbnMgbGlrZSB0aGlzIGlzIHR5cGljYWxseSB0aGUgZWFzaWVzdCB3YXkgdG8gaGFuZGxlIHRoZQogICAgZGlmZmVyZW50IGFjdGlvbnMgZm9yIGVhY2ggb2YgeW91ciBzdWJwYXJzZXJzLiAgSG93ZXZlciwgaWYgaXQgaXMgbmVjZXNzYXJ5CkBAIC0xNTYzLDIxICsxNjU3LDIxIEBACiAgICBUaGUgOmNsYXNzOmBGaWxlVHlwZWAgZmFjdG9yeSBjcmVhdGVzIG9iamVjdHMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSB0eXBlCiAgICBhcmd1bWVudCBvZiA6bWV0aDpgQXJndW1lbnRQYXJzZXIuYWRkX2FyZ3VtZW50YC4gIEFyZ3VtZW50cyB0aGF0IGhhdmUKICAgIDpjbGFzczpgRmlsZVR5cGVgIG9iamVjdHMgYXMgdGhlaXIgdHlwZSB3aWxsIG9wZW4gY29tbWFuZC1saW5lIGFyZ3VtZW50cyBhcyBmaWxlcwotICAgd2l0aCB0aGUgcmVxdWVzdGVkIG1vZGVzIGFuZCBidWZmZXIgc2l6ZXM6CisgICB3aXRoIHRoZSByZXF1ZXN0ZWQgbW9kZXMgYW5kIGJ1ZmZlciBzaXplczo6CiAKLSAgID4+PiBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCi0gICA+Pj4gcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1vdXRwdXQnLCB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCd3YicsIDApKQotICAgPj4+IHBhcnNlci5wYXJzZV9hcmdzKFsnLS1vdXRwdXQnLCAnb3V0J10pCi0gICBOYW1lc3BhY2Uob3V0cHV0PTxvcGVuIGZpbGUgJ291dCcsIG1vZGUgJ3diJyBhdCAweC4uLj4pCisgICAgICA+Pj4gcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgICAgPj4+IHBhcnNlci5hZGRfYXJndW1lbnQoJy0tb3V0cHV0JywgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgnd2InLCAwKSkKKyAgICAgID4+PiBwYXJzZXIucGFyc2VfYXJncyhbJy0tb3V0cHV0JywgJ291dCddKQorICAgICAgTmFtZXNwYWNlKG91dHB1dD08b3BlbiBmaWxlICdvdXQnLCBtb2RlICd3YicgYXQgMHguLi4+KQogCiAgICBGaWxlVHlwZSBvYmplY3RzIHVuZGVyc3RhbmQgdGhlIHBzZXVkby1hcmd1bWVudCBgYCctJ2BgIGFuZCBhdXRvbWF0aWNhbGx5CiAgICBjb252ZXJ0IHRoaXMgaW50byBgYHN5cy5zdGRpbmBgIGZvciByZWFkYWJsZSA6Y2xhc3M6YEZpbGVUeXBlYCBvYmplY3RzIGFuZAotICAgYGBzeXMuc3Rkb3V0YGAgZm9yIHdyaXRhYmxlIDpjbGFzczpgRmlsZVR5cGVgIG9iamVjdHM6CisgICBgYHN5cy5zdGRvdXRgYCBmb3Igd3JpdGFibGUgOmNsYXNzOmBGaWxlVHlwZWAgb2JqZWN0czo6CiAKLSAgID4+PiBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCi0gICA+Pj4gcGFyc2VyLmFkZF9hcmd1bWVudCgnaW5maWxlJywgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgncicpKQotICAgPj4+IHBhcnNlci5wYXJzZV9hcmdzKFsnLSddKQotICAgTmFtZXNwYWNlKGluZmlsZT08b3BlbiBmaWxlICc8c3RkaW4+JywgbW9kZSAncicgYXQgMHguLi4+KQorICAgICAgPj4+IHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICAgID4+PiBwYXJzZXIuYWRkX2FyZ3VtZW50KCdpbmZpbGUnLCB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyJykpCisgICAgICA+Pj4gcGFyc2VyLnBhcnNlX2FyZ3MoWyctJ10pCisgICAgICBOYW1lc3BhY2UoaW5maWxlPTxvcGVuIGZpbGUgJzxzdGRpbj4nLCBtb2RlICdyJyBhdCAweC4uLj4pCiAKIAogQXJndW1lbnQgZ3JvdXBzCkBAIC0xNjI4LDE0ICsxNzIyLDE0IEBACiAKICAgICAgICAtLWJhciBCQVIgIGJhciBoZWxwCiAKLSAgIE5vdGUgdGhhdCBhbnkgYXJndW1lbnRzIG5vdCB5b3VyIHVzZXIgZGVmaW5lZCBncm91cHMgd2lsbCBlbmQgdXAgYmFjayBpbiB0aGUKLSAgIHVzdWFsICJwb3NpdGlvbmFsIGFyZ3VtZW50cyIgYW5kICJvcHRpb25hbCBhcmd1bWVudHMiIHNlY3Rpb25zLgorICAgTm90ZSB0aGF0IGFueSBhcmd1bWVudHMgbm90IGluIHlvdXIgdXNlci1kZWZpbmVkIGdyb3VwcyB3aWxsIGVuZCB1cCBiYWNrCisgICBpbiB0aGUgdXN1YWwgInBvc2l0aW9uYWwgYXJndW1lbnRzIiBhbmQgIm9wdGlvbmFsIGFyZ3VtZW50cyIgc2VjdGlvbnMuCiAKIAogTXV0dWFsIGV4Y2x1c2lvbgogXl5eXl5eXl5eXl5eXl5eXgogCi0uLiBtZXRob2Q6OiBhZGRfbXV0dWFsbHlfZXhjbHVzaXZlX2dyb3VwKHJlcXVpcmVkPUZhbHNlKQorLi4gbWV0aG9kOjogQXJndW1lbnRQYXJzZXIuYWRkX211dHVhbGx5X2V4Y2x1c2l2ZV9ncm91cChyZXF1aXJlZD1GYWxzZSkKIAogICAgQ3JlYXRlIGEgbXV0dWFsbHkgZXhjbHVzaXZlIGdyb3VwLiA6bW9kOmBhcmdwYXJzZWAgd2lsbCBtYWtlIHN1cmUgdGhhdCBvbmx5CiAgICBvbmUgb2YgdGhlIGFyZ3VtZW50cyBpbiB0aGUgbXV0dWFsbHkgZXhjbHVzaXZlIGdyb3VwIHdhcyBwcmVzZW50IG9uIHRoZQpAQCAtMTc2NCw2ICsxODU4LDEyIEBACiAgICA+Pj4gcGFyc2VyLnBhcnNlX2tub3duX2FyZ3MoWyctLWZvbycsICctLWJhZGdlcicsICdCQVInLCAnc3BhbSddKQogICAgKE5hbWVzcGFjZShiYXI9J0JBUicsIGZvbz1UcnVlKSwgWyctLWJhZGdlcicsICdzcGFtJ10pCiAKKy4uIHdhcm5pbmc6OgorICAgOnJlZjpgUHJlZml4IG1hdGNoaW5nIDxwcmVmaXgtbWF0Y2hpbmc+YCBydWxlcyBhcHBseSB0bworICAgOm1ldGg6YHBhcnNlX2tub3duX2FyZ3NgLiBUaGUgcGFyc2VyIG1heSBjb25zdW1lIGFuIG9wdGlvbiBldmVuIGlmIGl0J3MganVzdAorICAgYSBwcmVmaXggb2Ygb25lIG9mIGl0cyBrbm93biBvcHRpb25zLCBpbnN0ZWFkIG9mIGxlYXZpbmcgaXQgaW4gdGhlIHJlbWFpbmluZworICAgYXJndW1lbnRzIGxpc3QuCisKIAogQ3VzdG9taXppbmcgZmlsZSBwYXJzaW5nCiBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KQEAgLTE4MjAsOSArMTkyMCwxMCBAQAogKiBSZXBsYWNlIGFsbCA6bWV0aDpgb3B0cGFyc2UuT3B0aW9uUGFyc2VyLmFkZF9vcHRpb25gIGNhbGxzIHdpdGgKICAgOm1ldGg6YEFyZ3VtZW50UGFyc2VyLmFkZF9hcmd1bWVudGAgY2FsbHMuCiAKLSogUmVwbGFjZSBgYG9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpYGAgd2l0aCBgYGFyZ3MgPQorKiBSZXBsYWNlIGBgKG9wdGlvbnMsIGFyZ3MpID0gcGFyc2VyLnBhcnNlX2FyZ3MoKWBgIHdpdGggYGBhcmdzID0KICAgcGFyc2VyLnBhcnNlX2FyZ3MoKWBgIGFuZCBhZGQgYWRkaXRpb25hbCA6bWV0aDpgQXJndW1lbnRQYXJzZXIuYWRkX2FyZ3VtZW50YAotICBjYWxscyBmb3IgdGhlIHBvc2l0aW9uYWwgYXJndW1lbnRzLgorICBjYWxscyBmb3IgdGhlIHBvc2l0aW9uYWwgYXJndW1lbnRzLiBLZWVwIGluIG1pbmQgdGhhdCB3aGF0IHdhcyBwcmV2aW91c2x5CisgIGNhbGxlZCBgYG9wdGlvbnNgYCwgbm93IGluIDptb2Q6YGFyZ3BhcnNlYCBjb250ZXh0IGlzIGNhbGxlZCBgYGFyZ3NgYC4KIAogKiBSZXBsYWNlIGNhbGxiYWNrIGFjdGlvbnMgYW5kIHRoZSBgYGNhbGxiYWNrXypgYCBrZXl3b3JkIGFyZ3VtZW50cyB3aXRoCiAgIGBgdHlwZWBgIG9yIGBgYWN0aW9uYGAgYXJndW1lbnRzLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvYXJyYXkucnN0IGIvRG9jL2xpYnJhcnkvYXJyYXkucnN0CmluZGV4IGY3ZmI0ZTMuLjE3NjZkNDcgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2FycmF5LnJzdAorKysgYi9Eb2MvbGlicmFyeS9hcnJheS5yc3QKQEAgLTEwNyw3ICsxMDcsNyBAQAogICAgbWVtb3J5IGJ1ZmZlciBpbiBieXRlcyBjYW4gYmUgY29tcHV0ZWQgYXMgYGBhcnJheS5idWZmZXJfaW5mbygpWzFdICoKICAgIGFycmF5Lml0ZW1zaXplYGAuICBUaGlzIGlzIG9jY2FzaW9uYWxseSB1c2VmdWwgd2hlbiB3b3JraW5nIHdpdGggbG93LWxldmVsIChhbmQKICAgIGluaGVyZW50bHkgdW5zYWZlKSBJL08gaW50ZXJmYWNlcyB0aGF0IHJlcXVpcmUgbWVtb3J5IGFkZHJlc3Nlcywgc3VjaCBhcyBjZXJ0YWluCi0gICA6Y2Z1bmM6YGlvY3RsYCBvcGVyYXRpb25zLiAgVGhlIHJldHVybmVkIG51bWJlcnMgYXJlIHZhbGlkIGFzIGxvbmcgYXMgdGhlIGFycmF5CisgICA6YzpmdW5jOmBpb2N0bGAgb3BlcmF0aW9ucy4gIFRoZSByZXR1cm5lZCBudW1iZXJzIGFyZSB2YWxpZCBhcyBsb25nIGFzIHRoZSBhcnJheQogICAgZXhpc3RzIGFuZCBubyBsZW5ndGgtY2hhbmdpbmcgb3BlcmF0aW9ucyBhcmUgYXBwbGllZCB0byBpdC4KIAogICAgLi4gbm90ZTo6CkBAIC0yNjgsOSArMjY4LDcgQEAKICAgICAgIFBhY2tpbmcgYW5kIHVucGFja2luZyBvZiBFeHRlcm5hbCBEYXRhIFJlcHJlc2VudGF0aW9uIChYRFIpIGRhdGEgYXMgdXNlZCBpbiBzb21lCiAgICAgICByZW1vdGUgcHJvY2VkdXJlIGNhbGwgc3lzdGVtcy4KIAotICAgYFRoZSBOdW1lcmljYWwgUHl0aG9uIE1hbnVhbCA8aHR0cDovL251bXB5LnNvdXJjZWZvcmdlLm5ldC9udW1kb2MvSFRNTC9udW1kb2MuaHRtPmBfCisgICBgVGhlIE51bWVyaWNhbCBQeXRob24gRG9jdW1lbnRhdGlvbiA8aHR0cDovL2RvY3Muc2NpcHkub3JnL2RvYy8+YF8KICAgICAgIFRoZSBOdW1lcmljIFB5dGhvbiBleHRlbnNpb24gKE51bVB5KSBkZWZpbmVzIGFub3RoZXIgYXJyYXkgdHlwZTsgc2VlCi0gICAgICBodHRwOi8vbnVtcHkuc291cmNlZm9yZ2UubmV0LyBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCBOdW1lcmljYWwgUHl0aG9uLgotICAgICAgKEEgUERGIHZlcnNpb24gb2YgdGhlIE51bVB5IG1hbnVhbCBpcyBhdmFpbGFibGUgYXQKLSAgICAgIGh0dHA6Ly9udW1weS5zb3VyY2Vmb3JnZS5uZXQvbnVtZG9jL251bWRvYy5wZGYpLgorICAgICAgaHR0cDovL3d3dy5udW1weS5vcmcvIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IE51bWVyaWNhbCBQeXRob24uCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2FzdC5yc3QgYi9Eb2MvbGlicmFyeS9hc3QucnN0CmluZGV4IDUxMzBkMDAuLjhhZGM4OGYgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2FzdC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvYXN0LnJzdApAQCAtMTMxLDEwICsxMzEsMTAgQEAKIAogLi4gZnVuY3Rpb246OiBsaXRlcmFsX2V2YWwobm9kZV9vcl9zdHJpbmcpCiAKLSAgIFNhZmVseSBldmFsdWF0ZSBhbiBleHByZXNzaW9uIG5vZGUgb3IgYSBzdHJpbmcgY29udGFpbmluZyBhIFB5dGhvbgotICAgZXhwcmVzc2lvbi4gIFRoZSBzdHJpbmcgb3Igbm9kZSBwcm92aWRlZCBtYXkgb25seSBjb25zaXN0IG9mIHRoZSBmb2xsb3dpbmcKLSAgIFB5dGhvbiBsaXRlcmFsIHN0cnVjdHVyZXM6IHN0cmluZ3MsIG51bWJlcnMsIHR1cGxlcywgbGlzdHMsIGRpY3RzLCBib29sZWFucywKLSAgIGFuZCBgYE5vbmVgYC4KKyAgIFNhZmVseSBldmFsdWF0ZSBhbiBleHByZXNzaW9uIG5vZGUgb3IgYSBVbmljb2RlIG9yICpMYXRpbi0xKiBlbmNvZGVkIHN0cmluZworICAgY29udGFpbmluZyBhIFB5dGhvbiBleHByZXNzaW9uLiAgVGhlIHN0cmluZyBvciBub2RlIHByb3ZpZGVkIG1heSBvbmx5IGNvbnNpc3QKKyAgIG9mIHRoZSBmb2xsb3dpbmcgUHl0aG9uIGxpdGVyYWwgc3RydWN0dXJlczogc3RyaW5ncywgbnVtYmVycywgdHVwbGVzLCBsaXN0cywKKyAgIGRpY3RzLCBib29sZWFucywgYW5kIGBgTm9uZWBgLgogCiAgICBUaGlzIGNhbiBiZSB1c2VkIGZvciBzYWZlbHkgZXZhbHVhdGluZyBzdHJpbmdzIGNvbnRhaW5pbmcgUHl0aG9uIGV4cHJlc3Npb25zCiAgICBmcm9tIHVudHJ1c3RlZCBzb3VyY2VzIHdpdGhvdXQgdGhlIG5lZWQgdG8gcGFyc2UgdGhlIHZhbHVlcyBvbmVzZWxmLgpAQCAtMjU3LDYgKzI1Nyw2IEBACiAgICBSZXR1cm4gYSBmb3JtYXR0ZWQgZHVtcCBvZiB0aGUgdHJlZSBpbiAqbm9kZSouICBUaGlzIGlzIG1haW5seSB1c2VmdWwgZm9yCiAgICBkZWJ1Z2dpbmcgcHVycG9zZXMuICBUaGUgcmV0dXJuZWQgc3RyaW5nIHdpbGwgc2hvdyB0aGUgbmFtZXMgYW5kIHRoZSB2YWx1ZXMKICAgIGZvciBmaWVsZHMuICBUaGlzIG1ha2VzIHRoZSBjb2RlIGltcG9zc2libGUgdG8gZXZhbHVhdGUsIHNvIGlmIGV2YWx1YXRpb24gaXMKLSAgIHdhbnRlZCAqYW5ub3RhdGVfZmllbGRzKiBtdXN0IGJlIHNldCB0byBGYWxzZS4gIEF0dHJpYnV0ZXMgc3VjaCBhcyBsaW5lCisgICB3YW50ZWQgKmFubm90YXRlX2ZpZWxkcyogbXVzdCBiZSBzZXQgdG8gYGBGYWxzZWBgLiAgQXR0cmlidXRlcyBzdWNoIGFzIGxpbmUKICAgIG51bWJlcnMgYW5kIGNvbHVtbiBvZmZzZXRzIGFyZSBub3QgZHVtcGVkIGJ5IGRlZmF1bHQuICBJZiB0aGlzIGlzIHdhbnRlZCwKICAgICppbmNsdWRlX2F0dHJpYnV0ZXMqIGNhbiBiZSBzZXQgdG8gYGBUcnVlYGAuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9hc3luY2hhdC5yc3QgYi9Eb2MvbGlicmFyeS9hc3luY2hhdC5yc3QKaW5kZXggNmY0YWY0MS4uMzdkMDAxYiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvYXN5bmNoYXQucnN0CisrKyBiL0RvYy9saWJyYXJ5L2FzeW5jaGF0LnJzdApAQCAtMzQsNyArMzQsNyBAQAogCiAgICBMaWtlIDpjbGFzczpgYXN5bmNvcmUuZGlzcGF0Y2hlcmAsIDpjbGFzczpgYXN5bmNfY2hhdGAgZGVmaW5lcyBhIHNldCBvZgogICAgZXZlbnRzIHRoYXQgYXJlIGdlbmVyYXRlZCBieSBhbiBhbmFseXNpcyBvZiBzb2NrZXQgY29uZGl0aW9ucyBhZnRlciBhCi0gICA6Y2Z1bmM6YHNlbGVjdGAgY2FsbC4gT25jZSB0aGUgcG9sbGluZyBsb29wIGhhcyBiZWVuIHN0YXJ0ZWQgdGhlCisgICA6YzpmdW5jOmBzZWxlY3RgIGNhbGwuIE9uY2UgdGhlIHBvbGxpbmcgbG9vcCBoYXMgYmVlbiBzdGFydGVkIHRoZQogICAgOmNsYXNzOmBhc3luY19jaGF0YCBvYmplY3QncyBtZXRob2RzIGFyZSBjYWxsZWQgYnkgdGhlIGV2ZW50LXByb2Nlc3NpbmcKICAgIGZyYW1ld29yayB3aXRoIG5vIGFjdGlvbiBvbiB0aGUgcGFydCBvZiB0aGUgcHJvZ3JhbW1lci4KIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvYXN5bmNvcmUucnN0IGIvRG9jL2xpYnJhcnkvYXN5bmNvcmUucnN0CmluZGV4IDMzZjIyZDMuLjMxY2Q0OTcgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2FzeW5jb3JlLnJzdAorKysgYi9Eb2MvbGlicmFyeS9hc3luY29yZS5yc3QKQEAgLTI1LDcgKzI1LDcgQEAKIGFyZSBwcm9iYWJseSB3aGF0IHlvdSByZWFsbHkgbmVlZC4gIE5ldHdvcmsgc2VydmVycyBhcmUgcmFyZWx5IHByb2Nlc3NvcgogYm91bmQsIGhvd2V2ZXIuCiAKLUlmIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSBzdXBwb3J0cyB0aGUgOmNmdW5jOmBzZWxlY3RgIHN5c3RlbSBjYWxsIGluIGl0cyBJL08KK0lmIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSBzdXBwb3J0cyB0aGUgOmM6ZnVuYzpgc2VsZWN0YCBzeXN0ZW0gY2FsbCBpbiBpdHMgSS9PCiBsaWJyYXJ5IChhbmQgbmVhcmx5IGFsbCBkbyksIHRoZW4geW91IGNhbiB1c2UgaXQgdG8ganVnZ2xlIG11bHRpcGxlCiBjb21tdW5pY2F0aW9uIGNoYW5uZWxzIGF0IG9uY2U7IGRvaW5nIG90aGVyIHdvcmsgd2hpbGUgeW91ciBJL08gaXMgdGFraW5nCiBwbGFjZSBpbiB0aGUgImJhY2tncm91bmQuIiAgQWx0aG91Z2ggdGhpcyBzdHJhdGVneSBjYW4gc2VlbSBzdHJhbmdlIGFuZApAQCAtNTMsMTAgKzUzLDEwIEBACiAgICBjaGFubmVscyBoYXZlIGJlZW4gY2xvc2VkLiAgQWxsIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWwuICBUaGUgKmNvdW50KgogICAgcGFyYW1ldGVyIGRlZmF1bHRzIHRvIE5vbmUsIHJlc3VsdGluZyBpbiB0aGUgbG9vcCB0ZXJtaW5hdGluZyBvbmx5IHdoZW4gYWxsCiAgICBjaGFubmVscyBoYXZlIGJlZW4gY2xvc2VkLiAgVGhlICp0aW1lb3V0KiBhcmd1bWVudCBzZXRzIHRoZSB0aW1lb3V0Ci0gICBwYXJhbWV0ZXIgZm9yIHRoZSBhcHByb3ByaWF0ZSA6ZnVuYzpgc2VsZWN0YCBvciA6ZnVuYzpgcG9sbGAgY2FsbCwgbWVhc3VyZWQKLSAgIGluIHNlY29uZHM7IHRoZSBkZWZhdWx0IGlzIDMwIHNlY29uZHMuICBUaGUgKnVzZV9wb2xsKiBwYXJhbWV0ZXIsIGlmIHRydWUsCi0gICBpbmRpY2F0ZXMgdGhhdCA6ZnVuYzpgcG9sbGAgc2hvdWxkIGJlIHVzZWQgaW4gcHJlZmVyZW5jZSB0byA6ZnVuYzpgc2VsZWN0YAotICAgKHRoZSBkZWZhdWx0IGlzIGBgRmFsc2VgYCkuCisgICBwYXJhbWV0ZXIgZm9yIHRoZSBhcHByb3ByaWF0ZSA6ZnVuYzpgfnNlbGVjdC5zZWxlY3RgIG9yIDpmdW5jOmB+c2VsZWN0LnBvbGxgCisgICBjYWxsLCBtZWFzdXJlZCBpbiBzZWNvbmRzOyB0aGUgZGVmYXVsdCBpcyAzMCBzZWNvbmRzLiAgVGhlICp1c2VfcG9sbCoKKyAgIHBhcmFtZXRlciwgaWYgdHJ1ZSwgaW5kaWNhdGVzIHRoYXQgOmZ1bmM6YH5zZWxlY3QucG9sbGAgc2hvdWxkIGJlIHVzZWQgaW4KKyAgIHByZWZlcmVuY2UgdG8gOmZ1bmM6YH5zZWxlY3Quc2VsZWN0YCAodGhlIGRlZmF1bHQgaXMgYGBGYWxzZWBgKS4KIAogICAgVGhlICptYXAqIHBhcmFtZXRlciBpcyBhIGRpY3Rpb25hcnkgd2hvc2UgaXRlbXMgYXJlIHRoZSBjaGFubmVscyB0byB3YXRjaC4KICAgIEFzIGNoYW5uZWxzIGFyZSBjbG9zZWQgdGhleSBhcmUgZGVsZXRlZCBmcm9tIHRoZWlyIG1hcC4gIElmICptYXAqIGlzCkBAIC05NSw4ICs5NSw4IEBACiAKICAgIER1cmluZyBhc3luY2hyb25vdXMgcHJvY2Vzc2luZywgZWFjaCBtYXBwZWQgY2hhbm5lbCdzIDptZXRoOmByZWFkYWJsZWAgYW5kCiAgICA6bWV0aDpgd3JpdGFibGVgIG1ldGhvZHMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNoYW5uZWwncyBzb2NrZXQKLSAgIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgbGlzdCBvZiBjaGFubmVscyA6Y2Z1bmM6YHNlbGVjdGBcIGVkIG9yCi0gICA6Y2Z1bmM6YHBvbGxgXCBlZCBmb3IgcmVhZCBhbmQgd3JpdGUgZXZlbnRzLgorICAgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIGNoYW5uZWxzIDpjOmZ1bmM6YHNlbGVjdGBcIGVkIG9yCisgICA6YzpmdW5jOmBwb2xsYFwgZWQgZm9yIHJlYWQgYW5kIHdyaXRlIGV2ZW50cy4KIAogICAgVGh1cywgdGhlIHNldCBvZiBjaGFubmVsIGV2ZW50cyBpcyBsYXJnZXIgdGhhbiB0aGUgYmFzaWMgc29ja2V0IGV2ZW50cy4gIFRoZQogICAgZnVsbCBzZXQgb2YgbWV0aG9kcyB0aGF0IGNhbiBiZSBvdmVycmlkZGVuIGluIHlvdXIgc3ViY2xhc3MgZm9sbG93czoKQEAgLTE5Myw2ICsxOTMsMTEgQEAKICAgICAgIFJlYWQgYXQgbW9zdCAqYnVmZmVyX3NpemUqIGJ5dGVzIGZyb20gdGhlIHNvY2tldCdzIHJlbW90ZSBlbmQtcG9pbnQuICBBbgogICAgICAgZW1wdHkgc3RyaW5nIGltcGxpZXMgdGhhdCB0aGUgY2hhbm5lbCBoYXMgYmVlbiBjbG9zZWQgZnJvbSB0aGUgb3RoZXIgZW5kLgogCisgICAgICBOb3RlIHRoYXQgOm1ldGg6YHJlY3ZgIG1heSByYWlzZSA6ZXhjOmBzb2NrZXQuZXJyb3JgIHdpdGgKKyAgICAgIDpkYXRhOmB+ZXJybm8uRUFHQUlOYCBvciA6ZGF0YTpgfmVycm5vLkVXT1VMREJMT0NLYCwgZXZlbiB0aG91Z2gKKyAgICAgIDpmdW5jOmBzZWxlY3Quc2VsZWN0YCBvciA6ZnVuYzpgc2VsZWN0LnBvbGxgIGhhcyByZXBvcnRlZCB0aGUgc29ja2V0CisgICAgICByZWFkeSBmb3IgcmVhZGluZy4KKwogCiAgICAuLiBtZXRob2Q6OiBsaXN0ZW4oYmFja2xvZykKIApAQCAtMjM4LDkgKzI0Myw5IEBACiAuLiBjbGFzczo6IGZpbGVfZGlzcGF0Y2hlcigpCiAKICAgIEEgZmlsZV9kaXNwYXRjaGVyIHRha2VzIGEgZmlsZSBkZXNjcmlwdG9yIG9yIGZpbGUgb2JqZWN0IGFsb25nIHdpdGggYW4KLSAgIG9wdGlvbmFsIG1hcCBhcmd1bWVudCBhbmQgd3JhcHMgaXQgZm9yIHVzZSB3aXRoIHRoZSA6Y2Z1bmM6YHBvbGxgIG9yCi0gICA6Y2Z1bmM6YGxvb3BgIGZ1bmN0aW9ucy4gIElmIHByb3ZpZGVkIGEgZmlsZSBvYmplY3Qgb3IgYW55dGhpbmcgd2l0aCBhCi0gICA6Y2Z1bmM6YGZpbGVub2AgbWV0aG9kLCB0aGF0IG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhbmQgcGFzc2VkIHRvIHRoZQorICAgb3B0aW9uYWwgbWFwIGFyZ3VtZW50IGFuZCB3cmFwcyBpdCBmb3IgdXNlIHdpdGggdGhlIDpjOmZ1bmM6YHBvbGxgIG9yCisgICA6YzpmdW5jOmBsb29wYCBmdW5jdGlvbnMuICBJZiBwcm92aWRlZCBhIGZpbGUgb2JqZWN0IG9yIGFueXRoaW5nIHdpdGggYQorICAgOmM6ZnVuYzpgZmlsZW5vYCBtZXRob2QsIHRoYXQgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGFuZCBwYXNzZWQgdG8gdGhlCiAgICA6Y2xhc3M6YGZpbGVfd3JhcHBlcmAgY29uc3RydWN0b3IuICBBdmFpbGFiaWxpdHk6IFVOSVguCiAKIC4uIGNsYXNzOjogZmlsZV93cmFwcGVyKCkKQEAgLTMxOCwxMyArMzIzLDEwIEBACiAKICAgICAgICAgZGVmIGhhbmRsZV9hY2NlcHQoc2VsZik6CiAgICAgICAgICAgICBwYWlyID0gc2VsZi5hY2NlcHQoKQotICAgICAgICAgICAgaWYgcGFpciBpcyBOb25lOgotICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBwYWlyIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIHNvY2ssIGFkZHIgPSBwYWlyCiAgICAgICAgICAgICAgICAgcHJpbnQgJ0luY29taW5nIGNvbm5lY3Rpb24gZnJvbSAlcycgJSByZXByKGFkZHIpCiAgICAgICAgICAgICAgICAgaGFuZGxlciA9IEVjaG9IYW5kbGVyKHNvY2spCiAKICAgICBzZXJ2ZXIgPSBFY2hvU2VydmVyKCdsb2NhbGhvc3QnLCA4MDgwKQogICAgIGFzeW5jb3JlLmxvb3AoKQotCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9hdGV4aXQucnN0IGIvRG9jL2xpYnJhcnkvYXRleGl0LnJzdAppbmRleCBjNzBkY2YyLi4wYjVlMTIxIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9hdGV4aXQucnN0CisrKyBiL0RvYy9saWJyYXJ5L2F0ZXhpdC5yc3QKQEAgLTE1LDE4ICsxNSwxOSBAQAogCiBUaGUgOm1vZDpgYXRleGl0YCBtb2R1bGUgZGVmaW5lcyBhIHNpbmdsZSBmdW5jdGlvbiB0byByZWdpc3RlciBjbGVhbnVwCiBmdW5jdGlvbnMuICBGdW5jdGlvbnMgdGh1cyByZWdpc3RlcmVkIGFyZSBhdXRvbWF0aWNhbGx5IGV4ZWN1dGVkIHVwb24gbm9ybWFsCi1pbnRlcnByZXRlciB0ZXJtaW5hdGlvbi4gIFRoZSBvcmRlciBpbiB3aGljaCB0aGUgZnVuY3Rpb25zIGFyZSBjYWxsZWQgaXMgbm90Ci1kZWZpbmVkOyBpZiB5b3UgaGF2ZSBjbGVhbnVwIG9wZXJhdGlvbnMgdGhhdCBkZXBlbmQgb24gZWFjaCBvdGhlciwgeW91IHNob3VsZAotd3JhcCB0aGVtIGluIGEgZnVuY3Rpb24gYW5kIHJlZ2lzdGVyIHRoYXQgb25lLiAgVGhpcyBrZWVwcyA6bW9kOmBhdGV4aXRgIHNpbXBsZS4KK2ludGVycHJldGVyIHRlcm1pbmF0aW9uLiAgOm1vZDpgYXRleGl0YCBydW5zIHRoZXNlIGZ1bmN0aW9ucyBpbiB0aGUgKnJldmVyc2UqCitvcmRlciBpbiB3aGljaCB0aGV5IHdlcmUgcmVnaXN0ZXJlZDsgaWYgeW91IHJlZ2lzdGVyIGBgQWBgLCBgYEJgYCwgYW5kIGBgQ2BgLAorYXQgaW50ZXJwcmV0ZXIgdGVybWluYXRpb24gdGltZSB0aGV5IHdpbGwgYmUgcnVuIGluIHRoZSBvcmRlciBgYENgYCwgYGBCYGAsCitgYEFgYC4KIAotTm90ZTogdGhlIGZ1bmN0aW9ucyByZWdpc3RlcmVkIHZpYSB0aGlzIG1vZHVsZSBhcmUgbm90IGNhbGxlZCB3aGVuIHRoZSBwcm9ncmFtCi1pcyBraWxsZWQgYnkgYSBzaWduYWwgbm90IGhhbmRsZWQgYnkgUHl0aG9uLCB3aGVuIGEgUHl0aG9uIGZhdGFsIGludGVybmFsIGVycm9yCi1pcyBkZXRlY3RlZCwgb3Igd2hlbiA6ZnVuYzpgb3MuX2V4aXRgIGlzIGNhbGxlZC4KKyoqTm90ZToqKiBUaGUgZnVuY3Rpb25zIHJlZ2lzdGVyZWQgdmlhIHRoaXMgbW9kdWxlIGFyZSBub3QgY2FsbGVkIHdoZW4gdGhlCitwcm9ncmFtIGlzIGtpbGxlZCBieSBhIHNpZ25hbCBub3QgaGFuZGxlZCBieSBQeXRob24sIHdoZW4gYSBQeXRob24gZmF0YWwKK2ludGVybmFsIGVycm9yIGlzIGRldGVjdGVkLCBvciB3aGVuIDpmdW5jOmBvcy5fZXhpdGAgaXMgY2FsbGVkLgogCiAuLiBpbmRleDo6IHNpbmdsZTogZXhpdGZ1bmMgKGluIHN5cykKIAogVGhpcyBpcyBhbiBhbHRlcm5hdGUgaW50ZXJmYWNlIHRvIHRoZSBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5IHRoZQotYGBzeXMuZXhpdGZ1bmNgYCB2YXJpYWJsZS4KKzpmdW5jOmBzeXMuZXhpdGZ1bmNgIHZhcmlhYmxlLgogCiBOb3RlOiBUaGlzIG1vZHVsZSBpcyB1bmxpa2VseSB0byB3b3JrIGNvcnJlY3RseSB3aGVuIHVzZWQgd2l0aCBvdGhlciBjb2RlIHRoYXQKIHNldHMgYGBzeXMuZXhpdGZ1bmNgYC4gIEluIHBhcnRpY3VsYXIsIG90aGVyIGNvcmUgUHl0aG9uIG1vZHVsZXMgYXJlIGZyZWUgdG8gdXNlCkBAIC00MCw3ICs0MSw4IEBACiAKICAgIFJlZ2lzdGVyICpmdW5jKiBhcyBhIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGF0IHRlcm1pbmF0aW9uLiAgQW55IG9wdGlvbmFsCiAgICBhcmd1bWVudHMgdGhhdCBhcmUgdG8gYmUgcGFzc2VkIHRvICpmdW5jKiBtdXN0IGJlIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8KLSAgIDpmdW5jOmByZWdpc3RlcmAuCisgICA6ZnVuYzpgcmVnaXN0ZXJgLiAgSXQgaXMgcG9zc2libGUgdG8gcmVnaXN0ZXIgdGhlIHNhbWUgZnVuY3Rpb24gYW5kIGFyZ3VtZW50cworICAgbW9yZSB0aGFuIG9uY2UuCiAKICAgIEF0IG5vcm1hbCBwcm9ncmFtIHRlcm1pbmF0aW9uIChmb3IgaW5zdGFuY2UsIGlmIDpmdW5jOmBzeXMuZXhpdGAgaXMgY2FsbGVkIG9yCiAgICB0aGUgbWFpbiBtb2R1bGUncyBleGVjdXRpb24gY29tcGxldGVzKSwgYWxsIGZ1bmN0aW9ucyByZWdpc3RlcmVkIGFyZSBjYWxsZWQgaW4KQEAgLTU0LDggKzU2LDggQEAKICAgIGJlIHJhaXNlZCBpcyByZS1yYWlzZWQuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi42Ci0gICAgICBUaGlzIGZ1bmN0aW9uIG5vdyByZXR1cm5zICpmdW5jKiB3aGljaCBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2UgaXQgYXMgYQotICAgICAgZGVjb3JhdG9yIHdpdGhvdXQgYmluZGluZyB0aGUgb3JpZ2luYWwgbmFtZSB0byBgYE5vbmVgYC4KKyAgICAgIFRoaXMgZnVuY3Rpb24gbm93IHJldHVybnMgKmZ1bmMqLCB3aGljaCBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2UgaXQgYXMgYQorICAgICAgZGVjb3JhdG9yLgogCiAKIC4uIHNlZWFsc286OgpAQCAtNzUsNyArNzcsNyBAQAogbWFraW5nIGFuIGV4cGxpY2l0IGNhbGwgaW50byB0aGlzIG1vZHVsZSBhdCB0ZXJtaW5hdGlvbi4gOjoKIAogICAgdHJ5OgotICAgICAgIF9jb3VudCA9IGludChvcGVuKCIvdG1wL2NvdW50ZXIiKS5yZWFkKCkpCisgICAgICAgX2NvdW50ID0gaW50KG9wZW4oImNvdW50ZXIiKS5yZWFkKCkpCiAgICBleGNlcHQgSU9FcnJvcjoKICAgICAgICBfY291bnQgPSAwCiAKQEAgLTg0LDcgKzg2LDcgQEAKICAgICAgICBfY291bnQgPSBfY291bnQgKyBuCiAKICAgIGRlZiBzYXZlY291bnRlcigpOgotICAgICAgIG9wZW4oIi90bXAvY291bnRlciIsICJ3Iikud3JpdGUoIiVkIiAlIF9jb3VudCkKKyAgICAgICBvcGVuKCJjb3VudGVyIiwgInciKS53cml0ZSgiJWQiICUgX2NvdW50KQogCiAgICBpbXBvcnQgYXRleGl0CiAgICBhdGV4aXQucmVnaXN0ZXIoc2F2ZWNvdW50ZXIpCkBAIC0xMDksNSArMTExLDQgQEAKICAgIGRlZiBnb29kYnllKCk6CiAgICAgICAgcHJpbnQgIllvdSBhcmUgbm93IGxlYXZpbmcgdGhlIFB5dGhvbiBzZWN0b3IuIgogCi1UaGlzIG9idmlvdXNseSBvbmx5IHdvcmtzIHdpdGggZnVuY3Rpb25zIHRoYXQgZG9uJ3QgdGFrZSBhcmd1bWVudHMuCi0KK1RoaXMgb25seSB3b3JrcyB3aXRoIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9hdWRpb29wLnJzdCBiL0RvYy9saWJyYXJ5L2F1ZGlvb3AucnN0CmluZGV4IDI5YzM5MTQuLmU3NDdiYTEgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2F1ZGlvb3AucnN0CisrKyBiL0RvYy9saWJyYXJ5L2F1ZGlvb3AucnN0CkBAIC0zOCw3ICszOCw3IEBACiAKICAgIFJldHVybiBhIGZyYWdtZW50IHdoaWNoIGlzIHRoZSBhZGRpdGlvbiBvZiB0aGUgdHdvIHNhbXBsZXMgcGFzc2VkIGFzIHBhcmFtZXRlcnMuCiAgICAqd2lkdGgqIGlzIHRoZSBzYW1wbGUgd2lkdGggaW4gYnl0ZXMsIGVpdGhlciBgYDFgYCwgYGAyYGAgb3IgYGA0YGAuICBCb3RoCi0gICBmcmFnbWVudHMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbGVuZ3RoLgorICAgZnJhZ21lbnRzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGxlbmd0aC4gIFNhbXBsZXMgYXJlIHRydW5jYXRlZCBpbiBjYXNlIG9mIG92ZXJmbG93LgogCiAKIC4uIGZ1bmN0aW9uOjogYWRwY20ybGluKGFkcGNtZnJhZ21lbnQsIHdpZHRoLCBzdGF0ZSkKQEAgLTcxLDcgKzcxLDcgQEAKIC4uIGZ1bmN0aW9uOjogYmlhcyhmcmFnbWVudCwgd2lkdGgsIGJpYXMpCiAKICAgIFJldHVybiBhIGZyYWdtZW50IHRoYXQgaXMgdGhlIG9yaWdpbmFsIGZyYWdtZW50IHdpdGggYSBiaWFzIGFkZGVkIHRvIGVhY2gKLSAgIHNhbXBsZS4KKyAgIHNhbXBsZS4gIFNhbXBsZXMgd3JhcCBhcm91bmQgaW4gY2FzZSBvZiBvdmVyZmxvdy4KIAogCiAuLiBmdW5jdGlvbjo6IGNyb3NzKGZyYWdtZW50LCB3aWR0aCkKQEAgLTE2MiwxMiArMTYyLDYgQEAKICAgIGhhcmR3YXJlLCBhbW9uZyBvdGhlcnMuCiAKIAotLi4gZnVuY3Rpb246OiBtaW5tYXgoZnJhZ21lbnQsIHdpZHRoKQotCi0gICBSZXR1cm4gYSB0dXBsZSBjb25zaXN0aW5nIG9mIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBvZiBhbGwgc2FtcGxlcyBpbgotICAgdGhlIHNvdW5kIGZyYWdtZW50LgotCi0KIC4uIGZ1bmN0aW9uOjogbWF4KGZyYWdtZW50LCB3aWR0aCkKIAogICAgUmV0dXJuIHRoZSBtYXhpbXVtIG9mIHRoZSAqYWJzb2x1dGUgdmFsdWUqIG9mIGFsbCBzYW1wbGVzIGluIGEgZnJhZ21lbnQuCkBAIC0xNzgsMTAgKzE3MiwxNiBAQAogICAgUmV0dXJuIHRoZSBtYXhpbXVtIHBlYWstcGVhayB2YWx1ZSBpbiB0aGUgc291bmQgZnJhZ21lbnQuCiAKIAorLi4gZnVuY3Rpb246OiBtaW5tYXgoZnJhZ21lbnQsIHdpZHRoKQorCisgICBSZXR1cm4gYSB0dXBsZSBjb25zaXN0aW5nIG9mIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBvZiBhbGwgc2FtcGxlcyBpbgorICAgdGhlIHNvdW5kIGZyYWdtZW50LgorCisKIC4uIGZ1bmN0aW9uOjogbXVsKGZyYWdtZW50LCB3aWR0aCwgZmFjdG9yKQogCiAgICBSZXR1cm4gYSBmcmFnbWVudCB0aGF0IGhhcyBhbGwgc2FtcGxlcyBpbiB0aGUgb3JpZ2luYWwgZnJhZ21lbnQgbXVsdGlwbGllZCBieQotICAgdGhlIGZsb2F0aW5nLXBvaW50IHZhbHVlICpmYWN0b3IqLiAgT3ZlcmZsb3cgaXMgc2lsZW50bHkgaWdub3JlZC4KKyAgIHRoZSBmbG9hdGluZy1wb2ludCB2YWx1ZSAqZmFjdG9yKi4gIFNhbXBsZXMgYXJlIHRydW5jYXRlZCBpbiBjYXNlIG9mIG92ZXJmbG93LgogCiAKIC4uIGZ1bmN0aW9uOjogcmF0ZWN2KGZyYWdtZW50LCB3aWR0aCwgbmNoYW5uZWxzLCBpbnJhdGUsIG91dHJhdGUsIHN0YXRlWywgd2VpZ2h0QVssIHdlaWdodEJdXSkKQEAgLTI0Nyw3ICsyNDcsNyBAQAogdHJhbnNtaXQgdGhlIGRhdGEgYnV0IGFsc28gdGhlIHN0YXRlLiAgTm90ZSB0aGF0IHlvdSBzaG91bGQgc2VuZCB0aGUgKmluaXRpYWwqCiBzdGF0ZSAodGhlIG9uZSB5b3UgcGFzc2VkIHRvIDpmdW5jOmBsaW4yYWRwY21gKSBhbG9uZyB0byB0aGUgZGVjb2Rlciwgbm90IHRoZQogZmluYWwgc3RhdGUgKGFzIHJldHVybmVkIGJ5IHRoZSBjb2RlcikuICBJZiB5b3Ugd2FudCB0byB1c2UKLTpmdW5jOmBzdHJ1Y3Quc3RydWN0YCB0byBzdG9yZSB0aGUgc3RhdGUgaW4gYmluYXJ5IHlvdSBjYW4gY29kZSB0aGUgZmlyc3QKKzpjbGFzczpgc3RydWN0LlN0cnVjdGAgdG8gc3RvcmUgdGhlIHN0YXRlIGluIGJpbmFyeSB5b3UgY2FuIGNvZGUgdGhlIGZpcnN0CiBlbGVtZW50ICh0aGUgcHJlZGljdGVkIHZhbHVlKSBpbiAxNiBiaXRzIGFuZCB0aGUgc2Vjb25kICh0aGUgZGVsdGEgaW5kZXgpIGluIDguCiAKIFRoZSBBRFBDTSBjb2RlcnMgaGF2ZSBuZXZlciBiZWVuIHRyaWVkIGFnYWluc3Qgb3RoZXIgQURQQ00gY29kZXJzLCBvbmx5IGFnYWluc3QKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2Jhc2U2NC5yc3QgYi9Eb2MvbGlicmFyeS9iYXNlNjQucnN0CmluZGV4IGFiODU0MzYuLmM5Y2UyOGIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2Jhc2U2NC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvYmFzZTY0LnJzdApAQCAtOTMsNyArOTMsNyBAQAogICAgZGlnaXQgMCBpcyBhbHdheXMgbWFwcGVkIHRvIHRoZSBsZXR0ZXIgTykuICBGb3Igc2VjdXJpdHkgcHVycG9zZXMgdGhlIGRlZmF1bHQgaXMKICAgIGBgTm9uZWBgLCBzbyB0aGF0IDAgYW5kIDEgYXJlIG5vdCBhbGxvd2VkIGluIHRoZSBpbnB1dC4KIAotICAgVGhlIGRlY29kZWQgc3RyaW5nIGlzIHJldHVybmVkLiAgQSA6ZXhjOmBUeXBlRXJyb3JgIGlzIHJhaXNlZCBpZiAqcyogd2VyZQorICAgVGhlIGRlY29kZWQgc3RyaW5nIGlzIHJldHVybmVkLiAgQSA6ZXhjOmBUeXBlRXJyb3JgIGlzIHJhaXNlZCBpZiAqcyogaXMKICAgIGluY29ycmVjdGx5IHBhZGRlZCBvciBpZiB0aGVyZSBhcmUgbm9uLWFscGhhYmV0IGNoYXJhY3RlcnMgcHJlc2VudCBpbiB0aGUKICAgIHN0cmluZy4KIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvYmFzZWh0dHBzZXJ2ZXIucnN0IGIvRG9jL2xpYnJhcnkvYmFzZWh0dHBzZXJ2ZXIucnN0CmluZGV4IDk4YjVjZTQuLjAxNzc2YWYgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2Jhc2VodHRwc2VydmVyLnJzdAorKysgYi9Eb2MvbGlicmFyeS9iYXNlaHR0cHNlcnZlci5yc3QKQEAgLTYsOCArNiw4IEBACiAKIC4uIG5vdGU6OgogICAgVGhlIDptb2Q6YEJhc2VIVFRQU2VydmVyYCBtb2R1bGUgaGFzIGJlZW4gbWVyZ2VkIGludG8gOm1vZDpgaHR0cC5zZXJ2ZXJgIGluCi0gICBQeXRob24gMy4wLiAgVGhlIDp0ZXJtOmAydG8zYCB0b29sIHdpbGwgYXV0b21hdGljYWxseSBhZGFwdCBpbXBvcnRzIHdoZW4KLSAgIGNvbnZlcnRpbmcgeW91ciBzb3VyY2VzIHRvIDMuMC4KKyAgIFB5dGhvbiAzLiAgVGhlIDp0ZXJtOmAydG8zYCB0b29sIHdpbGwgYXV0b21hdGljYWxseSBhZGFwdCBpbXBvcnRzIHdoZW4KKyAgIGNvbnZlcnRpbmcgeW91ciBzb3VyY2VzIHRvIFB5dGhvbiAzLgogCiAKIC4uIGluZGV4OjoKQEAgLTI0MCw3ICsyNDAsNyBAQAogICAgICAgdG8gY3JlYXRlIGN1c3RvbSBlcnJvciBsb2dnaW5nIG1lY2hhbmlzbXMuIFRoZSAqZm9ybWF0KiBhcmd1bWVudCBpcyBhCiAgICAgICBzdGFuZGFyZCBwcmludGYtc3R5bGUgZm9ybWF0IHN0cmluZywgd2hlcmUgdGhlIGFkZGl0aW9uYWwgYXJndW1lbnRzIHRvCiAgICAgICA6bWV0aDpgbG9nX21lc3NhZ2VgIGFyZSBhcHBsaWVkIGFzIGlucHV0cyB0byB0aGUgZm9ybWF0dGluZy4gVGhlIGNsaWVudAotICAgICAgYWRkcmVzcyBhbmQgY3VycmVudCBkYXRlIGFuZCB0aW1lIGFyZSBwcmVmaXhlZCB0byBldmVyeSBtZXNzYWdlIGxvZ2dlZC4KKyAgICAgIGlwIGFkZHJlc3MgYW5kIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBhcmUgcHJlZml4ZWQgdG8gZXZlcnkgbWVzc2FnZSBsb2dnZWQuCiAKIAogICAgLi4gbWV0aG9kOjogdmVyc2lvbl9zdHJpbmcoKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvYmFzdGlvbi5yc3QgYi9Eb2MvbGlicmFyeS9iYXN0aW9uLnJzdAppbmRleCA4ZjEwM2U3Li4yZTNlZmNkIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9iYXN0aW9uLnJzdAorKysgYi9Eb2MvbGlicmFyeS9iYXN0aW9uLnJzdApAQCAtNyw3ICs3LDcgQEAKICAgIDpkZXByZWNhdGVkOgogCiAuLiBkZXByZWNhdGVkOjogMi42Ci0gICBUaGUgOm1vZDpgQmFzdGlvbmAgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuMC4KKyAgIFRoZSA6bW9kOmBCYXN0aW9uYCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4KIAogLi4gbW9kdWxlYXV0aG9yOjogQmFycnkgV2Fyc2F3IDxid2Fyc2F3QHB5dGhvbi5vcmc+CiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2JkYi5yc3QgYi9Eb2MvbGlicmFyeS9iZGIucnN0CmluZGV4IGJkMmIxNmYuLjgyZWYzN2UgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2JkYi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvYmRiLnJzdApAQCAtMjAsNyArMjAsNyBAQAogCiBUaGUgOm1vZDpgYmRiYCBtb2R1bGUgYWxzbyBkZWZpbmVzIHR3byBjbGFzc2VzOgogCi0uLiBjbGFzczo6IEJyZWFrcG9pbnQoc2VsZiwgZmlsZSwgbGluZVssIHRlbXBvcmFyeT0wWywgY29uZD1Ob25lIFssIGZ1bmNuYW1lPU5vbmVdXV0pCisuLiBjbGFzczo6IEJyZWFrcG9pbnQoc2VsZiwgZmlsZSwgbGluZSwgdGVtcG9yYXJ5PTAsIGNvbmQ9Tm9uZSwgZnVuY25hbWU9Tm9uZSkKIAogICAgVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRlbXBvcmFyeSBicmVha3BvaW50cywgaWdub3JlIGNvdW50cywgZGlzYWJsaW5nIGFuZAogICAgKHJlLSllbmFibGluZywgYW5kIGNvbmRpdGlvbmFscy4KQEAgLTE4NiwxNyArMTg2LDE3IEBACiAgICAuLiBtZXRob2Q6OiB1c2VyX2xpbmUoZnJhbWUpCiAKICAgICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIDptZXRoOmBkaXNwYXRjaF9saW5lYCB3aGVuIGVpdGhlcgotICAgICAgOm1ldGg6YHN0b3BfaGVyZWAgb3IgOm1ldGg6YGJyZWFrX2hlcmVgIHlpZWxkcyBUcnVlLgorICAgICAgOm1ldGg6YHN0b3BfaGVyZWAgb3IgOm1ldGg6YGJyZWFrX2hlcmVgIHlpZWxkcyBgYFRydWVgYC4KIAogICAgLi4gbWV0aG9kOjogdXNlcl9yZXR1cm4oZnJhbWUsIHJldHVybl92YWx1ZSkKIAogICAgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGZyb20gOm1ldGg6YGRpc3BhdGNoX3JldHVybmAgd2hlbiA6bWV0aDpgc3RvcF9oZXJlYAotICAgICAgeWllbGRzIFRydWUuCisgICAgICB5aWVsZHMgYGBUcnVlYGAuCiAKICAgIC4uIG1ldGhvZDo6IHVzZXJfZXhjZXB0aW9uKGZyYW1lLCBleGNfaW5mbykKIAogICAgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGZyb20gOm1ldGg6YGRpc3BhdGNoX2V4Y2VwdGlvbmAgd2hlbgotICAgICAgOm1ldGg6YHN0b3BfaGVyZWAgeWllbGRzIFRydWUuCisgICAgICA6bWV0aDpgc3RvcF9oZXJlYCB5aWVsZHMgYGBUcnVlYGAuCiAKICAgIC4uIG1ldGhvZDo6IGRvX2NsZWFyKGFyZykKIApAQCAtMjM3LDcgKzIzNyw3IEBACiAKICAgIC4uIG1ldGhvZDo6IHNldF9xdWl0KCkKIAotICAgICAgU2V0IHRoZSA6YXR0cjpgcXVpdHRpbmdgIGF0dHJpYnV0ZSB0byBUcnVlLiAgVGhpcyByYWlzZXMgOmV4YzpgQmRiUXVpdGAgaW4KKyAgICAgIFNldCB0aGUgOmF0dHI6YHF1aXR0aW5nYCBhdHRyaWJ1dGUgdG8gYGBUcnVlYGAuICBUaGlzIHJhaXNlcyA6ZXhjOmBCZGJRdWl0YCBpbgogICAgICAgdGhlIG5leHQgY2FsbCB0byBvbmUgb2YgdGhlIDptZXRoOmBkaXNwYXRjaF9cKmAgbWV0aG9kcy4KIAogCkBAIC0yNDUsNyArMjQ1LDcgQEAKICAgIGJyZWFrcG9pbnRzLiAgVGhlc2UgbWV0aG9kcyByZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBhbiBlcnJvciBtZXNzYWdlIGlmCiAgICBzb21ldGhpbmcgd2VudCB3cm9uZywgb3IgYGBOb25lYGAgaWYgYWxsIGlzIHdlbGwuCiAKLSAgIC4uIG1ldGhvZDo6IHNldF9icmVhayhmaWxlbmFtZSwgbGluZW5vWywgdGVtcG9yYXJ5PTBbLCBjb25kWywgZnVuY25hbWVdXV0pCisgICAuLiBtZXRob2Q6OiBzZXRfYnJlYWsoZmlsZW5hbWUsIGxpbmVubywgdGVtcG9yYXJ5PTAsIGNvbmQ9Tm9uZSwgZnVuY25hbWU9Tm9uZSkKIAogICAgICAgU2V0IGEgbmV3IGJyZWFrcG9pbnQuICBJZiB0aGUgKmxpbmVubyogbGluZSBkb2Vzbid0IGV4aXN0IGZvciB0aGUKICAgICAgICpmaWxlbmFtZSogcGFzc2VkIGFzIGFyZ3VtZW50LCByZXR1cm4gYW4gZXJyb3IgbWVzc2FnZS4gIFRoZSAqZmlsZW5hbWUqCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9iaW5hc2NpaS5yc3QgYi9Eb2MvbGlicmFyeS9iaW5hc2NpaS5yc3QKaW5kZXggMjM5MzlkZS4uMGY4YTNkZSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvYmluYXNjaWkucnN0CisrKyBiL0RvYy9saWJyYXJ5L2JpbmFzY2lpLnJzdApAQCAtMTI3LDcgKzEyNyw3IEBACiAgICBUaGUgcmV0dXJuIHZhbHVlIGlzIGluIHRoZSByYW5nZSBbLTIqKjMxLCAyKiozMS0xXQogICAgcmVnYXJkbGVzcyBvZiBwbGF0Zm9ybS4gIEluIHRoZSBwYXN0IHRoZSB2YWx1ZSB3b3VsZCBiZSBzaWduZWQgb24KICAgIHNvbWUgcGxhdGZvcm1zIGFuZCB1bnNpZ25lZCBvbiBvdGhlcnMuICBVc2UgJiAweGZmZmZmZmZmIG9uIHRoZQotICAgdmFsdWUgaWYgeW91IHdhbnQgaXQgdG8gbWF0Y2ggMy4wIGJlaGF2aW9yLgorICAgdmFsdWUgaWYgeW91IHdhbnQgaXQgdG8gbWF0Y2ggUHl0aG9uIDMgYmVoYXZpb3IuCiAKIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4wCiAgICBUaGUgcmV0dXJuIHZhbHVlIGlzIHVuc2lnbmVkIGFuZCBpbiB0aGUgcmFuZ2UgWzAsIDIqKjMyLTFdCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9iaXNlY3QucnN0IGIvRG9jL2xpYnJhcnkvYmlzZWN0LnJzdAppbmRleCAyN2FiNTI2Li42NGEzNjJlIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9iaXNlY3QucnN0CisrKyBiL0RvYy9saWJyYXJ5L2Jpc2VjdC5yc3QKQEAgLTEyMyw5ICsxMjMsOSBAQAogYSAnQicsIGFuZCBzbyBvbjo6CiAKICAgID4+PiBkZWYgZ3JhZGUoc2NvcmUsIGJyZWFrcG9pbnRzPVs2MCwgNzAsIDgwLCA5MF0sIGdyYWRlcz0nRkRDQkEnKToKLSAgIC4uLiAgICAgaSA9IGJpc2VjdChicmVha3BvaW50cywgc2NvcmUpCi0gICAuLi4gICAgIHJldHVybiBncmFkZXNbaV0KLSAgIC4uLgorICAgICAgICAgICBpID0gYmlzZWN0KGJyZWFrcG9pbnRzLCBzY29yZSkKKyAgICAgICAgICAgcmV0dXJuIGdyYWRlc1tpXQorCiAgICA+Pj4gW2dyYWRlKHNjb3JlKSBmb3Igc2NvcmUgaW4gWzMzLCA5OSwgNzcsIDcwLCA4OSwgOTAsIDEwMF1dCiAgICBbJ0YnLCAnQScsICdDJywgJ0MnLCAnQicsICdBJywgJ0EnXQogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9ic2RkYi5yc3QgYi9Eb2MvbGlicmFyeS9ic2RkYi5yc3QKaW5kZXggNjEyYTRhOC4uNzU1MWYxMCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvYnNkZGIucnN0CisrKyBiL0RvYy9saWJyYXJ5L2JzZGRiLnJzdApAQCAtNyw3ICs3LDcgQEAKIC4uIHNlY3Rpb25hdXRob3I6OiBTa2lwIE1vbnRhbmFybyA8c2tpcEBwb2JveC5jb20+CiAKIC4uIGRlcHJlY2F0ZWQ6OiAyLjYKLSAgICBUaGUgOm1vZDpgYnNkZGJgIG1vZHVsZSBoYXMgYmVlbiBkZXByZWNhdGVkIGZvciByZW1vdmFsIGluIFB5dGhvbiAzLjAuCisgICAgVGhlIDptb2Q6YGJzZGRiYCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4KIAogCiBUaGUgOm1vZDpgYnNkZGJgIG1vZHVsZSBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gdGhlIEJlcmtlbGV5IERCIGxpYnJhcnkuICBVc2VycwpAQCAtNTIsOSArNTIsOSBAQAogICAgT3BlbiB0aGUgaGFzaCBmb3JtYXQgZmlsZSBuYW1lZCAqZmlsZW5hbWUqLiAgRmlsZXMgbmV2ZXIgaW50ZW5kZWQgdG8gYmUKICAgIHByZXNlcnZlZCBvbiBkaXNrIG1heSBiZSBjcmVhdGVkIGJ5IHBhc3NpbmcgYGBOb25lYGAgYXMgdGhlICAqZmlsZW5hbWUqLiAgVGhlCiAgICBvcHRpb25hbCAqZmxhZyogaWRlbnRpZmllcyB0aGUgbW9kZSB1c2VkIHRvIG9wZW4gdGhlIGZpbGUuICBJdCBtYXkgYmUgYGAncidgYAotICAgKHJlYWQgb25seSksIGBgJ3cnYGAgKHJlYWQtd3JpdGUpICwgYGAnYydgYCAocmVhZC13cml0ZSAtIGNyZWF0ZSBpZiBuZWNlc3Nhcnk7CisgICAocmVhZCBvbmx5KSwgYGAndydgYCAocmVhZC13cml0ZSksIGBgJ2MnYGAgKHJlYWQtd3JpdGUgLSBjcmVhdGUgaWYgbmVjZXNzYXJ5OwogICAgdGhlIGRlZmF1bHQpIG9yIGBgJ24nYGAgKHJlYWQtd3JpdGUgLSB0cnVuY2F0ZSB0byB6ZXJvIGxlbmd0aCkuICBUaGUgb3RoZXIKLSAgIGFyZ3VtZW50cyBhcmUgcmFyZWx5IHVzZWQgYW5kIGFyZSBqdXN0IHBhc3NlZCB0byB0aGUgbG93LWxldmVsIDpjZnVuYzpgZGJvcGVuYAorICAgYXJndW1lbnRzIGFyZSByYXJlbHkgdXNlZCBhbmQgYXJlIGp1c3QgcGFzc2VkIHRvIHRoZSBsb3ctbGV2ZWwgOmM6ZnVuYzpgZGJvcGVuYAogICAgZnVuY3Rpb24uICBDb25zdWx0IHRoZSBCZXJrZWxleSBEQiBkb2N1bWVudGF0aW9uIGZvciB0aGVpciB1c2UgYW5kCiAgICBpbnRlcnByZXRhdGlvbi4KIApAQCAtODYsNyArODYsNyBAQAogICAgVGhpcyBpcyBwcmVzZW50ICpvbmx5KiB0byBhbGxvdyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIHN5c3RlbXMgd2hpY2ggc2hpcAogICAgd2l0aCB0aGUgb2xkIEJlcmtlbGV5IERCIDEuODUgZGF0YWJhc2UgbGlicmFyeS4gIFRoZSA6bW9kOmBic2RkYjE4NWAgbW9kdWxlCiAgICBzaG91bGQgbmV2ZXIgYmUgdXNlZCBkaXJlY3RseSBpbiBuZXcgY29kZS4gVGhlIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluCi0gICBQeXRob24gMy4wLiAgSWYgeW91IGZpbmQgeW91IHN0aWxsIG5lZWQgaXQgbG9vayBpbiBQeVBJLgorICAgUHl0aG9uIDMuICBJZiB5b3UgZmluZCB5b3Ugc3RpbGwgbmVlZCBpdCBsb29rIGluIFB5UEkuCiAKIAogLi4gc2VlYWxzbzo6CkBAIC0xNzAsNyArMTcwLDcgQEAKIEV4YW1wbGU6OgogCiAgICA+Pj4gaW1wb3J0IGJzZGRiCi0gICA+Pj4gZGIgPSBic2RkYi5idG9wZW4oJy90bXAvc3BhbS5kYicsICdjJykKKyAgID4+PiBkYiA9IGJzZGRiLmJ0b3Blbignc3BhbS5kYicsICdjJykKICAgID4+PiBmb3IgaSBpbiByYW5nZSgxMCk6IGRiWyclZCclaV0gPSAnJWQnJSAoaSppKQogICAgLi4uCiAgICA+Pj4gZGJbJzMnXQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvYnoyLnJzdCBiL0RvYy9saWJyYXJ5L2J6Mi5yc3QKaW5kZXggZWQyODFiZC4uNjc5M2M0NCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvYnoyLnJzdAorKysgYi9Eb2MvbGlicmFyeS9iejIucnN0CkBAIC0xNCw5ICsxNCw2IEBACiBJdCBpbXBsZW1lbnRzIGEgY29tcGxldGUgZmlsZSBpbnRlcmZhY2UsIG9uZS1zaG90IChkZSljb21wcmVzc2lvbiBmdW5jdGlvbnMsIGFuZAogdHlwZXMgZm9yIHNlcXVlbnRpYWwgKGRlKWNvbXByZXNzaW9uLgogCi1Gb3Igb3RoZXIgYXJjaGl2ZSBmb3JtYXRzLCBzZWUgdGhlIDptb2Q6YGd6aXBgLCA6bW9kOmB6aXBmaWxlYCwgYW5kCi06bW9kOmB0YXJmaWxlYCBtb2R1bGVzLgotCiBIZXJlIGlzIGEgc3VtbWFyeSBvZiB0aGUgZmVhdHVyZXMgb2ZmZXJlZCBieSB0aGUgYnoyIG1vZHVsZToKIAogKiA6Y2xhc3M6YEJaMkZpbGVgIGNsYXNzIGltcGxlbWVudHMgYSBjb21wbGV0ZSBmaWxlIGludGVyZmFjZSwgaW5jbHVkaW5nCkBAIC00NSw2ICs0Miw5IEBACiBIYW5kbGluZyBvZiBjb21wcmVzc2VkIGZpbGVzIGlzIG9mZmVyZWQgYnkgdGhlIDpjbGFzczpgQloyRmlsZWAgY2xhc3MuCiAKIAorLi4gaW5kZXg6OgorICAgc2luZ2xlOiB1bml2ZXJzYWwgbmV3bGluZXM7IGJ6Mi5CWjJGaWxlIGNsYXNzCisKIC4uIGNsYXNzOjogQloyRmlsZShmaWxlbmFtZVssIG1vZGVbLCBidWZmZXJpbmdbLCBjb21wcmVzc2xldmVsXV1dKQogCiAgICBPcGVuIGEgYnoyIGZpbGUuIE1vZGUgY2FuIGJlIGVpdGhlciBgYCdyJ2BgIG9yIGBgJ3cnYGAsIGZvciByZWFkaW5nIChkZWZhdWx0KQpAQCAtNTMsNyArNTMsNyBAQAogICAgdW5idWZmZXJlZCwgYW5kIGxhcmdlciBudW1iZXJzIHNwZWNpZnkgdGhlIGJ1ZmZlciBzaXplOyB0aGUgZGVmYXVsdCBpcwogICAgYGAwYGAuIElmICpjb21wcmVzc2xldmVsKiBpcyBnaXZlbiwgaXQgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIGBgMWBgIGFuZAogICAgYGA5YGA7IHRoZSBkZWZhdWx0IGlzIGBgOWBgLiBBZGQgYSBgYCdVJ2BgIHRvIG1vZGUgdG8gb3BlbiB0aGUgZmlsZSBmb3IgaW5wdXQKLSAgIHdpdGggdW5pdmVyc2FsIG5ld2xpbmUgc3VwcG9ydC4gQW55IGxpbmUgZW5kaW5nIGluIHRoZSBpbnB1dCBmaWxlIHdpbGwgYmUKKyAgIGluIDp0ZXJtOmB1bml2ZXJzYWwgbmV3bGluZXNgIG1vZGUuIEFueSBsaW5lIGVuZGluZyBpbiB0aGUgaW5wdXQgZmlsZSB3aWxsIGJlCiAgICBzZWVuIGFzIGEgYGAnXG4nYGAgaW4gUHl0aG9uLiAgQWxzbywgYSBmaWxlIHNvIG9wZW5lZCBnYWlucyB0aGUgYXR0cmlidXRlCiAgICA6YXR0cjpgbmV3bGluZXNgOyB0aGUgdmFsdWUgZm9yIHRoaXMgYXR0cmlidXRlIGlzIG9uZSBvZiBgYE5vbmVgYCAobm8gbmV3bGluZQogICAgcmVhZCB5ZXQpLCBgYCdccidgYCwgYGAnXG4nYGAsIGBgJ1xyXG4nYGAgb3IgYSB0dXBsZSBjb250YWluaW5nIGFsbCB0aGUKQEAgLTY3LDYgKzY3LDE4IEBACiAgICAgICBTdXBwb3J0IGZvciB0aGUgOmtleXdvcmQ6YHdpdGhgIHN0YXRlbWVudCB3YXMgYWRkZWQuCiAKIAorICAgLi4gbm90ZTo6CisKKyAgICAgIFRoaXMgY2xhc3MgZG9lcyBub3Qgc3VwcG9ydCBpbnB1dCBmaWxlcyBjb250YWluaW5nIG11bHRpcGxlIHN0cmVhbXMgKHN1Y2gKKyAgICAgIGFzIHRob3NlIHByb2R1Y2VkIGJ5IHRoZSA6cHJvZ3JhbTpgcGJ6aXAyYCB0b29sKS4gV2hlbiByZWFkaW5nIHN1Y2ggYW4KKyAgICAgIGlucHV0IGZpbGUsIG9ubHkgdGhlIGZpcnN0IHN0cmVhbSB3aWxsIGJlIGFjY2Vzc2libGUuIElmIHlvdSByZXF1aXJlCisgICAgICBzdXBwb3J0IGZvciBtdWx0aS1zdHJlYW0gZmlsZXMsIGNvbnNpZGVyIHVzaW5nIHRoZSB0aGlyZC1wYXJ0eQorICAgICAgOm1vZDpgYnoyZmlsZWAgbW9kdWxlIChhdmFpbGFibGUgZnJvbQorICAgICAgYFB5UEkgPGh0dHA6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaS9iejJmaWxlPmBfKS4gVGhpcyBtb2R1bGUgcHJvdmlkZXMgYQorICAgICAgYmFja3BvcnQgb2YgUHl0aG9uIDMuMydzIDpjbGFzczpgQloyRmlsZWAgY2xhc3MsIHdoaWNoIGRvZXMgc3VwcG9ydAorICAgICAgbXVsdGktc3RyZWFtIGZpbGVzLgorCisKICAgIC4uIG1ldGhvZDo6IGNsb3NlKCkKIAogICAgICAgQ2xvc2UgdGhlIGZpbGUuIFNldHMgZGF0YSBhdHRyaWJ1dGUgOmF0dHI6YGNsb3NlZGAgdG8gdHJ1ZS4gQSBjbG9zZWQgZmlsZQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY2FsZW5kYXIucnN0IGIvRG9jL2xpYnJhcnkvY2FsZW5kYXIucnN0CmluZGV4IGY0ZjQ2OTMuLmEwNDUwNWYgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2NhbGVuZGFyLnJzdAorKysgYi9Eb2MvbGlicmFyeS9jYWxlbmRhci5yc3QKQEAgLTI5NCwxMCArMjk0LDExIEBACiAKIC4uIGZ1bmN0aW9uOjogdGltZWdtKHR1cGxlKQogCi0gICBBbiB1bnJlbGF0ZWQgYnV0IGhhbmR5IGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSB0aW1lIHR1cGxlIHN1Y2ggYXMgcmV0dXJuZWQgYnkgdGhlCi0gICA6ZnVuYzpgZ210aW1lYCBmdW5jdGlvbiBpbiB0aGUgOm1vZDpgdGltZWAgbW9kdWxlLCBhbmQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZwotICAgVW5peCB0aW1lc3RhbXAgdmFsdWUsIGFzc3VtaW5nIGFuIGVwb2NoIG9mIDE5NzAsIGFuZCB0aGUgUE9TSVggZW5jb2RpbmcuICBJbgotICAgZmFjdCwgOmZ1bmM6YHRpbWUuZ210aW1lYCBhbmQgOmZ1bmM6YHRpbWVnbWAgYXJlIGVhY2ggb3RoZXJzJyBpbnZlcnNlLgorICAgQW4gdW5yZWxhdGVkIGJ1dCBoYW5keSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgdGltZSB0dXBsZSBzdWNoIGFzIHJldHVybmVkIGJ5CisgICB0aGUgOmZ1bmM6YH50aW1lLmdtdGltZWAgZnVuY3Rpb24gaW4gdGhlIDptb2Q6YHRpbWVgIG1vZHVsZSwgYW5kIHJldHVybnMgdGhlCisgICBjb3JyZXNwb25kaW5nIFVuaXggdGltZXN0YW1wIHZhbHVlLCBhc3N1bWluZyBhbiBlcG9jaCBvZiAxOTcwLCBhbmQgdGhlIFBPU0lYCisgICBlbmNvZGluZy4gIEluIGZhY3QsIDpmdW5jOmB0aW1lLmdtdGltZWAgYW5kIDpmdW5jOmB0aW1lZ21gIGFyZSBlYWNoIG90aGVycycKKyAgIGludmVyc2UuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMAogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9jYXJib24ucnN0IGIvRG9jL2xpYnJhcnkvY2FyYm9uLnJzdAppbmRleCBjNTNjMWI2Li40MGI3NmVmIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9jYXJib24ucnN0CisrKyBiL0RvYy9saWJyYXJ5L2NhcmJvbi5yc3QKQEAgLTUsNyArNSw3IEBACiBNYWMgT1MgVG9vbGJveCBNb2R1bGVzCiAqKioqKioqKioqKioqKioqKioqKioqCiAKLVRoZXJlIGFyZSBhIHNldCBvZiBtb2R1bGVzIHRoYXQgcHJvdmlkZSBpbnRlcmZhY2VzIHRvIHZhcmlvdXMgTWFjIE9TIHRvb2xib3hlcy4KK1RoZXNlIGFyZSBhIHNldCBvZiBtb2R1bGVzIHRoYXQgcHJvdmlkZSBpbnRlcmZhY2VzIHRvIHZhcmlvdXMgbGVnYWN5IE1hYyBPUyB0b29sYm94ZXMuCiBJZiBhcHBsaWNhYmxlIHRoZSBtb2R1bGUgd2lsbCBkZWZpbmUgYSBudW1iZXIgb2YgUHl0aG9uIG9iamVjdHMgZm9yIHRoZSB2YXJpb3VzCiBzdHJ1Y3R1cmVzIGRlY2xhcmVkIGJ5IHRoZSB0b29sYm94LCBhbmQgb3BlcmF0aW9ucyB3aWxsIGJlIGltcGxlbWVudGVkIGFzCiBtZXRob2RzIG9mIHRoZSBvYmplY3QuICBPdGhlciBvcGVyYXRpb25zIHdpbGwgYmUgaW1wbGVtZW50ZWQgYXMgZnVuY3Rpb25zIGluIHRoZQpAQCAtMTQsNyArMTQsNyBAQAogaW4gUHl0aG9uIChpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMsIGVzcGVjaWFsbHkpLiAgQWxsIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucwogaGF2ZSBhIDphdHRyOmBfX2RvY19fYCBzdHJpbmcgZGVzY3JpYmluZyB0aGVpciBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZXMsIGFuZAogZm9yIGFkZGl0aW9uYWwgZGVzY3JpcHRpb24geW91IGFyZSByZWZlcnJlZCB0byBgSW5zaWRlIE1hY2ludG9zaAotPGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24vbWFjb3M4L21hYzguaHRtbD5gXyBvciBzaW1pbGFyIHdvcmtzLgorPGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2xlZ2FjeS9tYWMvbGlicmFyeS8jZG9jdW1lbnRhdGlvbi9tYWNvczgvbWFjOC5odG1sPmBfIG9yIHNpbWlsYXIgd29ya3MuCiAKIFRoZXNlIG1vZHVsZXMgYWxsIGxpdmUgaW4gYSBwYWNrYWdlIGNhbGxlZCA6bW9kOmBDYXJib25gLiBEZXNwaXRlIHRoYXQgbmFtZSB0aGV5CiBhcmUgbm90IGFsbCBwYXJ0IG9mIHRoZSBDYXJib24gZnJhbWV3b3JrOiBDRiBpcyByZWFsbHkgaW4gdGhlIENvcmVGb3VuZGF0aW9uCkBAIC0yNCw3ICsyNCwxMCBAQAogCiAuLiBub3RlOjoKIAotICAgVGhlIENhcmJvbiBtb2R1bGVzIGhhdmUgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLjAuCisgICBNb3N0IG9mIHRoZSBPUyBYIEFQSXMgdGhhdCB0aGVzZSBtb2R1bGVzIHVzZSBhcmUgZGVwcmVjYXRlZCBvciByZW1vdmVkCisgICBpbiByZWNlbnQgdmVyc2lvbnMgb2YgT1MgWC4gIE1hbnkgYXJlIG5vdCBhdmFpbGFibGUgd2hlbiBQeXRob24gaXMKKyAgIGV4ZWN1dGluZyBpbiA2NC1iaXQgbW9kZS4gIFRoZSBDYXJib24gbW9kdWxlcyBoYXZlIGJlZW4gcmVtb3ZlZCBpbgorICAgUHl0aG9uIDMuICBZb3Ugc2hvdWxkIGF2b2lkIHVzaW5nIHRoZW0gaW4gUHl0aG9uIDIuCiAKIAogOm1vZDpgQ2FyYm9uLkFFYCAtLS0gQXBwbGUgRXZlbnRzCkBAIC01MTUsNyArNTE4LDcgQEAKIAogLi4gc2VlYWxzbzo6CiAKLSAgIGBTY3JhcCBNYW5hZ2VyIDxodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL21hYy9Nb3JlVG9vbGJveC9Nb3JlVG9vbGJveC0xMDkuaHRtbD5gXworICAgYFNjcmFwIE1hbmFnZXIgPGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2xlZ2FjeS9tYWMvbGlicmFyeS9kb2N1bWVudGF0aW9uL21hYy9Nb3JlVG9vbGJveC9Nb3JlVG9vbGJveC0xMDkuaHRtbD5gXwogICAgICAgQXBwbGUncyBkb2N1bWVudGF0aW9uIGZvciB0aGUgU2NyYXAgTWFuYWdlciBnaXZlcyBhIGxvdCBvZiB1c2VmdWwgaW5mb3JtYXRpb24KICAgICAgIGFib3V0IHVzaW5nIHRoZSBTY3JhcCBNYW5hZ2VyIGluIGFwcGxpY2F0aW9ucy4KIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY2QucnN0IGIvRG9jL2xpYnJhcnkvY2QucnN0CmluZGV4IGYxZDk3NjMuLjQwYjhjZTYgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2NkLnJzdAorKysgYi9Eb2MvbGlicmFyeS9jZC5yc3QKQEAgLTksNyArOSw3IEBACiAKIAogLi4gZGVwcmVjYXRlZDo6IDIuNgotICAgIFRoZSA6bW9kOmBjZGAgbW9kdWxlIGhhcyBiZWVuIGRlcHJlY2F0ZWQgZm9yIHJlbW92YWwgaW4gUHl0aG9uIDMuMC4KKyAgICBUaGUgOm1vZDpgY2RgIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLgogCiAKIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGFuIGludGVyZmFjZSB0byB0aGUgU2lsaWNvbiBHcmFwaGljcyBDRCBsaWJyYXJ5LiBJdCBpcwpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY2dpLnJzdCBiL0RvYy9saWJyYXJ5L2NnaS5yc3QKaW5kZXggYjk1ZjEzMS4uNmY3YzI2NSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvY2dpLnJzdAorKysgYi9Eb2MvbGlicmFyeS9jZ2kucnN0CkBAIC04MSw3ICs4MSw3IEBACiBpbnN0ZWFkLCB3aXRoIGNvZGUgbGlrZSB0aGlzOjoKIAogICAgaW1wb3J0IGNnaXRiCi0gICBjZ2l0Yi5lbmFibGUoZGlzcGxheT0wLCBsb2dkaXI9Ii90bXAiKQorICAgY2dpdGIuZW5hYmxlKGRpc3BsYXk9MCwgbG9nZGlyPSIvcGF0aC90by9sb2dkaXIiKQogCiBJdCdzIHZlcnkgaGVscGZ1bCB0byB1c2UgdGhpcyBmZWF0dXJlIGR1cmluZyBzY3JpcHQgZGV2ZWxvcG1lbnQuIFRoZSByZXBvcnRzCiBwcm9kdWNlZCBieSA6bW9kOmBjZ2l0YmAgcHJvdmlkZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBzYXZlIHlvdSBhIGxvdCBvZiB0aW1lIGluCkBAIC05Nyw3ICs5Nyw3IEBACiAKIFRoZSA6Y2xhc3M6YEZpZWxkU3RvcmFnZWAgaW5zdGFuY2UgY2FuIGJlIGluZGV4ZWQgbGlrZSBhIFB5dGhvbiBkaWN0aW9uYXJ5LgogSXQgYWxsb3dzIG1lbWJlcnNoaXAgdGVzdGluZyB3aXRoIHRoZSA6a2V5d29yZDpgaW5gIG9wZXJhdG9yLCBhbmQgYWxzbyBzdXBwb3J0cwotdGhlIHN0YW5kYXJkIGRpY3Rpb25hcnkgbWV0aG9kIDptZXRoOmBrZXlzYCBhbmQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uCit0aGUgc3RhbmRhcmQgZGljdGlvbmFyeSBtZXRob2QgOm1ldGg6YH5kaWN0LmtleXNgIGFuZCB0aGUgYnVpbHQtaW4gZnVuY3Rpb24KIDpmdW5jOmBsZW5gLiAgRm9ybSBmaWVsZHMgY29udGFpbmluZyBlbXB0eSBzdHJpbmdzIGFyZSBpZ25vcmVkIGFuZCBkbyBub3QgYXBwZWFyCiBpbiB0aGUgZGljdGlvbmFyeTsgdG8ga2VlcCBzdWNoIHZhbHVlcywgcHJvdmlkZSBhIHRydWUgdmFsdWUgZm9yIHRoZSBvcHRpb25hbAogKmtlZXBfYmxhbmtfdmFsdWVzKiBrZXl3b3JkIHBhcmFtZXRlciB3aGVuIGNyZWF0aW5nIHRoZSA6Y2xhc3M6YEZpZWxkU3RvcmFnZWAKQEAgLTExOSwyOCArMTE5LDI5IEBACiAKIEhlcmUgdGhlIGZpZWxkcywgYWNjZXNzZWQgdGhyb3VnaCBgYGZvcm1ba2V5XWBgLCBhcmUgdGhlbXNlbHZlcyBpbnN0YW5jZXMgb2YKIDpjbGFzczpgRmllbGRTdG9yYWdlYCAob3IgOmNsYXNzOmBNaW5pRmllbGRTdG9yYWdlYCwgZGVwZW5kaW5nIG9uIHRoZSBmb3JtCi1lbmNvZGluZykuIFRoZSA6YXR0cjpgdmFsdWVgIGF0dHJpYnV0ZSBvZiB0aGUgaW5zdGFuY2UgeWllbGRzIHRoZSBzdHJpbmcgdmFsdWUKLW9mIHRoZSBmaWVsZC4gIFRoZSA6bWV0aDpgZ2V0dmFsdWVgIG1ldGhvZCByZXR1cm5zIHRoaXMgc3RyaW5nIHZhbHVlIGRpcmVjdGx5OwotaXQgYWxzbyBhY2NlcHRzIGFuIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCBhcyBhIGRlZmF1bHQgdG8gcmV0dXJuIGlmIHRoZQotcmVxdWVzdGVkIGtleSBpcyBub3QgcHJlc2VudC4KK2VuY29kaW5nKS4gVGhlIDphdHRyOmB+RmllbGRTdG9yYWdlLnZhbHVlYCBhdHRyaWJ1dGUgb2YgdGhlIGluc3RhbmNlIHlpZWxkcwordGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgZmllbGQuICBUaGUgOm1ldGg6YH5GaWVsZFN0b3JhZ2UuZ2V0dmFsdWVgIG1ldGhvZAorcmV0dXJucyB0aGlzIHN0cmluZyB2YWx1ZSBkaXJlY3RseTsgaXQgYWxzbyBhY2NlcHRzIGFuIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudAorYXMgYSBkZWZhdWx0IHRvIHJldHVybiBpZiB0aGUgcmVxdWVzdGVkIGtleSBpcyBub3QgcHJlc2VudC4KIAogSWYgdGhlIHN1Ym1pdHRlZCBmb3JtIGRhdGEgY29udGFpbnMgbW9yZSB0aGFuIG9uZSBmaWVsZCB3aXRoIHRoZSBzYW1lIG5hbWUsIHRoZQogb2JqZWN0IHJldHJpZXZlZCBieSBgYGZvcm1ba2V5XWBgIGlzIG5vdCBhIDpjbGFzczpgRmllbGRTdG9yYWdlYCBvcgogOmNsYXNzOmBNaW5pRmllbGRTdG9yYWdlYCBpbnN0YW5jZSBidXQgYSBsaXN0IG9mIHN1Y2ggaW5zdGFuY2VzLiAgU2ltaWxhcmx5LCBpbgogdGhpcyBzaXR1YXRpb24sIGBgZm9ybS5nZXR2YWx1ZShrZXkpYGAgd291bGQgcmV0dXJuIGEgbGlzdCBvZiBzdHJpbmdzLiBJZiB5b3UKIGV4cGVjdCB0aGlzIHBvc3NpYmlsaXR5ICh3aGVuIHlvdXIgSFRNTCBmb3JtIGNvbnRhaW5zIG11bHRpcGxlIGZpZWxkcyB3aXRoIHRoZQotc2FtZSBuYW1lKSwgdXNlIHRoZSA6ZnVuYzpgZ2V0bGlzdGAgZnVuY3Rpb24sIHdoaWNoIGFsd2F5cyByZXR1cm5zIGEgbGlzdCBvZgotdmFsdWVzIChzbyB0aGF0IHlvdSBkbyBub3QgbmVlZCB0byBzcGVjaWFsLWNhc2UgdGhlIHNpbmdsZSBpdGVtIGNhc2UpLiAgRm9yCi1leGFtcGxlLCB0aGlzIGNvZGUgY29uY2F0ZW5hdGVzIGFueSBudW1iZXIgb2YgdXNlcm5hbWUgZmllbGRzLCBzZXBhcmF0ZWQgYnkKLWNvbW1hczo6CitzYW1lIG5hbWUpLCB1c2UgdGhlIDptZXRoOmB+RmllbGRTdG9yYWdlLmdldGxpc3RgIG1ldGhvZCwgd2hpY2ggYWx3YXlzIHJldHVybnMKK2EgbGlzdCBvZiB2YWx1ZXMgKHNvIHRoYXQgeW91IGRvIG5vdCBuZWVkIHRvIHNwZWNpYWwtY2FzZSB0aGUgc2luZ2xlIGl0ZW0KK2Nhc2UpLiAgRm9yIGV4YW1wbGUsIHRoaXMgY29kZSBjb25jYXRlbmF0ZXMgYW55IG51bWJlciBvZiB1c2VybmFtZSBmaWVsZHMsCitzZXBhcmF0ZWQgYnkgY29tbWFzOjoKIAogICAgdmFsdWUgPSBmb3JtLmdldGxpc3QoInVzZXJuYW1lIikKICAgIHVzZXJuYW1lcyA9ICIsIi5qb2luKHZhbHVlKQogCiBJZiBhIGZpZWxkIHJlcHJlc2VudHMgYW4gdXBsb2FkZWQgZmlsZSwgYWNjZXNzaW5nIHRoZSB2YWx1ZSB2aWEgdGhlCi06YXR0cjpgdmFsdWVgIGF0dHJpYnV0ZSBvciB0aGUgOmZ1bmM6YGdldHZhbHVlYCBtZXRob2QgcmVhZHMgdGhlIGVudGlyZSBmaWxlIGluCi1tZW1vcnkgYXMgYSBzdHJpbmcuICBUaGlzIG1heSBub3QgYmUgd2hhdCB5b3Ugd2FudC4gWW91IGNhbiB0ZXN0IGZvciBhbiB1cGxvYWRlZAotZmlsZSBieSB0ZXN0aW5nIGVpdGhlciB0aGUgOmF0dHI6YGZpbGVuYW1lYCBhdHRyaWJ1dGUgb3IgdGhlIDphdHRyOmAhZmlsZWAKKzphdHRyOmB+RmllbGRTdG9yYWdlLnZhbHVlYCBhdHRyaWJ1dGUgb3IgdGhlIDpmdW5jOmB+RmllbGRTdG9yYWdlLmdldHZhbHVlYAorbWV0aG9kIHJlYWRzIHRoZSBlbnRpcmUgZmlsZSBpbiBtZW1vcnkgYXMgYSBzdHJpbmcuICBUaGlzIG1heSBub3QgYmUgd2hhdCB5b3UKK3dhbnQuIFlvdSBjYW4gdGVzdCBmb3IgYW4gdXBsb2FkZWQgZmlsZSBieSB0ZXN0aW5nIGVpdGhlciB0aGUKKzphdHRyOmB+RmllbGRTdG9yYWdlLmZpbGVuYW1lYCBhdHRyaWJ1dGUgb3IgdGhlIDphdHRyOmB+RmllbGRTdG9yYWdlLmZpbGVgCiBhdHRyaWJ1dGUuICBZb3UgY2FuIHRoZW4gcmVhZCB0aGUgZGF0YSBhdCBsZWlzdXJlIGZyb20gdGhlIDphdHRyOmAhZmlsZWAKIGF0dHJpYnV0ZTo6CiAKQEAgLTE1NSw4ICsxNTYsOCBAQAogCiBJZiBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCB3aGVuIG9idGFpbmluZyB0aGUgY29udGVudHMgb2YgYW4gdXBsb2FkZWQgZmlsZQogKGZvciBleGFtcGxlLCB3aGVuIHRoZSB1c2VyIGludGVycnVwdHMgdGhlIGZvcm0gc3VibWlzc2lvbiBieSBjbGlja2luZyBvbgotYSBCYWNrIG9yIENhbmNlbCBidXR0b24pIHRoZSA6YXR0cjpgZG9uZWAgYXR0cmlidXRlIG9mIHRoZSBvYmplY3QgZm9yIHRoZQotZmllbGQgd2lsbCBiZSBzZXQgdG8gdGhlIHZhbHVlIC0xLgorYSBCYWNrIG9yIENhbmNlbCBidXR0b24pIHRoZSA6YXR0cjpgfkZpZWxkU3RvcmFnZS5kb25lYCBhdHRyaWJ1dGUgb2YgdGhlCitvYmplY3QgZm9yIHRoZSBmaWVsZCB3aWxsIGJlIHNldCB0byB0aGUgdmFsdWUgLTEuCiAKIFRoZSBmaWxlIHVwbG9hZCBkcmFmdCBzdGFuZGFyZCBlbnRlcnRhaW5zIHRoZSBwb3NzaWJpbGl0eSBvZiB1cGxvYWRpbmcgbXVsdGlwbGUKIGZpbGVzIGZyb20gb25lIGZpZWxkICh1c2luZyBhIHJlY3Vyc2l2ZSA6bWltZXR5cGU6YG11bHRpcGFydC9cKmAgZW5jb2RpbmcpLgpAQCAtMjI1LDggKzIyNiw4IEBACiBjb2RlIHdoaWNoIGNoZWNrcyB3aGV0aGVyIHRoZSBvYnRhaW5lZCB2YWx1ZSBpcyBhIHNpbmdsZSB2YWx1ZSBvciBhIGxpc3Qgb2YKIHZhbHVlcy4gIFRoYXQncyBhbm5veWluZyBhbmQgbGVhZHMgdG8gbGVzcyByZWFkYWJsZSBzY3JpcHRzLgogCi1BIG1vcmUgY29udmVuaWVudCBhcHByb2FjaCBpcyB0byB1c2UgdGhlIG1ldGhvZHMgOm1ldGg6YGdldGZpcnN0YCBhbmQKLTptZXRoOmBnZXRsaXN0YCBwcm92aWRlZCBieSB0aGlzIGhpZ2hlciBsZXZlbCBpbnRlcmZhY2UuCitBIG1vcmUgY29udmVuaWVudCBhcHByb2FjaCBpcyB0byB1c2UgdGhlIG1ldGhvZHMgOm1ldGg6YH5GaWVsZFN0b3JhZ2UuZ2V0Zmlyc3RgCithbmQgOm1ldGg6YH5GaWVsZFN0b3JhZ2UuZ2V0bGlzdGAgcHJvdmlkZWQgYnkgdGhpcyBoaWdoZXIgbGV2ZWwgaW50ZXJmYWNlLgogCiAKIC4uIG1ldGhvZDo6IEZpZWxkU3RvcmFnZS5nZXRmaXJzdChuYW1lWywgZGVmYXVsdF0pCkBAIC0yODQsMTAgKzI4NSwxMCBAQAogYWxnb3JpdGhtcyBpbXBsZW1lbnRlZCBpbiB0aGlzIG1vZHVsZSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgogCiAKLS4uIGZ1bmN0aW9uOjogcGFyc2UoZnBbLCBrZWVwX2JsYW5rX3ZhbHVlc1ssIHN0cmljdF9wYXJzaW5nXV0pCisuLiBmdW5jdGlvbjo6IHBhcnNlKGZwWywgZW52aXJvblssIGtlZXBfYmxhbmtfdmFsdWVzWywgc3RyaWN0X3BhcnNpbmddXV0pCiAKICAgIFBhcnNlIGEgcXVlcnkgaW4gdGhlIGVudmlyb25tZW50IG9yIGZyb20gYSBmaWxlICh0aGUgZmlsZSBkZWZhdWx0cyB0bwotICAgYGBzeXMuc3RkaW5gYCkuICBUaGUgKmtlZXBfYmxhbmtfdmFsdWVzKiBhbmQgKnN0cmljdF9wYXJzaW5nKiBwYXJhbWV0ZXJzIGFyZQorICAgYGBzeXMuc3RkaW5gYCBhbmQgZW52aXJvbm1lbnQgZGVmYXVsdHMgdG8gYGBvcy5lbnZpcm9uYGApLiAgVGhlICprZWVwX2JsYW5rX3ZhbHVlcyogYW5kICpzdHJpY3RfcGFyc2luZyogcGFyYW1ldGVycyBhcmUKICAgIHBhc3NlZCB0byA6ZnVuYzpgdXJscGFyc2UucGFyc2VfcXNgIHVuY2hhbmdlZC4KIAogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9jZ2lodHRwc2VydmVyLnJzdCBiL0RvYy9saWJyYXJ5L2NnaWh0dHBzZXJ2ZXIucnN0CmluZGV4IDM5MGIyYTYuLjAxM2VlODIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2NnaWh0dHBzZXJ2ZXIucnN0CisrKyBiL0RvYy9saWJyYXJ5L2NnaWh0dHBzZXJ2ZXIucnN0CkBAIC04LDggKzgsOCBAQAogCiAuLiBub3RlOjoKICAgIFRoZSA6bW9kOmBDR0lIVFRQU2VydmVyYCBtb2R1bGUgaGFzIGJlZW4gbWVyZ2VkIGludG8gOm1vZDpgaHR0cC5zZXJ2ZXJgIGluCi0gICBQeXRob24gMy4wLiAgVGhlIDp0ZXJtOmAydG8zYCB0b29sIHdpbGwgYXV0b21hdGljYWxseSBhZGFwdCBpbXBvcnRzIHdoZW4KLSAgIGNvbnZlcnRpbmcgeW91ciBzb3VyY2VzIHRvIDMuMC4KKyAgIFB5dGhvbiAzLiAgVGhlIDp0ZXJtOmAydG8zYCB0b29sIHdpbGwgYXV0b21hdGljYWxseSBhZGFwdCBpbXBvcnRzIHdoZW4KKyAgIGNvbnZlcnRpbmcgeW91ciBzb3VyY2VzIHRvIFB5dGhvbiAzLgogCiAKIFRoZSA6bW9kOmBDR0lIVFRQU2VydmVyYCBtb2R1bGUgZGVmaW5lcyBhIHJlcXVlc3QtaGFuZGxlciBjbGFzcywgaW50ZXJmYWNlCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9jaHVuay5yc3QgYi9Eb2MvbGlicmFyeS9jaHVuay5yc3QKaW5kZXggNjRjZTRlMi4uMDRjN2UyNyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvY2h1bmsucnN0CisrKyBiL0RvYy9saWJyYXJ5L2NodW5rLnJzdApAQCAtNTUsOCArNTUsOSBAQAogCiAgICBDbGFzcyB3aGljaCByZXByZXNlbnRzIGEgY2h1bmsuICBUaGUgKmZpbGUqIGFyZ3VtZW50IGlzIGV4cGVjdGVkIHRvIGJlIGEKICAgIGZpbGUtbGlrZSBvYmplY3QuICBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIHNwZWNpZmljYWxseSBhbGxvd2VkLiAgVGhlCi0gICBvbmx5IG1ldGhvZCB0aGF0IGlzIG5lZWRlZCBpcyA6bWV0aDpgcmVhZGAuICBJZiB0aGUgbWV0aG9kcyA6bWV0aDpgc2Vla2AgYW5kCi0gICA6bWV0aDpgdGVsbGAgYXJlIHByZXNlbnQgYW5kIGRvbid0IHJhaXNlIGFuIGV4Y2VwdGlvbiwgdGhleSBhcmUgYWxzbyB1c2VkLgorICAgb25seSBtZXRob2QgdGhhdCBpcyBuZWVkZWQgaXMgOm1ldGg6YH5maWxlLnJlYWRgLiAgSWYgdGhlIG1ldGhvZHMKKyAgIDptZXRoOmB+ZmlsZS5zZWVrYCBhbmQgOm1ldGg6YH5maWxlLnRlbGxgIGFyZSBwcmVzZW50IGFuZCBkb24ndAorICAgcmFpc2UgYW4gZXhjZXB0aW9uLCB0aGV5IGFyZSBhbHNvIHVzZWQuCiAgICBJZiB0aGVzZSBtZXRob2RzIGFyZSBwcmVzZW50IGFuZCByYWlzZSBhbiBleGNlcHRpb24sIHRoZXkgYXJlIGV4cGVjdGVkIHRvIG5vdAogICAgaGF2ZSBhbHRlcmVkIHRoZSBvYmplY3QuICBJZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgKmFsaWduKiBpcyB0cnVlLCBjaHVua3MKICAgIGFyZSBhc3N1bWVkIHRvIGJlIGFsaWduZWQgb24gMi1ieXRlIGJvdW5kYXJpZXMuICBJZiAqYWxpZ24qIGlzIGZhbHNlLCBubwpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY29kZS5yc3QgYi9Eb2MvbGlicmFyeS9jb2RlLnJzdAppbmRleCAzOGUyNmJjLi42OThmYjExIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9jb2RlLnJzdAorKysgYi9Eb2MvbGlicmFyeS9jb2RlLnJzdApAQCAtMzMsMTEgKzMzLDExIEBACiAKICAgIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIHJ1biBhIHJlYWQtZXZhbC1wcmludCBsb29wLiAgVGhpcyBjcmVhdGVzIGEgbmV3IGluc3RhbmNlCiAgICBvZiA6Y2xhc3M6YEludGVyYWN0aXZlQ29uc29sZWAgYW5kIHNldHMgKnJlYWRmdW5jKiB0byBiZSB1c2VkIGFzIHRoZQotICAgOm1ldGg6YHJhd19pbnB1dGAgbWV0aG9kLCBpZiBwcm92aWRlZC4gIElmICpsb2NhbCogaXMgcHJvdmlkZWQsIGl0IGlzIHBhc3NlZCB0bwotICAgdGhlIDpjbGFzczpgSW50ZXJhY3RpdmVDb25zb2xlYCBjb25zdHJ1Y3RvciBmb3IgdXNlIGFzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBmb3IKLSAgIHRoZSBpbnRlcnByZXRlciBsb29wLiAgVGhlIDptZXRoOmBpbnRlcmFjdGAgbWV0aG9kIG9mIHRoZSBpbnN0YW5jZSBpcyB0aGVuIHJ1bgotICAgd2l0aCAqYmFubmVyKiBwYXNzZWQgYXMgdGhlIGJhbm5lciB0byB1c2UsIGlmIHByb3ZpZGVkLiAgVGhlIGNvbnNvbGUgb2JqZWN0IGlzCi0gICBkaXNjYXJkZWQgYWZ0ZXIgdXNlLgorICAgOm1ldGg6YEludGVyYWN0aXZlQ29uc29sZS5yYXdfaW5wdXRgIG1ldGhvZCwgaWYgcHJvdmlkZWQuICBJZiAqbG9jYWwqIGlzCisgICBwcm92aWRlZCwgaXQgaXMgcGFzc2VkIHRvIHRoZSA6Y2xhc3M6YEludGVyYWN0aXZlQ29uc29sZWAgY29uc3RydWN0b3IgZm9yCisgICB1c2UgYXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIGZvciB0aGUgaW50ZXJwcmV0ZXIgbG9vcC4gIFRoZSA6bWV0aDpgaW50ZXJhY3RgCisgICBtZXRob2Qgb2YgdGhlIGluc3RhbmNlIGlzIHRoZW4gcnVuIHdpdGggKmJhbm5lciogcGFzc2VkIGFzIHRoZSBiYW5uZXIgdG8KKyAgIHVzZSwgaWYgcHJvdmlkZWQuICBUaGUgY29uc29sZSBvYmplY3QgaXMgZGlzY2FyZGVkIGFmdGVyIHVzZS4KIAogCiAuLiBmdW5jdGlvbjo6IGNvbXBpbGVfY29tbWFuZChzb3VyY2VbLCBmaWxlbmFtZVssIHN5bWJvbF1dKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY29kZWNzLnJzdCBiL0RvYy9saWJyYXJ5L2NvZGVjcy5yc3QKaW5kZXggODJjZjkxMi4uMDVjNzE1NiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvY29kZWNzLnJzdAorKysgYi9Eb2MvbGlicmFyeS9jb2RlY3MucnN0CkBAIC0yMyw2ICsyMywzMSBAQAogCiBJdCBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgogCisuLiBmdW5jdGlvbjo6IGVuY29kZShvYmosIFtlbmNvZGluZ1ssIGVycm9yc11dKQorCisgICBFbmNvZGVzICpvYmoqIHVzaW5nIHRoZSBjb2RlYyByZWdpc3RlcmVkIGZvciAqZW5jb2RpbmcqLiBUaGUgZGVmYXVsdAorICAgZW5jb2RpbmcgaXMgYGAnYXNjaWknYGAuCisKKyAgICpFcnJvcnMqIG1heSBiZSBnaXZlbiB0byBzZXQgdGhlIGRlc2lyZWQgZXJyb3IgaGFuZGxpbmcgc2NoZW1lLiBUaGUKKyAgIGRlZmF1bHQgZXJyb3IgaGFuZGxlciBpcyBgYCdzdHJpY3QnYGAgbWVhbmluZyB0aGF0IGVuY29kaW5nIGVycm9ycyByYWlzZQorICAgOmV4YzpgVmFsdWVFcnJvcmAgKG9yIGEgbW9yZSBjb2RlYyBzcGVjaWZpYyBzdWJjbGFzcywgc3VjaCBhcworICAgOmV4YzpgVW5pY29kZUVuY29kZUVycm9yYCkuIFJlZmVyIHRvIDpyZWY6YGNvZGVjLWJhc2UtY2xhc3Nlc2AgZm9yIG1vcmUKKyAgIGluZm9ybWF0aW9uIG9uIGNvZGVjIGVycm9yIGhhbmRsaW5nLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjQKKworLi4gZnVuY3Rpb246OiBkZWNvZGUob2JqLCBbZW5jb2RpbmdbLCBlcnJvcnNdXSkKKworICAgRGVjb2RlcyAqb2JqKiB1c2luZyB0aGUgY29kZWMgcmVnaXN0ZXJlZCBmb3IgKmVuY29kaW5nKi4gVGhlIGRlZmF1bHQKKyAgIGVuY29kaW5nIGlzIGBgJ2FzY2lpJ2BgLgorCisgICAqRXJyb3JzKiBtYXkgYmUgZ2l2ZW4gdG8gc2V0IHRoZSBkZXNpcmVkIGVycm9yIGhhbmRsaW5nIHNjaGVtZS4gVGhlCisgICBkZWZhdWx0IGVycm9yIGhhbmRsZXIgaXMgYGAnc3RyaWN0J2BgIG1lYW5pbmcgdGhhdCBkZWNvZGluZyBlcnJvcnMgcmFpc2UKKyAgIDpleGM6YFZhbHVlRXJyb3JgIChvciBhIG1vcmUgY29kZWMgc3BlY2lmaWMgc3ViY2xhc3MsIHN1Y2ggYXMKKyAgIDpleGM6YFVuaWNvZGVEZWNvZGVFcnJvcmApLiBSZWZlciB0byA6cmVmOmBjb2RlYy1iYXNlLWNsYXNzZXNgIGZvciBtb3JlCisgICBpbmZvcm1hdGlvbiBvbiBjb2RlYyBlcnJvciBoYW5kbGluZy4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMi40CiAKIC4uIGZ1bmN0aW9uOjogcmVnaXN0ZXIoc2VhcmNoX2Z1bmN0aW9uKQogCkBAIC00Nyw5ICs3Miw5IEBACiAgICBUaGUgdmFyaW91cyBmdW5jdGlvbnMgb3IgY2xhc3NlcyB0YWtlIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOgogCiAgICAqZW5jb2RlKiBhbmQgKmRlY29kZSo6IFRoZXNlIG11c3QgYmUgZnVuY3Rpb25zIG9yIG1ldGhvZHMgd2hpY2ggaGF2ZSB0aGUgc2FtZQotICAgaW50ZXJmYWNlIGFzIHRoZSA6bWV0aDpgZW5jb2RlYC86bWV0aDpgZGVjb2RlYCBtZXRob2RzIG9mIENvZGVjIGluc3RhbmNlcyAoc2VlCi0gICBDb2RlYyBJbnRlcmZhY2UpLiBUaGUgZnVuY3Rpb25zL21ldGhvZHMgYXJlIGV4cGVjdGVkIHRvIHdvcmsgaW4gYSBzdGF0ZWxlc3MKLSAgIG1vZGUuCisgICBpbnRlcmZhY2UgYXMgdGhlIDptZXRoOmB+Q29kZWMuZW5jb2RlYC86bWV0aDpgfkNvZGVjLmRlY29kZWAgbWV0aG9kcyBvZiBDb2RlYworICAgaW5zdGFuY2VzIChzZWUgOnJlZjpgQ29kZWMgSW50ZXJmYWNlIDxjb2RlYy1vYmplY3RzPmApLiBUaGUgZnVuY3Rpb25zL21ldGhvZHMKKyAgIGFyZSBleHBlY3RlZCB0byB3b3JrIGluIGEgc3RhdGVsZXNzIG1vZGUuCiAKICAgICppbmNyZW1lbnRhbGVuY29kZXIqIGFuZCAqaW5jcmVtZW50YWxkZWNvZGVyKjogVGhlc2UgaGF2ZSB0byBiZSBmYWN0b3J5CiAgICBmdW5jdGlvbnMgcHJvdmlkaW5nIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlOgpAQCAtNjYsNyArOTEsNyBAQAogICAgICAgYGBmYWN0b3J5KHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKWBgCiAKICAgIFRoZSBmYWN0b3J5IGZ1bmN0aW9ucyBtdXN0IHJldHVybiBvYmplY3RzIHByb3ZpZGluZyB0aGUgaW50ZXJmYWNlcyBkZWZpbmVkIGJ5Ci0gICB0aGUgYmFzZSBjbGFzc2VzIDpjbGFzczpgU3RyZWFtV3JpdGVyYCBhbmQgOmNsYXNzOmBTdHJlYW1SZWFkZXJgLCByZXNwZWN0aXZlbHkuCisgICB0aGUgYmFzZSBjbGFzc2VzIDpjbGFzczpgU3RyZWFtUmVhZGVyYCBhbmQgOmNsYXNzOmBTdHJlYW1Xcml0ZXJgLCByZXNwZWN0aXZlbHkuCiAgICBTdHJlYW0gY29kZWNzIGNhbiBtYWludGFpbiBzdGF0ZS4KIAogICAgUG9zc2libGUgdmFsdWVzIGZvciBlcnJvcnMgYXJlCkBAIC0zMTUsMTEgKzM0MCwxMyBAQAogCiBUaGUgOmNsYXNzOmBDb2RlY2AgY2xhc3MgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIGZvciBzdGF0ZWxlc3MgZW5jb2RlcnMvZGVjb2RlcnMuCiAKLVRvIHNpbXBsaWZ5IGFuZCBzdGFuZGFyZGl6ZSBlcnJvciBoYW5kbGluZywgdGhlIDptZXRoOmBlbmNvZGVgIGFuZAotOm1ldGg6YGRlY29kZWAgbWV0aG9kcyBtYXkgaW1wbGVtZW50IGRpZmZlcmVudCBlcnJvciBoYW5kbGluZyBzY2hlbWVzIGJ5CitUbyBzaW1wbGlmeSBhbmQgc3RhbmRhcmRpemUgZXJyb3IgaGFuZGxpbmcsIHRoZSA6bWV0aDpgfkNvZGVjLmVuY29kZWAgYW5kCis6bWV0aDpgfkNvZGVjLmRlY29kZWAgbWV0aG9kcyBtYXkgaW1wbGVtZW50IGRpZmZlcmVudCBlcnJvciBoYW5kbGluZyBzY2hlbWVzIGJ5CiBwcm92aWRpbmcgdGhlICplcnJvcnMqIHN0cmluZyBhcmd1bWVudC4gIFRoZSBmb2xsb3dpbmcgc3RyaW5nIHZhbHVlcyBhcmUgZGVmaW5lZAogYW5kIGltcGxlbWVudGVkIGJ5IGFsbCBzdGFuZGFyZCBQeXRob24gY29kZWNzOgogCisuLiB0YWJ1bGFyY29sdW1uczo6IHxsfEx8CisKICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogfCBWYWx1ZSAgICAgICAgICAgICAgICAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiArPT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKQEAgLTM5NSwxMiArNDIyLDE0IEBACiBUaGUgOmNsYXNzOmBJbmNyZW1lbnRhbEVuY29kZXJgIGFuZCA6Y2xhc3M6YEluY3JlbWVudGFsRGVjb2RlcmAgY2xhc3NlcyBwcm92aWRlCiB0aGUgYmFzaWMgaW50ZXJmYWNlIGZvciBpbmNyZW1lbnRhbCBlbmNvZGluZyBhbmQgZGVjb2RpbmcuIEVuY29kaW5nL2RlY29kaW5nIHRoZQogaW5wdXQgaXNuJ3QgZG9uZSB3aXRoIG9uZSBjYWxsIHRvIHRoZSBzdGF0ZWxlc3MgZW5jb2Rlci9kZWNvZGVyIGZ1bmN0aW9uLCBidXQKLXdpdGggbXVsdGlwbGUgY2FsbHMgdG8gdGhlIDptZXRoOmBlbmNvZGVgLzptZXRoOmBkZWNvZGVgIG1ldGhvZCBvZiB0aGUKLWluY3JlbWVudGFsIGVuY29kZXIvZGVjb2Rlci4gVGhlIGluY3JlbWVudGFsIGVuY29kZXIvZGVjb2RlciBrZWVwcyB0cmFjayBvZiB0aGUKLWVuY29kaW5nL2RlY29kaW5nIHByb2Nlc3MgZHVyaW5nIG1ldGhvZCBjYWxscy4KK3dpdGggbXVsdGlwbGUgY2FsbHMgdG8gdGhlCis6bWV0aDpgfkluY3JlbWVudGFsRW5jb2Rlci5lbmNvZGVgLzptZXRoOmB+SW5jcmVtZW50YWxEZWNvZGVyLmRlY29kZWAgbWV0aG9kIG9mCit0aGUgaW5jcmVtZW50YWwgZW5jb2Rlci9kZWNvZGVyLiBUaGUgaW5jcmVtZW50YWwgZW5jb2Rlci9kZWNvZGVyIGtlZXBzIHRyYWNrIG9mCit0aGUgZW5jb2RpbmcvZGVjb2RpbmcgcHJvY2VzcyBkdXJpbmcgbWV0aG9kIGNhbGxzLgogCi1UaGUgam9pbmVkIG91dHB1dCBvZiBjYWxscyB0byB0aGUgOm1ldGg6YGVuY29kZWAvOm1ldGg6YGRlY29kZWAgbWV0aG9kIGlzIHRoZQotc2FtZSBhcyBpZiBhbGwgdGhlIHNpbmdsZSBpbnB1dHMgd2VyZSBqb2luZWQgaW50byBvbmUsIGFuZCB0aGlzIGlucHV0IHdhcworVGhlIGpvaW5lZCBvdXRwdXQgb2YgY2FsbHMgdG8gdGhlCis6bWV0aDpgfkluY3JlbWVudGFsRW5jb2Rlci5lbmNvZGVgLzptZXRoOmB+SW5jcmVtZW50YWxEZWNvZGVyLmRlY29kZWAgbWV0aG9kIGlzCit0aGUgc2FtZSBhcyBpZiBhbGwgdGhlIHNpbmdsZSBpbnB1dHMgd2VyZSBqb2luZWQgaW50byBvbmUsIGFuZCB0aGlzIGlucHV0IHdhcwogZW5jb2RlZC9kZWNvZGVkIHdpdGggdGhlIHN0YXRlbGVzcyBlbmNvZGVyL2RlY29kZXIuCiAKIApAQCAtNjUxLDcgKzY4MCw3IEBACiAgICAgICBSZWFkIG9uZSBsaW5lIGZyb20gdGhlIGlucHV0IHN0cmVhbSBhbmQgcmV0dXJuIHRoZSBkZWNvZGVkIGRhdGEuCiAKICAgICAgICpzaXplKiwgaWYgZ2l2ZW4sIGlzIHBhc3NlZCBhcyBzaXplIGFyZ3VtZW50IHRvIHRoZSBzdHJlYW0ncwotICAgICAgOm1ldGg6YHJlYWRsaW5lYCBtZXRob2QuCisgICAgICA6bWV0aDpgcmVhZGAgbWV0aG9kLgogCiAgICAgICBJZiAqa2VlcGVuZHMqIGlzIGZhbHNlIGxpbmUtZW5kaW5ncyB3aWxsIGJlIHN0cmlwcGVkIGZyb20gdGhlIGxpbmVzCiAgICAgICByZXR1cm5lZC4KQEAgLTc1OSw5ICs3ODgsOSBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFVuaWNvZGUgc3RyaW5ncyBhcmUgc3RvcmVkIGludGVybmFsbHkgYXMgc2VxdWVuY2VzIG9mIGNvZGVwb2ludHMgKHRvIGJlIHByZWNpc2UKLWFzIDpjdHlwZTpgUHlfVU5JQ09ERWAgYXJyYXlzKS4gRGVwZW5kaW5nIG9uIHRoZSB3YXkgUHl0aG9uIGlzIGNvbXBpbGVkIChlaXRoZXIKK2FzIDpjOnR5cGU6YFB5X1VOSUNPREVgIGFycmF5cykuIERlcGVuZGluZyBvbiB0aGUgd2F5IFB5dGhvbiBpcyBjb21waWxlZCAoZWl0aGVyCiB2aWEgYGAtLWVuYWJsZS11bmljb2RlPXVjczJgYCBvciBgYC0tZW5hYmxlLXVuaWNvZGU9dWNzNGBgLCB3aXRoIHRoZQotZm9ybWVyIGJlaW5nIHRoZSBkZWZhdWx0KSA6Y3R5cGU6YFB5X1VOSUNPREVgIGlzIGVpdGhlciBhIDE2LWJpdCBvciAzMi1iaXQgZGF0YQorZm9ybWVyIGJlaW5nIHRoZSBkZWZhdWx0KSA6Yzp0eXBlOmBQeV9VTklDT0RFYCBpcyBlaXRoZXIgYSAxNi1iaXQgb3IgMzItYml0IGRhdGEKIHR5cGUuIE9uY2UgYSBVbmljb2RlIG9iamVjdCBpcyB1c2VkIG91dHNpZGUgb2YgQ1BVIGFuZCBtZW1vcnksIENQVSBlbmRpYW5uZXNzCiBhbmQgaG93IHRoZXNlIGFycmF5cyBhcmUgc3RvcmVkIGFzIGJ5dGVzIGJlY29tZSBhbiBpc3N1ZS4gIFRyYW5zZm9ybWluZyBhCiB1bmljb2RlIG9iamVjdCBpbnRvIGEgc2VxdWVuY2Ugb2YgYnl0ZXMgaXMgY2FsbGVkIGVuY29kaW5nIGFuZCByZWNyZWF0aW5nIHRoZQpAQCAtODg3LDYgKzkxNiw4IEBACiAKICogYW4gSUJNIFBDIGNvZGUgcGFnZSwgd2hpY2ggaXMgQVNDSUkgY29tcGF0aWJsZQogCisuLiB0YWJ1bGFyY29sdW1uczo6IHxsfHB7MC4zXGxpbmV3aWR0aH18cHswLjNcbGluZXdpZHRofXwKKwogKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogfCBDb2RlYyAgICAgICAgICAgfCBBbGlhc2VzICAgICAgICAgICAgICAgICAgICAgICAgfCBMYW5ndWFnZXMgICAgICAgICAgICAgICAgICAgICAgfAogKz09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KwpAQCAtMTA5NCw4NCArMTEyNSwxMTIgQEAKIHwgdXRmXzhfc2lnICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWxsIGxhbmd1YWdlcyAgICAgICAgICAgICAgICAgIHwKICstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKIAotQSBudW1iZXIgb2YgY29kZWNzIGFyZSBzcGVjaWZpYyB0byBQeXRob24sIHNvIHRoZWlyIGNvZGVjIG5hbWVzIGhhdmUgbm8gbWVhbmluZwotb3V0c2lkZSBQeXRob24uIFNvbWUgb2YgdGhlbSBkb24ndCBjb252ZXJ0IGZyb20gVW5pY29kZSBzdHJpbmdzIHRvIGJ5dGUgc3RyaW5ncywKLWJ1dCBpbnN0ZWFkIHVzZSB0aGUgcHJvcGVydHkgb2YgdGhlIFB5dGhvbiBjb2RlY3MgbWFjaGluZXJ5IHRoYXQgYW55IGJpamVjdGl2ZQotZnVuY3Rpb24gd2l0aCBvbmUgYXJndW1lbnQgY2FuIGJlIGNvbnNpZGVyZWQgYXMgYW4gZW5jb2RpbmcuCitQeXRob24gU3BlY2lmaWMgRW5jb2RpbmdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUZvciB0aGUgY29kZWNzIGxpc3RlZCBiZWxvdywgdGhlIHJlc3VsdCBpbiB0aGUgImVuY29kaW5nIiBkaXJlY3Rpb24gaXMgYWx3YXlzIGEKLWJ5dGUgc3RyaW5nLiBUaGUgcmVzdWx0IG9mIHRoZSAiZGVjb2RpbmciIGRpcmVjdGlvbiBpcyBsaXN0ZWQgYXMgb3BlcmFuZCB0eXBlIGluCi10aGUgdGFibGUuCitBIG51bWJlciBvZiBwcmVkZWZpbmVkIGNvZGVjcyBhcmUgc3BlY2lmaWMgdG8gUHl0aG9uLCBzbyB0aGVpciBjb2RlYyBuYW1lcyBoYXZlCitubyBtZWFuaW5nIG91dHNpZGUgUHl0aG9uLiAgVGhlc2UgYXJlIGxpc3RlZCBpbiB0aGUgdGFibGVzIGJlbG93IGJhc2VkIG9uIHRoZQorZXhwZWN0ZWQgaW5wdXQgYW5kIG91dHB1dCB0eXBlcyAobm90ZSB0aGF0IHdoaWxlIHRleHQgZW5jb2RpbmdzIGFyZSB0aGUgbW9zdAorY29tbW9uIHVzZSBjYXNlIGZvciBjb2RlY3MsIHRoZSB1bmRlcmx5aW5nIGNvZGVjIGluZnJhc3RydWN0dXJlIHN1cHBvcnRzCithcmJpdHJhcnkgZGF0YSB0cmFuc2Zvcm1zIHJhdGhlciB0aGFuIGp1c3QgdGV4dCBlbmNvZGluZ3MpLiAgRm9yIGFzeW1tZXRyaWMKK2NvZGVjcywgdGhlIHN0YXRlZCBwdXJwb3NlIGRlc2NyaWJlcyB0aGUgZW5jb2RpbmcgZGlyZWN0aW9uLgogCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBDb2RlYyAgICAgICAgICAgICAgfCBBbGlhc2VzICAgICAgICAgICAgICAgICAgIHwgT3BlcmFuZCB0eXBlICAgfCBQdXJwb3NlICAgICAgICAgICAgICAgICAgIHwKLSs9PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT0rCi18IGJhc2U2NF9jb2RlYyAgICAgICB8IGJhc2U2NCwgYmFzZS02NCAgICAgICAgICAgfCBieXRlIHN0cmluZyAgICB8IENvbnZlcnQgb3BlcmFuZCB0byBNSU1FICAgfAotfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCBiYXNlNjQgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IGJ6Ml9jb2RlYyAgICAgICAgICB8IGJ6MiAgICAgICAgICAgICAgICAgICAgICAgfCBieXRlIHN0cmluZyAgICB8IENvbXByZXNzIHRoZSBvcGVyYW5kICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCB1c2luZyBiejIgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IGhleF9jb2RlYyAgICAgICAgICB8IGhleCAgICAgICAgICAgICAgICAgICAgICAgfCBieXRlIHN0cmluZyAgICB8IENvbnZlcnQgb3BlcmFuZCB0byAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCBoZXhhZGVjaW1hbCAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgcmVwcmVzZW50YXRpb24sIHdpdGggdHdvICB8Ci18ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8IGRpZ2l0cyBwZXIgYnl0ZSAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgaWRuYSAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVuaWNvZGUgc3RyaW5nIHwgSW1wbGVtZW50cyA6cmZjOmAzNDkwYCwgICB8Ci18ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8IHNlZSBhbHNvICAgICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCA6bW9kOmBlbmNvZGluZ3MuaWRuYWAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IG1iY3MgICAgICAgICAgICAgICB8IGRiY3MgICAgICAgICAgICAgICAgICAgICAgfCBVbmljb2RlIHN0cmluZyB8IFdpbmRvd3Mgb25seTogRW5jb2RlICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCBvcGVyYW5kIGFjY29yZGluZyB0byB0aGUgIHwKLXwgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgQU5TSSBjb2RlcGFnZSAoQ1BfQUNQKSAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBwYWxtb3MgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVW5pY29kZSBzdHJpbmcgfCBFbmNvZGluZyBvZiBQYWxtT1MgMy41ICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IHB1bnljb2RlICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBVbmljb2RlIHN0cmluZyB8IEltcGxlbWVudHMgOnJmYzpgMzQ5MmAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgcXVvcHJpX2NvZGVjICAgICAgIHwgcXVvcHJpLCBxdW90ZWQtcHJpbnRhYmxlLCB8IGJ5dGUgc3RyaW5nICAgIHwgQ29udmVydCBvcGVyYW5kIHRvIE1JTUUgICB8Ci18ICAgICAgICAgICAgICAgICAgICB8IHF1b3RlZHByaW50YWJsZSAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8IHF1b3RlZCBwcmludGFibGUgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgcmF3X3VuaWNvZGVfZXNjYXBlIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVuaWNvZGUgc3RyaW5nIHwgUHJvZHVjZSBhIHN0cmluZyB0aGF0IGlzICB8Ci18ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8IHN1aXRhYmxlIGFzIHJhdyBVbmljb2RlICAgfAotfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCBsaXRlcmFsIGluIFB5dGhvbiBzb3VyY2UgIHwKLXwgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgY29kZSAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCByb3RfMTMgICAgICAgICAgICAgfCByb3QxMyAgICAgICAgICAgICAgICAgICAgIHwgVW5pY29kZSBzdHJpbmcgfCBSZXR1cm5zIHRoZSBDYWVzYXItY3lwaGVyIHwKLXwgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgZW5jcnlwdGlvbiBvZiB0aGUgb3BlcmFuZCB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBzdHJpbmdfZXNjYXBlICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYnl0ZSBzdHJpbmcgICAgfCBQcm9kdWNlIGEgc3RyaW5nIHRoYXQgaXMgIHwKLXwgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgc3VpdGFibGUgYXMgc3RyaW5nICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8IGxpdGVyYWwgaW4gUHl0aG9uIHNvdXJjZSAgfAotfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCBjb2RlICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IHVuZGVmaW5lZCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhbnkgICAgICAgICAgICB8IFJhaXNlIGFuIGV4Y2VwdGlvbiBmb3IgICAgfAotfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCBhbGwgY29udmVyc2lvbnMuIENhbiBiZSAgIHwKLXwgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgdXNlZCBhcyB0aGUgc3lzdGVtICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8IGVuY29kaW5nIGlmIG5vIGF1dG9tYXRpYyAgfAotfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCA6dGVybTpgY29lcmNpb25gIGJldHdlZW4gIHwKLXwgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgYnl0ZSBhbmQgVW5pY29kZSBzdHJpbmdzICB8Ci18ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8IGlzIGRlc2lyZWQuICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgdW5pY29kZV9lc2NhcGUgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVuaWNvZGUgc3RyaW5nIHwgUHJvZHVjZSBhIHN0cmluZyB0aGF0IGlzICB8Ci18ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8IHN1aXRhYmxlIGFzIFVuaWNvZGUgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCBsaXRlcmFsIGluIFB5dGhvbiBzb3VyY2UgIHwKLXwgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgY29kZSAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCB1bmljb2RlX2ludGVybmFsICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVW5pY29kZSBzdHJpbmcgfCBSZXR1cm4gdGhlIGludGVybmFsICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgcmVwcmVzZW50YXRpb24gb2YgdGhlICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8IG9wZXJhbmQgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgdXVfY29kZWMgICAgICAgICAgIHwgdXUgICAgICAgICAgICAgICAgICAgICAgICB8IGJ5dGUgc3RyaW5nICAgIHwgQ29udmVydCB0aGUgb3BlcmFuZCB1c2luZyB8Ci18ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8IHV1ZW5jb2RlICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgemxpYl9jb2RlYyAgICAgICAgIHwgemlwLCB6bGliICAgICAgICAgICAgICAgICB8IGJ5dGUgc3RyaW5nICAgIHwgQ29tcHJlc3MgdGhlIG9wZXJhbmQgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8IHVzaW5nIGd6aXAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK1RoZSBmb2xsb3dpbmcgY29kZWNzIHByb3ZpZGUgdW5pY29kZS10by1zdHIgZW5jb2RpbmcgWyNlbmNvZGluZy1ub3RlXV8gYW5kCitzdHItdG8tdW5pY29kZSBkZWNvZGluZyBbI2RlY29kaW5nLW5vdGVdXywgc2ltaWxhciB0byB0aGUgVW5pY29kZSB0ZXh0CitlbmNvZGluZ3MuCisKKy4uIHRhYnVsYXJjb2x1bW5zOjogfGx8THxMfAorCisrLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgQ29kZWMgICAgICAgICAgICAgIHwgQWxpYXNlcyAgICAgICAgICAgICAgICAgICB8IFB1cnBvc2UgICAgICAgICAgICAgICAgICAgfAorKz09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT0rCit8IGlkbmEgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJbXBsZW1lbnRzIDpyZmM6YDM0OTBgLCAgIHwKK3wgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNlZSBhbHNvICAgICAgICAgICAgICAgICAgfAorfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOm1vZDpgZW5jb2RpbmdzLmlkbmFgICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgbWJjcyAgICAgICAgICAgICAgIHwgZGJjcyAgICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd3Mgb25seTogRW5jb2RlICAgICAgfAorfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb3BlcmFuZCBhY2NvcmRpbmcgdG8gdGhlICB8Cit8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBTlNJIGNvZGVwYWdlIChDUF9BQ1ApICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfCBwYWxtb3MgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRW5jb2Rpbmcgb2YgUGFsbU9TIDMuNSAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgcHVueWNvZGUgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEltcGxlbWVudHMgOnJmYzpgMzQ5MmAgICAgfAorKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8IHJhd191bmljb2RlX2VzY2FwZSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQcm9kdWNlIGEgc3RyaW5nIHRoYXQgaXMgIHwKK3wgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN1aXRhYmxlIGFzIHJhdyBVbmljb2RlICAgfAorfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbGl0ZXJhbCBpbiBQeXRob24gc291cmNlICB8Cit8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjb2RlICAgICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfCByb3RfMTMgICAgICAgICAgICAgfCByb3QxMyAgICAgICAgICAgICAgICAgICAgIHwgUmV0dXJucyB0aGUgQ2Flc2FyLWN5cGhlciB8Cit8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlbmNyeXB0aW9uIG9mIHRoZSBvcGVyYW5kIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfCB1bmRlZmluZWQgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUmFpc2UgYW4gZXhjZXB0aW9uIGZvciAgICB8Cit8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhbGwgY29udmVyc2lvbnMuIENhbiBiZSAgIHwKK3wgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHVzZWQgYXMgdGhlIHN5c3RlbSAgICAgICAgfAorfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZW5jb2RpbmcgaWYgbm8gYXV0b21hdGljICB8Cit8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6dGVybTpgY29lcmNpb25gIGJldHdlZW4gIHwKK3wgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJ5dGUgYW5kIFVuaWNvZGUgc3RyaW5ncyAgfAorfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaXMgZGVzaXJlZC4gICAgICAgICAgICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgdW5pY29kZV9lc2NhcGUgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFByb2R1Y2UgYSBzdHJpbmcgdGhhdCBpcyAgfAorfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3VpdGFibGUgYXMgVW5pY29kZSAgICAgICB8Cit8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBsaXRlcmFsIGluIFB5dGhvbiBzb3VyY2UgIHwKK3wgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNvZGUgICAgICAgICAgICAgICAgICAgICAgfAorKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8IHVuaWNvZGVfaW50ZXJuYWwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSZXR1cm4gdGhlIGludGVybmFsICAgICAgIHwKK3wgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcHJlc2VudGF0aW9uIG9mIHRoZSAgICAgfAorfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb3BlcmFuZCAgICAgICAgICAgICAgICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKIAogLi4gdmVyc2lvbmFkZGVkOjogMi4zCiAgICBUaGUgYGBpZG5hYGAgYW5kIGBgcHVueWNvZGVgYCBlbmNvZGluZ3MuCiAKK1RoZSBmb2xsb3dpbmcgY29kZWNzIHByb3ZpZGUgc3RyLXRvLXN0ciBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK1sjZGVjb2Rpbmctbm90ZV1fLgorCisuLiB0YWJ1bGFyY29sdW1uczo6IHxsfEx8THxMfAorCisrLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8IENvZGVjICAgICAgICAgICAgICB8IEFsaWFzZXMgICAgICAgICAgICAgICAgICAgfCBQdXJwb3NlICAgICAgICAgICAgICAgICAgIHwgRW5jb2Rlci9kZWNvZGVyICAgICAgICAgICAgICB8CisrPT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCit8IGJhc2U2NF9jb2RlYyAgICAgICB8IGJhc2U2NCwgYmFzZS02NCAgICAgICAgICAgfCBDb252ZXJ0IG9wZXJhbmQgdG8gTUlNRSAgIHwgOm1ldGg6YGJhc2U2NC5iNjRlbmNvZGVgLCAgICB8Cit8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiYXNlNjQgKHRoZSByZXN1bHQgYWx3YXlzIHwgOm1ldGg6YGJhc2U2NC5iNjRkZWNvZGVgICAgICB8Cit8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbmNsdWRlcyBhIHRyYWlsaW5nICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgYCdcbidgYCkgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8IGJ6Ml9jb2RlYyAgICAgICAgICB8IGJ6MiAgICAgICAgICAgICAgICAgICAgICAgfCBDb21wcmVzcyB0aGUgb3BlcmFuZCAgICAgIHwgOm1ldGg6YGJ6Mi5jb21wcmVzc2AsICAgICAgICB8Cit8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1c2luZyBiejIgICAgICAgICAgICAgICAgIHwgOm1ldGg6YGJ6Mi5kZWNvbXByZXNzYCAgICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8IGhleF9jb2RlYyAgICAgICAgICB8IGhleCAgICAgICAgICAgICAgICAgICAgICAgfCBDb252ZXJ0IG9wZXJhbmQgdG8gICAgICAgIHwgOm1ldGg6YGJhc2U2NC5iMTZlbmNvZGVgLCAgICB8Cit8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBoZXhhZGVjaW1hbCAgICAgICAgICAgICAgIHwgOm1ldGg6YGJhc2U2NC5iMTZkZWNvZGVgICAgICB8Cit8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXByZXNlbnRhdGlvbiwgd2l0aCB0d28gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkaWdpdHMgcGVyIGJ5dGUgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8IHF1b3ByaV9jb2RlYyAgICAgICB8IHF1b3ByaSwgcXVvdGVkLXByaW50YWJsZSwgfCBDb252ZXJ0IG9wZXJhbmQgdG8gTUlNRSAgIHwgOm1ldGg6YHF1b3ByaS5lbmNvZGVzdHJpbmdgLCB8Cit8ICAgICAgICAgICAgICAgICAgICB8IHF1b3RlZHByaW50YWJsZSAgICAgICAgICAgfCBxdW90ZWQgcHJpbnRhYmxlICAgICAgICAgIHwgOm1ldGg6YHF1b3ByaS5kZWNvZGVzdHJpbmdgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8IHN0cmluZ19lc2NhcGUgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQcm9kdWNlIGEgc3RyaW5nIHRoYXQgaXMgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdWl0YWJsZSBhcyBzdHJpbmcgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBsaXRlcmFsIGluIFB5dGhvbiBzb3VyY2UgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjb2RlICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8IHV1X2NvZGVjICAgICAgICAgICB8IHV1ICAgICAgICAgICAgICAgICAgICAgICAgfCBDb252ZXJ0IHRoZSBvcGVyYW5kIHVzaW5nIHwgOm1ldGg6YHV1LmVuY29kZWAsICAgICAgICAgICB8Cit8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1dWVuY29kZSAgICAgICAgICAgICAgICAgIHwgOm1ldGg6YHV1LmRlY29kZWAgICAgICAgICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8IHpsaWJfY29kZWMgICAgICAgICB8IHppcCwgemxpYiAgICAgICAgICAgICAgICAgfCBDb21wcmVzcyB0aGUgb3BlcmFuZCAgICAgIHwgOm1ldGg6YHpsaWIuY29tcHJlc3NgLCAgICAgICB8Cit8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1c2luZyBnemlwICAgICAgICAgICAgICAgIHwgOm1ldGg6YHpsaWIuZGVjb21wcmVzc2AgICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisKKy4uIFsjZW5jb2Rpbmctbm90ZV0gc3RyIG9iamVjdHMgYXJlIGFsc28gYWNjZXB0ZWQgYXMgaW5wdXQgaW4gcGxhY2Ugb2YgdW5pY29kZQorICAgb2JqZWN0cy4gIFRoZXkgYXJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIHVuaWNvZGUgYnkgZGVjb2RpbmcgdGhlbSB1c2luZworICAgdGhlIGRlZmF1bHQgZW5jb2RpbmcuICBJZiB0aGlzIGNvbnZlcnNpb24gZmFpbHMsIGl0IG1heSBsZWFkIHRvIGVuY29kaW5nCisgICBvcGVyYXRpb25zIHJhaXNpbmcgOmV4YzpgVW5pY29kZURlY29kZUVycm9yYC4KKworLi4gWyNkZWNvZGluZy1ub3RlXSB1bmljb2RlIG9iamVjdHMgYXJlIGFsc28gYWNjZXB0ZWQgYXMgaW5wdXQgaW4gcGxhY2Ugb2Ygc3RyCisgICBvYmplY3RzLiAgVGhleSBhcmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gc3RyIGJ5IGVuY29kaW5nIHRoZW0gdXNpbmcgdGhlCisgICBkZWZhdWx0IGVuY29kaW5nLiAgSWYgdGhpcyBjb252ZXJzaW9uIGZhaWxzLCBpdCBtYXkgbGVhZCB0byBkZWNvZGluZworICAgb3BlcmF0aW9ucyByYWlzaW5nIDpleGM6YFVuaWNvZGVFbmNvZGVFcnJvcmAuCisKIAogOm1vZDpgZW5jb2RpbmdzLmlkbmFgIC0tLSBJbnRlcm5hdGlvbmFsaXplZCBEb21haW4gTmFtZXMgaW4gQXBwbGljYXRpb25zCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2NvbGxlY3Rpb25zLnJzdCBiL0RvYy9saWJyYXJ5L2NvbGxlY3Rpb25zLnJzdAppbmRleCBiMzE1YTczLi5mMDBiODcwIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9jb2xsZWN0aW9ucy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvY29sbGVjdGlvbnMucnN0CkBAIC01MSw3ICs1MSw3IEBACiAKICAgICA+Pj4gIyBGaW5kIHRoZSB0ZW4gbW9zdCBjb21tb24gd29yZHMgaW4gSGFtbGV0CiAgICAgPj4+IGltcG9ydCByZQotICAgID4+PiB3b3JkcyA9IHJlLmZpbmRhbGwoJ1x3KycsIG9wZW4oJ2hhbWxldC50eHQnKS5yZWFkKCkubG93ZXIoKSkKKyAgICA+Pj4gd29yZHMgPSByZS5maW5kYWxsKHInXHcrJywgb3BlbignaGFtbGV0LnR4dCcpLnJlYWQoKS5sb3dlcigpKQogICAgID4+PiBDb3VudGVyKHdvcmRzKS5tb3N0X2NvbW1vbigxMCkKICAgICBbKCd0aGUnLCAxMTQzKSwgKCdhbmQnLCA5NjYpLCAoJ3RvJywgNzYyKSwgKCdvZicsIDY2OSksICgnaScsIDYzMSksCiAgICAgICgneW91JywgNTU0KSwgICgnYScsIDU0NiksICgnbXknLCA1MTQpLCAoJ2hhbWxldCcsIDQ3MSksICgnaW4nLCA0NTEpXQpAQCAtMTIwLDYgKzEyMCw3IEBACiAgICAgICAgICAgICA+Pj4gYyA9IENvdW50ZXIoYT00LCBiPTIsIGM9MCwgZD0tMikKICAgICAgICAgICAgID4+PiBkID0gQ291bnRlcihhPTEsIGI9MiwgYz0zLCBkPTQpCiAgICAgICAgICAgICA+Pj4gYy5zdWJ0cmFjdChkKQorICAgICAgICAgICAgPj4+IGMKICAgICAgICAgICAgIENvdW50ZXIoeydhJzogMywgJ2InOiAwLCAnYyc6IC0zLCAnZCc6IC02fSkKIAogICAgVGhlIHVzdWFsIGRpY3Rpb25hcnkgbWV0aG9kcyBhcmUgYXZhaWxhYmxlIGZvciA6Y2xhc3M6YENvdW50ZXJgIG9iamVjdHMKQEAgLTE0NSw3ICsxNDYsNyBAQAogICAgIGRpY3QoYykgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IHRvIGEgcmVndWxhciBkaWN0aW9uYXJ5CiAgICAgYy5pdGVtcygpICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgdG8gYSBsaXN0IG9mIChlbGVtLCBjbnQpIHBhaXJzCiAgICAgQ291bnRlcihkaWN0KGxpc3Rfb2ZfcGFpcnMpKSAgICAjIGNvbnZlcnQgZnJvbSBhIGxpc3Qgb2YgKGVsZW0sIGNudCkgcGFpcnMKLSAgICBjLm1vc3RfY29tbW9uKClbOi1uOi0xXSAgICAgICAgICMgbiBsZWFzdCBjb21tb24gZWxlbWVudHMKKyAgICBjLm1vc3RfY29tbW9uKClbOi1uLTE6LTFdICAgICAgICMgbiBsZWFzdCBjb21tb24gZWxlbWVudHMKICAgICBjICs9IENvdW50ZXIoKSAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIHplcm8gYW5kIG5lZ2F0aXZlIGNvdW50cwogCiBTZXZlcmFsIG1hdGhlbWF0aWNhbCBvcGVyYXRpb25zIGFyZSBwcm92aWRlZCBmb3IgY29tYmluaW5nIDpjbGFzczpgQ291bnRlcmAKQEAgLTQ2OSw2ICs0NzAsMTEgQEAKICAgICAgIDpjbGFzczpgZGljdGAgY2xhc3Mgd2hlbiB0aGUgcmVxdWVzdGVkIGtleSBpcyBub3QgZm91bmQ7IHdoYXRldmVyIGl0CiAgICAgICByZXR1cm5zIG9yIHJhaXNlcyBpcyB0aGVuIHJldHVybmVkIG9yIHJhaXNlZCBieSA6bWV0aDpgX19nZXRpdGVtX19gLgogCisgICAgICBOb3RlIHRoYXQgOm1ldGg6YF9fbWlzc2luZ19fYCBpcyAqbm90KiBjYWxsZWQgZm9yIGFueSBvcGVyYXRpb25zIGJlc2lkZXMKKyAgICAgIDptZXRoOmBfX2dldGl0ZW1fX2AuIFRoaXMgbWVhbnMgdGhhdCA6bWV0aDpgZ2V0YCB3aWxsLCBsaWtlIG5vcm1hbAorICAgICAgZGljdGlvbmFyaWVzLCByZXR1cm4gYGBOb25lYGAgYXMgYSBkZWZhdWx0IHJhdGhlciB0aGFuIHVzaW5nCisgICAgICA6YXR0cjpgZGVmYXVsdF9mYWN0b3J5YC4KKwogCiAgICA6Y2xhc3M6YGRlZmF1bHRkaWN0YCBvYmplY3RzIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBpbnN0YW5jZSB2YXJpYWJsZToKIApAQCAtNTk2LDQ3ICs2MDIsNTMgQEAKIAogICAgPj4+IFBvaW50ID0gbmFtZWR0dXBsZSgnUG9pbnQnLCBbJ3gnLCAneSddLCB2ZXJib3NlPVRydWUpCiAgICBjbGFzcyBQb2ludCh0dXBsZSk6Ci0gICAgICAgICAgICdQb2ludCh4LCB5KScKKyAgICAgICAnUG9pbnQoeCwgeSknCiAgICA8QkxBTktMSU5FPgotICAgICAgICAgICBfX3Nsb3RzX18gPSAoKQorICAgICAgIF9fc2xvdHNfXyA9ICgpCiAgICA8QkxBTktMSU5FPgotICAgICAgICAgICBfZmllbGRzID0gKCd4JywgJ3knKQorICAgICAgIF9maWVsZHMgPSAoJ3gnLCAneScpCiAgICA8QkxBTktMSU5FPgotICAgICAgICAgICBkZWYgX19uZXdfXyhfY2xzLCB4LCB5KToKLSAgICAgICAgICAgICAgICdDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgUG9pbnQoeCwgeSknCi0gICAgICAgICAgICAgICByZXR1cm4gX3R1cGxlLl9fbmV3X18oX2NscywgKHgsIHkpKQorICAgICAgIGRlZiBfX25ld19fKF9jbHMsIHgsIHkpOgorICAgICAgICAgICAnQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIFBvaW50KHgsIHkpJworICAgICAgICAgICByZXR1cm4gX3R1cGxlLl9fbmV3X18oX2NscywgKHgsIHkpKQogICAgPEJMQU5LTElORT4KLSAgICAgICAgICAgQGNsYXNzbWV0aG9kCi0gICAgICAgICAgIGRlZiBfbWFrZShjbHMsIGl0ZXJhYmxlLCBuZXc9dHVwbGUuX19uZXdfXywgbGVuPWxlbik6Ci0gICAgICAgICAgICAgICAnTWFrZSBhIG5ldyBQb2ludCBvYmplY3QgZnJvbSBhIHNlcXVlbmNlIG9yIGl0ZXJhYmxlJwotICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3KGNscywgaXRlcmFibGUpCi0gICAgICAgICAgICAgICBpZiBsZW4ocmVzdWx0KSAhPSAyOgotICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignRXhwZWN0ZWQgMiBhcmd1bWVudHMsIGdvdCAlZCcgJSBsZW4ocmVzdWx0KSkKLSAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICBkZWYgX21ha2UoY2xzLCBpdGVyYWJsZSwgbmV3PXR1cGxlLl9fbmV3X18sIGxlbj1sZW4pOgorICAgICAgICAgICAnTWFrZSBhIG5ldyBQb2ludCBvYmplY3QgZnJvbSBhIHNlcXVlbmNlIG9yIGl0ZXJhYmxlJworICAgICAgICAgICByZXN1bHQgPSBuZXcoY2xzLCBpdGVyYWJsZSkKKyAgICAgICAgICAgaWYgbGVuKHJlc3VsdCkgIT0gMjoKKyAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignRXhwZWN0ZWQgMiBhcmd1bWVudHMsIGdvdCAlZCcgJSBsZW4ocmVzdWx0KSkKKyAgICAgICAgICAgcmV0dXJuIHJlc3VsdAogICAgPEJMQU5LTElORT4KLSAgICAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgICAgICAgICAgICAgJ1JldHVybiBhIG5pY2VseSBmb3JtYXR0ZWQgcmVwcmVzZW50YXRpb24gc3RyaW5nJwotICAgICAgICAgICAgICAgcmV0dXJuICdQb2ludCh4PSVyLCB5PSVyKScgJSBzZWxmCisgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAgICAnUmV0dXJuIGEgbmljZWx5IGZvcm1hdHRlZCByZXByZXNlbnRhdGlvbiBzdHJpbmcnCisgICAgICAgICAgIHJldHVybiAnUG9pbnQoeD0lciwgeT0lciknICUgc2VsZgogICAgPEJMQU5LTElORT4KLSAgICAgICAgICAgZGVmIF9hc2RpY3Qoc2VsZik6Ci0gICAgICAgICAgICAgICAnUmV0dXJuIGEgbmV3IE9yZGVyZWREaWN0IHdoaWNoIG1hcHMgZmllbGQgbmFtZXMgdG8gdGhlaXIgdmFsdWVzJwotICAgICAgICAgICAgICAgcmV0dXJuIE9yZGVyZWREaWN0KHppcChzZWxmLl9maWVsZHMsIHNlbGYpKQorICAgICAgIGRlZiBfYXNkaWN0KHNlbGYpOgorICAgICAgICAgICAnUmV0dXJuIGEgbmV3IE9yZGVyZWREaWN0IHdoaWNoIG1hcHMgZmllbGQgbmFtZXMgdG8gdGhlaXIgdmFsdWVzJworICAgICAgICAgICByZXR1cm4gT3JkZXJlZERpY3QoemlwKHNlbGYuX2ZpZWxkcywgc2VsZikpCiAgICA8QkxBTktMSU5FPgotICAgICAgICAgIF9fZGljdF9fID0gcHJvcGVydHkoX2FzZGljdCkKKyAgICAgICBkZWYgX3JlcGxhY2UoX3NlbGYsICoqa3dkcyk6CisgICAgICAgICAgICdSZXR1cm4gYSBuZXcgUG9pbnQgb2JqZWN0IHJlcGxhY2luZyBzcGVjaWZpZWQgZmllbGRzIHdpdGggbmV3IHZhbHVlcycKKyAgICAgICAgICAgcmVzdWx0ID0gX3NlbGYuX21ha2UobWFwKGt3ZHMucG9wLCAoJ3gnLCAneScpLCBfc2VsZikpCisgICAgICAgICAgIGlmIGt3ZHM6CisgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdHb3QgdW5leHBlY3RlZCBmaWVsZCBuYW1lczogJXInICUga3dkcy5rZXlzKCkpCisgICAgICAgICAgIHJldHVybiByZXN1bHQKICAgIDxCTEFOS0xJTkU+Ci0gICAgICAgICAgZGVmIF9yZXBsYWNlKF9zZWxmLCAqKmt3ZHMpOgotICAgICAgICAgICAgICAgJ1JldHVybiBhIG5ldyBQb2ludCBvYmplY3QgcmVwbGFjaW5nIHNwZWNpZmllZCBmaWVsZHMgd2l0aCBuZXcgdmFsdWVzJwotICAgICAgICAgICAgICAgcmVzdWx0ID0gX3NlbGYuX21ha2UobWFwKGt3ZHMucG9wLCAoJ3gnLCAneScpLCBfc2VsZikpCi0gICAgICAgICAgICAgICBpZiBrd2RzOgotICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0dvdCB1bmV4cGVjdGVkIGZpZWxkIG5hbWVzOiAlcicgJSBrd2RzLmtleXMoKSkKLSAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICBkZWYgX19nZXRuZXdhcmdzX18oc2VsZik6CisgICAgICAgICAgICdSZXR1cm4gc2VsZiBhcyBhIHBsYWluIHR1cGxlLiAgIFVzZWQgYnkgY29weSBhbmQgcGlja2xlLicKKyAgICAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYpCiAgICA8QkxBTktMSU5FPgotICAgICAgICAgICBkZWYgX19nZXRuZXdhcmdzX18oc2VsZik6Ci0gICAgICAgICAgICAgICAnUmV0dXJuIHNlbGYgYXMgYSBwbGFpbiB0dXBsZS4gICBVc2VkIGJ5IGNvcHkgYW5kIHBpY2tsZS4nCi0gICAgICAgICAgICAgICByZXR1cm4gdHVwbGUoc2VsZikKKyAgICAgICBfX2RpY3RfXyA9IF9wcm9wZXJ0eShfYXNkaWN0KQogICAgPEJMQU5LTElORT4KLSAgICAgICAgICAgeCA9IF9wcm9wZXJ0eShfaXRlbWdldHRlcigwKSwgZG9jPSdBbGlhcyBmb3IgZmllbGQgbnVtYmVyIDAnKQotICAgICAgICAgICB5ID0gX3Byb3BlcnR5KF9pdGVtZ2V0dGVyKDEpLCBkb2M9J0FsaWFzIGZvciBmaWVsZCBudW1iZXIgMScpCisgICAgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgICAgJ0V4Y2x1ZGUgdGhlIE9yZGVyZWREaWN0IGZyb20gcGlja2xpbmcnCisgICAgICAgICAgIHBhc3MKKyAgIDxCTEFOS0xJTkU+CisgICAgICAgeCA9IF9wcm9wZXJ0eShfaXRlbWdldHRlcigwKSwgZG9jPSdBbGlhcyBmb3IgZmllbGQgbnVtYmVyIDAnKQorICAgPEJMQU5LTElORT4KKyAgICAgICB5ID0gX3Byb3BlcnR5KF9pdGVtZ2V0dGVyKDEpLCBkb2M9J0FsaWFzIGZvciBmaWVsZCBudW1iZXIgMScpCisgICA8QkxBTktMSU5FPgogCiAgICA+Pj4gcCA9IFBvaW50KDExLCB5PTIyKSAgICAgIyBpbnN0YW50aWF0ZSB3aXRoIHBvc2l0aW9uYWwgb3Iga2V5d29yZCBhcmd1bWVudHMKICAgID4+PiBwWzBdICsgcFsxXSAgICAgICAgICAgICAjIGluZGV4YWJsZSBsaWtlIHRoZSBwbGFpbiB0dXBsZSAoMTEsIDIyKQpAQCAtODA2LDkgKzgxOCw5IEBACiBFcXVhbGl0eSB0ZXN0cyBiZXR3ZWVuIDpjbGFzczpgT3JkZXJlZERpY3RgIG9iamVjdHMgYXJlIG9yZGVyLXNlbnNpdGl2ZQogYW5kIGFyZSBpbXBsZW1lbnRlZCBhcyBgYGxpc3Qob2QxLml0ZW1zKCkpPT1saXN0KG9kMi5pdGVtcygpKWBgLgogRXF1YWxpdHkgdGVzdHMgYmV0d2VlbiA6Y2xhc3M6YE9yZGVyZWREaWN0YCBvYmplY3RzIGFuZCBvdGhlcgotOmNsYXNzOmBNYXBwaW5nYCBvYmplY3RzIGFyZSBvcmRlci1pbnNlbnNpdGl2ZSBsaWtlIHJlZ3VsYXIgZGljdGlvbmFyaWVzLgotVGhpcyBhbGxvd3MgOmNsYXNzOmBPcmRlcmVkRGljdGAgb2JqZWN0cyB0byBiZSBzdWJzdGl0dXRlZCBhbnl3aGVyZSBhCi1yZWd1bGFyIGRpY3Rpb25hcnkgaXMgdXNlZC4KKzpjbGFzczpgTWFwcGluZ2Agb2JqZWN0cyBhcmUgb3JkZXItaW5zZW5zaXRpdmUgbGlrZSByZWd1bGFyCitkaWN0aW9uYXJpZXMuICBUaGlzIGFsbG93cyA6Y2xhc3M6YE9yZGVyZWREaWN0YCBvYmplY3RzIHRvIGJlIHN1YnN0aXR1dGVkCithbnl3aGVyZSBhIHJlZ3VsYXIgZGljdGlvbmFyeSBpcyB1c2VkLgogCiBUaGUgOmNsYXNzOmBPcmRlcmVkRGljdGAgY29uc3RydWN0b3IgYW5kIDptZXRoOmB1cGRhdGVgIG1ldGhvZCBib3RoIGFjY2VwdAoga2V5d29yZCBhcmd1bWVudHMsIGJ1dCB0aGVpciBvcmRlciBpcyBsb3N0IGJlY2F1c2UgUHl0aG9uJ3MgZnVuY3Rpb24gY2FsbApAQCAtODQ1LDcgKzg1Nyw3IEBACiB0byB0aGUgZW5kIGFuZCB0aGUgc29ydCBpcyBub3QgbWFpbnRhaW5lZC4KIAogSXQgaXMgYWxzbyBzdHJhaWdodC1mb3J3YXJkIHRvIGNyZWF0ZSBhbiBvcmRlcmVkIGRpY3Rpb25hcnkgdmFyaWFudAotdGhhdCB0aGUgcmVtZW1iZXJzIHRoZSBvcmRlciB0aGUga2V5cyB3ZXJlICpsYXN0KiBpbnNlcnRlZC4KK3RoYXQgcmVtZW1iZXJzIHRoZSBvcmRlciB0aGUga2V5cyB3ZXJlICpsYXN0KiBpbnNlcnRlZC4KIElmIGEgbmV3IGVudHJ5IG92ZXJ3cml0ZXMgYW4gZXhpc3RpbmcgZW50cnksIHRoZQogb3JpZ2luYWwgaW5zZXJ0aW9uIHBvc2l0aW9uIGlzIGNoYW5nZWQgYW5kIG1vdmVkIHRvIHRoZSBlbmQ6OgogCkBAIC04ODcsMjkgKzg5OSwzNSBAQAogOmNsYXNzOmBTaXplZGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYF9fbGVuX19gYAogOmNsYXNzOmBDYWxsYWJsZWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYF9fY2FsbF9fYGAKIAotOmNsYXNzOmBTZXF1ZW5jZWAgICAgICAgICAgOmNsYXNzOmBTaXplZGAsICAgICAgICBgYF9fZ2V0aXRlbV9fYGAgICAgICAgICBgYF9fY29udGFpbnNfX2BgLCBgYF9faXRlcl9fYGAsIGBgX19yZXZlcnNlZF9fYGAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA6Y2xhc3M6YEl0ZXJhYmxlYCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgaW5kZXhgYCwgYW5kIGBgY291bnRgYAorOmNsYXNzOmBTZXF1ZW5jZWAgICAgICAgICAgOmNsYXNzOmBTaXplZGAsICAgICAgICBgYF9fZ2V0aXRlbV9fYGAsICAgICAgICBgYF9fY29udGFpbnNfX2BgLCBgYF9faXRlcl9fYGAsIGBgX19yZXZlcnNlZF9fYGAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6Y2xhc3M6YEl0ZXJhYmxlYCwgICAgIGBgX19sZW5fX2BgICAgICAgICAgICAgIGBgaW5kZXhgYCwgYW5kIGBgY291bnRgYAogICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNsYXNzOmBDb250YWluZXJgCiAKLTpjbGFzczpgTXV0YWJsZVNlcXVlbmNlYCAgIDpjbGFzczpgU2VxdWVuY2VgICAgICAgYGBfX3NldGl0ZW1fX2BgLCAgICAgICAgSW5oZXJpdGVkIDpjbGFzczpgU2VxdWVuY2VgIG1ldGhvZHMgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgX19kZWxpdGVtX19gYCwgICAgICAgIGBgYXBwZW5kYGAsIGBgcmV2ZXJzZWBgLCBgYGV4dGVuZGBgLCBgYHBvcGBgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYGluc2VydGBgICAgICAgICAgICAgICBgYHJlbW92ZWBgLCBhbmQgYGBfX2lhZGRfX2BgCis6Y2xhc3M6YE11dGFibGVTZXF1ZW5jZWAgICA6Y2xhc3M6YFNlcXVlbmNlYCAgICAgIGBgX19nZXRpdGVtX19gYCwgICAgICAgIEluaGVyaXRlZCA6Y2xhc3M6YFNlcXVlbmNlYCBtZXRob2RzIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYF9fc2V0aXRlbV9fYGAsICAgICAgICBgYGFwcGVuZGBgLCBgYHJldmVyc2VgYCwgYGBleHRlbmRgYCwgYGBwb3BgYCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBfX2RlbGl0ZW1fX2BgLCAgICAgICAgYGByZW1vdmVgYCwgYW5kIGBgX19pYWRkX19gYAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYF9fbGVuX19gYCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBpbnNlcnRgYAogCi06Y2xhc3M6YFNldGAgICAgICAgICAgICAgICA6Y2xhc3M6YFNpemVkYCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgX19sZV9fYGAsIGBgX19sdF9fYGAsIGBgX19lcV9fYGAsIGBgX19uZV9fYGAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA6Y2xhc3M6YEl0ZXJhYmxlYCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgX19ndF9fYGAsIGBgX19nZV9fYGAsIGBgX19hbmRfX2BgLCBgYF9fb3JfX2BgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNsYXNzOmBDb250YWluZXJgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYF9fc3ViX19gYCwgYGBfX3hvcl9fYGAsIGFuZCBgYGlzZGlzam9pbnRgYAorOmNsYXNzOmBTZXRgICAgICAgICAgICAgICAgOmNsYXNzOmBTaXplZGAsICAgICAgICBgYF9fY29udGFpbnNfX2BgLCAgICAgICBgYF9fbGVfX2BgLCBgYF9fbHRfX2BgLCBgYF9fZXFfX2BgLCBgYF9fbmVfX2BgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNsYXNzOmBJdGVyYWJsZWAsICAgICBgYF9faXRlcl9fYGAsICAgICAgICAgICBgYF9fZ3RfX2BgLCBgYF9fZ2VfX2BgLCBgYF9fYW5kX19gYCwgYGBfX29yX19gYCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDpjbGFzczpgQ29udGFpbmVyYCAgICAgYGBfX2xlbl9fYGAgICAgICAgICAgICAgYGBfX3N1Yl9fYGAsIGBgX194b3JfX2BgLCBhbmQgYGBpc2Rpc2pvaW50YGAKIAotOmNsYXNzOmBNdXRhYmxlU2V0YCAgICAgICAgOmNsYXNzOmBTZXRgICAgICAgICAgICBgYGFkZGBgLCAgICAgICAgICAgICAgICBJbmhlcml0ZWQgOmNsYXNzOmBTZXRgIG1ldGhvZHMgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgZGlzY2FyZGBgICAgICAgICAgICAgIGBgY2xlYXJgYCwgYGBwb3BgYCwgYGByZW1vdmVgYCwgYGBfX2lvcl9fYGAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgX19pYW5kX19gYCwgYGBfX2l4b3JfX2BgLCBhbmQgYGBfX2lzdWJfX2BgCis6Y2xhc3M6YE11dGFibGVTZXRgICAgICAgICA6Y2xhc3M6YFNldGAgICAgICAgICAgIGBgX19jb250YWluc19fYGAsICAgICAgIEluaGVyaXRlZCA6Y2xhc3M6YFNldGAgbWV0aG9kcyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBfX2l0ZXJfX2BgLCAgICAgICAgICAgYGBjbGVhcmBgLCBgYHBvcGBgLCBgYHJlbW92ZWBgLCBgYF9faW9yX19gYCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBfX2xlbl9fYGAsICAgICAgICAgICAgYGBfX2lhbmRfX2BgLCBgYF9faXhvcl9fYGAsIGFuZCBgYF9faXN1Yl9fYGAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBhZGRgYCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBkaXNjYXJkYGAKIAotOmNsYXNzOmBNYXBwaW5nYCAgICAgICAgICAgOmNsYXNzOmBTaXplZGAsICAgICAgICBgYF9fZ2V0aXRlbV9fYGAgICAgICAgICBgYF9fY29udGFpbnNfX2BgLCBgYGtleXNgYCwgYGBpdGVtc2BgLCBgYHZhbHVlc2BgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNsYXNzOmBJdGVyYWJsZWAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYGdldGBgLCBgYF9fZXFfX2BgLCBhbmQgYGBfX25lX19gYAotICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNsYXNzOmBDb250YWluZXJgCis6Y2xhc3M6YE1hcHBpbmdgICAgICAgICAgICA6Y2xhc3M6YFNpemVkYCwgICAgICAgIGBgX19nZXRpdGVtX19gYCwgICAgICAgIGBgX19jb250YWluc19fYGAsIGBga2V5c2BgLCBgYGl0ZW1zYGAsIGBgdmFsdWVzYGAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6Y2xhc3M6YEl0ZXJhYmxlYCwgICAgIGBgX19pdGVyX19gYCwgICAgICAgICAgIGBgZ2V0YGAsIGBgX19lcV9fYGAsIGFuZCBgYF9fbmVfX2BgCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6Y2xhc3M6YENvbnRhaW5lcmAgICAgIGBgX19sZW5fX2BgCiAKLTpjbGFzczpgTXV0YWJsZU1hcHBpbmdgICAgIDpjbGFzczpgTWFwcGluZ2AgICAgICAgYGBfX3NldGl0ZW1fX2BgLCAgICAgICAgSW5oZXJpdGVkIDpjbGFzczpgTWFwcGluZ2AgbWV0aG9kcyBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBfX2RlbGl0ZW1fX2BgICAgICAgICAgYGBwb3BgYCwgYGBwb3BpdGVtYGAsIGBgY2xlYXJgYCwgYGB1cGRhdGVgYCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGBgc2V0ZGVmYXVsdGBgCis6Y2xhc3M6YE11dGFibGVNYXBwaW5nYCAgICA6Y2xhc3M6YE1hcHBpbmdgICAgICAgIGBgX19nZXRpdGVtX19gYCwgICAgICAgIEluaGVyaXRlZCA6Y2xhc3M6YE1hcHBpbmdgIG1ldGhvZHMgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgX19zZXRpdGVtX19gYCwgICAgICAgIGBgcG9wYGAsIGBgcG9waXRlbWBgLCBgYGNsZWFyYGAsIGBgdXBkYXRlYGAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgX19kZWxpdGVtX19gYCwgICAgICAgIGFuZCBgYHNldGRlZmF1bHRgYAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYF9faXRlcl9fYGAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgX19sZW5fX2BgCiAKIAogOmNsYXNzOmBNYXBwaW5nVmlld2AgICAgICAgOmNsYXNzOmBTaXplZGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYF9fbGVuX19gYApAQCAtMTAxMCw3ICsxMDI4LDcgQEAKIAogKDIpCiAgICBUbyBvdmVycmlkZSB0aGUgY29tcGFyaXNvbnMgKHByZXN1bWFibHkgZm9yIHNwZWVkLCBhcyB0aGUKLSAgIHNlbWFudGljcyBhcmUgZml4ZWQpLCByZWRlZmluZSA6bWV0aDpgX19sZV9fYCBhbmQKKyAgIHNlbWFudGljcyBhcmUgZml4ZWQpLCByZWRlZmluZSA6bWV0aDpgX19sZV9fYCBhbmQgOm1ldGg6YF9fZ2VfX2AsCiAgICB0aGVuIHRoZSBvdGhlciBvcGVyYXRpb25zIHdpbGwgYXV0b21hdGljYWxseSBmb2xsb3cgc3VpdC4KIAogKDMpCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9jb2xvcnN5cy5yc3QgYi9Eb2MvbGlicmFyeS9jb2xvcnN5cy5yc3QKaW5kZXggZGJhYjcwNi4uMjI1MzA2YyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvY29sb3JzeXMucnN0CisrKyBiL0RvYy9saWJyYXJ5L2NvbG9yc3lzLnJzdApAQCAtNTgsNyArNTgsNyBAQAogRXhhbXBsZTo6CiAKICAgID4+PiBpbXBvcnQgY29sb3JzeXMKLSAgID4+PiBjb2xvcnN5cy5yZ2JfdG9faHN2KC4zLCAuNCwgLjIpCi0gICAoMC4yNSwgMC41LCAwLjQpCi0gICA+Pj4gY29sb3JzeXMuaHN2X3RvX3JnYigwLjI1LCAwLjUsIDAuNCkKLSAgICgwLjMsIDAuNCwgMC4yKQorICAgPj4+IGNvbG9yc3lzLnJnYl90b19oc3YoMC4yLCAwLjQsIDAuNCkKKyAgICgwLjUsIDAuNSwgMC40KQorICAgPj4+IGNvbG9yc3lzLmhzdl90b19yZ2IoMC41LCAwLjUsIDAuNCkKKyAgICgwLjIsIDAuNCwgMC40KQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY29tbWFuZHMucnN0IGIvRG9jL2xpYnJhcnkvY29tbWFuZHMucnN0CmluZGV4IDkxNmU0YTUuLjBiNzNlNDIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2NvbW1hbmRzLnJzdAorKysgYi9Eb2MvbGlicmFyeS9jb21tYW5kcy5yc3QKQEAgLTgsNyArOCw3IEBACiAgICA6ZGVwcmVjYXRlZDoKIAogLi4gZGVwcmVjYXRlZDo6IDIuNgotICAgVGhlIDptb2Q6YGNvbW1hbmRzYCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4wLiAgVXNlIHRoZQorICAgVGhlIDptb2Q6YGNvbW1hbmRzYCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4gIFVzZSB0aGUKICAgIDptb2Q6YHN1YnByb2Nlc3NgIG1vZHVsZSBpbnN0ZWFkLgogCiAuLiBzZWN0aW9uYXV0aG9yOjogU3VlIFdpbGxpYW1zIDxzYndAcHJvdmlzLmNvbT4KQEAgLTM4LDcgKzM4LDcgQEAKICAgIGBgKHN0YXR1cywgb3V0cHV0KWBgLiAgKmNtZCogaXMgYWN0dWFsbHkgcnVuIGFzIGBgeyBjbWQgOyB9IDI+JjFgYCwgc28gdGhhdCB0aGUKICAgIHJldHVybmVkIG91dHB1dCB3aWxsIGNvbnRhaW4gb3V0cHV0IG9yIGVycm9yIG1lc3NhZ2VzLiBBIHRyYWlsaW5nIG5ld2xpbmUgaXMKICAgIHN0cmlwcGVkIGZyb20gdGhlIG91dHB1dC4gVGhlIGV4aXQgc3RhdHVzIGZvciB0aGUgY29tbWFuZCBjYW4gYmUgaW50ZXJwcmV0ZWQKLSAgIGFjY29yZGluZyB0byB0aGUgcnVsZXMgZm9yIHRoZSBDIGZ1bmN0aW9uIDpjZnVuYzpgd2FpdGAuCisgICBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIGZvciB0aGUgQyBmdW5jdGlvbiA6YzpmdW5jOmB3YWl0YC4KIAogCiAuLiBmdW5jdGlvbjo6IGdldG91dHB1dChjbWQpCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9jb21waWxlYWxsLnJzdCBiL0RvYy9saWJyYXJ5L2NvbXBpbGVhbGwucnN0CmluZGV4IGNmMGQ1ZjguLjBlNzlhNWEgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2NvbXBpbGVhbGwucnN0CisrKyBiL0RvYy9saWJyYXJ5L2NvbXBpbGVhbGwucnN0CkBAIC0xMjcsNyArMTI3LDcgQEAKIAogICAgIyBQZXJmb3JtIHNhbWUgY29tcGlsYXRpb24sIGV4Y2x1ZGluZyBmaWxlcyBpbiAuc3ZuIGRpcmVjdG9yaWVzLgogICAgaW1wb3J0IHJlCi0gICBjb21waWxlYWxsLmNvbXBpbGVfZGlyKCdMaWIvJywgcng9cmUuY29tcGlsZSgnL1suXXN2bicpLCBmb3JjZT1UcnVlKQorICAgY29tcGlsZWFsbC5jb21waWxlX2RpcignTGliLycsIHJ4PXJlLmNvbXBpbGUocidbL1xcXVsuXXN2bicpLCBmb3JjZT1UcnVlKQogCiAKIC4uIHNlZWFsc286OgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY29tcGlsZXIucnN0IGIvRG9jL2xpYnJhcnkvY29tcGlsZXIucnN0CmluZGV4IDQ1OGU2NTMuLjQ5NDkwMmUgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2NvbXBpbGVyLnJzdAorKysgYi9Eb2MvbGlicmFyeS9jb21waWxlci5yc3QKQEAgLTYsNyArNiw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKgogCiAuLiBkZXByZWNhdGVkOjogMi42Ci0gICBUaGUgOm1vZDpgY29tcGlsZXJgIHBhY2thZ2UgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4wLgorICAgVGhlIDptb2Q6YGNvbXBpbGVyYCBwYWNrYWdlIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuCiAKIC4uIHNlY3Rpb25hdXRob3I6OiBKZXJlbXkgSHlsdG9uIDxqZXJlbXlAem9wZS5jb20+CiAKQEAgLTU0MCw3ICs1NDAsNyBAQAogQVNUIGxvb2tzIGxpa2UsIGFuZCBob3cgdG8gYWNjZXNzIGF0dHJpYnV0ZXMgb2YgYW4gQVNUIG5vZGUuCiAKIFRoZSBmaXJzdCBtb2R1bGUgZGVmaW5lcyBhIHNpbmdsZSBmdW5jdGlvbi4gIEFzc3VtZSBpdCBpcyBzdG9yZWQgaW4KLTpmaWxlOmAvdG1wL2RvdWJsZWxpYi5weWAuICA6OgorOmZpbGU6YGRvdWJsZWxpYi5weWAuICA6OgogCiAgICAiIiJUaGlzIGlzIGFuIGV4YW1wbGUgbW9kdWxlLgogCkBAIC01NTcsNyArNTU3LDcgQEAKIDptb2Q6YGNvbXBpbGVyLmFzdGAgbW9kdWxlLiA6OgogCiAgICA+Pj4gaW1wb3J0IGNvbXBpbGVyCi0gICA+Pj4gbW9kID0gY29tcGlsZXIucGFyc2VGaWxlKCIvdG1wL2RvdWJsZWxpYi5weSIpCisgICA+Pj4gbW9kID0gY29tcGlsZXIucGFyc2VGaWxlKCJkb3VibGVsaWIucHkiKQogICAgPj4+IG1vZAogICAgTW9kdWxlKCdUaGlzIGlzIGFuIGV4YW1wbGUgbW9kdWxlLlxuXG5UaGlzIGlzIHRoZSBkb2NzdHJpbmcuXG4nLAogICAgICAgICAgIFN0bXQoW0Z1bmN0aW9uKE5vbmUsICdkb3VibGUnLCBbJ3gnXSwgW10sIDAsCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9jb25maWdwYXJzZXIucnN0IGIvRG9jL2xpYnJhcnkvY29uZmlncGFyc2VyLnJzdAppbmRleCAzNTM2ZjNlLi41MTUwNzRhIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9jb25maWdwYXJzZXIucnN0CisrKyBiL0RvYy9saWJyYXJ5L2NvbmZpZ3BhcnNlci5yc3QKQEAgLTEyLDggKzEyLDggQEAKIC4uIG5vdGU6OgogCiAgICBUaGUgOm1vZDpgQ29uZmlnUGFyc2VyYCBtb2R1bGUgaGFzIGJlZW4gcmVuYW1lZCB0byA6bW9kOmBjb25maWdwYXJzZXJgIGluCi0gICBQeXRob24gMy4wLiAgVGhlIDp0ZXJtOmAydG8zYCB0b29sIHdpbGwgYXV0b21hdGljYWxseSBhZGFwdCBpbXBvcnRzIHdoZW4KLSAgIGNvbnZlcnRpbmcgeW91ciBzb3VyY2VzIHRvIDMuMC4KKyAgIFB5dGhvbiAzLiAgVGhlIDp0ZXJtOmAydG8zYCB0b29sIHdpbGwgYXV0b21hdGljYWxseSBhZGFwdCBpbXBvcnRzIHdoZW4KKyAgIGNvbnZlcnRpbmcgeW91ciBzb3VyY2VzIHRvIFB5dGhvbiAzLgogCiAuLiBpbmRleDo6CiAgICBwYWlyOiAuaW5pOyBmaWxlCkBAIC00NTEsOSArNDUxLDkgQEAKICAgICMgd2hlbiBhdHRlbXB0aW5nIHRvIHdyaXRlIHRvIGEgZmlsZSBvciB3aGVuIHlvdSBnZXQgaXQgaW4gbm9uLXJhdwogICAgIyBtb2RlLiBTYWZlQ29uZmlnUGFyc2VyIGRvZXMgbm90IGFsbG93IHN1Y2ggYXNzaWdubWVudHMgdG8gdGFrZSBwbGFjZS4KICAgIGNvbmZpZy5hZGRfc2VjdGlvbignU2VjdGlvbjEnKQotICAgY29uZmlnLnNldCgnU2VjdGlvbjEnLCAnaW50JywgJzE1JykKLSAgIGNvbmZpZy5zZXQoJ1NlY3Rpb24xJywgJ2Jvb2wnLCAndHJ1ZScpCi0gICBjb25maWcuc2V0KCdTZWN0aW9uMScsICdmbG9hdCcsICczLjE0MTUnKQorICAgY29uZmlnLnNldCgnU2VjdGlvbjEnLCAnYW5faW50JywgJzE1JykKKyAgIGNvbmZpZy5zZXQoJ1NlY3Rpb24xJywgJ2FfYm9vbCcsICd0cnVlJykKKyAgIGNvbmZpZy5zZXQoJ1NlY3Rpb24xJywgJ2FfZmxvYXQnLCAnMy4xNDE1JykKICAgIGNvbmZpZy5zZXQoJ1NlY3Rpb24xJywgJ2JheicsICdmdW4nKQogICAgY29uZmlnLnNldCgnU2VjdGlvbjEnLCAnYmFyJywgJ1B5dGhvbicpCiAgICBjb25maWcuc2V0KCdTZWN0aW9uMScsICdmb28nLCAnJShiYXIpcyBpcyAlKGJheilzIScpCkBAIC00NzEsMTMgKzQ3MSwxMyBAQAogCiAgICAjIGdldGZsb2F0KCkgcmFpc2VzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgdmFsdWUgaXMgbm90IGEgZmxvYXQKICAgICMgZ2V0aW50KCkgYW5kIGdldGJvb2xlYW4oKSBhbHNvIGRvIHRoaXMgZm9yIHRoZWlyIHJlc3BlY3RpdmUgdHlwZXMKLSAgIGZsb2F0ID0gY29uZmlnLmdldGZsb2F0KCdTZWN0aW9uMScsICdmbG9hdCcpCi0gICBpbnQgPSBjb25maWcuZ2V0aW50KCdTZWN0aW9uMScsICdpbnQnKQotICAgcHJpbnQgZmxvYXQgKyBpbnQKKyAgIGFfZmxvYXQgPSBjb25maWcuZ2V0ZmxvYXQoJ1NlY3Rpb24xJywgJ2FfZmxvYXQnKQorICAgYW5faW50ID0gY29uZmlnLmdldGludCgnU2VjdGlvbjEnLCAnYW5faW50JykKKyAgIHByaW50IGFfZmxvYXQgKyBhbl9pbnQKIAogICAgIyBOb3RpY2UgdGhhdCB0aGUgbmV4dCBvdXRwdXQgZG9lcyBub3QgaW50ZXJwb2xhdGUgJyUoYmFyKXMnIG9yICclKGJheilzJy4KICAgICMgVGhpcyBpcyBiZWNhdXNlIHdlIGFyZSB1c2luZyBhIFJhd0NvbmZpZ1BhcnNlcigpLgotICAgaWYgY29uZmlnLmdldGJvb2xlYW4oJ1NlY3Rpb24xJywgJ2Jvb2wnKToKKyAgIGlmIGNvbmZpZy5nZXRib29sZWFuKCdTZWN0aW9uMScsICdhX2Jvb2wnKToKICAgICAgICBwcmludCBjb25maWcuZ2V0KCdTZWN0aW9uMScsICdmb28nKQogCiBUbyBnZXQgaW50ZXJwb2xhdGlvbiwgeW91IHdpbGwgbmVlZCB0byB1c2UgYSA6Y2xhc3M6YENvbmZpZ1BhcnNlcmAgb3IKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2Nvb2tpZS5yc3QgYi9Eb2MvbGlicmFyeS9jb29raWUucnN0CmluZGV4IDQ4MGRmZmEuLjE5Nzg2ZjcgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2Nvb2tpZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvY29va2llLnJzdApAQCAtOCw4ICs4LDggQEAKIAogLi4gbm90ZTo6CiAgICBUaGUgOm1vZDpgQ29va2llYCBtb2R1bGUgaGFzIGJlZW4gcmVuYW1lZCB0byA6bW9kOmBodHRwLmNvb2tpZXNgIGluIFB5dGhvbgotICAgMy4wLiAgVGhlIDp0ZXJtOmAydG8zYCB0b29sIHdpbGwgYXV0b21hdGljYWxseSBhZGFwdCBpbXBvcnRzIHdoZW4gY29udmVydGluZwotICAgeW91ciBzb3VyY2VzIHRvIDMuMC4KKyAgIDMuICBUaGUgOnRlcm06YDJ0bzNgIHRvb2wgd2lsbCBhdXRvbWF0aWNhbGx5IGFkYXB0IGltcG9ydHMgd2hlbiBjb252ZXJ0aW5nCisgICB5b3VyIHNvdXJjZXMgdG8gUHl0aG9uIDMuCiAKICoqU291cmNlIGNvZGU6KiogOnNvdXJjZTpgTGliL0Nvb2tpZS5weWAKIApAQCAtMjIsOCArMjIsMTQgQEAKIAogVGhlIG1vZHVsZSBmb3JtZXJseSBzdHJpY3RseSBhcHBsaWVkIHRoZSBwYXJzaW5nIHJ1bGVzIGRlc2NyaWJlZCBpbiB0aGUKIDpyZmM6YDIxMDlgIGFuZCA6cmZjOmAyMDY4YCBzcGVjaWZpY2F0aW9ucy4gIEl0IGhhcyBzaW5jZSBiZWVuIGRpc2NvdmVyZWQgdGhhdAotTVNJRSAzLjB4IGRvZXNuJ3QgZm9sbG93IHRoZSBjaGFyYWN0ZXIgcnVsZXMgb3V0bGluZWQgaW4gdGhvc2Ugc3BlY3MuICBBcyBhCi1yZXN1bHQsIHRoZSBwYXJzaW5nIHJ1bGVzIHVzZWQgYXJlIGEgYml0IGxlc3Mgc3RyaWN0LgorTVNJRSAzLjB4IGRvZXNuJ3QgZm9sbG93IHRoZSBjaGFyYWN0ZXIgcnVsZXMgb3V0bGluZWQgaW4gdGhvc2Ugc3BlY3MgYW5kIGFsc28KK21hbnkgY3VycmVudCBkYXkgYnJvd3NlcnMgYW5kIHNlcnZlcnMgaGF2ZSByZWxheGVkIHBhcnNpbmcgcnVsZXMgd2hlbiBjb21lcyB0bworQ29va2llIGhhbmRsaW5nLiAgQXMgYSByZXN1bHQsIHRoZSBwYXJzaW5nIHJ1bGVzIHVzZWQgYXJlIGEgYml0IGxlc3Mgc3RyaWN0LgorCitUaGUgY2hhcmFjdGVyIHNldCwgOmRhdGE6YHN0cmluZy5hc2NpaV9sZXR0ZXJzYCwgOmRhdGE6YHN0cmluZy5kaWdpdHNgIGFuZAorYGAhIyQlJicqKy0uXl9gfH5gYCBkZW5vdGUgdGhlIHNldCBvZiB2YWxpZCBjaGFyYWN0ZXJzIGFsbG93ZWQgYnkgdGhpcyBtb2R1bGUKK2luIENvb2tpZSBuYW1lIChhcyA6YXR0cjpgfk1vcnNlbC5rZXlgKS4KKwogCiAuLiBub3RlOjoKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY29va2llbGliLnJzdCBiL0RvYy9saWJyYXJ5L2Nvb2tpZWxpYi5yc3QKaW5kZXggNzdkNjYyNC4uYjFiYWVmMSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvY29va2llbGliLnJzdAorKysgYi9Eb2MvbGlicmFyeS9jb29raWVsaWIucnN0CkBAIC04LDggKzgsOCBAQAogCiAuLiBub3RlOjoKICAgIFRoZSA6bW9kOmBjb29raWVsaWJgIG1vZHVsZSBoYXMgYmVlbiByZW5hbWVkIHRvIDptb2Q6YGh0dHAuY29va2llamFyYCBpbgotICAgUHl0aG9uIDMuMC4gIFRoZSA6dGVybTpgMnRvM2AgdG9vbCB3aWxsIGF1dG9tYXRpY2FsbHkgYWRhcHQgaW1wb3J0cyB3aGVuCi0gICBjb252ZXJ0aW5nIHlvdXIgc291cmNlcyB0byAzLjAuCisgICBQeXRob24gMy4gIFRoZSA6dGVybTpgMnRvM2AgdG9vbCB3aWxsIGF1dG9tYXRpY2FsbHkgYWRhcHQgaW1wb3J0cyB3aGVuCisgICBjb252ZXJ0aW5nIHlvdXIgc291cmNlcyB0byBQeXRob24gMy4KIAogLi4gdmVyc2lvbmFkZGVkOjogMi40CiAKQEAgLTk4LDcgKzk4LDcgQEAKICAgIE5ldHNjYXBlIGFuZCBSRkMgMjk2NSBjb29raWVzLiAgQnkgZGVmYXVsdCwgUkZDIDIxMDkgY29va2llcyAoaWUuIGNvb2tpZXMKICAgIHJlY2VpdmVkIGluIGEgOm1haWxoZWFkZXI6YFNldC1Db29raWVgIGhlYWRlciB3aXRoIGEgdmVyc2lvbiBjb29raWUtYXR0cmlidXRlIG9mCiAgICAxKSBhcmUgdHJlYXRlZCBhY2NvcmRpbmcgdG8gdGhlIFJGQyAyOTY1IHJ1bGVzLiAgSG93ZXZlciwgaWYgUkZDIDI5NjUgaGFuZGxpbmcKLSAgIGlzIHR1cm5lZCBvZmYgb3IgOmF0dHI6YHJmYzIxMDlfYXNfbmV0c2NhcGVgIGlzIFRydWUsIFJGQyAyMTA5IGNvb2tpZXMgYXJlCisgICBpcyB0dXJuZWQgb2ZmIG9yIDphdHRyOmByZmMyMTA5X2FzX25ldHNjYXBlYCBpcyBgYFRydWVgYCwgUkZDIDIxMDkgY29va2llcyBhcmUKICAgICdkb3duZ3JhZGVkJyBieSB0aGUgOmNsYXNzOmBDb29raWVKYXJgIGluc3RhbmNlIHRvIE5ldHNjYXBlIGNvb2tpZXMsIGJ5CiAgICBzZXR0aW5nIHRoZSA6YXR0cjpgdmVyc2lvbmAgYXR0cmlidXRlIG9mIHRoZSA6Y2xhc3M6YENvb2tpZWAgaW5zdGFuY2UgdG8gMC4KICAgIDpjbGFzczpgRGVmYXVsdENvb2tpZVBvbGljeWAgYWxzbyBwcm92aWRlcyBzb21lIHBhcmFtZXRlcnMgdG8gYWxsb3cgc29tZQpAQCAtMzA4LDcgKzMwOCw3IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBUaGUgZm9sbG93aW5nIDpjbGFzczpgQ29va2llSmFyYCBzdWJjbGFzc2VzIGFyZSBwcm92aWRlZCBmb3IgcmVhZGluZyBhbmQKLXdyaXRpbmcgLgord3JpdGluZy4KIAogLi4gY2xhc3M6OiBNb3ppbGxhQ29va2llSmFyKGZpbGVuYW1lLCBkZWxheWxvYWQ9Tm9uZSwgcG9saWN5PU5vbmUpCiAKQEAgLTY1Miw3ICs2NTIsNyBAQAogCiAuLiBhdHRyaWJ1dGU6OiBDb29raWUuc2VjdXJlCiAKLSAgIFRydWUgaWYgY29va2llIHNob3VsZCBvbmx5IGJlIHJldHVybmVkIG92ZXIgYSBzZWN1cmUgY29ubmVjdGlvbi4KKyAgIGBgVHJ1ZWBgIGlmIGNvb2tpZSBzaG91bGQgb25seSBiZSByZXR1cm5lZCBvdmVyIGEgc2VjdXJlIGNvbm5lY3Rpb24uCiAKIAogLi4gYXR0cmlidXRlOjogQ29va2llLmV4cGlyZXMKQEAgLTY2Myw3ICs2NjMsNyBAQAogCiAuLiBhdHRyaWJ1dGU6OiBDb29raWUuZGlzY2FyZAogCi0gICBUcnVlIGlmIHRoaXMgaXMgYSBzZXNzaW9uIGNvb2tpZS4KKyAgIGBgVHJ1ZWBgIGlmIHRoaXMgaXMgYSBzZXNzaW9uIGNvb2tpZS4KIAogCiAuLiBhdHRyaWJ1dGU6OiBDb29raWUuY29tbWVudApAQCAtNjgwLDcgKzY4MCw3IEBACiAKIC4uIGF0dHJpYnV0ZTo6IENvb2tpZS5yZmMyMTA5CiAKLSAgIFRydWUgaWYgdGhpcyBjb29raWUgd2FzIHJlY2VpdmVkIGFzIGFuIFJGQyAyMTA5IGNvb2tpZSAoaWUuIHRoZSBjb29raWUKKyAgIGBgVHJ1ZWBgIGlmIHRoaXMgY29va2llIHdhcyByZWNlaXZlZCBhcyBhbiBSRkMgMjEwOSBjb29raWUgKGllLiB0aGUgY29va2llCiAgICBhcnJpdmVkIGluIGEgOm1haWxoZWFkZXI6YFNldC1Db29raWVgIGhlYWRlciwgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgVmVyc2lvbgogICAgY29va2llLWF0dHJpYnV0ZSBpbiB0aGF0IGhlYWRlciB3YXMgMSkuICBUaGlzIGF0dHJpYnV0ZSBpcyBwcm92aWRlZCBiZWNhdXNlCiAgICA6bW9kOmBjb29raWVsaWJgIG1heSAnZG93bmdyYWRlJyBSRkMgMjEwOSBjb29raWVzIHRvIE5ldHNjYXBlIGNvb2tpZXMsIGluCkBAIC02OTEsMTggKzY5MSwxOCBAQAogCiAuLiBhdHRyaWJ1dGU6OiBDb29raWUucG9ydF9zcGVjaWZpZWQKIAotICAgVHJ1ZSBpZiBhIHBvcnQgb3Igc2V0IG9mIHBvcnRzIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZCBieSB0aGUgc2VydmVyIChpbiB0aGUKKyAgIGBgVHJ1ZWBgIGlmIGEgcG9ydCBvciBzZXQgb2YgcG9ydHMgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGJ5IHRoZSBzZXJ2ZXIgKGluIHRoZQogICAgOm1haWxoZWFkZXI6YFNldC1Db29raWVgIC8gOm1haWxoZWFkZXI6YFNldC1Db29raWUyYCBoZWFkZXIpLgogCiAKIC4uIGF0dHJpYnV0ZTo6IENvb2tpZS5kb21haW5fc3BlY2lmaWVkCiAKLSAgIFRydWUgaWYgYSBkb21haW4gd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGJ5IHRoZSBzZXJ2ZXIuCisgICBgYFRydWVgYCBpZiBhIGRvbWFpbiB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQgYnkgdGhlIHNlcnZlci4KIAogCiAuLiBhdHRyaWJ1dGU6OiBDb29raWUuZG9tYWluX2luaXRpYWxfZG90CiAKLSAgIFRydWUgaWYgdGhlIGRvbWFpbiBleHBsaWNpdGx5IHNwZWNpZmllZCBieSB0aGUgc2VydmVyIGJlZ2FuIHdpdGggYSBkb3QKKyAgIGBgVHJ1ZWBgIGlmIHRoZSBkb21haW4gZXhwbGljaXRseSBzcGVjaWZpZWQgYnkgdGhlIHNlcnZlciBiZWdhbiB3aXRoIGEgZG90CiAgICAoYGAnLidgYCkuCiAKIENvb2tpZXMgbWF5IGhhdmUgYWRkaXRpb25hbCBub24tc3RhbmRhcmQgY29va2llLWF0dHJpYnV0ZXMuICBUaGVzZSBtYXkgYmUKQEAgLTcyOSw3ICs3MjksNyBAQAogCiAuLiBtZXRob2Q6OiBDb29raWUuaXNfZXhwaXJlZChbbm93PU5vbmVdKQogCi0gICBUcnVlIGlmIGNvb2tpZSBoYXMgcGFzc2VkIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSBzZXJ2ZXIgcmVxdWVzdGVkIGl0IHNob3VsZAorICAgYGBUcnVlYGAgaWYgY29va2llIGhhcyBwYXNzZWQgdGhlIHRpbWUgYXQgd2hpY2ggdGhlIHNlcnZlciByZXF1ZXN0ZWQgaXQgc2hvdWxkCiAgICBleHBpcmUuICBJZiAqbm93KiBpcyBnaXZlbiAoaW4gc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2gpLCByZXR1cm4gd2hldGhlciB0aGUKICAgIGNvb2tpZSBoYXMgZXhwaXJlZCBhdCB0aGUgc3BlY2lmaWVkIHRpbWUuCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2NvcHkucnN0IGIvRG9jL2xpYnJhcnkvY29weS5yc3QKaW5kZXggYjNjZTUxZi4uMGYyM2E5NSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvY29weS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvY29weS5yc3QKQEAgLTQsNyArNCwxMSBAQAogLi4gbW9kdWxlOjogY29weQogICAgOnN5bm9wc2lzOiBTaGFsbG93IGFuZCBkZWVwIGNvcHkgb3BlcmF0aW9ucy4KIAotVGhpcyBtb2R1bGUgcHJvdmlkZXMgZ2VuZXJpYyAoc2hhbGxvdyBhbmQgZGVlcCkgY29weWluZyBvcGVyYXRpb25zLgorQXNzaWdubWVudCBzdGF0ZW1lbnRzIGluIFB5dGhvbiBkbyBub3QgY29weSBvYmplY3RzLCB0aGV5IGNyZWF0ZSBiaW5kaW5ncworYmV0d2VlbiBhIHRhcmdldCBhbmQgYW4gb2JqZWN0LiBGb3IgY29sbGVjdGlvbnMgdGhhdCBhcmUgbXV0YWJsZSBvciBjb250YWluCittdXRhYmxlIGl0ZW1zLCBhIGNvcHkgaXMgc29tZXRpbWVzIG5lZWRlZCBzbyBvbmUgY2FuIGNoYW5nZSBvbmUgY29weSB3aXRob3V0CitjaGFuZ2luZyB0aGUgb3RoZXIuIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGdlbmVyaWMgc2hhbGxvdyBhbmQgZGVlcCBjb3B5CitvcGVyYXRpb25zIChleHBsYWluZWQgYmVsb3cpLgogCiAKIEludGVyZmFjZSBzdW1tYXJ5OgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY29weV9yZWcucnN0IGIvRG9jL2xpYnJhcnkvY29weV9yZWcucnN0CmluZGV4IDYwOWRlZDAuLjNkOGVmNzcgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2NvcHlfcmVnLnJzdAorKysgYi9Eb2MvbGlicmFyeS9jb3B5X3JlZy5yc3QKQEAgLTUsMjAgKzUsMjAgQEAKICAgIDpzeW5vcHNpczogUmVnaXN0ZXIgcGlja2xlIHN1cHBvcnQgZnVuY3Rpb25zLgogCiAuLiBub3RlOjoKLSAgIFRoZSA6bW9kOmBjb3B5X3JlZ2AgbW9kdWxlIGhhcyBiZWVuIHJlbmFtZWQgdG8gOm1vZDpgY29weXJlZ2AgaW4gUHl0aG9uIDMuMC4KKyAgIFRoZSA6bW9kOmBjb3B5X3JlZ2AgbW9kdWxlIGhhcyBiZWVuIHJlbmFtZWQgdG8gOm1vZDpgY29weXJlZ2AgaW4gUHl0aG9uIDMuCiAgICBUaGUgOnRlcm06YDJ0bzNgIHRvb2wgd2lsbCBhdXRvbWF0aWNhbGx5IGFkYXB0IGltcG9ydHMgd2hlbiBjb252ZXJ0aW5nIHlvdXIKLSAgIHNvdXJjZXMgdG8gMy4wLgorICAgc291cmNlcyB0byBQeXRob24gMy4KIAogLi4gaW5kZXg6OgogICAgbW9kdWxlOiBwaWNrbGUKICAgIG1vZHVsZTogY1BpY2tsZQogICAgbW9kdWxlOiBjb3B5CiAKLVRoZSA6bW9kOmBjb3B5X3JlZ2AgbW9kdWxlIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSA6bW9kOmBwaWNrbGVgIGFuZAotOm1vZDpgY1BpY2tsZWAgbW9kdWxlcy4gIFRoZSA6bW9kOmBjb3B5YCBtb2R1bGUgaXMgbGlrZWx5IHRvIHVzZSB0aGlzIGluIHRoZQotZnV0dXJlIGFzIHdlbGwuICBJdCBwcm92aWRlcyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGFib3V0IG9iamVjdCBjb25zdHJ1Y3RvcnMKLXdoaWNoIGFyZSBub3QgY2xhc3Nlcy4gIFN1Y2ggY29uc3RydWN0b3JzIG1heSBiZSBmYWN0b3J5IGZ1bmN0aW9ucyBvciBjbGFzcwotaW5zdGFuY2VzLgorVGhlIDptb2Q6YGNvcHlfcmVnYCBtb2R1bGUgb2ZmZXJzIGEgd2F5IHRvIGRlZmluZSBmdWN0aW9ucyB1c2VkIHdoaWxlIHBpY2tsaW5nCitzcGVjaWZpYyBvYmplY3RzLiAgVGhlIDptb2Q6YHBpY2tsZWAsIDptb2Q6YGNQaWNrbGVgLCBhbmQgOm1vZDpgY29weWAgbW9kdWxlcwordXNlIHRob3NlIGZ1bmN0aW9ucyB3aGVuIHBpY2tsaW5nL2NvcHlpbmcgdGhvc2Ugb2JqZWN0cy4gIFRoZSBtb2R1bGUgcHJvdmlkZXMKK2NvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgb2JqZWN0IGNvbnN0cnVjdG9ycyB3aGljaCBhcmUgbm90IGNsYXNzZXMuCitTdWNoIGNvbnN0cnVjdG9ycyBtYXkgYmUgZmFjdG9yeSBmdW5jdGlvbnMgb3IgY2xhc3MgaW5zdGFuY2VzLgogCiAKIC4uIGZ1bmN0aW9uOjogY29uc3RydWN0b3Iob2JqZWN0KQpAQCAtNDMsMyArNDMsMjQgQEAKICAgIFNlZSB0aGUgOm1vZDpgcGlja2xlYCBtb2R1bGUgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgaW50ZXJmYWNlIGV4cGVjdGVkIG9mCiAgICAqZnVuY3Rpb24qIGFuZCAqY29uc3RydWN0b3IqLgogCitFeGFtcGxlCistLS0tLS0tCisKK1RoZSBleGFtcGxlIGJlbG93IHdvdWxkIGxpa2UgdG8gc2hvdyBob3cgdG8gcmVnaXN0ZXIgYSBwaWNrbGUgZnVuY3Rpb24gYW5kIGhvdworaXQgd2lsbCBiZSB1c2VkOgorCisgICA+Pj4gaW1wb3J0IGNvcHlfcmVnLCBjb3B5LCBwaWNrbGUKKyAgID4+PiBjbGFzcyBDKG9iamVjdCk6CisgICAuLi4gICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhKToKKyAgIC4uLiAgICAgICAgIHNlbGYuYSA9IGEKKyAgIC4uLgorICAgPj4+IGRlZiBwaWNrbGVfYyhjKToKKyAgIC4uLiAgICAgcHJpbnQoInBpY2tsaW5nIGEgQyBpbnN0YW5jZS4uLiIpCisgICAuLi4gICAgIHJldHVybiBDLCAoYy5hLCkKKyAgIC4uLgorICAgPj4+IGNvcHlfcmVnLnBpY2tsZShDLCBwaWNrbGVfYykKKyAgID4+PiBjID0gQygxKQorICAgPj4+IGQgPSBjb3B5LmNvcHkoYykKKyAgIHBpY2tsaW5nIGEgQyBpbnN0YW5jZS4uLgorICAgPj4+IHAgPSBwaWNrbGUuZHVtcHMoYykKKyAgIHBpY2tsaW5nIGEgQyBpbnN0YW5jZS4uLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY3N2LnJzdCBiL0RvYy9saWJyYXJ5L2Nzdi5yc3QKaW5kZXggZjRlOWQ3Yy4uMjA1NGNlNiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvY3N2LnJzdAorKysgYi9Eb2MvbGlicmFyeS9jc3YucnN0CkBAIC00MCw3ICs0MCw3IEBACiAgICBUaGlzIHZlcnNpb24gb2YgdGhlIDptb2Q6YGNzdmAgbW9kdWxlIGRvZXNuJ3Qgc3VwcG9ydCBVbmljb2RlIGlucHV0LiAgQWxzbywKICAgIHRoZXJlIGFyZSBjdXJyZW50bHkgc29tZSBpc3N1ZXMgcmVnYXJkaW5nIEFTQ0lJIE5VTCBjaGFyYWN0ZXJzLiAgQWNjb3JkaW5nbHksCiAgICBhbGwgaW5wdXQgc2hvdWxkIGJlIFVURi04IG9yIHByaW50YWJsZSBBU0NJSSB0byBiZSBzYWZlOyBzZWUgdGhlIGV4YW1wbGVzIGluCi0gICBzZWN0aW9uIDpyZWY6YGNzdi1leGFtcGxlc2AuIFRoZXNlIHJlc3RyaWN0aW9ucyB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KKyAgIHNlY3Rpb24gOnJlZjpgY3N2LWV4YW1wbGVzYC4KIAogCiAuLiBzZWVhbHNvOjoKQEAgLTU3LDcgKzU3LDcgQEAKIFRoZSA6bW9kOmBjc3ZgIG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgogCiAKLS4uIGZ1bmN0aW9uOjogcmVhZGVyKGNzdmZpbGVbLCBkaWFsZWN0PSdleGNlbCddWywgZm10cGFyYW1dKQorLi4gZnVuY3Rpb246OiByZWFkZXIoY3N2ZmlsZSwgZGlhbGVjdD0nZXhjZWwnLCAqKmZtdHBhcmFtcykKIAogICAgUmV0dXJuIGEgcmVhZGVyIG9iamVjdCB3aGljaCB3aWxsIGl0ZXJhdGUgb3ZlciBsaW5lcyBpbiB0aGUgZ2l2ZW4gKmNzdmZpbGUqLgogICAgKmNzdmZpbGUqIGNhbiBiZSBhbnkgb2JqZWN0IHdoaWNoIHN1cHBvcnRzIHRoZSA6dGVybTpgaXRlcmF0b3JgIHByb3RvY29sIGFuZCByZXR1cm5zIGEKQEAgLTY3LDcgKzY3LDcgQEAKICAgICpkaWFsZWN0KiBwYXJhbWV0ZXIgY2FuIGJlIGdpdmVuIHdoaWNoIGlzIHVzZWQgdG8gZGVmaW5lIGEgc2V0IG9mIHBhcmFtZXRlcnMKICAgIHNwZWNpZmljIHRvIGEgcGFydGljdWxhciBDU1YgZGlhbGVjdC4gIEl0IG1heSBiZSBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIG9mCiAgICB0aGUgOmNsYXNzOmBEaWFsZWN0YCBjbGFzcyBvciBvbmUgb2YgdGhlIHN0cmluZ3MgcmV0dXJuZWQgYnkgdGhlCi0gICA6ZnVuYzpgbGlzdF9kaWFsZWN0c2AgZnVuY3Rpb24uICBUaGUgb3RoZXIgb3B0aW9uYWwgKmZtdHBhcmFtKiBrZXl3b3JkIGFyZ3VtZW50cworICAgOmZ1bmM6YGxpc3RfZGlhbGVjdHNgIGZ1bmN0aW9uLiAgVGhlIG90aGVyIG9wdGlvbmFsICpmbXRwYXJhbXMqIGtleXdvcmQgYXJndW1lbnRzCiAgICBjYW4gYmUgZ2l2ZW4gdG8gb3ZlcnJpZGUgaW5kaXZpZHVhbCBmb3JtYXR0aW5nIHBhcmFtZXRlcnMgaW4gdGhlIGN1cnJlbnQKICAgIGRpYWxlY3QuICBGb3IgZnVsbCBkZXRhaWxzIGFib3V0IHRoZSBkaWFsZWN0IGFuZCBmb3JtYXR0aW5nIHBhcmFtZXRlcnMsIHNlZQogICAgc2VjdGlvbiA6cmVmOmBjc3YtZm10LXBhcmFtc2AuCkBAIC03OCw5ICs3OCwxMCBAQAogICAgQSBzaG9ydCB1c2FnZSBleGFtcGxlOjoKIAogICAgICAgPj4+IGltcG9ydCBjc3YKLSAgICAgID4+PiBzcGFtUmVhZGVyID0gY3N2LnJlYWRlcihvcGVuKCdlZ2dzLmNzdicsICdyYicpLCBkZWxpbWl0ZXI9JyAnLCBxdW90ZWNoYXI9J3wnKQotICAgICAgPj4+IGZvciByb3cgaW4gc3BhbVJlYWRlcjoKLSAgICAgIC4uLiAgICAgcHJpbnQgJywgJy5qb2luKHJvdykKKyAgICAgID4+PiB3aXRoIG9wZW4oJ2VnZ3MuY3N2JywgJ3JiJykgYXMgY3N2ZmlsZToKKyAgICAgIC4uLiAgICAgc3BhbXJlYWRlciA9IGNzdi5yZWFkZXIoY3N2ZmlsZSwgZGVsaW1pdGVyPScgJywgcXVvdGVjaGFyPSd8JykKKyAgICAgIC4uLiAgICAgZm9yIHJvdyBpbiBzcGFtcmVhZGVyOgorICAgICAgLi4uICAgICAgICAgcHJpbnQgJywgJy5qb2luKHJvdykKICAgICAgIFNwYW0sIFNwYW0sIFNwYW0sIFNwYW0sIFNwYW0sIEJha2VkIEJlYW5zCiAgICAgICBTcGFtLCBMb3ZlbHkgU3BhbSwgV29uZGVyZnVsIFNwYW0KIApAQCAtOTQsNyArOTUsNyBAQAogICAgICAgYmUgc3BsaXQgaW50byBsaW5lcyBpbiBhIG1hbm5lciB3aGljaCBwcmVzZXJ2ZXMgdGhlIG5ld2xpbmUgY2hhcmFjdGVycy4KIAogCi0uLiBmdW5jdGlvbjo6IHdyaXRlcihjc3ZmaWxlWywgZGlhbGVjdD0nZXhjZWwnXVssIGZtdHBhcmFtXSkKKy4uIGZ1bmN0aW9uOjogd3JpdGVyKGNzdmZpbGUsIGRpYWxlY3Q9J2V4Y2VsJywgKipmbXRwYXJhbXMpCiAKICAgIFJldHVybiBhIHdyaXRlciBvYmplY3QgcmVzcG9uc2libGUgZm9yIGNvbnZlcnRpbmcgdGhlIHVzZXIncyBkYXRhIGludG8gZGVsaW1pdGVkCiAgICBzdHJpbmdzIG9uIHRoZSBnaXZlbiBmaWxlLWxpa2Ugb2JqZWN0LiAgKmNzdmZpbGUqIGNhbiBiZSBhbnkgb2JqZWN0IHdpdGggYQpAQCAtMTAzLDcgKzEwNCw3IEBACiAgICBwYXJhbWV0ZXIgY2FuIGJlIGdpdmVuIHdoaWNoIGlzIHVzZWQgdG8gZGVmaW5lIGEgc2V0IG9mIHBhcmFtZXRlcnMgc3BlY2lmaWMgdG8gYQogICAgcGFydGljdWxhciBDU1YgZGlhbGVjdC4gIEl0IG1heSBiZSBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIG9mIHRoZQogICAgOmNsYXNzOmBEaWFsZWN0YCBjbGFzcyBvciBvbmUgb2YgdGhlIHN0cmluZ3MgcmV0dXJuZWQgYnkgdGhlCi0gICA6ZnVuYzpgbGlzdF9kaWFsZWN0c2AgZnVuY3Rpb24uICBUaGUgb3RoZXIgb3B0aW9uYWwgKmZtdHBhcmFtKiBrZXl3b3JkIGFyZ3VtZW50cworICAgOmZ1bmM6YGxpc3RfZGlhbGVjdHNgIGZ1bmN0aW9uLiAgVGhlIG90aGVyIG9wdGlvbmFsICpmbXRwYXJhbXMqIGtleXdvcmQgYXJndW1lbnRzCiAgICBjYW4gYmUgZ2l2ZW4gdG8gb3ZlcnJpZGUgaW5kaXZpZHVhbCBmb3JtYXR0aW5nIHBhcmFtZXRlcnMgaW4gdGhlIGN1cnJlbnQKICAgIGRpYWxlY3QuICBGb3IgZnVsbCBkZXRhaWxzIGFib3V0IHRoZSBkaWFsZWN0IGFuZCBmb3JtYXR0aW5nIHBhcmFtZXRlcnMsIHNlZQogICAgc2VjdGlvbiA6cmVmOmBjc3YtZm10LXBhcmFtc2AuIFRvIG1ha2UgaXQKQEAgLTExNSwxOCArMTE2LDE5IEBACiAKICAgIEEgc2hvcnQgdXNhZ2UgZXhhbXBsZTo6CiAKLSAgICAgID4+PiBpbXBvcnQgY3N2Ci0gICAgICA+Pj4gc3BhbVdyaXRlciA9IGNzdi53cml0ZXIob3BlbignZWdncy5jc3YnLCAnd2InKSwgZGVsaW1pdGVyPScgJywKLSAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZWNoYXI9J3wnLCBxdW90aW5nPWNzdi5RVU9URV9NSU5JTUFMKQotICAgICAgPj4+IHNwYW1Xcml0ZXIud3JpdGVyb3coWydTcGFtJ10gKiA1ICsgWydCYWtlZCBCZWFucyddKQotICAgICAgPj4+IHNwYW1Xcml0ZXIud3JpdGVyb3coWydTcGFtJywgJ0xvdmVseSBTcGFtJywgJ1dvbmRlcmZ1bCBTcGFtJ10pCisgICAgICBpbXBvcnQgY3N2CisgICAgICB3aXRoIG9wZW4oJ2VnZ3MuY3N2JywgJ3diJykgYXMgY3N2ZmlsZToKKyAgICAgICAgICBzcGFtd3JpdGVyID0gY3N2LndyaXRlcihjc3ZmaWxlLCBkZWxpbWl0ZXI9JyAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlY2hhcj0nfCcsIHF1b3Rpbmc9Y3N2LlFVT1RFX01JTklNQUwpCisgICAgICAgICAgc3BhbXdyaXRlci53cml0ZXJvdyhbJ1NwYW0nXSAqIDUgKyBbJ0Jha2VkIEJlYW5zJ10pCisgICAgICAgICAgc3BhbXdyaXRlci53cml0ZXJvdyhbJ1NwYW0nLCAnTG92ZWx5IFNwYW0nLCAnV29uZGVyZnVsIFNwYW0nXSkKIAogCi0uLiBmdW5jdGlvbjo6IHJlZ2lzdGVyX2RpYWxlY3QobmFtZVssIGRpYWxlY3RdWywgZm10cGFyYW1dKQorLi4gZnVuY3Rpb246OiByZWdpc3Rlcl9kaWFsZWN0KG5hbWVbLCBkaWFsZWN0XSwgKipmbXRwYXJhbXMpCiAKICAgIEFzc29jaWF0ZSAqZGlhbGVjdCogd2l0aCAqbmFtZSouICAqbmFtZSogbXVzdCBiZSBhIHN0cmluZyBvciBVbmljb2RlIG9iamVjdC4gVGhlCiAgICBkaWFsZWN0IGNhbiBiZSBzcGVjaWZpZWQgZWl0aGVyIGJ5IHBhc3NpbmcgYSBzdWItY2xhc3Mgb2YgOmNsYXNzOmBEaWFsZWN0YCwgb3IKLSAgIGJ5ICpmbXRwYXJhbSoga2V5d29yZCBhcmd1bWVudHMsIG9yIGJvdGgsIHdpdGgga2V5d29yZCBhcmd1bWVudHMgb3ZlcnJpZGluZworICAgYnkgKmZtdHBhcmFtcyoga2V5d29yZCBhcmd1bWVudHMsIG9yIGJvdGgsIHdpdGgga2V5d29yZCBhcmd1bWVudHMgb3ZlcnJpZGluZwogICAgcGFyYW1ldGVycyBvZiB0aGUgZGlhbGVjdC4gRm9yIGZ1bGwgZGV0YWlscyBhYm91dCB0aGUgZGlhbGVjdCBhbmQgZm9ybWF0dGluZwogICAgcGFyYW1ldGVycywgc2VlIHNlY3Rpb24gOnJlZjpgY3N2LWZtdC1wYXJhbXNgLgogCkBAIC0xNjIsMzYgKzE2NCw0MyBAQAogVGhlIDptb2Q6YGNzdmAgbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBjbGFzc2VzOgogCiAKLS4uIGNsYXNzOjogRGljdFJlYWRlcihjc3ZmaWxlWywgZmllbGRuYW1lcz1Ob25lWywgcmVzdGtleT1Ob25lWywgcmVzdHZhbD1Ob25lWywgZGlhbGVjdD0nZXhjZWwnWywgKmFyZ3MsICoqa3dkc11dXV1dKQorLi4gY2xhc3M6OiBEaWN0UmVhZGVyKGNzdmZpbGUsIGZpZWxkbmFtZXM9Tm9uZSwgcmVzdGtleT1Ob25lLCByZXN0dmFsPU5vbmUsIFwKKyAgICAgICAgICAgICAgICAgICAgICBkaWFsZWN0PSdleGNlbCcsICphcmdzLCAqKmt3ZHMpCiAKLSAgIENyZWF0ZSBhbiBvYmplY3Qgd2hpY2ggb3BlcmF0ZXMgbGlrZSBhIHJlZ3VsYXIgcmVhZGVyIGJ1dCBtYXBzIHRoZSBpbmZvcm1hdGlvbgotICAgcmVhZCBpbnRvIGEgZGljdCB3aG9zZSBrZXlzIGFyZSBnaXZlbiBieSB0aGUgb3B0aW9uYWwgICpmaWVsZG5hbWVzKiBwYXJhbWV0ZXIuCi0gICBJZiB0aGUgKmZpZWxkbmFtZXMqIHBhcmFtZXRlciBpcyBvbWl0dGVkLCB0aGUgdmFsdWVzIGluIHRoZSBmaXJzdCByb3cgb2YgdGhlCi0gICAqY3N2ZmlsZSogd2lsbCBiZSB1c2VkIGFzIHRoZSBmaWVsZG5hbWVzLiAgSWYgdGhlIHJvdyByZWFkIGhhcyBtb3JlIGZpZWxkcwotICAgdGhhbiB0aGUgZmllbGRuYW1lcyBzZXF1ZW5jZSwgdGhlIHJlbWFpbmluZyBkYXRhIGlzIGFkZGVkIGFzIGEgc2VxdWVuY2UKLSAgIGtleWVkIGJ5IHRoZSB2YWx1ZSBvZiAqcmVzdGtleSouICBJZiB0aGUgcm93IHJlYWQgaGFzIGZld2VyIGZpZWxkcyB0aGFuIHRoZQotICAgZmllbGRuYW1lcyBzZXF1ZW5jZSwgdGhlIHJlbWFpbmluZyBrZXlzIHRha2UgdGhlIHZhbHVlIG9mIHRoZSBvcHRpb25hbAotICAgKnJlc3R2YWwqIHBhcmFtZXRlci4gIEFueSBvdGhlciBvcHRpb25hbCBvciBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvCi0gICB0aGUgdW5kZXJseWluZyA6Y2xhc3M6YHJlYWRlcmAgaW5zdGFuY2UuCisgICBDcmVhdGUgYW4gb2JqZWN0IHdoaWNoIG9wZXJhdGVzIGxpa2UgYSByZWd1bGFyIHJlYWRlciBidXQgbWFwcyB0aGUKKyAgIGluZm9ybWF0aW9uIHJlYWQgaW50byBhIGRpY3Qgd2hvc2Uga2V5cyBhcmUgZ2l2ZW4gYnkgdGhlIG9wdGlvbmFsCisgICAqZmllbGRuYW1lcyogcGFyYW1ldGVyLiAgVGhlICpmaWVsZG5hbWVzKiBwYXJhbWV0ZXIgaXMgYSA6cmVmOmBzZXF1ZW5jZQorICAgPGNvbGxlY3Rpb25zLWFic3RyYWN0LWJhc2UtY2xhc3Nlcz5gIHdob3NlIGVsZW1lbnRzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlCisgICBmaWVsZHMgb2YgdGhlIGlucHV0IGRhdGEgaW4gb3JkZXIuIFRoZXNlIGVsZW1lbnRzIGJlY29tZSB0aGUga2V5cyBvZiB0aGUKKyAgIHJlc3VsdGluZyBkaWN0aW9uYXJ5LiAgSWYgdGhlICpmaWVsZG5hbWVzKiBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgdGhlIHZhbHVlcworICAgaW4gdGhlIGZpcnN0IHJvdyBvZiB0aGUgKmNzdmZpbGUqIHdpbGwgYmUgdXNlZCBhcyB0aGUgZmllbGRuYW1lcy4gIElmIHRoZQorICAgcm93IHJlYWQgaGFzIG1vcmUgZmllbGRzIHRoYW4gdGhlIGZpZWxkbmFtZXMgc2VxdWVuY2UsIHRoZSByZW1haW5pbmcgZGF0YSBpcworICAgYWRkZWQgYXMgYSBzZXF1ZW5jZSBrZXllZCBieSB0aGUgdmFsdWUgb2YgKnJlc3RrZXkqLiAgSWYgdGhlIHJvdyByZWFkIGhhcworICAgZmV3ZXIgZmllbGRzIHRoYW4gdGhlIGZpZWxkbmFtZXMgc2VxdWVuY2UsIHRoZSByZW1haW5pbmcga2V5cyB0YWtlIHRoZSB2YWx1ZQorICAgb2YgdGhlIG9wdGlvbmFsICpyZXN0dmFsKiBwYXJhbWV0ZXIuICBBbnkgb3RoZXIgb3B0aW9uYWwgb3Iga2V5d29yZAorICAgYXJndW1lbnRzIGFyZSBwYXNzZWQgdG8gdGhlIHVuZGVybHlpbmcgOmNsYXNzOmByZWFkZXJgIGluc3RhbmNlLgogCiAKLS4uIGNsYXNzOjogRGljdFdyaXRlcihjc3ZmaWxlLCBmaWVsZG5hbWVzWywgcmVzdHZhbD0nJ1ssIGV4dHJhc2FjdGlvbj0ncmFpc2UnWywgZGlhbGVjdD0nZXhjZWwnWywgKmFyZ3MsICoqa3dkc11dXV0pCisuLiBjbGFzczo6IERpY3RXcml0ZXIoY3N2ZmlsZSwgZmllbGRuYW1lcywgcmVzdHZhbD0nJywgZXh0cmFzYWN0aW9uPSdyYWlzZScsIFwKKyAgICAgICAgICAgICAgICAgICAgICBkaWFsZWN0PSdleGNlbCcsICphcmdzLCAqKmt3ZHMpCiAKLSAgIENyZWF0ZSBhbiBvYmplY3Qgd2hpY2ggb3BlcmF0ZXMgbGlrZSBhIHJlZ3VsYXIgd3JpdGVyIGJ1dCBtYXBzIGRpY3Rpb25hcmllcyBvbnRvCi0gICBvdXRwdXQgcm93cy4gIFRoZSAqZmllbGRuYW1lcyogcGFyYW1ldGVyIGlkZW50aWZpZXMgdGhlIG9yZGVyIGluIHdoaWNoIHZhbHVlcyBpbgotICAgdGhlIGRpY3Rpb25hcnkgcGFzc2VkIHRvIHRoZSA6bWV0aDpgd3JpdGVyb3dgIG1ldGhvZCBhcmUgd3JpdHRlbiB0byB0aGUKLSAgICpjc3ZmaWxlKi4gIFRoZSBvcHRpb25hbCAqcmVzdHZhbCogcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgdmFsdWUgdG8gYmUgd3JpdHRlbgotICAgaWYgdGhlIGRpY3Rpb25hcnkgaXMgbWlzc2luZyBhIGtleSBpbiAqZmllbGRuYW1lcyouICBJZiB0aGUgZGljdGlvbmFyeSBwYXNzZWQgdG8KLSAgIHRoZSA6bWV0aDpgd3JpdGVyb3dgIG1ldGhvZCBjb250YWlucyBhIGtleSBub3QgZm91bmQgaW4gKmZpZWxkbmFtZXMqLCB0aGUKLSAgIG9wdGlvbmFsICpleHRyYXNhY3Rpb24qIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hhdCBhY3Rpb24gdG8gdGFrZS4gIElmIGl0IGlzIHNldAotICAgdG8gYGAncmFpc2UnYGAgYSA6ZXhjOmBWYWx1ZUVycm9yYCBpcyByYWlzZWQuICBJZiBpdCBpcyBzZXQgdG8gYGAnaWdub3JlJ2BgLAotICAgZXh0cmEgdmFsdWVzIGluIHRoZSBkaWN0aW9uYXJ5IGFyZSBpZ25vcmVkLiAgQW55IG90aGVyIG9wdGlvbmFsIG9yIGtleXdvcmQKLSAgIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIHRoZSB1bmRlcmx5aW5nIDpjbGFzczpgd3JpdGVyYCBpbnN0YW5jZS4KKyAgIENyZWF0ZSBhbiBvYmplY3Qgd2hpY2ggb3BlcmF0ZXMgbGlrZSBhIHJlZ3VsYXIgd3JpdGVyIGJ1dCBtYXBzIGRpY3Rpb25hcmllcworICAgb250byBvdXRwdXQgcm93cy4gIFRoZSAqZmllbGRuYW1lcyogcGFyYW1ldGVyIGlzIGEgOnJlZjpgc2VxdWVuY2UKKyAgIDxjb2xsZWN0aW9ucy1hYnN0cmFjdC1iYXNlLWNsYXNzZXM+YCBvZiBrZXlzIHRoYXQgaWRlbnRpZnkgdGhlIG9yZGVyIGluCisgICB3aGljaCB2YWx1ZXMgaW4gdGhlIGRpY3Rpb25hcnkgcGFzc2VkIHRvIHRoZSA6bWV0aDpgd3JpdGVyb3dgIG1ldGhvZCBhcmUKKyAgIHdyaXR0ZW4gdG8gdGhlICpjc3ZmaWxlKi4gIFRoZSBvcHRpb25hbCAqcmVzdHZhbCogcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUKKyAgIHZhbHVlIHRvIGJlIHdyaXR0ZW4gaWYgdGhlIGRpY3Rpb25hcnkgaXMgbWlzc2luZyBhIGtleSBpbiAqZmllbGRuYW1lcyouICBJZgorICAgdGhlIGRpY3Rpb25hcnkgcGFzc2VkIHRvIHRoZSA6bWV0aDpgd3JpdGVyb3dgIG1ldGhvZCBjb250YWlucyBhIGtleSBub3QKKyAgIGZvdW5kIGluICpmaWVsZG5hbWVzKiwgdGhlIG9wdGlvbmFsICpleHRyYXNhY3Rpb24qIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hhdAorICAgYWN0aW9uIHRvIHRha2UuICBJZiBpdCBpcyBzZXQgdG8gYGAncmFpc2UnYGAgYSA6ZXhjOmBWYWx1ZUVycm9yYCBpcyByYWlzZWQuCisgICBJZiBpdCBpcyBzZXQgdG8gYGAnaWdub3JlJ2BgLCBleHRyYSB2YWx1ZXMgaW4gdGhlIGRpY3Rpb25hcnkgYXJlIGlnbm9yZWQuCisgICBBbnkgb3RoZXIgb3B0aW9uYWwgb3Iga2V5d29yZCBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byB0aGUgdW5kZXJseWluZworICAgOmNsYXNzOmB3cml0ZXJgIGluc3RhbmNlLgogCi0gICBOb3RlIHRoYXQgdW5saWtlIHRoZSA6Y2xhc3M6YERpY3RSZWFkZXJgIGNsYXNzLCB0aGUgKmZpZWxkbmFtZXMqIHBhcmFtZXRlciBvZgotICAgdGhlIDpjbGFzczpgRGljdFdyaXRlcmAgaXMgbm90IG9wdGlvbmFsLiAgU2luY2UgUHl0aG9uJ3MgOmNsYXNzOmBkaWN0YCBvYmplY3RzCi0gICBhcmUgbm90IG9yZGVyZWQsIHRoZXJlIGlzIG5vdCBlbm91Z2ggaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvIGRlZHVjZSB0aGUgb3JkZXIKLSAgIGluIHdoaWNoIHRoZSByb3cgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gdGhlICpjc3ZmaWxlKi4KKyAgIE5vdGUgdGhhdCB1bmxpa2UgdGhlIDpjbGFzczpgRGljdFJlYWRlcmAgY2xhc3MsIHRoZSAqZmllbGRuYW1lcyogcGFyYW1ldGVyCisgICBvZiB0aGUgOmNsYXNzOmBEaWN0V3JpdGVyYCBpcyBub3Qgb3B0aW9uYWwuICBTaW5jZSBQeXRob24ncyA6Y2xhc3M6YGRpY3RgCisgICBvYmplY3RzIGFyZSBub3Qgb3JkZXJlZCwgdGhlcmUgaXMgbm90IGVub3VnaCBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gZGVkdWNlCisgICB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHJvdyBzaG91bGQgYmUgd3JpdHRlbiB0byB0aGUgKmNzdmZpbGUqLgogCiAKIC4uIGNsYXNzOjogRGlhbGVjdApAQCAtMjE5LDcgKzIyOCw3IEBACiAKICAgIFRoZSA6Y2xhc3M6YFNuaWZmZXJgIGNsYXNzIHByb3ZpZGVzIHR3byBtZXRob2RzOgogCi0gICAuLiBtZXRob2Q6OiBzbmlmZihzYW1wbGVbLCBkZWxpbWl0ZXJzPU5vbmVdKQorICAgLi4gbWV0aG9kOjogc25pZmYoc2FtcGxlLCBkZWxpbWl0ZXJzPU5vbmUpCiAKICAgICAgIEFuYWx5emUgdGhlIGdpdmVuICpzYW1wbGUqIGFuZCByZXR1cm4gYSA6Y2xhc3M6YERpYWxlY3RgIHN1YmNsYXNzCiAgICAgICByZWZsZWN0aW5nIHRoZSBwYXJhbWV0ZXJzIGZvdW5kLiAgSWYgdGhlIG9wdGlvbmFsICpkZWxpbWl0ZXJzKiBwYXJhbWV0ZXIKQEAgLTIzNCwxMSArMjQzLDExIEBACiAKIEFuIGV4YW1wbGUgZm9yIDpjbGFzczpgU25pZmZlcmAgdXNlOjoKIAotICAgY3N2ZmlsZSA9IG9wZW4oImV4YW1wbGUuY3N2IiwgInJiIikKLSAgIGRpYWxlY3QgPSBjc3YuU25pZmZlcigpLnNuaWZmKGNzdmZpbGUucmVhZCgxMDI0KSkKLSAgIGNzdmZpbGUuc2VlaygwKQotICAgcmVhZGVyID0gY3N2LnJlYWRlcihjc3ZmaWxlLCBkaWFsZWN0KQotICAgIyAuLi4gcHJvY2VzcyBDU1YgZmlsZSBjb250ZW50cyBoZXJlIC4uLgorICAgd2l0aCBvcGVuKCdleGFtcGxlLmNzdicsICdyYicpIGFzIGNzdmZpbGU6CisgICAgICAgZGlhbGVjdCA9IGNzdi5TbmlmZmVyKCkuc25pZmYoY3N2ZmlsZS5yZWFkKDEwMjQpKQorICAgICAgIGNzdmZpbGUuc2VlaygwKQorICAgICAgIHJlYWRlciA9IGNzdi5yZWFkZXIoY3N2ZmlsZSwgZGlhbGVjdCkKKyAgICAgICAjIC4uLiBwcm9jZXNzIENTViBmaWxlIGNvbnRlbnRzIGhlcmUgLi4uCiAKIAogVGhlIDptb2Q6YGNzdmAgbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBjb25zdGFudHM6CkBAIC0zNTMsNiArMzYyLDExIEBACiAgICBUaGUgZGVmYXVsdCBpcyA6Y29uc3Q6YEZhbHNlYC4KIAogCisuLiBhdHRyaWJ1dGU6OiBEaWFsZWN0LnN0cmljdAorCisgICBXaGVuIGBgVHJ1ZWBgLCByYWlzZSBleGNlcHRpb24gOmV4YzpgRXJyb3JgIG9uIGJhZCBDU1YgaW5wdXQuCisgICBUaGUgZGVmYXVsdCBpcyBgYEZhbHNlYGAuCisKIFJlYWRlciBPYmplY3RzCiAtLS0tLS0tLS0tLS0tLQogCkBAIC00NzgsNyArNDkyLDcgQEAKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZvciByb3cgaW4gcmVhZGVyOgogICAgICAgICAgICAgICAgcHJpbnQgcm93Ci0gICAgICAgZXhjZXB0IGNzdi5FcnJvciwgZToKKyAgICAgICBleGNlcHQgY3N2LkVycm9yIGFzIGU6CiAgICAgICAgICAgIHN5cy5leGl0KCdmaWxlICVzLCBsaW5lICVkOiAlcycgJSAoZmlsZW5hbWUsIHJlYWRlci5saW5lX251bSwgZSkpCiAKIEFuZCB3aGlsZSB0aGUgbW9kdWxlIGRvZXNuJ3QgZGlyZWN0bHkgc3VwcG9ydCBwYXJzaW5nIHN0cmluZ3MsIGl0IGNhbiBlYXNpbHkgYmUKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2N0eXBlcy5yc3QgYi9Eb2MvbGlicmFyeS9jdHlwZXMucnN0CmluZGV4IDFhM2UyZjUuLjMxZDViMzEgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2N0eXBlcy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvY3R5cGVzLnJzdApAQCAtNDAsNyArNDAsNyBAQAogbG9hZHMgbGlicmFyaWVzIHdoaWNoIGV4cG9ydCBmdW5jdGlvbnMgdXNpbmcgdGhlIHN0YW5kYXJkIGBgY2RlY2xgYCBjYWxsaW5nCiBjb252ZW50aW9uLCB3aGlsZSAqd2luZGxsKiBsaWJyYXJpZXMgY2FsbCBmdW5jdGlvbnMgdXNpbmcgdGhlIGBgc3RkY2FsbGBgCiBjYWxsaW5nIGNvbnZlbnRpb24uICpvbGVkbGwqIGFsc28gdXNlcyB0aGUgYGBzdGRjYWxsYGAgY2FsbGluZyBjb252ZW50aW9uLCBhbmQKLWFzc3VtZXMgdGhlIGZ1bmN0aW9ucyByZXR1cm4gYSBXaW5kb3dzIDpjdHlwZTpgSFJFU1VMVGAgZXJyb3IgY29kZS4gVGhlIGVycm9yCithc3N1bWVzIHRoZSBmdW5jdGlvbnMgcmV0dXJuIGEgV2luZG93cyA6Yzp0eXBlOmBIUkVTVUxUYCBlcnJvciBjb2RlLiBUaGUgZXJyb3IKIGNvZGUgaXMgdXNlZCB0byBhdXRvbWF0aWNhbGx5IHJhaXNlIGEgOmNsYXNzOmBXaW5kb3dzRXJyb3JgIGV4Y2VwdGlvbiB3aGVuIHRoZQogZnVuY3Rpb24gY2FsbCBmYWlscy4KIApAQCAtMjAxLDkgKzIwMSw5IEBACiBgYE5vbmVgYCwgaW50ZWdlcnMsIGxvbmdzLCBieXRlIHN0cmluZ3MgYW5kIHVuaWNvZGUgc3RyaW5ncyBhcmUgdGhlIG9ubHkgbmF0aXZlCiBQeXRob24gb2JqZWN0cyB0aGF0IGNhbiBkaXJlY3RseSBiZSB1c2VkIGFzIHBhcmFtZXRlcnMgaW4gdGhlc2UgZnVuY3Rpb24gY2FsbHMuCiBgYE5vbmVgYCBpcyBwYXNzZWQgYXMgYSBDIGBgTlVMTGBgIHBvaW50ZXIsIGJ5dGUgc3RyaW5ncyBhbmQgdW5pY29kZSBzdHJpbmdzIGFyZQotcGFzc2VkIGFzIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBibG9jayB0aGF0IGNvbnRhaW5zIHRoZWlyIGRhdGEgKDpjdHlwZTpgY2hhciAqYAotb3IgOmN0eXBlOmB3Y2hhcl90ICpgKS4gIFB5dGhvbiBpbnRlZ2VycyBhbmQgUHl0aG9uIGxvbmdzIGFyZSBwYXNzZWQgYXMgdGhlCi1wbGF0Zm9ybXMgZGVmYXVsdCBDIDpjdHlwZTpgaW50YCB0eXBlLCB0aGVpciB2YWx1ZSBpcyBtYXNrZWQgdG8gZml0IGludG8gdGhlIEMKK3Bhc3NlZCBhcyBwb2ludGVyIHRvIHRoZSBtZW1vcnkgYmxvY2sgdGhhdCBjb250YWlucyB0aGVpciBkYXRhICg6Yzp0eXBlOmBjaGFyICpgCitvciA6Yzp0eXBlOmB3Y2hhcl90ICpgKS4gIFB5dGhvbiBpbnRlZ2VycyBhbmQgUHl0aG9uIGxvbmdzIGFyZSBwYXNzZWQgYXMgdGhlCitwbGF0Zm9ybXMgZGVmYXVsdCBDIDpjOnR5cGU6YGludGAgdHlwZSwgdGhlaXIgdmFsdWUgaXMgbWFza2VkIHRvIGZpdCBpbnRvIHRoZSBDCiB0eXBlLgogCiBCZWZvcmUgd2UgbW92ZSBvbiBjYWxsaW5nIGZ1bmN0aW9ucyB3aXRoIG90aGVyIHBhcmFtZXRlciB0eXBlcywgd2UgaGF2ZSB0byBsZWFybgpAQCAtMjE1LDUwICsyMTUsNTAgQEAKIEZ1bmRhbWVudGFsIGRhdGEgdHlwZXMKIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KIAotOm1vZDpgY3R5cGVzYCBkZWZpbmVzIGEgbnVtYmVyIG9mIHByaW1pdGl2ZSBDIGNvbXBhdGlibGUgZGF0YSB0eXBlcyA6Cis6bW9kOmBjdHlwZXNgIGRlZmluZXMgYSBudW1iZXIgb2YgcHJpbWl0aXZlIEMgY29tcGF0aWJsZSBkYXRhIHR5cGVzOgogCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IGN0eXBlcyB0eXBlICAgICAgICAgIHwgQyB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQeXRob24gdHlwZSAgICAgICAgICAgICAgICB8Ci0rPT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCi18IDpjbGFzczpgY19ib29sYCAgICAgIHwgOmN0eXBlOmBfQm9vbGAgICAgICAgICAgICAgICAgICAgICAgICAgfCBib29sICgxKSAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IDpjbGFzczpgY19jaGFyYCAgICAgIHwgOmN0eXBlOmBjaGFyYCAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxLWNoYXJhY3RlciBzdHJpbmcgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IDpjbGFzczpgY193Y2hhcmAgICAgIHwgOmN0eXBlOmB3Y2hhcl90YCAgICAgICAgICAgICAgICAgICAgICAgfCAxLWNoYXJhY3RlciB1bmljb2RlIHN0cmluZyB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IDpjbGFzczpgY19ieXRlYCAgICAgIHwgOmN0eXBlOmBjaGFyYCAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbnQvbG9uZyAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IDpjbGFzczpgY191Ynl0ZWAgICAgIHwgOmN0eXBlOmB1bnNpZ25lZCBjaGFyYCAgICAgICAgICAgICAgICAgfCBpbnQvbG9uZyAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IDpjbGFzczpgY19zaG9ydGAgICAgIHwgOmN0eXBlOmBzaG9ydGAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbnQvbG9uZyAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IDpjbGFzczpgY191c2hvcnRgICAgIHwgOmN0eXBlOmB1bnNpZ25lZCBzaG9ydGAgICAgICAgICAgICAgICAgfCBpbnQvbG9uZyAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IDpjbGFzczpgY19pbnRgICAgICAgIHwgOmN0eXBlOmBpbnRgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbnQvbG9uZyAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IDpjbGFzczpgY191aW50YCAgICAgIHwgOmN0eXBlOmB1bnNpZ25lZCBpbnRgICAgICAgICAgICAgICAgICAgfCBpbnQvbG9uZyAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IDpjbGFzczpgY19sb25nYCAgICAgIHwgOmN0eXBlOmBsb25nYCAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbnQvbG9uZyAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IDpjbGFzczpgY191bG9uZ2AgICAgIHwgOmN0eXBlOmB1bnNpZ25lZCBsb25nYCAgICAgICAgICAgICAgICAgfCBpbnQvbG9uZyAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IDpjbGFzczpgY19sb25nbG9uZ2AgIHwgOmN0eXBlOmBfX2ludDY0YCBvciA6Y3R5cGU6YGxvbmcgbG9uZ2AgfCBpbnQvbG9uZyAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IDpjbGFzczpgY191bG9uZ2xvbmdgIHwgOmN0eXBlOmB1bnNpZ25lZCBfX2ludDY0YCBvciAgICAgICAgICAgfCBpbnQvbG9uZyAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgIHwgOmN0eXBlOmB1bnNpZ25lZCBsb25nIGxvbmdgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IDpjbGFzczpgY19mbG9hdGAgICAgIHwgOmN0eXBlOmBmbG9hdGAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdCAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IDpjbGFzczpgY19kb3VibGVgICAgIHwgOmN0eXBlOmBkb3VibGVgICAgICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdCAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IDpjbGFzczpgY19sb25nZG91YmxlYHwgOmN0eXBlOmBsb25nIGRvdWJsZWAgICAgICAgICAgICAgICAgICAgfCBmbG9hdCAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IDpjbGFzczpgY19jaGFyX3BgICAgIHwgOmN0eXBlOmBjaGFyICpgIChOVUwgdGVybWluYXRlZCkgICAgICAgfCBzdHJpbmcgb3IgYGBOb25lYGAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IDpjbGFzczpgY193Y2hhcl9wYCAgIHwgOmN0eXBlOmB3Y2hhcl90ICpgIChOVUwgdGVybWluYXRlZCkgICAgfCB1bmljb2RlIG9yIGBgTm9uZWBgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IDpjbGFzczpgY192b2lkX3BgICAgIHwgOmN0eXBlOmB2b2lkICpgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbnQvbG9uZyBvciBgYE5vbmVgYCAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgY3R5cGVzIHR5cGUgICAgICAgICAgfCBDIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUHl0aG9uIHR5cGUgICAgICAgICAgICAgICAgfAorKz09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCit8IDpjbGFzczpgY19ib29sYCAgICAgIHwgOmM6dHlwZTpgX0Jvb2xgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJvb2wgKDEpICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfCA6Y2xhc3M6YGNfY2hhcmAgICAgICB8IDpjOnR5cGU6YGNoYXJgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxLWNoYXJhY3RlciBzdHJpbmcgICAgICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgOmNsYXNzOmBjX3djaGFyYCAgICAgfCA6Yzp0eXBlOmB3Y2hhcl90YCAgICAgICAgICAgICAgICAgICAgICAgIHwgMS1jaGFyYWN0ZXIgdW5pY29kZSBzdHJpbmcgfAorKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8IDpjbGFzczpgY19ieXRlYCAgICAgIHwgOmM6dHlwZTpgY2hhcmAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGludC9sb25nICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfCA6Y2xhc3M6YGNfdWJ5dGVgICAgICB8IDpjOnR5cGU6YHVuc2lnbmVkIGNoYXJgICAgICAgICAgICAgICAgICAgfCBpbnQvbG9uZyAgICAgICAgICAgICAgICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgOmNsYXNzOmBjX3Nob3J0YCAgICAgfCA6Yzp0eXBlOmBzaG9ydGAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW50L2xvbmcgICAgICAgICAgICAgICAgICAgfAorKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8IDpjbGFzczpgY191c2hvcnRgICAgIHwgOmM6dHlwZTpgdW5zaWduZWQgc2hvcnRgICAgICAgICAgICAgICAgICB8IGludC9sb25nICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfCA6Y2xhc3M6YGNfaW50YCAgICAgICB8IDpjOnR5cGU6YGludGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbnQvbG9uZyAgICAgICAgICAgICAgICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgOmNsYXNzOmBjX3VpbnRgICAgICAgfCA6Yzp0eXBlOmB1bnNpZ25lZCBpbnRgICAgICAgICAgICAgICAgICAgIHwgaW50L2xvbmcgICAgICAgICAgICAgICAgICAgfAorKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8IDpjbGFzczpgY19sb25nYCAgICAgIHwgOmM6dHlwZTpgbG9uZ2AgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGludC9sb25nICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfCA6Y2xhc3M6YGNfdWxvbmdgICAgICB8IDpjOnR5cGU6YHVuc2lnbmVkIGxvbmdgICAgICAgICAgICAgICAgICAgfCBpbnQvbG9uZyAgICAgICAgICAgICAgICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgOmNsYXNzOmBjX2xvbmdsb25nYCAgfCA6Yzp0eXBlOmBfX2ludDY0YCBvciA6Yzp0eXBlOmBsb25nIGxvbmdgIHwgaW50L2xvbmcgICAgICAgICAgICAgICAgICAgfAorKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8IDpjbGFzczpgY191bG9uZ2xvbmdgIHwgOmM6dHlwZTpgdW5zaWduZWQgX19pbnQ2NGAgb3IgICAgICAgICAgICB8IGludC9sb25nICAgICAgICAgICAgICAgICAgIHwKK3wgICAgICAgICAgICAgICAgICAgICAgfCA6Yzp0eXBlOmB1bnNpZ25lZCBsb25nIGxvbmdgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8IDpjbGFzczpgY19mbG9hdGAgICAgIHwgOmM6dHlwZTpgZmxvYXRgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0ICAgICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfCA6Y2xhc3M6YGNfZG91YmxlYCAgICB8IDpjOnR5cGU6YGRvdWJsZWAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdCAgICAgICAgICAgICAgICAgICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgOmNsYXNzOmBjX2xvbmdkb3VibGVgfCA6Yzp0eXBlOmBsb25nIGRvdWJsZWAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgfAorKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8IDpjbGFzczpgY19jaGFyX3BgICAgIHwgOmM6dHlwZTpgY2hhciAqYCAoTlVMIHRlcm1pbmF0ZWQpICAgICAgICB8IHN0cmluZyBvciBgYE5vbmVgYCAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfCA6Y2xhc3M6YGNfd2NoYXJfcGAgICB8IDpjOnR5cGU6YHdjaGFyX3QgKmAgKE5VTCB0ZXJtaW5hdGVkKSAgICAgfCB1bmljb2RlIG9yIGBgTm9uZWBgICAgICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgOmNsYXNzOmBjX3ZvaWRfcGAgICAgfCA6Yzp0eXBlOmB2b2lkICpgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW50L2xvbmcgb3IgYGBOb25lYGAgICAgICAgfAorKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAKICgxKQogICAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW55IG9iamVjdCB3aXRoIGEgdHJ1dGggdmFsdWUuCkBAIC0zMjksNyArMzI5LDcgQEAKIFRoZSA6ZnVuYzpgY3JlYXRlX3N0cmluZ19idWZmZXJgIGZ1bmN0aW9uIHJlcGxhY2VzIHRoZSA6ZnVuYzpgY19idWZmZXJgIGZ1bmN0aW9uCiAod2hpY2ggaXMgc3RpbGwgYXZhaWxhYmxlIGFzIGFuIGFsaWFzKSwgYXMgd2VsbCBhcyB0aGUgOmZ1bmM6YGNfc3RyaW5nYCBmdW5jdGlvbgogZnJvbSBlYXJsaWVyIGN0eXBlcyByZWxlYXNlcy4gIFRvIGNyZWF0ZSBhIG11dGFibGUgbWVtb3J5IGJsb2NrIGNvbnRhaW5pbmcKLXVuaWNvZGUgY2hhcmFjdGVycyBvZiB0aGUgQyB0eXBlIDpjdHlwZTpgd2NoYXJfdGAgdXNlIHRoZQordW5pY29kZSBjaGFyYWN0ZXJzIG9mIHRoZSBDIHR5cGUgOmM6dHlwZTpgd2NoYXJfdGAgdXNlIHRoZQogOmZ1bmM6YGNyZWF0ZV91bmljb2RlX2J1ZmZlcmAgZnVuY3Rpb24uCiAKIApAQCAtNDQwLDcgKzQ0MCw3IEBACiBSZXR1cm4gdHlwZXMKIF5eXl5eXl5eXl5eXgogCi1CeSBkZWZhdWx0IGZ1bmN0aW9ucyBhcmUgYXNzdW1lZCB0byByZXR1cm4gdGhlIEMgOmN0eXBlOmBpbnRgIHR5cGUuICBPdGhlcgorQnkgZGVmYXVsdCBmdW5jdGlvbnMgYXJlIGFzc3VtZWQgdG8gcmV0dXJuIHRoZSBDIDpjOnR5cGU6YGludGAgdHlwZS4gIE90aGVyCiByZXR1cm4gdHlwZXMgY2FuIGJlIHNwZWNpZmllZCBieSBzZXR0aW5nIHRoZSA6YXR0cjpgcmVzdHlwZWAgYXR0cmlidXRlIG9mIHRoZQogZnVuY3Rpb24gb2JqZWN0LgogCkBAIC01NjgsOCArNTY4LDggQEAKICAgIFZhbHVlRXJyb3I6IHRvbyBtYW55IGluaXRpYWxpemVycwogICAgPj4+CiAKLVlvdSBjYW4sIGhvd2V2ZXIsIGJ1aWxkIG11Y2ggbW9yZSBjb21wbGljYXRlZCBzdHJ1Y3R1cmVzLiBTdHJ1Y3R1cmVzIGNhbiBpdHNlbGYKLWNvbnRhaW4gb3RoZXIgc3RydWN0dXJlcyBieSB1c2luZyBhIHN0cnVjdHVyZSBhcyBhIGZpZWxkIHR5cGUuCitZb3UgY2FuLCBob3dldmVyLCBidWlsZCBtdWNoIG1vcmUgY29tcGxpY2F0ZWQgc3RydWN0dXJlcy4gIEEgc3RydWN0dXJlIGNhbgoraXRzZWxmIGNvbnRhaW4gb3RoZXIgc3RydWN0dXJlcyBieSB1c2luZyBhIHN0cnVjdHVyZSBhcyBhIGZpZWxkIHR5cGUuCiAKIEhlcmUgaXMgYSBSRUNUIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyB0d28gUE9JTlRzIG5hbWVkICp1cHBlcmxlZnQqIGFuZAogKmxvd2VycmlnaHQqOjoKQEAgLTYwMiw2ICs2MDIsMTMgQEAKIAogLi4gX2N0eXBlcy1zdHJ1Y3R1cmV1bmlvbi1hbGlnbm1lbnQtYnl0ZS1vcmRlcjoKIAorLi4gd2FybmluZzo6CisKKyAgIDptb2Q6YGN0eXBlc2AgZG9lcyBub3Qgc3VwcG9ydCBwYXNzaW5nIHVuaW9ucyBvciBzdHJ1Y3R1cmVzIHdpdGggYml0LWZpZWxkcworICAgdG8gZnVuY3Rpb25zIGJ5IHZhbHVlLiAgV2hpbGUgdGhpcyBtYXkgd29yayBvbiAzMi1iaXQgeDg2LCBpdCdzIG5vdAorICAgZ3VhcmFudGVlZCBieSB0aGUgbGlicmFyeSB0byB3b3JrIGluIHRoZSBnZW5lcmFsIGNhc2UuICBVbmlvbnMgYW5kCisgICBzdHJ1Y3R1cmVzIHdpdGggYml0LWZpZWxkcyBzaG91bGQgYWx3YXlzIGJlIHBhc3NlZCB0byBmdW5jdGlvbnMgYnkgcG9pbnRlci4KKwogU3RydWN0dXJlL3VuaW9uIGFsaWdubWVudCBhbmQgYnl0ZSBvcmRlcgogXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgogCkBAIC04MTYsNiArODIzLDExIEBACiAgICAzCiAgICA+Pj4KIAorSW4gYWRkaXRpb24sIGlmIGEgZnVuY3Rpb24gYXJndW1lbnQgaXMgZXhwbGljaXRseSBkZWNsYXJlZCB0byBiZSBhIHBvaW50ZXIgdHlwZQorKHN1Y2ggYXMgYGBQT0lOVEVSKGNfaW50KWBgKSBpbiA6YXR0cjpgYXJndHlwZXNgLCBhbiBvYmplY3Qgb2YgdGhlIHBvaW50ZWQKK3R5cGUgKGBgY19pbnRgYCBpbiB0aGlzIGNhc2UpIGNhbiBiZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLiAgY3R5cGVzIHdpbGwgYXBwbHkKK3RoZSByZXF1aXJlZCA6ZnVuYzpgYnlyZWZgIGNvbnZlcnNpb24gaW4gdGhpcyBjYXNlIGF1dG9tYXRpY2FsbHkuCisKIFRvIHNldCBhIFBPSU5URVIgdHlwZSBmaWVsZCB0byBgYE5VTExgYCwgeW91IGNhbiBhc3NpZ24gYGBOb25lYGA6OgogCiAgICA+Pj4gYmFyLnZhbHVlcyA9IE5vbmUKQEAgLTEwNjgsMTIgKzEwODAsMTggQEAKICAgIDEgNSA3IDMzIDk5CiAgICA+Pj4KIAotKipJbXBvcnRhbnQgbm90ZSBmb3IgY2FsbGJhY2sgZnVuY3Rpb25zOioqCisuLiBub3RlOjoKIAotTWFrZSBzdXJlIHlvdSBrZWVwIHJlZmVyZW5jZXMgdG8gQ0ZVTkNUWVBFIG9iamVjdHMgYXMgbG9uZyBhcyB0aGV5IGFyZSB1c2VkIGZyb20KLUMgY29kZS4gOm1vZDpgY3R5cGVzYCBkb2Vzbid0LCBhbmQgaWYgeW91IGRvbid0LCB0aGV5IG1heSBiZSBnYXJiYWdlIGNvbGxlY3RlZCwKLWNyYXNoaW5nIHlvdXIgcHJvZ3JhbSB3aGVuIGEgY2FsbGJhY2sgaXMgbWFkZS4KKyAgIE1ha2Ugc3VyZSB5b3Uga2VlcCByZWZlcmVuY2VzIHRvIDpmdW5jOmBDRlVOQ1RZUEVgIG9iamVjdHMgYXMgbG9uZyBhcyB0aGV5CisgICBhcmUgdXNlZCBmcm9tIEMgY29kZS4gOm1vZDpgY3R5cGVzYCBkb2Vzbid0LCBhbmQgaWYgeW91IGRvbid0LCB0aGV5IG1heSBiZQorICAgZ2FyYmFnZSBjb2xsZWN0ZWQsIGNyYXNoaW5nIHlvdXIgcHJvZ3JhbSB3aGVuIGEgY2FsbGJhY2sgaXMgbWFkZS4KIAorICAgQWxzbywgbm90ZSB0aGF0IGlmIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gYSB0aHJlYWQgY3JlYXRlZAorICAgb3V0c2lkZSBvZiBQeXRob24ncyBjb250cm9sIChlLmcuIGJ5IHRoZSBmb3JlaWduIGNvZGUgdGhhdCBjYWxscyB0aGUKKyAgIGNhbGxiYWNrKSwgY3R5cGVzIGNyZWF0ZXMgYSBuZXcgZHVtbXkgUHl0aG9uIHRocmVhZCBvbiBldmVyeSBpbnZvY2F0aW9uLiBUaGlzCisgICBiZWhhdmlvciBpcyBjb3JyZWN0IGZvciBtb3N0IHB1cnBvc2VzLCBidXQgaXQgbWVhbnMgdGhhdCB2YWx1ZXMgc3RvcmVkIHdpdGgKKyAgIGB0aHJlYWRpbmcubG9jYWxgIHdpbGwgKm5vdCogc3Vydml2ZSBhY3Jvc3MgZGlmZmVyZW50IGNhbGxiYWNrcywgZXZlbiB3aGVuCisgICB0aG9zZSBjYWxscyBhcmUgbWFkZSBmcm9tIHRoZSBzYW1lIEMgdGhyZWFkLgogCiAuLiBfY3R5cGVzLWFjY2Vzc2luZy12YWx1ZXMtZXhwb3J0ZWQtZnJvbS1kbGxzOgogCkBAIC0xMTUzLDggKzExNzEsOCBAQAogU3VycHJpc2VzCiBeXl5eXl5eXl4KIAotVGhlcmUgYXJlIHNvbWUgZWRnZXMgaW4gOm1vZDpgY3R5cGVzYCB3aGVyZSB5b3UgbWF5IGJlIGV4cGVjdCBzb21ldGhpbmcgZWxzZSB0aGFuCi13aGF0IGFjdHVhbGx5IGhhcHBlbnMuCitUaGVyZSBhcmUgc29tZSBlZGdlIGNhc2VzIGluIDptb2Q6YGN0eXBlc2Agd2hlcmUgeW91IG1pZ2h0IGV4cGVjdCBzb21ldGhpbmcKK290aGVyIHRoYW4gd2hhdCBhY3R1YWxseSBoYXBwZW5zLgogCiBDb25zaWRlciB0aGUgZm9sbG93aW5nIGV4YW1wbGU6OgogCkBAIC0xMzIxLDcgKzEzMzksNyBAQAogbGlrZSBgYGZpbmRfbGlicmFyeSgiYyIpYGAgd2lsbCBmYWlsIGFuZCByZXR1cm4gYGBOb25lYGAuCiAKIElmIHdyYXBwaW5nIGEgc2hhcmVkIGxpYnJhcnkgd2l0aCA6bW9kOmBjdHlwZXNgLCBpdCAqbWF5KiBiZSBiZXR0ZXIgdG8gZGV0ZXJtaW5lCi10aGUgc2hhcmVkIGxpYnJhcnkgbmFtZSBhdCBkZXZlbG9wbWVudCB0eXBlLCBhbmQgaGFyZGNvZGUgdGhhdCBpbnRvIHRoZSB3cmFwcGVyCit0aGUgc2hhcmVkIGxpYnJhcnkgbmFtZSBhdCBkZXZlbG9wbWVudCB0aW1lLCBhbmQgaGFyZGNvZGUgdGhhdCBpbnRvIHRoZSB3cmFwcGVyCiBtb2R1bGUgaW5zdGVhZCBvZiB1c2luZyA6ZnVuYzpgZmluZF9saWJyYXJ5YCB0byBsb2NhdGUgdGhlIGxpYnJhcnkgYXQgcnVudGltZS4KIAogCkBAIC0xMzM4LDcgKzEzNTYsNyBAQAogCiAgICBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgbG9hZGVkIHNoYXJlZCBsaWJyYXJpZXMuIEZ1bmN0aW9ucyBpbiB0aGVzZQogICAgbGlicmFyaWVzIHVzZSB0aGUgc3RhbmRhcmQgQyBjYWxsaW5nIGNvbnZlbnRpb24sIGFuZCBhcmUgYXNzdW1lZCB0byByZXR1cm4KLSAgIDpjdHlwZTpgaW50YC4KKyAgIDpjOnR5cGU6YGludGAuCiAKIAogLi4gY2xhc3M6OiBPbGVETEwobmFtZSwgbW9kZT1ERUZBVUxUX01PREUsIGhhbmRsZT1Ob25lLCB1c2VfZXJybm89RmFsc2UsIHVzZV9sYXN0X2Vycm9yPUZhbHNlKQpAQCAtMTM1NSw3ICsxMzczLDcgQEAKIAogICAgV2luZG93cyBvbmx5OiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgbG9hZGVkIHNoYXJlZCBsaWJyYXJpZXMsCiAgICBmdW5jdGlvbnMgaW4gdGhlc2UgbGlicmFyaWVzIHVzZSB0aGUgYGBzdGRjYWxsYGAgY2FsbGluZyBjb252ZW50aW9uLCBhbmQgYXJlCi0gICBhc3N1bWVkIHRvIHJldHVybiA6Y3R5cGU6YGludGAgYnkgZGVmYXVsdC4KKyAgIGFzc3VtZWQgdG8gcmV0dXJuIDpjOnR5cGU6YGludGAgYnkgZGVmYXVsdC4KIAogICAgT24gV2luZG93cyBDRSBvbmx5IHRoZSBzdGFuZGFyZCBjYWxsaW5nIGNvbnZlbnRpb24gaXMgdXNlZCwgZm9yIGNvbnZlbmllbmNlIHRoZQogICAgOmNsYXNzOmBXaW5ETExgIGFuZCA6Y2xhc3M6YE9sZURMTGAgdXNlIHRoZSBzdGFuZGFyZCBjYWxsaW5nIGNvbnZlbnRpb24gb24gdGhpcwpAQCAtMTUwMCw3ICsxNTE4LDcgQEAKIAogICAgQW4gaW5zdGFuY2Ugb2YgOmNsYXNzOmBQeURMTGAgdGhhdCBleHBvc2VzIFB5dGhvbiBDIEFQSSBmdW5jdGlvbnMgYXMKICAgIGF0dHJpYnV0ZXMuICBOb3RlIHRoYXQgYWxsIHRoZXNlIGZ1bmN0aW9ucyBhcmUgYXNzdW1lZCB0byByZXR1cm4gQwotICAgOmN0eXBlOmBpbnRgLCB3aGljaCBpcyBvZiBjb3Vyc2Ugbm90IGFsd2F5cyB0aGUgdHJ1dGgsIHNvIHlvdSBoYXZlIHRvIGFzc2lnbgorICAgOmM6dHlwZTpgaW50YCwgd2hpY2ggaXMgb2YgY291cnNlIG5vdCBhbHdheXMgdGhlIHRydXRoLCBzbyB5b3UgaGF2ZSB0byBhc3NpZ24KICAgIHRoZSBjb3JyZWN0IDphdHRyOmByZXN0eXBlYCBhdHRyaWJ1dGUgdG8gdXNlIHRoZXNlIGZ1bmN0aW9ucy4KIAogCkBAIC0xNTMwLDEwICsxNTQ4LDEwIEBACiAgICAuLiBhdHRyaWJ1dGU6OiByZXN0eXBlCiAKICAgICAgIEFzc2lnbiBhIGN0eXBlcyB0eXBlIHRvIHNwZWNpZnkgdGhlIHJlc3VsdCB0eXBlIG9mIHRoZSBmb3JlaWduIGZ1bmN0aW9uLgotICAgICAgVXNlIGBgTm9uZWBgIGZvciA6Y3R5cGU6YHZvaWRgLCBhIGZ1bmN0aW9uIG5vdCByZXR1cm5pbmcgYW55dGhpbmcuCisgICAgICBVc2UgYGBOb25lYGAgZm9yIDpjOnR5cGU6YHZvaWRgLCBhIGZ1bmN0aW9uIG5vdCByZXR1cm5pbmcgYW55dGhpbmcuCiAKICAgICAgIEl0IGlzIHBvc3NpYmxlIHRvIGFzc2lnbiBhIGNhbGxhYmxlIFB5dGhvbiBvYmplY3QgdGhhdCBpcyBub3QgYSBjdHlwZXMKLSAgICAgIHR5cGUsIGluIHRoaXMgY2FzZSB0aGUgZnVuY3Rpb24gaXMgYXNzdW1lZCB0byByZXR1cm4gYSBDIDpjdHlwZTpgaW50YCwgYW5kCisgICAgICB0eXBlLCBpbiB0aGlzIGNhc2UgdGhlIGZ1bmN0aW9uIGlzIGFzc3VtZWQgdG8gcmV0dXJuIGEgQyA6Yzp0eXBlOmBpbnRgLCBhbmQKICAgICAgIHRoZSBjYWxsYWJsZSB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoaXMgaW50ZWdlciwgYWxsb3dpbmcgdG8gZG8gZnVydGhlcgogICAgICAgcHJvY2Vzc2luZyBvciBlcnJvciBjaGVja2luZy4gIFVzaW5nIHRoaXMgaXMgZGVwcmVjYXRlZCwgZm9yIG1vcmUgZmxleGlibGUKICAgICAgIHBvc3QgcHJvY2Vzc2luZyBvciBlcnJvciBjaGVja2luZyB1c2UgYSBjdHlwZXMgZGF0YSB0eXBlIGFzCkBAIC0xNzAyLDcgKzE3MjAsNyBAQAogCiAgICBXSU5VU0VSQVBJIGludCBXSU5BUEkKICAgIE1lc3NhZ2VCb3hBKAotICAgICAgIEhXTkQgaFduZCAsCisgICAgICAgSFdORCBoV25kLAogICAgICAgIExQQ1NUUiBscFRleHQsCiAgICAgICAgTFBDU1RSIGxwQ2FwdGlvbiwKICAgICAgICBVSU5UIHVUeXBlKTsKQEAgLTE5OTQsOCArMjAxMiw4IEBACiAKIC4uIGZ1bmN0aW9uOjogc2l6ZW9mKG9ial9vcl90eXBlKQogCi0gICBSZXR1cm5zIHRoZSBzaXplIGluIGJ5dGVzIG9mIGEgY3R5cGVzIHR5cGUgb3IgaW5zdGFuY2UgbWVtb3J5IGJ1ZmZlci4gRG9lcyB0aGUKLSAgIHNhbWUgYXMgdGhlIEMgYGBzaXplb2YoKWBgIGZ1bmN0aW9uLgorICAgUmV0dXJucyB0aGUgc2l6ZSBpbiBieXRlcyBvZiBhIGN0eXBlcyB0eXBlIG9yIGluc3RhbmNlIG1lbW9yeSBidWZmZXIuCisgICBEb2VzIHRoZSBzYW1lIGFzIHRoZSBDIGBgc2l6ZW9mYGAgb3BlcmF0b3IuCiAKIAogLi4gZnVuY3Rpb246OiBzdHJpbmdfYXQoYWRkcmVzc1ssIHNpemVdKQpAQCAtMjE1OSwyMSArMjE3NywyMSBAQAogCiAuLiBjbGFzczo6IGNfYnl0ZQogCi0gICBSZXByZXNlbnRzIHRoZSBDIDpjdHlwZTpgc2lnbmVkIGNoYXJgIGRhdGF0eXBlLCBhbmQgaW50ZXJwcmV0cyB0aGUgdmFsdWUgYXMKKyAgIFJlcHJlc2VudHMgdGhlIEMgOmM6dHlwZTpgc2lnbmVkIGNoYXJgIGRhdGF0eXBlLCBhbmQgaW50ZXJwcmV0cyB0aGUgdmFsdWUgYXMKICAgIHNtYWxsIGludGVnZXIuICBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyBhbiBvcHRpb25hbCBpbnRlZ2VyIGluaXRpYWxpemVyOyBubwogICAgb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4KIAogCiAuLiBjbGFzczo6IGNfY2hhcgogCi0gICBSZXByZXNlbnRzIHRoZSBDIDpjdHlwZTpgY2hhcmAgZGF0YXR5cGUsIGFuZCBpbnRlcnByZXRzIHRoZSB2YWx1ZSBhcyBhIHNpbmdsZQorICAgUmVwcmVzZW50cyB0aGUgQyA6Yzp0eXBlOmBjaGFyYCBkYXRhdHlwZSwgYW5kIGludGVycHJldHMgdGhlIHZhbHVlIGFzIGEgc2luZ2xlCiAgICBjaGFyYWN0ZXIuICBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyBhbiBvcHRpb25hbCBzdHJpbmcgaW5pdGlhbGl6ZXIsIHRoZQogICAgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgbXVzdCBiZSBleGFjdGx5IG9uZSBjaGFyYWN0ZXIuCiAKIAogLi4gY2xhc3M6OiBjX2NoYXJfcAogCi0gICBSZXByZXNlbnRzIHRoZSBDIDpjdHlwZTpgY2hhciAqYCBkYXRhdHlwZSB3aGVuIGl0IHBvaW50cyB0byBhIHplcm8tdGVybWluYXRlZAorICAgUmVwcmVzZW50cyB0aGUgQyA6Yzp0eXBlOmBjaGFyICpgIGRhdGF0eXBlIHdoZW4gaXQgcG9pbnRzIHRvIGEgemVyby10ZXJtaW5hdGVkCiAgICBzdHJpbmcuICBGb3IgYSBnZW5lcmFsIGNoYXJhY3RlciBwb2ludGVyIHRoYXQgbWF5IGFsc28gcG9pbnQgdG8gYmluYXJ5IGRhdGEsCiAgICBgYFBPSU5URVIoY19jaGFyKWBgIG11c3QgYmUgdXNlZC4gIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGFuIGludGVnZXIKICAgIGFkZHJlc3MsIG9yIGEgc3RyaW5nLgpAQCAtMjE4MSwxMyArMjE5OSwxMyBAQAogCiAuLiBjbGFzczo6IGNfZG91YmxlCiAKLSAgIFJlcHJlc2VudHMgdGhlIEMgOmN0eXBlOmBkb3VibGVgIGRhdGF0eXBlLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KKyAgIFJlcHJlc2VudHMgdGhlIEMgOmM6dHlwZTpgZG91YmxlYCBkYXRhdHlwZS4gIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGFuCiAgICBvcHRpb25hbCBmbG9hdCBpbml0aWFsaXplci4KIAogCiAuLiBjbGFzczo6IGNfbG9uZ2RvdWJsZQogCi0gICBSZXByZXNlbnRzIHRoZSBDIDpjdHlwZTpgbG9uZyBkb3VibGVgIGRhdGF0eXBlLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KKyAgIFJlcHJlc2VudHMgdGhlIEMgOmM6dHlwZTpgbG9uZyBkb3VibGVgIGRhdGF0eXBlLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KICAgIG9wdGlvbmFsIGZsb2F0IGluaXRpYWxpemVyLiAgT24gcGxhdGZvcm1zIHdoZXJlIGBgc2l6ZW9mKGxvbmcgZG91YmxlKSA9PQogICAgc2l6ZW9mKGRvdWJsZSlgYCBpdCBpcyBhbiBhbGlhcyB0byA6Y2xhc3M6YGNfZG91YmxlYC4KIApAQCAtMjE5NSwxNTEgKzIyMTMsMTUxIEBACiAKIC4uIGNsYXNzOjogY19mbG9hdAogCi0gICBSZXByZXNlbnRzIHRoZSBDIDpjdHlwZTpgZmxvYXRgIGRhdGF0eXBlLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KKyAgIFJlcHJlc2VudHMgdGhlIEMgOmM6dHlwZTpgZmxvYXRgIGRhdGF0eXBlLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KICAgIG9wdGlvbmFsIGZsb2F0IGluaXRpYWxpemVyLgogCiAKIC4uIGNsYXNzOjogY19pbnQKIAotICAgUmVwcmVzZW50cyB0aGUgQyA6Y3R5cGU6YHNpZ25lZCBpbnRgIGRhdGF0eXBlLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KKyAgIFJlcHJlc2VudHMgdGhlIEMgOmM6dHlwZTpgc2lnbmVkIGludGAgZGF0YXR5cGUuICBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyBhbgogICAgb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4gIE9uIHBsYXRmb3JtcwogICAgd2hlcmUgYGBzaXplb2YoaW50KSA9PSBzaXplb2YobG9uZylgYCBpdCBpcyBhbiBhbGlhcyB0byA6Y2xhc3M6YGNfbG9uZ2AuCiAKIAogLi4gY2xhc3M6OiBjX2ludDgKIAotICAgUmVwcmVzZW50cyB0aGUgQyA4LWJpdCA6Y3R5cGU6YHNpZ25lZCBpbnRgIGRhdGF0eXBlLiAgVXN1YWxseSBhbiBhbGlhcyBmb3IKKyAgIFJlcHJlc2VudHMgdGhlIEMgOC1iaXQgOmM6dHlwZTpgc2lnbmVkIGludGAgZGF0YXR5cGUuICBVc3VhbGx5IGFuIGFsaWFzIGZvcgogICAgOmNsYXNzOmBjX2J5dGVgLgogCiAKIC4uIGNsYXNzOjogY19pbnQxNgogCi0gICBSZXByZXNlbnRzIHRoZSBDIDE2LWJpdCA6Y3R5cGU6YHNpZ25lZCBpbnRgIGRhdGF0eXBlLiAgVXN1YWxseSBhbiBhbGlhcyBmb3IKKyAgIFJlcHJlc2VudHMgdGhlIEMgMTYtYml0IDpjOnR5cGU6YHNpZ25lZCBpbnRgIGRhdGF0eXBlLiAgVXN1YWxseSBhbiBhbGlhcyBmb3IKICAgIDpjbGFzczpgY19zaG9ydGAuCiAKIAogLi4gY2xhc3M6OiBjX2ludDMyCiAKLSAgIFJlcHJlc2VudHMgdGhlIEMgMzItYml0IDpjdHlwZTpgc2lnbmVkIGludGAgZGF0YXR5cGUuICBVc3VhbGx5IGFuIGFsaWFzIGZvcgorICAgUmVwcmVzZW50cyB0aGUgQyAzMi1iaXQgOmM6dHlwZTpgc2lnbmVkIGludGAgZGF0YXR5cGUuICBVc3VhbGx5IGFuIGFsaWFzIGZvcgogICAgOmNsYXNzOmBjX2ludGAuCiAKIAogLi4gY2xhc3M6OiBjX2ludDY0CiAKLSAgIFJlcHJlc2VudHMgdGhlIEMgNjQtYml0IDpjdHlwZTpgc2lnbmVkIGludGAgZGF0YXR5cGUuICBVc3VhbGx5IGFuIGFsaWFzIGZvcgorICAgUmVwcmVzZW50cyB0aGUgQyA2NC1iaXQgOmM6dHlwZTpgc2lnbmVkIGludGAgZGF0YXR5cGUuICBVc3VhbGx5IGFuIGFsaWFzIGZvcgogICAgOmNsYXNzOmBjX2xvbmdsb25nYC4KIAogCiAuLiBjbGFzczo6IGNfbG9uZwogCi0gICBSZXByZXNlbnRzIHRoZSBDIDpjdHlwZTpgc2lnbmVkIGxvbmdgIGRhdGF0eXBlLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KKyAgIFJlcHJlc2VudHMgdGhlIEMgOmM6dHlwZTpgc2lnbmVkIGxvbmdgIGRhdGF0eXBlLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KICAgIG9wdGlvbmFsIGludGVnZXIgaW5pdGlhbGl6ZXI7IG5vIG92ZXJmbG93IGNoZWNraW5nIGlzIGRvbmUuCiAKIAogLi4gY2xhc3M6OiBjX2xvbmdsb25nCiAKLSAgIFJlcHJlc2VudHMgdGhlIEMgOmN0eXBlOmBzaWduZWQgbG9uZyBsb25nYCBkYXRhdHlwZS4gIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzCisgICBSZXByZXNlbnRzIHRoZSBDIDpjOnR5cGU6YHNpZ25lZCBsb25nIGxvbmdgIGRhdGF0eXBlLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMKICAgIGFuIG9wdGlvbmFsIGludGVnZXIgaW5pdGlhbGl6ZXI7IG5vIG92ZXJmbG93IGNoZWNraW5nIGlzIGRvbmUuCiAKIAogLi4gY2xhc3M6OiBjX3Nob3J0CiAKLSAgIFJlcHJlc2VudHMgdGhlIEMgOmN0eXBlOmBzaWduZWQgc2hvcnRgIGRhdGF0eXBlLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KKyAgIFJlcHJlc2VudHMgdGhlIEMgOmM6dHlwZTpgc2lnbmVkIHNob3J0YCBkYXRhdHlwZS4gIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGFuCiAgICBvcHRpb25hbCBpbnRlZ2VyIGluaXRpYWxpemVyOyBubyBvdmVyZmxvdyBjaGVja2luZyBpcyBkb25lLgogCiAKIC4uIGNsYXNzOjogY19zaXplX3QKIAotICAgUmVwcmVzZW50cyB0aGUgQyA6Y3R5cGU6YHNpemVfdGAgZGF0YXR5cGUuCisgICBSZXByZXNlbnRzIHRoZSBDIDpjOnR5cGU6YHNpemVfdGAgZGF0YXR5cGUuCiAKIAogLi4gY2xhc3M6OiBjX3NzaXplX3QKIAotICAgUmVwcmVzZW50cyB0aGUgQyA6Y3R5cGU6YHNzaXplX3RgIGRhdGF0eXBlLgorICAgUmVwcmVzZW50cyB0aGUgQyA6Yzp0eXBlOmBzc2l6ZV90YCBkYXRhdHlwZS4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi43CiAKIAogLi4gY2xhc3M6OiBjX3VieXRlCiAKLSAgIFJlcHJlc2VudHMgdGhlIEMgOmN0eXBlOmB1bnNpZ25lZCBjaGFyYCBkYXRhdHlwZSwgaXQgaW50ZXJwcmV0cyB0aGUgdmFsdWUgYXMKKyAgIFJlcHJlc2VudHMgdGhlIEMgOmM6dHlwZTpgdW5zaWduZWQgY2hhcmAgZGF0YXR5cGUsIGl0IGludGVycHJldHMgdGhlIHZhbHVlIGFzCiAgICBzbWFsbCBpbnRlZ2VyLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4gb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8KICAgIG92ZXJmbG93IGNoZWNraW5nIGlzIGRvbmUuCiAKIAogLi4gY2xhc3M6OiBjX3VpbnQKIAotICAgUmVwcmVzZW50cyB0aGUgQyA6Y3R5cGU6YHVuc2lnbmVkIGludGAgZGF0YXR5cGUuICBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyBhbgorICAgUmVwcmVzZW50cyB0aGUgQyA6Yzp0eXBlOmB1bnNpZ25lZCBpbnRgIGRhdGF0eXBlLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KICAgIG9wdGlvbmFsIGludGVnZXIgaW5pdGlhbGl6ZXI7IG5vIG92ZXJmbG93IGNoZWNraW5nIGlzIGRvbmUuICBPbiBwbGF0Zm9ybXMKICAgIHdoZXJlIGBgc2l6ZW9mKGludCkgPT0gc2l6ZW9mKGxvbmcpYGAgaXQgaXMgYW4gYWxpYXMgZm9yIDpjbGFzczpgY191bG9uZ2AuCiAKIAogLi4gY2xhc3M6OiBjX3VpbnQ4CiAKLSAgIFJlcHJlc2VudHMgdGhlIEMgOC1iaXQgOmN0eXBlOmB1bnNpZ25lZCBpbnRgIGRhdGF0eXBlLiAgVXN1YWxseSBhbiBhbGlhcyBmb3IKKyAgIFJlcHJlc2VudHMgdGhlIEMgOC1iaXQgOmM6dHlwZTpgdW5zaWduZWQgaW50YCBkYXRhdHlwZS4gIFVzdWFsbHkgYW4gYWxpYXMgZm9yCiAgICA6Y2xhc3M6YGNfdWJ5dGVgLgogCiAKIC4uIGNsYXNzOjogY191aW50MTYKIAotICAgUmVwcmVzZW50cyB0aGUgQyAxNi1iaXQgOmN0eXBlOmB1bnNpZ25lZCBpbnRgIGRhdGF0eXBlLiAgVXN1YWxseSBhbiBhbGlhcyBmb3IKKyAgIFJlcHJlc2VudHMgdGhlIEMgMTYtYml0IDpjOnR5cGU6YHVuc2lnbmVkIGludGAgZGF0YXR5cGUuICBVc3VhbGx5IGFuIGFsaWFzIGZvcgogICAgOmNsYXNzOmBjX3VzaG9ydGAuCiAKIAogLi4gY2xhc3M6OiBjX3VpbnQzMgogCi0gICBSZXByZXNlbnRzIHRoZSBDIDMyLWJpdCA6Y3R5cGU6YHVuc2lnbmVkIGludGAgZGF0YXR5cGUuICBVc3VhbGx5IGFuIGFsaWFzIGZvcgorICAgUmVwcmVzZW50cyB0aGUgQyAzMi1iaXQgOmM6dHlwZTpgdW5zaWduZWQgaW50YCBkYXRhdHlwZS4gIFVzdWFsbHkgYW4gYWxpYXMgZm9yCiAgICA6Y2xhc3M6YGNfdWludGAuCiAKIAogLi4gY2xhc3M6OiBjX3VpbnQ2NAogCi0gICBSZXByZXNlbnRzIHRoZSBDIDY0LWJpdCA6Y3R5cGU6YHVuc2lnbmVkIGludGAgZGF0YXR5cGUuICBVc3VhbGx5IGFuIGFsaWFzIGZvcgorICAgUmVwcmVzZW50cyB0aGUgQyA2NC1iaXQgOmM6dHlwZTpgdW5zaWduZWQgaW50YCBkYXRhdHlwZS4gIFVzdWFsbHkgYW4gYWxpYXMgZm9yCiAgICA6Y2xhc3M6YGNfdWxvbmdsb25nYC4KIAogCiAuLiBjbGFzczo6IGNfdWxvbmcKIAotICAgUmVwcmVzZW50cyB0aGUgQyA6Y3R5cGU6YHVuc2lnbmVkIGxvbmdgIGRhdGF0eXBlLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KKyAgIFJlcHJlc2VudHMgdGhlIEMgOmM6dHlwZTpgdW5zaWduZWQgbG9uZ2AgZGF0YXR5cGUuICBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyBhbgogICAgb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4KIAogCiAuLiBjbGFzczo6IGNfdWxvbmdsb25nCiAKLSAgIFJlcHJlc2VudHMgdGhlIEMgOmN0eXBlOmB1bnNpZ25lZCBsb25nIGxvbmdgIGRhdGF0eXBlLiAgVGhlIGNvbnN0cnVjdG9yCisgICBSZXByZXNlbnRzIHRoZSBDIDpjOnR5cGU6YHVuc2lnbmVkIGxvbmcgbG9uZ2AgZGF0YXR5cGUuICBUaGUgY29uc3RydWN0b3IKICAgIGFjY2VwdHMgYW4gb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4KIAogCiAuLiBjbGFzczo6IGNfdXNob3J0CiAKLSAgIFJlcHJlc2VudHMgdGhlIEMgOmN0eXBlOmB1bnNpZ25lZCBzaG9ydGAgZGF0YXR5cGUuICBUaGUgY29uc3RydWN0b3IgYWNjZXB0cworICAgUmVwcmVzZW50cyB0aGUgQyA6Yzp0eXBlOmB1bnNpZ25lZCBzaG9ydGAgZGF0YXR5cGUuICBUaGUgY29uc3RydWN0b3IgYWNjZXB0cwogICAgYW4gb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4KIAogCiAuLiBjbGFzczo6IGNfdm9pZF9wCiAKLSAgIFJlcHJlc2VudHMgdGhlIEMgOmN0eXBlOmB2b2lkICpgIHR5cGUuICBUaGUgdmFsdWUgaXMgcmVwcmVzZW50ZWQgYXMgaW50ZWdlci4KKyAgIFJlcHJlc2VudHMgdGhlIEMgOmM6dHlwZTpgdm9pZCAqYCB0eXBlLiAgVGhlIHZhbHVlIGlzIHJlcHJlc2VudGVkIGFzIGludGVnZXIuCiAgICBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyBhbiBvcHRpb25hbCBpbnRlZ2VyIGluaXRpYWxpemVyLgogCiAKIC4uIGNsYXNzOjogY193Y2hhcgogCi0gICBSZXByZXNlbnRzIHRoZSBDIDpjdHlwZTpgd2NoYXJfdGAgZGF0YXR5cGUsIGFuZCBpbnRlcnByZXRzIHRoZSB2YWx1ZSBhcyBhCisgICBSZXByZXNlbnRzIHRoZSBDIDpjOnR5cGU6YHdjaGFyX3RgIGRhdGF0eXBlLCBhbmQgaW50ZXJwcmV0cyB0aGUgdmFsdWUgYXMgYQogICAgc2luZ2xlIGNoYXJhY3RlciB1bmljb2RlIHN0cmluZy4gIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGFuIG9wdGlvbmFsIHN0cmluZwogICAgaW5pdGlhbGl6ZXIsIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBtdXN0IGJlIGV4YWN0bHkgb25lIGNoYXJhY3Rlci4KIAogCiAuLiBjbGFzczo6IGNfd2NoYXJfcAogCi0gICBSZXByZXNlbnRzIHRoZSBDIDpjdHlwZTpgd2NoYXJfdCAqYCBkYXRhdHlwZSwgd2hpY2ggbXVzdCBiZSBhIHBvaW50ZXIgdG8gYQorICAgUmVwcmVzZW50cyB0aGUgQyA6Yzp0eXBlOmB3Y2hhcl90ICpgIGRhdGF0eXBlLCB3aGljaCBtdXN0IGJlIGEgcG9pbnRlciB0byBhCiAgICB6ZXJvLXRlcm1pbmF0ZWQgd2lkZSBjaGFyYWN0ZXIgc3RyaW5nLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4gaW50ZWdlcgogICAgYWRkcmVzcywgb3IgYSBzdHJpbmcuCiAKIAogLi4gY2xhc3M6OiBjX2Jvb2wKIAotICAgUmVwcmVzZW50IHRoZSBDIDpjdHlwZTpgYm9vbGAgZGF0YXR5cGUgKG1vcmUgYWNjdXJhdGVseSwgOmN0eXBlOmBfQm9vbGAgZnJvbQotICAgQzk5KS4gIEl0cyB2YWx1ZSBjYW4gYmUgVHJ1ZSBvciBGYWxzZSwgYW5kIHRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGFueSBvYmplY3QKKyAgIFJlcHJlc2VudCB0aGUgQyA6Yzp0eXBlOmBib29sYCBkYXRhdHlwZSAobW9yZSBhY2N1cmF0ZWx5LCA6Yzp0eXBlOmBfQm9vbGAgZnJvbQorICAgQzk5KS4gIEl0cyB2YWx1ZSBjYW4gYmUgYGBUcnVlYGAgb3IgYGBGYWxzZWBgLCBhbmQgdGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW55IG9iamVjdAogICAgdGhhdCBoYXMgYSB0cnV0aCB2YWx1ZS4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi42CkBAIC0yMzQ3LDE4ICsyMzY1LDE4IEBACiAKIC4uIGNsYXNzOjogSFJFU1VMVAogCi0gICBXaW5kb3dzIG9ubHk6IFJlcHJlc2VudHMgYSA6Y3R5cGU6YEhSRVNVTFRgIHZhbHVlLCB3aGljaCBjb250YWlucyBzdWNjZXNzIG9yCisgICBXaW5kb3dzIG9ubHk6IFJlcHJlc2VudHMgYSA6Yzp0eXBlOmBIUkVTVUxUYCB2YWx1ZSwgd2hpY2ggY29udGFpbnMgc3VjY2VzcyBvcgogICAgZXJyb3IgaW5mb3JtYXRpb24gZm9yIGEgZnVuY3Rpb24gb3IgbWV0aG9kIGNhbGwuCiAKIAogLi4gY2xhc3M6OiBweV9vYmplY3QKIAotICAgUmVwcmVzZW50cyB0aGUgQyA6Y3R5cGU6YFB5T2JqZWN0ICpgIGRhdGF0eXBlLiAgQ2FsbGluZyB0aGlzIHdpdGhvdXQgYW4KLSAgIGFyZ3VtZW50IGNyZWF0ZXMgYSBgYE5VTExgYCA6Y3R5cGU6YFB5T2JqZWN0ICpgIHBvaW50ZXIuCisgICBSZXByZXNlbnRzIHRoZSBDIDpjOnR5cGU6YFB5T2JqZWN0ICpgIGRhdGF0eXBlLiAgQ2FsbGluZyB0aGlzIHdpdGhvdXQgYW4KKyAgIGFyZ3VtZW50IGNyZWF0ZXMgYSBgYE5VTExgYCA6Yzp0eXBlOmBQeU9iamVjdCAqYCBwb2ludGVyLgogCiBUaGUgOm1vZDpgY3R5cGVzLndpbnR5cGVzYCBtb2R1bGUgcHJvdmlkZXMgcXVpdGUgc29tZSBvdGhlciBXaW5kb3dzIHNwZWNpZmljCi1kYXRhIHR5cGVzLCBmb3IgZXhhbXBsZSA6Y3R5cGU6YEhXTkRgLCA6Y3R5cGU6YFdQQVJBTWAsIG9yIDpjdHlwZTpgRFdPUkRgLiAgU29tZQotdXNlZnVsIHN0cnVjdHVyZXMgbGlrZSA6Y3R5cGU6YE1TR2Agb3IgOmN0eXBlOmBSRUNUYCBhcmUgYWxzbyBkZWZpbmVkLgorZGF0YSB0eXBlcywgZm9yIGV4YW1wbGUgOmM6dHlwZTpgSFdORGAsIDpjOnR5cGU6YFdQQVJBTWAsIG9yIDpjOnR5cGU6YERXT1JEYC4gIFNvbWUKK3VzZWZ1bCBzdHJ1Y3R1cmVzIGxpa2UgOmM6dHlwZTpgTVNHYCBvciA6Yzp0eXBlOmBSRUNUYCBhcmUgYWxzbyBkZWZpbmVkLgogCiAKIC4uIF9jdHlwZXMtc3RydWN0dXJlZC1kYXRhLXR5cGVzOgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY3Vyc2VzLnJzdCBiL0RvYy9saWJyYXJ5L2N1cnNlcy5yc3QKaW5kZXggZWNkYWM5YS4uNjQyZDI1YiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvY3Vyc2VzLnJzdAorKysgYi9Eb2MvbGlicmFyeS9jdXJzZXMucnN0CkBAIC00OCw3ICs0OCw3IEBACiAgICAgICBUdXRvcmlhbCBtYXRlcmlhbCBvbiB1c2luZyBjdXJzZXMgd2l0aCBQeXRob24sIGJ5IEFuZHJldyBLdWNobGluZyBhbmQgRXJpYwogICAgICAgUmF5bW9uZC4KIAotICAgVGhlIDpmaWxlOmBEZW1vL2N1cnNlcy9gIGRpcmVjdG9yeSBpbiB0aGUgUHl0aG9uIHNvdXJjZSBkaXN0cmlidXRpb24gY29udGFpbnMKKyAgIFRoZSA6c291cmNlOmBEZW1vL2N1cnNlcy9gIGRpcmVjdG9yeSBpbiB0aGUgUHl0aG9uIHNvdXJjZSBkaXN0cmlidXRpb24gY29udGFpbnMKICAgIHNvbWUgZXhhbXBsZSBwcm9ncmFtcyB1c2luZyB0aGUgY3Vyc2VzIGJpbmRpbmdzIHByb3ZpZGVkIGJ5IHRoaXMgbW9kdWxlLgogCiAKQEAgLTM4MCw3ICszODAsOCBAQAogICAgaXMgdG8gYmUgZGlzcGxheWVkLgogCiAKLS4uIGZ1bmN0aW9uOjogbmV3d2luKFtubGluZXMsIG5jb2xzLF0gYmVnaW5feSwgYmVnaW5feCkKKy4uIGZ1bmN0aW9uOjogbmV3d2luKG5saW5lcywgbmNvbHMpCisgICAgICAgICAgICAgIG5ld3dpbihubGluZXMsIG5jb2xzLCBiZWdpbl95LCBiZWdpbl94KQogCiAgICBSZXR1cm4gYSBuZXcgd2luZG93LCB3aG9zZSBsZWZ0LXVwcGVyIGNvcm5lciBpcyBhdCAgYGAoYmVnaW5feSwgYmVnaW5feClgYCwgYW5kCiAgICB3aG9zZSBoZWlnaHQvd2lkdGggaXMgICpubGluZXMqLypuY29scyouCkBAIC02NDgsNyArNjQ5LDggQEAKIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKIAogCi0uLiBtZXRob2Q6OiB3aW5kb3cuYWRkY2goW3ksIHgsXSBjaFssIGF0dHJdKQorLi4gbWV0aG9kOjogd2luZG93LmFkZGNoKGNoWywgYXR0cl0pCisgICAgICAgICAgICB3aW5kb3cuYWRkY2goeSwgeCwgY2hbLCBhdHRyXSkKIAogICAgLi4gbm90ZTo6CiAKQEAgLTY2MiwxMyArNjY0LDE1IEBACiAgICBwb3NpdGlvbiBhbmQgYXR0cmlidXRlcyBhcmUgdGhlIGN1cnJlbnQgc2V0dGluZ3MgZm9yIHRoZSB3aW5kb3cgb2JqZWN0LgogCiAKLS4uIG1ldGhvZDo6IHdpbmRvdy5hZGRuc3RyKFt5LCB4LF0gc3RyLCBuWywgYXR0cl0pCisuLiBtZXRob2Q6OiB3aW5kb3cuYWRkbnN0cihzdHIsIG5bLCBhdHRyXSkKKyAgICAgICAgICAgIHdpbmRvdy5hZGRuc3RyKHksIHgsIHN0ciwgblssIGF0dHJdKQogCiAgICBQYWludCBhdCBtb3N0ICpuKiBjaGFyYWN0ZXJzIG9mIHRoZSAgc3RyaW5nICpzdHIqIGF0IGBgKHksIHgpYGAgd2l0aCBhdHRyaWJ1dGVzCiAgICAqYXR0ciosIG92ZXJ3cml0aW5nIGFueXRoaW5nIHByZXZpb3VzbHkgb24gdGhlIGRpc3BsYXkuCiAKIAotLi4gbWV0aG9kOjogd2luZG93LmFkZHN0cihbeSwgeCxdIHN0clssIGF0dHJdKQorLi4gbWV0aG9kOjogd2luZG93LmFkZHN0cihzdHJbLCBhdHRyXSkKKyAgICAgICAgICAgIHdpbmRvdy5hZGRzdHIoeSwgeCwgc3RyWywgYXR0cl0pCiAKICAgIFBhaW50IHRoZSBzdHJpbmcgKnN0ciogYXQgYGAoeSwgeClgYCB3aXRoIGF0dHJpYnV0ZXMgKmF0dHIqLCBvdmVyd3JpdGluZwogICAgYW55dGhpbmcgcHJldmlvdXNseSBvbiB0aGUgZGlzcGxheS4KQEAgLTc1NSw3ICs3NTksMTAgQEAKICAgICpicyogYXJlICpob3JjaCouICBUaGUgZGVmYXVsdCBjb3JuZXIgY2hhcmFjdGVycyBhcmUgYWx3YXlzIHVzZWQgYnkgdGhpcyBmdW5jdGlvbi4KIAogCi0uLiBtZXRob2Q6OiB3aW5kb3cuY2hnYXQoW3ksIHgsIF0gW251bSxdIGF0dHIpCisuLiBtZXRob2Q6OiB3aW5kb3cuY2hnYXQoYXR0cikKKyAgICAgICAgICAgIHdpbmRvdy5jaGdhdChudW0sIGF0dHIpCisgICAgICAgICAgICB3aW5kb3cuY2hnYXQoeSwgeCwgYXR0cikKKyAgICAgICAgICAgIHdpbmRvdy5jaGdhdCh5LCB4LCBudW0sIGF0dHIpCiAKICAgIFNldCB0aGUgYXR0cmlidXRlcyBvZiAqbnVtKiBjaGFyYWN0ZXJzIGF0IHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiwgb3IgYXQKICAgIHBvc2l0aW9uIGBgKHksIHgpYGAgaWYgc3VwcGxpZWQuIElmIG5vIHZhbHVlIG9mICpudW0qIGlzIGdpdmVuIG9yICpudW0qID0gLTEsCkBAIC04MDQsNyArODExLDggQEAKICAgIERlbGV0ZSB0aGUgbGluZSB1bmRlciB0aGUgY3Vyc29yLiBBbGwgZm9sbG93aW5nIGxpbmVzIGFyZSBtb3ZlZCB1cCBieSBvbmUgbGluZS4KIAogCi0uLiBtZXRob2Q6OiB3aW5kb3cuZGVyd2luKFtubGluZXMsIG5jb2xzLF0gYmVnaW5feSwgYmVnaW5feCkKKy4uIG1ldGhvZDo6IHdpbmRvdy5kZXJ3aW4oYmVnaW5feSwgYmVnaW5feCkKKyAgICAgICAgICAgIHdpbmRvdy5kZXJ3aW4obmxpbmVzLCBuY29scywgYmVnaW5feSwgYmVnaW5feCkKIAogICAgQW4gYWJicmV2aWF0aW9uIGZvciAiZGVyaXZlIHdpbmRvdyIsIDptZXRoOmBkZXJ3aW5gIGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcKICAgIDptZXRoOmBzdWJ3aW5gLCBleGNlcHQgdGhhdCAqYmVnaW5feSogYW5kICpiZWdpbl94KiBhcmUgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbgpAQCAtODc5LDcgKzg4Nyw4IEBACiAgICB1cHBlci1sZWZ0IGNvcm5lci4KIAogCi0uLiBtZXRob2Q6OiB3aW5kb3cuaGxpbmUoW3ksIHgsXSBjaCwgbikKKy4uIG1ldGhvZDo6IHdpbmRvdy5obGluZShjaCwgbikKKyAgICAgICAgICAgIHdpbmRvdy5obGluZSh5LCB4LCBjaCwgbikKIAogICAgRGlzcGxheSBhIGhvcml6b250YWwgbGluZSBzdGFydGluZyBhdCBgYCh5LCB4KWBgIHdpdGggbGVuZ3RoICpuKiBjb25zaXN0aW5nIG9mCiAgICB0aGUgY2hhcmFjdGVyICpjaCouCkBAIC05MTMsNyArOTIyLDggQEAKICAgIHRoZSBjaGFyYWN0ZXIgcHJvcGVyLCBhbmQgdXBwZXIgYml0cyBhcmUgdGhlIGF0dHJpYnV0ZXMuCiAKIAotLi4gbWV0aG9kOjogd2luZG93Lmluc2NoKFt5LCB4LF0gY2hbLCBhdHRyXSkKKy4uIG1ldGhvZDo6IHdpbmRvdy5pbnNjaChjaFssIGF0dHJdKQorICAgICAgICAgICAgd2luZG93Lmluc2NoKHksIHgsIGNoWywgYXR0cl0pCiAKICAgIFBhaW50IGNoYXJhY3RlciAqY2gqIGF0IGBgKHksIHgpYGAgd2l0aCBhdHRyaWJ1dGVzICphdHRyKiwgbW92aW5nIHRoZSBsaW5lIGZyb20KICAgIHBvc2l0aW9uICp4KiByaWdodCBieSBvbmUgY2hhcmFjdGVyLgpAQCAtOTM0LDcgKzk0NCw4IEBACiAgICBsaW5lLgogCiAKLS4uIG1ldGhvZDo6IHdpbmRvdy5pbnNuc3RyKFt5LCB4LF0gc3RyLCBuIFssIGF0dHJdKQorLi4gbWV0aG9kOjogd2luZG93Lmluc25zdHIoc3RyLCBuWywgYXR0cl0pCisgICAgICAgICAgICB3aW5kb3cuaW5zbnN0cih5LCB4LCBzdHIsIG5bLCBhdHRyXSkKIAogICAgSW5zZXJ0IGEgY2hhcmFjdGVyIHN0cmluZyAoYXMgbWFueSBjaGFyYWN0ZXJzIGFzIHdpbGwgZml0IG9uIHRoZSBsaW5lKSBiZWZvcmUKICAgIHRoZSBjaGFyYWN0ZXIgdW5kZXIgdGhlIGN1cnNvciwgdXAgdG8gKm4qIGNoYXJhY3RlcnMuICAgSWYgKm4qIGlzIHplcm8gb3IKQEAgLTk0Myw3ICs5NTQsOCBAQAogICAgVGhlIGN1cnNvciBwb3NpdGlvbiBkb2VzIG5vdCBjaGFuZ2UgKGFmdGVyIG1vdmluZyB0byAqeSosICp4KiwgaWYgc3BlY2lmaWVkKS4KIAogCi0uLiBtZXRob2Q6OiB3aW5kb3cuaW5zc3RyKFt5LCB4LCBdIHN0ciBbLCBhdHRyXSkKKy4uIG1ldGhvZDo6IHdpbmRvdy5pbnNzdHIoc3RyWywgYXR0cl0pCisgICAgICAgICAgICB3aW5kb3cuaW5zc3RyKHksIHgsIHN0clssIGF0dHJdKQogCiAgICBJbnNlcnQgYSBjaGFyYWN0ZXIgc3RyaW5nIChhcyBtYW55IGNoYXJhY3RlcnMgYXMgd2lsbCBmaXQgb24gdGhlIGxpbmUpIGJlZm9yZQogICAgdGhlIGNoYXJhY3RlciB1bmRlciB0aGUgY3Vyc29yLiAgQWxsIGNoYXJhY3RlcnMgdG8gdGhlIHJpZ2h0IG9mIHRoZSBjdXJzb3IgYXJlCkBAIC05NTEsNyArOTYzLDggQEAKICAgIHBvc2l0aW9uIGRvZXMgbm90IGNoYW5nZSAoYWZ0ZXIgbW92aW5nIHRvICp5KiwgKngqLCBpZiBzcGVjaWZpZWQpLgogCiAKLS4uIG1ldGhvZDo6IHdpbmRvdy5pbnN0cihbeSwgeF0gWywgbl0pCisuLiBtZXRob2Q6OiB3aW5kb3cuaW5zdHIoW25dKQorICAgICAgICAgICAgd2luZG93Lmluc3RyKHksIHhbLCBuXSkKIAogICAgUmV0dXJuIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMsIGV4dHJhY3RlZCBmcm9tIHRoZSB3aW5kb3cgc3RhcnRpbmcgYXQgdGhlCiAgICBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiwgb3IgYXQgKnkqLCAqeCogaWYgc3BlY2lmaWVkLiBBdHRyaWJ1dGVzIGFyZSBzdHJpcHBlZApAQCAtMTEyNiwxMyArMTEzOSwxNSBAQAogICAgVHVybiBvbiBhdHRyaWJ1dGUgKkFfU1RBTkRPVVQqLgogCiAKLS4uIG1ldGhvZDo6IHdpbmRvdy5zdWJwYWQoW25saW5lcywgbmNvbHMsXSBiZWdpbl95LCBiZWdpbl94KQorLi4gbWV0aG9kOjogd2luZG93LnN1YnBhZChiZWdpbl95LCBiZWdpbl94KQorICAgICAgICAgICAgd2luZG93LnN1YnBhZChubGluZXMsIG5jb2xzLCBiZWdpbl95LCBiZWdpbl94KQogCiAgICBSZXR1cm4gYSBzdWItd2luZG93LCB3aG9zZSB1cHBlci1sZWZ0IGNvcm5lciBpcyBhdCBgYChiZWdpbl95LCBiZWdpbl94KWBgLCBhbmQKICAgIHdob3NlIHdpZHRoL2hlaWdodCBpcyAqbmNvbHMqLypubGluZXMqLgogCiAKLS4uIG1ldGhvZDo6IHdpbmRvdy5zdWJ3aW4oW25saW5lcywgbmNvbHMsXSBiZWdpbl95LCBiZWdpbl94KQorLi4gbWV0aG9kOjogd2luZG93LnN1YndpbihiZWdpbl95LCBiZWdpbl94KQorICAgICAgICAgICAgd2luZG93LnN1YndpbihubGluZXMsIG5jb2xzLCBiZWdpbl95LCBiZWdpbl94KQogCiAgICBSZXR1cm4gYSBzdWItd2luZG93LCB3aG9zZSB1cHBlci1sZWZ0IGNvcm5lciBpcyBhdCBgYChiZWdpbl95LCBiZWdpbl94KWBgLCBhbmQKICAgIHdob3NlIHdpZHRoL2hlaWdodCBpcyAqbmNvbHMqLypubGluZXMqLgpAQCAtMTE4OSw3ICsxMjA0LDggQEAKICAgIDptZXRoOmByZWZyZXNoYC4KIAogCi0uLiBtZXRob2Q6OiB3aW5kb3cudmxpbmUoW3ksIHgsXSBjaCwgbikKKy4uIG1ldGhvZDo6IHdpbmRvdy52bGluZShjaCwgbikKKyAgICAgICAgICAgIHdpbmRvdy52bGluZSh5LCB4LCBjaCwgbikKIAogICAgRGlzcGxheSBhIHZlcnRpY2FsIGxpbmUgc3RhcnRpbmcgYXQgYGAoeSwgeClgYCB3aXRoIGxlbmd0aCAqbiogY29uc2lzdGluZyBvZiB0aGUKICAgIGNoYXJhY3RlciAqY2gqLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZGF0ZXRpbWUucnN0IGIvRG9jL2xpYnJhcnkvZGF0ZXRpbWUucnN0CmluZGV4IDU1YWNmNjcuLmRiOTUyNjkgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2RhdGV0aW1lLnJzdAorKysgYi9Eb2MvbGlicmFyeS9kYXRldGltZS5yc3QKQEAgLTE0LDM5ICsxNCw0NiBAQAogVGhlIDptb2Q6YGRhdGV0aW1lYCBtb2R1bGUgc3VwcGxpZXMgY2xhc3NlcyBmb3IgbWFuaXB1bGF0aW5nIGRhdGVzIGFuZCB0aW1lcyBpbgogYm90aCBzaW1wbGUgYW5kIGNvbXBsZXggd2F5cy4gIFdoaWxlIGRhdGUgYW5kIHRpbWUgYXJpdGhtZXRpYyBpcyBzdXBwb3J0ZWQsIHRoZQogZm9jdXMgb2YgdGhlIGltcGxlbWVudGF0aW9uIGlzIG9uIGVmZmljaWVudCBhdHRyaWJ1dGUgZXh0cmFjdGlvbiBmb3Igb3V0cHV0Ci1mb3JtYXR0aW5nIGFuZCBtYW5pcHVsYXRpb24uIEZvciByZWxhdGVkCi1mdW5jdGlvbmFsaXR5LCBzZWUgYWxzbyB0aGUgOm1vZDpgdGltZWAgYW5kIDptb2Q6YGNhbGVuZGFyYCBtb2R1bGVzLgorZm9ybWF0dGluZyBhbmQgbWFuaXB1bGF0aW9uLiBGb3IgcmVsYXRlZCBmdW5jdGlvbmFsaXR5LCBzZWUgYWxzbyB0aGUKKzptb2Q6YHRpbWVgIGFuZCA6bW9kOmBjYWxlbmRhcmAgbW9kdWxlcy4KIAotVGhlcmUgYXJlIHR3byBraW5kcyBvZiBkYXRlIGFuZCB0aW1lIG9iamVjdHM6ICJuYWl2ZSIgYW5kICJhd2FyZSIuIFRoaXMKLWRpc3RpbmN0aW9uIHJlZmVycyB0byB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIGFueSBub3Rpb24gb2YgdGltZSB6b25lLCBkYXlsaWdodAotc2F2aW5nIHRpbWUsIG9yIG90aGVyIGtpbmQgb2YgYWxnb3JpdGhtaWMgb3IgcG9saXRpY2FsIHRpbWUgYWRqdXN0bWVudC4gIFdoZXRoZXIKLWEgbmFpdmUgOmNsYXNzOmBkYXRldGltZWAgb2JqZWN0IHJlcHJlc2VudHMgQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUgKFVUQyksCi1sb2NhbCB0aW1lLCBvciB0aW1lIGluIHNvbWUgb3RoZXIgdGltZXpvbmUgaXMgcHVyZWx5IHVwIHRvIHRoZSBwcm9ncmFtLCBqdXN0Ci1saWtlIGl0J3MgdXAgdG8gdGhlIHByb2dyYW0gd2hldGhlciBhIHBhcnRpY3VsYXIgbnVtYmVyIHJlcHJlc2VudHMgbWV0cmVzLAotbWlsZXMsIG9yIG1hc3MuICBOYWl2ZSA6Y2xhc3M6YGRhdGV0aW1lYCBvYmplY3RzIGFyZSBlYXN5IHRvIHVuZGVyc3RhbmQgYW5kIHRvCi13b3JrIHdpdGgsIGF0IHRoZSBjb3N0IG9mIGlnbm9yaW5nIHNvbWUgYXNwZWN0cyBvZiByZWFsaXR5LgorVGhlcmUgYXJlIHR3byBraW5kcyBvZiBkYXRlIGFuZCB0aW1lIG9iamVjdHM6ICJuYWl2ZSIgYW5kICJhd2FyZSIuCiAKLUZvciBhcHBsaWNhdGlvbnMgcmVxdWlyaW5nIG1vcmUsIDpjbGFzczpgZGF0ZXRpbWVgIGFuZCA6Y2xhc3M6YHRpbWVgIG9iamVjdHMKLWhhdmUgYW4gb3B0aW9uYWwgdGltZSB6b25lIGluZm9ybWF0aW9uIGF0dHJpYnV0ZSwgOmF0dHI6YHR6aW5mb2AsIHRoYXQgY2FuIGJlCi1zZXQgdG8gYW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZiB0aGUgYWJzdHJhY3QgOmNsYXNzOmB0emluZm9gIGNsYXNzLiAgVGhlc2UKLTpjbGFzczpgdHppbmZvYCBvYmplY3RzIGNhcHR1cmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9mZnNldCBmcm9tIFVUQyB0aW1lLCB0aGUKLXRpbWUgem9uZSBuYW1lLCBhbmQgd2hldGhlciBEYXlsaWdodCBTYXZpbmcgVGltZSBpcyBpbiBlZmZlY3QuICBOb3RlIHRoYXQgbm8KLWNvbmNyZXRlIDpjbGFzczpgdHppbmZvYCBjbGFzc2VzIGFyZSBzdXBwbGllZCBieSB0aGUgOm1vZDpgZGF0ZXRpbWVgIG1vZHVsZS4KLVN1cHBvcnRpbmcgdGltZXpvbmVzIGF0IHdoYXRldmVyIGxldmVsIG9mIGRldGFpbCBpcyByZXF1aXJlZCBpcyB1cCB0byB0aGUKLWFwcGxpY2F0aW9uLiAgVGhlIHJ1bGVzIGZvciB0aW1lIGFkanVzdG1lbnQgYWNyb3NzIHRoZSB3b3JsZCBhcmUgbW9yZSBwb2xpdGljYWwKLXRoYW4gcmF0aW9uYWwsIGFuZCB0aGVyZSBpcyBubyBzdGFuZGFyZCBzdWl0YWJsZSBmb3IgZXZlcnkgYXBwbGljYXRpb24uCitBbiBhd2FyZSBvYmplY3QgaGFzIHN1ZmZpY2llbnQga25vd2xlZGdlIG9mIGFwcGxpY2FibGUgYWxnb3JpdGhtaWMgYW5kCitwb2xpdGljYWwgdGltZSBhZGp1c3RtZW50cywgc3VjaCBhcyB0aW1lIHpvbmUgYW5kIGRheWxpZ2h0IHNhdmluZyB0aW1lCitpbmZvcm1hdGlvbiwgdG8gbG9jYXRlIGl0c2VsZiByZWxhdGl2ZSB0byBvdGhlciBhd2FyZSBvYmplY3RzLiAgQW4gYXdhcmUgb2JqZWN0CitpcyB1c2VkIHRvIHJlcHJlc2VudCBhIHNwZWNpZmljIG1vbWVudCBpbiB0aW1lIHRoYXQgaXMgbm90IG9wZW4gdG8KK2ludGVycHJldGF0aW9uIFsjXV8uCisKK0EgbmFpdmUgb2JqZWN0IGRvZXMgbm90IGNvbnRhaW4gZW5vdWdoIGluZm9ybWF0aW9uIHRvIHVuYW1iaWd1b3VzbHkgbG9jYXRlCitpdHNlbGYgcmVsYXRpdmUgdG8gb3RoZXIgZGF0ZS90aW1lIG9iamVjdHMuICBXaGV0aGVyIGEgbmFpdmUgb2JqZWN0IHJlcHJlc2VudHMKK0Nvb3JkaW5hdGVkIFVuaXZlcnNhbCBUaW1lIChVVEMpLCBsb2NhbCB0aW1lLCBvciB0aW1lIGluIHNvbWUgb3RoZXIgdGltZXpvbmUgaXMKK3B1cmVseSB1cCB0byB0aGUgcHJvZ3JhbSwganVzdCBsaWtlIGl0J3MgdXAgdG8gdGhlIHByb2dyYW0gd2hldGhlciBhIHBhcnRpY3VsYXIKK251bWJlciByZXByZXNlbnRzIG1ldHJlcywgbWlsZXMsIG9yIG1hc3MuICBOYWl2ZSBvYmplY3RzIGFyZSBlYXN5IHRvIHVuZGVyc3RhbmQKK2FuZCB0byB3b3JrIHdpdGgsIGF0IHRoZSBjb3N0IG9mIGlnbm9yaW5nIHNvbWUgYXNwZWN0cyBvZiByZWFsaXR5LgorCitGb3IgYXBwbGljYXRpb25zIHJlcXVpcmluZyBhd2FyZSBvYmplY3RzLCA6Y2xhc3M6YC5kYXRldGltZWAgYW5kIDpjbGFzczpgLnRpbWVgCitvYmplY3RzIGhhdmUgYW4gb3B0aW9uYWwgdGltZSB6b25lIGluZm9ybWF0aW9uIGF0dHJpYnV0ZSwgOmF0dHI6YHR6aW5mb2AsIHRoYXQKK2NhbiBiZSBzZXQgdG8gYW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZiB0aGUgYWJzdHJhY3QgOmNsYXNzOmB0emluZm9gIGNsYXNzLgorVGhlc2UgOmNsYXNzOmB0emluZm9gIG9iamVjdHMgY2FwdHVyZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2Zmc2V0IGZyb20gVVRDCit0aW1lLCB0aGUgdGltZSB6b25lIG5hbWUsIGFuZCB3aGV0aGVyIERheWxpZ2h0IFNhdmluZyBUaW1lIGlzIGluIGVmZmVjdC4gIE5vdGUKK3RoYXQgbm8gY29uY3JldGUgOmNsYXNzOmB0emluZm9gIGNsYXNzZXMgYXJlIHN1cHBsaWVkIGJ5IHRoZSA6bW9kOmBkYXRldGltZWAKK21vZHVsZS4gIFN1cHBvcnRpbmcgdGltZXpvbmVzIGF0IHdoYXRldmVyIGxldmVsIG9mIGRldGFpbCBpcyByZXF1aXJlZCBpcyB1cCB0bwordGhlIGFwcGxpY2F0aW9uLiAgVGhlIHJ1bGVzIGZvciB0aW1lIGFkanVzdG1lbnQgYWNyb3NzIHRoZSB3b3JsZCBhcmUgbW9yZQorcG9saXRpY2FsIHRoYW4gcmF0aW9uYWwsIGFuZCB0aGVyZSBpcyBubyBzdGFuZGFyZCBzdWl0YWJsZSBmb3IgZXZlcnkKK2FwcGxpY2F0aW9uLgogCiBUaGUgOm1vZDpgZGF0ZXRpbWVgIG1vZHVsZSBleHBvcnRzIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzOgogCiAuLiBkYXRhOjogTUlOWUVBUgogCi0gICBUaGUgc21hbGxlc3QgeWVhciBudW1iZXIgYWxsb3dlZCBpbiBhIDpjbGFzczpgZGF0ZWAgb3IgOmNsYXNzOmBkYXRldGltZWAgb2JqZWN0LgorICAgVGhlIHNtYWxsZXN0IHllYXIgbnVtYmVyIGFsbG93ZWQgaW4gYSA6Y2xhc3M6YGRhdGVgIG9yIDpjbGFzczpgLmRhdGV0aW1lYCBvYmplY3QuCiAgICA6Y29uc3Q6YE1JTllFQVJgIGlzIGBgMWBgLgogCiAKIC4uIGRhdGE6OiBNQVhZRUFSCiAKLSAgIFRoZSBsYXJnZXN0IHllYXIgbnVtYmVyIGFsbG93ZWQgaW4gYSA6Y2xhc3M6YGRhdGVgIG9yIDpjbGFzczpgZGF0ZXRpbWVgIG9iamVjdC4KKyAgIFRoZSBsYXJnZXN0IHllYXIgbnVtYmVyIGFsbG93ZWQgaW4gYSA6Y2xhc3M6YGRhdGVgIG9yIDpjbGFzczpgLmRhdGV0aW1lYCBvYmplY3QuCiAgICA6Y29uc3Q6YE1BWFlFQVJgIGlzIGBgOTk5OWBgLgogCiAKQEAgLTkwLDE0ICs5NywxNCBAQAogLi4gY2xhc3M6OiB0aW1lZGVsdGEKICAgIDpub2luZGV4OgogCi0gICBBIGR1cmF0aW9uIGV4cHJlc3NpbmcgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gOmNsYXNzOmBkYXRlYCwgOmNsYXNzOmB0aW1lYCwKLSAgIG9yIDpjbGFzczpgZGF0ZXRpbWVgIGluc3RhbmNlcyB0byBtaWNyb3NlY29uZCByZXNvbHV0aW9uLgorICAgQSBkdXJhdGlvbiBleHByZXNzaW5nIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIDpjbGFzczpgZGF0ZWAsIDpjbGFzczpgLnRpbWVgLAorICAgb3IgOmNsYXNzOmAuZGF0ZXRpbWVgIGluc3RhbmNlcyB0byBtaWNyb3NlY29uZCByZXNvbHV0aW9uLgogCiAKIC4uIGNsYXNzOjogdHppbmZvCiAKICAgIEFuIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHRpbWUgem9uZSBpbmZvcm1hdGlvbiBvYmplY3RzLiAgVGhlc2UgYXJlIHVzZWQgYnkgdGhlCi0gICA6Y2xhc3M6YGRhdGV0aW1lYCBhbmQgOmNsYXNzOmB0aW1lYCBjbGFzc2VzIHRvIHByb3ZpZGUgYSBjdXN0b21pemFibGUgbm90aW9uIG9mCisgICA6Y2xhc3M6YC5kYXRldGltZWAgYW5kIDpjbGFzczpgLnRpbWVgIGNsYXNzZXMgdG8gcHJvdmlkZSBhIGN1c3RvbWl6YWJsZSBub3Rpb24gb2YKICAgIHRpbWUgYWRqdXN0bWVudCAoZm9yIGV4YW1wbGUsIHRvIGFjY291bnQgZm9yIHRpbWUgem9uZSBhbmQvb3IgZGF5bGlnaHQgc2F2aW5nCiAgICB0aW1lKS4KIApAQCAtMTA1LDEwICsxMTIsMTMgQEAKIAogT2JqZWN0cyBvZiB0aGUgOmNsYXNzOmBkYXRlYCB0eXBlIGFyZSBhbHdheXMgbmFpdmUuCiAKLUFuIG9iamVjdCAqZCogb2YgdHlwZSA6Y2xhc3M6YHRpbWVgIG9yIDpjbGFzczpgZGF0ZXRpbWVgIG1heSBiZSBuYWl2ZSBvciBhd2FyZS4KLSpkKiBpcyBhd2FyZSBpZiBgYGQudHppbmZvYGAgaXMgbm90IGBgTm9uZWBgIGFuZCBgYGQudHppbmZvLnV0Y29mZnNldChkKWBgIGRvZXMKLW5vdCByZXR1cm4gYGBOb25lYGAuICBJZiBgYGQudHppbmZvYGAgaXMgYGBOb25lYGAsIG9yIGlmIGBgZC50emluZm9gYCBpcyBub3QKLWBgTm9uZWBgIGJ1dCBgYGQudHppbmZvLnV0Y29mZnNldChkKWBgIHJldHVybnMgYGBOb25lYGAsICpkKiBpcyBuYWl2ZS4KK0FuIG9iamVjdCBvZiB0eXBlIDpjbGFzczpgLnRpbWVgIG9yIDpjbGFzczpgLmRhdGV0aW1lYCBtYXkgYmUgbmFpdmUgb3IgYXdhcmUuCitBIDpjbGFzczpgLmRhdGV0aW1lYCBvYmplY3QgKmQqIGlzIGF3YXJlIGlmIGBgZC50emluZm9gYCBpcyBub3QgYGBOb25lYGAgYW5kCitgYGQudHppbmZvLnV0Y29mZnNldChkKWBgIGRvZXMgbm90IHJldHVybiBgYE5vbmVgYC4gIElmIGBgZC50emluZm9gYCBpcworYGBOb25lYGAsIG9yIGlmIGBgZC50emluZm9gYCBpcyBub3QgYGBOb25lYGAgYnV0IGBgZC50emluZm8udXRjb2Zmc2V0KGQpYGAKK3JldHVybnMgYGBOb25lYGAsICpkKiBpcyBuYWl2ZS4gIEEgOmNsYXNzOmAudGltZWAgb2JqZWN0ICp0KiBpcyBhd2FyZQoraWYgYGB0LnR6aW5mb2BgIGlzIG5vdCBgYE5vbmVgYCBhbmQgYGB0LnR6aW5mby51dGNvZmZzZXQoTm9uZSlgYCBkb2VzIG5vdCByZXR1cm4KK2BgTm9uZWBgLiAgT3RoZXJ3aXNlLCAqdCogaXMgbmFpdmUuCiAKIFRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIG5haXZlIGFuZCBhd2FyZSBkb2Vzbid0IGFwcGx5IHRvIDpjbGFzczpgdGltZWRlbHRhYAogb2JqZWN0cy4KQEAgLTI2OSw3ICsyNzksNyBAQAogICAtMSBkYXksIDE5OjAwOjAwCiAKIEluIGFkZGl0aW9uIHRvIHRoZSBvcGVyYXRpb25zIGxpc3RlZCBhYm92ZSA6Y2xhc3M6YHRpbWVkZWx0YWAgb2JqZWN0cyBzdXBwb3J0Ci1jZXJ0YWluIGFkZGl0aW9ucyBhbmQgc3VidHJhY3Rpb25zIHdpdGggOmNsYXNzOmBkYXRlYCBhbmQgOmNsYXNzOmBkYXRldGltZWAKK2NlcnRhaW4gYWRkaXRpb25zIGFuZCBzdWJ0cmFjdGlvbnMgd2l0aCA6Y2xhc3M6YGRhdGVgIGFuZCA6Y2xhc3M6YC5kYXRldGltZWAKIG9iamVjdHMgKHNlZSBiZWxvdykuCiAKIENvbXBhcmlzb25zIG9mIDpjbGFzczpgdGltZWRlbHRhYCBvYmplY3RzIGFyZSBzdXBwb3J0ZWQgd2l0aCB0aGUKQEAgLTM2MCw3ICszNzAsNyBAQAogCiAgICBSZXR1cm4gdGhlIGxvY2FsIGRhdGUgY29ycmVzcG9uZGluZyB0byB0aGUgUE9TSVggdGltZXN0YW1wLCBzdWNoIGFzIGlzIHJldHVybmVkCiAgICBieSA6ZnVuYzpgdGltZS50aW1lYC4gIFRoaXMgbWF5IHJhaXNlIDpleGM6YFZhbHVlRXJyb3JgLCBpZiB0aGUgdGltZXN0YW1wIGlzIG91dAotICAgb2YgdGhlIHJhbmdlIG9mIHZhbHVlcyBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtIEMgOmNmdW5jOmBsb2NhbHRpbWVgIGZ1bmN0aW9uLgorICAgb2YgdGhlIHJhbmdlIG9mIHZhbHVlcyBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtIEMgOmM6ZnVuYzpgbG9jYWx0aW1lYCBmdW5jdGlvbi4KICAgIEl0J3MgY29tbW9uIGZvciB0aGlzIHRvIGJlIHJlc3RyaWN0ZWQgdG8geWVhcnMgZnJvbSAxOTcwIHRocm91Z2ggMjAzOC4gIE5vdGUKICAgIHRoYXQgb24gbm9uLVBPU0lYIHN5c3RlbXMgdGhhdCBpbmNsdWRlIGxlYXAgc2Vjb25kcyBpbiB0aGVpciBub3Rpb24gb2YgYQogICAgdGltZXN0YW1wLCBsZWFwIHNlY29uZHMgYXJlIGlnbm9yZWQgYnkgOm1ldGg6YGZyb210aW1lc3RhbXBgLgpAQCAtNTM0LDE1ICs1NDQsMjMgQEAKICAgIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRhdGUsIGZvciBleGFtcGxlIGBgZGF0ZSgyMDAyLCAxMiwKICAgIDQpLmN0aW1lKCkgPT0gJ1dlZCBEZWMgNCAwMDowMDowMCAyMDAyJ2BgLiBgYGQuY3RpbWUoKWBgIGlzIGVxdWl2YWxlbnQgdG8KICAgIGBgdGltZS5jdGltZSh0aW1lLm1rdGltZShkLnRpbWV0dXBsZSgpKSlgYCBvbiBwbGF0Zm9ybXMgd2hlcmUgdGhlIG5hdGl2ZSBDCi0gICA6Y2Z1bmM6YGN0aW1lYCBmdW5jdGlvbiAod2hpY2ggOmZ1bmM6YHRpbWUuY3RpbWVgIGludm9rZXMsIGJ1dCB3aGljaAorICAgOmM6ZnVuYzpgY3RpbWVgIGZ1bmN0aW9uICh3aGljaCA6ZnVuYzpgdGltZS5jdGltZWAgaW52b2tlcywgYnV0IHdoaWNoCiAgICA6bWV0aDpgZGF0ZS5jdGltZWAgZG9lcyBub3QgaW52b2tlKSBjb25mb3JtcyB0byB0aGUgQyBzdGFuZGFyZC4KIAogCiAuLiBtZXRob2Q6OiBkYXRlLnN0cmZ0aW1lKGZvcm1hdCkKIAogICAgUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZGF0ZSwgY29udHJvbGxlZCBieSBhbiBleHBsaWNpdCBmb3JtYXQgc3RyaW5nLgotICAgRm9ybWF0IGNvZGVzIHJlZmVycmluZyB0byBob3VycywgbWludXRlcyBvciBzZWNvbmRzIHdpbGwgc2VlIDAgdmFsdWVzLiBTZWUKLSAgIHNlY3Rpb24gOnJlZjpgc3RyZnRpbWUtc3RycHRpbWUtYmVoYXZpb3JgLgorICAgRm9ybWF0IGNvZGVzIHJlZmVycmluZyB0byBob3VycywgbWludXRlcyBvciBzZWNvbmRzIHdpbGwgc2VlIDAgdmFsdWVzLiBGb3IgYQorICAgY29tcGxldGUgbGlzdCBvZiBmb3JtYXR0aW5nIGRpcmVjdGl2ZXMsIHNlZSBzZWN0aW9uCisgICA6cmVmOmBzdHJmdGltZS1zdHJwdGltZS1iZWhhdmlvcmAuCisKKworLi4gbWV0aG9kOjogZGF0ZS5fX2Zvcm1hdF9fKGZvcm1hdCkKKworICAgU2FtZSBhcyA6bWV0aDpgLmRhdGUuc3RyZnRpbWVgLiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHNwZWNpZnkgZm9ybWF0CisgICBzdHJpbmcgZm9yIGEgOmNsYXNzOmAuZGF0ZWAgb2JqZWN0IHdoZW4gdXNpbmcgOm1ldGg6YHN0ci5mb3JtYXRgLgorICAgU2VlIHNlY3Rpb24gOnJlZjpgc3RyZnRpbWUtc3RycHRpbWUtYmVoYXZpb3JgLgogCiAKIEV4YW1wbGUgb2YgY291bnRpbmcgZGF5cyB0byBhbiBldmVudDo6CkBAIC01OTUsNiArNjEzLDggQEAKICAgICAnMTEvMDMvMDInCiAgICAgPj4+IGQuc3RyZnRpbWUoIiVBICVkLiAlQiAlWSIpCiAgICAgJ01vbmRheSAxMS4gTWFyY2ggMjAwMicKKyAgICA+Pj4gJ1RoZSB7MX0gaXMgezA6JWR9LCB0aGUgezJ9IGlzIHswOiVCfS4nLmZvcm1hdChkLCAiZGF5IiwgIm1vbnRoIikKKyAgICAnVGhlIGRheSBpcyAxMSwgdGhlIG1vbnRoIGlzIE1hcmNoLicKIAogCiAuLiBfZGF0ZXRpbWUtZGF0ZXRpbWU6CkBAIC02MDIsMTAgKzYyMiwxMCBAQAogOmNsYXNzOmBkYXRldGltZWAgT2JqZWN0cwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1BIDpjbGFzczpgZGF0ZXRpbWVgIG9iamVjdCBpcyBhIHNpbmdsZSBvYmplY3QgY29udGFpbmluZyBhbGwgdGhlIGluZm9ybWF0aW9uCi1mcm9tIGEgOmNsYXNzOmBkYXRlYCBvYmplY3QgYW5kIGEgOmNsYXNzOmB0aW1lYCBvYmplY3QuICBMaWtlIGEgOmNsYXNzOmBkYXRlYAotb2JqZWN0LCA6Y2xhc3M6YGRhdGV0aW1lYCBhc3N1bWVzIHRoZSBjdXJyZW50IEdyZWdvcmlhbiBjYWxlbmRhciBleHRlbmRlZCBpbgotYm90aCBkaXJlY3Rpb25zOyBsaWtlIGEgdGltZSBvYmplY3QsIDpjbGFzczpgZGF0ZXRpbWVgIGFzc3VtZXMgdGhlcmUgYXJlIGV4YWN0bHkKK0EgOmNsYXNzOmAuZGF0ZXRpbWVgIG9iamVjdCBpcyBhIHNpbmdsZSBvYmplY3QgY29udGFpbmluZyBhbGwgdGhlIGluZm9ybWF0aW9uCitmcm9tIGEgOmNsYXNzOmBkYXRlYCBvYmplY3QgYW5kIGEgOmNsYXNzOmAudGltZWAgb2JqZWN0LiAgTGlrZSBhIDpjbGFzczpgZGF0ZWAKK29iamVjdCwgOmNsYXNzOmAuZGF0ZXRpbWVgIGFzc3VtZXMgdGhlIGN1cnJlbnQgR3JlZ29yaWFuIGNhbGVuZGFyIGV4dGVuZGVkIGluCitib3RoIGRpcmVjdGlvbnM7IGxpa2UgYSB0aW1lIG9iamVjdCwgOmNsYXNzOmAuZGF0ZXRpbWVgIGFzc3VtZXMgdGhlcmUgYXJlIGV4YWN0bHkKIDM2MDBcKjI0IHNlY29uZHMgaW4gZXZlcnkgZGF5LgogCiBDb25zdHJ1Y3RvcjoKQEAgLTY0MSw3ICs2NjEsNyBAQAogICAgb3Igbm90IHNwZWNpZmllZCwgdGhpcyBpcyBsaWtlIDptZXRoOmB0b2RheWAsIGJ1dCwgaWYgcG9zc2libGUsIHN1cHBsaWVzIG1vcmUKICAgIHByZWNpc2lvbiB0aGFuIGNhbiBiZSBnb3R0ZW4gZnJvbSBnb2luZyB0aHJvdWdoIGEgOmZ1bmM6YHRpbWUudGltZWAgdGltZXN0YW1wCiAgICAoZm9yIGV4YW1wbGUsIHRoaXMgbWF5IGJlIHBvc3NpYmxlIG9uIHBsYXRmb3JtcyBzdXBwbHlpbmcgdGhlIEMKLSAgIDpjZnVuYzpgZ2V0dGltZW9mZGF5YCBmdW5jdGlvbikuCisgICA6YzpmdW5jOmBnZXR0aW1lb2ZkYXlgIGZ1bmN0aW9uKS4KIAogICAgRWxzZSAqdHoqIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyA6Y2xhc3M6YHR6aW5mb2Agc3ViY2xhc3MsIGFuZCB0aGUKICAgIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBhcmUgY29udmVydGVkIHRvICp0eioncyB0aW1lIHpvbmUuICBJbiB0aGlzIGNhc2UgdGhlCkBAIC02NTMsNyArNjczLDcgQEAKIAogICAgUmV0dXJuIHRoZSBjdXJyZW50IFVUQyBkYXRlIGFuZCB0aW1lLCB3aXRoIDphdHRyOmB0emluZm9gIGBgTm9uZWBgLiBUaGlzIGlzIGxpa2UKICAgIDptZXRoOmBub3dgLCBidXQgcmV0dXJucyB0aGUgY3VycmVudCBVVEMgZGF0ZSBhbmQgdGltZSwgYXMgYSBuYWl2ZQotICAgOmNsYXNzOmBkYXRldGltZWAgb2JqZWN0LiBTZWUgYWxzbyA6bWV0aDpgbm93YC4KKyAgIDpjbGFzczpgLmRhdGV0aW1lYCBvYmplY3QuIFNlZSBhbHNvIDptZXRoOmBub3dgLgogCiAKIC4uIGNsYXNzbWV0aG9kOjogZGF0ZXRpbWUuZnJvbXRpbWVzdGFtcCh0aW1lc3RhbXBbLCB0el0pCkBAIC02NjEsNyArNjgxLDcgQEAKICAgIFJldHVybiB0aGUgbG9jYWwgZGF0ZSBhbmQgdGltZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBQT1NJWCB0aW1lc3RhbXAsIHN1Y2ggYXMgaXMKICAgIHJldHVybmVkIGJ5IDpmdW5jOmB0aW1lLnRpbWVgLiBJZiBvcHRpb25hbCBhcmd1bWVudCAqdHoqIGlzIGBgTm9uZWBgIG9yIG5vdAogICAgc3BlY2lmaWVkLCB0aGUgdGltZXN0YW1wIGlzIGNvbnZlcnRlZCB0byB0aGUgcGxhdGZvcm0ncyBsb2NhbCBkYXRlIGFuZCB0aW1lLCBhbmQKLSAgIHRoZSByZXR1cm5lZCA6Y2xhc3M6YGRhdGV0aW1lYCBvYmplY3QgaXMgbmFpdmUuCisgICB0aGUgcmV0dXJuZWQgOmNsYXNzOmAuZGF0ZXRpbWVgIG9iamVjdCBpcyBuYWl2ZS4KIAogICAgRWxzZSAqdHoqIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyA6Y2xhc3M6YHR6aW5mb2Agc3ViY2xhc3MsIGFuZCB0aGUKICAgIHRpbWVzdGFtcCBpcyBjb252ZXJ0ZWQgdG8gKnR6KidzIHRpbWUgem9uZS4gIEluIHRoaXMgY2FzZSB0aGUgcmVzdWx0IGlzCkBAIC02NjksMjYgKzY4OSwyNiBAQAogICAgYGB0ei5mcm9tdXRjKGRhdGV0aW1lLnV0Y2Zyb210aW1lc3RhbXAodGltZXN0YW1wKS5yZXBsYWNlKHR6aW5mbz10eikpYGAuCiAKICAgIDptZXRoOmBmcm9tdGltZXN0YW1wYCBtYXkgcmFpc2UgOmV4YzpgVmFsdWVFcnJvcmAsIGlmIHRoZSB0aW1lc3RhbXAgaXMgb3V0IG9mCi0gICB0aGUgcmFuZ2Ugb2YgdmFsdWVzIHN1cHBvcnRlZCBieSB0aGUgcGxhdGZvcm0gQyA6Y2Z1bmM6YGxvY2FsdGltZWAgb3IKLSAgIDpjZnVuYzpgZ210aW1lYCBmdW5jdGlvbnMuICBJdCdzIGNvbW1vbiBmb3IgdGhpcyB0byBiZSByZXN0cmljdGVkIHRvIHllYXJzIGluCisgICB0aGUgcmFuZ2Ugb2YgdmFsdWVzIHN1cHBvcnRlZCBieSB0aGUgcGxhdGZvcm0gQyA6YzpmdW5jOmBsb2NhbHRpbWVgIG9yCisgICA6YzpmdW5jOmBnbXRpbWVgIGZ1bmN0aW9ucy4gIEl0J3MgY29tbW9uIGZvciB0aGlzIHRvIGJlIHJlc3RyaWN0ZWQgdG8geWVhcnMgaW4KICAgIDE5NzAgdGhyb3VnaCAyMDM4LiBOb3RlIHRoYXQgb24gbm9uLVBPU0lYIHN5c3RlbXMgdGhhdCBpbmNsdWRlIGxlYXAgc2Vjb25kcyBpbgogICAgdGhlaXIgbm90aW9uIG9mIGEgdGltZXN0YW1wLCBsZWFwIHNlY29uZHMgYXJlIGlnbm9yZWQgYnkgOm1ldGg6YGZyb210aW1lc3RhbXBgLAogICAgYW5kIHRoZW4gaXQncyBwb3NzaWJsZSB0byBoYXZlIHR3byB0aW1lc3RhbXBzIGRpZmZlcmluZyBieSBhIHNlY29uZCB0aGF0IHlpZWxkCi0gICBpZGVudGljYWwgOmNsYXNzOmBkYXRldGltZWAgb2JqZWN0cy4gU2VlIGFsc28gOm1ldGg6YHV0Y2Zyb210aW1lc3RhbXBgLgorICAgaWRlbnRpY2FsIDpjbGFzczpgLmRhdGV0aW1lYCBvYmplY3RzLiBTZWUgYWxzbyA6bWV0aDpgdXRjZnJvbXRpbWVzdGFtcGAuCiAKIAogLi4gY2xhc3NtZXRob2Q6OiBkYXRldGltZS51dGNmcm9tdGltZXN0YW1wKHRpbWVzdGFtcCkKIAotICAgUmV0dXJuIHRoZSBVVEMgOmNsYXNzOmBkYXRldGltZWAgY29ycmVzcG9uZGluZyB0byB0aGUgUE9TSVggdGltZXN0YW1wLCB3aXRoCisgICBSZXR1cm4gdGhlIFVUQyA6Y2xhc3M6YC5kYXRldGltZWAgY29ycmVzcG9uZGluZyB0byB0aGUgUE9TSVggdGltZXN0YW1wLCB3aXRoCiAgICA6YXR0cjpgdHppbmZvYCBgYE5vbmVgYC4gVGhpcyBtYXkgcmFpc2UgOmV4YzpgVmFsdWVFcnJvcmAsIGlmIHRoZSB0aW1lc3RhbXAgaXMKLSAgIG91dCBvZiB0aGUgcmFuZ2Ugb2YgdmFsdWVzIHN1cHBvcnRlZCBieSB0aGUgcGxhdGZvcm0gQyA6Y2Z1bmM6YGdtdGltZWAgZnVuY3Rpb24uCisgICBvdXQgb2YgdGhlIHJhbmdlIG9mIHZhbHVlcyBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtIEMgOmM6ZnVuYzpgZ210aW1lYCBmdW5jdGlvbi4KICAgIEl0J3MgY29tbW9uIGZvciB0aGlzIHRvIGJlIHJlc3RyaWN0ZWQgdG8geWVhcnMgaW4gMTk3MCB0aHJvdWdoIDIwMzguIFNlZSBhbHNvCiAgICA6bWV0aDpgZnJvbXRpbWVzdGFtcGAuCiAKIAogLi4gY2xhc3NtZXRob2Q6OiBkYXRldGltZS5mcm9tb3JkaW5hbChvcmRpbmFsKQogCi0gICBSZXR1cm4gdGhlIDpjbGFzczpgZGF0ZXRpbWVgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb2xlcHRpYyBHcmVnb3JpYW4gb3JkaW5hbCwKKyAgIFJldHVybiB0aGUgOmNsYXNzOmAuZGF0ZXRpbWVgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb2xlcHRpYyBHcmVnb3JpYW4gb3JkaW5hbCwKICAgIHdoZXJlIEphbnVhcnkgMSBvZiB5ZWFyIDEgaGFzIG9yZGluYWwgMS4gOmV4YzpgVmFsdWVFcnJvcmAgaXMgcmFpc2VkIHVubGVzcyBgYDEKICAgIDw9IG9yZGluYWwgPD0gZGF0ZXRpbWUubWF4LnRvb3JkaW5hbCgpYGAuICBUaGUgaG91ciwgbWludXRlLCBzZWNvbmQgYW5kCiAgICBtaWNyb3NlY29uZCBvZiB0aGUgcmVzdWx0IGFyZSBhbGwgMCwgYW5kIDphdHRyOmB0emluZm9gIGlzIGBgTm9uZWBgLgpAQCAtNjk2LDIyICs3MTYsMjMgQEAKIAogLi4gY2xhc3NtZXRob2Q6OiBkYXRldGltZS5jb21iaW5lKGRhdGUsIHRpbWUpCiAKLSAgIFJldHVybiBhIG5ldyA6Y2xhc3M6YGRhdGV0aW1lYCBvYmplY3Qgd2hvc2UgZGF0ZSBjb21wb25lbnRzIGFyZSBlcXVhbCB0byB0aGUKKyAgIFJldHVybiBhIG5ldyA6Y2xhc3M6YC5kYXRldGltZWAgb2JqZWN0IHdob3NlIGRhdGUgY29tcG9uZW50cyBhcmUgZXF1YWwgdG8gdGhlCiAgICBnaXZlbiA6Y2xhc3M6YGRhdGVgIG9iamVjdCdzLCBhbmQgd2hvc2UgdGltZSBjb21wb25lbnRzIGFuZCA6YXR0cjpgdHppbmZvYAotICAgYXR0cmlidXRlcyBhcmUgZXF1YWwgdG8gdGhlIGdpdmVuIDpjbGFzczpgdGltZWAgb2JqZWN0J3MuIEZvciBhbnkKLSAgIDpjbGFzczpgZGF0ZXRpbWVgIG9iamVjdCAqZCosCisgICBhdHRyaWJ1dGVzIGFyZSBlcXVhbCB0byB0aGUgZ2l2ZW4gOmNsYXNzOmAudGltZWAgb2JqZWN0J3MuIEZvciBhbnkKKyAgIDpjbGFzczpgLmRhdGV0aW1lYCBvYmplY3QgKmQqLAogICAgYGBkID09IGRhdGV0aW1lLmNvbWJpbmUoZC5kYXRlKCksIGQudGltZXR6KCkpYGAuICBJZiBkYXRlIGlzIGEKLSAgIDpjbGFzczpgZGF0ZXRpbWVgIG9iamVjdCwgaXRzIHRpbWUgY29tcG9uZW50cyBhbmQgOmF0dHI6YHR6aW5mb2AgYXR0cmlidXRlcworICAgOmNsYXNzOmAuZGF0ZXRpbWVgIG9iamVjdCwgaXRzIHRpbWUgY29tcG9uZW50cyBhbmQgOmF0dHI6YHR6aW5mb2AgYXR0cmlidXRlcwogICAgYXJlIGlnbm9yZWQuCiAKIAogLi4gY2xhc3NtZXRob2Q6OiBkYXRldGltZS5zdHJwdGltZShkYXRlX3N0cmluZywgZm9ybWF0KQogCi0gICBSZXR1cm4gYSA6Y2xhc3M6YGRhdGV0aW1lYCBjb3JyZXNwb25kaW5nIHRvICpkYXRlX3N0cmluZyosIHBhcnNlZCBhY2NvcmRpbmcgdG8KKyAgIFJldHVybiBhIDpjbGFzczpgLmRhdGV0aW1lYCBjb3JyZXNwb25kaW5nIHRvICpkYXRlX3N0cmluZyosIHBhcnNlZCBhY2NvcmRpbmcgdG8KICAgICpmb3JtYXQqLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBgZGF0ZXRpbWUoKih0aW1lLnN0cnB0aW1lKGRhdGVfc3RyaW5nLAogICAgZm9ybWF0KVswOjZdKSlgYC4gOmV4YzpgVmFsdWVFcnJvcmAgaXMgcmFpc2VkIGlmIHRoZSBkYXRlX3N0cmluZyBhbmQgZm9ybWF0CiAgICBjYW4ndCBiZSBwYXJzZWQgYnkgOmZ1bmM6YHRpbWUuc3RycHRpbWVgIG9yIGlmIGl0IHJldHVybnMgYSB2YWx1ZSB3aGljaCBpc24ndCBhCi0gICB0aW1lIHR1cGxlLiBTZWUgc2VjdGlvbiA6cmVmOmBzdHJmdGltZS1zdHJwdGltZS1iZWhhdmlvcmAuCisgICB0aW1lIHR1cGxlLiBGb3IgYSBjb21wbGV0ZSBsaXN0IG9mIGZvcm1hdHRpbmcgZGlyZWN0aXZlcywgc2VlIHNlY3Rpb24KKyAgIDpyZWY6YHN0cmZ0aW1lLXN0cnB0aW1lLWJlaGF2aW9yYC4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi41CiAKQEAgLTcyMCwxOSArNzQxLDE5IEBACiAKIC4uIGF0dHJpYnV0ZTo6IGRhdGV0aW1lLm1pbgogCi0gICBUaGUgZWFybGllc3QgcmVwcmVzZW50YWJsZSA6Y2xhc3M6YGRhdGV0aW1lYCwgYGBkYXRldGltZShNSU5ZRUFSLCAxLCAxLAorICAgVGhlIGVhcmxpZXN0IHJlcHJlc2VudGFibGUgOmNsYXNzOmAuZGF0ZXRpbWVgLCBgYGRhdGV0aW1lKE1JTllFQVIsIDEsIDEsCiAgICB0emluZm89Tm9uZSlgYC4KIAogCiAuLiBhdHRyaWJ1dGU6OiBkYXRldGltZS5tYXgKIAotICAgVGhlIGxhdGVzdCByZXByZXNlbnRhYmxlIDpjbGFzczpgZGF0ZXRpbWVgLCBgYGRhdGV0aW1lKE1BWFlFQVIsIDEyLCAzMSwgMjMsIDU5LAorICAgVGhlIGxhdGVzdCByZXByZXNlbnRhYmxlIDpjbGFzczpgLmRhdGV0aW1lYCwgYGBkYXRldGltZShNQVhZRUFSLCAxMiwgMzEsIDIzLCA1OSwKICAgIDU5LCA5OTk5OTksIHR6aW5mbz1Ob25lKWBgLgogCiAKIC4uIGF0dHJpYnV0ZTo6IGRhdGV0aW1lLnJlc29sdXRpb24KIAotICAgVGhlIHNtYWxsZXN0IHBvc3NpYmxlIGRpZmZlcmVuY2UgYmV0d2VlbiBub24tZXF1YWwgOmNsYXNzOmBkYXRldGltZWAgb2JqZWN0cywKKyAgIFRoZSBzbWFsbGVzdCBwb3NzaWJsZSBkaWZmZXJlbmNlIGJldHdlZW4gbm9uLWVxdWFsIDpjbGFzczpgLmRhdGV0aW1lYCBvYmplY3RzLAogICAgYGB0aW1lZGVsdGEobWljcm9zZWNvbmRzPTEpYGAuCiAKIApAQCAtNzc1LDI0ICs3OTYsMjQgQEAKIAogLi4gYXR0cmlidXRlOjogZGF0ZXRpbWUudHppbmZvCiAKLSAgIFRoZSBvYmplY3QgcGFzc2VkIGFzIHRoZSAqdHppbmZvKiBhcmd1bWVudCB0byB0aGUgOmNsYXNzOmBkYXRldGltZWAgY29uc3RydWN0b3IsCisgICBUaGUgb2JqZWN0IHBhc3NlZCBhcyB0aGUgKnR6aW5mbyogYXJndW1lbnQgdG8gdGhlIDpjbGFzczpgLmRhdGV0aW1lYCBjb25zdHJ1Y3RvciwKICAgIG9yIGBgTm9uZWBgIGlmIG5vbmUgd2FzIHBhc3NlZC4KIAogCiBTdXBwb3J0ZWQgb3BlcmF0aW9uczoKIAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBPcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgfAotKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KwotfCBgYGRhdGV0aW1lMiA9IGRhdGV0aW1lMSArIHRpbWVkZWx0YWBgIHwgXCgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBgYGRhdGV0aW1lMiA9IGRhdGV0aW1lMSAtIHRpbWVkZWx0YWBgIHwgXCgyKSAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBgYHRpbWVkZWx0YSA9IGRhdGV0aW1lMSAtIGRhdGV0aW1lMmBgIHwgXCgzKSAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBgYGRhdGV0aW1lMSA8IGRhdGV0aW1lMmBgICAgICAgICAgICAgIHwgQ29tcGFyZXMgOmNsYXNzOmBkYXRldGltZWAgdG8gfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOmNsYXNzOmBkYXRldGltZWAuICg0KSAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgT3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICB8CisrPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KworfCBgYGRhdGV0aW1lMiA9IGRhdGV0aW1lMSArIHRpbWVkZWx0YWBgIHwgXCgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8IGBgZGF0ZXRpbWUyID0gZGF0ZXRpbWUxIC0gdGltZWRlbHRhYGAgfCBcKDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgYGB0aW1lZGVsdGEgPSBkYXRldGltZTEgLSBkYXRldGltZTJgYCB8IFwoMykgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfCBgYGRhdGV0aW1lMSA8IGRhdGV0aW1lMmBgICAgICAgICAgICAgIHwgQ29tcGFyZXMgOmNsYXNzOmAuZGF0ZXRpbWVgIHRvIHwKK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDpjbGFzczpgLmRhdGV0aW1lYC4gKDQpICAgICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogCiAoMSkKICAgIGRhdGV0aW1lMiBpcyBhIGR1cmF0aW9uIG9mIHRpbWVkZWx0YSByZW1vdmVkIGZyb20gZGF0ZXRpbWUxLCBtb3ZpbmcgZm9yd2FyZCBpbgpAQCAtODExLDcgKzgzMiw3IEBACiAgICBpbiBpc29sYXRpb24gY2FuIG92ZXJmbG93IGluIGNhc2VzIHdoZXJlIGRhdGV0aW1lMSAtIHRpbWVkZWx0YSBkb2VzIG5vdC4KIAogKDMpCi0gICBTdWJ0cmFjdGlvbiBvZiBhIDpjbGFzczpgZGF0ZXRpbWVgIGZyb20gYSA6Y2xhc3M6YGRhdGV0aW1lYCBpcyBkZWZpbmVkIG9ubHkgaWYKKyAgIFN1YnRyYWN0aW9uIG9mIGEgOmNsYXNzOmAuZGF0ZXRpbWVgIGZyb20gYSA6Y2xhc3M6YC5kYXRldGltZWAgaXMgZGVmaW5lZCBvbmx5IGlmCiAgICBib3RoIG9wZXJhbmRzIGFyZSBuYWl2ZSwgb3IgaWYgYm90aCBhcmUgYXdhcmUuICBJZiBvbmUgaXMgYXdhcmUgYW5kIHRoZSBvdGhlciBpcwogICAgbmFpdmUsIDpleGM6YFR5cGVFcnJvcmAgaXMgcmFpc2VkLgogCkBAIC04NDAsMTYgKzg2MSwxNiBAQAogCiAgICAgICBJbiBvcmRlciB0byBzdG9wIGNvbXBhcmlzb24gZnJvbSBmYWxsaW5nIGJhY2sgdG8gdGhlIGRlZmF1bHQgc2NoZW1lIG9mIGNvbXBhcmluZwogICAgICAgb2JqZWN0IGFkZHJlc3NlcywgZGF0ZXRpbWUgY29tcGFyaXNvbiBub3JtYWxseSByYWlzZXMgOmV4YzpgVHlwZUVycm9yYCBpZiB0aGUKLSAgICAgIG90aGVyIGNvbXBhcmFuZCBpc24ndCBhbHNvIGEgOmNsYXNzOmBkYXRldGltZWAgb2JqZWN0LiAgSG93ZXZlciwKKyAgICAgIG90aGVyIGNvbXBhcmFuZCBpc24ndCBhbHNvIGEgOmNsYXNzOmAuZGF0ZXRpbWVgIG9iamVjdC4gIEhvd2V2ZXIsCiAgICAgICBgYE5vdEltcGxlbWVudGVkYGAgaXMgcmV0dXJuZWQgaW5zdGVhZCBpZiB0aGUgb3RoZXIgY29tcGFyYW5kIGhhcyBhCiAgICAgICA6bWV0aDpgdGltZXR1cGxlYCBhdHRyaWJ1dGUuICBUaGlzIGhvb2sgZ2l2ZXMgb3RoZXIga2luZHMgb2YgZGF0ZSBvYmplY3RzIGEKLSAgICAgIGNoYW5jZSBhdCBpbXBsZW1lbnRpbmcgbWl4ZWQtdHlwZSBjb21wYXJpc29uLiAgSWYgbm90LCB3aGVuIGEgOmNsYXNzOmBkYXRldGltZWAKKyAgICAgIGNoYW5jZSBhdCBpbXBsZW1lbnRpbmcgbWl4ZWQtdHlwZSBjb21wYXJpc29uLiAgSWYgbm90LCB3aGVuIGEgOmNsYXNzOmAuZGF0ZXRpbWVgCiAgICAgICBvYmplY3QgaXMgY29tcGFyZWQgdG8gYW4gb2JqZWN0IG9mIGEgZGlmZmVyZW50IHR5cGUsIDpleGM6YFR5cGVFcnJvcmAgaXMgcmFpc2VkCiAgICAgICB1bmxlc3MgdGhlIGNvbXBhcmlzb24gaXMgYGA9PWBgIG9yIGBgIT1gYC4gIFRoZSBsYXR0ZXIgY2FzZXMgcmV0dXJuCiAgICAgICA6Y29uc3Q6YEZhbHNlYCBvciA6Y29uc3Q6YFRydWVgLCByZXNwZWN0aXZlbHkuCiAKLTpjbGFzczpgZGF0ZXRpbWVgIG9iamVjdHMgY2FuIGJlIHVzZWQgYXMgZGljdGlvbmFyeSBrZXlzLiBJbiBCb29sZWFuIGNvbnRleHRzLAotYWxsIDpjbGFzczpgZGF0ZXRpbWVgIG9iamVjdHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgdHJ1ZS4KKzpjbGFzczpgLmRhdGV0aW1lYCBvYmplY3RzIGNhbiBiZSB1c2VkIGFzIGRpY3Rpb25hcnkga2V5cy4gSW4gQm9vbGVhbiBjb250ZXh0cywKK2FsbCA6Y2xhc3M6YC5kYXRldGltZWAgb2JqZWN0cyBhcmUgY29uc2lkZXJlZCB0byBiZSB0cnVlLgogCiBJbnN0YW5jZSBtZXRob2RzOgogCkBAIC04NjAsMTMgKzg4MSwxMyBAQAogCiAuLiBtZXRob2Q6OiBkYXRldGltZS50aW1lKCkKIAotICAgUmV0dXJuIDpjbGFzczpgdGltZWAgb2JqZWN0IHdpdGggc2FtZSBob3VyLCBtaW51dGUsIHNlY29uZCBhbmQgbWljcm9zZWNvbmQuCisgICBSZXR1cm4gOmNsYXNzOmAudGltZWAgb2JqZWN0IHdpdGggc2FtZSBob3VyLCBtaW51dGUsIHNlY29uZCBhbmQgbWljcm9zZWNvbmQuCiAgICA6YXR0cjpgdHppbmZvYCBpcyBgYE5vbmVgYC4gIFNlZSBhbHNvIG1ldGhvZCA6bWV0aDpgdGltZXR6YC4KIAogCiAuLiBtZXRob2Q6OiBkYXRldGltZS50aW1ldHooKQogCi0gICBSZXR1cm4gOmNsYXNzOmB0aW1lYCBvYmplY3Qgd2l0aCBzYW1lIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCwgYW5kCisgICBSZXR1cm4gOmNsYXNzOmAudGltZWAgb2JqZWN0IHdpdGggc2FtZSBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQsIGFuZAogICAgdHppbmZvIGF0dHJpYnV0ZXMuICBTZWUgYWxzbyBtZXRob2QgOm1ldGg6YHRpbWVgLgogCiAKQEAgLTg4MCw3ICs5MDEsNyBAQAogCiAuLiBtZXRob2Q6OiBkYXRldGltZS5hc3RpbWV6b25lKHR6KQogCi0gICBSZXR1cm4gYSA6Y2xhc3M6YGRhdGV0aW1lYCBvYmplY3Qgd2l0aCBuZXcgOmF0dHI6YHR6aW5mb2AgYXR0cmlidXRlICp0eiosCisgICBSZXR1cm4gYSA6Y2xhc3M6YC5kYXRldGltZWAgb2JqZWN0IHdpdGggbmV3IDphdHRyOmB0emluZm9gIGF0dHJpYnV0ZSAqdHoqLAogICAgYWRqdXN0aW5nIHRoZSBkYXRlIGFuZCB0aW1lIGRhdGEgc28gdGhlIHJlc3VsdCBpcyB0aGUgc2FtZSBVVEMgdGltZSBhcwogICAgKnNlbGYqLCBidXQgaW4gKnR6KidzIGxvY2FsIHRpbWUuCiAKQEAgLTk1NCw3ICs5NzUsNyBAQAogCiAuLiBtZXRob2Q6OiBkYXRldGltZS51dGN0aW1ldHVwbGUoKQogCi0gICBJZiA6Y2xhc3M6YGRhdGV0aW1lYCBpbnN0YW5jZSAqZCogaXMgbmFpdmUsIHRoaXMgaXMgdGhlIHNhbWUgYXMKKyAgIElmIDpjbGFzczpgLmRhdGV0aW1lYCBpbnN0YW5jZSAqZCogaXMgbmFpdmUsIHRoaXMgaXMgdGhlIHNhbWUgYXMKICAgIGBgZC50aW1ldHVwbGUoKWBgIGV4Y2VwdCB0aGF0IDphdHRyOmB0bV9pc2RzdGAgaXMgZm9yY2VkIHRvIDAgcmVnYXJkbGVzcyBvZiB3aGF0CiAgICBgYGQuZHN0KClgYCByZXR1cm5zLiAgRFNUIGlzIG5ldmVyIGluIGVmZmVjdCBmb3IgYSBVVEMgdGltZS4KIApAQCAtMTAxNSw3ICsxMDM2LDcgQEAKIAogLi4gbWV0aG9kOjogZGF0ZXRpbWUuX19zdHJfXygpCiAKLSAgIEZvciBhIDpjbGFzczpgZGF0ZXRpbWVgIGluc3RhbmNlICpkKiwgYGBzdHIoZClgYCBpcyBlcXVpdmFsZW50IHRvCisgICBGb3IgYSA6Y2xhc3M6YC5kYXRldGltZWAgaW5zdGFuY2UgKmQqLCBgYHN0cihkKWBgIGlzIGVxdWl2YWxlbnQgdG8KICAgIGBgZC5pc29mb3JtYXQoJyAnKWBgLgogCiAKQEAgLTEwMjQsMTQgKzEwNDUsMjIgQEAKICAgIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRhdGUgYW5kIHRpbWUsIGZvciBleGFtcGxlIGBgZGF0ZXRpbWUoMjAwMiwgMTIsCiAgICA0LCAyMCwgMzAsIDQwKS5jdGltZSgpID09ICdXZWQgRGVjICA0IDIwOjMwOjQwIDIwMDInYGAuIGBgZC5jdGltZSgpYGAgaXMKICAgIGVxdWl2YWxlbnQgdG8gYGB0aW1lLmN0aW1lKHRpbWUubWt0aW1lKGQudGltZXR1cGxlKCkpKWBgIG9uIHBsYXRmb3JtcyB3aGVyZSB0aGUKLSAgIG5hdGl2ZSBDIDpjZnVuYzpgY3RpbWVgIGZ1bmN0aW9uICh3aGljaCA6ZnVuYzpgdGltZS5jdGltZWAgaW52b2tlcywgYnV0IHdoaWNoCisgICBuYXRpdmUgQyA6YzpmdW5jOmBjdGltZWAgZnVuY3Rpb24gKHdoaWNoIDpmdW5jOmB0aW1lLmN0aW1lYCBpbnZva2VzLCBidXQgd2hpY2gKICAgIDptZXRoOmBkYXRldGltZS5jdGltZWAgZG9lcyBub3QgaW52b2tlKSBjb25mb3JtcyB0byB0aGUgQyBzdGFuZGFyZC4KIAogCiAuLiBtZXRob2Q6OiBkYXRldGltZS5zdHJmdGltZShmb3JtYXQpCiAKICAgIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRhdGUgYW5kIHRpbWUsIGNvbnRyb2xsZWQgYnkgYW4gZXhwbGljaXQgZm9ybWF0Ci0gICBzdHJpbmcuICBTZWUgc2VjdGlvbiA6cmVmOmBzdHJmdGltZS1zdHJwdGltZS1iZWhhdmlvcmAuCisgICBzdHJpbmcuICBGb3IgYSBjb21wbGV0ZSBsaXN0IG9mIGZvcm1hdHRpbmcgZGlyZWN0aXZlcywgc2VlIHNlY3Rpb24KKyAgIDpyZWY6YHN0cmZ0aW1lLXN0cnB0aW1lLWJlaGF2aW9yYC4KKworCisuLiBtZXRob2Q6OiBkYXRldGltZS5fX2Zvcm1hdF9fKGZvcm1hdCkKKworICAgU2FtZSBhcyA6bWV0aDpgLmRhdGV0aW1lLnN0cmZ0aW1lYC4gIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gc3BlY2lmeSBmb3JtYXQKKyAgIHN0cmluZyBmb3IgYSA6Y2xhc3M6YC5kYXRldGltZWAgb2JqZWN0IHdoZW4gdXNpbmcgOm1ldGg6YHN0ci5mb3JtYXRgLgorICAgU2VlIHNlY3Rpb24gOnJlZjpgc3RyZnRpbWUtc3RycHRpbWUtYmVoYXZpb3JgLgogCiAKIEV4YW1wbGVzIG9mIHdvcmtpbmcgd2l0aCBkYXRldGltZSBvYmplY3RzOgpAQCAtMTA3OCwxOSArMTEwNywyMSBAQAogICAgID4+PiAjIEZvcm1hdHRpbmcgZGF0ZXRpbWUKICAgICA+Pj4gZHQuc3RyZnRpbWUoIiVBLCAlZC4gJUIgJVkgJUk6JU0lcCIpCiAgICAgJ1R1ZXNkYXksIDIxLiBOb3ZlbWJlciAyMDA2IDA0OjMwUE0nCisgICAgPj4+ICdUaGUgezF9IGlzIHswOiVkfSwgdGhlIHsyfSBpcyB7MDolQn0sIHRoZSB7M30gaXMgezA6JUk6JU0lcH0uJy5mb3JtYXQoZHQsICJkYXkiLCAibW9udGgiLCAidGltZSIpCisgICAgJ1RoZSBkYXkgaXMgMjEsIHRoZSBtb250aCBpcyBOb3ZlbWJlciwgdGhlIHRpbWUgaXMgMDQ6MzBQTS4nCiAKIFVzaW5nIGRhdGV0aW1lIHdpdGggdHppbmZvOgogCiAgICAgPj4+IGZyb20gZGF0ZXRpbWUgaW1wb3J0IHRpbWVkZWx0YSwgZGF0ZXRpbWUsIHR6aW5mbwogICAgID4+PiBjbGFzcyBHTVQxKHR6aW5mbyk6Ci0gICAgLi4uICAgICBkZWYgX19pbml0X18oc2VsZik6ICAgICAgICAgIyBEU1Qgc3RhcnRzIGxhc3QgU3VuZGF5IGluIE1hcmNoCisgICAgLi4uICAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KToKKyAgICAuLi4gICAgICAgICByZXR1cm4gdGltZWRlbHRhKGhvdXJzPTEpICsgc2VsZi5kc3QoZHQpCisgICAgLi4uICAgICBkZWYgZHN0KHNlbGYsIGR0KToKKyAgICAuLi4gICAgICAgICAjIERTVCBzdGFydHMgbGFzdCBTdW5kYXkgaW4gTWFyY2gKICAgICAuLi4gICAgICAgICBkID0gZGF0ZXRpbWUoZHQueWVhciwgNCwgMSkgICAjIGVuZHMgbGFzdCBTdW5kYXkgaW4gT2N0b2JlcgogICAgIC4uLiAgICAgICAgIHNlbGYuZHN0b24gPSBkIC0gdGltZWRlbHRhKGRheXM9ZC53ZWVrZGF5KCkgKyAxKQogICAgIC4uLiAgICAgICAgIGQgPSBkYXRldGltZShkdC55ZWFyLCAxMSwgMSkKICAgICAuLi4gICAgICAgICBzZWxmLmRzdG9mZiA9IGQgLSB0aW1lZGVsdGEoZGF5cz1kLndlZWtkYXkoKSArIDEpCi0gICAgLi4uICAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KToKLSAgICAuLi4gICAgICAgICByZXR1cm4gdGltZWRlbHRhKGhvdXJzPTEpICsgc2VsZi5kc3QoZHQpCi0gICAgLi4uICAgICBkZWYgZHN0KHNlbGYsIGR0KToKICAgICAuLi4gICAgICAgICBpZiBzZWxmLmRzdG9uIDw9ICBkdC5yZXBsYWNlKHR6aW5mbz1Ob25lKSA8IHNlbGYuZHN0b2ZmOgogICAgIC4uLiAgICAgICAgICAgICByZXR1cm4gdGltZWRlbHRhKGhvdXJzPTEpCiAgICAgLi4uICAgICAgICAgZWxzZToKQEAgLTEwOTksMTYgKzExMzAsMTUgQEAKICAgICAuLi4gICAgICAgICAgcmV0dXJuICJHTVQgKzEiCiAgICAgLi4uCiAgICAgPj4+IGNsYXNzIEdNVDIodHppbmZvKToKLSAgICAuLi4gICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAuLi4gICAgIGRlZiB1dGNvZmZzZXQoc2VsZiwgZHQpOgorICAgIC4uLiAgICAgICAgIHJldHVybiB0aW1lZGVsdGEoaG91cnM9MikgKyBzZWxmLmRzdChkdCkKKyAgICAuLi4gICAgIGRlZiBkc3Qoc2VsZiwgZHQpOgogICAgIC4uLiAgICAgICAgIGQgPSBkYXRldGltZShkdC55ZWFyLCA0LCAxKQogICAgIC4uLiAgICAgICAgIHNlbGYuZHN0b24gPSBkIC0gdGltZWRlbHRhKGRheXM9ZC53ZWVrZGF5KCkgKyAxKQogICAgIC4uLiAgICAgICAgIGQgPSBkYXRldGltZShkdC55ZWFyLCAxMSwgMSkKICAgICAuLi4gICAgICAgICBzZWxmLmRzdG9mZiA9IGQgLSB0aW1lZGVsdGEoZGF5cz1kLndlZWtkYXkoKSArIDEpCi0gICAgLi4uICAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KToKLSAgICAuLi4gICAgICAgICByZXR1cm4gdGltZWRlbHRhKGhvdXJzPTEpICsgc2VsZi5kc3QoZHQpCi0gICAgLi4uICAgICBkZWYgZHN0KHNlbGYsIGR0KToKICAgICAuLi4gICAgICAgICBpZiBzZWxmLmRzdG9uIDw9ICBkdC5yZXBsYWNlKHR6aW5mbz1Ob25lKSA8IHNlbGYuZHN0b2ZmOgotICAgIC4uLiAgICAgICAgICAgICByZXR1cm4gdGltZWRlbHRhKGhvdXJzPTIpCisgICAgLi4uICAgICAgICAgICAgIHJldHVybiB0aW1lZGVsdGEoaG91cnM9MSkKICAgICAuLi4gICAgICAgICBlbHNlOgogICAgIC4uLiAgICAgICAgICAgICByZXR1cm4gdGltZWRlbHRhKDApCiAgICAgLi4uICAgICBkZWYgdHpuYW1lKHNlbGYsZHQpOgpAQCAtMTE0NSw3ICsxMTc1LDcgQEAKIEEgdGltZSBvYmplY3QgcmVwcmVzZW50cyBhIChsb2NhbCkgdGltZSBvZiBkYXksIGluZGVwZW5kZW50IG9mIGFueSBwYXJ0aWN1bGFyCiBkYXksIGFuZCBzdWJqZWN0IHRvIGFkanVzdG1lbnQgdmlhIGEgOmNsYXNzOmB0emluZm9gIG9iamVjdC4KIAotLi4gY2xhc3M6OiB0aW1lKGhvdXJbLCBtaW51dGVbLCBzZWNvbmRbLCBtaWNyb3NlY29uZFssIHR6aW5mb11dXV0pCisuLiBjbGFzczo6IHRpbWUoW2hvdXJbLCBtaW51dGVbLCBzZWNvbmRbLCBtaWNyb3NlY29uZFssIHR6aW5mb11dXV1dKQogCiAgICBBbGwgYXJndW1lbnRzIGFyZSBvcHRpb25hbC4gICp0emluZm8qIG1heSBiZSBgYE5vbmVgYCwgb3IgYW4gaW5zdGFuY2Ugb2YgYQogICAgOmNsYXNzOmB0emluZm9gIHN1YmNsYXNzLiAgVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgbWF5IGJlIGludHMgb3IgbG9uZ3MsIGluIHRoZQpAQCAtMTIwOSw3ICsxMjM5LDcgQEAKIAogU3VwcG9ydGVkIG9wZXJhdGlvbnM6CiAKLSogY29tcGFyaXNvbiBvZiA6Y2xhc3M6YHRpbWVgIHRvIDpjbGFzczpgdGltZWAsIHdoZXJlICphKiBpcyBjb25zaWRlcmVkIGxlc3MKKyogY29tcGFyaXNvbiBvZiA6Y2xhc3M6YC50aW1lYCB0byA6Y2xhc3M6YC50aW1lYCwgd2hlcmUgKmEqIGlzIGNvbnNpZGVyZWQgbGVzcwogICB0aGFuICpiKiB3aGVuICphKiBwcmVjZWRlcyAqYiogaW4gdGltZS4gIElmIG9uZSBjb21wYXJhbmQgaXMgbmFpdmUgYW5kIHRoZSBvdGhlcgogICBpcyBhd2FyZSwgOmV4YzpgVHlwZUVycm9yYCBpcyByYWlzZWQuICBJZiBib3RoIGNvbXBhcmFuZHMgYXJlIGF3YXJlLCBhbmQgaGF2ZQogICB0aGUgc2FtZSA6YXR0cjpgdHppbmZvYCBhdHRyaWJ1dGUsIHRoZSBjb21tb24gOmF0dHI6YHR6aW5mb2AgYXR0cmlidXRlIGlzCkBAIC0xMjE3LDcgKzEyNDcsNyBAQAogICBoYXZlIGRpZmZlcmVudCA6YXR0cjpgdHppbmZvYCBhdHRyaWJ1dGVzLCB0aGUgY29tcGFyYW5kcyBhcmUgZmlyc3QgYWRqdXN0ZWQgYnkKICAgc3VidHJhY3RpbmcgdGhlaXIgVVRDIG9mZnNldHMgKG9idGFpbmVkIGZyb20gYGBzZWxmLnV0Y29mZnNldCgpYGApLiBJbiBvcmRlcgogICB0byBzdG9wIG1peGVkLXR5cGUgY29tcGFyaXNvbnMgZnJvbSBmYWxsaW5nIGJhY2sgdG8gdGhlIGRlZmF1bHQgY29tcGFyaXNvbiBieQotICBvYmplY3QgYWRkcmVzcywgd2hlbiBhIDpjbGFzczpgdGltZWAgb2JqZWN0IGlzIGNvbXBhcmVkIHRvIGFuIG9iamVjdCBvZiBhCisgIG9iamVjdCBhZGRyZXNzLCB3aGVuIGEgOmNsYXNzOmAudGltZWAgb2JqZWN0IGlzIGNvbXBhcmVkIHRvIGFuIG9iamVjdCBvZiBhCiAgIGRpZmZlcmVudCB0eXBlLCA6ZXhjOmBUeXBlRXJyb3JgIGlzIHJhaXNlZCB1bmxlc3MgdGhlIGNvbXBhcmlzb24gaXMgYGA9PWBgIG9yCiAgIGBgIT1gYC4gIFRoZSBsYXR0ZXIgY2FzZXMgcmV0dXJuIDpjb25zdDpgRmFsc2VgIG9yIDpjb25zdDpgVHJ1ZWAsIHJlc3BlY3RpdmVseS4KIApAQCAtMTIyNSw3ICsxMjU1LDcgQEAKIAogKiBlZmZpY2llbnQgcGlja2xpbmcKIAotKiBpbiBCb29sZWFuIGNvbnRleHRzLCBhIDpjbGFzczpgdGltZWAgb2JqZWN0IGlzIGNvbnNpZGVyZWQgdG8gYmUgdHJ1ZSBpZiBhbmQKKyogaW4gQm9vbGVhbiBjb250ZXh0cywgYSA6Y2xhc3M6YC50aW1lYCBvYmplY3QgaXMgY29uc2lkZXJlZCB0byBiZSB0cnVlIGlmIGFuZAogICBvbmx5IGlmLCBhZnRlciBjb252ZXJ0aW5nIGl0IHRvIG1pbnV0ZXMgYW5kIHN1YnRyYWN0aW5nIDptZXRoOmB1dGNvZmZzZXRgIChvcgogICBgYDBgYCBpZiB0aGF0J3MgYGBOb25lYGApLCB0aGUgcmVzdWx0IGlzIG5vbi16ZXJvLgogCkBAIC0xMjU2LDYgKzEyODYsMTQgQEAKIC4uIG1ldGhvZDo6IHRpbWUuc3RyZnRpbWUoZm9ybWF0KQogCiAgICBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0aW1lLCBjb250cm9sbGVkIGJ5IGFuIGV4cGxpY2l0IGZvcm1hdCBzdHJpbmcuCisgICBGb3IgYSBjb21wbGV0ZSBsaXN0IG9mIGZvcm1hdHRpbmcgZGlyZWN0aXZlcywgc2VlIHNlY3Rpb24KKyAgIDpyZWY6YHN0cmZ0aW1lLXN0cnB0aW1lLWJlaGF2aW9yYC4KKworCisuLiBtZXRob2Q6OiB0aW1lLl9fZm9ybWF0X18oZm9ybWF0KQorCisgICBTYW1lIGFzIDptZXRoOmAudGltZS5zdHJmdGltZWAuIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gc3BlY2lmeSBmb3JtYXQgc3RyaW5nCisgICBmb3IgYSA6Y2xhc3M6YC50aW1lYCBvYmplY3Qgd2hlbiB1c2luZyA6bWV0aDpgc3RyLmZvcm1hdGAuCiAgICBTZWUgc2VjdGlvbiA6cmVmOmBzdHJmdGltZS1zdHJwdGltZS1iZWhhdmlvcmAuCiAKIApAQCAtMTMwNSw2ICsxMzQzLDggQEAKICAgICAnRXVyb3BlL1ByYWd1ZScKICAgICA+Pj4gdC5zdHJmdGltZSgiJUg6JU06JVMgJVoiKQogICAgICcxMjoxMDozMCBFdXJvcGUvUHJhZ3VlJworICAgID4+PiAnVGhlIHt9IGlzIHs6JUg6JU19LicuZm9ybWF0KCJ0aW1lIiwgdCkKKyAgICAnVGhlIHRpbWUgaXMgMTI6MTAuJwogCiAKIC4uIF9kYXRldGltZS10emluZm86CkBAIC0xMzE1LDExICsxMzU1LDExIEBACiA6Y2xhc3M6YHR6aW5mb2AgaXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcywgbWVhbmluZyB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZQogaW5zdGFudGlhdGVkIGRpcmVjdGx5LiAgWW91IG5lZWQgdG8gZGVyaXZlIGEgY29uY3JldGUgc3ViY2xhc3MsIGFuZCAoYXQgbGVhc3QpCiBzdXBwbHkgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBzdGFuZGFyZCA6Y2xhc3M6YHR6aW5mb2AgbWV0aG9kcyBuZWVkZWQgYnkgdGhlCi06Y2xhc3M6YGRhdGV0aW1lYCBtZXRob2RzIHlvdSB1c2UuICBUaGUgOm1vZDpgZGF0ZXRpbWVgIG1vZHVsZSBkb2VzIG5vdCBzdXBwbHkKKzpjbGFzczpgLmRhdGV0aW1lYCBtZXRob2RzIHlvdSB1c2UuICBUaGUgOm1vZDpgZGF0ZXRpbWVgIG1vZHVsZSBkb2VzIG5vdCBzdXBwbHkKIGFueSBjb25jcmV0ZSBzdWJjbGFzc2VzIG9mIDpjbGFzczpgdHppbmZvYC4KIAogQW4gaW5zdGFuY2Ugb2YgKGEgY29uY3JldGUgc3ViY2xhc3Mgb2YpIDpjbGFzczpgdHppbmZvYCBjYW4gYmUgcGFzc2VkIHRvIHRoZQotY29uc3RydWN0b3JzIGZvciA6Y2xhc3M6YGRhdGV0aW1lYCBhbmQgOmNsYXNzOmB0aW1lYCBvYmplY3RzLiBUaGUgbGF0dGVyIG9iamVjdHMKK2NvbnN0cnVjdG9ycyBmb3IgOmNsYXNzOmAuZGF0ZXRpbWVgIGFuZCA6Y2xhc3M6YC50aW1lYCBvYmplY3RzLiBUaGUgbGF0dGVyIG9iamVjdHMKIHZpZXcgdGhlaXIgYXR0cmlidXRlcyBhcyBiZWluZyBpbiBsb2NhbCB0aW1lLCBhbmQgdGhlIDpjbGFzczpgdHppbmZvYCBvYmplY3QKIHN1cHBvcnRzIG1ldGhvZHMgcmV2ZWFsaW5nIG9mZnNldCBvZiBsb2NhbCB0aW1lIGZyb20gVVRDLCB0aGUgbmFtZSBvZiB0aGUgdGltZQogem9uZSwgYW5kIERTVCBvZmZzZXQsIGFsbCByZWxhdGl2ZSB0byBhIGRhdGUgb3IgdGltZSBvYmplY3QgcGFzc2VkIHRvIHRoZW0uCkBAIC0xMzc0LDcgKzE0MTQsNyBAQAogCiAgICBgYHR6LnV0Y29mZnNldChkdCkgLSB0ei5kc3QoZHQpYGAKIAotICAgbXVzdCByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvciBldmVyeSA6Y2xhc3M6YGRhdGV0aW1lYCAqZHQqIHdpdGggYGBkdC50emluZm8gPT0KKyAgIG11c3QgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgZXZlcnkgOmNsYXNzOmAuZGF0ZXRpbWVgICpkdCogd2l0aCBgYGR0LnR6aW5mbyA9PQogICAgdHpgYCAgRm9yIHNhbmUgOmNsYXNzOmB0emluZm9gIHN1YmNsYXNzZXMsIHRoaXMgZXhwcmVzc2lvbiB5aWVsZHMgdGhlIHRpbWUKICAgIHpvbmUncyAic3RhbmRhcmQgb2Zmc2V0Iiwgd2hpY2ggc2hvdWxkIG5vdCBkZXBlbmQgb24gdGhlIGRhdGUgb3IgdGhlIHRpbWUsIGJ1dAogICAgb25seSBvbiBnZW9ncmFwaGljIGxvY2F0aW9uLiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIDptZXRoOmBkYXRldGltZS5hc3RpbWV6b25lYApAQCAtMTQwNiw3ICsxNDQ2LDcgQEAKIAogLi4gbWV0aG9kOjogdHppbmZvLnR6bmFtZShzZWxmLCBkdCkKIAotICAgUmV0dXJuIHRoZSB0aW1lIHpvbmUgbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSA6Y2xhc3M6YGRhdGV0aW1lYCBvYmplY3QgKmR0KiwgYXMKKyAgIFJldHVybiB0aGUgdGltZSB6b25lIG5hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgOmNsYXNzOmAuZGF0ZXRpbWVgIG9iamVjdCAqZHQqLCBhcwogICAgYSBzdHJpbmcuIE5vdGhpbmcgYWJvdXQgc3RyaW5nIG5hbWVzIGlzIGRlZmluZWQgYnkgdGhlIDptb2Q6YGRhdGV0aW1lYCBtb2R1bGUsCiAgICBhbmQgdGhlcmUncyBubyByZXF1aXJlbWVudCB0aGF0IGl0IG1lYW4gYW55dGhpbmcgaW4gcGFydGljdWxhci4gIEZvciBleGFtcGxlLAogICAgIkdNVCIsICJVVEMiLCAiLTUwMCIsICItNTowMCIsICJFRFQiLCAiVVMvRWFzdGVybiIsICJBbWVyaWNhL05ldyBZb3JrIiBhcmUgYWxsCkBAIC0xNDE5LDExICsxNDU5LDExIEBACiAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiA6bWV0aDpgdHpuYW1lYCByYWlzZXMgOmV4YzpgTm90SW1wbGVtZW50ZWRFcnJvcmAuCiAKIAotVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIGJ5IGEgOmNsYXNzOmBkYXRldGltZWAgb3IgOmNsYXNzOmB0aW1lYCBvYmplY3QsIGluCi1yZXNwb25zZSB0byB0aGVpciBtZXRob2RzIG9mIHRoZSBzYW1lIG5hbWVzLiAgQSA6Y2xhc3M6YGRhdGV0aW1lYCBvYmplY3QgcGFzc2VzCi1pdHNlbGYgYXMgdGhlIGFyZ3VtZW50LCBhbmQgYSA6Y2xhc3M6YHRpbWVgIG9iamVjdCBwYXNzZXMgYGBOb25lYGAgYXMgdGhlCitUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgYnkgYSA6Y2xhc3M6YC5kYXRldGltZWAgb3IgOmNsYXNzOmAudGltZWAgb2JqZWN0LCBpbgorcmVzcG9uc2UgdG8gdGhlaXIgbWV0aG9kcyBvZiB0aGUgc2FtZSBuYW1lcy4gIEEgOmNsYXNzOmAuZGF0ZXRpbWVgIG9iamVjdCBwYXNzZXMKK2l0c2VsZiBhcyB0aGUgYXJndW1lbnQsIGFuZCBhIDpjbGFzczpgLnRpbWVgIG9iamVjdCBwYXNzZXMgYGBOb25lYGAgYXMgdGhlCiBhcmd1bWVudC4gIEEgOmNsYXNzOmB0emluZm9gIHN1YmNsYXNzJ3MgbWV0aG9kcyBzaG91bGQgdGhlcmVmb3JlIGJlIHByZXBhcmVkIHRvCi1hY2NlcHQgYSAqZHQqIGFyZ3VtZW50IG9mIGBgTm9uZWBgLCBvciBvZiBjbGFzcyA6Y2xhc3M6YGRhdGV0aW1lYC4KK2FjY2VwdCBhICpkdCogYXJndW1lbnQgb2YgYGBOb25lYGAsIG9yIG9mIGNsYXNzIDpjbGFzczpgLmRhdGV0aW1lYC4KIAogV2hlbiBgYE5vbmVgYCBpcyBwYXNzZWQsIGl0J3MgdXAgdG8gdGhlIGNsYXNzIGRlc2lnbmVyIHRvIGRlY2lkZSB0aGUgYmVzdAogcmVzcG9uc2UuICBGb3IgZXhhbXBsZSwgcmV0dXJuaW5nIGBgTm9uZWBgIGlzIGFwcHJvcHJpYXRlIGlmIHRoZSBjbGFzcyB3aXNoZXMgdG8KQEAgLTE0MzEsNyArMTQ3MSw3IEBACiBtYXkgYmUgbW9yZSB1c2VmdWwgZm9yIGBgdXRjb2Zmc2V0KE5vbmUpYGAgdG8gcmV0dXJuIHRoZSBzdGFuZGFyZCBVVEMgb2Zmc2V0LCBhcwogdGhlcmUgaXMgbm8gb3RoZXIgY29udmVudGlvbiBmb3IgZGlzY292ZXJpbmcgdGhlIHN0YW5kYXJkIG9mZnNldC4KIAotV2hlbiBhIDpjbGFzczpgZGF0ZXRpbWVgIG9iamVjdCBpcyBwYXNzZWQgaW4gcmVzcG9uc2UgdG8gYSA6Y2xhc3M6YGRhdGV0aW1lYAorV2hlbiBhIDpjbGFzczpgLmRhdGV0aW1lYCBvYmplY3QgaXMgcGFzc2VkIGluIHJlc3BvbnNlIHRvIGEgOmNsYXNzOmAuZGF0ZXRpbWVgCiBtZXRob2QsIGBgZHQudHppbmZvYGAgaXMgdGhlIHNhbWUgb2JqZWN0IGFzICpzZWxmKi4gIDpjbGFzczpgdHppbmZvYCBtZXRob2RzIGNhbgogcmVseSBvbiB0aGlzLCB1bmxlc3MgdXNlciBjb2RlIGNhbGxzIDpjbGFzczpgdHppbmZvYCBtZXRob2RzIGRpcmVjdGx5LiAgVGhlCiBpbnRlbnQgaXMgdGhhdCB0aGUgOmNsYXNzOmB0emluZm9gIG1ldGhvZHMgaW50ZXJwcmV0ICpkdCogYXMgYmVpbmcgaW4gbG9jYWwKQEAgLTE1MjEsMjQgKzE1NjEsMzkgQEAKIG90aGVyIGZpeGVkLW9mZnNldCA6Y2xhc3M6YHR6aW5mb2Agc3ViY2xhc3MgKHN1Y2ggYXMgYSBjbGFzcyByZXByZXNlbnRpbmcgb25seQogRVNUIChmaXhlZCBvZmZzZXQgLTUgaG91cnMpLCBvciBvbmx5IEVEVCAoZml4ZWQgb2Zmc2V0IC00IGhvdXJzKSkuCiAKKy4uIHNlZWFsc286OgorCisgICBgcHl0eiA8aHR0cDovL3B5cGkucHl0aG9uLm9yZy9weXBpL3B5dHovPmBfCisgICAgICBUaGUgc3RhbmRhcmQgbGlicmFyeSBoYXMgbm8gOmNsYXNzOmB0emluZm9gIGluc3RhbmNlcywgYnV0CisgICAgICB0aGVyZSBleGlzdHMgYSB0aGlyZC1wYXJ0eSBsaWJyYXJ5IHdoaWNoIGJyaW5ncyB0aGUgKklBTkEgdGltZXpvbmUKKyAgICAgIGRhdGFiYXNlKiAoYWxzbyBrbm93biBhcyB0aGUgT2xzb24gZGF0YWJhc2UpIHRvIFB5dGhvbjogKnB5dHoqLgorCisgICAgICAqcHl0eiogY29udGFpbnMgdXAtdG8tZGF0ZSBpbmZvcm1hdGlvbiBhbmQgaXRzIHVzYWdlIGlzIHJlY29tbWVuZGVkLgorCisgICBgSUFOQSB0aW1lem9uZSBkYXRhYmFzZSA8aHR0cDovL3d3dy5pYW5hLm9yZy90aW1lLXpvbmVzPmBfCisgICAgICBUaGUgVGltZSBab25lIERhdGFiYXNlIChvZnRlbiBjYWxsZWQgdHogb3Igem9uZWluZm8pIGNvbnRhaW5zIGNvZGUgYW5kCisgICAgICBkYXRhIHRoYXQgcmVwcmVzZW50IHRoZSBoaXN0b3J5IG9mIGxvY2FsIHRpbWUgZm9yIG1hbnkgcmVwcmVzZW50YXRpdmUKKyAgICAgIGxvY2F0aW9ucyBhcm91bmQgdGhlIGdsb2JlLiBJdCBpcyB1cGRhdGVkIHBlcmlvZGljYWxseSB0byByZWZsZWN0IGNoYW5nZXMKKyAgICAgIG1hZGUgYnkgcG9saXRpY2FsIGJvZGllcyB0byB0aW1lIHpvbmUgYm91bmRhcmllcywgVVRDIG9mZnNldHMsIGFuZAorICAgICAgZGF5bGlnaHQtc2F2aW5nIHJ1bGVzLgogCiAuLiBfc3RyZnRpbWUtc3RycHRpbWUtYmVoYXZpb3I6CiAKIDptZXRoOmBzdHJmdGltZWAgYW5kIDptZXRoOmBzdHJwdGltZWAgQmVoYXZpb3IKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotOmNsYXNzOmBkYXRlYCwgOmNsYXNzOmBkYXRldGltZWAsIGFuZCA6Y2xhc3M6YHRpbWVgIG9iamVjdHMgYWxsIHN1cHBvcnQgYQorOmNsYXNzOmBkYXRlYCwgOmNsYXNzOmAuZGF0ZXRpbWVgLCBhbmQgOmNsYXNzOmAudGltZWAgb2JqZWN0cyBhbGwgc3VwcG9ydCBhCiBgYHN0cmZ0aW1lKGZvcm1hdClgYCBtZXRob2QsIHRvIGNyZWF0ZSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHRpbWUgdW5kZXIgdGhlCiBjb250cm9sIG9mIGFuIGV4cGxpY2l0IGZvcm1hdCBzdHJpbmcuICBCcm9hZGx5IHNwZWFraW5nLCBgYGQuc3RyZnRpbWUoZm10KWBgCiBhY3RzIGxpa2UgdGhlIDptb2Q6YHRpbWVgIG1vZHVsZSdzIGBgdGltZS5zdHJmdGltZShmbXQsIGQudGltZXR1cGxlKCkpYGAKIGFsdGhvdWdoIG5vdCBhbGwgb2JqZWN0cyBzdXBwb3J0IGEgOm1ldGg6YHRpbWV0dXBsZWAgbWV0aG9kLgogCiBDb252ZXJzZWx5LCB0aGUgOm1ldGg6YGRhdGV0aW1lLnN0cnB0aW1lYCBjbGFzcyBtZXRob2QgY3JlYXRlcyBhCi06Y2xhc3M6YGRhdGV0aW1lYCBvYmplY3QgZnJvbSBhIHN0cmluZyByZXByZXNlbnRpbmcgYSBkYXRlIGFuZCB0aW1lIGFuZCBhCis6Y2xhc3M6YC5kYXRldGltZWAgb2JqZWN0IGZyb20gYSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgZGF0ZSBhbmQgdGltZSBhbmQgYQogY29ycmVzcG9uZGluZyBmb3JtYXQgc3RyaW5nLiBgYGRhdGV0aW1lLnN0cnB0aW1lKGRhdGVfc3RyaW5nLCBmb3JtYXQpYGAgaXMKIGVxdWl2YWxlbnQgdG8gYGBkYXRldGltZSgqKHRpbWUuc3RycHRpbWUoZGF0ZV9zdHJpbmcsIGZvcm1hdClbMDo2XSkpYGAuCiAKLUZvciA6Y2xhc3M6YHRpbWVgIG9iamVjdHMsIHRoZSBmb3JtYXQgY29kZXMgZm9yIHllYXIsIG1vbnRoLCBhbmQgZGF5IHNob3VsZCBub3QKK0ZvciA6Y2xhc3M6YC50aW1lYCBvYmplY3RzLCB0aGUgZm9ybWF0IGNvZGVzIGZvciB5ZWFyLCBtb250aCwgYW5kIGRheSBzaG91bGQgbm90CiBiZSB1c2VkLCBhcyB0aW1lIG9iamVjdHMgaGF2ZSBubyBzdWNoIHZhbHVlcy4gIElmIHRoZXkncmUgdXNlZCBhbnl3YXksIGBgMTkwMGBgCiBpcyBzdWJzdGl0dXRlZCBmb3IgdGhlIHllYXIsIGFuZCBgYDFgYCBmb3IgdGhlIG1vbnRoIGFuZCBkYXkuCiAKQEAgLTE1NDYsMzAgKzE2MDEsMTAgQEAKIG1pY3Jvc2Vjb25kcyBzaG91bGQgbm90IGJlIHVzZWQsIGFzIDpjbGFzczpgZGF0ZWAgb2JqZWN0cyBoYXZlIG5vIHN1Y2gKIHZhbHVlcy4gIElmIHRoZXkncmUgdXNlZCBhbnl3YXksIGBgMGBgIGlzIHN1YnN0aXR1dGVkIGZvciB0aGVtLgogCi0uLiB2ZXJzaW9uYWRkZWQ6OiAyLjYKLSAgIDpjbGFzczpgdGltZWAgYW5kIDpjbGFzczpgZGF0ZXRpbWVgIG9iamVjdHMgc3VwcG9ydCBhIGBgJWZgYCBmb3JtYXQgY29kZQotICAgd2hpY2ggZXhwYW5kcyB0byB0aGUgbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcyBpbiB0aGUgb2JqZWN0LCB6ZXJvLXBhZGRlZCBvbgotICAgdGhlIGxlZnQgdG8gc2l4IHBsYWNlcy4KLQotRm9yIGEgbmFpdmUgb2JqZWN0LCB0aGUgYGAlemBgIGFuZCBgYCVaYGAgZm9ybWF0IGNvZGVzIGFyZSByZXBsYWNlZCBieSBlbXB0eQotc3RyaW5ncy4KLQotRm9yIGFuIGF3YXJlIG9iamVjdDoKLQotYGAlemBgCi0gICA6bWV0aDpgdXRjb2Zmc2V0YCBpcyB0cmFuc2Zvcm1lZCBpbnRvIGEgNS1jaGFyYWN0ZXIgc3RyaW5nIG9mIHRoZSBmb3JtICtISE1NIG9yCi0gICAtSEhNTSwgd2hlcmUgSEggaXMgYSAyLWRpZ2l0IHN0cmluZyBnaXZpbmcgdGhlIG51bWJlciBvZiBVVEMgb2Zmc2V0IGhvdXJzLCBhbmQKLSAgIE1NIGlzIGEgMi1kaWdpdCBzdHJpbmcgZ2l2aW5nIHRoZSBudW1iZXIgb2YgVVRDIG9mZnNldCBtaW51dGVzLiAgRm9yIGV4YW1wbGUsIGlmCi0gICA6bWV0aDpgdXRjb2Zmc2V0YCByZXR1cm5zIGBgdGltZWRlbHRhKGhvdXJzPS0zLCBtaW51dGVzPS0zMClgYCwgYGAlemBgIGlzCi0gICByZXBsYWNlZCB3aXRoIHRoZSBzdHJpbmcgYGAnLTAzMzAnYGAuCi0KLWBgJVpgYAotICAgSWYgOm1ldGg6YHR6bmFtZWAgcmV0dXJucyBgYE5vbmVgYCwgYGAlWmBgIGlzIHJlcGxhY2VkIGJ5IGFuIGVtcHR5IHN0cmluZy4KLSAgIE90aGVyd2lzZSBgYCVaYGAgaXMgcmVwbGFjZWQgYnkgdGhlIHJldHVybmVkIHZhbHVlLCB3aGljaCBtdXN0IGJlIGEgc3RyaW5nLgotCiBUaGUgZnVsbCBzZXQgb2YgZm9ybWF0IGNvZGVzIHN1cHBvcnRlZCB2YXJpZXMgYWNyb3NzIHBsYXRmb3JtcywgYmVjYXVzZSBQeXRob24KIGNhbGxzIHRoZSBwbGF0Zm9ybSBDIGxpYnJhcnkncyA6ZnVuYzpgc3RyZnRpbWVgIGZ1bmN0aW9uLCBhbmQgcGxhdGZvcm0KLXZhcmlhdGlvbnMgYXJlIGNvbW1vbi4KK3ZhcmlhdGlvbnMgYXJlIGNvbW1vbi4gIFRvIHNlZSB0aGUgZnVsbCBzZXQgb2YgZm9ybWF0IGNvZGVzIHN1cHBvcnRlZCBvbiB5b3VyCitwbGF0Zm9ybSwgY29uc3VsdCB0aGUgOm1hbnBhZ2U6YHN0cmZ0aW1lKDMpYCBkb2N1bWVudGF0aW9uLgogCiBUaGUgZm9sbG93aW5nIGlzIGEgbGlzdCBvZiBhbGwgdGhlIGZvcm1hdCBjb2RlcyB0aGF0IHRoZSBDIHN0YW5kYXJkICgxOTg5CiB2ZXJzaW9uKSByZXF1aXJlcywgYW5kIHRoZXNlIHdvcmsgb24gYWxsIHBsYXRmb3JtcyB3aXRoIGEgc3RhbmRhcmQgQwpAQCAtMTU3OSwxMTYgKzE2MTQsMTU2IEBACiBUaGUgZXhhY3QgcmFuZ2Ugb2YgeWVhcnMgZm9yIHdoaWNoIDptZXRoOmBzdHJmdGltZWAgd29ya3MgYWxzbyB2YXJpZXMgYWNyb3NzCiBwbGF0Zm9ybXMuICBSZWdhcmRsZXNzIG9mIHBsYXRmb3JtLCB5ZWFycyBiZWZvcmUgMTkwMCBjYW5ub3QgYmUgdXNlZC4KIAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rCi18IERpcmVjdGl2ZSB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzIHwKLSs9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09KwotfCBgYCVhYGAgICAgfCBMb2NhbGUncyBhYmJyZXZpYXRlZCB3ZWVrZGF5ICAgfCAgICAgICB8Ci18ICAgICAgICAgICB8IG5hbWUuICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKwotfCBgYCVBYGAgICAgfCBMb2NhbGUncyBmdWxsIHdlZWtkYXkgbmFtZS4gICAgfCAgICAgICB8Ci0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKLXwgYGAlYmBgICAgIHwgTG9jYWxlJ3MgYWJicmV2aWF0ZWQgbW9udGggICAgIHwgICAgICAgfAotfCAgICAgICAgICAgfCBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8Ci0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKLXwgYGAlQmBgICAgIHwgTG9jYWxlJ3MgZnVsbCBtb250aCBuYW1lLiAgICAgIHwgICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rCi18IGBgJWNgYCAgICB8IExvY2FsZSdzIGFwcHJvcHJpYXRlIGRhdGUgYW5kICB8ICAgICAgIHwKLXwgICAgICAgICAgIHwgdGltZSByZXByZXNlbnRhdGlvbi4gICAgICAgICAgIHwgICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rCi18IGBgJWRgYCAgICB8IERheSBvZiB0aGUgbW9udGggYXMgYSBkZWNpbWFsICB8ICAgICAgIHwKLXwgICAgICAgICAgIHwgbnVtYmVyIFswMSwzMV0uICAgICAgICAgICAgICAgIHwgICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rCi18IGBgJWZgYCAgICB8IE1pY3Jvc2Vjb25kIGFzIGEgZGVjaW1hbCAgICAgICB8IFwoMSkgIHwKLXwgICAgICAgICAgIHwgbnVtYmVyIFswLDk5OTk5OV0sIHplcm8tcGFkZGVkIHwgICAgICAgfAotfCAgICAgICAgICAgfCBvbiB0aGUgbGVmdCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8Ci0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKLXwgYGAlSGBgICAgIHwgSG91ciAoMjQtaG91ciBjbG9jaykgYXMgYSAgICAgIHwgICAgICAgfAotfCAgICAgICAgICAgfCBkZWNpbWFsIG51bWJlciBbMDAsMjNdLiAgICAgICAgfCAgICAgICB8Ci0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKLXwgYGAlSWBgICAgIHwgSG91ciAoMTItaG91ciBjbG9jaykgYXMgYSAgICAgIHwgICAgICAgfAotfCAgICAgICAgICAgfCBkZWNpbWFsIG51bWJlciBbMDEsMTJdLiAgICAgICAgfCAgICAgICB8Ci0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKLXwgYGAlamBgICAgIHwgRGF5IG9mIHRoZSB5ZWFyIGFzIGEgZGVjaW1hbCAgIHwgICAgICAgfAotfCAgICAgICAgICAgfCBudW1iZXIgWzAwMSwzNjZdLiAgICAgICAgICAgICAgfCAgICAgICB8Ci0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKLXwgYGAlbWBgICAgIHwgTW9udGggYXMgYSBkZWNpbWFsIG51bWJlciAgICAgIHwgICAgICAgfAotfCAgICAgICAgICAgfCBbMDEsMTJdLiAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8Ci0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKLXwgYGAlTWBgICAgIHwgTWludXRlIGFzIGEgZGVjaW1hbCBudW1iZXIgICAgIHwgICAgICAgfAotfCAgICAgICAgICAgfCBbMDAsNTldLiAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8Ci0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKLXwgYGAlcGBgICAgIHwgTG9jYWxlJ3MgZXF1aXZhbGVudCBvZiBlaXRoZXIgIHwgXCgyKSAgfAotfCAgICAgICAgICAgfCBBTSBvciBQTS4gICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8Ci0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKLXwgYGAlU2BgICAgIHwgU2Vjb25kIGFzIGEgZGVjaW1hbCBudW1iZXIgICAgIHwgXCgzKSAgfAotfCAgICAgICAgICAgfCBbMDAsNjFdLiAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8Ci0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKLXwgYGAlVWBgICAgIHwgV2VlayBudW1iZXIgb2YgdGhlIHllYXIgICAgICAgIHwgXCg0KSAgfAotfCAgICAgICAgICAgfCAoU3VuZGF5IGFzIHRoZSBmaXJzdCBkYXkgb2YgICAgfCAgICAgICB8Ci18ICAgICAgICAgICB8IHRoZSB3ZWVrKSBhcyBhIGRlY2ltYWwgbnVtYmVyICB8ICAgICAgIHwKLXwgICAgICAgICAgIHwgWzAwLDUzXS4gIEFsbCBkYXlzIGluIGEgbmV3ICAgIHwgICAgICAgfAotfCAgICAgICAgICAgfCB5ZWFyIHByZWNlZGluZyB0aGUgZmlyc3QgICAgICAgfCAgICAgICB8Ci18ICAgICAgICAgICB8IFN1bmRheSBhcmUgY29uc2lkZXJlZCB0byBiZSBpbiB8ICAgICAgIHwKLXwgICAgICAgICAgIHwgd2VlayAwLiAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rCi18IGBgJXdgYCAgICB8IFdlZWtkYXkgYXMgYSBkZWNpbWFsIG51bWJlciAgICB8ICAgICAgIHwKLXwgICAgICAgICAgIHwgWzAoU3VuZGF5KSw2XS4gICAgICAgICAgICAgICAgIHwgICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rCi18IGBgJVdgYCAgICB8IFdlZWsgbnVtYmVyIG9mIHRoZSB5ZWFyICAgICAgICB8IFwoNCkgIHwKLXwgICAgICAgICAgIHwgKE1vbmRheSBhcyB0aGUgZmlyc3QgZGF5IG9mICAgIHwgICAgICAgfAotfCAgICAgICAgICAgfCB0aGUgd2VlaykgYXMgYSBkZWNpbWFsIG51bWJlciAgfCAgICAgICB8Ci18ICAgICAgICAgICB8IFswMCw1M10uICBBbGwgZGF5cyBpbiBhIG5ldyAgICB8ICAgICAgIHwKLXwgICAgICAgICAgIHwgeWVhciBwcmVjZWRpbmcgdGhlIGZpcnN0ICAgICAgIHwgICAgICAgfAotfCAgICAgICAgICAgfCBNb25kYXkgYXJlIGNvbnNpZGVyZWQgdG8gYmUgaW4gfCAgICAgICB8Ci18ICAgICAgICAgICB8IHdlZWsgMC4gICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKwotfCBgYCV4YGAgICAgfCBMb2NhbGUncyBhcHByb3ByaWF0ZSBkYXRlICAgICAgfCAgICAgICB8Ci18ICAgICAgICAgICB8IHJlcHJlc2VudGF0aW9uLiAgICAgICAgICAgICAgICB8ICAgICAgIHwKLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKwotfCBgYCVYYGAgICAgfCBMb2NhbGUncyBhcHByb3ByaWF0ZSB0aW1lICAgICAgfCAgICAgICB8Ci18ICAgICAgICAgICB8IHJlcHJlc2VudGF0aW9uLiAgICAgICAgICAgICAgICB8ICAgICAgIHwKLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKwotfCBgYCV5YGAgICAgfCBZZWFyIHdpdGhvdXQgY2VudHVyeSBhcyBhICAgICAgfCAgICAgICB8Ci18ICAgICAgICAgICB8IGRlY2ltYWwgbnVtYmVyIFswMCw5OV0uICAgICAgICB8ICAgICAgIHwKLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKwotfCBgYCVZYGAgICAgfCBZZWFyIHdpdGggY2VudHVyeSBhcyBhIGRlY2ltYWwgfCAgICAgICB8Ci18ICAgICAgICAgICB8IG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKwotfCBgYCV6YGAgICAgfCBVVEMgb2Zmc2V0IGluIHRoZSBmb3JtICtISE1NICAgfCBcKDUpICB8Ci18ICAgICAgICAgICB8IG9yIC1ISE1NIChlbXB0eSBzdHJpbmcgaWYgdGhlICB8ICAgICAgIHwKLXwgICAgICAgICAgIHwgdGhlIG9iamVjdCBpcyBuYWl2ZSkuICAgICAgICAgIHwgICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rCi18IGBgJVpgYCAgICB8IFRpbWUgem9uZSBuYW1lIChlbXB0eSBzdHJpbmcgICB8ICAgICAgIHwKLXwgICAgICAgICAgIHwgaWYgdGhlIG9iamVjdCBpcyBuYWl2ZSkuICAgICAgIHwgICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rCi18IGBgJSVgYCAgICB8IEEgbGl0ZXJhbCBgYCclJ2BgIGNoYXJhY3Rlci4gICB8ICAgICAgIHwKLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworfCBEaXJlY3RpdmUgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgfCBFeGFtcGxlICAgICAgICAgICAgICAgIHwgTm90ZXMgfAorKz09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09KworfCBgYCVhYGAgICAgfCBXZWVrZGF5IGFzIGxvY2FsZSdzICAgICAgICAgICAgfHwgU3VuLCBNb24sIC4uLiwgU2F0ICAgIHwgXCgxKSAgfAorfCAgICAgICAgICAgfCBhYmJyZXZpYXRlZCBuYW1lLiAgICAgICAgICAgICAgfCAgKGVuX1VTKTsgICAgICAgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgU28sIE1vLCAuLi4sIFNhICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgKGRlX0RFKSAgICAgICAgICAgICAgIHwgICAgICAgfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworfCBgYCVBYGAgICAgfCBXZWVrZGF5IGFzIGxvY2FsZSdzIGZ1bGwgbmFtZS4gfHwgU3VuZGF5LCBNb25kYXksIC4uLiwgIHwgXCgxKSAgfAorfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgU2F0dXJkYXkgKGVuX1VTKTsgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgU29ubnRhZywgTW9udGFnLCAuLi4sIHwgICAgICAgfAorfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgU2Ftc3RhZyAoZGVfREUpICAgICAgIHwgICAgICAgfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworfCBgYCV3YGAgICAgfCBXZWVrZGF5IGFzIGEgZGVjaW1hbCBudW1iZXIsICAgfCAwLCAxLCAuLi4sIDYgICAgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCB3aGVyZSAwIGlzIFN1bmRheSBhbmQgNiBpcyAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCBTYXR1cmRheS4gICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworfCBgYCVkYGAgICAgfCBEYXkgb2YgdGhlIG1vbnRoIGFzIGEgICAgICAgICAgfCAwMSwgMDIsIC4uLiwgMzEgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCB6ZXJvLXBhZGRlZCBkZWNpbWFsIG51bWJlci4gICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworfCBgYCViYGAgICAgfCBNb250aCBhcyBsb2NhbGUncyBhYmJyZXZpYXRlZCAgfHwgSmFuLCBGZWIsIC4uLiwgRGVjICAgIHwgXCgxKSAgfAorfCAgICAgICAgICAgfCBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgKGVuX1VTKTsgICAgICAgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgSmFuLCBGZWIsIC4uLiwgRGV6ICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgKGRlX0RFKSAgICAgICAgICAgICAgIHwgICAgICAgfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworfCBgYCVCYGAgICAgfCBNb250aCBhcyBsb2NhbGUncyBmdWxsIG5hbWUuICAgfHwgSmFudWFyeSwgRmVicnVhcnksICAgIHwgXCgxKSAgfAorfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgLi4uLCBEZWNlbWJlciAoZW5fVVMpO3wgICAgICAgfAorfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgSmFudWFyLCBGZWJydWFyLCAuLi4sIHwgICAgICAgfAorfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgRGV6ZW1iZXIgKGRlX0RFKSAgICAgIHwgICAgICAgfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworfCBgYCVtYGAgICAgfCBNb250aCBhcyBhIHplcm8tcGFkZGVkICAgICAgICAgfCAwMSwgMDIsIC4uLiwgMTIgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCBkZWNpbWFsIG51bWJlci4gICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworfCBgYCV5YGAgICAgfCBZZWFyIHdpdGhvdXQgY2VudHVyeSBhcyBhICAgICAgfCAwMCwgMDEsIC4uLiwgOTkgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCB6ZXJvLXBhZGRlZCBkZWNpbWFsIG51bWJlci4gICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworfCBgYCVZYGAgICAgfCBZZWFyIHdpdGggY2VudHVyeSBhcyBhIGRlY2ltYWwgfCAxOTcwLCAxOTg4LCAyMDAxLCAyMDEzIHwgICAgICAgfAorfCAgICAgICAgICAgfCBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworfCBgYCVIYGAgICAgfCBIb3VyICgyNC1ob3VyIGNsb2NrKSBhcyBhICAgICAgfCAwMCwgMDEsIC4uLiwgMjMgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCB6ZXJvLXBhZGRlZCBkZWNpbWFsIG51bWJlci4gICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworfCBgYCVJYGAgICAgfCBIb3VyICgxMi1ob3VyIGNsb2NrKSBhcyBhICAgICAgfCAwMSwgMDIsIC4uLiwgMTIgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCB6ZXJvLXBhZGRlZCBkZWNpbWFsIG51bWJlci4gICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworfCBgYCVwYGAgICAgfCBMb2NhbGUncyBlcXVpdmFsZW50IG9mIGVpdGhlciAgfHwgQU0sIFBNIChlbl9VUyk7ICAgICAgIHwgXCgxKSwgfAorfCAgICAgICAgICAgfCBBTSBvciBQTS4gICAgICAgICAgICAgICAgICAgICAgfHwgYW0sIHBtIChkZV9ERSkgICAgICAgIHwgXCgyKSAgfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworfCBgYCVNYGAgICAgfCBNaW51dGUgYXMgYSB6ZXJvLXBhZGRlZCAgICAgICAgfCAwMCwgMDEsIC4uLiwgNTkgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCBkZWNpbWFsIG51bWJlci4gICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworfCBgYCVTYGAgICAgfCBTZWNvbmQgYXMgYSB6ZXJvLXBhZGRlZCAgICAgICAgfCAwMCwgMDEsIC4uLiwgNTkgICAgICAgIHwgXCgzKSAgfAorfCAgICAgICAgICAgfCBkZWNpbWFsIG51bWJlci4gICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworfCBgYCVmYGAgICAgfCBNaWNyb3NlY29uZCBhcyBhIGRlY2ltYWwgICAgICAgfCAwMDAwMDAsIDAwMDAwMSwgLi4uLCAgIHwgXCg0KSAgfAorfCAgICAgICAgICAgfCBudW1iZXIsIHplcm8tcGFkZGVkIG9uIHRoZSAgICAgfCA5OTk5OTkgICAgICAgICAgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCBsZWZ0LiAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworfCBgYCV6YGAgICAgfCBVVEMgb2Zmc2V0IGluIHRoZSBmb3JtICtISE1NICAgfCAoZW1wdHkpLCArMDAwMCwgLTA0MDAsIHwgXCg1KSAgfAorfCAgICAgICAgICAgfCBvciAtSEhNTSAoZW1wdHkgc3RyaW5nIGlmIHRoZSAgfCArMTAzMCAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCB0aGUgb2JqZWN0IGlzIG5haXZlKS4gICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworfCBgYCVaYGAgICAgfCBUaW1lIHpvbmUgbmFtZSAoZW1wdHkgc3RyaW5nICAgfCAoZW1wdHkpLCBVVEMsIEVTVCwgQ1NUIHwgICAgICAgfAorfCAgICAgICAgICAgfCBpZiB0aGUgb2JqZWN0IGlzIG5haXZlKS4gICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworfCBgYCVqYGAgICAgfCBEYXkgb2YgdGhlIHllYXIgYXMgYSAgICAgICAgICAgfCAwMDEsIDAwMiwgLi4uLCAzNjYgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCB6ZXJvLXBhZGRlZCBkZWNpbWFsIG51bWJlci4gICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworfCBgYCVVYGAgICAgfCBXZWVrIG51bWJlciBvZiB0aGUgeWVhciAgICAgICAgfCAwMCwgMDEsIC4uLiwgNTMgICAgICAgIHwgXCg2KSAgfAorfCAgICAgICAgICAgfCAoU3VuZGF5IGFzIHRoZSBmaXJzdCBkYXkgb2YgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCB0aGUgd2VlaykgYXMgYSB6ZXJvIHBhZGRlZCAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCBkZWNpbWFsIG51bWJlci4gQWxsIGRheXMgaW4gYSAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCBuZXcgeWVhciBwcmVjZWRpbmcgdGhlIGZpcnN0ICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCBTdW5kYXkgYXJlIGNvbnNpZGVyZWQgdG8gYmUgaW4gfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCB3ZWVrIDAuICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworfCBgYCVXYGAgICAgfCBXZWVrIG51bWJlciBvZiB0aGUgeWVhciAgICAgICAgfCAwMCwgMDEsIC4uLiwgNTMgICAgICAgIHwgXCg2KSAgfAorfCAgICAgICAgICAgfCAoTW9uZGF5IGFzIHRoZSBmaXJzdCBkYXkgb2YgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCB0aGUgd2VlaykgYXMgYSBkZWNpbWFsIG51bWJlci4gfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCBBbGwgZGF5cyBpbiBhIG5ldyB5ZWFyICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCBwcmVjZWRpbmcgdGhlIGZpcnN0IE1vbmRheSAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCBhcmUgY29uc2lkZXJlZCB0byBiZSBpbiAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCB3ZWVrIDAuICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworfCBgYCVjYGAgICAgfCBMb2NhbGUncyBhcHByb3ByaWF0ZSBkYXRlIGFuZCAgfHwgVHVlIEF1ZyAxNiAyMTozMDowMCAgIHwgXCgxKSAgfAorfCAgICAgICAgICAgfCB0aW1lIHJlcHJlc2VudGF0aW9uLiAgICAgICAgICAgfCAgMTk4OCAoZW5fVVMpOyAgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRGkgMTYgQXVnIDIxOjMwOjAwICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTk4OCAoZGVfREUpICAgICAgICAgIHwgICAgICAgfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworfCBgYCV4YGAgICAgfCBMb2NhbGUncyBhcHByb3ByaWF0ZSBkYXRlICAgICAgfHwgMDgvMTYvODggKE5vbmUpOyAgICAgIHwgXCgxKSAgfAorfCAgICAgICAgICAgfCByZXByZXNlbnRhdGlvbi4gICAgICAgICAgICAgICAgfHwgMDgvMTYvMTk4OCAoZW5fVVMpOyAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgMTYuMDguMTk4OCAoZGVfREUpICAgIHwgICAgICAgfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworfCBgYCVYYGAgICAgfCBMb2NhbGUncyBhcHByb3ByaWF0ZSB0aW1lICAgICAgfHwgMjE6MzA6MDAgKGVuX1VTKTsgICAgIHwgXCgxKSAgfAorfCAgICAgICAgICAgfCByZXByZXNlbnRhdGlvbi4gICAgICAgICAgICAgICAgfHwgMjE6MzA6MDAgKGRlX0RFKSAgICAgIHwgICAgICAgfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworfCBgYCUlYGAgICAgfCBBIGxpdGVyYWwgYGAnJSdgYCBjaGFyYWN0ZXIuICAgfCAlICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKwogCiBOb3RlczoKIAogKDEpCi0gICBXaGVuIHVzZWQgd2l0aCB0aGUgOm1ldGg6YHN0cnB0aW1lYCBtZXRob2QsIHRoZSBgYCVmYGAgZGlyZWN0aXZlCi0gICBhY2NlcHRzIGZyb20gb25lIHRvIHNpeCBkaWdpdHMgYW5kIHplcm8gcGFkcyBvbiB0aGUgcmlnaHQuICBgYCVmYGAgaXMKLSAgIGFuIGV4dGVuc2lvbiB0byB0aGUgc2V0IG9mIGZvcm1hdCBjaGFyYWN0ZXJzIGluIHRoZSBDIHN0YW5kYXJkIChidXQKLSAgIGltcGxlbWVudGVkIHNlcGFyYXRlbHkgaW4gZGF0ZXRpbWUgb2JqZWN0cywgYW5kIHRoZXJlZm9yZSBhbHdheXMKLSAgIGF2YWlsYWJsZSkuCisgICBCZWNhdXNlIHRoZSBmb3JtYXQgZGVwZW5kcyBvbiB0aGUgY3VycmVudCBsb2NhbGUsIGNhcmUgc2hvdWxkIGJlIHRha2VuIHdoZW4KKyAgIG1ha2luZyBhc3N1bXB0aW9ucyBhYm91dCB0aGUgb3V0cHV0IHZhbHVlLiBGaWVsZCBvcmRlcmluZ3Mgd2lsbCB2YXJ5IChmb3IKKyAgIGV4YW1wbGUsICJtb250aC9kYXkveWVhciIgdmVyc3VzICJkYXkvbW9udGgveWVhciIpLCBhbmQgdGhlIG91dHB1dCBtYXkKKyAgIGNvbnRhaW4gVW5pY29kZSBjaGFyYWN0ZXJzIGVuY29kZWQgdXNpbmcgdGhlIGxvY2FsZSdzIGRlZmF1bHQgZW5jb2RpbmcgKGZvcgorICAgZXhhbXBsZSwgaWYgdGhlIGN1cnJlbnQgbG9jYWxlIGlzIGBgamFfSlBgYCwgdGhlIGRlZmF1bHQgZW5jb2RpbmcgY291bGQgYmUKKyAgIGFueSBvbmUgb2YgYGBldWNKUGBgLCBgYFNKSVNgYCwgb3IgYGB1dGYtOGBgOyB1c2UgOm1ldGg6YGxvY2FsZS5nZXRsb2NhbGVgCisgICB0byBkZXRlcm1pbmUgdGhlIGN1cnJlbnQgbG9jYWxlJ3MgZW5jb2RpbmcpLgogCiAoMikKICAgIFdoZW4gdXNlZCB3aXRoIHRoZSA6bWV0aDpgc3RycHRpbWVgIG1ldGhvZCwgdGhlIGBgJXBgYCBkaXJlY3RpdmUgb25seSBhZmZlY3RzCiAgICB0aGUgb3V0cHV0IGhvdXIgZmllbGQgaWYgdGhlIGBgJUlgYCBkaXJlY3RpdmUgaXMgdXNlZCB0byBwYXJzZSB0aGUgaG91ci4KIAogKDMpCi0gICBUaGUgcmFuZ2UgcmVhbGx5IGlzIGBgMGBgIHRvIGBgNjFgYDsgYWNjb3JkaW5nIHRvIHRoZSBQb3NpeCBzdGFuZGFyZCB0aGlzCi0gICBhY2NvdW50cyBmb3IgbGVhcCBzZWNvbmRzIGFuZCB0aGUgKHZlcnkgcmFyZSkgZG91YmxlIGxlYXAgc2Vjb25kcy4KLSAgIFRoZSA6bW9kOmB0aW1lYCBtb2R1bGUgbWF5IHByb2R1Y2UgYW5kIGRvZXMgYWNjZXB0IGxlYXAgc2Vjb25kcyBzaW5jZQotICAgaXQgaXMgYmFzZWQgb24gdGhlIFBvc2l4IHN0YW5kYXJkLCBidXQgdGhlIDptb2Q6YGRhdGV0aW1lYCBtb2R1bGUKLSAgIGRvZXMgbm90IGFjY2VwdCBsZWFwIHNlY29uZHMgaW4gOm1ldGg6YHN0cnB0aW1lYCBpbnB1dCBub3Igd2lsbCBpdAotICAgcHJvZHVjZSB0aGVtIGluIDpmdW5jOmBzdHJmdGltZWAgb3V0cHV0LgorICAgVW5saWtlIHRoZSA6bW9kOmB0aW1lYCBtb2R1bGUsIHRoZSA6bW9kOmBkYXRldGltZWAgbW9kdWxlIGRvZXMgbm90IHN1cHBvcnQKKyAgIGxlYXAgc2Vjb25kcy4KIAogKDQpCi0gICBXaGVuIHVzZWQgd2l0aCB0aGUgOm1ldGg6YHN0cnB0aW1lYCBtZXRob2QsIGBgJVVgYCBhbmQgYGAlV2BgIGFyZSBvbmx5IHVzZWQgaW4KLSAgIGNhbGN1bGF0aW9ucyB3aGVuIHRoZSBkYXkgb2YgdGhlIHdlZWsgYW5kIHRoZSB5ZWFyIGFyZSBzcGVjaWZpZWQuCisgICBgYCVmYGAgaXMgYW4gZXh0ZW5zaW9uIHRvIHRoZSBzZXQgb2YgZm9ybWF0IGNoYXJhY3RlcnMgaW4gdGhlIEMgc3RhbmRhcmQKKyAgIChidXQgaW1wbGVtZW50ZWQgc2VwYXJhdGVseSBpbiBkYXRldGltZSBvYmplY3RzLCBhbmQgdGhlcmVmb3JlIGFsd2F5cworICAgYXZhaWxhYmxlKS4gIFdoZW4gdXNlZCB3aXRoIHRoZSA6bWV0aDpgc3RycHRpbWVgIG1ldGhvZCwgdGhlIGBgJWZgYAorICAgZGlyZWN0aXZlIGFjY2VwdHMgZnJvbSBvbmUgdG8gc2l4IGRpZ2l0cyBhbmQgemVybyBwYWRzIG9uIHRoZSByaWdodC4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMi42CiAKICg1KQotICAgRm9yIGV4YW1wbGUsIGlmIDptZXRoOmB1dGNvZmZzZXRgIHJldHVybnMgYGB0aW1lZGVsdGEoaG91cnM9LTMsIG1pbnV0ZXM9LTMwKWBgLAotICAgYGAlemBgIGlzIHJlcGxhY2VkIHdpdGggdGhlIHN0cmluZyBgYCctMDMzMCdgYC4KKyAgIEZvciBhIG5haXZlIG9iamVjdCwgdGhlIGBgJXpgYCBhbmQgYGAlWmBgIGZvcm1hdCBjb2RlcyBhcmUgcmVwbGFjZWQgYnkgZW1wdHkKKyAgIHN0cmluZ3MuCisKKyAgIEZvciBhbiBhd2FyZSBvYmplY3Q6CisKKyAgIGBgJXpgYAorICAgICAgOm1ldGg6YHV0Y29mZnNldGAgaXMgdHJhbnNmb3JtZWQgaW50byBhIDUtY2hhcmFjdGVyIHN0cmluZyBvZiB0aGUgZm9ybQorICAgICAgK0hITU0gb3IgLUhITU0sIHdoZXJlIEhIIGlzIGEgMi1kaWdpdCBzdHJpbmcgZ2l2aW5nIHRoZSBudW1iZXIgb2YgVVRDCisgICAgICBvZmZzZXQgaG91cnMsIGFuZCBNTSBpcyBhIDItZGlnaXQgc3RyaW5nIGdpdmluZyB0aGUgbnVtYmVyIG9mIFVUQyBvZmZzZXQKKyAgICAgIG1pbnV0ZXMuICBGb3IgZXhhbXBsZSwgaWYgOm1ldGg6YHV0Y29mZnNldGAgcmV0dXJucworICAgICAgYGB0aW1lZGVsdGEoaG91cnM9LTMsIG1pbnV0ZXM9LTMwKWBgLCBgYCV6YGAgaXMgcmVwbGFjZWQgd2l0aCB0aGUgc3RyaW5nCisgICAgICBgYCctMDMzMCdgYC4KKworICAgYGAlWmBgCisgICAgICBJZiA6bWV0aDpgdHpuYW1lYCByZXR1cm5zIGBgTm9uZWBgLCBgYCVaYGAgaXMgcmVwbGFjZWQgYnkgYW4gZW1wdHkKKyAgICAgIHN0cmluZy4gIE90aGVyd2lzZSBgYCVaYGAgaXMgcmVwbGFjZWQgYnkgdGhlIHJldHVybmVkIHZhbHVlLCB3aGljaCBtdXN0CisgICAgICBiZSBhIHN0cmluZy4KKworKDYpCisgICBXaGVuIHVzZWQgd2l0aCB0aGUgOm1ldGg6YHN0cnB0aW1lYCBtZXRob2QsIGBgJVVgYCBhbmQgYGAlV2BgIGFyZSBvbmx5IHVzZWQKKyAgIGluIGNhbGN1bGF0aW9ucyB3aGVuIHRoZSBkYXkgb2YgdGhlIHdlZWsgYW5kIHRoZSB5ZWFyIGFyZSBzcGVjaWZpZWQuCisKKworLi4gcnVicmljOjogRm9vdG5vdGVzCisKKy4uIFsjXSBJZiwgdGhhdCBpcywgd2UgaWdub3JlIHRoZSBlZmZlY3RzIG9mIFJlbGF0aXZpdHkKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2RiaGFzaC5yc3QgYi9Eb2MvbGlicmFyeS9kYmhhc2gucnN0CmluZGV4IDBiNDQwYWIuLmVkOTY1ZTEgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2RiaGFzaC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZGJoYXNoLnJzdApAQCAtNiw3ICs2LDcgQEAKIC4uIHNlY3Rpb25hdXRob3I6OiBGcmVkIEwuIERyYWtlLCBKci4gPGZkcmFrZUBhY20ub3JnPgogCiAuLiBkZXByZWNhdGVkOjogMi42Ci0gICAgVGhlIDptb2Q6YGRiaGFzaGAgbW9kdWxlIGhhcyBiZWVuIGRlcHJlY2F0ZWQgZm9yIHJlbW92YWwgaW4gUHl0aG9uIDMuMC4KKyAgIFRoZSA6bW9kOmBkYmhhc2hgIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLgogCiAuLiBpbmRleDo6IG1vZHVsZTogYnNkZGIKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZGJtLnJzdCBiL0RvYy9saWJyYXJ5L2RibS5yc3QKaW5kZXggODc0Nzc4OS4uYTAzYzdjNSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZGJtLnJzdAorKysgYi9Eb2MvbGlicmFyeS9kYm0ucnN0CkBAIC02LDkgKzYsOSBAQAogICAgOnN5bm9wc2lzOiBUaGUgc3RhbmRhcmQgImRhdGFiYXNlIiBpbnRlcmZhY2UsIGJhc2VkIG9uIG5kYm0uCiAKIC4uIG5vdGU6OgotICAgVGhlIDptb2Q6YGRibWAgbW9kdWxlIGhhcyBiZWVuIHJlbmFtZWQgdG8gOm1vZDpgZGJtLm5kYm1gIGluIFB5dGhvbiAzLjAuICBUaGUKKyAgIFRoZSA6bW9kOmBkYm1gIG1vZHVsZSBoYXMgYmVlbiByZW5hbWVkIHRvIDptb2Q6YGRibS5uZGJtYCBpbiBQeXRob24gMy4gIFRoZQogICAgOnRlcm06YDJ0bzNgIHRvb2wgd2lsbCBhdXRvbWF0aWNhbGx5IGFkYXB0IGltcG9ydHMgd2hlbiBjb252ZXJ0aW5nIHlvdXIKLSAgIHNvdXJjZXMgdG8gMy4wLgorICAgc291cmNlcyB0byBQeXRob24gMy4KIAogCiBUaGUgOm1vZDpgZGJtYCBtb2R1bGUgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIHRoZSBVbml4ICIobilkYm0iIGxpYnJhcnkuICBEYm0KQEAgLTY0LDYgKzY0LDE0IEBACiAgICBkYXRhYmFzZSBoYXMgdG8gYmUgY3JlYXRlZC4gIEl0IGRlZmF1bHRzIHRvIG9jdGFsIGBgMDY2NmBgIChhbmQgd2lsbCBiZQogICAgbW9kaWZpZWQgYnkgdGhlIHByZXZhaWxpbmcgdW1hc2spLgogCisgICBJbiBhZGRpdGlvbiB0byB0aGUgZGljdGlvbmFyeS1saWtlIG1ldGhvZHMsIGBgZGJtYGAgb2JqZWN0cworICAgcHJvdmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZDoKKworCisgICAuLiBmdW5jdGlvbjo6IGNsb3NlKCkKKworICAgICAgQ2xvc2UgdGhlIGBgZGJtYGAgZGF0YWJhc2UuCisKIAogLi4gc2VlYWxzbzo6CiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2RlY2ltYWwucnN0IGIvRG9jL2xpYnJhcnkvZGVjaW1hbC5yc3QKaW5kZXggOGFjNTlmNC4uZDViYTRmMCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZGVjaW1hbC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZGVjaW1hbC5yc3QKQEAgLTM1LDcgKzM1LDcgQEAKICAgcGVvcGxlIGxlYXJuIGF0IHNjaG9vbC4iIC0tIGV4Y2VycHQgZnJvbSB0aGUgZGVjaW1hbCBhcml0aG1ldGljIHNwZWNpZmljYXRpb24uCiAKICogRGVjaW1hbCBudW1iZXJzIGNhbiBiZSByZXByZXNlbnRlZCBleGFjdGx5LiAgSW4gY29udHJhc3QsIG51bWJlcnMgbGlrZQotICA6Y29uc3Q6YDEuMWAgYW5kIDpjb25zdDpgMi4yYCBkbyBub3QgaGF2ZSBhbiBleGFjdCByZXByZXNlbnRhdGlvbnMgaW4gYmluYXJ5CisgIDpjb25zdDpgMS4xYCBhbmQgOmNvbnN0OmAyLjJgIGRvIG5vdCBoYXZlIGV4YWN0IHJlcHJlc2VudGF0aW9ucyBpbiBiaW5hcnkKICAgZmxvYXRpbmcgcG9pbnQuICBFbmQgdXNlcnMgdHlwaWNhbGx5IHdvdWxkIG5vdCBleHBlY3QgYGAxLjEgKyAyLjJgYCB0byBkaXNwbGF5CiAgIGFzIDpjb25zdDpgMy4zMDAwMDAwMDAwMDAwMDAzYCBhcyBpdCBkb2VzIHdpdGggYmluYXJ5IGZsb2F0aW5nIHBvaW50LgogCkBAIC0zNzUsNiArMzc1LDI5IEBACiAgICBjb21wYXJlZCwgc29ydGVkLCBhbmQgY29lcmNlZCB0byBhbm90aGVyIHR5cGUgKHN1Y2ggYXMgOmNsYXNzOmBmbG9hdGAgb3IKICAgIDpjbGFzczpgbG9uZ2ApLgogCisgICBUaGVyZSBhcmUgc29tZSBzbWFsbCBkaWZmZXJlbmNlcyBiZXR3ZWVuIGFyaXRobWV0aWMgb24gRGVjaW1hbCBvYmplY3RzIGFuZAorICAgYXJpdGhtZXRpYyBvbiBpbnRlZ2VycyBhbmQgZmxvYXRzLiAgV2hlbiB0aGUgcmVtYWluZGVyIG9wZXJhdG9yIGBgJWBgIGlzCisgICBhcHBsaWVkIHRvIERlY2ltYWwgb2JqZWN0cywgdGhlIHNpZ24gb2YgdGhlIHJlc3VsdCBpcyB0aGUgc2lnbiBvZiB0aGUKKyAgICpkaXZpZGVuZCogcmF0aGVyIHRoYW4gdGhlIHNpZ24gb2YgdGhlIGRpdmlzb3I6OgorCisgICAgICA+Pj4gKC03KSAlIDQKKyAgICAgIDEKKyAgICAgID4+PiBEZWNpbWFsKC03KSAlIERlY2ltYWwoNCkKKyAgICAgIERlY2ltYWwoJy0zJykKKworICAgVGhlIGludGVnZXIgZGl2aXNpb24gb3BlcmF0b3IgYGAvL2BgIGJlaGF2ZXMgYW5hbG9nb3VzbHksIHJldHVybmluZyB0aGUKKyAgIGludGVnZXIgcGFydCBvZiB0aGUgdHJ1ZSBxdW90aWVudCAodHJ1bmNhdGluZyB0b3dhcmRzIHplcm8pIHJhdGhlciB0aGFuIGl0cworICAgZmxvb3IsIHNvIGFzIHRvIHByZXNlcnZlIHRoZSB1c3VhbCBpZGVudGl0eSBgYHggPT0gKHggLy8geSkgKiB5ICsgeCAlIHlgYDo6CisKKyAgICAgID4+PiAtNyAvLyA0CisgICAgICAtMgorICAgICAgPj4+IERlY2ltYWwoLTcpIC8vIERlY2ltYWwoNCkKKyAgICAgIERlY2ltYWwoJy0xJykKKworICAgVGhlIGBgJWBgIGFuZCBgYC8vYGAgb3BlcmF0b3JzIGltcGxlbWVudCB0aGUgYGByZW1haW5kZXJgYCBhbmQKKyAgIGBgZGl2aWRlLWludGVnZXJgYCBvcGVyYXRpb25zIChyZXNwZWN0aXZlbHkpIGFzIGRlc2NyaWJlZCBpbiB0aGUKKyAgIHNwZWNpZmljYXRpb24uCisKICAgIERlY2ltYWwgb2JqZWN0cyBjYW5ub3QgZ2VuZXJhbGx5IGJlIGNvbWJpbmVkIHdpdGggZmxvYXRzIGluCiAgICBhcml0aG1ldGljIG9wZXJhdGlvbnM6IGFuIGF0dGVtcHQgdG8gYWRkIGEgOmNsYXNzOmBEZWNpbWFsYCB0byBhCiAgICA6Y2xhc3M6YGZsb2F0YCwgZm9yIGV4YW1wbGUsIHdpbGwgcmFpc2UgYSA6ZXhjOmBUeXBlRXJyb3JgLgpAQCAtODAyLDEyICs4MjUsMjEgQEAKIAogICAgLi4gbWV0aG9kOjogcmVtYWluZGVyX25lYXIob3RoZXJbLCBjb250ZXh0XSkKIAotICAgICAgQ29tcHV0ZSB0aGUgbW9kdWxvIGFzIGVpdGhlciBhIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIHZhbHVlIGRlcGVuZGluZyBvbgotICAgICAgd2hpY2ggaXMgY2xvc2VzdCB0byB6ZXJvLiAgRm9yIGluc3RhbmNlLCBgYERlY2ltYWwoMTApLnJlbWFpbmRlcl9uZWFyKDYpYGAKLSAgICAgIHJldHVybnMgYGBEZWNpbWFsKCctMicpYGAgd2hpY2ggaXMgY2xvc2VyIHRvIHplcm8gdGhhbiBgYERlY2ltYWwoJzQnKWBgLgorICAgICAgUmV0dXJuIHRoZSByZW1haW5kZXIgZnJvbSBkaXZpZGluZyAqc2VsZiogYnkgKm90aGVyKi4gIFRoaXMgZGlmZmVycyBmcm9tCisgICAgICBgYHNlbGYgJSBvdGhlcmBgIGluIHRoYXQgdGhlIHNpZ24gb2YgdGhlIHJlbWFpbmRlciBpcyBjaG9zZW4gc28gYXMgdG8KKyAgICAgIG1pbmltaXplIGl0cyBhYnNvbHV0ZSB2YWx1ZS4gIE1vcmUgcHJlY2lzZWx5LCB0aGUgcmV0dXJuIHZhbHVlIGlzCisgICAgICBgYHNlbGYgLSBuICogb3RoZXJgYCB3aGVyZSBgYG5gYCBpcyB0aGUgaW50ZWdlciBuZWFyZXN0IHRvIHRoZSBleGFjdAorICAgICAgdmFsdWUgb2YgYGBzZWxmIC8gb3RoZXJgYCwgYW5kIGlmIHR3byBpbnRlZ2VycyBhcmUgZXF1YWxseSBuZWFyIHRoZW4gdGhlCisgICAgICBldmVuIG9uZSBpcyBjaG9zZW4uCiAKLSAgICAgIElmIGJvdGggYXJlIGVxdWFsbHkgY2xvc2UsIHRoZSBvbmUgY2hvc2VuIHdpbGwgaGF2ZSB0aGUgc2FtZSBzaWduIGFzCi0gICAgICAqc2VsZiouCisgICAgICBJZiB0aGUgcmVzdWx0IGlzIHplcm8gdGhlbiBpdHMgc2lnbiB3aWxsIGJlIHRoZSBzaWduIG9mICpzZWxmKi4KKworICAgICAgPj4+IERlY2ltYWwoMTgpLnJlbWFpbmRlcl9uZWFyKERlY2ltYWwoMTApKQorICAgICAgRGVjaW1hbCgnLTInKQorICAgICAgPj4+IERlY2ltYWwoMjUpLnJlbWFpbmRlcl9uZWFyKERlY2ltYWwoMTApKQorICAgICAgRGVjaW1hbCgnNScpCisgICAgICA+Pj4gRGVjaW1hbCgzNSkucmVtYWluZGVyX25lYXIoRGVjaW1hbCgxMCkpCisgICAgICBEZWNpbWFsKCctNScpCiAKICAgIC4uIG1ldGhvZDo6IHJvdGF0ZShvdGhlclssIGNvbnRleHRdKQogCkBAIC05NDQsNiArOTc2LDEwIEBACiAgICAgICAgICAgcyA9IGNhbGN1bGF0ZV9zb21ldGhpbmcoKQogICAgICAgcyA9ICtzICAjIFJvdW5kIHRoZSBmaW5hbCByZXN1bHQgYmFjayB0byB0aGUgZGVmYXVsdCBwcmVjaXNpb24KIAorICAgICAgd2l0aCBsb2NhbGNvbnRleHQoQmFzaWNDb250ZXh0KTogICAgICAjIHRlbXBvcmFyaWx5IHVzZSB0aGUgQmFzaWNDb250ZXh0CisgICAgICAgICAgcHJpbnQgRGVjaW1hbCgxKSAvIERlY2ltYWwoNykKKyAgICAgICAgICBwcmludCBEZWNpbWFsKDM1NSkgLyBEZWNpbWFsKDExMykKKwogTmV3IGNvbnRleHRzIGNhbiBhbHNvIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIDpjbGFzczpgQ29udGV4dGAgY29uc3RydWN0b3IKIGRlc2NyaWJlZCBiZWxvdy4gSW4gYWRkaXRpb24sIHRoZSBtb2R1bGUgcHJvdmlkZXMgdGhyZWUgcHJlLW1hZGUgY29udGV4dHM6CiAKQEAgLTExOTAsNTIgKzEyMjYsNTIgQEAKIAogICAgLi4gbWV0aG9kOjogaXNfY2Fub25pY2FsKHgpCiAKLSAgICAgIFJldHVybnMgVHJ1ZSBpZiAqeCogaXMgY2Fub25pY2FsOyBvdGhlcndpc2UgcmV0dXJucyBGYWxzZS4KKyAgICAgIFJldHVybnMgYGBUcnVlYGAgaWYgKngqIGlzIGNhbm9uaWNhbDsgb3RoZXJ3aXNlIHJldHVybnMgYGBGYWxzZWBgLgogCiAKICAgIC4uIG1ldGhvZDo6IGlzX2Zpbml0ZSh4KQogCi0gICAgICBSZXR1cm5zIFRydWUgaWYgKngqIGlzIGZpbml0ZTsgb3RoZXJ3aXNlIHJldHVybnMgRmFsc2UuCisgICAgICBSZXR1cm5zIGBgVHJ1ZWBgIGlmICp4KiBpcyBmaW5pdGU7IG90aGVyd2lzZSByZXR1cm5zIGBgRmFsc2VgYC4KIAogCiAgICAuLiBtZXRob2Q6OiBpc19pbmZpbml0ZSh4KQogCi0gICAgICBSZXR1cm5zIFRydWUgaWYgKngqIGlzIGluZmluaXRlOyBvdGhlcndpc2UgcmV0dXJucyBGYWxzZS4KKyAgICAgIFJldHVybnMgYGBUcnVlYGAgaWYgKngqIGlzIGluZmluaXRlOyBvdGhlcndpc2UgcmV0dXJucyBgYEZhbHNlYGAuCiAKIAogICAgLi4gbWV0aG9kOjogaXNfbmFuKHgpCiAKLSAgICAgIFJldHVybnMgVHJ1ZSBpZiAqeCogaXMgYSBxTmFOIG9yIHNOYU47IG90aGVyd2lzZSByZXR1cm5zIEZhbHNlLgorICAgICAgUmV0dXJucyBgYFRydWVgYCBpZiAqeCogaXMgYSBxTmFOIG9yIHNOYU47IG90aGVyd2lzZSByZXR1cm5zIGBgRmFsc2VgYC4KIAogCiAgICAuLiBtZXRob2Q6OiBpc19ub3JtYWwoeCkKIAotICAgICAgUmV0dXJucyBUcnVlIGlmICp4KiBpcyBhIG5vcm1hbCBudW1iZXI7IG90aGVyd2lzZSByZXR1cm5zIEZhbHNlLgorICAgICAgUmV0dXJucyBgYFRydWVgYCBpZiAqeCogaXMgYSBub3JtYWwgbnVtYmVyOyBvdGhlcndpc2UgcmV0dXJucyBgYEZhbHNlYGAuCiAKIAogICAgLi4gbWV0aG9kOjogaXNfcW5hbih4KQogCi0gICAgICBSZXR1cm5zIFRydWUgaWYgKngqIGlzIGEgcXVpZXQgTmFOOyBvdGhlcndpc2UgcmV0dXJucyBGYWxzZS4KKyAgICAgIFJldHVybnMgYGBUcnVlYGAgaWYgKngqIGlzIGEgcXVpZXQgTmFOOyBvdGhlcndpc2UgcmV0dXJucyBgYEZhbHNlYGAuCiAKIAogICAgLi4gbWV0aG9kOjogaXNfc2lnbmVkKHgpCiAKLSAgICAgIFJldHVybnMgVHJ1ZSBpZiAqeCogaXMgbmVnYXRpdmU7IG90aGVyd2lzZSByZXR1cm5zIEZhbHNlLgorICAgICAgUmV0dXJucyBgYFRydWVgYCBpZiAqeCogaXMgbmVnYXRpdmU7IG90aGVyd2lzZSByZXR1cm5zIGBgRmFsc2VgYC4KIAogCiAgICAuLiBtZXRob2Q6OiBpc19zbmFuKHgpCiAKLSAgICAgIFJldHVybnMgVHJ1ZSBpZiAqeCogaXMgYSBzaWduYWxpbmcgTmFOOyBvdGhlcndpc2UgcmV0dXJucyBGYWxzZS4KKyAgICAgIFJldHVybnMgYGBUcnVlYGAgaWYgKngqIGlzIGEgc2lnbmFsaW5nIE5hTjsgb3RoZXJ3aXNlIHJldHVybnMgYGBGYWxzZWBgLgogCiAKICAgIC4uIG1ldGhvZDo6IGlzX3N1Ym5vcm1hbCh4KQogCi0gICAgICBSZXR1cm5zIFRydWUgaWYgKngqIGlzIHN1Ym5vcm1hbDsgb3RoZXJ3aXNlIHJldHVybnMgRmFsc2UuCisgICAgICBSZXR1cm5zIGBgVHJ1ZWBgIGlmICp4KiBpcyBzdWJub3JtYWw7IG90aGVyd2lzZSByZXR1cm5zIGBgRmFsc2VgYC4KIAogCiAgICAuLiBtZXRob2Q6OiBpc196ZXJvKHgpCiAKLSAgICAgIFJldHVybnMgVHJ1ZSBpZiAqeCogaXMgYSB6ZXJvOyBvdGhlcndpc2UgcmV0dXJucyBGYWxzZS4KKyAgICAgIFJldHVybnMgYGBUcnVlYGAgaWYgKngqIGlzIGEgemVybzsgb3RoZXJ3aXNlIHJldHVybnMgYGBGYWxzZWBgLgogCiAKICAgIC4uIG1ldGhvZDo6IGxuKHgpCkBAIC0xMzk1LDcgKzE0MzEsNyBAQAogCiAgICAuLiBtZXRob2Q6OiBzYW1lX3F1YW50dW0oeCwgeSkKIAotICAgICAgUmV0dXJucyBUcnVlIGlmIHRoZSB0d28gb3BlcmFuZHMgaGF2ZSB0aGUgc2FtZSBleHBvbmVudC4KKyAgICAgIFJldHVybnMgYGBUcnVlYGAgaWYgdGhlIHR3byBvcGVyYW5kcyBoYXZlIHRoZSBzYW1lIGV4cG9uZW50LgogCiAKICAgIC4uIG1ldGhvZDo6IHNjYWxlYiAoeCwgeSkKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2RpZmZsaWIucnN0IGIvRG9jL2xpYnJhcnkvZGlmZmxpYi5yc3QKaW5kZXggMjI1YjQ4Ni4uODc4ZDhlNiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZGlmZmxpYi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZGlmZmxpYi5yc3QKQEAgLTg0LDcgKzg0LDcgQEAKICAgIFRoZSBjb25zdHJ1Y3RvciBmb3IgdGhpcyBjbGFzcyBpczoKIAogCi0gICAuLiBmdW5jdGlvbjo6IF9faW5pdF9fKFt0YWJzaXplXVssIHdyYXBjb2x1bW5dWywgbGluZWp1bmtdWywgY2hhcmp1bmtdKQorICAgLi4gZnVuY3Rpb246OiBfX2luaXRfXyh0YWJzaXplPTgsIHdyYXBjb2x1bW49Tm9uZSwgbGluZWp1bms9Tm9uZSwgY2hhcmp1bms9SVNfQ0hBUkFDVEVSX0pVTkspCiAKICAgICAgIEluaXRpYWxpemVzIGluc3RhbmNlIG9mIDpjbGFzczpgSHRtbERpZmZgLgogCkBAIC0zNDQsNyArMzQ0LDcgQEAKIFRoZSA6Y2xhc3M6YFNlcXVlbmNlTWF0Y2hlcmAgY2xhc3MgaGFzIHRoaXMgY29uc3RydWN0b3I6CiAKIAotLi4gY2xhc3M6OiBTZXF1ZW5jZU1hdGNoZXIoW2lzanVua1ssIGFbLCBiWywgYXV0b2p1bms9VHJ1ZV1dXV0pCisuLiBjbGFzczo6IFNlcXVlbmNlTWF0Y2hlcihpc2p1bms9Tm9uZSwgYT0nJywgYj0nJywgYXV0b2p1bms9VHJ1ZSkKIAogICAgT3B0aW9uYWwgYXJndW1lbnQgKmlzanVuayogbXVzdCBiZSBgYE5vbmVgYCAodGhlIGRlZmF1bHQpIG9yIGEgb25lLWFyZ3VtZW50CiAgICBmdW5jdGlvbiB0aGF0IHRha2VzIGEgc2VxdWVuY2UgZWxlbWVudCBhbmQgcmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZQpAQCAtNjMyLDEwICs2MzIsMTIgQEAKIAogICAgICAgQ29tcGFyZSB0d28gc2VxdWVuY2VzIG9mIGxpbmVzLCBhbmQgZ2VuZXJhdGUgdGhlIGRlbHRhIChhIHNlcXVlbmNlIG9mIGxpbmVzKS4KIAotICAgICAgRWFjaCBzZXF1ZW5jZSBtdXN0IGNvbnRhaW4gaW5kaXZpZHVhbCBzaW5nbGUtbGluZSBzdHJpbmdzIGVuZGluZyB3aXRoIG5ld2xpbmVzLgotICAgICAgU3VjaCBzZXF1ZW5jZXMgY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIDptZXRoOmByZWFkbGluZXNgIG1ldGhvZCBvZiBmaWxlLWxpa2UKLSAgICAgIG9iamVjdHMuICBUaGUgZGVsdGEgZ2VuZXJhdGVkIGFsc28gY29uc2lzdHMgb2YgbmV3bGluZS10ZXJtaW5hdGVkIHN0cmluZ3MsIHJlYWR5Ci0gICAgICB0byBiZSBwcmludGVkIGFzLWlzIHZpYSB0aGUgOm1ldGg6YHdyaXRlbGluZXNgIG1ldGhvZCBvZiBhIGZpbGUtbGlrZSBvYmplY3QuCisgICAgICBFYWNoIHNlcXVlbmNlIG11c3QgY29udGFpbiBpbmRpdmlkdWFsIHNpbmdsZS1saW5lIHN0cmluZ3MgZW5kaW5nIHdpdGgKKyAgICAgIG5ld2xpbmVzLiAgU3VjaCBzZXF1ZW5jZXMgY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlCisgICAgICA6bWV0aDpgfmZpbGUucmVhZGxpbmVzYCBtZXRob2Qgb2YgZmlsZS1saWtlIG9iamVjdHMuICBUaGUgZGVsdGEKKyAgICAgIGdlbmVyYXRlZCBhbHNvIGNvbnNpc3RzIG9mIG5ld2xpbmUtdGVybWluYXRlZCBzdHJpbmdzLCByZWFkeSB0byBiZQorICAgICAgcHJpbnRlZCBhcy1pcyB2aWEgdGhlIDptZXRoOmB+ZmlsZS53cml0ZWxpbmVzYCBtZXRob2Qgb2YgYQorICAgICAgZmlsZS1saWtlIG9iamVjdC4KIAogCiAuLiBfZGlmZmVyLWV4YW1wbGVzOgpAQCAtNjQ1LDcgKzY0Nyw3IEBACiAKIFRoaXMgZXhhbXBsZSBjb21wYXJlcyB0d28gdGV4dHMuIEZpcnN0IHdlIHNldCB1cCB0aGUgdGV4dHMsIHNlcXVlbmNlcyBvZgogaW5kaXZpZHVhbCBzaW5nbGUtbGluZSBzdHJpbmdzIGVuZGluZyB3aXRoIG5ld2xpbmVzIChzdWNoIHNlcXVlbmNlcyBjYW4gYWxzbyBiZQotb2J0YWluZWQgZnJvbSB0aGUgOm1ldGg6YHJlYWRsaW5lc2AgbWV0aG9kIG9mIGZpbGUtbGlrZSBvYmplY3RzKToKK29idGFpbmVkIGZyb20gdGhlIDptZXRoOmB+ZmlsZS5yZWFkbGluZXNgIG1ldGhvZCBvZiBmaWxlLWxpa2Ugb2JqZWN0cyk6CiAKICAgID4+PiB0ZXh0MSA9ICcnJyAgMS4gQmVhdXRpZnVsIGlzIGJldHRlciB0aGFuIHVnbHkuCiAgICAuLi4gICAyLiBFeHBsaWNpdCBpcyBiZXR0ZXIgdGhhbiBpbXBsaWNpdC4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2RpcmNhY2hlLnJzdCBiL0RvYy9saWJyYXJ5L2RpcmNhY2hlLnJzdAppbmRleCA3MWE4YWJlLi42MzJkZGQ1IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9kaXJjYWNoZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZGlyY2FjaGUucnN0CkBAIC03LDcgKzcsNyBAQAogICAgOmRlcHJlY2F0ZWQ6CiAKIC4uIGRlcHJlY2F0ZWQ6OiAyLjYKLSAgIFRoZSA6bW9kOmBkaXJjYWNoZWAgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuMC4KKyAgIFRoZSA6bW9kOmBkaXJjYWNoZWAgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuCiAKIAogLi4gc2VjdGlvbmF1dGhvcjo6IE1vc2hlIFphZGthIDxtb3NoZXpAemFka2Euc2l0ZS5jby5pbD4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2RsLnJzdCBiL0RvYy9saWJyYXJ5L2RsLnJzdAppbmRleCBhMzgzNzI5Li40MDU1NmNjIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9kbC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZGwucnN0CkBAIC04LDEyICs4LDEyIEBACiAgICA6ZGVwcmVjYXRlZDoKIAogLi4gZGVwcmVjYXRlZDo6IDIuNgotICAgIFRoZSA6bW9kOmBkbGAgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuMC4gVXNlIHRoZSA6bW9kOmBjdHlwZXNgCisgICAgVGhlIDptb2Q6YGRsYCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4gVXNlIHRoZSA6bW9kOmBjdHlwZXNgCiAgICAgbW9kdWxlIGluc3RlYWQuCiAKIC4uIHNlY3Rpb25hdXRob3I6OiBNb3NoZSBaYWRrYSA8bW9zaGV6QHphZGthLnNpdGUuY28uaWw+CiAKLVRoZSA6bW9kOmBkbGAgbW9kdWxlIGRlZmluZXMgYW4gaW50ZXJmYWNlIHRvIHRoZSA6Y2Z1bmM6YGRsb3BlbmAgZnVuY3Rpb24sIHdoaWNoCitUaGUgOm1vZDpgZGxgIG1vZHVsZSBkZWZpbmVzIGFuIGludGVyZmFjZSB0byB0aGUgOmM6ZnVuYzpgZGxvcGVuYCBmdW5jdGlvbiwgd2hpY2gKIGlzIHRoZSBtb3N0IGNvbW1vbiBpbnRlcmZhY2Ugb24gVW5peCBwbGF0Zm9ybXMgZm9yIGhhbmRsaW5nIGR5bmFtaWNhbGx5IGxpbmtlZAogbGlicmFyaWVzLiBJdCBhbGxvd3MgdGhlIHByb2dyYW0gdG8gY2FsbCBhcmJpdHJhcnkgZnVuY3Rpb25zIGluIHN1Y2ggYSBsaWJyYXJ5LgogCkBAIC0xMDUsMTAgKzEwNSwxMCBAQAogICAgQ2FsbCB0aGUgZnVuY3Rpb24gbmFtZWQgKm5hbWUqIGluIHRoZSByZWZlcmVuY2VkIHNoYXJlZCBvYmplY3QuIFRoZSBhcmd1bWVudHMKICAgIG11c3QgYmUgZWl0aGVyIFB5dGhvbiBpbnRlZ2Vycywgd2hpY2ggd2lsbCBiZSAgcGFzc2VkIGFzIGlzLCBQeXRob24gc3RyaW5ncywgdG8KICAgIHdoaWNoIGEgcG9pbnRlciB3aWxsIGJlIHBhc3NlZCwgIG9yIGBgTm9uZWBgLCB3aGljaCB3aWxsIGJlIHBhc3NlZCBhcyAqTlVMTCouCi0gICBOb3RlIHRoYXQgIHN0cmluZ3Mgc2hvdWxkIG9ubHkgYmUgcGFzc2VkIHRvIGZ1bmN0aW9ucyBhcyA6Y3R5cGU6YGNvbnN0IGNoYXJcKmAsCisgICBOb3RlIHRoYXQgIHN0cmluZ3Mgc2hvdWxkIG9ubHkgYmUgcGFzc2VkIHRvIGZ1bmN0aW9ucyBhcyA6Yzp0eXBlOmBjb25zdCBjaGFyXCpgLAogICAgYXMgUHl0aG9uIHdpbGwgbm90IGxpa2UgaXRzIHN0cmluZyBtdXRhdGVkLgogCiAgICBUaGVyZSBtdXN0IGJlIGF0IG1vc3QgMTAgYXJndW1lbnRzLCBhbmQgYXJndW1lbnRzIG5vdCBnaXZlbiB3aWxsIGJlIHRyZWF0ZWQgYXMKLSAgIGBgTm9uZWBgLiBUaGUgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgbXVzdCBiZSBhIEMgOmN0eXBlOmBsb25nYCwgd2hpY2ggaXMgYQorICAgYGBOb25lYGAuIFRoZSBmdW5jdGlvbidzIHJldHVybiB2YWx1ZSBtdXN0IGJlIGEgQyA6Yzp0eXBlOmBsb25nYCwgd2hpY2ggaXMgYQogICAgUHl0aG9uIGludGVnZXIuCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2RvY3Rlc3QucnN0IGIvRG9jL2xpYnJhcnkvZG9jdGVzdC5yc3QKaW5kZXggYjZkMTc1Ni4uYTFlMjcwZCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZG9jdGVzdC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZG9jdGVzdC5yc3QKQEAgLTEsMyArMSw1IEBACis6a2VlcGRvY3Rlc3Q6CisKIDptb2Q6YGRvY3Rlc3RgIC0tLSBUZXN0IGludGVyYWN0aXZlIFB5dGhvbiBleGFtcGxlcwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTMzOSw3ICszNDEsOCBAQAogICBUYWJzIGluIG91dHB1dCBnZW5lcmF0ZWQgYnkgdGhlIHRlc3RlZCBjb2RlIGFyZSBub3QgbW9kaWZpZWQuICBCZWNhdXNlIGFueQogICBoYXJkIHRhYnMgaW4gdGhlIHNhbXBsZSBvdXRwdXQgKmFyZSogZXhwYW5kZWQsIHRoaXMgbWVhbnMgdGhhdCBpZiB0aGUgY29kZQogICBvdXRwdXQgaW5jbHVkZXMgaGFyZCB0YWJzLCB0aGUgb25seSB3YXkgdGhlIGRvY3Rlc3QgY2FuIHBhc3MgaXMgaWYgdGhlCi0gIDpjb25zdDpgTk9STUFMSVpFX1dISVRFU1BBQ0VgIG9wdGlvbiBvciBkaXJlY3RpdmUgaXMgaW4gZWZmZWN0LgorICA6Y29uc3Q6YE5PUk1BTElaRV9XSElURVNQQUNFYCBvcHRpb24gb3IgOnJlZjpgZGlyZWN0aXZlIDxkb2N0ZXN0LWRpcmVjdGl2ZXM+YAorICBpcyBpbiBlZmZlY3QuCiAgIEFsdGVybmF0aXZlbHksIHRoZSB0ZXN0IGNhbiBiZSByZXdyaXR0ZW4gdG8gY2FwdHVyZSB0aGUgb3V0cHV0IGFuZCBjb21wYXJlIGl0CiAgIHRvIGFuIGV4cGVjdGVkIHZhbHVlIGFzIHBhcnQgb2YgdGhlIHRlc3QuICBUaGlzIGhhbmRsaW5nIG9mIHRhYnMgaW4gdGhlCiAgIHNvdXJjZSB3YXMgYXJyaXZlZCBhdCB0aHJvdWdoIHRyaWFsIGFuZCBlcnJvciwgYW5kIGhhcyBwcm92ZW4gdG8gYmUgdGhlIGxlYXN0CkBAIC0zNjMsNyArMzY2LDcgQEAKICAgICAgQmFja3NsYXNoZXMgaW4gYSByYXcgZG9jc3RyaW5nOiBtXG4KIAogICBPdGhlcndpc2UsIHRoZSBiYWNrc2xhc2ggd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBwYXJ0IG9mIHRoZSBzdHJpbmcuIEZvciBleGFtcGxlLAotICB0aGUgIlxcIiBhYm92ZSB3b3VsZCBiZSBpbnRlcnByZXRlZCBhcyBhIG5ld2xpbmUgY2hhcmFjdGVyLiAgQWx0ZXJuYXRpdmVseSwgeW91CisgIHRoZSBgYFxuYGAgYWJvdmUgd291bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYSBuZXdsaW5lIGNoYXJhY3Rlci4gIEFsdGVybmF0aXZlbHksIHlvdQogICBjYW4gZG91YmxlIGVhY2ggYmFja3NsYXNoIGluIHRoZSBkb2N0ZXN0IHZlcnNpb24gKGFuZCBub3QgdXNlIGEgcmF3IHN0cmluZyk6OgogCiAgICAgID4+PiBkZWYgZih4KToKQEAgLTUxMSwxNSArNTE0LDE2IEBACiAgICAgIFN5bnRheEVycm9yOiBpbnZhbGlkIHN5bnRheAogCiAKKy4uIF9vcHRpb24tZmxhZ3MtYW5kLWRpcmVjdGl2ZXM6CiAuLiBfZG9jdGVzdC1vcHRpb25zOgogCi1PcHRpb24gRmxhZ3MgYW5kIERpcmVjdGl2ZXMKLV5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorT3B0aW9uIEZsYWdzCiteXl5eXl5eXl5eXl4KIAogQSBudW1iZXIgb2Ygb3B0aW9uIGZsYWdzIGNvbnRyb2wgdmFyaW91cyBhc3BlY3RzIG9mIGRvY3Rlc3QncyBiZWhhdmlvci4KIFN5bWJvbGljIG5hbWVzIGZvciB0aGUgZmxhZ3MgYXJlIHN1cHBsaWVkIGFzIG1vZHVsZSBjb25zdGFudHMsIHdoaWNoIGNhbiBiZQogb3InZWQgdG9nZXRoZXIgYW5kIHBhc3NlZCB0byB2YXJpb3VzIGZ1bmN0aW9ucy4gIFRoZSBuYW1lcyBjYW4gYWxzbyBiZSB1c2VkIGluCi1kb2N0ZXN0IGRpcmVjdGl2ZXMgKHNlZSBiZWxvdykuCis6cmVmOmBkb2N0ZXN0IGRpcmVjdGl2ZXMgPGRvY3Rlc3QtZGlyZWN0aXZlcz5gLgogCiBUaGUgZmlyc3QgZ3JvdXAgb2Ygb3B0aW9ucyBkZWZpbmUgdGVzdCBzZW1hbnRpY3MsIGNvbnRyb2xsaW5nIGFzcGVjdHMgb2YgaG93CiBkb2N0ZXN0IGRlY2lkZXMgd2hldGhlciBhY3R1YWwgb3V0cHV0IG1hdGNoZXMgYW4gZXhhbXBsZSdzIGV4cGVjdGVkIG91dHB1dDoKQEAgLTU3MywxNCArNTc3LDE0IEBACiAgICA6ZXhjOmBUeXBlRXJyb3JgIGlzIHJhaXNlZC4KIAogICAgSXQgd2lsbCBhbHNvIGlnbm9yZSB0aGUgbW9kdWxlIG5hbWUgdXNlZCBpbiBQeXRob24gMyBkb2N0ZXN0IHJlcG9ydHMuIEhlbmNlCi0gICBib3RoIHRoZXNlIHZhcmlhdGlvbnMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgdGVzdCBpcyBydW4gdW5kZXIKLSAgIFB5dGhvbiAyLjcgb3IgUHl0aG9uIDMuMiAob3IgbGF0ZXIgdmVyc2lvbnMpOgorICAgYm90aCBvZiB0aGVzZSB2YXJpYXRpb25zIHdpbGwgd29yayB3aXRoIHRoZSBmbGFnIHNwZWNpZmllZCwgcmVnYXJkbGVzcyBvZgorICAgd2hldGhlciB0aGUgdGVzdCBpcyBydW4gdW5kZXIgUHl0aG9uIDIuNyBvciBQeXRob24gMy4yIChvciBsYXRlciB2ZXJzaW9ucyk6OgogCi0gICAgICA+Pj4gcmFpc2UgQ3VzdG9tRXJyb3IoJ21lc3NhZ2UnKSAjZG9jdGVzdDogK0lHTk9SRV9FWENFUFRJT05fREVUQUlMCisgICAgICA+Pj4gcmFpc2UgQ3VzdG9tRXJyb3IoJ21lc3NhZ2UnKQogICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICAgQ3VzdG9tRXJyb3I6IG1lc3NhZ2UKIAotICAgICAgPj4+IHJhaXNlIEN1c3RvbUVycm9yKCdtZXNzYWdlJykgI2RvY3Rlc3Q6ICtJR05PUkVfRVhDRVBUSU9OX0RFVEFJTAorICAgICAgPj4+IHJhaXNlIEN1c3RvbUVycm9yKCdtZXNzYWdlJykKICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgIG15X21vZHVsZS5DdXN0b21FcnJvcjogbWVzc2FnZQogCkBAIC01OTAsMTUgKzU5NCwxNiBAQAogICAgZXhjZXB0aW9uIG5hbWUuIFVzaW5nIDpjb25zdDpgSUdOT1JFX0VYQ0VQVElPTl9ERVRBSUxgIGFuZCB0aGUgZGV0YWlscwogICAgZnJvbSBQeXRob24gMi4zIGlzIGFsc28gdGhlIG9ubHkgY2xlYXIgd2F5IHRvIHdyaXRlIGEgZG9jdGVzdCB0aGF0IGRvZXNuJ3QKICAgIGNhcmUgYWJvdXQgdGhlIGV4Y2VwdGlvbiBkZXRhaWwgeWV0IGNvbnRpbnVlcyB0byBwYXNzIHVuZGVyIFB5dGhvbiAyLjMgb3IKLSAgIGVhcmxpZXIgKHRob3NlIHJlbGVhc2VzIGRvIG5vdCBzdXBwb3J0IGRvY3Rlc3QgZGlyZWN0aXZlcyBhbmQgaWdub3JlIHRoZW0KLSAgIGFzIGlycmVsZXZhbnQgY29tbWVudHMpLiBGb3IgZXhhbXBsZSwgOjoKKyAgIGVhcmxpZXIgKHRob3NlIHJlbGVhc2VzIGRvIG5vdCBzdXBwb3J0IDpyZWY6YGRvY3Rlc3QgZGlyZWN0aXZlcworICAgPGRvY3Rlc3QtZGlyZWN0aXZlcz5gIGFuZCBpZ25vcmUgdGhlbSBhcyBpcnJlbGV2YW50IGNvbW1lbnRzKS4gRm9yIGV4YW1wbGU6OgogCi0gICAgICA+Pj4gKDEsIDIpWzNdID0gJ21vbycgI2RvY3Rlc3Q6ICtJR05PUkVfRVhDRVBUSU9OX0RFVEFJTAorICAgICAgPj4+ICgxLCAyKVszXSA9ICdtb28nCiAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KICAgICAgIFR5cGVFcnJvcjogb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQKIAotICAgcGFzc2VzIHVuZGVyIFB5dGhvbiAyLjMgYW5kIGxhdGVyIFB5dGhvbiB2ZXJzaW9ucywgZXZlbiB0aG91Z2ggdGhlIGRldGFpbAorICAgcGFzc2VzIHVuZGVyIFB5dGhvbiAyLjMgYW5kIGxhdGVyIFB5dGhvbiB2ZXJzaW9ucyB3aXRoIHRoZSBmbGFnIHNwZWNpZmllZCwKKyAgIGV2ZW4gdGhvdWdoIHRoZSBkZXRhaWwKICAgIGNoYW5nZWQgaW4gUHl0aG9uIDIuNCB0byBzYXkgImRvZXMgbm90IiBpbnN0ZWFkIG9mICJkb2Vzbid0Ii4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjcKQEAgLTY2Miw5ICs2NjcsNDAgQEAKIAogICAgQSBiaXRtYXNrIG9yJ2luZyB0b2dldGhlciBhbGwgdGhlIHJlcG9ydGluZyBmbGFncyBhYm92ZS4KIAotIkRvY3Rlc3QgZGlyZWN0aXZlcyIgbWF5IGJlIHVzZWQgdG8gbW9kaWZ5IHRoZSBvcHRpb24gZmxhZ3MgZm9yIGluZGl2aWR1YWwKLWV4YW1wbGVzLiAgRG9jdGVzdCBkaXJlY3RpdmVzIGFyZSBleHByZXNzZWQgYXMgYSBzcGVjaWFsIFB5dGhvbiBjb21tZW50Ci1mb2xsb3dpbmcgYW4gZXhhbXBsZSdzIHNvdXJjZSBjb2RlOgorCisuLiB2ZXJzaW9uYWRkZWQ6OiAyLjQKKyAgIFRoZSBjb25zdGFudHMKKyAgIDpjb25zdDpgRE9OVF9BQ0NFUFRfQkxBTktMSU5FYCwgOmNvbnN0OmBOT1JNQUxJWkVfV0hJVEVTUEFDRWAsCisgICA6Y29uc3Q6YEVMTElQU0lTYCwgOmNvbnN0OmBJR05PUkVfRVhDRVBUSU9OX0RFVEFJTGAsIDpjb25zdDpgUkVQT1JUX1VESUZGYCwKKyAgIDpjb25zdDpgUkVQT1JUX0NESUZGYCwgOmNvbnN0OmBSRVBPUlRfTkRJRkZgLAorICAgOmNvbnN0OmBSRVBPUlRfT05MWV9GSVJTVF9GQUlMVVJFYCwgOmNvbnN0OmBDT01QQVJJU09OX0ZMQUdTYCBhbmQKKyAgIDpjb25zdDpgUkVQT1JUSU5HX0ZMQUdTYCB3ZXJlIGFkZGVkLgorCitUaGVyZSdzIGFsc28gYSB3YXkgdG8gcmVnaXN0ZXIgbmV3IG9wdGlvbiBmbGFnIG5hbWVzLCBhbHRob3VnaCB0aGlzIGlzbid0IHVzZWZ1bAordW5sZXNzIHlvdSBpbnRlbmQgdG8gZXh0ZW5kIDptb2Q6YGRvY3Rlc3RgIGludGVybmFscyB2aWEgc3ViY2xhc3Npbmc6CisKKworLi4gZnVuY3Rpb246OiByZWdpc3Rlcl9vcHRpb25mbGFnKG5hbWUpCisKKyAgIENyZWF0ZSBhIG5ldyBvcHRpb24gZmxhZyB3aXRoIGEgZ2l2ZW4gbmFtZSwgYW5kIHJldHVybiB0aGUgbmV3IGZsYWcncyBpbnRlZ2VyCisgICB2YWx1ZS4gIDpmdW5jOmByZWdpc3Rlcl9vcHRpb25mbGFnYCBjYW4gYmUgdXNlZCB3aGVuIHN1YmNsYXNzaW5nCisgICA6Y2xhc3M6YE91dHB1dENoZWNrZXJgIG9yIDpjbGFzczpgRG9jVGVzdFJ1bm5lcmAgdG8gY3JlYXRlIG5ldyBvcHRpb25zIHRoYXQgYXJlCisgICBzdXBwb3J0ZWQgYnkgeW91ciBzdWJjbGFzc2VzLiAgOmZ1bmM6YHJlZ2lzdGVyX29wdGlvbmZsYWdgIHNob3VsZCBhbHdheXMgYmUKKyAgIGNhbGxlZCB1c2luZyB0aGUgZm9sbG93aW5nIGlkaW9tOjoKKworICAgICAgTVlfRkxBRyA9IHJlZ2lzdGVyX29wdGlvbmZsYWcoJ01ZX0ZMQUcnKQorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjQKKworCisuLiBfZG9jdGVzdC1kaXJlY3RpdmVzOgorCitEaXJlY3RpdmVzCiteXl5eXl5eXl5eCisKK0RvY3Rlc3QgZGlyZWN0aXZlcyBtYXkgYmUgdXNlZCB0byBtb2RpZnkgdGhlIDpyZWY6YG9wdGlvbiBmbGFncworPGRvY3Rlc3Qtb3B0aW9ucz5gIGZvciBhbiBpbmRpdmlkdWFsIGV4YW1wbGUuICBEb2N0ZXN0IGRpcmVjdGl2ZXMgYXJlCitzcGVjaWFsIFB5dGhvbiBjb21tZW50cyBmb2xsb3dpbmcgYW4gZXhhbXBsZSdzIHNvdXJjZSBjb2RlOgogCiAuLiBwcm9kdWN0aW9ubGlzdDo6IGRvY3Rlc3QKICAgIGRpcmVjdGl2ZTogIiMiICJkb2N0ZXN0OiIgYGRpcmVjdGl2ZV9vcHRpb25zYApAQCAtNjgyLDcgKzcxOCw3IEBACiAKIEZvciBleGFtcGxlLCB0aGlzIHRlc3QgcGFzc2VzOjoKIAotICAgPj4+IHByaW50IHJhbmdlKDIwKSAjZG9jdGVzdDogK05PUk1BTElaRV9XSElURVNQQUNFCisgICA+Pj4gcHJpbnQgcmFuZ2UoMjApICMgZG9jdGVzdDogK05PUk1BTElaRV9XSElURVNQQUNFCiAgICBbMCwgICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksCiAgICAxMCwgIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTldCiAKQEAgLTY5MSwxMCArNzI3LDExIEBACiBpcyBvbiBhIHNpbmdsZSBsaW5lLiAgVGhpcyB0ZXN0IGFsc28gcGFzc2VzLCBhbmQgYWxzbyByZXF1aXJlcyBhIGRpcmVjdGl2ZSB0byBkbwogc286OgogCi0gICA+Pj4gcHJpbnQgcmFuZ2UoMjApICMgZG9jdGVzdDorRUxMSVBTSVMKKyAgID4+PiBwcmludCByYW5nZSgyMCkgIyBkb2N0ZXN0OiArRUxMSVBTSVMKICAgIFswLCAxLCAuLi4sIDE4LCAxOV0KIAotTXVsdGlwbGUgZGlyZWN0aXZlcyBjYW4gYmUgdXNlZCBvbiBhIHNpbmdsZSBwaHlzaWNhbCBsaW5lLCBzZXBhcmF0ZWQgYnkgY29tbWFzOjoKK011bHRpcGxlIGRpcmVjdGl2ZXMgY2FuIGJlIHVzZWQgb24gYSBzaW5nbGUgcGh5c2ljYWwgbGluZSwgc2VwYXJhdGVkIGJ5Citjb21tYXM6OgogCiAgICA+Pj4gcHJpbnQgcmFuZ2UoMjApICMgZG9jdGVzdDogK0VMTElQU0lTLCArTk9STUFMSVpFX1dISVRFU1BBQ0UKICAgIFswLCAgICAxLCAuLi4sICAgMTgsICAgIDE5XQpAQCAtNzIxLDI4ICs3NTgsNyBAQAogZGlzYWJsaW5nIGFuIG9wdGlvbiB2aWEgYGAtYGAgaW4gYSBkaXJlY3RpdmUgY2FuIGJlIHVzZWZ1bC4KIAogLi4gdmVyc2lvbmFkZGVkOjogMi40Ci0gICBEb2N0ZXN0IGRpcmVjdGl2ZXMgYW5kIHRoZSBhc3NvY2lhdGVkIGNvbnN0YW50cwotICAgOmNvbnN0OmBET05UX0FDQ0VQVF9CTEFOS0xJTkVgLCA6Y29uc3Q6YE5PUk1BTElaRV9XSElURVNQQUNFYCwKLSAgIDpjb25zdDpgRUxMSVBTSVNgLCA6Y29uc3Q6YElHTk9SRV9FWENFUFRJT05fREVUQUlMYCwgOmNvbnN0OmBSRVBPUlRfVURJRkZgLAotICAgOmNvbnN0OmBSRVBPUlRfQ0RJRkZgLCA6Y29uc3Q6YFJFUE9SVF9ORElGRmAsCi0gICA6Y29uc3Q6YFJFUE9SVF9PTkxZX0ZJUlNUX0ZBSUxVUkVgLCA6Y29uc3Q6YENPTVBBUklTT05fRkxBR1NgIGFuZAotICAgOmNvbnN0OmBSRVBPUlRJTkdfRkxBR1NgIHdlcmUgYWRkZWQuCi0KLVRoZXJlJ3MgYWxzbyBhIHdheSB0byByZWdpc3RlciBuZXcgb3B0aW9uIGZsYWcgbmFtZXMsIGFsdGhvdWdoIHRoaXMgaXNuJ3QgdXNlZnVsCi11bmxlc3MgeW91IGludGVuZCB0byBleHRlbmQgOm1vZDpgZG9jdGVzdGAgaW50ZXJuYWxzIHZpYSBzdWJjbGFzc2luZzoKLQotCi0uLiBmdW5jdGlvbjo6IHJlZ2lzdGVyX29wdGlvbmZsYWcobmFtZSkKLQotICAgQ3JlYXRlIGEgbmV3IG9wdGlvbiBmbGFnIHdpdGggYSBnaXZlbiBuYW1lLCBhbmQgcmV0dXJuIHRoZSBuZXcgZmxhZydzIGludGVnZXIKLSAgIHZhbHVlLiAgOmZ1bmM6YHJlZ2lzdGVyX29wdGlvbmZsYWdgIGNhbiBiZSB1c2VkIHdoZW4gc3ViY2xhc3NpbmcKLSAgIDpjbGFzczpgT3V0cHV0Q2hlY2tlcmAgb3IgOmNsYXNzOmBEb2NUZXN0UnVubmVyYCB0byBjcmVhdGUgbmV3IG9wdGlvbnMgdGhhdCBhcmUKLSAgIHN1cHBvcnRlZCBieSB5b3VyIHN1YmNsYXNzZXMuICA6ZnVuYzpgcmVnaXN0ZXJfb3B0aW9uZmxhZ2Agc2hvdWxkIGFsd2F5cyBiZQotICAgY2FsbGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgaWRpb206OgotCi0gICAgICBNWV9GTEFHID0gcmVnaXN0ZXJfb3B0aW9uZmxhZygnTVlfRkxBRycpCi0KLSAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNAorICAgU3VwcG9ydCBmb3IgZG9jdGVzdCBkaXJlY3RpdmVzIHdhcyBhZGRlZC4KIAogCiAuLiBfZG9jdGVzdC13YXJuaW5nczoKQEAgLTEwNjAsNiArMTA3NiwxNiBAQAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKICAgICAgIFRoZSBwYXJhbWV0ZXIgKmVuY29kaW5nKiB3YXMgYWRkZWQuCiAKKyAgIC4uIG5vdGU6OgorICAgICAgVW5saWtlIDpmdW5jOmB0ZXN0bW9kYCBhbmQgOmNsYXNzOmBEb2NUZXN0RmluZGVyYCwgdGhpcyBmdW5jdGlvbiByYWlzZXMKKyAgICAgIGEgOmV4YzpgVmFsdWVFcnJvcmAgaWYgKm1vZHVsZSogY29udGFpbnMgbm8gZG9jc3RyaW5ncy4gIFlvdSBjYW4gcHJldmVudAorICAgICAgdGhpcyBlcnJvciBieSBwYXNzaW5nIGEgOmNsYXNzOmBEb2NUZXN0RmluZGVyYCBpbnN0YW5jZSBhcyB0aGUKKyAgICAgICp0ZXN0X2ZpbmRlciogYXJndW1lbnQgd2l0aCBpdHMgKmV4Y2x1ZGVfZW1wdHkqIGtleXdvcmQgYXJndW1lbnQgc2V0CisgICAgICB0byBgYEZhbHNlYGA6OgorCisgICAgICAgICA+Pj4gZmluZGVyID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKGV4Y2x1ZGVfZW1wdHk9RmFsc2UpCisgICAgICAgICA+Pj4gc3VpdGUgPSBkb2N0ZXN0LkRvY1Rlc3RTdWl0ZSh0ZXN0X2ZpbmRlcj1maW5kZXIpCisKIAogLi4gZnVuY3Rpb246OiBEb2NUZXN0U3VpdGUoW21vZHVsZV1bLCBnbG9ic11bLCBleHRyYWdsb2JzXVssIHRlc3RfZmluZGVyXVssIHNldFVwXVssIHRlYXJEb3duXVssIGNoZWNrZXJdKQogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9kb2N4bWxycGNzZXJ2ZXIucnN0IGIvRG9jL2xpYnJhcnkvZG9jeG1scnBjc2VydmVyLnJzdAppbmRleCA2N2NiM2I5Li4wOGU0ZTRiIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9kb2N4bWxycGNzZXJ2ZXIucnN0CisrKyBiL0RvYy9saWJyYXJ5L2RvY3htbHJwY3NlcnZlci5yc3QKQEAgLTgsOCArOCw4IEBACiAKIC4uIG5vdGU6OgogICAgVGhlIDptb2Q6YERvY1hNTFJQQ1NlcnZlcmAgbW9kdWxlIGhhcyBiZWVuIG1lcmdlZCBpbnRvIDptb2Q6YHhtbHJwYy5zZXJ2ZXJgCi0gICBpbiBQeXRob24gMy4wLiAgVGhlIDp0ZXJtOmAydG8zYCB0b29sIHdpbGwgYXV0b21hdGljYWxseSBhZGFwdCBpbXBvcnRzIHdoZW4KLSAgIGNvbnZlcnRpbmcgeW91ciBzb3VyY2VzIHRvIDMuMC4KKyAgIGluIFB5dGhvbiAzLiAgVGhlIDp0ZXJtOmAydG8zYCB0b29sIHdpbGwgYXV0b21hdGljYWxseSBhZGFwdCBpbXBvcnRzIHdoZW4KKyAgIGNvbnZlcnRpbmcgeW91ciBzb3VyY2VzIHRvIFB5dGhvbiAzLgogCiAKIC4uIHZlcnNpb25hZGRlZDo6IDIuMwpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZHVtYmRibS5yc3QgYi9Eb2MvbGlicmFyeS9kdW1iZGJtLnJzdAppbmRleCBhNTExODU1Li4xYTlhNjQ3IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9kdW1iZGJtLnJzdAorKysgYi9Eb2MvbGlicmFyeS9kdW1iZGJtLnJzdApAQCAtNSw5ICs1LDkgQEAKICAgIDpzeW5vcHNpczogUG9ydGFibGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNpbXBsZSBEQk0gaW50ZXJmYWNlLgogCiAuLiBub3RlOjoKLSAgIFRoZSA6bW9kOmBkdW1iZGJtYCBtb2R1bGUgaGFzIGJlZW4gcmVuYW1lZCB0byA6bW9kOmBkYm0uZHVtYmAgaW4gUHl0aG9uIDMuMC4KKyAgIFRoZSA6bW9kOmBkdW1iZGJtYCBtb2R1bGUgaGFzIGJlZW4gcmVuYW1lZCB0byA6bW9kOmBkYm0uZHVtYmAgaW4gUHl0aG9uIDMuCiAgICBUaGUgOnRlcm06YDJ0bzNgIHRvb2wgd2lsbCBhdXRvbWF0aWNhbGx5IGFkYXB0IGltcG9ydHMgd2hlbiBjb252ZXJ0aW5nIHlvdXIKLSAgIHNvdXJjZXMgdG8gMy4wLgorICAgc291cmNlcyB0byBQeXRob24gMy4KIAogLi4gaW5kZXg6OiBzaW5nbGU6IGRhdGFiYXNlcwogCkBAIC00OSw2ICs0OSwxNCBAQAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjIKICAgICAgIFRoZSAqbW9kZSogYXJndW1lbnQgd2FzIGlnbm9yZWQgaW4gZWFybGllciB2ZXJzaW9ucy4KIAorSW4gYWRkaXRpb24gdG8gdGhlIGRpY3Rpb25hcnktbGlrZSBtZXRob2RzLCBgYGR1bWJkbWBgIG9iamVjdHMKK3Byb3ZpZGUgdGhlIGZvbGxvd2luZyBtZXRob2Q6CisKKworLi4gZnVuY3Rpb246OiBjbG9zZSgpCisKKyAgIENsb3NlIHRoZSBgYGR1bWJkbWBgIGRhdGFiYXNlLgorCiAKIC4uIHNlZWFsc286OgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9kdW1teV90aHJlYWQucnN0IGIvRG9jL2xpYnJhcnkvZHVtbXlfdGhyZWFkLnJzdAppbmRleCBhNGRiYTg2Li5hMWQ5NzdkIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9kdW1teV90aHJlYWQucnN0CisrKyBiL0RvYy9saWJyYXJ5L2R1bW15X3RocmVhZC5yc3QKQEAgLTYsOCArNiw4IEBACiAKIC4uIG5vdGU6OgogICAgVGhlIDptb2Q6YGR1bW15X3RocmVhZGAgbW9kdWxlIGhhcyBiZWVuIHJlbmFtZWQgdG8gOm1vZDpgX2R1bW15X3RocmVhZGAgaW4KLSAgIFB5dGhvbiAzLjAuICBUaGUgOnRlcm06YDJ0bzNgIHRvb2wgd2lsbCBhdXRvbWF0aWNhbGx5IGFkYXB0IGltcG9ydHMgd2hlbgotICAgY29udmVydGluZyB5b3VyIHNvdXJjZXMgdG8gMy4wOyBob3dldmVyLCB5b3Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIHRoZQorICAgUHl0aG9uIDMuICBUaGUgOnRlcm06YDJ0bzNgIHRvb2wgd2lsbCBhdXRvbWF0aWNhbGx5IGFkYXB0IGltcG9ydHMgd2hlbgorICAgY29udmVydGluZyB5b3VyIHNvdXJjZXMgdG8gUHl0aG9uIDM7IGhvd2V2ZXIsIHlvdSBzaG91bGQgY29uc2lkZXIgdXNpbmcgdGhlCiAgICBoaWdoLWxldmVyIDptb2Q6YGR1bW15X3RocmVhZGluZ2AgbW9kdWxlIGluc3RlYWQuCiAKICoqU291cmNlIGNvZGU6KiogOnNvdXJjZTpgTGliL2R1bW15X3RocmVhZC5weWAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2Vhc3lkaWFsb2dzLnJzdCBiL0RvYy9saWJyYXJ5L2Vhc3lkaWFsb2dzLnJzdAppbmRleCAyY2VhNjkzLi5hMDQyYjBmIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9lYXN5ZGlhbG9ncy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZWFzeWRpYWxvZ3MucnN0CkBAIC0xNDMsNyArMTQzLDcgQEAKIAogLi4gc2VlYWxzbzo6CiAKLSAgIGBOYXZpZ2F0aW9uIFNlcnZpY2VzIFJlZmVyZW5jZSA8aHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi9DYXJib24vUmVmZXJlbmNlL05hdmlnYXRpb25fU2VydmljZXNfUmVmLz5gXworICAgYE5hdmlnYXRpb24gU2VydmljZXMgUmVmZXJlbmNlIDxodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9sZWdhY3kvbWFjL2xpYnJhcnkvI2RvY3VtZW50YXRpb24vQ2FyYm9uL0NvbmNlcHR1YWwvTmF2U2VydmljZXNJbnRyby9uc19pbnRyb19jYXJiL25zX2ludG9fY2FyYi5odG1sPmBfCiAgICAgICBQcm9ncmFtbWVyJ3MgcmVmZXJlbmNlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBOYXZpZ2F0aW9uIFNlcnZpY2VzLCBhIHBhcnQgb2YgdGhlCiAgICAgICBDYXJib24gZnJhbWV3b3JrLgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9lbWFpbC5jaGFyc2V0LnJzdCBiL0RvYy9saWJyYXJ5L2VtYWlsLmNoYXJzZXQucnN0CmluZGV4IGIwMDgzODYuLjBlZDZmMGEgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2VtYWlsLmNoYXJzZXQucnN0CisrKyBiL0RvYy9saWJyYXJ5L2VtYWlsLmNoYXJzZXQucnN0CkBAIC0xLDUgKzEsNSBAQAotOm1vZDpgZW1haWxgOiBSZXByZXNlbnRpbmcgY2hhcmFjdGVyIHNldHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis6bW9kOmBlbWFpbC5jaGFyc2V0YDogUmVwcmVzZW50aW5nIGNoYXJhY3RlciBzZXRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC4uIG1vZHVsZTo6IGVtYWlsLmNoYXJzZXQKICAgIDpzeW5vcHNpczogQ2hhcmFjdGVyIFNldHMKQEAgLTI0OSw1ICsyNDksNSBAQAogCiAgICAqY2hhcnNldCogaXMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIGEgY2hhcmFjdGVyIHNldC4gKmNvZGVjbmFtZSogaXMgdGhlIG5hbWUgb2YgYQogICAgUHl0aG9uIGNvZGVjLCBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIHNlY29uZCBhcmd1bWVudCB0byB0aGUgOmZ1bmM6YHVuaWNvZGVgCi0gICBidWlsdC1pbiwgb3IgdG8gdGhlIDptZXRoOmBlbmNvZGVgIG1ldGhvZCBvZiBhIFVuaWNvZGUgc3RyaW5nLgorICAgYnVpbHQtaW4sIG9yIHRvIHRoZSA6bWV0aDpgfnVuaWNvZGUuZW5jb2RlYCBtZXRob2Qgb2YgYSBVbmljb2RlIHN0cmluZy4KIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZW1haWwuZW5jb2RlcnMucnN0IGIvRG9jL2xpYnJhcnkvZW1haWwuZW5jb2RlcnMucnN0CmluZGV4IDU0MjFiOWYuLjkxNmJhNWQgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2VtYWlsLmVuY29kZXJzLnJzdAorKysgYi9Eb2MvbGlicmFyeS9lbWFpbC5lbmNvZGVycy5yc3QKQEAgLTEsNSArMSw1IEBACi06bW9kOmBlbWFpbGA6IEVuY29kZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis6bW9kOmBlbWFpbC5lbmNvZGVyc2A6IEVuY29kZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC4uIG1vZHVsZTo6IGVtYWlsLmVuY29kZXJzCiAgICA6c3lub3BzaXM6IEVuY29kZXJzIGZvciBlbWFpbCBtZXNzYWdlIHBheWxvYWRzLgpAQCAtMTgsNiArMTgsMTAgQEAKIHBheWxvYWQsIGVuY29kZSBpdCwgYW5kIHJlc2V0IHRoZSBwYXlsb2FkIHRvIHRoaXMgbmV3bHkgZW5jb2RlZCB2YWx1ZS4gIFRoZXkKIHNob3VsZCBhbHNvIHNldCB0aGUgOm1haWxoZWFkZXI6YENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmdgIGhlYWRlciBhcyBhcHByb3ByaWF0ZS4KIAorTm90ZSB0aGF0IHRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IG1lYW5pbmdmdWwgZm9yIGEgbXVsdGlwYXJ0IG1lc3NhZ2UuICBUaGV5CittdXN0IGJlIGFwcGxpZWQgdG8gaW5kaXZpZHVhbCBzdWJwYXJ0cyBpbnN0ZWFkLCBhbmQgd2lsbCByYWlzZSBhCis6ZXhjOmBUeXBlRXJyb3JgIGlmIHBhc3NlZCBhIG1lc3NhZ2Ugd2hvc2UgdHlwZSBpcyBtdWx0aXBhcnQuCisKIEhlcmUgYXJlIHRoZSBlbmNvZGluZyBmdW5jdGlvbnMgcHJvdmlkZWQ6CiAKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZW1haWwuZXJyb3JzLnJzdCBiL0RvYy9saWJyYXJ5L2VtYWlsLmVycm9ycy5yc3QKaW5kZXggMDY1OThkNS4uNDk5ZDc1NCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZW1haWwuZXJyb3JzLnJzdAorKysgYi9Eb2MvbGlicmFyeS9lbWFpbC5lcnJvcnMucnN0CkBAIC0xLDUgKzEsNSBAQAotOm1vZDpgZW1haWxgOiBFeGNlcHRpb24gYW5kIERlZmVjdCBjbGFzc2VzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzptb2Q6YGVtYWlsLmVycm9yc2A6IEV4Y2VwdGlvbiBhbmQgRGVmZWN0IGNsYXNzZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLi4gbW9kdWxlOjogZW1haWwuZXJyb3JzCiAgICA6c3lub3BzaXM6IFRoZSBleGNlcHRpb24gY2xhc3NlcyB1c2VkIGJ5IHRoZSBlbWFpbCBwYWNrYWdlLgpAQCAtMjUsNyArMjUsOCBAQAogCiAgICBSYWlzZWQgdW5kZXIgc29tZSBlcnJvciBjb25kaXRpb25zIHdoZW4gcGFyc2luZyB0aGUgOnJmYzpgMjgyMmAgaGVhZGVycyBvZiBhCiAgICBtZXNzYWdlLCB0aGlzIGNsYXNzIGlzIGRlcml2ZWQgZnJvbSA6ZXhjOmBNZXNzYWdlUGFyc2VFcnJvcmAuIEl0IGNhbiBiZSByYWlzZWQKLSAgIGZyb20gdGhlIDptZXRoOmBQYXJzZXIucGFyc2VgIG9yIDptZXRoOmBQYXJzZXIucGFyc2VzdHJgIG1ldGhvZHMuCisgICBmcm9tIHRoZSA6bWV0aDpgUGFyc2VyLnBhcnNlIDxlbWFpbC5wYXJzZXIuUGFyc2VyLnBhcnNlPmAgb3IKKyAgIDptZXRoOmBQYXJzZXIucGFyc2VzdHIgPGVtYWlsLnBhcnNlci5QYXJzZXIucGFyc2VzdHI+YCBtZXRob2RzLgogCiAgICBTaXR1YXRpb25zIHdoZXJlIGl0IGNhbiBiZSByYWlzZWQgaW5jbHVkZSBmaW5kaW5nIGFuIGVudmVsb3BlIGhlYWRlciBhZnRlciB0aGUKICAgIGZpcnN0IDpyZmM6YDI4MjJgIGhlYWRlciBvZiB0aGUgbWVzc2FnZSwgZmluZGluZyBhIGNvbnRpbnVhdGlvbiBsaW5lIGJlZm9yZSB0aGUKQEAgLTM3LDcgKzM4LDggQEAKIAogICAgUmFpc2VkIHVuZGVyIHNvbWUgZXJyb3IgY29uZGl0aW9ucyB3aGVuIHBhcnNpbmcgdGhlIDpyZmM6YDI4MjJgIGhlYWRlcnMgb2YgYQogICAgbWVzc2FnZSwgdGhpcyBjbGFzcyBpcyBkZXJpdmVkIGZyb20gOmV4YzpgTWVzc2FnZVBhcnNlRXJyb3JgLiBJdCBjYW4gYmUgcmFpc2VkCi0gICBmcm9tIHRoZSA6bWV0aDpgUGFyc2VyLnBhcnNlYCBvciA6bWV0aDpgUGFyc2VyLnBhcnNlc3RyYCBtZXRob2RzLgorICAgZnJvbSB0aGUgOm1ldGg6YFBhcnNlci5wYXJzZSA8ZW1haWwucGFyc2VyLlBhcnNlci5wYXJzZT5gIG9yCisgICA6bWV0aDpgUGFyc2VyLnBhcnNlc3RyIDxlbWFpbC5wYXJzZXIuUGFyc2VyLnBhcnNlc3RyPmAgbWV0aG9kcy4KIAogICAgU2l0dWF0aW9ucyB3aGVyZSBpdCBjYW4gYmUgcmFpc2VkIGluY2x1ZGUgbm90IGJlaW5nIGFibGUgdG8gZmluZCB0aGUgc3RhcnRpbmcgb3IKICAgIHRlcm1pbmF0aW5nIGJvdW5kYXJ5IGluIGEgOm1pbWV0eXBlOmBtdWx0aXBhcnQvXCpgIG1lc3NhZ2Ugd2hlbiBzdHJpY3QgcGFyc2luZwpAQCAtNDYsMTkgKzQ4LDIwIEBACiAKIC4uIGV4Y2VwdGlvbjo6IE11bHRpcGFydENvbnZlcnNpb25FcnJvcigpCiAKLSAgIFJhaXNlZCB3aGVuIGEgcGF5bG9hZCBpcyBhZGRlZCB0byBhIDpjbGFzczpgTWVzc2FnZWAgb2JqZWN0IHVzaW5nCi0gICA6bWV0aDpgYWRkX3BheWxvYWRgLCBidXQgdGhlIHBheWxvYWQgaXMgYWxyZWFkeSBhIHNjYWxhciBhbmQgdGhlIG1lc3NhZ2UncwotICAgOm1haWxoZWFkZXI6YENvbnRlbnQtVHlwZWAgbWFpbiB0eXBlIGlzIG5vdCBlaXRoZXIgOm1pbWV0eXBlOmBtdWx0aXBhcnRgIG9yCi0gICBtaXNzaW5nLiAgOmV4YzpgTXVsdGlwYXJ0Q29udmVyc2lvbkVycm9yYCBtdWx0aXBseSBpbmhlcml0cyBmcm9tCi0gICA6ZXhjOmBNZXNzYWdlRXJyb3JgIGFuZCB0aGUgYnVpbHQtaW4gOmV4YzpgVHlwZUVycm9yYC4KKyAgIFJhaXNlZCB3aGVuIGEgcGF5bG9hZCBpcyBhZGRlZCB0byBhIDpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZWAgb2JqZWN0CisgICB1c2luZyA6bWV0aDpgYWRkX3BheWxvYWRgLCBidXQgdGhlIHBheWxvYWQgaXMgYWxyZWFkeSBhIHNjYWxhciBhbmQgdGhlCisgICBtZXNzYWdlJ3MgOm1haWxoZWFkZXI6YENvbnRlbnQtVHlwZWAgbWFpbiB0eXBlIGlzIG5vdCBlaXRoZXIKKyAgIDptaW1ldHlwZTpgbXVsdGlwYXJ0YCBvciBtaXNzaW5nLiAgOmV4YzpgTXVsdGlwYXJ0Q29udmVyc2lvbkVycm9yYCBtdWx0aXBseQorICAgaW5oZXJpdHMgZnJvbSA6ZXhjOmBNZXNzYWdlRXJyb3JgIGFuZCB0aGUgYnVpbHQtaW4gOmV4YzpgVHlwZUVycm9yYC4KIAotICAgU2luY2UgOm1ldGg6YE1lc3NhZ2UuYWRkX3BheWxvYWRgIGlzIGRlcHJlY2F0ZWQsIHRoaXMgZXhjZXB0aW9uIGlzIHJhcmVseSByYWlzZWQKLSAgIGluIHByYWN0aWNlLiAgSG93ZXZlciB0aGUgZXhjZXB0aW9uIG1heSBhbHNvIGJlIHJhaXNlZCBpZiB0aGUgOm1ldGg6YGF0dGFjaGAKKyAgIFNpbmNlIDptZXRoOmBNZXNzYWdlLmFkZF9wYXlsb2FkYCBpcyBkZXByZWNhdGVkLCB0aGlzIGV4Y2VwdGlvbiBpcyByYXJlbHkKKyAgIHJhaXNlZCBpbiBwcmFjdGljZS4gIEhvd2V2ZXIgdGhlIGV4Y2VwdGlvbiBtYXkgYWxzbyBiZSByYWlzZWQgaWYgdGhlCisgICA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5hdHRhY2hgCiAgICBtZXRob2QgaXMgY2FsbGVkIG9uIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgZGVyaXZlZCBmcm9tCiAgICA6Y2xhc3M6YH5lbWFpbC5taW1lLm5vbm11bHRpcGFydC5NSU1FTm9uTXVsdGlwYXJ0YCAoZS5nLgogICAgOmNsYXNzOmB+ZW1haWwubWltZS5pbWFnZS5NSU1FSW1hZ2VgKS4KIAotSGVyZSdzIHRoZSBsaXN0IG9mIHRoZSBkZWZlY3RzIHRoYXQgdGhlIDpjbGFzczpgfmVtYWlsLm1pbWUucGFyc2VyLkZlZWRQYXJzZXJgCitIZXJlJ3MgdGhlIGxpc3Qgb2YgdGhlIGRlZmVjdHMgdGhhdCB0aGUgOmNsYXNzOmB+ZW1haWwucGFyc2VyLkZlZWRQYXJzZXJgCiBjYW4gZmluZCB3aGlsZSBwYXJzaW5nIG1lc3NhZ2VzLiAgTm90ZSB0aGF0IHRoZSBkZWZlY3RzIGFyZSBhZGRlZCB0byB0aGUgbWVzc2FnZQogd2hlcmUgdGhlIHByb2JsZW0gd2FzIGZvdW5kLCBzbyBmb3IgZXhhbXBsZSwgaWYgYSBtZXNzYWdlIG5lc3RlZCBpbnNpZGUgYQogOm1pbWV0eXBlOmBtdWx0aXBhcnQvYWx0ZXJuYXRpdmVgIGhhZCBhIG1hbGZvcm1lZCBoZWFkZXIsIHRoYXQgbmVzdGVkIG1lc3NhZ2UKQEAgLTg2LDcgKzg5LDcgQEAKICAgb3Igd2FzIG90aGVyd2lzZSBtYWxmb3JtZWQuCiAKICogOmNsYXNzOmBNdWx0aXBhcnRJbnZhcmlhbnRWaW9sYXRpb25EZWZlY3RgIC0tIEEgbWVzc2FnZSBjbGFpbWVkIHRvIGJlIGEKLSAgOm1pbWV0eXBlOmBtdWx0aXBhcnRgLCBidXQgbm8gc3VicGFydHMgd2VyZSBmb3VuZC4gIE5vdGUgdGhhdCB3aGVuIGEgbWVzc2FnZSBoYXMKLSAgdGhpcyBkZWZlY3QsIGl0cyA6bWV0aDpgaXNfbXVsdGlwYXJ0YCBtZXRob2QgbWF5IHJldHVybiBmYWxzZSBldmVuIHRob3VnaCBpdHMKLSAgY29udGVudCB0eXBlIGNsYWltcyB0byBiZSA6bWltZXR5cGU6YG11bHRpcGFydGAuCisgIDptaW1ldHlwZTpgbXVsdGlwYXJ0YCwgYnV0IG5vIHN1YnBhcnRzIHdlcmUgZm91bmQuICBOb3RlIHRoYXQgd2hlbiBhIG1lc3NhZ2UKKyAgaGFzIHRoaXMgZGVmZWN0LCBpdHMgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2UuaXNfbXVsdGlwYXJ0YCBtZXRob2QgbWF5CisgIHJldHVybiBmYWxzZSBldmVuIHRob3VnaCBpdHMgY29udGVudCB0eXBlIGNsYWltcyB0byBiZSA6bWltZXR5cGU6YG11bHRpcGFydGAuCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2VtYWlsLmdlbmVyYXRvci5yc3QgYi9Eb2MvbGlicmFyeS9lbWFpbC5nZW5lcmF0b3IucnN0CmluZGV4IGYwMmU3ZDguLjRlYTdlNmEgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2VtYWlsLmdlbmVyYXRvci5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZW1haWwuZ2VuZXJhdG9yLnJzdApAQCAtMSw1ICsxLDUgQEAKLTptb2Q6YGVtYWlsYDogR2VuZXJhdGluZyBNSU1FIGRvY3VtZW50cwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis6bW9kOmBlbWFpbC5nZW5lcmF0b3JgOiBHZW5lcmF0aW5nIE1JTUUgZG9jdW1lbnRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC4uIG1vZHVsZTo6IGVtYWlsLmdlbmVyYXRvcgogICAgOnN5bm9wc2lzOiBHZW5lcmF0ZSBmbGF0IHRleHQgZW1haWwgbWVzc2FnZXMgZnJvbSBhIG1lc3NhZ2Ugc3RydWN0dXJlLgpAQCAtMTcsMTAgKzE3LDEwIEBACiBzdGFuZGFyZHMtY29tcGxpYW50IHdheSwgc2hvdWxkIGhhbmRsZSBNSU1FIGFuZCBub24tTUlNRSBlbWFpbCBtZXNzYWdlcyBqdXN0CiBmaW5lLCBhbmQgaXMgZGVzaWduZWQgc28gdGhhdCB0aGUgdHJhbnNmb3JtYXRpb24gZnJvbSBmbGF0IHRleHQsIHRvIGEgbWVzc2FnZQogc3RydWN0dXJlIHZpYSB0aGUgOmNsYXNzOmB+ZW1haWwucGFyc2VyLlBhcnNlcmAgY2xhc3MsIGFuZCBiYWNrIHRvIGZsYXQgdGV4dCwKLWlzIGlkZW1wb3RlbnQgKHRoZSBpbnB1dCBpcyBpZGVudGljYWwgdG8gdGhlIG91dHB1dCkuICBPbiB0aGUgb3RoZXIgaGFuZCwgdXNpbmcKLXRoZSBHZW5lcmF0b3Igb24gYSA6Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2VgIGNvbnN0cnVjdGVkIGJ5IHByb2dyYW0gbWF5Ci1yZXN1bHQgaW4gY2hhbmdlcyB0byB0aGUgOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlYCBvYmplY3QgYXMgZGVmYXVsdHMgYXJlCi1maWxsZWQgaW4uCitpcyBpZGVtcG90ZW50ICh0aGUgaW5wdXQgaXMgaWRlbnRpY2FsIHRvIHRoZSBvdXRwdXQpIFsjXV8uICBPbiB0aGUgb3RoZXIgaGFuZCwKK3VzaW5nIHRoZSBHZW5lcmF0b3Igb24gYSA6Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2VgIGNvbnN0cnVjdGVkIGJ5IHByb2dyYW0KK21heSByZXN1bHQgaW4gY2hhbmdlcyB0byB0aGUgOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlYCBvYmplY3QgYXMgZGVmYXVsdHMKK2FyZSBmaWxsZWQgaW4uCiAKIEhlcmUgYXJlIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGUgOmNsYXNzOmBHZW5lcmF0b3JgIGNsYXNzLCBpbXBvcnRlZCBmcm9tIHRoZQogOm1vZDpgZW1haWwuZ2VuZXJhdG9yYCBtb2R1bGU6CkBAIC0xMjUsMyArMTI1LDExIEBACiAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQogICAgVGhlIHByZXZpb3VzbHkgZGVwcmVjYXRlZCBtZXRob2QgOm1ldGg6YF9fY2FsbF9fYCB3YXMgcmVtb3ZlZC4KIAorCisuLiBydWJyaWM6OiBGb290bm90ZXMKKworLi4gWyNdIFRoaXMgc3RhdGVtZW50IGFzc3VtZXMgdGhhdCB5b3UgdXNlIHRoZSBhcHByb3ByaWF0ZSBzZXR0aW5nIGZvciB0aGUKKyAgICAgICBgYHVuaXhmcm9tYGAgYXJndW1lbnQsIGFuZCB0aGF0IHlvdSBzZXQgbWF4aGVhZGVybGVuPTAgKHdoaWNoIHdpbGwKKyAgICAgICBwcmVzZXJ2ZSB3aGF0ZXZlciB0aGUgaW5wdXQgbGluZSBsZW5ndGhzIHdlcmUpLiAgSXQgaXMgYWxzbyBub3Qgc3RyaWN0bHkKKyAgICAgICB0cnVlLCBzaW5jZSBpbiBtYW55IGNhc2VzIHJ1bnMgb2Ygd2hpdGVzcGFjZSBpbiBoZWFkZXJzIGFyZSBjb2xsYXBzZWQKKyAgICAgICBpbnRvIHNpbmdsZSBibGFua3MuICBUaGUgbGF0dGVyIGlzIGEgYnVnIHRoYXQgd2lsbCBldmVudHVhbGx5IGJlIGZpeGVkLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZW1haWwuaGVhZGVyLnJzdCBiL0RvYy9saWJyYXJ5L2VtYWlsLmhlYWRlci5yc3QKaW5kZXggZmUwOWRlNS4uNGU1ODVmYyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZW1haWwuaGVhZGVyLnJzdAorKysgYi9Eb2MvbGlicmFyeS9lbWFpbC5oZWFkZXIucnN0CkBAIC0xLDUgKzEsNSBAQAotOm1vZDpgZW1haWxgOiBJbnRlcm5hdGlvbmFsaXplZCBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzptb2Q6YGVtYWlsLmhlYWRlcmA6IEludGVybmF0aW9uYWxpemVkIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLi4gbW9kdWxlOjogZW1haWwuaGVhZGVyCiAgICA6c3lub3BzaXM6IFJlcHJlc2VudGluZyBub24tQVNDSUkgaGVhZGVycwpAQCAtMTAzLDcgKzEwMyw3IEBACiAgICAgICBub3QgcHJvdm9rZSBhIDpleGM6YFVuaWNvZGVFcnJvcmAgaXMgdXNlZC4KIAogICAgICAgT3B0aW9uYWwgKmVycm9ycyogaXMgcGFzc2VkIHRocm91Z2ggdG8gYW55IDpmdW5jOmB1bmljb2RlYCBvcgotICAgICAgOmZ1bmM6YHVzdHIuZW5jb2RlYCBjYWxsLCBhbmQgZGVmYXVsdHMgdG8gInN0cmljdCIuCisgICAgICA6bWV0aDpgdW5pY29kZS5lbmNvZGVgIGNhbGwsIGFuZCBkZWZhdWx0cyB0byAic3RyaWN0Ii4KIAogCiAgICAuLiBtZXRob2Q6OiBlbmNvZGUoW3NwbGl0Y2hhcnNdKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZW1haWwuaXRlcmF0b3JzLnJzdCBiL0RvYy9saWJyYXJ5L2VtYWlsLml0ZXJhdG9ycy5yc3QKaW5kZXggYWE3MDE0MS4uNjYyMWQ1MSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZW1haWwuaXRlcmF0b3JzLnJzdAorKysgYi9Eb2MvbGlicmFyeS9lbWFpbC5pdGVyYXRvcnMucnN0CkBAIC0xLDEzICsxLDE0IEBACi06bW9kOmBlbWFpbGA6IEl0ZXJhdG9ycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzptb2Q6YGVtYWlsLml0ZXJhdG9yc2A6IEl0ZXJhdG9ycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC4uIG1vZHVsZTo6IGVtYWlsLml0ZXJhdG9ycwogICAgOnN5bm9wc2lzOiBJdGVyYXRlIG92ZXIgYSAgbWVzc2FnZSBvYmplY3QgdHJlZS4KIAogCiBJdGVyYXRpbmcgb3ZlciBhIG1lc3NhZ2Ugb2JqZWN0IHRyZWUgaXMgZmFpcmx5IGVhc3kgd2l0aCB0aGUKLTptZXRoOmBNZXNzYWdlLndhbGtgIG1ldGhvZC4gIFRoZSA6bW9kOmBlbWFpbC5pdGVyYXRvcnNgIG1vZHVsZSBwcm92aWRlcyBzb21lCi11c2VmdWwgaGlnaGVyIGxldmVsIGl0ZXJhdGlvbnMgb3ZlciBtZXNzYWdlIG9iamVjdCB0cmVlcy4KKzptZXRoOmBNZXNzYWdlLndhbGsgPGVtYWlsLm1lc3NhZ2UuTWVzc2FnZS53YWxrPmAgbWV0aG9kLiAgVGhlCis6bW9kOmBlbWFpbC5pdGVyYXRvcnNgIG1vZHVsZSBwcm92aWRlcyBzb21lIHVzZWZ1bCBoaWdoZXIgbGV2ZWwgaXRlcmF0aW9ucyBvdmVyCittZXNzYWdlIG9iamVjdCB0cmVlcy4KIAogCiAuLiBmdW5jdGlvbjo6IGJvZHlfbGluZV9pdGVyYXRvcihtc2dbLCBkZWNvZGVdKQpAQCAtMTYsOSArMTcsMTEgQEAKICAgIHN0cmluZyBwYXlsb2FkcyBsaW5lLWJ5LWxpbmUuICBJdCBza2lwcyBvdmVyIGFsbCB0aGUgc3VicGFydCBoZWFkZXJzLCBhbmQgaXQKICAgIHNraXBzIG92ZXIgYW55IHN1YnBhcnQgd2l0aCBhIHBheWxvYWQgdGhhdCBpc24ndCBhIFB5dGhvbiBzdHJpbmcuICBUaGlzIGlzCiAgICBzb21ld2hhdCBlcXVpdmFsZW50IHRvIHJlYWRpbmcgdGhlIGZsYXQgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVzc2FnZSBmcm9tCi0gICBhIGZpbGUgdXNpbmcgOm1ldGg6YHJlYWRsaW5lYCwgc2tpcHBpbmcgb3ZlciBhbGwgdGhlIGludGVydmVuaW5nIGhlYWRlcnMuCisgICBhIGZpbGUgdXNpbmcgOm1ldGg6YH5pby5UZXh0SU9CYXNlLnJlYWRsaW5lYCwgc2tpcHBpbmcgb3ZlciBhbGwgdGhlCisgICBpbnRlcnZlbmluZyBoZWFkZXJzLgogCi0gICBPcHRpb25hbCAqZGVjb2RlKiBpcyBwYXNzZWQgdGhyb3VnaCB0byA6bWV0aDpgTWVzc2FnZS5nZXRfcGF5bG9hZGAuCisgICBPcHRpb25hbCAqZGVjb2RlKiBpcyBwYXNzZWQgdGhyb3VnaCB0byA6bWV0aDpgTWVzc2FnZS5nZXRfcGF5bG9hZAorICAgPGVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5nZXRfcGF5bG9hZD5gLgogCiAKIC4uIGZ1bmN0aW9uOjogdHlwZWRfc3VicGFydF9pdGVyYXRvcihtc2dbLCBtYWludHlwZVssIHN1YnR5cGVdXSkKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2VtYWlsLm1lc3NhZ2UucnN0IGIvRG9jL2xpYnJhcnkvZW1haWwubWVzc2FnZS5yc3QKaW5kZXggNzdjZTk5ZS4uODM4YmNmNSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZW1haWwubWVzc2FnZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZW1haWwubWVzc2FnZS5yc3QKQEAgLTEsNSArMSw1IEBACi06bW9kOmBlbWFpbGA6IFJlcHJlc2VudGluZyBhbiBlbWFpbCBtZXNzYWdlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis6bW9kOmBlbWFpbC5tZXNzYWdlYDogUmVwcmVzZW50aW5nIGFuIGVtYWlsIG1lc3NhZ2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAuLiBtb2R1bGU6OiBlbWFpbC5tZXNzYWdlCiAgICA6c3lub3BzaXM6IFRoZSBiYXNlIGNsYXNzIHJlcHJlc2VudGluZyBlbWFpbCBtZXNzYWdlcy4KQEAgLTQ4LDggKzQ4LDggQEAKICAgICAgIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBhIGNvbnZlbmllbmNlIGFuZCBtYXkgbm90IGFsd2F5cwogICAgICAgZm9ybWF0IHRoZSBtZXNzYWdlIHRoZSB3YXkgeW91IHdhbnQuICBGb3IgZXhhbXBsZSwgYnkgZGVmYXVsdCBpdCBtYW5nbGVzCiAgICAgICBsaW5lcyB0aGF0IGJlZ2luIHdpdGggYGBGcm9tYGAuICBGb3IgbW9yZSBmbGV4aWJpbGl0eSwgaW5zdGFudGlhdGUgYQotICAgICAgOmNsYXNzOmB+ZW1haWwuZ2VuZXJhdG9yLkdlbmVyYXRvcmAgaW5zdGFuY2UgYW5kIHVzZSBpdHMgOm1ldGg6YGZsYXR0ZW5gCi0gICAgICBtZXRob2QgZGlyZWN0bHkuICBGb3IgZXhhbXBsZTo6CisgICAgICA6Y2xhc3M6YH5lbWFpbC5nZW5lcmF0b3IuR2VuZXJhdG9yYCBpbnN0YW5jZSBhbmQgdXNlIGl0cworICAgICAgOm1ldGg6YH5lbWFpbC5nZW5lcmF0b3IuR2VuZXJhdG9yLmZsYXR0ZW5gIG1ldGhvZCBkaXJlY3RseS4gIEZvciBleGFtcGxlOjoKIAogICAgICAgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCiAgICAgICAgICBmcm9tIGVtYWlsLmdlbmVyYXRvciBpbXBvcnQgR2VuZXJhdG9yCkBAIC02OCw3ICs2OCw3IEBACiAKICAgICAgIFJldHVybiBgYFRydWVgYCBpZiB0aGUgbWVzc2FnZSdzIHBheWxvYWQgaXMgYSBsaXN0IG9mIHN1Yi1cCiAgICAgICA6Y2xhc3M6YE1lc3NhZ2VgIG9iamVjdHMsIG90aGVyd2lzZSByZXR1cm4gYGBGYWxzZWBgLiAgV2hlbgotICAgICAgOm1ldGg6YGlzX211bHRpcGFydGAgcmV0dXJucyBGYWxzZSwgdGhlIHBheWxvYWQgc2hvdWxkIGJlIGEgc3RyaW5nIG9iamVjdC4KKyAgICAgIDptZXRoOmBpc19tdWx0aXBhcnRgIHJldHVybnMgYGBGYWxzZWBgLCB0aGUgcGF5bG9hZCBzaG91bGQgYmUgYSBzdHJpbmcgb2JqZWN0LgogCiAKICAgIC4uIG1ldGhvZDo6IHNldF91bml4ZnJvbSh1bml4ZnJvbSkKQEAgLTQ5NCw4ICs0OTQsOCBAQAogCiAgICAgICBTZXQgdGhlIGBgYm91bmRhcnlgYCBwYXJhbWV0ZXIgb2YgdGhlIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgIGhlYWRlciB0bwogICAgICAgKmJvdW5kYXJ5Ki4gIDptZXRoOmBzZXRfYm91bmRhcnlgIHdpbGwgYWx3YXlzIHF1b3RlICpib3VuZGFyeSogaWYKLSAgICAgIG5lY2Vzc2FyeS4gIEEgOmV4YzpgSGVhZGVyUGFyc2VFcnJvcmAgaXMgcmFpc2VkIGlmIHRoZSBtZXNzYWdlIG9iamVjdCBoYXMKLSAgICAgIG5vIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgIGhlYWRlci4KKyAgICAgIG5lY2Vzc2FyeS4gIEEgOmV4YzpgfmVtYWlsLmVycm9ycy5IZWFkZXJQYXJzZUVycm9yYCBpcyByYWlzZWQgaWYgdGhlCisgICAgICBtZXNzYWdlIG9iamVjdCBoYXMgbm8gOm1haWxoZWFkZXI6YENvbnRlbnQtVHlwZWAgaGVhZGVyLgogCiAgICAgICBOb3RlIHRoYXQgdXNpbmcgdGhpcyBtZXRob2QgaXMgc3VidGx5IGRpZmZlcmVudCB0aGFuIGRlbGV0aW5nIHRoZSBvbGQKICAgICAgIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgIGhlYWRlciBhbmQgYWRkaW5nIGEgbmV3IG9uZSB3aXRoIHRoZSBuZXcKQEAgLTU4OSw3ICs1ODksOCBAQAogCiAgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQogICAgICAgICAgWW91IGRvIG5vdCBuZWVkIHRvIHNldCB0aGUgZXBpbG9ndWUgdG8gdGhlIGVtcHR5IHN0cmluZyBpbiBvcmRlciBmb3IgdGhlCi0gICAgICAgICA6Y2xhc3M6YEdlbmVyYXRvcmAgdG8gcHJpbnQgYSBuZXdsaW5lIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCisgICAgICAgICA6Y2xhc3M6YH5lbWFpbC5nZW5lcmF0b3IuR2VuZXJhdG9yYCB0byBwcmludCBhIG5ld2xpbmUgYXQgdGhlIGVuZCBvZiB0aGUKKyAgICAgICAgIGZpbGUuCiAKIAogICAgLi4gYXR0cmlidXRlOjogZGVmZWN0cwpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZW1haWwubWltZS5yc3QgYi9Eb2MvbGlicmFyeS9lbWFpbC5taW1lLnJzdAppbmRleCA3OGZkYzc2Li5kY2Y3YjU5IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9lbWFpbC5taW1lLnJzdAorKysgYi9Eb2MvbGlicmFyeS9lbWFpbC5taW1lLnJzdApAQCAtMSw1ICsxLDUgQEAKLTptb2Q6YGVtYWlsYDogQ3JlYXRpbmcgZW1haWwgYW5kIE1JTUUgb2JqZWN0cyBmcm9tIHNjcmF0Y2gKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzptb2Q6YGVtYWlsLm1pbWVgOiBDcmVhdGluZyBlbWFpbCBhbmQgTUlNRSBvYmplY3RzIGZyb20gc2NyYXRjaAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC4uIG1vZHVsZTo6IGVtYWlsLm1pbWUKICAgIDpzeW5vcHNpczogQnVpbGQgTUlNRSBtZXNzYWdlcy4KQEAgLTM1LDcgKzM1LDggQEAKICAgICpfbWFpbnR5cGUqIGlzIHRoZSA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYCBtYWpvciB0eXBlIChlLmcuIDptaW1ldHlwZTpgdGV4dGAKICAgIG9yIDptaW1ldHlwZTpgaW1hZ2VgKSwgYW5kICpfc3VidHlwZSogaXMgdGhlIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgIG1pbm9yCiAgICB0eXBlICAoZS5nLiA6bWltZXR5cGU6YHBsYWluYCBvciA6bWltZXR5cGU6YGdpZmApLiAgKl9wYXJhbXMqIGlzIGEgcGFyYW1ldGVyCi0gICBrZXkvdmFsdWUgZGljdGlvbmFyeSBhbmQgaXMgcGFzc2VkIGRpcmVjdGx5IHRvIDptZXRoOmBNZXNzYWdlLmFkZF9oZWFkZXJgLgorICAga2V5L3ZhbHVlIGRpY3Rpb25hcnkgYW5kIGlzIHBhc3NlZCBkaXJlY3RseSB0byA6bWV0aDpgTWVzc2FnZS5hZGRfaGVhZGVyCisgICA8ZW1haWwubWVzc2FnZS5NZXNzYWdlLmFkZF9oZWFkZXI+YC4KIAogICAgVGhlIDpjbGFzczpgTUlNRUJhc2VgIGNsYXNzIGFsd2F5cyBhZGRzIGEgOm1haWxoZWFkZXI6YENvbnRlbnQtVHlwZWAgaGVhZGVyCiAgICAoYmFzZWQgb24gKl9tYWludHlwZSosICpfc3VidHlwZSosIGFuZCAqX3BhcmFtcyopLCBhbmQgYQpAQCAtNTAsOCArNTEsOSBAQAogCiAgICBBIHN1YmNsYXNzIG9mIDpjbGFzczpgfmVtYWlsLm1pbWUuYmFzZS5NSU1FQmFzZWAsIHRoaXMgaXMgYW4gaW50ZXJtZWRpYXRlIGJhc2UKICAgIGNsYXNzIGZvciBNSU1FIG1lc3NhZ2VzIHRoYXQgYXJlIG5vdCA6bWltZXR5cGU6YG11bHRpcGFydGAuICBUaGUgcHJpbWFyeQotICAgcHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIHByZXZlbnQgdGhlIHVzZSBvZiB0aGUgOm1ldGg6YGF0dGFjaGAgbWV0aG9kLAotICAgd2hpY2ggb25seSBtYWtlcyBzZW5zZSBmb3IgOm1pbWV0eXBlOmBtdWx0aXBhcnRgIG1lc3NhZ2VzLiAgSWYgOm1ldGg6YGF0dGFjaGAKKyAgIHB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0byBwcmV2ZW50IHRoZSB1c2Ugb2YgdGhlCisgICA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5hdHRhY2hgIG1ldGhvZCwgd2hpY2ggb25seSBtYWtlcyBzZW5zZSBmb3IKKyAgIDptaW1ldHlwZTpgbXVsdGlwYXJ0YCBtZXNzYWdlcy4gIElmIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmF0dGFjaGAKICAgIGlzIGNhbGxlZCwgYSA6ZXhjOmB+ZW1haWwuZXJyb3JzLk11bHRpcGFydENvbnZlcnNpb25FcnJvcmAgZXhjZXB0aW9uIGlzIHJhaXNlZC4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4yLjIKQEAgLTc2LDcgKzc4LDggQEAKIAogICAgKl9zdWJwYXJ0cyogaXMgYSBzZXF1ZW5jZSBvZiBpbml0aWFsIHN1YnBhcnRzIGZvciB0aGUgcGF5bG9hZC4gIEl0IG11c3QgYmUKICAgIHBvc3NpYmxlIHRvIGNvbnZlcnQgdGhpcyBzZXF1ZW5jZSB0byBhIGxpc3QuICBZb3UgY2FuIGFsd2F5cyBhdHRhY2ggbmV3IHN1YnBhcnRzCi0gICB0byB0aGUgbWVzc2FnZSBieSB1c2luZyB0aGUgOm1ldGg6YE1lc3NhZ2UuYXR0YWNoYCBtZXRob2QuCisgICB0byB0aGUgbWVzc2FnZSBieSB1c2luZyB0aGUgOm1ldGg6YE1lc3NhZ2UuYXR0YWNoCisgICA8ZW1haWwubWVzc2FnZS5NZXNzYWdlLmF0dGFjaD5gIG1ldGhvZC4KIAogICAgQWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZvciB0aGUgOm1haWxoZWFkZXI6YENvbnRlbnQtVHlwZWAgaGVhZGVyIGFyZSB0YWtlbiBmcm9tCiAgICB0aGUga2V5d29yZCBhcmd1bWVudHMsIG9yIHBhc3NlZCBpbnRvIHRoZSAqX3BhcmFtcyogYXJndW1lbnQsIHdoaWNoIGlzIGEga2V5d29yZApAQCAtOTksOCArMTAyLDEwIEBACiAKICAgIE9wdGlvbmFsICpfZW5jb2RlciogaXMgYSBjYWxsYWJsZSAoaS5lLiBmdW5jdGlvbikgd2hpY2ggd2lsbCBwZXJmb3JtIHRoZSBhY3R1YWwKICAgIGVuY29kaW5nIG9mIHRoZSBkYXRhIGZvciB0cmFuc3BvcnQuICBUaGlzIGNhbGxhYmxlIHRha2VzIG9uZSBhcmd1bWVudCwgd2hpY2ggaXMKLSAgIHRoZSA6Y2xhc3M6YE1JTUVBcHBsaWNhdGlvbmAgaW5zdGFuY2UuIEl0IHNob3VsZCB1c2UgOm1ldGg6YGdldF9wYXlsb2FkYCBhbmQKLSAgIDptZXRoOmBzZXRfcGF5bG9hZGAgdG8gY2hhbmdlIHRoZSBwYXlsb2FkIHRvIGVuY29kZWQgZm9ybS4gIEl0IHNob3VsZCBhbHNvIGFkZAorICAgdGhlIDpjbGFzczpgTUlNRUFwcGxpY2F0aW9uYCBpbnN0YW5jZS4gSXQgc2hvdWxkIHVzZQorICAgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2UuZ2V0X3BheWxvYWRgIGFuZAorICAgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2Uuc2V0X3BheWxvYWRgIHRvIGNoYW5nZSB0aGUgcGF5bG9hZCB0byBlbmNvZGVkCisgICBmb3JtLiAgSXQgc2hvdWxkIGFsc28gYWRkCiAgICBhbnkgOm1haWxoZWFkZXI6YENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmdgIG9yIG90aGVyIGhlYWRlcnMgdG8gdGhlIG1lc3NhZ2UKICAgIG9iamVjdCBhcyBuZWNlc3NhcnkuICBUaGUgZGVmYXVsdCBlbmNvZGluZyBpcyBiYXNlNjQuICBTZWUgdGhlCiAgICA6bW9kOmBlbWFpbC5lbmNvZGVyc2AgbW9kdWxlIGZvciBhIGxpc3Qgb2YgdGhlIGJ1aWx0LWluIGVuY29kZXJzLgpAQCAtMTI3LDggKzEzMiwxMCBAQAogCiAgICBPcHRpb25hbCAqX2VuY29kZXIqIGlzIGEgY2FsbGFibGUgKGkuZS4gZnVuY3Rpb24pIHdoaWNoIHdpbGwgcGVyZm9ybSB0aGUgYWN0dWFsCiAgICBlbmNvZGluZyBvZiB0aGUgYXVkaW8gZGF0YSBmb3IgdHJhbnNwb3J0LiAgVGhpcyBjYWxsYWJsZSB0YWtlcyBvbmUgYXJndW1lbnQsCi0gICB3aGljaCBpcyB0aGUgOmNsYXNzOmBNSU1FQXVkaW9gIGluc3RhbmNlLiBJdCBzaG91bGQgdXNlIDptZXRoOmBnZXRfcGF5bG9hZGAgYW5kCi0gICA6bWV0aDpgc2V0X3BheWxvYWRgIHRvIGNoYW5nZSB0aGUgcGF5bG9hZCB0byBlbmNvZGVkIGZvcm0uICBJdCBzaG91bGQgYWxzbyBhZGQKKyAgIHdoaWNoIGlzIHRoZSA6Y2xhc3M6YE1JTUVBdWRpb2AgaW5zdGFuY2UuIEl0IHNob3VsZCB1c2UKKyAgIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmdldF9wYXlsb2FkYCBhbmQKKyAgIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLnNldF9wYXlsb2FkYCB0byBjaGFuZ2UgdGhlIHBheWxvYWQgdG8gZW5jb2RlZAorICAgZm9ybS4gIEl0IHNob3VsZCBhbHNvIGFkZAogICAgYW55IDptYWlsaGVhZGVyOmBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nYCBvciBvdGhlciBoZWFkZXJzIHRvIHRoZSBtZXNzYWdlCiAgICBvYmplY3QgYXMgbmVjZXNzYXJ5LiAgVGhlIGRlZmF1bHQgZW5jb2RpbmcgaXMgYmFzZTY0LiAgU2VlIHRoZQogICAgOm1vZDpgZW1haWwuZW5jb2RlcnNgIG1vZHVsZSBmb3IgYSBsaXN0IG9mIHRoZSBidWlsdC1pbiBlbmNvZGVycy4KQEAgLTE1Myw4ICsxNjAsMTAgQEAKIAogICAgT3B0aW9uYWwgKl9lbmNvZGVyKiBpcyBhIGNhbGxhYmxlIChpLmUuIGZ1bmN0aW9uKSB3aGljaCB3aWxsIHBlcmZvcm0gdGhlIGFjdHVhbAogICAgZW5jb2Rpbmcgb2YgdGhlIGltYWdlIGRhdGEgZm9yIHRyYW5zcG9ydC4gIFRoaXMgY2FsbGFibGUgdGFrZXMgb25lIGFyZ3VtZW50LAotICAgd2hpY2ggaXMgdGhlIDpjbGFzczpgTUlNRUltYWdlYCBpbnN0YW5jZS4gSXQgc2hvdWxkIHVzZSA6bWV0aDpgZ2V0X3BheWxvYWRgIGFuZAotICAgOm1ldGg6YHNldF9wYXlsb2FkYCB0byBjaGFuZ2UgdGhlIHBheWxvYWQgdG8gZW5jb2RlZCBmb3JtLiAgSXQgc2hvdWxkIGFsc28gYWRkCisgICB3aGljaCBpcyB0aGUgOmNsYXNzOmBNSU1FSW1hZ2VgIGluc3RhbmNlLiBJdCBzaG91bGQgdXNlCisgICA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5nZXRfcGF5bG9hZGAgYW5kCisgICA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5zZXRfcGF5bG9hZGAgdG8gY2hhbmdlIHRoZSBwYXlsb2FkIHRvIGVuY29kZWQKKyAgIGZvcm0uICBJdCBzaG91bGQgYWxzbyBhZGQKICAgIGFueSA6bWFpbGhlYWRlcjpgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZ2Agb3Igb3RoZXIgaGVhZGVycyB0byB0aGUgbWVzc2FnZQogICAgb2JqZWN0IGFzIG5lY2Vzc2FyeS4gIFRoZSBkZWZhdWx0IGVuY29kaW5nIGlzIGJhc2U2NC4gIFNlZSB0aGUKICAgIDptb2Q6YGVtYWlsLmVuY29kZXJzYCBtb2R1bGUgZm9yIGEgbGlzdCBvZiB0aGUgYnVpbHQtaW4gZW5jb2RlcnMuCkBAIC0xOTksMyArMjA4LDEyIEBACiAgICAgICBUcmFuc2ZlciBFbmNvZGluZyBub3cgaGFwcGVucyBpbXBsaWNpdGx5IGJhc2VkIG9uIHRoZSAqX2NoYXJzZXQqCiAgICAgICBhcmd1bWVudC4KIAorICAgVW5sZXNzIHRoZSBgYF9jaGFyc2V0YGAgcGFyYW1ldGVyIGlzIGV4cGxpY2l0bHkgc2V0IHRvIGBgTm9uZWBgLCB0aGUKKyAgIE1JTUVUZXh0IG9iamVjdCBjcmVhdGVkIHdpbGwgaGF2ZSBib3RoIGEgOm1haWxoZWFkZXI6YENvbnRlbnQtVHlwZWAgaGVhZGVyCisgICB3aXRoIGEgYGBjaGFyc2V0YGAgcGFyYW1ldGVyLCBhbmQgYSA6bWFpbGhlYWRlcjpgQ29udGVudC1UcmFuc2Zlci1FbmRjb2RpbmdgCisgICBoZWFkZXIuICBUaGlzIG1lYW5zIHRoYXQgYSBzdWJzZXF1ZW50IGBgc2V0X3BheWxvYWRgYCBjYWxsIHdpbGwgbm90IHJlc3VsdAorICAgaW4gYW4gZW5jb2RlZCBwYXlsb2FkLCBldmVuIGlmIGEgY2hhcnNldCBpcyBwYXNzZWQgaW4gdGhlIGBgc2V0X3BheWxvYWRgYAorICAgY29tbWFuZC4gIFlvdSBjYW4gInJlc2V0IiB0aGlzIGJlaGF2aW9yIGJ5IGRlbGV0aW5nIHRoZQorICAgYGBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nYGAgaGVhZGVyLCBhZnRlciB3aGljaCBhIGBgc2V0X3BheWxvYWRgYCBjYWxsCisgICB3aWxsIGF1dG9tYXRpY2FsbHkgZW5jb2RlIHRoZSBuZXcgcGF5bG9hZCAoYW5kIGFkZCBhIG5ldworICAgOm1haWxoZWFkZXI6YENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmdgIGhlYWRlcikuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9lbWFpbC5wYXJzZXIucnN0IGIvRG9jL2xpYnJhcnkvZW1haWwucGFyc2VyLnJzdAppbmRleCAyMzRjMGMwLi4wZjk5YTJmIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9lbWFpbC5wYXJzZXIucnN0CisrKyBiL0RvYy9saWJyYXJ5L2VtYWlsLnBhcnNlci5yc3QKQEAgLTEsNSArMSw1IEBACi06bW9kOmBlbWFpbGA6IFBhcnNpbmcgZW1haWwgbWVzc2FnZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOm1vZDpgZW1haWwucGFyc2VyYDogUGFyc2luZyBlbWFpbCBtZXNzYWdlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAuLiBtb2R1bGU6OiBlbWFpbC5wYXJzZXIKICAgIDpzeW5vcHNpczogUGFyc2UgZmxhdCB0ZXh0IGVtYWlsIG1lc3NhZ2VzIHRvIHByb2R1Y2UgYSBtZXNzYWdlIG9iamVjdCBzdHJ1Y3R1cmUuCkBAIC03LDcgKzcsOCBAQAogCiBNZXNzYWdlIG9iamVjdCBzdHJ1Y3R1cmVzIGNhbiBiZSBjcmVhdGVkIGluIG9uZSBvZiB0d28gd2F5czogdGhleSBjYW4gYmUgY3JlYXRlZAogZnJvbSB3aG9sZSBjbG90aCBieSBpbnN0YW50aWF0aW5nIDpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZWAgb2JqZWN0cyBhbmQKLXN0cmluZ2luZyB0aGVtIHRvZ2V0aGVyIHZpYSA6bWV0aDpgYXR0YWNoYCBhbmQgOm1ldGg6YHNldF9wYXlsb2FkYCBjYWxscywgb3IgdGhleQorc3RyaW5naW5nIHRoZW0gdG9nZXRoZXIgdmlhIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmF0dGFjaGAgYW5kCis6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5zZXRfcGF5bG9hZGAgY2FsbHMsIG9yIHRoZXkKIGNhbiBiZSBjcmVhdGVkIGJ5IHBhcnNpbmcgYSBmbGF0IHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVtYWlsIG1lc3NhZ2UuCiAKIFRoZSA6bW9kOmBlbWFpbGAgcGFja2FnZSBwcm92aWRlcyBhIHN0YW5kYXJkIHBhcnNlciB0aGF0IHVuZGVyc3RhbmRzIG1vc3QgZW1haWwKQEAgLTE2LDggKzE3LDkgQEAKIDpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZWAgaW5zdGFuY2Ugb2YgdGhlIG9iamVjdCBzdHJ1Y3R1cmUuICBGb3Igc2ltcGxlLAogbm9uLU1JTUUgbWVzc2FnZXMgdGhlIHBheWxvYWQgb2YgdGhpcyByb290IG9iamVjdCB3aWxsIGxpa2VseSBiZSBhIHN0cmluZwogY29udGFpbmluZyB0aGUgdGV4dCBvZiB0aGUgbWVzc2FnZS4gIEZvciBNSU1FIG1lc3NhZ2VzLCB0aGUgcm9vdCBvYmplY3Qgd2lsbAotcmV0dXJuIGBgVHJ1ZWBgIGZyb20gaXRzIDptZXRoOmBpc19tdWx0aXBhcnRgIG1ldGhvZCwgYW5kIHRoZSBzdWJwYXJ0cyBjYW4gYmUKLWFjY2Vzc2VkIHZpYSB0aGUgOm1ldGg6YGdldF9wYXlsb2FkYCBhbmQgOm1ldGg6YHdhbGtgIG1ldGhvZHMuCityZXR1cm4gYGBUcnVlYGAgZnJvbSBpdHMgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2UuaXNfbXVsdGlwYXJ0YCBtZXRob2QsIGFuZAordGhlIHN1YnBhcnRzIGNhbiBiZSBhY2Nlc3NlZCB2aWEgdGhlIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmdldF9wYXlsb2FkYAorYW5kIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLndhbGtgIG1ldGhvZHMuCiAKIFRoZXJlIGFyZSBhY3R1YWxseSB0d28gcGFyc2VyIGludGVyZmFjZXMgYXZhaWxhYmxlIGZvciB1c2UsIHRoZSBjbGFzc2ljCiA6Y2xhc3M6YFBhcnNlcmAgQVBJIGFuZCB0aGUgaW5jcmVtZW50YWwgOmNsYXNzOmBGZWVkUGFyc2VyYCBBUEkuICBUaGUgY2xhc3NpYwpAQCAtMTI3LDcgKzEyOSw4IEBACiAKICAgICAgIFJlYWQgYWxsIHRoZSBkYXRhIGZyb20gdGhlIGZpbGUtbGlrZSBvYmplY3QgKmZwKiwgcGFyc2UgdGhlIHJlc3VsdGluZwogICAgICAgdGV4dCwgYW5kIHJldHVybiB0aGUgcm9vdCBtZXNzYWdlIG9iamVjdC4gICpmcCogbXVzdCBzdXBwb3J0IGJvdGggdGhlCi0gICAgICA6bWV0aDpgcmVhZGxpbmVgIGFuZCB0aGUgOm1ldGg6YHJlYWRgIG1ldGhvZHMgb24gZmlsZS1saWtlIG9iamVjdHMuCisgICAgICA6bWV0aDpgfmlvLlRleHRJT0Jhc2UucmVhZGxpbmVgIGFuZCB0aGUgOm1ldGg6YH5pby5UZXh0SU9CYXNlLnJlYWRgCisgICAgICBtZXRob2RzIG9uIGZpbGUtbGlrZSBvYmplY3RzLgogCiAgICAgICBUaGUgdGV4dCBjb250YWluZWQgaW4gKmZwKiBtdXN0IGJlIGZvcm1hdHRlZCBhcyBhIGJsb2NrIG9mIDpyZmM6YDI4MjJgCiAgICAgICBzdHlsZSBoZWFkZXJzIGFuZCBoZWFkZXIgY29udGludWF0aW9uIGxpbmVzLCBvcHRpb25hbGx5IHByZWNlZGVkIGJ5IGEKQEAgLTEzNSw3ICsxMzgsOSBAQAogICAgICAgZGF0YSBvciBieSBhIGJsYW5rIGxpbmUuICBGb2xsb3dpbmcgdGhlIGhlYWRlciBibG9jayBpcyB0aGUgYm9keSBvZiB0aGUKICAgICAgIG1lc3NhZ2UgKHdoaWNoIG1heSBjb250YWluIE1JTUUtZW5jb2RlZCBzdWJwYXJ0cykuCiAKLSAgICAgIE9wdGlvbmFsICpoZWFkZXJzb25seSogaXMgYXMgd2l0aCB0aGUgOm1ldGg6YHBhcnNlYCBtZXRob2QuCisgICAgICBPcHRpb25hbCAqaGVhZGVyc29ubHkqIGlzIGEgZmxhZyBzcGVjaWZ5aW5nIHdoZXRoZXIgdG8gc3RvcCBwYXJzaW5nIGFmdGVyCisgICAgICByZWFkaW5nIHRoZSBoZWFkZXJzIG9yIG5vdC4gIFRoZSBkZWZhdWx0IGlzIGBgRmFsc2VgYCwgbWVhbmluZyBpdCBwYXJzZXMKKyAgICAgIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGZpbGUuCiAKICAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi4yLjIKICAgICAgICAgIFRoZSAqaGVhZGVyc29ubHkqIGZsYWcgd2FzIGFkZGVkLgpAQCAtMTQ1LDEyICsxNTAsMTAgQEAKIAogICAgICAgU2ltaWxhciB0byB0aGUgOm1ldGg6YHBhcnNlYCBtZXRob2QsIGV4Y2VwdCBpdCB0YWtlcyBhIHN0cmluZyBvYmplY3QKICAgICAgIGluc3RlYWQgb2YgYSBmaWxlLWxpa2Ugb2JqZWN0LiAgQ2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhIHN0cmluZyBpcyBleGFjdGx5Ci0gICAgICBlcXVpdmFsZW50IHRvIHdyYXBwaW5nICp0ZXh0KiBpbiBhIDpjbGFzczpgU3RyaW5nSU9gIGluc3RhbmNlIGZpcnN0IGFuZAorICAgICAgZXF1aXZhbGVudCB0byB3cmFwcGluZyAqdGV4dCogaW4gYSA6Y2xhc3M6YH5TdHJpbmdJTy5TdHJpbmdJT2AgaW5zdGFuY2UgZmlyc3QgYW5kCiAgICAgICBjYWxsaW5nIDptZXRoOmBwYXJzZWAuCiAKLSAgICAgIE9wdGlvbmFsICpoZWFkZXJzb25seSogaXMgYSBmbGFnIHNwZWNpZnlpbmcgd2hldGhlciB0byBzdG9wIHBhcnNpbmcgYWZ0ZXIKLSAgICAgIHJlYWRpbmcgdGhlIGhlYWRlcnMgb3Igbm90LiAgVGhlIGRlZmF1bHQgaXMgYGBGYWxzZWBgLCBtZWFuaW5nIGl0IHBhcnNlcwotICAgICAgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgZmlsZS4KKyAgICAgIE9wdGlvbmFsICpoZWFkZXJzb25seSogaXMgYXMgd2l0aCB0aGUgOm1ldGg6YHBhcnNlYCBtZXRob2QuCiAKICAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi4yLjIKICAgICAgICAgIFRoZSAqaGVhZGVyc29ubHkqIGZsYWcgd2FzIGFkZGVkLgpAQCAtMTY1LDcgKzE2OCw3IEBACiAKICAgIFJldHVybiBhIG1lc3NhZ2Ugb2JqZWN0IHN0cnVjdHVyZSBmcm9tIGEgc3RyaW5nLiAgVGhpcyBpcyBleGFjdGx5IGVxdWl2YWxlbnQgdG8KICAgIGBgUGFyc2VyKCkucGFyc2VzdHIocylgYC4gIE9wdGlvbmFsICpfY2xhc3MqIGFuZCAqc3RyaWN0KiBhcmUgaW50ZXJwcmV0ZWQgYXMKLSAgIHdpdGggdGhlIDpjbGFzczpgUGFyc2VyYCBjbGFzcyBjb25zdHJ1Y3Rvci4KKyAgIHdpdGggdGhlIDpjbGFzczpgfmVtYWlsLnBhcnNlci5QYXJzZXJgIGNsYXNzIGNvbnN0cnVjdG9yLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuMi4yCiAgICAgICBUaGUgKnN0cmljdCogZmxhZyB3YXMgYWRkZWQuCkBAIC0xNzUsNyArMTc4LDcgQEAKIAogICAgUmV0dXJuIGEgbWVzc2FnZSBvYmplY3Qgc3RydWN0dXJlIHRyZWUgZnJvbSBhbiBvcGVuIGZpbGUgb2JqZWN0LiAgVGhpcyBpcwogICAgZXhhY3RseSBlcXVpdmFsZW50IHRvIGBgUGFyc2VyKCkucGFyc2UoZnApYGAuICBPcHRpb25hbCAqX2NsYXNzKiBhbmQgKnN0cmljdCoKLSAgIGFyZSBpbnRlcnByZXRlZCBhcyB3aXRoIHRoZSA6Y2xhc3M6YFBhcnNlcmAgY2xhc3MgY29uc3RydWN0b3IuCisgICBhcmUgaW50ZXJwcmV0ZWQgYXMgd2l0aCB0aGUgOmNsYXNzOmB+ZW1haWwucGFyc2VyLlBhcnNlcmAgY2xhc3MgY29uc3RydWN0b3IuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi4yLjIKICAgICAgIFRoZSAqc3RyaWN0KiBmbGFnIHdhcyBhZGRlZC4KQEAgLTE5MywzMiArMTk2LDM1IEBACiAKICogTW9zdCBub24tXCA6bWltZXR5cGU6YG11bHRpcGFydGAgdHlwZSBtZXNzYWdlcyBhcmUgcGFyc2VkIGFzIGEgc2luZ2xlIG1lc3NhZ2UKICAgb2JqZWN0IHdpdGggYSBzdHJpbmcgcGF5bG9hZC4gIFRoZXNlIG9iamVjdHMgd2lsbCByZXR1cm4gYGBGYWxzZWBgIGZvcgotICA6bWV0aDpgaXNfbXVsdGlwYXJ0YC4gIFRoZWlyIDptZXRoOmBnZXRfcGF5bG9hZGAgbWV0aG9kIHdpbGwgcmV0dXJuIGEgc3RyaW5nCi0gIG9iamVjdC4KKyAgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2UuaXNfbXVsdGlwYXJ0YC4gIFRoZWlyCisgIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmdldF9wYXlsb2FkYCBtZXRob2Qgd2lsbCByZXR1cm4gYSBzdHJpbmcgb2JqZWN0LgogCiAqIEFsbCA6bWltZXR5cGU6YG11bHRpcGFydGAgdHlwZSBtZXNzYWdlcyB3aWxsIGJlIHBhcnNlZCBhcyBhIGNvbnRhaW5lciBtZXNzYWdlCiAgIG9iamVjdCB3aXRoIGEgbGlzdCBvZiBzdWItbWVzc2FnZSBvYmplY3RzIGZvciB0aGVpciBwYXlsb2FkLiAgVGhlIG91dGVyCi0gIGNvbnRhaW5lciBtZXNzYWdlIHdpbGwgcmV0dXJuIGBgVHJ1ZWBgIGZvciA6bWV0aDpgaXNfbXVsdGlwYXJ0YCBhbmQgdGhlaXIKLSAgOm1ldGg6YGdldF9wYXlsb2FkYCBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGxpc3Qgb2YgOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlYAotICBzdWJwYXJ0cy4KKyAgY29udGFpbmVyIG1lc3NhZ2Ugd2lsbCByZXR1cm4gYGBUcnVlYGAgZm9yCisgIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmlzX211bHRpcGFydGAgYW5kIHRoZWlyCisgIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmdldF9wYXlsb2FkYCBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGxpc3Qgb2YKKyAgOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlYCBzdWJwYXJ0cy4KIAogKiBNb3N0IG1lc3NhZ2VzIHdpdGggYSBjb250ZW50IHR5cGUgb2YgOm1pbWV0eXBlOmBtZXNzYWdlL1wqYCAoZS5nLgogICA6bWltZXR5cGU6YG1lc3NhZ2UvZGVsaXZlcnktc3RhdHVzYCBhbmQgOm1pbWV0eXBlOmBtZXNzYWdlL3JmYzgyMmApIHdpbGwgYWxzbyBiZQogICBwYXJzZWQgYXMgY29udGFpbmVyIG9iamVjdCBjb250YWluaW5nIGEgbGlzdCBwYXlsb2FkIG9mIGxlbmd0aCAxLiAgVGhlaXIKLSAgOm1ldGg6YGlzX211bHRpcGFydGAgbWV0aG9kIHdpbGwgcmV0dXJuIGBgVHJ1ZWBgLiAgVGhlIHNpbmdsZSBlbGVtZW50IGluIHRoZQotICBsaXN0IHBheWxvYWQgd2lsbCBiZSBhIHN1Yi1tZXNzYWdlIG9iamVjdC4KKyAgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2UuaXNfbXVsdGlwYXJ0YCBtZXRob2Qgd2lsbCByZXR1cm4gYGBUcnVlYGAuCisgIFRoZSBzaW5nbGUgZWxlbWVudCBpbiB0aGUgbGlzdCBwYXlsb2FkIHdpbGwgYmUgYSBzdWItbWVzc2FnZSBvYmplY3QuCiAKICogU29tZSBub24tc3RhbmRhcmRzIGNvbXBsaWFudCBtZXNzYWdlcyBtYXkgbm90IGJlIGludGVybmFsbHkgY29uc2lzdGVudCBhYm91dAogICB0aGVpciA6bWltZXR5cGU6YG11bHRpcGFydGBcIC1lZG5lc3MuICBTdWNoIG1lc3NhZ2VzIG1heSBoYXZlIGEKICAgOm1haWxoZWFkZXI6YENvbnRlbnQtVHlwZWAgaGVhZGVyIG9mIHR5cGUgOm1pbWV0eXBlOmBtdWx0aXBhcnRgLCBidXQgdGhlaXIKLSAgOm1ldGg6YGlzX211bHRpcGFydGAgbWV0aG9kIG1heSByZXR1cm4gYGBGYWxzZWBgLiAgSWYgc3VjaCBtZXNzYWdlcyB3ZXJlIHBhcnNlZAotICB3aXRoIHRoZSA6Y2xhc3M6YEZlZWRQYXJzZXJgLCB0aGV5IHdpbGwgaGF2ZSBhbiBpbnN0YW5jZSBvZiB0aGUKLSAgOmNsYXNzOmBNdWx0aXBhcnRJbnZhcmlhbnRWaW9sYXRpb25EZWZlY3RgIGNsYXNzIGluIHRoZWlyICpkZWZlY3RzKiBhdHRyaWJ1dGUKLSAgbGlzdC4gIFNlZSA6bW9kOmBlbWFpbC5lcnJvcnNgIGZvciBkZXRhaWxzLgorICA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5pc19tdWx0aXBhcnRgIG1ldGhvZCBtYXkgcmV0dXJuIGBgRmFsc2VgYC4KKyAgSWYgc3VjaCBtZXNzYWdlcyB3ZXJlIHBhcnNlZCB3aXRoIHRoZSA6Y2xhc3M6YH5lbWFpbC5wYXJzZXIuRmVlZFBhcnNlcmAsCisgIHRoZXkgd2lsbCBoYXZlIGFuIGluc3RhbmNlIG9mIHRoZQorICA6Y2xhc3M6YH5lbWFpbC5lcnJvcnMuTXVsdGlwYXJ0SW52YXJpYW50VmlvbGF0aW9uRGVmZWN0YCBjbGFzcyBpbiB0aGVpcgorICAqZGVmZWN0cyogYXR0cmlidXRlIGxpc3QuICBTZWUgOm1vZDpgZW1haWwuZXJyb3JzYCBmb3IgZGV0YWlscy4KIAogLi4gcnVicmljOjogRm9vdG5vdGVzCiAKIC4uIFsjXSBBcyBvZiBlbWFpbCBwYWNrYWdlIHZlcnNpb24gMy4wLCBpbnRyb2R1Y2VkIGluIFB5dGhvbiAyLjQsIHRoZSBjbGFzc2ljCi0gICA6Y2xhc3M6YFBhcnNlcmAgd2FzIHJlLWltcGxlbWVudGVkIGluIHRlcm1zIG9mIHRoZSA6Y2xhc3M6YEZlZWRQYXJzZXJgLCBzbyB0aGUKLSAgIHNlbWFudGljcyBhbmQgcmVzdWx0cyBhcmUgaWRlbnRpY2FsIGJldHdlZW4gdGhlIHR3byBwYXJzZXJzLgorICAgOmNsYXNzOmB+ZW1haWwucGFyc2VyLlBhcnNlcmAgd2FzIHJlLWltcGxlbWVudGVkIGluIHRlcm1zIG9mIHRoZQorICAgOmNsYXNzOmB+ZW1haWwucGFyc2VyLkZlZWRQYXJzZXJgLCBzbyB0aGUgc2VtYW50aWNzIGFuZCByZXN1bHRzIGFyZQorICAgaWRlbnRpY2FsIGJldHdlZW4gdGhlIHR3byBwYXJzZXJzLgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9lbWFpbC5yc3QgYi9Eb2MvbGlicmFyeS9lbWFpbC5yc3QKaW5kZXggYWFmZjE1My4uNGU5MGNlNCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZW1haWwucnN0CisrKyBiL0RvYy9saWJyYXJ5L2VtYWlsLnJzdApAQCAtMTEyLDE0ICsxMTIsMTUgQEAKICAgKk5vdGUgdGhhdCB0aGUgdmVyc2lvbiAzIG5hbWVzIHdpbGwgY29udGludWUgdG8gd29yayB1bnRpbCBQeXRob24gMi42Ki4KIAogKiBUaGUgOm1vZDpgZW1haWwubWltZS5hcHBsaWNhdGlvbmAgbW9kdWxlIHdhcyBhZGRlZCwgd2hpY2ggY29udGFpbnMgdGhlCi0gIDpjbGFzczpgTUlNRUFwcGxpY2F0aW9uYCBjbGFzcy4KKyAgOmNsYXNzOmB+ZW1haWwubWltZS5hcHBsaWNhdGlvbi5NSU1FQXBwbGljYXRpb25gIGNsYXNzLgogCiAqIE1ldGhvZHMgdGhhdCB3ZXJlIGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAzIGhhdmUgYmVlbiByZW1vdmVkLiAgVGhlc2UgaW5jbHVkZQogICA6bWV0aDpgR2VuZXJhdG9yLl9fY2FsbF9fYCwgOm1ldGg6YE1lc3NhZ2UuZ2V0X3R5cGVgLAogICA6bWV0aDpgTWVzc2FnZS5nZXRfbWFpbl90eXBlYCwgOm1ldGg6YE1lc3NhZ2UuZ2V0X3N1YnR5cGVgLgogCiAqIEZpeGVzIGhhdmUgYmVlbiBhZGRlZCBmb3IgOnJmYzpgMjIzMWAgc3VwcG9ydCB3aGljaCBjYW4gY2hhbmdlIHNvbWUgb2YgdGhlCi0gIHJldHVybiB0eXBlcyBmb3IgOmZ1bmM6YE1lc3NhZ2UuZ2V0X3BhcmFtYCBhbmQgZnJpZW5kcy4gIFVuZGVyIHNvbWUKKyAgcmV0dXJuIHR5cGVzIGZvciA6ZnVuYzpgTWVzc2FnZS5nZXRfcGFyYW0gPGVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5nZXRfcGFyYW0+YAorICBhbmQgZnJpZW5kcy4gIFVuZGVyIHNvbWUKICAgY2lyY3Vtc3RhbmNlcywgdmFsdWVzIHdoaWNoIHVzZWQgdG8gcmV0dXJuIGEgMy10dXBsZSBub3cgcmV0dXJuIHNpbXBsZSBzdHJpbmdzCiAgIChzcGVjaWZpY2FsbHksIGlmIGFsbCBleHRlbmRlZCBwYXJhbWV0ZXIgc2VnbWVudHMgd2VyZSB1bmVuY29kZWQsIHRoZXJlIGlzIG5vCiAgIGxhbmd1YWdlIGFuZCBjaGFyc2V0IGRlc2lnbmF0aW9uIGV4cGVjdGVkLCBzbyB0aGUgcmV0dXJuIHR5cGUgaXMgbm93IGEgc2ltcGxlCkBAIC0xMjgsMjMgKzEyOSwyNCBAQAogCiBIZXJlIGFyZSB0aGUgbWFqb3IgZGlmZmVyZW5jZXMgYmV0d2VlbiA6bW9kOmBlbWFpbGAgdmVyc2lvbiAzIGFuZCB2ZXJzaW9uIDI6CiAKLSogVGhlIDpjbGFzczpgRmVlZFBhcnNlcmAgY2xhc3Mgd2FzIGludHJvZHVjZWQsIGFuZCB0aGUgOmNsYXNzOmBQYXJzZXJgIGNsYXNzCi0gIHdhcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB0aGUgOmNsYXNzOmBGZWVkUGFyc2VyYC4gIEFsbCBwYXJzaW5nIHRoZXJlZm9yZSBpcworKiBUaGUgOmNsYXNzOmB+ZW1haWwucGFyc2VyLkZlZWRQYXJzZXJgIGNsYXNzIHdhcyBpbnRyb2R1Y2VkLCBhbmQgdGhlCisgIDpjbGFzczpgfmVtYWlsLnBhcnNlci5QYXJzZXJgIGNsYXNzIHdhcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB0aGUKKyAgOmNsYXNzOmB+ZW1haWwucGFyc2VyLkZlZWRQYXJzZXJgLiAgQWxsIHBhcnNpbmcgdGhlcmVmb3JlIGlzCiAgIG5vbi1zdHJpY3QsIGFuZCBwYXJzaW5nIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IG5ldmVyIHRvIHJhaXNlIGFuIGV4Y2VwdGlvbi4KICAgUHJvYmxlbXMgZm91bmQgd2hpbGUgcGFyc2luZyBtZXNzYWdlcyBhcmUgc3RvcmVkIGluIHRoZSBtZXNzYWdlJ3MgKmRlZmVjdCoKICAgYXR0cmlidXRlLgogCiAqIEFsbCBhc3BlY3RzIG9mIHRoZSBBUEkgd2hpY2ggcmFpc2VkIDpleGM6YERlcHJlY2F0aW9uV2FybmluZ2BcIHMgaW4gdmVyc2lvbiAyCiAgIGhhdmUgYmVlbiByZW1vdmVkLiAgVGhlc2UgaW5jbHVkZSB0aGUgKl9lbmNvZGVyKiBhcmd1bWVudCB0byB0aGUKLSAgOmNsYXNzOmBNSU1FVGV4dGAgY29uc3RydWN0b3IsIHRoZSA6bWV0aDpgTWVzc2FnZS5hZGRfcGF5bG9hZGAgbWV0aG9kLCB0aGUKLSAgOmZ1bmM6YFV0aWxzLmR1bXBfYWRkcmVzc19wYWlyYCBmdW5jdGlvbiwgYW5kIHRoZSBmdW5jdGlvbnMgOmZ1bmM6YFV0aWxzLmRlY29kZWAKLSAgYW5kIDpmdW5jOmBVdGlscy5lbmNvZGVgLgorICA6Y2xhc3M6YH5lbWFpbC5taW1lLnRleHQuTUlNRVRleHRgIGNvbnN0cnVjdG9yLCB0aGUKKyAgOm1ldGg6YE1lc3NhZ2UuYWRkX3BheWxvYWRgIG1ldGhvZCwgdGhlIDpmdW5jOmBVdGlscy5kdW1wX2FkZHJlc3NfcGFpcmAKKyAgZnVuY3Rpb24sIGFuZCB0aGUgZnVuY3Rpb25zIDpmdW5jOmBVdGlscy5kZWNvZGVgIGFuZCA6ZnVuYzpgVXRpbHMuZW5jb2RlYC4KIAogKiBOZXcgOmV4YzpgRGVwcmVjYXRpb25XYXJuaW5nYFwgcyBoYXZlIGJlZW4gYWRkZWQgdG86CiAgIDptZXRoOmBHZW5lcmF0b3IuX19jYWxsX19gLCA6bWV0aDpgTWVzc2FnZS5nZXRfdHlwZWAsCiAgIDptZXRoOmBNZXNzYWdlLmdldF9tYWluX3R5cGVgLCA6bWV0aDpgTWVzc2FnZS5nZXRfc3VidHlwZWAsIGFuZCB0aGUgKnN0cmljdCoKLSAgYXJndW1lbnQgdG8gdGhlIDpjbGFzczpgUGFyc2VyYCBjbGFzcy4gIFRoZXNlIGFyZSBleHBlY3RlZCB0byBiZSByZW1vdmVkIGluCi0gIGZ1dHVyZSB2ZXJzaW9ucy4KKyAgYXJndW1lbnQgdG8gdGhlIDpjbGFzczpgfmVtYWlsLnBhcnNlci5QYXJzZXJgIGNsYXNzLiAgVGhlc2UgYXJlIGV4cGVjdGVkIHRvCisgIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLgogCiAqIFN1cHBvcnQgZm9yIFB5dGhvbnMgZWFybGllciB0aGFuIDIuMyBoYXMgYmVlbiByZW1vdmVkLgogCkBAIC0xNTIsNTMgKzE1NCw2MSBAQAogCiAqIFRoZSA6bW9kOmBlbWFpbC5IZWFkZXJgIGFuZCA6bW9kOmBlbWFpbC5DaGFyc2V0YCBtb2R1bGVzIGhhdmUgYmVlbiBhZGRlZC4KIAotKiBUaGUgcGlja2xlIGZvcm1hdCBmb3IgOmNsYXNzOmBNZXNzYWdlYCBpbnN0YW5jZXMgaGFzIGNoYW5nZWQuIFNpbmNlIHRoaXMgd2FzCi0gIG5ldmVyIChhbmQgc3RpbGwgaXNuJ3QpIGZvcm1hbGx5IGRlZmluZWQsIHRoaXMgaXNuJ3QgY29uc2lkZXJlZCBhIGJhY2t3YXJkCi0gIGluY29tcGF0aWJpbGl0eS4gIEhvd2V2ZXIgaWYgeW91ciBhcHBsaWNhdGlvbiBwaWNrbGVzIGFuZCB1bnBpY2tsZXMKLSAgOmNsYXNzOmBNZXNzYWdlYCBpbnN0YW5jZXMsIGJlIGF3YXJlIHRoYXQgaW4gOm1vZDpgZW1haWxgIHZlcnNpb24gMiwKLSAgOmNsYXNzOmBNZXNzYWdlYCBpbnN0YW5jZXMgbm93IGhhdmUgcHJpdmF0ZSB2YXJpYWJsZXMgKl9jaGFyc2V0KiBhbmQKLSAgKl9kZWZhdWx0X3R5cGUqLgorKiBUaGUgcGlja2xlIGZvcm1hdCBmb3IgOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlYCBpbnN0YW5jZXMgaGFzIGNoYW5nZWQuCisgIFNpbmNlIHRoaXMgd2FzIG5ldmVyIChhbmQgc3RpbGwgaXNuJ3QpIGZvcm1hbGx5IGRlZmluZWQsIHRoaXMgaXNuJ3QKKyAgY29uc2lkZXJlZCBhIGJhY2t3YXJkIGluY29tcGF0aWJpbGl0eS4gIEhvd2V2ZXIgaWYgeW91ciBhcHBsaWNhdGlvbiBwaWNrbGVzCisgIGFuZCB1bnBpY2tsZXMgOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlYCBpbnN0YW5jZXMsIGJlIGF3YXJlIHRoYXQgaW4KKyAgOm1vZDpgZW1haWxgIHZlcnNpb24gMiwgOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlYCBpbnN0YW5jZXMgbm93IGhhdmUKKyAgcHJpdmF0ZSB2YXJpYWJsZXMgKl9jaGFyc2V0KiBhbmQgKl9kZWZhdWx0X3R5cGUqLgogCi0qIFNldmVyYWwgbWV0aG9kcyBpbiB0aGUgOmNsYXNzOmBNZXNzYWdlYCBjbGFzcyBoYXZlIGJlZW4gZGVwcmVjYXRlZCwgb3IgdGhlaXIKLSAgc2lnbmF0dXJlcyBjaGFuZ2VkLiAgQWxzbywgbWFueSBuZXcgbWV0aG9kcyBoYXZlIGJlZW4gYWRkZWQuICBTZWUgdGhlCi0gIGRvY3VtZW50YXRpb24gZm9yIHRoZSA6Y2xhc3M6YE1lc3NhZ2VgIGNsYXNzIGZvciBkZXRhaWxzLiAgVGhlIGNoYW5nZXMgc2hvdWxkIGJlCi0gIGNvbXBsZXRlbHkgYmFja3dhcmQgY29tcGF0aWJsZS4KKyogU2V2ZXJhbCBtZXRob2RzIGluIHRoZSA6Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2VgIGNsYXNzIGhhdmUgYmVlbgorICBkZXByZWNhdGVkLCBvciB0aGVpciBzaWduYXR1cmVzIGNoYW5nZWQuICBBbHNvLCBtYW55IG5ldyBtZXRob2RzIGhhdmUgYmVlbgorICBhZGRlZC4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIDpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZWAgY2xhc3MKKyAgZm9yIGRldGFpbHMuICBUaGUgY2hhbmdlcyBzaG91bGQgYmUgY29tcGxldGVseSBiYWNrd2FyZCBjb21wYXRpYmxlLgogCiAqIFRoZSBvYmplY3Qgc3RydWN0dXJlIGhhcyBjaGFuZ2VkIGluIHRoZSBmYWNlIG9mIDptaW1ldHlwZTpgbWVzc2FnZS9yZmM4MjJgCi0gIGNvbnRlbnQgdHlwZXMuICBJbiA6bW9kOmBlbWFpbGAgdmVyc2lvbiAxLCBzdWNoIGEgdHlwZSB3b3VsZCBiZSByZXByZXNlbnRlZCBieSBhCi0gIHNjYWxhciBwYXlsb2FkLCBpLmUuIHRoZSBjb250YWluZXIgbWVzc2FnZSdzIDptZXRoOmBpc19tdWx0aXBhcnRgIHJldHVybmVkCi0gIGZhbHNlLCA6bWV0aDpgZ2V0X3BheWxvYWRgIHdhcyBub3QgYSBsaXN0IG9iamVjdCwgYnV0IGEgc2luZ2xlIDpjbGFzczpgTWVzc2FnZWAKLSAgaW5zdGFuY2UuCisgIGNvbnRlbnQgdHlwZXMuICBJbiA6bW9kOmBlbWFpbGAgdmVyc2lvbiAxLCBzdWNoIGEgdHlwZSB3b3VsZCBiZSByZXByZXNlbnRlZAorICBieSBhIHNjYWxhciBwYXlsb2FkLCBpLmUuIHRoZSBjb250YWluZXIgbWVzc2FnZSdzCisgIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmlzX211bHRpcGFydGAgcmV0dXJuZWQgZmFsc2UsCisgIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmdldF9wYXlsb2FkYCB3YXMgbm90IGEgbGlzdCBvYmplY3QsIGJ1dCBhCisgIHNpbmdsZSA6Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2VgIGluc3RhbmNlLgogCiAgIFRoaXMgc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgcmVzdCBvZiB0aGUgcGFja2FnZSwgc28gdGhlIG9iamVjdAogICByZXByZXNlbnRhdGlvbiBmb3IgOm1pbWV0eXBlOmBtZXNzYWdlL3JmYzgyMmAgY29udGVudCB0eXBlcyB3YXMgY2hhbmdlZC4gIEluCiAgIDptb2Q6YGVtYWlsYCB2ZXJzaW9uIDIsIHRoZSBjb250YWluZXIgKmRvZXMqIHJldHVybiBgYFRydWVgYCBmcm9tCi0gIDptZXRoOmBpc19tdWx0aXBhcnRgLCBhbmQgOm1ldGg6YGdldF9wYXlsb2FkYCByZXR1cm5zIGEgbGlzdCBjb250YWluaW5nIGEgc2luZ2xlCi0gIDpjbGFzczpgTWVzc2FnZWAgaXRlbS4KKyAgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2UuaXNfbXVsdGlwYXJ0YCwgYW5kCisgIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmdldF9wYXlsb2FkYCByZXR1cm5zIGEgbGlzdCBjb250YWluaW5nIGEgc2luZ2xlCisgIDpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZWAgaXRlbS4KIAotICBOb3RlIHRoYXQgdGhpcyBpcyBvbmUgcGxhY2UgdGhhdCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGNvdWxkIG5vdCBiZSBjb21wbGV0ZWx5Ci0gIG1haW50YWluZWQuICBIb3dldmVyLCBpZiB5b3UncmUgYWxyZWFkeSB0ZXN0aW5nIHRoZSByZXR1cm4gdHlwZSBvZgotICA6bWV0aDpgZ2V0X3BheWxvYWRgLCB5b3Ugc2hvdWxkIGJlIGZpbmUuICBZb3UganVzdCBuZWVkIHRvIG1ha2Ugc3VyZSB5b3VyIGNvZGUKLSAgZG9lc24ndCBkbyBhIDptZXRoOmBzZXRfcGF5bG9hZGAgd2l0aCBhIDpjbGFzczpgTWVzc2FnZWAgaW5zdGFuY2Ugb24gYSBjb250YWluZXIKLSAgd2l0aCBhIGNvbnRlbnQgdHlwZSBvZiA6bWltZXR5cGU6YG1lc3NhZ2UvcmZjODIyYC4KKyAgTm90ZSB0aGF0IHRoaXMgaXMgb25lIHBsYWNlIHRoYXQgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBjb3VsZCBub3QgYmUKKyAgY29tcGxldGVseSBtYWludGFpbmVkLiAgSG93ZXZlciwgaWYgeW91J3JlIGFscmVhZHkgdGVzdGluZyB0aGUgcmV0dXJuIHR5cGUgb2YKKyAgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2UuZ2V0X3BheWxvYWRgLCB5b3Ugc2hvdWxkIGJlIGZpbmUuICBZb3UganVzdCBuZWVkCisgIHRvIG1ha2Ugc3VyZSB5b3VyIGNvZGUgZG9lc24ndCBkbyBhIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLnNldF9wYXlsb2FkYAorICB3aXRoIGEgOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlYCBpbnN0YW5jZSBvbiBhIGNvbnRhaW5lciB3aXRoIGEgY29udGVudAorICB0eXBlIG9mIDptaW1ldHlwZTpgbWVzc2FnZS9yZmM4MjJgLgogCi0qIFRoZSA6Y2xhc3M6YFBhcnNlcmAgY29uc3RydWN0b3IncyAqc3RyaWN0KiBhcmd1bWVudCB3YXMgYWRkZWQsIGFuZCBpdHMKLSAgOm1ldGg6YHBhcnNlYCBhbmQgOm1ldGg6YHBhcnNlc3RyYCBtZXRob2RzIGdyZXcgYSAqaGVhZGVyc29ubHkqIGFyZ3VtZW50LiAgVGhlCi0gICpzdHJpY3QqIGZsYWcgd2FzIGFsc28gYWRkZWQgdG8gZnVuY3Rpb25zIDpmdW5jOmBlbWFpbC5tZXNzYWdlX2Zyb21fZmlsZWAgYW5kCi0gIDpmdW5jOmBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nYC4KKyogVGhlIDpjbGFzczpgfmVtYWlsLnBhcnNlci5QYXJzZXJgIGNvbnN0cnVjdG9yJ3MgKnN0cmljdCogYXJndW1lbnQgd2FzIGFkZGVkLAorICBhbmQgaXRzIDptZXRoOmB+ZW1haWwucGFyc2VyLlBhcnNlci5wYXJzZWAgYW5kCisgIDptZXRoOmB+ZW1haWwucGFyc2VyLlBhcnNlci5wYXJzZXN0cmAgbWV0aG9kcyBncmV3IGEgKmhlYWRlcnNvbmx5KiBhcmd1bWVudC4KKyAgVGhlICpzdHJpY3QqIGZsYWcgd2FzIGFsc28gYWRkZWQgdG8gZnVuY3Rpb25zIDpmdW5jOmBlbWFpbC5tZXNzYWdlX2Zyb21fZmlsZWAKKyAgYW5kIDpmdW5jOmBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nYC4KIAotKiA6bWV0aDpgR2VuZXJhdG9yLl9fY2FsbF9fYCBpcyBkZXByZWNhdGVkOyB1c2UgOm1ldGg6YEdlbmVyYXRvci5mbGF0dGVuYAotICBpbnN0ZWFkLiAgVGhlIDpjbGFzczpgR2VuZXJhdG9yYCBjbGFzcyBoYXMgYWxzbyBncm93biB0aGUgOm1ldGg6YGNsb25lYCBtZXRob2QuCisqIDptZXRoOmBHZW5lcmF0b3IuX19jYWxsX19gIGlzIGRlcHJlY2F0ZWQ7IHVzZSA6bWV0aDpgR2VuZXJhdG9yLmZsYXR0ZW4KKyAgPGVtYWlsLmdlbmVyYXRvci5HZW5lcmF0b3IuZmxhdHRlbj5gIGluc3RlYWQuICBUaGUKKyAgOmNsYXNzOmB+ZW1haWwuZ2VuZXJhdG9yLkdlbmVyYXRvcmAgY2xhc3MgaGFzIGFsc28gZ3Jvd24gdGhlCisgIDptZXRoOmB+ZW1haWwuZ2VuZXJhdG9yLkdlbmVyYXRvci5jbG9uZWAgbWV0aG9kLgogCi0qIFRoZSA6Y2xhc3M6YERlY29kZWRHZW5lcmF0b3JgIGNsYXNzIGluIHRoZSA6bW9kOmBlbWFpbC5HZW5lcmF0b3JgIG1vZHVsZSB3YXMKLSAgYWRkZWQuCisqIFRoZSA6Y2xhc3M6YH5lbWFpbC5nZW5lcmF0b3IuRGVjb2RlZEdlbmVyYXRvcmAgY2xhc3MgaW4gdGhlCisgIDptb2Q6YGVtYWlsLmdlbmVyYXRvcmAgbW9kdWxlIHdhcyBhZGRlZC4KIAotKiBUaGUgaW50ZXJtZWRpYXRlIGJhc2UgY2xhc3NlcyA6Y2xhc3M6YE1JTUVOb25NdWx0aXBhcnRgIGFuZAotICA6Y2xhc3M6YE1JTUVNdWx0aXBhcnRgIGhhdmUgYmVlbiBhZGRlZCwgYW5kIGludGVycG9zZWQgaW4gdGhlIGNsYXNzIGhpZXJhcmNoeQotICBmb3IgbW9zdCBvZiB0aGUgb3RoZXIgTUlNRS1yZWxhdGVkIGRlcml2ZWQgY2xhc3Nlcy4KKyogVGhlIGludGVybWVkaWF0ZSBiYXNlIGNsYXNzZXMKKyAgOmNsYXNzOmB+ZW1haWwubWltZS5ub25tdWx0aXBhcnQuTUlNRU5vbk11bHRpcGFydGAgYW5kCisgIDpjbGFzczpgfmVtYWlsLm1pbWUubXVsdGlwYXJ0Lk1JTUVNdWx0aXBhcnRgIGhhdmUgYmVlbiBhZGRlZCwgYW5kIGludGVycG9zZWQKKyAgaW4gdGhlIGNsYXNzIGhpZXJhcmNoeSBmb3IgbW9zdCBvZiB0aGUgb3RoZXIgTUlNRS1yZWxhdGVkIGRlcml2ZWQgY2xhc3Nlcy4KIAotKiBUaGUgKl9lbmNvZGVyKiBhcmd1bWVudCB0byB0aGUgOmNsYXNzOmBNSU1FVGV4dGAgY29uc3RydWN0b3IgaGFzIGJlZW4KLSAgZGVwcmVjYXRlZC4gIEVuY29kaW5nICBub3cgaGFwcGVucyBpbXBsaWNpdGx5IGJhc2VkIG9uIHRoZSAqX2NoYXJzZXQqIGFyZ3VtZW50LgorKiBUaGUgKl9lbmNvZGVyKiBhcmd1bWVudCB0byB0aGUgOmNsYXNzOmB+ZW1haWwubWltZS50ZXh0Lk1JTUVUZXh0YCBjb25zdHJ1Y3RvcgorICBoYXMgYmVlbiBkZXByZWNhdGVkLiAgRW5jb2RpbmcgIG5vdyBoYXBwZW5zIGltcGxpY2l0bHkgYmFzZWQgb24gdGhlCisgICpfY2hhcnNldCogYXJndW1lbnQuCiAKICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgaW4gdGhlIDptb2Q6YGVtYWlsLlV0aWxzYCBtb2R1bGUgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQ6CiAgIDpmdW5jOmBkdW1wX2FkZHJlc3NfcGFpcnNgLCA6ZnVuYzpgZGVjb2RlYCwgYW5kIDpmdW5jOmBlbmNvZGVgLiAgVGhlIGZvbGxvd2luZwpAQCAtMjMxLDE3ICsyNDEsMjIgQEAKIAogKiA6ZnVuYzpgbWVzc2FnZUZyb21GaWxlYCBoYXMgYmVlbiByZW5hbWVkIHRvIDpmdW5jOmBtZXNzYWdlX2Zyb21fZmlsZWAuCiAKLVRoZSA6Y2xhc3M6YE1lc3NhZ2VgIGNsYXNzIGhhcyB0aGUgZm9sbG93aW5nIGRpZmZlcmVuY2VzOgorVGhlIDpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZWAgY2xhc3MgaGFzIHRoZSBmb2xsb3dpbmcgZGlmZmVyZW5jZXM6CiAKLSogVGhlIG1ldGhvZCA6bWV0aDpgYXNTdHJpbmdgIHdhcyByZW5hbWVkIHRvIDptZXRoOmBhc19zdHJpbmdgLgorKiBUaGUgbWV0aG9kIDptZXRoOmBhc1N0cmluZ2Agd2FzIHJlbmFtZWQgdG8KKyAgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2UuYXNfc3RyaW5nYC4KIAotKiBUaGUgbWV0aG9kIDptZXRoOmBpc211bHRpcGFydGAgd2FzIHJlbmFtZWQgdG8gOm1ldGg6YGlzX211bHRpcGFydGAuCisqIFRoZSBtZXRob2QgOm1ldGg6YGlzbXVsdGlwYXJ0YCB3YXMgcmVuYW1lZCB0bworICA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5pc19tdWx0aXBhcnRgLgogCi0qIFRoZSA6bWV0aDpgZ2V0X3BheWxvYWRgIG1ldGhvZCBoYXMgZ3Jvd24gYSAqZGVjb2RlKiBvcHRpb25hbCBhcmd1bWVudC4KKyogVGhlIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmdldF9wYXlsb2FkYCBtZXRob2QgaGFzIGdyb3duIGEgKmRlY29kZSoKKyAgb3B0aW9uYWwgYXJndW1lbnQuCiAKLSogVGhlIG1ldGhvZCA6bWV0aDpgZ2V0YWxsYCB3YXMgcmVuYW1lZCB0byA6bWV0aDpgZ2V0X2FsbGAuCisqIFRoZSBtZXRob2QgOm1ldGg6YGdldGFsbGAgd2FzIHJlbmFtZWQgdG8KKyAgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2UuZ2V0X2FsbGAuCiAKLSogVGhlIG1ldGhvZCA6bWV0aDpgYWRkaGVhZGVyYCB3YXMgcmVuYW1lZCB0byA6bWV0aDpgYWRkX2hlYWRlcmAuCisqIFRoZSBtZXRob2QgOm1ldGg6YGFkZGhlYWRlcmAgd2FzIHJlbmFtZWQgdG8KKyAgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2UuYWRkX2hlYWRlcmAuCiAKICogVGhlIG1ldGhvZCA6bWV0aDpgZ2V0dHlwZWAgd2FzIHJlbmFtZWQgdG8gOm1ldGg6YGdldF90eXBlYC4KIApAQCAtMjQ5LDQ4ICsyNjQsNTcgQEAKIAogKiBUaGUgbWV0aG9kIDptZXRoOmBnZXRzdWJ0eXBlYCB3YXMgcmVuYW1lZCB0byA6bWV0aDpgZ2V0X3N1YnR5cGVgLgogCi0qIFRoZSBtZXRob2QgOm1ldGg6YGdldHBhcmFtc2Agd2FzIHJlbmFtZWQgdG8gOm1ldGg6YGdldF9wYXJhbXNgLiBBbHNvLCB3aGVyZWFzCi0gIDptZXRoOmBnZXRwYXJhbXNgIHJldHVybmVkIGEgbGlzdCBvZiBzdHJpbmdzLCA6bWV0aDpgZ2V0X3BhcmFtc2AgcmV0dXJucyBhIGxpc3QKLSAgb2YgMi10dXBsZXMsIGVmZmVjdGl2ZWx5IHRoZSBrZXkvdmFsdWUgcGFpcnMgb2YgdGhlIHBhcmFtZXRlcnMsIHNwbGl0IG9uIHRoZQotICBgYCc9J2BgIHNpZ24uCisqIFRoZSBtZXRob2QgOm1ldGg6YGdldHBhcmFtc2Agd2FzIHJlbmFtZWQgdG8KKyAgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2UuZ2V0X3BhcmFtc2AuIEFsc28sIHdoZXJlYXMgOm1ldGg6YGdldHBhcmFtc2AKKyAgcmV0dXJuZWQgYSBsaXN0IG9mIHN0cmluZ3MsIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmdldF9wYXJhbXNgIHJldHVybnMKKyAgYSBsaXN0IG9mIDItdHVwbGVzLCBlZmZlY3RpdmVseSB0aGUga2V5L3ZhbHVlIHBhaXJzIG9mIHRoZSBwYXJhbWV0ZXJzLCBzcGxpdAorICBvbiB0aGUgYGAnPSdgYCBzaWduLgogCi0qIFRoZSBtZXRob2QgOm1ldGg6YGdldHBhcmFtYCB3YXMgcmVuYW1lZCB0byA6bWV0aDpgZ2V0X3BhcmFtYC4KKyogVGhlIG1ldGhvZCA6bWV0aDpgZ2V0cGFyYW1gIHdhcyByZW5hbWVkIHRvCisgIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmdldF9wYXJhbWAuCiAKLSogVGhlIG1ldGhvZCA6bWV0aDpgZ2V0Y2hhcnNldHNgIHdhcyByZW5hbWVkIHRvIDptZXRoOmBnZXRfY2hhcnNldHNgLgorKiBUaGUgbWV0aG9kIDptZXRoOmBnZXRjaGFyc2V0c2Agd2FzIHJlbmFtZWQgdG8KKyAgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2UuZ2V0X2NoYXJzZXRzYC4KIAotKiBUaGUgbWV0aG9kIDptZXRoOmBnZXRmaWxlbmFtZWAgd2FzIHJlbmFtZWQgdG8gOm1ldGg6YGdldF9maWxlbmFtZWAuCisqIFRoZSBtZXRob2QgOm1ldGg6YGdldGZpbGVuYW1lYCB3YXMgcmVuYW1lZCB0bworICA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5nZXRfZmlsZW5hbWVgLgogCi0qIFRoZSBtZXRob2QgOm1ldGg6YGdldGJvdW5kYXJ5YCB3YXMgcmVuYW1lZCB0byA6bWV0aDpgZ2V0X2JvdW5kYXJ5YC4KKyogVGhlIG1ldGhvZCA6bWV0aDpgZ2V0Ym91bmRhcnlgIHdhcyByZW5hbWVkIHRvCisgIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmdldF9ib3VuZGFyeWAuCiAKLSogVGhlIG1ldGhvZCA6bWV0aDpgc2V0Ym91bmRhcnlgIHdhcyByZW5hbWVkIHRvIDptZXRoOmBzZXRfYm91bmRhcnlgLgorKiBUaGUgbWV0aG9kIDptZXRoOmBzZXRib3VuZGFyeWAgd2FzIHJlbmFtZWQgdG8KKyAgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2Uuc2V0X2JvdW5kYXJ5YC4KIAogKiBUaGUgbWV0aG9kIDptZXRoOmBnZXRkZWNvZGVkcGF5bG9hZGAgd2FzIHJlbW92ZWQuICBUbyBnZXQgc2ltaWxhcgotICBmdW5jdGlvbmFsaXR5LCBwYXNzIHRoZSB2YWx1ZSAxIHRvIHRoZSAqZGVjb2RlKiBmbGFnIG9mIHRoZSBnZXRfcGF5bG9hZCgpCi0gIG1ldGhvZC4KKyAgZnVuY3Rpb25hbGl0eSwgcGFzcyB0aGUgdmFsdWUgMSB0byB0aGUgKmRlY29kZSogZmxhZyBvZiB0aGUKKyAgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2UuZ2V0X3BheWxvYWRgIG1ldGhvZC4KIAogKiBUaGUgbWV0aG9kIDptZXRoOmBnZXRwYXlsb2FkYXN0ZXh0YCB3YXMgcmVtb3ZlZC4gIFNpbWlsYXIgZnVuY3Rpb25hbGl0eSBpcwotICBzdXBwb3J0ZWQgYnkgdGhlIDpjbGFzczpgRGVjb2RlZEdlbmVyYXRvcmAgY2xhc3MgaW4gdGhlIDptb2Q6YGVtYWlsLmdlbmVyYXRvcmAKLSAgbW9kdWxlLgorICBzdXBwb3J0ZWQgYnkgdGhlIDpjbGFzczpgfmVtYWlsLmdlbmVyYXRvci5EZWNvZGVkR2VuZXJhdG9yYCBjbGFzcyBpbiB0aGUKKyAgOm1vZDpgZW1haWwuZ2VuZXJhdG9yYCBtb2R1bGUuCiAKICogVGhlIG1ldGhvZCA6bWV0aDpgZ2V0Ym9keWFzdGV4dGAgd2FzIHJlbW92ZWQuICBZb3UgY2FuIGdldCBzaW1pbGFyCi0gIGZ1bmN0aW9uYWxpdHkgYnkgY3JlYXRpbmcgYW4gaXRlcmF0b3Igd2l0aCA6ZnVuYzpgdHlwZWRfc3VicGFydF9pdGVyYXRvcmAgaW4gdGhlCi0gIDptb2Q6YGVtYWlsLml0ZXJhdG9yc2AgbW9kdWxlLgorICBmdW5jdGlvbmFsaXR5IGJ5IGNyZWF0aW5nIGFuIGl0ZXJhdG9yIHdpdGgKKyAgOmZ1bmM6YH5lbWFpbC5pdGVyYXRvcnMudHlwZWRfc3VicGFydF9pdGVyYXRvcmAgaW4gdGhlIDptb2Q6YGVtYWlsLml0ZXJhdG9yc2AKKyAgbW9kdWxlLgogCi1UaGUgOmNsYXNzOmBQYXJzZXJgIGNsYXNzIGhhcyBubyBkaWZmZXJlbmNlcyBpbiBpdHMgcHVibGljIGludGVyZmFjZS4gSXQgZG9lcwotaGF2ZSBzb21lIGFkZGl0aW9uYWwgc21hcnRzIHRvIHJlY29nbml6ZSA6bWltZXR5cGU6YG1lc3NhZ2UvZGVsaXZlcnktc3RhdHVzYAotdHlwZSBtZXNzYWdlcywgd2hpY2ggaXQgcmVwcmVzZW50cyBhcyBhIDpjbGFzczpgTWVzc2FnZWAgaW5zdGFuY2UgY29udGFpbmluZwotc2VwYXJhdGUgOmNsYXNzOmBNZXNzYWdlYCBzdWJwYXJ0cyBmb3IgZWFjaCBoZWFkZXIgYmxvY2sgaW4gdGhlIGRlbGl2ZXJ5IHN0YXR1cwotbm90aWZpY2F0aW9uIFsjXV8uCitUaGUgOmNsYXNzOmB+ZW1haWwucGFyc2VyLlBhcnNlcmAgY2xhc3MgaGFzIG5vIGRpZmZlcmVuY2VzIGluIGl0cyBwdWJsaWMKK2ludGVyZmFjZS4gSXQgZG9lcyBoYXZlIHNvbWUgYWRkaXRpb25hbCBzbWFydHMgdG8gcmVjb2duaXplCis6bWltZXR5cGU6YG1lc3NhZ2UvZGVsaXZlcnktc3RhdHVzYCB0eXBlIG1lc3NhZ2VzLCB3aGljaCBpdCByZXByZXNlbnRzIGFzIGEKKzpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZWAgaW5zdGFuY2UgY29udGFpbmluZyBzZXBhcmF0ZQorOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlYCBzdWJwYXJ0cyBmb3IgZWFjaCBoZWFkZXIgYmxvY2sgaW4gdGhlIGRlbGl2ZXJ5CitzdGF0dXMgbm90aWZpY2F0aW9uIFsjXV8uCiAKLVRoZSA6Y2xhc3M6YEdlbmVyYXRvcmAgY2xhc3MgaGFzIG5vIGRpZmZlcmVuY2VzIGluIGl0cyBwdWJsaWMgaW50ZXJmYWNlLiAgVGhlcmUKLWlzIGEgbmV3IGNsYXNzIGluIHRoZSA6bW9kOmBlbWFpbC5nZW5lcmF0b3JgIG1vZHVsZSB0aG91Z2gsIGNhbGxlZAotOmNsYXNzOmBEZWNvZGVkR2VuZXJhdG9yYCB3aGljaCBwcm92aWRlcyBtb3N0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IHByZXZpb3VzbHkKLWF2YWlsYWJsZSBpbiB0aGUgOm1ldGg6YE1lc3NhZ2UuZ2V0cGF5bG9hZGFzdGV4dGAgbWV0aG9kLgorVGhlIDpjbGFzczpgfmVtYWlsLmdlbmVyYXRvci5HZW5lcmF0b3JgIGNsYXNzIGhhcyBubyBkaWZmZXJlbmNlcyBpbiBpdHMgcHVibGljCitpbnRlcmZhY2UuICBUaGVyZSBpcyBhIG5ldyBjbGFzcyBpbiB0aGUgOm1vZDpgZW1haWwuZ2VuZXJhdG9yYCBtb2R1bGUgdGhvdWdoLAorY2FsbGVkIDpjbGFzczpgfmVtYWlsLmdlbmVyYXRvci5EZWNvZGVkR2VuZXJhdG9yYCB3aGljaCBwcm92aWRlcyBtb3N0IG9mIHRoZQorZnVuY3Rpb25hbGl0eSBwcmV2aW91c2x5IGF2YWlsYWJsZSBpbiB0aGUgOm1ldGg6YE1lc3NhZ2UuZ2V0cGF5bG9hZGFzdGV4dGAKK21ldGhvZC4KIAogVGhlIGZvbGxvd2luZyBtb2R1bGVzIGFuZCBjbGFzc2VzIGhhdmUgYmVlbiBjaGFuZ2VkOgogCi0qIFRoZSA6Y2xhc3M6YE1JTUVCYXNlYCBjbGFzcyBjb25zdHJ1Y3RvciBhcmd1bWVudHMgKl9tYWpvciogYW5kICpfbWlub3IqIGhhdmUKLSAgY2hhbmdlZCB0byAqX21haW50eXBlKiBhbmQgKl9zdWJ0eXBlKiByZXNwZWN0aXZlbHkuCisqIFRoZSA6Y2xhc3M6YH5lbWFpbC5taW1lLmJhc2UuTUlNRUJhc2VgIGNsYXNzIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyAqX21ham9yKgorICBhbmQgKl9taW5vciogaGF2ZSBjaGFuZ2VkIHRvICpfbWFpbnR5cGUqIGFuZCAqX3N1YnR5cGUqIHJlc3BlY3RpdmVseS4KIAogKiBUaGUgYGBJbWFnZWBgIGNsYXNzL21vZHVsZSBoYXMgYmVlbiByZW5hbWVkIHRvIGBgTUlNRUltYWdlYGAuICBUaGUgKl9taW5vcioKICAgYXJndW1lbnQgaGFzIGJlZW4gcmVuYW1lZCB0byAqX3N1YnR5cGUqLgpAQCAtMzAzLDcgKzMyNyw4IEBACiAgIGJ1dCB0aGF0IGNsYXNoZWQgd2l0aCB0aGUgUHl0aG9uIHN0YW5kYXJkIGxpYnJhcnkgbW9kdWxlIDptb2Q6YHJmYzgyMmAgb24gc29tZQogICBjYXNlLWluc2Vuc2l0aXZlIGZpbGUgc3lzdGVtcy4KIAotICBBbHNvLCB0aGUgOmNsYXNzOmBNSU1FTWVzc2FnZWAgY2xhc3Mgbm93IHJlcHJlc2VudHMgYW55IGtpbmQgb2YgTUlNRSBtZXNzYWdlCisgIEFsc28sIHRoZSA6Y2xhc3M6YH5lbWFpbC5taW1lLm1lc3NhZ2UuTUlNRU1lc3NhZ2VgIGNsYXNzIG5vdyByZXByZXNlbnRzIGFueQorICBraW5kIG9mIE1JTUUgbWVzc2FnZQogICB3aXRoIG1haW4gdHlwZSA6bWltZXR5cGU6YG1lc3NhZ2VgLiAgSXQgdGFrZXMgYW4gb3B0aW9uYWwgYXJndW1lbnQgKl9zdWJ0eXBlKgogICB3aGljaCBpcyB1c2VkIHRvIHNldCB0aGUgTUlNRSBzdWJ0eXBlLiAgKl9zdWJ0eXBlKiBkZWZhdWx0cyB0bwogICA6bWltZXR5cGU6YHJmYzgyMmAuCkBAIC0zMTMsOCArMzM4LDggQEAKIDptb2Q6YGVtYWlsLnV0aWxzYCBtb2R1bGUuCiAKIFRoZSBgYE1zZ1JlYWRlcmBgIGNsYXNzL21vZHVsZSBoYXMgYmVlbiByZW1vdmVkLiAgSXRzIGZ1bmN0aW9uYWxpdHkgaXMgbW9zdAotY2xvc2VseSBzdXBwb3J0ZWQgaW4gdGhlIDpmdW5jOmBib2R5X2xpbmVfaXRlcmF0b3JgIGZ1bmN0aW9uIGluIHRoZQotOm1vZDpgZW1haWwuaXRlcmF0b3JzYCBtb2R1bGUuCitjbG9zZWx5IHN1cHBvcnRlZCBpbiB0aGUgOmZ1bmM6YH5lbWFpbC5pdGVyYXRvcnMuYm9keV9saW5lX2l0ZXJhdG9yYCBmdW5jdGlvbgoraW4gdGhlIDptb2Q6YGVtYWlsLml0ZXJhdG9yc2AgbW9kdWxlLgogCiAuLiBydWJyaWM6OiBGb290bm90ZXMKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZW1haWwudXRpbC5yc3QgYi9Eb2MvbGlicmFyeS9lbWFpbC51dGlsLnJzdAppbmRleCAxNTNiYTc4Li45YjU4M2MwIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9lbWFpbC51dGlsLnJzdAorKysgYi9Eb2MvbGlicmFyeS9lbWFpbC51dGlsLnJzdApAQCAtMSw1ICsxLDUgQEAKLTptb2Q6YGVtYWlsYDogTWlzY2VsbGFuZW91cyB1dGlsaXRpZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzptb2Q6YGVtYWlsLnV0aWxzYDogTWlzY2VsbGFuZW91cyB1dGlsaXRpZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLi4gbW9kdWxlOjogZW1haWwudXRpbHMKICAgIDpzeW5vcHNpczogTWlzY2VsbGFuZW91cyBlbWFpbCBwYWNrYWdlIHV0aWxpdGllcy4KQEAgLTQxLDggKzQxLDggQEAKIAogICAgVGhpcyBtZXRob2QgcmV0dXJucyBhIGxpc3Qgb2YgMi10dXBsZXMgb2YgdGhlIGZvcm0gcmV0dXJuZWQgYnkgYGBwYXJzZWFkZHIoKWBgLgogICAgKmZpZWxkdmFsdWVzKiBpcyBhIHNlcXVlbmNlIG9mIGhlYWRlciBmaWVsZCB2YWx1ZXMgYXMgbWlnaHQgYmUgcmV0dXJuZWQgYnkKLSAgIDptZXRoOmBNZXNzYWdlLmdldF9hbGxgLiAgSGVyZSdzIGEgc2ltcGxlIGV4YW1wbGUgdGhhdCBnZXRzIGFsbCB0aGUgcmVjaXBpZW50cwotICAgb2YgYSBtZXNzYWdlOjoKKyAgIDptZXRoOmBNZXNzYWdlLmdldF9hbGwgPGVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5nZXRfYWxsPmAuICBIZXJlJ3MgYSBzaW1wbGUKKyAgIGV4YW1wbGUgdGhhdCBnZXRzIGFsbCB0aGUgcmVjaXBpZW50cyBvZiBhIG1lc3NhZ2U6OgogCiAgICAgICBmcm9tIGVtYWlsLnV0aWxzIGltcG9ydCBnZXRhZGRyZXNzZXMKIApAQCAtNzYsMTIgKzc2LDkgQEAKIAogLi4gZnVuY3Rpb246OiBta3RpbWVfdHoodHVwbGUpCiAKLSAgIFR1cm4gYSAxMC10dXBsZSBhcyByZXR1cm5lZCBieSA6ZnVuYzpgcGFyc2VkYXRlX3R6YCBpbnRvIGEgVVRDIHRpbWVzdGFtcC4gIEl0Ci0gICB0aGUgdGltZXpvbmUgaXRlbSBpbiB0aGUgdHVwbGUgaXMgYGBOb25lYGAsIGFzc3VtZSBsb2NhbCB0aW1lLiAgTWlub3IKLSAgIGRlZmljaWVuY3k6IDpmdW5jOmBta3RpbWVfdHpgIGludGVycHJldHMgdGhlIGZpcnN0IDggZWxlbWVudHMgb2YgKnR1cGxlKiBhcyBhCi0gICBsb2NhbCB0aW1lIGFuZCB0aGVuIGNvbXBlbnNhdGVzIGZvciB0aGUgdGltZXpvbmUgZGlmZmVyZW5jZS4gIFRoaXMgbWF5IHlpZWxkIGEKLSAgIHNsaWdodCBlcnJvciBhcm91bmQgY2hhbmdlcyBpbiBkYXlsaWdodCBzYXZpbmdzIHRpbWUsIHRob3VnaCBub3Qgd29ydGggd29ycnlpbmcKLSAgIGFib3V0IGZvciBjb21tb24gdXNlLgorICAgVHVybiBhIDEwLXR1cGxlIGFzIHJldHVybmVkIGJ5IDpmdW5jOmBwYXJzZWRhdGVfdHpgIGludG8gYSBVVEMKKyAgIHRpbWVzdGFtcCAoc2Vjb25kcyBzaW5jZSB0aGUgRXBvY2gpLiAgSWYgdGhlIHRpbWV6b25lIGl0ZW0gaW4gdGhlCisgICB0dXBsZSBpcyBgYE5vbmVgYCwgYXNzdW1lIGxvY2FsIHRpbWUuCiAKIAogLi4gZnVuY3Rpb246OiBmb3JtYXRkYXRlKFt0aW1ldmFsWywgbG9jYWx0aW1lXVssIHVzZWdtdF1dKQpAQCAtMTMwLDcgKzEyNyw4IEBACiAuLiBmdW5jdGlvbjo6IGNvbGxhcHNlX3JmYzIyMzFfdmFsdWUodmFsdWVbLCBlcnJvcnNbLCBmYWxsYmFja19jaGFyc2V0XV0pCiAKICAgIFdoZW4gYSBoZWFkZXIgcGFyYW1ldGVyIGlzIGVuY29kZWQgaW4gOnJmYzpgMjIzMWAgZm9ybWF0LAotICAgOm1ldGg6YE1lc3NhZ2UuZ2V0X3BhcmFtYCBtYXkgcmV0dXJuIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXIgc2V0LAorICAgOm1ldGg6YE1lc3NhZ2UuZ2V0X3BhcmFtIDxlbWFpbC5tZXNzYWdlLk1lc3NhZ2UuZ2V0X3BhcmFtPmAgbWF5IHJldHVybiBhCisgICAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIGNoYXJhY3RlciBzZXQsCiAgICBsYW5ndWFnZSwgYW5kIHZhbHVlLiAgOmZ1bmM6YGNvbGxhcHNlX3JmYzIyMzFfdmFsdWVgIHR1cm5zIHRoaXMgaW50byBhIHVuaWNvZGUKICAgIHN0cmluZy4gIE9wdGlvbmFsICplcnJvcnMqIGlzIHBhc3NlZCB0byB0aGUgKmVycm9ycyogYXJndW1lbnQgb2YgdGhlIGJ1aWx0LWluCiAgICA6ZnVuYzpgdW5pY29kZWAgZnVuY3Rpb247IGl0IGRlZmF1bHRzIHRvIGBgcmVwbGFjZWBgLiAgT3B0aW9uYWwKQEAgLTE1MiwxNSArMTUwLDE1IEBACiAKIC4uIHZlcnNpb25jaGFuZ2VkOjogMi40CiAgICBUaGUgOmZ1bmM6YGRlY29kZWAgZnVuY3Rpb24gaGFzIGJlZW4gcmVtb3ZlZDsgdXNlIHRoZQotICAgOm1ldGg6YEhlYWRlci5kZWNvZGVfaGVhZGVyYCBtZXRob2QgaW5zdGVhZC4KKyAgIDptZXRoOmBIZWFkZXIuZGVjb2RlX2hlYWRlciA8ZW1haWwuaGVhZGVyLkhlYWRlci5kZWNvZGVfaGVhZGVyPmAgbWV0aG9kCisgICBpbnN0ZWFkLgogCiAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNAotICAgVGhlIDpmdW5jOmBlbmNvZGVgIGZ1bmN0aW9uIGhhcyBiZWVuIHJlbW92ZWQ7IHVzZSB0aGUgOm1ldGg6YEhlYWRlci5lbmNvZGVgCi0gICBtZXRob2QgaW5zdGVhZC4KKyAgIFRoZSA6ZnVuYzpgZW5jb2RlYCBmdW5jdGlvbiBoYXMgYmVlbiByZW1vdmVkOyB1c2UgdGhlIDptZXRoOmBIZWFkZXIuZW5jb2RlCisgICA8ZW1haWwuaGVhZGVyLkhlYWRlci5lbmNvZGU+YCBtZXRob2QgaW5zdGVhZC4KIAogLi4gcnVicmljOjogRm9vdG5vdGVzCiAKIC4uIFsjXSBOb3RlIHRoYXQgdGhlIHNpZ24gb2YgdGhlIHRpbWV6b25lIG9mZnNldCBpcyB0aGUgb3Bwb3NpdGUgb2YgdGhlIHNpZ24gb2YgdGhlCiAgICBgYHRpbWUudGltZXpvbmVgYCB2YXJpYWJsZSBmb3IgdGhlIHNhbWUgdGltZXpvbmU7IHRoZSBsYXR0ZXIgdmFyaWFibGUgZm9sbG93cwogICAgdGhlIFBPU0lYIHN0YW5kYXJkIHdoaWxlIHRoaXMgbW9kdWxlIGZvbGxvd3MgOnJmYzpgMjgyMmAuCi0KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2V4Y2VwdGlvbnMucnN0IGIvRG9jL2xpYnJhcnkvZXhjZXB0aW9ucy5yc3QKaW5kZXggOGJkOTAzYS4uOTI5MWMxOCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZXhjZXB0aW9ucy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZXhjZXB0aW9ucy5yc3QKQEAgLTM4LDEwICszOCwxMCBAQAogaW50ZXJwcmV0ZXIgcmFpc2VzIHRoZSBzYW1lIGV4Y2VwdGlvbjsgYnV0IGJld2FyZSB0aGF0IHRoZXJlIGlzIG5vdGhpbmcgdG8KIHByZXZlbnQgdXNlciBjb2RlIGZyb20gcmFpc2luZyBhbiBpbmFwcHJvcHJpYXRlIGVycm9yLgogCi1UaGUgYnVpbHQtaW4gZXhjZXB0aW9uIGNsYXNzZXMgY2FuIGJlIHN1Yi1jbGFzc2VkIHRvIGRlZmluZSBuZXcgZXhjZXB0aW9uczsKLXByb2dyYW1tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGF0IGxlYXN0IGRlcml2ZSBuZXcgZXhjZXB0aW9ucyBmcm9tIHRoZQotOmV4YzpgRXhjZXB0aW9uYCBjbGFzcyBhbmQgbm90IDpleGM6YEJhc2VFeGNlcHRpb25gLiAgTW9yZSBpbmZvcm1hdGlvbiBvbgotZGVmaW5pbmcgZXhjZXB0aW9ucyBpcyBhdmFpbGFibGUgaW4gdGhlIFB5dGhvbiBUdXRvcmlhbCB1bmRlcgorVGhlIGJ1aWx0LWluIGV4Y2VwdGlvbiBjbGFzc2VzIGNhbiBiZSBzdWJjbGFzc2VkIHRvIGRlZmluZSBuZXcgZXhjZXB0aW9uczsKK3Byb2dyYW1tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGRlcml2ZSBuZXcgZXhjZXB0aW9ucyBmcm9tIHRoZSA6ZXhjOmBFeGNlcHRpb25gCitjbGFzcyBvciBvbmUgb2YgaXRzIHN1YmNsYXNzZXMsIGFuZCBub3QgZnJvbSA6ZXhjOmBCYXNlRXhjZXB0aW9uYC4gIE1vcmUKK2luZm9ybWF0aW9uIG9uIGRlZmluaW5nIGV4Y2VwdGlvbnMgaXMgYXZhaWxhYmxlIGluIHRoZSBQeXRob24gVHV0b3JpYWwgdW5kZXIKIDpyZWY6YHR1dC11c2VyZXhjZXB0aW9uc2AuCiAKIFRoZSBmb2xsb3dpbmcgZXhjZXB0aW9ucyBhcmUgb25seSB1c2VkIGFzIGJhc2UgY2xhc3NlcyBmb3Igb3RoZXIgZXhjZXB0aW9ucy4KQEAgLTE1OCw5ICsxNTgsOSBAQAogCiAuLiBleGNlcHRpb246OiBHZW5lcmF0b3JFeGl0CiAKLSAgIFJhaXNlIHdoZW4gYSA6dGVybTpgZ2VuZXJhdG9yYFwncyA6bWV0aDpgY2xvc2VgIG1ldGhvZCBpcyBjYWxsZWQuICBJdAotICAgZGlyZWN0bHkgaW5oZXJpdHMgZnJvbSA6ZXhjOmBCYXNlRXhjZXB0aW9uYCBpbnN0ZWFkIG9mIDpleGM6YFN0YW5kYXJkRXJyb3JgIHNpbmNlCi0gICBpdCBpcyB0ZWNobmljYWxseSBub3QgYW4gZXJyb3IuCisgICBSYWlzZWQgd2hlbiBhIDp0ZXJtOmBnZW5lcmF0b3JgXCdzIDptZXRoOmBjbG9zZWAgbWV0aG9kIGlzIGNhbGxlZC4gIEl0CisgICBkaXJlY3RseSBpbmhlcml0cyBmcm9tIDpleGM6YEJhc2VFeGNlcHRpb25gIGluc3RlYWQgb2YgOmV4YzpgU3RhbmRhcmRFcnJvcmAKKyAgIHNpbmNlIGl0IGlzIHRlY2huaWNhbGx5IG5vdCBhbiBlcnJvci4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi41CiAKQEAgLTIyMCw3ICsyMjAsNyBAQAogICAgUmFpc2VkIHdoZW4gYW4gb3BlcmF0aW9uIHJ1bnMgb3V0IG9mIG1lbW9yeSBidXQgdGhlIHNpdHVhdGlvbiBtYXkgc3RpbGwgYmUKICAgIHJlc2N1ZWQgKGJ5IGRlbGV0aW5nIHNvbWUgb2JqZWN0cykuICBUaGUgYXNzb2NpYXRlZCB2YWx1ZSBpcyBhIHN0cmluZyBpbmRpY2F0aW5nCiAgICB3aGF0IGtpbmQgb2YgKGludGVybmFsKSBvcGVyYXRpb24gcmFuIG91dCBvZiBtZW1vcnkuIE5vdGUgdGhhdCBiZWNhdXNlIG9mIHRoZQotICAgdW5kZXJseWluZyBtZW1vcnkgbWFuYWdlbWVudCBhcmNoaXRlY3R1cmUgKEMncyA6Y2Z1bmM6YG1hbGxvY2AgZnVuY3Rpb24pLCB0aGUKKyAgIHVuZGVybHlpbmcgbWVtb3J5IG1hbmFnZW1lbnQgYXJjaGl0ZWN0dXJlIChDJ3MgOmM6ZnVuYzpgbWFsbG9jYCBmdW5jdGlvbiksIHRoZQogICAgaW50ZXJwcmV0ZXIgbWF5IG5vdCBhbHdheXMgYmUgYWJsZSB0byBjb21wbGV0ZWx5IHJlY292ZXIgZnJvbSB0aGlzIHNpdHVhdGlvbjsgaXQKICAgIG5ldmVydGhlbGVzcyByYWlzZXMgYW4gZXhjZXB0aW9uIHNvIHRoYXQgYSBzdGFjayB0cmFjZWJhY2sgY2FuIGJlIHByaW50ZWQsIGluCiAgICBjYXNlIGEgcnVuLWF3YXkgcHJvZ3JhbSB3YXMgdGhlIGNhdXNlLgpAQCAtMjQ5LDggKzI0OSw4IEBACiAgICBUaGlzIGV4Y2VwdGlvbiBpcyBkZXJpdmVkIGZyb20gOmV4YzpgRW52aXJvbm1lbnRFcnJvcmAuICBJdCBpcyByYWlzZWQgd2hlbiBhCiAgICBmdW5jdGlvbiByZXR1cm5zIGEgc3lzdGVtLXJlbGF0ZWQgZXJyb3IgKG5vdCBmb3IgaWxsZWdhbCBhcmd1bWVudCB0eXBlcyBvcgogICAgb3RoZXIgaW5jaWRlbnRhbCBlcnJvcnMpLiAgVGhlIDphdHRyOmBlcnJub2AgYXR0cmlidXRlIGlzIGEgbnVtZXJpYyBlcnJvcgotICAgY29kZSBmcm9tIDpjZGF0YTpgZXJybm9gLCBhbmQgdGhlIDphdHRyOmBzdHJlcnJvcmAgYXR0cmlidXRlIGlzIHRoZQotICAgY29ycmVzcG9uZGluZyBzdHJpbmcsIGFzIHdvdWxkIGJlIHByaW50ZWQgYnkgdGhlIEMgZnVuY3Rpb24gOmNmdW5jOmBwZXJyb3JgLgorICAgY29kZSBmcm9tIDpjOmRhdGE6YGVycm5vYCwgYW5kIHRoZSA6YXR0cjpgc3RyZXJyb3JgIGF0dHJpYnV0ZSBpcyB0aGUKKyAgIGNvcnJlc3BvbmRpbmcgc3RyaW5nLCBhcyB3b3VsZCBiZSBwcmludGVkIGJ5IHRoZSBDIGZ1bmN0aW9uIDpjOmZ1bmM6YHBlcnJvcmAuCiAgICBTZWUgdGhlIG1vZHVsZSA6bW9kOmBlcnJub2AsIHdoaWNoIGNvbnRhaW5zIG5hbWVzIGZvciB0aGUgZXJyb3IgY29kZXMgZGVmaW5lZAogICAgYnkgdGhlIHVuZGVybHlpbmcgb3BlcmF0aW5nIHN5c3RlbS4KIApAQCAtMjg2LDggKzI4Niw3IEBACiAKICAgIFJhaXNlZCB3aGVuIGFuIGVycm9yIGlzIGRldGVjdGVkIHRoYXQgZG9lc24ndCBmYWxsIGluIGFueSBvZiB0aGUgb3RoZXIKICAgIGNhdGVnb3JpZXMuICBUaGUgYXNzb2NpYXRlZCB2YWx1ZSBpcyBhIHN0cmluZyBpbmRpY2F0aW5nIHdoYXQgcHJlY2lzZWx5IHdlbnQKLSAgIHdyb25nLiAgKFRoaXMgZXhjZXB0aW9uIGlzIG1vc3RseSBhIHJlbGljIGZyb20gYSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoZQotICAgaW50ZXJwcmV0ZXI7IGl0IGlzIG5vdCB1c2VkIHZlcnkgbXVjaCBhbnkgbW9yZS4pCisgICB3cm9uZy4KIAogCiAuLiBleGNlcHRpb246OiBTdG9wSXRlcmF0aW9uCkBAIC0zNDIsMTEgKzM0MSwxMSBAQAogICAgVGhpcyBleGNlcHRpb24gaXMgcmFpc2VkIGJ5IHRoZSA6ZnVuYzpgc3lzLmV4aXRgIGZ1bmN0aW9uLiAgV2hlbiBpdCBpcyBub3QKICAgIGhhbmRsZWQsIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgZXhpdHM7IG5vIHN0YWNrIHRyYWNlYmFjayBpcyBwcmludGVkLiAgSWYgdGhlCiAgICBhc3NvY2lhdGVkIHZhbHVlIGlzIGEgcGxhaW4gaW50ZWdlciwgaXQgc3BlY2lmaWVzIHRoZSBzeXN0ZW0gZXhpdCBzdGF0dXMgKHBhc3NlZAotICAgdG8gQydzIDpjZnVuYzpgZXhpdGAgZnVuY3Rpb24pOyBpZiBpdCBpcyBgYE5vbmVgYCwgdGhlIGV4aXQgc3RhdHVzIGlzIHplcm87IGlmCisgICB0byBDJ3MgOmM6ZnVuYzpgZXhpdGAgZnVuY3Rpb24pOyBpZiBpdCBpcyBgYE5vbmVgYCwgdGhlIGV4aXQgc3RhdHVzIGlzIHplcm87IGlmCiAgICBpdCBoYXMgYW5vdGhlciB0eXBlIChzdWNoIGFzIGEgc3RyaW5nKSwgdGhlIG9iamVjdCdzIHZhbHVlIGlzIHByaW50ZWQgYW5kIHRoZQogICAgZXhpdCBzdGF0dXMgaXMgb25lLgogCi0gICBJbnN0YW5jZXMgaGF2ZSBhbiBhdHRyaWJ1dGUgOmF0dHI6YGNvZGVgIHdoaWNoIGlzIHNldCB0byB0aGUgcHJvcG9zZWQgZXhpdAorICAgSW5zdGFuY2VzIGhhdmUgYW4gYXR0cmlidXRlIDphdHRyOmAhY29kZWAgd2hpY2ggaXMgc2V0IHRvIHRoZSBwcm9wb3NlZCBleGl0CiAgICBzdGF0dXMgb3IgZXJyb3IgbWVzc2FnZSAoZGVmYXVsdGluZyB0byBgYE5vbmVgYCkuIEFsc28sIHRoaXMgZXhjZXB0aW9uIGRlcml2ZXMKICAgIGRpcmVjdGx5IGZyb20gOmV4YzpgQmFzZUV4Y2VwdGlvbmAgYW5kIG5vdCA6ZXhjOmBTdGFuZGFyZEVycm9yYCwgc2luY2UgaXQgaXMgbm90CiAgICB0ZWNobmljYWxseSBhbiBlcnJvci4KQEAgLTM1Niw3ICszNTUsNyBAQAogICAgZXhlY3V0ZWQsIGFuZCBzbyB0aGF0IGEgZGVidWdnZXIgY2FuIGV4ZWN1dGUgYSBzY3JpcHQgd2l0aG91dCBydW5uaW5nIHRoZSByaXNrCiAgICBvZiBsb3NpbmcgY29udHJvbC4gIFRoZSA6ZnVuYzpgb3MuX2V4aXRgIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGlmIGl0IGlzCiAgICBhYnNvbHV0ZWx5IHBvc2l0aXZlbHkgbmVjZXNzYXJ5IHRvIGV4aXQgaW1tZWRpYXRlbHkgKGZvciBleGFtcGxlLCBpbiB0aGUgY2hpbGQKLSAgIHByb2Nlc3MgYWZ0ZXIgYSBjYWxsIHRvIDpmdW5jOmBmb3JrYCkuCisgICBwcm9jZXNzIGFmdGVyIGEgY2FsbCB0byA6ZnVuYzpgb3MuZm9ya2ApLgogCiAgICBUaGUgZXhjZXB0aW9uIGluaGVyaXRzIGZyb20gOmV4YzpgQmFzZUV4Y2VwdGlvbmAgaW5zdGVhZCBvZiA6ZXhjOmBTdGFuZGFyZEVycm9yYAogICAgb3IgOmV4YzpgRXhjZXB0aW9uYCBzbyB0aGF0IGl0IGlzIG5vdCBhY2NpZGVudGFsbHkgY2F1Z2h0IGJ5IGNvZGUgdGhhdCBjYXRjaGVzCkBAIC0zODcsNiArMzg2LDMwIEBACiAgICBSYWlzZWQgd2hlbiBhIFVuaWNvZGUtcmVsYXRlZCBlbmNvZGluZyBvciBkZWNvZGluZyBlcnJvciBvY2N1cnMuICBJdCBpcyBhCiAgICBzdWJjbGFzcyBvZiA6ZXhjOmBWYWx1ZUVycm9yYC4KIAorICAgOmV4YzpgVW5pY29kZUVycm9yYCBoYXMgYXR0cmlidXRlcyB0aGF0IGRlc2NyaWJlIHRoZSBlbmNvZGluZyBvciBkZWNvZGluZworICAgZXJyb3IuICBGb3IgZXhhbXBsZSwgYGBlcnIub2JqZWN0W2Vyci5zdGFydDplcnIuZW5kXWBgIGdpdmVzIHRoZSBwYXJ0aWN1bGFyCisgICBpbnZhbGlkIGlucHV0IHRoYXQgdGhlIGNvZGVjIGZhaWxlZCBvbi4KKworICAgLi4gYXR0cmlidXRlOjogZW5jb2RpbmcKKworICAgICAgIFRoZSBuYW1lIG9mIHRoZSBlbmNvZGluZyB0aGF0IHJhaXNlZCB0aGUgZXJyb3IuCisKKyAgIC4uIGF0dHJpYnV0ZTo6IHJlYXNvbgorCisgICAgICAgQSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgc3BlY2lmaWMgY29kZWMgZXJyb3IuCisKKyAgIC4uIGF0dHJpYnV0ZTo6IG9iamVjdAorCisgICAgICAgVGhlIG9iamVjdCB0aGUgY29kZWMgd2FzIGF0dGVtcHRpbmcgdG8gZW5jb2RlIG9yIGRlY29kZS4KKworICAgLi4gYXR0cmlidXRlOjogc3RhcnQKKworICAgICAgIFRoZSBmaXJzdCBpbmRleCBvZiBpbnZhbGlkIGRhdGEgaW4gOmF0dHI6YG9iamVjdGAuCisKKyAgIC4uIGF0dHJpYnV0ZTo6IGVuZAorCisgICAgICAgVGhlIGluZGV4IGFmdGVyIHRoZSBsYXN0IGludmFsaWQgZGF0YSBpbiA6YXR0cjpgb2JqZWN0YC4KKwogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4wCiAKIApAQCAtNDI5LDE2ICs0NTIsMTYgQEAKIC4uIGV4Y2VwdGlvbjo6IFdpbmRvd3NFcnJvcgogCiAgICBSYWlzZWQgd2hlbiBhIFdpbmRvd3Mtc3BlY2lmaWMgZXJyb3Igb2NjdXJzIG9yIHdoZW4gdGhlIGVycm9yIG51bWJlciBkb2VzIG5vdAotICAgY29ycmVzcG9uZCB0byBhbiA6Y2RhdGE6YGVycm5vYCB2YWx1ZS4gIFRoZSA6YXR0cjpgd2luZXJyb3JgIGFuZAorICAgY29ycmVzcG9uZCB0byBhbiA6YzpkYXRhOmBlcnJub2AgdmFsdWUuICBUaGUgOmF0dHI6YHdpbmVycm9yYCBhbmQKICAgIDphdHRyOmBzdHJlcnJvcmAgdmFsdWVzIGFyZSBjcmVhdGVkIGZyb20gdGhlIHJldHVybiB2YWx1ZXMgb2YgdGhlCi0gICA6Y2Z1bmM6YEdldExhc3RFcnJvcmAgYW5kIDpjZnVuYzpgRm9ybWF0TWVzc2FnZWAgZnVuY3Rpb25zIGZyb20gdGhlIFdpbmRvd3MKKyAgIDpjOmZ1bmM6YEdldExhc3RFcnJvcmAgYW5kIDpjOmZ1bmM6YEZvcm1hdE1lc3NhZ2VgIGZ1bmN0aW9ucyBmcm9tIHRoZSBXaW5kb3dzCiAgICBQbGF0Zm9ybSBBUEkuIFRoZSA6YXR0cjpgZXJybm9gIHZhbHVlIG1hcHMgdGhlIDphdHRyOmB3aW5lcnJvcmAgdmFsdWUgdG8KICAgIGNvcnJlc3BvbmRpbmcgYGBlcnJuby5oYGAgdmFsdWVzLiBUaGlzIGlzIGEgc3ViY2xhc3Mgb2YgOmV4YzpgT1NFcnJvcmAuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMAogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgUHJldmlvdXMgdmVyc2lvbnMgcHV0IHRoZSA6Y2Z1bmM6YEdldExhc3RFcnJvcmAgY29kZXMgaW50byA6YXR0cjpgZXJybm9gLgorICAgICAgUHJldmlvdXMgdmVyc2lvbnMgcHV0IHRoZSA6YzpmdW5jOmBHZXRMYXN0RXJyb3JgIGNvZGVzIGludG8gOmF0dHI6YGVycm5vYC4KIAogCiAuLiBleGNlcHRpb246OiBaZXJvRGl2aXNpb25FcnJvcgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZmNudGwucnN0IGIvRG9jL2xpYnJhcnkvZmNudGwucnN0CmluZGV4IGQwNDMwYzIuLjU2MmU3OGYgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2ZjbnRsLnJzdAorKysgYi9Eb2MvbGlicmFyeS9mY250bC5yc3QKQEAgLTEsNiArMSw1IEBACi0KLTptb2Q6YGZjbnRsYCAtLS0gVGhlIDpmdW5jOmBmY250bGAgYW5kIDpmdW5jOmBpb2N0bGAgc3lzdGVtIGNhbGxzCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOm1vZDpgZmNudGxgIC0tLSBUaGUgYGBmY250bGBgIGFuZCBgYGlvY3RsYGAgc3lzdGVtIGNhbGxzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogLi4gbW9kdWxlOjogZmNudGwKICAgIDpwbGF0Zm9ybTogVW5peApAQCAtMTMsNTAgKzEyLDU1IEBACiAgICBwYWlyOiBVTklYOyBJL08gY29udHJvbAogCiBUaGlzIG1vZHVsZSBwZXJmb3JtcyBmaWxlIGNvbnRyb2wgYW5kIEkvTyBjb250cm9sIG9uIGZpbGUgZGVzY3JpcHRvcnMuIEl0IGlzIGFuCi1pbnRlcmZhY2UgdG8gdGhlIDpjZnVuYzpgZmNudGxgIGFuZCA6Y2Z1bmM6YGlvY3RsYCBVbml4IHJvdXRpbmVzLgoraW50ZXJmYWNlIHRvIHRoZSA6YzpmdW5jOmBmY250bGAgYW5kIDpjOmZ1bmM6YGlvY3RsYCBVbml4IHJvdXRpbmVzLgogCiBBbGwgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIHRha2UgYSBmaWxlIGRlc2NyaXB0b3IgKmZkKiBhcyB0aGVpciBmaXJzdAogYXJndW1lbnQuICBUaGlzIGNhbiBiZSBhbiBpbnRlZ2VyIGZpbGUgZGVzY3JpcHRvciwgc3VjaCBhcyByZXR1cm5lZCBieQogYGBzeXMuc3RkaW4uZmlsZW5vKClgYCwgb3IgYSBmaWxlIG9iamVjdCwgc3VjaCBhcyBgYHN5cy5zdGRpbmBgIGl0c2VsZiwgd2hpY2gKLXByb3ZpZGVzIGEgOm1ldGg6YGZpbGVub2Agd2hpY2ggcmV0dXJucyBhIGdlbnVpbmUgZmlsZSBkZXNjcmlwdG9yLgorcHJvdmlkZXMgYSA6bWV0aDpgfmlvLklPQmFzZS5maWxlbm9gIHdoaWNoIHJldHVybnMgYSBnZW51aW5lIGZpbGUgZGVzY3JpcHRvci4KIAogVGhlIG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgogCiAKIC4uIGZ1bmN0aW9uOjogZmNudGwoZmQsIG9wWywgYXJnXSkKIAotICAgUGVyZm9ybSB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbiBvbiBmaWxlIGRlc2NyaXB0b3IgKmZkKiAoZmlsZSBvYmplY3RzIHByb3ZpZGluZwotICAgYSA6bWV0aDpgZmlsZW5vYCBtZXRob2QgYXJlIGFjY2VwdGVkIGFzIHdlbGwpLiBUaGUgb3BlcmF0aW9uIGlzIGRlZmluZWQgYnkgKm9wKgotICAgYW5kIGlzIG9wZXJhdGluZyBzeXN0ZW0gZGVwZW5kZW50LiAgVGhlc2UgY29kZXMgYXJlIGFsc28gZm91bmQgaW4gdGhlCi0gICA6bW9kOmBmY250bGAgbW9kdWxlLiBUaGUgYXJndW1lbnQgKmFyZyogaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB0aGUgaW50ZWdlcgorICAgUGVyZm9ybSB0aGUgb3BlcmF0aW9uICpvcCogb24gZmlsZSBkZXNjcmlwdG9yICpmZCogKGZpbGUgb2JqZWN0cyBwcm92aWRpbmcKKyAgIGEgOm1ldGg6YH5pby5JT0Jhc2UuZmlsZW5vYCBtZXRob2QgYXJlIGFjY2VwdGVkIGFzIHdlbGwpLiAgVGhlIHZhbHVlcyB1c2VkCisgICBmb3IgZm9yICpvcCogYXJlIG9wZXJhdGluZyBzeXN0ZW0gZGVwZW5kZW50LCBhbmQgYXJlIGF2YWlsYWJsZSBhcyBjb25zdGFudHMKKyAgIGluIHRoZSA6bW9kOmBmY250bGAgbW9kdWxlLCB1c2luZyB0aGUgc2FtZSBuYW1lcyBhcyB1c2VkIGluIHRoZSByZWxldmFudCBDCisgICBoZWFkZXIgZmlsZXMuICBUaGUgYXJndW1lbnQgKmFyZyogaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB0aGUgaW50ZWdlcgogICAgdmFsdWUgYGAwYGAuICBXaGVuIHByZXNlbnQsIGl0IGNhbiBlaXRoZXIgYmUgYW4gaW50ZWdlciB2YWx1ZSwgb3IgYSBzdHJpbmcuCiAgICBXaXRoIHRoZSBhcmd1bWVudCBtaXNzaW5nIG9yIGFuIGludGVnZXIgdmFsdWUsIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBmdW5jdGlvbgotICAgaXMgdGhlIGludGVnZXIgcmV0dXJuIHZhbHVlIG9mIHRoZSBDIDpjZnVuYzpgZmNudGxgIGNhbGwuICBXaGVuIHRoZSBhcmd1bWVudCBpcworICAgaXMgdGhlIGludGVnZXIgcmV0dXJuIHZhbHVlIG9mIHRoZSBDIDpjOmZ1bmM6YGZjbnRsYCBjYWxsLiAgV2hlbiB0aGUgYXJndW1lbnQgaXMKICAgIGEgc3RyaW5nIGl0IHJlcHJlc2VudHMgYSBiaW5hcnkgc3RydWN0dXJlLCBlLmcuIGNyZWF0ZWQgYnkgOmZ1bmM6YHN0cnVjdC5wYWNrYC4KICAgIFRoZSBiaW5hcnkgZGF0YSBpcyBjb3BpZWQgdG8gYSBidWZmZXIgd2hvc2UgYWRkcmVzcyBpcyBwYXNzZWQgdG8gdGhlIEMKLSAgIDpjZnVuYzpgZmNudGxgIGNhbGwuICBUaGUgcmV0dXJuIHZhbHVlIGFmdGVyIGEgc3VjY2Vzc2Z1bCBjYWxsIGlzIHRoZSBjb250ZW50cworICAgOmM6ZnVuYzpgZmNudGxgIGNhbGwuICBUaGUgcmV0dXJuIHZhbHVlIGFmdGVyIGEgc3VjY2Vzc2Z1bCBjYWxsIGlzIHRoZSBjb250ZW50cwogICAgb2YgdGhlIGJ1ZmZlciwgY29udmVydGVkIHRvIGEgc3RyaW5nIG9iamVjdC4gIFRoZSBsZW5ndGggb2YgdGhlIHJldHVybmVkIHN0cmluZwogICAgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgbGVuZ3RoIG9mIHRoZSAqYXJnKiBhcmd1bWVudC4gIFRoaXMgaXMgbGltaXRlZCB0byAxMDI0CiAgICBieXRlcy4gIElmIHRoZSBpbmZvcm1hdGlvbiByZXR1cm5lZCBpbiB0aGUgYnVmZmVyIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIGlzCiAgICBsYXJnZXIgdGhhbiAxMDI0IGJ5dGVzLCB0aGlzIGlzIG1vc3QgbGlrZWx5IHRvIHJlc3VsdCBpbiBhIHNlZ21lbnRhdGlvbgogICAgdmlvbGF0aW9uIG9yIGEgbW9yZSBzdWJ0bGUgZGF0YSBjb3JydXB0aW9uLgogCi0gICBJZiB0aGUgOmNmdW5jOmBmY250bGAgZmFpbHMsIGFuIDpleGM6YElPRXJyb3JgIGlzIHJhaXNlZC4KKyAgIElmIHRoZSA6YzpmdW5jOmBmY250bGAgZmFpbHMsIGFuIDpleGM6YElPRXJyb3JgIGlzIHJhaXNlZC4KIAogCiAuLiBmdW5jdGlvbjo6IGlvY3RsKGZkLCBvcFssIGFyZ1ssIG11dGF0ZV9mbGFnXV0pCiAKLSAgIFRoaXMgZnVuY3Rpb24gaXMgaWRlbnRpY2FsIHRvIHRoZSA6ZnVuYzpgZmNudGxgIGZ1bmN0aW9uLCBleGNlcHQgdGhhdCB0aGUKKyAgIFRoaXMgZnVuY3Rpb24gaXMgaWRlbnRpY2FsIHRvIHRoZSA6ZnVuYzpgfmZjbnRsLmZjbnRsYCBmdW5jdGlvbiwgZXhjZXB0IHRoYXQgdGhlCiAgICBvcGVyYXRpb25zIGFyZSB0eXBpY2FsbHkgZGVmaW5lZCBpbiB0aGUgbGlicmFyeSBtb2R1bGUgOm1vZDpgdGVybWlvc2AgYW5kIHRoZQogICAgYXJndW1lbnQgaGFuZGxpbmcgaXMgZXZlbiBtb3JlIGNvbXBsaWNhdGVkLgogCiAgICBUaGUgb3AgcGFyYW1ldGVyIGlzIGxpbWl0ZWQgdG8gdmFsdWVzIHRoYXQgY2FuIGZpdCBpbiAzMi1iaXRzLgorICAgQWRkaXRpb25hbCBjb25zdGFudHMgb2YgaW50ZXJlc3QgZm9yIHVzZSBhcyB0aGUgKm9wKiBhcmd1bWVudCBjYW4gYmUKKyAgIGZvdW5kIGluIHRoZSA6bW9kOmB0ZXJtaW9zYCBtb2R1bGUsIHVuZGVyIHRoZSBzYW1lIG5hbWVzIGFzIHVzZWQgaW4KKyAgIHRoZSByZWxldmFudCBDIGhlYWRlciBmaWxlcy4KIAogICAgVGhlIHBhcmFtZXRlciAqYXJnKiBjYW4gYmUgb25lIG9mIGFuIGludGVnZXIsIGFic2VudCAodHJlYXRlZCBpZGVudGljYWxseSB0byB0aGUKICAgIGludGVnZXIgYGAwYGApLCBhbiBvYmplY3Qgc3VwcG9ydGluZyB0aGUgcmVhZC1vbmx5IGJ1ZmZlciBpbnRlcmZhY2UgKG1vc3QgbGlrZWx5CiAgICBhIHBsYWluIFB5dGhvbiBzdHJpbmcpIG9yIGFuIG9iamVjdCBzdXBwb3J0aW5nIHRoZSByZWFkLXdyaXRlIGJ1ZmZlciBpbnRlcmZhY2UuCiAKLSAgIEluIGFsbCBidXQgdGhlIGxhc3QgY2FzZSwgYmVoYXZpb3VyIGlzIGFzIGZvciB0aGUgOmZ1bmM6YGZjbnRsYCBmdW5jdGlvbi4KKyAgIEluIGFsbCBidXQgdGhlIGxhc3QgY2FzZSwgYmVoYXZpb3VyIGlzIGFzIGZvciB0aGUgOmZ1bmM6YH5mY250bC5mY250bGAKKyAgIGZ1bmN0aW9uLgogCiAgICBJZiBhIG11dGFibGUgYnVmZmVyIGlzIHBhc3NlZCwgdGhlbiB0aGUgYmVoYXZpb3VyIGlzIGRldGVybWluZWQgYnkgdGhlIHZhbHVlIG9mCiAgICB0aGUgKm11dGF0ZV9mbGFnKiBwYXJhbWV0ZXIuCkBAIC05NSwxNiArOTksMTYgQEAKIC4uIGZ1bmN0aW9uOjogZmxvY2soZmQsIG9wKQogCiAgICBQZXJmb3JtIHRoZSBsb2NrIG9wZXJhdGlvbiAqb3AqIG9uIGZpbGUgZGVzY3JpcHRvciAqZmQqIChmaWxlIG9iamVjdHMgcHJvdmlkaW5nCi0gICBhIDptZXRoOmBmaWxlbm9gIG1ldGhvZCBhcmUgYWNjZXB0ZWQgYXMgd2VsbCkuIFNlZSB0aGUgVW5peCBtYW51YWwKKyAgIGEgOm1ldGg6YH5pby5JT0Jhc2UuZmlsZW5vYCBtZXRob2QgYXJlIGFjY2VwdGVkIGFzIHdlbGwpLiBTZWUgdGhlIFVuaXggbWFudWFsCiAgICA6bWFucGFnZTpgZmxvY2soMilgIGZvciBkZXRhaWxzLiAgKE9uIHNvbWUgc3lzdGVtcywgdGhpcyBmdW5jdGlvbiBpcyBlbXVsYXRlZAotICAgdXNpbmcgOmNmdW5jOmBmY250bGAuKQorICAgdXNpbmcgOmM6ZnVuYzpgZmNudGxgLikKIAogCiAuLiBmdW5jdGlvbjo6IGxvY2tmKGZkLCBvcGVyYXRpb24sIFtsZW5ndGgsIFtzdGFydCwgW3doZW5jZV1dXSkKIAotICAgVGhpcyBpcyBlc3NlbnRpYWxseSBhIHdyYXBwZXIgYXJvdW5kIHRoZSA6ZnVuYzpgZmNudGxgIGxvY2tpbmcgY2FsbHMuICAqZmQqIGlzCi0gICB0aGUgZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBmaWxlIHRvIGxvY2sgb3IgdW5sb2NrLCBhbmQgKm9wZXJhdGlvbiogaXMgb25lIG9mIHRoZQotICAgZm9sbG93aW5nIHZhbHVlczoKKyAgIFRoaXMgaXMgZXNzZW50aWFsbHkgYSB3cmFwcGVyIGFyb3VuZCB0aGUgOmZ1bmM6YH5mY250bC5mY250bGAgbG9ja2luZyBjYWxscy4KKyAgICpmZCogaXMgdGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgZmlsZSB0byBsb2NrIG9yIHVubG9jaywgYW5kICpvcGVyYXRpb24qCisgICBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAKICAgICogOmNvbnN0OmBMT0NLX1VOYCAtLSB1bmxvY2sKICAgICogOmNvbnN0OmBMT0NLX1NIYCAtLSBhY3F1aXJlIGEgc2hhcmVkIGxvY2sKQEAgLTExOSwxMyArMTIzLDEzIEBACiAgICBzeXN0ZW1zLCA6Y29uc3Q6YExPQ0tfRVhgIGNhbiBvbmx5IGJlIHVzZWQgaWYgdGhlIGZpbGUgZGVzY3JpcHRvciByZWZlcnMgdG8gYQogICAgZmlsZSBvcGVuZWQgZm9yIHdyaXRpbmcuCiAKLSAgICpsZW5ndGgqIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gbG9jaywgKnN0YXJ0KiBpcyB0aGUgYnl0ZSBvZmZzZXQgYXQgd2hpY2ggdGhlCi0gICBsb2NrIHN0YXJ0cywgcmVsYXRpdmUgdG8gKndoZW5jZSosIGFuZCAqd2hlbmNlKiBpcyBhcyB3aXRoIDpmdW5jOmBmaWxlb2JqLnNlZWtgLAotICAgc3BlY2lmaWNhbGx5OgorICAgKmxlbmd0aCogaXMgdGhlIG51bWJlciBvZiBieXRlcyB0byBsb2NrLCAqc3RhcnQqIGlzIHRoZSBieXRlIG9mZnNldCBhdAorICAgd2hpY2ggdGhlIGxvY2sgc3RhcnRzLCByZWxhdGl2ZSB0byAqd2hlbmNlKiwgYW5kICp3aGVuY2UqIGlzIGFzIHdpdGgKKyAgIDpmdW5jOmBpby5JT0Jhc2Uuc2Vla2AsIHNwZWNpZmljYWxseToKIAotICAgKiA6Y29uc3Q6YDBgIC0tIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgZmlsZSAoOmNvbnN0OmBTRUVLX1NFVGApCi0gICAqIDpjb25zdDpgMWAgLS0gcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgYnVmZmVyIHBvc2l0aW9uICg6Y29uc3Q6YFNFRUtfQ1VSYCkKLSAgICogOmNvbnN0OmAyYCAtLSByZWxhdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBmaWxlICg6Y29uc3Q6YFNFRUtfRU5EYCkKKyAgICogOmNvbnN0OmAwYCAtLSByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGZpbGUgKDpkYXRhOmBvcy5TRUVLX1NFVGApCisgICAqIDpjb25zdDpgMWAgLS0gcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgYnVmZmVyIHBvc2l0aW9uICg6ZGF0YTpgb3MuU0VFS19DVVJgKQorICAgKiA6Y29uc3Q6YDJgIC0tIHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgKDpkYXRhOmBvcy5TRUVLX0VORGApCiAKICAgIFRoZSBkZWZhdWx0IGZvciAqc3RhcnQqIGlzIDAsIHdoaWNoIG1lYW5zIHRvIHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCiAgICBUaGUgZGVmYXVsdCBmb3IgKmxlbmd0aCogaXMgMCB3aGljaCBtZWFucyB0byBsb2NrIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUuICBUaGUKQEAgLTE1MCw3ICsxNTQsOCBAQAogLi4gc2VlYWxzbzo6CiAKICAgIE1vZHVsZSA6bW9kOmBvc2AKLSAgICAgIElmIHRoZSBsb2NraW5nIGZsYWdzIDpjb25zdDpgT19TSExPQ0tgIGFuZCA6Y29uc3Q6YE9fRVhMT0NLYCBhcmUgcHJlc2VudAotICAgICAgaW4gdGhlIDptb2Q6YG9zYCBtb2R1bGUgKG9uIEJTRCBvbmx5KSwgdGhlIDpmdW5jOmBvcy5vcGVuYCBmdW5jdGlvbgotICAgICAgcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIDpmdW5jOmBsb2NrZmAgYW5kIDpmdW5jOmBmbG9ja2AgZnVuY3Rpb25zLgorICAgICAgSWYgdGhlIGxvY2tpbmcgZmxhZ3MgOmRhdGE6YH5vcy5PX1NITE9DS2AgYW5kIDpkYXRhOmB+b3MuT19FWExPQ0tgIGFyZQorICAgICAgcHJlc2VudCBpbiB0aGUgOm1vZDpgb3NgIG1vZHVsZSAob24gQlNEIG9ubHkpLCB0aGUgOmZ1bmM6YG9zLm9wZW5gCisgICAgICBmdW5jdGlvbiBwcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgOmZ1bmM6YGxvY2tmYCBhbmQgOmZ1bmM6YGZsb2NrYAorICAgICAgZnVuY3Rpb25zLgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9maWxlY21wLnJzdCBiL0RvYy9saWJyYXJ5L2ZpbGVjbXAucnN0CmluZGV4IDI1ZDA3MDEuLmY5YzVmYjEgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2ZpbGVjbXAucnN0CisrKyBiL0RvYy9saWJyYXJ5L2ZpbGVjbXAucnN0CkBAIC01NCw5ICs1NCw5IEBACiBFeGFtcGxlOjoKIAogICAgPj4+IGltcG9ydCBmaWxlY21wCi0gICA+Pj4gZmlsZWNtcC5jbXAoJ3VuZG9jLnJzdCcsICd1bmRvYy5yc3QnKQorICAgPj4+IGZpbGVjbXAuY21wKCd1bmRvYy5yc3QnLCAndW5kb2MucnN0JykgIyBkb2N0ZXN0OiArU0tJUAogICAgVHJ1ZQotICAgPj4+IGZpbGVjbXAuY21wKCd1bmRvYy5yc3QnLCAnaW5kZXgucnN0JykKKyAgID4+PiBmaWxlY21wLmNtcCgndW5kb2MucnN0JywgJ2luZGV4LnJzdCcpICMgZG9jdGVzdDogK1NLSVAKICAgIEZhbHNlCiAKIApAQCAtNzUsNiArNzUsOSBAQAogICAgJ3RhZ3MnXWBgLiAqaGlkZSogaXMgYSBsaXN0IG9mIG5hbWVzIHRvIGhpZGUsIGFuZCBkZWZhdWx0cyB0byBgYFtvcy5jdXJkaXIsCiAgICBvcy5wYXJkaXJdYGAuCiAKKyAgIFRoZSA6Y2xhc3M6YGRpcmNtcGAgY2xhc3MgY29tcGFyZXMgZmlsZXMgYnkgZG9pbmcgKnNoYWxsb3cqIGNvbXBhcmlzb25zCisgICBhcyBkZXNjcmliZWQgZm9yIDpmdW5jOmBmaWxlY21wLmNtcGAuCisKICAgIFRoZSA6Y2xhc3M6YGRpcmNtcGAgY2xhc3MgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBtZXRob2RzOgogCiAKQEAgLTk0LDcgKzk3LDcgQEAKICAgICAgIFByaW50IGEgY29tcGFyaXNvbiBiZXR3ZWVuICphKiBhbmQgKmIqIGFuZCBjb21tb24gc3ViZGlyZWN0b3JpZXMKICAgICAgIChyZWN1cnNpdmVseSkuCiAKLSAgIFRoZSA6Y2xhc3M6YGRpcmNtcGAgb2ZmZXJzIGEgbnVtYmVyIG9mIGludGVyZXN0aW5nIGF0dHJpYnV0ZXMgdGhhdCBtYXkgYmUKKyAgIFRoZSA6Y2xhc3M6YGRpcmNtcGAgY2xhc3Mgb2ZmZXJzIGEgbnVtYmVyIG9mIGludGVyZXN0aW5nIGF0dHJpYnV0ZXMgdGhhdCBtYXkgYmUKICAgIHVzZWQgdG8gZ2V0IHZhcmlvdXMgYml0cyBvZiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGlyZWN0b3J5IHRyZWVzIGJlaW5nCiAgICBjb21wYXJlZC4KIApAQCAtMTAzLDYgKzEwNiwxNiBAQAogICAgdG8gY29tcHV0ZSBhcmUgdXNlZC4KIAogCisgICAuLiBhdHRyaWJ1dGU6OiBsZWZ0CisKKyAgICAgIFRoZSBkaXJlY3RvcnkgKmEqLgorCisKKyAgIC4uIGF0dHJpYnV0ZTo6IHJpZ2h0CisKKyAgICAgIFRoZSBkaXJlY3RvcnkgKmIqLgorCisKICAgIC4uIGF0dHJpYnV0ZTo6IGxlZnRfbGlzdAogCiAgICAgICBGaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMgaW4gKmEqLCBmaWx0ZXJlZCBieSAqaGlkZSogYW5kICppZ25vcmUqLgpAQCAtMTQ2LDEyICsxNTksMTQgQEAKIAogICAgLi4gYXR0cmlidXRlOjogc2FtZV9maWxlcwogCi0gICAgICBGaWxlcyB3aGljaCBhcmUgaWRlbnRpY2FsIGluIGJvdGggKmEqIGFuZCAqYiouCisgICAgICBGaWxlcyB3aGljaCBhcmUgaWRlbnRpY2FsIGluIGJvdGggKmEqIGFuZCAqYiosIHVzaW5nIHRoZSBjbGFzcydzCisgICAgICBmaWxlIGNvbXBhcmlzb24gb3BlcmF0b3IuCiAKIAogICAgLi4gYXR0cmlidXRlOjogZGlmZl9maWxlcwogCi0gICAgICBGaWxlcyB3aGljaCBhcmUgaW4gYm90aCAqYSogYW5kICpiKiwgd2hvc2UgY29udGVudHMgZGlmZmVyLgorICAgICAgRmlsZXMgd2hpY2ggYXJlIGluIGJvdGggKmEqIGFuZCAqYiosIHdob3NlIGNvbnRlbnRzIGRpZmZlciBhY2NvcmRpbmcKKyAgICAgIHRvIHRoZSBjbGFzcydzIGZpbGUgY29tcGFyaXNvbiBvcGVyYXRvci4KIAogCiAgICAuLiBhdHRyaWJ1dGU6OiBmdW5ueV9maWxlcwpAQCAtMTYzLDMgKzE3OCwxOCBAQAogCiAgICAgICBBIGRpY3Rpb25hcnkgbWFwcGluZyBuYW1lcyBpbiA6YXR0cjpgY29tbW9uX2RpcnNgIHRvIDpjbGFzczpgZGlyY21wYCBvYmplY3RzLgogCisKK0hlcmUgaXMgYSBzaW1wbGlmaWVkIGV4YW1wbGUgb2YgdXNpbmcgdGhlIGBgc3ViZGlyc2BgIGF0dHJpYnV0ZSB0byBzZWFyY2gKK3JlY3Vyc2l2ZWx5IHRocm91Z2ggdHdvIGRpcmVjdG9yaWVzIHRvIHNob3cgY29tbW9uIGRpZmZlcmVudCBmaWxlczo6CisKKyAgICA+Pj4gZnJvbSBmaWxlY21wIGltcG9ydCBkaXJjbXAKKyAgICA+Pj4gZGVmIHByaW50X2RpZmZfZmlsZXMoZGNtcCk6CisgICAgLi4uICAgICBmb3IgbmFtZSBpbiBkY21wLmRpZmZfZmlsZXM6CisgICAgLi4uICAgICAgICAgcHJpbnQgImRpZmZfZmlsZSAlcyBmb3VuZCBpbiAlcyBhbmQgJXMiICUgKG5hbWUsIGRjbXAubGVmdCwKKyAgICAuLi4gICAgICAgICAgICAgICBkY21wLnJpZ2h0KQorICAgIC4uLiAgICAgZm9yIHN1Yl9kY21wIGluIGRjbXAuc3ViZGlycy52YWx1ZXMoKToKKyAgICAuLi4gICAgICAgICBwcmludF9kaWZmX2ZpbGVzKHN1Yl9kY21wKQorICAgIC4uLgorICAgID4+PiBkY21wID0gZGlyY21wKCdkaXIxJywgJ2RpcjInKSAjIGRvY3Rlc3Q6ICtTS0lQCisgICAgPj4+IHByaW50X2RpZmZfZmlsZXMoZGNtcCkgIyBkb2N0ZXN0OiArU0tJUAorCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9maWxlaW5wdXQucnN0IGIvRG9jL2xpYnJhcnkvZmlsZWlucHV0LnJzdAppbmRleCAxNzJhNjQzLi43MTBiZWYzIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9maWxlaW5wdXQucnN0CisrKyBiL0RvYy9saWJyYXJ5L2ZpbGVpbnB1dC5yc3QKQEAgLTUwLDcgKzUwLDcgQEAKIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaXMgdGhlIHByaW1hcnkgaW50ZXJmYWNlIG9mIHRoaXMgbW9kdWxlOgogCiAKLS4uIGZ1bmN0aW9uOjogaW5wdXQoW2ZpbGVzWywgaW5wbGFjZVssIGJhY2t1cFssIG1vZGVbLCBvcGVuaG9va11dXV1dKQorLi4gZnVuY3Rpb246OiBpbnB1dChbZmlsZXNbLCBpbnBsYWNlWywgYmFja3VwWywgYnVmc2l6ZVssIG1vZGVbLCBvcGVuaG9va11dXV1dXSkKIAogICAgQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSA6Y2xhc3M6YEZpbGVJbnB1dGAgY2xhc3MuICBUaGUgaW5zdGFuY2Ugd2lsbCBiZSB1c2VkCiAgICBhcyBnbG9iYWwgc3RhdGUgZm9yIHRoZSBmdW5jdGlvbnMgb2YgdGhpcyBtb2R1bGUsIGFuZCBpcyBhbHNvIHJldHVybmVkIHRvIHVzZQpAQCAtMTIyLDE1ICsxMjIsMTYgQEAKIGF2YWlsYWJsZSBmb3Igc3ViY2xhc3NpbmcgYXMgd2VsbDoKIAogCi0uLiBjbGFzczo6IEZpbGVJbnB1dChbZmlsZXNbLCBpbnBsYWNlWywgYmFja3VwWywgbW9kZVssIG9wZW5ob29rXV1dXV0pCisuLiBjbGFzczo6IEZpbGVJbnB1dChbZmlsZXNbLCBpbnBsYWNlWywgYmFja3VwWyxidWZzaXplWywgbW9kZVssIG9wZW5ob29rXV1dXV1dKQogCiAgICBDbGFzcyA6Y2xhc3M6YEZpbGVJbnB1dGAgaXMgdGhlIGltcGxlbWVudGF0aW9uOyBpdHMgbWV0aG9kcyA6bWV0aDpgZmlsZW5hbWVgLAogICAgOm1ldGg6YGZpbGVub2AsIDptZXRoOmBsaW5lbm9gLCA6bWV0aDpgZmlsZWxpbmVub2AsIDptZXRoOmBpc2ZpcnN0bGluZWAsCi0gICA6bWV0aDpgaXNzdGRpbmAsIDptZXRoOmBuZXh0ZmlsZWAgYW5kIDptZXRoOmBjbG9zZWAgY29ycmVzcG9uZCB0byB0aGUgZnVuY3Rpb25zCi0gICBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBtb2R1bGUuIEluIGFkZGl0aW9uIGl0IGhhcyBhIDptZXRoOmByZWFkbGluZWAgbWV0aG9kCi0gICB3aGljaCByZXR1cm5zIHRoZSBuZXh0IGlucHV0IGxpbmUsIGFuZCBhIDptZXRoOmBfX2dldGl0ZW1fX2AgbWV0aG9kIHdoaWNoCi0gICBpbXBsZW1lbnRzIHRoZSBzZXF1ZW5jZSBiZWhhdmlvci4gIFRoZSBzZXF1ZW5jZSBtdXN0IGJlIGFjY2Vzc2VkIGluIHN0cmljdGx5Ci0gICBzZXF1ZW50aWFsIG9yZGVyOyByYW5kb20gYWNjZXNzIGFuZCA6bWV0aDpgcmVhZGxpbmVgIGNhbm5vdCBiZSBtaXhlZC4KKyAgIDptZXRoOmBpc3N0ZGluYCwgOm1ldGg6YG5leHRmaWxlYCBhbmQgOm1ldGg6YGNsb3NlYCBjb3JyZXNwb25kIHRvIHRoZQorICAgZnVuY3Rpb25zIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlIG1vZHVsZS4gSW4gYWRkaXRpb24gaXQgaGFzIGEKKyAgIDptZXRoOmB+ZmlsZS5yZWFkbGluZWAgbWV0aG9kIHdoaWNoIHJldHVybnMgdGhlIG5leHQgaW5wdXQgbGluZSwKKyAgIGFuZCBhIDptZXRoOmBfX2dldGl0ZW1fX2AgbWV0aG9kIHdoaWNoIGltcGxlbWVudHMgdGhlIHNlcXVlbmNlIGJlaGF2aW9yLgorICAgVGhlIHNlcXVlbmNlIG11c3QgYmUgYWNjZXNzZWQgaW4gc3RyaWN0bHkgc2VxdWVudGlhbCBvcmRlcjsgcmFuZG9tIGFjY2VzcworICAgYW5kIDptZXRoOmB+ZmlsZS5yZWFkbGluZWAgY2Fubm90IGJlIG1peGVkLgogCiAgICBXaXRoICptb2RlKiB5b3UgY2FuIHNwZWNpZnkgd2hpY2ggZmlsZSBtb2RlIHdpbGwgYmUgcGFzc2VkIHRvIDpmdW5jOmBvcGVuYC4gSXQKICAgIG11c3QgYmUgb25lIG9mIGBgJ3InYGAsIGBgJ3JVJ2BgLCBgYCdVJ2BgIGFuZCBgYCdyYidgYC4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2ZsLnJzdCBiL0RvYy9saWJyYXJ5L2ZsLnJzdAppbmRleCBhNWE0MjZhLi5jNjg5MzcyIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9mbC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZmwucnN0CkBAIC05LDcgKzksNyBAQAogCiAKIC4uIGRlcHJlY2F0ZWQ6OiAyLjYKLSAgICBUaGUgOm1vZDpgZmxgIG1vZHVsZSBoYXMgYmVlbiBkZXByZWNhdGVkIGZvciByZW1vdmFsIGluIFB5dGhvbiAzLjAuCisgICAgVGhlIDptb2Q6YGZsYCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4KIAogCiAuLiBpbmRleDo6CkBAIC0yOSw4ICsyOSw4IEBACiB0aGUgJ2N1cnJlbnQgZm9ybScgbWFpbnRhaW5lZCBieSB0aGUgbGlicmFyeSB0byB3aGljaCBuZXcgRk9STVMgb2JqZWN0cyBhcmUKIGFkZGVkLCBhbGwgZnVuY3Rpb25zIHRoYXQgYWRkIGEgRk9STVMgb2JqZWN0IHRvIGEgZm9ybSBhcmUgbWV0aG9kcyBvZiB0aGUgUHl0aG9uCiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBmb3JtLiBDb25zZXF1ZW50bHksIHRoZXJlIGFyZSBubyBQeXRob24gZXF1aXZhbGVudHMgZm9yCi10aGUgQyBmdW5jdGlvbnMgOmNmdW5jOmBmbF9hZGR0b19mb3JtYCBhbmQgOmNmdW5jOmBmbF9lbmRfZm9ybWAsIGFuZCB0aGUKLWVxdWl2YWxlbnQgb2YgOmNmdW5jOmBmbF9iZ25fZm9ybWAgaXMgY2FsbGVkIDpmdW5jOmBmbC5tYWtlX2Zvcm1gLgordGhlIEMgZnVuY3Rpb25zIDpjOmZ1bmM6YGZsX2FkZHRvX2Zvcm1gIGFuZCA6YzpmdW5jOmBmbF9lbmRfZm9ybWAsIGFuZCB0aGUKK2VxdWl2YWxlbnQgb2YgOmM6ZnVuYzpgZmxfYmduX2Zvcm1gIGlzIGNhbGxlZCA6ZnVuYzpgZmwubWFrZV9mb3JtYC4KIAogV2F0Y2ggb3V0IGZvciB0aGUgc29tZXdoYXQgY29uZnVzaW5nIHRlcm1pbm9sb2d5OiBGT1JNUyB1c2VzIHRoZSB3b3JkCiA6ZGZuOmBvYmplY3RgIGZvciB0aGUgYnV0dG9ucywgc2xpZGVycyBldGMuIHRoYXQgeW91IGNhbiBwbGFjZSBpbiBhIGZvcm0uIEluCkBAIC00NCw3ICs0NCw3IEBACiBldmVudCBoYW5kbGluZyBpcyBhdmFpbGFibGUsIHRob3VnaCwgc28geW91IGNhbiBtaXggRk9STVMgd2l0aCBwdXJlIEdMIHdpbmRvd3MuCiAKICoqUGxlYXNlIG5vdGU6KiogaW1wb3J0aW5nIDptb2Q6YGZsYCBpbXBsaWVzIGEgY2FsbCB0byB0aGUgR0wgZnVuY3Rpb24KLTpjZnVuYzpgZm9yZWdyb3VuZGAgYW5kIHRvIHRoZSBGT1JNUyByb3V0aW5lIDpjZnVuYzpgZmxfaW5pdGAuCis6YzpmdW5jOmBmb3JlZ3JvdW5kYCBhbmQgdG8gdGhlIEZPUk1TIHJvdXRpbmUgOmM6ZnVuYzpgZmxfaW5pdGAuCiAKIAogLi4gX2ZsLWZ1bmN0aW9uczoKQEAgLTg4LDcgKzg4LDcgQEAKIC4uIGZ1bmN0aW9uOjogZ2V0X3JnYm1vZGUoKQogCiAgICBSZXR1cm4gdGhlIGN1cnJlbnQgcmdiIG1vZGUuICBUaGlzIGlzIHRoZSB2YWx1ZSBvZiB0aGUgQyBnbG9iYWwgdmFyaWFibGUKLSAgIDpjZGF0YTpgZmxfcmdibW9kZWAuCisgICA6YzpkYXRhOmBmbF9yZ2Jtb2RlYC4KIAogCiAuLiBmdW5jdGlvbjo6IHNob3dfbWVzc2FnZShzdHIxLCBzdHIyLCBzdHIzKQpAQCAtMTUzLDggKzE1Myw4IEBACiAgICAgICAgICAgICAgIG1hcGNvbG9yKCkKICAgICAgICAgICAgICAgZ2V0bWNvbG9yKCkKIAotICAgU2VlIHRoZSBkZXNjcmlwdGlvbiBpbiB0aGUgRk9STVMgZG9jdW1lbnRhdGlvbiBvZiA6Y2Z1bmM6YGZsX2NvbG9yYCwKLSAgIDpjZnVuYzpgZmxfbWFwY29sb3JgIGFuZCA6Y2Z1bmM6YGZsX2dldG1jb2xvcmAuCisgICBTZWUgdGhlIGRlc2NyaXB0aW9uIGluIHRoZSBGT1JNUyBkb2N1bWVudGF0aW9uIG9mIDpjOmZ1bmM6YGZsX2NvbG9yYCwKKyAgIDpjOmZ1bmM6YGZsX21hcGNvbG9yYCBhbmQgOmM6ZnVuYzpgZmxfZ2V0bWNvbG9yYC4KIAogCiAuLiBfZm9ybS1vYmplY3RzOgpAQCAtNDg3LDcgKzQ4Nyw3IEBACiAKIAogLi4gZGVwcmVjYXRlZDo6IDIuNgotICAgIFRoZSA6bW9kOmBGTGAgbW9kdWxlIGhhcyBiZWVuIGRlcHJlY2F0ZWQgZm9yIHJlbW92YWwgaW4gUHl0aG9uIDMuMC4KKyAgICBUaGUgOm1vZDpgRkxgIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLgogCiAKIFRoaXMgbW9kdWxlIGRlZmluZXMgc3ltYm9saWMgY29uc3RhbnRzIG5lZWRlZCB0byB1c2UgdGhlIGJ1aWx0LWluIG1vZHVsZQpAQCAtNTA5LDcgKzUwOSw3IEBACiAKIAogLi4gZGVwcmVjYXRlZDo6IDIuNgotICAgIFRoZSA6bW9kOmBmbHBgIG1vZHVsZSBoYXMgYmVlbiBkZXByZWNhdGVkIGZvciByZW1vdmFsIGluIFB5dGhvbiAzLjAuCisgICAgVGhlIDptb2Q6YGZscGAgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuCiAKIAogVGhpcyBtb2R1bGUgZGVmaW5lcyBmdW5jdGlvbnMgdGhhdCBjYW4gcmVhZCBmb3JtIGRlZmluaXRpb25zIGNyZWF0ZWQgYnkgdGhlCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9mbS5yc3QgYi9Eb2MvbGlicmFyeS9mbS5yc3QKaW5kZXggZTQ2NTA2Yi4uYzdlYjRmMyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZm0ucnN0CisrKyBiL0RvYy9saWJyYXJ5L2ZtLnJzdApAQCAtOCw3ICs4LDcgQEAKICAgIDpkZXByZWNhdGVkOgogCiAuLiBkZXByZWNhdGVkOjogMi42Ci0gICBUaGUgOm1vZDpgZm1gIG1vZHVsZSBoYXMgYmVlbiBkZXByZWNhdGVkIGZvciByZW1vdmFsIGluIFB5dGhvbiAzLjAuCisgICBUaGUgOm1vZDpgZm1gIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLgogCiAKIApAQCAtMzAsNyArMzAsNyBAQAogCiAuLiBmdW5jdGlvbjo6IGluaXQoKQogCi0gICBJbml0aWFsaXphdGlvbiBmdW5jdGlvbi4gQ2FsbHMgOmNmdW5jOmBmbWluaXRgLiBJdCBpcyBub3JtYWxseSBub3QgbmVjZXNzYXJ5IHRvCisgICBJbml0aWFsaXphdGlvbiBmdW5jdGlvbi4gQ2FsbHMgOmM6ZnVuYzpgZm1pbml0YC4gSXQgaXMgbm9ybWFsbHkgbm90IG5lY2Vzc2FyeSB0bwogICAgY2FsbCB0aGlzIGZ1bmN0aW9uLCBzaW5jZSBpdCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB0aGUgZmlyc3QgdGltZSB0aGUKICAgIDptb2Q6YGZtYCBtb2R1bGUgaXMgaW1wb3J0ZWQuCiAKQEAgLTQzLDcgKzQzLDcgQEAKIC4uIGZ1bmN0aW9uOjogZW51bWVyYXRlKCkKIAogICAgUmV0dXJucyBhIGxpc3Qgb2YgYXZhaWxhYmxlIGZvbnQgbmFtZXMuIFRoaXMgaXMgYW4gaW50ZXJmYWNlIHRvCi0gICA6Y2Z1bmM6YGZtZW51bWVyYXRlYC4KKyAgIDpjOmZ1bmM6YGZtZW51bWVyYXRlYC4KIAogCiAuLiBmdW5jdGlvbjo6IHByc3RyKHN0cmluZykKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2ZubWF0Y2gucnN0IGIvRG9jL2xpYnJhcnkvZm5tYXRjaC5yc3QKaW5kZXggNDkxMTk4MC4uYjE0YzU1MSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZm5tYXRjaC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZm5tYXRjaC5yc3QKQEAgLTI5LDYgKzI5LDkgQEAKIHwgYGBbIXNlcV1gYCB8IG1hdGNoZXMgYW55IGNoYXJhY3RlciBub3QgaW4gKnNlcSogfAogKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAKK0ZvciBhIGxpdGVyYWwgbWF0Y2gsIHdyYXAgdGhlIG1ldGEtY2hhcmFjdGVycyBpbiBicmFja2V0cy4KK0ZvciBleGFtcGxlLCBgYCdbP10nYGAgbWF0Y2hlcyB0aGUgY2hhcmFjdGVyIGBgJz8nYGAuCisKIC4uIGluZGV4OjogbW9kdWxlOiBnbG9iCiAKIE5vdGUgdGhhdCB0aGUgZmlsZW5hbWUgc2VwYXJhdG9yIChgYCcvJ2BgIG9uIFVuaXgpIGlzICpub3QqIHNwZWNpYWwgdG8gdGhpcwpAQCAtNzYsOCArNzksNiBAQAogCiAgICBSZXR1cm4gdGhlIHNoZWxsLXN0eWxlICpwYXR0ZXJuKiBjb252ZXJ0ZWQgdG8gYSByZWd1bGFyIGV4cHJlc3Npb24uCiAKLSAgIEJlIGF3YXJlIHRoZXJlIGlzIG5vIHdheSB0byBxdW90ZSBtZXRhLWNoYXJhY3RlcnMuCi0KICAgIEV4YW1wbGU6CiAKICAgICAgID4+PiBpbXBvcnQgZm5tYXRjaCwgcmUKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2Zvcm1hdHRlci5yc3QgYi9Eb2MvbGlicmFyeS9mb3JtYXR0ZXIucnN0CmluZGV4IGJhMDliOGUuLmU2OTZmZWMgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2Zvcm1hdHRlci5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZm9ybWF0dGVyLnJzdApAQCAtMzQxLDEwICszNDEsMTAgQEAKICAgIG91dHB1dC4KIAogCi0uLiBjbGFzczo6IER1bWJXcml0ZXIoW2ZpbGVbLCBtYXhjb2w9NzJdXSkKKy4uIGNsYXNzOjogRHVtYldyaXRlcihmaWxlPU5vbmUsIG1heGNvbD03MikKIAogICAgU2ltcGxlIHdyaXRlciBjbGFzcyB3aGljaCB3cml0ZXMgb3V0cHV0IG9uIHRoZSBmaWxlIG9iamVjdCBwYXNzZWQgaW4gYXMgKmZpbGUqCi0gICBvciwgaWYgKmZpbGUqIGlzIG9taXR0ZWQsIG9uIHN0YW5kYXJkIG91dHB1dC4gIFRoZSBvdXRwdXQgaXMgc2ltcGx5IHdvcmQtd3JhcHBlZAorICAgb3IsIGlmICpmaWxlKiBpcyBOb25lLCBvbiBzdGFuZGFyZCBvdXRwdXQuICBUaGUgb3V0cHV0IGlzIHNpbXBseSB3b3JkLXdyYXBwZWQKICAgIHRvIHRoZSBudW1iZXIgb2YgY29sdW1ucyBzcGVjaWZpZWQgYnkgKm1heGNvbCouICBUaGlzIGNsYXNzIGlzIHN1aXRhYmxlIGZvcgogICAgcmVmbG93aW5nIGEgc2VxdWVuY2Ugb2YgcGFyYWdyYXBocy4KIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZnBlY3RsLnJzdCBiL0RvYy9saWJyYXJ5L2ZwZWN0bC5yc3QKaW5kZXggZWYwMzBmMC4uOGNhNjcxYiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZnBlY3RsLnJzdAorKysgYi9Eb2MvbGlicmFyeS9mcGVjdGwucnN0CkBAIC0xMTMsOCArMTEzLDggQEAKIC4uIHNlZWFsc286OgogCiAgICBTb21lIGZpbGVzIGluIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uIG1heSBiZSBpbnRlcmVzdGluZyBpbiBsZWFybmluZyBtb3JlIGFib3V0Ci0gICBob3cgdGhpcyBtb2R1bGUgb3BlcmF0ZXMuIFRoZSBpbmNsdWRlIGZpbGUgOmZpbGU6YEluY2x1ZGUvcHlmcGUuaGAgZGlzY3Vzc2VzIHRoZQotICAgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtb2R1bGUgYXQgc29tZSBsZW5ndGguIDpmaWxlOmBNb2R1bGVzL2ZwZXRlc3Rtb2R1bGUuY2AKKyAgIGhvdyB0aGlzIG1vZHVsZSBvcGVyYXRlcy4gVGhlIGluY2x1ZGUgZmlsZSA6c291cmNlOmBJbmNsdWRlL3B5ZnBlLmhgIGRpc2N1c3NlcyB0aGUKKyAgIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbW9kdWxlIGF0IHNvbWUgbGVuZ3RoLiA6c291cmNlOmBNb2R1bGVzL2ZwZXRlc3Rtb2R1bGUuY2AKICAgIGdpdmVzIHNldmVyYWwgZXhhbXBsZXMgb2YgdXNlLiBNYW55IGFkZGl0aW9uYWwgZXhhbXBsZXMgY2FuIGJlIGZvdW5kIGluCi0gICA6ZmlsZTpgT2JqZWN0cy9mbG9hdG9iamVjdC5jYC4KKyAgIDpzb3VyY2U6YE9iamVjdHMvZmxvYXRvYmplY3QuY2AuCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2ZwZm9ybWF0LnJzdCBiL0RvYy9saWJyYXJ5L2ZwZm9ybWF0LnJzdAppbmRleCAzNDQ4NTg1Li4xNzEzMzAxIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9mcGZvcm1hdC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZnBmb3JtYXQucnN0CkBAIC03LDcgKzcsNyBAQAogICAgOmRlcHJlY2F0ZWQ6CiAKIC4uIGRlcHJlY2F0ZWQ6OiAyLjYKLSAgICBUaGUgOm1vZDpgZnBmb3JtYXRgIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLjAuCisgICAgVGhlIDptb2Q6YGZwZm9ybWF0YCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4KIAogLi4gc2VjdGlvbmF1dGhvcjo6IE1vc2hlIFphZGthIDxtb3NoZXpAemFka2Euc2l0ZS5jby5pbD4KIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZnJhY3Rpb25zLnJzdCBiL0RvYy9saWJyYXJ5L2ZyYWN0aW9ucy5yc3QKaW5kZXggNGQxMGNiZC4uODFiNDE5ZSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZnJhY3Rpb25zLnJzdAorKysgYi9Eb2MvbGlicmFyeS9mcmFjdGlvbnMucnN0CkBAIC01Nyw3ICs1Nyw2IEBACiAgICAgICBGcmFjdGlvbigwLCAxKQogICAgICAgPj4+IEZyYWN0aW9uKCczLzcnKQogICAgICAgRnJhY3Rpb24oMywgNykKLSAgICAgIFs0MDc5NCByZWZzXQogICAgICAgPj4+IEZyYWN0aW9uKCcgLTMvNyAnKQogICAgICAgRnJhY3Rpb24oLTMsIDcpCiAgICAgICA+Pj4gRnJhY3Rpb24oJzEuNDE0MjEzIFx0XG4nKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZnRwbGliLnJzdCBiL0RvYy9saWJyYXJ5L2Z0cGxpYi5yc3QKaW5kZXggYjhmNWI0ZS4uYjQyY2Y2NCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZnRwbGliLnJzdAorKysgYi9Eb2MvbGlicmFyeS9mdHBsaWIucnN0CkBAIC0yMywxNiArMjMsMTcgQEAKIEhlcmUncyBhIHNhbXBsZSBzZXNzaW9uIHVzaW5nIHRoZSA6bW9kOmBmdHBsaWJgIG1vZHVsZTo6CiAKICAgID4+PiBmcm9tIGZ0cGxpYiBpbXBvcnQgRlRQCi0gICA+Pj4gZnRwID0gRlRQKCdmdHAuY3dpLm5sJykgICAjIGNvbm5lY3QgdG8gaG9zdCwgZGVmYXVsdCBwb3J0Ci0gICA+Pj4gZnRwLmxvZ2luKCkgICAgICAgICAgICAgICAjIHVzZXIgYW5vbnltb3VzLCBwYXNzd2QgYW5vbnltb3VzQAotICAgPj4+IGZ0cC5yZXRybGluZXMoJ0xJU1QnKSAgICAgIyBsaXN0IGRpcmVjdG9yeSBjb250ZW50cwotICAgdG90YWwgMjQ0MTgKLSAgIGRyd3hyd3NyLXggICA1IGZ0cC11c3IgIHBkbWFpbnQgICAgIDE1MzYgTWFyIDIwIDA5OjQ4IC4KLSAgIGRyLXhyLXNyd3QgMTA1IGZ0cC11c3IgIHBkbWFpbnQgICAgIDE1MzYgTWFyIDIxIDE0OjMyIC4uCi0gICAtcnctci0tci0tICAgMSBmdHAtdXNyICBwZG1haW50ICAgICA1MzA1IE1hciAyMCAwOTo0OCBJTkRFWAotICAgIC4KLSAgICAuCi0gICAgLgorICAgPj4+IGZ0cCA9IEZUUCgnZnRwLmRlYmlhbi5vcmcnKSAgICAgIyBjb25uZWN0IHRvIGhvc3QsIGRlZmF1bHQgcG9ydAorICAgPj4+IGZ0cC5sb2dpbigpICAgICAgICAgICAgICAgICAgICAgIyB1c2VyIGFub255bW91cywgcGFzc3dkIGFub255bW91c0AKKyAgICcyMzAgTG9naW4gc3VjY2Vzc2Z1bC4nCisgICA+Pj4gZnRwLmN3ZCgnZGViaWFuJykgICAgICAgICAgICAgICAjIGNoYW5nZSBpbnRvICJkZWJpYW4iIGRpcmVjdG9yeQorICAgPj4+IGZ0cC5yZXRybGluZXMoJ0xJU1QnKSAgICAgICAgICAgIyBsaXN0IGRpcmVjdG9yeSBjb250ZW50cworICAgLXJ3LXJ3LXItLSAgICAxIDExNzYgICAgIDExNzYgICAgICAgICAxMDYzIEp1biAxNSAxMDoxOCBSRUFETUUKKyAgIC4uLgorICAgZHJ3eHItc3IteCAgICA1IDExNzYgICAgIDExNzYgICAgICAgICA0MDk2IERlYyAxOSAgMjAwMCBwb29sCisgICBkcnd4ci1zci14ICAgIDQgMTE3NiAgICAgMTE3NiAgICAgICAgIDQwOTYgTm92IDE3ICAyMDA4IHByb2plY3QKKyAgIGRyd3hyLXhyLXggICAgMyAxMTc2ICAgICAxMTc2ICAgICAgICAgNDA5NiBPY3QgMTAgIDIwMTIgdG9vbHMKKyAgICcyMjYgRGlyZWN0b3J5IHNlbmQgT0suJwogICAgPj4+IGZ0cC5yZXRyYmluYXJ5KCdSRVRSIFJFQURNRScsIG9wZW4oJ1JFQURNRScsICd3YicpLndyaXRlKQogICAgJzIyNiBUcmFuc2ZlciBjb21wbGV0ZS4nCiAgICA+Pj4gZnRwLnF1aXQoKQpAQCAtMjY0LDggKzI2NSw4IEBACiAKICAgIFN0b3JlIGEgZmlsZSBpbiBBU0NJSSB0cmFuc2ZlciBtb2RlLiAgKmNvbW1hbmQqIHNob3VsZCBiZSBhbiBhcHByb3ByaWF0ZQogICAgYGBTVE9SYGAgY29tbWFuZCAoc2VlIDptZXRoOmBzdG9yYmluYXJ5YCkuICBMaW5lcyBhcmUgcmVhZCB1bnRpbCBFT0YgZnJvbSB0aGUKLSAgIG9wZW4gZmlsZSBvYmplY3QgKmZpbGUqIHVzaW5nIGl0cyA6bWV0aDpgcmVhZGxpbmVgIG1ldGhvZCB0byBwcm92aWRlIHRoZSBkYXRhIHRvCi0gICBiZSBzdG9yZWQuICAqY2FsbGJhY2sqIGlzIGFuIG9wdGlvbmFsIHNpbmdsZSBwYXJhbWV0ZXIgY2FsbGFibGUKKyAgIG9wZW4gZmlsZSBvYmplY3QgKmZpbGUqIHVzaW5nIGl0cyA6bWV0aDpgfmZpbGUucmVhZGxpbmVgIG1ldGhvZCB0byBwcm92aWRlCisgICB0aGUgZGF0YSB0byBiZSBzdG9yZWQuICAqY2FsbGJhY2sqIGlzIGFuIG9wdGlvbmFsIHNpbmdsZSBwYXJhbWV0ZXIgY2FsbGFibGUKICAgIHRoYXQgaXMgY2FsbGVkIG9uIGVhY2ggbGluZSBhZnRlciBpdCBpcyBzZW50LgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNgpAQCAtMzcwLDEwICszNzEsMTAgQEAKIC4uIG1ldGhvZDo6IEZUUC5jbG9zZSgpCiAKICAgIENsb3NlIHRoZSBjb25uZWN0aW9uIHVuaWxhdGVyYWxseS4gIFRoaXMgc2hvdWxkIG5vdCBiZSBhcHBsaWVkIHRvIGFuIGFscmVhZHkKLSAgIGNsb3NlZCBjb25uZWN0aW9uIHN1Y2ggYXMgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwgdG8gOm1ldGg6YHF1aXRgLiAgQWZ0ZXIgdGhpcwotICAgY2FsbCB0aGUgOmNsYXNzOmBGVFBgIGluc3RhbmNlIHNob3VsZCBub3QgYmUgdXNlZCBhbnkgbW9yZSAoYWZ0ZXIgYSBjYWxsIHRvCi0gICA6bWV0aDpgY2xvc2VgIG9yIDptZXRoOmBxdWl0YCB5b3UgY2Fubm90IHJlb3BlbiB0aGUgY29ubmVjdGlvbiBieSBpc3N1aW5nCi0gICBhbm90aGVyIDptZXRoOmBsb2dpbmAgbWV0aG9kKS4KKyAgIGNsb3NlZCBjb25uZWN0aW9uIHN1Y2ggYXMgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwgdG8gOm1ldGg6YH5GVFAucXVpdGAuCisgICBBZnRlciB0aGlzIGNhbGwgdGhlIDpjbGFzczpgRlRQYCBpbnN0YW5jZSBzaG91bGQgbm90IGJlIHVzZWQgYW55IG1vcmUgKGFmdGVyCisgICBhIGNhbGwgdG8gOm1ldGg6YGNsb3NlYCBvciA6bWV0aDpgfkZUUC5xdWl0YCB5b3UgY2Fubm90IHJlb3BlbiB0aGUKKyAgIGNvbm5lY3Rpb24gYnkgaXNzdWluZyBhbm90aGVyIDptZXRoOmBsb2dpbmAgbWV0aG9kKS4KIAogCiBGVFBfVExTIE9iamVjdHMKQEAgLTM4Nyw3ICszODgsOCBAQAogCiAuLiBtZXRob2Q6OiBGVFBfVExTLmF1dGgoKQogCi0gICBTZXQgdXAgc2VjdXJlIGNvbnRyb2wgY29ubmVjdGlvbiBieSB1c2luZyBUTFMgb3IgU1NMLCBkZXBlbmRpbmcgb24gd2hhdCBzcGVjaWZpZWQgaW4gOm1ldGg6YHNzbF92ZXJzaW9uYCBhdHRyaWJ1dGUuCisgICBTZXQgdXAgc2VjdXJlIGNvbnRyb2wgY29ubmVjdGlvbiBieSB1c2luZyBUTFMgb3IgU1NMLCBkZXBlbmRpbmcgb24gd2hhdAorICAgc3BlY2lmaWVkIGluIDptZXRoOmBzc2xfdmVyc2lvbmAgYXR0cmlidXRlLgogCiAuLiBtZXRob2Q6OiBGVFBfVExTLnByb3RfcCgpCiAKQEAgLTM5Niw1ICszOTgsMyBAQAogLi4gbWV0aG9kOjogRlRQX1RMUy5wcm90X2MoKQogCiAgICBTZXQgdXAgY2xlYXIgdGV4dCBkYXRhIGNvbm5lY3Rpb24uCi0KLQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZnVuY3Rpb25zLnJzdCBiL0RvYy9saWJyYXJ5L2Z1bmN0aW9ucy5yc3QKaW5kZXggNjlmNWQ2NC4uMDY2N2VjNSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZnVuY3Rpb25zLnJzdAorKysgYi9Eb2MvbGlicmFyeS9mdW5jdGlvbnMucnN0CkBAIC0xOCwxNiArMTgsMjYgQEAKIDpmdW5jOmBib29sYCAgICAgICAgIDpmdW5jOmBmaWx0ZXJgICAgICA6ZnVuYzpgbGVuYCAgICAgICAgIDpmdW5jOmByYW5nZWAgICAgICA6ZnVuYzpgdHlwZWAKIDpmdW5jOmBieXRlYXJyYXlgICAgIDpmdW5jOmBmbG9hdGAgICAgICA6ZnVuYzpgbGlzdGAgICAgICAgIDpmdW5jOmByYXdfaW5wdXRgICA6ZnVuYzpgdW5pY2hyYAogOmZ1bmM6YGNhbGxhYmxlYCAgICAgOmZ1bmM6YGZvcm1hdGAgICAgIDpmdW5jOmBsb2NhbHNgICAgICAgOmZ1bmM6YHJlZHVjZWAgICAgIDpmdW5jOmB1bmljb2RlYAotOmZ1bmM6YGNocmAgICAgICAgICAgOmZ1bmM6YGZyb3plbnNldGAgIDpmdW5jOmBsb25nYCAgICAgICAgOmZ1bmM6YHJlbG9hZGAgICAgIDpmdW5jOmB2YXJzYAotOmZ1bmM6YGNsYXNzbWV0aG9kYCAgOmZ1bmM6YGdldGF0dHJgICAgIDpmdW5jOmBtYXBgICAgICAgICAgOmZ1bmM6YHJlcHJgICAgICAgIDpmdW5jOmB4cmFuZ2VgCis6ZnVuYzpgY2hyYCAgICAgICAgICB8ZnVuYy1mcm96ZW5zZXR8XyAgOmZ1bmM6YGxvbmdgICAgICAgICA6ZnVuYzpgcmVsb2FkYCAgICAgOmZ1bmM6YHZhcnNgCis6ZnVuYzpgY2xhc3NtZXRob2RgICA6ZnVuYzpgZ2V0YXR0cmAgICAgOmZ1bmM6YG1hcGAgICAgICAgICB8ZnVuYy1yZXByfF8gICAgICAgOmZ1bmM6YHhyYW5nZWAKIDpmdW5jOmBjbXBgICAgICAgICAgIDpmdW5jOmBnbG9iYWxzYCAgICA6ZnVuYzpgbWF4YCAgICAgICAgIDpmdW5jOmByZXZlcnNlZGAgICA6ZnVuYzpgemlwYAotOmZ1bmM6YGNvbXBpbGVgICAgICAgOmZ1bmM6YGhhc2F0dHJgICAgIDpmdW5jOmBtZW1vcnl2aWV3YCAgOmZ1bmM6YHJvdW5kYCAgICAgIDpmdW5jOmBfX2ltcG9ydF9fYAotOmZ1bmM6YGNvbXBsZXhgICAgICAgOmZ1bmM6YGhhc2hgICAgICAgIDpmdW5jOmBtaW5gICAgICAgICAgOmZ1bmM6YHNldGAgICAgICAgIDpmdW5jOmBhcHBseWAKKzpmdW5jOmBjb21waWxlYCAgICAgIDpmdW5jOmBoYXNhdHRyYCAgICB8ZnVuYy1tZW1vcnl2aWV3fF8gIDpmdW5jOmByb3VuZGAgICAgICA6ZnVuYzpgX19pbXBvcnRfX2AKKzpmdW5jOmBjb21wbGV4YCAgICAgIDpmdW5jOmBoYXNoYCAgICAgICA6ZnVuYzpgbWluYCAgICAgICAgIHxmdW5jLXNldHxfICAgICAgICA6ZnVuYzpgYXBwbHlgCiA6ZnVuYzpgZGVsYXR0cmAgICAgICA6ZnVuYzpgaGVscGAgICAgICAgOmZ1bmM6YG5leHRgICAgICAgICA6ZnVuYzpgc2V0YXR0cmAgICAgOmZ1bmM6YGJ1ZmZlcmAKLTpmdW5jOmBkaWN0YCAgICAgICAgIDpmdW5jOmBoZXhgICAgICAgICA6ZnVuYzpgb2JqZWN0YCAgICAgIDpmdW5jOmBzbGljZWAgICAgICA6ZnVuYzpgY29lcmNlYAorfGZ1bmMtZGljdHxfICAgICAgICAgOmZ1bmM6YGhleGAgICAgICAgIDpmdW5jOmBvYmplY3RgICAgICAgOmZ1bmM6YHNsaWNlYCAgICAgIDpmdW5jOmBjb2VyY2VgCiA6ZnVuYzpgZGlyYCAgICAgICAgICA6ZnVuYzpgaWRgICAgICAgICAgOmZ1bmM6YG9jdGAgICAgICAgICA6ZnVuYzpgc29ydGVkYCAgICAgOmZ1bmM6YGludGVybmAKID09PT09PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PQogCisuLiB1c2luZyA6ZnVuYzpgZGljdGAgd291bGQgY3JlYXRlIGEgbGluayB0byBhbm90aGVyIHBhZ2UsIHNvIGxvY2FsIHRhcmdldHMgYXJlCisgICB1c2VkLCB3aXRoIHJlcGxhY2VtZW50IHRleHRzIHRvIG1ha2UgdGhlIG91dHB1dCBpbiB0aGUgdGFibGUgY29uc2lzdGVudAorCisuLiB8ZnVuYy1kaWN0fCByZXBsYWNlOjogYGBkaWN0KClgYAorLi4gfGZ1bmMtZnJvemVuc2V0fCByZXBsYWNlOjogYGBmcm96ZW5zZXQoKWBgCisuLiB8ZnVuYy1tZW1vcnl2aWV3fCByZXBsYWNlOjogYGBtZW1vcnl2aWV3KClgYAorLi4gfGZ1bmMtcmVwcnwgcmVwbGFjZTo6IGBgcmVwcigpYGAKKy4uIHxmdW5jLXNldHwgcmVwbGFjZTo6IGBgc2V0KClgYAorCisKIC4uIGZ1bmN0aW9uOjogYWJzKHgpCiAKICAgIFJldHVybiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgYSBudW1iZXIuICBUaGUgYXJndW1lbnQgbWF5IGJlIGEgcGxhaW4gb3IgbG9uZwpAQCAtMzcsNyArNDcsNyBAQAogCiAuLiBmdW5jdGlvbjo6IGFsbChpdGVyYWJsZSkKIAotICAgUmV0dXJuIFRydWUgaWYgYWxsIGVsZW1lbnRzIG9mIHRoZSAqaXRlcmFibGUqIGFyZSB0cnVlIChvciBpZiB0aGUgaXRlcmFibGUKKyAgIFJldHVybiBgYFRydWVgYCBpZiBhbGwgZWxlbWVudHMgb2YgdGhlICppdGVyYWJsZSogYXJlIHRydWUgKG9yIGlmIHRoZSBpdGVyYWJsZQogICAgaXMgZW1wdHkpLiAgRXF1aXZhbGVudCB0bzo6CiAKICAgICAgIGRlZiBhbGwoaXRlcmFibGUpOgpAQCAtNTEsOCArNjEsOCBAQAogCiAuLiBmdW5jdGlvbjo6IGFueShpdGVyYWJsZSkKIAotICAgUmV0dXJuIFRydWUgaWYgYW55IGVsZW1lbnQgb2YgdGhlICppdGVyYWJsZSogaXMgdHJ1ZS4gIElmIHRoZSBpdGVyYWJsZQotICAgaXMgZW1wdHksIHJldHVybiBGYWxzZS4gIEVxdWl2YWxlbnQgdG86OgorICAgUmV0dXJuIGBgVHJ1ZWBgIGlmIGFueSBlbGVtZW50IG9mIHRoZSAqaXRlcmFibGUqIGlzIHRydWUuICBJZiB0aGUgaXRlcmFibGUKKyAgIGlzIGVtcHR5LCByZXR1cm4gYGBGYWxzZWBgLiAgRXF1aXZhbGVudCB0bzo6CiAKICAgICAgIGRlZiBhbnkoaXRlcmFibGUpOgogICAgICAgICAgIGZvciBlbGVtZW50IGluIGl0ZXJhYmxlOgpAQCAtMTUzLDkgKzE2MywxMCBAQAogICAgaW5zdGFuY2UgbWV0aG9kIHJlY2VpdmVzIHRoZSBpbnN0YW5jZS4gVG8gZGVjbGFyZSBhIGNsYXNzIG1ldGhvZCwgdXNlIHRoaXMKICAgIGlkaW9tOjoKIAotICAgICAgY2xhc3MgQzoKKyAgICAgIGNsYXNzIEMob2JqZWN0KToKICAgICAgICAgICBAY2xhc3NtZXRob2QKLSAgICAgICAgICBkZWYgZihjbHMsIGFyZzEsIGFyZzIsIC4uLik6IC4uLgorICAgICAgICAgIGRlZiBmKGNscywgYXJnMSwgYXJnMiwgLi4uKToKKyAgICAgICAgICAgICAgLi4uCiAKICAgIFRoZSBgYEBjbGFzc21ldGhvZGBgIGZvcm0gaXMgYSBmdW5jdGlvbiA6dGVybTpgZGVjb3JhdG9yYCAtLSBzZWUgdGhlIGRlc2NyaXB0aW9uCiAgICBvZiBmdW5jdGlvbiBkZWZpbml0aW9ucyBpbiA6cmVmOmBmdW5jdGlvbmAgZm9yIGRldGFpbHMuCkBAIC0xODgsOCArMTk5LDEwIEBACiAKICAgIENvbXBpbGUgdGhlICpzb3VyY2UqIGludG8gYSBjb2RlIG9yIEFTVCBvYmplY3QuICBDb2RlIG9iamVjdHMgY2FuIGJlIGV4ZWN1dGVkCiAgICBieSBhbiA6a2V5d29yZDpgZXhlY2Agc3RhdGVtZW50IG9yIGV2YWx1YXRlZCBieSBhIGNhbGwgdG8gOmZ1bmM6YGV2YWxgLgotICAgKnNvdXJjZSogY2FuIGVpdGhlciBiZSBhIHN0cmluZyBvciBhbiBBU1Qgb2JqZWN0LiAgUmVmZXIgdG8gdGhlIDptb2Q6YGFzdGAKLSAgIG1vZHVsZSBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gd29yayB3aXRoIEFTVCBvYmplY3RzLgorICAgKnNvdXJjZSogY2FuIGVpdGhlciBiZSBhIFVuaWNvZGUgc3RyaW5nLCBhICpMYXRpbi0xKiBlbmNvZGVkIHN0cmluZyBvciBhbgorICAgQVNUIG9iamVjdC4KKyAgIFJlZmVyIHRvIHRoZSA6bW9kOmBhc3RgIG1vZHVsZSBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gd29yaworICAgd2l0aCBBU1Qgb2JqZWN0cy4KIAogICAgVGhlICpmaWxlbmFtZSogYXJndW1lbnQgc2hvdWxkIGdpdmUgdGhlIGZpbGUgZnJvbSB3aGljaCB0aGUgY29kZSB3YXMgcmVhZDsKICAgIHBhc3Mgc29tZSByZWNvZ25pemFibGUgdmFsdWUgaWYgaXQgd2Fzbid0IHJlYWQgZnJvbSBhIGZpbGUgKGBgJzxzdHJpbmc+J2BgIGlzCkBAIC0yMTMsOCArMjI2LDggQEAKIAogICAgRnV0dXJlIHN0YXRlbWVudHMgYXJlIHNwZWNpZmllZCBieSBiaXRzIHdoaWNoIGNhbiBiZSBiaXR3aXNlIE9SZWQgdG9nZXRoZXIgdG8KICAgIHNwZWNpZnkgbXVsdGlwbGUgc3RhdGVtZW50cy4gIFRoZSBiaXRmaWVsZCByZXF1aXJlZCB0byBzcGVjaWZ5IGEgZ2l2ZW4gZmVhdHVyZQotICAgY2FuIGJlIGZvdW5kIGFzIHRoZSA6YXR0cjpgY29tcGlsZXJfZmxhZ2AgYXR0cmlidXRlIG9uIHRoZSA6Y2xhc3M6YF9GZWF0dXJlYAotICAgaW5zdGFuY2UgaW4gdGhlIDptb2Q6YF9fZnV0dXJlX19gIG1vZHVsZS4KKyAgIGNhbiBiZSBmb3VuZCBhcyB0aGUgOmF0dHI6YH5fX2Z1dHVyZV9fLl9GZWF0dXJlLmNvbXBpbGVyX2ZsYWdgIGF0dHJpYnV0ZSBvbgorICAgdGhlIDpjbGFzczpgfl9fZnV0dXJlX18uX0ZlYXR1cmVgIGluc3RhbmNlIGluIHRoZSA6bW9kOmBfX2Z1dHVyZV9fYCBtb2R1bGUuCiAKICAgIFRoaXMgZnVuY3Rpb24gcmFpc2VzIDpleGM6YFN5bnRheEVycm9yYCBpZiB0aGUgY29tcGlsZWQgc291cmNlIGlzIGludmFsaWQsCiAgICBhbmQgOmV4YzpgVHlwZUVycm9yYCBpZiB0aGUgc291cmNlIGNvbnRhaW5zIG51bGwgYnl0ZXMuCkBAIC0yNDcsNiArMjYwLDEzIEBACiAgICB0aGUgZnVuY3Rpb24gc2VydmVzIGFzIGEgbnVtZXJpYyBjb252ZXJzaW9uIGZ1bmN0aW9uIGxpa2UgOmZ1bmM6YGludGAsCiAgICA6ZnVuYzpgbG9uZ2AgYW5kIDpmdW5jOmBmbG9hdGAuICBJZiBib3RoIGFyZ3VtZW50cyBhcmUgb21pdHRlZCwgcmV0dXJucyBgYDBqYGAuCiAKKyAgIC4uIG5vdGU6OgorCisgICAgICBXaGVuIGNvbnZlcnRpbmcgZnJvbSBhIHN0cmluZywgdGhlIHN0cmluZyBtdXN0IG5vdCBjb250YWluIHdoaXRlc3BhY2UKKyAgICAgIGFyb3VuZCB0aGUgY2VudHJhbCBgYCtgYCBvciBgYC1gYCBvcGVyYXRvci4gIEZvciBleGFtcGxlLAorICAgICAgYGBjb21wbGV4KCcxKzJqJylgYCBpcyBmaW5lLCBidXQgYGBjb21wbGV4KCcxICsgMmonKWBgIHJhaXNlcworICAgICAgOmV4YzpgVmFsdWVFcnJvcmAuCisKICAgIFRoZSBjb21wbGV4IHR5cGUgaXMgZGVzY3JpYmVkIGluIDpyZWY6YHR5cGVzbnVtZXJpY2AuCiAKIApAQCAtMjU4LDE0ICsyNzgsMTggQEAKICAgIGV4YW1wbGUsIGBgZGVsYXR0cih4LCAnZm9vYmFyJylgYCBpcyBlcXVpdmFsZW50IHRvIGBgZGVsIHguZm9vYmFyYGAuCiAKIAotLi4gZnVuY3Rpb246OiBkaWN0KFthcmddKQorLi4gX2Z1bmMtZGljdDoKKy4uIGZ1bmN0aW9uOjogZGljdCgqKmt3YXJnKQorICAgICAgICAgICAgICBkaWN0KG1hcHBpbmcsICoqa3dhcmcpCisgICAgICAgICAgICAgIGRpY3QoaXRlcmFibGUsICoqa3dhcmcpCiAgICA6bm9pbmRleDoKIAotICAgQ3JlYXRlIGEgbmV3IGRhdGEgZGljdGlvbmFyeSwgb3B0aW9uYWxseSB3aXRoIGl0ZW1zIHRha2VuIGZyb20gKmFyZyouCi0gICBUaGUgZGljdGlvbmFyeSB0eXBlIGlzIGRlc2NyaWJlZCBpbiA6cmVmOmB0eXBlc21hcHBpbmdgLgorICAgQ3JlYXRlIGEgbmV3IGRpY3Rpb25hcnkuICBUaGUgOmNsYXNzOmBkaWN0YCBvYmplY3QgaXMgdGhlIGRpY3Rpb25hcnkgY2xhc3MuCisgICBTZWUgOmNsYXNzOmBkaWN0YCBhbmQgOnJlZjpgdHlwZXNtYXBwaW5nYCBmb3IgZG9jdW1lbnRhdGlvbiBhYm91dCB0aGlzCisgICBjbGFzcy4KIAotICAgRm9yIG90aGVyIGNvbnRhaW5lcnMgc2VlIHRoZSBidWlsdCBpbiA6Y2xhc3M6YGxpc3RgLCA6Y2xhc3M6YHNldGAsIGFuZAotICAgOmNsYXNzOmB0dXBsZWAgY2xhc3NlcywgYW5kIHRoZSA6bW9kOmBjb2xsZWN0aW9uc2AgbW9kdWxlLgorICAgRm9yIG90aGVyIGNvbnRhaW5lcnMgc2VlIHRoZSBidWlsdC1pbiA6Y2xhc3M6YGxpc3RgLCA6Y2xhc3M6YHNldGAsIGFuZAorICAgOmNsYXNzOmB0dXBsZWAgY2xhc3NlcywgYXMgd2VsbCBhcyB0aGUgOm1vZDpgY29sbGVjdGlvbnNgIG1vZHVsZS4KIAogCiAuLiBmdW5jdGlvbjo6IGRpcihbb2JqZWN0XSkKQEAgLTMzNyw3ICszNjEsNyBAQAogICAgICAgVXNpbmcgOmZ1bmM6YGRpdm1vZGAgd2l0aCBjb21wbGV4IG51bWJlcnMgaXMgZGVwcmVjYXRlZC4KIAogCi0uLiBmdW5jdGlvbjo6IGVudW1lcmF0ZShzZXF1ZW5jZVssIHN0YXJ0PTBdKQorLi4gZnVuY3Rpb246OiBlbnVtZXJhdGUoc2VxdWVuY2UsIHN0YXJ0PTApCiAKICAgIFJldHVybiBhbiBlbnVtZXJhdGUgb2JqZWN0LiAqc2VxdWVuY2UqIG11c3QgYmUgYSBzZXF1ZW5jZSwgYW4KICAgIDp0ZXJtOmBpdGVyYXRvcmAsIG9yIHNvbWUgb3RoZXIgb2JqZWN0IHdoaWNoIHN1cHBvcnRzIGl0ZXJhdGlvbi4gIFRoZQpAQCAtMzY2LDkgKzM5MCw5IEBACiAKIC4uIGZ1bmN0aW9uOjogZXZhbChleHByZXNzaW9uWywgZ2xvYmFsc1ssIGxvY2Fsc11dKQogCi0gICBUaGUgYXJndW1lbnRzIGFyZSBhIHN0cmluZyBhbmQgb3B0aW9uYWwgZ2xvYmFscyBhbmQgbG9jYWxzLiAgSWYgcHJvdmlkZWQsCi0gICAqZ2xvYmFscyogbXVzdCBiZSBhIGRpY3Rpb25hcnkuICBJZiBwcm92aWRlZCwgKmxvY2FscyogY2FuIGJlIGFueSBtYXBwaW5nCi0gICBvYmplY3QuCisgICBUaGUgYXJndW1lbnRzIGFyZSBhIFVuaWNvZGUgb3IgKkxhdGluLTEqIGVuY29kZWQgc3RyaW5nIGFuZCBvcHRpb25hbAorICAgZ2xvYmFscyBhbmQgbG9jYWxzLiAgSWYgcHJvdmlkZWQsICpnbG9iYWxzKiBtdXN0IGJlIGEgZGljdGlvbmFyeS4KKyAgIElmIHByb3ZpZGVkLCAqbG9jYWxzKiBjYW4gYmUgYW55IG1hcHBpbmcgb2JqZWN0LgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNAogICAgICAgZm9ybWVybHkgKmxvY2Fscyogd2FzIHJlcXVpcmVkIHRvIGJlIGEgZGljdGlvbmFyeS4KQEAgLTQxMyw3ICs0MzcsMTAgQEAKICAgIFRoZSBhcmd1bWVudHMgYXJlIGEgZmlsZSBuYW1lIGFuZCB0d28gb3B0aW9uYWwgZGljdGlvbmFyaWVzLiAgVGhlIGZpbGUgaXMgcGFyc2VkCiAgICBhbmQgZXZhbHVhdGVkIGFzIGEgc2VxdWVuY2Ugb2YgUHl0aG9uIHN0YXRlbWVudHMgKHNpbWlsYXJseSB0byBhIG1vZHVsZSkgdXNpbmcKICAgIHRoZSAqZ2xvYmFscyogYW5kICpsb2NhbHMqIGRpY3Rpb25hcmllcyBhcyBnbG9iYWwgYW5kIGxvY2FsIG5hbWVzcGFjZS4gSWYKLSAgIHByb3ZpZGVkLCAqbG9jYWxzKiBjYW4gYmUgYW55IG1hcHBpbmcgb2JqZWN0LgorICAgcHJvdmlkZWQsICpsb2NhbHMqIGNhbiBiZSBhbnkgbWFwcGluZyBvYmplY3QuICBSZW1lbWJlciB0aGF0IGF0IG1vZHVsZSBsZXZlbCwKKyAgIGdsb2JhbHMgYW5kIGxvY2FscyBhcmUgdGhlIHNhbWUgZGljdGlvbmFyeS4gSWYgdHdvIHNlcGFyYXRlIG9iamVjdHMgYXJlCisgICBwYXNzZWQgYXMgKmdsb2JhbHMqIGFuZCAqbG9jYWxzKiwgdGhlIGNvZGUgd2lsbCBiZSBleGVjdXRlZCBhcyBpZiBpdCB3ZXJlCisgICBlbWJlZGRlZCBpbiBhIGNsYXNzIGRlZmluaXRpb24uCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi40CiAgICAgICBmb3JtZXJseSAqbG9jYWxzKiB3YXMgcmVxdWlyZWQgdG8gYmUgYSBkaWN0aW9uYXJ5LgpAQCAtNDMxLDcgKzQ1OCw3IEBACiAgICAgICB1c2VkIHJlbGlhYmx5IHRvIG1vZGlmeSBhIGZ1bmN0aW9uJ3MgbG9jYWxzLgogCiAKLS4uIGZ1bmN0aW9uOjogZmlsZShmaWxlbmFtZVssIG1vZGVbLCBidWZzaXplXV0pCisuLiBmdW5jdGlvbjo6IGZpbGUobmFtZVssIG1vZGVbLCBidWZmZXJpbmddXSkKIAogICAgQ29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIHRoZSA6Y2xhc3M6YGZpbGVgIHR5cGUsIGRlc2NyaWJlZCBmdXJ0aGVyIGluIHNlY3Rpb24KICAgIDpyZWY6YGJsdGluLWZpbGUtb2JqZWN0c2AuICBUaGUgY29uc3RydWN0b3IncyBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIHRob3NlCkBAIC01MDYsMTQgKzUzMywxNyBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi42CiAKIAorLi4gX2Z1bmMtZnJvemVuc2V0OgogLi4gZnVuY3Rpb246OiBmcm96ZW5zZXQoW2l0ZXJhYmxlXSkKICAgIDpub2luZGV4OgogCi0gICBSZXR1cm4gYSBmcm96ZW5zZXQgb2JqZWN0LCBvcHRpb25hbGx5IHdpdGggZWxlbWVudHMgdGFrZW4gZnJvbSAqaXRlcmFibGUqLgotICAgVGhlIGZyb3plbnNldCB0eXBlIGlzIGRlc2NyaWJlZCBpbiA6cmVmOmB0eXBlcy1zZXRgLgorICAgUmV0dXJuIGEgbmV3IDpjbGFzczpgZnJvemVuc2V0YCBvYmplY3QsIG9wdGlvbmFsbHkgd2l0aCBlbGVtZW50cyB0YWtlbiBmcm9tCisgICAqaXRlcmFibGUqLiAgYGBmcm96ZW5zZXRgYCBpcyBhIGJ1aWx0LWluIGNsYXNzLiAgU2VlIDpjbGFzczpgZnJvemVuc2V0YCBhbmQKKyAgIDpyZWY6YHR5cGVzLXNldGAgZm9yIGRvY3VtZW50YXRpb24gYWJvdXQgdGhpcyBjbGFzcy4KIAotICAgRm9yIG90aGVyIGNvbnRhaW5lcnMgc2VlIHRoZSBidWlsdCBpbiA6Y2xhc3M6YGRpY3RgLCA6Y2xhc3M6YGxpc3RgLCBhbmQKLSAgIDpjbGFzczpgdHVwbGVgIGNsYXNzZXMsIGFuZCB0aGUgOm1vZDpgY29sbGVjdGlvbnNgIG1vZHVsZS4KKyAgIEZvciBvdGhlciBjb250YWluZXJzIHNlZSB0aGUgYnVpbHQtaW4gOmNsYXNzOmBzZXRgLCA6Y2xhc3M6YGxpc3RgLAorICAgOmNsYXNzOmB0dXBsZWAsIGFuZCA6Y2xhc3M6YGRpY3RgIGNsYXNzZXMsIGFzIHdlbGwgYXMgdGhlIDptb2Q6YGNvbGxlY3Rpb25zYAorICAgbW9kdWxlLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjQKIApAQCAtNTY2LDggKzU5NiwyMSBAQAogCiAuLiBmdW5jdGlvbjo6IGhleCh4KQogCi0gICBDb252ZXJ0IGFuIGludGVnZXIgbnVtYmVyIChvZiBhbnkgc2l6ZSkgdG8gYSBoZXhhZGVjaW1hbCBzdHJpbmcuIFRoZSByZXN1bHQgaXMgYQotICAgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb24uCisgICBDb252ZXJ0IGFuIGludGVnZXIgbnVtYmVyIChvZiBhbnkgc2l6ZSkgdG8gYSBsb3dlcmNhc2UgaGV4YWRlY2ltYWwgc3RyaW5nCisgICBwcmVmaXhlZCB3aXRoICIweCIsIGZvciBleGFtcGxlOgorCisgICAgICA+Pj4gaGV4KDI1NSkKKyAgICAgICcweGZmJworICAgICAgPj4+IGhleCgtNDIpCisgICAgICAnLTB4MmEnCisgICAgICA+Pj4gaGV4KDFMKQorICAgICAgJzB4MUwnCisKKyAgIElmIHggaXMgbm90IGEgUHl0aG9uIDpjbGFzczpgaW50YCBvciA6Y2xhc3M6YGxvbmdgIG9iamVjdCwgaXQgaGFzIHRvCisgICBkZWZpbmUgYW4gX19pbmRleF9fKCkgbWV0aG9kIHRoYXQgcmV0dXJucyBhbiBpbnRlZ2VyLgorCisgICBTZWUgYWxzbyA6ZnVuYzpgaW50YCBmb3IgY29udmVydGluZyBhIGhleGFkZWNpbWFsIHN0cmluZyB0byBhbgorICAgaW50ZWdlciB1c2luZyBhIGJhc2Ugb2YgMTYuCiAKICAgIC4uIG5vdGU6OgogCkBAIC01OTIsMTIgKzYzNSw5IEBACiAKICAgIEVxdWl2YWxlbnQgdG8gYGBldmFsKHJhd19pbnB1dChwcm9tcHQpKWBgLgogCi0gICAuLiBub3RlOjoKLQotICAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjYXRjaCB1c2VyIGVycm9ycy4gIEl0IGV4cGVjdHMgYSB2YWxpZCBQeXRob24KLSAgICAgIGV4cHJlc3Npb24gYXMgaW5wdXQuIElmIHRoZSBpbnB1dCBpcyBub3Qgc3ludGFjdGljYWxseSB2YWxpZCwgYQotICAgICAgOmV4YzpgU3ludGF4RXJyb3JgIHdpbGwgYmUgcmFpc2VkLiBPdGhlciBleGNlcHRpb25zIG1heSBiZSByYWlzZWQgaWYgdGhlcmUKLSAgICAgIGlzIGFuIGVycm9yIGR1cmluZyBldmFsdWF0aW9uLgorICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjYXRjaCB1c2VyIGVycm9ycy4gSWYgdGhlIGlucHV0IGlzIG5vdCBzeW50YWN0aWNhbGx5CisgICB2YWxpZCwgYSA6ZXhjOmBTeW50YXhFcnJvcmAgd2lsbCBiZSByYWlzZWQuIE90aGVyIGV4Y2VwdGlvbnMgbWF5IGJlIHJhaXNlZCBpZgorICAgdGhlcmUgaXMgYW4gZXJyb3IgZHVyaW5nIGV2YWx1YXRpb24uCiAKICAgIElmIHRoZSA6bW9kOmByZWFkbGluZWAgbW9kdWxlIHdhcyBsb2FkZWQsIHRoZW4gOmZ1bmM6YGlucHV0YCB3aWxsIHVzZSBpdCB0bwogICAgcHJvdmlkZSBlbGFib3JhdGUgbGluZSBlZGl0aW5nIGFuZCBoaXN0b3J5IGZlYXR1cmVzLgpAQCAtNjA1LDIwICs2NDUsMjYgQEAKICAgIENvbnNpZGVyIHVzaW5nIHRoZSA6ZnVuYzpgcmF3X2lucHV0YCBmdW5jdGlvbiBmb3IgZ2VuZXJhbCBpbnB1dCBmcm9tIHVzZXJzLgogCiAKLS4uIGZ1bmN0aW9uOjogaW50KFt4WywgYmFzZV1dKQorLi4gZnVuY3Rpb246OiBpbnQoeD0wKQorICAgICAgICAgICAgICBpbnQoeCwgYmFzZT0xMCkKIAotICAgQ29udmVydCBhIHN0cmluZyBvciBudW1iZXIgdG8gYSBwbGFpbiBpbnRlZ2VyLiAgSWYgdGhlIGFyZ3VtZW50IGlzIGEgc3RyaW5nLAotICAgaXQgbXVzdCBjb250YWluIGEgcG9zc2libHkgc2lnbmVkIGRlY2ltYWwgbnVtYmVyIHJlcHJlc2VudGFibGUgYXMgYSBQeXRob24KLSAgIGludGVnZXIsIHBvc3NpYmx5IGVtYmVkZGVkIGluIHdoaXRlc3BhY2UuICBUaGUgKmJhc2UqIHBhcmFtZXRlciBnaXZlcyB0aGUKLSAgIGJhc2UgZm9yIHRoZSBjb252ZXJzaW9uICh3aGljaCBpcyAxMCBieSBkZWZhdWx0KSBhbmQgbWF5IGJlIGFueSBpbnRlZ2VyIGluCi0gICB0aGUgcmFuZ2UgWzIsIDM2XSwgb3IgemVyby4gIElmICpiYXNlKiBpcyB6ZXJvLCB0aGUgcHJvcGVyIHJhZGl4IGlzCi0gICBkZXRlcm1pbmVkIGJhc2VkIG9uIHRoZSBjb250ZW50cyBvZiBzdHJpbmc7IHRoZSBpbnRlcnByZXRhdGlvbiBpcyB0aGUgc2FtZSBhcwotICAgZm9yIGludGVnZXIgbGl0ZXJhbHMuICAoU2VlIDpyZWY6YG51bWJlcnNgLikgIElmICpiYXNlKiBpcyBzcGVjaWZpZWQgYW5kICp4KgotICAgaXMgbm90IGEgc3RyaW5nLCA6ZXhjOmBUeXBlRXJyb3JgIGlzIHJhaXNlZC4gT3RoZXJ3aXNlLCB0aGUgYXJndW1lbnQgbWF5IGJlIGEKLSAgIHBsYWluIG9yIGxvbmcgaW50ZWdlciBvciBhIGZsb2F0aW5nIHBvaW50IG51bWJlci4gIENvbnZlcnNpb24gb2YgZmxvYXRpbmcKLSAgIHBvaW50IG51bWJlcnMgdG8gaW50ZWdlcnMgdHJ1bmNhdGVzICh0b3dhcmRzIHplcm8pLiAgSWYgdGhlIGFyZ3VtZW50IGlzCi0gICBvdXRzaWRlIHRoZSBpbnRlZ2VyIHJhbmdlIGEgbG9uZyBvYmplY3Qgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkLiAgSWYgbm8KLSAgIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIHJldHVybnMgYGAwYGAuCisgICBDb252ZXJ0IGEgbnVtYmVyIG9yIHN0cmluZyAqeCogdG8gYW4gaW50ZWdlciwgb3IgcmV0dXJuIGBgMGBgIGlmIG5vCisgICBhcmd1bWVudHMgYXJlIGdpdmVuLiAgSWYgKngqIGlzIGEgbnVtYmVyLCBpdCBjYW4gYmUgYSBwbGFpbiBpbnRlZ2VyLCBhIGxvbmcKKyAgIGludGVnZXIsIG9yIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLiAgSWYgKngqIGlzIGZsb2F0aW5nIHBvaW50LCB0aGUgY29udmVyc2lvbgorICAgdHJ1bmNhdGVzIHRvd2FyZHMgemVyby4gIElmIHRoZSBhcmd1bWVudCBpcyBvdXRzaWRlIHRoZSBpbnRlZ2VyIHJhbmdlLCB0aGUKKyAgIGZ1bmN0aW9uIHJldHVybnMgYSBsb25nIG9iamVjdCBpbnN0ZWFkLgorCisgICBJZiAqeCogaXMgbm90IGEgbnVtYmVyIG9yIGlmICpiYXNlKiBpcyBnaXZlbiwgdGhlbiAqeCogbXVzdCBiZSBhIHN0cmluZyBvcgorICAgVW5pY29kZSBvYmplY3QgcmVwcmVzZW50aW5nIGFuIDpyZWY6YGludGVnZXIgbGl0ZXJhbCA8aW50ZWdlcnM+YCBpbiByYWRpeAorICAgKmJhc2UqLiAgT3B0aW9uYWxseSwgdGhlIGxpdGVyYWwgY2FuIGJlCisgICBwcmVjZWRlZCBieSBgYCtgYCBvciBgYC1gYCAod2l0aCBubyBzcGFjZSBpbiBiZXR3ZWVuKSBhbmQgc3Vycm91bmRlZCBieQorICAgd2hpdGVzcGFjZS4gIEEgYmFzZS1uIGxpdGVyYWwgY29uc2lzdHMgb2YgdGhlIGRpZ2l0cyAwIHRvIG4tMSwgd2l0aCBgYGFgYAorICAgdG8gYGB6YGAgKG9yIGBgQWBgIHRvIGBgWmBgKSBoYXZpbmcKKyAgIHZhbHVlcyAxMCB0byAzNS4gIFRoZSBkZWZhdWx0ICpiYXNlKiBpcyAxMC4gVGhlIGFsbG93ZWQgdmFsdWVzIGFyZSAwIGFuZCAyLTM2LgorICAgQmFzZS0yLCAtOCwgYW5kIC0xNiBsaXRlcmFscyBjYW4gYmUgb3B0aW9uYWxseSBwcmVmaXhlZCB3aXRoIGBgMGJgYC9gYDBCYGAsCisgICBgYDBvYGAvYGAwT2BgL2BgMGBgLCBvciBgYDB4YGAvYGAwWGBgLCBhcyB3aXRoIGludGVnZXIgbGl0ZXJhbHMgaW4gY29kZS4KKyAgIEJhc2UgMCBtZWFucyB0byBpbnRlcnByZXQgdGhlIHN0cmluZyBleGFjdGx5IGFzIGFuIGludGVnZXIgbGl0ZXJhbCwgc28gdGhhdAorICAgdGhlIGFjdHVhbCBiYXNlIGlzIDIsIDgsIDEwLCBvciAxNi4KIAogICAgVGhlIGludGVnZXIgdHlwZSBpcyBkZXNjcmliZWQgaW4gOnJlZjpgdHlwZXNudW1lcmljYC4KIApAQCAtNjY4LDcgKzcxNCw3IEBACiAKICAgIE9uZSB1c2VmdWwgYXBwbGljYXRpb24gb2YgdGhlIHNlY29uZCBmb3JtIG9mIDpmdW5jOmBpdGVyYCBpcyB0byByZWFkIGxpbmVzIG9mCiAgICBhIGZpbGUgdW50aWwgYSBjZXJ0YWluIGxpbmUgaXMgcmVhY2hlZC4gIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSByZWFkcyBhIGZpbGUKLSAgIHVudGlsIHRoZSA6bWV0aDpgcmVhZGxpbmVgIG1ldGhvZCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZzo6CisgICB1bnRpbCB0aGUgOm1ldGg6YH5pby5UZXh0SU9CYXNlLnJlYWRsaW5lYCBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmc6OgogCiAgICAgICB3aXRoIG9wZW4oJ215ZGF0YS50eHQnKSBhcyBmcDoKICAgICAgICAgICBmb3IgbGluZSBpbiBpdGVyKGZwLnJlYWRsaW5lLCAnJyk6CkBAIC02ODAsNyArNzI2LDggQEAKIC4uIGZ1bmN0aW9uOjogbGVuKHMpCiAKICAgIFJldHVybiB0aGUgbGVuZ3RoICh0aGUgbnVtYmVyIG9mIGl0ZW1zKSBvZiBhbiBvYmplY3QuICBUaGUgYXJndW1lbnQgbWF5IGJlIGEKLSAgIHNlcXVlbmNlIChzdHJpbmcsIHR1cGxlIG9yIGxpc3QpIG9yIGEgbWFwcGluZyAoZGljdGlvbmFyeSkuCisgICBzZXF1ZW5jZSAoc3VjaCBhcyBhIHN0cmluZywgYnl0ZXMsIHR1cGxlLCBsaXN0LCBvciByYW5nZSkgb3IgYSBjb2xsZWN0aW9uCisgICAoc3VjaCBhcyBhIGRpY3Rpb25hcnksIHNldCwgb3IgZnJvemVuIHNldCkuCiAKIAogLi4gZnVuY3Rpb246OiBsaXN0KFtpdGVyYWJsZV0pCkBAIC03MDksNyArNzU2LDggQEAKICAgICAgIGFmZmVjdCB0aGUgdmFsdWVzIG9mIGxvY2FsIGFuZCBmcmVlIHZhcmlhYmxlcyB1c2VkIGJ5IHRoZSBpbnRlcnByZXRlci4KIAogCi0uLiBmdW5jdGlvbjo6IGxvbmcoW3hbLCBiYXNlXV0pCisuLiBmdW5jdGlvbjo6IGxvbmcoeD0wKQorICAgICAgICAgICAgICBsb25nKHgsIGJhc2U9MTApCiAKICAgIENvbnZlcnQgYSBzdHJpbmcgb3IgbnVtYmVyIHRvIGEgbG9uZyBpbnRlZ2VyLiAgSWYgdGhlIGFyZ3VtZW50IGlzIGEgc3RyaW5nLCBpdAogICAgbXVzdCBjb250YWluIGEgcG9zc2libHkgc2lnbmVkIG51bWJlciBvZiBhcmJpdHJhcnkgc2l6ZSwgcG9zc2libHkgZW1iZWRkZWQgaW4KQEAgLTczNSwxMSArNzgzLDE2IEBACiAgICB0aGUgcmVzdWx0IGlzIGFsd2F5cyBhIGxpc3QuCiAKIAotLi4gZnVuY3Rpb246OiBtYXgoaXRlcmFibGVbLCBhcmdzLi4uXVtrZXldKQorLi4gZnVuY3Rpb246OiBtYXgoaXRlcmFibGVbLCBrZXldKQorICAgICAgICAgICAgICBtYXgoYXJnMSwgYXJnMiwgKmFyZ3NbLCBrZXldKQogCi0gICBXaXRoIGEgc2luZ2xlIGFyZ3VtZW50ICppdGVyYWJsZSosIHJldHVybiB0aGUgbGFyZ2VzdCBpdGVtIG9mIGEgbm9uLWVtcHR5Ci0gICBpdGVyYWJsZSAoc3VjaCBhcyBhIHN0cmluZywgdHVwbGUgb3IgbGlzdCkuICBXaXRoIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQsIHJldHVybgotICAgdGhlIGxhcmdlc3Qgb2YgdGhlIGFyZ3VtZW50cy4KKyAgIFJldHVybiB0aGUgbGFyZ2VzdCBpdGVtIGluIGFuIGl0ZXJhYmxlIG9yIHRoZSBsYXJnZXN0IG9mIHR3byBvciBtb3JlCisgICBhcmd1bWVudHMuCisKKyAgIElmIG9uZSBwb3NpdGlvbmFsIGFyZ3VtZW50IGlzIHByb3ZpZGVkLCAqaXRlcmFibGUqIG11c3QgYmUgYSBub24tZW1wdHkKKyAgIGl0ZXJhYmxlIChzdWNoIGFzIGEgbm9uLWVtcHR5IHN0cmluZywgdHVwbGUgb3IgbGlzdCkuICBUaGUgbGFyZ2VzdCBpdGVtCisgICBpbiB0aGUgaXRlcmFibGUgaXMgcmV0dXJuZWQuICBJZiB0d28gb3IgbW9yZSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBhcmUKKyAgIHByb3ZpZGVkLCB0aGUgbGFyZ2VzdCBvZiB0aGUgcG9zaXRpb25hbCBhcmd1bWVudHMgaXMgcmV0dXJuZWQuCiAKICAgIFRoZSBvcHRpb25hbCAqa2V5KiBhcmd1bWVudCBzcGVjaWZpZXMgYSBvbmUtYXJndW1lbnQgb3JkZXJpbmcgZnVuY3Rpb24gbGlrZSB0aGF0CiAgICB1c2VkIGZvciA6bWV0aDpgbGlzdC5zb3J0YC4gIFRoZSAqa2V5KiBhcmd1bWVudCwgaWYgc3VwcGxpZWQsIG11c3QgYmUgaW4ga2V5d29yZApAQCAtNzQ4LDcgKzgwMSw3IEBACiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQogICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgdGhlIG9wdGlvbmFsICprZXkqIGFyZ3VtZW50LgogCi0KKy4uIF9mdW5jLW1lbW9yeXZpZXc6CiAuLiBmdW5jdGlvbjo6IG1lbW9yeXZpZXcob2JqKQogICAgOm5vaW5kZXg6CiAKQEAgLTc1NiwxMSArODA5LDE2IEBACiAgICA6cmVmOmB0eXBlbWVtb3J5dmlld2AgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAKIAotLi4gZnVuY3Rpb246OiBtaW4oaXRlcmFibGVbLCBhcmdzLi4uXVtrZXldKQorLi4gZnVuY3Rpb246OiBtaW4oaXRlcmFibGVbLCBrZXldKQorICAgICAgICAgICAgICBtaW4oYXJnMSwgYXJnMiwgKmFyZ3NbLCBrZXldKQogCi0gICBXaXRoIGEgc2luZ2xlIGFyZ3VtZW50ICppdGVyYWJsZSosIHJldHVybiB0aGUgc21hbGxlc3QgaXRlbSBvZiBhIG5vbi1lbXB0eQotICAgaXRlcmFibGUgKHN1Y2ggYXMgYSBzdHJpbmcsIHR1cGxlIG9yIGxpc3QpLiAgV2l0aCBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LCByZXR1cm4KLSAgIHRoZSBzbWFsbGVzdCBvZiB0aGUgYXJndW1lbnRzLgorICAgUmV0dXJuIHRoZSBzbWFsbGVzdCBpdGVtIGluIGFuIGl0ZXJhYmxlIG9yIHRoZSBzbWFsbGVzdCBvZiB0d28gb3IgbW9yZQorICAgYXJndW1lbnRzLgorCisgICBJZiBvbmUgcG9zaXRpb25hbCBhcmd1bWVudCBpcyBwcm92aWRlZCwgKml0ZXJhYmxlKiBtdXN0IGJlIGEgbm9uLWVtcHR5CisgICBpdGVyYWJsZSAoc3VjaCBhcyBhIG5vbi1lbXB0eSBzdHJpbmcsIHR1cGxlIG9yIGxpc3QpLiAgVGhlIHNtYWxsZXN0IGl0ZW0KKyAgIGluIHRoZSBpdGVyYWJsZSBpcyByZXR1cm5lZC4gIElmIHR3byBvciBtb3JlIHBvc2l0aW9uYWwgYXJndW1lbnRzIGFyZQorICAgcHJvdmlkZWQsIHRoZSBzbWFsbGVzdCBvZiB0aGUgcG9zaXRpb25hbCBhcmd1bWVudHMgaXMgcmV0dXJuZWQuCiAKICAgIFRoZSBvcHRpb25hbCAqa2V5KiBhcmd1bWVudCBzcGVjaWZpZXMgYSBvbmUtYXJndW1lbnQgb3JkZXJpbmcgZnVuY3Rpb24gbGlrZSB0aGF0CiAgICB1c2VkIGZvciA6bWV0aDpgbGlzdC5zb3J0YC4gIFRoZSAqa2V5KiBhcmd1bWVudCwgaWYgc3VwcGxpZWQsIG11c3QgYmUgaW4ga2V5d29yZApAQCAtODA4LDcgKzg2Niw3IEBACiAgICA6ZXhjOmBJT0Vycm9yYCBpcyByYWlzZWQuICBXaGVuIG9wZW5pbmcgYSBmaWxlLCBpdCdzIHByZWZlcmFibGUgdG8gdXNlCiAgICA6ZnVuYzpgb3BlbmAgaW5zdGVhZCBvZiBpbnZva2luZyB0aGUgOmNsYXNzOmBmaWxlYCBjb25zdHJ1Y3RvciBkaXJlY3RseS4KIAotICAgVGhlIGZpcnN0IHR3byBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvciBgYHN0ZGlvYGAncyA6Y2Z1bmM6YGZvcGVuYDoKKyAgIFRoZSBmaXJzdCB0d28gYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IgYGBzdGRpb2BgJ3MgOmM6ZnVuYzpgZm9wZW5gOgogICAgKm5hbWUqIGlzIHRoZSBmaWxlIG5hbWUgdG8gYmUgb3BlbmVkLCBhbmQgKm1vZGUqIGlzIGEgc3RyaW5nIGluZGljYXRpbmcgaG93CiAgICB0aGUgZmlsZSBpcyB0byBiZSBvcGVuZWQuCiAKQEAgLTgzMiwyNiArODkwLDI5IEBACiAKICAgIFRoZSBvcHRpb25hbCAqYnVmZmVyaW5nKiBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIGZpbGUncyBkZXNpcmVkIGJ1ZmZlciBzaXplOiAwCiAgICBtZWFucyB1bmJ1ZmZlcmVkLCAxIG1lYW5zIGxpbmUgYnVmZmVyZWQsIGFueSBvdGhlciBwb3NpdGl2ZSB2YWx1ZSBtZWFucyB1c2UgYQotICAgYnVmZmVyIG9mIChhcHByb3hpbWF0ZWx5KSB0aGF0IHNpemUuICBBIG5lZ2F0aXZlICpidWZmZXJpbmcqIG1lYW5zIHRvIHVzZSB0aGUKLSAgIHN5c3RlbSBkZWZhdWx0LCB3aGljaCBpcyB1c3VhbGx5IGxpbmUgYnVmZmVyZWQgZm9yIHR0eSBkZXZpY2VzIGFuZCBmdWxseQotICAgYnVmZmVyZWQgZm9yIG90aGVyIGZpbGVzLiAgSWYgb21pdHRlZCwgdGhlIHN5c3RlbSBkZWZhdWx0IGlzIHVzZWQuIFsjXV8KKyAgIGJ1ZmZlciBvZiAoYXBwcm94aW1hdGVseSkgdGhhdCBzaXplIChpbiBieXRlcykuICBBIG5lZ2F0aXZlICpidWZmZXJpbmcqIG1lYW5zCisgICB0byB1c2UgdGhlIHN5c3RlbSBkZWZhdWx0LCB3aGljaCBpcyB1c3VhbGx5IGxpbmUgYnVmZmVyZWQgZm9yIHR0eSBkZXZpY2VzIGFuZAorICAgZnVsbHkgYnVmZmVyZWQgZm9yIG90aGVyIGZpbGVzLiAgSWYgb21pdHRlZCwgdGhlIHN5c3RlbSBkZWZhdWx0IGlzIHVzZWQuIFsjXV8KIAotICAgTW9kZXMgYGAncisnYGAsIGBgJ3crJ2BgIGFuZCBgYCdhKydgYCBvcGVuIHRoZSBmaWxlIGZvciB1cGRhdGluZyAobm90ZSB0aGF0Ci0gICBgYCd3KydgYCB0cnVuY2F0ZXMgdGhlIGZpbGUpLiAgQXBwZW5kIGBgJ2InYGAgdG8gdGhlIG1vZGUgdG8gb3BlbiB0aGUgZmlsZSBpbgorICAgTW9kZXMgYGAncisnYGAsIGBgJ3crJ2BgIGFuZCBgYCdhKydgYCBvcGVuIHRoZSBmaWxlIGZvciB1cGRhdGluZyAocmVhZGluZyBhbmQgd3JpdGluZyk7CisgICBub3RlIHRoYXQgYGAndysnYGAgdHJ1bmNhdGVzIHRoZSBmaWxlLiAgQXBwZW5kIGBgJ2InYGAgdG8gdGhlIG1vZGUgdG8gb3BlbiB0aGUgZmlsZSBpbgogICAgYmluYXJ5IG1vZGUsIG9uIHN5c3RlbXMgdGhhdCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYmluYXJ5IGFuZCB0ZXh0IGZpbGVzOyBvbgogICAgc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgdGhpcyBkaXN0aW5jdGlvbiwgYWRkaW5nIHRoZSBgYCdiJ2BgIGhhcyBubyBlZmZlY3QuCiAKLSAgIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCA6Y2Z1bmM6YGZvcGVuYCB2YWx1ZXMgKm1vZGUqIG1heSBiZSBgYCdVJ2BgIG9yCi0gICBgYCdyVSdgYC4gIFB5dGhvbiBpcyB1c3VhbGx5IGJ1aWx0IHdpdGggdW5pdmVyc2FsIG5ld2xpbmUgc3VwcG9ydDsgc3VwcGx5aW5nCi0gICBgYCdVJ2BgIG9wZW5zIHRoZSBmaWxlIGFzIGEgdGV4dCBmaWxlLCBidXQgbGluZXMgbWF5IGJlIHRlcm1pbmF0ZWQgYnkgYW55IG9mIHRoZQotICAgZm9sbG93aW5nOiB0aGUgVW5peCBlbmQtb2YtbGluZSBjb252ZW50aW9uIGBgJ1xuJ2BgLCAgdGhlIE1hY2ludG9zaCBjb252ZW50aW9uCi0gICBgYCdccidgYCwgb3IgdGhlIFdpbmRvd3MgY29udmVudGlvbiBgYCdcclxuJ2BgLiBBbGwgb2YgdGhlc2UgZXh0ZXJuYWwKLSAgIHJlcHJlc2VudGF0aW9ucyBhcmUgc2VlbiBhcyBgYCdcbidgYCBieSB0aGUgUHl0aG9uIHByb2dyYW0uIElmIFB5dGhvbiBpcyBidWlsdAotICAgd2l0aG91dCB1bml2ZXJzYWwgbmV3bGluZSBzdXBwb3J0IGEgKm1vZGUqIHdpdGggYGAnVSdgYCBpcyB0aGUgc2FtZSBhcyBub3JtYWwKLSAgIHRleHQgbW9kZS4gIE5vdGUgdGhhdCBmaWxlIG9iamVjdHMgc28gb3BlbmVkIGFsc28gaGF2ZSBhbiBhdHRyaWJ1dGUgY2FsbGVkCi0gICA6YXR0cjpgbmV3bGluZXNgIHdoaWNoIGhhcyBhIHZhbHVlIG9mIGBgTm9uZWBgIChpZiBubyBuZXdsaW5lcyBoYXZlIHlldCBiZWVuCi0gICBzZWVuKSwgYGAnXG4nYGAsIGBgJ1xyJ2BgLCBgYCdcclxuJ2BgLCBvciBhIHR1cGxlIGNvbnRhaW5pbmcgYWxsIHRoZSBuZXdsaW5lCi0gICB0eXBlcyBzZWVuLgorICAgLi4gaW5kZXg6OgorICAgICAgc2luZ2xlOiB1bml2ZXJzYWwgbmV3bGluZXM7IG9wZW4oKSBidWlsdC1pbiBmdW5jdGlvbgorCisgICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgOmM6ZnVuYzpgZm9wZW5gIHZhbHVlcyAqbW9kZSogbWF5IGJlIGBgJ1UnYGAgb3IKKyAgIGBgJ3JVJ2BgLiAgUHl0aG9uIGlzIHVzdWFsbHkgYnVpbHQgd2l0aCA6dGVybTpgdW5pdmVyc2FsIG5ld2xpbmVzYCBzdXBwb3J0OworICAgc3VwcGx5aW5nIGBgJ1UnYGAgb3BlbnMgdGhlIGZpbGUgYXMgYSB0ZXh0IGZpbGUsIGJ1dCBsaW5lcyBtYXkgYmUgdGVybWluYXRlZAorICAgYnkgYW55IG9mIHRoZSBmb2xsb3dpbmc6IHRoZSBVbml4IGVuZC1vZi1saW5lIGNvbnZlbnRpb24gYGAnXG4nYGAsICB0aGUKKyAgIE1hY2ludG9zaCBjb252ZW50aW9uIGBgJ1xyJ2BgLCBvciB0aGUgV2luZG93cyBjb252ZW50aW9uIGBgJ1xyXG4nYGAuIEFsbCBvZgorICAgdGhlc2UgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25zIGFyZSBzZWVuIGFzIGBgJ1xuJ2BgIGJ5IHRoZSBQeXRob24gcHJvZ3JhbS4KKyAgIElmIFB5dGhvbiBpcyBidWlsdCB3aXRob3V0IHVuaXZlcnNhbCBuZXdsaW5lcyBzdXBwb3J0IGEgKm1vZGUqIHdpdGggYGAnVSdgYAorICAgaXMgdGhlIHNhbWUgYXMgbm9ybWFsIHRleHQgbW9kZS4gIE5vdGUgdGhhdCBmaWxlIG9iamVjdHMgc28gb3BlbmVkIGFsc28gaGF2ZQorICAgYW4gYXR0cmlidXRlIGNhbGxlZCA6YXR0cjpgbmV3bGluZXNgIHdoaWNoIGhhcyBhIHZhbHVlIG9mIGBgTm9uZWBgIChpZiBubworICAgbmV3bGluZXMgaGF2ZSB5ZXQgYmVlbiBzZWVuKSwgYGAnXG4nYGAsIGBgJ1xyJ2BgLCBgYCdcclxuJ2BgLCBvciBhIHR1cGxlCisgICBjb250YWluaW5nIGFsbCB0aGUgbmV3bGluZSB0eXBlcyBzZWVuLgogCiAgICBQeXRob24gZW5mb3JjZXMgdGhhdCB0aGUgbW9kZSwgYWZ0ZXIgc3RyaXBwaW5nIGBgJ1UnYGAsIGJlZ2lucyB3aXRoIGBgJ3InYGAsCiAgICBgYCd3J2BgIG9yIGBgJ2EnYGAuCkBAIC04OTcsMjAgKzk1OCwyMiBAQAogICAgYWNjaWRlbnRzLikKIAogCi0uLiBmdW5jdGlvbjo6IHByaW50KFtvYmplY3QsIC4uLl1bLCBzZXA9JyAnXVssIGVuZD0nXFxuJ11bLCBmaWxlPXN5cy5zdGRvdXRdKQorLi4gZnVuY3Rpb246OiBwcmludCgqb2JqZWN0cywgc2VwPScgJywgZW5kPSdcXG4nLCBmaWxlPXN5cy5zdGRvdXQpCiAKLSAgIFByaW50ICpvYmplY3QqXChzKSB0byB0aGUgc3RyZWFtICpmaWxlKiwgc2VwYXJhdGVkIGJ5ICpzZXAqIGFuZCBmb2xsb3dlZCBieQorICAgUHJpbnQgKm9iamVjdHMqIHRvIHRoZSBzdHJlYW0gKmZpbGUqLCBzZXBhcmF0ZWQgYnkgKnNlcCogYW5kIGZvbGxvd2VkIGJ5CiAgICAqZW5kKi4gICpzZXAqLCAqZW5kKiBhbmQgKmZpbGUqLCBpZiBwcmVzZW50LCBtdXN0IGJlIGdpdmVuIGFzIGtleXdvcmQKICAgIGFyZ3VtZW50cy4KIAogICAgQWxsIG5vbi1rZXl3b3JkIGFyZ3VtZW50cyBhcmUgY29udmVydGVkIHRvIHN0cmluZ3MgbGlrZSA6ZnVuYzpgc3RyYCBkb2VzIGFuZAogICAgd3JpdHRlbiB0byB0aGUgc3RyZWFtLCBzZXBhcmF0ZWQgYnkgKnNlcCogYW5kIGZvbGxvd2VkIGJ5ICplbmQqLiAgQm90aCAqc2VwKgogICAgYW5kICplbmQqIG11c3QgYmUgc3RyaW5nczsgdGhleSBjYW4gYWxzbyBiZSBgYE5vbmVgYCwgd2hpY2ggbWVhbnMgdG8gdXNlIHRoZQotICAgZGVmYXVsdCB2YWx1ZXMuICBJZiBubyAqb2JqZWN0KiBpcyBnaXZlbiwgOmZ1bmM6YHByaW50YCB3aWxsIGp1c3Qgd3JpdGUKKyAgIGRlZmF1bHQgdmFsdWVzLiAgSWYgbm8gKm9iamVjdHMqIGFyZSBnaXZlbiwgOmZ1bmM6YHByaW50YCB3aWxsIGp1c3Qgd3JpdGUKICAgICplbmQqLgogCiAgICBUaGUgKmZpbGUqIGFyZ3VtZW50IG11c3QgYmUgYW4gb2JqZWN0IHdpdGggYSBgYHdyaXRlKHN0cmluZylgYCBtZXRob2Q7IGlmIGl0Ci0gICBpcyBub3QgcHJlc2VudCBvciBgYE5vbmVgYCwgOmRhdGE6YHN5cy5zdGRvdXRgIHdpbGwgYmUgdXNlZC4KKyAgIGlzIG5vdCBwcmVzZW50IG9yIGBgTm9uZWBgLCA6ZGF0YTpgc3lzLnN0ZG91dGAgd2lsbCBiZSB1c2VkLiAgT3V0cHV0IGJ1ZmZlcmluZworICAgaXMgZGV0ZXJtaW5lZCBieSAqZmlsZSouICBVc2UgYGBmaWxlLmZsdXNoKClgYCB0byBlbnN1cmUsIGZvciBpbnN0YW5jZSwKKyAgIGltbWVkaWF0ZSBhcHBlYXJhbmNlIG9uIGEgc2NyZWVuLgogCiAgICAuLiBub3RlOjoKIApAQCAtOTY0LDEwICsxMDI3LDEwIEBACiAgICB0dXJucyB0aGUgOm1ldGg6YHZvbHRhZ2VgIG1ldGhvZCBpbnRvIGEgImdldHRlciIgZm9yIGEgcmVhZC1vbmx5IGF0dHJpYnV0ZQogICAgd2l0aCB0aGUgc2FtZSBuYW1lLgogCi0gICBBIHByb3BlcnR5IG9iamVjdCBoYXMgOmF0dHI6YGdldHRlcmAsIDphdHRyOmBzZXR0ZXJgLCBhbmQgOmF0dHI6YGRlbGV0ZXJgCi0gICBtZXRob2RzIHVzYWJsZSBhcyBkZWNvcmF0b3JzIHRoYXQgY3JlYXRlIGEgY29weSBvZiB0aGUgcHJvcGVydHkgd2l0aCB0aGUKLSAgIGNvcnJlc3BvbmRpbmcgYWNjZXNzb3IgZnVuY3Rpb24gc2V0IHRvIHRoZSBkZWNvcmF0ZWQgZnVuY3Rpb24uICBUaGlzIGlzCi0gICBiZXN0IGV4cGxhaW5lZCB3aXRoIGFuIGV4YW1wbGU6OgorICAgQSBwcm9wZXJ0eSBvYmplY3QgaGFzIDphdHRyOmB+cHJvcGVydHkuZ2V0dGVyYCwgOmF0dHI6YH5wcm9wZXJ0eS5zZXR0ZXJgLAorICAgYW5kIDphdHRyOmB+cHJvcGVydHkuZGVsZXRlcmAgbWV0aG9kcyB1c2FibGUgYXMgZGVjb3JhdG9ycyB0aGF0IGNyZWF0ZSBhCisgICBjb3B5IG9mIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGFjY2Vzc29yIGZ1bmN0aW9uIHNldCB0byB0aGUKKyAgIGRlY29yYXRlZCBmdW5jdGlvbi4gIFRoaXMgaXMgYmVzdCBleHBsYWluZWQgd2l0aCBhbiBleGFtcGxlOjoKIAogICAgICAgY2xhc3MgQyhvYmplY3QpOgogICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKQEAgLTEwMDIsNyArMTA2NSw4IEBACiAgICAgICBUaGUgYGBnZXR0ZXJgYCwgYGBzZXR0ZXJgYCwgYW5kIGBgZGVsZXRlcmBgIGF0dHJpYnV0ZXMgd2VyZSBhZGRlZC4KIAogCi0uLiBmdW5jdGlvbjo6IHJhbmdlKFtzdGFydCxdIHN0b3BbLCBzdGVwXSkKKy4uIGZ1bmN0aW9uOjogcmFuZ2Uoc3RvcCkKKyAgICAgICAgICAgICAgcmFuZ2Uoc3RhcnQsIHN0b3BbLCBzdGVwXSkKIAogICAgVGhpcyBpcyBhIHZlcnNhdGlsZSBmdW5jdGlvbiB0byBjcmVhdGUgbGlzdHMgY29udGFpbmluZyBhcml0aG1ldGljIHByb2dyZXNzaW9ucy4KICAgIEl0IGlzIG1vc3Qgb2Z0ZW4gdXNlZCBpbiA6a2V5d29yZDpgZm9yYCBsb29wcy4gIFRoZSBhcmd1bWVudHMgbXVzdCBiZSBwbGFpbgpAQCAtMTA1Niw3ICsxMTIwLDE5IEBACiAgICBpdCBpcyBwbGFjZWQgYmVmb3JlIHRoZSBpdGVtcyBvZiB0aGUgaXRlcmFibGUgaW4gdGhlIGNhbGN1bGF0aW9uLCBhbmQgc2VydmVzIGFzCiAgICBhIGRlZmF1bHQgd2hlbiB0aGUgaXRlcmFibGUgaXMgZW1wdHkuICBJZiAqaW5pdGlhbGl6ZXIqIGlzIG5vdCBnaXZlbiBhbmQKICAgICppdGVyYWJsZSogY29udGFpbnMgb25seSBvbmUgaXRlbSwgdGhlIGZpcnN0IGl0ZW0gaXMgcmV0dXJuZWQuCisgICBSb3VnaGx5IGVxdWl2YWxlbnQgdG86OgogCisgICAgICBkZWYgcmVkdWNlKGZ1bmN0aW9uLCBpdGVyYWJsZSwgaW5pdGlhbGl6ZXI9Tm9uZSk6CisgICAgICAgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKQorICAgICAgICAgIGlmIGluaXRpYWxpemVyIGlzIE5vbmU6CisgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVyID0gbmV4dChpdCkKKyAgICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ3JlZHVjZSgpIG9mIGVtcHR5IHNlcXVlbmNlIHdpdGggbm8gaW5pdGlhbCB2YWx1ZScpCisgICAgICAgICAgYWNjdW1fdmFsdWUgPSBpbml0aWFsaXplcgorICAgICAgICAgIGZvciB4IGluIGl0OgorICAgICAgICAgICAgICBhY2N1bV92YWx1ZSA9IGZ1bmN0aW9uKGFjY3VtX3ZhbHVlLCB4KQorICAgICAgICAgIHJldHVybiBhY2N1bV92YWx1ZQogCiAuLiBmdW5jdGlvbjo6IHJlbG9hZChtb2R1bGUpCiAKQEAgLTExMjAsNiArMTE5Niw3IEBACiAgICBjb250aW51ZSB0byB1c2UgdGhlIG9sZCBjbGFzcyBkZWZpbml0aW9uLiAgVGhlIHNhbWUgaXMgdHJ1ZSBmb3IgZGVyaXZlZCBjbGFzc2VzLgogCiAKKy4uIF9mdW5jLXJlcHI6CiAuLiBmdW5jdGlvbjo6IHJlcHIob2JqZWN0KQogCiAgICBSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuICBUaGlzIGlzCkBAIC0xMTQ2LDEzICsxMjIzLDE0IEBACiAgICAgICBBZGRlZCB0aGUgcG9zc2liaWxpdHkgdG8gd3JpdGUgYSBjdXN0b20gOm1ldGg6YF9fcmV2ZXJzZWRfX2AgbWV0aG9kLgogCiAKLS4uIGZ1bmN0aW9uOjogcm91bmQoeFssIG5dKQorLi4gZnVuY3Rpb246OiByb3VuZChudW1iZXJbLCBuZGlnaXRzXSkKIAotICAgUmV0dXJuIHRoZSBmbG9hdGluZyBwb2ludCB2YWx1ZSAqeCogcm91bmRlZCB0byAqbiogZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsCi0gICBwb2ludC4gIElmICpuKiBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byB6ZXJvLiBUaGUgcmVzdWx0IGlzIGEgZmxvYXRpbmcgcG9pbnQKLSAgIG51bWJlci4gIFZhbHVlcyBhcmUgcm91bmRlZCB0byB0aGUgY2xvc2VzdCBtdWx0aXBsZSBvZiAxMCB0byB0aGUgcG93ZXIgbWludXMKLSAgICpuKjsgaWYgdHdvIG11bHRpcGxlcyBhcmUgZXF1YWxseSBjbG9zZSwgcm91bmRpbmcgaXMgZG9uZSBhd2F5IGZyb20gMCAoc28uIGZvcgotICAgZXhhbXBsZSwgYGByb3VuZCgwLjUpYGAgaXMgYGAxLjBgYCBhbmQgYGByb3VuZCgtMC41KWBgIGlzIGBgLTEuMGBgKS4KKyAgIFJldHVybiB0aGUgZmxvYXRpbmcgcG9pbnQgdmFsdWUgKm51bWJlciogcm91bmRlZCB0byAqbmRpZ2l0cyogZGlnaXRzIGFmdGVyCisgICB0aGUgZGVjaW1hbCBwb2ludC4gIElmICpuZGlnaXRzKiBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byB6ZXJvLiBUaGUgcmVzdWx0CisgICBpcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlci4gIFZhbHVlcyBhcmUgcm91bmRlZCB0byB0aGUgY2xvc2VzdCBtdWx0aXBsZSBvZgorICAgMTAgdG8gdGhlIHBvd2VyIG1pbnVzICpuZGlnaXRzKjsgaWYgdHdvIG11bHRpcGxlcyBhcmUgZXF1YWxseSBjbG9zZSwKKyAgIHJvdW5kaW5nIGlzIGRvbmUgYXdheSBmcm9tIDAgKHNvLCBmb3IgZXhhbXBsZSwgYGByb3VuZCgwLjUpYGAgaXMgYGAxLjBgYCBhbmQKKyAgIGBgcm91bmQoLTAuNSlgYCBpcyBgYC0xLjBgYCkuCiAKIAogICAgLi4gbm90ZTo6CkBAIC0xMTYzLDE0ICsxMjQxLDE4IEBACiAgICAgICBjYW4ndCBiZSByZXByZXNlbnRlZCBleGFjdGx5IGFzIGEgZmxvYXQuICBTZWUgOnJlZjpgdHV0LWZwLWlzc3Vlc2AgZm9yCiAgICAgICBtb3JlIGluZm9ybWF0aW9uLgogCisKKy4uIF9mdW5jLXNldDoKIC4uIGZ1bmN0aW9uOjogc2V0KFtpdGVyYWJsZV0pCiAgICA6bm9pbmRleDoKIAotICAgUmV0dXJuIGEgbmV3IHNldCwgb3B0aW9uYWxseSB3aXRoIGVsZW1lbnRzIHRha2VuIGZyb20gKml0ZXJhYmxlKi4KLSAgIFRoZSBzZXQgdHlwZSBpcyBkZXNjcmliZWQgaW4gOnJlZjpgdHlwZXMtc2V0YC4KKyAgIFJldHVybiBhIG5ldyA6Y2xhc3M6YHNldGAgb2JqZWN0LCBvcHRpb25hbGx5IHdpdGggZWxlbWVudHMgdGFrZW4gZnJvbQorICAgKml0ZXJhYmxlKi4gIGBgc2V0YGAgaXMgYSBidWlsdC1pbiBjbGFzcy4gIFNlZSA6Y2xhc3M6YHNldGAgYW5kCisgICA6cmVmOmB0eXBlcy1zZXRgIGZvciBkb2N1bWVudGF0aW9uIGFib3V0IHRoaXMgY2xhc3MuCiAKLSAgIEZvciBvdGhlciBjb250YWluZXJzIHNlZSB0aGUgYnVpbHQgaW4gOmNsYXNzOmBkaWN0YCwgOmNsYXNzOmBsaXN0YCwgYW5kCi0gICA6Y2xhc3M6YHR1cGxlYCBjbGFzc2VzLCBhbmQgdGhlIDptb2Q6YGNvbGxlY3Rpb25zYCBtb2R1bGUuCisgICBGb3Igb3RoZXIgY29udGFpbmVycyBzZWUgdGhlIGJ1aWx0LWluIDpjbGFzczpgZnJvemVuc2V0YCwgOmNsYXNzOmBsaXN0YCwKKyAgIDpjbGFzczpgdHVwbGVgLCBhbmQgOmNsYXNzOmBkaWN0YCBjbGFzc2VzLCBhcyB3ZWxsIGFzIHRoZSA6bW9kOmBjb2xsZWN0aW9uc2AKKyAgIG1vZHVsZS4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi40CiAKQEAgLTExODQsMTkgKzEyNjYsMjAgQEAKICAgIGBgeC5mb29iYXIgPSAxMjNgYC4KIAogCi0uLiBmdW5jdGlvbjo6IHNsaWNlKFtzdGFydCxdIHN0b3BbLCBzdGVwXSkKKy4uIGZ1bmN0aW9uOjogc2xpY2Uoc3RvcCkKKyAgICAgICAgICAgICAgc2xpY2Uoc3RhcnQsIHN0b3BbLCBzdGVwXSkKIAogICAgLi4gaW5kZXg6OiBzaW5nbGU6IE51bWVyaWNhbCBQeXRob24KIAogICAgUmV0dXJuIGEgOnRlcm06YHNsaWNlYCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXQgb2YgaW5kaWNlcyBzcGVjaWZpZWQgYnkKICAgIGBgcmFuZ2Uoc3RhcnQsIHN0b3AsIHN0ZXApYGAuICBUaGUgKnN0YXJ0KiBhbmQgKnN0ZXAqIGFyZ3VtZW50cyBkZWZhdWx0IHRvCi0gICBgYE5vbmVgYC4gIFNsaWNlIG9iamVjdHMgaGF2ZSByZWFkLW9ubHkgZGF0YSBhdHRyaWJ1dGVzIDphdHRyOmBzdGFydGAsCi0gICA6YXR0cjpgc3RvcGAgYW5kIDphdHRyOmBzdGVwYCB3aGljaCBtZXJlbHkgcmV0dXJuIHRoZSBhcmd1bWVudCB2YWx1ZXMgKG9yIHRoZWlyCi0gICBkZWZhdWx0KS4gIFRoZXkgaGF2ZSBubyBvdGhlciBleHBsaWNpdCBmdW5jdGlvbmFsaXR5OyBob3dldmVyIHRoZXkgYXJlIHVzZWQgYnkKLSAgIE51bWVyaWNhbCBQeXRob24gYW5kIG90aGVyIHRoaXJkIHBhcnR5IGV4dGVuc2lvbnMuICBTbGljZSBvYmplY3RzIGFyZSBhbHNvCi0gICBnZW5lcmF0ZWQgd2hlbiBleHRlbmRlZCBpbmRleGluZyBzeW50YXggaXMgdXNlZC4gIEZvciBleGFtcGxlOgotICAgYGBhW3N0YXJ0OnN0b3A6c3RlcF1gYCBvciBgYGFbc3RhcnQ6c3RvcCwgaV1gYC4gIFNlZSA6ZnVuYzpgaXRlcnRvb2xzLmlzbGljZWAKLSAgIGZvciBhbiBhbHRlcm5hdGUgdmVyc2lvbiB0aGF0IHJldHVybnMgYW4gaXRlcmF0b3IuCisgICBgYE5vbmVgYC4gIFNsaWNlIG9iamVjdHMgaGF2ZSByZWFkLW9ubHkgZGF0YSBhdHRyaWJ1dGVzIDphdHRyOmB+c2xpY2Uuc3RhcnRgLAorICAgOmF0dHI6YH5zbGljZS5zdG9wYCBhbmQgOmF0dHI6YH5zbGljZS5zdGVwYCB3aGljaCBtZXJlbHkgcmV0dXJuIHRoZSBhcmd1bWVudAorICAgdmFsdWVzIChvciB0aGVpciBkZWZhdWx0KS4gIFRoZXkgaGF2ZSBubyBvdGhlciBleHBsaWNpdCBmdW5jdGlvbmFsaXR5OworICAgaG93ZXZlciB0aGV5IGFyZSB1c2VkIGJ5IE51bWVyaWNhbCBQeXRob24gYW5kIG90aGVyIHRoaXJkIHBhcnR5IGV4dGVuc2lvbnMuCisgICBTbGljZSBvYmplY3RzIGFyZSBhbHNvIGdlbmVyYXRlZCB3aGVuIGV4dGVuZGVkIGluZGV4aW5nIHN5bnRheCBpcyB1c2VkLiAgRm9yCisgICBleGFtcGxlOiBgYGFbc3RhcnQ6c3RvcDpzdGVwXWBgIG9yIGBgYVtzdGFydDpzdG9wLCBpXWBgLiAgU2VlCisgICA6ZnVuYzpgaXRlcnRvb2xzLmlzbGljZWAgZm9yIGFuIGFsdGVybmF0ZSB2ZXJzaW9uIHRoYXQgcmV0dXJucyBhbiBpdGVyYXRvci4KIAogCiAuLiBmdW5jdGlvbjo6IHNvcnRlZChpdGVyYWJsZVssIGNtcFssIGtleVssIHJldmVyc2VdXV0pCkBAIC0xMjM5LDkgKzEzMjIsMTAgQEAKICAgIEEgc3RhdGljIG1ldGhvZCBkb2VzIG5vdCByZWNlaXZlIGFuIGltcGxpY2l0IGZpcnN0IGFyZ3VtZW50LiBUbyBkZWNsYXJlIGEgc3RhdGljCiAgICBtZXRob2QsIHVzZSB0aGlzIGlkaW9tOjoKIAotICAgICAgY2xhc3MgQzoKKyAgICAgIGNsYXNzIEMob2JqZWN0KToKICAgICAgICAgICBAc3RhdGljbWV0aG9kCi0gICAgICAgICAgZGVmIGYoYXJnMSwgYXJnMiwgLi4uKTogLi4uCisgICAgICAgICAgZGVmIGYoYXJnMSwgYXJnMiwgLi4uKToKKyAgICAgICAgICAgICAgLi4uCiAKICAgIFRoZSBgYEBzdGF0aWNtZXRob2RgYCBmb3JtIGlzIGEgZnVuY3Rpb24gOnRlcm06YGRlY29yYXRvcmAgLS0gc2VlIHRoZQogICAgZGVzY3JpcHRpb24gb2YgZnVuY3Rpb24gZGVmaW5pdGlvbnMgaW4gOnJlZjpgZnVuY3Rpb25gIGZvciBkZXRhaWxzLgpAQCAtMTI2Miw3ICsxMzQ2LDcgQEAKICAgICAgIEZ1bmN0aW9uIGRlY29yYXRvciBzeW50YXggYWRkZWQuCiAKIAotLi4gZnVuY3Rpb246OiBzdHIoW29iamVjdF0pCisuLiBmdW5jdGlvbjo6IHN0cihvYmplY3Q9JycpCiAKICAgIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGEgbmljZWx5IHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuICBGb3IKICAgIHN0cmluZ3MsIHRoaXMgcmV0dXJucyB0aGUgc3RyaW5nIGl0c2VsZi4gIFRoZSBkaWZmZXJlbmNlIHdpdGggYGByZXByKG9iamVjdClgYApAQCAtMTMwMCw5ICsxMzg0LDEwIEBACiAgICBiZWVuIG92ZXJyaWRkZW4gaW4gYSBjbGFzcy4gVGhlIHNlYXJjaCBvcmRlciBpcyBzYW1lIGFzIHRoYXQgdXNlZCBieQogICAgOmZ1bmM6YGdldGF0dHJgIGV4Y2VwdCB0aGF0IHRoZSAqdHlwZSogaXRzZWxmIGlzIHNraXBwZWQuCiAKLSAgIFRoZSA6YXR0cjpgX19tcm9fX2AgYXR0cmlidXRlIG9mIHRoZSAqdHlwZSogbGlzdHMgdGhlIG1ldGhvZCByZXNvbHV0aW9uCi0gICBzZWFyY2ggb3JkZXIgdXNlZCBieSBib3RoIDpmdW5jOmBnZXRhdHRyYCBhbmQgOmZ1bmM6YHN1cGVyYC4gIFRoZSBhdHRyaWJ1dGUKLSAgIGlzIGR5bmFtaWMgYW5kIGNhbiBjaGFuZ2Ugd2hlbmV2ZXIgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBpcyB1cGRhdGVkLgorICAgVGhlIDphdHRyOmB+Y2xhc3MuX19tcm9fX2AgYXR0cmlidXRlIG9mIHRoZSAqdHlwZSogbGlzdHMgdGhlIG1ldGhvZAorICAgcmVzb2x1dGlvbiBzZWFyY2ggb3JkZXIgdXNlZCBieSBib3RoIDpmdW5jOmBnZXRhdHRyYCBhbmQgOmZ1bmM6YHN1cGVyYC4gIFRoZQorICAgYXR0cmlidXRlIGlzIGR5bmFtaWMgYW5kIGNhbiBjaGFuZ2Ugd2hlbmV2ZXIgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBpcworICAgdXBkYXRlZC4KIAogICAgSWYgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBvbWl0dGVkLCB0aGUgc3VwZXIgb2JqZWN0IHJldHVybmVkIGlzIHVuYm91bmQuICBJZgogICAgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBhbiBvYmplY3QsIGBgaXNpbnN0YW5jZShvYmosIHR5cGUpYGAgbXVzdCBiZSB0cnVlLiAgSWYKQEAgLTEzNjYsMjYgKzE0NTEsMjEgQEAKIAogCiAuLiBmdW5jdGlvbjo6IHR5cGUob2JqZWN0KQorICAgICAgICAgICAgICB0eXBlKG5hbWUsIGJhc2VzLCBkaWN0KQogCiAgICAuLiBpbmRleDo6IG9iamVjdDogdHlwZQogCi0gICBSZXR1cm4gdGhlIHR5cGUgb2YgYW4gKm9iamVjdCouICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgdHlwZSBvYmplY3QuICBUaGUKLSAgIDpmdW5jOmBpc2luc3RhbmNlYCBidWlsdC1pbiBmdW5jdGlvbiBpcyByZWNvbW1lbmRlZCBmb3IgdGVzdGluZyB0aGUgdHlwZSBvZiBhbgotICAgb2JqZWN0LgorICAgV2l0aCBvbmUgYXJndW1lbnQsIHJldHVybiB0aGUgdHlwZSBvZiBhbiAqb2JqZWN0Ki4gIFRoZSByZXR1cm4gdmFsdWUgaXMgYQorICAgdHlwZSBvYmplY3QuICBUaGUgOmZ1bmM6YGlzaW5zdGFuY2VgIGJ1aWx0LWluIGZ1bmN0aW9uIGlzIHJlY29tbWVuZGVkIGZvcgorICAgdGVzdGluZyB0aGUgdHlwZSBvZiBhbiBvYmplY3QuCiAKLSAgIFdpdGggdGhyZWUgYXJndW1lbnRzLCA6ZnVuYzpgdHlwZWAgZnVuY3Rpb25zIGFzIGEgY29uc3RydWN0b3IgYXMgZGV0YWlsZWQgYmVsb3cuCi0KLQotLi4gZnVuY3Rpb246OiB0eXBlKG5hbWUsIGJhc2VzLCBkaWN0KQotICAgOm5vaW5kZXg6Ci0KLSAgIFJldHVybiBhIG5ldyB0eXBlIG9iamVjdC4gIFRoaXMgaXMgZXNzZW50aWFsbHkgYSBkeW5hbWljIGZvcm0gb2YgdGhlCi0gICA6a2V5d29yZDpgY2xhc3NgIHN0YXRlbWVudC4gVGhlICpuYW1lKiBzdHJpbmcgaXMgdGhlIGNsYXNzIG5hbWUgYW5kIGJlY29tZXMgdGhlCi0gICA6YXR0cjpgX19uYW1lX19gIGF0dHJpYnV0ZTsgdGhlICpiYXNlcyogdHVwbGUgaXRlbWl6ZXMgdGhlIGJhc2UgY2xhc3NlcyBhbmQKLSAgIGJlY29tZXMgdGhlIDphdHRyOmBfX2Jhc2VzX19gIGF0dHJpYnV0ZTsgYW5kIHRoZSAqZGljdCogZGljdGlvbmFyeSBpcyB0aGUKLSAgIG5hbWVzcGFjZSBjb250YWluaW5nIGRlZmluaXRpb25zIGZvciBjbGFzcyBib2R5IGFuZCBiZWNvbWVzIHRoZSA6YXR0cjpgX19kaWN0X19gCi0gICBhdHRyaWJ1dGUuICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB0d28gc3RhdGVtZW50cyBjcmVhdGUgaWRlbnRpY2FsCi0gICA6Y2xhc3M6YHR5cGVgIG9iamVjdHM6CisgICBXaXRoIHRocmVlIGFyZ3VtZW50cywgcmV0dXJuIGEgbmV3IHR5cGUgb2JqZWN0LiAgVGhpcyBpcyBlc3NlbnRpYWxseSBhCisgICBkeW5hbWljIGZvcm0gb2YgdGhlIDprZXl3b3JkOmBjbGFzc2Agc3RhdGVtZW50LiBUaGUgKm5hbWUqIHN0cmluZyBpcyB0aGUKKyAgIGNsYXNzIG5hbWUgYW5kIGJlY29tZXMgdGhlIDphdHRyOmB+Y2xhc3MuX19uYW1lX19gIGF0dHJpYnV0ZTsgdGhlICpiYXNlcyogdHVwbGUKKyAgIGl0ZW1pemVzIHRoZSBiYXNlIGNsYXNzZXMgYW5kIGJlY29tZXMgdGhlIDphdHRyOmB+Y2xhc3MuX19iYXNlc19fYCBhdHRyaWJ1dGU7CisgICBhbmQgdGhlICpkaWN0KiBkaWN0aW9uYXJ5IGlzIHRoZSBuYW1lc3BhY2UgY29udGFpbmluZyBkZWZpbml0aW9ucyBmb3IgY2xhc3MKKyAgIGJvZHkgYW5kIGJlY29tZXMgdGhlIDphdHRyOmB+b2JqZWN0Ll9fZGljdF9fYCAgYXR0cmlidXRlLiAgRm9yIGV4YW1wbGUsIHRoZQorICAgZm9sbG93aW5nIHR3byBzdGF0ZW1lbnRzIGNyZWF0ZSBpZGVudGljYWwgOmNsYXNzOmB0eXBlYCBvYmplY3RzOgogCiAgICAgICA+Pj4gY2xhc3MgWChvYmplY3QpOgogICAgICAgLi4uICAgICBhID0gMQpAQCAtMTQwNyw3ICsxNDg3LDggQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMAogCiAKLS4uIGZ1bmN0aW9uOjogdW5pY29kZShbb2JqZWN0WywgZW5jb2RpbmcgWywgZXJyb3JzXV1dKQorLi4gZnVuY3Rpb246OiB1bmljb2RlKG9iamVjdD0nJykKKyAgICAgICAgICAgICAgdW5pY29kZShvYmplY3RbLCBlbmNvZGluZyBbLCBlcnJvcnNdXSkKIAogICAgUmV0dXJuIHRoZSBVbmljb2RlIHN0cmluZyB2ZXJzaW9uIG9mICpvYmplY3QqIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nIG1vZGVzOgogCkBAIC0xNDQ3LDI3ICsxNTI4LDMyIEBACiAKIC4uIGZ1bmN0aW9uOjogdmFycyhbb2JqZWN0XSkKIAotICAgV2l0aG91dCBhbiBhcmd1bWVudCwgYWN0IGxpa2UgOmZ1bmM6YGxvY2Fsc2AuCisgICBSZXR1cm4gdGhlIDphdHRyOmB+b2JqZWN0Ll9fZGljdF9fYCBhdHRyaWJ1dGUgZm9yIGEgbW9kdWxlLCBjbGFzcywgaW5zdGFuY2UsCisgICBvciBhbnkgb3RoZXIgb2JqZWN0IHdpdGggYSA6YXR0cjpgX19kaWN0X19gIGF0dHJpYnV0ZS4KIAotICAgV2l0aCBhIG1vZHVsZSwgY2xhc3Mgb3IgY2xhc3MgaW5zdGFuY2Ugb2JqZWN0IGFzIGFyZ3VtZW50IChvciBhbnl0aGluZyBlbHNlIHRoYXQKLSAgIGhhcyBhIDphdHRyOmBfX2RpY3RfX2AgYXR0cmlidXRlKSwgcmV0dXJuIHRoYXQgYXR0cmlidXRlLgorICAgT2JqZWN0cyBzdWNoIGFzIG1vZHVsZXMgYW5kIGluc3RhbmNlcyBoYXZlIGFuIHVwZGF0ZWFibGUgOmF0dHI6YF9fZGljdF9fYAorICAgYXR0cmlidXRlOyBob3dldmVyLCBvdGhlciBvYmplY3RzIG1heSBoYXZlIHdyaXRlIHJlc3RyaWN0aW9ucyBvbiB0aGVpcgorICAgOmF0dHI6YF9fZGljdF9fYCBhdHRyaWJ1dGVzIChmb3IgZXhhbXBsZSwgbmV3LXN0eWxlIGNsYXNzZXMgdXNlIGEKKyAgIGRpY3Rwcm94eSB0byBwcmV2ZW50IGRpcmVjdCBkaWN0aW9uYXJ5IHVwZGF0ZXMpLgogCi0gICAuLiBub3RlOjoKLQotICAgICAgVGhlIHJldHVybmVkIGRpY3Rpb25hcnkgc2hvdWxkIG5vdCBiZSBtb2RpZmllZDoKLSAgICAgIHRoZSBlZmZlY3RzIG9uIHRoZSBjb3JyZXNwb25kaW5nIHN5bWJvbCB0YWJsZSBhcmUgdW5kZWZpbmVkLiBbI11fCisgICBXaXRob3V0IGFuIGFyZ3VtZW50LCA6ZnVuYzpgdmFyc2AgYWN0cyBsaWtlIDpmdW5jOmBsb2NhbHNgLiAgTm90ZSwgdGhlCisgICBsb2NhbHMgZGljdGlvbmFyeSBpcyBvbmx5IHVzZWZ1bCBmb3IgcmVhZHMgc2luY2UgdXBkYXRlcyB0byB0aGUgbG9jYWxzCisgICBkaWN0aW9uYXJ5IGFyZSBpZ25vcmVkLgogCiAKLS4uIGZ1bmN0aW9uOjogeHJhbmdlKFtzdGFydCxdIHN0b3BbLCBzdGVwXSkKKy4uIGZ1bmN0aW9uOjogeHJhbmdlKHN0b3ApCisgICAgICAgICAgICAgIHhyYW5nZShzdGFydCwgc3RvcFssIHN0ZXBdKQogCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHZlcnkgc2ltaWxhciB0byA6ZnVuYzpgcmFuZ2VgLCBidXQgcmV0dXJucyBhbiAieHJhbmdlIG9iamVjdCIKKyAgIFRoaXMgZnVuY3Rpb24gaXMgdmVyeSBzaW1pbGFyIHRvIDpmdW5jOmByYW5nZWAsIGJ1dCByZXR1cm5zIGFuIDpyZWY6YHhyYW5nZQorICAgb2JqZWN0IDx0eXBlc3NlcS14cmFuZ2U+YAogICAgaW5zdGVhZCBvZiBhIGxpc3QuICBUaGlzIGlzIGFuIG9wYXF1ZSBzZXF1ZW5jZSB0eXBlIHdoaWNoIHlpZWxkcyB0aGUgc2FtZSB2YWx1ZXMKICAgIGFzIHRoZSBjb3JyZXNwb25kaW5nIGxpc3QsIHdpdGhvdXQgYWN0dWFsbHkgc3RvcmluZyB0aGVtIGFsbCBzaW11bHRhbmVvdXNseS4KICAgIFRoZSBhZHZhbnRhZ2Ugb2YgOmZ1bmM6YHhyYW5nZWAgb3ZlciA6ZnVuYzpgcmFuZ2VgIGlzIG1pbmltYWwgKHNpbmNlCiAgICA6ZnVuYzpgeHJhbmdlYCBzdGlsbCBoYXMgdG8gY3JlYXRlIHRoZSB2YWx1ZXMgd2hlbiBhc2tlZCBmb3IgdGhlbSkgZXhjZXB0IHdoZW4gYQogICAgdmVyeSBsYXJnZSByYW5nZSBpcyB1c2VkIG9uIGEgbWVtb3J5LXN0YXJ2ZWQgbWFjaGluZSBvciB3aGVuIGFsbCBvZiB0aGUgcmFuZ2UncwogICAgZWxlbWVudHMgYXJlIG5ldmVyIHVzZWQgKHN1Y2ggYXMgd2hlbiB0aGUgbG9vcCBpcyB1c3VhbGx5IHRlcm1pbmF0ZWQgd2l0aAotICAgOmtleXdvcmQ6YGJyZWFrYCkuCisgICA6a2V5d29yZDpgYnJlYWtgKS4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHhyYW5nZSBvYmplY3RzLCBzZWUKKyAgIDpyZWY6YHR5cGVzc2VxLXhyYW5nZWAgYW5kIDpyZWY6YHR5cGVzc2VxYC4KIAogICAgLi4gaW1wbC1kZXRhaWw6OgogCkBAIC0xNTIyLDcgKzE2MDgsNyBAQAogICAgLi4gbm90ZTo6CiAKICAgICAgIFRoaXMgaXMgYW4gYWR2YW5jZWQgZnVuY3Rpb24gdGhhdCBpcyBub3QgbmVlZGVkIGluIGV2ZXJ5ZGF5IFB5dGhvbgotICAgICAgcHJvZ3JhbW1pbmcuCisgICAgICBwcm9ncmFtbWluZywgdW5saWtlIDpmdW5jOmBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZWAuCiAKICAgIFRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCBieSB0aGUgOmtleXdvcmQ6YGltcG9ydGAgc3RhdGVtZW50LiAgSXQgY2FuIGJlCiAgICByZXBsYWNlZCAoYnkgaW1wb3J0aW5nIHRoZSA6bW9kOmBfX2J1aWx0aW5fX2AgbW9kdWxlIGFuZCBhc3NpZ25pbmcgdG8KQEAgLTE1NzMsMTUgKzE2NTksOCBAQAogICAgbmFtZXMuCiAKICAgIElmIHlvdSBzaW1wbHkgd2FudCB0byBpbXBvcnQgYSBtb2R1bGUgKHBvdGVudGlhbGx5IHdpdGhpbiBhIHBhY2thZ2UpIGJ5IG5hbWUsCi0gICB5b3UgY2FuIGNhbGwgOmZ1bmM6YF9faW1wb3J0X19gIGFuZCB0aGVuIGxvb2sgaXQgdXAgaW4gOmRhdGE6YHN5cy5tb2R1bGVzYDo6CisgICB1c2UgOmZ1bmM6YGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlYC4KIAotICAgICAgPj4+IGltcG9ydCBzeXMKLSAgICAgID4+PiBuYW1lID0gJ2Zvby5iYXIuYmF6JwotICAgICAgPj4+IF9faW1wb3J0X18obmFtZSkKLSAgICAgIDxtb2R1bGUgJ2ZvbycgZnJvbSAuLi4+Ci0gICAgICA+Pj4gYmF6ID0gc3lzLm1vZHVsZXNbbmFtZV0KLSAgICAgID4+PiBiYXoKLSAgICAgIDxtb2R1bGUgJ2Zvby5iYXIuYmF6JyBmcm9tIC4uLj4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKICAgICAgIFRoZSBsZXZlbCBwYXJhbWV0ZXIgd2FzIGFkZGVkLgpAQCAtMTYxOCw3ICsxNjk3LDggQEAKICAgIGBgZnVuY3Rpb24oKmFyZ3MsICoqa2V5d29yZHMpYGAuCiAKICAgIC4uIGRlcHJlY2F0ZWQ6OiAyLjMKLSAgICAgIFVzZSB0aGUgZXh0ZW5kZWQgY2FsbCBzeW50YXggd2l0aCBgYCphcmdzYGAgYW5kIGBgKiprZXl3b3Jkc2BgIGluc3RlYWQuCisgICAgICBVc2UgYGBmdW5jdGlvbigqYXJncywgKiprZXl3b3JkcylgYCBpbnN0ZWFkIG9mCisgICAgICBgYGFwcGx5KGZ1bmN0aW9uLCBhcmdzLCBrZXl3b3JkcylgYCAoc2VlIDpyZWY6YHR1dC11bnBhY2tpbmctYXJndW1lbnRzYCkuCiAKIAogLi4gZnVuY3Rpb246OiBidWZmZXIob2JqZWN0Wywgb2Zmc2V0Wywgc2l6ZV1dKQpAQCAtMTY1OCw4ICsxNzM4LDggQEAKIC4uIFsjXSBJdCBpcyB1c2VkIHJlbGF0aXZlbHkgcmFyZWx5IHNvIGRvZXMgbm90IHdhcnJhbnQgYmVpbmcgbWFkZSBpbnRvIGEgc3RhdGVtZW50LgogCiAuLiBbI10gU3BlY2lmeWluZyBhIGJ1ZmZlciBzaXplIGN1cnJlbnRseSBoYXMgbm8gZWZmZWN0IG9uIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlCi0gICA6Y2Z1bmM6YHNldHZidWZgLiAgVGhlIGludGVyZmFjZSB0byBzcGVjaWZ5IHRoZSBidWZmZXIgc2l6ZSBpcyBub3QgZG9uZSB1c2luZyBhCi0gICBtZXRob2QgdGhhdCBjYWxscyA6Y2Z1bmM6YHNldHZidWZgLCBiZWNhdXNlIHRoYXQgbWF5IGR1bXAgY29yZSB3aGVuIGNhbGxlZCBhZnRlcgorICAgOmM6ZnVuYzpgc2V0dmJ1ZmAuICBUaGUgaW50ZXJmYWNlIHRvIHNwZWNpZnkgdGhlIGJ1ZmZlciBzaXplIGlzIG5vdCBkb25lIHVzaW5nIGEKKyAgIG1ldGhvZCB0aGF0IGNhbGxzIDpjOmZ1bmM6YHNldHZidWZgLCBiZWNhdXNlIHRoYXQgbWF5IGR1bXAgY29yZSB3aGVuIGNhbGxlZCBhZnRlcgogICAgYW55IEkvTyBoYXMgYmVlbiBwZXJmb3JtZWQsIGFuZCB0aGVyZSdzIG5vIHJlbGlhYmxlIHdheSB0byBkZXRlcm1pbmUgd2hldGhlcgogICAgdGhpcyBpcyB0aGUgY2FzZS4KIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZnVuY3Rvb2xzLnJzdCBiL0RvYy9saWJyYXJ5L2Z1bmN0b29scy5yc3QKaW5kZXggMTBjOTg0Zi4uY2M3ZWYzNCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZnVuY3Rvb2xzLnJzdAorKysgYi9Eb2MvbGlicmFyeS9mdW5jdG9vbHMucnN0CkBAIC0xLDggKzEsOCBAQAotOm1vZDpgZnVuY3Rvb2xzYCAtLS0gSGlnaGVyIG9yZGVyIGZ1bmN0aW9ucyBhbmQgb3BlcmF0aW9ucyBvbiBjYWxsYWJsZSBvYmplY3RzCis6bW9kOmBmdW5jdG9vbHNgIC0tLSBIaWdoZXItb3JkZXIgZnVuY3Rpb25zIGFuZCBvcGVyYXRpb25zIG9uIGNhbGxhYmxlIG9iamVjdHMKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiAuLiBtb2R1bGU6OiBmdW5jdG9vbHMKLSAgIDpzeW5vcHNpczogSGlnaGVyIG9yZGVyIGZ1bmN0aW9ucyBhbmQgb3BlcmF0aW9ucyBvbiBjYWxsYWJsZSBvYmplY3RzLgorICAgOnN5bm9wc2lzOiBIaWdoZXItb3JkZXIgZnVuY3Rpb25zIGFuZCBvcGVyYXRpb25zIG9uIGNhbGxhYmxlIG9iamVjdHMuCiAuLiBtb2R1bGVhdXRob3I6OiBQZXRlciBIYXJyaXMgPHNjYXZAYmx1ZXlvbmRlci5jby51az4KIC4uIG1vZHVsZWF1dGhvcjo6IFJheW1vbmQgSGV0dGluZ2VyIDxweXRob25AcmNuLmNvbT4KIC4uIG1vZHVsZWF1dGhvcjo6IE5pY2sgQ29naGxhbiA8bmNvZ2hsYW5AZ21haWwuY29tPgpAQCAtMjIsMTQgKzIyLDE0IEBACiAKIC4uICBmdW5jdGlvbjo6IGNtcF90b19rZXkoZnVuYykKIAotICAgVHJhbnNmb3JtIGFuIG9sZC1zdHlsZSBjb21wYXJpc29uIGZ1bmN0aW9uIHRvIGEga2V5LWZ1bmN0aW9uLiAgVXNlZCB3aXRoCisgICBUcmFuc2Zvcm0gYW4gb2xkLXN0eWxlIGNvbXBhcmlzb24gZnVuY3Rpb24gdG8gYSBrZXkgZnVuY3Rpb24uICBVc2VkIHdpdGgKICAgIHRvb2xzIHRoYXQgYWNjZXB0IGtleSBmdW5jdGlvbnMgKHN1Y2ggYXMgOmZ1bmM6YHNvcnRlZGAsIDpmdW5jOmBtaW5gLAogICAgOmZ1bmM6YG1heGAsIDpmdW5jOmBoZWFwcS5ubGFyZ2VzdGAsIDpmdW5jOmBoZWFwcS5uc21hbGxlc3RgLAogICAgOmZ1bmM6YGl0ZXJ0b29scy5ncm91cGJ5YCkuICBUaGlzIGZ1bmN0aW9uIGlzIHByaW1hcmlseSB1c2VkIGFzIGEgdHJhbnNpdGlvbgotICAgdG9vbCBmb3IgcHJvZ3JhbXMgYmVpbmcgY29udmVydGVkIHRvIFB5My54IHdoZXJlIGNvbXBhcmlzb24gZnVuY3Rpb25zIGFyZSBubwotICAgbG9uZ2VyIHN1cHBvcnRlZC4KKyAgIHRvb2wgZm9yIHByb2dyYW1zIGJlaW5nIGNvbnZlcnRlZCB0byBQeXRob24gMyB3aGVyZSBjb21wYXJpc29uIGZ1bmN0aW9ucyBhcmUKKyAgIG5vIGxvbmdlciBzdXBwb3J0ZWQuCiAKLSAgIEEgY29tcGFyZSBmdW5jdGlvbiBpcyBhbnkgY2FsbGFibGUgdGhhdCBhY2NlcHQgdHdvIGFyZ3VtZW50cywgY29tcGFyZXMgdGhlbSwKKyAgIEEgY29tcGFyaXNvbiBmdW5jdGlvbiBpcyBhbnkgY2FsbGFibGUgdGhhdCBhY2NlcHQgdHdvIGFyZ3VtZW50cywgY29tcGFyZXMgdGhlbSwKICAgIGFuZCByZXR1cm5zIGEgbmVnYXRpdmUgbnVtYmVyIGZvciBsZXNzLXRoYW4sIHplcm8gZm9yIGVxdWFsaXR5LCBvciBhIHBvc2l0aXZlCiAgICBudW1iZXIgZm9yIGdyZWF0ZXItdGhhbi4gIEEga2V5IGZ1bmN0aW9uIGlzIGEgY2FsbGFibGUgdGhhdCBhY2NlcHRzIG9uZQogICAgYXJndW1lbnQgYW5kIHJldHVybnMgYW5vdGhlciB2YWx1ZSB0aGF0IGluZGljYXRlcyB0aGUgcG9zaXRpb24gaW4gdGhlIGRlc2lyZWQKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2Z1dHVyZV9idWlsdGlucy5yc3QgYi9Eb2MvbGlicmFyeS9mdXR1cmVfYnVpbHRpbnMucnN0CmluZGV4IDA0ZjIwNTIuLjYyMzkyZWIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2Z1dHVyZV9idWlsdGlucy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZnV0dXJlX2J1aWx0aW5zLnJzdApAQCAtNTAsNiArNTAsMTEgQEAKIAogICAgV29ya3MgbGlrZSA6ZnVuYzpgaXRlcnRvb2xzLmltYXBgLgogCisgICAuLiBub3RlOjoKKworICAgICAgSW4gUHl0aG9uIDMsIDpmdW5jOmBtYXBgIGRvZXMgbm90IGFjY2VwdCBgYE5vbmVgYCBmb3IgdGhlCisgICAgICBmdW5jdGlvbiBhcmd1bWVudC4KKwogLi4gZnVuY3Rpb246OiBvY3Qob2JqZWN0KQogCiAgICBXb3JrcyBsaWtlIHRoZSBidWlsdC1pbiA6ZnVuYzpgb2N0YCwgYnV0IGluc3RlYWQgb2YgOm1ldGg6YF9fb2N0X19gIGl0IHdpbGwKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2djLnJzdCBiL0RvYy9saWJyYXJ5L2djLnJzdAppbmRleCA4MGEyZDkyLi5iZTAwNjNkIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9nYy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZ2MucnN0CkBAIC0xMzIsOCArMTMyLDggQEAKIAogICAgUmV0dXJuIGEgbGlzdCBvZiBvYmplY3RzIGRpcmVjdGx5IHJlZmVycmVkIHRvIGJ5IGFueSBvZiB0aGUgYXJndW1lbnRzLiBUaGUKICAgIHJlZmVyZW50cyByZXR1cm5lZCBhcmUgdGhvc2Ugb2JqZWN0cyB2aXNpdGVkIGJ5IHRoZSBhcmd1bWVudHMnIEMtbGV2ZWwKLSAgIDphdHRyOmB0cF90cmF2ZXJzZWAgbWV0aG9kcyAoaWYgYW55KSwgYW5kIG1heSBub3QgYmUgYWxsIG9iamVjdHMgYWN0dWFsbHkKLSAgIGRpcmVjdGx5IHJlYWNoYWJsZS4gIDphdHRyOmB0cF90cmF2ZXJzZWAgbWV0aG9kcyBhcmUgc3VwcG9ydGVkIG9ubHkgYnkgb2JqZWN0cworICAgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX3RyYXZlcnNlYCBtZXRob2RzIChpZiBhbnkpLCBhbmQgbWF5IG5vdCBiZSBhbGwgb2JqZWN0cyBhY3R1YWxseQorICAgZGlyZWN0bHkgcmVhY2hhYmxlLiAgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX3RyYXZlcnNlYCBtZXRob2RzIGFyZSBzdXBwb3J0ZWQgb25seSBieSBvYmplY3RzCiAgICB0aGF0IHN1cHBvcnQgZ2FyYmFnZSBjb2xsZWN0aW9uLCBhbmQgYXJlIG9ubHkgcmVxdWlyZWQgdG8gdmlzaXQgb2JqZWN0cyB0aGF0IG1heQogICAgYmUgaW52b2x2ZWQgaW4gYSBjeWNsZS4gIFNvLCBmb3IgZXhhbXBsZSwgaWYgYW4gaW50ZWdlciBpcyBkaXJlY3RseSByZWFjaGFibGUKICAgIGZyb20gYW4gYXJndW1lbnQsIHRoYXQgaW50ZWdlciBvYmplY3QgbWF5IG9yIG1heSBub3QgYXBwZWFyIGluIHRoZSByZXN1bHQgbGlzdC4KQEAgLTE0Miw4ICsxNDIsOCBAQAogCiAuLiBmdW5jdGlvbjo6IGlzX3RyYWNrZWQob2JqKQogCi0gICBSZXR1cm5zIFRydWUgaWYgdGhlIG9iamVjdCBpcyBjdXJyZW50bHkgdHJhY2tlZCBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IsCi0gICBGYWxzZSBvdGhlcndpc2UuICBBcyBhIGdlbmVyYWwgcnVsZSwgaW5zdGFuY2VzIG9mIGF0b21pYyB0eXBlcyBhcmVuJ3QKKyAgIFJldHVybnMgYGBUcnVlYGAgaWYgdGhlIG9iamVjdCBpcyBjdXJyZW50bHkgdHJhY2tlZCBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IsCisgICBgYEZhbHNlYGAgb3RoZXJ3aXNlLiAgQXMgYSBnZW5lcmFsIHJ1bGUsIGluc3RhbmNlcyBvZiBhdG9taWMgdHlwZXMgYXJlbid0CiAgICB0cmFja2VkIGFuZCBpbnN0YW5jZXMgb2Ygbm9uLWF0b21pYyB0eXBlcyAoY29udGFpbmVycywgdXNlci1kZWZpbmVkCiAgICBvYmplY3RzLi4uKSBhcmUuICBIb3dldmVyLCBzb21lIHR5cGUtc3BlY2lmaWMgb3B0aW1pemF0aW9ucyBjYW4gYmUgcHJlc2VudAogICAgaW4gb3JkZXIgdG8gc3VwcHJlc3MgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIGZvb3RwcmludCBvZiBzaW1wbGUgaW5zdGFuY2VzCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9nZGJtLnJzdCBiL0RvYy9saWJyYXJ5L2dkYm0ucnN0CmluZGV4IGFlYzIzZTYuLmYzNmJiMjggMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2dkYm0ucnN0CisrKyBiL0RvYy9saWJyYXJ5L2dkYm0ucnN0CkBAIC02LDkgKzYsOSBAQAogICAgOnN5bm9wc2lzOiBHTlUncyByZWludGVycHJldGF0aW9uIG9mIGRibS4KIAogLi4gbm90ZTo6Ci0gICBUaGUgOm1vZDpgZ2RibWAgbW9kdWxlIGhhcyBiZWVuIHJlbmFtZWQgdG8gOm1vZDpgZGJtLmdudWAgaW4gUHl0aG9uIDMuMC4gIFRoZQorICAgVGhlIDptb2Q6YGdkYm1gIG1vZHVsZSBoYXMgYmVlbiByZW5hbWVkIHRvIDptb2Q6YGRibS5nbnVgIGluIFB5dGhvbiAzLiAgVGhlCiAgICA6dGVybTpgMnRvM2AgdG9vbCB3aWxsIGF1dG9tYXRpY2FsbHkgYWRhcHQgaW1wb3J0cyB3aGVuIGNvbnZlcnRpbmcgeW91cgotICAgc291cmNlcyB0byAzLjAuCisgICBzb3VyY2VzIHRvIFB5dGhvbiAzLgogCiAKIC4uIGluZGV4OjogbW9kdWxlOiBkYm0KQEAgLTExNiw2ICsxMTYsMTEgQEAKICAgIHVud3JpdHRlbiBkYXRhIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGRpc2suCiAKIAorLi4gZnVuY3Rpb246OiBjbG9zZSgpCisKKyAgIENsb3NlIHRoZSBgYGdkYm1gYCBkYXRhYmFzZS4KKworCiAuLiBzZWVhbHNvOjoKIAogICAgTW9kdWxlIDptb2Q6YGFueWRibWAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2dldG9wdC5yc3QgYi9Eb2MvbGlicmFyeS9nZXRvcHQucnN0CmluZGV4IDExMzg1ZmYuLjJkZmIxMDIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2dldG9wdC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZ2V0b3B0LnJzdApAQCAtMTAsMTQgKzEwLDE1IEBACiAtLS0tLS0tLS0tLS0tLQogCiAuLiBub3RlOjoKKwogICAgVGhlIDptb2Q6YGdldG9wdGAgbW9kdWxlIGlzIGEgcGFyc2VyIGZvciBjb21tYW5kIGxpbmUgb3B0aW9ucyB3aG9zZSBBUEkgaXMKLSAgIGRlc2lnbmVkIHRvIGJlIGZhbWlsaWFyIHRvIHVzZXJzIG9mIHRoZSBDIDpjZnVuYzpgZ2V0b3B0YCBmdW5jdGlvbi4gVXNlcnMgd2hvCi0gICBhcmUgdW5mYW1pbGlhciB3aXRoIHRoZSBDIDpjZnVuYzpgZ2V0b3B0YCBmdW5jdGlvbiBvciB3aG8gd291bGQgbGlrZSB0byB3cml0ZQorICAgZGVzaWduZWQgdG8gYmUgZmFtaWxpYXIgdG8gdXNlcnMgb2YgdGhlIEMgOmM6ZnVuYzpgZ2V0b3B0YCBmdW5jdGlvbi4gVXNlcnMgd2hvCisgICBhcmUgdW5mYW1pbGlhciB3aXRoIHRoZSBDIDpjOmZ1bmM6YGdldG9wdGAgZnVuY3Rpb24gb3Igd2hvIHdvdWxkIGxpa2UgdG8gd3JpdGUKICAgIGxlc3MgY29kZSBhbmQgZ2V0IGJldHRlciBoZWxwIGFuZCBlcnJvciBtZXNzYWdlcyBzaG91bGQgY29uc2lkZXIgdXNpbmcgdGhlCiAgICA6bW9kOmBhcmdwYXJzZWAgbW9kdWxlIGluc3RlYWQuCiAKIFRoaXMgbW9kdWxlIGhlbHBzIHNjcmlwdHMgdG8gcGFyc2UgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgaW4gYGBzeXMuYXJndmBgLgotSXQgc3VwcG9ydHMgdGhlIHNhbWUgY29udmVudGlvbnMgYXMgdGhlIFVuaXggOmNmdW5jOmBnZXRvcHRgIGZ1bmN0aW9uIChpbmNsdWRpbmcKK0l0IHN1cHBvcnRzIHRoZSBzYW1lIGNvbnZlbnRpb25zIGFzIHRoZSBVbml4IDpjOmZ1bmM6YGdldG9wdGAgZnVuY3Rpb24gKGluY2x1ZGluZwogdGhlIHNwZWNpYWwgbWVhbmluZ3Mgb2YgYXJndW1lbnRzIG9mIHRoZSBmb3JtICdgYC1gYCcgYW5kICdgYC0tYGAnKS4gIExvbmcKIG9wdGlvbnMgc2ltaWxhciB0byB0aG9zZSBzdXBwb3J0ZWQgYnkgR05VIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFzIHdlbGwgdmlhIGFuCiBvcHRpb25hbCB0aGlyZCBhcmd1bWVudC4KQEAgLTMyLDExICszMywxMSBAQAogICAgYmUgcGFyc2VkLCB3aXRob3V0IHRoZSBsZWFkaW5nIHJlZmVyZW5jZSB0byB0aGUgcnVubmluZyBwcm9ncmFtLiBUeXBpY2FsbHksIHRoaXMKICAgIG1lYW5zIGBgc3lzLmFyZ3ZbMTpdYGAuICpvcHRpb25zKiBpcyB0aGUgc3RyaW5nIG9mIG9wdGlvbiBsZXR0ZXJzIHRoYXQgdGhlCiAgICBzY3JpcHQgd2FudHMgdG8gcmVjb2duaXplLCB3aXRoIG9wdGlvbnMgdGhhdCByZXF1aXJlIGFuIGFyZ3VtZW50IGZvbGxvd2VkIGJ5IGEKLSAgIGNvbG9uIChgYCc6J2BgOyBpLmUuLCB0aGUgc2FtZSBmb3JtYXQgdGhhdCBVbml4IDpjZnVuYzpgZ2V0b3B0YCB1c2VzKS4KKyAgIGNvbG9uIChgYCc6J2BgOyBpLmUuLCB0aGUgc2FtZSBmb3JtYXQgdGhhdCBVbml4IDpjOmZ1bmM6YGdldG9wdGAgdXNlcykuCiAKICAgIC4uIG5vdGU6OgogCi0gICAgICBVbmxpa2UgR05VIDpjZnVuYzpgZ2V0b3B0YCwgYWZ0ZXIgYSBub24tb3B0aW9uIGFyZ3VtZW50LCBhbGwgZnVydGhlcgorICAgICAgVW5saWtlIEdOVSA6YzpmdW5jOmBnZXRvcHRgLCBhZnRlciBhIG5vbi1vcHRpb24gYXJndW1lbnQsIGFsbCBmdXJ0aGVyCiAgICAgICBhcmd1bWVudHMgYXJlIGNvbnNpZGVyZWQgYWxzbyBub24tb3B0aW9ucy4gVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSB3YXkKICAgICAgIG5vbi1HTlUgVW5peCBzeXN0ZW1zIHdvcmsuCiAKQEAgLTEyNiw3ICsxMjcsNyBAQAogICAgZGVmIG1haW4oKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgImhvOnYiLCBbImhlbHAiLCAib3V0cHV0PSJdKQotICAgICAgIGV4Y2VwdCBnZXRvcHQuR2V0b3B0RXJyb3IsIGVycjoKKyAgICAgICBleGNlcHQgZ2V0b3B0LkdldG9wdEVycm9yIGFzIGVycjoKICAgICAgICAgICAgIyBwcmludCBoZWxwIGluZm9ybWF0aW9uIGFuZCBleGl0OgogICAgICAgICAgICBwcmludCBzdHIoZXJyKSAjIHdpbGwgcHJpbnQgc29tZXRoaW5nIGxpa2UgIm9wdGlvbiAtYSBub3QgcmVjb2duaXplZCIKICAgICAgICAgICAgdXNhZ2UoKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZ2wucnN0IGIvRG9jL2xpYnJhcnkvZ2wucnN0CmluZGV4IDBkMTg5ZGMuLjdlYTljZjMgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2dsLnJzdAorKysgYi9Eb2MvbGlicmFyeS9nbC5yc3QKQEAgLTgsNyArOCw3IEBACiAKIAogLi4gZGVwcmVjYXRlZDo6IDIuNgotICAgIFRoZSA6bW9kOmBnbGAgbW9kdWxlIGhhcyBiZWVuIGRlcHJlY2F0ZWQgZm9yIHJlbW92YWwgaW4gUHl0aG9uIDMuMC4KKyAgICBUaGUgOm1vZDpgZ2xgIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLgogCiAKIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgU2lsaWNvbiBHcmFwaGljcyAqR3JhcGhpY3MgTGlicmFyeSouIEl0IGlzCkBAIC0xNjgsNyArMTY4LDcgQEAKIAogCiAuLiBkZXByZWNhdGVkOjogMi42Ci0gICAgVGhlIDptb2Q6YERFVklDRWAgbW9kdWxlIGhhcyBiZWVuIGRlcHJlY2F0ZWQgZm9yIHJlbW92YWwgaW4gUHl0aG9uIDMuMC4KKyAgICBUaGUgOm1vZDpgREVWSUNFYCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4KIAogCiBUaGlzIG1vZHVsZXMgZGVmaW5lcyB0aGUgY29uc3RhbnRzIHVzZWQgYnkgdGhlIFNpbGljb24gR3JhcGhpY3MgKkdyYXBoaWNzCkBAIC0xODYsNyArMTg2LDcgQEAKIAogCiAuLiBkZXByZWNhdGVkOjogMi42Ci0gICAgVGhlIDptb2Q6YEdMYCBtb2R1bGUgaGFzIGJlZW4gZGVwcmVjYXRlZCBmb3IgcmVtb3ZhbCBpbiBQeXRob24gMy4wLgorICAgIFRoZSA6bW9kOmBHTGAgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuCiAKIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGNvbnN0YW50cyB1c2VkIGJ5IHRoZSBTaWxpY29uIEdyYXBoaWNzICpHcmFwaGljcyBMaWJyYXJ5KgogZnJvbSB0aGUgQyBoZWFkZXIgZmlsZSBgYDxnbC9nbC5oPmBgLiBSZWFkIHRoZSBtb2R1bGUgc291cmNlIGZpbGUgZm9yIGRldGFpbHMuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9nbG9iLnJzdCBiL0RvYy9saWJyYXJ5L2dsb2IucnN0CmluZGV4IDY4Y2M5ZjAuLjc1ZjY3YjkgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2dsb2IucnN0CisrKyBiL0RvYy9saWJyYXJ5L2dsb2IucnN0CkBAIC0xNiw4ICsxNiwxMyBAQAogYGAqYGAsIGBgP2BgLCBhbmQgY2hhcmFjdGVyIHJhbmdlcyBleHByZXNzZWQgd2l0aCBgYFtdYGAgd2lsbCBiZSBjb3JyZWN0bHkKIG1hdGNoZWQuICBUaGlzIGlzIGRvbmUgYnkgdXNpbmcgdGhlIDpmdW5jOmBvcy5saXN0ZGlyYCBhbmQKIDpmdW5jOmBmbm1hdGNoLmZubWF0Y2hgIGZ1bmN0aW9ucyBpbiBjb25jZXJ0LCBhbmQgbm90IGJ5IGFjdHVhbGx5IGludm9raW5nIGEKLXN1YnNoZWxsLiAgKEZvciB0aWxkZSBhbmQgc2hlbGwgdmFyaWFibGUgZXhwYW5zaW9uLCB1c2UKLTpmdW5jOmBvcy5wYXRoLmV4cGFuZHVzZXJgIGFuZCA6ZnVuYzpgb3MucGF0aC5leHBhbmR2YXJzYC4pCitzdWJzaGVsbC4gIE5vdGUgdGhhdCB1bmxpa2UgOmZ1bmM6YGZubWF0Y2guZm5tYXRjaGAsIDptb2Q6YGdsb2JgIHRyZWF0cworZmlsZW5hbWVzIGJlZ2lubmluZyB3aXRoIGEgZG90IChgYC5gYCkgYXMgc3BlY2lhbCBjYXNlcy4gIChGb3IgdGlsZGUgYW5kIHNoZWxsCit2YXJpYWJsZSBleHBhbnNpb24sIHVzZSA6ZnVuYzpgb3MucGF0aC5leHBhbmR1c2VyYCBhbmQKKzpmdW5jOmBvcy5wYXRoLmV4cGFuZHZhcnNgLikKKworRm9yIGEgbGl0ZXJhbCBtYXRjaCwgd3JhcCB0aGUgbWV0YS1jaGFyYWN0ZXJzIGluIGJyYWNrZXRzLgorRm9yIGV4YW1wbGUsIGBgJ1s/XSdgYCBtYXRjaGVzIHRoZSBjaGFyYWN0ZXIgYGAnPydgYC4KIAogCiAuLiBmdW5jdGlvbjo6IGdsb2IocGF0aG5hbWUpCkBAIC00OSw2ICs1NCwxNSBAQAogICAgPj4+IGdsb2IuZ2xvYignPy5naWYnKQogICAgWycxLmdpZiddCiAKK0lmIHRoZSBkaXJlY3RvcnkgY29udGFpbnMgZmlsZXMgc3RhcnRpbmcgd2l0aCBgYC5gYCB0aGV5IHdvbid0IGJlIG1hdGNoZWQgYnkKK2RlZmF1bHQuIEZvciBleGFtcGxlLCBjb25zaWRlciBhIGRpcmVjdG9yeSBjb250YWluaW5nIDpmaWxlOmBjYXJkLmdpZmAgYW5kCis6ZmlsZTpgLmNhcmQuZ2lmYDo6CisKKyAgID4+PiBpbXBvcnQgZ2xvYgorICAgPj4+IGdsb2IuZ2xvYignKi5naWYnKQorICAgWydjYXJkLmdpZiddCisgICA+Pj4gZ2xvYi5nbG9iKCcuYyonKQorICAgWycuY2FyZC5naWYnXQogCiAuLiBzZWVhbHNvOjoKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZ3ppcC5yc3QgYi9Eb2MvbGlicmFyeS9nemlwLnJzdAppbmRleCBlMDc0YmZjLi5lMjZmZTI4IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9nemlwLnJzdAorKysgYi9Eb2MvbGlicmFyeS9nemlwLnJzdApAQCAtMjIsOSArMjIsNiBAQAogOnByb2dyYW06YGd6aXBgIGFuZCA6cHJvZ3JhbTpgZ3VuemlwYCBwcm9ncmFtcywgc3VjaCAgYXMgdGhvc2UgcHJvZHVjZWQgYnkKIDpwcm9ncmFtOmBjb21wcmVzc2AgYW5kIDpwcm9ncmFtOmBwYWNrYCwgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBtb2R1bGUuCiAKLUZvciBvdGhlciBhcmNoaXZlIGZvcm1hdHMsIHNlZSB0aGUgOm1vZDpgYnoyYCwgOm1vZDpgemlwZmlsZWAsIGFuZAotOm1vZDpgdGFyZmlsZWAgbW9kdWxlcy4KLQogVGhlIG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgaXRlbXM6CiAKIApAQCAtMzYsMTIgKzMzLDEyIEBACiAgICBnaXZlbiBhIG5vbi10cml2aWFsIHZhbHVlLgogCiAgICBUaGUgbmV3IGNsYXNzIGluc3RhbmNlIGlzIGJhc2VkIG9uICpmaWxlb2JqKiwgd2hpY2ggY2FuIGJlIGEgcmVndWxhciBmaWxlLCBhCi0gICA6Y2xhc3M6YFN0cmluZ0lPYCBvYmplY3QsIG9yIGFueSBvdGhlciBvYmplY3Qgd2hpY2ggc2ltdWxhdGVzIGEgZmlsZS4gIEl0CisgICA6Y2xhc3M6YH5TdHJpbmdJTy5TdHJpbmdJT2Agb2JqZWN0LCBvciBhbnkgb3RoZXIgb2JqZWN0IHdoaWNoIHNpbXVsYXRlcyBhIGZpbGUuICBJdAogICAgZGVmYXVsdHMgdG8gYGBOb25lYGAsIGluIHdoaWNoIGNhc2UgKmZpbGVuYW1lKiBpcyBvcGVuZWQgdG8gcHJvdmlkZSBhIGZpbGUKICAgIG9iamVjdC4KIAogICAgV2hlbiAqZmlsZW9iaiogaXMgbm90IGBgTm9uZWBgLCB0aGUgKmZpbGVuYW1lKiBhcmd1bWVudCBpcyBvbmx5IHVzZWQgdG8gYmUKLSAgIGluY2x1ZGVkIGluIHRoZSA6cHJvZ3JhbTpgZ3ppcGAgZmlsZSBoZWFkZXIsIHdoaWNoIG1heSBpbmNsdWRlcyB0aGUgb3JpZ2luYWwKKyAgIGluY2x1ZGVkIGluIHRoZSA6cHJvZ3JhbTpgZ3ppcGAgZmlsZSBoZWFkZXIsIHdoaWNoIG1heSBpbmNsdWRlIHRoZSBvcmlnaW5hbAogICAgZmlsZW5hbWUgb2YgdGhlIHVuY29tcHJlc3NlZCBmaWxlLiAgSXQgZGVmYXVsdHMgdG8gdGhlIGZpbGVuYW1lIG9mICpmaWxlb2JqKiwgaWYKICAgIGRpc2Nlcm5pYmxlOyBvdGhlcndpc2UsIGl0IGRlZmF1bHRzIHRvIHRoZSBlbXB0eSBzdHJpbmcsIGFuZCBpbiB0aGlzIGNhc2UgdGhlCiAgICBvcmlnaW5hbCBmaWxlbmFtZSBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGhlYWRlci4KQEAgLTUyLDkgKzQ5LDEwIEBACiAgICBub3QgZ2l2ZW4sIHRoZSAnYicgZmxhZyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBtb2RlIHRvIGVuc3VyZSB0aGUgZmlsZSBpcyBvcGVuZWQKICAgIGluIGJpbmFyeSBtb2RlIGZvciBjcm9zcy1wbGF0Zm9ybSBwb3J0YWJpbGl0eS4KIAotICAgVGhlICpjb21wcmVzc2xldmVsKiBhcmd1bWVudCBpcyBhbiBpbnRlZ2VyIGZyb20gYGAxYGAgdG8gYGA5YGAgY29udHJvbGxpbmcgdGhlCi0gICBsZXZlbCBvZiBjb21wcmVzc2lvbjsgYGAxYGAgaXMgZmFzdGVzdCBhbmQgcHJvZHVjZXMgdGhlIGxlYXN0IGNvbXByZXNzaW9uLCBhbmQKLSAgIGBgOWBgIGlzIHNsb3dlc3QgYW5kIHByb2R1Y2VzIHRoZSBtb3N0IGNvbXByZXNzaW9uLiAgVGhlIGRlZmF1bHQgaXMgYGA5YGAuCisgICBUaGUgKmNvbXByZXNzbGV2ZWwqIGFyZ3VtZW50IGlzIGFuIGludGVnZXIgZnJvbSBgYDBgYCB0byBgYDlgYCBjb250cm9sbGluZworICAgdGhlIGxldmVsIG9mIGNvbXByZXNzaW9uOyBgYDFgYCBpcyBmYXN0ZXN0IGFuZCBwcm9kdWNlcyB0aGUgbGVhc3QKKyAgIGNvbXByZXNzaW9uLCBhbmQgYGA5YGAgaXMgc2xvd2VzdCBhbmQgcHJvZHVjZXMgdGhlIG1vc3QgY29tcHJlc3Npb24uIGBgMGBgCisgICBpcyBubyBjb21wcmVzc2lvbi4gVGhlIGRlZmF1bHQgaXMgYGA5YGAuCiAKICAgIFRoZSAqbXRpbWUqIGFyZ3VtZW50IGlzIGFuIG9wdGlvbmFsIG51bWVyaWMgdGltZXN0YW1wIHRvIGJlIHdyaXR0ZW4gdG8KICAgIHRoZSBzdHJlYW0gd2hlbiBjb21wcmVzc2luZy4gIEFsbCA6cHJvZ3JhbTpgZ3ppcGAgY29tcHJlc3NlZCBzdHJlYW1zIGFyZQpAQCAtNjcsOSArNjUsOSBAQAogCiAgICBDYWxsaW5nIGEgOmNsYXNzOmBHemlwRmlsZWAgb2JqZWN0J3MgOm1ldGg6YGNsb3NlYCBtZXRob2QgZG9lcyBub3QgY2xvc2UKICAgICpmaWxlb2JqKiwgc2luY2UgeW91IG1pZ2h0IHdpc2ggdG8gYXBwZW5kIG1vcmUgbWF0ZXJpYWwgYWZ0ZXIgdGhlIGNvbXByZXNzZWQKLSAgIGRhdGEuICBUaGlzIGFsc28gYWxsb3dzIHlvdSB0byBwYXNzIGEgOmNsYXNzOmBTdHJpbmdJT2Agb2JqZWN0IG9wZW5lZCBmb3IKKyAgIGRhdGEuICBUaGlzIGFsc28gYWxsb3dzIHlvdSB0byBwYXNzIGEgOmNsYXNzOmB+U3RyaW5nSU8uU3RyaW5nSU9gIG9iamVjdCBvcGVuZWQgZm9yCiAgICB3cml0aW5nIGFzICpmaWxlb2JqKiwgYW5kIHJldHJpZXZlIHRoZSByZXN1bHRpbmcgbWVtb3J5IGJ1ZmZlciB1c2luZyB0aGUKLSAgIDpjbGFzczpgU3RyaW5nSU9gIG9iamVjdCdzIDptZXRoOmBnZXR2YWx1ZWAgbWV0aG9kLgorICAgOmNsYXNzOmBTdHJpbmdJT2Agb2JqZWN0J3MgOm1ldGg6YH5TdHJpbmdJTy5TdHJpbmdJTy5nZXR2YWx1ZWAgbWV0aG9kLgogCiAgICA6Y2xhc3M6YEd6aXBGaWxlYCBzdXBwb3J0cyBpdGVyYXRpb24gYW5kIHRoZSA6a2V5d29yZDpgd2l0aGAgc3RhdGVtZW50LgogCkBAIC03OSw2ICs3Nyw5IEBACiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNwogICAgICAgU3VwcG9ydCBmb3IgemVyby1wYWRkZWQgZmlsZXMgd2FzIGFkZGVkLgogCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjcKKyAgICAgIFRoZSAqbXRpbWUqIGFyZ3VtZW50LgorCiAKIC4uIGZ1bmN0aW9uOjogb3BlbihmaWxlbmFtZVssIG1vZGVbLCBjb21wcmVzc2xldmVsXV0pCiAKQEAgLTk1LDcgKzk2LDcgQEAKIEV4YW1wbGUgb2YgaG93IHRvIHJlYWQgYSBjb21wcmVzc2VkIGZpbGU6OgogCiAgICBpbXBvcnQgZ3ppcAotICAgZiA9IGd6aXAub3BlbignL2hvbWUvam9lL2ZpbGUudHh0Lmd6JywgJ3JiJykKKyAgIGYgPSBnemlwLm9wZW4oJ2ZpbGUudHh0Lmd6JywgJ3JiJykKICAgIGZpbGVfY29udGVudCA9IGYucmVhZCgpCiAgICBmLmNsb3NlKCkKIApAQCAtMTAzLDE1ICsxMDQsMTUgQEAKIAogICAgaW1wb3J0IGd6aXAKICAgIGNvbnRlbnQgPSAiTG90cyBvZiBjb250ZW50IGhlcmUiCi0gICBmID0gZ3ppcC5vcGVuKCcvaG9tZS9qb2UvZmlsZS50eHQuZ3onLCAnd2InKQorICAgZiA9IGd6aXAub3BlbignZmlsZS50eHQuZ3onLCAnd2InKQogICAgZi53cml0ZShjb250ZW50KQogICAgZi5jbG9zZSgpCiAKIEV4YW1wbGUgb2YgaG93IHRvIEdaSVAgY29tcHJlc3MgYW4gZXhpc3RpbmcgZmlsZTo6CiAKICAgIGltcG9ydCBnemlwCi0gICBmX2luID0gb3BlbignL2hvbWUvam9lL2ZpbGUudHh0JywgJ3JiJykKLSAgIGZfb3V0ID0gZ3ppcC5vcGVuKCcvaG9tZS9qb2UvZmlsZS50eHQuZ3onLCAnd2InKQorICAgZl9pbiA9IG9wZW4oJ2ZpbGUudHh0JywgJ3JiJykKKyAgIGZfb3V0ID0gZ3ppcC5vcGVuKCdmaWxlLnR4dC5neicsICd3YicpCiAgICBmX291dC53cml0ZWxpbmVzKGZfaW4pCiAgICBmX291dC5jbG9zZSgpCiAgICBmX2luLmNsb3NlKCkKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2hhc2hsaWIucnN0IGIvRG9jL2xpYnJhcnkvaGFzaGxpYi5yc3QKaW5kZXggMDYzYWQ1OS4uZTNiNWViYiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvaGFzaGxpYi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvaGFzaGxpYi5yc3QKQEAgLTI1LDEyICsyNSwxNCBAQAogbW9kZXJuIHRlcm0gaXMgc2VjdXJlIGhhc2guCiAKIC4uIG5vdGU6OgotICAgSWYgeW91IHdhbnQgdGhlIGFkbGVyMzIgb3IgY3JjMzIgaGFzaCBmdW5jdGlvbnMgdGhleSBhcmUgYXZhaWxhYmxlIGluCisKKyAgIElmIHlvdSB3YW50IHRoZSBhZGxlcjMyIG9yIGNyYzMyIGhhc2ggZnVuY3Rpb25zLCB0aGV5IGFyZSBhdmFpbGFibGUgaW4KICAgIHRoZSA6bW9kOmB6bGliYCBtb2R1bGUuCiAKIC4uIHdhcm5pbmc6OgogCi0gICBTb21lIGFsZ29yaXRobXMgaGF2ZSBrbm93biBoYXNoIGNvbGxpc2lvbiB3ZWFrbmVzc2VzLCBzZWUgdGhlIEZBUSBhdCB0aGUgZW5kLgorICAgU29tZSBhbGdvcml0aG1zIGhhdmUga25vd24gaGFzaCBjb2xsaXNpb24gd2Vha25lc3NlcywgcmVmZXIgdG8gdGhlICJTZWUKKyAgIGFsc28iIHNlY3Rpb24gYXQgdGhlIGVuZC4KIAogVGhlcmUgaXMgb25lIGNvbnN0cnVjdG9yIG1ldGhvZCBuYW1lZCBmb3IgZWFjaCB0eXBlIG9mIDpkZm46YGhhc2hgLiAgQWxsIHJldHVybgogYSBoYXNoIG9iamVjdCB3aXRoIHRoZSBzYW1lIHNpbXBsZSBpbnRlcmZhY2UuIEZvciBleGFtcGxlOiB1c2UgOmZ1bmM6YHNoYTFgIHRvCkBAIC0xMDgsNyArMTEwLDYgQEAKICAgIG0udXBkYXRlKGIpYGAgaXMgZXF1aXZhbGVudCB0byBgYG0udXBkYXRlKGErYilgYC4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjcKLQogICAgICAgVGhlIFB5dGhvbiBHSUwgaXMgcmVsZWFzZWQgdG8gYWxsb3cgb3RoZXIgdGhyZWFkcyB0byBydW4gd2hpbGUKICAgICAgIGhhc2ggdXBkYXRlcyBvbiBkYXRhIGxhcmdlciB0aGFuIDIwNDggYnl0ZXMgaXMgdGFraW5nIHBsYWNlIHdoZW4KICAgICAgIHVzaW5nIGhhc2ggYWxnb3JpdGhtcyBzdXBwbGllZCBieSBPcGVuU1NMLgpAQCAtMTM0LDYgKzEzNSw0NiBAQAogICAgY29tcHV0ZSB0aGUgZGlnZXN0cyBvZiBzdHJpbmdzIHRoYXQgc2hhcmUgYSBjb21tb24gaW5pdGlhbCBzdWJzdHJpbmcuCiAKIAorS2V5IERlcml2YXRpb24gRnVuY3Rpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0tleSBkZXJpdmF0aW9uIGFuZCBrZXkgc3RyZXRjaGluZyBhbGdvcml0aG1zIGFyZSBkZXNpZ25lZCBmb3Igc2VjdXJlIHBhc3N3b3JkCitoYXNoaW5nLiBOYWl2ZSBhbGdvcml0aG1zIHN1Y2ggYXMgYGBzaGExKHBhc3N3b3JkKWBgIGFyZSBub3QgcmVzaXN0YW50IGFnYWluc3QKK2JydXRlLWZvcmNlIGF0dGFja3MuIEEgZ29vZCBwYXNzd29yZCBoYXNoaW5nIGZ1bmN0aW9uIG11c3QgYmUgdHVuYWJsZSwgc2xvdywgYW5kCitpbmNsdWRlIGEgYHNhbHQgPGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NhbHRfJTI4Y3J5cHRvZ3JhcGh5JTI5PmBfLgorCisKKy4uIGZ1bmN0aW9uOjogcGJrZGYyX2htYWMobmFtZSwgcGFzc3dvcmQsIHNhbHQsIHJvdW5kcywgZGtsZW49Tm9uZSkKKworICAgVGhlIGZ1bmN0aW9uIHByb3ZpZGVzIFBLQ1MjNSBwYXNzd29yZC1iYXNlZCBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbiAyLiBJdAorICAgdXNlcyBITUFDIGFzIHBzZXVkb3JhbmRvbSBmdW5jdGlvbi4KKworICAgVGhlIHN0cmluZyAqbmFtZSogaXMgdGhlIGRlc2lyZWQgbmFtZSBvZiB0aGUgaGFzaCBkaWdlc3QgYWxnb3JpdGhtIGZvcgorICAgSE1BQywgZS5nLiAnc2hhMScgb3IgJ3NoYTI1NicuICpwYXNzd29yZCogYW5kICpzYWx0KiBhcmUgaW50ZXJwcmV0ZWQgYXMKKyAgIGJ1ZmZlcnMgb2YgYnl0ZXMuIEFwcGxpY2F0aW9ucyBhbmQgbGlicmFyaWVzIHNob3VsZCBsaW1pdCAqcGFzc3dvcmQqIHRvCisgICBhIHNlbnNpYmxlIHZhbHVlIChlLmcuIDEwMjQpLiAqc2FsdCogc2hvdWxkIGJlIGFib3V0IDE2IG9yIG1vcmUgYnl0ZXMgZnJvbQorICAgYSBwcm9wZXIgc291cmNlLCBlLmcuIDpmdW5jOmBvcy51cmFuZG9tYC4KKworICAgVGhlIG51bWJlciBvZiAqcm91bmRzKiBzaG91bGQgYmUgY2hvc2VuIGJhc2VkIG9uIHRoZSBoYXNoIGFsZ29yaXRobSBhbmQKKyAgIGNvbXB1dGluZyBwb3dlci4gQXMgb2YgMjAxMywgYXQgbGVhc3QgMTAwLDAwMCByb3VuZHMgb2YgU0hBLTI1NiBpcyBzdWdnZXN0ZWQuCisKKyAgICpka2xlbiogaXMgdGhlIGxlbmd0aCBvZiB0aGUgZGVyaXZlZCBrZXkuIElmICpka2xlbiogaXMgYGBOb25lYGAgdGhlbiB0aGUKKyAgIGRpZ2VzdCBzaXplIG9mIHRoZSBoYXNoIGFsZ29yaXRobSAqbmFtZSogaXMgdXNlZCwgZS5nLiA2NCBmb3IgU0hBLTUxMi4KKworICAgPj4+IGltcG9ydCBoYXNobGliLCBiaW5hc2NpaQorICAgPj4+IGRrID0gaGFzaGxpYi5wYmtkZjJfaG1hYygnc2hhMjU2JywgYidwYXNzd29yZCcsIGInc2FsdCcsIDEwMDAwMCkKKyAgID4+PiBiaW5hc2NpaS5oZXhsaWZ5KGRrKQorICAgYicwMzk0YTJlZGUzMzJjOWExM2ViODJlOWIyNDYzMTYwNGMzMWRmOTc4YjRlMmYwZmJkMmM1NDk5NDRmOWQ3OWE1JworCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjcuOAorCisgICAuLiBub3RlOjoKKworICAgICAgQSBmYXN0IGltcGxlbWVudGF0aW9uIG9mICpwYmtkZjJfaG1hYyogaXMgYXZhaWxhYmxlIHdpdGggT3BlblNTTC4gIFRoZQorICAgICAgUHl0aG9uIGltcGxlbWVudGF0aW9uIHVzZXMgYW4gaW5saW5lIHZlcnNpb24gb2YgOm1vZDpgaG1hY2AuIEl0IGlzIGFib3V0CisgICAgICB0aHJlZSB0aW1lcyBzbG93ZXIgYW5kIGRvZXNuJ3QgcmVsZWFzZSB0aGUgR0lMLgorCisKIC4uIHNlZWFsc286OgogCiAgICBNb2R1bGUgOm1vZDpgaG1hY2AKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2hlYXBxLnJzdCBiL0RvYy9saWJyYXJ5L2hlYXBxLnJzdAppbmRleCBmMDcyM2I3Li5lOGFjZDZjIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9oZWFwcS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvaGVhcHEucnN0CkBAIC0yNjAsNyArMjYwLDcgQEAKIHRoZSBzb3J0IGlzIGdvaW5nIG9uLCBwcm92aWRlZCB0aGF0IHRoZSBpbnNlcnRlZCBpdGVtcyBhcmUgbm90ICJiZXR0ZXIiIHRoYW4gdGhlCiBsYXN0IDAndGggZWxlbWVudCB5b3UgZXh0cmFjdGVkLiAgVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBpbiBzaW11bGF0aW9uCiBjb250ZXh0cywgd2hlcmUgdGhlIHRyZWUgaG9sZHMgYWxsIGluY29taW5nIGV2ZW50cywgYW5kIHRoZSAid2luIiBjb25kaXRpb24KLW1lYW5zIHRoZSBzbWFsbGVzdCBzY2hlZHVsZWQgdGltZS4gIFdoZW4gYW4gZXZlbnQgc2NoZWR1bGUgb3RoZXIgZXZlbnRzIGZvcgorbWVhbnMgdGhlIHNtYWxsZXN0IHNjaGVkdWxlZCB0aW1lLiAgV2hlbiBhbiBldmVudCBzY2hlZHVsZXMgb3RoZXIgZXZlbnRzIGZvcgogZXhlY3V0aW9uLCB0aGV5IGFyZSBzY2hlZHVsZWQgaW50byB0aGUgZnV0dXJlLCBzbyB0aGV5IGNhbiBlYXNpbHkgZ28gaW50byB0aGUKIGhlYXAuICBTbywgYSBoZWFwIGlzIGEgZ29vZCBzdHJ1Y3R1cmUgZm9yIGltcGxlbWVudGluZyBzY2hlZHVsZXJzICh0aGlzIGlzIHdoYXQKIEkgdXNlZCBmb3IgbXkgTUlESSBzZXF1ZW5jZXIgOi0pLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvaG1hYy5yc3QgYi9Eb2MvbGlicmFyeS9obWFjLnJzdAppbmRleCA5NjhiN2E0Li4wOWU4MTlhIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9obWFjLnJzdAorKysgYi9Eb2MvbGlicmFyeS9obWFjLnJzdApAQCAtMjAsMzkgKzIwLDcxIEBACiAKICAgIFJldHVybiBhIG5ldyBobWFjIG9iamVjdC4gIElmICptc2cqIGlzIHByZXNlbnQsIHRoZSBtZXRob2QgY2FsbCBgYHVwZGF0ZShtc2cpYGAKICAgIGlzIG1hZGUuICpkaWdlc3Rtb2QqIGlzIHRoZSBkaWdlc3QgY29uc3RydWN0b3Igb3IgbW9kdWxlIGZvciB0aGUgSE1BQyBvYmplY3QgdG8KLSAgIHVzZS4gSXQgZGVmYXVsdHMgdG8gIHRoZSA6ZnVuYzpgaGFzaGxpYi5tZDVgIGNvbnN0cnVjdG9yLgorICAgdXNlLiBJdCBkZWZhdWx0cyB0byAgdGhlIDpkYXRhOmBoYXNobGliLm1kNWAgY29uc3RydWN0b3IuCiAKIAogQW4gSE1BQyBvYmplY3QgaGFzIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKIAotCi0uLiBtZXRob2Q6OiBobWFjLnVwZGF0ZShtc2cpCisuLiBtZXRob2Q6OiBITUFDLnVwZGF0ZShtc2cpCiAKICAgIFVwZGF0ZSB0aGUgaG1hYyBvYmplY3Qgd2l0aCB0aGUgc3RyaW5nICptc2cqLiAgUmVwZWF0ZWQgY2FsbHMgYXJlIGVxdWl2YWxlbnQgdG8KICAgIGEgc2luZ2xlIGNhbGwgd2l0aCB0aGUgY29uY2F0ZW5hdGlvbiBvZiBhbGwgdGhlIGFyZ3VtZW50czogYGBtLnVwZGF0ZShhKTsKICAgIG0udXBkYXRlKGIpYGAgaXMgZXF1aXZhbGVudCB0byBgYG0udXBkYXRlKGEgKyBiKWBgLgogCiAKLS4uIG1ldGhvZDo6IGhtYWMuZGlnZXN0KCkKKy4uIG1ldGhvZDo6IEhNQUMuZGlnZXN0KCkKIAogICAgUmV0dXJuIHRoZSBkaWdlc3Qgb2YgdGhlIHN0cmluZ3MgcGFzc2VkIHRvIHRoZSA6bWV0aDpgdXBkYXRlYCBtZXRob2Qgc28gZmFyLgogICAgVGhpcyBzdHJpbmcgd2lsbCBiZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlICpkaWdlc3Rfc2l6ZSogb2YgdGhlIGRpZ2VzdCBnaXZlbiB0bwogICAgdGhlIGNvbnN0cnVjdG9yLiAgSXQgbWF5IGNvbnRhaW4gbm9uLUFTQ0lJIGNoYXJhY3RlcnMsIGluY2x1ZGluZyBOVUwgYnl0ZXMuCiAKKyAgIC4uIHdhcm5pbmc6OgogCi0uLiBtZXRob2Q6OiBobWFjLmhleGRpZ2VzdCgpCisgICAgICBXaGVuIGNvbXBhcmluZyB0aGUgb3V0cHV0IG9mIDptZXRoOmBkaWdlc3RgIHRvIGFuIGV4dGVybmFsbHktc3VwcGxpZWQKKyAgICAgIGRpZ2VzdCBkdXJpbmcgYSB2ZXJpZmljYXRpb24gcm91dGluZSwgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHRoZQorICAgICAgOmZ1bmM6YGNvbXBhcmVfZGlnZXN0YCBmdW5jdGlvbiBpbnN0ZWFkIG9mIHRoZSBgYD09YGAgb3BlcmF0b3IKKyAgICAgIHRvIHJlZHVjZSB0aGUgdnVsbmVyYWJpbGl0eSB0byB0aW1pbmcgYXR0YWNrcy4KKworCisuLiBtZXRob2Q6OiBITUFDLmhleGRpZ2VzdCgpCiAKICAgIExpa2UgOm1ldGg6YGRpZ2VzdGAgZXhjZXB0IHRoZSBkaWdlc3QgaXMgcmV0dXJuZWQgYXMgYSBzdHJpbmcgdHdpY2UgdGhlIGxlbmd0aAogICAgY29udGFpbmluZyBvbmx5IGhleGFkZWNpbWFsIGRpZ2l0cy4gIFRoaXMgbWF5IGJlIHVzZWQgdG8gZXhjaGFuZ2UgdGhlIHZhbHVlCiAgICBzYWZlbHkgaW4gZW1haWwgb3Igb3RoZXIgbm9uLWJpbmFyeSBlbnZpcm9ubWVudHMuCiAKKyAgIC4uIHdhcm5pbmc6OgogCi0uLiBtZXRob2Q6OiBobWFjLmNvcHkoKQorICAgICAgV2hlbiBjb21wYXJpbmcgdGhlIG91dHB1dCBvZiA6bWV0aDpgaGV4ZGlnZXN0YCB0byBhbiBleHRlcm5hbGx5LXN1cHBsaWVkCisgICAgICBkaWdlc3QgZHVyaW5nIGEgdmVyaWZpY2F0aW9uIHJvdXRpbmUsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUKKyAgICAgIDpmdW5jOmBjb21wYXJlX2RpZ2VzdGAgZnVuY3Rpb24gaW5zdGVhZCBvZiB0aGUgYGA9PWBgIG9wZXJhdG9yCisgICAgICB0byByZWR1Y2UgdGhlIHZ1bG5lcmFiaWxpdHkgdG8gdGltaW5nIGF0dGFja3MuCisKKworLi4gbWV0aG9kOjogSE1BQy5jb3B5KCkKIAogICAgUmV0dXJuIGEgY29weSAoImNsb25lIikgb2YgdGhlIGhtYWMgb2JqZWN0LiAgVGhpcyBjYW4gYmUgdXNlZCB0byBlZmZpY2llbnRseQogICAgY29tcHV0ZSB0aGUgZGlnZXN0cyBvZiBzdHJpbmdzIHRoYXQgc2hhcmUgYSBjb21tb24gaW5pdGlhbCBzdWJzdHJpbmcuCiAKIAorVGhpcyBtb2R1bGUgYWxzbyBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGhlbHBlciBmdW5jdGlvbjoKKworLi4gZnVuY3Rpb246OiBjb21wYXJlX2RpZ2VzdChhLCBiKQorCisgICBSZXR1cm4gYGBhID09IGJgYC4gIFRoaXMgZnVuY3Rpb24gdXNlcyBhbiBhcHByb2FjaCBkZXNpZ25lZCB0byBwcmV2ZW50CisgICB0aW1pbmcgYW5hbHlzaXMgYnkgYXZvaWRpbmcgY29udGVudC1iYXNlZCBzaG9ydCBjaXJjdWl0aW5nIGJlaGF2aW91ciwKKyAgIG1ha2luZyBpdCBhcHByb3ByaWF0ZSBmb3IgY3J5cHRvZ3JhcGh5LiAgKmEqIGFuZCAqYiogbXVzdCBib3RoIGJlIG9mIHRoZQorICAgc2FtZSB0eXBlOiBlaXRoZXIgOmNsYXNzOmB1bmljb2RlYCBvciBhIDp0ZXJtOmBieXRlcy1saWtlIG9iamVjdGAuCisKKyAgIC4uIG5vdGU6OgorCisgICAgICBJZiAqYSogYW5kICpiKiBhcmUgb2YgZGlmZmVyZW50IGxlbmd0aHMsIG9yIGlmIGFuIGVycm9yIG9jY3VycywKKyAgICAgIGEgdGltaW5nIGF0dGFjayBjb3VsZCB0aGVvcmV0aWNhbGx5IHJldmVhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgICAgIHR5cGVzIGFuZCBsZW5ndGhzIG9mICphKiBhbmQgKmIqLS1idXQgbm90IHRoZWlyIHZhbHVlcy4KKworCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjcuNworCisKIC4uIHNlZWFsc286OgogCiAgICBNb2R1bGUgOm1vZDpgaGFzaGxpYmAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2h0bWxsaWIucnN0IGIvRG9jL2xpYnJhcnkvaHRtbGxpYi5yc3QKaW5kZXggZjI1M2QxMi4uOWU2OGY0NSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvaHRtbGxpYi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvaHRtbGxpYi5yc3QKQEAgLTYsNyArNiw3IEBACiAgICA6ZGVwcmVjYXRlZDoKIAogLi4gZGVwcmVjYXRlZDo6IDIuNgotICAgIFRoZSA6bW9kOmBodG1sbGliYCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4wLgorICAgIFRoZSA6bW9kOmBodG1sbGliYCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4KIAogCiAuLiBpbmRleDo6CkBAIC0xNjIsOCArMTYyLDggQEAKIC4uIG5vdGU6OgogCiAgICBUaGUgOm1vZDpgaHRtbGVudGl0eWRlZnNgIG1vZHVsZSBoYXMgYmVlbiByZW5hbWVkIHRvIDptb2Q6YGh0bWwuZW50aXRpZXNgIGluCi0gICBQeXRob24gMy4wLiAgVGhlIDp0ZXJtOmAydG8zYCB0b29sIHdpbGwgYXV0b21hdGljYWxseSBhZGFwdCBpbXBvcnRzIHdoZW4KLSAgIGNvbnZlcnRpbmcgeW91ciBzb3VyY2VzIHRvIDMuMC4KKyAgIFB5dGhvbiAzLiAgVGhlIDp0ZXJtOmAydG8zYCB0b29sIHdpbGwgYXV0b21hdGljYWxseSBhZGFwdCBpbXBvcnRzIHdoZW4KKyAgIGNvbnZlcnRpbmcgeW91ciBzb3VyY2VzIHRvIFB5dGhvbiAzLgogCiAqKlNvdXJjZSBjb2RlOioqIDpzb3VyY2U6YExpYi9odG1sZW50aXR5ZGVmcy5weWAKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvaHRtbHBhcnNlci5yc3QgYi9Eb2MvbGlicmFyeS9odG1scGFyc2VyLnJzdAppbmRleCBhYTEwNDk4Li4zYWJhNzRlIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9odG1scGFyc2VyLnJzdAorKysgYi9Eb2MvbGlicmFyeS9odG1scGFyc2VyLnJzdApAQCAtMjIsNyArMjIsNyBAQAogCiAtLS0tLS0tLS0tLS0tLQogCi1UaGlzIG1vZHVsZSBkZWZpbmVzIGEgY2xhc3MgOmNsYXNzOmBIVE1MUGFyc2VyYCB3aGljaCBzZXJ2ZXMgYXMgdGhlIGJhc2lzIGZvcgorVGhpcyBtb2R1bGUgZGVmaW5lcyBhIGNsYXNzIDpjbGFzczpgLkhUTUxQYXJzZXJgIHdoaWNoIHNlcnZlcyBhcyB0aGUgYmFzaXMgZm9yCiBwYXJzaW5nIHRleHQgZmlsZXMgZm9ybWF0dGVkIGluIEhUTUwgKEh5cGVyVGV4dCBNYXJrLXVwIExhbmd1YWdlKSBhbmQgWEhUTUwuCiBVbmxpa2UgdGhlIHBhcnNlciBpbiA6bW9kOmBodG1sbGliYCwgdGhpcyBwYXJzZXIgaXMgbm90IGJhc2VkIG9uIHRoZSBTR01MIHBhcnNlcgogaW4gOm1vZDpgc2dtbGxpYmAuCkBAIC0zMCwxMSArMzAsMTIgQEAKIAogLi4gY2xhc3M6OiBIVE1MUGFyc2VyKCkKIAotICAgVGhlIDpjbGFzczpgSFRNTFBhcnNlcmAgY2xhc3MgaXMgaW5zdGFudGlhdGVkIHdpdGhvdXQgYXJndW1lbnRzLgorICAgQW4gOmNsYXNzOmAuSFRNTFBhcnNlcmAgaW5zdGFuY2UgaXMgZmVkIEhUTUwgZGF0YSBhbmQgY2FsbHMgaGFuZGxlciBtZXRob2RzCisgICB3aGVuIHN0YXJ0IHRhZ3MsIGVuZCB0YWdzLCB0ZXh0LCBjb21tZW50cywgYW5kIG90aGVyIG1hcmt1cCBlbGVtZW50cyBhcmUKKyAgIGVuY291bnRlcmVkLiAgVGhlIHVzZXIgc2hvdWxkIHN1YmNsYXNzIDpjbGFzczpgLkhUTUxQYXJzZXJgIGFuZCBvdmVycmlkZSBpdHMKKyAgIG1ldGhvZHMgdG8gaW1wbGVtZW50IHRoZSBkZXNpcmVkIGJlaGF2aW9yLgogCi0gICBBbiA6Y2xhc3M6YEhUTUxQYXJzZXJgIGluc3RhbmNlIGlzIGZlZCBIVE1MIGRhdGEgYW5kIGNhbGxzIGhhbmRsZXIgZnVuY3Rpb25zIHdoZW4gdGFncwotICAgYmVnaW4gYW5kIGVuZC4gIFRoZSA6Y2xhc3M6YEhUTUxQYXJzZXJgIGNsYXNzIGlzIG1lYW50IHRvIGJlIG92ZXJyaWRkZW4gYnkgdGhlCi0gICB1c2VyIHRvIHByb3ZpZGUgYSBkZXNpcmVkIGJlaGF2aW9yLgorICAgVGhlIDpjbGFzczpgLkhUTUxQYXJzZXJgIGNsYXNzIGlzIGluc3RhbnRpYXRlZCB3aXRob3V0IGFyZ3VtZW50cy4KIAogICAgVW5saWtlIHRoZSBwYXJzZXIgaW4gOm1vZDpgaHRtbGxpYmAsIHRoaXMgcGFyc2VyIGRvZXMgbm90IGNoZWNrIHRoYXQgZW5kIHRhZ3MKICAgIG1hdGNoIHN0YXJ0IHRhZ3Mgb3IgY2FsbCB0aGUgZW5kLXRhZyBoYW5kbGVyIGZvciBlbGVtZW50cyB3aGljaCBhcmUgY2xvc2VkCkBAIC00MiwyOSArNDMsNjcgQEAKIAogQW4gZXhjZXB0aW9uIGlzIGRlZmluZWQgYXMgd2VsbDoKIAotCiAuLiBleGNlcHRpb246OiBIVE1MUGFyc2VFcnJvcgogCi0gICBFeGNlcHRpb24gcmFpc2VkIGJ5IHRoZSA6Y2xhc3M6YEhUTUxQYXJzZXJgIGNsYXNzIHdoZW4gaXQgZW5jb3VudGVycyBhbiBlcnJvcgotICAgd2hpbGUgcGFyc2luZy4gIFRoaXMgZXhjZXB0aW9uIHByb3ZpZGVzIHRocmVlIGF0dHJpYnV0ZXM6IDphdHRyOmBtc2dgIGlzIGEgYnJpZWYKLSAgIG1lc3NhZ2UgZXhwbGFpbmluZyB0aGUgZXJyb3IsIDphdHRyOmBsaW5lbm9gIGlzIHRoZSBudW1iZXIgb2YgdGhlIGxpbmUgb24gd2hpY2gKLSAgIHRoZSBicm9rZW4gY29uc3RydWN0IHdhcyBkZXRlY3RlZCwgYW5kIDphdHRyOmBvZmZzZXRgIGlzIHRoZSBudW1iZXIgb2YKKyAgIDpjbGFzczpgLkhUTUxQYXJzZXJgIGlzIGFibGUgdG8gaGFuZGxlIGJyb2tlbiBtYXJrdXAsIGJ1dCBpbiBzb21lIGNhc2VzIGl0CisgICBtaWdodCByYWlzZSB0aGlzIGV4Y2VwdGlvbiB3aGVuIGl0IGVuY291bnRlcnMgYW4gZXJyb3Igd2hpbGUgcGFyc2luZy4KKyAgIFRoaXMgZXhjZXB0aW9uIHByb3ZpZGVzIHRocmVlIGF0dHJpYnV0ZXM6IDphdHRyOmBtc2dgIGlzIGEgYnJpZWYKKyAgIG1lc3NhZ2UgZXhwbGFpbmluZyB0aGUgZXJyb3IsIDphdHRyOmBsaW5lbm9gIGlzIHRoZSBudW1iZXIgb2YgdGhlIGxpbmUgb24KKyAgIHdoaWNoIHRoZSBicm9rZW4gY29uc3RydWN0IHdhcyBkZXRlY3RlZCwgYW5kIDphdHRyOmBvZmZzZXRgIGlzIHRoZSBudW1iZXIgb2YKICAgIGNoYXJhY3RlcnMgaW50byB0aGUgbGluZSBhdCB3aGljaCB0aGUgY29uc3RydWN0IHN0YXJ0cy4KIAotOmNsYXNzOmBIVE1MUGFyc2VyYCBpbnN0YW5jZXMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisKK0V4YW1wbGUgSFRNTCBQYXJzZXIgQXBwbGljYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQXMgYSBiYXNpYyBleGFtcGxlLCBiZWxvdyBpcyBhIHNpbXBsZSBIVE1MIHBhcnNlciB0aGF0IHVzZXMgdGhlCis6Y2xhc3M6YC5IVE1MUGFyc2VyYCBjbGFzcyB0byBwcmludCBvdXQgc3RhcnQgdGFncywgZW5kIHRhZ3MgYW5kIGRhdGEKK2FzIHRoZXkgYXJlIGVuY291bnRlcmVkOjoKKworICAgZnJvbSBIVE1MUGFyc2VyIGltcG9ydCBIVE1MUGFyc2VyCisKKyAgICMgY3JlYXRlIGEgc3ViY2xhc3MgYW5kIG92ZXJyaWRlIHRoZSBoYW5kbGVyIG1ldGhvZHMKKyAgIGNsYXNzIE15SFRNTFBhcnNlcihIVE1MUGFyc2VyKToKKyAgICAgICBkZWYgaGFuZGxlX3N0YXJ0dGFnKHNlbGYsIHRhZywgYXR0cnMpOgorICAgICAgICAgICBwcmludCAiRW5jb3VudGVyZWQgYSBzdGFydCB0YWc6IiwgdGFnCisgICAgICAgZGVmIGhhbmRsZV9lbmR0YWcoc2VsZiwgdGFnKToKKyAgICAgICAgICAgcHJpbnQgIkVuY291bnRlcmVkIGFuIGVuZCB0YWcgOiIsIHRhZworICAgICAgIGRlZiBoYW5kbGVfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgICAgcHJpbnQgIkVuY291bnRlcmVkIHNvbWUgZGF0YSAgOiIsIGRhdGEKKworICAgIyBpbnN0YW50aWF0ZSB0aGUgcGFyc2VyIGFuZCBmZWQgaXQgc29tZSBIVE1MCisgICBwYXJzZXIgPSBNeUhUTUxQYXJzZXIoKQorICAgcGFyc2VyLmZlZWQoJzxodG1sPjxoZWFkPjx0aXRsZT5UZXN0PC90aXRsZT48L2hlYWQ+JworICAgICAgICAgICAgICAgJzxib2R5PjxoMT5QYXJzZSBtZSE8L2gxPjwvYm9keT48L2h0bWw+JykKKworVGhlIG91dHB1dCB3aWxsIHRoZW4gYmU6OgorCisgICBFbmNvdW50ZXJlZCBhIHN0YXJ0IHRhZzogaHRtbAorICAgRW5jb3VudGVyZWQgYSBzdGFydCB0YWc6IGhlYWQKKyAgIEVuY291bnRlcmVkIGEgc3RhcnQgdGFnOiB0aXRsZQorICAgRW5jb3VudGVyZWQgc29tZSBkYXRhICA6IFRlc3QKKyAgIEVuY291bnRlcmVkIGFuIGVuZCB0YWcgOiB0aXRsZQorICAgRW5jb3VudGVyZWQgYW4gZW5kIHRhZyA6IGhlYWQKKyAgIEVuY291bnRlcmVkIGEgc3RhcnQgdGFnOiBib2R5CisgICBFbmNvdW50ZXJlZCBhIHN0YXJ0IHRhZzogaDEKKyAgIEVuY291bnRlcmVkIHNvbWUgZGF0YSAgOiBQYXJzZSBtZSEKKyAgIEVuY291bnRlcmVkIGFuIGVuZCB0YWcgOiBoMQorICAgRW5jb3VudGVyZWQgYW4gZW5kIHRhZyA6IGJvZHkKKyAgIEVuY291bnRlcmVkIGFuIGVuZCB0YWcgOiBodG1sCiAKIAotLi4gbWV0aG9kOjogSFRNTFBhcnNlci5yZXNldCgpCis6Y2xhc3M6YC5IVE1MUGFyc2VyYCBNZXRob2RzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSAgIFJlc2V0IHRoZSBpbnN0YW5jZS4gIExvc2VzIGFsbCB1bnByb2Nlc3NlZCBkYXRhLiAgVGhpcyBpcyBjYWxsZWQgaW1wbGljaXRseSBhdAotICAgaW5zdGFudGlhdGlvbiB0aW1lLgorOmNsYXNzOmAuSFRNTFBhcnNlcmAgaW5zdGFuY2VzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgogCiAKIC4uIG1ldGhvZDo6IEhUTUxQYXJzZXIuZmVlZChkYXRhKQogCiAgICBGZWVkIHNvbWUgdGV4dCB0byB0aGUgcGFyc2VyLiAgSXQgaXMgcHJvY2Vzc2VkIGluc29mYXIgYXMgaXQgY29uc2lzdHMgb2YKICAgIGNvbXBsZXRlIGVsZW1lbnRzOyBpbmNvbXBsZXRlIGRhdGEgaXMgYnVmZmVyZWQgdW50aWwgbW9yZSBkYXRhIGlzIGZlZCBvcgotICAgOm1ldGg6YGNsb3NlYCBpcyBjYWxsZWQuCisgICA6bWV0aDpgY2xvc2VgIGlzIGNhbGxlZC4gICpkYXRhKiBjYW4gYmUgZWl0aGVyIDpjbGFzczpgdW5pY29kZWAgb3IKKyAgIDpjbGFzczpgc3RyYCwgYnV0IHBhc3NpbmcgOmNsYXNzOmB1bmljb2RlYCBpcyBhZHZpc2VkLgogCiAKIC4uIG1ldGhvZDo6IEhUTUxQYXJzZXIuY2xvc2UoKQpAQCAtNzIsNyArMTExLDEzIEBACiAgICBGb3JjZSBwcm9jZXNzaW5nIG9mIGFsbCBidWZmZXJlZCBkYXRhIGFzIGlmIGl0IHdlcmUgZm9sbG93ZWQgYnkgYW4gZW5kLW9mLWZpbGUKICAgIG1hcmsuICBUaGlzIG1ldGhvZCBtYXkgYmUgcmVkZWZpbmVkIGJ5IGEgZGVyaXZlZCBjbGFzcyB0byBkZWZpbmUgYWRkaXRpb25hbAogICAgcHJvY2Vzc2luZyBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCwgYnV0IHRoZSByZWRlZmluZWQgdmVyc2lvbiBzaG91bGQgYWx3YXlzIGNhbGwKLSAgIHRoZSA6Y2xhc3M6YEhUTUxQYXJzZXJgIGJhc2UgY2xhc3MgbWV0aG9kIDptZXRoOmBjbG9zZWAuCisgICB0aGUgOmNsYXNzOmAuSFRNTFBhcnNlcmAgYmFzZSBjbGFzcyBtZXRob2QgOm1ldGg6YGNsb3NlYC4KKworCisuLiBtZXRob2Q6OiBIVE1MUGFyc2VyLnJlc2V0KCkKKworICAgUmVzZXQgdGhlIGluc3RhbmNlLiAgTG9zZXMgYWxsIHVucHJvY2Vzc2VkIGRhdGEuICBUaGlzIGlzIGNhbGxlZCBpbXBsaWNpdGx5IGF0CisgICBpbnN0YW50aWF0aW9uIHRpbWUuCiAKIAogLi4gbWV0aG9kOjogSFRNTFBhcnNlci5nZXRwb3MoKQpAQCAtODgsMjIgKzEzMywzNCBAQAogICAgYXR0cmlidXRlcyBjYW4gYmUgcHJlc2VydmVkLCBldGMuKS4KIAogCitUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIGNhbGxlZCB3aGVuIGRhdGEgb3IgbWFya3VwIGVsZW1lbnRzIGFyZSBlbmNvdW50ZXJlZAorYW5kIHRoZXkgYXJlIG1lYW50IHRvIGJlIG92ZXJyaWRkZW4gaW4gYSBzdWJjbGFzcy4gIFRoZSBiYXNlIGNsYXNzCitpbXBsZW1lbnRhdGlvbnMgZG8gbm90aGluZyAoZXhjZXB0IGZvciA6bWV0aDpgfkhUTUxQYXJzZXIuaGFuZGxlX3N0YXJ0ZW5kdGFnYCk6CisKKwogLi4gbWV0aG9kOjogSFRNTFBhcnNlci5oYW5kbGVfc3RhcnR0YWcodGFnLCBhdHRycykKIAotICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIGhhbmRsZSB0aGUgc3RhcnQgb2YgYSB0YWcuICBJdCBpcyBpbnRlbmRlZCB0byBiZQotICAgb3ZlcnJpZGRlbiBieSBhIGRlcml2ZWQgY2xhc3M7IHRoZSBiYXNlIGNsYXNzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KKyAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBoYW5kbGUgdGhlIHN0YXJ0IG9mIGEgdGFnIChlLmcuIGBgPGRpdiBpZD0ibWFpbiI+YGApLgogCiAgICBUaGUgKnRhZyogYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlIHRhZyBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4gVGhlICphdHRycyoKICAgIGFyZ3VtZW50IGlzIGEgbGlzdCBvZiBgYChuYW1lLCB2YWx1ZSlgYCBwYWlycyBjb250YWluaW5nIHRoZSBhdHRyaWJ1dGVzIGZvdW5kCiAgICBpbnNpZGUgdGhlIHRhZydzIGBgPD5gYCBicmFja2V0cy4gIFRoZSAqbmFtZSogd2lsbCBiZSB0cmFuc2xhdGVkIHRvIGxvd2VyIGNhc2UsCiAgICBhbmQgcXVvdGVzIGluIHRoZSAqdmFsdWUqIGhhdmUgYmVlbiByZW1vdmVkLCBhbmQgY2hhcmFjdGVyIGFuZCBlbnRpdHkgcmVmZXJlbmNlcwotICAgaGF2ZSBiZWVuIHJlcGxhY2VkLiAgRm9yIGluc3RhbmNlLCBmb3IgdGhlIHRhZyBgYDxBCi0gICBIUkVGPSJodHRwOi8vd3d3LmN3aS5ubC8iPmBgLCB0aGlzIG1ldGhvZCB3b3VsZCBiZSBjYWxsZWQgYXMKLSAgIGBgaGFuZGxlX3N0YXJ0dGFnKCdhJywgWygnaHJlZicsICdodHRwOi8vd3d3LmN3aS5ubC8nKV0pYGAuCisgICBoYXZlIGJlZW4gcmVwbGFjZWQuCisKKyAgIEZvciBpbnN0YW5jZSwgZm9yIHRoZSB0YWcgYGA8QSBIUkVGPSJodHRwOi8vd3d3LmN3aS5ubC8iPmBgLCB0aGlzIG1ldGhvZAorICAgd291bGQgYmUgY2FsbGVkIGFzIGBgaGFuZGxlX3N0YXJ0dGFnKCdhJywgWygnaHJlZicsICdodHRwOi8vd3d3LmN3aS5ubC8nKV0pYGAuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi42Ci0gICAgICBBbGwgZW50aXR5IHJlZmVyZW5jZXMgZnJvbSA6bW9kOmBodG1sZW50aXR5ZGVmc2AgYXJlIG5vdyByZXBsYWNlZCBpbiB0aGUgYXR0cmlidXRlCi0gICAgICB2YWx1ZXMuCisgICAgICBBbGwgZW50aXR5IHJlZmVyZW5jZXMgZnJvbSA6bW9kOmBodG1sZW50aXR5ZGVmc2AgYXJlIG5vdyByZXBsYWNlZCBpbiB0aGUKKyAgICAgIGF0dHJpYnV0ZSB2YWx1ZXMuCisKKworLi4gbWV0aG9kOjogSFRNTFBhcnNlci5oYW5kbGVfZW5kdGFnKHRhZykKKworICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIGhhbmRsZSB0aGUgZW5kIHRhZyBvZiBhbiBlbGVtZW50IChlLmcuIGBgPC9kaXY+YGApLgorCisgICBUaGUgKnRhZyogYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlIHRhZyBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KIAogCiAuLiBtZXRob2Q6OiBIVE1MUGFyc2VyLmhhbmRsZV9zdGFydGVuZHRhZyh0YWcsIGF0dHJzKQpAQCAtMTE0LDk0ICsxNzEsMTc1IEBACiAgICBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgY2FsbHMgOm1ldGg6YGhhbmRsZV9zdGFydHRhZ2AgYW5kIDptZXRoOmBoYW5kbGVfZW5kdGFnYC4KIAogCi0uLiBtZXRob2Q6OiBIVE1MUGFyc2VyLmhhbmRsZV9lbmR0YWcodGFnKQotCi0gICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gaGFuZGxlIHRoZSBlbmQgdGFnIG9mIGFuIGVsZW1lbnQuICBJdCBpcyBpbnRlbmRlZCB0byBiZQotICAgb3ZlcnJpZGRlbiBieSBhIGRlcml2ZWQgY2xhc3M7IHRoZSBiYXNlIGNsYXNzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gIFRoZQotICAgKnRhZyogYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlIHRhZyBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KLQotCiAuLiBtZXRob2Q6OiBIVE1MUGFyc2VyLmhhbmRsZV9kYXRhKGRhdGEpCiAKLSAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBwcm9jZXNzIGFyYml0cmFyeSBkYXRhIChlLmcuIHRoZSBjb250ZW50IG9mCi0gICBgYDxzY3JpcHQ+Li4uPC9zY3JpcHQ+YGAgYW5kIGBgPHN0eWxlPi4uLjwvc3R5bGU+YGApLiAgSXQgaXMgaW50ZW5kZWQgdG8gYmUKLSAgIG92ZXJyaWRkZW4gYnkgYSBkZXJpdmVkIGNsYXNzOyB0aGUgYmFzZSBjbGFzcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCi0KLQotLi4gbWV0aG9kOjogSFRNTFBhcnNlci5oYW5kbGVfY2hhcnJlZihuYW1lKQotCi0gICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gcHJvY2VzcyBhIGNoYXJhY3RlciByZWZlcmVuY2Ugb2YgdGhlIGZvcm0gYGAmI3JlZjtgYC4KLSAgIEl0IGlzIGludGVuZGVkIHRvIGJlIG92ZXJyaWRkZW4gYnkgYSBkZXJpdmVkIGNsYXNzOyB0aGUgYmFzZSBjbGFzcwotICAgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgorICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIHByb2Nlc3MgYXJiaXRyYXJ5IGRhdGEgKGUuZy4gdGV4dCBub2RlcyBhbmQgdGhlCisgICBjb250ZW50IG9mIGBgPHNjcmlwdD4uLi48L3NjcmlwdD5gYCBhbmQgYGA8c3R5bGU+Li4uPC9zdHlsZT5gYCkuCiAKIAogLi4gbWV0aG9kOjogSFRNTFBhcnNlci5oYW5kbGVfZW50aXR5cmVmKG5hbWUpCiAKLSAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBwcm9jZXNzIGEgZ2VuZXJhbCBlbnRpdHkgcmVmZXJlbmNlIG9mIHRoZSBmb3JtCi0gICBgYCZuYW1lO2BgIHdoZXJlICpuYW1lKiBpcyBhbiBnZW5lcmFsIGVudGl0eSByZWZlcmVuY2UuICBJdCBpcyBpbnRlbmRlZCB0byBiZQotICAgb3ZlcnJpZGRlbiBieSBhIGRlcml2ZWQgY2xhc3M7IHRoZSBiYXNlIGNsYXNzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KKyAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBwcm9jZXNzIGEgbmFtZWQgY2hhcmFjdGVyIHJlZmVyZW5jZSBvZiB0aGUgZm9ybQorICAgYGAmbmFtZTtgYCAoZS5nLiBgYCZndDtgYCksIHdoZXJlICpuYW1lKiBpcyBhIGdlbmVyYWwgZW50aXR5IHJlZmVyZW5jZQorICAgKGUuZy4gYGAnZ3QnYGApLgorCisKKy4uIG1ldGhvZDo6IEhUTUxQYXJzZXIuaGFuZGxlX2NoYXJyZWYobmFtZSkKKworICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIHByb2Nlc3MgZGVjaW1hbCBhbmQgaGV4YWRlY2ltYWwgbnVtZXJpYyBjaGFyYWN0ZXIKKyAgIHJlZmVyZW5jZXMgb2YgdGhlIGZvcm0gYGAmI05OTjtgYCBhbmQgYGAmI3hOTk47YGAuICBGb3IgZXhhbXBsZSwgdGhlIGRlY2ltYWwKKyAgIGVxdWl2YWxlbnQgZm9yIGBgJmd0O2BgIGlzIGBgJiM2MjtgYCwgd2hlcmVhcyB0aGUgaGV4YWRlY2ltYWwgaXMgYGAmI3gzRTtgYDsKKyAgIGluIHRoaXMgY2FzZSB0aGUgbWV0aG9kIHdpbGwgcmVjZWl2ZSBgYCc2MidgYCBvciBgYCd4M0UnYGAuCiAKIAogLi4gbWV0aG9kOjogSFRNTFBhcnNlci5oYW5kbGVfY29tbWVudChkYXRhKQogCi0gICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIGNvbW1lbnQgaXMgZW5jb3VudGVyZWQuICBUaGUgKmNvbW1lbnQqIGFyZ3VtZW50IGlzCi0gICBhIHN0cmluZyBjb250YWluaW5nIHRoZSB0ZXh0IGJldHdlZW4gdGhlIGBgLS1gYCBhbmQgYGAtLWBgIGRlbGltaXRlcnMsIGJ1dCBub3QKLSAgIHRoZSBkZWxpbWl0ZXJzIHRoZW1zZWx2ZXMuICBGb3IgZXhhbXBsZSwgdGhlIGNvbW1lbnQgYGA8IS0tdGV4dC0tPmBgIHdpbGwgY2F1c2UKLSAgIHRoaXMgbWV0aG9kIHRvIGJlIGNhbGxlZCB3aXRoIHRoZSBhcmd1bWVudCBgYCd0ZXh0J2BgLiAgSXQgaXMgaW50ZW5kZWQgdG8gYmUKLSAgIG92ZXJyaWRkZW4gYnkgYSBkZXJpdmVkIGNsYXNzOyB0aGUgYmFzZSBjbGFzcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCisgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIGNvbW1lbnQgaXMgZW5jb3VudGVyZWQgKGUuZy4gYGA8IS0tY29tbWVudC0tPmBgKS4KKworICAgRm9yIGV4YW1wbGUsIHRoZSBjb21tZW50IGBgPCEtLSBjb21tZW50IC0tPmBgIHdpbGwgY2F1c2UgdGhpcyBtZXRob2QgdG8gYmUKKyAgIGNhbGxlZCB3aXRoIHRoZSBhcmd1bWVudCBgYCcgY29tbWVudCAnYGAuCisKKyAgIFRoZSBjb250ZW50IG9mIEludGVybmV0IEV4cGxvcmVyIGNvbmRpdGlvbmFsIGNvbW1lbnRzIChjb25kY29tcykgd2lsbCBhbHNvIGJlCisgICBzZW50IHRvIHRoaXMgbWV0aG9kLCBzbywgZm9yIGBgPCEtLVtpZiBJRSA5XT5JRTktc3BlY2lmaWMgY29udGVudDwhW2VuZGlmXS0tPmBgLAorICAgdGhpcyBtZXRob2Qgd2lsbCByZWNlaXZlIGBgJ1tpZiBJRSA5XT5JRS1zcGVjaWZpYyBjb250ZW50PCFbZW5kaWZdJ2BgLgogCiAKIC4uIG1ldGhvZDo6IEhUTUxQYXJzZXIuaGFuZGxlX2RlY2woZGVjbCkKIAotICAgTWV0aG9kIGNhbGxlZCB3aGVuIGFuIFNHTUwgYGBkb2N0eXBlYGAgZGVjbGFyYXRpb24gaXMgcmVhZCBieSB0aGUgcGFyc2VyLgorICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIGhhbmRsZSBhbiBIVE1MIGRvY3R5cGUgZGVjbGFyYXRpb24gKGUuZy4KKyAgIGBgPCFET0NUWVBFIGh0bWw+YGApLgorCiAgICBUaGUgKmRlY2wqIHBhcmFtZXRlciB3aWxsIGJlIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGRlY2xhcmF0aW9uIGluc2lkZQotICAgdGhlIGBgPCEuLi4+YGAgbWFya3VwLiAgSXQgaXMgaW50ZW5kZWQgdG8gYmUgb3ZlcnJpZGRlbiBieSBhIGRlcml2ZWQgY2xhc3M7Ci0gICB0aGUgYmFzZSBjbGFzcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCi0KLQotLi4gbWV0aG9kOjogSFRNTFBhcnNlci51bmtub3duX2RlY2woZGF0YSkKLQotICAgTWV0aG9kIGNhbGxlZCB3aGVuIGFuIHVucmVjb2duaXplZCBTR01MIGRlY2xhcmF0aW9uIGlzIHJlYWQgYnkgdGhlIHBhcnNlci4KLSAgIFRoZSAqZGF0YSogcGFyYW1ldGVyIHdpbGwgYmUgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgZGVjbGFyYXRpb24gaW5zaWRlCi0gICB0aGUgYGA8IS4uLj5gYCBtYXJrdXAuICBJdCBpcyBzb21ldGltZXMgdXNlZnVsIHRvIGJlIG92ZXJyaWRkZW4gYnkgYQotICAgZGVyaXZlZCBjbGFzczsgdGhlIGJhc2UgY2xhc3MgaW1wbGVtZW50YXRpb24gdGhyb3dzIGFuIDpleGM6YEhUTUxQYXJzZUVycm9yYC4KKyAgIHRoZSBgYDwhLi4uPmBgIG1hcmt1cCAoZS5nLiBgYCdET0NUWVBFIGh0bWwnYGApLgogCiAKIC4uIG1ldGhvZDo6IEhUTUxQYXJzZXIuaGFuZGxlX3BpKGRhdGEpCiAKLSAgIE1ldGhvZCBjYWxsZWQgd2hlbiBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gaXMgZW5jb3VudGVyZWQuICBUaGUgKmRhdGEqCi0gICBwYXJhbWV0ZXIgd2lsbCBjb250YWluIHRoZSBlbnRpcmUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4gRm9yIGV4YW1wbGUsIGZvciB0aGUKKyAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBpcyBlbmNvdW50ZXJlZC4gIFRoZSAqZGF0YSoKKyAgIHBhcmFtZXRlciB3aWxsIGNvbnRhaW4gdGhlIGVudGlyZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLiAgRm9yIGV4YW1wbGUsIGZvciB0aGUKICAgIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYGA8P3Byb2MgY29sb3I9J3JlZCc+YGAsIHRoaXMgbWV0aG9kIHdvdWxkIGJlIGNhbGxlZCBhcwotICAgYGBoYW5kbGVfcGkoInByb2MgY29sb3I9J3JlZCciKWBgLiAgSXQgaXMgaW50ZW5kZWQgdG8gYmUgb3ZlcnJpZGRlbiBieSBhIGRlcml2ZWQKLSAgIGNsYXNzOyB0aGUgYmFzZSBjbGFzcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCisgICBgYGhhbmRsZV9waSgicHJvYyBjb2xvcj0ncmVkJyIpYGAuCiAKICAgIC4uIG5vdGU6OgogCi0gICAgICBUaGUgOmNsYXNzOmBIVE1MUGFyc2VyYCBjbGFzcyB1c2VzIHRoZSBTR01MIHN5bnRhY3RpYyBydWxlcyBmb3IgcHJvY2Vzc2luZworICAgICAgVGhlIDpjbGFzczpgLkhUTUxQYXJzZXJgIGNsYXNzIHVzZXMgdGhlIFNHTUwgc3ludGFjdGljIHJ1bGVzIGZvciBwcm9jZXNzaW5nCiAgICAgICBpbnN0cnVjdGlvbnMuICBBbiBYSFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHVzaW5nIHRoZSB0cmFpbGluZyBgYCc/J2BgIHdpbGwKICAgICAgIGNhdXNlIHRoZSBgYCc/J2BgIHRvIGJlIGluY2x1ZGVkIGluICpkYXRhKi4KIAogCi0uLiBfaHRtbHBhcnNlci1leGFtcGxlOgorLi4gbWV0aG9kOjogSFRNTFBhcnNlci51bmtub3duX2RlY2woZGF0YSkKIAotRXhhbXBsZSBIVE1MIFBhcnNlciBBcHBsaWNhdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYW4gdW5yZWNvZ25pemVkIGRlY2xhcmF0aW9uIGlzIHJlYWQgYnkgdGhlIHBhcnNlci4KIAotQXMgYSBiYXNpYyBleGFtcGxlLCBiZWxvdyBpcyBhIHNpbXBsZSBIVE1MIHBhcnNlciB0aGF0IHVzZXMgdGhlCi06Y2xhc3M6YEhUTUxQYXJzZXJgIGNsYXNzIHRvIHByaW50IG91dCBzdGFydCB0YWdzLCBlbmQgdGFncyBhbmQgZGF0YQotYXMgdGhleSBhcmUgZW5jb3VudGVyZWQ6OgorICAgVGhlICpkYXRhKiBwYXJhbWV0ZXIgd2lsbCBiZSB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBkZWNsYXJhdGlvbiBpbnNpZGUKKyAgIHRoZSBgYDwhWy4uLl0+YGAgbWFya3VwLiAgSXQgaXMgc29tZXRpbWVzIHVzZWZ1bCB0byBiZSBvdmVycmlkZGVuIGJ5IGEKKyAgIGRlcml2ZWQgY2xhc3MuCisKKworLi4gX2h0bWxwYXJzZXItZXhhbXBsZXM6CisKK0V4YW1wbGVzCistLS0tLS0tLQorCitUaGUgZm9sbG93aW5nIGNsYXNzIGltcGxlbWVudHMgYSBwYXJzZXIgdGhhdCB3aWxsIGJlIHVzZWQgdG8gaWxsdXN0cmF0ZSBtb3JlCitleGFtcGxlczo6CiAKICAgIGZyb20gSFRNTFBhcnNlciBpbXBvcnQgSFRNTFBhcnNlcgorICAgZnJvbSBodG1sZW50aXR5ZGVmcyBpbXBvcnQgbmFtZTJjb2RlcG9pbnQKIAogICAgY2xhc3MgTXlIVE1MUGFyc2VyKEhUTUxQYXJzZXIpOgogICAgICAgIGRlZiBoYW5kbGVfc3RhcnR0YWcoc2VsZiwgdGFnLCBhdHRycyk6Ci0gICAgICAgICAgIHByaW50ICJFbmNvdW50ZXJlZCBhIHN0YXJ0IHRhZzoiLCB0YWcKKyAgICAgICAgICAgcHJpbnQgIlN0YXJ0IHRhZzoiLCB0YWcKKyAgICAgICAgICAgZm9yIGF0dHIgaW4gYXR0cnM6CisgICAgICAgICAgICAgICBwcmludCAiICAgICBhdHRyOiIsIGF0dHIKICAgICAgICBkZWYgaGFuZGxlX2VuZHRhZyhzZWxmLCB0YWcpOgotICAgICAgICAgICBwcmludCAiRW5jb3VudGVyZWQgIGFuIGVuZCB0YWc6IiwgdGFnCisgICAgICAgICAgIHByaW50ICJFbmQgdGFnICA6IiwgdGFnCiAgICAgICAgZGVmIGhhbmRsZV9kYXRhKHNlbGYsIGRhdGEpOgotICAgICAgICAgICBwcmludCAiRW5jb3VudGVyZWQgICBzb21lIGRhdGE6IiwgZGF0YQotCisgICAgICAgICAgIHByaW50ICJEYXRhICAgICA6IiwgZGF0YQorICAgICAgIGRlZiBoYW5kbGVfY29tbWVudChzZWxmLCBkYXRhKToKKyAgICAgICAgICAgcHJpbnQgIkNvbW1lbnQgIDoiLCBkYXRhCisgICAgICAgZGVmIGhhbmRsZV9lbnRpdHlyZWYoc2VsZiwgbmFtZSk6CisgICAgICAgICAgIGMgPSB1bmljaHIobmFtZTJjb2RlcG9pbnRbbmFtZV0pCisgICAgICAgICAgIHByaW50ICJOYW1lZCBlbnQ6IiwgYworICAgICAgIGRlZiBoYW5kbGVfY2hhcnJlZihzZWxmLCBuYW1lKToKKyAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCd4Jyk6CisgICAgICAgICAgICAgICBjID0gdW5pY2hyKGludChuYW1lWzE6XSwgMTYpKQorICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgYyA9IHVuaWNocihpbnQobmFtZSkpCisgICAgICAgICAgIHByaW50ICJOdW0gZW50ICA6IiwgYworICAgICAgIGRlZiBoYW5kbGVfZGVjbChzZWxmLCBkYXRhKToKKyAgICAgICAgICAgcHJpbnQgIkRlY2wgICAgIDoiLCBkYXRhCiAKICAgIHBhcnNlciA9IE15SFRNTFBhcnNlcigpCi0gICBwYXJzZXIuZmVlZCgnPGh0bWw+PGhlYWQ+PHRpdGxlPlRlc3Q8L3RpdGxlPjwvaGVhZD4nCi0gICAgICAgICAgICAgICAnPGJvZHk+PGgxPlBhcnNlIG1lITwvaDE+PC9ib2R5PjwvaHRtbD4nKQorCitQYXJzaW5nIGEgZG9jdHlwZTo6CisKKyAgID4+PiBwYXJzZXIuZmVlZCgnPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIiAnCisgICAuLi4gICAgICAgICAgICAgJyJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4nKQorICAgRGVjbCAgICAgOiBET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCIKKworUGFyc2luZyBhbiBlbGVtZW50IHdpdGggYSBmZXcgYXR0cmlidXRlcyBhbmQgYSB0aXRsZTo6CisKKyAgID4+PiBwYXJzZXIuZmVlZCgnPGltZyBzcmM9InB5dGhvbi1sb2dvLnBuZyIgYWx0PSJUaGUgUHl0aG9uIGxvZ28iPicpCisgICBTdGFydCB0YWc6IGltZworICAgICAgICBhdHRyOiAoJ3NyYycsICdweXRob24tbG9nby5wbmcnKQorICAgICAgICBhdHRyOiAoJ2FsdCcsICdUaGUgUHl0aG9uIGxvZ28nKQorICAgPj4+CisgICA+Pj4gcGFyc2VyLmZlZWQoJzxoMT5QeXRob248L2gxPicpCisgICBTdGFydCB0YWc6IGgxCisgICBEYXRhICAgICA6IFB5dGhvbgorICAgRW5kIHRhZyAgOiBoMQorCitUaGUgY29udGVudCBvZiBgYHNjcmlwdGBgIGFuZCBgYHN0eWxlYGAgZWxlbWVudHMgaXMgcmV0dXJuZWQgYXMgaXMsIHdpdGhvdXQKK2Z1cnRoZXIgcGFyc2luZzo6CisKKyAgID4+PiBwYXJzZXIuZmVlZCgnPHN0eWxlIHR5cGU9InRleHQvY3NzIj4jcHl0aG9uIHsgY29sb3I6IGdyZWVuIH08L3N0eWxlPicpCisgICBTdGFydCB0YWc6IHN0eWxlCisgICAgICAgIGF0dHI6ICgndHlwZScsICd0ZXh0L2NzcycpCisgICBEYXRhICAgICA6ICNweXRob24geyBjb2xvcjogZ3JlZW4gfQorICAgRW5kIHRhZyAgOiBzdHlsZQorICAgPj4+CisgICA+Pj4gcGFyc2VyLmZlZWQoJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4nCisgICAuLi4gICAgICAgICAgICAgJ2FsZXJ0KCI8c3Ryb25nPmhlbGxvITwvc3Ryb25nPiIpOzwvc2NyaXB0PicpCisgICBTdGFydCB0YWc6IHNjcmlwdAorICAgICAgICBhdHRyOiAoJ3R5cGUnLCAndGV4dC9qYXZhc2NyaXB0JykKKyAgIERhdGEgICAgIDogYWxlcnQoIjxzdHJvbmc+aGVsbG8hPC9zdHJvbmc+Iik7CisgICBFbmQgdGFnICA6IHNjcmlwdAorCitQYXJzaW5nIGNvbW1lbnRzOjoKKworICAgPj4+IHBhcnNlci5mZWVkKCc8IS0tIGEgY29tbWVudCAtLT4nCisgICAuLi4gICAgICAgICAgICAgJzwhLS1baWYgSUUgOV0+SUUtc3BlY2lmaWMgY29udGVudDwhW2VuZGlmXS0tPicpCisgICBDb21tZW50ICA6ICBhIGNvbW1lbnQKKyAgIENvbW1lbnQgIDogW2lmIElFIDldPklFLXNwZWNpZmljIGNvbnRlbnQ8IVtlbmRpZl0KKworUGFyc2luZyBuYW1lZCBhbmQgbnVtZXJpYyBjaGFyYWN0ZXIgcmVmZXJlbmNlcyBhbmQgY29udmVydGluZyB0aGVtIHRvIHRoZQorY29ycmVjdCBjaGFyIChub3RlOiB0aGVzZSAzIHJlZmVyZW5jZXMgYXJlIGFsbCBlcXVpdmFsZW50IHRvIGBgJz4nYGApOjoKKworICAgPj4+IHBhcnNlci5mZWVkKCcmZ3Q7JiM2MjsmI3gzRTsnKQorICAgTmFtZWQgZW50OiA+CisgICBOdW0gZW50ICA6ID4KKyAgIE51bSBlbnQgIDogPgorCitGZWVkaW5nIGluY29tcGxldGUgY2h1bmtzIHRvIDptZXRoOmB+SFRNTFBhcnNlci5mZWVkYCB3b3JrcywgYnV0Cis6bWV0aDpgfkhUTUxQYXJzZXIuaGFuZGxlX2RhdGFgIG1pZ2h0IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZTo6CisKKyAgID4+PiBmb3IgY2h1bmsgaW4gWyc8c3AnLCAnYW4+YnVmZicsICdlcmVkICcsICd0ZXh0PC9zJywgJ3Bhbj4nXToKKyAgIC4uLiAgICAgcGFyc2VyLmZlZWQoY2h1bmspCisgICAuLi4KKyAgIFN0YXJ0IHRhZzogc3BhbgorICAgRGF0YSAgICAgOiBidWZmCisgICBEYXRhICAgICA6IGVyZWQKKyAgIERhdGEgICAgIDogdGV4dAorICAgRW5kIHRhZyAgOiBzcGFuCisKK1BhcnNpbmcgaW52YWxpZCBIVE1MIChlLmcuIHVucXVvdGVkIGF0dHJpYnV0ZXMpIGFsc28gd29ya3M6OgorCisgICA+Pj4gcGFyc2VyLmZlZWQoJzxwPjxhIGNsYXNzPWxpbmsgaHJlZj0jbWFpbj50YWcgc291cDwvcCA+PC9hPicpCisgICBTdGFydCB0YWc6IHAKKyAgIFN0YXJ0IHRhZzogYQorICAgICAgICBhdHRyOiAoJ2NsYXNzJywgJ2xpbmsnKQorICAgICAgICBhdHRyOiAoJ2hyZWYnLCAnI21haW4nKQorICAgRGF0YSAgICAgOiB0YWcgc291cAorICAgRW5kIHRhZyAgOiBwCisgICBFbmQgdGFnICA6IGEKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2h0dHBsaWIucnN0IGIvRG9jL2xpYnJhcnkvaHR0cGxpYi5yc3QKaW5kZXggNThiMWJiNy4uZmNkZmJjMCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvaHR0cGxpYi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvaHR0cGxpYi5yc3QKQEAgLTYsOCArNiw4IEBACiAKIC4uIG5vdGU6OgogICAgVGhlIDptb2Q6YGh0dHBsaWJgIG1vZHVsZSBoYXMgYmVlbiByZW5hbWVkIHRvIDptb2Q6YGh0dHAuY2xpZW50YCBpbiBQeXRob24KLSAgIDMuMC4gIFRoZSA6dGVybTpgMnRvM2AgdG9vbCB3aWxsIGF1dG9tYXRpY2FsbHkgYWRhcHQgaW1wb3J0cyB3aGVuIGNvbnZlcnRpbmcKLSAgIHlvdXIgc291cmNlcyB0byAzLjAuCisgICAzLiAgVGhlIDp0ZXJtOmAydG8zYCB0b29sIHdpbGwgYXV0b21hdGljYWxseSBhZGFwdCBpbXBvcnRzIHdoZW4gY29udmVydGluZworICAgeW91ciBzb3VyY2VzIHRvIFB5dGhvbiAzLgogCiAKIC4uIGluZGV4OjoKQEAgLTg5LDcgKzg5LDcgQEAKICAgICAgICpzb3VyY2VfYWRkcmVzcyogd2FzIGFkZGVkLgogCiAKLS4uIGNsYXNzOjogSFRUUFJlc3BvbnNlKHNvY2tbLCBkZWJ1Z2xldmVsPTBdWywgc3RyaWN0PTBdKQorLi4gY2xhc3M6OiBIVFRQUmVzcG9uc2Uoc29jaywgZGVidWdsZXZlbD0wLCBzdHJpY3Q9MCkKIAogICAgQ2xhc3Mgd2hvc2UgaW5zdGFuY2VzIGFyZSByZXR1cm5lZCB1cG9uIHN1Y2Nlc3NmdWwgY29ubmVjdGlvbi4gIE5vdCBpbnN0YW50aWF0ZWQKICAgIGRpcmVjdGx5IGJ5IHVzZXIuCkBAIC00NTIsNyArNDUyLDcgQEAKICAgIFNldCB0aGUgaG9zdCBhbmQgdGhlIHBvcnQgZm9yIEhUVFAgQ29ubmVjdCBUdW5uZWxsaW5nLiBOb3JtYWxseSB1c2VkIHdoZW4KICAgIGl0IGlzIHJlcXVpcmVkIHRvIGRvIEhUVFBTIENvbmVjdGlvbiB0aHJvdWdoIGEgcHJveHkgc2VydmVyLgogCi0gICBUaGUgaGVhZGVycyBhcmd1bWVudCBzaG91bGQgYmUgYSBtYXBwaW5nIG9mIGV4dHJhIEhUVFAgaGVhZGVycyB0byBzZW50CisgICBUaGUgaGVhZGVycyBhcmd1bWVudCBzaG91bGQgYmUgYSBtYXBwaW5nIG9mIGV4dHJhIEhUVFAgaGVhZGVycyB0byBzZW5kCiAgICB3aXRoIHRoZSBDT05ORUNUIHJlcXVlc3QuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNwpAQCAtNjEyLDMgKzYxMiwyMCBAQAogICAgJ1JlZGlyZWN0aW5nIHRvIDxhIGhyZWY9Imh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxMjUyNCI+aHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTEyNTI0PC9hPicKICAgID4+PiBjb25uLmNsb3NlKCkKIAorQ2xpZW50IHNpZGUgYGBIVFRQIFBVVGBgIHJlcXVlc3RzIGFyZSB2ZXJ5IHNpbWlsYXIgdG8gYGBQT1NUYGAgcmVxdWVzdHMuIFRoZQorZGlmZmVyZW5jZSBsaWVzIG9ubHkgdGhlIHNlcnZlciBzaWRlIHdoZXJlIEhUVFAgc2VydmVyIHdpbGwgYWxsb3cgcmVzb3VyY2VzIHRvCitiZSBjcmVhdGVkIHZpYSBgYFBVVGBgIHJlcXVlc3QuIEhlcmUgaXMgYW4gZXhhbXBsZSBzZXNzaW9uIHRoYXQgc2hvd3MgaG93IHRvIGRvCitgYFBVVGBgIHJlcXVlc3QgdXNpbmcgaHR0cGxpYjo6CisKKyAgICA+Pj4gIyBUaGlzIGNyZWF0ZXMgYW4gSFRUUCBtZXNzYWdlCisgICAgPj4+ICMgd2l0aCB0aGUgY29udGVudCBvZiBCT0RZIGFzIHRoZSBlbmNsb3NlZCByZXByZXNlbnRhdGlvbgorICAgID4+PiAjIGZvciB0aGUgcmVzb3VyY2UgaHR0cDovL2xvY2FsaG9zdDo4MDgwL2Zvb2JhcgorICAgIC4uLgorICAgID4+PiBpbXBvcnQgaHR0cGxpYgorICAgID4+PiBCT0RZID0gIioqKmZpbGVjb250ZW50cyoqKiIKKyAgICA+Pj4gY29ubiA9IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24oImxvY2FsaG9zdCIsIDgwODApCisgICAgPj4+IGNvbm4ucmVxdWVzdCgiUFVUIiwgIi9maWxlIiwgQk9EWSkKKyAgICA+Pj4gcmVzcG9uc2UgPSBjb25uLmdldHJlc3BvbnNlKCkKKyAgICA+Pj4gcHJpbnQgcmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5yZWFzb24KKyAgICAyMDAsIE9LCisKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2lkbGUucnN0IGIvRG9jL2xpYnJhcnkvaWRsZS5yc3QKaW5kZXggNmJkMTg5OC4uMzZkNzhiMCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvaWRsZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvaWRsZS5yc3QKQEAgLTMzLDggKzMzLDggQEAKIEZpbGUgbWVudQogXl5eXl5eXl5eCiAKLU5ldyB3aW5kb3cKLSAgIGNyZWF0ZSBhIG5ldyBlZGl0aW5nIHdpbmRvdworTmV3IGZpbGUKKyAgIGNyZWF0ZSBhIG5ldyBmaWxlIGVkaXRpbmcgd2luZG93CiAKIE9wZW4uLi4KICAgIG9wZW4gYW4gZXhpc3RpbmcgZmlsZQpAQCAtMTU0LDI3ICsxNTQsNzcgQEAKIGl0IHRvIHRoZSBmb3JlZ3JvdW5kIChkZWljb25pZnlpbmcgaXQgaWYgbmVjZXNzYXJ5KS4KIAogCi1EZWJ1ZyBtZW51IChpbiB0aGUgUHl0aG9uIFNoZWxsIHdpbmRvdyBvbmx5KQotXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KK0RlYnVnIG1lbnUKK15eXl5eXl5eXl4KKworKiBpbiB0aGUgUHl0aG9uIFNoZWxsIHdpbmRvdyBvbmx5CiAKIEdvIHRvIGZpbGUvbGluZQotICAgbG9vayBhcm91bmQgdGhlIGluc2VydCBwb2ludCBmb3IgYSBmaWxlbmFtZSBhbmQgbGluZW51bWJlciwgb3BlbiB0aGUgZmlsZSwgYW5kCi0gICBzaG93IHRoZSBsaW5lLgorICAgTG9vayBhcm91bmQgdGhlIGluc2VydCBwb2ludCBmb3IgYSBmaWxlbmFtZSBhbmQgbGluZSBudW1iZXIsIG9wZW4gdGhlIGZpbGUsCisgICBhbmQgc2hvdyB0aGUgbGluZS4gIFVzZWZ1bCB0byB2aWV3IHRoZSBzb3VyY2UgbGluZXMgcmVmZXJlbmNlZCBpbiBhbgorICAgZXhjZXB0aW9uIHRyYWNlYmFjay4KIAotT3BlbiBzdGFjayB2aWV3ZXIKLSAgIHNob3cgdGhlIHN0YWNrIHRyYWNlYmFjayBvZiB0aGUgbGFzdCBleGNlcHRpb24KK0RlYnVnZ2VyCisgICBSdW4gY29tbWFuZHMgaW4gdGhlIHNoZWxsIHVuZGVyIHRoZSBkZWJ1Z2dlci4KIAotRGVidWdnZXIgdG9nZ2xlCi0gICBSdW4gY29tbWFuZHMgaW4gdGhlIHNoZWxsIHVuZGVyIHRoZSBkZWJ1Z2dlcgorU3RhY2sgdmlld2VyCisgICBTaG93IHRoZSBzdGFjayB0cmFjZWJhY2sgb2YgdGhlIGxhc3QgZXhjZXB0aW9uLgogCi1KSVQgU3RhY2sgdmlld2VyIHRvZ2dsZQotICAgT3BlbiBzdGFjayB2aWV3ZXIgb24gdHJhY2ViYWNrCitBdXRvLW9wZW4gU3RhY2sgVmlld2VyCisgICBPcGVuIHN0YWNrIHZpZXdlciBvbiB0cmFjZWJhY2suCiAKIC4uIGluZGV4OjoKICAgIHNpbmdsZTogc3RhY2sgdmlld2VyCiAgICBzaW5nbGU6IGRlYnVnZ2VyCiAKIAorRWRpdCBjb250ZXh0IG1lbnUKK15eXl5eXl5eXl5eXl5eXl5eCisKKyogUmlnaHQtY2xpY2sgaW4gRWRpdCB3aW5kb3cgKENvbnRyb2wtY2xpY2sgb24gT1MgWCkKKworQ3V0CisgICBDb3B5IHNlbGVjdGlvbiBpbnRvIHN5c3RlbS13aWRlIGNsaXBib2FyZDsgdGhlbiBkZWxldGUgc2VsZWN0aW9uCisKK0NvcHkKKyAgIENvcHkgc2VsZWN0aW9uIGludG8gc3lzdGVtLXdpZGUgY2xpcGJvYXJkCisKK1Bhc3RlCisgICBJbnNlcnQgc3lzdGVtLXdpZGUgY2xpcGJvYXJkIGludG8gd2luZG93CisKK1NldCBCcmVha3BvaW50CisgICBTZXRzIGEgYnJlYWtwb2ludC4gIEJyZWFrcG9pbnRzIGFyZSBvbmx5IGVuYWJsZWQgd2hlbiB0aGUgZGVidWdnZXIgaXMgb3Blbi4KKworQ2xlYXIgQnJlYWtwb2ludAorICAgQ2xlYXJzIHRoZSBicmVha3BvaW50IG9uIHRoYXQgbGluZS4KKworLi4gaW5kZXg6OgorICAgc2luZ2xlOiBDdXQKKyAgIHNpbmdsZTogQ29weQorICAgc2luZ2xlOiBQYXN0ZQorICAgc2luZ2xlOiBTZXQgQnJlYWtwb2ludAorICAgc2luZ2xlOiBDbGVhciBCcmVha3BvaW50CisgICBzaW5nbGU6IGJyZWFrcG9pbnRzCisKKworU2hlbGwgY29udGV4dCBtZW51CiteXl5eXl5eXl5eXl5eXl5eXl4KKworKiBSaWdodC1jbGljayBpbiBQeXRob24gU2hlbGwgd2luZG93IChDb250cm9sLWNsaWNrIG9uIE9TIFgpCisKK0N1dAorICAgQ29weSBzZWxlY3Rpb24gaW50byBzeXN0ZW0td2lkZSBjbGlwYm9hcmQ7IHRoZW4gZGVsZXRlIHNlbGVjdGlvbgorCitDb3B5CisgICBDb3B5IHNlbGVjdGlvbiBpbnRvIHN5c3RlbS13aWRlIGNsaXBib2FyZAorCitQYXN0ZQorICAgSW5zZXJ0IHN5c3RlbS13aWRlIGNsaXBib2FyZCBpbnRvIHdpbmRvdworCitHbyB0byBmaWxlL2xpbmUKKyAgIFNhbWUgYXMgaW4gRGVidWcgbWVudS4KKworCiBCYXNpYyBlZGl0aW5nIGFuZCBuYXZpZ2F0aW9uCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2ltYWdlb3AucnN0IGIvRG9jL2xpYnJhcnkvaW1hZ2VvcC5yc3QKaW5kZXggY2VlZjBjNy4uZTZjYjY2OSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvaW1hZ2VvcC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvaW1hZ2VvcC5yc3QKQEAgLTcsNyArNyw3IEBACiAgICA6ZGVwcmVjYXRlZDoKIAogLi4gZGVwcmVjYXRlZDo6IDIuNgotICAgIFRoZSA6bW9kOmBpbWFnZW9wYCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4wLgorICAgIFRoZSA6bW9kOmBpbWFnZW9wYCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4KIAogVGhlIDptb2Q6YGltYWdlb3BgIG1vZHVsZSBjb250YWlucyBzb21lIHVzZWZ1bCBvcGVyYXRpb25zIG9uIGltYWdlcy4gSXQgb3BlcmF0ZXMKIG9uIGltYWdlcyBjb25zaXN0aW5nIG9mIDggb3IgMzIgYml0IHBpeGVscyBzdG9yZWQgaW4gUHl0aG9uIHN0cmluZ3MuICBUaGlzIGlzCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9pbWFwbGliLnJzdCBiL0RvYy9saWJyYXJ5L2ltYXBsaWIucnN0CmluZGV4IDlmY2JhYWEuLmNhMThhOWMgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2ltYXBsaWIucnN0CisrKyBiL0RvYy9saWJyYXJ5L2ltYXBsaWIucnN0CkBAIC0zMTMsOCArMzEzLDkgQEAKIAogICAgT3BlbnMgc29ja2V0IHRvICpwb3J0KiBhdCAqaG9zdCouICBUaGlzIG1ldGhvZCBpcyBpbXBsaWNpdGx5IGNhbGxlZCBieQogICAgdGhlIDpjbGFzczpgSU1BUDRgIGNvbnN0cnVjdG9yLiAgVGhlIGNvbm5lY3Rpb24gb2JqZWN0cyBlc3RhYmxpc2hlZCBieSB0aGlzCi0gICBtZXRob2Qgd2lsbCBiZSB1c2VkIGluIHRoZSBgYHJlYWRgYCwgYGByZWFkbGluZWBgLCBgYHNlbmRgYCwgYW5kIGBgc2h1dGRvd25gYAotICAgbWV0aG9kcy4gIFlvdSBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCisgICBtZXRob2Qgd2lsbCBiZSB1c2VkIGluIHRoZSA6bWV0aDpgSU1BUDQucmVhZGAsIDptZXRoOmBJTUFQNC5yZWFkbGluZWAsCisgICA6bWV0aDpgSU1BUDQuc2VuZGAsIGFuZCA6bWV0aDpgSU1BUDQuc2h1dGRvd25gIG1ldGhvZHMuICBZb3UgbWF5IG92ZXJyaWRlCisgICB0aGlzIG1ldGhvZC4KIAogCiAuLiBtZXRob2Q6OiBJTUFQNC5wYXJ0aWFsKG1lc3NhZ2VfbnVtLCBtZXNzYWdlX3BhcnQsIHN0YXJ0LCBsZW5ndGgpCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9pbWdmaWxlLnJzdCBiL0RvYy9saWJyYXJ5L2ltZ2ZpbGUucnN0CmluZGV4IDg0ZWRlOTUuLmY0YzY3MGYgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2ltZ2ZpbGUucnN0CisrKyBiL0RvYy9saWJyYXJ5L2ltZ2ZpbGUucnN0CkBAIC04LDcgKzgsNyBAQAogICAgOmRlcHJlY2F0ZWQ6CiAKIC4uIGRlcHJlY2F0ZWQ6OiAyLjYKLSAgIFRoZSA6bW9kOmBpbWdmaWxlYCBtb2R1bGUgaGFzIGJlZW4gZGVwcmVjYXRlZCBmb3IgcmVtb3ZhbCBpbiBQeXRob24gMy4wLgorICAgVGhlIDptb2Q6YGltZ2ZpbGVgIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLgogCiAKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvaW1naGRyLnJzdCBiL0RvYy9saWJyYXJ5L2ltZ2hkci5yc3QKaW5kZXggMjBmNzg5Zi4uMjRhYjU3MSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvaW1naGRyLnJzdAorKysgYi9Eb2MvbGlicmFyeS9pbWdoZHIucnN0CkBAIC02OCw2ICs2OCw2IEBACiBFeGFtcGxlOjoKIAogICAgPj4+IGltcG9ydCBpbWdoZHIKLSAgID4+PiBpbWdoZHIud2hhdCgnL3RtcC9iYXNzLmdpZicpCisgICA+Pj4gaW1naGRyLndoYXQoJ2Jhc3MuZ2lmJykKICAgICdnaWYnCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2ltcC5yc3QgYi9Eb2MvbGlicmFyeS9pbXAucnN0CmluZGV4IDYwN2RkMTQuLjhmOThkNjUgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2ltcC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvaW1wLnJzdApAQCAtNjUsNyArNjUsNyBAQAogICAgcGF0aCBhbmQgdGhlIGxhc3QgaXRlbSBpbiB0aGUgKmRlc2NyaXB0aW9uKiB0dXBsZSBpcyA6Y29uc3Q6YFBLR19ESVJFQ1RPUllgLgogCiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhbmRsZSBoaWVyYXJjaGljYWwgbW9kdWxlIG5hbWVzIChuYW1lcyBjb250YWluaW5nCi0gICBkb3RzKS4gIEluIG9yZGVyIHRvIGZpbmQgKlAqLipNKiwgdGhhdCBpcywgc3VibW9kdWxlICpNKiBvZiBwYWNrYWdlICpQKiwgdXNlCisgICBkb3RzKS4gIEluIG9yZGVyIHRvIGZpbmQgKlAuTSosIHRoYXQgaXMsIHN1Ym1vZHVsZSAqTSogb2YgcGFja2FnZSAqUCosIHVzZQogICAgOmZ1bmM6YGZpbmRfbW9kdWxlYCBhbmQgOmZ1bmM6YGxvYWRfbW9kdWxlYCB0byBmaW5kIGFuZCBsb2FkIHBhY2thZ2UgKlAqLCBhbmQKICAgIHRoZW4gdXNlIDpmdW5jOmBmaW5kX21vZHVsZWAgd2l0aCB0aGUgKnBhdGgqIGFyZ3VtZW50IHNldCB0byBgYFAuX19wYXRoX19gYC4KICAgIFdoZW4gKlAqIGl0c2VsZiBoYXMgYSBkb3R0ZWQgbmFtZSwgYXBwbHkgdGhpcyByZWNpcGUgcmVjdXJzaXZlbHkuCkBAIC0yMzcsNiArMjM3LDE3IEBACiAgICB1c2luZyBzaGFyZWQgbGlicmFyaWVzIGlzIGhpZ2hseSBzeXN0ZW0gZGVwZW5kZW50LCBhbmQgbm90IGFsbCBzeXN0ZW1zIHN1cHBvcnQKICAgIGl0LikKIAorICAgLi4gaW1wbC1kZXRhaWw6OgorCisgICAgICBUaGUgaW1wb3J0IGludGVybmFscyBpZGVudGlmeSBleHRlbnNpb24gbW9kdWxlcyBieSBmaWxlbmFtZSwgc28gZG9pbmcKKyAgICAgIGBgZm9vID0gbG9hZF9keW5hbWljKCJmb28iLCAibW9kLnNvIilgYCBhbmQKKyAgICAgIGBgYmFyID0gbG9hZF9keW5hbWljKCJiYXIiLCAibW9kLnNvIilgYCB3aWxsIHJlc3VsdCBpbiBib3RoIGZvbyBhbmQgYmFyCisgICAgICByZWZlcnJpbmcgdG8gdGhlIHNhbWUgbW9kdWxlLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90CisgICAgICBgYG1vZC5zb2BgIGV4cG9ydHMgYW4gYGBpbml0YmFyYGAgZnVuY3Rpb24uIE9uIHN5c3RlbXMgd2hpY2gKKyAgICAgIHN1cHBvcnQgdGhlbSwgc3ltbGlua3MgY2FuIGJlIHVzZWQgdG8gaW1wb3J0IG11bHRpcGxlIG1vZHVsZXMgZnJvbQorICAgICAgdGhlIHNhbWUgc2hhcmVkIGxpYnJhcnksIGFzIGVhY2ggcmVmZXJlbmNlIHRvIHRoZSBtb2R1bGUgd2lsbCB1c2UKKyAgICAgIGEgZGlmZmVyZW50IGZpbGUgbmFtZS4KKwogCiAuLiBmdW5jdGlvbjo6IGxvYWRfc291cmNlKG5hbWUsIHBhdGhuYW1lWywgZmlsZV0pCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2ltcHV0aWwucnN0IGIvRG9jL2xpYnJhcnkvaW1wdXRpbC5yc3QKaW5kZXggOTQxOTRlMi4uMTRkNzA0MSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvaW1wdXRpbC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvaW1wdXRpbC5yc3QKQEAgLTcsNyArNyw3IEBACiAgICA6ZGVwcmVjYXRlZDoKIAogLi4gZGVwcmVjYXRlZDo6IDIuNgotICAgVGhlIDptb2Q6YGltcHV0aWxgIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLjAuCisgICBUaGUgOm1vZDpgaW1wdXRpbGAgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuCiAKIAogLi4gaW5kZXg6OiBzdGF0ZW1lbnQ6IGltcG9ydApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvaW5kZXgucnN0IGIvRG9jL2xpYnJhcnkvaW5kZXgucnN0CmluZGV4IDVkODYwZjguLjcxYmE5MTYgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2luZGV4LnJzdAorKysgYi9Eb2MvbGlicmFyeS9pbmRleC5yc3QKQEAgLTQsOSArNCw2IEBACiAgIFRoZSBQeXRob24gU3RhbmRhcmQgTGlicmFyeQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi06UmVsZWFzZTogfHZlcnNpb258Ci06RGF0ZTogfHRvZGF5fAotCiBXaGlsZSA6cmVmOmByZWZlcmVuY2UtaW5kZXhgIGRlc2NyaWJlcyB0aGUgZXhhY3Qgc3ludGF4IGFuZAogc2VtYW50aWNzIG9mIHRoZSBQeXRob24gbGFuZ3VhZ2UsIHRoaXMgbGlicmFyeSByZWZlcmVuY2UgbWFudWFsCiBkZXNjcmliZXMgdGhlIHN0YW5kYXJkIGxpYnJhcnkgdGhhdCBpcyBkaXN0cmlidXRlZCB3aXRoIFB5dGhvbi4gSXQgYWxzbwpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvaW5zcGVjdC5yc3QgYi9Eb2MvbGlicmFyeS9pbnNwZWN0LnJzdAppbmRleCBlMDU2MThlLi4yYjQxYmVjIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9pbnNwZWN0LnJzdAorKysgYi9Eb2MvbGlicmFyeS9pbnNwZWN0LnJzdApAQCAtMzY2LDcgKzM2Niw3IEBACiAgICAuLiBpbXBsLWRldGFpbDo6CiAKICAgICAgIGdldHNldHMgYXJlIGF0dHJpYnV0ZXMgZGVmaW5lZCBpbiBleHRlbnNpb24gbW9kdWxlcyB2aWEKLSAgICAgIDpjdHlwZTpgUHlHZXRTZXREZWZgIHN0cnVjdHVyZXMuICBGb3IgUHl0aG9uIGltcGxlbWVudGF0aW9ucyB3aXRob3V0IHN1Y2gKKyAgICAgIDpjOnR5cGU6YFB5R2V0U2V0RGVmYCBzdHJ1Y3R1cmVzLiAgRm9yIFB5dGhvbiBpbXBsZW1lbnRhdGlvbnMgd2l0aG91dCBzdWNoCiAgICAgICB0eXBlcywgdGhpcyBtZXRob2Qgd2lsbCBhbHdheXMgcmV0dXJuIGBgRmFsc2VgYC4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi41CkBAIC0zNzksNyArMzc5LDcgQEAKICAgIC4uIGltcGwtZGV0YWlsOjoKIAogICAgICAgTWVtYmVyIGRlc2NyaXB0b3JzIGFyZSBhdHRyaWJ1dGVzIGRlZmluZWQgaW4gZXh0ZW5zaW9uIG1vZHVsZXMgdmlhCi0gICAgICA6Y3R5cGU6YFB5TWVtYmVyRGVmYCBzdHJ1Y3R1cmVzLiAgRm9yIFB5dGhvbiBpbXBsZW1lbnRhdGlvbnMgd2l0aG91dCBzdWNoCisgICAgICA6Yzp0eXBlOmBQeU1lbWJlckRlZmAgc3RydWN0dXJlcy4gIEZvciBQeXRob24gaW1wbGVtZW50YXRpb25zIHdpdGhvdXQgc3VjaAogICAgICAgdHlwZXMsIHRoaXMgbWV0aG9kIHdpbGwgYWx3YXlzIHJldHVybiBgYEZhbHNlYGAuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvaW8ucnN0IGIvRG9jL2xpYnJhcnkvaW8ucnN0CmluZGV4IGQ1MGU2NjUuLmFiNWEwNDMgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2lvLnJzdAorKysgYi9Eb2MvbGlicmFyeS9pby5yc3QKQEAgLTkyLDcgKzkyLDcgQEAKICAgIGBgJ2InYGAgICBiaW5hcnkgbW9kZQogICAgYGAndCdgYCAgIHRleHQgbW9kZSAoZGVmYXVsdCkKICAgIGBgJysnYGAgICBvcGVuIGEgZGlzayBmaWxlIGZvciB1cGRhdGluZyAocmVhZGluZyBhbmQgd3JpdGluZykKLSAgIGBgJ1UnYGAgICB1bml2ZXJzYWwgbmV3bGluZSBtb2RlIChmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk7IHNob3VsZAorICAgYGAnVSdgYCAgIHVuaXZlcnNhbCBuZXdsaW5lcyBtb2RlIChmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk7IHNob3VsZAogICAgICAgICAgICAgIG5vdCBiZSB1c2VkIGluIG5ldyBjb2RlKQogICAgPT09PT09PT09ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0xNDEsMTQgKzE0MSwxNyBAQAogICAgdXNlZC4gIEFueSBvdGhlciBlcnJvciBoYW5kbGluZyBuYW1lIHRoYXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoCiAgICA6ZnVuYzpgY29kZWNzLnJlZ2lzdGVyX2Vycm9yYCBpcyBhbHNvIHZhbGlkLgogCi0gICAqbmV3bGluZSogY29udHJvbHMgaG93IHVuaXZlcnNhbCBuZXdsaW5lcyB3b3JrcyAoaXQgb25seSBhcHBsaWVzIHRvIHRleHQKLSAgIG1vZGUpLiAgSXQgY2FuIGJlIGBgTm9uZWBgLCBgYCcnYGAsIGBgJ1xuJ2BgLCBgYCdccidgYCwgYW5kIGBgJ1xyXG4nYGAuICBJdAotICAgd29ya3MgYXMgZm9sbG93czoKKyAgIC4uIGluZGV4OjoKKyAgICAgIHNpbmdsZTogdW5pdmVyc2FsIG5ld2xpbmVzOyBvcGVuKCkgKGluIG1vZHVsZSBpbykKKworICAgKm5ld2xpbmUqIGNvbnRyb2xzIGhvdyA6dGVybTpgdW5pdmVyc2FsIG5ld2xpbmVzYCB3b3JrcyAoaXQgb25seSBhcHBsaWVzIHRvCisgICB0ZXh0IG1vZGUpLiAgSXQgY2FuIGJlIGBgTm9uZWBgLCBgYCcnYGAsIGBgJ1xuJ2BgLCBgYCdccidgYCwgYW5kIGBgJ1xyXG4nYGAuCisgICBJdCB3b3JrcyBhcyBmb2xsb3dzOgogCiAgICAqIE9uIGlucHV0LCBpZiAqbmV3bGluZSogaXMgYGBOb25lYGAsIHVuaXZlcnNhbCBuZXdsaW5lcyBtb2RlIGlzIGVuYWJsZWQuCiAgICAgIExpbmVzIGluIHRoZSBpbnB1dCBjYW4gZW5kIGluIGBgJ1xuJ2BgLCBgYCdccidgYCwgb3IgYGAnXHJcbidgYCwgYW5kIHRoZXNlCiAgICAgIGFyZSB0cmFuc2xhdGVkIGludG8gYGAnXG4nYGAgYmVmb3JlIGJlaW5nIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuICBJZiBpdCBpcwotICAgICBgYCcnYGAsIHVuaXZlcnNhbCBuZXdsaW5lIG1vZGUgaXMgZW5hYmxlZCwgYnV0IGxpbmUgZW5kaW5ncyBhcmUgcmV0dXJuZWQgdG8KKyAgICAgYGAnJ2BgLCB1bml2ZXJzYWwgbmV3bGluZXMgbW9kZSBpcyBlbmFibGVkLCBidXQgbGluZSBlbmRpbmdzIGFyZSByZXR1cm5lZCB0bwogICAgICB0aGUgY2FsbGVyIHVudHJhbnNsYXRlZC4gIElmIGl0IGhhcyBhbnkgb2YgdGhlIG90aGVyIGxlZ2FsIHZhbHVlcywgaW5wdXQKICAgICAgbGluZXMgYXJlIG9ubHkgdGVybWluYXRlZCBieSB0aGUgZ2l2ZW4gc3RyaW5nLCBhbmQgdGhlIGxpbmUgZW5kaW5nIGlzCiAgICAgIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgdW50cmFuc2xhdGVkLgpAQCAtMjc1LDcgKzI3OCw3IEBACiAKICAgIC4uIG1ldGhvZDo6IHJlYWRhYmxlKCkKIAotICAgICAgUmV0dXJuIGBgVHJ1ZWBgIGlmIHRoZSBzdHJlYW0gY2FuIGJlIHJlYWQgZnJvbS4gIElmIEZhbHNlLCA6bWV0aDpgcmVhZGAKKyAgICAgIFJldHVybiBgYFRydWVgYCBpZiB0aGUgc3RyZWFtIGNhbiBiZSByZWFkIGZyb20uICBJZiBgYEZhbHNlYGAsIDptZXRoOmByZWFkYAogICAgICAgd2lsbCByYWlzZSA6ZXhjOmBJT0Vycm9yYC4KIAogICAgLi4gbWV0aG9kOjogcmVhZGxpbmUobGltaXQ9LTEpCkBAIC0yODQsNyArMjg3LDcgQEAKICAgICAgIG1vc3QgKmxpbWl0KiBieXRlcyB3aWxsIGJlIHJlYWQuCiAKICAgICAgIFRoZSBsaW5lIHRlcm1pbmF0b3IgaXMgYWx3YXlzIGBgYidcbidgYCBmb3IgYmluYXJ5IGZpbGVzOyBmb3IgdGV4dCBmaWxlcywKLSAgICAgIHRoZSAqbmV3bGluZXMqIGFyZ3VtZW50IHRvIDpmdW5jOmAub3BlbmAgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IHRoZSBsaW5lCisgICAgICB0aGUgKm5ld2xpbmUqIGFyZ3VtZW50IHRvIDpmdW5jOmAub3BlbmAgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IHRoZSBsaW5lCiAgICAgICB0ZXJtaW5hdG9yKHMpIHJlY29nbml6ZWQuCiAKICAgIC4uIG1ldGhvZDo6IHJlYWRsaW5lcyhoaW50PS0xKQpAQCAtMjkzLDYgKzI5Niw5IEBACiAgICAgICB0byBjb250cm9sIHRoZSBudW1iZXIgb2YgbGluZXMgcmVhZDogbm8gbW9yZSBsaW5lcyB3aWxsIGJlIHJlYWQgaWYgdGhlCiAgICAgICB0b3RhbCBzaXplIChpbiBieXRlcy9jaGFyYWN0ZXJzKSBvZiBhbGwgbGluZXMgc28gZmFyIGV4Y2VlZHMgKmhpbnQqLgogCisgICAgICBOb3RlIHRoYXQgaXQncyBhbHJlYWR5IHBvc3NpYmxlIHRvIGl0ZXJhdGUgb24gZmlsZSBvYmplY3RzIHVzaW5nIGBgZm9yCisgICAgICBsaW5lIGluIGZpbGU6IC4uLmBgIHdpdGhvdXQgY2FsbGluZyBgYGZpbGUucmVhZGxpbmVzKClgYC4KKwogICAgLi4gbWV0aG9kOjogc2VlayhvZmZzZXQsIHdoZW5jZT1TRUVLX1NFVCkKIAogICAgICAgQ2hhbmdlIHRoZSBzdHJlYW0gcG9zaXRpb24gdG8gdGhlIGdpdmVuIGJ5dGUgKm9mZnNldCouICAqb2Zmc2V0KiBpcwpAQCAtMzQwLDYgKzM0NiwxMiBAQAogICAgICAgaXMgdXN1YWwgZm9yIGVhY2ggb2YgdGhlIGxpbmVzIHByb3ZpZGVkIHRvIGhhdmUgYSBsaW5lIHNlcGFyYXRvciBhdCB0aGUKICAgICAgIGVuZC4KIAorICAgLi4gbWV0aG9kOjogX19kZWxfXygpCisKKyAgICAgIFByZXBhcmUgZm9yIG9iamVjdCBkZXN0cnVjdGlvbi4gOmNsYXNzOmBJT0Jhc2VgIHByb3ZpZGVzIGEgZGVmYXVsdAorICAgICAgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdGhhdCBjYWxscyB0aGUgaW5zdGFuY2UncworICAgICAgOm1ldGg6YH5JT0Jhc2UuY2xvc2VgIG1ldGhvZC4KKwogCiAuLiBjbGFzczo6IFJhd0lPQmFzZQogCkBAIC02MzgsNiArNjUwLDcgQEAKICAgIDpleGM6YFVuc3VwcG9ydGVkT3BlcmF0aW9uYC4KIAogICAgLi4gd2FybmluZzo6CisKICAgICAgIDpjbGFzczpgQnVmZmVyZWRSV1BhaXJgIGRvZXMgbm90IGF0dGVtcHQgdG8gc3luY2hyb25pemUgYWNjZXNzZXMgdG8KICAgICAgIGl0cyB1bmRlcmx5aW5nIHJhdyBzdHJlYW1zLiAgWW91IHNob3VsZCBub3QgcGFzcyBpdCB0aGUgc2FtZSBvYmplY3QKICAgICAgIGFzIHJlYWRlciBhbmQgd3JpdGVyOyB1c2UgOmNsYXNzOmBCdWZmZXJlZFJhbmRvbWAgaW5zdGVhZC4KQEAgLTY5NiwxMSArNzA5LDM5IEBACiAgICAgICBSZWFkIGFuZCByZXR1cm4gYXQgbW9zdCAqbiogY2hhcmFjdGVycyBmcm9tIHRoZSBzdHJlYW0gYXMgYSBzaW5nbGUKICAgICAgIDpjbGFzczpgdW5pY29kZWAuICBJZiAqbiogaXMgbmVnYXRpdmUgb3IgYGBOb25lYGAsIHJlYWRzIHVudGlsIEVPRi4KIAotICAgLi4gbWV0aG9kOjogcmVhZGxpbmUoKQorICAgLi4gbWV0aG9kOjogcmVhZGxpbmUobGltaXQ9LTEpCiAKICAgICAgIFJlYWQgdW50aWwgbmV3bGluZSBvciBFT0YgYW5kIHJldHVybiBhIHNpbmdsZSBgYHVuaWNvZGVgYC4gIElmIHRoZQogICAgICAgc3RyZWFtIGlzIGFscmVhZHkgYXQgRU9GLCBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCiAKKyAgICAgIElmICpsaW1pdCogaXMgc3BlY2lmaWVkLCBhdCBtb3N0ICpsaW1pdCogY2hhcmFjdGVycyB3aWxsIGJlIHJlYWQuCisKKyAgIC4uIG1ldGhvZDo6IHNlZWsob2Zmc2V0LCB3aGVuY2U9U0VFS19TRVQpCisKKyAgICAgIENoYW5nZSB0aGUgc3RyZWFtIHBvc2l0aW9uIHRvIHRoZSBnaXZlbiAqb2Zmc2V0Ki4gIEJlaGF2aW91ciBkZXBlbmRzCisgICAgICBvbiB0aGUgKndoZW5jZSogcGFyYW1ldGVyOgorCisgICAgICAqIDpkYXRhOmBTRUVLX1NFVGAgb3IgYGAwYGA6IHNlZWsgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHN0cmVhbQorICAgICAgICAodGhlIGRlZmF1bHQpOyAqb2Zmc2V0KiBtdXN0IGVpdGhlciBiZSBhIG51bWJlciByZXR1cm5lZCBieQorICAgICAgICA6bWV0aDpgVGV4dElPQmFzZS50ZWxsYCwgb3IgemVyby4gIEFueSBvdGhlciAqb2Zmc2V0KiB2YWx1ZQorICAgICAgICBwcm9kdWNlcyB1bmRlZmluZWQgYmVoYXZpb3VyLgorICAgICAgKiA6ZGF0YTpgU0VFS19DVVJgIG9yIGBgMWBgOiAic2VlayIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb247CisgICAgICAgICpvZmZzZXQqIG11c3QgYmUgemVybywgd2hpY2ggaXMgYSBuby1vcGVyYXRpb24gKGFsbCBvdGhlciB2YWx1ZXMKKyAgICAgICAgYXJlIHVuc3VwcG9ydGVkKS4KKyAgICAgICogOmRhdGE6YFNFRUtfRU5EYCBvciBgYDJgYDogc2VlayB0byB0aGUgZW5kIG9mIHRoZSBzdHJlYW07CisgICAgICAgICpvZmZzZXQqIG11c3QgYmUgemVybyAoYWxsIG90aGVyIHZhbHVlcyBhcmUgdW5zdXBwb3J0ZWQpLgorCisgICAgICBSZXR1cm4gdGhlIG5ldyBhYnNvbHV0ZSBwb3NpdGlvbiBhcyBhbiBvcGFxdWUgbnVtYmVyLgorCisgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjcKKyAgICAgICAgIFRoZSBgYFNFRUtfKmBgIGNvbnN0YW50cy4KKworICAgLi4gbWV0aG9kOjogdGVsbCgpCisKKyAgICAgIFJldHVybiB0aGUgY3VycmVudCBzdHJlYW0gcG9zaXRpb24gYXMgYW4gb3BhcXVlIG51bWJlci4gIFRoZSBudW1iZXIKKyAgICAgIGRvZXMgbm90IHVzdWFsbHkgcmVwcmVzZW50IGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSB1bmRlcmx5aW5nCisgICAgICBiaW5hcnkgc3RvcmFnZS4KKwogICAgLi4gbWV0aG9kOjogd3JpdGUocykKIAogICAgICAgV3JpdGUgdGhlIDpjbGFzczpgdW5pY29kZWAgc3RyaW5nICpzKiB0byB0aGUgc3RyZWFtIGFuZCByZXR1cm4gdGhlCkBAIC03MjYsMTQgKzc2NywyNSBAQAogICAgc2VxdWVuY2VzKSBjYW4gYmUgdXNlZC4gIEFueSBvdGhlciBlcnJvciBoYW5kbGluZyBuYW1lIHRoYXQgaGFzIGJlZW4KICAgIHJlZ2lzdGVyZWQgd2l0aCA6ZnVuYzpgY29kZWNzLnJlZ2lzdGVyX2Vycm9yYCBpcyBhbHNvIHZhbGlkLgogCi0gICAqbmV3bGluZSogY2FuIGJlIGBgTm9uZWBgLCBgYCcnYGAsIGBgJ1xuJ2BgLCBgYCdccidgYCwgb3IgYGAnXHJcbidgYC4gIEl0Ci0gICBjb250cm9scyB0aGUgaGFuZGxpbmcgb2YgbGluZSBlbmRpbmdzLiAgSWYgaXQgaXMgYGBOb25lYGAsIHVuaXZlcnNhbCBuZXdsaW5lcwotICAgaXMgZW5hYmxlZC4gIFdpdGggdGhpcyBlbmFibGVkLCBvbiBpbnB1dCwgdGhlIGxpbmVzIGVuZGluZ3MgYGAnXG4nYGAsCi0gICBgYCdccidgYCwgb3IgYGAnXHJcbidgYCBhcmUgdHJhbnNsYXRlZCB0byBgYCdcbidgYCBiZWZvcmUgYmVpbmcgcmV0dXJuZWQgdG8KLSAgIHRoZSBjYWxsZXIuICBDb252ZXJzZWx5LCBvbiBvdXRwdXQsIGBgJ1xuJ2BgIGlzIHRyYW5zbGF0ZWQgdG8gdGhlIHN5c3RlbQotICAgZGVmYXVsdCBsaW5lIHNlcGFyYXRvciwgOmRhdGE6YG9zLmxpbmVzZXBgLiAgSWYgKm5ld2xpbmUqIGlzIGFueSBvdGhlciBvZiBpdHMKLSAgIGxlZ2FsIHZhbHVlcywgdGhhdCBuZXdsaW5lIGJlY29tZXMgdGhlIG5ld2xpbmUgd2hlbiB0aGUgZmlsZSBpcyByZWFkIGFuZCBpdAotICAgaXMgcmV0dXJuZWQgdW50cmFuc2xhdGVkLiAgT24gb3V0cHV0LCBgYCdcbidgYCBpcyBjb252ZXJ0ZWQgdG8gdGhlICpuZXdsaW5lKi4KKyAgIC4uIGluZGV4OjoKKyAgICAgIHNpbmdsZTogdW5pdmVyc2FsIG5ld2xpbmVzOyBpby5UZXh0SU9XcmFwcGVyIGNsYXNzCisKKyAgICpuZXdsaW5lKiBjb250cm9scyBob3cgbGluZSBlbmRpbmdzIGFyZSBoYW5kbGVkLiAgSXQgY2FuIGJlIGBgTm9uZWBgLAorICAgYGAnJ2BgLCBgYCdcbidgYCwgYGAnXHInYGAsIGFuZCBgYCdcclxuJ2BgLiAgSXQgd29ya3MgYXMgZm9sbG93czoKKworICAgKiBPbiBpbnB1dCwgaWYgKm5ld2xpbmUqIGlzIGBgTm9uZWBgLCA6dGVybTpgdW5pdmVyc2FsIG5ld2xpbmVzYCBtb2RlIGlzCisgICAgIGVuYWJsZWQuICBMaW5lcyBpbiB0aGUgaW5wdXQgY2FuIGVuZCBpbiBgYCdcbidgYCwgYGAnXHInYGAsIG9yIGBgJ1xyXG4nYGAsCisgICAgIGFuZCB0aGVzZSBhcmUgdHJhbnNsYXRlZCBpbnRvIGBgJ1xuJ2BgIGJlZm9yZSBiZWluZyByZXR1cm5lZCB0byB0aGUKKyAgICAgY2FsbGVyLiAgSWYgaXQgaXMgYGAnJ2BgLCB1bml2ZXJzYWwgbmV3bGluZXMgbW9kZSBpcyBlbmFibGVkLCBidXQgbGluZQorICAgICBlbmRpbmdzIGFyZSByZXR1cm5lZCB0byB0aGUgY2FsbGVyIHVudHJhbnNsYXRlZC4gIElmIGl0IGhhcyBhbnkgb2YgdGhlCisgICAgIG90aGVyIGxlZ2FsIHZhbHVlcywgaW5wdXQgbGluZXMgYXJlIG9ubHkgdGVybWluYXRlZCBieSB0aGUgZ2l2ZW4gc3RyaW5nLAorICAgICBhbmQgdGhlIGxpbmUgZW5kaW5nIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgdW50cmFuc2xhdGVkLgorCisgICAqIE9uIG91dHB1dCwgaWYgKm5ld2xpbmUqIGlzIGBgTm9uZWBgLCBhbnkgYGAnXG4nYGAgY2hhcmFjdGVycyB3cml0dGVuIGFyZQorICAgICB0cmFuc2xhdGVkIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBsaW5lIHNlcGFyYXRvciwgOmRhdGE6YG9zLmxpbmVzZXBgLiAgSWYKKyAgICAgKm5ld2xpbmUqIGlzIGBgJydgYCwgbm8gdHJhbnNsYXRpb24gdGFrZXMgcGxhY2UuICBJZiAqbmV3bGluZSogaXMgYW55IG9mCisgICAgIHRoZSBvdGhlciBsZWdhbCB2YWx1ZXMsIGFueSBgYCdcbidgYCBjaGFyYWN0ZXJzIHdyaXR0ZW4gYXJlIHRyYW5zbGF0ZWQgdG8KKyAgICAgdGhlIGdpdmVuIHN0cmluZy4KIAogICAgSWYgKmxpbmVfYnVmZmVyaW5nKiBpcyBgYFRydWVgYCwgOm1ldGg6YGZsdXNoYCBpcyBpbXBsaWVkIHdoZW4gYSBjYWxsIHRvCiAgICB3cml0ZSBjb250YWlucyBhIG5ld2xpbmUgY2hhcmFjdGVyLgpAQCAtNzQ2LDE0ICs3OTgsMTQgQEAKICAgICAgIFdoZXRoZXIgbGluZSBidWZmZXJpbmcgaXMgZW5hYmxlZC4KIAogCi0uLiBjbGFzczo6IFN0cmluZ0lPKGluaXRpYWxfdmFsdWU9dScnLCBuZXdsaW5lPU5vbmUpCisuLiBjbGFzczo6IFN0cmluZ0lPKGluaXRpYWxfdmFsdWU9dScnLCBuZXdsaW5lPXUnXFxuJykKIAogICAgQW4gaW4tbWVtb3J5IHN0cmVhbSBmb3IgdW5pY29kZSB0ZXh0LiAgSXQgaW5oZXJpdHMgOmNsYXNzOmBUZXh0SU9XcmFwcGVyYC4KIAogICAgVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIGJ1ZmZlciAoYW4gZW1wdHkgdW5pY29kZSBzdHJpbmcgYnkgZGVmYXVsdCkgY2FuCiAgICBiZSBzZXQgYnkgcHJvdmlkaW5nICppbml0aWFsX3ZhbHVlKi4gIFRoZSAqbmV3bGluZSogYXJndW1lbnQgd29ya3MgbGlrZQotICAgdGhhdCBvZiA6Y2xhc3M6YFRleHRJT1dyYXBwZXJgLiAgVGhlIGRlZmF1bHQgaXMgdG8gZG8gbm8gbmV3bGluZQotICAgdHJhbnNsYXRpb24uCisgICB0aGF0IG9mIDpjbGFzczpgVGV4dElPV3JhcHBlcmAuICBUaGUgZGVmYXVsdCBpcyB0byBjb25zaWRlciBvbmx5IGBgXG5gYAorICAgY2hhcmFjdGVycyBhcyBlbmQgb2YgbGluZXMgYW5kIHRvIGRvIG5vIG5ld2xpbmUgdHJhbnNsYXRpb24uCiAKICAgIDpjbGFzczpgU3RyaW5nSU9gIHByb3ZpZGVzIHRoaXMgbWV0aG9kIGluIGFkZGl0aW9uIHRvIHRob3NlIGZyb20KICAgIDpjbGFzczpgVGV4dElPV3JhcHBlcmAgYW5kIGl0cyBwYXJlbnRzOgpAQCAtNzgxLDEwICs4MzMsMTMgQEAKICAgICAgIG91dHB1dC5jbG9zZSgpCiAKIAorLi4gaW5kZXg6OgorICAgc2luZ2xlOiB1bml2ZXJzYWwgbmV3bGluZXM7IGlvLkluY3JlbWVudGFsTmV3bGluZURlY29kZXIgY2xhc3MKKwogLi4gY2xhc3M6OiBJbmNyZW1lbnRhbE5ld2xpbmVEZWNvZGVyCiAKLSAgIEEgaGVscGVyIGNvZGVjIHRoYXQgZGVjb2RlcyBuZXdsaW5lcyBmb3IgdW5pdmVyc2FsIG5ld2xpbmVzIG1vZGUuICBJdAotICAgaW5oZXJpdHMgOmNsYXNzOmBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyYC4KKyAgIEEgaGVscGVyIGNvZGVjIHRoYXQgZGVjb2RlcyBuZXdsaW5lcyBmb3IgOnRlcm06YHVuaXZlcnNhbCBuZXdsaW5lc2AgbW9kZS4KKyAgIEl0IGluaGVyaXRzIDpjbGFzczpgY29kZWNzLkluY3JlbWVudGFsRGVjb2RlcmAuCiAKIAogQWR2YW5jZWQgdG9waWNzCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9pdGVydG9vbHMucnN0IGIvRG9jL2xpYnJhcnkvaXRlcnRvb2xzLnJzdAppbmRleCAzNmEzOTFiLi5lYTI3OWIwIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9pdGVydG9vbHMucnN0CisrKyBiL0RvYy9saWJyYXJ5L2l0ZXJ0b29scy5yc3QKQEAgLTUyLDEyICs1MiwxMiBAQAogOmZ1bmM6YGNvbXByZXNzYCAgICAgICAgZGF0YSwgc2VsZWN0b3JzICAgICAgICAgICAgICAgICAoZFswXSBpZiBzWzBdKSwgKGRbMV0gaWYgc1sxXSksIC4uLiAgICAgICAgICAgICAgICAgYGBjb21wcmVzcygnQUJDREVGJywgWzEsMCwxLDAsMSwxXSkgLS0+IEEgQyBFIEZgYAogOmZ1bmM6YGRyb3B3aGlsZWAgICAgICAgcHJlZCwgc2VxICAgICAgICAgICAgICAgICAgICAgICBzZXFbbl0sIHNlcVtuKzFdLCBzdGFydGluZyB3aGVuIHByZWQgZmFpbHMgICAgICAgICAgYGBkcm9wd2hpbGUobGFtYmRhIHg6IHg8NSwgWzEsNCw2LDQsMV0pIC0tPiA2IDQgMWBgCiA6ZnVuYzpgZ3JvdXBieWAgICAgICAgICBpdGVyYWJsZVssIGtleWZ1bmNdICAgICAgICAgICAgIHN1Yi1pdGVyYXRvcnMgZ3JvdXBlZCBieSB2YWx1ZSBvZiBrZXlmdW5jKHYpCi06ZnVuYzpgaWZpbHRlcmAgICAgICAgICBwcmVkLCBzZXEgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIG9mIHNlcSB3aGVyZSBwcmVkKGVsZW0pIGlzIFRydWUgICAgICAgICAgICBgYGlmaWx0ZXIobGFtYmRhIHg6IHglMiwgcmFuZ2UoMTApKSAtLT4gMSAzIDUgNyA5YGAKLTpmdW5jOmBpZmlsdGVyZmFsc2VgICAgIHByZWQsIHNlcSAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgb2Ygc2VxIHdoZXJlIHByZWQoZWxlbSkgaXMgRmFsc2UgICAgICAgICAgIGBgaWZpbHRlcmZhbHNlKGxhbWJkYSB4OiB4JTIsIHJhbmdlKDEwKSkgLS0+IDAgMiA0IDYgOGBgCis6ZnVuYzpgaWZpbHRlcmAgICAgICAgICBwcmVkLCBzZXEgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIG9mIHNlcSB3aGVyZSBwcmVkKGVsZW0pIGlzIHRydWUgICAgICAgICAgICBgYGlmaWx0ZXIobGFtYmRhIHg6IHglMiwgcmFuZ2UoMTApKSAtLT4gMSAzIDUgNyA5YGAKKzpmdW5jOmBpZmlsdGVyZmFsc2VgICAgIHByZWQsIHNlcSAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgb2Ygc2VxIHdoZXJlIHByZWQoZWxlbSkgaXMgZmFsc2UgICAgICAgICAgIGBgaWZpbHRlcmZhbHNlKGxhbWJkYSB4OiB4JTIsIHJhbmdlKDEwKSkgLS0+IDAgMiA0IDYgOGBgCiA6ZnVuYzpgaXNsaWNlYCAgICAgICAgICBzZXEsIFtzdGFydCxdIHN0b3AgWywgc3RlcF0gICAgIGVsZW1lbnRzIGZyb20gc2VxW3N0YXJ0OnN0b3A6c3RlcF0gICAgICAgICAgICAgICAgICBgYGlzbGljZSgnQUJDREVGRycsIDIsIE5vbmUpIC0tPiBDIEQgRSBGIEdgYAogOmZ1bmM6YGltYXBgICAgICAgICAgICAgZnVuYywgcCwgcSwgLi4uICAgICAgICAgICAgICAgICBmdW5jKHAwLCBxMCksIGZ1bmMocDEsIHExKSwgLi4uICAgICAgICAgICAgICAgICAgICAgYGBpbWFwKHBvdywgKDIsMywxMCksICg1LDIsMykpIC0tPiAzMiA5IDEwMDBgYAogOmZ1bmM6YHN0YXJtYXBgICAgICAgICAgZnVuYywgc2VxICAgICAgICAgICAgICAgICAgICAgICBmdW5jKFwqc2VxWzBdKSwgZnVuYyhcKnNlcVsxXSksIC4uLiAgICAgICAgICAgICAgICAgYGBzdGFybWFwKHBvdywgWygyLDUpLCAoMywyKSwgKDEwLDMpXSkgLS0+IDMyIDkgMTAwMGBgCi06ZnVuYzpgdGVlYCAgICAgICAgICAgICBpdCwgbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0MSwgaXQyICwgLi4uIGl0biAgc3BsaXRzIG9uZSBpdGVyYXRvciBpbnRvIG4KKzpmdW5jOmB0ZWVgICAgICAgICAgICAgIGl0LCBuICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQxLCBpdDIsIC4uLiBpdG4gIHNwbGl0cyBvbmUgaXRlcmF0b3IgaW50byBuCiA6ZnVuYzpgdGFrZXdoaWxlYCAgICAgICBwcmVkLCBzZXEgICAgICAgICAgICAgICAgICAgICAgIHNlcVswXSwgc2VxWzFdLCB1bnRpbCBwcmVkIGZhaWxzICAgICAgICAgICAgICAgICAgICBgYHRha2V3aGlsZShsYW1iZGEgeDogeDw1LCBbMSw0LDYsNCwxXSkgLS0+IDEgNGBgCiA6ZnVuYzpgaXppcGAgICAgICAgICAgICBwLCBxLCAuLi4gICAgICAgICAgICAgICAgICAgICAgIChwWzBdLCBxWzBdKSwgKHBbMV0sIHFbMV0pLCAuLi4gICAgICAgICAgICAgICAgICAgICBgYGl6aXAoJ0FCQ0QnLCAneHknKSAtLT4gQXggQnlgYAogOmZ1bmM6YGl6aXBfbG9uZ2VzdGAgICAgcCwgcSwgLi4uICAgICAgICAgICAgICAgICAgICAgICAocFswXSwgcVswXSksIChwWzFdLCBxWzFdKSwgLi4uICAgICAgICAgICAgICAgICAgICAgYGBpemlwX2xvbmdlc3QoJ0FCQ0QnLCAneHknLCBmaWxsdmFsdWU9Jy0nKSAtLT4gQXggQnkgQy0gRC1gYApAQCAtMTA2LDkgKzEwNiw4IEBACiAuLiBjbGFzc21ldGhvZDo6IGNoYWluLmZyb21faXRlcmFibGUoaXRlcmFibGUpCiAKICAgIEFsdGVybmF0ZSBjb25zdHJ1Y3RvciBmb3IgOmZ1bmM6YGNoYWluYC4gIEdldHMgY2hhaW5lZCBpbnB1dHMgZnJvbSBhCi0gICBzaW5nbGUgaXRlcmFibGUgYXJndW1lbnQgdGhhdCBpcyBldmFsdWF0ZWQgbGF6aWx5LiAgRXF1aXZhbGVudCB0bzo6CisgICBzaW5nbGUgaXRlcmFibGUgYXJndW1lbnQgdGhhdCBpcyBldmFsdWF0ZWQgbGF6aWx5LiAgUm91Z2hseSBlcXVpdmFsZW50IHRvOjoKIAotICAgICAgQGNsYXNzbWV0aG9kCiAgICAgICBkZWYgZnJvbV9pdGVyYWJsZShpdGVyYWJsZXMpOgogICAgICAgICAgICMgY2hhaW4uZnJvbV9pdGVyYWJsZShbJ0FCQycsICdERUYnXSkgLS0+IEEgQiBDIEQgRSBGCiAgICAgICAgICAgZm9yIGl0IGluIGl0ZXJhYmxlczoKQEAgLTM5Myw3ICszOTIsOCBAQAogICAgICAgICAgICAgICAgICAgeWllbGQgZnVuY3Rpb24oKmFyZ3MpCiAKIAotLi4gZnVuY3Rpb246OiBpc2xpY2UoaXRlcmFibGUsIFtzdGFydCxdIHN0b3AgWywgc3RlcF0pCisuLiBmdW5jdGlvbjo6IGlzbGljZShpdGVyYWJsZSwgc3RvcCkKKyAgICAgICAgICAgICAgaXNsaWNlKGl0ZXJhYmxlLCBzdGFydCwgc3RvcFssIHN0ZXBdKQogCiAgICBNYWtlIGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyBzZWxlY3RlZCBlbGVtZW50cyBmcm9tIHRoZSBpdGVyYWJsZS4gSWYgKnN0YXJ0KiBpcwogICAgbm9uLXplcm8sIHRoZW4gZWxlbWVudHMgZnJvbSB0aGUgaXRlcmFibGUgYXJlIHNraXBwZWQgdW50aWwgc3RhcnQgaXMgcmVhY2hlZC4KQEAgLTU5MCw2ICs1OTAsMTEgQEAKICAgICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKHRpbWVzKToKICAgICAgICAgICAgICAgICAgIHlpZWxkIG9iamVjdAogCisgICBBIGNvbW1vbiB1c2UgZm9yICpyZXBlYXQqIGlzIHRvIHN1cHBseSBhIHN0cmVhbSBvZiBjb25zdGFudCB2YWx1ZXMgdG8gKmltYXAqCisgICBvciAqemlwKjo6CisKKyAgICAgID4+PiBsaXN0KGltYXAocG93LCB4cmFuZ2UoMTApLCByZXBlYXQoMikpKQorICAgICAgWzAsIDEsIDQsIDksIDE2LCAyNSwgMzYsIDQ5LCA2NCwgODFdCiAKIC4uIGZ1bmN0aW9uOjogc3Rhcm1hcChmdW5jdGlvbiwgaXRlcmFibGUpCiAKQEAgLTcyNyw4ICs3MzIsOSBAQAogICAgICAgIG5leHQoYiwgTm9uZSkKICAgICAgICByZXR1cm4gaXppcChhLCBiKQogCi0gICBkZWYgZ3JvdXBlcihuLCBpdGVyYWJsZSwgZmlsbHZhbHVlPU5vbmUpOgotICAgICAgICJncm91cGVyKDMsICdBQkNERUZHJywgJ3gnKSAtLT4gQUJDIERFRiBHeHgiCisgICBkZWYgZ3JvdXBlcihpdGVyYWJsZSwgbiwgZmlsbHZhbHVlPU5vbmUpOgorICAgICAgICJDb2xsZWN0IGRhdGEgaW50byBmaXhlZC1sZW5ndGggY2h1bmtzIG9yIGJsb2NrcyIKKyAgICAgICAjIGdyb3VwZXIoJ0FCQ0RFRkcnLCAzLCAneCcpIC0tPiBBQkMgREVGIEd4eAogICAgICAgIGFyZ3MgPSBbaXRlcihpdGVyYWJsZSldICogbgogICAgICAgIHJldHVybiBpemlwX2xvbmdlc3QoZmlsbHZhbHVlPWZpbGx2YWx1ZSwgKmFyZ3MpCiAKQEAgLTgyMiw2ICs4MjgsMTggQEAKICAgICAgICBpbmRpY2VzID0gc29ydGVkKHJhbmRvbS5yYW5kcmFuZ2UobikgZm9yIGkgaW4geHJhbmdlKHIpKQogICAgICAgIHJldHVybiB0dXBsZShwb29sW2ldIGZvciBpIGluIGluZGljZXMpCiAKKyAgIGRlZiB0ZWVfbG9va2FoZWFkKHQsIGkpOgorICAgICAgICIiIkluc3BlY3QgdGhlIGktdGggdXBjb21waW5nIHZhbHVlIGZyb20gYSB0ZWUgb2JqZWN0CisgICAgICAgICAgd2hpbGUgbGVhdmluZyB0aGUgdGVlIG9iamVjdCBhdCBpdHMgY3VycmVudCBwb3NpdGlvbi4KKworICAgICAgICAgIFJhaXNlIGFuIEluZGV4RXJyb3IgaWYgdGhlIHVuZGVybHlpbmcgaXRlcmF0b3IgZG9lc24ndAorICAgICAgICAgIGhhdmUgZW5vdWdoIHZhbHVlcy4KKworICAgICAgICIiIgorICAgICAgIGZvciB2YWx1ZSBpbiBpc2xpY2UodC5fX2NvcHlfXygpLCBpLCBOb25lKToKKyAgICAgICAgICAgcmV0dXJuIHZhbHVlCisgICAgICAgcmFpc2UgSW5kZXhFcnJvcihpKQorCiBOb3RlLCBtYW55IG9mIHRoZSBhYm92ZSByZWNpcGVzIGNhbiBiZSBvcHRpbWl6ZWQgYnkgcmVwbGFjaW5nIGdsb2JhbCBsb29rdXBzCiB3aXRoIGxvY2FsIHZhcmlhYmxlcyBkZWZpbmVkIGFzIGRlZmF1bHQgdmFsdWVzLiAgRm9yIGV4YW1wbGUsIHRoZQogKmRvdHByb2R1Y3QqIHJlY2lwZSBjYW4gYmUgd3JpdHRlbiBhczo6CmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9qcGVnLnJzdCBiL0RvYy9saWJyYXJ5L2pwZWcucnN0CmluZGV4IDk4NDk3YWQuLjJhOGU0ZTggMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2pwZWcucnN0CisrKyBiL0RvYy9saWJyYXJ5L2pwZWcucnN0CkBAIC04LDcgKzgsNyBAQAogICAgOmRlcHJlY2F0ZWQ6CiAKIC4uIGRlcHJlY2F0ZWQ6OiAyLjYKLSAgIFRoZSA6bW9kOmBqcGVnYCBtb2R1bGUgaGFzIGJlZW4gZGVwcmVjYXRlZCBmb3IgcmVtb3ZhbCBpbiBQeXRob24gMy4wLgorICAgVGhlIDptb2Q6YGpwZWdgIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLgogCiAKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvanNvbi5yc3QgYi9Eb2MvbGlicmFyeS9qc29uLnJzdAppbmRleCA1NDZhMDlkLi5jYWVlOTUzIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9qc29uLnJzdAorKysgYi9Eb2MvbGlicmFyeS9qc29uLnJzdApAQCAtNyw4ICs3LDEwIEBACiAuLiBzZWN0aW9uYXV0aG9yOjogQm9iIElwcG9saXRvIDxib2JAcmVkaXZpLmNvbT4KIC4uIHZlcnNpb25hZGRlZDo6IDIuNgogCi1gSlNPTiAoSmF2YVNjcmlwdCBPYmplY3QgTm90YXRpb24pIDxodHRwOi8vanNvbi5vcmc+YF8gaXMgYSBzdWJzZXQgb2YgSmF2YVNjcmlwdAotc3ludGF4IChFQ01BLTI2MiAzcmQgZWRpdGlvbikgdXNlZCBhcyBhIGxpZ2h0d2VpZ2h0IGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0LgorYEpTT04gKEphdmFTY3JpcHQgT2JqZWN0IE5vdGF0aW9uKSA8aHR0cDovL2pzb24ub3JnPmBfLCBzcGVjaWZpZWQgYnkKKzpyZmM6YDQ2MjdgLCBpcyBhIGxpZ2h0d2VpZ2h0IGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0IGJhc2VkIG9uIGEgc3Vic2V0IG9mCitgSmF2YVNjcmlwdCA8aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9KYXZhU2NyaXB0PmBfIHN5bnRheCAoYEVDTUEtMjYyIDNyZAorZWRpdGlvbiA8aHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL3B1YmxpY2F0aW9ucy9maWxlcy9FQ01BLVNULUFSQ0gvRUNNQS0yNjIsJTIwM3JkJTIwZWRpdGlvbiwlMjBEZWNlbWJlciUyMDE5OTkucGRmPmBfKS4KIAogOm1vZDpganNvbmAgZXhwb3NlcyBhbiBBUEkgZmFtaWxpYXIgdG8gdXNlcnMgb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkKIDptb2Q6YG1hcnNoYWxgIGFuZCA6bW9kOmBwaWNrbGVgIG1vZHVsZXMuCkBAIC00MSw3ICs0Myw4IEBACiBQcmV0dHkgcHJpbnRpbmc6OgogCiAgICAgPj4+IGltcG9ydCBqc29uCi0gICAgPj4+IHByaW50IGpzb24uZHVtcHMoeyc0JzogNSwgJzYnOiA3fSwgc29ydF9rZXlzPVRydWUsIGluZGVudD00KQorICAgID4+PiBwcmludCBqc29uLmR1bXBzKHsnNCc6IDUsICc2JzogN30sIHNvcnRfa2V5cz1UcnVlLAorICAgIC4uLiAgICAgICAgICAgICAgICAgIGluZGVudD00LCBzZXBhcmF0b3JzPSgnLCcsICc6ICcpKQogICAgIHsKICAgICAgICAgIjQiOiA1LAogICAgICAgICAiNiI6IDcKQEAgLTgxLDYgKzg0LDcgQEAKICAgICAuLi4gICAgIGRlZiBkZWZhdWx0KHNlbGYsIG9iaik6CiAgICAgLi4uICAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosIGNvbXBsZXgpOgogICAgIC4uLiAgICAgICAgICAgICByZXR1cm4gW29iai5yZWFsLCBvYmouaW1hZ10KKyAgICAuLi4gICAgICAgICAjIExldCB0aGUgYmFzZSBjbGFzcyBkZWZhdWx0IG1ldGhvZCByYWlzZSB0aGUgVHlwZUVycm9yCiAgICAgLi4uICAgICAgICAgcmV0dXJuIGpzb24uSlNPTkVuY29kZXIuZGVmYXVsdChzZWxmLCBvYmopCiAgICAgLi4uCiAgICAgPj4+IGR1bXBzKDIgKyAxaiwgY2xzPUNvbXBsZXhFbmNvZGVyKQpAQCAtOTksMzUgKzEwMyw0NCBAQAogICAgIHsKICAgICAgICAgImpzb24iOiAib2JqIgogICAgIH0KLSAgICAkIGVjaG8gJ3sgMS4yOjMuNH0nIHwgcHl0aG9uIC1tanNvbi50b29sCi0gICAgRXhwZWN0aW5nIHByb3BlcnR5IG5hbWU6IGxpbmUgMSBjb2x1bW4gMiAoY2hhciAyKQorICAgICQgZWNobyAnezEuMjozLjR9JyB8IHB5dGhvbiAtbWpzb24udG9vbAorICAgIEV4cGVjdGluZyBwcm9wZXJ0eSBuYW1lIGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXM6IGxpbmUgMSBjb2x1bW4gMiAoY2hhciAxKQogCiAuLiBoaWdobGlnaHQ6OiBweXRob24KIAogLi4gbm90ZTo6CiAKLSAgIFRoZSBKU09OIHByb2R1Y2VkIGJ5IHRoaXMgbW9kdWxlJ3MgZGVmYXVsdCBzZXR0aW5ncyBpcyBhIHN1YnNldCBvZgotICAgWUFNTCwgc28gaXQgbWF5IGJlIHVzZWQgYXMgYSBzZXJpYWxpemVyIGZvciB0aGF0IGFzIHdlbGwuCisgICBKU09OIGlzIGEgc3Vic2V0IG9mIGBZQU1MIDxodHRwOi8veWFtbC5vcmcvPmBfIDEuMi4gIFRoZSBKU09OIHByb2R1Y2VkIGJ5CisgICB0aGlzIG1vZHVsZSdzIGRlZmF1bHQgc2V0dGluZ3MgKGluIHBhcnRpY3VsYXIsIHRoZSBkZWZhdWx0ICpzZXBhcmF0b3JzKgorICAgdmFsdWUpIGlzIGFsc28gYSBzdWJzZXQgb2YgWUFNTCAxLjAgYW5kIDEuMS4gIFRoaXMgbW9kdWxlIGNhbiB0aHVzIGFsc28gYmUKKyAgIHVzZWQgYXMgYSBZQU1MIHNlcmlhbGl6ZXIuCiAKIAogQmFzaWMgVXNhZ2UKIC0tLS0tLS0tLS0tCiAKLS4uIGZ1bmN0aW9uOjogZHVtcChvYmosIGZwWywgc2tpcGtleXNbLCBlbnN1cmVfYXNjaWlbLCBjaGVja19jaXJjdWxhclssIGFsbG93X25hblssIGNsc1ssIGluZGVudFssIHNlcGFyYXRvcnNbLCBlbmNvZGluZ1ssIGRlZmF1bHRbLCAqKmt3XV1dXV1dXV1dXSkKKy4uIGZ1bmN0aW9uOjogZHVtcChvYmosIGZwLCBza2lwa2V5cz1GYWxzZSwgZW5zdXJlX2FzY2lpPVRydWUsIFwKKyAgICAgICAgICAgICAgICAgICBjaGVja19jaXJjdWxhcj1UcnVlLCBhbGxvd19uYW49VHJ1ZSwgY2xzPU5vbmUsIFwKKyAgICAgICAgICAgICAgICAgICBpbmRlbnQ9Tm9uZSwgc2VwYXJhdG9ycz1Ob25lLCBlbmNvZGluZz0idXRmLTgiLCBcCisgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1Ob25lLCBzb3J0X2tleXM9RmFsc2UsICoqa3cpCiAKICAgIFNlcmlhbGl6ZSAqb2JqKiBhcyBhIEpTT04gZm9ybWF0dGVkIHN0cmVhbSB0byAqZnAqIChhIGBgLndyaXRlKClgYC1zdXBwb3J0aW5nCi0gICBmaWxlLWxpa2Ugb2JqZWN0KS4KKyAgIDp0ZXJtOmBmaWxlLWxpa2Ugb2JqZWN0YCkgdXNpbmcgdGhpcyA6cmVmOmBjb252ZXJzaW9uIHRhYmxlCisgICA8cHktdG8tanNvbi10YWJsZT5gLgogCiAgICBJZiAqc2tpcGtleXMqIGlzIGBgVHJ1ZWBgIChkZWZhdWx0OiBgYEZhbHNlYGApLCB0aGVuIGRpY3Qga2V5cyB0aGF0IGFyZSBub3QKICAgIG9mIGEgYmFzaWMgdHlwZSAoOmNsYXNzOmBzdHJgLCA6Y2xhc3M6YHVuaWNvZGVgLCA6Y2xhc3M6YGludGAsIDpjbGFzczpgbG9uZ2AsCiAgICA6Y2xhc3M6YGZsb2F0YCwgOmNsYXNzOmBib29sYCwgYGBOb25lYGApIHdpbGwgYmUgc2tpcHBlZCBpbnN0ZWFkIG9mIHJhaXNpbmcgYQogICAgOmV4YzpgVHlwZUVycm9yYC4KIAotICAgSWYgKmVuc3VyZV9hc2NpaSogaXMgYGBGYWxzZWBgIChkZWZhdWx0OiBgYFRydWVgYCksIHRoZW4gc29tZSBjaHVua3Mgd3JpdHRlbgotICAgdG8gKmZwKiBtYXkgYmUgOmNsYXNzOmB1bmljb2RlYCBpbnN0YW5jZXMsIHN1YmplY3QgdG8gbm9ybWFsIFB5dGhvbgotICAgOmNsYXNzOmBzdHJgIHRvIDpjbGFzczpgdW5pY29kZWAgY29lcmNpb24gcnVsZXMuICBVbmxlc3MgYGBmcC53cml0ZSgpYGAKLSAgIGV4cGxpY2l0bHkgdW5kZXJzdGFuZHMgOmNsYXNzOmB1bmljb2RlYCAoYXMgaW4gOmZ1bmM6YGNvZGVjcy5nZXR3cml0ZXJgKSB0aGlzCi0gICBpcyBsaWtlbHkgdG8gY2F1c2UgYW4gZXJyb3IuCisgICBJZiAqZW5zdXJlX2FzY2lpKiBpcyBgYFRydWVgYCAodGhlIGRlZmF1bHQpLCBhbGwgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgaW4gdGhlCisgICBvdXRwdXQgYXJlIGVzY2FwZWQgd2l0aCBgYFx1WFhYWGBgIHNlcXVlbmNlcywgYW5kIHRoZSByZXN1bHQgaXMgYQorICAgOmNsYXNzOmBzdHJgIGluc3RhbmNlIGNvbnNpc3Rpbmcgb2YgQVNDSUkgY2hhcmFjdGVycyBvbmx5LiAgSWYKKyAgICplbnN1cmVfYXNjaWkqIGlzIGBgRmFsc2VgYCwgc29tZSBjaHVua3Mgd3JpdHRlbiB0byAqZnAqIG1heSBiZQorICAgOmNsYXNzOmB1bmljb2RlYCBpbnN0YW5jZXMuICBUaGlzIHVzdWFsbHkgaGFwcGVucyBiZWNhdXNlIHRoZSBpbnB1dCBjb250YWlucworICAgdW5pY29kZSBzdHJpbmdzIG9yIHRoZSAqZW5jb2RpbmcqIHBhcmFtZXRlciBpcyB1c2VkLiAgVW5sZXNzIGBgZnAud3JpdGUoKWBgCisgICBleHBsaWNpdGx5IHVuZGVyc3RhbmRzIDpjbGFzczpgdW5pY29kZWAgKGFzIGluIDpmdW5jOmBjb2RlY3MuZ2V0d3JpdGVyYCkKKyAgIHRoaXMgaXMgbGlrZWx5IHRvIGNhdXNlIGFuIGVycm9yLgogCiAgICBJZiAqY2hlY2tfY2lyY3VsYXIqIGlzIGBgRmFsc2VgYCAoZGVmYXVsdDogYGBUcnVlYGApLCB0aGVuIHRoZSBjaXJjdWxhcgogICAgcmVmZXJlbmNlIGNoZWNrIGZvciBjb250YWluZXIgdHlwZXMgd2lsbCBiZSBza2lwcGVkIGFuZCBhIGNpcmN1bGFyIHJlZmVyZW5jZQpAQCAtMTQzLDYgKzE1NiwxMiBAQAogICAgb3IgbmVnYXRpdmUsIHdpbGwgb25seSBpbnNlcnQgbmV3bGluZXMuICBgYE5vbmVgYCAodGhlIGRlZmF1bHQpIHNlbGVjdHMgdGhlCiAgICBtb3N0IGNvbXBhY3QgcmVwcmVzZW50YXRpb24uCiAKKyAgIC4uIG5vdGU6OgorCisgICAgICBTaW5jZSB0aGUgZGVmYXVsdCBpdGVtIHNlcGFyYXRvciBpcyBgYCcsICdgYCwgIHRoZSBvdXRwdXQgbWlnaHQgaW5jbHVkZQorICAgICAgdHJhaWxpbmcgd2hpdGVzcGFjZSB3aGVuICppbmRlbnQqIGlzIHNwZWNpZmllZC4gIFlvdSBjYW4gdXNlCisgICAgICBgYHNlcGFyYXRvcnM9KCcsJywgJzogJylgYCB0byBhdm9pZCB0aGlzLgorCiAgICBJZiAqc2VwYXJhdG9ycyogaXMgYW4gYGAoaXRlbV9zZXBhcmF0b3IsIGRpY3Rfc2VwYXJhdG9yKWBgIHR1cGxlLCB0aGVuIGl0CiAgICB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBgYCgnLCAnLCAnOiAnKWBgIHNlcGFyYXRvcnMuICBgYCgnLCcsCiAgICAnOicpYGAgaXMgdGhlIG1vc3QgY29tcGFjdCBKU09OIHJlcHJlc2VudGF0aW9uLgpAQCAtMTUyLDYgKzE3MSw5IEBACiAgICAqZGVmYXVsdChvYmopKiBpcyBhIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIHJldHVybiBhIHNlcmlhbGl6YWJsZSB2ZXJzaW9uIG9mCiAgICAqb2JqKiBvciByYWlzZSA6ZXhjOmBUeXBlRXJyb3JgLiAgVGhlIGRlZmF1bHQgc2ltcGx5IHJhaXNlcyA6ZXhjOmBUeXBlRXJyb3JgLgogCisgICBJZiAqc29ydF9rZXlzKiBpcyBgYFRydWVgYCAoZGVmYXVsdDogYGBGYWxzZWBgKSwgdGhlbiB0aGUgb3V0cHV0IG9mCisgICBkaWN0aW9uYXJpZXMgd2lsbCBiZSBzb3J0ZWQgYnkga2V5LgorCiAgICBUbyB1c2UgYSBjdXN0b20gOmNsYXNzOmBKU09ORW5jb2RlcmAgc3ViY2xhc3MgKGUuZy4gb25lIHRoYXQgb3ZlcnJpZGVzIHRoZQogICAgOm1ldGg6YGRlZmF1bHRgIG1ldGhvZCB0byBzZXJpYWxpemUgYWRkaXRpb25hbCB0eXBlcyksIHNwZWNpZnkgaXQgd2l0aCB0aGUKICAgICpjbHMqIGt3YXJnOyBvdGhlcndpc2UgOmNsYXNzOmBKU09ORW5jb2RlcmAgaXMgdXNlZC4KQEAgLTE2MiwxOSArMTg0LDMyIEBACiAgICAgICB0cnlpbmcgdG8gc2VyaWFsaXplIG1vcmUgb2JqZWN0cyB3aXRoIHJlcGVhdGVkIGNhbGxzIHRvIDpmdW5jOmBkdW1wYCBhbmQKICAgICAgIHRoZSBzYW1lICpmcCogd2lsbCByZXN1bHQgaW4gYW4gaW52YWxpZCBKU09OIGZpbGUuCiAKLS4uIGZ1bmN0aW9uOjogZHVtcHMob2JqWywgc2tpcGtleXNbLCBlbnN1cmVfYXNjaWlbLCBjaGVja19jaXJjdWxhclssIGFsbG93X25hblssIGNsc1ssIGluZGVudFssIHNlcGFyYXRvcnNbLCBlbmNvZGluZ1ssIGRlZmF1bHRbLCAqKmt3XV1dXV1dXV1dXSkKKy4uIGZ1bmN0aW9uOjogZHVtcHMob2JqLCBza2lwa2V5cz1GYWxzZSwgZW5zdXJlX2FzY2lpPVRydWUsIFwKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tfY2lyY3VsYXI9VHJ1ZSwgYWxsb3dfbmFuPVRydWUsIGNscz1Ob25lLCBcCisgICAgICAgICAgICAgICAgICAgIGluZGVudD1Ob25lLCBzZXBhcmF0b3JzPU5vbmUsIGVuY29kaW5nPSJ1dGYtOCIsIFwKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1Ob25lLCBzb3J0X2tleXM9RmFsc2UsICoqa3cpCiAKLSAgIFNlcmlhbGl6ZSAqb2JqKiB0byBhIEpTT04gZm9ybWF0dGVkIDpjbGFzczpgc3RyYC4KKyAgIFNlcmlhbGl6ZSAqb2JqKiB0byBhIEpTT04gZm9ybWF0dGVkIDpjbGFzczpgc3RyYCB1c2luZyB0aGlzIDpyZWY6YGNvbnZlcnNpb24KKyAgIHRhYmxlIDxweS10by1qc29uLXRhYmxlPmAuICBJZiAqZW5zdXJlX2FzY2lpKiBpcyBgYEZhbHNlYGAsIHRoZSByZXN1bHQgbWF5CisgICBjb250YWluIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGFuZCB0aGUgcmV0dXJuIHZhbHVlIG1heSBiZSBhIDpjbGFzczpgdW5pY29kZWAKKyAgIGluc3RhbmNlLgogCi0gICBJZiAqZW5zdXJlX2FzY2lpKiBpcyBgYEZhbHNlYGAsIHRoZW4gdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGEKLSAgIDpjbGFzczpgdW5pY29kZWAgaW5zdGFuY2UuICBUaGUgb3RoZXIgYXJndW1lbnRzIGhhdmUgdGhlIHNhbWUgbWVhbmluZyBhcyBpbgotICAgOmZ1bmM6YGR1bXBgLgorICAgVGhlIGFyZ3VtZW50cyBoYXZlIHRoZSBzYW1lIG1lYW5pbmcgYXMgaW4gOmZ1bmM6YGR1bXBgLgogCisgICAuLiBub3RlOjoKKworICAgICAgS2V5cyBpbiBrZXkvdmFsdWUgcGFpcnMgb2YgSlNPTiBhcmUgYWx3YXlzIG9mIHRoZSB0eXBlIDpjbGFzczpgc3RyYC4gV2hlbgorICAgICAgYSBkaWN0aW9uYXJ5IGlzIGNvbnZlcnRlZCBpbnRvIEpTT04sIGFsbCB0aGUga2V5cyBvZiB0aGUgZGljdGlvbmFyeSBhcmUKKyAgICAgIGNvZXJjZWQgdG8gc3RyaW5ncy4gQXMgYSByZXN1bHQgb2YgdGhpcywgaWYgYSBkaWN0aW9uYXJ5IGlzIGNvbnZlcnRlZAorICAgICAgaW50byBKU09OIGFuZCB0aGVuIGJhY2sgaW50byBhIGRpY3Rpb25hcnksIHRoZSBkaWN0aW9uYXJ5IG1heSBub3QgZXF1YWwKKyAgICAgIHRoZSBvcmlnaW5hbCBvbmUuIFRoYXQgaXMsIGBgbG9hZHMoZHVtcHMoeCkpICE9IHhgYCBpZiB4IGhhcyBub24tc3RyaW5nCisgICAgICBrZXlzLgogCiAuLiBmdW5jdGlvbjo6IGxvYWQoZnBbLCBlbmNvZGluZ1ssIGNsc1ssIG9iamVjdF9ob29rWywgcGFyc2VfZmxvYXRbLCBwYXJzZV9pbnRbLCBwYXJzZV9jb25zdGFudFssIG9iamVjdF9wYWlyc19ob29rWywgKiprd11dXV1dXV1dKQogCi0gICBEZXNlcmlhbGl6ZSAqZnAqIChhIGBgLnJlYWQoKWBgLXN1cHBvcnRpbmcgZmlsZS1saWtlIG9iamVjdCBjb250YWluaW5nIGEgSlNPTgotICAgZG9jdW1lbnQpIHRvIGEgUHl0aG9uIG9iamVjdC4KKyAgIERlc2VyaWFsaXplICpmcCogKGEgYGAucmVhZCgpYGAtc3VwcG9ydGluZyA6dGVybTpgZmlsZS1saWtlIG9iamVjdGAKKyAgIGNvbnRhaW5pbmcgYSBKU09OIGRvY3VtZW50KSB0byBhIFB5dGhvbiBvYmplY3QgdXNpbmcgdGhpcyA6cmVmOmBjb252ZXJzaW9uCisgICB0YWJsZSA8anNvbi10by1weS10YWJsZT5gLgogCiAgICBJZiB0aGUgY29udGVudHMgb2YgKmZwKiBhcmUgZW5jb2RlZCB3aXRoIGFuIEFTQ0lJIGJhc2VkIGVuY29kaW5nIG90aGVyIHRoYW4KICAgIFVURi04IChlLmcuIGxhdGluLTEpLCB0aGVuIGFuIGFwcHJvcHJpYXRlICplbmNvZGluZyogbmFtZSBtdXN0IGJlIHNwZWNpZmllZC4KQEAgLTE4NSw3ICsyMjAsOCBAQAogICAgKm9iamVjdF9ob29rKiBpcyBhbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHJlc3VsdCBvZgogICAgYW55IG9iamVjdCBsaXRlcmFsIGRlY29kZWQgKGEgOmNsYXNzOmBkaWN0YCkuICBUaGUgcmV0dXJuIHZhbHVlIG9mCiAgICAqb2JqZWN0X2hvb2sqIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSA6Y2xhc3M6YGRpY3RgLiAgVGhpcyBmZWF0dXJlIGNhbiBiZSB1c2VkCi0gICB0byBpbXBsZW1lbnQgY3VzdG9tIGRlY29kZXJzIChlLmcuIEpTT04tUlBDIGNsYXNzIGhpbnRpbmcpLgorICAgdG8gaW1wbGVtZW50IGN1c3RvbSBkZWNvZGVycyAoZS5nLiBgSlNPTi1SUEMgPGh0dHA6Ly93d3cuanNvbnJwYy5vcmc+YF8KKyAgIGNsYXNzIGhpbnRpbmcpLgogCiAgICAqb2JqZWN0X3BhaXJzX2hvb2sqIGlzIGFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUKICAgIHJlc3VsdCBvZiBhbnkgb2JqZWN0IGxpdGVyYWwgZGVjb2RlZCB3aXRoIGFuIG9yZGVyZWQgbGlzdCBvZiBwYWlycy4gIFRoZQpAQCAtMjA5LDEwICsyNDUsMTMgQEAKICAgIChlLmcuIDpjbGFzczpgZmxvYXRgKS4KIAogICAgKnBhcnNlX2NvbnN0YW50KiwgaWYgc3BlY2lmaWVkLCB3aWxsIGJlIGNhbGxlZCB3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nCi0gICBzdHJpbmdzOiBgYCctSW5maW5pdHknYGAsIGBgJ0luZmluaXR5J2BgLCBgYCdOYU4nYGAsIGBgJ251bGwnYGAsIGBgJ3RydWUnYGAsCi0gICBgYCdmYWxzZSdgYC4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmFpc2UgYW4gZXhjZXB0aW9uIGlmIGludmFsaWQgSlNPTiBudW1iZXJzCisgICBzdHJpbmdzOiBgYCctSW5maW5pdHknYGAsIGBgJ0luZmluaXR5J2BgLCBgYCdOYU4nYGAuCisgICBUaGlzIGNhbiBiZSB1c2VkIHRvIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiBpbnZhbGlkIEpTT04gbnVtYmVycwogICAgYXJlIGVuY291bnRlcmVkLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNworICAgICAgKnBhcnNlX2NvbnN0YW50KiBkb2Vzbid0IGdldCBjYWxsZWQgb24gJ251bGwnLCAndHJ1ZScsICdmYWxzZScgYW55bW9yZS4KKwogICAgVG8gdXNlIGEgY3VzdG9tIDpjbGFzczpgSlNPTkRlY29kZXJgIHN1YmNsYXNzLCBzcGVjaWZ5IGl0IHdpdGggdGhlIGBgY2xzYGAKICAgIGt3YXJnOyBvdGhlcndpc2UgOmNsYXNzOmBKU09ORGVjb2RlcmAgaXMgdXNlZC4gIEFkZGl0aW9uYWwga2V5d29yZCBhcmd1bWVudHMKICAgIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgY2xhc3MuCkBAIC0yMjEsNyArMjYwLDggQEAKIC4uIGZ1bmN0aW9uOjogbG9hZHMoc1ssIGVuY29kaW5nWywgY2xzWywgb2JqZWN0X2hvb2tbLCBwYXJzZV9mbG9hdFssIHBhcnNlX2ludFssIHBhcnNlX2NvbnN0YW50Wywgb2JqZWN0X3BhaXJzX2hvb2tbLCAqKmt3XV1dXV1dXV0pCiAKICAgIERlc2VyaWFsaXplICpzKiAoYSA6Y2xhc3M6YHN0cmAgb3IgOmNsYXNzOmB1bmljb2RlYCBpbnN0YW5jZSBjb250YWluaW5nIGEgSlNPTgotICAgZG9jdW1lbnQpIHRvIGEgUHl0aG9uIG9iamVjdC4KKyAgIGRvY3VtZW50KSB0byBhIFB5dGhvbiBvYmplY3QgdXNpbmcgdGhpcyA6cmVmOmBjb252ZXJzaW9uIHRhYmxlCisgICA8anNvbi10by1weS10YWJsZT5gLgogCiAgICBJZiAqcyogaXMgYSA6Y2xhc3M6YHN0cmAgaW5zdGFuY2UgYW5kIGlzIGVuY29kZWQgd2l0aCBhbiBBU0NJSSBiYXNlZCBlbmNvZGluZwogICAgb3RoZXIgdGhhbiBVVEYtOCAoZS5nLiBsYXRpbi0xKSwgdGhlbiBhbiBhcHByb3ByaWF0ZSAqZW5jb2RpbmcqIG5hbWUgbXVzdCBiZQpAQCAtMjMxLDcgKzI3MSw3IEBACiAgICBUaGUgb3RoZXIgYXJndW1lbnRzIGhhdmUgdGhlIHNhbWUgbWVhbmluZyBhcyBpbiA6ZnVuYzpgbG9hZGAuCiAKIAotRW5jb2RlcnMgYW5kIGRlY29kZXJzCitFbmNvZGVycyBhbmQgRGVjb2RlcnMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAuLiBjbGFzczo6IEpTT05EZWNvZGVyKFtlbmNvZGluZ1ssIG9iamVjdF9ob29rWywgcGFyc2VfZmxvYXRbLCBwYXJzZV9pbnRbLCBwYXJzZV9jb25zdGFudFssIHN0cmljdFssIG9iamVjdF9wYWlyc19ob29rXV1dXV1dXSkKQEAgLTI0MCw2ICsyODAsOCBAQAogCiAgICBQZXJmb3JtcyB0aGUgZm9sbG93aW5nIHRyYW5zbGF0aW9ucyBpbiBkZWNvZGluZyBieSBkZWZhdWx0OgogCisgICAuLiBfanNvbi10by1weS10YWJsZToKKwogICAgKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKwogICAgfCBKU09OICAgICAgICAgIHwgUHl0aG9uICAgICAgICAgICAgfAogICAgKz09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09KwpAQCAtMzA2LDYgKzM0OCw4IEBACiAgICB0aG9zZSB3aXRoIGNoYXJhY3RlciBjb2RlcyBpbiB0aGUgMC0zMSByYW5nZSwgaW5jbHVkaW5nIGBgJ1x0J2BgICh0YWIpLAogICAgYGAnXG4nYGAsIGBgJ1xyJ2BgIGFuZCBgYCdcMCdgYC4KIAorICAgSWYgdGhlIGRhdGEgYmVpbmcgZGVzZXJpYWxpemVkIGlzIG5vdCBhIHZhbGlkIEpTT04gZG9jdW1lbnQsIGEKKyAgIDpleGM6YFZhbHVlRXJyb3JgIHdpbGwgYmUgcmFpc2VkLgogCiAgICAuLiBtZXRob2Q6OiBkZWNvZGUocykKIApAQCAtMzI4LDYgKzM3Miw4IEBACiAKICAgIFN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgb2JqZWN0cyBhbmQgdHlwZXMgYnkgZGVmYXVsdDoKIAorICAgLi4gX3B5LXRvLWpzb24tdGFibGU6CisKICAgICstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsKICAgIHwgUHl0aG9uICAgICAgICAgICAgfCBKU09OICAgICAgICAgIHwKICAgICs9PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PSsKQEAgLTM1NSw5ICs0MDEsMTIgQEAKICAgIGF0dGVtcHQgZW5jb2Rpbmcgb2Yga2V5cyB0aGF0IGFyZSBub3Qgc3RyLCBpbnQsIGxvbmcsIGZsb2F0IG9yIE5vbmUuICBJZgogICAgKnNraXBrZXlzKiBpcyBgYFRydWVgYCwgc3VjaCBpdGVtcyBhcmUgc2ltcGx5IHNraXBwZWQuCiAKLSAgIElmICplbnN1cmVfYXNjaWkqIGlzIGBgVHJ1ZWBgICh0aGUgZGVmYXVsdCksIHRoZSBvdXRwdXQgaXMgZ3VhcmFudGVlZCB0byBiZQotICAgOmNsYXNzOmBzdHJgIG9iamVjdHMgd2l0aCBhbGwgaW5jb21pbmcgdW5pY29kZSBjaGFyYWN0ZXJzIGVzY2FwZWQuICBJZgotICAgKmVuc3VyZV9hc2NpaSogaXMgYGBGYWxzZWBgLCB0aGUgb3V0cHV0IHdpbGwgYmUgYSB1bmljb2RlIG9iamVjdC4KKyAgIElmICplbnN1cmVfYXNjaWkqIGlzIGBgVHJ1ZWBgICh0aGUgZGVmYXVsdCksIGFsbCBub24tQVNDSUkgY2hhcmFjdGVycyBpbiB0aGUKKyAgIG91dHB1dCBhcmUgZXNjYXBlZCB3aXRoIGBgXHVYWFhYYGAgc2VxdWVuY2VzLCBhbmQgdGhlIHJlc3VsdHMgYXJlCisgICA6Y2xhc3M6YHN0cmAgaW5zdGFuY2VzIGNvbnNpc3Rpbmcgb2YgQVNDSUkgY2hhcmFjdGVycyBvbmx5LiBJZgorICAgKmVuc3VyZV9hc2NpaSogaXMgYGBGYWxzZWBgLCBhIHJlc3VsdCBtYXkgYmUgYSA6Y2xhc3M6YHVuaWNvZGVgCisgICBpbnN0YW5jZS4gVGhpcyB1c3VhbGx5IGhhcHBlbnMgaWYgdGhlIGlucHV0IGNvbnRhaW5zIHVuaWNvZGUgc3RyaW5ncyBvciB0aGUKKyAgICplbmNvZGluZyogcGFyYW1ldGVyIGlzIHVzZWQuCiAKICAgIElmICpjaGVja19jaXJjdWxhciogaXMgYGBUcnVlYGAgKHRoZSBkZWZhdWx0KSwgdGhlbiBsaXN0cywgZGljdHMsIGFuZCBjdXN0b20KICAgIGVuY29kZWQgb2JqZWN0cyB3aWxsIGJlIGNoZWNrZWQgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgZHVyaW5nIGVuY29kaW5nIHRvCkBAIC0zNzksNiArNDI4LDEyIEBACiAgICBsZXZlbC4gIEFuIGluZGVudCBsZXZlbCBvZiAwIHdpbGwgb25seSBpbnNlcnQgbmV3bGluZXMuICBgYE5vbmVgYCBpcyB0aGUgbW9zdAogICAgY29tcGFjdCByZXByZXNlbnRhdGlvbi4KIAorICAgLi4gbm90ZTo6CisKKyAgICAgIFNpbmNlIHRoZSBkZWZhdWx0IGl0ZW0gc2VwYXJhdG9yIGlzIGBgJywgJ2BgLCAgdGhlIG91dHB1dCBtaWdodCBpbmNsdWRlCisgICAgICB0cmFpbGluZyB3aGl0ZXNwYWNlIHdoZW4gKmluZGVudCogaXMgc3BlY2lmaWVkLiAgWW91IGNhbiB1c2UKKyAgICAgIGBgc2VwYXJhdG9ycz0oJywnLCAnOiAnKWBgIHRvIGF2b2lkIHRoaXMuCisKICAgIElmIHNwZWNpZmllZCwgKnNlcGFyYXRvcnMqIHNob3VsZCBiZSBhbiBgYChpdGVtX3NlcGFyYXRvciwga2V5X3NlcGFyYXRvcilgYAogICAgdHVwbGUuICBUaGUgZGVmYXVsdCBpcyBgYCgnLCAnLCAnOiAnKWBgLiAgVG8gZ2V0IHRoZSBtb3N0IGNvbXBhY3QgSlNPTgogICAgcmVwcmVzZW50YXRpb24sIHlvdSBzaG91bGQgc3BlY2lmeSBgYCgnLCcsICc6JylgYCB0byBlbGltaW5hdGUgd2hpdGVzcGFjZS4KQEAgLTQwOCw2ICs0NjMsNyBAQAogICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgcmV0dXJuIGxpc3QoaXRlcmFibGUpCisgICAgICAgICAgICAjIExldCB0aGUgYmFzZSBjbGFzcyBkZWZhdWx0IG1ldGhvZCByYWlzZSB0aGUgVHlwZUVycm9yCiAgICAgICAgICAgICByZXR1cm4gSlNPTkVuY29kZXIuZGVmYXVsdChzZWxmLCBvKQogCiAKQEAgLTQyNywzICs0ODMsMTA4IEBACiAKICAgICAgICAgICAgIGZvciBjaHVuayBpbiBKU09ORW5jb2RlcigpLml0ZXJlbmNvZGUoYmlnb2JqZWN0KToKICAgICAgICAgICAgICAgICBteXNvY2tldC53cml0ZShjaHVuaykKKworCitTdGFuZGFyZCBDb21wbGlhbmNlCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBKU09OIGZvcm1hdCBpcyBzcGVjaWZpZWQgYnkgOnJmYzpgNDYyN2AuICBUaGlzIHNlY3Rpb24gZGV0YWlscyB0aGlzCittb2R1bGUncyBsZXZlbCBvZiBjb21wbGlhbmNlIHdpdGggdGhlIFJGQy4gIEZvciBzaW1wbGljaXR5LAorOmNsYXNzOmBKU09ORW5jb2RlcmAgYW5kIDpjbGFzczpgSlNPTkRlY29kZXJgIHN1YmNsYXNzZXMsIGFuZCBwYXJhbWV0ZXJzIG90aGVyCit0aGFuIHRob3NlIGV4cGxpY2l0bHkgbWVudGlvbmVkLCBhcmUgbm90IGNvbnNpZGVyZWQuCisKK1RoaXMgbW9kdWxlIGRvZXMgbm90IGNvbXBseSB3aXRoIHRoZSBSRkMgaW4gYSBzdHJpY3QgZmFzaGlvbiwgaW1wbGVtZW50aW5nIHNvbWUKK2V4dGVuc2lvbnMgdGhhdCBhcmUgdmFsaWQgSmF2YVNjcmlwdCBidXQgbm90IHZhbGlkIEpTT04uICBJbiBwYXJ0aWN1bGFyOgorCistIFRvcC1sZXZlbCBub24tb2JqZWN0LCBub24tYXJyYXkgdmFsdWVzIGFyZSBhY2NlcHRlZCBhbmQgb3V0cHV0OworLSBJbmZpbml0ZSBhbmQgTmFOIG51bWJlciB2YWx1ZXMgYXJlIGFjY2VwdGVkIGFuZCBvdXRwdXQ7CistIFJlcGVhdGVkIG5hbWVzIHdpdGhpbiBhbiBvYmplY3QgYXJlIGFjY2VwdGVkLCBhbmQgb25seSB0aGUgdmFsdWUgb2YgdGhlIGxhc3QKKyAgbmFtZS12YWx1ZSBwYWlyIGlzIHVzZWQuCisKK1NpbmNlIHRoZSBSRkMgcGVybWl0cyBSRkMtY29tcGxpYW50IHBhcnNlcnMgdG8gYWNjZXB0IGlucHV0IHRleHRzIHRoYXQgYXJlIG5vdAorUkZDLWNvbXBsaWFudCwgdGhpcyBtb2R1bGUncyBkZXNlcmlhbGl6ZXIgaXMgdGVjaG5pY2FsbHkgUkZDLWNvbXBsaWFudCB1bmRlcgorZGVmYXVsdCBzZXR0aW5ncy4KKworQ2hhcmFjdGVyIEVuY29kaW5ncworXl5eXl5eXl5eXl5eXl5eXl5eXgorCitUaGUgUkZDIHJlY29tbWVuZHMgdGhhdCBKU09OIGJlIHJlcHJlc2VudGVkIHVzaW5nIGVpdGhlciBVVEYtOCwgVVRGLTE2LCBvcgorVVRGLTMyLCB3aXRoIFVURi04IGJlaW5nIHRoZSBkZWZhdWx0LiAgQWNjb3JkaW5nbHksIHRoaXMgbW9kdWxlIHVzZXMgVVRGLTggYXMKK3RoZSBkZWZhdWx0IGZvciBpdHMgKmVuY29kaW5nKiBwYXJhbWV0ZXIuCisKK1RoaXMgbW9kdWxlJ3MgZGVzZXJpYWxpemVyIG9ubHkgZGlyZWN0bHkgd29ya3Mgd2l0aCBBU0NJSS1jb21wYXRpYmxlIGVuY29kaW5nczsKK1VURi0xNiwgVVRGLTMyLCBhbmQgb3RoZXIgQVNDSUktaW5jb21wYXRpYmxlIGVuY29kaW5ncyByZXF1aXJlIHRoZSB1c2Ugb2YKK3dvcmthcm91bmRzIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGRlc2VyaWFsaXplcidzICplbmNvZGluZyoKK3BhcmFtZXRlci4KKworVGhlIFJGQyBhbHNvIG5vbi1ub3JtYXRpdmVseSBkZXNjcmliZXMgYSBsaW1pdGVkIGVuY29kaW5nIGRldGVjdGlvbiB0ZWNobmlxdWUKK2ZvciBKU09OIHRleHRzOyB0aGlzIG1vZHVsZSdzIGRlc2VyaWFsaXplciBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBvciBhbnkgb3RoZXIKK2tpbmQgb2YgZW5jb2RpbmcgZGV0ZWN0aW9uLgorCitBcyBwZXJtaXR0ZWQsIHRob3VnaCBub3QgcmVxdWlyZWQsIGJ5IHRoZSBSRkMsIHRoaXMgbW9kdWxlJ3Mgc2VyaWFsaXplciBzZXRzCisqZW5zdXJlX2FzY2lpPVRydWUqIGJ5IGRlZmF1bHQsIHRodXMgZXNjYXBpbmcgdGhlIG91dHB1dCBzbyB0aGF0IHRoZSByZXN1bHRpbmcKK3N0cmluZ3Mgb25seSBjb250YWluIEFTQ0lJIGNoYXJhY3RlcnMuCisKKworVG9wLWxldmVsIE5vbi1PYmplY3QsIE5vbi1BcnJheSBWYWx1ZXMKK15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisKK1RoZSBSRkMgc3BlY2lmaWVzIHRoYXQgdGhlIHRvcC1sZXZlbCB2YWx1ZSBvZiBhIEpTT04gdGV4dCBtdXN0IGJlIGVpdGhlciBhCitKU09OIG9iamVjdCBvciBhcnJheSAoUHl0aG9uIDpjbGFzczpgZGljdGAgb3IgOmNsYXNzOmBsaXN0YCkuICBUaGlzIG1vZHVsZSdzCitkZXNlcmlhbGl6ZXIgYWxzbyBhY2NlcHRzIGlucHV0IHRleHRzIGNvbnNpc3Rpbmcgc29sZWx5IG9mIGEKK0pTT04gbnVsbCwgYm9vbGVhbiwgbnVtYmVyLCBvciBzdHJpbmcgdmFsdWU6OgorCisgICA+Pj4ganVzdF9hX2pzb25fc3RyaW5nID0gJyJzcGFtIGFuZCBlZ2dzIicgICMgTm90IGJ5IGl0c2VsZiBhIHZhbGlkIEpTT04gdGV4dAorICAgPj4+IGpzb24ubG9hZHMoanVzdF9hX2pzb25fc3RyaW5nKQorICAgdSdzcGFtIGFuZCBlZ2dzJworCitUaGlzIG1vZHVsZSBpdHNlbGYgZG9lcyBub3QgaW5jbHVkZSBhIHdheSB0byByZXF1ZXN0IHRoYXQgc3VjaCBpbnB1dCB0ZXh0cyBiZQorcmVnYXJkZWQgYXMgaWxsZWdhbC4gIExpa2V3aXNlLCB0aGlzIG1vZHVsZSdzIHNlcmlhbGl6ZXIgYWxzbyBhY2NlcHRzIHNpbmdsZQorUHl0aG9uIDpkYXRhOmBOb25lYCwgOmNsYXNzOmBib29sYCwgbnVtZXJpYywgYW5kIDpjbGFzczpgc3RyYAordmFsdWVzIGFzIGlucHV0IGFuZCB3aWxsIGdlbmVyYXRlIG91dHB1dCB0ZXh0cyBjb25zaXN0aW5nIHNvbGVseSBvZiBhIHRvcC1sZXZlbAorSlNPTiBudWxsLCBib29sZWFuLCBudW1iZXIsIG9yIHN0cmluZyB2YWx1ZSB3aXRob3V0IHJhaXNpbmcgYW4gZXhjZXB0aW9uOjoKKworICAgPj4+IG5laXRoZXJfYV9saXN0X25vcl9hX2RpY3QgPSB1InNwYW0gYW5kIGVnZ3MiCisgICA+Pj4ganNvbi5kdW1wcyhuZWl0aGVyX2FfbGlzdF9ub3JfYV9kaWN0KSAgIyBUaGUgcmVzdWx0IGlzIG5vdCBhIHZhbGlkIEpTT04gdGV4dAorICAgJyJzcGFtIGFuZCBlZ2dzIicKKworVGhpcyBtb2R1bGUncyBzZXJpYWxpemVyIGRvZXMgbm90IGl0c2VsZiBpbmNsdWRlIGEgd2F5IHRvIGVuZm9yY2UgdGhlCithZm9yZW1lbnRpb25lZCBjb25zdHJhaW50LgorCisKK0luZmluaXRlIGFuZCBOYU4gTnVtYmVyIFZhbHVlcworXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisKK1RoZSBSRkMgZG9lcyBub3QgcGVybWl0IHRoZSByZXByZXNlbnRhdGlvbiBvZiBpbmZpbml0ZSBvciBOYU4gbnVtYmVyIHZhbHVlcy4KK0Rlc3BpdGUgdGhhdCwgYnkgZGVmYXVsdCwgdGhpcyBtb2R1bGUgYWNjZXB0cyBhbmQgb3V0cHV0cyBgYEluZmluaXR5YGAsCitgYC1JbmZpbml0eWBgLCBhbmQgYGBOYU5gYCBhcyBpZiB0aGV5IHdlcmUgdmFsaWQgSlNPTiBudW1iZXIgbGl0ZXJhbCB2YWx1ZXM6OgorCisgICA+Pj4gIyBOZWl0aGVyIG9mIHRoZXNlIGNhbGxzIHJhaXNlcyBhbiBleGNlcHRpb24sIGJ1dCB0aGUgcmVzdWx0cyBhcmUgbm90IHZhbGlkIEpTT04KKyAgID4+PiBqc29uLmR1bXBzKGZsb2F0KCctaW5mJykpCisgICAnLUluZmluaXR5JworICAgPj4+IGpzb24uZHVtcHMoZmxvYXQoJ25hbicpKQorICAgJ05hTicKKyAgID4+PiAjIFNhbWUgd2hlbiBkZXNlcmlhbGl6aW5nCisgICA+Pj4ganNvbi5sb2FkcygnLUluZmluaXR5JykKKyAgIC1pbmYKKyAgID4+PiBqc29uLmxvYWRzKCdOYU4nKQorICAgbmFuCisKK0luIHRoZSBzZXJpYWxpemVyLCB0aGUgKmFsbG93X25hbiogcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIGFsdGVyIHRoaXMKK2JlaGF2aW9yLiAgSW4gdGhlIGRlc2VyaWFsaXplciwgdGhlICpwYXJzZV9jb25zdGFudCogcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvCithbHRlciB0aGlzIGJlaGF2aW9yLgorCisKK1JlcGVhdGVkIE5hbWVzIFdpdGhpbiBhbiBPYmplY3QKK15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKworVGhlIFJGQyBzcGVjaWZpZXMgdGhhdCB0aGUgbmFtZXMgd2l0aGluIGEgSlNPTiBvYmplY3Qgc2hvdWxkIGJlIHVuaXF1ZSwgYnV0Citkb2VzIG5vdCBzcGVjaWZ5IGhvdyByZXBlYXRlZCBuYW1lcyBpbiBKU09OIG9iamVjdHMgc2hvdWxkIGJlIGhhbmRsZWQuICBCeQorZGVmYXVsdCwgdGhpcyBtb2R1bGUgZG9lcyBub3QgcmFpc2UgYW4gZXhjZXB0aW9uOyBpbnN0ZWFkLCBpdCBpZ25vcmVzIGFsbCBidXQKK3RoZSBsYXN0IG5hbWUtdmFsdWUgcGFpciBmb3IgYSBnaXZlbiBuYW1lOjoKKworICAgPj4+IHdlaXJkX2pzb24gPSAneyJ4IjogMSwgIngiOiAyLCAieCI6IDN9JworICAgPj4+IGpzb24ubG9hZHMod2VpcmRfanNvbikKKyAgIHt1J3gnOiAzfQorCitUaGUgKm9iamVjdF9wYWlyc19ob29rKiBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gYWx0ZXIgdGhpcyBiZWhhdmlvci4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2xvY2FsZS5yc3QgYi9Eb2MvbGlicmFyeS9sb2NhbGUucnN0CmluZGV4IDljYzNhYjUuLjU1OTA1MTQgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2xvY2FsZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvbG9jYWxlLnJzdApAQCAtNTksNiArNTksOCBAQAogICAgUmV0dXJucyB0aGUgZGF0YWJhc2Ugb2YgdGhlIGxvY2FsIGNvbnZlbnRpb25zIGFzIGEgZGljdGlvbmFyeS4gVGhpcyBkaWN0aW9uYXJ5CiAgICBoYXMgdGhlIGZvbGxvd2luZyBzdHJpbmdzIGFzIGtleXM6CiAKKyAgIC4uIHRhYnVsYXJjb2x1bW5zOjogfGx8bHxMfAorCiAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICAgfCBDYXRlZ29yeSAgICAgICAgICAgICB8IEtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICs9PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCkBAIC0xNjQsMjIgKzE2NiwyMiBAQAogCiAgICAuLiBkYXRhOjogRF9UX0ZNVAogCi0gICAgICBHZXQgYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIGZvcm1hdCBzdHJpbmcgZm9yIDpmdW5jOmBzdHJmdGltZWAgdG8KKyAgICAgIEdldCBhIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgZm9ybWF0IHN0cmluZyBmb3IgOmZ1bmM6YHRpbWUuc3RyZnRpbWVgIHRvCiAgICAgICByZXByZXNlbnQgZGF0ZSBhbmQgdGltZSBpbiBhIGxvY2FsZS1zcGVjaWZpYyB3YXkuCiAKICAgIC4uIGRhdGE6OiBEX0ZNVAogCi0gICAgICBHZXQgYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIGZvcm1hdCBzdHJpbmcgZm9yIDpmdW5jOmBzdHJmdGltZWAgdG8KKyAgICAgIEdldCBhIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgZm9ybWF0IHN0cmluZyBmb3IgOmZ1bmM6YHRpbWUuc3RyZnRpbWVgIHRvCiAgICAgICByZXByZXNlbnQgYSBkYXRlIGluIGEgbG9jYWxlLXNwZWNpZmljIHdheS4KIAogICAgLi4gZGF0YTo6IFRfRk1UCiAKLSAgICAgIEdldCBhIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgZm9ybWF0IHN0cmluZyBmb3IgOmZ1bmM6YHN0cmZ0aW1lYCB0bworICAgICAgR2V0IGEgc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBmb3JtYXQgc3RyaW5nIGZvciA6ZnVuYzpgdGltZS5zdHJmdGltZWAgdG8KICAgICAgIHJlcHJlc2VudCBhIHRpbWUgaW4gYSBsb2NhbGUtc3BlY2lmaWMgd2F5LgogCiAgICAuLiBkYXRhOjogVF9GTVRfQU1QTQogCi0gICAgICBHZXQgYSBmb3JtYXQgc3RyaW5nIGZvciA6ZnVuYzpgc3RyZnRpbWVgIHRvIHJlcHJlc2VudCB0aW1lIGluIHRoZSBhbS9wbQorICAgICAgR2V0IGEgZm9ybWF0IHN0cmluZyBmb3IgOmZ1bmM6YHRpbWUuc3RyZnRpbWVgIHRvIHJlcHJlc2VudCB0aW1lIGluIHRoZSBhbS9wbQogICAgICAgZm9ybWF0LgogCiAgICAuLiBkYXRhOjogREFZXzEgLi4uIERBWV83CkBAIC0yMTksNyArMjIxLDcgQEAKIAogICAgICAgLi4gbm90ZTo6CiAKLSAgICAgICAgIFRoZSBleHByZXNzaW9uIGlzIGluIHRoZSBzeW50YXggc3VpdGFibGUgZm9yIHRoZSA6Y2Z1bmM6YHJlZ2V4YCBmdW5jdGlvbgorICAgICAgICAgVGhlIGV4cHJlc3Npb24gaXMgaW4gdGhlIHN5bnRheCBzdWl0YWJsZSBmb3IgdGhlIDpjOmZ1bmM6YHJlZ2V4YCBmdW5jdGlvbgogICAgICAgICAgZnJvbSB0aGUgQyBsaWJyYXJ5LCB3aGljaCBtaWdodCBkaWZmZXIgZnJvbSB0aGUgc3ludGF4IHVzZWQgaW4gOm1vZDpgcmVgLgogCiAgICAuLiBkYXRhOjogTk9FWFBSCkBAIC0yNDMsMjQgKzI0NSwyNCBAQAogICAgICAgdGhlbi1lbXBlcm9yJ3MgcmVpZ24uCiAKICAgICAgIE5vcm1hbGx5IGl0IHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IHRvIHVzZSB0aGlzIHZhbHVlIGRpcmVjdGx5LiBTcGVjaWZ5aW5nCi0gICAgICB0aGUgYGBFYGAgbW9kaWZpZXIgaW4gdGhlaXIgZm9ybWF0IHN0cmluZ3MgY2F1c2VzIHRoZSA6ZnVuYzpgc3RyZnRpbWVgCisgICAgICB0aGUgYGBFYGAgbW9kaWZpZXIgaW4gdGhlaXIgZm9ybWF0IHN0cmluZ3MgY2F1c2VzIHRoZSA6ZnVuYzpgdGltZS5zdHJmdGltZWAKICAgICAgIGZ1bmN0aW9uIHRvIHVzZSB0aGlzIGluZm9ybWF0aW9uLiAgVGhlIGZvcm1hdCBvZiB0aGUgcmV0dXJuZWQgc3RyaW5nIGlzIG5vdAogICAgICAgc3BlY2lmaWVkLCBhbmQgdGhlcmVmb3JlIHlvdSBzaG91bGQgbm90IGFzc3VtZSBrbm93bGVkZ2Ugb2YgaXQgb24gZGlmZmVyZW50CiAgICAgICBzeXN0ZW1zLgogCiAgICAuLiBkYXRhOjogRVJBX0RfVF9GTVQKIAotICAgICAgR2V0IGEgZm9ybWF0IHN0cmluZyBmb3IgOmZ1bmM6YHN0cmZ0aW1lYCB0byByZXByZXNlbnQgZGF0ZSBhbmQgdGltZSBpbiBhCisgICAgICBHZXQgYSBmb3JtYXQgc3RyaW5nIGZvciA6ZnVuYzpgdGltZS5zdHJmdGltZWAgdG8gcmVwcmVzZW50IGRhdGUgYW5kIHRpbWUgaW4gYQogICAgICAgbG9jYWxlLXNwZWNpZmljIGVyYS1iYXNlZCB3YXkuCiAKICAgIC4uIGRhdGE6OiBFUkFfRF9GTVQKIAotICAgICAgR2V0IGEgZm9ybWF0IHN0cmluZyBmb3IgOmZ1bmM6YHN0cmZ0aW1lYCB0byByZXByZXNlbnQgYSBkYXRlIGluIGEKKyAgICAgIEdldCBhIGZvcm1hdCBzdHJpbmcgZm9yIDpmdW5jOmB0aW1lLnN0cmZ0aW1lYCB0byByZXByZXNlbnQgYSBkYXRlIGluIGEKICAgICAgIGxvY2FsZS1zcGVjaWZpYyBlcmEtYmFzZWQgd2F5LgogCiAgICAuLiBkYXRhOjogRVJBX1RfRk1UCiAKLSAgICAgIEdldCBhIGZvcm1hdCBzdHJpbmcgZm9yIDpmdW5jOmBzdHJmdGltZWAgdG8gcmVwcmVzZW50IGEgdGltZSBpbiBhCisgICAgICBHZXQgYSBmb3JtYXQgc3RyaW5nIGZvciA6ZnVuYzpgdGltZS5zdHJmdGltZWAgdG8gcmVwcmVzZW50IGEgdGltZSBpbiBhCiAgICAgICBsb2NhbGUtc3BlY2lmaWMgZXJhLWJhc2VkIHdheS4KIAogICAgLi4gZGF0YTo6IEFMVF9ESUdJVFMKQEAgLTU2MCw3ICs1NjIsNyBAQAogUHl0aG9uIGFwcGxpY2F0aW9ucyBzaG91bGQgbm9ybWFsbHkgZmluZCBubyBuZWVkIHRvIGludm9rZSB0aGVzZSBmdW5jdGlvbnMsIGFuZAogc2hvdWxkIHVzZSA6bW9kOmBnZXR0ZXh0YCBpbnN0ZWFkLiAgQSBrbm93biBleGNlcHRpb24gdG8gdGhpcyBydWxlIGFyZQogYXBwbGljYXRpb25zIHRoYXQgbGluayB3aXRoIGFkZGl0aW9uYWwgQyBsaWJyYXJpZXMgd2hpY2ggaW50ZXJuYWxseSBpbnZva2UKLTpjZnVuYzpgZ2V0dGV4dGAgb3IgOmZ1bmM6YGRjZ2V0dGV4dGAuICBGb3IgdGhlc2UgYXBwbGljYXRpb25zLCBpdCBtYXkgYmUKKzpjOmZ1bmM6YGdldHRleHRgIG9yIDpmdW5jOmBkY2dldHRleHRgLiAgRm9yIHRoZXNlIGFwcGxpY2F0aW9ucywgaXQgbWF5IGJlCiBuZWNlc3NhcnkgdG8gYmluZCB0aGUgdGV4dCBkb21haW4sIHNvIHRoYXQgdGhlIGxpYnJhcmllcyBjYW4gcHJvcGVybHkgbG9jYXRlCiB0aGVpciBtZXNzYWdlIGNhdGFsb2dzLgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9sb2dnaW5nLmNvbmZpZy5yc3QgYi9Eb2MvbGlicmFyeS9sb2dnaW5nLmNvbmZpZy5yc3QKaW5kZXggOGIzOWJlNC4uYzYxOGFhOCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvbG9nZ2luZy5jb25maWcucnN0CisrKyBiL0RvYy9saWJyYXJ5L2xvZ2dpbmcuY29uZmlnLnJzdApAQCAtMTcsNiArMTcsMTAgQEAKICAgICogOnJlZjpgQWR2YW5jZWQgVHV0b3JpYWwgPGxvZ2dpbmctYWR2YW5jZWQtdHV0b3JpYWw+YAogICAgKiA6cmVmOmBMb2dnaW5nIENvb2tib29rIDxsb2dnaW5nLWNvb2tib29rPmAKIAorKipTb3VyY2UgY29kZToqKiA6c291cmNlOmBMaWIvbG9nZ2luZy9jb25maWcucHlgCisKKy0tLS0tLS0tLS0tLS0tCisKIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIEFQSSBmb3IgY29uZmlndXJpbmcgdGhlIGxvZ2dpbmcgbW9kdWxlLgogCiAuLiBfbG9nZ2luZy1jb25maWctYXBpOgpAQCAtNzcsOCArODEsOSBAQAogLi4gZnVuY3Rpb246OiBmaWxlQ29uZmlnKGZuYW1lLCBkZWZhdWx0cz1Ob25lLCBkaXNhYmxlX2V4aXN0aW5nX2xvZ2dlcnM9VHJ1ZSkKIAogICAgUmVhZHMgdGhlIGxvZ2dpbmcgY29uZmlndXJhdGlvbiBmcm9tIGEgOm1vZDpgY29uZmlncGFyc2VyYFwtZm9ybWF0IGZpbGUKLSAgIG5hbWVkICpmbmFtZSouIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBzZXZlcmFsIHRpbWVzIGZyb20gYW4KLSAgIGFwcGxpY2F0aW9uLCBhbGxvd2luZyBhbiBlbmQgdXNlciB0byBzZWxlY3QgZnJvbSB2YXJpb3VzIHByZS1jYW5uZWQKKyAgIG5hbWVkICpmbmFtZSouIFRoZSBmb3JtYXQgb2YgdGhlIGZpbGUgc2hvdWxkIGJlIGFzIGRlc2NyaWJlZCBpbgorICAgOnJlZjpgbG9nZ2luZy1jb25maWctZmlsZWZvcm1hdGAuIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBzZXZlcmFsIHRpbWVzCisgICBmcm9tIGFuIGFwcGxpY2F0aW9uLCBhbGxvd2luZyBhbiBlbmQgdXNlciB0byBzZWxlY3QgZnJvbSB2YXJpb3VzIHByZS1jYW5uZWQKICAgIGNvbmZpZ3VyYXRpb25zIChpZiB0aGUgZGV2ZWxvcGVyIHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIHByZXNlbnQgdGhlIGNob2ljZXMKICAgIGFuZCBsb2FkIHRoZSBjaG9zZW4gY29uZmlndXJhdGlvbikuCiAKQEAgLTEwNCwxNCArMTA5LDMwIEBACiAgICBjb25maWd1cmF0aW9ucy4gSWYgbm8gcG9ydCBpcyBzcGVjaWZpZWQsIHRoZSBtb2R1bGUncyBkZWZhdWx0CiAgICA6Y29uc3Q6YERFRkFVTFRfTE9HR0lOR19DT05GSUdfUE9SVGAgaXMgdXNlZC4gTG9nZ2luZyBjb25maWd1cmF0aW9ucyB3aWxsIGJlCiAgICBzZW50IGFzIGEgZmlsZSBzdWl0YWJsZSBmb3IgcHJvY2Vzc2luZyBieSA6ZnVuYzpgZmlsZUNvbmZpZ2AuIFJldHVybnMgYQotICAgOmNsYXNzOmBUaHJlYWRgIGluc3RhbmNlIG9uIHdoaWNoIHlvdSBjYW4gY2FsbCA6bWV0aDpgc3RhcnRgIHRvIHN0YXJ0IHRoZQotICAgc2VydmVyLCBhbmQgd2hpY2ggeW91IGNhbiA6bWV0aDpgam9pbmAgd2hlbiBhcHByb3ByaWF0ZS4gVG8gc3RvcCB0aGUgc2VydmVyLAorICAgOmNsYXNzOmB+dGhyZWFkaW5nLlRocmVhZGAgaW5zdGFuY2Ugb24gd2hpY2ggeW91IGNhbiBjYWxsCisgICA6bWV0aDpgfnRocmVhZGluZy5UaHJlYWQuc3RhcnRgIHRvIHN0YXJ0IHRoZSBzZXJ2ZXIsIGFuZCB3aGljaCB5b3UgY2FuCisgICA6bWV0aDpgfnRocmVhZGluZy5UaHJlYWQuam9pbmAgd2hlbiBhcHByb3ByaWF0ZS4gVG8gc3RvcCB0aGUgc2VydmVyLAogICAgY2FsbCA6ZnVuYzpgc3RvcExpc3RlbmluZ2AuCiAKICAgIFRvIHNlbmQgYSBjb25maWd1cmF0aW9uIHRvIHRoZSBzb2NrZXQsIHJlYWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQKICAgIHNlbmQgaXQgdG8gdGhlIHNvY2tldCBhcyBhIHN0cmluZyBvZiBieXRlcyBwcmVjZWRlZCBieSBhIGZvdXItYnl0ZSBsZW5ndGgKICAgIHN0cmluZyBwYWNrZWQgaW4gYmluYXJ5IHVzaW5nIGBgc3RydWN0LnBhY2soJz5MJywgbilgYC4KIAorICAgLi4gbm90ZTo6CisKKyAgICAgIEJlY2F1c2UgcG9ydGlvbnMgb2YgdGhlIGNvbmZpZ3VyYXRpb24gYXJlIHBhc3NlZCB0aHJvdWdoCisgICAgICA6ZnVuYzpgZXZhbGAsIHVzZSBvZiB0aGlzIGZ1bmN0aW9uIG1heSBvcGVuIGl0cyB1c2VycyB0byBhIHNlY3VyaXR5IHJpc2suCisgICAgICBXaGlsZSB0aGUgZnVuY3Rpb24gb25seSBiaW5kcyB0byBhIHNvY2tldCBvbiBgYGxvY2FsaG9zdGBgLCBhbmQgc28gZG9lcworICAgICAgbm90IGFjY2VwdCBjb25uZWN0aW9ucyBmcm9tIHJlbW90ZSBtYWNoaW5lcywgdGhlcmUgYXJlIHNjZW5hcmlvcyB3aGVyZQorICAgICAgdW50cnVzdGVkIGNvZGUgY291bGQgYmUgcnVuIHVuZGVyIHRoZSBhY2NvdW50IG9mIHRoZSBwcm9jZXNzIHdoaWNoIGNhbGxzCisgICAgICA6ZnVuYzpgbGlzdGVuYC4gU3BlY2lmaWNhbGx5LCBpZiB0aGUgcHJvY2VzcyBjYWxsaW5nIDpmdW5jOmBsaXN0ZW5gIHJ1bnMKKyAgICAgIG9uIGEgbXVsdGktdXNlciBtYWNoaW5lIHdoZXJlIHVzZXJzIGNhbm5vdCB0cnVzdCBlYWNoIG90aGVyLCB0aGVuIGEKKyAgICAgIG1hbGljaW91cyB1c2VyIGNvdWxkIGFycmFuZ2UgdG8gcnVuIGVzc2VudGlhbGx5IGFyYml0cmFyeSBjb2RlIGluIGEKKyAgICAgIHZpY3RpbSB1c2VyJ3MgcHJvY2Vzcywgc2ltcGx5IGJ5IGNvbm5lY3RpbmcgdG8gdGhlIHZpY3RpbSdzCisgICAgICA6ZnVuYzpgbGlzdGVuYCBzb2NrZXQgYW5kIHNlbmRpbmcgYSBjb25maWd1cmF0aW9uIHdoaWNoIHJ1bnMgd2hhdGV2ZXIKKyAgICAgIGNvZGUgdGhlIGF0dGFja2VyIHdhbnRzIHRvIGhhdmUgZXhlY3V0ZWQgaW4gdGhlIHZpY3RpbSdzIHByb2Nlc3MuIFRoaXMgaXMKKyAgICAgIGVzcGVjaWFsbHkgZWFzeSB0byBkbyBpZiB0aGUgZGVmYXVsdCBwb3J0IGlzIHVzZWQsIGJ1dCBub3QgaGFyZCBldmVuIGlmIGEKKyAgICAgIGRpZmZlcmVudCBwb3J0IGlzIHVzZWQpLgogCiAuLiBmdW5jdGlvbjo6IHN0b3BMaXN0ZW5pbmcoKQogCkBAIC0xNTYsMTEgKzE3NywxMSBAQAogCiAqICpmb3JtYXR0ZXJzKiAtIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIHdpbGwgYmUgYSBkaWN0IGluIHdoaWNoIGVhY2gKICAga2V5IGlzIGEgZm9ybWF0dGVyIGlkIGFuZCBlYWNoIHZhbHVlIGlzIGEgZGljdCBkZXNjcmliaW5nIGhvdyB0bwotICBjb25maWd1cmUgdGhlIGNvcnJlc3BvbmRpbmcgRm9ybWF0dGVyIGluc3RhbmNlLgorICBjb25maWd1cmUgdGhlIGNvcnJlc3BvbmRpbmcgOmNsYXNzOmB+bG9nZ2luZy5Gb3JtYXR0ZXJgIGluc3RhbmNlLgogCiAgIFRoZSBjb25maWd1cmluZyBkaWN0IGlzIHNlYXJjaGVkIGZvciBrZXlzIGBgZm9ybWF0YGAgYW5kIGBgZGF0ZWZtdGBgCiAgICh3aXRoIGRlZmF1bHRzIG9mIGBgTm9uZWBgKSBhbmQgdGhlc2UgYXJlIHVzZWQgdG8gY29uc3RydWN0IGEKLSAgOmNsYXNzOmBsb2dnaW5nLkZvcm1hdHRlcmAgaW5zdGFuY2UuCisgIDpjbGFzczpgfmxvZ2dpbmcuRm9ybWF0dGVyYCBpbnN0YW5jZS4KIAogKiAqZmlsdGVycyogLSB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSB3aWxsIGJlIGEgZGljdCBpbiB3aGljaCBlYWNoIGtleQogICBpcyBhIGZpbHRlciBpZCBhbmQgZWFjaCB2YWx1ZSBpcyBhIGRpY3QgZGVzY3JpYmluZyBob3cgdG8gY29uZmlndXJlCkBAIC02OTgsOCArNzE5LDE3IEBACiAKIFRoZSBgYGNsYXNzYGAgZW50cnkgaXMgb3B0aW9uYWwuICBJdCBpbmRpY2F0ZXMgdGhlIG5hbWUgb2YgdGhlIGZvcm1hdHRlcidzIGNsYXNzCiAoYXMgYSBkb3R0ZWQgbW9kdWxlIGFuZCBjbGFzcyBuYW1lLikgIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBmb3IgaW5zdGFudGlhdGluZyBhCi06Y2xhc3M6YEZvcm1hdHRlcmAgc3ViY2xhc3MuICBTdWJjbGFzc2VzIG9mIDpjbGFzczpgRm9ybWF0dGVyYCBjYW4gcHJlc2VudAotZXhjZXB0aW9uIHRyYWNlYmFja3MgaW4gYW4gZXhwYW5kZWQgb3IgY29uZGVuc2VkIGZvcm1hdC4KKzpjbGFzczpgfmxvZ2dpbmcuRm9ybWF0dGVyYCBzdWJjbGFzcy4gIFN1YmNsYXNzZXMgb2YKKzpjbGFzczpgfmxvZ2dpbmcuRm9ybWF0dGVyYCBjYW4gcHJlc2VudCBleGNlcHRpb24gdHJhY2ViYWNrcyBpbiBhbiBleHBhbmRlZCBvcgorY29uZGVuc2VkIGZvcm1hdC4KKworLi4gbm90ZTo6CisKKyAgIER1ZSB0byB0aGUgdXNlIG9mIDpmdW5jOmBldmFsYCBhcyBkZXNjcmliZWQgYWJvdmUsIHRoZXJlIGFyZQorICAgcG90ZW50aWFsIHNlY3VyaXR5IHJpc2tzIHdoaWNoIHJlc3VsdCBmcm9tIHVzaW5nIHRoZSA6ZnVuYzpgbGlzdGVuYCB0byBzZW5kCisgICBhbmQgcmVjZWl2ZSBjb25maWd1cmF0aW9ucyB2aWEgc29ja2V0cy4gVGhlIHJpc2tzIGFyZSBsaW1pdGVkIHRvIHdoZXJlCisgICBtdWx0aXBsZSB1c2VycyB3aXRoIG5vIG11dHVhbCB0cnVzdCBydW4gY29kZSBvbiB0aGUgc2FtZSBtYWNoaW5lOyBzZWUgdGhlCisgICA6ZnVuYzpgbGlzdGVuYCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgogCiAuLiBzZWVhbHNvOjoKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvbG9nZ2luZy5oYW5kbGVycy5yc3QgYi9Eb2MvbGlicmFyeS9sb2dnaW5nLmhhbmRsZXJzLnJzdAppbmRleCBjOTQ0NDU0Li5kMGY5YmU4IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9sb2dnaW5nLmhhbmRsZXJzLnJzdAorKysgYi9Eb2MvbGlicmFyeS9sb2dnaW5nLmhhbmRsZXJzLnJzdApAQCAtMTcsNiArMTcsMTAgQEAKICAgICogOnJlZjpgQWR2YW5jZWQgVHV0b3JpYWwgPGxvZ2dpbmctYWR2YW5jZWQtdHV0b3JpYWw+YAogICAgKiA6cmVmOmBMb2dnaW5nIENvb2tib29rIDxsb2dnaW5nLWNvb2tib29rPmAKIAorKipTb3VyY2UgY29kZToqKiA6c291cmNlOmBMaWIvbG9nZ2luZy9oYW5kbGVycy5weWAKKworLS0tLS0tLS0tLS0tLS0KKwogLi4gY3VycmVudG1vZHVsZTo6IGxvZ2dpbmcKIAogVGhlIGZvbGxvd2luZyB1c2VmdWwgaGFuZGxlcnMgYXJlIHByb3ZpZGVkIGluIHRoZSBwYWNrYWdlLiBOb3RlIHRoYXQgdGhyZWUgb2YKQEAgLTUzLDggKzU3LDggQEAKICAgIC4uIG1ldGhvZDo6IGZsdXNoKCkKIAogICAgICAgRmx1c2hlcyB0aGUgc3RyZWFtIGJ5IGNhbGxpbmcgaXRzIDptZXRoOmBmbHVzaGAgbWV0aG9kLiBOb3RlIHRoYXQgdGhlCi0gICAgICA6bWV0aDpgY2xvc2VgIG1ldGhvZCBpcyBpbmhlcml0ZWQgZnJvbSA6Y2xhc3M6YEhhbmRsZXJgIGFuZCBzbyBkb2VzCi0gICAgICBubyBvdXRwdXQsIHNvIGFuIGV4cGxpY2l0IDptZXRoOmBmbHVzaGAgY2FsbCBtYXkgYmUgbmVlZGVkIGF0IHRpbWVzLgorICAgICAgOm1ldGg6YGNsb3NlYCBtZXRob2QgaXMgaW5oZXJpdGVkIGZyb20gOmNsYXNzOmB+bG9nZ2luZy5IYW5kbGVyYCBhbmQgc28KKyAgICAgIGRvZXMgbm8gb3V0cHV0LCBzbyBhbiBleHBsaWNpdCA6bWV0aDpgZmx1c2hgIGNhbGwgbWF5IGJlIG5lZWRlZCBhdCB0aW1lcy4KIAogLi4gX2ZpbGUtaGFuZGxlcjoKIApAQCAtMTQyLDggKzE0Niw4IEBACiBUaGlzIGhhbmRsZXIgaXMgbm90IGFwcHJvcHJpYXRlIGZvciB1c2UgdW5kZXIgV2luZG93cywgYmVjYXVzZSB1bmRlciBXaW5kb3dzCiBvcGVuIGxvZyBmaWxlcyBjYW5ub3QgYmUgbW92ZWQgb3IgcmVuYW1lZCAtIGxvZ2dpbmcgb3BlbnMgdGhlIGZpbGVzIHdpdGgKIGV4Y2x1c2l2ZSBsb2NrcyAtIGFuZCBzbyB0aGVyZSBpcyBubyBuZWVkIGZvciBzdWNoIGEgaGFuZGxlci4gRnVydGhlcm1vcmUsCi0qU1RfSU5PKiBpcyBub3Qgc3VwcG9ydGVkIHVuZGVyIFdpbmRvd3M7IDpmdW5jOmBzdGF0YCBhbHdheXMgcmV0dXJucyB6ZXJvIGZvcgotdGhpcyB2YWx1ZS4KKypTVF9JTk8qIGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIgV2luZG93czsgOmZ1bmM6YH5vcy5zdGF0YCBhbHdheXMgcmV0dXJucyB6ZXJvCitmb3IgdGhpcyB2YWx1ZS4KIAogCiAuLiBjbGFzczo6IFdhdGNoZWRGaWxlSGFuZGxlcihmaWxlbmFtZVssbW9kZVssIGVuY29kaW5nWywgZGVsYXldXV0pCkBAIC0yMzYsMTEgKzI0MCwxNSBAQAogICAgKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgICB8IGBgJ0QnYGAgICAgICAgIHwgRGF5cyAgICAgICAgICAgICAgICAgIHwKICAgICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCBgYCdXJ2BgICAgICAgICB8IFdlZWsgZGF5ICgwPU1vbmRheSkgICB8CisgICB8IGBgJ1cwJy0nVzYnYGAgIHwgV2Vla2RheSAoMD1Nb25kYXkpICAgIHwKICAgICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICAgfCBgYCdtaWRuaWdodCdgYCB8IFJvbGwgb3ZlciBhdCBtaWRuaWdodCB8CiAgICArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKIAorICAgV2hlbiB1c2luZyB3ZWVrZGF5LWJhc2VkIHJvdGF0aW9uLCBzcGVjaWZ5ICdXMCcgZm9yIE1vbmRheSwgJ1cxJyBmb3IKKyAgIFR1ZXNkYXksIGFuZCBzbyBvbiB1cCB0byAnVzYnIGZvciBTdW5kYXkuIEluIHRoaXMgY2FzZSwgdGhlIHZhbHVlIHBhc3NlZCBmb3IKKyAgICppbnRlcnZhbCogaXNuJ3QgdXNlZC4KKwogICAgVGhlIHN5c3RlbSB3aWxsIHNhdmUgb2xkIGxvZyBmaWxlcyBieSBhcHBlbmRpbmcgZXh0ZW5zaW9ucyB0byB0aGUgZmlsZW5hbWUuCiAgICBUaGUgZXh0ZW5zaW9ucyBhcmUgZGF0ZS1hbmQtdGltZSBiYXNlZCwgdXNpbmcgdGhlIHN0cmZ0aW1lIGZvcm1hdAogICAgYGAlWS0lbS0lZF8lSC0lTS0lU2BgIG9yIGEgbGVhZGluZyBwb3J0aW9uIHRoZXJlb2YsIGRlcGVuZGluZyBvbiB0aGUKQEAgLTMwMSw3ICszMDksOCBAQAogICAgICAgYmluYXJ5IGZvcm1hdC4gSWYgdGhlcmUgaXMgYW4gZXJyb3Igd2l0aCB0aGUgc29ja2V0LCBzaWxlbnRseSBkcm9wcyB0aGUKICAgICAgIHBhY2tldC4gSWYgdGhlIGNvbm5lY3Rpb24gd2FzIHByZXZpb3VzbHkgbG9zdCwgcmUtZXN0YWJsaXNoZXMgdGhlCiAgICAgICBjb25uZWN0aW9uLiBUbyB1bnBpY2tsZSB0aGUgcmVjb3JkIGF0IHRoZSByZWNlaXZpbmcgZW5kIGludG8gYQotICAgICAgOmNsYXNzOmBMb2dSZWNvcmRgLCB1c2UgdGhlIDpmdW5jOmBtYWtlTG9nUmVjb3JkYCBmdW5jdGlvbi4KKyAgICAgIDpjbGFzczpgfmxvZ2dpbmcuTG9nUmVjb3JkYCwgdXNlIHRoZSA6ZnVuYzpgfmxvZ2dpbmcubWFrZUxvZ1JlY29yZGAKKyAgICAgIGZ1bmN0aW9uLgogCiAKICAgIC4uIG1ldGhvZDo6IGhhbmRsZUVycm9yKCkKQEAgLTM3OSw3ICszODgsOCBAQAogICAgICAgUGlja2xlcyB0aGUgcmVjb3JkJ3MgYXR0cmlidXRlIGRpY3Rpb25hcnkgYW5kIHdyaXRlcyBpdCB0byB0aGUgc29ja2V0IGluCiAgICAgICBiaW5hcnkgZm9ybWF0LiBJZiB0aGVyZSBpcyBhbiBlcnJvciB3aXRoIHRoZSBzb2NrZXQsIHNpbGVudGx5IGRyb3BzIHRoZQogICAgICAgcGFja2V0LiBUbyB1bnBpY2tsZSB0aGUgcmVjb3JkIGF0IHRoZSByZWNlaXZpbmcgZW5kIGludG8gYQotICAgICAgOmNsYXNzOmBMb2dSZWNvcmRgLCB1c2UgdGhlIDpmdW5jOmBtYWtlTG9nUmVjb3JkYCBmdW5jdGlvbi4KKyAgICAgIDpjbGFzczpgfmxvZ2dpbmcuTG9nUmVjb3JkYCwgdXNlIHRoZSA6ZnVuYzpgfmxvZ2dpbmcubWFrZUxvZ1JlY29yZGAKKyAgICAgIGZ1bmN0aW9uLgogCiAKICAgIC4uIG1ldGhvZDo6IG1ha2VTb2NrZXQoKQpAQCAtNjUwLDcgKzY2MCw3IEBACiA6Y2xhc3M6YEJ1ZmZlcmluZ0hhbmRsZXJgLCB3aGljaCBpcyBhbiBhYnN0cmFjdCBjbGFzcy4gVGhpcyBidWZmZXJzIGxvZ2dpbmcKIHJlY29yZHMgaW4gbWVtb3J5LiBXaGVuZXZlciBlYWNoIHJlY29yZCBpcyBhZGRlZCB0byB0aGUgYnVmZmVyLCBhIGNoZWNrIGlzIG1hZGUKIGJ5IGNhbGxpbmcgOm1ldGg6YHNob3VsZEZsdXNoYCB0byBzZWUgaWYgdGhlIGJ1ZmZlciBzaG91bGQgYmUgZmx1c2hlZC4gIElmIGl0Ci1zaG91bGQsIHRoZW4gOm1ldGg6YGZsdXNoYCBpcyBleHBlY3RlZCB0byBkbyB0aGUgbmVlZGZ1bC4KK3Nob3VsZCwgdGhlbiA6bWV0aDpgZmx1c2hgIGlzIGV4cGVjdGVkIHRvIGRvIHRoZSBmbHVzaGluZy4KIAogCiAuLiBjbGFzczo6IEJ1ZmZlcmluZ0hhbmRsZXIoY2FwYWNpdHkpCkBAIC02OTgsOSArNzA4LDYgQEAKIAogCiAgICAuLiBtZXRob2Q6OiBzZXRUYXJnZXQodGFyZ2V0KQotICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjYKLSAgICAgICpjcmVkZW50aWFscyogd2FzIGFkZGVkLgotCiAKICAgICAgIFNldHMgdGhlIHRhcmdldCBoYW5kbGVyIGZvciB0aGlzIGhhbmRsZXIuCiAKQEAgLTcyMiwxNSArNzI5LDI5IEBACiAKIC4uIGNsYXNzOjogSFRUUEhhbmRsZXIoaG9zdCwgdXJsLCBtZXRob2Q9J0dFVCcpCiAKLSAgIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDpjbGFzczpgSFRUUEhhbmRsZXJgIGNsYXNzLiBUaGUgKmhvc3QqIGNhbiBiZQorICAgUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgOmNsYXNzOmBIVFRQSGFuZGxlcmAgY2xhc3MuIFRoZSBgYGhvc3RgYCBjYW4gYmUKICAgIG9mIHRoZSBmb3JtIGBgaG9zdDpwb3J0YGAsIHNob3VsZCB5b3UgbmVlZCB0byB1c2UgYSBzcGVjaWZpYyBwb3J0IG51bWJlci4KLSAgIElmIG5vICptZXRob2QqIGlzIHNwZWNpZmllZCwgYGBHRVRgYCBpcyB1c2VkLgogCisgICAuLiBtZXRob2Q6OiBtYXBMb2dSZWNvcmQocmVjb3JkKQorCisgICAgICBQcm92aWRlcyBhIGRpY3Rpb25hcnksIGJhc2VkIG9uIGBgcmVjb3JkYGAsIHdoaWNoIGlzIHRvIGJlIFVSTC1lbmNvZGVkCisgICAgICBhbmQgc2VudCB0byB0aGUgd2ViIHNlcnZlci4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24ganVzdCByZXR1cm5zCisgICAgICBgYHJlY29yZC5fX2RpY3RfX2BgLiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBpZiBlLmcuIG9ubHkgYQorICAgICAgc3Vic2V0IG9mIDpjbGFzczpgfmxvZ2dpbmcuTG9nUmVjb3JkYCBpcyB0byBiZSBzZW50IHRvIHRoZSB3ZWIgc2VydmVyLCBvcgorICAgICAgaWYgbW9yZSBzcGVjaWZpYyBjdXN0b21pemF0aW9uIG9mIHdoYXQncyBzZW50IHRvIHRoZSBzZXJ2ZXIgaXMgcmVxdWlyZWQuCiAKICAgIC4uIG1ldGhvZDo6IGVtaXQocmVjb3JkKQogCi0gICAgICBTZW5kcyB0aGUgcmVjb3JkIHRvIHRoZSBXZWIgc2VydmVyIGFzIGEgcGVyY2VudC1lbmNvZGVkIGRpY3Rpb25hcnkuCisgICAgICBTZW5kcyB0aGUgcmVjb3JkIHRvIHRoZSBXZWIgc2VydmVyIGFzIGFuIFVSTC1lbmNvZGVkIGRpY3Rpb25hcnkuIFRoZQorICAgICAgOm1ldGg6YG1hcExvZ1JlY29yZGAgbWV0aG9kIGlzIHVzZWQgdG8gY29udmVydCB0aGUgcmVjb3JkIHRvIHRoZQorICAgICAgZGljdGlvbmFyeSB0byBiZSBzZW50LgogCisgICAuLiBub3RlOjogU2luY2UgcHJlcGFyaW5nIGEgcmVjb3JkIGZvciBzZW5kaW5nIGl0IHRvIGEgV2ViIHNlcnZlciBpcyBub3QKKyAgICAgIHRoZSBzYW1lIGFzIGEgZ2VuZXJpYyBmb3JtYXR0aW5nIG9wZXJhdGlvbiwgdXNpbmcgOm1ldGg6YHNldEZvcm1hdHRlcmAKKyAgICAgIHRvIHNwZWNpZnkgYSA6Y2xhc3M6YEZvcm1hdHRlcmAgZm9yIGEgOmNsYXNzOmBIVFRQSGFuZGxlcmAgaGFzIG5vIGVmZmVjdC4KKyAgICAgIEluc3RlYWQgb2YgY2FsbGluZyA6bWV0aDpgZm9ybWF0YCwgdGhpcyBoYW5kbGVyIGNhbGxzIDptZXRoOmBtYXBMb2dSZWNvcmRgCisgICAgICBhbmQgdGhlbiA6ZnVuYzpgdXJsbGliLnVybGVuY29kZWAgdG8gZW5jb2RlIHRoZSBkaWN0aW9uYXJ5IGluIGEgZm9ybQorICAgICAgc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gYSBXZWIgc2VydmVyLgogCiAuLiBzZWVhbHNvOjoKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvbG9nZ2luZy5yc3QgYi9Eb2MvbGlicmFyeS9sb2dnaW5nLnJzdAppbmRleCA1ZjZhYTdlLi4wYzUwYjJmIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9sb2dnaW5nLnJzdAorKysgYi9Eb2MvbGlicmFyeS9sb2dnaW5nLnJzdApAQCAtMjAsNiArMjAsOSBAQAogICAgKiA6cmVmOmBBZHZhbmNlZCBUdXRvcmlhbCA8bG9nZ2luZy1hZHZhbmNlZC10dXRvcmlhbD5gCiAgICAqIDpyZWY6YExvZ2dpbmcgQ29va2Jvb2sgPGxvZ2dpbmctY29va2Jvb2s+YAogCisqKlNvdXJjZSBjb2RlOioqIDpzb3VyY2U6YExpYi9sb2dnaW5nL19faW5pdF9fLnB5YAorCistLS0tLS0tLS0tLS0tLQogCiAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjMKIApAQCAtNTEsMjQgKzU0LDQ2IEBACiBMb2dnZXIgT2JqZWN0cwogLS0tLS0tLS0tLS0tLS0KIAotTG9nZ2VycyBoYXZlIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhbmQgbWV0aG9kcy4gTm90ZSB0aGF0IExvZ2dlcnMgYXJlIG5ldmVyCitMb2dnZXJzIGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFuZCBtZXRob2RzLiAgTm90ZSB0aGF0IExvZ2dlcnMgYXJlIG5ldmVyCiBpbnN0YW50aWF0ZWQgZGlyZWN0bHksIGJ1dCBhbHdheXMgdGhyb3VnaCB0aGUgbW9kdWxlLWxldmVsIGZ1bmN0aW9uCi1gYGxvZ2dpbmcuZ2V0TG9nZ2VyKG5hbWUpYGAuCitgYGxvZ2dpbmcuZ2V0TG9nZ2VyKG5hbWUpYGAuICBNdWx0aXBsZSBjYWxscyB0byA6ZnVuYzpgZ2V0TG9nZ2VyYCB3aXRoIHRoZSBzYW1lCituYW1lIHdpbGwgYWx3YXlzIHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgc2FtZSBMb2dnZXIgb2JqZWN0LgorCitUaGUgYGBuYW1lYGAgaXMgcG90ZW50aWFsbHkgYSBwZXJpb2Qtc2VwYXJhdGVkIGhpZXJhcmNoaWNhbCB2YWx1ZSwgbGlrZQorYGBmb28uYmFyLmJhemBgICh0aG91Z2ggaXQgY291bGQgYWxzbyBiZSBqdXN0IHBsYWluIGBgZm9vYGAsIGZvciBleGFtcGxlKS4KK0xvZ2dlcnMgdGhhdCBhcmUgZnVydGhlciBkb3duIGluIHRoZSBoaWVyYXJjaGljYWwgbGlzdCBhcmUgY2hpbGRyZW4gb2YgbG9nZ2VycworaGlnaGVyIHVwIGluIHRoZSBsaXN0LiAgRm9yIGV4YW1wbGUsIGdpdmVuIGEgbG9nZ2VyIHdpdGggYSBuYW1lIG9mIGBgZm9vYGAsCitsb2dnZXJzIHdpdGggbmFtZXMgb2YgYGBmb28uYmFyYGAsIGBgZm9vLmJhci5iYXpgYCwgYW5kIGBgZm9vLmJhbWBgIGFyZSBhbGwKK2Rlc2NlbmRhbnRzIG9mIGBgZm9vYGAuICBUaGUgbG9nZ2VyIG5hbWUgaGllcmFyY2h5IGlzIGFuYWxvZ291cyB0byB0aGUgUHl0aG9uCitwYWNrYWdlIGhpZXJhcmNoeSwgYW5kIGlkZW50aWNhbCB0byBpdCBpZiB5b3Ugb3JnYW5pc2UgeW91ciBsb2dnZXJzIG9uIGEKK3Blci1tb2R1bGUgYmFzaXMgdXNpbmcgdGhlIHJlY29tbWVuZGVkIGNvbnN0cnVjdGlvbgorYGBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXylgYC4gIFRoYXQncyBiZWNhdXNlIGluIGEgbW9kdWxlLCBgYF9fbmFtZV9fYGAKK2lzIHRoZSBtb2R1bGUncyBuYW1lIGluIHRoZSBQeXRob24gcGFja2FnZSBuYW1lc3BhY2UuCisKIAogLi4gY2xhc3M6OiBMb2dnZXIKIAogLi4gYXR0cmlidXRlOjogTG9nZ2VyLnByb3BhZ2F0ZQogCi0gICBJZiB0aGlzIGV2YWx1YXRlcyB0byB0cnVlLCBsb2dnaW5nIG1lc3NhZ2VzIGFyZSBwYXNzZWQgYnkgdGhpcyBsb2dnZXIgYW5kIGJ5Ci0gICBpdHMgY2hpbGQgbG9nZ2VycyB0byB0aGUgaGFuZGxlcnMgb2YgaGlnaGVyIGxldmVsIChhbmNlc3RvcikgbG9nZ2Vycy4KLSAgIE1lc3NhZ2VzIGFyZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIGFuY2VzdG9yIGxvZ2dlcnMnIGhhbmRsZXJzIC0gbmVpdGhlciB0aGUKLSAgIGxldmVsIG5vciBmaWx0ZXJzIG9mIHRoZSBhbmNlc3RvciBsb2dnZXJzIGluIHF1ZXN0aW9uIGFyZSBjb25zaWRlcmVkLgorICAgSWYgdGhpcyBldmFsdWF0ZXMgdG8gdHJ1ZSwgZXZlbnRzIGxvZ2dlZCB0byB0aGlzIGxvZ2dlciB3aWxsIGJlIHBhc3NlZCB0byB0aGUKKyAgIGhhbmRsZXJzIG9mIGhpZ2hlciBsZXZlbCAoYW5jZXN0b3IpIGxvZ2dlcnMsIGluIGFkZGl0aW9uIHRvIGFueSBoYW5kbGVycworICAgYXR0YWNoZWQgdG8gdGhpcyBsb2dnZXIuIE1lc3NhZ2VzIGFyZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIGFuY2VzdG9yCisgICBsb2dnZXJzJyBoYW5kbGVycyAtIG5laXRoZXIgdGhlIGxldmVsIG5vciBmaWx0ZXJzIG9mIHRoZSBhbmNlc3RvciBsb2dnZXJzIGluCisgICBxdWVzdGlvbiBhcmUgY29uc2lkZXJlZC4KIAogICAgSWYgdGhpcyBldmFsdWF0ZXMgdG8gZmFsc2UsIGxvZ2dpbmcgbWVzc2FnZXMgYXJlIG5vdCBwYXNzZWQgdG8gdGhlIGhhbmRsZXJzCiAgICBvZiBhbmNlc3RvciBsb2dnZXJzLgogCi0gICBUaGUgY29uc3RydWN0b3Igc2V0cyB0aGlzIGF0dHJpYnV0ZSB0byAxLgorICAgVGhlIGNvbnN0cnVjdG9yIHNldHMgdGhpcyBhdHRyaWJ1dGUgdG8gYGBUcnVlYGAuCiAKKyAgIC4uIG5vdGU6OiBJZiB5b3UgYXR0YWNoIGEgaGFuZGxlciB0byBhIGxvZ2dlciAqYW5kKiBvbmUgb3IgbW9yZSBvZiBpdHMKKyAgICAgIGFuY2VzdG9ycywgaXQgbWF5IGVtaXQgdGhlIHNhbWUgcmVjb3JkIG11bHRpcGxlIHRpbWVzLiBJbiBnZW5lcmFsLCB5b3UKKyAgICAgIHNob3VsZCBub3QgbmVlZCB0byBhdHRhY2ggYSBoYW5kbGVyIHRvIG1vcmUgdGhhbiBvbmUgbG9nZ2VyIC0gaWYgeW91IGp1c3QKKyAgICAgIGF0dGFjaCBpdCB0byB0aGUgYXBwcm9wcmlhdGUgbG9nZ2VyIHdoaWNoIGlzIGhpZ2hlc3QgaW4gdGhlIGxvZ2dlcgorICAgICAgaGllcmFyY2h5LCB0aGVuIGl0IHdpbGwgc2VlIGFsbCBldmVudHMgbG9nZ2VkIGJ5IGFsbCBkZXNjZW5kYW50IGxvZ2dlcnMsCisgICAgICBwcm92aWRlZCB0aGF0IHRoZWlyIHByb3BhZ2F0ZSBzZXR0aW5nIGlzIGxlZnQgc2V0IHRvIGBgVHJ1ZWBgLiBBIGNvbW1vbgorICAgICAgc2NlbmFyaW8gaXMgdG8gYXR0YWNoIGhhbmRsZXJzIG9ubHkgdG8gdGhlIHJvb3QgbG9nZ2VyLCBhbmQgdG8gbGV0CisgICAgICBwcm9wYWdhdGlvbiB0YWtlIGNhcmUgb2YgdGhlIHJlc3QuCiAKIC4uIG1ldGhvZDo6IExvZ2dlci5zZXRMZXZlbChsdmwpCiAKQEAgLTg5LDYgKzExNCw4IEBACiAgICBJZiB0aGUgcm9vdCBpcyByZWFjaGVkLCBhbmQgaXQgaGFzIGEgbGV2ZWwgb2YgTk9UU0VULCB0aGVuIGFsbCBtZXNzYWdlcyB3aWxsIGJlCiAgICBwcm9jZXNzZWQuIE90aGVyd2lzZSwgdGhlIHJvb3QncyBsZXZlbCB3aWxsIGJlIHVzZWQgYXMgdGhlIGVmZmVjdGl2ZSBsZXZlbC4KIAorICAgU2VlIDpyZWY6YGxldmVsc2AgZm9yIGEgbGlzdCBvZiBsZXZlbHMuCisKIAogLi4gbWV0aG9kOjogTG9nZ2VyLmlzRW5hYmxlZEZvcihsdmwpCiAKQEAgLTEzOCw3ICsxNjUsNyBAQAogCiAgICAgICBGT1JNQVQgPSAnJShhc2N0aW1lKS0xNXMgJShjbGllbnRpcClzICUodXNlciktOHMgJShtZXNzYWdlKXMnCiAgICAgICBsb2dnaW5nLmJhc2ljQ29uZmlnKGZvcm1hdD1GT1JNQVQpCi0gICAgICBkID0geyAnY2xpZW50aXAnIDogJzE5Mi4xNjguMC4xJywgJ3VzZXInIDogJ2ZibG9nZ3MnIH0KKyAgICAgIGQgPSB7J2NsaWVudGlwJzogJzE5Mi4xNjguMC4xJywgJ3VzZXInOiAnZmJsb2dncyd9CiAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigndGNwc2VydmVyJykKICAgICAgIGxvZ2dlci53YXJuaW5nKCdQcm90b2NvbCBwcm9ibGVtOiAlcycsICdjb25uZWN0aW9uIHJlc2V0JywgZXh0cmE9ZCkKIApAQCAtMTk1LDcgKzIyMiw3IEBACiAgICBpbnRlcnByZXRlZCBhcyBmb3IgOm1ldGg6YGRlYnVnYC4KIAogCi0uLiBtZXRob2Q6OiBMb2dnZXIuZXhjZXB0aW9uKG1zZywgKmFyZ3MpCisuLiBtZXRob2Q6OiBMb2dnZXIuZXhjZXB0aW9uKG1zZywgKmFyZ3MsICoqa3dhcmdzKQogCiAgICBMb2dzIGEgbWVzc2FnZSB3aXRoIGxldmVsIDpjb25zdDpgRVJST1JgIG9uIHRoaXMgbG9nZ2VyLiBUaGUgYXJndW1lbnRzIGFyZQogICAgaW50ZXJwcmV0ZWQgYXMgZm9yIDptZXRoOmBkZWJ1Z2AuIEV4Y2VwdGlvbiBpbmZvIGlzIGFkZGVkIHRvIHRoZSBsb2dnaW5nCkBAIC0yMTUsNyArMjQyLDEwIEBACiAuLiBtZXRob2Q6OiBMb2dnZXIuZmlsdGVyKHJlY29yZCkKIAogICAgQXBwbGllcyB0aGlzIGxvZ2dlcidzIGZpbHRlcnMgdG8gdGhlIHJlY29yZCBhbmQgcmV0dXJucyBhIHRydWUgdmFsdWUgaWYgdGhlCi0gICByZWNvcmQgaXMgdG8gYmUgcHJvY2Vzc2VkLgorICAgcmVjb3JkIGlzIHRvIGJlIHByb2Nlc3NlZC4gVGhlIGZpbHRlcnMgYXJlIGNvbnN1bHRlZCBpbiB0dXJuLCB1bnRpbCBvbmUgb2YKKyAgIHRoZW0gcmV0dXJucyBhIGZhbHNlIHZhbHVlLiBJZiBub25lIG9mIHRoZW0gcmV0dXJuIGEgZmFsc2UgdmFsdWUsIHRoZSByZWNvcmQKKyAgIHdpbGwgYmUgcHJvY2Vzc2VkIChwYXNzZWQgdG8gaGFuZGxlcnMpLiBJZiBvbmUgcmV0dXJucyBhIGZhbHNlIHZhbHVlLCBubworICAgZnVydGhlciBwcm9jZXNzaW5nIG9mIHRoZSByZWNvcmQgb2NjdXJzLgogCiAKIC4uIG1ldGhvZDo6IExvZ2dlci5hZGRIYW5kbGVyKGhkbHIpCkBAIC0yNTMsNiArMjgzLDM1IEBACiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQogICAgICAgKmZ1bmMqIGFuZCAqZXh0cmEqIHdlcmUgYWRkZWQuCiAKKworLi4gX2xldmVsczoKKworTG9nZ2luZyBMZXZlbHMKKy0tLS0tLS0tLS0tLS0tCisKK1RoZSBudW1lcmljIHZhbHVlcyBvZiBsb2dnaW5nIGxldmVscyBhcmUgZ2l2ZW4gaW4gdGhlIGZvbGxvd2luZyB0YWJsZS4gVGhlc2UgYXJlCitwcmltYXJpbHkgb2YgaW50ZXJlc3QgaWYgeW91IHdhbnQgdG8gZGVmaW5lIHlvdXIgb3duIGxldmVscywgYW5kIG5lZWQgdGhlbSB0bworaGF2ZSBzcGVjaWZpYyB2YWx1ZXMgcmVsYXRpdmUgdG8gdGhlIHByZWRlZmluZWQgbGV2ZWxzLiBJZiB5b3UgZGVmaW5lIGEgbGV2ZWwKK3dpdGggdGhlIHNhbWUgbnVtZXJpYyB2YWx1ZSwgaXQgb3ZlcndyaXRlcyB0aGUgcHJlZGVmaW5lZCB2YWx1ZTsgdGhlIHByZWRlZmluZWQKK25hbWUgaXMgbG9zdC4KKworKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsKK3wgTGV2ZWwgICAgICAgIHwgTnVtZXJpYyB2YWx1ZSB8CisrPT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09KworfCBgYENSSVRJQ0FMYGAgfCA1MCAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rCit8IGBgRVJST1JgYCAgICB8IDQwICAgICAgICAgICAgfAorKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsKK3wgYGBXQVJOSU5HYGAgIHwgMzAgICAgICAgICAgICB8CisrLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKworfCBgYElORk9gYCAgICAgfCAyMCAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rCit8IGBgREVCVUdgYCAgICB8IDEwICAgICAgICAgICAgfAorKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsKK3wgYGBOT1RTRVRgYCAgIHwgMCAgICAgICAgICAgICB8CisrLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKworCisKIC4uIF9oYW5kbGVyOgogCiBIYW5kbGVyIE9iamVjdHMKQEAgLTI5Myw2ICszNTIsNyBAQAogICAgc2V2ZXJlIHRoYW4gKmx2bCogd2lsbCBiZSBpZ25vcmVkLiBXaGVuIGEgaGFuZGxlciBpcyBjcmVhdGVkLCB0aGUgbGV2ZWwgaXMgc2V0CiAgICB0byA6Y29uc3Q6YE5PVFNFVGAgKHdoaWNoIGNhdXNlcyBhbGwgbWVzc2FnZXMgdG8gYmUgcHJvY2Vzc2VkKS4KIAorICAgU2VlIDpyZWY6YGxldmVsc2AgZm9yIGEgbGlzdCBvZiBsZXZlbHMuCiAKIC4uIG1ldGhvZDo6IEhhbmRsZXIuc2V0Rm9ybWF0dGVyKGZvcm0pCiAKQEAgLTMxMiw3ICszNzIsMTAgQEAKIC4uIG1ldGhvZDo6IEhhbmRsZXIuZmlsdGVyKHJlY29yZCkKIAogICAgQXBwbGllcyB0aGlzIGhhbmRsZXIncyBmaWx0ZXJzIHRvIHRoZSByZWNvcmQgYW5kIHJldHVybnMgYSB0cnVlIHZhbHVlIGlmIHRoZQotICAgcmVjb3JkIGlzIHRvIGJlIHByb2Nlc3NlZC4KKyAgIHJlY29yZCBpcyB0byBiZSBwcm9jZXNzZWQuIFRoZSBmaWx0ZXJzIGFyZSBjb25zdWx0ZWQgaW4gdHVybiwgdW50aWwgb25lIG9mCisgICB0aGVtIHJldHVybnMgYSBmYWxzZSB2YWx1ZS4gSWYgbm9uZSBvZiB0aGVtIHJldHVybiBhIGZhbHNlIHZhbHVlLCB0aGUgcmVjb3JkCisgICB3aWxsIGJlIGVtaXR0ZWQuIElmIG9uZSByZXR1cm5zIGEgZmFsc2UgdmFsdWUsIHRoZSBoYW5kbGVyIHdpbGwgbm90IGVtaXQgdGhlCisgICByZWNvcmQuCiAKIAogLi4gbWV0aG9kOjogSGFuZGxlci5mbHVzaCgpCkBAIC0zMzksMTIgKzQwMiwxNCBAQAogLi4gbWV0aG9kOjogSGFuZGxlci5oYW5kbGVFcnJvcihyZWNvcmQpCiAKICAgIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgZnJvbSBoYW5kbGVycyB3aGVuIGFuIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAotICAgZHVyaW5nIGFuIDptZXRoOmBlbWl0YCBjYWxsLiBCeSBkZWZhdWx0IGl0IGRvZXMgbm90aGluZywgd2hpY2ggbWVhbnMgdGhhdAotICAgZXhjZXB0aW9ucyBnZXQgc2lsZW50bHkgaWdub3JlZC4gVGhpcyBpcyB3aGF0IGlzIG1vc3RseSB3YW50ZWQgZm9yIGEgbG9nZ2luZwotICAgc3lzdGVtIC0gbW9zdCB1c2VycyB3aWxsIG5vdCBjYXJlIGFib3V0IGVycm9ycyBpbiB0aGUgbG9nZ2luZyBzeXN0ZW0sIHRoZXkgYXJlCi0gICBtb3JlIGludGVyZXN0ZWQgaW4gYXBwbGljYXRpb24gZXJyb3JzLiBZb3UgY291bGQsIGhvd2V2ZXIsIHJlcGxhY2UgdGhpcyB3aXRoIGEKLSAgIGN1c3RvbSBoYW5kbGVyIGlmIHlvdSB3aXNoLiBUaGUgc3BlY2lmaWVkIHJlY29yZCBpcyB0aGUgb25lIHdoaWNoIHdhcyBiZWluZwotICAgcHJvY2Vzc2VkIHdoZW4gdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZC4KKyAgIGR1cmluZyBhbiA6bWV0aDpgZW1pdGAgY2FsbC4gSWYgdGhlIG1vZHVsZS1sZXZlbCBhdHRyaWJ1dGUKKyAgIGBgcmFpc2VFeGNlcHRpb25zYGAgaXMgYGBGYWxzZWBgLCBleGNlcHRpb25zIGdldCBzaWxlbnRseSBpZ25vcmVkLiBUaGlzIGlzCisgICB3aGF0IGlzIG1vc3RseSB3YW50ZWQgZm9yIGEgbG9nZ2luZyBzeXN0ZW0gLSBtb3N0IHVzZXJzIHdpbGwgbm90IGNhcmUgYWJvdXQKKyAgIGVycm9ycyBpbiB0aGUgbG9nZ2luZyBzeXN0ZW0sIHRoZXkgYXJlIG1vcmUgaW50ZXJlc3RlZCBpbiBhcHBsaWNhdGlvbgorICAgZXJyb3JzLiBZb3UgY291bGQsIGhvd2V2ZXIsIHJlcGxhY2UgdGhpcyB3aXRoIGEgY3VzdG9tIGhhbmRsZXIgaWYgeW91IHdpc2guCisgICBUaGUgc3BlY2lmaWVkIHJlY29yZCBpcyB0aGUgb25lIHdoaWNoIHdhcyBiZWluZyBwcm9jZXNzZWQgd2hlbiB0aGUgZXhjZXB0aW9uCisgICBvY2N1cnJlZC4gKFRoZSBkZWZhdWx0IHZhbHVlIG9mIGBgcmFpc2VFeGNlcHRpb25zYGAgaXMgYGBUcnVlYGAsIGFzIHRoYXQgaXMKKyAgIG1vcmUgdXNlZnVsIGR1cmluZyBkZXZlbG9wbWVudCkuCiAKIAogLi4gbWV0aG9kOjogSGFuZGxlci5mb3JtYXQocmVjb3JkKQpAQCAtNDYzLDEyICs1MjgsMTIgQEAKICAgICAgIHllcy4gSWYgZGVlbWVkIGFwcHJvcHJpYXRlLCB0aGUgcmVjb3JkIG1heSBiZSBtb2RpZmllZCBpbi1wbGFjZSBieSB0aGlzCiAgICAgICBtZXRob2QuCiAKLU5vdGUgdGhhdCBmaWx0ZXJzIGF0dGFjaGVkIHRvIGhhbmRsZXJzIGFyZSBjb25zdWx0ZWQgd2hlbmV2ZXIgYW4gZXZlbnQgaXMKK05vdGUgdGhhdCBmaWx0ZXJzIGF0dGFjaGVkIHRvIGhhbmRsZXJzIGFyZSBjb25zdWx0ZWQgYmVmb3JlIGFuIGV2ZW50IGlzCiBlbWl0dGVkIGJ5IHRoZSBoYW5kbGVyLCB3aGVyZWFzIGZpbHRlcnMgYXR0YWNoZWQgdG8gbG9nZ2VycyBhcmUgY29uc3VsdGVkCi13aGVuZXZlciBhbiBldmVudCBpcyBsb2dnZWQgdG8gdGhlIGhhbmRsZXIgKHVzaW5nIDptZXRoOmBkZWJ1Z2AsIDptZXRoOmBpbmZvYCwKLWV0Yy4pIFRoaXMgbWVhbnMgdGhhdCBldmVudHMgd2hpY2ggaGF2ZSBiZWVuIGdlbmVyYXRlZCBieSBkZXNjZW5kYW50IGxvZ2dlcnMKLXdpbGwgbm90IGJlIGZpbHRlcmVkIGJ5IGEgbG9nZ2VyJ3MgZmlsdGVyIHNldHRpbmcsIHVubGVzcyB0aGUgZmlsdGVyIGhhcyBhbHNvCi1iZWVuIGFwcGxpZWQgdG8gdGhvc2UgZGVzY2VuZGFudCBsb2dnZXJzLgord2hlbmV2ZXIgYW4gZXZlbnQgaXMgbG9nZ2VkICh1c2luZyA6bWV0aDpgZGVidWdgLCA6bWV0aDpgaW5mb2AsCitldGMuKSwgYmVmb3JlIHNlbmRpbmcgYW4gZXZlbnQgdG8gaGFuZGxlcnMuIFRoaXMgbWVhbnMgdGhhdCBldmVudHMgd2hpY2ggaGF2ZQorYmVlbiBnZW5lcmF0ZWQgYnkgZGVzY2VuZGFudCBsb2dnZXJzIHdpbGwgbm90IGJlIGZpbHRlcmVkIGJ5IGEgbG9nZ2VyJ3MgZmlsdGVyCitzZXR0aW5nLCB1bmxlc3MgdGhlIGZpbHRlciBoYXMgYWxzbyBiZWVuIGFwcGxpZWQgdG8gdGhvc2UgZGVzY2VuZGFudCBsb2dnZXJzLgogCiBZb3UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0byBzdWJjbGFzcyBgYEZpbHRlcmBgOiB5b3UgY2FuIHBhc3MgYW55IGluc3RhbmNlCiB3aGljaCBoYXMgYSBgYGZpbHRlcmBgIG1ldGhvZCB3aXRoIHRoZSBzYW1lIHNlbWFudGljcy4KQEAgLTUwMiw3ICs1NjcsOSBAQAogICAgcmVjb3JkLgogCiAgICA6cGFyYW0gbmFtZTogIFRoZSBuYW1lIG9mIHRoZSBsb2dnZXIgdXNlZCB0byBsb2cgdGhlIGV2ZW50IHJlcHJlc2VudGVkIGJ5Ci0gICAgICAgICAgICAgICAgIHRoaXMgTG9nUmVjb3JkLgorICAgICAgICAgICAgICAgICB0aGlzIExvZ1JlY29yZC4gTm90ZSB0aGF0IHRoaXMgbmFtZSB3aWxsIGFsd2F5cyBoYXZlIHRoaXMKKyAgICAgICAgICAgICAgICAgdmFsdWUsIGV2ZW4gdGhvdWdoIGl0IG1heSBiZSBlbWl0dGVkIGJ5IGEgaGFuZGxlciBhdHRhY2hlZCB0bworICAgICAgICAgICAgICAgICBhIGRpZmZlcmVudCAoYW5jZXN0b3IpIGxvZ2dlci4KICAgIDpwYXJhbSBsZXZlbDogVGhlIG51bWVyaWMgbGV2ZWwgb2YgdGhlIGxvZ2dpbmcgZXZlbnQgKG9uZSBvZiBERUJVRywgSU5GTyBldGMuKQogICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdGhpcyBpcyBjb252ZXJ0ZWQgdG8gKnR3byogYXR0cmlidXRlcyBvZiB0aGUgTG9nUmVjb3JkOgogICAgICAgICAgICAgICAgICBgYGxldmVsbm9gYCBmb3IgdGhlIG51bWVyaWMgdmFsdWUgYW5kIGBgbGV2ZWxuYW1lYGAgZm9yIHRoZQpAQCAtNjE1LDEzICs2ODIsMTYgQEAKIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41CiAgICAqZnVuY05hbWUqIHdhcyBhZGRlZC4KIAorLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjYKKyAgICpwcm9jZXNzTmFtZSogd2FzIGFkZGVkLgorCiAuLiBfbG9nZ2VyLWFkYXB0ZXI6CiAKIExvZ2dlckFkYXB0ZXIgT2JqZWN0cwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIDpjbGFzczpgTG9nZ2VyQWRhcHRlcmAgaW5zdGFuY2VzIGFyZSB1c2VkIHRvIGNvbnZlbmllbnRseSBwYXNzIGNvbnRleHR1YWwKLWluZm9ybWF0aW9uIGludG8gbG9nZ2luZyBjYWxscy4gRm9yIGEgdXNhZ2UgZXhhbXBsZSAsIHNlZSB0aGUgc2VjdGlvbiBvbgoraW5mb3JtYXRpb24gaW50byBsb2dnaW5nIGNhbGxzLiBGb3IgYSB1c2FnZSBleGFtcGxlLCBzZWUgdGhlIHNlY3Rpb24gb24KIDpyZWY6YGFkZGluZyBjb250ZXh0dWFsIGluZm9ybWF0aW9uIHRvIHlvdXIgbG9nZ2luZyBvdXRwdXQgPGNvbnRleHQtaW5mbz5gLgogCiAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjYKQEAgLTY0MSwxNiArNzExLDE1IEBACiAgICAgICAocG9zc2libHkgbW9kaWZpZWQpIHZlcnNpb25zIG9mIHRoZSBhcmd1bWVudHMgcGFzc2VkIGluLgogCiBJbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUsIDpjbGFzczpgTG9nZ2VyQWRhcHRlcmAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZwotbWV0aG9kcyBvZiA6Y2xhc3M6YExvZ2dlcmAsIGkuZS4gOm1ldGg6YGRlYnVnYCwgOm1ldGg6YGluZm9gLCA6bWV0aDpgd2FybmluZ2AsCi06bWV0aDpgZXJyb3JgLCA6bWV0aDpgZXhjZXB0aW9uYCwgOm1ldGg6YGNyaXRpY2FsYCwgOm1ldGg6YGxvZ2AsCi06bWV0aDpgaXNFbmFibGVkRm9yYCwgOm1ldGg6YGdldEVmZmVjdGl2ZUxldmVsYCwgOm1ldGg6YHNldExldmVsYCwKLTptZXRoOmBoYXNIYW5kbGVyc2AuIFRoZXNlIG1ldGhvZHMgaGF2ZSB0aGUgc2FtZSBzaWduYXR1cmVzIGFzIHRoZWlyCi1jb3VudGVycGFydHMgaW4gOmNsYXNzOmBMb2dnZXJgLCBzbyB5b3UgY2FuIHVzZSB0aGUgdHdvIHR5cGVzIG9mIGluc3RhbmNlcwotaW50ZXJjaGFuZ2VhYmx5LgorbWV0aG9kcyBvZiA6Y2xhc3M6YExvZ2dlcmA6IDptZXRoOmB+TG9nZ2VyLmRlYnVnYCwgOm1ldGg6YH5Mb2dnZXIuaW5mb2AsCis6bWV0aDpgfkxvZ2dlci53YXJuaW5nYCwgOm1ldGg6YH5Mb2dnZXIuZXJyb3JgLCA6bWV0aDpgfkxvZ2dlci5leGNlcHRpb25gLAorOm1ldGg6YH5Mb2dnZXIuY3JpdGljYWxgLCA6bWV0aDpgfkxvZ2dlci5sb2dgIGFuZCA6bWV0aDpgfkxvZ2dlci5pc0VuYWJsZWRGb3JgLgorVGhlc2UgbWV0aG9kcyBoYXZlIHRoZSBzYW1lIHNpZ25hdHVyZXMgYXMgdGhlaXIgY291bnRlcnBhcnRzIGluIDpjbGFzczpgTG9nZ2VyYCwKK3NvIHlvdSBjYW4gdXNlIHRoZSB0d28gdHlwZXMgb2YgaW5zdGFuY2VzIGludGVyY2hhbmdlYWJseSBmb3IgdGhlc2UgY2FsbHMuCiAKIC4uIHZlcnNpb25jaGFuZ2VkOjogMi43Ci0gICBUaGUgOm1ldGg6YGlzRW5hYmxlZEZvcmAgbWV0aG9kIHdhcyBhZGRlZCB0byA6Y2xhc3M6YExvZ2dlckFkYXB0ZXJgLiAgVGhpcwotICAgbWV0aG9kIGRlbGVnYXRlcyB0byB0aGUgdW5kZXJseWluZyBsb2dnZXIuCisgICBUaGUgOm1ldGg6YH5Mb2dnZXIuaXNFbmFibGVkRm9yYCBtZXRob2Qgd2FzIGFkZGVkIHRvIDpjbGFzczpgTG9nZ2VyQWRhcHRlcmAuCisgICBUaGlzIG1ldGhvZCBkZWxlZ2F0ZXMgdG8gdGhlIHVuZGVybHlpbmcgbG9nZ2VyLgogCiAKIFRocmVhZCBTYWZldHkKQEAgLTY5MCw4ICs3NTksOCBAQAogCiAgICBSZXR1cm4gZWl0aGVyIHRoZSBzdGFuZGFyZCA6Y2xhc3M6YExvZ2dlcmAgY2xhc3MsIG9yIHRoZSBsYXN0IGNsYXNzIHBhc3NlZCB0bwogICAgOmZ1bmM6YHNldExvZ2dlckNsYXNzYC4gVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGZyb20gd2l0aGluIGEgbmV3IGNsYXNzCi0gICBkZWZpbml0aW9uLCB0byBlbnN1cmUgdGhhdCBpbnN0YWxsaW5nIGEgY3VzdG9taXNlZCA6Y2xhc3M6YExvZ2dlcmAgY2xhc3Mgd2lsbAotICAgbm90IHVuZG8gY3VzdG9taXNhdGlvbnMgYWxyZWFkeSBhcHBsaWVkIGJ5IG90aGVyIGNvZGUuIEZvciBleGFtcGxlOjoKKyAgIGRlZmluaXRpb24sIHRvIGVuc3VyZSB0aGF0IGluc3RhbGxpbmcgYSBjdXN0b21pemVkIDpjbGFzczpgTG9nZ2VyYCBjbGFzcyB3aWxsCisgICBub3QgdW5kbyBjdXN0b21pemF0aW9ucyBhbHJlYWR5IGFwcGxpZWQgYnkgb3RoZXIgY29kZS4gRm9yIGV4YW1wbGU6OgogCiAgICAgICBjbGFzcyBNeUxvZ2dlcihsb2dnaW5nLmdldExvZ2dlckNsYXNzKCkpOgogICAgICAgICAgICMgLi4uIG92ZXJyaWRlIGJlaGF2aW91ciBoZXJlCkBAIC03NzEsNyArODQwLDcgQEAKICAgIGFyZSBpbnRlcnByZXRlZCBhcyBmb3IgOmZ1bmM6YGRlYnVnYC4KIAogCi0uLiBmdW5jdGlvbjo6IGV4Y2VwdGlvbihtc2dbLCAqYXJnc10pCisuLiBmdW5jdGlvbjo6IGV4Y2VwdGlvbihtc2dbLCAqYXJnc1ssICoqa3dhcmdzXV0pCiAKICAgIExvZ3MgYSBtZXNzYWdlIHdpdGggbGV2ZWwgOmNvbnN0OmBFUlJPUmAgb24gdGhlIHJvb3QgbG9nZ2VyLiBUaGUgYXJndW1lbnRzIGFyZQogICAgaW50ZXJwcmV0ZWQgYXMgZm9yIDpmdW5jOmBkZWJ1Z2AuIEV4Y2VwdGlvbiBpbmZvIGlzIGFkZGVkIHRvIHRoZSBsb2dnaW5nCkBAIC03ODMsMTQgKzg1MiwxNSBAQAogICAgTG9ncyBhIG1lc3NhZ2Ugd2l0aCBsZXZlbCAqbGV2ZWwqIG9uIHRoZSByb290IGxvZ2dlci4gVGhlIG90aGVyIGFyZ3VtZW50cyBhcmUKICAgIGludGVycHJldGVkIGFzIGZvciA6ZnVuYzpgZGVidWdgLgogCi0gICBQTEVBU0UgTk9URTogVGhlIGFib3ZlIG1vZHVsZS1sZXZlbCBmdW5jdGlvbnMgd2hpY2ggZGVsZWdhdGUgdG8gdGhlIHJvb3QKLSAgIGxvZ2dlciBzaG91bGQgKm5vdCogYmUgdXNlZCBpbiB0aHJlYWRzLCBpbiB2ZXJzaW9ucyBvZiBQeXRob24gZWFybGllciB0aGFuCi0gICAyLjcuMSBhbmQgMy4yLCB1bmxlc3MgYXQgbGVhc3Qgb25lIGhhbmRsZXIgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIHJvb3QKLSAgIGxvZ2dlciAqYmVmb3JlKiB0aGUgdGhyZWFkcyBhcmUgc3RhcnRlZC4gVGhlc2UgY29udmVuaWVuY2UgZnVuY3Rpb25zIGNhbGwKLSAgIDpmdW5jOmBiYXNpY0NvbmZpZ2AgdG8gZW5zdXJlIHRoYXQgYXQgbGVhc3Qgb25lIGhhbmRsZXIgaXMgYXZhaWxhYmxlOyBpbgotICAgZWFybGllciB2ZXJzaW9ucyBvZiBQeXRob24sIHRoaXMgY2FuICh1bmRlciByYXJlIGNpcmN1bXN0YW5jZXMpIGxlYWQgdG8KLSAgIGhhbmRsZXJzIGJlaW5nIGFkZGVkIG11bHRpcGxlIHRpbWVzIHRvIHRoZSByb290IGxvZ2dlciwgd2hpY2ggY2FuIGluIHR1cm4KLSAgIGxlYWQgdG8gbXVsdGlwbGUgbWVzc2FnZXMgZm9yIHRoZSBzYW1lIGV2ZW50LgorICAgLi4gbm90ZTo6IFRoZSBhYm92ZSBtb2R1bGUtbGV2ZWwgY29udmVuaWVuY2UgZnVuY3Rpb25zLCB3aGljaCBkZWxlZ2F0ZSB0byB0aGUKKyAgICAgIHJvb3QgbG9nZ2VyLCBjYWxsIDpmdW5jOmBiYXNpY0NvbmZpZ2AgdG8gZW5zdXJlIHRoYXQgYXQgbGVhc3Qgb25lIGhhbmRsZXIKKyAgICAgIGlzIGF2YWlsYWJsZS4gQmVjYXVzZSBvZiB0aGlzLCB0aGV5IHNob3VsZCAqbm90KiBiZSB1c2VkIGluIHRocmVhZHMsCisgICAgICBpbiB2ZXJzaW9ucyBvZiBQeXRob24gZWFybGllciB0aGFuIDIuNy4xIGFuZCAzLjIsIHVubGVzcyBhdCBsZWFzdCBvbmUKKyAgICAgIGhhbmRsZXIgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIHJvb3QgbG9nZ2VyICpiZWZvcmUqIHRoZSB0aHJlYWRzIGFyZQorICAgICAgc3RhcnRlZC4gSW4gZWFybGllciB2ZXJzaW9ucyBvZiBQeXRob24sIGR1ZSB0byBhIHRocmVhZCBzYWZldHkgc2hvcnRjb21pbmcKKyAgICAgIGluIDpmdW5jOmBiYXNpY0NvbmZpZ2AsIHRoaXMgY2FuICh1bmRlciByYXJlIGNpcmN1bXN0YW5jZXMpIGxlYWQgdG8KKyAgICAgIGhhbmRsZXJzIGJlaW5nIGFkZGVkIG11bHRpcGxlIHRpbWVzIHRvIHRoZSByb290IGxvZ2dlciwgd2hpY2ggY2FuIGluIHR1cm4KKyAgICAgIGxlYWQgdG8gbXVsdGlwbGUgbWVzc2FnZXMgZm9yIHRoZSBzYW1lIGV2ZW50LgogCiAuLiBmdW5jdGlvbjo6IGRpc2FibGUobHZsKQogCkBAIC04MDAsNyArODcwLDEwIEBACiAgICBlZmZlY3QgaXMgdG8gZGlzYWJsZSBhbGwgbG9nZ2luZyBjYWxscyBvZiBzZXZlcml0eSAqbHZsKiBhbmQgYmVsb3csIHNvIHRoYXQKICAgIGlmIHlvdSBjYWxsIGl0IHdpdGggYSB2YWx1ZSBvZiBJTkZPLCB0aGVuIGFsbCBJTkZPIGFuZCBERUJVRyBldmVudHMgd291bGQgYmUKICAgIGRpc2NhcmRlZCwgd2hlcmVhcyB0aG9zZSBvZiBzZXZlcml0eSBXQVJOSU5HIGFuZCBhYm92ZSB3b3VsZCBiZSBwcm9jZXNzZWQKLSAgIGFjY29yZGluZyB0byB0aGUgbG9nZ2VyJ3MgZWZmZWN0aXZlIGxldmVsLgorICAgYWNjb3JkaW5nIHRvIHRoZSBsb2dnZXIncyBlZmZlY3RpdmUgbGV2ZWwuIElmCisgICBgYGxvZ2dpbmcuZGlzYWJsZShsb2dnaW5nLk5PVFNFVClgYCBpcyBjYWxsZWQsIGl0IGVmZmVjdGl2ZWx5IHJlbW92ZXMgdGhpcworICAgb3ZlcnJpZGluZyBsZXZlbCwgc28gdGhhdCBsb2dnaW5nIG91dHB1dCBhZ2FpbiBkZXBlbmRzIG9uIHRoZSBlZmZlY3RpdmUKKyAgIGxldmVscyBvZiBpbmRpdmlkdWFsIGxvZ2dlcnMuCiAKIAogLi4gZnVuY3Rpb246OiBhZGRMZXZlbE5hbWUobHZsLCBsZXZlbE5hbWUpCkBAIC04MTIsOCArODg1LDggQEAKICAgIHJlZ2lzdGVyZWQgdXNpbmcgdGhpcyBmdW5jdGlvbiwgbGV2ZWxzIHNob3VsZCBiZSBwb3NpdGl2ZSBpbnRlZ2VycyBhbmQgdGhleQogICAgc2hvdWxkIGluY3JlYXNlIGluIGluY3JlYXNpbmcgb3JkZXIgb2Ygc2V2ZXJpdHkuCiAKLSAgIE5PVEU6IElmIHlvdSBhcmUgdGhpbmtpbmcgb2YgZGVmaW5pbmcgeW91ciBvd24gbGV2ZWxzLCBwbGVhc2Ugc2VlIHRoZSBzZWN0aW9uCi0gICBvbiA6cmVmOmBjdXN0b20tbGV2ZWxzYC4KKyAgIC4uIG5vdGU6OiBJZiB5b3UgYXJlIHRoaW5raW5nIG9mIGRlZmluaW5nIHlvdXIgb3duIGxldmVscywgcGxlYXNlIHNlZSB0aGUKKyAgICAgIHNlY3Rpb24gb24gOnJlZjpgY3VzdG9tLWxldmVsc2AuCiAKIC4uIGZ1bmN0aW9uOjogZ2V0TGV2ZWxOYW1lKGx2bCkKIApAQCAtODQ4LDE1ICs5MjEsMTcgQEAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi40CiAgICAgICBGb3JtZXJseSwgOmZ1bmM6YGJhc2ljQ29uZmlnYCBkaWQgbm90IHRha2UgYW55IGtleXdvcmQgYXJndW1lbnRzLgogCi0gICBQTEVBU0UgTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIG1haW4gdGhyZWFkCi0gICBiZWZvcmUgb3RoZXIgdGhyZWFkcyBhcmUgc3RhcnRlZC4gSW4gdmVyc2lvbnMgb2YgUHl0aG9uIHByaW9yIHRvCi0gICAyLjcuMSBhbmQgMy4yLCBpZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIG11bHRpcGxlIHRocmVhZHMsCi0gICBpdCBpcyBwb3NzaWJsZSAoaW4gcmFyZSBjaXJjdW1zdGFuY2VzKSB0aGF0IGEgaGFuZGxlciB3aWxsIGJlIGFkZGVkCi0gICB0byB0aGUgcm9vdCBsb2dnZXIgbW9yZSB0aGFuIG9uY2UsIGxlYWRpbmcgdG8gdW5leHBlY3RlZCByZXN1bHRzCi0gICBzdWNoIGFzIG1lc3NhZ2VzIGJlaW5nIGR1cGxpY2F0ZWQgaW4gdGhlIGxvZy4KKyAgIC4uIG5vdGU6OiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZnJvbSB0aGUgbWFpbiB0aHJlYWQgYmVmb3JlIG90aGVyCisgICAgICB0aHJlYWRzIGFyZSBzdGFydGVkLiBJbiB2ZXJzaW9ucyBvZiBQeXRob24gcHJpb3IgdG8gMi43LjEgYW5kIDMuMiwgaWYKKyAgICAgIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gbXVsdGlwbGUgdGhyZWFkcywgaXQgaXMgcG9zc2libGUgKGluIHJhcmUKKyAgICAgIGNpcmN1bXN0YW5jZXMpIHRoYXQgYSBoYW5kbGVyIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHJvb3QgbG9nZ2VyIG1vcmUgdGhhbgorICAgICAgb25jZSwgbGVhZGluZyB0byB1bmV4cGVjdGVkIHJlc3VsdHMgc3VjaCBhcyBtZXNzYWdlcyBiZWluZyBkdXBsaWNhdGVkIGluCisgICAgICB0aGUgbG9nLgogCiAgICBUaGUgZm9sbG93aW5nIGtleXdvcmQgYXJndW1lbnRzIGFyZSBzdXBwb3J0ZWQuCiAKKyAgIC4uIHRhYnVsYXJjb2x1bW5zOjogfGx8THwKKwogICAgKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgIHwgRm9ybWF0ICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICArPT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KwpAQCAtOTEzLDEyICs5ODgsMTEgQEAKICAgIElmICpjYXB0dXJlKiBpcyBgYFRydWVgYCwgd2FybmluZ3MgaXNzdWVkIGJ5IHRoZSA6bW9kOmB3YXJuaW5nc2AgbW9kdWxlIHdpbGwKICAgIGJlIHJlZGlyZWN0ZWQgdG8gdGhlIGxvZ2dpbmcgc3lzdGVtLiBTcGVjaWZpY2FsbHksIGEgd2FybmluZyB3aWxsIGJlCiAgICBmb3JtYXR0ZWQgdXNpbmcgOmZ1bmM6YHdhcm5pbmdzLmZvcm1hdHdhcm5pbmdgIGFuZCB0aGUgcmVzdWx0aW5nIHN0cmluZwotICAgbG9nZ2VkIHRvIGEgbG9nZ2VyIG5hbWVkICdweS53YXJuaW5ncycgd2l0aCBhIHNldmVyaXR5IG9mIGBXQVJOSU5HYC4KKyAgIGxvZ2dlZCB0byBhIGxvZ2dlciBuYW1lZCBgYCdweS53YXJuaW5ncydgYCB3aXRoIGEgc2V2ZXJpdHkgb2YgOmNvbnN0OmBXQVJOSU5HYC4KIAogICAgSWYgKmNhcHR1cmUqIGlzIGBgRmFsc2VgYCwgdGhlIHJlZGlyZWN0aW9uIG9mIHdhcm5pbmdzIHRvIHRoZSBsb2dnaW5nIHN5c3RlbQogICAgd2lsbCBzdG9wLCBhbmQgd2FybmluZ3Mgd2lsbCBiZSByZWRpcmVjdGVkIHRvIHRoZWlyIG9yaWdpbmFsIGRlc3RpbmF0aW9ucwotICAgKGkuZS4gdGhvc2UgaW4gZWZmZWN0IGJlZm9yZSBgY2FwdHVyZVdhcm5pbmdzKFRydWUpYCB3YXMgY2FsbGVkKS4KLQorICAgKGkuZS4gdGhvc2UgaW4gZWZmZWN0IGJlZm9yZSBgYGNhcHR1cmVXYXJuaW5ncyhUcnVlKWBgIHdhcyBjYWxsZWQpLgogCiAKIC4uIHNlZWFsc286OgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvbWFjLnJzdCBiL0RvYy9saWJyYXJ5L21hYy5yc3QKaW5kZXggN2FjMWNhMi4uZDY2OTMxYyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvbWFjLnJzdAorKysgYi9Eb2MvbGlicmFyeS9tYWMucnN0CkBAIC0xMiw3ICsxMiwxMCBAQAogCiAuLiBub3RlOjoKIAotICAgVGhlc2UgbW9kdWxlcyBhcmUgZGVwcmVjYXRlZCBhbmQgaGF2ZSBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMueC4KKyAgIE1vc3Qgb2YgdGhlIE9TIFggQVBJcyB0aGF0IHRoZXNlIG1vZHVsZXMgdXNlIGFyZSBkZXByZWNhdGVkIG9yIHJlbW92ZWQKKyAgIGluIHJlY2VudCB2ZXJzaW9ucyBvZiBPUyBYLiAgTWFueSBhcmUgbm90IGF2YWlsYWJsZSB3aGVuIFB5dGhvbiBpcworICAgZXhlY3V0aW5nIGluIDY0LWJpdCBtb2RlLiAgVGhlc2UgbW9kdWxlcyBoYXZlIGJlZW4gcmVtb3ZlZCBpbgorICAgUHl0aG9uIDMuICBZb3Ugc2hvdWxkIGF2b2lkIHVzaW5nIHRoZW0gaW4gUHl0aG9uIDIuCiAKIAogLi4gdG9jdHJlZTo6CmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9tYWNvcy5yc3QgYi9Eb2MvbGlicmFyeS9tYWNvcy5yc3QKaW5kZXggNzVjYmIxOS4uMTE5YzJkYSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvbWFjb3MucnN0CisrKyBiL0RvYy9saWJyYXJ5L21hY29zLnJzdApAQCAtNDEsNyArNDEsNyBAQAogCiAgICBUaGlzIGV4Y2VwdGlvbiBpcyByYWlzZWQgb24gTWFjT1MgZ2VuZXJhdGVkIGVycm9ycywgZWl0aGVyIGZyb20gZnVuY3Rpb25zIGluCiAgICB0aGlzIG1vZHVsZSBvciBmcm9tIG90aGVyIG1hYy1zcGVjaWZpYyBtb2R1bGVzIGxpa2UgdGhlIHRvb2xib3ggaW50ZXJmYWNlcy4gVGhlCi0gICBhcmd1bWVudHMgYXJlIHRoZSBpbnRlZ2VyIGVycm9yIGNvZGUgKHRoZSA6Y2RhdGE6YE9TRXJyYCB2YWx1ZSkgYW5kIGEgdGV4dHVhbAorICAgYXJndW1lbnRzIGFyZSB0aGUgaW50ZWdlciBlcnJvciBjb2RlICh0aGUgOmM6ZGF0YTpgT1NFcnJgIHZhbHVlKSBhbmQgYSB0ZXh0dWFsCiAgICBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gU3ltYm9saWMgbmFtZXMgZm9yIGFsbCBrbm93biBlcnJvciBjb2RlcyBhcmUKICAgIGRlZmluZWQgaW4gdGhlIHN0YW5kYXJkIG1vZHVsZSA6bW9kOmBtYWNlcnJvcnNgLgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9tYWNvc2EucnN0IGIvRG9jL2xpYnJhcnkvbWFjb3NhLnJzdAppbmRleCA1NGU2MmYyLi5mNmIzYjQ4IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9tYWNvc2EucnN0CisrKyBiL0RvYy9saWJyYXJ5L21hY29zYS5yc3QKQEAgLTksOCArOSw3IEBACiBBcmNoaXRlY3R1cmUgKE9TQSwgYWxzbyBjb21tb25seSByZWZlcnJlZCB0byBhcyBBcHBsZVNjcmlwdCkgZm9yIFB5dGhvbiwKIGFsbG93aW5nIHlvdSB0byBjb250cm9sIHNjcmlwdGFibGUgYXBwbGljYXRpb25zIGZyb20geW91ciBQeXRob24gcHJvZ3JhbSwKIGFuZCB3aXRoIGEgZmFpcmx5IHB5dGhvbmljIGludGVyZmFjZS4gRGV2ZWxvcG1lbnQgb24gdGhpcyBzZXQgb2YgbW9kdWxlcyBoYXMKLXN0b3BwZWQuIEZvciBtb3JlIHVwLXRvLWRhdGUgaW1wbGVtZW50YXRpb24gb2YgQXBwbGVTY3JpcHQgc3VwcG9ydCBmb3IgUHl0aG9uLAotc2VlIHRoZSB0aGlyZC1wYXJ0eSBweS1hcHBzY3JpcHQgcHJvamVjdDogPGh0dHA6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaS9hcHBzY3JpcHQvPi4KK3N0b3BwZWQuCiAKIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSB2YXJpb3VzIGNvbXBvbmVudHMgb2YgQXBwbGVTY3JpcHQgYW5kIE9TQSwgYW5kIHRvIGdldAogYW4gdW5kZXJzdGFuZGluZyBvZiB0aGUgYXJjaGl0ZWN0dXJlIGFuZCB0ZXJtaW5vbG9neSwgeW91IHNob3VsZCByZWFkIEFwcGxlJ3MKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L21hY29zdG9vbHMucnN0IGIvRG9jL2xpYnJhcnkvbWFjb3N0b29scy5yc3QKaW5kZXggZjJhMjY0My4uNzkyNDY2OSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvbWFjb3N0b29scy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvbWFjb3N0b29scy5yc3QKQEAgLTE1LDcgKzE1LDcgQEAKIAogLi4gbm90ZTo6CiAKLSAgIFRoaXMgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuMC4KKyAgIFRoaXMgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuCiAKIAogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9tYWlsYm94LnJzdCBiL0RvYy9saWJyYXJ5L21haWxib3gucnN0CmluZGV4IGQ1MWYzNDAuLjk0ZmRlMTQgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L21haWxib3gucnN0CisrKyBiL0RvYy9saWJyYXJ5L21haWxib3gucnN0CkBAIC0xMSw4ICsxMSw5IEBACiBUaGlzIG1vZHVsZSBkZWZpbmVzIHR3byBjbGFzc2VzLCA6Y2xhc3M6YE1haWxib3hgIGFuZCA6Y2xhc3M6YE1lc3NhZ2VgLCBmb3IKIGFjY2Vzc2luZyBhbmQgbWFuaXB1bGF0aW5nIG9uLWRpc2sgbWFpbGJveGVzIGFuZCB0aGUgbWVzc2FnZXMgdGhleSBjb250YWluLgogOmNsYXNzOmBNYWlsYm94YCBvZmZlcnMgYSBkaWN0aW9uYXJ5LWxpa2UgbWFwcGluZyBmcm9tIGtleXMgdG8gbWVzc2FnZXMuCi06Y2xhc3M6YE1lc3NhZ2VgIGV4dGVuZHMgdGhlIDptb2Q6YGVtYWlsLk1lc3NhZ2VgIG1vZHVsZSdzIDpjbGFzczpgTWVzc2FnZWAKLWNsYXNzIHdpdGggZm9ybWF0LXNwZWNpZmljIHN0YXRlIGFuZCBiZWhhdmlvci4gU3VwcG9ydGVkIG1haWxib3ggZm9ybWF0cyBhcmUKKzpjbGFzczpgTWVzc2FnZWAgZXh0ZW5kcyB0aGUgOm1vZDpgZW1haWwubWVzc2FnZWAgbW9kdWxlJ3MKKzpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZWAgY2xhc3Mgd2l0aCBmb3JtYXQtc3BlY2lmaWMgc3RhdGUgYW5kIGJlaGF2aW9yLgorU3VwcG9ydGVkIG1haWxib3ggZm9ybWF0cyBhcmUKIE1haWxkaXIsIG1ib3gsIE1ILCBCYWJ5bCwgYW5kIE1NREYuCiAKIApAQCAtODMsNyArODQsNyBAQAogICAgICAgaXQuCiAKICAgICAgIFBhcmFtZXRlciAqbWVzc2FnZSogbWF5IGJlIGEgOmNsYXNzOmBNZXNzYWdlYCBpbnN0YW5jZSwgYW4KLSAgICAgIDpjbGFzczpgZW1haWwuTWVzc2FnZS5NZXNzYWdlYCBpbnN0YW5jZSwgYSBzdHJpbmcsIG9yIGEgZmlsZS1saWtlIG9iamVjdAorICAgICAgOmNsYXNzOmBlbWFpbC5tZXNzYWdlLk1lc3NhZ2VgIGluc3RhbmNlLCBhIHN0cmluZywgb3IgYSBmaWxlLWxpa2Ugb2JqZWN0CiAgICAgICAod2hpY2ggc2hvdWxkIGJlIG9wZW4gaW4gdGV4dCBtb2RlKS4gSWYgKm1lc3NhZ2UqIGlzIGFuIGluc3RhbmNlIG9mIHRoZQogICAgICAgYXBwcm9wcmlhdGUgZm9ybWF0LXNwZWNpZmljIDpjbGFzczpgTWVzc2FnZWAgc3ViY2xhc3MgKGUuZy4sIGlmIGl0J3MgYW4KICAgICAgIDpjbGFzczpgbWJveE1lc3NhZ2VgIGluc3RhbmNlIGFuZCB0aGlzIGlzIGFuIDpjbGFzczpgbWJveGAgaW5zdGFuY2UpLCBpdHMKQEAgLTExMCw3ICsxMTEsNyBAQAogICAgICAgOmV4YzpgS2V5RXJyb3JgIGV4Y2VwdGlvbiBpZiBubyBtZXNzYWdlIGFscmVhZHkgY29ycmVzcG9uZHMgdG8gKmtleSouCiAKICAgICAgIEFzIHdpdGggOm1ldGg6YGFkZGAsIHBhcmFtZXRlciAqbWVzc2FnZSogbWF5IGJlIGEgOmNsYXNzOmBNZXNzYWdlYAotICAgICAgaW5zdGFuY2UsIGFuIDpjbGFzczpgZW1haWwuTWVzc2FnZS5NZXNzYWdlYCBpbnN0YW5jZSwgYSBzdHJpbmcsIG9yIGEKKyAgICAgIGluc3RhbmNlLCBhbiA6Y2xhc3M6YGVtYWlsLm1lc3NhZ2UuTWVzc2FnZWAgaW5zdGFuY2UsIGEgc3RyaW5nLCBvciBhCiAgICAgICBmaWxlLWxpa2Ugb2JqZWN0ICh3aGljaCBzaG91bGQgYmUgb3BlbiBpbiB0ZXh0IG1vZGUpLiBJZiAqbWVzc2FnZSogaXMgYW4KICAgICAgIGluc3RhbmNlIG9mIHRoZSBhcHByb3ByaWF0ZSBmb3JtYXQtc3BlY2lmaWMgOmNsYXNzOmBNZXNzYWdlYCBzdWJjbGFzcwogICAgICAgKGUuZy4sIGlmIGl0J3MgYW4gOmNsYXNzOmBtYm94TWVzc2FnZWAgaW5zdGFuY2UgYW5kIHRoaXMgaXMgYW4KQEAgLTE1NCw3ICsxNTUsNyBAQAogICAgICAgd2hlbiB0aGUgOmNsYXNzOmBNYWlsYm94YCBpbnN0YW5jZSB3YXMgaW5pdGlhbGl6ZWQuCiAKIAotICAgLi4gbWV0aG9kOjogZ2V0KGtleVssIGRlZmF1bHQ9Tm9uZV0pCisgICAuLiBtZXRob2Q6OiBnZXQoa2V5LCBkZWZhdWx0PU5vbmUpCiAgICAgICAgICAgICAgICBfX2dldGl0ZW1fXyhrZXkpCiAKICAgICAgIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlIGNvcnJlc3BvbmRpbmcgdG8gKmtleSouIElmIG5vIHN1Y2gKQEAgLTI3OCw3ICsyNzksNyBAQAogXl5eXl5eXl5eXl5eXl5eXgogCiAKLS4uIGNsYXNzOjogTWFpbGRpcihkaXJuYW1lWywgZmFjdG9yeT1yZmM4MjIuTWVzc2FnZVssIGNyZWF0ZT1UcnVlXV0pCisuLiBjbGFzczo6IE1haWxkaXIoZGlybmFtZSwgZmFjdG9yeT1yZmM4MjIuTWVzc2FnZSwgY3JlYXRlPVRydWUpCiAKICAgIEEgc3ViY2xhc3Mgb2YgOmNsYXNzOmBNYWlsYm94YCBmb3IgbWFpbGJveGVzIGluIE1haWxkaXIgZm9ybWF0LiBQYXJhbWV0ZXIKICAgICpmYWN0b3J5KiBpcyBhIGNhbGxhYmxlIG9iamVjdCB0aGF0IGFjY2VwdHMgYSBmaWxlLWxpa2UgbWVzc2FnZSByZXByZXNlbnRhdGlvbgpAQCAtNDIzLDcgKzQyNCw3IEBACiBeXl5eXl5eXl5eXl5eCiAKIAotLi4gY2xhc3M6OiBtYm94KHBhdGhbLCBmYWN0b3J5PU5vbmVbLCBjcmVhdGU9VHJ1ZV1dKQorLi4gY2xhc3M6OiBtYm94KHBhdGgsIGZhY3Rvcnk9Tm9uZSwgY3JlYXRlPVRydWUpCiAKICAgIEEgc3ViY2xhc3Mgb2YgOmNsYXNzOmBNYWlsYm94YCBmb3IgbWFpbGJveGVzIGluIG1ib3ggZm9ybWF0LiBQYXJhbWV0ZXIgKmZhY3RvcnkqCiAgICBpcyBhIGNhbGxhYmxlIG9iamVjdCB0aGF0IGFjY2VwdHMgYSBmaWxlLWxpa2UgbWVzc2FnZSByZXByZXNlbnRhdGlvbiAod2hpY2gKQEAgLTQ1OSw3ICs0NjAsNyBAQAogICAgICAgICAgICAgICAgdW5sb2NrKCkKIAogICAgICAgVGhyZWUgbG9ja2luZyBtZWNoYW5pc21zIGFyZSB1c2VkLS0tZG90IGxvY2tpbmcgYW5kLCBpZiBhdmFpbGFibGUsIHRoZQotICAgICAgOmNmdW5jOmBmbG9ja2AgYW5kIDpjZnVuYzpgbG9ja2ZgIHN5c3RlbSBjYWxscy4KKyAgICAgIDpjOmZ1bmM6YGZsb2NrYCBhbmQgOmM6ZnVuYzpgbG9ja2ZgIHN5c3RlbSBjYWxscy4KIAogCiAuLiBzZWVhbHNvOjoKQEAgLTQ4Myw3ICs0ODQsNyBAQAogXl5eXl5eXl5eXl4KIAogCi0uLiBjbGFzczo6IE1IKHBhdGhbLCBmYWN0b3J5PU5vbmVbLCBjcmVhdGU9VHJ1ZV1dKQorLi4gY2xhc3M6OiBNSChwYXRoLCBmYWN0b3J5PU5vbmUsIGNyZWF0ZT1UcnVlKQogCiAgICBBIHN1YmNsYXNzIG9mIDpjbGFzczpgTWFpbGJveGAgZm9yIG1haWxib3hlcyBpbiBNSCBmb3JtYXQuIFBhcmFtZXRlciAqZmFjdG9yeSoKICAgIGlzIGEgY2FsbGFibGUgb2JqZWN0IHRoYXQgYWNjZXB0cyBhIGZpbGUtbGlrZSBtZXNzYWdlIHJlcHJlc2VudGF0aW9uICh3aGljaApAQCAtNTczLDcgKzU3NCw3IEBACiAgICAgICAgICAgICAgICB1bmxvY2soKQogCiAgICAgICBUaHJlZSBsb2NraW5nIG1lY2hhbmlzbXMgYXJlIHVzZWQtLS1kb3QgbG9ja2luZyBhbmQsIGlmIGF2YWlsYWJsZSwgdGhlCi0gICAgICA6Y2Z1bmM6YGZsb2NrYCBhbmQgOmNmdW5jOmBsb2NrZmAgc3lzdGVtIGNhbGxzLiBGb3IgTUggbWFpbGJveGVzLCBsb2NraW5nCisgICAgICA6YzpmdW5jOmBmbG9ja2AgYW5kIDpjOmZ1bmM6YGxvY2tmYCBzeXN0ZW0gY2FsbHMuIEZvciBNSCBtYWlsYm94ZXMsIGxvY2tpbmcKICAgICAgIHRoZSBtYWlsYm94IG1lYW5zIGxvY2tpbmcgdGhlIDpmaWxlOmAubWhfc2VxdWVuY2VzYCBmaWxlIGFuZCwgb25seSBmb3IgdGhlCiAgICAgICBkdXJhdGlvbiBvZiBhbnkgb3BlcmF0aW9ucyB0aGF0IGFmZmVjdCB0aGVtLCBsb2NraW5nIGluZGl2aWR1YWwgbWVzc2FnZQogICAgICAgZmlsZXMuCkBAIC02MTMsNyArNjE0LDcgQEAKIF5eXl5eXl5eXl5eXl5eCiAKIAotLi4gY2xhc3M6OiBCYWJ5bChwYXRoWywgZmFjdG9yeT1Ob25lWywgY3JlYXRlPVRydWVdXSkKKy4uIGNsYXNzOjogQmFieWwocGF0aCwgZmFjdG9yeT1Ob25lLCBjcmVhdGU9VHJ1ZSkKIAogICAgQSBzdWJjbGFzcyBvZiA6Y2xhc3M6YE1haWxib3hgIGZvciBtYWlsYm94ZXMgaW4gQmFieWwgZm9ybWF0LiBQYXJhbWV0ZXIKICAgICpmYWN0b3J5KiBpcyBhIGNhbGxhYmxlIG9iamVjdCB0aGF0IGFjY2VwdHMgYSBmaWxlLWxpa2UgbWVzc2FnZSByZXByZXNlbnRhdGlvbgpAQCAtNjYwLDcgKzY2MSw3IEBACiAKICAgICAgIEluIEJhYnlsIG1haWxib3hlcywgdGhlIGhlYWRlcnMgb2YgYSBtZXNzYWdlIGFyZSBub3Qgc3RvcmVkIGNvbnRpZ3VvdXNseQogICAgICAgd2l0aCB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZS4gVG8gZ2VuZXJhdGUgYSBmaWxlLWxpa2UgcmVwcmVzZW50YXRpb24sIHRoZQotICAgICAgaGVhZGVycyBhbmQgYm9keSBhcmUgY29waWVkIHRvZ2V0aGVyIGludG8gYSA6Y2xhc3M6YFN0cmluZ0lPYCBpbnN0YW5jZQorICAgICAgaGVhZGVycyBhbmQgYm9keSBhcmUgY29waWVkIHRvZ2V0aGVyIGludG8gYSA6Y2xhc3M6YH5TdHJpbmdJTy5TdHJpbmdJT2AgaW5zdGFuY2UKICAgICAgIChmcm9tIHRoZSA6bW9kOmBTdHJpbmdJT2AgbW9kdWxlKSwgd2hpY2ggaGFzIGFuIEFQSSBpZGVudGljYWwgdG8gdGhhdCBvZiBhCiAgICAgICBmaWxlLiBBcyBhIHJlc3VsdCwgdGhlIGZpbGUtbGlrZSBvYmplY3QgaXMgdHJ1bHkgaW5kZXBlbmRlbnQgb2YgdGhlCiAgICAgICB1bmRlcmx5aW5nIG1haWxib3ggYnV0IGRvZXMgbm90IHNhdmUgbWVtb3J5IGNvbXBhcmVkIHRvIGEgc3RyaW5nCkBAIC02NzEsNyArNjcyLDcgQEAKICAgICAgICAgICAgICAgIHVubG9jaygpCiAKICAgICAgIFRocmVlIGxvY2tpbmcgbWVjaGFuaXNtcyBhcmUgdXNlZC0tLWRvdCBsb2NraW5nIGFuZCwgaWYgYXZhaWxhYmxlLCB0aGUKLSAgICAgIDpjZnVuYzpgZmxvY2tgIGFuZCA6Y2Z1bmM6YGxvY2tmYCBzeXN0ZW0gY2FsbHMuCisgICAgICA6YzpmdW5jOmBmbG9ja2AgYW5kIDpjOmZ1bmM6YGxvY2tmYCBzeXN0ZW0gY2FsbHMuCiAKIAogLi4gc2VlYWxzbzo6CkBAIC02ODksNyArNjkwLDcgQEAKIF5eXl5eXl5eXl5eXl4KIAogCi0uLiBjbGFzczo6IE1NREYocGF0aFssIGZhY3Rvcnk9Tm9uZVssIGNyZWF0ZT1UcnVlXV0pCisuLiBjbGFzczo6IE1NREYocGF0aCwgZmFjdG9yeT1Ob25lLCBjcmVhdGU9VHJ1ZSkKIAogICAgQSBzdWJjbGFzcyBvZiA6Y2xhc3M6YE1haWxib3hgIGZvciBtYWlsYm94ZXMgaW4gTU1ERiBmb3JtYXQuIFBhcmFtZXRlciAqZmFjdG9yeSoKICAgIGlzIGEgY2FsbGFibGUgb2JqZWN0IHRoYXQgYWNjZXB0cyBhIGZpbGUtbGlrZSBtZXNzYWdlIHJlcHJlc2VudGF0aW9uICh3aGljaApAQCAtNzIyLDcgKzcyMyw3IEBACiAgICAgICAgICAgICAgICB1bmxvY2soKQogCiAgICAgICBUaHJlZSBsb2NraW5nIG1lY2hhbmlzbXMgYXJlIHVzZWQtLS1kb3QgbG9ja2luZyBhbmQsIGlmIGF2YWlsYWJsZSwgdGhlCi0gICAgICA6Y2Z1bmM6YGZsb2NrYCBhbmQgOmNmdW5jOmBsb2NrZmAgc3lzdGVtIGNhbGxzLgorICAgICAgOmM6ZnVuYzpgZmxvY2tgIGFuZCA6YzpmdW5jOmBsb2NrZmAgc3lzdGVtIGNhbGxzLgogCiAKIC4uIHNlZWFsc286OgpAQCAtNzQzLDExICs3NDQsMTIgQEAKIAogLi4gY2xhc3M6OiBNZXNzYWdlKFttZXNzYWdlXSkKIAotICAgQSBzdWJjbGFzcyBvZiB0aGUgOm1vZDpgZW1haWwuTWVzc2FnZWAgbW9kdWxlJ3MgOmNsYXNzOmBNZXNzYWdlYC4gU3ViY2xhc3NlcyBvZgotICAgOmNsYXNzOmBtYWlsYm94Lk1lc3NhZ2VgIGFkZCBtYWlsYm94LWZvcm1hdC1zcGVjaWZpYyBzdGF0ZSBhbmQgYmVoYXZpb3IuCisgICBBIHN1YmNsYXNzIG9mIHRoZSA6bW9kOmBlbWFpbC5tZXNzYWdlYCBtb2R1bGUncworICAgOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlYC4gU3ViY2xhc3NlcyBvZiA6Y2xhc3M6YG1haWxib3guTWVzc2FnZWAgYWRkCisgICBtYWlsYm94LWZvcm1hdC1zcGVjaWZpYyBzdGF0ZSBhbmQgYmVoYXZpb3IuCiAKICAgIElmICptZXNzYWdlKiBpcyBvbWl0dGVkLCB0aGUgbmV3IGluc3RhbmNlIGlzIGNyZWF0ZWQgaW4gYSBkZWZhdWx0LCBlbXB0eSBzdGF0ZS4KLSAgIElmICptZXNzYWdlKiBpcyBhbiA6Y2xhc3M6YGVtYWlsLk1lc3NhZ2UuTWVzc2FnZWAgaW5zdGFuY2UsIGl0cyBjb250ZW50cyBhcmUKKyAgIElmICptZXNzYWdlKiBpcyBhbiA6Y2xhc3M6YGVtYWlsLm1lc3NhZ2UuTWVzc2FnZWAgaW5zdGFuY2UsIGl0cyBjb250ZW50cyBhcmUKICAgIGNvcGllZDsgZnVydGhlcm1vcmUsIGFueSBmb3JtYXQtc3BlY2lmaWMgaW5mb3JtYXRpb24gaXMgY29udmVydGVkIGluc29mYXIgYXMKICAgIHBvc3NpYmxlIGlmICptZXNzYWdlKiBpcyBhIDpjbGFzczpgTWVzc2FnZWAgaW5zdGFuY2UuIElmICptZXNzYWdlKiBpcyBhIHN0cmluZwogICAgb3IgYSBmaWxlLCBpdCBzaG91bGQgY29udGFpbiBhbiA6cmZjOmAyODIyYFwgLWNvbXBsaWFudCBtZXNzYWdlLCB3aGljaCBpcyByZWFkCkBAIC05ODcsMTIgKzk4OSwxMiBAQAogICAgICAgYXJlIGV4Y2x1ZGVkLgogCiAKLSAgIC4uIG1ldGhvZDo6IHNldF9mcm9tKGZyb21fWywgdGltZV89Tm9uZV0pCisgICAuLiBtZXRob2Q6OiBzZXRfZnJvbShmcm9tXywgdGltZV89Tm9uZSkKIAogICAgICAgU2V0IHRoZSAiRnJvbSAiIGxpbmUgdG8gKmZyb21fKiwgd2hpY2ggc2hvdWxkIGJlIHNwZWNpZmllZCB3aXRob3V0IGEKICAgICAgIGxlYWRpbmcgIkZyb20gIiBvciB0cmFpbGluZyBuZXdsaW5lLiBGb3IgY29udmVuaWVuY2UsICp0aW1lXyogbWF5IGJlCiAgICAgICBzcGVjaWZpZWQgYW5kIHdpbGwgYmUgZm9ybWF0dGVkIGFwcHJvcHJpYXRlbHkgYW5kIGFwcGVuZGVkIHRvICpmcm9tXyouIElmCi0gICAgICAqdGltZV8qIGlzIHNwZWNpZmllZCwgaXQgc2hvdWxkIGJlIGEgOmNsYXNzOmBzdHJ1Y3RfdGltZWAgaW5zdGFuY2UsIGEKKyAgICAgICp0aW1lXyogaXMgc3BlY2lmaWVkLCBpdCBzaG91bGQgYmUgYSA6Y2xhc3M6YHRpbWUuc3RydWN0X3RpbWVgIGluc3RhbmNlLCBhCiAgICAgICB0dXBsZSBzdWl0YWJsZSBmb3IgcGFzc2luZyB0byA6bWV0aDpgdGltZS5zdHJmdGltZWAsIG9yIGBgVHJ1ZWBgICh0byB1c2UKICAgICAgIDptZXRoOmB0aW1lLmdtdGltZWApLgogCkBAIC0xMjUxLDcgKzEyNTMsNyBAQAogCiAgICAgICBTZXQgdGhlIG1lc3NhZ2UncyB2aXNpYmxlIGhlYWRlcnMgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIGhlYWRlcnMgaW4KICAgICAgICptZXNzYWdlKi4gIFBhcmFtZXRlciAqdmlzaWJsZSogc2hvdWxkIGJlIGEgOmNsYXNzOmBNZXNzYWdlYCBpbnN0YW5jZSwgYW4KLSAgICAgIDpjbGFzczpgZW1haWwuTWVzc2FnZS5NZXNzYWdlYCBpbnN0YW5jZSwgYSBzdHJpbmcsIG9yIGEgZmlsZS1saWtlIG9iamVjdAorICAgICAgOmNsYXNzOmBlbWFpbC5tZXNzYWdlLk1lc3NhZ2VgIGluc3RhbmNlLCBhIHN0cmluZywgb3IgYSBmaWxlLWxpa2Ugb2JqZWN0CiAgICAgICAod2hpY2ggc2hvdWxkIGJlIG9wZW4gaW4gdGV4dCBtb2RlKS4KIAogCkBAIC0xMzU4LDEyICsxMzYwLDEyIEBACiAgICAgICBhcmUgZXhjbHVkZWQuCiAKIAotICAgLi4gbWV0aG9kOjogc2V0X2Zyb20oZnJvbV9bLCB0aW1lXz1Ob25lXSkKKyAgIC4uIG1ldGhvZDo6IHNldF9mcm9tKGZyb21fLCB0aW1lXz1Ob25lKQogCiAgICAgICBTZXQgdGhlICJGcm9tICIgbGluZSB0byAqZnJvbV8qLCB3aGljaCBzaG91bGQgYmUgc3BlY2lmaWVkIHdpdGhvdXQgYQogICAgICAgbGVhZGluZyAiRnJvbSAiIG9yIHRyYWlsaW5nIG5ld2xpbmUuIEZvciBjb252ZW5pZW5jZSwgKnRpbWVfKiBtYXkgYmUKICAgICAgIHNwZWNpZmllZCBhbmQgd2lsbCBiZSBmb3JtYXR0ZWQgYXBwcm9wcmlhdGVseSBhbmQgYXBwZW5kZWQgdG8gKmZyb21fKi4gSWYKLSAgICAgICp0aW1lXyogaXMgc3BlY2lmaWVkLCBpdCBzaG91bGQgYmUgYSA6Y2xhc3M6YHN0cnVjdF90aW1lYCBpbnN0YW5jZSwgYQorICAgICAgKnRpbWVfKiBpcyBzcGVjaWZpZWQsIGl0IHNob3VsZCBiZSBhIDpjbGFzczpgdGltZS5zdHJ1Y3RfdGltZWAgaW5zdGFuY2UsIGEKICAgICAgIHR1cGxlIHN1aXRhYmxlIGZvciBwYXNzaW5nIHRvIDptZXRoOmB0aW1lLnN0cmZ0aW1lYCwgb3IgYGBUcnVlYGAgKHRvIHVzZQogICAgICAgOm1ldGg6YHRpbWUuZ210aW1lYCkuCiAKQEAgLTE1MTMsNyArMTUxNSw3IEBACiBtYWlsYm94ZXMsIHN1Y2ggYXMgYWRkaW5nIG9yIHJlbW92aW5nIG1lc3NhZ2UsIGFuZCBkbyBub3QgcHJvdmlkZSBjbGFzc2VzIHRvCiByZXByZXNlbnQgZm9ybWF0LXNwZWNpZmljIG1lc3NhZ2UgcHJvcGVydGllcy4gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZQogb2xkZXIgbWFpbGJveCBjbGFzc2VzIGFyZSBzdGlsbCBhdmFpbGFibGUsIGJ1dCB0aGUgbmV3ZXIgY2xhc3NlcyBzaG91bGQgYmUgdXNlZAotaW4gcHJlZmVyZW5jZSB0byB0aGVtLiAgVGhlIG9sZCBjbGFzc2VzIHdpbGwgYmUgcmVtb3ZlZCBpbiBQeXRob24gMy4wLgoraW4gcHJlZmVyZW5jZSB0byB0aGVtLiAgVGhlIG9sZCBjbGFzc2VzIGhhdmUgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLgogCiBPbGRlciBtYWlsYm94IG9iamVjdHMgc3VwcG9ydCBvbmx5IGl0ZXJhdGlvbiBhbmQgcHJvdmlkZSBhIHNpbmdsZSBwdWJsaWMgbWV0aG9kOgogCkBAIC0xNjYyLDcgKzE2NjQsNyBAQAogZHVlIHRvIG1hbGZvcm1lZCBtZXNzYWdlcyBpbiB0aGUgbWFpbGJveDo6CiAKICAgIGltcG9ydCBtYWlsYm94Ci0gICBpbXBvcnQgZW1haWwuRXJyb3JzCisgICBpbXBvcnQgZW1haWwuZXJyb3JzCiAKICAgIGxpc3RfbmFtZXMgPSAoJ3B5dGhvbi1saXN0JywgJ3B5dGhvbi1kZXYnLCAncHl0aG9uLWJ1Z3MnKQogCkBAIC0xNjcyLDcgKzE2NzQsNyBAQAogICAgZm9yIGtleSBpbiBpbmJveC5pdGVya2V5cygpOgogICAgICAgIHRyeToKICAgICAgICAgICAgbWVzc2FnZSA9IGluYm94W2tleV0KLSAgICAgICBleGNlcHQgZW1haWwuRXJyb3JzLk1lc3NhZ2VQYXJzZUVycm9yOgorICAgICAgIGV4Y2VwdCBlbWFpbC5lcnJvcnMuTWVzc2FnZVBhcnNlRXJyb3I6CiAgICAgICAgICAgIGNvbnRpbnVlICAgICAgICAgICAgICAgICMgVGhlIG1lc3NhZ2UgaXMgbWFsZm9ybWVkLiBKdXN0IGxlYXZlIGl0LgogCiAgICAgICAgZm9yIG5hbWUgaW4gbGlzdF9uYW1lczoKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L21haWxjYXAucnN0IGIvRG9jL2xpYnJhcnkvbWFpbGNhcC5yc3QKaW5kZXggNTUwNzIxMS4uYjM1OTUwOSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvbWFpbGNhcC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvbWFpbGNhcC5yc3QKQEAgLTcxLDYgKzcxLDYgQEAKIAogICAgPj4+IGltcG9ydCBtYWlsY2FwCiAgICA+Pj4gZD1tYWlsY2FwLmdldGNhcHMoKQotICAgPj4+IG1haWxjYXAuZmluZG1hdGNoKGQsICd2aWRlby9tcGVnJywgZmlsZW5hbWU9Jy90bXAvdG1wMTIyMycpCi0gICAoJ3htcGVnIC90bXAvdG1wMTIyMycsIHsndmlldyc6ICd4bXBlZyAlcyd9KQorICAgPj4+IG1haWxjYXAuZmluZG1hdGNoKGQsICd2aWRlby9tcGVnJywgZmlsZW5hbWU9J3RtcDEyMjMnKQorICAgKCd4bXBlZyB0bXAxMjIzJywgeyd2aWV3JzogJ3htcGVnICVzJ30pCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L21hcmt1cC5yc3QgYi9Eb2MvbGlicmFyeS9tYXJrdXAucnN0CmluZGV4IDg1MDhhMWYuLjBkMDVlZjEgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L21hcmt1cC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvbWFya3VwLnJzdApAQCAtMSw0ICsxLDMgQEAKLQogLi4gX21hcmt1cDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjYsNyArMjUsOCBAQAogICAgaHRtbHBhcnNlci5yc3QKICAgIHNnbWxsaWIucnN0CiAgICBodG1sbGliLnJzdAotICAgcHlleHBhdC5yc3QKKyAgIHhtbC5yc3QKKyAgIHhtbC5ldHJlZS5lbGVtZW50dHJlZS5yc3QKICAgIHhtbC5kb20ucnN0CiAgICB4bWwuZG9tLm1pbmlkb20ucnN0CiAgICB4bWwuZG9tLnB1bGxkb20ucnN0CkBAIC0zNCw0ICszNCw0IEBACiAgICB4bWwuc2F4LmhhbmRsZXIucnN0CiAgICB4bWwuc2F4LnV0aWxzLnJzdAogICAgeG1sLnNheC5yZWFkZXIucnN0Ci0gICB4bWwuZXRyZWUuZWxlbWVudHRyZWUucnN0CisgICBweWV4cGF0LnJzdApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvbWFyc2hhbC5yc3QgYi9Eb2MvbGlicmFyeS9tYXJzaGFsLnJzdAppbmRleCBmNDYzYTdhLi5mNGRmYzFmIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9tYXJzaGFsLnJzdAorKysgYi9Eb2MvbGlicmFyeS9tYXJzaGFsLnJzdApAQCAtNjYsOCArNjYsOSBAQAogLi4gZnVuY3Rpb246OiBkdW1wKHZhbHVlLCBmaWxlWywgdmVyc2lvbl0pCiAKICAgIFdyaXRlIHRoZSB2YWx1ZSBvbiB0aGUgb3BlbiBmaWxlLiAgVGhlIHZhbHVlIG11c3QgYmUgYSBzdXBwb3J0ZWQgdHlwZS4gIFRoZQotICAgZmlsZSBtdXN0IGJlIGFuIG9wZW4gZmlsZSBvYmplY3Qgc3VjaCBhcyBgYHN5cy5zdGRvdXRgYCBvciByZXR1cm5lZCBieQotICAgOmZ1bmM6YG9wZW5gIG9yIDpmdW5jOmBvcy5wb3BlbmAuICBJdCBtdXN0IGJlIG9wZW5lZCBpbiBiaW5hcnkgbW9kZSAoYGAnd2InYGAKKyAgIGZpbGUgbXVzdCBiZSBhIG9wZW4gZmlsZSBvYmplY3Qgc3VjaCBhcyBgYHN5cy5zdGRvdXRgYCBvciByZXR1cm5lZCBieQorICAgOmZ1bmM6YG9wZW5gIG9yIDpmdW5jOmBvcy5wb3BlbmAuICBJdCBtYXkgbm90IGJlIGEgd3JhcHBlciBzdWNoIGFzCisgICBUZW1wb3JhcnlGaWxlIG9uIFdpbmRvd3MuIEl0IG11c3QgYmUgb3BlbmVkIGluIGJpbmFyeSBtb2RlIChgYCd3YidgYAogICAgb3IgYGAndytiJ2BgKS4KIAogICAgSWYgdGhlIHZhbHVlIGhhcyAob3IgY29udGFpbnMgYW4gb2JqZWN0IHRoYXQgaGFzKSBhbiB1bnN1cHBvcnRlZCB0eXBlLCBhCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9tYXRoLnJzdCBiL0RvYy9saWJyYXJ5L21hdGgucnN0CmluZGV4IGU1ZmZiYTAuLjU2MjM4OGUgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L21hdGgucnN0CisrKyBiL0RvYy9saWJyYXJ5L21hdGgucnN0CkBAIC01LDYgKzUsOSBAQAogLi4gbW9kdWxlOjogbWF0aAogICAgOnN5bm9wc2lzOiBNYXRoZW1hdGljYWwgZnVuY3Rpb25zIChzaW4oKSBldGMuKS4KIAorLi4gdGVzdHNldHVwOjoKKworICAgZnJvbSBtYXRoIGltcG9ydCBmc3VtCiAKIFRoaXMgbW9kdWxlIGlzIGFsd2F5cyBhdmFpbGFibGUuICBJdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIG1hdGhlbWF0aWNhbAogZnVuY3Rpb25zIGRlZmluZWQgYnkgdGhlIEMgc3RhbmRhcmQuCkBAIC0xMzMsOCArMTM2LDkgQEAKIAogLi4gZnVuY3Rpb246OiB0cnVuYyh4KQogCi0gICBSZXR1cm4gdGhlIDpjbGFzczpgUmVhbGAgdmFsdWUgKngqIHRydW5jYXRlZCB0byBhbiA6Y2xhc3M6YEludGVncmFsYCAodXN1YWxseQotICAgYSBsb25nIGludGVnZXIpLiAgVXNlcyB0aGUgYGBfX3RydW5jX19gYCBtZXRob2QuCisgICBSZXR1cm4gdGhlIDpjbGFzczpgfm51bWJlcnMuUmVhbGAgdmFsdWUgKngqIHRydW5jYXRlZCB0byBhbgorICAgOmNsYXNzOmB+bnVtYmVycy5JbnRlZ3JhbGAgKHVzdWFsbHkgYSBsb25nIGludGVnZXIpLiAgVXNlcyB0aGUKKyAgIGBgX190cnVuY19fYGAgbWV0aG9kLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjYKIApAQCAtMjA5LDYgKzIxMywxMCBAQAogICAgYGB4YGAgaXMgbmVnYXRpdmUsIGFuZCBgYHlgYCBpcyBub3QgYW4gaW50ZWdlciB0aGVuIGBgcG93KHgsIHkpYGAKICAgIGlzIHVuZGVmaW5lZCwgYW5kIHJhaXNlcyA6ZXhjOmBWYWx1ZUVycm9yYC4KIAorICAgVW5saWtlIHRoZSBidWlsdC1pbiBgYCoqYGAgb3BlcmF0b3IsIDpmdW5jOmBtYXRoLnBvd2AgY29udmVydHMgYm90aAorICAgaXRzIGFyZ3VtZW50cyB0byB0eXBlIDpjbGFzczpgZmxvYXRgLiAgVXNlIGBgKipgYCBvciB0aGUgYnVpbHQtaW4KKyAgIDpmdW5jOmBwb3dgIGZ1bmN0aW9uIGZvciBjb21wdXRpbmcgZXhhY3QgaW50ZWdlciBwb3dlcnMuCisKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi42CiAgICAgICBUaGUgb3V0Y29tZSBvZiBgYDEqKm5hbmBgIGFuZCBgYG5hbioqMGBgIHdhcyB1bmRlZmluZWQuCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L21obGliLnJzdCBiL0RvYy9saWJyYXJ5L21obGliLnJzdAppbmRleCAyYWFiMWRjLi45MzliZGM3IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9taGxpYi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvbWhsaWIucnN0CkBAIC02LDcgKzYsNyBAQAogICAgOmRlcHJlY2F0ZWQ6CiAKIC4uIGRlcHJlY2F0ZWQ6OiAyLjYKLSAgICBUaGUgOm1vZDpgbWhsaWJgIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLjAuIFVzZSB0aGUKKyAgICBUaGUgOm1vZDpgbWhsaWJgIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLiBVc2UgdGhlCiAgICAgOm1vZDpgbWFpbGJveGAgaW5zdGVhZC4KIAogLi4gc2VjdGlvbmF1dGhvcjo6IFNraXAgTW9udGFuYXJvIDxza2lwQHBvYm94LmNvbT4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L21pbWV0eXBlcy5yc3QgYi9Eb2MvbGlicmFyeS9taW1ldHlwZXMucnN0CmluZGV4IDY5Zjg0MzQuLjg4OTFlN2EgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L21pbWV0eXBlcy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvbWltZXR5cGVzLnJzdApAQCAtMSw0ICsxLDMgQEAKLQogOm1vZDpgbWltZXR5cGVzYCAtLS0gTWFwIGZpbGVuYW1lcyB0byBNSU1FIHR5cGVzCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMjcsMzEgKzI2LDMxIEBACiB0aGUgaW5mb3JtYXRpb24gOmZ1bmM6YGluaXRgIHNldHMgdXAuCiAKIAotLi4gZnVuY3Rpb246OiBndWVzc190eXBlKGZpbGVuYW1lWywgc3RyaWN0XSkKKy4uIGZ1bmN0aW9uOjogZ3Vlc3NfdHlwZSh1cmwsIHN0cmljdD1UcnVlKQogCiAgICAuLiBpbmRleDo6IHBhaXI6IE1JTUU7IGhlYWRlcnMKIAotICAgR3Vlc3MgdGhlIHR5cGUgb2YgYSBmaWxlIGJhc2VkIG9uIGl0cyBmaWxlbmFtZSBvciBVUkwsIGdpdmVuIGJ5ICpmaWxlbmFtZSouICBUaGUKKyAgIEd1ZXNzIHRoZSB0eXBlIG9mIGEgZmlsZSBiYXNlZCBvbiBpdHMgZmlsZW5hbWUgb3IgVVJMLCBnaXZlbiBieSAqdXJsKi4gIFRoZQogICAgcmV0dXJuIHZhbHVlIGlzIGEgdHVwbGUgYGAodHlwZSwgZW5jb2RpbmcpYGAgd2hlcmUgKnR5cGUqIGlzIGBgTm9uZWBgIGlmIHRoZQogICAgdHlwZSBjYW4ndCBiZSBndWVzc2VkIChtaXNzaW5nIG9yIHVua25vd24gc3VmZml4KSBvciBhIHN0cmluZyBvZiB0aGUgZm9ybQogICAgYGAndHlwZS9zdWJ0eXBlJ2BgLCB1c2FibGUgZm9yIGEgTUlNRSA6bWFpbGhlYWRlcjpgY29udGVudC10eXBlYCBoZWFkZXIuCiAKICAgICplbmNvZGluZyogaXMgYGBOb25lYGAgZm9yIG5vIGVuY29kaW5nIG9yIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHVzZWQgdG8gZW5jb2RlCiAgICAoZS5nLiA6cHJvZ3JhbTpgY29tcHJlc3NgIG9yIDpwcm9ncmFtOmBnemlwYCkuIFRoZSBlbmNvZGluZyBpcyBzdWl0YWJsZSBmb3IgdXNlCi0gICBhcyBhIDptYWlsaGVhZGVyOmBDb250ZW50LUVuY29kaW5nYCBoZWFkZXIsICpub3QqIGFzIGEKKyAgIGFzIGEgOm1haWxoZWFkZXI6YENvbnRlbnQtRW5jb2RpbmdgIGhlYWRlciwgKipub3QqKiBhcyBhCiAgICA6bWFpbGhlYWRlcjpgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyLiBUaGUgbWFwcGluZ3MgYXJlIHRhYmxlIGRyaXZlbi4KICAgIEVuY29kaW5nIHN1ZmZpeGVzIGFyZSBjYXNlIHNlbnNpdGl2ZTsgdHlwZSBzdWZmaXhlcyBhcmUgZmlyc3QgdHJpZWQgY2FzZQogICAgc2Vuc2l0aXZlbHksIHRoZW4gY2FzZSBpbnNlbnNpdGl2ZWx5LgogCi0gICBPcHRpb25hbCAqc3RyaWN0KiBpcyBhIGZsYWcgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBsaXN0IG9mIGtub3duIE1JTUUgdHlwZXMKKyAgIFRoZSBvcHRpb25hbCAqc3RyaWN0KiBhcmd1bWVudCBpcyBhIGZsYWcgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBsaXN0IG9mIGtub3duIE1JTUUgdHlwZXMKICAgIGlzIGxpbWl0ZWQgdG8gb25seSB0aGUgb2ZmaWNpYWwgdHlwZXMgYHJlZ2lzdGVyZWQgd2l0aCBJQU5BCi0gICA8aHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy8+YF8gYXJlIHJlY29nbml6ZWQuCi0gICBXaGVuICpzdHJpY3QqIGlzIHRydWUgKHRoZSBkZWZhdWx0KSwgb25seSB0aGUgSUFOQSB0eXBlcyBhcmUgc3VwcG9ydGVkOyB3aGVuCi0gICAqc3RyaWN0KiBpcyBmYWxzZSwgc29tZSBhZGRpdGlvbmFsIG5vbi1zdGFuZGFyZCBidXQgY29tbW9ubHkgdXNlZCBNSU1FIHR5cGVzCisgICA8aHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy8+YF8uCisgICBXaGVuICpzdHJpY3QqIGlzIGBgVHJ1ZWBgICh0aGUgZGVmYXVsdCksIG9ubHkgdGhlIElBTkEgdHlwZXMgYXJlIHN1cHBvcnRlZDsgd2hlbgorICAgKnN0cmljdCogaXMgYGBGYWxzZWBgLCBzb21lIGFkZGl0aW9uYWwgbm9uLXN0YW5kYXJkIGJ1dCBjb21tb25seSB1c2VkIE1JTUUgdHlwZXMKICAgIGFyZSBhbHNvIHJlY29nbml6ZWQuCiAKIAotLi4gZnVuY3Rpb246OiBndWVzc19hbGxfZXh0ZW5zaW9ucyh0eXBlWywgc3RyaWN0XSkKKy4uIGZ1bmN0aW9uOjogZ3Vlc3NfYWxsX2V4dGVuc2lvbnModHlwZSwgc3RyaWN0PVRydWUpCiAKICAgIEd1ZXNzIHRoZSBleHRlbnNpb25zIGZvciBhIGZpbGUgYmFzZWQgb24gaXRzIE1JTUUgdHlwZSwgZ2l2ZW4gYnkgKnR5cGUqLiBUaGUKICAgIHJldHVybiB2YWx1ZSBpcyBhIGxpc3Qgb2Ygc3RyaW5ncyBnaXZpbmcgYWxsIHBvc3NpYmxlIGZpbGVuYW1lIGV4dGVuc2lvbnMsCkBAIC01OSwyNSArNTgsMjUgQEAKICAgIGJlZW4gYXNzb2NpYXRlZCB3aXRoIGFueSBwYXJ0aWN1bGFyIGRhdGEgc3RyZWFtLCBidXQgd291bGQgYmUgbWFwcGVkIHRvIHRoZSBNSU1FCiAgICB0eXBlICp0eXBlKiBieSA6ZnVuYzpgZ3Vlc3NfdHlwZWAuCiAKLSAgIE9wdGlvbmFsICpzdHJpY3QqIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIHdpdGggdGhlIDpmdW5jOmBndWVzc190eXBlYCBmdW5jdGlvbi4KKyAgIFRoZSBvcHRpb25hbCAqc3RyaWN0KiBhcmd1bWVudCBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyB3aXRoIHRoZSA6ZnVuYzpgZ3Vlc3NfdHlwZWAgZnVuY3Rpb24uCiAKIAotLi4gZnVuY3Rpb246OiBndWVzc19leHRlbnNpb24odHlwZVssIHN0cmljdF0pCisuLiBmdW5jdGlvbjo6IGd1ZXNzX2V4dGVuc2lvbih0eXBlLCBzdHJpY3Q9VHJ1ZSkKIAogICAgR3Vlc3MgdGhlIGV4dGVuc2lvbiBmb3IgYSBmaWxlIGJhc2VkIG9uIGl0cyBNSU1FIHR5cGUsIGdpdmVuIGJ5ICp0eXBlKi4gVGhlCiAgICByZXR1cm4gdmFsdWUgaXMgYSBzdHJpbmcgZ2l2aW5nIGEgZmlsZW5hbWUgZXh0ZW5zaW9uLCBpbmNsdWRpbmcgdGhlIGxlYWRpbmcgZG90CiAgICAoYGAnLidgYCkuICBUaGUgZXh0ZW5zaW9uIGlzIG5vdCBndWFyYW50ZWVkIHRvIGhhdmUgYmVlbiBhc3NvY2lhdGVkIHdpdGggYW55Ci0gICBwYXJ0aWN1bGFyIGRhdGEgc3RyZWFtLCBidXQgd291bGQgYmUgbWFwcGVkIHRvIHRoZSAgTUlNRSB0eXBlICp0eXBlKiBieQorICAgcGFydGljdWxhciBkYXRhIHN0cmVhbSwgYnV0IHdvdWxkIGJlIG1hcHBlZCB0byB0aGUgTUlNRSB0eXBlICp0eXBlKiBieQogICAgOmZ1bmM6YGd1ZXNzX3R5cGVgLiAgSWYgbm8gZXh0ZW5zaW9uIGNhbiBiZSBndWVzc2VkIGZvciAqdHlwZSosIGBgTm9uZWBgIGlzCiAgICByZXR1cm5lZC4KIAotICAgT3B0aW9uYWwgKnN0cmljdCogaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgd2l0aCB0aGUgOmZ1bmM6YGd1ZXNzX3R5cGVgIGZ1bmN0aW9uLgorICAgVGhlIG9wdGlvbmFsICpzdHJpY3QqIGFyZ3VtZW50IGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIHdpdGggdGhlIDpmdW5jOmBndWVzc190eXBlYCBmdW5jdGlvbi4KIAogU29tZSBhZGRpdGlvbmFsIGZ1bmN0aW9ucyBhbmQgZGF0YSBpdGVtcyBhcmUgYXZhaWxhYmxlIGZvciBjb250cm9sbGluZyB0aGUKIGJlaGF2aW9yIG9mIHRoZSBtb2R1bGUuCiAKIAotLi4gZnVuY3Rpb246OiBpbml0KFtmaWxlc10pCisuLiBmdW5jdGlvbjo6IGluaXQoZmlsZXM9Tm9uZSkKIAogICAgSW5pdGlhbGl6ZSB0aGUgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzLiAgSWYgZ2l2ZW4sICpmaWxlcyogbXVzdCBiZSBhIHNlcXVlbmNlCiAgICBvZiBmaWxlIG5hbWVzIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIGF1Z21lbnQgdGhlIGRlZmF1bHQgdHlwZSBtYXAuICBJZiBvbWl0dGVkLApAQCAtODYsMzIgKzg1LDM1IEBACiAgICA6Y29uc3Q6YGtub3duZmlsZXNgIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aG9zZSBuYW1lZCBiZWZvcmUgaXQuICBDYWxsaW5nCiAgICA6ZnVuYzpgaW5pdGAgcmVwZWF0ZWRseSBpcyBhbGxvd2VkLgogCisgICBTcGVjaWZ5aW5nIGFuIGVtcHR5IGxpc3QgZm9yICpmaWxlcyogd2lsbCBwcmV2ZW50IHRoZSBzeXN0ZW0gZGVmYXVsdHMgZnJvbQorICAgYmVpbmcgYXBwbGllZDogb25seSB0aGUgd2VsbC1rbm93biB2YWx1ZXMgd2lsbCBiZSBwcmVzZW50IGZyb20gYSBidWlsdC1pbiBsaXN0LgorCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNwogICAgICAgUHJldmlvdXNseSwgV2luZG93cyByZWdpc3RyeSBzZXR0aW5ncyB3ZXJlIGlnbm9yZWQuCiAKIAogLi4gZnVuY3Rpb246OiByZWFkX21pbWVfdHlwZXMoZmlsZW5hbWUpCiAKLSAgIExvYWQgdGhlIHR5cGUgbWFwIGdpdmVuIGluIHRoZSBmaWxlICpmaWxlbmFtZSosIGlmIGl0IGV4aXN0cy4gIFRoZSAgdHlwZSBtYXAgaXMKKyAgIExvYWQgdGhlIHR5cGUgbWFwIGdpdmVuIGluIHRoZSBmaWxlICpmaWxlbmFtZSosIGlmIGl0IGV4aXN0cy4gIFRoZSB0eXBlIG1hcCBpcwogICAgcmV0dXJuZWQgYXMgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgZmlsZW5hbWUgZXh0ZW5zaW9ucywgaW5jbHVkaW5nIHRoZSBsZWFkaW5nIGRvdAogICAgKGBgJy4nYGApLCB0byBzdHJpbmdzIG9mIHRoZSBmb3JtIGBgJ3R5cGUvc3VidHlwZSdgYC4gIElmIHRoZSBmaWxlICpmaWxlbmFtZSoKICAgIGRvZXMgbm90IGV4aXN0IG9yIGNhbm5vdCBiZSByZWFkLCBgYE5vbmVgYCBpcyByZXR1cm5lZC4KIAogCi0uLiBmdW5jdGlvbjo6IGFkZF90eXBlKHR5cGUsIGV4dFssIHN0cmljdF0pCisuLiBmdW5jdGlvbjo6IGFkZF90eXBlKHR5cGUsIGV4dCwgc3RyaWN0PVRydWUpCiAKLSAgIEFkZCBhIG1hcHBpbmcgZnJvbSB0aGUgbWltZXR5cGUgKnR5cGUqIHRvIHRoZSBleHRlbnNpb24gKmV4dCouIFdoZW4gdGhlCisgICBBZGQgYSBtYXBwaW5nIGZyb20gdGhlIE1JTUUgdHlwZSAqdHlwZSogdG8gdGhlIGV4dGVuc2lvbiAqZXh0Ki4gV2hlbiB0aGUKICAgIGV4dGVuc2lvbiBpcyBhbHJlYWR5IGtub3duLCB0aGUgbmV3IHR5cGUgd2lsbCByZXBsYWNlIHRoZSBvbGQgb25lLiBXaGVuIHRoZSB0eXBlCiAgICBpcyBhbHJlYWR5IGtub3duIHRoZSBleHRlbnNpb24gd2lsbCBiZSBhZGRlZCB0byB0aGUgbGlzdCBvZiBrbm93biBleHRlbnNpb25zLgogCi0gICBXaGVuICpzdHJpY3QqIGlzIFRydWUgKHRoZSBkZWZhdWx0KSwgdGhlIG1hcHBpbmcgd2lsbCBhZGRlZCB0byB0aGUgb2ZmaWNpYWwgTUlNRQorICAgV2hlbiAqc3RyaWN0KiBpcyBgYFRydWVgYCAodGhlIGRlZmF1bHQpLCB0aGUgbWFwcGluZyB3aWxsIGFkZGVkIHRvIHRoZSBvZmZpY2lhbCBNSU1FCiAgICB0eXBlcywgb3RoZXJ3aXNlIHRvIHRoZSBub24tc3RhbmRhcmQgb25lcy4KIAogCiAuLiBkYXRhOjogaW5pdGVkCiAKICAgIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2xvYmFsIGRhdGEgc3RydWN0dXJlcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQuCi0gICBUaGlzIGlzIHNldCB0byB0cnVlIGJ5IDpmdW5jOmBpbml0YC4KKyAgIFRoaXMgaXMgc2V0IHRvIGBgVHJ1ZWBgIGJ5IDpmdW5jOmBpbml0YC4KIAogCiAuLiBkYXRhOjoga25vd25maWxlcwpAQCAtMTQ2LDIzICsxNDgsNiBAQAogICAgRGljdGlvbmFyeSBtYXBwaW5nIGZpbGVuYW1lIGV4dGVuc2lvbnMgdG8gbm9uLXN0YW5kYXJkLCBidXQgY29tbW9ubHkgZm91bmQgTUlNRQogICAgdHlwZXMuCiAKLVRoZSA6Y2xhc3M6YE1pbWVUeXBlc2AgY2xhc3MgbWF5IGJlIHVzZWZ1bCBmb3IgYXBwbGljYXRpb25zIHdoaWNoIG1heSB3YW50IG1vcmUKLXRoYW4gb25lIE1JTUUtdHlwZSBkYXRhYmFzZToKLQotCi0uLiBjbGFzczo6IE1pbWVUeXBlcyhbZmlsZW5hbWVzXSkKLQotICAgVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgTUlNRS10eXBlcyBkYXRhYmFzZS4gIEJ5IGRlZmF1bHQsIGl0IHByb3ZpZGVzIGFjY2VzcyB0bwotICAgdGhlIHNhbWUgZGF0YWJhc2UgYXMgdGhlIHJlc3Qgb2YgdGhpcyBtb2R1bGUuIFRoZSBpbml0aWFsIGRhdGFiYXNlIGlzIGEgY29weSBvZgotICAgdGhhdCBwcm92aWRlZCBieSB0aGUgbW9kdWxlLCBhbmQgbWF5IGJlIGV4dGVuZGVkIGJ5IGxvYWRpbmcgYWRkaXRpb25hbAotICAgOmZpbGU6YG1pbWUudHlwZXNgXCAtc3R5bGUgZmlsZXMgaW50byB0aGUgZGF0YWJhc2UgdXNpbmcgdGhlIDptZXRoOmByZWFkYCBvcgotICAgOm1ldGg6YHJlYWRmcGAgbWV0aG9kcy4gIFRoZSBtYXBwaW5nIGRpY3Rpb25hcmllcyBtYXkgYWxzbyBiZSBjbGVhcmVkIGJlZm9yZQotICAgbG9hZGluZyBhZGRpdGlvbmFsIGRhdGEgaWYgdGhlIGRlZmF1bHQgZGF0YSBpcyBub3QgZGVzaXJlZC4KLQotICAgVGhlIG9wdGlvbmFsICpmaWxlbmFtZXMqIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBjYXVzZSBhZGRpdGlvbmFsIGZpbGVzIHRvIGJlCi0gICBsb2FkZWQgIm9uIHRvcCIgb2YgdGhlIGRlZmF1bHQgZGF0YWJhc2UuCi0KLSAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMgogCiBBbiBleGFtcGxlIHVzYWdlIG9mIHRoZSBtb2R1bGU6OgogCkBAIC0xODMsNzAgKzE2OCw5NiBAQAogTWltZVR5cGVzIE9iamVjdHMKIC0tLS0tLS0tLS0tLS0tLS0tCiAKLTpjbGFzczpgTWltZVR5cGVzYCBpbnN0YW5jZXMgcHJvdmlkZSBhbiBpbnRlcmZhY2Ugd2hpY2ggaXMgdmVyeSBsaWtlIHRoYXQgb2YgdGhlCitUaGUgOmNsYXNzOmBNaW1lVHlwZXNgIGNsYXNzIG1heSBiZSB1c2VmdWwgZm9yIGFwcGxpY2F0aW9ucyB3aGljaCBtYXkgd2FudCBtb3JlCit0aGFuIG9uZSBNSU1FLXR5cGUgZGF0YWJhc2U7IGl0IHByb3ZpZGVzIGFuIGludGVyZmFjZSBzaW1pbGFyIHRvIHRoZSBvbmUgb2YgdGhlCiA6bW9kOmBtaW1ldHlwZXNgIG1vZHVsZS4KIAogCisuLiBjbGFzczo6IE1pbWVUeXBlcyhmaWxlbmFtZXM9KCksIHN0cmljdD1UcnVlKQorCisgICBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBNSU1FLXR5cGVzIGRhdGFiYXNlLiAgQnkgZGVmYXVsdCwgaXQgcHJvdmlkZXMgYWNjZXNzIHRvCisgICB0aGUgc2FtZSBkYXRhYmFzZSBhcyB0aGUgcmVzdCBvZiB0aGlzIG1vZHVsZS4gVGhlIGluaXRpYWwgZGF0YWJhc2UgaXMgYSBjb3B5IG9mCisgICB0aGF0IHByb3ZpZGVkIGJ5IHRoZSBtb2R1bGUsIGFuZCBtYXkgYmUgZXh0ZW5kZWQgYnkgbG9hZGluZyBhZGRpdGlvbmFsCisgICA6ZmlsZTpgbWltZS50eXBlc2BcIC1zdHlsZSBmaWxlcyBpbnRvIHRoZSBkYXRhYmFzZSB1c2luZyB0aGUgOm1ldGg6YHJlYWRgIG9yCisgICA6bWV0aDpgcmVhZGZwYCBtZXRob2RzLiAgVGhlIG1hcHBpbmcgZGljdGlvbmFyaWVzIG1heSBhbHNvIGJlIGNsZWFyZWQgYmVmb3JlCisgICBsb2FkaW5nIGFkZGl0aW9uYWwgZGF0YSBpZiB0aGUgZGVmYXVsdCBkYXRhIGlzIG5vdCBkZXNpcmVkLgorCisgICBUaGUgb3B0aW9uYWwgKmZpbGVuYW1lcyogcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIGNhdXNlIGFkZGl0aW9uYWwgZmlsZXMgdG8gYmUKKyAgIGxvYWRlZCAib24gdG9wIiBvZiB0aGUgZGVmYXVsdCBkYXRhYmFzZS4KKworCiAuLiBhdHRyaWJ1dGU6OiBNaW1lVHlwZXMuc3VmZml4X21hcAogCiAgICBEaWN0aW9uYXJ5IG1hcHBpbmcgc3VmZml4ZXMgdG8gc3VmZml4ZXMuICBUaGlzIGlzIHVzZWQgdG8gYWxsb3cgcmVjb2duaXRpb24gb2YKICAgIGVuY29kZWQgZmlsZXMgZm9yIHdoaWNoIHRoZSBlbmNvZGluZyBhbmQgdGhlIHR5cGUgYXJlIGluZGljYXRlZCBieSB0aGUgc2FtZQogICAgZXh0ZW5zaW9uLiAgRm9yIGV4YW1wbGUsIHRoZSA6ZmlsZTpgLnRnemAgZXh0ZW5zaW9uIGlzIG1hcHBlZCB0byA6ZmlsZTpgLnRhci5nemAKICAgIHRvIGFsbG93IHRoZSBlbmNvZGluZyBhbmQgdHlwZSB0byBiZSByZWNvZ25pemVkIHNlcGFyYXRlbHkuICBUaGlzIGlzIGluaXRpYWxseSBhCi0gICBjb3B5IG9mIHRoZSBnbG9iYWwgYGBzdWZmaXhfbWFwYGAgZGVmaW5lZCBpbiB0aGUgbW9kdWxlLgorICAgY29weSBvZiB0aGUgZ2xvYmFsIDpkYXRhOmBzdWZmaXhfbWFwYCBkZWZpbmVkIGluIHRoZSBtb2R1bGUuCiAKIAogLi4gYXR0cmlidXRlOjogTWltZVR5cGVzLmVuY29kaW5nc19tYXAKIAogICAgRGljdGlvbmFyeSBtYXBwaW5nIGZpbGVuYW1lIGV4dGVuc2lvbnMgdG8gZW5jb2RpbmcgdHlwZXMuICBUaGlzIGlzIGluaXRpYWxseSBhCi0gICBjb3B5IG9mIHRoZSBnbG9iYWwgYGBlbmNvZGluZ3NfbWFwYGAgZGVmaW5lZCBpbiB0aGUgbW9kdWxlLgorICAgY29weSBvZiB0aGUgZ2xvYmFsIDpkYXRhOmBlbmNvZGluZ3NfbWFwYCBkZWZpbmVkIGluIHRoZSBtb2R1bGUuCiAKIAogLi4gYXR0cmlidXRlOjogTWltZVR5cGVzLnR5cGVzX21hcAogCi0gICBEaWN0aW9uYXJ5IG1hcHBpbmcgZmlsZW5hbWUgZXh0ZW5zaW9ucyB0byBNSU1FIHR5cGVzLiAgVGhpcyBpcyBpbml0aWFsbHkgYSBjb3B5Ci0gICBvZiB0aGUgZ2xvYmFsIGBgdHlwZXNfbWFwYGAgZGVmaW5lZCBpbiB0aGUgbW9kdWxlLgorICAgVHVwbGUgY29udGFpbmluZyB0d28gZGljdGlvbmFyaWVzLCBtYXBwaW5nIGZpbGVuYW1lIGV4dGVuc2lvbnMgdG8gTUlNRSB0eXBlczoKKyAgIHRoZSBmaXJzdCBkaWN0aW9uYXJ5IGlzIGZvciB0aGUgbm9uLXN0YW5kYXJkcyB0eXBlcyBhbmQgdGhlIHNlY29uZCBvbmUgaXMgZm9yCisgICB0aGUgc3RhbmRhcmQgdHlwZXMuIFRoZXkgYXJlIGluaXRpYWxpemVkIGJ5IDpkYXRhOmBjb21tb25fdHlwZXNgIGFuZAorICAgOmRhdGE6YHR5cGVzX21hcGAuCiAKIAotLi4gYXR0cmlidXRlOjogTWltZVR5cGVzLmNvbW1vbl90eXBlcworLi4gYXR0cmlidXRlOjogTWltZVR5cGVzLnR5cGVzX21hcF9pbnYKIAotICAgRGljdGlvbmFyeSBtYXBwaW5nIGZpbGVuYW1lIGV4dGVuc2lvbnMgdG8gbm9uLXN0YW5kYXJkLCBidXQgY29tbW9ubHkgZm91bmQgTUlNRQotICAgdHlwZXMuICBUaGlzIGlzIGluaXRpYWxseSBhIGNvcHkgb2YgdGhlIGdsb2JhbCBgYGNvbW1vbl90eXBlc2BgIGRlZmluZWQgaW4gdGhlCi0gICBtb2R1bGUuCisgICBUdXBsZSBjb250YWluaW5nIHR3byBkaWN0aW9uYXJpZXMsIG1hcHBpbmcgTUlNRSB0eXBlcyB0byBhIGxpc3Qgb2YgZmlsZW5hbWUKKyAgIGV4dGVuc2lvbnM6IHRoZSBmaXJzdCBkaWN0aW9uYXJ5IGlzIGZvciB0aGUgbm9uLXN0YW5kYXJkcyB0eXBlcyBhbmQgdGhlCisgICBzZWNvbmQgb25lIGlzIGZvciB0aGUgc3RhbmRhcmQgdHlwZXMuIFRoZXkgYXJlIGluaXRpYWxpemVkIGJ5CisgICA6ZGF0YTpgY29tbW9uX3R5cGVzYCBhbmQgOmRhdGE6YHR5cGVzX21hcGAuCiAKIAotLi4gbWV0aG9kOjogTWltZVR5cGVzLmd1ZXNzX2V4dGVuc2lvbih0eXBlWywgc3RyaWN0XSkKKy4uIG1ldGhvZDo6IE1pbWVUeXBlcy5ndWVzc19leHRlbnNpb24odHlwZSwgc3RyaWN0PVRydWUpCiAKICAgIFNpbWlsYXIgdG8gdGhlIDpmdW5jOmBndWVzc19leHRlbnNpb25gIGZ1bmN0aW9uLCB1c2luZyB0aGUgdGFibGVzIHN0b3JlZCBhcyBwYXJ0CiAgICBvZiB0aGUgb2JqZWN0LgogCiAKLS4uIG1ldGhvZDo6IE1pbWVUeXBlcy5ndWVzc19hbGxfZXh0ZW5zaW9ucyh0eXBlWywgc3RyaWN0XSkKLQotICAgU2ltaWxhciB0byB0aGUgOmZ1bmM6YGd1ZXNzX2FsbF9leHRlbnNpb25zYCBmdW5jdGlvbiwgdXNpbmcgdGhlIHRhYmxlcyBzdG9yZWQgYXMgcGFydAotICAgb2YgdGhlIG9iamVjdC4KLQotCi0uLiBtZXRob2Q6OiBNaW1lVHlwZXMuZ3Vlc3NfdHlwZSh1cmxbLCBzdHJpY3RdKQorLi4gbWV0aG9kOjogTWltZVR5cGVzLmd1ZXNzX3R5cGUodXJsLCBzdHJpY3Q9VHJ1ZSkKIAogICAgU2ltaWxhciB0byB0aGUgOmZ1bmM6YGd1ZXNzX3R5cGVgIGZ1bmN0aW9uLCB1c2luZyB0aGUgdGFibGVzIHN0b3JlZCBhcyBwYXJ0IG9mCiAgICB0aGUgb2JqZWN0LgogCiAKLS4uIG1ldGhvZDo6IE1pbWVUeXBlcy5yZWFkKHBhdGgpCisuLiBtZXRob2Q6OiBNaW1lVHlwZXMuZ3Vlc3NfYWxsX2V4dGVuc2lvbnModHlwZSwgc3RyaWN0PVRydWUpCiAKLSAgIExvYWQgTUlNRSBpbmZvcm1hdGlvbiBmcm9tIGEgZmlsZSBuYW1lZCAqcGF0aCouICBUaGlzIHVzZXMgOm1ldGg6YHJlYWRmcGAgdG8KKyAgIFNpbWlsYXIgdG8gdGhlIDpmdW5jOmBndWVzc19hbGxfZXh0ZW5zaW9uc2AgZnVuY3Rpb24sIHVzaW5nIHRoZSB0YWJsZXMgc3RvcmVkCisgICBhcyBwYXJ0IG9mIHRoZSBvYmplY3QuCisKKworLi4gbWV0aG9kOjogTWltZVR5cGVzLnJlYWQoZmlsZW5hbWUsIHN0cmljdD1UcnVlKQorCisgICBMb2FkIE1JTUUgaW5mb3JtYXRpb24gZnJvbSBhIGZpbGUgbmFtZWQgKmZpbGVuYW1lKi4gIFRoaXMgdXNlcyA6bWV0aDpgcmVhZGZwYCB0bwogICAgcGFyc2UgdGhlIGZpbGUuCiAKKyAgIElmICpzdHJpY3QqIGlzIGBgVHJ1ZWBgLCBpbmZvcm1hdGlvbiB3aWxsIGJlIGFkZGVkIHRvIGxpc3Qgb2Ygc3RhbmRhcmQgdHlwZXMsCisgICBlbHNlIHRvIHRoZSBsaXN0IG9mIG5vbi1zdGFuZGFyZCB0eXBlcy4KIAotLi4gbWV0aG9kOjogTWltZVR5cGVzLnJlYWRmcChmaWxlKQogCi0gICBMb2FkIE1JTUUgdHlwZSBpbmZvcm1hdGlvbiBmcm9tIGFuIG9wZW4gZmlsZS4gIFRoZSBmaWxlIG11c3QgaGF2ZSB0aGUgZm9ybWF0IG9mCisuLiBtZXRob2Q6OiBNaW1lVHlwZXMucmVhZGZwKGZwLCBzdHJpY3Q9VHJ1ZSkKKworICAgTG9hZCBNSU1FIHR5cGUgaW5mb3JtYXRpb24gZnJvbSBhbiBvcGVuIGZpbGUgKmZwKi4gIFRoZSBmaWxlIG11c3QgaGF2ZSB0aGUgZm9ybWF0IG9mCiAgICB0aGUgc3RhbmRhcmQgOmZpbGU6YG1pbWUudHlwZXNgIGZpbGVzLgogCisgICBJZiAqc3RyaWN0KiBpcyBgYFRydWVgYCwgaW5mb3JtYXRpb24gd2lsbCBiZSBhZGRlZCB0byB0aGUgbGlzdCBvZiBzdGFuZGFyZAorICAgdHlwZXMsIGVsc2UgdG8gdGhlIGxpc3Qgb2Ygbm9uLXN0YW5kYXJkIHR5cGVzLgogCi0uLiBtZXRob2Q6OiBNaW1lVHlwZXMucmVhZF93aW5kb3dzX3JlZ2lzdHJ5KCkKKworLi4gbWV0aG9kOjogTWltZVR5cGVzLnJlYWRfd2luZG93c19yZWdpc3RyeShzdHJpY3Q9VHJ1ZSkKIAogICAgTG9hZCBNSU1FIHR5cGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgV2luZG93cyByZWdpc3RyeS4gIEF2YWlsYWJpbGl0eTogV2luZG93cy4KIAorICAgSWYgKnN0cmljdCogaXMgYGBUcnVlYGAsIGluZm9ybWF0aW9uIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2Ygc3RhbmRhcmQKKyAgIHR5cGVzLCBlbHNlIHRvIHRoZSBsaXN0IG9mIG5vbi1zdGFuZGFyZCB0eXBlcy4KKwogICAgLi4gdmVyc2lvbmFkZGVkOjogMi43CmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9taW1ld3JpdGVyLnJzdCBiL0RvYy9saWJyYXJ5L21pbWV3cml0ZXIucnN0CmluZGV4IDIwNzBmZjYuLmEzMGNhZWYgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L21pbWV3cml0ZXIucnN0CisrKyBiL0RvYy9saWJyYXJ5L21pbWV3cml0ZXIucnN0CkBAIC0yNCw3ICsyNCw3IEBACiAKICAgIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgOmNsYXNzOmBNaW1lV3JpdGVyYCBjbGFzcy4gIFRoZSBvbmx5IGFyZ3VtZW50CiAgICBwYXNzZWQsICpmcCosIGlzIGEgZmlsZSBvYmplY3QgdG8gYmUgdXNlZCBmb3Igd3JpdGluZy4gTm90ZSB0aGF0IGEKLSAgIDpjbGFzczpgU3RyaW5nSU9gIG9iamVjdCBjb3VsZCBhbHNvIGJlIHVzZWQuCisgICA6Y2xhc3M6YH5TdHJpbmdJTy5TdHJpbmdJT2Agb2JqZWN0IGNvdWxkIGFsc28gYmUgdXNlZC4KIAogCiAuLiBfbWltZXdyaXRlci1vYmplY3RzOgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvbW1hcC5yc3QgYi9Eb2MvbGlicmFyeS9tbWFwLnJzdAppbmRleCA1NTg2MWY5Li5hYzE5NjNmIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9tbWFwLnJzdAorKysgYi9Eb2MvbGlicmFyeS9tbWFwLnJzdApAQCAtMTE0LDE5ICsxMTQsMTkgQEAKIAogICAgICAgd2l0aCBvcGVuKCJoZWxsby50eHQiLCAicitiIikgYXMgZjoKICAgICAgICAgICAjIG1lbW9yeS1tYXAgdGhlIGZpbGUsIHNpemUgMCBtZWFucyB3aG9sZSBmaWxlCi0gICAgICAgICAgbWFwID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIDApCisgICAgICAgICAgbW0gPSBtbWFwLm1tYXAoZi5maWxlbm8oKSwgMCkKICAgICAgICAgICAjIHJlYWQgY29udGVudCB2aWEgc3RhbmRhcmQgZmlsZSBtZXRob2RzCi0gICAgICAgICAgcHJpbnQgbWFwLnJlYWRsaW5lKCkgICMgcHJpbnRzICJIZWxsbyBQeXRob24hIgorICAgICAgICAgIHByaW50IG1tLnJlYWRsaW5lKCkgICMgcHJpbnRzICJIZWxsbyBQeXRob24hIgogICAgICAgICAgICMgcmVhZCBjb250ZW50IHZpYSBzbGljZSBub3RhdGlvbgotICAgICAgICAgIHByaW50IG1hcFs6NV0gICMgcHJpbnRzICJIZWxsbyIKKyAgICAgICAgICBwcmludCBtbVs6NV0gICMgcHJpbnRzICJIZWxsbyIKICAgICAgICAgICAjIHVwZGF0ZSBjb250ZW50IHVzaW5nIHNsaWNlIG5vdGF0aW9uOwogICAgICAgICAgICMgbm90ZSB0aGF0IG5ldyBjb250ZW50IG11c3QgaGF2ZSBzYW1lIHNpemUKLSAgICAgICAgICBtYXBbNjpdID0gIiB3b3JsZCFcbiIKKyAgICAgICAgICBtbVs2Ol0gPSAiIHdvcmxkIVxuIgogICAgICAgICAgICMgLi4uIGFuZCByZWFkIGFnYWluIHVzaW5nIHN0YW5kYXJkIGZpbGUgbWV0aG9kcwotICAgICAgICAgIG1hcC5zZWVrKDApCi0gICAgICAgICAgcHJpbnQgbWFwLnJlYWRsaW5lKCkgICMgcHJpbnRzICJIZWxsbyAgd29ybGQhIgorICAgICAgICAgIG1tLnNlZWsoMCkKKyAgICAgICAgICBwcmludCBtbS5yZWFkbGluZSgpICAjIHByaW50cyAiSGVsbG8gIHdvcmxkISIKICAgICAgICAgICAjIGNsb3NlIHRoZSBtYXAKLSAgICAgICAgICBtYXAuY2xvc2UoKQorICAgICAgICAgIG1tLmNsb3NlKCkKIAogCiAgICBUaGUgbmV4dCBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gY3JlYXRlIGFuIGFub255bW91cyBtYXAgYW5kIGV4Y2hhbmdlCkBAIC0xMzUsMTYgKzEzNSwxNiBAQAogICAgICAgaW1wb3J0IG1tYXAKICAgICAgIGltcG9ydCBvcwogCi0gICAgICBtYXAgPSBtbWFwLm1tYXAoLTEsIDEzKQotICAgICAgbWFwLndyaXRlKCJIZWxsbyB3b3JsZCEiKQorICAgICAgbW0gPSBtbWFwLm1tYXAoLTEsIDEzKQorICAgICAgbW0ud3JpdGUoIkhlbGxvIHdvcmxkISIpCiAKICAgICAgIHBpZCA9IG9zLmZvcmsoKQogCiAgICAgICBpZiBwaWQgPT0gMDogIyBJbiBhIGNoaWxkIHByb2Nlc3MKLSAgICAgICAgICBtYXAuc2VlaygwKQotICAgICAgICAgIHByaW50IG1hcC5yZWFkbGluZSgpCisgICAgICAgICAgbW0uc2VlaygwKQorICAgICAgICAgIHByaW50IG1tLnJlYWRsaW5lKCkKIAotICAgICAgICAgIG1hcC5jbG9zZSgpCisgICAgICAgICAgbW0uY2xvc2UoKQogCiAKICAgIE1lbW9yeS1tYXBwZWQgZmlsZSBvYmplY3RzIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBtZXRob2RzOgpAQCAtMTUyLDggKzE1Miw5IEBACiAKICAgIC4uIG1ldGhvZDo6IGNsb3NlKCkKIAotICAgICAgQ2xvc2UgdGhlIGZpbGUuICBTdWJzZXF1ZW50IGNhbGxzIHRvIG90aGVyIG1ldGhvZHMgb2YgdGhlIG9iamVjdCB3aWxsCi0gICAgICByZXN1bHQgaW4gYW4gZXhjZXB0aW9uIGJlaW5nIHJhaXNlZC4KKyAgICAgIENsb3NlcyB0aGUgbW1hcC4gU3Vic2VxdWVudCBjYWxscyB0byBvdGhlciBtZXRob2RzIG9mIHRoZSBvYmplY3Qgd2lsbAorICAgICAgcmVzdWx0IGluIGEgVmFsdWVFcnJvciBleGNlcHRpb24gYmVpbmcgcmFpc2VkLiBUaGlzIHdpbGwgbm90IGNsb3NlCisgICAgICB0aGUgb3BlbiBmaWxlLgogCiAKICAgIC4uIG1ldGhvZDo6IGZpbmQoc3RyaW5nWywgc3RhcnRbLCBlbmRdXSkKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L21zaWxpYi5yc3QgYi9Eb2MvbGlicmFyeS9tc2lsaWIucnN0CmluZGV4IGE0MTI2MDkuLjE3ZDcxYWIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L21zaWxpYi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvbXNpbGliLnJzdApAQCAtNDQsNyArNDQsNyBAQAogLi4gZnVuY3Rpb246OiBVdWlkQ3JlYXRlKCkKIAogICAgUmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBuZXcgdW5pcXVlIGlkZW50aWZpZXIuIFRoaXMgd3JhcHMgdGhlCi0gICBXaW5kb3dzIEFQSSBmdW5jdGlvbnMgOmNmdW5jOmBVdWlkQ3JlYXRlYCBhbmQgOmNmdW5jOmBVdWlkVG9TdHJpbmdgLgorICAgV2luZG93cyBBUEkgZnVuY3Rpb25zIDpjOmZ1bmM6YFV1aWRDcmVhdGVgIGFuZCA6YzpmdW5jOmBVdWlkVG9TdHJpbmdgLgogCiAKIC4uIGZ1bmN0aW9uOjogT3BlbkRhdGFiYXNlKHBhdGgsIHBlcnNpc3QpCkBAIC02MCw3ICs2MCw3IEBACiAKIC4uIGZ1bmN0aW9uOjogQ3JlYXRlUmVjb3JkKGNvdW50KQogCi0gICBSZXR1cm4gYSBuZXcgcmVjb3JkIG9iamVjdCBieSBjYWxsaW5nIDpjZnVuYzpgTVNJQ3JlYXRlUmVjb3JkYC4gKmNvdW50KiBpcyB0aGUKKyAgIFJldHVybiBhIG5ldyByZWNvcmQgb2JqZWN0IGJ5IGNhbGxpbmcgOmM6ZnVuYzpgTVNJQ3JlYXRlUmVjb3JkYC4gKmNvdW50KiBpcyB0aGUKICAgIG51bWJlciBvZiBmaWVsZHMgb2YgdGhlIHJlY29yZC4KIAogCkBAIC0xMzUsMjAgKzEzNSwyMCBAQAogCiAuLiBtZXRob2Q6OiBEYXRhYmFzZS5PcGVuVmlldyhzcWwpCiAKLSAgIFJldHVybiBhIHZpZXcgb2JqZWN0LCBieSBjYWxsaW5nIDpjZnVuYzpgTVNJRGF0YWJhc2VPcGVuVmlld2AuICpzcWwqIGlzIHRoZSBTUUwKKyAgIFJldHVybiBhIHZpZXcgb2JqZWN0LCBieSBjYWxsaW5nIDpjOmZ1bmM6YE1TSURhdGFiYXNlT3BlblZpZXdgLiAqc3FsKiBpcyB0aGUgU1FMCiAgICBzdGF0ZW1lbnQgdG8gZXhlY3V0ZS4KIAogCiAuLiBtZXRob2Q6OiBEYXRhYmFzZS5Db21taXQoKQogCiAgICBDb21taXQgdGhlIGNoYW5nZXMgcGVuZGluZyBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiwgYnkgY2FsbGluZwotICAgOmNmdW5jOmBNU0lEYXRhYmFzZUNvbW1pdGAuCisgICA6YzpmdW5jOmBNU0lEYXRhYmFzZUNvbW1pdGAuCiAKIAogLi4gbWV0aG9kOjogRGF0YWJhc2UuR2V0U3VtbWFyeUluZm9ybWF0aW9uKGNvdW50KQogCiAgICBSZXR1cm4gYSBuZXcgc3VtbWFyeSBpbmZvcm1hdGlvbiBvYmplY3QsIGJ5IGNhbGxpbmcKLSAgIDpjZnVuYzpgTXNpR2V0U3VtbWFyeUluZm9ybWF0aW9uYC4gICpjb3VudCogaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHVwZGF0ZWQKKyAgIDpjOmZ1bmM6YE1zaUdldFN1bW1hcnlJbmZvcm1hdGlvbmAuICAqY291bnQqIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB1cGRhdGVkCiAgICB2YWx1ZXMuCiAKIApAQCAtMTY2LDcgKzE2Niw3IEBACiAKIC4uIG1ldGhvZDo6IFZpZXcuRXhlY3V0ZShwYXJhbXMpCiAKLSAgIEV4ZWN1dGUgdGhlIFNRTCBxdWVyeSBvZiB0aGUgdmlldywgdGhyb3VnaCA6Y2Z1bmM6YE1TSVZpZXdFeGVjdXRlYC4gSWYKKyAgIEV4ZWN1dGUgdGhlIFNRTCBxdWVyeSBvZiB0aGUgdmlldywgdGhyb3VnaCA6YzpmdW5jOmBNU0lWaWV3RXhlY3V0ZWAuIElmCiAgICAqcGFyYW1zKiBpcyBub3QgYGBOb25lYGAsIGl0IGlzIGEgcmVjb3JkIGRlc2NyaWJpbmcgYWN0dWFsIHZhbHVlcyBvZiB0aGUKICAgIHBhcmFtZXRlciB0b2tlbnMgaW4gdGhlIHF1ZXJ5LgogCkBAIC0xNzQsMTggKzE3NCwxOCBAQAogLi4gbWV0aG9kOjogVmlldy5HZXRDb2x1bW5JbmZvKGtpbmQpCiAKICAgIFJldHVybiBhIHJlY29yZCBkZXNjcmliaW5nIHRoZSBjb2x1bW5zIG9mIHRoZSB2aWV3LCB0aHJvdWdoIGNhbGxpbmcKLSAgIDpjZnVuYzpgTXNpVmlld0dldENvbHVtbkluZm9gLiAqa2luZCogY2FuIGJlIGVpdGhlciBgYE1TSUNPTElORk9fTkFNRVNgYCBvcgorICAgOmM6ZnVuYzpgTXNpVmlld0dldENvbHVtbkluZm9gLiAqa2luZCogY2FuIGJlIGVpdGhlciBgYE1TSUNPTElORk9fTkFNRVNgYCBvcgogICAgYGBNU0lDT0xJTkZPX1RZUEVTYGAuCiAKIAogLi4gbWV0aG9kOjogVmlldy5GZXRjaCgpCiAKLSAgIFJldHVybiBhIHJlc3VsdCByZWNvcmQgb2YgdGhlIHF1ZXJ5LCB0aHJvdWdoIGNhbGxpbmcgOmNmdW5jOmBNc2lWaWV3RmV0Y2hgLgorICAgUmV0dXJuIGEgcmVzdWx0IHJlY29yZCBvZiB0aGUgcXVlcnksIHRocm91Z2ggY2FsbGluZyA6YzpmdW5jOmBNc2lWaWV3RmV0Y2hgLgogCiAKIC4uIG1ldGhvZDo6IFZpZXcuTW9kaWZ5KGtpbmQsIGRhdGEpCiAKLSAgIE1vZGlmeSB0aGUgdmlldywgYnkgY2FsbGluZyA6Y2Z1bmM6YE1zaVZpZXdNb2RpZnlgLiAqa2luZCogY2FuIGJlIG9uZSBvZgorICAgTW9kaWZ5IHRoZSB2aWV3LCBieSBjYWxsaW5nIDpjOmZ1bmM6YE1zaVZpZXdNb2RpZnlgLiAqa2luZCogY2FuIGJlIG9uZSBvZgogICAgYGBNU0lNT0RJRllfU0VFS2BgLCBgYE1TSU1PRElGWV9SRUZSRVNIYGAsIGBgTVNJTU9ESUZZX0lOU0VSVGBgLAogICAgYGBNU0lNT0RJRllfVVBEQVRFYGAsIGBgTVNJTU9ESUZZX0FTU0lHTmBgLCBgYE1TSU1PRElGWV9SRVBMQUNFYGAsCiAgICBgYE1TSU1PRElGWV9NRVJHRWBgLCBgYE1TSU1PRElGWV9ERUxFVEVgYCwgYGBNU0lNT0RJRllfSU5TRVJUX1RFTVBPUkFSWWBgLApAQCAtMTk3LDcgKzE5Nyw3IEBACiAKIC4uIG1ldGhvZDo6IFZpZXcuQ2xvc2UoKQogCi0gICBDbG9zZSB0aGUgdmlldywgdGhyb3VnaCA6Y2Z1bmM6YE1zaVZpZXdDbG9zZWAuCisgICBDbG9zZSB0aGUgdmlldywgdGhyb3VnaCA6YzpmdW5jOmBNc2lWaWV3Q2xvc2VgLgogCiAKIC4uIHNlZWFsc286OgpAQCAtMjE2LDcgKzIxNiw3IEBACiAKIC4uIG1ldGhvZDo6IFN1bW1hcnlJbmZvcm1hdGlvbi5HZXRQcm9wZXJ0eShmaWVsZCkKIAotICAgUmV0dXJuIGEgcHJvcGVydHkgb2YgdGhlIHN1bW1hcnksIHRocm91Z2ggOmNmdW5jOmBNc2lTdW1tYXJ5SW5mb0dldFByb3BlcnR5YC4KKyAgIFJldHVybiBhIHByb3BlcnR5IG9mIHRoZSBzdW1tYXJ5LCB0aHJvdWdoIDpjOmZ1bmM6YE1zaVN1bW1hcnlJbmZvR2V0UHJvcGVydHlgLgogICAgKmZpZWxkKiBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHksIGFuZCBjYW4gYmUgb25lIG9mIHRoZSBjb25zdGFudHMKICAgIGBgUElEX0NPREVQQUdFYGAsIGBgUElEX1RJVExFYGAsIGBgUElEX1NVQkpFQ1RgYCwgYGBQSURfQVVUSE9SYGAsCiAgICBgYFBJRF9LRVlXT1JEU2BgLCBgYFBJRF9DT01NRU5UU2BgLCBgYFBJRF9URU1QTEFURWBgLCBgYFBJRF9MQVNUQVVUSE9SYGAsCkBAIC0yMjgsMTIgKzIyOCwxMiBAQAogLi4gbWV0aG9kOjogU3VtbWFyeUluZm9ybWF0aW9uLkdldFByb3BlcnR5Q291bnQoKQogCiAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBzdW1tYXJ5IHByb3BlcnRpZXMsIHRocm91Z2gKLSAgIDpjZnVuYzpgTXNpU3VtbWFyeUluZm9HZXRQcm9wZXJ0eUNvdW50YC4KKyAgIDpjOmZ1bmM6YE1zaVN1bW1hcnlJbmZvR2V0UHJvcGVydHlDb3VudGAuCiAKIAogLi4gbWV0aG9kOjogU3VtbWFyeUluZm9ybWF0aW9uLlNldFByb3BlcnR5KGZpZWxkLCB2YWx1ZSkKIAotICAgU2V0IGEgcHJvcGVydHkgdGhyb3VnaCA6Y2Z1bmM6YE1zaVN1bW1hcnlJbmZvU2V0UHJvcGVydHlgLiAqZmllbGQqIGNhbiBoYXZlIHRoZQorICAgU2V0IGEgcHJvcGVydHkgdGhyb3VnaCA6YzpmdW5jOmBNc2lTdW1tYXJ5SW5mb1NldFByb3BlcnR5YC4gKmZpZWxkKiBjYW4gaGF2ZSB0aGUKICAgIHNhbWUgdmFsdWVzIGFzIGluIDptZXRoOmBHZXRQcm9wZXJ0eWAsICp2YWx1ZSogaXMgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCiAgICBQb3NzaWJsZSB2YWx1ZSB0eXBlcyBhcmUgaW50ZWdlciBhbmQgc3RyaW5nLgogCkBAIC0yNDEsNyArMjQxLDcgQEAKIC4uIG1ldGhvZDo6IFN1bW1hcnlJbmZvcm1hdGlvbi5QZXJzaXN0KCkKIAogICAgV3JpdGUgdGhlIG1vZGlmaWVkIHByb3BlcnRpZXMgdG8gdGhlIHN1bW1hcnkgaW5mb3JtYXRpb24gc3RyZWFtLCB1c2luZwotICAgOmNmdW5jOmBNc2lTdW1tYXJ5SW5mb1BlcnNpc3RgLgorICAgOmM6ZnVuYzpgTXNpU3VtbWFyeUluZm9QZXJzaXN0YC4KIAogCiAuLiBzZWVhbHNvOjoKQEAgLTI2MCw3ICsyNjAsNyBAQAogLi4gbWV0aG9kOjogUmVjb3JkLkdldEZpZWxkQ291bnQoKQogCiAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBmaWVsZHMgb2YgdGhlIHJlY29yZCwgdGhyb3VnaAotICAgOmNmdW5jOmBNc2lSZWNvcmRHZXRGaWVsZENvdW50YC4KKyAgIDpjOmZ1bmM6YE1zaVJlY29yZEdldEZpZWxkQ291bnRgLgogCiAKIC4uIG1ldGhvZDo6IFJlY29yZC5HZXRJbnRlZ2VyKGZpZWxkKQpAQCAtMjc3LDI1ICsyNzcsMjUgQEAKIAogLi4gbWV0aG9kOjogUmVjb3JkLlNldFN0cmluZyhmaWVsZCwgdmFsdWUpCiAKLSAgIFNldCAqZmllbGQqIHRvICp2YWx1ZSogdGhyb3VnaCA6Y2Z1bmM6YE1zaVJlY29yZFNldFN0cmluZ2AuICpmaWVsZCogbXVzdCBiZSBhbgorICAgU2V0ICpmaWVsZCogdG8gKnZhbHVlKiB0aHJvdWdoIDpjOmZ1bmM6YE1zaVJlY29yZFNldFN0cmluZ2AuICpmaWVsZCogbXVzdCBiZSBhbgogICAgaW50ZWdlcjsgKnZhbHVlKiBhIHN0cmluZy4KIAogCiAuLiBtZXRob2Q6OiBSZWNvcmQuU2V0U3RyZWFtKGZpZWxkLCB2YWx1ZSkKIAogICAgU2V0ICpmaWVsZCogdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIG5hbWVkICp2YWx1ZSosIHRocm91Z2gKLSAgIDpjZnVuYzpgTXNpUmVjb3JkU2V0U3RyZWFtYC4gKmZpZWxkKiBtdXN0IGJlIGFuIGludGVnZXI7ICp2YWx1ZSogYSBzdHJpbmcuCisgICA6YzpmdW5jOmBNc2lSZWNvcmRTZXRTdHJlYW1gLiAqZmllbGQqIG11c3QgYmUgYW4gaW50ZWdlcjsgKnZhbHVlKiBhIHN0cmluZy4KIAogCiAuLiBtZXRob2Q6OiBSZWNvcmQuU2V0SW50ZWdlcihmaWVsZCwgdmFsdWUpCiAKLSAgIFNldCAqZmllbGQqIHRvICp2YWx1ZSogdGhyb3VnaCA6Y2Z1bmM6YE1zaVJlY29yZFNldEludGVnZXJgLiBCb3RoICpmaWVsZCogYW5kCisgICBTZXQgKmZpZWxkKiB0byAqdmFsdWUqIHRocm91Z2ggOmM6ZnVuYzpgTXNpUmVjb3JkU2V0SW50ZWdlcmAuIEJvdGggKmZpZWxkKiBhbmQKICAgICp2YWx1ZSogbXVzdCBiZSBhbiBpbnRlZ2VyLgogCiAKIC4uIG1ldGhvZDo6IFJlY29yZC5DbGVhckRhdGEoKQogCi0gICBTZXQgYWxsIGZpZWxkcyBvZiB0aGUgcmVjb3JkIHRvIDAsIHRocm91Z2ggOmNmdW5jOmBNc2lSZWNvcmRDbGVhckRhdGFgLgorICAgU2V0IGFsbCBmaWVsZHMgb2YgdGhlIHJlY29yZCB0byAwLCB0aHJvdWdoIDpjOmZ1bmM6YE1zaVJlY29yZENsZWFyRGF0YWAuCiAKIAogLi4gc2VlYWxzbzo6CkBAIC00MzIsOCArNDMyLDkgQEAKIC0tLS0tLS0tLS0tCiAKIDptb2Q6YG1zaWxpYmAgcHJvdmlkZXMgc2V2ZXJhbCBjbGFzc2VzIHRoYXQgd3JhcCB0aGUgR1VJIHRhYmxlcyBpbiBhbiBNU0kKLWRhdGFiYXNlLiBIb3dldmVyLCBubyBzdGFuZGFyZCB1c2VyIGludGVyZmFjZSBpcyBwcm92aWRlZDsgdXNlIDptb2Q6YGJkaXN0X21zaWAKLXRvIGNyZWF0ZSBNU0kgZmlsZXMgd2l0aCBhIHVzZXItaW50ZXJmYWNlIGZvciBpbnN0YWxsaW5nIFB5dGhvbiBwYWNrYWdlcy4KK2RhdGFiYXNlLiBIb3dldmVyLCBubyBzdGFuZGFyZCB1c2VyIGludGVyZmFjZSBpcyBwcm92aWRlZDsgdXNlCis6bW9kOmB+ZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3RfbXNpYCB0byBjcmVhdGUgTVNJIGZpbGVzIHdpdGggYSB1c2VyLWludGVyZmFjZQorZm9yIGluc3RhbGxpbmcgUHl0aG9uIHBhY2thZ2VzLgogCiAKIC4uIGNsYXNzOjogQ29udHJvbChkbGcsIG5hbWUpCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9tc3ZjcnQucnN0IGIvRG9jL2xpYnJhcnkvbXN2Y3J0LnJzdAppbmRleCA0ZmM1NTNmLi5kN2ZkM2ZiIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9tc3ZjcnQucnN0CisrKyBiL0RvYy9saWJyYXJ5L21zdmNydC5yc3QKQEAgLTE1Miw1ICsxNTIsNSBAQAogCiAuLiBmdW5jdGlvbjo6IGhlYXBtaW4oKQogCi0gICBGb3JjZSB0aGUgOmNmdW5jOmBtYWxsb2NgIGhlYXAgdG8gY2xlYW4gaXRzZWxmIHVwIGFuZCByZXR1cm4gdW51c2VkIGJsb2NrcyB0bworICAgRm9yY2UgdGhlIDpjOmZ1bmM6YG1hbGxvY2AgaGVhcCB0byBjbGVhbiBpdHNlbGYgdXAgYW5kIHJldHVybiB1bnVzZWQgYmxvY2tzIHRvCiAgICB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gIE9uIGZhaWx1cmUsIHRoaXMgcmFpc2VzIDpleGM6YElPRXJyb3JgLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvbXVsdGlwcm9jZXNzaW5nLnJzdCBiL0RvYy9saWJyYXJ5L211bHRpcHJvY2Vzc2luZy5yc3QKaW5kZXggNDU0NzAwYi4uODg2YjE3MyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvbXVsdGlwcm9jZXNzaW5nLnJzdAorKysgYi9Eb2MvbGlicmFyeS9tdWx0aXByb2Nlc3NpbmcucnN0CkBAIC04MSw3ICs4MSw4IEBACiAgICAgZGVmIGluZm8odGl0bGUpOgogICAgICAgICBwcmludCB0aXRsZQogICAgICAgICBwcmludCAnbW9kdWxlIG5hbWU6JywgX19uYW1lX18KLSAgICAgICAgcHJpbnQgJ3BhcmVudCBwcm9jZXNzOicsIG9zLmdldHBwaWQoKQorICAgICAgICBpZiBoYXNhdHRyKG9zLCAnZ2V0cHBpZCcpOiAgIyBvbmx5IGF2YWlsYWJsZSBvbiBVbml4CisgICAgICAgICAgICBwcmludCAncGFyZW50IHByb2Nlc3M6Jywgb3MuZ2V0cHBpZCgpCiAgICAgICAgIHByaW50ICdwcm9jZXNzIGlkOicsIG9zLmdldHBpZCgpCiAKICAgICBkZWYgZihuYW1lKToKQEAgLTEwNyw3ICsxMDgsNyBAQAogCiAqKlF1ZXVlcyoqCiAKLSAgIFRoZSA6Y2xhc3M6YFF1ZXVlYCBjbGFzcyBpcyBhIG5lYXIgY2xvbmUgb2YgOmNsYXNzOmBRdWV1ZS5RdWV1ZWAuICBGb3IKKyAgIFRoZSA6Y2xhc3M6YH5tdWx0aXByb2Nlc3NpbmcuUXVldWVgIGNsYXNzIGlzIGEgbmVhciBjbG9uZSBvZiA6Y2xhc3M6YFF1ZXVlLlF1ZXVlYC4gIEZvcgogICAgZXhhbXBsZTo6CiAKICAgICAgIGZyb20gbXVsdGlwcm9jZXNzaW5nIGltcG9ydCBQcm9jZXNzLCBRdWV1ZQpAQCAtMjMxLDcgKzIzMiw3IEBACiAgICBBIG1hbmFnZXIgcmV0dXJuZWQgYnkgOmZ1bmM6YE1hbmFnZXJgIHdpbGwgc3VwcG9ydCB0eXBlcyA6Y2xhc3M6YGxpc3RgLAogICAgOmNsYXNzOmBkaWN0YCwgOmNsYXNzOmBOYW1lc3BhY2VgLCA6Y2xhc3M6YExvY2tgLCA6Y2xhc3M6YFJMb2NrYCwKICAgIDpjbGFzczpgU2VtYXBob3JlYCwgOmNsYXNzOmBCb3VuZGVkU2VtYXBob3JlYCwgOmNsYXNzOmBDb25kaXRpb25gLAotICAgOmNsYXNzOmBFdmVudGAsIDpjbGFzczpgUXVldWVgLCA6Y2xhc3M6YFZhbHVlYCBhbmQgOmNsYXNzOmBBcnJheWAuICBGb3IKKyAgIDpjbGFzczpgRXZlbnRgLCA6Y2xhc3M6YH5tdWx0aXByb2Nlc3NpbmcuUXVldWVgLCA6Y2xhc3M6YFZhbHVlYCBhbmQgOmNsYXNzOmBBcnJheWAuICBGb3IKICAgIGV4YW1wbGUsIDo6CiAKICAgICAgIGZyb20gbXVsdGlwcm9jZXNzaW5nIGltcG9ydCBQcm9jZXNzLCBNYW5hZ2VyCkBAIC0yODIsMTAgKzI4MywxMyBAQAogCiAgICBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgICAgIHBvb2wgPSBQb29sKHByb2Nlc3Nlcz00KSAgICAgICAgICAgICAgIyBzdGFydCA0IHdvcmtlciBwcm9jZXNzZXMKLSAgICAgICByZXN1bHQgPSBwb29sLmFwcGx5X2FzeW5jKGYsIFsxMF0pICAgICAjIGV2YWx1YXRlICJmKDEwKSIgYXN5bmNocm9ub3VzbHkKKyAgICAgICByZXN1bHQgPSBwb29sLmFwcGx5X2FzeW5jKGYsIFsxMF0pICAgICMgZXZhbHVhdGUgImYoMTApIiBhc3luY2hyb25vdXNseQogICAgICAgIHByaW50IHJlc3VsdC5nZXQodGltZW91dD0xKSAgICAgICAgICAgIyBwcmludHMgIjEwMCIgdW5sZXNzIHlvdXIgY29tcHV0ZXIgaXMgKnZlcnkqIHNsb3cKICAgICAgICBwcmludCBwb29sLm1hcChmLCByYW5nZSgxMCkpICAgICAgICAgICMgcHJpbnRzICJbMCwgMSwgNCwuLi4sIDgxXSIKIAorTm90ZSB0aGF0IHRoZSBtZXRob2RzIG9mIGEgcG9vbCBzaG91bGQgb25seSBldmVyIGJlIHVzZWQgYnkgdGhlCitwcm9jZXNzIHdoaWNoIGNyZWF0ZWQgaXQuCisKIAogUmVmZXJlbmNlCiAtLS0tLS0tLS0KQEAgLTI5Nyw3ICszMDEsNyBAQAogOmNsYXNzOmBQcm9jZXNzYCBhbmQgZXhjZXB0aW9ucwogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogCi0uLiBjbGFzczo6IFByb2Nlc3MoW2dyb3VwWywgdGFyZ2V0WywgbmFtZVssIGFyZ3NbLCBrd2FyZ3NdXV1dXSkKKy4uIGNsYXNzOjogUHJvY2Vzcyhncm91cD1Ob25lLCB0YXJnZXQ9Tm9uZSwgbmFtZT1Ob25lLCBhcmdzPSgpLCBrd2FyZ3M9e30pCiAKICAgIFByb2Nlc3Mgb2JqZWN0cyByZXByZXNlbnQgYWN0aXZpdHkgdGhhdCBpcyBydW4gaW4gYSBzZXBhcmF0ZSBwcm9jZXNzLiBUaGUKICAgIDpjbGFzczpgUHJvY2Vzc2AgY2xhc3MgaGFzIGVxdWl2YWxlbnRzIG9mIGFsbCB0aGUgbWV0aG9kcyBvZgpAQCAtMzc4LDcgKzM4Miw3IEBACiAgICAgICBVbml4IGRhZW1vbnMgb3Igc2VydmljZXMsIHRoZXkgYXJlIG5vcm1hbCBwcm9jZXNzZXMgdGhhdCB3aWxsIGJlCiAgICAgICB0ZXJtaW5hdGVkIChhbmQgbm90IGpvaW5lZCkgaWYgbm9uLWRhZW1vbmljIHByb2Nlc3NlcyBoYXZlIGV4aXRlZC4KIAotICAgSW4gYWRkaXRpb24gdG8gdGhlICA6Y2xhc3M6YFRocmVhZGluZy5UaHJlYWRgIEFQSSwgOmNsYXNzOmBQcm9jZXNzYCBvYmplY3RzCisgICBJbiBhZGRpdGlvbiB0byB0aGUgIDpjbGFzczpgdGhyZWFkaW5nLlRocmVhZGAgQVBJLCA6Y2xhc3M6YFByb2Nlc3NgIG9iamVjdHMKICAgIGFsc28gc3VwcG9ydCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYW5kIG1ldGhvZHM6CiAKICAgIC4uIGF0dHJpYnV0ZTo6IHBpZApAQCAtMzk3LDcgKzQwMSw3IEBACiAgICAgICBUaGUgcHJvY2VzcydzIGF1dGhlbnRpY2F0aW9uIGtleSAoYSBieXRlIHN0cmluZykuCiAKICAgICAgIFdoZW4gOm1vZDpgbXVsdGlwcm9jZXNzaW5nYCBpcyBpbml0aWFsaXplZCB0aGUgbWFpbiBwcm9jZXNzIGlzIGFzc2lnbmVkIGEKLSAgICAgIHJhbmRvbSBzdHJpbmcgdXNpbmcgOmZ1bmM6YG9zLnJhbmRvbWAuCisgICAgICByYW5kb20gc3RyaW5nIHVzaW5nIDpmdW5jOmBvcy51cmFuZG9tYC4KIAogICAgICAgV2hlbiBhIDpjbGFzczpgUHJvY2Vzc2Agb2JqZWN0IGlzIGNyZWF0ZWQsIGl0IHdpbGwgaW5oZXJpdCB0aGUKICAgICAgIGF1dGhlbnRpY2F0aW9uIGtleSBvZiBpdHMgcGFyZW50IHByb2Nlc3MsIGFsdGhvdWdoIHRoaXMgbWF5IGJlIGNoYW5nZWQgYnkKQEAgLTQwOCw3ICs0MTIsNyBAQAogICAgLi4gbWV0aG9kOjogdGVybWluYXRlKCkKIAogICAgICAgVGVybWluYXRlIHRoZSBwcm9jZXNzLiAgT24gVW5peCB0aGlzIGlzIGRvbmUgdXNpbmcgdGhlIGBgU0lHVEVSTWBgIHNpZ25hbDsKLSAgICAgIG9uIFdpbmRvd3MgOmNmdW5jOmBUZXJtaW5hdGVQcm9jZXNzYCBpcyB1c2VkLiAgTm90ZSB0aGF0IGV4aXQgaGFuZGxlcnMgYW5kCisgICAgICBvbiBXaW5kb3dzIDpjOmZ1bmM6YFRlcm1pbmF0ZVByb2Nlc3NgIGlzIHVzZWQuICBOb3RlIHRoYXQgZXhpdCBoYW5kbGVycyBhbmQKICAgICAgIGZpbmFsbHkgY2xhdXNlcywgZXRjLiwgd2lsbCBub3QgYmUgZXhlY3V0ZWQuCiAKICAgICAgIE5vdGUgdGhhdCBkZXNjZW5kYW50IHByb2Nlc3NlcyBvZiB0aGUgcHJvY2VzcyB3aWxsICpub3QqIGJlIHRlcm1pbmF0ZWQgLS0KQEAgLTQyMiw5ICs0MjYsOSBAQAogICAgICAgICAgYWNxdWlyZWQgYSBsb2NrIG9yIHNlbWFwaG9yZSBldGMuIHRoZW4gdGVybWluYXRpbmcgaXQgaXMgbGlhYmxlIHRvCiAgICAgICAgICBjYXVzZSBvdGhlciBwcm9jZXNzZXMgdG8gZGVhZGxvY2suCiAKLSAgIE5vdGUgdGhhdCB0aGUgOm1ldGg6YHN0YXJ0YCwgOm1ldGg6YGpvaW5gLCA6bWV0aDpgaXNfYWxpdmVgIGFuZAotICAgOmF0dHI6YGV4aXRfY29kZWAgbWV0aG9kcyBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgdGhlIHByb2Nlc3MgdGhhdCBjcmVhdGVkCi0gICB0aGUgcHJvY2VzcyBvYmplY3QuCisgICBOb3RlIHRoYXQgdGhlIDptZXRoOmBzdGFydGAsIDptZXRoOmBqb2luYCwgOm1ldGg6YGlzX2FsaXZlYCwKKyAgIDptZXRoOmB0ZXJtaW5hdGVgIGFuZCA6YXR0cjpgZXhpdGNvZGVgIG1ldGhvZHMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5CisgICB0aGUgcHJvY2VzcyB0aGF0IGNyZWF0ZWQgdGhlIHByb2Nlc3Mgb2JqZWN0LgogCiAgICBFeGFtcGxlIHVzYWdlIG9mIHNvbWUgb2YgdGhlIG1ldGhvZHMgb2YgOmNsYXNzOmBQcm9jZXNzYDoKIApAQCAtNDY0LDE1ICs0NjgsMTUgQEAKIEZvciBwYXNzaW5nIG1lc3NhZ2VzIG9uZSBjYW4gdXNlIDpmdW5jOmBQaXBlYCAoZm9yIGEgY29ubmVjdGlvbiBiZXR3ZWVuIHR3bwogcHJvY2Vzc2VzKSBvciBhIHF1ZXVlICh3aGljaCBhbGxvd3MgbXVsdGlwbGUgcHJvZHVjZXJzIGFuZCBjb25zdW1lcnMpLgogCi1UaGUgOmNsYXNzOmBRdWV1ZWAgYW5kIDpjbGFzczpgSm9pbmFibGVRdWV1ZWAgdHlwZXMgYXJlIG11bHRpLXByb2R1Y2VyLAorVGhlIDpjbGFzczpgfm11bHRpcHJvY2Vzc2luZy5RdWV1ZWAsIDpjbGFzczpgbXVsdGlwcm9jZXNzaW5nLnF1ZXVlcy5TaW1wbGVRdWV1ZWAgYW5kIDpjbGFzczpgSm9pbmFibGVRdWV1ZWAgdHlwZXMgYXJlIG11bHRpLXByb2R1Y2VyLAogbXVsdGktY29uc3VtZXIgRklGTyBxdWV1ZXMgbW9kZWxsZWQgb24gdGhlIDpjbGFzczpgUXVldWUuUXVldWVgIGNsYXNzIGluIHRoZQotc3RhbmRhcmQgbGlicmFyeS4gIFRoZXkgZGlmZmVyIGluIHRoYXQgOmNsYXNzOmBRdWV1ZWAgbGFja3MgdGhlCitzdGFuZGFyZCBsaWJyYXJ5LiAgVGhleSBkaWZmZXIgaW4gdGhhdCA6Y2xhc3M6YH5tdWx0aXByb2Nlc3NpbmcuUXVldWVgIGxhY2tzIHRoZQogOm1ldGg6YH5RdWV1ZS5RdWV1ZS50YXNrX2RvbmVgIGFuZCA6bWV0aDpgflF1ZXVlLlF1ZXVlLmpvaW5gIG1ldGhvZHMgaW50cm9kdWNlZAogaW50byBQeXRob24gMi41J3MgOmNsYXNzOmBRdWV1ZS5RdWV1ZWAgY2xhc3MuCiAKIElmIHlvdSB1c2UgOmNsYXNzOmBKb2luYWJsZVF1ZXVlYCB0aGVuIHlvdSAqKm11c3QqKiBjYWxsCiA6bWV0aDpgSm9pbmFibGVRdWV1ZS50YXNrX2RvbmVgIGZvciBlYWNoIHRhc2sgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSBvciBlbHNlIHRoZQotc2VtYXBob3JlIHVzZWQgdG8gY291bnQgdGhlIG51bWJlciBvZiB1bmZpbmlzaGVkIHRhc2tzIG1heSBldmVudHVhbGx5IG92ZXJmbG93CitzZW1hcGhvcmUgdXNlZCB0byBjb3VudCB0aGUgbnVtYmVyIG9mIHVuZmluaXNoZWQgdGFza3MgbWF5IGV2ZW50dWFsbHkgb3ZlcmZsb3csCiByYWlzaW5nIGFuIGV4Y2VwdGlvbi4KIAogTm90ZSB0aGF0IG9uZSBjYW4gYWxzbyBjcmVhdGUgYSBzaGFyZWQgcXVldWUgYnkgdXNpbmcgYSBtYW5hZ2VyIG9iamVjdCAtLSBzZWUKQEAgLTQ4NSwxOCArNDg5LDM3IEBACiAgICB0aGUgOm1vZDpgbXVsdGlwcm9jZXNzaW5nYCBuYW1lc3BhY2Ugc28geW91IG5lZWQgdG8gaW1wb3J0IHRoZW0gZnJvbQogICAgOm1vZDpgUXVldWVgLgogCisuLiBub3RlOjoKKworICAgV2hlbiBhbiBvYmplY3QgaXMgcHV0IG9uIGEgcXVldWUsIHRoZSBvYmplY3QgaXMgcGlja2xlZCBhbmQgYQorICAgYmFja2dyb3VuZCB0aHJlYWQgbGF0ZXIgZmx1c2hlcyB0aGUgcGlja2xlZCBkYXRhIHRvIGFuIHVuZGVybHlpbmcKKyAgIHBpcGUuICBUaGlzIGhhcyBzb21lIGNvbnNlcXVlbmNlcyB3aGljaCBhcmUgYSBsaXR0bGUgc3VycHJpc2luZywKKyAgIGJ1dCBzaG91bGQgbm90IGNhdXNlIGFueSBwcmFjdGljYWwgZGlmZmljdWx0aWVzIC0tIGlmIHRoZXkgcmVhbGx5CisgICBib3RoZXIgeW91IHRoZW4geW91IGNhbiBpbnN0ZWFkIHVzZSBhIHF1ZXVlIGNyZWF0ZWQgd2l0aCBhCisgICA6cmVmOmBtYW5hZ2VyIDxtdWx0aXByb2Nlc3NpbmctbWFuYWdlcnM+YC4KKworICAgKDEpIEFmdGVyIHB1dHRpbmcgYW4gb2JqZWN0IG9uIGFuIGVtcHR5IHF1ZXVlIHRoZXJlIG1heSBiZSBhbgorICAgICAgIGluZmluaXRlc2ltYWwgZGVsYXkgYmVmb3JlIHRoZSBxdWV1ZSdzIDptZXRoOmB+UXVldWUuZW1wdHlgCisgICAgICAgbWV0aG9kIHJldHVybnMgOmNvbnN0OmBGYWxzZWAgYW5kIDptZXRoOmB+UXVldWUuZ2V0X25vd2FpdGAgY2FuCisgICAgICAgcmV0dXJuIHdpdGhvdXQgcmFpc2luZyA6ZXhjOmBRdWV1ZS5FbXB0eWAuCisKKyAgICgyKSBJZiBtdWx0aXBsZSBwcm9jZXNzZXMgYXJlIGVucXVldWluZyBvYmplY3RzLCBpdCBpcyBwb3NzaWJsZSBmb3IKKyAgICAgICB0aGUgb2JqZWN0cyB0byBiZSByZWNlaXZlZCBhdCB0aGUgb3RoZXIgZW5kIG91dC1vZi1vcmRlci4KKyAgICAgICBIb3dldmVyLCBvYmplY3RzIGVucXVldWVkIGJ5IHRoZSBzYW1lIHByb2Nlc3Mgd2lsbCBhbHdheXMgYmUgaW4KKyAgICAgICB0aGUgZXhwZWN0ZWQgb3JkZXIgd2l0aCByZXNwZWN0IHRvIGVhY2ggb3RoZXIuCiAKIC4uIHdhcm5pbmc6OgogCiAgICBJZiBhIHByb2Nlc3MgaXMga2lsbGVkIHVzaW5nIDptZXRoOmBQcm9jZXNzLnRlcm1pbmF0ZWAgb3IgOmZ1bmM6YG9zLmtpbGxgCi0gICB3aGlsZSBpdCBpcyB0cnlpbmcgdG8gdXNlIGEgOmNsYXNzOmBRdWV1ZWAsIHRoZW4gdGhlIGRhdGEgaW4gdGhlIHF1ZXVlIGlzCi0gICBsaWtlbHkgdG8gYmVjb21lIGNvcnJ1cHRlZC4gIFRoaXMgbWF5IGNhdXNlIGFueSBvdGhlciBwcm9jZXNzZXMgdG8gZ2V0IGFuCisgICB3aGlsZSBpdCBpcyB0cnlpbmcgdG8gdXNlIGEgOmNsYXNzOmB+bXVsdGlwcm9jZXNzaW5nLlF1ZXVlYCwgdGhlbiB0aGUgZGF0YSBpbiB0aGUgcXVldWUgaXMKKyAgIGxpa2VseSB0byBiZWNvbWUgY29ycnVwdGVkLiAgVGhpcyBtYXkgY2F1c2UgYW55IG90aGVyIHByb2Nlc3MgdG8gZ2V0IGFuCiAgICBleGNlcHRpb24gd2hlbiBpdCB0cmllcyB0byB1c2UgdGhlIHF1ZXVlIGxhdGVyIG9uLgogCiAuLiB3YXJuaW5nOjoKIAogICAgQXMgbWVudGlvbmVkIGFib3ZlLCBpZiBhIGNoaWxkIHByb2Nlc3MgaGFzIHB1dCBpdGVtcyBvbiBhIHF1ZXVlIChhbmQgaXQgaGFzCi0gICBub3QgdXNlZCA6bWV0aDpgSm9pbmFibGVRdWV1ZS5jYW5jZWxfam9pbl90aHJlYWRgKSwgdGhlbiB0aGF0IHByb2Nlc3Mgd2lsbAorICAgbm90IHVzZWQgOm1ldGg6YEpvaW5hYmxlUXVldWUuY2FuY2VsX2pvaW5fdGhyZWFkCisgICA8bXVsdGlwcm9jZXNzaW5nLlF1ZXVlLmNhbmNlbF9qb2luX3RocmVhZD5gKSwgdGhlbiB0aGF0IHByb2Nlc3Mgd2lsbAogICAgbm90IHRlcm1pbmF0ZSB1bnRpbCBhbGwgYnVmZmVyZWQgaXRlbXMgaGF2ZSBiZWVuIGZsdXNoZWQgdG8gdGhlIHBpcGUuCiAKICAgIFRoaXMgbWVhbnMgdGhhdCBpZiB5b3UgdHJ5IGpvaW5pbmcgdGhhdCBwcm9jZXNzIHlvdSBtYXkgZ2V0IGEgZGVhZGxvY2sgdW5sZXNzCkBAIC01MzEsNyArNTU0LDcgQEAKICAgIFRoZSB1c3VhbCA6ZXhjOmBRdWV1ZS5FbXB0eWAgYW5kIDpleGM6YFF1ZXVlLkZ1bGxgIGV4Y2VwdGlvbnMgZnJvbSB0aGUKICAgIHN0YW5kYXJkIGxpYnJhcnkncyA6bW9kOmBRdWV1ZWAgbW9kdWxlIGFyZSByYWlzZWQgdG8gc2lnbmFsIHRpbWVvdXRzLgogCi0gICA6Y2xhc3M6YFF1ZXVlYCBpbXBsZW1lbnRzIGFsbCB0aGUgbWV0aG9kcyBvZiA6Y2xhc3M6YFF1ZXVlLlF1ZXVlYCBleGNlcHQgZm9yCisgICA6Y2xhc3M6YH5tdWx0aXByb2Nlc3NpbmcuUXVldWVgIGltcGxlbWVudHMgYWxsIHRoZSBtZXRob2RzIG9mIDpjbGFzczpgUXVldWUuUXVldWVgIGV4Y2VwdCBmb3IKICAgIDptZXRoOmB+UXVldWUuUXVldWUudGFza19kb25lYCBhbmQgOm1ldGg6YH5RdWV1ZS5RdWV1ZS5qb2luYC4KIAogICAgLi4gbWV0aG9kOjogcXNpemUoKQpAQCAtNTc4LDExICs2MDEsMTAgQEAKICAgICAgIDpleGM6YFF1ZXVlLkVtcHR5YCBleGNlcHRpb24gKCp0aW1lb3V0KiBpcyBpZ25vcmVkIGluIHRoYXQgY2FzZSkuCiAKICAgIC4uIG1ldGhvZDo6IGdldF9ub3dhaXQoKQotICAgICAgICAgICAgICAgZ2V0X25vX3dhaXQoKQogCiAgICAgICBFcXVpdmFsZW50IHRvIGBgZ2V0KEZhbHNlKWBgLgogCi0gICA6Y2xhc3M6YG11bHRpcHJvY2Vzc2luZy5RdWV1ZWAgaGFzIGEgZmV3IGFkZGl0aW9uYWwgbWV0aG9kcyBub3QgZm91bmQgaW4KKyAgIDpjbGFzczpgfm11bHRpcHJvY2Vzc2luZy5RdWV1ZWAgaGFzIGEgZmV3IGFkZGl0aW9uYWwgbWV0aG9kcyBub3QgZm91bmQgaW4KICAgIDpjbGFzczpgUXVldWUuUXVldWVgLiAgVGhlc2UgbWV0aG9kcyBhcmUgdXN1YWxseSB1bm5lY2Vzc2FyeSBmb3IgbW9zdAogICAgY29kZToKIApAQCAtNjA5LDEwICs2MzEsMzQgQEAKICAgICAgIHRoZSBiYWNrZ3JvdW5kIHRocmVhZCBmcm9tIGJlaW5nIGpvaW5lZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHByb2Nlc3MKICAgICAgIGV4aXRzIC0tIHNlZSA6bWV0aDpgam9pbl90aHJlYWRgLgogCisgICAgICBBIGJldHRlciBuYW1lIGZvciB0aGlzIG1ldGhvZCBtaWdodCBiZQorICAgICAgYGBhbGxvd19leGl0X3dpdGhvdXRfZmx1c2goKWBgLiAgSXQgaXMgbGlrZWx5IHRvIGNhdXNlIGVucXVldWVkCisgICAgICBkYXRhIHRvIGxvc3QsIGFuZCB5b3UgYWxtb3N0IGNlcnRhaW5seSB3aWxsIG5vdCBuZWVkIHRvIHVzZSBpdC4KKyAgICAgIEl0IGlzIHJlYWxseSBvbmx5IHRoZXJlIGlmIHlvdSBuZWVkIHRoZSBjdXJyZW50IHByb2Nlc3MgdG8gZXhpdAorICAgICAgaW1tZWRpYXRlbHkgd2l0aG91dCB3YWl0aW5nIHRvIGZsdXNoIGVucXVldWVkIGRhdGEgdG8gdGhlCisgICAgICB1bmRlcmx5aW5nIHBpcGUsIGFuZCB5b3UgZG9uJ3QgY2FyZSBhYm91dCBsb3N0IGRhdGEuCisKKworLi4gY2xhc3M6OiBtdWx0aXByb2Nlc3NpbmcucXVldWVzLlNpbXBsZVF1ZXVlKCkKKworICAgSXQgaXMgYSBzaW1wbGlmaWVkIDpjbGFzczpgfm11bHRpcHJvY2Vzc2luZy5RdWV1ZWAgdHlwZSwgdmVyeSBjbG9zZSB0byBhIGxvY2tlZCA6Y2xhc3M6YFBpcGVgLgorCisgICAuLiBtZXRob2Q6OiBlbXB0eSgpCisKKyAgICAgIFJldHVybiBgYFRydWVgYCBpZiB0aGUgcXVldWUgaXMgZW1wdHksIGBgRmFsc2VgYCBvdGhlcndpc2UuCisKKyAgIC4uIG1ldGhvZDo6IGdldCgpCisKKyAgICAgIFJlbW92ZSBhbmQgcmV0dXJuIGFuIGl0ZW0gZnJvbSB0aGUgcXVldWUuCisKKyAgIC4uIG1ldGhvZDo6IHB1dChpdGVtKQorCisgICAgICBQdXQgKml0ZW0qIGludG8gdGhlIHF1ZXVlLgorCiAKIC4uIGNsYXNzOjogSm9pbmFibGVRdWV1ZShbbWF4c2l6ZV0pCiAKLSAgIDpjbGFzczpgSm9pbmFibGVRdWV1ZWAsIGEgOmNsYXNzOmBRdWV1ZWAgc3ViY2xhc3MsIGlzIGEgcXVldWUgd2hpY2gKKyAgIDpjbGFzczpgSm9pbmFibGVRdWV1ZWAsIGEgOmNsYXNzOmB+bXVsdGlwcm9jZXNzaW5nLlF1ZXVlYCBzdWJjbGFzcywgaXMgYSBxdWV1ZSB3aGljaAogICAgYWRkaXRpb25hbGx5IGhhcyA6bWV0aDpgdGFza19kb25lYCBhbmQgOm1ldGg6YGpvaW5gIG1ldGhvZHMuCiAKICAgIC4uIG1ldGhvZDo6IHRhc2tfZG9uZSgpCkBAIC02MjIsNyArNjY4LDcgQEAKICAgICAgIGNhbGwgdG8gOm1ldGg6YHRhc2tfZG9uZWAgdGVsbHMgdGhlIHF1ZXVlIHRoYXQgdGhlIHByb2Nlc3Npbmcgb24gdGhlIHRhc2sKICAgICAgIGlzIGNvbXBsZXRlLgogCi0gICAgICBJZiBhIDptZXRoOmB+UXVldWUuam9pbmAgaXMgY3VycmVudGx5IGJsb2NraW5nLCBpdCB3aWxsIHJlc3VtZSB3aGVuIGFsbAorICAgICAgSWYgYSA6bWV0aDpgflF1ZXVlLlF1ZXVlLmpvaW5gIGlzIGN1cnJlbnRseSBibG9ja2luZywgaXQgd2lsbCByZXN1bWUgd2hlbiBhbGwKICAgICAgIGl0ZW1zIGhhdmUgYmVlbiBwcm9jZXNzZWQgKG1lYW5pbmcgdGhhdCBhIDptZXRoOmB0YXNrX2RvbmVgIGNhbGwgd2FzCiAgICAgICByZWNlaXZlZCBmb3IgZXZlcnkgaXRlbSB0aGF0IGhhZCBiZWVuIDptZXRoOmB+UXVldWUucHV0YCBpbnRvIHRoZSBxdWV1ZSkuCiAKQEAgLTYzOCw3ICs2ODQsNyBAQAogICAgICAgcXVldWUuICBUaGUgY291bnQgZ29lcyBkb3duIHdoZW5ldmVyIGEgY29uc3VtZXIgdGhyZWFkIGNhbGxzCiAgICAgICA6bWV0aDpgdGFza19kb25lYCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBpdGVtIHdhcyByZXRyaWV2ZWQgYW5kIGFsbCB3b3JrIG9uCiAgICAgICBpdCBpcyBjb21wbGV0ZS4gIFdoZW4gdGhlIGNvdW50IG9mIHVuZmluaXNoZWQgdGFza3MgZHJvcHMgdG8gemVybywKLSAgICAgIDptZXRoOmB+UXVldWUuam9pbmAgdW5ibG9ja3MuCisgICAgICA6bWV0aDpgflF1ZXVlLlF1ZXVlLmpvaW5gIHVuYmxvY2tzLgogCiAKIE1pc2NlbGxhbmVvdXMKQEAgLTY5Miw3ICs3MzgsNyBAQAogICAgKEJ5IGRlZmF1bHQgOmRhdGE6YHN5cy5leGVjdXRhYmxlYCBpcyB1c2VkKS4gIEVtYmVkZGVycyB3aWxsIHByb2JhYmx5IG5lZWQgdG8KICAgIGRvIHNvbWUgdGhpbmcgbGlrZSA6OgogCi0gICAgICBzZXRFeGVjdXRhYmxlKG9zLnBhdGguam9pbihzeXMuZXhlY19wcmVmaXgsICdweXRob253LmV4ZScpKQorICAgICAgc2V0X2V4ZWN1dGFibGUob3MucGF0aC5qb2luKHN5cy5leGVjX3ByZWZpeCwgJ3B5dGhvbncuZXhlJykpCiAKICAgIGJlZm9yZSB0aGV5IGNhbiBjcmVhdGUgY2hpbGQgcHJvY2Vzc2VzLiAgKFdpbmRvd3Mgb25seSkKIApAQCAtNzExLDcgKzc1Nyw3IEBACiBDb25uZWN0aW9uIG9iamVjdHMgYWxsb3cgdGhlIHNlbmRpbmcgYW5kIHJlY2VpdmluZyBvZiBwaWNrbGFibGUgb2JqZWN0cyBvcgogc3RyaW5ncy4gIFRoZXkgY2FuIGJlIHRob3VnaHQgb2YgYXMgbWVzc2FnZSBvcmllbnRlZCBjb25uZWN0ZWQgc29ja2V0cy4KIAotQ29ubmVjdGlvbiBvYmplY3RzIHVzdWFsbHkgY3JlYXRlZCB1c2luZyA6ZnVuYzpgUGlwZWAgLS0gc2VlIGFsc28KK0Nvbm5lY3Rpb24gb2JqZWN0cyBhcmUgdXN1YWxseSBjcmVhdGVkIHVzaW5nIDpmdW5jOmBQaXBlYCAtLSBzZWUgYWxzbwogOnJlZjpgbXVsdGlwcm9jZXNzaW5nLWxpc3RlbmVycy1jbGllbnRzYC4KIAogLi4gY2xhc3M6OiBDb25uZWN0aW9uCkBAIC03MjIsMTcgKzc2OCwxOCBAQAogICAgICAgdXNpbmcgOm1ldGg6YHJlY3ZgLgogCiAgICAgICBUaGUgb2JqZWN0IG11c3QgYmUgcGlja2xhYmxlLiAgVmVyeSBsYXJnZSBwaWNrbGVzIChhcHByb3hpbWF0ZWx5IDMyIE1CKywKLSAgICAgIHRob3VnaCBpdCBkZXBlbmRzIG9uIHRoZSBPUykgbWF5IHJhaXNlIGEgVmFsdWVFcnJvciBleGNlcHRpb24uCisgICAgICB0aG91Z2ggaXQgZGVwZW5kcyBvbiB0aGUgT1MpIG1heSByYWlzZSBhIDpleGM6YFZhbHVlRXJyb3JgIGV4Y2VwdGlvbi4KIAogICAgLi4gbWV0aG9kOjogcmVjdigpCiAKICAgICAgIFJldHVybiBhbiBvYmplY3Qgc2VudCBmcm9tIHRoZSBvdGhlciBlbmQgb2YgdGhlIGNvbm5lY3Rpb24gdXNpbmcKLSAgICAgIDptZXRoOmBzZW5kYC4gIFJhaXNlcyA6ZXhjOmBFT0ZFcnJvcmAgaWYgdGhlcmUgaXMgbm90aGluZyBsZWZ0IHRvIHJlY2VpdmUKKyAgICAgIDptZXRoOmBzZW5kYC4gIEJsb2NrcyB1bnRpbCB0aGVyZSBpdHMgc29tZXRoaW5nIHRvIHJlY2VpdmUuICBSYWlzZXMKKyAgICAgIDpleGM6YEVPRkVycm9yYCBpZiB0aGVyZSBpcyBub3RoaW5nIGxlZnQgdG8gcmVjZWl2ZQogICAgICAgYW5kIHRoZSBvdGhlciBlbmQgd2FzIGNsb3NlZC4KIAogICAgLi4gbWV0aG9kOjogZmlsZW5vKCkKIAotICAgICAgUmV0dXJucyB0aGUgZmlsZSBkZXNjcmlwdG9yIG9yIGhhbmRsZSB1c2VkIGJ5IHRoZSBjb25uZWN0aW9uLgorICAgICAgUmV0dXJuIHRoZSBmaWxlIGRlc2NyaXB0b3Igb3IgaGFuZGxlIHVzZWQgYnkgdGhlIGNvbm5lY3Rpb24uCiAKICAgIC4uIG1ldGhvZDo6IGNsb3NlKCkKIApAQCAtNzU2LDEyICs4MDMsMTMgQEAKICAgICAgIElmICpvZmZzZXQqIGlzIGdpdmVuIHRoZW4gZGF0YSBpcyByZWFkIGZyb20gdGhhdCBwb3NpdGlvbiBpbiAqYnVmZmVyKi4gIElmCiAgICAgICAqc2l6ZSogaXMgZ2l2ZW4gdGhlbiB0aGF0IG1hbnkgYnl0ZXMgd2lsbCBiZSByZWFkIGZyb20gYnVmZmVyLiAgVmVyeSBsYXJnZQogICAgICAgYnVmZmVycyAoYXBwcm94aW1hdGVseSAzMiBNQissIHRob3VnaCBpdCBkZXBlbmRzIG9uIHRoZSBPUykgbWF5IHJhaXNlIGEKLSAgICAgIFZhbHVlRXJyb3IgZXhjZXB0aW9uCisgICAgICA6ZXhjOmBWYWx1ZUVycm9yYCBleGNlcHRpb24KIAogICAgLi4gbWV0aG9kOjogcmVjdl9ieXRlcyhbbWF4bGVuZ3RoXSkKIAogICAgICAgUmV0dXJuIGEgY29tcGxldGUgbWVzc2FnZSBvZiBieXRlIGRhdGEgc2VudCBmcm9tIHRoZSBvdGhlciBlbmQgb2YgdGhlCi0gICAgICBjb25uZWN0aW9uIGFzIGEgc3RyaW5nLiAgUmFpc2VzIDpleGM6YEVPRkVycm9yYCBpZiB0aGVyZSBpcyBub3RoaW5nIGxlZnQKKyAgICAgIGNvbm5lY3Rpb24gYXMgYSBzdHJpbmcuICBCbG9ja3MgdW50aWwgdGhlcmUgaXMgc29tZXRoaW5nIHRvIHJlY2VpdmUuCisgICAgICBSYWlzZXMgOmV4YzpgRU9GRXJyb3JgIGlmIHRoZXJlIGlzIG5vdGhpbmcgbGVmdAogICAgICAgdG8gcmVjZWl2ZSBhbmQgdGhlIG90aGVyIGVuZCBoYXMgY2xvc2VkLgogCiAgICAgICBJZiAqbWF4bGVuZ3RoKiBpcyBzcGVjaWZpZWQgYW5kIHRoZSBtZXNzYWdlIGlzIGxvbmdlciB0aGFuICptYXhsZW5ndGgqCkBAIC03NzEsNyArODE5LDggQEAKICAgIC4uIG1ldGhvZDo6IHJlY3ZfYnl0ZXNfaW50byhidWZmZXJbLCBvZmZzZXRdKQogCiAgICAgICBSZWFkIGludG8gKmJ1ZmZlciogYSBjb21wbGV0ZSBtZXNzYWdlIG9mIGJ5dGUgZGF0YSBzZW50IGZyb20gdGhlIG90aGVyIGVuZAotICAgICAgb2YgdGhlIGNvbm5lY3Rpb24gYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBtZXNzYWdlLiAgUmFpc2VzCisgICAgICBvZiB0aGUgY29ubmVjdGlvbiBhbmQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIG1lc3NhZ2UuICBCbG9ja3MKKyAgICAgIHVudGlsIHRoZXJlIGlzIHNvbWV0aGluZyB0byByZWNlaXZlLiAgUmFpc2VzCiAgICAgICA6ZXhjOmBFT0ZFcnJvcmAgaWYgdGhlcmUgaXMgbm90aGluZyBsZWZ0IHRvIHJlY2VpdmUgYW5kIHRoZSBvdGhlciBlbmQgd2FzCiAgICAgICBjbG9zZWQuCiAKQEAgLTkxMSwxMiArOTYwLDI0IEBACiAgICBjdHlwZXMgdHlwZSBvciBhIG9uZSBjaGFyYWN0ZXIgdHlwZWNvZGUgb2YgdGhlIGtpbmQgdXNlZCBieSB0aGUgOm1vZDpgYXJyYXlgCiAgICBtb2R1bGUuICAqXCphcmdzKiBpcyBwYXNzZWQgb24gdG8gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdHlwZS4KIAotICAgSWYgKmxvY2sqIGlzIGBgVHJ1ZWBgICh0aGUgZGVmYXVsdCkgdGhlbiBhIG5ldyBsb2NrIG9iamVjdCBpcyBjcmVhdGVkIHRvCi0gICBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gdGhlIHZhbHVlLiAgSWYgKmxvY2sqIGlzIGEgOmNsYXNzOmBMb2NrYCBvcgotICAgOmNsYXNzOmBSTG9ja2Agb2JqZWN0IHRoZW4gdGhhdCB3aWxsIGJlIHVzZWQgdG8gc3luY2hyb25pemUgYWNjZXNzIHRvIHRoZQotICAgdmFsdWUuICBJZiAqbG9jayogaXMgYGBGYWxzZWBgIHRoZW4gYWNjZXNzIHRvIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBub3QgYmUKLSAgIGF1dG9tYXRpY2FsbHkgcHJvdGVjdGVkIGJ5IGEgbG9jaywgc28gaXQgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUKLSAgICJwcm9jZXNzLXNhZmUiLgorICAgSWYgKmxvY2sqIGlzIGBgVHJ1ZWBgICh0aGUgZGVmYXVsdCkgdGhlbiBhIG5ldyByZWN1cnNpdmUgbG9jaworICAgb2JqZWN0IGlzIGNyZWF0ZWQgdG8gc3luY2hyb25pemUgYWNjZXNzIHRvIHRoZSB2YWx1ZS4gIElmICpsb2NrKiBpcworICAgYSA6Y2xhc3M6YExvY2tgIG9yIDpjbGFzczpgUkxvY2tgIG9iamVjdCB0aGVuIHRoYXQgd2lsbCBiZSB1c2VkIHRvCisgICBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gdGhlIHZhbHVlLiAgSWYgKmxvY2sqIGlzIGBgRmFsc2VgYCB0aGVuCisgICBhY2Nlc3MgdG8gdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIG5vdCBiZSBhdXRvbWF0aWNhbGx5IHByb3RlY3RlZAorICAgYnkgYSBsb2NrLCBzbyBpdCB3aWxsIG5vdCBuZWNlc3NhcmlseSBiZSAicHJvY2Vzcy1zYWZlIi4KKworICAgT3BlcmF0aW9ucyBsaWtlIGBgKz1gYCB3aGljaCBpbnZvbHZlIGEgcmVhZCBhbmQgd3JpdGUgYXJlIG5vdAorICAgYXRvbWljLiAgU28gaWYsIGZvciBpbnN0YW5jZSwgeW91IHdhbnQgdG8gYXRvbWljYWxseSBpbmNyZW1lbnQgYQorICAgc2hhcmVkIHZhbHVlIGl0IGlzIGluc3VmZmljaWVudCB0byBqdXN0IGRvIDo6CisKKyAgICAgICBjb3VudGVyLnZhbHVlICs9IDEKKworICAgQXNzdW1pbmcgdGhlIGFzc29jaWF0ZWQgbG9jayBpcyByZWN1cnNpdmUgKHdoaWNoIGl0IGlzIGJ5IGRlZmF1bHQpCisgICB5b3UgY2FuIGluc3RlYWQgZG8gOjoKKworICAgICAgIHdpdGggY291bnRlci5nZXRfbG9jaygpOgorICAgICAgICAgICBjb3VudGVyLnZhbHVlICs9IDEKIAogICAgTm90ZSB0aGF0ICpsb2NrKiBpcyBhIGtleXdvcmQtb25seSBhcmd1bWVudC4KIApAQCAtMTAwMSw4ICsxMDYyLDkgQEAKICAgIGFycmF5LgogCiAgICBJZiAqbG9jayogaXMgYGBUcnVlYGAgKHRoZSBkZWZhdWx0KSB0aGVuIGEgbmV3IGxvY2sgb2JqZWN0IGlzIGNyZWF0ZWQgdG8KLSAgIHN5bmNocm9uaXplIGFjY2VzcyB0byB0aGUgdmFsdWUuICBJZiAqbG9jayogaXMgYSA6Y2xhc3M6YExvY2tgIG9yCi0gICA6Y2xhc3M6YFJMb2NrYCBvYmplY3QgdGhlbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gdGhlCisgICBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gdGhlIHZhbHVlLiAgSWYgKmxvY2sqIGlzIGEKKyAgIDpjbGFzczpgfm11bHRpcHJvY2Vzc2luZy5Mb2NrYCBvciA6Y2xhc3M6YH5tdWx0aXByb2Nlc3NpbmcuUkxvY2tgIG9iamVjdAorICAgdGhlbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gdGhlCiAgICB2YWx1ZS4gIElmICpsb2NrKiBpcyBgYEZhbHNlYGAgdGhlbiBhY2Nlc3MgdG8gdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIG5vdCBiZQogICAgYXV0b21hdGljYWxseSBwcm90ZWN0ZWQgYnkgYSBsb2NrLCBzbyBpdCB3aWxsIG5vdCBuZWNlc3NhcmlseSBiZQogICAgInByb2Nlc3Mtc2FmZSIuCkBAIC0xMDE2LDggKzEwNzgsOCBAQAogICAgb2JqZWN0LgogCiAgICBJZiAqbG9jayogaXMgYGBUcnVlYGAgKHRoZSBkZWZhdWx0KSB0aGVuIGEgbmV3IGxvY2sgb2JqZWN0IGlzIGNyZWF0ZWQgdG8KLSAgIHN5bmNocm9uaXplIGFjY2VzcyB0byB0aGUgdmFsdWUuICBJZiAqbG9jayogaXMgYSA6Y2xhc3M6YExvY2tgIG9yCi0gICA6Y2xhc3M6YFJMb2NrYCBvYmplY3QgdGhlbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gdGhlCisgICBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gdGhlIHZhbHVlLiAgSWYgKmxvY2sqIGlzIGEgOmNsYXNzOmB+bXVsdGlwcm9jZXNzaW5nLkxvY2tgIG9yCisgICA6Y2xhc3M6YH5tdWx0aXByb2Nlc3NpbmcuUkxvY2tgIG9iamVjdCB0aGVuIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHN5bmNocm9uaXplIGFjY2VzcyB0byB0aGUKICAgIHZhbHVlLiAgSWYgKmxvY2sqIGlzIGBgRmFsc2VgYCB0aGVuIGFjY2VzcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgbm90IGJlCiAgICBhdXRvbWF0aWNhbGx5IHByb3RlY3RlZCBieSBhIGxvY2ssIHNvIGl0IHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlCiAgICAicHJvY2Vzcy1zYWZlIi4KQEAgLTExOTUsMTIgKzEyNTcsMTIgQEAKIAogICAgICAgKmV4cG9zZWQqIGlzIHVzZWQgdG8gc3BlY2lmeSBhIHNlcXVlbmNlIG9mIG1ldGhvZCBuYW1lcyB3aGljaCBwcm94aWVzIGZvcgogICAgICAgdGhpcyB0eXBlaWQgc2hvdWxkIGJlIGFsbG93ZWQgdG8gYWNjZXNzIHVzaW5nCi0gICAgICA6bWV0aDpgQmFzZVByb3h5Ll9jYWxsTWV0aG9kYC4gIChJZiAqZXhwb3NlZCogaXMgYGBOb25lYGAgdGhlbgorICAgICAgOm1ldGg6YEJhc2VQcm94eS5fY2FsbG1ldGhvZGAuICAoSWYgKmV4cG9zZWQqIGlzIGBgTm9uZWBgIHRoZW4KICAgICAgIDphdHRyOmBwcm94eXR5cGUuX2V4cG9zZWRfYCBpcyB1c2VkIGluc3RlYWQgaWYgaXQgZXhpc3RzLikgIEluIHRoZSBjYXNlCiAgICAgICB3aGVyZSBubyBleHBvc2VkIGxpc3QgaXMgc3BlY2lmaWVkLCBhbGwgInB1YmxpYyBtZXRob2RzIiBvZiB0aGUgc2hhcmVkCiAgICAgICBvYmplY3Qgd2lsbCBiZSBhY2Nlc3NpYmxlLiAgKEhlcmUgYSAicHVibGljIG1ldGhvZCIgbWVhbnMgYW55IGF0dHJpYnV0ZQotICAgICAgd2hpY2ggaGFzIGEgOm1ldGg6YF9fY2FsbF9fYCBtZXRob2QgYW5kIHdob3NlIG5hbWUgZG9lcyBub3QgYmVnaW4gd2l0aAotICAgICAgYGAnXydgYC4pCisgICAgICB3aGljaCBoYXMgYSA6bWV0aDpgfm9iamVjdC5fX2NhbGxfX2AgbWV0aG9kIGFuZCB3aG9zZSBuYW1lIGRvZXMgbm90IGJlZ2luCisgICAgICB3aXRoIGBgJ18nYGAuKQogCiAgICAgICAqbWV0aG9kX3RvX3R5cGVpZCogaXMgYSBtYXBwaW5nIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmV0dXJuIHR5cGUgb2YgdGhvc2UKICAgICAgIGV4cG9zZWQgbWV0aG9kcyB3aGljaCBzaG91bGQgcmV0dXJuIGEgcHJveHkuICBJdCBtYXBzIG1ldGhvZCBuYW1lcyB0bwpAQCAtMTMyOSw3ICsxMzkxLDcgQEAKID4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4KIAogVG8gY3JlYXRlIG9uZSdzIG93biBtYW5hZ2VyLCBvbmUgY3JlYXRlcyBhIHN1YmNsYXNzIG9mIDpjbGFzczpgQmFzZU1hbmFnZXJgIGFuZAotdXNlIHRoZSA6bWV0aDpgfkJhc2VNYW5hZ2VyLnJlZ2lzdGVyYCBjbGFzc21ldGhvZCB0byByZWdpc3RlciBuZXcgdHlwZXMgb3IKK3VzZXMgdGhlIDptZXRoOmB+QmFzZU1hbmFnZXIucmVnaXN0ZXJgIGNsYXNzbWV0aG9kIHRvIHJlZ2lzdGVyIG5ldyB0eXBlcyBvcgogY2FsbGFibGVzIHdpdGggdGhlIG1hbmFnZXIgY2xhc3MuICBGb3IgZXhhbXBsZTo6CiAKICAgIGZyb20gbXVsdGlwcm9jZXNzaW5nLm1hbmFnZXJzIGltcG9ydCBCYXNlTWFuYWdlcgpAQCAtMTU2MSw2ICsxNjIzLDkgQEAKICAgICppbml0aWFsaXplciogaXMgbm90IGBgTm9uZWBgIHRoZW4gZWFjaCB3b3JrZXIgcHJvY2VzcyB3aWxsIGNhbGwKICAgIGBgaW5pdGlhbGl6ZXIoKmluaXRhcmdzKWBgIHdoZW4gaXQgc3RhcnRzLgogCisgICBOb3RlIHRoYXQgdGhlIG1ldGhvZHMgb2YgdGhlIHBvb2wgb2JqZWN0IHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieQorICAgdGhlIHByb2Nlc3Mgd2hpY2ggY3JlYXRlZCB0aGUgcG9vbC4KKwogICAgLi4gdmVyc2lvbmFkZGVkOjogMi43CiAgICAgICAqbWF4dGFza3NwZXJjaGlsZCogaXMgdGhlIG51bWJlciBvZiB0YXNrcyBhIHdvcmtlciBwcm9jZXNzIGNhbiBjb21wbGV0ZQogICAgICAgYmVmb3JlIGl0IHdpbGwgZXhpdCBhbmQgYmUgcmVwbGFjZWQgd2l0aCBhIGZyZXNoIHdvcmtlciBwcm9jZXNzLCB0byBlbmFibGUKQEAgLTE1NzksMTAgKzE2NDQsMTAgQEAKIAogICAgLi4gbWV0aG9kOjogYXBwbHkoZnVuY1ssIGFyZ3NbLCBrd2RzXV0pCiAKLSAgICAgIEVxdWl2YWxlbnQgb2YgdGhlIDpmdW5jOmBhcHBseWAgYnVpbHQtaW4gZnVuY3Rpb24uICBJdCBibG9ja3MgdGlsbCB0aGUKLSAgICAgIHJlc3VsdCBpcyByZWFkeS4gIEdpdmVuIHRoaXMgYmxvY2tzLCA6bWV0aDpgYXBwbHlfYXN5bmNgIGlzIGJldHRlciBzdWl0ZWQKLSAgICAgIGZvciBwZXJmb3JtaW5nIHdvcmsgaW4gcGFyYWxsZWwuIEFkZGl0aW9uYWxseSwgdGhlIHBhc3NlZAotICAgICAgaW4gZnVuY3Rpb24gaXMgb25seSBleGVjdXRlZCBpbiBvbmUgb2YgdGhlIHdvcmtlcnMgb2YgdGhlIHBvb2wuCisgICAgICBFcXVpdmFsZW50IG9mIHRoZSA6ZnVuYzpgYXBwbHlgIGJ1aWx0LWluIGZ1bmN0aW9uLiAgSXQgYmxvY2tzIHVudGlsIHRoZQorICAgICAgcmVzdWx0IGlzIHJlYWR5LCBzbyA6bWV0aDpgYXBwbHlfYXN5bmNgIGlzIGJldHRlciBzdWl0ZWQgZm9yIHBlcmZvcm1pbmcKKyAgICAgIHdvcmsgaW4gcGFyYWxsZWwuIEFkZGl0aW9uYWxseSwgKmZ1bmMqIGlzIG9ubHkgZXhlY3V0ZWQgaW4gb25lIG9mIHRoZQorICAgICAgd29ya2VycyBvZiB0aGUgcG9vbC4KIAogICAgLi4gbWV0aG9kOjogYXBwbHlfYXN5bmMoZnVuY1ssIGFyZ3NbLCBrd2RzWywgY2FsbGJhY2tdXV0pCiAKQEAgLTE1OTYsNyArMTY2MSw3IEBACiAgICAuLiBtZXRob2Q6OiBtYXAoZnVuYywgaXRlcmFibGVbLCBjaHVua3NpemVdKQogCiAgICAgICBBIHBhcmFsbGVsIGVxdWl2YWxlbnQgb2YgdGhlIDpmdW5jOmBtYXBgIGJ1aWx0LWluIGZ1bmN0aW9uIChpdCBzdXBwb3J0cyBvbmx5Ci0gICAgICBvbmUgKml0ZXJhYmxlKiBhcmd1bWVudCB0aG91Z2gpLiAgSXQgYmxvY2tzIHRpbGwgdGhlIHJlc3VsdCBpcyByZWFkeS4KKyAgICAgIG9uZSAqaXRlcmFibGUqIGFyZ3VtZW50IHRob3VnaCkuICBJdCBibG9ja3MgdW50aWwgdGhlIHJlc3VsdCBpcyByZWFkeS4KIAogICAgICAgVGhpcyBtZXRob2QgY2hvcHMgdGhlIGl0ZXJhYmxlIGludG8gYSBudW1iZXIgb2YgY2h1bmtzIHdoaWNoIGl0IHN1Ym1pdHMgdG8KICAgICAgIHRoZSBwcm9jZXNzIHBvb2wgYXMgc2VwYXJhdGUgdGFza3MuICBUaGUgKGFwcHJveGltYXRlKSBzaXplIG9mIHRoZXNlCkBAIC0xNzA3LDcgKzE3NzIsOCBAQAogICAgOnN5bm9wc2lzOiBBUEkgZm9yIGRlYWxpbmcgd2l0aCBzb2NrZXRzLgogCiBVc3VhbGx5IG1lc3NhZ2UgcGFzc2luZyBiZXR3ZWVuIHByb2Nlc3NlcyBpcyBkb25lIHVzaW5nIHF1ZXVlcyBvciBieSB1c2luZwotOmNsYXNzOmBDb25uZWN0aW9uYCBvYmplY3RzIHJldHVybmVkIGJ5IDpmdW5jOmBQaXBlYC4KKzpjbGFzczpgfm11bHRpcHJvY2Vzc2luZy5Db25uZWN0aW9uYCBvYmplY3RzIHJldHVybmVkIGJ5Cis6ZnVuYzpgfm11bHRpcHJvY2Vzc2luZy5QaXBlYC4KIAogSG93ZXZlciwgdGhlIDptb2Q6YG11bHRpcHJvY2Vzc2luZy5jb25uZWN0aW9uYCBtb2R1bGUgYWxsb3dzIHNvbWUgZXh0cmEKIGZsZXhpYmlsaXR5LiAgSXQgYmFzaWNhbGx5IGdpdmVzIGEgaGlnaCBsZXZlbCBtZXNzYWdlIG9yaWVudGVkIEFQSSBmb3IgZGVhbGluZwpAQCAtMTcyNCw3ICsxNzkwLDcgQEAKICAgIHRoZW4gYSB3ZWxjb21lIG1lc3NhZ2UgaXMgc2VudCB0byB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjb25uZWN0aW9uLiAgT3RoZXJ3aXNlCiAgICA6ZXhjOmBBdXRoZW50aWNhdGlvbkVycm9yYCBpcyByYWlzZWQuCiAKLS4uIGZ1bmN0aW9uOjogYW5zd2VyQ2hhbGxlbmdlKGNvbm5lY3Rpb24sIGF1dGhrZXkpCisuLiBmdW5jdGlvbjo6IGFuc3dlcl9jaGFsbGVuZ2UoY29ubmVjdGlvbiwgYXV0aGtleSkKIAogICAgUmVjZWl2ZSBhIG1lc3NhZ2UsIGNhbGN1bGF0ZSB0aGUgZGlnZXN0IG9mIHRoZSBtZXNzYWdlIHVzaW5nICphdXRoa2V5KiBhcyB0aGUKICAgIGtleSwgYW5kIHRoZW4gc2VuZCB0aGUgZGlnZXN0IGJhY2suCkBAIC0xNzczLDcgKzE4MzksOCBAQAogICAgcHJpdmF0ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGNyZWF0ZWQgdXNpbmcgOmZ1bmM6YHRlbXBmaWxlLm1rc3RlbXBgLgogCiAgICBJZiB0aGUgbGlzdGVuZXIgb2JqZWN0IHVzZXMgYSBzb2NrZXQgdGhlbiAqYmFja2xvZyogKDEgYnkgZGVmYXVsdCkgaXMgcGFzc2VkCi0gICB0byB0aGUgOm1ldGg6YGxpc3RlbmAgbWV0aG9kIG9mIHRoZSBzb2NrZXQgb25jZSBpdCBoYXMgYmVlbiBib3VuZC4KKyAgIHRvIHRoZSA6bWV0aDpgfnNvY2tldC5zb2NrZXQubGlzdGVuYCBtZXRob2Qgb2YgdGhlIHNvY2tldCBvbmNlIGl0IGhhcyBiZWVuCisgICBib3VuZC4KIAogICAgSWYgKmF1dGhlbnRpY2F0ZSogaXMgYGBUcnVlYGAgKGBgRmFsc2VgYCBieSBkZWZhdWx0KSBvciAqYXV0aGtleSogaXMgbm90CiAgICBgYE5vbmVgYCB0aGVuIGRpZ2VzdCBhdXRoZW50aWNhdGlvbiBpcyB1c2VkLgpAQCAtMTc5MCw4ICsxODU3LDkgQEAKICAgIC4uIG1ldGhvZDo6IGFjY2VwdCgpCiAKICAgICAgIEFjY2VwdCBhIGNvbm5lY3Rpb24gb24gdGhlIGJvdW5kIHNvY2tldCBvciBuYW1lZCBwaXBlIG9mIHRoZSBsaXN0ZW5lcgotICAgICAgb2JqZWN0IGFuZCByZXR1cm4gYSA6Y2xhc3M6YENvbm5lY3Rpb25gIG9iamVjdC4gIElmIGF1dGhlbnRpY2F0aW9uIGlzCi0gICAgICBhdHRlbXB0ZWQgYW5kIGZhaWxzLCB0aGVuIDpleGM6YEF1dGhlbnRpY2F0aW9uRXJyb3JgIGlzIHJhaXNlZC4KKyAgICAgIG9iamVjdCBhbmQgcmV0dXJuIGEgOmNsYXNzOmB+bXVsdGlwcm9jZXNzaW5nLkNvbm5lY3Rpb25gIG9iamVjdC4gIElmCisgICAgICBhdXRoZW50aWNhdGlvbiBpcyBhdHRlbXB0ZWQgYW5kIGZhaWxzLCB0aGVuCisgICAgICA6ZXhjOmB+bXVsdGlwcm9jZXNzaW5nLkF1dGhlbnRpY2F0aW9uRXJyb3JgIGlzIHJhaXNlZC4KIAogICAgLi4gbWV0aG9kOjogY2xvc2UoKQogCkBAIC0xODg3LDcgKzE5NTUsOCBAQAogQXV0aGVudGljYXRpb24ga2V5cwogfn5+fn5+fn5+fn5+fn5+fn5+fgogCi1XaGVuIG9uZSB1c2VzIDptZXRoOmBDb25uZWN0aW9uLnJlY3ZgLCB0aGUgZGF0YSByZWNlaXZlZCBpcyBhdXRvbWF0aWNhbGx5CitXaGVuIG9uZSB1c2VzIDptZXRoOmBDb25uZWN0aW9uLnJlY3YgPG11bHRpcHJvY2Vzc2luZy5Db25uZWN0aW9uLnJlY3Y+YCwgdGhlCitkYXRhIHJlY2VpdmVkIGlzIGF1dG9tYXRpY2FsbHkKIHVucGlja2xlZC4gIFVuZm9ydHVuYXRlbHkgdW5waWNrbGluZyBkYXRhIGZyb20gYW4gdW50cnVzdGVkIHNvdXJjZSBpcyBhIHNlY3VyaXR5CiByaXNrLiAgVGhlcmVmb3JlIDpjbGFzczpgTGlzdGVuZXJgIGFuZCA6ZnVuYzpgQ2xpZW50YCB1c2UgdGhlIDptb2Q6YGhtYWNgIG1vZHVsZQogdG8gcHJvdmlkZSBkaWdlc3QgYXV0aGVudGljYXRpb24uCkBAIC0yMDM2LDkgKzIxMDUsMTAgQEAKIAogICAgIE9uIFVuaXggd2hlbiBhIHByb2Nlc3MgZmluaXNoZXMgYnV0IGhhcyBub3QgYmVlbiBqb2luZWQgaXQgYmVjb21lcyBhIHpvbWJpZS4KICAgICBUaGVyZSBzaG91bGQgbmV2ZXIgYmUgdmVyeSBtYW55IGJlY2F1c2UgZWFjaCB0aW1lIGEgbmV3IHByb2Nlc3Mgc3RhcnRzIChvcgotICAgIDpmdW5jOmBhY3RpdmVfY2hpbGRyZW5gIGlzIGNhbGxlZCkgYWxsIGNvbXBsZXRlZCBwcm9jZXNzZXMgd2hpY2ggaGF2ZSBub3QKLSAgICB5ZXQgYmVlbiBqb2luZWQgd2lsbCBiZSBqb2luZWQuICBBbHNvIGNhbGxpbmcgYSBmaW5pc2hlZCBwcm9jZXNzJ3MKLSAgICA6bWV0aDpgUHJvY2Vzcy5pc19hbGl2ZWAgd2lsbCBqb2luIHRoZSBwcm9jZXNzLiAgRXZlbiBzbyBpdCBpcyBwcm9iYWJseSBnb29kCisgICAgOmZ1bmM6YH5tdWx0aXByb2Nlc3NpbmcuYWN0aXZlX2NoaWxkcmVuYCBpcyBjYWxsZWQpIGFsbCBjb21wbGV0ZWQgcHJvY2Vzc2VzCisgICAgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW4gam9pbmVkIHdpbGwgYmUgam9pbmVkLiAgQWxzbyBjYWxsaW5nIGEgZmluaXNoZWQKKyAgICBwcm9jZXNzJ3MgOm1ldGg6YFByb2Nlc3MuaXNfYWxpdmUgPG11bHRpcHJvY2Vzc2luZy5Qcm9jZXNzLmlzX2FsaXZlPmAgd2lsbAorICAgIGpvaW4gdGhlIHByb2Nlc3MuICBFdmVuIHNvIGl0IGlzIHByb2JhYmx5IGdvb2QKICAgICBwcmFjdGljZSB0byBleHBsaWNpdGx5IGpvaW4gYWxsIHRoZSBwcm9jZXNzZXMgdGhhdCB5b3Ugc3RhcnQuCiAKIEJldHRlciB0byBpbmhlcml0IHRoYW4gcGlja2xlL3VucGlja2xlCkBAIC0yMDQ2LDI1ICsyMTE2LDI3IEBACiAgICAgT24gV2luZG93cyBtYW55IHR5cGVzIGZyb20gOm1vZDpgbXVsdGlwcm9jZXNzaW5nYCBuZWVkIHRvIGJlIHBpY2tsYWJsZSBzbwogICAgIHRoYXQgY2hpbGQgcHJvY2Vzc2VzIGNhbiB1c2UgdGhlbS4gIEhvd2V2ZXIsIG9uZSBzaG91bGQgZ2VuZXJhbGx5IGF2b2lkCiAgICAgc2VuZGluZyBzaGFyZWQgb2JqZWN0cyB0byBvdGhlciBwcm9jZXNzZXMgdXNpbmcgcGlwZXMgb3IgcXVldWVzLiAgSW5zdGVhZAotICAgIHlvdSBzaG91bGQgYXJyYW5nZSB0aGUgcHJvZ3JhbSBzbyB0aGF0IGEgcHJvY2VzcyB3aGljaCBuZWVkIGFjY2VzcyB0byBhCisgICAgeW91IHNob3VsZCBhcnJhbmdlIHRoZSBwcm9ncmFtIHNvIHRoYXQgYSBwcm9jZXNzIHdoaWNoIG5lZWRzIGFjY2VzcyB0byBhCiAgICAgc2hhcmVkIHJlc291cmNlIGNyZWF0ZWQgZWxzZXdoZXJlIGNhbiBpbmhlcml0IGl0IGZyb20gYW4gYW5jZXN0b3IgcHJvY2Vzcy4KIAogQXZvaWQgdGVybWluYXRpbmcgcHJvY2Vzc2VzCiAKLSAgICBVc2luZyB0aGUgOm1ldGg6YFByb2Nlc3MudGVybWluYXRlYCBtZXRob2QgdG8gc3RvcCBhIHByb2Nlc3MgaXMgbGlhYmxlIHRvCisgICAgVXNpbmcgdGhlIDptZXRoOmBQcm9jZXNzLnRlcm1pbmF0ZSA8bXVsdGlwcm9jZXNzaW5nLlByb2Nlc3MudGVybWluYXRlPmAKKyAgICBtZXRob2QgdG8gc3RvcCBhIHByb2Nlc3MgaXMgbGlhYmxlIHRvCiAgICAgY2F1c2UgYW55IHNoYXJlZCByZXNvdXJjZXMgKHN1Y2ggYXMgbG9ja3MsIHNlbWFwaG9yZXMsIHBpcGVzIGFuZCBxdWV1ZXMpCiAgICAgY3VycmVudGx5IGJlaW5nIHVzZWQgYnkgdGhlIHByb2Nlc3MgdG8gYmVjb21lIGJyb2tlbiBvciB1bmF2YWlsYWJsZSB0byBvdGhlcgogICAgIHByb2Nlc3Nlcy4KIAogICAgIFRoZXJlZm9yZSBpdCBpcyBwcm9iYWJseSBiZXN0IHRvIG9ubHkgY29uc2lkZXIgdXNpbmcKLSAgICA6bWV0aDpgUHJvY2Vzcy50ZXJtaW5hdGVgIG9uIHByb2Nlc3NlcyB3aGljaCBuZXZlciB1c2UgYW55IHNoYXJlZCByZXNvdXJjZXMuCisgICAgOm1ldGg6YFByb2Nlc3MudGVybWluYXRlIDxtdWx0aXByb2Nlc3NpbmcuUHJvY2Vzcy50ZXJtaW5hdGU+YCBvbiBwcm9jZXNzZXMKKyAgICB3aGljaCBuZXZlciB1c2UgYW55IHNoYXJlZCByZXNvdXJjZXMuCiAKIEpvaW5pbmcgcHJvY2Vzc2VzIHRoYXQgdXNlIHF1ZXVlcwogCiAgICAgQmVhciBpbiBtaW5kIHRoYXQgYSBwcm9jZXNzIHRoYXQgaGFzIHB1dCBpdGVtcyBpbiBhIHF1ZXVlIHdpbGwgd2FpdCBiZWZvcmUKICAgICB0ZXJtaW5hdGluZyB1bnRpbCBhbGwgdGhlIGJ1ZmZlcmVkIGl0ZW1zIGFyZSBmZWQgYnkgdGhlICJmZWVkZXIiIHRocmVhZCB0bwogICAgIHRoZSB1bmRlcmx5aW5nIHBpcGUuICAoVGhlIGNoaWxkIHByb2Nlc3MgY2FuIGNhbGwgdGhlCi0gICAgOm1ldGg6YFF1ZXVlLmNhbmNlbF9qb2luX3RocmVhZGAgbWV0aG9kIG9mIHRoZSBxdWV1ZSB0byBhdm9pZCB0aGlzIGJlaGF2aW91ci4pCisgICAgOm1ldGg6YH5tdWx0aXByb2Nlc3NpbmcuUXVldWUuY2FuY2VsX2pvaW5fdGhyZWFkYCBtZXRob2Qgb2YgdGhlIHF1ZXVlIHRvIGF2b2lkIHRoaXMgYmVoYXZpb3VyLikKIAogICAgIFRoaXMgbWVhbnMgdGhhdCB3aGVuZXZlciB5b3UgdXNlIGEgcXVldWUgeW91IG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYWxsCiAgICAgaXRlbXMgd2hpY2ggaGF2ZSBiZWVuIHB1dCBvbiB0aGUgcXVldWUgd2lsbCBldmVudHVhbGx5IGJlIHJlbW92ZWQgYmVmb3JlIHRoZQpAQCAtMjEyNSw3ICsyMTk3LDcgQEAKICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgogICAgICAgICAgICAgICAgIFByb2Nlc3ModGFyZ2V0PWYsIGFyZ3M9KGxvY2ssKSkuc3RhcnQoKQogCi1CZXdhcmUgcmVwbGFjaW5nIHN5cy5zdGRpbiB3aXRoIGEgImZpbGUgbGlrZSBvYmplY3QiCitCZXdhcmUgb2YgcmVwbGFjaW5nIDpkYXRhOmBzeXMuc3RkaW5gIHdpdGggYSAiZmlsZSBsaWtlIG9iamVjdCIKIAogICAgIDptb2Q6YG11bHRpcHJvY2Vzc2luZ2Agb3JpZ2luYWxseSB1bmNvbmRpdGlvbmFsbHkgY2FsbGVkOjoKIApAQCAtMjE0MSw3ICsyMjEzLDcgQEAKICAgICByZXN1bHRpbmcgaW4gYSBiYWQgZmlsZSBkZXNjcmlwdG9yIGVycm9yLCBidXQgaW50cm9kdWNlcyBhIHBvdGVudGlhbCBkYW5nZXIKICAgICB0byBhcHBsaWNhdGlvbnMgd2hpY2ggcmVwbGFjZSA6ZnVuYzpgc3lzLnN0ZGluYCB3aXRoIGEgImZpbGUtbGlrZSBvYmplY3QiCiAgICAgd2l0aCBvdXRwdXQgYnVmZmVyaW5nLiAgVGhpcyBkYW5nZXIgaXMgdGhhdCBpZiBtdWx0aXBsZSBwcm9jZXNzZXMgY2FsbAotICAgIDpmdW5jOmBjbG9zZSgpYCBvbiB0aGlzIGZpbGUtbGlrZSBvYmplY3QsIGl0IGNvdWxkIHJlc3VsdCBpbiB0aGUgc2FtZQorICAgIDptZXRoOmB+aW8uSU9CYXNlLmNsb3NlKClgIG9uIHRoaXMgZmlsZS1saWtlIG9iamVjdCwgaXQgY291bGQgcmVzdWx0IGluIHRoZSBzYW1lCiAgICAgZGF0YSBiZWluZyBmbHVzaGVkIHRvIHRoZSBvYmplY3QgbXVsdGlwbGUgdGltZXMsIHJlc3VsdGluZyBpbiBjb3JydXB0aW9uLgogCiAgICAgSWYgeW91IHdyaXRlIGEgZmlsZS1saWtlIG9iamVjdCBhbmQgaW1wbGVtZW50IHlvdXIgb3duIGNhY2hpbmcsIHlvdSBjYW4KQEAgLTIxNzAsMTQgKzIyNDIsMTYgQEAKICAgICBhcyB0aGUgYGB0YXJnZXRgYCBhcmd1bWVudCBvbiBXaW5kb3dzIC0tLSBqdXN0IGRlZmluZSBhIGZ1bmN0aW9uIGFuZCB1c2UKICAgICB0aGF0IGluc3RlYWQuCiAKLSAgICBBbHNvLCBpZiB5b3Ugc3ViY2xhc3MgOmNsYXNzOmBQcm9jZXNzYCB0aGVuIG1ha2Ugc3VyZSB0aGF0IGluc3RhbmNlcyB3aWxsIGJlCi0gICAgcGlja2xhYmxlIHdoZW4gdGhlIDptZXRoOmBQcm9jZXNzLnN0YXJ0YCBtZXRob2QgaXMgY2FsbGVkLgorICAgIEFsc28sIGlmIHlvdSBzdWJjbGFzcyA6Y2xhc3M6YH5tdWx0aXByb2Nlc3NpbmcuUHJvY2Vzc2AgdGhlbiBtYWtlIHN1cmUgdGhhdAorICAgIGluc3RhbmNlcyB3aWxsIGJlIHBpY2tsYWJsZSB3aGVuIHRoZSA6bWV0aDpgUHJvY2Vzcy5zdGFydAorICAgIDxtdWx0aXByb2Nlc3NpbmcuUHJvY2Vzcy5zdGFydD5gIG1ldGhvZCBpcyBjYWxsZWQuCiAKIEdsb2JhbCB2YXJpYWJsZXMKIAogICAgIEJlYXIgaW4gbWluZCB0aGF0IGlmIGNvZGUgcnVuIGluIGEgY2hpbGQgcHJvY2VzcyB0cmllcyB0byBhY2Nlc3MgYSBnbG9iYWwKICAgICB2YXJpYWJsZSwgdGhlbiB0aGUgdmFsdWUgaXQgc2VlcyAoaWYgYW55KSBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSB2YWx1ZQotICAgIGluIHRoZSBwYXJlbnQgcHJvY2VzcyBhdCB0aGUgdGltZSB0aGF0IDptZXRoOmBQcm9jZXNzLnN0YXJ0YCB3YXMgY2FsbGVkLgorICAgIGluIHRoZSBwYXJlbnQgcHJvY2VzcyBhdCB0aGUgdGltZSB0aGF0IDptZXRoOmBQcm9jZXNzLnN0YXJ0CisgICAgPG11bHRpcHJvY2Vzc2luZy5Qcm9jZXNzLnN0YXJ0PmAgd2FzIGNhbGxlZC4KIAogICAgIEhvd2V2ZXIsIGdsb2JhbCB2YXJpYWJsZXMgd2hpY2ggYXJlIGp1c3QgbW9kdWxlIGxldmVsIGNvbnN0YW50cyBjYXVzZSBubwogICAgIHByb2JsZW1zLgpAQCAtMjIzMiw3ICsyMzA2LDcgQEAKIC4uIGxpdGVyYWxpbmNsdWRlOjogLi4vaW5jbHVkZXMvbXBfbmV3dHlwZS5weQogCiAKLVVzaW5nIDpjbGFzczpgUG9vbGA6CitVc2luZyA6Y2xhc3M6YH5tdWx0aXByb2Nlc3NpbmcucG9vbC5Qb29sYDoKIAogLi4gbGl0ZXJhbGluY2x1ZGU6OiAuLi9pbmNsdWRlcy9tcF9wb29sLnB5CiAKQEAgLTIyNDMsNyArMjMxNyw3IEBACiAKIAogQW4gZXhhbXBsZSBzaG93aW5nIGhvdyB0byB1c2UgcXVldWVzIHRvIGZlZWQgdGFza3MgdG8gYSBjb2xsZWN0aW9uIG9mIHdvcmtlcgotcHJvY2VzcyBhbmQgY29sbGVjdCB0aGUgcmVzdWx0czoKK3Byb2Nlc3NlcyBhbmQgY29sbGVjdCB0aGUgcmVzdWx0czoKIAogLi4gbGl0ZXJhbGluY2x1ZGU6OiAuLi9pbmNsdWRlcy9tcF93b3JrZXJzLnB5CiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L211dGV4LnJzdCBiL0RvYy9saWJyYXJ5L211dGV4LnJzdAppbmRleCAyZDQxMzUwLi41N2MzOTcxIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9tdXRleC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvbXV0ZXgucnN0CkBAIC03LDcgKzcsNyBAQAogICAgOmRlcHJlY2F0ZWQ6CiAKIC4uIGRlcHJlY2F0ZWQ6OiAyLjYKLSAgIFRoZSA6bW9kOmBtdXRleGAgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuMC4KKyAgIFRoZSA6bW9kOmBtdXRleGAgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuCiAKIC4uIHNlY3Rpb25hdXRob3I6OiBNb3NoZSBaYWRrYSA8bW9zaGV6QHphZGthLnNpdGUuY28uaWw+CiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L25ldHJjLnJzdCBiL0RvYy9saWJyYXJ5L25ldHJjLnJzdAppbmRleCAzMjNmZDY5Li43MTNjOGRmIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9uZXRyYy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvbmV0cmMucnN0CkBAIC0yNSw2ICsyNSwxNCBAQAogICAgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHRoZSBmaWxlIDpmaWxlOmAubmV0cmNgIGluIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3Rvcnkgd2lsbAogICAgYmUgcmVhZC4gIFBhcnNlIGVycm9ycyB3aWxsIHJhaXNlIDpleGM6YE5ldHJjUGFyc2VFcnJvcmAgd2l0aCBkaWFnbm9zdGljCiAgICBpbmZvcm1hdGlvbiBpbmNsdWRpbmcgdGhlIGZpbGUgbmFtZSwgbGluZSBudW1iZXIsIGFuZCB0ZXJtaW5hdGluZyB0b2tlbi4KKyAgIElmIG5vIGFyZ3VtZW50IGlzIHNwZWNpZmllZCBvbiBhIFBPU0lYIHN5c3RlbSwgdGhlIHByZXNlbmNlIG9mIHBhc3N3b3JkcyBpbgorICAgdGhlIDpmaWxlOmAubmV0cmNgIGZpbGUgd2lsbCByYWlzZSBhIDpleGM6YE5ldHJjUGFyc2VFcnJvcmAgaWYgdGhlIGZpbGUKKyAgIG93bmVyc2hpcCBvciBwZXJtaXNzaW9ucyBhcmUgaW5zZWN1cmUgKG93bmVkIGJ5IGEgdXNlciBvdGhlciB0aGFuIHRoZSB1c2VyCisgICBydW5uaW5nIHRoZSBwcm9jZXNzLCBvciBhY2Nlc3NpYmxlIGZvciByZWFkIG9yIHdyaXRlIGJ5IGFueSBvdGhlciB1c2VyKS4KKyAgIFRoaXMgaW1wbGVtZW50cyBzZWN1cml0eSBiZWhhdmlvciBlcXVpdmFsZW50IHRvIHRoYXQgb2YgZnRwIGFuZCBvdGhlcgorICAgcHJvZ3JhbXMgdGhhdCB1c2UgOmZpbGU6YC5uZXRyY2AuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi43LjYgQWRkZWQgdGhlIFBPU0lYIHBlcm1pc3Npb25zIGNoZWNrLgogCiAKIC4uIGV4Y2VwdGlvbjo6IE5ldHJjUGFyc2VFcnJvcgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvbmV3LnJzdCBiL0RvYy9saWJyYXJ5L25ldy5yc3QKaW5kZXggNjcwZDNkNy4uNjY3ZTU4NiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvbmV3LnJzdAorKysgYi9Eb2MvbGlicmFyeS9uZXcucnN0CkBAIC02LDcgKzYsNyBAQAogICAgOmRlcHJlY2F0ZWQ6CiAKIC4uIGRlcHJlY2F0ZWQ6OiAyLjYKLSAgIFRoZSA6bW9kOmBuZXdgIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLjAuICBVc2UgdGhlIDptb2Q6YHR5cGVzYAorICAgVGhlIDptb2Q6YG5ld2AgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuICBVc2UgdGhlIDptb2Q6YHR5cGVzYAogICAgbW9kdWxlJ3MgY2xhc3NlcyBpbnN0ZWFkLgogCiAuLiBzZWN0aW9uYXV0aG9yOjogTW9zaGUgWmFka2EgPG1vc2hlekB6YWRrYS5zaXRlLmNvLmlsPgpAQCAtNDgsNyArNDgsNyBAQAogCiAuLiBmdW5jdGlvbjo6IGNvZGUoYXJnY291bnQsIG5sb2NhbHMsIHN0YWNrc2l6ZSwgZmxhZ3MsIGNvZGVzdHJpbmcsIGNvbnN0YW50cywgbmFtZXMsIHZhcm5hbWVzLCBmaWxlbmFtZSwgbmFtZSwgZmlyc3RsaW5lbm8sIGxub3RhYikKIAotICAgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbnRlcmZhY2UgdG8gdGhlIDpjZnVuYzpgUHlDb2RlX05ld2AgQyBmdW5jdGlvbi4KKyAgIFRoaXMgZnVuY3Rpb24gaXMgYW4gaW50ZXJmYWNlIHRvIHRoZSA6YzpmdW5jOmBQeUNvZGVfTmV3YCBDIGZ1bmN0aW9uLgogCiAgICAuLiBYWFggVGhpcyBpcyBzdGlsbCB1bmRvY3VtZW50ZWQhCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L25udHBsaWIucnN0IGIvRG9jL2xpYnJhcnkvbm50cGxpYi5yc3QKaW5kZXggYWNiYjdhNS4uOTIxODBkNiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvbm50cGxpYi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvbm50cGxpYi5yc3QKQEAgLTQ2LDcgKzQ2LDcgQEAKIGhlYWRlcnMsIGFuZCB0aGF0IHlvdSBoYXZlIHJpZ2h0IHRvIHBvc3Qgb24gdGhlIHBhcnRpY3VsYXIgbmV3c2dyb3VwKTo6CiAKICAgID4+PiBzID0gTk5UUCgnbmV3cy5nbWFuZS5vcmcnKQotICAgPj4+IGYgPSBvcGVuKCcvdG1wL2FydGljbGUnKQorICAgPj4+IGYgPSBvcGVuKCdhcnRpY2xlZmlsZScpCiAgICA+Pj4gcy5wb3N0KGYpCiAgICAnMjQwIEFydGljbGUgcG9zdGVkIHN1Y2Nlc3NmdWxseS4nCiAgICA+Pj4gcy5xdWl0KCkKQEAgLTIzNCwyNSArMjM0LDI1IEBACiAKIC4uIG1ldGhvZDo6IE5OVFAubmV4dCgpCiAKLSAgIFNlbmQgYSBgYE5FWFRgYCBjb21tYW5kLiAgUmV0dXJuIGFzIGZvciA6bWV0aDpgc3RhdGAuCisgICBTZW5kIGEgYGBORVhUYGAgY29tbWFuZC4gIFJldHVybiBhcyBmb3IgOm1ldGg6YC5zdGF0YC4KIAogCiAuLiBtZXRob2Q6OiBOTlRQLmxhc3QoKQogCi0gICBTZW5kIGEgYGBMQVNUYGAgY29tbWFuZC4gIFJldHVybiBhcyBmb3IgOm1ldGg6YHN0YXRgLgorICAgU2VuZCBhIGBgTEFTVGBgIGNvbW1hbmQuICBSZXR1cm4gYXMgZm9yIDptZXRoOmAuc3RhdGAuCiAKIAogLi4gbWV0aG9kOjogTk5UUC5oZWFkKGlkKQogCi0gICBTZW5kIGEgYGBIRUFEYGAgY29tbWFuZCwgd2hlcmUgKmlkKiBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBmb3IgOm1ldGg6YHN0YXRgLgorICAgU2VuZCBhIGBgSEVBRGBgIGNvbW1hbmQsIHdoZXJlICppZCogaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgZm9yIDptZXRoOmAuc3RhdGAuCiAgICBSZXR1cm4gYSB0dXBsZSBgYChyZXNwb25zZSwgbnVtYmVyLCBpZCwgbGlzdClgYCB3aGVyZSB0aGUgZmlyc3QgdGhyZWUgYXJlIHRoZQotICAgc2FtZSBhcyBmb3IgOm1ldGg6YHN0YXRgLCBhbmQgKmxpc3QqIGlzIGEgbGlzdCBvZiB0aGUgYXJ0aWNsZSdzIGhlYWRlcnMgKGFuCisgICBzYW1lIGFzIGZvciA6bWV0aDpgLnN0YXRgLCBhbmQgKmxpc3QqIGlzIGEgbGlzdCBvZiB0aGUgYXJ0aWNsZSdzIGhlYWRlcnMgKGFuCiAgICB1bmludGVycHJldGVkIGxpc3Qgb2YgbGluZXMsIHdpdGhvdXQgdHJhaWxpbmcgbmV3bGluZXMpLgogCiAKIC4uIG1ldGhvZDo6IE5OVFAuYm9keShpZCxbZmlsZV0pCiAKLSAgIFNlbmQgYSBgYEJPRFlgYCBjb21tYW5kLCB3aGVyZSAqaWQqIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIGZvciA6bWV0aDpgc3RhdGAuCisgICBTZW5kIGEgYGBCT0RZYGAgY29tbWFuZCwgd2hlcmUgKmlkKiBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBmb3IgOm1ldGg6YC5zdGF0YC4KICAgIElmIHRoZSAqZmlsZSogcGFyYW1ldGVyIGlzIHN1cHBsaWVkLCB0aGVuIHRoZSBib2R5IGlzIHN0b3JlZCBpbiBhIGZpbGUuICBJZgogICAgKmZpbGUqIGlzIGEgc3RyaW5nLCB0aGVuIHRoZSBtZXRob2Qgd2lsbCBvcGVuIGEgZmlsZSBvYmplY3Qgd2l0aCB0aGF0IG5hbWUsCiAgICB3cml0ZSB0byBpdCB0aGVuIGNsb3NlIGl0LiBJZiAqZmlsZSogaXMgYSBmaWxlIG9iamVjdCwgdGhlbiBpdCB3aWxsIHN0YXJ0CkBAIC0yNjMsNyArMjYzLDcgQEAKIC4uIG1ldGhvZDo6IE5OVFAuYXJ0aWNsZShpZCkKIAogICAgU2VuZCBhbiBgYEFSVElDTEVgYCBjb21tYW5kLCB3aGVyZSAqaWQqIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIGZvcgotICAgOm1ldGg6YHN0YXRgLiAgUmV0dXJuIGFzIGZvciA6bWV0aDpgaGVhZGAuCisgICA6bWV0aDpgLnN0YXRgLiAgUmV0dXJuIGFzIGZvciA6bWV0aDpgaGVhZGAuCiAKIAogLi4gbWV0aG9kOjogTk5UUC5zbGF2ZSgpCkBAIC0yOTAsNyArMjkwLDcgQEAKIC4uIG1ldGhvZDo6IE5OVFAucG9zdChmaWxlKQogCiAgICBQb3N0IGFuIGFydGljbGUgdXNpbmcgdGhlIGBgUE9TVGBgIGNvbW1hbmQuICBUaGUgKmZpbGUqIGFyZ3VtZW50IGlzIGFuIG9wZW4gZmlsZQotICAgb2JqZWN0IHdoaWNoIGlzIHJlYWQgdW50aWwgRU9GIHVzaW5nIGl0cyA6bWV0aDpgcmVhZGxpbmVgIG1ldGhvZC4gIEl0IHNob3VsZCBiZQorICAgb2JqZWN0IHdoaWNoIGlzIHJlYWQgdW50aWwgRU9GIHVzaW5nIGl0cyA6bWV0aDpgfmZpbGUucmVhZGxpbmVgIG1ldGhvZC4gIEl0IHNob3VsZCBiZQogICAgYSB3ZWxsLWZvcm1lZCBuZXdzIGFydGljbGUsIGluY2x1ZGluZyB0aGUgcmVxdWlyZWQgaGVhZGVycy4gIFRoZSA6bWV0aDpgcG9zdGAKICAgIG1ldGhvZCBhdXRvbWF0aWNhbGx5IGVzY2FwZXMgbGluZXMgYmVnaW5uaW5nIHdpdGggYGAuYGAuCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L251bWJlcnMucnN0IGIvRG9jL2xpYnJhcnkvbnVtYmVycy5yc3QKaW5kZXggZjQ2ZThhYy4uODgxMWI1ZCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvbnVtYmVycy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvbnVtYmVycy5yc3QKQEAgLTczLDEwICs3MywxMCBAQAogCiAuLiBjbGFzczo6IEludGVncmFsCiAKLSAgIFN1YnR5cGVzIDpjbGFzczpgUmF0aW9uYWxgIGFuZCBhZGRzIGEgY29udmVyc2lvbiB0byA6Y2xhc3M6YGludGAuCi0gICBQcm92aWRlcyBkZWZhdWx0cyBmb3IgOmZ1bmM6YGZsb2F0YCwgOmF0dHI6YH5SYXRpb25hbC5udW1lcmF0b3JgLCBhbmQKLSAgIDphdHRyOmB+UmF0aW9uYWwuZGVub21pbmF0b3JgLCBhbmQgYml0LXN0cmluZyBvcGVyYXRpb25zOiBgYDw8YGAsCi0gICBgYD4+YGAsIGBgJmBgLCBgYF5gYCwgYGB8YGAsIGBgfmBgLgorICAgU3VidHlwZXMgOmNsYXNzOmBSYXRpb25hbGAgYW5kIGFkZHMgYSBjb252ZXJzaW9uIHRvIDpjbGFzczpgaW50YC4gIFByb3ZpZGVzCisgICBkZWZhdWx0cyBmb3IgOmZ1bmM6YGZsb2F0YCwgOmF0dHI6YH5SYXRpb25hbC5udW1lcmF0b3JgLCBhbmQKKyAgIDphdHRyOmB+UmF0aW9uYWwuZGVub21pbmF0b3JgLiAgQWRkcyBhYnN0cmFjdCBtZXRob2RzIGZvciBgYCoqYGAgYW5kCisgICBiaXQtc3RyaW5nIG9wZXJhdGlvbnM6IGBgPDxgYCwgYGA+PmBgLCBgYCZgYCwgYGBeYGAsIGBgfGBgLCBgYH5gYC4KIAogCiBOb3RlcyBmb3IgdHlwZSBpbXBsZW1lbnRvcnMKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L29wZXJhdG9yLnJzdCBiL0RvYy9saWJyYXJ5L29wZXJhdG9yLnJzdAppbmRleCA4NTRmMTRkLi4wYjQ2NTA0IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9vcGVyYXRvci5yc3QKKysrIGIvRG9jL2xpYnJhcnkvb3BlcmF0b3IucnN0CkBAIC0xMiwxMSArMTIsMTEgQEAKICAgIGZyb20gb3BlcmF0b3IgaW1wb3J0IGl0ZW1nZXR0ZXIKIAogCi1UaGUgOm1vZDpgb3BlcmF0b3JgIG1vZHVsZSBleHBvcnRzIGEgc2V0IG9mIGZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBpbiBDCi1jb3JyZXNwb25kaW5nIHRvIHRoZSBpbnRyaW5zaWMgb3BlcmF0b3JzIG9mIFB5dGhvbi4gIEZvciBleGFtcGxlLAotYGBvcGVyYXRvci5hZGQoeCwgeSlgYCBpcyBlcXVpdmFsZW50IHRvIHRoZSBleHByZXNzaW9uIGBgeCt5YGAuICBUaGUgZnVuY3Rpb24KLW5hbWVzIGFyZSB0aG9zZSB1c2VkIGZvciBzcGVjaWFsIGNsYXNzIG1ldGhvZHM7IHZhcmlhbnRzIHdpdGhvdXQgbGVhZGluZyBhbmQKLXRyYWlsaW5nIGBgX19gYCBhcmUgYWxzbyBwcm92aWRlZCBmb3IgY29udmVuaWVuY2UuCitUaGUgOm1vZDpgb3BlcmF0b3JgIG1vZHVsZSBleHBvcnRzIGEgc2V0IG9mIGVmZmljaWVudCBmdW5jdGlvbnMgY29ycmVzcG9uZGluZyB0bwordGhlIGludHJpbnNpYyBvcGVyYXRvcnMgb2YgUHl0aG9uLiAgRm9yIGV4YW1wbGUsIGBgb3BlcmF0b3IuYWRkKHgsIHkpYGAgaXMKK2VxdWl2YWxlbnQgdG8gdGhlIGV4cHJlc3Npb24gYGB4K3lgYC4gIFRoZSBmdW5jdGlvbiBuYW1lcyBhcmUgdGhvc2UgdXNlZCBmb3IKK3NwZWNpYWwgY2xhc3MgbWV0aG9kczsgdmFyaWFudHMgd2l0aG91dCBsZWFkaW5nIGFuZCB0cmFpbGluZyBgYF9fYGAgYXJlIGFsc28KK3Byb3ZpZGVkIGZvciBjb252ZW5pZW5jZS4KIAogVGhlIGZ1bmN0aW9ucyBmYWxsIGludG8gY2F0ZWdvcmllcyB0aGF0IHBlcmZvcm0gb2JqZWN0IGNvbXBhcmlzb25zLCBsb2dpY2FsCiBvcGVyYXRpb25zLCBtYXRoZW1hdGljYWwgb3BlcmF0aW9ucywgc2VxdWVuY2Ugb3BlcmF0aW9ucywgYW5kIGFic3RyYWN0IHR5cGUKQEAgLTQ5MCwxMyArNDkwLDIyIEBACiBleHBlY3QgYSBmdW5jdGlvbiBhcmd1bWVudC4KIAogCi0uLiBmdW5jdGlvbjo6IGF0dHJnZXR0ZXIoYXR0clssIGFyZ3MuLi5dKQorLi4gZnVuY3Rpb246OiBhdHRyZ2V0dGVyKGF0dHIpCisgICAgICAgICAgICAgIGF0dHJnZXR0ZXIoKmF0dHJzKQogCi0gICBSZXR1cm4gYSBjYWxsYWJsZSBvYmplY3QgdGhhdCBmZXRjaGVzICphdHRyKiBmcm9tIGl0cyBvcGVyYW5kLiBJZiBtb3JlIHRoYW4gb25lCi0gICBhdHRyaWJ1dGUgaXMgcmVxdWVzdGVkLCByZXR1cm5zIGEgdHVwbGUgb2YgYXR0cmlidXRlcy4gQWZ0ZXIsCi0gICBgYGYgPSBhdHRyZ2V0dGVyKCduYW1lJylgYCwgdGhlIGNhbGwgYGBmKGIpYGAgcmV0dXJucyBgYGIubmFtZWBgLiAgQWZ0ZXIsCi0gICBgYGYgPSBhdHRyZ2V0dGVyKCduYW1lJywgJ2RhdGUnKWBgLCB0aGUgY2FsbCBgYGYoYilgYCByZXR1cm5zIGBgKGIubmFtZSwKLSAgIGIuZGF0ZSlgYC4gIEVxdWl2YWxlbnQgdG86OgorICAgUmV0dXJuIGEgY2FsbGFibGUgb2JqZWN0IHRoYXQgZmV0Y2hlcyAqYXR0ciogZnJvbSBpdHMgb3BlcmFuZC4KKyAgIElmIG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIGlzIHJlcXVlc3RlZCwgcmV0dXJucyBhIHR1cGxlIG9mIGF0dHJpYnV0ZXMuCisgICBUaGUgYXR0cmlidXRlIG5hbWVzIGNhbiBhbHNvIGNvbnRhaW4gZG90cy4gRm9yIGV4YW1wbGU6CisKKyAgICogQWZ0ZXIgYGBmID0gYXR0cmdldHRlcignbmFtZScpYGAsIHRoZSBjYWxsIGBgZihiKWBgIHJldHVybnMgYGBiLm5hbWVgYC4KKworICAgKiBBZnRlciBgYGYgPSBhdHRyZ2V0dGVyKCduYW1lJywgJ2RhdGUnKWBgLCB0aGUgY2FsbCBgYGYoYilgYCByZXR1cm5zCisgICAgIGBgKGIubmFtZSwgYi5kYXRlKWBgLgorCisgICAqIEFmdGVyIGBgZiA9IGF0dHJnZXR0ZXIoJ25hbWUuZmlyc3QnLCAnbmFtZS5sYXN0JylgYCwgdGhlIGNhbGwgYGBmKGIpYGAKKyAgICAgcmV0dXJucyBgYChiLm5hbWUuZmlyc3QsIGIubmFtZS5sYXN0KWBgLgorCisgICBFcXVpdmFsZW50IHRvOjoKIAogICAgICAgZGVmIGF0dHJnZXR0ZXIoKml0ZW1zKToKICAgICAgICAgICBpZiBsZW4oaXRlbXMpID09IDE6CkBAIC01MDUsNyArNTE0LDcgQEAKICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlX2F0dHIob2JqLCBhdHRyKQogICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgIGRlZiBnKG9iaik6Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gdHVwbGUocmVzb2x2ZV9hdHQob2JqLCBhdHRyKSBmb3IgYXR0ciBpbiBpdGVtcykKKyAgICAgICAgICAgICAgICAgIHJldHVybiB0dXBsZShyZXNvbHZlX2F0dHIob2JqLCBhdHRyKSBmb3IgYXR0ciBpbiBpdGVtcykKICAgICAgICAgICByZXR1cm4gZwogCiAgICAgICBkZWYgcmVzb2x2ZV9hdHRyKG9iaiwgYXR0cik6CkBAIC01MTQsOSArNTIzLDYgQEAKICAgICAgICAgICByZXR1cm4gb2JqCiAKIAotICAgVGhlIGF0dHJpYnV0ZSBuYW1lcyBjYW4gYWxzbyBjb250YWluIGRvdHM7IGFmdGVyIGBgZiA9IGF0dHJnZXR0ZXIoJ2RhdGUubW9udGgnKWBgLAotICAgdGhlIGNhbGwgYGBmKGIpYGAgcmV0dXJucyBgYGIuZGF0ZS5tb250aGBgLgotCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjQKIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKQEAgLTUyNiwxMSArNTMyLDE5IEBACiAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBkb3R0ZWQgYXR0cmlidXRlcy4KIAogCi0uLiBmdW5jdGlvbjo6IGl0ZW1nZXR0ZXIoaXRlbVssIGFyZ3MuLi5dKQorLi4gZnVuY3Rpb246OiBpdGVtZ2V0dGVyKGl0ZW0pCisgICAgICAgICAgICAgIGl0ZW1nZXR0ZXIoKml0ZW1zKQogCiAgICBSZXR1cm4gYSBjYWxsYWJsZSBvYmplY3QgdGhhdCBmZXRjaGVzICppdGVtKiBmcm9tIGl0cyBvcGVyYW5kIHVzaW5nIHRoZQogICAgb3BlcmFuZCdzIDptZXRoOmBfX2dldGl0ZW1fX2AgbWV0aG9kLiAgSWYgbXVsdGlwbGUgaXRlbXMgYXJlIHNwZWNpZmllZCwKLSAgIHJldHVybnMgYSB0dXBsZSBvZiBsb29rdXAgdmFsdWVzLiAgRXF1aXZhbGVudCB0bzo6CisgICByZXR1cm5zIGEgdHVwbGUgb2YgbG9va3VwIHZhbHVlcy4gIEZvciBleGFtcGxlOgorCisgICAqIEFmdGVyIGBgZiA9IGl0ZW1nZXR0ZXIoMilgYCwgdGhlIGNhbGwgYGBmKHIpYGAgcmV0dXJucyBgYHJbMl1gYC4KKworICAgKiBBZnRlciBgYGcgPSBpdGVtZ2V0dGVyKDIsIDUsIDMpYGAsIHRoZSBjYWxsIGBgZyhyKWBgIHJldHVybnMKKyAgICAgYGAoclsyXSwgcls1XSwgclszXSlgYC4KKworICAgRXF1aXZhbGVudCB0bzo6CiAKICAgICAgIGRlZiBpdGVtZ2V0dGVyKCppdGVtcyk6CiAgICAgICAgICAgaWYgbGVuKGl0ZW1zKSA9PSAxOgpAQCAtNTczLDkgKzU4NywxNCBAQAogCiAgICBSZXR1cm4gYSBjYWxsYWJsZSBvYmplY3QgdGhhdCBjYWxscyB0aGUgbWV0aG9kICpuYW1lKiBvbiBpdHMgb3BlcmFuZC4gIElmCiAgICBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhbmQvb3Iga2V5d29yZCBhcmd1bWVudHMgYXJlIGdpdmVuLCB0aGV5IHdpbGwgYmUgZ2l2ZW4KLSAgIHRvIHRoZSBtZXRob2QgYXMgd2VsbC4gIEFmdGVyIGBgZiA9IG1ldGhvZGNhbGxlcignbmFtZScpYGAsIHRoZSBjYWxsIGBgZihiKWBgCi0gICByZXR1cm5zIGBgYi5uYW1lKClgYC4gIEFmdGVyIGBgZiA9IG1ldGhvZGNhbGxlcignbmFtZScsICdmb28nLCBiYXI9MSlgYCwgdGhlCi0gICBjYWxsIGBgZihiKWBgIHJldHVybnMgYGBiLm5hbWUoJ2ZvbycsIGJhcj0xKWBgLiAgRXF1aXZhbGVudCB0bzo6CisgICB0byB0aGUgbWV0aG9kIGFzIHdlbGwuICBGb3IgZXhhbXBsZToKKworICAgKiBBZnRlciBgYGYgPSBtZXRob2RjYWxsZXIoJ25hbWUnKWBgLCB0aGUgY2FsbCBgYGYoYilgYCByZXR1cm5zIGBgYi5uYW1lKClgYC4KKworICAgKiBBZnRlciBgYGYgPSBtZXRob2RjYWxsZXIoJ25hbWUnLCAnZm9vJywgYmFyPTEpYGAsIHRoZSBjYWxsIGBgZihiKWBgCisgICAgIHJldHVybnMgYGBiLm5hbWUoJ2ZvbycsIGJhcj0xKWBgLgorCisgICBFcXVpdmFsZW50IHRvOjoKIAogICAgICAgZGVmIG1ldGhvZGNhbGxlcihuYW1lLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgIGRlZiBjYWxsZXIob2JqKToKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L29wdHBhcnNlLnJzdCBiL0RvYy9saWJyYXJ5L29wdHBhcnNlLnJzdAppbmRleCBkMDc4M2U3Li40MTdiM2JiIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9vcHRwYXJzZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvb3B0cGFyc2UucnN0CkBAIC0xNzMsMTAgKzE3MywxMCBAQAogCiBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhpcyBoeXBvdGhldGljYWwgY29tbWFuZC1saW5lOjoKIAotICAgcHJvZyAtdiAtLXJlcG9ydCAvdG1wL3JlcG9ydC50eHQgZm9vIGJhcgorICAgcHJvZyAtdiAtLXJlcG9ydCByZXBvcnQudHh0IGZvbyBiYXIKIAogYGAtdmBgIGFuZCBgYC0tcmVwb3J0YGAgYXJlIGJvdGggb3B0aW9ucy4gIEFzc3VtaW5nIHRoYXQgYGAtLXJlcG9ydGBgCi10YWtlcyBvbmUgYXJndW1lbnQsIGBgL3RtcC9yZXBvcnQudHh0YGAgaXMgYW4gb3B0aW9uIGFyZ3VtZW50LiAgYGBmb29gYCBhbmQKK3Rha2VzIG9uZSBhcmd1bWVudCwgYGByZXBvcnQudHh0YGAgaXMgYW4gb3B0aW9uIGFyZ3VtZW50LiAgYGBmb29gYCBhbmQKIGBgYmFyYGAgYXJlIHBvc2l0aW9uYWwgYXJndW1lbnRzLgogCiAKQEAgLTI3NSw3ICsyNzUsOCBAQAogc3RyaW5ncyBhcyB5b3UgbGlrZSAoaW5jbHVkaW5nIHplcm8pLCBhcyBsb25nIGFzIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBvcHRpb24KIHN0cmluZyBvdmVyYWxsLgogCi1UaGUgb3B0aW9uIHN0cmluZ3MgcGFzc2VkIHRvIDptZXRoOmBhZGRfb3B0aW9uYCBhcmUgZWZmZWN0aXZlbHkgbGFiZWxzIGZvciB0aGUKK1RoZSBvcHRpb24gc3RyaW5ncyBwYXNzZWQgdG8gOm1ldGg6YE9wdGlvblBhcnNlci5hZGRfb3B0aW9uYCBhcmUgZWZmZWN0aXZlbHkKK2xhYmVscyBmb3IgdGhlCiBvcHRpb24gZGVmaW5lZCBieSB0aGF0IGNhbGwuICBGb3IgYnJldml0eSwgd2Ugd2lsbCBmcmVxdWVudGx5IHJlZmVyIHRvCiAqZW5jb3VudGVyaW5nIGFuIG9wdGlvbiogb24gdGhlIGNvbW1hbmQgbGluZTsgaW4gcmVhbGl0eSwgOm1vZDpgb3B0cGFyc2VgCiBlbmNvdW50ZXJzICpvcHRpb24gc3RyaW5ncyogYW5kIGxvb2tzIHVwIG9wdGlvbnMgZnJvbSB0aGVtLgpAQCAtODk1LDcgKzg5Niw4IEBACiBUaGUgY2Fub25pY2FsIHdheSB0byBjcmVhdGUgYW4gOmNsYXNzOmBPcHRpb25gIGluc3RhbmNlIGlzIHdpdGggdGhlCiA6bWV0aDpgYWRkX29wdGlvbmAgbWV0aG9kIG9mIDpjbGFzczpgT3B0aW9uUGFyc2VyYC4KIAotLi4gbWV0aG9kOjogT3B0aW9uUGFyc2VyLmFkZF9vcHRpb24ob3B0X3N0clssIC4uLl0sIGF0dHI9dmFsdWUsIC4uLikKKy4uIG1ldGhvZDo6IE9wdGlvblBhcnNlci5hZGRfb3B0aW9uKG9wdGlvbikKKyAgICAgICAgICAgIE9wdGlvblBhcnNlci5hZGRfb3B0aW9uKCpvcHRfc3RyLCBhdHRyPXZhbHVlLCAuLi4pCiAKICAgIFRvIGRlZmluZSBhbiBvcHRpb24gd2l0aCBvbmx5IGEgc2hvcnQgb3B0aW9uIHN0cmluZzo6CiAKQEAgLTExNjgsNiArMTE3MCwxNyBAQAogCiAgICAgIG9wdGlvbnMudHJhY2tzLmFwcGVuZChpbnQoIjQiKSkKIAorICBUaGUgYGBhcHBlbmRgYCBhY3Rpb24gY2FsbHMgdGhlIGBgYXBwZW5kYGAgbWV0aG9kIG9uIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZQorICBvcHRpb24uICBUaGlzIG1lYW5zIHRoYXQgYW55IGRlZmF1bHQgdmFsdWUgc3BlY2lmaWVkIG11c3QgaGF2ZSBhbiBgYGFwcGVuZGBgCisgIG1ldGhvZC4gIEl0IGFsc28gbWVhbnMgdGhhdCBpZiB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBub24tZW1wdHksIHRoZSBkZWZhdWx0CisgIGVsZW1lbnRzIHdpbGwgYmUgcHJlc2VudCBpbiB0aGUgcGFyc2VkIHZhbHVlIGZvciB0aGUgb3B0aW9uLCB3aXRoIGFueSB2YWx1ZXMKKyAgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGFwcGVuZGVkIGFmdGVyIHRob3NlIGRlZmF1bHQgdmFsdWVzOjoKKworICAgICA+Pj4gcGFyc2VyLmFkZF9vcHRpb24oIi0tZmlsZXMiLCBhY3Rpb249ImFwcGVuZCIsIGRlZmF1bHQ9Wyd+Ly5teXBrZy9kZWZhdWx0cyddKQorICAgICA+Pj4gb3B0cywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKFsnLS1maWxlcycsICdvdmVycmlkZXMubXlwa2cnXSkKKyAgICAgPj4+IG9wdHMuZmlsZXMKKyAgICAgWyd+Ly5teXBrZy9kZWZhdWx0cycsICdvdmVycmlkZXMubXlwa2cnXQorCiAqIGBgImFwcGVuZF9jb25zdCJgYCBbcmVxdWlyZWQ6IDphdHRyOmB+T3B0aW9uLmNvbnN0YDsgcmVsZXZhbnQ6CiAgIDphdHRyOmB+T3B0aW9uLmRlc3RgXQogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9vcy5wYXRoLnJzdCBiL0RvYy9saWJyYXJ5L29zLnBhdGgucnN0CmluZGV4IDYyYmJkZmYuLmVkM2FhZjQgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L29zLnBhdGgucnN0CisrKyBiL0RvYy9saWJyYXJ5L29zLnBhdGgucnN0CkBAIC0xNiw2ICsxNiwxMSBAQAogICAgOmZ1bmM6YHNwbGl0dW5jYCBhbmQgOmZ1bmM6YGlzbW91bnRgIGRvIGhhbmRsZSB0aGVtIGNvcnJlY3RseS4KIAogCitVbmxpa2UgYSB1bml4IHNoZWxsLCBQeXRob24gZG9lcyBub3QgZG8gYW55ICphdXRvbWF0aWMqIHBhdGggZXhwYW5zaW9ucy4KK0Z1bmN0aW9ucyBzdWNoIGFzIDpmdW5jOmBleHBhbmR1c2VyYCBhbmQgOmZ1bmM6YGV4cGFuZHZhcnNgIGNhbiBiZSBpbnZva2VkCitleHBsaWNpdGx5IHdoZW4gYW4gYXBwbGljYXRpb24gZGVzaXJlcyBzaGVsbC1saWtlIHBhdGggZXhwYW5zaW9uLiAgKFNlZSBhbHNvCit0aGUgOm1vZDpgZ2xvYmAgbW9kdWxlLikKKwogLi4gbm90ZTo6CiAKICAgIFNpbmNlIGRpZmZlcmVudCBvcGVyYXRpbmcgc3lzdGVtcyBoYXZlIGRpZmZlcmVudCBwYXRoIG5hbWUgY29udmVudGlvbnMsIHRoZXJlCkBAIC0zNSwxNSArNDAsMTcgQEAKIC4uIGZ1bmN0aW9uOjogYWJzcGF0aChwYXRoKQogCiAgICBSZXR1cm4gYSBub3JtYWxpemVkIGFic29sdXRpemVkIHZlcnNpb24gb2YgdGhlIHBhdGhuYW1lICpwYXRoKi4gT24gbW9zdAotICAgcGxhdGZvcm1zLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gYGBub3JtcGF0aChqb2luKG9zLmdldGN3ZCgpLCBwYXRoKSlgYC4KKyAgIHBsYXRmb3JtcywgdGhpcyBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgdGhlIGZ1bmN0aW9uIDpmdW5jOmBub3JtcGF0aGAgYXMKKyAgIGZvbGxvd3M6IGBgbm9ybXBhdGgoam9pbihvcy5nZXRjd2QoKSwgcGF0aCkpYGAuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuNS4yCiAKIAogLi4gZnVuY3Rpb246OiBiYXNlbmFtZShwYXRoKQogCi0gICBSZXR1cm4gdGhlIGJhc2UgbmFtZSBvZiBwYXRobmFtZSAqcGF0aCouICBUaGlzIGlzIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgcGFpcgotICAgcmV0dXJuZWQgYnkgYGBzcGxpdChwYXRoKWBgLiAgTm90ZSB0aGF0IHRoZSByZXN1bHQgb2YgdGhpcyBmdW5jdGlvbiBpcyBkaWZmZXJlbnQKKyAgIFJldHVybiB0aGUgYmFzZSBuYW1lIG9mIHBhdGhuYW1lICpwYXRoKi4gIFRoaXMgaXMgdGhlIHNlY29uZCBlbGVtZW50IG9mIHRoZQorICAgcGFpciByZXR1cm5lZCBieSBwYXNzaW5nICpwYXRoKiB0byB0aGUgZnVuY3Rpb24gOmZ1bmM6YHNwbGl0YC4gIE5vdGUgdGhhdAorICAgdGhlIHJlc3VsdCBvZiB0aGlzIGZ1bmN0aW9uIGlzIGRpZmZlcmVudAogICAgZnJvbSB0aGUgVW5peCA6cHJvZ3JhbTpgYmFzZW5hbWVgIHByb2dyYW07IHdoZXJlIDpwcm9ncmFtOmBiYXNlbmFtZWAgZm9yCiAgICBgYCcvZm9vL2Jhci8nYGAgcmV0dXJucyBgYCdiYXInYGAsIHRoZSA6ZnVuYzpgYmFzZW5hbWVgIGZ1bmN0aW9uIHJldHVybnMgYW4KICAgIGVtcHR5IHN0cmluZyAoYGAnJ2BgKS4KQEAgLTU4LDggKzY1LDggQEAKIAogLi4gZnVuY3Rpb246OiBkaXJuYW1lKHBhdGgpCiAKLSAgIFJldHVybiB0aGUgZGlyZWN0b3J5IG5hbWUgb2YgcGF0aG5hbWUgKnBhdGgqLiAgVGhpcyBpcyB0aGUgZmlyc3QgaGFsZiBvZiB0aGUKLSAgIHBhaXIgcmV0dXJuZWQgYnkgYGBzcGxpdChwYXRoKWBgLgorICAgUmV0dXJuIHRoZSBkaXJlY3RvcnkgbmFtZSBvZiBwYXRobmFtZSAqcGF0aCouICBUaGlzIGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mCisgICB0aGUgcGFpciByZXR1cm5lZCBieSBwYXNzaW5nICpwYXRoKiB0byB0aGUgZnVuY3Rpb24gOmZ1bmM6YHNwbGl0YC4KIAogCiAuLiBmdW5jdGlvbjo6IGV4aXN0cyhwYXRoKQpAQCAtMTIwLDcgKzEyNyw3IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjUuMgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuMwotICAgICAgSWYgOmZ1bmM6YG9zLnN0YXRfZmxvYXRfdGltZXNgIHJldHVybnMgVHJ1ZSwgdGhlIHJlc3VsdCBpcyBhIGZsb2F0aW5nIHBvaW50CisgICAgICBJZiA6ZnVuYzpgb3Muc3RhdF9mbG9hdF90aW1lc2AgcmV0dXJucyBgYFRydWVgYCwgdGhlIHJlc3VsdCBpcyBhIGZsb2F0aW5nIHBvaW50CiAgICAgICBudW1iZXIuCiAKIApAQCAtMTMzLDE0ICsxNDAsMTQgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuNS4yCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi4zCi0gICAgICBJZiA6ZnVuYzpgb3Muc3RhdF9mbG9hdF90aW1lc2AgcmV0dXJucyBUcnVlLCB0aGUgcmVzdWx0IGlzIGEgZmxvYXRpbmcgcG9pbnQKKyAgICAgIElmIDpmdW5jOmBvcy5zdGF0X2Zsb2F0X3RpbWVzYCByZXR1cm5zIGBgVHJ1ZWBgLCB0aGUgcmVzdWx0IGlzIGEgZmxvYXRpbmcgcG9pbnQKICAgICAgIG51bWJlci4KIAogCiAuLiBmdW5jdGlvbjo6IGdldGN0aW1lKHBhdGgpCiAKICAgIFJldHVybiB0aGUgc3lzdGVtJ3MgY3RpbWUgd2hpY2gsIG9uIHNvbWUgc3lzdGVtcyAobGlrZSBVbml4KSBpcyB0aGUgdGltZSBvZiB0aGUKLSAgIGxhc3QgY2hhbmdlLCBhbmQsIG9uIG90aGVycyAobGlrZSBXaW5kb3dzKSwgaXMgdGhlIGNyZWF0aW9uIHRpbWUgZm9yICpwYXRoKi4KKyAgIGxhc3QgbWV0YWRhdGEgY2hhbmdlLCBhbmQsIG9uIG90aGVycyAobGlrZSBXaW5kb3dzKSwgaXMgdGhlIGNyZWF0aW9uIHRpbWUgZm9yICpwYXRoKi4KICAgIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBudW1iZXIgZ2l2aW5nIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2ggKHNlZQogICAgdGhlICA6bW9kOmB0aW1lYCBtb2R1bGUpLiAgUmFpc2UgOmV4Yzpgb3MuZXJyb3JgIGlmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0IG9yCiAgICBpcyBpbmFjY2Vzc2libGUuCkBAIC0xNzgsNyArMTg1LDcgQEAKIC4uIGZ1bmN0aW9uOjogaXNsaW5rKHBhdGgpCiAKICAgIFJldHVybiBgYFRydWVgYCBpZiAqcGF0aCogcmVmZXJzIHRvIGEgZGlyZWN0b3J5IGVudHJ5IHRoYXQgaXMgYSBzeW1ib2xpYyBsaW5rLgotICAgQWx3YXlzIGBgRmFsc2VgYCBpZiBzeW1ib2xpYyBsaW5rcyBhcmUgbm90IHN1cHBvcnRlZC4KKyAgIEFsd2F5cyBgYEZhbHNlYGAgaWYgc3ltYm9saWMgbGlua3MgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHB5dGhvbiBydW50aW1lLgogCiAKIC4uIGZ1bmN0aW9uOjogaXNtb3VudChwYXRoKQpAQCAtMjEyLDEzICsyMTksMTEgQEAKIAogLi4gZnVuY3Rpb246OiBub3JtcGF0aChwYXRoKQogCi0gICBOb3JtYWxpemUgYSBwYXRobmFtZS4gIFRoaXMgY29sbGFwc2VzIHJlZHVuZGFudCBzZXBhcmF0b3JzIGFuZCB1cC1sZXZlbAotICAgcmVmZXJlbmNlcyBzbyB0aGF0IGBgQS8vQmBgLCBgYEEvQi9gYCwgYGBBLy4vQmBgIGFuZCBgYEEvZm9vLy4uL0JgYCBhbGwgYmVjb21lCi0gICBgYEEvQmBgLgotCi0gICBJdCBkb2VzIG5vdCBub3JtYWxpemUgdGhlIGNhc2UgKHVzZSA6ZnVuYzpgbm9ybWNhc2VgIGZvciB0aGF0KS4gIE9uIFdpbmRvd3MsIGl0Ci0gICBjb252ZXJ0cyBmb3J3YXJkIHNsYXNoZXMgdG8gYmFja3dhcmQgc2xhc2hlcy4gSXQgc2hvdWxkIGJlIHVuZGVyc3Rvb2QgdGhhdCB0aGlzCi0gICBtYXkgY2hhbmdlIHRoZSBtZWFuaW5nIG9mIHRoZSBwYXRoIGlmIGl0IGNvbnRhaW5zIHN5bWJvbGljIGxpbmtzIQorICAgTm9ybWFsaXplIGEgcGF0aG5hbWUgYnkgY29sbGFwc2luZyByZWR1bmRhbnQgc2VwYXJhdG9ycyBhbmQgdXAtbGV2ZWwKKyAgIHJlZmVyZW5jZXMgc28gdGhhdCBgYEEvL0JgYCwgYGBBL0IvYGAsIGBgQS8uL0JgYCBhbmQgYGBBL2Zvby8uLi9CYGAgYWxsCisgICBiZWNvbWUgYGBBL0JgYC4gIFRoaXMgc3RyaW5nIG1hbmlwdWxhdGlvbiBtYXkgY2hhbmdlIHRoZSBtZWFuaW5nIG9mIGEgcGF0aAorICAgdGhhdCBjb250YWlucyBzeW1ib2xpYyBsaW5rcy4gIE9uIFdpbmRvd3MsIGl0IGNvbnZlcnRzIGZvcndhcmQgc2xhc2hlcyB0bworICAgYmFja3dhcmQgc2xhc2hlcy4gVG8gbm9ybWFsaXplIGNhc2UsIHVzZSA6ZnVuYzpgbm9ybWNhc2VgLgogCiAKIC4uIGZ1bmN0aW9uOjogcmVhbHBhdGgocGF0aCkKQEAgLTIzMSw4ICsyMzYsMTAgQEAKIAogLi4gZnVuY3Rpb246OiByZWxwYXRoKHBhdGhbLCBzdGFydF0pCiAKLSAgIFJldHVybiBhIHJlbGF0aXZlIGZpbGVwYXRoIHRvICpwYXRoKiBlaXRoZXIgZnJvbSB0aGUgY3VycmVudCBkaXJlY3Rvcnkgb3IgZnJvbQotICAgYW4gb3B0aW9uYWwgKnN0YXJ0KiBwb2ludC4KKyAgIFJldHVybiBhIHJlbGF0aXZlIGZpbGVwYXRoIHRvICpwYXRoKiBlaXRoZXIgZnJvbSB0aGUgY3VycmVudCBkaXJlY3Rvcnkgb3IKKyAgIGZyb20gYW4gb3B0aW9uYWwgKnN0YXJ0KiBkaXJlY3RvcnkuICBUaGlzIGlzIGEgcGF0aCBjb21wdXRhdGlvbjogIHRoZQorICAgZmlsZXN5c3RlbSBpcyBub3QgYWNjZXNzZWQgdG8gY29uZmlybSB0aGUgZXhpc3RlbmNlIG9yIG5hdHVyZSBvZiAqcGF0aCogb3IKKyAgICpzdGFydCouCiAKICAgICpzdGFydCogZGVmYXVsdHMgdG8gOmF0dHI6YG9zLmN1cmRpcmAuCiAKQEAgLTI2MCw5ICsyNjcsOSBAQAogLi4gZnVuY3Rpb246OiBzYW1lc3RhdChzdGF0MSwgc3RhdDIpCiAKICAgIFJldHVybiBgYFRydWVgYCBpZiB0aGUgc3RhdCB0dXBsZXMgKnN0YXQxKiBhbmQgKnN0YXQyKiByZWZlciB0byB0aGUgc2FtZSBmaWxlLgotICAgVGhlc2Ugc3RydWN0dXJlcyBtYXkgaGF2ZSBiZWVuIHJldHVybmVkIGJ5IDpmdW5jOmBmc3RhdGAsIDpmdW5jOmBsc3RhdGAsIG9yCi0gICA6ZnVuYzpgc3RhdGAuICBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIHVuZGVybHlpbmcgY29tcGFyaXNvbiB1c2VkIGJ5Ci0gICA6ZnVuYzpgc2FtZWZpbGVgIGFuZCA6ZnVuYzpgc2FtZW9wZW5maWxlYC4KKyAgIFRoZXNlIHN0cnVjdHVyZXMgbWF5IGhhdmUgYmVlbiByZXR1cm5lZCBieSA6ZnVuYzpgb3MuZnN0YXRgLAorICAgOmZ1bmM6YG9zLmxzdGF0YCwgb3IgOmZ1bmM6YG9zLnN0YXRgLiAgVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZQorICAgdW5kZXJseWluZyBjb21wYXJpc29uIHVzZWQgYnkgOmZ1bmM6YHNhbWVmaWxlYCBhbmQgOmZ1bmM6YHNhbWVvcGVuZmlsZWAuCiAKICAgIEF2YWlsYWJpbGl0eTogVW5peC4KIApAQCAtMjc2LDcgKzI4Myw4IEBACiAgICAqcGF0aCogaXMgZW1wdHksIGJvdGggKmhlYWQqIGFuZCAqdGFpbCogYXJlIGVtcHR5LiAgVHJhaWxpbmcgc2xhc2hlcyBhcmUKICAgIHN0cmlwcGVkIGZyb20gKmhlYWQqIHVubGVzcyBpdCBpcyB0aGUgcm9vdCAob25lIG9yIG1vcmUgc2xhc2hlcyBvbmx5KS4gIEluCiAgICBhbGwgY2FzZXMsIGBgam9pbihoZWFkLCB0YWlsKWBgIHJldHVybnMgYSBwYXRoIHRvIHRoZSBzYW1lIGxvY2F0aW9uIGFzICpwYXRoKgotICAgKGJ1dCB0aGUgc3RyaW5ncyBtYXkgZGlmZmVyKS4KKyAgIChidXQgdGhlIHN0cmluZ3MgbWF5IGRpZmZlcikuICBBbHNvIHNlZSB0aGUgZnVuY3Rpb25zIDpmdW5jOmBkaXJuYW1lYCBhbmQKKyAgIDpmdW5jOmBiYXNlbmFtZWAuCiAKIAogLi4gZnVuY3Rpb246OiBzcGxpdGRyaXZlKHBhdGgpCkBAIC0zMzEsMTMgKzMzOSwxMyBAQAogCiAgICAuLiBub3RlOjoKIAotICAgICAgVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIGFuZCBoYXMgYmVlbiByZW1vdmVkIGluIDMuMCBpbiBmYXZvciBvZgorICAgICAgVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIGFuZCBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzIGluIGZhdm9yIG9mCiAgICAgICA6ZnVuYzpgb3Mud2Fsa2AuCiAKIAogLi4gZGF0YTo6IHN1cHBvcnRzX3VuaWNvZGVfZmlsZW5hbWVzCiAKLSAgIFRydWUgaWYgYXJiaXRyYXJ5IFVuaWNvZGUgc3RyaW5ncyBjYW4gYmUgdXNlZCBhcyBmaWxlIG5hbWVzICh3aXRoaW4gbGltaXRhdGlvbnMKKyAgIGBgVHJ1ZWBgIGlmIGFyYml0cmFyeSBVbmljb2RlIHN0cmluZ3MgY2FuIGJlIHVzZWQgYXMgZmlsZSBuYW1lcyAod2l0aGluIGxpbWl0YXRpb25zCiAgICBpbXBvc2VkIGJ5IHRoZSBmaWxlIHN5c3RlbSkuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMwpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvb3MucnN0IGIvRG9jL2xpYnJhcnkvb3MucnN0CmluZGV4IDJjODYwNzYuLjMyMDUxYzAgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L29zLnJzdAorKysgYi9Eb2MvbGlicmFyeS9vcy5yc3QKQEAgLTcyLDcgKzcyLDcgQEAKIAogLi4gZGF0YTo6IGVudmlyb24KIAotICAgQSBtYXBwaW5nIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHN0cmluZyBlbnZpcm9ubWVudC4gRm9yIGV4YW1wbGUsCisgICBBIDp0ZXJtOmBtYXBwaW5nYCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzdHJpbmcgZW52aXJvbm1lbnQuIEZvciBleGFtcGxlLAogICAgYGBlbnZpcm9uWydIT01FJ11gYCBpcyB0aGUgcGF0aG5hbWUgb2YgeW91ciBob21lIGRpcmVjdG9yeSAob24gc29tZSBwbGF0Zm9ybXMpLAogICAgYW5kIGlzIGVxdWl2YWxlbnQgdG8gYGBnZXRlbnYoIkhPTUUiKWBgIGluIEMuCiAKQEAgLTk0LDcgKzk0LDcgQEAKIAogICAgICAgT24gc29tZSBwbGF0Zm9ybXMsIGluY2x1ZGluZyBGcmVlQlNEIGFuZCBNYWMgT1MgWCwgc2V0dGluZyBgYGVudmlyb25gYCBtYXkKICAgICAgIGNhdXNlIG1lbW9yeSBsZWFrcy4gIFJlZmVyIHRvIHRoZSBzeXN0ZW0gZG9jdW1lbnRhdGlvbiBmb3IKLSAgICAgIDpjZnVuYzpgcHV0ZW52YC4KKyAgICAgIDpjOmZ1bmM6YHB1dGVudmAuCiAKICAgIElmIDpmdW5jOmBwdXRlbnZgIGlzIG5vdCBwcm92aWRlZCwgYSBtb2RpZmllZCBjb3B5IG9mIHRoaXMgbWFwcGluZyAgbWF5IGJlCiAgICBwYXNzZWQgdG8gdGhlIGFwcHJvcHJpYXRlIHByb2Nlc3MtY3JlYXRpb24gZnVuY3Rpb25zIHRvIGNhdXNlICBjaGlsZCBwcm9jZXNzZXMKQEAgLTE1Nyw2ICsxNTcsMjIgQEAKIAogICAgQXZhaWxhYmlsaXR5OiBVbml4LgogCisgICAuLiBub3RlOjoKKworICAgICAgT24gTWFjIE9TIFgsIDpmdW5jOmBnZXRncm91cHNgIGJlaGF2aW9yIGRpZmZlcnMgc29tZXdoYXQgZnJvbQorICAgICAgb3RoZXIgVW5peCBwbGF0Zm9ybXMuIElmIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgd2FzIGJ1aWx0IHdpdGggYQorICAgICAgZGVwbG95bWVudCB0YXJnZXQgb2YgOmNvbnN0OmAxMC41YCBvciBlYXJsaWVyLCA6ZnVuYzpgZ2V0Z3JvdXBzYCByZXR1cm5zCisgICAgICB0aGUgbGlzdCBvZiBlZmZlY3RpdmUgZ3JvdXAgaWRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCB1c2VyIHByb2Nlc3M7CisgICAgICB0aGlzIGxpc3QgaXMgbGltaXRlZCB0byBhIHN5c3RlbS1kZWZpbmVkIG51bWJlciBvZiBlbnRyaWVzLCB0eXBpY2FsbHkgMTYsCisgICAgICBhbmQgbWF5IGJlIG1vZGlmaWVkIGJ5IGNhbGxzIHRvIDpmdW5jOmBzZXRncm91cHNgIGlmIHN1aXRhYmx5IHByaXZpbGVnZWQuCisgICAgICBJZiBidWlsdCB3aXRoIGEgZGVwbG95bWVudCB0YXJnZXQgZ3JlYXRlciB0aGFuIDpjb25zdDpgMTAuNWAsCisgICAgICA6ZnVuYzpgZ2V0Z3JvdXBzYCByZXR1cm5zIHRoZSBjdXJyZW50IGdyb3VwIGFjY2VzcyBsaXN0IGZvciB0aGUgdXNlcgorICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBlZmZlY3RpdmUgdXNlciBpZCBvZiB0aGUgcHJvY2VzczsgdGhlIGdyb3VwIGFjY2VzcworICAgICAgbGlzdCBtYXkgY2hhbmdlIG92ZXIgdGhlIGxpZmV0aW1lIG9mIHRoZSBwcm9jZXNzLCBpdCBpcyBub3QgYWZmZWN0ZWQgYnkKKyAgICAgIGNhbGxzIHRvIDpmdW5jOmBzZXRncm91cHNgLCBhbmQgaXRzIGxlbmd0aCBpcyBub3QgbGltaXRlZCB0byAxNi4gIFRoZQorICAgICAgZGVwbG95bWVudCB0YXJnZXQgdmFsdWUsIDpjb25zdDpgTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUYCwgY2FuIGJlCisgICAgICBvYnRhaW5lZCB3aXRoIDpmdW5jOmBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXJgLgorCiAKIC4uIGZ1bmN0aW9uOjogaW5pdGdyb3Vwcyh1c2VybmFtZSwgZ2lkKQogCkBAIC0yNDEsNyArMjU3LDcgQEAKIAogICAgLi4gaW5kZXg6OiBzaW5nbGU6IHVzZXI7IGlkCiAKLSAgIFJldHVybiB0aGUgY3VycmVudCBwcm9jZXNzJ3MgdXNlciBpZC4KKyAgIFJldHVybiB0aGUgY3VycmVudCBwcm9jZXNzJ3MgcmVhbCB1c2VyIGlkLgogCiAgICBBdmFpbGFiaWxpdHk6IFVuaXguCiAKQEAgLTMwNiwxMCArMzIyLDE0IEBACiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMgogCisgICAuLiBub3RlOjogT24gTWFjIE9TIFgsIHRoZSBsZW5ndGggb2YgKmdyb3VwcyogbWF5IG5vdCBleGNlZWQgdGhlCisgICAgICBzeXN0ZW0tZGVmaW5lZCBtYXhpbXVtIG51bWJlciBvZiBlZmZlY3RpdmUgZ3JvdXAgaWRzLCB0eXBpY2FsbHkgMTYuCisgICAgICBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIDpmdW5jOmBnZXRncm91cHNgIGZvciBjYXNlcyB3aGVyZSBpdCBtYXkgbm90CisgICAgICByZXR1cm4gdGhlIHNhbWUgZ3JvdXAgbGlzdCBzZXQgYnkgY2FsbGluZyBzZXRncm91cHMoKS4KIAogLi4gZnVuY3Rpb246OiBzZXRwZ3JwKCkKIAotICAgQ2FsbCB0aGUgc3lzdGVtIGNhbGwgOmNmdW5jOmBzZXRwZ3JwYCBvciA6Y2Z1bmM6YHNldHBncnAoMCwgMClgIGRlcGVuZGluZyBvbgorICAgQ2FsbCB0aGUgc3lzdGVtIGNhbGwgOmM6ZnVuYzpgc2V0cGdycGAgb3IgOmM6ZnVuYzpgc2V0cGdycCgwLCAwKWAgZGVwZW5kaW5nIG9uCiAgICB3aGljaCB2ZXJzaW9uIGlzIGltcGxlbWVudGVkIChpZiBhbnkpLiAgU2VlIHRoZSBVbml4IG1hbnVhbCBmb3IgdGhlIHNlbWFudGljcy4KIAogICAgQXZhaWxhYmlsaXR5OiBVbml4LgpAQCAtMzE3LDcgKzMzNyw3IEBACiAKIC4uIGZ1bmN0aW9uOjogc2V0cGdpZChwaWQsIHBncnApCiAKLSAgIENhbGwgdGhlIHN5c3RlbSBjYWxsIDpjZnVuYzpgc2V0cGdpZGAgdG8gc2V0IHRoZSBwcm9jZXNzIGdyb3VwIGlkIG9mIHRoZQorICAgQ2FsbCB0aGUgc3lzdGVtIGNhbGwgOmM6ZnVuYzpgc2V0cGdpZGAgdG8gc2V0IHRoZSBwcm9jZXNzIGdyb3VwIGlkIG9mIHRoZQogICAgcHJvY2VzcyB3aXRoIGlkICpwaWQqIHRvIHRoZSBwcm9jZXNzIGdyb3VwIHdpdGggaWQgKnBncnAqLiAgU2VlIHRoZSBVbml4IG1hbnVhbAogICAgZm9yIHRoZSBzZW1hbnRpY3MuCiAKQEAgLTM1OCw3ICszNzgsNyBAQAogCiAuLiBmdW5jdGlvbjo6IGdldHNpZChwaWQpCiAKLSAgIENhbGwgdGhlIHN5c3RlbSBjYWxsIDpjZnVuYzpgZ2V0c2lkYC4gIFNlZSB0aGUgVW5peCBtYW51YWwgZm9yIHRoZSBzZW1hbnRpY3MuCisgICBDYWxsIHRoZSBzeXN0ZW0gY2FsbCA6YzpmdW5jOmBnZXRzaWRgLiAgU2VlIHRoZSBVbml4IG1hbnVhbCBmb3IgdGhlIHNlbWFudGljcy4KIAogICAgQXZhaWxhYmlsaXR5OiBVbml4LgogCkBAIC0zNjcsNyArMzg3LDcgQEAKIAogLi4gZnVuY3Rpb246OiBzZXRzaWQoKQogCi0gICBDYWxsIHRoZSBzeXN0ZW0gY2FsbCA6Y2Z1bmM6YHNldHNpZGAuICBTZWUgdGhlIFVuaXggbWFudWFsIGZvciB0aGUgc2VtYW50aWNzLgorICAgQ2FsbCB0aGUgc3lzdGVtIGNhbGwgOmM6ZnVuYzpgc2V0c2lkYC4gIFNlZSB0aGUgVW5peCBtYW51YWwgZm9yIHRoZSBzZW1hbnRpY3MuCiAKICAgIEF2YWlsYWJpbGl0eTogVW5peC4KIApAQCAtMzg1LDcgKzQwNSw3IEBACiAuLiBmdW5jdGlvbjo6IHN0cmVycm9yKGNvZGUpCiAKICAgIFJldHVybiB0aGUgZXJyb3IgbWVzc2FnZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBlcnJvciBjb2RlIGluICpjb2RlKi4KLSAgIE9uIHBsYXRmb3JtcyB3aGVyZSA6Y2Z1bmM6YHN0cmVycm9yYCByZXR1cm5zIGBgTlVMTGBgIHdoZW4gZ2l2ZW4gYW4gdW5rbm93bgorICAgT24gcGxhdGZvcm1zIHdoZXJlIDpjOmZ1bmM6YHN0cmVycm9yYCByZXR1cm5zIGBgTlVMTGBgIHdoZW4gZ2l2ZW4gYW4gdW5rbm93bgogICAgZXJyb3IgbnVtYmVyLCA6ZXhjOmBWYWx1ZUVycm9yYCBpcyByYWlzZWQuCiAKICAgIEF2YWlsYWJpbGl0eTogVW5peCwgV2luZG93cy4KQEAgLTQ0Myw4ICs0NjMsOSBAQAogICAgLi4gaW5kZXg6OiBzaW5nbGU6IEkvTyBjb250cm9sOyBidWZmZXJpbmcKIAogICAgUmV0dXJuIGFuIG9wZW4gZmlsZSBvYmplY3QgY29ubmVjdGVkIHRvIHRoZSBmaWxlIGRlc2NyaXB0b3IgKmZkKi4gIFRoZSAqbW9kZSoKLSAgIGFuZCAqYnVmc2l6ZSogYXJndW1lbnRzIGhhdmUgdGhlIHNhbWUgbWVhbmluZyBhcyB0aGUgY29ycmVzcG9uZGluZyBhcmd1bWVudHMgdG8KLSAgIHRoZSBidWlsdC1pbiA6ZnVuYzpgb3BlbmAgZnVuY3Rpb24uCisgICBhbmQgKmJ1ZnNpemUqIGFyZ3VtZW50cyBoYXZlIHRoZSBzYW1lIG1lYW5pbmcgYXMgdGhlIGNvcnJlc3BvbmRpbmcgYXJndW1lbnRzCisgICB0byB0aGUgYnVpbHQtaW4gOmZ1bmM6YG9wZW5gIGZ1bmN0aW9uLiAgSWYgOmZ1bmM6YGZkb3BlbmAgcmFpc2VzIGFuCisgICBleGNlcHRpb24sIGl0IGxlYXZlcyAqZmQqIHVudG91Y2hlZCAodW5jbG9zZWQpLgogCiAgICBBdmFpbGFiaWxpdHk6IFVuaXgsIFdpbmRvd3MuCiAKQEAgLTQ1NCw3ICs0NzUsNyBAQAogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQogICAgICAgT24gVW5peCwgd2hlbiB0aGUgKm1vZGUqIGFyZ3VtZW50IHN0YXJ0cyB3aXRoIGBgJ2EnYGAsIHRoZSAqT19BUFBFTkQqIGZsYWcgaXMKLSAgICAgIHNldCBvbiB0aGUgZmlsZSBkZXNjcmlwdG9yICh3aGljaCB0aGUgOmNmdW5jOmBmZG9wZW5gIGltcGxlbWVudGF0aW9uIGFscmVhZHkKKyAgICAgIHNldCBvbiB0aGUgZmlsZSBkZXNjcmlwdG9yICh3aGljaCB0aGUgOmM6ZnVuYzpgZmRvcGVuYCBpbXBsZW1lbnRhdGlvbiBhbHJlYWR5CiAgICAgICBkb2VzIG9uIG1vc3QgcGxhdGZvcm1zKS4KIAogCkBAIC00NzcsNyArNDk4LDcgQEAKIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjAKICAgICAgIFRoaXMgZnVuY3Rpb24gd29ya2VkIHVucmVsaWFibHkgdW5kZXIgV2luZG93cyBpbiBlYXJsaWVyIHZlcnNpb25zIG9mIFB5dGhvbi4KLSAgICAgIFRoaXMgd2FzIGR1ZSB0byB0aGUgdXNlIG9mIHRoZSA6Y2Z1bmM6YF9wb3BlbmAgZnVuY3Rpb24gZnJvbSB0aGUgbGlicmFyaWVzCisgICAgICBUaGlzIHdhcyBkdWUgdG8gdGhlIHVzZSBvZiB0aGUgOmM6ZnVuYzpgX3BvcGVuYCBmdW5jdGlvbiBmcm9tIHRoZSBsaWJyYXJpZXMKICAgICAgIHByb3ZpZGVkIHdpdGggV2luZG93cy4gIE5ld2VyIHZlcnNpb25zIG9mIFB5dGhvbiBkbyBub3QgdXNlIHRoZSBicm9rZW4KICAgICAgIGltcGxlbWVudGF0aW9uIGZyb20gdGhlIFdpbmRvd3MgbGlicmFyaWVzLgogCkBAIC01OTcsNyArNjE4LDcgQEAKICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgZm9yIGxvdy1sZXZlbCBJL08gYW5kIG11c3QgYmUgYXBwbGllZCB0byBhIGZpbGUKICAgICAgIGRlc2NyaXB0b3IgYXMgcmV0dXJuZWQgYnkgOmZ1bmM6YG9zLm9wZW5gIG9yIDpmdW5jOmBwaXBlYC4gIFRvIGNsb3NlIGEgImZpbGUKICAgICAgIG9iamVjdCIgcmV0dXJuZWQgYnkgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIDpmdW5jOmBvcGVuYCBvciBieSA6ZnVuYzpgcG9wZW5gIG9yCi0gICAgICA6ZnVuYzpgZmRvcGVuYCwgdXNlIGl0cyA6bWV0aDpgfmZpbGUuY2xvc2VgIG1ldGhvZC4KKyAgICAgIDpmdW5jOmBmZG9wZW5gLCB1c2UgaXRzIDptZXRoOmB+aW8uSU9CYXNlLmNsb3NlYCBtZXRob2QuCiAKIAogLi4gZnVuY3Rpb246OiBjbG9zZXJhbmdlKGZkX2xvdywgZmRfaGlnaCkKQEAgLTY5Nyw3ICs3MTgsNyBAQAogLi4gZnVuY3Rpb246OiBmc3luYyhmZCkKIAogICAgRm9yY2Ugd3JpdGUgb2YgZmlsZSB3aXRoIGZpbGVkZXNjcmlwdG9yICpmZCogdG8gZGlzay4gIE9uIFVuaXgsIHRoaXMgY2FsbHMgdGhlCi0gICBuYXRpdmUgOmNmdW5jOmBmc3luY2AgZnVuY3Rpb247IG9uIFdpbmRvd3MsIHRoZSBNUyA6Y2Z1bmM6YF9jb21taXRgIGZ1bmN0aW9uLgorICAgbmF0aXZlIDpjOmZ1bmM6YGZzeW5jYCBmdW5jdGlvbjsgb24gV2luZG93cywgdGhlIE1TIDpjOmZ1bmM6YF9jb21taXRgIGZ1bmN0aW9uLgogCiAgICBJZiB5b3UncmUgc3RhcnRpbmcgd2l0aCBhIFB5dGhvbiBmaWxlIG9iamVjdCAqZiosIGZpcnN0IGRvIGBgZi5mbHVzaCgpYGAsIGFuZAogICAgdGhlbiBkbyBgYG9zLmZzeW5jKGYuZmlsZW5vKCkpYGAsIHRvIGVuc3VyZSB0aGF0IGFsbCBpbnRlcm5hbCBidWZmZXJzIGFzc29jaWF0ZWQKQEAgLTcxOSwxNiArNzQwLDE0IEBACiAgICBSZXR1cm4gYGBUcnVlYGAgaWYgdGhlIGZpbGUgZGVzY3JpcHRvciAqZmQqIGlzIG9wZW4gYW5kIGNvbm5lY3RlZCB0byBhCiAgICB0dHkoLWxpa2UpIGRldmljZSwgZWxzZSBgYEZhbHNlYGAuCiAKLSAgIEF2YWlsYWJpbGl0eTogVW5peC4KLQogCiAuLiBmdW5jdGlvbjo6IGxzZWVrKGZkLCBwb3MsIGhvdykKIAogICAgU2V0IHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIGZpbGUgZGVzY3JpcHRvciAqZmQqIHRvIHBvc2l0aW9uICpwb3MqLCBtb2RpZmllZAogICAgYnkgKmhvdyo6IDpjb25zdDpgU0VFS19TRVRgIG9yIGBgMGBgIHRvIHNldCB0aGUgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlCiAgICBiZWdpbm5pbmcgb2YgdGhlIGZpbGU7IDpjb25zdDpgU0VFS19DVVJgIG9yIGBgMWBgIHRvIHNldCBpdCByZWxhdGl2ZSB0byB0aGUKLSAgIGN1cnJlbnQgcG9zaXRpb247IDpjb25zdDpgb3MuU0VFS19FTkRgIG9yIGBgMmBgIHRvIHNldCBpdCByZWxhdGl2ZSB0byB0aGUgZW5kIG9mCi0gICB0aGUgZmlsZS4KKyAgIGN1cnJlbnQgcG9zaXRpb247IDpjb25zdDpgU0VFS19FTkRgIG9yIGBgMmBgIHRvIHNldCBpdCByZWxhdGl2ZSB0byB0aGUgZW5kIG9mCisgICB0aGUgZmlsZS4gUmV0dXJuIHRoZSBuZXcgY3Vyc29yIHBvc2l0aW9uIGluIGJ5dGVzLCBzdGFydGluZyBmcm9tIHRoZSBiZWdpbm5pbmcuCiAKICAgIEF2YWlsYWJpbGl0eTogVW5peCwgV2luZG93cy4KIApAQCAtMTE0Miw3ICsxMTYxLDcgQEAKIAogLi4gZnVuY3Rpb246OiBsc3RhdChwYXRoKQogCi0gICBQZXJmb3JtIHRoZSBlcXVpdmFsZW50IG9mIGFuIDpjZnVuYzpgbHN0YXRgIHN5c3RlbSBjYWxsIG9uIHRoZSBnaXZlbiBwYXRoLgorICAgUGVyZm9ybSB0aGUgZXF1aXZhbGVudCBvZiBhbiA6YzpmdW5jOmBsc3RhdGAgc3lzdGVtIGNhbGwgb24gdGhlIGdpdmVuIHBhdGguCiAgICBTaW1pbGFyIHRvIDpmdW5jOmB+b3Muc3RhdGAsIGJ1dCBkb2VzIG5vdCBmb2xsb3cgc3ltYm9saWMgbGlua3MuICBPbgogICAgcGxhdGZvcm1zIHRoYXQgZG8gbm90IHN1cHBvcnQgc3ltYm9saWMgbGlua3MsIHRoaXMgaXMgYW4gYWxpYXMgZm9yCiAgICA6ZnVuYzpgfm9zLnN0YXRgLgpAQCAtMTE2Myw3ICsxMTgyLDcgQEAKICAgIGRvZXNuJ3Qgb3BlbiB0aGUgRklGTyAtLS0gaXQganVzdCBjcmVhdGVzIHRoZSByZW5kZXp2b3VzIHBvaW50LgogCiAKLS4uIGZ1bmN0aW9uOjogbWtub2QoZmlsZW5hbWVbLCBtb2RlPTA2MDAsIGRldmljZV0pCisuLiBmdW5jdGlvbjo6IG1rbm9kKGZpbGVuYW1lWywgbW9kZT0wNjAwWywgZGV2aWNlPTBdXSkKIAogICAgQ3JlYXRlIGEgZmlsZXN5c3RlbSBub2RlIChmaWxlLCBkZXZpY2Ugc3BlY2lhbCBmaWxlIG9yIG5hbWVkIHBpcGUpIG5hbWVkCiAgICAqZmlsZW5hbWUqLiAqbW9kZSogc3BlY2lmaWVzIGJvdGggdGhlIHBlcm1pc3Npb25zIHRvIHVzZSBhbmQgdGhlIHR5cGUgb2Ygbm9kZSB0bwpAQCAtMTE4MCw3ICsxMTk5LDcgQEAKIC4uIGZ1bmN0aW9uOjogbWFqb3IoZGV2aWNlKQogCiAgICBFeHRyYWN0IHRoZSBkZXZpY2UgbWFqb3IgbnVtYmVyIGZyb20gYSByYXcgZGV2aWNlIG51bWJlciAodXN1YWxseSB0aGUKLSAgIDphdHRyOmBzdF9kZXZgIG9yIDphdHRyOmBzdF9yZGV2YCBmaWVsZCBmcm9tIDpjdHlwZTpgc3RhdGApLgorICAgOmF0dHI6YHN0X2RldmAgb3IgOmF0dHI6YHN0X3JkZXZgIGZpZWxkIGZyb20gOmM6dHlwZTpgc3RhdGApLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjMKIApAQCAtMTE4OCw3ICsxMjA3LDcgQEAKIC4uIGZ1bmN0aW9uOjogbWlub3IoZGV2aWNlKQogCiAgICBFeHRyYWN0IHRoZSBkZXZpY2UgbWlub3IgbnVtYmVyIGZyb20gYSByYXcgZGV2aWNlIG51bWJlciAodXN1YWxseSB0aGUKLSAgIDphdHRyOmBzdF9kZXZgIG9yIDphdHRyOmBzdF9yZGV2YCBmaWVsZCBmcm9tIDpjdHlwZTpgc3RhdGApLgorICAgOmF0dHI6YHN0X2RldmAgb3IgOmF0dHI6YHN0X3JkZXZgIGZpZWxkIGZyb20gOmM6dHlwZTpgc3RhdGApLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjMKIApAQCAtMTM0MywxMSArMTM2MiwxMSBAQAogCiAuLiBmdW5jdGlvbjo6IHN0YXQocGF0aCkKIAotICAgUGVyZm9ybSB0aGUgZXF1aXZhbGVudCBvZiBhIDpjZnVuYzpgc3RhdGAgc3lzdGVtIGNhbGwgb24gdGhlIGdpdmVuIHBhdGguCisgICBQZXJmb3JtIHRoZSBlcXVpdmFsZW50IG9mIGEgOmM6ZnVuYzpgc3RhdGAgc3lzdGVtIGNhbGwgb24gdGhlIGdpdmVuIHBhdGguCiAgICAoVGhpcyBmdW5jdGlvbiBmb2xsb3dzIHN5bWxpbmtzOyB0byBzdGF0IGEgc3ltbGluayB1c2UgOmZ1bmM6YGxzdGF0YC4pCiAKICAgIFRoZSByZXR1cm4gdmFsdWUgaXMgYW4gb2JqZWN0IHdob3NlIGF0dHJpYnV0ZXMgY29ycmVzcG9uZCB0byB0aGUgbWVtYmVycwotICAgb2YgdGhlIDpjdHlwZTpgc3RhdGAgc3RydWN0dXJlLCBuYW1lbHk6CisgICBvZiB0aGUgOmM6dHlwZTpgc3RhdGAgc3RydWN0dXJlLCBuYW1lbHk6CiAKICAgICogOmF0dHI6YHN0X21vZGVgIC0gcHJvdGVjdGlvbiBiaXRzLAogICAgKiA6YXR0cjpgc3RfaW5vYCAtIGlub2RlIG51bWJlciwKQEAgLTEzNjMsMTUgKzEzODIsMTQgQEAKIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjMKICAgICAgIElmIDpmdW5jOmBzdGF0X2Zsb2F0X3RpbWVzYCByZXR1cm5zIGBgVHJ1ZWBgLCB0aGUgdGltZSB2YWx1ZXMgYXJlIGZsb2F0cywgbWVhc3VyaW5nCi0gICAgICBzZWNvbmRzLiBGcmFjdGlvbnMgb2YgYSBzZWNvbmQgbWF5IGJlIHJlcG9ydGVkIGlmIHRoZSBzeXN0ZW0gc3VwcG9ydHMgdGhhdC4gT24KLSAgICAgIE1hYyBPUywgdGhlIHRpbWVzIGFyZSBhbHdheXMgZmxvYXRzLiBTZWUgOmZ1bmM6YHN0YXRfZmxvYXRfdGltZXNgIGZvciBmdXJ0aGVyCi0gICAgICBkaXNjdXNzaW9uLgorICAgICAgc2Vjb25kcy4gRnJhY3Rpb25zIG9mIGEgc2Vjb25kIG1heSBiZSByZXBvcnRlZCBpZiB0aGUgc3lzdGVtIHN1cHBvcnRzIHRoYXQuCisgICAgICBTZWUgOmZ1bmM6YHN0YXRfZmxvYXRfdGltZXNgIGZvciBmdXJ0aGVyIGRpc2N1c3Npb24uCiAKICAgIE9uIHNvbWUgVW5peCBzeXN0ZW1zIChzdWNoIGFzIExpbnV4KSwgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIG1heSBhbHNvIGJlCiAgICBhdmFpbGFibGU6CiAKLSAgICogOmF0dHI6YHN0X2Jsb2Nrc2AgLSBudW1iZXIgb2YgYmxvY2tzIGFsbG9jYXRlZCBmb3IgZmlsZQotICAgKiA6YXR0cjpgc3RfYmxrc2l6ZWAgLSBmaWxlc3lzdGVtIGJsb2Nrc2l6ZQorICAgKiA6YXR0cjpgc3RfYmxvY2tzYCAtIG51bWJlciBvZiA1MTItYnl0ZSBibG9ja3MgYWxsb2NhdGVkIGZvciBmaWxlCisgICAqIDphdHRyOmBzdF9ibGtzaXplYCAtIGZpbGVzeXN0ZW0gYmxvY2tzaXplIGZvciBlZmZpY2llbnQgZmlsZSBzeXN0ZW0gSS9PCiAgICAqIDphdHRyOmBzdF9yZGV2YCAtIHR5cGUgb2YgZGV2aWNlIGlmIGFuIGlub2RlIGRldmljZQogICAgKiA6YXR0cjpgc3RfZmxhZ3NgIC0gdXNlciBkZWZpbmVkIGZsYWdzIGZvciBmaWxlCiAKQEAgLTEzODEsMTIgKzEzOTksNiBAQAogICAgKiA6YXR0cjpgc3RfZ2VuYCAtIGZpbGUgZ2VuZXJhdGlvbiBudW1iZXIKICAgICogOmF0dHI6YHN0X2JpcnRodGltZWAgLSB0aW1lIG9mIGZpbGUgY3JlYXRpb24KIAotICAgT24gTWFjIE9TIHN5c3RlbXMsIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBtYXkgYWxzbyBiZSBhdmFpbGFibGU6Ci0KLSAgICogOmF0dHI6YHN0X3JzaXplYAotICAgKiA6YXR0cjpgc3RfY3JlYXRvcmAKLSAgICogOmF0dHI6YHN0X3R5cGVgCi0KICAgIE9uIFJJU0NPUyBzeXN0ZW1zLCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGFsc28gYXZhaWxhYmxlOgogCiAgICAqIDphdHRyOmBzdF9mdHlwZWAgKGZpbGUgdHlwZSkKQEAgLTE0MDQsNyArMTQxNiw3IEBACiAKICAgIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgcmV0dXJuIHZhbHVlIG9mIDpmdW5jOmB+b3Muc3RhdGAgaXMgYWxzbyBhY2Nlc3NpYmxlCiAgICBhcyBhIHR1cGxlIG9mIGF0IGxlYXN0IDEwIGludGVnZXJzIGdpdmluZyB0aGUgbW9zdCBpbXBvcnRhbnQgKGFuZCBwb3J0YWJsZSkKLSAgIG1lbWJlcnMgb2YgdGhlIDpjdHlwZTpgc3RhdGAgc3RydWN0dXJlLCBpbiB0aGUgb3JkZXIgOmF0dHI6YHN0X21vZGVgLAorICAgbWVtYmVycyBvZiB0aGUgOmM6dHlwZTpgc3RhdGAgc3RydWN0dXJlLCBpbiB0aGUgb3JkZXIgOmF0dHI6YHN0X21vZGVgLAogICAgOmF0dHI6YHN0X2lub2AsIDphdHRyOmBzdF9kZXZgLCA6YXR0cjpgc3RfbmxpbmtgLCA6YXR0cjpgc3RfdWlkYCwKICAgIDphdHRyOmBzdF9naWRgLCA6YXR0cjpgc3Rfc2l6ZWAsIDphdHRyOmBzdF9hdGltZWAsIDphdHRyOmBzdF9tdGltZWAsCiAgICA6YXR0cjpgc3RfY3RpbWVgLiBNb3JlIGl0ZW1zIG1heSBiZSBhZGRlZCBhdCB0aGUgZW5kIGJ5IHNvbWUgaW1wbGVtZW50YXRpb25zLgpAQCAtMTQxMiw3ICsxNDI0LDcgQEAKICAgIC4uIGluZGV4OjogbW9kdWxlOiBzdGF0CiAKICAgIFRoZSBzdGFuZGFyZCBtb2R1bGUgOm1vZDpgc3RhdGAgZGVmaW5lcyBmdW5jdGlvbnMgYW5kIGNvbnN0YW50cyB0aGF0IGFyZSB1c2VmdWwKLSAgIGZvciBleHRyYWN0aW5nIGluZm9ybWF0aW9uIGZyb20gYSA6Y3R5cGU6YHN0YXRgIHN0cnVjdHVyZS4gKE9uIFdpbmRvd3MsIHNvbWUKKyAgIGZvciBleHRyYWN0aW5nIGluZm9ybWF0aW9uIGZyb20gYSA6Yzp0eXBlOmBzdGF0YCBzdHJ1Y3R1cmUuIChPbiBXaW5kb3dzLCBzb21lCiAgICBpdGVtcyBhcmUgZmlsbGVkIHdpdGggZHVtbXkgdmFsdWVzLikKIAogICAgRXhhbXBsZTo6CkBAIC0xNDYxLDkgKzE0NzMsOSBAQAogCiAuLiBmdW5jdGlvbjo6IHN0YXR2ZnMocGF0aCkKIAotICAgUGVyZm9ybSBhIDpjZnVuYzpgc3RhdHZmc2Agc3lzdGVtIGNhbGwgb24gdGhlIGdpdmVuIHBhdGguICBUaGUgcmV0dXJuIHZhbHVlIGlzCisgICBQZXJmb3JtIGEgOmM6ZnVuYzpgc3RhdHZmc2Agc3lzdGVtIGNhbGwgb24gdGhlIGdpdmVuIHBhdGguICBUaGUgcmV0dXJuIHZhbHVlIGlzCiAgICBhbiBvYmplY3Qgd2hvc2UgYXR0cmlidXRlcyBkZXNjcmliZSB0aGUgZmlsZXN5c3RlbSBvbiB0aGUgZ2l2ZW4gcGF0aCwgYW5kCi0gICBjb3JyZXNwb25kIHRvIHRoZSBtZW1iZXJzIG9mIHRoZSA6Y3R5cGU6YHN0YXR2ZnNgIHN0cnVjdHVyZSwgbmFtZWx5OgorICAgY29ycmVzcG9uZCB0byB0aGUgbWVtYmVycyBvZiB0aGUgOmM6dHlwZTpgc3RhdHZmc2Agc3RydWN0dXJlLCBuYW1lbHk6CiAgICA6YXR0cjpgZl9ic2l6ZWAsIDphdHRyOmBmX2Zyc2l6ZWAsIDphdHRyOmBmX2Jsb2Nrc2AsIDphdHRyOmBmX2JmcmVlYCwKICAgIDphdHRyOmBmX2JhdmFpbGAsIDphdHRyOmBmX2ZpbGVzYCwgOmF0dHI6YGZfZmZyZWVgLCA6YXR0cjpgZl9mYXZhaWxgLAogICAgOmF0dHI6YGZfZmxhZ2AsIDphdHRyOmBmX25hbWVtYXhgLgpAQCAtMTQ3Myw3ICsxNDg1LDcgQEAKICAgIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgcmV0dXJuIHZhbHVlIGlzIGFsc28gYWNjZXNzaWJsZSBhcyBhIHR1cGxlIHdob3NlCiAgICB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgYXR0cmlidXRlcywgaW4gdGhlIG9yZGVyIGdpdmVuIGFib3ZlLiBUaGUgc3RhbmRhcmQKICAgIG1vZHVsZSA6bW9kOmBzdGF0dmZzYCBkZWZpbmVzIGNvbnN0YW50cyB0aGF0IGFyZSB1c2VmdWwgZm9yIGV4dHJhY3RpbmcKLSAgIGluZm9ybWF0aW9uIGZyb20gYSA6Y3R5cGU6YHN0YXR2ZnNgIHN0cnVjdHVyZSB3aGVuIGFjY2Vzc2luZyBpdCBhcyBhIHNlcXVlbmNlOworICAgaW5mb3JtYXRpb24gZnJvbSBhIDpjOnR5cGU6YHN0YXR2ZnNgIHN0cnVjdHVyZSB3aGVuIGFjY2Vzc2luZyBpdCBhcyBhIHNlcXVlbmNlOwogICAgdGhpcyByZW1haW5zIHVzZWZ1bCB3aGVuIHdyaXRpbmcgY29kZSB0aGF0IG5lZWRzIHRvIHdvcmsgd2l0aCB2ZXJzaW9ucyBvZiBQeXRob24KICAgIHRoYXQgZG9uJ3Qgc3VwcG9ydCBhY2Nlc3NpbmcgdGhlIGZpZWxkcyBhcyBhdHRyaWJ1dGVzLgogCkBAIC0xNTY1LDcgKzE1NzcsNyBAQAogICAgQXZhaWxhYmlsaXR5OiBVbml4LCBXaW5kb3dzLgogCiAKLS4uIGZ1bmN0aW9uOjogd2Fsayh0b3BbLCB0b3Bkb3duPVRydWUgWywgb25lcnJvcj1Ob25lWywgZm9sbG93bGlua3M9RmFsc2VdXV0pCisuLiBmdW5jdGlvbjo6IHdhbGsodG9wLCB0b3Bkb3duPVRydWUsIG9uZXJyb3I9Tm9uZSwgZm9sbG93bGlua3M9RmFsc2UpCiAKICAgIC4uIGluZGV4OjoKICAgICAgIHNpbmdsZTogZGlyZWN0b3J5OyB3YWxraW5nCkBAIC0xNTg1LDkgKzE1OTcsMTEgQEAKIAogICAgSWYgb3B0aW9uYWwgYXJndW1lbnQgKnRvcGRvd24qIGlzIGBgVHJ1ZWBgIG9yIG5vdCBzcGVjaWZpZWQsIHRoZSB0cmlwbGUgZm9yIGEKICAgIGRpcmVjdG9yeSBpcyBnZW5lcmF0ZWQgYmVmb3JlIHRoZSB0cmlwbGVzIGZvciBhbnkgb2YgaXRzIHN1YmRpcmVjdG9yaWVzCi0gICAoZGlyZWN0b3JpZXMgYXJlIGdlbmVyYXRlZCB0b3AtZG93bikuICBJZiAqdG9wZG93biogaXMgYGBGYWxzZWBgLCB0aGUgdHJpcGxlIGZvciBhCi0gICBkaXJlY3RvcnkgaXMgZ2VuZXJhdGVkIGFmdGVyIHRoZSB0cmlwbGVzIGZvciBhbGwgb2YgaXRzIHN1YmRpcmVjdG9yaWVzCi0gICAoZGlyZWN0b3JpZXMgYXJlIGdlbmVyYXRlZCBib3R0b20tdXApLgorICAgKGRpcmVjdG9yaWVzIGFyZSBnZW5lcmF0ZWQgdG9wLWRvd24pLiAgSWYgKnRvcGRvd24qIGlzIGBgRmFsc2VgYCwgdGhlIHRyaXBsZQorICAgZm9yIGEgZGlyZWN0b3J5IGlzIGdlbmVyYXRlZCBhZnRlciB0aGUgdHJpcGxlcyBmb3IgYWxsIG9mIGl0cyBzdWJkaXJlY3RvcmllcworICAgKGRpcmVjdG9yaWVzIGFyZSBnZW5lcmF0ZWQgYm90dG9tLXVwKS4gTm8gbWF0dGVyIHRoZSB2YWx1ZSBvZiAqdG9wZG93biosIHRoZQorICAgbGlzdCBvZiBzdWJkaXJlY3RvcmllcyBpcyByZXRyaWV2ZWQgYmVmb3JlIHRoZSB0dXBsZXMgZm9yIHRoZSBkaXJlY3RvcnkgYW5kCisgICBpdHMgc3ViZGlyZWN0b3JpZXMgYXJlIGdlbmVyYXRlZC4KIAogICAgV2hlbiAqdG9wZG93biogaXMgYGBUcnVlYGAsIHRoZSBjYWxsZXIgY2FuIG1vZGlmeSB0aGUgKmRpcm5hbWVzKiBsaXN0IGluLXBsYWNlCiAgICAocGVyaGFwcyB1c2luZyA6a2V5d29yZDpgZGVsYCBvciBzbGljZSBhc3NpZ25tZW50KSwgYW5kIDpmdW5jOmB3YWxrYCB3aWxsIG9ubHkKQEAgLTE2NjAsMTEgKzE2NzQsMTEgQEAKIAogVGhlc2UgZnVuY3Rpb25zIG1heSBiZSB1c2VkIHRvIGNyZWF0ZSBhbmQgbWFuYWdlIHByb2Nlc3Nlcy4KIAotVGhlIHZhcmlvdXMgOmZ1bmM6YGV4ZWNcKmAgZnVuY3Rpb25zIHRha2UgYSBsaXN0IG9mIGFyZ3VtZW50cyBmb3IgdGhlIG5ldworVGhlIHZhcmlvdXMgOmZ1bmM6YGV4ZWNcKiA8ZXhlY2w+YCBmdW5jdGlvbnMgdGFrZSBhIGxpc3Qgb2YgYXJndW1lbnRzIGZvciB0aGUgbmV3CiBwcm9ncmFtIGxvYWRlZCBpbnRvIHRoZSBwcm9jZXNzLiAgSW4gZWFjaCBjYXNlLCB0aGUgZmlyc3Qgb2YgdGhlc2UgYXJndW1lbnRzIGlzCiBwYXNzZWQgdG8gdGhlIG5ldyBwcm9ncmFtIGFzIGl0cyBvd24gbmFtZSByYXRoZXIgdGhhbiBhcyBhbiBhcmd1bWVudCBhIHVzZXIgbWF5CiBoYXZlIHR5cGVkIG9uIGEgY29tbWFuZCBsaW5lLiAgRm9yIHRoZSBDIHByb2dyYW1tZXIsIHRoaXMgaXMgdGhlIGBgYXJndlswXWBgCi1wYXNzZWQgdG8gYSBwcm9ncmFtJ3MgOmNmdW5jOmBtYWluYC4gIEZvciBleGFtcGxlLCBgYG9zLmV4ZWN2KCcvYmluL2VjaG8nLAorcGFzc2VkIHRvIGEgcHJvZ3JhbSdzIDpjOmZ1bmM6YG1haW5gLiAgRm9yIGV4YW1wbGUsIGBgb3MuZXhlY3YoJy9iaW4vZWNobycsCiBbJ2ZvbycsICdiYXInXSlgYCB3aWxsIG9ubHkgcHJpbnQgYGBiYXJgYCBvbiBzdGFuZGFyZCBvdXRwdXQ7IGBgZm9vYGAgd2lsbCBzZWVtCiB0byBiZSBpZ25vcmVkLgogCkBAIC0xNjk4LDkgKzE3MTIsOSBAQAogICAgZGVzY3JpcHRvcnMgYXJlIG5vdCBmbHVzaGVkLCBzbyBpZiB0aGVyZSBtYXkgYmUgZGF0YSBidWZmZXJlZAogICAgb24gdGhlc2Ugb3BlbiBmaWxlcywgeW91IHNob3VsZCBmbHVzaCB0aGVtIHVzaW5nCiAgICA6ZnVuYzpgc3lzLnN0ZG91dC5mbHVzaGAgb3IgOmZ1bmM6YG9zLmZzeW5jYCBiZWZvcmUgY2FsbGluZyBhbgotICAgOmZ1bmM6YGV4ZWNcKmAgZnVuY3Rpb24uCisgICA6ZnVuYzpgZXhlY1wqIDxleGVjbD5gIGZ1bmN0aW9uLgogCi0gICBUaGUgImwiIGFuZCAidiIgdmFyaWFudHMgb2YgdGhlIDpmdW5jOmBleGVjXCpgIGZ1bmN0aW9ucyBkaWZmZXIgaW4gaG93CisgICBUaGUgImwiIGFuZCAidiIgdmFyaWFudHMgb2YgdGhlIDpmdW5jOmBleGVjXCogPGV4ZWNsPmAgZnVuY3Rpb25zIGRpZmZlciBpbiBob3cKICAgIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgYXJlIHBhc3NlZC4gIFRoZSAibCIgdmFyaWFudHMgYXJlIHBlcmhhcHMgdGhlIGVhc2llc3QKICAgIHRvIHdvcmsgd2l0aCBpZiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgaXMgZml4ZWQgd2hlbiB0aGUgY29kZSBpcyB3cml0dGVuOyB0aGUKICAgIGluZGl2aWR1YWwgcGFyYW1ldGVycyBzaW1wbHkgYmVjb21lIGFkZGl0aW9uYWwgcGFyYW1ldGVycyB0byB0aGUgOmZ1bmM6YGV4ZWNsXCpgCkBAIC0xNzEyLDcgKzE3MjYsNyBAQAogICAgVGhlIHZhcmlhbnRzIHdoaWNoIGluY2x1ZGUgYSAicCIgbmVhciB0aGUgZW5kICg6ZnVuYzpgZXhlY2xwYCwKICAgIDpmdW5jOmBleGVjbHBlYCwgOmZ1bmM6YGV4ZWN2cGAsIGFuZCA6ZnVuYzpgZXhlY3ZwZWApIHdpbGwgdXNlIHRoZQogICAgOmVudnZhcjpgUEFUSGAgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gbG9jYXRlIHRoZSBwcm9ncmFtICpmaWxlKi4gIFdoZW4gdGhlCi0gICBlbnZpcm9ubWVudCBpcyBiZWluZyByZXBsYWNlZCAodXNpbmcgb25lIG9mIHRoZSA6ZnVuYzpgZXhlY1wqZWAgdmFyaWFudHMsCisgICBlbnZpcm9ubWVudCBpcyBiZWluZyByZXBsYWNlZCAodXNpbmcgb25lIG9mIHRoZSA6ZnVuYzpgZXhlY1wqZSA8ZXhlY2w+YCB2YXJpYW50cywKICAgIGRpc2N1c3NlZCBpbiB0aGUgbmV4dCBwYXJhZ3JhcGgpLCB0aGUgbmV3IGVudmlyb25tZW50IGlzIHVzZWQgYXMgdGhlIHNvdXJjZSBvZgogICAgdGhlIDplbnZ2YXI6YFBBVEhgIHZhcmlhYmxlLiBUaGUgb3RoZXIgdmFyaWFudHMsIDpmdW5jOmBleGVjbGAsIDpmdW5jOmBleGVjbGVgLAogICAgOmZ1bmM6YGV4ZWN2YCwgYW5kIDpmdW5jOmBleGVjdmVgLCB3aWxsIG5vdCB1c2UgdGhlIDplbnZ2YXI6YFBBVEhgIHZhcmlhYmxlIHRvCkBAIC0xOTIwLDYgKzE5MzQsMTAgQEAKICAgIE5vdGUgdGhhdCBzb21lIHBsYXRmb3JtcyBpbmNsdWRpbmcgRnJlZUJTRCA8PSA2LjMsIEN5Z3dpbiBhbmQgT1MvMiBFTVggaGF2ZQogICAga25vd24gaXNzdWVzIHdoZW4gdXNpbmcgZm9yaygpIGZyb20gYSB0aHJlYWQuCiAKKyAgIC4uIHdhcm5pbmc6OgorCisgICAgICBTZWUgOm1vZDpgc3NsYCBmb3IgYXBwbGljYXRpb25zIHRoYXQgdXNlIHRoZSBTU0wgbW9kdWxlIHdpdGggZm9yaygpLgorCiAgICBBdmFpbGFiaWxpdHk6IFVuaXguCiAKIApAQCAtMjAxNCw3ICsyMDMyLDcgQEAKICAgIHByb2Nlc3MuICBPbiBXaW5kb3dzLCB0aGUgcHJvY2VzcyBpZCB3aWxsIGFjdHVhbGx5IGJlIHRoZSBwcm9jZXNzIGhhbmRsZSwgc28gY2FuCiAgICBiZSB1c2VkIHdpdGggdGhlIDpmdW5jOmB3YWl0cGlkYCBmdW5jdGlvbi4KIAotICAgVGhlICJsIiBhbmQgInYiIHZhcmlhbnRzIG9mIHRoZSA6ZnVuYzpgc3Bhd25cKmAgZnVuY3Rpb25zIGRpZmZlciBpbiBob3cKKyAgIFRoZSAibCIgYW5kICJ2IiB2YXJpYW50cyBvZiB0aGUgOmZ1bmM6YHNwYXduXCogPHNwYXdubD5gIGZ1bmN0aW9ucyBkaWZmZXIgaW4gaG93CiAgICBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGFyZSBwYXNzZWQuICBUaGUgImwiIHZhcmlhbnRzIGFyZSBwZXJoYXBzIHRoZSBlYXNpZXN0CiAgICB0byB3b3JrIHdpdGggaWYgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGlzIGZpeGVkIHdoZW4gdGhlIGNvZGUgaXMgd3JpdHRlbjsgdGhlCiAgICBpbmRpdmlkdWFsIHBhcmFtZXRlcnMgc2ltcGx5IGJlY29tZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgdG8gdGhlCkBAIC0yMDI2LDcgKzIwNDQsNyBAQAogICAgVGhlIHZhcmlhbnRzIHdoaWNoIGluY2x1ZGUgYSBzZWNvbmQgInAiIG5lYXIgdGhlIGVuZCAoOmZ1bmM6YHNwYXdubHBgLAogICAgOmZ1bmM6YHNwYXdubHBlYCwgOmZ1bmM6YHNwYXdudnBgLCBhbmQgOmZ1bmM6YHNwYXdudnBlYCkgd2lsbCB1c2UgdGhlCiAgICA6ZW52dmFyOmBQQVRIYCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBsb2NhdGUgdGhlIHByb2dyYW0gKmZpbGUqLiAgV2hlbiB0aGUKLSAgIGVudmlyb25tZW50IGlzIGJlaW5nIHJlcGxhY2VkICh1c2luZyBvbmUgb2YgdGhlIDpmdW5jOmBzcGF3blwqZWAgdmFyaWFudHMsCisgICBlbnZpcm9ubWVudCBpcyBiZWluZyByZXBsYWNlZCAodXNpbmcgb25lIG9mIHRoZSA6ZnVuYzpgc3Bhd25cKmUgPHNwYXdubD5gIHZhcmlhbnRzLAogICAgZGlzY3Vzc2VkIGluIHRoZSBuZXh0IHBhcmFncmFwaCksIHRoZSBuZXcgZW52aXJvbm1lbnQgaXMgdXNlZCBhcyB0aGUgc291cmNlIG9mCiAgICB0aGUgOmVudnZhcjpgUEFUSGAgdmFyaWFibGUuICBUaGUgb3RoZXIgdmFyaWFudHMsIDpmdW5jOmBzcGF3bmxgLAogICAgOmZ1bmM6YHNwYXdubGVgLCA6ZnVuYzpgc3Bhd252YCwgYW5kIDpmdW5jOmBzcGF3bnZlYCwgd2lsbCBub3QgdXNlIHRoZQpAQCAtMjA2Miw3ICsyMDgwLDcgQEAKIC4uIGRhdGE6OiBQX05PV0FJVAogICAgICAgICAgIFBfTk9XQUlUTwogCi0gICBQb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSAqbW9kZSogcGFyYW1ldGVyIHRvIHRoZSA6ZnVuYzpgc3Bhd25cKmAgZmFtaWx5IG9mCisgICBQb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSAqbW9kZSogcGFyYW1ldGVyIHRvIHRoZSA6ZnVuYzpgc3Bhd25cKiA8c3Bhd25sPmAgZmFtaWx5IG9mCiAgICBmdW5jdGlvbnMuICBJZiBlaXRoZXIgb2YgdGhlc2UgdmFsdWVzIGlzIGdpdmVuLCB0aGUgOmZ1bmM6YHNwYXduXCpgIGZ1bmN0aW9ucwogICAgd2lsbCByZXR1cm4gYXMgc29vbiBhcyB0aGUgbmV3IHByb2Nlc3MgaGFzIGJlZW4gY3JlYXRlZCwgd2l0aCB0aGUgcHJvY2VzcyBpZCBhcwogICAgdGhlIHJldHVybiB2YWx1ZS4KQEAgLTIwNzQsNyArMjA5Miw3IEBACiAKIC4uIGRhdGE6OiBQX1dBSVQKIAotICAgUG9zc2libGUgdmFsdWUgZm9yIHRoZSAqbW9kZSogcGFyYW1ldGVyIHRvIHRoZSA6ZnVuYzpgc3Bhd25cKmAgZmFtaWx5IG9mCisgICBQb3NzaWJsZSB2YWx1ZSBmb3IgdGhlICptb2RlKiBwYXJhbWV0ZXIgdG8gdGhlIDpmdW5jOmBzcGF3blwqIDxzcGF3bmw+YCBmYW1pbHkgb2YKICAgIGZ1bmN0aW9ucy4gIElmIHRoaXMgaXMgZ2l2ZW4gYXMgKm1vZGUqLCB0aGUgOmZ1bmM6YHNwYXduXCpgIGZ1bmN0aW9ucyB3aWxsIG5vdAogICAgcmV0dXJuIHVudGlsIHRoZSBuZXcgcHJvY2VzcyBoYXMgcnVuIHRvIGNvbXBsZXRpb24gYW5kIHdpbGwgcmV0dXJuIHRoZSBleGl0IGNvZGUKICAgIG9mIHRoZSBwcm9jZXNzIHRoZSBydW4gaXMgc3VjY2Vzc2Z1bCwgb3IgYGAtc2lnbmFsYGAgaWYgYSBzaWduYWwga2lsbHMgdGhlCkBAIC0yMDg4LDcgKzIxMDYsNyBAQAogLi4gZGF0YTo6IFBfREVUQUNICiAgICAgICAgICAgUF9PVkVSTEFZCiAKLSAgIFBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlICptb2RlKiBwYXJhbWV0ZXIgdG8gdGhlIDpmdW5jOmBzcGF3blwqYCBmYW1pbHkgb2YKKyAgIFBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlICptb2RlKiBwYXJhbWV0ZXIgdG8gdGhlIDpmdW5jOmBzcGF3blwqIDxzcGF3bmw+YCBmYW1pbHkgb2YKICAgIGZ1bmN0aW9ucy4gIFRoZXNlIGFyZSBsZXNzIHBvcnRhYmxlIHRoYW4gdGhvc2UgbGlzdGVkIGFib3ZlLiA6Y29uc3Q6YFBfREVUQUNIYAogICAgaXMgc2ltaWxhciB0byA6Y29uc3Q6YFBfTk9XQUlUYCwgYnV0IHRoZSBuZXcgcHJvY2VzcyBpcyBkZXRhY2hlZCBmcm9tIHRoZQogICAgY29uc29sZSBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLiBJZiA6Y29uc3Q6YFBfT1ZFUkxBWWAgaXMgdXNlZCwgdGhlIGN1cnJlbnQKQEAgLTIxMTcsNyArMjEzNSw3IEBACiAgICBUaGVyZSBpcyBubyBvcHRpb24gdG8gd2FpdCBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIGNsb3NlLCBhbmQgbm8gd2F5IHRvIHJldHJpZXZlCiAgICB0aGUgYXBwbGljYXRpb24ncyBleGl0IHN0YXR1cy4gIFRoZSAqcGF0aCogcGFyYW1ldGVyIGlzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50CiAgICBkaXJlY3RvcnkuICBJZiB5b3Ugd2FudCB0byB1c2UgYW4gYWJzb2x1dGUgcGF0aCwgbWFrZSBzdXJlIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAgIGlzIG5vdCBhIHNsYXNoIChgYCcvJ2BgKTsgdGhlIHVuZGVybHlpbmcgV2luMzIgOmNmdW5jOmBTaGVsbEV4ZWN1dGVgIGZ1bmN0aW9uCisgICBpcyBub3QgYSBzbGFzaCAoYGAnLydgYCk7IHRoZSB1bmRlcmx5aW5nIFdpbjMyIDpjOmZ1bmM6YFNoZWxsRXhlY3V0ZWAgZnVuY3Rpb24KICAgIGRvZXNuJ3Qgd29yayBpZiBpdCBpcy4gIFVzZSB0aGUgOmZ1bmM6YG9zLnBhdGgubm9ybXBhdGhgIGZ1bmN0aW9uIHRvIGVuc3VyZSB0aGF0CiAgICB0aGUgcGF0aCBpcyBwcm9wZXJseSBlbmNvZGVkIGZvciBXaW4zMi4KIApAQCAtMjEzMiwxMyArMjE1MCwxMyBAQAogLi4gZnVuY3Rpb246OiBzeXN0ZW0oY29tbWFuZCkKIAogICAgRXhlY3V0ZSB0aGUgY29tbWFuZCAoYSBzdHJpbmcpIGluIGEgc3Vic2hlbGwuICBUaGlzIGlzIGltcGxlbWVudGVkIGJ5IGNhbGxpbmcKLSAgIHRoZSBTdGFuZGFyZCBDIGZ1bmN0aW9uIDpjZnVuYzpgc3lzdGVtYCwgYW5kIGhhcyB0aGUgc2FtZSBsaW1pdGF0aW9ucy4KKyAgIHRoZSBTdGFuZGFyZCBDIGZ1bmN0aW9uIDpjOmZ1bmM6YHN5c3RlbWAsIGFuZCBoYXMgdGhlIHNhbWUgbGltaXRhdGlvbnMuCiAgICBDaGFuZ2VzIHRvIDpkYXRhOmBzeXMuc3RkaW5gLCBldGMuIGFyZSBub3QgcmVmbGVjdGVkIGluIHRoZSBlbnZpcm9ubWVudCBvZiB0aGUKICAgIGV4ZWN1dGVkIGNvbW1hbmQuCiAKICAgIE9uIFVuaXgsIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBwcm9jZXNzIGVuY29kZWQgaW4gdGhlCiAgICBmb3JtYXQgc3BlY2lmaWVkIGZvciA6ZnVuYzpgd2FpdGAuICBOb3RlIHRoYXQgUE9TSVggZG9lcyBub3Qgc3BlY2lmeSB0aGUgbWVhbmluZwotICAgb2YgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgQyA6Y2Z1bmM6YHN5c3RlbWAgZnVuY3Rpb24sIHNvIHRoZSByZXR1cm4gdmFsdWUgb2YKKyAgIG9mIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIEMgOmM6ZnVuYzpgc3lzdGVtYCBmdW5jdGlvbiwgc28gdGhlIHJldHVybiB2YWx1ZSBvZgogICAgdGhlIFB5dGhvbiBmdW5jdGlvbiBpcyBzeXN0ZW0tZGVwZW5kZW50LgogCiAgICBPbiBXaW5kb3dzLCB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoYXQgcmV0dXJuZWQgYnkgdGhlIHN5c3RlbSBzaGVsbCBhZnRlciBydW5uaW5nCkBAIC0yMjA0LDE3ICsyMjIyLDE4IEBACiAgICAoc2hpZnRpbmcgbWFrZXMgY3Jvc3MtcGxhdGZvcm0gdXNlIG9mIHRoZSBmdW5jdGlvbiBlYXNpZXIpLiBBICpwaWQqIGxlc3MgdGhhbiBvcgogICAgZXF1YWwgdG8gYGAwYGAgaGFzIG5vIHNwZWNpYWwgbWVhbmluZyBvbiBXaW5kb3dzLCBhbmQgcmFpc2VzIGFuIGV4Y2VwdGlvbi4gVGhlCiAgICB2YWx1ZSBvZiBpbnRlZ2VyICpvcHRpb25zKiBoYXMgbm8gZWZmZWN0LiAqcGlkKiBjYW4gcmVmZXIgdG8gYW55IHByb2Nlc3Mgd2hvc2UKLSAgIGlkIGlzIGtub3duLCBub3QgbmVjZXNzYXJpbHkgYSBjaGlsZCBwcm9jZXNzLiBUaGUgOmZ1bmM6YHNwYXduYCBmdW5jdGlvbnMgY2FsbGVkCi0gICB3aXRoIDpjb25zdDpgUF9OT1dBSVRgIHJldHVybiBzdWl0YWJsZSBwcm9jZXNzIGhhbmRsZXMuCisgICBpZCBpcyBrbm93biwgbm90IG5lY2Vzc2FyaWx5IGEgY2hpbGQgcHJvY2Vzcy4gVGhlIDpmdW5jOmBzcGF3blwqIDxzcGF3bmw+YAorICAgZnVuY3Rpb25zIGNhbGxlZCB3aXRoIDpjb25zdDpgUF9OT1dBSVRgIHJldHVybiBzdWl0YWJsZSBwcm9jZXNzIGhhbmRsZXMuCiAKIAotLi4gZnVuY3Rpb246OiB3YWl0Myhbb3B0aW9uc10pCisuLiBmdW5jdGlvbjo6IHdhaXQzKG9wdGlvbnMpCiAKICAgIFNpbWlsYXIgdG8gOmZ1bmM6YHdhaXRwaWRgLCBleGNlcHQgbm8gcHJvY2VzcyBpZCBhcmd1bWVudCBpcyBnaXZlbiBhbmQgYQogICAgMy1lbGVtZW50IHR1cGxlIGNvbnRhaW5pbmcgdGhlIGNoaWxkJ3MgcHJvY2VzcyBpZCwgZXhpdCBzdGF0dXMgaW5kaWNhdGlvbiwgYW5kCiAgICByZXNvdXJjZSB1c2FnZSBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZC4gIFJlZmVyIHRvIDptb2Q6YHJlc291cmNlYC5cCi0gICA6ZnVuYzpgZ2V0cnVzYWdlYCBmb3IgZGV0YWlscyBvbiByZXNvdXJjZSB1c2FnZSBpbmZvcm1hdGlvbi4gIFRoZSBvcHRpb24KLSAgIGFyZ3VtZW50IGlzIHRoZSBzYW1lIGFzIHRoYXQgcHJvdmlkZWQgdG8gOmZ1bmM6YHdhaXRwaWRgIGFuZCA6ZnVuYzpgd2FpdDRgLgorICAgOmZ1bmM6YH5yZXNvdXJjZS5nZXRydXNhZ2VgIGZvciBkZXRhaWxzIG9uIHJlc291cmNlIHVzYWdlIGluZm9ybWF0aW9uLiAgVGhlCisgICBvcHRpb24gYXJndW1lbnQgaXMgdGhlIHNhbWUgYXMgdGhhdCBwcm92aWRlZCB0byA6ZnVuYzpgd2FpdHBpZGAgYW5kCisgICA6ZnVuYzpgd2FpdDRgLgogCiAgICBBdmFpbGFiaWxpdHk6IFVuaXguCiAKQEAgLTIyMjUsOSArMjI0NCw5IEBACiAKICAgIFNpbWlsYXIgdG8gOmZ1bmM6YHdhaXRwaWRgLCBleGNlcHQgYSAzLWVsZW1lbnQgdHVwbGUsIGNvbnRhaW5pbmcgdGhlIGNoaWxkJ3MKICAgIHByb2Nlc3MgaWQsIGV4aXQgc3RhdHVzIGluZGljYXRpb24sIGFuZCByZXNvdXJjZSB1c2FnZSBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZC4KLSAgIFJlZmVyIHRvIDptb2Q6YHJlc291cmNlYC5cIDpmdW5jOmBnZXRydXNhZ2VgIGZvciBkZXRhaWxzIG9uIHJlc291cmNlIHVzYWdlCi0gICBpbmZvcm1hdGlvbi4gIFRoZSBhcmd1bWVudHMgdG8gOmZ1bmM6YHdhaXQ0YCBhcmUgdGhlIHNhbWUgYXMgdGhvc2UgcHJvdmlkZWQgdG8KLSAgIDpmdW5jOmB3YWl0cGlkYC4KKyAgIFJlZmVyIHRvIDptb2Q6YHJlc291cmNlYC5cIDpmdW5jOmB+cmVzb3VyY2UuZ2V0cnVzYWdlYCBmb3IgZGV0YWlscyBvbgorICAgcmVzb3VyY2UgdXNhZ2UgaW5mb3JtYXRpb24uICBUaGUgYXJndW1lbnRzIHRvIDpmdW5jOmB3YWl0NGAgYXJlIHRoZSBzYW1lIGFzCisgICB0aG9zZSBwcm92aWRlZCB0byA6ZnVuYzpgd2FpdHBpZGAuCiAKICAgIEF2YWlsYWJpbGl0eTogVW5peC4KIApAQCAtMjQ1MSw4ICsyNDcwLDkgQEAKIAogLi4gZGF0YTo6IGRlZnBhdGgKIAotICAgVGhlIGRlZmF1bHQgc2VhcmNoIHBhdGggdXNlZCBieSA6ZnVuYzpgZXhlY1wqcFwqYCBhbmQgOmZ1bmM6YHNwYXduXCpwXCpgIGlmIHRoZQotICAgZW52aXJvbm1lbnQgZG9lc24ndCBoYXZlIGEgYGAnUEFUSCdgYCBrZXkuIEFsc28gYXZhaWxhYmxlIHZpYSA6bW9kOmBvcy5wYXRoYC4KKyAgIFRoZSBkZWZhdWx0IHNlYXJjaCBwYXRoIHVzZWQgYnkgOmZ1bmM6YGV4ZWNcKnBcKiA8ZXhlY2w+YCBhbmQKKyAgIDpmdW5jOmBzcGF3blwqcFwqIDxzcGF3bmw+YCBpZiB0aGUgZW52aXJvbm1lbnQgZG9lc24ndCBoYXZlIGEgYGAnUEFUSCdgYAorICAga2V5LiBBbHNvIGF2YWlsYWJsZSB2aWEgOm1vZDpgb3MucGF0aGAuCiAKIAogLi4gZGF0YTo6IGxpbmVzZXAKQEAgLTI0ODUsOCArMjUwNSwxMSBAQAogICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHJhbmRvbSBieXRlcyBmcm9tIGFuIE9TLXNwZWNpZmljIHJhbmRvbW5lc3Mgc291cmNlLiAgVGhlCiAgICByZXR1cm5lZCBkYXRhIHNob3VsZCBiZSB1bnByZWRpY3RhYmxlIGVub3VnaCBmb3IgY3J5cHRvZ3JhcGhpYyBhcHBsaWNhdGlvbnMsCiAgICB0aG91Z2ggaXRzIGV4YWN0IHF1YWxpdHkgZGVwZW5kcyBvbiB0aGUgT1MgaW1wbGVtZW50YXRpb24uICBPbiBhIFVOSVgtbGlrZQotICAgc3lzdGVtIHRoaXMgd2lsbCBxdWVyeSAvZGV2L3VyYW5kb20sIGFuZCBvbiBXaW5kb3dzIGl0IHdpbGwgdXNlIENyeXB0R2VuUmFuZG9tLgotICAgSWYgYSByYW5kb21uZXNzIHNvdXJjZSBpcyBub3QgZm91bmQsIDpleGM6YE5vdEltcGxlbWVudGVkRXJyb3JgIHdpbGwgYmUgcmFpc2VkLgorICAgc3lzdGVtIHRoaXMgd2lsbCBxdWVyeSBgYC9kZXYvdXJhbmRvbWBgLCBhbmQgb24gV2luZG93cyBpdCB3aWxsIHVzZQorICAgYGBDcnlwdEdlblJhbmRvbSgpYGAuICBJZiBhIHJhbmRvbW5lc3Mgc291cmNlIGlzIG5vdCBmb3VuZCwKKyAgIDpleGM6YE5vdEltcGxlbWVudGVkRXJyb3JgIHdpbGwgYmUgcmFpc2VkLgorCisgICBGb3IgYW4gZWFzeS10by11c2UgaW50ZXJmYWNlIHRvIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgcHJvdmlkZWQgYnkgeW91ciBwbGF0Zm9ybSwgcGxlYXNlIHNlZSA6Y2xhc3M6YHJhbmRvbS5TeXN0ZW1SYW5kb21gLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjQKLQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvb3NzYXVkaW9kZXYucnN0IGIvRG9jL2xpYnJhcnkvb3NzYXVkaW9kZXYucnN0CmluZGV4IDg0OGVjYTUuLjc5YzVlYTUgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L29zc2F1ZGlvZGV2LnJzdAorKysgYi9Eb2MvbGlicmFyeS9vc3NhdWRpb2Rldi5yc3QKQEAgLTQ4LDcgKzQ4LDcgQEAKICAgICAgIHRoZSBvZmZpY2lhbCBkb2N1bWVudGF0aW9uIGZvciB0aGUgT1NTIEMgQVBJCiAKICAgIFRoZSBtb2R1bGUgZGVmaW5lcyBhIGxhcmdlIG51bWJlciBvZiBjb25zdGFudHMgc3VwcGxpZWQgYnkgdGhlIE9TUyBkZXZpY2UKLSAgIGRyaXZlcjsgc2VlIGBgPHN5cy9zb3VuZGNhcmQuaD5gYCBvbiBlaXRoZXIgTGludXggb3IgRnJlZUJTRCBmb3IgYSBsaXN0aW5nIC4KKyAgIGRyaXZlcjsgc2VlIGBgPHN5cy9zb3VuZGNhcmQuaD5gYCBvbiBlaXRoZXIgTGludXggb3IgRnJlZUJTRCBmb3IgYSBsaXN0aW5nLgogCiA6bW9kOmBvc3NhdWRpb2RldmAgZGVmaW5lcyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zOgogCkBAIC01OSwxNCArNTksMTUgQEAKICAgIHdoYXQgd2VudCB3cm9uZy4KIAogICAgKElmIDptb2Q6YG9zc2F1ZGlvZGV2YCByZWNlaXZlcyBhbiBlcnJvciBmcm9tIGEgc3lzdGVtIGNhbGwgc3VjaCBhcwotICAgOmNmdW5jOmBvcGVuYCwgOmNmdW5jOmB3cml0ZWAsIG9yIDpjZnVuYzpgaW9jdGxgLCBpdCByYWlzZXMgOmV4YzpgSU9FcnJvcmAuCisgICA6YzpmdW5jOmBvcGVuYCwgOmM6ZnVuYzpgd3JpdGVgLCBvciA6YzpmdW5jOmBpb2N0bGAsIGl0IHJhaXNlcyA6ZXhjOmBJT0Vycm9yYC4KICAgIEVycm9ycyBkZXRlY3RlZCBkaXJlY3RseSBieSA6bW9kOmBvc3NhdWRpb2RldmAgcmVzdWx0IGluIDpleGM6YE9TU0F1ZGlvRXJyb3JgLikKIAogICAgKEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdGhlIGV4Y2VwdGlvbiBjbGFzcyBpcyBhbHNvIGF2YWlsYWJsZSBhcwogICAgYGBvc3NhdWRpb2Rldi5lcnJvcmBgLikKIAogCi0uLiBmdW5jdGlvbjo6IG9wZW4oW2RldmljZSwgXW1vZGUpCisuLiBmdW5jdGlvbjo6IG9wZW4obW9kZSkKKyAgICAgICAgICAgICAgb3BlbihkZXZpY2UsIG1vZGUpCiAKICAgIE9wZW4gYW4gYXVkaW8gZGV2aWNlIGFuZCByZXR1cm4gYW4gT1NTIGF1ZGlvIGRldmljZSBvYmplY3QuICBUaGlzIG9iamVjdAogICAgc3VwcG9ydHMgbWFueSBmaWxlLWxpa2UgbWV0aG9kcywgc3VjaCBhcyA6bWV0aDpgcmVhZGAsIDptZXRoOmB3cml0ZWAsIGFuZApAQCAtMTYyLDExICsxNjMsMTEgQEAKICAgIGlzIG9ubHkgdXNlZnVsIGluIG5vbi1ibG9ja2luZyBtb2RlLiAgSGFzIG5vIHJldHVybiB2YWx1ZSwgc2luY2UgdGhlIGFtb3VudCBvZgogICAgZGF0YSB3cml0dGVuIGlzIGFsd2F5cyBlcXVhbCB0byB0aGUgYW1vdW50IG9mIGRhdGEgc3VwcGxpZWQuCiAKLVRoZSBmb2xsb3dpbmcgbWV0aG9kcyBlYWNoIG1hcCB0byBleGFjdGx5IG9uZSA6ZnVuYzpgaW9jdGxgIHN5c3RlbSBjYWxsLiAgVGhlCitUaGUgZm9sbG93aW5nIG1ldGhvZHMgZWFjaCBtYXAgdG8gZXhhY3RseSBvbmUgOmM6ZnVuYzpgaW9jdGxgIHN5c3RlbSBjYWxsLiAgVGhlCiBjb3JyZXNwb25kZW5jZSBpcyBvYnZpb3VzOiBmb3IgZXhhbXBsZSwgOm1ldGg6YHNldGZtdGAgY29ycmVzcG9uZHMgdG8gdGhlCiBgYFNORENUTF9EU1BfU0VURk1UYGAgaW9jdGwsIGFuZCA6bWV0aDpgc3luY2AgdG8gYGBTTkRDVExfRFNQX1NZTkNgYCAodGhpcyBjYW4KIGJlIHVzZWZ1bCB3aGVuIGNvbnN1bHRpbmcgdGhlIE9TUyBkb2N1bWVudGF0aW9uKS4gIElmIHRoZSB1bmRlcmx5aW5nCi06ZnVuYzpgaW9jdGxgIGZhaWxzLCB0aGV5IGFsbCByYWlzZSA6ZXhjOmBJT0Vycm9yYC4KKzpjOmZ1bmM6YGlvY3RsYCBmYWlscywgdGhleSBhbGwgcmFpc2UgOmV4YzpgSU9FcnJvcmAuCiAKIAogLi4gbWV0aG9kOjogb3NzX2F1ZGlvX2RldmljZS5ub25ibG9jaygpCkBAIC0yNzUsNyArMjc2LDcgQEAKIHNpbXBsZSBjYWxjdWxhdGlvbnMuCiAKIAotLi4gbWV0aG9kOjogb3NzX2F1ZGlvX2RldmljZS5zZXRwYXJhbWV0ZXJzKGZvcm1hdCwgbmNoYW5uZWxzLCBzYW1wbGVyYXRlIFssIHN0cmljdD1GYWxzZV0pCisuLiBtZXRob2Q6OiBvc3NfYXVkaW9fZGV2aWNlLnNldHBhcmFtZXRlcnMoZm9ybWF0LCBuY2hhbm5lbHMsIHNhbXBsZXJhdGVbLCBzdHJpY3Q9RmFsc2VdKQogCiAgICBTZXQgdGhlIGtleSBhdWRpbyBzYW1wbGluZyBwYXJhbWV0ZXJzLS0tc2FtcGxlIGZvcm1hdCwgbnVtYmVyIG9mIGNoYW5uZWxzLCBhbmQKICAgIHNhbXBsaW5nIHJhdGUtLS1pbiBvbmUgbWV0aG9kIGNhbGwuICAqZm9ybWF0KiwgICpuY2hhbm5lbHMqLCBhbmQgKnNhbXBsZXJhdGUqCkBAIC0yOTUsNyArMjk2LDcgQEAKIAogICAgICAgZm10ID0gZHNwLnNldGZtdChmbXQpCiAgICAgICBjaGFubmVscyA9IGRzcC5jaGFubmVscyhjaGFubmVscykKLSAgICAgIHJhdGUgPSBkc3AucmF0ZShjaGFubmVscykKKyAgICAgIHJhdGUgPSBkc3AucmF0ZShyYXRlKQogCiAKIC4uIG1ldGhvZDo6IG9zc19hdWRpb19kZXZpY2UuYnVmc2l6ZSgpCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9vdGhlcmd1aS5yc3QgYi9Eb2MvbGlicmFyeS9vdGhlcmd1aS5yc3QKaW5kZXggNjlkZjlkZi4uMWVlNWM1YiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvb3RoZXJndWkucnN0CisrKyBiL0RvYy9saWJyYXJ5L290aGVyZ3VpLnJzdApAQCAtMTMsOCArMTMsNyBAQAogICAgICAgcHJvdmlkZXMgYW4gb2JqZWN0IG9yaWVudGVkIGludGVyZmFjZSB0aGF0IGlzIHNsaWdodGx5IGhpZ2hlciBsZXZlbCB0aGFuCiAgICAgICB0aGUgQyBvbmUuIEl0IGNvbWVzIHdpdGggbWFueSBtb3JlIHdpZGdldHMgdGhhbiBUa2ludGVyIHByb3ZpZGVzLCBhbmQgaGFzCiAgICAgICBnb29kIFB5dGhvbi1zcGVjaWZpYyByZWZlcmVuY2UgZG9jdW1lbnRhdGlvbi4gVGhlcmUgYXJlIGFsc28gYmluZGluZ3MgdG8KLSAgICAgIGBHTk9NRSA8aHR0cDovL3d3dy5nbm9tZS5vcmc+YF8uICBPbmUgd2VsbCBrbm93biBQeUdUSyBhcHBsaWNhdGlvbiBpcwotICAgICAgYFB5dGhvbkNBRCA8aHR0cDovL3d3dy5weXRob25jYWQub3JnLz5gXy4gQW4gb25saW5lIGB0dXRvcmlhbAorICAgICAgYEdOT01FIDxodHRwOi8vd3d3Lmdub21lLm9yZz5gXy4gIEFuIG9ubGluZSBgdHV0b3JpYWwKICAgICAgIDxodHRwOi8vd3d3LnB5Z3RrLm9yZy9weWd0azJ0dXRvcmlhbC9pbmRleC5odG1sPmBfIGlzIGF2YWlsYWJsZS4KIAogICAgYFB5UXQgPGh0dHA6Ly93d3cucml2ZXJiYW5rY29tcHV0aW5nLmNvLnVrL3NvZnR3YXJlL3B5cXQvPmBfCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9wYXJzZXIucnN0IGIvRG9jL2xpYnJhcnkvcGFyc2VyLnJzdAppbmRleCBjNDZhZWFlLi5hY2RhMzcyIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9wYXJzZXIucnN0CisrKyBiL0RvYy9saWJyYXJ5L3BhcnNlci5yc3QKQEAgLTM0LDcgKzM0LDcgQEAKICAgIHJlcGxhY2VkIGJ5ICJhc3QiOyB0aGlzIGlzIGEgbGVnYWN5IGZyb20gdGhlIHRpbWUgd2hlbiB0aGVyZSB3YXMgbm8gb3RoZXIKICAgIEFTVCBhbmQgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCB0aGUgQVNUIGZvdW5kIGluIFB5dGhvbiAyLjUuICBUaGlzIGlzIGFsc28gdGhlCiAgICByZWFzb24gZm9yIHRoZSBmdW5jdGlvbnMnIGtleXdvcmQgYXJndW1lbnRzIGJlaW5nIGNhbGxlZCAqYXN0Kiwgbm90ICpzdCouCi0gICBUaGUgImFzdCIgZnVuY3Rpb25zIHdpbGwgYmUgcmVtb3ZlZCBpbiBQeXRob24gMy4wLgorICAgVGhlICJhc3QiIGZ1bmN0aW9ucyBoYXZlIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4KIAogVGhlcmUgYXJlIGEgZmV3IHRoaW5ncyB0byBub3RlIGFib3V0IHRoaXMgbW9kdWxlIHdoaWNoIGFyZSBpbXBvcnRhbnQgdG8gbWFraW5nCiB1c2Ugb2YgdGhlIGRhdGEgc3RydWN0dXJlcyBjcmVhdGVkLiAgVGhpcyBpcyBub3QgYSB0dXRvcmlhbCBvbiBlZGl0aW5nIHRoZSBwYXJzZQpAQCAtMjAwLDcgKzIwMCw3IEBACiAgICBpbmZvcm1hdGlvbiBpcyBvbWl0dGVkIGlmIHRoZSBmbGFnIGlzIGZhbHNlIG9yIG9taXR0ZWQuCiAKIAotLi4gZnVuY3Rpb246OiBjb21waWxlc3QoYXN0WywgZmlsZW5hbWU9JzxzeW50YXgtdHJlZT4nXSkKKy4uIGZ1bmN0aW9uOjogY29tcGlsZXN0KGFzdCwgZmlsZW5hbWU9JzxzeW50YXgtdHJlZT4nKQogCiAgICAuLiBpbmRleDo6IGJ1aWx0aW46IGV2YWwKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvcGlja2xlLnJzdCBiL0RvYy9saWJyYXJ5L3BpY2tsZS5yc3QKaW5kZXggNGQ0MTdkMi4uYTQyZWFiYyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvcGlja2xlLnJzdAorKysgYi9Eb2MvbGlicmFyeS9waWNrbGUucnN0CkBAIC0zNTIsOCArMzUyLDkgQEAKIAogKiBjbGFzc2VzIHRoYXQgYXJlIGRlZmluZWQgYXQgdGhlIHRvcCBsZXZlbCBvZiBhIG1vZHVsZQogCi0qIGluc3RhbmNlcyBvZiBzdWNoIGNsYXNzZXMgd2hvc2UgOmF0dHI6YF9fZGljdF9fYCBvciA6bWV0aDpgX19zZXRzdGF0ZV9fYCBpcwotICBwaWNrbGFibGUgIChzZWUgc2VjdGlvbiA6cmVmOmBwaWNrbGUtcHJvdG9jb2xgIGZvciBkZXRhaWxzKQorKiBpbnN0YW5jZXMgb2Ygc3VjaCBjbGFzc2VzIHdob3NlIDphdHRyOmB+b2JqZWN0Ll9fZGljdF9fYCBvciB0aGUgcmVzdWx0IG9mCisgIGNhbGxpbmcgOm1ldGg6YF9fZ2V0c3RhdGVfX2AgaXMgcGlja2xhYmxlICAoc2VlIHNlY3Rpb24gOnJlZjpgcGlja2xlLXByb3RvY29sYAorICBmb3IgZGV0YWlscykuCiAKIEF0dGVtcHRzIHRvIHBpY2tsZSB1bnBpY2tsYWJsZSBvYmplY3RzIHdpbGwgcmFpc2UgdGhlIDpleGM6YFBpY2tsaW5nRXJyb3JgCiBleGNlcHRpb247IHdoZW4gdGhpcyBoYXBwZW5zLCBhbiB1bnNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgbWF5IGhhdmUgYWxyZWFkeQpAQCAtMzY0LDggKzM2NSw4IEBACiAKIE5vdGUgdGhhdCBmdW5jdGlvbnMgKGJ1aWx0LWluIGFuZCB1c2VyLWRlZmluZWQpIGFyZSBwaWNrbGVkIGJ5ICJmdWxseSBxdWFsaWZpZWQiCiBuYW1lIHJlZmVyZW5jZSwgbm90IGJ5IHZhbHVlLiAgVGhpcyBtZWFucyB0aGF0IG9ubHkgdGhlIGZ1bmN0aW9uIG5hbWUgaXMKLXBpY2tsZWQsIGFsb25nIHdpdGggdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0aGUgZnVuY3Rpb24gaXMgZGVmaW5lZCBpbi4gIE5laXRoZXIgdGhlCi1mdW5jdGlvbidzIGNvZGUsIG5vciBhbnkgb2YgaXRzIGZ1bmN0aW9uIGF0dHJpYnV0ZXMgYXJlIHBpY2tsZWQuICBUaHVzIHRoZQorcGlja2xlZCwgYWxvbmcgd2l0aCB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkIGluLiAgTmVpdGhlcgordGhlIGZ1bmN0aW9uJ3MgY29kZSwgbm9yIGFueSBvZiBpdHMgZnVuY3Rpb24gYXR0cmlidXRlcyBhcmUgcGlja2xlZC4gIFRodXMgdGhlCiBkZWZpbmluZyBtb2R1bGUgbXVzdCBiZSBpbXBvcnRhYmxlIGluIHRoZSB1bnBpY2tsaW5nIGVudmlyb25tZW50LCBhbmQgdGhlIG1vZHVsZQogbXVzdCBjb250YWluIHRoZSBuYW1lZCBvYmplY3QsIG90aGVyd2lzZSBhbiBleGNlcHRpb24gd2lsbCBiZSByYWlzZWQuIFsjXV8KIApAQCAtNDQyLDcgKzQ0Myw3IEBACiAgICBkZWZpbmVzIHRoZSBtZXRob2QgOm1ldGg6YF9fZ2V0c3RhdGVfX2AsIGl0IGlzIGNhbGxlZCBhbmQgdGhlIHJldHVybiBzdGF0ZSBpcwogICAgcGlja2xlZCBhcyB0aGUgY29udGVudHMgZm9yIHRoZSBpbnN0YW5jZSwgaW5zdGVhZCBvZiB0aGUgY29udGVudHMgb2YgdGhlCiAgICBpbnN0YW5jZSdzIGRpY3Rpb25hcnkuICBJZiB0aGVyZSBpcyBubyA6bWV0aDpgX19nZXRzdGF0ZV9fYCBtZXRob2QsIHRoZQotICAgaW5zdGFuY2UncyA6YXR0cjpgX19kaWN0X19gIGlzIHBpY2tsZWQuCisgICBpbnN0YW5jZSdzIDphdHRyOmB+b2JqZWN0Ll9fZGljdF9fYCBpcyBwaWNrbGVkLgogCiAuLiBtZXRob2Q6OiBvYmplY3QuX19zZXRzdGF0ZV9fKHN0YXRlKQogCkBAIC01MTAsNyArNTExLDggQEAKICAgICogT3B0aW9uYWxseSwgdGhlIG9iamVjdCdzIHN0YXRlLCB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgb2JqZWN0J3MKICAgICAgOm1ldGg6YF9fc2V0c3RhdGVfX2AgbWV0aG9kIGFzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDpyZWY6YHBpY2tsZS1pbnN0YC4gIElmCiAgICAgIHRoZSBvYmplY3QgaGFzIG5vIDptZXRoOmBfX3NldHN0YXRlX19gIG1ldGhvZCwgdGhlbiwgYXMgYWJvdmUsIHRoZSB2YWx1ZQotICAgICBtdXN0IGJlIGEgZGljdGlvbmFyeSBhbmQgaXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgb2JqZWN0J3MgOmF0dHI6YF9fZGljdF9fYC4KKyAgICAgbXVzdCBiZSBhIGRpY3Rpb25hcnkgYW5kIGl0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIG9iamVjdCdzCisgICAgIDphdHRyOmB+b2JqZWN0Ll9fZGljdF9fYC4KIAogICAgKiBPcHRpb25hbGx5LCBhbiBpdGVyYXRvciAoYW5kIG5vdCBhIHNlcXVlbmNlKSB5aWVsZGluZyBzdWNjZXNzaXZlIGxpc3QKICAgICAgaXRlbXMuICBUaGVzZSBsaXN0IGl0ZW1zIHdpbGwgYmUgcGlja2xlZCwgYW5kIGFwcGVuZGVkIHRvIHRoZSBvYmplY3QgdXNpbmcKQEAgLTU2OCwxOSArNTcwLDIwIEBACiBmdW5jdGlvbnMgb24gdGhlIHBpY2tsZXIgYW5kIHVucGlja2xlci4gWyNdXwogCiBUbyBkZWZpbmUgZXh0ZXJuYWwgcGVyc2lzdGVudCBpZCByZXNvbHV0aW9uLCB5b3UgbmVlZCB0byBzZXQgdGhlCi06YXR0cjpgcGVyc2lzdGVudF9pZGAgYXR0cmlidXRlIG9mIHRoZSBwaWNrbGVyIG9iamVjdCBhbmQgdGhlCi06YXR0cjpgcGVyc2lzdGVudF9sb2FkYCBhdHRyaWJ1dGUgb2YgdGhlIHVucGlja2xlciBvYmplY3QuCis6YXR0cjpgflBpY2tsZXIucGVyc2lzdGVudF9pZGAgYXR0cmlidXRlIG9mIHRoZSBwaWNrbGVyIG9iamVjdCBhbmQgdGhlCis6YXR0cjpgflVucGlja2xlci5wZXJzaXN0ZW50X2xvYWRgIGF0dHJpYnV0ZSBvZiB0aGUgdW5waWNrbGVyIG9iamVjdC4KIAogVG8gcGlja2xlIG9iamVjdHMgdGhhdCBoYXZlIGFuIGV4dGVybmFsIHBlcnNpc3RlbnQgaWQsIHRoZSBwaWNrbGVyIG11c3QgaGF2ZSBhCi1jdXN0b20gOmZ1bmM6YHBlcnNpc3RlbnRfaWRgIG1ldGhvZCB0aGF0IHRha2VzIGFuIG9iamVjdCBhcyBhbiBhcmd1bWVudCBhbmQKLXJldHVybnMgZWl0aGVyIGBgTm9uZWBgIG9yIHRoZSBwZXJzaXN0ZW50IGlkIGZvciB0aGF0IG9iamVjdC4gIFdoZW4gYGBOb25lYGAgaXMKLXJldHVybmVkLCB0aGUgcGlja2xlciBzaW1wbHkgcGlja2xlcyB0aGUgb2JqZWN0IGFzIG5vcm1hbC4gIFdoZW4gYSBwZXJzaXN0ZW50IGlkCi1zdHJpbmcgaXMgcmV0dXJuZWQsIHRoZSBwaWNrbGVyIHdpbGwgcGlja2xlIHRoYXQgc3RyaW5nLCBhbG9uZyB3aXRoIGEgbWFya2VyIHNvCi10aGF0IHRoZSB1bnBpY2tsZXIgd2lsbCByZWNvZ25pemUgdGhlIHN0cmluZyBhcyBhIHBlcnNpc3RlbnQgaWQuCitjdXN0b20gOmZ1bmM6YH5QaWNrbGVyLnBlcnNpc3RlbnRfaWRgIG1ldGhvZCB0aGF0IHRha2VzIGFuIG9iamVjdCBhcyBhbgorYXJndW1lbnQgYW5kIHJldHVybnMgZWl0aGVyIGBgTm9uZWBgIG9yIHRoZSBwZXJzaXN0ZW50IGlkIGZvciB0aGF0IG9iamVjdC4KK1doZW4gYGBOb25lYGAgaXMgcmV0dXJuZWQsIHRoZSBwaWNrbGVyIHNpbXBseSBwaWNrbGVzIHRoZSBvYmplY3QgYXMgbm9ybWFsLgorV2hlbiBhIHBlcnNpc3RlbnQgaWQgc3RyaW5nIGlzIHJldHVybmVkLCB0aGUgcGlja2xlciB3aWxsIHBpY2tsZSB0aGF0IHN0cmluZywKK2Fsb25nIHdpdGggYSBtYXJrZXIgc28gdGhhdCB0aGUgdW5waWNrbGVyIHdpbGwgcmVjb2duaXplIHRoZSBzdHJpbmcgYXMgYQorcGVyc2lzdGVudCBpZC4KIAogVG8gdW5waWNrbGUgZXh0ZXJuYWwgb2JqZWN0cywgdGhlIHVucGlja2xlciBtdXN0IGhhdmUgYSBjdXN0b20KLTpmdW5jOmBwZXJzaXN0ZW50X2xvYWRgIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBwZXJzaXN0ZW50IGlkIHN0cmluZyBhbmQgcmV0dXJucwotdGhlIHJlZmVyZW5jZWQgb2JqZWN0LgorOmZ1bmM6YH5VbnBpY2tsZXIucGVyc2lzdGVudF9sb2FkYCBmdW5jdGlvbiB0aGF0IHRha2VzIGEgcGVyc2lzdGVudCBpZCBzdHJpbmcKK2FuZCByZXR1cm5zIHRoZSByZWZlcmVuY2VkIG9iamVjdC4KIAogSGVyZSdzIGEgc2lsbHkgZXhhbXBsZSB0aGF0ICptaWdodCogc2hlZCBtb3JlIGxpZ2h0OjoKIApAQCAtNjMwLDEzICs2MzMsMTQgQEAKICAgIGogPSB1cC5sb2FkKCkKICAgIHByaW50IGoKIAotSW4gdGhlIDptb2Q6YGNQaWNrbGVgIG1vZHVsZSwgdGhlIHVucGlja2xlcidzIDphdHRyOmBwZXJzaXN0ZW50X2xvYWRgIGF0dHJpYnV0ZQotY2FuIGFsc28gYmUgc2V0IHRvIGEgUHl0aG9uIGxpc3QsIGluIHdoaWNoIGNhc2UsIHdoZW4gdGhlIHVucGlja2xlciByZWFjaGVzIGEKLXBlcnNpc3RlbnQgaWQsIHRoZSBwZXJzaXN0ZW50IGlkIHN0cmluZyB3aWxsIHNpbXBseSBiZSBhcHBlbmRlZCB0byB0aGlzIGxpc3QuCi1UaGlzIGZ1bmN0aW9uYWxpdHkgZXhpc3RzIHNvIHRoYXQgYSBwaWNrbGUgZGF0YSBzdHJlYW0gY2FuIGJlICJzbmlmZmVkIiBmb3IKLW9iamVjdCByZWZlcmVuY2VzIHdpdGhvdXQgYWN0dWFsbHkgaW5zdGFudGlhdGluZyBhbGwgdGhlIG9iamVjdHMgaW4gYSBwaWNrbGUuCi1bI11fICBTZXR0aW5nIDphdHRyOmBwZXJzaXN0ZW50X2xvYWRgIHRvIGEgbGlzdCBpcyB1c3VhbGx5IHVzZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIDptZXRoOmBub2xvYWRgIG1ldGhvZCBvbiB0aGUgVW5waWNrbGVyLgorSW4gdGhlIDptb2Q6YGNQaWNrbGVgIG1vZHVsZSwgdGhlIHVucGlja2xlcidzIDphdHRyOmB+VW5waWNrbGVyLnBlcnNpc3RlbnRfbG9hZGAKK2F0dHJpYnV0ZSBjYW4gYWxzbyBiZSBzZXQgdG8gYSBQeXRob24gbGlzdCwgaW4gd2hpY2ggY2FzZSwgd2hlbiB0aGUgdW5waWNrbGVyCityZWFjaGVzIGEgcGVyc2lzdGVudCBpZCwgdGhlIHBlcnNpc3RlbnQgaWQgc3RyaW5nIHdpbGwgc2ltcGx5IGJlIGFwcGVuZGVkIHRvCit0aGlzIGxpc3QuICBUaGlzIGZ1bmN0aW9uYWxpdHkgZXhpc3RzIHNvIHRoYXQgYSBwaWNrbGUgZGF0YSBzdHJlYW0gY2FuIGJlCisic25pZmZlZCIgZm9yIG9iamVjdCByZWZlcmVuY2VzIHdpdGhvdXQgYWN0dWFsbHkgaW5zdGFudGlhdGluZyBhbGwgdGhlIG9iamVjdHMKK2luIGEgcGlja2xlLgorWyNdXyAgU2V0dGluZyA6YXR0cjpgflVucGlja2xlci5wZXJzaXN0ZW50X2xvYWRgIHRvIGEgbGlzdCBpcyB1c3VhbGx5IHVzZWQgaW4KK2Nvbmp1bmN0aW9uIHdpdGggdGhlIDptZXRoOmB+VW5waWNrbGVyLm5vbG9hZGAgbWV0aG9kIG9uIHRoZSBVbnBpY2tsZXIuCiAKIC4uIEJBVzogQm90aCBwaWNrbGUgYW5kIGNQaWNrbGUgc3VwcG9ydCBzb21ldGhpbmcgY2FsbGVkIGluc3RfcGVyc2lzdGVudF9pZCgpCiAgICB3aGljaCBhcHBlYXJzIHRvIGdpdmUgdW5rbm93biB0eXBlcyBhIHNlY29uZCBzaG90IGF0IHByb2R1Y2luZyBhIHBlcnNpc3RlbnQKQEAgLTY3NCwxMyArNjc4LDEzIEBACiB5b3UncmUgcmlnaHQuICBSZWZlciB0byB0aGUgc291cmNlIGNvZGUgdG8gbWFrZSB0aGlzIHdvcmsuCiAKIFRoaW5ncyBhcmUgYSBsaXR0bGUgY2xlYW5lciB3aXRoIDptb2Q6YGNQaWNrbGVgLCBidXQgbm90IGJ5IG11Y2guIFRvIGNvbnRyb2wKLXdoYXQgZ2V0cyB1bnBpY2tsZWQsIHlvdSBjYW4gc2V0IHRoZSB1bnBpY2tsZXIncyA6YXR0cjpgZmluZF9nbG9iYWxgIGF0dHJpYnV0ZQotdG8gYSBmdW5jdGlvbiBvciBgYE5vbmVgYC4gIElmIGl0IGlzIGBgTm9uZWBgIHRoZW4gYW55IGF0dGVtcHRzIHRvIHVucGlja2xlCi1pbnN0YW5jZXMgd2lsbCByYWlzZSBhbiA6ZXhjOmBVbnBpY2tsaW5nRXJyb3JgLiAgSWYgaXQgaXMgYSBmdW5jdGlvbiwgdGhlbiBpdAotc2hvdWxkIGFjY2VwdCBhIG1vZHVsZSBuYW1lIGFuZCBhIGNsYXNzIG5hbWUsIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3MKLW9iamVjdC4gIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBsb29raW5nIHVwIHRoZSBjbGFzcyBhbmQgcGVyZm9ybWluZyBhbnkgbmVjZXNzYXJ5Ci1pbXBvcnRzLCBhbmQgaXQgbWF5IHJhaXNlIGFuIGVycm9yIHRvIHByZXZlbnQgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcyBmcm9tIGJlaW5nCi11bnBpY2tsZWQuCit3aGF0IGdldHMgdW5waWNrbGVkLCB5b3UgY2FuIHNldCB0aGUgdW5waWNrbGVyJ3MgOmF0dHI6YH5VbnBpY2tsZXIuZmluZF9nbG9iYWxgCithdHRyaWJ1dGUgdG8gYSBmdW5jdGlvbiBvciBgYE5vbmVgYC4gIElmIGl0IGlzIGBgTm9uZWBgIHRoZW4gYW55IGF0dGVtcHRzIHRvCit1bnBpY2tsZSBpbnN0YW5jZXMgd2lsbCByYWlzZSBhbiA6ZXhjOmBVbnBpY2tsaW5nRXJyb3JgLiAgSWYgaXQgaXMgYSBmdW5jdGlvbiwKK3RoZW4gaXQgc2hvdWxkIGFjY2VwdCBhIG1vZHVsZSBuYW1lIGFuZCBhIGNsYXNzIG5hbWUsIGFuZCByZXR1cm4gdGhlCitjb3JyZXNwb25kaW5nIGNsYXNzIG9iamVjdC4gIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBsb29raW5nIHVwIHRoZSBjbGFzcyBhbmQKK3BlcmZvcm1pbmcgYW55IG5lY2Vzc2FyeSBpbXBvcnRzLCBhbmQgaXQgbWF5IHJhaXNlIGFuIGVycm9yIHRvIHByZXZlbnQKK2luc3RhbmNlcyBvZiB0aGUgY2xhc3MgZnJvbSBiZWluZyB1bnBpY2tsZWQuCiAKIFRoZSBtb3JhbCBvZiB0aGUgc3RvcnkgaXMgdGhhdCB5b3Ugc2hvdWxkIGJlIHJlYWxseSBjYXJlZnVsIGFib3V0IHRoZSBzb3VyY2Ugb2YKIHRoZSBzdHJpbmdzIHlvdXIgYXBwbGljYXRpb24gdW5waWNrbGVzLgpAQCAtNzMxLDcgKzczNSw3IEBACiAKIEhlcmUncyBhIGxhcmdlciBleGFtcGxlIHRoYXQgc2hvd3MgaG93IHRvIG1vZGlmeSBwaWNrbGluZyBiZWhhdmlvciBmb3IgYSBjbGFzcy4KIFRoZSA6Y2xhc3M6YFRleHRSZWFkZXJgIGNsYXNzIG9wZW5zIGEgdGV4dCBmaWxlLCBhbmQgcmV0dXJucyB0aGUgbGluZSBudW1iZXIgYW5kCi1saW5lIGNvbnRlbnRzIGVhY2ggdGltZSBpdHMgOm1ldGg6YHJlYWRsaW5lYCBtZXRob2QgaXMgY2FsbGVkLiBJZiBhCitsaW5lIGNvbnRlbnRzIGVhY2ggdGltZSBpdHMgOm1ldGg6YCFyZWFkbGluZWAgbWV0aG9kIGlzIGNhbGxlZC4gSWYgYQogOmNsYXNzOmBUZXh0UmVhZGVyYCBpbnN0YW5jZSBpcyBwaWNrbGVkLCBhbGwgYXR0cmlidXRlcyAqZXhjZXB0KiB0aGUgZmlsZSBvYmplY3QKIG1lbWJlciBhcmUgc2F2ZWQuIFdoZW4gdGhlIGluc3RhbmNlIGlzIHVucGlja2xlZCwgdGhlIGZpbGUgaXMgcmVvcGVuZWQsIGFuZAogcmVhZGluZyByZXN1bWVzIGZyb20gdGhlIGxhc3QgbG9jYXRpb24uIFRoZSA6bWV0aDpgX19zZXRzdGF0ZV9fYCBhbmQKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3BpY2tsZXRvb2xzLnJzdCBiL0RvYy9saWJyYXJ5L3BpY2tsZXRvb2xzLnJzdAppbmRleCBjZTQ3Yzk3Li5lYmIzMGFiIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9waWNrbGV0b29scy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvcGlja2xldG9vbHMucnN0CkBAIC0yMCw3ICsyMCw3IEBACiBwcm9iYWJseSB3b24ndCBmaW5kIHRoZSA6bW9kOmBwaWNrbGV0b29sc2AgbW9kdWxlIHJlbGV2YW50LgogCiAKLS4uIGZ1bmN0aW9uOjogZGlzKHBpY2tsZVssIG91dD1Ob25lLCBtZW1vPU5vbmUsIGluZGVudGxldmVsPTRdKQorLi4gZnVuY3Rpb246OiBkaXMocGlja2xlLCBvdXQ9Tm9uZSwgbWVtbz1Ob25lLCBpbmRlbnRsZXZlbD00KQogCiAgICBPdXRwdXRzIGEgc3ltYm9saWMgZGlzYXNzZW1ibHkgb2YgdGhlIHBpY2tsZSB0byB0aGUgZmlsZS1saWtlIG9iamVjdCAqb3V0KiwKICAgIGRlZmF1bHRpbmcgdG8gYGBzeXMuc3Rkb3V0YGAuICAqcGlja2xlKiBjYW4gYmUgYSBzdHJpbmcgb3IgYSBmaWxlLWxpa2Ugb2JqZWN0LgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvcGlwZXMucnN0IGIvRG9jL2xpYnJhcnkvcGlwZXMucnN0CmluZGV4IDAxNmE3MjAuLjQxNWQ1YzcgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3BpcGVzLnJzdAorKysgYi9Eb2MvbGlicmFyeS9waXBlcy5yc3QKQEAgLTE2LDggKzE2LDYgQEAKIEJlY2F1c2UgdGhlIG1vZHVsZSB1c2VzIDpwcm9ncmFtOmAvYmluL3NoYCBjb21tYW5kIGxpbmVzLCBhIFBPU0lYIG9yIGNvbXBhdGlibGUKIHNoZWxsIGZvciA6ZnVuYzpgb3Muc3lzdGVtYCBhbmQgOmZ1bmM6YG9zLnBvcGVuYCBpcyByZXF1aXJlZC4KIAotVGhlIDptb2Q6YHBpcGVzYCBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGNsYXNzOgotCiAKIC4uIGNsYXNzOjogVGVtcGxhdGUoKQogCkBAIC0yNiwxNSArMjQsNTIgQEAKIEV4YW1wbGU6OgogCiAgICA+Pj4gaW1wb3J0IHBpcGVzCi0gICA+Pj4gdD1waXBlcy5UZW1wbGF0ZSgpCisgICA+Pj4gdCA9IHBpcGVzLlRlbXBsYXRlKCkKICAgID4+PiB0LmFwcGVuZCgndHIgYS16IEEtWicsICctLScpCi0gICA+Pj4gZj10Lm9wZW4oJy90bXAvMScsICd3JykKKyAgID4+PiBmID0gdC5vcGVuKCdwaXBlZmlsZScsICd3JykKICAgID4+PiBmLndyaXRlKCdoZWxsbyB3b3JsZCcpCiAgICA+Pj4gZi5jbG9zZSgpCi0gICA+Pj4gb3BlbignL3RtcC8xJykucmVhZCgpCisgICA+Pj4gb3BlbigncGlwZWZpbGUnKS5yZWFkKCkKICAgICdIRUxMTyBXT1JMRCcKIAogCisuLiBmdW5jdGlvbjo6IHF1b3RlKHMpCisKKyAgIC4uIGRlcHJlY2F0ZWQ6OiAyLjcKKyAgICAgIFByaW9yIHRvIFB5dGhvbiAyLjcsIHRoaXMgZnVuY3Rpb24gd2FzIG5vdCBwdWJsaWNseSBkb2N1bWVudGVkLiAgSXQgaXMKKyAgICAgIGZpbmFsbHkgZXhwb3NlZCBwdWJsaWNseSBpbiBQeXRob24gMy4zIGFzIHRoZQorICAgICAgOmZ1bmM6YHF1b3RlIDxzaGxleC5xdW90ZT5gIGZ1bmN0aW9uIGluIHRoZSA6bW9kOmBzaGxleGAgbW9kdWxlLgorCisgICBSZXR1cm4gYSBzaGVsbC1lc2NhcGVkIHZlcnNpb24gb2YgdGhlIHN0cmluZyAqcyouICBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgYQorICAgc3RyaW5nIHRoYXQgY2FuIHNhZmVseSBiZSB1c2VkIGFzIG9uZSB0b2tlbiBpbiBhIHNoZWxsIGNvbW1hbmQgbGluZSwgZm9yCisgICBjYXNlcyB3aGVyZSB5b3UgY2Fubm90IHVzZSBhIGxpc3QuCisKKyAgIFRoaXMgaWRpb20gd291bGQgYmUgdW5zYWZlOjoKKworICAgICAgPj4+IGZpbGVuYW1lID0gJ3NvbWVmaWxlOyBybSAtcmYgficKKyAgICAgID4+PiBjb21tYW5kID0gJ2xzIC1sIHt9Jy5mb3JtYXQoZmlsZW5hbWUpCisgICAgICA+Pj4gcHJpbnQgY29tbWFuZCAgIyBleGVjdXRlZCBieSBhIHNoZWxsOiBib29tIQorICAgICAgbHMgLWwgc29tZWZpbGU7IHJtIC1yZiB+CisKKyAgIDpmdW5jOmBxdW90ZWAgbGV0cyB5b3UgcGx1ZyB0aGUgc2VjdXJpdHkgaG9sZTo6CisKKyAgICAgID4+PiBjb21tYW5kID0gJ2xzIC1sIHt9Jy5mb3JtYXQocXVvdGUoZmlsZW5hbWUpKQorICAgICAgPj4+IHByaW50IGNvbW1hbmQKKyAgICAgIGxzIC1sICdzb21lZmlsZTsgcm0gLXJmIH4nCisgICAgICA+Pj4gcmVtb3RlX2NvbW1hbmQgPSAnc3NoIGhvbWUge30nLmZvcm1hdChxdW90ZShjb21tYW5kKSkKKyAgICAgID4+PiBwcmludCByZW1vdGVfY29tbWFuZAorICAgICAgc3NoIGhvbWUgJ2xzIC1sICciJyInc29tZWZpbGU7IHJtIC1yZiB+JyInIicnCisKKyAgIFRoZSBxdW90aW5nIGlzIGNvbXBhdGlibGUgd2l0aCBVTklYIHNoZWxscyBhbmQgd2l0aCA6ZnVuYzpgc2hsZXguc3BsaXRgOgorCisgICAgICA+Pj4gcmVtb3RlX2NvbW1hbmQgPSBzaGxleC5zcGxpdChyZW1vdGVfY29tbWFuZCkKKyAgICAgID4+PiByZW1vdGVfY29tbWFuZAorICAgICAgWydzc2gnLCAnaG9tZScsICJscyAtbCAnc29tZWZpbGU7IHJtIC1yZiB+JyJdCisgICAgICA+Pj4gY29tbWFuZCA9IHNobGV4LnNwbGl0KHJlbW90ZV9jb21tYW5kWy0xXSkKKyAgICAgID4+PiBjb21tYW5kCisgICAgICBbJ2xzJywgJy1sJywgJ3NvbWVmaWxlOyBybSAtcmYgfiddCisKKwogLi4gX3RlbXBsYXRlLW9iamVjdHM6CiAKIFRlbXBsYXRlIE9iamVjdHMKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3BsYXRmb3JtLnJzdCBiL0RvYy9saWJyYXJ5L3BsYXRmb3JtLnJzdAppbmRleCAwYjc4ZDQ5Li5jYjcxNDRhIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9wbGF0Zm9ybS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvcGxhdGZvcm0ucnN0CkBAIC0zMyw4ICszMyw4IEBACiAgICByZXR1cm5lZCBhcyBzdHJpbmdzLgogCiAgICBWYWx1ZXMgdGhhdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBhcmUgcmV0dXJuZWQgYXMgZ2l2ZW4gYnkgdGhlIHBhcmFtZXRlciBwcmVzZXRzLgotICAgSWYgYml0cyBpcyBnaXZlbiBhcyBgYCcnYGAsIHRoZSA6Y2Z1bmM6YHNpemVvZihwb2ludGVyKWAgKG9yCi0gICA6Y2Z1bmM6YHNpemVvZihsb25nKWAgb24gUHl0aG9uIHZlcnNpb24gPCAxLjUuMikgaXMgdXNlZCBhcyBpbmRpY2F0b3IgZm9yIHRoZQorICAgSWYgYml0cyBpcyBnaXZlbiBhcyBgYCcnYGAsIHRoZSA6YzpmdW5jOmBzaXplb2YocG9pbnRlcilgIChvcgorICAgOmM6ZnVuYzpgc2l6ZW9mKGxvbmcpYCBvbiBQeXRob24gdmVyc2lvbiA8IDEuNS4yKSBpcyB1c2VkIGFzIGluZGljYXRvciBmb3IgdGhlCiAgICBzdXBwb3J0ZWQgcG9pbnRlciBzaXplLgogCiAgICBUaGUgZnVuY3Rpb24gcmVsaWVzIG9uIHRoZSBzeXN0ZW0ncyA6ZmlsZTpgZmlsZWAgY29tbWFuZCB0byBkbyB0aGUgYWN0dWFsIHdvcmsuCkBAIC0xOTcsOCArMTk3LDggQEAKIC4uIGZ1bmN0aW9uOjogd2luMzJfdmVyKHJlbGVhc2U9JycsIHZlcnNpb249JycsIGNzZD0nJywgcHR5cGU9JycpCiAKICAgIEdldCBhZGRpdGlvbmFsIHZlcnNpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUgV2luZG93cyBSZWdpc3RyeSBhbmQgcmV0dXJuIGEgdHVwbGUKLSAgIGBgKHZlcnNpb24sIGNzZCwgcHR5cGUpYGAgcmVmZXJyaW5nIHRvIHZlcnNpb24gbnVtYmVyLCBDU0QgbGV2ZWwgYW5kIE9TIHR5cGUKLSAgIChtdWx0aS9zaW5nbGUgcHJvY2Vzc29yKS4KKyAgIGBgKHJlbGVhc2UsIHZlcnNpb24sIGNzZCwgcHR5cGUpYGAgcmVmZXJyaW5nIHRvIE9TIHJlbGVhc2UsIHZlcnNpb24gbnVtYmVyLAorICAgQ1NEIGxldmVsIChzZXJ2aWNlIHBhY2spIGFuZCBPUyB0eXBlIChtdWx0aS9zaW5nbGUgcHJvY2Vzc29yKS4KIAogICAgQXMgYSBoaW50OiAqcHR5cGUqIGlzIGBgJ1VuaXByb2Nlc3NvciBGcmVlJ2BgIG9uIHNpbmdsZSBwcm9jZXNzb3IgTlQgbWFjaGluZXMKICAgIGFuZCBgYCdNdWx0aXByb2Nlc3NvciBGcmVlJ2BgIG9uIG11bHRpIHByb2Nlc3NvciBtYWNoaW5lcy4gVGhlIConRnJlZScqIHJlZmVycwpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvcGxpc3RsaWIucnN0IGIvRG9jL2xpYnJhcnkvcGxpc3RsaWIucnN0CmluZGV4IDExMjY4YzIuLmM2OTMwYzYgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3BsaXN0bGliLnJzdAorKysgYi9Eb2MvbGlicmFyeS9wbGlzdGxpYi5yc3QKQEAgLTc0LDcgKzc0LDcgQEAKIAogCiAKLS4uIGZ1bmN0aW9uOjogcmVhZFBsaXN0RnJvbVJlc291cmNlKHBhdGhbLCByZXN0eXBlPSdwbHN0J1ssIHJlc2lkPTBdXSkKKy4uIGZ1bmN0aW9uOjogcmVhZFBsaXN0RnJvbVJlc291cmNlKHBhdGgsIHJlc3R5cGU9J3Bsc3QnLCByZXNpZD0wKQogCiAgICAgUmVhZCBhIHBsaXN0IGZyb20gdGhlIHJlc291cmNlIHdpdGggdHlwZSAqcmVzdHlwZSogZnJvbSB0aGUgcmVzb3VyY2UgZm9yayBvZgogICAgICpwYXRoKi4gIEF2YWlsYWJpbGl0eTogTWFjIE9TIFguCkBAIC04NCw3ICs4NCw3IEBACiAgICAgICAgSW4gUHl0aG9uIDMueCwgdGhpcyBmdW5jdGlvbiBoYXMgYmVlbiByZW1vdmVkLgogCiAKLS4uIGZ1bmN0aW9uOjogd3JpdGVQbGlzdFRvUmVzb3VyY2Uocm9vdE9iamVjdCwgcGF0aFssIHJlc3R5cGU9J3Bsc3QnWywgcmVzaWQ9MF1dKQorLi4gZnVuY3Rpb246OiB3cml0ZVBsaXN0VG9SZXNvdXJjZShyb290T2JqZWN0LCBwYXRoLCByZXN0eXBlPSdwbHN0JywgcmVzaWQ9MCkKIAogICAgIFdyaXRlICpyb290T2JqZWN0KiBhcyBhIHJlc291cmNlIHdpdGggdHlwZSAqcmVzdHlwZSogdG8gdGhlIHJlc291cmNlIGZvcmsgb2YKICAgICAqcGF0aCouICBBdmFpbGFiaWxpdHk6IE1hYyBPUyBYLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvcG9wZW4yLnJzdCBiL0RvYy9saWJyYXJ5L3BvcGVuMi5yc3QKaW5kZXggNDY0NmRkOS4uNjI4ZWM2ZSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvcG9wZW4yLnJzdAorKysgYi9Eb2MvbGlicmFyeS9wb3BlbjIucnN0CkBAIC0xMDQsNyArMTA0LDcgQEAKIAogICAgV2FpdHMgZm9yIGFuZCByZXR1cm5zIHRoZSBzdGF0dXMgY29kZSBvZiB0aGUgY2hpbGQgcHJvY2Vzcy4gIFRoZSBzdGF0dXMgY29kZQogICAgZW5jb2RlcyBib3RoIHRoZSByZXR1cm4gY29kZSBvZiB0aGUgcHJvY2VzcyBhbmQgaW5mb3JtYXRpb24gYWJvdXQgd2hldGhlciBpdAotICAgZXhpdGVkIHVzaW5nIHRoZSA6Y2Z1bmM6YGV4aXRgIHN5c3RlbSBjYWxsIG9yIGRpZWQgZHVlIHRvIGEgc2lnbmFsLiAgRnVuY3Rpb25zCisgICBleGl0ZWQgdXNpbmcgdGhlIDpjOmZ1bmM6YGV4aXRgIHN5c3RlbSBjYWxsIG9yIGRpZWQgZHVlIHRvIGEgc2lnbmFsLiAgRnVuY3Rpb25zCiAgICB0byBoZWxwIGludGVycHJldCB0aGUgc3RhdHVzIGNvZGUgYXJlIGRlZmluZWQgaW4gdGhlIDptb2Q6YG9zYCBtb2R1bGU7IHNlZQogICAgc2VjdGlvbiA6cmVmOmBvcy1wcm9jZXNzYCBmb3IgdGhlIDpmdW5jOmBXXCpgIGZhbWlseSBvZiBmdW5jdGlvbnMuCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3BvcGxpYi5yc3QgYi9Eb2MvbGlicmFyeS9wb3BsaWIucnN0CmluZGV4IDg0NTYzMDQuLjA3YzI0M2YgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3BvcGxpYi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvcG9wbGliLnJzdApAQCAtMjQsNyArMjQsNyBAQAogbWFpbHNlcnZlciBzdXBwb3J0cyBJTUFQLCB5b3Ugd291bGQgYmUgYmV0dGVyIG9mZiB1c2luZyB0aGUKIDpjbGFzczpgaW1hcGxpYi5JTUFQNGAgY2xhc3MsIGFzIElNQVAgc2VydmVycyB0ZW5kIHRvIGJlIGJldHRlciBpbXBsZW1lbnRlZC4KIAotQSBzaW5nbGUgY2xhc3MgaXMgcHJvdmlkZWQgYnkgdGhlIDptb2Q6YHBvcGxpYmAgbW9kdWxlOgorVGhlIDptb2Q6YHBvcGxpYmAgbW9kdWxlIHByb3ZpZGVzIHR3byBjbGFzc2VzOgogCiAKIC4uIGNsYXNzOjogUE9QMyhob3N0WywgcG9ydFssIHRpbWVvdXRdXSkKQEAgLTEwMiw3ICsxMDIsNyBAQAogLi4gbWV0aG9kOjogUE9QMy5wYXNzXyhwYXNzd29yZCkKIAogICAgU2VuZCBwYXNzd29yZCwgcmVzcG9uc2UgaW5jbHVkZXMgbWVzc2FnZSBjb3VudCBhbmQgbWFpbGJveCBzaXplLiBOb3RlOiB0aGUKLSAgIG1haWxib3ggb24gdGhlIHNlcnZlciBpcyBsb2NrZWQgdW50aWwgOm1ldGg6YHF1aXRgIGlzIGNhbGxlZC4KKyAgIG1haWxib3ggb24gdGhlIHNlcnZlciBpcyBsb2NrZWQgdW50aWwgOm1ldGg6YH5wb3BsaWIucXVpdGAgaXMgY2FsbGVkLgogCiAKIC4uIG1ldGhvZDo6IFBPUDMuYXBvcCh1c2VyLCBzZWNyZXQpCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9wb3NpeC5yc3QgYi9Eb2MvbGlicmFyeS9wb3NpeC5yc3QKaW5kZXggOGM4ZGRkZS4uZDI4ZWQyZCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvcG9zaXgucnN0CisrKyBiL0RvYy9saWJyYXJ5L3Bvc2l4LnJzdApAQCAtMTksNyArMTksNyBAQAogYXZhaWxhYmxlIHRocm91Z2ggdGhlIDptb2Q6YG9zYCBpbnRlcmZhY2UuICBPbmNlIDptb2Q6YG9zYCBpcyBpbXBvcnRlZCwgdGhlcmUgaXMKICpubyogcGVyZm9ybWFuY2UgcGVuYWx0eSBpbiB1c2luZyBpdCBpbnN0ZWFkIG9mIDptb2Q6YHBvc2l4YC4gIEluIGFkZGl0aW9uLAogOm1vZDpgb3NgIHByb3ZpZGVzIHNvbWUgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5LCBzdWNoIGFzIGF1dG9tYXRpY2FsbHkgY2FsbGluZwotOmZ1bmM6YHB1dGVudmAgd2hlbiBhbiBlbnRyeSBpbiBgYG9zLmVudmlyb25gYCBpcyBjaGFuZ2VkLgorOmZ1bmM6YH5vcy5wdXRlbnZgIHdoZW4gYW4gZW50cnkgaW4gYGBvcy5lbnZpcm9uYGAgaXMgY2hhbmdlZC4KIAogRXJyb3JzIGFyZSByZXBvcnRlZCBhcyBleGNlcHRpb25zOyB0aGUgdXN1YWwgZXhjZXB0aW9ucyBhcmUgZ2l2ZW4gZm9yIHR5cGUKIGVycm9ycywgd2hpbGUgZXJyb3JzIHJlcG9ydGVkIGJ5IHRoZSBzeXN0ZW0gY2FsbHMgcmFpc2UgOmV4YzpgT1NFcnJvcmAuCkBAIC0zOCwxMyArMzgsMTMgQEAKIAogU2V2ZXJhbCBvcGVyYXRpbmcgc3lzdGVtcyAoaW5jbHVkaW5nIEFJWCwgSFAtVVgsIElyaXggYW5kIFNvbGFyaXMpIHByb3ZpZGUKIHN1cHBvcnQgZm9yIGZpbGVzIHRoYXQgYXJlIGxhcmdlciB0aGFuIDIgR0IgZnJvbSBhIEMgcHJvZ3JhbW1pbmcgbW9kZWwgd2hlcmUKLTpjdHlwZTpgaW50YCBhbmQgOmN0eXBlOmBsb25nYCBhcmUgMzItYml0IHZhbHVlcy4gVGhpcyBpcyB0eXBpY2FsbHkgYWNjb21wbGlzaGVkCis6Yzp0eXBlOmBpbnRgIGFuZCA6Yzp0eXBlOmBsb25nYCBhcmUgMzItYml0IHZhbHVlcy4gVGhpcyBpcyB0eXBpY2FsbHkgYWNjb21wbGlzaGVkCiBieSBkZWZpbmluZyB0aGUgcmVsZXZhbnQgc2l6ZSBhbmQgb2Zmc2V0IHR5cGVzIGFzIDY0LWJpdCB2YWx1ZXMuIFN1Y2ggZmlsZXMgYXJlCiBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgOmRmbjpgbGFyZ2UgZmlsZXNgLgogCi1MYXJnZSBmaWxlIHN1cHBvcnQgaXMgZW5hYmxlZCBpbiBQeXRob24gd2hlbiB0aGUgc2l6ZSBvZiBhbiA6Y3R5cGU6YG9mZl90YCBpcwotbGFyZ2VyIHRoYW4gYSA6Y3R5cGU6YGxvbmdgIGFuZCB0aGUgOmN0eXBlOmBsb25nIGxvbmdgIHR5cGUgaXMgYXZhaWxhYmxlIGFuZCBpcwotYXQgbGVhc3QgYXMgbGFyZ2UgYXMgYW4gOmN0eXBlOmBvZmZfdGAuIFB5dGhvbiBsb25ncyBhcmUgdGhlbiB1c2VkIHRvIHJlcHJlc2VudAorTGFyZ2UgZmlsZSBzdXBwb3J0IGlzIGVuYWJsZWQgaW4gUHl0aG9uIHdoZW4gdGhlIHNpemUgb2YgYW4gOmM6dHlwZTpgb2ZmX3RgIGlzCitsYXJnZXIgdGhhbiBhIDpjOnR5cGU6YGxvbmdgIGFuZCB0aGUgOmM6dHlwZTpgbG9uZyBsb25nYCB0eXBlIGlzIGF2YWlsYWJsZSBhbmQgaXMKK2F0IGxlYXN0IGFzIGxhcmdlIGFzIGFuIDpjOnR5cGU6YG9mZl90YC4gUHl0aG9uIGxvbmdzIGFyZSB0aGVuIHVzZWQgdG8gcmVwcmVzZW50CiBmaWxlIHNpemVzLCBvZmZzZXRzIGFuZCBvdGhlciB2YWx1ZXMgdGhhdCBjYW4gZXhjZWVkIHRoZSByYW5nZSBvZiBhIFB5dGhvbiBpbnQuCiBJdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIGNvbmZpZ3VyZSBhbmQgY29tcGlsZSBQeXRob24gd2l0aCBjZXJ0YWluIGNvbXBpbGVyIGZsYWdzCiB0byBlbmFibGUgdGhpcyBtb2RlLiBGb3IgZXhhbXBsZSwgaXQgaXMgZW5hYmxlZCBieSBkZWZhdWx0IHdpdGggcmVjZW50IHZlcnNpb25zCkBAIC03NCw5ICs3NCwxMCBAQAogICAgZGlyZWN0b3J5LCBlcXVpdmFsZW50IHRvIGBgZ2V0ZW52KCJIT01FIilgYCBpbiBDLgogCiAgICBNb2RpZnlpbmcgdGhpcyBkaWN0aW9uYXJ5IGRvZXMgbm90IGFmZmVjdCB0aGUgc3RyaW5nIGVudmlyb25tZW50IHBhc3NlZCBvbiBieQotICAgOmZ1bmM6YGV4ZWN2YCwgOmZ1bmM6YHBvcGVuYCBvciA6ZnVuYzpgc3lzdGVtYDsgaWYgeW91IG5lZWQgdG8gY2hhbmdlIHRoZQotICAgZW52aXJvbm1lbnQsIHBhc3MgYGBlbnZpcm9uYGAgdG8gOmZ1bmM6YGV4ZWN2ZWAgb3IgYWRkIHZhcmlhYmxlIGFzc2lnbm1lbnRzIGFuZAotICAgZXhwb3J0IHN0YXRlbWVudHMgdG8gdGhlIGNvbW1hbmQgc3RyaW5nIGZvciA6ZnVuYzpgc3lzdGVtYCBvciA6ZnVuYzpgcG9wZW5gLgorICAgOmZ1bmM6YH5vcy5leGVjdmAsIDpmdW5jOmB+b3MucG9wZW5gIG9yIDpmdW5jOmB+b3Muc3lzdGVtYDsgaWYgeW91IG5lZWQgdG8KKyAgIGNoYW5nZSB0aGUgZW52aXJvbm1lbnQsIHBhc3MgYGBlbnZpcm9uYGAgdG8gOmZ1bmM6YH5vcy5leGVjdmVgIG9yIGFkZAorICAgdmFyaWFibGUgYXNzaWdubWVudHMgYW5kIGV4cG9ydCBzdGF0ZW1lbnRzIHRvIHRoZSBjb21tYW5kIHN0cmluZyBmb3IKKyAgIDpmdW5jOmB+b3Muc3lzdGVtYCBvciA6ZnVuYzpgfm9zLnBvcGVuYC4KIAogICAgLi4gbm90ZTo6CiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3Bvc2l4ZmlsZS5yc3QgYi9Eb2MvbGlicmFyeS9wb3NpeGZpbGUucnN0CmluZGV4IGMyN2U0MTIuLjk3ZWY4MDAgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3Bvc2l4ZmlsZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvcG9zaXhmaWxlLnJzdApAQCAtMTgxLDcgKzE4MSw3IEBACiAKICAgIGltcG9ydCBwb3NpeGZpbGUKIAotICAgZmlsZSA9IHBvc2l4ZmlsZS5vcGVuKCcvdG1wL3Rlc3QnLCAndycpCisgICBmaWxlID0gcG9zaXhmaWxlLm9wZW4oJ3Rlc3RmaWxlJywgJ3cnKQogICAgZmlsZS5sb2NrKCd3fCcpCiAgICAuLi4KICAgIGZpbGUubG9jaygndScpCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9wcHJpbnQucnN0IGIvRG9jL2xpYnJhcnkvcHByaW50LnJzdAppbmRleCBhMGE3MjAwLi44ZTdiYWY4IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9wcHJpbnQucnN0CisrKyBiL0RvYy9saWJyYXJ5L3BwcmludC5yc3QKQEAgLTM2LDcgKzM2LDcgQEAKIC4uIEZpcnN0IHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzczoKIAogCi0uLiBjbGFzczo6IFByZXR0eVByaW50ZXIoLi4uKQorLi4gY2xhc3M6OiBQcmV0dHlQcmludGVyKGluZGVudD0xLCB3aWR0aD04MCwgZGVwdGg9Tm9uZSwgc3RyZWFtPU5vbmUpCiAKICAgIENvbnN0cnVjdCBhIDpjbGFzczpgUHJldHR5UHJpbnRlcmAgaW5zdGFuY2UuICBUaGlzIGNvbnN0cnVjdG9yIHVuZGVyc3RhbmRzCiAgICBzZXZlcmFsIGtleXdvcmQgcGFyYW1ldGVycy4gIEFuIG91dHB1dCBzdHJlYW0gbWF5IGJlIHNldCB1c2luZyB0aGUgKnN0cmVhbSoKQEAgLTczLDkgKzczLDcgQEAKIAogVGhlIDpjbGFzczpgUHJldHR5UHJpbnRlcmAgY2xhc3Mgc3VwcG9ydHMgc2V2ZXJhbCBkZXJpdmF0aXZlIGZ1bmN0aW9uczoKIAotLi4gTm93IHRoZSBkZXJpdmF0aXZlIGZ1bmN0aW9uczoKLQotLi4gZnVuY3Rpb246OiBwZm9ybWF0KG9iamVjdFssIGluZGVudFssIHdpZHRoWywgZGVwdGhdXV0pCisuLiBmdW5jdGlvbjo6IHBmb3JtYXQob2JqZWN0LCBpbmRlbnQ9MSwgd2lkdGg9ODAsIGRlcHRoPU5vbmUpCiAKICAgIFJldHVybiB0aGUgZm9ybWF0dGVkIHJlcHJlc2VudGF0aW9uIG9mICpvYmplY3QqIGFzIGEgc3RyaW5nLiAgKmluZGVudCosICp3aWR0aCoKICAgIGFuZCAqZGVwdGgqIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSA6Y2xhc3M6YFByZXR0eVByaW50ZXJgIGNvbnN0cnVjdG9yIGFzCkBAIC04NSwxMCArODMsMTAgQEAKICAgICAgIFRoZSBwYXJhbWV0ZXJzICppbmRlbnQqLCAqd2lkdGgqIGFuZCAqZGVwdGgqIHdlcmUgYWRkZWQuCiAKIAotLi4gZnVuY3Rpb246OiBwcHJpbnQob2JqZWN0Wywgc3RyZWFtWywgaW5kZW50Wywgd2lkdGhbLCBkZXB0aF1dXV0pCisuLiBmdW5jdGlvbjo6IHBwcmludChvYmplY3QsIHN0cmVhbT1Ob25lLCBpbmRlbnQ9MSwgd2lkdGg9ODAsIGRlcHRoPU5vbmUpCiAKICAgIFByaW50cyB0aGUgZm9ybWF0dGVkIHJlcHJlc2VudGF0aW9uIG9mICpvYmplY3QqIG9uICpzdHJlYW0qLCBmb2xsb3dlZCBieSBhCi0gICBuZXdsaW5lLiAgSWYgKnN0cmVhbSogaXMgb21pdHRlZCwgYGBzeXMuc3Rkb3V0YGAgaXMgdXNlZC4gIFRoaXMgbWF5IGJlIHVzZWQgaW4KKyAgIG5ld2xpbmUuICBJZiAqc3RyZWFtKiBpcyBgYE5vbmVgYCwgYGBzeXMuc3Rkb3V0YGAgaXMgdXNlZC4gIFRoaXMgbWF5IGJlIHVzZWQgaW4KICAgIHRoZSBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlciBpbnN0ZWFkIG9mIGEgOmtleXdvcmQ6YHByaW50YCBzdGF0ZW1lbnQgZm9yCiAgICBpbnNwZWN0aW5nIHZhbHVlcy4gICAgKmluZGVudCosICp3aWR0aCogYW5kICpkZXB0aCogd2lsbCBiZSBwYXNzZWQgdG8gdGhlCiAgICA6Y2xhc3M6YFByZXR0eVByaW50ZXJgIGNvbnN0cnVjdG9yIGFzIGZvcm1hdHRpbmcgcGFyYW1ldGVycy4KQEAgLTIwNiw3ICsyMDQsOCBAQAogcHByaW50IEV4YW1wbGUKIC0tLS0tLS0tLS0tLS0tCiAKLVRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgc2V2ZXJhbCB1c2VzIG9mIHRoZSA6ZnVuYzpgcHByaW50YCBmdW5jdGlvbiBhbmQgaXRzIHBhcmFtZXRlcnMuCitUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHNldmVyYWwgdXNlcyBvZiB0aGUgOmZ1bmM6YHBwcmludGAgZnVuY3Rpb24gYW5kIGl0cworcGFyYW1ldGVycy4KIAogICAgPj4+IGltcG9ydCBwcHJpbnQKICAgID4+PiB0dXAgPSAoJ3NwYW0nLCAoJ2VnZ3MnLCAoJ2x1bWJlcmphY2snLCAoJ2tuaWdodHMnLCAoJ25pJywgKCdkZWFkJywKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3Byb2ZpbGUucnN0IGIvRG9jL2xpYnJhcnkvcHJvZmlsZS5yc3QKaW5kZXggMjM2MzI0ZC4uMGZiMTQ4OSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvcHJvZmlsZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvcHJvZmlsZS5yc3QKQEAgLTQsMTEgKzQsNiBAQAogVGhlIFB5dGhvbiBQcm9maWxlcnMKICoqKioqKioqKioqKioqKioqKioqCiAKLS4uIHNlY3Rpb25hdXRob3I6OiBKYW1lcyBSb3NraW5kCi0KLS4uIG1vZHVsZTo6IHByb2ZpbGUKLSAgIDpzeW5vcHNpczogUHl0aG9uIHNvdXJjZSBwcm9maWxlci4KLQogKipTb3VyY2UgY29kZToqKiA6c291cmNlOmBMaWIvcHJvZmlsZS5weWAgYW5kIDpzb3VyY2U6YExpYi9wc3RhdHMucHlgCiAKIC0tLS0tLS0tLS0tLS0tCkBAIC0yMiwzMyArMTcsMzEgQEAKICAgIHNpbmdsZTogZGV0ZXJtaW5pc3RpYyBwcm9maWxpbmcKICAgIHNpbmdsZTogcHJvZmlsaW5nLCBkZXRlcm1pbmlzdGljCiAKLUEgOmRmbjpgcHJvZmlsZXJgIGlzIGEgcHJvZ3JhbSB0aGF0IGRlc2NyaWJlcyB0aGUgcnVuIHRpbWUgcGVyZm9ybWFuY2UKLW9mIGEgcHJvZ3JhbSwgcHJvdmlkaW5nIGEgdmFyaWV0eSBvZiBzdGF0aXN0aWNzLiAgVGhpcyBkb2N1bWVudGF0aW9uCi1kZXNjcmliZXMgdGhlIHByb2ZpbGVyIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgaW4gdGhlIG1vZHVsZXMKLTptb2Q6YGNQcm9maWxlYCwgOm1vZDpgcHJvZmlsZWAgYW5kIDptb2Q6YHBzdGF0c2AuICBUaGlzIHByb2ZpbGVyCi1wcm92aWRlcyA6ZGZuOmBkZXRlcm1pbmlzdGljIHByb2ZpbGluZ2Agb2YgUHl0aG9uIHByb2dyYW1zLiAgSXQgYWxzbwotcHJvdmlkZXMgYSBzZXJpZXMgb2YgcmVwb3J0IGdlbmVyYXRpb24gdG9vbHMgdG8gYWxsb3cgdXNlcnMgdG8gcmFwaWRseQotZXhhbWluZSB0aGUgcmVzdWx0cyBvZiBhIHByb2ZpbGUgb3BlcmF0aW9uLgorOm1vZDpgY1Byb2ZpbGVgIGFuZCA6bW9kOmBwcm9maWxlYCBwcm92aWRlIDpkZm46YGRldGVybWluaXN0aWMgcHJvZmlsaW5nYCBvZgorUHl0aG9uIHByb2dyYW1zLiBBIDpkZm46YHByb2ZpbGVgIGlzIGEgc2V0IG9mIHN0YXRpc3RpY3MgdGhhdCBkZXNjcmliZXMgaG93CitvZnRlbiBhbmQgZm9yIGhvdyBsb25nIHZhcmlvdXMgcGFydHMgb2YgdGhlIHByb2dyYW0gZXhlY3V0ZWQuIFRoZXNlIHN0YXRpc3RpY3MKK2NhbiBiZSBmb3JtYXR0ZWQgaW50byByZXBvcnRzIHZpYSB0aGUgOm1vZDpgcHN0YXRzYCBtb2R1bGUuCiAKLVRoZSBQeXRob24gc3RhbmRhcmQgbGlicmFyeSBwcm92aWRlcyB0aHJlZSBkaWZmZXJlbnQgcHJvZmlsZXJzOgorVGhlIFB5dGhvbiBzdGFuZGFyZCBsaWJyYXJ5IHByb3ZpZGVzIHRocmVlIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIHNhbWUKK3Byb2ZpbGluZyBpbnRlcmZhY2U6CiAKLSMuIDptb2Q6YGNQcm9maWxlYCBpcyByZWNvbW1lbmRlZCBmb3IgbW9zdCB1c2VyczsgaXQncyBhIEMgZXh0ZW5zaW9uCi0gICB3aXRoIHJlYXNvbmFibGUgb3ZlcmhlYWQKLSAgIHRoYXQgbWFrZXMgaXQgc3VpdGFibGUgZm9yIHByb2ZpbGluZyBsb25nLXJ1bm5pbmcgcHJvZ3JhbXMuCi0gICBCYXNlZCBvbiA6bW9kOmBsc3Byb2ZgLAotICAgY29udHJpYnV0ZWQgYnkgQnJldHQgUm9zZW4gYW5kIFRlZCBDem90dGVyLgorMS4gOm1vZDpgY1Byb2ZpbGVgIGlzIHJlY29tbWVuZGVkIGZvciBtb3N0IHVzZXJzOyBpdCdzIGEgQyBleHRlbnNpb24gd2l0aAorICAgcmVhc29uYWJsZSBvdmVyaGVhZCB0aGF0IG1ha2VzIGl0IHN1aXRhYmxlIGZvciBwcm9maWxpbmcgbG9uZy1ydW5uaW5nCisgICBwcm9ncmFtcy4gIEJhc2VkIG9uIDptb2Q6YGxzcHJvZmAsIGNvbnRyaWJ1dGVkIGJ5IEJyZXR0IFJvc2VuIGFuZCBUZWQKKyAgIEN6b3R0ZXIuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNQogCi0jLiA6bW9kOmBwcm9maWxlYCwgYSBwdXJlIFB5dGhvbiBtb2R1bGUgd2hvc2UgaW50ZXJmYWNlIGlzIGltaXRhdGVkIGJ5Ci0gICA6bW9kOmBjUHJvZmlsZWAuICBBZGRzIHNpZ25pZmljYW50IG92ZXJoZWFkIHRvIHByb2ZpbGVkIHByb2dyYW1zLgotICAgSWYgeW91J3JlIHRyeWluZyB0byBleHRlbmQKLSAgIHRoZSBwcm9maWxlciBpbiBzb21lIHdheSwgdGhlIHRhc2sgbWlnaHQgYmUgZWFzaWVyIHdpdGggdGhpcyBtb2R1bGUuCisyLiA6bW9kOmBwcm9maWxlYCwgYSBwdXJlIFB5dGhvbiBtb2R1bGUgd2hvc2UgaW50ZXJmYWNlIGlzIGltaXRhdGVkIGJ5CisgICA6bW9kOmBjUHJvZmlsZWAsIGJ1dCB3aGljaCBhZGRzIHNpZ25pZmljYW50IG92ZXJoZWFkIHRvIHByb2ZpbGVkIHByb2dyYW1zLgorICAgSWYgeW91J3JlIHRyeWluZyB0byBleHRlbmQgdGhlIHByb2ZpbGVyIGluIHNvbWUgd2F5LCB0aGUgdGFzayBtaWdodCBiZSBlYXNpZXIKKyAgIHdpdGggdGhpcyBtb2R1bGUuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi40Ci0gICAgICBOb3cgYWxzbyByZXBvcnRzIHRoZSB0aW1lIHNwZW50IGluIGNhbGxzIHRvIGJ1aWx0LWluIGZ1bmN0aW9ucyBhbmQgbWV0aG9kcy4KKyAgICAgIE5vdyBhbHNvIHJlcG9ydHMgdGhlIHRpbWUgc3BlbnQgaW4gY2FsbHMgdG8gYnVpbHQtaW4gZnVuY3Rpb25zCisgICAgICBhbmQgbWV0aG9kcy4KIAotIy4gOm1vZDpgaG90c2hvdGAgd2FzIGFuIGV4cGVyaW1lbnRhbCBDIG1vZHVsZSB0aGF0IGZvY3VzZWQgb24gbWluaW1pemluZworMy4gOm1vZDpgaG90c2hvdGAgd2FzIGFuIGV4cGVyaW1lbnRhbCBDIG1vZHVsZSB0aGF0IGZvY3VzZWQgb24gbWluaW1pemluZwogICAgdGhlIG92ZXJoZWFkIG9mIHByb2ZpbGluZywgYXQgdGhlIGV4cGVuc2Ugb2YgbG9uZ2VyIGRhdGEKICAgIHBvc3QtcHJvY2Vzc2luZyB0aW1lcy4gIEl0IGlzIG5vIGxvbmdlciBtYWludGFpbmVkIGFuZCBtYXkgYmUKICAgIGRyb3BwZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBQeXRob24uCkBAIC02NSw2ICs1OCwxNSBAQAogOm1vZDpgX2xzcHJvZmAgbW9kdWxlLiAgVGhlIDptb2Q6YGhvdHNob3RgIG1vZHVsZSBpcyByZXNlcnZlZCBmb3Igc3BlY2lhbGl6ZWQKIHVzYWdlLgogCisuLiBub3RlOjoKKworICAgVGhlIHByb2ZpbGVyIG1vZHVsZXMgYXJlIGRlc2lnbmVkIHRvIHByb3ZpZGUgYW4gZXhlY3V0aW9uIHByb2ZpbGUgZm9yIGEgZ2l2ZW4KKyAgIHByb2dyYW0sIG5vdCBmb3IgYmVuY2htYXJraW5nIHB1cnBvc2VzIChmb3IgdGhhdCwgdGhlcmUgaXMgOm1vZDpgdGltZWl0YCBmb3IKKyAgIHJlYXNvbmFibHkgYWNjdXJhdGUgcmVzdWx0cykuICBUaGlzIHBhcnRpY3VsYXJseSBhcHBsaWVzIHRvIGJlbmNobWFya2luZworICAgUHl0aG9uIGNvZGUgYWdhaW5zdCBDIGNvZGU6IHRoZSBwcm9maWxlcnMgaW50cm9kdWNlIG92ZXJoZWFkIGZvciBQeXRob24gY29kZSwKKyAgIGJ1dCBub3QgZm9yIEMtbGV2ZWwgZnVuY3Rpb25zLCBhbmQgc28gdGhlIEMgY29kZSB3b3VsZCBzZWVtIGZhc3RlciB0aGFuIGFueQorICAgUHl0aG9uIG9uZS4KKwogCiAuLiBfcHJvZmlsZS1pbnN0YW50OgogCkBAIC03NSw1NyArNzcsOTQgQEAKIHByb3ZpZGVzIGEgdmVyeSBicmllZiBvdmVydmlldywgYW5kIGFsbG93cyBhIHVzZXIgdG8gcmFwaWRseSBwZXJmb3JtIHByb2ZpbGluZwogb24gYW4gZXhpc3RpbmcgYXBwbGljYXRpb24uCiAKLVRvIHByb2ZpbGUgYW4gYXBwbGljYXRpb24gd2l0aCBhIG1haW4gZW50cnkgcG9pbnQgb2YgOmZ1bmM6YGZvb2AsIHlvdSB3b3VsZCBhZGQKLXRoZSBmb2xsb3dpbmcgdG8geW91ciBtb2R1bGU6OgorVG8gcHJvZmlsZSBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQsIHlvdSBjYW4gZG86OgogCiAgICBpbXBvcnQgY1Byb2ZpbGUKLSAgIGNQcm9maWxlLnJ1bignZm9vKCknKQorICAgaW1wb3J0IHJlCisgICBjUHJvZmlsZS5ydW4oJ3JlLmNvbXBpbGUoImZvb3xiYXIiKScpCiAKIChVc2UgOm1vZDpgcHJvZmlsZWAgaW5zdGVhZCBvZiA6bW9kOmBjUHJvZmlsZWAgaWYgdGhlIGxhdHRlciBpcyBub3QgYXZhaWxhYmxlIG9uCiB5b3VyIHN5c3RlbS4pCiAKLVRoZSBhYm92ZSBhY3Rpb24gd291bGQgY2F1c2UgOmZ1bmM6YGZvb2AgdG8gYmUgcnVuLCBhbmQgYSBzZXJpZXMgb2YgaW5mb3JtYXRpdmUKLWxpbmVzICh0aGUgcHJvZmlsZSkgdG8gYmUgcHJpbnRlZC4gIFRoZSBhYm92ZSBhcHByb2FjaCBpcyBtb3N0IHVzZWZ1bCB3aGVuCi13b3JraW5nIHdpdGggdGhlIGludGVycHJldGVyLiAgSWYgeW91IHdvdWxkIGxpa2UgdG8gc2F2ZSB0aGUgcmVzdWx0cyBvZiBhCi1wcm9maWxlIGludG8gYSBmaWxlIGZvciBsYXRlciBleGFtaW5hdGlvbiwgeW91IGNhbiBzdXBwbHkgYSBmaWxlIG5hbWUgYXMgdGhlCi1zZWNvbmQgYXJndW1lbnQgdG8gdGhlIDpmdW5jOmBydW5gIGZ1bmN0aW9uOjoKK1RoZSBhYm92ZSBhY3Rpb24gd291bGQgcnVuIDpmdW5jOmByZS5jb21waWxlYCBhbmQgcHJpbnQgcHJvZmlsZSByZXN1bHRzIGxpa2UKK3RoZSBmb2xsb3dpbmc6OgorCisgICAgICAgICAxOTcgZnVuY3Rpb24gY2FsbHMgKDE5MiBwcmltaXRpdmUgY2FsbHMpIGluIDAuMDAyIHNlY29uZHMKKworICAgT3JkZXJlZCBieTogc3RhbmRhcmQgbmFtZQorCisgICBuY2FsbHMgIHRvdHRpbWUgIHBlcmNhbGwgIGN1bXRpbWUgIHBlcmNhbGwgZmlsZW5hbWU6bGluZW5vKGZ1bmN0aW9uKQorICAgICAgICAxICAgIDAuMDAwICAgIDAuMDAwICAgIDAuMDAxICAgIDAuMDAxIDxzdHJpbmc+OjEoPG1vZHVsZT4pCisgICAgICAgIDEgICAgMC4wMDAgICAgMC4wMDAgICAgMC4wMDEgICAgMC4wMDEgcmUucHk6MjEyKGNvbXBpbGUpCisgICAgICAgIDEgICAgMC4wMDAgICAgMC4wMDAgICAgMC4wMDEgICAgMC4wMDEgcmUucHk6MjY4KF9jb21waWxlKQorICAgICAgICAxICAgIDAuMDAwICAgIDAuMDAwICAgIDAuMDAwICAgIDAuMDAwIHNyZV9jb21waWxlLnB5OjE3MihfY29tcGlsZV9jaGFyc2V0KQorICAgICAgICAxICAgIDAuMDAwICAgIDAuMDAwICAgIDAuMDAwICAgIDAuMDAwIHNyZV9jb21waWxlLnB5OjIwMShfb3B0aW1pemVfY2hhcnNldCkKKyAgICAgICAgNCAgICAwLjAwMCAgICAwLjAwMCAgICAwLjAwMCAgICAwLjAwMCBzcmVfY29tcGlsZS5weToyNShfaWRlbnRpdHlmdW5jdGlvbikKKyAgICAgIDMvMSAgICAwLjAwMCAgICAwLjAwMCAgICAwLjAwMCAgICAwLjAwMCBzcmVfY29tcGlsZS5weTozMyhfY29tcGlsZSkKKworVGhlIGZpcnN0IGxpbmUgaW5kaWNhdGVzIHRoYXQgMTk3IGNhbGxzIHdlcmUgbW9uaXRvcmVkLiAgT2YgdGhvc2UgY2FsbHMsIDE5Mgord2VyZSA6ZGZuOmBwcmltaXRpdmVgLCBtZWFuaW5nIHRoYXQgdGhlIGNhbGwgd2FzIG5vdCBpbmR1Y2VkIHZpYSByZWN1cnNpb24uIFRoZQorbmV4dCBsaW5lOiBgYE9yZGVyZWQgYnk6IHN0YW5kYXJkIG5hbWVgYCwgaW5kaWNhdGVzIHRoYXQgdGhlIHRleHQgc3RyaW5nIGluIHRoZQorZmFyIHJpZ2h0IGNvbHVtbiB3YXMgdXNlZCB0byBzb3J0IHRoZSBvdXRwdXQuIFRoZSBjb2x1bW4gaGVhZGluZ3MgaW5jbHVkZToKKworbmNhbGxzCisgICBmb3IgdGhlIG51bWJlciBvZiBjYWxscywKKwordG90dGltZQorICAgIGZvciB0aGUgdG90YWwgdGltZSBzcGVudCBpbiB0aGUgZ2l2ZW4gZnVuY3Rpb24gKGFuZCBleGNsdWRpbmcgdGltZSBtYWRlIGluCisgICAgY2FsbHMgdG8gc3ViLWZ1bmN0aW9ucykKKworcGVyY2FsbAorICAgaXMgdGhlIHF1b3RpZW50IG9mIGBgdG90dGltZWBgIGRpdmlkZWQgYnkgYGBuY2FsbHNgYAorCitjdW10aW1lCisgICBpcyB0aGUgY3VtdWxhdGl2ZSB0aW1lIHNwZW50IGluIHRoaXMgYW5kIGFsbCBzdWJmdW5jdGlvbnMgKGZyb20gaW52b2NhdGlvbgorICAgdGlsbCBleGl0KS4gVGhpcyBmaWd1cmUgaXMgYWNjdXJhdGUgKmV2ZW4qIGZvciByZWN1cnNpdmUgZnVuY3Rpb25zLgorCitwZXJjYWxsCisgICBpcyB0aGUgcXVvdGllbnQgb2YgYGBjdW10aW1lYGAgZGl2aWRlZCBieSBwcmltaXRpdmUgY2FsbHMKKworZmlsZW5hbWU6bGluZW5vKGZ1bmN0aW9uKQorICAgcHJvdmlkZXMgdGhlIHJlc3BlY3RpdmUgZGF0YSBvZiBlYWNoIGZ1bmN0aW9uCisKK1doZW4gdGhlcmUgYXJlIHR3byBudW1iZXJzIGluIHRoZSBmaXJzdCBjb2x1bW4gKGZvciBleGFtcGxlIGBgMy8xYGApLCBpdCBtZWFucwordGhhdCB0aGUgZnVuY3Rpb24gcmVjdXJzZWQuICBUaGUgc2Vjb25kIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgcHJpbWl0aXZlIGNhbGxzCithbmQgdGhlIGZvcm1lciBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIGNhbGxzLiAgTm90ZSB0aGF0IHdoZW4gdGhlIGZ1bmN0aW9uIGRvZXMKK25vdCByZWN1cnNlLCB0aGVzZSB0d28gdmFsdWVzIGFyZSB0aGUgc2FtZSwgYW5kIG9ubHkgdGhlIHNpbmdsZSBmaWd1cmUgaXMKK3ByaW50ZWQuCisKK0luc3RlYWQgb2YgcHJpbnRpbmcgdGhlIG91dHB1dCBhdCB0aGUgZW5kIG9mIHRoZSBwcm9maWxlIHJ1biwgeW91IGNhbiBzYXZlIHRoZQorcmVzdWx0cyB0byBhIGZpbGUgYnkgc3BlY2lmeWluZyBhIGZpbGVuYW1lIHRvIHRoZSA6ZnVuYzpgcnVuYCBmdW5jdGlvbjo6CiAKICAgIGltcG9ydCBjUHJvZmlsZQotICAgY1Byb2ZpbGUucnVuKCdmb28oKScsICdmb29wcm9mJykKKyAgIGltcG9ydCByZQorICAgY1Byb2ZpbGUucnVuKCdyZS5jb21waWxlKCJmb298YmFyIiknLCAncmVzdGF0cycpCiAKLVRoZSBmaWxlIDpmaWxlOmBjUHJvZmlsZS5weWAgY2FuIGFsc28gYmUgaW52b2tlZCBhcyBhIHNjcmlwdCB0byBwcm9maWxlIGFub3RoZXIKK1RoZSA6Y2xhc3M6YHBzdGF0cy5TdGF0c2AgY2xhc3MgcmVhZHMgcHJvZmlsZSByZXN1bHRzIGZyb20gYSBmaWxlIGFuZCBmb3JtYXRzCit0aGVtIGluIHZhcmlvdXMgd2F5cy4KKworVGhlIGZpbGUgOm1vZDpgY1Byb2ZpbGVgIGNhbiBhbHNvIGJlIGludm9rZWQgYXMgYSBzY3JpcHQgdG8gcHJvZmlsZSBhbm90aGVyCiBzY3JpcHQuICBGb3IgZXhhbXBsZTo6CiAKLSAgIHB5dGhvbiAtbSBjUHJvZmlsZSBteXNjcmlwdC5weQorICAgcHl0aG9uIC1tIGNQcm9maWxlIFstbyBvdXRwdXRfZmlsZV0gWy1zIHNvcnRfb3JkZXJdIG15c2NyaXB0LnB5CiAKLTpmaWxlOmBjUHJvZmlsZS5weWAgYWNjZXB0cyB0d28gb3B0aW9uYWwgYXJndW1lbnRzIG9uIHRoZSBjb21tYW5kIGxpbmU6OgorYGAtb2BgIHdyaXRlcyB0aGUgcHJvZmlsZSByZXN1bHRzIHRvIGEgZmlsZSBpbnN0ZWFkIG9mIHRvIHN0ZG91dAogCi0gICBjUHJvZmlsZS5weSBbLW8gb3V0cHV0X2ZpbGVdIFstcyBzb3J0X29yZGVyXQorYGAtc2BgIHNwZWNpZmllcyBvbmUgb2YgdGhlIDpmdW5jOmB+cHN0YXRzLlN0YXRzLnNvcnRfc3RhdHNgIHNvcnQgdmFsdWVzIHRvIHNvcnQKK3RoZSBvdXRwdXQgYnkuIFRoaXMgb25seSBhcHBsaWVzIHdoZW4gYGAtb2BgIGlzIG5vdCBzdXBwbGllZC4KIAotYGAtc2BgIG9ubHkgYXBwbGllcyB0byBzdGFuZGFyZCBvdXRwdXQgKGBgLW9gYCBpcyBub3Qgc3VwcGxpZWQpLgotTG9vayBpbiB0aGUgOmNsYXNzOmBTdGF0c2AgZG9jdW1lbnRhdGlvbiBmb3IgdmFsaWQgc29ydCB2YWx1ZXMuCi0KLVdoZW4geW91IHdpc2ggdG8gcmV2aWV3IHRoZSBwcm9maWxlLCB5b3Ugc2hvdWxkIHVzZSB0aGUgbWV0aG9kcyBpbiB0aGUKLTptb2Q6YHBzdGF0c2AgbW9kdWxlLiAgVHlwaWNhbGx5IHlvdSB3b3VsZCBsb2FkIHRoZSBzdGF0aXN0aWNzIGRhdGEgYXMgZm9sbG93czo6CitUaGUgOm1vZDpgcHN0YXRzYCBtb2R1bGUncyA6Y2xhc3M6YH5wc3RhdHMuU3RhdHNgIGNsYXNzIGhhcyBhIHZhcmlldHkgb2YgbWV0aG9kcworZm9yIG1hbmlwdWxhdGluZyBhbmQgcHJpbnRpbmcgdGhlIGRhdGEgc2F2ZWQgaW50byBhIHByb2ZpbGUgcmVzdWx0cyBmaWxlOjoKIAogICAgaW1wb3J0IHBzdGF0cwotICAgcCA9IHBzdGF0cy5TdGF0cygnZm9vcHJvZicpCi0KLVRoZSBjbGFzcyA6Y2xhc3M6YFN0YXRzYCAodGhlIGFib3ZlIGNvZGUganVzdCBjcmVhdGVkIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MpCi1oYXMgYSB2YXJpZXR5IG9mIG1ldGhvZHMgZm9yIG1hbmlwdWxhdGluZyBhbmQgcHJpbnRpbmcgdGhlIGRhdGEgdGhhdCB3YXMganVzdAotcmVhZCBpbnRvIGBgcGBgLiAgV2hlbiB5b3UgcmFuIDpmdW5jOmBjUHJvZmlsZS5ydW5gIGFib3ZlLCB3aGF0IHdhcyBwcmludGVkIHdhcwotdGhlIHJlc3VsdCBvZiB0aHJlZSBtZXRob2QgY2FsbHM6OgotCisgICBwID0gcHN0YXRzLlN0YXRzKCdyZXN0YXRzJykKICAgIHAuc3RyaXBfZGlycygpLnNvcnRfc3RhdHMoLTEpLnByaW50X3N0YXRzKCkKIAotVGhlIGZpcnN0IG1ldGhvZCByZW1vdmVkIHRoZSBleHRyYW5lb3VzIHBhdGggZnJvbSBhbGwgdGhlIG1vZHVsZSBuYW1lcy4gVGhlCi1zZWNvbmQgbWV0aG9kIHNvcnRlZCBhbGwgdGhlIGVudHJpZXMgYWNjb3JkaW5nIHRvIHRoZSBzdGFuZGFyZCBtb2R1bGUvbGluZS9uYW1lCi1zdHJpbmcgdGhhdCBpcyBwcmludGVkLiBUaGUgdGhpcmQgbWV0aG9kIHByaW50ZWQgb3V0IGFsbCB0aGUgc3RhdGlzdGljcy4gIFlvdQotbWlnaHQgdHJ5IHRoZSBmb2xsb3dpbmcgc29ydCBjYWxsczoKLQotLi4gKHRoaXMgaXMgdG8gY29tcGx5IHdpdGggdGhlIHNlbWFudGljcyBvZiB0aGUgb2xkIHByb2ZpbGVyKS4KLQotOjoKK1RoZSA6bWV0aDpgfnBzdGF0cy5TdGF0cy5zdHJpcF9kaXJzYCBtZXRob2QgcmVtb3ZlZCB0aGUgZXh0cmFuZW91cyBwYXRoIGZyb20gYWxsCit0aGUgbW9kdWxlIG5hbWVzLiBUaGUgOm1ldGg6YH5wc3RhdHMuU3RhdHMuc29ydF9zdGF0c2AgbWV0aG9kIHNvcnRlZCBhbGwgdGhlCitlbnRyaWVzIGFjY29yZGluZyB0byB0aGUgc3RhbmRhcmQgbW9kdWxlL2xpbmUvbmFtZSBzdHJpbmcgdGhhdCBpcyBwcmludGVkLiBUaGUKKzptZXRoOmB+cHN0YXRzLlN0YXRzLnByaW50X3N0YXRzYCBtZXRob2QgcHJpbnRlZCBvdXQgYWxsIHRoZSBzdGF0aXN0aWNzLiAgWW91CittaWdodCB0cnkgdGhlIGZvbGxvd2luZyBzb3J0IGNhbGxzOjoKIAogICAgcC5zb3J0X3N0YXRzKCduYW1lJykKICAgIHAucHJpbnRfc3RhdHMoKQpAQCAtMTc0LDEyICsyMTMsMzA1IEBACiBndWVzcyB3aGF0IHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGRvOjoKIAogICAgcC5wcmludF9jYWxsZWVzKCkKLSAgIHAuYWRkKCdmb29wcm9mJykKKyAgIHAuYWRkKCdyZXN0YXRzJykKIAogSW52b2tlZCBhcyBhIHNjcmlwdCwgdGhlIDptb2Q6YHBzdGF0c2AgbW9kdWxlIGlzIGEgc3RhdGlzdGljcyBicm93c2VyIGZvcgogcmVhZGluZyBhbmQgZXhhbWluaW5nIHByb2ZpbGUgZHVtcHMuICBJdCBoYXMgYSBzaW1wbGUgbGluZS1vcmllbnRlZCBpbnRlcmZhY2UKIChpbXBsZW1lbnRlZCB1c2luZyA6bW9kOmBjbWRgKSBhbmQgaW50ZXJhY3RpdmUgaGVscC4KIAorOm1vZDpgcHJvZmlsZWAgYW5kIDptb2Q6YGNQcm9maWxlYCBNb2R1bGUgUmVmZXJlbmNlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy4uIG1vZHVsZTo6IGNQcm9maWxlCisuLiBtb2R1bGU6OiBwcm9maWxlCisgICA6c3lub3BzaXM6IFB5dGhvbiBzb3VyY2UgcHJvZmlsZXIuCisKK0JvdGggdGhlIDptb2Q6YHByb2ZpbGVgIGFuZCA6bW9kOmBjUHJvZmlsZWAgbW9kdWxlcyBwcm92aWRlIHRoZSBmb2xsb3dpbmcKK2Z1bmN0aW9uczoKKworLi4gZnVuY3Rpb246OiBydW4oY29tbWFuZCwgZmlsZW5hbWU9Tm9uZSwgc29ydD0tMSkKKworICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhIHNpbmdsZSBhcmd1bWVudCB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGhlIDpmdW5jOmBleGVjYAorICAgZnVuY3Rpb24sIGFuZCBhbiBvcHRpb25hbCBmaWxlIG5hbWUuICBJbiBhbGwgY2FzZXMgdGhpcyByb3V0aW5lIGV4ZWN1dGVzOjoKKworICAgICAgZXhlYyhjb21tYW5kLCBfX21haW5fXy5fX2RpY3RfXywgX19tYWluX18uX19kaWN0X18pCisKKyAgIGFuZCBnYXRoZXJzIHByb2ZpbGluZyBzdGF0aXN0aWNzIGZyb20gdGhlIGV4ZWN1dGlvbi4gSWYgbm8gZmlsZSBuYW1lIGlzCisgICBwcmVzZW50LCB0aGVuIHRoaXMgZnVuY3Rpb24gYXV0b21hdGljYWxseSBjcmVhdGVzIGEgOmNsYXNzOmB+cHN0YXRzLlN0YXRzYAorICAgaW5zdGFuY2UgYW5kIHByaW50cyBhIHNpbXBsZSBwcm9maWxpbmcgcmVwb3J0LiBJZiB0aGUgc29ydCB2YWx1ZSBpcyBzcGVjaWZpZWQKKyAgIGl0IGlzIHBhc3NlZCB0byB0aGlzIDpjbGFzczpgfnBzdGF0cy5TdGF0c2AgaW5zdGFuY2UgdG8gY29udHJvbCBob3cgdGhlCisgICByZXN1bHRzIGFyZSBzb3J0ZWQuCisKKy4uIGZ1bmN0aW9uOjogcnVuY3R4KGNvbW1hbmQsIGdsb2JhbHMsIGxvY2FscywgZmlsZW5hbWU9Tm9uZSkKKworICAgVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIDpmdW5jOmBydW5gLCB3aXRoIGFkZGVkIGFyZ3VtZW50cyB0byBzdXBwbHkgdGhlCisgICBnbG9iYWxzIGFuZCBsb2NhbHMgZGljdGlvbmFyaWVzIGZvciB0aGUgKmNvbW1hbmQqIHN0cmluZy4gVGhpcyByb3V0aW5lCisgICBleGVjdXRlczo6CisKKyAgICAgIGV4ZWMoY29tbWFuZCwgZ2xvYmFscywgbG9jYWxzKQorCisgICBhbmQgZ2F0aGVycyBwcm9maWxpbmcgc3RhdGlzdGljcyBhcyBpbiB0aGUgOmZ1bmM6YHJ1bmAgZnVuY3Rpb24gYWJvdmUuCisKKy4uIGNsYXNzOjogUHJvZmlsZSh0aW1lcj1Ob25lLCB0aW1ldW5pdD0wLjAsIHN1YmNhbGxzPVRydWUsIGJ1aWx0aW5zPVRydWUpCisKKyAgIFRoaXMgY2xhc3MgaXMgbm9ybWFsbHkgb25seSB1c2VkIGlmIG1vcmUgcHJlY2lzZSBjb250cm9sIG92ZXIgcHJvZmlsaW5nIGlzCisgICBuZWVkZWQgdGhhbiB3aGF0IHRoZSA6ZnVuYzpgY1Byb2ZpbGUucnVuYCBmdW5jdGlvbiBwcm92aWRlcy4KKworICAgQSBjdXN0b20gdGltZXIgY2FuIGJlIHN1cHBsaWVkIGZvciBtZWFzdXJpbmcgaG93IGxvbmcgY29kZSB0YWtlcyB0byBydW4gdmlhCisgICB0aGUgKnRpbWVyKiBhcmd1bWVudC4gVGhpcyBtdXN0IGJlIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgc2luZ2xlIG51bWJlcgorICAgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHRpbWUuIElmIHRoZSBudW1iZXIgaXMgYW4gaW50ZWdlciwgdGhlICp0aW1ldW5pdCoKKyAgIHNwZWNpZmllcyBhIG11bHRpcGxpZXIgdGhhdCBzcGVjaWZpZXMgdGhlIGR1cmF0aW9uIG9mIGVhY2ggdW5pdCBvZiB0aW1lLiBGb3IKKyAgIGV4YW1wbGUsIGlmIHRoZSB0aW1lciByZXR1cm5zIHRpbWVzIG1lYXN1cmVkIGluIHRob3VzYW5kcyBvZiBzZWNvbmRzLCB0aGUKKyAgIHRpbWUgdW5pdCB3b3VsZCBiZSBgYC4wMDFgYC4KKworICAgRGlyZWN0bHkgdXNpbmcgdGhlIDpjbGFzczpgUHJvZmlsZWAgY2xhc3MgYWxsb3dzIGZvcm1hdHRpbmcgcHJvZmlsZSByZXN1bHRzCisgICB3aXRob3V0IHdyaXRpbmcgdGhlIHByb2ZpbGUgZGF0YSB0byBhIGZpbGU6OgorCisgICAgICBpbXBvcnQgY1Byb2ZpbGUsIHBzdGF0cywgU3RyaW5nSU8KKyAgICAgIHByID0gY1Byb2ZpbGUuUHJvZmlsZSgpCisgICAgICBwci5lbmFibGUoKQorICAgICAgIyAuLi4gZG8gc29tZXRoaW5nIC4uLgorICAgICAgcHIuZGlzYWJsZSgpCisgICAgICBzID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgc29ydGJ5ID0gJ2N1bXVsYXRpdmUnCisgICAgICBwcyA9IHBzdGF0cy5TdGF0cyhwciwgc3RyZWFtPXMpLnNvcnRfc3RhdHMoc29ydGJ5KQorICAgICAgcHMucHJpbnRfc3RhdHMoKQorICAgICAgcHJpbnQgcy5nZXR2YWx1ZSgpCisKKyAgIC4uIG1ldGhvZDo6IGVuYWJsZSgpCisKKyAgICAgIFN0YXJ0IGNvbGxlY3RpbmcgcHJvZmlsaW5nIGRhdGEuCisKKyAgIC4uIG1ldGhvZDo6IGRpc2FibGUoKQorCisgICAgICBTdG9wIGNvbGxlY3RpbmcgcHJvZmlsaW5nIGRhdGEuCisKKyAgIC4uIG1ldGhvZDo6IGNyZWF0ZV9zdGF0cygpCisKKyAgICAgIFN0b3AgY29sbGVjdGluZyBwcm9maWxpbmcgZGF0YSBhbmQgcmVjb3JkIHRoZSByZXN1bHRzIGludGVybmFsbHkKKyAgICAgIGFzIHRoZSBjdXJyZW50IHByb2ZpbGUuCisKKyAgIC4uIG1ldGhvZDo6IHByaW50X3N0YXRzKHNvcnQ9LTEpCisKKyAgICAgIENyZWF0ZSBhIDpjbGFzczpgfnBzdGF0cy5TdGF0c2Agb2JqZWN0IGJhc2VkIG9uIHRoZSBjdXJyZW50CisgICAgICBwcm9maWxlIGFuZCBwcmludCB0aGUgcmVzdWx0cyB0byBzdGRvdXQuCisKKyAgIC4uIG1ldGhvZDo6IGR1bXBfc3RhdHMoZmlsZW5hbWUpCisKKyAgICAgIFdyaXRlIHRoZSByZXN1bHRzIG9mIHRoZSBjdXJyZW50IHByb2ZpbGUgdG8gKmZpbGVuYW1lKi4KKworICAgLi4gbWV0aG9kOjogcnVuKGNtZCkKKworICAgICAgUHJvZmlsZSB0aGUgY21kIHZpYSA6ZnVuYzpgZXhlY2AuCisKKyAgIC4uIG1ldGhvZDo6IHJ1bmN0eChjbWQsIGdsb2JhbHMsIGxvY2FscykKKworICAgICAgUHJvZmlsZSB0aGUgY21kIHZpYSA6ZnVuYzpgZXhlY2Agd2l0aCB0aGUgc3BlY2lmaWVkIGdsb2JhbCBhbmQKKyAgICAgIGxvY2FsIGVudmlyb25tZW50LgorCisgICAuLiBtZXRob2Q6OiBydW5jYWxsKGZ1bmMsICphcmdzLCAqKmt3YXJncykKKworICAgICAgUHJvZmlsZSBgYGZ1bmMoKmFyZ3MsICoqa3dhcmdzKWBgCisKKy4uIF9wcm9maWxlLXN0YXRzOgorCitUaGUgOmNsYXNzOmBTdGF0c2AgQ2xhc3MKKz09PT09PT09PT09PT09PT09PT09PT09PQorCitBbmFseXNpcyBvZiB0aGUgcHJvZmlsZXIgZGF0YSBpcyBkb25lIHVzaW5nIHRoZSA6Y2xhc3M6YH5wc3RhdHMuU3RhdHNgIGNsYXNzLgorCisuLiBtb2R1bGU6OiBwc3RhdHMKKyAgIDpzeW5vcHNpczogU3RhdGlzdGljcyBvYmplY3QgZm9yIHVzZSB3aXRoIHRoZSBwcm9maWxlci4KKworLi4gY2xhc3M6OiBTdGF0cygqZmlsZW5hbWVzIG9yIHByb2ZpbGUsIHN0cmVhbT1zeXMuc3Rkb3V0KQorCisgICBUaGlzIGNsYXNzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYSAic3RhdGlzdGljcyBvYmplY3QiIGZyb20gYQorICAgKmZpbGVuYW1lKiAob3IgbGlzdCBvZiBmaWxlbmFtZXMpIG9yIGZyb20gYSA6Y2xhc3M6YFByb2ZpbGVgIGluc3RhbmNlLiBPdXRwdXQKKyAgIHdpbGwgYmUgcHJpbnRlZCB0byB0aGUgc3RyZWFtIHNwZWNpZmllZCBieSAqc3RyZWFtKi4KKworICAgVGhlIGZpbGUgc2VsZWN0ZWQgYnkgdGhlIGFib3ZlIGNvbnN0cnVjdG9yIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkgdGhlCisgICBjb3JyZXNwb25kaW5nIHZlcnNpb24gb2YgOm1vZDpgcHJvZmlsZWAgb3IgOm1vZDpgY1Byb2ZpbGVgLiAgVG8gYmUgc3BlY2lmaWMsCisgICB0aGVyZSBpcyAqbm8qIGZpbGUgY29tcGF0aWJpbGl0eSBndWFyYW50ZWVkIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIHRoaXMKKyAgIHByb2ZpbGVyLCBhbmQgdGhlcmUgaXMgbm8gY29tcGF0aWJpbGl0eSB3aXRoIGZpbGVzIHByb2R1Y2VkIGJ5IG90aGVyCisgICBwcm9maWxlcnMuICBJZiBzZXZlcmFsIGZpbGVzIGFyZSBwcm92aWRlZCwgYWxsIHRoZSBzdGF0aXN0aWNzIGZvciBpZGVudGljYWwKKyAgIGZ1bmN0aW9ucyB3aWxsIGJlIGNvYWxlc2NlZCwgc28gdGhhdCBhbiBvdmVyYWxsIHZpZXcgb2Ygc2V2ZXJhbCBwcm9jZXNzZXMgY2FuCisgICBiZSBjb25zaWRlcmVkIGluIGEgc2luZ2xlIHJlcG9ydC4gIElmIGFkZGl0aW9uYWwgZmlsZXMgbmVlZCB0byBiZSBjb21iaW5lZAorICAgd2l0aCBkYXRhIGluIGFuIGV4aXN0aW5nIDpjbGFzczpgfnBzdGF0cy5TdGF0c2Agb2JqZWN0LCB0aGUKKyAgIDptZXRoOmB+cHN0YXRzLlN0YXRzLmFkZGAgbWV0aG9kIGNhbiBiZSB1c2VkLgorCisgICBJbnN0ZWFkIG9mIHJlYWRpbmcgdGhlIHByb2ZpbGUgZGF0YSBmcm9tIGEgZmlsZSwgYSA6Y2xhc3M6YGNQcm9maWxlLlByb2ZpbGVgCisgICBvciA6Y2xhc3M6YHByb2ZpbGUuUHJvZmlsZWAgb2JqZWN0IGNhbiBiZSB1c2VkIGFzIHRoZSBwcm9maWxlIGRhdGEgc291cmNlLgorCisgICA6Y2xhc3M6YFN0YXRzYCBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorCisgICAuLiBtZXRob2Q6OiBzdHJpcF9kaXJzKCkKKworICAgICAgVGhpcyBtZXRob2QgZm9yIHRoZSA6Y2xhc3M6YFN0YXRzYCBjbGFzcyByZW1vdmVzIGFsbCBsZWFkaW5nIHBhdGgKKyAgICAgIGluZm9ybWF0aW9uIGZyb20gZmlsZSBuYW1lcy4gIEl0IGlzIHZlcnkgdXNlZnVsIGluIHJlZHVjaW5nIHRoZSBzaXplIG9mCisgICAgICB0aGUgcHJpbnRvdXQgdG8gZml0IHdpdGhpbiAoY2xvc2UgdG8pIDgwIGNvbHVtbnMuICBUaGlzIG1ldGhvZCBtb2RpZmllcworICAgICAgdGhlIG9iamVjdCwgYW5kIHRoZSBzdHJpcHBlZCBpbmZvcm1hdGlvbiBpcyBsb3N0LiAgQWZ0ZXIgcGVyZm9ybWluZyBhCisgICAgICBzdHJpcCBvcGVyYXRpb24sIHRoZSBvYmplY3QgaXMgY29uc2lkZXJlZCB0byBoYXZlIGl0cyBlbnRyaWVzIGluIGEKKyAgICAgICJyYW5kb20iIG9yZGVyLCBhcyBpdCB3YXMganVzdCBhZnRlciBvYmplY3QgaW5pdGlhbGl6YXRpb24gYW5kIGxvYWRpbmcuCisgICAgICBJZiA6bWV0aDpgfnBzdGF0cy5TdGF0cy5zdHJpcF9kaXJzYCBjYXVzZXMgdHdvIGZ1bmN0aW9uIG5hbWVzIHRvIGJlCisgICAgICBpbmRpc3Rpbmd1aXNoYWJsZSAodGhleSBhcmUgb24gdGhlIHNhbWUgbGluZSBvZiB0aGUgc2FtZSBmaWxlbmFtZSwgYW5kCisgICAgICBoYXZlIHRoZSBzYW1lIGZ1bmN0aW9uIG5hbWUpLCB0aGVuIHRoZSBzdGF0aXN0aWNzIGZvciB0aGVzZSB0d28gZW50cmllcworICAgICAgYXJlIGFjY3VtdWxhdGVkIGludG8gYSBzaW5nbGUgZW50cnkuCisKKworICAgLi4gbWV0aG9kOjogYWRkKCpmaWxlbmFtZXMpCisKKyAgICAgIFRoaXMgbWV0aG9kIG9mIHRoZSA6Y2xhc3M6YFN0YXRzYCBjbGFzcyBhY2N1bXVsYXRlcyBhZGRpdGlvbmFsIHByb2ZpbGluZworICAgICAgaW5mb3JtYXRpb24gaW50byB0aGUgY3VycmVudCBwcm9maWxpbmcgb2JqZWN0LiAgSXRzIGFyZ3VtZW50cyBzaG91bGQgcmVmZXIKKyAgICAgIHRvIGZpbGVuYW1lcyBjcmVhdGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb24gb2YgOmZ1bmM6YHByb2ZpbGUucnVuYAorICAgICAgb3IgOmZ1bmM6YGNQcm9maWxlLnJ1bmAuIFN0YXRpc3RpY3MgZm9yIGlkZW50aWNhbGx5IG5hbWVkIChyZTogZmlsZSwgbGluZSwKKyAgICAgIG5hbWUpIGZ1bmN0aW9ucyBhcmUgYXV0b21hdGljYWxseSBhY2N1bXVsYXRlZCBpbnRvIHNpbmdsZSBmdW5jdGlvbgorICAgICAgc3RhdGlzdGljcy4KKworCisgICAuLiBtZXRob2Q6OiBkdW1wX3N0YXRzKGZpbGVuYW1lKQorCisgICAgICBTYXZlIHRoZSBkYXRhIGxvYWRlZCBpbnRvIHRoZSA6Y2xhc3M6YFN0YXRzYCBvYmplY3QgdG8gYSBmaWxlIG5hbWVkCisgICAgICAqZmlsZW5hbWUqLiAgVGhlIGZpbGUgaXMgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBleGlzdCwgYW5kIGlzIG92ZXJ3cml0dGVuCisgICAgICBpZiBpdCBhbHJlYWR5IGV4aXN0cy4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgbWV0aG9kIG9mIHRoZSBzYW1lIG5hbWUKKyAgICAgIG9uIHRoZSA6Y2xhc3M6YHByb2ZpbGUuUHJvZmlsZWAgYW5kIDpjbGFzczpgY1Byb2ZpbGUuUHJvZmlsZWAgY2xhc3Nlcy4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMi4zCisKKworICAgLi4gbWV0aG9kOjogc29ydF9zdGF0cygqa2V5cykKKworICAgICAgVGhpcyBtZXRob2QgbW9kaWZpZXMgdGhlIDpjbGFzczpgU3RhdHNgIG9iamVjdCBieSBzb3J0aW5nIGl0IGFjY29yZGluZyB0bworICAgICAgdGhlIHN1cHBsaWVkIGNyaXRlcmlhLiAgVGhlIGFyZ3VtZW50IGlzIHR5cGljYWxseSBhIHN0cmluZyBpZGVudGlmeWluZyB0aGUKKyAgICAgIGJhc2lzIG9mIGEgc29ydCAoZXhhbXBsZTogYGAndGltZSdgYCBvciBgYCduYW1lJ2BgKS4KKworICAgICAgV2hlbiBtb3JlIHRoYW4gb25lIGtleSBpcyBwcm92aWRlZCwgdGhlbiBhZGRpdGlvbmFsIGtleXMgYXJlIHVzZWQgYXMKKyAgICAgIHNlY29uZGFyeSBjcml0ZXJpYSB3aGVuIHRoZXJlIGlzIGVxdWFsaXR5IGluIGFsbCBrZXlzIHNlbGVjdGVkIGJlZm9yZQorICAgICAgdGhlbS4gIEZvciBleGFtcGxlLCBgYHNvcnRfc3RhdHMoJ25hbWUnLCAnZmlsZScpYGAgd2lsbCBzb3J0IGFsbCB0aGUKKyAgICAgIGVudHJpZXMgYWNjb3JkaW5nIHRvIHRoZWlyIGZ1bmN0aW9uIG5hbWUsIGFuZCByZXNvbHZlIGFsbCB0aWVzIChpZGVudGljYWwKKyAgICAgIGZ1bmN0aW9uIG5hbWVzKSBieSBzb3J0aW5nIGJ5IGZpbGUgbmFtZS4KKworICAgICAgQWJicmV2aWF0aW9ucyBjYW4gYmUgdXNlZCBmb3IgYW55IGtleSBuYW1lcywgYXMgbG9uZyBhcyB0aGUgYWJicmV2aWF0aW9uCisgICAgICBpcyB1bmFtYmlndW91cy4gIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBrZXlzIGN1cnJlbnRseSBkZWZpbmVkOgorCisgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICB8IFZhbGlkIEFyZyAgICAgICAgfCBNZWFuaW5nICAgICAgICAgICAgICB8CisgICAgICArPT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT0rCisgICAgICB8IGBgJ2NhbGxzJ2BgICAgICAgfCBjYWxsIGNvdW50ICAgICAgICAgICB8CisgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICB8IGBgJ2N1bXVsYXRpdmUnYGAgfCBjdW11bGF0aXZlIHRpbWUgICAgICB8CisgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICB8IGBgJ2N1bXRpbWUnYGAgICAgfCBjdW11bGF0aXZlIHRpbWUgICAgICB8CisgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICB8IGBgJ2ZpbGUnYGAgICAgICAgfCBmaWxlIG5hbWUgICAgICAgICAgICB8CisgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICB8IGBgJ2ZpbGVuYW1lJ2BgICAgfCBmaWxlIG5hbWUgICAgICAgICAgICB8CisgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICB8IGBgJ21vZHVsZSdgYCAgICAgfCBmaWxlIG5hbWUgICAgICAgICAgICB8CisgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICB8IGBgJ25jYWxscydgYCAgICAgfCBjYWxsIGNvdW50ICAgICAgICAgICB8CisgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICB8IGBgJ3BjYWxscydgYCAgICAgfCBwcmltaXRpdmUgY2FsbCBjb3VudCB8CisgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICB8IGBgJ2xpbmUnYGAgICAgICAgfCBsaW5lIG51bWJlciAgICAgICAgICB8CisgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICB8IGBgJ25hbWUnYGAgICAgICAgfCBmdW5jdGlvbiBuYW1lICAgICAgICB8CisgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICB8IGBgJ25mbCdgYCAgICAgICAgfCBuYW1lL2ZpbGUvbGluZSAgICAgICB8CisgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICB8IGBgJ3N0ZG5hbWUnYGAgICAgfCBzdGFuZGFyZCBuYW1lICAgICAgICB8CisgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICB8IGBgJ3RpbWUnYGAgICAgICAgfCBpbnRlcm5hbCB0aW1lICAgICAgICB8CisgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICB8IGBgJ3RvdHRpbWUnYGAgICAgfCBpbnRlcm5hbCB0aW1lICAgICAgICB8CisgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisKKyAgICAgIE5vdGUgdGhhdCBhbGwgc29ydHMgb24gc3RhdGlzdGljcyBhcmUgaW4gZGVzY2VuZGluZyBvcmRlciAocGxhY2luZyBtb3N0CisgICAgICB0aW1lIGNvbnN1bWluZyBpdGVtcyBmaXJzdCksIHdoZXJlIGFzIG5hbWUsIGZpbGUsIGFuZCBsaW5lIG51bWJlciBzZWFyY2hlcworICAgICAgYXJlIGluIGFzY2VuZGluZyBvcmRlciAoYWxwaGFiZXRpY2FsKS4gVGhlIHN1YnRsZSBkaXN0aW5jdGlvbiBiZXR3ZWVuCisgICAgICBgYCduZmwnYGAgYW5kIGBgJ3N0ZG5hbWUnYGAgaXMgdGhhdCB0aGUgc3RhbmRhcmQgbmFtZSBpcyBhIHNvcnQgb2YgdGhlCisgICAgICBuYW1lIGFzIHByaW50ZWQsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGVtYmVkZGVkIGxpbmUgbnVtYmVycyBnZXQgY29tcGFyZWQKKyAgICAgIGluIGFuIG9kZCB3YXkuICBGb3IgZXhhbXBsZSwgbGluZXMgMywgMjAsIGFuZCA0MCB3b3VsZCAoaWYgdGhlIGZpbGUgbmFtZXMKKyAgICAgIHdlcmUgdGhlIHNhbWUpIGFwcGVhciBpbiB0aGUgc3RyaW5nIG9yZGVyIDIwLCAzIGFuZCA0MC4gIEluIGNvbnRyYXN0LAorICAgICAgYGAnbmZsJ2BgIGRvZXMgYSBudW1lcmljIGNvbXBhcmUgb2YgdGhlIGxpbmUgbnVtYmVycy4gIEluIGZhY3QsCisgICAgICBgYHNvcnRfc3RhdHMoJ25mbCcpYGAgaXMgdGhlIHNhbWUgYXMgYGBzb3J0X3N0YXRzKCduYW1lJywgJ2ZpbGUnLAorICAgICAgJ2xpbmUnKWBgLgorCisgICAgICBGb3IgYmFja3dhcmQtY29tcGF0aWJpbGl0eSByZWFzb25zLCB0aGUgbnVtZXJpYyBhcmd1bWVudHMgYGAtMWBgLCBgYDBgYCwKKyAgICAgIGBgMWBgLCBhbmQgYGAyYGAgYXJlIHBlcm1pdHRlZC4gIFRoZXkgYXJlIGludGVycHJldGVkIGFzIGBgJ3N0ZG5hbWUnYGAsCisgICAgICBgYCdjYWxscydgYCwgYGAndGltZSdgYCwgYW5kIGBgJ2N1bXVsYXRpdmUnYGAgcmVzcGVjdGl2ZWx5LiAgSWYgdGhpcyBvbGQKKyAgICAgIHN0eWxlIGZvcm1hdCAobnVtZXJpYykgaXMgdXNlZCwgb25seSBvbmUgc29ydCBrZXkgKHRoZSBudW1lcmljIGtleSkgd2lsbAorICAgICAgYmUgdXNlZCwgYW5kIGFkZGl0aW9uYWwgYXJndW1lbnRzIHdpbGwgYmUgc2lsZW50bHkgaWdub3JlZC4KKworICAgICAgLi4gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgb2xkIHByb2ZpbGVyLgorCisKKyAgIC4uIG1ldGhvZDo6IHJldmVyc2Vfb3JkZXIoKQorCisgICAgICBUaGlzIG1ldGhvZCBmb3IgdGhlIDpjbGFzczpgU3RhdHNgIGNsYXNzIHJldmVyc2VzIHRoZSBvcmRlcmluZyBvZiB0aGUKKyAgICAgIGJhc2ljIGxpc3Qgd2l0aGluIHRoZSBvYmplY3QuICBOb3RlIHRoYXQgYnkgZGVmYXVsdCBhc2NlbmRpbmcgdnMKKyAgICAgIGRlc2NlbmRpbmcgb3JkZXIgaXMgcHJvcGVybHkgc2VsZWN0ZWQgYmFzZWQgb24gdGhlIHNvcnQga2V5IG9mIGNob2ljZS4KKworICAgICAgLi4gVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgcHJpbWFyaWx5IGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZAorICAgICAgICAgcHJvZmlsZXIuCisKKworICAgLi4gbWV0aG9kOjogcHJpbnRfc3RhdHMoKnJlc3RyaWN0aW9ucykKKworICAgICAgVGhpcyBtZXRob2QgZm9yIHRoZSA6Y2xhc3M6YFN0YXRzYCBjbGFzcyBwcmludHMgb3V0IGEgcmVwb3J0IGFzIGRlc2NyaWJlZAorICAgICAgaW4gdGhlIDpmdW5jOmBwcm9maWxlLnJ1bmAgZGVmaW5pdGlvbi4KKworICAgICAgVGhlIG9yZGVyIG9mIHRoZSBwcmludGluZyBpcyBiYXNlZCBvbiB0aGUgbGFzdAorICAgICAgOm1ldGg6YH5wc3RhdHMuU3RhdHMuc29ydF9zdGF0c2Agb3BlcmF0aW9uIGRvbmUgb24gdGhlIG9iamVjdCAoc3ViamVjdCB0bworICAgICAgY2F2ZWF0cyBpbiA6bWV0aDpgfnBzdGF0cy5TdGF0cy5hZGRgIGFuZAorICAgICAgOm1ldGg6YH5wc3RhdHMuU3RhdHMuc3RyaXBfZGlyc2ApLgorCisgICAgICBUaGUgYXJndW1lbnRzIHByb3ZpZGVkIChpZiBhbnkpIGNhbiBiZSB1c2VkIHRvIGxpbWl0IHRoZSBsaXN0IGRvd24gdG8gdGhlCisgICAgICBzaWduaWZpY2FudCBlbnRyaWVzLiAgSW5pdGlhbGx5LCB0aGUgbGlzdCBpcyB0YWtlbiB0byBiZSB0aGUgY29tcGxldGUgc2V0CisgICAgICBvZiBwcm9maWxlZCBmdW5jdGlvbnMuICBFYWNoIHJlc3RyaWN0aW9uIGlzIGVpdGhlciBhbiBpbnRlZ2VyICh0byBzZWxlY3QgYQorICAgICAgY291bnQgb2YgbGluZXMpLCBvciBhIGRlY2ltYWwgZnJhY3Rpb24gYmV0d2VlbiAwLjAgYW5kIDEuMCBpbmNsdXNpdmUgKHRvCisgICAgICBzZWxlY3QgYSBwZXJjZW50YWdlIG9mIGxpbmVzKSwgb3IgYSByZWd1bGFyIGV4cHJlc3Npb24gKHRvIHBhdHRlcm4gbWF0Y2gKKyAgICAgIHRoZSBzdGFuZGFyZCBuYW1lIHRoYXQgaXMgcHJpbnRlZC4gIElmIHNldmVyYWwgcmVzdHJpY3Rpb25zIGFyZSBwcm92aWRlZCwKKyAgICAgIHRoZW4gdGhleSBhcmUgYXBwbGllZCBzZXF1ZW50aWFsbHkuICBGb3IgZXhhbXBsZTo6CisKKyAgICAgICAgIHByaW50X3N0YXRzKC4xLCAnZm9vOicpCisKKyAgICAgIHdvdWxkIGZpcnN0IGxpbWl0IHRoZSBwcmludGluZyB0byBmaXJzdCAxMCUgb2YgbGlzdCwgYW5kIHRoZW4gb25seSBwcmludAorICAgICAgZnVuY3Rpb25zIHRoYXQgd2VyZSBwYXJ0IG9mIGZpbGVuYW1lIDpmaWxlOmAuXCpmb286YC4gIEluIGNvbnRyYXN0LCB0aGUKKyAgICAgIGNvbW1hbmQ6OgorCisgICAgICAgICBwcmludF9zdGF0cygnZm9vOicsIC4xKQorCisgICAgICB3b3VsZCBsaW1pdCB0aGUgbGlzdCB0byBhbGwgZnVuY3Rpb25zIGhhdmluZyBmaWxlIG5hbWVzIDpmaWxlOmAuXCpmb286YCwKKyAgICAgIGFuZCB0aGVuIHByb2NlZWQgdG8gb25seSBwcmludCB0aGUgZmlyc3QgMTAlIG9mIHRoZW0uCisKKworICAgLi4gbWV0aG9kOjogcHJpbnRfY2FsbGVycygqcmVzdHJpY3Rpb25zKQorCisgICAgICBUaGlzIG1ldGhvZCBmb3IgdGhlIDpjbGFzczpgU3RhdHNgIGNsYXNzIHByaW50cyBhIGxpc3Qgb2YgYWxsIGZ1bmN0aW9ucworICAgICAgdGhhdCBjYWxsZWQgZWFjaCBmdW5jdGlvbiBpbiB0aGUgcHJvZmlsZWQgZGF0YWJhc2UuICBUaGUgb3JkZXJpbmcgaXMKKyAgICAgIGlkZW50aWNhbCB0byB0aGF0IHByb3ZpZGVkIGJ5IDptZXRoOmB+cHN0YXRzLlN0YXRzLnByaW50X3N0YXRzYCwgYW5kIHRoZQorICAgICAgZGVmaW5pdGlvbiBvZiB0aGUgcmVzdHJpY3RpbmcgYXJndW1lbnQgaXMgYWxzbyBpZGVudGljYWwuICBFYWNoIGNhbGxlciBpcworICAgICAgcmVwb3J0ZWQgb24gaXRzIG93biBsaW5lLiAgVGhlIGZvcm1hdCBkaWZmZXJzIHNsaWdodGx5IGRlcGVuZGluZyBvbiB0aGUKKyAgICAgIHByb2ZpbGVyIHRoYXQgcHJvZHVjZWQgdGhlIHN0YXRzOgorCisgICAgICAqIFdpdGggOm1vZDpgcHJvZmlsZWAsIGEgbnVtYmVyIGlzIHNob3duIGluIHBhcmVudGhlc2VzIGFmdGVyIGVhY2ggY2FsbGVyCisgICAgICAgIHRvIHNob3cgaG93IG1hbnkgdGltZXMgdGhpcyBzcGVjaWZpYyBjYWxsIHdhcyBtYWRlLiAgRm9yIGNvbnZlbmllbmNlLCBhCisgICAgICAgIHNlY29uZCBub24tcGFyZW50aGVzaXplZCBudW1iZXIgcmVwZWF0cyB0aGUgY3VtdWxhdGl2ZSB0aW1lIHNwZW50IGluIHRoZQorICAgICAgICBmdW5jdGlvbiBhdCB0aGUgcmlnaHQuCisKKyAgICAgICogV2l0aCA6bW9kOmBjUHJvZmlsZWAsIGVhY2ggY2FsbGVyIGlzIHByZWNlZGVkIGJ5IHRocmVlIG51bWJlcnM6IHRoZQorICAgICAgICBudW1iZXIgb2YgdGltZXMgdGhpcyBzcGVjaWZpYyBjYWxsIHdhcyBtYWRlLCBhbmQgdGhlIHRvdGFsIGFuZAorICAgICAgICBjdW11bGF0aXZlIHRpbWVzIHNwZW50IGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uIHdoaWxlIGl0IHdhcyBpbnZva2VkIGJ5CisgICAgICAgIHRoaXMgc3BlY2lmaWMgY2FsbGVyLgorCisKKyAgIC4uIG1ldGhvZDo6IHByaW50X2NhbGxlZXMoKnJlc3RyaWN0aW9ucykKKworICAgICAgVGhpcyBtZXRob2QgZm9yIHRoZSA6Y2xhc3M6YFN0YXRzYCBjbGFzcyBwcmludHMgYSBsaXN0IG9mIGFsbCBmdW5jdGlvbgorICAgICAgdGhhdCB3ZXJlIGNhbGxlZCBieSB0aGUgaW5kaWNhdGVkIGZ1bmN0aW9uLiAgQXNpZGUgZnJvbSB0aGlzIHJldmVyc2FsIG9mCisgICAgICBkaXJlY3Rpb24gb2YgY2FsbHMgKHJlOiBjYWxsZWQgdnMgd2FzIGNhbGxlZCBieSksIHRoZSBhcmd1bWVudHMgYW5kCisgICAgICBvcmRlcmluZyBhcmUgaWRlbnRpY2FsIHRvIHRoZSA6bWV0aDpgfnBzdGF0cy5TdGF0cy5wcmludF9jYWxsZXJzYCBtZXRob2QuCisKIAogLi4gX2RldGVybWluaXN0aWMtcHJvZmlsaW5nOgogCkBAIC0yMTQsMjc1ICs1NDYsNyBAQAogaW1wbGVtZW50YXRpb25zLgogCiAKLVJlZmVyZW5jZSBNYW51YWwgLS0gOm1vZDpgcHJvZmlsZWAgYW5kIDptb2Q6YGNQcm9maWxlYAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS4uIG1vZHVsZTo6IGNQcm9maWxlCi0gICA6c3lub3BzaXM6IFB5dGhvbiBwcm9maWxlcgotCi0KLVRoZSBwcmltYXJ5IGVudHJ5IHBvaW50IGZvciB0aGUgcHJvZmlsZXIgaXMgdGhlIGdsb2JhbCBmdW5jdGlvbgotOmZ1bmM6YHByb2ZpbGUucnVuYCAocmVzcC4gOmZ1bmM6YGNQcm9maWxlLnJ1bmApLiBJdCBpcyB0eXBpY2FsbHkgdXNlZCB0byBjcmVhdGUKLWFueSBwcm9maWxlIGluZm9ybWF0aW9uLiAgVGhlIHJlcG9ydHMgYXJlIGZvcm1hdHRlZCBhbmQgcHJpbnRlZCB1c2luZyBtZXRob2RzIG9mCi10aGUgY2xhc3MgOmNsYXNzOmBwc3RhdHMuU3RhdHNgLiAgVGhlIGZvbGxvd2luZyBpcyBhIGRlc2NyaXB0aW9uIG9mIGFsbCBvZiB0aGVzZQotc3RhbmRhcmQgZW50cnkgcG9pbnRzIGFuZCBmdW5jdGlvbnMuICBGb3IgYSBtb3JlIGluLWRlcHRoIHZpZXcgb2Ygc29tZSBvZiB0aGUKLWNvZGUsIGNvbnNpZGVyIHJlYWRpbmcgdGhlIGxhdGVyIHNlY3Rpb24gb24gUHJvZmlsZXIgRXh0ZW5zaW9ucywgd2hpY2ggaW5jbHVkZXMKLWRpc2N1c3Npb24gb2YgaG93IHRvIGRlcml2ZSAiYmV0dGVyIiBwcm9maWxlcnMgZnJvbSB0aGUgY2xhc3NlcyBwcmVzZW50ZWQsIG9yCi1yZWFkaW5nIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlc2UgbW9kdWxlcy4KLQotCi0uLiBmdW5jdGlvbjo6IHJ1bihjb21tYW5kWywgZmlsZW5hbWVdKQotCi0gICBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aGUKLSAgIDprZXl3b3JkOmBleGVjYCBzdGF0ZW1lbnQsIGFuZCBhbiBvcHRpb25hbCBmaWxlIG5hbWUuICBJbiBhbGwgY2FzZXMgdGhpcwotICAgcm91dGluZSBhdHRlbXB0cyB0byA6a2V5d29yZDpgZXhlY2AgaXRzIGZpcnN0IGFyZ3VtZW50LCBhbmQgZ2F0aGVyIHByb2ZpbGluZwotICAgc3RhdGlzdGljcyBmcm9tIHRoZSBleGVjdXRpb24uIElmIG5vIGZpbGUgbmFtZSBpcyBwcmVzZW50LCB0aGVuIHRoaXMgZnVuY3Rpb24KLSAgIGF1dG9tYXRpY2FsbHkgcHJpbnRzIGEgc2ltcGxlIHByb2ZpbGluZyByZXBvcnQsIHNvcnRlZCBieSB0aGUgc3RhbmRhcmQgbmFtZQotICAgc3RyaW5nIChmaWxlL2xpbmUvZnVuY3Rpb24tbmFtZSkgdGhhdCBpcyBwcmVzZW50ZWQgaW4gZWFjaCBsaW5lLiAgVGhlCi0gICBmb2xsb3dpbmcgaXMgYSB0eXBpY2FsIG91dHB1dCBmcm9tIHN1Y2ggYSBjYWxsOjoKLQotICAgICAgICAgICAgMjcwNiBmdW5jdGlvbiBjYWxscyAoMjAwNCBwcmltaXRpdmUgY2FsbHMpIGluIDQuNTA0IENQVSBzZWNvbmRzCi0KLSAgICAgIE9yZGVyZWQgYnk6IHN0YW5kYXJkIG5hbWUKLQotICAgICAgbmNhbGxzICB0b3R0aW1lICBwZXJjYWxsICBjdW10aW1lICBwZXJjYWxsIGZpbGVuYW1lOmxpbmVubyhmdW5jdGlvbikKLSAgICAgICAgICAgMiAgICAwLjAwNiAgICAwLjAwMyAgICAwLjk1MyAgICAwLjQ3NyBwb2JqZWN0LnB5Ojc1KHNhdmVfb2JqZWN0cykKLSAgICAgICAgNDMvMyAgICAwLjUzMyAgICAwLjAxMiAgICAwLjc0OSAgICAwLjI1MCBwb2JqZWN0LnB5Ojk5KGV2YWx1YXRlKQotICAgICAgIC4uLgotCi0gICBUaGUgZmlyc3QgbGluZSBpbmRpY2F0ZXMgdGhhdCAyNzA2IGNhbGxzIHdlcmUgbW9uaXRvcmVkLiAgT2YgdGhvc2UgY2FsbHMsIDIwMDQKLSAgIHdlcmUgOmRmbjpgcHJpbWl0aXZlYC4gIFdlIGRlZmluZSA6ZGZuOmBwcmltaXRpdmVgIHRvIG1lYW4gdGhhdCB0aGUgY2FsbCB3YXMgbm90Ci0gICBpbmR1Y2VkIHZpYSByZWN1cnNpb24uIFRoZSBuZXh0IGxpbmU6IGBgT3JkZXJlZCBieTogc3RhbmRhcmQgbmFtZWBgLCBpbmRpY2F0ZXMKLSAgIHRoYXQgdGhlIHRleHQgc3RyaW5nIGluIHRoZSBmYXIgcmlnaHQgY29sdW1uIHdhcyB1c2VkIHRvIHNvcnQgdGhlIG91dHB1dC4gVGhlCi0gICBjb2x1bW4gaGVhZGluZ3MgaW5jbHVkZToKLQotICAgbmNhbGxzCi0gICAgICBmb3IgdGhlIG51bWJlciBvZiBjYWxscywKLQotICAgdG90dGltZQotICAgICAgZm9yIHRoZSB0b3RhbCB0aW1lIHNwZW50IGluIHRoZSBnaXZlbiBmdW5jdGlvbiAoYW5kIGV4Y2x1ZGluZyB0aW1lIG1hZGUgaW4gY2FsbHMKLSAgICAgIHRvIHN1Yi1mdW5jdGlvbnMpLAotCi0gICBwZXJjYWxsCi0gICAgICBpcyB0aGUgcXVvdGllbnQgb2YgYGB0b3R0aW1lYGAgZGl2aWRlZCBieSBgYG5jYWxsc2BgCi0KLSAgIGN1bXRpbWUKLSAgICAgIGlzIHRoZSB0b3RhbCB0aW1lIHNwZW50IGluIHRoaXMgYW5kIGFsbCBzdWJmdW5jdGlvbnMgKGZyb20gaW52b2NhdGlvbiB0aWxsCi0gICAgICBleGl0KS4gVGhpcyBmaWd1cmUgaXMgYWNjdXJhdGUgKmV2ZW4qIGZvciByZWN1cnNpdmUgZnVuY3Rpb25zLgotCi0gICBwZXJjYWxsCi0gICAgICBpcyB0aGUgcXVvdGllbnQgb2YgYGBjdW10aW1lYGAgZGl2aWRlZCBieSBwcmltaXRpdmUgY2FsbHMKLQotICAgZmlsZW5hbWU6bGluZW5vKGZ1bmN0aW9uKQotICAgICAgcHJvdmlkZXMgdGhlIHJlc3BlY3RpdmUgZGF0YSBvZiBlYWNoIGZ1bmN0aW9uCi0KLSAgIFdoZW4gdGhlcmUgYXJlIHR3byBudW1iZXJzIGluIHRoZSBmaXJzdCBjb2x1bW4gKGZvciBleGFtcGxlLCBgYDQzLzNgYCksIHRoZW4gdGhlCi0gICBsYXR0ZXIgaXMgdGhlIG51bWJlciBvZiBwcmltaXRpdmUgY2FsbHMsIGFuZCB0aGUgZm9ybWVyIGlzIHRoZSBhY3R1YWwgbnVtYmVyIG9mCi0gICBjYWxscy4gIE5vdGUgdGhhdCB3aGVuIHRoZSBmdW5jdGlvbiBkb2VzIG5vdCByZWN1cnNlLCB0aGVzZSB0d28gdmFsdWVzIGFyZSB0aGUKLSAgIHNhbWUsIGFuZCBvbmx5IHRoZSBzaW5nbGUgZmlndXJlIGlzIHByaW50ZWQuCi0KLQotLi4gZnVuY3Rpb246OiBydW5jdHgoY29tbWFuZCwgZ2xvYmFscywgbG9jYWxzWywgZmlsZW5hbWVdKQotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gOmZ1bmM6YHJ1bmAsIHdpdGggYWRkZWQgYXJndW1lbnRzIHRvIHN1cHBseSB0aGUKLSAgIGdsb2JhbHMgYW5kIGxvY2FscyBkaWN0aW9uYXJpZXMgZm9yIHRoZSAqY29tbWFuZCogc3RyaW5nLgotCi1BbmFseXNpcyBvZiB0aGUgcHJvZmlsZXIgZGF0YSBpcyBkb25lIHVzaW5nIHRoZSA6Y2xhc3M6YFN0YXRzYCBjbGFzcy4KLQotLi4gbm90ZTo6Ci0KLSAgIFRoZSA6Y2xhc3M6YFN0YXRzYCBjbGFzcyBpcyBkZWZpbmVkIGluIHRoZSA6bW9kOmBwc3RhdHNgIG1vZHVsZS4KLQotCi0uLiBtb2R1bGU6OiBwc3RhdHMKLSAgIDpzeW5vcHNpczogU3RhdGlzdGljcyBvYmplY3QgZm9yIHVzZSB3aXRoIHRoZSBwcm9maWxlci4KLQotCi0uLiBjbGFzczo6IFN0YXRzKGZpbGVuYW1lWywgc3RyZWFtPXN5cy5zdGRvdXRbLCAuLi5dXSkKLQotICAgVGhpcyBjbGFzcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIGEgInN0YXRpc3RpY3Mgb2JqZWN0IiBmcm9tIGEKLSAgICpmaWxlbmFtZSogKG9yIHNldCBvZiBmaWxlbmFtZXMpLiAgOmNsYXNzOmBTdGF0c2Agb2JqZWN0cyBhcmUgbWFuaXB1bGF0ZWQgYnkKLSAgIG1ldGhvZHMsIGluIG9yZGVyIHRvIHByaW50IHVzZWZ1bCByZXBvcnRzLiAgWW91IG1heSBzcGVjaWZ5IGFuIGFsdGVybmF0ZSBvdXRwdXQKLSAgIHN0cmVhbSBieSBnaXZpbmcgdGhlIGtleXdvcmQgYXJndW1lbnQsIGBgc3RyZWFtYGAuCi0KLSAgIFRoZSBmaWxlIHNlbGVjdGVkIGJ5IHRoZSBhYm92ZSBjb25zdHJ1Y3RvciBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIGJ5IHRoZQotICAgY29ycmVzcG9uZGluZyB2ZXJzaW9uIG9mIDptb2Q6YHByb2ZpbGVgIG9yIDptb2Q6YGNQcm9maWxlYC4gIFRvIGJlIHNwZWNpZmljLAotICAgdGhlcmUgaXMgKm5vKiBmaWxlIGNvbXBhdGliaWxpdHkgZ3VhcmFudGVlZCB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGlzCi0gICBwcm9maWxlciwgYW5kIHRoZXJlIGlzIG5vIGNvbXBhdGliaWxpdHkgd2l0aCBmaWxlcyBwcm9kdWNlZCBieSBvdGhlciBwcm9maWxlcnMuCi0gICBJZiBzZXZlcmFsIGZpbGVzIGFyZSBwcm92aWRlZCwgYWxsIHRoZSBzdGF0aXN0aWNzIGZvciBpZGVudGljYWwgZnVuY3Rpb25zIHdpbGwKLSAgIGJlIGNvYWxlc2NlZCwgc28gdGhhdCBhbiBvdmVyYWxsIHZpZXcgb2Ygc2V2ZXJhbCBwcm9jZXNzZXMgY2FuIGJlIGNvbnNpZGVyZWQgaW4KLSAgIGEgc2luZ2xlIHJlcG9ydC4gIElmIGFkZGl0aW9uYWwgZmlsZXMgbmVlZCB0byBiZSBjb21iaW5lZCB3aXRoIGRhdGEgaW4gYW4KLSAgIGV4aXN0aW5nIDpjbGFzczpgU3RhdHNgIG9iamVjdCwgdGhlIDptZXRoOmBhZGRgIG1ldGhvZCBjYW4gYmUgdXNlZC4KLQotICAgLi4gKHN1Y2ggYXMgdGhlIG9sZCBzeXN0ZW0gcHJvZmlsZXIpLgotCi0gICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNQotICAgICAgVGhlICpzdHJlYW0qIHBhcmFtZXRlciB3YXMgYWRkZWQuCi0KLQotLi4gX3Byb2ZpbGUtc3RhdHM6Ci0KLVRoZSA6Y2xhc3M6YFN0YXRzYCBDbGFzcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLTpjbGFzczpgU3RhdHNgIG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLQotLi4gbWV0aG9kOjogU3RhdHMuc3RyaXBfZGlycygpCi0KLSAgIFRoaXMgbWV0aG9kIGZvciB0aGUgOmNsYXNzOmBTdGF0c2AgY2xhc3MgcmVtb3ZlcyBhbGwgbGVhZGluZyBwYXRoIGluZm9ybWF0aW9uCi0gICBmcm9tIGZpbGUgbmFtZXMuICBJdCBpcyB2ZXJ5IHVzZWZ1bCBpbiByZWR1Y2luZyB0aGUgc2l6ZSBvZiB0aGUgcHJpbnRvdXQgdG8gZml0Ci0gICB3aXRoaW4gKGNsb3NlIHRvKSA4MCBjb2x1bW5zLiAgVGhpcyBtZXRob2QgbW9kaWZpZXMgdGhlIG9iamVjdCwgYW5kIHRoZSBzdHJpcHBlZAotICAgaW5mb3JtYXRpb24gaXMgbG9zdC4gIEFmdGVyIHBlcmZvcm1pbmcgYSBzdHJpcCBvcGVyYXRpb24sIHRoZSBvYmplY3QgaXMKLSAgIGNvbnNpZGVyZWQgdG8gaGF2ZSBpdHMgZW50cmllcyBpbiBhICJyYW5kb20iIG9yZGVyLCBhcyBpdCB3YXMganVzdCBhZnRlciBvYmplY3QKLSAgIGluaXRpYWxpemF0aW9uIGFuZCBsb2FkaW5nLiAgSWYgOm1ldGg6YHN0cmlwX2RpcnNgIGNhdXNlcyB0d28gZnVuY3Rpb24gbmFtZXMgdG8KLSAgIGJlIGluZGlzdGluZ3Vpc2hhYmxlICh0aGV5IGFyZSBvbiB0aGUgc2FtZSBsaW5lIG9mIHRoZSBzYW1lIGZpbGVuYW1lLCBhbmQgaGF2ZQotICAgdGhlIHNhbWUgZnVuY3Rpb24gbmFtZSksIHRoZW4gdGhlIHN0YXRpc3RpY3MgZm9yIHRoZXNlIHR3byBlbnRyaWVzIGFyZQotICAgYWNjdW11bGF0ZWQgaW50byBhIHNpbmdsZSBlbnRyeS4KLQotCi0uLiBtZXRob2Q6OiBTdGF0cy5hZGQoZmlsZW5hbWVbLCAuLi5dKQotCi0gICBUaGlzIG1ldGhvZCBvZiB0aGUgOmNsYXNzOmBTdGF0c2AgY2xhc3MgYWNjdW11bGF0ZXMgYWRkaXRpb25hbCBwcm9maWxpbmcKLSAgIGluZm9ybWF0aW9uIGludG8gdGhlIGN1cnJlbnQgcHJvZmlsaW5nIG9iamVjdC4gIEl0cyBhcmd1bWVudHMgc2hvdWxkIHJlZmVyIHRvCi0gICBmaWxlbmFtZXMgY3JlYXRlZCBieSB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uIG9mIDpmdW5jOmBwcm9maWxlLnJ1bmAgb3IKLSAgIDpmdW5jOmBjUHJvZmlsZS5ydW5gLiBTdGF0aXN0aWNzIGZvciBpZGVudGljYWxseSBuYW1lZCAocmU6IGZpbGUsIGxpbmUsIG5hbWUpCi0gICBmdW5jdGlvbnMgYXJlIGF1dG9tYXRpY2FsbHkgYWNjdW11bGF0ZWQgaW50byBzaW5nbGUgZnVuY3Rpb24gc3RhdGlzdGljcy4KLQotCi0uLiBtZXRob2Q6OiBTdGF0cy5kdW1wX3N0YXRzKGZpbGVuYW1lKQotCi0gICBTYXZlIHRoZSBkYXRhIGxvYWRlZCBpbnRvIHRoZSA6Y2xhc3M6YFN0YXRzYCBvYmplY3QgdG8gYSBmaWxlIG5hbWVkICpmaWxlbmFtZSouCi0gICBUaGUgZmlsZSBpcyBjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGV4aXN0LCBhbmQgaXMgb3ZlcndyaXR0ZW4gaWYgaXQgYWxyZWFkeQotICAgZXhpc3RzLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBtZXRob2Qgb2YgdGhlIHNhbWUgbmFtZSBvbiB0aGUKLSAgIDpjbGFzczpgcHJvZmlsZS5Qcm9maWxlYCBhbmQgOmNsYXNzOmBjUHJvZmlsZS5Qcm9maWxlYCBjbGFzc2VzLgotCi0gICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjMKLQotCi0uLiBtZXRob2Q6OiBTdGF0cy5zb3J0X3N0YXRzKGtleVssIC4uLl0pCi0KLSAgIFRoaXMgbWV0aG9kIG1vZGlmaWVzIHRoZSA6Y2xhc3M6YFN0YXRzYCBvYmplY3QgYnkgc29ydGluZyBpdCBhY2NvcmRpbmcgdG8gdGhlCi0gICBzdXBwbGllZCBjcml0ZXJpYS4gIFRoZSBhcmd1bWVudCBpcyB0eXBpY2FsbHkgYSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlIGJhc2lzIG9mCi0gICBhIHNvcnQgKGV4YW1wbGU6IGBgJ3RpbWUnYGAgb3IgYGAnbmFtZSdgYCkuCi0KLSAgIFdoZW4gbW9yZSB0aGFuIG9uZSBrZXkgaXMgcHJvdmlkZWQsIHRoZW4gYWRkaXRpb25hbCBrZXlzIGFyZSB1c2VkIGFzIHNlY29uZGFyeQotICAgY3JpdGVyaWEgd2hlbiB0aGVyZSBpcyBlcXVhbGl0eSBpbiBhbGwga2V5cyBzZWxlY3RlZCBiZWZvcmUgdGhlbS4gIEZvciBleGFtcGxlLAotICAgYGBzb3J0X3N0YXRzKCduYW1lJywgJ2ZpbGUnKWBgIHdpbGwgc29ydCBhbGwgdGhlIGVudHJpZXMgYWNjb3JkaW5nIHRvIHRoZWlyCi0gICBmdW5jdGlvbiBuYW1lLCBhbmQgcmVzb2x2ZSBhbGwgdGllcyAoaWRlbnRpY2FsIGZ1bmN0aW9uIG5hbWVzKSBieSBzb3J0aW5nIGJ5Ci0gICBmaWxlIG5hbWUuCi0KLSAgIEFiYnJldmlhdGlvbnMgY2FuIGJlIHVzZWQgZm9yIGFueSBrZXkgbmFtZXMsIGFzIGxvbmcgYXMgdGhlIGFiYnJldmlhdGlvbiBpcwotICAgdW5hbWJpZ3VvdXMuICBUaGUgZm9sbG93aW5nIGFyZSB0aGUga2V5cyBjdXJyZW50bHkgZGVmaW5lZDoKLQotICAgKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCBWYWxpZCBBcmcgICAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgfAotICAgKz09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09KwotICAgfCBgYCdjYWxscydgYCAgICAgIHwgY2FsbCBjb3VudCAgICAgICAgICAgfAotICAgKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCBgYCdjdW11bGF0aXZlJ2BgIHwgY3VtdWxhdGl2ZSB0aW1lICAgICAgfAotICAgKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCBgYCdmaWxlJ2BgICAgICAgIHwgZmlsZSBuYW1lICAgICAgICAgICAgfAotICAgKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCBgYCdtb2R1bGUnYGAgICAgIHwgZmlsZSBuYW1lICAgICAgICAgICAgfAotICAgKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCBgYCdwY2FsbHMnYGAgICAgIHwgcHJpbWl0aXZlIGNhbGwgY291bnQgfAotICAgKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCBgYCdsaW5lJ2BgICAgICAgIHwgbGluZSBudW1iZXIgICAgICAgICAgfAotICAgKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCBgYCduYW1lJ2BgICAgICAgIHwgZnVuY3Rpb24gbmFtZSAgICAgICAgfAotICAgKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCBgYCduZmwnYGAgICAgICAgIHwgbmFtZS9maWxlL2xpbmUgICAgICAgfAotICAgKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCBgYCdzdGRuYW1lJ2BgICAgIHwgc3RhbmRhcmQgbmFtZSAgICAgICAgfAotICAgKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCBgYCd0aW1lJ2BgICAgICAgIHwgaW50ZXJuYWwgdGltZSAgICAgICAgfAotICAgKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCi0gICBOb3RlIHRoYXQgYWxsIHNvcnRzIG9uIHN0YXRpc3RpY3MgYXJlIGluIGRlc2NlbmRpbmcgb3JkZXIgKHBsYWNpbmcgbW9zdCB0aW1lCi0gICBjb25zdW1pbmcgaXRlbXMgZmlyc3QpLCB3aGVyZSBhcyBuYW1lLCBmaWxlLCBhbmQgbGluZSBudW1iZXIgc2VhcmNoZXMgYXJlIGluCi0gICBhc2NlbmRpbmcgb3JkZXIgKGFscGhhYmV0aWNhbCkuIFRoZSBzdWJ0bGUgZGlzdGluY3Rpb24gYmV0d2VlbiBgYCduZmwnYGAgYW5kCi0gICBgYCdzdGRuYW1lJ2BgIGlzIHRoYXQgdGhlIHN0YW5kYXJkIG5hbWUgaXMgYSBzb3J0IG9mIHRoZSBuYW1lIGFzIHByaW50ZWQsIHdoaWNoCi0gICBtZWFucyB0aGF0IHRoZSBlbWJlZGRlZCBsaW5lIG51bWJlcnMgZ2V0IGNvbXBhcmVkIGluIGFuIG9kZCB3YXkuICBGb3IgZXhhbXBsZSwKLSAgIGxpbmVzIDMsIDIwLCBhbmQgNDAgd291bGQgKGlmIHRoZSBmaWxlIG5hbWVzIHdlcmUgdGhlIHNhbWUpIGFwcGVhciBpbiB0aGUgc3RyaW5nCi0gICBvcmRlciAyMCwgMyBhbmQgNDAuICBJbiBjb250cmFzdCwgYGAnbmZsJ2BgIGRvZXMgYSBudW1lcmljIGNvbXBhcmUgb2YgdGhlIGxpbmUKLSAgIG51bWJlcnMuICBJbiBmYWN0LCBgYHNvcnRfc3RhdHMoJ25mbCcpYGAgaXMgdGhlIHNhbWUgYXMgYGBzb3J0X3N0YXRzKCduYW1lJywKLSAgICdmaWxlJywgJ2xpbmUnKWBgLgotCi0gICBGb3IgYmFja3dhcmQtY29tcGF0aWJpbGl0eSByZWFzb25zLCB0aGUgbnVtZXJpYyBhcmd1bWVudHMgYGAtMWBgLCBgYDBgYCwgYGAxYGAsCi0gICBhbmQgYGAyYGAgYXJlIHBlcm1pdHRlZC4gIFRoZXkgYXJlIGludGVycHJldGVkIGFzIGBgJ3N0ZG5hbWUnYGAsIGBgJ2NhbGxzJ2BgLAotICAgYGAndGltZSdgYCwgYW5kIGBgJ2N1bXVsYXRpdmUnYGAgcmVzcGVjdGl2ZWx5LiAgSWYgdGhpcyBvbGQgc3R5bGUgZm9ybWF0Ci0gICAobnVtZXJpYykgaXMgdXNlZCwgb25seSBvbmUgc29ydCBrZXkgKHRoZSBudW1lcmljIGtleSkgd2lsbCBiZSB1c2VkLCBhbmQKLSAgIGFkZGl0aW9uYWwgYXJndW1lbnRzIHdpbGwgYmUgc2lsZW50bHkgaWdub3JlZC4KLQotICAgLi4gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgb2xkIHByb2ZpbGVyLAotCi0KLS4uIG1ldGhvZDo6IFN0YXRzLnJldmVyc2Vfb3JkZXIoKQotCi0gICBUaGlzIG1ldGhvZCBmb3IgdGhlIDpjbGFzczpgU3RhdHNgIGNsYXNzIHJldmVyc2VzIHRoZSBvcmRlcmluZyBvZiB0aGUgYmFzaWMgbGlzdAotICAgd2l0aGluIHRoZSBvYmplY3QuICBOb3RlIHRoYXQgYnkgZGVmYXVsdCBhc2NlbmRpbmcgdnMgZGVzY2VuZGluZyBvcmRlciBpcwotICAgcHJvcGVybHkgc2VsZWN0ZWQgYmFzZWQgb24gdGhlIHNvcnQga2V5IG9mIGNob2ljZS4KLQotICAgLi4gVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgcHJpbWFyaWx5IGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZCBwcm9maWxlci4KLQotCi0uLiBtZXRob2Q6OiBTdGF0cy5wcmludF9zdGF0cyhbcmVzdHJpY3Rpb24sIC4uLl0pCi0KLSAgIFRoaXMgbWV0aG9kIGZvciB0aGUgOmNsYXNzOmBTdGF0c2AgY2xhc3MgcHJpbnRzIG91dCBhIHJlcG9ydCBhcyBkZXNjcmliZWQgaW4gdGhlCi0gICA6ZnVuYzpgcHJvZmlsZS5ydW5gIGRlZmluaXRpb24uCi0KLSAgIFRoZSBvcmRlciBvZiB0aGUgcHJpbnRpbmcgaXMgYmFzZWQgb24gdGhlIGxhc3QgOm1ldGg6YHNvcnRfc3RhdHNgIG9wZXJhdGlvbiBkb25lCi0gICBvbiB0aGUgb2JqZWN0IChzdWJqZWN0IHRvIGNhdmVhdHMgaW4gOm1ldGg6YGFkZGAgYW5kIDptZXRoOmBzdHJpcF9kaXJzYCkuCi0KLSAgIFRoZSBhcmd1bWVudHMgcHJvdmlkZWQgKGlmIGFueSkgY2FuIGJlIHVzZWQgdG8gbGltaXQgdGhlIGxpc3QgZG93biB0byB0aGUKLSAgIHNpZ25pZmljYW50IGVudHJpZXMuICBJbml0aWFsbHksIHRoZSBsaXN0IGlzIHRha2VuIHRvIGJlIHRoZSBjb21wbGV0ZSBzZXQgb2YKLSAgIHByb2ZpbGVkIGZ1bmN0aW9ucy4gIEVhY2ggcmVzdHJpY3Rpb24gaXMgZWl0aGVyIGFuIGludGVnZXIgKHRvIHNlbGVjdCBhIGNvdW50IG9mCi0gICBsaW5lcyksIG9yIGEgZGVjaW1hbCBmcmFjdGlvbiBiZXR3ZWVuIDAuMCBhbmQgMS4wIGluY2x1c2l2ZSAodG8gc2VsZWN0IGEKLSAgIHBlcmNlbnRhZ2Ugb2YgbGluZXMpLCBvciBhIHJlZ3VsYXIgZXhwcmVzc2lvbiAodG8gcGF0dGVybiBtYXRjaCB0aGUgc3RhbmRhcmQKLSAgIG5hbWUgdGhhdCBpcyBwcmludGVkOyBhcyBvZiBQeXRob24gMS41YjEsIHRoaXMgdXNlcyB0aGUgUGVybC1zdHlsZSByZWd1bGFyCi0gICBleHByZXNzaW9uIHN5bnRheCBkZWZpbmVkIGJ5IHRoZSA6bW9kOmByZWAgbW9kdWxlKS4gIElmIHNldmVyYWwgcmVzdHJpY3Rpb25zIGFyZQotICAgcHJvdmlkZWQsIHRoZW4gdGhleSBhcmUgYXBwbGllZCBzZXF1ZW50aWFsbHkuICBGb3IgZXhhbXBsZTo6Ci0KLSAgICAgIHByaW50X3N0YXRzKC4xLCAnZm9vOicpCi0KLSAgIHdvdWxkIGZpcnN0IGxpbWl0IHRoZSBwcmludGluZyB0byBmaXJzdCAxMCUgb2YgbGlzdCwgYW5kIHRoZW4gb25seSBwcmludAotICAgZnVuY3Rpb25zIHRoYXQgd2VyZSBwYXJ0IG9mIGZpbGVuYW1lIDpmaWxlOmAuXCpmb286YC4gIEluIGNvbnRyYXN0LCB0aGUKLSAgIGNvbW1hbmQ6OgotCi0gICAgICBwcmludF9zdGF0cygnZm9vOicsIC4xKQotCi0gICB3b3VsZCBsaW1pdCB0aGUgbGlzdCB0byBhbGwgZnVuY3Rpb25zIGhhdmluZyBmaWxlIG5hbWVzIDpmaWxlOmAuXCpmb286YCwgYW5kCi0gICB0aGVuIHByb2NlZWQgdG8gb25seSBwcmludCB0aGUgZmlyc3QgMTAlIG9mIHRoZW0uCi0KLQotLi4gbWV0aG9kOjogU3RhdHMucHJpbnRfY2FsbGVycyhbcmVzdHJpY3Rpb24sIC4uLl0pCi0KLSAgIFRoaXMgbWV0aG9kIGZvciB0aGUgOmNsYXNzOmBTdGF0c2AgY2xhc3MgcHJpbnRzIGEgbGlzdCBvZiBhbGwgZnVuY3Rpb25zIHRoYXQKLSAgIGNhbGxlZCBlYWNoIGZ1bmN0aW9uIGluIHRoZSBwcm9maWxlZCBkYXRhYmFzZS4gIFRoZSBvcmRlcmluZyBpcyBpZGVudGljYWwgdG8KLSAgIHRoYXQgcHJvdmlkZWQgYnkgOm1ldGg6YHByaW50X3N0YXRzYCwgYW5kIHRoZSBkZWZpbml0aW9uIG9mIHRoZSByZXN0cmljdGluZwotICAgYXJndW1lbnQgaXMgYWxzbyBpZGVudGljYWwuICBFYWNoIGNhbGxlciBpcyByZXBvcnRlZCBvbiBpdHMgb3duIGxpbmUuICBUaGUKLSAgIGZvcm1hdCBkaWZmZXJzIHNsaWdodGx5IGRlcGVuZGluZyBvbiB0aGUgcHJvZmlsZXIgdGhhdCBwcm9kdWNlZCB0aGUgc3RhdHM6Ci0KLSAgICogV2l0aCA6bW9kOmBwcm9maWxlYCwgYSBudW1iZXIgaXMgc2hvd24gaW4gcGFyZW50aGVzZXMgYWZ0ZXIgZWFjaCBjYWxsZXIgdG8KLSAgICAgc2hvdyBob3cgbWFueSB0aW1lcyB0aGlzIHNwZWNpZmljIGNhbGwgd2FzIG1hZGUuICBGb3IgY29udmVuaWVuY2UsIGEgc2Vjb25kCi0gICAgIG5vbi1wYXJlbnRoZXNpemVkIG51bWJlciByZXBlYXRzIHRoZSBjdW11bGF0aXZlIHRpbWUgc3BlbnQgaW4gdGhlIGZ1bmN0aW9uCi0gICAgIGF0IHRoZSByaWdodC4KLQotICAgKiBXaXRoIDptb2Q6YGNQcm9maWxlYCwgZWFjaCBjYWxsZXIgaXMgcHJlY2VkZWQgYnkgdGhyZWUgbnVtYmVyczogdGhlIG51bWJlciBvZgotICAgICB0aW1lcyB0aGlzIHNwZWNpZmljIGNhbGwgd2FzIG1hZGUsIGFuZCB0aGUgdG90YWwgYW5kIGN1bXVsYXRpdmUgdGltZXMgc3BlbnQgaW4KLSAgICAgdGhlIGN1cnJlbnQgZnVuY3Rpb24gd2hpbGUgaXQgd2FzIGludm9rZWQgYnkgdGhpcyBzcGVjaWZpYyBjYWxsZXIuCi0KLQotLi4gbWV0aG9kOjogU3RhdHMucHJpbnRfY2FsbGVlcyhbcmVzdHJpY3Rpb24sIC4uLl0pCi0KLSAgIFRoaXMgbWV0aG9kIGZvciB0aGUgOmNsYXNzOmBTdGF0c2AgY2xhc3MgcHJpbnRzIGEgbGlzdCBvZiBhbGwgZnVuY3Rpb24gdGhhdCB3ZXJlCi0gICBjYWxsZWQgYnkgdGhlIGluZGljYXRlZCBmdW5jdGlvbi4gIEFzaWRlIGZyb20gdGhpcyByZXZlcnNhbCBvZiBkaXJlY3Rpb24gb2YKLSAgIGNhbGxzIChyZTogY2FsbGVkIHZzIHdhcyBjYWxsZWQgYnkpLCB0aGUgYXJndW1lbnRzIGFuZCBvcmRlcmluZyBhcmUgaWRlbnRpY2FsIHRvCi0gICB0aGUgOm1ldGg6YHByaW50X2NhbGxlcnNgIG1ldGhvZC4KLQotCi0uLiBfcHJvZmlsZS1saW1pdHM6CisuLiBfcHJvZmlsZS1saW1pdGF0aW9uczoKIAogTGltaXRhdGlvbnMKID09PT09PT09PT09CkBAIC01MjUsNyArNTg5LDcgQEAKIGhhbmRsaW5nIHRpbWUgdG8gY29tcGVuc2F0ZSBmb3IgdGhlIG92ZXJoZWFkIG9mIGNhbGxpbmcgdGhlIHRpbWUgZnVuY3Rpb24sIGFuZAogc29ja2luZyBhd2F5IHRoZSByZXN1bHRzLiAgQnkgZGVmYXVsdCwgdGhlIGNvbnN0YW50IGlzIDAuIFRoZSBmb2xsb3dpbmcKIHByb2NlZHVyZSBjYW4gYmUgdXNlZCB0byBvYnRhaW4gYSBiZXR0ZXIgY29uc3RhbnQgZm9yIGEgZ2l2ZW4gcGxhdGZvcm0gKHNlZQotZGlzY3Vzc2lvbiBpbiBzZWN0aW9uIExpbWl0YXRpb25zIGFib3ZlKS4gOjoKKzpyZWY6YHByb2ZpbGUtbGltaXRhdGlvbnNgKS4gOjoKIAogICAgaW1wb3J0IHByb2ZpbGUKICAgIHByID0gcHJvZmlsZS5Qcm9maWxlKCkKQEAgLTUzNSw4ICs1OTksOCBAQAogVGhlIG1ldGhvZCBleGVjdXRlcyB0aGUgbnVtYmVyIG9mIFB5dGhvbiBjYWxscyBnaXZlbiBieSB0aGUgYXJndW1lbnQsIGRpcmVjdGx5CiBhbmQgYWdhaW4gdW5kZXIgdGhlIHByb2ZpbGVyLCBtZWFzdXJpbmcgdGhlIHRpbWUgZm9yIGJvdGguIEl0IHRoZW4gY29tcHV0ZXMgdGhlCiBoaWRkZW4gb3ZlcmhlYWQgcGVyIHByb2ZpbGVyIGV2ZW50LCBhbmQgcmV0dXJucyB0aGF0IGFzIGEgZmxvYXQuICBGb3IgZXhhbXBsZSwKLW9uIGFuIDgwMCBNSHogUGVudGl1bSBydW5uaW5nIFdpbmRvd3MgMjAwMCwgYW5kIHVzaW5nIFB5dGhvbidzIHRpbWUuY2xvY2soKSBhcwotdGhlIHRpbWVyLCB0aGUgbWFnaWNhbCBudW1iZXIgaXMgYWJvdXQgMTIuNWUtNi4KK29uIGEgMS44R2h6IEludGVsIENvcmUgaTUgcnVubmluZyBNYWMgT1MgWCwgYW5kIHVzaW5nIFB5dGhvbidzIHRpbWUuY2xvY2soKSBhcwordGhlIHRpbWVyLCB0aGUgbWFnaWNhbCBudW1iZXIgaXMgYWJvdXQgNC4wNGUtNi4KIAogVGhlIG9iamVjdCBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGdldCBhIGZhaXJseSBjb25zaXN0ZW50IHJlc3VsdC4gSWYgeW91cgogY29tcHV0ZXIgaXMgKnZlcnkqIGZhc3QsIG9yIHlvdXIgdGltZXIgZnVuY3Rpb24gaGFzIHBvb3IgcmVzb2x1dGlvbiwgeW91IG1pZ2h0CkBAIC01NTksNjEgKzYyMyw1NCBAQAogSWYgeW91IGhhdmUgYSBjaG9pY2UsIHlvdSBhcmUgYmV0dGVyIG9mZiBjaG9vc2luZyBhIHNtYWxsZXIgY29uc3RhbnQsIGFuZCB0aGVuCiB5b3VyIHJlc3VsdHMgd2lsbCAibGVzcyBvZnRlbiIgc2hvdyB1cCBhcyBuZWdhdGl2ZSBpbiBwcm9maWxlIHN0YXRpc3RpY3MuCiAKKy4uIF9wcm9maWxlLXRpbWVyczoKIAotLi4gX3Byb2ZpbGVyLWV4dGVuc2lvbnM6CitVc2luZyBhIGN1c3RvbSB0aW1lcgorPT09PT09PT09PT09PT09PT09PT0KIAotRXh0ZW5zaW9ucyAtLS0gRGVyaXZpbmcgQmV0dGVyIFByb2ZpbGVycwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSWYgeW91IHdhbnQgdG8gY2hhbmdlIGhvdyBjdXJyZW50IHRpbWUgaXMgZGV0ZXJtaW5lZCAoZm9yIGV4YW1wbGUsIHRvIGZvcmNlIHVzZQorb2Ygd2FsbC1jbG9jayB0aW1lIG9yIGVsYXBzZWQgcHJvY2VzcyB0aW1lKSwgcGFzcyB0aGUgdGltaW5nIGZ1bmN0aW9uIHlvdSB3YW50Cit0byB0aGUgOmNsYXNzOmBQcm9maWxlYCBjbGFzcyBjb25zdHJ1Y3Rvcjo6CiAKLVRoZSA6Y2xhc3M6YFByb2ZpbGVgIGNsYXNzIG9mIGJvdGggbW9kdWxlcywgOm1vZDpgcHJvZmlsZWAgYW5kIDptb2Q6YGNQcm9maWxlYCwKLXdlcmUgd3JpdHRlbiBzbyB0aGF0IGRlcml2ZWQgY2xhc3NlcyBjb3VsZCBiZSBkZXZlbG9wZWQgdG8gZXh0ZW5kIHRoZSBwcm9maWxlci4KLVRoZSBkZXRhaWxzIGFyZSBub3QgZGVzY3JpYmVkIGhlcmUsIGFzIGRvaW5nIHRoaXMgc3VjY2Vzc2Z1bGx5IHJlcXVpcmVzIGFuCi1leHBlcnQgdW5kZXJzdGFuZGluZyBvZiBob3cgdGhlIDpjbGFzczpgUHJvZmlsZWAgY2xhc3Mgd29ya3MgaW50ZXJuYWxseS4gIFN0dWR5Ci10aGUgc291cmNlIGNvZGUgb2YgdGhlIG1vZHVsZSBjYXJlZnVsbHkgaWYgeW91IHdhbnQgdG8gcHVyc3VlIHRoaXMuCisgICAgcHIgPSBwcm9maWxlLlByb2ZpbGUoeW91cl90aW1lX2Z1bmMpCiAKLUlmIGFsbCB5b3Ugd2FudCB0byBkbyBpcyBjaGFuZ2UgaG93IGN1cnJlbnQgdGltZSBpcyBkZXRlcm1pbmVkIChmb3IgZXhhbXBsZSwgdG8KLWZvcmNlIHVzZSBvZiB3YWxsLWNsb2NrIHRpbWUgb3IgZWxhcHNlZCBwcm9jZXNzIHRpbWUpLCBwYXNzIHRoZSB0aW1pbmcgZnVuY3Rpb24KLXlvdSB3YW50IHRvIHRoZSA6Y2xhc3M6YFByb2ZpbGVgIGNsYXNzIGNvbnN0cnVjdG9yOjoKLQotICAgcHIgPSBwcm9maWxlLlByb2ZpbGUoeW91cl90aW1lX2Z1bmMpCi0KLVRoZSByZXN1bHRpbmcgcHJvZmlsZXIgd2lsbCB0aGVuIGNhbGwgOmZ1bmM6YHlvdXJfdGltZV9mdW5jYC4KK1RoZSByZXN1bHRpbmcgcHJvZmlsZXIgd2lsbCB0aGVuIGNhbGwgYGB5b3VyX3RpbWVfZnVuY2BgLiBEZXBlbmRpbmcgb24gd2hldGhlcgoreW91IGFyZSB1c2luZyA6Y2xhc3M6YHByb2ZpbGUuUHJvZmlsZWAgb3IgOmNsYXNzOmBjUHJvZmlsZS5Qcm9maWxlYCwKK2BgeW91cl90aW1lX2Z1bmNgYCdzIHJldHVybiB2YWx1ZSB3aWxsIGJlIGludGVycHJldGVkIGRpZmZlcmVudGx5OgogCiA6Y2xhc3M6YHByb2ZpbGUuUHJvZmlsZWAKLSAgIDpmdW5jOmB5b3VyX3RpbWVfZnVuY2Agc2hvdWxkIHJldHVybiBhIHNpbmdsZSBudW1iZXIsIG9yIGEgbGlzdCBvZiBudW1iZXJzIHdob3NlCi0gICBzdW0gaXMgdGhlIGN1cnJlbnQgdGltZSAobGlrZSB3aGF0IDpmdW5jOmBvcy50aW1lc2AgcmV0dXJucykuICBJZiB0aGUgZnVuY3Rpb24KLSAgIHJldHVybnMgYSBzaW5nbGUgdGltZSBudW1iZXIsIG9yIHRoZSBsaXN0IG9mIHJldHVybmVkIG51bWJlcnMgaGFzIGxlbmd0aCAyLCB0aGVuCi0gICB5b3Ugd2lsbCBnZXQgYW4gZXNwZWNpYWxseSBmYXN0IHZlcnNpb24gb2YgdGhlIGRpc3BhdGNoIHJvdXRpbmUuCisgICBgYHlvdXJfdGltZV9mdW5jYGAgc2hvdWxkIHJldHVybiBhIHNpbmdsZSBudW1iZXIsIG9yIGEgbGlzdCBvZiBudW1iZXJzIHdob3NlCisgICBzdW0gaXMgdGhlIGN1cnJlbnQgdGltZSAobGlrZSB3aGF0IDpmdW5jOmBvcy50aW1lc2AgcmV0dXJucykuICBJZiB0aGUKKyAgIGZ1bmN0aW9uIHJldHVybnMgYSBzaW5nbGUgdGltZSBudW1iZXIsIG9yIHRoZSBsaXN0IG9mIHJldHVybmVkIG51bWJlcnMgaGFzCisgICBsZW5ndGggMiwgdGhlbiB5b3Ugd2lsbCBnZXQgYW4gZXNwZWNpYWxseSBmYXN0IHZlcnNpb24gb2YgdGhlIGRpc3BhdGNoCisgICByb3V0aW5lLgogCiAgICBCZSB3YXJuZWQgdGhhdCB5b3Ugc2hvdWxkIGNhbGlicmF0ZSB0aGUgcHJvZmlsZXIgY2xhc3MgZm9yIHRoZSB0aW1lciBmdW5jdGlvbgotICAgdGhhdCB5b3UgY2hvb3NlLiAgRm9yIG1vc3QgbWFjaGluZXMsIGEgdGltZXIgdGhhdCByZXR1cm5zIGEgbG9uZSBpbnRlZ2VyIHZhbHVlCi0gICB3aWxsIHByb3ZpZGUgdGhlIGJlc3QgcmVzdWx0cyBpbiB0ZXJtcyBvZiBsb3cgb3ZlcmhlYWQgZHVyaW5nIHByb2ZpbGluZy4KLSAgICg6ZnVuYzpgb3MudGltZXNgIGlzICpwcmV0dHkqIGJhZCwgYXMgaXQgcmV0dXJucyBhIHR1cGxlIG9mIGZsb2F0aW5nIHBvaW50Ci0gICB2YWx1ZXMpLiAgSWYgeW91IHdhbnQgdG8gc3Vic3RpdHV0ZSBhIGJldHRlciB0aW1lciBpbiB0aGUgY2xlYW5lc3QgZmFzaGlvbiwKLSAgIGRlcml2ZSBhIGNsYXNzIGFuZCBoYXJkd2lyZSBhIHJlcGxhY2VtZW50IGRpc3BhdGNoIG1ldGhvZCB0aGF0IGJlc3QgaGFuZGxlcyB5b3VyCi0gICB0aW1lciBjYWxsLCBhbG9uZyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjYWxpYnJhdGlvbiBjb25zdGFudC4KKyAgIHRoYXQgeW91IGNob29zZSAoc2VlIDpyZWY6YHByb2ZpbGUtY2FsaWJyYXRpb25gKS4gIEZvciBtb3N0IG1hY2hpbmVzLCBhIHRpbWVyCisgICB0aGF0IHJldHVybnMgYSBsb25lIGludGVnZXIgdmFsdWUgd2lsbCBwcm92aWRlIHRoZSBiZXN0IHJlc3VsdHMgaW4gdGVybXMgb2YKKyAgIGxvdyBvdmVyaGVhZCBkdXJpbmcgcHJvZmlsaW5nLiAgKDpmdW5jOmBvcy50aW1lc2AgaXMgKnByZXR0eSogYmFkLCBhcyBpdAorICAgcmV0dXJucyBhIHR1cGxlIG9mIGZsb2F0aW5nIHBvaW50IHZhbHVlcykuICBJZiB5b3Ugd2FudCB0byBzdWJzdGl0dXRlIGEKKyAgIGJldHRlciB0aW1lciBpbiB0aGUgY2xlYW5lc3QgZmFzaGlvbiwgZGVyaXZlIGEgY2xhc3MgYW5kIGhhcmR3aXJlIGEKKyAgIHJlcGxhY2VtZW50IGRpc3BhdGNoIG1ldGhvZCB0aGF0IGJlc3QgaGFuZGxlcyB5b3VyIHRpbWVyIGNhbGwsIGFsb25nIHdpdGggdGhlCisgICBhcHByb3ByaWF0ZSBjYWxpYnJhdGlvbiBjb25zdGFudC4KIAogOmNsYXNzOmBjUHJvZmlsZS5Qcm9maWxlYAotICAgOmZ1bmM6YHlvdXJfdGltZV9mdW5jYCBzaG91bGQgcmV0dXJuIGEgc2luZ2xlIG51bWJlci4gIElmIGl0IHJldHVybnMgcGxhaW4KLSAgIGludGVnZXJzLCB5b3UgY2FuIGFsc28gaW52b2tlIHRoZSBjbGFzcyBjb25zdHJ1Y3RvciB3aXRoIGEgc2Vjb25kIGFyZ3VtZW50Ci0gICBzcGVjaWZ5aW5nIHRoZSByZWFsIGR1cmF0aW9uIG9mIG9uZSB1bml0IG9mIHRpbWUuICBGb3IgZXhhbXBsZSwgaWYKLSAgIDpmdW5jOmB5b3VyX2ludGVnZXJfdGltZV9mdW5jYCByZXR1cm5zIHRpbWVzIG1lYXN1cmVkIGluIHRob3VzYW5kcyBvZiBzZWNvbmRzLAorICAgYGB5b3VyX3RpbWVfZnVuY2BgIHNob3VsZCByZXR1cm4gYSBzaW5nbGUgbnVtYmVyLiAgSWYgaXQgcmV0dXJucyBpbnRlZ2VycywKKyAgIHlvdSBjYW4gYWxzbyBpbnZva2UgdGhlIGNsYXNzIGNvbnN0cnVjdG9yIHdpdGggYSBzZWNvbmQgYXJndW1lbnQgc3BlY2lmeWluZworICAgdGhlIHJlYWwgZHVyYXRpb24gb2Ygb25lIHVuaXQgb2YgdGltZS4gIEZvciBleGFtcGxlLCBpZgorICAgYGB5b3VyX2ludGVnZXJfdGltZV9mdW5jYGAgcmV0dXJucyB0aW1lcyBtZWFzdXJlZCBpbiB0aG91c2FuZHMgb2Ygc2Vjb25kcywKICAgIHlvdSB3b3VsZCBjb25zdHJ1Y3QgdGhlIDpjbGFzczpgUHJvZmlsZWAgaW5zdGFuY2UgYXMgZm9sbG93czo6CiAKLSAgICAgIHByID0gcHJvZmlsZS5Qcm9maWxlKHlvdXJfaW50ZWdlcl90aW1lX2Z1bmMsIDAuMDAxKQorICAgICAgcHIgPSBjUHJvZmlsZS5Qcm9maWxlKHlvdXJfaW50ZWdlcl90aW1lX2Z1bmMsIDAuMDAxKQogCiAgICBBcyB0aGUgOm1vZDpgY1Byb2ZpbGUuUHJvZmlsZWAgY2xhc3MgY2Fubm90IGJlIGNhbGlicmF0ZWQsIGN1c3RvbSB0aW1lcgotICAgZnVuY3Rpb25zIHNob3VsZCBiZSB1c2VkIHdpdGggY2FyZSBhbmQgc2hvdWxkIGJlIGFzIGZhc3QgYXMgcG9zc2libGUuICBGb3IgdGhlCi0gICBiZXN0IHJlc3VsdHMgd2l0aCBhIGN1c3RvbSB0aW1lciwgaXQgbWlnaHQgYmUgbmVjZXNzYXJ5IHRvIGhhcmQtY29kZSBpdCBpbiB0aGUgQwotICAgc291cmNlIG9mIHRoZSBpbnRlcm5hbCA6bW9kOmBfbHNwcm9mYCBtb2R1bGUuCisgICBmdW5jdGlvbnMgc2hvdWxkIGJlIHVzZWQgd2l0aCBjYXJlIGFuZCBzaG91bGQgYmUgYXMgZmFzdCBhcyBwb3NzaWJsZS4gIEZvcgorICAgdGhlIGJlc3QgcmVzdWx0cyB3aXRoIGEgY3VzdG9tIHRpbWVyLCBpdCBtaWdodCBiZSBuZWNlc3NhcnkgdG8gaGFyZC1jb2RlIGl0CisgICBpbiB0aGUgQyBzb3VyY2Ugb2YgdGhlIGludGVybmFsIDptb2Q6YF9sc3Byb2ZgIG1vZHVsZS4KKwogCiAuLiBydWJyaWM6OiBGb290bm90ZXMKIAotLi4gWyNdIFVwZGF0ZWQgYW5kIGNvbnZlcnRlZCB0byBMYVRlWCBieSBHdWlkbyB2YW4gUm9zc3VtLiBGdXJ0aGVyIHVwZGF0ZWQgYnkgQXJtaW4KLSAgIFJpZ28gdG8gaW50ZWdyYXRlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgbmV3IDptb2Q6YGNQcm9maWxlYCBtb2R1bGUgb2YgUHl0aG9uCi0gICAyLjUuCi0KLS4uIFsjXSBQcmlvciB0byBQeXRob24gMi4yLCBpdCB3YXMgbmVjZXNzYXJ5IHRvIGVkaXQgdGhlIHByb2ZpbGVyIHNvdXJjZSBjb2RlIHRvIGVtYmVkCi0gICB0aGUgYmlhcyBhcyBhIGxpdGVyYWwgbnVtYmVyLiAgWW91IHN0aWxsIGNhbiwgYnV0IHRoYXQgbWV0aG9kIGlzIG5vIGxvbmdlcgorLi4gWyNdIFByaW9yIHRvIFB5dGhvbiAyLjIsIGl0IHdhcyBuZWNlc3NhcnkgdG8gZWRpdCB0aGUgcHJvZmlsZXIgc291cmNlIGNvZGUgdG8KKyAgIGVtYmVkIHRoZSBiaWFzIGFzIGEgbGl0ZXJhbCBudW1iZXIuICBZb3Ugc3RpbGwgY2FuLCBidXQgdGhhdCBtZXRob2QgaXMgbm8gbG9uZ2VyCiAgICBkZXNjcmliZWQsIGJlY2F1c2Ugbm8gbG9uZ2VyIG5lZWRlZC4KLQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvcHljbGJyLnJzdCBiL0RvYy9saWJyYXJ5L3B5Y2xici5yc3QKaW5kZXggMmY4MTQ1MS4uMTNlYWFiZiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvcHljbGJyLnJzdAorKysgYi9Eb2MvbGlicmFyeS9weWNsYnIucnN0CkBAIC0xOSw3ICsxOSw3IEBACiBtb2R1bGVzLgogCiAKLS4uIGZ1bmN0aW9uOjogcmVhZG1vZHVsZShtb2R1bGVbLCBwYXRoPU5vbmVdKQorLi4gZnVuY3Rpb246OiByZWFkbW9kdWxlKG1vZHVsZSwgcGF0aD1Ob25lKQogCiAgICBSZWFkIGEgbW9kdWxlIGFuZCByZXR1cm4gYSBkaWN0aW9uYXJ5IG1hcHBpbmcgY2xhc3MgbmFtZXMgdG8gY2xhc3MKICAgIGRlc2NyaXB0b3Igb2JqZWN0cy4gIFRoZSBwYXJhbWV0ZXIgKm1vZHVsZSogc2hvdWxkIGJlIHRoZSBuYW1lIG9mIGEKQEAgLTI4LDcgKzI4LDcgQEAKICAgIG9mIGBgc3lzLnBhdGhgYCwgd2hpY2ggaXMgdXNlZCB0byBsb2NhdGUgbW9kdWxlIHNvdXJjZSBjb2RlLgogCiAKLS4uIGZ1bmN0aW9uOjogcmVhZG1vZHVsZV9leChtb2R1bGVbLCBwYXRoPU5vbmVdKQorLi4gZnVuY3Rpb246OiByZWFkbW9kdWxlX2V4KG1vZHVsZSwgcGF0aD1Ob25lKQogCiAgICBMaWtlIDpmdW5jOmByZWFkbW9kdWxlYCwgYnV0IHRoZSByZXR1cm5lZCBkaWN0aW9uYXJ5LCBpbiBhZGRpdGlvbiB0bwogICAgbWFwcGluZyBjbGFzcyBuYW1lcyB0byBjbGFzcyBkZXNjcmlwdG9yIG9iamVjdHMsIGFsc28gbWFwcyB0b3AtbGV2ZWwKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3B5ZXhwYXQucnN0IGIvRG9jL2xpYnJhcnkvcHlleHBhdC5yc3QKaW5kZXggODI5OTczOS4uMjBjYTNiYyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvcHlleHBhdC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvcHlleHBhdC5yc3QKQEAgLTE0LDYgKzE0LDE0IEBACiAgICBkaXJlY3RpdmUuICBTaW5jZSB0aGV5IGFyZSBhdHRyaWJ1dGVzIHdoaWNoIGFyZSBzZXQgYnkgY2xpZW50IGNvZGUsIGluLXRleHQKICAgIHJlZmVyZW5jZXMgdG8gdGhlc2UgYXR0cmlidXRlcyBzaG91bGQgYmUgbWFya2VkIHVzaW5nIHRoZSA6bWVtYmVyOiByb2xlLgogCisKKy4uIHdhcm5pbmc6OgorCisgICBUaGUgOm1vZDpgcHlleHBhdGAgbW9kdWxlIGlzIG5vdCBzZWN1cmUgYWdhaW5zdCBtYWxpY2lvdXNseQorICAgY29uc3RydWN0ZWQgZGF0YS4gIElmIHlvdSBuZWVkIHRvIHBhcnNlIHVudHJ1c3RlZCBvciB1bmF1dGhlbnRpY2F0ZWQgZGF0YSBzZWUKKyAgIDpyZWY6YHhtbC12dWxuZXJhYmlsaXRpZXNgLgorCisKIC4uIHZlcnNpb25hZGRlZDo6IDIuMAogCiAuLiBpbmRleDo6IHNpbmdsZTogRXhwYXQKQEAgLTk1LDYgKzEwMywxMCBAQAogICAgICAgaHR0cDovL3d3dy5weXRob24ub3JnL25zLyBlbGVtMQogICAgICAgZWxlbTIKIAorICAgRHVlIHRvIGxpbWl0YXRpb25zIGluIHRoZSBgYEV4cGF0YGAgbGlicmFyeSB1c2VkIGJ5IDptb2Q6YHB5ZXhwYXRgLAorICAgdGhlIDpjbGFzczpgeG1scGFyc2VyYCBpbnN0YW5jZSByZXR1cm5lZCBjYW4gb25seSBiZSB1c2VkIHRvIHBhcnNlIGEgc2luZ2xlCisgICBYTUwgZG9jdW1lbnQuICBDYWxsIGBgUGFyc2VyQ3JlYXRlYGAgZm9yIGVhY2ggZG9jdW1lbnQgdG8gcHJvdmlkZSB1bmlxdWUKKyAgIHBhcnNlciBpbnN0YW5jZXMuCiAKIC4uIHNlZWFsc286OgogCkBAIC0xMTQsNyArMTI2LDkgQEAKIAogICAgUGFyc2VzIHRoZSBjb250ZW50cyBvZiB0aGUgc3RyaW5nICpkYXRhKiwgY2FsbGluZyB0aGUgYXBwcm9wcmlhdGUgaGFuZGxlcgogICAgZnVuY3Rpb25zIHRvIHByb2Nlc3MgdGhlIHBhcnNlZCBkYXRhLiAgKmlzZmluYWwqIG11c3QgYmUgdHJ1ZSBvbiB0aGUgZmluYWwgY2FsbAotICAgdG8gdGhpcyBtZXRob2QuICAqZGF0YSogY2FuIGJlIHRoZSBlbXB0eSBzdHJpbmcgYXQgYW55IHRpbWUuCisgICB0byB0aGlzIG1ldGhvZDsgaXQgYWxsb3dzIHRoZSBwYXJzaW5nIG9mIGEgc2luZ2xlIGZpbGUgaW4gZnJhZ21lbnRzLAorICAgbm90IHRoZSBzdWJtaXNzaW9uIG9mIG11bHRpcGxlIGZpbGVzLgorICAgKmRhdGEqIGNhbiBiZSB0aGUgZW1wdHkgc3RyaW5nIGF0IGFueSB0aW1lLgogCiAKIC4uIG1ldGhvZDo6IHhtbHBhcnNlci5QYXJzZUZpbGUoZmlsZSkKQEAgLTQzNyw3ICs0NTEsNyBAQAogLi4gbWV0aG9kOjogeG1scGFyc2VyLkNvbW1lbnRIYW5kbGVyKGRhdGEpCiAKICAgIENhbGxlZCBmb3IgY29tbWVudHMuICAqZGF0YSogaXMgdGhlIHRleHQgb2YgdGhlIGNvbW1lbnQsIGV4Y2x1ZGluZyB0aGUgbGVhZGluZwotICAgJ2BgPCEtYGBcIGBgLWBgJyBhbmQgdHJhaWxpbmcgJ2BgLWBgXCBgYC0+YGAnLgorICAgYGAnPCEtYGBcIGBgLSdgYCBhbmQgdHJhaWxpbmcgYGAnLWBgXCBgYC0+J2BgLgogCiAKIC4uIG1ldGhvZDo6IHhtbHBhcnNlci5TdGFydENkYXRhU2VjdGlvbkhhbmRsZXIoKQpAQCAtODk4LDUgKzkxMiw1IEBACiAuLiBbI10gVGhlIGVuY29kaW5nIHN0cmluZyBpbmNsdWRlZCBpbiBYTUwgb3V0cHV0IHNob3VsZCBjb25mb3JtIHRvIHRoZQogICAgYXBwcm9wcmlhdGUgc3RhbmRhcmRzLiBGb3IgZXhhbXBsZSwgIlVURi04IiBpcyB2YWxpZCwgYnV0ICJVVEY4IiBpcwogICAgbm90LiBTZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNi9SRUMteG1sMTEtMjAwNjA4MTYvI05ULUVuY29kaW5nRGVjbAotICAgYW5kIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvY2hhcmFjdGVyLXNldHMgLgorICAgYW5kIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvY2hhcmFjdGVyLXNldHNcIC4KIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvcXVldWUucnN0IGIvRG9jL2xpYnJhcnkvcXVldWUucnN0CmluZGV4IDM2ZmYzNDYuLmI1MjU3MDUgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3F1ZXVlLnJzdAorKysgYi9Eb2MvbGlicmFyeS9xdWV1ZS5yc3QKQEAgLTUsOSArNSw5IEBACiAgICA6c3lub3BzaXM6IEEgc3luY2hyb25pemVkIHF1ZXVlIGNsYXNzLgogCiAuLiBub3RlOjoKLSAgIFRoZSA6bW9kOmBRdWV1ZWAgbW9kdWxlIGhhcyBiZWVuIHJlbmFtZWQgdG8gOm1vZDpgcXVldWVgIGluIFB5dGhvbiAzLjAuICBUaGUKKyAgIFRoZSA6bW9kOmBRdWV1ZWAgbW9kdWxlIGhhcyBiZWVuIHJlbmFtZWQgdG8gOm1vZDpgcXVldWVgIGluIFB5dGhvbiAzLiAgVGhlCiAgICA6dGVybTpgMnRvM2AgdG9vbCB3aWxsIGF1dG9tYXRpY2FsbHkgYWRhcHQgaW1wb3J0cyB3aGVuIGNvbnZlcnRpbmcgeW91cgotICAgc291cmNlcyB0byAzLjAuCisgICBzb3VyY2VzIHRvIFB5dGhvbiAzLgogCiAqKlNvdXJjZSBjb2RlOioqIDpzb3VyY2U6YExpYi9RdWV1ZS5weWAKIApAQCAtMjAsOCArMjAsOCBAQAogYXZhaWxhYmlsaXR5IG9mIHRocmVhZCBzdXBwb3J0IGluIFB5dGhvbjsgc2VlIHRoZSA6bW9kOmB0aHJlYWRpbmdgCiBtb2R1bGUuCiAKLUltcGxlbWVudHMgdGhyZWUgdHlwZXMgb2YgcXVldWUgd2hvc2Ugb25seSBkaWZmZXJlbmNlIGlzIHRoZSBvcmRlciB0aGF0Ci10aGUgZW50cmllcyBhcmUgcmV0cmlldmVkLiAgSW4gYSBGSUZPIHF1ZXVlLCB0aGUgZmlyc3QgdGFza3MgYWRkZWQgYXJlCitUaGUgbW9kdWxlIGltcGxlbWVudHMgdGhyZWUgdHlwZXMgb2YgcXVldWUsIHdoaWNoIGRpZmZlciBvbmx5IGluIHRoZSBvcmRlciBpbgord2hpY2ggdGhlIGVudHJpZXMgYXJlIHJldHJpZXZlZC4gIEluIGEgRklGTyBxdWV1ZSwgdGhlIGZpcnN0IHRhc2tzIGFkZGVkIGFyZQogdGhlIGZpcnN0IHJldHJpZXZlZC4gSW4gYSBMSUZPIHF1ZXVlLCB0aGUgbW9zdCByZWNlbnRseSBhZGRlZCBlbnRyeSBpcwogdGhlIGZpcnN0IHJldHJpZXZlZCAob3BlcmF0aW5nIGxpa2UgYSBzdGFjaykuICBXaXRoIGEgcHJpb3JpdHkgcXVldWUsCiB0aGUgZW50cmllcyBhcmUga2VwdCBzb3J0ZWQgKHVzaW5nIHRoZSA6bW9kOmBoZWFwcWAgbW9kdWxlKSBhbmQgdGhlCkBAIC02MCwxMyArNjAsMTUgQEAKIAogLi4gZXhjZXB0aW9uOjogRW1wdHkKIAotICAgRXhjZXB0aW9uIHJhaXNlZCB3aGVuIG5vbi1ibG9ja2luZyA6bWV0aDpgZ2V0YCAob3IgOm1ldGg6YGdldF9ub3dhaXRgKSBpcyBjYWxsZWQKKyAgIEV4Y2VwdGlvbiByYWlzZWQgd2hlbiBub24tYmxvY2tpbmcgOm1ldGg6YH5RdWV1ZS5nZXRgIChvcgorICAgOm1ldGg6YH5RdWV1ZS5nZXRfbm93YWl0YCkgaXMgY2FsbGVkCiAgICBvbiBhIDpjbGFzczpgUXVldWVgIG9iamVjdCB3aGljaCBpcyBlbXB0eS4KIAogCiAuLiBleGNlcHRpb246OiBGdWxsCiAKLSAgIEV4Y2VwdGlvbiByYWlzZWQgd2hlbiBub24tYmxvY2tpbmcgOm1ldGg6YHB1dGAgKG9yIDptZXRoOmBwdXRfbm93YWl0YCkgaXMgY2FsbGVkCisgICBFeGNlcHRpb24gcmFpc2VkIHdoZW4gbm9uLWJsb2NraW5nIDptZXRoOmB+UXVldWUucHV0YCAob3IKKyAgIDptZXRoOmB+UXVldWUucHV0X25vd2FpdGApIGlzIGNhbGxlZAogICAgb24gYSA6Y2xhc3M6YFF1ZXVlYCBvYmplY3Qgd2hpY2ggaXMgZnVsbC4KIAogLi4gc2VlYWxzbzo6CmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9yYW5kb20ucnN0IGIvRG9jL2xpYnJhcnkvcmFuZG9tLnJzdAppbmRleCBkZTk4YzA0Li4xYmM5OTg5IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9yYW5kb20ucnN0CisrKyBiL0RvYy9saWJyYXJ5L3JhbmRvbS5yc3QKQEAgLTYwLDYgKzYwLDEzIEBACiB1c2VzIHRoZSBzeXN0ZW0gZnVuY3Rpb24gOmZ1bmM6YG9zLnVyYW5kb21gIHRvIGdlbmVyYXRlIHJhbmRvbSBudW1iZXJzCiBmcm9tIHNvdXJjZXMgcHJvdmlkZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uCiAKKy4uIHdhcm5pbmc6OgorCisgICBUaGUgcHNldWRvLXJhbmRvbSBnZW5lcmF0b3JzIG9mIHRoaXMgbW9kdWxlIHNob3VsZCBub3QgYmUgdXNlZCBmb3IKKyAgIHNlY3VyaXR5IHB1cnBvc2VzLiAgVXNlIDpmdW5jOmBvcy51cmFuZG9tYCBvciA6Y2xhc3M6YFN5c3RlbVJhbmRvbWAgaWYKKyAgIHlvdSByZXF1aXJlIGEgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIHBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKworCiBCb29ra2VlcGluZyBmdW5jdGlvbnM6CiAKIApAQCAtOTAsNyArOTcsNyBAQAogCiAgICAqc3RhdGUqIHNob3VsZCBoYXZlIGJlZW4gb2J0YWluZWQgZnJvbSBhIHByZXZpb3VzIGNhbGwgdG8gOmZ1bmM6YGdldHN0YXRlYCwgYW5kCiAgICA6ZnVuYzpgc2V0c3RhdGVgIHJlc3RvcmVzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgZ2VuZXJhdG9yIHRvIHdoYXQgaXQgd2FzIGF0Ci0gICB0aGUgdGltZSA6ZnVuYzpgc2V0c3RhdGVgIHdhcyBjYWxsZWQuCisgICB0aGUgdGltZSA6ZnVuYzpgZ2V0c3RhdGVgIHdhcyBjYWxsZWQuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMQogCkBAIC0xMjQsNyArMTMxLDggQEAKIEZ1bmN0aW9ucyBmb3IgaW50ZWdlcnM6CiAKIAotLi4gZnVuY3Rpb246OiByYW5kcmFuZ2UoW3N0YXJ0LF0gc3RvcFssIHN0ZXBdKQorLi4gZnVuY3Rpb246OiByYW5kcmFuZ2Uoc3RvcCkKKyAgICAgICAgICAgICAgcmFuZHJhbmdlKHN0YXJ0LCBzdG9wWywgc3RlcF0pCiAKICAgIFJldHVybiBhIHJhbmRvbWx5IHNlbGVjdGVkIGVsZW1lbnQgZnJvbSBgYHJhbmdlKHN0YXJ0LCBzdG9wLCBzdGVwKWBgLiAgVGhpcyBpcwogICAgZXF1aXZhbGVudCB0byBgYGNob2ljZShyYW5nZShzdGFydCwgc3RvcCwgc3RlcCkpYGAsIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IGJ1aWxkIGEKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3JlLnJzdCBiL0RvYy9saWJyYXJ5L3JlLnJzdAppbmRleCAxMGE2MWMzLi5lNWJiZDAzIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9yZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvcmUucnN0CkBAIC0yMzcsMjEgKzIzNywzMiBAQAogCiBgYCg/UDxuYW1lPi4uLilgYAogICAgU2ltaWxhciB0byByZWd1bGFyIHBhcmVudGhlc2VzLCBidXQgdGhlIHN1YnN0cmluZyBtYXRjaGVkIGJ5IHRoZSBncm91cCBpcwotICAgYWNjZXNzaWJsZSB3aXRoaW4gdGhlIHJlc3Qgb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB2aWEgdGhlIHN5bWJvbGljIGdyb3VwCi0gICBuYW1lICpuYW1lKi4gIEdyb3VwIG5hbWVzIG11c3QgYmUgdmFsaWQgUHl0aG9uIGlkZW50aWZpZXJzLCBhbmQgZWFjaCBncm91cAotICAgbmFtZSBtdXN0IGJlIGRlZmluZWQgb25seSBvbmNlIHdpdGhpbiBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gIEEgc3ltYm9saWMgZ3JvdXAKLSAgIGlzIGFsc28gYSBudW1iZXJlZCBncm91cCwganVzdCBhcyBpZiB0aGUgZ3JvdXAgd2VyZSBub3QgbmFtZWQuICBTbyB0aGUgZ3JvdXAKLSAgIG5hbWVkIGBgaWRgYCBpbiB0aGUgZXhhbXBsZSBiZWxvdyBjYW4gYWxzbyBiZSByZWZlcmVuY2VkIGFzIHRoZSBudW1iZXJlZCBncm91cAotICAgYGAxYGAuCisgICBhY2Nlc3NpYmxlIHZpYSB0aGUgc3ltYm9saWMgZ3JvdXAgbmFtZSAqbmFtZSouICBHcm91cCBuYW1lcyBtdXN0IGJlIHZhbGlkCisgICBQeXRob24gaWRlbnRpZmllcnMsIGFuZCBlYWNoIGdyb3VwIG5hbWUgbXVzdCBiZSBkZWZpbmVkIG9ubHkgb25jZSB3aXRoaW4gYQorICAgcmVndWxhciBleHByZXNzaW9uLiAgQSBzeW1ib2xpYyBncm91cCBpcyBhbHNvIGEgbnVtYmVyZWQgZ3JvdXAsIGp1c3QgYXMgaWYKKyAgIHRoZSBncm91cCB3ZXJlIG5vdCBuYW1lZC4KIAotICAgRm9yIGV4YW1wbGUsIGlmIHRoZSBwYXR0ZXJuIGlzIGBgKD9QPGlkPlthLXpBLVpfXVx3KilgYCwgdGhlIGdyb3VwIGNhbiBiZQotICAgcmVmZXJlbmNlZCBieSBpdHMgbmFtZSBpbiBhcmd1bWVudHMgdG8gbWV0aG9kcyBvZiBtYXRjaCBvYmplY3RzLCBzdWNoIGFzCi0gICBgYG0uZ3JvdXAoJ2lkJylgYCBvciBgYG0uZW5kKCdpZCcpYGAsIGFuZCBhbHNvIGJ5IG5hbWUgaW4gdGhlIHJlZ3VsYXIKLSAgIGV4cHJlc3Npb24gaXRzZWxmICh1c2luZyBgYCg/UD1pZClgYCkgYW5kIHJlcGxhY2VtZW50IHRleHQgZ2l2ZW4gdG8KLSAgIGBgLnN1YigpYGAgKHVzaW5nIGBgXGc8aWQ+YGApLgorICAgTmFtZWQgZ3JvdXBzIGNhbiBiZSByZWZlcmVuY2VkIGluIHRocmVlIGNvbnRleHRzLiAgSWYgdGhlIHBhdHRlcm4gaXMKKyAgIGBgKD9QPHF1b3RlPlsnIl0pLio/KD9QPXF1b3RlKWBgIChpLmUuIG1hdGNoaW5nIGEgc3RyaW5nIHF1b3RlZCB3aXRoIGVpdGhlcgorICAgc2luZ2xlIG9yIGRvdWJsZSBxdW90ZXMpOgorCisgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICB8IENvbnRleHQgb2YgcmVmZXJlbmNlIHRvIGdyb3VwICJxdW90ZSIgfCBXYXlzIHRvIHJlZmVyZW5jZSBpdCAgICAgICAgICAgICB8CisgICArPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCisgICB8IGluIHRoZSBzYW1lIHBhdHRlcm4gaXRzZWxmICAgICAgICAgICAgfCAqIGBgKD9QPXF1b3RlKWBgIChhcyBzaG93bikgICAgICB8CisgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqIGBgXDFgYCAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICB8IHdoZW4gcHJvY2Vzc2luZyBtYXRjaCBvYmplY3QgYGBtYGAgICAgfCAqIGBgbS5ncm91cCgncXVvdGUnKWBgICAgICAgICAgICB8CisgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqIGBgbS5lbmQoJ3F1b3RlJylgYCAoZXRjLikgICAgICB8CisgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICB8IGluIGEgc3RyaW5nIHBhc3NlZCB0byB0aGUgYGByZXBsYGAgICAgfCAqIGBgXGc8cXVvdGU+YGAgICAgICAgICAgICAgICAgICB8CisgICB8IGFyZ3VtZW50IG9mIGBgcmUuc3ViKClgYCAgICAgICAgICAgICAgfCAqIGBgXGc8MT5gYCAgICAgICAgICAgICAgICAgICAgICB8CisgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqIGBgXDFgYCAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAKIGBgKD9QPW5hbWUpYGAKLSAgIE1hdGNoZXMgd2hhdGV2ZXIgdGV4dCB3YXMgbWF0Y2hlZCBieSB0aGUgZWFybGllciBncm91cCBuYW1lZCAqbmFtZSouCisgICBBIGJhY2tyZWZlcmVuY2UgdG8gYSBuYW1lZCBncm91cDsgaXQgbWF0Y2hlcyB3aGF0ZXZlciB0ZXh0IHdhcyBtYXRjaGVkIGJ5IHRoZQorICAgZWFybGllciBncm91cCBuYW1lZCAqbmFtZSouCiAKIGBgKD8jLi4uKWBgCiAgICBBIGNvbW1lbnQ7IHRoZSBjb250ZW50cyBvZiB0aGUgcGFyZW50aGVzZXMgYXJlIHNpbXBseSBpZ25vcmVkLgpAQCAtMjczLDcgKzI4NCw3IEBACiAgICBsb29rYmVoaW5kIHdpbGwgYmFjayB1cCAzIGNoYXJhY3RlcnMgYW5kIGNoZWNrIGlmIHRoZSBjb250YWluZWQgcGF0dGVybiBtYXRjaGVzLgogICAgVGhlIGNvbnRhaW5lZCBwYXR0ZXJuIG11c3Qgb25seSBtYXRjaCBzdHJpbmdzIG9mIHNvbWUgZml4ZWQgbGVuZ3RoLCBtZWFuaW5nIHRoYXQKICAgIGBgYWJjYGAgb3IgYGBhfGJgYCBhcmUgYWxsb3dlZCwgYnV0IGBgYSpgYCBhbmQgYGBhezMsNH1gYCBhcmUgbm90LiAgTm90ZSB0aGF0Ci0gICBwYXR0ZXJucyB3aGljaCBzdGFydCB3aXRoIHBvc2l0aXZlIGxvb2tiZWhpbmQgYXNzZXJ0aW9ucyB3aWxsIG5ldmVyIG1hdGNoIGF0IHRoZQorICAgcGF0dGVybnMgd2hpY2ggc3RhcnQgd2l0aCBwb3NpdGl2ZSBsb29rYmVoaW5kIGFzc2VydGlvbnMgd2lsbCBub3QgbWF0Y2ggYXQgdGhlCiAgICBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZyBiZWluZyBzZWFyY2hlZDsgeW91IHdpbGwgbW9zdCBsaWtlbHkgd2FudCB0byB1c2UgdGhlCiAgICA6ZnVuYzpgc2VhcmNoYCBmdW5jdGlvbiByYXRoZXIgdGhhbiB0aGUgOmZ1bmM6YG1hdGNoYCBmdW5jdGlvbjoKIApAQCAtMzExLDcgKzMyMiw3IEBACiBgYFxudW1iZXJgYAogICAgTWF0Y2hlcyB0aGUgY29udGVudHMgb2YgdGhlIGdyb3VwIG9mIHRoZSBzYW1lIG51bWJlci4gIEdyb3VwcyBhcmUgbnVtYmVyZWQKICAgIHN0YXJ0aW5nIGZyb20gMS4gIEZvciBleGFtcGxlLCBgYCguKykgXDFgYCBtYXRjaGVzIGBgJ3RoZSB0aGUnYGAgb3IgYGAnNTUgNTUnYGAsCi0gICBidXQgbm90IGBgJ3RoZSBlbmQnYGAgKG5vdGUgdGhlIHNwYWNlIGFmdGVyIHRoZSBncm91cCkuICBUaGlzIHNwZWNpYWwgc2VxdWVuY2UKKyAgIGJ1dCBub3QgYGAndGhldGhlJ2BgIChub3RlIHRoZSBzcGFjZSBhZnRlciB0aGUgZ3JvdXApLiAgVGhpcyBzcGVjaWFsIHNlcXVlbmNlCiAgICBjYW4gb25seSBiZSB1c2VkIHRvIG1hdGNoIG9uZSBvZiB0aGUgZmlyc3QgOTkgZ3JvdXBzLiAgSWYgdGhlIGZpcnN0IGRpZ2l0IG9mCiAgICAqbnVtYmVyKiBpcyAwLCBvciAqbnVtYmVyKiBpcyAzIG9jdGFsIGRpZ2l0cyBsb25nLCBpdCB3aWxsIG5vdCBiZSBpbnRlcnByZXRlZCBhcwogICAgYSBncm91cCBtYXRjaCwgYnV0IGFzIHRoZSBjaGFyYWN0ZXIgd2l0aCBvY3RhbCB2YWx1ZSAqbnVtYmVyKi4gSW5zaWRlIHRoZQpAQCAtMzI1LDE0ICszMzYsMjAgQEAKICAgIE1hdGNoZXMgdGhlIGVtcHR5IHN0cmluZywgYnV0IG9ubHkgYXQgdGhlIGJlZ2lubmluZyBvciBlbmQgb2YgYSB3b3JkLiAgQSB3b3JkIGlzCiAgICBkZWZpbmVkIGFzIGEgc2VxdWVuY2Ugb2YgYWxwaGFudW1lcmljIG9yIHVuZGVyc2NvcmUgY2hhcmFjdGVycywgc28gdGhlIGVuZCBvZiBhCiAgICB3b3JkIGlzIGluZGljYXRlZCBieSB3aGl0ZXNwYWNlIG9yIGEgbm9uLWFscGhhbnVtZXJpYywgbm9uLXVuZGVyc2NvcmUgY2hhcmFjdGVyLgotICAgTm90ZSB0aGF0ICBgYFxiYGAgaXMgZGVmaW5lZCBhcyB0aGUgYm91bmRhcnkgYmV0d2VlbiBgYFx3YGAgYW5kIGBgXFdgYCwgc28gdGhlCi0gICBwcmVjaXNlIHNldCBvZiBjaGFyYWN0ZXJzIGRlZW1lZCB0byBiZSBhbHBoYW51bWVyaWMgZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mIHRoZQotICAgYGBVTklDT0RFYGAgYW5kIGBgTE9DQUxFYGAgZmxhZ3MuICBJbnNpZGUgYSBjaGFyYWN0ZXIgcmFuZ2UsIGBgXGJgYCByZXByZXNlbnRzCi0gICB0aGUgYmFja3NwYWNlIGNoYXJhY3RlciwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBQeXRob24ncyBzdHJpbmcgbGl0ZXJhbHMuCisgICBOb3RlIHRoYXQgZm9ybWFsbHksIGBgXGJgYCBpcyBkZWZpbmVkIGFzIHRoZSBib3VuZGFyeSBiZXR3ZWVuIGEgYGBcd2BgIGFuZAorICAgYSBgYFxXYGAgY2hhcmFjdGVyIChvciB2aWNlIHZlcnNhKSwgb3IgYmV0d2VlbiBgYFx3YGAgYW5kIHRoZSBiZWdpbm5pbmcvZW5kCisgICBvZiB0aGUgc3RyaW5nLCBzbyB0aGUgcHJlY2lzZSBzZXQgb2YgY2hhcmFjdGVycyBkZWVtZWQgdG8gYmUgYWxwaGFudW1lcmljCisgICBkZXBlbmRzIG9uIHRoZSB2YWx1ZXMgb2YgdGhlIGBgVU5JQ09ERWBgIGFuZCBgYExPQ0FMRWBgIGZsYWdzLgorICAgRm9yIGV4YW1wbGUsIGBgcidcYmZvb1xiJ2BgIG1hdGNoZXMgYGAnZm9vJ2BgLCBgYCdmb28uJ2BgLCBgYCcoZm9vKSdgYCwKKyAgIGBgJ2JhciBmb28gYmF6J2BgIGJ1dCBub3QgYGAnZm9vYmFyJ2BgIG9yIGBgJ2ZvbzMnYGAuCisgICBJbnNpZGUgYSBjaGFyYWN0ZXIgcmFuZ2UsIGBgXGJgYCByZXByZXNlbnRzIHRoZSBiYWNrc3BhY2UgY2hhcmFjdGVyLCBmb3IKKyAgIGNvbXBhdGliaWxpdHkgd2l0aCBQeXRob24ncyBzdHJpbmcgbGl0ZXJhbHMuCiAKIGBgXEJgYAogICAgTWF0Y2hlcyB0aGUgZW1wdHkgc3RyaW5nLCBidXQgb25seSB3aGVuIGl0IGlzICpub3QqIGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kIG9mIGEKLSAgIHdvcmQuICBUaGlzIGlzIGp1c3QgdGhlIG9wcG9zaXRlIG9mIGBgXGJgYCwgc28gaXMgYWxzbyBzdWJqZWN0IHRvIHRoZSBzZXR0aW5ncworICAgd29yZC4gIFRoaXMgbWVhbnMgdGhhdCBgYHIncHlcQidgYCBtYXRjaGVzIGBgJ3B5dGhvbidgYCwgYGAncHkzJ2BgLCBgYCdweTInYGAsCisgICBidXQgbm90IGBgJ3B5J2BgLCBgYCdweS4nYGAsIG9yIGBgJ3B5ISdgYC4KKyAgIGBgXEJgYCBpcyBqdXN0IHRoZSBvcHBvc2l0ZSBvZiBgYFxiYGAsIHNvIGlzIGFsc28gc3ViamVjdCB0byB0aGUgc2V0dGluZ3MKICAgIG9mIGBgTE9DQUxFYGAgYW5kIGBgVU5JQ09ERWBgLgogCiBgYFxkYGAKQEAgLTM0OCwyMCArMzY1LDIwIEBACiAgICBjaGFyYWN0ZXIgIHByb3BlcnRpZXMgZGF0YWJhc2UuCiAKIGBgXHNgYAotICAgV2hlbiB0aGUgOmNvbnN0OmBMT0NBTEVgIGFuZCA6Y29uc3Q6YFVOSUNPREVgIGZsYWdzIGFyZSBub3Qgc3BlY2lmaWVkLCBtYXRjaGVzCi0gICBhbnkgd2hpdGVzcGFjZSBjaGFyYWN0ZXI7IHRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgc2V0IGBgWyBcdFxuXHJcZlx2XWBgLiBXaXRoCi0gICA6Y29uc3Q6YExPQ0FMRWAsIGl0IHdpbGwgbWF0Y2ggdGhpcyBzZXQgcGx1cyB3aGF0ZXZlciBjaGFyYWN0ZXJzIGFyZSBkZWZpbmVkIGFzCi0gICBzcGFjZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLiBJZiA6Y29uc3Q6YFVOSUNPREVgIGlzIHNldCwgdGhpcyB3aWxsIG1hdGNoIHRoZQotICAgY2hhcmFjdGVycyBgYFsgXHRcblxyXGZcdl1gYCBwbHVzIHdoYXRldmVyIGlzIGNsYXNzaWZpZWQgYXMgc3BhY2UgaW4gdGhlIFVuaWNvZGUKLSAgIGNoYXJhY3RlciBwcm9wZXJ0aWVzIGRhdGFiYXNlLgorICAgV2hlbiB0aGUgOmNvbnN0OmBVTklDT0RFYCBmbGFnIGlzIG5vdCBzcGVjaWZpZWQsIGl0IG1hdGNoZXMgYW55IHdoaXRlc3BhY2UKKyAgIGNoYXJhY3RlciwgdGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBzZXQgYGBbIFx0XG5cclxmXHZdYGAuIFRoZQorICAgOmNvbnN0OmBMT0NBTEVgIGZsYWcgaGFzIG5vIGV4dHJhIGVmZmVjdCBvbiBtYXRjaGluZyBvZiB0aGUgc3BhY2UuCisgICBJZiA6Y29uc3Q6YFVOSUNPREVgIGlzIHNldCwgdGhpcyB3aWxsIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIGBgWyBcdFxuXHJcZlx2XWBgCisgICBwbHVzIHdoYXRldmVyIGlzIGNsYXNzaWZpZWQgYXMgc3BhY2UgaW4gdGhlIFVuaWNvZGUgY2hhcmFjdGVyIHByb3BlcnRpZXMKKyAgIGRhdGFiYXNlLgogCiBgYFxTYGAKLSAgIFdoZW4gdGhlIDpjb25zdDpgTE9DQUxFYCBhbmQgOmNvbnN0OmBVTklDT0RFYCBmbGFncyBhcmUgbm90IHNwZWNpZmllZCwgbWF0Y2hlcwotICAgYW55IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcjsgdGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBzZXQgYGBbXiBcdFxuXHJcZlx2XWBgCi0gICBXaXRoIDpjb25zdDpgTE9DQUxFYCwgaXQgd2lsbCBtYXRjaCBhbnkgY2hhcmFjdGVyIG5vdCBpbiB0aGlzIHNldCwgYW5kIG5vdAotICAgZGVmaW5lZCBhcyBzcGFjZSBpbiB0aGUgY3VycmVudCBsb2NhbGUuIElmIDpjb25zdDpgVU5JQ09ERWAgaXMgc2V0LCB0aGlzIHdpbGwKLSAgIG1hdGNoIGFueXRoaW5nIG90aGVyIHRoYW4gYGBbIFx0XG5cclxmXHZdYGAgYW5kIGNoYXJhY3RlcnMgbWFya2VkIGFzIHNwYWNlIGluCi0gICB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgcHJvcGVydGllcyBkYXRhYmFzZS4KKyAgIFdoZW4gdGhlIDpjb25zdDpgVU5JQ09ERWAgZmxhZ3MgaXMgbm90IHNwZWNpZmllZCwgbWF0Y2hlcyBhbnkgbm9uLXdoaXRlc3BhY2UKKyAgIGNoYXJhY3RlcjsgdGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBzZXQgYGBbXiBcdFxuXHJcZlx2XWBgIFRoZQorICAgOmNvbnN0OmBMT0NBTEVgIGZsYWcgaGFzIG5vIGV4dHJhIGVmZmVjdCBvbiBub24td2hpdGVzcGFjZSBtYXRjaC4gIElmCisgICA6Y29uc3Q6YFVOSUNPREVgIGlzIHNldCwgdGhlbiBhbnkgY2hhcmFjdGVyIG5vdCBtYXJrZWQgYXMgc3BhY2UgaW4gdGhlCisgICBVbmljb2RlIGNoYXJhY3RlciBwcm9wZXJ0aWVzIGRhdGFiYXNlIGlzIG1hdGNoZWQuCisKIAogYGBcd2BgCiAgICBXaGVuIHRoZSA6Y29uc3Q6YExPQ0FMRWAgYW5kIDpjb25zdDpgVU5JQ09ERWAgZmxhZ3MgYXJlIG5vdCBzcGVjaWZpZWQsIG1hdGNoZXMKQEAgLTM3NiwxMiArMzkzLDE2IEBACiAgICBhbnkgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXI7IHRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgc2V0IGBgW15hLXpBLVowLTlfXWBgLgogICAgV2l0aCA6Y29uc3Q6YExPQ0FMRWAsIGl0IHdpbGwgbWF0Y2ggYW55IGNoYXJhY3RlciBub3QgaW4gdGhlIHNldCBgYFswLTlfXWBgLCBhbmQKICAgIG5vdCBkZWZpbmVkIGFzIGFscGhhbnVtZXJpYyBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLiBJZiA6Y29uc3Q6YFVOSUNPREVgIGlzIHNldCwKLSAgIHRoaXMgd2lsbCBtYXRjaCBhbnl0aGluZyBvdGhlciB0aGFuIGBgWzAtOV9dYGAgYW5kIGNoYXJhY3RlcnMgbWFya2VkIGFzCi0gICBhbHBoYW51bWVyaWMgaW4gdGhlIFVuaWNvZGUgY2hhcmFjdGVyIHByb3BlcnRpZXMgZGF0YWJhc2UuCisgICB0aGlzIHdpbGwgbWF0Y2ggYW55dGhpbmcgb3RoZXIgdGhhbiBgYFswLTlfXWBgIHBsdXMgY2hhcmFjdGVycyBjbGFzc2llZCBhcworICAgbm90IGFscGhhbnVtZXJpYyBpbiB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgcHJvcGVydGllcyBkYXRhYmFzZS4KIAogYGBcWmBgCiAgICBNYXRjaGVzIG9ubHkgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgogCitJZiBib3RoIDpjb25zdDpgTE9DQUxFYCBhbmQgOmNvbnN0OmBVTklDT0RFYCBmbGFncyBhcmUgaW5jbHVkZWQgZm9yIGEKK3BhcnRpY3VsYXIgc2VxdWVuY2UsIHRoZW4gOmNvbnN0OmBMT0NBTEVgIGZsYWcgdGFrZXMgZWZmZWN0IGZpcnN0IGZvbGxvd2VkIGJ5Cit0aGUgOmNvbnN0OmBVTklDT0RFYC4KKwogTW9zdCBvZiB0aGUgc3RhbmRhcmQgZXNjYXBlcyBzdXBwb3J0ZWQgYnkgUHl0aG9uIHN0cmluZyBsaXRlcmFscyBhcmUgYWxzbwogYWNjZXB0ZWQgYnkgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXJzZXI6OgogCkBAIC0zODksMzcgKzQxMCwxNSBAQAogICAgXHIgICAgICBcdCAgICAgIFx2ICAgICAgXHgKICAgIFxcCiAKKyhOb3RlIHRoYXQgYGBcYmBgIGlzIHVzZWQgdG8gcmVwcmVzZW50IHdvcmQgYm91bmRhcmllcywgYW5kIG1lYW5zICJiYWNrc3BhY2UiCitvbmx5IGluc2lkZSBjaGFyYWN0ZXIgY2xhc3Nlcy4pCisKIE9jdGFsIGVzY2FwZXMgYXJlIGluY2x1ZGVkIGluIGEgbGltaXRlZCBmb3JtOiBJZiB0aGUgZmlyc3QgZGlnaXQgaXMgYSAwLCBvciBpZgogdGhlcmUgYXJlIHRocmVlIG9jdGFsIGRpZ2l0cywgaXQgaXMgY29uc2lkZXJlZCBhbiBvY3RhbCBlc2NhcGUuIE90aGVyd2lzZSwgaXQgaXMKIGEgZ3JvdXAgcmVmZXJlbmNlLiAgQXMgZm9yIHN0cmluZyBsaXRlcmFscywgb2N0YWwgZXNjYXBlcyBhcmUgYWx3YXlzIGF0IG1vc3QKIHRocmVlIGRpZ2l0cyBpbiBsZW5ndGguCiAKIAotLi4gX21hdGNoaW5nLXNlYXJjaGluZzoKLQotTWF0Y2hpbmcgdnMgU2VhcmNoaW5nCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLi4gc2VjdGlvbmF1dGhvcjo6IEZyZWQgTC4gRHJha2UsIEpyLiA8ZmRyYWtlQGFjbS5vcmc+Ci0KLQotUHl0aG9uIG9mZmVycyB0d28gZGlmZmVyZW50IHByaW1pdGl2ZSBvcGVyYXRpb25zIGJhc2VkIG9uIHJlZ3VsYXIgZXhwcmVzc2lvbnM6Ci0qKm1hdGNoKiogY2hlY2tzIGZvciBhIG1hdGNoIG9ubHkgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLCB3aGlsZQotKipzZWFyY2gqKiBjaGVja3MgZm9yIGEgbWF0Y2ggYW55d2hlcmUgaW4gdGhlIHN0cmluZyAodGhpcyBpcyB3aGF0IFBlcmwgZG9lcwotYnkgZGVmYXVsdCkuCi0KLU5vdGUgdGhhdCBtYXRjaCBtYXkgZGlmZmVyIGZyb20gc2VhcmNoIGV2ZW4gd2hlbiB1c2luZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbgotYmVnaW5uaW5nIHdpdGggYGAnXidgYDogYGAnXidgYCBtYXRjaGVzIG9ubHkgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcsIG9yIGluCi06Y29uc3Q6YE1VTFRJTElORWAgbW9kZSBhbHNvIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBhIG5ld2xpbmUuICBUaGUgIm1hdGNoIgotb3BlcmF0aW9uIHN1Y2NlZWRzIG9ubHkgaWYgdGhlIHBhdHRlcm4gbWF0Y2hlcyBhdCB0aGUgc3RhcnQgb2YgdGhlIHN0cmluZwotcmVnYXJkbGVzcyBvZiBtb2RlLCBvciBhdCB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZ2l2ZW4gYnkgdGhlIG9wdGlvbmFsICpwb3MqCi1hcmd1bWVudCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYSBuZXdsaW5lIHByZWNlZGVzIGl0LgotCi0gICA+Pj4gcmUubWF0Y2goImMiLCAiYWJjZGVmIikgICMgTm8gbWF0Y2gKLSAgID4+PiByZS5zZWFyY2goImMiLCAiYWJjZGVmIikgIyBNYXRjaAotICAgPF9zcmUuU1JFX01hdGNoIG9iamVjdCBhdCAuLi4+Ci0KLQogLi4gX2NvbnRlbnRzLW9mLW1vZHVsZS1yZToKIAogTW9kdWxlIENvbnRlbnRzCkBAIC00MzQsOCArNDMzLDggQEAKIC4uIGZ1bmN0aW9uOjogY29tcGlsZShwYXR0ZXJuLCBmbGFncz0wKQogCiAgICBDb21waWxlIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gaW50byBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3QsIHdoaWNoCi0gICBjYW4gYmUgdXNlZCBmb3IgbWF0Y2hpbmcgdXNpbmcgaXRzIDpmdW5jOmBtYXRjaGAgYW5kIDpmdW5jOmBzZWFyY2hgIG1ldGhvZHMsCi0gICBkZXNjcmliZWQgYmVsb3cuCisgICBjYW4gYmUgdXNlZCBmb3IgbWF0Y2hpbmcgdXNpbmcgaXRzIDpmdW5jOmB+UmVnZXhPYmplY3QubWF0Y2hgIGFuZAorICAgOmZ1bmM6YH5SZWdleE9iamVjdC5zZWFyY2hgIG1ldGhvZHMsIGRlc2NyaWJlZCBiZWxvdy4KIAogICAgVGhlIGV4cHJlc3Npb24ncyBiZWhhdmlvdXIgY2FuIGJlIG1vZGlmaWVkIGJ5IHNwZWNpZnlpbmcgYSAqZmxhZ3MqIHZhbHVlLgogICAgVmFsdWVzIGNhbiBiZSBhbnkgb2YgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMsIGNvbWJpbmVkIHVzaW5nIGJpdHdpc2UgT1IgKHRoZQpAQCAtNDYyLDYgKzQ2MSwxMSBAQAogICAgICAgYWJvdXQgY29tcGlsaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMuCiAKIAorLi4gZGF0YTo6IERFQlVHCisKKyAgIERpc3BsYXkgZGVidWcgaW5mb3JtYXRpb24gYWJvdXQgY29tcGlsZWQgZXhwcmVzc2lvbi4KKworCiAuLiBkYXRhOjogSQogICAgICAgICAgIElHTk9SRUNBU0UKIApAQCAtNTIzLDcgKzUyNyw3IEBACiAKIC4uIGZ1bmN0aW9uOjogc2VhcmNoKHBhdHRlcm4sIHN0cmluZywgZmxhZ3M9MCkKIAotICAgU2NhbiB0aHJvdWdoICpzdHJpbmcqIGxvb2tpbmcgZm9yIGEgbG9jYXRpb24gd2hlcmUgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgU2NhbiB0aHJvdWdoICpzdHJpbmcqIGxvb2tpbmcgZm9yIHRoZSBmaXJzdCBsb2NhdGlvbiB3aGVyZSB0aGUgcmVndWxhciBleHByZXNzaW9uCiAgICAqcGF0dGVybiogcHJvZHVjZXMgYSBtYXRjaCwgYW5kIHJldHVybiBhIGNvcnJlc3BvbmRpbmcgOmNsYXNzOmBNYXRjaE9iamVjdGAKICAgIGluc3RhbmNlLiBSZXR1cm4gYGBOb25lYGAgaWYgbm8gcG9zaXRpb24gaW4gdGhlIHN0cmluZyBtYXRjaGVzIHRoZSBwYXR0ZXJuOyBub3RlCiAgICB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IGZyb20gZmluZGluZyBhIHplcm8tbGVuZ3RoIG1hdGNoIGF0IHNvbWUgcG9pbnQgaW4gdGhlCkBAIC01MzcsMTAgKzU0MSwxMSBAQAogICAgUmV0dXJuIGBgTm9uZWBgIGlmIHRoZSBzdHJpbmcgZG9lcyBub3QgbWF0Y2ggdGhlIHBhdHRlcm47IG5vdGUgdGhhdCB0aGlzIGlzCiAgICBkaWZmZXJlbnQgZnJvbSBhIHplcm8tbGVuZ3RoIG1hdGNoLgogCi0gICAuLiBub3RlOjoKKyAgIE5vdGUgdGhhdCBldmVuIGluIDpjb25zdDpgTVVMVElMSU5FYCBtb2RlLCA6ZnVuYzpgcmUubWF0Y2hgIHdpbGwgb25seSBtYXRjaAorICAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nIGFuZCBub3QgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGxpbmUuCiAKLSAgICAgIElmIHlvdSB3YW50IHRvIGxvY2F0ZSBhIG1hdGNoIGFueXdoZXJlIGluICpzdHJpbmcqLCB1c2UgOmZ1bmM6YHNlYXJjaGAKLSAgICAgIGluc3RlYWQuCisgICBJZiB5b3Ugd2FudCB0byBsb2NhdGUgYSBtYXRjaCBhbnl3aGVyZSBpbiAqc3RyaW5nKiwgdXNlIDpmdW5jOmBzZWFyY2hgCisgICBpbnN0ZWFkIChzZWUgYWxzbyA6cmVmOmBzZWFyY2gtdnMtbWF0Y2hgKS4KIAogCiAuLiBmdW5jdGlvbjo6IHNwbGl0KHBhdHRlcm4sIHN0cmluZywgbWF4c3BsaXQ9MCwgZmxhZ3M9MCkKQEAgLTY0OSw3ICs2NTQsOCBAQAogICAgd2hlbiBub3QgYWRqYWNlbnQgdG8gYSBwcmV2aW91cyBtYXRjaCwgc28gYGBzdWIoJ3gqJywgJy0nLCAnYWJjJylgYCByZXR1cm5zCiAgICBgYCctYS1iLWMtJ2BgLgogCi0gICBJbiBhZGRpdGlvbiB0byBjaGFyYWN0ZXIgZXNjYXBlcyBhbmQgYmFja3JlZmVyZW5jZXMgYXMgZGVzY3JpYmVkIGFib3ZlLAorICAgSW4gc3RyaW5nLXR5cGUgKnJlcGwqIGFyZ3VtZW50cywgaW4gYWRkaXRpb24gdG8gdGhlIGNoYXJhY3RlciBlc2NhcGVzIGFuZAorICAgYmFja3JlZmVyZW5jZXMgZGVzY3JpYmVkIGFib3ZlLAogICAgYGBcZzxuYW1lPmBgIHdpbGwgdXNlIHRoZSBzdWJzdHJpbmcgbWF0Y2hlZCBieSB0aGUgZ3JvdXAgbmFtZWQgYGBuYW1lYGAsIGFzCiAgICBkZWZpbmVkIGJ5IHRoZSBgYCg/UDxuYW1lPi4uLilgYCBzeW50YXguIGBgXGc8bnVtYmVyPmBgIHVzZXMgdGhlIGNvcnJlc3BvbmRpbmcKICAgIGdyb3VwIG51bWJlcjsgYGBcZzwyPmBgIGlzIHRoZXJlZm9yZSBlcXVpdmFsZW50IHRvIGBgXDJgYCwgYnV0IGlzbid0IGFtYmlndW91cwpAQCAtNzM2LDE2ICs3NDIsMTQgQEAKICAgICAgIFRoZSBvcHRpb25hbCAqcG9zKiBhbmQgKmVuZHBvcyogcGFyYW1ldGVycyBoYXZlIHRoZSBzYW1lIG1lYW5pbmcgYXMgZm9yIHRoZQogICAgICAgOm1ldGg6YH5SZWdleE9iamVjdC5zZWFyY2hgIG1ldGhvZC4KIAotICAgICAgLi4gbm90ZTo6Ci0KLSAgICAgICAgIElmIHlvdSB3YW50IHRvIGxvY2F0ZSBhIG1hdGNoIGFueXdoZXJlIGluICpzdHJpbmcqLCB1c2UKLSAgICAgICAgIDptZXRoOmB+UmVnZXhPYmplY3Quc2VhcmNoYCBpbnN0ZWFkLgotCiAgICAgICA+Pj4gcGF0dGVybiA9IHJlLmNvbXBpbGUoIm8iKQogICAgICAgPj4+IHBhdHRlcm4ubWF0Y2goImRvZyIpICAgICAgIyBObyBtYXRjaCBhcyAibyIgaXMgbm90IGF0IHRoZSBzdGFydCBvZiAiZG9nIi4KICAgICAgID4+PiBwYXR0ZXJuLm1hdGNoKCJkb2ciLCAxKSAgICMgTWF0Y2ggYXMgIm8iIGlzIHRoZSAybmQgY2hhcmFjdGVyIG9mICJkb2ciLgogICAgICAgPF9zcmUuU1JFX01hdGNoIG9iamVjdCBhdCAuLi4+CiAKKyAgICAgIElmIHlvdSB3YW50IHRvIGxvY2F0ZSBhIG1hdGNoIGFueXdoZXJlIGluICpzdHJpbmcqLCB1c2UKKyAgICAgIDptZXRoOmB+UmVnZXhPYmplY3Quc2VhcmNoYCBpbnN0ZWFkIChzZWUgYWxzbyA6cmVmOmBzZWFyY2gtdnMtbWF0Y2hgKS4KKwogCiAgICAuLiBtZXRob2Q6OiBSZWdleE9iamVjdC5zcGxpdChzdHJpbmcsIG1heHNwbGl0PTApCiAKQEAgLTc3OCw4ICs3ODIsOCBAQAogCiAgICAuLiBhdHRyaWJ1dGU6OiBSZWdleE9iamVjdC5mbGFncwogCi0gICAgICBUaGUgZmxhZ3MgYXJndW1lbnQgdXNlZCB3aGVuIHRoZSBSRSBvYmplY3Qgd2FzIGNvbXBpbGVkLCBvciBgYDBgYCBpZiBubyBmbGFncwotICAgICAgd2VyZSBwcm92aWRlZC4KKyAgICAgIFRoZSByZWdleCBtYXRjaGluZyBmbGFncy4gIFRoaXMgaXMgYSBjb21iaW5hdGlvbiBvZiB0aGUgZmxhZ3MgZ2l2ZW4gdG8KKyAgICAgIDpmdW5jOmAuY29tcGlsZWAgYW5kIGFueSBgYCg/Li4uKWBgIGlubGluZSBmbGFncyBpbiB0aGUgcGF0dGVybi4KIAogCiAgICAuLiBhdHRyaWJ1dGU6OiBSZWdleE9iamVjdC5ncm91cHMKQEAgLTgwNiw5ICs4MTAsMTYgQEAKIAogLi4gY2xhc3M6OiBNYXRjaE9iamVjdAogCi0gICBNYXRjaCBPYmplY3RzIGFsd2F5cyBoYXZlIGEgYm9vbGVhbiB2YWx1ZSBvZiA6Y29uc3Q6YFRydWVgLCBzbyB0aGF0IHlvdSBjYW4gdGVzdAotICAgd2hldGhlciBlLmcuIDpmdW5jOmBtYXRjaGAgcmVzdWx0ZWQgaW4gYSBtYXRjaCB3aXRoIGEgc2ltcGxlIGlmIHN0YXRlbWVudC4gIFRoZXkKLSAgIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBtZXRob2RzIGFuZCBhdHRyaWJ1dGVzOgorICAgTWF0Y2ggb2JqZWN0cyBhbHdheXMgaGF2ZSBhIGJvb2xlYW4gdmFsdWUgb2YgYGBUcnVlYGAuCisgICBTaW5jZSA6bWV0aDpgfnJlZ2V4Lm1hdGNoYCBhbmQgOm1ldGg6YH5yZWdleC5zZWFyY2hgIHJldHVybiBgYE5vbmVgYAorICAgd2hlbiB0aGVyZSBpcyBubyBtYXRjaCwgeW91IGNhbiB0ZXN0IHdoZXRoZXIgdGhlcmUgd2FzIGEgbWF0Y2ggd2l0aCBhIHNpbXBsZQorICAgYGBpZmBgIHN0YXRlbWVudDo6CisKKyAgICAgIG1hdGNoID0gcmUuc2VhcmNoKHBhdHRlcm4sIHN0cmluZykKKyAgICAgIGlmIG1hdGNoOgorICAgICAgICAgIHByb2Nlc3MobWF0Y2gpCisKKyAgIE1hdGNoIG9iamVjdHMgc3VwcG9ydCB0aGUgZm9sbG93aW5nIG1ldGhvZHMgYW5kIGF0dHJpYnV0ZXM6CiAKIAogICAgLi4gbWV0aG9kOjogTWF0Y2hPYmplY3QuZXhwYW5kKHRlbXBsYXRlKQpAQCAtMTAwMCwxNiArMTAxMSwxNiBAQAogCiBTdXBwb3NlIHlvdSBhcmUgd3JpdGluZyBhIHBva2VyIHByb2dyYW0gd2hlcmUgYSBwbGF5ZXIncyBoYW5kIGlzIHJlcHJlc2VudGVkIGFzCiBhIDUtY2hhcmFjdGVyIHN0cmluZyB3aXRoIGVhY2ggY2hhcmFjdGVyIHJlcHJlc2VudGluZyBhIGNhcmQsICJhIiBmb3IgYWNlLCAiayIKLWZvciBraW5nLCAicSIgZm9yIHF1ZWVuLCBqIGZvciBqYWNrLCAiMCIgZm9yIDEwLCBhbmQgIjEiIHRocm91Z2ggIjkiCitmb3Iga2luZywgInEiIGZvciBxdWVlbiwgImoiIGZvciBqYWNrLCAidCIgZm9yIDEwLCBhbmQgIjIiIHRocm91Z2ggIjkiCiByZXByZXNlbnRpbmcgdGhlIGNhcmQgd2l0aCB0aGF0IHZhbHVlLgogCiBUbyBzZWUgaWYgYSBnaXZlbiBzdHJpbmcgaXMgYSB2YWxpZCBoYW5kLCBvbmUgY291bGQgZG8gdGhlIGZvbGxvd2luZzoKIAotICAgPj4+IHZhbGlkID0gcmUuY29tcGlsZShyIlswLTlha3FqXXs1fSQiKQotICAgPj4+IGRpc3BsYXltYXRjaCh2YWxpZC5tYXRjaCgiYWswNXEiKSkgICMgVmFsaWQuCi0gICAiPE1hdGNoOiAnYWswNXEnLCBncm91cHM9KCk+IgotICAgPj4+IGRpc3BsYXltYXRjaCh2YWxpZC5tYXRjaCgiYWswNWUiKSkgICMgSW52YWxpZC4KLSAgID4+PiBkaXNwbGF5bWF0Y2godmFsaWQubWF0Y2goImFrMCIpKSAgICAjIEludmFsaWQuCisgICA+Pj4gdmFsaWQgPSByZS5jb21waWxlKHIiXlthMi05dGpxa117NX0kIikKKyAgID4+PiBkaXNwbGF5bWF0Y2godmFsaWQubWF0Y2goImFrdDVxIikpICAjIFZhbGlkLgorICAgIjxNYXRjaDogJ2FrdDVxJywgZ3JvdXBzPSgpPiIKKyAgID4+PiBkaXNwbGF5bWF0Y2godmFsaWQubWF0Y2goImFrdDVlIikpICAjIEludmFsaWQuCisgICA+Pj4gZGlzcGxheW1hdGNoKHZhbGlkLm1hdGNoKCJha3QiKSkgICAgIyBJbnZhbGlkLgogICAgPj4+IGRpc3BsYXltYXRjaCh2YWxpZC5tYXRjaCgiNzI3YWsiKSkgICMgVmFsaWQuCiAgICAiPE1hdGNoOiAnNzI3YWsnLCBncm91cHM9KCk+IgogCkBAIC0xMDQ4LDE0ICsxMDU5LDE0IEBACiAKIC4uIGluZGV4Ojogc2luZ2xlOiBzY2FuZigpCiAKLVB5dGhvbiBkb2VzIG5vdCBjdXJyZW50bHkgaGF2ZSBhbiBlcXVpdmFsZW50IHRvIDpjZnVuYzpgc2NhbmZgLiAgUmVndWxhcgorUHl0aG9uIGRvZXMgbm90IGN1cnJlbnRseSBoYXZlIGFuIGVxdWl2YWxlbnQgdG8gOmM6ZnVuYzpgc2NhbmZgLiAgUmVndWxhcgogZXhwcmVzc2lvbnMgYXJlIGdlbmVyYWxseSBtb3JlIHBvd2VyZnVsLCB0aG91Z2ggYWxzbyBtb3JlIHZlcmJvc2UsIHRoYW4KLTpjZnVuYzpgc2NhbmZgIGZvcm1hdCBzdHJpbmdzLiAgVGhlIHRhYmxlIGJlbG93IG9mZmVycyBzb21lIG1vcmUtb3ItbGVzcwotZXF1aXZhbGVudCBtYXBwaW5ncyBiZXR3ZWVuIDpjZnVuYzpgc2NhbmZgIGZvcm1hdCB0b2tlbnMgYW5kIHJlZ3VsYXIKKzpjOmZ1bmM6YHNjYW5mYCBmb3JtYXQgc3RyaW5ncy4gIFRoZSB0YWJsZSBiZWxvdyBvZmZlcnMgc29tZSBtb3JlLW9yLWxlc3MKK2VxdWl2YWxlbnQgbWFwcGluZ3MgYmV0d2VlbiA6YzpmdW5jOmBzY2FuZmAgZm9ybWF0IHRva2VucyBhbmQgcmVndWxhcgogZXhwcmVzc2lvbnMuCiAKICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IDpjZnVuYzpgc2NhbmZgIFRva2VuICAgICAgICAgICB8IFJlZ3VsYXIgRXhwcmVzc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCA6YzpmdW5jOmBzY2FuZmAgVG9rZW4gICAgICAgICAgfCBSZWd1bGFyIEV4cHJlc3Npb24gICAgICAgICAgICAgICAgICAgICAgICAgIHwKICs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCiB8IGBgJWNgYCAgICAgICAgICAgICAgICAgICAgICAgICB8IGBgLmBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKQEAgLTEwNjcsMjAgKzEwNzgsMjAgQEAKICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiB8IGBgJWlgYCAgICAgICAgICAgICAgICAgICAgICAgICB8IGBgWy0rXT8oMFt4WF1bXGRBLUZhLWZdK3wwWzAtN10qfFxkKylgYCAgICAgfAogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgYGAlb2BgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGAwWzAtN10qYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IGBgJW9gYCAgICAgICAgICAgICAgICAgICAgICAgICB8IGBgWy0rXT9bMC03XStgYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKIHwgYGAlc2BgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGBcUytgYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogfCBgYCV1YGAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgYFxkK2BgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IGBgJXhgYCwgYGAlWGBgICAgICAgICAgICAgICAgICB8IGBgMFt4WF1bXGRBLUZhLWZdK2BgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCBgYCV4YGAsIGBgJVhgYCAgICAgICAgICAgICAgICAgfCBgYFstK10/KDBbeFhdKT9bXGRBLUZhLWZdK2BgICAgICAgICAgICAgICAgIHwKICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAKIFRvIGV4dHJhY3QgdGhlIGZpbGVuYW1lIGFuZCBudW1iZXJzIGZyb20gYSBzdHJpbmcgbGlrZSA6OgogCiAgICAvdXNyL3NiaW4vc2VuZG1haWwgLSAwIGVycm9ycywgNCB3YXJuaW5ncwogCi15b3Ugd291bGQgdXNlIGEgOmNmdW5jOmBzY2FuZmAgZm9ybWF0IGxpa2UgOjoKK3lvdSB3b3VsZCB1c2UgYSA6YzpmdW5jOmBzY2FuZmAgZm9ybWF0IGxpa2UgOjoKIAogICAgJXMgLSAlZCBlcnJvcnMsICVkIHdhcm5pbmdzCiAKQEAgLTEwODksNTkgKzExMDAsMzkgQEAKICAgIChcUyspIC0gKFxkKykgZXJyb3JzLCAoXGQrKSB3YXJuaW5ncwogCiAKLUF2b2lkaW5nIHJlY3Vyc2lvbgotXl5eXl5eXl5eXl5eXl5eXl5eCi0KLUlmIHlvdSBjcmVhdGUgcmVndWxhciBleHByZXNzaW9ucyB0aGF0IHJlcXVpcmUgdGhlIGVuZ2luZSB0byBwZXJmb3JtIGEgbG90IG9mCi1yZWN1cnNpb24sIHlvdSBtYXkgZW5jb3VudGVyIGEgOmV4YzpgUnVudGltZUVycm9yYCBleGNlcHRpb24gd2l0aCB0aGUgbWVzc2FnZQotYGBtYXhpbXVtIHJlY3Vyc2lvbiBsaW1pdGBgIGV4Y2VlZGVkLiBGb3IgZXhhbXBsZSwgOjoKLQotICAgPj4+IHMgPSAnQmVnaW4gJyArIDEwMDAqJ2EgdmVyeSBsb25nIHN0cmluZyAnICsgJ2VuZCcKLSAgID4+PiByZS5tYXRjaCgnQmVnaW4gKFx3fCApKj8gZW5kJywgcykuZW5kKCkKLSAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwotICAgICBGaWxlICIvdXNyL2xvY2FsL2xpYi9weXRob24yLjUvcmUucHkiLCBsaW5lIDEzMiwgaW4gbWF0Y2gKLSAgICAgICByZXR1cm4gX2NvbXBpbGUocGF0dGVybiwgZmxhZ3MpLm1hdGNoKHN0cmluZykKLSAgIFJ1bnRpbWVFcnJvcjogbWF4aW11bSByZWN1cnNpb24gbGltaXQgZXhjZWVkZWQKLQotWW91IGNhbiBvZnRlbiByZXN0cnVjdHVyZSB5b3VyIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBhdm9pZCByZWN1cnNpb24uCi0KLVN0YXJ0aW5nIHdpdGggUHl0aG9uIDIuMywgc2ltcGxlIHVzZXMgb2YgdGhlIGBgKj9gYCBwYXR0ZXJuIGFyZSBzcGVjaWFsLWNhc2VkIHRvCi1hdm9pZCByZWN1cnNpb24uICBUaHVzLCB0aGUgYWJvdmUgcmVndWxhciBleHByZXNzaW9uIGNhbiBhdm9pZCByZWN1cnNpb24gYnkKLWJlaW5nIHJlY2FzdCBhcyBgYEJlZ2luIFthLXpBLVowLTlfIF0qP2VuZGBgLiAgQXMgYSBmdXJ0aGVyIGJlbmVmaXQsIHN1Y2gKLXJlZ3VsYXIgZXhwcmVzc2lvbnMgd2lsbCBydW4gZmFzdGVyIHRoYW4gdGhlaXIgcmVjdXJzaXZlIGVxdWl2YWxlbnRzLgotCisuLiBfc2VhcmNoLXZzLW1hdGNoOgogCiBzZWFyY2goKSB2cy4gbWF0Y2goKQogXl5eXl5eXl5eXl5eXl5eXl5eXl4KIAotSW4gYSBudXRzaGVsbCwgOmZ1bmM6YG1hdGNoYCBvbmx5IGF0dGVtcHRzIHRvIG1hdGNoIGEgcGF0dGVybiBhdCB0aGUgYmVnaW5uaW5nCi1vZiBhIHN0cmluZyB3aGVyZSA6ZnVuYzpgc2VhcmNoYCB3aWxsIG1hdGNoIGEgcGF0dGVybiBhbnl3aGVyZSBpbiBhIHN0cmluZy4KLUZvciBleGFtcGxlOgorLi4gc2VjdGlvbmF1dGhvcjo6IEZyZWQgTC4gRHJha2UsIEpyLiA8ZmRyYWtlQGFjbS5vcmc+CiAKLSAgID4+PiByZS5tYXRjaCgibyIsICJkb2ciKSAgIyBObyBtYXRjaCBhcyAibyIgaXMgbm90IHRoZSBmaXJzdCBsZXR0ZXIgb2YgImRvZyIuCi0gICA+Pj4gcmUuc2VhcmNoKCJvIiwgImRvZyIpICMgTWF0Y2ggYXMgc2VhcmNoKCkgbG9va3MgZXZlcnl3aGVyZSBpbiB0aGUgc3RyaW5nLgorUHl0aG9uIG9mZmVycyB0d28gZGlmZmVyZW50IHByaW1pdGl2ZSBvcGVyYXRpb25zIGJhc2VkIG9uIHJlZ3VsYXIgZXhwcmVzc2lvbnM6Cis6ZnVuYzpgcmUubWF0Y2hgIGNoZWNrcyBmb3IgYSBtYXRjaCBvbmx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZywgd2hpbGUKKzpmdW5jOmByZS5zZWFyY2hgIGNoZWNrcyBmb3IgYSBtYXRjaCBhbnl3aGVyZSBpbiB0aGUgc3RyaW5nICh0aGlzIGlzIHdoYXQgUGVybAorZG9lcyBieSBkZWZhdWx0KS4KKworRm9yIGV4YW1wbGU6OgorCisgICA+Pj4gcmUubWF0Y2goImMiLCAiYWJjZGVmIikgICMgTm8gbWF0Y2gKKyAgID4+PiByZS5zZWFyY2goImMiLCAiYWJjZGVmIikgIyBNYXRjaAogICAgPF9zcmUuU1JFX01hdGNoIG9iamVjdCBhdCAuLi4+CiAKLS4uIG5vdGU6OgorUmVndWxhciBleHByZXNzaW9ucyBiZWdpbm5pbmcgd2l0aCBgYCdeJ2BgIGNhbiBiZSB1c2VkIHdpdGggOmZ1bmM6YHNlYXJjaGAgdG8KK3Jlc3RyaWN0IHRoZSBtYXRjaCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmc6OgogCi0gICBUaGUgZm9sbG93aW5nIGFwcGxpZXMgb25seSB0byByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0cyBsaWtlIHRob3NlIGNyZWF0ZWQKLSAgIHdpdGggYGByZS5jb21waWxlKCJwYXR0ZXJuIilgYCwgbm90IHRoZSBwcmltaXRpdmVzIGBgcmUubWF0Y2gocGF0dGVybiwKLSAgIHN0cmluZylgYCBvciBgYHJlLnNlYXJjaChwYXR0ZXJuLCBzdHJpbmcpYGAuCi0KLTpmdW5jOmBtYXRjaGAgaGFzIGFuIG9wdGlvbmFsIHNlY29uZCBwYXJhbWV0ZXIgdGhhdCBnaXZlcyBhbiBpbmRleCBpbiB0aGUgc3RyaW5nCi13aGVyZSB0aGUgc2VhcmNoIGlzIHRvIHN0YXJ0OjoKLQotICAgPj4+IHBhdHRlcm4gPSByZS5jb21waWxlKCJvIikKLSAgID4+PiBwYXR0ZXJuLm1hdGNoKCJkb2ciKSAgICAgICMgTm8gbWF0Y2ggYXMgIm8iIGlzIG5vdCBhdCB0aGUgc3RhcnQgb2YgImRvZy4iCi0KLSAgICMgRXF1aXZhbGVudCB0byB0aGUgYWJvdmUgZXhwcmVzc2lvbiBhcyAwIGlzIHRoZSBkZWZhdWx0IHN0YXJ0aW5nIGluZGV4OgotICAgPj4+IHBhdHRlcm4ubWF0Y2goImRvZyIsIDApCi0KLSAgICMgTWF0Y2ggYXMgIm8iIGlzIHRoZSAybmQgY2hhcmFjdGVyIG9mICJkb2ciIChpbmRleCAwIGlzIHRoZSBmaXJzdCk6Ci0gICA+Pj4gcGF0dGVybi5tYXRjaCgiZG9nIiwgMSkKKyAgID4+PiByZS5tYXRjaCgiYyIsICJhYmNkZWYiKSAgIyBObyBtYXRjaAorICAgPj4+IHJlLnNlYXJjaCgiXmMiLCAiYWJjZGVmIikgIyBObyBtYXRjaAorICAgPj4+IHJlLnNlYXJjaCgiXmEiLCAiYWJjZGVmIikgICMgTWF0Y2gKICAgIDxfc3JlLlNSRV9NYXRjaCBvYmplY3QgYXQgLi4uPgotICAgPj4+IHBhdHRlcm4ubWF0Y2goImRvZyIsIDIpICAgIyBObyBtYXRjaCBhcyAibyIgaXMgbm90IHRoZSAzcmQgY2hhcmFjdGVyIG9mICJkb2cuIgorCitOb3RlIGhvd2V2ZXIgdGhhdCBpbiA6Y29uc3Q6YE1VTFRJTElORWAgbW9kZSA6ZnVuYzpgbWF0Y2hgIG9ubHkgbWF0Y2hlcyBhdCB0aGUKK2JlZ2lubmluZyBvZiB0aGUgc3RyaW5nLCB3aGVyZWFzIHVzaW5nIDpmdW5jOmBzZWFyY2hgIHdpdGggYSByZWd1bGFyIGV4cHJlc3Npb24KK2JlZ2lubmluZyB3aXRoIGBgJ14nYGAgd2lsbCBtYXRjaCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZS4KKworICAgPj4+IHJlLm1hdGNoKCdYJywgJ0FcbkJcblgnLCByZS5NVUxUSUxJTkUpICAjIE5vIG1hdGNoCisgICA+Pj4gcmUuc2VhcmNoKCdeWCcsICdBXG5CXG5YJywgcmUuTVVMVElMSU5FKSAgIyBNYXRjaAorICAgPF9zcmUuU1JFX01hdGNoIG9iamVjdCBhdCAuLi4+CiAKIAogTWFraW5nIGEgUGhvbmVib29rCkBAIC0xMTU1LDcgKzExNDYsNyBAQAogRmlyc3QsIGhlcmUgaXMgdGhlIGlucHV0LiAgTm9ybWFsbHkgaXQgbWF5IGNvbWUgZnJvbSBhIGZpbGUsIGhlcmUgd2UgYXJlIHVzaW5nCiB0cmlwbGUtcXVvdGVkIHN0cmluZyBzeW50YXg6CiAKLSAgID4+PiBpbnB1dCA9ICIiIlJvc3MgTWNGbHVmZjogODM0LjM0NS4xMjU0IDE1NSBFbG0gU3RyZWV0CisgICA+Pj4gdGV4dCA9ICIiIlJvc3MgTWNGbHVmZjogODM0LjM0NS4xMjU0IDE1NSBFbG0gU3RyZWV0CiAgICAuLi4KICAgIC4uLiBSb25hbGQgSGVhdGhtb3JlOiA4OTIuMzQ1LjM0MjggNDM2IEZpbmxleSBBdmVudWUKICAgIC4uLiBGcmFuayBCdXJnZXI6IDkyNS41NDEuNzYyNSA2NjIgU291dGggRG9nd29vZCBXYXkKQEAgLTExNjksNyArMTE2MCw3IEBACiAuLiBkb2N0ZXN0OjoKICAgIDpvcHRpb25zOiArTk9STUFMSVpFX1dISVRFU1BBQ0UKIAotICAgPj4+IGVudHJpZXMgPSByZS5zcGxpdCgiXG4rIiwgaW5wdXQpCisgICA+Pj4gZW50cmllcyA9IHJlLnNwbGl0KCJcbisiLCB0ZXh0KQogICAgPj4+IGVudHJpZXMKICAgIFsnUm9zcyBNY0ZsdWZmOiA4MzQuMzQ1LjEyNTQgMTU1IEVsbSBTdHJlZXQnLAogICAgJ1JvbmFsZCBIZWF0aG1vcmU6IDg5Mi4zNDUuMzQyOCA0MzYgRmlubGV5IEF2ZW51ZScsCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9yZXByLnJzdCBiL0RvYy9saWJyYXJ5L3JlcHIucnN0CmluZGV4IDExZTZhZTIuLmI2MDQxODYgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3JlcHIucnN0CisrKyBiL0RvYy9saWJyYXJ5L3JlcHIucnN0CkBAIC02LDkgKzYsOSBAQAogLi4gc2VjdGlvbmF1dGhvcjo6IEZyZWQgTC4gRHJha2UsIEpyLiA8ZmRyYWtlQGFjbS5vcmc+CiAKIC4uIG5vdGU6OgotICAgVGhlIDptb2Q6YHJlcHJgIG1vZHVsZSBoYXMgYmVlbiByZW5hbWVkIHRvIDptb2Q6YHJlcHJsaWJgIGluIFB5dGhvbiAzLjAuICBUaGUKKyAgIFRoZSA6bW9kOmByZXByYCBtb2R1bGUgaGFzIGJlZW4gcmVuYW1lZCB0byA6bW9kOmByZXBybGliYCBpbiBQeXRob24gMy4gIFRoZQogICAgOnRlcm06YDJ0bzNgIHRvb2wgd2lsbCBhdXRvbWF0aWNhbGx5IGFkYXB0IGltcG9ydHMgd2hlbiBjb252ZXJ0aW5nIHlvdXIKLSAgIHNvdXJjZXMgdG8gMy4wLgorICAgc291cmNlcyB0byBQeXRob24gMy4KIAogKipTb3VyY2UgY29kZToqKiA6c291cmNlOmBMaWIvcmVwci5weWAKIApAQCAtMjQsOCArMjQsOSBAQAogLi4gY2xhc3M6OiBSZXByKCkKIAogICAgQ2xhc3Mgd2hpY2ggcHJvdmlkZXMgZm9ybWF0dGluZyBzZXJ2aWNlcyB1c2VmdWwgaW4gaW1wbGVtZW50aW5nIGZ1bmN0aW9ucwotICAgc2ltaWxhciB0byB0aGUgYnVpbHQtaW4gOmZ1bmM6YHJlcHJgOyBzaXplIGxpbWl0cyBmb3IgIGRpZmZlcmVudCBvYmplY3QgdHlwZXMKLSAgIGFyZSBhZGRlZCB0byBhdm9pZCB0aGUgZ2VuZXJhdGlvbiBvZiByZXByZXNlbnRhdGlvbnMgd2hpY2ggYXJlIGV4Y2Vzc2l2ZWx5IGxvbmcuCisgICBzaW1pbGFyIHRvIHRoZSBidWlsdC1pbiA6cmVmOmByZXByKCkgPGZ1bmMtcmVwcj5gOyBzaXplIGxpbWl0cyBmb3IgZGlmZmVyZW50CisgICBvYmplY3QgdHlwZXMgYXJlIGFkZGVkIHRvIGF2b2lkIHRoZSBnZW5lcmF0aW9uIG9mIHJlcHJlc2VudGF0aW9ucyB3aGljaCBhcmUKKyAgIGV4Y2Vzc2l2ZWx5IGxvbmcuCiAKIAogLi4gZGF0YTo6IGFSZXByCkBAIC05Niw4ICs5Nyw4IEBACiAKIC4uIG1ldGhvZDo6IFJlcHIucmVwcihvYmopCiAKLSAgIFRoZSBlcXVpdmFsZW50IHRvIHRoZSBidWlsdC1pbiA6ZnVuYzpgcmVwcmAgdGhhdCB1c2VzIHRoZSBmb3JtYXR0aW5nIGltcG9zZWQgYnkKLSAgIHRoZSBpbnN0YW5jZS4KKyAgIFRoZSBlcXVpdmFsZW50IHRvIHRoZSBidWlsdC1pbiA6cmVmOmByZXByKCkgPGZ1bmMtcmVwcj5gIHRoYXQgdXNlcyB0aGUKKyAgIGZvcm1hdHRpbmcgaW1wb3NlZCBieSB0aGUgaW5zdGFuY2UuCiAKIAogLi4gbWV0aG9kOjogUmVwci5yZXByMShvYmosIGxldmVsKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvcmVzb3VyY2UucnN0IGIvRG9jL2xpYnJhcnkvcmVzb3VyY2UucnN0CmluZGV4IDgzNGRhY2UuLjdjYTQ1MzQgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3Jlc291cmNlLnJzdAorKysgYi9Eb2MvbGlicmFyeS9yZXNvdXJjZS5yc3QKQEAgLTQyLDYgKzQyLDExIEBACiB0aGlzIG1vZHVsZSBmb3IgdGhvc2UgcGxhdGZvcm1zLgogCiAKKy4uIGRhdGE6OiBSTElNX0lORklOSVRZCisKKyAgIENvbnN0YW50IHVzZWQgdG8gcmVwcmVzZW50IHRoZSB0aGUgbGltaXQgZm9yIGFuIHVubGltaXRlZCByZXNvdXJjZS4KKworCiAuLiBmdW5jdGlvbjo6IGdldHJsaW1pdChyZXNvdXJjZSkKIAogICAgUmV0dXJucyBhIHR1cGxlIGBgKHNvZnQsIGhhcmQpYGAgd2l0aCB0aGUgY3VycmVudCBzb2Z0IGFuZCBoYXJkIGxpbWl0cyBvZgpAQCAtNTMsMTIgKzU4LDIwIEBACiAKICAgIFNldHMgbmV3IGxpbWl0cyBvZiBjb25zdW1wdGlvbiBvZiAqcmVzb3VyY2UqLiBUaGUgKmxpbWl0cyogYXJndW1lbnQgbXVzdCBiZSBhCiAgICB0dXBsZSBgYChzb2Z0LCBoYXJkKWBgIG9mIHR3byBpbnRlZ2VycyBkZXNjcmliaW5nIHRoZSBuZXcgbGltaXRzLiBBIHZhbHVlIG9mCi0gICBgYC0xYGAgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbWF4aW11bSBwb3NzaWJsZSB1cHBlciBsaW1pdC4KKyAgIDpkYXRhOmB+cmVzb3VyY2UuUkxJTV9JTkZJTklUWWAgY2FuIGJlIHVzZWQgdG8gcmVxdWVzdCBhIGxpbWl0IHRoYXQgaXMKKyAgIHVubGltaXRlZC4KIAogICAgUmFpc2VzIDpleGM6YFZhbHVlRXJyb3JgIGlmIGFuIGludmFsaWQgcmVzb3VyY2UgaXMgc3BlY2lmaWVkLCBpZiB0aGUgbmV3IHNvZnQKLSAgIGxpbWl0IGV4Y2VlZHMgdGhlIGhhcmQgbGltaXQsIG9yIGlmIGEgcHJvY2VzcyB0cmllcyB0byByYWlzZSBpdHMgaGFyZCBsaW1pdAotICAgKHVubGVzcyB0aGUgcHJvY2VzcyBoYXMgYW4gZWZmZWN0aXZlIFVJRCBvZiBzdXBlci11c2VyKS4gIENhbiBhbHNvIHJhaXNlCi0gICA6ZXhjOmBlcnJvcmAgaWYgdGhlIHVuZGVybHlpbmcgc3lzdGVtIGNhbGwgZmFpbHMuCisgICBsaW1pdCBleGNlZWRzIHRoZSBoYXJkIGxpbWl0LCBvciBpZiBhIHByb2Nlc3MgdHJpZXMgdG8gcmFpc2UgaXRzIGhhcmQgbGltaXQuCisgICBTcGVjaWZ5aW5nIGEgbGltaXQgb2YgOmRhdGE6YH5yZXNvdXJjZS5STElNX0lORklOSVRZYCB3aGVuIHRoZSBoYXJkIG9yCisgICBzeXN0ZW0gbGltaXQgZm9yIHRoYXQgcmVzb3VyY2UgaXMgbm90IHVubGltaXRlZCB3aWxsIHJlc3VsdCBpbiBhCisgICA6ZXhjOmBWYWx1ZUVycm9yYC4gIEEgcHJvY2VzcyB3aXRoIHRoZSBlZmZlY3RpdmUgVUlEIG9mIHN1cGVyLXVzZXIgY2FuCisgICByZXF1ZXN0IGFueSB2YWxpZCBsaW1pdCB2YWx1ZSwgaW5jbHVkaW5nIHVubGltaXRlZCwgYnV0IDpleGM6YFZhbHVlRXJyb3JgCisgICB3aWxsIHN0aWxsIGJlIHJhaXNlZCBpZiB0aGUgcmVxdWVzdGVkIGxpbWl0IGV4Y2VlZHMgdGhlIHN5c3RlbSBpbXBvc2VkCisgICBsaW1pdC4KKworICAgYGBzZXRybGltaXRgYCBtYXkgYWxzbyByYWlzZSA6ZXhjOmBlcnJvcmAgaWYgdGhlIHVuZGVybHlpbmcgc3lzdGVtIGNhbGwKKyAgIGZhaWxzLgogCiBUaGVzZSBzeW1ib2xzIGRlZmluZSByZXNvdXJjZXMgd2hvc2UgY29uc3VtcHRpb24gY2FuIGJlIGNvbnRyb2xsZWQgdXNpbmcgdGhlCiA6ZnVuYzpgc2V0cmxpbWl0YCBhbmQgOmZ1bmM6YGdldHJsaW1pdGAgZnVuY3Rpb25zIGRlc2NyaWJlZCBiZWxvdy4gVGhlIHZhbHVlcyBvZgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvcmVzdHJpY3RlZC5yc3QgYi9Eb2MvbGlicmFyeS9yZXN0cmljdGVkLnJzdAppbmRleCAyODkwM2I3Li5hNDBkMWU5IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9yZXN0cmljdGVkLnJzdAorKysgYi9Eb2MvbGlicmFyeS9yZXN0cmljdGVkLnJzdApAQCAtMzEsNyArMzEsNyBAQAogbWlnaHQgYmUgZGVlbWVkICJzYWZlIiBmb3IgdW50cnVzdGVkIGNvZGUgdG8gcmVhZCBhbnkgZmlsZSB3aXRoaW4gYSBzcGVjaWZpZWQKIGRpcmVjdG9yeSwgYnV0IG5ldmVyIHRvIHdyaXRlIGEgZmlsZS4gIEluIHRoaXMgY2FzZSwgdGhlIHN1cGVydmlzb3IgbWF5IHJlZGVmaW5lCiB0aGUgYnVpbHQtaW4gOmZ1bmM6YG9wZW5gIGZ1bmN0aW9uIHNvIHRoYXQgaXQgcmFpc2VzIGFuIGV4Y2VwdGlvbiB3aGVuZXZlciB0aGUKLSptb2RlKiBwYXJhbWV0ZXIgaXMgYGAndydgYC4gIEl0IG1pZ2h0IGFsc28gcGVyZm9ybSBhIDpjZnVuYzpgY2hyb290YFwgLWxpa2UKKyptb2RlKiBwYXJhbWV0ZXIgaXMgYGAndydgYC4gIEl0IG1pZ2h0IGFsc28gcGVyZm9ybSBhIDpjOmZ1bmM6YGNocm9vdGBcIC1saWtlCiBvcGVyYXRpb24gb24gdGhlICpmaWxlbmFtZSogcGFyYW1ldGVyLCBzdWNoIHRoYXQgcm9vdCBpcyBhbHdheXMgcmVsYXRpdmUgdG8gc29tZQogc2FmZSAic2FuZGJveCIgYXJlYSBvZiB0aGUgZmlsZXN5c3RlbS4gIEluIHRoaXMgY2FzZSwgdGhlIHVudHJ1c3RlZCBjb2RlIHdvdWxkCiBzdGlsbCBzZWUgYW4gYnVpbHQtaW4gOmZ1bmM6YG9wZW5gIGZ1bmN0aW9uIGluIGl0cyBlbnZpcm9ubWVudCwgd2l0aCB0aGUgc2FtZQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvcmV4ZWMucnN0IGIvRG9jL2xpYnJhcnkvcmV4ZWMucnN0CmluZGV4IDJjZTYxMmEuLjEyZjZmYWEgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3JleGVjLnJzdAorKysgYi9Eb2MvbGlicmFyeS9yZXhlYy5yc3QKQEAgLTYsNyArNiw3IEBACiAgICA6ZGVwcmVjYXRlZDoKIAogLi4gZGVwcmVjYXRlZDo6IDIuNgotICAgVGhlIDptb2Q6YHJleGVjYCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4wLgorICAgVGhlIDptb2Q6YHJleGVjYCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4KIAogLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjMKICAgIERpc2FibGVkIG1vZHVsZS4KQEAgLTI3MCw3ICsyNzAsNyBAQAogICAgICAgICAgICBpZiBtb2RlIGluICgncicsICdyYicpOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBlbGlmIG1vZGUgaW4gKCd3JywgJ3diJywgJ2EnLCAnYWInKToKLSAgICAgICAgICAgICAgICMgY2hlY2sgZmlsZW5hbWUgOiBtdXN0IGJlZ2luIHdpdGggL3RtcC8KKyAgICAgICAgICAgICAgICMgY2hlY2sgZmlsZW5hbWU6IG11c3QgYmVnaW4gd2l0aCAvdG1wLwogICAgICAgICAgICAgICAgaWYgZmlsZVs6NV0hPScvdG1wLyc6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiY2FuJ3Qgd3JpdGUgb3V0c2lkZSAvdG1wIikKICAgICAgICAgICAgICAgIGVsaWYgKHN0cmluZy5maW5kKGZpbGUsICcvLi4vJykgPj0gMCBvcgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvcmZjODIyLnJzdCBiL0RvYy9saWJyYXJ5L3JmYzgyMi5yc3QKaW5kZXggNGM5MzhmNS4uMzNhYTg1MSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvcmZjODIyLnJzdAorKysgYi9Eb2MvbGlicmFyeS9yZmM4MjIucnN0CkBAIC0xMCw3ICsxMCw3IEBACiAuLiBkZXByZWNhdGVkOjogMi4zCiAgICBUaGUgOm1vZDpgZW1haWxgIHBhY2thZ2Ugc2hvdWxkIGJlIHVzZWQgaW4gcHJlZmVyZW5jZSB0byB0aGUgOm1vZDpgcmZjODIyYAogICAgbW9kdWxlLiAgVGhpcyBtb2R1bGUgaXMgcHJlc2VudCBvbmx5IHRvIG1haW50YWluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGFuZAotICAgaGFzIGJlZW4gcmVtb3ZlZCBpbiAzLjAuCisgICBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLgogCiBUaGlzIG1vZHVsZSBkZWZpbmVzIGEgY2xhc3MsIDpjbGFzczpgTWVzc2FnZWAsIHdoaWNoIHJlcHJlc2VudHMgYW4gImVtYWlsCiBtZXNzYWdlIiBhcyBkZWZpbmVkIGJ5IHRoZSBJbnRlcm5ldCBzdGFuZGFyZCA6cmZjOmAyODIyYC4gWyNdXyAgU3VjaCBtZXNzYWdlcwpAQCAtNDIsOCArNDIsOCBAQAogICAgZnJvbSBhIGJ1ZmZlcmVkIHN0cmVhbS4KIAogICAgVGhlIG9wdGlvbmFsICpzZWVrYWJsZSogYXJndW1lbnQgaXMgcHJvdmlkZWQgYXMgYSB3b3JrYXJvdW5kIGZvciBjZXJ0YWluIHN0ZGlvCi0gICBsaWJyYXJpZXMgaW4gd2hpY2ggOmNmdW5jOmB0ZWxsYCBkaXNjYXJkcyBidWZmZXJlZCBkYXRhIGJlZm9yZSBkaXNjb3ZlcmluZyB0aGF0Ci0gICB0aGUgOmNmdW5jOmBsc2Vla2Agc3lzdGVtIGNhbGwgZG9lc24ndCB3b3JrLiAgRm9yIG1heGltdW0gcG9ydGFiaWxpdHksIHlvdQorICAgbGlicmFyaWVzIGluIHdoaWNoIDpjOmZ1bmM6YHRlbGxgIGRpc2NhcmRzIGJ1ZmZlcmVkIGRhdGEgYmVmb3JlIGRpc2NvdmVyaW5nIHRoYXQKKyAgIHRoZSA6YzpmdW5jOmBsc2Vla2Agc3lzdGVtIGNhbGwgZG9lc24ndCB3b3JrLiAgRm9yIG1heGltdW0gcG9ydGFiaWxpdHksIHlvdQogICAgc2hvdWxkIHNldCB0aGUgc2Vla2FibGUgYXJndW1lbnQgdG8gemVybyB0byBwcmV2ZW50IHRoYXQgaW5pdGlhbCA6bWV0aDpgdGVsbGAKICAgIHdoZW4gcGFzc2luZyBpbiBhbiB1bnNlZWthYmxlIG9iamVjdCBzdWNoIGFzIGEgZmlsZSBvYmplY3QgY3JlYXRlZCBmcm9tIGEgc29ja2V0CiAgICBvYmplY3QuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9yb2JvdHBhcnNlci5yc3QgYi9Eb2MvbGlicmFyeS9yb2JvdHBhcnNlci5yc3QKaW5kZXggYmE3ZTU1Ny4uZDk1YjYyOSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvcm9ib3RwYXJzZXIucnN0CisrKyBiL0RvYy9saWJyYXJ5L3JvYm90cGFyc2VyLnJzdApAQCAtMTYsOSArMTYsOSBAQAogCiAuLiBub3RlOjoKICAgIFRoZSA6bW9kOmByb2JvdHBhcnNlcmAgbW9kdWxlIGhhcyBiZWVuIHJlbmFtZWQgOm1vZDpgdXJsbGliLnJvYm90cGFyc2VyYCBpbgotICAgUHl0aG9uIDMuMC4KKyAgIFB5dGhvbiAzLgogICAgVGhlIDp0ZXJtOmAydG8zYCB0b29sIHdpbGwgYXV0b21hdGljYWxseSBhZGFwdCBpbXBvcnRzIHdoZW4gY29udmVydGluZwotICAgeW91ciBzb3VyY2VzIHRvIDMuMC4KKyAgIHlvdXIgc291cmNlcyB0byBQeXRob24gMy4KIAogVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBzaW5nbGUgY2xhc3MsIDpjbGFzczpgUm9ib3RGaWxlUGFyc2VyYCwgd2hpY2ggYW5zd2VycwogcXVlc3Rpb25zIGFib3V0IHdoZXRoZXIgb3Igbm90IGEgcGFydGljdWxhciB1c2VyIGFnZW50IGNhbiBmZXRjaCBhIFVSTCBvbiB0aGUKQEAgLTI2LDEwICsyNiwxMCBAQAogc3RydWN0dXJlIG9mIDpmaWxlOmByb2JvdHMudHh0YCBmaWxlcywgc2VlIGh0dHA6Ly93d3cucm9ib3RzdHh0Lm9yZy9vcmlnLmh0bWwuCiAKIAotLi4gY2xhc3M6OiBSb2JvdEZpbGVQYXJzZXIoKQorLi4gY2xhc3M6OiBSb2JvdEZpbGVQYXJzZXIodXJsPScnKQogCi0gICBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgc2V0IG9mIG1ldGhvZHMgdG8gcmVhZCwgcGFyc2UgYW5kIGFuc3dlciBxdWVzdGlvbnMKLSAgIGFib3V0IGEgc2luZ2xlIDpmaWxlOmByb2JvdHMudHh0YCBmaWxlLgorICAgVGhpcyBjbGFzcyBwcm92aWRlcyBtZXRob2RzIHRvIHJlYWQsIHBhcnNlIGFuZCBhbnN3ZXIgcXVlc3Rpb25zIGFib3V0IHRoZQorICAgOmZpbGU6YHJvYm90cy50eHRgIGZpbGUgYXQgKnVybCouCiAKIAogICAgLi4gbWV0aG9kOjogc2V0X3VybCh1cmwpCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9ydW5weS5yc3QgYi9Eb2MvbGlicmFyeS9ydW5weS5yc3QKaW5kZXggMzE1NjJmZS4uZmM5ZTdjMSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvcnVucHkucnN0CisrKyBiL0RvYy9saWJyYXJ5L3J1bnB5LnJzdApAQCAtMjIsNiArMjIsOSBAQAogCiAuLiBmdW5jdGlvbjo6IHJ1bl9tb2R1bGUobW9kX25hbWUsIGluaXRfZ2xvYmFscz1Ob25lLCBydW5fbmFtZT1Ob25lLCBhbHRlcl9zeXM9RmFsc2UpCiAKKyAgIC4uIGluZGV4OjoKKyAgICAgIG1vZHVsZTogX19tYWluX18KKwogICAgRXhlY3V0ZSB0aGUgY29kZSBvZiB0aGUgc3BlY2lmaWVkIG1vZHVsZSBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcgbW9kdWxlCiAgICBnbG9iYWxzIGRpY3Rpb25hcnkuIFRoZSBtb2R1bGUncyBjb2RlIGlzIGZpcnN0IGxvY2F0ZWQgdXNpbmcgdGhlIHN0YW5kYXJkCiAgICBpbXBvcnQgbWVjaGFuaXNtIChyZWZlciB0byA6cGVwOmAzMDJgIGZvciBkZXRhaWxzKSBhbmQgdGhlbiBleGVjdXRlZCBpbiBhCkBAIC03Nyw2ICs4MCw5IEBACiAKIC4uIGZ1bmN0aW9uOjogcnVuX3BhdGgoZmlsZV9wYXRoLCBpbml0X2dsb2JhbHM9Tm9uZSwgcnVuX25hbWU9Tm9uZSkKIAorICAgLi4gaW5kZXg6OgorICAgICAgbW9kdWxlOiBfX21haW5fXworCiAgICBFeGVjdXRlIHRoZSBjb2RlIGF0IHRoZSBuYW1lZCBmaWxlc3lzdGVtIGxvY2F0aW9uIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZwogICAgbW9kdWxlIGdsb2JhbHMgZGljdGlvbmFyeS4gQXMgd2l0aCBhIHNjcmlwdCBuYW1lIHN1cHBsaWVkIHRvIHRoZSBDUHl0aG9uCiAgICBjb21tYW5kIGxpbmUsIHRoZSBzdXBwbGllZCBwYXRoIG1heSByZWZlciB0byBhIFB5dGhvbiBzb3VyY2UgZmlsZSwgYQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc2Nyb2xsZWR0ZXh0LnJzdCBiL0RvYy9saWJyYXJ5L3Njcm9sbGVkdGV4dC5yc3QKaW5kZXggNWM2NjZjMy4uNmFmNTlkYyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc2Nyb2xsZWR0ZXh0LnJzdAorKysgYi9Eb2MvbGlicmFyeS9zY3JvbGxlZHRleHQucnN0CkBAIC0xNiw4ICsxNiw4IEBACiAuLiBub3RlOjoKIAogICAgOm1vZDpgU2Nyb2xsZWRUZXh0YCBoYXMgYmVlbiByZW5hbWVkIHRvIDptb2Q6YHRraW50ZXIuc2Nyb2xsZWR0ZXh0YCBpbiBQeXRob24KLSAgIDMuMC4gIFRoZSA6dGVybTpgMnRvM2AgdG9vbCB3aWxsIGF1dG9tYXRpY2FsbHkgYWRhcHQgaW1wb3J0cyB3aGVuIGNvbnZlcnRpbmcKLSAgIHlvdXIgc291cmNlcyB0byAzLjAuCisgICAzLiAgVGhlIDp0ZXJtOmAydG8zYCB0b29sIHdpbGwgYXV0b21hdGljYWxseSBhZGFwdCBpbXBvcnRzIHdoZW4gY29udmVydGluZworICAgeW91ciBzb3VyY2VzIHRvIFB5dGhvbiAzLgogCiBUaGUgdGV4dCB3aWRnZXQgYW5kIHNjcm9sbGJhciBhcmUgcGFja2VkIHRvZ2V0aGVyIGluIGEgOmNsYXNzOmBGcmFtZWAsIGFuZCB0aGUKIG1ldGhvZHMgb2YgdGhlIDpjbGFzczpgR3JpZGAgYW5kIDpjbGFzczpgUGFja2AgZ2VvbWV0cnkgbWFuYWdlcnMgYXJlIGFjcXVpcmVkCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zZWxlY3QucnN0IGIvRG9jL2xpYnJhcnkvc2VsZWN0LnJzdAppbmRleCAyZTA4Yjc0Li4yNGNiNzU2IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9zZWxlY3QucnN0CisrKyBiL0RvYy9saWJyYXJ5L3NlbGVjdC5yc3QKQEAgLTYsOSArNiw5IEBACiAgICA6c3lub3BzaXM6IFdhaXQgZm9yIEkvTyBjb21wbGV0aW9uIG9uIG11bHRpcGxlIHN0cmVhbXMuCiAKIAotVGhpcyBtb2R1bGUgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSA6Y2Z1bmM6YHNlbGVjdGAgYW5kIDpjZnVuYzpgcG9sbGAgZnVuY3Rpb25zCi1hdmFpbGFibGUgaW4gbW9zdCBvcGVyYXRpbmcgc3lzdGVtcywgOmNmdW5jOmBlcG9sbGAgYXZhaWxhYmxlIG9uIExpbnV4IDIuNSsgYW5kCi06Y2Z1bmM6YGtxdWV1ZWAgYXZhaWxhYmxlIG9uIG1vc3QgQlNELgorVGhpcyBtb2R1bGUgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSA6YzpmdW5jOmBzZWxlY3RgIGFuZCA6YzpmdW5jOmBwb2xsYCBmdW5jdGlvbnMKK2F2YWlsYWJsZSBpbiBtb3N0IG9wZXJhdGluZyBzeXN0ZW1zLCA6YzpmdW5jOmBlcG9sbGAgYXZhaWxhYmxlIG9uIExpbnV4IDIuNSsgYW5kCis6YzpmdW5jOmBrcXVldWVgIGF2YWlsYWJsZSBvbiBtb3N0IEJTRC4KIE5vdGUgdGhhdCBvbiBXaW5kb3dzLCBpdCBvbmx5IHdvcmtzIGZvciBzb2NrZXRzOyBvbiBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcywKIGl0IGFsc28gd29ya3MgZm9yIG90aGVyIGZpbGUgdHlwZXMgKGluIHBhcnRpY3VsYXIsIG9uIFVuaXgsIGl0IHdvcmtzIG9uIHBpcGVzKS4KIEl0IGNhbm5vdCBiZSB1c2VkIG9uIHJlZ3VsYXIgZmlsZXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBmaWxlIGhhcyBncm93biBzaW5jZQpAQCAtMjAsOCArMjAsOCBAQAogLi4gZXhjZXB0aW9uOjogZXJyb3IKIAogICAgVGhlIGV4Y2VwdGlvbiByYWlzZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMuICBUaGUgYWNjb21wYW55aW5nIHZhbHVlIGlzIGEgcGFpcgotICAgY29udGFpbmluZyB0aGUgbnVtZXJpYyBlcnJvciBjb2RlIGZyb20gOmNkYXRhOmBlcnJub2AgYW5kIHRoZSBjb3JyZXNwb25kaW5nCi0gICBzdHJpbmcsIGFzIHdvdWxkIGJlIHByaW50ZWQgYnkgdGhlIEMgZnVuY3Rpb24gOmNmdW5jOmBwZXJyb3JgLgorICAgY29udGFpbmluZyB0aGUgbnVtZXJpYyBlcnJvciBjb2RlIGZyb20gOmM6ZGF0YTpgZXJybm9gIGFuZCB0aGUgY29ycmVzcG9uZGluZworICAgc3RyaW5nLCBhcyB3b3VsZCBiZSBwcmludGVkIGJ5IHRoZSBDIGZ1bmN0aW9uIDpjOmZ1bmM6YHBlcnJvcmAuCiAKIAogLi4gZnVuY3Rpb246OiBlcG9sbChbc2l6ZWhpbnQ9LTFdKQpAQCAtNjAsMTAgKzYwLDEwIEBACiAKIC4uIGZ1bmN0aW9uOjogc2VsZWN0KHJsaXN0LCB3bGlzdCwgeGxpc3RbLCB0aW1lb3V0XSkKIAotICAgVGhpcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCBpbnRlcmZhY2UgdG8gdGhlIFVuaXggOmNmdW5jOmBzZWxlY3RgIHN5c3RlbSBjYWxsLgorICAgVGhpcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCBpbnRlcmZhY2UgdG8gdGhlIFVuaXggOmM6ZnVuYzpgc2VsZWN0YCBzeXN0ZW0gY2FsbC4KICAgIFRoZSBmaXJzdCB0aHJlZSBhcmd1bWVudHMgYXJlIHNlcXVlbmNlcyBvZiAnd2FpdGFibGUgb2JqZWN0cyc6IGVpdGhlcgogICAgaW50ZWdlcnMgcmVwcmVzZW50aW5nIGZpbGUgZGVzY3JpcHRvcnMgb3Igb2JqZWN0cyB3aXRoIGEgcGFyYW1ldGVybGVzcyBtZXRob2QKLSAgIG5hbWVkIDptZXRoOmBmaWxlbm9gIHJldHVybmluZyBzdWNoIGFuIGludGVnZXI6CisgICBuYW1lZCA6bWV0aDpgfmlvLklPQmFzZS5maWxlbm9gIHJldHVybmluZyBzdWNoIGFuIGludGVnZXI6CiAKICAgICogKnJsaXN0Kjogd2FpdCB1bnRpbCByZWFkeSBmb3IgcmVhZGluZwogICAgKiAqd2xpc3QqOiB3YWl0IHVudGlsIHJlYWR5IGZvciB3cml0aW5nCkBAIC04OCwxNSArODgsMTUgQEAKICAgIEFtb25nIHRoZSBhY2NlcHRhYmxlIG9iamVjdCB0eXBlcyBpbiB0aGUgc2VxdWVuY2VzIGFyZSBQeXRob24gZmlsZSBvYmplY3RzIChlLmcuCiAgICBgYHN5cy5zdGRpbmBgLCBvciBvYmplY3RzIHJldHVybmVkIGJ5IDpmdW5jOmBvcGVuYCBvciA6ZnVuYzpgb3MucG9wZW5gKSwgc29ja2V0CiAgICBvYmplY3RzIHJldHVybmVkIGJ5IDpmdW5jOmBzb2NrZXQuc29ja2V0YC4gIFlvdSBtYXkgYWxzbyBkZWZpbmUgYSA6ZGZuOmB3cmFwcGVyYAotICAgY2xhc3MgeW91cnNlbGYsIGFzIGxvbmcgYXMgaXQgaGFzIGFuIGFwcHJvcHJpYXRlIDptZXRoOmBmaWxlbm9gIG1ldGhvZCAodGhhdAotICAgcmVhbGx5IHJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3IsIG5vdCBqdXN0IGEgcmFuZG9tIGludGVnZXIpLgorICAgY2xhc3MgeW91cnNlbGYsIGFzIGxvbmcgYXMgaXQgaGFzIGFuIGFwcHJvcHJpYXRlIDptZXRoOmB+aW8uSU9CYXNlLmZpbGVub2AKKyAgIG1ldGhvZCAodGhhdCByZWFsbHkgcmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciwgbm90IGp1c3QgYSByYW5kb20gaW50ZWdlcikuCiAKICAgIC4uIG5vdGU6OgogCiAgICAgICAuLiBpbmRleDo6IHNpbmdsZTogV2luU29jawogCiAgICAgICBGaWxlIG9iamVjdHMgb24gV2luZG93cyBhcmUgbm90IGFjY2VwdGFibGUsIGJ1dCBzb2NrZXRzIGFyZS4gIE9uIFdpbmRvd3MsCi0gICAgICB0aGUgdW5kZXJseWluZyA6Y2Z1bmM6YHNlbGVjdGAgZnVuY3Rpb24gaXMgcHJvdmlkZWQgYnkgdGhlIFdpblNvY2sKKyAgICAgIHRoZSB1bmRlcmx5aW5nIDpjOmZ1bmM6YHNlbGVjdGAgZnVuY3Rpb24gaXMgcHJvdmlkZWQgYnkgdGhlIFdpblNvY2sKICAgICAgIGxpYnJhcnksIGFuZCBkb2VzIG5vdCBoYW5kbGUgZmlsZSBkZXNjcmlwdG9ycyB0aGF0IGRvbid0IG9yaWdpbmF0ZSBmcm9tCiAgICAgICBXaW5Tb2NrLgogCkBAIC0xOTUsMjIgKzE5NSwyMiBAQAogUG9sbGluZyBPYmplY3RzCiAtLS0tLS0tLS0tLS0tLS0KIAotVGhlIDpjZnVuYzpgcG9sbGAgc3lzdGVtIGNhbGwsIHN1cHBvcnRlZCBvbiBtb3N0IFVuaXggc3lzdGVtcywgcHJvdmlkZXMgYmV0dGVyCitUaGUgOmM6ZnVuYzpgcG9sbGAgc3lzdGVtIGNhbGwsIHN1cHBvcnRlZCBvbiBtb3N0IFVuaXggc3lzdGVtcywgcHJvdmlkZXMgYmV0dGVyCiBzY2FsYWJpbGl0eSBmb3IgbmV0d29yayBzZXJ2ZXJzIHRoYXQgc2VydmljZSBtYW55LCBtYW55IGNsaWVudHMgYXQgdGhlIHNhbWUKLXRpbWUuIDpjZnVuYzpgcG9sbGAgc2NhbGVzIGJldHRlciBiZWNhdXNlIHRoZSBzeXN0ZW0gY2FsbCBvbmx5IHJlcXVpcmVzIGxpc3RpbmcKLXRoZSBmaWxlIGRlc2NyaXB0b3JzIG9mIGludGVyZXN0LCB3aGlsZSA6Y2Z1bmM6YHNlbGVjdGAgYnVpbGRzIGEgYml0bWFwLCB0dXJucwordGltZS4gOmM6ZnVuYzpgcG9sbGAgc2NhbGVzIGJldHRlciBiZWNhdXNlIHRoZSBzeXN0ZW0gY2FsbCBvbmx5IHJlcXVpcmVzIGxpc3RpbmcKK3RoZSBmaWxlIGRlc2NyaXB0b3JzIG9mIGludGVyZXN0LCB3aGlsZSA6YzpmdW5jOmBzZWxlY3RgIGJ1aWxkcyBhIGJpdG1hcCwgdHVybnMKIG9uIGJpdHMgZm9yIHRoZSBmZHMgb2YgaW50ZXJlc3QsIGFuZCB0aGVuIGFmdGVyd2FyZCB0aGUgd2hvbGUgYml0bWFwIGhhcyB0byBiZQotbGluZWFybHkgc2Nhbm5lZCBhZ2Fpbi4gOmNmdW5jOmBzZWxlY3RgIGlzIE8oaGlnaGVzdCBmaWxlIGRlc2NyaXB0b3IpLCB3aGlsZQotOmNmdW5jOmBwb2xsYCBpcyBPKG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzKS4KK2xpbmVhcmx5IHNjYW5uZWQgYWdhaW4uIDpjOmZ1bmM6YHNlbGVjdGAgaXMgTyhoaWdoZXN0IGZpbGUgZGVzY3JpcHRvciksIHdoaWxlCis6YzpmdW5jOmBwb2xsYCBpcyBPKG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzKS4KIAogCiAuLiBtZXRob2Q6OiBwb2xsLnJlZ2lzdGVyKGZkWywgZXZlbnRtYXNrXSkKIAogICAgUmVnaXN0ZXIgYSBmaWxlIGRlc2NyaXB0b3Igd2l0aCB0aGUgcG9sbGluZyBvYmplY3QuICBGdXR1cmUgY2FsbHMgdG8gdGhlCi0gICA6bWV0aDpgcG9sbGAgbWV0aG9kIHdpbGwgdGhlbiBjaGVjayB3aGV0aGVyIHRoZSBmaWxlIGRlc2NyaXB0b3IgaGFzIGFueSBwZW5kaW5nCi0gICBJL08gZXZlbnRzLiAgKmZkKiBjYW4gYmUgZWl0aGVyIGFuIGludGVnZXIsIG9yIGFuIG9iamVjdCB3aXRoIGEgOm1ldGg6YGZpbGVub2AKLSAgIG1ldGhvZCB0aGF0IHJldHVybnMgYW4gaW50ZWdlci4gIEZpbGUgb2JqZWN0cyBpbXBsZW1lbnQgOm1ldGg6YGZpbGVub2AsIHNvIHRoZXkKLSAgIGNhbiBhbHNvIGJlIHVzZWQgYXMgdGhlIGFyZ3VtZW50LgorICAgOm1ldGg6YHBvbGxgIG1ldGhvZCB3aWxsIHRoZW4gY2hlY2sgd2hldGhlciB0aGUgZmlsZSBkZXNjcmlwdG9yIGhhcyBhbnkKKyAgIHBlbmRpbmcgSS9PIGV2ZW50cy4gICpmZCogY2FuIGJlIGVpdGhlciBhbiBpbnRlZ2VyLCBvciBhbiBvYmplY3Qgd2l0aCBhCisgICA6bWV0aDpgfmlvLklPQmFzZS5maWxlbm9gIG1ldGhvZCB0aGF0IHJldHVybnMgYW4gaW50ZWdlci4gIEZpbGUgb2JqZWN0cworICAgaW1wbGVtZW50IDptZXRoOmAhZmlsZW5vYCwgc28gdGhleSBjYW4gYWxzbyBiZSB1c2VkIGFzIHRoZSBhcmd1bWVudC4KIAogICAgKmV2ZW50bWFzayogaXMgYW4gb3B0aW9uYWwgYml0bWFzayBkZXNjcmliaW5nIHRoZSB0eXBlIG9mIGV2ZW50cyB5b3Ugd2FudCB0bwogICAgY2hlY2sgZm9yLCBhbmQgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGNvbnN0YW50cyA6Y29uc3Q6YFBPTExJTmAsCkBAIC0yNTEsNyArMjUxLDcgQEAKIAogICAgUmVtb3ZlIGEgZmlsZSBkZXNjcmlwdG9yIGJlaW5nIHRyYWNrZWQgYnkgYSBwb2xsaW5nIG9iamVjdC4gIEp1c3QgbGlrZSB0aGUKICAgIDptZXRoOmByZWdpc3RlcmAgbWV0aG9kLCAqZmQqIGNhbiBiZSBhbiBpbnRlZ2VyIG9yIGFuIG9iamVjdCB3aXRoIGEKLSAgIDptZXRoOmBmaWxlbm9gIG1ldGhvZCB0aGF0IHJldHVybnMgYW4gaW50ZWdlci4KKyAgIDptZXRoOmB+aW8uSU9CYXNlLmZpbGVub2AgbWV0aG9kIHRoYXQgcmV0dXJucyBhbiBpbnRlZ2VyLgogCiAgICBBdHRlbXB0aW5nIHRvIHJlbW92ZSBhIGZpbGUgZGVzY3JpcHRvciB0aGF0IHdhcyBuZXZlciByZWdpc3RlcmVkIGNhdXNlcyBhCiAgICA6ZXhjOmBLZXlFcnJvcmAgZXhjZXB0aW9uIHRvIGJlIHJhaXNlZC4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3NnbWxsaWIucnN0IGIvRG9jL2xpYnJhcnkvc2dtbGxpYi5yc3QKaW5kZXggZjUwYjAyYy4uMWRhMTljZiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc2dtbGxpYi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc2dtbGxpYi5yc3QKQEAgLTYsNyArNiw3IEBACiAgICA6ZGVwcmVjYXRlZDoKIAogLi4gZGVwcmVjYXRlZDo6IDIuNgotICAgIFRoZSA6bW9kOmBzZ21sbGliYCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4wLgorICAgIFRoZSA6bW9kOmBzZ21sbGliYCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4KIAogLi4gaW5kZXg6OiBzaW5nbGU6IFNHTUwKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc2hlbHZlLnJzdCBiL0RvYy9saWJyYXJ5L3NoZWx2ZS5yc3QKaW5kZXggZGUxMjQyMC4uYjAyZjc2MyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc2hlbHZlLnJzdAorKysgYi9Eb2MvbGlicmFyeS9zaGVsdmUucnN0CkBAIC0xOCw3ICsxOCw3IEBACiBsb3RzIG9mIHNoYXJlZCAgc3ViLW9iamVjdHMuICBUaGUga2V5cyBhcmUgb3JkaW5hcnkgc3RyaW5ncy4KIAogCi0uLiBmdW5jdGlvbjo6IG9wZW4oZmlsZW5hbWVbLCBmbGFnPSdjJ1ssIHByb3RvY29sPU5vbmVbLCB3cml0ZWJhY2s9RmFsc2VdXV0pCisuLiBmdW5jdGlvbjo6IG9wZW4oZmlsZW5hbWUsIGZsYWc9J2MnLCBwcm90b2NvbD1Ob25lLCB3cml0ZWJhY2s9RmFsc2UpCiAKICAgIE9wZW4gYSBwZXJzaXN0ZW50IGRpY3Rpb25hcnkuICBUaGUgZmlsZW5hbWUgc3BlY2lmaWVkIGlzIHRoZSBiYXNlIGZpbGVuYW1lIGZvcgogICAgdGhlIHVuZGVybHlpbmcgZGF0YWJhc2UuICBBcyBhIHNpZGUtZWZmZWN0LCBhbiBleHRlbnNpb24gbWF5IGJlIGFkZGVkIHRvIHRoZQpAQCAtNDcsOSArNDcsMTEgQEAKICAgIExpa2UgZmlsZSBvYmplY3RzLCBzaGVsdmUgb2JqZWN0cyBzaG91bGQgYmUgY2xvc2VkIGV4cGxpY2l0bHkgdG8gZW5zdXJlCiAgICB0aGF0IHRoZSBwZXJzaXN0ZW50IGRhdGEgaXMgZmx1c2hlZCB0byBkaXNrLgogCi0gICBTaW5jZSB0aGUgOm1vZDpgc2hlbHZlYCBtb2R1bGUgc3RvcmVzIG9iamVjdHMgdXNpbmcgOm1vZDpgcGlja2xlYCwgdGhlIHNhbWUKLSAgIHNlY3VyaXR5IHByZWNhdXRpb25zIGFwcGx5LiAgQWNjb3JkaW5nbHksIHlvdSBzaG91bGQgYXZvaWQgbG9hZGluZyBhIHNoZWxmCi0gICBmcm9tIGFuIHVudHJ1c3RlZCBzb3VyY2UuCisuLiB3YXJuaW5nOjoKKworICAgQmVjYXVzZSB0aGUgOm1vZDpgc2hlbHZlYCBtb2R1bGUgaXMgYmFja2VkIGJ5IDptb2Q6YHBpY2tsZWAsIGl0IGlzIGluc2VjdXJlCisgICB0byBsb2FkIGEgc2hlbGYgZnJvbSBhbiB1bnRydXN0ZWQgc291cmNlLiAgTGlrZSB3aXRoIHBpY2tsZSwgbG9hZGluZyBhIHNoZWxmCisgICBjYW4gZXhlY3V0ZSBhcmJpdHJhcnkgY29kZS4KIAogU2hlbGYgb2JqZWN0cyBzdXBwb3J0IGFsbCBtZXRob2RzIHN1cHBvcnRlZCBieSBkaWN0aW9uYXJpZXMuICBUaGlzIGVhc2VzIHRoZQogdHJhbnNpdGlvbiBmcm9tIGRpY3Rpb25hcnkgYmFzZWQgc2NyaXB0cyB0byB0aG9zZSByZXF1aXJpbmcgcGVyc2lzdGVudCBzdG9yYWdlLgpAQCAtMTAwLDcgKzEwMiw3IEBACiAgIGltcGxlbWVudGF0aW9uIHVzZWQuCiAKIAotLi4gY2xhc3M6OiBTaGVsZihkaWN0WywgcHJvdG9jb2w9Tm9uZVssIHdyaXRlYmFjaz1GYWxzZV1dKQorLi4gY2xhc3M6OiBTaGVsZihkaWN0LCBwcm90b2NvbD1Ob25lLCB3cml0ZWJhY2s9RmFsc2UpCiAKICAgIEEgc3ViY2xhc3Mgb2YgOmNsYXNzOmBVc2VyRGljdC5EaWN0TWl4aW5gIHdoaWNoIHN0b3JlcyBwaWNrbGVkIHZhbHVlcyBpbiB0aGUKICAgICpkaWN0KiBvYmplY3QuCkBAIC0xMTgsNyArMTIwLDcgQEAKICAgIG1lbW9yeSBhbmQgbWFrZSBzeW5jIGFuZCBjbG9zZSB0YWtlIGEgbG9uZyB0aW1lLgogCiAKLS4uIGNsYXNzOjogQnNkRGJTaGVsZihkaWN0WywgcHJvdG9jb2w9Tm9uZVssIHdyaXRlYmFjaz1GYWxzZV1dKQorLi4gY2xhc3M6OiBCc2REYlNoZWxmKGRpY3QsIHByb3RvY29sPU5vbmUsIHdyaXRlYmFjaz1GYWxzZSkKIAogICAgQSBzdWJjbGFzcyBvZiA6Y2xhc3M6YFNoZWxmYCB3aGljaCBleHBvc2VzIDptZXRoOmBmaXJzdGAsIDptZXRoOmAhbmV4dGAsCiAgICA6bWV0aDpgcHJldmlvdXNgLCA6bWV0aDpgbGFzdGAgYW5kIDptZXRoOmBzZXRfbG9jYXRpb25gIHdoaWNoIGFyZSBhdmFpbGFibGUgaW4KQEAgLTEyOSw3ICsxMzEsNyBAQAogICAgdGhlIHNhbWUgaW50ZXJwcmV0YXRpb24gYXMgZm9yIHRoZSA6Y2xhc3M6YFNoZWxmYCBjbGFzcy4KIAogCi0uLiBjbGFzczo6IERiZmlsZW5hbWVTaGVsZihmaWxlbmFtZVssIGZsYWc9J2MnWywgcHJvdG9jb2w9Tm9uZVssIHdyaXRlYmFjaz1GYWxzZV1dXSkKKy4uIGNsYXNzOjogRGJmaWxlbmFtZVNoZWxmKGZpbGVuYW1lLCBmbGFnPSdjJywgcHJvdG9jb2w9Tm9uZSwgd3JpdGViYWNrPUZhbHNlKQogCiAgICBBIHN1YmNsYXNzIG9mIDpjbGFzczpgU2hlbGZgIHdoaWNoIGFjY2VwdHMgYSAqZmlsZW5hbWUqIGluc3RlYWQgb2YgYSBkaWN0LWxpa2UKICAgIG9iamVjdC4gIFRoZSB1bmRlcmx5aW5nIGZpbGUgd2lsbCBiZSBvcGVuZWQgdXNpbmcgOmZ1bmM6YGFueWRibS5vcGVuYC4gIEJ5CmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zaGxleC5yc3QgYi9Eb2MvbGlicmFyeS9zaGxleC5yc3QKaW5kZXggYmIwNWM3ZC4uYmUwOGUwMSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc2hsZXgucnN0CisrKyBiL0RvYy9saWJyYXJ5L3NobGV4LnJzdApAQCAtMTYsOSArMTYsOSBAQAogLS0tLS0tLS0tLS0tLS0KIAogCi1UaGUgOmNsYXNzOmBzaGxleGAgY2xhc3MgbWFrZXMgaXQgZWFzeSB0byB3cml0ZSBsZXhpY2FsIGFuYWx5emVycyBmb3Igc2ltcGxlCi1zeW50YXhlcyByZXNlbWJsaW5nIHRoYXQgb2YgdGhlIFVuaXggc2hlbGwuICBUaGlzIHdpbGwgb2Z0ZW4gYmUgdXNlZnVsIGZvcgotd3JpdGluZyBtaW5pbGFuZ3VhZ2VzLCAoZm9yIGV4YW1wbGUsIGluIHJ1biBjb250cm9sIGZpbGVzIGZvciBQeXRob24KK1RoZSA6Y2xhc3M6YH5zaGxleC5zaGxleGAgY2xhc3MgbWFrZXMgaXQgZWFzeSB0byB3cml0ZSBsZXhpY2FsIGFuYWx5emVycyBmb3IKK3NpbXBsZSBzeW50YXhlcyByZXNlbWJsaW5nIHRoYXQgb2YgdGhlIFVuaXggc2hlbGwuICBUaGlzIHdpbGwgb2Z0ZW4gYmUgdXNlZnVsCitmb3Igd3JpdGluZyBtaW5pbGFuZ3VhZ2VzLCAoZm9yIGV4YW1wbGUsIGluIHJ1biBjb250cm9sIGZpbGVzIGZvciBQeXRob24KIGFwcGxpY2F0aW9ucykgb3IgZm9yIHBhcnNpbmcgcXVvdGVkIHN0cmluZ3MuCiAKIFByaW9yIHRvIFB5dGhvbiAyLjcuMywgdGhpcyBtb2R1bGUgZGlkIG5vdCBzdXBwb3J0IFVuaWNvZGUgaW5wdXQuCkBAIC0zMCw5ICszMCwxMCBAQAogCiAgICBTcGxpdCB0aGUgc3RyaW5nICpzKiB1c2luZyBzaGVsbC1saWtlIHN5bnRheC4gSWYgKmNvbW1lbnRzKiBpcyA6Y29uc3Q6YEZhbHNlYAogICAgKHRoZSBkZWZhdWx0KSwgdGhlIHBhcnNpbmcgb2YgY29tbWVudHMgaW4gdGhlIGdpdmVuIHN0cmluZyB3aWxsIGJlIGRpc2FibGVkCi0gICAoc2V0dGluZyB0aGUgOmF0dHI6YGNvbW1lbnRlcnNgIGF0dHJpYnV0ZSBvZiB0aGUgOmNsYXNzOmBzaGxleGAgaW5zdGFuY2UgdG8KLSAgIHRoZSBlbXB0eSBzdHJpbmcpLiAgVGhpcyBmdW5jdGlvbiBvcGVyYXRlcyBpbiBQT1NJWCBtb2RlIGJ5IGRlZmF1bHQsIGJ1dCB1c2VzCi0gICBub24tUE9TSVggbW9kZSBpZiB0aGUgKnBvc2l4KiBhcmd1bWVudCBpcyBmYWxzZS4KKyAgIChzZXR0aW5nIHRoZSA6YXR0cjpgfnNobGV4LmNvbW1lbnRlcnNgIGF0dHJpYnV0ZSBvZiB0aGUKKyAgIDpjbGFzczpgfnNobGV4LnNobGV4YCBpbnN0YW5jZSB0byB0aGUgZW1wdHkgc3RyaW5nKS4gIFRoaXMgZnVuY3Rpb24gb3BlcmF0ZXMKKyAgIGluIFBPU0lYIG1vZGUgYnkgZGVmYXVsdCwgYnV0IHVzZXMgbm9uLVBPU0lYIG1vZGUgaWYgdGhlICpwb3NpeCogYXJndW1lbnQgaXMKKyAgIGZhbHNlLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjMKIApAQCAtNDEsMjYgKzQyLDI4IEBACiAKICAgIC4uIG5vdGU6OgogCi0gICAgICBTaW5jZSB0aGUgOmZ1bmM6YHNwbGl0YCBmdW5jdGlvbiBpbnN0YW50aWF0ZXMgYSA6Y2xhc3M6YHNobGV4YCBpbnN0YW5jZSwgcGFzc2luZwotICAgICAgYGBOb25lYGAgZm9yICpzKiB3aWxsIHJlYWQgdGhlIHN0cmluZyB0byBzcGxpdCBmcm9tIHN0YW5kYXJkIGlucHV0LgorICAgICAgU2luY2UgdGhlIDpmdW5jOmBzcGxpdGAgZnVuY3Rpb24gaW5zdGFudGlhdGVzIGEgOmNsYXNzOmB+c2hsZXguc2hsZXhgCisgICAgICBpbnN0YW5jZSwgcGFzc2luZyBgYE5vbmVgYCBmb3IgKnMqIHdpbGwgcmVhZCB0aGUgc3RyaW5nIHRvIHNwbGl0IGZyb20KKyAgICAgIHN0YW5kYXJkIGlucHV0LgogCiBUaGUgOm1vZDpgc2hsZXhgIG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgY2xhc3M6CiAKIAogLi4gY2xhc3M6OiBzaGxleChbaW5zdHJlYW1bLCBpbmZpbGVbLCBwb3NpeF1dXSkKIAotICAgQSA6Y2xhc3M6YHNobGV4YCBpbnN0YW5jZSBvciBzdWJjbGFzcyBpbnN0YW5jZSBpcyBhIGxleGljYWwgYW5hbHl6ZXIgb2JqZWN0LgotICAgVGhlIGluaXRpYWxpemF0aW9uIGFyZ3VtZW50LCBpZiBwcmVzZW50LCBzcGVjaWZpZXMgd2hlcmUgdG8gcmVhZCBjaGFyYWN0ZXJzCi0gICBmcm9tLiBJdCBtdXN0IGJlIGEgZmlsZS0vc3RyZWFtLWxpa2Ugb2JqZWN0IHdpdGggOm1ldGg6YHJlYWRgIGFuZAotICAgOm1ldGg6YHJlYWRsaW5lYCBtZXRob2RzLCBvciBhIHN0cmluZyAoc3RyaW5ncyBhcmUgYWNjZXB0ZWQgc2luY2UgUHl0aG9uIDIuMykuCi0gICBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgaW5wdXQgd2lsbCBiZSB0YWtlbiBmcm9tIGBgc3lzLnN0ZGluYGAuICBUaGUgc2Vjb25kCi0gICBvcHRpb25hbCBhcmd1bWVudCBpcyBhIGZpbGVuYW1lIHN0cmluZywgd2hpY2ggc2V0cyB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUKLSAgIDphdHRyOmBpbmZpbGVgIGF0dHJpYnV0ZS4gIElmIHRoZSAqaW5zdHJlYW0qIGFyZ3VtZW50IGlzIG9taXR0ZWQgb3IgZXF1YWwgdG8KLSAgIGBgc3lzLnN0ZGluYGAsIHRoaXMgc2Vjb25kIGFyZ3VtZW50IGRlZmF1bHRzIHRvICJzdGRpbiIuICBUaGUgKnBvc2l4KiBhcmd1bWVudAotICAgd2FzIGludHJvZHVjZWQgaW4gUHl0aG9uIDIuMywgYW5kIGRlZmluZXMgdGhlIG9wZXJhdGlvbmFsIG1vZGUuICBXaGVuICpwb3NpeCogaXMKLSAgIG5vdCB0cnVlIChkZWZhdWx0KSwgdGhlIDpjbGFzczpgc2hsZXhgIGluc3RhbmNlIHdpbGwgb3BlcmF0ZSBpbiBjb21wYXRpYmlsaXR5Ci0gICBtb2RlLiAgV2hlbiBvcGVyYXRpbmcgaW4gUE9TSVggbW9kZSwgOmNsYXNzOmBzaGxleGAgd2lsbCB0cnkgdG8gYmUgYXMgY2xvc2UgYXMKLSAgIHBvc3NpYmxlIHRvIHRoZSBQT1NJWCBzaGVsbCBwYXJzaW5nIHJ1bGVzLgorICAgQSA6Y2xhc3M6YH5zaGxleC5zaGxleGAgaW5zdGFuY2Ugb3Igc3ViY2xhc3MgaW5zdGFuY2UgaXMgYSBsZXhpY2FsIGFuYWx5emVyCisgICBvYmplY3QuICBUaGUgaW5pdGlhbGl6YXRpb24gYXJndW1lbnQsIGlmIHByZXNlbnQsIHNwZWNpZmllcyB3aGVyZSB0byByZWFkCisgICBjaGFyYWN0ZXJzIGZyb20uIEl0IG11c3QgYmUgYSBmaWxlLS9zdHJlYW0tbGlrZSBvYmplY3Qgd2l0aAorICAgOm1ldGg6YH5pby5UZXh0SU9CYXNlLnJlYWRgIGFuZCA6bWV0aDpgfmlvLlRleHRJT0Jhc2UucmVhZGxpbmVgIG1ldGhvZHMsIG9yCisgICBhIHN0cmluZyAoc3RyaW5ncyBhcmUgYWNjZXB0ZWQgc2luY2UgUHl0aG9uIDIuMykuICBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwKKyAgIGlucHV0IHdpbGwgYmUgdGFrZW4gZnJvbSBgYHN5cy5zdGRpbmBgLiAgVGhlIHNlY29uZCBvcHRpb25hbCBhcmd1bWVudCBpcyBhCisgICBmaWxlbmFtZSBzdHJpbmcsIHdoaWNoIHNldHMgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIDphdHRyOmB+c2hsZXguaW5maWxlYAorICAgYXR0cmlidXRlLiAgSWYgdGhlICppbnN0cmVhbSogYXJndW1lbnQgaXMgb21pdHRlZCBvciBlcXVhbCB0byBgYHN5cy5zdGRpbmBgLAorICAgdGhpcyBzZWNvbmQgYXJndW1lbnQgZGVmYXVsdHMgdG8gInN0ZGluIi4gIFRoZSAqcG9zaXgqIGFyZ3VtZW50IHdhcworICAgaW50cm9kdWNlZCBpbiBQeXRob24gMi4zLCBhbmQgZGVmaW5lcyB0aGUgb3BlcmF0aW9uYWwgbW9kZS4gIFdoZW4gKnBvc2l4KiBpcworICAgbm90IHRydWUgKGRlZmF1bHQpLCB0aGUgOmNsYXNzOmB+c2hsZXguc2hsZXhgIGluc3RhbmNlIHdpbGwgb3BlcmF0ZSBpbgorICAgY29tcGF0aWJpbGl0eSBtb2RlLiAgV2hlbiBvcGVyYXRpbmcgaW4gUE9TSVggbW9kZSwgOmNsYXNzOmB+c2hsZXguc2hsZXhgCisgICB3aWxsIHRyeSB0byBiZSBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byB0aGUgUE9TSVggc2hlbGwgcGFyc2luZyBydWxlcy4KIAogCiAuLiBzZWVhbHNvOjoKQEAgLTc0LDE0ICs3NywxNCBAQAogc2hsZXggT2JqZWN0cwogLS0tLS0tLS0tLS0tLQogCi1BIDpjbGFzczpgc2hsZXhgIGluc3RhbmNlIGhhcyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CitBIDpjbGFzczpgfnNobGV4LnNobGV4YCBpbnN0YW5jZSBoYXMgdGhlIGZvbGxvd2luZyBtZXRob2RzOgogCiAKIC4uIG1ldGhvZDo6IHNobGV4LmdldF90b2tlbigpCiAKICAgIFJldHVybiBhIHRva2VuLiAgSWYgdG9rZW5zIGhhdmUgYmVlbiBzdGFja2VkIHVzaW5nIDptZXRoOmBwdXNoX3Rva2VuYCwgcG9wIGEKICAgIHRva2VuIG9mZiB0aGUgc3RhY2suICBPdGhlcndpc2UsIHJlYWQgb25lIGZyb20gdGhlIGlucHV0IHN0cmVhbS4gIElmIHJlYWRpbmcKLSAgIGVuY291bnRlcnMgYW4gaW1tZWRpYXRlIGVuZC1vZi1maWxlLCA6YXR0cjpgc2VsZi5lb2ZgIGlzIHJldHVybmVkICh0aGUgZW1wdHkKKyAgIGVuY291bnRlcnMgYW4gaW1tZWRpYXRlIGVuZC1vZi1maWxlLCA6YXR0cjpgZW9mYCBpcyByZXR1cm5lZCAodGhlIGVtcHR5CiAgICBzdHJpbmcgKGBgJydgYCkgaW4gbm9uLVBPU0lYIG1vZGUsIGFuZCBgYE5vbmVgYCBpbiBQT1NJWCBtb2RlKS4KIAogCkBAIC05OSw5ICsxMDIsOSBAQAogCiAuLiBtZXRob2Q6OiBzaGxleC5zb3VyY2Vob29rKGZpbGVuYW1lKQogCi0gICBXaGVuIDpjbGFzczpgc2hsZXhgIGRldGVjdHMgYSBzb3VyY2UgcmVxdWVzdCAoc2VlIDphdHRyOmBzb3VyY2VgIGJlbG93KSB0aGlzCi0gICBtZXRob2QgaXMgZ2l2ZW4gdGhlIGZvbGxvd2luZyB0b2tlbiBhcyBhcmd1bWVudCwgYW5kIGV4cGVjdGVkIHRvIHJldHVybiBhIHR1cGxlCi0gICBjb25zaXN0aW5nIG9mIGEgZmlsZW5hbWUgYW5kIGFuIG9wZW4gZmlsZS1saWtlIG9iamVjdC4KKyAgIFdoZW4gOmNsYXNzOmB+c2hsZXguc2hsZXhgIGRldGVjdHMgYSBzb3VyY2UgcmVxdWVzdCAoc2VlIDphdHRyOmBzb3VyY2VgCisgICBiZWxvdykgdGhpcyBtZXRob2QgaXMgZ2l2ZW4gdGhlIGZvbGxvd2luZyB0b2tlbiBhcyBhcmd1bWVudCwgYW5kIGV4cGVjdGVkCisgICB0byByZXR1cm4gYSB0dXBsZSBjb25zaXN0aW5nIG9mIGEgZmlsZW5hbWUgYW5kIGFuIG9wZW4gZmlsZS1saWtlIG9iamVjdC4KIAogICAgTm9ybWFsbHksIHRoaXMgbWV0aG9kIGZpcnN0IHN0cmlwcyBhbnkgcXVvdGVzIG9mZiB0aGUgYXJndW1lbnQuICBJZiB0aGUgcmVzdWx0CiAgICBpcyBhbiBhYnNvbHV0ZSBwYXRobmFtZSwgb3IgdGhlcmUgd2FzIG5vIHByZXZpb3VzIHNvdXJjZSByZXF1ZXN0IGluIGVmZmVjdCwgb3IKQEAgLTExOCw4ICsxMjEsOSBAQAogCiAgICBUaGlzIGhvb2sgaXMgZXhwb3NlZCBzbyB0aGF0IHlvdSBjYW4gdXNlIGl0IHRvIGltcGxlbWVudCBkaXJlY3Rvcnkgc2VhcmNoIHBhdGhzLAogICAgYWRkaXRpb24gb2YgZmlsZSBleHRlbnNpb25zLCBhbmQgb3RoZXIgbmFtZXNwYWNlIGhhY2tzLiBUaGVyZSBpcyBubwotICAgY29ycmVzcG9uZGluZyAnY2xvc2UnIGhvb2ssIGJ1dCBhIHNobGV4IGluc3RhbmNlIHdpbGwgY2FsbCB0aGUgOm1ldGg6YGNsb3NlYAotICAgbWV0aG9kIG9mIHRoZSBzb3VyY2VkIGlucHV0IHN0cmVhbSB3aGVuIGl0IHJldHVybnMgRU9GLgorICAgY29ycmVzcG9uZGluZyAnY2xvc2UnIGhvb2ssIGJ1dCBhIHNobGV4IGluc3RhbmNlIHdpbGwgY2FsbCB0aGUKKyAgIDptZXRoOmB+aW8uSU9CYXNlLmNsb3NlYCBtZXRob2Qgb2YgdGhlIHNvdXJjZWQgaW5wdXQgc3RyZWFtIHdoZW4gaXQgcmV0dXJucworICAgRU9GLgogCiAgICBGb3IgbW9yZSBleHBsaWNpdCBjb250cm9sIG9mIHNvdXJjZSBzdGFja2luZywgdXNlIHRoZSA6bWV0aDpgcHVzaF9zb3VyY2VgIGFuZAogICAgOm1ldGg6YHBvcF9zb3VyY2VgIG1ldGhvZHMuCkBAIC0xNTMsOCArMTU3LDggQEAKICAgIG1lc3NhZ2VzIGluIHRoZSBzdGFuZGFyZCwgcGFyc2VhYmxlIGZvcm1hdCB1bmRlcnN0b29kIGJ5IEVtYWNzIGFuZCBvdGhlciBVbml4CiAgICB0b29scy4KIAotSW5zdGFuY2VzIG9mIDpjbGFzczpgc2hsZXhgIHN1YmNsYXNzZXMgaGF2ZSBzb21lIHB1YmxpYyBpbnN0YW5jZSB2YXJpYWJsZXMgd2hpY2gKLWVpdGhlciBjb250cm9sIGxleGljYWwgYW5hbHlzaXMgb3IgY2FuIGJlIHVzZWQgZm9yIGRlYnVnZ2luZzoKK0luc3RhbmNlcyBvZiA6Y2xhc3M6YH5zaGxleC5zaGxleGAgc3ViY2xhc3NlcyBoYXZlIHNvbWUgcHVibGljIGluc3RhbmNlCit2YXJpYWJsZXMgd2hpY2ggZWl0aGVyIGNvbnRyb2wgbGV4aWNhbCBhbmFseXNpcyBvciBjYW4gYmUgdXNlZCBmb3IgZGVidWdnaW5nOgogCiAKIC4uIGF0dHJpYnV0ZTo6IHNobGV4LmNvbW1lbnRlcnMKQEAgLTIwMyw4ICsyMDcsOCBAQAogLi4gYXR0cmlidXRlOjogc2hsZXgud2hpdGVzcGFjZV9zcGxpdAogCiAgICBJZiBgYFRydWVgYCwgdG9rZW5zIHdpbGwgb25seSBiZSBzcGxpdCBpbiB3aGl0ZXNwYWNlcy4gVGhpcyBpcyB1c2VmdWwsIGZvcgotICAgZXhhbXBsZSwgZm9yIHBhcnNpbmcgY29tbWFuZCBsaW5lcyB3aXRoIDpjbGFzczpgc2hsZXhgLCBnZXR0aW5nIHRva2VucyBpbiBhCi0gICBzaW1pbGFyIHdheSB0byBzaGVsbCBhcmd1bWVudHMuCisgICBleGFtcGxlLCBmb3IgcGFyc2luZyBjb21tYW5kIGxpbmVzIHdpdGggOmNsYXNzOmB+c2hsZXguc2hsZXhgLCBnZXR0aW5nCisgICB0b2tlbnMgaW4gYSBzaW1pbGFyIHdheSB0byBzaGVsbCBhcmd1bWVudHMuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMwogCkBAIC0yMTgsNyArMjIyLDggQEAKIAogLi4gYXR0cmlidXRlOjogc2hsZXguaW5zdHJlYW0KIAotICAgVGhlIGlucHV0IHN0cmVhbSBmcm9tIHdoaWNoIHRoaXMgOmNsYXNzOmBzaGxleGAgaW5zdGFuY2UgaXMgcmVhZGluZyBjaGFyYWN0ZXJzLgorICAgVGhlIGlucHV0IHN0cmVhbSBmcm9tIHdoaWNoIHRoaXMgOmNsYXNzOmB+c2hsZXguc2hsZXhgIGluc3RhbmNlIGlzIHJlYWRpbmcKKyAgIGNoYXJhY3RlcnMuCiAKIAogLi4gYXR0cmlidXRlOjogc2hsZXguc291cmNlCkBAIC0yMjcsMTYgKzIzMiwxNiBAQAogICAgc3RyaW5nIHdpbGwgYmUgcmVjb2duaXplZCBhcyBhIGxleGljYWwtbGV2ZWwgaW5jbHVzaW9uIHJlcXVlc3Qgc2ltaWxhciB0byB0aGUKICAgIGBgc291cmNlYGAga2V5d29yZCBpbiB2YXJpb3VzIHNoZWxscy4gIFRoYXQgaXMsIHRoZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdG9rZW4KICAgIHdpbGwgb3BlbmVkIGFzIGEgZmlsZW5hbWUgYW5kIGlucHV0IHRha2VuIGZyb20gdGhhdCBzdHJlYW0gdW50aWwgRU9GLCBhdCB3aGljaAotICAgcG9pbnQgdGhlIDptZXRoOmBjbG9zZWAgbWV0aG9kIG9mIHRoYXQgc3RyZWFtIHdpbGwgYmUgY2FsbGVkIGFuZCB0aGUgaW5wdXQKLSAgIHNvdXJjZSB3aWxsIGFnYWluIGJlY29tZSB0aGUgb3JpZ2luYWwgaW5wdXQgc3RyZWFtLiBTb3VyY2UgcmVxdWVzdHMgbWF5IGJlCi0gICBzdGFja2VkIGFueSBudW1iZXIgb2YgbGV2ZWxzIGRlZXAuCisgICBwb2ludCB0aGUgOm1ldGg6YH5pby5JT0Jhc2UuY2xvc2VgIG1ldGhvZCBvZiB0aGF0IHN0cmVhbSB3aWxsIGJlIGNhbGxlZCBhbmQKKyAgIHRoZSBpbnB1dCBzb3VyY2Ugd2lsbCBhZ2FpbiBiZWNvbWUgdGhlIG9yaWdpbmFsIGlucHV0IHN0cmVhbS4gIFNvdXJjZQorICAgcmVxdWVzdHMgbWF5IGJlIHN0YWNrZWQgYW55IG51bWJlciBvZiBsZXZlbHMgZGVlcC4KIAogCiAuLiBhdHRyaWJ1dGU6OiBzaGxleC5kZWJ1ZwogCi0gICBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBudW1lcmljIGFuZCBgYDFgYCBvciBtb3JlLCBhIDpjbGFzczpgc2hsZXhgIGluc3RhbmNlIHdpbGwKLSAgIHByaW50IHZlcmJvc2UgcHJvZ3Jlc3Mgb3V0cHV0IG9uIGl0cyBiZWhhdmlvci4gIElmIHlvdSBuZWVkIHRvIHVzZSB0aGlzLCB5b3UgY2FuCi0gICByZWFkIHRoZSBtb2R1bGUgc291cmNlIGNvZGUgdG8gbGVhcm4gdGhlIGRldGFpbHMuCisgICBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBudW1lcmljIGFuZCBgYDFgYCBvciBtb3JlLCBhIDpjbGFzczpgfnNobGV4LnNobGV4YAorICAgaW5zdGFuY2Ugd2lsbCBwcmludCB2ZXJib3NlIHByb2dyZXNzIG91dHB1dCBvbiBpdHMgYmVoYXZpb3IuICBJZiB5b3UgbmVlZAorICAgdG8gdXNlIHRoaXMsIHlvdSBjYW4gcmVhZCB0aGUgbW9kdWxlIHNvdXJjZSBjb2RlIHRvIGxlYXJuIHRoZSBkZXRhaWxzLgogCiAKIC4uIGF0dHJpYnV0ZTo6IHNobGV4LmxpbmVubwpAQCAtMjYyLDcgKzI2Nyw3IEBACiBQYXJzaW5nIFJ1bGVzCiAtLS0tLS0tLS0tLS0tCiAKLVdoZW4gb3BlcmF0aW5nIGluIG5vbi1QT1NJWCBtb2RlLCA6Y2xhc3M6YHNobGV4YCB3aWxsIHRyeSB0byBvYmV5IHRvIHRoZQorV2hlbiBvcGVyYXRpbmcgaW4gbm9uLVBPU0lYIG1vZGUsIDpjbGFzczpgfnNobGV4LnNobGV4YCB3aWxsIHRyeSB0byBvYmV5IHRvIHRoZQogZm9sbG93aW5nIHJ1bGVzLgogCiAqIFF1b3RlIGNoYXJhY3RlcnMgYXJlIG5vdCByZWNvZ25pemVkIHdpdGhpbiB3b3JkcyAoYGBEbyJOb3QiU2VwYXJhdGVgYCBpcwpAQCAtMjc2LDE2ICsyODEsMTcgQEAKICogQ2xvc2luZyBxdW90ZXMgc2VwYXJhdGUgd29yZHMgKGBgIkRvIlNlcGFyYXRlYGAgaXMgcGFyc2VkIGFzIGBgIkRvImBgIGFuZAogICBgYFNlcGFyYXRlYGApOwogCi0qIElmIDphdHRyOmB3aGl0ZXNwYWNlX3NwbGl0YCBpcyBgYEZhbHNlYGAsIGFueSBjaGFyYWN0ZXIgbm90IGRlY2xhcmVkIHRvIGJlIGEKLSAgd29yZCBjaGFyYWN0ZXIsIHdoaXRlc3BhY2UsIG9yIGEgcXVvdGUgd2lsbCBiZSByZXR1cm5lZCBhcyBhIHNpbmdsZS1jaGFyYWN0ZXIKLSAgdG9rZW4uIElmIGl0IGlzIGBgVHJ1ZWBgLCA6Y2xhc3M6YHNobGV4YCB3aWxsIG9ubHkgc3BsaXQgd29yZHMgaW4gd2hpdGVzcGFjZXM7CisqIElmIDphdHRyOmB+c2hsZXgud2hpdGVzcGFjZV9zcGxpdGAgaXMgYGBGYWxzZWBgLCBhbnkgY2hhcmFjdGVyIG5vdAorICBkZWNsYXJlZCB0byBiZSBhIHdvcmQgY2hhcmFjdGVyLCB3aGl0ZXNwYWNlLCBvciBhIHF1b3RlIHdpbGwgYmUgcmV0dXJuZWQgYXMKKyAgYSBzaW5nbGUtY2hhcmFjdGVyIHRva2VuLiBJZiBpdCBpcyBgYFRydWVgYCwgOmNsYXNzOmB+c2hsZXguc2hsZXhgIHdpbGwgb25seQorICBzcGxpdCB3b3JkcyBpbiB3aGl0ZXNwYWNlczsKIAogKiBFT0YgaXMgc2lnbmFsZWQgd2l0aCBhbiBlbXB0eSBzdHJpbmcgKGBgJydgYCk7CiAKICogSXQncyBub3QgcG9zc2libGUgdG8gcGFyc2UgZW1wdHkgc3RyaW5ncywgZXZlbiBpZiBxdW90ZWQuCiAKLVdoZW4gb3BlcmF0aW5nIGluIFBPU0lYIG1vZGUsIDpjbGFzczpgc2hsZXhgIHdpbGwgdHJ5IHRvIG9iZXkgdG8gdGhlIGZvbGxvd2luZwotcGFyc2luZyBydWxlcy4KK1doZW4gb3BlcmF0aW5nIGluIFBPU0lYIG1vZGUsIDpjbGFzczpgfnNobGV4LnNobGV4YCB3aWxsIHRyeSB0byBvYmV5IHRvIHRoZQorZm9sbG93aW5nIHBhcnNpbmcgcnVsZXMuCiAKICogUXVvdGVzIGFyZSBzdHJpcHBlZCBvdXQsIGFuZCBkbyBub3Qgc2VwYXJhdGUgd29yZHMgKGBgIkRvIk5vdCJTZXBhcmF0ZSJgYCBpcwogICBwYXJzZWQgYXMgdGhlIHNpbmdsZSB3b3JkIGBgRG9Ob3RTZXBhcmF0ZWBgKTsKQEAgLTI5MywxNCArMjk5LDE2IEBACiAqIE5vbi1xdW90ZWQgZXNjYXBlIGNoYXJhY3RlcnMgKGUuZy4gYGAnXCdgYCkgcHJlc2VydmUgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlCiAgIG5leHQgY2hhcmFjdGVyIHRoYXQgZm9sbG93czsKIAotKiBFbmNsb3NpbmcgY2hhcmFjdGVycyBpbiBxdW90ZXMgd2hpY2ggYXJlIG5vdCBwYXJ0IG9mIDphdHRyOmBlc2NhcGVkcXVvdGVzYAotICAoZS5nLiBgYCInImBgKSBwcmVzZXJ2ZSB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiBhbGwgY2hhcmFjdGVycyB3aXRoaW4gdGhlIHF1b3RlczsKKyogRW5jbG9zaW5nIGNoYXJhY3RlcnMgaW4gcXVvdGVzIHdoaWNoIGFyZSBub3QgcGFydCBvZgorICA6YXR0cjpgfnNobGV4LmVzY2FwZWRxdW90ZXNgIChlLmcuIGBgIiciYGApIHByZXNlcnZlIHRoZSBsaXRlcmFsIHZhbHVlCisgIG9mIGFsbCBjaGFyYWN0ZXJzIHdpdGhpbiB0aGUgcXVvdGVzOwogCi0qIEVuY2xvc2luZyBjaGFyYWN0ZXJzIGluIHF1b3RlcyB3aGljaCBhcmUgcGFydCBvZiA6YXR0cjpgZXNjYXBlZHF1b3Rlc2AgKGUuZy4KLSAgYGAnIidgYCkgcHJlc2VydmVzIHRoZSBsaXRlcmFsIHZhbHVlIG9mIGFsbCBjaGFyYWN0ZXJzIHdpdGhpbiB0aGUgcXVvdGVzLCB3aXRoCi0gIHRoZSBleGNlcHRpb24gb2YgdGhlIGNoYXJhY3RlcnMgbWVudGlvbmVkIGluIDphdHRyOmBlc2NhcGVgLiBUaGUgZXNjYXBlCi0gIGNoYXJhY3RlcnMgcmV0YWluIGl0cyBzcGVjaWFsIG1lYW5pbmcgb25seSB3aGVuIGZvbGxvd2VkIGJ5IHRoZSBxdW90ZSBpbiB1c2UsIG9yCi0gIHRoZSBlc2NhcGUgY2hhcmFjdGVyIGl0c2VsZi4gT3RoZXJ3aXNlIHRoZSBlc2NhcGUgY2hhcmFjdGVyIHdpbGwgYmUgY29uc2lkZXJlZCBhCisqIEVuY2xvc2luZyBjaGFyYWN0ZXJzIGluIHF1b3RlcyB3aGljaCBhcmUgcGFydCBvZgorICA6YXR0cjpgfnNobGV4LmVzY2FwZWRxdW90ZXNgIChlLmcuIGBgJyInYGApIHByZXNlcnZlcyB0aGUgbGl0ZXJhbCB2YWx1ZQorICBvZiBhbGwgY2hhcmFjdGVycyB3aXRoaW4gdGhlIHF1b3Rlcywgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBjaGFyYWN0ZXJzCisgIG1lbnRpb25lZCBpbiA6YXR0cjpgfnNobGV4LmVzY2FwZWAuICBUaGUgZXNjYXBlIGNoYXJhY3RlcnMgcmV0YWluIGl0cworICBzcGVjaWFsIG1lYW5pbmcgb25seSB3aGVuIGZvbGxvd2VkIGJ5IHRoZSBxdW90ZSBpbiB1c2UsIG9yIHRoZSBlc2NhcGUKKyAgY2hhcmFjdGVyIGl0c2VsZi4gT3RoZXJ3aXNlIHRoZSBlc2NhcGUgY2hhcmFjdGVyIHdpbGwgYmUgY29uc2lkZXJlZCBhCiAgIG5vcm1hbCBjaGFyYWN0ZXIuCiAKICogRU9GIGlzIHNpZ25hbGVkIHdpdGggYSA6Y29uc3Q6YE5vbmVgIHZhbHVlOwpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc2h1dGlsLnJzdCBiL0RvYy9saWJyYXJ5L3NodXRpbC5yc3QKaW5kZXggMzEyNjk2NS4uZTg5NzQ4MyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc2h1dGlsLnJzdAorKysgYi9Eb2MvbGlicmFyeS9zaHV0aWwucnN0CkBAIC0yMSw4ICsyMSw4IEBACiAKIC4uIHdhcm5pbmc6OgogCi0gICBFdmVuIHRoZSBoaWdoZXItbGV2ZWwgZmlsZSBjb3B5aW5nIGZ1bmN0aW9ucyAoOmZ1bmM6YGNvcHlgLCA6ZnVuYzpgY29weTJgKQotICAgY2FuJ3QgY29weSBhbGwgZmlsZSBtZXRhZGF0YS4KKyAgIEV2ZW4gdGhlIGhpZ2hlci1sZXZlbCBmaWxlIGNvcHlpbmcgZnVuY3Rpb25zICg6ZnVuYzpgc2h1dGlsLmNvcHlgLAorICAgOmZ1bmM6YHNodXRpbC5jb3B5MmApIGNhbid0IGNvcHkgYWxsIGZpbGUgbWV0YWRhdGEuCiAKICAgIE9uIFBPU0lYIHBsYXRmb3JtcywgdGhpcyBtZWFucyB0aGF0IGZpbGUgb3duZXIgYW5kIGdyb3VwIGFyZSBsb3N0IGFzIHdlbGwKICAgIGFzIEFDTHMuICBPbiBNYWMgT1MsIHRoZSByZXNvdXJjZSBmb3JrIGFuZCBvdGhlciBtZXRhZGF0YSBhcmUgbm90IHVzZWQuCkBAIC0zMSw2ICszMSw4IEBACiAgICBhcmUgbm90IGNvcGllZC4KIAogCisuLiBfZmlsZS1vcGVyYXRpb25zOgorCiBEaXJlY3RvcnkgYW5kIGZpbGVzIG9wZXJhdGlvbnMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC00NywxMCArNDksMTAgQEAKIAogLi4gZnVuY3Rpb246OiBjb3B5ZmlsZShzcmMsIGRzdCkKIAotICAgQ29weSB0aGUgY29udGVudHMgKG5vIG1ldGFkYXRhKSBvZiB0aGUgZmlsZSBuYW1lZCAqc3JjKiB0byBhIGZpbGUgbmFtZWQgKmRzdCouCi0gICAqZHN0KiBtdXN0IGJlIHRoZSBjb21wbGV0ZSB0YXJnZXQgZmlsZSBuYW1lOyBsb29rIGF0IDpmdW5jOmBjb3B5YCBmb3IgYSBjb3B5IHRoYXQKLSAgIGFjY2VwdHMgYSB0YXJnZXQgZGlyZWN0b3J5IHBhdGguICBJZiAqc3JjKiBhbmQgKmRzdCogYXJlIHRoZSBzYW1lIGZpbGVzLAotICAgOmV4YzpgRXJyb3JgIGlzIHJhaXNlZC4KKyAgIENvcHkgdGhlIGNvbnRlbnRzIChubyBtZXRhZGF0YSkgb2YgdGhlIGZpbGUgbmFtZWQgKnNyYyogdG8gYSBmaWxlIG5hbWVkCisgICAqZHN0Ki4gICpkc3QqIG11c3QgYmUgdGhlIGNvbXBsZXRlIHRhcmdldCBmaWxlIG5hbWU7IGxvb2sgYXQKKyAgIDpmdW5jOmBzaHV0aWwuY29weWAgZm9yIGEgY29weSB0aGF0IGFjY2VwdHMgYSB0YXJnZXQgZGlyZWN0b3J5IHBhdGguICBJZgorICAgKnNyYyogYW5kICpkc3QqIGFyZSB0aGUgc2FtZSBmaWxlcywgOmV4YzpgRXJyb3JgIGlzIHJhaXNlZC4KICAgIFRoZSBkZXN0aW5hdGlvbiBsb2NhdGlvbiBtdXN0IGJlIHdyaXRhYmxlOyBvdGhlcndpc2UsICBhbiA6ZXhjOmBJT0Vycm9yYCBleGNlcHRpb24KICAgIHdpbGwgYmUgcmFpc2VkLiBJZiAqZHN0KiBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSByZXBsYWNlZC4gICBTcGVjaWFsIGZpbGVzCiAgICBzdWNoIGFzIGNoYXJhY3RlciBvciBibG9jayBkZXZpY2VzIGFuZCBwaXBlcyBjYW5ub3QgYmUgY29waWVkIHdpdGggdGhpcwpAQCAtODAsOSArODIsOSBAQAogCiAuLiBmdW5jdGlvbjo6IGNvcHkyKHNyYywgZHN0KQogCi0gICBTaW1pbGFyIHRvIDpmdW5jOmBjb3B5YCwgYnV0IG1ldGFkYXRhIGlzIGNvcGllZCBhcyB3ZWxsIC0tIGluIGZhY3QsIHRoaXMgaXMganVzdAotICAgOmZ1bmM6YGNvcHlgIGZvbGxvd2VkIGJ5IDpmdW5jOmBjb3B5c3RhdGAuICBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlCi0gICBVbml4IGNvbW1hbmQgOnByb2dyYW06YGNwIC1wYC4KKyAgIFNpbWlsYXIgdG8gOmZ1bmM6YHNodXRpbC5jb3B5YCwgYnV0IG1ldGFkYXRhIGlzIGNvcGllZCBhcyB3ZWxsIC0tIGluIGZhY3QsCisgICB0aGlzIGlzIGp1c3QgOmZ1bmM6YHNodXRpbC5jb3B5YCBmb2xsb3dlZCBieSA6ZnVuYzpgY29weXN0YXRgLiAgVGhpcyBpcworICAgc2ltaWxhciB0byB0aGUgVW5peCBjb21tYW5kIDpwcm9ncmFtOmBjcCAtcGAuCiAKIAogLi4gZnVuY3Rpb246OiBpZ25vcmVfcGF0dGVybnMoXCpwYXR0ZXJucykKQEAgLTk0LDEzICs5NiwxMyBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi42CiAKIAotLi4gZnVuY3Rpb246OiBjb3B5dHJlZShzcmMsIGRzdFssIHN5bWxpbmtzPUZhbHNlWywgaWdub3JlPU5vbmVdXSkKKy4uIGZ1bmN0aW9uOjogY29weXRyZWUoc3JjLCBkc3QsIHN5bWxpbmtzPUZhbHNlLCBpZ25vcmU9Tm9uZSkKIAogICAgUmVjdXJzaXZlbHkgY29weSBhbiBlbnRpcmUgZGlyZWN0b3J5IHRyZWUgcm9vdGVkIGF0ICpzcmMqLiAgVGhlIGRlc3RpbmF0aW9uCi0gICBkaXJlY3RvcnksIG5hbWVkIGJ5ICpkc3QqLCBtdXN0IG5vdCBhbHJlYWR5IGV4aXN0OyBpdCB3aWxsIGJlIGNyZWF0ZWQgYXMgd2VsbAotICAgYXMgbWlzc2luZyBwYXJlbnQgZGlyZWN0b3JpZXMuICBQZXJtaXNzaW9ucyBhbmQgdGltZXMgb2YgZGlyZWN0b3JpZXMgYXJlCi0gICBjb3BpZWQgd2l0aCA6ZnVuYzpgY29weXN0YXRgLCBpbmRpdmlkdWFsIGZpbGVzIGFyZSBjb3BpZWQgdXNpbmcKLSAgIDpmdW5jOmBjb3B5MmAuCisgICBkaXJlY3RvcnksIG5hbWVkIGJ5ICpkc3QqLCBtdXN0IG5vdCBhbHJlYWR5IGV4aXN0OyBpdCB3aWxsIGJlIGNyZWF0ZWQgYXMKKyAgIHdlbGwgYXMgbWlzc2luZyBwYXJlbnQgZGlyZWN0b3JpZXMuICBQZXJtaXNzaW9ucyBhbmQgdGltZXMgb2YgZGlyZWN0b3JpZXMKKyAgIGFyZSBjb3BpZWQgd2l0aCA6ZnVuYzpgY29weXN0YXRgLCBpbmRpdmlkdWFsIGZpbGVzIGFyZSBjb3BpZWQgdXNpbmcKKyAgIDpmdW5jOmBzaHV0aWwuY29weTJgLgogCiAgICBJZiAqc3ltbGlua3MqIGlzIHRydWUsIHN5bWJvbGljIGxpbmtzIGluIHRoZSBzb3VyY2UgdHJlZSBhcmUgcmVwcmVzZW50ZWQgYXMKICAgIHN5bWJvbGljIGxpbmtzIGluIHRoZSBuZXcgdHJlZSwgYnV0IHRoZSBtZXRhZGF0YSBvZiB0aGUgb3JpZ2luYWwgbGlua3MgaXMgTk9UCkBAIC0xNzAsOCArMTcyLDggQEAKICAgIDpmdW5jOmBvcy5yZW5hbWVgIHNlbWFudGljcy4KIAogICAgSWYgdGhlIGRlc3RpbmF0aW9uIGlzIG9uIHRoZSBjdXJyZW50IGZpbGVzeXN0ZW0sIHRoZW4gOmZ1bmM6YG9zLnJlbmFtZWAgaXMKLSAgIHVzZWQuICBPdGhlcndpc2UsICpzcmMqIGlzIGNvcGllZCAodXNpbmcgOmZ1bmM6YGNvcHkyYCkgdG8gKmRzdCogYW5kIHRoZW4KLSAgIHJlbW92ZWQuCisgICB1c2VkLiAgT3RoZXJ3aXNlLCAqc3JjKiBpcyBjb3BpZWQgKHVzaW5nIDpmdW5jOmBzaHV0aWwuY29weTJgKSB0byAqZHN0KiBhbmQKKyAgIHRoZW4gcmVtb3ZlZC4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4zCiAKQEAgLTE4NSw3ICsxODcsNyBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4zCiAKIAotLi4gX3NodXRpbC1leGFtcGxlOgorLi4gX2NvcHl0cmVlLWV4YW1wbGU6CiAKIGNvcHl0cmVlIGV4YW1wbGUKIDo6Ojo6Ojo6Ojo6Ojo6OjoKQEAgLTIxNywxOCArMjE5LDE4IEBACiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGNvcHkyKHNyY25hbWUsIGRzdG5hbWUpCiAgICAgICAgICAgICAgICAjIFhYWCBXaGF0IGFib3V0IGRldmljZXMsIHNvY2tldHMgZXRjLj8KLSAgICAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBvcy5lcnJvciksIHdoeToKKyAgICAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBvcy5lcnJvcikgYXMgd2h5OgogICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgoc3JjbmFtZSwgZHN0bmFtZSwgc3RyKHdoeSkpKQogICAgICAgICAgICAjIGNhdGNoIHRoZSBFcnJvciBmcm9tIHRoZSByZWN1cnNpdmUgY29weXRyZWUgc28gdGhhdCB3ZSBjYW4KICAgICAgICAgICAgIyBjb250aW51ZSB3aXRoIG90aGVyIGZpbGVzCi0gICAgICAgICAgIGV4Y2VwdCBFcnJvciwgZXJyOgorICAgICAgICAgICBleGNlcHQgRXJyb3IgYXMgZXJyOgogICAgICAgICAgICAgICAgZXJyb3JzLmV4dGVuZChlcnIuYXJnc1swXSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvcHlzdGF0KHNyYywgZHN0KQogICAgICAgIGV4Y2VwdCBXaW5kb3dzRXJyb3I6CiAgICAgICAgICAgICMgY2FuJ3QgY29weSBmaWxlIGFjY2VzcyB0aW1lcyBvbiBXaW5kb3dzCiAgICAgICAgICAgIHBhc3MKLSAgICAgICBleGNlcHQgT1NFcnJvciwgd2h5OgorICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIHdoeToKICAgICAgICAgICAgZXJyb3JzLmV4dGVuZCgoc3JjLCBkc3QsIHN0cih3aHkpKSkKICAgICAgICBpZiBlcnJvcnM6CiAgICAgICAgICAgIHJhaXNlIEVycm9yKGVycm9ycykKQEAgLTI1NCw4ICsyNTYsMTMgQEAKICAgIGNvcHl0cmVlKHNvdXJjZSwgZGVzdGluYXRpb24sIGlnbm9yZT1fbG9ncGF0aCkKIAogCi1BcmNoaXZlcyBvcGVyYXRpb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0tCisuLiBfYXJjaGl2aW5nLW9wZXJhdGlvbnM6CisKK0FyY2hpdmluZyBvcGVyYXRpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitIaWdoLWxldmVsIHV0aWxpdGllcyB0byBjcmVhdGUgYW5kIHJlYWQgY29tcHJlc3NlZCBhbmQgYXJjaGl2ZWQgZmlsZXMgYXJlIGFsc28KK3Byb3ZpZGVkLiAgVGhleSByZWx5IG9uIHRoZSA6bW9kOmB6aXBmaWxlYCBhbmQgOm1vZDpgdGFyZmlsZWAgbW9kdWxlcy4KIAogLi4gZnVuY3Rpb246OiBtYWtlX2FyY2hpdmUoYmFzZV9uYW1lLCBmb3JtYXQsIFtyb290X2RpciwgW2Jhc2VfZGlyLCBbdmVyYm9zZSwgW2RyeV9ydW4sIFtvd25lciwgW2dyb3VwLCBbbG9nZ2VyXV1dXV1dXSkKIApAQCAtMjc4LDcgKzI4NSw4IEBACiAgICAqb3duZXIqIGFuZCAqZ3JvdXAqIGFyZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSB0YXIgYXJjaGl2ZS4gQnkgZGVmYXVsdCwKICAgIHVzZXMgdGhlIGN1cnJlbnQgb3duZXIgYW5kIGdyb3VwLgogCi0gICAqbG9nZ2VyKiBpcyBhbiBpbnN0YW5jZSBvZiA6Y2xhc3M6YGxvZ2dpbmcuTG9nZ2VyYC4KKyAgICpsb2dnZXIqIG11c3QgYmUgYW4gb2JqZWN0IGNvbXBhdGlibGUgd2l0aCA6cGVwOmAyODJgLCB1c3VhbGx5IGFuIGluc3RhbmNlIG9mCisgICA6Y2xhc3M6YGxvZ2dpbmcuTG9nZ2VyYC4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi43CiAKQEAgLTMyMiw2ICszMzAsOCBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi43CiAKIAorLi4gX2FyY2hpdmluZy1leGFtcGxlOgorCiBBcmNoaXZpbmcgZXhhbXBsZQogOjo6Ojo6Ojo6Ojo6Ojo6OjoKIApAQCAtMzQ2LDUgKzM1NiwzIEBACiAgICAgLXJ3LS0tLS0tLSB0YXJlay9zdGFmZiAgICAxNjc1IDIwMDgtMDYtMDkgMTM6MjY6NTQgLi9pZF9yc2EKICAgICAtcnctci0tci0tIHRhcmVrL3N0YWZmICAgICAzOTcgMjAwOC0wNi0wOSAxMzoyNjo1NCAuL2lkX3JzYS5wdWIKICAgICAtcnctci0tci0tIHRhcmVrL3N0YWZmICAgMzcxOTIgMjAxMC0wMi0wNiAxODoyMzoxMCAuL2tub3duX2hvc3RzCi0KLQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc2lnbmFsLnJzdCBiL0RvYy9saWJyYXJ5L3NpZ25hbC5yc3QKaW5kZXggOTIyOTExNy4uMjlkNTZmYyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc2lnbmFsLnJzdAorKysgYi9Eb2MvbGlicmFyeS9zaWduYWwucnN0CkBAIC02OSw3ICs2OSw3IEBACiAgICBBbGwgdGhlIHNpZ25hbCBudW1iZXJzIGFyZSBkZWZpbmVkIHN5bWJvbGljYWxseS4gIEZvciBleGFtcGxlLCB0aGUgaGFuZ3VwIHNpZ25hbAogICAgaXMgZGVmaW5lZCBhcyA6Y29uc3Q6YHNpZ25hbC5TSUdIVVBgOyB0aGUgdmFyaWFibGUgbmFtZXMgYXJlIGlkZW50aWNhbCB0byB0aGUKICAgIG5hbWVzIHVzZWQgaW4gQyBwcm9ncmFtcywgYXMgZm91bmQgaW4gYGA8c2lnbmFsLmg+YGAuIFRoZSBVbml4IG1hbiBwYWdlIGZvcgotICAgJzpjZnVuYzpgc2lnbmFsYCcgbGlzdHMgdGhlIGV4aXN0aW5nIHNpZ25hbHMgKG9uIHNvbWUgc3lzdGVtcyB0aGlzIGlzCisgICAnOmM6ZnVuYzpgc2lnbmFsYCcgbGlzdHMgdGhlIGV4aXN0aW5nIHNpZ25hbHMgKG9uIHNvbWUgc3lzdGVtcyB0aGlzIGlzCiAgICA6bWFucGFnZTpgc2lnbmFsKDIpYCwgb24gb3RoZXJzIHRoZSBsaXN0IGlzIGluIDptYW5wYWdlOmBzaWduYWwoNylgKS4gTm90ZSB0aGF0CiAgICBub3QgYWxsIHN5c3RlbXMgZGVmaW5lIHRoZSBzYW1lIHNldCBvZiBzaWduYWwgbmFtZXM7IG9ubHkgdGhvc2UgbmFtZXMgZGVmaW5lZCBieQogICAgdGhlIHN5c3RlbSBhcmUgZGVmaW5lZCBieSB0aGlzIG1vZHVsZS4KQEAgLTIxNiw3ICsyMTYsNyBAQAogCiAgICBOb3RlIHRoYXQgaW5zdGFsbGluZyBhIHNpZ25hbCBoYW5kbGVyIHdpdGggOmZ1bmM6YHNpZ25hbGAgd2lsbCByZXNldCB0aGUKICAgIHJlc3RhcnQgYmVoYXZpb3VyIHRvIGludGVycnVwdGlibGUgYnkgaW1wbGljaXRseSBjYWxsaW5nCi0gICA6Y2Z1bmM6YHNpZ2ludGVycnVwdGAgd2l0aCBhIHRydWUgKmZsYWcqIHZhbHVlIGZvciB0aGUgZ2l2ZW4gc2lnbmFsLgorICAgOmM6ZnVuYzpgc2lnaW50ZXJydXB0YCB3aXRoIGEgdHJ1ZSAqZmxhZyogdmFsdWUgZm9yIHRoZSBnaXZlbiBzaWduYWwuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zaW1wbGVodHRwc2VydmVyLnJzdCBiL0RvYy9saWJyYXJ5L3NpbXBsZWh0dHBzZXJ2ZXIucnN0CmluZGV4IGE5MmM3YzkuLjJlN2U5N2EgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3NpbXBsZWh0dHBzZXJ2ZXIucnN0CisrKyBiL0RvYy9saWJyYXJ5L3NpbXBsZWh0dHBzZXJ2ZXIucnN0CkBAIC04LDggKzgsOCBAQAogCiAuLiBub3RlOjoKICAgIFRoZSA6bW9kOmBTaW1wbGVIVFRQU2VydmVyYCBtb2R1bGUgaGFzIGJlZW4gbWVyZ2VkIGludG8gOm1vZDpgaHR0cC5zZXJ2ZXJgIGluCi0gICBQeXRob24gMy4wLiAgVGhlIDp0ZXJtOmAydG8zYCB0b29sIHdpbGwgYXV0b21hdGljYWxseSBhZGFwdCBpbXBvcnRzIHdoZW4KLSAgIGNvbnZlcnRpbmcgeW91ciBzb3VyY2VzIHRvIDMuMC4KKyAgIFB5dGhvbiAzLiAgVGhlIDp0ZXJtOmAydG8zYCB0b29sIHdpbGwgYXV0b21hdGljYWxseSBhZGFwdCBpbXBvcnRzIHdoZW4KKyAgIGNvbnZlcnRpbmcgeW91ciBzb3VyY2VzIHRvIFB5dGhvbiAzLgogCiAKIFRoZSA6bW9kOmBTaW1wbGVIVFRQU2VydmVyYCBtb2R1bGUgZGVmaW5lcyBhIHNpbmdsZSBjbGFzcywKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3NpbXBsZXhtbHJwY3NlcnZlci5yc3QgYi9Eb2MvbGlicmFyeS9zaW1wbGV4bWxycGNzZXJ2ZXIucnN0CmluZGV4IDM2MTg3MjguLjhmODA1ZTkgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3NpbXBsZXhtbHJwY3NlcnZlci5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc2ltcGxleG1scnBjc2VydmVyLnJzdApAQCAtOCw4ICs4LDggQEAKIAogLi4gbm90ZTo6CiAgICBUaGUgOm1vZDpgU2ltcGxlWE1MUlBDU2VydmVyYCBtb2R1bGUgaGFzIGJlZW4gbWVyZ2VkIGludG8KLSAgIDptb2Q6YHhtbHJwYy5zZXJ2ZXJgIGluIFB5dGhvbiAzLjAuICBUaGUgOnRlcm06YDJ0bzNgIHRvb2wgd2lsbCBhdXRvbWF0aWNhbGx5Ci0gICBhZGFwdCBpbXBvcnRzIHdoZW4gY29udmVydGluZyB5b3VyIHNvdXJjZXMgdG8gMy4wLgorICAgOm1vZDpgeG1scnBjLnNlcnZlcmAgaW4gUHl0aG9uIDMuICBUaGUgOnRlcm06YDJ0bzNgIHRvb2wgd2lsbCBhdXRvbWF0aWNhbGx5CisgICBhZGFwdCBpbXBvcnRzIHdoZW4gY29udmVydGluZyB5b3VyIHNvdXJjZXMgdG8gUHl0aG9uIDMuCiAKIAogLi4gdmVyc2lvbmFkZGVkOjogMi4yCkBAIC0xOTcsNiArMTk3LDM4IEBACiAgICAjIFByaW50IGxpc3Qgb2YgYXZhaWxhYmxlIG1ldGhvZHMKICAgIHByaW50IHMuc3lzdGVtLmxpc3RNZXRob2RzKCkKIAorVGhlIGZvbGxvd2luZyA6Y2xhc3M6YFNpbXBsZVhNTFJQQ1NlcnZlcmAgZXhhbXBsZSBpcyBpbmNsdWRlZCBpbiB0aGUgbW9kdWxlCitgTGliL1NpbXBsZVhNTFJQQ1NlcnZlci5weWA6OgorCisgICAgc2VydmVyID0gU2ltcGxlWE1MUlBDU2VydmVyKCgibG9jYWxob3N0IiwgODAwMCkpCisgICAgc2VydmVyLnJlZ2lzdGVyX2Z1bmN0aW9uKHBvdykKKyAgICBzZXJ2ZXIucmVnaXN0ZXJfZnVuY3Rpb24obGFtYmRhIHgseTogeCt5LCAnYWRkJykKKyAgICBzZXJ2ZXIucmVnaXN0ZXJfbXVsdGljYWxsX2Z1bmN0aW9ucygpCisgICAgc2VydmVyLnNlcnZlX2ZvcmV2ZXIoKQorCitUaGlzIGRlbW8gc2VydmVyIGNhbiBiZSBydW4gZnJvbSB0aGUgY29tbWFuZCBsaW5lIGFzOjoKKworICAgIHB5dGhvbiAtbSBTaW1wbGVYTUxSUENTZXJ2ZXIKKworRXhhbXBsZSBjbGllbnQgY29kZSB3aGljaCB0YWxrcyB0byB0aGUgYWJvdmUgc2VydmVyIGlzIGluY2x1ZGVkIHdpdGgKK2BMaWIveG1scnBjbGliLnB5YDo6CisKKyAgICBzZXJ2ZXIgPSBTZXJ2ZXJQcm94eSgiaHR0cDovL2xvY2FsaG9zdDo4MDAwIikKKyAgICBwcmludCBzZXJ2ZXIKKyAgICBtdWx0aSA9IE11bHRpQ2FsbChzZXJ2ZXIpCisgICAgbXVsdGkucG93KDIsIDkpCisgICAgbXVsdGkuYWRkKDUsIDEpCisgICAgbXVsdGkuYWRkKDI0LCAxMSkKKyAgICB0cnk6CisgICAgICAgIGZvciByZXNwb25zZSBpbiBtdWx0aSgpOgorICAgICAgICAgICAgcHJpbnQgcmVzcG9uc2UKKyAgICBleGNlcHQgRXJyb3IsIHY6CisgICAgICAgIHByaW50ICJFUlJPUiIsIHYKKworQW5kIHRoZSBjbGllbnQgY2FuIGJlIGludm9rZWQgZGlyZWN0bHkgdXNpbmcgdGhlIGZvbGxvd2luZyBjb21tYW5kOjoKKworICAgIHB5dGhvbiAtbSB4bWxycGNsaWIKKwogCiBDR0lYTUxSUENSZXF1ZXN0SGFuZGxlcgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTI0Nyw3ICsyNzksNyBAQAogRXhhbXBsZTo6CiAKICAgIGNsYXNzIE15RnVuY3M6Ci0gICAgICAgZGVmIGRpdihzZWxmLCB4LCB5KSA6IHJldHVybiB4IC8vIHkKKyAgICAgICBkZWYgZGl2KHNlbGYsIHgsIHkpOiByZXR1cm4geCAvLyB5CiAKIAogICAgaGFuZGxlciA9IENHSVhNTFJQQ1JlcXVlc3RIYW5kbGVyKCkKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3NpdGUucnN0IGIvRG9jL2xpYnJhcnkvc2l0ZS5yc3QKaW5kZXggYzBmYWZlZC4uZmY3MTk1ZCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc2l0ZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc2l0ZS5yc3QKQEAgLTI2LDcgKzI2LDcgQEAKIEZvciB0aGUgaGVhZCBwYXJ0LCBpdCB1c2VzIGBgc3lzLnByZWZpeGBgIGFuZCBgYHN5cy5leGVjX3ByZWZpeGBgOyBlbXB0eSBoZWFkcwogYXJlIHNraXBwZWQuICBGb3IgdGhlIHRhaWwgcGFydCwgaXQgdXNlcyB0aGUgZW1wdHkgc3RyaW5nIGFuZCB0aGVuCiA6ZmlsZTpgbGliL3NpdGUtcGFja2FnZXNgIChvbiBXaW5kb3dzKSBvcgotOmZpbGU6YGxpYi9weXRob258dmVyc2lvbnwvc2l0ZS1wYWNrYWdlc2AgYW5kIHRoZW4gOmZpbGU6YGxpYi9zaXRlLXB5dGhvbmAgKG9uCis6ZmlsZTpgbGliL3B5dGhvbntYLll9L3NpdGUtcGFja2FnZXNgIGFuZCB0aGVuIDpmaWxlOmBsaWIvc2l0ZS1weXRob25gIChvbgogVW5peCBhbmQgTWFjaW50b3NoKS4gIEZvciBlYWNoIG9mIHRoZSBkaXN0aW5jdCBoZWFkLXRhaWwgY29tYmluYXRpb25zLCBpdCBzZWVzCiBpZiBpdCByZWZlcnMgdG8gYW4gZXhpc3RpbmcgZGlyZWN0b3J5LCBhbmQgaWYgc28sIGFkZHMgaXQgdG8gYGBzeXMucGF0aGBgIGFuZAogYWxzbyBpbnNwZWN0cyB0aGUgbmV3bHkgYWRkZWQgcGF0aCBmb3IgY29uZmlndXJhdGlvbiBmaWxlcy4KQEAgLTgzLDcgKzgzLDExIEBACiA6bW9kOmBzaXRlY3VzdG9taXplYCwgd2hpY2ggY2FuIHBlcmZvcm0gYXJiaXRyYXJ5IHNpdGUtc3BlY2lmaWMgY3VzdG9taXphdGlvbnMuCiBJdCBpcyB0eXBpY2FsbHkgY3JlYXRlZCBieSBhIHN5c3RlbSBhZG1pbmlzdHJhdG9yIGluIHRoZSBzaXRlLXBhY2thZ2VzCiBkaXJlY3RvcnkuICBJZiB0aGlzIGltcG9ydCBmYWlscyB3aXRoIGFuIDpleGM6YEltcG9ydEVycm9yYCBleGNlcHRpb24sIGl0IGlzCi1zaWxlbnRseSBpZ25vcmVkLgorc2lsZW50bHkgaWdub3JlZC4gIElmIFB5dGhvbiBpcyBzdGFydGVkIHdpdGhvdXQgb3V0cHV0IHN0cmVhbXMgYXZhaWxhYmxlLCBhcword2l0aCA6ZmlsZTpgcHl0aG9udy5leGVgIG9uIFdpbmRvd3MgKHdoaWNoIGlzIHVzZWQgYnkgZGVmYXVsdCB0byBzdGFydCBJRExFKSwKK2F0dGVtcHRlZCBvdXRwdXQgZnJvbSA6bW9kOmBzaXRlY3VzdG9taXplYCBpcyBpZ25vcmVkLiBBbnkgZXhjZXB0aW9uIG90aGVyCit0aGFuIDpleGM6YEltcG9ydEVycm9yYCBjYXVzZXMgYSBzaWxlbnQgYW5kIHBlcmhhcHMgbXlzdGVyaW91cyBmYWlsdXJlIG9mIHRoZQorcHJvY2Vzcy4KIAogLi4gaW5kZXg6OiBtb2R1bGU6IHVzZXJjdXN0b21pemUKIApAQCAtMTgxLDggKzE4NSw4IEBACiAKIC4uIGNvZGUtYmxvY2s6OiBzaAogCi0gICAkIHB5dGhvbjMgLW0gc2l0ZSAtLXVzZXItc2l0ZQotICAgL2hvbWUvdXNlci8ubG9jYWwvbGliL3B5dGhvbjMuMy9zaXRlLXBhY2thZ2VzCisgICAkIHB5dGhvbiAtbSBzaXRlIC0tdXNlci1zaXRlCisgICAvaG9tZS91c2VyLy5sb2NhbC9saWIvcHl0aG9uMi43L3NpdGUtcGFja2FnZXMKIAogLi4gcHJvZ3JhbTo6IHNpdGUKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc210cGxpYi5yc3QgYi9Eb2MvbGlicmFyeS9zbXRwbGliLnJzdAppbmRleCBiMGI1OGU4Li41YjI4MDhkIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9zbXRwbGliLnJzdAorKysgYi9Eb2MvbGlicmFyeS9zbXRwbGliLnJzdApAQCAtMjQsMTUgKzI0LDIwIEBACiAKICAgIEEgOmNsYXNzOmBTTVRQYCBpbnN0YW5jZSBlbmNhcHN1bGF0ZXMgYW4gU01UUCBjb25uZWN0aW9uLiAgSXQgaGFzIG1ldGhvZHMKICAgIHRoYXQgc3VwcG9ydCBhIGZ1bGwgcmVwZXJ0b2lyZSBvZiBTTVRQIGFuZCBFU01UUCBvcGVyYXRpb25zLiBJZiB0aGUgb3B0aW9uYWwKLSAgIGhvc3QgYW5kIHBvcnQgcGFyYW1ldGVycyBhcmUgZ2l2ZW4sIHRoZSBTTVRQIDptZXRoOmBjb25uZWN0YCBtZXRob2QgaXMgY2FsbGVkCi0gICB3aXRoIHRob3NlIHBhcmFtZXRlcnMgZHVyaW5nIGluaXRpYWxpemF0aW9uLiAgQW4gOmV4YzpgU01UUENvbm5lY3RFcnJvcmAgaXMKLSAgIHJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIGhvc3QgZG9lc24ndCByZXNwb25kIGNvcnJlY3RseS4gVGhlIG9wdGlvbmFsCisgICBob3N0IGFuZCBwb3J0IHBhcmFtZXRlcnMgYXJlIGdpdmVuLCB0aGUgU01UUCA6bWV0aDpgY29ubmVjdGAgbWV0aG9kIGlzCisgICBjYWxsZWQgd2l0aCB0aG9zZSBwYXJhbWV0ZXJzIGR1cmluZyBpbml0aWFsaXphdGlvbi4gIElmIHNwZWNpZmllZCwKKyAgICpsb2NhbF9ob3N0bmFtZSogaXMgdXNlZCBhcyB0aGUgRlFETiBvZiB0aGUgbG9jYWwgaG9zdCBpbiB0aGUgSEVMTy9FSExPCisgICBjb21tYW5kLiAgT3RoZXJ3aXNlLCB0aGUgbG9jYWwgaG9zdG5hbWUgaXMgZm91bmQgdXNpbmcKKyAgIDpmdW5jOmBzb2NrZXQuZ2V0ZnFkbmAuICBJZiB0aGUgOm1ldGg6YGNvbm5lY3RgIGNhbGwgcmV0dXJucyBhbnl0aGluZyBvdGhlcgorICAgdGhhbiBhIHN1Y2Nlc3MgY29kZSwgYW4gOmV4YzpgU01UUENvbm5lY3RFcnJvcmAgaXMgcmFpc2VkLiBUaGUgb3B0aW9uYWwKICAgICp0aW1lb3V0KiBwYXJhbWV0ZXIgc3BlY2lmaWVzIGEgdGltZW91dCBpbiBzZWNvbmRzIGZvciBibG9ja2luZyBvcGVyYXRpb25zCiAgICBsaWtlIHRoZSBjb25uZWN0aW9uIGF0dGVtcHQgKGlmIG5vdCBzcGVjaWZpZWQsIHRoZSBnbG9iYWwgZGVmYXVsdCB0aW1lb3V0Ci0gICBzZXR0aW5nIHdpbGwgYmUgdXNlZCkuCisgICBzZXR0aW5nIHdpbGwgYmUgdXNlZCkuICBJZiB0aGUgdGltZW91dCBleHBpcmVzLCA6ZXhjOmBzb2NrZXQudGltZW91dGAKKyAgIGlzIHJhaXNlZC4KIAogICAgRm9yIG5vcm1hbCB1c2UsIHlvdSBzaG91bGQgb25seSByZXF1aXJlIHRoZSBpbml0aWFsaXphdGlvbi9jb25uZWN0LAotICAgOm1ldGg6YHNlbmRtYWlsYCwgYW5kIDptZXRoOmBxdWl0YCBtZXRob2RzLiAgQW4gZXhhbXBsZSBpcyBpbmNsdWRlZCBiZWxvdy4KKyAgIDptZXRoOmBzZW5kbWFpbGAsIGFuZCA6bWV0aDpgfnNtdHBsaWIucXVpdGAgbWV0aG9kcy4KKyAgIEFuIGV4YW1wbGUgaXMgaW5jbHVkZWQgYmVsb3cuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi42CiAgICAgICAqdGltZW91dCogd2FzIGFkZGVkLgpAQCAtNDQsMTIgKzQ5LDE0IEBACiAgICA6Y2xhc3M6YFNNVFBgLiA6Y2xhc3M6YFNNVFBfU1NMYCBzaG91bGQgYmUgdXNlZCBmb3Igc2l0dWF0aW9ucyB3aGVyZSBTU0wgaXMKICAgIHJlcXVpcmVkIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29ubmVjdGlvbiBhbmQgdXNpbmcgOm1ldGg6YHN0YXJ0dGxzYCBpcwogICAgbm90IGFwcHJvcHJpYXRlLiBJZiAqaG9zdCogaXMgbm90IHNwZWNpZmllZCwgdGhlIGxvY2FsIGhvc3QgaXMgdXNlZC4gSWYKLSAgICpwb3J0KiBpcyBvbWl0dGVkLCB0aGUgc3RhbmRhcmQgU01UUC1vdmVyLVNTTCBwb3J0ICg0NjUpIGlzIHVzZWQuICprZXlmaWxlKgotICAgYW5kICpjZXJ0ZmlsZSogYXJlIGFsc28gb3B0aW9uYWwsIGFuZCBjYW4gY29udGFpbiBhIFBFTSBmb3JtYXR0ZWQgcHJpdmF0ZSBrZXkKLSAgIGFuZCBjZXJ0aWZpY2F0ZSBjaGFpbiBmaWxlIGZvciB0aGUgU1NMIGNvbm5lY3Rpb24uIFRoZSBvcHRpb25hbCAqdGltZW91dCoKLSAgIHBhcmFtZXRlciBzcGVjaWZpZXMgYSB0aW1lb3V0IGluIHNlY29uZHMgZm9yIGJsb2NraW5nIG9wZXJhdGlvbnMgbGlrZSB0aGUKLSAgIGNvbm5lY3Rpb24gYXR0ZW1wdCAoaWYgbm90IHNwZWNpZmllZCwgdGhlIGdsb2JhbCBkZWZhdWx0IHRpbWVvdXQgc2V0dGluZwotICAgd2lsbCBiZSB1c2VkKS4KKyAgICpwb3J0KiBpcyBvbWl0dGVkLCB0aGUgc3RhbmRhcmQgU01UUC1vdmVyLVNTTCBwb3J0ICg0NjUpIGlzIHVzZWQuCisgICAqbG9jYWxfaG9zdG5hbWUqIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIGl0IGRvZXMgZm9yIHRoZSA6Y2xhc3M6YFNNVFBgCisgICBjbGFzcy4gICprZXlmaWxlKiBhbmQgKmNlcnRmaWxlKiBhcmUgYWxzbyBvcHRpb25hbCwgYW5kIGNhbiBjb250YWluIGEgUEVNCisgICBmb3JtYXR0ZWQgcHJpdmF0ZSBrZXkgYW5kIGNlcnRpZmljYXRlIGNoYWluIGZpbGUgZm9yIHRoZSBTU0wgY29ubmVjdGlvbi4gVGhlCisgICBvcHRpb25hbCAqdGltZW91dCogcGFyYW1ldGVyIHNwZWNpZmllcyBhIHRpbWVvdXQgaW4gc2Vjb25kcyBmb3IgYmxvY2tpbmcKKyAgIG9wZXJhdGlvbnMgbGlrZSB0aGUgY29ubmVjdGlvbiBhdHRlbXB0IChpZiBub3Qgc3BlY2lmaWVkLCB0aGUgZ2xvYmFsIGRlZmF1bHQKKyAgIHRpbWVvdXQgc2V0dGluZyB3aWxsIGJlIHVzZWQpLiAgSWYgdGhlIHRpbWVvdXQgZXhwaXJlcywgOmV4Yzpgc29ja2V0LnRpbWVvdXRgCisgICBpcyByYWlzZWQuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNgogCkBAIC01NywxMyArNjQsMTUgQEAKIC4uIGNsYXNzOjogTE1UUChbaG9zdFssIHBvcnRbLCBsb2NhbF9ob3N0bmFtZV1dXSkKIAogICAgVGhlIExNVFAgcHJvdG9jb2wsIHdoaWNoIGlzIHZlcnkgc2ltaWxhciB0byBFU01UUCwgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUKLSAgIHN0YW5kYXJkIFNNVFAgY2xpZW50LiBJdCdzIGNvbW1vbiB0byB1c2UgVW5peCBzb2NrZXRzIGZvciBMTVRQLCBzbyBvdXIgOm1ldGg6YGNvbm5lY3RgCi0gICBtZXRob2QgbXVzdCBzdXBwb3J0IHRoYXQgYXMgd2VsbCBhcyBhIHJlZ3VsYXIgaG9zdDpwb3J0IHNlcnZlci4gVG8gc3BlY2lmeSBhCi0gICBVbml4IHNvY2tldCwgeW91IG11c3QgdXNlIGFuIGFic29sdXRlIHBhdGggZm9yICpob3N0Kiwgc3RhcnRpbmcgd2l0aCBhICcvJy4KKyAgIHN0YW5kYXJkIFNNVFAgY2xpZW50LiBJdCdzIGNvbW1vbiB0byB1c2UgVW5peCBzb2NrZXRzIGZvciBMTVRQLCBzbyBvdXIKKyAgIDptZXRoOmBjb25uZWN0YCBtZXRob2QgbXVzdCBzdXBwb3J0IHRoYXQgYXMgd2VsbCBhcyBhIHJlZ3VsYXIgaG9zdDpwb3J0CisgICBzZXJ2ZXIuICAqbG9jYWxfaG9zdG5hbWUqIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIGl0IGRvZXMgZm9yIHRoZQorICAgOmNsYXNzOmBTTVRQYCBjbGFzcy4gIFRvIHNwZWNpZnkgYSBVbml4IHNvY2tldCwgeW91IG11c3QgdXNlIGFuIGFic29sdXRlCisgICBwYXRoIGZvciAqaG9zdCosIHN0YXJ0aW5nIHdpdGggYSAnLycuCiAKLSAgIEF1dGhlbnRpY2F0aW9uIGlzIHN1cHBvcnRlZCwgdXNpbmcgdGhlIHJlZ3VsYXIgU01UUCBtZWNoYW5pc20uIFdoZW4gdXNpbmcgYSBVbml4Ci0gICBzb2NrZXQsIExNVFAgZ2VuZXJhbGx5IGRvbid0IHN1cHBvcnQgb3IgcmVxdWlyZSBhbnkgYXV0aGVudGljYXRpb24sIGJ1dCB5b3VyCi0gICBtaWxlYWdlIG1pZ2h0IHZhcnkuCisgICBBdXRoZW50aWNhdGlvbiBpcyBzdXBwb3J0ZWQsIHVzaW5nIHRoZSByZWd1bGFyIFNNVFAgbWVjaGFuaXNtLiBXaGVuIHVzaW5nIGEKKyAgIFVuaXggc29ja2V0LCBMTVRQIGdlbmVyYWxseSBkb24ndCBzdXBwb3J0IG9yIHJlcXVpcmUgYW55IGF1dGhlbnRpY2F0aW9uLCBidXQKKyAgIHlvdXIgbWlsZWFnZSBtaWdodCB2YXJ5LgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjYKIApAQCAtNzIsNyArODEsOCBAQAogCiAuLiBleGNlcHRpb246OiBTTVRQRXhjZXB0aW9uCiAKLSAgIEJhc2UgZXhjZXB0aW9uIGNsYXNzIGZvciBhbGwgZXhjZXB0aW9ucyByYWlzZWQgYnkgdGhpcyBtb2R1bGUuCisgICBUaGUgYmFzZSBleGNlcHRpb24gY2xhc3MgZm9yIGFsbCB0aGUgb3RoZXIgZXhjZXB0aW9ucyBwcm92aWRlZCBieSB0aGlzCisgICBtb2R1bGUuCiAKIAogLi4gZXhjZXB0aW9uOjogU01UUFNlcnZlckRpc2Nvbm5lY3RlZApAQCAtMTUxLDE1ICsxNjEsNiBAQAogICAgZm9yIGNvbm5lY3Rpb24gYW5kIGZvciBhbGwgbWVzc2FnZXMgc2VudCB0byBhbmQgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyLgogCiAKLS4uIG1ldGhvZDo6IFNNVFAuY29ubmVjdChbaG9zdFssIHBvcnRdXSkKLQotICAgQ29ubmVjdCB0byBhIGhvc3Qgb24gYSBnaXZlbiBwb3J0LiAgVGhlIGRlZmF1bHRzIGFyZSB0byBjb25uZWN0IHRvIHRoZSBsb2NhbAotICAgaG9zdCBhdCB0aGUgc3RhbmRhcmQgU01UUCBwb3J0ICgyNSkuIElmIHRoZSBob3N0bmFtZSBlbmRzIHdpdGggYSBjb2xvbiAoYGAnOidgYCkKLSAgIGZvbGxvd2VkIGJ5IGEgbnVtYmVyLCB0aGF0IHN1ZmZpeCB3aWxsIGJlIHN0cmlwcGVkIG9mZiBhbmQgdGhlIG51bWJlcgotICAgaW50ZXJwcmV0ZWQgYXMgdGhlIHBvcnQgbnVtYmVyIHRvIHVzZS4gVGhpcyBtZXRob2QgaXMgYXV0b21hdGljYWxseSBpbnZva2VkIGJ5Ci0gICB0aGUgY29uc3RydWN0b3IgaWYgYSBob3N0IGlzIHNwZWNpZmllZCBkdXJpbmcgaW5zdGFudGlhdGlvbi4KLQotCiAuLiBtZXRob2Q6OiBTTVRQLmRvY21kKGNtZCwgWywgYXJnc3RyaW5nXSkKIAogICAgU2VuZCBhIGNvbW1hbmQgKmNtZCogdG8gdGhlIHNlcnZlci4gIFRoZSBvcHRpb25hbCBhcmd1bWVudCAqYXJnc3RyaW5nKiBpcyBzaW1wbHkKQEAgLTE3Niw2ICsxNzcsMTcgQEAKICAgIDpleGM6YFNNVFBTZXJ2ZXJEaXNjb25uZWN0ZWRgIHdpbGwgYmUgcmFpc2VkLgogCiAKKy4uIG1ldGhvZDo6IFNNVFAuY29ubmVjdChbaG9zdFssIHBvcnRdXSkKKworICAgQ29ubmVjdCB0byBhIGhvc3Qgb24gYSBnaXZlbiBwb3J0LiAgVGhlIGRlZmF1bHRzIGFyZSB0byBjb25uZWN0IHRvIHRoZSBsb2NhbAorICAgaG9zdCBhdCB0aGUgc3RhbmRhcmQgU01UUCBwb3J0ICgyNSkuIElmIHRoZSBob3N0bmFtZSBlbmRzIHdpdGggYSBjb2xvbiAoYGAnOidgYCkKKyAgIGZvbGxvd2VkIGJ5IGEgbnVtYmVyLCB0aGF0IHN1ZmZpeCB3aWxsIGJlIHN0cmlwcGVkIG9mZiBhbmQgdGhlIG51bWJlcgorICAgaW50ZXJwcmV0ZWQgYXMgdGhlIHBvcnQgbnVtYmVyIHRvIHVzZS4gVGhpcyBtZXRob2QgaXMgYXV0b21hdGljYWxseSBpbnZva2VkIGJ5CisgICB0aGUgY29uc3RydWN0b3IgaWYgYSBob3N0IGlzIHNwZWNpZmllZCBkdXJpbmcgaW5zdGFudGlhdGlvbi4gIFJldHVybnMgYQorICAgMi10dXBsZSBvZiB0aGUgcmVzcG9uc2UgY29kZSBhbmQgbWVzc2FnZSBzZW50IGJ5IHRoZSBzZXJ2ZXIgaW4gaXRzCisgICBjb25uZWN0aW9uIHJlc3BvbnNlLgorCisKIC4uIG1ldGhvZDo6IFNNVFAuaGVsbyhbaG9zdG5hbWVdKQogCiAgICBJZGVudGlmeSB5b3Vyc2VsZiB0byB0aGUgU01UUCBzZXJ2ZXIgdXNpbmcgYGBIRUxPYGAuICBUaGUgaG9zdG5hbWUgYXJndW1lbnQKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3NvY2tldC5yc3QgYi9Eb2MvbGlicmFyeS9zb2NrZXQucnN0CmluZGV4IDNmY2U1ODcuLmY2YzcxMWUgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3NvY2tldC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc29ja2V0LnJzdApAQCAtMjgsNyArMjgsNyBAQAogCiBUaGUgUHl0aG9uIGludGVyZmFjZSBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCB0cmFuc2xpdGVyYXRpb24gb2YgdGhlIFVuaXggc3lzdGVtCiBjYWxsIGFuZCBsaWJyYXJ5IGludGVyZmFjZSBmb3Igc29ja2V0cyB0byBQeXRob24ncyBvYmplY3Qtb3JpZW50ZWQgc3R5bGU6IHRoZQotOmZ1bmM6YHNvY2tldGAgZnVuY3Rpb24gcmV0dXJucyBhIDpkZm46YHNvY2tldCBvYmplY3RgIHdob3NlIG1ldGhvZHMgaW1wbGVtZW50Cis6ZnVuYzpgLnNvY2tldGAgZnVuY3Rpb24gcmV0dXJucyBhIDpkZm46YHNvY2tldCBvYmplY3RgIHdob3NlIG1ldGhvZHMgaW1wbGVtZW50CiB0aGUgdmFyaW91cyBzb2NrZXQgc3lzdGVtIGNhbGxzLiAgUGFyYW1ldGVyIHR5cGVzIGFyZSBzb21ld2hhdCBoaWdoZXItbGV2ZWwgdGhhbgogaW4gdGhlIEMgaW50ZXJmYWNlOiBhcyB3aXRoIDptZXRoOmByZWFkYCBhbmQgOm1ldGg6YHdyaXRlYCBvcGVyYXRpb25zIG9uIFB5dGhvbgogZmlsZXMsIGJ1ZmZlciBhbGxvY2F0aW9uIG9uIHJlY2VpdmUgb3BlcmF0aW9ucyBpcyBhdXRvbWF0aWMsIGFuZCBidWZmZXIgbGVuZ3RoCkBAIC0zOCw3ICszOCw3IEBACiA6Y29uc3Q6YEFGX1VOSVhgIGFkZHJlc3MgZmFtaWx5LiBBIHBhaXIgYGAoaG9zdCwgcG9ydClgYCBpcyB1c2VkIGZvciB0aGUKIDpjb25zdDpgQUZfSU5FVGAgYWRkcmVzcyBmYW1pbHksIHdoZXJlICpob3N0KiBpcyBhIHN0cmluZyByZXByZXNlbnRpbmcgZWl0aGVyIGEKIGhvc3RuYW1lIGluIEludGVybmV0IGRvbWFpbiBub3RhdGlvbiBsaWtlIGBgJ2RhcmluZy5jd2kubmwnYGAgb3IgYW4gSVB2NCBhZGRyZXNzCi1saWtlIGBgJzEwMC41MC4yMDAuNSdgYCwgYW5kICpwb3J0KiBpcyBhbiBpbnRlZ3JhbCBwb3J0IG51bWJlci4gRm9yCitsaWtlIGBgJzEwMC41MC4yMDAuNSdgYCwgYW5kICpwb3J0KiBpcyBhbiBpbnRlZ2VyLiBGb3IKIDpjb25zdDpgQUZfSU5FVDZgIGFkZHJlc3MgZmFtaWx5LCBhIGZvdXItdHVwbGUgYGAoaG9zdCwgcG9ydCwgZmxvd2luZm8sCiBzY29wZWlkKWBgIGlzIHVzZWQsIHdoZXJlICpmbG93aW5mbyogYW5kICpzY29wZWlkKiByZXByZXNlbnRzIGBgc2luNl9mbG93aW5mb2BgCiBhbmQgYGBzaW42X3Njb3BlX2lkYGAgbWVtYmVyIGluIDpjb25zdDpgc3RydWN0IHNvY2thZGRyX2luNmAgaW4gQy4gRm9yCkBAIC03MiwxNyArNzIsMTcgQEAKICAgIHR1cGxlLCBhbmQgdGhlIGZpZWxkcyBkZXBlbmQgb24gdGhlIGFkZHJlc3MgdHlwZS4gVGhlIGdlbmVyYWwgdHVwbGUgZm9ybSBpcwogICAgYGAoYWRkcl90eXBlLCB2MSwgdjIsIHYzIFssIHNjb3BlXSlgYCwgd2hlcmU6CiAKLSAgIC0gKmFkZHJfdHlwZSogaXMgb25lIG9mIFRJUENfQUREUl9OQU1FU0VRLCBUSVBDX0FERFJfTkFNRSwgb3IKLSAgICAgVElQQ19BRERSX0lELgotICAgLSAqc2NvcGUqIGlzIG9uZSBvZiBUSVBDX1pPTkVfU0NPUEUsIFRJUENfQ0xVU1RFUl9TQ09QRSwgYW5kCi0gICAgIFRJUENfTk9ERV9TQ09QRS4KLSAgIC0gSWYgKmFkZHJfdHlwZSogaXMgVElQQ19BRERSX05BTUUsIHRoZW4gKnYxKiBpcyB0aGUgc2VydmVyIHR5cGUsICp2MiogaXMKKyAgIC0gKmFkZHJfdHlwZSogaXMgb25lIG9mIDpjb25zdDpgVElQQ19BRERSX05BTUVTRVFgLCA6Y29uc3Q6YFRJUENfQUREUl9OQU1FYCwKKyAgICAgb3IgOmNvbnN0OmBUSVBDX0FERFJfSURgLgorICAgLSAqc2NvcGUqIGlzIG9uZSBvZiA6Y29uc3Q6YFRJUENfWk9ORV9TQ09QRWAsIDpjb25zdDpgVElQQ19DTFVTVEVSX1NDT1BFYCwKKyAgICAgYW5kIDpjb25zdDpgVElQQ19OT0RFX1NDT1BFYC4KKyAgIC0gSWYgKmFkZHJfdHlwZSogaXMgOmNvbnN0OmBUSVBDX0FERFJfTkFNRWAsIHRoZW4gKnYxKiBpcyB0aGUgc2VydmVyIHR5cGUsICp2MiogaXMKICAgICAgdGhlIHBvcnQgaWRlbnRpZmllciwgYW5kICp2Myogc2hvdWxkIGJlIDAuCiAKLSAgICAgSWYgKmFkZHJfdHlwZSogaXMgVElQQ19BRERSX05BTUVTRVEsIHRoZW4gKnYxKiBpcyB0aGUgc2VydmVyIHR5cGUsICp2MioKKyAgICAgSWYgKmFkZHJfdHlwZSogaXMgOmNvbnN0OmBUSVBDX0FERFJfTkFNRVNFUWAsIHRoZW4gKnYxKiBpcyB0aGUgc2VydmVyIHR5cGUsICp2MioKICAgICAgaXMgdGhlIGxvd2VyIHBvcnQgbnVtYmVyLCBhbmQgKnYzKiBpcyB0aGUgdXBwZXIgcG9ydCBudW1iZXIuCiAKLSAgICAgSWYgKmFkZHJfdHlwZSogaXMgVElQQ19BRERSX0lELCB0aGVuICp2MSogaXMgdGhlIG5vZGUsICp2MiogaXMgdGhlCisgICAgIElmICphZGRyX3R5cGUqIGlzIDpjb25zdDpgVElQQ19BRERSX0lEYCwgdGhlbiAqdjEqIGlzIHRoZSBub2RlLCAqdjIqIGlzIHRoZQogICAgICByZWZlcmVuY2UsIGFuZCAqdjMqIHNob3VsZCBiZSBzZXQgdG8gMC4KIAogCkBAIC0xMTksNyArMTE5LDcgQEAKIAogICAgVGhlIGFjY29tcGFueWluZyB2YWx1ZSBpcyBhIHBhaXIgYGAoaF9lcnJubywgc3RyaW5nKWBgIHJlcHJlc2VudGluZyBhbiBlcnJvcgogICAgcmV0dXJuZWQgYnkgYSBsaWJyYXJ5IGNhbGwuICpzdHJpbmcqIHJlcHJlc2VudHMgdGhlIGRlc2NyaXB0aW9uIG9mICpoX2Vycm5vKiwgYXMKLSAgIHJldHVybmVkIGJ5IHRoZSA6Y2Z1bmM6YGhzdHJlcnJvcmAgQyBmdW5jdGlvbi4KKyAgIHJldHVybmVkIGJ5IHRoZSA6YzpmdW5jOmBoc3RyZXJyb3JgIEMgZnVuY3Rpb24uCiAKIAogLi4gZXhjZXB0aW9uOjogZ2FpZXJyb3IKQEAgLTEyNyw3ICsxMjcsNyBAQAogICAgVGhpcyBleGNlcHRpb24gaXMgcmFpc2VkIGZvciBhZGRyZXNzLXJlbGF0ZWQgZXJyb3JzLCBmb3IgOmZ1bmM6YGdldGFkZHJpbmZvYCBhbmQKICAgIDpmdW5jOmBnZXRuYW1laW5mb2AuIFRoZSBhY2NvbXBhbnlpbmcgdmFsdWUgaXMgYSBwYWlyIGBgKGVycm9yLCBzdHJpbmcpYGAKICAgIHJlcHJlc2VudGluZyBhbiBlcnJvciByZXR1cm5lZCBieSBhIGxpYnJhcnkgY2FsbC4gKnN0cmluZyogcmVwcmVzZW50cyB0aGUKLSAgIGRlc2NyaXB0aW9uIG9mICplcnJvciosIGFzIHJldHVybmVkIGJ5IHRoZSA6Y2Z1bmM6YGdhaV9zdHJlcnJvcmAgQyBmdW5jdGlvbi4gVGhlCisgICBkZXNjcmlwdGlvbiBvZiAqZXJyb3IqLCBhcyByZXR1cm5lZCBieSB0aGUgOmM6ZnVuYzpgZ2FpX3N0cmVycm9yYCBDIGZ1bmN0aW9uLiBUaGUKICAgICplcnJvciogdmFsdWUgd2lsbCBtYXRjaCBvbmUgb2YgdGhlIDpjb25zdDpgRUFJX1wqYCBjb25zdGFudHMgZGVmaW5lZCBpbiB0aGlzCiAgICBtb2R1bGUuCiAKQEAgLTE0Niw3ICsxNDYsNyBAQAogICAgICAgICAgIEFGX0lORVQ2CiAKICAgIFRoZXNlIGNvbnN0YW50cyByZXByZXNlbnQgdGhlIGFkZHJlc3MgKGFuZCBwcm90b2NvbCkgZmFtaWxpZXMsIHVzZWQgZm9yIHRoZQotICAgZmlyc3QgYXJndW1lbnQgdG8gOmZ1bmM6YHNvY2tldGAuICBJZiB0aGUgOmNvbnN0OmBBRl9VTklYYCBjb25zdGFudCBpcyBub3QKKyAgIGZpcnN0IGFyZ3VtZW50IHRvIDpmdW5jOmAuc29ja2V0YC4gIElmIHRoZSA6Y29uc3Q6YEFGX1VOSVhgIGNvbnN0YW50IGlzIG5vdAogICAgZGVmaW5lZCB0aGVuIHRoaXMgcHJvdG9jb2wgaXMgdW5zdXBwb3J0ZWQuCiAKIApAQCAtMTg2LDcgKzE4Niw3IEBACiAgICAgICAgICAgUkNWQUxMXyoKIAogICAgQ29uc3RhbnRzIGZvciBXaW5kb3dzJyBXU0FJb2N0bCgpLiBUaGUgY29uc3RhbnRzIGFyZSB1c2VkIGFzIGFyZ3VtZW50cyB0byB0aGUKLSAgIDptZXRoOmBpb2N0bGAgbWV0aG9kIG9mIHNvY2tldCBvYmplY3RzLgorICAgOm1ldGg6YH5zb2NrZXQuc29ja2V0LmlvY3RsYCBtZXRob2Qgb2Ygc29ja2V0IG9iamVjdHMuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNgogCkBAIC0yMDcsMTAgKzIwNywxNyBAQAogCiAuLiBmdW5jdGlvbjo6IGNyZWF0ZV9jb25uZWN0aW9uKGFkZHJlc3NbLCB0aW1lb3V0Wywgc291cmNlX2FkZHJlc3NdXSkKIAotICAgQ29udmVuaWVuY2UgZnVuY3Rpb24uICBDb25uZWN0IHRvICphZGRyZXNzKiAoYSAyLXR1cGxlIGBgKGhvc3QsIHBvcnQpYGApLAotICAgYW5kIHJldHVybiB0aGUgc29ja2V0IG9iamVjdC4gIFBhc3NpbmcgdGhlIG9wdGlvbmFsICp0aW1lb3V0KiBwYXJhbWV0ZXIgd2lsbAotICAgc2V0IHRoZSB0aW1lb3V0IG9uIHRoZSBzb2NrZXQgaW5zdGFuY2UgYmVmb3JlIGF0dGVtcHRpbmcgdG8gY29ubmVjdC4gIElmIG5vCi0gICAqdGltZW91dCogaXMgc3VwcGxpZWQsIHRoZSBnbG9iYWwgZGVmYXVsdCB0aW1lb3V0IHNldHRpbmcgcmV0dXJuZWQgYnkKKyAgIENvbm5lY3QgdG8gYSBUQ1Agc2VydmljZSBsaXN0ZW5pbmcgb24gdGhlIEludGVybmV0ICphZGRyZXNzKiAoYSAyLXR1cGxlCisgICBgYChob3N0LCBwb3J0KWBgKSwgYW5kIHJldHVybiB0aGUgc29ja2V0IG9iamVjdC4gIFRoaXMgaXMgYSBoaWdoZXItbGV2ZWwKKyAgIGZ1bmN0aW9uIHRoYW4gOm1ldGg6YHNvY2tldC5jb25uZWN0YDogaWYgKmhvc3QqIGlzIGEgbm9uLW51bWVyaWMgaG9zdG5hbWUsCisgICBpdCB3aWxsIHRyeSB0byByZXNvbHZlIGl0IGZvciBib3RoIDpkYXRhOmBBRl9JTkVUYCBhbmQgOmRhdGE6YEFGX0lORVQ2YCwKKyAgIGFuZCB0aGVuIHRyeSB0byBjb25uZWN0IHRvIGFsbCBwb3NzaWJsZSBhZGRyZXNzZXMgaW4gdHVybiB1bnRpbCBhCisgICBjb25uZWN0aW9uIHN1Y2NlZWRzLiAgVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHdyaXRlIGNsaWVudHMgdGhhdCBhcmUKKyAgIGNvbXBhdGlibGUgdG8gYm90aCBJUHY0IGFuZCBJUHY2LgorCisgICBQYXNzaW5nIHRoZSBvcHRpb25hbCAqdGltZW91dCogcGFyYW1ldGVyIHdpbGwgc2V0IHRoZSB0aW1lb3V0IG9uIHRoZQorICAgc29ja2V0IGluc3RhbmNlIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGNvbm5lY3QuICBJZiBubyAqdGltZW91dCogaXMKKyAgIHN1cHBsaWVkLCB0aGUgZ2xvYmFsIGRlZmF1bHQgdGltZW91dCBzZXR0aW5nIHJldHVybmVkIGJ5CiAgICA6ZnVuYzpgZ2V0ZGVmYXVsdHRpbWVvdXRgIGlzIHVzZWQuCiAKICAgIElmIHN1cHBsaWVkLCAqc291cmNlX2FkZHJlc3MqIG11c3QgYmUgYSAyLXR1cGxlIGBgKGhvc3QsIHBvcnQpYGAgZm9yIHRoZQpAQCAtMjIzLDcgKzIzMCw3IEBACiAgICAgICAqc291cmNlX2FkZHJlc3MqIHdhcyBhZGRlZC4KIAogCi0uLiBmdW5jdGlvbjo6IGdldGFkZHJpbmZvKGhvc3QsIHBvcnQsIGZhbWlseT0wLCBzb2NrdHlwZT0wLCBwcm90bz0wLCBmbGFncz0wKQorLi4gZnVuY3Rpb246OiBnZXRhZGRyaW5mbyhob3N0LCBwb3J0WywgZmFtaWx5Wywgc29ja3R5cGVbLCBwcm90b1ssIGZsYWdzXV1dXSkKIAogICAgVHJhbnNsYXRlIHRoZSAqaG9zdCovKnBvcnQqIGFyZ3VtZW50IGludG8gYSBzZXF1ZW5jZSBvZiA1LXR1cGxlcyB0aGF0IGNvbnRhaW4KICAgIGFsbCB0aGUgbmVjZXNzYXJ5IGFyZ3VtZW50cyBmb3IgY3JlYXRpbmcgYSBzb2NrZXQgY29ubmVjdGVkIHRvIHRoYXQgc2VydmljZS4KQEAgLTIzMywxOSArMjQwLDE5IEBACiAgICBhbmQgKnBvcnQqLCB5b3UgY2FuIHBhc3MgYGBOVUxMYGAgdG8gdGhlIHVuZGVybHlpbmcgQyBBUEkuCiAKICAgIFRoZSAqZmFtaWx5KiwgKnNvY2t0eXBlKiBhbmQgKnByb3RvKiBhcmd1bWVudHMgY2FuIGJlIG9wdGlvbmFsbHkgc3BlY2lmaWVkCi0gICBpbiBvcmRlciB0byBuYXJyb3cgdGhlIGxpc3Qgb2YgYWRkcmVzc2VzIHJldHVybmVkLiAgUGFzc2luZyB6ZXJvIGFzIGEKLSAgIHZhbHVlIGZvciBlYWNoIG9mIHRoZXNlIGFyZ3VtZW50cyBzZWxlY3RzIHRoZSBmdWxsIHJhbmdlIG9mIHJlc3VsdHMuCisgICBpbiBvcmRlciB0byBuYXJyb3cgdGhlIGxpc3Qgb2YgYWRkcmVzc2VzIHJldHVybmVkLiAgQnkgZGVmYXVsdCwgdGhlaXIgdmFsdWUKKyAgIGlzIGBgMGBgLCBtZWFuaW5nIHRoYXQgdGhlIGZ1bGwgcmFuZ2Ugb2YgcmVzdWx0cyBpcyBzZWxlY3RlZC4KICAgIFRoZSAqZmxhZ3MqIGFyZ3VtZW50IGNhbiBiZSBvbmUgb3Igc2V2ZXJhbCBvZiB0aGUgYGBBSV8qYGAgY29uc3RhbnRzLAotICAgYW5kIHdpbGwgaW5mbHVlbmNlIGhvdyByZXN1bHRzIGFyZSBjb21wdXRlZCBhbmQgcmV0dXJuZWQuCi0gICBGb3IgZXhhbXBsZSwgOmNvbnN0OmBBSV9OVU1FUklDSE9TVGAgd2lsbCBkaXNhYmxlIGRvbWFpbiBuYW1lIHJlc29sdXRpb24KLSAgIGFuZCB3aWxsIHJhaXNlIGFuIGVycm9yIGlmICpob3N0KiBpcyBhIGRvbWFpbiBuYW1lLgorICAgYW5kIHdpbGwgaW5mbHVlbmNlIGhvdyByZXN1bHRzIGFyZSBjb21wdXRlZCBhbmQgcmV0dXJuZWQuICBJdHMgZGVmYXVsdCB2YWx1ZQorICAgaXMgYGAwYGAuICBGb3IgZXhhbXBsZSwgOmNvbnN0OmBBSV9OVU1FUklDSE9TVGAgd2lsbCBkaXNhYmxlIGRvbWFpbiBuYW1lCisgICByZXNvbHV0aW9uIGFuZCB3aWxsIHJhaXNlIGFuIGVycm9yIGlmICpob3N0KiBpcyBhIGRvbWFpbiBuYW1lLgogCiAgICBUaGUgZnVuY3Rpb24gcmV0dXJucyBhIGxpc3Qgb2YgNS10dXBsZXMgd2l0aCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKIAogICAgYGAoZmFtaWx5LCBzb2NrdHlwZSwgcHJvdG8sIGNhbm9ubmFtZSwgc29ja2FkZHIpYGAKIAogICAgSW4gdGhlc2UgdHVwbGVzLCAqZmFtaWx5KiwgKnNvY2t0eXBlKiwgKnByb3RvKiBhcmUgYWxsIGludGVnZXJzIGFuZCBhcmUKLSAgIG1lYW50IHRvIGJlIHBhc3NlZCB0byB0aGUgOmZ1bmM6YHNvY2tldGAgZnVuY3Rpb24uICAqY2Fub25uYW1lKiB3aWxsIGJlCisgICBtZWFudCB0byBiZSBwYXNzZWQgdG8gdGhlIDpmdW5jOmAuc29ja2V0YCBmdW5jdGlvbi4gICpjYW5vbm5hbWUqIHdpbGwgYmUKICAgIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlICpob3N0KiBpZgogICAgOmNvbnN0OmBBSV9DQU5PTk5BTUVgIGlzIHBhcnQgb2YgdGhlICpmbGFncyogYXJndW1lbnQ7IGVsc2UgKmNhbm9ubmFtZSoKICAgIHdpbGwgYmUgZW1wdHkuICAqc29ja2FkZHIqIGlzIGEgdHVwbGUgZGVzY3JpYmluZyBhIHNvY2tldCBhZGRyZXNzLCB3aG9zZQpAQCAtMzM2LDcgKzM0Myw3IEBACiAuLiBmdW5jdGlvbjo6IGdldHByb3RvYnluYW1lKHByb3RvY29sbmFtZSkKIAogICAgVHJhbnNsYXRlIGFuIEludGVybmV0IHByb3RvY29sIG5hbWUgKGZvciBleGFtcGxlLCBgYCdpY21wJ2BgKSB0byBhIGNvbnN0YW50Ci0gICBzdWl0YWJsZSBmb3IgcGFzc2luZyBhcyB0aGUgKG9wdGlvbmFsKSB0aGlyZCBhcmd1bWVudCB0byB0aGUgOmZ1bmM6YHNvY2tldGAKKyAgIHN1aXRhYmxlIGZvciBwYXNzaW5nIGFzIHRoZSAob3B0aW9uYWwpIHRoaXJkIGFyZ3VtZW50IHRvIHRoZSA6ZnVuYzpgLnNvY2tldGAKICAgIGZ1bmN0aW9uLiAgVGhpcyBpcyB1c3VhbGx5IG9ubHkgbmVlZGVkIGZvciBzb2NrZXRzIG9wZW5lZCBpbiAicmF3IiBtb2RlCiAgICAoOmNvbnN0OmBTT0NLX1JBV2ApOyBmb3IgdGhlIG5vcm1hbCBzb2NrZXQgbW9kZXMsIHRoZSBjb3JyZWN0IHByb3RvY29sIGlzIGNob3NlbgogICAgYXV0b21hdGljYWxseSBpZiB0aGUgcHJvdG9jb2wgaXMgb21pdHRlZCBvciB6ZXJvLgpAQCAtMzcwLDcgKzM3Nyw3IEBACiAKICAgIEJ1aWxkIGEgcGFpciBvZiBjb25uZWN0ZWQgc29ja2V0IG9iamVjdHMgdXNpbmcgdGhlIGdpdmVuIGFkZHJlc3MgZmFtaWx5LCBzb2NrZXQKICAgIHR5cGUsIGFuZCBwcm90b2NvbCBudW1iZXIuICBBZGRyZXNzIGZhbWlseSwgc29ja2V0IHR5cGUsIGFuZCBwcm90b2NvbCBudW1iZXIgYXJlCi0gICBhcyBmb3IgdGhlIDpmdW5jOmBzb2NrZXRgIGZ1bmN0aW9uIGFib3ZlLiBUaGUgZGVmYXVsdCBmYW1pbHkgaXMgOmNvbnN0OmBBRl9VTklYYAorICAgYXMgZm9yIHRoZSA6ZnVuYzpgLnNvY2tldGAgZnVuY3Rpb24gYWJvdmUuIFRoZSBkZWZhdWx0IGZhbWlseSBpcyA6Y29uc3Q6YEFGX1VOSVhgCiAgICBpZiBkZWZpbmVkIG9uIHRoZSBwbGF0Zm9ybTsgb3RoZXJ3aXNlLCB0aGUgZGVmYXVsdCBpcyA6Y29uc3Q6YEFGX0lORVRgLgogICAgQXZhaWxhYmlsaXR5OiBVbml4LgogCkBAIC0zODEsNyArMzg4LDcgQEAKIAogICAgRHVwbGljYXRlIHRoZSBmaWxlIGRlc2NyaXB0b3IgKmZkKiAoYW4gaW50ZWdlciBhcyByZXR1cm5lZCBieSBhIGZpbGUgb2JqZWN0J3MKICAgIDptZXRoOmBmaWxlbm9gIG1ldGhvZCkgYW5kIGJ1aWxkIGEgc29ja2V0IG9iamVjdCBmcm9tIHRoZSByZXN1bHQuICBBZGRyZXNzCi0gICBmYW1pbHksIHNvY2tldCB0eXBlIGFuZCBwcm90b2NvbCBudW1iZXIgYXJlIGFzIGZvciB0aGUgOmZ1bmM6YHNvY2tldGAgZnVuY3Rpb24KKyAgIGZhbWlseSwgc29ja2V0IHR5cGUgYW5kIHByb3RvY29sIG51bWJlciBhcmUgYXMgZm9yIHRoZSA6ZnVuYzpgLnNvY2tldGAgZnVuY3Rpb24KICAgIGFib3ZlLiBUaGUgZmlsZSBkZXNjcmlwdG9yIHNob3VsZCByZWZlciB0byBhIHNvY2tldCwgYnV0IHRoaXMgaXMgbm90IGNoZWNrZWQgLS0tCiAgICBzdWJzZXF1ZW50IG9wZXJhdGlvbnMgb24gdGhlIG9iamVjdCBtYXkgZmFpbCBpZiB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzIGludmFsaWQuCiAgICBUaGlzIGZ1bmN0aW9uIGlzIHJhcmVseSBuZWVkZWQsIGJ1dCBjYW4gYmUgdXNlZCB0byBnZXQgb3Igc2V0IHNvY2tldCBvcHRpb25zIG9uCkBAIC00MjMsNyArNDMwLDcgQEAKICAgIENvbnZlcnQgYW4gSVB2NCBhZGRyZXNzIGZyb20gZG90dGVkLXF1YWQgc3RyaW5nIGZvcm1hdCAoZm9yIGV4YW1wbGUsCiAgICAnMTIzLjQ1LjY3Ljg5JykgdG8gMzItYml0IHBhY2tlZCBiaW5hcnkgZm9ybWF0LCBhcyBhIHN0cmluZyBmb3VyIGNoYXJhY3RlcnMgaW4KICAgIGxlbmd0aC4gIFRoaXMgaXMgdXNlZnVsIHdoZW4gY29udmVyc2luZyB3aXRoIGEgcHJvZ3JhbSB0aGF0IHVzZXMgdGhlIHN0YW5kYXJkIEMKLSAgIGxpYnJhcnkgYW5kIG5lZWRzIG9iamVjdHMgb2YgdHlwZSA6Y3R5cGU6YHN0cnVjdCBpbl9hZGRyYCwgd2hpY2ggaXMgdGhlIEMgdHlwZQorICAgbGlicmFyeSBhbmQgbmVlZHMgb2JqZWN0cyBvZiB0eXBlIDpjOnR5cGU6YHN0cnVjdCBpbl9hZGRyYCwgd2hpY2ggaXMgdGhlIEMgdHlwZQogICAgZm9yIHRoZSAzMi1iaXQgcGFja2VkIGJpbmFyeSB0aGlzIGZ1bmN0aW9uIHJldHVybnMuCiAKICAgIDpmdW5jOmBpbmV0X2F0b25gIGFsc28gYWNjZXB0cyBzdHJpbmdzIHdpdGggbGVzcyB0aGFuIHRocmVlIGRvdHM7IHNlZSB0aGUKQEAgLTQzMSw3ICs0MzgsNyBAQAogCiAgICBJZiB0aGUgSVB2NCBhZGRyZXNzIHN0cmluZyBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiBpcyBpbnZhbGlkLAogICAgOmV4Yzpgc29ja2V0LmVycm9yYCB3aWxsIGJlIHJhaXNlZC4gTm90ZSB0aGF0IGV4YWN0bHkgd2hhdCBpcyB2YWxpZCBkZXBlbmRzIG9uCi0gICB0aGUgdW5kZXJseWluZyBDIGltcGxlbWVudGF0aW9uIG9mIDpjZnVuYzpgaW5ldF9hdG9uYC4KKyAgIHRoZSB1bmRlcmx5aW5nIEMgaW1wbGVtZW50YXRpb24gb2YgOmM6ZnVuYzpgaW5ldF9hdG9uYC4KIAogICAgOmZ1bmM6YGluZXRfYXRvbmAgZG9lcyBub3Qgc3VwcG9ydCBJUHY2LCBhbmQgOmZ1bmM6YGluZXRfcHRvbmAgc2hvdWxkIGJlIHVzZWQKICAgIGluc3RlYWQgZm9yIElQdjQvdjYgZHVhbCBzdGFjayBzdXBwb3J0LgpAQCAtNDQyLDcgKzQ0OSw3IEBACiAgICBDb252ZXJ0IGEgMzItYml0IHBhY2tlZCBJUHY0IGFkZHJlc3MgKGEgc3RyaW5nIGZvdXIgY2hhcmFjdGVycyBpbiBsZW5ndGgpIHRvIGl0cwogICAgc3RhbmRhcmQgZG90dGVkLXF1YWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIChmb3IgZXhhbXBsZSwgJzEyMy40NS42Ny44OScpLiAgVGhpcwogICAgaXMgdXNlZnVsIHdoZW4gY29udmVyc2luZyB3aXRoIGEgcHJvZ3JhbSB0aGF0IHVzZXMgdGhlIHN0YW5kYXJkIEMgbGlicmFyeSBhbmQKLSAgIG5lZWRzIG9iamVjdHMgb2YgdHlwZSA6Y3R5cGU6YHN0cnVjdCBpbl9hZGRyYCwgd2hpY2ggaXMgdGhlIEMgdHlwZSBmb3IgdGhlCisgICBuZWVkcyBvYmplY3RzIG9mIHR5cGUgOmM6dHlwZTpgc3RydWN0IGluX2FkZHJgLCB3aGljaCBpcyB0aGUgQyB0eXBlIGZvciB0aGUKICAgIDMyLWJpdCBwYWNrZWQgYmluYXJ5IGRhdGEgdGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBhbiBhcmd1bWVudC4KIAogICAgSWYgdGhlIHN0cmluZyBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiBpcyBub3QgZXhhY3RseSA0IGJ5dGVzIGluIGxlbmd0aCwKQEAgLTQ1NCwxNCArNDYxLDE0IEBACiAKICAgIENvbnZlcnQgYW4gSVAgYWRkcmVzcyBmcm9tIGl0cyBmYW1pbHktc3BlY2lmaWMgc3RyaW5nIGZvcm1hdCB0byBhIHBhY2tlZCwgYmluYXJ5CiAgICBmb3JtYXQuIDpmdW5jOmBpbmV0X3B0b25gIGlzIHVzZWZ1bCB3aGVuIGEgbGlicmFyeSBvciBuZXR3b3JrIHByb3RvY29sIGNhbGxzIGZvcgotICAgYW4gb2JqZWN0IG9mIHR5cGUgOmN0eXBlOmBzdHJ1Y3QgaW5fYWRkcmAgKHNpbWlsYXIgdG8gOmZ1bmM6YGluZXRfYXRvbmApIG9yCi0gICA6Y3R5cGU6YHN0cnVjdCBpbjZfYWRkcmAuCisgICBhbiBvYmplY3Qgb2YgdHlwZSA6Yzp0eXBlOmBzdHJ1Y3QgaW5fYWRkcmAgKHNpbWlsYXIgdG8gOmZ1bmM6YGluZXRfYXRvbmApIG9yCisgICA6Yzp0eXBlOmBzdHJ1Y3QgaW42X2FkZHJgLgogCiAgICBTdXBwb3J0ZWQgdmFsdWVzIGZvciAqYWRkcmVzc19mYW1pbHkqIGFyZSBjdXJyZW50bHkgOmNvbnN0OmBBRl9JTkVUYCBhbmQKICAgIDpjb25zdDpgQUZfSU5FVDZgLiBJZiB0aGUgSVAgYWRkcmVzcyBzdHJpbmcgKmlwX3N0cmluZyogaXMgaW52YWxpZCwKICAgIDpleGM6YHNvY2tldC5lcnJvcmAgd2lsbCBiZSByYWlzZWQuIE5vdGUgdGhhdCBleGFjdGx5IHdoYXQgaXMgdmFsaWQgZGVwZW5kcyBvbgogICAgYm90aCB0aGUgdmFsdWUgb2YgKmFkZHJlc3NfZmFtaWx5KiBhbmQgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gb2YKLSAgIDpjZnVuYzpgaW5ldF9wdG9uYC4KKyAgIDpjOmZ1bmM6YGluZXRfcHRvbmAuCiAKICAgIEF2YWlsYWJpbGl0eTogVW5peCAobWF5YmUgbm90IGFsbCBwbGF0Zm9ybXMpLgogCkBAIC00NzMsOCArNDgwLDggQEAKICAgIENvbnZlcnQgYSBwYWNrZWQgSVAgYWRkcmVzcyAoYSBzdHJpbmcgb2Ygc29tZSBudW1iZXIgb2YgY2hhcmFjdGVycykgdG8gaXRzCiAgICBzdGFuZGFyZCwgZmFtaWx5LXNwZWNpZmljIHN0cmluZyByZXByZXNlbnRhdGlvbiAoZm9yIGV4YW1wbGUsIGBgJzcuMTAuMC41J2BgIG9yCiAgICBgYCc1YWVmOjJiOjo4J2BgKSA6ZnVuYzpgaW5ldF9udG9wYCBpcyB1c2VmdWwgd2hlbiBhIGxpYnJhcnkgb3IgbmV0d29yayBwcm90b2NvbAotICAgcmV0dXJucyBhbiBvYmplY3Qgb2YgdHlwZSA6Y3R5cGU6YHN0cnVjdCBpbl9hZGRyYCAoc2ltaWxhciB0byA6ZnVuYzpgaW5ldF9udG9hYCkKLSAgIG9yIDpjdHlwZTpgc3RydWN0IGluNl9hZGRyYC4KKyAgIHJldHVybnMgYW4gb2JqZWN0IG9mIHR5cGUgOmM6dHlwZTpgc3RydWN0IGluX2FkZHJgIChzaW1pbGFyIHRvIDpmdW5jOmBpbmV0X250b2FgKQorICAgb3IgOmM6dHlwZTpgc3RydWN0IGluNl9hZGRyYC4KIAogICAgU3VwcG9ydGVkIHZhbHVlcyBmb3IgKmFkZHJlc3NfZmFtaWx5KiBhcmUgY3VycmVudGx5IDpjb25zdDpgQUZfSU5FVGAgYW5kCiAgICA6Y29uc3Q6YEFGX0lORVQ2YC4gSWYgdGhlIHN0cmluZyAqcGFja2VkX2lwKiBpcyBub3QgdGhlIGNvcnJlY3QgbGVuZ3RoIGZvciB0aGUKQEAgLTU1NSw2ICs1NjIsNyBAQAogICAgYXV0b21hdGljYWxseSBjbG9zZWQgd2hlbiB0aGV5IGFyZSBnYXJiYWdlLWNvbGxlY3RlZC4KIAogICAgLi4gbm90ZTo6CisKICAgICAgIDptZXRoOmBjbG9zZSgpYCByZWxlYXNlcyB0aGUgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIGEgY29ubmVjdGlvbiBidXQKICAgICAgIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGNsb3NlIHRoZSBjb25uZWN0aW9uIGltbWVkaWF0ZWx5LiAgSWYgeW91IHdhbnQKICAgICAgIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uIGluIGEgdGltZWx5IGZhc2hpb24sIGNhbGwgOm1ldGg6YHNodXRkb3duKClgCkBAIC01NzYsMTAgKzU4NCwxMCBAQAogLi4gbWV0aG9kOjogc29ja2V0LmNvbm5lY3RfZXgoYWRkcmVzcykKIAogICAgTGlrZSBgYGNvbm5lY3QoYWRkcmVzcylgYCwgYnV0IHJldHVybiBhbiBlcnJvciBpbmRpY2F0b3IgaW5zdGVhZCBvZiByYWlzaW5nIGFuCi0gICBleGNlcHRpb24gZm9yIGVycm9ycyByZXR1cm5lZCBieSB0aGUgQy1sZXZlbCA6Y2Z1bmM6YGNvbm5lY3RgIGNhbGwgKG90aGVyCisgICBleGNlcHRpb24gZm9yIGVycm9ycyByZXR1cm5lZCBieSB0aGUgQy1sZXZlbCA6YzpmdW5jOmBjb25uZWN0YCBjYWxsIChvdGhlcgogICAgcHJvYmxlbXMsIHN1Y2ggYXMgImhvc3Qgbm90IGZvdW5kLCIgY2FuIHN0aWxsIHJhaXNlIGV4Y2VwdGlvbnMpLiAgVGhlIGVycm9yCiAgICBpbmRpY2F0b3IgaXMgYGAwYGAgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQsIG90aGVyd2lzZSB0aGUgdmFsdWUgb2YgdGhlCi0gICA6Y2RhdGE6YGVycm5vYCB2YXJpYWJsZS4gIFRoaXMgaXMgdXNlZnVsIHRvIHN1cHBvcnQsIGZvciBleGFtcGxlLCBhc3luY2hyb25vdXMKKyAgIDpjOmRhdGE6YGVycm5vYCB2YXJpYWJsZS4gIFRoaXMgaXMgdXNlZnVsIHRvIHN1cHBvcnQsIGZvciBleGFtcGxlLCBhc3luY2hyb25vdXMKICAgIGNvbm5lY3RzLgogCiAgICAuLiBub3RlOjoKQEAgLTY1NCw3ICs2NjIsNyBAQAogCiAgICBSZXR1cm4gYSA6ZGZuOmBmaWxlIG9iamVjdGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBzb2NrZXQuICAoRmlsZSBvYmplY3RzIGFyZQogICAgZGVzY3JpYmVkIGluIDpyZWY6YGJsdGluLWZpbGUtb2JqZWN0c2AuKSBUaGUgZmlsZSBvYmplY3QKLSAgIHJlZmVyZW5jZXMgYSA6Y2Z1bmM6YGR1cGBcIHBlZCB2ZXJzaW9uIG9mIHRoZSBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yLCBzbyB0aGUKKyAgIHJlZmVyZW5jZXMgYSA6YzpmdW5jOmBkdXBgXCBwZWQgdmVyc2lvbiBvZiB0aGUgc29ja2V0IGZpbGUgZGVzY3JpcHRvciwgc28gdGhlCiAgICBmaWxlIG9iamVjdCBhbmQgc29ja2V0IG9iamVjdCBtYXkgYmUgY2xvc2VkIG9yIGdhcmJhZ2UtY29sbGVjdGVkIGluZGVwZW5kZW50bHkuCiAgICBUaGUgc29ja2V0IG11c3QgYmUgaW4gYmxvY2tpbmcgbW9kZSAoaXQgY2FuIG5vdCBoYXZlIGEgdGltZW91dCkuIFRoZSBvcHRpb25hbAogICAgKm1vZGUqIGFuZCAqYnVmc2l6ZSogYXJndW1lbnRzIGFyZSBpbnRlcnByZXRlZCB0aGUgc2FtZSB3YXkgYXMgYnkgdGhlIGJ1aWx0LWluCkBAIC03MTgsNyArNzI2LDggQEAKICAgIG9wdGlvbmFsICpmbGFncyogYXJndW1lbnQgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgZm9yIDptZXRoOmByZWN2YCBhYm92ZS4KICAgIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBzZW50LiBBcHBsaWNhdGlvbnMgYXJlIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyB0aGF0CiAgICBhbGwgZGF0YSBoYXMgYmVlbiBzZW50OyBpZiBvbmx5IHNvbWUgb2YgdGhlIGRhdGEgd2FzIHRyYW5zbWl0dGVkLCB0aGUKLSAgIGFwcGxpY2F0aW9uIG5lZWRzIHRvIGF0dGVtcHQgZGVsaXZlcnkgb2YgdGhlIHJlbWFpbmluZyBkYXRhLgorICAgYXBwbGljYXRpb24gbmVlZHMgdG8gYXR0ZW1wdCBkZWxpdmVyeSBvZiB0aGUgcmVtYWluaW5nIGRhdGEuIEZvciBmdXJ0aGVyCisgICBpbmZvcm1hdGlvbiBvbiB0aGlzIGNvbmNlcHQsIGNvbnN1bHQgdGhlIDpyZWY6YHNvY2tldC1ob3d0b2AuCiAKIAogLi4gbWV0aG9kOjogc29ja2V0LnNlbmRhbGwoc3RyaW5nWywgZmxhZ3NdKQpAQCAtNzMxLDcgKzc0MCw4IEBACiAgICBtdWNoIGRhdGEsIGlmIGFueSwgd2FzIHN1Y2Nlc3NmdWxseSBzZW50LgogCiAKLS4uIG1ldGhvZDo6IHNvY2tldC5zZW5kdG8oc3RyaW5nWywgZmxhZ3NdLCBhZGRyZXNzKQorLi4gbWV0aG9kOjogc29ja2V0LnNlbmR0byhzdHJpbmcsIGFkZHJlc3MpCisgICAgICAgICAgICBzb2NrZXQuc2VuZHRvKHN0cmluZywgZmxhZ3MsIGFkZHJlc3MpCiAKICAgIFNlbmQgZGF0YSB0byB0aGUgc29ja2V0LiAgVGhlIHNvY2tldCBzaG91bGQgbm90IGJlIGNvbm5lY3RlZCB0byBhIHJlbW90ZSBzb2NrZXQsCiAgICBzaW5jZSB0aGUgZGVzdGluYXRpb24gc29ja2V0IGlzIHNwZWNpZmllZCBieSAqYWRkcmVzcyouICBUaGUgb3B0aW9uYWwgKmZsYWdzKgpAQCAtODUyLDEyICs4NjIsMTIgQEAKIAogSGVyZSBhcmUgZm91ciBtaW5pbWFsIGV4YW1wbGUgcHJvZ3JhbXMgdXNpbmcgdGhlIFRDUC9JUCBwcm90b2NvbDogYSBzZXJ2ZXIgdGhhdAogZWNob2VzIGFsbCBkYXRhIHRoYXQgaXQgcmVjZWl2ZXMgYmFjayAoc2VydmljaW5nIG9ubHkgb25lIGNsaWVudCksIGFuZCBhIGNsaWVudAotdXNpbmcgaXQuICBOb3RlIHRoYXQgYSBzZXJ2ZXIgbXVzdCBwZXJmb3JtIHRoZSBzZXF1ZW5jZSA6ZnVuYzpgc29ja2V0YCwKK3VzaW5nIGl0LiAgTm90ZSB0aGF0IGEgc2VydmVyIG11c3QgcGVyZm9ybSB0aGUgc2VxdWVuY2UgOmZ1bmM6YC5zb2NrZXRgLAogOm1ldGg6YH5zb2NrZXQuYmluZGAsIDptZXRoOmB+c29ja2V0Lmxpc3RlbmAsIDptZXRoOmB+c29ja2V0LmFjY2VwdGAgKHBvc3NpYmx5CiByZXBlYXRpbmcgdGhlIDptZXRoOmB+c29ja2V0LmFjY2VwdGAgdG8gc2VydmljZSBtb3JlIHRoYW4gb25lIGNsaWVudCksIHdoaWxlIGEKLWNsaWVudCBvbmx5IG5lZWRzIHRoZSBzZXF1ZW5jZSA6ZnVuYzpgc29ja2V0YCwgOm1ldGg6YH5zb2NrZXQuY29ubmVjdGAuICBBbHNvCi1ub3RlIHRoYXQgdGhlIHNlcnZlciBkb2VzIG5vdCA6bWV0aDpgfnNvY2tldC5zZW5kYC86bWV0aDpgfnNvY2tldC5yZWN2YCBvbiB0aGUKLXNvY2tldCBpdCBpcyBsaXN0ZW5pbmcgb24gYnV0IG9uIHRoZSBuZXcgc29ja2V0IHJldHVybmVkIGJ5CitjbGllbnQgb25seSBuZWVkcyB0aGUgc2VxdWVuY2UgOmZ1bmM6YC5zb2NrZXRgLCA6bWV0aDpgfnNvY2tldC5jb25uZWN0YC4gIEFsc28KK25vdGUgdGhhdCB0aGUgc2VydmVyIGRvZXMgbm90IDptZXRoOmB+c29ja2V0LnNlbmRhbGxgLzptZXRoOmB+c29ja2V0LnJlY3ZgIG9uCit0aGUgc29ja2V0IGl0IGlzIGxpc3RlbmluZyBvbiBidXQgb24gdGhlIG5ldyBzb2NrZXQgcmV0dXJuZWQgYnkKIDptZXRoOmB+c29ja2V0LmFjY2VwdGAuCiAKIFRoZSBmaXJzdCB0d28gZXhhbXBsZXMgc3VwcG9ydCBJUHY0IG9ubHkuIDo6CkBAIC04NzUsNyArODg1LDcgQEAKICAgIHdoaWxlIDE6CiAgICAgICAgZGF0YSA9IGNvbm4ucmVjdigxMDI0KQogICAgICAgIGlmIG5vdCBkYXRhOiBicmVhawotICAgICAgIGNvbm4uc2VuZChkYXRhKQorICAgICAgIGNvbm4uc2VuZGFsbChkYXRhKQogICAgY29ubi5jbG9zZSgpCiAKIDo6CkBAIC04ODcsNyArODk3LDcgQEAKICAgIFBPUlQgPSA1MDAwNyAgICAgICAgICAgICAgIyBUaGUgc2FtZSBwb3J0IGFzIHVzZWQgYnkgdGhlIHNlcnZlcgogICAgcyA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKICAgIHMuY29ubmVjdCgoSE9TVCwgUE9SVCkpCi0gICBzLnNlbmQoJ0hlbGxvLCB3b3JsZCcpCisgICBzLnNlbmRhbGwoJ0hlbGxvLCB3b3JsZCcpCiAgICBkYXRhID0gcy5yZWN2KDEwMjQpCiAgICBzLmNsb3NlKCkKICAgIHByaW50ICdSZWNlaXZlZCcsIHJlcHIoZGF0YSkKQEAgLTkxMSwxMyArOTIxLDEzIEBACiAgICAgICAgYWYsIHNvY2t0eXBlLCBwcm90bywgY2Fub25uYW1lLCBzYSA9IHJlcwogICAgICAgIHRyeToKICAgICAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoYWYsIHNvY2t0eXBlLCBwcm90bykKLSAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCBtc2c6CisgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciBhcyBtc2c6CiAgICAgICAgICAgIHMgPSBOb25lCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzLmJpbmQoc2EpCiAgICAgICAgICAgIHMubGlzdGVuKDEpCi0gICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgbXNnOgorICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgbXNnOgogICAgICAgICAgICBzLmNsb3NlKCkKICAgICAgICAgICAgcyA9IE5vbmUKICAgICAgICAgICAgY29udGludWUKQEAgLTk0NiwxMiArOTU2LDEyIEBACiAgICAgICAgYWYsIHNvY2t0eXBlLCBwcm90bywgY2Fub25uYW1lLCBzYSA9IHJlcwogICAgICAgIHRyeToKICAgICAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoYWYsIHNvY2t0eXBlLCBwcm90bykKLSAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCBtc2c6CisgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciBhcyBtc2c6CiAgICAgICAgICAgIHMgPSBOb25lCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzLmNvbm5lY3Qoc2EpCi0gICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgbXNnOgorICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgbXNnOgogICAgICAgICAgICBzLmNsb3NlKCkKICAgICAgICAgICAgcyA9IE5vbmUKICAgICAgICAgICAgY29udGludWUKQEAgLTk1OSw3ICs5NjksNyBAQAogICAgaWYgcyBpcyBOb25lOgogICAgICAgIHByaW50ICdjb3VsZCBub3Qgb3BlbiBzb2NrZXQnCiAgICAgICAgc3lzLmV4aXQoMSkKLSAgIHMuc2VuZCgnSGVsbG8sIHdvcmxkJykKKyAgIHMuc2VuZGFsbCgnSGVsbG8sIHdvcmxkJykKICAgIGRhdGEgPSBzLnJlY3YoMTAyNCkKICAgIHMuY2xvc2UoKQogICAgcHJpbnQgJ1JlY2VpdmVkJywgcmVwcihkYXRhKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc29ja2V0c2VydmVyLnJzdCBiL0RvYy9saWJyYXJ5L3NvY2tldHNlcnZlci5yc3QKaW5kZXggZmFhM2Q4OS4uYTkwNTNkMSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc29ja2V0c2VydmVyLnJzdAorKysgYi9Eb2MvbGlicmFyeS9zb2NrZXRzZXJ2ZXIucnN0CkBAIC03LDggKzcsOCBAQAogLi4gbm90ZTo6CiAKICAgIFRoZSA6bW9kOmBTb2NrZXRTZXJ2ZXJgIG1vZHVsZSBoYXMgYmVlbiByZW5hbWVkIHRvIDptb2Q6YHNvY2tldHNlcnZlcmAgaW4KLSAgIFB5dGhvbiAzLjAuICBUaGUgOnRlcm06YDJ0bzNgIHRvb2wgd2lsbCBhdXRvbWF0aWNhbGx5IGFkYXB0IGltcG9ydHMgd2hlbgotICAgY29udmVydGluZyB5b3VyIHNvdXJjZXMgdG8gMy4wLgorICAgUHl0aG9uIDMuICBUaGUgOnRlcm06YDJ0bzNgIHRvb2wgd2lsbCBhdXRvbWF0aWNhbGx5IGFkYXB0IGltcG9ydHMgd2hlbgorICAgY29udmVydGluZyB5b3VyIHNvdXJjZXMgdG8gUHl0aG9uIDMuCiAKICoqU291cmNlIGNvZGU6KiogOnNvdXJjZTpgTGliL1NvY2tldFNlcnZlci5weWAKIApAQCAtMTE2LDEzICsxMTYsMTMgQEAKIHRoZSByZXF1ZXN0IGhhbmRsZXIgY2xhc3MgOm1ldGg6YGhhbmRsZWAgbWV0aG9kLgogCiBBbm90aGVyIGFwcHJvYWNoIHRvIGhhbmRsaW5nIG11bHRpcGxlIHNpbXVsdGFuZW91cyByZXF1ZXN0cyBpbiBhbiBlbnZpcm9ubWVudAotdGhhdCBzdXBwb3J0cyBuZWl0aGVyIHRocmVhZHMgbm9yIDpmdW5jOmBmb3JrYCAob3Igd2hlcmUgdGhlc2UgYXJlIHRvbyBleHBlbnNpdmUKLW9yIGluYXBwcm9wcmlhdGUgZm9yIHRoZSBzZXJ2aWNlKSBpcyB0byBtYWludGFpbiBhbiBleHBsaWNpdCB0YWJsZSBvZiBwYXJ0aWFsbHkKLWZpbmlzaGVkIHJlcXVlc3RzIGFuZCB0byB1c2UgOmZ1bmM6YHNlbGVjdGAgdG8gZGVjaWRlIHdoaWNoIHJlcXVlc3QgdG8gd29yayBvbgotbmV4dCAob3Igd2hldGhlciB0byBoYW5kbGUgYSBuZXcgaW5jb21pbmcgcmVxdWVzdCkuICBUaGlzIGlzIHBhcnRpY3VsYXJseQotaW1wb3J0YW50IGZvciBzdHJlYW0gc2VydmljZXMgd2hlcmUgZWFjaCBjbGllbnQgY2FuIHBvdGVudGlhbGx5IGJlIGNvbm5lY3RlZCBmb3IKLWEgbG9uZyB0aW1lIChpZiB0aHJlYWRzIG9yIHN1YnByb2Nlc3NlcyBjYW5ub3QgYmUgdXNlZCkuIFNlZSA6bW9kOmBhc3luY29yZWAgZm9yCi1hbm90aGVyIHdheSB0byBtYW5hZ2UgdGhpcy4KK3RoYXQgc3VwcG9ydHMgbmVpdGhlciB0aHJlYWRzIG5vciA6ZnVuYzpgfm9zLmZvcmtgIChvciB3aGVyZSB0aGVzZSBhcmUgdG9vCitleHBlbnNpdmUgb3IgaW5hcHByb3ByaWF0ZSBmb3IgdGhlIHNlcnZpY2UpIGlzIHRvIG1haW50YWluIGFuIGV4cGxpY2l0IHRhYmxlIG9mCitwYXJ0aWFsbHkgZmluaXNoZWQgcmVxdWVzdHMgYW5kIHRvIHVzZSA6ZnVuYzpgfnNlbGVjdC5zZWxlY3RgIHRvIGRlY2lkZSB3aGljaAorcmVxdWVzdCB0byB3b3JrIG9uIG5leHQgKG9yIHdoZXRoZXIgdG8gaGFuZGxlIGEgbmV3IGluY29taW5nIHJlcXVlc3QpLiAgVGhpcyBpcworcGFydGljdWxhcmx5IGltcG9ydGFudCBmb3Igc3RyZWFtIHNlcnZpY2VzIHdoZXJlIGVhY2ggY2xpZW50IGNhbiBwb3RlbnRpYWxseSBiZQorY29ubmVjdGVkIGZvciBhIGxvbmcgdGltZSAoaWYgdGhyZWFkcyBvciBzdWJwcm9jZXNzZXMgY2Fubm90IGJlIHVzZWQpLiBTZWUKKzptb2Q6YGFzeW5jb3JlYCBmb3IgYW5vdGhlciB3YXkgdG8gbWFuYWdlIHRoaXMuCiAKIC4uIFhYWCBzaG91bGQgZGF0YSBhbmQgbWV0aG9kcyBiZSBpbnRlcm1pbmdsZWQsIG9yIHNlcGFyYXRlPwogICAgaG93IHNob3VsZCB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBjbGFzcyBhbmQgaW5zdGFuY2UgdmFyaWFibGVzIGJlIGRyYXduPwpAQCAtMTU4LDEzICsxNTgsMTQgQEAKIAogLi4gbWV0aG9kOjogQmFzZVNlcnZlci5zZXJ2ZV9mb3JldmVyKHBvbGxfaW50ZXJ2YWw9MC41KQogCi0gICBIYW5kbGUgcmVxdWVzdHMgdW50aWwgYW4gZXhwbGljaXQgOm1ldGg6YHNodXRkb3duYCByZXF1ZXN0LiAgUG9sbHMgZm9yCi0gICBzaHV0ZG93biBldmVyeSAqcG9sbF9pbnRlcnZhbCogc2Vjb25kcy4KKyAgIEhhbmRsZSByZXF1ZXN0cyB1bnRpbCBhbiBleHBsaWNpdCA6bWV0aDpgc2h1dGRvd25gIHJlcXVlc3QuCisgICBQb2xsIGZvciBzaHV0ZG93biBldmVyeSAqcG9sbF9pbnRlcnZhbCogc2Vjb25kcy4gSWdub3JlcyA6YXR0cjpgc2VsZi50aW1lb3V0YC4KKyAgIElmIHlvdSBuZWVkIHRvIGRvIHBlcmlvZGljIHRhc2tzLCBkbyB0aGVtIGluIGFub3RoZXIgdGhyZWFkLgogCiAKIC4uIG1ldGhvZDo6IEJhc2VTZXJ2ZXIuc2h1dGRvd24oKQogCi0gICBUZWxscyB0aGUgOm1ldGg6YHNlcnZlX2ZvcmV2ZXJgIGxvb3AgdG8gc3RvcCBhbmQgd2FpdHMgdW50aWwgaXQgZG9lcy4KKyAgIFRlbGwgdGhlIDptZXRoOmBzZXJ2ZV9mb3JldmVyYCBsb29wIHRvIHN0b3AgYW5kIHdhaXQgdW50aWwgaXQgZG9lcy4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi42CiAKQEAgLTMwNSw4ICszMDYsOCBAQAogLi4gbWV0aG9kOjogUmVxdWVzdEhhbmRsZXIuZmluaXNoKCkKIAogICAgQ2FsbGVkIGFmdGVyIHRoZSA6bWV0aDpgaGFuZGxlYCBtZXRob2QgdG8gcGVyZm9ybSBhbnkgY2xlYW4tdXAgYWN0aW9ucwotICAgcmVxdWlyZWQuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuICBJZiA6bWV0aDpgc2V0dXBgIG9yCi0gICA6bWV0aDpgaGFuZGxlYCByYWlzZSBhbiBleGNlcHRpb24sIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgYmUgY2FsbGVkLgorICAgcmVxdWlyZWQuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuICBJZiA6bWV0aDpgc2V0dXBgCisgICByYWlzZXMgYW4gZXhjZXB0aW9uLCB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IGJlIGNhbGxlZC4KIAogCiAuLiBtZXRob2Q6OiBSZXF1ZXN0SGFuZGxlci5oYW5kbGUoKQpAQCAtMzU5LDcgKzM2MCw3IEBACiAgICAgICAgICAgIHByaW50ICJ7fSB3cm90ZToiLmZvcm1hdChzZWxmLmNsaWVudF9hZGRyZXNzWzBdKQogICAgICAgICAgICBwcmludCBzZWxmLmRhdGEKICAgICAgICAgICAgIyBqdXN0IHNlbmQgYmFjayB0aGUgc2FtZSBkYXRhLCBidXQgdXBwZXItY2FzZWQKLSAgICAgICAgICAgc2VsZi5yZXF1ZXN0LnNlbmQoc2VsZi5kYXRhLnVwcGVyKCkpCisgICAgICAgICAgIHNlbGYucmVxdWVzdC5zZW5kYWxsKHNlbGYuZGF0YS51cHBlcigpKQogCiAgICBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgICAgIEhPU1QsIFBPUlQgPSAibG9jYWxob3N0IiwgOTk5OQpAQCAtMzg5LDcgKzM5MCw3IEBACiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSBgYHJlYWRsaW5lKClgYCBjYWxsIGluIHRoZSBzZWNvbmQgaGFuZGxlciB3aWxsIGNhbGwKIGBgcmVjdigpYGAgbXVsdGlwbGUgdGltZXMgdW50aWwgaXQgZW5jb3VudGVycyBhIG5ld2xpbmUgY2hhcmFjdGVyLCB3aGlsZSB0aGUKIHNpbmdsZSBgYHJlY3YoKWBgIGNhbGwgaW4gdGhlIGZpcnN0IGhhbmRsZXIgd2lsbCBqdXN0IHJldHVybiB3aGF0IGhhcyBiZWVuIHNlbnQKLWZyb20gdGhlIGNsaWVudCBpbiBvbmUgYGBzZW5kKClgYCBjYWxsLgorZnJvbSB0aGUgY2xpZW50IGluIG9uZSBgYHNlbmRhbGwoKWBgIGNhbGwuCiAKIAogVGhpcyBpcyB0aGUgY2xpZW50IHNpZGU6OgpAQCAtNDA2LDcgKzQwNyw3IEBACiAgICB0cnk6CiAgICAgICAgIyBDb25uZWN0IHRvIHNlcnZlciBhbmQgc2VuZCBkYXRhCiAgICAgICAgc29jay5jb25uZWN0KChIT1NULCBQT1JUKSkKLSAgICAgICBzb2NrLnNlbmQoZGF0YSArICJcbiIpCisgICAgICAgc29jay5zZW5kYWxsKGRhdGEgKyAiXG4iKQogCiAgICAgICAgIyBSZWNlaXZlIGRhdGEgZnJvbSB0aGUgc2VydmVyIGFuZCBzaHV0IGRvd24KICAgICAgICByZWNlaXZlZCA9IHNvY2sucmVjdigxMDI0KQpAQCAtNTA0LDcgKzUwNSw3IEBACiAgICAgICAgICAgIGRhdGEgPSBzZWxmLnJlcXVlc3QucmVjdigxMDI0KQogICAgICAgICAgICBjdXJfdGhyZWFkID0gdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkKICAgICAgICAgICAgcmVzcG9uc2UgPSAie306IHt9Ii5mb3JtYXQoY3VyX3RocmVhZC5uYW1lLCBkYXRhKQotICAgICAgICAgICBzZWxmLnJlcXVlc3Quc2VuZChyZXNwb25zZSkKKyAgICAgICAgICAgc2VsZi5yZXF1ZXN0LnNlbmRhbGwocmVzcG9uc2UpCiAKICAgIGNsYXNzIFRocmVhZGVkVENQU2VydmVyKFNvY2tldFNlcnZlci5UaHJlYWRpbmdNaXhJbiwgU29ja2V0U2VydmVyLlRDUFNlcnZlcik6CiAgICAgICAgcGFzcwpAQCAtNTEzLDcgKzUxNCw3IEBACiAgICAgICAgc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKICAgICAgICBzb2NrLmNvbm5lY3QoKGlwLCBwb3J0KSkKICAgICAgICB0cnk6Ci0gICAgICAgICAgIHNvY2suc2VuZChtZXNzYWdlKQorICAgICAgICAgICBzb2NrLnNlbmRhbGwobWVzc2FnZSkKICAgICAgICAgICAgcmVzcG9uc2UgPSBzb2NrLnJlY3YoMTAyNCkKICAgICAgICAgICAgcHJpbnQgIlJlY2VpdmVkOiB7fSIuZm9ybWF0KHJlc3BvbnNlKQogICAgICAgIGZpbmFsbHk6CmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zcWxpdGUzLnJzdCBiL0RvYy9saWJyYXJ5L3NxbGl0ZTMucnN0CmluZGV4IDUwYTAzNmYuLmZmNjM0YzAgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3NxbGl0ZTMucnN0CisrKyBiL0RvYy9saWJyYXJ5L3NxbGl0ZTMucnN0CkBAIC0zLDcgKzMsNyBAQAogCiAuLiBtb2R1bGU6OiBzcWxpdGUzCiAgICA6c3lub3BzaXM6IEEgREItQVBJIDIuMCBpbXBsZW1lbnRhdGlvbiB1c2luZyBTUUxpdGUgMy54LgotLi4gc2VjdGlvbmF1dGhvcjo6IEdlcmhhcmQgSMODwqRyaW5nIDxnaEBnaGFlcmluZy5kZT4KKy4uIHNlY3Rpb25hdXRob3I6OiBHZXJoYXJkIEjDpHJpbmcgPGdoQGdoYWVyaW5nLmRlPgogCiAKIC4uIHZlcnNpb25hZGRlZDo6IDIuNQpAQCAtMTUsMTQgKzE1LDE1IEBACiBhcHBsaWNhdGlvbiB1c2luZyBTUUxpdGUgYW5kIHRoZW4gcG9ydCB0aGUgY29kZSB0byBhIGxhcmdlciBkYXRhYmFzZSBzdWNoIGFzCiBQb3N0Z3JlU1FMIG9yIE9yYWNsZS4KIAotc3FsaXRlMyB3YXMgd3JpdHRlbiBieSBHZXJoYXJkIEjDpHJpbmcgYW5kIHByb3ZpZGVzIGEgU1FMIGludGVyZmFjZSBjb21wbGlhbnQKLXdpdGggdGhlIERCLUFQSSAyLjAgc3BlY2lmaWNhdGlvbiBkZXNjcmliZWQgYnkgOnBlcDpgMjQ5YC4KK1RoZSBzcWxpdGUzIG1vZHVsZSB3YXMgd3JpdHRlbiBieSBHZXJoYXJkIEjDpHJpbmcuICBJdCBwcm92aWRlcyBhIFNRTCBpbnRlcmZhY2UKK2NvbXBsaWFudCB3aXRoIHRoZSBEQi1BUEkgMi4wIHNwZWNpZmljYXRpb24gZGVzY3JpYmVkIGJ5IDpwZXA6YDI0OWAuCiAKIFRvIHVzZSB0aGUgbW9kdWxlLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgYSA6Y2xhc3M6YENvbm5lY3Rpb25gIG9iamVjdCB0aGF0CiByZXByZXNlbnRzIHRoZSBkYXRhYmFzZS4gIEhlcmUgdGhlIGRhdGEgd2lsbCBiZSBzdG9yZWQgaW4gdGhlCi06ZmlsZTpgL3RtcC9leGFtcGxlYCBmaWxlOjoKKzpmaWxlOmBleGFtcGxlLmRiYCBmaWxlOjoKIAotICAgY29ubiA9IHNxbGl0ZTMuY29ubmVjdCgnL3RtcC9leGFtcGxlJykKKyAgIGltcG9ydCBzcWxpdGUzCisgICBjb25uID0gc3FsaXRlMy5jb25uZWN0KCdleGFtcGxlLmRiJykKIAogWW91IGNhbiBhbHNvIHN1cHBseSB0aGUgc3BlY2lhbCBuYW1lIGBgOm1lbW9yeTpgYCB0byBjcmVhdGUgYSBkYXRhYmFzZSBpbiBSQU0uCiAKQEAgLTMyLDIzICszMywyOSBAQAogICAgYyA9IGNvbm4uY3Vyc29yKCkKIAogICAgIyBDcmVhdGUgdGFibGUKLSAgIGMuZXhlY3V0ZSgnJydjcmVhdGUgdGFibGUgc3RvY2tzCi0gICAoZGF0ZSB0ZXh0LCB0cmFucyB0ZXh0LCBzeW1ib2wgdGV4dCwKLSAgICBxdHkgcmVhbCwgcHJpY2UgcmVhbCknJycpCisgICBjLmV4ZWN1dGUoJycnQ1JFQVRFIFRBQkxFIHN0b2NrcworICAgICAgICAgICAgICAgIChkYXRlIHRleHQsIHRyYW5zIHRleHQsIHN5bWJvbCB0ZXh0LCBxdHkgcmVhbCwgcHJpY2UgcmVhbCknJycpCiAKICAgICMgSW5zZXJ0IGEgcm93IG9mIGRhdGEKLSAgIGMuZXhlY3V0ZSgiIiJpbnNlcnQgaW50byBzdG9ja3MKLSAgICAgICAgICAgICB2YWx1ZXMgKCcyMDA2LTAxLTA1JywnQlVZJywnUkhBVCcsMTAwLDM1LjE0KSIiIikKKyAgIGMuZXhlY3V0ZSgiSU5TRVJUIElOVE8gc3RvY2tzIFZBTFVFUyAoJzIwMDYtMDEtMDUnLCdCVVknLCdSSEFUJywxMDAsMzUuMTQpIikKIAogICAgIyBTYXZlIChjb21taXQpIHRoZSBjaGFuZ2VzCiAgICBjb25uLmNvbW1pdCgpCiAKLSAgICMgV2UgY2FuIGFsc28gY2xvc2UgdGhlIGN1cnNvciBpZiB3ZSBhcmUgZG9uZSB3aXRoIGl0Ci0gICBjLmNsb3NlKCkKKyAgICMgV2UgY2FuIGFsc28gY2xvc2UgdGhlIGNvbm5lY3Rpb24gaWYgd2UgYXJlIGRvbmUgd2l0aCBpdC4KKyAgICMgSnVzdCBiZSBzdXJlIGFueSBjaGFuZ2VzIGhhdmUgYmVlbiBjb21taXR0ZWQgb3IgdGhleSB3aWxsIGJlIGxvc3QuCisgICBjb25uLmNsb3NlKCkKKworVGhlIGRhdGEgeW91J3ZlIHNhdmVkIGlzIHBlcnNpc3RlbnQgYW5kIGlzIGF2YWlsYWJsZSBpbiBzdWJzZXF1ZW50IHNlc3Npb25zOjoKKworICAgaW1wb3J0IHNxbGl0ZTMKKyAgIGNvbm4gPSBzcWxpdGUzLmNvbm5lY3QoJ2V4YW1wbGUuZGInKQorICAgYyA9IGNvbm4uY3Vyc29yKCkKIAogVXN1YWxseSB5b3VyIFNRTCBvcGVyYXRpb25zIHdpbGwgbmVlZCB0byB1c2UgdmFsdWVzIGZyb20gUHl0aG9uIHZhcmlhYmxlcy4gIFlvdQogc2hvdWxkbid0IGFzc2VtYmxlIHlvdXIgcXVlcnkgdXNpbmcgUHl0aG9uJ3Mgc3RyaW5nIG9wZXJhdGlvbnMgYmVjYXVzZSBkb2luZyBzbwotaXMgaW5zZWN1cmU7IGl0IG1ha2VzIHlvdXIgcHJvZ3JhbSB2dWxuZXJhYmxlIHRvIGFuIFNRTCBpbmplY3Rpb24gYXR0YWNrLgoraXMgaW5zZWN1cmU7IGl0IG1ha2VzIHlvdXIgcHJvZ3JhbSB2dWxuZXJhYmxlIHRvIGFuIFNRTCBpbmplY3Rpb24gYXR0YWNrCisoc2VlIGh0dHA6Ly94a2NkLmNvbS8zMjcvIGZvciBodW1vcm91cyBleGFtcGxlIG9mIHdoYXQgY2FuIGdvIHdyb25nKS4KIAogSW5zdGVhZCwgdXNlIHRoZSBEQi1BUEkncyBwYXJhbWV0ZXIgc3Vic3RpdHV0aW9uLiAgUHV0IGBgP2BgIGFzIGEgcGxhY2Vob2xkZXIKIHdoZXJldmVyIHlvdSB3YW50IHRvIHVzZSBhIHZhbHVlLCBhbmQgdGhlbiBwcm92aWRlIGEgdHVwbGUgb2YgdmFsdWVzIGFzIHRoZQpAQCAtNTcsMTkgKzY0LDIwIEBACiBleGFtcGxlOjoKIAogICAgIyBOZXZlciBkbyB0aGlzIC0tIGluc2VjdXJlIQotICAgc3ltYm9sID0gJ0lCTScKLSAgIGMuZXhlY3V0ZSgiLi4uIHdoZXJlIHN5bWJvbCA9ICclcyciICUgc3ltYm9sKQorICAgc3ltYm9sID0gJ1JIQVQnCisgICBjLmV4ZWN1dGUoIlNFTEVDVCAqIEZST00gc3RvY2tzIFdIRVJFIHN5bWJvbCA9ICclcyciICUgc3ltYm9sKQogCiAgICAjIERvIHRoaXMgaW5zdGVhZAotICAgdCA9IChzeW1ib2wsKQotICAgYy5leGVjdXRlKCdzZWxlY3QgKiBmcm9tIHN0b2NrcyB3aGVyZSBzeW1ib2w9PycsIHQpCisgICB0ID0gKCdSSEFUJywpCisgICBjLmV4ZWN1dGUoJ1NFTEVDVCAqIEZST00gc3RvY2tzIFdIRVJFIHN5bWJvbD0/JywgdCkKKyAgIHByaW50IGMuZmV0Y2hvbmUoKQogCi0gICAjIExhcmdlciBleGFtcGxlCi0gICBmb3IgdCBpbiBbKCcyMDA2LTAzLTI4JywgJ0JVWScsICdJQk0nLCAxMDAwLCA0NS4wMCksCi0gICAgICAgICAgICAgKCcyMDA2LTA0LTA1JywgJ0JVWScsICdNU09GVCcsIDEwMDAsIDcyLjAwKSwKLSAgICAgICAgICAgICAoJzIwMDYtMDQtMDYnLCAnU0VMTCcsICdJQk0nLCA1MDAsIDUzLjAwKSwKLSAgICAgICAgICAgIF06Ci0gICAgICAgYy5leGVjdXRlKCdpbnNlcnQgaW50byBzdG9ja3MgdmFsdWVzICg/LD8sPyw/LD8pJywgdCkKKyAgICMgTGFyZ2VyIGV4YW1wbGUgdGhhdCBpbnNlcnRzIG1hbnkgcmVjb3JkcyBhdCBhIHRpbWUKKyAgIHB1cmNoYXNlcyA9IFsoJzIwMDYtMDMtMjgnLCAnQlVZJywgJ0lCTScsIDEwMDAsIDQ1LjAwKSwKKyAgICAgICAgICAgICAgICAoJzIwMDYtMDQtMDUnLCAnQlVZJywgJ01TRlQnLCAxMDAwLCA3Mi4wMCksCisgICAgICAgICAgICAgICAgKCcyMDA2LTA0LTA2JywgJ1NFTEwnLCAnSUJNJywgNTAwLCA1My4wMCksCisgICAgICAgICAgICAgICBdCisgICBjLmV4ZWN1dGVtYW55KCdJTlNFUlQgSU5UTyBzdG9ja3MgVkFMVUVTICg/LD8sPyw/LD8pJywgcHVyY2hhc2VzKQogCiBUbyByZXRyaWV2ZSBkYXRhIGFmdGVyIGV4ZWN1dGluZyBhIFNFTEVDVCBzdGF0ZW1lbnQsIHlvdSBjYW4gZWl0aGVyIHRyZWF0IHRoZQogY3Vyc29yIGFzIGFuIDp0ZXJtOmBpdGVyYXRvcmAsIGNhbGwgdGhlIGN1cnNvcidzIDptZXRoOmB+Q3Vyc29yLmZldGNob25lYCBtZXRob2QgdG8KQEAgLTc4LDIxICs4NiwxOCBAQAogCiBUaGlzIGV4YW1wbGUgdXNlcyB0aGUgaXRlcmF0b3IgZm9ybTo6CiAKLSAgID4+PiBjID0gY29ubi5jdXJzb3IoKQotICAgPj4+IGMuZXhlY3V0ZSgnc2VsZWN0ICogZnJvbSBzdG9ja3Mgb3JkZXIgYnkgcHJpY2UnKQotICAgPj4+IGZvciByb3cgaW4gYzoKLSAgIC4uLiAgICBwcmludCByb3cKLSAgIC4uLgorICAgPj4+IGZvciByb3cgaW4gYy5leGVjdXRlKCdTRUxFQ1QgKiBGUk9NIHN0b2NrcyBPUkRFUiBCWSBwcmljZScpOgorICAgICAgICAgICBwcmludCByb3cKKwogICAgKHUnMjAwNi0wMS0wNScsIHUnQlVZJywgdSdSSEFUJywgMTAwLCAzNS4xNCkKICAgICh1JzIwMDYtMDMtMjgnLCB1J0JVWScsIHUnSUJNJywgMTAwMCwgNDUuMCkKICAgICh1JzIwMDYtMDQtMDYnLCB1J1NFTEwnLCB1J0lCTScsIDUwMCwgNTMuMCkKLSAgICh1JzIwMDYtMDQtMDUnLCB1J0JVWScsIHUnTVNPRlQnLCAxMDAwLCA3Mi4wKQotICAgPj4+CisgICAodScyMDA2LTA0LTA1JywgdSdCVVknLCB1J01TRlQnLCAxMDAwLCA3Mi4wKQogCiAKIC4uIHNlZWFsc286OgogCi0gICBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHlzcWxpdGUvCisgICBodHRwczovL2dpdGh1Yi5jb20vZ2hhZXJpbmcvcHlzcWxpdGUKICAgICAgIFRoZSBweXNxbGl0ZSB3ZWIgcGFnZSAtLSBzcWxpdGUzIGlzIGRldmVsb3BlZCBleHRlcm5hbGx5IHVuZGVyIHRoZSBuYW1lCiAgICAgICAicHlzcWxpdGUiLgogCkBAIC0xMDAsNiArMTA1LDkgQEAKICAgICAgIFRoZSBTUUxpdGUgd2ViIHBhZ2U7IHRoZSBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyB0aGUgc3ludGF4IGFuZCB0aGUKICAgICAgIGF2YWlsYWJsZSBkYXRhIHR5cGVzIGZvciB0aGUgc3VwcG9ydGVkIFNRTCBkaWFsZWN0LgogCisgICBodHRwOi8vd3d3Lnczc2Nob29scy5jb20vc3FsLworICAgICAgVHV0b3JpYWwsIHJlZmVyZW5jZSBhbmQgZXhhbXBsZXMgZm9yIGxlYXJuaW5nIFNRTCBzeW50YXguCisKICAgIDpwZXA6YDI0OWAgLSBEYXRhYmFzZSBBUEkgU3BlY2lmaWNhdGlvbiAyLjAKICAgICAgIFBFUCB3cml0dGVuIGJ5IE1hcmMtQW5kcsOpIExlbWJ1cmcuCiAKQEAgLTExMCw2ICsxMTgsMjQgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAKKy4uIGRhdGE6OiB2ZXJzaW9uCisKKyAgIFRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIG1vZHVsZSwgYXMgYSBzdHJpbmcuIFRoaXMgaXMgbm90IHRoZSB2ZXJzaW9uIG9mCisgICB0aGUgU1FMaXRlIGxpYnJhcnkuCisKKy4uIGRhdGE6OiB2ZXJzaW9uX2luZm8KKworICAgVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgbW9kdWxlLCBhcyBhIHR1cGxlIG9mIGludGVnZXJzLiBUaGlzIGlzIG5vdCB0aGUKKyAgIHZlcnNpb24gb2YgdGhlIFNRTGl0ZSBsaWJyYXJ5LgorCisuLiBkYXRhOjogc3FsaXRlX3ZlcnNpb24KKworICAgVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBydW4tdGltZSBTUUxpdGUgbGlicmFyeSwgYXMgYSBzdHJpbmcuCisKKy4uIGRhdGE6OiBzcWxpdGVfdmVyc2lvbl9pbmZvCisKKyAgIFRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgcnVuLXRpbWUgU1FMaXRlIGxpYnJhcnksIGFzIGEgdHVwbGUgb2YgaW50ZWdlcnMuCisKIC4uIGRhdGE6OiBQQVJTRV9ERUNMVFlQRVMKIAogICAgVGhpcyBjb25zdGFudCBpcyBtZWFudCB0byBiZSB1c2VkIHdpdGggdGhlICpkZXRlY3RfdHlwZXMqIHBhcmFtZXRlciBvZiB0aGUKQEAgLTE1Myw3ICsxNzksNyBAQAogICAgRm9yIHRoZSAqaXNvbGF0aW9uX2xldmVsKiBwYXJhbWV0ZXIsIHBsZWFzZSBzZWUgdGhlCiAgICA6YXR0cjpgQ29ubmVjdGlvbi5pc29sYXRpb25fbGV2ZWxgIHByb3BlcnR5IG9mIDpjbGFzczpgQ29ubmVjdGlvbmAgb2JqZWN0cy4KIAotICAgU1FMaXRlIG5hdGl2ZWx5IHN1cHBvcnRzIG9ubHkgdGhlIHR5cGVzIFRFWFQsIElOVEVHRVIsIEZMT0FULCBCTE9CIGFuZCBOVUxMLiBJZgorICAgU1FMaXRlIG5hdGl2ZWx5IHN1cHBvcnRzIG9ubHkgdGhlIHR5cGVzIFRFWFQsIElOVEVHRVIsIFJFQUwsIEJMT0IgYW5kIE5VTEwuIElmCiAgICB5b3Ugd2FudCB0byB1c2Ugb3RoZXIgdHlwZXMgeW91IG11c3QgYWRkIHN1cHBvcnQgZm9yIHRoZW0geW91cnNlbGYuIFRoZQogICAgKmRldGVjdF90eXBlcyogcGFyYW1ldGVyIGFuZCB0aGUgdXNpbmcgY3VzdG9tICoqY29udmVydGVycyoqIHJlZ2lzdGVyZWQgd2l0aCB0aGUKICAgIG1vZHVsZS1sZXZlbCA6ZnVuYzpgcmVnaXN0ZXJfY29udmVydGVyYCBmdW5jdGlvbiBhbGxvdyB5b3UgdG8gZWFzaWx5IGRvIHRoYXQuCkBAIC0yMDgsMTAgKzIzNCwxMCBAQAogLi4gZnVuY3Rpb246OiBlbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrcyhmbGFnKQogCiAgICBCeSBkZWZhdWx0IHlvdSB3aWxsIG5vdCBnZXQgYW55IHRyYWNlYmFja3MgaW4gdXNlci1kZWZpbmVkIGZ1bmN0aW9ucywKLSAgIGFnZ3JlZ2F0ZXMsIGNvbnZlcnRlcnMsIGF1dGhvcml6ZXIgY2FsbGJhY2tzIGV0Yy4gSWYgeW91IHdhbnQgdG8gZGVidWcgdGhlbSwgeW91Ci0gICBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggKmZsYWcqIGFzIFRydWUuIEFmdGVyd2FyZHMsIHlvdSB3aWxsIGdldCB0cmFjZWJhY2tzCi0gICBmcm9tIGNhbGxiYWNrcyBvbiBgYHN5cy5zdGRlcnJgYC4gVXNlIDpjb25zdDpgRmFsc2VgIHRvIGRpc2FibGUgdGhlIGZlYXR1cmUKLSAgIGFnYWluLgorICAgYWdncmVnYXRlcywgY29udmVydGVycywgYXV0aG9yaXplciBjYWxsYmFja3MgZXRjLiBJZiB5b3Ugd2FudCB0byBkZWJ1ZyB0aGVtLAorICAgeW91IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCAqZmxhZyogc2V0IHRvIGBgVHJ1ZWBgLiBBZnRlcndhcmRzLCB5b3Ugd2lsbAorICAgZ2V0IHRyYWNlYmFja3MgZnJvbSBjYWxsYmFja3Mgb24gYGBzeXMuc3RkZXJyYGAuIFVzZSA6Y29uc3Q6YEZhbHNlYCB0bworICAgZGlzYWJsZSB0aGUgZmVhdHVyZSBhZ2Fpbi4KIAogCiAuLiBfc3FsaXRlMy1jb25uZWN0aW9uLW9iamVjdHM6CkBAIC0yMjMsMjM3ICsyNDksMjM2IEBACiAKICAgIEEgU1FMaXRlIGRhdGFiYXNlIGNvbm5lY3Rpb24gaGFzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhbmQgbWV0aG9kczoKIAotLi4gYXR0cmlidXRlOjogQ29ubmVjdGlvbi5pc29sYXRpb25fbGV2ZWwKKyAgIC4uIGF0dHJpYnV0ZTo6IGlzb2xhdGlvbl9sZXZlbAogCi0gICBHZXQgb3Igc2V0IHRoZSBjdXJyZW50IGlzb2xhdGlvbiBsZXZlbC4gOmNvbnN0OmBOb25lYCBmb3IgYXV0b2NvbW1pdCBtb2RlIG9yCi0gICBvbmUgb2YgIkRFRkVSUkVEIiwgIklNTUVESUFURSIgb3IgIkVYQ0xVU0lWRSIuIFNlZSBzZWN0aW9uCi0gICA6cmVmOmBzcWxpdGUzLWNvbnRyb2xsaW5nLXRyYW5zYWN0aW9uc2AgZm9yIGEgbW9yZSBkZXRhaWxlZCBleHBsYW5hdGlvbi4KKyAgICAgIEdldCBvciBzZXQgdGhlIGN1cnJlbnQgaXNvbGF0aW9uIGxldmVsLiA6Y29uc3Q6YE5vbmVgIGZvciBhdXRvY29tbWl0IG1vZGUgb3IKKyAgICAgIG9uZSBvZiAiREVGRVJSRUQiLCAiSU1NRURJQVRFIiBvciAiRVhDTFVTSVZFIi4gU2VlIHNlY3Rpb24KKyAgICAgIDpyZWY6YHNxbGl0ZTMtY29udHJvbGxpbmctdHJhbnNhY3Rpb25zYCBmb3IgYSBtb3JlIGRldGFpbGVkIGV4cGxhbmF0aW9uLgogCiAKLS4uIG1ldGhvZDo6IENvbm5lY3Rpb24uY3Vyc29yKFtjdXJzb3JDbGFzc10pCisgICAuLiBtZXRob2Q6OiBjdXJzb3IoW2N1cnNvckNsYXNzXSkKIAotICAgVGhlIGN1cnNvciBtZXRob2QgYWNjZXB0cyBhIHNpbmdsZSBvcHRpb25hbCBwYXJhbWV0ZXIgKmN1cnNvckNsYXNzKi4gSWYKLSAgIHN1cHBsaWVkLCB0aGlzIG11c3QgYmUgYSBjdXN0b20gY3Vyc29yIGNsYXNzIHRoYXQgZXh0ZW5kcwotICAgOmNsYXNzOmBzcWxpdGUzLkN1cnNvcmAuCisgICAgICBUaGUgY3Vyc29yIG1ldGhvZCBhY2NlcHRzIGEgc2luZ2xlIG9wdGlvbmFsIHBhcmFtZXRlciAqY3Vyc29yQ2xhc3MqLiBJZgorICAgICAgc3VwcGxpZWQsIHRoaXMgbXVzdCBiZSBhIGN1c3RvbSBjdXJzb3IgY2xhc3MgdGhhdCBleHRlbmRzCisgICAgICA6Y2xhc3M6YHNxbGl0ZTMuQ3Vyc29yYC4KIAorICAgLi4gbWV0aG9kOjogY29tbWl0KCkKIAotLi4gbWV0aG9kOjogQ29ubmVjdGlvbi5jb21taXQoKQorICAgICAgVGhpcyBtZXRob2QgY29tbWl0cyB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4gSWYgeW91IGRvbid0IGNhbGwgdGhpcyBtZXRob2QsCisgICAgICBhbnl0aGluZyB5b3UgZGlkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gYGBjb21taXQoKWBgIGlzIG5vdCB2aXNpYmxlIGZyb20KKyAgICAgIG90aGVyIGRhdGFiYXNlIGNvbm5lY3Rpb25zLiBJZiB5b3Ugd29uZGVyIHdoeSB5b3UgZG9uJ3Qgc2VlIHRoZSBkYXRhIHlvdSd2ZQorICAgICAgd3JpdHRlbiB0byB0aGUgZGF0YWJhc2UsIHBsZWFzZSBjaGVjayB5b3UgZGlkbid0IGZvcmdldCB0byBjYWxsIHRoaXMgbWV0aG9kLgogCi0gICBUaGlzIG1ldGhvZCBjb21taXRzIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiBJZiB5b3UgZG9uJ3QgY2FsbCB0aGlzIG1ldGhvZCwKLSAgIGFueXRoaW5nIHlvdSBkaWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0byBgYGNvbW1pdCgpYGAgaXMgbm90IHZpc2libGUgZnJvbQotICAgb3RoZXIgZGF0YWJhc2UgY29ubmVjdGlvbnMuIElmIHlvdSB3b25kZXIgd2h5IHlvdSBkb24ndCBzZWUgdGhlIGRhdGEgeW91J3ZlCi0gICB3cml0dGVuIHRvIHRoZSBkYXRhYmFzZSwgcGxlYXNlIGNoZWNrIHlvdSBkaWRuJ3QgZm9yZ2V0IHRvIGNhbGwgdGhpcyBtZXRob2QuCisgICAuLiBtZXRob2Q6OiByb2xsYmFjaygpCiAKLS4uIG1ldGhvZDo6IENvbm5lY3Rpb24ucm9sbGJhY2soKQorICAgICAgVGhpcyBtZXRob2Qgcm9sbHMgYmFjayBhbnkgY2hhbmdlcyB0byB0aGUgZGF0YWJhc2Ugc2luY2UgdGhlIGxhc3QgY2FsbCB0bworICAgICAgOm1ldGg6YGNvbW1pdGAuCiAKLSAgIFRoaXMgbWV0aG9kIHJvbGxzIGJhY2sgYW55IGNoYW5nZXMgdG8gdGhlIGRhdGFiYXNlIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8KLSAgIDptZXRoOmBjb21taXRgLgorICAgLi4gbWV0aG9kOjogY2xvc2UoKQogCi0uLiBtZXRob2Q6OiBDb25uZWN0aW9uLmNsb3NlKCkKKyAgICAgIFRoaXMgY2xvc2VzIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uLiBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5CisgICAgICBjYWxsIDptZXRoOmBjb21taXRgLiBJZiB5b3UganVzdCBjbG9zZSB5b3VyIGRhdGFiYXNlIGNvbm5lY3Rpb24gd2l0aG91dAorICAgICAgY2FsbGluZyA6bWV0aDpgY29tbWl0YCBmaXJzdCwgeW91ciBjaGFuZ2VzIHdpbGwgYmUgbG9zdCEKIAotICAgVGhpcyBjbG9zZXMgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24uIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkKLSAgIGNhbGwgOm1ldGg6YGNvbW1pdGAuIElmIHlvdSBqdXN0IGNsb3NlIHlvdXIgZGF0YWJhc2UgY29ubmVjdGlvbiB3aXRob3V0Ci0gICBjYWxsaW5nIDptZXRoOmBjb21taXRgIGZpcnN0LCB5b3VyIGNoYW5nZXMgd2lsbCBiZSBsb3N0IQorICAgLi4gbWV0aG9kOjogZXhlY3V0ZShzcWwsIFtwYXJhbWV0ZXJzXSkKIAotLi4gbWV0aG9kOjogQ29ubmVjdGlvbi5leGVjdXRlKHNxbCwgW3BhcmFtZXRlcnNdKQorICAgICAgVGhpcyBpcyBhIG5vbnN0YW5kYXJkIHNob3J0Y3V0IHRoYXQgY3JlYXRlcyBhbiBpbnRlcm1lZGlhdGUgY3Vyc29yIG9iamVjdCBieQorICAgICAgY2FsbGluZyB0aGUgY3Vyc29yIG1ldGhvZCwgdGhlbiBjYWxscyB0aGUgY3Vyc29yJ3MgOm1ldGg6YGV4ZWN1dGUKKyAgICAgIDxDdXJzb3IuZXhlY3V0ZT5gIG1ldGhvZCB3aXRoIHRoZSBwYXJhbWV0ZXJzIGdpdmVuLgogCi0gICBUaGlzIGlzIGEgbm9uc3RhbmRhcmQgc2hvcnRjdXQgdGhhdCBjcmVhdGVzIGFuIGludGVybWVkaWF0ZSBjdXJzb3Igb2JqZWN0IGJ5Ci0gICBjYWxsaW5nIHRoZSBjdXJzb3IgbWV0aG9kLCB0aGVuIGNhbGxzIHRoZSBjdXJzb3IncyA6bWV0aDpgZXhlY3V0ZQotICAgPEN1cnNvci5leGVjdXRlPmAgbWV0aG9kIHdpdGggdGhlIHBhcmFtZXRlcnMgZ2l2ZW4uCiAKKyAgIC4uIG1ldGhvZDo6IGV4ZWN1dGVtYW55KHNxbCwgW3BhcmFtZXRlcnNdKQogCi0uLiBtZXRob2Q6OiBDb25uZWN0aW9uLmV4ZWN1dGVtYW55KHNxbCwgW3BhcmFtZXRlcnNdKQorICAgICAgVGhpcyBpcyBhIG5vbnN0YW5kYXJkIHNob3J0Y3V0IHRoYXQgY3JlYXRlcyBhbiBpbnRlcm1lZGlhdGUgY3Vyc29yIG9iamVjdCBieQorICAgICAgY2FsbGluZyB0aGUgY3Vyc29yIG1ldGhvZCwgdGhlbiBjYWxscyB0aGUgY3Vyc29yJ3MgOm1ldGg6YGV4ZWN1dGVtYW55CisgICAgICA8Q3Vyc29yLmV4ZWN1dGVtYW55PmAgbWV0aG9kIHdpdGggdGhlIHBhcmFtZXRlcnMgZ2l2ZW4uCiAKLSAgIFRoaXMgaXMgYSBub25zdGFuZGFyZCBzaG9ydGN1dCB0aGF0IGNyZWF0ZXMgYW4gaW50ZXJtZWRpYXRlIGN1cnNvciBvYmplY3QgYnkKLSAgIGNhbGxpbmcgdGhlIGN1cnNvciBtZXRob2QsIHRoZW4gY2FsbHMgdGhlIGN1cnNvcidzIDptZXRoOmBleGVjdXRlbWFueQotICAgPEN1cnNvci5leGVjdXRlbWFueT5gIG1ldGhvZCB3aXRoIHRoZSBwYXJhbWV0ZXJzIGdpdmVuLgorICAgLi4gbWV0aG9kOjogZXhlY3V0ZXNjcmlwdChzcWxfc2NyaXB0KQogCi0uLiBtZXRob2Q6OiBDb25uZWN0aW9uLmV4ZWN1dGVzY3JpcHQoc3FsX3NjcmlwdCkKKyAgICAgIFRoaXMgaXMgYSBub25zdGFuZGFyZCBzaG9ydGN1dCB0aGF0IGNyZWF0ZXMgYW4gaW50ZXJtZWRpYXRlIGN1cnNvciBvYmplY3QgYnkKKyAgICAgIGNhbGxpbmcgdGhlIGN1cnNvciBtZXRob2QsIHRoZW4gY2FsbHMgdGhlIGN1cnNvcidzIDptZXRoOmBleGVjdXRlc2NyaXB0CisgICAgICA8Q3Vyc29yLmV4ZWN1dGVzY3JpcHQ+YCBtZXRob2Qgd2l0aCB0aGUgcGFyYW1ldGVycyBnaXZlbi4KIAotICAgVGhpcyBpcyBhIG5vbnN0YW5kYXJkIHNob3J0Y3V0IHRoYXQgY3JlYXRlcyBhbiBpbnRlcm1lZGlhdGUgY3Vyc29yIG9iamVjdCBieQotICAgY2FsbGluZyB0aGUgY3Vyc29yIG1ldGhvZCwgdGhlbiBjYWxscyB0aGUgY3Vyc29yJ3MgOm1ldGg6YGV4ZWN1dGVzY3JpcHQKLSAgIDxDdXJzb3IuZXhlY3V0ZXNjcmlwdD5gIG1ldGhvZCB3aXRoIHRoZSBwYXJhbWV0ZXJzIGdpdmVuLgogCisgICAuLiBtZXRob2Q6OiBjcmVhdGVfZnVuY3Rpb24obmFtZSwgbnVtX3BhcmFtcywgZnVuYykKIAotLi4gbWV0aG9kOjogQ29ubmVjdGlvbi5jcmVhdGVfZnVuY3Rpb24obmFtZSwgbnVtX3BhcmFtcywgZnVuYykKKyAgICAgIENyZWF0ZXMgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gdGhhdCB5b3UgY2FuIGxhdGVyIHVzZSBmcm9tIHdpdGhpbiBTUUwKKyAgICAgIHN0YXRlbWVudHMgdW5kZXIgdGhlIGZ1bmN0aW9uIG5hbWUgKm5hbWUqLiAqbnVtX3BhcmFtcyogaXMgdGhlIG51bWJlciBvZgorICAgICAgcGFyYW1ldGVycyB0aGUgZnVuY3Rpb24gYWNjZXB0cywgYW5kICpmdW5jKiBpcyBhIFB5dGhvbiBjYWxsYWJsZSB0aGF0IGlzIGNhbGxlZAorICAgICAgYXMgdGhlIFNRTCBmdW5jdGlvbi4KIAotICAgQ3JlYXRlcyBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbiB0aGF0IHlvdSBjYW4gbGF0ZXIgdXNlIGZyb20gd2l0aGluIFNRTAotICAgc3RhdGVtZW50cyB1bmRlciB0aGUgZnVuY3Rpb24gbmFtZSAqbmFtZSouICpudW1fcGFyYW1zKiBpcyB0aGUgbnVtYmVyIG9mCi0gICBwYXJhbWV0ZXJzIHRoZSBmdW5jdGlvbiBhY2NlcHRzLCBhbmQgKmZ1bmMqIGlzIGEgUHl0aG9uIGNhbGxhYmxlIHRoYXQgaXMgY2FsbGVkCi0gICBhcyB0aGUgU1FMIGZ1bmN0aW9uLgorICAgICAgVGhlIGZ1bmN0aW9uIGNhbiByZXR1cm4gYW55IG9mIHRoZSB0eXBlcyBzdXBwb3J0ZWQgYnkgU1FMaXRlOiB1bmljb2RlLCBzdHIsIGludCwKKyAgICAgIGxvbmcsIGZsb2F0LCBidWZmZXIgYW5kIE5vbmUuCiAKLSAgIFRoZSBmdW5jdGlvbiBjYW4gcmV0dXJuIGFueSBvZiB0aGUgdHlwZXMgc3VwcG9ydGVkIGJ5IFNRTGl0ZTogdW5pY29kZSwgc3RyLCBpbnQsCi0gICBsb25nLCBmbG9hdCwgYnVmZmVyIGFuZCBOb25lLgorICAgICAgRXhhbXBsZToKIAotICAgRXhhbXBsZToKKyAgICAgIC4uIGxpdGVyYWxpbmNsdWRlOjogLi4vaW5jbHVkZXMvc3FsaXRlMy9tZDVmdW5jLnB5CiAKLSAgIC4uIGxpdGVyYWxpbmNsdWRlOjogLi4vaW5jbHVkZXMvc3FsaXRlMy9tZDVmdW5jLnB5CiAKKyAgIC4uIG1ldGhvZDo6IGNyZWF0ZV9hZ2dyZWdhdGUobmFtZSwgbnVtX3BhcmFtcywgYWdncmVnYXRlX2NsYXNzKQogCi0uLiBtZXRob2Q6OiBDb25uZWN0aW9uLmNyZWF0ZV9hZ2dyZWdhdGUobmFtZSwgbnVtX3BhcmFtcywgYWdncmVnYXRlX2NsYXNzKQorICAgICAgQ3JlYXRlcyBhIHVzZXItZGVmaW5lZCBhZ2dyZWdhdGUgZnVuY3Rpb24uCiAKLSAgIENyZWF0ZXMgYSB1c2VyLWRlZmluZWQgYWdncmVnYXRlIGZ1bmN0aW9uLgorICAgICAgVGhlIGFnZ3JlZ2F0ZSBjbGFzcyBtdXN0IGltcGxlbWVudCBhIGBgc3RlcGBgIG1ldGhvZCwgd2hpY2ggYWNjZXB0cyB0aGUgbnVtYmVyCisgICAgICBvZiBwYXJhbWV0ZXJzICpudW1fcGFyYW1zKiwgYW5kIGEgYGBmaW5hbGl6ZWBgIG1ldGhvZCB3aGljaCB3aWxsIHJldHVybiB0aGUKKyAgICAgIGZpbmFsIHJlc3VsdCBvZiB0aGUgYWdncmVnYXRlLgogCi0gICBUaGUgYWdncmVnYXRlIGNsYXNzIG11c3QgaW1wbGVtZW50IGEgYGBzdGVwYGAgbWV0aG9kLCB3aGljaCBhY2NlcHRzIHRoZSBudW1iZXIKLSAgIG9mIHBhcmFtZXRlcnMgKm51bV9wYXJhbXMqLCBhbmQgYSBgYGZpbmFsaXplYGAgbWV0aG9kIHdoaWNoIHdpbGwgcmV0dXJuIHRoZQotICAgZmluYWwgcmVzdWx0IG9mIHRoZSBhZ2dyZWdhdGUuCisgICAgICBUaGUgYGBmaW5hbGl6ZWBgIG1ldGhvZCBjYW4gcmV0dXJuIGFueSBvZiB0aGUgdHlwZXMgc3VwcG9ydGVkIGJ5IFNRTGl0ZToKKyAgICAgIHVuaWNvZGUsIHN0ciwgaW50LCBsb25nLCBmbG9hdCwgYnVmZmVyIGFuZCBOb25lLgogCi0gICBUaGUgYGBmaW5hbGl6ZWBgIG1ldGhvZCBjYW4gcmV0dXJuIGFueSBvZiB0aGUgdHlwZXMgc3VwcG9ydGVkIGJ5IFNRTGl0ZToKLSAgIHVuaWNvZGUsIHN0ciwgaW50LCBsb25nLCBmbG9hdCwgYnVmZmVyIGFuZCBOb25lLgorICAgICAgRXhhbXBsZToKIAotICAgRXhhbXBsZToKKyAgICAgIC4uIGxpdGVyYWxpbmNsdWRlOjogLi4vaW5jbHVkZXMvc3FsaXRlMy9teXN1bWFnZ3IucHkKIAotICAgLi4gbGl0ZXJhbGluY2x1ZGU6OiAuLi9pbmNsdWRlcy9zcWxpdGUzL215c3VtYWdnci5weQogCisgICAuLiBtZXRob2Q6OiBjcmVhdGVfY29sbGF0aW9uKG5hbWUsIGNhbGxhYmxlKQogCi0uLiBtZXRob2Q6OiBDb25uZWN0aW9uLmNyZWF0ZV9jb2xsYXRpb24obmFtZSwgY2FsbGFibGUpCisgICAgICBDcmVhdGVzIGEgY29sbGF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCAqbmFtZSogYW5kICpjYWxsYWJsZSouIFRoZSBjYWxsYWJsZSB3aWxsCisgICAgICBiZSBwYXNzZWQgdHdvIHN0cmluZyBhcmd1bWVudHMuIEl0IHNob3VsZCByZXR1cm4gLTEgaWYgdGhlIGZpcnN0IGlzIG9yZGVyZWQKKyAgICAgIGxvd2VyIHRoYW4gdGhlIHNlY29uZCwgMCBpZiB0aGV5IGFyZSBvcmRlcmVkIGVxdWFsIGFuZCAxIGlmIHRoZSBmaXJzdCBpcyBvcmRlcmVkCisgICAgICBoaWdoZXIgdGhhbiB0aGUgc2Vjb25kLiAgTm90ZSB0aGF0IHRoaXMgY29udHJvbHMgc29ydGluZyAoT1JERVIgQlkgaW4gU1FMKSBzbworICAgICAgeW91ciBjb21wYXJpc29ucyBkb24ndCBhZmZlY3Qgb3RoZXIgU1FMIG9wZXJhdGlvbnMuCiAKLSAgIENyZWF0ZXMgYSBjb2xsYXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkICpuYW1lKiBhbmQgKmNhbGxhYmxlKi4gVGhlIGNhbGxhYmxlIHdpbGwKLSAgIGJlIHBhc3NlZCB0d28gc3RyaW5nIGFyZ3VtZW50cy4gSXQgc2hvdWxkIHJldHVybiAtMSBpZiB0aGUgZmlyc3QgaXMgb3JkZXJlZAotICAgbG93ZXIgdGhhbiB0aGUgc2Vjb25kLCAwIGlmIHRoZXkgYXJlIG9yZGVyZWQgZXF1YWwgYW5kIDEgaWYgdGhlIGZpcnN0IGlzIG9yZGVyZWQKLSAgIGhpZ2hlciB0aGFuIHRoZSBzZWNvbmQuICBOb3RlIHRoYXQgdGhpcyBjb250cm9scyBzb3J0aW5nIChPUkRFUiBCWSBpbiBTUUwpIHNvCi0gICB5b3VyIGNvbXBhcmlzb25zIGRvbid0IGFmZmVjdCBvdGhlciBTUUwgb3BlcmF0aW9ucy4KKyAgICAgIE5vdGUgdGhhdCB0aGUgY2FsbGFibGUgd2lsbCBnZXQgaXRzIHBhcmFtZXRlcnMgYXMgUHl0aG9uIGJ5dGVzdHJpbmdzLCB3aGljaCB3aWxsCisgICAgICBub3JtYWxseSBiZSBlbmNvZGVkIGluIFVURi04LgogCi0gICBOb3RlIHRoYXQgdGhlIGNhbGxhYmxlIHdpbGwgZ2V0IGl0cyBwYXJhbWV0ZXJzIGFzIFB5dGhvbiBieXRlc3RyaW5ncywgd2hpY2ggd2lsbAotICAgbm9ybWFsbHkgYmUgZW5jb2RlZCBpbiBVVEYtOC4KKyAgICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBhIGN1c3RvbSBjb2xsYXRpb24gdGhhdCBzb3J0cyAidGhlIHdyb25nIHdheSI6CiAKLSAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBhIGN1c3RvbSBjb2xsYXRpb24gdGhhdCBzb3J0cyAidGhlIHdyb25nIHdheSI6CisgICAgICAuLiBsaXRlcmFsaW5jbHVkZTo6IC4uL2luY2x1ZGVzL3NxbGl0ZTMvY29sbGF0aW9uX3JldmVyc2UucHkKIAotICAgLi4gbGl0ZXJhbGluY2x1ZGU6OiAuLi9pbmNsdWRlcy9zcWxpdGUzL2NvbGxhdGlvbl9yZXZlcnNlLnB5CisgICAgICBUbyByZW1vdmUgYSBjb2xsYXRpb24sIGNhbGwgYGBjcmVhdGVfY29sbGF0aW9uYGAgd2l0aCBOb25lIGFzIGNhbGxhYmxlOjoKIAotICAgVG8gcmVtb3ZlIGEgY29sbGF0aW9uLCBjYWxsIGBgY3JlYXRlX2NvbGxhdGlvbmBgIHdpdGggTm9uZSBhcyBjYWxsYWJsZTo6CisgICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigicmV2ZXJzZSIsIE5vbmUpCiAKLSAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJyZXZlcnNlIiwgTm9uZSkKIAorICAgLi4gbWV0aG9kOjogaW50ZXJydXB0KCkKIAotLi4gbWV0aG9kOjogQ29ubmVjdGlvbi5pbnRlcnJ1cHQoKQorICAgICAgWW91IGNhbiBjYWxsIHRoaXMgbWV0aG9kIGZyb20gYSBkaWZmZXJlbnQgdGhyZWFkIHRvIGFib3J0IGFueSBxdWVyaWVzIHRoYXQgbWlnaHQKKyAgICAgIGJlIGV4ZWN1dGluZyBvbiB0aGUgY29ubmVjdGlvbi4gVGhlIHF1ZXJ5IHdpbGwgdGhlbiBhYm9ydCBhbmQgdGhlIGNhbGxlciB3aWxsCisgICAgICBnZXQgYW4gZXhjZXB0aW9uLgogCi0gICBZb3UgY2FuIGNhbGwgdGhpcyBtZXRob2QgZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQgdG8gYWJvcnQgYW55IHF1ZXJpZXMgdGhhdCBtaWdodAotICAgYmUgZXhlY3V0aW5nIG9uIHRoZSBjb25uZWN0aW9uLiBUaGUgcXVlcnkgd2lsbCB0aGVuIGFib3J0IGFuZCB0aGUgY2FsbGVyIHdpbGwKLSAgIGdldCBhbiBleGNlcHRpb24uCiAKKyAgIC4uIG1ldGhvZDo6IHNldF9hdXRob3JpemVyKGF1dGhvcml6ZXJfY2FsbGJhY2spCiAKLS4uIG1ldGhvZDo6IENvbm5lY3Rpb24uc2V0X2F1dGhvcml6ZXIoYXV0aG9yaXplcl9jYWxsYmFjaykKKyAgICAgIFRoaXMgcm91dGluZSByZWdpc3RlcnMgYSBjYWxsYmFjay4gVGhlIGNhbGxiYWNrIGlzIGludm9rZWQgZm9yIGVhY2ggYXR0ZW1wdCB0bworICAgICAgYWNjZXNzIGEgY29sdW1uIG9mIGEgdGFibGUgaW4gdGhlIGRhdGFiYXNlLiBUaGUgY2FsbGJhY2sgc2hvdWxkIHJldHVybgorICAgICAgOmNvbnN0OmBTUUxJVEVfT0tgIGlmIGFjY2VzcyBpcyBhbGxvd2VkLCA6Y29uc3Q6YFNRTElURV9ERU5ZYCBpZiB0aGUgZW50aXJlIFNRTAorICAgICAgc3RhdGVtZW50IHNob3VsZCBiZSBhYm9ydGVkIHdpdGggYW4gZXJyb3IgYW5kIDpjb25zdDpgU1FMSVRFX0lHTk9SRWAgaWYgdGhlCisgICAgICBjb2x1bW4gc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBOVUxMIHZhbHVlLiBUaGVzZSBjb25zdGFudHMgYXJlIGF2YWlsYWJsZSBpbiB0aGUKKyAgICAgIDptb2Q6YHNxbGl0ZTNgIG1vZHVsZS4KIAotICAgVGhpcyByb3V0aW5lIHJlZ2lzdGVycyBhIGNhbGxiYWNrLiBUaGUgY2FsbGJhY2sgaXMgaW52b2tlZCBmb3IgZWFjaCBhdHRlbXB0IHRvCi0gICBhY2Nlc3MgYSBjb2x1bW4gb2YgYSB0YWJsZSBpbiB0aGUgZGF0YWJhc2UuIFRoZSBjYWxsYmFjayBzaG91bGQgcmV0dXJuCi0gICA6Y29uc3Q6YFNRTElURV9PS2AgaWYgYWNjZXNzIGlzIGFsbG93ZWQsIDpjb25zdDpgU1FMSVRFX0RFTllgIGlmIHRoZSBlbnRpcmUgU1FMCi0gICBzdGF0ZW1lbnQgc2hvdWxkIGJlIGFib3J0ZWQgd2l0aCBhbiBlcnJvciBhbmQgOmNvbnN0OmBTUUxJVEVfSUdOT1JFYCBpZiB0aGUKLSAgIGNvbHVtbiBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIE5VTEwgdmFsdWUuIFRoZXNlIGNvbnN0YW50cyBhcmUgYXZhaWxhYmxlIGluIHRoZQotICAgOm1vZDpgc3FsaXRlM2AgbW9kdWxlLgotCi0gICBUaGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGNhbGxiYWNrIHNpZ25pZmllcyB3aGF0IGtpbmQgb2Ygb3BlcmF0aW9uIGlzIHRvIGJlCi0gICBhdXRob3JpemVkLiBUaGUgc2Vjb25kIGFuZCB0aGlyZCBhcmd1bWVudCB3aWxsIGJlIGFyZ3VtZW50cyBvciA6Y29uc3Q6YE5vbmVgCi0gICBkZXBlbmRpbmcgb24gdGhlIGZpcnN0IGFyZ3VtZW50LiBUaGUgNHRoIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSBkYXRhYmFzZQotICAgKCJtYWluIiwgInRlbXAiLCBldGMuKSBpZiBhcHBsaWNhYmxlLiBUaGUgNXRoIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZQotICAgaW5uZXItbW9zdCB0cmlnZ2VyIG9yIHZpZXcgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgdGhlIGFjY2VzcyBhdHRlbXB0IG9yCi0gICA6Y29uc3Q6YE5vbmVgIGlmIHRoaXMgYWNjZXNzIGF0dGVtcHQgaXMgZGlyZWN0bHkgZnJvbSBpbnB1dCBTUUwgY29kZS4KKyAgICAgIFRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgY2FsbGJhY2sgc2lnbmlmaWVzIHdoYXQga2luZCBvZiBvcGVyYXRpb24gaXMgdG8gYmUKKyAgICAgIGF1dGhvcml6ZWQuIFRoZSBzZWNvbmQgYW5kIHRoaXJkIGFyZ3VtZW50IHdpbGwgYmUgYXJndW1lbnRzIG9yIDpjb25zdDpgTm9uZWAKKyAgICAgIGRlcGVuZGluZyBvbiB0aGUgZmlyc3QgYXJndW1lbnQuIFRoZSA0dGggYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlIGRhdGFiYXNlCisgICAgICAoIm1haW4iLCAidGVtcCIsIGV0Yy4pIGlmIGFwcGxpY2FibGUuIFRoZSA1dGggYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlCisgICAgICBpbm5lci1tb3N0IHRyaWdnZXIgb3IgdmlldyB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgYWNjZXNzIGF0dGVtcHQgb3IKKyAgICAgIDpjb25zdDpgTm9uZWAgaWYgdGhpcyBhY2Nlc3MgYXR0ZW1wdCBpcyBkaXJlY3RseSBmcm9tIGlucHV0IFNRTCBjb2RlLgogCi0gICBQbGVhc2UgY29uc3VsdCB0aGUgU1FMaXRlIGRvY3VtZW50YXRpb24gYWJvdXQgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIGZpcnN0Ci0gICBhcmd1bWVudCBhbmQgdGhlIG1lYW5pbmcgb2YgdGhlIHNlY29uZCBhbmQgdGhpcmQgYXJndW1lbnQgZGVwZW5kaW5nIG9uIHRoZSBmaXJzdAotICAgb25lLiBBbGwgbmVjZXNzYXJ5IGNvbnN0YW50cyBhcmUgYXZhaWxhYmxlIGluIHRoZSA6bW9kOmBzcWxpdGUzYCBtb2R1bGUuCisgICAgICBQbGVhc2UgY29uc3VsdCB0aGUgU1FMaXRlIGRvY3VtZW50YXRpb24gYWJvdXQgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIGZpcnN0CisgICAgICBhcmd1bWVudCBhbmQgdGhlIG1lYW5pbmcgb2YgdGhlIHNlY29uZCBhbmQgdGhpcmQgYXJndW1lbnQgZGVwZW5kaW5nIG9uIHRoZSBmaXJzdAorICAgICAgb25lLiBBbGwgbmVjZXNzYXJ5IGNvbnN0YW50cyBhcmUgYXZhaWxhYmxlIGluIHRoZSA6bW9kOmBzcWxpdGUzYCBtb2R1bGUuCiAKIAotLi4gbWV0aG9kOjogQ29ubmVjdGlvbi5zZXRfcHJvZ3Jlc3NfaGFuZGxlcihoYW5kbGVyLCBuKQorICAgLi4gbWV0aG9kOjogc2V0X3Byb2dyZXNzX2hhbmRsZXIoaGFuZGxlciwgbikKIAotICAgLi4gdmVyc2lvbmFkZGVkOjogMi42CisgICAgICBUaGlzIHJvdXRpbmUgcmVnaXN0ZXJzIGEgY2FsbGJhY2suIFRoZSBjYWxsYmFjayBpcyBpbnZva2VkIGZvciBldmVyeSAqbioKKyAgICAgIGluc3RydWN0aW9ucyBvZiB0aGUgU1FMaXRlIHZpcnR1YWwgbWFjaGluZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8KKyAgICAgIGdldCBjYWxsZWQgZnJvbSBTUUxpdGUgZHVyaW5nIGxvbmctcnVubmluZyBvcGVyYXRpb25zLCBmb3IgZXhhbXBsZSB0byB1cGRhdGUKKyAgICAgIGEgR1VJLgogCi0gICBUaGlzIHJvdXRpbmUgcmVnaXN0ZXJzIGEgY2FsbGJhY2suIFRoZSBjYWxsYmFjayBpcyBpbnZva2VkIGZvciBldmVyeSAqbioKLSAgIGluc3RydWN0aW9ucyBvZiB0aGUgU1FMaXRlIHZpcnR1YWwgbWFjaGluZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8KLSAgIGdldCBjYWxsZWQgZnJvbSBTUUxpdGUgZHVyaW5nIGxvbmctcnVubmluZyBvcGVyYXRpb25zLCBmb3IgZXhhbXBsZSB0byB1cGRhdGUKLSAgIGEgR1VJLgorICAgICAgSWYgeW91IHdhbnQgdG8gY2xlYXIgYW55IHByZXZpb3VzbHkgaW5zdGFsbGVkIHByb2dyZXNzIGhhbmRsZXIsIGNhbGwgdGhlCisgICAgICBtZXRob2Qgd2l0aCA6Y29uc3Q6YE5vbmVgIGZvciAqaGFuZGxlciouCiAKLSAgIElmIHlvdSB3YW50IHRvIGNsZWFyIGFueSBwcmV2aW91c2x5IGluc3RhbGxlZCBwcm9ncmVzcyBoYW5kbGVyLCBjYWxsIHRoZQotICAgbWV0aG9kIHdpdGggOmNvbnN0OmBOb25lYCBmb3IgKmhhbmRsZXIqLgorICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMi42CiAKIAotLi4gbWV0aG9kOjogQ29ubmVjdGlvbi5lbmFibGVfbG9hZF9leHRlbnNpb24oZW5hYmxlZCkKKyAgIC4uIG1ldGhvZDo6IGVuYWJsZV9sb2FkX2V4dGVuc2lvbihlbmFibGVkKQogCi0gICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjcKKyAgICAgIFRoaXMgcm91dGluZSBhbGxvd3MvZGlzYWxsb3dzIHRoZSBTUUxpdGUgZW5naW5lIHRvIGxvYWQgU1FMaXRlIGV4dGVuc2lvbnMKKyAgICAgIGZyb20gc2hhcmVkIGxpYnJhcmllcy4gIFNRTGl0ZSBleHRlbnNpb25zIGNhbiBkZWZpbmUgbmV3IGZ1bmN0aW9ucywKKyAgICAgIGFnZ3JlZ2F0ZXMgb3Igd2hvbGUgbmV3IHZpcnR1YWwgdGFibGUgaW1wbGVtZW50YXRpb25zLiAgT25lIHdlbGwta25vd24KKyAgICAgIGV4dGVuc2lvbiBpcyB0aGUgZnVsbHRleHQtc2VhcmNoIGV4dGVuc2lvbiBkaXN0cmlidXRlZCB3aXRoIFNRTGl0ZS4KIAotICAgVGhpcyByb3V0aW5lIGFsbG93cy9kaXNhbGxvd3MgdGhlIFNRTGl0ZSBlbmdpbmUgdG8gbG9hZCBTUUxpdGUgZXh0ZW5zaW9ucwotICAgZnJvbSBzaGFyZWQgbGlicmFyaWVzLiAgU1FMaXRlIGV4dGVuc2lvbnMgY2FuIGRlZmluZSBuZXcgZnVuY3Rpb25zLAotICAgYWdncmVnYXRlcyBvciB3aG9sZSBuZXcgdmlydHVhbCB0YWJsZSBpbXBsZW1lbnRhdGlvbnMuICBPbmUgd2VsbC1rbm93bgotICAgZXh0ZW5zaW9uIGlzIHRoZSBmdWxsdGV4dC1zZWFyY2ggZXh0ZW5zaW9uIGRpc3RyaWJ1dGVkIHdpdGggU1FMaXRlLgorICAgICAgTG9hZGFibGUgZXh0ZW5zaW9ucyBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdC4gU2VlIFsjZjFdXy4KIAotICAgLi4gbGl0ZXJhbGluY2x1ZGU6OiAuLi9pbmNsdWRlcy9zcWxpdGUzL2xvYWRfZXh0ZW5zaW9uLnB5CisgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjcKIAotICAgTG9hZGFibGUgZXh0ZW5zaW9ucyBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdC4gU2VlIFsjZjFdXworICAgICAgLi4gbGl0ZXJhbGluY2x1ZGU6OiAuLi9pbmNsdWRlcy9zcWxpdGUzL2xvYWRfZXh0ZW5zaW9uLnB5CiAKLS4uIG1ldGhvZDo6IENvbm5lY3Rpb24ubG9hZF9leHRlbnNpb24ocGF0aCkKKyAgIC4uIG1ldGhvZDo6IGxvYWRfZXh0ZW5zaW9uKHBhdGgpCiAKLSAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNworICAgICAgVGhpcyByb3V0aW5lIGxvYWRzIGEgU1FMaXRlIGV4dGVuc2lvbiBmcm9tIGEgc2hhcmVkIGxpYnJhcnkuICBZb3UgaGF2ZSB0bworICAgICAgZW5hYmxlIGV4dGVuc2lvbiBsb2FkaW5nIHdpdGggOm1ldGg6YGVuYWJsZV9sb2FkX2V4dGVuc2lvbmAgYmVmb3JlIHlvdSBjYW4KKyAgICAgIHVzZSB0aGlzIHJvdXRpbmUuCiAKLSAgIFRoaXMgcm91dGluZSBsb2FkcyBhIFNRTGl0ZSBleHRlbnNpb24gZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LiAgWW91IGhhdmUgdG8KLSAgIGVuYWJsZSBleHRlbnNpb24gbG9hZGluZyB3aXRoIDptZXRoOmBlbmFibGVfbG9hZF9leHRlbnNpb25gIGJlZm9yZSB5b3UgY2FuCi0gICB1c2UgdGhpcyByb3V0aW5lLgorICAgICAgTG9hZGFibGUgZXh0ZW5zaW9ucyBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdC4gU2VlIFsjZjFdXy4KIAotICAgTG9hZGFibGUgZXh0ZW5zaW9ucyBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdC4gU2VlIFsjZjFdXworICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMi43CiAKLS4uIGF0dHJpYnV0ZTo6IENvbm5lY3Rpb24ucm93X2ZhY3RvcnkKKyAgIC4uIGF0dHJpYnV0ZTo6IHJvd19mYWN0b3J5CiAKLSAgIFlvdSBjYW4gY2hhbmdlIHRoaXMgYXR0cmlidXRlIHRvIGEgY2FsbGFibGUgdGhhdCBhY2NlcHRzIHRoZSBjdXJzb3IgYW5kIHRoZQotICAgb3JpZ2luYWwgcm93IGFzIGEgdHVwbGUgYW5kIHdpbGwgcmV0dXJuIHRoZSByZWFsIHJlc3VsdCByb3cuICBUaGlzIHdheSwgeW91IGNhbgotICAgaW1wbGVtZW50IG1vcmUgYWR2YW5jZWQgd2F5cyBvZiByZXR1cm5pbmcgcmVzdWx0cywgc3VjaCAgYXMgcmV0dXJuaW5nIGFuIG9iamVjdAotICAgdGhhdCBjYW4gYWxzbyBhY2Nlc3MgY29sdW1ucyBieSBuYW1lLgorICAgICAgWW91IGNhbiBjaGFuZ2UgdGhpcyBhdHRyaWJ1dGUgdG8gYSBjYWxsYWJsZSB0aGF0IGFjY2VwdHMgdGhlIGN1cnNvciBhbmQgdGhlCisgICAgICBvcmlnaW5hbCByb3cgYXMgYSB0dXBsZSBhbmQgd2lsbCByZXR1cm4gdGhlIHJlYWwgcmVzdWx0IHJvdy4gIFRoaXMgd2F5LCB5b3UgY2FuCisgICAgICBpbXBsZW1lbnQgbW9yZSBhZHZhbmNlZCB3YXlzIG9mIHJldHVybmluZyByZXN1bHRzLCBzdWNoICBhcyByZXR1cm5pbmcgYW4gb2JqZWN0CisgICAgICB0aGF0IGNhbiBhbHNvIGFjY2VzcyBjb2x1bW5zIGJ5IG5hbWUuCiAKLSAgIEV4YW1wbGU6CisgICAgICBFeGFtcGxlOgogCi0gICAuLiBsaXRlcmFsaW5jbHVkZTo6IC4uL2luY2x1ZGVzL3NxbGl0ZTMvcm93X2ZhY3RvcnkucHkKKyAgICAgIC4uIGxpdGVyYWxpbmNsdWRlOjogLi4vaW5jbHVkZXMvc3FsaXRlMy9yb3dfZmFjdG9yeS5weQogCi0gICBJZiByZXR1cm5pbmcgYSB0dXBsZSBkb2Vzbid0IHN1ZmZpY2UgYW5kIHlvdSB3YW50IG5hbWUtYmFzZWQgYWNjZXNzIHRvCi0gICBjb2x1bW5zLCB5b3Ugc2hvdWxkIGNvbnNpZGVyIHNldHRpbmcgOmF0dHI6YHJvd19mYWN0b3J5YCB0byB0aGUKLSAgIGhpZ2hseS1vcHRpbWl6ZWQgOmNsYXNzOmBzcWxpdGUzLlJvd2AgdHlwZS4gOmNsYXNzOmBSb3dgIHByb3ZpZGVzIGJvdGgKLSAgIGluZGV4LWJhc2VkIGFuZCBjYXNlLWluc2Vuc2l0aXZlIG5hbWUtYmFzZWQgYWNjZXNzIHRvIGNvbHVtbnMgd2l0aCBhbG1vc3Qgbm8KLSAgIG1lbW9yeSBvdmVyaGVhZC4gSXQgd2lsbCBwcm9iYWJseSBiZSBiZXR0ZXIgdGhhbiB5b3VyIG93biBjdXN0b20KLSAgIGRpY3Rpb25hcnktYmFzZWQgYXBwcm9hY2ggb3IgZXZlbiBhIGRiX3JvdyBiYXNlZCBzb2x1dGlvbi4KKyAgICAgIElmIHJldHVybmluZyBhIHR1cGxlIGRvZXNuJ3Qgc3VmZmljZSBhbmQgeW91IHdhbnQgbmFtZS1iYXNlZCBhY2Nlc3MgdG8KKyAgICAgIGNvbHVtbnMsIHlvdSBzaG91bGQgY29uc2lkZXIgc2V0dGluZyA6YXR0cjpgcm93X2ZhY3RvcnlgIHRvIHRoZQorICAgICAgaGlnaGx5LW9wdGltaXplZCA6Y2xhc3M6YHNxbGl0ZTMuUm93YCB0eXBlLiA6Y2xhc3M6YFJvd2AgcHJvdmlkZXMgYm90aAorICAgICAgaW5kZXgtYmFzZWQgYW5kIGNhc2UtaW5zZW5zaXRpdmUgbmFtZS1iYXNlZCBhY2Nlc3MgdG8gY29sdW1ucyB3aXRoIGFsbW9zdCBubworICAgICAgbWVtb3J5IG92ZXJoZWFkLiBJdCB3aWxsIHByb2JhYmx5IGJlIGJldHRlciB0aGFuIHlvdXIgb3duIGN1c3RvbQorICAgICAgZGljdGlvbmFyeS1iYXNlZCBhcHByb2FjaCBvciBldmVuIGEgZGJfcm93IGJhc2VkIHNvbHV0aW9uLgogCi0gICAuLiBYWFggd2hhdCdzIGEgZGJfcm93LWJhc2VkIHNvbHV0aW9uPworICAgICAgLi4gWFhYIHdoYXQncyBhIGRiX3Jvdy1iYXNlZCBzb2x1dGlvbj8KIAogCi0uLiBhdHRyaWJ1dGU6OiBDb25uZWN0aW9uLnRleHRfZmFjdG9yeQorICAgLi4gYXR0cmlidXRlOjogdGV4dF9mYWN0b3J5CiAKLSAgIFVzaW5nIHRoaXMgYXR0cmlidXRlIHlvdSBjYW4gY29udHJvbCB3aGF0IG9iamVjdHMgYXJlIHJldHVybmVkIGZvciB0aGUgYGBURVhUYGAKLSAgIGRhdGEgdHlwZS4gQnkgZGVmYXVsdCwgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIDpjbGFzczpgdW5pY29kZWAgYW5kIHRoZQotICAgOm1vZDpgc3FsaXRlM2AgbW9kdWxlIHdpbGwgcmV0dXJuIFVuaWNvZGUgb2JqZWN0cyBmb3IgYGBURVhUYGAuIElmIHlvdSB3YW50IHRvCi0gICByZXR1cm4gYnl0ZXN0cmluZ3MgaW5zdGVhZCwgeW91IGNhbiBzZXQgaXQgdG8gOmNsYXNzOmBzdHJgLgorICAgICAgVXNpbmcgdGhpcyBhdHRyaWJ1dGUgeW91IGNhbiBjb250cm9sIHdoYXQgb2JqZWN0cyBhcmUgcmV0dXJuZWQgZm9yIHRoZSBgYFRFWFRgYAorICAgICAgZGF0YSB0eXBlLiBCeSBkZWZhdWx0LCB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gOmNsYXNzOmB1bmljb2RlYCBhbmQgdGhlCisgICAgICA6bW9kOmBzcWxpdGUzYCBtb2R1bGUgd2lsbCByZXR1cm4gVW5pY29kZSBvYmplY3RzIGZvciBgYFRFWFRgYC4gSWYgeW91IHdhbnQgdG8KKyAgICAgIHJldHVybiBieXRlc3RyaW5ncyBpbnN0ZWFkLCB5b3UgY2FuIHNldCBpdCB0byA6Y2xhc3M6YHN0cmAuCiAKLSAgIEZvciBlZmZpY2llbmN5IHJlYXNvbnMsIHRoZXJlJ3MgYWxzbyBhIHdheSB0byByZXR1cm4gVW5pY29kZSBvYmplY3RzIG9ubHkgZm9yCi0gICBub24tQVNDSUkgZGF0YSwgYW5kIGJ5dGVzdHJpbmdzIG90aGVyd2lzZS4gVG8gYWN0aXZhdGUgaXQsIHNldCB0aGlzIGF0dHJpYnV0ZSB0bwotICAgOmNvbnN0OmBzcWxpdGUzLk9wdGltaXplZFVuaWNvZGVgLgorICAgICAgRm9yIGVmZmljaWVuY3kgcmVhc29ucywgdGhlcmUncyBhbHNvIGEgd2F5IHRvIHJldHVybiBVbmljb2RlIG9iamVjdHMgb25seSBmb3IKKyAgICAgIG5vbi1BU0NJSSBkYXRhLCBhbmQgYnl0ZXN0cmluZ3Mgb3RoZXJ3aXNlLiBUbyBhY3RpdmF0ZSBpdCwgc2V0IHRoaXMgYXR0cmlidXRlIHRvCisgICAgICA6Y29uc3Q6YHNxbGl0ZTMuT3B0aW1pemVkVW5pY29kZWAuCiAKLSAgIFlvdSBjYW4gYWxzbyBzZXQgaXQgdG8gYW55IG90aGVyIGNhbGxhYmxlIHRoYXQgYWNjZXB0cyBhIHNpbmdsZSBieXRlc3RyaW5nCi0gICBwYXJhbWV0ZXIgYW5kIHJldHVybnMgdGhlIHJlc3VsdGluZyBvYmplY3QuCisgICAgICBZb3UgY2FuIGFsc28gc2V0IGl0IHRvIGFueSBvdGhlciBjYWxsYWJsZSB0aGF0IGFjY2VwdHMgYSBzaW5nbGUgYnl0ZXN0cmluZworICAgICAgcGFyYW1ldGVyIGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcgb2JqZWN0LgogCi0gICBTZWUgdGhlIGZvbGxvd2luZyBleGFtcGxlIGNvZGUgZm9yIGlsbHVzdHJhdGlvbjoKKyAgICAgIFNlZSB0aGUgZm9sbG93aW5nIGV4YW1wbGUgY29kZSBmb3IgaWxsdXN0cmF0aW9uOgogCi0gICAuLiBsaXRlcmFsaW5jbHVkZTo6IC4uL2luY2x1ZGVzL3NxbGl0ZTMvdGV4dF9mYWN0b3J5LnB5CisgICAgICAuLiBsaXRlcmFsaW5jbHVkZTo6IC4uL2luY2x1ZGVzL3NxbGl0ZTMvdGV4dF9mYWN0b3J5LnB5CiAKIAotLi4gYXR0cmlidXRlOjogQ29ubmVjdGlvbi50b3RhbF9jaGFuZ2VzCisgICAuLiBhdHRyaWJ1dGU6OiB0b3RhbF9jaGFuZ2VzCiAKLSAgIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBkYXRhYmFzZSByb3dzIHRoYXQgaGF2ZSBiZWVuIG1vZGlmaWVkLCBpbnNlcnRlZCwgb3IKLSAgIGRlbGV0ZWQgc2luY2UgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gd2FzIG9wZW5lZC4KKyAgICAgIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBkYXRhYmFzZSByb3dzIHRoYXQgaGF2ZSBiZWVuIG1vZGlmaWVkLCBpbnNlcnRlZCwgb3IKKyAgICAgIGRlbGV0ZWQgc2luY2UgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gd2FzIG9wZW5lZC4KIAogCi0uLiBhdHRyaWJ1dGU6OiBDb25uZWN0aW9uLml0ZXJkdW1wCisgICAuLiBhdHRyaWJ1dGU6OiBpdGVyZHVtcAogCi0gICBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIGR1bXAgdGhlIGRhdGFiYXNlIGluIGFuIFNRTCB0ZXh0IGZvcm1hdC4gIFVzZWZ1bCB3aGVuCi0gICBzYXZpbmcgYW4gaW4tbWVtb3J5IGRhdGFiYXNlIGZvciBsYXRlciByZXN0b3JhdGlvbi4gIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMKLSAgIHRoZSBzYW1lIGNhcGFiaWxpdGllcyBhcyB0aGUgOmtiZDpgLmR1bXBgIGNvbW1hbmQgaW4gdGhlIDpwcm9ncmFtOmBzcWxpdGUzYAotICAgc2hlbGwuCisgICAgICBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIGR1bXAgdGhlIGRhdGFiYXNlIGluIGFuIFNRTCB0ZXh0IGZvcm1hdC4gIFVzZWZ1bCB3aGVuCisgICAgICBzYXZpbmcgYW4gaW4tbWVtb3J5IGRhdGFiYXNlIGZvciBsYXRlciByZXN0b3JhdGlvbi4gIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMKKyAgICAgIHRoZSBzYW1lIGNhcGFiaWxpdGllcyBhcyB0aGUgOmtiZDpgLmR1bXBgIGNvbW1hbmQgaW4gdGhlIDpwcm9ncmFtOmBzcWxpdGUzYAorICAgICAgc2hlbGwuCiAKLSAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNgorICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMi42CiAKLSAgIEV4YW1wbGU6OgorICAgICAgRXhhbXBsZTo6CiAKLSAgICAgICMgQ29udmVydCBmaWxlIGV4aXN0aW5nX2RiLmRiIHRvIFNRTCBkdW1wIGZpbGUgZHVtcC5zcWwKLSAgICAgIGltcG9ydCBzcWxpdGUzLCBvcworICAgICAgICAgIyBDb252ZXJ0IGZpbGUgZXhpc3RpbmdfZGIuZGIgdG8gU1FMIGR1bXAgZmlsZSBkdW1wLnNxbAorICAgICAgICAgaW1wb3J0IHNxbGl0ZTMsIG9zCiAKLSAgICAgIGNvbiA9IHNxbGl0ZTMuY29ubmVjdCgnZXhpc3RpbmdfZGIuZGInKQotICAgICAgd2l0aCBvcGVuKCdkdW1wLnNxbCcsICd3JykgYXMgZjoKLSAgICAgICAgICBmb3IgbGluZSBpbiBjb24uaXRlcmR1bXAoKToKLSAgICAgICAgICAgICAgZi53cml0ZSgnJXNcbicgJSBsaW5lKQorICAgICAgICAgY29uID0gc3FsaXRlMy5jb25uZWN0KCdleGlzdGluZ19kYi5kYicpCisgICAgICAgICB3aXRoIG9wZW4oJ2R1bXAuc3FsJywgJ3cnKSBhcyBmOgorICAgICAgICAgICAgIGZvciBsaW5lIGluIGNvbi5pdGVyZHVtcCgpOgorICAgICAgICAgICAgICAgICBmLndyaXRlKCclc1xuJyAlIGxpbmUpCiAKIAogLi4gX3NxbGl0ZTMtY3Vyc29yLW9iamVjdHM6CkBAIC00NjUsMTE1ICs0OTAsMTEwIEBACiAKICAgIEEgOmNsYXNzOmBDdXJzb3JgIGluc3RhbmNlIGhhcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYW5kIG1ldGhvZHMuCiAKLS4uIG1ldGhvZDo6IEN1cnNvci5leGVjdXRlKHNxbCwgW3BhcmFtZXRlcnNdKQorICAgLi4gbWV0aG9kOjogZXhlY3V0ZShzcWwsIFtwYXJhbWV0ZXJzXSkKIAotICAgRXhlY3V0ZXMgYW4gU1FMIHN0YXRlbWVudC4gVGhlIFNRTCBzdGF0ZW1lbnQgbWF5IGJlIHBhcmFtZXRyaXplZCAoaS4gZS4KLSAgIHBsYWNlaG9sZGVycyBpbnN0ZWFkIG9mIFNRTCBsaXRlcmFscykuIFRoZSA6bW9kOmBzcWxpdGUzYCBtb2R1bGUgc3VwcG9ydHMgdHdvCi0gICBraW5kcyBvZiBwbGFjZWhvbGRlcnM6IHF1ZXN0aW9uIG1hcmtzIChxbWFyayBzdHlsZSkgYW5kIG5hbWVkIHBsYWNlaG9sZGVycwotICAgKG5hbWVkIHN0eWxlKS4KKyAgICAgIEV4ZWN1dGVzIGFuIFNRTCBzdGF0ZW1lbnQuIFRoZSBTUUwgc3RhdGVtZW50IG1heSBiZSBwYXJhbWV0ZXJpemVkIChpLiBlLgorICAgICAgcGxhY2Vob2xkZXJzIGluc3RlYWQgb2YgU1FMIGxpdGVyYWxzKS4gVGhlIDptb2Q6YHNxbGl0ZTNgIG1vZHVsZSBzdXBwb3J0cyB0d28KKyAgICAgIGtpbmRzIG9mIHBsYWNlaG9sZGVyczogcXVlc3Rpb24gbWFya3MgKHFtYXJrIHN0eWxlKSBhbmQgbmFtZWQgcGxhY2Vob2xkZXJzCisgICAgICAobmFtZWQgc3R5bGUpLgogCi0gICBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBwYXJhbWV0ZXJzIHdpdGggcW1hcmsgc3R5bGU6CisgICAgICBIZXJlJ3MgYW4gZXhhbXBsZSBvZiBib3RoIHN0eWxlczoKIAotICAgLi4gbGl0ZXJhbGluY2x1ZGU6OiAuLi9pbmNsdWRlcy9zcWxpdGUzL2V4ZWN1dGVfMS5weQorICAgICAgLi4gbGl0ZXJhbGluY2x1ZGU6OiAuLi9pbmNsdWRlcy9zcWxpdGUzL2V4ZWN1dGVfMS5weQogCi0gICBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSB0aGUgbmFtZWQgc3R5bGU6Ci0KLSAgIC4uIGxpdGVyYWxpbmNsdWRlOjogLi4vaW5jbHVkZXMvc3FsaXRlMy9leGVjdXRlXzIucHkKLQotICAgOm1ldGg6YGV4ZWN1dGVgIHdpbGwgb25seSBleGVjdXRlIGEgc2luZ2xlIFNRTCBzdGF0ZW1lbnQuIElmIHlvdSB0cnkgdG8gZXhlY3V0ZQotICAgbW9yZSB0aGFuIG9uZSBzdGF0ZW1lbnQgd2l0aCBpdCwgaXQgd2lsbCByYWlzZSBhIFdhcm5pbmcuIFVzZQotICAgOm1ldGg6YGV4ZWN1dGVzY3JpcHRgIGlmIHlvdSB3YW50IHRvIGV4ZWN1dGUgbXVsdGlwbGUgU1FMIHN0YXRlbWVudHMgd2l0aCBvbmUKLSAgIGNhbGwuCisgICAgICA6bWV0aDpgZXhlY3V0ZWAgd2lsbCBvbmx5IGV4ZWN1dGUgYSBzaW5nbGUgU1FMIHN0YXRlbWVudC4gSWYgeW91IHRyeSB0byBleGVjdXRlCisgICAgICBtb3JlIHRoYW4gb25lIHN0YXRlbWVudCB3aXRoIGl0LCBpdCB3aWxsIHJhaXNlIGEgV2FybmluZy4gVXNlCisgICAgICA6bWV0aDpgZXhlY3V0ZXNjcmlwdGAgaWYgeW91IHdhbnQgdG8gZXhlY3V0ZSBtdWx0aXBsZSBTUUwgc3RhdGVtZW50cyB3aXRoIG9uZQorICAgICAgY2FsbC4KIAogCi0uLiBtZXRob2Q6OiBDdXJzb3IuZXhlY3V0ZW1hbnkoc3FsLCBzZXFfb2ZfcGFyYW1ldGVycykKKyAgIC4uIG1ldGhvZDo6IGV4ZWN1dGVtYW55KHNxbCwgc2VxX29mX3BhcmFtZXRlcnMpCiAKLSAgIEV4ZWN1dGVzIGFuIFNRTCBjb21tYW5kIGFnYWluc3QgYWxsIHBhcmFtZXRlciBzZXF1ZW5jZXMgb3IgbWFwcGluZ3MgZm91bmQgaW4KLSAgIHRoZSBzZXF1ZW5jZSAqc3FsKi4gIFRoZSA6bW9kOmBzcWxpdGUzYCBtb2R1bGUgYWxzbyBhbGxvd3MgdXNpbmcgYW4KLSAgIDp0ZXJtOmBpdGVyYXRvcmAgeWllbGRpbmcgcGFyYW1ldGVycyBpbnN0ZWFkIG9mIGEgc2VxdWVuY2UuCisgICAgICBFeGVjdXRlcyBhbiBTUUwgY29tbWFuZCBhZ2FpbnN0IGFsbCBwYXJhbWV0ZXIgc2VxdWVuY2VzIG9yIG1hcHBpbmdzIGZvdW5kIGluCisgICAgICB0aGUgc2VxdWVuY2UgKnNxbCouICBUaGUgOm1vZDpgc3FsaXRlM2AgbW9kdWxlIGFsc28gYWxsb3dzIHVzaW5nIGFuCisgICAgICA6dGVybTpgaXRlcmF0b3JgIHlpZWxkaW5nIHBhcmFtZXRlcnMgaW5zdGVhZCBvZiBhIHNlcXVlbmNlLgogCi0gICAuLiBsaXRlcmFsaW5jbHVkZTo6IC4uL2luY2x1ZGVzL3NxbGl0ZTMvZXhlY3V0ZW1hbnlfMS5weQorICAgICAgLi4gbGl0ZXJhbGluY2x1ZGU6OiAuLi9pbmNsdWRlcy9zcWxpdGUzL2V4ZWN1dGVtYW55XzEucHkKIAotICAgSGVyZSdzIGEgc2hvcnRlciBleGFtcGxlIHVzaW5nIGEgOnRlcm06YGdlbmVyYXRvcmA6CisgICAgICBIZXJlJ3MgYSBzaG9ydGVyIGV4YW1wbGUgdXNpbmcgYSA6dGVybTpgZ2VuZXJhdG9yYDoKIAotICAgLi4gbGl0ZXJhbGluY2x1ZGU6OiAuLi9pbmNsdWRlcy9zcWxpdGUzL2V4ZWN1dGVtYW55XzIucHkKKyAgICAgIC4uIGxpdGVyYWxpbmNsdWRlOjogLi4vaW5jbHVkZXMvc3FsaXRlMy9leGVjdXRlbWFueV8yLnB5CiAKIAotLi4gbWV0aG9kOjogQ3Vyc29yLmV4ZWN1dGVzY3JpcHQoc3FsX3NjcmlwdCkKKyAgIC4uIG1ldGhvZDo6IGV4ZWN1dGVzY3JpcHQoc3FsX3NjcmlwdCkKIAotICAgVGhpcyBpcyBhIG5vbnN0YW5kYXJkIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgZXhlY3V0aW5nIG11bHRpcGxlIFNRTCBzdGF0ZW1lbnRzCi0gICBhdCBvbmNlLiBJdCBpc3N1ZXMgYSBgYENPTU1JVGBgIHN0YXRlbWVudCBmaXJzdCwgdGhlbiBleGVjdXRlcyB0aGUgU1FMIHNjcmlwdCBpdAotICAgZ2V0cyBhcyBhIHBhcmFtZXRlci4KKyAgICAgIFRoaXMgaXMgYSBub25zdGFuZGFyZCBjb252ZW5pZW5jZSBtZXRob2QgZm9yIGV4ZWN1dGluZyBtdWx0aXBsZSBTUUwgc3RhdGVtZW50cworICAgICAgYXQgb25jZS4gSXQgaXNzdWVzIGEgYGBDT01NSVRgYCBzdGF0ZW1lbnQgZmlyc3QsIHRoZW4gZXhlY3V0ZXMgdGhlIFNRTCBzY3JpcHQgaXQKKyAgICAgIGdldHMgYXMgYSBwYXJhbWV0ZXIuCiAKLSAgICpzcWxfc2NyaXB0KiBjYW4gYmUgYSBieXRlc3RyaW5nIG9yIGEgVW5pY29kZSBzdHJpbmcuCisgICAgICAqc3FsX3NjcmlwdCogY2FuIGJlIGEgYnl0ZXN0cmluZyBvciBhIFVuaWNvZGUgc3RyaW5nLgogCi0gICBFeGFtcGxlOgorICAgICAgRXhhbXBsZToKIAotICAgLi4gbGl0ZXJhbGluY2x1ZGU6OiAuLi9pbmNsdWRlcy9zcWxpdGUzL2V4ZWN1dGVzY3JpcHQucHkKKyAgICAgIC4uIGxpdGVyYWxpbmNsdWRlOjogLi4vaW5jbHVkZXMvc3FsaXRlMy9leGVjdXRlc2NyaXB0LnB5CiAKIAotLi4gbWV0aG9kOjogQ3Vyc29yLmZldGNob25lKCkKKyAgIC4uIG1ldGhvZDo6IGZldGNob25lKCkKIAotICAgRmV0Y2hlcyB0aGUgbmV4dCByb3cgb2YgYSBxdWVyeSByZXN1bHQgc2V0LCByZXR1cm5pbmcgYSBzaW5nbGUgc2VxdWVuY2UsCi0gICBvciA6Y29uc3Q6YE5vbmVgIHdoZW4gbm8gbW9yZSBkYXRhIGlzIGF2YWlsYWJsZS4KKyAgICAgIEZldGNoZXMgdGhlIG5leHQgcm93IG9mIGEgcXVlcnkgcmVzdWx0IHNldCwgcmV0dXJuaW5nIGEgc2luZ2xlIHNlcXVlbmNlLAorICAgICAgb3IgOmNvbnN0OmBOb25lYCB3aGVuIG5vIG1vcmUgZGF0YSBpcyBhdmFpbGFibGUuCiAKIAotLi4gbWV0aG9kOjogQ3Vyc29yLmZldGNobWFueShbc2l6ZT1jdXJzb3IuYXJyYXlzaXplXSkKKyAgIC4uIG1ldGhvZDo6IGZldGNobWFueShbc2l6ZT1jdXJzb3IuYXJyYXlzaXplXSkKIAotICAgRmV0Y2hlcyB0aGUgbmV4dCBzZXQgb2Ygcm93cyBvZiBhIHF1ZXJ5IHJlc3VsdCwgcmV0dXJuaW5nIGEgbGlzdC4gIEFuIGVtcHR5Ci0gICBsaXN0IGlzIHJldHVybmVkIHdoZW4gbm8gbW9yZSByb3dzIGFyZSBhdmFpbGFibGUuCisgICAgICBGZXRjaGVzIHRoZSBuZXh0IHNldCBvZiByb3dzIG9mIGEgcXVlcnkgcmVzdWx0LCByZXR1cm5pbmcgYSBsaXN0LiAgQW4gZW1wdHkKKyAgICAgIGxpc3QgaXMgcmV0dXJuZWQgd2hlbiBubyBtb3JlIHJvd3MgYXJlIGF2YWlsYWJsZS4KIAotICAgVGhlIG51bWJlciBvZiByb3dzIHRvIGZldGNoIHBlciBjYWxsIGlzIHNwZWNpZmllZCBieSB0aGUgKnNpemUqIHBhcmFtZXRlci4KLSAgIElmIGl0IGlzIG5vdCBnaXZlbiwgdGhlIGN1cnNvcidzIGFycmF5c2l6ZSBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2Ygcm93cwotICAgdG8gYmUgZmV0Y2hlZC4gVGhlIG1ldGhvZCBzaG91bGQgdHJ5IHRvIGZldGNoIGFzIG1hbnkgcm93cyBhcyBpbmRpY2F0ZWQgYnkKLSAgIHRoZSBzaXplIHBhcmFtZXRlci4gSWYgdGhpcyBpcyBub3QgcG9zc2libGUgZHVlIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mCi0gICByb3dzIG5vdCBiZWluZyBhdmFpbGFibGUsIGZld2VyIHJvd3MgbWF5IGJlIHJldHVybmVkLgorICAgICAgVGhlIG51bWJlciBvZiByb3dzIHRvIGZldGNoIHBlciBjYWxsIGlzIHNwZWNpZmllZCBieSB0aGUgKnNpemUqIHBhcmFtZXRlci4KKyAgICAgIElmIGl0IGlzIG5vdCBnaXZlbiwgdGhlIGN1cnNvcidzIGFycmF5c2l6ZSBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2Ygcm93cworICAgICAgdG8gYmUgZmV0Y2hlZC4gVGhlIG1ldGhvZCBzaG91bGQgdHJ5IHRvIGZldGNoIGFzIG1hbnkgcm93cyBhcyBpbmRpY2F0ZWQgYnkKKyAgICAgIHRoZSBzaXplIHBhcmFtZXRlci4gSWYgdGhpcyBpcyBub3QgcG9zc2libGUgZHVlIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mCisgICAgICByb3dzIG5vdCBiZWluZyBhdmFpbGFibGUsIGZld2VyIHJvd3MgbWF5IGJlIHJldHVybmVkLgogCi0gICBOb3RlIHRoZXJlIGFyZSBwZXJmb3JtYW5jZSBjb25zaWRlcmF0aW9ucyBpbnZvbHZlZCB3aXRoIHRoZSAqc2l6ZSogcGFyYW1ldGVyLgotICAgRm9yIG9wdGltYWwgcGVyZm9ybWFuY2UsIGl0IGlzIHVzdWFsbHkgYmVzdCB0byB1c2UgdGhlIGFycmF5c2l6ZSBhdHRyaWJ1dGUuCi0gICBJZiB0aGUgKnNpemUqIHBhcmFtZXRlciBpcyB1c2VkLCB0aGVuIGl0IGlzIGJlc3QgZm9yIGl0IHRvIHJldGFpbiB0aGUgc2FtZQotICAgdmFsdWUgZnJvbSBvbmUgOm1ldGg6YGZldGNobWFueWAgY2FsbCB0byB0aGUgbmV4dC4KKyAgICAgIE5vdGUgdGhlcmUgYXJlIHBlcmZvcm1hbmNlIGNvbnNpZGVyYXRpb25zIGludm9sdmVkIHdpdGggdGhlICpzaXplKiBwYXJhbWV0ZXIuCisgICAgICBGb3Igb3B0aW1hbCBwZXJmb3JtYW5jZSwgaXQgaXMgdXN1YWxseSBiZXN0IHRvIHVzZSB0aGUgYXJyYXlzaXplIGF0dHJpYnV0ZS4KKyAgICAgIElmIHRoZSAqc2l6ZSogcGFyYW1ldGVyIGlzIHVzZWQsIHRoZW4gaXQgaXMgYmVzdCBmb3IgaXQgdG8gcmV0YWluIHRoZSBzYW1lCisgICAgICB2YWx1ZSBmcm9tIG9uZSA6bWV0aDpgZmV0Y2htYW55YCBjYWxsIHRvIHRoZSBuZXh0LgogCi0uLiBtZXRob2Q6OiBDdXJzb3IuZmV0Y2hhbGwoKQorICAgLi4gbWV0aG9kOjogZmV0Y2hhbGwoKQogCi0gICBGZXRjaGVzIGFsbCAocmVtYWluaW5nKSByb3dzIG9mIGEgcXVlcnkgcmVzdWx0LCByZXR1cm5pbmcgYSBsaXN0LiAgTm90ZSB0aGF0Ci0gICB0aGUgY3Vyc29yJ3MgYXJyYXlzaXplIGF0dHJpYnV0ZSBjYW4gYWZmZWN0IHRoZSBwZXJmb3JtYW5jZSBvZiB0aGlzIG9wZXJhdGlvbi4KLSAgIEFuIGVtcHR5IGxpc3QgaXMgcmV0dXJuZWQgd2hlbiBubyByb3dzIGFyZSBhdmFpbGFibGUuCisgICAgICBGZXRjaGVzIGFsbCAocmVtYWluaW5nKSByb3dzIG9mIGEgcXVlcnkgcmVzdWx0LCByZXR1cm5pbmcgYSBsaXN0LiAgTm90ZSB0aGF0CisgICAgICB0aGUgY3Vyc29yJ3MgYXJyYXlzaXplIGF0dHJpYnV0ZSBjYW4gYWZmZWN0IHRoZSBwZXJmb3JtYW5jZSBvZiB0aGlzIG9wZXJhdGlvbi4KKyAgICAgIEFuIGVtcHR5IGxpc3QgaXMgcmV0dXJuZWQgd2hlbiBubyByb3dzIGFyZSBhdmFpbGFibGUuCiAKIAotLi4gYXR0cmlidXRlOjogQ3Vyc29yLnJvd2NvdW50CisgICAuLiBhdHRyaWJ1dGU6OiByb3djb3VudAogCi0gICBBbHRob3VnaCB0aGUgOmNsYXNzOmBDdXJzb3JgIGNsYXNzIG9mIHRoZSA6bW9kOmBzcWxpdGUzYCBtb2R1bGUgaW1wbGVtZW50cyB0aGlzCi0gICBhdHRyaWJ1dGUsIHRoZSBkYXRhYmFzZSBlbmdpbmUncyBvd24gc3VwcG9ydCBmb3IgdGhlIGRldGVybWluYXRpb24gb2YgInJvd3MKLSAgIGFmZmVjdGVkIi8icm93cyBzZWxlY3RlZCIgaXMgcXVpcmt5LgorICAgICAgQWx0aG91Z2ggdGhlIDpjbGFzczpgQ3Vyc29yYCBjbGFzcyBvZiB0aGUgOm1vZDpgc3FsaXRlM2AgbW9kdWxlIGltcGxlbWVudHMgdGhpcworICAgICAgYXR0cmlidXRlLCB0aGUgZGF0YWJhc2UgZW5naW5lJ3Mgb3duIHN1cHBvcnQgZm9yIHRoZSBkZXRlcm1pbmF0aW9uIG9mICJyb3dzCisgICAgICBhZmZlY3RlZCIvInJvd3Mgc2VsZWN0ZWQiIGlzIHF1aXJreS4KIAotICAgRm9yIGBgREVMRVRFYGAgc3RhdGVtZW50cywgU1FMaXRlIHJlcG9ydHMgOmF0dHI6YHJvd2NvdW50YCBhcyAwIGlmIHlvdSBtYWtlIGEKLSAgIGBgREVMRVRFIEZST00gdGFibGVgYCB3aXRob3V0IGFueSBjb25kaXRpb24uCisgICAgICBGb3IgOm1ldGg6YGV4ZWN1dGVtYW55YCBzdGF0ZW1lbnRzLCB0aGUgbnVtYmVyIG9mIG1vZGlmaWNhdGlvbnMgYXJlIHN1bW1lZCB1cAorICAgICAgaW50byA6YXR0cjpgcm93Y291bnRgLgogCi0gICBGb3IgOm1ldGg6YGV4ZWN1dGVtYW55YCBzdGF0ZW1lbnRzLCB0aGUgbnVtYmVyIG9mIG1vZGlmaWNhdGlvbnMgYXJlIHN1bW1lZCB1cAotICAgaW50byA6YXR0cjpgcm93Y291bnRgLgorICAgICAgQXMgcmVxdWlyZWQgYnkgdGhlIFB5dGhvbiBEQiBBUEkgU3BlYywgdGhlIDphdHRyOmByb3djb3VudGAgYXR0cmlidXRlICJpcyAtMSBpbgorICAgICAgY2FzZSBubyBgYGV4ZWN1dGVYWCgpYGAgaGFzIGJlZW4gcGVyZm9ybWVkIG9uIHRoZSBjdXJzb3Igb3IgdGhlIHJvd2NvdW50IG9mIHRoZQorICAgICAgbGFzdCBvcGVyYXRpb24gaXMgbm90IGRldGVybWluYWJsZSBieSB0aGUgaW50ZXJmYWNlIi4gVGhpcyBpbmNsdWRlcyBgYFNFTEVDVGBgCisgICAgICBzdGF0ZW1lbnRzIGJlY2F1c2Ugd2UgY2Fubm90IGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHJvd3MgYSBxdWVyeSBwcm9kdWNlZAorICAgICAgdW50aWwgYWxsIHJvd3Mgd2VyZSBmZXRjaGVkLgogCi0gICBBcyByZXF1aXJlZCBieSB0aGUgUHl0aG9uIERCIEFQSSBTcGVjLCB0aGUgOmF0dHI6YHJvd2NvdW50YCBhdHRyaWJ1dGUgImlzIC0xIGluCi0gICBjYXNlIG5vIGBgZXhlY3V0ZVhYKClgYCBoYXMgYmVlbiBwZXJmb3JtZWQgb24gdGhlIGN1cnNvciBvciB0aGUgcm93Y291bnQgb2YgdGhlCi0gICBsYXN0IG9wZXJhdGlvbiBpcyBub3QgZGV0ZXJtaW5hYmxlIGJ5IHRoZSBpbnRlcmZhY2UiLgorICAgICAgV2l0aCBTUUxpdGUgdmVyc2lvbnMgYmVmb3JlIDMuNi41LCA6YXR0cjpgcm93Y291bnRgIGlzIHNldCB0byAwIGlmCisgICAgICB5b3UgbWFrZSBhIGBgREVMRVRFIEZST00gdGFibGVgYCB3aXRob3V0IGFueSBjb25kaXRpb24uCiAKLSAgIFRoaXMgaW5jbHVkZXMgYGBTRUxFQ1RgYCBzdGF0ZW1lbnRzIGJlY2F1c2Ugd2UgY2Fubm90IGRldGVybWluZSB0aGUgbnVtYmVyIG9mCi0gICByb3dzIGEgcXVlcnkgcHJvZHVjZWQgdW50aWwgYWxsIHJvd3Mgd2VyZSBmZXRjaGVkLgorICAgLi4gYXR0cmlidXRlOjogbGFzdHJvd2lkCiAKLS4uIGF0dHJpYnV0ZTo6IEN1cnNvci5sYXN0cm93aWQKKyAgICAgIFRoaXMgcmVhZC1vbmx5IGF0dHJpYnV0ZSBwcm92aWRlcyB0aGUgcm93aWQgb2YgdGhlIGxhc3QgbW9kaWZpZWQgcm93LiBJdCBpcworICAgICAgb25seSBzZXQgaWYgeW91IGlzc3VlZCBhIGBgSU5TRVJUYGAgc3RhdGVtZW50IHVzaW5nIHRoZSA6bWV0aDpgZXhlY3V0ZWAKKyAgICAgIG1ldGhvZC4gRm9yIG9wZXJhdGlvbnMgb3RoZXIgdGhhbiBgYElOU0VSVGBgIG9yIHdoZW4gOm1ldGg6YGV4ZWN1dGVtYW55YCBpcworICAgICAgY2FsbGVkLCA6YXR0cjpgbGFzdHJvd2lkYCBpcyBzZXQgdG8gOmNvbnN0OmBOb25lYC4KIAotICAgVGhpcyByZWFkLW9ubHkgYXR0cmlidXRlIHByb3ZpZGVzIHRoZSByb3dpZCBvZiB0aGUgbGFzdCBtb2RpZmllZCByb3cuIEl0IGlzCi0gICBvbmx5IHNldCBpZiB5b3UgaXNzdWVkIGEgYGBJTlNFUlRgYCBzdGF0ZW1lbnQgdXNpbmcgdGhlIDptZXRoOmBleGVjdXRlYAotICAgbWV0aG9kLiBGb3Igb3BlcmF0aW9ucyBvdGhlciB0aGFuIGBgSU5TRVJUYGAgb3Igd2hlbiA6bWV0aDpgZXhlY3V0ZW1hbnlgIGlzCi0gICBjYWxsZWQsIDphdHRyOmBsYXN0cm93aWRgIGlzIHNldCB0byA6Y29uc3Q6YE5vbmVgLgorICAgLi4gYXR0cmlidXRlOjogZGVzY3JpcHRpb24KIAotLi4gYXR0cmlidXRlOjogQ3Vyc29yLmRlc2NyaXB0aW9uCisgICAgICBUaGlzIHJlYWQtb25seSBhdHRyaWJ1dGUgcHJvdmlkZXMgdGhlIGNvbHVtbiBuYW1lcyBvZiB0aGUgbGFzdCBxdWVyeS4gVG8KKyAgICAgIHJlbWFpbiBjb21wYXRpYmxlIHdpdGggdGhlIFB5dGhvbiBEQiBBUEksIGl0IHJldHVybnMgYSA3LXR1cGxlIGZvciBlYWNoCisgICAgICBjb2x1bW4gd2hlcmUgdGhlIGxhc3Qgc2l4IGl0ZW1zIG9mIGVhY2ggdHVwbGUgYXJlIDpjb25zdDpgTm9uZWAuCiAKLSAgIFRoaXMgcmVhZC1vbmx5IGF0dHJpYnV0ZSBwcm92aWRlcyB0aGUgY29sdW1uIG5hbWVzIG9mIHRoZSBsYXN0IHF1ZXJ5LiBUbwotICAgcmVtYWluIGNvbXBhdGlibGUgd2l0aCB0aGUgUHl0aG9uIERCIEFQSSwgaXQgcmV0dXJucyBhIDctdHVwbGUgZm9yIGVhY2gKLSAgIGNvbHVtbiB3aGVyZSB0aGUgbGFzdCBzaXggaXRlbXMgb2YgZWFjaCB0dXBsZSBhcmUgOmNvbnN0OmBOb25lYC4KLQotICAgSXQgaXMgc2V0IGZvciBgYFNFTEVDVGBgIHN0YXRlbWVudHMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgcm93cyBhcyB3ZWxsLgorICAgICAgSXQgaXMgc2V0IGZvciBgYFNFTEVDVGBgIHN0YXRlbWVudHMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgcm93cyBhcyB3ZWxsLgogCiAuLiBfc3FsaXRlMy1yb3ctb2JqZWN0czoKIApAQCAtNTk3LDcgKzYxNyw3IEBACiAKICAgIC4uIG1ldGhvZDo6IGtleXMKIAotICAgICAgVGhpcyBtZXRob2QgcmV0dXJucyBhIHR1cGxlIG9mIGNvbHVtbiBuYW1lcy4gSW1tZWRpYXRlbHkgYWZ0ZXIgYSBxdWVyeSwKKyAgICAgIFRoaXMgbWV0aG9kIHJldHVybnMgYSBsaXN0IG9mIGNvbHVtbiBuYW1lcy4gSW1tZWRpYXRlbHkgYWZ0ZXIgYSBxdWVyeSwKICAgICAgIGl0IGlzIHRoZSBmaXJzdCBtZW1iZXIgb2YgZWFjaCB0dXBsZSBpbiA6YXR0cjpgQ3Vyc29yLmRlc2NyaXB0aW9uYC4KIAogICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMi42CkBAIC02MzMsNyArNjUzLDggQEAKICAgIFsnZGF0ZScsICd0cmFucycsICdzeW1ib2wnLCAncXR5JywgJ3ByaWNlJ10KICAgID4+PiByWydxdHknXQogICAgMTAwLjAKLSAgID4+PiBmb3IgbWVtYmVyIGluIHI6IHByaW50IG1lbWJlcgorICAgPj4+IGZvciBtZW1iZXIgaW4gcjoKKyAgIC4uLiAgICAgcHJpbnQgbWVtYmVyCiAgICAuLi4KICAgIDIwMDYtMDEtMDUKICAgIEJVWQpAQCAtNzA2LDkgKzcyNyw2IEBACiBzcWxpdGUzIG1vZHVsZSdzIHN1cHBvcnRlZCB0eXBlcyBmb3IgU1FMaXRlOiBvbmUgb2YgTm9uZVR5cGUsIGludCwgbG9uZywgZmxvYXQsCiBzdHIsIHVuaWNvZGUsIGJ1ZmZlci4KIAotVGhlIDptb2Q6YHNxbGl0ZTNgIG1vZHVsZSB1c2VzIFB5dGhvbiBvYmplY3QgYWRhcHRhdGlvbiwgYXMgZGVzY3JpYmVkIGluCi06cGVwOmAyNDZgIGZvciB0aGlzLiAgVGhlIHByb3RvY29sIHRvIHVzZSBpcyA6Y2xhc3M6YFByZXBhcmVQcm90b2NvbGAuCi0KIFRoZXJlIGFyZSB0d28gd2F5cyB0byBlbmFibGUgdGhlIDptb2Q6YHNxbGl0ZTNgIG1vZHVsZSB0byBhZGFwdCBhIGN1c3RvbSBQeXRob24KIHR5cGUgdG8gb25lIG9mIHRoZSBzdXBwb3J0ZWQgb25lcy4KIApAQCAtODExLDYgKzgyOSwxMCBAQAogCiAuLiBsaXRlcmFsaW5jbHVkZTo6IC4uL2luY2x1ZGVzL3NxbGl0ZTMvcHlzcWxpdGVfZGF0ZXRpbWUucHkKIAorSWYgYSB0aW1lc3RhbXAgc3RvcmVkIGluIFNRTGl0ZSBoYXMgYSBmcmFjdGlvbmFsIHBhcnQgbG9uZ2VyIHRoYW4gNgorbnVtYmVycywgaXRzIHZhbHVlIHdpbGwgYmUgdHJ1bmNhdGVkIHRvIG1pY3Jvc2Vjb25kIHByZWNpc2lvbiBieSB0aGUKK3RpbWVzdGFtcCBjb252ZXJ0ZXIuCisKIAogLi4gX3NxbGl0ZTMtY29udHJvbGxpbmctdHJhbnNhY3Rpb25zOgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zc2wucnN0IGIvRG9jL2xpYnJhcnkvc3NsLnJzdAppbmRleCA5YjA5ODk0Li5jMTE1OTc2IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9zc2wucnN0CisrKyBiL0RvYy9saWJyYXJ5L3NzbC5yc3QKQEAgLTMwLDYgKzMwLDE4IEBACiAgICBvcGVyYXRpbmcgc3lzdGVtIHNvY2tldCBBUElzLiAgVGhlIGluc3RhbGxlZCB2ZXJzaW9uIG9mIE9wZW5TU0wgbWF5IGFsc28KICAgIGNhdXNlIHZhcmlhdGlvbnMgaW4gYmVoYXZpb3IuCiAKKy4uIHdhcm5pbmc6OgorICAgVGhlIHNzbCBtb2R1bGUgd29uJ3QgdmFsaWRhdGUgY2VydGlmaWNhdGVzIGJ5IGRlZmF1bHQuICBXaGVuIHVzZWQgaW4KKyAgIGNsaWVudCBtb2RlLCB0aGlzIG1lYW5zIHlvdSBhcmUgdnVsbmVyYWJsZSB0byBtYW4taW4tdGhlLW1pZGRsZSBhdHRhY2tzLgorCisuLiB3YXJuaW5nOjoKKworICAgT3BlblNTTCdzIGludGVybmFsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGRvZXMgbm90IHByb3Blcmx5IGhhbmRsZSBmb3JrLgorICAgQXBwbGljYXRpb25zIG11c3QgY2hhbmdlIHRoZSBQUk5HIHN0YXRlIG9mIHRoZSBwYXJlbnQgcHJvY2VzcyBpZiB0aGV5IHVzZQorICAgYW55IFNTTCBmZWF0dXJlIHdpdGggOmZ1bmM6YG9zLmZvcmtgLiBBbnkgc3VjY2Vzc2Z1bCBjYWxsIG9mCisgICA6ZnVuYzpgfnNzbC5SQU5EX2FkZGAsIDpmdW5jOmB+c3NsLlJBTkRfYnl0ZXNgIG9yCisgICA6ZnVuYzpgfnNzbC5SQU5EX3BzZXVkb19ieXRlc2AgaXMgc3VmZmljaWVudC4KKwogVGhpcyBzZWN0aW9uIGRvY3VtZW50cyB0aGUgb2JqZWN0cyBhbmQgZnVuY3Rpb25zIGluIHRoZSBgYHNzbGBgIG1vZHVsZTsgZm9yIG1vcmUKIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgVExTLCBTU0wsIGFuZCBjZXJ0aWZpY2F0ZXMsIHRoZSByZWFkZXIgaXMgcmVmZXJyZWQgdG8KIHRoZSBkb2N1bWVudHMgaW4gdGhlICJTZWUgQWxzbyIgc2VjdGlvbiBhdCB0aGUgYm90dG9tLgpAQCAtNTcsMTMgKzY5LDE2IEBACiAKICAgIFRha2VzIGFuIGluc3RhbmNlIGBgc29ja2BgIG9mIDpjbGFzczpgc29ja2V0LnNvY2tldGAsIGFuZCByZXR1cm5zIGFuIGluc3RhbmNlCiAgICBvZiA6Y2xhc3M6YHNzbC5TU0xTb2NrZXRgLCBhIHN1YnR5cGUgb2YgOmNsYXNzOmBzb2NrZXQuc29ja2V0YCwgd2hpY2ggd3JhcHMKLSAgIHRoZSB1bmRlcmx5aW5nIHNvY2tldCBpbiBhbiBTU0wgY29udGV4dC4gIEZvciBjbGllbnQtc2lkZSBzb2NrZXRzLCB0aGUKLSAgIGNvbnRleHQgY29uc3RydWN0aW9uIGlzIGxhenk7IGlmIHRoZSB1bmRlcmx5aW5nIHNvY2tldCBpc24ndCBjb25uZWN0ZWQgeWV0LAotICAgdGhlIGNvbnRleHQgY29uc3RydWN0aW9uIHdpbGwgYmUgcGVyZm9ybWVkIGFmdGVyIDptZXRoOmBjb25uZWN0YCBpcyBjYWxsZWQgb24KLSAgIHRoZSBzb2NrZXQuICBGb3Igc2VydmVyLXNpZGUgc29ja2V0cywgaWYgdGhlIHNvY2tldCBoYXMgbm8gcmVtb3RlIHBlZXIsIGl0IGlzCi0gICBhc3N1bWVkIHRvIGJlIGEgbGlzdGVuaW5nIHNvY2tldCwgYW5kIHRoZSBzZXJ2ZXItc2lkZSBTU0wgd3JhcHBpbmcgaXMKLSAgIGF1dG9tYXRpY2FsbHkgcGVyZm9ybWVkIG9uIGNsaWVudCBjb25uZWN0aW9ucyBhY2NlcHRlZCB2aWEgdGhlIDptZXRoOmBhY2NlcHRgCi0gICBtZXRob2QuICA6ZnVuYzpgd3JhcF9zb2NrZXRgIG1heSByYWlzZSA6ZXhjOmBTU0xFcnJvcmAuCisgICB0aGUgdW5kZXJseWluZyBzb2NrZXQgaW4gYW4gU1NMIGNvbnRleHQuICBgYHNvY2tgYCBtdXN0IGJlIGEKKyAgIDpkYXRhOmB+c29ja2V0LlNPQ0tfU1RSRUFNYCBzb2NrZXQ7IG90aGVyIHNvY2tldCB0eXBlcyBhcmUgdW5zdXBwb3J0ZWQuCisKKyAgIEZvciBjbGllbnQtc2lkZSBzb2NrZXRzLCB0aGUgY29udGV4dCBjb25zdHJ1Y3Rpb24gaXMgbGF6eTsgaWYgdGhlCisgICB1bmRlcmx5aW5nIHNvY2tldCBpc24ndCBjb25uZWN0ZWQgeWV0LCB0aGUgY29udGV4dCBjb25zdHJ1Y3Rpb24gd2lsbCBiZQorICAgcGVyZm9ybWVkIGFmdGVyIDptZXRoOmBjb25uZWN0YCBpcyBjYWxsZWQgb24gdGhlIHNvY2tldC4gIEZvcgorICAgc2VydmVyLXNpZGUgc29ja2V0cywgaWYgdGhlIHNvY2tldCBoYXMgbm8gcmVtb3RlIHBlZXIsIGl0IGlzIGFzc3VtZWQKKyAgIHRvIGJlIGEgbGlzdGVuaW5nIHNvY2tldCwgYW5kIHRoZSBzZXJ2ZXItc2lkZSBTU0wgd3JhcHBpbmcgaXMKKyAgIGF1dG9tYXRpY2FsbHkgcGVyZm9ybWVkIG9uIGNsaWVudCBjb25uZWN0aW9ucyBhY2NlcHRlZCB2aWEgdGhlCisgICA6bWV0aDpgYWNjZXB0YCBtZXRob2QuICA6ZnVuYzpgd3JhcF9zb2NrZXRgIG1heSByYWlzZSA6ZXhjOmBTU0xFcnJvcmAuCiAKICAgIFRoZSBgYGtleWZpbGVgYCBhbmQgYGBjZXJ0ZmlsZWBgIHBhcmFtZXRlcnMgc3BlY2lmeSBvcHRpb25hbCBmaWxlcyB3aGljaAogICAgY29udGFpbiBhIGNlcnRpZmljYXRlIHRvIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGxvY2FsIHNpZGUgb2YgdGhlCkBAIC0xMDMsOSArMTE4LDggQEAKICAgIFRoZSBwYXJhbWV0ZXIgYGBzc2xfdmVyc2lvbmBgIHNwZWNpZmllcyB3aGljaCB2ZXJzaW9uIG9mIHRoZSBTU0wgcHJvdG9jb2wgdG8KICAgIHVzZS4gIFR5cGljYWxseSwgdGhlIHNlcnZlciBjaG9vc2VzIGEgcGFydGljdWxhciBwcm90b2NvbCB2ZXJzaW9uLCBhbmQgdGhlCiAgICBjbGllbnQgbXVzdCBhZGFwdCB0byB0aGUgc2VydmVyJ3MgY2hvaWNlLiAgTW9zdCBvZiB0aGUgdmVyc2lvbnMgYXJlIG5vdAotICAgaW50ZXJvcGVyYWJsZSB3aXRoIHRoZSBvdGhlciB2ZXJzaW9ucy4gIElmIG5vdCBzcGVjaWZpZWQsIGZvciBjbGllbnQtc2lkZQotICAgb3BlcmF0aW9uLCB0aGUgZGVmYXVsdCBTU0wgdmVyc2lvbiBpcyBTU0x2MzsgZm9yIHNlcnZlci1zaWRlIG9wZXJhdGlvbiwKLSAgIFNTTHYyMy4gIFRoZXNlIHZlcnNpb24gc2VsZWN0aW9ucyBwcm92aWRlIHRoZSBtb3N0IGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlcgorICAgaW50ZXJvcGVyYWJsZSB3aXRoIHRoZSBvdGhlciB2ZXJzaW9ucy4gIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGlzCisgICA6ZGF0YTpgUFJPVE9DT0xfU1NMdjIzYDsgaXQgcHJvdmlkZXMgdGhlIG1vc3QgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyCiAgICB2ZXJzaW9ucy4KIAogICAgSGVyZSdzIGEgdGFibGUgc2hvd2luZyB3aGljaCB2ZXJzaW9ucyBpbiBhIGNsaWVudCAoZG93biB0aGUgc2lkZSkgY2FuIGNvbm5lY3QKQEAgLTExNyw3ICsxMzEsNyBAQAogICAgICAgICAqY2xpZW50KiAvICoqc2VydmVyKiogICAgKipTU0x2MioqICAqKlNTTHYzKiogICoqU1NMdjIzKiogICoqVExTdjEqKgogICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tICAtLS0tLS0tLS0gIC0tLS0tLS0tLS0gIC0tLS0tLS0tLQogICAgICAgICAqU1NMdjIqICAgICAgICAgICAgICAgICAgICB5ZXMgICAgICAgIG5vICAgICAgICAgeWVzICAgICAgICAgbm8KLSAgICAgICAgKlNTTHYzKiAgICAgICAgICAgICAgICAgICAgeWVzICAgICAgICB5ZXMgICAgICAgIHllcyAgICAgICAgIG5vCisgICAgICAgICpTU0x2MyogICAgICAgICAgICAgICAgICAgIG5vICAgICAgICAgeWVzICAgICAgICB5ZXMgICAgICAgICBubwogICAgICAgICAqU1NMdjIzKiAgICAgICAgICAgICAgICAgICB5ZXMgICAgICAgIG5vICAgICAgICAgeWVzICAgICAgICAgbm8KICAgICAgICAgKlRMU3YxKiAgICAgICAgICAgICAgICAgICAgbm8gICAgICAgICBubyAgICAgICAgIHllcyAgICAgICAgIHllcwogICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PSAgPT09PT09PT09ICA9PT09PT09PT0gID09PT09PT09PT0gID09PT09PT09PQpAQCAtMTU1LDcgKzE2OSw3IEBACiAKIC4uIGZ1bmN0aW9uOjogUkFORF9zdGF0dXMoKQogCi0gICBSZXR1cm5zIFRydWUgaWYgdGhlIFNTTCBwc2V1ZG8tcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaGFzIGJlZW4gc2VlZGVkIHdpdGgKKyAgIFJldHVybnMgYGBUcnVlYGAgaWYgdGhlIFNTTCBwc2V1ZG8tcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaGFzIGJlZW4gc2VlZGVkIHdpdGgKICAgICdlbm91Z2gnIHJhbmRvbW5lc3MsIGFuZCBGYWxzZSBvdGhlcndpc2UuICBZb3UgY2FuIHVzZSA6ZnVuYzpgc3NsLlJBTkRfZWdkYAogICAgYW5kIDpmdW5jOmBzc2wuUkFORF9hZGRgIHRvIGluY3JlYXNlIHRoZSByYW5kb21uZXNzIG9mIHRoZSBwc2V1ZG8tcmFuZG9tCiAgICBudW1iZXIgZ2VuZXJhdG9yLgpAQCAtMjk5LDIxICszMTMsMzcgQEAKIFNTTFNvY2tldCBPYmplY3RzCiAtLS0tLS0tLS0tLS0tLS0tLQogCi0uLiBtZXRob2Q6OiBTU0xTb2NrZXQucmVhZChbbmJ5dGVzPTEwMjRdKQorU1NMIHNvY2tldHMgcHJvdmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgb2YgOnJlZjpgc29ja2V0LW9iamVjdHNgOgogCi0gICBSZWFkcyB1cCB0byBgYG5ieXRlc2BgIGJ5dGVzIGZyb20gdGhlIFNTTC1lbmNyeXB0ZWQgY2hhbm5lbCBhbmQgcmV0dXJucyB0aGVtLgorLSA6bWV0aDpgfnNvY2tldC5zb2NrZXQuYWNjZXB0KClgCistIDptZXRoOmB+c29ja2V0LnNvY2tldC5iaW5kKClgCistIDptZXRoOmB+c29ja2V0LnNvY2tldC5jbG9zZSgpYAorLSA6bWV0aDpgfnNvY2tldC5zb2NrZXQuY29ubmVjdCgpYAorLSA6bWV0aDpgfnNvY2tldC5zb2NrZXQuZmlsZW5vKClgCistIDptZXRoOmB+c29ja2V0LnNvY2tldC5nZXRwZWVybmFtZSgpYCwgOm1ldGg6YH5zb2NrZXQuc29ja2V0LmdldHNvY2tuYW1lKClgCistIDptZXRoOmB+c29ja2V0LnNvY2tldC5nZXRzb2Nrb3B0KClgLCA6bWV0aDpgfnNvY2tldC5zb2NrZXQuc2V0c29ja29wdCgpYAorLSA6bWV0aDpgfnNvY2tldC5zb2NrZXQuZ2V0dGltZW91dCgpYCwgOm1ldGg6YH5zb2NrZXQuc29ja2V0LnNldHRpbWVvdXQoKWAsCisgIDptZXRoOmB+c29ja2V0LnNvY2tldC5zZXRibG9ja2luZygpYAorLSA6bWV0aDpgfnNvY2tldC5zb2NrZXQubGlzdGVuKClgCistIDptZXRoOmB+c29ja2V0LnNvY2tldC5tYWtlZmlsZSgpYAorLSA6bWV0aDpgfnNvY2tldC5zb2NrZXQucmVjdigpYCwgOm1ldGg6YH5zb2NrZXQuc29ja2V0LnJlY3ZfaW50bygpYAorICAoYnV0IHBhc3NpbmcgYSBub24temVybyBgYGZsYWdzYGAgYXJndW1lbnQgaXMgbm90IGFsbG93ZWQpCistIDptZXRoOmB+c29ja2V0LnNvY2tldC5zZW5kKClgLCA6bWV0aDpgfnNvY2tldC5zb2NrZXQuc2VuZGFsbCgpYCAod2l0aAorICB0aGUgc2FtZSBsaW1pdGF0aW9uKQorLSA6bWV0aDpgfnNvY2tldC5zb2NrZXQuc2h1dGRvd24oKWAKIAotLi4gbWV0aG9kOjogU1NMU29ja2V0LndyaXRlKGRhdGEpCitIb3dldmVyLCBzaW5jZSB0aGUgU1NMIChhbmQgVExTKSBwcm90b2NvbCBoYXMgaXRzIG93biBmcmFtaW5nIGF0b3AKK29mIFRDUCwgdGhlIFNTTCBzb2NrZXRzIGFic3RyYWN0aW9uIGNhbiwgaW4gY2VydGFpbiByZXNwZWN0cywgZGl2ZXJnZSBmcm9tCit0aGUgc3BlY2lmaWNhdGlvbiBvZiBub3JtYWwsIE9TLWxldmVsIHNvY2tldHMuCiAKLSAgIFdyaXRlcyB0aGUgYGBkYXRhYGAgdG8gdGhlIG90aGVyIHNpZGUgb2YgdGhlIGNvbm5lY3Rpb24sIHVzaW5nIHRoZSBTU0wKLSAgIGNoYW5uZWwgdG8gZW5jcnlwdC4gIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLgorU1NMIHNvY2tldHMgYWxzbyBoYXZlIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBtZXRob2RzIGFuZCBhdHRyaWJ1dGVzOgogCiAuLiBtZXRob2Q6OiBTU0xTb2NrZXQuZ2V0cGVlcmNlcnQoYmluYXJ5X2Zvcm09RmFsc2UpCiAKICAgIElmIHRoZXJlIGlzIG5vIGNlcnRpZmljYXRlIGZvciB0aGUgcGVlciBvbiB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjb25uZWN0aW9uLAogICAgcmV0dXJucyBgYE5vbmVgYC4KIAotICAgSWYgdGhlIHBhcmFtZXRlciBgYGJpbmFyeV9mb3JtYGAgaXMgOmNvbnN0OmBGYWxzZWAsIGFuZCBhIGNlcnRpZmljYXRlIHdhcworICAgSWYgdGhlIGBgYmluYXJ5X2Zvcm1gYCBwYXJhbWV0ZXIgaXMgOmNvbnN0OmBGYWxzZWAsIGFuZCBhIGNlcnRpZmljYXRlIHdhcwogICAgcmVjZWl2ZWQgZnJvbSB0aGUgcGVlciwgdGhpcyBtZXRob2QgcmV0dXJucyBhIDpjbGFzczpgZGljdGAgaW5zdGFuY2UuICBJZiB0aGUKICAgIGNlcnRpZmljYXRlIHdhcyBub3QgdmFsaWRhdGVkLCB0aGUgZGljdCBpcyBlbXB0eS4gIElmIHRoZSBjZXJ0aWZpY2F0ZSB3YXMKICAgIHZhbGlkYXRlZCwgaXQgcmV0dXJucyBhIGRpY3Qgd2l0aCB0aGUga2V5cyBgYHN1YmplY3RgYCAodGhlIHByaW5jaXBhbCBmb3IKQEAgLTMzOSwxMCArMzY5LDE2IEBACiAgICBJZiB0aGUgYGBiaW5hcnlfZm9ybWBgIHBhcmFtZXRlciBpcyA6Y29uc3Q6YFRydWVgLCBhbmQgYSBjZXJ0aWZpY2F0ZSB3YXMKICAgIHByb3ZpZGVkLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBERVItZW5jb2RlZCBmb3JtIG9mIHRoZSBlbnRpcmUgY2VydGlmaWNhdGUKICAgIGFzIGEgc2VxdWVuY2Ugb2YgYnl0ZXMsIG9yIDpjb25zdDpgTm9uZWAgaWYgdGhlIHBlZXIgZGlkIG5vdCBwcm92aWRlIGEKLSAgIGNlcnRpZmljYXRlLiAgVGhpcyByZXR1cm4gdmFsdWUgaXMgaW5kZXBlbmRlbnQgb2YgdmFsaWRhdGlvbjsgaWYgdmFsaWRhdGlvbgotICAgd2FzIHJlcXVpcmVkICg6Y29uc3Q6YENFUlRfT1BUSU9OQUxgIG9yIDpjb25zdDpgQ0VSVF9SRVFVSVJFRGApLCBpdCB3aWxsIGhhdmUKLSAgIGJlZW4gdmFsaWRhdGVkLCBidXQgaWYgOmNvbnN0OmBDRVJUX05PTkVgIHdhcyB1c2VkIHRvIGVzdGFibGlzaCB0aGUKLSAgIGNvbm5lY3Rpb24sIHRoZSBjZXJ0aWZpY2F0ZSwgaWYgcHJlc2VudCwgd2lsbCBub3QgaGF2ZSBiZWVuIHZhbGlkYXRlZC4KKyAgIGNlcnRpZmljYXRlLiAgV2hldGhlciB0aGUgcGVlciBwcm92aWRlcyBhIGNlcnRpZmljYXRlIGRlcGVuZHMgb24gdGhlIFNTTAorICAgc29ja2V0J3Mgcm9sZToKKworICAgKiBmb3IgYSBjbGllbnQgU1NMIHNvY2tldCwgdGhlIHNlcnZlciB3aWxsIGFsd2F5cyBwcm92aWRlIGEgY2VydGlmaWNhdGUsCisgICAgIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB2YWxpZGF0aW9uIHdhcyByZXF1aXJlZDsKKworICAgKiBmb3IgYSBzZXJ2ZXIgU1NMIHNvY2tldCwgdGhlIGNsaWVudCB3aWxsIG9ubHkgcHJvdmlkZSBhIGNlcnRpZmljYXRlCisgICAgIHdoZW4gcmVxdWVzdGVkIGJ5IHRoZSBzZXJ2ZXI7IHRoZXJlZm9yZSA6bWV0aDpgZ2V0cGVlcmNlcnRgIHdpbGwgcmV0dXJuCisgICAgIDpjb25zdDpgTm9uZWAgaWYgeW91IHVzZWQgOmNvbnN0OmBDRVJUX05PTkVgIChyYXRoZXIgdGhhbgorICAgICA6Y29uc3Q6YENFUlRfT1BUSU9OQUxgIG9yIDpjb25zdDpgQ0VSVF9SRVFVSVJFRGApLgogCiAuLiBtZXRob2Q6OiBTU0xTb2NrZXQuY2lwaGVyKCkKIApAQCAtMzYyLDcgKzM5OCw3IEBACiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgcy5kb19oYW5kc2hha2UoKQogICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBleGNlcHQgc3NsLlNTTEVycm9yLCBlcnI6CisgICAgICAgICAgICBleGNlcHQgc3NsLlNTTEVycm9yIGFzIGVycjoKICAgICAgICAgICAgICAgICBpZiBlcnIuYXJnc1swXSA9PSBzc2wuU1NMX0VSUk9SX1dBTlRfUkVBRDoKICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdChbc10sIFtdLCBbXSkKICAgICAgICAgICAgICAgICBlbGlmIGVyci5hcmdzWzBdID09IHNzbC5TU0xfRVJST1JfV0FOVF9XUklURToKQEAgLTQ1NCw4ICs0OTAsNyBAQAogY2hhaW4gaXQgZmluZHMgaW4gdGhlIGZpbGUgd2hpY2ggbWF0Y2hlcy4KIAogU29tZSAic3RhbmRhcmQiIHJvb3QgY2VydGlmaWNhdGVzIGFyZSBhdmFpbGFibGUgZnJvbSB2YXJpb3VzIGNlcnRpZmljYXRpb24KLWF1dGhvcml0aWVzOiBgQ0FDZXJ0Lm9yZyA8aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0zPmBfLCBgVGhhd3RlCi08aHR0cDovL3d3dy50aGF3dGUuY29tL3Jvb3RzLz5gXywgYFZlcmlzaWduCithdXRob3JpdGllczogYFRoYXd0ZSA8aHR0cDovL3d3dy50aGF3dGUuY29tL3Jvb3RzLz5gXywgYFZlcmlzaWduCiA8aHR0cDovL3d3dy52ZXJpc2lnbi5jb20vc3VwcG9ydC9yb290cy5odG1sPmBfLCBgUG9zaXRpdmUgU1NMCiA8aHR0cDovL3d3dy5Qb3NpdGl2ZVNTTC5jb20vc3NsLWNlcnRpZmljYXRlLXN1cHBvcnQvY2VydF9pbnN0YWxsYXRpb24vVVROLVVTRVJGaXJzdC1IYXJkd2FyZS5jcnQ+YF8KICh1c2VkIGJ5IHB5dGhvbi5vcmcpLCBgRXF1aWZheCBhbmQgR2VvVHJ1c3QKQEAgLTYyMCwxMCArNjU1LDEwIEBACiAuLiBzZWVhbHNvOjoKIAogICAgQ2xhc3MgOmNsYXNzOmBzb2NrZXQuc29ja2V0YAotICAgICAgICAgICAgRG9jdW1lbnRhdGlvbiBvZiB1bmRlcmx5aW5nIDptb2Q6YHNvY2tldGAgY2xhc3MKKyAgICAgICBEb2N1bWVudGF0aW9uIG9mIHVuZGVybHlpbmcgOm1vZDpgc29ja2V0YCBjbGFzcwogCi0gICBgVExTIChUcmFuc3BvcnQgTGF5ZXIgU2VjdXJpdHkpIGFuZCBTU0wgKFNlY3VyZSBTb2NrZXQgTGF5ZXIpIDxodHRwOi8vd3d3My5yYWQuY29tL25ldHdvcmtzL2FwcGxpY2F0aW9ucy9zZWN1cmUvdGxzLmh0bT5gXwotICAgICAgRGViYnkgS29yZW4KKyAgIGBTU0wvVExTIFN0cm9uZyBFbmNyeXB0aW9uOiBBbiBJbnRyb2R1Y3Rpb24gPGh0dHA6Ly9odHRwZC5hcGFjaGUub3JnL2RvY3MvdHJ1bmsvZW4vc3NsL3NzbF9pbnRyby5odG1sPmBfCisgICAgICAgSW50cm8gZnJvbSB0aGUgQXBhY2hlIHdlYnNlcnZlciBkb2N1bWVudGF0aW9uCiAKICAgIGBSRkMgMTQyMjogUHJpdmFjeSBFbmhhbmNlbWVudCBmb3IgSW50ZXJuZXQgRWxlY3Ryb25pYyBNYWlsOiBQYXJ0IElJOiBDZXJ0aWZpY2F0ZS1CYXNlZCBLZXkgTWFuYWdlbWVudCA8aHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTQyMj5gXwogICAgICAgIFN0ZXZlIEtlbnQKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3N0YXQucnN0IGIvRG9jL2xpYnJhcnkvc3RhdC5yc3QKaW5kZXggOGZkOTBkYS4uYThmNDExYSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc3RhdC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc3RhdC5yc3QKQEAgLTEsNSArMSw1IEBACi06bW9kOmBzdGF0YCAtLS0gSW50ZXJwcmV0aW5nIDpmdW5jOmBzdGF0YCByZXN1bHRzCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis6bW9kOmBzdGF0YCAtLS0gSW50ZXJwcmV0aW5nIDpmdW5jOmB+b3Muc3RhdGAgcmVzdWx0cworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogLi4gbW9kdWxlOjogc3RhdAogICAgOnN5bm9wc2lzOiBVdGlsaXRpZXMgZm9yIGludGVycHJldGluZyB0aGUgcmVzdWx0cyBvZiBvcy5zdGF0KCksIG9zLmxzdGF0KCkgYW5kIG9zLmZzdGF0KCkuCkBAIC0xMSw4ICsxMSw4IEBACiAKIFRoZSA6bW9kOmBzdGF0YCBtb2R1bGUgZGVmaW5lcyBjb25zdGFudHMgYW5kIGZ1bmN0aW9ucyBmb3IgaW50ZXJwcmV0aW5nIHRoZQogcmVzdWx0cyBvZiA6ZnVuYzpgb3Muc3RhdGAsIDpmdW5jOmBvcy5mc3RhdGAgYW5kIDpmdW5jOmBvcy5sc3RhdGAgKGlmIHRoZXkKLWV4aXN0KS4gIEZvciBjb21wbGV0ZSBkZXRhaWxzIGFib3V0IHRoZSA6Y2Z1bmM6YHN0YXRgLCA6Y2Z1bmM6YGZzdGF0YCBhbmQKLTpjZnVuYzpgbHN0YXRgIGNhbGxzLCBjb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIGZvciB5b3VyIHN5c3RlbS4KK2V4aXN0KS4gIEZvciBjb21wbGV0ZSBkZXRhaWxzIGFib3V0IHRoZSA6YzpmdW5jOmBzdGF0YCwgOmM6ZnVuYzpgZnN0YXRgIGFuZAorOmM6ZnVuYzpgbHN0YXRgIGNhbGxzLCBjb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIGZvciB5b3VyIHN5c3RlbS4KIAogVGhlIDptb2Q6YHN0YXRgIG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHRvIHRlc3QgZm9yIHNwZWNpZmljIGZpbGUKIHR5cGVzOgpAQCAtNzAsNyArNzAsNyBAQAogCiBOb3JtYWxseSwgeW91IHdvdWxkIHVzZSB0aGUgOmZ1bmM6YG9zLnBhdGguaXNcKmAgZnVuY3Rpb25zIGZvciB0ZXN0aW5nIHRoZSB0eXBlCiBvZiBhIGZpbGU7IHRoZSBmdW5jdGlvbnMgaGVyZSBhcmUgdXNlZnVsIHdoZW4geW91IGFyZSBkb2luZyBtdWx0aXBsZSB0ZXN0cyBvZgotdGhlIHNhbWUgZmlsZSBhbmQgd2lzaCB0byBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YgdGhlIDpjZnVuYzpgc3RhdGAgc3lzdGVtIGNhbGwKK3RoZSBzYW1lIGZpbGUgYW5kIHdpc2ggdG8gYXZvaWQgdGhlIG92ZXJoZWFkIG9mIHRoZSA6YzpmdW5jOmBzdGF0YCBzeXN0ZW0gY2FsbAogZm9yIGVhY2ggdGVzdC4gIFRoZXNlIGFyZSBhbHNvIHVzZWZ1bCB3aGVuIGNoZWNraW5nIGZvciBpbmZvcm1hdGlvbiBhYm91dCBhIGZpbGUKIHRoYXQgaXNuJ3QgaGFuZGxlZCBieSA6bW9kOmBvcy5wYXRoYCwgbGlrZSB0aGUgdGVzdHMgZm9yIGJsb2NrIGFuZCBjaGFyYWN0ZXIKIGRldmljZXMuCkBAIC0xNzEsMTAgKzE3MSw2IEBACiAKIFVzZSBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlIGlzIG1vcmUgcG9ydGFibGUgdGhhbiB1c2Ugb2YgdGhlIGZpcnN0IHNldCBvZiBmbGFnczoKIAotLi4gZGF0YTo6IFNfSUZNVAotCi0gICBCaXQgbWFzayBmb3IgdGhlIGZpbGUgdHlwZSBiaXQgZmllbGRzLgotCiAuLiBkYXRhOjogU19JRlNPQ0sKIAogICAgU29ja2V0LgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc3RhdHZmcy5yc3QgYi9Eb2MvbGlicmFyeS9zdGF0dmZzLnJzdAppbmRleCAyNTM1NWJjLi42ZjQ0YjJjIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9zdGF0dmZzLnJzdAorKysgYi9Eb2MvbGlicmFyeS9zdGF0dmZzLnJzdApAQCAtNiw3ICs2LDcgQEAKICAgIDpkZXByZWNhdGVkOgogCiAuLiBkZXByZWNhdGVkOjogMi42Ci0gICBUaGUgOm1vZDpgc3RhdHZmc2AgbW9kdWxlIGhhcyBiZWVuIGRlcHJlY2F0ZWQgZm9yIHJlbW92YWwgaW4gUHl0aG9uIDMuMC4KKyAgIFRoZSA6bW9kOmBzdGF0dmZzYCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4KIAogCiAuLiBzZWN0aW9uYXV0aG9yOjogTW9zaGUgWmFka2EgPG1vc2hlekB6YWRrYS5zaXRlLmNvLmlsPgpAQCAtNjEsNyArNjEsNyBAQAogCiAuLiBkYXRhOjogRl9GTEFHCiAKLSAgIEZsYWdzLiBTeXN0ZW0gZGVwZW5kZW50OiBzZWUgOmNmdW5jOmBzdGF0dmZzYCBtYW4gcGFnZS4KKyAgIEZsYWdzLiBTeXN0ZW0gZGVwZW5kZW50OiBzZWUgOmM6ZnVuYzpgc3RhdHZmc2AgbWFuIHBhZ2UuCiAKIAogLi4gZGF0YTo6IEZfTkFNRU1BWApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc3RkdHlwZXMucnN0IGIvRG9jL2xpYnJhcnkvc3RkdHlwZXMucnN0CmluZGV4IDc2OTZlY2IuLmYyMjk5NjcgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3N0ZHR5cGVzLnJzdAorKysgYi9Eb2MvbGlicmFyeS9zdGR0eXBlcy5yc3QKQEAgLTI2LDcgKzI2LDcgQEAKIAogU29tZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQgYnkgc2V2ZXJhbCBvYmplY3QgdHlwZXM7IGluIHBhcnRpY3VsYXIsCiBwcmFjdGljYWxseSBhbGwgb2JqZWN0cyBjYW4gYmUgY29tcGFyZWQsIHRlc3RlZCBmb3IgdHJ1dGggdmFsdWUsIGFuZCBjb252ZXJ0ZWQKLXRvIGEgc3RyaW5nICh3aXRoIHRoZSA6ZnVuYzpgcmVwcmAgZnVuY3Rpb24gb3IgdGhlIHNsaWdodGx5IGRpZmZlcmVudAordG8gYSBzdHJpbmcgKHdpdGggdGhlIDpyZWY6YHJlcHIoKSA8ZnVuYy1yZXByPmAgZnVuY3Rpb24gb3IgdGhlIHNsaWdodGx5IGRpZmZlcmVudAogOmZ1bmM6YHN0cmAgZnVuY3Rpb24pLiAgVGhlIGxhdHRlciBmdW5jdGlvbiBpcyBpbXBsaWNpdGx5IHVzZWQgd2hlbiBhbiBvYmplY3QgaXMKIHdyaXR0ZW4gYnkgdGhlIDpmdW5jOmBwcmludGAgZnVuY3Rpb24uCiAKQEAgLTE4OSwxMSArMTg5LDIyIEBACiBhbmQgYGA+PWBgIG9wZXJhdG9ycyB3aWxsIHJhaXNlIGEgOmV4YzpgVHlwZUVycm9yYCBleGNlcHRpb24gd2hlbiBhbnkgb3BlcmFuZCBpcwogYSBjb21wbGV4IG51bWJlci4KIAotLi4gaW5kZXg6OiBzaW5nbGU6IF9fY21wX18oKSAoaW5zdGFuY2UgbWV0aG9kKQorLi4gaW5kZXg6OgorICAgc2luZ2xlOiBfX2NtcF9fKCkgKGluc3RhbmNlIG1ldGhvZCkKKyAgIHNpbmdsZTogX19lcV9fKCkgKGluc3RhbmNlIG1ldGhvZCkKKyAgIHNpbmdsZTogX19uZV9fKCkgKGluc3RhbmNlIG1ldGhvZCkKKyAgIHNpbmdsZTogX19sdF9fKCkgKGluc3RhbmNlIG1ldGhvZCkKKyAgIHNpbmdsZTogX19sZV9fKCkgKGluc3RhbmNlIG1ldGhvZCkKKyAgIHNpbmdsZTogX19ndF9fKCkgKGluc3RhbmNlIG1ldGhvZCkKKyAgIHNpbmdsZTogX19nZV9fKCkgKGluc3RhbmNlIG1ldGhvZCkKIAotSW5zdGFuY2VzIG9mIGEgY2xhc3Mgbm9ybWFsbHkgY29tcGFyZSBhcyBub24tZXF1YWwgdW5sZXNzIHRoZSBjbGFzcyBkZWZpbmVzIHRoZQotOm1ldGg6YF9fY21wX19gIG1ldGhvZC4gIFJlZmVyIHRvIDpyZWY6YGN1c3RvbWl6YXRpb25gKSBmb3IgaW5mb3JtYXRpb24gb24gdGhlCi11c2Ugb2YgdGhpcyBtZXRob2QgdG8gZWZmZWN0IG9iamVjdCBjb21wYXJpc29ucy4KK05vbi1pZGVudGljYWwgaW5zdGFuY2VzIG9mIGEgY2xhc3Mgbm9ybWFsbHkgY29tcGFyZSBhcyBub24tZXF1YWwgdW5sZXNzIHRoZQorY2xhc3MgZGVmaW5lcyB0aGUgOm1ldGg6YF9fZXFfX2AgbWV0aG9kIG9yIHRoZSA6bWV0aDpgX19jbXBfX2AgbWV0aG9kLgorCitJbnN0YW5jZXMgb2YgYSBjbGFzcyBjYW5ub3QgYmUgb3JkZXJlZCB3aXRoIHJlc3BlY3QgdG8gb3RoZXIgaW5zdGFuY2VzIG9mIHRoZQorc2FtZSBjbGFzcywgb3Igb3RoZXIgdHlwZXMgb2Ygb2JqZWN0LCB1bmxlc3MgdGhlIGNsYXNzIGRlZmluZXMgZWl0aGVyIGVub3VnaCBvZgordGhlIHJpY2ggY29tcGFyaXNvbiBtZXRob2RzICg6bWV0aDpgX19sdF9fYCwgOm1ldGg6YF9fbGVfX2AsIDptZXRoOmBfX2d0X19gLCBhbmQKKzptZXRoOmBfX2dlX19gKSBvciB0aGUgOm1ldGg6YF9fY21wX19gIG1ldGhvZC4KIAogLi4gaW1wbC1kZXRhaWw6OgogCkBAIC0yMjYsMTEgKzIzNywxMSBAQAogVGhlcmUgYXJlIGZvdXIgZGlzdGluY3QgbnVtZXJpYyB0eXBlczogOmRmbjpgcGxhaW4gaW50ZWdlcnNgLCA6ZGZuOmBsb25nCiBpbnRlZ2Vyc2AsIDpkZm46YGZsb2F0aW5nIHBvaW50IG51bWJlcnNgLCBhbmQgOmRmbjpgY29tcGxleCBudW1iZXJzYC4gSW4KIGFkZGl0aW9uLCBCb29sZWFucyBhcmUgYSBzdWJ0eXBlIG9mIHBsYWluIGludGVnZXJzLiBQbGFpbiBpbnRlZ2VycyAoYWxzbyBqdXN0Ci1jYWxsZWQgOmRmbjpgaW50ZWdlcnNgKSBhcmUgaW1wbGVtZW50ZWQgdXNpbmcgOmN0eXBlOmBsb25nYCBpbiBDLCB3aGljaCBnaXZlcworY2FsbGVkIDpkZm46YGludGVnZXJzYCkgYXJlIGltcGxlbWVudGVkIHVzaW5nIDpjOnR5cGU6YGxvbmdgIGluIEMsIHdoaWNoIGdpdmVzCiB0aGVtIGF0IGxlYXN0IDMyIGJpdHMgb2YgcHJlY2lzaW9uIChgYHN5cy5tYXhpbnRgYCBpcyBhbHdheXMgc2V0IHRvIHRoZSBtYXhpbXVtCiBwbGFpbiBpbnRlZ2VyIHZhbHVlIGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybSwgdGhlIG1pbmltdW0gdmFsdWUgaXMKIGBgLXN5cy5tYXhpbnQgLSAxYGApLiAgTG9uZyBpbnRlZ2VycyBoYXZlIHVubGltaXRlZCBwcmVjaXNpb24uICBGbG9hdGluZyBwb2ludAotbnVtYmVycyBhcmUgdXN1YWxseSBpbXBsZW1lbnRlZCB1c2luZyA6Y3R5cGU6YGRvdWJsZWAgaW4gQzsgaW5mb3JtYXRpb24gYWJvdXQKK251bWJlcnMgYXJlIHVzdWFsbHkgaW1wbGVtZW50ZWQgdXNpbmcgOmM6dHlwZTpgZG91YmxlYCBpbiBDOyBpbmZvcm1hdGlvbiBhYm91dAogdGhlIHByZWNpc2lvbiBhbmQgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBmb3IgdGhlCiBtYWNoaW5lIG9uIHdoaWNoIHlvdXIgcHJvZ3JhbSBpcyBydW5uaW5nIGlzIGF2YWlsYWJsZSBpbgogOmRhdGE6YHN5cy5mbG9hdF9pbmZvYC4gIENvbXBsZXggbnVtYmVycyBoYXZlIGEgcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnQsIHdoaWNoCkBAIC0zODgsOCArMzk5LDggQEAKIHwgYGBtYXRoLnRydW5jKHgpYGAgIHwgKngqIHRydW5jYXRlZCB0byBJbnRlZ3JhbCAgICAgICAgICB8ICAgICAgICB8CiArLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tKwogfCBgYHJvdW5kKHhbLCBuXSlgYCAgfCAqeCogcm91bmRlZCB0byBuIGRpZ2l0cywgICAgICAgICAgIHwgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgIHwgcm91bmRpbmcgaGFsZiB0byBldmVuLiBJZiBuIGlzICAgICB8ICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICB8IG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIDAuICAgICAgICAgfCAgICAgICAgfAorfCAgICAgICAgICAgICAgICAgICAgfCByb3VuZGluZyB0aWVzIGF3YXkgZnJvbSB6ZXJvLiBJZiBuIHwgICAgICAgIHwKK3wgICAgICAgICAgICAgICAgICAgIHwgaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gMC4gICAgICB8ICAgICAgICB8CiArLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tKwogfCBgYG1hdGguZmxvb3IoeClgYCAgfCB0aGUgZ3JlYXRlc3QgaW50ZWdyYWwgZmxvYXQgPD0gKngqIHwgICAgICAgIHwKICstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0rCkBAIC00MDEsMTIgKzQxMiwxMiBAQAogCiAuLiBfYml0c3RyaW5nLW9wczoKIAotQml0LXN0cmluZyBPcGVyYXRpb25zIG9uIEludGVnZXIgVHlwZXMKK0JpdHdpc2UgT3BlcmF0aW9ucyBvbiBJbnRlZ2VyIFR5cGVzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAuLiBpbmRleDo6CiAgICB0cmlwbGU6IG9wZXJhdGlvbnMgb247IGludGVnZXI7IHR5cGVzCi0gICBwYWlyOiBiaXQtc3RyaW5nOyBvcGVyYXRpb25zCisgICBwYWlyOiBiaXR3aXNlOyBvcGVyYXRpb25zCiAgICBwYWlyOiBzaGlmdGluZzsgb3BlcmF0aW9ucwogICAgcGFpcjogbWFza2luZzsgb3BlcmF0aW9ucwogICAgb3BlcmF0b3I6IF4KQEAgLTQxNCwxNiArNDI1LDE2IEBACiAgICBvcGVyYXRvcjogPDwKICAgIG9wZXJhdG9yOiA+PgogCi1QbGFpbiBhbmQgbG9uZyBpbnRlZ2VyIHR5cGVzIHN1cHBvcnQgYWRkaXRpb25hbCBvcGVyYXRpb25zIHRoYXQgbWFrZSBzZW5zZSBvbmx5Ci1mb3IgYml0LXN0cmluZ3MuICBOZWdhdGl2ZSBudW1iZXJzIGFyZSB0cmVhdGVkIGFzIHRoZWlyIDIncyBjb21wbGVtZW50IHZhbHVlCi0oZm9yIGxvbmcgaW50ZWdlcnMsIHRoaXMgYXNzdW1lcyBhIHN1ZmZpY2llbnRseSBsYXJnZSBudW1iZXIgb2YgYml0cyB0aGF0IG5vCi1vdmVyZmxvdyBvY2N1cnMgZHVyaW5nIHRoZSBvcGVyYXRpb24pLgorQml0d2lzZSBvcGVyYXRpb25zIG9ubHkgbWFrZSBzZW5zZSBmb3IgaW50ZWdlcnMuICBOZWdhdGl2ZSBudW1iZXJzIGFyZSB0cmVhdGVkCithcyB0aGVpciAyJ3MgY29tcGxlbWVudCB2YWx1ZSAodGhpcyBhc3N1bWVzIGEgc3VmZmljaWVudGx5IGxhcmdlIG51bWJlciBvZiBiaXRzCit0aGF0IG5vIG92ZXJmbG93IG9jY3VycyBkdXJpbmcgdGhlIG9wZXJhdGlvbikuCiAKIFRoZSBwcmlvcml0aWVzIG9mIHRoZSBiaW5hcnkgYml0d2lzZSBvcGVyYXRpb25zIGFyZSBhbGwgbG93ZXIgdGhhbiB0aGUgbnVtZXJpYwogb3BlcmF0aW9ucyBhbmQgaGlnaGVyIHRoYW4gdGhlIGNvbXBhcmlzb25zOyB0aGUgdW5hcnkgb3BlcmF0aW9uIGBgfmBgIGhhcyB0aGUKIHNhbWUgcHJpb3JpdHkgYXMgdGhlIG90aGVyIHVuYXJ5IG51bWVyaWMgb3BlcmF0aW9ucyAoYGArYGAgYW5kIGBgLWBgKS4KIAotVGhpcyB0YWJsZSBsaXN0cyB0aGUgYml0LXN0cmluZyBvcGVyYXRpb25zIHNvcnRlZCBpbiBhc2NlbmRpbmcgcHJpb3JpdHk6CitUaGlzIHRhYmxlIGxpc3RzIHRoZSBiaXR3aXNlIG9wZXJhdGlvbnMgc29ydGVkIGluIGFzY2VuZGluZyBwcmlvcml0eQorKG9wZXJhdGlvbnMgaW4gdGhlIHNhbWUgYm94IGhhdmUgdGhlIHNhbWUgcHJpb3JpdHkpOgogCiArLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCiB8IE9wZXJhdGlvbiAgfCBSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgICB8CkBAIC02MTQsNyArNjI1LDcgQEAKICAgIGl0ZXJhdG9ycyBmb3IgdGhvc2UgaXRlcmF0aW9uIHR5cGVzLiAgKEFuIGV4YW1wbGUgb2YgYW4gb2JqZWN0IHN1cHBvcnRpbmcKICAgIG11bHRpcGxlIGZvcm1zIG9mIGl0ZXJhdGlvbiB3b3VsZCBiZSBhIHRyZWUgc3RydWN0dXJlIHdoaWNoIHN1cHBvcnRzIGJvdGgKICAgIGJyZWFkdGgtZmlyc3QgYW5kIGRlcHRoLWZpcnN0IHRyYXZlcnNhbC4pICBUaGlzIG1ldGhvZCBjb3JyZXNwb25kcyB0byB0aGUKLSAgIDphdHRyOmB0cF9pdGVyYCBzbG90IG9mIHRoZSB0eXBlIHN0cnVjdHVyZSBmb3IgUHl0aG9uIG9iamVjdHMgaW4gdGhlIFB5dGhvbi9DCisgICA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfaXRlcmAgc2xvdCBvZiB0aGUgdHlwZSBzdHJ1Y3R1cmUgZm9yIFB5dGhvbiBvYmplY3RzIGluIHRoZSBQeXRob24vQwogICAgQVBJLgogCiBUaGUgaXRlcmF0b3Igb2JqZWN0cyB0aGVtc2VsdmVzIGFyZSByZXF1aXJlZCB0byBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgdHdvCkBAIC02MjUsNyArNjM2LDcgQEAKIAogICAgUmV0dXJuIHRoZSBpdGVyYXRvciBvYmplY3QgaXRzZWxmLiAgVGhpcyBpcyByZXF1aXJlZCB0byBhbGxvdyBib3RoIGNvbnRhaW5lcnMKICAgIGFuZCBpdGVyYXRvcnMgdG8gYmUgdXNlZCB3aXRoIHRoZSA6a2V5d29yZDpgZm9yYCBhbmQgOmtleXdvcmQ6YGluYCBzdGF0ZW1lbnRzLgotICAgVGhpcyBtZXRob2QgY29ycmVzcG9uZHMgdG8gdGhlIDphdHRyOmB0cF9pdGVyYCBzbG90IG9mIHRoZSB0eXBlIHN0cnVjdHVyZSBmb3IKKyAgIFRoaXMgbWV0aG9kIGNvcnJlc3BvbmRzIHRvIHRoZSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfaXRlcmAgc2xvdCBvZiB0aGUgdHlwZSBzdHJ1Y3R1cmUgZm9yCiAgICBQeXRob24gb2JqZWN0cyBpbiB0aGUgUHl0aG9uL0MgQVBJLgogCiAKQEAgLTYzMyw3ICs2NDQsNyBAQAogCiAgICBSZXR1cm4gdGhlIG5leHQgaXRlbSBmcm9tIHRoZSBjb250YWluZXIuICBJZiB0aGVyZSBhcmUgbm8gZnVydGhlciBpdGVtcywgcmFpc2UKICAgIHRoZSA6ZXhjOmBTdG9wSXRlcmF0aW9uYCBleGNlcHRpb24uICBUaGlzIG1ldGhvZCBjb3JyZXNwb25kcyB0byB0aGUKLSAgIDphdHRyOmB0cF9pdGVybmV4dGAgc2xvdCBvZiB0aGUgdHlwZSBzdHJ1Y3R1cmUgZm9yIFB5dGhvbiBvYmplY3RzIGluIHRoZQorICAgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2l0ZXJuZXh0YCBzbG90IG9mIHRoZSB0eXBlIHN0cnVjdHVyZSBmb3IgUHl0aG9uIG9iamVjdHMgaW4gdGhlCiAgICBQeXRob24vQyBBUEkuCiAKIFB5dGhvbiBkZWZpbmVzIHNldmVyYWwgaXRlcmF0b3Igb2JqZWN0cyB0byBzdXBwb3J0IGl0ZXJhdGlvbiBvdmVyIGdlbmVyYWwgYW5kCkBAIC03MzAsNyArNzQxLDcgQEAKIHwgYGBzICogbiwgbiAqIHNgYCB8ICpuKiBzaGFsbG93IGNvcGllcyBvZiAqcyogICAgICB8IFwoMikgICAgIHwKIHwgICAgICAgICAgICAgICAgICB8IGNvbmNhdGVuYXRlZCAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwKICstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKLXwgYGBzW2ldYGAgICAgICAgICB8ICppKid0aCBpdGVtIG9mICpzKiwgb3JpZ2luIDAgICB8IFwoMykgICAgIHwKK3wgYGBzW2ldYGAgICAgICAgICB8ICppKlwgdGggaXRlbSBvZiAqcyosIG9yaWdpbiAwICB8IFwoMykgICAgIHwKICstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKIHwgYGBzW2k6al1gYCAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogICB8ICgzKSg0KSAgIHwKICstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKQEAgLTc0MywxMSArNzU0LDExIEBACiArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCiB8IGBgbWF4KHMpYGAgICAgICAgfCBsYXJnZXN0IGl0ZW0gb2YgKnMqICAgICAgICAgICAgfCAgICAgICAgICB8CiArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCi18IGBgcy5pbmRleChpKWBgICAgfCBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJlbmNlICAgfCAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgfCBvZiAqaSogaW4gKnMqICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8Cit8IGBgcy5pbmRleCh4KWBgICAgfCBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSAgfCAgICAgICAgICB8Cit8ICAgICAgICAgICAgICAgICAgfCBvZiAqeCogaW4gKnMqICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8CiArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCi18IGBgcy5jb3VudChpKWBgICAgfCB0b3RhbCBudW1iZXIgb2Ygb2NjdXJlbmNlcyBvZiAgfCAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgfCAqaSogaW4gKnMqICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8Cit8IGBgcy5jb3VudCh4KWBgICAgfCB0b3RhbCBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgfCAgICAgICAgICB8Cit8ICAgICAgICAgICAgICAgICAgfCAqeCogaW4gKnMqICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8CiArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCiAKIFNlcXVlbmNlIHR5cGVzIGFsc28gc3VwcG9ydCBjb21wYXJpc29ucy4gSW4gcGFydGljdWxhciwgdHVwbGVzIGFuZCBsaXN0cwpAQCAtOTMxLDEwICs5NDIsMjIgQEAKIC4uIG1ldGhvZDo6IHN0ci5leHBhbmR0YWJzKFt0YWJzaXplXSkKIAogICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdoZXJlIGFsbCB0YWIgY2hhcmFjdGVycyBhcmUgcmVwbGFjZWQgYnkgb25lIG9yCi0gICBtb3JlIHNwYWNlcywgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGNvbHVtbiBhbmQgdGhlIGdpdmVuIHRhYiBzaXplLiAgVGhlCi0gICBjb2x1bW4gbnVtYmVyIGlzIHJlc2V0IHRvIHplcm8gYWZ0ZXIgZWFjaCBuZXdsaW5lIG9jY3VycmluZyBpbiB0aGUgc3RyaW5nLgotICAgSWYgKnRhYnNpemUqIGlzIG5vdCBnaXZlbiwgYSB0YWIgc2l6ZSBvZiBgYDhgYCBjaGFyYWN0ZXJzIGlzIGFzc3VtZWQuICBUaGlzCi0gICBkb2Vzbid0IHVuZGVyc3RhbmQgb3RoZXIgbm9uLXByaW50aW5nIGNoYXJhY3RlcnMgb3IgZXNjYXBlIHNlcXVlbmNlcy4KKyAgIG1vcmUgc3BhY2VzLCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgY29sdW1uIGFuZCB0aGUgZ2l2ZW4gdGFiIHNpemUuICBUYWIKKyAgIHBvc2l0aW9ucyBvY2N1ciBldmVyeSAqdGFic2l6ZSogY2hhcmFjdGVycyAoZGVmYXVsdCBpcyA4LCBnaXZpbmcgdGFiCisgICBwb3NpdGlvbnMgYXQgY29sdW1ucyAwLCA4LCAxNiBhbmQgc28gb24pLiAgVG8gZXhwYW5kIHRoZSBzdHJpbmcsIHRoZSBjdXJyZW50CisgICBjb2x1bW4gaXMgc2V0IHRvIHplcm8gYW5kIHRoZSBzdHJpbmcgaXMgZXhhbWluZWQgY2hhcmFjdGVyIGJ5IGNoYXJhY3Rlci4gIElmCisgICB0aGUgY2hhcmFjdGVyIGlzIGEgdGFiIChgYFx0YGApLCBvbmUgb3IgbW9yZSBzcGFjZSBjaGFyYWN0ZXJzIGFyZSBpbnNlcnRlZAorICAgaW4gdGhlIHJlc3VsdCB1bnRpbCB0aGUgY3VycmVudCBjb2x1bW4gaXMgZXF1YWwgdG8gdGhlIG5leHQgdGFiIHBvc2l0aW9uLgorICAgKFRoZSB0YWIgY2hhcmFjdGVyIGl0c2VsZiBpcyBub3QgY29waWVkLikgIElmIHRoZSBjaGFyYWN0ZXIgaXMgYSBuZXdsaW5lCisgICAoYGBcbmBgKSBvciByZXR1cm4gKGBgXHJgYCksIGl0IGlzIGNvcGllZCBhbmQgdGhlIGN1cnJlbnQgY29sdW1uIGlzIHJlc2V0IHRvCisgICB6ZXJvLiAgQW55IG90aGVyIGNoYXJhY3RlciBpcyBjb3BpZWQgdW5jaGFuZ2VkIGFuZCB0aGUgY3VycmVudCBjb2x1bW4gaXMKKyAgIGluY3JlbWVudGVkIGJ5IG9uZSByZWdhcmRsZXNzIG9mIGhvdyB0aGUgY2hhcmFjdGVyIGlzIHJlcHJlc2VudGVkIHdoZW4KKyAgIHByaW50ZWQuCisKKyAgICAgID4+PiAnMDFcdDAxMlx0MDEyM1x0MDEyMzQnLmV4cGFuZHRhYnMoKQorICAgICAgJzAxICAgICAgMDEyICAgICAwMTIzICAgIDAxMjM0JworICAgICAgPj4+ICcwMVx0MDEyXHQwMTIzXHQwMTIzNCcuZXhwYW5kdGFicyg0KQorICAgICAgJzAxICAwMTIgMDEyMyAgICAwMTIzNCcKIAogCiAuLiBtZXRob2Q6OiBzdHIuZmluZChzdWJbLCBzdGFydFssIGVuZF1dKQpAQCAtOTY5LDcgKzk5Miw3IEBACiAgICBTZWUgOnJlZjpgZm9ybWF0c3RyaW5nc2AgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHZhcmlvdXMgZm9ybWF0dGluZyBvcHRpb25zCiAgICB0aGF0IGNhbiBiZSBzcGVjaWZpZWQgaW4gZm9ybWF0IHN0cmluZ3MuCiAKLSAgIFRoaXMgbWV0aG9kIG9mIHN0cmluZyBmb3JtYXR0aW5nIGlzIHRoZSBuZXcgc3RhbmRhcmQgaW4gUHl0aG9uIDMuMCwgYW5kCisgICBUaGlzIG1ldGhvZCBvZiBzdHJpbmcgZm9ybWF0dGluZyBpcyB0aGUgbmV3IHN0YW5kYXJkIGluIFB5dGhvbiAzLCBhbmQKICAgIHNob3VsZCBiZSBwcmVmZXJyZWQgdG8gdGhlIGBgJWBgIGZvcm1hdHRpbmcgZGVzY3JpYmVkIGluCiAgICA6cmVmOmBzdHJpbmctZm9ybWF0dGluZ2AgaW4gbmV3IGNvZGUuCiAKQEAgLTEwNDksNyArMTA3Miw3IEBACiAKICAgIFJldHVybiB0aGUgc3RyaW5nIGxlZnQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCAqd2lkdGgqLiBQYWRkaW5nIGlzIGRvbmUKICAgIHVzaW5nIHRoZSBzcGVjaWZpZWQgKmZpbGxjaGFyKiAoZGVmYXVsdCBpcyBhIHNwYWNlKS4gIFRoZSBvcmlnaW5hbCBzdHJpbmcgaXMKLSAgIHJldHVybmVkIGlmICp3aWR0aCogaXMgbGVzcyB0aGFuIGBgbGVuKHMpYGAuCisgICByZXR1cm5lZCBpZiAqd2lkdGgqIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgYGxlbihzKWBgLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNAogICAgICAgU3VwcG9ydCBmb3IgdGhlICpmaWxsY2hhciogYXJndW1lbnQuCkBAIC0xMTEzLDcgKzExMzYsNyBAQAogCiAgICBSZXR1cm4gdGhlIHN0cmluZyByaWdodCBqdXN0aWZpZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoICp3aWR0aCouIFBhZGRpbmcgaXMgZG9uZQogICAgdXNpbmcgdGhlIHNwZWNpZmllZCAqZmlsbGNoYXIqIChkZWZhdWx0IGlzIGEgc3BhY2UpLiBUaGUgb3JpZ2luYWwgc3RyaW5nIGlzCi0gICByZXR1cm5lZCBpZiAqd2lkdGgqIGlzIGxlc3MgdGhhbiBgYGxlbihzKWBgLgorICAgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYGBsZW4ocylgYC4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjQKICAgICAgIFN1cHBvcnQgZm9yIHRoZSAqZmlsbGNoYXIqIGFyZ3VtZW50LgpAQCAtMTE2MSw4ICsxMTg0LDggQEAKICAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcsIHVzaW5nICpzZXAqIGFzIHRoZSBkZWxpbWl0ZXIKICAgIHN0cmluZy4gIElmICptYXhzcGxpdCogaXMgZ2l2ZW4sIGF0IG1vc3QgKm1heHNwbGl0KiBzcGxpdHMgYXJlIGRvbmUgKHRodXMsCiAgICB0aGUgbGlzdCB3aWxsIGhhdmUgYXQgbW9zdCBgYG1heHNwbGl0KzFgYCBlbGVtZW50cykuICBJZiAqbWF4c3BsaXQqIGlzIG5vdAotICAgc3BlY2lmaWVkLCB0aGVuIHRoZXJlIGlzIG5vIGxpbWl0IG9uIHRoZSBudW1iZXIgb2Ygc3BsaXRzIChhbGwgcG9zc2libGUKLSAgIHNwbGl0cyBhcmUgbWFkZSkuCisgICBzcGVjaWZpZWQgb3IgYGAtMWBgLCB0aGVuIHRoZXJlIGlzIG5vIGxpbWl0IG9uIHRoZSBudW1iZXIgb2Ygc3BsaXRzCisgICAoYWxsIHBvc3NpYmxlIHNwbGl0cyBhcmUgbWFkZSkuCiAKICAgIElmICpzZXAqIGlzIGdpdmVuLCBjb25zZWN1dGl2ZSBkZWxpbWl0ZXJzIGFyZSBub3QgZ3JvdXBlZCB0b2dldGhlciBhbmQgYXJlCiAgICBkZWVtZWQgdG8gZGVsaW1pdCBlbXB0eSBzdHJpbmdzIChmb3IgZXhhbXBsZSwgYGAnMSwsMicuc3BsaXQoJywnKWBgIHJldHVybnMKQEAgLTExODEsMTEgKzEyMDQsMjMgQEAKICAgIGBgJyAgMSAgMiAgIDMgICcuc3BsaXQoTm9uZSwgMSlgYCByZXR1cm5zIGBgWycxJywgJzIgICAzICAnXWBgLgogCiAKKy4uIGluZGV4OjoKKyAgIHNpbmdsZTogdW5pdmVyc2FsIG5ld2xpbmVzOyBzdHIuc3BsaXRsaW5lcyBtZXRob2QKKwogLi4gbWV0aG9kOjogc3RyLnNwbGl0bGluZXMoW2tlZXBlbmRzXSkKIAotICAgUmV0dXJuIGEgbGlzdCBvZiB0aGUgbGluZXMgaW4gdGhlIHN0cmluZywgYnJlYWtpbmcgYXQgbGluZSBib3VuZGFyaWVzLiAgTGluZQotICAgYnJlYWtzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBsaXN0IHVubGVzcyAqa2VlcGVuZHMqIGlzIGdpdmVuIGFuZAotICAgdHJ1ZS4KKyAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIGxpbmVzIGluIHRoZSBzdHJpbmcsIGJyZWFraW5nIGF0IGxpbmUgYm91bmRhcmllcy4KKyAgIFRoaXMgbWV0aG9kIHVzZXMgdGhlIDp0ZXJtOmB1bml2ZXJzYWwgbmV3bGluZXNgIGFwcHJvYWNoIHRvIHNwbGl0dGluZyBsaW5lcy4KKyAgIExpbmUgYnJlYWtzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBsaXN0IHVubGVzcyAqa2VlcGVuZHMqIGlzCisgICBnaXZlbiBhbmQgdHJ1ZS4KKworICAgRm9yIGV4YW1wbGUsIGBgJ2FiIGNcblxuZGUgZmdccmtsXHJcbicuc3BsaXRsaW5lcygpYGAgcmV0dXJucworICAgYGBbJ2FiIGMnLCAnJywgJ2RlIGZnJywgJ2tsJ11gYCwgd2hpbGUgdGhlIHNhbWUgY2FsbCB3aXRoIGBgc3BsaXRsaW5lcyhUcnVlKWBgCisgICByZXR1cm5zIGBgWydhYiBjXG4nLCAnXG4nLCAnZGUgZmdccicsICdrbFxyXG4nXWBgLgorCisgICBVbmxpa2UgOm1ldGg6YH5zdHIuc3BsaXRgIHdoZW4gYSBkZWxpbWl0ZXIgc3RyaW5nICpzZXAqIGlzIGdpdmVuLCB0aGlzCisgICBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBsaXN0IGZvciB0aGUgZW1wdHkgc3RyaW5nLCBhbmQgYSB0ZXJtaW5hbCBsaW5lCisgICBicmVhayBkb2VzIG5vdCByZXN1bHQgaW4gYW4gZXh0cmEgbGluZS4KIAogCiAuLiBtZXRob2Q6OiBzdHIuc3RhcnRzd2l0aChwcmVmaXhbLCBzdGFydFssIGVuZF1dKQpAQCAtMTI0MSwxMSArMTI3NiwxMSBAQAogCiAgICAgICAgID4+PiBpbXBvcnQgcmUKICAgICAgICAgPj4+IGRlZiB0aXRsZWNhc2Uocyk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlLnN1YihyIltBLVphLXpdKygnW0EtWmEtel0rKT8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIG1vOiBtby5ncm91cCgwKVswXS51cHBlcigpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8uZ3JvdXAoMClbMTpdLmxvd2VyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzKQotCisgICAgICAgIC4uLiAgICAgcmV0dXJuIHJlLnN1YihyIltBLVphLXpdKygnW0EtWmEtel0rKT8iLAorICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgbGFtYmRhIG1vOiBtby5ncm91cCgwKVswXS51cHBlcigpICsKKyAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8uZ3JvdXAoMClbMTpdLmxvd2VyKCksCisgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICBzKQorICAgICAgICAuLi4KICAgICAgICAgPj4+IHRpdGxlY2FzZSgidGhleSdyZSBiaWxsJ3MgZnJpZW5kcy4iKQogICAgICAgICAiVGhleSdyZSBCaWxsJ3MgRnJpZW5kcy4iCiAKQEAgLTEyOTMsNyArMTMyOCw3IEBACiAKICAgIFJldHVybiB0aGUgbnVtZXJpYyBzdHJpbmcgbGVmdCBmaWxsZWQgd2l0aCB6ZXJvcyBpbiBhIHN0cmluZyBvZiBsZW5ndGgKICAgICp3aWR0aCouICBBIHNpZ24gcHJlZml4IGlzIGhhbmRsZWQgY29ycmVjdGx5LiAgVGhlIG9yaWdpbmFsIHN0cmluZyBpcwotICAgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW4gYGBsZW4ocylgYC4KKyAgIHJldHVybmVkIGlmICp3aWR0aCogaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBgbGVuKHMpYGAuCiAKIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4yLjIKQEAgLTEzMzUsNyArMTM3MCw3IEBACiAqaW50ZXJwb2xhdGlvbiogb3BlcmF0b3IuICBHaXZlbiBgYGZvcm1hdCAlIHZhbHVlc2BgICh3aGVyZSAqZm9ybWF0KiBpcyBhIHN0cmluZwogb3IgVW5pY29kZSBvYmplY3QpLCBgYCVgYCBjb252ZXJzaW9uIHNwZWNpZmljYXRpb25zIGluICpmb3JtYXQqIGFyZSByZXBsYWNlZAogd2l0aCB6ZXJvIG9yIG1vcmUgZWxlbWVudHMgb2YgKnZhbHVlcyouICBUaGUgZWZmZWN0IGlzIHNpbWlsYXIgdG8gdGhlIHVzaW5nCi06Y2Z1bmM6YHNwcmludGZgIGluIHRoZSBDIGxhbmd1YWdlLiAgSWYgKmZvcm1hdCogaXMgYSBVbmljb2RlIG9iamVjdCwgb3IgaWYgYW55Cis6YzpmdW5jOmBzcHJpbnRmYCBpbiB0aGUgQyBsYW5ndWFnZS4gIElmICpmb3JtYXQqIGlzIGEgVW5pY29kZSBvYmplY3QsIG9yIGlmIGFueQogb2YgdGhlIG9iamVjdHMgYmVpbmcgY29udmVydGVkIHVzaW5nIHRoZSBgYCVzYGAgY29udmVyc2lvbiBhcmUgVW5pY29kZSBvYmplY3RzLAogdGhlIHJlc3VsdCB3aWxsIGFsc28gYmUgYSBVbmljb2RlIG9iamVjdC4KIApAQCAtMTQ0MCw3ICsxNDc1LDcgQEAKIHwgICAgICAgICAgICB8IGNoYXJhY3RlciBzdHJpbmcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKIHwgYGAncidgYCAgICB8IFN0cmluZyAoY29udmVydHMgYW55IFB5dGhvbiBvYmplY3QgdXNpbmcgICAgICAgICAgICB8IFwoNSkgIHwKLXwgICAgICAgICAgICB8IDpmdW5jOmByZXByYCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKK3wgICAgICAgICAgICB8IDpyZWY6YHJlcHIoKSA8ZnVuYy1yZXByPmApLiAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKIHwgYGAncydgYCAgICB8IFN0cmluZyAoY29udmVydHMgYW55IFB5dGhvbiBvYmplY3QgdXNpbmcgICAgICAgICAgICB8IFwoNikgIHwKIHwgICAgICAgICAgICB8IDpmdW5jOmBzdHJgKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKQEAgLTE2MzMsOSArMTY2OCw4IEBACiAgICAgICBQcmV2aW91c2x5LCBhbGwgbmVnYXRpdmUgaW5kaWNlcyB3ZXJlIHRydW5jYXRlZCB0byB6ZXJvLgogCiAoNikKLSAgIFRoZSA6bWV0aDpgcG9wYCBtZXRob2QgaXMgb25seSBzdXBwb3J0ZWQgYnkgdGhlIGxpc3QgYW5kIGFycmF5IHR5cGVzLiAgVGhlCi0gICBvcHRpb25hbCBhcmd1bWVudCAqaSogZGVmYXVsdHMgdG8gYGAtMWBgLCBzbyB0aGF0IGJ5IGRlZmF1bHQgdGhlIGxhc3QgaXRlbSBpcwotICAgcmVtb3ZlZCBhbmQgcmV0dXJuZWQuCisgICBUaGUgOm1ldGg6YHBvcGAgbWV0aG9kJ3Mgb3B0aW9uYWwgYXJndW1lbnQgKmkqIGRlZmF1bHRzIHRvIGBgLTFgYCwgc28gdGhhdAorICAgYnkgZGVmYXVsdCB0aGUgbGFzdCBpdGVtIGlzIHJlbW92ZWQgYW5kIHJldHVybmVkLgogCiAoNykKICAgIFRoZSA6bWV0aDpgc29ydGAgYW5kIDptZXRoOmByZXZlcnNlYCBtZXRob2RzIG1vZGlmeSB0aGUgbGlzdCBpbiBwbGFjZSBmb3IKQEAgLTE3MTAsMTEgKzE3NDQsMTEgQEAKIAogVGhlcmUgYXJlIGN1cnJlbnRseSB0d28gYnVpbHQtaW4gc2V0IHR5cGVzLCA6Y2xhc3M6YHNldGAgYW5kIDpjbGFzczpgZnJvemVuc2V0YC4KIFRoZSA6Y2xhc3M6YHNldGAgdHlwZSBpcyBtdXRhYmxlIC0tLSB0aGUgY29udGVudHMgY2FuIGJlIGNoYW5nZWQgdXNpbmcgbWV0aG9kcwotbGlrZSA6bWV0aDpgYWRkYCBhbmQgOm1ldGg6YHJlbW92ZWAuICBTaW5jZSBpdCBpcyBtdXRhYmxlLCBpdCBoYXMgbm8gaGFzaCB2YWx1ZQotYW5kIGNhbm5vdCBiZSB1c2VkIGFzIGVpdGhlciBhIGRpY3Rpb25hcnkga2V5IG9yIGFzIGFuIGVsZW1lbnQgb2YgYW5vdGhlciBzZXQuCi1UaGUgOmNsYXNzOmBmcm96ZW5zZXRgIHR5cGUgaXMgaW1tdXRhYmxlIGFuZCA6dGVybTpgaGFzaGFibGVgIC0tLSBpdHMgY29udGVudHMKLWNhbm5vdCBiZSBhbHRlcmVkIGFmdGVyIGl0IGlzIGNyZWF0ZWQ7IGl0IGNhbiB0aGVyZWZvcmUgYmUgdXNlZCBhcyBhIGRpY3Rpb25hcnkKLWtleSBvciBhcyBhbiBlbGVtZW50IG9mIGFub3RoZXIgc2V0LgorbGlrZSA6bWV0aDpgfnNldC5hZGRgIGFuZCA6bWV0aDpgfnNldC5yZW1vdmVgLiAgU2luY2UgaXQgaXMgbXV0YWJsZSwgaXQgaGFzIG5vCitoYXNoIHZhbHVlIGFuZCBjYW5ub3QgYmUgdXNlZCBhcyBlaXRoZXIgYSBkaWN0aW9uYXJ5IGtleSBvciBhcyBhbiBlbGVtZW50IG9mCithbm90aGVyIHNldC4gIFRoZSA6Y2xhc3M6YGZyb3plbnNldGAgdHlwZSBpcyBpbW11dGFibGUgYW5kIDp0ZXJtOmBoYXNoYWJsZWAgLS0tCitpdHMgY29udGVudHMgY2Fubm90IGJlIGFsdGVyZWQgYWZ0ZXIgaXQgaXMgY3JlYXRlZDsgaXQgY2FuIHRoZXJlZm9yZSBiZSB1c2VkIGFzCithIGRpY3Rpb25hcnkga2V5IG9yIGFzIGFuIGVsZW1lbnQgb2YgYW5vdGhlciBzZXQuCiAKIEFzIG9mIFB5dGhvbiAyLjcsIG5vbi1lbXB0eSBzZXRzIChub3QgZnJvemVuc2V0cykgY2FuIGJlIGNyZWF0ZWQgYnkgcGxhY2luZyBhCiBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBlbGVtZW50cyB3aXRoaW4gYnJhY2VzLCBmb3IgZXhhbXBsZTogYGB7J2phY2snLApAQCAtMTcyNiw5ICsxNzYwLDEwIEBACiAgICAgICAgICAgIGZyb3plbnNldChbaXRlcmFibGVdKQogCiAgICBSZXR1cm4gYSBuZXcgc2V0IG9yIGZyb3plbnNldCBvYmplY3Qgd2hvc2UgZWxlbWVudHMgYXJlIHRha2VuIGZyb20KLSAgICppdGVyYWJsZSouICBUaGUgZWxlbWVudHMgb2YgYSBzZXQgbXVzdCBiZSBoYXNoYWJsZS4gIFRvIHJlcHJlc2VudCBzZXRzIG9mCi0gICBzZXRzLCB0aGUgaW5uZXIgc2V0cyBtdXN0IGJlIDpjbGFzczpgZnJvemVuc2V0YCBvYmplY3RzLiAgSWYgKml0ZXJhYmxlKiBpcwotICAgbm90IHNwZWNpZmllZCwgYSBuZXcgZW1wdHkgc2V0IGlzIHJldHVybmVkLgorICAgKml0ZXJhYmxlKi4gIFRoZSBlbGVtZW50cyBvZiBhIHNldCBtdXN0IGJlIDp0ZXJtOmBoYXNoYWJsZWAuICBUbworICAgcmVwcmVzZW50IHNldHMgb2Ygc2V0cywgdGhlIGlubmVyIHNldHMgbXVzdCBiZSA6Y2xhc3M6YGZyb3plbnNldGAKKyAgIG9iamVjdHMuICBJZiAqaXRlcmFibGUqIGlzIG5vdCBzcGVjaWZpZWQsIGEgbmV3IGVtcHR5IHNldCBpcworICAgcmV0dXJuZWQuCiAKICAgIEluc3RhbmNlcyBvZiA6Y2xhc3M6YHNldGAgYW5kIDpjbGFzczpgZnJvemVuc2V0YCBwcm92aWRlIHRoZSBmb2xsb3dpbmcKICAgIG9wZXJhdGlvbnM6CkBAIC0xNzQ3LDcgKzE3ODIsNyBAQAogCiAgICAuLiBtZXRob2Q6OiBpc2Rpc2pvaW50KG90aGVyKQogCi0gICAgICBSZXR1cm4gVHJ1ZSBpZiB0aGUgc2V0IGhhcyBubyBlbGVtZW50cyBpbiBjb21tb24gd2l0aCAqb3RoZXIqLiAgU2V0cyBhcmUKKyAgICAgIFJldHVybiBgYFRydWVgYCBpZiB0aGUgc2V0IGhhcyBubyBlbGVtZW50cyBpbiBjb21tb24gd2l0aCAqb3RoZXIqLiAgU2V0cyBhcmUKICAgICAgIGRpc2pvaW50IGlmIGFuZCBvbmx5IGlmIHRoZWlyIGludGVyc2VjdGlvbiBpcyB0aGUgZW1wdHkgc2V0LgogCiAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjYKQEAgLTE3NTksNyArMTc5NCw3IEBACiAKICAgIC4uIG1ldGhvZDo6IHNldCA8IG90aGVyCiAKLSAgICAgIFRlc3Qgd2hldGhlciB0aGUgc2V0IGlzIGEgdHJ1ZSBzdWJzZXQgb2YgKm90aGVyKiwgdGhhdCBpcywKKyAgICAgIFRlc3Qgd2hldGhlciB0aGUgc2V0IGlzIGEgcHJvcGVyIHN1YnNldCBvZiAqb3RoZXIqLCB0aGF0IGlzLAogICAgICAgYGBzZXQgPD0gb3RoZXIgYW5kIHNldCAhPSBvdGhlcmBgLgogCiAgICAuLiBtZXRob2Q6OiBpc3N1cGVyc2V0KG90aGVyKQpAQCAtMTc2OSw3ICsxODA0LDcgQEAKIAogICAgLi4gbWV0aG9kOjogc2V0ID4gb3RoZXIKIAotICAgICAgVGVzdCB3aGV0aGVyIHRoZSBzZXQgaXMgYSB0cnVlIHN1cGVyc2V0IG9mICpvdGhlciosIHRoYXQgaXMsIGBgc2V0ID49CisgICAgICBUZXN0IHdoZXRoZXIgdGhlIHNldCBpcyBhIHByb3BlciBzdXBlcnNldCBvZiAqb3RoZXIqLCB0aGF0IGlzLCBgYHNldCA+PQogICAgICAgb3RoZXIgYW5kIHNldCAhPSBvdGhlcmBgLgogCiAgICAuLiBtZXRob2Q6OiB1bmlvbihvdGhlciwgLi4uKQpAQCAtMTgyNCw4ICsxODU5LDggQEAKICAgIGJhc2VkIG9uIHRoZWlyIG1lbWJlcnMuICBGb3IgZXhhbXBsZSwgYGBzZXQoJ2FiYycpID09IGZyb3plbnNldCgnYWJjJylgYAogICAgcmV0dXJucyBgYFRydWVgYCBhbmQgc28gZG9lcyBgYHNldCgnYWJjJykgaW4gc2V0KFtmcm96ZW5zZXQoJ2FiYycpXSlgYC4KIAotICAgVGhlIHN1YnNldCBhbmQgZXF1YWxpdHkgY29tcGFyaXNvbnMgZG8gbm90IGdlbmVyYWxpemUgdG8gYSBjb21wbGV0ZSBvcmRlcmluZwotICAgZnVuY3Rpb24uICBGb3IgZXhhbXBsZSwgYW55IHR3byBkaXNqb2ludCBzZXRzIGFyZSBub3QgZXF1YWwgYW5kIGFyZSBub3QKKyAgIFRoZSBzdWJzZXQgYW5kIGVxdWFsaXR5IGNvbXBhcmlzb25zIGRvIG5vdCBnZW5lcmFsaXplIHRvIGEgdG90YWwgb3JkZXJpbmcKKyAgIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGUsIGFueSB0d28gbm9uLWVtcHR5IGRpc2pvaW50IHNldHMgYXJlIG5vdCBlcXVhbCBhbmQgYXJlIG5vdAogICAgc3Vic2V0cyBvZiBlYWNoIG90aGVyLCBzbyAqYWxsKiBvZiB0aGUgZm9sbG93aW5nIHJldHVybiBgYEZhbHNlYGA6IGBgYTxiYGAsCiAgICBgYGE9PWJgYCwgb3IgYGBhPmJgYC4gQWNjb3JkaW5nbHksIHNldHMgZG8gbm90IGltcGxlbWVudCB0aGUgOm1ldGg6YF9fY21wX19gCiAgICBtZXRob2QuCkBAIC0xOTI1LDcgKzE5NjAsNyBAQAogICAgc3RhdGVtZW50OiBkZWwKICAgIGJ1aWx0aW46IGxlbgogCi1BIDpkZm46YG1hcHBpbmdgIG9iamVjdCBtYXBzIDp0ZXJtOmBoYXNoYWJsZWAgdmFsdWVzIHRvIGFyYml0cmFyeSBvYmplY3RzLgorQSA6dGVybTpgbWFwcGluZ2Agb2JqZWN0IG1hcHMgOnRlcm06YGhhc2hhYmxlYCB2YWx1ZXMgdG8gYXJiaXRyYXJ5IG9iamVjdHMuCiBNYXBwaW5ncyBhcmUgbXV0YWJsZSBvYmplY3RzLiAgVGhlcmUgaXMgY3VycmVudGx5IG9ubHkgb25lIHN0YW5kYXJkIG1hcHBpbmcKIHR5cGUsIHRoZSA6ZGZuOmBkaWN0aW9uYXJ5YC4gIChGb3Igb3RoZXIgY29udGFpbmVycyBzZWUgdGhlIGJ1aWx0IGluCiA6Y2xhc3M6YGxpc3RgLCA6Y2xhc3M6YHNldGAsIGFuZCA6Y2xhc3M6YHR1cGxlYCBjbGFzc2VzLCBhbmQgdGhlCkBAIC0xOTQ0LDMyICsxOTc5LDQxIEBACiBwYWlycyB3aXRoaW4gYnJhY2VzLCBmb3IgZXhhbXBsZTogYGB7J2phY2snOiA0MDk4LCAnc2pvZXJkJzogNDEyN31gYCBvciBgYHs0MDk4OgogJ2phY2snLCA0MTI3OiAnc2pvZXJkJ31gYCwgb3IgYnkgdGhlIDpjbGFzczpgZGljdGAgY29uc3RydWN0b3IuCiAKLS4uIGNsYXNzOjogZGljdChbYXJnXSkKKy4uIGNsYXNzOjogZGljdCgqKmt3YXJnKQorICAgICAgICAgICBkaWN0KG1hcHBpbmcsICoqa3dhcmcpCisgICAgICAgICAgIGRpY3QoaXRlcmFibGUsICoqa3dhcmcpCiAKLSAgIFJldHVybiBhIG5ldyBkaWN0aW9uYXJ5IGluaXRpYWxpemVkIGZyb20gYW4gb3B0aW9uYWwgcG9zaXRpb25hbCBhcmd1bWVudCBvciBmcm9tCi0gICBhIHNldCBvZiBrZXl3b3JkIGFyZ3VtZW50cy4gSWYgbm8gYXJndW1lbnRzIGFyZSBnaXZlbiwgcmV0dXJuIGEgbmV3IGVtcHR5Ci0gICBkaWN0aW9uYXJ5LiBJZiB0aGUgcG9zaXRpb25hbCBhcmd1bWVudCAqYXJnKiBpcyBhIG1hcHBpbmcgb2JqZWN0LCByZXR1cm4gYQotICAgZGljdGlvbmFyeSBtYXBwaW5nIHRoZSBzYW1lIGtleXMgdG8gdGhlIHNhbWUgdmFsdWVzIGFzIGRvZXMgdGhlIG1hcHBpbmcgb2JqZWN0LgotICAgT3RoZXJ3aXNlIHRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50IG11c3QgYmUgYSBzZXF1ZW5jZSwgYSBjb250YWluZXIgdGhhdCBzdXBwb3J0cwotICAgaXRlcmF0aW9uLCBvciBhbiBpdGVyYXRvciBvYmplY3QuICBUaGUgZWxlbWVudHMgb2YgdGhlIGFyZ3VtZW50IG11c3QgZWFjaCBhbHNvCi0gICBiZSBvZiBvbmUgb2YgdGhvc2Uga2luZHMsIGFuZCBlYWNoIG11c3QgaW4gdHVybiBjb250YWluIGV4YWN0bHkgdHdvIG9iamVjdHMuCi0gICBUaGUgZmlyc3QgaXMgdXNlZCBhcyBhIGtleSBpbiB0aGUgbmV3IGRpY3Rpb25hcnksIGFuZCB0aGUgc2Vjb25kIGFzIHRoZSBrZXkncwotICAgdmFsdWUuICBJZiBhIGdpdmVuIGtleSBpcyBzZWVuIG1vcmUgdGhhbiBvbmNlLCB0aGUgbGFzdCB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggaXQKLSAgIGlzIHJldGFpbmVkIGluIHRoZSBuZXcgZGljdGlvbmFyeS4KKyAgIFJldHVybiBhIG5ldyBkaWN0aW9uYXJ5IGluaXRpYWxpemVkIGZyb20gYW4gb3B0aW9uYWwgcG9zaXRpb25hbCBhcmd1bWVudAorICAgYW5kIGEgcG9zc2libHkgZW1wdHkgc2V0IG9mIGtleXdvcmQgYXJndW1lbnRzLgogCi0gICBJZiBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIHRoZSBrZXl3b3JkcyB0aGVtc2VsdmVzIHdpdGggdGhlaXIgYXNzb2NpYXRlZAotICAgdmFsdWVzIGFyZSBhZGRlZCBhcyBpdGVtcyB0byB0aGUgZGljdGlvbmFyeS4gSWYgYSBrZXkgaXMgc3BlY2lmaWVkIGJvdGggaW4gdGhlCi0gICBwb3NpdGlvbmFsIGFyZ3VtZW50IGFuZCBhcyBhIGtleXdvcmQgYXJndW1lbnQsIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlCi0gICBrZXl3b3JkIGlzIHJldGFpbmVkIGluIHRoZSBkaWN0aW9uYXJ5LiBGb3IgZXhhbXBsZSwgdGhlc2UgYWxsIHJldHVybiBhCi0gICBkaWN0aW9uYXJ5IGVxdWFsIHRvIGBgeyJvbmUiOiAxLCAidHdvIjogMn1gYDoKKyAgIElmIG5vIHBvc2l0aW9uYWwgYXJndW1lbnQgaXMgZ2l2ZW4sIGFuIGVtcHR5IGRpY3Rpb25hcnkgaXMgY3JlYXRlZC4KKyAgIElmIGEgcG9zaXRpb25hbCBhcmd1bWVudCBpcyBnaXZlbiBhbmQgaXQgaXMgYSBtYXBwaW5nIG9iamVjdCwgYSBkaWN0aW9uYXJ5CisgICBpcyBjcmVhdGVkIHdpdGggdGhlIHNhbWUga2V5LXZhbHVlIHBhaXJzIGFzIHRoZSBtYXBwaW5nIG9iamVjdC4gIE90aGVyd2lzZSwKKyAgIHRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50IG11c3QgYmUgYW4gOnRlcm06YGl0ZXJhYmxlYCBvYmplY3QuICBFYWNoIGl0ZW0gaW4KKyAgIHRoZSBpdGVyYWJsZSBtdXN0IGl0c2VsZiBiZSBhbiBpdGVyYWJsZSB3aXRoIGV4YWN0bHkgdHdvIG9iamVjdHMuICBUaGUKKyAgIGZpcnN0IG9iamVjdCBvZiBlYWNoIGl0ZW0gYmVjb21lcyBhIGtleSBpbiB0aGUgbmV3IGRpY3Rpb25hcnksIGFuZCB0aGUKKyAgIHNlY29uZCBvYmplY3QgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUuICBJZiBhIGtleSBvY2N1cnMgbW9yZSB0aGFuIG9uY2UsIHRoZQorICAgbGFzdCB2YWx1ZSBmb3IgdGhhdCBrZXkgYmVjb21lcyB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpbiB0aGUgbmV3CisgICBkaWN0aW9uYXJ5LgogCi0gICAqIGBgZGljdChvbmU9MSwgdHdvPTIpYGAKLSAgICogYGBkaWN0KHsnb25lJzogMSwgJ3R3byc6IDJ9KWBgCi0gICAqIGBgZGljdCh6aXAoKCdvbmUnLCAndHdvJyksICgxLCAyKSkpYGAKLSAgICogYGBkaWN0KFtbJ3R3bycsIDJdLCBbJ29uZScsIDFdXSlgYAorICAgSWYga2V5d29yZCBhcmd1bWVudHMgYXJlIGdpdmVuLCB0aGUga2V5d29yZCBhcmd1bWVudHMgYW5kIHRoZWlyIHZhbHVlcyBhcmUKKyAgIGFkZGVkIHRvIHRoZSBkaWN0aW9uYXJ5IGNyZWF0ZWQgZnJvbSB0aGUgcG9zaXRpb25hbCBhcmd1bWVudC4gIElmIGEga2V5CisgICBiZWluZyBhZGRlZCBpcyBhbHJlYWR5IHByZXNlbnQsIHRoZSB2YWx1ZSBmcm9tIHRoZSBrZXl3b3JkIGFyZ3VtZW50CisgICByZXBsYWNlcyB0aGUgdmFsdWUgZnJvbSB0aGUgcG9zaXRpb25hbCBhcmd1bWVudC4KIAotICAgVGhlIGZpcnN0IGV4YW1wbGUgb25seSB3b3JrcyBmb3Iga2V5cyB0aGF0IGFyZSB2YWxpZCBQeXRob24KLSAgIGlkZW50aWZpZXJzOyB0aGUgb3RoZXJzIHdvcmsgd2l0aCBhbnkgdmFsaWQga2V5cy4KKyAgIFRvIGlsbHVzdHJhdGUsIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgYWxsIHJldHVybiBhIGRpY3Rpb25hcnkgZXF1YWwgdG8KKyAgIGBgeyJvbmUiOiAxLCAidHdvIjogMiwgInRocmVlIjogM31gYDo6CisKKyAgICAgID4+PiBhID0gZGljdChvbmU9MSwgdHdvPTIsIHRocmVlPTMpCisgICAgICA+Pj4gYiA9IHsnb25lJzogMSwgJ3R3byc6IDIsICd0aHJlZSc6IDN9CisgICAgICA+Pj4gYyA9IGRpY3QoemlwKFsnb25lJywgJ3R3bycsICd0aHJlZSddLCBbMSwgMiwgM10pKQorICAgICAgPj4+IGQgPSBkaWN0KFsoJ3R3bycsIDIpLCAoJ29uZScsIDEpLCAoJ3RocmVlJywgMyldKQorICAgICAgPj4+IGUgPSBkaWN0KHsndGhyZWUnOiAzLCAnb25lJzogMSwgJ3R3byc6IDJ9KQorICAgICAgPj4+IGEgPT0gYiA9PSBjID09IGQgPT0gZQorICAgICAgVHJ1ZQorCisgICBQcm92aWRpbmcga2V5d29yZCBhcmd1bWVudHMgYXMgaW4gdGhlIGZpcnN0IGV4YW1wbGUgb25seSB3b3JrcyBmb3Iga2V5cyB0aGF0CisgICBhcmUgdmFsaWQgUHl0aG9uIGlkZW50aWZpZXJzLiAgT3RoZXJ3aXNlLCBhbnkgdmFsaWQga2V5cyBjYW4gYmUgdXNlZC4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4yCiAKQEAgLTIzMDksNyArMjM1Myw3IEBACiAKICAgICAgIHdpdGggb3BlbigiaGVsbG8udHh0IikgYXMgZjoKICAgICAgICAgICBmb3IgbGluZSBpbiBmOgotICAgICAgICAgICAgICBwcmludCBsaW5lCisgICAgICAgICAgICAgIHByaW50IGxpbmUsCiAKICAgIEluIG9sZGVyIHZlcnNpb25zIG9mIFB5dGhvbiwgeW91IHdvdWxkIGhhdmUgbmVlZGVkIHRvIGRvIHRoaXMgdG8gZ2V0IHRoZSBzYW1lCiAgICBlZmZlY3Q6OgpAQCAtMjMxNyw3ICsyMzYxLDcgQEAKICAgICAgIGYgPSBvcGVuKCJoZWxsby50eHQiKQogICAgICAgdHJ5OgogICAgICAgICAgIGZvciBsaW5lIGluIGY6Ci0gICAgICAgICAgICAgIHByaW50IGxpbmUKKyAgICAgICAgICAgICAgcHJpbnQgbGluZSwKICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgZi5jbG9zZSgpCiAKQEAgLTIzMzEsNyArMjM3NSw3IEBACiAKIC4uIG1ldGhvZDo6IGZpbGUuZmx1c2goKQogCi0gICBGbHVzaCB0aGUgaW50ZXJuYWwgYnVmZmVyLCBsaWtlIGBgc3RkaW9gYCdzIDpjZnVuYzpgZmZsdXNoYC4gIFRoaXMgbWF5IGJlIGEKKyAgIEZsdXNoIHRoZSBpbnRlcm5hbCBidWZmZXIsIGxpa2UgYGBzdGRpb2BgJ3MgOmM6ZnVuYzpgZmZsdXNoYC4gIFRoaXMgbWF5IGJlIGEKICAgIG5vLW9wIG9uIHNvbWUgZmlsZS1saWtlIG9iamVjdHMuCiAKICAgIC4uIG5vdGU6OgpAQCAtMjM3MSwxNCArMjQxNSwxNCBAQAogCiAgICBBIGZpbGUgb2JqZWN0IGlzIGl0cyBvd24gaXRlcmF0b3IsIGZvciBleGFtcGxlIGBgaXRlcihmKWBgIHJldHVybnMgKmYqICh1bmxlc3MKICAgICpmKiBpcyBjbG9zZWQpLiAgV2hlbiBhIGZpbGUgaXMgdXNlZCBhcyBhbiBpdGVyYXRvciwgdHlwaWNhbGx5IGluIGEKLSAgIDprZXl3b3JkOmBmb3JgIGxvb3AgKGZvciBleGFtcGxlLCBgYGZvciBsaW5lIGluIGY6IHByaW50IGxpbmVgYCksIHRoZQotICAgOm1ldGg6YC5uZXh0YCBtZXRob2QgaXMgY2FsbGVkIHJlcGVhdGVkbHkuICBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBuZXh0IGlucHV0CisgICA6a2V5d29yZDpgZm9yYCBsb29wIChmb3IgZXhhbXBsZSwgYGBmb3IgbGluZSBpbiBmOiBwcmludCBsaW5lLnN0cmlwKClgYCksIHRoZQorICAgOm1ldGg6YH5maWxlLm5leHRgIG1ldGhvZCBpcyBjYWxsZWQgcmVwZWF0ZWRseS4gIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG5leHQgaW5wdXQKICAgIGxpbmUsIG9yIHJhaXNlcyA6ZXhjOmBTdG9wSXRlcmF0aW9uYCB3aGVuIEVPRiBpcyBoaXQgd2hlbiB0aGUgZmlsZSBpcyBvcGVuIGZvcgogICAgcmVhZGluZyAoYmVoYXZpb3IgaXMgdW5kZWZpbmVkIHdoZW4gdGhlIGZpbGUgaXMgb3BlbiBmb3Igd3JpdGluZykuICBJbiBvcmRlciB0bwogICAgbWFrZSBhIDprZXl3b3JkOmBmb3JgIGxvb3AgdGhlIG1vc3QgZWZmaWNpZW50IHdheSBvZiBsb29waW5nIG92ZXIgdGhlIGxpbmVzIG9mIGEKLSAgIGZpbGUgKGEgdmVyeSBjb21tb24gb3BlcmF0aW9uKSwgdGhlIDptZXRoOmBuZXh0YCBtZXRob2QgdXNlcyBhIGhpZGRlbiByZWFkLWFoZWFkCi0gICBidWZmZXIuICBBcyBhIGNvbnNlcXVlbmNlIG9mIHVzaW5nIGEgcmVhZC1haGVhZCBidWZmZXIsIGNvbWJpbmluZyA6bWV0aDpgLm5leHRgCi0gICB3aXRoIG90aGVyIGZpbGUgbWV0aG9kcyAobGlrZSA6bWV0aDpgcmVhZGxpbmVgKSBkb2VzIG5vdCB3b3JrIHJpZ2h0LiAgSG93ZXZlciwKKyAgIGZpbGUgKGEgdmVyeSBjb21tb24gb3BlcmF0aW9uKSwgdGhlIDptZXRoOmB+ZmlsZS5uZXh0YCBtZXRob2QgdXNlcyBhIGhpZGRlbiByZWFkLWFoZWFkCisgICBidWZmZXIuICBBcyBhIGNvbnNlcXVlbmNlIG9mIHVzaW5nIGEgcmVhZC1haGVhZCBidWZmZXIsIGNvbWJpbmluZyA6bWV0aDpgfmZpbGUubmV4dGAKKyAgIHdpdGggb3RoZXIgZmlsZSBtZXRob2RzIChsaWtlIDptZXRoOmB+ZmlsZS5yZWFkbGluZWApIGRvZXMgbm90IHdvcmsgcmlnaHQuICBIb3dldmVyLAogICAgdXNpbmcgOm1ldGg6YHNlZWtgIHRvIHJlcG9zaXRpb24gdGhlIGZpbGUgdG8gYW4gYWJzb2x1dGUgcG9zaXRpb24gd2lsbCBmbHVzaCB0aGUKICAgIHJlYWQtYWhlYWQgYnVmZmVyLgogCkBAIC0yMzkyLDE0ICsyNDM2LDE0IEBACiAgICBhbGwgZGF0YSB1bnRpbCBFT0YgaXMgcmVhY2hlZC4gIFRoZSBieXRlcyBhcmUgcmV0dXJuZWQgYXMgYSBzdHJpbmcgb2JqZWN0LiAgQW4KICAgIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCB3aGVuIEVPRiBpcyBlbmNvdW50ZXJlZCBpbW1lZGlhdGVseS4gIChGb3IgY2VydGFpbgogICAgZmlsZXMsIGxpa2UgdHR5cywgaXQgbWFrZXMgc2Vuc2UgdG8gY29udGludWUgcmVhZGluZyBhZnRlciBhbiBFT0YgaXMgaGl0LikgIE5vdGUKLSAgIHRoYXQgdGhpcyBtZXRob2QgbWF5IGNhbGwgdGhlIHVuZGVybHlpbmcgQyBmdW5jdGlvbiA6Y2Z1bmM6YGZyZWFkYCBtb3JlIHRoYW4KKyAgIHRoYXQgdGhpcyBtZXRob2QgbWF5IGNhbGwgdGhlIHVuZGVybHlpbmcgQyBmdW5jdGlvbiA6YzpmdW5jOmBmcmVhZGAgbW9yZSB0aGFuCiAgICBvbmNlIGluIGFuIGVmZm9ydCB0byBhY3F1aXJlIGFzIGNsb3NlIHRvICpzaXplKiBieXRlcyBhcyBwb3NzaWJsZS4gQWxzbyBub3RlCiAgICB0aGF0IHdoZW4gaW4gbm9uLWJsb2NraW5nIG1vZGUsIGxlc3MgZGF0YSB0aGFuIHdhcyByZXF1ZXN0ZWQgbWF5IGJlCiAgICByZXR1cm5lZCwgZXZlbiBpZiBubyAqc2l6ZSogcGFyYW1ldGVyIHdhcyBnaXZlbi4KIAogICAgLi4gbm90ZTo6CiAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHNpbXBseSBhIHdyYXBwZXIgZm9yIHRoZSB1bmRlcmx5aW5nCi0gICAgICA6Y2Z1bmM6YGZyZWFkYCBDIGZ1bmN0aW9uLCBhbmQgd2lsbCBiZWhhdmUgdGhlIHNhbWUgaW4gY29ybmVyIGNhc2VzLAorICAgICAgOmM6ZnVuYzpgZnJlYWRgIEMgZnVuY3Rpb24sIGFuZCB3aWxsIGJlaGF2ZSB0aGUgc2FtZSBpbiBjb3JuZXIgY2FzZXMsCiAgICAgICBzdWNoIGFzIHdoZXRoZXIgdGhlIEVPRiB2YWx1ZSBpcyBjYWNoZWQuCiAKIApAQCAtMjQxNCwxMyArMjQ1OCwxMyBAQAogCiAgICAuLiBub3RlOjoKIAotICAgICAgVW5saWtlIGBgc3RkaW9gYCdzIDpjZnVuYzpgZmdldHNgLCB0aGUgcmV0dXJuZWQgc3RyaW5nIGNvbnRhaW5zIG51bGwgY2hhcmFjdGVycworICAgICAgVW5saWtlIGBgc3RkaW9gYCdzIDpjOmZ1bmM6YGZnZXRzYCwgdGhlIHJldHVybmVkIHN0cmluZyBjb250YWlucyBudWxsIGNoYXJhY3RlcnMKICAgICAgIChgYCdcMCdgYCkgaWYgdGhleSBvY2N1cnJlZCBpbiB0aGUgaW5wdXQuCiAKIAogLi4gbWV0aG9kOjogZmlsZS5yZWFkbGluZXMoW3NpemVoaW50XSkKIAotICAgUmVhZCB1bnRpbCBFT0YgdXNpbmcgOm1ldGg6YHJlYWRsaW5lYCBhbmQgcmV0dXJuIGEgbGlzdCBjb250YWluaW5nIHRoZSBsaW5lcworICAgUmVhZCB1bnRpbCBFT0YgdXNpbmcgOm1ldGg6YH5maWxlLnJlYWRsaW5lYCBhbmQgcmV0dXJuIGEgbGlzdCBjb250YWluaW5nIHRoZSBsaW5lcwogICAgdGh1cyByZWFkLiAgSWYgdGhlIG9wdGlvbmFsICpzaXplaGludCogYXJndW1lbnQgaXMgcHJlc2VudCwgaW5zdGVhZCBvZgogICAgcmVhZGluZyB1cCB0byBFT0YsIHdob2xlIGxpbmVzIHRvdGFsbGluZyBhcHByb3hpbWF0ZWx5ICpzaXplaGludCogYnl0ZXMKICAgIChwb3NzaWJseSBhZnRlciByb3VuZGluZyB1cCB0byBhbiBpbnRlcm5hbCBidWZmZXIgc2l6ZSkgYXJlIHJlYWQuICBPYmplY3RzCkBAIC0yNDQwLDcgKzI0ODQsNyBAQAogCiAuLiBtZXRob2Q6OiBmaWxlLnNlZWsob2Zmc2V0Wywgd2hlbmNlXSkKIAotICAgU2V0IHRoZSBmaWxlJ3MgY3VycmVudCBwb3NpdGlvbiwgbGlrZSBgYHN0ZGlvYGAncyA6Y2Z1bmM6YGZzZWVrYC4gVGhlICp3aGVuY2UqCisgICBTZXQgdGhlIGZpbGUncyBjdXJyZW50IHBvc2l0aW9uLCBsaWtlIGBgc3RkaW9gYCdzIDpjOmZ1bmM6YGZzZWVrYC4gVGhlICp3aGVuY2UqCiAgICBhcmd1bWVudCBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gIGBgb3MuU0VFS19TRVRgYCBvciBgYDBgYCAoYWJzb2x1dGUgZmlsZQogICAgcG9zaXRpb25pbmcpOyBvdGhlciB2YWx1ZXMgYXJlIGBgb3MuU0VFS19DVVJgYCBvciBgYDFgYCAoc2VlayByZWxhdGl2ZSB0byB0aGUKICAgIGN1cnJlbnQgcG9zaXRpb24pIGFuZCBgYG9zLlNFRUtfRU5EYGAgb3IgYGAyYGAgIChzZWVrIHJlbGF0aXZlIHRvIHRoZSBmaWxlJ3MKQEAgLTI0NjUsMTEgKzI1MDksMTEgQEAKIAogLi4gbWV0aG9kOjogZmlsZS50ZWxsKCkKIAotICAgUmV0dXJuIHRoZSBmaWxlJ3MgY3VycmVudCBwb3NpdGlvbiwgbGlrZSBgYHN0ZGlvYGAncyA6Y2Z1bmM6YGZ0ZWxsYC4KKyAgIFJldHVybiB0aGUgZmlsZSdzIGN1cnJlbnQgcG9zaXRpb24sIGxpa2UgYGBzdGRpb2BgJ3MgOmM6ZnVuYzpgZnRlbGxgLgogCiAgICAuLiBub3RlOjoKIAotICAgICAgT24gV2luZG93cywgOm1ldGg6YHRlbGxgIGNhbiByZXR1cm4gaWxsZWdhbCB2YWx1ZXMgKGFmdGVyIGFuIDpjZnVuYzpgZmdldHNgKQorICAgICAgT24gV2luZG93cywgOm1ldGg6YHRlbGxgIGNhbiByZXR1cm4gaWxsZWdhbCB2YWx1ZXMgKGFmdGVyIGFuIDpjOmZ1bmM6YGZnZXRzYCkKICAgICAgIHdoZW4gcmVhZGluZyBmaWxlcyB3aXRoIFVuaXgtc3R5bGUgbGluZS1lbmRpbmdzLiBVc2UgYmluYXJ5IG1vZGUgKGBgJ3JiJ2BgKSB0bwogICAgICAgY2lyY3VtdmVudCB0aGlzIHByb2JsZW0uCiAKQEAgLTI1MDAsNyArMjU0NCw3IEBACiAgICBhZGQgbGluZSBzZXBhcmF0b3JzLikKIAogRmlsZXMgc3VwcG9ydCB0aGUgaXRlcmF0b3IgcHJvdG9jb2wuICBFYWNoIGl0ZXJhdGlvbiByZXR1cm5zIHRoZSBzYW1lIHJlc3VsdCBhcwotYGBmaWxlLnJlYWRsaW5lKClgYCwgYW5kIGl0ZXJhdGlvbiBlbmRzIHdoZW4gdGhlIDptZXRoOmByZWFkbGluZWAgbWV0aG9kIHJldHVybnMKKzptZXRoOmB+ZmlsZS5yZWFkbGluZWAsIGFuZCBpdGVyYXRpb24gZW5kcyB3aGVuIHRoZSA6bWV0aDpgfmZpbGUucmVhZGxpbmVgIG1ldGhvZCByZXR1cm5zCiBhbiBlbXB0eSBzdHJpbmcuCiAKIEZpbGUgb2JqZWN0cyBhbHNvIG9mZmVyIGEgbnVtYmVyIG9mIG90aGVyIGludGVyZXN0aW5nIGF0dHJpYnV0ZXMuIFRoZXNlIGFyZSBub3QKQEAgLTI1NDksMTYgKzI1OTMsMTkgQEAKICAgIGZvcm0gYGA8Li4uPmBgLiAgVGhpcyBpcyBhIHJlYWQtb25seSBhdHRyaWJ1dGUgYW5kIG1heSBub3QgYmUgcHJlc2VudCBvbiBhbGwKICAgIGZpbGUtbGlrZSBvYmplY3RzLgogCisgICAuLiBpbmRleDo6CisgICAgICBzaW5nbGU6IHVuaXZlcnNhbCBuZXdsaW5lczsgZmlsZS5uZXdsaW5lcyBhdHRyaWJ1dGUKKwogCiAuLiBhdHRyaWJ1dGU6OiBmaWxlLm5ld2xpbmVzCiAKLSAgIElmIFB5dGhvbiB3YXMgYnVpbHQgd2l0aCB1bml2ZXJzYWwgbmV3bGluZXMgZW5hYmxlZCAodGhlIGRlZmF1bHQpIHRoaXMKKyAgIElmIFB5dGhvbiB3YXMgYnVpbHQgd2l0aCA6dGVybTpgdW5pdmVyc2FsIG5ld2xpbmVzYCBlbmFibGVkICh0aGUgZGVmYXVsdCkgdGhpcwogICAgcmVhZC1vbmx5IGF0dHJpYnV0ZSBleGlzdHMsIGFuZCBmb3IgZmlsZXMgb3BlbmVkIGluIHVuaXZlcnNhbCBuZXdsaW5lIHJlYWQKICAgIG1vZGUgaXQga2VlcHMgdHJhY2sgb2YgdGhlIHR5cGVzIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHdoaWxlIHJlYWRpbmcgdGhlCiAgICBmaWxlLiBUaGUgdmFsdWVzIGl0IGNhbiB0YWtlIGFyZSBgYCdccidgYCwgYGAnXG4nYGAsIGBgJ1xyXG4nYGAsIGBgTm9uZWBgCiAgICAodW5rbm93biwgbm8gbmV3bGluZXMgcmVhZCB5ZXQpIG9yIGEgdHVwbGUgY29udGFpbmluZyBhbGwgdGhlIG5ld2xpbmUgdHlwZXMKICAgIHNlZW4sIHRvIGluZGljYXRlIHRoYXQgbXVsdGlwbGUgbmV3bGluZSBjb252ZW50aW9ucyB3ZXJlIGVuY291bnRlcmVkLiBGb3IKLSAgIGZpbGVzIG5vdCBvcGVuZWQgaW4gdW5pdmVyc2FsIG5ld2xpbmUgcmVhZCBtb2RlIHRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZQorICAgZmlsZXMgbm90IG9wZW5lZCBpbiB1bml2ZXJzYWwgbmV3bGluZXMgcmVhZCBtb2RlIHRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZQogICAgd2lsbCBiZSBgYE5vbmVgYC4KIAogCkBAIC0yNzkxLDEyICsyODM4LDEyIEBACiBmb29gYCBkb2VzIG5vdCByZXF1aXJlIGEgbW9kdWxlIG9iamVjdCBuYW1lZCAqZm9vKiB0byBleGlzdCwgcmF0aGVyIGl0IHJlcXVpcmVzCiBhbiAoZXh0ZXJuYWwpICpkZWZpbml0aW9uKiBmb3IgYSBtb2R1bGUgbmFtZWQgKmZvbyogc29tZXdoZXJlLikKIAotQSBzcGVjaWFsIGF0dHJpYnV0ZSBvZiBldmVyeSBtb2R1bGUgaXMgOmF0dHI6YF9fZGljdF9fYC4gVGhpcyBpcyB0aGUgZGljdGlvbmFyeQotY29udGFpbmluZyB0aGUgbW9kdWxlJ3Mgc3ltYm9sIHRhYmxlLiBNb2RpZnlpbmcgdGhpcyBkaWN0aW9uYXJ5IHdpbGwgYWN0dWFsbHkKLWNoYW5nZSB0aGUgbW9kdWxlJ3Mgc3ltYm9sIHRhYmxlLCBidXQgZGlyZWN0IGFzc2lnbm1lbnQgdG8gdGhlIDphdHRyOmBfX2RpY3RfX2AKLWF0dHJpYnV0ZSBpcyBub3QgcG9zc2libGUgKHlvdSBjYW4gd3JpdGUgYGBtLl9fZGljdF9fWydhJ10gPSAxYGAsIHdoaWNoIGRlZmluZXMKLWBgbS5hYGAgdG8gYmUgYGAxYGAsIGJ1dCB5b3UgY2FuJ3Qgd3JpdGUgYGBtLl9fZGljdF9fID0ge31gYCkuICBNb2RpZnlpbmcKLTphdHRyOmBfX2RpY3RfX2AgZGlyZWN0bHkgaXMgbm90IHJlY29tbWVuZGVkLgorQSBzcGVjaWFsIGF0dHJpYnV0ZSBvZiBldmVyeSBtb2R1bGUgaXMgOmF0dHI6YH5vYmplY3QuX19kaWN0X19gLiBUaGlzIGlzIHRoZQorZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBtb2R1bGUncyBzeW1ib2wgdGFibGUuIE1vZGlmeWluZyB0aGlzIGRpY3Rpb25hcnkgd2lsbAorYWN0dWFsbHkgY2hhbmdlIHRoZSBtb2R1bGUncyBzeW1ib2wgdGFibGUsIGJ1dCBkaXJlY3QgYXNzaWdubWVudCB0byB0aGUKKzphdHRyOmBfX2RpY3RfX2AgYXR0cmlidXRlIGlzIG5vdCBwb3NzaWJsZSAoeW91IGNhbiB3cml0ZQorYGBtLl9fZGljdF9fWydhJ10gPSAxYGAsIHdoaWNoIGRlZmluZXMgYGBtLmFgYCB0byBiZSBgYDFgYCwgYnV0IHlvdSBjYW4ndCB3cml0ZQorYGBtLl9fZGljdF9fID0ge31gYCkuICBNb2RpZnlpbmcgOmF0dHI6YF9fZGljdF9fYCBkaXJlY3RseSBpcyBub3QgcmVjb21tZW5kZWQuCiAKIE1vZHVsZXMgYnVpbHQgaW50byB0aGUgaW50ZXJwcmV0ZXIgYXJlIHdyaXR0ZW4gbGlrZSB0aGlzOiBgYDxtb2R1bGUgJ3N5cycKIChidWlsdC1pbik+YGAuICBJZiBsb2FkZWQgZnJvbSBhIGZpbGUsIHRoZXkgYXJlIHdyaXR0ZW4gYXMgYGA8bW9kdWxlICdvcycgZnJvbQpAQCAtMjg1NCwxNiArMjkwMSwyMyBAQAogTGlrZSBmdW5jdGlvbiBvYmplY3RzLCBtZXRob2RzIG9iamVjdHMgc3VwcG9ydCBnZXR0aW5nIGFyYml0cmFyeSBhdHRyaWJ1dGVzLgogSG93ZXZlciwgc2luY2UgbWV0aG9kIGF0dHJpYnV0ZXMgYXJlIGFjdHVhbGx5IHN0b3JlZCBvbiB0aGUgdW5kZXJseWluZyBmdW5jdGlvbgogb2JqZWN0IChgYG1ldGguaW1fZnVuY2BgKSwgc2V0dGluZyBtZXRob2QgYXR0cmlidXRlcyBvbiBlaXRoZXIgYm91bmQgb3IgdW5ib3VuZAotbWV0aG9kcyBpcyBkaXNhbGxvd2VkLiAgQXR0ZW1wdGluZyB0byBzZXQgYSBtZXRob2QgYXR0cmlidXRlIHJlc3VsdHMgaW4gYQotOmV4YzpgVHlwZUVycm9yYCBiZWluZyByYWlzZWQuICBJbiBvcmRlciB0byBzZXQgYSBtZXRob2QgYXR0cmlidXRlLCB5b3UgbmVlZCB0bwotZXhwbGljaXRseSBzZXQgaXQgb24gdGhlIHVuZGVybHlpbmcgZnVuY3Rpb24gb2JqZWN0OjoKK21ldGhvZHMgaXMgZGlzYWxsb3dlZC4gIEF0dGVtcHRpbmcgdG8gc2V0IGFuIGF0dHJpYnV0ZSBvbiBhIG1ldGhvZCByZXN1bHRzIGluCithbiA6ZXhjOmBBdHRyaWJ1dGVFcnJvcmAgYmVpbmcgcmFpc2VkLiAgSW4gb3JkZXIgdG8gc2V0IGEgbWV0aG9kIGF0dHJpYnV0ZSwgeW91CituZWVkIHRvIGV4cGxpY2l0bHkgc2V0IGl0IG9uIHRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uIG9iamVjdDo6CiAKLSAgIGNsYXNzIEM6Ci0gICAgICAgZGVmIG1ldGhvZChzZWxmKToKLSAgICAgICAgICAgcGFzcworICAgPj4+IGNsYXNzIEM6CisgICAuLi4gICAgIGRlZiBtZXRob2Qoc2VsZik6CisgICAuLi4gICAgICAgICBwYXNzCisgICAuLi4KKyAgID4+PiBjID0gQygpCisgICA+Pj4gYy5tZXRob2Qud2hvYW1pID0gJ215IG5hbWUgaXMgbWV0aG9kJyAgIyBjYW4ndCBzZXQgb24gdGhlIG1ldGhvZAorICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA8bW9kdWxlPgorICAgQXR0cmlidXRlRXJyb3I6ICdpbnN0YW5jZW1ldGhvZCcgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ3dob2FtaScKKyAgID4+PiBjLm1ldGhvZC5pbV9mdW5jLndob2FtaSA9ICdteSBuYW1lIGlzIG1ldGhvZCcKKyAgID4+PiBjLm1ldGhvZC53aG9hbWkKKyAgICdteSBuYW1lIGlzIG1ldGhvZCcKIAotICAgYyA9IEMoKQotICAgYy5tZXRob2QuaW1fZnVuYy53aG9hbWkgPSAnbXkgbmFtZSBpcyBjJwogCiBTZWUgOnJlZjpgdHlwZXNgIGZvciBtb3JlIGluZm9ybWF0aW9uLgogCkBAIC0zMDMzLDcgKzMwODcsNyBAQAogCiAgICBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIG1ldGFjbGFzcyB0byBjdXN0b21pemUgdGhlIG1ldGhvZAogICAgcmVzb2x1dGlvbiBvcmRlciBmb3IgaXRzIGluc3RhbmNlcy4gIEl0IGlzIGNhbGxlZCBhdCBjbGFzcyBpbnN0YW50aWF0aW9uLCBhbmQKLSAgIGl0cyByZXN1bHQgaXMgc3RvcmVkIGluIDphdHRyOmBfX21yb19fYC4KKyAgIGl0cyByZXN1bHQgaXMgc3RvcmVkIGluIDphdHRyOmB+Y2xhc3MuX19tcm9fX2AuCiAKIAogLi4gbWV0aG9kOjogY2xhc3MuX19zdWJjbGFzc2VzX18KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3N0cmluZy5yc3QgYi9Eb2MvbGlicmFyeS9zdHJpbmcucnN0CmluZGV4IDY3NTQ3YWQuLmIwZmZiNmEgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3N0cmluZy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc3RyaW5nLnJzdApAQCAtMTIzLDggKzEyMyw4IEBACiAKICAgIC4uIG1ldGhvZDo6IGZvcm1hdChmb3JtYXRfc3RyaW5nLCAqYXJncywgKiprd2FyZ3MpCiAKLSAgICAgIDptZXRoOmBmb3JtYXRgIGlzIHRoZSBwcmltYXJ5IEFQSSBtZXRob2QuICBJdCB0YWtlcyBhIGZvcm1hdCB0ZW1wbGF0ZQotICAgICAgc3RyaW5nLCBhbmQgYW4gYXJiaXRyYXJ5IHNldCBvZiBwb3NpdGlvbmFsIGFuZCBrZXl3b3JkIGFyZ3VtZW50LgorICAgICAgOm1ldGg6YGZvcm1hdGAgaXMgdGhlIHByaW1hcnkgQVBJIG1ldGhvZC4gIEl0IHRha2VzIGEgZm9ybWF0IHN0cmluZyBhbmQKKyAgICAgIGFuIGFyYml0cmFyeSBzZXQgb2YgcG9zaXRpb25hbCBhbmQga2V5d29yZCBhcmd1bWVudHMuCiAgICAgICA6bWV0aDpgZm9ybWF0YCBpcyBqdXN0IGEgd3JhcHBlciB0aGF0IGNhbGxzIDptZXRoOmB2Zm9ybWF0YC4KIAogICAgLi4gbWV0aG9kOjogdmZvcm1hdChmb3JtYXRfc3RyaW5nLCBhcmdzLCBrd2FyZ3MpCkBAIC0xMzIsOSArMTMyLDkgQEAKICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgYWN0dWFsIHdvcmsgb2YgZm9ybWF0dGluZy4gIEl0IGlzIGV4cG9zZWQgYXMgYQogICAgICAgc2VwYXJhdGUgZnVuY3Rpb24gZm9yIGNhc2VzIHdoZXJlIHlvdSB3YW50IHRvIHBhc3MgaW4gYSBwcmVkZWZpbmVkCiAgICAgICBkaWN0aW9uYXJ5IG9mIGFyZ3VtZW50cywgcmF0aGVyIHRoYW4gdW5wYWNraW5nIGFuZCByZXBhY2tpbmcgdGhlCi0gICAgICBkaWN0aW9uYXJ5IGFzIGluZGl2aWR1YWwgYXJndW1lbnRzIHVzaW5nIHRoZSBgYCphcmdzYGAgYW5kIGBgKiprd2RzYGAKLSAgICAgIHN5bnRheC4gIDptZXRoOmB2Zm9ybWF0YCBkb2VzIHRoZSB3b3JrIG9mIGJyZWFraW5nIHVwIHRoZSBmb3JtYXQgdGVtcGxhdGUKLSAgICAgIHN0cmluZyBpbnRvIGNoYXJhY3RlciBkYXRhIGFuZCByZXBsYWNlbWVudCBmaWVsZHMuICBJdCBjYWxscyB0aGUgdmFyaW91cworICAgICAgZGljdGlvbmFyeSBhcyBpbmRpdmlkdWFsIGFyZ3VtZW50cyB1c2luZyB0aGUgYGAqYXJnc2BgIGFuZCBgYCoqa3dhcmdzYGAKKyAgICAgIHN5bnRheC4gIDptZXRoOmB2Zm9ybWF0YCBkb2VzIHRoZSB3b3JrIG9mIGJyZWFraW5nIHVwIHRoZSBmb3JtYXQgc3RyaW5nCisgICAgICBpbnRvIGNoYXJhY3RlciBkYXRhIGFuZCByZXBsYWNlbWVudCBmaWVsZHMuICBJdCBjYWxscyB0aGUgdmFyaW91cwogICAgICAgbWV0aG9kcyBkZXNjcmliZWQgYmVsb3cuCiAKICAgIEluIGFkZGl0aW9uLCB0aGUgOmNsYXNzOmBGb3JtYXR0ZXJgIGRlZmluZXMgYSBudW1iZXIgb2YgbWV0aG9kcyB0aGF0IGFyZQpAQCAtMjA1LDcgKzIwNSw4IEBACiAKICAgICAgIENvbnZlcnRzIHRoZSB2YWx1ZSAocmV0dXJuZWQgYnkgOm1ldGg6YGdldF9maWVsZGApIGdpdmVuIGEgY29udmVyc2lvbiB0eXBlCiAgICAgICAoYXMgaW4gdGhlIHR1cGxlIHJldHVybmVkIGJ5IHRoZSA6bWV0aDpgcGFyc2VgIG1ldGhvZCkuICBUaGUgZGVmYXVsdAotICAgICAgdmVyc2lvbiB1bmRlcnN0YW5kcyAncicgKHJlcHIpIGFuZCAncycgKHN0cikgY29udmVyc2lvbiB0eXBlcy4KKyAgICAgIHZlcnNpb24gdW5kZXJzdGFuZHMgJ3MnIChzdHIpLCAncicgKHJlcHIpIGFuZCAnYScgKGFzY2lpKSBjb252ZXJzaW9uCisgICAgICB0eXBlcy4KIAogCiAuLiBfZm9ybWF0c3RyaW5nczoKQEAgLTMyMiwxOCArMzIzLDE4IEBACiAKIC4uIHByb2R1Y3Rpb25saXN0Ojogc2YKICAgIGZvcm1hdF9zcGVjOiBbW2BmaWxsYF1gYWxpZ25gXVtgc2lnbmBdWyNdWzBdW2B3aWR0aGBdWyxdWy5gcHJlY2lzaW9uYF1bYHR5cGVgXQotICAgZmlsbDogPGEgY2hhcmFjdGVyIG90aGVyIHRoYW4gJ30nPgorICAgZmlsbDogPGFueSBjaGFyYWN0ZXI+CiAgICBhbGlnbjogIjwiIHwgIj4iIHwgIj0iIHwgIl4iCiAgICBzaWduOiAiKyIgfCAiLSIgfCAiICIKICAgIHdpZHRoOiBgaW50ZWdlcmAKICAgIHByZWNpc2lvbjogYGludGVnZXJgCiAgICB0eXBlOiAiYiIgfCAiYyIgfCAiZCIgfCAiZSIgfCAiRSIgfCAiZiIgfCAiRiIgfCAiZyIgfCAiRyIgfCAibiIgfCAibyIgfCAicyIgfCAieCIgfCAiWCIgfCAiJSIKIAotVGhlICpmaWxsKiBjaGFyYWN0ZXIgY2FuIGJlIGFueSBjaGFyYWN0ZXIgb3RoZXIgdGhhbiAneycgb3IgJ30nLiAgVGhlIHByZXNlbmNlCi1vZiBhIGZpbGwgY2hhcmFjdGVyIGlzIHNpZ25hbGVkIGJ5IHRoZSBjaGFyYWN0ZXIgZm9sbG93aW5nIGl0LCB3aGljaCBtdXN0IGJlCi1vbmUgb2YgdGhlIGFsaWdubWVudCBvcHRpb25zLiAgSWYgdGhlIHNlY29uZCBjaGFyYWN0ZXIgb2YgKmZvcm1hdF9zcGVjKiBpcyBub3QKLWEgdmFsaWQgYWxpZ25tZW50IG9wdGlvbiwgdGhlbiBpdCBpcyBhc3N1bWVkIHRoYXQgYm90aCB0aGUgZmlsbCBjaGFyYWN0ZXIgYW5kCi10aGUgYWxpZ25tZW50IG9wdGlvbiBhcmUgYWJzZW50LgorSWYgYSB2YWxpZCAqYWxpZ24qIHZhbHVlIGlzIHNwZWNpZmllZCwgaXQgY2FuIGJlIHByZWNlZGVkIGJ5IGEgKmZpbGwqCitjaGFyYWN0ZXIgdGhhdCBjYW4gYmUgYW55IGNoYXJhY3RlciBhbmQgZGVmYXVsdHMgdG8gYSBzcGFjZSBpZiBvbWl0dGVkLgorTm90ZSB0aGF0IGl0IGlzIG5vdCBwb3NzaWJsZSB0byB1c2UgYGB7YGAgYW5kIGBgfWBgIGFzICpmaWxsKiBjaGFyIHdoaWxlCit1c2luZyB0aGUgOm1ldGg6YHN0ci5mb3JtYXRgIG1ldGhvZDsgdGhpcyBsaW1pdGF0aW9uIGhvd2V2ZXIgZG9lc24ndAorYWZmZWN0IHRoZSA6ZnVuYzpgZm9ybWF0YCBmdW5jdGlvbi4KIAogVGhlIG1lYW5pbmcgb2YgdGhlIHZhcmlvdXMgYWxpZ25tZW50IG9wdGlvbnMgaXMgYXMgZm9sbG93czoKIApAQCAtMzg5LDkgKzM5MCw5IEBACiAqd2lkdGgqIGlzIGEgZGVjaW1hbCBpbnRlZ2VyIGRlZmluaW5nIHRoZSBtaW5pbXVtIGZpZWxkIHdpZHRoLiAgSWYgbm90CiBzcGVjaWZpZWQsIHRoZW4gdGhlIGZpZWxkIHdpZHRoIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgY29udGVudC4KIAotSWYgdGhlICp3aWR0aCogZmllbGQgaXMgcHJlY2VkZWQgYnkgYSB6ZXJvIChgYCcwJ2BgKSBjaGFyYWN0ZXIsIHRoaXMgZW5hYmxlcwotemVyby1wYWRkaW5nLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGFuICphbGlnbm1lbnQqIHR5cGUgb2YgYGAnPSdgYCBhbmQgYSAqZmlsbCoKLWNoYXJhY3RlciBvZiBgYCcwJ2BgLgorUHJlY2VkaW5nIHRoZSAqd2lkdGgqIGZpZWxkIGJ5IGEgemVybyAoYGAnMCdgYCkgY2hhcmFjdGVyIGVuYWJsZXMKK3NpZ24tYXdhcmUgemVyby1wYWRkaW5nIGZvciBudW1lcmljIHR5cGVzLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGEgKmZpbGwqCitjaGFyYWN0ZXIgb2YgYGAnMCdgYCB3aXRoIGFuICphbGlnbm1lbnQqIHR5cGUgb2YgYGAnPSdgYC4KIAogVGhlICpwcmVjaXNpb24qIGlzIGEgZGVjaW1hbCBudW1iZXIgaW5kaWNhdGluZyBob3cgbWFueSBkaWdpdHMgc2hvdWxkIGJlCiBkaXNwbGF5ZWQgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQgZm9yIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgZm9ybWF0dGVkIHdpdGgKQEAgLTQ1MiwxMiArNDUzLDEzIEBACiAgICArPT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCiAgICB8IGBgJ2UnYGAgfCBFeHBvbmVudCBub3RhdGlvbi4gUHJpbnRzIHRoZSBudW1iZXIgaW4gc2NpZW50aWZpYyAgICAgICB8CiAgICB8ICAgICAgICAgfCBub3RhdGlvbiB1c2luZyB0aGUgbGV0dGVyICdlJyB0byBpbmRpY2F0ZSB0aGUgZXhwb25lbnQuICB8CisgICB8ICAgICAgICAgfCBUaGUgZGVmYXVsdCBwcmVjaXNpb24gaXMgYGA2YGAuICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICArLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgICB8IGBgJ0UnYGAgfCBFeHBvbmVudCBub3RhdGlvbi4gU2FtZSBhcyBgYCdlJ2BgIGV4Y2VwdCBpdCB1c2VzIGFuICAgICB8CiAgICB8ICAgICAgICAgfCB1cHBlciBjYXNlICdFJyBhcyB0aGUgc2VwYXJhdG9yIGNoYXJhY3Rlci4gICAgICAgICAgICAgICB8CiAgICArLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgICB8IGBgJ2YnYGAgfCBGaXhlZCBwb2ludC4gRGlzcGxheXMgdGhlIG51bWJlciBhcyBhIGZpeGVkLXBvaW50ICAgICAgICB8Ci0gICB8ICAgICAgICAgfCBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICB8ICAgICAgICAgfCBudW1iZXIuICBUaGUgZGVmYXVsdCBwcmVjaXNpb24gaXMgYGA2YGAuICAgICAgICAgICAgICAgICB8CiAgICArLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgICB8IGBgJ0YnYGAgfCBGaXhlZCBwb2ludC4gU2FtZSBhcyBgYCdmJ2BgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICArLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCkBAIC00ODMsNyArNDg1LDcgQEAKICAgIHwgICAgICAgICB8IHRoZSBwcmVjaXNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgIHwgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgIHwgICAgICAgICB8IEEgcHJlY2lzaW9uIG9mIGBgMGBgIGlzIHRyZWF0ZWQgYXMgZXF1aXZhbGVudCB0byBhICAgICAgIHwKLSAgIHwgICAgICAgICB8IHByZWNpc2lvbiBvZiBgYDFgYC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgIHwgICAgICAgICB8IHByZWNpc2lvbiBvZiBgYDFgYC4gIFRoZSBkZWZhdWx0IHByZWNpc2lvbiBpcyBgYDZgYC4gICAgIHwKICAgICstLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgIHwgYGAnRydgYCB8IEdlbmVyYWwgZm9ybWF0LiBTYW1lIGFzIGBgJ2cnYGAgZXhjZXB0IHN3aXRjaGVzIHRvICAgICAgIHwKICAgIHwgICAgICAgICB8IGBgJ0UnYGAgaWYgdGhlIG51bWJlciBnZXRzIHRvbyBsYXJnZS4gVGhlICAgICAgICAgICAgICAgIHwKQEAgLTYwMiw3ICs2MDQsNyBAQAogCiAgICA+Pj4gcG9pbnRzID0gMTkuNQogICAgPj4+IHRvdGFsID0gMjIKLSAgID4+PiAnQ29ycmVjdCBhbnN3ZXJzOiB7Oi4yJX0uJy5mb3JtYXQocG9pbnRzL3RvdGFsKQorICAgPj4+ICdDb3JyZWN0IGFuc3dlcnM6IHs6LjIlfScuZm9ybWF0KHBvaW50cy90b3RhbCkKICAgICdDb3JyZWN0IGFuc3dlcnM6IDg4LjY0JScKIAogVXNpbmcgdHlwZS1zcGVjaWZpYyBmb3JtYXR0aW5nOjoKQEAgLTcwNiw3ICs3MDgsNyBAQAogICAgICAgVGhpcyBpcyB0aGUgb2JqZWN0IHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IncyAqdGVtcGxhdGUqIGFyZ3VtZW50LiAgSW4KICAgICAgIGdlbmVyYWwsIHlvdSBzaG91bGRuJ3QgY2hhbmdlIGl0LCBidXQgcmVhZC1vbmx5IGFjY2VzcyBpcyBub3QgZW5mb3JjZWQuCiAKLUhlcmUgaXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gdXNlIGEgVGVtcGxhdGU6CitIZXJlIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBhIFRlbXBsYXRlOjoKIAogICAgPj4+IGZyb20gc3RyaW5nIGltcG9ydCBUZW1wbGF0ZQogICAgPj4+IHMgPSBUZW1wbGF0ZSgnJHdobyBsaWtlcyAkd2hhdCcpCkBAIC03MTUsMTEgKzcxNywxMSBAQAogICAgPj4+IGQgPSBkaWN0KHdobz0ndGltJykKICAgID4+PiBUZW1wbGF0ZSgnR2l2ZSAkd2hvICQxMDAnKS5zdWJzdGl0dXRlKGQpCiAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gICBbLi4uXQotICAgVmFsdWVFcnJvcjogSW52YWxpZCBwbGFjZWhvbGRlciBpbiBzdHJpbmc6IGxpbmUgMSwgY29sIDEwCisgICAuLi4KKyAgIFZhbHVlRXJyb3I6IEludmFsaWQgcGxhY2Vob2xkZXIgaW4gc3RyaW5nOiBsaW5lIDEsIGNvbCAxMQogICAgPj4+IFRlbXBsYXRlKCckd2hvIGxpa2VzICR3aGF0Jykuc3Vic3RpdHV0ZShkKQogICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICAgWy4uLl0KKyAgIC4uLgogICAgS2V5RXJyb3I6ICd3aGF0JwogICAgPj4+IFRlbXBsYXRlKCckd2hvIGxpa2VzICR3aGF0Jykuc2FmZV9zdWJzdGl0dXRlKGQpCiAgICAndGltIGxpa2VzICR3aGF0JwpAQCAtNzkzLDcgKzc5NSw3IEBACiBUaGUgZm9sbG93aW5nIGxpc3Qgb2YgZnVuY3Rpb25zIGFyZSBhbHNvIGRlZmluZWQgYXMgbWV0aG9kcyBvZiBzdHJpbmcgYW5kCiBVbmljb2RlIG9iamVjdHM7IHNlZSBzZWN0aW9uIDpyZWY6YHN0cmluZy1tZXRob2RzYCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbgogdGhvc2UuICBZb3Ugc2hvdWxkIGNvbnNpZGVyIHRoZXNlIGZ1bmN0aW9ucyBhcyBkZXByZWNhdGVkLCBhbHRob3VnaCB0aGV5IHdpbGwKLW5vdCBiZSByZW1vdmVkIHVudGlsIFB5dGhvbiAzLjAuICBUaGUgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhpcyBtb2R1bGUgYXJlOgorbm90IGJlIHJlbW92ZWQgdW50aWwgUHl0aG9uIDMuICBUaGUgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhpcyBtb2R1bGUgYXJlOgogCiAKIC4uIGZ1bmN0aW9uOjogYXRvZihzKQpAQCAtOTA1LDE0ICs5MDcsMTUgQEAKIAogICAgUmV0dXJuIGEgbGlzdCBvZiB0aGUgd29yZHMgb2YgdGhlIHN0cmluZyAqcyouICBJZiB0aGUgb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50CiAgICAqc2VwKiBpcyBhYnNlbnQgb3IgYGBOb25lYGAsIHRoZSB3b3JkcyBhcmUgc2VwYXJhdGVkIGJ5IGFyYml0cmFyeSBzdHJpbmdzIG9mCi0gICB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgKHNwYWNlLCB0YWIsICBuZXdsaW5lLCByZXR1cm4sIGZvcm1mZWVkKS4gIElmIHRoZSBzZWNvbmQKKyAgIHdoaXRlc3BhY2UgY2hhcmFjdGVycyAoc3BhY2UsIHRhYiwgbmV3bGluZSwgcmV0dXJuLCBmb3JtZmVlZCkuICBJZiB0aGUgc2Vjb25kCiAgICBhcmd1bWVudCAqc2VwKiBpcyBwcmVzZW50IGFuZCBub3QgYGBOb25lYGAsIGl0IHNwZWNpZmllcyBhIHN0cmluZyB0byBiZSB1c2VkIGFzCiAgICB0aGUgIHdvcmQgc2VwYXJhdG9yLiAgVGhlIHJldHVybmVkIGxpc3Qgd2lsbCB0aGVuIGhhdmUgb25lIG1vcmUgaXRlbSB0aGFuIHRoZQotICAgbnVtYmVyIG9mIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiB0aGUgc2VwYXJhdG9yIGluIHRoZSBzdHJpbmcuICBUaGUKLSAgIG9wdGlvbmFsIHRoaXJkIGFyZ3VtZW50ICptYXhzcGxpdCogZGVmYXVsdHMgdG8gMC4gIElmIGl0IGlzIG5vbnplcm8sIGF0IG1vc3QKLSAgICptYXhzcGxpdCogbnVtYmVyIG9mIHNwbGl0cyBvY2N1ciwgYW5kIHRoZSByZW1haW5kZXIgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZAotICAgYXMgdGhlIGZpbmFsIGVsZW1lbnQgb2YgdGhlIGxpc3QgKHRodXMsIHRoZSBsaXN0IHdpbGwgaGF2ZSBhdCBtb3N0Ci0gICBgYG1heHNwbGl0KzFgYCBlbGVtZW50cykuCisgICBudW1iZXIgb2Ygbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2VzIG9mIHRoZSBzZXBhcmF0b3IgaW4gdGhlIHN0cmluZy4KKyAgIElmICptYXhzcGxpdCogaXMgZ2l2ZW4sIGF0IG1vc3QgKm1heHNwbGl0KiBudW1iZXIgb2Ygc3BsaXRzIG9jY3VyLCBhbmQgdGhlCisgICByZW1haW5kZXIgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZCBhcyB0aGUgZmluYWwgZWxlbWVudCBvZiB0aGUgbGlzdCAodGh1cywKKyAgIHRoZSBsaXN0IHdpbGwgaGF2ZSBhdCBtb3N0IGBgbWF4c3BsaXQrMWBgIGVsZW1lbnRzKS4gIElmICptYXhzcGxpdCogaXMgbm90CisgICBzcGVjaWZpZWQgb3IgYGAtMWBgLCB0aGVuIHRoZXJlIGlzIG5vIGxpbWl0IG9uIHRoZSBudW1iZXIgb2Ygc3BsaXRzIChhbGwKKyAgIHBvc3NpYmxlIHNwbGl0cyBhcmUgbWFkZSkuCiAKICAgIFRoZSBiZWhhdmlvciBvZiBzcGxpdCBvbiBhbiBlbXB0eSBzdHJpbmcgZGVwZW5kcyBvbiB0aGUgdmFsdWUgb2YgKnNlcCouIElmICpzZXAqCiAgICBpcyBub3Qgc3BlY2lmaWVkLCBvciBzcGVjaWZpZWQgYXMgYGBOb25lYGAsIHRoZSByZXN1bHQgd2lsbCBiZSBhbiBlbXB0eSBsaXN0LgpAQCAtOTI1LDcgKzkyOCw3IEBACiAgICBSZXR1cm4gYSBsaXN0IG9mIHRoZSB3b3JkcyBvZiB0aGUgc3RyaW5nICpzKiwgc2Nhbm5pbmcgKnMqIGZyb20gdGhlIGVuZC4gIFRvIGFsbAogICAgaW50ZW50cyBhbmQgcHVycG9zZXMsIHRoZSByZXN1bHRpbmcgbGlzdCBvZiB3b3JkcyBpcyB0aGUgc2FtZSBhcyByZXR1cm5lZCBieQogICAgOmZ1bmM6YHNwbGl0YCwgZXhjZXB0IHdoZW4gdGhlIG9wdGlvbmFsIHRoaXJkIGFyZ3VtZW50ICptYXhzcGxpdCogaXMgZXhwbGljaXRseQotICAgc3BlY2lmaWVkIGFuZCBub256ZXJvLiAgV2hlbiAqbWF4c3BsaXQqIGlzIG5vbnplcm8sIGF0IG1vc3QgKm1heHNwbGl0KiBudW1iZXIgb2YKKyAgIHNwZWNpZmllZCBhbmQgbm9uemVyby4gIElmICptYXhzcGxpdCogaXMgZ2l2ZW4sIGF0IG1vc3QgKm1heHNwbGl0KiBudW1iZXIgb2YKICAgIHNwbGl0cyAtLSB0aGUgKnJpZ2h0bW9zdCogb25lcyAtLSBvY2N1ciwgYW5kIHRoZSByZW1haW5kZXIgb2YgdGhlIHN0cmluZyBpcwogICAgcmV0dXJuZWQgYXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGxpc3QgKHRodXMsIHRoZSBsaXN0IHdpbGwgaGF2ZSBhdCBtb3N0CiAgICBgYG1heHNwbGl0KzFgYCBlbGVtZW50cykuCkBAIC0xMDIzLDEzICsxMDI2LDE0IEBACiAKIC4uIGZ1bmN0aW9uOjogemZpbGwocywgd2lkdGgpCiAKLSAgIFBhZCBhIG51bWVyaWMgc3RyaW5nIG9uIHRoZSBsZWZ0IHdpdGggemVybyBkaWdpdHMgdW50aWwgdGhlIGdpdmVuIHdpZHRoIGlzCi0gICByZWFjaGVkLiAgU3RyaW5ncyBzdGFydGluZyB3aXRoIGEgc2lnbiBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuCisgICBQYWQgYSBudW1lcmljIHN0cmluZyAqcyogb24gdGhlIGxlZnQgd2l0aCB6ZXJvIGRpZ2l0cyB1bnRpbCB0aGUKKyAgIGdpdmVuICp3aWR0aCogaXMgcmVhY2hlZC4gIFN0cmluZ3Mgc3RhcnRpbmcgd2l0aCBhIHNpZ24gYXJlIGhhbmRsZWQKKyAgIGNvcnJlY3RseS4KIAogCi0uLiBmdW5jdGlvbjo6IHJlcGxhY2Uoc3RyLCBvbGQsIG5ld1ssIG1heHJlcGxhY2VdKQorLi4gZnVuY3Rpb246OiByZXBsYWNlKHMsIG9sZCwgbmV3WywgbWF4cmVwbGFjZV0pCiAKLSAgIFJldHVybiBhIGNvcHkgb2Ygc3RyaW5nICpzdHIqIHdpdGggYWxsIG9jY3VycmVuY2VzIG9mIHN1YnN0cmluZyAqb2xkKiByZXBsYWNlZAorICAgUmV0dXJuIGEgY29weSBvZiBzdHJpbmcgKnMqIHdpdGggYWxsIG9jY3VycmVuY2VzIG9mIHN1YnN0cmluZyAqb2xkKiByZXBsYWNlZAogICAgYnkgKm5ldyouICBJZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgKm1heHJlcGxhY2UqIGlzIGdpdmVuLCB0aGUgZmlyc3QKICAgICptYXhyZXBsYWNlKiBvY2N1cnJlbmNlcyBhcmUgcmVwbGFjZWQuCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3N0cmluZ3ByZXAucnN0IGIvRG9jL2xpYnJhcnkvc3RyaW5ncHJlcC5yc3QKaW5kZXggZDJmMjY5Yy4uYjA5NDRlNCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc3RyaW5ncHJlcC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc3RyaW5ncHJlcC5yc3QKQEAgLTQsNyArNCw2IEBACiAKIC4uIG1vZHVsZTo6IHN0cmluZ3ByZXAKICAgIDpzeW5vcHNpczogU3RyaW5nIHByZXBhcmF0aW9uLCBhcyBwZXIgUkZDIDM0NTMKLSAgIDpkZXByZWNhdGVkOgogLi4gbW9kdWxlYXV0aG9yOjogTWFydGluIHYuIEzDtndpcyA8bWFydGluQHYubG9ld2lzLmRlPgogLi4gc2VjdGlvbmF1dGhvcjo6IE1hcnRpbiB2LiBMw7Z3aXMgPG1hcnRpbkB2LmxvZXdpcy5kZT4KIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc3RydWN0LnJzdCBiL0RvYy9saWJyYXJ5L3N0cnVjdC5yc3QKaW5kZXggODE3YzU3MC4uNzRlMzIwNiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc3RydWN0LnJzdAorKysgYi9Eb2MvbGlicmFyeS9zdHJ1Y3QucnN0CkBAIC0xNjIsNjAgKzE2Miw2MCBAQAogYGAnPSdgYC4gIFdoZW4gdXNpbmcgbmF0aXZlIHNpemUsIHRoZSBzaXplIG9mIHRoZSBwYWNrZWQgdmFsdWUgaXMKIHBsYXRmb3JtLWRlcGVuZGVudC4KIAotKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCi18IEZvcm1hdCB8IEMgVHlwZSAgICAgICAgICAgICAgICAgIHwgUHl0aG9uIHR5cGUgICAgICAgIHwgU3RhbmRhcmQgc2l6ZSAgfCBOb3RlcyAgICAgIHwKLSs9PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT0rPT09PT09PT09PT09KwotfCBgYHhgYCAgfCBwYWQgYnl0ZSAgICAgICAgICAgICAgICB8IG5vIHZhbHVlICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8Ci0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKLXwgYGBjYGAgIHwgOmN0eXBlOmBjaGFyYCAgICAgICAgICAgfCBzdHJpbmcgb2YgbGVuZ3RoIDEgfCAxICAgICAgICAgICAgICB8ICAgICAgICAgICAgfAotKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCi18IGBgYmBgICB8IDpjdHlwZTpgc2lnbmVkIGNoYXJgICAgIHwgaW50ZWdlciAgICAgICAgICAgIHwgMSAgICAgICAgICAgICAgfCBcKDMpICAgICAgIHwKLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwotfCBgYEJgYCAgfCA6Y3R5cGU6YHVuc2lnbmVkIGNoYXJgICB8IGludGVnZXIgICAgICAgICAgICB8IDEgICAgICAgICAgICAgIHwgXCgzKSAgICAgICB8Ci0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKLXwgYGA/YGAgIHwgOmN0eXBlOmBfQm9vbGAgICAgICAgICAgfCBib29sICAgICAgICAgICAgICAgfCAxICAgICAgICAgICAgICB8IFwoMSkgICAgICAgfAotKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCi18IGBgaGBgICB8IDpjdHlwZTpgc2hvcnRgICAgICAgICAgIHwgaW50ZWdlciAgICAgICAgICAgIHwgMiAgICAgICAgICAgICAgfCBcKDMpICAgICAgIHwKLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwotfCBgYEhgYCAgfCA6Y3R5cGU6YHVuc2lnbmVkIHNob3J0YCB8IGludGVnZXIgICAgICAgICAgICB8IDIgICAgICAgICAgICAgIHwgXCgzKSAgICAgICB8Ci0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKLXwgYGBpYGAgIHwgOmN0eXBlOmBpbnRgICAgICAgICAgICAgfCBpbnRlZ2VyICAgICAgICAgICAgfCA0ICAgICAgICAgICAgICB8IFwoMykgICAgICAgfAotKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCi18IGBgSWBgICB8IDpjdHlwZTpgdW5zaWduZWQgaW50YCAgIHwgaW50ZWdlciAgICAgICAgICAgIHwgNCAgICAgICAgICAgICAgfCBcKDMpICAgICAgIHwKLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwotfCBgYGxgYCAgfCA6Y3R5cGU6YGxvbmdgICAgICAgICAgICB8IGludGVnZXIgICAgICAgICAgICB8IDQgICAgICAgICAgICAgIHwgXCgzKSAgICAgICB8Ci0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKLXwgYGBMYGAgIHwgOmN0eXBlOmB1bnNpZ25lZCBsb25nYCAgfCBpbnRlZ2VyICAgICAgICAgICAgfCA0ICAgICAgICAgICAgICB8IFwoMykgICAgICAgfAotKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCi18IGBgcWBgICB8IDpjdHlwZTpgbG9uZyBsb25nYCAgICAgIHwgaW50ZWdlciAgICAgICAgICAgIHwgOCAgICAgICAgICAgICAgfCBcKDIpLCBcKDMpIHwKLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwotfCBgYFFgYCAgfCA6Y3R5cGU6YHVuc2lnbmVkIGxvbmcgICB8IGludGVnZXIgICAgICAgICAgICB8IDggICAgICAgICAgICAgIHwgXCgyKSwgXCgzKSB8Ci18ICAgICAgICB8IGxvbmdgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwKLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwotfCBgYGZgYCAgfCA6Y3R5cGU6YGZsb2F0YCAgICAgICAgICB8IGZsb2F0ICAgICAgICAgICAgICB8IDQgICAgICAgICAgICAgIHwgXCg0KSAgICAgICB8Ci0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKLXwgYGBkYGAgIHwgOmN0eXBlOmBkb3VibGVgICAgICAgICAgfCBmbG9hdCAgICAgICAgICAgICAgfCA4ICAgICAgICAgICAgICB8IFwoNCkgICAgICAgfAotKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCi18IGBgc2BgICB8IDpjdHlwZTpgY2hhcltdYCAgICAgICAgIHwgc3RyaW5nICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwKLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwotfCBgYHBgYCAgfCA6Y3R5cGU6YGNoYXJbXWAgICAgICAgICB8IHN0cmluZyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8Ci0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKLXwgYGBQYGAgIHwgOmN0eXBlOmB2b2lkIFwqYCAgICAgICAgfCBpbnRlZ2VyICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8IFwoNSksIFwoMykgfAotKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCisrLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCit8IEZvcm1hdCB8IEMgVHlwZSAgICAgICAgICAgICAgICAgICB8IFB5dGhvbiB0eXBlICAgICAgICB8IFN0YW5kYXJkIHNpemUgIHwgTm90ZXMgICAgICB8CisrPT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PSs9PT09PT09PT09PT0rCit8IGBgeGBgICB8IHBhZCBieXRlICAgICAgICAgICAgICAgICB8IG5vIHZhbHVlICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCit8IGBgY2BgICB8IDpjOnR5cGU6YGNoYXJgICAgICAgICAgICB8IHN0cmluZyBvZiBsZW5ndGggMSB8IDEgICAgICAgICAgICAgIHwgICAgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCit8IGBgYmBgICB8IDpjOnR5cGU6YHNpZ25lZCBjaGFyYCAgICB8IGludGVnZXIgICAgICAgICAgICB8IDEgICAgICAgICAgICAgIHwgXCgzKSAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCit8IGBgQmBgICB8IDpjOnR5cGU6YHVuc2lnbmVkIGNoYXJgICB8IGludGVnZXIgICAgICAgICAgICB8IDEgICAgICAgICAgICAgIHwgXCgzKSAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCit8IGBgP2BgICB8IDpjOnR5cGU6YF9Cb29sYCAgICAgICAgICB8IGJvb2wgICAgICAgICAgICAgICB8IDEgICAgICAgICAgICAgIHwgXCgxKSAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCit8IGBgaGBgICB8IDpjOnR5cGU6YHNob3J0YCAgICAgICAgICB8IGludGVnZXIgICAgICAgICAgICB8IDIgICAgICAgICAgICAgIHwgXCgzKSAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCit8IGBgSGBgICB8IDpjOnR5cGU6YHVuc2lnbmVkIHNob3J0YCB8IGludGVnZXIgICAgICAgICAgICB8IDIgICAgICAgICAgICAgIHwgXCgzKSAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCit8IGBgaWBgICB8IDpjOnR5cGU6YGludGAgICAgICAgICAgICB8IGludGVnZXIgICAgICAgICAgICB8IDQgICAgICAgICAgICAgIHwgXCgzKSAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCit8IGBgSWBgICB8IDpjOnR5cGU6YHVuc2lnbmVkIGludGAgICB8IGludGVnZXIgICAgICAgICAgICB8IDQgICAgICAgICAgICAgIHwgXCgzKSAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCit8IGBgbGBgICB8IDpjOnR5cGU6YGxvbmdgICAgICAgICAgICB8IGludGVnZXIgICAgICAgICAgICB8IDQgICAgICAgICAgICAgIHwgXCgzKSAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCit8IGBgTGBgICB8IDpjOnR5cGU6YHVuc2lnbmVkIGxvbmdgICB8IGludGVnZXIgICAgICAgICAgICB8IDQgICAgICAgICAgICAgIHwgXCgzKSAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCit8IGBgcWBgICB8IDpjOnR5cGU6YGxvbmcgbG9uZ2AgICAgICB8IGludGVnZXIgICAgICAgICAgICB8IDggICAgICAgICAgICAgIHwgXCgyKSwgXCgzKSB8CisrLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCit8IGBgUWBgICB8IDpjOnR5cGU6YHVuc2lnbmVkIGxvbmcgICB8IGludGVnZXIgICAgICAgICAgICB8IDggICAgICAgICAgICAgIHwgXCgyKSwgXCgzKSB8Cit8ICAgICAgICB8IGxvbmdgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCit8IGBgZmBgICB8IDpjOnR5cGU6YGZsb2F0YCAgICAgICAgICB8IGZsb2F0ICAgICAgICAgICAgICB8IDQgICAgICAgICAgICAgIHwgXCg0KSAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCit8IGBgZGBgICB8IDpjOnR5cGU6YGRvdWJsZWAgICAgICAgICB8IGZsb2F0ICAgICAgICAgICAgICB8IDggICAgICAgICAgICAgIHwgXCg0KSAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCit8IGBgc2BgICB8IDpjOnR5cGU6YGNoYXJbXWAgICAgICAgICB8IHN0cmluZyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCit8IGBgcGBgICB8IDpjOnR5cGU6YGNoYXJbXWAgICAgICAgICB8IHN0cmluZyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCit8IGBgUGBgICB8IDpjOnR5cGU6YHZvaWQgXCpgICAgICAgICB8IGludGVnZXIgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgXCg1KSwgXCgzKSB8CisrLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCiAKIE5vdGVzOgogCiAoMSkKLSAgIFRoZSBgYCc/J2BgIGNvbnZlcnNpb24gY29kZSBjb3JyZXNwb25kcyB0byB0aGUgOmN0eXBlOmBfQm9vbGAgdHlwZSBkZWZpbmVkIGJ5Ci0gICBDOTkuIElmIHRoaXMgdHlwZSBpcyBub3QgYXZhaWxhYmxlLCBpdCBpcyBzaW11bGF0ZWQgdXNpbmcgYSA6Y3R5cGU6YGNoYXJgLiBJbgorICAgVGhlIGBgJz8nYGAgY29udmVyc2lvbiBjb2RlIGNvcnJlc3BvbmRzIHRvIHRoZSA6Yzp0eXBlOmBfQm9vbGAgdHlwZSBkZWZpbmVkIGJ5CisgICBDOTkuIElmIHRoaXMgdHlwZSBpcyBub3QgYXZhaWxhYmxlLCBpdCBpcyBzaW11bGF0ZWQgdXNpbmcgYSA6Yzp0eXBlOmBjaGFyYC4gSW4KICAgIHN0YW5kYXJkIG1vZGUsIGl0IGlzIGFsd2F5cyByZXByZXNlbnRlZCBieSBvbmUgYnl0ZS4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi42CiAKICgyKQogICAgVGhlIGBgJ3EnYGAgYW5kIGBgJ1EnYGAgY29udmVyc2lvbiBjb2RlcyBhcmUgYXZhaWxhYmxlIGluIG5hdGl2ZSBtb2RlIG9ubHkgaWYKLSAgIHRoZSBwbGF0Zm9ybSBDIGNvbXBpbGVyIHN1cHBvcnRzIEMgOmN0eXBlOmBsb25nIGxvbmdgLCBvciwgb24gV2luZG93cywKLSAgIDpjdHlwZTpgX19pbnQ2NGAuICBUaGV5IGFyZSBhbHdheXMgYXZhaWxhYmxlIGluIHN0YW5kYXJkIG1vZGVzLgorICAgdGhlIHBsYXRmb3JtIEMgY29tcGlsZXIgc3VwcG9ydHMgQyA6Yzp0eXBlOmBsb25nIGxvbmdgLCBvciwgb24gV2luZG93cywKKyAgIDpjOnR5cGU6YF9faW50NjRgLiAgVGhleSBhcmUgYWx3YXlzIGF2YWlsYWJsZSBpbiBzdGFuZGFyZCBtb2Rlcy4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi4yCiAKQEAgLTI4NCw3ICsyODQsNyBAQAogRm9yIHRoZSBgYCc/J2BgIGZvcm1hdCBjaGFyYWN0ZXIsIHRoZSByZXR1cm4gdmFsdWUgaXMgZWl0aGVyIDpjb25zdDpgVHJ1ZWAgb3IKIDpjb25zdDpgRmFsc2VgLiBXaGVuIHBhY2tpbmcsIHRoZSB0cnV0aCB2YWx1ZSBvZiB0aGUgYXJndW1lbnQgb2JqZWN0IGlzIHVzZWQuCiBFaXRoZXIgMCBvciAxIGluIHRoZSBuYXRpdmUgb3Igc3RhbmRhcmQgYm9vbCByZXByZXNlbnRhdGlvbiB3aWxsIGJlIHBhY2tlZCwgYW5kCi1hbnkgbm9uLXplcm8gdmFsdWUgd2lsbCBiZSBUcnVlIHdoZW4gdW5wYWNraW5nLgorYW55IG5vbi16ZXJvIHZhbHVlIHdpbGwgYmUgYGBUcnVlYGAgd2hlbiB1bnBhY2tpbmcuCiAKIAogCkBAIC0zODYsNyArMzg2LDcgQEAKICAgICAgIChgYGxlbihzdHJpbmcpYGAgbXVzdCBlcXVhbCA6YXR0cjpgc2VsZi5zaXplYCkuCiAKIAotICAgLi4gbWV0aG9kOjogdW5wYWNrX2Zyb20oYnVmZmVyWywgb2Zmc2V0PTBdKQorICAgLi4gbWV0aG9kOjogdW5wYWNrX2Zyb20oYnVmZmVyLCBvZmZzZXQ9MCkKIAogICAgICAgSWRlbnRpY2FsIHRvIHRoZSA6ZnVuYzpgdW5wYWNrX2Zyb21gIGZ1bmN0aW9uLCB1c2luZyB0aGUgY29tcGlsZWQgZm9ybWF0LgogICAgICAgKGBgbGVuKGJ1ZmZlcltvZmZzZXQ6XSlgYCBtdXN0IGJlIGF0IGxlYXN0IDphdHRyOmBzZWxmLnNpemVgKS4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3N1YnByb2Nlc3MucnN0IGIvRG9jL2xpYnJhcnkvc3VicHJvY2Vzcy5yc3QKaW5kZXggNGQ1ODRiYi4uMTE0OTA3ZiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc3VicHJvY2Vzcy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc3VicHJvY2Vzcy5yc3QKQEAgLTEyLDcgKzEyLDcgQEAKIAogVGhlIDptb2Q6YHN1YnByb2Nlc3NgIG1vZHVsZSBhbGxvd3MgeW91IHRvIHNwYXduIG5ldyBwcm9jZXNzZXMsIGNvbm5lY3QgdG8gdGhlaXIKIGlucHV0L291dHB1dC9lcnJvciBwaXBlcywgYW5kIG9idGFpbiB0aGVpciByZXR1cm4gY29kZXMuICBUaGlzIG1vZHVsZSBpbnRlbmRzIHRvCi1yZXBsYWNlIHNldmVyYWwgb3RoZXIsIG9sZGVyIG1vZHVsZXMgYW5kIGZ1bmN0aW9ucywgc3VjaCBhczo6CityZXBsYWNlIHNldmVyYWwgb2xkZXIgbW9kdWxlcyBhbmQgZnVuY3Rpb25zOjoKIAogICAgb3Muc3lzdGVtCiAgICBvcy5zcGF3bioKQEAgLTIwLDIwICsyMCwyNiBAQAogICAgcG9wZW4yLioKICAgIGNvbW1hbmRzLioKIAotSW5mb3JtYXRpb24gYWJvdXQgaG93IHRoZSA6bW9kOmBzdWJwcm9jZXNzYCBtb2R1bGUgY2FuIGJlIHVzZWQgdG8gcmVwbGFjZSB0aGVzZQotbW9kdWxlcyBhbmQgZnVuY3Rpb25zIGNhbiBiZSBmb3VuZCBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zLgorSW5mb3JtYXRpb24gYWJvdXQgaG93IHRoaXMgbW9kdWxlIGNhbiBiZSB1c2VkIHRvIHJlcGxhY2UgdGhlIG9sZGVyCitmdW5jdGlvbnMgY2FuIGJlIGZvdW5kIGluIHRoZSBzdWJwcm9jZXNzLXJlcGxhY2VtZW50c18gc2VjdGlvbi4KIAogLi4gc2VlYWxzbzo6CiAKKyAgIFBPU0lYIHVzZXJzIChMaW51eCwgQlNELCBldGMuKSBhcmUgc3Ryb25nbHkgZW5jb3VyYWdlZCB0byBpbnN0YWxsCisgICBhbmQgdXNlIHRoZSBtdWNoIG1vcmUgcmVjZW50IHN1YnByb2Nlc3MzMl8gbW9kdWxlIGluc3RlYWQgb2YgdGhlCisgICB2ZXJzaW9uIGluY2x1ZGVkIHdpdGggcHl0aG9uIDIuNy4gIEl0IGlzIGEgZHJvcCBpbiByZXBsYWNlbWVudCB3aXRoCisgICBiZXR0ZXIgYmVoYXZpb3IgaW4gbWFueSBzaXR1YXRpb25zLgorCiAgICA6cGVwOmAzMjRgIC0tIFBFUCBwcm9wb3NpbmcgdGhlIHN1YnByb2Nlc3MgbW9kdWxlCiAKKy4uIF9zdWJwcm9jZXNzMzI6IGh0dHBzOi8vcHlwaS5weXRob24ub3JnL3B5cGkvc3VicHJvY2VzczMyLwogCi1Vc2luZyB0aGUgc3VicHJvY2VzcyBNb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVXNpbmcgdGhlIDptb2Q6YHN1YnByb2Nlc3NgIE1vZHVsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1UaGUgcmVjb21tZW5kZWQgYXBwcm9hY2ggdG8gaW52b2tpbmcgc3VicHJvY2Vzc2VzIGlzIHRvIHVzZSB0aGUgZm9sbG93aW5nCi1jb252ZW5pZW5jZSBmdW5jdGlvbnMgZm9yIGFsbCB1c2UgY2FzZXMgdGhleSBjYW4gaGFuZGxlLiBGb3IgbW9yZSBhZHZhbmNlZAotdXNlIGNhc2VzLCB0aGUgdW5kZXJseWluZyA6Y2xhc3M6YFBvcGVuYCBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgZGlyZWN0bHkuCitUaGUgcmVjb21tZW5kZWQgd2F5IHRvIGxhdW5jaCBzdWJwcm9jZXNzZXMgaXMgdG8gdXNlIHRoZSBmb2xsb3dpbmcKK2NvbnZlbmllbmNlIGZ1bmN0aW9ucy4gIEZvciBtb3JlIGFkdmFuY2VkIHVzZSBjYXNlcyB3aGVuIHRoZXNlIGRvIG5vdAorbWVldCB5b3VyIG5lZWRzLCB1c2UgdGhlIHVuZGVybHlpbmcgOmNsYXNzOmBQb3BlbmAgaW50ZXJmYWNlLgogCiAKIC4uIGZ1bmN0aW9uOjogY2FsbChhcmdzLCAqLCBzdGRpbj1Ob25lLCBzdGRvdXQ9Tm9uZSwgc3RkZXJyPU5vbmUsIHNoZWxsPUZhbHNlKQpAQCAtNTcsMTYgKzYzLDE1IEBACiAKICAgIC4uIHdhcm5pbmc6OgogCi0gICAgICBJbnZva2luZyB0aGUgc3lzdGVtIHNoZWxsIHdpdGggYGBzaGVsbD1UcnVlYGAgY2FuIGJlIGEgc2VjdXJpdHkgaGF6YXJkCi0gICAgICBpZiBjb21iaW5lZCB3aXRoIHVudHJ1c3RlZCBpbnB1dC4gU2VlIHRoZSB3YXJuaW5nIHVuZGVyCi0gICAgICA6cmVmOmBmcmVxdWVudGx5LXVzZWQtYXJndW1lbnRzYCBmb3IgZGV0YWlscy4KKyAgICAgIFVzaW5nIGBgc2hlbGw9VHJ1ZWBgIGNhbiBiZSBhIHNlY3VyaXR5IGhhemFyZC4gIFNlZSB0aGUgd2FybmluZworICAgICAgdW5kZXIgOnJlZjpgZnJlcXVlbnRseS11c2VkLWFyZ3VtZW50c2AgZm9yIGRldGFpbHMuCiAKICAgIC4uIG5vdGU6OgogCi0gICAgICBEbyBub3QgdXNlIGBgc3Rkb3V0PVBJUEVgYCBvciBgYHN0ZGVycj1QSVBFYGAgd2l0aCB0aGlzIGZ1bmN0aW9uLiBBcwotICAgICAgdGhlIHBpcGVzIGFyZSBub3QgYmVpbmcgcmVhZCBpbiB0aGUgY3VycmVudCBwcm9jZXNzLCB0aGUgY2hpbGQKLSAgICAgIHByb2Nlc3MgbWF5IGJsb2NrIGlmIGl0IGdlbmVyYXRlcyBlbm91Z2ggb3V0cHV0IHRvIGEgcGlwZSB0byBmaWxsIHVwCi0gICAgICB0aGUgT1MgcGlwZSBidWZmZXIuCisgICAgICBEbyBub3QgdXNlIGBgc3Rkb3V0PVBJUEVgYCBvciBgYHN0ZGVycj1QSVBFYGAgd2l0aCB0aGlzIGZ1bmN0aW9uCisgICAgICBhcyB0aGF0IGNhbiBkZWFkbG9jayBiYXNlZCBvbiB0aGUgY2hpbGQgcHJvY2VzcyBvdXRwdXQgdm9sdW1lLgorICAgICAgVXNlIDpjbGFzczpgUG9wZW5gIHdpdGggdGhlIDptZXRoOmBjb21tdW5pY2F0ZWAgbWV0aG9kIHdoZW4geW91CisgICAgICBuZWVkIHBpcGVzLgogCiAKIC4uIGZ1bmN0aW9uOjogY2hlY2tfY2FsbChhcmdzLCAqLCBzdGRpbj1Ob25lLCBzdGRvdXQ9Tm9uZSwgc3RkZXJyPU5vbmUsIHNoZWxsPUZhbHNlKQpAQCAtNzQsNyArNzksNyBAQAogICAgUnVuIGNvbW1hbmQgd2l0aCBhcmd1bWVudHMuICBXYWl0IGZvciBjb21tYW5kIHRvIGNvbXBsZXRlLiBJZiB0aGUgcmV0dXJuCiAgICBjb2RlIHdhcyB6ZXJvIHRoZW4gcmV0dXJuLCBvdGhlcndpc2UgcmFpc2UgOmV4YzpgQ2FsbGVkUHJvY2Vzc0Vycm9yYC4gVGhlCiAgICA6ZXhjOmBDYWxsZWRQcm9jZXNzRXJyb3JgIG9iamVjdCB3aWxsIGhhdmUgdGhlIHJldHVybiBjb2RlIGluIHRoZQotICAgOmF0dHI6YHJldHVybmNvZGVgIGF0dHJpYnV0ZS4KKyAgIDphdHRyOmB+Q2FsbGVkUHJvY2Vzc0Vycm9yLnJldHVybmNvZGVgIGF0dHJpYnV0ZS4KIAogICAgVGhlIGFyZ3VtZW50cyBzaG93biBhYm92ZSBhcmUgbWVyZWx5IHRoZSBtb3N0IGNvbW1vbiBvbmVzLCBkZXNjcmliZWQgYmVsb3cKICAgIGluIDpyZWY6YGZyZXF1ZW50bHktdXNlZC1hcmd1bWVudHNgIChoZW5jZSB0aGUgc2xpZ2h0bHkgb2RkIG5vdGF0aW9uIGluCkBAIC05NiwxNiArMTAxLDE1IEBACiAKICAgIC4uIHdhcm5pbmc6OgogCi0gICAgICBJbnZva2luZyB0aGUgc3lzdGVtIHNoZWxsIHdpdGggYGBzaGVsbD1UcnVlYGAgY2FuIGJlIGEgc2VjdXJpdHkgaGF6YXJkCi0gICAgICBpZiBjb21iaW5lZCB3aXRoIHVudHJ1c3RlZCBpbnB1dC4gU2VlIHRoZSB3YXJuaW5nIHVuZGVyCi0gICAgICA6cmVmOmBmcmVxdWVudGx5LXVzZWQtYXJndW1lbnRzYCBmb3IgZGV0YWlscy4KKyAgICAgIFVzaW5nIGBgc2hlbGw9VHJ1ZWBgIGNhbiBiZSBhIHNlY3VyaXR5IGhhemFyZC4gIFNlZSB0aGUgd2FybmluZworICAgICAgdW5kZXIgOnJlZjpgZnJlcXVlbnRseS11c2VkLWFyZ3VtZW50c2AgZm9yIGRldGFpbHMuCiAKICAgIC4uIG5vdGU6OgogCi0gICAgICBEbyBub3QgdXNlIGBgc3Rkb3V0PVBJUEVgYCBvciBgYHN0ZGVycj1QSVBFYGAgd2l0aCB0aGlzIGZ1bmN0aW9uLiBBcwotICAgICAgdGhlIHBpcGVzIGFyZSBub3QgYmVpbmcgcmVhZCBpbiB0aGUgY3VycmVudCBwcm9jZXNzLCB0aGUgY2hpbGQKLSAgICAgIHByb2Nlc3MgbWF5IGJsb2NrIGlmIGl0IGdlbmVyYXRlcyBlbm91Z2ggb3V0cHV0IHRvIGEgcGlwZSB0byBmaWxsIHVwCi0gICAgICB0aGUgT1MgcGlwZSBidWZmZXIuCisgICAgICBEbyBub3QgdXNlIGBgc3Rkb3V0PVBJUEVgYCBvciBgYHN0ZGVycj1QSVBFYGAgd2l0aCB0aGlzIGZ1bmN0aW9uCisgICAgICBhcyB0aGF0IGNhbiBkZWFkbG9jayBiYXNlZCBvbiB0aGUgY2hpbGQgcHJvY2VzcyBvdXRwdXQgdm9sdW1lLgorICAgICAgVXNlIDpjbGFzczpgUG9wZW5gIHdpdGggdGhlIDptZXRoOmBjb21tdW5pY2F0ZWAgbWV0aG9kIHdoZW4geW91CisgICAgICBuZWVkIHBpcGVzLgogCiAKIC4uIGZ1bmN0aW9uOjogY2hlY2tfb3V0cHV0KGFyZ3MsICosIHN0ZGluPU5vbmUsIHN0ZGVycj1Ob25lLCBzaGVsbD1GYWxzZSwgdW5pdmVyc2FsX25ld2xpbmVzPUZhbHNlKQpAQCAtMTE0LDggKzExOCw4IEBACiAKICAgIElmIHRoZSByZXR1cm4gY29kZSB3YXMgbm9uLXplcm8gaXQgcmFpc2VzIGEgOmV4YzpgQ2FsbGVkUHJvY2Vzc0Vycm9yYC4gVGhlCiAgICA6ZXhjOmBDYWxsZWRQcm9jZXNzRXJyb3JgIG9iamVjdCB3aWxsIGhhdmUgdGhlIHJldHVybiBjb2RlIGluIHRoZQotICAgOmF0dHI6YHJldHVybmNvZGVgIGF0dHJpYnV0ZSBhbmQgYW55IG91dHB1dCBpbiB0aGUgOmF0dHI6YG91dHB1dGAKLSAgIGF0dHJpYnV0ZS4KKyAgIDphdHRyOmB+Q2FsbGVkUHJvY2Vzc0Vycm9yLnJldHVybmNvZGVgIGF0dHJpYnV0ZSBhbmQgYW55IG91dHB1dCBpbiB0aGUKKyAgIDphdHRyOmB+Q2FsbGVkUHJvY2Vzc0Vycm9yLm91dHB1dGAgYXR0cmlidXRlLgogCiAgICBUaGUgYXJndW1lbnRzIHNob3duIGFib3ZlIGFyZSBtZXJlbHkgdGhlIG1vc3QgY29tbW9uIG9uZXMsIGRlc2NyaWJlZCBiZWxvdwogICAgaW4gOnJlZjpgZnJlcXVlbnRseS11c2VkLWFyZ3VtZW50c2AgKGhlbmNlIHRoZSBzbGlnaHRseSBvZGQgbm90YXRpb24gaW4KQEAgLTE0NywxNSArMTUxLDE0IEBACiAKICAgIC4uIHdhcm5pbmc6OgogCi0gICAgICBJbnZva2luZyB0aGUgc3lzdGVtIHNoZWxsIHdpdGggYGBzaGVsbD1UcnVlYGAgY2FuIGJlIGEgc2VjdXJpdHkgaGF6YXJkCi0gICAgICBpZiBjb21iaW5lZCB3aXRoIHVudHJ1c3RlZCBpbnB1dC4gU2VlIHRoZSB3YXJuaW5nIHVuZGVyCi0gICAgICA6cmVmOmBmcmVxdWVudGx5LXVzZWQtYXJndW1lbnRzYCBmb3IgZGV0YWlscy4KKyAgICAgIFVzaW5nIGBgc2hlbGw9VHJ1ZWBgIGNhbiBiZSBhIHNlY3VyaXR5IGhhemFyZC4gIFNlZSB0aGUgd2FybmluZworICAgICAgdW5kZXIgOnJlZjpgZnJlcXVlbnRseS11c2VkLWFyZ3VtZW50c2AgZm9yIGRldGFpbHMuCiAKICAgIC4uIG5vdGU6OgogCi0gICAgICBEbyBub3QgdXNlIGBgc3RkZXJyPVBJUEVgYCB3aXRoIHRoaXMgZnVuY3Rpb24uIEFzIHRoZSBwaXBlIGlzIG5vdCBiZWluZwotICAgICAgcmVhZCBpbiB0aGUgY3VycmVudCBwcm9jZXNzLCB0aGUgY2hpbGQgcHJvY2VzcyBtYXkgYmxvY2sgaWYgaXQKLSAgICAgIGdlbmVyYXRlcyBlbm91Z2ggb3V0cHV0IHRvIHRoZSBwaXBlIHRvIGZpbGwgdXAgdGhlIE9TIHBpcGUgYnVmZmVyLgorICAgICAgRG8gbm90IHVzZSBgYHN0ZGVycj1QSVBFYGAgd2l0aCB0aGlzIGZ1bmN0aW9uIGFzIHRoYXQgY2FuIGRlYWRsb2NrCisgICAgICBiYXNlZCBvbiB0aGUgY2hpbGQgcHJvY2VzcyBlcnJvciB2b2x1bWUuICBVc2UgOmNsYXNzOmBQb3BlbmAgd2l0aAorICAgICAgdGhlIDptZXRoOmBjb21tdW5pY2F0ZWAgbWV0aG9kIHdoZW4geW91IG5lZWQgYSBzdGRlcnIgcGlwZS4KIAogCiAuLiBkYXRhOjogUElQRQpAQCAtMTcyLDYgKzE3NSwyNiBAQAogICAgb3V0cHV0LgogCiAKKy4uIGV4Y2VwdGlvbjo6IENhbGxlZFByb2Nlc3NFcnJvcgorCisgICAgRXhjZXB0aW9uIHJhaXNlZCB3aGVuIGEgcHJvY2VzcyBydW4gYnkgOmZ1bmM6YGNoZWNrX2NhbGxgIG9yCisgICAgOmZ1bmM6YGNoZWNrX291dHB1dGAgcmV0dXJucyBhIG5vbi16ZXJvIGV4aXQgc3RhdHVzLgorCisgICAgLi4gYXR0cmlidXRlOjogcmV0dXJuY29kZQorCisgICAgICAgIEV4aXQgc3RhdHVzIG9mIHRoZSBjaGlsZCBwcm9jZXNzLgorCisgICAgLi4gYXR0cmlidXRlOjogY21kCisKKyAgICAgICAgQ29tbWFuZCB0aGF0IHdhcyB1c2VkIHRvIHNwYXduIHRoZSBjaGlsZCBwcm9jZXNzLgorCisgICAgLi4gYXR0cmlidXRlOjogb3V0cHV0CisKKyAgICAgICAgT3V0cHV0IG9mIHRoZSBjaGlsZCBwcm9jZXNzIGlmIHRoaXMgZXhjZXB0aW9uIGlzIHJhaXNlZCBieQorICAgICAgICA6ZnVuYzpgY2hlY2tfb3V0cHV0YC4gIE90aGVyd2lzZSwgYGBOb25lYGAuCisKKworCiAuLiBfZnJlcXVlbnRseS11c2VkLWFyZ3VtZW50czoKIAogRnJlcXVlbnRseSBVc2VkIEFyZ3VtZW50cwpAQCAtMjAwLDE1ICsyMjMsMjIgQEAKICAgIHRoZSBzdGRlcnIgZGF0YSBmcm9tIHRoZSBjaGlsZCBwcm9jZXNzIHNob3VsZCBiZSBjYXB0dXJlZCBpbnRvIHRoZSBzYW1lIGZpbGUKICAgIGhhbmRsZSBhcyBmb3Igc3Rkb3V0LgogCi0gICBXaGVuICpzdGRvdXQqIG9yICpzdGRlcnIqIGFyZSBwaXBlcyBhbmQgKnVuaXZlcnNhbF9uZXdsaW5lcyogaXMKLSAgIDpjb25zdDpgVHJ1ZWAgdGhlbiBhbGwgbGluZSBlbmRpbmdzIHdpbGwgYmUgY29udmVydGVkIHRvIGBgJ1xuJ2BgIGFzCi0gICBkZXNjcmliZWQgZm9yIHRoZSB1bml2ZXJzYWwgbmV3bGluZXMgYCdVJ2BgIG1vZGUgYXJndW1lbnQgdG8gOmZ1bmM6YG9wZW5gLgorICAgLi4gaW5kZXg6OgorICAgICAgc2luZ2xlOiB1bml2ZXJzYWwgbmV3bGluZXM7IHN1YnByb2Nlc3MgbW9kdWxlCiAKLSAgIElmICpzaGVsbCogaXMgOmNvbnN0OmBUcnVlYCwgdGhlIHNwZWNpZmllZCBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgdGhyb3VnaAotICAgdGhlIHNoZWxsLiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGFyZSB1c2luZyBQeXRob24gcHJpbWFyaWx5IGZvciB0aGUKKyAgIFdoZW4gKnN0ZG91dCogb3IgKnN0ZGVyciogYXJlIHBpcGVzIGFuZCAqdW5pdmVyc2FsX25ld2xpbmVzKiBpcworICAgYGBUcnVlYGAgdGhlbiBhbGwgbGluZSBlbmRpbmdzIHdpbGwgYmUgY29udmVydGVkIHRvIGBgJ1xuJ2BgIGFzIGRlc2NyaWJlZAorICAgZm9yIHRoZSA6dGVybTpgdW5pdmVyc2FsIG5ld2xpbmVzYCBgYCdVJ2BgIG1vZGUgYXJndW1lbnQgdG8gOmZ1bmM6YG9wZW5gLgorCisgICBJZiAqc2hlbGwqIGlzIGBgVHJ1ZWBgLCB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCB0aHJvdWdoCisgICB0aGUgc2hlbGwuICBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGFyZSB1c2luZyBQeXRob24gcHJpbWFyaWx5IGZvciB0aGUKICAgIGVuaGFuY2VkIGNvbnRyb2wgZmxvdyBpdCBvZmZlcnMgb3ZlciBtb3N0IHN5c3RlbSBzaGVsbHMgYW5kIHN0aWxsIHdhbnQKLSAgIGFjY2VzcyB0byBvdGhlciBzaGVsbCBmZWF0dXJlcyBzdWNoIGFzIGZpbGVuYW1lIHdpbGRjYXJkcywgc2hlbGwgcGlwZXMgYW5kCi0gICBlbnZpcm9ubWVudCB2YXJpYWJsZSBleHBhbnNpb24uCisgICBjb252ZW5pZW50IGFjY2VzcyB0byBvdGhlciBzaGVsbCBmZWF0dXJlcyBzdWNoIGFzIHNoZWxsIHBpcGVzLCBmaWxlbmFtZQorICAgd2lsZGNhcmRzLCBlbnZpcm9ubWVudCB2YXJpYWJsZSBleHBhbnNpb24sIGFuZCBleHBhbnNpb24gb2YgYGB+YGAgdG8gYQorICAgdXNlcidzIGhvbWUgZGlyZWN0b3J5LiAgSG93ZXZlciwgbm90ZSB0aGF0IFB5dGhvbiBpdHNlbGYgb2ZmZXJzCisgICBpbXBsZW1lbnRhdGlvbnMgb2YgbWFueSBzaGVsbC1saWtlIGZlYXR1cmVzIChpbiBwYXJ0aWN1bGFyLCA6bW9kOmBnbG9iYCwKKyAgIDptb2Q6YGZubWF0Y2hgLCA6ZnVuYzpgb3Mud2Fsa2AsIDpmdW5jOmBvcy5wYXRoLmV4cGFuZHZhcnNgLAorICAgOmZ1bmM6YG9zLnBhdGguZXhwYW5kdXNlcmAsIGFuZCA6bW9kOmBzaHV0aWxgKS4KIAogICAgLi4gd2FybmluZzo6CiAKQEAgLTIxNiw4ICsyNDYsOCBAQAogICAgICAgdW50cnVzdGVkIHNvdXJjZSBtYWtlcyBhIHByb2dyYW0gdnVsbmVyYWJsZSB0byBgc2hlbGwgaW5qZWN0aW9uCiAgICAgICA8aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TaGVsbF9pbmplY3Rpb24jU2hlbGxfaW5qZWN0aW9uPmBfLAogICAgICAgYSBzZXJpb3VzIHNlY3VyaXR5IGZsYXcgd2hpY2ggY2FuIHJlc3VsdCBpbiBhcmJpdHJhcnkgY29tbWFuZCBleGVjdXRpb24uCi0gICAgICBGb3IgdGhpcyByZWFzb24sIHRoZSB1c2Ugb2YgKnNoZWxsPVRydWUqIGlzICoqc3Ryb25nbHkgZGlzY291cmFnZWQqKiBpbiBjYXNlcwotICAgICAgd2hlcmUgdGhlIGNvbW1hbmQgc3RyaW5nIGlzIGNvbnN0cnVjdGVkIGZyb20gZXh0ZXJuYWwgaW5wdXQ6OgorICAgICAgRm9yIHRoaXMgcmVhc29uLCB0aGUgdXNlIG9mIGBgc2hlbGw9VHJ1ZWBgIGlzICoqc3Ryb25nbHkgZGlzY291cmFnZWQqKgorICAgICAgaW4gY2FzZXMgd2hlcmUgdGhlIGNvbW1hbmQgc3RyaW5nIGlzIGNvbnN0cnVjdGVkIGZyb20gZXh0ZXJuYWwgaW5wdXQ6OgogCiAgICAgICAgICA+Pj4gZnJvbSBzdWJwcm9jZXNzIGltcG9ydCBjYWxsCiAgICAgICAgICA+Pj4gZmlsZW5hbWUgPSBpbnB1dCgiV2hhdCBmaWxlIHdvdWxkIHlvdSBsaWtlIHRvIGRpc3BsYXk/XG4iKQpAQCAtMjI5LDEyICsyNTksMTYgQEAKICAgICAgIGZyb20gdGhpcyB2dWxuZXJhYmlsaXR5OyBzZWUgdGhlIE5vdGUgaW4gdGhlIDpjbGFzczpgUG9wZW5gIGNvbnN0cnVjdG9yCiAgICAgICBkb2N1bWVudGF0aW9uIGZvciBoZWxwZnVsIGhpbnRzIGluIGdldHRpbmcgYGBzaGVsbD1GYWxzZWBgIHRvIHdvcmsuCiAKKyAgICAgIFdoZW4gdXNpbmcgYGBzaGVsbD1UcnVlYGAsIDpmdW5jOmBwaXBlcy5xdW90ZWAgY2FuIGJlIHVzZWQgdG8gcHJvcGVybHkKKyAgICAgIGVzY2FwZSB3aGl0ZXNwYWNlIGFuZCBzaGVsbCBtZXRhY2hhcmFjdGVycyBpbiBzdHJpbmdzIHRoYXQgYXJlIGdvaW5nIHRvCisgICAgICBiZSB1c2VkIHRvIGNvbnN0cnVjdCBzaGVsbCBjb21tYW5kcy4KKwogVGhlc2Ugb3B0aW9ucywgYWxvbmcgd2l0aCBhbGwgb2YgdGhlIG90aGVyIG9wdGlvbnMsIGFyZSBkZXNjcmliZWQgaW4gbW9yZQogZGV0YWlsIGluIHRoZSA6Y2xhc3M6YFBvcGVuYCBjb25zdHJ1Y3RvciBkb2N1bWVudGF0aW9uLgogCiAKLVBvcGVuIENvbnN0dWN0b3IKLV5eXl5eXl5eXl5eXl5eXl4KK1BvcGVuIENvbnN0cnVjdG9yCiteXl5eXl5eXl5eXl5eXl5eXgogCiBUaGUgdW5kZXJseWluZyBwcm9jZXNzIGNyZWF0aW9uIGFuZCBtYW5hZ2VtZW50IGluIHRoaXMgbW9kdWxlIGlzIGhhbmRsZWQgYnkKIHRoZSA6Y2xhc3M6YFBvcGVuYCBjbGFzcy4gSXQgb2ZmZXJzIGEgbG90IG9mIGZsZXhpYmlsaXR5IHNvIHRoYXQgZGV2ZWxvcGVycwpAQCAtMjQyLDIzICsyNzYsMjYgQEAKIGZ1bmN0aW9ucy4KIAogCi0uLiBjbGFzczo6IFBvcGVuKGFyZ3MsIGJ1ZnNpemU9MCwgZXhlY3V0YWJsZT1Ob25lLCBzdGRpbj1Ob25lLCBzdGRvdXQ9Tm9uZSwgc3RkZXJyPU5vbmUsIHByZWV4ZWNfZm49Tm9uZSwgY2xvc2VfZmRzPUZhbHNlLCBzaGVsbD1GYWxzZSwgY3dkPU5vbmUsIGVudj1Ob25lLCB1bml2ZXJzYWxfbmV3bGluZXM9RmFsc2UsIHN0YXJ0dXBpbmZvPU5vbmUsIGNyZWF0aW9uZmxhZ3M9MCkKKy4uIGNsYXNzOjogUG9wZW4oYXJncywgYnVmc2l6ZT0wLCBleGVjdXRhYmxlPU5vbmUsIHN0ZGluPU5vbmUsIHN0ZG91dD1Ob25lLCBcCisgICAgICAgICAgICAgICAgIHN0ZGVycj1Ob25lLCBwcmVleGVjX2ZuPU5vbmUsIGNsb3NlX2Zkcz1GYWxzZSwgc2hlbGw9RmFsc2UsIFwKKyAgICAgICAgICAgICAgICAgY3dkPU5vbmUsIGVudj1Ob25lLCB1bml2ZXJzYWxfbmV3bGluZXM9RmFsc2UsIFwKKyAgICAgICAgICAgICAgICAgc3RhcnR1cGluZm89Tm9uZSwgY3JlYXRpb25mbGFncz0wKQogCi0gICBBcmd1bWVudHMgYXJlOgorICAgRXhlY3V0ZSBhIGNoaWxkIHByb2dyYW0gaW4gYSBuZXcgcHJvY2Vzcy4gIE9uIFVuaXgsIHRoZSBjbGFzcyB1c2VzCisgICA6bWV0aDpgb3MuZXhlY3ZwYC1saWtlIGJlaGF2aW9yIHRvIGV4ZWN1dGUgdGhlIGNoaWxkIHByb2dyYW0uICBPbiBXaW5kb3dzLAorICAgdGhlIGNsYXNzIHVzZXMgdGhlIFdpbmRvd3MgYGBDcmVhdGVQcm9jZXNzKClgYCBmdW5jdGlvbi4gIFRoZSBhcmd1bWVudHMgdG8KKyAgIDpjbGFzczpgUG9wZW5gIGFyZSBhcyBmb2xsb3dzLgogCi0gICAqYXJncyogc2hvdWxkIGJlIGEgc3RyaW5nLCBvciBhIHNlcXVlbmNlIG9mIHByb2dyYW0gYXJndW1lbnRzLiAgVGhlIHByb2dyYW0KLSAgIHRvIGV4ZWN1dGUgaXMgbm9ybWFsbHkgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGFyZ3Mgc2VxdWVuY2Ugb3IgdGhlIHN0cmluZyBpZgotICAgYSBzdHJpbmcgaXMgZ2l2ZW4sIGJ1dCBjYW4gYmUgZXhwbGljaXRseSBzZXQgYnkgdXNpbmcgdGhlICpleGVjdXRhYmxlKgotICAgYXJndW1lbnQuICBXaGVuICpleGVjdXRhYmxlKiBpcyBnaXZlbiwgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGFyZ3Mgc2VxdWVuY2UKLSAgIGlzIHN0aWxsIHRyZWF0ZWQgYnkgbW9zdCBwcm9ncmFtcyBhcyB0aGUgY29tbWFuZCBuYW1lLCB3aGljaCBjYW4gdGhlbiBiZQotICAgZGlmZmVyZW50IGZyb20gdGhlIGFjdHVhbCBleGVjdXRhYmxlIG5hbWUuICBPbiBVbml4LCBpdCBiZWNvbWVzIHRoZSBkaXNwbGF5Ci0gICBuYW1lIGZvciB0aGUgZXhlY3V0aW5nIHByb2dyYW0gaW4gdXRpbGl0aWVzIHN1Y2ggYXMgOnByb2dyYW06YHBzYC4KKyAgICphcmdzKiBzaG91bGQgYmUgYSBzZXF1ZW5jZSBvZiBwcm9ncmFtIGFyZ3VtZW50cyBvciBlbHNlIGEgc2luZ2xlIHN0cmluZy4KKyAgIEJ5IGRlZmF1bHQsIHRoZSBwcm9ncmFtIHRvIGV4ZWN1dGUgaXMgdGhlIGZpcnN0IGl0ZW0gaW4gKmFyZ3MqIGlmICphcmdzKiBpcworICAgYSBzZXF1ZW5jZS4gIElmICphcmdzKiBpcyBhIHN0cmluZywgdGhlIGludGVycHJldGF0aW9uIGlzCisgICBwbGF0Zm9ybS1kZXBlbmRlbnQgYW5kIGRlc2NyaWJlZCBiZWxvdy4gIFNlZSB0aGUgKnNoZWxsKiBhbmQgKmV4ZWN1dGFibGUqCisgICBhcmd1bWVudHMgZm9yIGFkZGl0aW9uYWwgZGlmZmVyZW5jZXMgZnJvbSB0aGUgZGVmYXVsdCBiZWhhdmlvci4gIFVubGVzcworICAgb3RoZXJ3aXNlIHN0YXRlZCwgaXQgaXMgcmVjb21tZW5kZWQgdG8gcGFzcyAqYXJncyogYXMgYSBzZXF1ZW5jZS4KIAotICAgT24gVW5peCwgd2l0aCAqc2hlbGw9RmFsc2UqIChkZWZhdWx0KTogSW4gdGhpcyBjYXNlLCB0aGUgUG9wZW4gY2xhc3MgdXNlcwotICAgOm1ldGg6YG9zLmV4ZWN2cGAgdG8gZXhlY3V0ZSB0aGUgY2hpbGQgcHJvZ3JhbS4gKmFyZ3MqIHNob3VsZCBub3JtYWxseSBiZSBhCi0gICBzZXF1ZW5jZS4gIElmIGEgc3RyaW5nIGlzIHNwZWNpZmllZCBmb3IgKmFyZ3MqLCBpdCB3aWxsIGJlIHVzZWQgYXMgdGhlIG5hbWUKLSAgIG9yIHBhdGggb2YgdGhlIHByb2dyYW0gdG8gZXhlY3V0ZTsgdGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUgcHJvZ3JhbSBpcwotICAgYmVpbmcgZ2l2ZW4gbm8gYXJndW1lbnRzLgorICAgT24gVW5peCwgaWYgKmFyZ3MqIGlzIGEgc3RyaW5nLCB0aGUgc3RyaW5nIGlzIGludGVycHJldGVkIGFzIHRoZSBuYW1lIG9yCisgICBwYXRoIG9mIHRoZSBwcm9ncmFtIHRvIGV4ZWN1dGUuICBIb3dldmVyLCB0aGlzIGNhbiBvbmx5IGJlIGRvbmUgaWYgbm90CisgICBwYXNzaW5nIGFyZ3VtZW50cyB0byB0aGUgcHJvZ3JhbS4KIAogICAgLi4gbm90ZTo6CiAKQEAgLTI3OSwyMCArMzE2LDM2IEBACiAgICAgICB1c2VkIGluIHRoZSBzaGVsbCAoc3VjaCBhcyBmaWxlbmFtZXMgY29udGFpbmluZyBzcGFjZXMgb3IgdGhlICplY2hvKiBjb21tYW5kCiAgICAgICBzaG93biBhYm92ZSkgYXJlIHNpbmdsZSBsaXN0IGVsZW1lbnRzLgogCi0gICBPbiBVbml4LCB3aXRoICpzaGVsbD1UcnVlKjogSWYgYXJncyBpcyBhIHN0cmluZywgaXQgc3BlY2lmaWVzIHRoZSBjb21tYW5kCi0gICBzdHJpbmcgdG8gZXhlY3V0ZSB0aHJvdWdoIHRoZSBzaGVsbC4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgc3RyaW5nIG11c3QgYmUKKyAgIE9uIFdpbmRvd3MsIGlmICphcmdzKiBpcyBhIHNlcXVlbmNlLCBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIHN0cmluZyBpbiBhCisgICBtYW5uZXIgZGVzY3JpYmVkIGluIDpyZWY6YGNvbnZlcnRpbmctYXJndW1lbnQtc2VxdWVuY2VgLiAgVGhpcyBpcyBiZWNhdXNlCisgICB0aGUgdW5kZXJseWluZyBgYENyZWF0ZVByb2Nlc3MoKWBgIG9wZXJhdGVzIG9uIHN0cmluZ3MuCisKKyAgIFRoZSAqc2hlbGwqIGFyZ3VtZW50ICh3aGljaCBkZWZhdWx0cyB0byAqRmFsc2UqKSBzcGVjaWZpZXMgd2hldGhlciB0byB1c2UKKyAgIHRoZSBzaGVsbCBhcyB0aGUgcHJvZ3JhbSB0byBleGVjdXRlLiAgSWYgKnNoZWxsKiBpcyAqVHJ1ZSosIGl0IGlzCisgICByZWNvbW1lbmRlZCB0byBwYXNzICphcmdzKiBhcyBhIHN0cmluZyByYXRoZXIgdGhhbiBhcyBhIHNlcXVlbmNlLgorCisgICBPbiBVbml4IHdpdGggYGBzaGVsbD1UcnVlYGAsIHRoZSBzaGVsbCBkZWZhdWx0cyB0byA6ZmlsZTpgL2Jpbi9zaGAuICBJZgorICAgKmFyZ3MqIGlzIGEgc3RyaW5nLCB0aGUgc3RyaW5nIHNwZWNpZmllcyB0aGUgY29tbWFuZAorICAgdG8gZXhlY3V0ZSB0aHJvdWdoIHRoZSBzaGVsbC4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgc3RyaW5nIG11c3QgYmUKICAgIGZvcm1hdHRlZCBleGFjdGx5IGFzIGl0IHdvdWxkIGJlIHdoZW4gdHlwZWQgYXQgdGhlIHNoZWxsIHByb21wdC4gIFRoaXMKICAgIGluY2x1ZGVzLCBmb3IgZXhhbXBsZSwgcXVvdGluZyBvciBiYWNrc2xhc2ggZXNjYXBpbmcgZmlsZW5hbWVzIHdpdGggc3BhY2VzIGluCiAgICB0aGVtLiAgSWYgKmFyZ3MqIGlzIGEgc2VxdWVuY2UsIHRoZSBmaXJzdCBpdGVtIHNwZWNpZmllcyB0aGUgY29tbWFuZCBzdHJpbmcsIGFuZAogICAgYW55IGFkZGl0aW9uYWwgaXRlbXMgd2lsbCBiZSB0cmVhdGVkIGFzIGFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHRoZSBzaGVsbAotICAgaXRzZWxmLiAgVGhhdCBpcyB0byBzYXksICpQb3BlbiogZG9lcyB0aGUgZXF1aXZhbGVudCBvZjo6CisgICBpdHNlbGYuICBUaGF0IGlzIHRvIHNheSwgOmNsYXNzOmBQb3BlbmAgZG9lcyB0aGUgZXF1aXZhbGVudCBvZjo6CiAKICAgICAgIFBvcGVuKFsnL2Jpbi9zaCcsICctYycsIGFyZ3NbMF0sIGFyZ3NbMV0sIC4uLl0pCiAKLSAgIE9uIFdpbmRvd3M6IHRoZSA6Y2xhc3M6YFBvcGVuYCBjbGFzcyB1c2VzIENyZWF0ZVByb2Nlc3MoKSB0byBleGVjdXRlIHRoZSBjaGlsZAotICAgY2hpbGQgcHJvZ3JhbSwgd2hpY2ggb3BlcmF0ZXMgb24gc3RyaW5ncy4gIElmICphcmdzKiBpcyBhIHNlcXVlbmNlLCBpdCB3aWxsCi0gICBiZSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgaW4gYSBtYW5uZXIgZGVzY3JpYmVkIGluCi0gICA6cmVmOmBjb252ZXJ0aW5nLWFyZ3VtZW50LXNlcXVlbmNlYC4KKyAgIE9uIFdpbmRvd3Mgd2l0aCBgYHNoZWxsPVRydWVgYCwgdGhlIDplbnZ2YXI6YENPTVNQRUNgIGVudmlyb25tZW50IHZhcmlhYmxlCisgICBzcGVjaWZpZXMgdGhlIGRlZmF1bHQgc2hlbGwuICBUaGUgb25seSB0aW1lIHlvdSBuZWVkIHRvIHNwZWNpZnkKKyAgIGBgc2hlbGw9VHJ1ZWBgIG9uIFdpbmRvd3MgaXMgd2hlbiB0aGUgY29tbWFuZCB5b3Ugd2lzaCB0byBleGVjdXRlIGlzIGJ1aWx0CisgICBpbnRvIHRoZSBzaGVsbCAoZS5nLiA6Y29tbWFuZDpgZGlyYCBvciA6Y29tbWFuZDpgY29weWApLiAgWW91IGRvIG5vdCBuZWVkCisgICBgYHNoZWxsPVRydWVgYCB0byBydW4gYSBiYXRjaCBmaWxlIG9yIGNvbnNvbGUtYmFzZWQgZXhlY3V0YWJsZS4KKworICAgLi4gd2FybmluZzo6CisKKyAgICAgIFBhc3NpbmcgYGBzaGVsbD1UcnVlYGAgY2FuIGJlIGEgc2VjdXJpdHkgaGF6YXJkIGlmIGNvbWJpbmVkIHdpdGgKKyAgICAgIHVudHJ1c3RlZCBpbnB1dC4gIFNlZSB0aGUgd2FybmluZyB1bmRlciA6cmVmOmBmcmVxdWVudGx5LXVzZWQtYXJndW1lbnRzYAorICAgICAgZm9yIGRldGFpbHMuCiAKICAgICpidWZzaXplKiwgaWYgZ2l2ZW4sIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50IHRvIHRoZQogICAgYnVpbHQtaW4gb3BlbigpIGZ1bmN0aW9uOiA6Y29uc3Q6YDBgIG1lYW5zIHVuYnVmZmVyZWQsIDpjb25zdDpgMWAgbWVhbnMgbGluZQpAQCAtMzA2LDE1ICszNTksMTUgQEAKICAgICAgIGVuYWJsZSBidWZmZXJpbmcgYnkgc2V0dGluZyAqYnVmc2l6ZSogdG8gZWl0aGVyIC0xIG9yIGEgbGFyZ2UgZW5vdWdoCiAgICAgICBwb3NpdGl2ZSB2YWx1ZSAoc3VjaCBhcyA0MDk2KS4KIAotICAgVGhlICpleGVjdXRhYmxlKiBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIHByb2dyYW0gdG8gZXhlY3V0ZS4gSXQgaXMgdmVyeSBzZWxkb20KLSAgIG5lZWRlZDogVXN1YWxseSwgdGhlIHByb2dyYW0gdG8gZXhlY3V0ZSBpcyBkZWZpbmVkIGJ5IHRoZSAqYXJncyogYXJndW1lbnQuIElmCi0gICBgYHNoZWxsPVRydWVgYCwgdGhlICpleGVjdXRhYmxlKiBhcmd1bWVudCBzcGVjaWZpZXMgd2hpY2ggc2hlbGwgdG8gdXNlLiBPbiBVbml4LAotICAgdGhlIGRlZmF1bHQgc2hlbGwgaXMgOmZpbGU6YC9iaW4vc2hgLiAgT24gV2luZG93cywgdGhlIGRlZmF1bHQgc2hlbGwgaXMKLSAgIHNwZWNpZmllZCBieSB0aGUgOmVudnZhcjpgQ09NU1BFQ2AgZW52aXJvbm1lbnQgdmFyaWFibGUuIFRoZSBvbmx5IHJlYXNvbiB5b3UKLSAgIHdvdWxkIG5lZWQgdG8gc3BlY2lmeSBgYHNoZWxsPVRydWVgYCBvbiBXaW5kb3dzIGlzIHdoZXJlIHRoZSBjb21tYW5kIHlvdQotICAgd2lzaCB0byBleGVjdXRlIGlzIGFjdHVhbGx5IGJ1aWx0IGluIHRvIHRoZSBzaGVsbCwgZWcgYGBkaXJgYCwgYGBjb3B5YGAuCi0gICBZb3UgZG9uJ3QgbmVlZCBgYHNoZWxsPVRydWVgYCB0byBydW4gYSBiYXRjaCBmaWxlLCBub3IgdG8gcnVuIGEgY29uc29sZS1iYXNlZAotICAgZXhlY3V0YWJsZS4KKyAgIFRoZSAqZXhlY3V0YWJsZSogYXJndW1lbnQgc3BlY2lmaWVzIGEgcmVwbGFjZW1lbnQgcHJvZ3JhbSB0byBleGVjdXRlLiAgIEl0CisgICBpcyB2ZXJ5IHNlbGRvbSBuZWVkZWQuICBXaGVuIGBgc2hlbGw9RmFsc2VgYCwgKmV4ZWN1dGFibGUqIHJlcGxhY2VzIHRoZQorICAgcHJvZ3JhbSB0byBleGVjdXRlIHNwZWNpZmllZCBieSAqYXJncyouICBIb3dldmVyLCB0aGUgb3JpZ2luYWwgKmFyZ3MqIGlzCisgICBzdGlsbCBwYXNzZWQgdG8gdGhlIHByb2dyYW0uICBNb3N0IHByb2dyYW1zIHRyZWF0IHRoZSBwcm9ncmFtIHNwZWNpZmllZAorICAgYnkgKmFyZ3MqIGFzIHRoZSBjb21tYW5kIG5hbWUsIHdoaWNoIGNhbiB0aGVuIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBwcm9ncmFtCisgICBhY3R1YWxseSBleGVjdXRlZC4gIE9uIFVuaXgsIHRoZSAqYXJncyogbmFtZQorICAgYmVjb21lcyB0aGUgZGlzcGxheSBuYW1lIGZvciB0aGUgZXhlY3V0YWJsZSBpbiB1dGlsaXRpZXMgc3VjaCBhcworICAgOnByb2dyYW06YHBzYC4gIElmIGBgc2hlbGw9VHJ1ZWBgLCBvbiBVbml4IHRoZSAqZXhlY3V0YWJsZSogYXJndW1lbnQKKyAgIHNwZWNpZmllcyBhIHJlcGxhY2VtZW50IHNoZWxsIGZvciB0aGUgZGVmYXVsdCA6ZmlsZTpgL2Jpbi9zaGAuCiAKICAgICpzdGRpbiosICpzdGRvdXQqIGFuZCAqc3RkZXJyKiBzcGVjaWZ5IHRoZSBleGVjdXRlZCBwcm9ncmFtJ3Mgc3RhbmRhcmQgaW5wdXQsCiAgICBzdGFuZGFyZCBvdXRwdXQgYW5kIHN0YW5kYXJkIGVycm9yIGZpbGUgaGFuZGxlcywgcmVzcGVjdGl2ZWx5LiAgVmFsaWQgdmFsdWVzCkBAIC0zMzUsMTUgKzM4OCw2IEBACiAgICBjaGlsZCBwcm9jZXNzLiAgTm90ZSB0aGF0IG9uIFdpbmRvd3MsIHlvdSBjYW5ub3Qgc2V0ICpjbG9zZV9mZHMqIHRvIHRydWUgYW5kCiAgICBhbHNvIHJlZGlyZWN0IHRoZSBzdGFuZGFyZCBoYW5kbGVzIGJ5IHNldHRpbmcgKnN0ZGluKiwgKnN0ZG91dCogb3IgKnN0ZGVyciouCiAKLSAgIElmICpzaGVsbCogaXMgOmNvbnN0OmBUcnVlYCwgdGhlIHNwZWNpZmllZCBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgdGhyb3VnaCB0aGUKLSAgIHNoZWxsLgotCi0gICAuLiB3YXJuaW5nOjoKLQotICAgICAgRW5hYmxpbmcgdGhpcyBvcHRpb24gY2FuIGJlIGEgc2VjdXJpdHkgaGF6YXJkIGlmIGNvbWJpbmVkIHdpdGggdW50cnVzdGVkCi0gICAgICBpbnB1dC4gU2VlIHRoZSB3YXJuaW5nIHVuZGVyIDpyZWY6YGZyZXF1ZW50bHktdXNlZC1hcmd1bWVudHNgCi0gICAgICBmb3IgZGV0YWlscy4KLQogICAgSWYgKmN3ZCogaXMgbm90IGBgTm9uZWBgLCB0aGUgY2hpbGQncyBjdXJyZW50IGRpcmVjdG9yeSB3aWxsIGJlIGNoYW5nZWQgdG8gKmN3ZCoKICAgIGJlZm9yZSBpdCBpcyBleGVjdXRlZC4gIE5vdGUgdGhhdCB0aGlzIGRpcmVjdG9yeSBpcyBub3QgY29uc2lkZXJlZCB3aGVuCiAgICBzZWFyY2hpbmcgdGhlIGV4ZWN1dGFibGUsIHNvIHlvdSBjYW4ndCBzcGVjaWZ5IHRoZSBwcm9ncmFtJ3MgcGF0aCByZWxhdGl2ZSB0bwpAQCAtMzYyLDExICs0MDYsMTEgQEAKIAogICAgLi4gX3NpZGUtYnktc2lkZSBhc3NlbWJseTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TaWRlLWJ5LVNpZGVfQXNzZW1ibHkKIAotICAgSWYgKnVuaXZlcnNhbF9uZXdsaW5lcyogaXMgOmNvbnN0OmBUcnVlYCwgdGhlIGZpbGUgb2JqZWN0cyBzdGRvdXQgYW5kIHN0ZGVyciBhcmUKLSAgIG9wZW5lZCBhcyB0ZXh0IGZpbGVzLCBidXQgbGluZXMgbWF5IGJlIHRlcm1pbmF0ZWQgYnkgYW55IG9mIGBgJ1xuJ2BgLCB0aGUgVW5peAotICAgZW5kLW9mLWxpbmUgY29udmVudGlvbiwgYGAnXHInYGAsIHRoZSBvbGQgTWFjaW50b3NoIGNvbnZlbnRpb24gb3IgYGAnXHJcbidgYCwgdGhlCi0gICBXaW5kb3dzIGNvbnZlbnRpb24uIEFsbCBvZiB0aGVzZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbnMgYXJlIHNlZW4gYXMgYGAnXG4nYGAKLSAgIGJ5IHRoZSBQeXRob24gcHJvZ3JhbS4KKyAgIElmICp1bml2ZXJzYWxfbmV3bGluZXMqIGlzIGBgVHJ1ZWBgLCB0aGUgZmlsZSBvYmplY3RzICpzdGRvdXQqIGFuZCAqc3RkZXJyKgorICAgYXJlIG9wZW5lZCBhcyB0ZXh0IGZpbGVzIGluIDp0ZXJtOmB1bml2ZXJzYWwgbmV3bGluZXNgIG1vZGUuICBMaW5lcyBtYXkgYmUKKyAgIHRlcm1pbmF0ZWQgYnkgYW55IG9mIGBgJ1xuJ2BgLCB0aGUgVW5peCBlbmQtb2YtbGluZSBjb252ZW50aW9uLCBgYCdccidgYCwKKyAgIHRoZSBvbGQgTWFjaW50b3NoIGNvbnZlbnRpb24gb3IgYGAnXHJcbidgYCwgdGhlIFdpbmRvd3MgY29udmVudGlvbi4gQWxsIG9mCisgICB0aGVzZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbnMgYXJlIHNlZW4gYXMgYGAnXG4nYGAgYnkgdGhlIFB5dGhvbiBwcm9ncmFtLgogCiAgICAuLiBub3RlOjoKIApAQCAtNDE5LDE0ICs0NjMsMTQgQEAKIAogLi4gbWV0aG9kOjogUG9wZW4ucG9sbCgpCiAKLSAgIENoZWNrIGlmIGNoaWxkIHByb2Nlc3MgaGFzIHRlcm1pbmF0ZWQuICBTZXQgYW5kIHJldHVybiA6YXR0cjpgcmV0dXJuY29kZWAKLSAgIGF0dHJpYnV0ZS4KKyAgIENoZWNrIGlmIGNoaWxkIHByb2Nlc3MgaGFzIHRlcm1pbmF0ZWQuICBTZXQgYW5kIHJldHVybgorICAgOmF0dHI6YH5Qb3Blbi5yZXR1cm5jb2RlYCBhdHRyaWJ1dGUuCiAKIAogLi4gbWV0aG9kOjogUG9wZW4ud2FpdCgpCiAKLSAgIFdhaXQgZm9yIGNoaWxkIHByb2Nlc3MgdG8gdGVybWluYXRlLiAgU2V0IGFuZCByZXR1cm4gOmF0dHI6YHJldHVybmNvZGVgCi0gICBhdHRyaWJ1dGUuCisgICBXYWl0IGZvciBjaGlsZCBwcm9jZXNzIHRvIHRlcm1pbmF0ZS4gIFNldCBhbmQgcmV0dXJuCisgICA6YXR0cjpgflBvcGVuLnJldHVybmNvZGVgIGF0dHJpYnV0ZS4KIAogICAgLi4gd2FybmluZzo6CiAKQEAgLTQ3Miw3ICs1MTYsNyBAQAogLi4gbWV0aG9kOjogUG9wZW4udGVybWluYXRlKCkKIAogICAgU3RvcCB0aGUgY2hpbGQuIE9uIFBvc2l4IE9TcyB0aGUgbWV0aG9kIHNlbmRzIFNJR1RFUk0gdG8gdGhlCi0gICBjaGlsZC4gT24gV2luZG93cyB0aGUgV2luMzIgQVBJIGZ1bmN0aW9uIDpjZnVuYzpgVGVybWluYXRlUHJvY2Vzc2AgaXMgY2FsbGVkCisgICBjaGlsZC4gT24gV2luZG93cyB0aGUgV2luMzIgQVBJIGZ1bmN0aW9uIDpjOmZ1bmM6YFRlcm1pbmF0ZVByb2Nlc3NgIGlzIGNhbGxlZAogICAgdG8gc3RvcCB0aGUgY2hpbGQuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNgpAQCAtNDkwLDggKzUzNCw4IEBACiAKIC4uIHdhcm5pbmc6OgogCi0gICBVc2UgOm1ldGg6YGNvbW11bmljYXRlYCByYXRoZXIgdGhhbiA6YXR0cjpgLnN0ZGluLndyaXRlIDxzdGRpbj5gLAotICAgOmF0dHI6YC5zdGRvdXQucmVhZCA8c3Rkb3V0PmAgb3IgOmF0dHI6YC5zdGRlcnIucmVhZCA8c3RkZXJyPmAgdG8gYXZvaWQKKyAgIFVzZSA6bWV0aDpgflBvcGVuLmNvbW11bmljYXRlYCByYXRoZXIgdGhhbiA6YXR0cjpgLnN0ZGluLndyaXRlIDxQb3Blbi5zdGRpbj5gLAorICAgOmF0dHI6YC5zdGRvdXQucmVhZCA8UG9wZW4uc3Rkb3V0PmAgb3IgOmF0dHI6YC5zdGRlcnIucmVhZCA8UG9wZW4uc3RkZXJyPmAgdG8gYXZvaWQKICAgIGRlYWRsb2NrcyBkdWUgdG8gYW55IG9mIHRoZSBvdGhlciBPUyBwaXBlIGJ1ZmZlcnMgZmlsbGluZyB1cCBhbmQgYmxvY2tpbmcgdGhlCiAgICBjaGlsZCBwcm9jZXNzLgogCkBAIC02MzksOCArNjgzLDggQEAKIAogLi4gX3N1YnByb2Nlc3MtcmVwbGFjZW1lbnRzOgogCi1SZXBsYWNpbmcgT2xkZXIgRnVuY3Rpb25zIHdpdGggdGhlIHN1YnByb2Nlc3MgTW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZXBsYWNpbmcgT2xkZXIgRnVuY3Rpb25zIHdpdGggdGhlIDptb2Q6YHN1YnByb2Nlc3NgIE1vZHVsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogSW4gdGhpcyBzZWN0aW9uLCAiYSBiZWNvbWVzIGIiIG1lYW5zIHRoYXQgYiBjYW4gYmUgdXNlZCBhcyBhIHJlcGxhY2VtZW50IGZvciBhLgogCkBAIC02NTIsMTEgKzY5NiwxMSBAQAogCiAgICBJbiBhZGRpdGlvbiwgdGhlIHJlcGxhY2VtZW50cyB1c2luZyA6ZnVuYzpgY2hlY2tfb3V0cHV0YCB3aWxsIGZhaWwgd2l0aCBhCiAgICA6ZXhjOmBDYWxsZWRQcm9jZXNzRXJyb3JgIGlmIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uIHByb2R1Y2VzIGEgbm9uLXplcm8KLSAgIHJldHVybiBjb2RlLiBUaGUgb3V0cHV0IGlzIHN0aWxsIGF2YWlsYWJsZSBhcyB0aGUgYGBvdXRwdXRgYCBhdHRyaWJ1dGUgb2YKLSAgIHRoZSByYWlzZWQgZXhjZXB0aW9uLgorICAgcmV0dXJuIGNvZGUuIFRoZSBvdXRwdXQgaXMgc3RpbGwgYXZhaWxhYmxlIGFzIHRoZQorICAgOmF0dHI6YH5DYWxsZWRQcm9jZXNzRXJyb3Iub3V0cHV0YCBhdHRyaWJ1dGUgb2YgdGhlIHJhaXNlZCBleGNlcHRpb24uCiAKIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMsIHdlIGFzc3VtZSB0aGF0IHRoZSByZWxldmFudCBmdW5jdGlvbnMgaGF2ZSBhbHJlYWR5Ci1iZWVuIGltcG9ydGVkIGZyb20gdGhlIHN1YnByb2Nlc3MgbW9kdWxlLgorYmVlbiBpbXBvcnRlZCBmcm9tIHRoZSA6bW9kOmBzdWJwcm9jZXNzYCBtb2R1bGUuCiAKIAogUmVwbGFjaW5nIC9iaW4vc2ggc2hlbGwgYmFja3F1b3RlCkBAIC02ODUsNyArNzI5LDcgQEAKIHRvIHJlY2VpdmUgYSBTSUdQSVBFIGlmIHAyIGV4aXRzIGJlZm9yZSBwMS4KIAogQWx0ZXJuYXRpdmVseSwgZm9yIHRydXN0ZWQgaW5wdXQsIHRoZSBzaGVsbCdzIG93biBwaXBlbGluZSBzdXBwb3J0IG1heSBzdGlsbAotYmUgdXNlZCBkaXJlY3RseToKK2JlIHVzZWQgZGlyZWN0bHk6OgogCiAgICBvdXRwdXQ9YGRtZXNnIHwgZ3JlcCBoZGFgCiAgICAjIGJlY29tZXMKQEAgLTY5Nyw5ICs3NDEsOSBAQAogCiA6OgogCi0gICBzdHMgPSBvcy5zeXN0ZW0oIm15Y21kIiArICIgbXlhcmciKQorICAgc3RhdHVzID0gb3Muc3lzdGVtKCJteWNtZCIgKyAiIG15YXJnIikKICAgICMgYmVjb21lcwotICAgc3RzID0gY2FsbCgibXljbWQiICsgIiBteWFyZyIsIHNoZWxsPVRydWUpCisgICBzdGF0dXMgPSBzdWJwcm9jZXNzLmNhbGwoIm15Y21kIiArICIgbXlhcmciLCBzaGVsbD1UcnVlKQogCiBOb3RlczoKIApAQCAtNzEzLDcgKzc1Nyw3IEBACiAgICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIkNoaWxkIHdhcyB0ZXJtaW5hdGVkIGJ5IHNpZ25hbCIsIC1yZXRjb2RlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiQ2hpbGQgcmV0dXJuZWQiLCByZXRjb2RlCi0gICBleGNlcHQgT1NFcnJvciwgZToKKyAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CiAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiRXhlY3V0aW9uIGZhaWxlZDoiLCBlCiAKIApAQCAtODIyLDcgKzg2Niw3IEBACiAKICAgIChjaGlsZF9zdGRvdXQsIGNoaWxkX3N0ZGluKSA9IHBvcGVuMi5wb3BlbjIoInNvbWVzdHJpbmciLCBidWZzaXplLCBtb2RlKQogICAgPT0+Ci0gICBwID0gUG9wZW4oWyJzb21lc3RyaW5nIl0sIHNoZWxsPVRydWUsIGJ1ZnNpemU9YnVmc2l6ZSwKKyAgIHAgPSBQb3Blbigic29tZXN0cmluZyIsIHNoZWxsPVRydWUsIGJ1ZnNpemU9YnVmc2l6ZSwKICAgICAgICAgICAgICBzdGRpbj1QSVBFLCBzdGRvdXQ9UElQRSwgY2xvc2VfZmRzPVRydWUpCiAgICAoY2hpbGRfc3Rkb3V0LCBjaGlsZF9zdGRpbikgPSAocC5zdGRvdXQsIHAuc3RkaW4pCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3N1bmF1ZGlvLnJzdCBiL0RvYy9saWJyYXJ5L3N1bmF1ZGlvLnJzdAppbmRleCA5NjM3YjA5Li4xODcyMDRlIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9zdW5hdWRpby5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc3VuYXVkaW8ucnN0CkBAIC04LDcgKzgsNyBAQAogICAgOmRlcHJlY2F0ZWQ6CiAKIC4uIGRlcHJlY2F0ZWQ6OiAyLjYKLSAgIFRoZSA6bW9kOmBzdW5hdWRpb2RldmAgbW9kdWxlIGhhcyBiZWVuIGRlcHJlY2F0ZWQgZm9yIHJlbW92YWwgaW4gUHl0aG9uIDMuMC4KKyAgIFRoZSA6bW9kOmBzdW5hdWRpb2RldmAgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuCiAKIAogCkBAIC05MywxMCArOTMsMTAgQEAKICAgIG5hbWVzIGFuZCBtZWFuaW5ncyBvZiB0aGUgYXR0cmlidXRlcyBhcmUgZGVzY3JpYmVkIGluIGBgPHN1bi9hdWRpb2lvLmg+YGAgYW5kIGluCiAgICB0aGUgOm1hbnBhZ2U6YGF1ZGlvKDdJKWAgbWFudWFsIHBhZ2UuICBNZW1iZXIgbmFtZXMgYXJlIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tCiAgICB0aGVpciBDIGNvdW50ZXJwYXJ0czogYSBzdGF0dXMgb2JqZWN0IGlzIG9ubHkgYSBzaW5nbGUgc3RydWN0dXJlLiBNZW1iZXJzIG9mIHRoZQotICAgOmNkYXRhOmBwbGF5YCBzdWJzdHJ1Y3R1cmUgaGF2ZSBgYG9fYGAgcHJlcGVuZGVkIHRvIHRoZWlyIG5hbWUgYW5kIG1lbWJlcnMgb2YKLSAgIHRoZSA6Y2RhdGE6YHJlY29yZGAgc3RydWN0dXJlIGhhdmUgYGBpX2BgLiBTbywgdGhlIEMgbWVtYmVyCi0gICA6Y2RhdGE6YHBsYXkuc2FtcGxlX3JhdGVgIGlzIGFjY2Vzc2VkIGFzIDphdHRyOmBvX3NhbXBsZV9yYXRlYCwKLSAgIDpjZGF0YTpgcmVjb3JkLmdhaW5gIGFzIDphdHRyOmBpX2dhaW5gIGFuZCA6Y2RhdGE6YG1vbml0b3JfZ2FpbmAgcGxhaW5seSBhcworICAgOmM6ZGF0YTpgcGxheWAgc3Vic3RydWN0dXJlIGhhdmUgYGBvX2BgIHByZXBlbmRlZCB0byB0aGVpciBuYW1lIGFuZCBtZW1iZXJzIG9mCisgICB0aGUgOmM6ZGF0YTpgcmVjb3JkYCBzdHJ1Y3R1cmUgaGF2ZSBgYGlfYGAuIFNvLCB0aGUgQyBtZW1iZXIKKyAgIDpjOmRhdGE6YHBsYXkuc2FtcGxlX3JhdGVgIGlzIGFjY2Vzc2VkIGFzIDphdHRyOmBvX3NhbXBsZV9yYXRlYCwKKyAgIDpjOmRhdGE6YHJlY29yZC5nYWluYCBhcyA6YXR0cjpgaV9nYWluYCBhbmQgOmM6ZGF0YTpgbW9uaXRvcl9nYWluYCBwbGFpbmx5IGFzCiAgICA6YXR0cjpgbW9uaXRvcl9nYWluYC4KIAogCkBAIC0xNTMsNyArMTUzLDcgQEAKICAgIDpkZXByZWNhdGVkOgogCiAuLiBkZXByZWNhdGVkOjogMi42Ci0gICBUaGUgOm1vZDpgU1VOQVVESU9ERVZgIG1vZHVsZSBoYXMgYmVlbiBkZXByZWNhdGVkIGZvciByZW1vdmFsIGluIFB5dGhvbiAzLjAuCisgICBUaGUgOm1vZDpgU1VOQVVESU9ERVZgIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLgogCiAKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc3ltYm9sLnJzdCBiL0RvYy9saWJyYXJ5L3N5bWJvbC5yc3QKaW5kZXggNzVhNDc5Mi4uOGE3MTA5MCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc3ltYm9sLnJzdAorKysgYi9Eb2MvbGlicmFyeS9zeW1ib2wucnN0CkBAIC0yNSwxMCArMjUsMyBAQAogICAgYmFjayB0byBuYW1lIHN0cmluZ3MsIGFsbG93aW5nIG1vcmUgaHVtYW4tcmVhZGFibGUgcmVwcmVzZW50YXRpb24gb2YgcGFyc2UgdHJlZXMKICAgIHRvIGJlIGdlbmVyYXRlZC4KIAotCi0uLiBzZWVhbHNvOjoKLQotICAgTW9kdWxlIDptb2Q6YHBhcnNlcmAKLSAgICAgIFRoZSBzZWNvbmQgZXhhbXBsZSBmb3IgdGhlIDptb2Q6YHBhcnNlcmAgbW9kdWxlIHNob3dzIGhvdyB0byB1c2UgdGhlCi0gICAgICA6bW9kOmBzeW1ib2xgIG1vZHVsZS4KLQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc3lzLnJzdCBiL0RvYy9saWJyYXJ5L3N5cy5yc3QKaW5kZXggYThiNjJkYS4uNDhkMmI1YiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc3lzLnJzdAorKysgYi9Eb2MvbGlicmFyeS9zeXMucnN0CkBAIC0xLDQgKzEsMyBAQAotCiA6bW9kOmBzeXNgIC0tLSBTeXN0ZW0tc3BlY2lmaWMgcGFyYW1ldGVycyBhbmQgZnVuY3Rpb25zCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTIwOCwxNSArMjA3LDE3IEBACiAgICBiZSBzZXQgYXQgYnVpbGQgdGltZSB3aXRoIHRoZSBgYC0tZXhlYy1wcmVmaXhgYCBhcmd1bWVudCB0byB0aGUKICAgIDpwcm9ncmFtOmBjb25maWd1cmVgIHNjcmlwdC4gIFNwZWNpZmljYWxseSwgYWxsIGNvbmZpZ3VyYXRpb24gZmlsZXMgKGUuZy4gdGhlCiAgICA6ZmlsZTpgcHljb25maWcuaGAgaGVhZGVyIGZpbGUpIGFyZSBpbnN0YWxsZWQgaW4gdGhlIGRpcmVjdG9yeQotICAgOmZpbGU6YHtleGVjX3ByZWZpeH0vbGliL3B5dGhvbntYLll9L2NvbmZpZycsIGFuZCBzaGFyZWQgbGlicmFyeSBtb2R1bGVzIGFyZQorICAgOmZpbGU6YHtleGVjX3ByZWZpeH0vbGliL3B5dGhvbntYLll9L2NvbmZpZ2AsIGFuZCBzaGFyZWQgbGlicmFyeSBtb2R1bGVzIGFyZQogICAgaW5zdGFsbGVkIGluIDpmaWxlOmB7ZXhlY19wcmVmaXh9L2xpYi9weXRob257WC5ZfS9saWItZHlubG9hZGAsIHdoZXJlICpYLlkqCiAgICBpcyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgUHl0aG9uLCBmb3IgZXhhbXBsZSBgYDIuN2BgLgogCiAKIC4uIGRhdGE6OiBleGVjdXRhYmxlCiAKLSAgIEEgc3RyaW5nIGdpdmluZyB0aGUgbmFtZSBvZiB0aGUgZXhlY3V0YWJsZSBiaW5hcnkgZm9yIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIsIG9uCi0gICBzeXN0ZW1zIHdoZXJlIHRoaXMgbWFrZXMgc2Vuc2UuCisgICBBIHN0cmluZyBnaXZpbmcgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGV4ZWN1dGFibGUgYmluYXJ5IGZvciB0aGUgUHl0aG9uCisgICBpbnRlcnByZXRlciwgb24gc3lzdGVtcyB3aGVyZSB0aGlzIG1ha2VzIHNlbnNlLiBJZiBQeXRob24gaXMgdW5hYmxlIHRvIHJldHJpZXZlCisgICB0aGUgcmVhbCBwYXRoIHRvIGl0cyBleGVjdXRhYmxlLCA6ZGF0YTpgc3lzLmV4ZWN1dGFibGVgIHdpbGwgYmUgYW4gZW1wdHkgc3RyaW5nCisgICBvciBgYE5vbmVgYC4KIAogCiAuLiBmdW5jdGlvbjo6IGV4aXQoW2FyZ10pCkBAIC0yODQsMTAgKzI4NSwxMyBAQAogICAgOmNvbnN0OmB2ZXJib3NlYCAgICAgICAgICAgICAgOm9wdGlvbjpgLXZgCiAgICA6Y29uc3Q6YHVuaWNvZGVgICAgICAgICAgICAgICA6b3B0aW9uOmAtVWAKICAgIDpjb25zdDpgYnl0ZXNfd2FybmluZ2AgICAgICAgIDpvcHRpb246YC1iYAorICAgOmNvbnN0OmBoYXNoX3JhbmRvbWl6YXRpb25gICAgOm9wdGlvbjpgLVJgCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjYKIAorICAgLi4gdmVyc2lvbmFkZGVkOjogMi43LjMKKyAgICAgIFRoZSBgYGhhc2hfcmFuZG9taXphdGlvbmBgIGF0dHJpYnV0ZS4KIAogLi4gZGF0YTo6IGZsb2F0X2luZm8KIApAQCAtMjk4LDYgKzMwMiw4IEBACiAgICA1LjIuNC4yLjIgb2YgdGhlIDE5OTkgSVNPL0lFQyBDIHN0YW5kYXJkIFtDOTldXywgJ0NoYXJhY3RlcmlzdGljcyBvZgogICAgZmxvYXRpbmcgdHlwZXMnLCBmb3IgZGV0YWlscy4KIAorICAgLi4gdGFidWxhcmNvbHVtbnM6OiB8bHxsfEx8CisKICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgIHwgYXR0cmlidXRlICAgICAgICAgICB8IGZsb2F0LmggbWFjcm8gIHwgZXhwbGFuYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICs9PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKQEAgLTM4OCw3ICszOTQsNyBAQAogCiAuLiBmdW5jdGlvbjo6IGdldGRsb3BlbmZsYWdzKCkKIAotICAgUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBmbGFncyB0aGF0IGFyZSB1c2VkIGZvciA6Y2Z1bmM6YGRsb3BlbmAgY2FsbHMuCisgICBSZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGZsYWdzIHRoYXQgYXJlIHVzZWQgZm9yIDpjOmZ1bmM6YGRsb3BlbmAgY2FsbHMuCiAgICBUaGUgZmxhZyBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gdGhlIDptb2Q6YGRsYCBhbmQgOm1vZDpgRExGQ05gIG1vZHVsZXMuCiAgICBBdmFpbGFiaWxpdHk6IFVuaXguCiAKQEAgLTUzMyw4ICs1MzksOCBAQAogICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAKIAotICAgVGhpcyBmdW5jdGlvbiB3cmFwcyB0aGUgV2luMzIgOmNmdW5jOmBHZXRWZXJzaW9uRXhgIGZ1bmN0aW9uOyBzZWUgdGhlCi0gICBNaWNyb3NvZnQgZG9jdW1lbnRhdGlvbiBvbiA6Y2Z1bmM6YE9TVkVSU0lPTklORk9FWGAgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAgIFRoaXMgZnVuY3Rpb24gd3JhcHMgdGhlIFdpbjMyIDpjOmZ1bmM6YEdldFZlcnNpb25FeGAgZnVuY3Rpb247IHNlZSB0aGUKKyAgIE1pY3Jvc29mdCBkb2N1bWVudGF0aW9uIG9uIDpjOmZ1bmM6YE9TVkVSU0lPTklORk9FWGAgZm9yIG1vcmUgaW5mb3JtYXRpb24KICAgIGFib3V0IHRoZXNlIGZpZWxkcy4KIAogICAgQXZhaWxhYmlsaXR5OiBXaW5kb3dzLgpAQCAtNTk1LDYgKzYwMSw4IEBACiAgICBBIHN0cnVjdCBzZXF1ZW5jZSB0aGF0IGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IFB5dGhvbidzCiAgICBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBpbnRlZ2Vycy4gIFRoZSBhdHRyaWJ1dGVzIGFyZSByZWFkIG9ubHkuCiAKKyAgIC4uIHRhYnVsYXJjb2x1bW5zOjogfGx8THwKKwogICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgIHwgQXR0cmlidXRlICAgICAgICAgICAgICAgfCBFeHBsYW5hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICArPT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KwpAQCAtNjUzLDcgKzY2MSw3IEBACiAgICAgaW1wb3J0ZWQuIFRoZSA6bWV0aDpgZmluZF9tb2R1bGVgIG1ldGhvZCBpcyBjYWxsZWQgYXQgbGVhc3Qgd2l0aCB0aGUKICAgICBhYnNvbHV0ZSBuYW1lIG9mIHRoZSBtb2R1bGUgYmVpbmcgaW1wb3J0ZWQuIElmIHRoZSBtb2R1bGUgdG8gYmUgaW1wb3J0ZWQgaXMKICAgICBjb250YWluZWQgaW4gcGFja2FnZSB0aGVuIHRoZSBwYXJlbnQgcGFja2FnZSdzIDphdHRyOmBfX3BhdGhfX2AgYXR0cmlidXRlCi0gICAgaXMgcGFzc2VkIGluIGFzIGEgc2Vjb25kIGFyZ3VtZW50LiBUaGUgbWV0aG9kIHJldHVybnMgOmtleXdvcmQ6YE5vbmVgIGlmCisgICAgaXMgcGFzc2VkIGluIGFzIGEgc2Vjb25kIGFyZ3VtZW50LiBUaGUgbWV0aG9kIHJldHVybnMgYGBOb25lYGAgaWYKICAgICB0aGUgbW9kdWxlIGNhbm5vdCBiZSBmb3VuZCwgZWxzZSByZXR1cm5zIGEgOnRlcm06YGxvYWRlcmAuCiAKICAgICA6ZGF0YTpgc3lzLm1ldGFfcGF0aGAgaXMgc2VhcmNoZWQgYmVmb3JlIGFueSBpbXBsaWNpdCBkZWZhdWx0IGZpbmRlcnMgb3IKQEAgLTcxMiw3ICs3MjAsNyBAQAogICAgIEEgZGljdGlvbmFyeSBhY3RpbmcgYXMgYSBjYWNoZSBmb3IgOnRlcm06YGZpbmRlcmAgb2JqZWN0cy4gVGhlIGtleXMgYXJlCiAgICAgcGF0aHMgdGhhdCBoYXZlIGJlZW4gcGFzc2VkIHRvIDpkYXRhOmBzeXMucGF0aF9ob29rc2AgYW5kIHRoZSB2YWx1ZXMgYXJlCiAgICAgdGhlIGZpbmRlcnMgdGhhdCBhcmUgZm91bmQuIElmIGEgcGF0aCBpcyBhIHZhbGlkIGZpbGUgc3lzdGVtIHBhdGggYnV0IG5vCi0gICAgZXhwbGljaXQgZmluZGVyIGlzIGZvdW5kIG9uIDpkYXRhOmBzeXMucGF0aF9ob29rc2AgdGhlbiA6a2V5d29yZDpgTm9uZWAgaXMKKyAgICBleHBsaWNpdCBmaW5kZXIgaXMgZm91bmQgb24gOmRhdGE6YHN5cy5wYXRoX2hvb2tzYCB0aGVuIGBgTm9uZWBgIGlzCiAgICAgc3RvcmVkIHRvIHJlcHJlc2VudCB0aGUgaW1wbGljaXQgZGVmYXVsdCBmaW5kZXIgc2hvdWxkIGJlIHVzZWQuIElmIHRoZSBwYXRoCiAgICAgaXMgbm90IGFuIGV4aXN0aW5nIHBhdGggdGhlbiA6Y2xhc3M6YGltcC5OdWxsSW1wb3J0ZXJgIGlzIHNldC4KIApAQCAtNzcwLDkgKzc3OCw5IEBACiAgICBpbmRlcGVuZGVudCBQeXRob24gZmlsZXMgYXJlIGluc3RhbGxlZDsgYnkgZGVmYXVsdCwgdGhpcyBpcyB0aGUgc3RyaW5nCiAgICBgYCcvdXNyL2xvY2FsJ2BgLiAgVGhpcyBjYW4gYmUgc2V0IGF0IGJ1aWxkIHRpbWUgd2l0aCB0aGUgYGAtLXByZWZpeGBgCiAgICBhcmd1bWVudCB0byB0aGUgOnByb2dyYW06YGNvbmZpZ3VyZWAgc2NyaXB0LiAgVGhlIG1haW4gY29sbGVjdGlvbiBvZiBQeXRob24KLSAgIGxpYnJhcnkgbW9kdWxlcyBpcyBpbnN0YWxsZWQgaW4gdGhlIGRpcmVjdG9yeSA6ZmlsZTpge3ByZWZpeH0vbGliL3B5dGhvbntYLll9YGAKKyAgIGxpYnJhcnkgbW9kdWxlcyBpcyBpbnN0YWxsZWQgaW4gdGhlIGRpcmVjdG9yeSA6ZmlsZTpge3ByZWZpeH0vbGliL3B5dGhvbntYLll9YAogICAgd2hpbGUgdGhlIHBsYXRmb3JtIGluZGVwZW5kZW50IGhlYWRlciBmaWxlcyAoYWxsIGV4Y2VwdCA6ZmlsZTpgcHljb25maWcuaGApIGFyZQotICAgc3RvcmVkIGluIDpmaWxlOmB7cHJlZml4fS9pbmNsdWRlL3B5dGhvbntYLll9YGAsIHdoZXJlICpYLlkqIGlzIHRoZSB2ZXJzaW9uCisgICBzdG9yZWQgaW4gOmZpbGU6YHtwcmVmaXh9L2luY2x1ZGUvcHl0aG9ue1guWX1gLCB3aGVyZSAqWC5ZKiBpcyB0aGUgdmVyc2lvbgogICAgbnVtYmVyIG9mIFB5dGhvbiwgZm9yIGV4YW1wbGUgYGAyLjdgYC4KIAogCkBAIC03OTMsMTAgKzgwMSwxMCBAQAogCiAuLiBkYXRhOjogcHkza3dhcm5pbmcKIAotICAgQm9vbCBjb250YWluaW5nIHRoZSBzdGF0dXMgb2YgdGhlIFB5dGhvbiAzLjAgd2FybmluZyBmbGFnLiBJdCdzIGBgVHJ1ZWBgCisgICBCb29sIGNvbnRhaW5pbmcgdGhlIHN0YXR1cyBvZiB0aGUgUHl0aG9uIDMgd2FybmluZyBmbGFnLiBJdCdzIGBgVHJ1ZWBgCiAgICB3aGVuIFB5dGhvbiBpcyBzdGFydGVkIHdpdGggdGhlIC0zIG9wdGlvbi4gIChUaGlzIHNob3VsZCBiZSBjb25zaWRlcmVkCiAgICByZWFkLW9ubHk7IHNldHRpbmcgaXQgdG8gYSBkaWZmZXJlbnQgdmFsdWUgZG9lc24ndCBoYXZlIGFuIGVmZmVjdCBvbgotICAgUHl0aG9uIDMuMCB3YXJuaW5ncy4pCisgICBQeXRob24gMyB3YXJuaW5ncy4pCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNgogCkBAIC04MjcsNyArODM1LDcgQEAKIAogLi4gZnVuY3Rpb246OiBzZXRkbG9wZW5mbGFncyhuKQogCi0gICBTZXQgdGhlIGZsYWdzIHVzZWQgYnkgdGhlIGludGVycHJldGVyIGZvciA6Y2Z1bmM6YGRsb3BlbmAgY2FsbHMsIHN1Y2ggYXMgd2hlbgorICAgU2V0IHRoZSBmbGFncyB1c2VkIGJ5IHRoZSBpbnRlcnByZXRlciBmb3IgOmM6ZnVuYzpgZGxvcGVuYCBjYWxscywgc3VjaCBhcyB3aGVuCiAgICB0aGUgaW50ZXJwcmV0ZXIgbG9hZHMgZXh0ZW5zaW9uIG1vZHVsZXMuICBBbW9uZyBvdGhlciB0aGluZ3MsIHRoaXMgd2lsbCBlbmFibGUgYQogICAgbGF6eSByZXNvbHZpbmcgb2Ygc3ltYm9scyB3aGVuIGltcG9ydGluZyBhIG1vZHVsZSwgaWYgY2FsbGVkIGFzCiAgICBgYHN5cy5zZXRkbG9wZW5mbGFncygwKWBgLiAgVG8gc2hhcmUgc3ltYm9scyBhY3Jvc3MgZXh0ZW5zaW9uIG1vZHVsZXMsIGNhbGwgYXMKQEAgLTEwNjksNSArMTA3Nyw1IEBACiAKIC4uIHJ1YnJpYzo6IENpdGF0aW9ucwogCi0uLiBbQzk5XSBJU08vSUVDIDk4OTk6MTk5OS4gICJQcm9ncmFtbWluZyBsYW5ndWFnZXMgLS0gQy4iICBBIHB1YmxpYyBkcmFmdCBvZiB0aGlzIHN0YW5kYXJkIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cxNC93d3cvZG9jcy9uMTI1Ni5wZGYgLgorLi4gW0M5OV0gSVNPL0lFQyA5ODk5OjE5OTkuICAiUHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIC0tIEMuIiAgQSBwdWJsaWMgZHJhZnQgb2YgdGhpcyBzdGFuZGFyZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMTQvd3d3L2RvY3MvbjEyNTYucGRmXCAuCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3N5c2NvbmZpZy5yc3QgYi9Eb2MvbGlicmFyeS9zeXNjb25maWcucnN0CmluZGV4IDViYTZmYTIuLmE3NDVhM2QgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3N5c2NvbmZpZy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc3lzY29uZmlnLnJzdApAQCAtMTI5LDcgKzEyOSw3IEBACiAgICBvbmUgbWF5IGNhbGwgdGhpcyBmdW5jdGlvbiBhbmQgZ2V0IHRoZSBkZWZhdWx0IHZhbHVlLgogCiAgICBJZiAqc2NoZW1lKiBpcyBwcm92aWRlZCwgaXQgbXVzdCBiZSBhIHZhbHVlIGZyb20gdGhlIGxpc3QgcmV0dXJuZWQgYnkKLSAgIDpmdW5jOmBnZXRfcGF0aF9uYW1lc2AuICBPdGhlcndpc2UsIHRoZSBkZWZhdWx0IHNjaGVtZSBmb3IgdGhlIGN1cnJlbnQKKyAgIDpmdW5jOmBnZXRfc2NoZW1lX25hbWVzYC4gIE90aGVyd2lzZSwgdGhlIGRlZmF1bHQgc2NoZW1lIGZvciB0aGUgY3VycmVudAogICAgcGxhdGZvcm0gaXMgdXNlZC4KIAogICAgSWYgKnZhcnMqIGlzIHByb3ZpZGVkLCBpdCBtdXN0IGJlIGEgZGljdGlvbmFyeSBvZiB2YXJpYWJsZXMgdGhhdCB3aWxsIHVwZGF0ZQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc3lzbG9nLnJzdCBiL0RvYy9saWJyYXJ5L3N5c2xvZy5yc3QKaW5kZXggN2IxYTM0MC4uOWI2NmFiZiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc3lzbG9nLnJzdAorKysgYi9Eb2MvbGlicmFyeS9zeXNsb2cucnN0CkBAIC0xNyw3ICsxNyw4IEBACiBUaGUgbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CiAKIAotLi4gZnVuY3Rpb246OiBzeXNsb2coW3ByaW9yaXR5LF0gbWVzc2FnZSkKKy4uIGZ1bmN0aW9uOjogc3lzbG9nKG1lc3NhZ2UpCisgICAgICAgICAgICAgIHN5c2xvZyhwcmlvcml0eSwgbWVzc2FnZSkKIAogICAgU2VuZCB0aGUgc3RyaW5nICptZXNzYWdlKiB0byB0aGUgc3lzdGVtIGxvZ2dlci4gIEEgdHJhaWxpbmcgbmV3bGluZSBpcyBhZGRlZAogICAgaWYgbmVjZXNzYXJ5LiAgRWFjaCBtZXNzYWdlIGlzIHRhZ2dlZCB3aXRoIGEgcHJpb3JpdHkgY29tcG9zZWQgb2YgYQpAQCAtMzAsNyArMzEsNyBAQAogICAgYGBvcGVubG9nKClgYCB3aWxsIGJlIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cy4KIAogCi0uLiBmdW5jdGlvbjo6IG9wZW5sb2coW2lkZW50WywgbG9nb3B0WywgZmFjaWxpdHldXV0pCisuLiBmdW5jdGlvbjo6IG9wZW5sb2coW2lkZW50WywgbG9nb3B0aW9uWywgZmFjaWxpdHldXV0pCiAKICAgIExvZ2dpbmcgb3B0aW9ucyBvZiBzdWJzZXF1ZW50IDpmdW5jOmBzeXNsb2dgIGNhbGxzIGNhbiBiZSBzZXQgYnkgY2FsbGluZwogICAgOmZ1bmM6YG9wZW5sb2dgLiAgOmZ1bmM6YHN5c2xvZ2Agd2lsbCBjYWxsIDpmdW5jOmBvcGVubG9nYCB3aXRoIG5vIGFyZ3VtZW50cwpAQCAtMzgsNyArMzksNyBAQAogCiAgICBUaGUgb3B0aW9uYWwgKmlkZW50KiBrZXl3b3JkIGFyZ3VtZW50IGlzIGEgc3RyaW5nIHdoaWNoIGlzIHByZXBlbmRlZCB0byBldmVyeQogICAgbWVzc2FnZSwgYW5kIGRlZmF1bHRzIHRvIGBgc3lzLmFyZ3ZbMF1gYCB3aXRoIGxlYWRpbmcgcGF0aCBjb21wb25lbnRzCi0gICBzdHJpcHBlZC4gIFRoZSBvcHRpb25hbCAqbG9nb3B0KiBrZXl3b3JkIGFyZ3VtZW50IChkZWZhdWx0IGlzIDApIGlzIGEgYml0CisgICBzdHJpcHBlZC4gIFRoZSBvcHRpb25hbCAqbG9nb3B0aW9uKiBrZXl3b3JkIGFyZ3VtZW50IChkZWZhdWx0IGlzIDApIGlzIGEgYml0CiAgICBmaWVsZCAtLSBzZWUgYmVsb3cgZm9yIHBvc3NpYmxlIHZhbHVlcyB0byBjb21iaW5lLiAgVGhlIG9wdGlvbmFsICpmYWNpbGl0eSoKICAgIGtleXdvcmQgYXJndW1lbnQgKGRlZmF1bHQgaXMgOmNvbnN0OmBMT0dfVVNFUmApIHNldHMgdGhlIGRlZmF1bHQgZmFjaWxpdHkgZm9yCiAgICBtZXNzYWdlcyB3aGljaCBkbyBub3QgaGF2ZSBhIGZhY2lsaXR5IGV4cGxpY2l0bHkgZW5jb2RlZC4KQEAgLTczLDcgKzc0LDggQEAKIEZhY2lsaXRpZXM6CiAgICA6Y29uc3Q6YExPR19LRVJOYCwgOmNvbnN0OmBMT0dfVVNFUmAsIDpjb25zdDpgTE9HX01BSUxgLCA6Y29uc3Q6YExPR19EQUVNT05gLAogICAgOmNvbnN0OmBMT0dfQVVUSGAsIDpjb25zdDpgTE9HX0xQUmAsIDpjb25zdDpgTE9HX05FV1NgLCA6Y29uc3Q6YExPR19VVUNQYCwKLSAgIDpjb25zdDpgTE9HX0NST05gIGFuZCA6Y29uc3Q6YExPR19MT0NBTDBgIHRvIDpjb25zdDpgTE9HX0xPQ0FMN2AuCisgICA6Y29uc3Q6YExPR19DUk9OYCwgOmNvbnN0OmBMT0dfU1lTTE9HYCBhbmQgOmNvbnN0OmBMT0dfTE9DQUwwYCB0bworICAgOmNvbnN0OmBMT0dfTE9DQUw3YC4KIAogTG9nIG9wdGlvbnM6CiAgICA6Y29uc3Q6YExPR19QSURgLCA6Y29uc3Q6YExPR19DT05TYCwgOmNvbnN0OmBMT0dfTkRFTEFZYCwgOmNvbnN0OmBMT0dfTk9XQUlUYApAQCAtOTgsNSArMTAwLDUgQEAKIGxvZ2dlZCBtZXNzYWdlcywgYW5kIHdyaXRlIHRoZSBtZXNzYWdlcyB0byB0aGUgZGVzdGluYXRpb24gZmFjaWxpdHkgdXNlZCBmb3IKIG1haWwgbG9nZ2luZzo6CiAKLSAgIHN5c2xvZy5vcGVubG9nKGxvZ29wdD1zeXNsb2cuTE9HX1BJRCwgZmFjaWxpdHk9c3lzbG9nLkxPR19NQUlMKQorICAgc3lzbG9nLm9wZW5sb2cobG9nb3B0aW9uPXN5c2xvZy5MT0dfUElELCBmYWNpbGl0eT1zeXNsb2cuTE9HX01BSUwpCiAgICBzeXNsb2cuc3lzbG9nKCdFLW1haWwgcHJvY2Vzc2luZyBpbml0aWF0ZWQuLi4nKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdGFyZmlsZS5yc3QgYi9Eb2MvbGlicmFyeS90YXJmaWxlLnJzdAppbmRleCA1NTAyYWRjLi5iZDIxOGUxIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS90YXJmaWxlLnJzdAorKysgYi9Eb2MvbGlicmFyeS90YXJmaWxlLnJzdApAQCAtMTYsNyArMTYsOCBAQAogCiBUaGUgOm1vZDpgdGFyZmlsZWAgbW9kdWxlIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJlYWQgYW5kIHdyaXRlIHRhcgogYXJjaGl2ZXMsIGluY2x1ZGluZyB0aG9zZSB1c2luZyBnemlwIG9yIGJ6MiBjb21wcmVzc2lvbi4KLSg6ZmlsZTpgLnppcGAgZmlsZXMgY2FuIGJlIHJlYWQgYW5kIHdyaXR0ZW4gdXNpbmcgdGhlIDptb2Q6YHppcGZpbGVgIG1vZHVsZS4pCitVc2UgdGhlIDptb2Q6YHppcGZpbGVgIG1vZHVsZSB0byByZWFkIG9yIHdyaXRlIDpmaWxlOmAuemlwYCBmaWxlcywgb3IgdGhlCitoaWdoZXItbGV2ZWwgZnVuY3Rpb25zIGluIDpyZWY6YHNodXRpbCA8YXJjaGl2aW5nLW9wZXJhdGlvbnM+YC4KIAogU29tZSBmYWN0cyBhbmQgZmlndXJlczoKIApAQCAtNzYsNiArNzcsMTAgQEAKICAgIElmICpmaWxlb2JqKiBpcyBzcGVjaWZpZWQsIGl0IGlzIHVzZWQgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gYSBmaWxlIG9iamVjdCBvcGVuZWQKICAgIGZvciAqbmFtZSouIEl0IGlzIHN1cHBvc2VkIHRvIGJlIGF0IHBvc2l0aW9uIDAuCiAKKyAgIEZvciBtb2RlcyBgYCd3Omd6J2BgLCBgYCdyOmd6J2BgLCBgYCd3OmJ6MidgYCwgYGAncjpiejInYGAsIDpmdW5jOmB0YXJmaWxlLm9wZW5gCisgICBhY2NlcHRzIHRoZSBrZXl3b3JkIGFyZ3VtZW50ICpjb21wcmVzc2xldmVsKiB0byBzcGVjaWZ5IHRoZSBjb21wcmVzc2lvbiBsZXZlbCBvZgorICAgdGhlIGZpbGUuCisKICAgIEZvciBzcGVjaWFsIHB1cnBvc2VzLCB0aGVyZSBpcyBhIHNlY29uZCBmb3JtYXQgZm9yICptb2RlKjoKICAgIGBgJ2ZpbGVtb2RlfFtjb21wcmVzc2lvbl0nYGAuICA6ZnVuYzpgdGFyZmlsZS5vcGVuYCB3aWxsIHJldHVybiBhIDpjbGFzczpgVGFyRmlsZWAKICAgIG9iamVjdCB0aGF0IHByb2Nlc3NlcyBpdHMgZGF0YSBhcyBhIHN0cmVhbSBvZiBibG9ja3MuICBObyByYW5kb20gc2Vla2luZyB3aWxsCkBAIC0xNDIsNyArMTQ3LDcgQEAKIAogCiAgICAuLiBkZXByZWNhdGVkOjogMi42Ci0gICAgICBUaGUgOmNsYXNzOmBUYXJGaWxlQ29tcGF0YCBjbGFzcyBoYXMgYmVlbiBkZXByZWNhdGVkIGZvciByZW1vdmFsIGluIFB5dGhvbiAzLjAuCisgICAgICBUaGUgOmNsYXNzOmBUYXJGaWxlQ29tcGF0YCBjbGFzcyBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLgogCiAKIC4uIGV4Y2VwdGlvbjo6IFRhckVycm9yCkBAIC0zMDQsNyArMzA5LDcgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNgogCiAKLS4uIG1ldGhvZDo6IFRhckZpbGUub3BlbiguLi4pCisuLiBjbGFzc21ldGhvZDo6IFRhckZpbGUub3BlbiguLi4pCiAKICAgIEFsdGVybmF0aXZlIGNvbnN0cnVjdG9yLiBUaGUgOmZ1bmM6YHRhcmZpbGUub3BlbmAgZnVuY3Rpb24gaXMgYWN0dWFsbHkgYQogICAgc2hvcnRjdXQgdG8gdGhpcyBjbGFzc21ldGhvZC4KQEAgLTU0Myw3ICs1NDgsNyBAQAogICAgOmNvbnN0OmBBUkVHVFlQRWAsIDpjb25zdDpgTE5LVFlQRWAsIDpjb25zdDpgU1lNVFlQRWAsIDpjb25zdDpgRElSVFlQRWAsCiAgICA6Y29uc3Q6YEZJRk9UWVBFYCwgOmNvbnN0OmBDT05UVFlQRWAsIDpjb25zdDpgQ0hSVFlQRWAsIDpjb25zdDpgQkxLVFlQRWAsCiAgICA6Y29uc3Q6YEdOVVRZUEVfU1BBUlNFYC4gIFRvIGRldGVybWluZSB0aGUgdHlwZSBvZiBhIDpjbGFzczpgVGFySW5mb2Agb2JqZWN0Ci0gICBtb3JlIGNvbnZlbmllbnRseSwgdXNlIHRoZSBgYGlzXyooKWBgIG1ldGhvZHMgYmVsb3cuCisgICBtb3JlIGNvbnZlbmllbnRseSwgdXNlIHRoZSBgYGlzKigpYGAgbWV0aG9kcyBiZWxvdy4KIAogCiAuLiBhdHRyaWJ1dGU6OiBUYXJJbmZvLmxpbmtuYW1lCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS90ZWxuZXRsaWIucnN0IGIvRG9jL2xpYnJhcnkvdGVsbmV0bGliLnJzdAppbmRleCBmNjM0MGE5Li5hMzAxOWY1IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS90ZWxuZXRsaWIucnN0CisrKyBiL0RvYy9saWJyYXJ5L3RlbG5ldGxpYi5yc3QKQEAgLTE4OSw3ICsxODksNyBAQAogICAgUmVhZCB1bnRpbCBvbmUgZnJvbSBhIGxpc3Qgb2YgYSByZWd1bGFyIGV4cHJlc3Npb25zIG1hdGNoZXMuCiAKICAgIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIGxpc3Qgb2YgcmVndWxhciBleHByZXNzaW9ucywgZWl0aGVyIGNvbXBpbGVkCi0gICAoOmNsYXNzOmByZS5SZWdleE9iamVjdGAgaW5zdGFuY2VzKSBvciB1bmNvbXBpbGVkIChzdHJpbmdzKS4gVGhlIG9wdGlvbmFsIHNlY29uZAorICAgKDpjbGFzczpgcmVnZXggb2JqZWN0cyA8cmUtb2JqZWN0cz5gKSBvciB1bmNvbXBpbGVkIChzdHJpbmdzKS4gVGhlIG9wdGlvbmFsIHNlY29uZAogICAgYXJndW1lbnQgaXMgYSB0aW1lb3V0LCBpbiBzZWNvbmRzOyB0aGUgZGVmYXVsdCBpcyB0byBibG9jayBpbmRlZmluaXRlbHkuCiAKICAgIFJldHVybiBhIHR1cGxlIG9mIHRocmVlIGl0ZW1zOiB0aGUgaW5kZXggaW4gdGhlIGxpc3Qgb2YgdGhlIGZpcnN0IHJlZ3VsYXIKQEAgLTIwOCw3ICsyMDgsNyBAQAogLi4gbWV0aG9kOjogVGVsbmV0LnNldF9vcHRpb25fbmVnb3RpYXRpb25fY2FsbGJhY2soY2FsbGJhY2spCiAKICAgIEVhY2ggdGltZSBhIHRlbG5ldCBvcHRpb24gaXMgcmVhZCBvbiB0aGUgaW5wdXQgZmxvdywgdGhpcyAqY2FsbGJhY2sqIChpZiBzZXQpIGlzCi0gICBjYWxsZWQgd2l0aCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgOiBjYWxsYmFjayh0ZWxuZXQgc29ja2V0LCBjb21tYW5kCisgICBjYWxsZWQgd2l0aCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6IGNhbGxiYWNrKHRlbG5ldCBzb2NrZXQsIGNvbW1hbmQKICAgIChETy9ET05UL1dJTEwvV09OVCksIG9wdGlvbikuICBObyBvdGhlciBhY3Rpb24gaXMgZG9uZSBhZnRlcndhcmRzIGJ5IHRlbG5ldGxpYi4KIAogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS90ZW1wZmlsZS5yc3QgYi9Eb2MvbGlicmFyeS90ZW1wZmlsZS5yc3QKaW5kZXggOTM2ZjA2YS4uODI3ZjVmNSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdGVtcGZpbGUucnN0CisrKyBiL0RvYy9saWJyYXJ5L3RlbXBmaWxlLnJzdApAQCAtODYsMTMgKzg2LDE0IEBACiAgICBkYXRhIGlzIHNwb29sZWQgaW4gbWVtb3J5IHVudGlsIHRoZSBmaWxlIHNpemUgZXhjZWVkcyAqbWF4X3NpemUqLCBvcgogICAgdW50aWwgdGhlIGZpbGUncyA6ZnVuYzpgZmlsZW5vYCBtZXRob2QgaXMgY2FsbGVkLCBhdCB3aGljaCBwb2ludCB0aGUKICAgIGNvbnRlbnRzIGFyZSB3cml0dGVuIHRvIGRpc2sgYW5kIG9wZXJhdGlvbiBwcm9jZWVkcyBhcyB3aXRoCi0gICA6ZnVuYzpgVGVtcG9yYXJ5RmlsZWAuCisgICA6ZnVuYzpgVGVtcG9yYXJ5RmlsZWAuICBBbHNvLCBpdCdzIGBgdHJ1bmNhdGVgYCBtZXRob2QgZG9lcyBub3QKKyAgIGFjY2VwdCBhIGBgc2l6ZWBgIGFyZ3VtZW50LgogCiAgICBUaGUgcmVzdWx0aW5nIGZpbGUgaGFzIG9uZSBhZGRpdGlvbmFsIG1ldGhvZCwgOmZ1bmM6YHJvbGxvdmVyYCwgd2hpY2gKICAgIGNhdXNlcyB0aGUgZmlsZSB0byByb2xsIG92ZXIgdG8gYW4gb24tZGlzayBmaWxlIHJlZ2FyZGxlc3Mgb2YgaXRzIHNpemUuCiAKICAgIFRoZSByZXR1cm5lZCBvYmplY3QgaXMgYSBmaWxlLWxpa2Ugb2JqZWN0IHdob3NlIDphdHRyOmBfZmlsZWAgYXR0cmlidXRlCi0gICBpcyBlaXRoZXIgYSA6Y2xhc3M6YFN0cmluZ0lPYCBvYmplY3Qgb3IgYSB0cnVlIGZpbGUgb2JqZWN0LCBkZXBlbmRpbmcgb24KKyAgIGlzIGVpdGhlciBhIDpjbGFzczpgflN0cmluZ0lPLlN0cmluZ0lPYCBvYmplY3Qgb3IgYSB0cnVlIGZpbGUgb2JqZWN0LCBkZXBlbmRpbmcgb24KICAgIHdoZXRoZXIgOmZ1bmM6YHJvbGxvdmVyYCBoYXMgYmVlbiBjYWxsZWQuIFRoaXMgZmlsZS1saWtlIG9iamVjdCBjYW4gYmUKICAgIHVzZWQgaW4gYSA6a2V5d29yZDpgd2l0aGAgc3RhdGVtZW50LCBqdXN0IGxpa2UgYSBub3JtYWwgZmlsZS4KIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdGVzdC5yc3QgYi9Eb2MvbGlicmFyeS90ZXN0LnJzdAppbmRleCAzYTBiNWNiLi40MzRlZjVhIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS90ZXN0LnJzdAorKysgYi9Eb2MvbGlicmFyeS90ZXN0LnJzdApAQCAtMTY5LDEwICsxNjksMTAgQEAKIHRoZSB0ZXN0IHBhc3NlZCBvciBmYWlsZWQgYW5kIHRodXMgbWluaW1pemUgb3V0cHV0LgogCiBSdW5uaW5nIDptb2Q6YHRlc3QucmVncnRlc3RgIGRpcmVjdGx5IGFsbG93cyB3aGF0IHJlc291cmNlcyBhcmUgYXZhaWxhYmxlIGZvcgotdGVzdHMgdG8gdXNlIHRvIGJlIHNldC4gWW91IGRvIHRoaXMgYnkgdXNpbmcgdGhlIDpvcHRpb246YC11YCBjb21tYW5kLWxpbmUKLW9wdGlvbi4gUnVuIDpwcm9ncmFtOmBweXRob24gLW0gdGVzdC5yZWdydGVzdCAtdWFsbGAgdG8gdHVybiBvbiBhbGwKLXJlc291cmNlczsgc3BlY2lmeWluZyBgYGFsbGBgIGFzIGFuIG9wdGlvbiBmb3IgYGAtdWBgIGVuYWJsZXMgYWxsCi1wb3NzaWJsZSByZXNvdXJjZXMuIElmIGFsbCBidXQgb25lIHJlc291cmNlIGlzIGRlc2lyZWQgKGEgbW9yZSBjb21tb24gY2FzZSksIGEKK3Rlc3RzIHRvIHVzZSB0byBiZSBzZXQuIFlvdSBkbyB0aGlzIGJ5IHVzaW5nIHRoZSBgYC11YGAgY29tbWFuZC1saW5lCitvcHRpb24uIFNwZWNpZnlpbmcgYGBhbGxgYCBhcyB0aGUgdmFsdWUgZm9yIHRoZSBgYC11YGAgb3B0aW9uIGVuYWJsZXMgYWxsCitwb3NzaWJsZSByZXNvdXJjZXM6IDpwcm9ncmFtOmBweXRob24gLW0gdGVzdCAtdWFsbGAuCitJZiBhbGwgYnV0IG9uZSByZXNvdXJjZSBpcyBkZXNpcmVkIChhIG1vcmUgY29tbW9uIGNhc2UpLCBhCiBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgbm90IGRlc2lyZWQgbWF5IGJlIGxpc3RlZCBhZnRlcgogYGBhbGxgYC4gVGhlIGNvbW1hbmQgOnByb2dyYW06YHB5dGhvbiAtbSB0ZXN0LnJlZ3J0ZXN0IC11YWxsLC1hdWRpbywtbGFyZ2VmaWxlYAogd2lsbCBydW4gOm1vZDpgdGVzdC5yZWdydGVzdGAgd2l0aCBhbGwgcmVzb3VyY2VzIGV4Y2VwdCB0aGUgYGBhdWRpb2BgIGFuZApAQCAtMzgwLDcgKzM4MCw3IEBACiAKICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgczoKICAgICAgICAgICBwcmludCAiaGVsbG8iCi0gICAgICBhc3NlcnQgcy5nZXR2YWx1ZSgpID09ICJoZWxsbyIKKyAgICAgIGFzc2VydCBzLmdldHZhbHVlKCkgPT0gImhlbGxvXG4iCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS90ZXh0d3JhcC5yc3QgYi9Eb2MvbGlicmFyeS90ZXh0d3JhcC5yc3QKaW5kZXggODRlNmVlMS4uYTUwNjAwZSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdGV4dHdyYXAucnN0CisrKyBiL0RvYy9saWJyYXJ5L3RleHR3cmFwLnJzdApAQCAtMjYsNiArMjYsOSBAQAogICAgT3B0aW9uYWwga2V5d29yZCBhcmd1bWVudHMgY29ycmVzcG9uZCB0byB0aGUgaW5zdGFuY2UgYXR0cmlidXRlcyBvZgogICAgOmNsYXNzOmBUZXh0V3JhcHBlcmAsIGRvY3VtZW50ZWQgYmVsb3cuICAqd2lkdGgqIGRlZmF1bHRzIHRvIGBgNzBgYC4KIAorICAgU2VlIHRoZSA6bWV0aDpgVGV4dFdyYXBwZXIud3JhcGAgbWV0aG9kIGZvciBhZGRpdGlvbmFsIGRldGFpbHMgb24gaG93CisgICA6ZnVuYzpgd3JhcGAgYmVoYXZlcy4KKwogCiAuLiBmdW5jdGlvbjo6IGZpbGwodGV4dFssIHdpZHRoWywgLi4uXV0pCiAKQEAgLTExMiw5ICsxMTUsMTEgQEAKIAogICAgLi4gYXR0cmlidXRlOjogcmVwbGFjZV93aGl0ZXNwYWNlCiAKLSAgICAgIChkZWZhdWx0OiBgYFRydWVgYCkgSWYgdHJ1ZSwgZWFjaCB3aGl0ZXNwYWNlIGNoYXJhY3RlciAoYXMgZGVmaW5lZCBieQotICAgICAgYGBzdHJpbmcud2hpdGVzcGFjZWBgKSByZW1haW5pbmcgYWZ0ZXIgdGFiIGV4cGFuc2lvbiB3aWxsIGJlIHJlcGxhY2VkIGJ5IGEKLSAgICAgIHNpbmdsZSBzcGFjZS4KKyAgICAgIChkZWZhdWx0OiBgYFRydWVgYCkgSWYgdHJ1ZSwgYWZ0ZXIgdGFiIGV4cGFuc2lvbiBidXQgYmVmb3JlIHdyYXBwaW5nLAorICAgICAgdGhlIDptZXRoOmB3cmFwYCBtZXRob2Qgd2lsbCByZXBsYWNlIGVhY2ggd2hpdGVzcGFjZSBjaGFyYWN0ZXIKKyAgICAgIHdpdGggYSBzaW5nbGUgc3BhY2UuICBUaGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHJlcGxhY2VkIGFyZQorICAgICAgYXMgZm9sbG93czogdGFiLCBuZXdsaW5lLCB2ZXJ0aWNhbCB0YWIsIGZvcm1mZWVkLCBhbmQgY2FycmlhZ2UKKyAgICAgIHJldHVybiAoYGAnXHRcblx2XGZccidgYCkuCiAKICAgICAgIC4uIG5vdGU6OgogCkBAIC0xMzIsOSArMTM3LDExIEBACiAKICAgIC4uIGF0dHJpYnV0ZTo6IGRyb3Bfd2hpdGVzcGFjZQogCi0gICAgICAoZGVmYXVsdDogYGBUcnVlYGApIElmIHRydWUsIHdoaXRlc3BhY2UgdGhhdCwgYWZ0ZXIgd3JhcHBpbmcsIGhhcHBlbnMgdG8KLSAgICAgIGVuZCB1cCBhdCB0aGUgYmVnaW5uaW5nIG9yIGVuZCBvZiBhIGxpbmUgaXMgZHJvcHBlZCAobGVhZGluZyB3aGl0ZXNwYWNlIGluCi0gICAgICB0aGUgZmlyc3QgbGluZSBpcyBhbHdheXMgcHJlc2VydmVkLCB0aG91Z2gpLgorICAgICAgKGRlZmF1bHQ6IGBgVHJ1ZWBgKSBJZiB0cnVlLCB3aGl0ZXNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZGluZyBvZgorICAgICAgZXZlcnkgbGluZSAoYWZ0ZXIgd3JhcHBpbmcgYnV0IGJlZm9yZSBpbmRlbnRpbmcpIGlzIGRyb3BwZWQuCisgICAgICBXaGl0ZXNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhcmFncmFwaCwgaG93ZXZlciwgaXMgbm90IGRyb3BwZWQKKyAgICAgIGlmIG5vbi13aGl0ZXNwYWNlIGZvbGxvd3MgaXQuICBJZiB3aGl0ZXNwYWNlIGJlaW5nIGRyb3BwZWQgdGFrZXMgdXAgYW4KKyAgICAgIGVudGlyZSBsaW5lLCB0aGUgd2hvbGUgbGluZSBpcyBkcm9wcGVkLgogCiAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjYKICAgICAgICAgIFdoaXRlc3BhY2Ugd2FzIGFsd2F5cyBkcm9wcGVkIGluIGVhcmxpZXIgdmVyc2lvbnMuCkBAIC0xNDMsNyArMTUwLDggQEAKICAgIC4uIGF0dHJpYnV0ZTo6IGluaXRpYWxfaW5kZW50CiAKICAgICAgIChkZWZhdWx0OiBgYCcnYGApIFN0cmluZyB0aGF0IHdpbGwgYmUgcHJlcGVuZGVkIHRvIHRoZSBmaXJzdCBsaW5lIG9mCi0gICAgICB3cmFwcGVkIG91dHB1dC4gIENvdW50cyB0b3dhcmRzIHRoZSBsZW5ndGggb2YgdGhlIGZpcnN0IGxpbmUuCisgICAgICB3cmFwcGVkIG91dHB1dC4gIENvdW50cyB0b3dhcmRzIHRoZSBsZW5ndGggb2YgdGhlIGZpcnN0IGxpbmUuICBUaGUgZW1wdHkKKyAgICAgIHN0cmluZyBpcyBub3QgaW5kZW50ZWQuCiAKIAogICAgLi4gYXR0cmlidXRlOjogc3Vic2VxdWVudF9pbmRlbnQKQEAgLTIwNiw4ICsyMTQsOSBAQAogCiAgICAgICBXcmFwcyB0aGUgc2luZ2xlIHBhcmFncmFwaCBpbiAqdGV4dCogKGEgc3RyaW5nKSBzbyBldmVyeSBsaW5lIGlzIGF0IG1vc3QKICAgICAgIDphdHRyOmB3aWR0aGAgY2hhcmFjdGVycyBsb25nLiAgQWxsIHdyYXBwaW5nIG9wdGlvbnMgYXJlIHRha2VuIGZyb20KLSAgICAgIGluc3RhbmNlIGF0dHJpYnV0ZXMgb2YgdGhlIDpjbGFzczpgVGV4dFdyYXBwZXJgIGluc3RhbmNlLiBSZXR1cm5zIGEgbGlzdAotICAgICAgb2Ygb3V0cHV0IGxpbmVzLCB3aXRob3V0IGZpbmFsIG5ld2xpbmVzLgorICAgICAgaW5zdGFuY2UgYXR0cmlidXRlcyBvZiB0aGUgOmNsYXNzOmBUZXh0V3JhcHBlcmAgaW5zdGFuY2UuICBSZXR1cm5zIGEgbGlzdAorICAgICAgb2Ygb3V0cHV0IGxpbmVzLCB3aXRob3V0IGZpbmFsIG5ld2xpbmVzLiAgSWYgdGhlIHdyYXBwZWQgb3V0cHV0IGhhcyBubworICAgICAgY29udGVudCwgdGhlIHJldHVybmVkIGxpc3QgaXMgZW1wdHkuCiAKIAogICAgLi4gbWV0aG9kOjogZmlsbCh0ZXh0KQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdGhyZWFkLnJzdCBiL0RvYy9saWJyYXJ5L3RocmVhZC5yc3QKaW5kZXggN2U4ZDVjOC4uOGE2MjVmOCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdGhyZWFkLnJzdAorKysgYi9Eb2MvbGlicmFyeS90aHJlYWQucnN0CkBAIC01LDkgKzUsOSBAQAogICAgOnN5bm9wc2lzOiBDcmVhdGUgbXVsdGlwbGUgdGhyZWFkcyBvZiBjb250cm9sIHdpdGhpbiBvbmUgaW50ZXJwcmV0ZXIuCiAKIC4uIG5vdGU6OgotICAgVGhlIDptb2Q6YHRocmVhZGAgbW9kdWxlIGhhcyBiZWVuIHJlbmFtZWQgdG8gOm1vZDpgX3RocmVhZGAgaW4gUHl0aG9uIDMuMC4KKyAgIFRoZSA6bW9kOmB0aHJlYWRgIG1vZHVsZSBoYXMgYmVlbiByZW5hbWVkIHRvIDptb2Q6YF90aHJlYWRgIGluIFB5dGhvbiAzLgogICAgVGhlIDp0ZXJtOmAydG8zYCB0b29sIHdpbGwgYXV0b21hdGljYWxseSBhZGFwdCBpbXBvcnRzIHdoZW4gY29udmVydGluZyB5b3VyCi0gICBzb3VyY2VzIHRvIDMuMDsgaG93ZXZlciwgeW91IHNob3VsZCBjb25zaWRlciB1c2luZyB0aGUgaGlnaC1sZXZlbAorICAgc291cmNlcyB0byBQeXRob24gMzsgaG93ZXZlciwgeW91IHNob3VsZCBjb25zaWRlciB1c2luZyB0aGUgaGlnaC1sZXZlbAogICAgOm1vZDpgdGhyZWFkaW5nYCBtb2R1bGUgaW5zdGVhZC4KIAogCkBAIC0xNTksMTAgKzE1OSw2IEBACiAqIENhbGxpbmcgOmZ1bmM6YHN5cy5leGl0YCBvciByYWlzaW5nIHRoZSA6ZXhjOmBTeXN0ZW1FeGl0YCBleGNlcHRpb24gaXMKICAgZXF1aXZhbGVudCB0byBjYWxsaW5nIDpmdW5jOmB0aHJlYWQuZXhpdGAuCiAKLSogTm90IGFsbCBidWlsdC1pbiBmdW5jdGlvbnMgdGhhdCBtYXkgYmxvY2sgd2FpdGluZyBmb3IgSS9PIGFsbG93IG90aGVyIHRocmVhZHMKLSAgdG8gcnVuLiAgKFRoZSBtb3N0IHBvcHVsYXIgb25lcyAoOmZ1bmM6YHRpbWUuc2xlZXBgLCA6bWV0aDpgZmlsZS5yZWFkYCwKLSAgOmZ1bmM6YHNlbGVjdC5zZWxlY3RgKSB3b3JrIGFzIGV4cGVjdGVkLikKLQogKiBJdCBpcyBub3QgcG9zc2libGUgdG8gaW50ZXJydXB0IHRoZSA6bWV0aDpgYWNxdWlyZWAgbWV0aG9kIG9uIGEgbG9jayAtLS0gdGhlCiAgIDpleGM6YEtleWJvYXJkSW50ZXJydXB0YCBleGNlcHRpb24gd2lsbCBoYXBwZW4gYWZ0ZXIgdGhlIGxvY2sgaGFzIGJlZW4gYWNxdWlyZWQuCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3RocmVhZGluZy5yc3QgYi9Eb2MvbGlicmFyeS90aHJlYWRpbmcucnN0CmluZGV4IDI4YTNmODEuLmEyNGMzODUgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3RocmVhZGluZy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdGhyZWFkaW5nLnJzdApAQCAtMzEsMTAgKzMxLDEwIEBACiAKIC4uIGltcGwtZGV0YWlsOjoKIAotICAgRHVlIHRvIHRoZSA6dGVybTpgR2xvYmFsIEludGVycHJldGVyIExvY2tgLCBpbiBDUHl0aG9uIG9ubHkgb25lIHRocmVhZAorICAgSW4gQ1B5dGhvbiwgZHVlIHRvIHRoZSA6dGVybTpgR2xvYmFsIEludGVycHJldGVyIExvY2tgLCBvbmx5IG9uZSB0aHJlYWQKICAgIGNhbiBleGVjdXRlIFB5dGhvbiBjb2RlIGF0IG9uY2UgKGV2ZW4gdGhvdWdoIGNlcnRhaW4gcGVyZm9ybWFuY2Utb3JpZW50ZWQKICAgIGxpYnJhcmllcyBtaWdodCBvdmVyY29tZSB0aGlzIGxpbWl0YXRpb24pLgotICAgSWYgeW91IHdhbnQgeW91ciBhcHBsaWNhdGlvbiB0byBtYWtlIGJldHRlciBvZiB1c2Ugb2YgdGhlIGNvbXB1dGF0aW9uYWwKKyAgIElmIHlvdSB3YW50IHlvdXIgYXBwbGljYXRpb24gdG8gbWFrZSBiZXR0ZXIgdXNlIG9mIHRoZSBjb21wdXRhdGlvbmFsCiAgICByZXNvdXJjZXMgb2YgbXVsdGktY29yZSBtYWNoaW5lcywgeW91IGFyZSBhZHZpc2VkIHRvIHVzZQogICAgOm1vZDpgbXVsdGlwcm9jZXNzaW5nYC4gSG93ZXZlciwgdGhyZWFkaW5nIGlzIHN0aWxsIGFuIGFwcHJvcHJpYXRlIG1vZGVsCiAgICBpZiB5b3Ugd2FudCB0byBydW4gbXVsdGlwbGUgSS9PLWJvdW5kIHRhc2tzIHNpbXVsdGFuZW91c2x5LgpAQCAtNDgsNiArNDgsOSBAQAogICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgOmNsYXNzOmBUaHJlYWRgIG9iamVjdHMgY3VycmVudGx5IGFsaXZlLiAgVGhlIHJldHVybmVkCiAgICBjb3VudCBpcyBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IHJldHVybmVkIGJ5IDpmdW5jOmAuZW51bWVyYXRlYC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjYKKyAgICAgIEFkZGVkIGBgYWN0aXZlX2NvdW50KClgYCBzcGVsbGluZy4KKwogCiAuLiBmdW5jdGlvbjo6IENvbmRpdGlvbigpCiAgICA6bm9pbmRleDoKQEAgLTY3LDYgKzcwLDkgQEAKICAgIDptb2Q6YHRocmVhZGluZ2AgbW9kdWxlLCBhIGR1bW15IHRocmVhZCBvYmplY3Qgd2l0aCBsaW1pdGVkIGZ1bmN0aW9uYWxpdHkgaXMKICAgIHJldHVybmVkLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNgorICAgICAgQWRkZWQgYGBjdXJyZW50X3RocmVhZCgpYGAgc3BlbGxpbmcuCisKIAogLi4gZnVuY3Rpb246OiBlbnVtZXJhdGUoKQogCkBAIC0xNjcsNyArMTczLDcgQEAKIAogICAgU2V0IGEgdHJhY2UgZnVuY3Rpb24gZm9yIGFsbCB0aHJlYWRzIHN0YXJ0ZWQgZnJvbSB0aGUgOm1vZDpgdGhyZWFkaW5nYCBtb2R1bGUuCiAgICBUaGUgKmZ1bmMqIHdpbGwgYmUgcGFzc2VkIHRvICA6ZnVuYzpgc3lzLnNldHRyYWNlYCBmb3IgZWFjaCB0aHJlYWQsIGJlZm9yZSBpdHMKLSAgIDptZXRoOmBydW5gIG1ldGhvZCBpcyBjYWxsZWQuCisgICA6bWV0aDpgflRocmVhZC5ydW5gIG1ldGhvZCBpcyBjYWxsZWQuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMwogCkBAIC0xNzgsNyArMTg0LDcgQEAKIAogICAgU2V0IGEgcHJvZmlsZSBmdW5jdGlvbiBmb3IgYWxsIHRocmVhZHMgc3RhcnRlZCBmcm9tIHRoZSA6bW9kOmB0aHJlYWRpbmdgIG1vZHVsZS4KICAgIFRoZSAqZnVuYyogd2lsbCBiZSBwYXNzZWQgdG8gIDpmdW5jOmBzeXMuc2V0cHJvZmlsZWAgZm9yIGVhY2ggdGhyZWFkLCBiZWZvcmUgaXRzCi0gICA6bWV0aDpgcnVuYCBtZXRob2QgaXMgY2FsbGVkLgorICAgOm1ldGg6YH5UaHJlYWQucnVuYCBtZXRob2QgaXMgY2FsbGVkLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjMKIApAQCAtMjAyLDYgKzIwOCwxMyBAQAogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjUKIAorCisuLiBleGNlcHRpb246OiBUaHJlYWRFcnJvcgorCisgICBSYWlzZWQgZm9yIHZhcmlvdXMgdGhyZWFkaW5nLXJlbGF0ZWQgZXJyb3JzIGFzIGRlc2NyaWJlZCBiZWxvdy4gIE5vdGUgdGhhdAorICAgbWFueSBpbnRlcmZhY2VzIHVzZSA6ZXhjOmBSdW50aW1lRXJyb3JgIGluc3RlYWQgb2YgOmV4YzpgVGhyZWFkRXJyb3JgLgorCisKIERldGFpbGVkIGludGVyZmFjZXMgZm9yIHRoZSBvYmplY3RzIGFyZSBkb2N1bWVudGVkIGJlbG93LgogCiBUaGUgZGVzaWduIG9mIHRoaXMgbW9kdWxlIGlzIGxvb3NlbHkgYmFzZWQgb24gSmF2YSdzIHRocmVhZGluZyBtb2RlbC4gSG93ZXZlciwKQEAgLTI0Nyw2ICsyNjAsMTIgQEAKIGluaXRpYWwgdmFsdWUgaXMgaW5oZXJpdGVkIGZyb20gdGhlIGNyZWF0aW5nIHRocmVhZC4gIFRoZSBmbGFnIGNhbiBiZSBzZXQKIHRocm91Z2ggdGhlIDphdHRyOmBkYWVtb25gIHByb3BlcnR5LgogCisuLiBub3RlOjoKKyAgIERhZW1vbiB0aHJlYWRzIGFyZSBhYnJ1cHRseSBzdG9wcGVkIGF0IHNodXRkb3duLiAgVGhlaXIgcmVzb3VyY2VzIChzdWNoCisgICBhcyBvcGVuIGZpbGVzLCBkYXRhYmFzZSB0cmFuc2FjdGlvbnMsIGV0Yy4pIG1heSBub3QgYmUgcmVsZWFzZWQgcHJvcGVybHkuCisgICBJZiB5b3Ugd2FudCB5b3VyIHRocmVhZHMgdG8gc3RvcCBncmFjZWZ1bGx5LCBtYWtlIHRoZW0gbm9uLWRhZW1vbmljIGFuZAorICAgdXNlIGEgc3VpdGFibGUgc2lnbmFsbGluZyBtZWNoYW5pc20gc3VjaCBhcyBhbiA6Y2xhc3M6YEV2ZW50YC4KKwogVGhlcmUgaXMgYSAibWFpbiB0aHJlYWQiIG9iamVjdDsgdGhpcyBjb3JyZXNwb25kcyB0byB0aGUgaW5pdGlhbCB0aHJlYWQgb2YKIGNvbnRyb2wgaW4gdGhlIFB5dGhvbiBwcm9ncmFtLiAgSXQgaXMgbm90IGEgZGFlbW9uIHRocmVhZC4KIApAQCAtMzIyLDE3ICszNDEsMTkgQEAKICAgICAgIDptZXRoOmBqb2luYCBhIHRocmVhZCBiZWZvcmUgaXQgaGFzIGJlZW4gc3RhcnRlZCBhbmQgYXR0ZW1wdHMgdG8gZG8gc28KICAgICAgIHJhaXNlcyB0aGUgc2FtZSBleGNlcHRpb24uCiAKLSAgIC4uIG1ldGhvZDo6IGdldE5hbWUoKQotICAgICAgICAgICAgICAgc2V0TmFtZSgpCi0KLSAgICAgIE9sZCBBUEkgZm9yIDphdHRyOmB+VGhyZWFkLm5hbWVgLgotCiAgICAuLiBhdHRyaWJ1dGU6OiBuYW1lCiAKICAgICAgIEEgc3RyaW5nIHVzZWQgZm9yIGlkZW50aWZpY2F0aW9uIHB1cnBvc2VzIG9ubHkuIEl0IGhhcyBubyBzZW1hbnRpY3MuCiAgICAgICBNdWx0aXBsZSB0aHJlYWRzIG1heSBiZSBnaXZlbiB0aGUgc2FtZSBuYW1lLiAgVGhlIGluaXRpYWwgbmFtZSBpcyBzZXQgYnkKICAgICAgIHRoZSBjb25zdHJ1Y3Rvci4KIAorICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMi42CisKKyAgIC4uIG1ldGhvZDo6IGdldE5hbWUoKQorICAgICAgICAgICAgICAgc2V0TmFtZSgpCisKKyAgICAgIFByZS0yLjYgQVBJIGZvciA6YXR0cjpgflRocmVhZC5uYW1lYC4KKwogICAgLi4gYXR0cmlidXRlOjogaWRlbnQKIAogICAgICAgVGhlICd0aHJlYWQgaWRlbnRpZmllcicgb2YgdGhpcyB0aHJlYWQgb3IgYGBOb25lYGAgaWYgdGhlIHRocmVhZCBoYXMgbm90CkBAIC0zNTIsMTAgKzM3Myw4IEBACiAgICAgICB1bnRpbCBqdXN0IGFmdGVyIHRoZSA6bWV0aDpgcnVuYCBtZXRob2QgdGVybWluYXRlcy4gIFRoZSBtb2R1bGUgZnVuY3Rpb24KICAgICAgIDpmdW5jOmAuZW51bWVyYXRlYCByZXR1cm5zIGEgbGlzdCBvZiBhbGwgYWxpdmUgdGhyZWFkcy4KIAotICAgLi4gbWV0aG9kOjogaXNEYWVtb24oKQotICAgICAgICAgICAgICAgc2V0RGFlbW9uKCkKLQotICAgICAgT2xkIEFQSSBmb3IgOmF0dHI6YH5UaHJlYWQuZGFlbW9uYC4KKyAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi42CisgICAgICAgICBBZGRlZCBgYGlzX2FsaXZlKClgYCBzcGVsbGluZy4KIAogICAgLi4gYXR0cmlidXRlOjogZGFlbW9uCiAKQEAgLTM2OCw2ICszODcsMTMgQEAKIAogICAgICAgVGhlIGVudGlyZSBQeXRob24gcHJvZ3JhbSBleGl0cyB3aGVuIG5vIGFsaXZlIG5vbi1kYWVtb24gdGhyZWFkcyBhcmUgbGVmdC4KIAorICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMi42CisKKyAgIC4uIG1ldGhvZDo6IGlzRGFlbW9uKCkKKyAgICAgICAgICAgICAgIHNldERhZW1vbigpCisKKyAgICAgIFByZS0yLjYgQVBJIGZvciA6YXR0cjpgflRocmVhZC5kYWVtb25gLgorCiAKIC4uIF9sb2NrLW9iamVjdHM6CiAKQEAgLTM4Nyw3ICs0MTMsNyBAQAogdGhlbiB0aGUgOm1ldGg6YGFjcXVpcmVgIGNhbGwgcmVzZXRzIGl0IHRvIGxvY2tlZCBhbmQgcmV0dXJucy4gIFRoZQogOm1ldGg6YHJlbGVhc2VgIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgaW4gdGhlIGxvY2tlZCBzdGF0ZTsgaXQgY2hhbmdlcyB0aGUKIHN0YXRlIHRvIHVubG9ja2VkIGFuZCByZXR1cm5zIGltbWVkaWF0ZWx5LiBJZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gcmVsZWFzZSBhbgotdW5sb2NrZWQgbG9jaywgYSA6ZXhjOmBSdW50aW1lRXJyb3JgIHdpbGwgYmUgcmFpc2VkLgordW5sb2NrZWQgbG9jaywgYSA6ZXhjOmBUaHJlYWRFcnJvcmAgd2lsbCBiZSByYWlzZWQuCiAKIFdoZW4gbW9yZSB0aGFuIG9uZSB0aHJlYWQgaXMgYmxvY2tlZCBpbiA6bWV0aDpgYWNxdWlyZWAgd2FpdGluZyBmb3IgdGhlIHN0YXRlIHRvCiB0dXJuIHRvIHVubG9ja2VkLCBvbmx5IG9uZSB0aHJlYWQgcHJvY2VlZHMgd2hlbiBhIDptZXRoOmByZWxlYXNlYCBjYWxsIHJlc2V0cwpAQCAtNDAxLDE1ICs0MjcsMTIgQEAKIAogICAgQWNxdWlyZSBhIGxvY2ssIGJsb2NraW5nIG9yIG5vbi1ibG9ja2luZy4KIAotICAgV2hlbiBpbnZva2VkIHdpdGhvdXQgYXJndW1lbnRzLCBibG9jayB1bnRpbCB0aGUgbG9jayBpcyB1bmxvY2tlZCwgdGhlbiBzZXQgaXQgdG8KLSAgIGxvY2tlZCwgYW5kIHJldHVybiB0cnVlLgorICAgV2hlbiBpbnZva2VkIHdpdGggdGhlICpibG9ja2luZyogYXJndW1lbnQgc2V0IHRvIGBgVHJ1ZWBgICh0aGUgZGVmYXVsdCksCisgICBibG9jayB1bnRpbCB0aGUgbG9jayBpcyB1bmxvY2tlZCwgdGhlbiBzZXQgaXQgdG8gbG9ja2VkIGFuZCByZXR1cm4gYGBUcnVlYGAuCiAKLSAgIFdoZW4gaW52b2tlZCB3aXRoIHRoZSAqYmxvY2tpbmcqIGFyZ3VtZW50IHNldCB0byB0cnVlLCBkbyB0aGUgc2FtZSB0aGluZyBhcyB3aGVuCi0gICBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMsIGFuZCByZXR1cm4gdHJ1ZS4KLQotICAgV2hlbiBpbnZva2VkIHdpdGggdGhlICpibG9ja2luZyogYXJndW1lbnQgc2V0IHRvIGZhbHNlLCBkbyBub3QgYmxvY2suICBJZiBhIGNhbGwKLSAgIHdpdGhvdXQgYW4gYXJndW1lbnQgd291bGQgYmxvY2ssIHJldHVybiBmYWxzZSBpbW1lZGlhdGVseTsgb3RoZXJ3aXNlLCBkbyB0aGUKLSAgIHNhbWUgdGhpbmcgYXMgd2hlbiBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMsIGFuZCByZXR1cm4gdHJ1ZS4KKyAgIFdoZW4gaW52b2tlZCB3aXRoIHRoZSAqYmxvY2tpbmcqIGFyZ3VtZW50IHNldCB0byBgYEZhbHNlYGAsIGRvIG5vdCBibG9jay4KKyAgIElmIGEgY2FsbCB3aXRoICpibG9ja2luZyogc2V0IHRvIGBgVHJ1ZWBgIHdvdWxkIGJsb2NrLCByZXR1cm4gYGBGYWxzZWBgCisgICBpbW1lZGlhdGVseTsgb3RoZXJ3aXNlLCBzZXQgdGhlIGxvY2sgdG8gbG9ja2VkIGFuZCByZXR1cm4gYGBUcnVlYGAuCiAKIAogLi4gbWV0aG9kOjogTG9jay5yZWxlYXNlKCkKQEAgLTQyMCw3ICs0NDMsNyBAQAogICAgYXJlIGJsb2NrZWQgd2FpdGluZyBmb3IgdGhlIGxvY2sgdG8gYmVjb21lIHVubG9ja2VkLCBhbGxvdyBleGFjdGx5IG9uZSBvZiB0aGVtCiAgICB0byBwcm9jZWVkLgogCi0gICBEbyBub3QgY2FsbCB0aGlzIG1ldGhvZCB3aGVuIHRoZSBsb2NrIGlzIHVubG9ja2VkLgorICAgV2hlbiBpbnZva2VkIG9uIGFuIHVubG9ja2VkIGxvY2ssIGEgOmV4YzpgVGhyZWFkRXJyb3JgIGlzIHJhaXNlZC4KIAogICAgVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlLgogCkBAIC01OTksNiArNjIyLDkgQEAKICAgICAgIGNhbGxpbmcgdGhyZWFkIGhhcyBub3QgYWNxdWlyZWQgdGhlIGxvY2sgd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGEKICAgICAgIDpleGM6YFJ1bnRpbWVFcnJvcmAgaXMgcmFpc2VkLgogCisgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNgorICAgICAgICAgQWRkZWQgYGBub3RpZnlfYWxsKClgYCBzcGVsbGluZy4KKwogCiAuLiBfc2VtYXBob3JlLW9iamVjdHM6CiAKQEAgLTY5OCw3ICs3MjQsNyBAQAogICAgICAgUmV0dXJuIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGludGVybmFsIGZsYWcgaXMgdHJ1ZS4KIAogICAgICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjYKLSAgICAgICAgIFRoZSBgYGlzX3NldCgpYGAgc3ludGF4IGlzIG5ldy4KKyAgICAgICAgIEFkZGVkIGBgaXNfc2V0KClgYCBzcGVsbGluZy4KIAogICAgLi4gbWV0aG9kOjogc2V0KCkKIApAQCAtNzM5LDEwICs3NjUsMTEgQEAKIG9mIHRpbWUgaGFzIHBhc3NlZCAtLS0gYSB0aW1lci4gIDpjbGFzczpgVGltZXJgIGlzIGEgc3ViY2xhc3Mgb2YgOmNsYXNzOmBUaHJlYWRgCiBhbmQgYXMgc3VjaCBhbHNvIGZ1bmN0aW9ucyBhcyBhbiBleGFtcGxlIG9mIGNyZWF0aW5nIGN1c3RvbSB0aHJlYWRzLgogCi1UaW1lcnMgYXJlIHN0YXJ0ZWQsIGFzIHdpdGggdGhyZWFkcywgYnkgY2FsbGluZyB0aGVpciA6bWV0aDpgc3RhcnRgIG1ldGhvZC4gIFRoZQotdGltZXIgY2FuIGJlIHN0b3BwZWQgKGJlZm9yZSBpdHMgYWN0aW9uIGhhcyBiZWd1bikgYnkgY2FsbGluZyB0aGUgOm1ldGg6YGNhbmNlbGAKLW1ldGhvZC4gIFRoZSBpbnRlcnZhbCB0aGUgdGltZXIgd2lsbCB3YWl0IGJlZm9yZSBleGVjdXRpbmcgaXRzIGFjdGlvbiBtYXkgbm90IGJlCi1leGFjdGx5IHRoZSBzYW1lIGFzIHRoZSBpbnRlcnZhbCBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCitUaW1lcnMgYXJlIHN0YXJ0ZWQsIGFzIHdpdGggdGhyZWFkcywgYnkgY2FsbGluZyB0aGVpciA6bWV0aDpgflRpbWVyLnN0YXJ0YAorbWV0aG9kLiAgVGhlIHRpbWVyIGNhbiBiZSBzdG9wcGVkIChiZWZvcmUgaXRzIGFjdGlvbiBoYXMgYmVndW4pIGJ5IGNhbGxpbmcgdGhlCis6bWV0aDpgflRpbWVyLmNhbmNlbGAgbWV0aG9kLiAgVGhlIGludGVydmFsIHRoZSB0aW1lciB3aWxsIHdhaXQgYmVmb3JlCitleGVjdXRpbmcgaXRzIGFjdGlvbiBtYXkgbm90IGJlIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIGludGVydmFsIHNwZWNpZmllZCBieQordGhlIHVzZXIuCiAKIEZvciBleGFtcGxlOjoKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdGltZS5yc3QgYi9Eb2MvbGlicmFyeS90aW1lLnJzdAppbmRleCAxOGE4YmM2Li4wNGRkZWY5IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS90aW1lLnJzdAorKysgYi9Eb2MvbGlicmFyeS90aW1lLnJzdApAQCAtNzEsMTEgKzcxLDExIEBACiAgIHRoZSB1bml0cyBpbiB3aGljaCB0aGVpciB2YWx1ZSBvciBhcmd1bWVudCBpcyBleHByZXNzZWQuIEUuZy4gb24gbW9zdCBVbml4CiAgIHN5c3RlbXMsIHRoZSBjbG9jayAidGlja3MiIG9ubHkgNTAgb3IgMTAwIHRpbWVzIGEgc2Vjb25kLgogCi0qIE9uIHRoZSBvdGhlciBoYW5kLCB0aGUgcHJlY2lzaW9uIG9mIDpmdW5jOmB0aW1lYCBhbmQgOmZ1bmM6YHNsZWVwYCBpcyBiZXR0ZXIKKyogT24gdGhlIG90aGVyIGhhbmQsIHRoZSBwcmVjaXNpb24gb2YgOmZ1bmM6YC50aW1lYCBhbmQgOmZ1bmM6YHNsZWVwYCBpcyBiZXR0ZXIKICAgdGhhbiB0aGVpciBVbml4IGVxdWl2YWxlbnRzOiB0aW1lcyBhcmUgZXhwcmVzc2VkIGFzIGZsb2F0aW5nIHBvaW50IG51bWJlcnMsCi0gIDpmdW5jOmB0aW1lYCByZXR1cm5zIHRoZSBtb3N0IGFjY3VyYXRlIHRpbWUgYXZhaWxhYmxlICh1c2luZyBVbml4Ci0gIDpjZnVuYzpgZ2V0dGltZW9mZGF5YCB3aGVyZSBhdmFpbGFibGUpLCBhbmQgOmZ1bmM6YHNsZWVwYCB3aWxsIGFjY2VwdCBhIHRpbWUKLSAgd2l0aCBhIG5vbnplcm8gZnJhY3Rpb24gKFVuaXggOmNmdW5jOmBzZWxlY3RgIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoaXMsIHdoZXJlCisgIDpmdW5jOmAudGltZWAgcmV0dXJucyB0aGUgbW9zdCBhY2N1cmF0ZSB0aW1lIGF2YWlsYWJsZSAodXNpbmcgVW5peAorICA6YzpmdW5jOmBnZXR0aW1lb2ZkYXlgIHdoZXJlIGF2YWlsYWJsZSksIGFuZCA6ZnVuYzpgc2xlZXBgIHdpbGwgYWNjZXB0IGEgdGltZQorICB3aXRoIGEgbm9uemVybyBmcmFjdGlvbiAoVW5peCA6YzpmdW5jOmBzZWxlY3RgIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoaXMsIHdoZXJlCiAgIGF2YWlsYWJsZSkuCiAKICogVGhlIHRpbWUgdmFsdWUgYXMgcmV0dXJuZWQgYnkgOmZ1bmM6YGdtdGltZWAsIDpmdW5jOmBsb2NhbHRpbWVgLCBhbmQKQEAgLTE1Niw3ICsxNTYsNyBAQAogCiAgICBPbiBXaW5kb3dzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgd2FsbC1jbG9jayBzZWNvbmRzIGVsYXBzZWQgc2luY2UgdGhlIGZpcnN0CiAgICBjYWxsIHRvIHRoaXMgZnVuY3Rpb24sIGFzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCBiYXNlZCBvbiB0aGUgV2luMzIgZnVuY3Rpb24KLSAgIDpjZnVuYzpgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXJgLiBUaGUgcmVzb2x1dGlvbiBpcyB0eXBpY2FsbHkgYmV0dGVyIHRoYW4gb25lCisgICA6YzpmdW5jOmBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcmAuIFRoZSByZXNvbHV0aW9uIGlzIHR5cGljYWxseSBiZXR0ZXIgdGhhbiBvbmUKICAgIG1pY3Jvc2Vjb25kLgogCiAKQEAgLTE2NCw3ICsxNjQsNyBAQAogCiAgICBDb252ZXJ0IGEgdGltZSBleHByZXNzZWQgaW4gc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2ggdG8gYSBzdHJpbmcgcmVwcmVzZW50aW5nCiAgICBsb2NhbCB0aW1lLiBJZiAqc2VjcyogaXMgbm90IHByb3ZpZGVkIG9yIDpjb25zdDpgTm9uZWAsIHRoZSBjdXJyZW50IHRpbWUgYXMKLSAgIHJldHVybmVkIGJ5IDpmdW5jOmB0aW1lYCBpcyB1c2VkLiAgYGBjdGltZShzZWNzKWBgIGlzIGVxdWl2YWxlbnQgdG8KKyAgIHJldHVybmVkIGJ5IDpmdW5jOmAudGltZWAgaXMgdXNlZC4gIGBgY3RpbWUoc2VjcylgYCBpcyBlcXVpdmFsZW50IHRvCiAgICBgYGFzY3RpbWUobG9jYWx0aW1lKHNlY3MpKWBgLiBMb2NhbGUgaW5mb3JtYXRpb24gaXMgbm90IHVzZWQgYnkgOmZ1bmM6YGN0aW1lYC4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjEKQEAgLTE4Myw3ICsxODMsNyBAQAogCiAgICBDb252ZXJ0IGEgdGltZSBleHByZXNzZWQgaW4gc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2ggdG8gYSA6Y2xhc3M6YHN0cnVjdF90aW1lYCBpbgogICAgVVRDIGluIHdoaWNoIHRoZSBkc3QgZmxhZyBpcyBhbHdheXMgemVyby4gIElmICpzZWNzKiBpcyBub3QgcHJvdmlkZWQgb3IKLSAgIDpjb25zdDpgTm9uZWAsIHRoZSBjdXJyZW50IHRpbWUgYXMgcmV0dXJuZWQgYnkgOmZ1bmM6YHRpbWVgIGlzIHVzZWQuICBGcmFjdGlvbnMKKyAgIDpjb25zdDpgTm9uZWAsIHRoZSBjdXJyZW50IHRpbWUgYXMgcmV0dXJuZWQgYnkgOmZ1bmM6YC50aW1lYCBpcyB1c2VkLiAgRnJhY3Rpb25zCiAgICBvZiBhIHNlY29uZCBhcmUgaWdub3JlZC4gIFNlZSBhYm92ZSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUKICAgIDpjbGFzczpgc3RydWN0X3RpbWVgIG9iamVjdC4gU2VlIDpmdW5jOmBjYWxlbmRhci50aW1lZ21gIGZvciB0aGUgaW52ZXJzZSBvZiB0aGlzCiAgICBmdW5jdGlvbi4KQEAgLTE5OCw3ICsxOTgsNyBAQAogLi4gZnVuY3Rpb246OiBsb2NhbHRpbWUoW3NlY3NdKQogCiAgICBMaWtlIDpmdW5jOmBnbXRpbWVgIGJ1dCBjb252ZXJ0cyB0byBsb2NhbCB0aW1lLiAgSWYgKnNlY3MqIGlzIG5vdCBwcm92aWRlZCBvcgotICAgOmNvbnN0OmBOb25lYCwgdGhlIGN1cnJlbnQgdGltZSBhcyByZXR1cm5lZCBieSA6ZnVuYzpgdGltZWAgaXMgdXNlZC4gIFRoZSBkc3QKKyAgIDpjb25zdDpgTm9uZWAsIHRoZSBjdXJyZW50IHRpbWUgYXMgcmV0dXJuZWQgYnkgOmZ1bmM6YC50aW1lYCBpcyB1c2VkLiAgVGhlIGRzdAogICAgZmxhZyBpcyBzZXQgdG8gYGAxYGAgd2hlbiBEU1QgYXBwbGllcyB0byB0aGUgZ2l2ZW4gdGltZS4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjEKQEAgLTIxMyw3ICsyMTMsNyBAQAogICAgVGhpcyBpcyB0aGUgaW52ZXJzZSBmdW5jdGlvbiBvZiA6ZnVuYzpgbG9jYWx0aW1lYC4gIEl0cyBhcmd1bWVudCBpcyB0aGUKICAgIDpjbGFzczpgc3RydWN0X3RpbWVgIG9yIGZ1bGwgOS10dXBsZSAoc2luY2UgdGhlIGRzdCBmbGFnIGlzIG5lZWRlZDsgdXNlIGBgLTFgYAogICAgYXMgdGhlIGRzdCBmbGFnIGlmIGl0IGlzIHVua25vd24pIHdoaWNoIGV4cHJlc3NlcyB0aGUgdGltZSBpbiAqbG9jYWwqIHRpbWUsIG5vdAotICAgVVRDLiAgSXQgcmV0dXJucyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCA6ZnVuYzpgdGltZWAuCisgICBVVEMuICBJdCByZXR1cm5zIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIDpmdW5jOmAudGltZWAuCiAgICBJZiB0aGUgaW5wdXQgdmFsdWUgY2Fubm90IGJlIHJlcHJlc2VudGVkIGFzIGEgdmFsaWQgdGltZSwgZWl0aGVyCiAgICA6ZXhjOmBPdmVyZmxvd0Vycm9yYCBvciA6ZXhjOmBWYWx1ZUVycm9yYCB3aWxsIGJlIHJhaXNlZCAod2hpY2ggZGVwZW5kcyBvbgogICAgd2hldGhlciB0aGUgaW52YWxpZCB2YWx1ZSBpcyBjYXVnaHQgYnkgUHl0aG9uIG9yIHRoZSB1bmRlcmx5aW5nIEMgbGlicmFyaWVzKS4KQEAgLTIzNiw3ICsyMzYsOSBAQAogICAgOmZ1bmM6YGdtdGltZWAgb3IgOmZ1bmM6YGxvY2FsdGltZWAgdG8gYSBzdHJpbmcgYXMgc3BlY2lmaWVkIGJ5IHRoZSAqZm9ybWF0KgogICAgYXJndW1lbnQuICBJZiAqdCogaXMgbm90IHByb3ZpZGVkLCB0aGUgY3VycmVudCB0aW1lIGFzIHJldHVybmVkIGJ5CiAgICA6ZnVuYzpgbG9jYWx0aW1lYCBpcyB1c2VkLiAgKmZvcm1hdCogbXVzdCBiZSBhIHN0cmluZy4gIDpleGM6YFZhbHVlRXJyb3JgIGlzCi0gICByYWlzZWQgaWYgYW55IGZpZWxkIGluICp0KiBpcyBvdXRzaWRlIG9mIHRoZSBhbGxvd2VkIHJhbmdlLgorICAgcmFpc2VkIGlmIGFueSBmaWVsZCBpbiAqdCogaXMgb3V0c2lkZSBvZiB0aGUgYWxsb3dlZCByYW5nZS4gOmZ1bmM6YHN0cmZ0aW1lYAorICAgcmV0dXJucyBhIGxvY2FsZSBkZXBlZGVudCBieXRlIHN0cmluZzsgdGhlIHJlc3VsdCBtYXkgYmUgY29udmVydGVkIHRvIHVuaWNvZGUKKyAgIGJ5IGRvaW5nIGBgc3RyZnRpbWUoPG15Zm9ybWF0PikuZGVjb2RlKGxvY2FsZS5nZXRsb2NhbGUoKVsxXSlgYC4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjEKICAgICAgIEFsbG93ZWQgKnQqIHRvIGJlIG9taXR0ZWQuCkBAIC0yNDYsNyArMjQ4LDcgQEAKIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjUKICAgICAgIDAgaXMgbm93IGEgbGVnYWwgYXJndW1lbnQgZm9yIGFueSBwb3NpdGlvbiBpbiB0aGUgdGltZSB0dXBsZTsgaWYgaXQgaXMgbm9ybWFsbHkKLSAgICAgIGlsbGVnYWwgdGhlIHZhbHVlIGlzIGZvcmNlZCB0byBhIGNvcnJlY3Qgb25lLi4KKyAgICAgIGlsbGVnYWwgdGhlIHZhbHVlIGlzIGZvcmNlZCB0byBhIGNvcnJlY3Qgb25lLgogCiAgICBUaGUgZm9sbG93aW5nIGRpcmVjdGl2ZXMgY2FuIGJlIGVtYmVkZGVkIGluIHRoZSAqZm9ybWF0KiBzdHJpbmcuIFRoZXkgYXJlIHNob3duCiAgICB3aXRob3V0IHRoZSBvcHRpb25hbCBmaWVsZCB3aWR0aCBhbmQgcHJlY2lzaW9uIHNwZWNpZmljYXRpb24sIGFuZCBhcmUgcmVwbGFjZWQKQEAgLTM1MCw4ICszNTIsMTAgQEAKICAgICAgID4+PiBzdHJmdGltZSgiJWEsICVkICViICVZICVIOiVNOiVTICswMDAwIiwgZ210aW1lKCkpCiAgICAgICAnVGh1LCAyOCBKdW4gMjAwMSAxNDoxNzoxNSArMDAwMCcKIAotICAgQWRkaXRpb25hbCBkaXJlY3RpdmVzIG1heSBiZSBzdXBwb3J0ZWQgb24gY2VydGFpbiBwbGF0Zm9ybXMsIGJ1dCBvbmx5IHRoZSBvbmVzCi0gICBsaXN0ZWQgaGVyZSBoYXZlIGEgbWVhbmluZyBzdGFuZGFyZGl6ZWQgYnkgQU5TSSBDLgorICAgQWRkaXRpb25hbCBkaXJlY3RpdmVzIG1heSBiZSBzdXBwb3J0ZWQgb24gY2VydGFpbiBwbGF0Zm9ybXMsIGJ1dCBvbmx5IHRoZQorICAgb25lcyBsaXN0ZWQgaGVyZSBoYXZlIGEgbWVhbmluZyBzdGFuZGFyZGl6ZWQgYnkgQU5TSSBDLiAgVG8gc2VlIHRoZSBmdWxsIHNldAorICAgb2YgZm9ybWF0IGNvZGVzIHN1cHBvcnRlZCBvbiB5b3VyIHBsYXRmb3JtLCBjb25zdWx0IHRoZSA6bWFucGFnZTpgc3RyZnRpbWUoMylgCisgICBkb2N1bWVudGF0aW9uLgogCiAgICBPbiBzb21lIHBsYXRmb3JtcywgYW4gb3B0aW9uYWwgZmllbGQgd2lkdGggYW5kIHByZWNpc2lvbiBzcGVjaWZpY2F0aW9uIGNhbgogICAgaW1tZWRpYXRlbHkgZm9sbG93IHRoZSBpbml0aWFsIGBgJyUnYGAgb2YgYSBkaXJlY3RpdmUgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjsKQEAgLTQxMCw3ICs0MTQsNyBAQAogICAgKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgICB8IDQgICAgIHwgOmF0dHI6YHRtX21pbmAgICAgfCByYW5nZSBbMCwgNTldICAgICAgICAgICAgICAgICAgIHwKICAgICstLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCA1ICAgICB8IDphdHRyOmB0bV9zZWNgICAgIHwgcmFuZ2UgWzAsIDYxXTsgc2VlICoqKDEpKiogaW4gICB8CisgICB8IDUgICAgIHwgOmF0dHI6YHRtX3NlY2AgICAgfCByYW5nZSBbMCwgNjFdOyBzZWUgKiooMikqKiBpbiAgIHwKICAgIHwgICAgICAgfCAgICAgICAgICAgICAgICAgICB8IDpmdW5jOmBzdHJmdGltZWAgZGVzY3JpcHRpb24gICAgfAogICAgKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgICB8IDYgICAgIHwgOmF0dHI6YHRtX3dkYXlgICAgfCByYW5nZSBbMCwgNl0sIE1vbmRheSBpcyAwICAgICAgIHwKQEAgLTQzNSw4ICs0MzksOCBAQAogCiAuLiBmdW5jdGlvbjo6IHRpbWUoKQogCi0gICBSZXR1cm4gdGhlIHRpbWUgYXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgZXhwcmVzc2VkIGluIHNlY29uZHMgc2luY2UgdGhlIGVwb2NoLAotICAgaW4gVVRDLiAgTm90ZSB0aGF0IGV2ZW4gdGhvdWdoIHRoZSB0aW1lIGlzIGFsd2F5cyByZXR1cm5lZCBhcyBhIGZsb2F0aW5nIHBvaW50CisgICBSZXR1cm4gdGhlIHRpbWUgaW4gc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2ggYXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIuCisgICBOb3RlIHRoYXQgZXZlbiB0aG91Z2ggdGhlIHRpbWUgaXMgYWx3YXlzIHJldHVybmVkIGFzIGEgZmxvYXRpbmcgcG9pbnQKICAgIG51bWJlciwgbm90IGFsbCBzeXN0ZW1zIHByb3ZpZGUgdGltZSB3aXRoIGEgYmV0dGVyIHByZWNpc2lvbiB0aGFuIDEgc2Vjb25kLgogICAgV2hpbGUgdGhpcyBmdW5jdGlvbiBub3JtYWxseSByZXR1cm5zIG5vbi1kZWNyZWFzaW5nIHZhbHVlcywgaXQgY2FuIHJldHVybiBhCiAgICBsb3dlciB2YWx1ZSB0aGFuIGEgcHJldmlvdXMgY2FsbCBpZiB0aGUgc3lzdGVtIGNsb2NrIGhhcyBiZWVuIHNldCBiYWNrIGJldHdlZW4KQEAgLTU0NywxMiArNTUxLDEyIEBACiAgICAgICBNb3JlIG9iamVjdC1vcmllbnRlZCBpbnRlcmZhY2UgdG8gZGF0ZXMgYW5kIHRpbWVzLgogCiAgICBNb2R1bGUgOm1vZDpgbG9jYWxlYAotICAgICAgSW50ZXJuYXRpb25hbGl6YXRpb24gc2VydmljZXMuICBUaGUgbG9jYWxlIHNldHRpbmdzIGNhbiBhZmZlY3QgdGhlIHJldHVybiB2YWx1ZXMKLSAgICAgIGZvciBzb21lIG9mICB0aGUgZnVuY3Rpb25zIGluIHRoZSA6bW9kOmB0aW1lYCBtb2R1bGUuCisgICAgICBJbnRlcm5hdGlvbmFsaXphdGlvbiBzZXJ2aWNlcy4gIFRoZSBsb2NhbGUgc2V0dGluZyBhZmZlY3RzIHRoZSBpbnRlcnByZXRhdGlvbgorICAgICAgb2YgbWFueSBmb3JtYXQgc3BlY2lmaWVycyBpbiA6ZnVuYzpgc3RyZnRpbWVgIGFuZCA6ZnVuYzpgc3RycHRpbWVgLgogCiAgICBNb2R1bGUgOm1vZDpgY2FsZW5kYXJgCi0gICAgICBHZW5lcmFsIGNhbGVuZGFyLXJlbGF0ZWQgZnVuY3Rpb25zLiAgIDpmdW5jOmB0aW1lZ21gIGlzIHRoZSBpbnZlcnNlIG9mCi0gICAgICA6ZnVuYzpgZ210aW1lYCBmcm9tIHRoaXMgbW9kdWxlLgorICAgICAgR2VuZXJhbCBjYWxlbmRhci1yZWxhdGVkIGZ1bmN0aW9ucy4gICA6ZnVuYzpgfmNhbGVuZGFyLnRpbWVnbWAgaXMgdGhlCisgICAgICBpbnZlcnNlIG9mIDpmdW5jOmBnbXRpbWVgIGZyb20gdGhpcyBtb2R1bGUuCiAKIC4uIHJ1YnJpYzo6IEZvb3Rub3RlcwogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS90aW1laXQucnN0IGIvRG9jL2xpYnJhcnkvdGltZWl0LnJzdAppbmRleCA3ZmJlMTllLi4yY2IzYzlkIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS90aW1laXQucnN0CisrKyBiL0RvYy9saWJyYXJ5L3RpbWVpdC5yc3QKQEAgLTE2LDExMiArMTYsMTYzIEBACiAtLS0tLS0tLS0tLS0tLQogCiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIHNpbXBsZSB3YXkgdG8gdGltZSBzbWFsbCBiaXRzIG9mIFB5dGhvbiBjb2RlLiBJdCBoYXMgYm90aAotY29tbWFuZCBsaW5lIGFzIHdlbGwgYXMgY2FsbGFibGUgaW50ZXJmYWNlcy4gIEl0IGF2b2lkcyBhIG51bWJlciBvZiBjb21tb24gdHJhcHMKLWZvciBtZWFzdXJpbmcgZXhlY3V0aW9uIHRpbWVzLiAgU2VlIGFsc28gVGltIFBldGVycycgaW50cm9kdWN0aW9uIHRvIHRoZQotIkFsZ29yaXRobXMiIGNoYXB0ZXIgaW4gdGhlIFB5dGhvbiBDb29rYm9vaywgcHVibGlzaGVkIGJ5IE8nUmVpbGx5LgotCi1UaGUgbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBwdWJsaWMgY2xhc3M6CithIDpyZWY6YGNvbW1hbmQtbGluZS1pbnRlcmZhY2VgIGFzIHdlbGwgYXMgYSA6cmVmOmBjYWxsYWJsZSA8cHl0aG9uLWludGVyZmFjZT5gCitvbmUuICBJdCBhdm9pZHMgYSBudW1iZXIgb2YgY29tbW9uIHRyYXBzIGZvciBtZWFzdXJpbmcgZXhlY3V0aW9uIHRpbWVzLgorU2VlIGFsc28gVGltIFBldGVycycgaW50cm9kdWN0aW9uIHRvIHRoZSAiQWxnb3JpdGhtcyIgY2hhcHRlciBpbiB0aGUgKlB5dGhvbgorQ29va2Jvb2sqLCBwdWJsaXNoZWQgYnkgTydSZWlsbHkuCiAKIAotLi4gY2xhc3M6OiBUaW1lcihbc3RtdD0ncGFzcycgWywgc2V0dXA9J3Bhc3MnIFssIHRpbWVyPTx0aW1lciBmdW5jdGlvbj5dXV0pCitCYXNpYyBFeGFtcGxlcworLS0tLS0tLS0tLS0tLS0KKworVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0aGUgOnJlZjpgY29tbWFuZC1saW5lLWludGVyZmFjZWAKK2NhbiBiZSB1c2VkIHRvIGNvbXBhcmUgdGhyZWUgZGlmZmVyZW50IGV4cHJlc3Npb25zOgorCisuLiBjb2RlLWJsb2NrOjogc2gKKworICAgJCBweXRob24gLW0gdGltZWl0ICciLSIuam9pbihzdHIobikgZm9yIG4gaW4gcmFuZ2UoMTAwKSknCisgICAxMDAwMCBsb29wcywgYmVzdCBvZiAzOiA0MC4zIHVzZWMgcGVyIGxvb3AKKyAgICQgcHl0aG9uIC1tIHRpbWVpdCAnIi0iLmpvaW4oW3N0cihuKSBmb3IgbiBpbiByYW5nZSgxMDApXSknCisgICAxMDAwMCBsb29wcywgYmVzdCBvZiAzOiAzMy40IHVzZWMgcGVyIGxvb3AKKyAgICQgcHl0aG9uIC1tIHRpbWVpdCAnIi0iLmpvaW4obWFwKHN0ciwgcmFuZ2UoMTAwKSkpJworICAgMTAwMDAgbG9vcHMsIGJlc3Qgb2YgMzogMjUuMiB1c2VjIHBlciBsb29wCisKK1RoaXMgY2FuIGJlIGFjaGlldmVkIGZyb20gdGhlIDpyZWY6YHB5dGhvbi1pbnRlcmZhY2VgIHdpdGg6OgorCisgICA+Pj4gaW1wb3J0IHRpbWVpdAorICAgPj4+IHRpbWVpdC50aW1laXQoJyItIi5qb2luKHN0cihuKSBmb3IgbiBpbiByYW5nZSgxMDApKScsIG51bWJlcj0xMDAwMCkKKyAgIDAuODE4NzI2MDYyNzc0NjU4MgorICAgPj4+IHRpbWVpdC50aW1laXQoJyItIi5qb2luKFtzdHIobikgZm9yIG4gaW4gcmFuZ2UoMTAwKV0pJywgbnVtYmVyPTEwMDAwKQorICAgMC43Mjg4MzA4MTQzNjE1NzIzCisgICA+Pj4gdGltZWl0LnRpbWVpdCgnIi0iLmpvaW4obWFwKHN0ciwgcmFuZ2UoMTAwKSkpJywgbnVtYmVyPTEwMDAwKQorICAgMC41ODU4OTUwNjE0OTI5MTk5CisKK05vdGUgaG93ZXZlciB0aGF0IDptb2Q6YHRpbWVpdGAgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVybWluZSB0aGUgbnVtYmVyIG9mCityZXBldGl0aW9ucyBvbmx5IHdoZW4gdGhlIGNvbW1hbmQtbGluZSBpbnRlcmZhY2UgaXMgdXNlZC4gIEluIHRoZQorOnJlZjpgdGltZWl0LWV4YW1wbGVzYCBzZWN0aW9uIHlvdSBjYW4gZmluZCBtb3JlIGFkdmFuY2VkIGV4YW1wbGVzLgorCisKKy4uIF9weXRob24taW50ZXJmYWNlOgorCitQeXRob24gSW50ZXJmYWNlCistLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBtb2R1bGUgZGVmaW5lcyB0aHJlZSBjb252ZW5pZW5jZSBmdW5jdGlvbnMgYW5kIGEgcHVibGljIGNsYXNzOgorCisKKy4uIGZ1bmN0aW9uOjogdGltZWl0KHN0bXQ9J3Bhc3MnLCBzZXR1cD0ncGFzcycsIHRpbWVyPTxkZWZhdWx0IHRpbWVyPiwgbnVtYmVyPTEwMDAwMDApCisKKyAgIENyZWF0ZSBhIDpjbGFzczpgVGltZXJgIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIHN0YXRlbWVudCwgKnNldHVwKiBjb2RlIGFuZAorICAgKnRpbWVyKiBmdW5jdGlvbiBhbmQgcnVuIGl0cyA6bWV0aDpgLnRpbWVpdGAgbWV0aG9kIHdpdGggKm51bWJlciogZXhlY3V0aW9ucy4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMi42CisKKworLi4gZnVuY3Rpb246OiByZXBlYXQoc3RtdD0ncGFzcycsIHNldHVwPSdwYXNzJywgdGltZXI9PGRlZmF1bHQgdGltZXI+LCByZXBlYXQ9MywgbnVtYmVyPTEwMDAwMDApCisKKyAgIENyZWF0ZSBhIDpjbGFzczpgVGltZXJgIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIHN0YXRlbWVudCwgKnNldHVwKiBjb2RlIGFuZAorICAgKnRpbWVyKiBmdW5jdGlvbiBhbmQgcnVuIGl0cyA6bWV0aDpgLnJlcGVhdGAgbWV0aG9kIHdpdGggdGhlIGdpdmVuICpyZXBlYXQqCisgICBjb3VudCBhbmQgKm51bWJlciogZXhlY3V0aW9ucy4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMi42CisKKworLi4gZnVuY3Rpb246OiBkZWZhdWx0X3RpbWVyKCkKKworICAgRGVmaW5lIGEgZGVmYXVsdCB0aW1lciwgaW4gYSBwbGF0Zm9ybS1zcGVjaWZpYyBtYW5uZXIuICBPbiBXaW5kb3dzLAorICAgOmZ1bmM6YHRpbWUuY2xvY2tgIGhhcyBtaWNyb3NlY29uZCBncmFudWxhcml0eSwgYnV0IDpmdW5jOmB0aW1lLnRpbWVgJ3MKKyAgIGdyYW51bGFyaXR5IGlzIDEvNjB0aCBvZiBhIHNlY29uZC4gIE9uIFVuaXgsIDpmdW5jOmB0aW1lLmNsb2NrYCBoYXMgMS8xMDB0aCBvZgorICAgYSBzZWNvbmQgZ3JhbnVsYXJpdHksIGFuZCA6ZnVuYzpgdGltZS50aW1lYCBpcyBtdWNoIG1vcmUgcHJlY2lzZS4gIE9uIGVpdGhlcgorICAgcGxhdGZvcm0sIDpmdW5jOmBkZWZhdWx0X3RpbWVyYCBtZWFzdXJlcyB3YWxsIGNsb2NrIHRpbWUsIG5vdCB0aGUgQ1BVCisgICB0aW1lLiAgVGhpcyBtZWFucyB0aGF0IG90aGVyIHByb2Nlc3NlcyBydW5uaW5nIG9uIHRoZSBzYW1lIGNvbXB1dGVyIG1heQorICAgaW50ZXJmZXJlIHdpdGggdGhlIHRpbWluZy4KKworCisuLiBjbGFzczo6IFRpbWVyKHN0bXQ9J3Bhc3MnLCBzZXR1cD0ncGFzcycsIHRpbWVyPTx0aW1lciBmdW5jdGlvbj4pCiAKICAgIENsYXNzIGZvciB0aW1pbmcgZXhlY3V0aW9uIHNwZWVkIG9mIHNtYWxsIGNvZGUgc25pcHBldHMuCiAKLSAgIFRoZSBjb25zdHJ1Y3RvciB0YWtlcyBhIHN0YXRlbWVudCB0byBiZSB0aW1lZCwgYW4gYWRkaXRpb25hbCBzdGF0ZW1lbnQgdXNlZCBmb3IKLSAgIHNldHVwLCBhbmQgYSB0aW1lciBmdW5jdGlvbi4gIEJvdGggc3RhdGVtZW50cyBkZWZhdWx0IHRvIGBgJ3Bhc3MnYGA7IHRoZSB0aW1lcgotICAgZnVuY3Rpb24gaXMgcGxhdGZvcm0tZGVwZW5kZW50IChzZWUgdGhlIG1vZHVsZSBkb2Mgc3RyaW5nKS4gICpzdG10KiBhbmQgKnNldHVwKgotICAgbWF5IGFsc28gY29udGFpbiBtdWx0aXBsZSBzdGF0ZW1lbnRzIHNlcGFyYXRlZCBieSBgYDtgYCBvciBuZXdsaW5lcywgYXMgbG9uZyBhcwotICAgdGhleSBkb24ndCBjb250YWluIG11bHRpLWxpbmUgc3RyaW5nIGxpdGVyYWxzLgorICAgVGhlIGNvbnN0cnVjdG9yIHRha2VzIGEgc3RhdGVtZW50IHRvIGJlIHRpbWVkLCBhbiBhZGRpdGlvbmFsIHN0YXRlbWVudCB1c2VkCisgICBmb3Igc2V0dXAsIGFuZCBhIHRpbWVyIGZ1bmN0aW9uLiAgQm90aCBzdGF0ZW1lbnRzIGRlZmF1bHQgdG8gYGAncGFzcydgYDsKKyAgIHRoZSB0aW1lciBmdW5jdGlvbiBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQgKHNlZSB0aGUgbW9kdWxlIGRvYyBzdHJpbmcpLgorICAgKnN0bXQqIGFuZCAqc2V0dXAqIG1heSBhbHNvIGNvbnRhaW4gbXVsdGlwbGUgc3RhdGVtZW50cyBzZXBhcmF0ZWQgYnkgYGA7YGAKKyAgIG9yIG5ld2xpbmVzLCBhcyBsb25nIGFzIHRoZXkgZG9uJ3QgY29udGFpbiBtdWx0aS1saW5lIHN0cmluZyBsaXRlcmFscy4KIAotICAgVG8gbWVhc3VyZSB0aGUgZXhlY3V0aW9uIHRpbWUgb2YgdGhlIGZpcnN0IHN0YXRlbWVudCwgdXNlIHRoZSA6bWV0aDpgdGltZWl0YAotICAgbWV0aG9kLiAgVGhlIDptZXRoOmByZXBlYXRgIG1ldGhvZCBpcyBhIGNvbnZlbmllbmNlIHRvIGNhbGwgOm1ldGg6YHRpbWVpdGAKKyAgIFRvIG1lYXN1cmUgdGhlIGV4ZWN1dGlvbiB0aW1lIG9mIHRoZSBmaXJzdCBzdGF0ZW1lbnQsIHVzZSB0aGUgOm1ldGg6YC50aW1laXRgCisgICBtZXRob2QuICBUaGUgOm1ldGg6YC5yZXBlYXRgIG1ldGhvZCBpcyBhIGNvbnZlbmllbmNlIHRvIGNhbGwgOm1ldGg6YC50aW1laXRgCiAgICBtdWx0aXBsZSB0aW1lcyBhbmQgcmV0dXJuIGEgbGlzdCBvZiByZXN1bHRzLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNgotICAgICAgVGhlICpzdG10KiBhbmQgKnNldHVwKiBwYXJhbWV0ZXJzIGNhbiBub3cgYWxzbyB0YWtlIG9iamVjdHMgdGhhdCBhcmUgY2FsbGFibGUKLSAgICAgIHdpdGhvdXQgYXJndW1lbnRzLiBUaGlzIHdpbGwgZW1iZWQgY2FsbHMgdG8gdGhlbSBpbiBhIHRpbWVyIGZ1bmN0aW9uIHRoYXQgd2lsbAotICAgICAgdGhlbiBiZSBleGVjdXRlZCBieSA6bWV0aDpgdGltZWl0YC4gIE5vdGUgdGhhdCB0aGUgdGltaW5nIG92ZXJoZWFkIGlzIGEgbGl0dGxlCi0gICAgICBsYXJnZXIgaW4gdGhpcyBjYXNlIGJlY2F1c2Ugb2YgdGhlIGV4dHJhIGZ1bmN0aW9uIGNhbGxzLgorICAgICAgVGhlICpzdG10KiBhbmQgKnNldHVwKiBwYXJhbWV0ZXJzIGNhbiBub3cgYWxzbyB0YWtlIG9iamVjdHMgdGhhdCBhcmUKKyAgICAgIGNhbGxhYmxlIHdpdGhvdXQgYXJndW1lbnRzLiAgVGhpcyB3aWxsIGVtYmVkIGNhbGxzIHRvIHRoZW0gaW4gYSB0aW1lcgorICAgICAgZnVuY3Rpb24gdGhhdCB3aWxsIHRoZW4gYmUgZXhlY3V0ZWQgYnkgOm1ldGg6YC50aW1laXRgLiAgTm90ZSB0aGF0IHRoZQorICAgICAgdGltaW5nIG92ZXJoZWFkIGlzIGEgbGl0dGxlIGxhcmdlciBpbiB0aGlzIGNhc2UgYmVjYXVzZSBvZiB0aGUgZXh0cmEKKyAgICAgIGZ1bmN0aW9uIGNhbGxzLgogCiAKLS4uIG1ldGhvZDo6IFRpbWVyLnByaW50X2V4YyhbZmlsZT1Ob25lXSkKKyAgIC4uIG1ldGhvZDo6IFRpbWVyLnRpbWVpdChudW1iZXI9MTAwMDAwMCkKIAotICAgSGVscGVyIHRvIHByaW50IGEgdHJhY2ViYWNrIGZyb20gdGhlIHRpbWVkIGNvZGUuCisgICAgICBUaW1lICpudW1iZXIqIGV4ZWN1dGlvbnMgb2YgdGhlIG1haW4gc3RhdGVtZW50LiAgVGhpcyBleGVjdXRlcyB0aGUgc2V0dXAKKyAgICAgIHN0YXRlbWVudCBvbmNlLCBhbmQgdGhlbiByZXR1cm5zIHRoZSB0aW1lIGl0IHRha2VzIHRvIGV4ZWN1dGUgdGhlIG1haW4KKyAgICAgIHN0YXRlbWVudCBhIG51bWJlciBvZiB0aW1lcywgbWVhc3VyZWQgaW4gc2Vjb25kcyBhcyBhIGZsb2F0LgorICAgICAgVGhlIGFyZ3VtZW50IGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhyb3VnaCB0aGUgbG9vcCwgZGVmYXVsdGluZyB0byBvbmUKKyAgICAgIG1pbGxpb24uICBUaGUgbWFpbiBzdGF0ZW1lbnQsIHRoZSBzZXR1cCBzdGF0ZW1lbnQgYW5kIHRoZSB0aW1lciBmdW5jdGlvbgorICAgICAgdG8gYmUgdXNlZCBhcmUgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KIAotICAgVHlwaWNhbCB1c2U6OgorICAgICAgLi4gbm90ZTo6CiAKLSAgICAgIHQgPSBUaW1lciguLi4pICAgICAgICMgb3V0c2lkZSB0aGUgdHJ5L2V4Y2VwdAotICAgICAgdHJ5OgotICAgICAgICAgIHQudGltZWl0KC4uLikgICAgIyBvciB0LnJlcGVhdCguLi4pCi0gICAgICBleGNlcHQ6Ci0gICAgICAgICAgdC5wcmludF9leGMoKQorICAgICAgICAgQnkgZGVmYXVsdCwgOm1ldGg6YC50aW1laXRgIHRlbXBvcmFyaWx5IHR1cm5zIG9mZiA6dGVybTpgZ2FyYmFnZQorICAgICAgICAgY29sbGVjdGlvbmAgZHVyaW5nIHRoZSB0aW1pbmcuICBUaGUgYWR2YW50YWdlIG9mIHRoaXMgYXBwcm9hY2ggaXMgdGhhdAorICAgICAgICAgaXQgbWFrZXMgaW5kZXBlbmRlbnQgdGltaW5ncyBtb3JlIGNvbXBhcmFibGUuICBUaGlzIGRpc2FkdmFudGFnZSBpcworICAgICAgICAgdGhhdCBHQyBtYXkgYmUgYW4gaW1wb3J0YW50IGNvbXBvbmVudCBvZiB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlCisgICAgICAgICBmdW5jdGlvbiBiZWluZyBtZWFzdXJlZC4gIElmIHNvLCBHQyBjYW4gYmUgcmUtZW5hYmxlZCBhcyB0aGUgZmlyc3QKKyAgICAgICAgIHN0YXRlbWVudCBpbiB0aGUgKnNldHVwKiBzdHJpbmcuICBGb3IgZXhhbXBsZTo6CiAKLSAgIFRoZSBhZHZhbnRhZ2Ugb3ZlciB0aGUgc3RhbmRhcmQgdHJhY2ViYWNrIGlzIHRoYXQgc291cmNlIGxpbmVzIGluIHRoZSBjb21waWxlZAotICAgdGVtcGxhdGUgd2lsbCBiZSBkaXNwbGF5ZWQuIFRoZSBvcHRpb25hbCAqZmlsZSogYXJndW1lbnQgZGlyZWN0cyB3aGVyZSB0aGUKLSAgIHRyYWNlYmFjayBpcyBzZW50OyBpdCBkZWZhdWx0cyB0byBgYHN5cy5zdGRlcnJgYC4KKyAgICAgICAgICAgIHRpbWVpdC5UaW1lcignZm9yIGkgaW4geHJhbmdlKDEwKTogb2N0KGkpJywgJ2djLmVuYWJsZSgpJykudGltZWl0KCkKIAogCi0uLiBtZXRob2Q6OiBUaW1lci5yZXBlYXQoW3JlcGVhdD0zIFssIG51bWJlcj0xMDAwMDAwXV0pCisgICAuLiBtZXRob2Q6OiBUaW1lci5yZXBlYXQocmVwZWF0PTMsIG51bWJlcj0xMDAwMDAwKQogCi0gICBDYWxsIDptZXRoOmB0aW1laXRgIGEgZmV3IHRpbWVzLgorICAgICAgQ2FsbCA6bWV0aDpgLnRpbWVpdGAgYSBmZXcgdGltZXMuCiAKLSAgIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSA6bWV0aDpgdGltZWl0YCByZXBlYXRlZGx5LAotICAgcmV0dXJuaW5nIGEgbGlzdCBvZiByZXN1bHRzLiAgVGhlIGZpcnN0IGFyZ3VtZW50IHNwZWNpZmllcyBob3cgbWFueSB0aW1lcyB0bwotICAgY2FsbCA6bWV0aDpgdGltZWl0YC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSAqbnVtYmVyKiBhcmd1bWVudCBmb3IKLSAgIDpmdW5jOmB0aW1laXRgLgorICAgICAgVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgY2FsbHMgdGhlIDptZXRoOmAudGltZWl0YCByZXBlYXRlZGx5LAorICAgICAgcmV0dXJuaW5nIGEgbGlzdCBvZiByZXN1bHRzLiAgVGhlIGZpcnN0IGFyZ3VtZW50IHNwZWNpZmllcyBob3cgbWFueSB0aW1lcworICAgICAgdG8gY2FsbCA6bWV0aDpgLnRpbWVpdGAuICBUaGUgc2Vjb25kIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgKm51bWJlcioKKyAgICAgIGFyZ3VtZW50IGZvciA6bWV0aDpgLnRpbWVpdGAuCiAKLSAgIC4uIG5vdGU6OgorICAgICAgLi4gbm90ZTo6CiAKLSAgICAgIEl0J3MgdGVtcHRpbmcgdG8gY2FsY3VsYXRlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBmcm9tIHRoZSByZXN1bHQgdmVjdG9yCi0gICAgICBhbmQgcmVwb3J0IHRoZXNlLiAgSG93ZXZlciwgdGhpcyBpcyBub3QgdmVyeSB1c2VmdWwuICBJbiBhIHR5cGljYWwgY2FzZSwgdGhlCi0gICAgICBsb3dlc3QgdmFsdWUgZ2l2ZXMgYSBsb3dlciBib3VuZCBmb3IgaG93IGZhc3QgeW91ciBtYWNoaW5lIGNhbiBydW4gdGhlIGdpdmVuCi0gICAgICBjb2RlIHNuaXBwZXQ7IGhpZ2hlciB2YWx1ZXMgaW4gdGhlIHJlc3VsdCB2ZWN0b3IgYXJlIHR5cGljYWxseSBub3QgY2F1c2VkIGJ5Ci0gICAgICB2YXJpYWJpbGl0eSBpbiBQeXRob24ncyBzcGVlZCwgYnV0IGJ5IG90aGVyIHByb2Nlc3NlcyBpbnRlcmZlcmluZyB3aXRoIHlvdXIKLSAgICAgIHRpbWluZyBhY2N1cmFjeS4gIFNvIHRoZSA6ZnVuYzpgbWluYCBvZiB0aGUgcmVzdWx0IGlzIHByb2JhYmx5IHRoZSBvbmx5IG51bWJlcgotICAgICAgeW91IHNob3VsZCBiZSBpbnRlcmVzdGVkIGluLiAgQWZ0ZXIgdGhhdCwgeW91IHNob3VsZCBsb29rIGF0IHRoZSBlbnRpcmUgdmVjdG9yCi0gICAgICBhbmQgYXBwbHkgY29tbW9uIHNlbnNlIHJhdGhlciB0aGFuIHN0YXRpc3RpY3MuCisgICAgICAgICBJdCdzIHRlbXB0aW5nIHRvIGNhbGN1bGF0ZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gZnJvbSB0aGUgcmVzdWx0CisgICAgICAgICB2ZWN0b3IgYW5kIHJlcG9ydCB0aGVzZS4gIEhvd2V2ZXIsIHRoaXMgaXMgbm90IHZlcnkgdXNlZnVsLgorICAgICAgICAgSW4gYSB0eXBpY2FsIGNhc2UsIHRoZSBsb3dlc3QgdmFsdWUgZ2l2ZXMgYSBsb3dlciBib3VuZCBmb3IgaG93IGZhc3QKKyAgICAgICAgIHlvdXIgbWFjaGluZSBjYW4gcnVuIHRoZSBnaXZlbiBjb2RlIHNuaXBwZXQ7IGhpZ2hlciB2YWx1ZXMgaW4gdGhlCisgICAgICAgICByZXN1bHQgdmVjdG9yIGFyZSB0eXBpY2FsbHkgbm90IGNhdXNlZCBieSB2YXJpYWJpbGl0eSBpbiBQeXRob24ncworICAgICAgICAgc3BlZWQsIGJ1dCBieSBvdGhlciBwcm9jZXNzZXMgaW50ZXJmZXJpbmcgd2l0aCB5b3VyIHRpbWluZyBhY2N1cmFjeS4KKyAgICAgICAgIFNvIHRoZSA6ZnVuYzpgbWluYCBvZiB0aGUgcmVzdWx0IGlzIHByb2JhYmx5IHRoZSBvbmx5IG51bWJlciB5b3UKKyAgICAgICAgIHNob3VsZCBiZSBpbnRlcmVzdGVkIGluLiAgQWZ0ZXIgdGhhdCwgeW91IHNob3VsZCBsb29rIGF0IHRoZSBlbnRpcmUKKyAgICAgICAgIHZlY3RvciBhbmQgYXBwbHkgY29tbW9uIHNlbnNlIHJhdGhlciB0aGFuIHN0YXRpc3RpY3MuCiAKIAotLi4gbWV0aG9kOjogVGltZXIudGltZWl0KFtudW1iZXI9MTAwMDAwMF0pCisgICAuLiBtZXRob2Q6OiBUaW1lci5wcmludF9leGMoZmlsZT1Ob25lKQogCi0gICBUaW1lICpudW1iZXIqIGV4ZWN1dGlvbnMgb2YgdGhlIG1haW4gc3RhdGVtZW50LiBUaGlzIGV4ZWN1dGVzIHRoZSBzZXR1cAotICAgc3RhdGVtZW50IG9uY2UsIGFuZCB0aGVuIHJldHVybnMgdGhlIHRpbWUgaXQgdGFrZXMgdG8gZXhlY3V0ZSB0aGUgbWFpbiBzdGF0ZW1lbnQKLSAgIGEgbnVtYmVyIG9mIHRpbWVzLCBtZWFzdXJlZCBpbiBzZWNvbmRzIGFzIGEgZmxvYXQuICBUaGUgYXJndW1lbnQgaXMgdGhlIG51bWJlcgotICAgb2YgdGltZXMgdGhyb3VnaCB0aGUgbG9vcCwgZGVmYXVsdGluZyB0byBvbmUgbWlsbGlvbi4gIFRoZSBtYWluIHN0YXRlbWVudCwgdGhlCi0gICBzZXR1cCBzdGF0ZW1lbnQgYW5kIHRoZSB0aW1lciBmdW5jdGlvbiB0byBiZSB1c2VkIGFyZSBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLgorICAgICAgSGVscGVyIHRvIHByaW50IGEgdHJhY2ViYWNrIGZyb20gdGhlIHRpbWVkIGNvZGUuCiAKLSAgIC4uIG5vdGU6OgorICAgICAgVHlwaWNhbCB1c2U6OgogCi0gICAgICBCeSBkZWZhdWx0LCA6bWV0aDpgdGltZWl0YCB0ZW1wb3JhcmlseSB0dXJucyBvZmYgOnRlcm06YGdhcmJhZ2UgY29sbGVjdGlvbmAKLSAgICAgIGR1cmluZyB0aGUgdGltaW5nLiAgVGhlIGFkdmFudGFnZSBvZiB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgaXQgbWFrZXMKLSAgICAgIGluZGVwZW5kZW50IHRpbWluZ3MgbW9yZSBjb21wYXJhYmxlLiAgVGhpcyBkaXNhZHZhbnRhZ2UgaXMgdGhhdCBHQyBtYXkgYmUKLSAgICAgIGFuIGltcG9ydGFudCBjb21wb25lbnQgb2YgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBmdW5jdGlvbiBiZWluZyBtZWFzdXJlZC4KLSAgICAgIElmIHNvLCBHQyBjYW4gYmUgcmUtZW5hYmxlZCBhcyB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHRoZSAqc2V0dXAqIHN0cmluZy4KLSAgICAgIEZvciBleGFtcGxlOjoKKyAgICAgICAgIHQgPSBUaW1lciguLi4pICAgICAgICMgb3V0c2lkZSB0aGUgdHJ5L2V4Y2VwdAorICAgICAgICAgdHJ5OgorICAgICAgICAgICAgIHQudGltZWl0KC4uLikgICAgIyBvciB0LnJlcGVhdCguLi4pCisgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgdC5wcmludF9leGMoKQogCi0gICAgICAgICB0aW1laXQuVGltZXIoJ2ZvciBpIGluIHhyYW5nZSgxMCk6IG9jdChpKScsICdnYy5lbmFibGUoKScpLnRpbWVpdCgpCi0KLVN0YXJ0aW5nIHdpdGggdmVyc2lvbiAyLjYsIHRoZSBtb2R1bGUgYWxzbyBkZWZpbmVzIHR3byBjb252ZW5pZW5jZSBmdW5jdGlvbnM6CisgICAgICBUaGUgYWR2YW50YWdlIG92ZXIgdGhlIHN0YW5kYXJkIHRyYWNlYmFjayBpcyB0aGF0IHNvdXJjZSBsaW5lcyBpbiB0aGUKKyAgICAgIGNvbXBpbGVkIHRlbXBsYXRlIHdpbGwgYmUgZGlzcGxheWVkLiBUaGUgb3B0aW9uYWwgKmZpbGUqIGFyZ3VtZW50IGRpcmVjdHMKKyAgICAgIHdoZXJlIHRoZSB0cmFjZWJhY2sgaXMgc2VudDsgaXQgZGVmYXVsdHMgdG8gOmRhdGE6YHN5cy5zdGRlcnJgLgogCiAKLS4uIGZ1bmN0aW9uOjogcmVwZWF0KHN0bXRbLCBzZXR1cFssIHRpbWVyWywgcmVwZWF0PTMgWywgbnVtYmVyPTEwMDAwMDBdXV1dKQorLi4gX2NvbW1hbmQtbGluZS1pbnRlcmZhY2U6CiAKLSAgIENyZWF0ZSBhIDpjbGFzczpgVGltZXJgIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIHN0YXRlbWVudCwgc2V0dXAgY29kZSBhbmQgdGltZXIKLSAgIGZ1bmN0aW9uIGFuZCBydW4gaXRzIDptZXRoOmByZXBlYXRgIG1ldGhvZCB3aXRoIHRoZSBnaXZlbiByZXBlYXQgY291bnQgYW5kCi0gICAqbnVtYmVyKiBleGVjdXRpb25zLgotCi0gICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjYKLQotCi0uLiBmdW5jdGlvbjo6IHRpbWVpdChzdG10Wywgc2V0dXBbLCB0aW1lclssIG51bWJlcj0xMDAwMDAwXV1dKQotCi0gICBDcmVhdGUgYSA6Y2xhc3M6YFRpbWVyYCBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlbiBzdGF0ZW1lbnQsIHNldHVwIGNvZGUgYW5kIHRpbWVyCi0gICBmdW5jdGlvbiBhbmQgcnVuIGl0cyA6bWV0aDpgdGltZWl0YCBtZXRob2Qgd2l0aCAqbnVtYmVyKiBleGVjdXRpb25zLgotCi0gICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjYKLQotCi1Db21tYW5kIExpbmUgSW50ZXJmYWNlCitDb21tYW5kLUxpbmUgSW50ZXJmYWNlCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFdoZW4gY2FsbGVkIGFzIGEgcHJvZ3JhbSBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIHRoZSBmb2xsb3dpbmcgZm9ybSBpcyB1c2VkOjoKQEAgLTE2OCwxMyArMjE5LDkgQEAKIElmIDpvcHRpb246YC1uYCBpcyBub3QgZ2l2ZW4sIGEgc3VpdGFibGUgbnVtYmVyIG9mIGxvb3BzIGlzIGNhbGN1bGF0ZWQgYnkgdHJ5aW5nCiBzdWNjZXNzaXZlIHBvd2VycyBvZiAxMCB1bnRpbCB0aGUgdG90YWwgdGltZSBpcyBhdCBsZWFzdCAwLjIgc2Vjb25kcy4KIAotVGhlIGRlZmF1bHQgdGltZXIgZnVuY3Rpb24gaXMgcGxhdGZvcm0gZGVwZW5kZW50LiAgT24gV2luZG93cywKLTpmdW5jOmB0aW1lLmNsb2NrYCBoYXMgbWljcm9zZWNvbmQgZ3JhbnVsYXJpdHkgYnV0IDpmdW5jOmB0aW1lLnRpbWVgJ3MKLWdyYW51bGFyaXR5IGlzIDEvNjB0aCBvZiBhIHNlY29uZDsgb24gVW5peCwgOmZ1bmM6YHRpbWUuY2xvY2tgIGhhcyAxLzEwMHRoIG9mIGEKLXNlY29uZCBncmFudWxhcml0eSBhbmQgOmZ1bmM6YHRpbWUudGltZWAgaXMgbXVjaCBtb3JlIHByZWNpc2UuICBPbiBlaXRoZXIKLXBsYXRmb3JtLCB0aGUgZGVmYXVsdCB0aW1lciBmdW5jdGlvbnMgbWVhc3VyZSB3YWxsIGNsb2NrIHRpbWUsIG5vdCB0aGUgQ1BVIHRpbWUuCi1UaGlzIG1lYW5zIHRoYXQgb3RoZXIgcHJvY2Vzc2VzIHJ1bm5pbmcgb24gdGhlIHNhbWUgY29tcHV0ZXIgbWF5IGludGVyZmVyZSB3aXRoCi10aGUgdGltaW5nLiAgVGhlIGJlc3QgdGhpbmcgdG8gZG8gd2hlbiBhY2N1cmF0ZSB0aW1pbmcgaXMgbmVjZXNzYXJ5IGlzIHRvIHJlcGVhdAorOmZ1bmM6YGRlZmF1bHRfdGltZXJgIG1lYXN1cmF0aW9ucyBjYW4gYmUgYWZmZWN0ZWQgYnkgb3RoZXIgcHJvZ3JhbXMgcnVubmluZyBvbgordGhlIHNhbWUgbWFjaGluZSwgc28KK3RoZSBiZXN0IHRoaW5nIHRvIGRvIHdoZW4gYWNjdXJhdGUgdGltaW5nIGlzIG5lY2Vzc2FyeSBpcyB0byByZXBlYXQKIHRoZSB0aW1pbmcgYSBmZXcgdGltZXMgYW5kIHVzZSB0aGUgYmVzdCB0aW1lLiAgVGhlIDpvcHRpb246YC1yYCBvcHRpb24gaXMgZ29vZAogZm9yIHRoaXM7IHRoZSBkZWZhdWx0IG9mIDMgcmVwZXRpdGlvbnMgaXMgcHJvYmFibHkgZW5vdWdoIGluIG1vc3QgY2FzZXMuICBPbgogVW5peCwgeW91IGNhbiB1c2UgOmZ1bmM6YHRpbWUuY2xvY2tgIHRvIG1lYXN1cmUgQ1BVIHRpbWUuCkBAIC0xODMsMjUgKzIzMCw1NSBAQAogCiAgICBUaGVyZSBpcyBhIGNlcnRhaW4gYmFzZWxpbmUgb3ZlcmhlYWQgYXNzb2NpYXRlZCB3aXRoIGV4ZWN1dGluZyBhIHBhc3Mgc3RhdGVtZW50LgogICAgVGhlIGNvZGUgaGVyZSBkb2Vzbid0IHRyeSB0byBoaWRlIGl0LCBidXQgeW91IHNob3VsZCBiZSBhd2FyZSBvZiBpdC4gIFRoZQotICAgYmFzZWxpbmUgb3ZlcmhlYWQgY2FuIGJlIG1lYXN1cmVkIGJ5IGludm9raW5nIHRoZSBwcm9ncmFtIHdpdGhvdXQgYXJndW1lbnRzLgorICAgYmFzZWxpbmUgb3ZlcmhlYWQgY2FuIGJlIG1lYXN1cmVkIGJ5IGludm9raW5nIHRoZSBwcm9ncmFtIHdpdGhvdXQgYXJndW1lbnRzLCBhbmQKKyAgIGl0IG1pZ2h0IGRpZmZlciBiZXR3ZWVuIFB5dGhvbiB2ZXJzaW9ucy4gIEFsc28sIHRvIGZhaXJseSBjb21wYXJlIG9sZGVyIFB5dGhvbgorICAgdmVyc2lvbnMgdG8gUHl0aG9uIDIuMywgeW91IG1heSB3YW50IHRvIHVzZSBQeXRob24ncyA6b3B0aW9uOmAtT2Agb3B0aW9uIGZvcgorICAgdGhlIG9sZGVyIHZlcnNpb25zIHRvIGF2b2lkIHRpbWluZyBgYFNFVF9MSU5FTk9gYCBpbnN0cnVjdGlvbnMuCiAKLVRoZSBiYXNlbGluZSBvdmVyaGVhZCBkaWZmZXJzIGJldHdlZW4gUHl0aG9uIHZlcnNpb25zISAgQWxzbywgdG8gZmFpcmx5IGNvbXBhcmUKLW9sZGVyIFB5dGhvbiB2ZXJzaW9ucyB0byBQeXRob24gMi4zLCB5b3UgbWF5IHdhbnQgdG8gdXNlIFB5dGhvbidzIDpvcHRpb246YC1PYAotb3B0aW9uIGZvciB0aGUgb2xkZXIgdmVyc2lvbnMgdG8gYXZvaWQgdGltaW5nIGBgU0VUX0xJTkVOT2BgIGluc3RydWN0aW9ucy4KIAorLi4gX3RpbWVpdC1leGFtcGxlczoKIAogRXhhbXBsZXMKIC0tLS0tLS0tCiAKLUhlcmUgYXJlIHR3byBleGFtcGxlIHNlc3Npb25zIChvbmUgdXNpbmcgdGhlIGNvbW1hbmQgbGluZSwgb25lIHVzaW5nIHRoZSBtb2R1bGUKLWludGVyZmFjZSkgdGhhdCBjb21wYXJlIHRoZSBjb3N0IG9mIHVzaW5nIDpmdW5jOmBoYXNhdHRyYCB2cy4KLTprZXl3b3JkOmB0cnlgLzprZXl3b3JkOmBleGNlcHRgIHRvIHRlc3QgZm9yIG1pc3NpbmcgYW5kIHByZXNlbnQgb2JqZWN0Ci1hdHRyaWJ1dGVzLiA6OgorSXQgaXMgcG9zc2libGUgdG8gcHJvdmlkZSBhIHNldHVwIHN0YXRlbWVudCB0aGF0IGlzIGV4ZWN1dGVkIG9ubHkgb25jZSBhdCB0aGUgYmVnaW5uaW5nOgorCisuLiBjb2RlLWJsb2NrOjogc2gKKworICAgJCBweXRob24gLW0gdGltZWl0IC1zICd0ZXh0ID0gInNhbXBsZSBzdHJpbmciOyBjaGFyID0gImciJyAgJ2NoYXIgaW4gdGV4dCcKKyAgIDEwMDAwMDAwIGxvb3BzLCBiZXN0IG9mIDM6IDAuMDg3NyB1c2VjIHBlciBsb29wCisgICAkIHB5dGhvbiAtbSB0aW1laXQgLXMgJ3RleHQgPSAic2FtcGxlIHN0cmluZyI7IGNoYXIgPSAiZyInICAndGV4dC5maW5kKGNoYXIpJworICAgMTAwMDAwMCBsb29wcywgYmVzdCBvZiAzOiAwLjM0MiB1c2VjIHBlciBsb29wCisKKzo6CisKKyAgID4+PiBpbXBvcnQgdGltZWl0CisgICA+Pj4gdGltZWl0LnRpbWVpdCgnY2hhciBpbiB0ZXh0Jywgc2V0dXA9J3RleHQgPSAic2FtcGxlIHN0cmluZyI7IGNoYXIgPSAiZyInKQorICAgMC40MTQ0MDUwMDQ5OTk5MzUwNAorICAgPj4+IHRpbWVpdC50aW1laXQoJ3RleHQuZmluZChjaGFyKScsIHNldHVwPSd0ZXh0ID0gInNhbXBsZSBzdHJpbmciOyBjaGFyID0gImciJykKKyAgIDEuNzI0NjY3MTUyMDAwNjIwMworCitUaGUgc2FtZSBjYW4gYmUgZG9uZSB1c2luZyB0aGUgOmNsYXNzOmBUaW1lcmAgY2xhc3MgYW5kIGl0cyBtZXRob2RzOjoKKworICAgPj4+IGltcG9ydCB0aW1laXQKKyAgID4+PiB0ID0gdGltZWl0LlRpbWVyKCdjaGFyIGluIHRleHQnLCBzZXR1cD0ndGV4dCA9ICJzYW1wbGUgc3RyaW5nIjsgY2hhciA9ICJnIicpCisgICA+Pj4gdC50aW1laXQoKQorICAgMC4zOTU1NTE2MTQ5OTk5MzEyCisgICA+Pj4gdC5yZXBlYXQoKQorICAgWzAuNDAxOTM1ODg4MDAwMDI1NDQsIDAuMzk2MDE1Nzk1OTk5ODAxNCwgMC4zOTU5NDMwMTM5OTk4NDAzM10KKworCitUaGUgZm9sbG93aW5nIGV4YW1wbGVzIHNob3cgaG93IHRvIHRpbWUgZXhwcmVzc2lvbnMgdGhhdCBjb250YWluIG11bHRpcGxlIGxpbmVzLgorSGVyZSB3ZSBjb21wYXJlIHRoZSBjb3N0IG9mIHVzaW5nIDpmdW5jOmBoYXNhdHRyYCB2cy4gOmtleXdvcmQ6YHRyeWAvOmtleXdvcmQ6YGV4Y2VwdGAKK3RvIHRlc3QgZm9yIG1pc3NpbmcgYW5kIHByZXNlbnQgb2JqZWN0IGF0dHJpYnV0ZXM6CisKKy4uIGNvZGUtYmxvY2s6OiBzaAogCiAgICAkIHB5dGhvbiAtbSB0aW1laXQgJ3RyeTonICcgIHN0ci5fX25vbnplcm9fXycgJ2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjonICcgIHBhc3MnCiAgICAxMDAwMDAgbG9vcHMsIGJlc3Qgb2YgMzogMTUuNyB1c2VjIHBlciBsb29wCiAgICAkIHB5dGhvbiAtbSB0aW1laXQgJ2lmIGhhc2F0dHIoc3RyLCAiX19ub256ZXJvX18iKTogcGFzcycKICAgIDEwMDAwMCBsb29wcywgYmVzdCBvZiAzOiA0LjI2IHVzZWMgcGVyIGxvb3AKKwogICAgJCBweXRob24gLW0gdGltZWl0ICd0cnk6JyAnICBpbnQuX19ub256ZXJvX18nICdleGNlcHQgQXR0cmlidXRlRXJyb3I6JyAnICBwYXNzJwogICAgMTAwMDAwMCBsb29wcywgYmVzdCBvZiAzOiAxLjQzIHVzZWMgcGVyIGxvb3AKICAgICQgcHl0aG9uIC1tIHRpbWVpdCAnaWYgaGFzYXR0cihpbnQsICJfX25vbnplcm9fXyIpOiBwYXNzJwpAQCAtMjEwLDM5ICsyODcsMzQgQEAKIDo6CiAKICAgID4+PiBpbXBvcnQgdGltZWl0CisgICA+Pj4gIyBhdHRyaWJ1dGUgaXMgbWlzc2luZwogICAgPj4+IHMgPSAiIiJcCiAgICAuLi4gdHJ5OgogICAgLi4uICAgICBzdHIuX19ub256ZXJvX18KICAgIC4uLiBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAuLi4gICAgIHBhc3MKICAgIC4uLiAiIiIKLSAgID4+PiB0ID0gdGltZWl0LlRpbWVyKHN0bXQ9cykKLSAgID4+PiBwcmludCAiJS4yZiB1c2VjL3Bhc3MiICUgKDEwMDAwMDAgKiB0LnRpbWVpdChudW1iZXI9MTAwMDAwKS8xMDAwMDApCi0gICAxNy4wOSB1c2VjL3Bhc3MKLSAgID4+PiBzID0gIiIiXAotICAgLi4uIGlmIGhhc2F0dHIoc3RyLCAnX19ub256ZXJvX18nKTogcGFzcwotICAgLi4uICIiIgotICAgPj4+IHQgPSB0aW1laXQuVGltZXIoc3RtdD1zKQotICAgPj4+IHByaW50ICIlLjJmIHVzZWMvcGFzcyIgJSAoMTAwMDAwMCAqIHQudGltZWl0KG51bWJlcj0xMDAwMDApLzEwMDAwMCkKLSAgIDQuODUgdXNlYy9wYXNzCisgICA+Pj4gdGltZWl0LnRpbWVpdChzdG10PXMsIG51bWJlcj0xMDAwMDApCisgICAwLjkxMzgyNDQ0NjAwMDk0NDYKKyAgID4+PiBzID0gImlmIGhhc2F0dHIoc3RyLCAnX19ib29sX18nKTogcGFzcyIKKyAgID4+PiB0aW1laXQudGltZWl0KHN0bXQ9cywgbnVtYmVyPTEwMDAwMCkKKyAgIDAuNTgyOTAxNDk4MDAwODY1MQorICAgPj4+CisgICA+Pj4gIyBhdHRyaWJ1dGUgaXMgcHJlc2VudAogICAgPj4+IHMgPSAiIiJcCiAgICAuLi4gdHJ5OgogICAgLi4uICAgICBpbnQuX19ub256ZXJvX18KICAgIC4uLiBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAuLi4gICAgIHBhc3MKICAgIC4uLiAiIiIKLSAgID4+PiB0ID0gdGltZWl0LlRpbWVyKHN0bXQ9cykKLSAgID4+PiBwcmludCAiJS4yZiB1c2VjL3Bhc3MiICUgKDEwMDAwMDAgKiB0LnRpbWVpdChudW1iZXI9MTAwMDAwKS8xMDAwMDApCi0gICAxLjk3IHVzZWMvcGFzcwotICAgPj4+IHMgPSAiIiJcCi0gICAuLi4gaWYgaGFzYXR0cihpbnQsICdfX25vbnplcm9fXycpOiBwYXNzCi0gICAuLi4gIiIiCi0gICA+Pj4gdCA9IHRpbWVpdC5UaW1lcihzdG10PXMpCi0gICA+Pj4gcHJpbnQgIiUuMmYgdXNlYy9wYXNzIiAlICgxMDAwMDAwICogdC50aW1laXQobnVtYmVyPTEwMDAwMCkvMTAwMDAwKQotICAgMy4xNSB1c2VjL3Bhc3MKKyAgID4+PiB0aW1laXQudGltZWl0KHN0bXQ9cywgbnVtYmVyPTEwMDAwMCkKKyAgIDAuMDQyMTUzMTIxOTk5OTQ1MTQKKyAgID4+PiBzID0gImlmIGhhc2F0dHIoaW50LCAnX19ib29sX18nKTogcGFzcyIKKyAgID4+PiB0aW1laXQudGltZWl0KHN0bXQ9cywgbnVtYmVyPTEwMDAwMCkKKyAgIDAuMDg1ODgwNjA2OTk5MTI2MDMKIAogVG8gZ2l2ZSB0aGUgOm1vZDpgdGltZWl0YCBtb2R1bGUgYWNjZXNzIHRvIGZ1bmN0aW9ucyB5b3UgZGVmaW5lLCB5b3UgY2FuIHBhc3MgYQotYGBzZXR1cGBgIHBhcmFtZXRlciB3aGljaCBjb250YWlucyBhbiBpbXBvcnQgc3RhdGVtZW50OjoKKypzZXR1cCogcGFyYW1ldGVyIHdoaWNoIGNvbnRhaW5zIGFuIGltcG9ydCBzdGF0ZW1lbnQ6OgogCiAgICBkZWYgdGVzdCgpOgogICAgICAgICIiIlN0dXBpZCB0ZXN0IGZ1bmN0aW9uIiIiCkBAIC0yNTEsNyArMzIzLDUgQEAKICAgICAgICAgICAgTC5hcHBlbmQoaSkKIAogICAgaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICAgICBmcm9tIHRpbWVpdCBpbXBvcnQgVGltZXIKLSAgICAgICB0ID0gVGltZXIoInRlc3QoKSIsICJmcm9tIF9fbWFpbl9fIGltcG9ydCB0ZXN0IikKLSAgICAgICBwcmludCB0LnRpbWVpdCgpCi0KKyAgICAgICBpbXBvcnQgdGltZWl0CisgICAgICAgcHJpbnQodGltZWl0LnRpbWVpdCgidGVzdCgpIiwgc2V0dXA9ImZyb20gX19tYWluX18gaW1wb3J0IHRlc3QiKSkKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3RpeC5yc3QgYi9Eb2MvbGlicmFyeS90aXgucnN0CmluZGV4IDhiNTM1NWQuLmEyZjMxYTAgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3RpeC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdGl4LnJzdApAQCAtMjQsOSArMjQsOSBAQAogCiAuLiBub3RlOjoKIAotICAgOm1vZDpgVGl4YCBoYXMgYmVlbiByZW5hbWVkIHRvIDptb2Q6YHRraW50ZXIudGl4YCBpbiBQeXRob24gMy4wLiAgVGhlCisgICA6bW9kOmBUaXhgIGhhcyBiZWVuIHJlbmFtZWQgdG8gOm1vZDpgdGtpbnRlci50aXhgIGluIFB5dGhvbiAzLiAgVGhlCiAgICA6dGVybTpgMnRvM2AgdG9vbCB3aWxsIGF1dG9tYXRpY2FsbHkgYWRhcHQgaW1wb3J0cyB3aGVuIGNvbnZlcnRpbmcgeW91cgotICAgc291cmNlcyB0byAzLjAuCisgICBzb3VyY2VzIHRvIFB5dGhvbiAzLgogCiAuLiBzZWVhbHNvOjoKIApAQCAtNTE0LDcgKzUxNCw3IEBACiAgICAgICBwcmludCByb290LnRpeF9jb25maWd1cmUoKQogCiAKLS4uIG1ldGhvZDo6IHRpeENvbW1hbmQudGl4X2NvbmZpZ3VyZShbY25mLF0gKiprdykKKy4uIG1ldGhvZDo6IHRpeENvbW1hbmQudGl4X2NvbmZpZ3VyZShjbmY9Tm9uZSAqKmt3KQogCiAgICBRdWVyeSBvciBtb2RpZnkgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvZiB0aGUgVGl4IGFwcGxpY2F0aW9uIGNvbnRleHQuIElmIG5vCiAgICBvcHRpb24gaXMgc3BlY2lmaWVkLCByZXR1cm5zIGEgZGljdGlvbmFyeSBhbGwgb2YgdGhlIGF2YWlsYWJsZSBvcHRpb25zLiAgSWYKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3RraW50ZXIucnN0IGIvRG9jL2xpYnJhcnkvdGtpbnRlci5yc3QKaW5kZXggMzQzMWY4Ni4uZGRhZWVjNyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdGtpbnRlci5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdGtpbnRlci5yc3QKQEAgLTEzLDIyICsxMywzNCBAQAogCiAuLiBub3RlOjoKIAotICAgOm1vZDpgVGtpbnRlcmAgaGFzIGJlZW4gcmVuYW1lZCB0byA6bW9kOmB0a2ludGVyYCBpbiBQeXRob24gMy4wLiAgVGhlCisgICA6bW9kOmBUa2ludGVyYCBoYXMgYmVlbiByZW5hbWVkIHRvIDptb2Q6YHRraW50ZXJgIGluIFB5dGhvbiAzLiAgVGhlCiAgICA6dGVybTpgMnRvM2AgdG9vbCB3aWxsIGF1dG9tYXRpY2FsbHkgYWRhcHQgaW1wb3J0cyB3aGVuIGNvbnZlcnRpbmcgeW91cgotICAgc291cmNlcyB0byAzLjAuCisgICBzb3VyY2VzIHRvIFB5dGhvbiAzLgogCiAuLiBzZWVhbHNvOjoKIAotICAgYFB5dGhvbiBUa2ludGVyIFJlc291cmNlcyA8aHR0cDovL3d3dy5weXRob24ub3JnL3RvcGljcy90a2ludGVyLz5gXworICAgYFB5dGhvbiBUa2ludGVyIFJlc291cmNlcyA8aHR0cHM6Ly93aWtpLnB5dGhvbi5vcmcvbW9pbi9Ua0ludGVyPmBfCiAgICAgICBUaGUgUHl0aG9uIFRraW50ZXIgVG9waWMgR3VpZGUgcHJvdmlkZXMgYSBncmVhdCBkZWFsIG9mIGluZm9ybWF0aW9uIG9uIHVzaW5nIFRrCiAgICAgICBmcm9tIFB5dGhvbiBhbmQgbGlua3MgdG8gb3RoZXIgc291cmNlcyBvZiBpbmZvcm1hdGlvbiBvbiBUay4KIAotICAgYEFuIEludHJvZHVjdGlvbiB0byBUa2ludGVyIDxodHRwOi8vd3d3LnB5dGhvbndhcmUuY29tL2xpYnJhcnkvYW4taW50cm9kdWN0aW9uLXRvLXRraW50ZXIuaHRtPmBfCi0gICAgICBGcmVkcmlrIEx1bmRoJ3Mgb24tbGluZSByZWZlcmVuY2UgbWF0ZXJpYWwuCisgICBgVEtEb2NzIDxodHRwOi8vd3d3LnRrZG9jcy5jb20vPmBfCisgICAgICBFeHRlbnNpdmUgdHV0b3JpYWwgcGx1cyBmcmllbmRsaWVyIHdpZGdldCBwYWdlcyBmb3Igc29tZSBvZiB0aGUgd2lkZ2V0cy4KIAotICAgYFRraW50ZXIgcmVmZXJlbmNlOiBhIEdVSSBmb3IgUHl0aG9uIDxodHRwOi8vaW5mb2hvc3Qubm10LmVkdS90Y2MvaGVscC9wdWJzL2xhbmcuaHRtbD5gXworICAgYFRraW50ZXIgcmVmZXJlbmNlOiBhIEdVSSBmb3IgUHl0aG9uIDxodHRwOi8vaW5mb2hvc3Qubm10LmVkdS90Y2MvaGVscC9wdWJzL3RraW50ZXIvPmBfCiAgICAgICBPbi1saW5lIHJlZmVyZW5jZSBtYXRlcmlhbC4KIAorICAgYFRraW50ZXIgZG9jcyBmcm9tIGVmZmJvdCA8aHR0cDovL2VmZmJvdC5vcmcvdGtpbnRlcmJvb2svPmBfCisgICAgICBPbmxpbmUgcmVmZXJlbmNlIGZvciB0a2ludGVyIHN1cHBvcnRlZCBieSBlZmZib3Qub3JnLgorCisgICBgVGNsL1RrIG1hbnVhbCA8aHR0cDovL3d3dy50Y2wudGsvbWFuL3RjbDguNS8+YF8KKyAgICAgIE9mZmljaWFsIG1hbnVhbCBmb3IgdGhlIGxhdGVzdCB0Y2wvdGsgdmVyc2lvbi4KKworICAgYFByb2dyYW1taW5nIFB5dGhvbiA8aHR0cDovL3d3dy5hbWF6b24uY29tL1Byb2dyYW1taW5nLVB5dGhvbi1NYXJrLUx1dHovZHAvMDU5NjE1ODEwNi8+YF8KKyAgICAgIEJvb2sgYnkgTWFyayBMdXR6LCBoYXMgZXhjZWxsZW50IGNvdmVyYWdlIG9mIFRraW50ZXIuCisKKyAgIGBNb2Rlcm4gVGtpbnRlciBmb3IgQnVzeSBQeXRob24gRGV2ZWxvcGVycyA8aHR0cDovL3d3dy5hbWF6b24uY29tL01vZGVybi1Ua2ludGVyLVB5dGhvbi1EZXZlbG9wZXJzLWVib29rL2RwL0IwMDcxUUROTE8vPmBfCisgICAgICBCb29rIGJ5IE1hcmsgUm96ZXJtYW4gYWJvdXQgYnVpbGRpbmcgYXR0cmFjdGl2ZSBhbmQgbW9kZXJuIGdyYXBoaWNhbCB1c2VyIGludGVyZmFjZXMgd2l0aCBQeXRob24gYW5kIFRraW50ZXIuCisKICAgIGBQeXRob24gYW5kIFRraW50ZXIgUHJvZ3JhbW1pbmcgPGh0dHA6Ly93d3cuYW1hem9uLmNvbS9leGVjL29iaWRvcy9BU0lOLzE4ODQ3Nzc4MTM+YF8KICAgICAgIFRoZSBib29rIGJ5IEpvaG4gR3JheXNvbiAoSVNCTiAxLTg4NDc3Ny04MS0zKS4KIApAQCAtMTA5LDcgKzEyMSw3IEBACiA6bW9kOmB0dXJ0bGVgCiAgICBUdXJ0bGUgZ3JhcGhpY3MgaW4gYSBUayB3aW5kb3cuCiAKLVRoZXNlIGhhdmUgYmVlbiByZW5hbWVkIGFzIHdlbGwgaW4gUHl0aG9uIDMuMDsgdGhleSB3ZXJlIGFsbCBtYWRlIHN1Ym1vZHVsZXMgb2YKK1RoZXNlIGhhdmUgYmVlbiByZW5hbWVkIGFzIHdlbGwgaW4gUHl0aG9uIDM7IHRoZXkgd2VyZSBhbGwgbWFkZSBzdWJtb2R1bGVzIG9mCiB0aGUgbmV3IGBgdGtpbnRlcmBgIHBhY2thZ2UuCiAKIApAQCAtMTc2LDcgKzE4OCw3IEBACiAgICAgICBUaGUgVGsvVGNsIGRldmVsb3BtZW50IGlzIGxhcmdlbHkgdGFraW5nIHBsYWNlIGF0IEFjdGl2ZVN0YXRlLgogCiAgICBgVGNsIGFuZCB0aGUgVGsgVG9vbGtpdCA8aHR0cDovL3d3dy5hbWF6b24uY29tL2V4ZWMvb2JpZG9zL0FTSU4vMDIwMTYzMzM3WD5gXwotICAgICAgVGhlIGJvb2sgYnkgSm9obiBPdXN0ZXJob3V0LCB0aGUgaW52ZW50b3Igb2YgVGNsIC4KKyAgICAgIFRoZSBib29rIGJ5IEpvaG4gT3VzdGVyaG91dCwgdGhlIGludmVudG9yIG9mIFRjbC4KIAogICAgYFByYWN0aWNhbCBQcm9ncmFtbWluZyBpbiBUY2wgYW5kIFRrIDxodHRwOi8vd3d3LmFtYXpvbi5jb20vZXhlYy9vYmlkb3MvQVNJTi8wMTMwMjIwMjgwPmBfCiAgICAgICBCcmVudCBXZWxjaCdzIGVuY3ljbG9wZWRpYyBib29rLgpAQCAtNDQwLDcgKzQ1Miw3IEBACiBFeGFtcGxlOjoKIAogICAgPj4+IHByaW50IGZyZWQuY29uZmlnKCkKLSAgIHsncmVsaWVmJyA6ICgncmVsaWVmJywgJ3JlbGllZicsICdSZWxpZWYnLCAncmFpc2VkJywgJ2dyb292ZScpfQorICAgeydyZWxpZWYnOiAoJ3JlbGllZicsICdyZWxpZWYnLCAnUmVsaWVmJywgJ3JhaXNlZCcsICdncm9vdmUnKX0KIAogT2YgY291cnNlLCB0aGUgZGljdGlvbmFyeSBwcmludGVkIHdpbGwgaW5jbHVkZSBhbGwgdGhlIG9wdGlvbnMgYXZhaWxhYmxlIGFuZAogdGhlaXIgdmFsdWVzLiAgVGhpcyBpcyBtZWFudCBvbmx5IGFzIGFuIGV4YW1wbGUuCkBAIC02MTMsNyArNjI1LDcgQEAKICAgIHByZWNlZGVkIHdpdGggYW4gYGBAYGAsIGFzIGluIGBgIkAvdXNyL2NvbnRyaWIvYml0bWFwL2d1bWJ5LmJpdCJgYC4KIAogYm9vbGVhbgotICAgWW91IGNhbiBwYXNzIGludGVnZXJzIDAgb3IgMSBvciB0aGUgc3RyaW5ncyBgYCJ5ZXMiYGAgb3IgYGAibm8iYGAgLgorICAgWW91IGNhbiBwYXNzIGludGVnZXJzIDAgb3IgMSBvciB0aGUgc3RyaW5ncyBgYCJ5ZXMiYGAgb3IgYGAibm8iYGAuCiAKIGNhbGxiYWNrCiAgICBUaGlzIGlzIGFueSBQeXRob24gZnVuY3Rpb24gdGhhdCB0YWtlcyBubyBhcmd1bWVudHMuICBGb3IgZXhhbXBsZTo6CmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS90b2tlbml6ZS5yc3QgYi9Eb2MvbGlicmFyeS90b2tlbml6ZS5yc3QKaW5kZXggMzA2NzdlYS4uM2YyNWEyYyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdG9rZW5pemUucnN0CisrKyBiL0RvYy9saWJyYXJ5L3Rva2VuaXplLnJzdApAQCAtMTUsNiArMTUsMTMgQEAKIHdlbGwsIG1ha2luZyBpdCB1c2VmdWwgZm9yIGltcGxlbWVudGluZyAicHJldHR5LXByaW50ZXJzLCIgaW5jbHVkaW5nIGNvbG9yaXplcnMKIGZvciBvbi1zY3JlZW4gZGlzcGxheXMuCiAKK1RvIHNpbXBsaWZ5IHRva2VuIHN0cmVhbSBoYW5kbGluZywgYWxsIDpyZWY6YG9wZXJhdG9yc2AgYW5kIDpyZWY6YGRlbGltaXRlcnNgCit0b2tlbnMgYXJlIHJldHVybmVkIHVzaW5nIHRoZSBnZW5lcmljIDpkYXRhOmB0b2tlbi5PUGAgdG9rZW4gdHlwZS4gIFRoZSBleGFjdAordHlwZSBjYW4gYmUgZGV0ZXJtaW5lZCBieSBjaGVja2luZyB0aGUgc2Vjb25kIGZpZWxkIChjb250YWluaW5nIHRoZSBhY3R1YWwKK3Rva2VuIHN0cmluZyBtYXRjaGVkKSBvZiB0aGUgdHVwbGUgcmV0dXJuZWQgZnJvbQorOmZ1bmM6YHRva2VuaXplLmdlbmVyYXRlX3Rva2Vuc2AgZm9yIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgdGhhdCBpZGVudGlmaWVzIGEKK3NwZWNpZmljIG9wZXJhdG9yIHRva2VuLgorCiBUaGUgcHJpbWFyeSBlbnRyeSBwb2ludCBpcyBhIDp0ZXJtOmBnZW5lcmF0b3JgOgogCiAuLiBmdW5jdGlvbjo6IGdlbmVyYXRlX3Rva2VucyhyZWFkbGluZSkKQEAgLTIzLDcgKzMwLDggQEAKICAgIHdoaWNoIG11c3QgYmUgYSBjYWxsYWJsZSBvYmplY3Qgd2hpY2ggcHJvdmlkZXMgdGhlIHNhbWUgaW50ZXJmYWNlIGFzIHRoZQogICAgOm1ldGg6YHJlYWRsaW5lYCBtZXRob2Qgb2YgYnVpbHQtaW4gZmlsZSBvYmplY3RzIChzZWUgc2VjdGlvbgogICAgOnJlZjpgYmx0aW4tZmlsZS1vYmplY3RzYCkuICBFYWNoIGNhbGwgdG8gdGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gb25lIGxpbmUKLSAgIG9mIGlucHV0IGFzIGEgc3RyaW5nLgorICAgb2YgaW5wdXQgYXMgYSBzdHJpbmcuIEFsdGVybmF0ZWx5LCAqcmVhZGxpbmUqIG1heSBiZSBhIGNhbGxhYmxlIG9iamVjdCB0aGF0CisgICBzaWduYWxzIGNvbXBsZXRpb24gYnkgcmFpc2luZyA6ZXhjOmBTdG9wSXRlcmF0aW9uYC4KIAogICAgVGhlIGdlbmVyYXRvciBwcm9kdWNlcyA1LXR1cGxlcyB3aXRoIHRoZXNlIG1lbWJlcnM6IHRoZSB0b2tlbiB0eXBlOyB0aGUgdG9rZW4KICAgIHN0cmluZzsgYSAyLXR1cGxlIGBgKHNyb3csIHNjb2wpYGAgb2YgaW50cyBzcGVjaWZ5aW5nIHRoZSByb3cgYW5kIGNvbHVtbgpAQCAtOTAsNiArOTgsMjQgQEAKIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi41CiAKKy4uIGV4Y2VwdGlvbjo6IFRva2VuRXJyb3IKKworICAgUmFpc2VkIHdoZW4gZWl0aGVyIGEgZG9jc3RyaW5nIG9yIGV4cHJlc3Npb24gdGhhdCBtYXkgYmUgc3BsaXQgb3ZlciBzZXZlcmFsCisgICBsaW5lcyBpcyBub3QgY29tcGxldGVkIGFueXdoZXJlIGluIHRoZSBmaWxlLCBmb3IgZXhhbXBsZTo6CisKKyAgICAgICIiIkJlZ2lubmluZyBvZgorICAgICAgZG9jc3RyaW5nCisKKyAgIG9yOjoKKworICAgICAgWzEsCisgICAgICAgMiwKKyAgICAgICAzCisKK05vdGUgdGhhdCB1bmNsb3NlZCBzaW5nbGUtcXVvdGVkIHN0cmluZ3MgZG8gbm90IGNhdXNlIGFuIGVycm9yIHRvIGJlCityYWlzZWQuIFRoZXkgYXJlIHRva2VuaXplZCBhcyBgYEVSUk9SVE9LRU5gYCwgZm9sbG93ZWQgYnkgdGhlIHRva2VuaXphdGlvbiBvZgordGhlaXIgY29udGVudHMuCisKIEV4YW1wbGUgb2YgYSBzY3JpcHQgcmUtd3JpdGVyIHRoYXQgdHJhbnNmb3JtcyBmbG9hdCBsaXRlcmFscyBpbnRvIERlY2ltYWwKIG9iamVjdHM6OgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS90cmFjZS5yc3QgYi9Eb2MvbGlicmFyeS90cmFjZS5yc3QKaW5kZXggYTJhZmRhMS4uZTAwZjExOCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdHJhY2UucnN0CisrKyBiL0RvYy9saWJyYXJ5L3RyYWNlLnJzdApAQCAtNDEsOCArNDEsOCBAQAogCiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gaW52b2tpbmcKIDptb2Q6YHRyYWNlYC4gIFRoZSA6b3B0aW9uOmAtLWxpc3RmdW5jcyA8LWw+YCBvcHRpb24gaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGgKLXRoZSA6b3B0aW9uOmAtLXRyYWNlIDwtdD5gIGFuZCA6b3B0aW9uOmAtLWNvdW50cyA8LWM+YCBvcHRpb25zIC4gV2hlbgotOm9wdGlvbjpgLS1saXN0ZnVuY3MgPC1sPmAgaXMgcHJvdmlkZWQsIG5laXRoZXIgOm9wdGlvbjpgLS1jb3VudHMgPC1jPmAgbm9yCit0aGUgOm9wdGlvbjpgLS10cmFjZSA8LXQ+YCBhbmQgOm9wdGlvbjpgLS1jb3VudCA8LWM+YCBvcHRpb25zLiBXaGVuCis6b3B0aW9uOmAtLWxpc3RmdW5jcyA8LWw+YCBpcyBwcm92aWRlZCwgbmVpdGhlciA6b3B0aW9uOmAtLWNvdW50IDwtYz5gIG5vcgogOm9wdGlvbjpgLS10cmFjZSA8LXQ+YCBhcmUgYWNjZXB0ZWQsIGFuZCB2aWNlIHZlcnNhLgogCiAuLiBwcm9ncmFtOjogdHJhY2UKQEAgLTE0OSw3ICsxNDksNyBAQAogICAgICAgIHRoZSBjdXJyZW50IHRyYWNpbmcgcGFyYW1ldGVycy4gICpjbWQqIG11c3QgYmUgYSBzdHJpbmcgb3IgY29kZSBvYmplY3QsCiAgICAgICAgc3VpdGFibGUgZm9yIHBhc3NpbmcgaW50byA6ZnVuYzpgZXhlY2AuCiAKLSAgICAuLiBtZXRob2Q6OiBydW5jdHgoY21kWywgZ2xvYmFscz1Ob25lWywgbG9jYWxzPU5vbmVdXSkKKyAgICAuLiBtZXRob2Q6OiBydW5jdHgoY21kLCBnbG9iYWxzPU5vbmUsIGxvY2Fscz1Ob25lKQogCiAgICAgICAgRXhlY3V0ZSB0aGUgY29tbWFuZCBhbmQgZ2F0aGVyIHN0YXRpc3RpY3MgZnJvbSB0aGUgZXhlY3V0aW9uIHdpdGggdGhlCiAgICAgICAgY3VycmVudCB0cmFjaW5nIHBhcmFtZXRlcnMsIGluIHRoZSBkZWZpbmVkIGdsb2JhbCBhbmQgbG9jYWwKQEAgLTIwMCw3ICsyMDAsNyBAQAogICAgIyBydW4gdGhlIG5ldyBjb21tYW5kIHVzaW5nIHRoZSBnaXZlbiB0cmFjZXIKICAgIHRyYWNlci5ydW4oJ21haW4oKScpCiAKLSAgICMgbWFrZSBhIHJlcG9ydCwgcGxhY2luZyBvdXRwdXQgaW4gL3RtcAorICAgIyBtYWtlIGEgcmVwb3J0LCBwbGFjaW5nIG91dHB1dCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkKICAgIHIgPSB0cmFjZXIucmVzdWx0cygpCi0gICByLndyaXRlX3Jlc3VsdHMoc2hvd19taXNzaW5nPVRydWUsIGNvdmVyZGlyPSIvdG1wIikKKyAgIHIud3JpdGVfcmVzdWx0cyhzaG93X21pc3Npbmc9VHJ1ZSwgY292ZXJkaXI9Ii4iKQogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS90cmFjZWJhY2sucnN0IGIvRG9jL2xpYnJhcnkvdHJhY2ViYWNrLnJzdAppbmRleCAxNWVhYTZlLi42ODU5ZDRiIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS90cmFjZWJhY2sucnN0CisrKyBiL0RvYy9saWJyYXJ5L3RyYWNlYmFjay5yc3QKQEAgLTc1LDcgKzc1LDcgQEAKICAgIFJldHVybiBhIGxpc3Qgb2YgdXAgdG8gKmxpbWl0KiAicHJlLXByb2Nlc3NlZCIgc3RhY2sgdHJhY2UgZW50cmllcyBleHRyYWN0ZWQKICAgIGZyb20gdGhlIHRyYWNlYmFjayBvYmplY3QgKnRyYWNlYmFjayouICBJdCBpcyB1c2VmdWwgZm9yIGFsdGVybmF0ZSBmb3JtYXR0aW5nIG9mCiAgICBzdGFjayB0cmFjZXMuICBJZiAqbGltaXQqIGlzIG9taXR0ZWQgb3IgYGBOb25lYGAsIGFsbCBlbnRyaWVzIGFyZSBleHRyYWN0ZWQuICBBCi0gICAicHJlLXByb2Nlc3NlZCIgc3RhY2sgdHJhY2UgZW50cnkgaXMgYSBxdWFkcnVwbGUgKCpmaWxlbmFtZSosICpsaW5lIG51bWJlciosCisgICAicHJlLXByb2Nlc3NlZCIgc3RhY2sgdHJhY2UgZW50cnkgaXMgYSA0LXR1cGxlICgqZmlsZW5hbWUqLCAqbGluZSBudW1iZXIqLAogICAgKmZ1bmN0aW9uIG5hbWUqLCAqdGV4dCopIHJlcHJlc2VudGluZyB0aGUgaW5mb3JtYXRpb24gdGhhdCBpcyB1c3VhbGx5IHByaW50ZWQKICAgIGZvciBhIHN0YWNrIHRyYWNlLiAgVGhlICp0ZXh0KiBpcyBhIHN0cmluZyB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UKICAgIHN0cmlwcGVkOyBpZiB0aGUgc291cmNlIGlzIG5vdCBhdmFpbGFibGUgaXQgaXMgYGBOb25lYGAuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS90dGsucnN0IGIvRG9jL2xpYnJhcnkvdHRrLnJzdAppbmRleCA2ZThmZjg5Li42Y2FiM2UwIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS90dGsucnN0CisrKyBiL0RvYy9saWJyYXJ5L3R0ay5yc3QKQEAgLTI2NSwxMCArMjY1LDEwIEBACiAgICAgICAqeCogYW5kICp5KiBhcmUgcGl4ZWwgY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gdGhlIHdpZGdldC4KIAogCi0gICAuLiBtZXRob2Q6OiBpbnN0YXRlKHN0YXRlc3BlY1ssIGNhbGxiYWNrPU5vbmVbLCAqYXJnc1ssICoqa3ddXV0pCisgICAuLiBtZXRob2Q6OiBpbnN0YXRlKHN0YXRlc3BlYywgY2FsbGJhY2s9Tm9uZSwgKmFyZ3MsICoqa3cpCiAKLSAgICAgIFRlc3QgdGhlIHdpZGdldCdzIHN0YXRlLiBJZiBhIGNhbGxiYWNrIGlzIG5vdCBzcGVjaWZpZWQsIHJldHVybnMgVHJ1ZQotICAgICAgaWYgdGhlIHdpZGdldCBzdGF0ZSBtYXRjaGVzICpzdGF0ZXNwZWMqIGFuZCBGYWxzZSBvdGhlcndpc2UuIElmIGNhbGxiYWNrCisgICAgICBUZXN0IHRoZSB3aWRnZXQncyBzdGF0ZS4gSWYgYSBjYWxsYmFjayBpcyBub3Qgc3BlY2lmaWVkLCByZXR1cm5zIGBgVHJ1ZWBgCisgICAgICBpZiB0aGUgd2lkZ2V0IHN0YXRlIG1hdGNoZXMgKnN0YXRlc3BlYyogYW5kIGBgRmFsc2VgYCBvdGhlcndpc2UuIElmIGNhbGxiYWNrCiAgICAgICBpcyBzcGVjaWZpZWQgdGhlbiBpdCBpcyBjYWxsZWQgd2l0aCAqYXJncyogaWYgd2lkZ2V0IHN0YXRlIG1hdGNoZXMKICAgICAgICpzdGF0ZXNwZWMqLgogCkBAIC01MjMsNyArNTIzLDcgQEAKICAgICAgIG9taXR0ZWQsIHJldHVybnMgdGhlIHdpZGdldCBuYW1lIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGFuZS4KIAogCi0gICAuLiBtZXRob2Q6OiB0YWIodGFiX2lkWywgb3B0aW9uPU5vbmVbLCAqKmt3XV0pCisgICAuLiBtZXRob2Q6OiB0YWIodGFiX2lkLCBvcHRpb249Tm9uZSwgKiprdykKIAogICAgICAgUXVlcnkgb3IgbW9kaWZ5IHRoZSBvcHRpb25zIG9mIHRoZSBzcGVjaWZpYyAqdGFiX2lkKi4KIApAQCAtODQ2LDcgKzg0Niw3IEBACiAKIC4uIGNsYXNzOjogVHJlZXZpZXcKIAotICAgLi4gbWV0aG9kOjogYmJveChpdGVtWywgY29sdW1uPU5vbmVdKQorICAgLi4gbWV0aG9kOjogYmJveChpdGVtLCBjb2x1bW49Tm9uZSkKIAogICAgICAgUmV0dXJucyB0aGUgYm91bmRpbmcgYm94IChyZWxhdGl2ZSB0byB0aGUgdHJlZXZpZXcgd2lkZ2V0J3Mgd2luZG93KSBvZgogICAgICAgdGhlIHNwZWNpZmllZCAqaXRlbSogaW4gdGhlIGZvcm0gKHgsIHksIHdpZHRoLCBoZWlnaHQpLgpAQCAtODczLDcgKzg3Myw3IEBACiAgICAgICAqaXRlbSoncyBjaGlsZHJlbi4KIAogCi0gICAuLiBtZXRob2Q6OiBjb2x1bW4oY29sdW1uWywgb3B0aW9uPU5vbmVbLCAqKmt3XV0pCisgICAuLiBtZXRob2Q6OiBjb2x1bW4oY29sdW1uLCBvcHRpb249Tm9uZSwgKiprdykKIAogICAgICAgUXVlcnkgb3IgbW9kaWZ5IHRoZSBvcHRpb25zIGZvciB0aGUgc3BlY2lmaWVkICpjb2x1bW4qLgogCkBAIC05MTksNyArOTE5LDcgQEAKIAogICAgLi4gbWV0aG9kOjogZXhpc3RzKGl0ZW0pCiAKLSAgICAgIFJldHVybnMgVHJ1ZSBpZiB0aGUgc3BlY2lmaWVkICppdGVtKiBpcyBwcmVzZW50IGluIHRoZSB0cmVlLgorICAgICAgUmV0dXJucyBgYFRydWVgYCBpZiB0aGUgc3BlY2lmaWVkICppdGVtKiBpcyBwcmVzZW50IGluIHRoZSB0cmVlLgogCiAKICAgIC4uIG1ldGhvZDo6IGZvY3VzKFtpdGVtPU5vbmVdKQpAQCAtOTI4LDcgKzkyOCw3IEBACiAgICAgICB0aGUgY3VycmVudCBmb2N1cyBpdGVtLCBvciAnJyBpZiB0aGVyZSBpcyBub25lLgogCiAKLSAgIC4uIG1ldGhvZDo6IGhlYWRpbmcoY29sdW1uWywgb3B0aW9uPU5vbmVbLCAqKmt3XV0pCisgICAuLiBtZXRob2Q6OiBoZWFkaW5nKGNvbHVtbiwgb3B0aW9uPU5vbmUsICoqa3cpCiAKICAgICAgIFF1ZXJ5IG9yIG1vZGlmeSB0aGUgaGVhZGluZyBvcHRpb25zIGZvciB0aGUgc3BlY2lmaWVkICpjb2x1bW4qLgogCkBAIC0xMDAxLDcgKzEwMDEsNyBAQAogICAgICAgUmV0dXJucyB0aGUgaW50ZWdlciBpbmRleCBvZiAqaXRlbSogd2l0aGluIGl0cyBwYXJlbnQncyBsaXN0IG9mIGNoaWxkcmVuLgogCiAKLSAgIC4uIG1ldGhvZDo6IGluc2VydChwYXJlbnQsIGluZGV4WywgaWlkPU5vbmVbLCAqKmt3XV0pCisgICAuLiBtZXRob2Q6OiBpbnNlcnQocGFyZW50LCBpbmRleCwgaWlkPU5vbmUsICoqa3cpCiAKICAgICAgIENyZWF0ZXMgYSBuZXcgaXRlbSBhbmQgcmV0dXJucyB0aGUgaXRlbSBpZGVudGlmaWVyIG9mIHRoZSBuZXdseSBjcmVhdGVkCiAgICAgICBpdGVtLgpAQCAtMTA2NSw3ICsxMDY1LDcgQEAKIAogICAgICAgRW5zdXJlIHRoYXQgKml0ZW0qIGlzIHZpc2libGUuCiAKLSAgICAgIFNldHMgYWxsIG9mICppdGVtKidzIGFuY2VzdG9ycyBvcGVuIG9wdGlvbiB0byBUcnVlLCBhbmQgc2Nyb2xscyB0aGUKKyAgICAgIFNldHMgYWxsIG9mICppdGVtKidzIGFuY2VzdG9ycyBvcGVuIG9wdGlvbiB0byBgYFRydWVgYCwgYW5kIHNjcm9sbHMgdGhlCiAgICAgICB3aWRnZXQgaWYgbmVjZXNzYXJ5IHNvIHRoYXQgKml0ZW0qIGlzIHdpdGhpbiB0aGUgdmlzaWJsZSBwb3J0aW9uIG9mCiAgICAgICB0aGUgdHJlZS4KIApAQCAtMTA5Niw3ICsxMDk2LDcgQEAKICAgICAgIFRvZ2dsZSB0aGUgc2VsZWN0aW9uIHN0YXRlIG9mIGVhY2ggaXRlbSBpbiAqaXRlbXMqLgogCiAKLSAgIC4uIG1ldGhvZDo6IHNldChpdGVtWywgY29sdW1uPU5vbmVbLCB2YWx1ZT1Ob25lXV0pCisgICAuLiBtZXRob2Q6OiBzZXQoaXRlbSwgY29sdW1uPU5vbmUsIHZhbHVlPU5vbmUpCiAKICAgICAgIFdpdGggb25lIGFyZ3VtZW50LCByZXR1cm5zIGEgZGljdGlvbmFyeSBvZiBjb2x1bW4vdmFsdWUgcGFpcnMgZm9yIHRoZQogICAgICAgc3BlY2lmaWVkICppdGVtKi4gV2l0aCB0d28gYXJndW1lbnRzLCByZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZQpAQCAtMTEwNCwxNCArMTEwNCwxNCBAQAogICAgICAgKmNvbHVtbiogaW4gZ2l2ZW4gKml0ZW0qIHRvIHRoZSBzcGVjaWZpZWQgKnZhbHVlKi4KIAogCi0gICAuLiBtZXRob2Q6OiB0YWdfYmluZCh0YWduYW1lWywgc2VxdWVuY2U9Tm9uZVssIGNhbGxiYWNrPU5vbmVdXSkKKyAgIC4uIG1ldGhvZDo6IHRhZ19iaW5kKHRhZ25hbWUsIHNlcXVlbmNlPU5vbmUsIGNhbGxiYWNrPU5vbmUpCiAKICAgICAgIEJpbmQgYSBjYWxsYmFjayBmb3IgdGhlIGdpdmVuIGV2ZW50ICpzZXF1ZW5jZSogdG8gdGhlIHRhZyAqdGFnbmFtZSouCiAgICAgICBXaGVuIGFuIGV2ZW50IGlzIGRlbGl2ZXJlZCB0byBhbiBpdGVtLCB0aGUgY2FsbGJhY2tzIGZvciBlYWNoIG9mIHRoZQogICAgICAgaXRlbSdzIHRhZ3Mgb3B0aW9uIGFyZSBjYWxsZWQuCiAKIAotICAgLi4gbWV0aG9kOjogdGFnX2NvbmZpZ3VyZSh0YWduYW1lWywgb3B0aW9uPU5vbmVbLCAqKmt3XV0pCisgICAuLiBtZXRob2Q6OiB0YWdfY29uZmlndXJlKHRhZ25hbWUsIG9wdGlvbj1Ob25lLCAqKmt3KQogCiAgICAgICBRdWVyeSBvciBtb2RpZnkgdGhlIG9wdGlvbnMgZm9yIHRoZSBzcGVjaWZpZWQgKnRhZ25hbWUqLgogCkBAIC0xMjIwLDcgKzEyMjAsNyBAQAogICAgICAgZm9yZWdyb3VuZCBvcHRpb24sIGZvciBleGFtcGxlLCB5b3Ugd291bGQgZ2V0IGEgYmx1ZSBmb3JlZ3JvdW5kCiAgICAgICB3aGVuIHRoZSB3aWRnZXQgaXMgaW4gdGhlIGFjdGl2ZSBvciBwcmVzc2VkIHN0YXRlcy4KIAotICAgLi4gbWV0aG9kOjogbG9va3VwKHN0eWxlLCBvcHRpb25bLCBzdGF0ZT1Ob25lWywgZGVmYXVsdD1Ob25lXV0pCisgICAuLiBtZXRob2Q6OiBsb29rdXAoc3R5bGUsIG9wdGlvbiwgc3RhdGU9Tm9uZSwgZGVmYXVsdD1Ob25lKQogCiAgICAgICBSZXR1cm5zIHRoZSB2YWx1ZSBzcGVjaWZpZWQgZm9yICpvcHRpb24qIGluICpzdHlsZSouCiAKQEAgLTEyMzUsNyArMTIzNSw3IEBACiAgICAgICAgICBwcmludCB0dGsuU3R5bGUoKS5sb29rdXAoIlRCdXR0b24iLCAiZm9udCIpCiAKIAotICAgLi4gbWV0aG9kOjogbGF5b3V0KHN0eWxlWywgbGF5b3V0c3BlYz1Ob25lXSkKKyAgIC4uIG1ldGhvZDo6IGxheW91dChzdHlsZSwgbGF5b3V0c3BlYz1Ob25lKQogCiAgICAgICBEZWZpbmUgdGhlIHdpZGdldCBsYXlvdXQgZm9yIGdpdmVuICpzdHlsZSouIElmICpsYXlvdXRzcGVjKiBpcyBvbWl0dGVkLAogICAgICAgcmV0dXJuIHRoZSBsYXlvdXQgc3BlY2lmaWNhdGlvbiBmb3IgZ2l2ZW4gc3R5bGUuCkBAIC0xMjk0LDcgKzEyOTQsNyBAQAogCiAgICAgICAgKiBzdGlja3k9c3BlYwogICAgICAgICAgIFNwZWNpZmllcyBob3cgdGhlIGltYWdlIGlzIHBsYWNlZCB3aXRoaW4gdGhlIGZpbmFsIHBhcmNlbC4gc3BlYwotICAgICAgICAgIGNvbnRhaW5zIHplcm8gb3IgbW9yZSBjaGFyYWN0ZXJzIOKAnG7igJ0sIOKAnHPigJ0sIOKAnHfigJ0sIG9yIOKAnGXigJ0uCisgICAgICAgICAgY29udGFpbnMgemVybyBvciBtb3JlIGNoYXJhY3RlcnMgIm4iLCAicyIsICJ3Iiwgb3IgImUiLgogCiAgICAgICAgKiB3aWR0aD13aWR0aAogICAgICAgICAgIFNwZWNpZmllcyBhIG1pbmltdW0gd2lkdGggZm9yIHRoZSBlbGVtZW50LiBJZiBsZXNzIHRoYW4gemVybywgdGhlCkBAIC0xMzE4LDcgKzEzMTgsNyBAQAogICAgICAgUmV0dXJucyB0aGUgbGlzdCBvZiAqZWxlbWVudG5hbWUqJ3Mgb3B0aW9ucy4KIAogCi0gICAuLiBtZXRob2Q6OiB0aGVtZV9jcmVhdGUodGhlbWVuYW1lWywgcGFyZW50PU5vbmVbLCBzZXR0aW5ncz1Ob25lXV0pCisgICAuLiBtZXRob2Q6OiB0aGVtZV9jcmVhdGUodGhlbWVuYW1lLCBwYXJlbnQ9Tm9uZSwgc2V0dGluZ3M9Tm9uZSkKIAogICAgICAgQ3JlYXRlIGEgbmV3IHRoZW1lLgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS90dXJ0bGUucnN0IGIvRG9jL2xpYnJhcnkvdHVydGxlLnJzdAppbmRleCBlMDUzMDVhLi4wMWRhNmEwIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS90dXJ0bGUucnN0CisrKyBiL0RvYy9saWJyYXJ5L3R1cnRsZS5yc3QKQEAgLTEwNDksOCArMTA0OSw4IEBACiAKICAgIFdyaXRlIHRleHQgLSB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mICphcmcqIC0gYXQgdGhlIGN1cnJlbnQgdHVydGxlCiAgICBwb3NpdGlvbiBhY2NvcmRpbmcgdG8gKmFsaWduKiAoImxlZnQiLCAiY2VudGVyIiBvciByaWdodCIpIGFuZCB3aXRoIHRoZSBnaXZlbgotICAgZm9udC4gIElmICptb3ZlKiBpcyBUcnVlLCB0aGUgcGVuIGlzIG1vdmVkIHRvIHRoZSBib3R0b20tcmlnaHQgY29ybmVyIG9mIHRoZQotICAgdGV4dC4gIEJ5IGRlZmF1bHQsICptb3ZlKiBpcyBGYWxzZS4KKyAgIGZvbnQuICBJZiAqbW92ZSogaXMgdHJ1ZSwgdGhlIHBlbiBpcyBtb3ZlZCB0byB0aGUgYm90dG9tLXJpZ2h0IGNvcm5lciBvZiB0aGUKKyAgIHRleHQuICBCeSBkZWZhdWx0LCAqbW92ZSogaXMgYGBGYWxzZWBgLgogCiAgICA+Pj4gdHVydGxlLndyaXRlKCJIb21lID0gIiwgVHJ1ZSwgYWxpZ249ImNlbnRlciIpCiAgICA+Pj4gdHVydGxlLndyaXRlKCgwLDApLCBUcnVlKQpAQCAtMTA4Niw3ICsxMDg2LDcgQEAKIAogLi4gZnVuY3Rpb246OiBpc3Zpc2libGUoKQogCi0gICBSZXR1cm4gVHJ1ZSBpZiB0aGUgVHVydGxlIGlzIHNob3duLCBGYWxzZSBpZiBpdCdzIGhpZGRlbi4KKyAgIFJldHVybiBgYFRydWVgYCBpZiB0aGUgVHVydGxlIGlzIHNob3duLCBgYEZhbHNlYGAgaWYgaXQncyBoaWRkZW4uCiAKICAgID4+PiB0dXJ0bGUuaGlkZXR1cnRsZSgpCiAgICA+Pj4gdHVydGxlLmlzdmlzaWJsZSgpCkBAIC0xODU5LDcgKzE4NTksNyBAQAogICAgOnBhcmFtIHN0YXJ0eDogaWYgcG9zaXRpdmUsIHN0YXJ0aW5nIHBvc2l0aW9uIGluIHBpeGVscyBmcm9tIHRoZSBsZWZ0CiAgICAgICAgICAgICAgICAgICBlZGdlIG9mIHRoZSBzY3JlZW4sIGlmIG5lZ2F0aXZlIGZyb20gdGhlIHJpZ2h0IGVkZ2UsIGlmIE5vbmUsCiAgICAgICAgICAgICAgICAgICBjZW50ZXIgd2luZG93IGhvcml6b250YWxseQotICAgOnBhcmFtIHN0YXJ0eDogaWYgcG9zaXRpdmUsIHN0YXJ0aW5nIHBvc2l0aW9uIGluIHBpeGVscyBmcm9tIHRoZSB0b3AKKyAgIDpwYXJhbSBzdGFydHk6IGlmIHBvc2l0aXZlLCBzdGFydGluZyBwb3NpdGlvbiBpbiBwaXhlbHMgZnJvbSB0aGUgdG9wCiAgICAgICAgICAgICAgICAgICBlZGdlIG9mIHRoZSBzY3JlZW4sIGlmIG5lZ2F0aXZlIGZyb20gdGhlIGJvdHRvbSBlZGdlLCBpZiBOb25lLAogICAgICAgICAgICAgICAgICAgY2VudGVyIHdpbmRvdyB2ZXJ0aWNhbGx5CiAKQEAgLTIxNzMsOSArMjE3MywxMSBAQAogCiBUaGUgZGVtb3NjcmlwdHMgYXJlOgogCisuLiB0YWJ1bGFyY29sdW1uczo6IHxsfEx8THwKKwogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogfCBOYW1lICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgfCBGZWF0dXJlcyAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworKz09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09KwogfCBieXRlZGVzaWduICAgICB8IGNvbXBsZXggY2xhc3NpY2FsICAgICAgICAgICAgfCA6ZnVuYzpgdHJhY2VyYCwgZGVsYXksfAogfCAgICAgICAgICAgICAgICB8IHR1cnRsZWdyYXBoaWNzIHBhdHRlcm4gICAgICAgfCA6ZnVuYzpgdXBkYXRlYCAgICAgICAgfAogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdW5pY29kZWRhdGEucnN0IGIvRG9jL2xpYnJhcnkvdW5pY29kZWRhdGEucnN0CmluZGV4IGM3NjVkNzQuLmEzYTdjOTYgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3VuaWNvZGVkYXRhLnJzdAorKysgYi9Eb2MvbGlicmFyeS91bmljb2RlZGF0YS5yc3QKQEAgLTY2LDcgKzY2LDcgQEAKIAogLi4gZnVuY3Rpb246OiBiaWRpcmVjdGlvbmFsKHVuaWNocikKIAotICAgUmV0dXJucyB0aGUgYmlkaXJlY3Rpb25hbCBjYXRlZ29yeSBhc3NpZ25lZCB0byB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgKnVuaWNociogYXMKKyAgIFJldHVybnMgdGhlIGJpZGlyZWN0aW9uYWwgY2xhc3MgYXNzaWduZWQgdG8gdGhlIFVuaWNvZGUgY2hhcmFjdGVyICp1bmljaHIqIGFzCiAgICBzdHJpbmcuIElmIG5vIHN1Y2ggdmFsdWUgaXMgZGVmaW5lZCwgYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgogCiAKQEAgLTEwNyw3ICsxMDcsNyBAQAogICAgYmFzZWQgb24gdGhlIGRlZmluaXRpb24gb2YgY2Fub25pY2FsIGVxdWl2YWxlbmNlIGFuZCBjb21wYXRpYmlsaXR5IGVxdWl2YWxlbmNlLgogICAgSW4gVW5pY29kZSwgc2V2ZXJhbCBjaGFyYWN0ZXJzIGNhbiBiZSBleHByZXNzZWQgaW4gdmFyaW91cyB3YXkuIEZvciBleGFtcGxlLCB0aGUKICAgIGNoYXJhY3RlciBVKzAwQzcgKExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBKSBjYW4gYWxzbyBiZSBleHByZXNzZWQgYXMKLSAgIHRoZSBzZXF1ZW5jZSBVKzAzMjcgKENPTUJJTklORyBDRURJTExBKSBVKzAwNDMgKExBVElOIENBUElUQUwgTEVUVEVSIEMpLgorICAgdGhlIHNlcXVlbmNlIFUrMDA0MyAoTEFUSU4gQ0FQSVRBTCBMRVRURVIgQykgVSswMzI3IChDT01CSU5JTkcgQ0VESUxMQSkuCiAKICAgIEZvciBlYWNoIGNoYXJhY3RlciwgdGhlcmUgYXJlIHR3byBub3JtYWwgZm9ybXM6IG5vcm1hbCBmb3JtIEMgYW5kIG5vcm1hbCBmb3JtIEQuCiAgICBOb3JtYWwgZm9ybSBEIChORkQpIGlzIGFsc28ga25vd24gYXMgY2Fub25pY2FsIGRlY29tcG9zaXRpb24sIGFuZCB0cmFuc2xhdGVzCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS91bml0dGVzdC5yc3QgYi9Eb2MvbGlicmFyeS91bml0dGVzdC5yc3QKaW5kZXggM2Q4YTg0ZC4uZDgyYzQwNyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdW5pdHRlc3QucnN0CisrKyBiL0RvYy9saWJyYXJ5L3VuaXR0ZXN0LnJzdApAQCAtOTEsNyArOTEsNyBAQAogICAgICAgVGhpcmQtcGFydHkgdW5pdHRlc3QgZnJhbWV3b3JrcyB3aXRoIGEgbGlnaHRlci13ZWlnaHQgc3ludGF4IGZvciB3cml0aW5nCiAgICAgICB0ZXN0cy4gIEZvciBleGFtcGxlLCBgYGFzc2VydCBmdW5jKDEwKSA9PSA0MmBgLgogCi0gICBgVGhlIFB5dGhvbiBUZXN0aW5nIFRvb2xzIFRheG9ub215IDxodHRwOi8vcHljaGVlc2VjYWtlLm9yZy93aWtpL1B5dGhvblRlc3RpbmdUb29sc1RheG9ub215PmBfCisgICBgVGhlIFB5dGhvbiBUZXN0aW5nIFRvb2xzIFRheG9ub215IDxodHRwOi8vd2lraS5weXRob24ub3JnL21vaW4vUHl0aG9uVGVzdGluZ1Rvb2xzVGF4b25vbXk+YF8KICAgICAgIEFuIGV4dGVuc2l2ZSBsaXN0IG9mIFB5dGhvbiB0ZXN0aW5nIHRvb2xzIGluY2x1ZGluZyBmdW5jdGlvbmFsIHRlc3RpbmcKICAgICAgIGZyYW1ld29ya3MgYW5kIG1vY2sgb2JqZWN0IGxpYnJhcmllcy4KIApAQCAtMjc5LDE1ICsyNzksMTUgQEAKIAogICAgVmVyYm9zZSBvdXRwdXQKIAotLi4gY21kb3B0aW9uOjogLXMgZGlyZWN0b3J5CisuLiBjbWRvcHRpb246OiAtcywgLS1zdGFydC1kaXJlY3RvcnkgZGlyZWN0b3J5CiAKLSAgIERpcmVjdG9yeSB0byBzdGFydCBkaXNjb3ZlcnkgKCcuJyBkZWZhdWx0KQorICAgRGlyZWN0b3J5IHRvIHN0YXJ0IGRpc2NvdmVyeSAoYGAuYGAgZGVmYXVsdCkKIAotLi4gY21kb3B0aW9uOjogLXAgcGF0dGVybgorLi4gY21kb3B0aW9uOjogLXAsIC0tcGF0dGVybiBwYXR0ZXJuCiAKLSAgIFBhdHRlcm4gdG8gbWF0Y2ggdGVzdCBmaWxlcyAoJ3Rlc3QqLnB5JyBkZWZhdWx0KQorICAgUGF0dGVybiB0byBtYXRjaCB0ZXN0IGZpbGVzIChgYHRlc3QqLnB5YGAgZGVmYXVsdCkKIAotLi4gY21kb3B0aW9uOjogLXQgZGlyZWN0b3J5CisuLiBjbWRvcHRpb246OiAtdCwgLS10b3AtbGV2ZWwtZGlyZWN0b3J5IGRpcmVjdG9yeQogCiAgICBUb3AgbGV2ZWwgZGlyZWN0b3J5IG9mIHByb2plY3QgKGRlZmF1bHRzIHRvIHN0YXJ0IGRpcmVjdG9yeSkKIApAQCAtMzUyLDcgKzM1Miw3IEBACiAgICAgICAgICAgIHdpZGdldCA9IFdpZGdldCgnVGhlIHdpZGdldCcpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2lkZ2V0LnNpemUoKSwgKDUwLCA1MCksICdpbmNvcnJlY3QgZGVmYXVsdCBzaXplJykKIAotTm90ZSB0aGF0IGluIG9yZGVyIHRvIHRlc3Qgc29tZXRoaW5nLCB3ZSB1c2UgdGhlIG9uZSBvZiB0aGUgOm1ldGg6YGFzc2VydFwqYAorTm90ZSB0aGF0IGluIG9yZGVyIHRvIHRlc3Qgc29tZXRoaW5nLCB3ZSB1c2Ugb25lIG9mIHRoZSA6bWV0aDpgYXNzZXJ0XCpgCiBtZXRob2RzIHByb3ZpZGVkIGJ5IHRoZSA6Y2xhc3M6YFRlc3RDYXNlYCBiYXNlIGNsYXNzLiAgSWYgdGhlIHRlc3QgZmFpbHMsIGFuCiBleGNlcHRpb24gd2lsbCBiZSByYWlzZWQsIGFuZCA6bW9kOmB1bml0dGVzdGAgd2lsbCBpZGVudGlmeSB0aGUgdGVzdCBjYXNlIGFzIGEKIDpkZm46YGZhaWx1cmVgLiAgQW55IG90aGVyIGV4Y2VwdGlvbnMgd2lsbCBiZSB0cmVhdGVkIGFzIDpkZm46YGVycm9yc2AuIFRoaXMKQEAgLTU4NCw3ICs1ODQsNyBAQAogU2tpcHBpbmcgYSB0ZXN0IGlzIHNpbXBseSBhIG1hdHRlciBvZiB1c2luZyB0aGUgOmZ1bmM6YHNraXBgIDp0ZXJtOmBkZWNvcmF0b3JgCiBvciBvbmUgb2YgaXRzIGNvbmRpdGlvbmFsIHZhcmlhbnRzLgogCi1CYXNpYyBza2lwcGluZyBsb29rcyBsaWtlIHRoaXM6IDo6CitCYXNpYyBza2lwcGluZyBsb29rcyBsaWtlIHRoaXM6OgogCiAgICBjbGFzcyBNeVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtNjAzLDcgKzYwMyw3IEBACiAgICAgICAgICAgICMgd2luZG93cyBzcGVjaWZpYyB0ZXN0aW5nIGNvZGUKICAgICAgICAgICAgcGFzcwogCi1UaGlzIGlzIHRoZSBvdXRwdXQgb2YgcnVubmluZyB0aGUgZXhhbXBsZSBhYm92ZSBpbiB2ZXJib3NlIG1vZGU6IDo6CitUaGlzIGlzIHRoZSBvdXRwdXQgb2YgcnVubmluZyB0aGUgZXhhbXBsZSBhYm92ZSBpbiB2ZXJib3NlIG1vZGU6OgogCiAgICB0ZXN0X2Zvcm1hdCAoX19tYWluX18uTXlUZXN0Q2FzZSkgLi4uIHNraXBwZWQgJ25vdCBzdXBwb3J0ZWQgaW4gdGhpcyBsaWJyYXJ5IHZlcnNpb24nCiAgICB0ZXN0X25vdGhpbmcgKF9fbWFpbl9fLk15VGVzdENhc2UpIC4uLiBza2lwcGVkICdkZW1vbnN0cmF0aW5nIHNraXBwaW5nJwpAQCAtNjE0LDkgKzYxNCw5IEBACiAKICAgIE9LIChza2lwcGVkPTMpCiAKLUNsYXNzZXMgY2FuIGJlIHNraXBwZWQganVzdCBsaWtlIG1ldGhvZHM6IDo6CitDbGFzc2VzIGNhbiBiZSBza2lwcGVkIGp1c3QgbGlrZSBtZXRob2RzOjoKIAotICAgQHNraXAoInNob3dpbmcgY2xhc3Mgc2tpcHBpbmciKQorICAgQHVuaXR0ZXN0LnNraXAoInNob3dpbmcgY2xhc3Mgc2tpcHBpbmciKQogICAgY2xhc3MgTXlTa2lwcGVkVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgICAgIGRlZiB0ZXN0X25vdF9ydW4oc2VsZik6CiAgICAgICAgICAgIHBhc3MKQEAgLTYzMywxMiArNjMzLDEyIEBACiAKIEl0J3MgZWFzeSB0byByb2xsIHlvdXIgb3duIHNraXBwaW5nIGRlY29yYXRvcnMgYnkgbWFraW5nIGEgZGVjb3JhdG9yIHRoYXQgY2FsbHMKIDpmdW5jOmBza2lwYCBvbiB0aGUgdGVzdCB3aGVuIGl0IHdhbnRzIGl0IHRvIGJlIHNraXBwZWQuICBUaGlzIGRlY29yYXRvciBza2lwcwotdGhlIHRlc3QgdW5sZXNzIHRoZSBwYXNzZWQgb2JqZWN0IGhhcyBhIGNlcnRhaW4gYXR0cmlidXRlOiA6OgordGhlIHRlc3QgdW5sZXNzIHRoZSBwYXNzZWQgb2JqZWN0IGhhcyBhIGNlcnRhaW4gYXR0cmlidXRlOjoKIAogICAgZGVmIHNraXBVbmxlc3NIYXNhdHRyKG9iaiwgYXR0cik6CiAgICAgICAgaWYgaGFzYXR0cihvYmosIGF0dHIpOgogICAgICAgICAgICByZXR1cm4gbGFtYmRhIGZ1bmM6IGZ1bmMKLSAgICAgICByZXR1cm4gdW5pdHRlc3Quc2tpcCgiezAhcn0gZG9lc24ndCBoYXZlIHsxIXJ9Ii5mb3JtYXQob2JqLCBhdHRyKSkKKyAgICAgICByZXR1cm4gdW5pdHRlc3Quc2tpcCgieyFyfSBkb2Vzbid0IGhhdmUgeyFyfSIuZm9ybWF0KG9iaiwgYXR0cikpCiAKIFRoZSBmb2xsb3dpbmcgZGVjb3JhdG9ycyBpbXBsZW1lbnQgdGVzdCBza2lwcGluZyBhbmQgZXhwZWN0ZWQgZmFpbHVyZXM6CiAKQEAgLTY2MCw2ICs2NjAsMTMgQEAKICAgIE1hcmsgdGhlIHRlc3QgYXMgYW4gZXhwZWN0ZWQgZmFpbHVyZS4gIElmIHRoZSB0ZXN0IGZhaWxzIHdoZW4gcnVuLCB0aGUgdGVzdAogICAgaXMgbm90IGNvdW50ZWQgYXMgYSBmYWlsdXJlLgogCisuLiBleGNlcHRpb246OiBTa2lwVGVzdChyZWFzb24pCisKKyAgIFRoaXMgZXhjZXB0aW9uIGlzIHJhaXNlZCB0byBza2lwIGEgdGVzdC4KKworICAgVXN1YWxseSB5b3UgY2FuIHVzZSA6bWV0aDpgVGVzdENhc2Uuc2tpcFRlc3RgIG9yIG9uZSBvZiB0aGUgc2tpcHBpbmcKKyAgIGRlY29yYXRvcnMgaW5zdGVhZCBvZiByYWlzaW5nIHRoaXMgZGlyZWN0bHkuCisKIFNraXBwZWQgdGVzdHMgd2lsbCBub3QgaGF2ZSA6bWV0aDpgc2V0VXBgIG9yIDptZXRoOmB0ZWFyRG93bmAgcnVuIGFyb3VuZCB0aGVtLgogU2tpcHBlZCBjbGFzc2VzIHdpbGwgbm90IGhhdmUgOm1ldGg6YHNldFVwQ2xhc3NgIG9yIDptZXRoOmB0ZWFyRG93bkNsYXNzYCBydW4uCiAKQEAgLTcxMiw5ICs3MTksOSBAQAogICAgLi4gbWV0aG9kOjogc2V0VXAoKQogCiAgICAgICBNZXRob2QgY2FsbGVkIHRvIHByZXBhcmUgdGhlIHRlc3QgZml4dHVyZS4gIFRoaXMgaXMgY2FsbGVkIGltbWVkaWF0ZWx5Ci0gICAgICBiZWZvcmUgY2FsbGluZyB0aGUgdGVzdCBtZXRob2Q7IGFueSBleGNlcHRpb24gcmFpc2VkIGJ5IHRoaXMgbWV0aG9kIHdpbGwKLSAgICAgIGJlIGNvbnNpZGVyZWQgYW4gZXJyb3IgcmF0aGVyIHRoYW4gYSB0ZXN0IGZhaWx1cmUuIFRoZSBkZWZhdWx0Ci0gICAgICBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCisgICAgICBiZWZvcmUgY2FsbGluZyB0aGUgdGVzdCBtZXRob2Q7IG90aGVyIHRoYW4gOmV4YzpgQXNzZXJ0aW9uRXJyb3JgIG9yIDpleGM6YFNraXBUZXN0YCwKKyAgICAgIGFueSBleGNlcHRpb24gcmFpc2VkIGJ5IHRoaXMgbWV0aG9kIHdpbGwgYmUgY29uc2lkZXJlZCBhbiBlcnJvciByYXRoZXIgdGhhbgorICAgICAgYSB0ZXN0IGZhaWx1cmUuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KIAogCiAgICAuLiBtZXRob2Q6OiB0ZWFyRG93bigpCkBAIC03MjIsMTAgKzcyOSwxMCBAQAogICAgICAgTWV0aG9kIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgdGVzdCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIGFuZCB0aGUKICAgICAgIHJlc3VsdCByZWNvcmRlZC4gIFRoaXMgaXMgY2FsbGVkIGV2ZW4gaWYgdGhlIHRlc3QgbWV0aG9kIHJhaXNlZCBhbgogICAgICAgZXhjZXB0aW9uLCBzbyB0aGUgaW1wbGVtZW50YXRpb24gaW4gc3ViY2xhc3NlcyBtYXkgbmVlZCB0byBiZSBwYXJ0aWN1bGFybHkKLSAgICAgIGNhcmVmdWwgYWJvdXQgY2hlY2tpbmcgaW50ZXJuYWwgc3RhdGUuICBBbnkgZXhjZXB0aW9uIHJhaXNlZCBieSB0aGlzCi0gICAgICBtZXRob2Qgd2lsbCBiZSBjb25zaWRlcmVkIGFuIGVycm9yIHJhdGhlciB0aGFuIGEgdGVzdCBmYWlsdXJlLiAgVGhpcwotICAgICAgbWV0aG9kIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgdGhlIDptZXRoOmBzZXRVcGAgc3VjY2VlZHMsIHJlZ2FyZGxlc3Mgb2YKLSAgICAgIHRoZSBvdXRjb21lIG9mIHRoZSB0ZXN0IG1ldGhvZC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgorICAgICAgY2FyZWZ1bCBhYm91dCBjaGVja2luZyBpbnRlcm5hbCBzdGF0ZS4gIEFueSBleGNlcHRpb24sIG90aGVyIHRoYW4gOmV4YzpgQXNzZXJ0aW9uRXJyb3JgCisgICAgICBvciA6ZXhjOmBTa2lwVGVzdGAsIHJhaXNlZCBieSB0aGlzIG1ldGhvZCB3aWxsIGJlIGNvbnNpZGVyZWQgYW4gZXJyb3IgcmF0aGVyIHRoYW4gYQorICAgICAgdGVzdCBmYWlsdXJlLiAgVGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgOm1ldGg6YHNldFVwYCBzdWNjZWVkcywKKyAgICAgIHJlZ2FyZGxlc3Mgb2YgdGhlIG91dGNvbWUgb2YgdGhlIHRlc3QgbWV0aG9kLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCiAKIAogICAgLi4gbWV0aG9kOjogc2V0VXBDbGFzcygpCkBAIC04NDAsMTMgKzg0NywxMyBAQAogCiAgICAgICBJbiBhZGRpdGlvbiwgaWYgKmZpcnN0KiBhbmQgKnNlY29uZCogYXJlIHRoZSBleGFjdCBzYW1lIHR5cGUgYW5kIG9uZSBvZgogICAgICAgbGlzdCwgdHVwbGUsIGRpY3QsIHNldCwgZnJvemVuc2V0IG9yIHVuaWNvZGUgb3IgYW55IHR5cGUgdGhhdCBhIHN1YmNsYXNzCi0gICAgICByZWdpc3RlcnMgd2l0aCA6bWV0aDpgYWRkVHlwZUVxdWFsaXR5RnVuY2AgdGhlIHR5cGUgc3BlY2lmaWMgZXF1YWxpdHkKKyAgICAgIHJlZ2lzdGVycyB3aXRoIDptZXRoOmBhZGRUeXBlRXF1YWxpdHlGdW5jYCB0aGUgdHlwZS1zcGVjaWZpYyBlcXVhbGl0eQogICAgICAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgYSBtb3JlIHVzZWZ1bCBkZWZhdWx0CiAgICAgICBlcnJvciBtZXNzYWdlIChzZWUgYWxzbyB0aGUgOnJlZjpgbGlzdCBvZiB0eXBlLXNwZWNpZmljIG1ldGhvZHMKICAgICAgIDx0eXBlLXNwZWNpZmljLW1ldGhvZHM+YCkuCiAKICAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi43Ci0gICAgICAgICBBZGRlZCB0aGUgYXV0b21hdGljIGNhbGxpbmcgb2YgdHlwZSBzcGVjaWZpYyBlcXVhbGl0eSBmdW5jdGlvbi4KKyAgICAgICAgIEFkZGVkIHRoZSBhdXRvbWF0aWMgY2FsbGluZyBvZiB0eXBlLXNwZWNpZmljIGVxdWFsaXR5IGZ1bmN0aW9uLgogCiAKICAgIC4uIG1ldGhvZDo6IGFzc2VydE5vdEVxdWFsKGZpcnN0LCBzZWNvbmQsIG1zZz1Ob25lKQpAQCAtODk1LDggKzkwMiw3IEBACiAKICAgICAgIFRlc3QgdGhhdCAqb2JqKiBpcyAob3IgaXMgbm90KSBhbiBpbnN0YW5jZSBvZiAqY2xzKiAod2hpY2ggY2FuIGJlIGEKICAgICAgIGNsYXNzIG9yIGEgdHVwbGUgb2YgY2xhc3NlcywgYXMgc3VwcG9ydGVkIGJ5IDpmdW5jOmBpc2luc3RhbmNlYCkuCi0gICAgICBUbyBjaGVjayBmb3IgYSBzcGVjaWZpYyB0eXBlICh3aXRob3V0IGluY2x1ZGluZyBzdXBlcmNsYXNzZXMpIHVzZQotICAgICAgOmZ1bmM6YGFzc2VydElzKHR5cGUob2JqKSwgY2xzKSA8YXNzZXJ0SXM+YC4KKyAgICAgIFRvIGNoZWNrIGZvciB0aGUgZXhhY3QgdHlwZSwgdXNlIDpmdW5jOmBhc3NlcnRJcyh0eXBlKG9iaiksIGNscykgPGFzc2VydElzPmAuCiAKICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNwogCkBAIC05MTAsOCArOTE2LDggQEAKICAgIHwgOm1ldGg6YGFzc2VydFJhaXNlcyhleGMsIGZ1biwgKmFyZ3MsICoqa3dkcykgICAgICAgICAgICB8IGBgZnVuKCphcmdzLCAqKmt3ZHMpYGAgcmFpc2VzICpleGMqICB8ICAgICAgICAgICAgfAogICAgfCA8VGVzdENhc2UuYXNzZXJ0UmFpc2VzPmAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8CiAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKLSAgIHwgOm1ldGg6YGFzc2VydFJhaXNlc1JlZ2V4cChleGMsIHJlLCBmdW4sICphcmdzLCAqKmt3ZHMpICB8IGBgZnVuKCphcmdzLCAqKmt3ZHMpYGAgcmFpc2VzICpleGMqICB8IDIuNyAgICAgICAgfAotICAgfCA8VGVzdENhc2UuYXNzZXJ0UmFpc2VzUmVnZXhwPmAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYW5kIHRoZSBtZXNzYWdlIG1hdGNoZXMgKnJlKiAgICAgICAgIHwgICAgICAgICAgICB8CisgICB8IDptZXRoOmBhc3NlcnRSYWlzZXNSZWdleHAoZXhjLCByLCBmdW4sICphcmdzLCAqKmt3ZHMpICAgfCBgYGZ1bigqYXJncywgKiprd2RzKWBgIHJhaXNlcyAqZXhjKiAgfCAyLjcgICAgICAgIHwKKyAgIHwgPFRlc3RDYXNlLmFzc2VydFJhaXNlc1JlZ2V4cD5gICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFuZCB0aGUgbWVzc2FnZSBtYXRjaGVzIHJlZ2V4ICpyKiAgICB8ICAgICAgICAgICAgfAogICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCiAKICAgIC4uIG1ldGhvZDo6IGFzc2VydFJhaXNlcyhleGNlcHRpb24sIGNhbGxhYmxlLCAqYXJncywgKiprd2RzKQpAQCAtOTUyLDcgKzk1OCw3IEBACiAgICAgICBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3Qgb3IgYSBzdHJpbmcgY29udGFpbmluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbgogICAgICAgc3VpdGFibGUgZm9yIHVzZSBieSA6ZnVuYzpgcmUuc2VhcmNoYC4gIEV4YW1wbGVzOjoKIAotICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVmFsdWVFcnJvciwgJ2ludmFsaWQgbGl0ZXJhbCBmb3IuKlhZWiQnLAorICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVmFsdWVFcnJvciwgImludmFsaWQgbGl0ZXJhbCBmb3IuKlhZWickIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwgJ1hZWicpCiAKICAgICAgIG9yOjoKQEAgLTk4NywxMCArOTkzLDEwIEBACiAgICB8IDptZXRoOmBhc3NlcnRMZXNzRXF1YWwoYSwgYikgICAgICAgICAgfCBgYGEgPD0gYmBgICAgICAgICAgICAgICAgICAgICAgfCAyLjcgICAgICAgICAgfAogICAgfCA8VGVzdENhc2UuYXNzZXJ0TGVzc0VxdWFsPmAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwKICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rCi0gICB8IDptZXRoOmBhc3NlcnRSZWdleHBNYXRjaGVzKHMsIHJlKSAgICAgfCBgYHJlZ2V4LnNlYXJjaChzKWBgICAgICAgICAgICAgfCAyLjcgICAgICAgICAgfAorICAgfCA6bWV0aDpgYXNzZXJ0UmVnZXhwTWF0Y2hlcyhzLCByKSAgICAgIHwgYGByLnNlYXJjaChzKWBgICAgICAgICAgICAgICAgIHwgMi43ICAgICAgICAgIHwKICAgIHwgPFRlc3RDYXNlLmFzc2VydFJlZ2V4cE1hdGNoZXM+YCAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8CiAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKwotICAgfCA6bWV0aDpgYXNzZXJ0Tm90UmVnZXhwTWF0Y2hlcyhzLCByZSkgIHwgYGBub3QgcmVnZXguc2VhcmNoKHMpYGAgICAgICAgIHwgMi43ICAgICAgICAgIHwKKyAgIHwgOm1ldGg6YGFzc2VydE5vdFJlZ2V4cE1hdGNoZXMocywgcikgICB8IGBgbm90IHIuc2VhcmNoKHMpYGAgICAgICAgICAgICB8IDIuNyAgICAgICAgICB8CiAgICB8IDxUZXN0Q2FzZS5hc3NlcnROb3RSZWdleHBNYXRjaGVzPmAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfAogICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSsKICAgIHwgOm1ldGg6YGFzc2VydEl0ZW1zRXF1YWwoYSwgYikgICAgICAgICB8IHNvcnRlZChhKSA9PSBzb3J0ZWQoYikgYW5kICAgICB8IDIuNyAgICAgICAgICB8CkBAIC0xMDExLDcgKzEwMTcsNyBAQAogICAgICAgbGlrZSB0aGUgOmZ1bmM6YHJvdW5kYCBmdW5jdGlvbikgYW5kIG5vdCAqc2lnbmlmaWNhbnQgZGlnaXRzKi4KIAogICAgICAgSWYgKmRlbHRhKiBpcyBzdXBwbGllZCBpbnN0ZWFkIG9mICpwbGFjZXMqIHRoZW4gdGhlIGRpZmZlcmVuY2UKLSAgICAgIGJldHdlZW4gKmZpcnN0KiBhbmQgKnNlY29uZCogbXVzdCBiZSBsZXNzIChvciBtb3JlKSB0aGFuICpkZWx0YSouCisgICAgICBiZXR3ZWVuICpmaXJzdCogYW5kICpzZWNvbmQqIG11c3QgYmUgbGVzcyBvciBlcXVhbCB0byAob3IgZ3JlYXRlciB0aGFuKSAqZGVsdGEqLgogCiAgICAgICBTdXBwbHlpbmcgYm90aCAqZGVsdGEqIGFuZCAqcGxhY2VzKiByYWlzZXMgYSBgYFR5cGVFcnJvcmBgLgogCkBAIC0xMDY5LDYgKzEwNzUsOCBAQAogICAgICAgc29ydGVkKGFjdHVhbCkpYGAgYnV0IGl0IHdvcmtzIHdpdGggc2VxdWVuY2VzIG9mIHVuaGFzaGFibGUgb2JqZWN0cyBhcwogICAgICAgd2VsbC4KIAorICAgICAgSW4gUHl0aG9uIDMsIHRoaXMgbWV0aG9kIGlzIG5hbWVkIGBgYXNzZXJ0Q291bnRFcXVhbGBgLgorCiAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjcKIAogCkBAIC0xMTU4LDcgKzExNjYsNyBAQAogICAgLi4gbWV0aG9kOjogYXNzZXJ0TGlzdEVxdWFsKGxpc3QxLCBsaXN0MiwgbXNnPU5vbmUpCiAgICAgICAgICAgICAgICBhc3NlcnRUdXBsZUVxdWFsKHR1cGxlMSwgdHVwbGUyLCBtc2c9Tm9uZSkKIAotICAgICAgVGVzdHMgdGhhdCB0d28gbGlzdHMgb3IgdHVwbGVzIGFyZSBlcXVhbC4gIElmIG5vdCBhbiBlcnJvciBtZXNzYWdlIGlzCisgICAgICBUZXN0cyB0aGF0IHR3byBsaXN0cyBvciB0dXBsZXMgYXJlIGVxdWFsLiAgSWYgbm90LCBhbiBlcnJvciBtZXNzYWdlIGlzCiAgICAgICBjb25zdHJ1Y3RlZCB0aGF0IHNob3dzIG9ubHkgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHR3by4gIEFuIGVycm9yCiAgICAgICBpcyBhbHNvIHJhaXNlZCBpZiBlaXRoZXIgb2YgdGhlIHBhcmFtZXRlcnMgYXJlIG9mIHRoZSB3cm9uZyB0eXBlLgogICAgICAgVGhlc2UgbWV0aG9kcyBhcmUgdXNlZCBieSBkZWZhdWx0IHdoZW4gY29tcGFyaW5nIGxpc3RzIG9yIHR1cGxlcyB3aXRoCkBAIC0xNDI3LDggKzE0MzUsOCBAQAogICAgVGhlIDpjbGFzczpgVGVzdExvYWRlcmAgY2xhc3MgaXMgdXNlZCB0byBjcmVhdGUgdGVzdCBzdWl0ZXMgZnJvbSBjbGFzc2VzIGFuZAogICAgbW9kdWxlcy4gIE5vcm1hbGx5LCB0aGVyZSBpcyBubyBuZWVkIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzOyB0aGUKICAgIDptb2Q6YHVuaXR0ZXN0YCBtb2R1bGUgcHJvdmlkZXMgYW4gaW5zdGFuY2UgdGhhdCBjYW4gYmUgc2hhcmVkIGFzCi0gICBgYHVuaXR0ZXN0LmRlZmF1bHRUZXN0TG9hZGVyYGAuIFVzaW5nIGEgc3ViY2xhc3Mgb3IgaW5zdGFuY2UsIGhvd2V2ZXIsIGFsbG93cwotICAgY3VzdG9taXphdGlvbiBvZiBzb21lIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzLgorICAgOmRhdGE6YHVuaXR0ZXN0LmRlZmF1bHRUZXN0TG9hZGVyYC4gIFVzaW5nIGEgc3ViY2xhc3Mgb3IgaW5zdGFuY2UsIGhvd2V2ZXIsCisgICBhbGxvd3MgY3VzdG9taXphdGlvbiBvZiBzb21lIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzLgogCiAgICA6Y2xhc3M6YFRlc3RMb2FkZXJgIG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CiAKQEAgLTE1MDIsMTEgKzE1MTAsMTEgQEAKIAogICAgLi4gbWV0aG9kOjogZGlzY292ZXIoc3RhcnRfZGlyLCBwYXR0ZXJuPSd0ZXN0Ki5weScsIHRvcF9sZXZlbF9kaXI9Tm9uZSkKIAotICAgICAgRmluZCBhbmQgcmV0dXJuIGFsbCB0ZXN0IG1vZHVsZXMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0YXJ0IGRpcmVjdG9yeSwKLSAgICAgIHJlY3Vyc2luZyBpbnRvIHN1YmRpcmVjdG9yaWVzIHRvIGZpbmQgdGhlbS4gT25seSB0ZXN0IGZpbGVzIHRoYXQgbWF0Y2gKLSAgICAgICpwYXR0ZXJuKiB3aWxsIGJlIGxvYWRlZC4gKFVzaW5nIHNoZWxsIHN0eWxlIHBhdHRlcm4gbWF0Y2hpbmcuKSBPbmx5Ci0gICAgICBtb2R1bGUgbmFtZXMgdGhhdCBhcmUgaW1wb3J0YWJsZSAoaS5lLiBhcmUgdmFsaWQgUHl0aG9uIGlkZW50aWZpZXJzKSB3aWxsCi0gICAgICBiZSBsb2FkZWQuCisgICAgICBGaW5kIGFsbCB0aGUgdGVzdCBtb2R1bGVzIGJ5IHJlY3Vyc2luZyBpbnRvIHN1YmRpcmVjdG9yaWVzIGZyb20gdGhlCisgICAgICBzcGVjaWZpZWQgc3RhcnQgZGlyZWN0b3J5LCBhbmQgcmV0dXJuIGEgVGVzdFN1aXRlIG9iamVjdCBjb250YWluaW5nIHRoZW0uCisgICAgICBPbmx5IHRlc3QgZmlsZXMgdGhhdCBtYXRjaCAqcGF0dGVybiogd2lsbCBiZSBsb2FkZWQuIChVc2luZyBzaGVsbCBzdHlsZQorICAgICAgcGF0dGVybiBtYXRjaGluZy4pIE9ubHkgbW9kdWxlIG5hbWVzIHRoYXQgYXJlIGltcG9ydGFibGUgKGkuZS4gYXJlIHZhbGlkCisgICAgICBQeXRob24gaWRlbnRpZmllcnMpIHdpbGwgYmUgbG9hZGVkLgogCiAgICAgICBBbGwgdGVzdCBtb2R1bGVzIG11c3QgYmUgaW1wb3J0YWJsZSBmcm9tIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHByb2plY3QuIElmCiAgICAgICB0aGUgc3RhcnQgZGlyZWN0b3J5IGlzIG5vdCB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSB0aGVuIHRoZSB0b3AgbGV2ZWwKQEAgLTE1OTUsOCArMTYwMyw3IEBACiAKICAgICAgIEEgbGlzdCBjb250YWluaW5nIDItdHVwbGVzIG9mIDpjbGFzczpgVGVzdENhc2VgIGluc3RhbmNlcyBhbmQgc3RyaW5ncwogICAgICAgaG9sZGluZyBmb3JtYXR0ZWQgdHJhY2ViYWNrcy4gRWFjaCB0dXBsZSByZXByZXNlbnRzIGEgdGVzdCB3aGVyZSBhIGZhaWx1cmUKLSAgICAgIHdhcyBleHBsaWNpdGx5IHNpZ25hbGxlZCB1c2luZyB0aGUgOm1ldGg6YFRlc3RDYXNlLmZhaWxcKmAgb3IKLSAgICAgIDptZXRoOmBUZXN0Q2FzZS5hc3NlcnRcKmAgbWV0aG9kcy4KKyAgICAgIHdhcyBleHBsaWNpdGx5IHNpZ25hbGxlZCB1c2luZyB0aGUgOm1ldGg6YFRlc3RDYXNlLmFzc2VydFwqYCBtZXRob2RzLgogCiAgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuMgogICAgICAgICAgQ29udGFpbnMgZm9ybWF0dGVkIHRyYWNlYmFja3MgaW5zdGVhZCBvZiA6ZnVuYzpgc3lzLmV4Y19pbmZvYCByZXN1bHRzLgpAQCAtMTY4MCwxNCArMTY4NywxNCBAQAogICAgICAgQ2FsbGVkIGFmdGVyIHRoZSB0ZXN0IGNhc2UgKnRlc3QqIGhhcyBiZWVuIGV4ZWN1dGVkLCByZWdhcmRsZXNzIG9mIHRoZQogICAgICAgb3V0Y29tZS4KIAotICAgLi4gbWV0aG9kOjogc3RhcnRUZXN0UnVuKHRlc3QpCisgICAuLiBtZXRob2Q6OiBzdGFydFRlc3RSdW4oKQogCiAgICAgICBDYWxsZWQgb25jZSBiZWZvcmUgYW55IHRlc3RzIGFyZSBleGVjdXRlZC4KIAogICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMi43CiAKIAotICAgLi4gbWV0aG9kOjogc3RvcFRlc3RSdW4odGVzdCkKKyAgIC4uIG1ldGhvZDo6IHN0b3BUZXN0UnVuKCkKIAogICAgICAgQ2FsbGVkIG9uY2UgYWZ0ZXIgYWxsIHRlc3RzIGFyZSBleGVjdXRlZC4KIApAQCAtMTY5Niw3ICsxNzAzLDcgQEAKIAogICAgLi4gbWV0aG9kOjogYWRkRXJyb3IodGVzdCwgZXJyKQogCi0gICAgICBDYWxsZWQgd2hlbiB0aGUgdGVzdCBjYXNlICp0ZXN0KiByYWlzZXMgYW4gdW5leHBlY3RlZCBleGNlcHRpb24gKmVyciogaXMgYQorICAgICAgQ2FsbGVkIHdoZW4gdGhlIHRlc3QgY2FzZSAqdGVzdCogcmFpc2VzIGFuIHVuZXhwZWN0ZWQgZXhjZXB0aW9uLiAqZXJyKiBpcyBhCiAgICAgICB0dXBsZSBvZiB0aGUgZm9ybSByZXR1cm5lZCBieSA6ZnVuYzpgc3lzLmV4Y19pbmZvYDogYGAodHlwZSwgdmFsdWUsCiAgICAgICB0cmFjZWJhY2spYGAuCiAKQEAgLTE3ODUsMTEgKzE3OTIsMTIgQEAKICAgICAgICAgICAgIHN0cmVhbSwgZGVzY3JpcHRpb25zLCB2ZXJib3NpdHkKIAogCi0uLiBmdW5jdGlvbjo6IG1haW4oW21vZHVsZVssIGRlZmF1bHRUZXN0WywgYXJndlssIHRlc3RSdW5uZXJbLCB0ZXN0TG9hZGVyWywgZXhpdFssIHZlcmJvc2l0eVssIGZhaWxmYXN0WywgY2F0Y2hicmVha1ssYnVmZmVyXV1dXV1dXV1dXSkKKy4uIGZ1bmN0aW9uOjogbWFpbihbbW9kdWxlWywgZGVmYXVsdFRlc3RbLCBhcmd2WywgdGVzdFJ1bm5lclssIHRlc3RMb2FkZXJbLCBleGl0WywgdmVyYm9zaXR5WywgZmFpbGZhc3RbLCBjYXRjaGJyZWFrWywgYnVmZmVyXV1dXV1dXV1dXSkKIAotICAgQSBjb21tYW5kLWxpbmUgcHJvZ3JhbSB0aGF0IHJ1bnMgYSBzZXQgb2YgdGVzdHM7IHRoaXMgaXMgcHJpbWFyaWx5IGZvciBtYWtpbmcKLSAgIHRlc3QgbW9kdWxlcyBjb252ZW5pZW50bHkgZXhlY3V0YWJsZS4gIFRoZSBzaW1wbGVzdCB1c2UgZm9yIHRoaXMgZnVuY3Rpb24gaXMgdG8KLSAgIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBsaW5lIGF0IHRoZSBlbmQgb2YgYSB0ZXN0IHNjcmlwdDo6CisgICBBIGNvbW1hbmQtbGluZSBwcm9ncmFtIHRoYXQgbG9hZHMgYSBzZXQgb2YgdGVzdHMgZnJvbSAqbW9kdWxlKiBhbmQgcnVucyB0aGVtOworICAgdGhpcyBpcyBwcmltYXJpbHkgZm9yIG1ha2luZyB0ZXN0IG1vZHVsZXMgY29udmVuaWVudGx5IGV4ZWN1dGFibGUuCisgICBUaGUgc2ltcGxlc3QgdXNlIGZvciB0aGlzIGZ1bmN0aW9uIGlzIHRvIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBsaW5lIGF0IHRoZQorICAgZW5kIG9mIGEgdGVzdCBzY3JpcHQ6OgogCiAgICAgICBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgICAgICAgIHVuaXR0ZXN0Lm1haW4oKQpAQCAtMTgwMCwxMCArMTgwOCwyMSBAQAogICAgICAgaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICAgICAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yKQogCisgICBUaGUgKmRlZmF1bHRUZXN0KiBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgdGVzdCB0byBydW4gaWYgbm8gdGVzdCBuYW1lcworICAgYXJlIHNwZWNpZmllZCB2aWEgKmFyZ3YqLiAgSWYgbm90IHNwZWNpZmllZCBvciBgYE5vbmVgYCBhbmQgbm8gdGVzdCBuYW1lcyBhcmUKKyAgIHByb3ZpZGVkIHZpYSAqYXJndiosIGFsbCB0ZXN0cyBmb3VuZCBpbiAqbW9kdWxlKiBhcmUgcnVuLgorCisgICBUaGUgKmFyZ3YqIGFyZ3VtZW50IGNhbiBiZSBhIGxpc3Qgb2Ygb3B0aW9ucyBwYXNzZWQgdG8gdGhlIHByb2dyYW0sIHdpdGggdGhlCisgICBmaXJzdCBlbGVtZW50IGJlaW5nIHRoZSBwcm9ncmFtIG5hbWUuICBJZiBub3Qgc3BlY2lmaWVkIG9yIGBgTm9uZWBgLAorICAgdGhlIHZhbHVlcyBvZiA6ZGF0YTpgc3lzLmFyZ3ZgIGFyZSB1c2VkLgorCiAgICBUaGUgKnRlc3RSdW5uZXIqIGFyZ3VtZW50IGNhbiBlaXRoZXIgYmUgYSB0ZXN0IHJ1bm5lciBjbGFzcyBvciBhbiBhbHJlYWR5CiAgICBjcmVhdGVkIGluc3RhbmNlIG9mIGl0LiBCeSBkZWZhdWx0IGBgbWFpbmBgIGNhbGxzIDpmdW5jOmBzeXMuZXhpdGAgd2l0aAogICAgYW4gZXhpdCBjb2RlIGluZGljYXRpbmcgc3VjY2VzcyBvciBmYWlsdXJlIG9mIHRoZSB0ZXN0cyBydW4uCiAKKyAgIFRoZSAqdGVzdExvYWRlciogYXJndW1lbnQgaGFzIHRvIGJlIGEgOmNsYXNzOmBUZXN0TG9hZGVyYCBpbnN0YW5jZSwKKyAgIGFuZCBkZWZhdWx0cyB0byA6ZGF0YTpgZGVmYXVsdFRlc3RMb2FkZXJgLgorCiAgICBgYG1haW5gYCBzdXBwb3J0cyBiZWluZyB1c2VkIGZyb20gdGhlIGludGVyYWN0aXZlIGludGVycHJldGVyIGJ5IHBhc3NpbmcgaW4gdGhlCiAgICBhcmd1bWVudCBgYGV4aXQ9RmFsc2VgYC4gVGhpcyBkaXNwbGF5cyB0aGUgcmVzdWx0IG9uIHN0YW5kYXJkIG91dHB1dCB3aXRob3V0CiAgICBjYWxsaW5nIDpmdW5jOmBzeXMuZXhpdGA6OgpAQCAtMTgxMSwxNCArMTgzMCwxNCBAQAogICAgICAgPj4+IGZyb20gdW5pdHRlc3QgaW1wb3J0IG1haW4KICAgICAgID4+PiBtYWluKG1vZHVsZT0ndGVzdF9tb2R1bGUnLCBleGl0PUZhbHNlKQogCi0gICBUaGUgYGBmYWlsZmFzdGBgLCBgYGNhdGNoYnJlYWtgYCBhbmQgYGBidWZmZXJgYCBwYXJhbWV0ZXJzIGhhdmUgdGhlIHNhbWUKKyAgIFRoZSAqZmFpbGZhc3QqLCAqY2F0Y2hicmVhayogYW5kICpidWZmZXIqIHBhcmFtZXRlcnMgaGF2ZSB0aGUgc2FtZQogICAgZWZmZWN0IGFzIHRoZSBzYW1lLW5hbWUgYGNvbW1hbmQtbGluZSBvcHRpb25zYF8uCiAKICAgIENhbGxpbmcgYGBtYWluYGAgYWN0dWFsbHkgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgYGBUZXN0UHJvZ3JhbWBgIGNsYXNzLgogICAgVGhpcyBzdG9yZXMgdGhlIHJlc3VsdCBvZiB0aGUgdGVzdHMgcnVuIGFzIHRoZSBgYHJlc3VsdGBgIGF0dHJpYnV0ZS4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjcKLSAgICAgIFRoZSBgYGV4aXRgYCwgYGB2ZXJib3NpdHlgYCwgYGBmYWlsZmFzdGBgLCBgYGNhdGNoYnJlYWtgYCBhbmQgYGBidWZmZXJgYAorICAgICAgVGhlICpleGl0KiwgKnZlcmJvc2l0eSosICpmYWlsZmFzdCosICpjYXRjaGJyZWFrKiBhbmQgKmJ1ZmZlcioKICAgICAgIHBhcmFtZXRlcnMgd2VyZSBhZGRlZC4KIAogCkBAIC0xODYxLDEwICsxODgwLDEwIEBACiAKIC4uIG5vdGU6OgogCi0gICBUaGUgZGVmYXVsdCBwYXR0ZXJuIGlzICd0ZXN0Ki5weScuIFRoaXMgbWF0Y2hlcyBhbGwgUHl0aG9uIGZpbGVzCi0gICB0aGF0IHN0YXJ0IHdpdGggJ3Rlc3QnIGJ1dCAqd29uJ3QqIG1hdGNoIGFueSB0ZXN0IGRpcmVjdG9yaWVzLgorICAgVGhlIGRlZmF1bHQgcGF0dGVybiBpcyBgYCd0ZXN0Ki5weSdgYC4gVGhpcyBtYXRjaGVzIGFsbCBQeXRob24gZmlsZXMKKyAgIHRoYXQgc3RhcnQgd2l0aCBgYCd0ZXN0J2BgIGJ1dCAqd29uJ3QqIG1hdGNoIGFueSB0ZXN0IGRpcmVjdG9yaWVzLgogCi0gICBBIHBhdHRlcm4gbGlrZSAndGVzdConIHdpbGwgbWF0Y2ggdGVzdCBwYWNrYWdlcyBhcyB3ZWxsIGFzCisgICBBIHBhdHRlcm4gbGlrZSBgYCd0ZXN0KidgYCB3aWxsIG1hdGNoIHRlc3QgcGFja2FnZXMgYXMgd2VsbCBhcwogICAgbW9kdWxlcy4KIAogSWYgdGhlIHBhY2thZ2UgOmZpbGU6YF9faW5pdF9fLnB5YCBkZWZpbmVzIGBgbG9hZF90ZXN0c2BgIHRoZW4gaXQgd2lsbCBiZQpAQCAtMTk0OSw3ICsxOTY4LDcgQEAKIElmIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQgZHVyaW5nIGEgYGBzZXRVcENsYXNzYGAgdGhlbiB0aGUgdGVzdHMgaW4gdGhlIGNsYXNzCiBhcmUgbm90IHJ1biBhbmQgdGhlIGBgdGVhckRvd25DbGFzc2BgIGlzIG5vdCBydW4uIFNraXBwZWQgY2xhc3NlcyB3aWxsIG5vdAogaGF2ZSBgYHNldFVwQ2xhc3NgYCBvciBgYHRlYXJEb3duQ2xhc3NgYCBydW4uIElmIHRoZSBleGNlcHRpb24gaXMgYQotYGBTa2lwVGVzdGBgIGV4Y2VwdGlvbiB0aGVuIHRoZSBjbGFzcyB3aWxsIGJlIHJlcG9ydGVkIGFzIGhhdmluZyBiZWVuIHNraXBwZWQKKzpleGM6YFNraXBUZXN0YCBleGNlcHRpb24gdGhlbiB0aGUgY2xhc3Mgd2lsbCBiZSByZXBvcnRlZCBhcyBoYXZpbmcgYmVlbiBza2lwcGVkCiBpbnN0ZWFkIG9mIGFzIGFuIGVycm9yLgogCiAKQEAgLTE5NjYsNyArMTk4NSw3IEBACiAKIElmIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQgaW4gYSBgYHNldFVwTW9kdWxlYGAgdGhlbiBub25lIG9mIHRoZSB0ZXN0cyBpbiB0aGUKIG1vZHVsZSB3aWxsIGJlIHJ1biBhbmQgdGhlIGBgdGVhckRvd25Nb2R1bGVgYCB3aWxsIG5vdCBiZSBydW4uIElmIHRoZSBleGNlcHRpb24gaXMgYQotYGBTa2lwVGVzdGBgIGV4Y2VwdGlvbiB0aGVuIHRoZSBtb2R1bGUgd2lsbCBiZSByZXBvcnRlZCBhcyBoYXZpbmcgYmVlbiBza2lwcGVkCis6ZXhjOmBTa2lwVGVzdGAgZXhjZXB0aW9uIHRoZW4gdGhlIG1vZHVsZSB3aWxsIGJlIHJlcG9ydGVkIGFzIGhhdmluZyBiZWVuIHNraXBwZWQKIGluc3RlYWQgb2YgYXMgYW4gZXJyb3IuCiAKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdXJsbGliLnJzdCBiL0RvYy9saWJyYXJ5L3VybGxpYi5yc3QKaW5kZXggODJmMWJkYS4uNjJmMTk4ZiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdXJsbGliLnJzdAorKysgYi9Eb2MvbGlicmFyeS91cmxsaWIucnN0CkBAIC02LDExICs2LDEyIEBACiAKIC4uIG5vdGU6OgogICAgIFRoZSA6bW9kOmB1cmxsaWJgIG1vZHVsZSBoYXMgYmVlbiBzcGxpdCBpbnRvIHBhcnRzIGFuZCByZW5hbWVkIGluCi0gICAgUHl0aG9uIDMuMCB0byA6bW9kOmB1cmxsaWIucmVxdWVzdGAsIDptb2Q6YHVybGxpYi5wYXJzZWAsCisgICAgUHl0aG9uIDMgdG8gOm1vZDpgdXJsbGliLnJlcXVlc3RgLCA6bW9kOmB1cmxsaWIucGFyc2VgLAogICAgIGFuZCA6bW9kOmB1cmxsaWIuZXJyb3JgLiBUaGUgOnRlcm06YDJ0bzNgIHRvb2wgd2lsbCBhdXRvbWF0aWNhbGx5IGFkYXB0Ci0gICAgaW1wb3J0cyB3aGVuIGNvbnZlcnRpbmcgeW91ciBzb3VyY2VzIHRvIDMuMC4KLSAgICBBbHNvIG5vdGUgdGhhdCB0aGUgOmZ1bmM6YHVybGxpYi51cmxvcGVuYCBmdW5jdGlvbiBoYXMgYmVlbiByZW1vdmVkIGluCi0gICAgUHl0aG9uIDMuMCBpbiBmYXZvciBvZiA6ZnVuYzpgdXJsbGliMi51cmxvcGVuYC4KKyAgICBpbXBvcnRzIHdoZW4gY29udmVydGluZyB5b3VyIHNvdXJjZXMgdG8gUHl0aG9uIDMuCisgICAgQWxzbyBub3RlIHRoYXQgdGhlIDpmdW5jOmB1cmxsaWIucmVxdWVzdC51cmxvcGVuYCBmdW5jdGlvbiBpbiBQeXRob24gMyBpcworICAgIGVxdWl2YWxlbnQgdG8gOmZ1bmM6YHVybGxpYjIudXJsb3BlbmAgYW5kIHRoYXQgOmZ1bmM6YHVybGxpYi51cmxvcGVuYCBoYXMKKyAgICBiZWVuIHJlbW92ZWQuCiAKIC4uIGluZGV4OjoKICAgIHNpbmdsZTogV1dXCkBAIC0zMiwxNiArMzMsMTcgQEAKIAogLi4gZnVuY3Rpb246OiB1cmxvcGVuKHVybFssIGRhdGFbLCBwcm94aWVzXV0pCiAKLSAgIE9wZW4gYSBuZXR3b3JrIG9iamVjdCBkZW5vdGVkIGJ5IGEgVVJMIGZvciByZWFkaW5nLiAgSWYgdGhlIFVSTCBkb2VzIG5vdCBoYXZlIGEKLSAgIHNjaGVtZSBpZGVudGlmaWVyLCBvciBpZiBpdCBoYXMgOmZpbGU6YGZpbGU6YCBhcyBpdHMgc2NoZW1lIGlkZW50aWZpZXIsIHRoaXMKLSAgIG9wZW5zIGEgbG9jYWwgZmlsZSAod2l0aG91dCB1bml2ZXJzYWwgbmV3bGluZXMpOyBvdGhlcndpc2UgaXQgb3BlbnMgYSBzb2NrZXQgdG8KLSAgIGEgc2VydmVyIHNvbWV3aGVyZSBvbiB0aGUgbmV0d29yay4gIElmIHRoZSBjb25uZWN0aW9uIGNhbm5vdCBiZSBtYWRlIHRoZQotICAgOmV4YzpgSU9FcnJvcmAgZXhjZXB0aW9uIGlzIHJhaXNlZC4gIElmIGFsbCB3ZW50IHdlbGwsIGEgZmlsZS1saWtlIG9iamVjdCBpcwotICAgcmV0dXJuZWQuICBUaGlzIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgbWV0aG9kczogOm1ldGg6YHJlYWRgLCA6bWV0aDpgcmVhZGxpbmVgLAotICAgOm1ldGg6YHJlYWRsaW5lc2AsIDptZXRoOmBmaWxlbm9gLCA6bWV0aDpgY2xvc2VgLCA6bWV0aDpgaW5mb2AsIDptZXRoOmBnZXRjb2RlYCBhbmQKLSAgIDptZXRoOmBnZXR1cmxgLiAgSXQgYWxzbyBoYXMgcHJvcGVyIHN1cHBvcnQgZm9yIHRoZSA6dGVybTpgaXRlcmF0b3JgIHByb3RvY29sLiBPbmUKLSAgIGNhdmVhdDogdGhlIDptZXRoOmByZWFkYCBtZXRob2QsIGlmIHRoZSBzaXplIGFyZ3VtZW50IGlzIG9taXR0ZWQgb3IgbmVnYXRpdmUsCi0gICBtYXkgbm90IHJlYWQgdW50aWwgdGhlIGVuZCBvZiB0aGUgZGF0YSBzdHJlYW07IHRoZXJlIGlzIG5vIGdvb2Qgd2F5IHRvIGRldGVybWluZQorICAgT3BlbiBhIG5ldHdvcmsgb2JqZWN0IGRlbm90ZWQgYnkgYSBVUkwgZm9yIHJlYWRpbmcuICBJZiB0aGUgVVJMIGRvZXMgbm90CisgICBoYXZlIGEgc2NoZW1lIGlkZW50aWZpZXIsIG9yIGlmIGl0IGhhcyA6ZmlsZTpgZmlsZTpgIGFzIGl0cyBzY2hlbWUKKyAgIGlkZW50aWZpZXIsIHRoaXMgb3BlbnMgYSBsb2NhbCBmaWxlICh3aXRob3V0IDp0ZXJtOmB1bml2ZXJzYWwgbmV3bGluZXNgKTsKKyAgIG90aGVyd2lzZSBpdCBvcGVucyBhIHNvY2tldCB0byBhIHNlcnZlciBzb21ld2hlcmUgb24gdGhlIG5ldHdvcmsuICBJZiB0aGUKKyAgIGNvbm5lY3Rpb24gY2Fubm90IGJlIG1hZGUgdGhlIDpleGM6YElPRXJyb3JgIGV4Y2VwdGlvbiBpcyByYWlzZWQuICBJZiBhbGwKKyAgIHdlbnQgd2VsbCwgYSBmaWxlLWxpa2Ugb2JqZWN0IGlzIHJldHVybmVkLiAgVGhpcyBzdXBwb3J0cyB0aGUgZm9sbG93aW5nCisgICBtZXRob2RzOiA6bWV0aDpgcmVhZGAsIDptZXRoOmByZWFkbGluZWAsIDptZXRoOmByZWFkbGluZXNgLCA6bWV0aDpgZmlsZW5vYCwKKyAgIDptZXRoOmBjbG9zZWAsIDptZXRoOmBpbmZvYCwgOm1ldGg6YGdldGNvZGVgIGFuZCA6bWV0aDpgZ2V0dXJsYC4gIEl0IGFsc28KKyAgIGhhcyBwcm9wZXIgc3VwcG9ydCBmb3IgdGhlIDp0ZXJtOmBpdGVyYXRvcmAgcHJvdG9jb2wuIE9uZSBjYXZlYXQ6IHRoZQorICAgOm1ldGg6YHJlYWRgIG1ldGhvZCwgaWYgdGhlIHNpemUgYXJndW1lbnQgaXMgb21pdHRlZCBvciBuZWdhdGl2ZSwgbWF5IG5vdAorICAgcmVhZCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBkYXRhIHN0cmVhbTsgdGhlcmUgaXMgbm8gZ29vZCB3YXkgdG8gZGV0ZXJtaW5lCiAgICB0aGF0IHRoZSBlbnRpcmUgc3RyZWFtIGZyb20gYSBzb2NrZXQgaGFzIGJlZW4gcmVhZCBpbiB0aGUgZ2VuZXJhbCBjYXNlLgogCiAgICBFeGNlcHQgZm9yIHRoZSA6bWV0aDpgaW5mb2AsIDptZXRoOmBnZXRjb2RlYCBhbmQgOm1ldGg6YGdldHVybGAgbWV0aG9kcywKQEAgLTEzMSw3ICsxMzMsNyBAQAogICAgICAgOmVudnZhcjpgbm9fcHJveHlgIGVudmlyb25tZW50IHZhcmlhYmxlLgogCiAgICAuLiBkZXByZWNhdGVkOjogMi42Ci0gICAgICBUaGUgOmZ1bmM6YHVybG9wZW5gIGZ1bmN0aW9uIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuMCBpbiBmYXZvcgorICAgICAgVGhlIDpmdW5jOmB1cmxvcGVuYCBmdW5jdGlvbiBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzIGluIGZhdm9yCiAgICAgICBvZiA6ZnVuYzpgdXJsbGliMi51cmxvcGVuYC4KIAogCkBAIC0yNzQsMTAgKzI3NiwxNyBAQAogLi4gZnVuY3Rpb246OiBnZXRwcm94aWVzKCkKIAogICAgVGhpcyBoZWxwZXIgZnVuY3Rpb24gcmV0dXJucyBhIGRpY3Rpb25hcnkgb2Ygc2NoZW1lIHRvIHByb3h5IHNlcnZlciBVUkwKLSAgIG1hcHBpbmdzLiBJdCBzY2FucyB0aGUgZW52aXJvbm1lbnQgZm9yIHZhcmlhYmxlcyBuYW1lZCBgYDxzY2hlbWU+X3Byb3h5YGAKLSAgIGZvciBhbGwgb3BlcmF0aW5nIHN5c3RlbXMgZmlyc3QsIGFuZCB3aGVuIGl0IGNhbm5vdCBmaW5kIGl0LCBsb29rcyBmb3IgcHJveHkKLSAgIGluZm9ybWF0aW9uIGZyb20gTWFjIE9TWCBTeXN0ZW0gQ29uZmlndXJhdGlvbiBmb3IgTWFjIE9TIFggYW5kIFdpbmRvd3MKLSAgIFN5c3RlbXMgUmVnaXN0cnkgZm9yIFdpbmRvd3MuCisgICBtYXBwaW5ncy4gSXQgc2NhbnMgdGhlIGVudmlyb25tZW50IGZvciB2YXJpYWJsZXMgbmFtZWQgYGA8c2NoZW1lPl9wcm94eWBgLAorICAgaW4gY2FzZSBpbnNlbnNpdGl2ZSB3YXksIGZvciBhbGwgb3BlcmF0aW5nIHN5c3RlbXMgZmlyc3QsIGFuZCB3aGVuIGl0IGNhbm5vdAorICAgZmluZCBpdCwgbG9va3MgZm9yIHByb3h5IGluZm9ybWF0aW9uIGZyb20gTWFjIE9TWCBTeXN0ZW0gQ29uZmlndXJhdGlvbiBmb3IKKyAgIE1hYyBPUyBYIGFuZCBXaW5kb3dzIFN5c3RlbXMgUmVnaXN0cnkgZm9yIFdpbmRvd3MuCisKKy4uIG5vdGU6OgorICAgIHVybGxpYiBhbHNvIGV4cG9zZXMgY2VydGFpbiB1dGlsaXR5IGZ1bmN0aW9ucyBsaWtlIHNwbGl0dHlwZSwgc3BsaXRob3N0IGFuZAorICAgIG90aGVycyBwYXJzaW5nIHVybCBpbnRvIHZhcmlvdXMgY29tcG9uZW50cy4gQnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZQorICAgIDptb2Q6YHVybHBhcnNlYCBmb3IgcGFyc2luZyB1cmxzIHRoYW4gdXNpbmcgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5LgorICAgIFB5dGhvbiAzIGRvZXMgbm90IGV4cG9zZSB0aGVzZSBoZWxwZXIgZnVuY3Rpb25zIGZyb20gOm1vZDpgdXJsbGliLnBhcnNlYAorICAgIG1vZHVsZS4KIAogCiBVUkwgT3BlbmVyIG9iamVjdHMKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3VybGxpYjIucnN0IGIvRG9jL2xpYnJhcnkvdXJsbGliMi5yc3QKaW5kZXggYjY2ZWJkNy4uMDQxMWUxOCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdXJsbGliMi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdXJsbGliMi5yc3QKQEAgLTksOSArOSw5IEBACiAKIC4uIG5vdGU6OgogICAgVGhlIDptb2Q6YHVybGxpYjJgIG1vZHVsZSBoYXMgYmVlbiBzcGxpdCBhY3Jvc3Mgc2V2ZXJhbCBtb2R1bGVzIGluCi0gICBQeXRob24gMy4wIG5hbWVkIDptb2Q6YHVybGxpYi5yZXF1ZXN0YCBhbmQgOm1vZDpgdXJsbGliLmVycm9yYC4KKyAgIFB5dGhvbiAzIG5hbWVkIDptb2Q6YHVybGxpYi5yZXF1ZXN0YCBhbmQgOm1vZDpgdXJsbGliLmVycm9yYC4KICAgIFRoZSA6dGVybTpgMnRvM2AgdG9vbCB3aWxsIGF1dG9tYXRpY2FsbHkgYWRhcHQgaW1wb3J0cyB3aGVuIGNvbnZlcnRpbmcKLSAgIHlvdXIgc291cmNlcyB0byAzLjAuCisgICB5b3VyIHNvdXJjZXMgdG8gUHl0aG9uIDMuCiAKIAogVGhlIDptb2Q6YHVybGxpYjJgIG1vZHVsZSBkZWZpbmVzIGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyB3aGljaCBoZWxwIGluIG9wZW5pbmcKQEAgLTQzLDcgKzQzLDcgQEAKICAgIHRpbWVvdXQgc2V0dGluZyB3aWxsIGJlIHVzZWQpLiAgVGhpcyBhY3R1YWxseSBvbmx5IHdvcmtzIGZvciBIVFRQLCBIVFRQUyBhbmQKICAgIEZUUCBjb25uZWN0aW9ucy4KIAotICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgZmlsZS1saWtlIG9iamVjdCB3aXRoIHR3byBhZGRpdGlvbmFsIG1ldGhvZHM6CisgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBmaWxlLWxpa2Ugb2JqZWN0IHdpdGggdGhyZWUgYWRkaXRpb25hbCBtZXRob2RzOgogCiAgICAqIDptZXRoOmBnZXR1cmxgIC0tLSByZXR1cm4gdGhlIFVSTCBvZiB0aGUgcmVzb3VyY2UgcmV0cmlldmVkLCBjb21tb25seSB1c2VkIHRvCiAgICAgIGRldGVybWluZSBpZiBhIHJlZGlyZWN0IHdhcyBmb2xsb3dlZApAQCAtNTIsMTQgKzUyLDE4IEBACiAgICAgIGluIHRoZSBmb3JtIG9mIGFuIDpjbGFzczpgbWltZXRvb2xzLk1lc3NhZ2VgIGluc3RhbmNlCiAgICAgIChzZWUgYFF1aWNrIFJlZmVyZW5jZSB0byBIVFRQIEhlYWRlcnMgPGh0dHA6Ly93d3cuY3MudHV0LmZpL35qa29ycGVsYS9odHRwLmh0bWw+YF8pCiAKKyAgICogOm1ldGg6YGdldGNvZGVgIC0tLSByZXR1cm4gdGhlIEhUVFAgc3RhdHVzIGNvZGUgb2YgdGhlIHJlc3BvbnNlLgorCiAgICBSYWlzZXMgOmV4YzpgVVJMRXJyb3JgIG9uIGVycm9ycy4KIAogICAgTm90ZSB0aGF0IGBgTm9uZWBgIG1heSBiZSByZXR1cm5lZCBpZiBubyBoYW5kbGVyIGhhbmRsZXMgdGhlIHJlcXVlc3QgKHRob3VnaCB0aGUKICAgIGRlZmF1bHQgaW5zdGFsbGVkIGdsb2JhbCA6Y2xhc3M6YE9wZW5lckRpcmVjdG9yYCB1c2VzIDpjbGFzczpgVW5rbm93bkhhbmRsZXJgIHRvCiAgICBlbnN1cmUgdGhpcyBuZXZlciBoYXBwZW5zKS4KIAotICAgSW4gYWRkaXRpb24sIGRlZmF1bHQgaW5zdGFsbGVkIDpjbGFzczpgUHJveHlIYW5kbGVyYCBtYWtlcyBzdXJlIHRoZSByZXF1ZXN0cwotICAgYXJlIGhhbmRsZWQgdGhyb3VnaCB0aGUgcHJveHkgd2hlbiB0aGV5IGFyZSBzZXQuCisgICBJbiBhZGRpdGlvbiwgaWYgcHJveHkgc2V0dGluZ3MgYXJlIGRldGVjdGVkIChmb3IgZXhhbXBsZSwgd2hlbiBhIGBgKl9wcm94eWBgCisgICBlbnZpcm9ubWVudCB2YXJpYWJsZSBsaWtlIDplbnZ2YXI6YGh0dHBfcHJveHlgIGlzIHNldCksCisgICA6Y2xhc3M6YFByb3h5SGFuZGxlcmAgaXMgZGVmYXVsdCBpbnN0YWxsZWQgYW5kIG1ha2VzIHN1cmUgdGhlIHJlcXVlc3RzIGFyZQorICAgaGFuZGxlZCB0aHJvdWdoIHRoZSBwcm94eS4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAyLjYKICAgICAgICp0aW1lb3V0KiB3YXMgYWRkZWQuCkBAIC04MSw3ICs4NSw4IEBACiAgICBzdWJjbGFzc2VzIG9mIDpjbGFzczpgQmFzZUhhbmRsZXJgIChpbiB3aGljaCBjYXNlIGl0IG11c3QgYmUgcG9zc2libGUgdG8gY2FsbAogICAgdGhlIGNvbnN0cnVjdG9yIHdpdGhvdXQgYW55IHBhcmFtZXRlcnMpLiAgSW5zdGFuY2VzIG9mIHRoZSBmb2xsb3dpbmcgY2xhc3NlcwogICAgd2lsbCBiZSBpbiBmcm9udCBvZiB0aGUgKmhhbmRsZXIqXHMsIHVubGVzcyB0aGUgKmhhbmRsZXIqXHMgY29udGFpbiB0aGVtLAotICAgaW5zdGFuY2VzIG9mIHRoZW0gb3Igc3ViY2xhc3NlcyBvZiB0aGVtOiA6Y2xhc3M6YFByb3h5SGFuZGxlcmAsCisgICBpbnN0YW5jZXMgb2YgdGhlbSBvciBzdWJjbGFzc2VzIG9mIHRoZW06IDpjbGFzczpgUHJveHlIYW5kbGVyYCAoaWYgcHJveHkKKyAgIHNldHRpbmdzIGFyZSBkZXRlY3RlZCksCiAgICA6Y2xhc3M6YFVua25vd25IYW5kbGVyYCwgOmNsYXNzOmBIVFRQSGFuZGxlcmAsIDpjbGFzczpgSFRUUERlZmF1bHRFcnJvckhhbmRsZXJgLAogICAgOmNsYXNzOmBIVFRQUmVkaXJlY3RIYW5kbGVyYCwgOmNsYXNzOmBGVFBIYW5kbGVyYCwgOmNsYXNzOmBGaWxlSGFuZGxlcmAsCiAgICA6Y2xhc3M6YEhUVFBFcnJvclByb2Nlc3NvcmAuCkBAIC0xMjEsNyArMTI2LDEwIEBACiAgICAgICBUaGlzIG51bWVyaWMgdmFsdWUgY29ycmVzcG9uZHMgdG8gYSB2YWx1ZSBmb3VuZCBpbiB0aGUgZGljdGlvbmFyeSBvZgogICAgICAgY29kZXMgYXMgZm91bmQgaW4gOmF0dHI6YEJhc2VIVFRQU2VydmVyLkJhc2VIVFRQUmVxdWVzdEhhbmRsZXIucmVzcG9uc2VzYC4KIAorICAgLi4gYXR0cmlidXRlOjogcmVhc29uCiAKKyAgICAgIFRoZSByZWFzb24gZm9yIHRoaXMgZXJyb3IuICBJdCBjYW4gYmUgYSBtZXNzYWdlIHN0cmluZyBvciBhbm90aGVyIGV4Y2VwdGlvbgorICAgICAgaW5zdGFuY2UuCiAKIFRoZSBmb2xsb3dpbmcgY2xhc3NlcyBhcmUgcHJvdmlkZWQ6CiAKQEAgLTE1OCw3ICsxNjYsNyBAQAogICAgc2hvdWxkIGJlIHRoZSByZXF1ZXN0LWhvc3Qgb2YgdGhlIHJlcXVlc3QgZm9yIHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhlIGltYWdlLgogCiAgICAqdW52ZXJpZmlhYmxlKiBzaG91bGQgaW5kaWNhdGUgd2hldGhlciB0aGUgcmVxdWVzdCBpcyB1bnZlcmlmaWFibGUsIGFzIGRlZmluZWQKLSAgIGJ5IFJGQyAyOTY1LiAgSXQgZGVmYXVsdHMgdG8gRmFsc2UuICBBbiB1bnZlcmlmaWFibGUgcmVxdWVzdCBpcyBvbmUgd2hvc2UgVVJMCisgICBieSBSRkMgMjk2NS4gIEl0IGRlZmF1bHRzIHRvIGBgRmFsc2VgYC4gIEFuIHVudmVyaWZpYWJsZSByZXF1ZXN0IGlzIG9uZSB3aG9zZSBVUkwKICAgIHRoZSB1c2VyIGRpZCBub3QgaGF2ZSB0aGUgb3B0aW9uIHRvIGFwcHJvdmUuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHJlcXVlc3QgaXMgZm9yCiAgICBhbiBpbWFnZSBpbiBhbiBIVE1MIGRvY3VtZW50LCBhbmQgdGhlIHVzZXIgaGFkIG5vIG9wdGlvbiB0byBhcHByb3ZlIHRoZQogICAgYXV0b21hdGljIGZldGNoaW5nIG9mIHRoZSBpbWFnZSwgdGhpcyBzaG91bGQgYmUgdHJ1ZS4KQEAgLTE5Nyw5ICsyMDUsOSBAQAogICAgQ2F1c2UgcmVxdWVzdHMgdG8gZ28gdGhyb3VnaCBhIHByb3h5LiBJZiAqcHJveGllcyogaXMgZ2l2ZW4sIGl0IG11c3QgYmUgYQogICAgZGljdGlvbmFyeSBtYXBwaW5nIHByb3RvY29sIG5hbWVzIHRvIFVSTHMgb2YgcHJveGllcy4gVGhlIGRlZmF1bHQgaXMgdG8gcmVhZAogICAgdGhlIGxpc3Qgb2YgcHJveGllcyBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLSAgIDplbnZ2YXI6YDxwcm90b2NvbD5fcHJveHlgLiAgSWYgbm8gcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzZXQsIGluIGEKLSAgIFdpbmRvd3MgZW52aXJvbm1lbnQsIHByb3h5IHNldHRpbmdzIGFyZSBvYnRhaW5lZCBmcm9tIHRoZSByZWdpc3RyeSdzCi0gICBJbnRlcm5ldCBTZXR0aW5ncyBzZWN0aW9uIGFuZCBpbiBhIE1hYyBPUyBYICBlbnZpcm9ubWVudCwgcHJveHkgaW5mb3JtYXRpb24KKyAgIDplbnZ2YXI6YDxwcm90b2NvbD5fcHJveHlgLiAgSWYgbm8gcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzZXQsIHRoZW4KKyAgIGluIGEgV2luZG93cyBlbnZpcm9ubWVudCBwcm94eSBzZXR0aW5ncyBhcmUgb2J0YWluZWQgZnJvbSB0aGUgcmVnaXN0cnkncworICAgSW50ZXJuZXQgU2V0dGluZ3Mgc2VjdGlvbiwgYW5kIGluIGEgTWFjIE9TIFggZW52aXJvbm1lbnQgcHJveHkgaW5mb3JtYXRpb24KICAgIGlzIHJldHJpZXZlZCBmcm9tIHRoZSBPUyBYIFN5c3RlbSBDb25maWd1cmF0aW9uIEZyYW1ld29yay4KIAogICAgVG8gZGlzYWJsZSBhdXRvZGV0ZWN0ZWQgcHJveHkgcGFzcyBhbiBlbXB0eSBkaWN0aW9uYXJ5LgpAQCAtMzgwLDYgKzM4OCwxNyBAQAogICAgUmV0dXJuIHRoZSBzZWxlY3RvciAtLS0gdGhlIHBhcnQgb2YgdGhlIFVSTCB0aGF0IGlzIHNlbnQgdG8gdGhlIHNlcnZlci4KIAogCisuLiBtZXRob2Q6OiBSZXF1ZXN0LmdldF9oZWFkZXIoaGVhZGVyX25hbWUsIGRlZmF1bHQ9Tm9uZSkKKworICAgUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gaGVhZGVyLiBJZiB0aGUgaGVhZGVyIGlzIG5vdCBwcmVzZW50LCByZXR1cm4KKyAgIHRoZSBkZWZhdWx0IHZhbHVlLgorCisKKy4uIG1ldGhvZDo6IFJlcXVlc3QuaGVhZGVyX2l0ZW1zKCkKKworICAgUmV0dXJuIGEgbGlzdCBvZiB0dXBsZXMgKGhlYWRlcl9uYW1lLCBoZWFkZXJfdmFsdWUpIG9mIHRoZSBSZXF1ZXN0IGhlYWRlcnMuCisKKwogLi4gbWV0aG9kOjogUmVxdWVzdC5zZXRfcHJveHkoaG9zdCwgdHlwZSkKIAogICAgUHJlcGFyZSB0aGUgcmVxdWVzdCBieSBjb25uZWN0aW5nIHRvIGEgcHJveHkgc2VydmVyLiBUaGUgKmhvc3QqIGFuZCAqdHlwZSogd2lsbApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdXJscGFyc2UucnN0IGIvRG9jL2xpYnJhcnkvdXJscGFyc2UucnN0CmluZGV4IGYxMTg4NDUuLjFiYzM2MWQgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3VybHBhcnNlLnJzdAorKysgYi9Eb2MvbGlicmFyeS91cmxwYXJzZS5yc3QKQEAgLTEzLDkgKzEzLDkgQEAKICAgIHBhaXI6IHJlbGF0aXZlOyBVUkwKIAogLi4gbm90ZTo6Ci0gICBUaGUgOm1vZDpgdXJscGFyc2VgIG1vZHVsZSBpcyByZW5hbWVkIHRvIDptb2Q6YHVybGxpYi5wYXJzZWAgaW4gUHl0aG9uIDMuMC4KKyAgIFRoZSA6bW9kOmB1cmxwYXJzZWAgbW9kdWxlIGlzIHJlbmFtZWQgdG8gOm1vZDpgdXJsbGliLnBhcnNlYCBpbiBQeXRob24gMy4KICAgIFRoZSA6dGVybTpgMnRvM2AgdG9vbCB3aWxsIGF1dG9tYXRpY2FsbHkgYWRhcHQgaW1wb3J0cyB3aGVuIGNvbnZlcnRpbmcKLSAgIHlvdXIgc291cmNlcyB0byAzLjAuCisgICB5b3VyIHNvdXJjZXMgdG8gUHl0aG9uIDMuCiAKICoqU291cmNlIGNvZGU6KiogOnNvdXJjZTpgTGliL3VybHBhcnNlLnB5YAogCkBAIC0yNywxMSArMjcsMTEgQEAKIHRvIGFuIGFic29sdXRlIFVSTCBnaXZlbiBhICJiYXNlIFVSTC4iCiAKIFRoZSBtb2R1bGUgaGFzIGJlZW4gZGVzaWduZWQgdG8gbWF0Y2ggdGhlIEludGVybmV0IFJGQyBvbiBSZWxhdGl2ZSBVbmlmb3JtCi1SZXNvdXJjZSBMb2NhdG9ycyAoYW5kIGRpc2NvdmVyZWQgYSBidWcgaW4gYW4gZWFybGllciBkcmFmdCEpLiBJdCBzdXBwb3J0cyB0aGUKLWZvbGxvd2luZyBVUkwgc2NoZW1lczogYGBmaWxlYGAsIGBgZnRwYGAsIGBgZ29waGVyYGAsIGBgaGRsYGAsIGBgaHR0cGBgLAotYGBodHRwc2BgLCBgYGltYXBgYCwgYGBtYWlsdG9gYCwgYGBtbXNgYCwgYGBuZXdzYGAsICBgYG5udHBgYCwgYGBwcm9zcGVyb2BgLAotYGByc3luY2BgLCBgYHJ0c3BgYCwgYGBydHNwdWBgLCAgYGBzZnRwYGAsIGBgc2h0dHBgYCwgYGBzaXBgYCwgYGBzaXBzYGAsCi1gYHNuZXdzYGAsIGBgc3ZuYGAsICBgYHN2bitzc2hgYCwgYGB0ZWxuZXRgYCwgYGB3YWlzYGAuCitSZXNvdXJjZSBMb2NhdG9ycy4gSXQgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBVUkwgc2NoZW1lczogYGBmaWxlYGAsIGBgZnRwYGAsCitgYGdvcGhlcmBgLCBgYGhkbGBgLCBgYGh0dHBgYCwgYGBodHRwc2BgLCBgYGltYXBgYCwgYGBtYWlsdG9gYCwgYGBtbXNgYCwKK2BgbmV3c2BgLCAgYGBubnRwYGAsIGBgcHJvc3Blcm9gYCwgYGByc3luY2BgLCBgYHJ0c3BgYCwgYGBydHNwdWBgLCAgYGBzZnRwYGAsCitgYHNodHRwYGAsIGBgc2lwYGAsIGBgc2lwc2BgLCBgYHNuZXdzYGAsIGBgc3ZuYGAsICBgYHN2bitzc2hgYCwgYGB0ZWxuZXRgYCwKK2Bgd2Fpc2BgLgogCiAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjUKICAgIFN1cHBvcnQgZm9yIHRoZSBgYHNmdHBgYCBhbmQgYGBzaXBzYGAgc2NoZW1lcy4KQEAgLTcxLDggKzcxLDggQEAKICAgICAgICA+Pj4gdXJscGFyc2UoJy8vd3d3LmN3aS5ubDo4MC8lN0VndWlkby9QeXRob24uaHRtbCcpCiAgICAgICAgUGFyc2VSZXN1bHQoc2NoZW1lPScnLCBuZXRsb2M9J3d3dy5jd2kubmw6ODAnLCBwYXRoPScvJTdFZ3VpZG8vUHl0aG9uLmh0bWwnLAogICAgICAgICAgICAgICAgICAgcGFyYW1zPScnLCBxdWVyeT0nJywgZnJhZ21lbnQ9JycpCi0gICAgICAgPj4+IHVybHBhcnNlKCd3d3cuY3dpLm5sOjgwLyU3RWd1aWRvL1B5dGhvbi5odG1sJykKLSAgICAgICBQYXJzZVJlc3VsdChzY2hlbWU9JycsIG5ldGxvYz0nJywgcGF0aD0nd3d3LmN3aS5ubDo4MC8lN0VndWlkby9QeXRob24uaHRtbCcsCisgICAgICAgPj4+IHVybHBhcnNlKCd3d3cuY3dpLm5sLyU3RWd1aWRvL1B5dGhvbi5odG1sJykKKyAgICAgICBQYXJzZVJlc3VsdChzY2hlbWU9JycsIG5ldGxvYz0nJywgcGF0aD0nd3d3LmN3aS5ubC8lN0VndWlkby9QeXRob24uaHRtbCcsCiAgICAgICAgICAgICAgICAgICBwYXJhbXM9JycsIHF1ZXJ5PScnLCBmcmFnbWVudD0nJykKICAgICAgICA+Pj4gdXJscGFyc2UoJ2hlbHAvUHl0aG9uLmh0bWwnKQogICAgICAgIFBhcnNlUmVzdWx0KHNjaGVtZT0nJywgbmV0bG9jPScnLCBwYXRoPSdoZWxwL1B5dGhvbi5odG1sJywgcGFyYW1zPScnLApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdXNlci5yc3QgYi9Eb2MvbGlicmFyeS91c2VyLnJzdAppbmRleCA5MjBmNDI5Li41YWNkN2NlIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS91c2VyLnJzdAorKysgYi9Eb2MvbGlicmFyeS91c2VyLnJzdApAQCAtNyw3ICs3LDcgQEAKICAgIDpkZXByZWNhdGVkOgogCiAuLiBkZXByZWNhdGVkOjogMi42Ci0gICBUaGUgOm1vZDpgdXNlcmAgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuMC4KKyAgIFRoZSA6bW9kOmB1c2VyYCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4KIAogLi4gaW5kZXg6OgogICAgcGFpcjogLnB5dGhvbnJjLnB5OyBmaWxlCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS91c2VyZGljdC5yc3QgYi9Eb2MvbGlicmFyeS91c2VyZGljdC5yc3QKaW5kZXggMWM3NTY3NC4uMDU4NWJkYSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdXNlcmRpY3QucnN0CisrKyBiL0RvYy9saWJyYXJ5L3VzZXJkaWN0LnJzdApAQCAtODMsOSArODMsMTggQEAKIAogLi4gbm90ZTo6CiAKLSAgIFRoaXMgbW9kdWxlIGlzIGF2YWlsYWJsZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBvbmx5LiAgSWYgeW91IGFyZSB3cml0aW5nCi0gICBjb2RlIHRoYXQgZG9lcyBub3QgbmVlZCB0byB3b3JrIHdpdGggdmVyc2lvbnMgb2YgUHl0aG9uIGVhcmxpZXIgdGhhbiBQeXRob24gMi4yLAotICAgcGxlYXNlIGNvbnNpZGVyIHN1YmNsYXNzaW5nIGRpcmVjdGx5IGZyb20gdGhlIGJ1aWx0LWluIDpjbGFzczpgbGlzdGAgdHlwZS4KKyAgIFdoZW4gUHl0aG9uIDIuMiB3YXMgcmVsZWFzZWQsIG1hbnkgb2YgdGhlIHVzZSBjYXNlcyBmb3IgdGhpcyBjbGFzcyB3ZXJlCisgICBzdWJzdW1lZCBieSB0aGUgYWJpbGl0eSB0byBzdWJjbGFzcyA6Y2xhc3M6YGxpc3RgIGRpcmVjdGx5LiAgSG93ZXZlciwgYQorICAgaGFuZGZ1bCBvZiB1c2UgY2FzZXMgcmVtYWluLgorCisgICBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIGxpc3QtaW50ZXJmYWNlIGFyb3VuZCBhbiB1bmRlcmx5aW5nIGRhdGEgc3RvcmUuICBCeQorICAgZGVmYXVsdCwgdGhhdCBkYXRhIHN0b3JlIGlzIGEgOmNsYXNzOmBsaXN0YDsgaG93ZXZlciwgaXQgY2FuIGJlIHVzZWQgdG8gd3JhcAorICAgYSBsaXN0LWxpa2UgaW50ZXJmYWNlIGFyb3VuZCBvdGhlciBvYmplY3RzIChzdWNoIGFzIHBlcnNpc3RlbnQgc3RvcmFnZSkuCisKKyAgIEluIGFkZGl0aW9uLCB0aGlzIGNsYXNzIGNhbiBiZSBtaXhlZC1pbiB3aXRoIGJ1aWx0LWluIGNsYXNzZXMgdXNpbmcgbXVsdGlwbGUKKyAgIGluaGVyaXRhbmNlLiAgVGhpcyBjYW4gc29tZXRpbWVzIGJlIHVzZWZ1bC4gIEZvciBleGFtcGxlLCB5b3UgY2FuIGluaGVyaXQKKyAgIGZyb20gOmNsYXNzOmBVc2VyTGlzdGAgYW5kIDpjbGFzczpgc3RyYCBhdCB0aGUgc2FtZSB0aW1lLiAgVGhhdCB3b3VsZCBub3QgYmUKKyAgIHBvc3NpYmxlIHdpdGggYm90aCBhIHJlYWwgOmNsYXNzOmBsaXN0YCBhbmQgYSByZWFsIDpjbGFzczpgc3RyYC4KIAogVGhpcyBtb2R1bGUgZGVmaW5lcyBhIGNsYXNzIHRoYXQgYWN0cyBhcyBhIHdyYXBwZXIgYXJvdW5kIGxpc3Qgb2JqZWN0cy4gIEl0IGlzIGEKIHVzZWZ1bCBiYXNlIGNsYXNzIGZvciB5b3VyIG93biBsaXN0LWxpa2UgY2xhc3Nlcywgd2hpY2ggY2FuIGluaGVyaXQgZnJvbSB0aGVtCkBAIC0xMDUsOCArMTE0LDggQEAKIAogICAgLi4gbm90ZTo6CiAgICAgICBUaGUgOmNsYXNzOmBVc2VyTGlzdGAgY2xhc3MgaGFzIGJlZW4gbW92ZWQgdG8gdGhlIDptb2Q6YGNvbGxlY3Rpb25zYAotICAgICAgbW9kdWxlIGluIFB5dGhvbiAzLjAuIFRoZSA6dGVybTpgMnRvM2AgdG9vbCB3aWxsIGF1dG9tYXRpY2FsbHkgYWRhcHQKLSAgICAgIGltcG9ydHMgd2hlbiBjb252ZXJ0aW5nIHlvdXIgc291cmNlcyB0byAzLjAuCisgICAgICBtb2R1bGUgaW4gUHl0aG9uIDMuIFRoZSA6dGVybTpgMnRvM2AgdG9vbCB3aWxsIGF1dG9tYXRpY2FsbHkgYWRhcHQKKyAgICAgIGltcG9ydHMgd2hlbiBjb252ZXJ0aW5nIHlvdXIgc291cmNlcyB0byBQeXRob24gMy4KIAogCiBJbiBhZGRpdGlvbiB0byBzdXBwb3J0aW5nIHRoZSBtZXRob2RzIGFuZCBvcGVyYXRpb25zIG9mIG11dGFibGUgc2VxdWVuY2VzIChzZWUKQEAgLTExOSw3ICsxMjgsNyBAQAogICAgQSByZWFsIFB5dGhvbiBsaXN0IG9iamVjdCB1c2VkIHRvIHN0b3JlIHRoZSBjb250ZW50cyBvZiB0aGUgOmNsYXNzOmBVc2VyTGlzdGAKICAgIGNsYXNzLgogCi0qKlN1YmNsYXNzaW5nIHJlcXVpcmVtZW50czoqKiBTdWJjbGFzc2VzIG9mIDpjbGFzczpgVXNlckxpc3RgIGFyZSBleHBlY3QgdG8KKyoqU3ViY2xhc3NpbmcgcmVxdWlyZW1lbnRzOioqIFN1YmNsYXNzZXMgb2YgOmNsYXNzOmBVc2VyTGlzdGAgYXJlIGV4cGVjdGVkIHRvCiBvZmZlciBhIGNvbnN0cnVjdG9yIHdoaWNoIGNhbiBiZSBjYWxsZWQgd2l0aCBlaXRoZXIgbm8gYXJndW1lbnRzIG9yIG9uZQogYXJndW1lbnQuICBMaXN0IG9wZXJhdGlvbnMgd2hpY2ggcmV0dXJuIGEgbmV3IHNlcXVlbmNlIGF0dGVtcHQgdG8gY3JlYXRlIGFuCiBpbnN0YW5jZSBvZiB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIGNsYXNzLiAgVG8gZG8gc28sIGl0IGFzc3VtZXMgdGhhdCB0aGUKQEAgLTE3OCw4ICsxODcsOCBAQAogCiAgICAuLiBub3RlOjoKICAgICAgIFRoZSA6Y2xhc3M6YFVzZXJTdHJpbmdgIGNsYXNzIGhhcyBiZWVuIG1vdmVkIHRvIHRoZSA6bW9kOmBjb2xsZWN0aW9uc2AKLSAgICAgIG1vZHVsZSBpbiBQeXRob24gMy4wLiBUaGUgOnRlcm06YDJ0bzNgIHRvb2wgd2lsbCBhdXRvbWF0aWNhbGx5IGFkYXB0Ci0gICAgICBpbXBvcnRzIHdoZW4gY29udmVydGluZyB5b3VyIHNvdXJjZXMgdG8gMy4wLgorICAgICAgbW9kdWxlIGluIFB5dGhvbiAzLiBUaGUgOnRlcm06YDJ0bzNgIHRvb2wgd2lsbCBhdXRvbWF0aWNhbGx5IGFkYXB0CisgICAgICBpbXBvcnRzIHdoZW4gY29udmVydGluZyB5b3VyIHNvdXJjZXMgdG8gUHl0aG9uIDMuCiAKIAogCkBAIC0xOTQsNyArMjAzLDcgQEAKICAgIGhhcmQgdG8gdHJhY2sgZG93bi4KIAogICAgLi4gZGVwcmVjYXRlZDo6IDIuNgotICAgICAgVGhlIDpjbGFzczpgTXV0YWJsZVN0cmluZ2AgY2xhc3MgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4wLgorICAgICAgVGhlIDpjbGFzczpgTXV0YWJsZVN0cmluZ2AgY2xhc3MgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4KIAogSW4gYWRkaXRpb24gdG8gc3VwcG9ydGluZyB0aGUgbWV0aG9kcyBhbmQgb3BlcmF0aW9ucyBvZiBzdHJpbmcgYW5kIFVuaWNvZGUKIG9iamVjdHMgKHNlZSBzZWN0aW9uIDpyZWY6YHN0cmluZy1tZXRob2RzYCksIDpjbGFzczpgVXNlclN0cmluZ2AgaW5zdGFuY2VzCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS93YXJuaW5ncy5yc3QgYi9Eb2MvbGlicmFyeS93YXJuaW5ncy5yc3QKaW5kZXggZGJjZjE0OC4uMjc2NThkNiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvd2FybmluZ3MucnN0CisrKyBiL0RvYy9saWJyYXJ5L3dhcm5pbmdzLnJzdApAQCAtMTksNyArMTksNyBAQAogbWlnaHQgd2FudCB0byBpc3N1ZSBhIHdhcm5pbmcgd2hlbiBhIHByb2dyYW0gdXNlcyBhbiBvYnNvbGV0ZSBtb2R1bGUuCiAKIFB5dGhvbiBwcm9ncmFtbWVycyBpc3N1ZSB3YXJuaW5ncyBieSBjYWxsaW5nIHRoZSA6ZnVuYzpgd2FybmAgZnVuY3Rpb24gZGVmaW5lZAotaW4gdGhpcyBtb2R1bGUuICAoQyBwcm9ncmFtbWVycyB1c2UgOmNmdW5jOmBQeUVycl9XYXJuRXhgOyBzZWUKK2luIHRoaXMgbW9kdWxlLiAgKEMgcHJvZ3JhbW1lcnMgdXNlIDpjOmZ1bmM6YFB5RXJyX1dhcm5FeGA7IHNlZQogOnJlZjpgZXhjZXB0aW9uaGFuZGxpbmdgIGZvciBkZXRhaWxzKS4KIAogV2FybmluZyBtZXNzYWdlcyBhcmUgbm9ybWFsbHkgd3JpdHRlbiB0byBgYHN5cy5zdGRlcnJgYCwgYnV0IHRoZWlyIGRpc3Bvc2l0aW9uCkBAIC01Nyw2ICs1Nyw4IEBACiBUaGlzIGNhdGVnb3JpemF0aW9uIGlzIHVzZWZ1bCB0byBiZSBhYmxlIHRvIGZpbHRlciBvdXQgZ3JvdXBzIG9mIHdhcm5pbmdzLiAgVGhlCiBmb2xsb3dpbmcgd2FybmluZ3MgY2F0ZWdvcnkgY2xhc3NlcyBhcmUgY3VycmVudGx5IGRlZmluZWQ6CiAKKy4uIHRhYnVsYXJjb2x1bW5zOjogfGx8cHswLjZcbGluZXdpZHRofXwKKwogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiB8IENsYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KwpAQCAtMTY3LDcgKzE2OSw4IEBACiB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnMgcGFzc2VkIHRvIDpvcHRpb246YC1XYCBhbmQgY2FsbHMgdG8KIDpmdW5jOmBmaWx0ZXJ3YXJuaW5nc2AuCiAKLSogOmV4YzpgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZ2AsIGFuZCA6ZXhjOmBJbXBvcnRXYXJuaW5nYCBhcmUgaWdub3JlZC4KKyogOmV4YzpgRGVwcmVjYXRpb25XYXJuaW5nYCBhbmQgOmV4YzpgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZ2AsIGFuZAorICA6ZXhjOmBJbXBvcnRXYXJuaW5nYCBhcmUgaWdub3JlZC4KIAogKiA6ZXhjOmBCeXRlc1dhcm5pbmdgIGlzIGlnbm9yZWQgdW5sZXNzIHRoZSA6b3B0aW9uOmAtYmAgb3B0aW9uIGlzIGdpdmVuIG9uY2Ugb3IKICAgdHdpY2U7IGluIHRoaXMgY2FzZSB0aGlzIHdhcm5pbmcgaXMgZWl0aGVyIHByaW50ZWQgKGBgLWJgYCkgb3IgdHVybmVkIGludG8gYW4KQEAgLTQxOCw3ICs0MjEsNyBAQAogCiAgICAgLi4gbm90ZTo6CiAKLSAgICAgICAgSW4gUHl0aG9uIDMuMCwgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29uc3RydWN0b3IgZm9yCisgICAgICAgIEluIFB5dGhvbiAzLCB0aGUgYXJndW1lbnRzIHRvIHRoZSBjb25zdHJ1Y3RvciBmb3IKICAgICAgICAgOmNsYXNzOmBjYXRjaF93YXJuaW5nc2AgYXJlIGtleXdvcmQtb25seSBhcmd1bWVudHMuCiAKICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjYKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3dlYWtyZWYucnN0IGIvRG9jL2xpYnJhcnkvd2Vha3JlZi5yc3QKaW5kZXggNzkyOWM1MS4uMWMzY2RiYiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvd2Vha3JlZi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvd2Vha3JlZi5yc3QKQEAgLTUzLDEyICs1Myw2IEBACiBkaWN0aW9uYXJ5IGltcGxlbWVudGF0aW9ucyBpcyBleHBvc2VkIGJ5IHRoZSA6bW9kOmB3ZWFrcmVmYCBtb2R1bGUgZm9yIHRoZQogYmVuZWZpdCBvZiBhZHZhbmNlZCB1c2VzLgogCi0uLiBub3RlOjoKLQotICAgV2VhayByZWZlcmVuY2VzIHRvIGFuIG9iamVjdCBhcmUgY2xlYXJlZCBiZWZvcmUgdGhlIG9iamVjdCdzIDptZXRoOmBfX2RlbF9fYAotICAgaXMgY2FsbGVkLCB0byBlbnN1cmUgdGhhdCB0aGUgd2VhayByZWZlcmVuY2UgY2FsbGJhY2sgKGlmIGFueSkgZmluZHMgdGhlCi0gICBvYmplY3Qgc3RpbGwgYWxpdmUuCi0KIE5vdCBhbGwgb2JqZWN0cyBjYW4gYmUgd2Vha2x5IHJlZmVyZW5jZWQ7IHRob3NlIG9iamVjdHMgd2hpY2ggY2FuIGluY2x1ZGUgY2xhc3MKIGluc3RhbmNlcywgZnVuY3Rpb25zIHdyaXR0ZW4gaW4gUHl0aG9uIChidXQgbm90IGluIEMpLCBtZXRob2RzIChib3RoIGJvdW5kIGFuZAogdW5ib3VuZCksIHNldHMsIGZyb3plbnNldHMsIGZpbGUgb2JqZWN0cywgOnRlcm06YGdlbmVyYXRvcmBccywgdHlwZSBvYmplY3RzLApAQCAtMTY5LDcgKzE2Myw3IEBACiAKIC4uIG1ldGhvZDo6IFdlYWtLZXlEaWN0aW9uYXJ5Lml0ZXJrZXlyZWZzKCkKIAotICAgUmV0dXJuIGFuIDp0ZXJtOmBpdGVyYXRvcmAgdGhhdCB5aWVsZHMgdGhlIHdlYWsgcmVmZXJlbmNlcyB0byB0aGUga2V5cy4KKyAgIFJldHVybiBhbiBpdGVyYWJsZSBvZiB0aGUgd2VhayByZWZlcmVuY2VzIHRvIHRoZSBrZXlzLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjUKIApAQCAtMjAxLDcgKzE5NSw3IEBACiAKIC4uIG1ldGhvZDo6IFdlYWtWYWx1ZURpY3Rpb25hcnkuaXRlcnZhbHVlcmVmcygpCiAKLSAgIFJldHVybiBhbiA6dGVybTpgaXRlcmF0b3JgIHRoYXQgeWllbGRzIHRoZSB3ZWFrIHJlZmVyZW5jZXMgdG8gdGhlIHZhbHVlcy4KKyAgIFJldHVybiBhbiBpdGVyYWJsZSBvZiB0aGUgd2VhayByZWZlcmVuY2VzIHRvIHRoZSB2YWx1ZXMuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNQogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS93ZWJicm93c2VyLnJzdCBiL0RvYy9saWJyYXJ5L3dlYmJyb3dzZXIucnN0CmluZGV4IDFhMjdkMDcuLmU2ZTdlYTIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3dlYmJyb3dzZXIucnN0CisrKyBiL0RvYy9saWJyYXJ5L3dlYmJyb3dzZXIucnN0CkBAIC0zNiw3ICszNiw5IEBACiBtb2R1bGUuIEl0IGFjY2VwdHMgYW4gVVJMIGFzIHRoZSBhcmd1bWVudC4gSXQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbmFsCiBwYXJhbWV0ZXJzOiBgYC1uYGAgb3BlbnMgdGhlIFVSTCBpbiBhIG5ldyBicm93c2VyIHdpbmRvdywgaWYgcG9zc2libGU7CiBgYC10YGAgb3BlbnMgdGhlIFVSTCBpbiBhIG5ldyBicm93c2VyIHBhZ2UgKCJ0YWIiKS4gVGhlIG9wdGlvbnMgYXJlLAotbmF0dXJhbGx5LCBtdXR1YWxseSBleGNsdXNpdmUuCituYXR1cmFsbHksIG11dHVhbGx5IGV4Y2x1c2l2ZS4gIFVzYWdlIGV4YW1wbGU6OgorCisgICBweXRob24gLW0gd2ViYnJvd3NlciAtdCAiaHR0cDovL3d3dy5weXRob24ub3JnIgogCiBUaGUgZm9sbG93aW5nIGV4Y2VwdGlvbiBpcyBkZWZpbmVkOgogCkBAIC00OCw3ICs1MCw3IEBACiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZDoKIAogCi0uLiBmdW5jdGlvbjo6IG9wZW4odXJsWywgbmV3PTBbLCBhdXRvcmFpc2U9VHJ1ZV1dKQorLi4gZnVuY3Rpb246OiBvcGVuKHVybCwgbmV3PTAsIGF1dG9yYWlzZT1UcnVlKQogCiAgICBEaXNwbGF5ICp1cmwqIHVzaW5nIHRoZSBkZWZhdWx0IGJyb3dzZXIuIElmICpuZXcqIGlzIDAsIHRoZSAqdXJsKiBpcyBvcGVuZWQKICAgIGluIHRoZSBzYW1lIGJyb3dzZXIgd2luZG93IGlmIHBvc3NpYmxlLiAgSWYgKm5ldyogaXMgMSwgYSBuZXcgYnJvd3NlciB3aW5kb3cKQEAgLTEzOCw5ICsxNDAsOSBAQAogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rCiB8IGBgJ3dpbmRvd3MtZGVmYXVsdCdgYCB8IDpjbGFzczpgV2luZG93c0RlZmF1bHRgICAgICAgICAgICAgICAgICB8IFwoMikgIHwKICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKwotfCBgYCdpbnRlcm5ldC1jb25maWcnYGAgfCA6Y2xhc3M6YEludGVybmV0Q29uZmlnYCAgICAgICAgICAgICAgICAgfCBcKDMpICB8Cit8IGBgJ21hY29zeCdgYCAgICAgICAgICB8IDpjbGFzczpgTWFjT1NYKCdkZWZhdWx0JylgICAgICAgICAgICAgICB8IFwoMykgIHwKICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKwotfCBgYCdtYWNvc3gnYGAgICAgICAgICAgfCA6Y2xhc3M6YE1hY09TWCgnZGVmYXVsdCcpYCAgICAgICAgICAgICAgfCBcKDQpICB8Cit8IGBgJ3NhZmFyaSdgYCAgICAgICAgICB8IDpjbGFzczpgTWFjT1NYKCdzYWZhcmknKWAgICAgICAgICAgICAgICB8IFwoMykgIHwKICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKwogCiBOb3RlczoKQEAgLTE1Niw5ICsxNTgsNiBAQAogICAgT25seSBvbiBXaW5kb3dzIHBsYXRmb3Jtcy4KIAogKDMpCi0gICBPbmx5IG9uIE1hYyBPUyBwbGF0Zm9ybXM7IHJlcXVpcmVzIHRoZSBzdGFuZGFyZCBNYWNQeXRob24gOm1vZDpgaWNgIG1vZHVsZS4KLQotKDQpCiAgICBPbmx5IG9uIE1hYyBPUyBYIHBsYXRmb3JtLgogCiBIZXJlIGFyZSBzb21lIHNpbXBsZSBleGFtcGxlczo6CkBAIC0xODEsNyArMTgwLDcgQEAKIG1vZHVsZS1sZXZlbCBjb252ZW5pZW5jZSBmdW5jdGlvbnM6CiAKIAotLi4gbWV0aG9kOjogY29udHJvbGxlci5vcGVuKHVybFssIG5ldz0wWywgYXV0b3JhaXNlPVRydWVdXSkKKy4uIG1ldGhvZDo6IGNvbnRyb2xsZXIub3Blbih1cmwsIG5ldz0wLCBhdXRvcmFpc2U9VHJ1ZSkKIAogICAgRGlzcGxheSAqdXJsKiB1c2luZyB0aGUgYnJvd3NlciBoYW5kbGVkIGJ5IHRoaXMgY29udHJvbGxlci4gSWYgKm5ldyogaXMgMSwgYSBuZXcKICAgIGJyb3dzZXIgd2luZG93IGlzIG9wZW5lZCBpZiBwb3NzaWJsZS4gSWYgKm5ldyogaXMgMiwgYSBuZXcgYnJvd3NlciBwYWdlICgidGFiIikKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3doaWNoZGIucnN0IGIvRG9jL2xpYnJhcnkvd2hpY2hkYi5yc3QKaW5kZXggNzA0OGEwZS4uM2JjYjU3YyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvd2hpY2hkYi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvd2hpY2hkYi5yc3QKQEAgLTYsOCArNiw4IEBACiAKIC4uIG5vdGU6OgogICAgVGhlIDptb2Q6YHdoaWNoZGJgIG1vZHVsZSdzIG9ubHkgZnVuY3Rpb24gaGFzIGJlZW4gcHV0IGludG8gdGhlIDptb2Q6YGRibWAKLSAgIG1vZHVsZSBpbiBQeXRob24gMy4wLiAgVGhlIDp0ZXJtOmAydG8zYCB0b29sIHdpbGwgYXV0b21hdGljYWxseSBhZGFwdCBpbXBvcnRzCi0gICB3aGVuIGNvbnZlcnRpbmcgeW91ciBzb3VyY2VzIHRvIDMuMC4KKyAgIG1vZHVsZSBpbiBQeXRob24gMy4gIFRoZSA6dGVybTpgMnRvM2AgdG9vbCB3aWxsIGF1dG9tYXRpY2FsbHkgYWRhcHQgaW1wb3J0cworICAgd2hlbiBjb252ZXJ0aW5nIHlvdXIgc291cmNlcyB0byBQeXRob24gMy4KIAogCiBUaGUgc2luZ2xlIGZ1bmN0aW9uIGluIHRoaXMgbW9kdWxlIGF0dGVtcHRzIHRvIGd1ZXNzIHdoaWNoIG9mIHRoZSBzZXZlcmFsIHNpbXBsZQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvd2luc291bmQucnN0IGIvRG9jL2xpYnJhcnkvd2luc291bmQucnN0CmluZGV4IGI0YTMzOTEuLjVjNTkwZmYgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3dpbnNvdW5kLnJzdAorKysgYi9Eb2MvbGlicmFyeS93aW5zb3VuZC5yc3QKQEAgLTI3LDcgKzI3LDcgQEAKIAogLi4gZnVuY3Rpb246OiBQbGF5U291bmQoc291bmQsIGZsYWdzKQogCi0gICBDYWxsIHRoZSB1bmRlcmx5aW5nIDpjZnVuYzpgUGxheVNvdW5kYCBmdW5jdGlvbiBmcm9tIHRoZSBQbGF0Zm9ybSBBUEkuICBUaGUKKyAgIENhbGwgdGhlIHVuZGVybHlpbmcgOmM6ZnVuYzpgUGxheVNvdW5kYCBmdW5jdGlvbiBmcm9tIHRoZSBQbGF0Zm9ybSBBUEkuICBUaGUKICAgICpzb3VuZCogcGFyYW1ldGVyIG1heSBiZSBhIGZpbGVuYW1lLCBhdWRpbyBkYXRhIGFzIGEgc3RyaW5nLCBvciBgYE5vbmVgYC4gIEl0cwogICAgaW50ZXJwcmV0YXRpb24gZGVwZW5kcyBvbiB0aGUgdmFsdWUgb2YgKmZsYWdzKiwgd2hpY2ggY2FuIGJlIGEgYml0d2lzZSBPUmVkCiAgICBjb21iaW5hdGlvbiBvZiB0aGUgY29uc3RhbnRzIGRlc2NyaWJlZCBiZWxvdy4gSWYgdGhlICpzb3VuZCogcGFyYW1ldGVyIGlzCkBAIC0zNyw3ICszNyw3IEBACiAKIC4uIGZ1bmN0aW9uOjogTWVzc2FnZUJlZXAoW3R5cGU9TUJfT0tdKQogCi0gICBDYWxsIHRoZSB1bmRlcmx5aW5nIDpjZnVuYzpgTWVzc2FnZUJlZXBgIGZ1bmN0aW9uIGZyb20gdGhlIFBsYXRmb3JtIEFQSS4gIFRoaXMKKyAgIENhbGwgdGhlIHVuZGVybHlpbmcgOmM6ZnVuYzpgTWVzc2FnZUJlZXBgIGZ1bmN0aW9uIGZyb20gdGhlIFBsYXRmb3JtIEFQSS4gIFRoaXMKICAgIHBsYXlzIGEgc291bmQgYXMgc3BlY2lmaWVkIGluIHRoZSByZWdpc3RyeS4gIFRoZSAqdHlwZSogYXJndW1lbnQgc3BlY2lmaWVzIHdoaWNoCiAgICBzb3VuZCB0byBwbGF5OyBwb3NzaWJsZSB2YWx1ZXMgYXJlIGBgLTFgYCwgYGBNQl9JQ09OQVNURVJJU0tgYCwKICAgIGBgTUJfSUNPTkVYQ0xBTUFUSU9OYGAsIGBgTUJfSUNPTkhBTkRgYCwgYGBNQl9JQ09OUVVFU1RJT05gYCwgYW5kIGBgTUJfT0tgYCwgYWxsCkBAIC0xMzMsNiArMTMzLDEwIEBACiAKICAgIFJldHVybiBpbW1lZGlhdGVseSBpZiB0aGUgc291bmQgZHJpdmVyIGlzIGJ1c3kuCiAKKyAgIC4uIG5vdGU6OgorCisgICAgICBUaGlzIGZsYWcgaXMgbm90IHN1cHBvcnRlZCBvbiBtb2Rlcm4gV2luZG93cyBwbGF0Zm9ybXMuCisKIAogLi4gZGF0YTo6IE1CX0lDT05BU1RFUklTSwogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS93c2dpcmVmLnJzdCBiL0RvYy9saWJyYXJ5L3dzZ2lyZWYucnN0CmluZGV4IDMxNjM0OTcuLjBiMGM3YzIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3dzZ2lyZWYucnN0CisrKyBiL0RvYy9saWJyYXJ5L3dzZ2lyZWYucnN0CkBAIC01OSw3ICs1OSw3IEBACiAgICBmb3VuZCwgYW5kICJodHRwIiBvdGhlcndpc2UuCiAKIAotLi4gZnVuY3Rpb246OiByZXF1ZXN0X3VyaShlbnZpcm9uIFssIGluY2x1ZGVfcXVlcnk9MV0pCisuLiBmdW5jdGlvbjo6IHJlcXVlc3RfdXJpKGVudmlyb24sIGluY2x1ZGVfcXVlcnk9MSkKIAogICAgUmV0dXJuIHRoZSBmdWxsIHJlcXVlc3QgVVJJLCBvcHRpb25hbGx5IGluY2x1ZGluZyB0aGUgcXVlcnkgc3RyaW5nLCB1c2luZyB0aGUKICAgIGFsZ29yaXRobSBmb3VuZCBpbiB0aGUgIlVSTCBSZWNvbnN0cnVjdGlvbiIgc2VjdGlvbiBvZiA6cGVwOmAzMzNgLiAgSWYKQEAgLTE0OCw3ICsxNDgsNyBAQAogICAgOnJmYzpgMjYxNmAuCiAKIAotLi4gY2xhc3M6OiBGaWxlV3JhcHBlcihmaWxlbGlrZSBbLCBibGtzaXplPTgxOTJdKQorLi4gY2xhc3M6OiBGaWxlV3JhcHBlcihmaWxlbGlrZSwgYmxrc2l6ZT04MTkyKQogCiAgICBBIHdyYXBwZXIgdG8gY29udmVydCBhIGZpbGUtbGlrZSBvYmplY3QgdG8gYW4gOnRlcm06YGl0ZXJhdG9yYC4gIFRoZSByZXN1bHRpbmcgb2JqZWN0cwogICAgc3VwcG9ydCBib3RoIDptZXRoOmBfX2dldGl0ZW1fX2AgYW5kIDptZXRoOmBfX2l0ZXJfX2AgaXRlcmF0aW9uIHN0eWxlcywgZm9yCkBAIC0yNzEsNyArMjcxLDcgQEAKIDptb2Q6YHdzZ2lyZWYudXRpbGAuKQogCiAKLS4uIGZ1bmN0aW9uOjogbWFrZV9zZXJ2ZXIoaG9zdCwgcG9ydCwgYXBwIFssIHNlcnZlcl9jbGFzcz1XU0dJU2VydmVyIFssIGhhbmRsZXJfY2xhc3M9V1NHSVJlcXVlc3RIYW5kbGVyXV0pCisuLiBmdW5jdGlvbjo6IG1ha2Vfc2VydmVyKGhvc3QsIHBvcnQsIGFwcCwgc2VydmVyX2NsYXNzPVdTR0lTZXJ2ZXIsIGhhbmRsZXJfY2xhc3M9V1NHSVJlcXVlc3RIYW5kbGVyKQogCiAgICBDcmVhdGUgYSBuZXcgV1NHSSBzZXJ2ZXIgbGlzdGVuaW5nIG9uICpob3N0KiBhbmQgKnBvcnQqLCBhY2NlcHRpbmcgY29ubmVjdGlvbnMKICAgIGZvciAqYXBwKi4gIFRoZSByZXR1cm4gdmFsdWUgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN1cHBsaWVkICpzZXJ2ZXJfY2xhc3MqLCBhbmQKQEAgLTQ2MCw3ICs0NjAsNyBAQAogICAgZW52aXJvbm1lbnQuCiAKIAotLi4gY2xhc3M6OiBCYXNlQ0dJSGFuZGxlcihzdGRpbiwgc3Rkb3V0LCBzdGRlcnIsIGVudmlyb24gWywgbXVsdGl0aHJlYWQ9VHJ1ZSBbLCBtdWx0aXByb2Nlc3M9RmFsc2VdXSkKKy4uIGNsYXNzOjogQmFzZUNHSUhhbmRsZXIoc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBlbnZpcm9uLCBtdWx0aXRocmVhZD1UcnVlLCBtdWx0aXByb2Nlc3M9RmFsc2UpCiAKICAgIFNpbWlsYXIgdG8gOmNsYXNzOmBDR0lIYW5kbGVyYCwgYnV0IGluc3RlYWQgb2YgdXNpbmcgdGhlIDptb2Q6YHN5c2AgYW5kCiAgICA6bW9kOmBvc2AgbW9kdWxlcywgdGhlIENHSSBlbnZpcm9ubWVudCBhbmQgSS9PIHN0cmVhbXMgYXJlIHNwZWNpZmllZCBleHBsaWNpdGx5LgpAQCAtNDc1LDcgKzQ3NSw3IEBACiAgICBpbnN0ZWFkIG9mIDpjbGFzczpgU2ltcGxlSGFuZGxlcmAuCiAKIAotLi4gY2xhc3M6OiBTaW1wbGVIYW5kbGVyKHN0ZGluLCBzdGRvdXQsIHN0ZGVyciwgZW52aXJvbiBbLG11bHRpdGhyZWFkPVRydWUgWywgbXVsdGlwcm9jZXNzPUZhbHNlXV0pCisuLiBjbGFzczo6IFNpbXBsZUhhbmRsZXIoc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBlbnZpcm9uLCBtdWx0aXRocmVhZD1UcnVlLCBtdWx0aXByb2Nlc3M9RmFsc2UpCiAKICAgIFNpbWlsYXIgdG8gOmNsYXNzOmBCYXNlQ0dJSGFuZGxlcmAsIGJ1dCBkZXNpZ25lZCBmb3IgdXNlIHdpdGggSFRUUCBvcmlnaW4KICAgIHNlcnZlcnMuICBJZiB5b3UgYXJlIHdyaXRpbmcgYW4gSFRUUCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24sIHlvdSB3aWxsIHByb2JhYmx5CmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS94ZHJsaWIucnN0IGIvRG9jL2xpYnJhcnkveGRybGliLnJzdAppbmRleCBlNTY2NTBjLi42ZjA1MzA2IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS94ZHJsaWIucnN0CisrKyBiL0RvYy9saWJyYXJ5L3hkcmxpYi5yc3QKQEAgLTI3NCw2ICsyNzQsNSBAQAogICAgcCA9IHhkcmxpYi5QYWNrZXIoKQogICAgdHJ5OgogICAgICAgIHAucGFja19kb3VibGUoOC4wMSkKLSAgIGV4Y2VwdCB4ZHJsaWIuQ29udmVyc2lvbkVycm9yLCBpbnN0YW5jZToKKyAgIGV4Y2VwdCB4ZHJsaWIuQ29udmVyc2lvbkVycm9yIGFzIGluc3RhbmNlOgogICAgICAgIHByaW50ICdwYWNraW5nIHRoZSBkb3VibGUgZmFpbGVkOicsIGluc3RhbmNlLm1zZwotCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS94bWwuZG9tLm1pbmlkb20ucnN0IGIvRG9jL2xpYnJhcnkveG1sLmRvbS5taW5pZG9tLnJzdAppbmRleCA2OWU5ZTU2Li4xZmY3MDI0IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS94bWwuZG9tLm1pbmlkb20ucnN0CisrKyBiL0RvYy9saWJyYXJ5L3htbC5kb20ubWluaWRvbS5yc3QKQEAgLTEsOCArMSw4IEBACi06bW9kOmB4bWwuZG9tLm1pbmlkb21gIC0tLSBMaWdodHdlaWdodCBET00gaW1wbGVtZW50YXRpb24KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOm1vZDpgeG1sLmRvbS5taW5pZG9tYCAtLS0gTWluaW1hbCBET00gaW1wbGVtZW50YXRpb24KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIC4uIG1vZHVsZTo6IHhtbC5kb20ubWluaWRvbQotICAgOnN5bm9wc2lzOiBMaWdodHdlaWdodCBEb2N1bWVudCBPYmplY3QgTW9kZWwgKERPTSkgaW1wbGVtZW50YXRpb24uCisgICA6c3lub3BzaXM6IE1pbmltYWwgRG9jdW1lbnQgT2JqZWN0IE1vZGVsIChET00pIGltcGxlbWVudGF0aW9uLgogLi4gbW9kdWxlYXV0aG9yOjogUGF1bCBQcmVzY29kIDxwYXVsQHByZXNjb2QubmV0PgogLi4gc2VjdGlvbmF1dGhvcjo6IFBhdWwgUHJlc2NvZCA8cGF1bEBwcmVzY29kLm5ldD4KIC4uIHNlY3Rpb25hdXRob3I6OiBNYXJ0aW4gdi4gTMO2d2lzIDxtYXJ0aW5Adi5sb2V3aXMuZGU+CkBAIC0xNCw5ICsxNCwxOSBAQAogCiAtLS0tLS0tLS0tLS0tLQogCi06bW9kOmB4bWwuZG9tLm1pbmlkb21gIGlzIGEgbGlnaHQtd2VpZ2h0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBEb2N1bWVudCBPYmplY3QKLU1vZGVsIGludGVyZmFjZS4gIEl0IGlzIGludGVuZGVkIHRvIGJlIHNpbXBsZXIgdGhhbiB0aGUgZnVsbCBET00gYW5kIGFsc28KLXNpZ25pZmljYW50bHkgc21hbGxlci4KKzptb2Q6YHhtbC5kb20ubWluaWRvbWAgaXMgYSBtaW5pbWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBEb2N1bWVudCBPYmplY3QKK01vZGVsIGludGVyZmFjZSwgd2l0aCBhbiBBUEkgc2ltaWxhciB0byB0aGF0IGluIG90aGVyIGxhbmd1YWdlcy4gIEl0IGlzIGludGVuZGVkCit0byBiZSBzaW1wbGVyIHRoYW4gdGhlIGZ1bGwgRE9NIGFuZCBhbHNvIHNpZ25pZmljYW50bHkgc21hbGxlci4gIFVzZXJzIHdobyBhcmUKK25vdCBhbHJlYWR5IHByb2ZpY2llbnQgd2l0aCB0aGUgRE9NIHNob3VsZCBjb25zaWRlciB1c2luZyB0aGUKKzptb2Q6YHhtbC5ldHJlZS5FbGVtZW50VHJlZWAgbW9kdWxlIGZvciB0aGVpciBYTUwgcHJvY2Vzc2luZyBpbnN0ZWFkCisKKworLi4gd2FybmluZzo6CisKKyAgIFRoZSA6bW9kOmB4bWwuZG9tLm1pbmlkb21gIG1vZHVsZSBpcyBub3Qgc2VjdXJlIGFnYWluc3QKKyAgIG1hbGljaW91c2x5IGNvbnN0cnVjdGVkIGRhdGEuICBJZiB5b3UgbmVlZCB0byBwYXJzZSB1bnRydXN0ZWQgb3IKKyAgIHVuYXV0aGVudGljYXRlZCBkYXRhIHNlZSA6cmVmOmB4bWwtdnVsbmVyYWJpbGl0aWVzYC4KKwogCiBET00gYXBwbGljYXRpb25zIHR5cGljYWxseSBzdGFydCBieSBwYXJzaW5nIHNvbWUgWE1MIGludG8gYSBET00uICBXaXRoCiA6bW9kOmB4bWwuZG9tLm1pbmlkb21gLCB0aGlzIGlzIGRvbmUgdGhyb3VnaCB0aGUgcGFyc2UgZnVuY3Rpb25zOjoKQEAgLTQ4LDcgKzU4LDcgQEAKIC4uIGZ1bmN0aW9uOjogcGFyc2VTdHJpbmcoc3RyaW5nWywgcGFyc2VyXSkKIAogICAgUmV0dXJuIGEgOmNsYXNzOmBEb2N1bWVudGAgdGhhdCByZXByZXNlbnRzIHRoZSAqc3RyaW5nKi4gVGhpcyBtZXRob2QgY3JlYXRlcyBhCi0gICA6Y2xhc3M6YFN0cmluZ0lPYCBvYmplY3QgZm9yIHRoZSBzdHJpbmcgYW5kIHBhc3NlcyB0aGF0IG9uIHRvIDpmdW5jOmBwYXJzZWAuCisgICA6Y2xhc3M6YH5TdHJpbmdJTy5TdHJpbmdJT2Agb2JqZWN0IGZvciB0aGUgc3RyaW5nIGFuZCBwYXNzZXMgdGhhdCBvbiB0byA6ZnVuYzpgcGFyc2VgLgogCiBCb3RoIGZ1bmN0aW9ucyByZXR1cm4gYSA6Y2xhc3M6YERvY3VtZW50YCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjb250ZW50IG9mIHRoZQogZG9jdW1lbnQuCkBAIC0xMjEsNyArMTMxLDcgQEAKICAgIHRvIGRpc2NhcmQgY2hpbGRyZW4gb2YgdGhhdCBub2RlLgogCiAKLS4uIG1ldGhvZDo6IE5vZGUud3JpdGV4bWwod3JpdGVyWywgaW5kZW50PSIiWywgYWRkaW5kZW50PSIiWywgbmV3bD0iIl1dXSkKKy4uIG1ldGhvZDo6IE5vZGUud3JpdGV4bWwod3JpdGVyLCBpbmRlbnQ9IiIsIGFkZGluZGVudD0iIiwgbmV3bD0iIikKIAogICAgV3JpdGUgWE1MIHRvIHRoZSB3cml0ZXIgb2JqZWN0LiAgVGhlIHdyaXRlciBzaG91bGQgaGF2ZSBhIDptZXRoOmB3cml0ZWAgbWV0aG9kCiAgICB3aGljaCBtYXRjaGVzIHRoYXQgb2YgdGhlIGZpbGUgb2JqZWN0IGludGVyZmFjZS4gIFRoZSAqaW5kZW50KiBwYXJhbWV0ZXIgaXMgdGhlCkBAIC0yNjYsNCArMjc2LDQgQEAKIC4uIFsjXSBUaGUgZW5jb2Rpbmcgc3RyaW5nIGluY2x1ZGVkIGluIFhNTCBvdXRwdXQgc2hvdWxkIGNvbmZvcm0gdG8gdGhlCiAgICBhcHByb3ByaWF0ZSBzdGFuZGFyZHMuIEZvciBleGFtcGxlLCAiVVRGLTgiIGlzIHZhbGlkLCBidXQgIlVURjgiIGlzCiAgICBub3QuIFNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA2L1JFQy14bWwxMS0yMDA2MDgxNi8jTlQtRW5jb2RpbmdEZWNsCi0gICBhbmQgaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9jaGFyYWN0ZXItc2V0cyAuCisgICBhbmQgaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9jaGFyYWN0ZXItc2V0c1wgLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkveG1sLmRvbS5wdWxsZG9tLnJzdCBiL0RvYy9saWJyYXJ5L3htbC5kb20ucHVsbGRvbS5yc3QKaW5kZXggYmFkMGRhYS4uOTAzMjcwNiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkveG1sLmRvbS5wdWxsZG9tLnJzdAorKysgYi9Eb2MvbGlicmFyeS94bWwuZG9tLnB1bGxkb20ucnN0CkBAIC0xNiw2ICsxNiwxMyBAQAogT2JqZWN0IE1vZGVsIHJlcHJlc2VudGF0aW9uIG9mIGEgZG9jdW1lbnQgZnJvbSBTQVggZXZlbnRzLgogCiAKKy4uIHdhcm5pbmc6OgorCisgICBUaGUgOm1vZDpgeG1sLmRvbS5wdWxsZG9tYCBtb2R1bGUgaXMgbm90IHNlY3VyZSBhZ2FpbnN0CisgICBtYWxpY2lvdXNseSBjb25zdHJ1Y3RlZCBkYXRhLiAgSWYgeW91IG5lZWQgdG8gcGFyc2UgdW50cnVzdGVkIG9yCisgICB1bmF1dGhlbnRpY2F0ZWQgZGF0YSBzZWUgOnJlZjpgeG1sLXZ1bG5lcmFiaWxpdGllc2AuCisKKwogLi4gY2xhc3M6OiBQdWxsRE9NKFtkb2N1bWVudEZhY3RvcnldKQogCiAgICA6Y2xhc3M6YHhtbC5zYXguaGFuZGxlci5Db250ZW50SGFuZGxlcmAgaW1wbGVtZW50YXRpb24gdGhhdCAuLi4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3htbC5kb20ucnN0IGIvRG9jL2xpYnJhcnkveG1sLmRvbS5yc3QKaW5kZXggMTA2OTYxNS4uNTQxZDY0OSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkveG1sLmRvbS5yc3QKKysrIGIvRG9jL2xpYnJhcnkveG1sLmRvbS5yc3QKQEAgLTM3NCw3ICszNzQsNyBAQAogCiAgICBBZGQgYSBuZXcgY2hpbGQgbm9kZSB0byB0aGlzIG5vZGUgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCBvZgogICAgY2hpbGRyZW4sIHJldHVybmluZyAqbmV3Q2hpbGQqLiBJZiB0aGUgbm9kZSB3YXMgYWxyZWFkeSBpbgotICAgaW4gdGhlIHRyZWUsIGl0IGlzIHJlbW92ZWQgZmlyc3QuCisgICB0aGUgdHJlZSwgaXQgaXMgcmVtb3ZlZCBmaXJzdC4KIAogCiAuLiBtZXRob2Q6OiBOb2RlLmluc2VydEJlZm9yZShuZXdDaGlsZCwgcmVmQ2hpbGQpCkBAIC00NDEsMTQgKzQ0MSwxNSBAQAogCiBJbiBhZGRpdGlvbiwgdGhlIFB5dGhvbiBET00gaW50ZXJmYWNlIHJlcXVpcmVzIHRoYXQgc29tZSBhZGRpdGlvbmFsIHN1cHBvcnQgaXMKIHByb3ZpZGVkIHRvIGFsbG93IDpjbGFzczpgTm9kZUxpc3RgIG9iamVjdHMgdG8gYmUgdXNlZCBhcyBQeXRob24gc2VxdWVuY2VzLiAgQWxsCi06Y2xhc3M6YE5vZGVMaXN0YCBpbXBsZW1lbnRhdGlvbnMgbXVzdCBpbmNsdWRlIHN1cHBvcnQgZm9yIDptZXRoOmBfX2xlbl9fYCBhbmQKLTptZXRoOmBfX2dldGl0ZW1fX2A7IHRoaXMgYWxsb3dzIGl0ZXJhdGlvbiBvdmVyIHRoZSA6Y2xhc3M6YE5vZGVMaXN0YCBpbgorOmNsYXNzOmBOb2RlTGlzdGAgaW1wbGVtZW50YXRpb25zIG11c3QgaW5jbHVkZSBzdXBwb3J0IGZvcgorOm1ldGg6YH5vYmplY3QuX19sZW5fX2AgYW5kCis6bWV0aDpgfm9iamVjdC5fX2dldGl0ZW1fX2A7IHRoaXMgYWxsb3dzIGl0ZXJhdGlvbiBvdmVyIHRoZSA6Y2xhc3M6YE5vZGVMaXN0YCBpbgogOmtleXdvcmQ6YGZvcmAgc3RhdGVtZW50cyBhbmQgcHJvcGVyIHN1cHBvcnQgZm9yIHRoZSA6ZnVuYzpgbGVuYCBidWlsdC1pbgogZnVuY3Rpb24uCiAKIElmIGEgRE9NIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG1vZGlmaWNhdGlvbiBvZiB0aGUgZG9jdW1lbnQsIHRoZQotOmNsYXNzOmBOb2RlTGlzdGAgaW1wbGVtZW50YXRpb24gbXVzdCBhbHNvIHN1cHBvcnQgdGhlIDptZXRoOmBfX3NldGl0ZW1fX2AgYW5kCi06bWV0aDpgX19kZWxpdGVtX19gIG1ldGhvZHMuCis6Y2xhc3M6YE5vZGVMaXN0YCBpbXBsZW1lbnRhdGlvbiBtdXN0IGFsc28gc3VwcG9ydCB0aGUKKzptZXRoOmB+b2JqZWN0Ll9fc2V0aXRlbV9fYCBhbmQgOm1ldGg6YH5vYmplY3QuX19kZWxpdGVtX19gIG1ldGhvZHMuCiAKIAogLi4gX2RvbS1kb2N1bWVudHR5cGUtb2JqZWN0czoKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3htbC5ldHJlZS5lbGVtZW50dHJlZS5yc3QgYi9Eb2MvbGlicmFyeS94bWwuZXRyZWUuZWxlbWVudHRyZWUucnN0CmluZGV4IDVmYmJmMjAuLmYxNDc0MmUgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3htbC5ldHJlZS5lbGVtZW50dHJlZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkveG1sLmV0cmVlLmVsZW1lbnR0cmVlLnJzdApAQCAtMTYsNiArMTYsMTQgQEAKIGhpZXJhcmNoaWNhbCBkYXRhIHN0cnVjdHVyZXMgaW4gbWVtb3J5LiAgVGhlIHR5cGUgY2FuIGJlIGRlc2NyaWJlZCBhcyBhIGNyb3NzCiBiZXR3ZWVuIGEgbGlzdCBhbmQgYSBkaWN0aW9uYXJ5LgogCisKKy4uIHdhcm5pbmc6OgorCisgICBUaGUgOm1vZDpgeG1sLmV0cmVlLkVsZW1lbnRUcmVlYCBtb2R1bGUgaXMgbm90IHNlY3VyZSBhZ2FpbnN0CisgICBtYWxpY2lvdXNseSBjb25zdHJ1Y3RlZCBkYXRhLiAgSWYgeW91IG5lZWQgdG8gcGFyc2UgdW50cnVzdGVkIG9yCisgICB1bmF1dGhlbnRpY2F0ZWQgZGF0YSBzZWUgOnJlZjpgeG1sLXZ1bG5lcmFiaWxpdGllc2AuCisKKwogRWFjaCBlbGVtZW50IGhhcyBhIG51bWJlciBvZiBwcm9wZXJ0aWVzIGFzc29jaWF0ZWQgd2l0aCBpdDoKIAogKiBhIHRhZyB3aGljaCBpcyBhIHN0cmluZyBpZGVudGlmeWluZyB3aGF0IGtpbmQgb2YgZGF0YSB0aGlzIGVsZW1lbnQgcmVwcmVzZW50cwpAQCAtNDYsMTEgKzU0LDMxNSBAQAogICAgYEludHJvZHVjaW5nIEVsZW1lbnRUcmVlIDEuMwogICAgPGh0dHA6Ly9lZmZib3Qub3JnL3pvbmUvZWxlbWVudHRyZWUtMTMtaW50cm8uaHRtPmBfLgogCitUdXRvcmlhbAorLS0tLS0tLS0KKworVGhpcyBpcyBhIHNob3J0IHR1dG9yaWFsIGZvciB1c2luZyA6bW9kOmB4bWwuZXRyZWUuRWxlbWVudFRyZWVgIChgYEVUYGAgaW4KK3Nob3J0KS4gIFRoZSBnb2FsIGlzIHRvIGRlbW9uc3RyYXRlIHNvbWUgb2YgdGhlIGJ1aWxkaW5nIGJsb2NrcyBhbmQgYmFzaWMKK2NvbmNlcHRzIG9mIHRoZSBtb2R1bGUuCisKK1hNTCB0cmVlIGFuZCBlbGVtZW50cworXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisKK1hNTCBpcyBhbiBpbmhlcmVudGx5IGhpZXJhcmNoaWNhbCBkYXRhIGZvcm1hdCwgYW5kIHRoZSBtb3N0IG5hdHVyYWwgd2F5IHRvCityZXByZXNlbnQgaXQgaXMgd2l0aCBhIHRyZWUuICBgYEVUYGAgaGFzIHR3byBjbGFzc2VzIGZvciB0aGlzIHB1cnBvc2UgLQorOmNsYXNzOmBFbGVtZW50VHJlZWAgcmVwcmVzZW50cyB0aGUgd2hvbGUgWE1MIGRvY3VtZW50IGFzIGEgdHJlZSwgYW5kCis6Y2xhc3M6YEVsZW1lbnRgIHJlcHJlc2VudHMgYSBzaW5nbGUgbm9kZSBpbiB0aGlzIHRyZWUuICBJbnRlcmFjdGlvbnMgd2l0aAordGhlIHdob2xlIGRvY3VtZW50IChyZWFkaW5nIGFuZCB3cml0aW5nIHRvL2Zyb20gZmlsZXMpIGFyZSB1c3VhbGx5IGRvbmUKK29uIHRoZSA6Y2xhc3M6YEVsZW1lbnRUcmVlYCBsZXZlbC4gIEludGVyYWN0aW9ucyB3aXRoIGEgc2luZ2xlIFhNTCBlbGVtZW50CithbmQgaXRzIHN1Yi1lbGVtZW50cyBhcmUgZG9uZSBvbiB0aGUgOmNsYXNzOmBFbGVtZW50YCBsZXZlbC4KKworLi4gX2VsZW1lbnR0cmVlLXBhcnNpbmcteG1sOgorCitQYXJzaW5nIFhNTAorXl5eXl5eXl5eXl4KKworV2UnbGwgYmUgdXNpbmcgdGhlIGZvbGxvd2luZyBYTUwgZG9jdW1lbnQgYXMgdGhlIHNhbXBsZSBkYXRhIGZvciB0aGlzIHNlY3Rpb246CisKKy4uIGNvZGUtYmxvY2s6OiB4bWwKKworICAgPD94bWwgdmVyc2lvbj0iMS4wIj8+CisgICA8ZGF0YT4KKyAgICAgICA8Y291bnRyeSBuYW1lPSJMaWVjaHRlbnN0ZWluIj4KKyAgICAgICAgICAgPHJhbms+MTwvcmFuaz4KKyAgICAgICAgICAgPHllYXI+MjAwODwveWVhcj4KKyAgICAgICAgICAgPGdkcHBjPjE0MTEwMDwvZ2RwcGM+CisgICAgICAgICAgIDxuZWlnaGJvciBuYW1lPSJBdXN0cmlhIiBkaXJlY3Rpb249IkUiLz4KKyAgICAgICAgICAgPG5laWdoYm9yIG5hbWU9IlN3aXR6ZXJsYW5kIiBkaXJlY3Rpb249IlciLz4KKyAgICAgICA8L2NvdW50cnk+CisgICAgICAgPGNvdW50cnkgbmFtZT0iU2luZ2Fwb3JlIj4KKyAgICAgICAgICAgPHJhbms+NDwvcmFuaz4KKyAgICAgICAgICAgPHllYXI+MjAxMTwveWVhcj4KKyAgICAgICAgICAgPGdkcHBjPjU5OTAwPC9nZHBwYz4KKyAgICAgICAgICAgPG5laWdoYm9yIG5hbWU9Ik1hbGF5c2lhIiBkaXJlY3Rpb249Ik4iLz4KKyAgICAgICA8L2NvdW50cnk+CisgICAgICAgPGNvdW50cnkgbmFtZT0iUGFuYW1hIj4KKyAgICAgICAgICAgPHJhbms+Njg8L3Jhbms+CisgICAgICAgICAgIDx5ZWFyPjIwMTE8L3llYXI+CisgICAgICAgICAgIDxnZHBwYz4xMzYwMDwvZ2RwcGM+CisgICAgICAgICAgIDxuZWlnaGJvciBuYW1lPSJDb3N0YSBSaWNhIiBkaXJlY3Rpb249IlciLz4KKyAgICAgICAgICAgPG5laWdoYm9yIG5hbWU9IkNvbG9tYmlhIiBkaXJlY3Rpb249IkUiLz4KKyAgICAgICA8L2NvdW50cnk+CisgICA8L2RhdGE+CisKK1dlIGhhdmUgYSBudW1iZXIgb2Ygd2F5cyB0byBpbXBvcnQgdGhlIGRhdGEuICBSZWFkaW5nIHRoZSBmaWxlIGZyb20gZGlzazo6CisKKyAgIGltcG9ydCB4bWwuZXRyZWUuRWxlbWVudFRyZWUgYXMgRVQKKyAgIHRyZWUgPSBFVC5wYXJzZSgnY291bnRyeV9kYXRhLnhtbCcpCisgICByb290ID0gdHJlZS5nZXRyb290KCkKKworUmVhZGluZyB0aGUgZGF0YSBmcm9tIGEgc3RyaW5nOjoKKworICAgcm9vdCA9IEVULmZyb21zdHJpbmcoY291bnRyeV9kYXRhX2FzX3N0cmluZykKKworOmZ1bmM6YGZyb21zdHJpbmdgIHBhcnNlcyBYTUwgZnJvbSBhIHN0cmluZyBkaXJlY3RseSBpbnRvIGFuIDpjbGFzczpgRWxlbWVudGAsCit3aGljaCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBwYXJzZWQgdHJlZS4gIE90aGVyIHBhcnNpbmcgZnVuY3Rpb25zIG1heQorY3JlYXRlIGFuIDpjbGFzczpgRWxlbWVudFRyZWVgLiAgQ2hlY2sgdGhlIGRvY3VtZW50YXRpb24gdG8gYmUgc3VyZS4KKworQXMgYW4gOmNsYXNzOmBFbGVtZW50YCwgYGByb290YGAgaGFzIGEgdGFnIGFuZCBhIGRpY3Rpb25hcnkgb2YgYXR0cmlidXRlczo6CisKKyAgID4+PiByb290LnRhZworICAgJ2RhdGEnCisgICA+Pj4gcm9vdC5hdHRyaWIKKyAgIHt9CisKK0l0IGFsc28gaGFzIGNoaWxkcmVuIG5vZGVzIG92ZXIgd2hpY2ggd2UgY2FuIGl0ZXJhdGU6OgorCisgICA+Pj4gZm9yIGNoaWxkIGluIHJvb3Q6CisgICAuLi4gICBwcmludCBjaGlsZC50YWcsIGNoaWxkLmF0dHJpYgorICAgLi4uCisgICBjb3VudHJ5IHsnbmFtZSc6ICdMaWVjaHRlbnN0ZWluJ30KKyAgIGNvdW50cnkgeyduYW1lJzogJ1NpbmdhcG9yZSd9CisgICBjb3VudHJ5IHsnbmFtZSc6ICdQYW5hbWEnfQorCitDaGlsZHJlbiBhcmUgbmVzdGVkLCBhbmQgd2UgY2FuIGFjY2VzcyBzcGVjaWZpYyBjaGlsZCBub2RlcyBieSBpbmRleDo6CisKKyAgID4+PiByb290WzBdWzFdLnRleHQKKyAgICcyMDA4JworCitGaW5kaW5nIGludGVyZXN0aW5nIGVsZW1lbnRzCiteXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisKKzpjbGFzczpgRWxlbWVudGAgaGFzIHNvbWUgdXNlZnVsIG1ldGhvZHMgdGhhdCBoZWxwIGl0ZXJhdGUgcmVjdXJzaXZlbHkgb3ZlciBhbGwKK3RoZSBzdWItdHJlZSBiZWxvdyBpdCAoaXRzIGNoaWxkcmVuLCB0aGVpciBjaGlsZHJlbiwgYW5kIHNvIG9uKS4gIEZvciBleGFtcGxlLAorOm1ldGg6YEVsZW1lbnQuaXRlcmA6OgorCisgICA+Pj4gZm9yIG5laWdoYm9yIGluIHJvb3QuaXRlcignbmVpZ2hib3InKToKKyAgIC4uLiAgIHByaW50IG5laWdoYm9yLmF0dHJpYgorICAgLi4uCisgICB7J25hbWUnOiAnQXVzdHJpYScsICdkaXJlY3Rpb24nOiAnRSd9CisgICB7J25hbWUnOiAnU3dpdHplcmxhbmQnLCAnZGlyZWN0aW9uJzogJ1cnfQorICAgeyduYW1lJzogJ01hbGF5c2lhJywgJ2RpcmVjdGlvbic6ICdOJ30KKyAgIHsnbmFtZSc6ICdDb3N0YSBSaWNhJywgJ2RpcmVjdGlvbic6ICdXJ30KKyAgIHsnbmFtZSc6ICdDb2xvbWJpYScsICdkaXJlY3Rpb24nOiAnRSd9CisKKzptZXRoOmBFbGVtZW50LmZpbmRhbGxgIGZpbmRzIG9ubHkgZWxlbWVudHMgd2l0aCBhIHRhZyB3aGljaCBhcmUgZGlyZWN0CitjaGlsZHJlbiBvZiB0aGUgY3VycmVudCBlbGVtZW50LiAgOm1ldGg6YEVsZW1lbnQuZmluZGAgZmluZHMgdGhlICpmaXJzdCogY2hpbGQKK3dpdGggYSBwYXJ0aWN1bGFyIHRhZywgYW5kIDphdHRyOmBFbGVtZW50LnRleHRgIGFjY2Vzc2VzIHRoZSBlbGVtZW50J3MgdGV4dAorY29udGVudC4gIDptZXRoOmBFbGVtZW50LmdldGAgYWNjZXNzZXMgdGhlIGVsZW1lbnQncyBhdHRyaWJ1dGVzOjoKKworICAgPj4+IGZvciBjb3VudHJ5IGluIHJvb3QuZmluZGFsbCgnY291bnRyeScpOgorICAgLi4uICAgcmFuayA9IGNvdW50cnkuZmluZCgncmFuaycpLnRleHQKKyAgIC4uLiAgIG5hbWUgPSBjb3VudHJ5LmdldCgnbmFtZScpCisgICAuLi4gICBwcmludCBuYW1lLCByYW5rCisgICAuLi4KKyAgIExpZWNodGVuc3RlaW4gMQorICAgU2luZ2Fwb3JlIDQKKyAgIFBhbmFtYSA2OAorCitNb3JlIHNvcGhpc3RpY2F0ZWQgc3BlY2lmaWNhdGlvbiBvZiB3aGljaCBlbGVtZW50cyB0byBsb29rIGZvciBpcyBwb3NzaWJsZSBieQordXNpbmcgOnJlZjpgWFBhdGggPGVsZW1lbnR0cmVlLXhwYXRoPmAuCisKK01vZGlmeWluZyBhbiBYTUwgRmlsZQorXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisKKzpjbGFzczpgRWxlbWVudFRyZWVgIHByb3ZpZGVzIGEgc2ltcGxlIHdheSB0byBidWlsZCBYTUwgZG9jdW1lbnRzIGFuZCB3cml0ZSB0aGVtIHRvIGZpbGVzLgorVGhlIDptZXRoOmBFbGVtZW50VHJlZS53cml0ZWAgbWV0aG9kIHNlcnZlcyB0aGlzIHB1cnBvc2UuCisKK09uY2UgY3JlYXRlZCwgYW4gOmNsYXNzOmBFbGVtZW50YCBvYmplY3QgbWF5IGJlIG1hbmlwdWxhdGVkIGJ5IGRpcmVjdGx5IGNoYW5naW5nCitpdHMgZmllbGRzIChzdWNoIGFzIDphdHRyOmBFbGVtZW50LnRleHRgKSwgYWRkaW5nIGFuZCBtb2RpZnlpbmcgYXR0cmlidXRlcworKDptZXRoOmBFbGVtZW50LnNldGAgbWV0aG9kKSwgYXMgd2VsbCBhcyBhZGRpbmcgbmV3IGNoaWxkcmVuIChmb3IgZXhhbXBsZQord2l0aCA6bWV0aDpgRWxlbWVudC5hcHBlbmRgKS4KKworTGV0J3Mgc2F5IHdlIHdhbnQgdG8gYWRkIG9uZSB0byBlYWNoIGNvdW50cnkncyByYW5rLCBhbmQgYWRkIGFuIGBgdXBkYXRlZGBgCithdHRyaWJ1dGUgdG8gdGhlIHJhbmsgZWxlbWVudDo6CisKKyAgID4+PiBmb3IgcmFuayBpbiByb290Lml0ZXIoJ3JhbmsnKToKKyAgIC4uLiAgIG5ld19yYW5rID0gaW50KHJhbmsudGV4dCkgKyAxCisgICAuLi4gICByYW5rLnRleHQgPSBzdHIobmV3X3JhbmspCisgICAuLi4gICByYW5rLnNldCgndXBkYXRlZCcsICd5ZXMnKQorICAgLi4uCisgICA+Pj4gdHJlZS53cml0ZSgnb3V0cHV0LnhtbCcpCisKK091ciBYTUwgbm93IGxvb2tzIGxpa2UgdGhpczoKKworLi4gY29kZS1ibG9jazo6IHhtbAorCisgICA8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKyAgIDxkYXRhPgorICAgICAgIDxjb3VudHJ5IG5hbWU9IkxpZWNodGVuc3RlaW4iPgorICAgICAgICAgICA8cmFuayB1cGRhdGVkPSJ5ZXMiPjI8L3Jhbms+CisgICAgICAgICAgIDx5ZWFyPjIwMDg8L3llYXI+CisgICAgICAgICAgIDxnZHBwYz4xNDExMDA8L2dkcHBjPgorICAgICAgICAgICA8bmVpZ2hib3IgbmFtZT0iQXVzdHJpYSIgZGlyZWN0aW9uPSJFIi8+CisgICAgICAgICAgIDxuZWlnaGJvciBuYW1lPSJTd2l0emVybGFuZCIgZGlyZWN0aW9uPSJXIi8+CisgICAgICAgPC9jb3VudHJ5PgorICAgICAgIDxjb3VudHJ5IG5hbWU9IlNpbmdhcG9yZSI+CisgICAgICAgICAgIDxyYW5rIHVwZGF0ZWQ9InllcyI+NTwvcmFuaz4KKyAgICAgICAgICAgPHllYXI+MjAxMTwveWVhcj4KKyAgICAgICAgICAgPGdkcHBjPjU5OTAwPC9nZHBwYz4KKyAgICAgICAgICAgPG5laWdoYm9yIG5hbWU9Ik1hbGF5c2lhIiBkaXJlY3Rpb249Ik4iLz4KKyAgICAgICA8L2NvdW50cnk+CisgICAgICAgPGNvdW50cnkgbmFtZT0iUGFuYW1hIj4KKyAgICAgICAgICAgPHJhbmsgdXBkYXRlZD0ieWVzIj42OTwvcmFuaz4KKyAgICAgICAgICAgPHllYXI+MjAxMTwveWVhcj4KKyAgICAgICAgICAgPGdkcHBjPjEzNjAwPC9nZHBwYz4KKyAgICAgICAgICAgPG5laWdoYm9yIG5hbWU9IkNvc3RhIFJpY2EiIGRpcmVjdGlvbj0iVyIvPgorICAgICAgICAgICA8bmVpZ2hib3IgbmFtZT0iQ29sb21iaWEiIGRpcmVjdGlvbj0iRSIvPgorICAgICAgIDwvY291bnRyeT4KKyAgIDwvZGF0YT4KKworV2UgY2FuIHJlbW92ZSBlbGVtZW50cyB1c2luZyA6bWV0aDpgRWxlbWVudC5yZW1vdmVgLiAgTGV0J3Mgc2F5IHdlIHdhbnQgdG8KK3JlbW92ZSBhbGwgY291bnRyaWVzIHdpdGggYSByYW5rIGhpZ2hlciB0aGFuIDUwOjoKKworICAgPj4+IGZvciBjb3VudHJ5IGluIHJvb3QuZmluZGFsbCgnY291bnRyeScpOgorICAgLi4uICAgcmFuayA9IGludChjb3VudHJ5LmZpbmQoJ3JhbmsnKS50ZXh0KQorICAgLi4uICAgaWYgcmFuayA+IDUwOgorICAgLi4uICAgICByb290LnJlbW92ZShjb3VudHJ5KQorICAgLi4uCisgICA+Pj4gdHJlZS53cml0ZSgnb3V0cHV0LnhtbCcpCisKK091ciBYTUwgbm93IGxvb2tzIGxpa2UgdGhpczoKKworLi4gY29kZS1ibG9jazo6IHhtbAorCisgICA8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKyAgIDxkYXRhPgorICAgICAgIDxjb3VudHJ5IG5hbWU9IkxpZWNodGVuc3RlaW4iPgorICAgICAgICAgICA8cmFuayB1cGRhdGVkPSJ5ZXMiPjI8L3Jhbms+CisgICAgICAgICAgIDx5ZWFyPjIwMDg8L3llYXI+CisgICAgICAgICAgIDxnZHBwYz4xNDExMDA8L2dkcHBjPgorICAgICAgICAgICA8bmVpZ2hib3IgbmFtZT0iQXVzdHJpYSIgZGlyZWN0aW9uPSJFIi8+CisgICAgICAgICAgIDxuZWlnaGJvciBuYW1lPSJTd2l0emVybGFuZCIgZGlyZWN0aW9uPSJXIi8+CisgICAgICAgPC9jb3VudHJ5PgorICAgICAgIDxjb3VudHJ5IG5hbWU9IlNpbmdhcG9yZSI+CisgICAgICAgICAgIDxyYW5rIHVwZGF0ZWQ9InllcyI+NTwvcmFuaz4KKyAgICAgICAgICAgPHllYXI+MjAxMTwveWVhcj4KKyAgICAgICAgICAgPGdkcHBjPjU5OTAwPC9nZHBwYz4KKyAgICAgICAgICAgPG5laWdoYm9yIG5hbWU9Ik1hbGF5c2lhIiBkaXJlY3Rpb249Ik4iLz4KKyAgICAgICA8L2NvdW50cnk+CisgICA8L2RhdGE+CisKK0J1aWxkaW5nIFhNTCBkb2N1bWVudHMKK15eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKworVGhlIDpmdW5jOmBTdWJFbGVtZW50YCBmdW5jdGlvbiBhbHNvIHByb3ZpZGVzIGEgY29udmVuaWVudCB3YXkgdG8gY3JlYXRlIG5ldworc3ViLWVsZW1lbnRzIGZvciBhIGdpdmVuIGVsZW1lbnQ6OgorCisgICA+Pj4gYSA9IEVULkVsZW1lbnQoJ2EnKQorICAgPj4+IGIgPSBFVC5TdWJFbGVtZW50KGEsICdiJykKKyAgID4+PiBjID0gRVQuU3ViRWxlbWVudChhLCAnYycpCisgICA+Pj4gZCA9IEVULlN1YkVsZW1lbnQoYywgJ2QnKQorICAgPj4+IEVULmR1bXAoYSkKKyAgIDxhPjxiIC8+PGM+PGQgLz48L2M+PC9hPgorCitBZGRpdGlvbmFsIHJlc291cmNlcworXl5eXl5eXl5eXl5eXl5eXl5eXl4KKworU2VlIGh0dHA6Ly9lZmZib3Qub3JnL3pvbmUvZWxlbWVudC1pbmRleC5odG0gZm9yIHR1dG9yaWFscyBhbmQgbGlua3MgdG8gb3RoZXIKK2RvY3MuCisKKy4uIF9lbGVtZW50dHJlZS14cGF0aDoKKworWFBhdGggc3VwcG9ydAorLS0tLS0tLS0tLS0tLQorCitUaGlzIG1vZHVsZSBwcm92aWRlcyBsaW1pdGVkIHN1cHBvcnQgZm9yCitgWFBhdGggZXhwcmVzc2lvbnMgPGh0dHA6Ly93d3cudzMub3JnL1RSL3hwYXRoPmBfIGZvciBsb2NhdGluZyBlbGVtZW50cyBpbiBhCit0cmVlLiAgVGhlIGdvYWwgaXMgdG8gc3VwcG9ydCBhIHNtYWxsIHN1YnNldCBvZiB0aGUgYWJicmV2aWF0ZWQgc3ludGF4OyBhIGZ1bGwKK1hQYXRoIGVuZ2luZSBpcyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGUgbW9kdWxlLgorCitFeGFtcGxlCiteXl5eXl5eCisKK0hlcmUncyBhbiBleGFtcGxlIHRoYXQgZGVtb25zdHJhdGVzIHNvbWUgb2YgdGhlIFhQYXRoIGNhcGFiaWxpdGllcyBvZiB0aGUKK21vZHVsZS4gIFdlJ2xsIGJlIHVzaW5nIHRoZSBgYGNvdW50cnlkYXRhYGAgWE1MIGRvY3VtZW50IGZyb20gdGhlCis6cmVmOmBQYXJzaW5nIFhNTCA8ZWxlbWVudHRyZWUtcGFyc2luZy14bWw+YCBzZWN0aW9uOjoKKworICAgaW1wb3J0IHhtbC5ldHJlZS5FbGVtZW50VHJlZSBhcyBFVAorCisgICByb290ID0gRVQuZnJvbXN0cmluZyhjb3VudHJ5ZGF0YSkKKworICAgIyBUb3AtbGV2ZWwgZWxlbWVudHMKKyAgIHJvb3QuZmluZGFsbCgiLiIpCisKKyAgICMgQWxsICduZWlnaGJvcicgZ3JhbmQtY2hpbGRyZW4gb2YgJ2NvdW50cnknIGNoaWxkcmVuIG9mIHRoZSB0b3AtbGV2ZWwKKyAgICMgZWxlbWVudHMKKyAgIHJvb3QuZmluZGFsbCgiLi9jb3VudHJ5L25laWdoYm9yIikKKworICAgIyBOb2RlcyB3aXRoIG5hbWU9J1NpbmdhcG9yZScgdGhhdCBoYXZlIGEgJ3llYXInIGNoaWxkCisgICByb290LmZpbmRhbGwoIi4vL3llYXIvLi5bQG5hbWU9J1NpbmdhcG9yZSddIikKKworICAgIyAneWVhcicgbm9kZXMgdGhhdCBhcmUgY2hpbGRyZW4gb2Ygbm9kZXMgd2l0aCBuYW1lPSdTaW5nYXBvcmUnCisgICByb290LmZpbmRhbGwoIi4vLypbQG5hbWU9J1NpbmdhcG9yZSddL3llYXIiKQorCisgICAjIEFsbCAnbmVpZ2hib3InIG5vZGVzIHRoYXQgYXJlIHRoZSBzZWNvbmQgY2hpbGQgb2YgdGhlaXIgcGFyZW50CisgICByb290LmZpbmRhbGwoIi4vL25laWdoYm9yWzJdIikKKworU3VwcG9ydGVkIFhQYXRoIHN5bnRheAorXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorCisuLiB0YWJ1bGFyY29sdW1uczo6IHxsfEx8CisKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8IFN5bnRheCAgICAgICAgICAgICAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKz09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKK3wgYGB0YWdgYCAgICAgICAgICAgICAgIHwgU2VsZWN0cyBhbGwgY2hpbGQgZWxlbWVudHMgd2l0aCB0aGUgZ2l2ZW4gdGFnLiAgICAgICB8Cit8ICAgICAgICAgICAgICAgICAgICAgICB8IEZvciBleGFtcGxlLCBgYHNwYW1gYCBzZWxlY3RzIGFsbCBjaGlsZCBlbGVtZW50cyAgICAgfAorfCAgICAgICAgICAgICAgICAgICAgICAgfCBuYW1lZCBgYHNwYW1gYCwgYW5kIGBgc3BhbS9lZ2dgYCBzZWxlY3RzIGFsbCAgICAgICAgIHwKK3wgICAgICAgICAgICAgICAgICAgICAgIHwgZ3JhbmRjaGlsZHJlbiBuYW1lZCBgYGVnZ2BgIGluIGFsbCBjaGlsZHJlbiBuYW1lZCAgICB8Cit8ICAgICAgICAgICAgICAgICAgICAgICB8IGBgc3BhbWBgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgYGAqYGAgICAgICAgICAgICAgICAgIHwgU2VsZWN0cyBhbGwgY2hpbGQgZWxlbWVudHMuICBGb3IgZXhhbXBsZSwgYGAqL2VnZ2BgICB8Cit8ICAgICAgICAgICAgICAgICAgICAgICB8IHNlbGVjdHMgYWxsIGdyYW5kY2hpbGRyZW4gbmFtZWQgYGBlZ2dgYC4gICAgICAgICAgICAgfAorKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgYGAuYGAgICAgICAgICAgICAgICAgIHwgU2VsZWN0cyB0aGUgY3VycmVudCBub2RlLiAgVGhpcyBpcyBtb3N0bHkgdXNlZnVsICAgICB8Cit8ICAgICAgICAgICAgICAgICAgICAgICB8IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhdGgsIHRvIGluZGljYXRlIHRoYXQgaXQncyAgfAorfCAgICAgICAgICAgICAgICAgICAgICAgfCBhIHJlbGF0aXZlIHBhdGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8IGBgLy9gYCAgICAgICAgICAgICAgICB8IFNlbGVjdHMgYWxsIHN1YmVsZW1lbnRzLCBvbiBhbGwgbGV2ZWxzIGJlbmVhdGggdGhlICAgfAorfCAgICAgICAgICAgICAgICAgICAgICAgfCBjdXJyZW50ICBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIGBgLi8vZWdnYGAgc2VsZWN0cyAgIHwKK3wgICAgICAgICAgICAgICAgICAgICAgIHwgYWxsIGBgZWdnYGAgZWxlbWVudHMgaW4gdGhlIGVudGlyZSB0cmVlLiAgICAgICAgICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfCBgYC4uYGAgICAgICAgICAgICAgICAgfCBTZWxlY3RzIHRoZSBwYXJlbnQgZWxlbWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8IGBgW0BhdHRyaWJdYGAgICAgICAgICB8IFNlbGVjdHMgYWxsIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgZ2l2ZW4gYXR0cmlidXRlLiAgfAorKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgYGBbQGF0dHJpYj0ndmFsdWUnXWBgIHwgU2VsZWN0cyBhbGwgZWxlbWVudHMgZm9yIHdoaWNoIHRoZSBnaXZlbiBhdHRyaWJ1dGUgICB8Cit8ICAgICAgICAgICAgICAgICAgICAgICB8IGhhcyB0aGUgZ2l2ZW4gdmFsdWUuICBUaGUgdmFsdWUgY2Fubm90IGNvbnRhaW4gICAgICAgfAorfCAgICAgICAgICAgICAgICAgICAgICAgfCBxdW90ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8IGBgW3RhZ11gYCAgICAgICAgICAgICB8IFNlbGVjdHMgYWxsIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIGNoaWxkIG5hbWVkICAgICAgICAgfAorfCAgICAgICAgICAgICAgICAgICAgICAgfCBgYHRhZ2BgLiAgT25seSBpbW1lZGlhdGUgY2hpbGRyZW4gYXJlIHN1cHBvcnRlZC4gICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8IGBgW3Bvc2l0aW9uXWBgICAgICAgICB8IFNlbGVjdHMgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGxvY2F0ZWQgYXQgdGhlIGdpdmVuICAgfAorfCAgICAgICAgICAgICAgICAgICAgICAgfCBwb3NpdGlvbi4gIFRoZSBwb3NpdGlvbiBjYW4gYmUgZWl0aGVyIGFuIGludGVnZXIgICAgIHwKK3wgICAgICAgICAgICAgICAgICAgICAgIHwgKDEgaXMgdGhlIGZpcnN0IHBvc2l0aW9uKSwgdGhlIGV4cHJlc3Npb24gYGBsYXN0KClgYCB8Cit8ICAgICAgICAgICAgICAgICAgICAgICB8IChmb3IgdGhlIGxhc3QgcG9zaXRpb24pLCBvciBhIHBvc2l0aW9uIHJlbGF0aXZlIHRvICAgfAorfCAgICAgICAgICAgICAgICAgICAgICAgfCB0aGUgbGFzdCBwb3NpdGlvbiAoZS5nLiBgYGxhc3QoKS0xYGApLiAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisKK1ByZWRpY2F0ZXMgKGV4cHJlc3Npb25zIHdpdGhpbiBzcXVhcmUgYnJhY2tldHMpIG11c3QgYmUgcHJlY2VkZWQgYnkgYSB0YWcKK25hbWUsIGFuIGFzdGVyaXNrLCBvciBhbm90aGVyIHByZWRpY2F0ZS4gIGBgcG9zaXRpb25gYCBwcmVkaWNhdGVzIG11c3QgYmUKK3ByZWNlZGVkIGJ5IGEgdGFnIG5hbWUuCisKK1JlZmVyZW5jZQorLS0tLS0tLS0tCiAKIC4uIF9lbGVtZW50dHJlZS1mdW5jdGlvbnM6CiAKIEZ1bmN0aW9ucwotLS0tLS0tLS0tCiteXl5eXl5eXl4KIAogCiAuLiBmdW5jdGlvbjo6IENvbW1lbnQodGV4dD1Ob25lKQpAQCAtMTAxLDggKzQxMyw5IEBACiAgICBnb2luZyBvbiB0byB0aGUgdXNlci4gICpzb3VyY2UqIGlzIGEgZmlsZW5hbWUgb3IgZmlsZSBvYmplY3QgY29udGFpbmluZyBYTUwKICAgIGRhdGEuICAqZXZlbnRzKiBpcyBhIGxpc3Qgb2YgZXZlbnRzIHRvIHJlcG9ydCBiYWNrLiAgSWYgb21pdHRlZCwgb25seSAiZW5kIgogICAgZXZlbnRzIGFyZSByZXBvcnRlZC4gICpwYXJzZXIqIGlzIGFuIG9wdGlvbmFsIHBhcnNlciBpbnN0YW5jZS4gIElmIG5vdAotICAgZ2l2ZW4sIHRoZSBzdGFuZGFyZCA6Y2xhc3M6YFhNTFBhcnNlcmAgcGFyc2VyIGlzIHVzZWQuICBSZXR1cm5zIGFuCi0gICA6dGVybTpgaXRlcmF0b3JgIHByb3ZpZGluZyBgYChldmVudCwgZWxlbSlgYCBwYWlycy4KKyAgIGdpdmVuLCB0aGUgc3RhbmRhcmQgOmNsYXNzOmBYTUxQYXJzZXJgIHBhcnNlciBpcyB1c2VkLiAgKnBhcnNlciogaXMgbm90CisgICBzdXBwb3J0ZWQgYnkgYGBjRWxlbWVudFRyZWVgYC4gUmV0dXJucyBhbiA6dGVybTpgaXRlcmF0b3JgIHByb3ZpZGluZworICAgYGAoZXZlbnQsIGVsZW0pYGAgcGFpcnMuCiAKICAgIC4uIG5vdGU6OgogCkBAIC0xOTYsOCArNTA5LDcgQEAKIC4uIF9lbGVtZW50dHJlZS1lbGVtZW50LW9iamVjdHM6CiAKIEVsZW1lbnQgT2JqZWN0cwotLS0tLS0tLS0tLS0tLS0tCi0KK15eXl5eXl5eXl5eXl5eXgogCiAuLiBjbGFzczo6IEVsZW1lbnQodGFnLCBhdHRyaWI9e30sICoqZXh0cmEpCiAKQEAgLTM2OCw4ICs2ODAsOSBAQAogICAgICAgb3IgY29udGVudHMuCiAKICAgIDpjbGFzczpgRWxlbWVudGAgb2JqZWN0cyBhbHNvIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZSB0eXBlIG1ldGhvZHMKLSAgIGZvciB3b3JraW5nIHdpdGggc3ViZWxlbWVudHM6IDptZXRoOmBfX2RlbGl0ZW1fX2AsIDptZXRoOmBfX2dldGl0ZW1fX2AsCi0gICA6bWV0aDpgX19zZXRpdGVtX19gLCA6bWV0aDpgX19sZW5fX2AuCisgICBmb3Igd29ya2luZyB3aXRoIHN1YmVsZW1lbnRzOiA6bWV0aDpgfm9iamVjdC5fX2RlbGl0ZW1fX2AsCisgICA6bWV0aDpgfm9iamVjdC5fX2dldGl0ZW1fX2AsIDptZXRoOmB+b2JqZWN0Ll9fc2V0aXRlbV9fYCwKKyAgIDptZXRoOmB+b2JqZWN0Ll9fbGVuX19gLgogCiAgICBDYXV0aW9uOiBFbGVtZW50cyB3aXRoIG5vIHN1YmVsZW1lbnRzIHdpbGwgdGVzdCBhcyBgYEZhbHNlYGAuICBUaGlzIGJlaGF2aW9yCiAgICB3aWxsIGNoYW5nZSBpbiBmdXR1cmUgdmVyc2lvbnMuICBVc2Ugc3BlY2lmaWMgYGBsZW4oZWxlbSlgYCBvciBgYGVsZW0gaXMKQEAgLTM4Nyw3ICs3MDAsNyBAQAogLi4gX2VsZW1lbnR0cmVlLWVsZW1lbnR0cmVlLW9iamVjdHM6CiAKIEVsZW1lbnRUcmVlIE9iamVjdHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0KK15eXl5eXl5eXl5eXl5eXl5eXl4KIAogCiAuLiBjbGFzczo6IEVsZW1lbnRUcmVlKGVsZW1lbnQ9Tm9uZSwgZmlsZT1Ob25lKQpAQCAtNDA5LDI2ICs3MjIsMTcgQEAKIAogICAgLi4gbWV0aG9kOjogZmluZChtYXRjaCkKIAotICAgICAgRmluZHMgdGhlIGZpcnN0IHRvcGxldmVsIGVsZW1lbnQgbWF0Y2hpbmcgKm1hdGNoKi4gICptYXRjaCogbWF5IGJlIGEgdGFnCi0gICAgICBuYW1lIG9yIHBhdGguICBTYW1lIGFzIGdldHJvb3QoKS5maW5kKG1hdGNoKS4gIFJldHVybnMgdGhlIGZpcnN0IG1hdGNoaW5nCi0gICAgICBlbGVtZW50LCBvciBgYE5vbmVgYCBpZiBubyBlbGVtZW50IHdhcyBmb3VuZC4KKyAgICAgIFNhbWUgYXMgOm1ldGg6YEVsZW1lbnQuZmluZGAsIHN0YXJ0aW5nIGF0IHRoZSByb290IG9mIHRoZSB0cmVlLgogCiAKICAgIC4uIG1ldGhvZDo6IGZpbmRhbGwobWF0Y2gpCiAKLSAgICAgIEZpbmRzIGFsbCBtYXRjaGluZyBzdWJlbGVtZW50cywgYnkgdGFnIG5hbWUgb3IgcGF0aC4gIFNhbWUgYXMKLSAgICAgIGdldHJvb3QoKS5maW5kYWxsKG1hdGNoKS4gICptYXRjaCogbWF5IGJlIGEgdGFnIG5hbWUgb3IgcGF0aC4gIFJldHVybnMgYQotICAgICAgbGlzdCBjb250YWluaW5nIGFsbCBtYXRjaGluZyBlbGVtZW50cywgaW4gZG9jdW1lbnQgb3JkZXIuCisgICAgICBTYW1lIGFzIDptZXRoOmBFbGVtZW50LmZpbmRhbGxgLCBzdGFydGluZyBhdCB0aGUgcm9vdCBvZiB0aGUgdHJlZS4KIAogCiAgICAuLiBtZXRob2Q6OiBmaW5kdGV4dChtYXRjaCwgZGVmYXVsdD1Ob25lKQogCi0gICAgICBGaW5kcyB0aGUgZWxlbWVudCB0ZXh0IGZvciB0aGUgZmlyc3QgdG9wbGV2ZWwgZWxlbWVudCB3aXRoIGdpdmVuIHRhZy4KLSAgICAgIFNhbWUgYXMgZ2V0cm9vdCgpLmZpbmR0ZXh0KG1hdGNoKS4gICptYXRjaCogbWF5IGJlIGEgdGFnIG5hbWUgb3IgcGF0aC4KLSAgICAgICpkZWZhdWx0KiBpcyB0aGUgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZSBlbGVtZW50IHdhcyBub3QgZm91bmQuICBSZXR1cm5zCi0gICAgICB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50LCBvciB0aGUgZGVmYXVsdCB2YWx1ZSBubwotICAgICAgZWxlbWVudCB3YXMgZm91bmQuICBOb3RlIHRoYXQgaWYgdGhlIGVsZW1lbnQgaXMgZm91bmQsIGJ1dCBoYXMgbm8gdGV4dAotICAgICAgY29udGVudCwgdGhpcyBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuCisgICAgICBTYW1lIGFzIDptZXRoOmBFbGVtZW50LmZpbmR0ZXh0YCwgc3RhcnRpbmcgYXQgdGhlIHJvb3Qgb2YgdGhlIHRyZWUuCiAKIAogICAgLi4gbWV0aG9kOjogZ2V0aXRlcmF0b3IodGFnPU5vbmUpCkBAIC00NjYsMTMgKzc3MCwxNSBAQAogICAgICAgcm9vdCBlbGVtZW50LgogCiAKLSAgIC4uIG1ldGhvZDo6IHdyaXRlKGZpbGUsIGVuY29kaW5nPSJ1cy1hc2NpaSIsIHhtbF9kZWNsYXJhdGlvbj1Ob25lLCBtZXRob2Q9InhtbCIpCisgICAuLiBtZXRob2Q6OiB3cml0ZShmaWxlLCBlbmNvZGluZz0idXMtYXNjaWkiLCB4bWxfZGVjbGFyYXRpb249Tm9uZSwgXAorICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9uYW1lc3BhY2U9Tm9uZSwgbWV0aG9kPSJ4bWwiKQogCiAgICAgICBXcml0ZXMgdGhlIGVsZW1lbnQgdHJlZSB0byBhIGZpbGUsIGFzIFhNTC4gICpmaWxlKiBpcyBhIGZpbGUgbmFtZSwgb3IgYQogICAgICAgZmlsZSBvYmplY3Qgb3BlbmVkIGZvciB3cml0aW5nLiAgKmVuY29kaW5nKiBbMV1fIGlzIHRoZSBvdXRwdXQgZW5jb2RpbmcKICAgICAgIChkZWZhdWx0IGlzIFVTLUFTQ0lJKS4gICp4bWxfZGVjbGFyYXRpb24qIGNvbnRyb2xzIGlmIGFuIFhNTCBkZWNsYXJhdGlvbgogICAgICAgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBmaWxlLiAgVXNlIEZhbHNlIGZvciBuZXZlciwgVHJ1ZSBmb3IgYWx3YXlzLCBOb25lCi0gICAgICBmb3Igb25seSBpZiBub3QgVVMtQVNDSUkgb3IgVVRGLTggKGRlZmF1bHQgaXMgTm9uZSkuICAqbWV0aG9kKiBpcyBlaXRoZXIKKyAgICAgIGZvciBvbmx5IGlmIG5vdCBVUy1BU0NJSSBvciBVVEYtOCAoZGVmYXVsdCBpcyBOb25lKS4gICpkZWZhdWx0X25hbWVzcGFjZSoKKyAgICAgIHNldHMgdGhlIGRlZmF1bHQgWE1MIG5hbWVzcGFjZSAoZm9yICJ4bWxucyIpLiAgKm1ldGhvZCogaXMgZWl0aGVyCiAgICAgICBgYCJ4bWwiYGAsIGBgImh0bWwiYGAgb3IgYGAidGV4dCJgYCAoZGVmYXVsdCBpcyBgYCJ4bWwiYGApLiAgUmV0dXJucyBhbgogICAgICAgZW5jb2RlZCBzdHJpbmcuCiAKQEAgLTUwNyw3ICs4MTMsNyBAQAogLi4gX2VsZW1lbnR0cmVlLXFuYW1lLW9iamVjdHM6CiAKIFFOYW1lIE9iamVjdHMKLS0tLS0tLS0tLS0tLS0KK15eXl5eXl5eXl5eXl4KIAogCiAuLiBjbGFzczo6IFFOYW1lKHRleHRfb3JfdXJpLCB0YWc9Tm9uZSkKQEAgLTUyMyw3ICs4MjksNyBAQAogLi4gX2VsZW1lbnR0cmVlLXRyZWVidWlsZGVyLW9iamVjdHM6CiAKIFRyZWVCdWlsZGVyIE9iamVjdHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0KK15eXl5eXl5eXl5eXl5eXl5eXl4KIAogCiAuLiBjbGFzczo6IFRyZWVCdWlsZGVyKGVsZW1lbnRfZmFjdG9yeT1Ob25lKQpAQCAtNTc0LDcgKzg4MCw3IEBACiAuLiBfZWxlbWVudHRyZWUteG1scGFyc2VyLW9iamVjdHM6CiAKIFhNTFBhcnNlciBPYmplY3RzCi0tLS0tLS0tLS0tLS0tLS0tLQorXl5eXl5eXl5eXl5eXl5eXl4KIAogCiAuLiBjbGFzczo6IFhNTFBhcnNlcihodG1sPTAsIHRhcmdldD1Ob25lLCBlbmNvZGluZz1Ob25lKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkveG1sLnJzdCBiL0RvYy9saWJyYXJ5L3htbC5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU2ZWIyYwotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9saWJyYXJ5L3htbC5yc3QKQEAgLTAsMCArMSwxMzYgQEAKKy4uIF94bWw6CisKK1hNTCBQcm9jZXNzaW5nIE1vZHVsZXMKKz09PT09PT09PT09PT09PT09PT09PT0KKworLi4gbW9kdWxlOjogeG1sCisgICA6c3lub3BzaXM6IFBhY2thZ2UgY29udGFpbmluZyBYTUwgcHJvY2Vzc2luZyBtb2R1bGVzCisuLiBzZWN0aW9uYXV0aG9yOjogQ2hyaXN0aWFuIEhlaW1lcyA8Y2hyaXN0aWFuQHB5dGhvbi5vcmc+CisuLiBzZWN0aW9uYXV0aG9yOjogR2VvcmcgQnJhbmRsIDxnZW9yZ0BweXRob24ub3JnPgorCisKK1B5dGhvbidzIGludGVyZmFjZXMgZm9yIHByb2Nlc3NpbmcgWE1MIGFyZSBncm91cGVkIGluIHRoZSBgYHhtbGBgIHBhY2thZ2UuCisKKy4uIHdhcm5pbmc6OgorCisgICBUaGUgWE1MIG1vZHVsZXMgYXJlIG5vdCBzZWN1cmUgYWdhaW5zdCBlcnJvbmVvdXMgb3IgbWFsaWNpb3VzbHkKKyAgIGNvbnN0cnVjdGVkIGRhdGEuICBJZiB5b3UgbmVlZCB0byBwYXJzZSB1bnRydXN0ZWQgb3IgdW5hdXRoZW50aWNhdGVkIGRhdGEgc2VlCisgICA6cmVmOmB4bWwtdnVsbmVyYWJpbGl0aWVzYC4KKworSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBtb2R1bGVzIGluIHRoZSA6bW9kOmB4bWxgIHBhY2thZ2UgcmVxdWlyZSB0aGF0Cit0aGVyZSBiZSBhdCBsZWFzdCBvbmUgU0FYLWNvbXBsaWFudCBYTUwgcGFyc2VyIGF2YWlsYWJsZS4gVGhlIEV4cGF0IHBhcnNlciBpcworaW5jbHVkZWQgd2l0aCBQeXRob24sIHNvIHRoZSA6bW9kOmB4bWwucGFyc2Vycy5leHBhdGAgbW9kdWxlIHdpbGwgYWx3YXlzIGJlCithdmFpbGFibGUuCisKK1RoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgOm1vZDpgeG1sLmRvbWAgYW5kIDptb2Q6YHhtbC5zYXhgIHBhY2thZ2VzIGFyZSB0aGUKK2RlZmluaXRpb24gb2YgdGhlIFB5dGhvbiBiaW5kaW5ncyBmb3IgdGhlIERPTSBhbmQgU0FYIGludGVyZmFjZXMuCisKK1RoZSBYTUwgaGFuZGxpbmcgc3VibW9kdWxlcyBhcmU6CisKKyogOm1vZDpgeG1sLmV0cmVlLkVsZW1lbnRUcmVlYDogdGhlIEVsZW1lbnRUcmVlIEFQSSwgYSBzaW1wbGUgYW5kIGxpZ2h0d2VpZ2h0CisgIFhNTCBwcm9jZXNzb3IKKworLi4KKworKiA6bW9kOmB4bWwuZG9tYDogdGhlIERPTSBBUEkgZGVmaW5pdGlvbgorKiA6bW9kOmB4bWwuZG9tLm1pbmlkb21gOiBhIG1pbmltYWwgRE9NIGltcGxlbWVudGF0aW9uCisqIDptb2Q6YHhtbC5kb20ucHVsbGRvbWA6IHN1cHBvcnQgZm9yIGJ1aWxkaW5nIHBhcnRpYWwgRE9NIHRyZWVzCisKKy4uCisKKyogOm1vZDpgeG1sLnNheGA6IFNBWDIgYmFzZSBjbGFzc2VzIGFuZCBjb252ZW5pZW5jZSBmdW5jdGlvbnMKKyogOm1vZDpgeG1sLnBhcnNlcnMuZXhwYXRgOiB0aGUgRXhwYXQgcGFyc2VyIGJpbmRpbmcKKworCisuLiBfeG1sLXZ1bG5lcmFiaWxpdGllczoKKworWE1MIHZ1bG5lcmFiaWxpdGllcworPT09PT09PT09PT09PT09PT09PQorCitUaGUgWE1MIHByb2Nlc3NpbmcgbW9kdWxlcyBhcmUgbm90IHNlY3VyZSBhZ2FpbnN0IG1hbGljaW91c2x5IGNvbnN0cnVjdGVkIGRhdGEuCitBbiBhdHRhY2tlciBjYW4gYWJ1c2UgdnVsbmVyYWJpbGl0aWVzIGZvciBlLmcuIGRlbmlhbCBvZiBzZXJ2aWNlIGF0dGFja3MsIHRvCithY2Nlc3MgbG9jYWwgZmlsZXMsIHRvIGdlbmVyYXRlIG5ldHdvcmsgY29ubmVjdGlvbnMgdG8gb3RoZXIgbWFjaGluZXMsIG9yCit0byBvciBjaXJjdW12ZW50IGZpcmV3YWxscy4gVGhlIGF0dGFja3Mgb24gWE1MIGFidXNlIHVuZmFtaWxpYXIgZmVhdHVyZXMKK2xpa2UgaW5saW5lIGBEVERgXyAoZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uKSB3aXRoIGVudGl0aWVzLgorCitUaGUgZm9sbG93aW5nIHRhYmxlIGdpdmVzIGFuIG92ZXJ2aWV3IG9mIHRoZSBrbm93biBhdHRhY2tzIGFuZCBpZiB0aGUgdmFyaW91cworbW9kdWxlcyBhcmUgdnVsbmVyYWJsZSB0byB0aGVtLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09ICA9PT09PT09PSAgPT09PT09PT09ICA9PT09PT09PT0gID09PT09PT09ICA9PT09PT09PT0KK2tpbmQgICAgICAgICAgICAgICAgICAgICAgIHNheCAgICAgICBldHJlZSAgICAgIG1pbmlkb20gICAgcHVsbGRvbSAgIHhtbHJwYworPT09PT09PT09PT09PT09PT09PT09PT09PSAgPT09PT09PT0gID09PT09PT09PSAgPT09PT09PT09ICA9PT09PT09PSAgPT09PT09PT09CitiaWxsaW9uIGxhdWdocyAgICAgICAgICAgICAqKlllcyoqICAgKipZZXMqKiAgICAqKlllcyoqICAgICoqWWVzKiogICAqKlllcyoqCitxdWFkcmF0aWMgYmxvd3VwICAgICAgICAgICAqKlllcyoqICAgKipZZXMqKiAgICAqKlllcyoqICAgICoqWWVzKiogICAqKlllcyoqCitleHRlcm5hbCBlbnRpdHkgZXhwYW5zaW9uICAqKlllcyoqICAgTm8gICAgKDEpICBObyAgICAoMikgICoqWWVzKiogICBObyAgICAoMykKK0RURCByZXRyaWV2YWwgICAgICAgICAgICAgICoqWWVzKiogICBObyAgICAgICAgIE5vICAgICAgICAgKipZZXMqKiAgIE5vCitkZWNvbXByZXNzaW9uIGJvbWIgICAgICAgICBObyAgICAgICAgTm8gICAgICAgICBObyAgICAgICAgIE5vICAgICAgICAqKlllcyoqCis9PT09PT09PT09PT09PT09PT09PT09PT09ICA9PT09PT09PSAgPT09PT09PT09ICA9PT09PT09PT0gID09PT09PT09ICA9PT09PT09PT0KKworMS4gOm1vZDpgeG1sLmV0cmVlLkVsZW1lbnRUcmVlYCBkb2Vzbid0IGV4cGFuZCBleHRlcm5hbCBlbnRpdGllcyBhbmQgcmFpc2VzIGEKKyAgIFBhcnNlckVycm9yIHdoZW4gYW4gZW50aXR5IG9jY3Vycy4KKzIuIDptb2Q6YHhtbC5kb20ubWluaWRvbWAgZG9lc24ndCBleHBhbmQgZXh0ZXJuYWwgZW50aXRpZXMgYW5kIHNpbXBseSByZXR1cm5zCisgICB0aGUgdW5leHBhbmRlZCBlbnRpdHkgdmVyYmF0aW0uCiszLiA6bW9kOmB4bWxycGNsaWJgIGRvZXNuJ3QgZXhwYW5kIGV4dGVybmFsIGVudGl0aWVzIGFuZCBvbWl0cyB0aGVtLgorCisKK2JpbGxpb24gbGF1Z2hzIC8gZXhwb25lbnRpYWwgZW50aXR5IGV4cGFuc2lvbgorICBUaGUgYEJpbGxpb24gTGF1Z2hzYF8gYXR0YWNrIC0tIGFsc28ga25vd24gYXMgZXhwb25lbnRpYWwgZW50aXR5IGV4cGFuc2lvbiAtLQorICB1c2VzIG11bHRpcGxlIGxldmVscyBvZiBuZXN0ZWQgZW50aXRpZXMuIEVhY2ggZW50aXR5IHJlZmVycyB0byBhbm90aGVyIGVudGl0eQorICBzZXZlcmFsIHRpbWVzLCB0aGUgZmluYWwgZW50aXR5IGRlZmluaXRpb24gY29udGFpbnMgYSBzbWFsbCBzdHJpbmcuIEV2ZW50dWFsbHkKKyAgdGhlIHNtYWxsIHN0cmluZyBpcyBleHBhbmRlZCB0byBzZXZlcmFsIGdpZ2FieXRlcy4gVGhlIGV4cG9uZW50aWFsIGV4cGFuc2lvbgorICBjb25zdW1lcyBsb3RzIG9mIENQVSB0aW1lLCB0b28uCisKK3F1YWRyYXRpYyBibG93dXAgZW50aXR5IGV4cGFuc2lvbgorICBBIHF1YWRyYXRpYyBibG93dXAgYXR0YWNrIGlzIHNpbWlsYXIgdG8gYSBgQmlsbGlvbiBMYXVnaHNgXyBhdHRhY2s7IGl0IGFidXNlcworICBlbnRpdHkgZXhwYW5zaW9uLCB0b28uIEluc3RlYWQgb2YgbmVzdGVkIGVudGl0aWVzIGl0IHJlcGVhdHMgb25lIGxhcmdlIGVudGl0eQorICB3aXRoIGEgY291cGxlIG9mIHRob3VzYW5kIGNoYXJzIG92ZXIgYW5kIG92ZXIgYWdhaW4uIFRoZSBhdHRhY2sgaXNuJ3QgYXMKKyAgZWZmaWNpZW50IGFzIHRoZSBleHBvbmVudGlhbCBjYXNlIGJ1dCBpdCBhdm9pZHMgdHJpZ2dlcmluZyBjb3VudGVybWVhc3VyZXMgb2YKKyAgcGFyc2VycyBhZ2FpbnN0IGhlYXZpbHkgbmVzdGVkIGVudGl0aWVzLgorCitleHRlcm5hbCBlbnRpdHkgZXhwYW5zaW9uCisgIEVudGl0eSBkZWNsYXJhdGlvbnMgY2FuIGNvbnRhaW4gbW9yZSB0aGFuIGp1c3QgdGV4dCBmb3IgcmVwbGFjZW1lbnQuIFRoZXkgY2FuCisgIGFsc28gcG9pbnQgdG8gZXh0ZXJuYWwgcmVzb3VyY2VzIGJ5IHB1YmxpYyBpZGVudGlmaWVycyBvciBzeXN0ZW0gaWRlbnRpZmllcnMuCisgIFN5c3RlbSBpZGVudGlmaWVycyBhcmUgc3RhbmRhcmQgVVJJcyBvciBjYW4gcmVmZXIgdG8gbG9jYWwgZmlsZXMuIFRoZSBYTUwKKyAgcGFyc2VyIHJldHJpZXZlcyB0aGUgcmVzb3VyY2Ugd2l0aCBlLmcuIEhUVFAgb3IgRlRQIHJlcXVlc3RzIGFuZCBlbWJlZHMgdGhlCisgIGNvbnRlbnQgaW50byB0aGUgWE1MIGRvY3VtZW50LgorCitEVEQgcmV0cmlldmFsCisgIFNvbWUgWE1MIGxpYnJhcmllcyBsaWtlIFB5dGhvbidzIDptb2Q6YHhtbC5kb20ucHVsbGRvbWAgcmV0cmlldmUgZG9jdW1lbnQgdHlwZQorICBkZWZpbml0aW9ucyBmcm9tIHJlbW90ZSBvciBsb2NhbCBsb2NhdGlvbnMuIFRoZSBmZWF0dXJlIGhhcyBzaW1pbGFyCisgIGltcGxpY2F0aW9ucyBhcyB0aGUgZXh0ZXJuYWwgZW50aXR5IGV4cGFuc2lvbiBpc3N1ZS4KKworZGVjb21wcmVzc2lvbiBib21iCisgIFRoZSBpc3N1ZSBvZiBkZWNvbXByZXNzaW9uIGJvbWJzIChha2EgYFpJUCBib21iYF8pIGFwcGx5IHRvIGFsbCBYTUwgbGlicmFyaWVzCisgIHRoYXQgY2FuIHBhcnNlIGNvbXByZXNzZWQgWE1MIHN0cmVhbSBsaWtlIGd6aXBwZWQgSFRUUCBzdHJlYW1zIG9yIExaTUEtZWQKKyAgZmlsZXMuIEZvciBhbiBhdHRhY2tlciBpdCBjYW4gcmVkdWNlIHRoZSBhbW91bnQgb2YgdHJhbnNtaXR0ZWQgZGF0YSBieSB0aHJlZQorICBtYWduaXR1ZGVzIG9yIG1vcmUuCisKK1RoZSBkb2N1bWVudGF0aW9uIG9mIGBkZWZ1c2VkeG1sYF8gb24gUHlQSSBoYXMgZnVydGhlciBpbmZvcm1hdGlvbiBhYm91dAorYWxsIGtub3duIGF0dGFjayB2ZWN0b3JzIHdpdGggZXhhbXBsZXMgYW5kIHJlZmVyZW5jZXMuCisKK2RlZnVzZWQgcGFja2FnZXMKKy0tLS0tLS0tLS0tLS0tLS0KKworVGhlc2UgZXh0ZXJuYWwgcGFja2FnZXMgYXJlIHJlY29tbWVuZGVkIGZvciBhbnkgY29kZSB0aGF0IHBhcnNlcwordW50cnVzdGVkIFhNTCBkYXRhLgorCitgZGVmdXNlZHhtbGBfIGlzIGEgcHVyZSBQeXRob24gcGFja2FnZSB3aXRoIG1vZGlmaWVkIHN1YmNsYXNzZXMgb2YgYWxsIHN0ZGxpYgorWE1MIHBhcnNlcnMgdGhhdCBwcmV2ZW50IGFueSBwb3RlbnRpYWxseSBtYWxpY2lvdXMgb3BlcmF0aW9uLiBUaGUKK3BhY2thZ2UgYWxzbyBzaGlwcyB3aXRoIGV4YW1wbGUgZXhwbG9pdHMgYW5kIGV4dGVuZGVkIGRvY3VtZW50YXRpb24gb24gbW9yZQorWE1MIGV4cGxvaXRzIGxpa2UgeHBhdGggaW5qZWN0aW9uLgorCitgZGVmdXNlZGV4cGF0YF8gcHJvdmlkZXMgYSBtb2RpZmllZCBsaWJleHBhdCBhbmQgcGF0Y2hlZCByZXBsYWNlbWVudAorOm1vZDpgcHlleHBhdGAgZXh0ZW5zaW9uIG1vZHVsZSB3aXRoIGNvdW50ZXJtZWFzdXJlcyBhZ2FpbnN0IGVudGl0eSBleHBhbnNpb24KK0RvUyBhdHRhY2tzLiBEZWZ1c2VkZXhwYXQgc3RpbGwgYWxsb3dzIGEgc2FuZSBhbmQgY29uZmlndXJhYmxlIGFtb3VudCBvZiBlbnRpdHkKK2V4cGFuc2lvbnMuIFRoZSBtb2RpZmljYXRpb25zIHdpbGwgYmUgbWVyZ2VkIGludG8gZnV0dXJlIHJlbGVhc2VzIG9mIFB5dGhvbi4KKworVGhlIHdvcmthcm91bmRzIGFuZCBtb2RpZmljYXRpb25zIGFyZSBub3QgaW5jbHVkZWQgaW4gcGF0Y2ggcmVsZWFzZXMgYXMgdGhleQorYnJlYWsgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gQWZ0ZXIgYWxsIGlubGluZSBEVEQgYW5kIGVudGl0eSBleHBhbnNpb24gYXJlCit3ZWxsLWRlZmluZWQgWE1MIGZlYXR1cmVzLgorCisKKy4uIF9kZWZ1c2VkeG1sOiBodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpL2RlZnVzZWR4bWwvCisuLiBfZGVmdXNlZGV4cGF0OiBodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpL2RlZnVzZWRleHBhdC8KKy4uIF9CaWxsaW9uIExhdWdoczogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaWxsaW9uX2xhdWdocworLi4gX1pJUCBib21iOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ppcF9ib21iCisuLiBfRFREOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0RvY3VtZW50X1R5cGVfRGVmaW5pdGlvbgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkveG1sLnNheC5oYW5kbGVyLnJzdCBiL0RvYy9saWJyYXJ5L3htbC5zYXguaGFuZGxlci5yc3QKaW5kZXggMjNmNDI5ZS4uMTUxNDBhMyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkveG1sLnNheC5oYW5kbGVyLnJzdAorKysgYi9Eb2MvbGlicmFyeS94bWwuc2F4LmhhbmRsZXIucnN0CkBAIC0yNDAsNyArMjQwLDggQEAKICAgIFNpZ25hbHMgdGhlIHN0YXJ0IG9mIGFuIGVsZW1lbnQgaW4gbm9uLW5hbWVzcGFjZSBtb2RlLgogCiAgICBUaGUgKm5hbWUqIHBhcmFtZXRlciBjb250YWlucyB0aGUgcmF3IFhNTCAxLjAgbmFtZSBvZiB0aGUgZWxlbWVudCB0eXBlIGFzIGEKLSAgIHN0cmluZyBhbmQgdGhlICphdHRycyogcGFyYW1ldGVyIGhvbGRzIGFuIG9iamVjdCBvZiB0aGUgOmNsYXNzOmBBdHRyaWJ1dGVzYAorICAgc3RyaW5nIGFuZCB0aGUgKmF0dHJzKiBwYXJhbWV0ZXIgaG9sZHMgYW4gb2JqZWN0IG9mIHRoZQorICAgOmNsYXNzOmB+eG1sLnNheC54bWxyZWFkZXIuQXR0cmlidXRlc2AKICAgIGludGVyZmFjZSAoc2VlIDpyZWY6YGF0dHJpYnV0ZXMtb2JqZWN0c2ApIGNvbnRhaW5pbmcgdGhlIGF0dHJpYnV0ZXMgb2YKICAgIHRoZSBlbGVtZW50LiAgVGhlIG9iamVjdCBwYXNzZWQgYXMgKmF0dHJzKiBtYXkgYmUgcmUtdXNlZCBieSB0aGUgcGFyc2VyOyBob2xkaW5nCiAgICBvbiB0byBhIHJlZmVyZW5jZSB0byBpdCBpcyBub3QgYSByZWxpYWJsZSB3YXkgdG8ga2VlcCBhIGNvcHkgb2YgdGhlIGF0dHJpYnV0ZXMuCkBAIC0yNjMsNyArMjY0LDggQEAKICAgIFRoZSAqbmFtZSogcGFyYW1ldGVyIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHR5cGUgYXMgYSBgYCh1cmksCiAgICBsb2NhbG5hbWUpYGAgdHVwbGUsIHRoZSAqcW5hbWUqIHBhcmFtZXRlciBjb250YWlucyB0aGUgcmF3IFhNTCAxLjAgbmFtZSB1c2VkIGluCiAgICB0aGUgc291cmNlIGRvY3VtZW50LCBhbmQgdGhlICphdHRycyogcGFyYW1ldGVyIGhvbGRzIGFuIGluc3RhbmNlIG9mIHRoZQotICAgOmNsYXNzOmBBdHRyaWJ1dGVzTlNgIGludGVyZmFjZSAoc2VlIDpyZWY6YGF0dHJpYnV0ZXMtbnMtb2JqZWN0c2ApCisgICA6Y2xhc3M6YH54bWwuc2F4LnhtbHJlYWRlci5BdHRyaWJ1dGVzTlNgIGludGVyZmFjZSAoc2VlCisgICA6cmVmOmBhdHRyaWJ1dGVzLW5zLW9iamVjdHNgKQogICAgY29udGFpbmluZyB0aGUgYXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudC4gIElmIG5vIG5hbWVzcGFjZSBpcyBhc3NvY2lhdGVkIHdpdGgKICAgIHRoZSBlbGVtZW50LCB0aGUgKnVyaSogY29tcG9uZW50IG9mICpuYW1lKiB3aWxsIGJlIGBgTm9uZWBgLiAgVGhlIG9iamVjdCBwYXNzZWQKICAgIGFzICphdHRycyogbWF5IGJlIHJlLXVzZWQgYnkgdGhlIHBhcnNlcjsgaG9sZGluZyBvbiB0byBhIHJlZmVyZW5jZSB0byBpdCBpcyBub3QKQEAgLTM3OSw4ICszODEsOSBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogT2JqZWN0cyB3aXRoIHRoaXMgaW50ZXJmYWNlIGFyZSB1c2VkIHRvIHJlY2VpdmUgZXJyb3IgYW5kIHdhcm5pbmcgaW5mb3JtYXRpb24KLWZyb20gdGhlIDpjbGFzczpgWE1MUmVhZGVyYC4gIElmIHlvdSBjcmVhdGUgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGlzCi1pbnRlcmZhY2UsIHRoZW4gcmVnaXN0ZXIgdGhlIG9iamVjdCB3aXRoIHlvdXIgOmNsYXNzOmBYTUxSZWFkZXJgLCB0aGUgcGFyc2VyCitmcm9tIHRoZSA6Y2xhc3M6YH54bWwuc2F4LnhtbHJlYWRlci5YTUxSZWFkZXJgLiAgSWYgeW91IGNyZWF0ZSBhbiBvYmplY3QgdGhhdAoraW1wbGVtZW50cyB0aGlzIGludGVyZmFjZSwgdGhlbiByZWdpc3RlciB0aGUgb2JqZWN0IHdpdGggeW91cgorOmNsYXNzOmB+eG1sLnNheC54bWxyZWFkZXIuWE1MUmVhZGVyYCwgdGhlIHBhcnNlcgogd2lsbCBjYWxsIHRoZSBtZXRob2RzIGluIHlvdXIgb2JqZWN0IHRvIHJlcG9ydCBhbGwgd2FybmluZ3MgYW5kIGVycm9ycy4gVGhlcmUKIGFyZSB0aHJlZSBsZXZlbHMgb2YgZXJyb3JzIGF2YWlsYWJsZTogd2FybmluZ3MsIChwb3NzaWJseSkgcmVjb3ZlcmFibGUgZXJyb3JzLAogYW5kIHVucmVjb3ZlcmFibGUgZXJyb3JzLiAgQWxsIG1ldGhvZHMgdGFrZSBhIDpleGM6YFNBWFBhcnNlRXhjZXB0aW9uYCBhcyB0aGUKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3htbC5zYXgucmVhZGVyLnJzdCBiL0RvYy9saWJyYXJ5L3htbC5zYXgucmVhZGVyLnJzdAppbmRleCA0YjNjMThhLi42OTU2Y2QxIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS94bWwuc2F4LnJlYWRlci5yc3QKKysrIGIvRG9jL2xpYnJhcnkveG1sLnNheC5yZWFkZXIucnN0CkBAIC0xMDksNDcgKzEwOSw1MCBAQAogCiAuLiBtZXRob2Q6OiBYTUxSZWFkZXIuZ2V0Q29udGVudEhhbmRsZXIoKQogCi0gICBSZXR1cm4gdGhlIGN1cnJlbnQgOmNsYXNzOmBDb250ZW50SGFuZGxlcmAuCisgICBSZXR1cm4gdGhlIGN1cnJlbnQgOmNsYXNzOmB+eG1sLnNheC5oYW5kbGVyLkNvbnRlbnRIYW5kbGVyYC4KIAogCiAuLiBtZXRob2Q6OiBYTUxSZWFkZXIuc2V0Q29udGVudEhhbmRsZXIoaGFuZGxlcikKIAotICAgU2V0IHRoZSBjdXJyZW50IDpjbGFzczpgQ29udGVudEhhbmRsZXJgLiAgSWYgbm8gOmNsYXNzOmBDb250ZW50SGFuZGxlcmAgaXMgc2V0LAotICAgY29udGVudCBldmVudHMgd2lsbCBiZSBkaXNjYXJkZWQuCisgICBTZXQgdGhlIGN1cnJlbnQgOmNsYXNzOmB+eG1sLnNheC5oYW5kbGVyLkNvbnRlbnRIYW5kbGVyYC4gIElmIG5vCisgICA6Y2xhc3M6YH54bWwuc2F4LmhhbmRsZXIuQ29udGVudEhhbmRsZXJgIGlzIHNldCwgY29udGVudCBldmVudHMgd2lsbCBiZQorICAgZGlzY2FyZGVkLgogCiAKIC4uIG1ldGhvZDo6IFhNTFJlYWRlci5nZXREVERIYW5kbGVyKCkKIAotICAgUmV0dXJuIHRoZSBjdXJyZW50IDpjbGFzczpgRFRESGFuZGxlcmAuCisgICBSZXR1cm4gdGhlIGN1cnJlbnQgOmNsYXNzOmB+eG1sLnNheC5oYW5kbGVyLkRUREhhbmRsZXJgLgogCiAKIC4uIG1ldGhvZDo6IFhNTFJlYWRlci5zZXREVERIYW5kbGVyKGhhbmRsZXIpCiAKLSAgIFNldCB0aGUgY3VycmVudCA6Y2xhc3M6YERUREhhbmRsZXJgLiAgSWYgbm8gOmNsYXNzOmBEVERIYW5kbGVyYCBpcyBzZXQsIERURAorICAgU2V0IHRoZSBjdXJyZW50IDpjbGFzczpgfnhtbC5zYXguaGFuZGxlci5EVERIYW5kbGVyYC4gIElmIG5vCisgICA6Y2xhc3M6YH54bWwuc2F4LmhhbmRsZXIuRFRESGFuZGxlcmAgaXMgc2V0LCBEVEQKICAgIGV2ZW50cyB3aWxsIGJlIGRpc2NhcmRlZC4KIAogCiAuLiBtZXRob2Q6OiBYTUxSZWFkZXIuZ2V0RW50aXR5UmVzb2x2ZXIoKQogCi0gICBSZXR1cm4gdGhlIGN1cnJlbnQgOmNsYXNzOmBFbnRpdHlSZXNvbHZlcmAuCisgICBSZXR1cm4gdGhlIGN1cnJlbnQgOmNsYXNzOmB+eG1sLnNheC5oYW5kbGVyLkVudGl0eVJlc29sdmVyYC4KIAogCiAuLiBtZXRob2Q6OiBYTUxSZWFkZXIuc2V0RW50aXR5UmVzb2x2ZXIoaGFuZGxlcikKIAotICAgU2V0IHRoZSBjdXJyZW50IDpjbGFzczpgRW50aXR5UmVzb2x2ZXJgLiAgSWYgbm8gOmNsYXNzOmBFbnRpdHlSZXNvbHZlcmAgaXMgc2V0LAorICAgU2V0IHRoZSBjdXJyZW50IDpjbGFzczpgfnhtbC5zYXguaGFuZGxlci5FbnRpdHlSZXNvbHZlcmAuICBJZiBubworICAgOmNsYXNzOmB+eG1sLnNheC5oYW5kbGVyLkVudGl0eVJlc29sdmVyYCBpcyBzZXQsCiAgICBhdHRlbXB0cyB0byByZXNvbHZlIGFuIGV4dGVybmFsIGVudGl0eSB3aWxsIHJlc3VsdCBpbiBvcGVuaW5nIHRoZSBzeXN0ZW0KICAgIGlkZW50aWZpZXIgZm9yIHRoZSBlbnRpdHksIGFuZCBmYWlsIGlmIGl0IGlzIG5vdCBhdmFpbGFibGUuCiAKIAogLi4gbWV0aG9kOjogWE1MUmVhZGVyLmdldEVycm9ySGFuZGxlcigpCiAKLSAgIFJldHVybiB0aGUgY3VycmVudCA6Y2xhc3M6YEVycm9ySGFuZGxlcmAuCisgICBSZXR1cm4gdGhlIGN1cnJlbnQgOmNsYXNzOmB+eG1sLnNheC5oYW5kbGVyLkVycm9ySGFuZGxlcmAuCiAKIAogLi4gbWV0aG9kOjogWE1MUmVhZGVyLnNldEVycm9ySGFuZGxlcihoYW5kbGVyKQogCi0gICBTZXQgdGhlIGN1cnJlbnQgZXJyb3IgaGFuZGxlci4gIElmIG5vIDpjbGFzczpgRXJyb3JIYW5kbGVyYCBpcyBzZXQsIGVycm9ycyB3aWxsCi0gICBiZSByYWlzZWQgYXMgZXhjZXB0aW9ucywgYW5kIHdhcm5pbmdzIHdpbGwgYmUgcHJpbnRlZC4KKyAgIFNldCB0aGUgY3VycmVudCBlcnJvciBoYW5kbGVyLiAgSWYgbm8gOmNsYXNzOmB+eG1sLnNheC5oYW5kbGVyLkVycm9ySGFuZGxlcmAKKyAgIGlzIHNldCwgZXJyb3JzIHdpbGwgYmUgcmFpc2VkIGFzIGV4Y2VwdGlvbnMsIGFuZCB3YXJuaW5ncyB3aWxsIGJlIHByaW50ZWQuCiAKIAogLi4gbWV0aG9kOjogWE1MUmVhZGVyLnNldExvY2FsZShsb2NhbGUpCkBAIC0zMjYsOCArMzI5LDEzIEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogOmNsYXNzOmBBdHRyaWJ1dGVzYCBvYmplY3RzIGltcGxlbWVudCBhIHBvcnRpb24gb2YgdGhlIG1hcHBpbmcgcHJvdG9jb2wsCi1pbmNsdWRpbmcgdGhlIG1ldGhvZHMgOm1ldGg6YGNvcHlgLCA6bWV0aDpgZ2V0YCwgOm1ldGg6YGhhc19rZXlgLCA6bWV0aDpgaXRlbXNgLAotOm1ldGg6YGtleXNgLCBhbmQgOm1ldGg6YHZhbHVlc2AuICBUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIGFsc28gcHJvdmlkZWQ6CitpbmNsdWRpbmcgdGhlIG1ldGhvZHMgOm1ldGg6YH5jb2xsZWN0aW9ucy5NYXBwaW5nLmNvcHlgLAorOm1ldGg6YH5jb2xsZWN0aW9ucy5NYXBwaW5nLmdldGAsCis6bWV0aDpgfmNvbGxlY3Rpb25zLk1hcHBpbmcuaGFzX2tleWAsCis6bWV0aDpgfmNvbGxlY3Rpb25zLk1hcHBpbmcuaXRlbXNgLAorOm1ldGg6YH5jb2xsZWN0aW9ucy5NYXBwaW5nLmtleXNgLAorYW5kIDptZXRoOmB+Y29sbGVjdGlvbnMuTWFwcGluZy52YWx1ZXNgLiAgVGhlIGZvbGxvd2luZyBtZXRob2RzCithcmUgYWxzbyBwcm92aWRlZDoKIAogCiAuLiBtZXRob2Q6OiBBdHRyaWJ1dGVzLmdldExlbmd0aCgpCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS94bWwuc2F4LnJzdCBiL0RvYy9saWJyYXJ5L3htbC5zYXgucnN0CmluZGV4IDQzZDE3YzIuLjI1ZTRmYTkgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3htbC5zYXgucnN0CisrKyBiL0RvYy9saWJyYXJ5L3htbC5zYXgucnN0CkBAIC0xNiwxMiArMTYsMjEgQEAKIFNBWCBleGNlcHRpb25zIGFuZCB0aGUgY29udmVuaWVuY2UgZnVuY3Rpb25zIHdoaWNoIHdpbGwgYmUgbW9zdCB1c2VkIGJ5IHVzZXJzIG9mCiB0aGUgU0FYIEFQSS4KIAorCisuLiB3YXJuaW5nOjoKKworICAgVGhlIDptb2Q6YHhtbC5zYXhgIG1vZHVsZSBpcyBub3Qgc2VjdXJlIGFnYWluc3QgbWFsaWNpb3VzbHkKKyAgIGNvbnN0cnVjdGVkIGRhdGEuICBJZiB5b3UgbmVlZCB0byBwYXJzZSB1bnRydXN0ZWQgb3IgdW5hdXRoZW50aWNhdGVkIGRhdGEgc2VlCisgICA6cmVmOmB4bWwtdnVsbmVyYWJpbGl0aWVzYC4KKworCiBUaGUgY29udmVuaWVuY2UgZnVuY3Rpb25zIGFyZToKIAogCiAuLiBmdW5jdGlvbjo6IG1ha2VfcGFyc2VyKFtwYXJzZXJfbGlzdF0pCiAKLSAgIENyZWF0ZSBhbmQgcmV0dXJuIGEgU0FYIDpjbGFzczpgWE1MUmVhZGVyYCBvYmplY3QuICBUaGUgZmlyc3QgcGFyc2VyIGZvdW5kIHdpbGwKKyAgIENyZWF0ZSBhbmQgcmV0dXJuIGEgU0FYIDpjbGFzczpgfnhtbC5zYXgueG1scmVhZGVyLlhNTFJlYWRlcmAgb2JqZWN0LiAgVGhlCisgICBmaXJzdCBwYXJzZXIgZm91bmQgd2lsbAogICAgYmUgdXNlZC4gIElmICpwYXJzZXJfbGlzdCogaXMgcHJvdmlkZWQsIGl0IG11c3QgYmUgYSBzZXF1ZW5jZSBvZiBzdHJpbmdzIHdoaWNoCiAgICBuYW1lIG1vZHVsZXMgdGhhdCBoYXZlIGEgZnVuY3Rpb24gbmFtZWQgOmZ1bmM6YGNyZWF0ZV9wYXJzZXJgLiAgTW9kdWxlcyBsaXN0ZWQKICAgIGluICpwYXJzZXJfbGlzdCogd2lsbCBiZSB1c2VkIGJlZm9yZSBtb2R1bGVzIGluIHRoZSBkZWZhdWx0IGxpc3Qgb2YgcGFyc2Vycy4KQEAgLTMxLDggKzQwLDkgQEAKIAogICAgQ3JlYXRlIGEgU0FYIHBhcnNlciBhbmQgdXNlIGl0IHRvIHBhcnNlIGEgZG9jdW1lbnQuICBUaGUgZG9jdW1lbnQsIHBhc3NlZCBpbiBhcwogICAgKmZpbGVuYW1lX29yX3N0cmVhbSosIGNhbiBiZSBhIGZpbGVuYW1lIG9yIGEgZmlsZSBvYmplY3QuICBUaGUgKmhhbmRsZXIqCi0gICBwYXJhbWV0ZXIgbmVlZHMgdG8gYmUgYSBTQVggOmNsYXNzOmBDb250ZW50SGFuZGxlcmAgaW5zdGFuY2UuICBJZgotICAgKmVycm9yX2hhbmRsZXIqIGlzIGdpdmVuLCBpdCBtdXN0IGJlIGEgU0FYIDpjbGFzczpgRXJyb3JIYW5kbGVyYCBpbnN0YW5jZTsgaWYKKyAgIHBhcmFtZXRlciBuZWVkcyB0byBiZSBhIFNBWCA6Y2xhc3M6YH5oYW5kbGVyLkNvbnRlbnRIYW5kbGVyYCBpbnN0YW5jZS4gIElmCisgICAqZXJyb3JfaGFuZGxlciogaXMgZ2l2ZW4sIGl0IG11c3QgYmUgYSBTQVggOmNsYXNzOmB+aGFuZGxlci5FcnJvckhhbmRsZXJgCisgICBpbnN0YW5jZTsgaWYKICAgIG9taXR0ZWQsICA6ZXhjOmBTQVhQYXJzZUV4Y2VwdGlvbmAgd2lsbCBiZSByYWlzZWQgb24gYWxsIGVycm9ycy4gIFRoZXJlIGlzIG5vCiAgICByZXR1cm4gdmFsdWU7IGFsbCB3b3JrIG11c3QgYmUgZG9uZSBieSB0aGUgKmhhbmRsZXIqIHBhc3NlZCBpbi4KIApAQCAtNTcsMTAgKzY3LDEyIEBACiBpbnN0YW50aWF0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGl0c2VsZi4gIFNpbmNlIFB5dGhvbiBkb2VzIG5vdCBoYXZlIGFuIGV4cGxpY2l0CiBub3Rpb24gb2YgaW50ZXJmYWNlLCB0aGV5IGFyZSBmb3JtYWxseSBpbnRyb2R1Y2VkIGFzIGNsYXNzZXMsIGJ1dCBhcHBsaWNhdGlvbnMKIG1heSB1c2UgaW1wbGVtZW50YXRpb25zIHdoaWNoIGRvIG5vdCBpbmhlcml0IGZyb20gdGhlIHByb3ZpZGVkIGNsYXNzZXMuICBUaGUKLTpjbGFzczpgSW5wdXRTb3VyY2VgLCA6Y2xhc3M6YExvY2F0b3JgLCA6Y2xhc3M6YEF0dHJpYnV0ZXNgLAotOmNsYXNzOmBBdHRyaWJ1dGVzTlNgLCBhbmQgOmNsYXNzOmBYTUxSZWFkZXJgIGludGVyZmFjZXMgYXJlIGRlZmluZWQgaW4gdGhlCis6Y2xhc3M6YH54bWwuc2F4LnhtbHJlYWRlci5JbnB1dFNvdXJjZWAsIDpjbGFzczpgfnhtbC5zYXgueG1scmVhZGVyLkxvY2F0b3JgLAorOmNsYXNzOmB+eG1sLnNheC54bWxyZWFkZXIuQXR0cmlidXRlc2AsIDpjbGFzczpgfnhtbC5zYXgueG1scmVhZGVyLkF0dHJpYnV0ZXNOU2AsCithbmQgOmNsYXNzOmB+eG1sLnNheC54bWxyZWFkZXIuWE1MUmVhZGVyYCBpbnRlcmZhY2VzIGFyZSBkZWZpbmVkIGluIHRoZQogbW9kdWxlIDptb2Q6YHhtbC5zYXgueG1scmVhZGVyYC4gIFRoZSBoYW5kbGVyIGludGVyZmFjZXMgYXJlIGRlZmluZWQgaW4KLTptb2Q6YHhtbC5zYXguaGFuZGxlcmAuICBGb3IgY29udmVuaWVuY2UsIDpjbGFzczpgSW5wdXRTb3VyY2VgICh3aGljaCBpcyBvZnRlbgorOm1vZDpgeG1sLnNheC5oYW5kbGVyYC4gIEZvciBjb252ZW5pZW5jZSwKKzpjbGFzczpgfnhtbC5zYXgueG1scmVhZGVyLklucHV0U291cmNlYCAod2hpY2ggaXMgb2Z0ZW4KIGluc3RhbnRpYXRlZCBkaXJlY3RseSkgYW5kIHRoZSBoYW5kbGVyIGNsYXNzZXMgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20KIDptb2Q6YHhtbC5zYXhgLiAgVGhlc2UgaW50ZXJmYWNlcyBhcmUgZGVzY3JpYmVkIGJlbG93LgogCkBAIC03Myw3ICs4NSw4IEBACiAgICBFbmNhcHN1bGF0ZSBhbiBYTUwgZXJyb3Igb3Igd2FybmluZy4gIFRoaXMgY2xhc3MgY2FuIGNvbnRhaW4gYmFzaWMgZXJyb3Igb3IKICAgIHdhcm5pbmcgaW5mb3JtYXRpb24gZnJvbSBlaXRoZXIgdGhlIFhNTCBwYXJzZXIgb3IgdGhlIGFwcGxpY2F0aW9uOiBpdCBjYW4gYmUKICAgIHN1YmNsYXNzZWQgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgb3IgdG8gYWRkIGxvY2FsaXphdGlvbi4gIE5vdGUKLSAgIHRoYXQgYWx0aG91Z2ggdGhlIGhhbmRsZXJzIGRlZmluZWQgaW4gdGhlIDpjbGFzczpgRXJyb3JIYW5kbGVyYCBpbnRlcmZhY2UKKyAgIHRoYXQgYWx0aG91Z2ggdGhlIGhhbmRsZXJzIGRlZmluZWQgaW4gdGhlCisgICA6Y2xhc3M6YH54bWwuc2F4LmhhbmRsZXIuRXJyb3JIYW5kbGVyYCBpbnRlcmZhY2UKICAgIHJlY2VpdmUgaW5zdGFuY2VzIG9mIHRoaXMgZXhjZXB0aW9uLCBpdCBpcyBub3QgcmVxdWlyZWQgdG8gYWN0dWFsbHkgcmFpc2UgdGhlCiAgICBleGNlcHRpb24gLS0tIGl0IGlzIGFsc28gdXNlZnVsIGFzIGEgY29udGFpbmVyIGZvciBpbmZvcm1hdGlvbi4KIApAQCAtODYsMjIgKzk5LDI2IEBACiAKIC4uIGV4Y2VwdGlvbjo6IFNBWFBhcnNlRXhjZXB0aW9uKG1zZywgZXhjZXB0aW9uLCBsb2NhdG9yKQogCi0gICBTdWJjbGFzcyBvZiA6ZXhjOmBTQVhFeGNlcHRpb25gIHJhaXNlZCBvbiBwYXJzZSBlcnJvcnMuIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzCi0gICBhcmUgcGFzc2VkIHRvIHRoZSBtZXRob2RzIG9mIHRoZSBTQVggOmNsYXNzOmBFcnJvckhhbmRsZXJgIGludGVyZmFjZSB0byBwcm92aWRlCi0gICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFyc2UgZXJyb3IuICBUaGlzIGNsYXNzIHN1cHBvcnRzIHRoZSBTQVggOmNsYXNzOmBMb2NhdG9yYAotICAgaW50ZXJmYWNlIGFzIHdlbGwgYXMgdGhlIDpjbGFzczpgU0FYRXhjZXB0aW9uYCBpbnRlcmZhY2UuCisgICBTdWJjbGFzcyBvZiA6ZXhjOmBTQVhFeGNlcHRpb25gIHJhaXNlZCBvbiBwYXJzZSBlcnJvcnMuIEluc3RhbmNlcyBvZiB0aGlzCisgICBjbGFzcyBhcmUgcGFzc2VkIHRvIHRoZSBtZXRob2RzIG9mIHRoZSBTQVgKKyAgIDpjbGFzczpgfnhtbC5zYXguaGFuZGxlci5FcnJvckhhbmRsZXJgIGludGVyZmFjZSB0byBwcm92aWRlIGluZm9ybWF0aW9uCisgICBhYm91dCB0aGUgcGFyc2UgZXJyb3IuICBUaGlzIGNsYXNzIHN1cHBvcnRzIHRoZSBTQVgKKyAgIDpjbGFzczpgfnhtbC5zYXgueG1scmVhZGVyLkxvY2F0b3JgIGludGVyZmFjZSBhcyB3ZWxsIGFzIHRoZQorICAgOmNsYXNzOmBTQVhFeGNlcHRpb25gIGludGVyZmFjZS4KIAogCiAuLiBleGNlcHRpb246OiBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uKG1zZ1ssIGV4Y2VwdGlvbl0pCiAKLSAgIFN1YmNsYXNzIG9mIDpleGM6YFNBWEV4Y2VwdGlvbmAgcmFpc2VkIHdoZW4gYSBTQVggOmNsYXNzOmBYTUxSZWFkZXJgIGlzCisgICBTdWJjbGFzcyBvZiA6ZXhjOmBTQVhFeGNlcHRpb25gIHJhaXNlZCB3aGVuIGEgU0FYCisgICA6Y2xhc3M6YH54bWwuc2F4LnhtbHJlYWRlci5YTUxSZWFkZXJgIGlzCiAgICBjb25mcm9udGVkIHdpdGggYW4gdW5yZWNvZ25pemVkIGZlYXR1cmUgb3IgcHJvcGVydHkuICBTQVggYXBwbGljYXRpb25zIGFuZAogICAgZXh0ZW5zaW9ucyBtYXkgdXNlIHRoaXMgY2xhc3MgZm9yIHNpbWlsYXIgcHVycG9zZXMuCiAKIAogLi4gZXhjZXB0aW9uOjogU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uKG1zZ1ssIGV4Y2VwdGlvbl0pCiAKLSAgIFN1YmNsYXNzIG9mIDpleGM6YFNBWEV4Y2VwdGlvbmAgcmFpc2VkIHdoZW4gYSBTQVggOmNsYXNzOmBYTUxSZWFkZXJgIGlzIGFza2VkIHRvCisgICBTdWJjbGFzcyBvZiA6ZXhjOmBTQVhFeGNlcHRpb25gIHJhaXNlZCB3aGVuIGEgU0FYCisgICA6Y2xhc3M6YH54bWwuc2F4LnhtbHJlYWRlci5YTUxSZWFkZXJgIGlzIGFza2VkIHRvCiAgICBlbmFibGUgYSBmZWF0dXJlIHRoYXQgaXMgbm90IHN1cHBvcnRlZCwgb3IgdG8gc2V0IGEgcHJvcGVydHkgdG8gYSB2YWx1ZSB0aGF0IHRoZQogICAgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydC4gIFNBWCBhcHBsaWNhdGlvbnMgYW5kIGV4dGVuc2lvbnMgbWF5IHVzZSB0aGlzCiAgICBjbGFzcyBmb3Igc2ltaWxhciBwdXJwb3Nlcy4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3htbC5zYXgudXRpbHMucnN0IGIvRG9jL2xpYnJhcnkveG1sLnNheC51dGlscy5yc3QKaW5kZXggYzc5NmNhOC4uZTc3NGI2YiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkveG1sLnNheC51dGlscy5yc3QKKysrIGIvRG9jL2xpYnJhcnkveG1sLnNheC51dGlscy5yc3QKQEAgLTU5LDcgKzU5LDggQEAKIAogLi4gY2xhc3M6OiBYTUxHZW5lcmF0b3IoW291dFssIGVuY29kaW5nXV0pCiAKLSAgIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgOmNsYXNzOmBDb250ZW50SGFuZGxlcmAgaW50ZXJmYWNlIGJ5IHdyaXRpbmcgU0FYCisgICBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIDpjbGFzczpgfnhtbC5zYXguaGFuZGxlci5Db250ZW50SGFuZGxlcmAgaW50ZXJmYWNlCisgICBieSB3cml0aW5nIFNBWAogICAgZXZlbnRzIGJhY2sgaW50byBhbiBYTUwgZG9jdW1lbnQuIEluIG90aGVyIHdvcmRzLCB1c2luZyBhbiA6Y2xhc3M6YFhNTEdlbmVyYXRvcmAKICAgIGFzIHRoZSBjb250ZW50IGhhbmRsZXIgd2lsbCByZXByb2R1Y2UgdGhlIG9yaWdpbmFsIGRvY3VtZW50IGJlaW5nIHBhcnNlZC4gKm91dCoKICAgIHNob3VsZCBiZSBhIGZpbGUtbGlrZSBvYmplY3Qgd2hpY2ggd2lsbCBkZWZhdWx0IHRvICpzeXMuc3Rkb3V0Ki4gKmVuY29kaW5nKiBpcwpAQCAtNjgsNyArNjksOCBAQAogCiAuLiBjbGFzczo6IFhNTEZpbHRlckJhc2UoYmFzZSkKIAotICAgVGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBzaXQgYmV0d2VlbiBhbiA6Y2xhc3M6YFhNTFJlYWRlcmAgYW5kIHRoZSBjbGllbnQKKyAgIFRoaXMgY2xhc3MgaXMgZGVzaWduZWQgdG8gc2l0IGJldHdlZW4gYW4KKyAgIDpjbGFzczpgfnhtbC5zYXgueG1scmVhZGVyLlhNTFJlYWRlcmAgYW5kIHRoZSBjbGllbnQKICAgIGFwcGxpY2F0aW9uJ3MgZXZlbnQgaGFuZGxlcnMuICBCeSBkZWZhdWx0LCBpdCBkb2VzIG5vdGhpbmcgYnV0IHBhc3MgcmVxdWVzdHMgdXAKICAgIHRvIHRoZSByZWFkZXIgYW5kIGV2ZW50cyBvbiB0byB0aGUgaGFuZGxlcnMgdW5tb2RpZmllZCwgYnV0IHN1YmNsYXNzZXMgY2FuCiAgICBvdmVycmlkZSBzcGVjaWZpYyBtZXRob2RzIHRvIG1vZGlmeSB0aGUgZXZlbnQgc3RyZWFtIG9yIHRoZSBjb25maWd1cmF0aW9uCkBAIC03Nyw5ICs3OSwxMCBAQAogCiAuLiBmdW5jdGlvbjo6IHByZXBhcmVfaW5wdXRfc291cmNlKHNvdXJjZVssIGJhc2VdKQogCi0gICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFuIGlucHV0IHNvdXJjZSBhbmQgYW4gb3B0aW9uYWwgYmFzZSBVUkwgYW5kIHJldHVybnMgYSBmdWxseQotICAgcmVzb2x2ZWQgOmNsYXNzOmBJbnB1dFNvdXJjZWAgb2JqZWN0IHJlYWR5IGZvciByZWFkaW5nLiAgVGhlIGlucHV0IHNvdXJjZSBjYW4gYmUKLSAgIGdpdmVuIGFzIGEgc3RyaW5nLCBhIGZpbGUtbGlrZSBvYmplY3QsIG9yIGFuIDpjbGFzczpgSW5wdXRTb3VyY2VgIG9iamVjdDsKLSAgIHBhcnNlcnMgd2lsbCB1c2UgdGhpcyBmdW5jdGlvbiB0byBpbXBsZW1lbnQgdGhlIHBvbHltb3JwaGljICpzb3VyY2UqIGFyZ3VtZW50IHRvCi0gICB0aGVpciA6bWV0aDpgcGFyc2VgIG1ldGhvZC4KKyAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgYW4gaW5wdXQgc291cmNlIGFuZCBhbiBvcHRpb25hbCBiYXNlIFVSTCBhbmQgcmV0dXJucyBhCisgICBmdWxseSByZXNvbHZlZCA6Y2xhc3M6YH54bWwuc2F4LnhtbHJlYWRlci5JbnB1dFNvdXJjZWAgb2JqZWN0IHJlYWR5IGZvcgorICAgcmVhZGluZy4gIFRoZSBpbnB1dCBzb3VyY2UgY2FuIGJlIGdpdmVuIGFzIGEgc3RyaW5nLCBhIGZpbGUtbGlrZSBvYmplY3QsIG9yCisgICBhbiA6Y2xhc3M6YH54bWwuc2F4LnhtbHJlYWRlci5JbnB1dFNvdXJjZWAgb2JqZWN0OyBwYXJzZXJzIHdpbGwgdXNlIHRoaXMKKyAgIGZ1bmN0aW9uIHRvIGltcGxlbWVudCB0aGUgcG9seW1vcnBoaWMgKnNvdXJjZSogYXJndW1lbnQgdG8gdGhlaXIKKyAgIDptZXRoOmBwYXJzZWAgbWV0aG9kLgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS94bWxycGNsaWIucnN0IGIvRG9jL2xpYnJhcnkveG1scnBjbGliLnJzdAppbmRleCAxODNiZTkyLi4wZTlmZjRiIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS94bWxycGNsaWIucnN0CisrKyBiL0RvYy9saWJyYXJ5L3htbHJwY2xpYi5yc3QKQEAgLTgsOCArOCw4IEBACiAKIC4uIG5vdGU6OgogICAgVGhlIDptb2Q6YHhtbHJwY2xpYmAgbW9kdWxlIGhhcyBiZWVuIHJlbmFtZWQgdG8gOm1vZDpgeG1scnBjLmNsaWVudGAgaW4KLSAgIFB5dGhvbiAzLjAuICBUaGUgOnRlcm06YDJ0bzNgIHRvb2wgd2lsbCBhdXRvbWF0aWNhbGx5IGFkYXB0IGltcG9ydHMgd2hlbgotICAgY29udmVydGluZyB5b3VyIHNvdXJjZXMgdG8gMy4wLgorICAgUHl0aG9uIDMuICBUaGUgOnRlcm06YDJ0bzNgIHRvb2wgd2lsbCBhdXRvbWF0aWNhbGx5IGFkYXB0IGltcG9ydHMgd2hlbgorICAgY29udmVydGluZyB5b3VyIHNvdXJjZXMgdG8gUHl0aG9uIDMuCiAKIAogLi4gWFhYIE5vdCBldmVyeXRoaW5nIGlzIGRvY3VtZW50ZWQgeWV0LiAgSXQgbWlnaHQgYmUgZ29vZCB0byBkZXNjcmliZQpAQCAtMjgsNiArMjgsMTMgQEAKIGJldHdlZW4gY29uZm9ybWFibGUgUHl0aG9uIG9iamVjdHMgYW5kIFhNTCBvbiB0aGUgd2lyZS4KIAogCisuLiB3YXJuaW5nOjoKKworICAgVGhlIDptb2Q6YHhtbHJwY2xpYmAgbW9kdWxlIGlzIG5vdCBzZWN1cmUgYWdhaW5zdCBtYWxpY2lvdXNseQorICAgY29uc3RydWN0ZWQgZGF0YS4gIElmIHlvdSBuZWVkIHRvIHBhcnNlIHVudHJ1c3RlZCBvciB1bmF1dGhlbnRpY2F0ZWQgZGF0YSBzZWUKKyAgIDpyZWY6YHhtbC12dWxuZXJhYmlsaXRpZXNgLgorCisKIC4uIGNsYXNzOjogU2VydmVyUHJveHkodXJpWywgdHJhbnNwb3J0WywgZW5jb2RpbmdbLCB2ZXJib3NlWywgIGFsbG93X25vbmVbLCB1c2VfZGF0ZXRpbWVdXV1dXSkKIAogICAgQSA6Y2xhc3M6YFNlcnZlclByb3h5YCBpbnN0YW5jZSBpcyBhbiBvYmplY3QgdGhhdCBtYW5hZ2VzIGNvbW11bmljYXRpb24gd2l0aCBhCkBAIC0zODAsNyArMzg3LDcgQEAKICAgIHByb3h5ID0geG1scnBjbGliLlNlcnZlclByb3h5KCJodHRwOi8vbG9jYWxob3N0OjgwMDAvIikKICAgIHRyeToKICAgICAgICBwcm94eS5hZGQoMiwgNSkKLSAgIGV4Y2VwdCB4bWxycGNsaWIuRmF1bHQsIGVycjoKKyAgIGV4Y2VwdCB4bWxycGNsaWIuRmF1bHQgYXMgZXJyOgogICAgICAgIHByaW50ICJBIGZhdWx0IG9jY3VycmVkIgogICAgICAgIHByaW50ICJGYXVsdCBjb2RlOiAlZCIgJSBlcnIuZmF1bHRDb2RlCiAgICAgICAgcHJpbnQgIkZhdWx0IHN0cmluZzogJXMiICUgZXJyLmZhdWx0U3RyaW5nCkBAIC00MjcsNyArNDM0LDcgQEAKIAogICAgdHJ5OgogICAgICAgIHByb3h5LnNvbWVfbWV0aG9kKCkKLSAgIGV4Y2VwdCB4bWxycGNsaWIuUHJvdG9jb2xFcnJvciwgZXJyOgorICAgZXhjZXB0IHhtbHJwY2xpYi5Qcm90b2NvbEVycm9yIGFzIGVycjoKICAgICAgICBwcmludCAiQSBwcm90b2NvbCBlcnJvciBvY2N1cnJlZCIKICAgICAgICBwcmludCAiVVJMOiAlcyIgJSBlcnIudXJsCiAgICAgICAgcHJpbnQgIkhUVFAvSFRUUFMgaGVhZGVyczogJXMiICUgZXJyLmhlYWRlcnMKQEAgLTU0NSw3ICs1NTIsNyBAQAogCiAgICB0cnk6CiAgICAgICAgcHJpbnQgc2VydmVyLmV4YW1wbGVzLmdldFN0YXRlTmFtZSg0MSkKLSAgIGV4Y2VwdCBFcnJvciwgdjoKKyAgIGV4Y2VwdCBFcnJvciBhcyB2OgogICAgICAgIHByaW50ICJFUlJPUiIsIHYKIAogVG8gYWNjZXNzIGFuIFhNTC1SUEMgc2VydmVyIHRocm91Z2ggYSBwcm94eSwgeW91IG5lZWQgdG8gZGVmaW5lICBhIGN1c3RvbQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvemlwZmlsZS5yc3QgYi9Eb2MvbGlicmFyeS96aXBmaWxlLnJzdAppbmRleCAxNGU0MGM4Li4yNjE3NDdhIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS96aXBmaWxlLnJzdAorKysgYi9Eb2MvbGlicmFyeS96aXBmaWxlLnJzdApAQCAtMjUsOSArMjUsNiBAQAogY3JlYXRlIGFuIGVuY3J5cHRlZCBmaWxlLiAgRGVjcnlwdGlvbiBpcyBleHRyZW1lbHkgc2xvdyBhcyBpdCBpcwogaW1wbGVtZW50ZWQgaW4gbmF0aXZlIFB5dGhvbiByYXRoZXIgdGhhbiBDLgogCi1Gb3Igb3RoZXIgYXJjaGl2ZSBmb3JtYXRzLCBzZWUgdGhlIDptb2Q6YGJ6MmAsIDptb2Q6YGd6aXBgLCBhbmQKLTptb2Q6YHRhcmZpbGVgIG1vZHVsZXMuCi0KIFRoZSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGl0ZW1zOgogCiAuLiBleGNlcHRpb246OiBCYWRaaXBmaWxlCkBAIC01Niw3ICs1Myw3IEBACiAuLiBjbGFzczo6IFppcEluZm8oW2ZpbGVuYW1lWywgZGF0ZV90aW1lXV0pCiAKICAgIENsYXNzIHVzZWQgdG8gcmVwcmVzZW50IGluZm9ybWF0aW9uIGFib3V0IGEgbWVtYmVyIG9mIGFuIGFyY2hpdmUuIEluc3RhbmNlcwotICAgb2YgdGhpcyBjbGFzcyBhcmUgcmV0dXJuZWQgYnkgdGhlIDptZXRoOmBnZXRpbmZvYCBhbmQgOm1ldGg6YGluZm9saXN0YAorICAgb2YgdGhpcyBjbGFzcyBhcmUgcmV0dXJuZWQgYnkgdGhlIDptZXRoOmAuZ2V0aW5mb2AgYW5kIDptZXRoOmAuaW5mb2xpc3RgCiAgICBtZXRob2RzIG9mIDpjbGFzczpgWmlwRmlsZWAgb2JqZWN0cy4gIE1vc3QgdXNlcnMgb2YgdGhlIDptb2Q6YHppcGZpbGVgIG1vZHVsZQogICAgd2lsbCBub3QgbmVlZCB0byBjcmVhdGUgdGhlc2UsIGJ1dCBvbmx5IHVzZSB0aG9zZSBjcmVhdGVkIGJ5IHRoaXMKICAgIG1vZHVsZS4gKmZpbGVuYW1lKiBzaG91bGQgYmUgdGhlIGZ1bGwgbmFtZSBvZiB0aGUgYXJjaGl2ZSBtZW1iZXIsIGFuZApAQCAtODEsNyArNzgsNyBAQAogLi4gZGF0YTo6IFpJUF9ERUZMQVRFRAogCiAgICBUaGUgbnVtZXJpYyBjb25zdGFudCBmb3IgdGhlIHVzdWFsIFpJUCBjb21wcmVzc2lvbiBtZXRob2QuICBUaGlzIHJlcXVpcmVzIHRoZQotICAgemxpYiBtb2R1bGUuICBObyBvdGhlciBjb21wcmVzc2lvbiBtZXRob2RzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkLgorICAgOm1vZDpgemxpYmAgbW9kdWxlLiAgTm8gb3RoZXIgY29tcHJlc3Npb24gbWV0aG9kcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZC4KIAogCiAuLiBzZWVhbHNvOjoKQEAgLTEyOCw3ICsxMjUsNyBAQAogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNy4xCiAgICAgICBJZiB0aGUgZmlsZSBpcyBjcmVhdGVkIHdpdGggbW9kZSBgYCdhJ2BgIG9yIGBgJ3cnYGAgYW5kIHRoZW4KLSAgICAgIDptZXRoOmBjbG9zZWBcIGQgd2l0aG91dCBhZGRpbmcgYW55IGZpbGVzIHRvIHRoZSBhcmNoaXZlLCB0aGUgYXBwcm9wcmlhdGUKKyAgICAgIDptZXRoOmBjbG9zZWQgPGNsb3NlPmAgd2l0aG91dCBhZGRpbmcgYW55IGZpbGVzIHRvIHRoZSBhcmNoaXZlLCB0aGUgYXBwcm9wcmlhdGUKICAgICAgIFpJUCBzdHJ1Y3R1cmVzIGZvciBhbiBlbXB0eSBhcmNoaXZlIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgZmlsZS4KIAogICAgWmlwRmlsZSBpcyBhbHNvIGEgY29udGV4dCBtYW5hZ2VyIGFuZCB0aGVyZWZvcmUgc3VwcG9ydHMgdGhlCkBAIC0xNjYsMjEgKzE2MywyNiBAQAogCiAgICBSZXR1cm4gYSBsaXN0IG9mIGFyY2hpdmUgbWVtYmVycyBieSBuYW1lLgogCisgICAuLiBpbmRleDo6CisgICAgICBzaW5nbGU6IHVuaXZlcnNhbCBuZXdsaW5lczsgemlwZmlsZS5aaXBGaWxlLm9wZW4gbWV0aG9kCisKIAogLi4gbWV0aG9kOjogWmlwRmlsZS5vcGVuKG5hbWVbLCBtb2RlWywgcHdkXV0pCiAKICAgIEV4dHJhY3QgYSBtZW1iZXIgZnJvbSB0aGUgYXJjaGl2ZSBhcyBhIGZpbGUtbGlrZSBvYmplY3QgKFppcEV4dEZpbGUpLiAqbmFtZSogaXMKICAgIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGluIHRoZSBhcmNoaXZlLCBvciBhIDpjbGFzczpgWmlwSW5mb2Agb2JqZWN0LiBUaGUgKm1vZGUqCi0gICBwYXJhbWV0ZXIsIGlmIGluY2x1ZGVkLCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOiBgYCdyJ2BgICh0aGUgIGRlZmF1bHQpLAotICAgYGAnVSdgYCwgb3IgYGAnclUnYGAuIENob29zaW5nIGBgJ1UnYGAgb3IgIGBgJ3JVJ2BgIHdpbGwgZW5hYmxlIHVuaXZlcnNhbCBuZXdsaW5lCisgICBwYXJhbWV0ZXIsIGlmIGluY2x1ZGVkLCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOiBgYCdyJ2BgICh0aGUgZGVmYXVsdCksCisgICBgYCdVJ2BgLCBvciBgYCdyVSdgYC4gQ2hvb3NpbmcgYGAnVSdgYCBvciAgYGAnclUnYGAgd2lsbCBlbmFibGUKKyAgIDp0ZXJtOmB1bml2ZXJzYWwgbmV3bGluZSA8dW5pdmVyc2FsIG5ld2xpbmVzPmAKICAgIHN1cHBvcnQgaW4gdGhlIHJlYWQtb25seSBvYmplY3QuICpwd2QqIGlzIHRoZSBwYXNzd29yZCB1c2VkIGZvciBlbmNyeXB0ZWQgZmlsZXMuCi0gICBDYWxsaW5nICA6bWV0aDpgb3BlbmAgb24gYSBjbG9zZWQgWmlwRmlsZSB3aWxsIHJhaXNlIGEgIDpleGM6YFJ1bnRpbWVFcnJvcmAuCisgICBDYWxsaW5nICA6bWV0aDpgLm9wZW5gIG9uIGEgY2xvc2VkIFppcEZpbGUgd2lsbCByYWlzZSBhICA6ZXhjOmBSdW50aW1lRXJyb3JgLgogCiAgICAuLiBub3RlOjoKIAogICAgICAgVGhlIGZpbGUtbGlrZSBvYmplY3QgaXMgcmVhZC1vbmx5IGFuZCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0gICAgICA6bWV0aDpgIXJlYWRgLCA6bWV0aDpgIXJlYWRsaW5lYCwgOm1ldGg6YCFyZWFkbGluZXNgLCA6bWV0aDpgIV9faXRlcl9fYCwKLSAgICAgIDptZXRoOmAhbmV4dGAuCisgICAgICA6bWV0aDpgfmZpbGUucmVhZGAsIDptZXRoOmB+ZmlsZS5yZWFkbGluZWAsCisgICAgICA6bWV0aDpgfmZpbGUucmVhZGxpbmVzYCwgOm1ldGg6YF9faXRlcl9fYCwKKyAgICAgIDptZXRoOmB+b2JqZWN0Lm5leHRgLgogCiAgICAuLiBub3RlOjoKIApAQCAtMTk1LDcgKzE5Nyw3IEBACiAKICAgIC4uIG5vdGU6OgogCi0gICAgICBUaGUgOm1ldGg6YG9wZW5gLCA6bWV0aDpgcmVhZGAgYW5kIDptZXRoOmBleHRyYWN0YCBtZXRob2RzIGNhbiB0YWtlIGEgZmlsZW5hbWUKKyAgICAgIFRoZSA6bWV0aDpgLm9wZW5gLCA6bWV0aDpgcmVhZGAgYW5kIDptZXRoOmBleHRyYWN0YCBtZXRob2RzIGNhbiB0YWtlIGEgZmlsZW5hbWUKICAgICAgIG9yIGEgOmNsYXNzOmBaaXBJbmZvYCBvYmplY3QuICBZb3Ugd2lsbCBhcHByZWNpYXRlIHRoaXMgd2hlbiB0cnlpbmcgdG8gcmVhZCBhCiAgICAgICBaSVAgZmlsZSB0aGF0IGNvbnRhaW5zIG1lbWJlcnMgd2l0aCBkdXBsaWNhdGUgbmFtZXMuCiAKQEAgLTIxMiw2ICsyMTQsMTYgQEAKIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMi42CiAKKyAgIC4uIG5vdGU6OgorCisgICAgICBJZiBhIG1lbWJlciBmaWxlbmFtZSBpcyBhbiBhYnNvbHV0ZSBwYXRoLCBhIGRyaXZlL1VOQyBzaGFyZXBvaW50IGFuZAorICAgICAgbGVhZGluZyAoYmFjaylzbGFzaGVzIHdpbGwgYmUgc3RyaXBwZWQsIGUuZy46IGBgLy8vZm9vL2JhcmBgIGJlY29tZXMKKyAgICAgIGBgZm9vL2JhcmBgIG9uIFVuaXgsIGFuZCBgYEM6XGZvb1xiYXJgYCBiZWNvbWVzIGBgZm9vXGJhcmBgIG9uIFdpbmRvd3MuCisgICAgICBBbmQgYWxsIGBgIi4uImBgIGNvbXBvbmVudHMgaW4gYSBtZW1iZXIgZmlsZW5hbWUgd2lsbCBiZSByZW1vdmVkLCBlLmcuOgorICAgICAgYGAuLi8uLi9mb28uLi8uLi9iYS4ucmBgIGJlY29tZXMgYGBmb28uLi9iYS4ucmBgLiAgT24gV2luZG93cyBpbGxlZ2FsCisgICAgICBjaGFyYWN0ZXJzIChgYDpgYCwgYGA8YGAsIGBgPmBgLCBgYHxgYCwgYGAiYGAsIGBgP2BgLCBhbmQgYGAqYGApCisgICAgICByZXBsYWNlZCBieSB1bmRlcnNjb3JlIChgYF9gYCkuCisKIAogLi4gbWV0aG9kOjogWmlwRmlsZS5leHRyYWN0YWxsKFtwYXRoWywgbWVtYmVyc1ssIHB3ZF1dXSkKIApAQCAtMjI3LDYgKzIzOSw5IEBACiAgICAgICB0aGF0IGhhdmUgYWJzb2x1dGUgZmlsZW5hbWVzIHN0YXJ0aW5nIHdpdGggYGAiLyJgYCBvciBmaWxlbmFtZXMgd2l0aCB0d28KICAgICAgIGRvdHMgYGAiLi4iYGAuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi43LjQKKyAgICAgIFRoZSB6aXBmaWxlIG1vZHVsZSBhdHRlbXB0cyB0byBwcmV2ZW50IHRoYXQuICBTZWUgOm1ldGg6YGV4dHJhY3RgIG5vdGUuCisKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNgogCiAKQEAgLTMxMiw3ICszMjcsNyBAQAogICAgICAgOmNsYXNzOmBaaXBJbmZvYCBjb25zdHJ1Y3RvciBzZXRzIHRoaXMgbWVtYmVyIHRvIDpjb25zdDpgWklQX1NUT1JFRGAuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi43Ci0gICAgICBUaGUgKmNvbXByZXNzaW9uX3R5cGUqIGFyZ3VtZW50LgorICAgICAgVGhlICpjb21wcmVzc190eXBlKiBhcmd1bWVudC4KIAogVGhlIGZvbGxvd2luZyBkYXRhIGF0dHJpYnV0ZXMgYXJlIGFsc28gYXZhaWxhYmxlOgogCkBAIC0zMjgsNyArMzQzLDcgQEAKICAgIFRoZSBjb21tZW50IHRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSBaSVAgZmlsZS4gIElmIGFzc2lnbmluZyBhIGNvbW1lbnQgdG8gYQogICAgOmNsYXNzOmBaaXBGaWxlYCBpbnN0YW5jZSBjcmVhdGVkIHdpdGggbW9kZSAnYScgb3IgJ3cnLCB0aGlzIHNob3VsZCBiZSBhCiAgICBzdHJpbmcgbm8gbG9uZ2VyIHRoYW4gNjU1MzUgYnl0ZXMuICBDb21tZW50cyBsb25nZXIgdGhhbiB0aGlzIHdpbGwgYmUKLSAgIHRydW5jYXRlZCBpbiB0aGUgd3JpdHRlbiBhcmNoaXZlIHdoZW4gOm1ldGg6YFppcEZpbGUuY2xvc2VgIGlzIGNhbGxlZC4KKyAgIHRydW5jYXRlZCBpbiB0aGUgd3JpdHRlbiBhcmNoaXZlIHdoZW4gOm1ldGg6YC5jbG9zZWAgaXMgY2FsbGVkLgogCiAuLiBfcHl6aXBmaWxlLW9iamVjdHM6CiAKQEAgLTM2OCw4ICszODMsOCBAQAogWmlwSW5mbyBPYmplY3RzCiAtLS0tLS0tLS0tLS0tLS0KIAotSW5zdGFuY2VzIG9mIHRoZSA6Y2xhc3M6YFppcEluZm9gIGNsYXNzIGFyZSByZXR1cm5lZCBieSB0aGUgOm1ldGg6YGdldGluZm9gIGFuZAotOm1ldGg6YGluZm9saXN0YCBtZXRob2RzIG9mIDpjbGFzczpgWmlwRmlsZWAgb2JqZWN0cy4gIEVhY2ggb2JqZWN0IHN0b3JlcworSW5zdGFuY2VzIG9mIHRoZSA6Y2xhc3M6YFppcEluZm9gIGNsYXNzIGFyZSByZXR1cm5lZCBieSB0aGUgOm1ldGg6YC5nZXRpbmZvYCBhbmQKKzptZXRoOmAuaW5mb2xpc3RgIG1ldGhvZHMgb2YgOmNsYXNzOmBaaXBGaWxlYCBvYmplY3RzLiAgRWFjaCBvYmplY3Qgc3RvcmVzCiBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBtZW1iZXIgb2YgdGhlIFpJUCBhcmNoaXZlLgogCiBJbnN0YW5jZXMgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS96aXBpbXBvcnQucnN0IGIvRG9jL2xpYnJhcnkvemlwaW1wb3J0LnJzdAppbmRleCBhZjE4ZDE1Li44MjhlOWZjIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS96aXBpbXBvcnQucnN0CisrKyBiL0RvYy9saWJyYXJ5L3ppcGltcG9ydC5yc3QKQEAgLTE5LDcgKzE5LDcgQEAKIGFsc28gYWxsb3dzIGFuIGl0ZW0gb2YgOmRhdGE6YHN5cy5wYXRoYCB0byBiZSBhIHN0cmluZyBuYW1pbmcgYSBaSVAgZmlsZSBhcmNoaXZlLgogVGhlIFpJUCBhcmNoaXZlIGNhbiBjb250YWluIGEgc3ViZGlyZWN0b3J5IHN0cnVjdHVyZSB0byBzdXBwb3J0IHBhY2thZ2UgaW1wb3J0cywKIGFuZCBhIHBhdGggd2l0aGluIHRoZSBhcmNoaXZlIGNhbiBiZSBzcGVjaWZpZWQgdG8gb25seSBpbXBvcnQgZnJvbSBhCi1zdWJkaXJlY3RvcnkuICBGb3IgZXhhbXBsZSwgdGhlIHBhdGggOmZpbGU6YC90bXAvZXhhbXBsZS56aXAvbGliL2Agd291bGQgb25seQorc3ViZGlyZWN0b3J5LiAgRm9yIGV4YW1wbGUsIHRoZSBwYXRoIDpmaWxlOmBleGFtcGxlLnppcC9saWIvYCB3b3VsZCBvbmx5CiBpbXBvcnQgZnJvbSB0aGUgOmZpbGU6YGxpYi9gIHN1YmRpcmVjdG9yeSB3aXRoaW4gdGhlIGFyY2hpdmUuCiAKIEFueSBmaWxlcyBtYXkgYmUgcHJlc2VudCBpbiB0aGUgWklQIGFyY2hpdmUsIGJ1dCBvbmx5IGZpbGVzIDpmaWxlOmAucHlgIGFuZApAQCAtMTE1LDcgKzExNSw3IEBACiAKICAgIC4uIG1ldGhvZDo6IGlzX3BhY2thZ2UoZnVsbG5hbWUpCiAKLSAgICAgIFJldHVybiBUcnVlIGlmIHRoZSBtb2R1bGUgc3BlY2lmaWVkIGJ5ICpmdWxsbmFtZSogaXMgYSBwYWNrYWdlLiBSYWlzZQorICAgICAgUmV0dXJuIGBgVHJ1ZWBgIGlmIHRoZSBtb2R1bGUgc3BlY2lmaWVkIGJ5ICpmdWxsbmFtZSogaXMgYSBwYWNrYWdlLiBSYWlzZQogICAgICAgOmV4YzpgWmlwSW1wb3J0RXJyb3JgIGlmIHRoZSBtb2R1bGUgY291bGRuJ3QgYmUgZm91bmQuCiAKIApAQCAtMTUxLDggKzE1MSw4IEBACiBIZXJlIGlzIGFuIGV4YW1wbGUgdGhhdCBpbXBvcnRzIGEgbW9kdWxlIGZyb20gYSBaSVAgYXJjaGl2ZSAtIG5vdGUgdGhhdCB0aGUKIDptb2Q6YHppcGltcG9ydGAgbW9kdWxlIGlzIG5vdCBleHBsaWNpdGx5IHVzZWQuIDo6CiAKLSAgICQgdW56aXAgLWwgL3RtcC9leGFtcGxlLnppcAotICAgQXJjaGl2ZTogIC90bXAvZXhhbXBsZS56aXAKKyAgICQgdW56aXAgLWwgZXhhbXBsZS56aXAKKyAgIEFyY2hpdmU6ICBleGFtcGxlLnppcAogICAgICBMZW5ndGggICAgIERhdGUgICBUaW1lICAgIE5hbWUKICAgICAtLS0tLS0tLSAgICAtLS0tICAgLS0tLSAgICAtLS0tCiAgICAgICAgIDg0NjcgIDExLTI2LTAyIDIyOjMwICAgand6dGhyZWFkaW5nLnB5CkBAIC0xNjEsOCArMTYxLDggQEAKICAgICQgLi9weXRob24KICAgIFB5dGhvbiAyLjMgKCMxLCBBdWcgMSAyMDAzLCAxOTo1NDozMikKICAgID4+PiBpbXBvcnQgc3lzCi0gICA+Pj4gc3lzLnBhdGguaW5zZXJ0KDAsICcvdG1wL2V4YW1wbGUuemlwJykgICMgQWRkIC56aXAgZmlsZSB0byBmcm9udCBvZiBwYXRoCisgICA+Pj4gc3lzLnBhdGguaW5zZXJ0KDAsICdleGFtcGxlLnppcCcpICAjIEFkZCAuemlwIGZpbGUgdG8gZnJvbnQgb2YgcGF0aAogICAgPj4+IGltcG9ydCBqd3p0aHJlYWRpbmcKICAgID4+PiBqd3p0aHJlYWRpbmcuX19maWxlX18KLSAgICcvdG1wL2V4YW1wbGUuemlwL2p3enRocmVhZGluZy5weScKKyAgICdleGFtcGxlLnppcC9qd3p0aHJlYWRpbmcucHknCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3psaWIucnN0IGIvRG9jL2xpYnJhcnkvemxpYi5yc3QKaW5kZXggMDExODcwNC4uMTkyYmQ0ZCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvemxpYi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvemxpYi5yc3QKQEAgLTE5LDkgKzE5LDcgQEAKIGNvbnN1bHQgdGhlIHpsaWIgbWFudWFsIGF0IGh0dHA6Ly93d3cuemxpYi5uZXQvbWFudWFsLmh0bWwgZm9yIGF1dGhvcml0YXRpdmUKIGluZm9ybWF0aW9uLgogCi1Gb3IgcmVhZGluZyBhbmQgd3JpdGluZyBgYC5nemBgIGZpbGVzIHNlZSB0aGUgOm1vZDpgZ3ppcGAgbW9kdWxlLiBGb3IKLW90aGVyIGFyY2hpdmUgZm9ybWF0cywgc2VlIHRoZSA6bW9kOmBiejJgLCA6bW9kOmB6aXBmaWxlYCwgYW5kCi06bW9kOmB0YXJmaWxlYCBtb2R1bGVzLgorRm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgYGAuZ3pgYCBmaWxlcyBzZWUgdGhlIDptb2Q6YGd6aXBgIG1vZHVsZS4KIAogVGhlIGF2YWlsYWJsZSBleGNlcHRpb24gYW5kIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSBhcmU6CiAKQEAgLTY0LDE4ICs2MiwzNCBAQAogLi4gZnVuY3Rpb246OiBjb21wcmVzcyhzdHJpbmdbLCBsZXZlbF0pCiAKICAgIENvbXByZXNzZXMgdGhlIGRhdGEgaW4gKnN0cmluZyosIHJldHVybmluZyBhIHN0cmluZyBjb250YWluZWQgY29tcHJlc3NlZCBkYXRhLgotICAgKmxldmVsKiBpcyBhbiBpbnRlZ2VyIGZyb20gYGAxYGAgdG8gYGA5YGAgY29udHJvbGxpbmcgdGhlIGxldmVsIG9mIGNvbXByZXNzaW9uOworICAgKmxldmVsKiBpcyBhbiBpbnRlZ2VyIGZyb20gYGAwYGAgdG8gYGA5YGAgY29udHJvbGxpbmcgdGhlIGxldmVsIG9mIGNvbXByZXNzaW9uOwogICAgYGAxYGAgaXMgZmFzdGVzdCBhbmQgcHJvZHVjZXMgdGhlIGxlYXN0IGNvbXByZXNzaW9uLCBgYDlgYCBpcyBzbG93ZXN0IGFuZAotICAgcHJvZHVjZXMgdGhlIG1vc3QuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgYDZgYC4gIFJhaXNlcyB0aGUgOmV4YzpgZXJyb3JgCi0gICBleGNlcHRpb24gaWYgYW55IGVycm9yIG9jY3Vycy4KKyAgIHByb2R1Y2VzIHRoZSBtb3N0LiAgYGAwYGAgaXMgbm8gY29tcHJlc3Npb24uICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgYDZgYC4KKyAgIFJhaXNlcyB0aGUgOmV4YzpgZXJyb3JgIGV4Y2VwdGlvbiBpZiBhbnkgZXJyb3Igb2NjdXJzLgogCiAKLS4uIGZ1bmN0aW9uOjogY29tcHJlc3NvYmooW2xldmVsXSkKKy4uIGZ1bmN0aW9uOjogY29tcHJlc3NvYmooW2xldmVsWywgbWV0aG9kWywgd2JpdHNbLCBtZW1sZXZlbFssIHN0cmF0ZWd5XV1dXV0pCiAKICAgIFJldHVybnMgYSBjb21wcmVzc2lvbiBvYmplY3QsIHRvIGJlIHVzZWQgZm9yIGNvbXByZXNzaW5nIGRhdGEgc3RyZWFtcyB0aGF0IHdvbid0Ci0gICBmaXQgaW50byBtZW1vcnkgYXQgb25jZS4gICpsZXZlbCogaXMgYW4gaW50ZWdlciBmcm9tIGBgMWBgIHRvIGBgOWBgIGNvbnRyb2xsaW5nCisgICBmaXQgaW50byBtZW1vcnkgYXQgb25jZS4gICpsZXZlbCogaXMgYW4gaW50ZWdlciBmcm9tIGBgMGBgIHRvIGBgOWBgIGNvbnRyb2xsaW5nCiAgICB0aGUgbGV2ZWwgb2YgY29tcHJlc3Npb247IGBgMWBgIGlzIGZhc3Rlc3QgYW5kIHByb2R1Y2VzIHRoZSBsZWFzdCBjb21wcmVzc2lvbiwKLSAgIGBgOWBgIGlzIHNsb3dlc3QgYW5kIHByb2R1Y2VzIHRoZSBtb3N0LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGA2YGAuCisgICBgYDlgYCBpcyBzbG93ZXN0IGFuZCBwcm9kdWNlcyB0aGUgbW9zdC4gIGBgMGBgIGlzIG5vIGNvbXByZXNzaW9uLiAgVGhlIGRlZmF1bHQKKyAgIHZhbHVlIGlzIGBgNmBgLgorCisgICAqbWV0aG9kKiBpcyB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtLiBDdXJyZW50bHksIHRoZSBvbmx5IHN1cHBvcnRlZCB2YWx1ZSBpcworICAgYGBERUZMQVRFRGBgLgorCisgICAqd2JpdHMqIGlzIHRoZSBiYXNlIHR3byBsb2dhcml0aG0gb2YgdGhlIHNpemUgb2YgdGhlIHdpbmRvdyBidWZmZXIuIFRoaXMKKyAgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGZyb20gYGA4YGAgdG8gYGAxNWBgLiBIaWdoZXIgdmFsdWVzIGdpdmUgYmV0dGVyCisgICBjb21wcmVzc2lvbiwgYnV0IHVzZSBtb3JlIG1lbW9yeS4gVGhlIGRlZmF1bHQgaXMgMTUuCisKKyAgICptZW1sZXZlbCogY29udHJvbHMgdGhlIGFtb3VudCBvZiBtZW1vcnkgdXNlZCBmb3IgaW50ZXJuYWwgY29tcHJlc3Npb24gc3RhdGUuCisgICBWYWxpZCB2YWx1ZXMgcmFuZ2UgZnJvbSBgYDFgYCB0byBgYDlgYC4gSGlnaGVyIHZhbHVlcyB1c2luZyBtb3JlIG1lbW9yeSwKKyAgIGJ1dCBhcmUgZmFzdGVyIGFuZCBwcm9kdWNlIHNtYWxsZXIgb3V0cHV0LiBUaGUgZGVmYXVsdCBpcyA4LgorCisgICAqc3RyYXRlZ3kqIGlzIHVzZWQgdG8gdHVuZSB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtLiBQb3NzaWJsZSB2YWx1ZXMgYXJlCisgICBgYFpfREVGQVVMVF9TVFJBVEVHWWBgLCBgYFpfRklMVEVSRURgYCwgYW5kIGBgWl9IVUZGTUFOX09OTFlgYC4gVGhlIGRlZmF1bHQKKyAgIGlzIGBgWl9ERUZBVUxUX1NUUkFURUdZYGAuCiAKIAogLi4gZnVuY3Rpb246OiBjcmMzMihkYXRhWywgdmFsdWVdKQpAQCAtMTMyLDcgKzE0Niw3IEBACiAgICAqYnVmc2l6ZSogaXMgdGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgYnVmZmVyIHVzZWQgdG8gaG9sZCBkZWNvbXByZXNzZWQgZGF0YS4gIElmCiAgICBtb3JlIHNwYWNlIGlzIHJlcXVpcmVkLCB0aGUgYnVmZmVyIHNpemUgd2lsbCBiZSBpbmNyZWFzZWQgYXMgbmVlZGVkLCBzbyB5b3UKICAgIGRvbid0IGhhdmUgdG8gZ2V0IHRoaXMgdmFsdWUgZXhhY3RseSByaWdodDsgdHVuaW5nIGl0IHdpbGwgb25seSBzYXZlIGEgZmV3IGNhbGxzCi0gICB0byA6Y2Z1bmM6YG1hbGxvY2AuICBUaGUgZGVmYXVsdCBzaXplIGlzIDE2Mzg0LgorICAgdG8gOmM6ZnVuYzpgbWFsbG9jYC4gIFRoZSBkZWZhdWx0IHNpemUgaXMgMTYzODQuCiAKIAogLi4gZnVuY3Rpb246OiBkZWNvbXByZXNzb2JqKFt3Yml0c10pCmRpZmYgLS1naXQgYS9Eb2MvbGljZW5zZS5yc3QgYi9Eb2MvbGljZW5zZS5yc3QKaW5kZXggMTQ2OTc4NS4uNWM1YjI2OSAxMDA2NDQKLS0tIGEvRG9jL2xpY2Vuc2UucnN0CisrKyBiL0RvYy9saWNlbnNlLnJzdApAQCAtNTAsNTkgKzUwLDExIEBACiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCiB8IDIuMS4xICAgICAgICAgIHwgMi4xKzIuMC4xICAgIHwgMjAwMSAgICAgIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8CiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCi18IDIuMiAgICAgICAgICAgIHwgMi4xLjEgICAgICAgIHwgMjAwMSAgICAgIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCiB8IDIuMS4yICAgICAgICAgIHwgMi4xLjEgICAgICAgIHwgMjAwMiAgICAgIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8CiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCiB8IDIuMS4zICAgICAgICAgIHwgMi4xLjIgICAgICAgIHwgMjAwMiAgICAgIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8CiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCi18IDIuMi4xICAgICAgICAgIHwgMi4yICAgICAgICAgIHwgMjAwMiAgICAgIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCi18IDIuMi4yICAgICAgICAgIHwgMi4yLjEgICAgICAgIHwgMjAwMiAgICAgIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCi18IDIuMi4zICAgICAgICAgIHwgMi4yLjIgICAgICAgIHwgMjAwMi0yMDAzIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCi18IDIuMyAgICAgICAgICAgIHwgMi4yLjIgICAgICAgIHwgMjAwMi0yMDAzIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCi18IDIuMy4xICAgICAgICAgIHwgMi4zICAgICAgICAgIHwgMjAwMi0yMDAzIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCi18IDIuMy4yICAgICAgICAgIHwgMi4zLjEgICAgICAgIHwgMjAwMyAgICAgIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCi18IDIuMy4zICAgICAgICAgIHwgMi4zLjIgICAgICAgIHwgMjAwMyAgICAgIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCi18IDIuMy40ICAgICAgICAgIHwgMi4zLjMgICAgICAgIHwgMjAwNCAgICAgIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCi18IDIuMy41ICAgICAgICAgIHwgMi4zLjQgICAgICAgIHwgMjAwNSAgICAgIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCi18IDIuNCAgICAgICAgICAgIHwgMi4zICAgICAgICAgIHwgMjAwNCAgICAgIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCi18IDIuNC4xICAgICAgICAgIHwgMi40ICAgICAgICAgIHwgMjAwNSAgICAgIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCi18IDIuNC4yICAgICAgICAgIHwgMi40LjEgICAgICAgIHwgMjAwNSAgICAgIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCi18IDIuNC4zICAgICAgICAgIHwgMi40LjIgICAgICAgIHwgMjAwNiAgICAgIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCi18IDIuNC40ICAgICAgICAgIHwgMi40LjMgICAgICAgIHwgMjAwNiAgICAgIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCi18IDIuNSAgICAgICAgICAgIHwgMi40ICAgICAgICAgIHwgMjAwNiAgICAgIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCi18IDIuNS4xICAgICAgICAgIHwgMi41ICAgICAgICAgIHwgMjAwNyAgICAgIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCi18IDIuNS4yICAgICAgICAgIHwgMi41LjEgICAgICAgIHwgMjAwOCAgICAgIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCi18IDIuNS4zICAgICAgICAgIHwgMi41LjIgICAgICAgIHwgMjAwOCAgICAgIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCi18IDIuNiAgICAgICAgICAgIHwgMi41ICAgICAgICAgIHwgMjAwOCAgICAgIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCi18IDIuNi4xICAgICAgICAgIHwgMi42ICAgICAgICAgIHwgMjAwOCAgICAgIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCi18IDIuNi4yICAgICAgICAgIHwgMi42LjEgICAgICAgIHwgMjAwOSAgICAgIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCi18IDIuNi4zICAgICAgICAgIHwgMi42LjIgICAgICAgIHwgMjAwOSAgICAgIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCi18IDIuNi40ICAgICAgICAgIHwgMi42LjMgICAgICAgIHwgMjAxMCAgICAgIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCi18IDIuNyAgICAgICAgICAgIHwgMi42ICAgICAgICAgIHwgMjAxMCAgICAgIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8Cit8IDIuMiBhbmQgYWJvdmUgIHwgMi4xLjEgICAgICAgIHwgMjAwMS1ub3cgIHwgUFNGICAgICAgICB8IHllcyAgICAgICAgICAgICB8CiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCiAKIC4uIG5vdGU6OgpAQCAtMTMyLDcgKzg0LDcgQEAKICAgIGFuYWx5emUsIHRlc3QsIHBlcmZvcm0gYW5kL29yIGRpc3BsYXkgcHVibGljbHksIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcywKICAgIGRpc3RyaWJ1dGUsIGFuZCBvdGhlcndpc2UgdXNlIFB5dGhvbiB8cmVsZWFzZXwgYWxvbmUgb3IgaW4gYW55IGRlcml2YXRpdmUKICAgIHZlcnNpb24sIHByb3ZpZGVkLCBob3dldmVyLCB0aGF0IFBTRidzIExpY2Vuc2UgQWdyZWVtZW50IGFuZCBQU0YncyBub3RpY2Ugb2YKLSAgIGNvcHlyaWdodCwgaS5lLiwgIkNvcHlyaWdodCDCqSAyMDAxLTIwMTAgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb247IEFsbCBSaWdodHMKKyAgIGNvcHlyaWdodCwgaS5lLiwgIkNvcHlyaWdodCDCqSAyMDAxLTIwMTQgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb247IEFsbCBSaWdodHMKICAgIFJlc2VydmVkIiBhcmUgcmV0YWluZWQgaW4gUHl0aG9uIHxyZWxlYXNlfCBhbG9uZSBvciBpbiBhbnkgZGVyaXZhdGl2ZSB2ZXJzaW9uCiAgICBwcmVwYXJlZCBieSBMaWNlbnNlZS4KIApAQCAtMzA5LDcgKzI2MSw3IEBACiAtLS0tLS0tLS0tLS0tLS0tCiAKIFRoZSA6bW9kOmBfcmFuZG9tYCBtb2R1bGUgaW5jbHVkZXMgY29kZSBiYXNlZCBvbiBhIGRvd25sb2FkIGZyb20KLWh0dHA6Ly93d3cubWF0aC5rZWlvLmFjLmpwLyBtYXR1bW90by9NVDIwMDIvZW10MTk5Mzdhci5odG1sLiBUaGUgZm9sbG93aW5nIGFyZQoraHR0cDovL3d3dy5tYXRoLnNjaS5oaXJvc2hpbWEtdS5hYy5qcC9+bS1tYXQvTVQvTVQyMDAyL2VtdDE5OTM3YXIuaHRtbC4gVGhlIGZvbGxvd2luZyBhcmUKIHRoZSB2ZXJiYXRpbSBjb21tZW50cyBmcm9tIHRoZSBvcmlnaW5hbCBjb2RlOjoKIAogICAgQSBDLXByb2dyYW0gZm9yIE1UMTk5MzcsIHdpdGggaW5pdGlhbGl6YXRpb24gaW1wcm92ZWQgMjAwMi8xLzI2LgpAQCAtMzUwLDggKzMwMiw4IEBACiAKIAogICAgQW55IGZlZWRiYWNrIGlzIHZlcnkgd2VsY29tZS4KLSAgIGh0dHA6Ly93d3cubWF0aC5rZWlvLmFjLmpwL21hdHVtb3RvL2VtdC5odG1sCi0gICBlbWFpbDogbWF0dW1vdG9AbWF0aC5rZWlvLmFjLmpwCisgICBodHRwOi8vd3d3Lm1hdGguc2NpLmhpcm9zaGltYS11LmFjLmpwL35tLW1hdC9NVC9lbXQuaHRtbAorICAgZW1haWw6IG0tbWF0IEAgbWF0aC5zY2kuaGlyb3NoaW1hLXUuYWMuanAgKHJlbW92ZSBzcGFjZSkKIAogCiBTb2NrZXRzCkBAIC03OTQsOCArNzQ2LDggQEAKICAgICAgKgogICAgICAqLwogCi0gT3JpZ2luYWwgU1NMZWF5IExpY2Vuc2UKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBPcmlnaW5hbCBTU0xlYXkgTGljZW5zZQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgICAgLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCiAgICAgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KZGlmZiAtLWdpdCBhL0RvYy9tYWtlLmJhdCBiL0RvYy9tYWtlLmJhdAppbmRleCBkMjM0ZTc3Li5kM2YwMWI1IDEwMDY0NAotLS0gYS9Eb2MvbWFrZS5iYXQKKysrIGIvRG9jL21ha2UuYmF0CkBAIC0zNCw3ICszNCw3IEBACiBnb3RvIGVuZAogCiA6Y2hlY2tvdXQKLXN2biBjbyAlU1ZOUk9PVCUvZXh0ZXJuYWwvU3BoaW54LTAuNi43L3NwaGlueCB0b29scy9zcGhpbngKK3N2biBjbyAlU1ZOUk9PVCUvZXh0ZXJuYWwvU3BoaW54LTEuMC43L3NwaGlueCB0b29scy9zcGhpbngKIHN2biBjbyAlU1ZOUk9PVCUvZXh0ZXJuYWwvZG9jdXRpbHMtMC42L2RvY3V0aWxzIHRvb2xzL2RvY3V0aWxzCiBzdm4gY28gJVNWTlJPT1QlL2V4dGVybmFsL0ppbmphLTIuMy4xL2ppbmphMiB0b29scy9qaW5qYTIKIHN2biBjbyAlU1ZOUk9PVCUvZXh0ZXJuYWwvUHlnbWVudHMtMS4zLjEvcHlnbWVudHMgdG9vbHMvcHlnbWVudHMKZGlmZiAtLWdpdCBhL0RvYy9yZWZlcmVuY2UvY29tcG91bmRfc3RtdHMucnN0IGIvRG9jL3JlZmVyZW5jZS9jb21wb3VuZF9zdG10cy5yc3QKaW5kZXggYzk5YjY1YS4uMDgyMzBmYSAxMDA2NDQKLS0tIGEvRG9jL3JlZmVyZW5jZS9jb21wb3VuZF9zdG10cy5yc3QKKysrIGIvRG9jL3JlZmVyZW5jZS9jb21wb3VuZF9zdG10cy5yc3QKQEAgLTIzOCwxMCArMjM4LDcgQEAKIGV4cHJlc3Npb24sIHRoYXQgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQsIGFuZCB0aGUgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbgogaWYgdGhlIHJlc3VsdGluZyBvYmplY3QgaXMgImNvbXBhdGlibGUiIHdpdGggdGhlIGV4Y2VwdGlvbi4gIEFuIG9iamVjdCBpcwogY29tcGF0aWJsZSB3aXRoIGFuIGV4Y2VwdGlvbiBpZiBpdCBpcyB0aGUgY2xhc3Mgb3IgYSBiYXNlIGNsYXNzIG9mIHRoZSBleGNlcHRpb24KLW9iamVjdCwgYSB0dXBsZSBjb250YWluaW5nIGFuIGl0ZW0gY29tcGF0aWJsZSB3aXRoIHRoZSBleGNlcHRpb24sIG9yLCBpbiB0aGUKLShkZXByZWNhdGVkKSBjYXNlIG9mIHN0cmluZyBleGNlcHRpb25zLCBpcyB0aGUgcmFpc2VkIHN0cmluZyBpdHNlbGYgKG5vdGUgdGhhdAotdGhlIG9iamVjdCBpZGVudGl0aWVzIG11c3QgbWF0Y2gsIGkuZS4gaXQgbXVzdCBiZSB0aGUgc2FtZSBzdHJpbmcgb2JqZWN0LCBub3QKLWp1c3QgYSBzdHJpbmcgd2l0aCB0aGUgc2FtZSB2YWx1ZSkuCitvYmplY3QsIG9yIGEgdHVwbGUgY29udGFpbmluZyBhbiBpdGVtIGNvbXBhdGlibGUgd2l0aCB0aGUgZXhjZXB0aW9uLgogCiBJZiBubyBleGNlcHQgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiwgdGhlIHNlYXJjaCBmb3IgYW4gZXhjZXB0aW9uIGhhbmRsZXIKIGNvbnRpbnVlcyBpbiB0aGUgc3Vycm91bmRpbmcgY29kZSBhbmQgb24gdGhlIGludm9jYXRpb24gc3RhY2suICBbI11fCkBAIC0yOTcsOCArMjk0LDE5IEBACiBpcyBleGVjdXRlZC4gIElmIHRoZXJlIGlzIGEgc2F2ZWQgZXhjZXB0aW9uLCBpdCBpcyByZS1yYWlzZWQgYXQgdGhlIGVuZCBvZiB0aGUKIDprZXl3b3JkOmBmaW5hbGx5YCBjbGF1c2UuIElmIHRoZSA6a2V5d29yZDpgZmluYWxseWAgY2xhdXNlIHJhaXNlcyBhbm90aGVyCiBleGNlcHRpb24gb3IgZXhlY3V0ZXMgYSA6a2V5d29yZDpgcmV0dXJuYCBvciA6a2V5d29yZDpgYnJlYWtgIHN0YXRlbWVudCwgdGhlCi1zYXZlZCBleGNlcHRpb24gaXMgbG9zdC4gIFRoZSBleGNlcHRpb24gaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSB0byB0aGUKLXByb2dyYW0gZHVyaW5nIGV4ZWN1dGlvbiBvZiB0aGUgOmtleXdvcmQ6YGZpbmFsbHlgIGNsYXVzZS4KK3NhdmVkIGV4Y2VwdGlvbiBpcyBkaXNjYXJkZWQ6OgorCisgICA+Pj4gZGVmIGYoKToKKyAgIC4uLiAgICAgdHJ5OgorICAgLi4uICAgICAgICAgMS8wCisgICAuLi4gICAgIGZpbmFsbHk6CisgICAuLi4gICAgICAgICByZXR1cm4gNDIKKyAgIC4uLgorICAgPj4+IGYoKQorICAgNDIKKworVGhlIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIHRvIHRoZSBwcm9ncmFtIGR1cmluZyBleGVjdXRpb24gb2YKK3RoZSA6a2V5d29yZDpgZmluYWxseWAgY2xhdXNlLgogCiAuLiBpbmRleDo6CiAgICBzdGF0ZW1lbnQ6IHJldHVybgpAQCAtMzEyLDYgKzMyMCwyMCBAQAogcmVhc29uIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIC0tLSB0aGlzIHJlc3RyaWN0aW9uIG1heSBiZQogbGlmdGVkIGluIHRoZSBmdXR1cmUpLgogCitUaGUgcmV0dXJuIHZhbHVlIG9mIGEgZnVuY3Rpb24gaXMgZGV0ZXJtaW5lZCBieSB0aGUgbGFzdCA6a2V5d29yZDpgcmV0dXJuYAorc3RhdGVtZW50IGV4ZWN1dGVkLiAgU2luY2UgdGhlIDprZXl3b3JkOmBmaW5hbGx5YCBjbGF1c2UgYWx3YXlzIGV4ZWN1dGVzLCBhCis6a2V5d29yZDpgcmV0dXJuYCBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIDprZXl3b3JkOmBmaW5hbGx5YCBjbGF1c2Ugd2lsbAorYWx3YXlzIGJlIHRoZSBsYXN0IG9uZSBleGVjdXRlZDo6CisKKyAgID4+PiBkZWYgZm9vKCk6CisgICAuLi4gICAgIHRyeToKKyAgIC4uLiAgICAgICAgIHJldHVybiAndHJ5JworICAgLi4uICAgICBmaW5hbGx5OgorICAgLi4uICAgICAgICAgcmV0dXJuICdmaW5hbGx5JworICAgLi4uCisgICA+Pj4gZm9vKCkKKyAgICdmaW5hbGx5JworCiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGV4Y2VwdGlvbnMgY2FuIGJlIGZvdW5kIGluIHNlY3Rpb24gOnJlZjpgZXhjZXB0aW9uc2AsCiBhbmQgaW5mb3JtYXRpb24gb24gdXNpbmcgdGhlIDprZXl3b3JkOmByYWlzZWAgc3RhdGVtZW50IHRvIGdlbmVyYXRlIGV4Y2VwdGlvbnMKIG1heSBiZSBmb3VuZCBpbiBzZWN0aW9uIDpyZWY6YHJhaXNlYC4KQEAgLTMyMyw3ICszNDUsOSBAQAogVGhlIDprZXl3b3JkOmB3aXRoYCBzdGF0ZW1lbnQKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLS4uIGluZGV4Ojogc3RhdGVtZW50OiB3aXRoCisuLiBpbmRleDo6CisgICAgc3RhdGVtZW50OiB3aXRoCisgICAgc2luZ2xlOiBhczsgd2l0aCBzdGF0ZW1lbnQKIAogLi4gdmVyc2lvbmFkZGVkOjogMi41CiAKQEAgLTM5OSw2ICs0MjMsOSBAQAogICAgICAgc3RhdGVtZW50LgogCiAKKy4uIGluZGV4OjoKKyAgIHNpbmdsZTogcGFyYW1ldGVyOyBmdW5jdGlvbiBkZWZpbml0aW9uCisKIC4uIF9mdW5jdGlvbjoKIC4uIF9kZWY6CiAKQEAgLTQyMyw3ICs0NTAsNyBAQAogICAgZnVuY2RlZjogImRlZiIgYGZ1bmNuYW1lYCAiKCIgW2BwYXJhbWV0ZXJfbGlzdGBdICIpIiAiOiIgYHN1aXRlYAogICAgZG90dGVkX25hbWU6IGBpZGVudGlmaWVyYCAoIi4iIGBpZGVudGlmaWVyYCkqCiAgICBwYXJhbWV0ZXJfbGlzdDogKGBkZWZwYXJhbWV0ZXJgICIsIikqCi0gICAgICAgICAgICAgICAgIDogKCAgIioiIGBpZGVudGlmaWVyYCBbLCAiKioiIGBpZGVudGlmaWVyYF0KKyAgICAgICAgICAgICAgICAgOiAoICAiKiIgYGlkZW50aWZpZXJgIFsiLCIgIioqIiBgaWRlbnRpZmllcmBdCiAgICAgICAgICAgICAgICAgIDogfCAiKioiIGBpZGVudGlmaWVyYAogICAgICAgICAgICAgICAgICA6IHwgYGRlZnBhcmFtZXRlcmAgWyIsIl0gKQogICAgZGVmcGFyYW1ldGVyOiBgcGFyYW1ldGVyYCBbIj0iIGBleHByZXNzaW9uYF0KQEAgLTQ1OSwxMiArNDg2LDE1IEBACiAgICBkZWYgZnVuYygpOiBwYXNzCiAgICBmdW5jID0gZjEoYXJnKShmMihmdW5jKSkKIAotLi4gaW5kZXg6OiB0cmlwbGU6IGRlZmF1bHQ7IHBhcmFtZXRlcjsgdmFsdWUKKy4uIGluZGV4OjoKKyAgIHRyaXBsZTogZGVmYXVsdDsgcGFyYW1ldGVyOyB2YWx1ZQorICAgc2luZ2xlOiBhcmd1bWVudDsgZnVuY3Rpb24gZGVmaW5pdGlvbgogCi1XaGVuIG9uZSBvciBtb3JlIHRvcC1sZXZlbCBwYXJhbWV0ZXJzIGhhdmUgdGhlIGZvcm0gKnBhcmFtZXRlciogYGA9YGAKLSpleHByZXNzaW9uKiwgdGhlIGZ1bmN0aW9uIGlzIHNhaWQgdG8gaGF2ZSAiZGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzLiIgIEZvciBhCi1wYXJhbWV0ZXIgd2l0aCBhIGRlZmF1bHQgdmFsdWUsIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50IG1heSBiZSBvbWl0dGVkIGZyb20gYQotY2FsbCwgaW4gd2hpY2ggY2FzZSB0aGUgcGFyYW1ldGVyJ3MgZGVmYXVsdCB2YWx1ZSBpcyBzdWJzdGl0dXRlZC4gIElmIGEKK1doZW4gb25lIG9yIG1vcmUgdG9wLWxldmVsIDp0ZXJtOmBwYXJhbWV0ZXJzIDxwYXJhbWV0ZXI+YCBoYXZlIHRoZSBmb3JtCisqcGFyYW1ldGVyKiBgYD1gYCAqZXhwcmVzc2lvbiosIHRoZSBmdW5jdGlvbiBpcyBzYWlkIHRvIGhhdmUgImRlZmF1bHQgcGFyYW1ldGVyCit2YWx1ZXMuIiAgRm9yIGEgcGFyYW1ldGVyIHdpdGggYSBkZWZhdWx0IHZhbHVlLCB0aGUgY29ycmVzcG9uZGluZworOnRlcm06YGFyZ3VtZW50YCBtYXkgYmUgb21pdHRlZCBmcm9tIGEgY2FsbCwgaW4gd2hpY2gKK2Nhc2UgdGhlIHBhcmFtZXRlcidzIGRlZmF1bHQgdmFsdWUgaXMgc3Vic3RpdHV0ZWQuICBJZiBhCiBwYXJhbWV0ZXIgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgYWxsIGZvbGxvd2luZyBwYXJhbWV0ZXJzIG11c3QgYWxzbyBoYXZlIGEgZGVmYXVsdAogdmFsdWUgLS0tIHRoaXMgaXMgYSBzeW50YWN0aWMgcmVzdHJpY3Rpb24gdGhhdCBpcyBub3QgZXhwcmVzc2VkIGJ5IHRoZSBncmFtbWFyLgogCkBAIC00OTUsMTQgKzUyNSwxNCBAQAogdGhlIGZvcm0gImBgKippZGVudGlmaWVyYGAiIGlzIHByZXNlbnQsIGl0IGlzIGluaXRpYWxpemVkIHRvIGEgbmV3IGRpY3Rpb25hcnkKIHJlY2VpdmluZyBhbnkgZXhjZXNzIGtleXdvcmQgYXJndW1lbnRzLCBkZWZhdWx0aW5nIHRvIGEgbmV3IGVtcHR5IGRpY3Rpb25hcnkuCiAKLS4uIGluZGV4OjogcGFpcjogbGFtYmRhOyBmb3JtCisuLiBpbmRleDo6IHBhaXI6IGxhbWJkYTsgZXhwcmVzc2lvbgogCiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGNyZWF0ZSBhbm9ueW1vdXMgZnVuY3Rpb25zIChmdW5jdGlvbnMgbm90IGJvdW5kIHRvIGEKLW5hbWUpLCBmb3IgaW1tZWRpYXRlIHVzZSBpbiBleHByZXNzaW9ucy4gIFRoaXMgdXNlcyBsYW1iZGEgZm9ybXMsIGRlc2NyaWJlZCBpbgotc2VjdGlvbiA6cmVmOmBsYW1iZGFgLiAgTm90ZSB0aGF0IHRoZSBsYW1iZGEgZm9ybSBpcyBtZXJlbHkgYSBzaG9ydGhhbmQgZm9yIGEKK25hbWUpLCBmb3IgaW1tZWRpYXRlIHVzZSBpbiBleHByZXNzaW9ucy4gIFRoaXMgdXNlcyBsYW1iZGEgZXhwcmVzc2lvbnMsIGRlc2NyaWJlZCBpbgorc2VjdGlvbiA6cmVmOmBsYW1iZGFgLiAgTm90ZSB0aGF0IHRoZSBsYW1iZGEgZXhwcmVzc2lvbiBpcyBtZXJlbHkgYSBzaG9ydGhhbmQgZm9yIGEKIHNpbXBsaWZpZWQgZnVuY3Rpb24gZGVmaW5pdGlvbjsgYSBmdW5jdGlvbiBkZWZpbmVkIGluIGEgIjprZXl3b3JkOmBkZWZgIgogc3RhdGVtZW50IGNhbiBiZSBwYXNzZWQgYXJvdW5kIG9yIGFzc2lnbmVkIHRvIGFub3RoZXIgbmFtZSBqdXN0IGxpa2UgYSBmdW5jdGlvbgotZGVmaW5lZCBieSBhIGxhbWJkYSBmb3JtLiAgVGhlICI6a2V5d29yZDpgZGVmYCIgZm9ybSBpcyBhY3R1YWxseSBtb3JlIHBvd2VyZnVsCitkZWZpbmVkIGJ5IGEgbGFtYmRhIGV4cHJlc3Npb24uICBUaGUgIjprZXl3b3JkOmBkZWZgIiBmb3JtIGlzIGFjdHVhbGx5IG1vcmUgcG93ZXJmdWwKIHNpbmNlIGl0IGFsbG93cyB0aGUgZXhlY3V0aW9uIG9mIG11bHRpcGxlIHN0YXRlbWVudHMuCiAKICoqUHJvZ3JhbW1lcidzIG5vdGU6KiogRnVuY3Rpb25zIGFyZSBmaXJzdC1jbGFzcyBvYmplY3RzLiAgQSAiYGBkZWZgYCIgZm9ybQpkaWZmIC0tZ2l0IGEvRG9jL3JlZmVyZW5jZS9kYXRhbW9kZWwucnN0IGIvRG9jL3JlZmVyZW5jZS9kYXRhbW9kZWwucnN0CmluZGV4IDBjZDRjNjIuLmZkY2QyZmQgMTAwNjQ0Ci0tLSBhL0RvYy9yZWZlcmVuY2UvZGF0YW1vZGVsLnJzdAorKysgYi9Eb2MvcmVmZXJlbmNlL2RhdGFtb2RlbC5yc3QKQEAgLTIwNyw3ICsyMDcsNyBAQAogICAgICAgICAgICAgc2luZ2xlOiBUcnVlCiAKICAgICAgICAgIFRoZXNlIHJlcHJlc2VudCB0aGUgdHJ1dGggdmFsdWVzIEZhbHNlIGFuZCBUcnVlLiAgVGhlIHR3byBvYmplY3RzCi0gICAgICAgICByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyBGYWxzZSBhbmQgVHJ1ZSBhcmUgdGhlIG9ubHkgQm9vbGVhbiBvYmplY3RzLgorICAgICAgICAgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgYGBGYWxzZWBgIGFuZCBgYFRydWVgYCBhcmUgdGhlIG9ubHkgQm9vbGVhbiBvYmplY3RzLgogICAgICAgICAgVGhlIEJvb2xlYW4gdHlwZSBpcyBhIHN1YnR5cGUgb2YgcGxhaW4gaW50ZWdlcnMsIGFuZCBCb29sZWFuIHZhbHVlcwogICAgICAgICAgYmVoYXZlIGxpa2UgdGhlIHZhbHVlcyAwIGFuZCAxLCByZXNwZWN0aXZlbHksIGluIGFsbW9zdCBhbGwgY29udGV4dHMsCiAgICAgICAgICB0aGUgZXhjZXB0aW9uIGJlaW5nIHRoYXQgd2hlbiBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcsIHRoZSBzdHJpbmdzCkBAIC0zNTYsOCArMzU2LDYgQEAKICAgICAgICAgIG9iamVjdDogbXV0YWJsZSBzZXF1ZW5jZQogICAgICAgICAgb2JqZWN0OiBtdXRhYmxlCiAgICAgICAgICBwYWlyOiBhc3NpZ25tZW50OyBzdGF0ZW1lbnQKLSAgICAgICAgIHNpbmdsZTogZGVsZXRlCi0gICAgICAgICBzdGF0ZW1lbnQ6IGRlbAogICAgICAgICAgc2luZ2xlOiBzdWJzY3JpcHRpb24KICAgICAgICAgIHNpbmdsZTogc2xpY2luZwogCkBAIC00MTEsNyArNDA5LDcgQEAKIAogICAgICAgVGhlc2UgcmVwcmVzZW50IGEgbXV0YWJsZSBzZXQuIFRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlIGJ1aWx0LWluIDpmdW5jOmBzZXRgCiAgICAgICBjb25zdHJ1Y3RvciBhbmQgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgYnkgc2V2ZXJhbCBtZXRob2RzLCBzdWNoIGFzCi0gICAgICA6bWV0aDpgYWRkYC4KKyAgICAgIDptZXRoOmB+c2V0LmFkZGAuCiAKICAgIEZyb3plbiBzZXRzCiAgICAgICAuLiBpbmRleDo6IG9iamVjdDogZnJvemVuc2V0CkBAIC00ODEsNDcgKzQ3OSw0NCBAQAogCiAgICAgICBTcGVjaWFsIGF0dHJpYnV0ZXM6CiAKKyAgICAgIC4uIHRhYnVsYXJjb2x1bW5zOjogfGx8THxsfAorCiAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsKICAgICAgIHwgQXR0cmlidXRlICAgICAgICAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfAogICAgICAgKz09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT0rCi0gICAgICB8IDphdHRyOmBmdW5jX2RvY2AgICAgICB8IFRoZSBmdW5jdGlvbidzIGRvY3VtZW50YXRpb24gIHwgV3JpdGFibGUgIHwKLSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nLCBvciBgYE5vbmVgYCBpZiAgICAgICAgfCAgICAgICAgICAgfAotICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfCB1bmF2YWlsYWJsZSAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8CisgICAgICB8IDphdHRyOmBfX2RvY19fYCAgICAgICB8IFRoZSBmdW5jdGlvbidzIGRvY3VtZW50YXRpb24gIHwgV3JpdGFibGUgIHwKKyAgICAgIHwgOmF0dHI6YGZ1bmNfZG9jYCAgICAgIHwgc3RyaW5nLCBvciBgYE5vbmVgYCBpZiAgICAgICAgfCAgICAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfCB1bmF2YWlsYWJsZS4gICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8CiAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsKLSAgICAgIHwgOmF0dHI6YF9fZG9jX19gICAgICAgIHwgQW5vdGhlciB3YXkgb2Ygc3BlbGxpbmcgICAgICAgfCBXcml0YWJsZSAgfAotICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfCA6YXR0cjpgZnVuY19kb2NgICAgICAgICAgICAgICB8ICAgICAgICAgICB8Ci0gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsKLSAgICAgIHwgOmF0dHI6YGZ1bmNfbmFtZWAgICAgIHwgVGhlIGZ1bmN0aW9uJ3MgbmFtZSAgICAgICAgICAgfCBXcml0YWJsZSAgfAotICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCi0gICAgICB8IDphdHRyOmBfX25hbWVfX2AgICAgICB8IEFub3RoZXIgd2F5IG9mIHNwZWxsaW5nICAgICAgIHwgV3JpdGFibGUgIHwKLSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwgOmF0dHI6YGZ1bmNfbmFtZWAgICAgICAgICAgICAgfCAgICAgICAgICAgfAorICAgICAgfCA6YXR0cjpgX19uYW1lX19gICAgICAgfCBUaGUgZnVuY3Rpb24ncyBuYW1lLiAgICAgICAgICB8IFdyaXRhYmxlICB8CisgICAgICB8IDphdHRyOmBmdW5jX25hbWVgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwKICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKwogICAgICAgfCA6YXR0cjpgX19tb2R1bGVfX2AgICAgfCBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRoZSAgICB8IFdyaXRhYmxlICB8CiAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8IGZ1bmN0aW9uIHdhcyBkZWZpbmVkIGluLCBvciAgIHwgICAgICAgICAgIHwKICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwgYGBOb25lYGAgaWYgdW5hdmFpbGFibGUuICAgICAgfCAgICAgICAgICAgfAogICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCi0gICAgICB8IDphdHRyOmBmdW5jX2RlZmF1bHRzYCB8IEEgdHVwbGUgY29udGFpbmluZyBkZWZhdWx0ICAgIHwgV3JpdGFibGUgIHwKLSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwgYXJndW1lbnQgdmFsdWVzIGZvciB0aG9zZSAgICAgfCAgICAgICAgICAgfAorICAgICAgfCA6YXR0cjpgX19kZWZhdWx0c19fYCAgfCBBIHR1cGxlIGNvbnRhaW5pbmcgZGVmYXVsdCAgICB8IFdyaXRhYmxlICB8CisgICAgICB8IDphdHRyOmBmdW5jX2RlZmF1bHRzYCB8IGFyZ3VtZW50IHZhbHVlcyBmb3IgdGhvc2UgICAgIHwgICAgICAgICAgIHwKICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwgYXJndW1lbnRzIHRoYXQgaGF2ZSBkZWZhdWx0cywgfCAgICAgICAgICAgfAogICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfCBvciBgYE5vbmVgYCBpZiBubyBhcmd1bWVudHMgICB8ICAgICAgICAgICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8IGhhdmUgYSBkZWZhdWx0IHZhbHVlICAgICAgICAgIHwgICAgICAgICAgIHwKKyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwgaGF2ZSBhIGRlZmF1bHQgdmFsdWUuICAgICAgICAgfCAgICAgICAgICAgfAogICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCi0gICAgICB8IDphdHRyOmBmdW5jX2NvZGVgICAgICB8IFRoZSBjb2RlIG9iamVjdCByZXByZXNlbnRpbmcgIHwgV3JpdGFibGUgIHwKLSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uIGJvZHkuICAgfCAgICAgICAgICAgfAorICAgICAgfCA6YXR0cjpgX19jb2RlX19gICAgICAgfCBUaGUgY29kZSBvYmplY3QgcmVwcmVzZW50aW5nICB8IFdyaXRhYmxlICB8CisgICAgICB8IDphdHRyOmBmdW5jX2NvZGVgICAgICB8IHRoZSBjb21waWxlZCBmdW5jdGlvbiBib2R5LiAgIHwgICAgICAgICAgIHwKICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKwotICAgICAgfCA6YXR0cjpgZnVuY19nbG9iYWxzYCAgfCBBIHJlZmVyZW5jZSB0byB0aGUgZGljdGlvbmFyeSB8IFJlYWQtb25seSB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8IHRoYXQgaG9sZHMgdGhlIGZ1bmN0aW9uJ3MgICAgIHwgICAgICAgICAgIHwKKyAgICAgIHwgOmF0dHI6YF9fZ2xvYmFsc19fYCAgIHwgQSByZWZlcmVuY2UgdG8gdGhlIGRpY3Rpb25hcnkgfCBSZWFkLW9ubHkgfAorICAgICAgfCA6YXR0cjpgZnVuY19nbG9iYWxzYCAgfCB0aGF0IGhvbGRzIHRoZSBmdW5jdGlvbidzICAgICB8ICAgICAgICAgICB8CiAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8IGdsb2JhbCB2YXJpYWJsZXMgLS0tIHRoZSAgICAgIHwgICAgICAgICAgIHwKICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwgZ2xvYmFsIG5hbWVzcGFjZSBvZiB0aGUgICAgICAgfCAgICAgICAgICAgfAogICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfCBtb2R1bGUgaW4gd2hpY2ggdGhlIGZ1bmN0aW9uICB8ICAgICAgICAgICB8CiAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8IHdhcyBkZWZpbmVkLiAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwKICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKwotICAgICAgfCA6YXR0cjpgZnVuY19kaWN0YCAgICAgfCBUaGUgbmFtZXNwYWNlIHN1cHBvcnRpbmcgICAgICB8IFdyaXRhYmxlICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8IGFyYml0cmFyeSBmdW5jdGlvbiAgICAgICAgICAgIHwgICAgICAgICAgIHwKKyAgICAgIHwgOmF0dHI6YF9fZGljdF9fYCAgICAgIHwgVGhlIG5hbWVzcGFjZSBzdXBwb3J0aW5nICAgICAgfCBXcml0YWJsZSAgfAorICAgICAgfCA6YXR0cjpgZnVuY19kaWN0YCAgICAgfCBhcmJpdHJhcnkgZnVuY3Rpb24gICAgICAgICAgICB8ICAgICAgICAgICB8CiAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8IGF0dHJpYnV0ZXMuICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwKICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKwotICAgICAgfCA6YXR0cjpgZnVuY19jbG9zdXJlYCAgfCBgYE5vbmVgYCBvciBhIHR1cGxlIG9mIGNlbGxzICB8IFJlYWQtb25seSB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8IHRoYXQgY29udGFpbiBiaW5kaW5ncyBmb3IgdGhlIHwgICAgICAgICAgIHwKKyAgICAgIHwgOmF0dHI6YF9fY2xvc3VyZV9fYCAgIHwgYGBOb25lYGAgb3IgYSB0dXBsZSBvZiBjZWxscyAgfCBSZWFkLW9ubHkgfAorICAgICAgfCA6YXR0cjpgZnVuY19jbG9zdXJlYCAgfCB0aGF0IGNvbnRhaW4gYmluZGluZ3MgZm9yIHRoZSB8ICAgICAgICAgICB8CiAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8IGZ1bmN0aW9uJ3MgZnJlZSB2YXJpYWJsZXMuICAgIHwgICAgICAgICAgIHwKICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKwogCkBAIC01MzAsNiArNTI1LDEyIEBACiAgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNAogICAgICAgICAgYGBmdW5jX25hbWVgYCBpcyBub3cgd3JpdGFibGUuCiAKKyAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMi42CisgICAgICAgICBUaGUgZG91YmxlLXVuZGVyc2NvcmUgYXR0cmlidXRlcyBgYF9fY2xvc3VyZV9fYGAsIGBgX19jb2RlX19gYCwKKyAgICAgICAgIGBgX19kZWZhdWx0c19fYGAsIGFuZCBgYF9fZ2xvYmFsc19fYGAgd2VyZSBpbnRyb2R1Y2VkIGFzIGFsaWFzZXMgZm9yCisgICAgICAgICB0aGUgY29ycmVzcG9uZGluZyBgYGZ1bmNfKmBgIGF0dHJpYnV0ZXMgZm9yIGZvcndhcmRzIGNvbXBhdGliaWxpdHkKKyAgICAgICAgIHdpdGggUHl0aG9uIDMuCisKICAgICAgIEZ1bmN0aW9uIG9iamVjdHMgYWxzbyBzdXBwb3J0IGdldHRpbmcgYW5kIHNldHRpbmcgYXJiaXRyYXJ5IGF0dHJpYnV0ZXMsIHdoaWNoCiAgICAgICBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIGF0dGFjaCBtZXRhZGF0YSB0byBmdW5jdGlvbnMuICBSZWd1bGFyIGF0dHJpYnV0ZQogICAgICAgZG90LW5vdGF0aW9uIGlzIHVzZWQgdG8gZ2V0IGFuZCBzZXQgc3VjaCBhdHRyaWJ1dGVzLiAqTm90ZSB0aGF0IHRoZSBjdXJyZW50CkBAIC01NDAsMTYgKzU0MSwyMSBAQAogICAgICAgY29kZSBvYmplY3Q7IHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgaW50ZXJuYWwgdHlwZXMgYmVsb3cuCiAKICAgICAgIC4uIGluZGV4OjoKLSAgICAgICAgIHNpbmdsZTogZnVuY19kb2MgKGZ1bmN0aW9uIGF0dHJpYnV0ZSkKICAgICAgICAgIHNpbmdsZTogX19kb2NfXyAoZnVuY3Rpb24gYXR0cmlidXRlKQogICAgICAgICAgc2luZ2xlOiBfX25hbWVfXyAoZnVuY3Rpb24gYXR0cmlidXRlKQogICAgICAgICAgc2luZ2xlOiBfX21vZHVsZV9fIChmdW5jdGlvbiBhdHRyaWJ1dGUpCiAgICAgICAgICBzaW5nbGU6IF9fZGljdF9fIChmdW5jdGlvbiBhdHRyaWJ1dGUpCisgICAgICAgICBzaW5nbGU6IF9fZGVmYXVsdHNfXyAoZnVuY3Rpb24gYXR0cmlidXRlKQorICAgICAgICAgc2luZ2xlOiBfX2NvZGVfXyAoZnVuY3Rpb24gYXR0cmlidXRlKQorICAgICAgICAgc2luZ2xlOiBfX2dsb2JhbHNfXyAoZnVuY3Rpb24gYXR0cmlidXRlKQorICAgICAgICAgc2luZ2xlOiBfX2Nsb3N1cmVfXyAoZnVuY3Rpb24gYXR0cmlidXRlKQorICAgICAgICAgc2luZ2xlOiBmdW5jX2RvYyAoZnVuY3Rpb24gYXR0cmlidXRlKQorICAgICAgICAgc2luZ2xlOiBmdW5jX25hbWUgKGZ1bmN0aW9uIGF0dHJpYnV0ZSkKKyAgICAgICAgIHNpbmdsZTogZnVuY19kaWN0IChmdW5jdGlvbiBhdHRyaWJ1dGUpCiAgICAgICAgICBzaW5nbGU6IGZ1bmNfZGVmYXVsdHMgKGZ1bmN0aW9uIGF0dHJpYnV0ZSkKLSAgICAgICAgIHNpbmdsZTogZnVuY19jbG9zdXJlIChmdW5jdGlvbiBhdHRyaWJ1dGUpCiAgICAgICAgICBzaW5nbGU6IGZ1bmNfY29kZSAoZnVuY3Rpb24gYXR0cmlidXRlKQogICAgICAgICAgc2luZ2xlOiBmdW5jX2dsb2JhbHMgKGZ1bmN0aW9uIGF0dHJpYnV0ZSkKLSAgICAgICAgIHNpbmdsZTogZnVuY19kaWN0IChmdW5jdGlvbiBhdHRyaWJ1dGUpCisgICAgICAgICBzaW5nbGU6IGZ1bmNfY2xvc3VyZSAoZnVuY3Rpb24gYXR0cmlidXRlKQogICAgICAgICAgcGFpcjogZ2xvYmFsOyBuYW1lc3BhY2UKIAogICAgVXNlci1kZWZpbmVkIG1ldGhvZHMKQEAgLTU3Myw3ICs1NzksNyBAQAogICAgICAgICAgOmF0dHI6YGltX3NlbGZgIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGNsYXNzIHRoYXQgZGVmaW5lZCB0aGUgbWV0aG9kLgogCiAgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNgotICAgICAgICAgRm9yIDMuMCBmb3J3YXJkLWNvbXBhdGliaWxpdHksIDphdHRyOmBpbV9mdW5jYCBpcyBhbHNvIGF2YWlsYWJsZSBhcworICAgICAgICAgRm9yIFB5dGhvbiAzIGZvcndhcmQtY29tcGF0aWJpbGl0eSwgOmF0dHI6YGltX2Z1bmNgIGlzIGFsc28gYXZhaWxhYmxlIGFzCiAgICAgICAgICA6YXR0cjpgX19mdW5jX19gLCBhbmQgOmF0dHI6YGltX3NlbGZgIGFzIDphdHRyOmBfX3NlbGZfX2AuCiAKICAgICAgIC4uIGluZGV4OjoKQEAgLTYyMSw5ICs2MjcsOCBAQAogICAgICAgICAgc2luZ2xlOiBpbV9zZWxmIChtZXRob2QgYXR0cmlidXRlKQogCiAgICAgICBXaGVuIGEgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3QgaXMgY3JlYXRlZCBieSByZXRyaWV2aW5nIGEgY2xhc3MgbWV0aG9kIG9iamVjdAotICAgICAgZnJvbSBhIGNsYXNzIG9yIGluc3RhbmNlLCBpdHMgOmF0dHI6YGltX3NlbGZgIGF0dHJpYnV0ZSBpcyB0aGUgY2xhc3MgaXRzZWxmICh0aGUKLSAgICAgIHNhbWUgYXMgdGhlIDphdHRyOmBpbV9jbGFzc2AgYXR0cmlidXRlKSwgYW5kIGl0cyA6YXR0cjpgaW1fZnVuY2AgYXR0cmlidXRlIGlzCi0gICAgICB0aGUgZnVuY3Rpb24gb2JqZWN0IHVuZGVybHlpbmcgdGhlIGNsYXNzIG1ldGhvZC4KKyAgICAgIGZyb20gYSBjbGFzcyBvciBpbnN0YW5jZSwgaXRzIDphdHRyOmBpbV9zZWxmYCBhdHRyaWJ1dGUgaXMgdGhlIGNsYXNzIGl0c2VsZiwgYW5kCisgICAgICBpdHMgOmF0dHI6YGltX2Z1bmNgIGF0dHJpYnV0ZSBpcyB0aGUgZnVuY3Rpb24gb2JqZWN0IHVuZGVybHlpbmcgdGhlIGNsYXNzIG1ldGhvZC4KIAogICAgICAgV2hlbiBhbiB1bmJvdW5kIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0IGlzIGNhbGxlZCwgdGhlIHVuZGVybHlpbmcgZnVuY3Rpb24KICAgICAgICg6YXR0cjpgaW1fZnVuY2ApIGlzIGNhbGxlZCwgd2l0aCB0aGUgcmVzdHJpY3Rpb24gdGhhdCB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdApAQCAtNjYwLDcgKzY2NSw4IEBACiAgICAgICA6cmVmOmB5aWVsZGApIGlzIGNhbGxlZCBhIDpkZm46YGdlbmVyYXRvcgogICAgICAgZnVuY3Rpb25gLiAgU3VjaCBhIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgYWx3YXlzIHJldHVybnMgYW4gaXRlcmF0b3Igb2JqZWN0CiAgICAgICB3aGljaCBjYW4gYmUgdXNlZCB0byBleGVjdXRlIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbjogIGNhbGxpbmcgdGhlIGl0ZXJhdG9yJ3MKLSAgICAgIDptZXRoOmBuZXh0YCBtZXRob2Qgd2lsbCBjYXVzZSB0aGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSB1bnRpbCBpdCBwcm92aWRlcyBhIHZhbHVlCisgICAgICA6bWV0aDpgfml0ZXJhdG9yLm5leHRgIG1ldGhvZCB3aWxsIGNhdXNlIHRoZSBmdW5jdGlvbiB0byBleGVjdXRlIHVudGlsCisgICAgICBpdCBwcm92aWRlcyBhIHZhbHVlCiAgICAgICB1c2luZyB0aGUgOmtleXdvcmQ6YHlpZWxkYCBzdGF0ZW1lbnQuICBXaGVuIHRoZSBmdW5jdGlvbiBleGVjdXRlcyBhCiAgICAgICA6a2V5d29yZDpgcmV0dXJuYCBzdGF0ZW1lbnQgb3IgZmFsbHMgb2ZmIHRoZSBlbmQsIGEgOmV4YzpgU3RvcEl0ZXJhdGlvbmAKICAgICAgIGV4Y2VwdGlvbiBpcyByYWlzZWQgYW5kIHRoZSBpdGVyYXRvciB3aWxsIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzZXQgb2YKQEAgLTc5NSw4ICs4MDEsOCBAQAogICAgYXNzb2NpYXRlZCBjbGFzcyBpcyBlaXRoZXIgOmNsYXNzOmBDYCBvciBvbmUgb2YgaXRzIGJhc2UgY2xhc3NlcywgaXQgaXMKICAgIHRyYW5zZm9ybWVkIGludG8gYW4gdW5ib3VuZCB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCB3aG9zZSA6YXR0cjpgaW1fY2xhc3NgCiAgICBhdHRyaWJ1dGUgaXMgOmNsYXNzOmBDYC4gV2hlbiBpdCB3b3VsZCB5aWVsZCBhIGNsYXNzIG1ldGhvZCBvYmplY3QsIGl0IGlzCi0gICB0cmFuc2Zvcm1lZCBpbnRvIGEgYm91bmQgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3Qgd2hvc2UgOmF0dHI6YGltX2NsYXNzYAotICAgYW5kIDphdHRyOmBpbV9zZWxmYCBhdHRyaWJ1dGVzIGFyZSBib3RoIDpjbGFzczpgQ2AuICBXaGVuIGl0IHdvdWxkIHlpZWxkIGEKKyAgIHRyYW5zZm9ybWVkIGludG8gYSBib3VuZCB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCB3aG9zZQorICAgOmF0dHI6YGltX3NlbGZgIGF0dHJpYnV0ZSBpcyA6Y2xhc3M6YENgLiAgV2hlbiBpdCB3b3VsZCB5aWVsZCBhCiAgICBzdGF0aWMgbWV0aG9kIG9iamVjdCwgaXQgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgb2JqZWN0IHdyYXBwZWQgYnkgdGhlIHN0YXRpYwogICAgbWV0aG9kIG9iamVjdC4gU2VlIHNlY3Rpb24gOnJlZjpgZGVzY3JpcHRvcnNgIGZvciBhbm90aGVyIHdheSBpbiB3aGljaAogICAgYXR0cmlidXRlcyByZXRyaWV2ZWQgZnJvbSBhIGNsYXNzIG1heSBkaWZmZXIgZnJvbSB0aG9zZSBhY3R1YWxseSBjb250YWluZWQgaW4KQEAgLTgyMCwxMCArODI2LDEwIEBACiAKICAgIFNwZWNpYWwgYXR0cmlidXRlczogOmF0dHI6YF9fbmFtZV9fYCBpcyB0aGUgY2xhc3MgbmFtZTsgOmF0dHI6YF9fbW9kdWxlX19gIGlzCiAgICB0aGUgbW9kdWxlIG5hbWUgaW4gd2hpY2ggdGhlIGNsYXNzIHdhcyBkZWZpbmVkOyA6YXR0cjpgX19kaWN0X19gIGlzIHRoZQotICAgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBjbGFzcydzIG5hbWVzcGFjZTsgOmF0dHI6YF9fYmFzZXNfX2AgaXMgYSB0dXBsZQotICAgKHBvc3NpYmx5IGVtcHR5IG9yIGEgc2luZ2xldG9uKSBjb250YWluaW5nIHRoZSBiYXNlIGNsYXNzZXMsIGluIHRoZSBvcmRlciBvZgotICAgdGhlaXIgb2NjdXJyZW5jZSBpbiB0aGUgYmFzZSBjbGFzcyBsaXN0OyA6YXR0cjpgX19kb2NfX2AgaXMgdGhlIGNsYXNzJ3MKLSAgIGRvY3VtZW50YXRpb24gc3RyaW5nLCBvciBOb25lIGlmIHVuZGVmaW5lZC4KKyAgIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgY2xhc3MncyBuYW1lc3BhY2U7IDphdHRyOmB+Y2xhc3MuX19iYXNlc19fYCBpcyBhCisgICB0dXBsZSAocG9zc2libHkgZW1wdHkgb3IgYSBzaW5nbGV0b24pIGNvbnRhaW5pbmcgdGhlIGJhc2UgY2xhc3NlcywgaW4gdGhlCisgICBvcmRlciBvZiB0aGVpciBvY2N1cnJlbmNlIGluIHRoZSBiYXNlIGNsYXNzIGxpc3Q7IDphdHRyOmBfX2RvY19fYCBpcyB0aGUKKyAgIGNsYXNzJ3MgZG9jdW1lbnRhdGlvbiBzdHJpbmcsIG9yIE5vbmUgaWYgdW5kZWZpbmVkLgogCiBDbGFzcyBpbnN0YW5jZXMKICAgIC4uIGluZGV4OjoKQEAgLTg2OCw4ICs4NzQsOCBAQAogICAgICAgc2luZ2xlOiBfX2RpY3RfXyAoaW5zdGFuY2UgYXR0cmlidXRlKQogICAgICAgc2luZ2xlOiBfX2NsYXNzX18gKGluc3RhbmNlIGF0dHJpYnV0ZSkKIAotICAgU3BlY2lhbCBhdHRyaWJ1dGVzOiA6YXR0cjpgX19kaWN0X19gIGlzIHRoZSBhdHRyaWJ1dGUgZGljdGlvbmFyeTsKLSAgIDphdHRyOmBfX2NsYXNzX19gIGlzIHRoZSBpbnN0YW5jZSdzIGNsYXNzLgorICAgU3BlY2lhbCBhdHRyaWJ1dGVzOiA6YXR0cjpgfm9iamVjdC5fX2RpY3RfX2AgaXMgdGhlIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5OworICAgOmF0dHI6YH5pbnN0YW5jZS5fX2NsYXNzX19gIGlzIHRoZSBpbnN0YW5jZSdzIGNsYXNzLgogCiBGaWxlcwogICAgLi4gaW5kZXg6OgpAQCAtMTA2OCw5ICsxMDc0LDkgQEAKICAgICAgICAgIHNpbmdsZTogc3RvcCAoc2xpY2Ugb2JqZWN0IGF0dHJpYnV0ZSkKICAgICAgICAgIHNpbmdsZTogc3RlcCAoc2xpY2Ugb2JqZWN0IGF0dHJpYnV0ZSkKIAotICAgICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogOmF0dHI6YHN0YXJ0YCBpcyB0aGUgbG93ZXIgYm91bmQ7IDphdHRyOmBzdG9wYCBpcwotICAgICAgdGhlIHVwcGVyIGJvdW5kOyA6YXR0cjpgc3RlcGAgaXMgdGhlIHN0ZXAgdmFsdWU7IGVhY2ggaXMgYGBOb25lYGAgaWYgb21pdHRlZC4KLSAgICAgIFRoZXNlIGF0dHJpYnV0ZXMgY2FuIGhhdmUgYW55IHR5cGUuCisgICAgICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiA6YXR0cjpgfnNsaWNlLnN0YXJ0YCBpcyB0aGUgbG93ZXIgYm91bmQ7CisgICAgICA6YXR0cjpgfnNsaWNlLnN0b3BgIGlzIHRoZSB1cHBlciBib3VuZDsgOmF0dHI6YH5zbGljZS5zdGVwYCBpcyB0aGUgc3RlcAorICAgICAgdmFsdWU7IGVhY2ggaXMgYGBOb25lYGAgaWYgb21pdHRlZC4gIFRoZXNlIGF0dHJpYnV0ZXMgY2FuIGhhdmUgYW55IHR5cGUuCiAKICAgICAgIFNsaWNlIG9iamVjdHMgc3VwcG9ydCBvbmUgbWV0aG9kOgogCkBAIC0xMTQ5LDcgKzExNTUsNyBAQAogICAgc2luZ2xlOiBjbGFzczsgY2xhc3NpYwogICAgc2luZ2xlOiBjbGFzczsgb2xkLXN0eWxlCiAKLU9sZC1zdHlsZSBjbGFzc2VzIGFyZSByZW1vdmVkIGluIFB5dGhvbiAzLjAsIGxlYXZpbmcgb25seSB0aGUgc2VtYW50aWNzIG9mCitPbGQtc3R5bGUgY2xhc3NlcyBhcmUgcmVtb3ZlZCBpbiBQeXRob24gMywgbGVhdmluZyBvbmx5IHRoZSBzZW1hbnRpY3Mgb2YKIG5ldy1zdHlsZSBjbGFzc2VzLgogCiAKQEAgLTExNzcsNyArMTE4Myw4IEBACiB0aGUgZW11bGF0aW9uIG9ubHkgYmUgaW1wbGVtZW50ZWQgdG8gdGhlIGRlZ3JlZSB0aGF0IGl0IG1ha2VzIHNlbnNlIGZvciB0aGUKIG9iamVjdCBiZWluZyBtb2RlbGxlZC4gIEZvciBleGFtcGxlLCBzb21lIHNlcXVlbmNlcyBtYXkgd29yayB3ZWxsIHdpdGggcmV0cmlldmFsCiBvZiBpbmRpdmlkdWFsIGVsZW1lbnRzLCBidXQgZXh0cmFjdGluZyBhIHNsaWNlIG1heSBub3QgbWFrZSBzZW5zZS4gIChPbmUgZXhhbXBsZQotb2YgdGhpcyBpcyB0aGUgOmNsYXNzOmBOb2RlTGlzdGAgaW50ZXJmYWNlIGluIHRoZSBXM0MncyBEb2N1bWVudCBPYmplY3QgTW9kZWwuKQorb2YgdGhpcyBpcyB0aGUgOmNsYXNzOmB+eG1sLmRvbS5Ob2RlTGlzdGAgaW50ZXJmYWNlIGluIHRoZSBXM0MncyBEb2N1bWVudAorT2JqZWN0IE1vZGVsLikKIAogCiAuLiBfY3VzdG9taXphdGlvbjoKQEAgLTEyODIsNiArMTI4OSw4IEBACiAgICAgICBtb2R1bGVzIGFyZSBzdGlsbCBhdmFpbGFibGUgYXQgdGhlIHRpbWUgd2hlbiB0aGUgOm1ldGg6YF9fZGVsX19gIG1ldGhvZCBpcwogICAgICAgY2FsbGVkLgogCisgICBTZWUgYWxzbyB0aGUgOm9wdGlvbjpgLVJgIGNvbW1hbmQtbGluZSBvcHRpb24uCisKIAogLi4gbWV0aG9kOjogb2JqZWN0Ll9fcmVwcl9fKHNlbGYpCiAKQEAgLTE0MTEsNyArMTQyMCw3IEBACiAKICAgIFVzZXItZGVmaW5lZCBjbGFzc2VzIGhhdmUgOm1ldGg6YF9fY21wX19gIGFuZCA6bWV0aDpgX19oYXNoX19gIG1ldGhvZHMKICAgIGJ5IGRlZmF1bHQ7IHdpdGggdGhlbSwgYWxsIG9iamVjdHMgY29tcGFyZSB1bmVxdWFsIChleGNlcHQgd2l0aCB0aGVtc2VsdmVzKQotICAgYW5kIGBgeC5fX2hhc2hfXygpYGAgcmV0dXJucyBgYGlkKHgpYGAuCisgICBhbmQgYGB4Ll9faGFzaF9fKClgYCByZXR1cm5zIGEgcmVzdWx0IGRlcml2ZWQgZnJvbSBgYGlkKHgpYGAuCiAKICAgIENsYXNzZXMgd2hpY2ggaW5oZXJpdCBhIDptZXRoOmBfX2hhc2hfX2AgbWV0aG9kIGZyb20gYSBwYXJlbnQgY2xhc3MgYnV0CiAgICBjaGFuZ2UgdGhlIG1lYW5pbmcgb2YgOm1ldGg6YF9fY21wX19gIG9yIDptZXRoOmBfX2VxX19gIHN1Y2ggdGhhdCB0aGUgaGFzaApAQCAtMTgwNywxMCArMTgxNiwxMCBAQAogCiAgICA6cGVwOmAzMTE5YCAtIEludHJvZHVjaW5nIEFic3RyYWN0IEJhc2UgQ2xhc3NlcwogICAgICAgSW5jbHVkZXMgdGhlIHNwZWNpZmljYXRpb24gZm9yIGN1c3RvbWl6aW5nIDpmdW5jOmBpc2luc3RhbmNlYCBhbmQKLSAgICAgIDpmdW5jOmBpc3N1YmNsYXNzYCBiZWhhdmlvciB0aHJvdWdoIDptZXRoOmBfX2luc3RhbmNlY2hlY2tfX2AgYW5kCi0gICAgICA6bWV0aDpgX19zdWJjbGFzc2NoZWNrX19gLCB3aXRoIG1vdGl2YXRpb24gZm9yIHRoaXMgZnVuY3Rpb25hbGl0eSBpbiB0aGUKLSAgICAgIGNvbnRleHQgb2YgYWRkaW5nIEFic3RyYWN0IEJhc2UgQ2xhc3NlcyAoc2VlIHRoZSA6bW9kOmBhYmNgIG1vZHVsZSkgdG8gdGhlCi0gICAgICBsYW5ndWFnZS4KKyAgICAgIDpmdW5jOmBpc3N1YmNsYXNzYCBiZWhhdmlvciB0aHJvdWdoIDptZXRoOmB+Y2xhc3MuX19pbnN0YW5jZWNoZWNrX19gIGFuZAorICAgICAgOm1ldGg6YH5jbGFzcy5fX3N1YmNsYXNzY2hlY2tfX2AsIHdpdGggbW90aXZhdGlvbiBmb3IgdGhpcyBmdW5jdGlvbmFsaXR5CisgICAgICBpbiB0aGUgY29udGV4dCBvZiBhZGRpbmcgQWJzdHJhY3QgQmFzZSBDbGFzc2VzIChzZWUgdGhlIDptb2Q6YGFiY2AKKyAgICAgIG1vZHVsZSkgdG8gdGhlIGxhbmd1YWdlLgogCiAKIC4uIF9jYWxsYWJsZS10eXBlczoKQEAgLTE4NDMsNyArMTg1Miw3IEBACiBpcyBhbHNvIHJlY29tbWVuZGVkIHRoYXQgbWFwcGluZ3MgcHJvdmlkZSB0aGUgbWV0aG9kcyA6bWV0aDpga2V5c2AsCiA6bWV0aDpgdmFsdWVzYCwgOm1ldGg6YGl0ZW1zYCwgOm1ldGg6YGhhc19rZXlgLCA6bWV0aDpgZ2V0YCwgOm1ldGg6YGNsZWFyYCwKIDptZXRoOmBzZXRkZWZhdWx0YCwgOm1ldGg6YGl0ZXJrZXlzYCwgOm1ldGg6YGl0ZXJ2YWx1ZXNgLCA6bWV0aDpgaXRlcml0ZW1zYCwKLTptZXRoOmBwb3BgLCA6bWV0aDpgcG9waXRlbWAsIDptZXRoOmBjb3B5YCwgYW5kIDptZXRoOmB1cGRhdGVgIGJlaGF2aW5nIHNpbWlsYXIKKzptZXRoOmBwb3BgLCA6bWV0aDpgcG9waXRlbWAsIDptZXRoOmAhY29weWAsIGFuZCA6bWV0aDpgdXBkYXRlYCBiZWhhdmluZyBzaW1pbGFyCiB0byB0aG9zZSBmb3IgUHl0aG9uJ3Mgc3RhbmRhcmQgZGljdGlvbmFyeSBvYmplY3RzLiAgVGhlIDptb2Q6YFVzZXJEaWN0YCBtb2R1bGUKIHByb3ZpZGVzIGEgOmNsYXNzOmBEaWN0TWl4aW5gIGNsYXNzIHRvIGhlbHAgY3JlYXRlIHRob3NlIG1ldGhvZHMgZnJvbSBhIGJhc2Ugc2V0CiBvZiA6bWV0aDpgX19nZXRpdGVtX19gLCA6bWV0aDpgX19zZXRpdGVtX19gLCA6bWV0aDpgX19kZWxpdGVtX19gLCBhbmQKQEAgLTIyMzMsNyArMjI0Miw3IEBACiBUaGlzIHNlY3Rpb24gdXNlZCB0byBkb2N1bWVudCB0aGUgcnVsZXMgZm9yIGNvZXJjaW9uLiAgQXMgdGhlIGxhbmd1YWdlIGhhcwogZXZvbHZlZCwgdGhlIGNvZXJjaW9uIHJ1bGVzIGhhdmUgYmVjb21lIGhhcmQgdG8gZG9jdW1lbnQgcHJlY2lzZWx5OyBkb2N1bWVudGluZwogd2hhdCBvbmUgdmVyc2lvbiBvZiBvbmUgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbiBkb2VzIGlzIHVuZGVzaXJhYmxlLiAgSW5zdGVhZCwKLWhlcmUgYXJlIHNvbWUgaW5mb3JtYWwgZ3VpZGVsaW5lcyByZWdhcmRpbmcgY29lcmNpb24uICBJbiBQeXRob24gMy4wLCBjb2VyY2lvbgoraGVyZSBhcmUgc29tZSBpbmZvcm1hbCBndWlkZWxpbmVzIHJlZ2FyZGluZyBjb2VyY2lvbi4gIEluIFB5dGhvbiAzLCBjb2VyY2lvbgogd2lsbCBub3QgYmUgc3VwcG9ydGVkLgogCiAqCmRpZmYgLS1naXQgYS9Eb2MvcmVmZXJlbmNlL2V4cHJlc3Npb25zLnJzdCBiL0RvYy9yZWZlcmVuY2UvZXhwcmVzc2lvbnMucnN0CmluZGV4IDA4NGM2ZTQuLmQzZGMxMTEgMTAwNjQ0Ci0tLSBhL0RvYy9yZWZlcmVuY2UvZXhwcmVzc2lvbnMucnN0CisrKyBiL0RvYy9yZWZlcmVuY2UvZXhwcmVzc2lvbnMucnN0CkBAIC05NiwxNCArOTYsMTMgQEAKIGRlZmluaXRpb24gYmVnaW5zIHdpdGggdHdvIG9yIG1vcmUgdW5kZXJzY29yZSBjaGFyYWN0ZXJzIGFuZCBkb2VzIG5vdCBlbmQgaW4gdHdvCiBvciBtb3JlIHVuZGVyc2NvcmVzLCBpdCBpcyBjb25zaWRlcmVkIGEgOmRmbjpgcHJpdmF0ZSBuYW1lYCBvZiB0aGF0IGNsYXNzLgogUHJpdmF0ZSBuYW1lcyBhcmUgdHJhbnNmb3JtZWQgdG8gYSBsb25nZXIgZm9ybSBiZWZvcmUgY29kZSBpcyBnZW5lcmF0ZWQgZm9yCi10aGVtLiAgVGhlIHRyYW5zZm9ybWF0aW9uIGluc2VydHMgdGhlIGNsYXNzIG5hbWUgaW4gZnJvbnQgb2YgdGhlIG5hbWUsIHdpdGgKLWxlYWRpbmcgdW5kZXJzY29yZXMgcmVtb3ZlZCwgYW5kIGEgc2luZ2xlIHVuZGVyc2NvcmUgaW5zZXJ0ZWQgaW4gZnJvbnQgb2YgdGhlCi1jbGFzcyBuYW1lLiAgRm9yIGV4YW1wbGUsIHRoZSBpZGVudGlmaWVyIGBgX19zcGFtYGAgb2NjdXJyaW5nIGluIGEgY2xhc3MgbmFtZWQKLWBgSGFtYGAgd2lsbCBiZSB0cmFuc2Zvcm1lZCB0byBgYF9IYW1fX3NwYW1gYC4gIFRoaXMgdHJhbnNmb3JtYXRpb24gaXMKLWluZGVwZW5kZW50IG9mIHRoZSBzeW50YWN0aWNhbCBjb250ZXh0IGluIHdoaWNoIHRoZSBpZGVudGlmaWVyIGlzIHVzZWQuICBJZiB0aGUKLXRyYW5zZm9ybWVkIG5hbWUgaXMgZXh0cmVtZWx5IGxvbmcgKGxvbmdlciB0aGFuIDI1NSBjaGFyYWN0ZXJzKSwgaW1wbGVtZW50YXRpb24KLWRlZmluZWQgdHJ1bmNhdGlvbiBtYXkgaGFwcGVuLiAgSWYgdGhlIGNsYXNzIG5hbWUgY29uc2lzdHMgb25seSBvZiB1bmRlcnNjb3JlcywKLW5vIHRyYW5zZm9ybWF0aW9uIGlzIGRvbmUuCit0aGVtLiAgVGhlIHRyYW5zZm9ybWF0aW9uIGluc2VydHMgdGhlIGNsYXNzIG5hbWUsIHdpdGggbGVhZGluZyB1bmRlcnNjb3JlcworcmVtb3ZlZCBhbmQgYSBzaW5nbGUgdW5kZXJzY29yZSBpbnNlcnRlZCwgaW4gZnJvbnQgb2YgdGhlIG5hbWUuICBGb3IgZXhhbXBsZSwKK3RoZSBpZGVudGlmaWVyIGBgX19zcGFtYGAgb2NjdXJyaW5nIGluIGEgY2xhc3MgbmFtZWQgYGBIYW1gYCB3aWxsIGJlIHRyYW5zZm9ybWVkCit0byBgYF9IYW1fX3NwYW1gYC4gIFRoaXMgdHJhbnNmb3JtYXRpb24gaXMgaW5kZXBlbmRlbnQgb2YgdGhlIHN5bnRhY3RpY2FsCitjb250ZXh0IGluIHdoaWNoIHRoZSBpZGVudGlmaWVyIGlzIHVzZWQuICBJZiB0aGUgdHJhbnNmb3JtZWQgbmFtZSBpcyBleHRyZW1lbHkKK2xvbmcgKGxvbmdlciB0aGFuIDI1NSBjaGFyYWN0ZXJzKSwgaW1wbGVtZW50YXRpb24gZGVmaW5lZCB0cnVuY2F0aW9uIG1heSBoYXBwZW4uCitJZiB0aGUgY2xhc3MgbmFtZSBjb25zaXN0cyBvbmx5IG9mIHVuZGVyc2NvcmVzLCBubyB0cmFuc2Zvcm1hdGlvbiBpcyBkb25lLgogCiAKIApAQCAtMTg1LDcgKzE4NCw3IEBACiAgICBsaXN0X2NvbXByZWhlbnNpb246IGBleHByZXNzaW9uYCBgbGlzdF9mb3JgCiAgICBsaXN0X2ZvcjogImZvciIgYHRhcmdldF9saXN0YCAiaW4iIGBvbGRfZXhwcmVzc2lvbl9saXN0YCBbYGxpc3RfaXRlcmBdCiAgICBvbGRfZXhwcmVzc2lvbl9saXN0OiBgb2xkX2V4cHJlc3Npb25gIFsoIiwiIGBvbGRfZXhwcmVzc2lvbmApKyBbIiwiXV0KLSAgIG9sZF9leHByZXNzaW9uOiBgb3JfdGVzdGAgfCBgb2xkX2xhbWJkYV9mb3JtYAorICAgb2xkX2V4cHJlc3Npb246IGBvcl90ZXN0YCB8IGBvbGRfbGFtYmRhX2V4cHJgCiAgICBsaXN0X2l0ZXI6IGBsaXN0X2ZvcmAgfCBgbGlzdF9pZmAKICAgIGxpc3RfaWY6ICJpZiIgYG9sZF9leHByZXNzaW9uYCBbYGxpc3RfaXRlcmBdCiAKQEAgLTQyMSwxMCArNDIwLDE4IEBACiAKIC4uIGluZGV4Ojogb2JqZWN0OiBnZW5lcmF0b3IKIAotVGhlIGZvbGxvd2luZyBnZW5lcmF0b3IncyBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiBhCi1nZW5lcmF0b3IgZnVuY3Rpb246CisKK0dlbmVyYXRvci1pdGVyYXRvciBtZXRob2RzCiteXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorCitUaGlzIHN1YnNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtZXRob2RzIG9mIGEgZ2VuZXJhdG9yIGl0ZXJhdG9yLiAgVGhleSBjYW4KK2JlIHVzZWQgdG8gY29udHJvbCB0aGUgZXhlY3V0aW9uIG9mIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uLgorCitOb3RlIHRoYXQgY2FsbGluZyBhbnkgb2YgdGhlIGdlbmVyYXRvciBtZXRob2RzIGJlbG93IHdoZW4gdGhlIGdlbmVyYXRvcgoraXMgYWxyZWFkeSBleGVjdXRpbmcgcmFpc2VzIGEgOmV4YzpgVmFsdWVFcnJvcmAgZXhjZXB0aW9uLgogCiAuLiBpbmRleDo6IGV4Y2VwdGlvbjogU3RvcEl0ZXJhdGlvbgorLi4gY2xhc3M6OiBnZW5lcmF0b3IKIAogCiAuLiBtZXRob2Q6OiBnZW5lcmF0b3IubmV4dCgpCkBAIC00MzgsNiArNDQ1LDcgQEAKICAgIGV4aXRzIHdpdGhvdXQgeWllbGRpbmcgYW5vdGhlciB2YWx1ZSwgYSA6ZXhjOmBTdG9wSXRlcmF0aW9uYCBleGNlcHRpb24gaXMKICAgIHJhaXNlZC4KIAorLi4gY2xhc3M6OiAuCiAKIC4uIG1ldGhvZDo6IGdlbmVyYXRvci5zZW5kKHZhbHVlKQogCkBAIC02NTQsMjMgKzY2MiwyNCBAQAogY29udmVyc2lvbiBvZiB0aGUgbG9uZSBzbGljZSBpdGVtIGlzIHRoZSBrZXkuICBUaGUgY29udmVyc2lvbiBvZiBhIHNsaWNlIGl0ZW0KIHRoYXQgaXMgYW4gZXhwcmVzc2lvbiBpcyB0aGF0IGV4cHJlc3Npb24uICBUaGUgY29udmVyc2lvbiBvZiBhbiBlbGxpcHNpcyBzbGljZQogaXRlbSBpcyB0aGUgYnVpbHQtaW4gYGBFbGxpcHNpc2BgIG9iamVjdC4gIFRoZSBjb252ZXJzaW9uIG9mIGEgcHJvcGVyIHNsaWNlIGlzIGEKLXNsaWNlIG9iamVjdCAoc2VlIHNlY3Rpb24gOnJlZjpgdHlwZXNgKSB3aG9zZSA6YXR0cjpgc3RhcnRgLCA6YXR0cjpgc3RvcGAgYW5kCi06YXR0cjpgc3RlcGAgYXR0cmlidXRlcyBhcmUgdGhlIHZhbHVlcyBvZiB0aGUgZXhwcmVzc2lvbnMgZ2l2ZW4gYXMgbG93ZXIgYm91bmQsCi11cHBlciBib3VuZCBhbmQgc3RyaWRlLCByZXNwZWN0aXZlbHksIHN1YnN0aXR1dGluZyBgYE5vbmVgYCBmb3IgbWlzc2luZwotZXhwcmVzc2lvbnMuCitzbGljZSBvYmplY3QgKHNlZSBzZWN0aW9uIDpyZWY6YHR5cGVzYCkgd2hvc2UgOmF0dHI6YH5zbGljZS5zdGFydGAsCis6YXR0cjpgfnNsaWNlLnN0b3BgIGFuZCA6YXR0cjpgfnNsaWNlLnN0ZXBgIGF0dHJpYnV0ZXMgYXJlIHRoZSB2YWx1ZXMgb2YgdGhlCitleHByZXNzaW9ucyBnaXZlbiBhcyBsb3dlciBib3VuZCwgdXBwZXIgYm91bmQgYW5kIHN0cmlkZSwgcmVzcGVjdGl2ZWx5LAorc3Vic3RpdHV0aW5nIGBgTm9uZWBgIGZvciBtaXNzaW5nIGV4cHJlc3Npb25zLgogCiAKKy4uIGluZGV4OjoKKyAgIG9iamVjdDogY2FsbGFibGUKKyAgIHNpbmdsZTogY2FsbAorICAgc2luZ2xlOiBhcmd1bWVudDsgY2FsbCBzZW1hbnRpY3MKKwogLi4gX2NhbGxzOgogCiBDYWxscwogLS0tLS0KIAotLi4gaW5kZXg6OiBzaW5nbGU6IGNhbGwKLQotLi4gaW5kZXg6OiBvYmplY3Q6IGNhbGxhYmxlCi0KLUEgY2FsbCBjYWxscyBhIGNhbGxhYmxlIG9iamVjdCAoZS5nLiwgYSBmdW5jdGlvbikgd2l0aCBhIHBvc3NpYmx5IGVtcHR5IHNlcmllcwotb2YgYXJndW1lbnRzOgorQSBjYWxsIGNhbGxzIGEgY2FsbGFibGUgb2JqZWN0IChlLmcuLCBhIDp0ZXJtOmBmdW5jdGlvbmApIHdpdGggYSBwb3NzaWJseSBlbXB0eQorc2VyaWVzIG9mIDp0ZXJtOmBhcmd1bWVudHMgPGFyZ3VtZW50PmA6CiAKIC4uIHByb2R1Y3Rpb25saXN0OjoKICAgIGNhbGw6IGBwcmltYXJ5YCAiKCIgW2Bhcmd1bWVudF9saXN0YCBbIiwiXQpAQCAtNjg5LDEyICs2OTgsMTUgQEAKIEEgdHJhaWxpbmcgY29tbWEgbWF5IGJlIHByZXNlbnQgYWZ0ZXIgdGhlIHBvc2l0aW9uYWwgYW5kIGtleXdvcmQgYXJndW1lbnRzIGJ1dAogZG9lcyBub3QgYWZmZWN0IHRoZSBzZW1hbnRpY3MuCiAKKy4uIGluZGV4OjoKKyAgIHNpbmdsZTogcGFyYW1ldGVyOyBjYWxsIHNlbWFudGljcworCiBUaGUgcHJpbWFyeSBtdXN0IGV2YWx1YXRlIHRvIGEgY2FsbGFibGUgb2JqZWN0ICh1c2VyLWRlZmluZWQgZnVuY3Rpb25zLCBidWlsdC1pbgogZnVuY3Rpb25zLCBtZXRob2RzIG9mIGJ1aWx0LWluIG9iamVjdHMsIGNsYXNzIG9iamVjdHMsIG1ldGhvZHMgb2YgY2xhc3MKIGluc3RhbmNlcywgYW5kIGNlcnRhaW4gY2xhc3MgaW5zdGFuY2VzIHRoZW1zZWx2ZXMgYXJlIGNhbGxhYmxlOyBleHRlbnNpb25zIG1heQogZGVmaW5lIGFkZGl0aW9uYWwgY2FsbGFibGUgb2JqZWN0IHR5cGVzKS4gIEFsbCBhcmd1bWVudCBleHByZXNzaW9ucyBhcmUKIGV2YWx1YXRlZCBiZWZvcmUgdGhlIGNhbGwgaXMgYXR0ZW1wdGVkLiAgUGxlYXNlIHJlZmVyIHRvIHNlY3Rpb24gOnJlZjpgZnVuY3Rpb25gCi1mb3IgdGhlIHN5bnRheCBvZiBmb3JtYWwgcGFyYW1ldGVyIGxpc3RzLgorZm9yIHRoZSBzeW50YXggb2YgZm9ybWFsIDp0ZXJtOmBwYXJhbWV0ZXJgIGxpc3RzLgogCiBJZiBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgcHJlc2VudCwgdGhleSBhcmUgZmlyc3QgY29udmVydGVkIHRvIHBvc2l0aW9uYWwKIGFyZ3VtZW50cywgYXMgZm9sbG93cy4gIEZpcnN0LCBhIGxpc3Qgb2YgdW5maWxsZWQgc2xvdHMgaXMgY3JlYXRlZCBmb3IgdGhlCkBAIC03MTksNyArNzMxLDcgQEAKICAgIEFuIGltcGxlbWVudGF0aW9uIG1heSBwcm92aWRlIGJ1aWx0LWluIGZ1bmN0aW9ucyB3aG9zZSBwb3NpdGlvbmFsIHBhcmFtZXRlcnMKICAgIGRvIG5vdCBoYXZlIG5hbWVzLCBldmVuIGlmIHRoZXkgYXJlICduYW1lZCcgZm9yIHRoZSBwdXJwb3NlIG9mIGRvY3VtZW50YXRpb24sCiAgICBhbmQgd2hpY2ggdGhlcmVmb3JlIGNhbm5vdCBiZSBzdXBwbGllZCBieSBrZXl3b3JkLiAgSW4gQ1B5dGhvbiwgdGhpcyBpcyB0aGUKLSAgIGNhc2UgZm9yIGZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBpbiBDIHRoYXQgdXNlIDpjZnVuYzpgUHlBcmdfUGFyc2VUdXBsZWAgdG8KKyAgIGNhc2UgZm9yIGZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBpbiBDIHRoYXQgdXNlIDpjOmZ1bmM6YFB5QXJnX1BhcnNlVHVwbGVgIHRvCiAgICBwYXJzZSB0aGVpciBhcmd1bWVudHMuCiAKIElmIHRoZXJlIGFyZSBtb3JlIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRoYW4gdGhlcmUgYXJlIGZvcm1hbCBwYXJhbWV0ZXIgc2xvdHMsIGEKQEAgLTEwNDgsOSArMTA2MCw5IEBACiAKIC4uIF9jb21wYXJpc29uczoKIC4uIF9pczoKLS4uIF9pc25vdDoKKy4uIF9pcyBub3Q6CiAuLiBfaW46Ci0uLiBfbm90aW46CisuLiBfbm90IGluOgogCiBDb21wYXJpc29ucwogPT09PT09PT09PT0KQEAgLTEyNDUsNyArMTI1Nyw3IEBACiAKIC4uIHByb2R1Y3Rpb25saXN0OjoKICAgIGNvbmRpdGlvbmFsX2V4cHJlc3Npb246IGBvcl90ZXN0YCBbImlmIiBgb3JfdGVzdGAgImVsc2UiIGBleHByZXNzaW9uYF0KLSAgIGV4cHJlc3Npb246IGBjb25kaXRpb25hbF9leHByZXNzaW9uYCB8IGBsYW1iZGFfZm9ybWAKKyAgIGV4cHJlc3Npb246IGBjb25kaXRpb25hbF9leHByZXNzaW9uYCB8IGBsYW1iZGFfZXhwcmAKIAogQ29uZGl0aW9uYWwgZXhwcmVzc2lvbnMgKHNvbWV0aW1lcyBjYWxsZWQgYSAidGVybmFyeSBvcGVyYXRvciIpIGhhdmUgdGhlIGxvd2VzdAogcHJpb3JpdHkgb2YgYWxsIFB5dGhvbiBvcGVyYXRpb25zLgpAQCAtMTI2NSwxNCArMTI3NywxMyBAQAogCiAuLiBpbmRleDo6CiAgICBwYWlyOiBsYW1iZGE7IGV4cHJlc3Npb24KLSAgIHBhaXI6IGxhbWJkYTsgZm9ybQogICAgcGFpcjogYW5vbnltb3VzOyBmdW5jdGlvbgogCiAuLiBwcm9kdWN0aW9ubGlzdDo6Ci0gICBsYW1iZGFfZm9ybTogImxhbWJkYSIgW2BwYXJhbWV0ZXJfbGlzdGBdOiBgZXhwcmVzc2lvbmAKLSAgIG9sZF9sYW1iZGFfZm9ybTogImxhbWJkYSIgW2BwYXJhbWV0ZXJfbGlzdGBdOiBgb2xkX2V4cHJlc3Npb25gCisgICBsYW1iZGFfZXhwcjogImxhbWJkYSIgW2BwYXJhbWV0ZXJfbGlzdGBdOiBgZXhwcmVzc2lvbmAKKyAgIG9sZF9sYW1iZGFfZXhwcjogImxhbWJkYSIgW2BwYXJhbWV0ZXJfbGlzdGBdOiBgb2xkX2V4cHJlc3Npb25gCiAKLUxhbWJkYSBmb3JtcyAobGFtYmRhIGV4cHJlc3Npb25zKSBoYXZlIHRoZSBzYW1lIHN5bnRhY3RpYyBwb3NpdGlvbiBhcworTGFtYmRhIGV4cHJlc3Npb25zIChzb21ldGltZXMgY2FsbGVkIGxhbWJkYSBmb3JtcykgaGF2ZSB0aGUgc2FtZSBzeW50YWN0aWMgcG9zaXRpb24gYXMKIGV4cHJlc3Npb25zLiAgVGhleSBhcmUgYSBzaG9ydGhhbmQgdG8gY3JlYXRlIGFub255bW91cyBmdW5jdGlvbnM7IHRoZSBleHByZXNzaW9uCiBgYGxhbWJkYSBhcmd1bWVudHM6IGV4cHJlc3Npb25gYCB5aWVsZHMgYSBmdW5jdGlvbiBvYmplY3QuICBUaGUgdW5uYW1lZCBvYmplY3QKIGJlaGF2ZXMgbGlrZSBhIGZ1bmN0aW9uIG9iamVjdCBkZWZpbmVkIHdpdGggOjoKQEAgLTEyODEsNyArMTI5Miw3IEBACiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24KIAogU2VlIHNlY3Rpb24gOnJlZjpgZnVuY3Rpb25gIGZvciB0aGUgc3ludGF4IG9mIHBhcmFtZXRlciBsaXN0cy4gIE5vdGUgdGhhdAotZnVuY3Rpb25zIGNyZWF0ZWQgd2l0aCBsYW1iZGEgZm9ybXMgY2Fubm90IGNvbnRhaW4gc3RhdGVtZW50cy4KK2Z1bmN0aW9ucyBjcmVhdGVkIHdpdGggbGFtYmRhIGV4cHJlc3Npb25zIGNhbm5vdCBjb250YWluIHN0YXRlbWVudHMuCiAKIAogLi4gX2V4cHJsaXN0czoKQEAgLTEzMzIsOCArMTM0Myw4IEBACiAKIC4uIF9vcGVyYXRvci1zdW1tYXJ5OgogCi1TdW1tYXJ5Ci09PT09PT09CitPcGVyYXRvciBwcmVjZWRlbmNlCis9PT09PT09PT09PT09PT09PT09CiAKIC4uIGluZGV4OjogcGFpcjogb3BlcmF0b3I7IHByZWNlZGVuY2UKIApAQCAtMTM1NiwxMCArMTM2NywxMCBAQAogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiB8IDprZXl3b3JkOmBhbmRgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJvb2xlYW4gQU5EICAgICAgICAgICAgICAgICAgICAgICAgIHwKICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCA6a2V5d29yZDpgbm90YCAqeCogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCb29sZWFuIE5PVCAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IDprZXl3b3JkOmBub3RgIGBgeGBgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJvb2xlYW4gTk9UICAgICAgICAgICAgICAgICAgICAgICAgIHwKICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCA6a2V5d29yZDpgaW5gLCA6a2V5d29yZDpgbm90YCA6a2V5d29yZDpgaW5gLCAgfCBDb21wYXJpc29ucywgaW5jbHVkaW5nIG1lbWJlcnNoaXAgICB8Ci18IDprZXl3b3JkOmBpc2AsIDprZXl3b3JkOmBpcyBub3RgLCBgYDxgYCwgICAgICB8IHRlc3RzIGFuZCBpZGVudGl0eSB0ZXN0cywgICAgICAgICAgIHwKK3wgOmtleXdvcmQ6YGluYCwgOmtleXdvcmQ6YG5vdCBpbmAsICAgICAgICAgICAgIHwgQ29tcGFyaXNvbnMsIGluY2x1ZGluZyBtZW1iZXJzaGlwICAgfAorfCA6a2V5d29yZDpgaXNgLCA6a2V5d29yZDpgaXMgbm90YCwgYGA8YGAsICAgICAgfCB0ZXN0cyBhbmQgaWRlbnRpdHkgdGVzdHMgICAgICAgICAgICB8CiB8IGBgPD1gYCwgYGA+YGAsIGBgPj1gYCwgYGA8PmBgLCBgYCE9YGAsIGBgPT1gYCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogfCBgYHxgYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCaXR3aXNlIE9SICAgICAgICAgICAgICAgICAgICAgICAgICB8CkBAIC0xMzg0LDcgKzEzOTUsNyBAQAogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiB8IGBgKGV4cHJlc3Npb25zLi4uKWBgLCAgICAgICAgICAgICAgICAgICAgICAgICB8IEJpbmRpbmcgb3IgdHVwbGUgZGlzcGxheSwgICAgICAgICAgIHwKIHwgYGBbZXhwcmVzc2lvbnMuLi5dYGAsICAgICAgICAgICAgICAgICAgICAgICAgIHwgbGlzdCBkaXNwbGF5LCAgICAgICAgICAgICAgICAgICAgICAgfAotfCBgYHtrZXk6ZGF0dW0uLi59YGAsICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkaWN0aW9uYXJ5IGRpc3BsYXksICAgICAgICAgICAgICAgICB8Cit8IGBge2tleTogdmFsdWUuLi59YGAsICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRpY3Rpb25hcnkgZGlzcGxheSwgICAgICAgICAgICAgICAgIHwKIHwgYGBgZXhwcmVzc2lvbnMuLi5gYGAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nIGNvbnZlcnNpb24gICAgICAgICAgICAgICAgICAgfAogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAKQEAgLTEzOTIsNyArMTQwMyw3IEBACiAKIC4uIFsjXSBJbiBQeXRob24gMi4zIGFuZCBsYXRlciByZWxlYXNlcywgYSBsaXN0IGNvbXByZWhlbnNpb24gImxlYWtzIiB0aGUgY29udHJvbAogICAgdmFyaWFibGVzIG9mIGVhY2ggYGBmb3JgYCBpdCBjb250YWlucyBpbnRvIHRoZSBjb250YWluaW5nIHNjb3BlLiAgSG93ZXZlciwgdGhpcwotICAgYmVoYXZpb3IgaXMgZGVwcmVjYXRlZCwgYW5kIHJlbHlpbmcgb24gaXQgd2lsbCBub3Qgd29yayBpbiBQeXRob24gMy4wCisgICBiZWhhdmlvciBpcyBkZXByZWNhdGVkLCBhbmQgcmVseWluZyBvbiBpdCB3aWxsIG5vdCB3b3JrIGluIFB5dGhvbiAzLgogCiAuLiBbI10gV2hpbGUgYGBhYnMoeCV5KSA8IGFicyh5KWBgIGlzIHRydWUgbWF0aGVtYXRpY2FsbHksIGZvciBmbG9hdHMgaXQgbWF5IG5vdCBiZQogICAgdHJ1ZSBudW1lcmljYWxseSBkdWUgdG8gcm91bmRvZmYuICBGb3IgZXhhbXBsZSwgYW5kIGFzc3VtaW5nIGEgcGxhdGZvcm0gb24gd2hpY2gKZGlmZiAtLWdpdCBhL0RvYy9yZWZlcmVuY2UvaW5kZXgucnN0IGIvRG9jL3JlZmVyZW5jZS9pbmRleC5yc3QKaW5kZXggYmQxYTI4MS4uNTEzZTQ0NSAxMDA2NDQKLS0tIGEvRG9jL3JlZmVyZW5jZS9pbmRleC5yc3QKKysrIGIvRG9jL3JlZmVyZW5jZS9pbmRleC5yc3QKQEAgLTQsOSArNCw2IEBACiAgIFRoZSBQeXRob24gTGFuZ3VhZ2UgUmVmZXJlbmNlCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotOlJlbGVhc2U6IHx2ZXJzaW9ufAotOkRhdGU6IHx0b2RheXwKLQogVGhpcyByZWZlcmVuY2UgbWFudWFsIGRlc2NyaWJlcyB0aGUgc3ludGF4IGFuZCAiY29yZSBzZW1hbnRpY3MiIG9mIHRoZQogbGFuZ3VhZ2UuIEl0IGlzIHRlcnNlLCBidXQgYXR0ZW1wdHMgdG8gYmUgZXhhY3QgYW5kIGNvbXBsZXRlLiBUaGUgc2VtYW50aWNzIG9mCiBub24tZXNzZW50aWFsIGJ1aWx0LWluIG9iamVjdCB0eXBlcyBhbmQgb2YgdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyBhbmQgbW9kdWxlcwpkaWZmIC0tZ2l0IGEvRG9jL3JlZmVyZW5jZS9pbnRyb2R1Y3Rpb24ucnN0IGIvRG9jL3JlZmVyZW5jZS9pbnRyb2R1Y3Rpb24ucnN0CmluZGV4IDM2ZjgyNGYuLmQ3NWQyMmIgMTAwNjQ0Ci0tLSBhL0RvYy9yZWZlcmVuY2UvaW50cm9kdWN0aW9uLnJzdAorKysgYi9Eb2MvcmVmZXJlbmNlL2ludHJvZHVjdGlvbi5yc3QKQEAgLTY1LDcgKzY1LDcgQEAKICAgIEFuIGFsdGVybmF0ZSBQeXRob24gZm9yIC5ORVQuICBVbmxpa2UgUHl0aG9uLk5FVCwgdGhpcyBpcyBhIGNvbXBsZXRlIFB5dGhvbgogICAgaW1wbGVtZW50YXRpb24gdGhhdCBnZW5lcmF0ZXMgSUwsIGFuZCBjb21waWxlcyBQeXRob24gY29kZSBkaXJlY3RseSB0byAuTkVUCiAgICBhc3NlbWJsaWVzLiAgSXQgd2FzIGNyZWF0ZWQgYnkgSmltIEh1Z3VuaW4sIHRoZSBvcmlnaW5hbCBjcmVhdG9yIG9mIEp5dGhvbi4gIEZvcgotICAgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGB0aGUgSXJvblB5dGhvbiB3ZWJzaXRlIDxodHRwOi8vd3d3Lmlyb25weXRob24uY29tLz5gXy4KKyAgIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBgdGhlIElyb25QeXRob24gd2Vic2l0ZSA8aHR0cDovL3d3dy5pcm9ucHl0aG9uLm5ldC8+YF8uCiAKIFB5UHkKICAgIEFuIGltcGxlbWVudGF0aW9uIG9mIFB5dGhvbiB3cml0dGVuIGNvbXBsZXRlbHkgaW4gUHl0aG9uLiBJdCBzdXBwb3J0cyBzZXZlcmFsCmRpZmYgLS1naXQgYS9Eb2MvcmVmZXJlbmNlL2xleGljYWxfYW5hbHlzaXMucnN0IGIvRG9jL3JlZmVyZW5jZS9sZXhpY2FsX2FuYWx5c2lzLnJzdAppbmRleCBkNzE2MTM5Li41MmEwOWE4IDEwMDY0NAotLS0gYS9Eb2MvcmVmZXJlbmNlL2xleGljYWxfYW5hbHlzaXMucnN0CisrKyBiL0RvYy9yZWZlcmVuY2UvbGV4aWNhbF9hbmFseXNpcy5yc3QKQEAgLTEwNCw5ICsxMDQsNyBAQAogRW5jb2RpbmcgZGVjbGFyYXRpb25zCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLi4gaW5kZXg6OgotICAgc2luZ2xlOiBzb3VyY2UgY2hhcmFjdGVyIHNldAotICAgc2luZ2xlOiBlbmNvZGluZ3MKKy4uIGluZGV4Ojogc291cmNlIGNoYXJhY3RlciBzZXQsIGVuY29kaW5nIGRlY2xhcmF0aW9ucyAoc291cmNlIGZpbGUpCiAKIElmIGEgY29tbWVudCBpbiB0aGUgZmlyc3Qgb3Igc2Vjb25kIGxpbmUgb2YgdGhlIFB5dGhvbiBzY3JpcHQgbWF0Y2hlcyB0aGUKIHJlZ3VsYXIgZXhwcmVzc2lvbiBgYGNvZGluZ1s9Ol1ccyooWy1cdy5dKylgYCwgdGhpcyBjb21tZW50IGlzIHByb2Nlc3NlZCBhcyBhbgpAQCAtMzU3LDExICszNTUsMTEgQEAKICAgIGFzc2lnbiBhIGRpZmZlcmVudCBvYmplY3QgdG8gaXQuCiAKIC4uIHZlcnNpb25jaGFuZ2VkOjogMi41Ci0gICBCb3RoIDprZXl3b3JkOmBhc2AgYW5kIDprZXl3b3JkOmB3aXRoYCBhcmUgb25seSByZWNvZ25pemVkIHdoZW4gdGhlCi0gICBgYHdpdGhfc3RhdGVtZW50YGAgZnV0dXJlIGZlYXR1cmUgaGFzIGJlZW4gZW5hYmxlZC4gSXQgd2lsbCBhbHdheXMgYmUgZW5hYmxlZCBpbgotICAgUHl0aG9uIDIuNi4gIFNlZSBzZWN0aW9uIDpyZWY6YHdpdGhgIGZvciBkZXRhaWxzLiAgTm90ZSB0aGF0IHVzaW5nIDprZXl3b3JkOmBhc2AKLSAgIGFuZCA6a2V5d29yZDpgd2l0aGAgYXMgaWRlbnRpZmllcnMgd2lsbCBhbHdheXMgaXNzdWUgYSB3YXJuaW5nLCBldmVuIHdoZW4gdGhlCi0gICBgYHdpdGhfc3RhdGVtZW50YGAgZnV0dXJlIGRpcmVjdGl2ZSBpcyBub3QgaW4gZWZmZWN0LgorICAgVXNpbmcgOmtleXdvcmQ6YGFzYCBhbmQgOmtleXdvcmQ6YHdpdGhgIGFzIGlkZW50aWZpZXJzIHRyaWdnZXJzIGEgd2FybmluZy4gIFRvCisgICB1c2UgdGhlbSBhcyBrZXl3b3JkcywgZW5hYmxlIHRoZSBgYHdpdGhfc3RhdGVtZW50YGAgZnV0dXJlIGZlYXR1cmUgLgorCisuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNgorICAgIDprZXl3b3JkOmBhc2AgYW5kIDprZXl3b3JkOmB3aXRoYCBhcmUgZnVsbCBrZXl3b3Jkcy4KIAogCiAuLiBfaWQtY2xhc3NlczoKQEAgLTUyOSw4ICs1MjcsNyBAQAogKDIpCiAgICBBbnkgVW5pY29kZSBjaGFyYWN0ZXIgY2FuIGJlIGVuY29kZWQgdGhpcyB3YXksIGJ1dCBjaGFyYWN0ZXJzIG91dHNpZGUgdGhlIEJhc2ljCiAgICBNdWx0aWxpbmd1YWwgUGxhbmUgKEJNUCkgd2lsbCBiZSBlbmNvZGVkIHVzaW5nIGEgc3Vycm9nYXRlIHBhaXIgaWYgUHl0aG9uIGlzCi0gICBjb21waWxlZCB0byB1c2UgMTYtYml0IGNvZGUgdW5pdHMgKHRoZSBkZWZhdWx0KS4gIEluZGl2aWR1YWwgY29kZSB1bml0cyB3aGljaAotICAgZm9ybSBwYXJ0cyBvZiBhIHN1cnJvZ2F0ZSBwYWlyIGNhbiBiZSBlbmNvZGVkIHVzaW5nIHRoaXMgZXNjYXBlIHNlcXVlbmNlLgorICAgY29tcGlsZWQgdG8gdXNlIDE2LWJpdCBjb2RlIHVuaXRzICh0aGUgZGVmYXVsdCkuCiAKICgzKQogICAgQXMgaW4gU3RhbmRhcmQgQywgdXAgdG8gdGhyZWUgb2N0YWwgZGlnaXRzIGFyZSBhY2NlcHRlZC4KZGlmZiAtLWdpdCBhL0RvYy9yZWZlcmVuY2Uvc2ltcGxlX3N0bXRzLnJzdCBiL0RvYy9yZWZlcmVuY2Uvc2ltcGxlX3N0bXRzLnJzdAppbmRleCA2MGUwZTk5Li5kOGU1MzlkIDEwMDY0NAotLS0gYS9Eb2MvcmVmZXJlbmNlL3NpbXBsZV9zdG10cy5yc3QKKysrIGIvRG9jL3JlZmVyZW5jZS9zaW1wbGVfc3RtdHMucnN0CkBAIC03Miw2ICs3Miw3IEBACiA9PT09PT09PT09PT09PT09PT09PT0KIAogLi4gaW5kZXg6OgorICAgc2luZ2xlOiA9OyBhc3NpZ25tZW50IHN0YXRlbWVudAogICAgcGFpcjogYXNzaWdubWVudDsgc3RhdGVtZW50CiAgICBwYWlyOiBiaW5kaW5nOyBuYW1lCiAgICBwYWlyOiByZWJpbmRpbmc7IG5hbWUKQEAgLTI0MSw2ICsyNDIsMTggQEAKIC4uIGluZGV4OjoKICAgIHBhaXI6IGF1Z21lbnRlZDsgYXNzaWdubWVudAogICAgc2luZ2xlOiBzdGF0ZW1lbnQ7IGFzc2lnbm1lbnQsIGF1Z21lbnRlZAorICAgc2luZ2xlOiArPTsgYXVnbWVudGVkIGFzc2lnbm1lbnQKKyAgIHNpbmdsZTogLT07IGF1Z21lbnRlZCBhc3NpZ25tZW50CisgICBzaW5nbGU6ICo9OyBhdWdtZW50ZWQgYXNzaWdubWVudAorICAgc2luZ2xlOiAvPTsgYXVnbWVudGVkIGFzc2lnbm1lbnQKKyAgIHNpbmdsZTogJT07IGF1Z21lbnRlZCBhc3NpZ25tZW50CisgICBzaW5nbGU6ICY9OyBhdWdtZW50ZWQgYXNzaWdubWVudAorICAgc2luZ2xlOiBePTsgYXVnbWVudGVkIGFzc2lnbm1lbnQKKyAgIHNpbmdsZTogfD07IGF1Z21lbnRlZCBhc3NpZ25tZW50CisgICBzaW5nbGU6ICoqPTsgYXVnbWVudGVkIGFzc2lnbm1lbnQKKyAgIHNpbmdsZTogLy89OyBhdWdtZW50ZWQgYXNzaWdubWVudAorICAgc2luZ2xlOiA+Pj07IGF1Z21lbnRlZCBhc3NpZ25tZW50CisgICBzaW5nbGU6IDw8PTsgYXVnbWVudGVkIGFzc2lnbm1lbnQKIAogQXVnbWVudGVkIGFzc2lnbm1lbnQgaXMgdGhlIGNvbWJpbmF0aW9uLCBpbiBhIHNpbmdsZSBzdGF0ZW1lbnQsIG9mIGEgYmluYXJ5CiBvcGVyYXRpb24gYW5kIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50OgpAQCAtMzUyLDcgKzM2NSw3IEBACiAgICBkZWxfc3RtdDogImRlbCIgYHRhcmdldF9saXN0YAogCiBEZWxldGlvbiBpcyByZWN1cnNpdmVseSBkZWZpbmVkIHZlcnkgc2ltaWxhciB0byB0aGUgd2F5IGFzc2lnbm1lbnQgaXMgZGVmaW5lZC4KLVJhdGhlciB0aGF0IHNwZWxsaW5nIGl0IG91dCBpbiBmdWxsIGRldGFpbHMsIGhlcmUgYXJlIHNvbWUgaGludHMuCitSYXRoZXIgdGhhbiBzcGVsbGluZyBpdCBvdXQgaW4gZnVsbCBkZXRhaWxzLCBoZXJlIGFyZSBzb21lIGhpbnRzLgogCiBEZWxldGlvbiBvZiBhIHRhcmdldCBsaXN0IHJlY3Vyc2l2ZWx5IGRlbGV0ZXMgZWFjaCB0YXJnZXQsIGZyb20gbGVmdCB0byByaWdodC4KIApAQCAtNTExLDYgKzUyNCw5IEBACiA6bWV0aDpgY2xvc2VgIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCwgYWxsb3dpbmcgYW55IHBlbmRpbmcgOmtleXdvcmQ6YGZpbmFsbHlgCiBjbGF1c2VzIHRvIGV4ZWN1dGUuCiAKK0ZvciBmdWxsIGRldGFpbHMgb2YgOmtleXdvcmQ6YHlpZWxkYCBzZW1hbnRpY3MsIHJlZmVyIHRvIHRoZSA6cmVmOmB5aWVsZGV4cHJgCitzZWN0aW9uLgorCiAuLiBub3RlOjoKIAogICAgSW4gUHl0aG9uIDIuMiwgdGhlIDprZXl3b3JkOmB5aWVsZGAgc3RhdGVtZW50IHdhcyBvbmx5IGFsbG93ZWQgd2hlbiB0aGUKQEAgLTY1MCw2ICs2NjYsNyBAQAogICAgc2luZ2xlOiBtb2R1bGU7IGltcG9ydGluZwogICAgcGFpcjogbmFtZTsgYmluZGluZwogICAga2V5d29yZDogZnJvbQorICAgc2luZ2xlOiBhczsgaW1wb3J0IHN0YXRlbWVudAogCiAuLiBwcm9kdWN0aW9ubGlzdDo6CiAgICBpbXBvcnRfc3RtdDogImltcG9ydCIgYG1vZHVsZWAgWyJhcyIgYG5hbWVgXSAoICIsIiBgbW9kdWxlYCBbImFzIiBgbmFtZWBdICkqCkBAIC03MDYsNyArNzIzLDcgQEAKIHNlY29uZCBhcmd1bWVudCB0byA6bWV0aDpgZmluZF9tb2R1bGVgIGlzIGdpdmVuIGFzIHRoZSB2YWx1ZSBvZiB0aGUKIDphdHRyOmBfX3BhdGhfX2AgYXR0cmlidXRlIGZyb20gdGhlIHBhcmVudCBwYWNrYWdlIChldmVyeXRoaW5nIHVwIHRvIHRoZSBsYXN0CiBkb3QgaW4gdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSBiZWluZyBpbXBvcnRlZCkuIElmIGEgZmluZGVyIGNhbiBmaW5kIHRoZSBtb2R1bGUKLWl0IHJldHVybnMgYSA6dGVybTpgbG9hZGVyYCAoZGlzY3Vzc2VkIGxhdGVyKSBvciByZXR1cm5zIDprZXl3b3JkOmBOb25lYC4KK2l0IHJldHVybnMgYSA6dGVybTpgbG9hZGVyYCAoZGlzY3Vzc2VkIGxhdGVyKSBvciByZXR1cm5zIGBgTm9uZWBgLgogCiAuLiBpbmRleDo6CiAgICAgc2luZ2xlOiBzeXMucGF0aF9ob29rcwpAQCAtNzMzLDExICs3NTAsMTEgQEAKIHRoZSBsaXN0IHdpdGggYSBzaW5nbGUgYXJndW1lbnQgb2YgdGhlIHBhdGgsIHJldHVybmluZyBhIGZpbmRlciBvciByYWlzZXMKIDpleGM6YEltcG9ydEVycm9yYC4gSWYgYSBmaW5kZXIgaXMgcmV0dXJuZWQgdGhlbiBpdCBpcyBjYWNoZWQgaW4KIDpkYXRhOmBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZWAgYW5kIHRoZW4gdXNlZCBmb3IgdGhhdCBwYXRoIGVudHJ5LiBJZiBubyBmaW5kZXIKLWNhbiBiZSBmb3VuZCBidXQgdGhlIHBhdGggZXhpc3RzIHRoZW4gYSB2YWx1ZSBvZiA6a2V5d29yZDpgTm9uZWAgaXMKK2NhbiBiZSBmb3VuZCBidXQgdGhlIHBhdGggZXhpc3RzIHRoZW4gYSB2YWx1ZSBvZiBgYE5vbmVgYCBpcwogc3RvcmVkIGluIDpkYXRhOmBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZWAgdG8gc2lnbmlmeSB0aGF0IGFuIGltcGxpY2l0LAogZmlsZS1iYXNlZCBmaW5kZXIgdGhhdCBoYW5kbGVzIG1vZHVsZXMgc3RvcmVkIGFzIGluZGl2aWR1YWwgZmlsZXMgc2hvdWxkIGJlCiB1c2VkIGZvciB0aGF0IHBhdGguIElmIHRoZSBwYXRoIGRvZXMgbm90IGV4aXN0IHRoZW4gYSBmaW5kZXIgd2hpY2ggYWx3YXlzCi1yZXR1cm5zIDprZXl3b3JkOmBOb25lYCBpcyBwbGFjZWQgaW4gdGhlIGNhY2hlIGZvciB0aGUgcGF0aC4KK3JldHVybnMgYGBOb25lYGAgaXMgcGxhY2VkIGluIHRoZSBjYWNoZSBmb3IgdGhlIHBhdGguCiAKIC4uIGluZGV4OjoKICAgICBzaW5nbGU6IGxvYWRlcgpAQCAtOTc4LDIxICs5OTUsMzIgQEAKICAgIGV4ZWNfc3RtdDogImV4ZWMiIGBvcl9leHByYCBbImluIiBgZXhwcmVzc2lvbmAgWyIsIiBgZXhwcmVzc2lvbmBdXQogCiBUaGlzIHN0YXRlbWVudCBzdXBwb3J0cyBkeW5hbWljIGV4ZWN1dGlvbiBvZiBQeXRob24gY29kZS4gIFRoZSBmaXJzdCBleHByZXNzaW9uCi1zaG91bGQgZXZhbHVhdGUgdG8gZWl0aGVyIGEgc3RyaW5nLCBhbiBvcGVuIGZpbGUgb2JqZWN0LCBvciBhIGNvZGUgb2JqZWN0LiAgSWYKLWl0IGlzIGEgc3RyaW5nLCB0aGUgc3RyaW5nIGlzIHBhcnNlZCBhcyBhIHN1aXRlIG9mIFB5dGhvbiBzdGF0ZW1lbnRzIHdoaWNoIGlzCi10aGVuIGV4ZWN1dGVkICh1bmxlc3MgYSBzeW50YXggZXJyb3Igb2NjdXJzKS4gWyNdXyAgSWYgaXQgaXMgYW4gb3BlbiBmaWxlLCB0aGUgZmlsZQotaXMgcGFyc2VkIHVudGlsIEVPRiBhbmQgZXhlY3V0ZWQuICBJZiBpdCBpcyBhIGNvZGUgb2JqZWN0LCBpdCBpcyBzaW1wbHkKLWV4ZWN1dGVkLiAgSW4gYWxsIGNhc2VzLCB0aGUgY29kZSB0aGF0J3MgZXhlY3V0ZWQgaXMgZXhwZWN0ZWQgdG8gYmUgdmFsaWQgYXMKLWZpbGUgaW5wdXQgKHNlZSBzZWN0aW9uIDpyZWY6YGZpbGUtaW5wdXRgKS4gIEJlIGF3YXJlIHRoYXQgdGhlCitzaG91bGQgZXZhbHVhdGUgdG8gZWl0aGVyIGEgVW5pY29kZSBzdHJpbmcsIGEgKkxhdGluLTEqIGVuY29kZWQgc3RyaW5nLCBhbiBvcGVuCitmaWxlIG9iamVjdCwgYSBjb2RlIG9iamVjdCwgb3IgYSB0dXBsZS4gIElmIGl0IGlzIGEgc3RyaW5nLCB0aGUgc3RyaW5nIGlzIHBhcnNlZAorYXMgYSBzdWl0ZSBvZiBQeXRob24gc3RhdGVtZW50cyB3aGljaCBpcyB0aGVuIGV4ZWN1dGVkICh1bmxlc3MgYSBzeW50YXggZXJyb3IKK29jY3VycykuIFsjXV8gSWYgaXQgaXMgYW4gb3BlbiBmaWxlLCB0aGUgZmlsZSBpcyBwYXJzZWQgdW50aWwgRU9GIGFuZCBleGVjdXRlZC4KK0lmIGl0IGlzIGEgY29kZSBvYmplY3QsIGl0IGlzIHNpbXBseSBleGVjdXRlZC4gIEZvciB0aGUgaW50ZXJwcmV0YXRpb24gb2YgYQordHVwbGUsIHNlZSBiZWxvdy4gIEluIGFsbCBjYXNlcywgdGhlIGNvZGUgdGhhdCdzIGV4ZWN1dGVkIGlzIGV4cGVjdGVkIHRvIGJlCit2YWxpZCBhcyBmaWxlIGlucHV0IChzZWUgc2VjdGlvbiA6cmVmOmBmaWxlLWlucHV0YCkuICBCZSBhd2FyZSB0aGF0IHRoZQogOmtleXdvcmQ6YHJldHVybmAgYW5kIDprZXl3b3JkOmB5aWVsZGAgc3RhdGVtZW50cyBtYXkgbm90IGJlIHVzZWQgb3V0c2lkZSBvZgogZnVuY3Rpb24gZGVmaW5pdGlvbnMgZXZlbiB3aXRoaW4gdGhlIGNvbnRleHQgb2YgY29kZSBwYXNzZWQgdG8gdGhlCiA6a2V5d29yZDpgZXhlY2Agc3RhdGVtZW50LgogCiBJbiBhbGwgY2FzZXMsIGlmIHRoZSBvcHRpb25hbCBwYXJ0cyBhcmUgb21pdHRlZCwgdGhlIGNvZGUgaXMgZXhlY3V0ZWQgaW4gdGhlCi1jdXJyZW50IHNjb3BlLiAgSWYgb25seSB0aGUgZmlyc3QgZXhwcmVzc2lvbiBhZnRlciA6a2V5d29yZDpgaW5gIGlzIHNwZWNpZmllZCwKK2N1cnJlbnQgc2NvcGUuICBJZiBvbmx5IHRoZSBmaXJzdCBleHByZXNzaW9uIGFmdGVyIGBgaW5gYCBpcyBzcGVjaWZpZWQsCiBpdCBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5LCB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIGJvdGggdGhlIGdsb2JhbCBhbmQgdGhlIGxvY2FsCiB2YXJpYWJsZXMuICBJZiB0d28gZXhwcmVzc2lvbnMgYXJlIGdpdmVuLCB0aGV5IGFyZSB1c2VkIGZvciB0aGUgZ2xvYmFsIGFuZCBsb2NhbAogdmFyaWFibGVzLCByZXNwZWN0aXZlbHkuIElmIHByb3ZpZGVkLCAqbG9jYWxzKiBjYW4gYmUgYW55IG1hcHBpbmcgb2JqZWN0LgorUmVtZW1iZXIgdGhhdCBhdCBtb2R1bGUgbGV2ZWwsIGdsb2JhbHMgYW5kIGxvY2FscyBhcmUgdGhlIHNhbWUgZGljdGlvbmFyeS4gSWYKK3R3byBzZXBhcmF0ZSBvYmplY3RzIGFyZSBnaXZlbiBhcyAqZ2xvYmFscyogYW5kICpsb2NhbHMqLCB0aGUgY29kZSB3aWxsIGJlCitleGVjdXRlZCBhcyBpZiBpdCB3ZXJlIGVtYmVkZGVkIGluIGEgY2xhc3MgZGVmaW5pdGlvbi4KKworVGhlIGZpcnN0IGV4cHJlc3Npb24gbWF5IGFsc28gYmUgYSB0dXBsZSBvZiBsZW5ndGggMiBvciAzLiAgSW4gdGhpcyBjYXNlLCB0aGUKK29wdGlvbmFsIHBhcnRzIG11c3QgYmUgb21pdHRlZC4gIFRoZSBmb3JtIGBgZXhlYyhleHByLCBnbG9iYWxzKWBgIGlzIGVxdWl2YWxlbnQKK3RvIGBgZXhlYyBleHByIGluIGdsb2JhbHNgYCwgd2hpbGUgdGhlIGZvcm0gYGBleGVjKGV4cHIsIGdsb2JhbHMsIGxvY2FscylgYCBpcworZXF1aXZhbGVudCB0byBgYGV4ZWMgZXhwciBpbiBnbG9iYWxzLCBsb2NhbHNgYC4gIFRoZSB0dXBsZSBmb3JtIG9mIGBgZXhlY2BgCitwcm92aWRlcyBjb21wYXRpYmlsaXR5IHdpdGggUHl0aG9uIDMsIHdoZXJlIGBgZXhlY2BgIGlzIGEgZnVuY3Rpb24gcmF0aGVyIHRoYW4KK2Egc3RhdGVtZW50LgogCiAuLiB2ZXJzaW9uY2hhbmdlZDo6IDIuNAogICAgRm9ybWVybHksICpsb2NhbHMqIHdhcyByZXF1aXJlZCB0byBiZSBhIGRpY3Rpb25hcnkuCkBAIC0xMDIxLDUgKzEwNDksNSBAQAogLi4gcnVicmljOjogRm9vdG5vdGVzCiAKIC4uIFsjXSBOb3RlIHRoYXQgdGhlIHBhcnNlciBvbmx5IGFjY2VwdHMgdGhlIFVuaXgtc3R5bGUgZW5kIG9mIGxpbmUgY29udmVudGlvbi4KLSAgICAgICBJZiB5b3UgYXJlIHJlYWRpbmcgdGhlIGNvZGUgZnJvbSBhIGZpbGUsIG1ha2Ugc3VyZSB0byB1c2UgdW5pdmVyc2FsCi0gICAgICAgbmV3bGluZSBtb2RlIHRvIGNvbnZlcnQgV2luZG93cyBvciBNYWMtc3R5bGUgbmV3bGluZXMuCisgICAgICAgSWYgeW91IGFyZSByZWFkaW5nIHRoZSBjb2RlIGZyb20gYSBmaWxlLCBtYWtlIHN1cmUgdG8gdXNlCisgICAgICAgOnRlcm06YHVuaXZlcnNhbCBuZXdsaW5lc2AgbW9kZSB0byBjb252ZXJ0IFdpbmRvd3Mgb3IgTWFjLXN0eWxlIG5ld2xpbmVzLgpkaWZmIC0tZ2l0IGEvRG9jL3Rvb2xzL2RhaWx5YnVpbGQucHkgYi9Eb2MvdG9vbHMvZGFpbHlidWlsZC5weQppbmRleCAxYTQ3MWU2Li43ODZkNWFiIDEwMDc1NQotLS0gYS9Eb2MvdG9vbHMvZGFpbHlidWlsZC5weQorKysgYi9Eb2MvdG9vbHMvZGFpbHlidWlsZC5weQpAQCAtNSwxMiArNSwxMiBAQAogIwogIyBVc2FnZXM6CiAjCi0jICAgZGFpbHlidWlsZC5weQorIyAgIGRhaWx5YnVpbGQucHkgWy1xXQogIwogIyB3aXRob3V0IGFueSBhcmd1bWVudHMgYnVpbGRzIGRvY3MgZm9yIGFsbCBicmFuY2hlcyBjb25maWd1cmVkIGluIHRoZSBnbG9iYWwKLSMgQlJBTkNIRVMgdmFsdWUuCisjIEJSQU5DSEVTIHZhbHVlLiAtcSBzZWxlY3RzICJxdWljayBidWlsZCIsIHdoaWNoIG1lYW5zIHRvIGJ1aWxkIG9ubHkgSFRNTC4KICMKLSMgICBkYWlseWJ1aWxkLnB5IFstZF0gPGNoZWNrb3V0PiA8dGFyZ2V0PgorIyAgIGRhaWx5YnVpbGQucHkgWy1xXSBbLWRdIDxjaGVja291dD4gPHRhcmdldD4KICMKICMgYnVpbGRzIG9uZSB2ZXJzaW9uLCB3aGVyZSA8Y2hlY2tvdXQ+IGlzIGFuIFNWTiBjaGVja291dCBkaXJlY3Rvcnkgb2YgdGhlCiAjIFB5dGhvbiBicmFuY2ggdG8gYnVpbGQgZG9jcyBmb3IsIGFuZCA8dGFyZ2V0PiBpcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZQpAQCAtMjksMzEgKzI5LDc5IEBACiAKIAogQlVJTERST09UID0gJy9ob21lL2dicmFuZGwvZG9jYnVpbGQnCitTUEhJTlhCVUlMRCA9IG9zLnBhdGguam9pbihCVUlMRFJPT1QsICdzcGhpbngtZW52L2Jpbi9zcGhpbngtYnVpbGQnKQogV1dXUk9PVCA9ICcvZGF0YS9mdHAucHl0aG9uLm9yZy9wdWIvZG9jcy5weXRob24ub3JnJwogCiBCUkFOQ0hFUyA9IFsKICAgICAjIGNoZWNrb3V0LCB0YXJnZXQsIGlzZGV2Ci0gICAgKEJVSUxEUk9PVCArICcvcHl0aG9uMzMnLCBXV1dST09UICsgJy9kZXYnLCBUcnVlKSwKLSAgICAoQlVJTERST09UICsgJy9weXRob24yNycsIFdXV1JPT1QsIEZhbHNlKSwKLSAgICAoQlVJTERST09UICsgJy9weXRob24zMicsIFdXV1JPT1QgKyAnL3B5M2snLCBGYWxzZSksCisgICAgKEJVSUxEUk9PVCArICcvcHl0aG9uMzQnLCBXV1dST09UICsgJy8zLjQnLCBGYWxzZSksCisgICAgKEJVSUxEUk9PVCArICcvcHl0aG9uMzUnLCBXV1dST09UICsgJy8zLjUnLCBUcnVlKSwKKyAgICAoQlVJTERST09UICsgJy9weXRob24yNycsIFdXV1JPT1QgKyAnLzIuNycsIEZhbHNlKSwKIF0KIAogCi1kZWYgYnVpbGRfb25lKGNoZWNrb3V0LCB0YXJnZXQsIGlzZGV2KToKK2RlZiBfZmlsZXNfY2hhbmdlZChvbGQsIG5ldyk6CisgICAgd2l0aCBvcGVuKG9sZCwgJ3JiJykgYXMgZnAxLCBvcGVuKG5ldywgJ3JiJykgYXMgZnAyOgorICAgICAgICBzdDEgPSBvcy5mc3RhdChmcDEuZmlsZW5vKCkpCisgICAgICAgIHN0MiA9IG9zLmZzdGF0KGZwMi5maWxlbm8oKSkKKyAgICAgICAgaWYgc3QxLnN0X3NpemUgIT0gc3QyLnN0X3NpemU6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgc3QxLnN0X210aW1lID49IHN0Mi5zdF9tdGltZToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBvbmUgPSBmcDEucmVhZCg0MDk2KQorICAgICAgICAgICAgdHdvID0gZnAyLnJlYWQoNDA5NikKKyAgICAgICAgICAgIGlmIG9uZSAhPSB0d286CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBpZiBvbmUgPT0gJyc6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICByZXR1cm4gVHJ1ZQorCitkZWYgYnVpbGRfb25lKGNoZWNrb3V0LCB0YXJnZXQsIGlzZGV2LCBxdWljayk6CiAgICAgcHJpbnQgJ0RvYyBhdXRvYnVpbGQgc3RhcnRlZCBpbiAlcycgJSBjaGVja291dAogICAgIG9zLmNoZGlyKGNoZWNrb3V0KQotICAgIHByaW50ICdSdW5uaW5nIHN2biB1cGRhdGUnCi0gICAgb3Muc3lzdGVtKCdzdm4gdXBkYXRlJykKKyAgICBwcmludCAnUnVubmluZyBoZyBwdWxsIC0tdXBkYXRlJworICAgIG9zLnN5c3RlbSgnaGcgcHVsbCAtLXVwZGF0ZScpCiAgICAgcHJpbnQgJ1J1bm5pbmcgbWFrZSBhdXRvYnVpbGQnCi0gICAgaWYgb3MuV0VYSVRTVEFUVVMob3Muc3lzdGVtKAotICAgICAgICAnY2QgRG9jOyBtYWtlIGF1dG9idWlsZC0lcycgJSAoaXNkZXYgYW5kICdkZXYnIG9yICdzdGFibGUnKSkpID09IDI6CisgICAgbWFrZXRhcmdldCA9ICdhdXRvYnVpbGQtJyArICgnaHRtbCcgaWYgcXVpY2sgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdkZXYnIGlmIGlzZGV2IGVsc2UgJ3N0YWJsZScpKQorICAgIGlmIG9zLldFWElUU1RBVFVTKG9zLnN5c3RlbSgnY2QgRG9jOyBtYWtlIFNQSElOWEJVSUxEPSVzICVzJyAlIChTUEhJTlhCVUlMRCwgbWFrZXRhcmdldCkpKSA9PSAyOgogICAgICAgICBwcmludCAnKicgKiA4MAogICAgICAgICByZXR1cm4KLSAgICBwcmludCAnQ29weWluZyBIVE1MIGZpbGVzJworICAgIHByaW50KCdDb21wdXRpbmcgY2hhbmdlZCBmaWxlcycpCisgICAgY2hhbmdlZCA9IFtdCisgICAgZm9yIGRpcnBhdGgsIGRpcm5hbWVzLCBmaWxlbmFtZXMgaW4gb3Mud2FsaygnRG9jL2J1aWxkL2h0bWwvJyk6CisgICAgICAgIGRpcl9yZWwgPSBkaXJwYXRoW2xlbignRG9jL2J1aWxkL2h0bWwvJyk6XQorICAgICAgICBmb3IgZm4gaW4gZmlsZW5hbWVzOgorICAgICAgICAgICAgbG9jYWxfcGF0aCA9IG9zLnBhdGguam9pbihkaXJwYXRoLCBmbikKKyAgICAgICAgICAgIHJlbF9wYXRoID0gb3MucGF0aC5qb2luKGRpcl9yZWwsIGZuKQorICAgICAgICAgICAgdGFyZ2V0X3BhdGggPSBvcy5wYXRoLmpvaW4odGFyZ2V0LCByZWxfcGF0aCkKKyAgICAgICAgICAgIGlmIChvcy5wYXRoLmV4aXN0cyh0YXJnZXRfcGF0aCkgYW5kCisgICAgICAgICAgICAgICAgbm90IF9maWxlc19jaGFuZ2VkKHRhcmdldF9wYXRoLCBsb2NhbF9wYXRoKSk6CisgICAgICAgICAgICAgICAgY2hhbmdlZC5hcHBlbmQocmVsX3BhdGgpCisgICAgcHJpbnQgJ0NvcHlpbmcgSFRNTCBmaWxlcyB0byAlcycgJSB0YXJnZXQKICAgICBvcy5zeXN0ZW0oJ2NwIC1hIERvYy9idWlsZC9odG1sLyogJXMnICUgdGFyZ2V0KQotICAgIHByaW50ICdDb3B5aW5nIGRpc3QgZmlsZXMnCi0gICAgb3Muc3lzdGVtKCdta2RpciAtcCAlcy9hcmNoaXZlcycgJSB0YXJnZXQpCi0gICAgb3Muc3lzdGVtKCdjcCAtYSBEb2MvZGlzdC8qICVzL2FyY2hpdmVzJyAlIHRhcmdldCkKKyAgICBpZiBub3QgcXVpY2s6CisgICAgICAgIHByaW50ICdDb3B5aW5nIGRpc3QgZmlsZXMnCisgICAgICAgIG9zLnN5c3RlbSgnbWtkaXIgLXAgJXMvYXJjaGl2ZXMnICUgdGFyZ2V0KQorICAgICAgICBvcy5zeXN0ZW0oJ2NwIC1hIERvYy9kaXN0LyogJXMvYXJjaGl2ZXMnICUgdGFyZ2V0KQorICAgICAgICBjaGFuZ2VkLmFwcGVuZCgnYXJjaGl2ZXMvJykKKyAgICAgICAgZm9yIGZuIGluIG9zLmxpc3RkaXIob3MucGF0aC5qb2luKHRhcmdldCwgJ2FyY2hpdmVzJykpOgorICAgICAgICAgICAgY2hhbmdlZC5hcHBlbmQoJ2FyY2hpdmVzLycgKyBmbikKKyAgICBwcmludCAnJXMgZmlsZXMgY2hhbmdlZCcgJSBsZW4oY2hhbmdlZCkKKyAgICBpZiBjaGFuZ2VkOgorICAgICAgICB0YXJnZXRfaW5vID0gb3Muc3RhdCh0YXJnZXQpLnN0X2lubworICAgICAgICB0YXJnZXRzX2RpciA9IG9zLnBhdGguZGlybmFtZSh0YXJnZXQpCisgICAgICAgIHByZWZpeGVzID0gW10KKyAgICAgICAgZm9yIGZuIGluIG9zLmxpc3RkaXIodGFyZ2V0c19kaXIpOgorICAgICAgICAgICAgaWYgb3Muc3RhdChvcy5wYXRoLmpvaW4odGFyZ2V0c19kaXIsIGZuKSkuc3RfaW5vID09IHRhcmdldF9pbm86CisgICAgICAgICAgICAgICAgcHJlZml4ZXMuYXBwZW5kKGZuKQorICAgICAgICB0b19wdXJnZSA9IFtdCisgICAgICAgIGZvciBwcmVmaXggaW4gcHJlZml4ZXM6CisgICAgICAgICAgICB0b19wdXJnZS5leHRlbmQocHJlZml4ICsgIi8iICsgcCBmb3IgcCBpbiBjaGFuZ2VkKQorICAgICAgICBwdXJnZV9jbWQgPSAnY3VybCAtWCBQVVJHRSAiaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcveyVzfSInICUgJywnLmpvaW4odG9fcHVyZ2UpCisgICAgICAgIHByaW50KCJSdW5uaW5nIENETiBwdXJnZSIpCisgICAgICAgIG9zLnN5c3RlbShwdXJnZV9jbWQpCiAgICAgcHJpbnQgJ0ZpbmlzaGVkJwogICAgIHByaW50ICc9JyAqIDgwCiAKQEAgLTY3LDE1ICsxMTUsMjEgQEAKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB0cnk6Ci0gICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgJ2QnKQorICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICdkcScpCiAgICAgZXhjZXB0IGdldG9wdC5lcnJvcjoKICAgICAgICAgdXNhZ2UoKQotICAgIGlmIG9wdHMgYW5kIG5vdCBhcmdzOgorICAgIHF1aWNrID0gZGV2ZWwgPSBGYWxzZQorICAgIGZvciBvcHQsIF8gaW4gb3B0czoKKyAgICAgICAgaWYgb3B0ID09ICctcSc6CisgICAgICAgICAgICBxdWljayA9IFRydWUKKyAgICAgICAgaWYgb3B0ID09ICctZCc6CisgICAgICAgICAgICBkZXZlbCA9IFRydWUKKyAgICBpZiBkZXZlbCBhbmQgbm90IGFyZ3M6CiAgICAgICAgIHVzYWdlKCkKICAgICBpZiBhcmdzOgogICAgICAgICBpZiBsZW4oYXJncykgIT0gMjoKICAgICAgICAgICAgIHVzYWdlKCkKLSAgICAgICAgYnVpbGRfb25lKGFyZ3NbMF0sIGFyZ3NbMV0sIGJvb2wob3B0cykpCisgICAgICAgIGJ1aWxkX29uZShvcy5wYXRoLmFic3BhdGgoYXJnc1swXSksIG9zLnBhdGguYWJzcGF0aChhcmdzWzFdKSwgZGV2ZWwsIHF1aWNrKQogICAgIGVsc2U6Ci0gICAgICAgIGZvciBicmFuY2ggaW4gQlJBTkNIRVM6Ci0gICAgICAgICAgICBidWlsZF9vbmUoKmJyYW5jaCkKKyAgICAgICAgZm9yIGNoZWNrb3V0LCBkZXN0LCBkZXZlbCBpbiBCUkFOQ0hFUzoKKyAgICAgICAgICAgIGJ1aWxkX29uZShjaGVja291dCwgZGVzdCwgZGV2ZWwsIHF1aWNrKQpkaWZmIC0tZ2l0IGEvRG9jL3Rvb2xzL3NwaGlueC1idWlsZC5weSBiL0RvYy90b29scy9zcGhpbngtYnVpbGQucHkKaW5kZXggYTBiZDdmYS4uZDNmZTcwMiAxMDA2NDQKLS0tIGEvRG9jL3Rvb2xzL3NwaGlueC1idWlsZC5weQorKysgYi9Eb2MvdG9vbHMvc3BoaW54LWJ1aWxkLnB5CkBAIC0xNSwxMyArMTUsMTMgQEAKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKIAotICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bOjNdIDwgKDIsIDQsIDApOgotICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICIiIlwKLUVycm9yOiBTcGhpbnggbmVlZHMgdG8gYmUgZXhlY3V0ZWQgd2l0aCBQeXRob24gMi40IG9yIG5ld2VyCisgICAgaWYgc3lzLnZlcnNpb25faW5mb1s6M10gPCAoMiwgNCwgMCkgb3Igc3lzLnZlcnNpb25faW5mb1s6M10gPiAoMywgMCwgMCk6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIiIiXAorRXJyb3I6IFNwaGlueCBuZWVkcyB0byBiZSBleGVjdXRlZCB3aXRoIFB5dGhvbiAyLjQgb3IgbmV3ZXIgKG5vdCAzLnggdGhvdWdoKS4KIChJZiB5b3UgcnVuIHRoaXMgZnJvbSB0aGUgTWFrZWZpbGUsIHlvdSBjYW4gc2V0IHRoZSBQWVRIT04gdmFyaWFibGUKIHRvIHRoZSBwYXRoIG9mIGFuIGFsdGVybmF0aXZlIGludGVycHJldGVyIGV4ZWN1dGFibGUsIGUuZy4sCiBgYG1ha2UgaHRtbCBQWVRIT049cHl0aG9uMi41YGApLgotIiIiCisiIiIpCiAgICAgICAgIHN5cy5leGl0KDEpCiAKICAgICBmcm9tIHNwaGlueCBpbXBvcnQgbWFpbgpkaWZmIC0tZ2l0IGEvRG9jL3Rvb2xzL3NwaGlueGV4dC9kb3dubG9hZC5odG1sIGIvRG9jL3Rvb2xzL3NwaGlueGV4dC9kb3dubG9hZC5odG1sCmluZGV4IDRmY2ExMzguLjNhZGYyZTkgMTAwNjQ0Ci0tLSBhL0RvYy90b29scy9zcGhpbnhleHQvZG93bmxvYWQuaHRtbAorKysgYi9Eb2MvdG9vbHMvc3BoaW54ZXh0L2Rvd25sb2FkLmh0bWwKQEAgLTM1LDkgKzM1LDEzIEBACiAgIDwvdHI+CiA8L3RhYmxlPgogCi0KIDxwPlRoZXNlIGFyY2hpdmVzIGNvbnRhaW4gYWxsIHRoZSBjb250ZW50IGluIHRoZSBkb2N1bWVudGF0aW9uLjwvcD4KIAorPHA+SFRNTCBIZWxwICg8dHQ+LmNobTwvdHQ+KSBmaWxlcyBhcmUgbWFkZSBhdmFpbGFibGUgaW4gdGhlICJXaW5kb3dzIiBzZWN0aW9uCitvbiB0aGUgPGEgaHJlZj0iaHR0cDovL3B5dGhvbi5vcmcvZG93bmxvYWQvcmVsZWFzZXMve3sgcmVsZWFzZVs6NV0gfX0vIj5QeXRob24KK2Rvd25sb2FkIHBhZ2U8L2E+LjwvcD4KKworCiA8aDI+VW5wYWNraW5nPC9oMj4KIAogPHA+VW5peCB1c2VycyBzaG91bGQgZG93bmxvYWQgdGhlIC50YXIuYnoyIGFyY2hpdmVzOyB0aGVzZSBhcmUgYnppcHBlZCB0YXIKZGlmZiAtLWdpdCBhL0RvYy90b29scy9zcGhpbnhleHQvaW5kZXhjb250ZW50Lmh0bWwgYi9Eb2MvdG9vbHMvc3BoaW54ZXh0L2luZGV4Y29udGVudC5odG1sCmluZGV4IDMwOTYzYzMuLjdmODU0NzAgMTAwNjQ0Ci0tLSBhL0RvYy90b29scy9zcGhpbnhleHQvaW5kZXhjb250ZW50Lmh0bWwKKysrIGIvRG9jL3Rvb2xzL3NwaGlueGV4dC9pbmRleGNvbnRlbnQuaHRtbApAQCAtMjQsOCArMjQsNiBAQAogICAgICAgICAgPHNwYW4gY2xhc3M9ImxpbmtkZXNjciI+aW5mb3JtYXRpb24gZm9yIGluc3RhbGxlcnMgJmFtcDsgc3lzLWFkbWluczwvc3Bhbj48L3A+CiAgICAgICA8cCBjbGFzcz0iYmlnbGluayI+PGEgY2xhc3M9ImJpZ2xpbmsiIGhyZWY9Int7IHBhdGh0bygiZGlzdHV0aWxzL2luZGV4IikgfX0iPkRpc3RyaWJ1dGluZyBQeXRob24gTW9kdWxlczwvYT48YnIvPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImxpbmtkZXNjciI+c2hhcmluZyBtb2R1bGVzIHdpdGggb3RoZXJzPC9zcGFuPjwvcD4KLSAgICAgIDxwIGNsYXNzPSJiaWdsaW5rIj48YSBjbGFzcz0iYmlnbGluayIgaHJlZj0ie3sgcGF0aHRvKCJkb2N1bWVudGluZy9pbmRleCIpIH19Ij5Eb2N1bWVudGluZyBQeXRob248L2E+PGJyLz4KLSAgICAgICAgIDxzcGFuIGNsYXNzPSJsaW5rZGVzY3IiPmd1aWRlIGZvciBkb2N1bWVudGF0aW9uIGF1dGhvcnM8L3NwYW4+PC9wPgogICAgICAgPHAgY2xhc3M9ImJpZ2xpbmsiPjxhIGNsYXNzPSJiaWdsaW5rIiBocmVmPSJ7eyBwYXRodG8oImZhcS9pbmRleCIpIH19Ij5GQVFzPC9hPjxici8+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ibGlua2Rlc2NyIj5mcmVxdWVudGx5IGFza2VkIHF1ZXN0aW9ucyAod2l0aCBhbnN3ZXJzISk8L3NwYW4+PC9wPgogICAgIDwvdGQ+PC90cj4KQEAgLTM0LDcgKzMyLDcgQEAKICAgPHA+PHN0cm9uZz5JbmRpY2VzIGFuZCB0YWJsZXM6PC9zdHJvbmc+PC9wPgogICA8dGFibGUgY2xhc3M9ImNvbnRlbnRzdGFibGUiIGFsaWduPSJjZW50ZXIiPjx0cj4KICAgICA8dGQgd2lkdGg9IjUwJSI+Ci0gICAgICA8cCBjbGFzcz0iYmlnbGluayI+PGEgY2xhc3M9ImJpZ2xpbmsiIGhyZWY9Int7IHBhdGh0bygibW9kaW5kZXgiKSB9fSI+R2xvYmFsIE1vZHVsZSBJbmRleDwvYT48YnIvPgorICAgICAgPHAgY2xhc3M9ImJpZ2xpbmsiPjxhIGNsYXNzPSJiaWdsaW5rIiBocmVmPSJ7eyBwYXRodG8oInB5LW1vZGluZGV4IikgfX0iPkdsb2JhbCBNb2R1bGUgSW5kZXg8L2E+PGJyLz4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJsaW5rZGVzY3IiPnF1aWNrIGFjY2VzcyB0byBhbGwgbW9kdWxlczwvc3Bhbj48L3A+CiAgICAgICA8cCBjbGFzcz0iYmlnbGluayI+PGEgY2xhc3M9ImJpZ2xpbmsiIGhyZWY9Int7IHBhdGh0bygiZ2VuaW5kZXgiKSB9fSI+R2VuZXJhbCBJbmRleDwvYT48YnIvPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImxpbmtkZXNjciI+YWxsIGZ1bmN0aW9ucywgY2xhc3NlcywgdGVybXM8L3NwYW4+PC9wPgpkaWZmIC0tZ2l0IGEvRG9jL3Rvb2xzL3NwaGlueGV4dC9pbmRleHNpZGViYXIuaHRtbCBiL0RvYy90b29scy9zcGhpbnhleHQvaW5kZXhzaWRlYmFyLmh0bWwKaW5kZXggOGQzZmVlZi4uNWM0Yzc1ZCAxMDA2NDQKLS0tIGEvRG9jL3Rvb2xzL3NwaGlueGV4dC9pbmRleHNpZGViYXIuaHRtbAorKysgYi9Eb2MvdG9vbHMvc3BoaW54ZXh0L2luZGV4c2lkZWJhci5odG1sCkBAIC0xLDIzICsxLDE3IEBACi0gICAgICAgICAgICA8aDM+RG93bmxvYWQ8L2gzPgotICAgICAgICAgICAgPHA+PGEgaHJlZj0ie3sgcGF0aHRvKCdkb3dubG9hZCcpIH19Ij5Eb3dubG9hZCB0aGVzZSBkb2N1bWVudHM8L2E+PC9wPgotCSAgICA8aDM+RG9jcyBmb3Igb3RoZXIgdmVyc2lvbnM8L2gzPgotCSAgICA8dWw+Ci0JICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvMi42LyI+UHl0aG9uIDIuNiAoc3RhYmxlKTwvYT48L2xpPgotCSAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vZG9jcy5weXRob24ub3JnLzMuMi8iPlB5dGhvbiAzLjIgKHN0YWJsZSk8L2E+PC9saT4KLQkgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2RvY3MucHl0aG9uLm9yZy9kZXYvIj5QeXRob24gMy4zIChpbiBkZXZlbG9wbWVudCk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvdmVyc2lvbnMvIj5PbGQgdmVyc2lvbnM8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Cis8aDM+RG93bmxvYWQ8L2gzPgorPHA+PGEgaHJlZj0ie3sgcGF0aHRvKCdkb3dubG9hZCcpIH19Ij5Eb3dubG9hZCB0aGVzZSBkb2N1bWVudHM8L2E+PC9wPgorPGgzPkRvY3MgZm9yIG90aGVyIHZlcnNpb25zPC9oMz4KKzx1bD4KKyAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvMy40LyI+UHl0aG9uIDMuNCAoc3RhYmxlKTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iaHR0cDovL2RvY3MucHl0aG9uLm9yZy8zLjUvIj5QeXRob24gMy41IChpbiBkZXZlbG9wbWVudCk8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvdmVyc2lvbnMvIj5PbGQgdmVyc2lvbnM8L2E+PC9saT4KKzwvdWw+CiAKLSAgICAgICAgICAgIDxoMz5PdGhlciByZXNvdXJjZXM8L2gzPgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICB7IyBYWFg6IG1hbnkgb2YgdGhlc2Ugc2hvdWxkIHByb2JhYmx5IGJlIG1lcmdlZCBpbiB0aGUgbWFpbiBkb2NzICN9Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL2ZhcS8iPkZBUXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvZXNzYXlzLyI+R3VpZG8ncyBFc3NheXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvbmV3c3R5bGUvIj5OZXctc3R5bGUgQ2xhc3NlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzLyI+UEVQIEluZGV4PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd2lraS5weXRob24ub3JnL21vaW4vQmVnaW5uZXJzR3VpZGUiPkJlZ2lubmVyJ3MgR3VpZGU8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93aWtpLnB5dGhvbi5vcmcvbW9pbi9QeXRob25Cb29rcyI+Qm9vayBMaXN0PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL2F2LyI+QXVkaW8vVmlzdWFsIFRhbGtzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL290aGVyLyI+T3RoZXIgRG9jIENvbGxlY3Rpb25zPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSJ7eyBwYXRodG8oJ2J1Z3MnKSB9fSI+UmVwb3J0IGEgQnVnPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgorPGgzPk90aGVyIHJlc291cmNlczwvaDM+Cis8dWw+CisgIHsjIFhYWDogbWFueSBvZiB0aGVzZSBzaG91bGQgcHJvYmFibHkgYmUgbWVyZ2VkIGluIHRoZSBtYWluIGRvY3MgI30KKyAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy8iPlBFUCBJbmRleDwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iaHR0cDovL3dpa2kucHl0aG9uLm9yZy9tb2luL0JlZ2lubmVyc0d1aWRlIj5CZWdpbm5lcidzIEd1aWRlPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJodHRwOi8vd2lraS5weXRob24ub3JnL21vaW4vUHl0aG9uQm9va3MiPkJvb2sgTGlzdDwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9hdi8iPkF1ZGlvL1Zpc3VhbCBUYWxrczwvYT48L2xpPgorPC91bD4KZGlmZiAtLWdpdCBhL0RvYy90b29scy9zcGhpbnhleHQvbGF5b3V0Lmh0bWwgYi9Eb2MvdG9vbHMvc3BoaW54ZXh0L2xheW91dC5odG1sCmluZGV4IDg2NTllZjAuLmYyNGRjOGMgMTAwNjQ0Ci0tLSBhL0RvYy90b29scy9zcGhpbnhleHQvbGF5b3V0Lmh0bWwKKysrIGIvRG9jL3Rvb2xzL3NwaGlueGV4dC9sYXlvdXQuaHRtbApAQCAtMiwxOCArMiwzNSBAQAogeyUgYmxvY2sgcm9vdHJlbGxpbmsgJX0KICAgICAgICAgPGxpPjxpbWcgc3JjPSJ7eyBwYXRodG8oJ19zdGF0aWMvcHkucG5nJywgMSkgfX0iIGFsdD0iIgogICAgICAgICAgICAgICAgICBzdHlsZT0idmVydGljYWwtYWxpZ246IG1pZGRsZTsgbWFyZ2luLXRvcDogLTFweCIvPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSJ7eyBwYXRodG8oJ2luZGV4JykgfX0iPnt7IHNob3J0dGl0bGUgfX08L2E+e3sgcmVsZGVsaW0xIH19PC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cucHl0aG9uLm9yZy8iPlB5dGhvbjwvYT57eyByZWxkZWxpbTEgfX08L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgeyUtIGlmIHZlcnNpb25zd2l0Y2hlciBpcyBkZWZpbmVkICV9CisgICAgICAgICAgPHNwYW4gY2xhc3M9InZlcnNpb25fc3dpdGNoZXJfcGxhY2Vob2xkZXIiPnt7IHJlbGVhc2UgfX08L3NwYW4+CisgICAgICAgICAgPGEgaHJlZj0ie3sgcGF0aHRvKCdpbmRleCcpIH19Ij5Eb2N1bWVudGF0aW9uPC9hPnt7IHJlbGRlbGltMSB9fQorICAgICAgICAgIHslLSBlbHNlICV9CisgICAgICAgICAgPGEgaHJlZj0ie3sgcGF0aHRvKCdpbmRleCcpIH19Ij57eyBzaG9ydHRpdGxlIH19PC9hPnt7IHJlbGRlbGltMSB9fQorICAgICAgICAgIHslLSBlbmRpZiAlfQorICAgICAgICA8L2xpPgogeyUgZW5kYmxvY2sgJX0KK3slIGJsb2NrIHJlbGJhcjEgJX0geyUgaWYgYnVpbGRlciAhPSAncXRoZWxwJyAlfSB7eyByZWxiYXIoKSB9fSB7JSBlbmRpZiAlfSB7JSBlbmRibG9jayAlfQoreyUgYmxvY2sgcmVsYmFyMiAlfSB7JSBpZiBidWlsZGVyICE9ICdxdGhlbHAnICV9IHt7IHJlbGJhcigpIH19IHslIGVuZGlmICV9IHslIGVuZGJsb2NrICV9CiB7JSBibG9jayBleHRyYWhlYWQgJX0KICAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0ie3sgcGF0aHRvKCdfc3RhdGljL3B5LnBuZycsIDEpIH19IiAvPgotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Int7IHBhdGh0bygnX3N0YXRpYy9jb3B5YnV0dG9uLmpzJywgMSkgfX0iPjwvc2NyaXB0PgorICAgIHslIGlmIG5vdCBlbWJlZGRlZCAlfTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Int7IHBhdGh0bygnX3N0YXRpYy9jb3B5YnV0dG9uLmpzJywgMSkgfX0iPjwvc2NyaXB0PnslIGVuZGlmICV9CisgICAgeyUgaWYgdmVyc2lvbnN3aXRjaGVyIGlzIGRlZmluZWQgYW5kIG5vdCBlbWJlZGRlZCAlfTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Int7IHBhdGh0bygnX3N0YXRpYy92ZXJzaW9uX3N3aXRjaC5qcycsIDEpIH19Ij48L3NjcmlwdD57JSBlbmRpZiAlfQoge3sgc3VwZXIoKSB9fQorICAgIHslIGlmIGJ1aWxkZXIgPT0gJ3F0aGVscCcgJX0KKyAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAgIGJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgfQorICAgIGRpdi5kb2N1bWVudCB7IGJhY2tncm91bmQtY29sb3I6IHdoaXRlOyB9CisgICAgPC9zdHlsZT4KKyAgICB7JSBlbmRpZiAlfQogeyUgZW5kYmxvY2sgJX0KIHslIGJsb2NrIGZvb3RlciAlfQogICAgIDxkaXYgY2xhc3M9ImZvb3RlciI+CiAgICAgJmNvcHk7IDxhIGhyZWY9Int7IHBhdGh0bygnY29weXJpZ2h0JykgfX0iPkNvcHlyaWdodDwvYT4ge3sgY29weXJpZ2h0fGUgfX0uCiAgICAgPGJyIC8+Ci0gICAgVGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIGlzIGEgbm9uLXByb2ZpdCBjb3Jwb3JhdGlvbi4gIAorICAgIFRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiBpcyBhIG5vbi1wcm9maXQgY29ycG9yYXRpb24uCiAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5weXRob24ub3JnL3BzZi9kb25hdGlvbnMvIj5QbGVhc2UgZG9uYXRlLjwvYT4KICAgICA8YnIgLz4KICAgICBMYXN0IHVwZGF0ZWQgb24ge3sgbGFzdF91cGRhdGVkfGUgfX0uCmRpZmYgLS1naXQgYS9Eb2MvdG9vbHMvc3BoaW54ZXh0L3B5c3BlY2lmaWMucHkgYi9Eb2MvdG9vbHMvc3BoaW54ZXh0L3B5c3BlY2lmaWMucHkKaW5kZXggYTU4OGI0ZC4uYjkwOTY5ZSAxMDA2NDQKLS0tIGEvRG9jL3Rvb2xzL3NwaGlueGV4dC9weXNwZWNpZmljLnB5CisrKyBiL0RvYy90b29scy9zcGhpbnhleHQvcHlzcGVjaWZpYy5weQpAQCAtNSw3ICs1LDcgQEAKIAogICAgIFNwaGlueCBleHRlbnNpb24gd2l0aCBQeXRob24gZG9jLXNwZWNpZmljIG1hcmt1cC4KIAotICAgIDpjb3B5cmlnaHQ6IDIwMDgtMjAxMSBieSBHZW9yZyBCcmFuZGwuCisgICAgOmNvcHlyaWdodDogMjAwOC0yMDEzIGJ5IEdlb3JnIEJyYW5kbC4KICAgICA6bGljZW5zZTogUHl0aG9uIGxpY2Vuc2UuCiAiIiIKIApAQCAtMTQsNiArMTQsMTIgQEAKIAogZnJvbSBkb2N1dGlscyBpbXBvcnQgbm9kZXMsIHV0aWxzCiAKK2ltcG9ydCBzcGhpbngKK2Zyb20gc3BoaW54LnV0aWwubm9kZXMgaW1wb3J0IHNwbGl0X2V4cGxpY2l0X3RpdGxlCitmcm9tIHNwaGlueC53cml0ZXJzLmh0bWwgaW1wb3J0IEhUTUxUcmFuc2xhdG9yCitmcm9tIHNwaGlueC53cml0ZXJzLmxhdGV4IGltcG9ydCBMYVRlWFRyYW5zbGF0b3IKK2Zyb20gc3BoaW54LmxvY2FsZSBpbXBvcnQgdmVyc2lvbmxhYmVscworCiAjIG1vbmtleS1wYXRjaCByZVNUIHBhcnNlciB0byBkaXNhYmxlIGFscGhhYmV0aWMgYW5kIHJvbWFuIGVudW1lcmF0ZWQgbGlzdHMKIGZyb20gZG9jdXRpbHMucGFyc2Vycy5yc3Quc3RhdGVzIGltcG9ydCBCb2R5CiBCb2R5LmVudW0uY29udmVydGVyc1snbG93ZXJhbHBoYSddID0gXApAQCAtMjEsMjAgKzI3LDQ1IEBACiAgICAgQm9keS5lbnVtLmNvbnZlcnRlcnNbJ2xvd2Vycm9tYW4nXSA9IFwKICAgICBCb2R5LmVudW0uY29udmVydGVyc1sndXBwZXJyb21hbiddID0gbGFtYmRhIHg6IE5vbmUKIAotIyBtb25rZXktcGF0Y2ggSFRNTCB0cmFuc2xhdG9yIHRvIGdpdmUgdmVyc2lvbm1vZGlmaWVkIHBhcmFncmFwaHMgYSBjbGFzcwotZGVmIG5ld192aXNpdF92ZXJzaW9ubW9kaWZpZWQoc2VsZiwgbm9kZSk6Ci0gICAgc2VsZi5ib2R5LmFwcGVuZChzZWxmLnN0YXJ0dGFnKG5vZGUsICdwJywgQ0xBU1M9bm9kZVsndHlwZSddKSkKLSAgICB0ZXh0ID0gdmVyc2lvbmxhYmVsc1tub2RlWyd0eXBlJ11dICUgbm9kZVsndmVyc2lvbiddCi0gICAgaWYgbGVuKG5vZGUpOgotICAgICAgICB0ZXh0ICs9ICc6ICcKLSAgICBlbHNlOgotICAgICAgICB0ZXh0ICs9ICcuJwotICAgIHNlbGYuYm9keS5hcHBlbmQoJzxzcGFuIGNsYXNzPSJ2ZXJzaW9ubW9kaWZpZWQiPiVzPC9zcGFuPicgJSB0ZXh0KQoraWYgc3BoaW54Ll9fdmVyc2lvbl9fWzozXSA8ICcxLjInOgorICAgICMgbW9ua2V5LXBhdGNoIEhUTUwgdHJhbnNsYXRvciB0byBnaXZlIHZlcnNpb25tb2RpZmllZCBwYXJhZ3JhcGhzIGEgY2xhc3MKKyAgICBkZWYgbmV3X3Zpc2l0X3ZlcnNpb25tb2RpZmllZChzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5ib2R5LmFwcGVuZChzZWxmLnN0YXJ0dGFnKG5vZGUsICdwJywgQ0xBU1M9bm9kZVsndHlwZSddKSkKKyAgICAgICAgdGV4dCA9IHZlcnNpb25sYWJlbHNbbm9kZVsndHlwZSddXSAlIG5vZGVbJ3ZlcnNpb24nXQorICAgICAgICBpZiBsZW4obm9kZSk6CisgICAgICAgICAgICB0ZXh0ICs9ICc6ICcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRleHQgKz0gJy4nCisgICAgICAgIHNlbGYuYm9keS5hcHBlbmQoJzxzcGFuIGNsYXNzPSJ2ZXJzaW9ubW9kaWZpZWQiPiVzPC9zcGFuPicgJSB0ZXh0KQorICAgIEhUTUxUcmFuc2xhdG9yLnZpc2l0X3ZlcnNpb25tb2RpZmllZCA9IG5ld192aXNpdF92ZXJzaW9ubW9kaWZpZWQKIAotZnJvbSBzcGhpbngud3JpdGVycy5odG1sIGltcG9ydCBIVE1MVHJhbnNsYXRvcgotZnJvbSBzcGhpbngubG9jYWxlIGltcG9ydCB2ZXJzaW9ubGFiZWxzCi1IVE1MVHJhbnNsYXRvci52aXNpdF92ZXJzaW9ubW9kaWZpZWQgPSBuZXdfdmlzaXRfdmVyc2lvbm1vZGlmaWVkCisjIG1vbmtleS1wYXRjaCBIVE1MIGFuZCBMYVRlWCB0cmFuc2xhdG9ycyB0byBrZWVwIGRvY3Rlc3QgYmxvY2tzIGluIHRoZQorIyBkb2N0ZXN0IGRvY3MgdGhlbXNlbHZlcworb3JpZ192aXNpdF9saXRlcmFsX2Jsb2NrID0gSFRNTFRyYW5zbGF0b3IudmlzaXRfbGl0ZXJhbF9ibG9jaworZGVmIG5ld192aXNpdF9saXRlcmFsX2Jsb2NrKHNlbGYsIG5vZGUpOgorICAgIG1ldGEgPSBzZWxmLmJ1aWxkZXIuZW52Lm1ldGFkYXRhW3NlbGYuYnVpbGRlci5jdXJyZW50X2RvY25hbWVdCisgICAgb2xkX3RyaW1fZG9jdGVzdF9mbGFncyA9IHNlbGYuaGlnaGxpZ2h0ZXIudHJpbV9kb2N0ZXN0X2ZsYWdzCisgICAgaWYgJ2tlZXBkb2N0ZXN0JyBpbiBtZXRhOgorICAgICAgICBzZWxmLmhpZ2hsaWdodGVyLnRyaW1fZG9jdGVzdF9mbGFncyA9IEZhbHNlCisgICAgdHJ5OgorICAgICAgICBvcmlnX3Zpc2l0X2xpdGVyYWxfYmxvY2soc2VsZiwgbm9kZSkKKyAgICBmaW5hbGx5OgorICAgICAgICBzZWxmLmhpZ2hsaWdodGVyLnRyaW1fZG9jdGVzdF9mbGFncyA9IG9sZF90cmltX2RvY3Rlc3RfZmxhZ3MKIAorSFRNTFRyYW5zbGF0b3IudmlzaXRfbGl0ZXJhbF9ibG9jayA9IG5ld192aXNpdF9saXRlcmFsX2Jsb2NrCisKK29yaWdfZGVwYXJ0X2xpdGVyYWxfYmxvY2sgPSBMYVRlWFRyYW5zbGF0b3IuZGVwYXJ0X2xpdGVyYWxfYmxvY2sKK2RlZiBuZXdfZGVwYXJ0X2xpdGVyYWxfYmxvY2soc2VsZiwgbm9kZSk6CisgICAgbWV0YSA9IHNlbGYuYnVpbGRlci5lbnYubWV0YWRhdGFbc2VsZi5jdXJmaWxlc3RhY2tbLTFdXQorICAgIG9sZF90cmltX2RvY3Rlc3RfZmxhZ3MgPSBzZWxmLmhpZ2hsaWdodGVyLnRyaW1fZG9jdGVzdF9mbGFncworICAgIGlmICdrZWVwZG9jdGVzdCcgaW4gbWV0YToKKyAgICAgICAgc2VsZi5oaWdobGlnaHRlci50cmltX2RvY3Rlc3RfZmxhZ3MgPSBGYWxzZQorICAgIHRyeToKKyAgICAgICAgb3JpZ19kZXBhcnRfbGl0ZXJhbF9ibG9jayhzZWxmLCBub2RlKQorICAgIGZpbmFsbHk6CisgICAgICAgIHNlbGYuaGlnaGxpZ2h0ZXIudHJpbV9kb2N0ZXN0X2ZsYWdzID0gb2xkX3RyaW1fZG9jdGVzdF9mbGFncworCitMYVRlWFRyYW5zbGF0b3IuZGVwYXJ0X2xpdGVyYWxfYmxvY2sgPSBuZXdfZGVwYXJ0X2xpdGVyYWxfYmxvY2sKIAogIyBTdXBwb3J0IGZvciBtYXJraW5nIHVwIGFuZCBsaW5raW5nIHRvIGJ1Z3MucHl0aG9uLm9yZyBpc3N1ZXMKIApAQCAtNDgsOCArNzksMTAgQEAKICMgU3VwcG9ydCBmb3IgbGlua2luZyB0byBQeXRob24gc291cmNlIGZpbGVzIGVhc2lseQogCiBkZWYgc291cmNlX3JvbGUodHlwLCByYXd0ZXh0LCB0ZXh0LCBsaW5lbm8sIGlubGluZXIsIG9wdGlvbnM9e30sIGNvbnRlbnQ9W10pOgotICAgIHBhdGggPSB1dGlscy51bmVzY2FwZSh0ZXh0KQotICAgIHJlZm5vZGUgPSBub2Rlcy5yZWZlcmVuY2UocGF0aCwgcGF0aCwgcmVmdXJpPVNPVVJDRV9VUkkgJSBwYXRoKQorICAgIGhhc190LCB0aXRsZSwgdGFyZ2V0ID0gc3BsaXRfZXhwbGljaXRfdGl0bGUodGV4dCkKKyAgICB0aXRsZSA9IHV0aWxzLnVuZXNjYXBlKHRpdGxlKQorICAgIHRhcmdldCA9IHV0aWxzLnVuZXNjYXBlKHRhcmdldCkKKyAgICByZWZub2RlID0gbm9kZXMucmVmZXJlbmNlKHRpdGxlLCB0aXRsZSwgcmVmdXJpPVNPVVJDRV9VUkkgJSB0YXJnZXQpCiAgICAgcmV0dXJuIFtyZWZub2RlXSwgW10KIAogCkBAIC04MSwyNiArMTE0LDg1IEBACiAgICAgICAgIHJldHVybiBbcG5vZGVdCiAKIAorIyBTdXBwb3J0IGZvciBkb2N1bWVudGluZyBkZWNvcmF0b3JzCisKK2Zyb20gc3BoaW54IGltcG9ydCBhZGRub2RlcworZnJvbSBzcGhpbnguZG9tYWlucy5weXRob24gaW1wb3J0IFB5TW9kdWxlbGV2ZWwsIFB5Q2xhc3NtZW1iZXIKKworY2xhc3MgUHlEZWNvcmF0b3JNaXhpbihvYmplY3QpOgorICAgIGRlZiBoYW5kbGVfc2lnbmF0dXJlKHNlbGYsIHNpZywgc2lnbm9kZSk6CisgICAgICAgIHJldCA9IHN1cGVyKFB5RGVjb3JhdG9yTWl4aW4sIHNlbGYpLmhhbmRsZV9zaWduYXR1cmUoc2lnLCBzaWdub2RlKQorICAgICAgICBzaWdub2RlLmluc2VydCgwLCBhZGRub2Rlcy5kZXNjX2FkZG5hbWUoJ0AnLCAnQCcpKQorICAgICAgICByZXR1cm4gcmV0CisKKyAgICBkZWYgbmVlZHNfYXJnbGlzdChzZWxmKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKK2NsYXNzIFB5RGVjb3JhdG9yRnVuY3Rpb24oUHlEZWNvcmF0b3JNaXhpbiwgUHlNb2R1bGVsZXZlbCk6CisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgIyBhIGRlY29yYXRvciBmdW5jdGlvbiBpcyBhIGZ1bmN0aW9uIGFmdGVyIGFsbAorICAgICAgICBzZWxmLm5hbWUgPSAncHk6ZnVuY3Rpb24nCisgICAgICAgIHJldHVybiBQeU1vZHVsZWxldmVsLnJ1bihzZWxmKQorCitjbGFzcyBQeURlY29yYXRvck1ldGhvZChQeURlY29yYXRvck1peGluLCBQeUNsYXNzbWVtYmVyKToKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBzZWxmLm5hbWUgPSAncHk6bWV0aG9kJworICAgICAgICByZXR1cm4gUHlDbGFzc21lbWJlci5ydW4oc2VsZikKKworCisjIFN1cHBvcnQgZm9yIGRvY3VtZW50aW5nIHZlcnNpb24gb2YgcmVtb3ZhbCBpbiBkZXByZWNhdGlvbnMKKworZnJvbSBzcGhpbngubG9jYWxlIGltcG9ydCB2ZXJzaW9ubGFiZWxzCitmcm9tIHNwaGlueC51dGlsLmNvbXBhdCBpbXBvcnQgRGlyZWN0aXZlCisKK3ZlcnNpb25sYWJlbHNbJ2RlcHJlY2F0ZWQtcmVtb3ZlZCddID0gXAorICAgICdEZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gJXMsIHdpbGwgYmUgcmVtb3ZlZCBpbiB2ZXJzaW9uICVzJworCitjbGFzcyBEZXByZWNhdGVkUmVtb3ZlZChEaXJlY3RpdmUpOgorICAgIGhhc19jb250ZW50ID0gVHJ1ZQorICAgIHJlcXVpcmVkX2FyZ3VtZW50cyA9IDIKKyAgICBvcHRpb25hbF9hcmd1bWVudHMgPSAxCisgICAgZmluYWxfYXJndW1lbnRfd2hpdGVzcGFjZSA9IFRydWUKKyAgICBvcHRpb25fc3BlYyA9IHt9CisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBub2RlID0gYWRkbm9kZXMudmVyc2lvbm1vZGlmaWVkKCkKKyAgICAgICAgbm9kZS5kb2N1bWVudCA9IHNlbGYuc3RhdGUuZG9jdW1lbnQKKyAgICAgICAgbm9kZVsndHlwZSddID0gJ2RlcHJlY2F0ZWQtcmVtb3ZlZCcKKyAgICAgICAgdmVyc2lvbiA9IChzZWxmLmFyZ3VtZW50c1swXSwgc2VsZi5hcmd1bWVudHNbMV0pCisgICAgICAgIG5vZGVbJ3ZlcnNpb24nXSA9IHZlcnNpb24KKyAgICAgICAgaWYgbGVuKHNlbGYuYXJndW1lbnRzKSA9PSAzOgorICAgICAgICAgICAgaW5vZGVzLCBtZXNzYWdlcyA9IHNlbGYuc3RhdGUuaW5saW5lX3RleHQoc2VsZi5hcmd1bWVudHNbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmVubysxKQorICAgICAgICAgICAgbm9kZS5leHRlbmQoaW5vZGVzKQorICAgICAgICAgICAgaWYgc2VsZi5jb250ZW50OgorICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUubmVzdGVkX3BhcnNlKHNlbGYuY29udGVudCwgc2VsZi5jb250ZW50X29mZnNldCwgbm9kZSkKKyAgICAgICAgICAgIHJldCA9IFtub2RlXSArIG1lc3NhZ2VzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXQgPSBbbm9kZV0KKyAgICAgICAgZW52ID0gc2VsZi5zdGF0ZS5kb2N1bWVudC5zZXR0aW5ncy5lbnYKKyAgICAgICAgZW52Lm5vdGVfdmVyc2lvbmNoYW5nZSgnZGVwcmVjYXRlZCcsIHZlcnNpb25bMF0sIG5vZGUsIHNlbGYubGluZW5vKQorICAgICAgICByZXR1cm4gcmV0CisKKwogIyBTdXBwb3J0IGZvciBidWlsZGluZyAidG9waWMgaGVscCIgZm9yIHB5ZG9jCiAKIHB5ZG9jX3RvcGljX2xhYmVscyA9IFsKICAgICAnYXNzZXJ0JywgJ2Fzc2lnbm1lbnQnLCAnYXRvbS1pZGVudGlmaWVycycsICdhdG9tLWxpdGVyYWxzJywKICAgICAnYXR0cmlidXRlLWFjY2VzcycsICdhdHRyaWJ1dGUtcmVmZXJlbmNlcycsICdhdWdhc3NpZ24nLCAnYmluYXJ5JywKICAgICAnYml0d2lzZScsICdibHRpbi1jb2RlLW9iamVjdHMnLCAnYmx0aW4tZWxsaXBzaXMtb2JqZWN0JywKLSAgICAnYmx0aW4tZmlsZS1vYmplY3RzJywgJ2JsdGluLW51bGwtb2JqZWN0JywgJ2JsdGluLXR5cGUtb2JqZWN0cycsICdib29sZWFucycsCi0gICAgJ2JyZWFrJywgJ2NhbGxhYmxlLXR5cGVzJywgJ2NhbGxzJywgJ2NsYXNzJywgJ2NvZXJjaW9uLXJ1bGVzJywKLSAgICAnY29tcGFyaXNvbnMnLCAnY29tcG91bmQnLCAnY29udGV4dC1tYW5hZ2VycycsICdjb250aW51ZScsICdjb252ZXJzaW9ucycsCi0gICAgJ2N1c3RvbWl6YXRpb24nLCAnZGVidWdnZXInLCAnZGVsJywgJ2RpY3QnLCAnZHluYW1pYy1mZWF0dXJlcycsICdlbHNlJywKLSAgICAnZXhjZXB0aW9ucycsICdleGVjJywgJ2V4ZWNtb2RlbCcsICdleHBybGlzdHMnLCAnZmxvYXRpbmcnLCAnZm9yJywKLSAgICAnZm9ybWF0c3RyaW5ncycsICdmdW5jdGlvbicsICdnbG9iYWwnLCAnaWQtY2xhc3NlcycsICdpZGVudGlmaWVycycsICdpZicsCi0gICAgJ2ltYWdpbmFyeScsICdpbXBvcnQnLCAnaW4nLCAnaW50ZWdlcnMnLCAnbGFtYmRhJywgJ2xpc3RzJywgJ25hbWluZycsCi0gICAgJ251bWJlcnMnLCAnbnVtZXJpYy10eXBlcycsICdvYmplY3RzJywgJ29wZXJhdG9yLXN1bW1hcnknLCAncGFzcycsICdwb3dlcicsCi0gICAgJ3ByaW50JywgJ3JhaXNlJywgJ3JldHVybicsICdzZXF1ZW5jZS1tZXRob2RzJywgJ3NlcXVlbmNlLXR5cGVzJywKLSAgICAnc2hpZnRpbmcnLCAnc2xpY2luZ3MnLCAnc3BlY2lhbGF0dHJzJywgJ3NwZWNpYWxuYW1lcycsCi0gICAgJ3N0cmluZy1jb252ZXJzaW9ucycsICdzdHJpbmctbWV0aG9kcycsICdzdHJpbmdzJywgJ3N1YnNjcmlwdGlvbnMnLCAndHJ1dGgnLAotICAgICd0cnknLCAndHlwZXMnLCAndHlwZXNmdW5jdGlvbnMnLCAndHlwZXNtYXBwaW5nJywgJ3R5cGVzbWV0aG9kcycsCi0gICAgJ3R5cGVzbW9kdWxlcycsICd0eXBlc3NlcScsICd0eXBlc3NlcS1tdXRhYmxlJywgJ3VuYXJ5JywgJ3doaWxlJywgJ3dpdGgnLAotICAgICd5aWVsZCcKKyAgICAnYmx0aW4tbnVsbC1vYmplY3QnLCAnYmx0aW4tdHlwZS1vYmplY3RzJywgJ2Jvb2xlYW5zJywKKyAgICAnYnJlYWsnLCAnY2FsbGFibGUtdHlwZXMnLCAnY2FsbHMnLCAnY2xhc3MnLCAnY29tcGFyaXNvbnMnLCAnY29tcG91bmQnLAorICAgICdjb250ZXh0LW1hbmFnZXJzJywgJ2NvbnRpbnVlJywgJ2NvbnZlcnNpb25zJywgJ2N1c3RvbWl6YXRpb24nLCAnZGVidWdnZXInLAorICAgICdkZWwnLCAnZGljdCcsICdkeW5hbWljLWZlYXR1cmVzJywgJ2Vsc2UnLCAnZXhjZXB0aW9ucycsICdleGVjJywgJ2V4ZWNtb2RlbCcsCisgICAgJ2V4cHJsaXN0cycsICdmbG9hdGluZycsICdmb3InLCAnZm9ybWF0c3RyaW5ncycsICdmdW5jdGlvbicsICdnbG9iYWwnLAorICAgICdpZC1jbGFzc2VzJywgJ2lkZW50aWZpZXJzJywgJ2lmJywgJ2ltYWdpbmFyeScsICdpbXBvcnQnLCAnaW4nLCAnaW50ZWdlcnMnLAorICAgICdsYW1iZGEnLCAnbGlzdHMnLCAnbmFtaW5nJywgJ251bWJlcnMnLCAnbnVtZXJpYy10eXBlcycsCisgICAgJ29iamVjdHMnLCAnb3BlcmF0b3Itc3VtbWFyeScsICdwYXNzJywgJ3Bvd2VyJywgJ3ByaW50JywgJ3JhaXNlJywgJ3JldHVybicsCisgICAgJ3NlcXVlbmNlLXR5cGVzJywgJ3NoaWZ0aW5nJywgJ3NsaWNpbmdzJywgJ3NwZWNpYWxhdHRycycsICdzcGVjaWFsbmFtZXMnLAorICAgICdzdHJpbmctbWV0aG9kcycsICdzdHJpbmdzJywgJ3N1YnNjcmlwdGlvbnMnLCAndHJ1dGgnLCAndHJ5JywgJ3R5cGVzJywKKyAgICAndHlwZXNmdW5jdGlvbnMnLCAndHlwZXNtYXBwaW5nJywgJ3R5cGVzbWV0aG9kcycsICd0eXBlc21vZHVsZXMnLAorICAgICd0eXBlc3NlcScsICd0eXBlc3NlcS1tdXRhYmxlJywgJ3VuYXJ5JywgJ3doaWxlJywgJ3dpdGgnLCAneWllbGQnCiBdCiAKIGZyb20gb3MgaW1wb3J0IHBhdGgKQEAgLTEzMCwxNiArMjIyLDE2IEBACiAgICAgICAgIGZvciBsYWJlbCBpbiBzZWxmLnN0YXR1c19pdGVyYXRvcihweWRvY190b3BpY19sYWJlbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnVpbGRpbmcgdG9waWNzLi4uICcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg9bGVuKHB5ZG9jX3RvcGljX2xhYmVscykpOgotICAgICAgICAgICAgaWYgbGFiZWwgbm90IGluIHNlbGYuZW52LmxhYmVsczoKKyAgICAgICAgICAgIGlmIGxhYmVsIG5vdCBpbiBzZWxmLmVudi5kb21haW5kYXRhWydzdGQnXVsnbGFiZWxzJ106CiAgICAgICAgICAgICAgICAgc2VsZi53YXJuKCdsYWJlbCAlciBub3QgaW4gZG9jdW1lbnRhdGlvbicgJSBsYWJlbCkKICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgZG9jbmFtZSwgbGFiZWxpZCwgc2VjdG5hbWUgPSBzZWxmLmVudi5sYWJlbHNbbGFiZWxdCisgICAgICAgICAgICBkb2NuYW1lLCBsYWJlbGlkLCBzZWN0bmFtZSA9IHNlbGYuZW52LmRvbWFpbmRhdGFbJ3N0ZCddWydsYWJlbHMnXVtsYWJlbF0KICAgICAgICAgICAgIGRvY3RyZWUgPSBzZWxmLmVudi5nZXRfYW5kX3Jlc29sdmVfZG9jdHJlZShkb2NuYW1lLCBzZWxmKQogICAgICAgICAgICAgZG9jdW1lbnQgPSBuZXdfZG9jdW1lbnQoJzxzZWN0aW9uIG5vZGU+JykKICAgICAgICAgICAgIGRvY3VtZW50LmFwcGVuZChkb2N0cmVlLmlkc1tsYWJlbGlkXSkKICAgICAgICAgICAgIGRlc3RpbmF0aW9uID0gU3RyaW5nT3V0cHV0KGVuY29kaW5nPSd1dGYtOCcpCiAgICAgICAgICAgICB3cml0ZXIud3JpdGUoZG9jdW1lbnQsIGRlc3RpbmF0aW9uKQotICAgICAgICAgICAgc2VsZi50b3BpY3NbbGFiZWxdID0gd3JpdGVyLm91dHB1dAorICAgICAgICAgICAgc2VsZi50b3BpY3NbbGFiZWxdID0gc3RyKHdyaXRlci5vdXRwdXQpCiAKICAgICBkZWYgZmluaXNoKHNlbGYpOgogICAgICAgICBmID0gb3BlbihwYXRoLmpvaW4oc2VsZi5vdXRkaXIsICd0b3BpY3MucHknKSwgJ3cnKQpAQCAtMTU4LDkgKzI1MCw4IEBACiAjIFN1cHBvcnQgZm9yIGRvY3VtZW50aW5nIE9wY29kZXMKIAogaW1wb3J0IHJlCi1mcm9tIHNwaGlueCBpbXBvcnQgYWRkbm9kZXMKIAotb3Bjb2RlX3NpZ19yZSA9IHJlLmNvbXBpbGUocicoXHcrKD86XCtcZCk/KVxzKlwoKC4qKVwpJykKK29wY29kZV9zaWdfcmUgPSByZS5jb21waWxlKHInKFx3Kyg/OlwrXGQpPykoPzpccypcKCguKilcKSk/JykKIAogZGVmIHBhcnNlX29wY29kZV9zaWduYXR1cmUoZW52LCBzaWcsIHNpZ25vZGUpOgogICAgICIiIlRyYW5zZm9ybSBhbiBvcGNvZGUgc2lnbmF0dXJlIGludG8gUlNUIG5vZGVzLiIiIgpAQCAtMTY5LDE4ICsyNjAsNDggQEAKICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgogICAgIG9wbmFtZSwgYXJnbGlzdCA9IG0uZ3JvdXBzKCkKICAgICBzaWdub2RlICs9IGFkZG5vZGVzLmRlc2NfbmFtZShvcG5hbWUsIG9wbmFtZSkKLSAgICBwYXJhbWxpc3QgPSBhZGRub2Rlcy5kZXNjX3BhcmFtZXRlcmxpc3QoKQotICAgIHNpZ25vZGUgKz0gcGFyYW1saXN0Ci0gICAgcGFyYW1saXN0ICs9IGFkZG5vZGVzLmRlc2NfcGFyYW1ldGVyKGFyZ2xpc3QsIGFyZ2xpc3QpCisgICAgaWYgYXJnbGlzdCBpcyBub3QgTm9uZToKKyAgICAgICAgcGFyYW1saXN0ID0gYWRkbm9kZXMuZGVzY19wYXJhbWV0ZXJsaXN0KCkKKyAgICAgICAgc2lnbm9kZSArPSBwYXJhbWxpc3QKKyAgICAgICAgcGFyYW1saXN0ICs9IGFkZG5vZGVzLmRlc2NfcGFyYW1ldGVyKGFyZ2xpc3QsIGFyZ2xpc3QpCiAgICAgcmV0dXJuIG9wbmFtZS5zdHJpcCgpCiAKIAorIyBTdXBwb3J0IGZvciBkb2N1bWVudGluZyBwZGIgY29tbWFuZHMKKworcGRiY21kX3NpZ19yZSA9IHJlLmNvbXBpbGUocicoW2EteigpIV0rKVxzKiguKiknKQorCisjIGxhdGVyLi4uCisjcGRiYXJnc190b2tlbnNfcmUgPSByZS5jb21waWxlKHInJydbYS16QS1aXSsgIHwgICMgaWRlbnRpZmllcnMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsuLDpdKyAgICAgfCAgIyBwdW5jdHVhdGlvbgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xbXF0oKV0gICB8ICAjIHBhcmVucworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHMrICAgICAgICAgICAjIHdoaXRlc3BhY2UKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnJywgcmUuWCkKKworZGVmIHBhcnNlX3BkYl9jb21tYW5kKGVudiwgc2lnLCBzaWdub2RlKToKKyAgICAiIiJUcmFuc2Zvcm0gYSBwZGIgY29tbWFuZCBzaWduYXR1cmUgaW50byBSU1Qgbm9kZXMuIiIiCisgICAgbSA9IHBkYmNtZF9zaWdfcmUubWF0Y2goc2lnKQorICAgIGlmIG0gaXMgTm9uZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgIG5hbWUsIGFyZ3MgPSBtLmdyb3VwcygpCisgICAgZnVsbG5hbWUgPSBuYW1lLnJlcGxhY2UoJygnLCAnJykucmVwbGFjZSgnKScsICcnKQorICAgIHNpZ25vZGUgKz0gYWRkbm9kZXMuZGVzY19uYW1lKG5hbWUsIG5hbWUpCisgICAgaWYgYXJnczoKKyAgICAgICAgc2lnbm9kZSArPSBhZGRub2Rlcy5kZXNjX2FkZG5hbWUoJyAnK2FyZ3MsICcgJythcmdzKQorICAgIHJldHVybiBmdWxsbmFtZQorCisKIGRlZiBzZXR1cChhcHApOgogICAgIGFwcC5hZGRfcm9sZSgnaXNzdWUnLCBpc3N1ZV9yb2xlKQogICAgIGFwcC5hZGRfcm9sZSgnc291cmNlJywgc291cmNlX3JvbGUpCiAgICAgYXBwLmFkZF9kaXJlY3RpdmUoJ2ltcGwtZGV0YWlsJywgSW1wbGVtZW50YXRpb25EZXRhaWwpCisgICAgYXBwLmFkZF9kaXJlY3RpdmUoJ2RlcHJlY2F0ZWQtcmVtb3ZlZCcsIERlcHJlY2F0ZWRSZW1vdmVkKQogICAgIGFwcC5hZGRfYnVpbGRlcihQeWRvY1RvcGljc0J1aWxkZXIpCiAgICAgYXBwLmFkZF9idWlsZGVyKHN1c3BpY2lvdXMuQ2hlY2tTdXNwaWNpb3VzTWFya3VwQnVpbGRlcikKICAgICBhcHAuYWRkX2Rlc2NyaXB0aW9uX3VuaXQoJ29wY29kZScsICdvcGNvZGUnLCAnJXMgKG9wY29kZSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZV9vcGNvZGVfc2lnbmF0dXJlKQorICAgIGFwcC5hZGRfZGVzY3JpcHRpb25fdW5pdCgncGRiY29tbWFuZCcsICdwZGJjbWQnLCAnJXMgKHBkYiBjb21tYW5kKScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX3BkYl9jb21tYW5kKQogICAgIGFwcC5hZGRfZGVzY3JpcHRpb25fdW5pdCgnMnRvM2ZpeGVyJywgJzJ0bzNmaXhlcicsICclcyAoMnRvMyBmaXhlciknKQorICAgIGFwcC5hZGRfZGlyZWN0aXZlX3RvX2RvbWFpbigncHknLCAnZGVjb3JhdG9yJywgUHlEZWNvcmF0b3JGdW5jdGlvbikKKyAgICBhcHAuYWRkX2RpcmVjdGl2ZV90b19kb21haW4oJ3B5JywgJ2RlY29yYXRvcm1ldGhvZCcsIFB5RGVjb3JhdG9yTWV0aG9kKQpkaWZmIC0tZ2l0IGEvRG9jL3Rvb2xzL3NwaGlueGV4dC9zdGF0aWMvYmFzaWMuY3NzIGIvRG9jL3Rvb2xzL3NwaGlueGV4dC9zdGF0aWMvYmFzaWMuY3NzCmluZGV4IDJiNDc2MjIuLjIxYzNkYjIgMTAwNjQ0Ci0tLSBhL0RvYy90b29scy9zcGhpbnhleHQvc3RhdGljL2Jhc2ljLmNzcworKysgYi9Eb2MvdG9vbHMvc3BoaW54ZXh0L3N0YXRpYy9iYXNpYy5jc3MKQEAgLTM4LDcgKzM4LDEwIEBACiAvKiAtLSBzaWRlYmFyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBkaXYuc3BoaW54c2lkZWJhcndyYXBwZXIgeworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICB0b3A6IDA7CiAgICAgcGFkZGluZzogMTBweCA1cHggMCAxMHB4OworICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKIH0KIAogZGl2LnNwaGlueHNpZGViYXIgewpAQCAtMjUzLDggKzI1Niw4IEBACiAKIHRhYmxlLmRvY3V0aWxzIHRkLCB0YWJsZS5kb2N1dGlscyB0aCB7CiAgICAgcGFkZGluZzogMnB4IDVweCAycHggNXB4OwotICAgIGJvcmRlci1sZWZ0OiAwOyAgICAKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVmOyAgICAKKyAgICBib3JkZXItbGVmdDogMDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVmOwogfQogCiB0YWJsZS5kb2N1dGlscyB0ZCBwLmxhc3QsIHRhYmxlLmRvY3V0aWxzIHRoIHAubGFzdCB7CkBAIC0yNzAsNyArMjczLDcgQEAKIH0KIAogdGFibGUuZG9jdXRpbHMgdGggewotICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjY2FjOyAgICAKKyAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2NhYzsKICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWRlOwogfQogCkBAIC0yODAsNyArMjgzLDcgQEAKIH0KIAogdGguaGVhZCB7Ci0gICAgdGV4dC1hbGlnbjogY2VudGVyOyAgICAKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiB9CiAKIC8qIC0tIG90aGVyIGJvZHkgc3R5bGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0zMzMsMTAgKzMzNiwxNCBAQAogICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKIH0KIAotcC5kZXByZWNhdGVkIHsKKy5kZXByZWNhdGVkIHsKICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZlNGU0OwogICAgIGJvcmRlcjogMXB4IHNvbGlkICNmNjY7Ci0gICAgcGFkZGluZzogN3B4CisgICAgcGFkZGluZzogN3B4OworfQorCitkaXYuZGVwcmVjYXRlZCBwIHsKKyAgICBtYXJnaW4tYm90dG9tOiAwOwogfQogCiAuc3lzdGVtLW1lc3NhZ2UgewpkaWZmIC0tZ2l0IGEvRG9jL3Rvb2xzL3NwaGlueGV4dC9zdGF0aWMvY29weWJ1dHRvbi5qcyBiL0RvYy90b29scy9zcGhpbnhleHQvc3RhdGljL2NvcHlidXR0b24uanMKaW5kZXggOTFmODc2My4uYTNiMTA5OSAxMDA2NDQKLS0tIGEvRG9jL3Rvb2xzL3NwaGlueGV4dC9zdGF0aWMvY29weWJ1dHRvbi5qcworKysgYi9Eb2MvdG9vbHMvc3BoaW54ZXh0L3N0YXRpYy9jb3B5YnV0dG9uLmpzCkBAIC04LDggKzgsOCBAQAogCiAgICAgLy8gZ2V0IHRoZSBzdHlsZXMgZnJvbSB0aGUgY3VycmVudCB0aGVtZQogICAgIHByZS5wYXJlbnQoKS5wYXJlbnQoKS5jc3MoJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJyk7Ci0gICAgdmFyIGhpZGVfdGV4dCA9ICdIaWRlIHRoZSBwcm9tcHRzIGFuZCBvdXB1dCc7Ci0gICAgdmFyIHNob3dfdGV4dCA9ICdTaG93IHRoZSBwcm9tcHRzIGFuZCBvdXB1dCc7CisgICAgdmFyIGhpZGVfdGV4dCA9ICdIaWRlIHRoZSBwcm9tcHRzIGFuZCBvdXRwdXQnOworICAgIHZhciBzaG93X3RleHQgPSAnU2hvdyB0aGUgcHJvbXB0cyBhbmQgb3V0cHV0JzsKICAgICB2YXIgYm9yZGVyX3dpZHRoID0gcHJlLmNzcygnYm9yZGVyLXRvcC13aWR0aCcpOwogICAgIHZhciBib3JkZXJfc3R5bGUgPSBwcmUuY3NzKCdib3JkZXItdG9wLXN0eWxlJyk7CiAgICAgdmFyIGJvcmRlcl9jb2xvciA9IHByZS5jc3MoJ2JvcmRlci10b3AtY29sb3InKTsKZGlmZiAtLWdpdCBhL0RvYy90b29scy9zcGhpbnhleHQvc3RhdGljL3NpZGViYXIuanMgYi9Eb2MvdG9vbHMvc3BoaW54ZXh0L3N0YXRpYy9zaWRlYmFyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZGQ4MjkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2MvdG9vbHMvc3BoaW54ZXh0L3N0YXRpYy9zaWRlYmFyLmpzCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICogc2lkZWJhci5qcworICogfn5+fn5+fn5+fgorICoKKyAqIFRoaXMgc2NyaXB0IG1ha2VzIHRoZSBTcGhpbnggc2lkZWJhciBjb2xsYXBzaWJsZSBhbmQgaW1wbGVtZW50cworICogaW50ZWxsaWdlbnQgc2Nyb2xsaW5nLgorICoKKyAqIC5zcGhpbnhzaWRlYmFyIGNvbnRhaW5zIC5zcGhpbnhzaWRlYmFyd3JhcHBlci4gIFRoaXMgc2NyaXB0IGFkZHMKKyAqIGluIC5zcGhpeHNpZGViYXIsIGFmdGVyIC5zcGhpbnhzaWRlYmFyd3JhcHBlciwgdGhlICNzaWRlYmFyYnV0dG9uCisgKiB1c2VkIHRvIGNvbGxhcHNlIGFuZCBleHBhbmQgdGhlIHNpZGViYXIuCisgKgorICogV2hlbiB0aGUgc2lkZWJhciBpcyBjb2xsYXBzZWQgdGhlIC5zcGhpbnhzaWRlYmFyd3JhcHBlciBpcyBoaWRkZW4KKyAqIGFuZCB0aGUgd2lkdGggb2YgdGhlIHNpZGViYXIgYW5kIHRoZSBtYXJnaW4tbGVmdCBvZiB0aGUgZG9jdW1lbnQKKyAqIGFyZSBkZWNyZWFzZWQuIFdoZW4gdGhlIHNpZGViYXIgaXMgZXhwYW5kZWQgdGhlIG9wcG9zaXRlIGhhcHBlbnMuCisgKiBUaGlzIHNjcmlwdCBzYXZlcyBhIHBlci1icm93c2VyL3Blci1zZXNzaW9uIGNvb2tpZSB1c2VkIHRvCisgKiByZW1lbWJlciB0aGUgcG9zaXRpb24gb2YgdGhlIHNpZGViYXIgYW1vbmcgdGhlIHBhZ2VzLgorICogT25jZSB0aGUgYnJvd3NlciBpcyBjbG9zZWQgdGhlIGNvb2tpZSBpcyBkZWxldGVkIGFuZCB0aGUgcG9zaXRpb24KKyAqIHJlc2V0IHRvIHRoZSBkZWZhdWx0IChleHBhbmRlZCkuCisgKgorICogOmNvcHlyaWdodDogQ29weXJpZ2h0IDIwMDctMjAxMSBieSB0aGUgU3BoaW54IHRlYW0sIHNlZSBBVVRIT1JTLgorICogOmxpY2Vuc2U6IEJTRCwgc2VlIExJQ0VOU0UgZm9yIGRldGFpbHMuCisgKgorICovCisKKyQoZnVuY3Rpb24oKSB7CisgIC8vIGdsb2JhbCBlbGVtZW50cyB1c2VkIGJ5IHRoZSBmdW5jdGlvbnMuCisgIC8vIHRoZSAnc2lkZWJhcmJ1dHRvbicgZWxlbWVudCBpcyBkZWZpbmVkIGFzIGdsb2JhbCBhZnRlciBpdHMKKyAgLy8gY3JlYXRpb24sIGluIHRoZSBhZGRfc2lkZWJhcl9idXR0b24gZnVuY3Rpb24KKyAgdmFyIGp3aW5kb3cgPSAkKHdpbmRvdyk7CisgIHZhciBqZG9jdW1lbnQgPSAkKGRvY3VtZW50KTsKKyAgdmFyIGJvZHl3cmFwcGVyID0gJCgnLmJvZHl3cmFwcGVyJyk7CisgIHZhciBzaWRlYmFyID0gJCgnLnNwaGlueHNpZGViYXInKTsKKyAgdmFyIHNpZGViYXJ3cmFwcGVyID0gJCgnLnNwaGlueHNpZGViYXJ3cmFwcGVyJyk7CisKKyAgLy8gb3JpZ2luYWwgbWFyZ2luLWxlZnQgb2YgdGhlIGJvZHl3cmFwcGVyIGFuZCB3aWR0aCBvZiB0aGUgc2lkZWJhcgorICAvLyB3aXRoIHRoZSBzaWRlYmFyIGV4cGFuZGVkCisgIHZhciBid19tYXJnaW5fZXhwYW5kZWQgPSBib2R5d3JhcHBlci5jc3MoJ21hcmdpbi1sZWZ0Jyk7CisgIHZhciBzc2Jfd2lkdGhfZXhwYW5kZWQgPSBzaWRlYmFyLndpZHRoKCk7CisKKyAgLy8gbWFyZ2luLWxlZnQgb2YgdGhlIGJvZHl3cmFwcGVyIGFuZCB3aWR0aCBvZiB0aGUgc2lkZWJhcgorICAvLyB3aXRoIHRoZSBzaWRlYmFyIGNvbGxhcHNlZAorICB2YXIgYndfbWFyZ2luX2NvbGxhcHNlZCA9ICcuOGVtJzsKKyAgdmFyIHNzYl93aWR0aF9jb2xsYXBzZWQgPSAnLjhlbSc7CisKKyAgLy8gY29sb3JzIHVzZWQgYnkgdGhlIGN1cnJlbnQgdGhlbWUKKyAgdmFyIGRhcmtfY29sb3IgPSAkKCcucmVsYXRlZCcpLmNzcygnYmFja2dyb3VuZC1jb2xvcicpOworICB2YXIgbGlnaHRfY29sb3IgPSAkKCcuZG9jdW1lbnQnKS5jc3MoJ2JhY2tncm91bmQtY29sb3InKTsKKworICBmdW5jdGlvbiBnZXRfdmlld3BvcnRfaGVpZ2h0KCkgeworICAgIGlmICh3aW5kb3cuaW5uZXJIZWlnaHQpCisgICAgICByZXR1cm4gd2luZG93LmlubmVySGVpZ2h0OworICAgIGVsc2UKKyAgICAgIHJldHVybiBqd2luZG93LmhlaWdodCgpOworICB9CisKKyAgZnVuY3Rpb24gc2lkZWJhcl9pc19jb2xsYXBzZWQoKSB7CisgICAgcmV0dXJuIHNpZGViYXJ3cmFwcGVyLmlzKCc6bm90KDp2aXNpYmxlKScpOworICB9CisKKyAgZnVuY3Rpb24gdG9nZ2xlX3NpZGViYXIoKSB7CisgICAgaWYgKHNpZGViYXJfaXNfY29sbGFwc2VkKCkpCisgICAgICBleHBhbmRfc2lkZWJhcigpOworICAgIGVsc2UKKyAgICAgIGNvbGxhcHNlX3NpZGViYXIoKTsKKyAgICAvLyBhZGp1c3QgdGhlIHNjcm9sbGluZyBvZiB0aGUgc2lkZWJhcgorICAgIHNjcm9sbF9zaWRlYmFyKCk7CisgIH0KKworICBmdW5jdGlvbiBjb2xsYXBzZV9zaWRlYmFyKCkgeworICAgIHNpZGViYXJ3cmFwcGVyLmhpZGUoKTsKKyAgICBzaWRlYmFyLmNzcygnd2lkdGgnLCBzc2Jfd2lkdGhfY29sbGFwc2VkKTsKKyAgICBib2R5d3JhcHBlci5jc3MoJ21hcmdpbi1sZWZ0JywgYndfbWFyZ2luX2NvbGxhcHNlZCk7CisgICAgc2lkZWJhcmJ1dHRvbi5jc3MoeworICAgICAgICAnbWFyZ2luLWxlZnQnOiAnMCcsCisgICAgICAgICdoZWlnaHQnOiBib2R5d3JhcHBlci5oZWlnaHQoKQorICAgIH0pOworICAgIHNpZGViYXJidXR0b24uZmluZCgnc3BhbicpLnRleHQoJ8K7Jyk7CisgICAgc2lkZWJhcmJ1dHRvbi5hdHRyKCd0aXRsZScsIF8oJ0V4cGFuZCBzaWRlYmFyJykpOworICAgIGRvY3VtZW50LmNvb2tpZSA9ICdzaWRlYmFyPWNvbGxhcHNlZCc7CisgIH0KKworICBmdW5jdGlvbiBleHBhbmRfc2lkZWJhcigpIHsKKyAgICBib2R5d3JhcHBlci5jc3MoJ21hcmdpbi1sZWZ0JywgYndfbWFyZ2luX2V4cGFuZGVkKTsKKyAgICBzaWRlYmFyLmNzcygnd2lkdGgnLCBzc2Jfd2lkdGhfZXhwYW5kZWQpOworICAgIHNpZGViYXJ3cmFwcGVyLnNob3coKTsKKyAgICBzaWRlYmFyYnV0dG9uLmNzcyh7CisgICAgICAgICdtYXJnaW4tbGVmdCc6IHNzYl93aWR0aF9leHBhbmRlZC0xMiwKKyAgICAgICAgJ2hlaWdodCc6IGJvZHl3cmFwcGVyLmhlaWdodCgpCisgICAgfSk7CisgICAgc2lkZWJhcmJ1dHRvbi5maW5kKCdzcGFuJykudGV4dCgnwqsnKTsKKyAgICBzaWRlYmFyYnV0dG9uLmF0dHIoJ3RpdGxlJywgXygnQ29sbGFwc2Ugc2lkZWJhcicpKTsKKyAgICBkb2N1bWVudC5jb29raWUgPSAnc2lkZWJhcj1leHBhbmRlZCc7CisgIH0KKworICBmdW5jdGlvbiBhZGRfc2lkZWJhcl9idXR0b24oKSB7CisgICAgc2lkZWJhcndyYXBwZXIuY3NzKHsKKyAgICAgICAgJ2Zsb2F0JzogJ2xlZnQnLAorICAgICAgICAnbWFyZ2luLXJpZ2h0JzogJzAnLAorICAgICAgICAnd2lkdGgnOiBzc2Jfd2lkdGhfZXhwYW5kZWQgLSAyOAorICAgIH0pOworICAgIC8vIGNyZWF0ZSB0aGUgYnV0dG9uCisgICAgc2lkZWJhci5hcHBlbmQoCisgICAgICAgICc8ZGl2IGlkPSJzaWRlYmFyYnV0dG9uIj48c3Bhbj4mbGFxdW87PC9zcGFuPjwvZGl2PicKKyAgICApOworICAgIHZhciBzaWRlYmFyYnV0dG9uID0gJCgnI3NpZGViYXJidXR0b24nKTsKKyAgICBsaWdodF9jb2xvciA9IHNpZGViYXJidXR0b24uY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJyk7CisgICAgLy8gZmluZCB0aGUgaGVpZ2h0IG9mIHRoZSB2aWV3cG9ydCB0byBjZW50ZXIgdGhlICc8PCcgaW4gdGhlIHBhZ2UKKyAgICB2YXIgdmlld3BvcnRfaGVpZ2h0ID0gZ2V0X3ZpZXdwb3J0X2hlaWdodCgpOworICAgIHNpZGViYXJidXR0b24uZmluZCgnc3BhbicpLmNzcyh7CisgICAgICAgICdkaXNwbGF5JzogJ2Jsb2NrJywKKyAgICAgICAgJ21hcmdpbi10b3AnOiAodmlld3BvcnRfaGVpZ2h0IC0gc2lkZWJhci5wb3NpdGlvbigpLnRvcCAtIDIwKSAvIDIKKyAgICB9KTsKKworICAgIHNpZGViYXJidXR0b24uY2xpY2sodG9nZ2xlX3NpZGViYXIpOworICAgIHNpZGViYXJidXR0b24uYXR0cigndGl0bGUnLCBfKCdDb2xsYXBzZSBzaWRlYmFyJykpOworICAgIHNpZGViYXJidXR0b24uY3NzKHsKKyAgICAgICAgJ2NvbG9yJzogJyNGRkZGRkYnLAorICAgICAgICAnYm9yZGVyLWxlZnQnOiAnMXB4IHNvbGlkICcgKyBkYXJrX2NvbG9yLAorICAgICAgICAnZm9udC1zaXplJzogJzEuMmVtJywKKyAgICAgICAgJ2N1cnNvcic6ICdwb2ludGVyJywKKyAgICAgICAgJ2hlaWdodCc6IGJvZHl3cmFwcGVyLmhlaWdodCgpLAorICAgICAgICAncGFkZGluZy10b3AnOiAnMXB4JywKKyAgICAgICAgJ21hcmdpbi1sZWZ0Jzogc3NiX3dpZHRoX2V4cGFuZGVkIC0gMTIKKyAgICB9KTsKKworICAgIHNpZGViYXJidXR0b24uaG92ZXIoCisgICAgICBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgJCh0aGlzKS5jc3MoJ2JhY2tncm91bmQtY29sb3InLCBkYXJrX2NvbG9yKTsKKyAgICAgIH0sCisgICAgICBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgJCh0aGlzKS5jc3MoJ2JhY2tncm91bmQtY29sb3InLCBsaWdodF9jb2xvcik7CisgICAgICB9CisgICAgKTsKKyAgfQorCisgIGZ1bmN0aW9uIHNldF9wb3NpdGlvbl9mcm9tX2Nvb2tpZSgpIHsKKyAgICBpZiAoIWRvY3VtZW50LmNvb2tpZSkKKyAgICAgIHJldHVybjsKKyAgICB2YXIgaXRlbXMgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTsKKyAgICBmb3IodmFyIGs9MDsgazxpdGVtcy5sZW5ndGg7IGsrKykgeworICAgICAgdmFyIGtleV92YWwgPSBpdGVtc1trXS5zcGxpdCgnPScpOworICAgICAgdmFyIGtleSA9IGtleV92YWxbMF07CisgICAgICBpZiAoa2V5ID09ICdzaWRlYmFyJykgeworICAgICAgICB2YXIgdmFsdWUgPSBrZXlfdmFsWzFdOworICAgICAgICBpZiAoKHZhbHVlID09ICdjb2xsYXBzZWQnKSAmJiAoIXNpZGViYXJfaXNfY29sbGFwc2VkKCkpKQorICAgICAgICAgIGNvbGxhcHNlX3NpZGViYXIoKTsKKyAgICAgICAgZWxzZSBpZiAoKHZhbHVlID09ICdleHBhbmRlZCcpICYmIChzaWRlYmFyX2lzX2NvbGxhcHNlZCgpKSkKKyAgICAgICAgICBleHBhbmRfc2lkZWJhcigpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGFkZF9zaWRlYmFyX2J1dHRvbigpOworICB2YXIgc2lkZWJhcmJ1dHRvbiA9ICQoJyNzaWRlYmFyYnV0dG9uJyk7CisgIHNldF9wb3NpdGlvbl9mcm9tX2Nvb2tpZSgpOworCisKKyAgLyogaW50ZWxsaWdlbnQgc2Nyb2xsaW5nICovCisgIGZ1bmN0aW9uIHNjcm9sbF9zaWRlYmFyKCkgeworICAgIHZhciBzaWRlYmFyX2hlaWdodCA9IHNpZGViYXJ3cmFwcGVyLmhlaWdodCgpOworICAgIHZhciB2aWV3cG9ydF9oZWlnaHQgPSBnZXRfdmlld3BvcnRfaGVpZ2h0KCk7CisgICAgdmFyIG9mZnNldCA9IHNpZGViYXIucG9zaXRpb24oKVsndG9wJ107CisgICAgdmFyIHdpbnRvcCA9IGp3aW5kb3cuc2Nyb2xsVG9wKCk7CisgICAgdmFyIHdpbmJvdCA9IHdpbnRvcCArIHZpZXdwb3J0X2hlaWdodDsKKyAgICB2YXIgY3VydG9wID0gc2lkZWJhcndyYXBwZXIucG9zaXRpb24oKVsndG9wJ107CisgICAgdmFyIGN1cmJvdCA9IGN1cnRvcCArIHNpZGViYXJfaGVpZ2h0OworICAgIC8vIGRvZXMgc2lkZWJhciBmaXQgaW4gd2luZG93PworICAgIGlmIChzaWRlYmFyX2hlaWdodCA8IHZpZXdwb3J0X2hlaWdodCkgeworICAgICAgLy8geWVzOiBlYXN5IGNhc2UgLS0gYWx3YXlzIGtlZXAgYXQgdGhlIHRvcAorICAgICAgc2lkZWJhcndyYXBwZXIuY3NzKCd0b3AnLCAkdS5taW4oWyR1Lm1heChbMCwgd2ludG9wIC0gb2Zmc2V0IC0gMTBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZG9jdW1lbnQuaGVpZ2h0KCkgLSBzaWRlYmFyX2hlaWdodCAtIDIwMF0pKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAvLyBubzogb25seSBzY3JvbGwgaWYgdG9wL2JvdHRvbSBlZGdlIG9mIHNpZGViYXIgaXMgYXQKKyAgICAgIC8vIHRvcC9ib3R0b20gZWRnZSBvZiB3aW5kb3cKKyAgICAgIGlmIChjdXJ0b3AgPiB3aW50b3AgJiYgY3VyYm90ID4gd2luYm90KSB7CisgICAgICAgIHNpZGViYXJ3cmFwcGVyLmNzcygndG9wJywgJHUubWF4KFt3aW50b3AgLSBvZmZzZXQgLSAxMCwgMF0pKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGN1cnRvcCA8IHdpbnRvcCAmJiBjdXJib3QgPCB3aW5ib3QpIHsKKyAgICAgICAgc2lkZWJhcndyYXBwZXIuY3NzKCd0b3AnLCAkdS5taW4oW3dpbmJvdCAtIHNpZGViYXJfaGVpZ2h0IC0gb2Zmc2V0IC0gMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZG9jdW1lbnQuaGVpZ2h0KCkgLSBzaWRlYmFyX2hlaWdodCAtIDIwMF0pKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgandpbmRvdy5zY3JvbGwoc2Nyb2xsX3NpZGViYXIpOworfSk7CmRpZmYgLS1naXQgYS9Eb2MvdG9vbHMvc3BoaW54ZXh0L3N0YXRpYy92ZXJzaW9uX3N3aXRjaC5qcyBiL0RvYy90b29scy9zcGhpbnhleHQvc3RhdGljL3ZlcnNpb25fc3dpdGNoLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NTI4ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2MvdG9vbHMvc3BoaW54ZXh0L3N0YXRpYy92ZXJzaW9uX3N3aXRjaC5qcwpAQCAtMCwwICsxLDY3IEBACisoZnVuY3Rpb24oKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICB2YXIgYWxsX3ZlcnNpb25zID0geworICAgICczLjUnOiAnZGV2ICgzLjUpJywKKyAgICAnMy40JzogJzMuNCcsCisgICAgJzMuMyc6ICczLjMnLAorICAgICczLjInOiAnMy4yJywKKyAgICAnMi43JzogJzIuNycsCisgICAgJzIuNic6ICcyLjYnCisgIH07CisKKyAgZnVuY3Rpb24gYnVpbGRfc2VsZWN0KGN1cnJlbnRfdmVyc2lvbiwgY3VycmVudF9yZWxlYXNlKSB7CisgICAgdmFyIGJ1ZiA9IFsnPHNlbGVjdD4nXTsKKworICAgICQuZWFjaChhbGxfdmVyc2lvbnMsIGZ1bmN0aW9uKHZlcnNpb24sIHRpdGxlKSB7CisgICAgICBidWYucHVzaCgnPG9wdGlvbiB2YWx1ZT0iJyArIHZlcnNpb24gKyAnIicpOworICAgICAgaWYgKHZlcnNpb24gPT0gY3VycmVudF92ZXJzaW9uKQorICAgICAgICBidWYucHVzaCgnIHNlbGVjdGVkPSJzZWxlY3RlZCI+JyArIGN1cnJlbnRfcmVsZWFzZSArICc8L29wdGlvbj4nKTsKKyAgICAgIGVsc2UKKyAgICAgICAgYnVmLnB1c2goJz4nICsgdGl0bGUgKyAnPC9vcHRpb24+Jyk7CisgICAgfSk7CisKKyAgICBidWYucHVzaCgnPC9zZWxlY3Q+Jyk7CisgICAgcmV0dXJuIGJ1Zi5qb2luKCcnKTsKKyAgfQorCisgIGZ1bmN0aW9uIHBhdGNoX3VybCh1cmwsIG5ld192ZXJzaW9uKSB7CisgICAgdmFyIHVybF9yZSA9IC9cLm9yZ1wvKFxkfHB5M2t8ZGV2fCgocmVsZWFzZVwvKT9cZFwuXGRbXHdcZFwuXSopKVwvLywKKyAgICAgICAgbmV3X3VybCA9IHVybC5yZXBsYWNlKHVybF9yZSwgJy5vcmcvJyArIG5ld192ZXJzaW9uICsgJy8nKTsKKworICAgIGlmIChuZXdfdXJsID09IHVybCAmJiAhbmV3X3VybC5tYXRjaCh1cmxfcmUpKSB7CisgICAgICAvLyBweXRob24gMiB1cmwgd2l0aG91dCB2ZXJzaW9uPworICAgICAgbmV3X3VybCA9IHVybC5yZXBsYWNlKC9cLm9yZ1wvLywgJy5vcmcvJyArIG5ld192ZXJzaW9uICsgJy8nKTsKKyAgICB9CisgICAgcmV0dXJuIG5ld191cmw7CisgIH0KKworICBmdW5jdGlvbiBvbl9zd2l0Y2goKSB7CisgICAgdmFyIHNlbGVjdGVkID0gJCh0aGlzKS5jaGlsZHJlbignb3B0aW9uOnNlbGVjdGVkJykuYXR0cigndmFsdWUnKTsKKworICAgIHZhciB1cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZiwKKyAgICAgICAgbmV3X3VybCA9IHBhdGNoX3VybCh1cmwsIHNlbGVjdGVkKTsKKworICAgIGlmIChuZXdfdXJsICE9IHVybCkgeworICAgICAgLy8gY2hlY2sgYmVmb3JlaGFuZCBpZiB1cmwgZXhpc3RzLCBlbHNlIHJlZGlyZWN0IHRvIHZlcnNpb24ncyBzdGFydCBwYWdlCisgICAgICAkLmFqYXgoeworICAgICAgICB1cmw6IG5ld191cmwsCisgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IG5ld191cmw7CisgICAgICAgIH0sCisgICAgICAgIGVycm9yOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnaHR0cDovL2RvY3MucHl0aG9uLm9yZy8nICsgc2VsZWN0ZWQ7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0KKyAgfQorCisgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgeworICAgIHZhciByZWxlYXNlID0gRE9DVU1FTlRBVElPTl9PUFRJT05TLlZFUlNJT047CisgICAgdmFyIHZlcnNpb24gPSByZWxlYXNlLnN1YnN0cigwLCAzKTsKKyAgICB2YXIgc2VsZWN0ID0gYnVpbGRfc2VsZWN0KHZlcnNpb24sIHJlbGVhc2UpOworCisgICAgJCgnLnZlcnNpb25fc3dpdGNoZXJfcGxhY2Vob2xkZXInKS5odG1sKHNlbGVjdCk7CisgICAgJCgnLnZlcnNpb25fc3dpdGNoZXJfcGxhY2Vob2xkZXIgc2VsZWN0JykuYmluZCgnY2hhbmdlJywgb25fc3dpdGNoKTsKKyAgfSk7Cit9KSgpOwpkaWZmIC0tZ2l0IGEvRG9jL3Rvb2xzL3NwaGlueGV4dC9zdXNwLWlnbm9yZWQuY3N2IGIvRG9jL3Rvb2xzL3NwaGlueGV4dC9zdXNwLWlnbm9yZWQuY3N2CmluZGV4IGU4MmE4MmIuLmRjNzE5ZTUgMTAwNjQ0Ci0tLSBhL0RvYy90b29scy9zcGhpbnhleHQvc3VzcC1pZ25vcmVkLmNzdgorKysgYi9Eb2MvdG9vbHMvc3BoaW54ZXh0L3N1c3AtaWdub3JlZC5jc3YKQEAgLTEsOSArMSw2IEBACiBjLWFwaS9hcmcsLDpyZWYsIlB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiJPfE86cmVmIiIsICZvYmplY3QsICZjYWxsYmFjaykiCiBjLWFwaS9saXN0LCw6aGlnaCxsaXN0W2xvdzpoaWdoXQotYy1hcGkvbGlzdCwsOmhpZ2gsbGlzdFtsb3c6aGlnaF0gPSBpdGVtbGlzdAogYy1hcGkvc2VxdWVuY2UsLDppMixvW2kxOmkyXQotYy1hcGkvc2VxdWVuY2UsLDppMixvW2kxOmkyXSA9IHYKLWMtYXBpL3NlcXVlbmNlLCw6aTIsZGVsIG9baTE6aTJdCiBjLWFwaS91bmljb2RlLCw6ZW5kLHN0cltzdGFydDplbmRdCiBkaXN0dXRpbHMvc2V0dXBzY3JpcHQsLDo6LAogZXh0ZW5kaW5nL2VtYmVkZGluZywsOm51bWFyZ3MsImlmKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiOm51bWFyZ3MiIikpIgpAQCAtMTEsNyArOCwxMCBAQAogZXh0ZW5kaW5nL2V4dGVuZGluZywsOm15ZnVuY3Rpb24sIlB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiJEOm15ZnVuY3Rpb24iIiwgJmMpOyIKIGV4dGVuZGluZy9uZXd0eXBlcywsOmNhbGwsImlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiInNzczpjYWxsIiIsICZhcmcxLCAmYXJnMiwgJmFyZzMpKSB7IgogZXh0ZW5kaW5nL3dpbmRvd3MsLDppbml0c3BhbSwvZXhwb3J0OmluaXRzcGFtCi1ob3d0by9jcG9ydGluZywsOmFkZCwiaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiaWk6YWRkX2ludHMiIiwgJm9uZSwgJnR3bykpIgorZmFxL3Byb2dyYW1taW5nLCw6cmVkdWNlLCJwcmludCAobGFtYmRhIFJ1LFJvLEl1LElvLElNLFN4LFN5OnJlZHVjZShsYW1iZGEgeCx5OngreSxtYXAobGFtYmRhIHksIgorZmFxL3Byb2dyYW1taW5nLCw6cmVkdWNlLCJTeD1TeCxTeT1TeTpyZWR1Y2UobGFtYmRhIHgseTp4K3ksbWFwKGxhbWJkYSB4LHhjPVJ1LHljPXljLFJ1PVJ1LFJvPVJvLCIKK2ZhcS9wcm9ncmFtbWluZywsOmNociwiPj00LjApIG9yIDErZih4Yyx5Yyx4KngteSp5K3hjLDIuMCp4KnkreWMsay0xLGYpOmYoeGMseWMseCx5LGssZik6Y2hyKCIKK2ZhcS9wcm9ncmFtbWluZywsOjosZm9yIHggaW4gc2VxdWVuY2VbOjotMV06CiBob3d0by9jcG9ydGluZywsOmVuY29kZSwiaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiTzplbmNvZGVfb2JqZWN0IiIsICZteW9iaikpIgogaG93dG8vY3BvcnRpbmcsLDpzYXksImlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIlU6c2F5X2hlbGxvIiIsICZuYW1lKSkiCiBob3d0by9jdXJzZXMsLDpibGFjaywiVGhleSBhcmU6IDA6YmxhY2ssIDE6cmVkLCAyOmdyZWVuLCAzOnllbGxvdywgNDpibHVlLCA1Om1hZ2VudGEsIDY6Y3lhbiwgYW5kIgpAQCAtMjIsMTEgKzIyLDM2IEBACiBob3d0by9jdXJzZXMsLDpyZWQsIlRoZXkgYXJlOiAwOmJsYWNrLCAxOnJlZCwgMjpncmVlbiwgMzp5ZWxsb3csIDQ6Ymx1ZSwgNTptYWdlbnRhLCA2OmN5YW4sIGFuZCIKIGhvd3RvL2N1cnNlcywsOndoaXRlLCI3OndoaXRlLiIKIGhvd3RvL2N1cnNlcywsOnllbGxvdywiVGhleSBhcmU6IDA6YmxhY2ssIDE6cmVkLCAyOmdyZWVuLCAzOnllbGxvdywgNDpibHVlLCA1Om1hZ2VudGEsIDY6Y3lhbiwgYW5kIgoraG93dG8vbG9nZ2luZywsOnJvb3QsV0FSTklORzpyb290OldhdGNoIG91dCEKK2hvd3RvL2xvZ2dpbmcsLDpXYXRjaCxXQVJOSU5HOnJvb3Q6V2F0Y2ggb3V0IQoraG93dG8vbG9nZ2luZywsOnJvb3QsREVCVUc6cm9vdDpUaGlzIG1lc3NhZ2Ugc2hvdWxkIGdvIHRvIHRoZSBsb2cgZmlsZQoraG93dG8vbG9nZ2luZywsOnJvb3QsSU5GTzpyb290OlNvIHNob3VsZCB0aGlzCitob3d0by9sb2dnaW5nLCw6U28sSU5GTzpyb290OlNvIHNob3VsZCB0aGlzCitob3d0by9sb2dnaW5nLCw6cm9vdCwiV0FSTklORzpyb290OkFuZCB0aGlzLCB0b28iCitob3d0by9sb2dnaW5nLCw6QW5kLCJXQVJOSU5HOnJvb3Q6QW5kIHRoaXMsIHRvbyIKK2hvd3RvL2xvZ2dpbmcsLDpyb290LElORk86cm9vdDpTdGFydGVkCitob3d0by9sb2dnaW5nLCw6U3RhcnRlZCxJTkZPOnJvb3Q6U3RhcnRlZAoraG93dG8vbG9nZ2luZywsOnJvb3QsSU5GTzpyb290OkRvaW5nIHNvbWV0aGluZworaG93dG8vbG9nZ2luZywsOkRvaW5nLElORk86cm9vdDpEb2luZyBzb21ldGhpbmcKK2hvd3RvL2xvZ2dpbmcsLDpyb290LElORk86cm9vdDpGaW5pc2hlZAoraG93dG8vbG9nZ2luZywsOkZpbmlzaGVkLElORk86cm9vdDpGaW5pc2hlZAoraG93dG8vbG9nZ2luZywsOnJvb3QsV0FSTklORzpyb290Okxvb2sgYmVmb3JlIHlvdSBsZWFwIQoraG93dG8vbG9nZ2luZywsOkxvb2ssV0FSTklORzpyb290Okxvb2sgYmVmb3JlIHlvdSBsZWFwIQoraG93dG8vbG9nZ2luZywsOlRoaXMsREVCVUc6VGhpcyBtZXNzYWdlIHNob3VsZCBhcHBlYXIgb24gdGhlIGNvbnNvbGUKK2hvd3RvL2xvZ2dpbmcsLDpTbyxJTkZPOlNvIHNob3VsZCB0aGlzCitob3d0by9sb2dnaW5nLCw6QW5kLCJXQVJOSU5HOkFuZCB0aGlzLCB0b28iCitob3d0by9sb2dnaW5nLCw6bG9nZ2VyLHNldmVyaXR5OmxvZ2dlciBuYW1lOm1lc3NhZ2UKK2hvd3RvL2xvZ2dpbmcsLDptZXNzYWdlLHNldmVyaXR5OmxvZ2dlciBuYW1lOm1lc3NhZ2UKK2hvd3RvL2xvZ2dpbmcsLDpUaGlzLERFQlVHOnJvb3Q6VGhpcyBtZXNzYWdlIHNob3VsZCBnbyB0byB0aGUgbG9nIGZpbGUKK2hvd3RvL3B5cG9ydGluZywsOjosUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIKK2hvd3RvL3B5cG9ydGluZywsOjosUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMKIGhvd3RvL3JlZ2V4LCw6OiwKIGhvd3RvL3JlZ2V4LCw6Zm9vLCg/OmZvbykKIGhvd3RvL3VybGxpYjIsLDpleGFtcGxlLCJmb3IgZXhhbXBsZSAiImpvZUBwYXNzd29yZDpleGFtcGxlLmNvbSIiIgotaG93dG8vd2Vic2VydmVycywsLi4gaW1hZ2U6LC4uIGltYWdlOjogaHR0cC5wbmcKIGxpYnJhcnkvYXVkaW9vcCwsOmlwb3MsIiMgZmFjdG9yID0gYXVkaW9vcC5maW5kZmFjdG9yKGluX3Rlc3RbaXBvcyoyOmlwb3MqMitsZW4ob3V0X3Rlc3QpXSwiCitsaWJyYXJ5L2Jpc2VjdCwsOmhpLGFsbCh2YWwgPj0geCBmb3IgdmFsIGluIGFbaTpoaV0pCitsaWJyYXJ5L2Jpc2VjdCwsOmhpLGFsbCh2YWwgPiB4IGZvciB2YWwgaW4gYVtpOmhpXSkKK2xpYnJhcnkvY29va2llLCxgLCEjJCUmJyorLS5eX2B8fgogbGlicmFyeS9kYXRldGltZSwsOk1NLAogbGlicmFyeS9kYXRldGltZSwsOlNTLAogbGlicmFyeS9kZWNpbWFsLCw6b3B0aW9uYWwsInRyYWlsbmVnOm9wdGlvbmFsIHRyYWlsaW5nIG1pbnVzIGluZGljYXRvciIKQEAgLTQwLDIyICs2NSwxOCBAQAogbGlicmFyeS9kb2N0ZXN0LCxgLGBgZmFjdG9yaWFsYGAgZnJvbSB0aGUgYGBleGFtcGxlYGAgbW9kdWxlOgogbGlicmFyeS9kb2N0ZXN0LCxgLFRoZSBgYGV4YW1wbGVgYCBtb2R1bGUKIGxpYnJhcnkvZG9jdGVzdCwsYCxVc2luZyBgYGZhY3RvcmlhbGBgCitsaWJyYXJ5L2V4Y2VwdGlvbnMsLDplcnIsZXJyLm9iamVjdFtlcnIuc3RhcnQ6ZXJyLmVuZF0KIGxpYnJhcnkvZnVuY3Rpb25zLCw6c3RlcCxhW3N0YXJ0OnN0b3A6c3RlcF0KIGxpYnJhcnkvZnVuY3Rpb25zLCw6c3RvcCwiYVtzdGFydDpzdG9wLCBpXSIKIGxpYnJhcnkvZnVuY3Rpb25zLCw6c3RvcCxhW3N0YXJ0OnN0b3A6c3RlcF0KIGxpYnJhcnkvaG90c2hvdCwsOmxpbmVubywibmNhbGxzICB0b3R0aW1lICBwZXJjYWxsICBjdW10aW1lICBwZXJjYWxsIGZpbGVuYW1lOmxpbmVubyhmdW5jdGlvbikiCiBsaWJyYXJ5L2h0dHBsaWIsLDpwb3J0LGhvc3Q6cG9ydAotbGlicmFyeS9pbWFwbGliLCw6TU0sIiIiREQtTW1tLVlZWVkgSEg6TU06U1MgK0hITU0iIiIKLWxpYnJhcnkvaW1hcGxpYiwsOlNTLCIiIkRELU1tbS1ZWVlZIEhIOk1NOlNTICtISE1NIiIiCitsaWJyYXJ5L2ltYXBsaWIsLDpNTSwiIiJERC1NbW0tWVlZWSBISDpNTTpTUyIKK2xpYnJhcnkvaW1hcGxpYiwsOlNTLCIiIkRELU1tbS1ZWVlZIEhIOk1NOlNTIgogbGlicmFyeS9pdGVydG9vbHMsLDpzdG9wLGVsZW1lbnRzIGZyb20gc2VxW3N0YXJ0OnN0b3A6c3RlcF0KIGxpYnJhcnkvaXRlcnRvb2xzLCw6c3RlcCxlbGVtZW50cyBmcm9tIHNlcVtzdGFydDpzdG9wOnN0ZXBdCiBsaWJyYXJ5L2xpbmVjYWNoZSwsOnN5cywic3lzOng6MzozOnN5czovZGV2Oi9iaW4vc2giCi1saWJyYXJ5L2xvZ2dpbmcsLDpBbmQsCi1saWJyYXJ5L2xvZ2dpbmcsLDpwYWNrYWdlMSwKLWxpYnJhcnkvbG9nZ2luZywsOnBhY2thZ2UyLAotbGlicmFyeS9sb2dnaW5nLCw6cm9vdCwKLWxpYnJhcnkvbG9nZ2luZywsOlRoaXMsCi1saWJyYXJ5L2xvZ2dpbmcsLDpwb3J0LGhvc3Q6cG9ydAorbGlicmFyeS9sb2dnaW5nLmhhbmRsZXJzLCw6cG9ydCxob3N0OnBvcnQKIGxpYnJhcnkvbW1hcCwsOmkyLG9ialtpMTppMl0KIGxpYnJhcnkvbXVsdGlwcm9jZXNzaW5nLCw6cXVldWUsIj4+PiBRdWV1ZU1hbmFnZXIucmVnaXN0ZXIoJ2dldF9xdWV1ZScsIGNhbGxhYmxlPWxhbWJkYTpxdWV1ZSkiCiBsaWJyYXJ5L211bHRpcHJvY2Vzc2luZywsYCwiPj4+IGwuX2NhbGxtZXRob2QoJ19fZ2V0aXRlbV9fJywgKDIwLCkpICAgICAjIGVxdWl2IHRvIGBsWzIwXWAiCkBAIC02NSwzMSArODYsMjYgQEAKIGxpYnJhcnkvbXVsdGlwcm9jZXNzaW5nLCxgLCMgQSB0ZXN0IGZpbGUgZm9yIHRoZSBgbXVsdGlwcm9jZXNzaW5nYCBwYWNrYWdlCiBsaWJyYXJ5L211bHRpcHJvY2Vzc2luZywsYCwjIEEgdGVzdCBvZiBgbXVsdGlwcm9jZXNzaW5nLlBvb2xgIGNsYXNzCiBsaWJyYXJ5L211bHRpcHJvY2Vzc2luZywsYCwjIEFkZCBtb3JlIHRhc2tzIHVzaW5nIGBwdXQoKWAKLWxpYnJhcnkvbXVsdGlwcm9jZXNzaW5nLCxgLCMgY3JlYXRlIHNlcnZlciBmb3IgYSBgSG9zdE1hbmFnZXJgIG9iamVjdAotbGlicmFyeS9tdWx0aXByb2Nlc3NpbmcsLGAsIyBEZXBlbmRzIG9uIGBtdWx0aXByb2Nlc3NpbmdgIHBhY2thZ2UgLS0gdGVzdGVkIHdpdGggYHByb2Nlc3NpbmctMC42MGAKIGxpYnJhcnkvbXVsdGlwcm9jZXNzaW5nLCxgLCMgaW4gdGhlIG9yaWdpbmFsIG9yZGVyIHRoZW4gY29uc2lkZXIgdXNpbmcgYFBvb2wubWFwKClgIG9yCiBsaWJyYXJ5L211bHRpcHJvY2Vzc2luZywsYCwjIE5vdCBzdXJlIGlmIHdlIHNob3VsZCBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gYHNvY2tldC5hY2NlcHQoKWAgbWV0aG9kIGJ5CiBsaWJyYXJ5L211bHRpcHJvY2Vzc2luZywsYCwjIG9iamVjdC4gIChXZSBpbXBvcnQgYG11bHRpcHJvY2Vzc2luZy5yZWR1Y3Rpb25gIHRvIGVuYWJsZSB0aGlzIHBpY2tsaW5nLikKIGxpYnJhcnkvbXVsdGlwcm9jZXNzaW5nLCxgLCMgcmVnaXN0ZXIgdGhlIEZvbyBjbGFzczsgbWFrZSBgZigpYCBhbmQgYGcoKWAgYWNjZXNzaWJsZSB2aWEgcHJveHkKIGxpYnJhcnkvbXVsdGlwcm9jZXNzaW5nLCxgLCMgcmVnaXN0ZXIgdGhlIEZvbyBjbGFzczsgbWFrZSBgZygpYCBhbmQgYF9oKClgIGFjY2Vzc2libGUgdmlhIHByb3h5CiBsaWJyYXJ5L211bHRpcHJvY2Vzc2luZywsYCwjIHJlZ2lzdGVyIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24gYmF6OyB1c2UgYEdlbmVyYXRvclByb3h5YCB0byBtYWtlIHByb3hpZXMKLWxpYnJhcnkvbXVsdGlwcm9jZXNzaW5nLCxgLGBDbHVzdGVyYCBpcyBhIHN1YmNsYXNzIG9mIGBTeW5jTWFuYWdlcmAgc28gaXQgYWxsb3dzIGNyZWF0aW9uIG9mCi1saWJyYXJ5L211bHRpcHJvY2Vzc2luZywsYCxgaG9zdG5hbWVgIGdpdmVzIHRoZSBuYW1lIG9mIHRoZSBob3N0LiAgSWYgaG9zdG5hbWUgaXMgbm90Ci1saWJyYXJ5L211bHRpcHJvY2Vzc2luZywsYCxgc2xvdHNgIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIHNsb3RzIGZvciBwcm9jZXNzZXMgb24KIGxpYnJhcnkvb3B0cGFyc2UsLDpsZW4sImRlbCBwYXJzZXIucmFyZ3NbOmxlbih2YWx1ZSldIgogbGlicmFyeS9vcy5wYXRoLCw6Zm9vLGM6Zm9vCi1saWJyYXJ5L3BhcnNlciwsYCwiIiJNYWtlIGEgZnVuY3Rpb24gdGhhdCByYWlzZXMgYW4gYXJndW1lbnQgdG8gdGhlIGV4cG9uZW50IGBleHBgLiIiIgorbGlicmFyeS9wZGIsLDpsaW5lbm8sZmlsZW5hbWU6bGluZW5vCiBsaWJyYXJ5L3Bvc2l4LCxgLCJDRkxBR1M9IiJgZ2V0Y29uZiBMRlNfQ0ZMQUdTYCIiIE9QVD0iIi1nIC1PMiAkQ0ZMQUdTIiIiCiBsaWJyYXJ5L3Byb2ZpbGUsLDpsaW5lbm8sbmNhbGxzICB0b3R0aW1lICBwZXJjYWxsICBjdW10aW1lICBwZXJjYWxsIGZpbGVuYW1lOmxpbmVubyhmdW5jdGlvbikKIGxpYnJhcnkvcHJvZmlsZSwsOmxpbmVubyxmaWxlbmFtZTpsaW5lbm8oZnVuY3Rpb24pCiBsaWJyYXJ5L3B5ZXhwYXQsLDplbGVtMSw8cHk6ZWxlbTEgLz4KIGxpYnJhcnkvcHlleHBhdCwsOnB5LCJ4bWxuczpweSA9ICIiaHR0cDovL3d3dy5weXRob24ub3JnL25zLyIiPiIKLWxpYnJhcnkvcmVwciwsYCwicmV0dXJuIGBvYmpgIgotbGlicmFyeS9zbXRwbGliLCw6cG9ydCwiYXMgd2VsbCBhcyBhIHJlZ3VsYXIgaG9zdDpwb3J0IHNlcnZlci4iCitsaWJyYXJ5L3NtdHBsaWIsLDpwb3J0LG1ldGhvZCBtdXN0IHN1cHBvcnQgdGhhdCBhcyB3ZWxsIGFzIGEgcmVndWxhciBob3N0OnBvcnQKIGxpYnJhcnkvc29ja2V0LCw6OiwnNWFlZjoyYjo6OCcKK2xpYnJhcnkvc29ja2V0LCw6OiwiKDEwLCAxLCA2LCAnJywgKCcyMDAxOjg4ODoyMDAwOmQ6OmEyJywgODAsIDAsIDApKV0iCiBsaWJyYXJ5L3NxbGl0ZTMsLDptZW1vcnksCi1saWJyYXJ5L3NxbGl0ZTMsLDphZ2UsInNlbGVjdCBuYW1lX2xhc3QsIGFnZSBmcm9tIHBlb3BsZSB3aGVyZSBuYW1lX2xhc3Q9OndobyBhbmQgYWdlPTphZ2UiCi1saWJyYXJ5L3NxbGl0ZTMsLDp3aG8sInNlbGVjdCBuYW1lX2xhc3QsIGFnZSBmcm9tIHBlb3BsZSB3aGVyZSBuYW1lX2xhc3Q9OndobyBhbmQgYWdlPTphZ2UiCitsaWJyYXJ5L3NxbGl0ZTMsLDp3aG8sImN1ci5leGVjdXRlKCIic2VsZWN0ICogZnJvbSBwZW9wbGUgd2hlcmUgbmFtZV9sYXN0PTp3aG8gYW5kIGFnZT06YWdlIiIsIHsiIndobyIiOiB3aG8sICIiYWdlIiI6IGFnZX0pIgorbGlicmFyeS9zcWxpdGUzLCw6YWdlLCJjdXIuZXhlY3V0ZSgiInNlbGVjdCAqIGZyb20gcGVvcGxlIHdoZXJlIG5hbWVfbGFzdD06d2hvIGFuZCBhZ2U9OmFnZSIiLCB7IiJ3aG8iIjogd2hvLCAiImFnZSIiOiBhZ2V9KSIKIGxpYnJhcnkvc3NsLCw6TXksIk9yZ2FuaXphdGlvbiBOYW1lIChlZywgY29tcGFueSkgW0ludGVybmV0IFdpZGdpdHMgUHR5IEx0ZF06TXkgT3JnYW5pemF0aW9uLCBJbmMuIgogbGlicmFyeS9zc2wsLDpNeSwiT3JnYW5pemF0aW9uYWwgVW5pdCBOYW1lIChlZywgc2VjdGlvbikgW106TXkgR3JvdXAiCiBsaWJyYXJ5L3NzbCwsOm15c2VydmVyLCJDb21tb24gTmFtZSAoZWcsIFlPVVIgbmFtZSkgW106bXlzZXJ2ZXIubXlncm91cC5teW9yZ2FuaXphdGlvbi5jb20iCkBAIC05OCw4ICsxMTQsNyBAQAogbGlicmFyeS9zc2wsLDpTb21lLCJMb2NhbGl0eSBOYW1lIChlZywgY2l0eSkgW106U29tZSBDaXR5IgogbGlicmFyeS9zc2wsLDpVUyxDb3VudHJ5IE5hbWUgKDIgbGV0dGVyIGNvZGUpIFtBVV06VVMKIGxpYnJhcnkvc3RkdHlwZXMsLDpsZW4sc1tsZW4ocyk6bGVuKHMpXQotbGlicmFyeS9zdGR0eXBlcywsOmxlbixzW2xlbihzKTpsZW4ocyldCi1saWJyYXJ5L3N0cmluZywsOmVuZCxzW3N0YXJ0OmVuZF0KK2xpYnJhcnkvc3RkdHlwZXMsLDplbmQsc1tzdGFydDplbmRdCiBsaWJyYXJ5L3N0cmluZywsOmVuZCxzW3N0YXJ0OmVuZF0KIGxpYnJhcnkvc3VicHJvY2VzcywsYCwib3V0cHV0PWBteWNtZCBteWFyZ2AiCiBsaWJyYXJ5L3N1YnByb2Nlc3MsLGAsIm91dHB1dD1gZG1lc2cgfCBncmVwIGhkYWAiCkBAIC0xMTEsNiArMTI2LDcgQEAKIGxpYnJhcnkvdHVydGxlLCw6OixFeGFtcGxlOjoKIGxpYnJhcnkvdXJsbGliLCw6cG9ydCw6cG9ydAogbGlicmFyeS91cmxsaWIyLCw6cGFzc3dvcmQsIiIiam9lOnBhc3N3b3JkQHB5dGhvbi5vcmciIiIKK2xpYnJhcnkvdXJsbGliMiwsOmNsb3NlLENvbm5lY3Rpb246Y2xvc2UKIGxpYnJhcnkvdXVpZCwsOnV1aWQsdXJuOnV1aWQ6MTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4CiBsaWJyYXJ5L3htbHJwY2xpYiwsOnBhc3MsaHR0cDovL3VzZXI6cGFzc0Bob3N0OnBvcnQvcGF0aAogbGlicmFyeS94bWxycGNsaWIsLDpwYXNzLHVzZXI6cGFzcwpAQCAtMTE4LDE0ICsxMzQsMTUgQEAKIGxpY2Vuc2UsLGAsVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKIGxpY2Vuc2UsLDp6b29rbyxtYWlsdG86em9va29Aem9va28uY29tCiBsaWNlbnNlLCxgLFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKK2xpY2Vuc2UsLGAsKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKK2xpY2Vuc2UsLGAsKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorbGljZW5zZSwsYCwiYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIgorbGljZW5zZSwsYCwiVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwiCiByZWZlcmVuY2UvZGF0YW1vZGVsLCw6c3RlcCxhW2k6ajpzdGVwXQogcmVmZXJlbmNlL2RhdGFtb2RlbCwsOm1heCwKIHJlZmVyZW5jZS9leHByZXNzaW9ucywsOmluZGV4LHhbaW5kZXg6aW5kZXhdCi1yZWZlcmVuY2UvZXhwcmVzc2lvbnMsLDpkYXR1bSx7a2V5OmRhdHVtLi4ufQogcmVmZXJlbmNlL2V4cHJlc3Npb25zLCxgLGBleHByZXNzaW9ucy4uLmAKLXJlZmVyZW5jZS9ncmFtbWFyLCw6b3V0cHV0LCNkaWFncmFtOm91dHB1dAotcmVmZXJlbmNlL2dyYW1tYXIsLDpydWxlcywjZGlhZ3JhbTpydWxlcwotcmVmZXJlbmNlL2dyYW1tYXIsLDp0b2tlbiwjZGlhZ3JhbTp0b2tlbgorcmVmZXJlbmNlL2V4cHJlc3Npb25zLCxgLCIiImAiIiIKIHJlZmVyZW5jZS9ncmFtbWFyLCxgLCdgJyB0ZXN0bGlzdDEgJ2AnCiByZWZlcmVuY2UvbGV4aWNhbF9hbmFseXNpcywsOmZpbGVlbmNvZGluZywjIHZpbTpmaWxlZW5jb2Rpbmc9PGVuY29kaW5nLW5hbWU+CiByZWZlcmVuY2UvbGV4aWNhbF9hbmFseXNpcywsYCwiLCAgICAgICA6ICAgICAgIC4gICAgICAgYCAgICAgICA9ICAgICAgIDsiCkBAIC0xNDgsOCArMTY1LDcgQEAKIHVzaW5nL2NtZGxpbmUsLDptZXNzYWdlLGFjdGlvbjptZXNzYWdlOmNhdGVnb3J5Om1vZHVsZTpsaW5lCiB1c2luZy9jbWRsaW5lLCw6bW9kdWxlLGFjdGlvbjptZXNzYWdlOmNhdGVnb3J5Om1vZHVsZTpsaW5lCiB1c2luZy9jbWRsaW5lLCw6ZXJyb3JoYW5kbGVyLDplcnJvcmhhbmRsZXIKLXVzaW5nL3dpbmRvd3MsMTYyLGAsYGAgdGhpcyBmaXhlcyBzeW50YXggaGlnaGxpZ2h0aW5nIGVycm9ycyBpbiBzb21lIGVkaXRvcnMgZHVlIHRvIHRoZSBcXFxcIGhhY2tlcnkKLXVzaW5nL3dpbmRvd3MsMTcwLGAsYGAKK3VzaW5nL3VuaXgsLDpQYWNrYWdpbmcsaHR0cDovL2VuLm9wZW5zdXNlLm9yZy9Qb3J0YWw6UGFja2FnaW5nCiB3aGF0c25ldy8yLjAsNDE4LDpsZW4sCiB3aGF0c25ldy8yLjMsLDo6LAogd2hhdHNuZXcvMi4zLCw6Y29uZmlnLApAQCAtMTYzLDE0MiArMTc5LDggQEAKIHdoYXRzbmV3LzIuNSwsOm1lbW9yeSw6bWVtb3J5Ogogd2hhdHNuZXcvMi41LCw6c3RlcCxbc3RhcnQ6c3RvcDpzdGVwXQogd2hhdHNuZXcvMi41LCw6c3RvcCxbc3RhcnQ6c3RvcDpzdGVwXQotZGlzdHV0aWxzL2V4YW1wbGVzLDI2NyxgLFRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBgYGZvb2JhcmBgIHBhY2thZ2UuCi1kb2N1bWVudGluZy9mcm9tbGF0ZXgsMzksOmZ1bmMsOmZ1bmM6YHN0cihvYmplY3QpYAotZG9jdW1lbnRpbmcvZnJvbWxhdGV4LDM5LGAsOmZ1bmM6YHN0cihvYmplY3QpYAotZG9jdW1lbnRpbmcvZnJvbWxhdGV4LDM5LGAsYGBzdHIob2JqZWN0KWBgCi1kb2N1bWVudGluZy9mcm9tbGF0ZXgsNTUsLi4gZGVwcmVjYXRlZDosLi4gZGVwcmVjYXRlZDo6IDIuNQotZG9jdW1lbnRpbmcvZnJvbWxhdGV4LDY2LC4uIG5vdGU6LC4uIG5vdGU6OgotZG9jdW1lbnRpbmcvZnJvbWxhdGV4LDc2LDpzYW1wLCI6c2FtcDpgb3Blbih7ZmlsZW5hbWV9LCB7bW9kZX0pYCIKLWRvY3VtZW50aW5nL2Zyb21sYXRleCw3NixgLCI6c2FtcDpgb3Blbih7ZmlsZW5hbWV9LCB7bW9kZX0pYCIKLWRvY3VtZW50aW5nL2Zyb21sYXRleCw4MCxgLGBgJ2MnYGAKLWRvY3VtZW50aW5nL2Zyb21sYXRleCw4MCxgLGBUaXRsZSA8VVJMPmBfCi1kb2N1bWVudGluZy9mcm9tbGF0ZXgsODAsYCxgYGNvZGVgYAotZG9jdW1lbnRpbmcvZnJvbWxhdGV4LDgwLGAsYFRpdGxlIDxVUkw+YF8KLWRvY3VtZW50aW5nL2Zyb21sYXRleCw5OSw6ZmlsZSw6ZmlsZTpgQzpcXFRlbXBcXG15LnRtcGAKLWRvY3VtZW50aW5nL2Zyb21sYXRleCw5OSxgLDpmaWxlOmBDOlxcVGVtcFxcbXkudG1wYAotZG9jdW1lbnRpbmcvZnJvbWxhdGV4LDk5LGAsImBgb3BlbigiIkM6XFRlbXBcbXkudG1wIiIpYGAiCi1kb2N1bWVudGluZy9mcm9tbGF0ZXgsMTI5LC4uIGZ1bmN0aW9uOiwuLiBmdW5jdGlvbjo6IGRvX2ZvbyhiYXIpCi1kb2N1bWVudGluZy9mcm9tbGF0ZXgsMTQxLC4uIGZ1bmN0aW9uOiwiLi4gZnVuY3Rpb246OiBvcGVuKGZpbGVuYW1lWywgbW9kZVssIGJ1ZmZlcmluZ11dKSIKLWRvY3VtZW50aW5nL2Zyb21sYXRleCwxNTIsLi4gZnVuY3Rpb246LC4uIGZ1bmN0aW9uOjogZm9vXyoKLWRvY3VtZW50aW5nL2Zyb21sYXRleCwxNTIsOm5vaW5kZXgsOm5vaW5kZXg6Ci1kb2N1bWVudGluZy9mcm9tbGF0ZXgsMTYyLC4uIGRlc2NyaWJlOiwuLiBkZXNjcmliZTo6IGEgPT0gYgotZG9jdW1lbnRpbmcvZnJvbWxhdGV4LDE2OCwuLiBjbWRvcHRpb246LC4uIGNtZG9wdGlvbjo6IC1PCi1kb2N1bWVudGluZy9mcm9tbGF0ZXgsMTY4LC4uIGVudnZhcjosLi4gZW52dmFyOjogUFlUSE9OSU5TUEVDVAotZG9jdW1lbnRpbmcvcmVzdCwzMyxgLGBgdGV4dGBgCi1kb2N1bWVudGluZy9yZXN0LDQ3LDpyb2xlbmFtZSw6cm9sZW5hbWU6YGNvbnRlbnRgCi1kb2N1bWVudGluZy9yZXN0LDQ3LGAsOnJvbGVuYW1lOmBjb250ZW50YAotZG9jdW1lbnRpbmcvcmVzdCwxMDMsOjosVGhpcyBpcyBhIG5vcm1hbCB0ZXh0IHBhcmFncmFwaC4gVGhlIG5leHQgcGFyYWdyYXBoIGlzIGEgY29kZSBzYW1wbGU6OgotZG9jdW1lbnRpbmcvcmVzdCwxMzAsYCxgTGluayB0ZXh0IDxodHRwOi8vdGFyZ2V0PmBfCi1kb2N1bWVudGluZy9yZXN0LDE4NywuLiBmdW5jdGlvbjosLi4gZnVuY3Rpb246OiBmb28oeCkKLWRvY3VtZW50aW5nL3Jlc3QsMTg3LDpiYXIsOmJhcjogbm8KLWRvY3VtZW50aW5nL3Jlc3QsMjA4LC4uIHJ1YnJpYzosLi4gcnVicmljOjogRm9vdG5vdGVzCi1mYXEvcHJvZ3JhbW1pbmcsLDpyZWR1Y2UsInByaW50IChsYW1iZGEgUnUsUm8sSXUsSW8sSU0sU3gsU3k6cmVkdWNlKGxhbWJkYSB4LHk6eCt5LG1hcChsYW1iZGEgeSwiCi1mYXEvcHJvZ3JhbW1pbmcsLDpyZWR1Y2UsIlN4PVN4LFN5PVN5OnJlZHVjZShsYW1iZGEgeCx5OngreSxtYXAobGFtYmRhIHgseGM9UnUseWM9eWMsUnU9UnUsUm89Um8sIgotZmFxL3Byb2dyYW1taW5nLCw6Y2hyLCI+PTQuMCkgb3IgMStmKHhjLHljLHgqeC15KnkreGMsMi4wKngqeSt5YyxrLTEsZik6Zih4Yyx5Yyx4LHksayxmKTpjaHIoIgotZmFxL3Byb2dyYW1taW5nLCw6Oixmb3IgeCBpbiBzZXF1ZW5jZVs6Oi0xXToKLWZhcS93aW5kb3dzLDIyOSw6RU9GLEBzZXRsb2NhbCBlbmFibGVleHRlbnNpb25zICYgcHl0aG9uIC14ICV+ZjAgJSogJiBnb3RvIDpFT0YKLWZhcS93aW5kb3dzLDM5Myw6UkVHLC5weSA6UkVHX1NaOiBjOlw8cGF0aCB0byBweXRob24+XHB5dGhvbi5leGUgLXUgJXMgJXMKLWxpYnJhcnkvYmlzZWN0LCw6aGksYWxsKHZhbCA+PSB4IGZvciB2YWwgaW4gYVtpOmhpXSkKLWxpYnJhcnkvYmlzZWN0LCw6aGksYWxsKHZhbCA+IHggZm9yIHZhbCBpbiBhW2k6aGldKQotbGlicmFyeS9odHRwLmNsaWVudCw1Miw6cG9ydCxob3N0OnBvcnQKLWxpYnJhcnkvbm50cGxpYiwsOmJ5dGVzLDpieXRlcwotbGlicmFyeS9ubnRwbGliLCw6bGluZXMsOmxpbmVzCi1saWJyYXJ5L25udHBsaWIsLDpsaW5lcywiWyd4cmVmJywgJ2Zyb20nLCAnOmxpbmVzJywgJzpieXRlcycsICdyZWZlcmVuY2VzJywgJ2RhdGUnLCAnbWVzc2FnZS1pZCcsICdzdWJqZWN0J10iCi1saWJyYXJ5L25udHBsaWIsLDpieXRlcywiWyd4cmVmJywgJ2Zyb20nLCAnOmxpbmVzJywgJzpieXRlcycsICdyZWZlcmVuY2VzJywgJ2RhdGUnLCAnbWVzc2FnZS1pZCcsICdzdWJqZWN0J10iCi1saWJyYXJ5L3BpY2tsZSw1NjcsOm1lbW9yeSwiY29ubiA9IHNxbGl0ZTMuY29ubmVjdCgiIjptZW1vcnk6IiIpIgotbGlicmFyeS9wcm9maWxlLDI5Myw6bGluZW5vLCIoc29ydCBieSBmaWxlbmFtZTpsaW5lbm8pLCIKLWxpYnJhcnkvc29ja2V0LCw6OiwiKDEwLCAxLCA2LCAnJywgKCcyMDAxOjg4ODoyMDAwOmQ6OmEyJywgODAsIDAsIDApKV0iCi1saWJyYXJ5L3N0ZHR5cGVzLCw6ZW5kLHNbc3RhcnQ6ZW5kXQotbGlicmFyeS9zdGR0eXBlcywsOmVuZCxzW3N0YXJ0OmVuZF0KLWxpY2Vuc2UsLGAsKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKLWxpY2Vuc2UsLGAsKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAotbGljZW5zZSwsYCwiYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIgotbGljZW5zZSwsYCwiVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwiCi1yZWZlcmVuY2UvbGV4aWNhbF9hbmFseXNpcyw3MDQsYCwkICAgICAgID8gICAgICAgYAogd2hhdHNuZXcvMi43LDczNSw6U3VuZGF5LCcyMDA5OjQ6U3VuZGF5Jwogd2hhdHNuZXcvMi43LDg2Miw6OiwiZXhwb3J0IFBZVEhPTldBUk5JTkdTPWFsbCxlcnJvcjo6OkNvb2tpZTowIgogd2hhdHNuZXcvMi43LDg2Miw6Q29va2llLCJleHBvcnQgUFlUSE9OV0FSTklOR1M9YWxsLGVycm9yOjo6Q29va2llOjAiCiB3aGF0c25ldy8yLjcsLDo6LD4+PiB1cmxwYXJzZS51cmxwYXJzZSgnaHR0cDovL1sxMDgwOjo4OjgwMDoyMDBDOjQxN0FdL2ZvbycpCiB3aGF0c25ldy8yLjcsLDo6LCJQYXJzZVJlc3VsdChzY2hlbWU9J2h0dHAnLCBuZXRsb2M9J1sxMDgwOjo4OjgwMDoyMDBDOjQxN0FdJywiCi1ob3d0by9weXBvcnRpbmcsNzUsOjosIyBtYWtlIHN1cmUgdG8gdXNlIDo6IFB5dGhvbiAqYW5kKiA6OiBQeXRob24gOjogMyBzbwotaG93dG8vcHlwb3J0aW5nLDc1LDo6LCInUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uJywiCi1ob3d0by9weXBvcnRpbmcsNzUsOjosJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzJwotZG9jdW1lbnRpbmcvbWFya3VwLDMzLC4uIHNlY3Rpb25hdXRob3I6LC4uIHNlY3Rpb25hdXRob3I6OiBHdWlkbyB2YW4gUm9zc3VtIDxndWlkb0BweXRob24ub3JnPgotZG9jdW1lbnRpbmcvbWFya3VwLDQyLDptb2QsOm1vZDpgcGFycm90YCAtLSBEZWFkIHBhcnJvdCBhY2Nlc3MKLWRvY3VtZW50aW5nL21hcmt1cCw0MixgLDptb2Q6YHBhcnJvdGAgLS0gRGVhZCBwYXJyb3QgYWNjZXNzCi1kb2N1bWVudGluZy9tYXJrdXAsNDIsLi4gbW9kdWxlOiwuLiBtb2R1bGU6OiBwYXJyb3QKLWRvY3VtZW50aW5nL21hcmt1cCw0Miw6cGxhdGZvcm0sIjpwbGF0Zm9ybTogVW5peCwgV2luZG93cyIKLWRvY3VtZW50aW5nL21hcmt1cCw0Miw6c3lub3BzaXMsOnN5bm9wc2lzOiBBbmFseXplIGFuZCByZWFuaW1hdGUgZGVhZCBwYXJyb3RzLgotZG9jdW1lbnRpbmcvbWFya3VwLDQyLC4uIG1vZHVsZWF1dGhvcjosLi4gbW9kdWxlYXV0aG9yOjogRXJpYyBDbGVlc2UgPGVyaWNAcHl0aG9uLmludmFsaWQ+Ci1kb2N1bWVudGluZy9tYXJrdXAsNDIsLi4gbW9kdWxlYXV0aG9yOiwuLiBtb2R1bGVhdXRob3I6OiBKb2huIElkbGUgPGpvaG5AcHl0aG9uLmludmFsaWQ+Ci1kb2N1bWVudGluZy9tYXJrdXAsODgsOm5vaW5kZXgsOm5vaW5kZXg6Ci1kb2N1bWVudGluZy9tYXJrdXAsOTUsLi4gZnVuY3Rpb246LC4uIGZ1bmN0aW9uOjogc3BhbShlZ2dzKQotZG9jdW1lbnRpbmcvbWFya3VwLDk1LDpub2luZGV4LDpub2luZGV4OgotZG9jdW1lbnRpbmcvbWFya3VwLDEwMSwuLiBtZXRob2Q6LC4uIG1ldGhvZDo6IEZpbGVJbnB1dC5pbnB1dCguLi4pCi1kb2N1bWVudGluZy9tYXJrdXAsMTIxLC4uIGNmdW5jdGlvbjosIi4uIGNmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeVR5cGVfR2VuZXJpY0FsbG9jKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlfc3NpemVfdCBuaXRlbXMpIgotZG9jdW1lbnRpbmcvbWFya3VwLDEzMSwuLiBjbWVtYmVyOiwuLiBjbWVtYmVyOjogUHlPYmplY3QqIFB5VHlwZU9iamVjdC50cF9iYXNlcwotZG9jdW1lbnRpbmcvbWFya3VwLDE1MCwuLiBjdmFyOiwuLiBjdmFyOjogUHlPYmplY3QqIFB5Q2xhc3NfVHlwZQotZG9jdW1lbnRpbmcvbWFya3VwLDE3OSwuLiBmdW5jdGlvbjosIi4uIGZ1bmN0aW9uOjogVGltZXIucmVwZWF0KFtyZXBlYXQ9M1ssIG51bWJlcj0xMDAwMDAwXV0pIgotZG9jdW1lbnRpbmcvbWFya3VwLDIwOSwuLiBjbWRvcHRpb246LC4uIGNtZG9wdGlvbjo6IC1tIDxtb2R1bGU+Ci1kb2N1bWVudGluZy9tYXJrdXAsMjI3LC4uIGRlc2NyaWJlOiwuLiBkZXNjcmliZTo6IG9wY29kZQotZG9jdW1lbnRpbmcvbWFya3VwLDI1NiwuLiBoaWdobGlnaHRsYW5nOiwuLiBoaWdobGlnaHRsYW5nOjogYwotZG9jdW1lbnRpbmcvbWFya3VwLDI3NiwuLiBsaXRlcmFsaW5jbHVkZTosLi4gbGl0ZXJhbGluY2x1ZGU6OiBleGFtcGxlLnB5Ci1kb2N1bWVudGluZy9tYXJrdXAsMjkxLDpyb2xlbmFtZSw6cm9sZW5hbWU6YGNvbnRlbnRgCi1kb2N1bWVudGluZy9tYXJrdXAsMjkxLGAsOnJvbGVuYW1lOmBjb250ZW50YAotZG9jdW1lbnRpbmcvbWFya3VwLDI5Niw6cm9sZSw6cm9sZTpgdGl0bGUgPHRhcmdldD5gCi1kb2N1bWVudGluZy9tYXJrdXAsMjk2LGAsOnJvbGU6YHRpdGxlIDx0YXJnZXQ+YAotZG9jdW1lbnRpbmcvbWFya3VwLDMwMiw6bWV0aCw6bWV0aDpgflF1ZXVlLlF1ZXVlLmdldGAKLWRvY3VtZW50aW5nL21hcmt1cCwzMDIsYCw6bWV0aDpgflF1ZXVlLlF1ZXVlLmdldGAKLWRvY3VtZW50aW5nL21hcmt1cCwzNTAsOmZ1bmMsOmZ1bmM6YGZpbHRlcmAKLWRvY3VtZW50aW5nL21hcmt1cCwzNTAsYCw6ZnVuYzpgZmlsdGVyYAotZG9jdW1lbnRpbmcvbWFya3VwLDM1MCw6ZnVuYyw6ZnVuYzpgZm9vLmZpbHRlcmAKLWRvY3VtZW50aW5nL21hcmt1cCwzNTAsYCw6ZnVuYzpgZm9vLmZpbHRlcmAKLWRvY3VtZW50aW5nL21hcmt1cCwzNTYsOmZ1bmMsOmZ1bmM6YG9wZW5gCi1kb2N1bWVudGluZy9tYXJrdXAsMzU2LGAsOmZ1bmM6YG9wZW5gCi1kb2N1bWVudGluZy9tYXJrdXAsMzU2LDpmdW5jLDpmdW5jOmAub3BlbmAKLWRvY3VtZW50aW5nL21hcmt1cCwzNTYsYCw6ZnVuYzpgLm9wZW5gCi1kb2N1bWVudGluZy9tYXJrdXAsNDM1LDpmaWxlLC4uLiBpcyBpbnN0YWxsZWQgaW4gOmZpbGU6YC91c3IvbGliL3B5dGhvbjIue3h9L3NpdGUtcGFja2FnZXNgIC4uLgotZG9jdW1lbnRpbmcvbWFya3VwLDQzNSxgLC4uLiBpcyBpbnN0YWxsZWQgaW4gOmZpbGU6YC91c3IvbGliL3B5dGhvbjIue3h9L3NpdGUtcGFja2FnZXNgIC4uLgotZG9jdW1lbnRpbmcvbWFya3VwLDQ1NCw6a2JkLDprYmQ6YEMteCBDLWZgCi1kb2N1bWVudGluZy9tYXJrdXAsNDU0LGAsOmtiZDpgQy14IEMtZmAKLWRvY3VtZW50aW5nL21hcmt1cCw0NTQsOmtiZCw6a2JkOmBDb250cm9sLXggQ29udHJvbC1mYAotZG9jdW1lbnRpbmcvbWFya3VwLDQ1NCxgLDprYmQ6YENvbnRyb2wteCBDb250cm9sLWZgCi1kb2N1bWVudGluZy9tYXJrdXAsNDY4LDptYWlsaGVhZGVyLDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgCi1kb2N1bWVudGluZy9tYXJrdXAsNDY4LGAsOm1haWxoZWFkZXI6YENvbnRlbnQtVHlwZWAKLWRvY3VtZW50aW5nL21hcmt1cCw0NzcsOm1hbnBhZ2UsOm1hbnBhZ2U6YGxzKDEpYAotZG9jdW1lbnRpbmcvbWFya3VwLDQ3NyxgLDptYW5wYWdlOmBscygxKWAKLWRvY3VtZW50aW5nL21hcmt1cCw0OTMsOm1lbnVzZWxlY3Rpb24sOm1lbnVzZWxlY3Rpb246YFN0YXJ0IC0tPiBQcm9ncmFtc2AKLWRvY3VtZW50aW5nL21hcmt1cCw0OTMsYCw6bWVudXNlbGVjdGlvbjpgU3RhcnQgLS0+IFByb2dyYW1zYAotZG9jdW1lbnRpbmcvbWFya3VwLDUwOCxgLGBgY29kZWBgCi1kb2N1bWVudGluZy9tYXJrdXAsNTI2LDpmaWxlLDpmaWxlOgotZG9jdW1lbnRpbmcvbWFya3VwLDUyNixgLGBgY29kZWBgCi1kb2N1bWVudGluZy9tYXJrdXAsNTYxLDpyZWYsOnJlZjpgbGFiZWwtbmFtZWAKLWRvY3VtZW50aW5nL21hcmt1cCw1NjEsYCw6cmVmOmBsYWJlbC1uYW1lYAotZG9jdW1lbnRpbmcvbWFya3VwLDU2NSw6cmVmLCJJdCByZWZlcnMgdG8gdGhlIHNlY3Rpb24gaXRzZWxmLCBzZWUgOnJlZjpgbXktcmVmZXJlbmNlLWxhYmVsYC4iCi1kb2N1bWVudGluZy9tYXJrdXAsNTY1LGAsIkl0IHJlZmVycyB0byB0aGUgc2VjdGlvbiBpdHNlbGYsIHNlZSA6cmVmOmBteS1yZWZlcmVuY2UtbGFiZWxgLiIKLWRvY3VtZW50aW5nL21hcmt1cCw1NzQsOnJlZiw6cmVmOgotZG9jdW1lbnRpbmcvbWFya3VwLDU5NSwuLiBub3RlOiwuLiBub3RlOjoKLWRvY3VtZW50aW5nL21hcmt1cCw2MjIsLi4gdmVyc2lvbmFkZGVkOiwuLiB2ZXJzaW9uYWRkZWQ6OiAyLjUKLWRvY3VtZW50aW5nL21hcmt1cCw2NDcsOjosLi4gaW1wbC1kZXRhaWw6OgotZG9jdW1lbnRpbmcvbWFya3VwLDY0Nyw6OiwuLiBpbXBsLWRldGFpbDo6IFRoaXMgc2hvcnRseSBtZW50aW9ucyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuCi1kb2N1bWVudGluZy9tYXJrdXAsNjY3LC4uIHNlZWFsc286LC4uIHNlZWFsc286OgotZG9jdW1lbnRpbmcvbWFya3VwLDY2Nyw6bW9kLE1vZHVsZSA6bW9kOmB6aXBmaWxlYAotZG9jdW1lbnRpbmcvbWFya3VwLDY2NyxgLE1vZHVsZSA6bW9kOmB6aXBmaWxlYAotZG9jdW1lbnRpbmcvbWFya3VwLDY2Nyw6bW9kLERvY3VtZW50YXRpb24gb2YgdGhlIDptb2Q6YHppcGZpbGVgIHN0YW5kYXJkIG1vZHVsZS4KLWRvY3VtZW50aW5nL21hcmt1cCw2NjcsYCxEb2N1bWVudGF0aW9uIG9mIHRoZSA6bW9kOmB6aXBmaWxlYCBzdGFuZGFyZCBtb2R1bGUuCi1kb2N1bWVudGluZy9tYXJrdXAsNjY3LGAsImBHTlUgdGFyIG1hbnVhbCwgQmFzaWMgVGFyIEZvcm1hdCA8aHR0cDovL2xpbms+YF8iCi1kb2N1bWVudGluZy9tYXJrdXAsNjgxLC4uIGNlbnRlcmVkOiwuLiBjZW50ZXJlZDo6Ci1kb2N1bWVudGluZy9tYXJrdXAsNzI2LC4uIHRvY3RyZWU6LC4uIHRvY3RyZWU6OgotZG9jdW1lbnRpbmcvbWFya3VwLDcyNiw6bWF4ZGVwdGgsOm1heGRlcHRoOiAyCi1kb2N1bWVudGluZy9tYXJrdXAsNzQyLC4uIGluZGV4OiwuLiBpbmRleDo6Ci1kb2N1bWVudGluZy9tYXJrdXAsNzcyLC4uIGluZGV4OiwiLi4gaW5kZXg6OiBCTkYsIGdyYW1tYXIsIHN5bnRheCwgbm90YXRpb24iCi1kb2N1bWVudGluZy9tYXJrdXAsODAzLGAsInVuYXJ5bmVnIDo6PSAiIi0iIiBgaW50ZWdlcmAiCi1kb2N1bWVudGluZy9tYXJrdXAsODA4LC4uIHByb2R1Y3Rpb25saXN0OiwuLiBwcm9kdWN0aW9ubGlzdDo6Ci1kb2N1bWVudGluZy9tYXJrdXAsODA4LGAsInRyeTFfc3RtdDogIiJ0cnkiIiAiIjoiIiBgc3VpdGVgIgotZG9jdW1lbnRpbmcvbWFya3VwLDgwOCxgLCI6ICgiImV4Y2VwdCIiIFtgZXhwcmVzc2lvbmAgWyIiLCIiIGB0YXJnZXRgXV0gIiI6IiIgYHN1aXRlYCkrIgotZG9jdW1lbnRpbmcvbWFya3VwLDgwOCxgLCI6IFsiImVsc2UiIiAiIjoiIiBgc3VpdGVgXSIKLWRvY3VtZW50aW5nL21hcmt1cCw4MDgsYCwiOiBbIiJmaW5hbGx5IiIgIiI6IiIgYHN1aXRlYF0iCi1kb2N1bWVudGluZy9tYXJrdXAsODA4LGAsInRyeTJfc3RtdDogIiJ0cnkiIiAiIjoiIiBgc3VpdGVgIgotZG9jdW1lbnRpbmcvbWFya3VwLDgwOCxgLCI6ICIiZmluYWxseSIiICIiOiIiIGBzdWl0ZWAiCi1saWJyYXJ5L3VybGxpYjIsNjcsOmNsb3NlLENvbm5lY3Rpb246Y2xvc2UKZGlmZiAtLWdpdCBhL0RvYy90b29scy9zcGhpbnhleHQvc3VzcGljaW91cy5weSBiL0RvYy90b29scy9zcGhpbnhleHQvc3VzcGljaW91cy5weQppbmRleCBmMTVlOTMxYi4uZTM5NzU2MCAxMDA2NDQKLS0tIGEvRG9jL3Rvb2xzL3NwaGlueGV4dC9zdXNwaWNpb3VzLnB5CisrKyBiL0RvYy90b29scy9zcGhpbnhleHQvc3VzcGljaW91cy5weQpAQCAtNjYsNiArNjYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE5vbmUgLT4gZG9uJ3QgY2FyZQogICAgICAgICBzZWxmLmlzc3VlID0gaXNzdWUgICAgICMgdGhlIG1hcmt1cCBmcmFnbWVudCB0aGF0IHRyaWdnZXJlZCB0aGlzIHJ1bGUKICAgICAgICAgc2VsZi5saW5lID0gbGluZSAgICAgICAjIHRleHQgb2YgdGhlIGNvbnRhaW5lciBlbGVtZW50IChzaW5nbGUgbGluZSBvbmx5KQorICAgICAgICBzZWxmLnVzZWQgPSBGYWxzZQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gJ3swLmRvY25hbWV9LCx7MC5pc3N1ZX0sezAubGluZX0nLmZvcm1hdChzZWxmKQogCiAKIApAQCAtMTA1LDYgKzEwOSwxMiBAQAogICAgICAgICBkb2N0cmVlLndhbGsodmlzaXRvcikKIAogICAgIGRlZiBmaW5pc2goc2VsZik6CisgICAgICAgIHVudXNlZF9ydWxlcyA9IFtydWxlIGZvciBydWxlIGluIHNlbGYucnVsZXMgaWYgbm90IHJ1bGUudXNlZF0KKyAgICAgICAgaWYgdW51c2VkX3J1bGVzOgorICAgICAgICAgICAgc2VsZi53YXJuKCdGb3VuZCAlcy8lcyB1bnVzZWQgcnVsZXM6JyAlCisgICAgICAgICAgICAgICAgICAgICAgKGxlbih1bnVzZWRfcnVsZXMpLCBsZW4oc2VsZi5ydWxlcykpKQorICAgICAgICAgICAgZm9yIHJ1bGUgaW4gdW51c2VkX3J1bGVzOgorICAgICAgICAgICAgICAgIHNlbGYuaW5mbyhyZXByKHJ1bGUpKQogICAgICAgICByZXR1cm4KIAogICAgIGRlZiBjaGVja19pc3N1ZShzZWxmLCBsaW5lLCBsaW5lbm8sIGlzc3VlKToKQEAgLTEyOSw2ICsxMzksNyBAQAogICAgICAgICAgICAgaWYgKHJ1bGUubGluZW5vIGlzIG5vdCBOb25lKSBhbmQgXAogICAgICAgICAgICAgICAgIGFicyhydWxlLmxpbmVubyAtIGxpbmVubykgPiA1OiBjb250aW51ZQogICAgICAgICAgICAgIyBpZiBpdCBjYW1lIHRoaXMgZmFyLCB0aGUgcnVsZSBtYXRjaGVkCisgICAgICAgICAgICBydWxlLnVzZWQgPSBUcnVlCiAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICByZXR1cm4gRmFsc2UKIApkaWZmIC0tZ2l0IGEvRG9jL3R1dG9yaWFsL2NsYXNzZXMucnN0IGIvRG9jL3R1dG9yaWFsL2NsYXNzZXMucnN0CmluZGV4IGMzNjQwYTAuLjYwZDM4MmMgMTAwNjQ0Ci0tLSBhL0RvYy90dXRvcmlhbC9jbGFzc2VzLnJzdAorKysgYi9Eb2MvdHV0b3JpYWwvY2xhc3Nlcy5yc3QKQEAgLTMzNyw2ICszMzcsNzcgQEAKIGFyZ3VtZW50IGxpc3QuCiAKIAorLi4gX3R1dC1jbGFzcy1hbmQtaW5zdGFuY2UtdmFyaWFibGVzOgorCitDbGFzcyBhbmQgSW5zdGFuY2UgVmFyaWFibGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0dlbmVyYWxseSBzcGVha2luZywgaW5zdGFuY2UgdmFyaWFibGVzIGFyZSBmb3IgZGF0YSB1bmlxdWUgdG8gZWFjaCBpbnN0YW5jZQorYW5kIGNsYXNzIHZhcmlhYmxlcyBhcmUgZm9yIGF0dHJpYnV0ZXMgYW5kIG1ldGhvZHMgc2hhcmVkIGJ5IGFsbCBpbnN0YW5jZXMKK29mIHRoZSBjbGFzczo6CisKKyAgICBjbGFzcyBEb2c6CisKKyAgICAgICAga2luZCA9ICdjYW5pbmUnICAgICAgICAgIyBjbGFzcyB2YXJpYWJsZSBzaGFyZWQgYnkgYWxsIGluc3RhbmNlcworCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgICAgIHNlbGYubmFtZSA9IG5hbWUgICAgIyBpbnN0YW5jZSB2YXJpYWJsZSB1bmlxdWUgdG8gZWFjaCBpbnN0YW5jZQorCisgICAgPj4+IGQgPSBEb2coJ0ZpZG8nKQorICAgID4+PiBlID0gRG9nKCdCdWRkeScpCisgICAgPj4+IGQua2luZCAgICAgICAgICAgICAgICAgICMgc2hhcmVkIGJ5IGFsbCBkb2dzCisgICAgJ2NhbmluZScKKyAgICA+Pj4gZS5raW5kICAgICAgICAgICAgICAgICAgIyBzaGFyZWQgYnkgYWxsIGRvZ3MKKyAgICAnY2FuaW5lJworICAgID4+PiBkLm5hbWUgICAgICAgICAgICAgICAgICAjIHVuaXF1ZSB0byBkCisgICAgJ0ZpZG8nCisgICAgPj4+IGUubmFtZSAgICAgICAgICAgICAgICAgICMgdW5pcXVlIHRvIGUKKyAgICAnQnVkZHknCisKK0FzIGRpc2N1c3NlZCBpbiA6cmVmOmB0dXQtb2JqZWN0YCwgc2hhcmVkIGRhdGEgY2FuIGhhdmUgcG9zc2libHkgc3VycHJpc2luZworZWZmZWN0cyB3aXRoIGludm9sdmluZyA6dGVybTpgbXV0YWJsZWAgb2JqZWN0cyBzdWNoIGFzIGxpc3RzIGFuZCBkaWN0aW9uYXJpZXMuCitGb3IgZXhhbXBsZSwgdGhlICp0cmlja3MqIGxpc3QgaW4gdGhlIGZvbGxvd2luZyBjb2RlIHNob3VsZCBub3QgYmUgdXNlZCBhcyBhCitjbGFzcyB2YXJpYWJsZSBiZWNhdXNlIGp1c3QgYSBzaW5nbGUgbGlzdCB3b3VsZCBiZSBzaGFyZWQgYnkgYWxsICpEb2cqCitpbnN0YW5jZXM6OgorCisgICAgY2xhc3MgRG9nOgorCisgICAgICAgIHRyaWNrcyA9IFtdICAgICAgICAgICAgICMgbWlzdGFrZW4gdXNlIG9mIGEgY2xhc3MgdmFyaWFibGUKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CisgICAgICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisKKyAgICAgICAgZGVmIGFkZF90cmljayhzZWxmLCB0cmljayk6CisgICAgICAgICAgICBzZWxmLnRyaWNrcy5hcHBlbmQodHJpY2spCisKKyAgICA+Pj4gZCA9IERvZygnRmlkbycpCisgICAgPj4+IGUgPSBEb2coJ0J1ZGR5JykKKyAgICA+Pj4gZC5hZGRfdHJpY2soJ3JvbGwgb3ZlcicpCisgICAgPj4+IGUuYWRkX3RyaWNrKCdwbGF5IGRlYWQnKQorICAgID4+PiBkLnRyaWNrcyAgICAgICAgICAgICAgICAjIHVuZXhwZWN0ZWRseSBzaGFyZWQgYnkgYWxsIGRvZ3MKKyAgICBbJ3JvbGwgb3ZlcicsICdwbGF5IGRlYWQnXQorCitDb3JyZWN0IGRlc2lnbiBvZiB0aGUgY2xhc3Mgc2hvdWxkIHVzZSBhbiBpbnN0YW5jZSB2YXJpYWJsZSBpbnN0ZWFkOjoKKworICAgIGNsYXNzIERvZzoKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CisgICAgICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgICAgICBzZWxmLnRyaWNrcyA9IFtdICAgICMgY3JlYXRlcyBhIG5ldyBlbXB0eSBsaXN0IGZvciBlYWNoIGRvZworCisgICAgICAgIGRlZiBhZGRfdHJpY2soc2VsZiwgdHJpY2spOgorICAgICAgICAgICAgc2VsZi50cmlja3MuYXBwZW5kKHRyaWNrKQorCisgICAgPj4+IGQgPSBEb2coJ0ZpZG8nKQorICAgID4+PiBlID0gRG9nKCdCdWRkeScpCisgICAgPj4+IGQuYWRkX3RyaWNrKCdyb2xsIG92ZXInKQorICAgID4+PiBlLmFkZF90cmljaygncGxheSBkZWFkJykKKyAgICA+Pj4gZC50cmlja3MKKyAgICBbJ3JvbGwgb3ZlciddCisgICAgPj4+IGUudHJpY2tzCisgICAgWydwbGF5IGRlYWQnXQorCisKIC4uIF90dXQtcmVtYXJrczoKIAogUmFuZG9tIFJlbWFya3MKQEAgLTQwOSw4ICs0ODAsOCBAQAogICAgICAgICAgICBzZWxmLmFkZCh4KQogCiBNZXRob2RzIG1heSByZWZlcmVuY2UgZ2xvYmFsIG5hbWVzIGluIHRoZSBzYW1lIHdheSBhcyBvcmRpbmFyeSBmdW5jdGlvbnMuICBUaGUKLWdsb2JhbCBzY29wZSBhc3NvY2lhdGVkIHdpdGggYSBtZXRob2QgaXMgdGhlIG1vZHVsZSBjb250YWluaW5nIHRoZSBjbGFzcwotZGVmaW5pdGlvbi4gIChUaGUgY2xhc3MgaXRzZWxmIGlzIG5ldmVyIHVzZWQgYXMgYSBnbG9iYWwgc2NvcGUuKSAgV2hpbGUgb25lCitnbG9iYWwgc2NvcGUgYXNzb2NpYXRlZCB3aXRoIGEgbWV0aG9kIGlzIHRoZSBtb2R1bGUgY29udGFpbmluZyBpdHMKK2RlZmluaXRpb24uICAoQSBjbGFzcyBpcyBuZXZlciB1c2VkIGFzIGEgZ2xvYmFsIHNjb3BlLikgIFdoaWxlIG9uZQogcmFyZWx5IGVuY291bnRlcnMgYSBnb29kIHJlYXNvbiBmb3IgdXNpbmcgZ2xvYmFsIGRhdGEgaW4gYSBtZXRob2QsIHRoZXJlIGFyZQogbWFueSBsZWdpdGltYXRlIHVzZXMgb2YgdGhlIGdsb2JhbCBzY29wZTogZm9yIG9uZSB0aGluZywgZnVuY3Rpb25zIGFuZCBtb2R1bGVzCiBpbXBvcnRlZCBpbnRvIHRoZSBnbG9iYWwgc2NvcGUgY2FuIGJlIHVzZWQgYnkgbWV0aG9kcywgYXMgd2VsbCBhcyBmdW5jdGlvbnMgYW5kCkBAIC01MzQsOCArNjA1LDggQEAKIAogLi4gX3R1dC1wcml2YXRlOgogCi1Qcml2YXRlIFZhcmlhYmxlcwotPT09PT09PT09PT09PT09PT0KK1ByaXZhdGUgVmFyaWFibGVzIGFuZCBDbGFzcy1sb2NhbCBSZWZlcmVuY2VzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiAiUHJpdmF0ZSIgaW5zdGFuY2UgdmFyaWFibGVzIHRoYXQgY2Fubm90IGJlIGFjY2Vzc2VkIGV4Y2VwdCBmcm9tIGluc2lkZSBhbgogb2JqZWN0IGRvbid0IGV4aXN0IGluIFB5dGhvbi4gIEhvd2V2ZXIsIHRoZXJlIGlzIGEgY29udmVudGlvbiB0aGF0IGlzIGZvbGxvd2VkCkBAIC02MDksNyArNjgwLDcgQEAKIEEgcGllY2Ugb2YgUHl0aG9uIGNvZGUgdGhhdCBleHBlY3RzIGEgcGFydGljdWxhciBhYnN0cmFjdCBkYXRhIHR5cGUgY2FuIG9mdGVuIGJlCiBwYXNzZWQgYSBjbGFzcyB0aGF0IGVtdWxhdGVzIHRoZSBtZXRob2RzIG9mIHRoYXQgZGF0YSB0eXBlIGluc3RlYWQuICBGb3IKIGluc3RhbmNlLCBpZiB5b3UgaGF2ZSBhIGZ1bmN0aW9uIHRoYXQgZm9ybWF0cyBzb21lIGRhdGEgZnJvbSBhIGZpbGUgb2JqZWN0LCB5b3UKLWNhbiBkZWZpbmUgYSBjbGFzcyB3aXRoIG1ldGhvZHMgOm1ldGg6YHJlYWRgIGFuZCA6bWV0aDpgcmVhZGxpbmVgIHRoYXQgZ2V0IHRoZQorY2FuIGRlZmluZSBhIGNsYXNzIHdpdGggbWV0aG9kcyA6bWV0aDpgcmVhZGAgYW5kIDptZXRoOmAhcmVhZGxpbmVgIHRoYXQgZ2V0IHRoZQogZGF0YSBmcm9tIGEgc3RyaW5nIGJ1ZmZlciBpbnN0ZWFkLCBhbmQgcGFzcyBpdCBhcyBhbiBhcmd1bWVudC4KIAogLi4gKFVuZm9ydHVuYXRlbHksIHRoaXMgdGVjaG5pcXVlIGhhcyBpdHMgbGltaXRhdGlvbnM6IGEgY2xhc3MgY2FuJ3QgZGVmaW5lCkBAIC02ODgsMTQgKzc1OSwxNSBAQAogICAgZm9yIGNoYXIgaW4gIjEyMyI6CiAgICAgICAgcHJpbnQgY2hhcgogICAgZm9yIGxpbmUgaW4gb3BlbigibXlmaWxlLnR4dCIpOgotICAgICAgIHByaW50IGxpbmUKKyAgICAgICBwcmludCBsaW5lLAogCiBUaGlzIHN0eWxlIG9mIGFjY2VzcyBpcyBjbGVhciwgY29uY2lzZSwgYW5kIGNvbnZlbmllbnQuICBUaGUgdXNlIG9mIGl0ZXJhdG9ycwogcGVydmFkZXMgYW5kIHVuaWZpZXMgUHl0aG9uLiAgQmVoaW5kIHRoZSBzY2VuZXMsIHRoZSA6a2V5d29yZDpgZm9yYCBzdGF0ZW1lbnQKIGNhbGxzIDpmdW5jOmBpdGVyYCBvbiB0aGUgY29udGFpbmVyIG9iamVjdC4gIFRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIGl0ZXJhdG9yCi1vYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBtZXRob2QgOm1ldGg6YG5leHRgIHdoaWNoIGFjY2Vzc2VzIGVsZW1lbnRzIGluIHRoZQotY29udGFpbmVyIG9uZSBhdCBhIHRpbWUuICBXaGVuIHRoZXJlIGFyZSBubyBtb3JlIGVsZW1lbnRzLCA6bWV0aDpgbmV4dGAgcmFpc2VzIGEKLTpleGM6YFN0b3BJdGVyYXRpb25gIGV4Y2VwdGlvbiB3aGljaCB0ZWxscyB0aGUgOmtleXdvcmQ6YGZvcmAgbG9vcCB0byB0ZXJtaW5hdGUuCitvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBtZXRob2QgOm1ldGg6YH5pdGVyYXRvci5uZXh0YCB3aGljaCBhY2Nlc3NlcyBlbGVtZW50cworaW4gdGhlIGNvbnRhaW5lciBvbmUgYXQgYSB0aW1lLiAgV2hlbiB0aGVyZSBhcmUgbm8gbW9yZSBlbGVtZW50cywKKzptZXRoOmB+aXRlcmF0b3IubmV4dGAgcmFpc2VzIGEgOmV4YzpgU3RvcEl0ZXJhdGlvbmAgZXhjZXB0aW9uIHdoaWNoIHRlbGxzIHRoZQorOmtleXdvcmQ6YGZvcmAgbG9vcCB0byB0ZXJtaW5hdGUuCiBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IGl0IGFsbCB3b3Jrczo6CiAKICAgID4+PiBzID0gJ2FiYycKZGlmZiAtLWdpdCBhL0RvYy90dXRvcmlhbC9jb250cm9sZmxvdy5yc3QgYi9Eb2MvdHV0b3JpYWwvY29udHJvbGZsb3cucnN0CmluZGV4IDI0YzAyZWIuLjhmZmFmM2YgMTAwNjQ0Ci0tLSBhL0RvYy90dXRvcmlhbC9jb250cm9sZmxvdy5yc3QKKysrIGIvRG9jL3R1dG9yaWFsL2NvbnRyb2xmbG93LnJzdApAQCAtMTksMTQgKzE5LDE0IEBACiAgICA+Pj4geCA9IGludChyYXdfaW5wdXQoIlBsZWFzZSBlbnRlciBhbiBpbnRlZ2VyOiAiKSkKICAgIFBsZWFzZSBlbnRlciBhbiBpbnRlZ2VyOiA0MgogICAgPj4+IGlmIHggPCAwOgotICAgLi4uICAgICAgeCA9IDAKLSAgIC4uLiAgICAgIHByaW50ICdOZWdhdGl2ZSBjaGFuZ2VkIHRvIHplcm8nCisgICAuLi4gICAgIHggPSAwCisgICAuLi4gICAgIHByaW50ICdOZWdhdGl2ZSBjaGFuZ2VkIHRvIHplcm8nCiAgICAuLi4gZWxpZiB4ID09IDA6Ci0gICAuLi4gICAgICBwcmludCAnWmVybycKKyAgIC4uLiAgICAgcHJpbnQgJ1plcm8nCiAgICAuLi4gZWxpZiB4ID09IDE6Ci0gICAuLi4gICAgICBwcmludCAnU2luZ2xlJworICAgLi4uICAgICBwcmludCAnU2luZ2xlJwogICAgLi4uIGVsc2U6Ci0gICAuLi4gICAgICBwcmludCAnTW9yZScKKyAgIC4uLiAgICAgcHJpbnQgJ01vcmUnCiAgICAuLi4KICAgIE1vcmUKIApAQCAtNTksMjQgKzU5LDI0IEBACiA6OgogCiAgICA+Pj4gIyBNZWFzdXJlIHNvbWUgc3RyaW5nczoKLSAgIC4uLiBhID0gWydjYXQnLCAnd2luZG93JywgJ2RlZmVuZXN0cmF0ZSddCi0gICA+Pj4gZm9yIHggaW4gYToKLSAgIC4uLiAgICAgcHJpbnQgeCwgbGVuKHgpCisgICAuLi4gd29yZHMgPSBbJ2NhdCcsICd3aW5kb3cnLCAnZGVmZW5lc3RyYXRlJ10KKyAgID4+PiBmb3IgdyBpbiB3b3JkczoKKyAgIC4uLiAgICAgcHJpbnQgdywgbGVuKHcpCiAgICAuLi4KICAgIGNhdCAzCiAgICB3aW5kb3cgNgogICAgZGVmZW5lc3RyYXRlIDEyCiAKLUl0IGlzIG5vdCBzYWZlIHRvIG1vZGlmeSB0aGUgc2VxdWVuY2UgYmVpbmcgaXRlcmF0ZWQgb3ZlciBpbiB0aGUgbG9vcCAodGhpcyBjYW4KLW9ubHkgaGFwcGVuIGZvciBtdXRhYmxlIHNlcXVlbmNlIHR5cGVzLCBzdWNoIGFzIGxpc3RzKS4gIElmIHlvdSBuZWVkIHRvIG1vZGlmeQotdGhlIGxpc3QgeW91IGFyZSBpdGVyYXRpbmcgb3ZlciAoZm9yIGV4YW1wbGUsIHRvIGR1cGxpY2F0ZSBzZWxlY3RlZCBpdGVtcykgeW91Ci1tdXN0IGl0ZXJhdGUgb3ZlciBhIGNvcHkuICBUaGUgc2xpY2Ugbm90YXRpb24gbWFrZXMgdGhpcyBwYXJ0aWN1bGFybHkKLWNvbnZlbmllbnQ6OgorSWYgeW91IG5lZWQgdG8gbW9kaWZ5IHRoZSBzZXF1ZW5jZSB5b3UgYXJlIGl0ZXJhdGluZyBvdmVyIHdoaWxlIGluc2lkZSB0aGUgbG9vcAorKGZvciBleGFtcGxlIHRvIGR1cGxpY2F0ZSBzZWxlY3RlZCBpdGVtcyksIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IGZpcnN0CittYWtlIGEgY29weS4gIEl0ZXJhdGluZyBvdmVyIGEgc2VxdWVuY2UgZG9lcyBub3QgaW1wbGljaXRseSBtYWtlIGEgY29weS4gIFRoZQorc2xpY2Ugbm90YXRpb24gbWFrZXMgdGhpcyBlc3BlY2lhbGx5IGNvbnZlbmllbnQ6OgogCi0gICA+Pj4gZm9yIHggaW4gYVs6XTogIyBtYWtlIGEgc2xpY2UgY29weSBvZiB0aGUgZW50aXJlIGxpc3QKLSAgIC4uLiAgICBpZiBsZW4oeCkgPiA2OiBhLmluc2VydCgwLCB4KQorICAgPj4+IGZvciB3IGluIHdvcmRzWzpdOiAgIyBMb29wIG92ZXIgYSBzbGljZSBjb3B5IG9mIHRoZSBlbnRpcmUgbGlzdC4KKyAgIC4uLiAgICAgaWYgbGVuKHcpID4gNjoKKyAgIC4uLiAgICAgICAgIHdvcmRzLmluc2VydCgwLCB3KQogICAgLi4uCi0gICA+Pj4gYQorICAgPj4+IHdvcmRzCiAgICBbJ2RlZmVuZXN0cmF0ZScsICdjYXQnLCAnd2luZG93JywgJ2RlZmVuZXN0cmF0ZSddCiAKIApAQCAtMTI5LDkgKzEyOSw2IEBACiBUaGUgOmtleXdvcmQ6YGJyZWFrYCBzdGF0ZW1lbnQsIGxpa2UgaW4gQywgYnJlYWtzIG91dCBvZiB0aGUgc21hbGxlc3QgZW5jbG9zaW5nCiA6a2V5d29yZDpgZm9yYCBvciA6a2V5d29yZDpgd2hpbGVgIGxvb3AuCiAKLVRoZSA6a2V5d29yZDpgY29udGludWVgIHN0YXRlbWVudCwgYWxzbyBib3Jyb3dlZCBmcm9tIEMsIGNvbnRpbnVlcyB3aXRoIHRoZSBuZXh0Ci1pdGVyYXRpb24gb2YgdGhlIGxvb3AuCi0KIExvb3Agc3RhdGVtZW50cyBtYXkgaGF2ZSBhbiBgYGVsc2VgYCBjbGF1c2U7IGl0IGlzIGV4ZWN1dGVkIHdoZW4gdGhlIGxvb3AKIHRlcm1pbmF0ZXMgdGhyb3VnaCBleGhhdXN0aW9uIG9mIHRoZSBsaXN0ICh3aXRoIDprZXl3b3JkOmBmb3JgKSBvciB3aGVuIHRoZQogY29uZGl0aW9uIGJlY29tZXMgZmFsc2UgKHdpdGggOmtleXdvcmQ6YHdoaWxlYCksIGJ1dCBub3Qgd2hlbiB0aGUgbG9vcCBpcwpAQCAtMTU5LDYgKzE1NiwzMCBAQAogKFllcywgdGhpcyBpcyB0aGUgY29ycmVjdCBjb2RlLiAgTG9vayBjbG9zZWx5OiB0aGUgYGBlbHNlYGAgY2xhdXNlIGJlbG9uZ3MgdG8KIHRoZSA6a2V5d29yZDpgZm9yYCBsb29wLCAqKm5vdCoqIHRoZSA6a2V5d29yZDpgaWZgIHN0YXRlbWVudC4pCiAKK1doZW4gdXNlZCB3aXRoIGEgbG9vcCwgdGhlIGBgZWxzZWBgIGNsYXVzZSBoYXMgbW9yZSBpbiBjb21tb24gd2l0aCB0aGUKK2BgZWxzZWBgIGNsYXVzZSBvZiBhIDprZXl3b3JkOmB0cnlgIHN0YXRlbWVudCB0aGFuIGl0IGRvZXMgdGhhdCBvZgorOmtleXdvcmQ6YGlmYCBzdGF0ZW1lbnRzOiBhIDprZXl3b3JkOmB0cnlgIHN0YXRlbWVudCdzIGBgZWxzZWBgIGNsYXVzZSBydW5zCit3aGVuIG5vIGV4Y2VwdGlvbiBvY2N1cnMsIGFuZCBhIGxvb3AncyBgYGVsc2VgYCBjbGF1c2UgcnVucyB3aGVuIG5vIGBgYnJlYWtgYAorb2NjdXJzLiBGb3IgbW9yZSBvbiB0aGUgOmtleXdvcmQ6YHRyeWAgc3RhdGVtZW50IGFuZCBleGNlcHRpb25zLCBzZWUKKzpyZWY6YHR1dC1oYW5kbGluZ2AuCisKK1RoZSA6a2V5d29yZDpgY29udGludWVgIHN0YXRlbWVudCwgYWxzbyBib3Jyb3dlZCBmcm9tIEMsIGNvbnRpbnVlcyB3aXRoIHRoZSBuZXh0CitpdGVyYXRpb24gb2YgdGhlIGxvb3A6OgorCisgICAgPj4+IGZvciBudW0gaW4gcmFuZ2UoMiwgMTApOgorICAgIC4uLiAgICAgaWYgbnVtICUgMiA9PSAwOgorICAgIC4uLiAgICAgICAgIHByaW50ICJGb3VuZCBhbiBldmVuIG51bWJlciIsIG51bQorICAgIC4uLiAgICAgICAgIGNvbnRpbnVlCisgICAgLi4uICAgICBwcmludCAiRm91bmQgYSBudW1iZXIiLCBudW0KKyAgICBGb3VuZCBhbiBldmVuIG51bWJlciAyCisgICAgRm91bmQgYSBudW1iZXIgMworICAgIEZvdW5kIGFuIGV2ZW4gbnVtYmVyIDQKKyAgICBGb3VuZCBhIG51bWJlciA1CisgICAgRm91bmQgYW4gZXZlbiBudW1iZXIgNgorICAgIEZvdW5kIGEgbnVtYmVyIDcKKyAgICBGb3VuZCBhbiBldmVuIG51bWJlciA4CisgICAgRm91bmQgYSBudW1iZXIgOQorCiAKIC4uIF90dXQtcGFzczoKIApAQCAtNTIwLDE3ICs1NDEsMTYgQEAKIAogLi4gX3R1dC1sYW1iZGE6CiAKLUxhbWJkYSBGb3JtcwotLS0tLS0tLS0tLS0tCitMYW1iZGEgRXhwcmVzc2lvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLQogCi1CeSBwb3B1bGFyIGRlbWFuZCwgYSBmZXcgZmVhdHVyZXMgY29tbW9ubHkgZm91bmQgaW4gZnVuY3Rpb25hbCBwcm9ncmFtbWluZwotbGFuZ3VhZ2VzIGxpa2UgTGlzcCBoYXZlIGJlZW4gYWRkZWQgdG8gUHl0aG9uLiAgV2l0aCB0aGUgOmtleXdvcmQ6YGxhbWJkYWAKLWtleXdvcmQsIHNtYWxsIGFub255bW91cyBmdW5jdGlvbnMgY2FuIGJlIGNyZWF0ZWQuIEhlcmUncyBhIGZ1bmN0aW9uIHRoYXQKLXJldHVybnMgdGhlIHN1bSBvZiBpdHMgdHdvIGFyZ3VtZW50czogYGBsYW1iZGEgYSwgYjogYStiYGAuICBMYW1iZGEgZm9ybXMgY2FuIGJlCi11c2VkIHdoZXJldmVyIGZ1bmN0aW9uIG9iamVjdHMgYXJlIHJlcXVpcmVkLiAgVGhleSBhcmUgc3ludGFjdGljYWxseSByZXN0cmljdGVkCi10byBhIHNpbmdsZSBleHByZXNzaW9uLiAgU2VtYW50aWNhbGx5LCB0aGV5IGFyZSBqdXN0IHN5bnRhY3RpYyBzdWdhciBmb3IgYQotbm9ybWFsIGZ1bmN0aW9uIGRlZmluaXRpb24uICBMaWtlIG5lc3RlZCBmdW5jdGlvbiBkZWZpbml0aW9ucywgbGFtYmRhIGZvcm1zIGNhbgotcmVmZXJlbmNlIHZhcmlhYmxlcyBmcm9tIHRoZSBjb250YWluaW5nIHNjb3BlOjoKK1NtYWxsIGFub255bW91cyBmdW5jdGlvbnMgY2FuIGJlIGNyZWF0ZWQgd2l0aCB0aGUgOmtleXdvcmQ6YGxhbWJkYWAga2V5d29yZC4KK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc3VtIG9mIGl0cyB0d28gYXJndW1lbnRzOiBgYGxhbWJkYSBhLCBiOiBhK2JgYC4KK0xhbWJkYSBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgd2hlcmV2ZXIgZnVuY3Rpb24gb2JqZWN0cyBhcmUgcmVxdWlyZWQuICBUaGV5IGFyZQorc3ludGFjdGljYWxseSByZXN0cmljdGVkIHRvIGEgc2luZ2xlIGV4cHJlc3Npb24uICBTZW1hbnRpY2FsbHksIHRoZXkgYXJlIGp1c3QKK3N5bnRhY3RpYyBzdWdhciBmb3IgYSBub3JtYWwgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIExpa2UgbmVzdGVkIGZ1bmN0aW9uCitkZWZpbml0aW9ucywgbGFtYmRhIGZ1bmN0aW9ucyBjYW4gcmVmZXJlbmNlIHZhcmlhYmxlcyBmcm9tIHRoZSBjb250YWluaW5nCitzY29wZTo6CiAKICAgID4+PiBkZWYgbWFrZV9pbmNyZW1lbnRvcihuKToKICAgIC4uLiAgICAgcmV0dXJuIGxhbWJkYSB4OiB4ICsgbgpAQCAtNTQxLDYgKzU2MSwxNCBAQAogICAgPj4+IGYoMSkKICAgIDQzCiAKK1RoZSBhYm92ZSBleGFtcGxlIHVzZXMgYSBsYW1iZGEgZXhwcmVzc2lvbiB0byByZXR1cm4gYSBmdW5jdGlvbi4gIEFub3RoZXIgdXNlCitpcyB0byBwYXNzIGEgc21hbGwgZnVuY3Rpb24gYXMgYW4gYXJndW1lbnQ6OgorCisgICA+Pj4gcGFpcnMgPSBbKDEsICdvbmUnKSwgKDIsICd0d28nKSwgKDMsICd0aHJlZScpLCAoNCwgJ2ZvdXInKV0KKyAgID4+PiBwYWlycy5zb3J0KGtleT1sYW1iZGEgcGFpcjogcGFpclsxXSkKKyAgID4+PiBwYWlycworICAgWyg0LCAnZm91cicpLCAoMSwgJ29uZScpLCAoMywgJ3RocmVlJyksICgyLCAndHdvJyldCisKIAogLi4gX3R1dC1kb2NzdHJpbmdzOgogCmRpZmYgLS1naXQgYS9Eb2MvdHV0b3JpYWwvZGF0YXN0cnVjdHVyZXMucnN0IGIvRG9jL3R1dG9yaWFsL2RhdGFzdHJ1Y3R1cmVzLnJzdAppbmRleCA0ODlhMzM2Li5hY2MyY2MxIDEwMDY0NAotLS0gYS9Eb2MvdHV0b3JpYWwvZGF0YXN0cnVjdHVyZXMucnN0CisrKyBiL0RvYy90dXRvcmlhbC9kYXRhc3RydWN0dXJlcy5yc3QKQEAgLTY4LDEwICs2OCwxMSBAQAogICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgdGltZXMgKngqIGFwcGVhcnMgaW4gdGhlIGxpc3QuCiAKIAotLi4gbWV0aG9kOjogbGlzdC5zb3J0KCkKKy4uIG1ldGhvZDo6IGxpc3Quc29ydChjbXA9Tm9uZSwga2V5PU5vbmUsIHJldmVyc2U9RmFsc2UpCiAgICA6bm9pbmRleDoKIAotICAgU29ydCB0aGUgaXRlbXMgb2YgdGhlIGxpc3QsIGluIHBsYWNlLgorICAgU29ydCB0aGUgaXRlbXMgb2YgdGhlIGxpc3QgaW4gcGxhY2UgKHRoZSBhcmd1bWVudHMgY2FuIGJlIHVzZWQgZm9yIHNvcnQKKyAgIGN1c3RvbWl6YXRpb24sIHNlZSA6ZnVuYzpgc29ydGVkYCBmb3IgdGhlaXIgZXhwbGFuYXRpb24pLgogCiAKIC4uIG1ldGhvZDo6IGxpc3QucmV2ZXJzZSgpCkBAIC05OSw2ICsxMDAsMTUgQEAKICAgID4+PiBhLnNvcnQoKQogICAgPj4+IGEKICAgIFstMSwgMSwgNjYuMjUsIDMzMywgMzMzLCAxMjM0LjVdCisgICA+Pj4gYS5wb3AoKQorICAgMTIzNC41CisgICA+Pj4gYQorICAgWy0xLCAxLCA2Ni4yNSwgMzMzLCAzMzNdCisKK1lvdSBtaWdodCBoYXZlIG5vdGljZWQgdGhhdCBtZXRob2RzIGxpa2UgYGBpbnNlcnRgYCwgYGByZW1vdmVgYCBvciBgYHNvcnRgYCB0aGF0Citvbmx5IG1vZGlmeSB0aGUgbGlzdCBoYXZlIG5vIHJldHVybiB2YWx1ZSBwcmludGVkIC0tIHRoZXkgcmV0dXJuIHRoZSBkZWZhdWx0CitgYE5vbmVgYC4gWzFdXyAgVGhpcyBpcyBhIGRlc2lnbiBwcmluY2lwbGUgZm9yIGFsbCBtdXRhYmxlIGRhdGEgc3RydWN0dXJlcyBpbgorUHl0aG9uLgogCiAKIC4uIF90dXQtbGlzdHMtYXMtc3RhY2tzOgpAQCAtMTcxLDcgKzE4MSw3IEBACiB0aGUgc2VxdWVuY2UgZm9yIHdoaWNoIGBgZnVuY3Rpb24oaXRlbSlgYCBpcyB0cnVlLiBJZiAqc2VxdWVuY2UqIGlzIGEKIDpjbGFzczpgc3RyaW5nYCBvciA6Y2xhc3M6YHR1cGxlYCwgdGhlIHJlc3VsdCB3aWxsIGJlIG9mIHRoZSBzYW1lIHR5cGU7CiBvdGhlcndpc2UsIGl0IGlzIGFsd2F5cyBhIDpjbGFzczpgbGlzdGAuIEZvciBleGFtcGxlLCB0byBjb21wdXRlIGEgc2VxdWVuY2Ugb2YKLW51bWJlcnMgbm90IGRpdmlzaWJsZSBieSAyIGFuZCAzOjoKK251bWJlcnMgbm90IGRpdmlzaWJsZSBieSAyIG9yIDM6OgogCiAgICA+Pj4gZGVmIGYoeCk6IHJldHVybiB4ICUgMiAhPSAwIGFuZCB4ICUgMyAhPSAwCiAgICAuLi4KQEAgLTIyOSw4ICsyMzksNyBAQAogc3VjaCBhIGNvbW1vbiBuZWVkLCBhIGJ1aWx0LWluIGZ1bmN0aW9uIGBgc3VtKHNlcXVlbmNlKWBgIGlzIGFscmVhZHkgcHJvdmlkZWQsCiBhbmQgd29ya3MgZXhhY3RseSBsaWtlIHRoaXMuCiAKLS4uIHZlcnNpb25hZGRlZDo6IDIuMwotCisuLiBfdHV0LWxpc3Rjb21wczoKIAogTGlzdCBDb21wcmVoZW5zaW9ucwogLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDIzLDE3ICs0MzIsMzEgQEAKICAgIC4uLiB1ID0gdCwgKDEsIDIsIDMsIDQsIDUpCiAgICA+Pj4gdQogICAgKCgxMjM0NSwgNTQzMjEsICdoZWxsbyEnKSwgKDEsIDIsIDMsIDQsIDUpKQorICAgPj4+ICMgVHVwbGVzIGFyZSBpbW11dGFibGU6CisgICAuLi4gdFswXSA9IDg4ODg4CisgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+CisgICBUeXBlRXJyb3I6ICd0dXBsZScgb2JqZWN0IGRvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50CisgICA+Pj4gIyBidXQgdGhleSBjYW4gY29udGFpbiBtdXRhYmxlIG9iamVjdHM6CisgICAuLi4gdiA9IChbMSwgMiwgM10sIFszLCAyLCAxXSkKKyAgID4+PiB2CisgICAoWzEsIDIsIDNdLCBbMywgMiwgMV0pCisKIAogQXMgeW91IHNlZSwgb24gb3V0cHV0IHR1cGxlcyBhcmUgYWx3YXlzIGVuY2xvc2VkIGluIHBhcmVudGhlc2VzLCBzbyB0aGF0IG5lc3RlZAogdHVwbGVzIGFyZSBpbnRlcnByZXRlZCBjb3JyZWN0bHk7IHRoZXkgbWF5IGJlIGlucHV0IHdpdGggb3Igd2l0aG91dCBzdXJyb3VuZGluZwogcGFyZW50aGVzZXMsIGFsdGhvdWdoIG9mdGVuIHBhcmVudGhlc2VzIGFyZSBuZWNlc3NhcnkgYW55d2F5IChpZiB0aGUgdHVwbGUgaXMKLXBhcnQgb2YgYSBsYXJnZXIgZXhwcmVzc2lvbikuCitwYXJ0IG9mIGEgbGFyZ2VyIGV4cHJlc3Npb24pLiAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIGFzc2lnbiB0byB0aGUgaW5kaXZpZHVhbAoraXRlbXMgb2YgYSB0dXBsZSwgaG93ZXZlciBpdCBpcyBwb3NzaWJsZSB0byBjcmVhdGUgdHVwbGVzIHdoaWNoIGNvbnRhaW4gbXV0YWJsZQorb2JqZWN0cywgc3VjaCBhcyBsaXN0cy4KIAotVHVwbGVzIGhhdmUgbWFueSB1c2VzLiAgRm9yIGV4YW1wbGU6ICh4LCB5KSBjb29yZGluYXRlIHBhaXJzLCBlbXBsb3llZSByZWNvcmRzCi1mcm9tIGEgZGF0YWJhc2UsIGV0Yy4gIFR1cGxlcywgbGlrZSBzdHJpbmdzLCBhcmUgaW1tdXRhYmxlOiBpdCBpcyBub3QgcG9zc2libGUKLXRvIGFzc2lnbiB0byB0aGUgaW5kaXZpZHVhbCBpdGVtcyBvZiBhIHR1cGxlICh5b3UgY2FuIHNpbXVsYXRlIG11Y2ggb2YgdGhlIHNhbWUKLWVmZmVjdCB3aXRoIHNsaWNpbmcgYW5kIGNvbmNhdGVuYXRpb24sIHRob3VnaCkuICBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGNyZWF0ZQotdHVwbGVzIHdoaWNoIGNvbnRhaW4gbXV0YWJsZSBvYmplY3RzLCBzdWNoIGFzIGxpc3RzLgorVGhvdWdoIHR1cGxlcyBtYXkgc2VlbSBzaW1pbGFyIHRvIGxpc3RzLCB0aGV5IGFyZSBvZnRlbiB1c2VkIGluIGRpZmZlcmVudAorc2l0dWF0aW9ucyBhbmQgZm9yIGRpZmZlcmVudCBwdXJwb3Nlcy4KK1R1cGxlcyBhcmUgOnRlcm06YGltbXV0YWJsZWAsIGFuZCB1c3VhbGx5IGNvbnRhaW4gYW4gaGV0ZXJvZ2VuZW91cyBzZXF1ZW5jZSBvZgorZWxlbWVudHMgdGhhdCBhcmUgYWNjZXNzZWQgdmlhIHVucGFja2luZyAoc2VlIGxhdGVyIGluIHRoaXMgc2VjdGlvbikgb3IgaW5kZXhpbmcKKyhvciBldmVuIGJ5IGF0dHJpYnV0ZSBpbiB0aGUgY2FzZSBvZiA6ZnVuYzpgbmFtZWR0dXBsZXMgPGNvbGxlY3Rpb25zLm5hbWVkdHVwbGU+YCkuCitMaXN0cyBhcmUgOnRlcm06YG11dGFibGVgLCBhbmQgdGhlaXIgZWxlbWVudHMgYXJlIHVzdWFsbHkgaG9tb2dlbmVvdXMgYW5kIGFyZQorYWNjZXNzZWQgYnkgaXRlcmF0aW5nIG92ZXIgdGhlIGxpc3QuCiAKIEEgc3BlY2lhbCBwcm9ibGVtIGlzIHRoZSBjb25zdHJ1Y3Rpb24gb2YgdHVwbGVzIGNvbnRhaW5pbmcgMCBvciAxIGl0ZW1zOiB0aGUKIHN5bnRheCBoYXMgc29tZSBleHRyYSBxdWlya3MgdG8gYWNjb21tb2RhdGUgdGhlc2UuICBFbXB0eSB0dXBsZXMgYXJlIGNvbnN0cnVjdGVkCkBAIC00NjIsOCArNDg1LDYgQEAKIHNlcXVlbmNlLiAgTm90ZSB0aGF0IG11bHRpcGxlIGFzc2lnbm1lbnQgaXMgcmVhbGx5IGp1c3QgYSBjb21iaW5hdGlvbiBvZiB0dXBsZQogcGFja2luZyBhbmQgc2VxdWVuY2UgdW5wYWNraW5nLgogCi0uLiBYWFggQWRkIGEgYml0IG9uIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHVwbGVzIGFuZCBsaXN0cy4KLQogCiAuLiBfdHV0LXNldHM6CiAKQEAgLTQ3NSw2ICs0OTYsMTAgQEAKIGVsaW1pbmF0aW5nIGR1cGxpY2F0ZSBlbnRyaWVzLiAgU2V0IG9iamVjdHMgYWxzbyBzdXBwb3J0IG1hdGhlbWF0aWNhbCBvcGVyYXRpb25zCiBsaWtlIHVuaW9uLCBpbnRlcnNlY3Rpb24sIGRpZmZlcmVuY2UsIGFuZCBzeW1tZXRyaWMgZGlmZmVyZW5jZS4KIAorQ3VybHkgYnJhY2VzIG9yIHRoZSA6ZnVuYzpgc2V0YCBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgc2V0cy4gIE5vdGU6IHRvCitjcmVhdGUgYW4gZW1wdHkgc2V0IHlvdSBoYXZlIHRvIHVzZSBgYHNldCgpYGAsIG5vdCBgYHt9YGA7IHRoZSBsYXR0ZXIgY3JlYXRlcyBhbgorZW1wdHkgZGljdGlvbmFyeSwgYSBkYXRhIHN0cnVjdHVyZSB0aGF0IHdlIGRpc2N1c3MgaW4gdGhlIG5leHQgc2VjdGlvbi4KKwogSGVyZSBpcyBhIGJyaWVmIGRlbW9uc3RyYXRpb246OgogCiAgICA+Pj4gYmFza2V0ID0gWydhcHBsZScsICdvcmFuZ2UnLCAnYXBwbGUnLCAncGVhcicsICdvcmFuZ2UnLCAnYmFuYW5hJ10KQEAgLTUwMSw2ICs1MjYsMTMgQEAKICAgID4+PiBhIF4gYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbGV0dGVycyBpbiBhIG9yIGIgYnV0IG5vdCBib3RoCiAgICBzZXQoWydyJywgJ2QnLCAnYicsICdtJywgJ3onLCAnbCddKQogCitTaW1pbGFybHkgdG8gOnJlZjpgbGlzdCBjb21wcmVoZW5zaW9ucyA8dHV0LWxpc3Rjb21wcz5gLCBzZXQgY29tcHJlaGVuc2lvbnMKK2FyZSBhbHNvIHN1cHBvcnRlZDo6CisKKyAgID4+PiBhID0ge3ggZm9yIHggaW4gJ2FicmFjYWRhYnJhJyBpZiB4IG5vdCBpbiAnYWJjJ30KKyAgID4+PiBhCisgICBzZXQoWydyJywgJ2QnXSkKKwogCiAuLiBfdHV0LWRpY3Rpb25hcmllczoKIApAQCAtNTUyLDE4ICs1ODQsMTcgQEAKICAgID4+PiAnZ3VpZG8nIGluIHRlbAogICAgVHJ1ZQogCi1UaGUgOmZ1bmM6YGRpY3RgIGNvbnN0cnVjdG9yIGJ1aWxkcyBkaWN0aW9uYXJpZXMgZGlyZWN0bHkgZnJvbSBsaXN0cyBvZgota2V5LXZhbHVlIHBhaXJzIHN0b3JlZCBhcyB0dXBsZXMuICBXaGVuIHRoZSBwYWlycyBmb3JtIGEgcGF0dGVybiwgbGlzdAotY29tcHJlaGVuc2lvbnMgY2FuIGNvbXBhY3RseSBzcGVjaWZ5IHRoZSBrZXktdmFsdWUgbGlzdC4gOjoKK1RoZSA6ZnVuYzpgZGljdGAgY29uc3RydWN0b3IgYnVpbGRzIGRpY3Rpb25hcmllcyBkaXJlY3RseSBmcm9tIHNlcXVlbmNlcyBvZgora2V5LXZhbHVlIHBhaXJzOjoKIAogICAgPj4+IGRpY3QoWygnc2FwZScsIDQxMzkpLCAoJ2d1aWRvJywgNDEyNyksICgnamFjaycsIDQwOTgpXSkKICAgIHsnc2FwZSc6IDQxMzksICdqYWNrJzogNDA5OCwgJ2d1aWRvJzogNDEyN30KLSAgID4+PiBkaWN0KFsoeCwgeCoqMikgZm9yIHggaW4gKDIsIDQsIDYpXSkgICAgICMgdXNlIGEgbGlzdCBjb21wcmVoZW5zaW9uCi0gICB7MjogNCwgNDogMTYsIDY6IDM2fQogCi1MYXRlciBpbiB0aGUgdHV0b3JpYWwsIHdlIHdpbGwgbGVhcm4gYWJvdXQgR2VuZXJhdG9yIEV4cHJlc3Npb25zIHdoaWNoIGFyZSBldmVuCi1iZXR0ZXIgc3VpdGVkIGZvciB0aGUgdGFzayBvZiBzdXBwbHlpbmcga2V5LXZhbHVlcyBwYWlycyB0byB0aGUgOmZ1bmM6YGRpY3RgCi1jb25zdHJ1Y3Rvci4KK0luIGFkZGl0aW9uLCBkaWN0IGNvbXByZWhlbnNpb25zIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBkaWN0aW9uYXJpZXMgZnJvbQorYXJiaXRyYXJ5IGtleSBhbmQgdmFsdWUgZXhwcmVzc2lvbnM6OgorCisgICA+Pj4ge3g6IHgqKjIgZm9yIHggaW4gKDIsIDQsIDYpfQorICAgezI6IDQsIDQ6IDE2LCA2OiAzNn0KIAogV2hlbiB0aGUga2V5cyBhcmUgc2ltcGxlIHN0cmluZ3MsIGl0IGlzIHNvbWV0aW1lcyBlYXNpZXIgdG8gc3BlY2lmeSBwYWlycyB1c2luZwoga2V5d29yZCBhcmd1bWVudHM6OgpAQCAtNTc3LDE2ICs2MDgsNiBAQAogTG9vcGluZyBUZWNobmlxdWVzCiA9PT09PT09PT09PT09PT09PT0KIAotV2hlbiBsb29waW5nIHRocm91Z2ggZGljdGlvbmFyaWVzLCB0aGUga2V5IGFuZCBjb3JyZXNwb25kaW5nIHZhbHVlIGNhbiBiZQotcmV0cmlldmVkIGF0IHRoZSBzYW1lIHRpbWUgdXNpbmcgdGhlIDptZXRoOmBpdGVyaXRlbXNgIG1ldGhvZC4gOjoKLQotICAgPj4+IGtuaWdodHMgPSB7J2dhbGxhaGFkJzogJ3RoZSBwdXJlJywgJ3JvYmluJzogJ3RoZSBicmF2ZSd9Ci0gICA+Pj4gZm9yIGssIHYgaW4ga25pZ2h0cy5pdGVyaXRlbXMoKToKLSAgIC4uLiAgICAgcHJpbnQgaywgdgotICAgLi4uCi0gICBnYWxsYWhhZCB0aGUgcHVyZQotICAgcm9iaW4gdGhlIGJyYXZlCi0KIFdoZW4gbG9vcGluZyB0aHJvdWdoIGEgc2VxdWVuY2UsIHRoZSBwb3NpdGlvbiBpbmRleCBhbmQgY29ycmVzcG9uZGluZyB2YWx1ZSBjYW4KIGJlIHJldHJpZXZlZCBhdCB0aGUgc2FtZSB0aW1lIHVzaW5nIHRoZSA6ZnVuYzpgZW51bWVyYXRlYCBmdW5jdGlvbi4gOjoKIApAQCAtNjMzLDYgKzY1NCwyOSBAQAogICAgb3JhbmdlCiAgICBwZWFyCiAKK1doZW4gbG9vcGluZyB0aHJvdWdoIGRpY3Rpb25hcmllcywgdGhlIGtleSBhbmQgY29ycmVzcG9uZGluZyB2YWx1ZSBjYW4gYmUKK3JldHJpZXZlZCBhdCB0aGUgc2FtZSB0aW1lIHVzaW5nIHRoZSA6bWV0aDpgaXRlcml0ZW1zYCBtZXRob2QuIDo6CisKKyAgID4+PiBrbmlnaHRzID0geydnYWxsYWhhZCc6ICd0aGUgcHVyZScsICdyb2Jpbic6ICd0aGUgYnJhdmUnfQorICAgPj4+IGZvciBrLCB2IGluIGtuaWdodHMuaXRlcml0ZW1zKCk6CisgICAuLi4gICAgIHByaW50IGssIHYKKyAgIC4uLgorICAgZ2FsbGFoYWQgdGhlIHB1cmUKKyAgIHJvYmluIHRoZSBicmF2ZQorCitUbyBjaGFuZ2UgYSBzZXF1ZW5jZSB5b3UgYXJlIGl0ZXJhdGluZyBvdmVyIHdoaWxlIGluc2lkZSB0aGUgbG9vcCAoZm9yCitleGFtcGxlIHRvIGR1cGxpY2F0ZSBjZXJ0YWluIGl0ZW1zKSwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgZmlyc3QgbWFrZQorYSBjb3B5LiAgTG9vcGluZyBvdmVyIGEgc2VxdWVuY2UgZG9lcyBub3QgaW1wbGljaXRseSBtYWtlIGEgY29weS4gIFRoZSBzbGljZQorbm90YXRpb24gbWFrZXMgdGhpcyBlc3BlY2lhbGx5IGNvbnZlbmllbnQ6OgorCisgICA+Pj4gd29yZHMgPSBbJ2NhdCcsICd3aW5kb3cnLCAnZGVmZW5lc3RyYXRlJ10KKyAgID4+PiBmb3IgdyBpbiB3b3Jkc1s6XTogICMgTG9vcCBvdmVyIGEgc2xpY2UgY29weSBvZiB0aGUgZW50aXJlIGxpc3QuCisgICAuLi4gICAgIGlmIGxlbih3KSA+IDY6CisgICAuLi4gICAgICAgICB3b3Jkcy5pbnNlcnQoMCwgdykKKyAgIC4uLgorICAgPj4+IHdvcmRzCisgICBbJ2RlZmVuZXN0cmF0ZScsICdjYXQnLCAnd2luZG93JywgJ2RlZmVuZXN0cmF0ZSddCisKIAogLi4gX3R1dC1jb25kaXRpb25zOgogCmRpZmYgLS1naXQgYS9Eb2MvdHV0b3JpYWwvZXJyb3JzLnJzdCBiL0RvYy90dXRvcmlhbC9lcnJvcnMucnN0CmluZGV4IDEzNTE5NTcuLjZmNzdkZWYgMTAwNjQ0Ci0tLSBhL0RvYy90dXRvcmlhbC9lcnJvcnMucnN0CisrKyBiL0RvYy90dXRvcmlhbC9lcnJvcnMucnN0CkBAIC0xMjAsNiArMTIwLDE0IEBACiAgICAuLi4gZXhjZXB0IChSdW50aW1lRXJyb3IsIFR5cGVFcnJvciwgTmFtZUVycm9yKToKICAgIC4uLiAgICAgcGFzcwogCitOb3RlIHRoYXQgdGhlIHBhcmVudGhlc2VzIGFyb3VuZCB0aGlzIHR1cGxlIGFyZSByZXF1aXJlZCwgYmVjYXVzZQorYGBleGNlcHQgVmFsdWVFcnJvciwgZTpgYCB3YXMgdGhlIHN5bnRheCB1c2VkIGZvciB3aGF0IGlzIG5vcm1hbGx5Cit3cml0dGVuIGFzIGBgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZTpgYCBpbiBtb2Rlcm4gUHl0aG9uIChkZXNjcmliZWQKK2JlbG93KS4gVGhlIG9sZCBzeW50YXggaXMgc3RpbGwgc3VwcG9ydGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KK1RoaXMgbWVhbnMgYGBleGNlcHQgUnVudGltZUVycm9yLCBUeXBlRXJyb3JgYCBpcyBub3QgZXF1aXZhbGVudCB0bworYGBleGNlcHQgKFJ1bnRpbWVFcnJvciwgVHlwZUVycm9yKTpgYCBidXQgdG8gYGBleGNlcHQgUnVudGltZUVycm9yIGFzCitUeXBlRXJyb3I6YGAgd2hpY2ggaXMgbm90IHdoYXQgeW91IHdhbnQuCisKIFRoZSBsYXN0IGV4Y2VwdCBjbGF1c2UgbWF5IG9taXQgdGhlIGV4Y2VwdGlvbiBuYW1lKHMpLCB0byBzZXJ2ZSBhcyBhIHdpbGRjYXJkLgogVXNlIHRoaXMgd2l0aCBleHRyZW1lIGNhdXRpb24sIHNpbmNlIGl0IGlzIGVhc3kgdG8gbWFzayBhIHJlYWwgcHJvZ3JhbW1pbmcgZXJyb3IKIGluIHRoaXMgd2F5ISAgSXQgY2FuIGFsc28gYmUgdXNlZCB0byBwcmludCBhbiBlcnJvciBtZXNzYWdlIGFuZCB0aGVuIHJlLXJhaXNlCkBAIC0xMzEsOCArMTM5LDggQEAKICAgICAgICBmID0gb3BlbignbXlmaWxlLnR4dCcpCiAgICAgICAgcyA9IGYucmVhZGxpbmUoKQogICAgICAgIGkgPSBpbnQocy5zdHJpcCgpKQotICAgZXhjZXB0IElPRXJyb3IgYXMgKGVycm5vLCBzdHJlcnJvcik6Ci0gICAgICAgcHJpbnQgIkkvTyBlcnJvcih7MH0pOiB7MX0iLmZvcm1hdChlcnJubywgc3RyZXJyb3IpCisgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgIHByaW50ICJJL08gZXJyb3IoezB9KTogezF9Ii5mb3JtYXQoZS5lcnJubywgZS5zdHJlcnJvcikKICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgIHByaW50ICJDb3VsZCBub3QgY29udmVydCBkYXRhIHRvIGFuIGludGVnZXIuIgogICAgZXhjZXB0OgpAQCAtMTc2LDggKzE4NCw4IEBACiAgICAuLi4gZXhjZXB0IEV4Y2VwdGlvbiBhcyBpbnN0OgogICAgLi4uICAgIHByaW50IHR5cGUoaW5zdCkgICAgICMgdGhlIGV4Y2VwdGlvbiBpbnN0YW5jZQogICAgLi4uICAgIHByaW50IGluc3QuYXJncyAgICAgICMgYXJndW1lbnRzIHN0b3JlZCBpbiAuYXJncwotICAgLi4uICAgIHByaW50IGluc3QgICAgICAgICAgICMgX19zdHJfXyBhbGxvd3MgYXJncyB0byBwcmludGVkIGRpcmVjdGx5Ci0gICAuLi4gICAgeCwgeSA9IGluc3QgICAgICAgICAgIyBfX2dldGl0ZW1fXyBhbGxvd3MgYXJncyB0byBiZSB1bnBhY2tlZCBkaXJlY3RseQorICAgLi4uICAgIHByaW50IGluc3QgICAgICAgICAgICMgX19zdHJfXyBhbGxvd3MgYXJncyB0byBiZSBwcmludGVkIGRpcmVjdGx5CisgICAuLi4gICAgeCwgeSA9IGluc3QuYXJncwogICAgLi4uICAgIHByaW50ICd4ID0nLCB4CiAgICAuLi4gICAgcHJpbnQgJ3kgPScsIHkKICAgIC4uLgpAQCAtMzg5LDcgKzM5Nyw3IEBACiBhbmQgcHJpbnQgaXRzIGNvbnRlbnRzIHRvIHRoZSBzY3JlZW4uIDo6CiAKICAgIGZvciBsaW5lIGluIG9wZW4oIm15ZmlsZS50eHQiKToKLSAgICAgICBwcmludCBsaW5lCisgICAgICAgcHJpbnQgbGluZSwKIAogVGhlIHByb2JsZW0gd2l0aCB0aGlzIGNvZGUgaXMgdGhhdCBpdCBsZWF2ZXMgdGhlIGZpbGUgb3BlbiBmb3IgYW4gaW5kZXRlcm1pbmF0ZQogYW1vdW50IG9mIHRpbWUgYWZ0ZXIgdGhlIGNvZGUgaGFzIGZpbmlzaGVkIGV4ZWN1dGluZy4gVGhpcyBpcyBub3QgYW4gaXNzdWUgaW4KQEAgLTM5OSw3ICs0MDcsNyBAQAogCiAgICB3aXRoIG9wZW4oIm15ZmlsZS50eHQiKSBhcyBmOgogICAgICAgIGZvciBsaW5lIGluIGY6Ci0gICAgICAgICAgIHByaW50IGxpbmUKKyAgICAgICAgICAgcHJpbnQgbGluZSwKIAogQWZ0ZXIgdGhlIHN0YXRlbWVudCBpcyBleGVjdXRlZCwgdGhlIGZpbGUgKmYqIGlzIGFsd2F5cyBjbG9zZWQsIGV2ZW4gaWYgYQogcHJvYmxlbSB3YXMgZW5jb3VudGVyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgbGluZXMuIE90aGVyIG9iamVjdHMgd2hpY2ggcHJvdmlkZQpkaWZmIC0tZ2l0IGEvRG9jL3R1dG9yaWFsL2luZGV4LnJzdCBiL0RvYy90dXRvcmlhbC9pbmRleC5yc3QKaW5kZXggN2QwYmZjMi4uNjA0Y2ZmOCAxMDA2NDQKLS0tIGEvRG9jL3R1dG9yaWFsL2luZGV4LnJzdAorKysgYi9Eb2MvdHV0b3JpYWwvaW5kZXgucnN0CkBAIC00LDkgKzQsNiBAQAogICBUaGUgUHl0aG9uIFR1dG9yaWFsCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLTpSZWxlYXNlOiB8dmVyc2lvbnwKLTpEYXRlOiB8dG9kYXl8Ci0KIFB5dGhvbiBpcyBhbiBlYXN5IHRvIGxlYXJuLCBwb3dlcmZ1bCBwcm9ncmFtbWluZyBsYW5ndWFnZS4gSXQgaGFzIGVmZmljaWVudAogaGlnaC1sZXZlbCBkYXRhIHN0cnVjdHVyZXMgYW5kIGEgc2ltcGxlIGJ1dCBlZmZlY3RpdmUgYXBwcm9hY2ggdG8KIG9iamVjdC1vcmllbnRlZCBwcm9ncmFtbWluZy4gUHl0aG9uJ3MgZWxlZ2FudCBzeW50YXggYW5kIGR5bmFtaWMgdHlwaW5nLApkaWZmIC0tZ2l0IGEvRG9jL3R1dG9yaWFsL2lucHV0b3V0cHV0LnJzdCBiL0RvYy90dXRvcmlhbC9pbnB1dG91dHB1dC5yc3QKaW5kZXggMzQ0MWY1NC4uNmZkYzVmMCAxMDA2NDQKLS0tIGEvRG9jL3R1dG9yaWFsL2lucHV0b3V0cHV0LnJzdAorKysgYi9Eb2MvdHV0b3JpYWwvaW5wdXRvdXRwdXQucnN0CkBAIC0zNyw3ICszNyw3IEBACiBUaGUgOmZ1bmM6YHN0cmAgZnVuY3Rpb24gaXMgbWVhbnQgdG8gcmV0dXJuIHJlcHJlc2VudGF0aW9ucyBvZiB2YWx1ZXMgd2hpY2ggYXJlCiBmYWlybHkgaHVtYW4tcmVhZGFibGUsIHdoaWxlIDpmdW5jOmByZXByYCBpcyBtZWFudCB0byBnZW5lcmF0ZSByZXByZXNlbnRhdGlvbnMKIHdoaWNoIGNhbiBiZSByZWFkIGJ5IHRoZSBpbnRlcnByZXRlciAob3Igd2lsbCBmb3JjZSBhIDpleGM6YFN5bnRheEVycm9yYCBpZgotdGhlcmUgaXMgbm90IGVxdWl2YWxlbnQgc3ludGF4KS4gIEZvciBvYmplY3RzIHdoaWNoIGRvbid0IGhhdmUgYSBwYXJ0aWN1bGFyCit0aGVyZSBpcyBubyBlcXVpdmFsZW50IHN5bnRheCkuICBGb3Igb2JqZWN0cyB3aGljaCBkb24ndCBoYXZlIGEgcGFydGljdWxhcgogcmVwcmVzZW50YXRpb24gZm9yIGh1bWFuIGNvbnN1bXB0aW9uLCA6ZnVuYzpgc3RyYCB3aWxsIHJldHVybiB0aGUgc2FtZSB2YWx1ZSBhcwogOmZ1bmM6YHJlcHJgLiAgTWFueSB2YWx1ZXMsIHN1Y2ggYXMgbnVtYmVycyBvciBzdHJ1Y3R1cmVzIGxpa2UgbGlzdHMgYW5kCiBkaWN0aW9uYXJpZXMsIGhhdmUgdGhlIHNhbWUgcmVwcmVzZW50YXRpb24gdXNpbmcgZWl0aGVyIGZ1bmN0aW9uLiAgU3RyaW5ncyBhbmQKQEAgLTIwNyw3ICsyMDcsNyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoZSBgYCVgYCBvcGVyYXRvciBjYW4gYWxzbyBiZSB1c2VkIGZvciBzdHJpbmcgZm9ybWF0dGluZy4gSXQgaW50ZXJwcmV0cyB0aGUKLWxlZnQgYXJndW1lbnQgbXVjaCBsaWtlIGEgOmNmdW5jOmBzcHJpbnRmYFwgLXN0eWxlIGZvcm1hdCBzdHJpbmcgdG8gYmUgYXBwbGllZAorbGVmdCBhcmd1bWVudCBtdWNoIGxpa2UgYSA6YzpmdW5jOmBzcHJpbnRmYFwgLXN0eWxlIGZvcm1hdCBzdHJpbmcgdG8gYmUgYXBwbGllZAogdG8gdGhlIHJpZ2h0IGFyZ3VtZW50LCBhbmQgcmV0dXJucyB0aGUgc3RyaW5nIHJlc3VsdGluZyBmcm9tIHRoaXMgZm9ybWF0dGluZwogb3BlcmF0aW9uLiBGb3IgZXhhbXBsZTo6CiAKQEAgLTIxNSwxMCArMjE1LDYgQEAKICAgID4+PiBwcmludCAnVGhlIHZhbHVlIG9mIFBJIGlzIGFwcHJveGltYXRlbHkgJTUuM2YuJyAlIG1hdGgucGkKICAgIFRoZSB2YWx1ZSBvZiBQSSBpcyBhcHByb3hpbWF0ZWx5IDMuMTQyLgogCi1TaW5jZSA6bWV0aDpgc3RyLmZvcm1hdGAgaXMgcXVpdGUgbmV3LCBhIGxvdCBvZiBQeXRob24gY29kZSBzdGlsbCB1c2VzIHRoZSBgYCVgYAotb3BlcmF0b3IuIEhvd2V2ZXIsIGJlY2F1c2UgdGhpcyBvbGQgc3R5bGUgb2YgZm9ybWF0dGluZyB3aWxsIGV2ZW50dWFsbHkgYmUKLXJlbW92ZWQgZnJvbSB0aGUgbGFuZ3VhZ2UsIDptZXRoOmBzdHIuZm9ybWF0YCBzaG91bGQgZ2VuZXJhbGx5IGJlIHVzZWQuCi0KIE1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIHRoZSA6cmVmOmBzdHJpbmctZm9ybWF0dGluZ2Agc2VjdGlvbi4KIAogCkBAIC0yMzYsOSArMjMyLDkgQEAKIAogOjoKIAotICAgPj4+IGYgPSBvcGVuKCcvdG1wL3dvcmtmaWxlJywgJ3cnKQorICAgPj4+IGYgPSBvcGVuKCd3b3JrZmlsZScsICd3JykKICAgID4+PiBwcmludCBmCi0gICA8b3BlbiBmaWxlICcvdG1wL3dvcmtmaWxlJywgbW9kZSAndycgYXQgODBhMDk2MD4KKyAgIDxvcGVuIGZpbGUgJ3dvcmtmaWxlJywgbW9kZSAndycgYXQgODBhMDk2MD4KIAogVGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGZpbGVuYW1lLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcwogYW5vdGhlciBzdHJpbmcgY29udGFpbmluZyBhIGZldyBjaGFyYWN0ZXJzIGRlc2NyaWJpbmcgdGhlIHdheSBpbiB3aGljaCB0aGUgZmlsZQpAQCAtMjk1LDE4ICsyOTEsOCBAQAogICAgPj4+IGYucmVhZGxpbmUoKQogICAgJycKIAotYGBmLnJlYWRsaW5lcygpYGAgcmV0dXJucyBhIGxpc3QgY29udGFpbmluZyBhbGwgdGhlIGxpbmVzIG9mIGRhdGEgaW4gdGhlIGZpbGUuCi1JZiBnaXZlbiBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgKnNpemVoaW50KiwgaXQgcmVhZHMgdGhhdCBtYW55IGJ5dGVzIGZyb20gdGhlCi1maWxlIGFuZCBlbm91Z2ggbW9yZSB0byBjb21wbGV0ZSBhIGxpbmUsIGFuZCByZXR1cm5zIHRoZSBsaW5lcyBmcm9tIHRoYXQuICBUaGlzCi1pcyBvZnRlbiB1c2VkIHRvIGFsbG93IGVmZmljaWVudCByZWFkaW5nIG9mIGEgbGFyZ2UgZmlsZSBieSBsaW5lcywgYnV0IHdpdGhvdXQKLWhhdmluZyB0byBsb2FkIHRoZSBlbnRpcmUgZmlsZSBpbiBtZW1vcnkuICBPbmx5IGNvbXBsZXRlIGxpbmVzIHdpbGwgYmUgcmV0dXJuZWQuCi06OgotCi0gICA+Pj4gZi5yZWFkbGluZXMoKQotICAgWydUaGlzIGlzIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBmaWxlLlxuJywgJ1NlY29uZCBsaW5lIG9mIHRoZSBmaWxlXG4nXQotCi1BbiBhbHRlcm5hdGl2ZSBhcHByb2FjaCB0byByZWFkaW5nIGxpbmVzIGlzIHRvIGxvb3Agb3ZlciB0aGUgZmlsZSBvYmplY3QuIFRoaXMgaXMKLW1lbW9yeSBlZmZpY2llbnQsIGZhc3QsIGFuZCBsZWFkcyB0byBzaW1wbGVyIGNvZGU6OgorRm9yIHJlYWRpbmcgbGluZXMgZnJvbSBhIGZpbGUsIHlvdSBjYW4gbG9vcCBvdmVyIHRoZSBmaWxlIG9iamVjdC4gVGhpcyBpcyBtZW1vcnkKK2VmZmljaWVudCwgZmFzdCwgYW5kIGxlYWRzIHRvIHNpbXBsZSBjb2RlOjoKIAogICAgPj4+IGZvciBsaW5lIGluIGY6CiAgICAgICAgICAgIHByaW50IGxpbmUsCkBAIC0zMTQsOSArMzAwLDggQEAKICAgIFRoaXMgaXMgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGZpbGUuCiAgICBTZWNvbmQgbGluZSBvZiB0aGUgZmlsZQogCi1UaGUgYWx0ZXJuYXRpdmUgYXBwcm9hY2ggaXMgc2ltcGxlciBidXQgZG9lcyBub3QgcHJvdmlkZSBhcyBmaW5lLWdyYWluZWQKLWNvbnRyb2wuICBTaW5jZSB0aGUgdHdvIGFwcHJvYWNoZXMgbWFuYWdlIGxpbmUgYnVmZmVyaW5nIGRpZmZlcmVudGx5LCB0aGV5Ci1zaG91bGQgbm90IGJlIG1peGVkLgorSWYgeW91IHdhbnQgdG8gcmVhZCBhbGwgdGhlIGxpbmVzIG9mIGEgZmlsZSBpbiBhIGxpc3QgeW91IGNhbiBhbHNvIHVzZQorYGBsaXN0KGYpYGAgb3IgYGBmLnJlYWRsaW5lcygpYGAuCiAKIGBgZi53cml0ZShzdHJpbmcpYGAgd3JpdGVzIHRoZSBjb250ZW50cyBvZiAqc3RyaW5nKiB0byB0aGUgZmlsZSwgcmV0dXJuaW5nCiBgYE5vbmVgYC4gICA6OgpAQCAtMzM5LDcgKzMyNCw3IEBACiB0aGUgcmVmZXJlbmNlIHBvaW50LiAgKmZyb21fd2hhdCogY2FuIGJlIG9taXR0ZWQgYW5kIGRlZmF1bHRzIHRvIDAsIHVzaW5nIHRoZQogYmVnaW5uaW5nIG9mIHRoZSBmaWxlIGFzIHRoZSByZWZlcmVuY2UgcG9pbnQuIDo6CiAKLSAgID4+PiBmID0gb3BlbignL3RtcC93b3JrZmlsZScsICdyKycpCisgICA+Pj4gZiA9IG9wZW4oJ3dvcmtmaWxlJywgJ3IrJykKICAgID4+PiBmLndyaXRlKCcwMTIzNDU2Nzg5YWJjZGVmJykKICAgID4+PiBmLnNlZWsoNSkgICAgICMgR28gdG8gdGhlIDZ0aCBieXRlIGluIHRoZSBmaWxlCiAgICA+Pj4gZi5yZWFkKDEpCkBAIC0zNjMsNyArMzQ4LDcgQEAKIHN1aXRlIGZpbmlzaGVzLCBldmVuIGlmIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQgb24gdGhlIHdheS4gIEl0IGlzIGFsc28gbXVjaAogc2hvcnRlciB0aGFuIHdyaXRpbmcgZXF1aXZhbGVudCA6a2V5d29yZDpgdHJ5YFwgLVwgOmtleXdvcmQ6YGZpbmFsbHlgIGJsb2Nrczo6CiAKLSAgICA+Pj4gd2l0aCBvcGVuKCcvdG1wL3dvcmtmaWxlJywgJ3InKSBhcyBmOgorICAgID4+PiB3aXRoIG9wZW4oJ3dvcmtmaWxlJywgJ3InKSBhcyBmOgogICAgIC4uLiAgICAgcmVhZF9kYXRhID0gZi5yZWFkKCkKICAgICA+Pj4gZi5jbG9zZWQKICAgICBUcnVlCkBAIC0zNzMsNDcgKzM1OCw2NCBAQAogUmVmZXJlbmNlIGZvciBhIGNvbXBsZXRlIGd1aWRlIHRvIGZpbGUgb2JqZWN0cy4KIAogCi0uLiBfdHV0LXBpY2tsZToKKy4uIF90dXQtanNvbjoKIAotVGhlIDptb2Q6YHBpY2tsZWAgTW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NhdmluZyBzdHJ1Y3R1cmVkIGRhdGEgd2l0aCA6bW9kOmBqc29uYAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS4uIGluZGV4OjogbW9kdWxlOiBwaWNrbGUKKy4uIGluZGV4OjogbW9kdWxlOiBqc29uCiAKLVN0cmluZ3MgY2FuIGVhc2lseSBiZSB3cml0dGVuIHRvIGFuZCByZWFkIGZyb20gYSBmaWxlLiBOdW1iZXJzIHRha2UgYSBiaXQgbW9yZQorU3RyaW5ncyBjYW4gZWFzaWx5IGJlIHdyaXR0ZW4gdG8gYW5kIHJlYWQgZnJvbSBhIGZpbGUuICBOdW1iZXJzIHRha2UgYSBiaXQgbW9yZQogZWZmb3J0LCBzaW5jZSB0aGUgOm1ldGg6YHJlYWRgIG1ldGhvZCBvbmx5IHJldHVybnMgc3RyaW5ncywgd2hpY2ggd2lsbCBoYXZlIHRvCiBiZSBwYXNzZWQgdG8gYSBmdW5jdGlvbiBsaWtlIDpmdW5jOmBpbnRgLCB3aGljaCB0YWtlcyBhIHN0cmluZyBsaWtlIGBgJzEyMydgYAotYW5kIHJldHVybnMgaXRzIG51bWVyaWMgdmFsdWUgMTIzLiAgSG93ZXZlciwgd2hlbiB5b3Ugd2FudCB0byBzYXZlIG1vcmUgY29tcGxleAotZGF0YSB0eXBlcyBsaWtlIGxpc3RzLCBkaWN0aW9uYXJpZXMsIG9yIGNsYXNzIGluc3RhbmNlcywgdGhpbmdzIGdldCBhIGxvdCBtb3JlCi1jb21wbGljYXRlZC4KK2FuZCByZXR1cm5zIGl0cyBudW1lcmljIHZhbHVlIDEyMy4gIFdoZW4geW91IHdhbnQgdG8gc2F2ZSBtb3JlIGNvbXBsZXggZGF0YQordHlwZXMgbGlrZSBuZXN0ZWQgbGlzdHMgYW5kIGRpY3Rpb25hcmllcywgcGFyc2luZyBhbmQgc2VyaWFsaXppbmcgYnkgaGFuZAorYmVjb21lcyBjb21wbGljYXRlZC4KIAotUmF0aGVyIHRoYW4gaGF2ZSB1c2VycyBiZSBjb25zdGFudGx5IHdyaXRpbmcgYW5kIGRlYnVnZ2luZyBjb2RlIHRvIHNhdmUKLWNvbXBsaWNhdGVkIGRhdGEgdHlwZXMsIFB5dGhvbiBwcm92aWRlcyBhIHN0YW5kYXJkIG1vZHVsZSBjYWxsZWQgOm1vZDpgcGlja2xlYC4KLVRoaXMgaXMgYW4gYW1hemluZyBtb2R1bGUgdGhhdCBjYW4gdGFrZSBhbG1vc3QgYW55IFB5dGhvbiBvYmplY3QgKGV2ZW4gc29tZQotZm9ybXMgb2YgUHl0aG9uIGNvZGUhKSwgYW5kIGNvbnZlcnQgaXQgdG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb247IHRoaXMgcHJvY2VzcwotaXMgY2FsbGVkIDpkZm46YHBpY2tsaW5nYC4gIFJlY29uc3RydWN0aW5nIHRoZSBvYmplY3QgZnJvbSB0aGUgc3RyaW5nCi1yZXByZXNlbnRhdGlvbiBpcyBjYWxsZWQgOmRmbjpgdW5waWNrbGluZ2AuICBCZXR3ZWVuIHBpY2tsaW5nIGFuZCB1bnBpY2tsaW5nLAotdGhlIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG9iamVjdCBtYXkgaGF2ZSBiZWVuIHN0b3JlZCBpbiBhIGZpbGUgb3IgZGF0YSwgb3IKK1JhdGhlciB0aGFuIGhhdmluZyB1c2VycyBjb25zdGFudGx5IHdyaXRpbmcgYW5kIGRlYnVnZ2luZyBjb2RlIHRvIHNhdmUKK2NvbXBsaWNhdGVkIGRhdGEgdHlwZXMgdG8gZmlsZXMsIFB5dGhvbiBhbGxvd3MgeW91IHRvIHVzZSB0aGUgcG9wdWxhciBkYXRhCitpbnRlcmNoYW5nZSBmb3JtYXQgY2FsbGVkIGBKU09OIChKYXZhU2NyaXB0IE9iamVjdCBOb3RhdGlvbikKKzxodHRwOi8vanNvbi5vcmc+YF8uICBUaGUgc3RhbmRhcmQgbW9kdWxlIGNhbGxlZCA6bW9kOmBqc29uYCBjYW4gdGFrZSBQeXRob24KK2RhdGEgaGllcmFyY2hpZXMsIGFuZCBjb252ZXJ0IHRoZW0gdG8gc3RyaW5nIHJlcHJlc2VudGF0aW9uczsgdGhpcyBwcm9jZXNzIGlzCitjYWxsZWQgOmRmbjpgc2VyaWFsaXppbmdgLiAgUmVjb25zdHJ1Y3RpbmcgdGhlIGRhdGEgZnJvbSB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uCitpcyBjYWxsZWQgOmRmbjpgZGVzZXJpYWxpemluZ2AuICBCZXR3ZWVuIHNlcmlhbGl6aW5nIGFuZCBkZXNlcmlhbGl6aW5nLCB0aGUKK3N0cmluZyByZXByZXNlbnRpbmcgdGhlIG9iamVjdCBtYXkgaGF2ZSBiZWVuIHN0b3JlZCBpbiBhIGZpbGUgb3IgZGF0YSwgb3IKIHNlbnQgb3ZlciBhIG5ldHdvcmsgY29ubmVjdGlvbiB0byBzb21lIGRpc3RhbnQgbWFjaGluZS4KIAotSWYgeW91IGhhdmUgYW4gb2JqZWN0IGBgeGBgLCBhbmQgYSBmaWxlIG9iamVjdCBgYGZgYCB0aGF0J3MgYmVlbiBvcGVuZWQgZm9yCi13cml0aW5nLCB0aGUgc2ltcGxlc3Qgd2F5IHRvIHBpY2tsZSB0aGUgb2JqZWN0IHRha2VzIG9ubHkgb25lIGxpbmUgb2YgY29kZTo6CisuLiBub3RlOjoKKyAgIFRoZSBKU09OIGZvcm1hdCBpcyBjb21tb25seSB1c2VkIGJ5IG1vZGVybiBhcHBsaWNhdGlvbnMgdG8gYWxsb3cgZm9yIGRhdGEKKyAgIGV4Y2hhbmdlLiAgTWFueSBwcm9ncmFtbWVycyBhcmUgYWxyZWFkeSBmYW1pbGlhciB3aXRoIGl0LCB3aGljaCBtYWtlcworICAgaXQgYSBnb29kIGNob2ljZSBmb3IgaW50ZXJvcGVyYWJpbGl0eS4KIAotICAgcGlja2xlLmR1bXAoeCwgZikKK0lmIHlvdSBoYXZlIGFuIG9iamVjdCBgYHhgYCwgeW91IGNhbiB2aWV3IGl0cyBKU09OIHN0cmluZyByZXByZXNlbnRhdGlvbiB3aXRoIGEKK3NpbXBsZSBsaW5lIG9mIGNvZGU6OgogCi1UbyB1bnBpY2tsZSB0aGUgb2JqZWN0IGFnYWluLCBpZiBgYGZgYCBpcyBhIGZpbGUgb2JqZWN0IHdoaWNoIGhhcyBiZWVuIG9wZW5lZAotZm9yIHJlYWRpbmc6OgorICAgPj4+IGpzb24uZHVtcHMoWzEsICdzaW1wbGUnLCAnbGlzdCddKQorICAgJ1sxLCAic2ltcGxlIiwgImxpc3QiXScKIAotICAgeCA9IHBpY2tsZS5sb2FkKGYpCitBbm90aGVyIHZhcmlhbnQgb2YgdGhlIDpmdW5jOmB+anNvbi5kdW1wc2AgZnVuY3Rpb24sIGNhbGxlZCA6ZnVuYzpgfmpzb24uZHVtcGAsCitzaW1wbHkgc2VyaWFsaXplcyB0aGUgb2JqZWN0IHRvIGEgZmlsZS4gIFNvIGlmIGBgZmBgIGlzIGEgOnRlcm06YGZpbGUgb2JqZWN0YAorb3BlbmVkIGZvciB3cml0aW5nLCB3ZSBjYW4gZG8gdGhpczo6CiAKLShUaGVyZSBhcmUgb3RoZXIgdmFyaWFudHMgb2YgdGhpcywgdXNlZCB3aGVuIHBpY2tsaW5nIG1hbnkgb2JqZWN0cyBvciB3aGVuIHlvdQotZG9uJ3Qgd2FudCB0byB3cml0ZSB0aGUgcGlja2xlZCBkYXRhIHRvIGEgZmlsZTsgY29uc3VsdCB0aGUgY29tcGxldGUKLWRvY3VtZW50YXRpb24gZm9yIDptb2Q6YHBpY2tsZWAgaW4gdGhlIFB5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZS4pCisgICBqc29uLmR1bXAoeCwgZikKIAotOm1vZDpgcGlja2xlYCBpcyB0aGUgc3RhbmRhcmQgd2F5IHRvIG1ha2UgUHl0aG9uIG9iamVjdHMgd2hpY2ggY2FuIGJlIHN0b3JlZCBhbmQKLXJldXNlZCBieSBvdGhlciBwcm9ncmFtcyBvciBieSBhIGZ1dHVyZSBpbnZvY2F0aW9uIG9mIHRoZSBzYW1lIHByb2dyYW07IHRoZQotdGVjaG5pY2FsIHRlcm0gZm9yIHRoaXMgaXMgYSA6ZGZuOmBwZXJzaXN0ZW50YCBvYmplY3QuICBCZWNhdXNlIDptb2Q6YHBpY2tsZWAgaXMKLXNvIHdpZGVseSB1c2VkLCBtYW55IGF1dGhvcnMgd2hvIHdyaXRlIFB5dGhvbiBleHRlbnNpb25zIHRha2UgY2FyZSB0byBlbnN1cmUKLXRoYXQgbmV3IGRhdGEgdHlwZXMgc3VjaCBhcyBtYXRyaWNlcyBjYW4gYmUgcHJvcGVybHkgcGlja2xlZCBhbmQgdW5waWNrbGVkLgorVG8gZGVjb2RlIHRoZSBvYmplY3QgYWdhaW4sIGlmIGBgZmBgIGlzIGEgOnRlcm06YGZpbGUgb2JqZWN0YCB3aGljaCBoYXMKK2JlZW4gb3BlbmVkIGZvciByZWFkaW5nOjoKIAorICAgeCA9IGpzb24ubG9hZChmKQorCitUaGlzIHNpbXBsZSBzZXJpYWxpemF0aW9uIHRlY2huaXF1ZSBjYW4gaGFuZGxlIGxpc3RzIGFuZCBkaWN0aW9uYXJpZXMsIGJ1dAorc2VyaWFsaXppbmcgYXJiaXRyYXJ5IGNsYXNzIGluc3RhbmNlcyBpbiBKU09OIHJlcXVpcmVzIGEgYml0IG9mIGV4dHJhIGVmZm9ydC4KK1RoZSByZWZlcmVuY2UgZm9yIHRoZSA6bW9kOmBqc29uYCBtb2R1bGUgY29udGFpbnMgYW4gZXhwbGFuYXRpb24gb2YgdGhpcy4KKworLi4gc2VlYWxzbzo6CisKKyAgIDptb2Q6YHBpY2tsZWAgLSB0aGUgcGlja2xlIG1vZHVsZQorCisgICBDb250cmFyeSB0byA6cmVmOmBKU09OIDx0dXQtanNvbj5gLCAqcGlja2xlKiBpcyBhIHByb3RvY29sIHdoaWNoIGFsbG93cworICAgdGhlIHNlcmlhbGl6YXRpb24gb2YgYXJiaXRyYXJpbHkgY29tcGxleCBQeXRob24gb2JqZWN0cy4gIEFzIHN1Y2gsIGl0IGlzCisgICBzcGVjaWZpYyB0byBQeXRob24gYW5kIGNhbm5vdCBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggYXBwbGljYXRpb25zCisgICB3cml0dGVuIGluIG90aGVyIGxhbmd1YWdlcy4gIEl0IGlzIGFsc28gaW5zZWN1cmUgYnkgZGVmYXVsdDoKKyAgIGRlc2VyaWFsaXppbmcgcGlja2xlIGRhdGEgY29taW5nIGZyb20gYW4gdW50cnVzdGVkIHNvdXJjZSBjYW4gZXhlY3V0ZQorICAgYXJiaXRyYXJ5IGNvZGUsIGlmIHRoZSBkYXRhIHdhcyBjcmFmdGVkIGJ5IGEgc2tpbGxlZCBhdHRhY2tlci4KIApkaWZmIC0tZ2l0IGEvRG9jL3R1dG9yaWFsL2ludGVycHJldGVyLnJzdCBiL0RvYy90dXRvcmlhbC9pbnRlcnByZXRlci5yc3QKaW5kZXggNmJkYzFjNS4uNTE0MGI0MyAxMDA2NDQKLS0tIGEvRG9jL3R1dG9yaWFsL2ludGVycHJldGVyLnJzdAorKysgYi9Eb2MvdHV0b3JpYWwvaW50ZXJwcmV0ZXIucnN0CkBAIC0xODUsOCArMTg1LDggQEAKIAogRm9yIGV4YW1wbGUsIHRvIHdyaXRlIFVuaWNvZGUgbGl0ZXJhbHMgaW5jbHVkaW5nIHRoZSBFdXJvIGN1cnJlbmN5IHN5bWJvbCwgdGhlCiBJU08tODg1OS0xNSBlbmNvZGluZyBjYW4gYmUgdXNlZCwgd2l0aCB0aGUgRXVybyBzeW1ib2wgaGF2aW5nIHRoZSBvcmRpbmFsIHZhbHVlCi0xNjQuICBUaGlzIHNjcmlwdCB3aWxsIHByaW50IHRoZSB2YWx1ZSA4MzY0ICh0aGUgVW5pY29kZSBjb2RlcG9pbnQgY29ycmVzcG9uZGluZwotdG8gdGhlIEV1cm8gc3ltYm9sKSBhbmQgdGhlbiBleGl0OjoKKzE2NC4gIFRoaXMgc2NyaXB0LCB3aGVuIHNhdmVkIGluIHRoZSBJU08tODg1OS0xNSBlbmNvZGluZywgd2lsbCBwcmludCB0aGUgdmFsdWUKKzgzNjQgKHRoZSBVbmljb2RlIGNvZGVwb2ludCBjb3JyZXNwb25kaW5nIHRvIHRoZSBFdXJvIHN5bWJvbCkgYW5kIHRoZW4gZXhpdDo6CiAKICAgICMgLSotIGNvZGluZzogaXNvLTg4NTktMTUgLSotCiAKQEAgLTI1Miw3ICsyNTIsNyBAQAogCiAgICA+Pj4gaW1wb3J0IHNpdGUKICAgID4+PiBzaXRlLmdldHVzZXJzaXRlcGFja2FnZXMoKQotICAgJy9ob21lL3VzZXIvLmxvY2FsL2xpYi9weXRob24zLjIvc2l0ZS1wYWNrYWdlcycKKyAgICcvaG9tZS91c2VyLy5sb2NhbC9saWIvcHl0aG9uMi43L3NpdGUtcGFja2FnZXMnCiAKIE5vdyB5b3UgY2FuIGNyZWF0ZSBhIGZpbGUgbmFtZWQgOmZpbGU6YHVzZXJjdXN0b21pemUucHlgIGluIHRoYXQgZGlyZWN0b3J5IGFuZAogcHV0IGFueXRoaW5nIHlvdSB3YW50IGluIGl0LiAgSXQgd2lsbCBhZmZlY3QgZXZlcnkgaW52b2NhdGlvbiBvZiBQeXRob24sIHVubGVzcwpkaWZmIC0tZ2l0IGEvRG9jL3R1dG9yaWFsL2ludHJvZHVjdGlvbi5yc3QgYi9Eb2MvdHV0b3JpYWwvaW50cm9kdWN0aW9uLnJzdAppbmRleCAwNGUyNzk4Li5kMzBiMTk0IDEwMDY0NAotLS0gYS9Eb2MvdHV0b3JpYWwvaW50cm9kdWN0aW9uLnJzdAorKysgYi9Eb2MvdHV0b3JpYWwvaW50cm9kdWN0aW9uLnJzdApAQCAtNSw3ICs1LDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlcywgaW5wdXQgYW5kIG91dHB1dCBhcmUgZGlzdGluZ3Vpc2hlZCBieSB0aGUgcHJlc2VuY2Ugb3IKLWFic2VuY2Ugb2YgcHJvbXB0cyAoYGA+Pj5gYCBhbmQgYGAuLi5gYCk6IHRvIHJlcGVhdCB0aGUgZXhhbXBsZSwgeW91IG11c3QgdHlwZQorYWJzZW5jZSBvZiBwcm9tcHRzICg6dGVybTpgPj4+YCBhbmQgOnRlcm06YC4uLmApOiB0byByZXBlYXQgdGhlIGV4YW1wbGUsIHlvdSBtdXN0IHR5cGUKIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIHByb21wdCwgd2hlbiB0aGUgcHJvbXB0IGFwcGVhcnM7IGxpbmVzIHRoYXQgZG8gbm90IGJlZ2luCiB3aXRoIGEgcHJvbXB0IGFyZSBvdXRwdXQgZnJvbSB0aGUgaW50ZXJwcmV0ZXIuIE5vdGUgdGhhdCBhIHNlY29uZGFyeSBwcm9tcHQgb24gYQogbGluZSBieSBpdHNlbGYgaW4gYW4gZXhhbXBsZSBtZWFucyB5b3UgbXVzdCB0eXBlIGEgYmxhbmsgbGluZTsgdGhpcyBpcyB1c2VkIHRvCkBAIC0yMiw5ICsyMiw5IEBACiBTb21lIGV4YW1wbGVzOjoKIAogICAgIyB0aGlzIGlzIHRoZSBmaXJzdCBjb21tZW50Ci0gICBTUEFNID0gMSAgICAgICAgICAgICAgICAgIyBhbmQgdGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIC4uLiBhbmQgbm93IGEgdGhpcmQhCi0gICBTVFJJTkcgPSAiIyBUaGlzIGlzIG5vdCBhIGNvbW1lbnQuIgorICAgc3BhbSA9IDEgICMgYW5kIHRoaXMgaXMgdGhlIHNlY29uZCBjb21tZW50CisgICAgICAgICAgICAgIyAuLi4gYW5kIG5vdyBhIHRoaXJkIQorICAgdGV4dCA9ICIjIFRoaXMgaXMgbm90IGEgY29tbWVudCBiZWNhdXNlIGl0J3MgaW5zaWRlIHF1b3Rlcy4iCiAKIAogLi4gX3R1dC1jYWxjdWxhdG9yOgpAQCAtNDQsNDYgKzQ0LDU5IEBACiBUaGUgaW50ZXJwcmV0ZXIgYWN0cyBhcyBhIHNpbXBsZSBjYWxjdWxhdG9yOiB5b3UgY2FuIHR5cGUgYW4gZXhwcmVzc2lvbiBhdCBpdAogYW5kIGl0IHdpbGwgd3JpdGUgdGhlIHZhbHVlLiAgRXhwcmVzc2lvbiBzeW50YXggaXMgc3RyYWlnaHRmb3J3YXJkOiB0aGUKIG9wZXJhdG9ycyBgYCtgYCwgYGAtYGAsIGBgKmBgIGFuZCBgYC9gYCB3b3JrIGp1c3QgbGlrZSBpbiBtb3N0IG90aGVyIGxhbmd1YWdlcwotKGZvciBleGFtcGxlLCBQYXNjYWwgb3IgQyk7IHBhcmVudGhlc2VzIGNhbiBiZSB1c2VkIGZvciBncm91cGluZy4gIEZvciBleGFtcGxlOjoKKyhmb3IgZXhhbXBsZSwgUGFzY2FsIG9yIEMpOyBwYXJlbnRoZXNlcyAoYGAoKWBgKSBjYW4gYmUgdXNlZCBmb3IgZ3JvdXBpbmcuCitGb3IgZXhhbXBsZTo6CiAKLSAgID4+PiAyKzIKKyAgID4+PiAyICsgMgogICAgNAotICAgPj4+ICMgVGhpcyBpcyBhIGNvbW1lbnQKLSAgIC4uLiAyKzIKLSAgIDQKLSAgID4+PiAyKzIgICMgYW5kIGEgY29tbWVudCBvbiB0aGUgc2FtZSBsaW5lIGFzIGNvZGUKLSAgIDQKLSAgID4+PiAoNTAtNSo2KS80CisgICA+Pj4gNTAgLSA1KjYKKyAgIDIwCisgICA+Pj4gKDUwIC0gNS4wKjYpIC8gNAorICAgNS4wCisgICA+Pj4gOCAvIDUuMAorICAgMS42CisKK1RoZSBpbnRlZ2VyIG51bWJlcnMgKGUuZy4gYGAyYGAsIGBgNGBgLCBgYDIwYGApIGhhdmUgdHlwZSA6Y2xhc3M6YGludGAsCit0aGUgb25lcyB3aXRoIGEgZnJhY3Rpb25hbCBwYXJ0IChlLmcuIGBgNS4wYGAsIGBgMS42YGApIGhhdmUgdHlwZQorOmNsYXNzOmBmbG9hdGAuICBXZSB3aWxsIHNlZSBtb3JlIGFib3V0IG51bWVyaWMgdHlwZXMgbGF0ZXIgaW4gdGhlIHR1dG9yaWFsLgorCitUaGUgcmV0dXJuIHR5cGUgb2YgYSBkaXZpc2lvbiAoYGAvYGApIG9wZXJhdGlvbiBkZXBlbmRzIG9uIGl0cyBvcGVyYW5kcy4gIElmCitib3RoIG9wZXJhbmRzIGFyZSBvZiB0eXBlIDpjbGFzczpgaW50YCwgOnRlcm06YGZsb29yIGRpdmlzaW9uYCBpcyBwZXJmb3JtZWQKK2FuZCBhbiA6Y2xhc3M6YGludGAgaXMgcmV0dXJuZWQuICBJZiBlaXRoZXIgb3BlcmFuZCBpcyBhIDpjbGFzczpgZmxvYXRgLAorY2xhc3NpYyBkaXZpc2lvbiBpcyBwZXJmb3JtZWQgYW5kIGEgOmNsYXNzOmBmbG9hdGAgaXMgcmV0dXJuZWQuICBUaGUgYGAvL2BgCitvcGVyYXRvciBpcyBhbHNvIHByb3ZpZGVkIGZvciBkb2luZyBmbG9vciBkaXZpc2lvbiBubyBtYXR0ZXIgd2hhdCB0aGUKK29wZXJhbmRzIGFyZS4gIFRoZSByZW1haW5kZXIgY2FuIGJlIGNhbGN1bGF0ZWQgd2l0aCB0aGUgYGAlYGAgb3BlcmF0b3I6OgorCisgICA+Pj4gMTcgLyAzICAjIGludCAvIGludCAtPiBpbnQKICAgIDUKLSAgID4+PiAjIEludGVnZXIgZGl2aXNpb24gcmV0dXJucyB0aGUgZmxvb3I6Ci0gICAuLi4gNy8zCisgICA+Pj4gMTcgLyAzLjAgICMgaW50IC8gZmxvYXQgLT4gZmxvYXQKKyAgIDUuNjY2NjY2NjY2NjY2NjY3CisgICA+Pj4gMTcgLy8gMy4wICAjIGV4cGxpY2l0IGZsb29yIGRpdmlzaW9uIGRpc2NhcmRzIHRoZSBmcmFjdGlvbmFsIHBhcnQKKyAgIDUuMAorICAgPj4+IDE3ICUgMyAgIyB0aGUgJSBvcGVyYXRvciByZXR1cm5zIHRoZSByZW1haW5kZXIgb2YgdGhlIGRpdmlzaW9uCiAgICAyCi0gICA+Pj4gNy8tMwotICAgLTMKKyAgID4+PiA1ICogMyArIDIgICMgcmVzdWx0ICogZGl2aXNvciArIHJlbWFpbmRlcgorICAgMTcKIAotVGhlIGVxdWFsIHNpZ24gKGBgJz0nYGApIGlzIHVzZWQgdG8gYXNzaWduIGEgdmFsdWUgdG8gYSB2YXJpYWJsZS4gQWZ0ZXJ3YXJkcywgbm8KK1dpdGggUHl0aG9uLCBpdCBpcyBwb3NzaWJsZSB0byB1c2UgdGhlIGBgKipgYCBvcGVyYXRvciB0byBjYWxjdWxhdGUgcG93ZXJzIFsjXV86OgorCisgICA+Pj4gNSAqKiAyICAjIDUgc3F1YXJlZAorICAgMjUKKyAgID4+PiAyICoqIDcgICMgMiB0byB0aGUgcG93ZXIgb2YgNworICAgMTI4CisKK1RoZSBlcXVhbCBzaWduIChgYD1gYCkgaXMgdXNlZCB0byBhc3NpZ24gYSB2YWx1ZSB0byBhIHZhcmlhYmxlLiBBZnRlcndhcmRzLCBubwogcmVzdWx0IGlzIGRpc3BsYXllZCBiZWZvcmUgdGhlIG5leHQgaW50ZXJhY3RpdmUgcHJvbXB0OjoKIAogICAgPj4+IHdpZHRoID0gMjAKLSAgID4+PiBoZWlnaHQgPSA1KjkKKyAgID4+PiBoZWlnaHQgPSA1ICogOQogICAgPj4+IHdpZHRoICogaGVpZ2h0CiAgICA5MDAKIAotQSB2YWx1ZSBjYW4gYmUgYXNzaWduZWQgdG8gc2V2ZXJhbCB2YXJpYWJsZXMgc2ltdWx0YW5lb3VzbHk6OgorSWYgYSB2YXJpYWJsZSBpcyBub3QgImRlZmluZWQiIChhc3NpZ25lZCBhIHZhbHVlKSwgdHJ5aW5nIHRvIHVzZSBpdCB3aWxsCitnaXZlIHlvdSBhbiBlcnJvcjo6CiAKLSAgID4+PiB4ID0geSA9IHogPSAwICAjIFplcm8geCwgeSBhbmQgegotICAgPj4+IHgKLSAgIDAKLSAgID4+PiB5Ci0gICAwCi0gICA+Pj4gegotICAgMAotCi1WYXJpYWJsZXMgbXVzdCBiZSAiZGVmaW5lZCIgKGFzc2lnbmVkIGEgdmFsdWUpIGJlZm9yZSB0aGV5IGNhbiBiZSB1c2VkLCBvciBhbgotZXJyb3Igd2lsbCBvY2N1cjo6Ci0KLSAgID4+PiAjIHRyeSB0byBhY2Nlc3MgYW4gdW5kZWZpbmVkIHZhcmlhYmxlCi0gICAuLi4gbgorICAgPj4+IG4gICMgdHJ5IHRvIGFjY2VzcyBhbiB1bmRlZmluZWQgdmFyaWFibGUKICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT4KICAgIE5hbWVFcnJvcjogbmFtZSAnbicgaXMgbm90IGRlZmluZWQKQEAgLTk2LDQ5ICsxMDksNiBAQAogICAgPj4+IDcuMCAvIDIKICAgIDMuNQogCi1Db21wbGV4IG51bWJlcnMgYXJlIGFsc28gc3VwcG9ydGVkOyBpbWFnaW5hcnkgbnVtYmVycyBhcmUgd3JpdHRlbiB3aXRoIGEgc3VmZml4Ci1vZiBgYGpgYCBvciBgYEpgYC4gIENvbXBsZXggbnVtYmVycyB3aXRoIGEgbm9uemVybyByZWFsIGNvbXBvbmVudCBhcmUgd3JpdHRlbiBhcwotYGAocmVhbCtpbWFnailgYCwgb3IgY2FuIGJlIGNyZWF0ZWQgd2l0aCB0aGUgYGBjb21wbGV4KHJlYWwsIGltYWcpYGAgZnVuY3Rpb24uCi06OgotCi0gICA+Pj4gMWogKiAxSgotICAgKC0xKzBqKQotICAgPj4+IDFqICogY29tcGxleCgwLDEpCi0gICAoLTErMGopCi0gICA+Pj4gMysxaiozCi0gICAoMyszaikKLSAgID4+PiAoMysxaikqMwotICAgKDkrM2opCi0gICA+Pj4gKDErMmopLygxKzFqKQotICAgKDEuNSswLjVqKQotCi1Db21wbGV4IG51bWJlcnMgYXJlIGFsd2F5cyByZXByZXNlbnRlZCBhcyB0d28gZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgdGhlIHJlYWwKLWFuZCBpbWFnaW5hcnkgcGFydC4gIFRvIGV4dHJhY3QgdGhlc2UgcGFydHMgZnJvbSBhIGNvbXBsZXggbnVtYmVyICp6KiwgdXNlCi1gYHoucmVhbGBgIGFuZCBgYHouaW1hZ2BgLiAgIDo6Ci0KLSAgID4+PiBhPTEuNSswLjVqCi0gICA+Pj4gYS5yZWFsCi0gICAxLjUKLSAgID4+PiBhLmltYWcKLSAgIDAuNQotCi1UaGUgY29udmVyc2lvbiBmdW5jdGlvbnMgdG8gZmxvYXRpbmcgcG9pbnQgYW5kIGludGVnZXIgKDpmdW5jOmBmbG9hdGAsCi06ZnVuYzpgaW50YCBhbmQgOmZ1bmM6YGxvbmdgKSBkb24ndCB3b3JrIGZvciBjb21wbGV4IG51bWJlcnMgLS0tIHRoZXJlIGlzIG5vIG9uZQotY29ycmVjdCB3YXkgdG8gY29udmVydCBhIGNvbXBsZXggbnVtYmVyIHRvIGEgcmVhbCBudW1iZXIuICBVc2UgYGBhYnMoeilgYCB0byBnZXQKLWl0cyBtYWduaXR1ZGUgKGFzIGEgZmxvYXQpIG9yIGBgei5yZWFsYGAgdG8gZ2V0IGl0cyByZWFsIHBhcnQuIDo6Ci0KLSAgID4+PiBhPTMuMCs0LjBqCi0gICA+Pj4gZmxvYXQoYSkKLSAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwotICAgVHlwZUVycm9yOiBjYW4ndCBjb252ZXJ0IGNvbXBsZXggdG8gZmxvYXQ7IHVzZSBhYnMoeikKLSAgID4+PiBhLnJlYWwKLSAgIDMuMAotICAgPj4+IGEuaW1hZwotICAgNC4wCi0gICA+Pj4gYWJzKGEpICAjIHNxcnQoYS5yZWFsKioyICsgYS5pbWFnKioyKQotICAgNS4wCi0KIEluIGludGVyYWN0aXZlIG1vZGUsIHRoZSBsYXN0IHByaW50ZWQgZXhwcmVzc2lvbiBpcyBhc3NpZ25lZCB0byB0aGUgdmFyaWFibGUKIGBgX2BgLiAgVGhpcyBtZWFucyB0aGF0IHdoZW4geW91IGFyZSB1c2luZyBQeXRob24gYXMgYSBkZXNrIGNhbGN1bGF0b3IsIGl0IGlzCiBzb21ld2hhdCBlYXNpZXIgdG8gY29udGludWUgY2FsY3VsYXRpb25zLCBmb3IgZXhhbXBsZTo6CkBAIC0xNTYsMjAgKzEyNiwyOCBAQAogYXNzaWduIGEgdmFsdWUgdG8gaXQgLS0tIHlvdSB3b3VsZCBjcmVhdGUgYW4gaW5kZXBlbmRlbnQgbG9jYWwgdmFyaWFibGUgd2l0aCB0aGUKIHNhbWUgbmFtZSBtYXNraW5nIHRoZSBidWlsdC1pbiB2YXJpYWJsZSB3aXRoIGl0cyBtYWdpYyBiZWhhdmlvci4KIAorSW4gYWRkaXRpb24gdG8gOmNsYXNzOmBpbnRgIGFuZCA6Y2xhc3M6YGZsb2F0YCwgUHl0aG9uIHN1cHBvcnRzIG90aGVyIHR5cGVzIG9mCitudW1iZXJzLCBzdWNoIGFzIDpjbGFzczpgfmRlY2ltYWwuRGVjaW1hbGAgYW5kIDpjbGFzczpgfmZyYWN0aW9ucy5GcmFjdGlvbmAuCitQeXRob24gYWxzbyBoYXMgYnVpbHQtaW4gc3VwcG9ydCBmb3IgOnJlZjpgY29tcGxleCBudW1iZXJzIDx0eXBlc251bWVyaWM+YCwKK2FuZCB1c2VzIHRoZSBgYGpgYCBvciBgYEpgYCBzdWZmaXggdG8gaW5kaWNhdGUgdGhlIGltYWdpbmFyeSBwYXJ0CisoZS5nLiBgYDMrNWpgYCkuCisKIAogLi4gX3R1dC1zdHJpbmdzOgogCiBTdHJpbmdzCiAtLS0tLS0tCiAKLUJlc2lkZXMgbnVtYmVycywgUHl0aG9uIGNhbiBhbHNvIG1hbmlwdWxhdGUgc3RyaW5ncywgd2hpY2ggY2FuIGJlIGV4cHJlc3NlZCBpbgotc2V2ZXJhbCB3YXlzLiAgVGhleSBjYW4gYmUgZW5jbG9zZWQgaW4gc2luZ2xlIHF1b3RlcyBvciBkb3VibGUgcXVvdGVzOjoKK0Jlc2lkZXMgbnVtYmVycywgUHl0aG9uIGNhbiBhbHNvIG1hbmlwdWxhdGUgc3RyaW5ncywgd2hpY2ggY2FuIGJlIGV4cHJlc3NlZAoraW4gc2V2ZXJhbCB3YXlzLiAgVGhleSBjYW4gYmUgZW5jbG9zZWQgaW4gc2luZ2xlIHF1b3RlcyAoYGAnLi4uJ2BgKSBvcgorZG91YmxlIHF1b3RlcyAoYGAiLi4uImBgKSB3aXRoIHRoZSBzYW1lIHJlc3VsdCBbI11fLiAgYGBcYGAgY2FuIGJlIHVzZWQKK3RvIGVzY2FwZSBxdW90ZXM6OgogCi0gICA+Pj4gJ3NwYW0gZWdncycKKyAgID4+PiAnc3BhbSBlZ2dzJyAgIyBzaW5nbGUgcXVvdGVzCiAgICAnc3BhbSBlZ2dzJwotICAgPj4+ICdkb2VzblwndCcKKyAgID4+PiAnZG9lc25cJ3QnICAjIHVzZSBcJyB0byBlc2NhcGUgdGhlIHNpbmdsZSBxdW90ZS4uLgogICAgImRvZXNuJ3QiCi0gICA+Pj4gImRvZXNuJ3QiCisgICA+Pj4gImRvZXNuJ3QiICAjIC4uLm9yIHVzZSBkb3VibGUgcXVvdGVzIGluc3RlYWQKICAgICJkb2Vzbid0IgogICAgPj4+ICciWWVzLCIgaGUgc2FpZC4nCiAgICAnIlllcywiIGhlIHNhaWQuJwpAQCAtMTc4LDQ1ICsxNTYsNDggQEAKICAgID4+PiAnIklzblwndCwiIHNoZSBzYWlkLicKICAgICciSXNuXCd0LCIgc2hlIHNhaWQuJwogCi1UaGUgaW50ZXJwcmV0ZXIgcHJpbnRzIHRoZSByZXN1bHQgb2Ygc3RyaW5nIG9wZXJhdGlvbnMgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZXkKLWFyZSB0eXBlZCBmb3IgaW5wdXQ6IGluc2lkZSBxdW90ZXMsIGFuZCB3aXRoIHF1b3RlcyBhbmQgb3RoZXIgZnVubnkgY2hhcmFjdGVycwotZXNjYXBlZCBieSBiYWNrc2xhc2hlcywgdG8gc2hvdyB0aGUgcHJlY2lzZSB2YWx1ZS4gIFRoZSBzdHJpbmcgaXMgZW5jbG9zZWQgaW4KLWRvdWJsZSBxdW90ZXMgaWYgdGhlIHN0cmluZyBjb250YWlucyBhIHNpbmdsZSBxdW90ZSBhbmQgbm8gZG91YmxlIHF1b3RlcywgZWxzZQotaXQncyBlbmNsb3NlZCBpbiBzaW5nbGUgcXVvdGVzLiAgVGhlIDprZXl3b3JkOmBwcmludGAgc3RhdGVtZW50IHByb2R1Y2VzIGEgbW9yZQotcmVhZGFibGUgb3V0cHV0IGZvciBzdWNoIGlucHV0IHN0cmluZ3MuCitJbiB0aGUgaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIsIHRoZSBvdXRwdXQgc3RyaW5nIGlzIGVuY2xvc2VkIGluIHF1b3RlcyBhbmQKK3NwZWNpYWwgY2hhcmFjdGVycyBhcmUgZXNjYXBlZCB3aXRoIGJhY2tzbGFzaGVzLiAgV2hpbGUgdGhpcyBtaWdodCBzb21ldGltZXMKK2xvb2sgZGlmZmVyZW50IGZyb20gdGhlIGlucHV0ICh0aGUgZW5jbG9zaW5nIHF1b3RlcyBjb3VsZCBjaGFuZ2UpLCB0aGUgdHdvCitzdHJpbmdzIGFyZSBlcXVpdmFsZW50LiAgVGhlIHN0cmluZyBpcyBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzIGlmCit0aGUgc3RyaW5nIGNvbnRhaW5zIGEgc2luZ2xlIHF1b3RlIGFuZCBubyBkb3VibGUgcXVvdGVzLCBvdGhlcndpc2UgaXQgaXMKK2VuY2xvc2VkIGluIHNpbmdsZSBxdW90ZXMuICBUaGUgOmtleXdvcmQ6YHByaW50YCBzdGF0ZW1lbnQgcHJvZHVjZXMgYSBtb3JlCityZWFkYWJsZSBvdXRwdXQsIGJ5IG9taXR0aW5nIHRoZSBlbmNsb3NpbmcgcXVvdGVzIGFuZCBieSBwcmludGluZyBlc2NhcGVkCithbmQgc3BlY2lhbCBjaGFyYWN0ZXJzOjoKIAotU3RyaW5nIGxpdGVyYWxzIGNhbiBzcGFuIG11bHRpcGxlIGxpbmVzIGluIHNldmVyYWwgd2F5cy4gIENvbnRpbnVhdGlvbiBsaW5lcyBjYW4KLWJlIHVzZWQsIHdpdGggYSBiYWNrc2xhc2ggYXMgdGhlIGxhc3QgY2hhcmFjdGVyIG9uIHRoZSBsaW5lIGluZGljYXRpbmcgdGhhdCB0aGUKLW5leHQgbGluZSBpcyBhIGxvZ2ljYWwgY29udGludWF0aW9uIG9mIHRoZSBsaW5lOjoKKyAgID4+PiAnIklzblwndCwiIHNoZSBzYWlkLicKKyAgICciSXNuXCd0LCIgc2hlIHNhaWQuJworICAgPj4+IHByaW50ICciSXNuXCd0LCIgc2hlIHNhaWQuJworICAgIklzbid0LCIgc2hlIHNhaWQuCisgICA+Pj4gcyA9ICdGaXJzdCBsaW5lLlxuU2Vjb25kIGxpbmUuJyAgIyBcbiBtZWFucyBuZXdsaW5lCisgICA+Pj4gcyAgIyB3aXRob3V0IHByaW50KCksIFxuIGlzIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQKKyAgICdGaXJzdCBsaW5lLlxuU2Vjb25kIGxpbmUuJworICAgPj4+IHByaW50IHMgICMgd2l0aCBwcmludCwgXG4gcHJvZHVjZXMgYSBuZXcgbGluZQorICAgRmlyc3QgbGluZS4KKyAgIFNlY29uZCBsaW5lLgogCi0gICBoZWxsbyA9ICJUaGlzIGlzIGEgcmF0aGVyIGxvbmcgc3RyaW5nIGNvbnRhaW5pbmdcblwKLSAgIHNldmVyYWwgbGluZXMgb2YgdGV4dCBqdXN0IGFzIHlvdSB3b3VsZCBkbyBpbiBDLlxuXAotICAgICAgIE5vdGUgdGhhdCB3aGl0ZXNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgaXNcCi0gICAgc2lnbmlmaWNhbnQuIgorSWYgeW91IGRvbid0IHdhbnQgY2hhcmFjdGVycyBwcmVmYWNlZCBieSBgYFxgYCB0byBiZSBpbnRlcnByZXRlZCBhcworc3BlY2lhbCBjaGFyYWN0ZXJzLCB5b3UgY2FuIHVzZSAqcmF3IHN0cmluZ3MqIGJ5IGFkZGluZyBhbiBgYHJgYCBiZWZvcmUKK3RoZSBmaXJzdCBxdW90ZTo6CiAKLSAgIHByaW50IGhlbGxvCisgICA+Pj4gcHJpbnQgJ0M6XHNvbWVcbmFtZScgICMgaGVyZSBcbiBtZWFucyBuZXdsaW5lIQorICAgQzpcc29tZQorICAgYW1lCisgICA+Pj4gcHJpbnQgcidDOlxzb21lXG5hbWUnICAjIG5vdGUgdGhlIHIgYmVmb3JlIHRoZSBxdW90ZQorICAgQzpcc29tZVxuYW1lCiAKLU5vdGUgdGhhdCBuZXdsaW5lcyBzdGlsbCBuZWVkIHRvIGJlIGVtYmVkZGVkIGluIHRoZSBzdHJpbmcgdXNpbmcgYGBcbmBgIC0tIHRoZQotbmV3bGluZSBmb2xsb3dpbmcgdGhlIHRyYWlsaW5nIGJhY2tzbGFzaCBpcyBkaXNjYXJkZWQuICBUaGlzIGV4YW1wbGUgd291bGQgcHJpbnQKLXRoZSBmb2xsb3dpbmc6CitTdHJpbmcgbGl0ZXJhbHMgY2FuIHNwYW4gbXVsdGlwbGUgbGluZXMuICBPbmUgd2F5IGlzIHVzaW5nIHRyaXBsZS1xdW90ZXM6CitgYCIiIi4uLiIiImBgIG9yIGBgJycnLi4uJycnYGAuICBFbmQgb2YgbGluZXMgYXJlIGF1dG9tYXRpY2FsbHkKK2luY2x1ZGVkIGluIHRoZSBzdHJpbmcsIGJ1dCBpdCdzIHBvc3NpYmxlIHRvIHByZXZlbnQgdGhpcyBieSBhZGRpbmcgYSBgYFxgYCBhdAordGhlIGVuZCBvZiB0aGUgbGluZS4gIFRoZSBmb2xsb3dpbmcgZXhhbXBsZTo6CiAKLS4uIGNvZGUtYmxvY2s6OiB0ZXh0Ci0KLSAgIFRoaXMgaXMgYSByYXRoZXIgbG9uZyBzdHJpbmcgY29udGFpbmluZwotICAgc2V2ZXJhbCBsaW5lcyBvZiB0ZXh0IGp1c3QgYXMgeW91IHdvdWxkIGRvIGluIEMuCi0gICAgICAgTm90ZSB0aGF0IHdoaXRlc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSBpcyBzaWduaWZpY2FudC4KLQotT3IsIHN0cmluZ3MgY2FuIGJlIHN1cnJvdW5kZWQgaW4gYSBwYWlyIG9mIG1hdGNoaW5nIHRyaXBsZS1xdW90ZXM6IGBgIiIiYGAgb3IKLWBgJycnYGAuICBFbmQgb2YgbGluZXMgZG8gbm90IG5lZWQgdG8gYmUgZXNjYXBlZCB3aGVuIHVzaW5nIHRyaXBsZS1xdW90ZXMsIGJ1dAotdGhleSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBzdHJpbmcuIDo6Ci0KLSAgIHByaW50ICIiIgorICAgcHJpbnQgIiIiXAogICAgVXNhZ2U6IHRoaW5neSBbT1BUSU9OU10KICAgICAgICAgLWggICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgdXNhZ2UgbWVzc2FnZQogICAgICAgICAtSCBob3N0bmFtZSAgICAgICAgICAgICAgIEhvc3RuYW1lIHRvIGNvbm5lY3QgdG8KICAgICIiIgogCi1wcm9kdWNlcyB0aGUgZm9sbG93aW5nIG91dHB1dDoKK3Byb2R1Y2VzIHRoZSBmb2xsb3dpbmcgb3V0cHV0IChub3RlIHRoYXQgdGhlIGluaXRpYWwgbmV3bGluZSBpcyBub3QgaW5jbHVkZWQpOgogCiAuLiBjb2RlLWJsb2NrOjogdGV4dAogCkBAIC0yMjQsMTQyICsyMDUsMTAwIEBACiAgICAgICAgIC1oICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIHVzYWdlIG1lc3NhZ2UKICAgICAgICAgLUggaG9zdG5hbWUgICAgICAgICAgICAgICBIb3N0bmFtZSB0byBjb25uZWN0IHRvCiAKLUlmIHdlIG1ha2UgdGhlIHN0cmluZyBsaXRlcmFsIGEgInJhdyIgc3RyaW5nLCBgYFxuYGAgc2VxdWVuY2VzIGFyZSBub3QgY29udmVydGVkCi10byBuZXdsaW5lcywgYnV0IHRoZSBiYWNrc2xhc2ggYXQgdGhlIGVuZCBvZiB0aGUgbGluZSwgYW5kIHRoZSBuZXdsaW5lIGNoYXJhY3RlcgotaW4gdGhlIHNvdXJjZSwgYXJlIGJvdGggaW5jbHVkZWQgaW4gdGhlIHN0cmluZyBhcyBkYXRhLiAgVGh1cywgdGhlIGV4YW1wbGU6OgotCi0gICBoZWxsbyA9IHIiVGhpcyBpcyBhIHJhdGhlciBsb25nIHN0cmluZyBjb250YWluaW5nXG5cCi0gICBzZXZlcmFsIGxpbmVzIG9mIHRleHQgbXVjaCBhcyB5b3Ugd291bGQgZG8gaW4gQy4iCi0KLSAgIHByaW50IGhlbGxvCi0KLXdvdWxkIHByaW50OgotCi0uLiBjb2RlLWJsb2NrOjogdGV4dAotCi0gICBUaGlzIGlzIGEgcmF0aGVyIGxvbmcgc3RyaW5nIGNvbnRhaW5pbmdcblwKLSAgIHNldmVyYWwgbGluZXMgb2YgdGV4dCBtdWNoIGFzIHlvdSB3b3VsZCBkbyBpbiBDLgotCiBTdHJpbmdzIGNhbiBiZSBjb25jYXRlbmF0ZWQgKGdsdWVkIHRvZ2V0aGVyKSB3aXRoIHRoZSBgYCtgYCBvcGVyYXRvciwgYW5kCiByZXBlYXRlZCB3aXRoIGBgKmBgOjoKIAotICAgPj4+IHdvcmQgPSAnSGVscCcgKyAnQScKLSAgID4+PiB3b3JkCi0gICAnSGVscEEnCi0gICA+Pj4gJzwnICsgd29yZCo1ICsgJz4nCi0gICAnPEhlbHBBSGVscEFIZWxwQUhlbHBBSGVscEE+JworICAgPj4+ICMgMyB0aW1lcyAndW4nLCBmb2xsb3dlZCBieSAnaXVtJworICAgPj4+IDMgKiAndW4nICsgJ2l1bScKKyAgICd1bnVudW5pdW0nCiAKLVR3byBzdHJpbmcgbGl0ZXJhbHMgbmV4dCB0byBlYWNoIG90aGVyIGFyZSBhdXRvbWF0aWNhbGx5IGNvbmNhdGVuYXRlZDsgdGhlIGZpcnN0Ci1saW5lIGFib3ZlIGNvdWxkIGFsc28gaGF2ZSBiZWVuIHdyaXR0ZW4gYGB3b3JkID0gJ0hlbHAnICdBJ2BgOyB0aGlzIG9ubHkgd29ya3MKLXdpdGggdHdvIGxpdGVyYWxzLCBub3Qgd2l0aCBhcmJpdHJhcnkgc3RyaW5nIGV4cHJlc3Npb25zOjoKK1R3byBvciBtb3JlICpzdHJpbmcgbGl0ZXJhbHMqIChpLmUuIHRoZSBvbmVzIGVuY2xvc2VkIGJldHdlZW4gcXVvdGVzKSBuZXh0Cit0byBlYWNoIG90aGVyIGFyZSBhdXRvbWF0aWNhbGx5IGNvbmNhdGVuYXRlZC4gOjoKIAotICAgPj4+ICdzdHInICdpbmcnICAgICAgICAgICAgICAgICAgICMgIDwtICBUaGlzIGlzIG9rCi0gICAnc3RyaW5nJwotICAgPj4+ICdzdHInLnN0cmlwKCkgKyAnaW5nJyAgICMgIDwtICBUaGlzIGlzIG9rCi0gICAnc3RyaW5nJwotICAgPj4+ICdzdHInLnN0cmlwKCkgJ2luZycgICAgICMgIDwtICBUaGlzIGlzIGludmFsaWQKLSAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwotICAgICAgICdzdHInLnN0cmlwKCkgJ2luZycKLSAgICAgICAgICAgICAgICAgICAgICAgICBeCisgICA+Pj4gJ1B5JyAndGhvbicKKyAgICdQeXRob24nCisKK1RoaXMgb25seSB3b3JrcyB3aXRoIHR3byBsaXRlcmFscyB0aG91Z2gsIG5vdCB3aXRoIHZhcmlhYmxlcyBvciBleHByZXNzaW9uczo6CisKKyAgID4+PiBwcmVmaXggPSAnUHknCisgICA+Pj4gcHJlZml4ICd0aG9uJyAgIyBjYW4ndCBjb25jYXRlbmF0ZSBhIHZhcmlhYmxlIGFuZCBhIHN0cmluZyBsaXRlcmFsCisgICAgIC4uLgorICAgU3ludGF4RXJyb3I6IGludmFsaWQgc3ludGF4CisgICA+Pj4gKCd1bicgKiAzKSAnaXVtJworICAgICAuLi4KICAgIFN5bnRheEVycm9yOiBpbnZhbGlkIHN5bnRheAogCi1TdHJpbmdzIGNhbiBiZSBzdWJzY3JpcHRlZCAoaW5kZXhlZCk7IGxpa2UgaW4gQywgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhIHN0cmluZwotaGFzIHN1YnNjcmlwdCAoaW5kZXgpIDAuICBUaGVyZSBpcyBubyBzZXBhcmF0ZSBjaGFyYWN0ZXIgdHlwZTsgYSBjaGFyYWN0ZXIgaXMKLXNpbXBseSBhIHN0cmluZyBvZiBzaXplIG9uZS4gIExpa2UgaW4gSWNvbiwgc3Vic3RyaW5ncyBjYW4gYmUgc3BlY2lmaWVkIHdpdGggdGhlCi0qc2xpY2Ugbm90YXRpb24qOiB0d28gaW5kaWNlcyBzZXBhcmF0ZWQgYnkgYSBjb2xvbi4gOjoKK0lmIHlvdSB3YW50IHRvIGNvbmNhdGVuYXRlIHZhcmlhYmxlcyBvciBhIHZhcmlhYmxlIGFuZCBhIGxpdGVyYWwsIHVzZSBgYCtgYDo6CiAKLSAgID4+PiB3b3JkWzRdCi0gICAnQScKLSAgID4+PiB3b3JkWzA6Ml0KLSAgICdIZScKLSAgID4+PiB3b3JkWzI6NF0KLSAgICdscCcKKyAgID4+PiBwcmVmaXggKyAndGhvbicKKyAgICdQeXRob24nCisKK1RoaXMgZmVhdHVyZSBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gYnJlYWsgbG9uZyBzdHJpbmdzOjoKKworICAgPj4+IHRleHQgPSAoJ1B1dCBzZXZlcmFsIHN0cmluZ3Mgd2l0aGluIHBhcmVudGhlc2VzICcKKyAgICAgICAgICAgICAgICd0byBoYXZlIHRoZW0gam9pbmVkIHRvZ2V0aGVyLicpCisgICA+Pj4gdGV4dAorICAgJ1B1dCBzZXZlcmFsIHN0cmluZ3Mgd2l0aGluIHBhcmVudGhlc2VzIHRvIGhhdmUgdGhlbSBqb2luZWQgdG9nZXRoZXIuJworCitTdHJpbmdzIGNhbiBiZSAqaW5kZXhlZCogKHN1YnNjcmlwdGVkKSwgd2l0aCB0aGUgZmlyc3QgY2hhcmFjdGVyIGhhdmluZyBpbmRleCAwLgorVGhlcmUgaXMgbm8gc2VwYXJhdGUgY2hhcmFjdGVyIHR5cGU7IGEgY2hhcmFjdGVyIGlzIHNpbXBseSBhIHN0cmluZyBvZiBzaXplCitvbmU6OgorCisgICA+Pj4gd29yZCA9ICdQeXRob24nCisgICA+Pj4gd29yZFswXSAgIyBjaGFyYWN0ZXIgaW4gcG9zaXRpb24gMAorICAgJ1AnCisgICA+Pj4gd29yZFs1XSAgIyBjaGFyYWN0ZXIgaW4gcG9zaXRpb24gNQorICAgJ24nCisKK0luZGljZXMgbWF5IGFsc28gYmUgbmVnYXRpdmUgbnVtYmVycywgdG8gc3RhcnQgY291bnRpbmcgZnJvbSB0aGUgcmlnaHQ6OgorCisgICA+Pj4gd29yZFstMV0gICMgbGFzdCBjaGFyYWN0ZXIKKyAgICduJworICAgPj4+IHdvcmRbLTJdICAjIHNlY29uZC1sYXN0IGNoYXJhY3RlcgorICAgJ28nCisgICA+Pj4gd29yZFstNl0KKyAgICdQJworCitOb3RlIHRoYXQgc2luY2UgLTAgaXMgdGhlIHNhbWUgYXMgMCwgbmVnYXRpdmUgaW5kaWNlcyBzdGFydCBmcm9tIC0xLgorCitJbiBhZGRpdGlvbiB0byBpbmRleGluZywgKnNsaWNpbmcqIGlzIGFsc28gc3VwcG9ydGVkLiAgV2hpbGUgaW5kZXhpbmcgaXMgdXNlZAordG8gb2J0YWluIGluZGl2aWR1YWwgY2hhcmFjdGVycywgKnNsaWNpbmcqIGFsbG93cyB5b3UgdG8gb2J0YWluIGEgc3Vic3RyaW5nOjoKKworICAgPj4+IHdvcmRbMDoyXSAgIyBjaGFyYWN0ZXJzIGZyb20gcG9zaXRpb24gMCAoaW5jbHVkZWQpIHRvIDIgKGV4Y2x1ZGVkKQorICAgJ1B5JworICAgPj4+IHdvcmRbMjo1XSAgIyBjaGFyYWN0ZXJzIGZyb20gcG9zaXRpb24gMiAoaW5jbHVkZWQpIHRvIDUgKGV4Y2x1ZGVkKQorICAgJ3RobycKKworTm90ZSBob3cgdGhlIHN0YXJ0IGlzIGFsd2F5cyBpbmNsdWRlZCwgYW5kIHRoZSBlbmQgYWx3YXlzIGV4Y2x1ZGVkLiAgVGhpcworbWFrZXMgc3VyZSB0aGF0IGBgc1s6aV0gKyBzW2k6XWBgIGlzIGFsd2F5cyBlcXVhbCB0byBgYHNgYDo6CisKKyAgID4+PiB3b3JkWzoyXSArIHdvcmRbMjpdCisgICAnUHl0aG9uJworICAgPj4+IHdvcmRbOjRdICsgd29yZFs0Ol0KKyAgICdQeXRob24nCiAKIFNsaWNlIGluZGljZXMgaGF2ZSB1c2VmdWwgZGVmYXVsdHM7IGFuIG9taXR0ZWQgZmlyc3QgaW5kZXggZGVmYXVsdHMgdG8gemVybywgYW4KIG9taXR0ZWQgc2Vjb25kIGluZGV4IGRlZmF1bHRzIHRvIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcgYmVpbmcgc2xpY2VkLiA6OgogCi0gICA+Pj4gd29yZFs6Ml0gICAgIyBUaGUgZmlyc3QgdHdvIGNoYXJhY3RlcnMKLSAgICdIZScKLSAgID4+PiB3b3JkWzI6XSAgICAjIEV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBmaXJzdCB0d28gY2hhcmFjdGVycwotICAgJ2xwQScKLQotVW5saWtlIGEgQyBzdHJpbmcsIFB5dGhvbiBzdHJpbmdzIGNhbm5vdCBiZSBjaGFuZ2VkLiAgQXNzaWduaW5nIHRvIGFuIGluZGV4ZWQKLXBvc2l0aW9uIGluIHRoZSBzdHJpbmcgcmVzdWx0cyBpbiBhbiBlcnJvcjo6Ci0KLSAgID4+PiB3b3JkWzBdID0gJ3gnCi0gICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KLSAgIFR5cGVFcnJvcjogb2JqZWN0IGRvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50Ci0gICA+Pj4gd29yZFs6MV0gPSAnU3BsYXQnCi0gICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KLSAgIFR5cGVFcnJvcjogb2JqZWN0IGRvZXMgbm90IHN1cHBvcnQgc2xpY2UgYXNzaWdubWVudAotCi1Ib3dldmVyLCBjcmVhdGluZyBhIG5ldyBzdHJpbmcgd2l0aCB0aGUgY29tYmluZWQgY29udGVudCBpcyBlYXN5IGFuZCBlZmZpY2llbnQ6OgotCi0gICA+Pj4gJ3gnICsgd29yZFsxOl0KLSAgICd4ZWxwQScKLSAgID4+PiAnU3BsYXQnICsgd29yZFs0XQotICAgJ1NwbGF0QScKLQotSGVyZSdzIGEgdXNlZnVsIGludmFyaWFudCBvZiBzbGljZSBvcGVyYXRpb25zOiBgYHNbOmldICsgc1tpOl1gYCBlcXVhbHMgYGBzYGAuCi06OgotCi0gICA+Pj4gd29yZFs6Ml0gKyB3b3JkWzI6XQotICAgJ0hlbHBBJwotICAgPj4+IHdvcmRbOjNdICsgd29yZFszOl0KLSAgICdIZWxwQScKLQotRGVnZW5lcmF0ZSBzbGljZSBpbmRpY2VzIGFyZSBoYW5kbGVkIGdyYWNlZnVsbHk6IGFuIGluZGV4IHRoYXQgaXMgdG9vIGxhcmdlIGlzCi1yZXBsYWNlZCBieSB0aGUgc3RyaW5nIHNpemUsIGFuIHVwcGVyIGJvdW5kIHNtYWxsZXIgdGhhbiB0aGUgbG93ZXIgYm91bmQgcmV0dXJucwotYW4gZW1wdHkgc3RyaW5nLiA6OgotCi0gICA+Pj4gd29yZFsxOjEwMF0KLSAgICdlbHBBJwotICAgPj4+IHdvcmRbMTA6XQotICAgJycKLSAgID4+PiB3b3JkWzI6MV0KLSAgICcnCi0KLUluZGljZXMgbWF5IGJlIG5lZ2F0aXZlIG51bWJlcnMsIHRvIHN0YXJ0IGNvdW50aW5nIGZyb20gdGhlIHJpZ2h0LiBGb3IgZXhhbXBsZTo6Ci0KLSAgID4+PiB3b3JkWy0xXSAgICAgIyBUaGUgbGFzdCBjaGFyYWN0ZXIKLSAgICdBJwotICAgPj4+IHdvcmRbLTJdICAgICAjIFRoZSBsYXN0LWJ1dC1vbmUgY2hhcmFjdGVyCi0gICAncCcKLSAgID4+PiB3b3JkWy0yOl0gICAgIyBUaGUgbGFzdCB0d28gY2hhcmFjdGVycwotICAgJ3BBJwotICAgPj4+IHdvcmRbOi0yXSAgICAjIEV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBsYXN0IHR3byBjaGFyYWN0ZXJzCi0gICAnSGVsJwotCi1CdXQgbm90ZSB0aGF0IC0wIGlzIHJlYWxseSB0aGUgc2FtZSBhcyAwLCBzbyBpdCBkb2VzIG5vdCBjb3VudCBmcm9tIHRoZSByaWdodCEKLTo6Ci0KLSAgID4+PiB3b3JkWy0wXSAgICAgIyAoc2luY2UgLTAgZXF1YWxzIDApCi0gICAnSCcKLQotT3V0LW9mLXJhbmdlIG5lZ2F0aXZlIHNsaWNlIGluZGljZXMgYXJlIHRydW5jYXRlZCwgYnV0IGRvbid0IHRyeSB0aGlzIGZvcgotc2luZ2xlLWVsZW1lbnQgKG5vbi1zbGljZSkgaW5kaWNlczo6Ci0KLSAgID4+PiB3b3JkWy0xMDA6XQotICAgJ0hlbHBBJwotICAgPj4+IHdvcmRbLTEwXSAgICAjIGVycm9yCi0gICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KLSAgIEluZGV4RXJyb3I6IHN0cmluZyBpbmRleCBvdXQgb2YgcmFuZ2UKKyAgID4+PiB3b3JkWzoyXSAgIyBjaGFyYWN0ZXIgZnJvbSB0aGUgYmVnaW5uaW5nIHRvIHBvc2l0aW9uIDIgKGV4Y2x1ZGVkKQorICAgJ1B5JworICAgPj4+IHdvcmRbNDpdICAjIGNoYXJhY3RlcnMgZnJvbSBwb3NpdGlvbiA0IChpbmNsdWRlZCkgdG8gdGhlIGVuZAorICAgJ29uJworICAgPj4+IHdvcmRbLTI6XSAjIGNoYXJhY3RlcnMgZnJvbSB0aGUgc2Vjb25kLWxhc3QgKGluY2x1ZGVkKSB0byB0aGUgZW5kCisgICAnb24nCiAKIE9uZSB3YXkgdG8gcmVtZW1iZXIgaG93IHNsaWNlcyB3b3JrIGlzIHRvIHRoaW5rIG9mIHRoZSBpbmRpY2VzIGFzIHBvaW50aW5nCiAqYmV0d2VlbiogY2hhcmFjdGVycywgd2l0aCB0aGUgbGVmdCBlZGdlIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgbnVtYmVyZWQgMC4KIFRoZW4gdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIGEgc3RyaW5nIG9mICpuKiBjaGFyYWN0ZXJzIGhhcwogaW5kZXggKm4qLCBmb3IgZXhhbXBsZTo6CiAKLSAgICArLS0tKy0tLSstLS0rLS0tKy0tLSsKLSAgICB8IEggfCBlIHwgbCB8IHAgfCBBIHwKLSAgICArLS0tKy0tLSstLS0rLS0tKy0tLSsKLSAgICAwICAgMSAgIDIgICAzICAgNCAgIDUKLSAgIC01ICAtNCAgLTMgIC0yICAtMQorICAgICstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKKyAgICB8IFAgfCB5IHwgdCB8IGggfCBvIHwgbiB8CisgICAgKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKworICAgIDAgICAxICAgMiAgIDMgICA0ICAgNSAgIDYKKyAgIC02ICAtNSAgLTQgIC0zICAtMiAgLTEKIAotVGhlIGZpcnN0IHJvdyBvZiBudW1iZXJzIGdpdmVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgaW5kaWNlcyAwLi4uNSBpbiB0aGUgc3RyaW5nOworVGhlIGZpcnN0IHJvdyBvZiBudW1iZXJzIGdpdmVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgaW5kaWNlcyAwLi4uNiBpbiB0aGUgc3RyaW5nOwogdGhlIHNlY29uZCByb3cgZ2l2ZXMgdGhlIGNvcnJlc3BvbmRpbmcgbmVnYXRpdmUgaW5kaWNlcy4gVGhlIHNsaWNlIGZyb20gKmkqIHRvCiAqaiogY29uc2lzdHMgb2YgYWxsIGNoYXJhY3RlcnMgYmV0d2VlbiB0aGUgZWRnZXMgbGFiZWxlZCAqaSogYW5kICpqKiwKIHJlc3BlY3RpdmVseS4KQEAgLTM2OCw2ICszMDcsMzggQEAKIGluZGljZXMsIGlmIGJvdGggYXJlIHdpdGhpbiBib3VuZHMuICBGb3IgZXhhbXBsZSwgdGhlIGxlbmd0aCBvZiBgYHdvcmRbMTozXWBgIGlzCiAyLgogCitBdHRlbXB0aW5nIHRvIHVzZSBhIGluZGV4IHRoYXQgaXMgdG9vIGxhcmdlIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yOjoKKworICAgPj4+IHdvcmRbNDJdICAjIHRoZSB3b3JkIG9ubHkgaGFzIDcgY2hhcmFjdGVycworICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA8bW9kdWxlPgorICAgSW5kZXhFcnJvcjogc3RyaW5nIGluZGV4IG91dCBvZiByYW5nZQorCitIb3dldmVyLCBvdXQgb2YgcmFuZ2Ugc2xpY2UgaW5kZXhlcyBhcmUgaGFuZGxlZCBncmFjZWZ1bGx5IHdoZW4gdXNlZCBmb3IKK3NsaWNpbmc6OgorCisgICA+Pj4gd29yZFs0OjQyXQorICAgJ29uJworICAgPj4+IHdvcmRbNDI6XQorICAgJycKKworUHl0aG9uIHN0cmluZ3MgY2Fubm90IGJlIGNoYW5nZWQgLS0tIHRoZXkgYXJlIDp0ZXJtOmBpbW11dGFibGVgLgorVGhlcmVmb3JlLCBhc3NpZ25pbmcgdG8gYW4gaW5kZXhlZCBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nIHJlc3VsdHMgaW4gYW4gZXJyb3I6OgorCisgICA+Pj4gd29yZFswXSA9ICdKJworICAgICAuLi4KKyAgIFR5cGVFcnJvcjogJ3N0cicgb2JqZWN0IGRvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50CisgICA+Pj4gd29yZFsyOl0gPSAncHknCisgICAgIC4uLgorICAgVHlwZUVycm9yOiAnc3RyJyBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQKKworSWYgeW91IG5lZWQgYSBkaWZmZXJlbnQgc3RyaW5nLCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBvbmU6OgorCisgICA+Pj4gJ0onICsgd29yZFsxOl0KKyAgICdKeXRob24nCisgICA+Pj4gd29yZFs6Ml0gKyAncHknCisgICAnUHlweScKKwogVGhlIGJ1aWx0LWluIGZ1bmN0aW9uIDpmdW5jOmBsZW5gIHJldHVybnMgdGhlIGxlbmd0aCBvZiBhIHN0cmluZzo6CiAKICAgID4+PiBzID0gJ3N1cGVyY2FsaWZyYWdpbGlzdGljZXhwaWFsaWRvY2lvdXMnCkBAIC01MDAsOTQgKzQ3MSw4OSBAQAogCiBQeXRob24ga25vd3MgYSBudW1iZXIgb2YgKmNvbXBvdW5kKiBkYXRhIHR5cGVzLCB1c2VkIHRvIGdyb3VwIHRvZ2V0aGVyIG90aGVyCiB2YWx1ZXMuICBUaGUgbW9zdCB2ZXJzYXRpbGUgaXMgdGhlICpsaXN0Kiwgd2hpY2ggY2FuIGJlIHdyaXR0ZW4gYXMgYSBsaXN0IG9mCi1jb21tYS1zZXBhcmF0ZWQgdmFsdWVzIChpdGVtcykgYmV0d2VlbiBzcXVhcmUgYnJhY2tldHMuICBMaXN0IGl0ZW1zIG5lZWQgbm90IGFsbAotaGF2ZSB0aGUgc2FtZSB0eXBlLiA6OgorY29tbWEtc2VwYXJhdGVkIHZhbHVlcyAoaXRlbXMpIGJldHdlZW4gc3F1YXJlIGJyYWNrZXRzLiAgTGlzdHMgbWlnaHQgY29udGFpbgoraXRlbXMgb2YgZGlmZmVyZW50IHR5cGVzLCBidXQgdXN1YWxseSB0aGUgaXRlbXMgYWxsIGhhdmUgdGhlIHNhbWUgdHlwZS4gOjoKIAotICAgPj4+IGEgPSBbJ3NwYW0nLCAnZWdncycsIDEwMCwgMTIzNF0KLSAgID4+PiBhCi0gICBbJ3NwYW0nLCAnZWdncycsIDEwMCwgMTIzNF0KKyAgID4+PiBzcXVhcmVzID0gWzEsIDQsIDksIDE2LCAyNV0KKyAgID4+PiBzcXVhcmVzCisgICBbMSwgNCwgOSwgMTYsIDI1XQogCi1MaWtlIHN0cmluZyBpbmRpY2VzLCBsaXN0IGluZGljZXMgc3RhcnQgYXQgMCwgYW5kIGxpc3RzIGNhbiBiZSBzbGljZWQsCi1jb25jYXRlbmF0ZWQgYW5kIHNvIG9uOjoKK0xpa2Ugc3RyaW5ncyAoYW5kIGFsbCBvdGhlciBidWlsdC1pbiA6dGVybTpgc2VxdWVuY2VgIHR5cGUpLCBsaXN0cyBjYW4gYmUKK2luZGV4ZWQgYW5kIHNsaWNlZDo6CiAKLSAgID4+PiBhWzBdCi0gICAnc3BhbScKLSAgID4+PiBhWzNdCi0gICAxMjM0Ci0gICA+Pj4gYVstMl0KLSAgIDEwMAotICAgPj4+IGFbMTotMV0KLSAgIFsnZWdncycsIDEwMF0KLSAgID4+PiBhWzoyXSArIFsnYmFjb24nLCAyKjJdCi0gICBbJ3NwYW0nLCAnZWdncycsICdiYWNvbicsIDRdCi0gICA+Pj4gMyphWzozXSArIFsnQm9vISddCi0gICBbJ3NwYW0nLCAnZWdncycsIDEwMCwgJ3NwYW0nLCAnZWdncycsIDEwMCwgJ3NwYW0nLCAnZWdncycsIDEwMCwgJ0JvbyEnXQorICAgPj4+IHNxdWFyZXNbMF0gICMgaW5kZXhpbmcgcmV0dXJucyB0aGUgaXRlbQorICAgMQorICAgPj4+IHNxdWFyZXNbLTFdCisgICAyNQorICAgPj4+IHNxdWFyZXNbLTM6XSAgIyBzbGljaW5nIHJldHVybnMgYSBuZXcgbGlzdAorICAgWzksIDE2LCAyNV0KIAogQWxsIHNsaWNlIG9wZXJhdGlvbnMgcmV0dXJuIGEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgcmVxdWVzdGVkIGVsZW1lbnRzLiAgVGhpcwotbWVhbnMgdGhhdCB0aGUgZm9sbG93aW5nIHNsaWNlIHJldHVybnMgYSBzaGFsbG93IGNvcHkgb2YgdGhlIGxpc3QgKmEqOjoKK21lYW5zIHRoYXQgdGhlIGZvbGxvd2luZyBzbGljZSByZXR1cm5zIGEgbmV3IChzaGFsbG93KSBjb3B5IG9mIHRoZSBsaXN0OjoKIAotICAgPj4+IGFbOl0KLSAgIFsnc3BhbScsICdlZ2dzJywgMTAwLCAxMjM0XQorICAgPj4+IHNxdWFyZXNbOl0KKyAgIFsxLCA0LCA5LCAxNiwgMjVdCiAKLVVubGlrZSBzdHJpbmdzLCB3aGljaCBhcmUgKmltbXV0YWJsZSosIGl0IGlzIHBvc3NpYmxlIHRvIGNoYW5nZSBpbmRpdmlkdWFsCi1lbGVtZW50cyBvZiBhIGxpc3Q6OgorTGlzdHMgYWxzbyBzdXBwb3J0cyBvcGVyYXRpb25zIGxpa2UgY29uY2F0ZW5hdGlvbjo6CiAKLSAgID4+PiBhCi0gICBbJ3NwYW0nLCAnZWdncycsIDEwMCwgMTIzNF0KLSAgID4+PiBhWzJdID0gYVsyXSArIDIzCi0gICA+Pj4gYQotICAgWydzcGFtJywgJ2VnZ3MnLCAxMjMsIDEyMzRdCisgICA+Pj4gc3F1YXJlcyArIFszNiwgNDksIDY0LCA4MSwgMTAwXQorICAgWzEsIDQsIDksIDE2LCAyNSwgMzYsIDQ5LCA2NCwgODEsIDEwMF0KKworVW5saWtlIHN0cmluZ3MsIHdoaWNoIGFyZSA6dGVybTpgaW1tdXRhYmxlYCwgbGlzdHMgYXJlIGEgOnRlcm06YG11dGFibGVgCit0eXBlLCBpLmUuIGl0IGlzIHBvc3NpYmxlIHRvIGNoYW5nZSB0aGVpciBjb250ZW50OjoKKworICAgID4+PiBjdWJlcyA9IFsxLCA4LCAyNywgNjUsIDEyNV0gICMgc29tZXRoaW5nJ3Mgd3JvbmcgaGVyZQorICAgID4+PiA0ICoqIDMgICMgdGhlIGN1YmUgb2YgNCBpcyA2NCwgbm90IDY1IQorICAgIDY0CisgICAgPj4+IGN1YmVzWzNdID0gNjQgICMgcmVwbGFjZSB0aGUgd3JvbmcgdmFsdWUKKyAgICA+Pj4gY3ViZXMKKyAgICBbMSwgOCwgMjcsIDY0LCAxMjVdCisKK1lvdSBjYW4gYWxzbyBhZGQgbmV3IGl0ZW1zIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QsIGJ5IHVzaW5nCit0aGUgOm1ldGg6YH5saXN0LmFwcGVuZGAgKm1ldGhvZCogKHdlIHdpbGwgc2VlIG1vcmUgYWJvdXQgbWV0aG9kcyBsYXRlcik6OgorCisgICA+Pj4gY3ViZXMuYXBwZW5kKDIxNikgICMgYWRkIHRoZSBjdWJlIG9mIDYKKyAgID4+PiBjdWJlcy5hcHBlbmQoNyAqKiAzKSAgIyBhbmQgdGhlIGN1YmUgb2YgNworICAgPj4+IGN1YmVzCisgICBbMSwgOCwgMjcsIDY0LCAxMjUsIDIxNiwgMzQzXQogCiBBc3NpZ25tZW50IHRvIHNsaWNlcyBpcyBhbHNvIHBvc3NpYmxlLCBhbmQgdGhpcyBjYW4gZXZlbiBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlCiBsaXN0IG9yIGNsZWFyIGl0IGVudGlyZWx5OjoKIAotICAgPj4+ICMgUmVwbGFjZSBzb21lIGl0ZW1zOgotICAgLi4uIGFbMDoyXSA9IFsxLCAxMl0KLSAgID4+PiBhCi0gICBbMSwgMTIsIDEyMywgMTIzNF0KLSAgID4+PiAjIFJlbW92ZSBzb21lOgotICAgLi4uIGFbMDoyXSA9IFtdCi0gICA+Pj4gYQotICAgWzEyMywgMTIzNF0KLSAgID4+PiAjIEluc2VydCBzb21lOgotICAgLi4uIGFbMToxXSA9IFsnYmxldGNoJywgJ3h5enp5J10KLSAgID4+PiBhCi0gICBbMTIzLCAnYmxldGNoJywgJ3h5enp5JywgMTIzNF0KLSAgID4+PiAjIEluc2VydCAoYSBjb3B5IG9mKSBpdHNlbGYgYXQgdGhlIGJlZ2lubmluZwotICAgPj4+IGFbOjBdID0gYQotICAgPj4+IGEKLSAgIFsxMjMsICdibGV0Y2gnLCAneHl6enknLCAxMjM0LCAxMjMsICdibGV0Y2gnLCAneHl6enknLCAxMjM0XQotICAgPj4+ICMgQ2xlYXIgdGhlIGxpc3Q6IHJlcGxhY2UgYWxsIGl0ZW1zIHdpdGggYW4gZW1wdHkgbGlzdAotICAgPj4+IGFbOl0gPSBbXQotICAgPj4+IGEKKyAgID4+PiBsZXR0ZXJzID0gWydhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJ10KKyAgID4+PiBsZXR0ZXJzCisgICBbJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnXQorICAgPj4+ICMgcmVwbGFjZSBzb21lIHZhbHVlcworICAgPj4+IGxldHRlcnNbMjo1XSA9IFsnQycsICdEJywgJ0UnXQorICAgPj4+IGxldHRlcnMKKyAgIFsnYScsICdiJywgJ0MnLCAnRCcsICdFJywgJ2YnLCAnZyddCisgICA+Pj4gIyBub3cgcmVtb3ZlIHRoZW0KKyAgID4+PiBsZXR0ZXJzWzI6NV0gPSBbXQorICAgPj4+IGxldHRlcnMKKyAgIFsnYScsICdiJywgJ2YnLCAnZyddCisgICA+Pj4gIyBjbGVhciB0aGUgbGlzdCBieSByZXBsYWNpbmcgYWxsIHRoZSBlbGVtZW50cyB3aXRoIGFuIGVtcHR5IGxpc3QKKyAgID4+PiBsZXR0ZXJzWzpdID0gW10KKyAgID4+PiBsZXR0ZXJzCiAgICBbXQogCiBUaGUgYnVpbHQtaW4gZnVuY3Rpb24gOmZ1bmM6YGxlbmAgYWxzbyBhcHBsaWVzIHRvIGxpc3RzOjoKIAotICAgPj4+IGEgPSBbJ2EnLCAnYicsICdjJywgJ2QnXQotICAgPj4+IGxlbihhKQorICAgPj4+IGxldHRlcnMgPSBbJ2EnLCAnYicsICdjJywgJ2QnXQorICAgPj4+IGxlbihsZXR0ZXJzKQogICAgNAogCiBJdCBpcyBwb3NzaWJsZSB0byBuZXN0IGxpc3RzIChjcmVhdGUgbGlzdHMgY29udGFpbmluZyBvdGhlciBsaXN0cyksIGZvcgogZXhhbXBsZTo6CiAKLSAgID4+PiBxID0gWzIsIDNdCi0gICA+Pj4gcCA9IFsxLCBxLCA0XQotICAgPj4+IGxlbihwKQotICAgMwotICAgPj4+IHBbMV0KLSAgIFsyLCAzXQotICAgPj4+IHBbMV1bMF0KLSAgIDIKLSAgID4+PiBwWzFdLmFwcGVuZCgneHRyYScpICAgICAjIFNlZSBzZWN0aW9uIDUuMQotICAgPj4+IHAKLSAgIFsxLCBbMiwgMywgJ3h0cmEnXSwgNF0KLSAgID4+PiBxCi0gICBbMiwgMywgJ3h0cmEnXQotCi1Ob3RlIHRoYXQgaW4gdGhlIGxhc3QgZXhhbXBsZSwgYGBwWzFdYGAgYW5kIGBgcWBgIHJlYWxseSByZWZlciB0byB0aGUgc2FtZQotb2JqZWN0ISAgV2UnbGwgY29tZSBiYWNrIHRvICpvYmplY3Qgc2VtYW50aWNzKiBsYXRlci4KLQorICAgPj4+IGEgPSBbJ2EnLCAnYicsICdjJ10KKyAgID4+PiBuID0gWzEsIDIsIDNdCisgICA+Pj4geCA9IFthLCBuXQorICAgPj4+IHgKKyAgIFtbJ2EnLCAnYicsICdjJ10sIFsxLCAyLCAzXV0KKyAgID4+PiB4WzBdCisgICBbJ2EnLCAnYicsICdjJ10KKyAgID4+PiB4WzBdWzFdCisgICAnYicKIAogLi4gX3R1dC1maXJzdHN0ZXBzOgogCkBAIC02MzAsMTMgKzU5NiwxMyBAQAogICBhbmQgYGAhPWBgIChub3QgZXF1YWwgdG8pLgogCiAqIFRoZSAqYm9keSogb2YgdGhlIGxvb3AgaXMgKmluZGVudGVkKjogaW5kZW50YXRpb24gaXMgUHl0aG9uJ3Mgd2F5IG9mIGdyb3VwaW5nCi0gIHN0YXRlbWVudHMuICBQeXRob24gZG9lcyBub3QgKHlldCEpIHByb3ZpZGUgYW4gaW50ZWxsaWdlbnQgaW5wdXQgbGluZSBlZGl0aW5nCi0gIGZhY2lsaXR5LCBzbyB5b3UgaGF2ZSB0byB0eXBlIGEgdGFiIG9yIHNwYWNlKHMpIGZvciBlYWNoIGluZGVudGVkIGxpbmUuICBJbgotICBwcmFjdGljZSB5b3Ugd2lsbCBwcmVwYXJlIG1vcmUgY29tcGxpY2F0ZWQgaW5wdXQgZm9yIFB5dGhvbiB3aXRoIGEgdGV4dCBlZGl0b3I7Ci0gIG1vc3QgdGV4dCBlZGl0b3JzIGhhdmUgYW4gYXV0by1pbmRlbnQgZmFjaWxpdHkuICBXaGVuIGEgY29tcG91bmQgc3RhdGVtZW50IGlzCi0gIGVudGVyZWQgaW50ZXJhY3RpdmVseSwgaXQgbXVzdCBiZSBmb2xsb3dlZCBieSBhIGJsYW5rIGxpbmUgdG8gaW5kaWNhdGUKLSAgY29tcGxldGlvbiAoc2luY2UgdGhlIHBhcnNlciBjYW5ub3QgZ3Vlc3Mgd2hlbiB5b3UgaGF2ZSB0eXBlZCB0aGUgbGFzdCBsaW5lKS4KLSAgTm90ZSB0aGF0IGVhY2ggbGluZSB3aXRoaW4gYSBiYXNpYyBibG9jayBtdXN0IGJlIGluZGVudGVkIGJ5IHRoZSBzYW1lIGFtb3VudC4KKyAgc3RhdGVtZW50cy4gIEF0IHRoZSBpbnRlcmFjdGl2ZSBwcm9tcHQsIHlvdSBoYXZlIHRvIHR5cGUgYSB0YWIgb3Igc3BhY2UocykgZm9yCisgIGVhY2ggaW5kZW50ZWQgbGluZS4gIEluIHByYWN0aWNlIHlvdSB3aWxsIHByZXBhcmUgbW9yZSBjb21wbGljYXRlZCBpbnB1dAorICBmb3IgUHl0aG9uIHdpdGggYSB0ZXh0IGVkaXRvcjsgYWxsIGRlY2VudCB0ZXh0IGVkaXRvcnMgaGF2ZSBhbiBhdXRvLWluZGVudAorICBmYWNpbGl0eS4gIFdoZW4gYSBjb21wb3VuZCBzdGF0ZW1lbnQgaXMgZW50ZXJlZCBpbnRlcmFjdGl2ZWx5LCBpdCBtdXN0IGJlCisgIGZvbGxvd2VkIGJ5IGEgYmxhbmsgbGluZSB0byBpbmRpY2F0ZSBjb21wbGV0aW9uIChzaW5jZSB0aGUgcGFyc2VyIGNhbm5vdAorICBndWVzcyB3aGVuIHlvdSBoYXZlIHR5cGVkIHRoZSBsYXN0IGxpbmUpLiAgTm90ZSB0aGF0IGVhY2ggbGluZSB3aXRoaW4gYSBiYXNpYworICBibG9jayBtdXN0IGJlIGluZGVudGVkIGJ5IHRoZSBzYW1lIGFtb3VudC4KIAogKiBUaGUgOmtleXdvcmQ6YHByaW50YCBzdGF0ZW1lbnQgd3JpdGVzIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbihzKSBpdCBpcwogICBnaXZlbi4gIEl0IGRpZmZlcnMgZnJvbSBqdXN0IHdyaXRpbmcgdGhlIGV4cHJlc3Npb24geW91IHdhbnQgdG8gd3JpdGUgKGFzIHdlIGRpZApAQCAtNjU5LDMgKzYyNSwxNCBAQAogCiAgIE5vdGUgdGhhdCB0aGUgaW50ZXJwcmV0ZXIgaW5zZXJ0cyBhIG5ld2xpbmUgYmVmb3JlIGl0IHByaW50cyB0aGUgbmV4dCBwcm9tcHQgaWYKICAgdGhlIGxhc3QgbGluZSB3YXMgbm90IGNvbXBsZXRlZC4KKworLi4gcnVicmljOjogRm9vdG5vdGVzCisKKy4uIFsjXSBTaW5jZSBgYCoqYGAgaGFzIGhpZ2hlciBwcmVjZWRlbmNlIHRoYW4gYGAtYGAsIGBgLTMqKjJgYCB3aWxsIGJlCisgICBpbnRlcnByZXRlZCBhcyBgYC0oMyoqMilgYCBhbmQgdGh1cyByZXN1bHQgaW4gYGAtOWBgLiAgVG8gYXZvaWQgdGhpcworICAgYW5kIGdldCBgYDlgYCwgeW91IGNhbiB1c2UgYGAoLTMpKioyYGAuCisKKy4uIFsjXSBVbmxpa2Ugb3RoZXIgbGFuZ3VhZ2VzLCBzcGVjaWFsIGNoYXJhY3RlcnMgc3VjaCBhcyBgYFxuYGAgaGF2ZSB0aGUKKyAgIHNhbWUgbWVhbmluZyB3aXRoIGJvdGggc2luZ2xlIChgYCcuLi4nYGApIGFuZCBkb3VibGUgKGBgIi4uLiJgYCkgcXVvdGVzLgorICAgVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gaXMgdGhhdCB3aXRoaW4gc2luZ2xlIHF1b3RlcyB5b3UgZG9uJ3QKKyAgIG5lZWQgdG8gZXNjYXBlIGBgImBgIChidXQgeW91IGhhdmUgdG8gZXNjYXBlIGBgXCdgYCkgYW5kIHZpY2UgdmVyc2EuCmRpZmYgLS1naXQgYS9Eb2MvdHV0b3JpYWwvbW9kdWxlcy5yc3QgYi9Eb2MvdHV0b3JpYWwvbW9kdWxlcy5yc3QKaW5kZXggMTJmNjQ5ZS4uZjViODExNCAxMDA2NDQKLS0tIGEvRG9jL3R1dG9yaWFsL21vZHVsZXMucnN0CisrKyBiL0RvYy90dXRvcmlhbC9tb2R1bGVzLnJzdApAQCAtNzEsNyArNzEsOCBAQAogCiBBIG1vZHVsZSBjYW4gY29udGFpbiBleGVjdXRhYmxlIHN0YXRlbWVudHMgYXMgd2VsbCBhcyBmdW5jdGlvbiBkZWZpbml0aW9ucy4KIFRoZXNlIHN0YXRlbWVudHMgYXJlIGludGVuZGVkIHRvIGluaXRpYWxpemUgdGhlIG1vZHVsZS4gVGhleSBhcmUgZXhlY3V0ZWQgb25seQotdGhlICpmaXJzdCogdGltZSB0aGUgbW9kdWxlIGlzIGltcG9ydGVkIHNvbWV3aGVyZS4gWyNdXwordGhlICpmaXJzdCogdGltZSB0aGUgbW9kdWxlIG5hbWUgaXMgZW5jb3VudGVyZWQgaW4gYW4gaW1wb3J0IHN0YXRlbWVudC4gWyNdXworKFRoZXkgYXJlIGFsc28gcnVuIGlmIHRoZSBmaWxlIGlzIGV4ZWN1dGVkIGFzIGEgc2NyaXB0LikKIAogRWFjaCBtb2R1bGUgaGFzIGl0cyBvd24gcHJpdmF0ZSBzeW1ib2wgdGFibGUsIHdoaWNoIGlzIHVzZWQgYXMgdGhlIGdsb2JhbCBzeW1ib2wKIHRhYmxlIGJ5IGFsbCBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlLiBUaHVzLCB0aGUgYXV0aG9yIG9mIGEgbW9kdWxlIGNhbgpAQCAtMTU1LDI0ICsxNTYsMjIgQEAKIAogLi4gaW5kZXg6OiB0cmlwbGU6IG1vZHVsZTsgc2VhcmNoOyBwYXRoCiAKLVdoZW4gYSBtb2R1bGUgbmFtZWQgOm1vZDpgc3BhbWAgaXMgaW1wb3J0ZWQsIHRoZSBpbnRlcnByZXRlciBzZWFyY2hlcyBmb3IgYQotZmlsZSBuYW1lZCA6ZmlsZTpgc3BhbS5weWAgaW4gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBpbnB1dCBzY3JpcHQgYW5kCi10aGVuIGluIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLTplbnZ2YXI6YFBZVEhPTlBBVEhgLiAgVGhpcyBoYXMgdGhlIHNhbWUgc3ludGF4IGFzIHRoZSBzaGVsbCB2YXJpYWJsZQotOmVudnZhcjpgUEFUSGAsIHRoYXQgaXMsIGEgbGlzdCBvZiBkaXJlY3RvcnkgbmFtZXMuICBXaGVuIDplbnZ2YXI6YFBZVEhPTlBBVEhgCi1pcyBub3Qgc2V0LCBvciB3aGVuIHRoZSBmaWxlIGlzIG5vdCBmb3VuZCB0aGVyZSwgdGhlIHNlYXJjaCBjb250aW51ZXMgaW4gYW4KLWluc3RhbGxhdGlvbi1kZXBlbmRlbnQgZGVmYXVsdCBwYXRoOyBvbiBVbml4LCB0aGlzIGlzIHVzdWFsbHkKLTpmaWxlOmAuOi91c3IvbG9jYWwvbGliL3B5dGhvbmAuCitXaGVuIGEgbW9kdWxlIG5hbWVkIDptb2Q6YHNwYW1gIGlzIGltcG9ydGVkLCB0aGUgaW50ZXJwcmV0ZXIgZmlyc3Qgc2VhcmNoZXMgZm9yCithIGJ1aWx0LWluIG1vZHVsZSB3aXRoIHRoYXQgbmFtZS4gSWYgbm90IGZvdW5kLCBpdCB0aGVuIHNlYXJjaGVzIGZvciBhIGZpbGUKK25hbWVkIDpmaWxlOmBzcGFtLnB5YCBpbiBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMgZ2l2ZW4gYnkgdGhlIHZhcmlhYmxlCis6ZGF0YTpgc3lzLnBhdGhgLiAgOmRhdGE6YHN5cy5wYXRoYCBpcyBpbml0aWFsaXplZCBmcm9tIHRoZXNlIGxvY2F0aW9uczoKIAotQWN0dWFsbHksIG1vZHVsZXMgYXJlIHNlYXJjaGVkIGluIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIGdpdmVuIGJ5IHRoZSB2YXJpYWJsZQotYGBzeXMucGF0aGBgIHdoaWNoIGlzIGluaXRpYWxpemVkIGZyb20gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBpbnB1dCBzY3JpcHQKLShvciB0aGUgY3VycmVudCBkaXJlY3RvcnkpLCA6ZW52dmFyOmBQWVRIT05QQVRIYCBhbmQgdGhlIGluc3RhbGxhdGlvbi0gZGVwZW5kZW50Ci1kZWZhdWx0LiAgVGhpcyBhbGxvd3MgUHl0aG9uIHByb2dyYW1zIHRoYXQga25vdyB3aGF0IHRoZXkncmUgZG9pbmcgdG8gbW9kaWZ5IG9yCi1yZXBsYWNlIHRoZSBtb2R1bGUgc2VhcmNoIHBhdGguICBOb3RlIHRoYXQgYmVjYXVzZSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlCi1zY3JpcHQgYmVpbmcgcnVuIGlzIG9uIHRoZSBzZWFyY2ggcGF0aCwgaXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIHNjcmlwdCBub3QgaGF2ZQotdGhlIHNhbWUgbmFtZSBhcyBhIHN0YW5kYXJkIG1vZHVsZSwgb3IgUHl0aG9uIHdpbGwgYXR0ZW1wdCB0byBsb2FkIHRoZSBzY3JpcHQgYXMKLWEgbW9kdWxlIHdoZW4gdGhhdCBtb2R1bGUgaXMgaW1wb3J0ZWQuIFRoaXMgd2lsbCBnZW5lcmFsbHkgYmUgYW4gZXJyb3IuICBTZWUKLXNlY3Rpb24gOnJlZjpgdHV0LXN0YW5kYXJkbW9kdWxlc2AgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisqIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgaW5wdXQgc2NyaXB0IChvciB0aGUgY3VycmVudCBkaXJlY3RvcnkpLgorKiA6ZW52dmFyOmBQWVRIT05QQVRIYCAoYSBsaXN0IG9mIGRpcmVjdG9yeSBuYW1lcywgd2l0aCB0aGUgc2FtZSBzeW50YXggYXMgdGhlCisgIHNoZWxsIHZhcmlhYmxlIDplbnZ2YXI6YFBBVEhgKS4KKyogdGhlIGluc3RhbGxhdGlvbi1kZXBlbmRlbnQgZGVmYXVsdC4KKworQWZ0ZXIgaW5pdGlhbGl6YXRpb24sIFB5dGhvbiBwcm9ncmFtcyBjYW4gbW9kaWZ5IDpkYXRhOmBzeXMucGF0aGAuICBUaGUKK2RpcmVjdG9yeSBjb250YWluaW5nIHRoZSBzY3JpcHQgYmVpbmcgcnVuIGlzIHBsYWNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQorc2VhcmNoIHBhdGgsIGFoZWFkIG9mIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IHBhdGguIFRoaXMgbWVhbnMgdGhhdCBzY3JpcHRzIGluIHRoYXQKK2RpcmVjdG9yeSB3aWxsIGJlIGxvYWRlZCBpbnN0ZWFkIG9mIG1vZHVsZXMgb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgbGlicmFyeQorZGlyZWN0b3J5LiBUaGlzIGlzIGFuIGVycm9yIHVubGVzcyB0aGUgcmVwbGFjZW1lbnQgaXMgaW50ZW5kZWQuICBTZWUgc2VjdGlvbgorOnJlZjpgdHV0LXN0YW5kYXJkbW9kdWxlc2AgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAKIAogIkNvbXBpbGVkIiBQeXRob24gZmlsZXMKQEAgLTI0NCw3ICsyNDMsNyBAQAogYXJlIG5vdCBwYXJ0IG9mIHRoZSBjb3JlIG9mIHRoZSBsYW5ndWFnZSBidXQgYXJlIG5ldmVydGhlbGVzcyBidWlsdCBpbiwgZWl0aGVyCiBmb3IgZWZmaWNpZW5jeSBvciB0byBwcm92aWRlIGFjY2VzcyB0byBvcGVyYXRpbmcgc3lzdGVtIHByaW1pdGl2ZXMgc3VjaCBhcwogc3lzdGVtIGNhbGxzLiAgVGhlIHNldCBvZiBzdWNoIG1vZHVsZXMgaXMgYSBjb25maWd1cmF0aW9uIG9wdGlvbiB3aGljaCBhbHNvCi1kZXBlbmRzIG9uIHRoZSB1bmRlcmx5aW5nIHBsYXRmb3JtIEZvciBleGFtcGxlLCB0aGUgOm1vZDpgd2lucmVnYCBtb2R1bGUgaXMgb25seQorZGVwZW5kcyBvbiB0aGUgdW5kZXJseWluZyBwbGF0Zm9ybS4gIEZvciBleGFtcGxlLCB0aGUgOm1vZDpgd2lucmVnYCBtb2R1bGUgaXMgb25seQogcHJvdmlkZWQgb24gV2luZG93cyBzeXN0ZW1zLiBPbmUgcGFydGljdWxhciBtb2R1bGUgZGVzZXJ2ZXMgc29tZSBhdHRlbnRpb246CiA6bW9kOmBzeXNgLCB3aGljaCBpcyBidWlsdCBpbnRvIGV2ZXJ5IFB5dGhvbiBpbnRlcnByZXRlci4gIFRoZSB2YXJpYWJsZXMKIGBgc3lzLnBzMWBgIGFuZCBgYHN5cy5wczJgYCBkZWZpbmUgdGhlIHN0cmluZ3MgdXNlZCBhcyBwcmltYXJ5IGFuZCBzZWNvbmRhcnkKQEAgLTI4NCwxNiArMjgzLDIxIEBACiAgICA+Pj4gaW1wb3J0IGZpYm8sIHN5cwogICAgPj4+IGRpcihmaWJvKQogICAgWydfX25hbWVfXycsICdmaWInLCAnZmliMiddCi0gICA+Pj4gZGlyKHN5cykKLSAgIFsnX19kaXNwbGF5aG9va19fJywgJ19fZG9jX18nLCAnX19leGNlcHRob29rX18nLCAnX19uYW1lX18nLCAnX19zdGRlcnJfXycsCi0gICAgJ19fc3RkaW5fXycsICdfX3N0ZG91dF9fJywgJ19nZXRmcmFtZScsICdhcGlfdmVyc2lvbicsICdhcmd2JywKLSAgICAnYnVpbHRpbl9tb2R1bGVfbmFtZXMnLCAnYnl0ZW9yZGVyJywgJ2NhbGxzdGF0cycsICdjb3B5cmlnaHQnLAotICAgICdkaXNwbGF5aG9vaycsICdleGNfY2xlYXInLCAnZXhjX2luZm8nLCAnZXhjX3R5cGUnLCAnZXhjZXB0aG9vaycsCi0gICAgJ2V4ZWNfcHJlZml4JywgJ2V4ZWN1dGFibGUnLCAnZXhpdCcsICdnZXRkZWZhdWx0ZW5jb2RpbmcnLCAnZ2V0ZGxvcGVuZmxhZ3MnLAotICAgICdnZXRyZWN1cnNpb25saW1pdCcsICdnZXRyZWZjb3VudCcsICdoZXh2ZXJzaW9uJywgJ21heGludCcsICdtYXh1bmljb2RlJywKLSAgICAnbWV0YV9wYXRoJywgJ21vZHVsZXMnLCAncGF0aCcsICdwYXRoX2hvb2tzJywgJ3BhdGhfaW1wb3J0ZXJfY2FjaGUnLAotICAgICdwbGF0Zm9ybScsICdwcmVmaXgnLCAncHMxJywgJ3BzMicsICdzZXRjaGVja2ludGVydmFsJywgJ3NldGRsb3BlbmZsYWdzJywKLSAgICAnc2V0cHJvZmlsZScsICdzZXRyZWN1cnNpb25saW1pdCcsICdzZXR0cmFjZScsICdzdGRlcnInLCAnc3RkaW4nLCAnc3Rkb3V0JywKKyAgID4+PiBkaXIoc3lzKSAgIyBkb2N0ZXN0OiArTk9STUFMSVpFX1dISVRFU1BBQ0UKKyAgIFsnX19kaXNwbGF5aG9va19fJywgJ19fZG9jX18nLCAnX19leGNlcHRob29rX18nLCAnX19uYW1lX18nLCAnX19wYWNrYWdlX18nLAorICAgICdfX3N0ZGVycl9fJywgJ19fc3RkaW5fXycsICdfX3N0ZG91dF9fJywgJ19jbGVhcl90eXBlX2NhY2hlJywKKyAgICAnX2N1cnJlbnRfZnJhbWVzJywgJ19nZXRmcmFtZScsICdfbWVyY3VyaWFsJywgJ2FwaV92ZXJzaW9uJywgJ2FyZ3YnLAorICAgICdidWlsdGluX21vZHVsZV9uYW1lcycsICdieXRlb3JkZXInLCAnY2FsbF90cmFjaW5nJywgJ2NhbGxzdGF0cycsCisgICAgJ2NvcHlyaWdodCcsICdkaXNwbGF5aG9vaycsICdkb250X3dyaXRlX2J5dGVjb2RlJywgJ2V4Y19jbGVhcicsICdleGNfaW5mbycsCisgICAgJ2V4Y190cmFjZWJhY2snLCAnZXhjX3R5cGUnLCAnZXhjX3ZhbHVlJywgJ2V4Y2VwdGhvb2snLCAnZXhlY19wcmVmaXgnLAorICAgICdleGVjdXRhYmxlJywgJ2V4aXQnLCAnZmxhZ3MnLCAnZmxvYXRfaW5mbycsICdmbG9hdF9yZXByX3N0eWxlJywKKyAgICAnZ2V0Y2hlY2tpbnRlcnZhbCcsICdnZXRkZWZhdWx0ZW5jb2RpbmcnLCAnZ2V0ZGxvcGVuZmxhZ3MnLAorICAgICdnZXRmaWxlc3lzdGVtZW5jb2RpbmcnLCAnZ2V0b2JqZWN0cycsICdnZXRwcm9maWxlJywgJ2dldHJlY3Vyc2lvbmxpbWl0JywKKyAgICAnZ2V0cmVmY291bnQnLCAnZ2V0c2l6ZW9mJywgJ2dldHRvdGFscmVmY291bnQnLCAnZ2V0dHJhY2UnLCAnaGV4dmVyc2lvbicsCisgICAgJ2xvbmdfaW5mbycsICdtYXhpbnQnLCAnbWF4c2l6ZScsICdtYXh1bmljb2RlJywgJ21ldGFfcGF0aCcsICdtb2R1bGVzJywKKyAgICAncGF0aCcsICdwYXRoX2hvb2tzJywgJ3BhdGhfaW1wb3J0ZXJfY2FjaGUnLCAncGxhdGZvcm0nLCAncHJlZml4JywgJ3BzMScsCisgICAgJ3B5M2t3YXJuaW5nJywgJ3NldGNoZWNraW50ZXJ2YWwnLCAnc2V0ZGxvcGVuZmxhZ3MnLCAnc2V0cHJvZmlsZScsCisgICAgJ3NldHJlY3Vyc2lvbmxpbWl0JywgJ3NldHRyYWNlJywgJ3N0ZGVycicsICdzdGRpbicsICdzdGRvdXQnLCAnc3VidmVyc2lvbicsCiAgICAgJ3ZlcnNpb24nLCAndmVyc2lvbl9pbmZvJywgJ3dhcm5vcHRpb25zJ10KIAogV2l0aG91dCBhcmd1bWVudHMsIDpmdW5jOmBkaXJgIGxpc3RzIHRoZSBuYW1lcyB5b3UgaGF2ZSBkZWZpbmVkIGN1cnJlbnRseTo6CkBAIC0zMDIsNyArMzA2LDcgQEAKICAgID4+PiBpbXBvcnQgZmlibwogICAgPj4+IGZpYiA9IGZpYm8uZmliCiAgICA+Pj4gZGlyKCkKLSAgIFsnX19idWlsdGluc19fJywgJ19fZG9jX18nLCAnX19maWxlX18nLCAnX19uYW1lX18nLCAnYScsICdmaWInLCAnZmlibycsICdzeXMnXQorICAgWydfX2J1aWx0aW5zX18nLCAnX19uYW1lX18nLCAnX19wYWNrYWdlX18nLCAnYScsICdmaWInLCAnZmlibycsICdzeXMnXQogCiBOb3RlIHRoYXQgaXQgbGlzdHMgYWxsIHR5cGVzIG9mIG5hbWVzOiB2YXJpYWJsZXMsIG1vZHVsZXMsIGZ1bmN0aW9ucywgZXRjLgogCkBAIC0zMTMsMTAgKzMxNywxMSBAQAogOm1vZDpgX19idWlsdGluX19gOjoKIAogICAgPj4+IGltcG9ydCBfX2J1aWx0aW5fXwotICAgPj4+IGRpcihfX2J1aWx0aW5fXykKLSAgIFsnQXJpdGhtZXRpY0Vycm9yJywgJ0Fzc2VydGlvbkVycm9yJywgJ0F0dHJpYnV0ZUVycm9yJywgJ0RlcHJlY2F0aW9uV2FybmluZycsCi0gICAgJ0VPRkVycm9yJywgJ0VsbGlwc2lzJywgJ0Vudmlyb25tZW50RXJyb3InLCAnRXhjZXB0aW9uJywgJ0ZhbHNlJywKLSAgICAnRmxvYXRpbmdQb2ludEVycm9yJywgJ0Z1dHVyZVdhcm5pbmcnLCAnSU9FcnJvcicsICdJbXBvcnRFcnJvcicsCisgICA+Pj4gZGlyKF9fYnVpbHRpbl9fKSAgIyBkb2N0ZXN0OiArTk9STUFMSVpFX1dISVRFU1BBQ0UKKyAgIFsnQXJpdGhtZXRpY0Vycm9yJywgJ0Fzc2VydGlvbkVycm9yJywgJ0F0dHJpYnV0ZUVycm9yJywgJ0Jhc2VFeGNlcHRpb24nLAorICAgICdCdWZmZXJFcnJvcicsICdCeXRlc1dhcm5pbmcnLCAnRGVwcmVjYXRpb25XYXJuaW5nJywgJ0VPRkVycm9yJywKKyAgICAnRWxsaXBzaXMnLCAnRW52aXJvbm1lbnRFcnJvcicsICdFeGNlcHRpb24nLCAnRmFsc2UnLCAnRmxvYXRpbmdQb2ludEVycm9yJywKKyAgICAnRnV0dXJlV2FybmluZycsICdHZW5lcmF0b3JFeGl0JywgJ0lPRXJyb3InLCAnSW1wb3J0RXJyb3InLCAnSW1wb3J0V2FybmluZycsCiAgICAgJ0luZGVudGF0aW9uRXJyb3InLCAnSW5kZXhFcnJvcicsICdLZXlFcnJvcicsICdLZXlib2FyZEludGVycnVwdCcsCiAgICAgJ0xvb2t1cEVycm9yJywgJ01lbW9yeUVycm9yJywgJ05hbWVFcnJvcicsICdOb25lJywgJ05vdEltcGxlbWVudGVkJywKICAgICAnTm90SW1wbGVtZW50ZWRFcnJvcicsICdPU0Vycm9yJywgJ092ZXJmbG93RXJyb3InLApAQCAtMzI1LDE4ICszMzAsMTkgQEAKICAgICAnU3ludGF4V2FybmluZycsICdTeXN0ZW1FcnJvcicsICdTeXN0ZW1FeGl0JywgJ1RhYkVycm9yJywgJ1RydWUnLAogICAgICdUeXBlRXJyb3InLCAnVW5ib3VuZExvY2FsRXJyb3InLCAnVW5pY29kZURlY29kZUVycm9yJywKICAgICAnVW5pY29kZUVuY29kZUVycm9yJywgJ1VuaWNvZGVFcnJvcicsICdVbmljb2RlVHJhbnNsYXRlRXJyb3InLAotICAgICdVc2VyV2FybmluZycsICdWYWx1ZUVycm9yJywgJ1dhcm5pbmcnLCAnV2luZG93c0Vycm9yJywKKyAgICAnVW5pY29kZVdhcm5pbmcnLCAnVXNlcldhcm5pbmcnLCAnVmFsdWVFcnJvcicsICdXYXJuaW5nJywKICAgICAnWmVyb0RpdmlzaW9uRXJyb3InLCAnXycsICdfX2RlYnVnX18nLCAnX19kb2NfXycsICdfX2ltcG9ydF9fJywKLSAgICAnX19uYW1lX18nLCAnYWJzJywgJ2FwcGx5JywgJ2Jhc2VzdHJpbmcnLCAnYm9vbCcsICdidWZmZXInLAotICAgICdjYWxsYWJsZScsICdjaHInLCAnY2xhc3NtZXRob2QnLCAnY21wJywgJ2NvZXJjZScsICdjb21waWxlJywKLSAgICAnY29tcGxleCcsICdjb3B5cmlnaHQnLCAnY3JlZGl0cycsICdkZWxhdHRyJywgJ2RpY3QnLCAnZGlyJywgJ2Rpdm1vZCcsCi0gICAgJ2VudW1lcmF0ZScsICdldmFsJywgJ2V4ZWNmaWxlJywgJ2V4aXQnLCAnZmlsZScsICdmaWx0ZXInLCAnZmxvYXQnLAotICAgICdmcm96ZW5zZXQnLCAnZ2V0YXR0cicsICdnbG9iYWxzJywgJ2hhc2F0dHInLCAnaGFzaCcsICdoZWxwJywgJ2hleCcsCi0gICAgJ2lkJywgJ2lucHV0JywgJ2ludCcsICdpbnRlcm4nLCAnaXNpbnN0YW5jZScsICdpc3N1YmNsYXNzJywgJ2l0ZXInLAotICAgICdsZW4nLCAnbGljZW5zZScsICdsaXN0JywgJ2xvY2FscycsICdsb25nJywgJ21hcCcsICdtYXgnLCAnbWVtb3J5dmlldycsCi0gICAgJ21pbicsICdvYmplY3QnLCAnb2N0JywgJ29wZW4nLCAnb3JkJywgJ3BvdycsICdwcm9wZXJ0eScsICdxdWl0JywgJ3JhbmdlJywKLSAgICAncmF3X2lucHV0JywgJ3JlZHVjZScsICdyZWxvYWQnLCAncmVwcicsICdyZXZlcnNlZCcsICdyb3VuZCcsICdzZXQnLAotICAgICdzZXRhdHRyJywgJ3NsaWNlJywgJ3NvcnRlZCcsICdzdGF0aWNtZXRob2QnLCAnc3RyJywgJ3N1bScsICdzdXBlcicsCisgICAgJ19fbmFtZV9fJywgJ19fcGFja2FnZV9fJywgJ2FicycsICdhbGwnLCAnYW55JywgJ2FwcGx5JywgJ2Jhc2VzdHJpbmcnLAorICAgICdiaW4nLCAnYm9vbCcsICdidWZmZXInLCAnYnl0ZWFycmF5JywgJ2J5dGVzJywgJ2NhbGxhYmxlJywgJ2NocicsCisgICAgJ2NsYXNzbWV0aG9kJywgJ2NtcCcsICdjb2VyY2UnLCAnY29tcGlsZScsICdjb21wbGV4JywgJ2NvcHlyaWdodCcsCisgICAgJ2NyZWRpdHMnLCAnZGVsYXR0cicsICdkaWN0JywgJ2RpcicsICdkaXZtb2QnLCAnZW51bWVyYXRlJywgJ2V2YWwnLAorICAgICdleGVjZmlsZScsICdleGl0JywgJ2ZpbGUnLCAnZmlsdGVyJywgJ2Zsb2F0JywgJ2Zvcm1hdCcsICdmcm96ZW5zZXQnLAorICAgICdnZXRhdHRyJywgJ2dsb2JhbHMnLCAnaGFzYXR0cicsICdoYXNoJywgJ2hlbHAnLCAnaGV4JywgJ2lkJywgJ2lucHV0JywKKyAgICAnaW50JywgJ2ludGVybicsICdpc2luc3RhbmNlJywgJ2lzc3ViY2xhc3MnLCAnaXRlcicsICdsZW4nLCAnbGljZW5zZScsCisgICAgJ2xpc3QnLCAnbG9jYWxzJywgJ2xvbmcnLCAnbWFwJywgJ21heCcsICdtZW1vcnl2aWV3JywgJ21pbicsICduZXh0JywKKyAgICAnb2JqZWN0JywgJ29jdCcsICdvcGVuJywgJ29yZCcsICdwb3cnLCAncHJpbnQnLCAncHJvcGVydHknLCAncXVpdCcsCisgICAgJ3JhbmdlJywgJ3Jhd19pbnB1dCcsICdyZWR1Y2UnLCAncmVsb2FkJywgJ3JlcHInLCAncmV2ZXJzZWQnLCAncm91bmQnLAorICAgICdzZXQnLCAnc2V0YXR0cicsICdzbGljZScsICdzb3J0ZWQnLCAnc3RhdGljbWV0aG9kJywgJ3N0cicsICdzdW0nLCAnc3VwZXInLAogICAgICd0dXBsZScsICd0eXBlJywgJ3VuaWNocicsICd1bmljb2RlJywgJ3ZhcnMnLCAneHJhbmdlJywgJ3ppcCddCiAKIApAQCAtMzYyLDcgKzM2OCw5IEBACiAoc3VjaCBhcyBtaXhpbmcsIGFkZGluZyBlY2hvLCBhcHBseWluZyBhbiBlcXVhbGl6ZXIgZnVuY3Rpb24sIGNyZWF0aW5nIGFuCiBhcnRpZmljaWFsIHN0ZXJlbyBlZmZlY3QpLCBzbyBpbiBhZGRpdGlvbiB5b3Ugd2lsbCBiZSB3cml0aW5nIGEgbmV2ZXItZW5kaW5nCiBzdHJlYW0gb2YgbW9kdWxlcyB0byBwZXJmb3JtIHRoZXNlIG9wZXJhdGlvbnMuICBIZXJlJ3MgYSBwb3NzaWJsZSBzdHJ1Y3R1cmUgZm9yCi15b3VyIHBhY2thZ2UgKGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBhIGhpZXJhcmNoaWNhbCBmaWxlc3lzdGVtKTo6Cit5b3VyIHBhY2thZ2UgKGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBhIGhpZXJhcmNoaWNhbCBmaWxlc3lzdGVtKToKKworLi4gY29kZS1ibG9jazo6IHRleHQKIAogICAgc291bmQvICAgICAgICAgICAgICAgICAgICAgICAgICBUb3AtbGV2ZWwgcGFja2FnZQogICAgICAgICAgX19pbml0X18ucHkgICAgICAgICAgICAgICBJbml0aWFsaXplIHRoZSBzb3VuZCBwYWNrYWdlCkBAIC00NTksNyArNDY3LDcgQEAKIGVuY291bnRlcmVkLiAgSXQgaXMgdXAgdG8gdGhlIHBhY2thZ2UgYXV0aG9yIHRvIGtlZXAgdGhpcyBsaXN0IHVwLXRvLWRhdGUgd2hlbiBhCiBuZXcgdmVyc2lvbiBvZiB0aGUgcGFja2FnZSBpcyByZWxlYXNlZC4gIFBhY2thZ2UgYXV0aG9ycyBtYXkgYWxzbyBkZWNpZGUgbm90IHRvCiBzdXBwb3J0IGl0LCBpZiB0aGV5IGRvbid0IHNlZSBhIHVzZSBmb3IgaW1wb3J0aW5nIFwqIGZyb20gdGhlaXIgcGFja2FnZS4gIEZvcgotZXhhbXBsZSwgdGhlIGZpbGUgOmZpbGU6YHNvdW5kcy9lZmZlY3RzL19faW5pdF9fLnB5YCBjb3VsZCBjb250YWluIHRoZSBmb2xsb3dpbmcKK2V4YW1wbGUsIHRoZSBmaWxlIDpmaWxlOmBzb3VuZC9lZmZlY3RzL19faW5pdF9fLnB5YCBjb3VsZCBjb250YWluIHRoZSBmb2xsb3dpbmcKIGNvZGU6OgogCiAgICBfX2FsbF9fID0gWyJlY2hvIiwgInN1cnJvdW5kIiwgInJldmVyc2UiXQpAQCAtNTQ1LDYgKzU1Myw2IEBACiAuLiBydWJyaWM6OiBGb290bm90ZXMKIAogLi4gWyNdIEluIGZhY3QgZnVuY3Rpb24gZGVmaW5pdGlvbnMgYXJlIGFsc28gJ3N0YXRlbWVudHMnIHRoYXQgYXJlICdleGVjdXRlZCc7IHRoZQotICAgZXhlY3V0aW9uIG9mIGEgbW9kdWxlLWxldmVsIGZ1bmN0aW9uIGVudGVycyB0aGUgZnVuY3Rpb24gbmFtZSBpbiB0aGUgbW9kdWxlJ3MKLSAgIGdsb2JhbCBzeW1ib2wgdGFibGUuCisgICBleGVjdXRpb24gb2YgYSBtb2R1bGUtbGV2ZWwgZnVuY3Rpb24gZGVmaW5pdGlvbiBlbnRlcnMgdGhlIGZ1bmN0aW9uIG5hbWUgaW4KKyAgIHRoZSBtb2R1bGUncyBnbG9iYWwgc3ltYm9sIHRhYmxlLgogCmRpZmYgLS1naXQgYS9Eb2MvdHV0b3JpYWwvc3RkbGliLnJzdCBiL0RvYy90dXRvcmlhbC9zdGRsaWIucnN0CmluZGV4IDg0NGY4YmMuLmY2MjM5ZDYgMTAwNjQ0Ci0tLSBhL0RvYy90dXRvcmlhbC9zdGRsaWIucnN0CisrKyBiL0RvYy90dXRvcmlhbC9zdGRsaWIucnN0CkBAIC0xNDUsNyArMTQ1LDcgQEAKID09PT09PT09PT09PT09PQogCiBUaGVyZSBhcmUgYSBudW1iZXIgb2YgbW9kdWxlcyBmb3IgYWNjZXNzaW5nIHRoZSBpbnRlcm5ldCBhbmQgcHJvY2Vzc2luZyBpbnRlcm5ldAotcHJvdG9jb2xzLiBUd28gb2YgdGhlIHNpbXBsZXN0IGFyZSA6bW9kOmB1cmxsaWIyYCBmb3IgcmV0cmlldmluZyBkYXRhIGZyb20gdXJscworcHJvdG9jb2xzLiBUd28gb2YgdGhlIHNpbXBsZXN0IGFyZSA6bW9kOmB1cmxsaWIyYCBmb3IgcmV0cmlldmluZyBkYXRhIGZyb20gVVJMcwogYW5kIDptb2Q6YHNtdHBsaWJgIGZvciBzZW5kaW5nIG1haWw6OgogCiAgICA+Pj4gaW1wb3J0IHVybGxpYjIKQEAgLTI3OCw4ICsyNzgsMTAgQEAKICAgICAgICBkZWYgdGVzdF9hdmVyYWdlKHNlbGYpOgogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF2ZXJhZ2UoWzIwLCAzMCwgNzBdKSwgNDAuMCkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZChhdmVyYWdlKFsxLCA1LCA3XSksIDEpLCA0LjMpCi0gICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBhdmVyYWdlLCBbXSkKLSAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhdmVyYWdlLCAyMCwgMzAsIDcwKQorICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yKToKKyAgICAgICAgICAgICAgIGF2ZXJhZ2UoW10pCisgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgICAgIGF2ZXJhZ2UoMjAsIDMwLCA3MCkKIAogICAgdW5pdHRlc3QubWFpbigpICMgQ2FsbGluZyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgaW52b2tlcyBhbGwgdGVzdHMKIApkaWZmIC0tZ2l0IGEvRG9jL3R1dG9yaWFsL3N0ZGxpYjIucnN0IGIvRG9jL3R1dG9yaWFsL3N0ZGxpYjIucnN0CmluZGV4IDUxNGQ1ODMuLjY1ZmIwOTMgMTAwNjQ0Ci0tLSBhL0RvYy90dXRvcmlhbC9zdGRsaWIyLnJzdAorKysgYi9Eb2MvdHV0b3JpYWwvc3RkbGliMi5yc3QKQEAgLTcxLDkgKzcxLDkgQEAKIFRlbXBsYXRpbmcKID09PT09PT09PT0KIAotVGhlIDptb2Q6YHN0cmluZ2AgbW9kdWxlIGluY2x1ZGVzIGEgdmVyc2F0aWxlIDpjbGFzczpgVGVtcGxhdGVgIGNsYXNzIHdpdGggYQotc2ltcGxpZmllZCBzeW50YXggc3VpdGFibGUgZm9yIGVkaXRpbmcgYnkgZW5kLXVzZXJzLiAgVGhpcyBhbGxvd3MgdXNlcnMgdG8KLWN1c3RvbWl6ZSB0aGVpciBhcHBsaWNhdGlvbnMgd2l0aG91dCBoYXZpbmcgdG8gYWx0ZXIgdGhlIGFwcGxpY2F0aW9uLgorVGhlIDptb2Q6YHN0cmluZ2AgbW9kdWxlIGluY2x1ZGVzIGEgdmVyc2F0aWxlIDpjbGFzczpgfnN0cmluZy5UZW1wbGF0ZWAgY2xhc3MKK3dpdGggYSBzaW1wbGlmaWVkIHN5bnRheCBzdWl0YWJsZSBmb3IgZWRpdGluZyBieSBlbmQtdXNlcnMuICBUaGlzIGFsbG93cyB1c2VycwordG8gY3VzdG9taXplIHRoZWlyIGFwcGxpY2F0aW9ucyB3aXRob3V0IGhhdmluZyB0byBhbHRlciB0aGUgYXBwbGljYXRpb24uCiAKIFRoZSBmb3JtYXQgdXNlcyBwbGFjZWhvbGRlciBuYW1lcyBmb3JtZWQgYnkgYGAkYGAgd2l0aCB2YWxpZCBQeXRob24gaWRlbnRpZmllcnMKIChhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgdW5kZXJzY29yZXMpLiAgU3Vycm91bmRpbmcgdGhlIHBsYWNlaG9sZGVyIHdpdGgKQEAgLTg1LDE3ICs4NSwxNyBAQAogICAgPj4+IHQuc3Vic3RpdHV0ZSh2aWxsYWdlPSdOb3R0aW5naGFtJywgY2F1c2U9J3RoZSBkaXRjaCBmdW5kJykKICAgICdOb3R0aW5naGFtZm9sayBzZW5kICQxMCB0byB0aGUgZGl0Y2ggZnVuZC4nCiAKLVRoZSA6bWV0aDpgc3Vic3RpdHV0ZWAgbWV0aG9kIHJhaXNlcyBhIDpleGM6YEtleUVycm9yYCB3aGVuIGEgcGxhY2Vob2xkZXIgaXMgbm90Ci1zdXBwbGllZCBpbiBhIGRpY3Rpb25hcnkgb3IgYSBrZXl3b3JkIGFyZ3VtZW50LiBGb3IgbWFpbC1tZXJnZSBzdHlsZQotYXBwbGljYXRpb25zLCB1c2VyIHN1cHBsaWVkIGRhdGEgbWF5IGJlIGluY29tcGxldGUgYW5kIHRoZQotOm1ldGg6YHNhZmVfc3Vic3RpdHV0ZWAgbWV0aG9kIG1heSBiZSBtb3JlIGFwcHJvcHJpYXRlIC0tLSBpdCB3aWxsIGxlYXZlCi1wbGFjZWhvbGRlcnMgdW5jaGFuZ2VkIGlmIGRhdGEgaXMgbWlzc2luZzo6CitUaGUgOm1ldGg6YH5zdHJpbmcuVGVtcGxhdGUuc3Vic3RpdHV0ZWAgbWV0aG9kIHJhaXNlcyBhIDpleGM6YEtleUVycm9yYCB3aGVuIGEKK3BsYWNlaG9sZGVyIGlzIG5vdCBzdXBwbGllZCBpbiBhIGRpY3Rpb25hcnkgb3IgYSBrZXl3b3JkIGFyZ3VtZW50LiAgRm9yCittYWlsLW1lcmdlIHN0eWxlIGFwcGxpY2F0aW9ucywgdXNlciBzdXBwbGllZCBkYXRhIG1heSBiZSBpbmNvbXBsZXRlIGFuZCB0aGUKKzptZXRoOmB+c3RyaW5nLlRlbXBsYXRlLnNhZmVfc3Vic3RpdHV0ZWAgbWV0aG9kIG1heSBiZSBtb3JlIGFwcHJvcHJpYXRlIC0tLQoraXQgd2lsbCBsZWF2ZSBwbGFjZWhvbGRlcnMgdW5jaGFuZ2VkIGlmIGRhdGEgaXMgbWlzc2luZzo6CiAKICAgID4+PiB0ID0gVGVtcGxhdGUoJ1JldHVybiB0aGUgJGl0ZW0gdG8gJG93bmVyLicpCiAgICA+Pj4gZCA9IGRpY3QoaXRlbT0ndW5sYWRlbiBzd2FsbG93JykKICAgID4+PiB0LnN1YnN0aXR1dGUoZCkKICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgICAgLiAuIC4KKyAgICAgLi4uCiAgICBLZXlFcnJvcjogJ293bmVyJwogICAgPj4+IHQuc2FmZV9zdWJzdGl0dXRlKGQpCiAgICAnUmV0dXJuIHRoZSB1bmxhZGVuIHN3YWxsb3cgdG8gJG93bmVyLicKQEAgLTEzMiw4ICsxMzIsOSBAQAogV29ya2luZyB3aXRoIEJpbmFyeSBEYXRhIFJlY29yZCBMYXlvdXRzCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotVGhlIDptb2Q6YHN0cnVjdGAgbW9kdWxlIHByb3ZpZGVzIDpmdW5jOmBwYWNrYCBhbmQgOmZ1bmM6YHVucGFja2AgZnVuY3Rpb25zIGZvcgotd29ya2luZyB3aXRoIHZhcmlhYmxlIGxlbmd0aCBiaW5hcnkgcmVjb3JkIGZvcm1hdHMuICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MKK1RoZSA6bW9kOmBzdHJ1Y3RgIG1vZHVsZSBwcm92aWRlcyA6ZnVuYzpgfnN0cnVjdC5wYWNrYCBhbmQKKzpmdW5jOmB+c3RydWN0LnVucGFja2AgZnVuY3Rpb25zIGZvciB3b3JraW5nIHdpdGggdmFyaWFibGUgbGVuZ3RoIGJpbmFyeQorcmVjb3JkIGZvcm1hdHMuICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MKIGhvdyB0byBsb29wIHRocm91Z2ggaGVhZGVyIGluZm9ybWF0aW9uIGluIGEgWklQIGZpbGUgd2l0aG91dCB1c2luZyB0aGUKIDptb2Q6YHppcGZpbGVgIG1vZHVsZS4gIFBhY2sgY29kZXMgYGAiSCJgYCBhbmQgYGAiSSJgYCByZXByZXNlbnQgdHdvIGFuZCBmb3VyCiBieXRlIHVuc2lnbmVkIG51bWJlcnMgcmVzcGVjdGl2ZWx5LiAgVGhlIGBgIjwiYGAgaW5kaWNhdGVzIHRoYXQgdGhleSBhcmUKQEAgLTIxOCw3ICsyMTksOSBAQAogICAgbG9nZ2luZy5lcnJvcignRXJyb3Igb2NjdXJyZWQnKQogICAgbG9nZ2luZy5jcml0aWNhbCgnQ3JpdGljYWwgZXJyb3IgLS0gc2h1dHRpbmcgZG93bicpCiAKLVRoaXMgcHJvZHVjZXMgdGhlIGZvbGxvd2luZyBvdXRwdXQ6OgorVGhpcyBwcm9kdWNlcyB0aGUgZm9sbG93aW5nIG91dHB1dDoKKworLi4gY29kZS1ibG9jazo6IG5vbmUKIAogICAgV0FSTklORzpyb290Oldhcm5pbmc6Y29uZmlnIGZpbGUgc2VydmVyLmNvbmYgbm90IGZvdW5kCiAgICBFUlJPUjpyb290OkVycm9yIG9jY3VycmVkCkBAIC0yMjcsOCArMjMwLDkgQEAKIEJ5IGRlZmF1bHQsIGluZm9ybWF0aW9uYWwgYW5kIGRlYnVnZ2luZyBtZXNzYWdlcyBhcmUgc3VwcHJlc3NlZCBhbmQgdGhlIG91dHB1dAogaXMgc2VudCB0byBzdGFuZGFyZCBlcnJvci4gIE90aGVyIG91dHB1dCBvcHRpb25zIGluY2x1ZGUgcm91dGluZyBtZXNzYWdlcwogdGhyb3VnaCBlbWFpbCwgZGF0YWdyYW1zLCBzb2NrZXRzLCBvciB0byBhbiBIVFRQIFNlcnZlci4gIE5ldyBmaWx0ZXJzIGNhbiBzZWxlY3QKLWRpZmZlcmVudCByb3V0aW5nIGJhc2VkIG9uIG1lc3NhZ2UgcHJpb3JpdHk6IDpjb25zdDpgREVCVUdgLCA6Y29uc3Q6YElORk9gLAotOmNvbnN0OmBXQVJOSU5HYCwgOmNvbnN0OmBFUlJPUmAsIGFuZCA6Y29uc3Q6YENSSVRJQ0FMYC4KK2RpZmZlcmVudCByb3V0aW5nIGJhc2VkIG9uIG1lc3NhZ2UgcHJpb3JpdHk6IDpjb25zdDpgfmxvZ2dpbmcuREVCVUdgLAorOmNvbnN0OmB+bG9nZ2luZy5JTkZPYCwgOmNvbnN0OmB+bG9nZ2luZy5XQVJOSU5HYCwgOmNvbnN0OmB+bG9nZ2luZy5FUlJPUmAsCithbmQgOmNvbnN0OmB+bG9nZ2luZy5DUklUSUNBTGAuCiAKIFRoZSBsb2dnaW5nIHN5c3RlbSBjYW4gYmUgY29uZmlndXJlZCBkaXJlY3RseSBmcm9tIFB5dGhvbiBvciBjYW4gYmUgbG9hZGVkIGZyb20KIGEgdXNlciBlZGl0YWJsZSBjb25maWd1cmF0aW9uIGZpbGUgZm9yIGN1c3RvbWl6ZWQgbG9nZ2luZyB3aXRob3V0IGFsdGVyaW5nIHRoZQpAQCAtMjU1LDkgKzI1OSw5IEBACiAgICA+Pj4gaW1wb3J0IHdlYWtyZWYsIGdjCiAgICA+Pj4gY2xhc3MgQToKICAgIC4uLiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKLSAgIC4uLiAgICAgICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgIC4uLiAgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQogICAgLi4uICAgICBkZWYgX19yZXByX18oc2VsZik6Ci0gICAuLi4gICAgICAgICAgICAgcmV0dXJuIHN0cihzZWxmLnZhbHVlKQorICAgLi4uICAgICAgICAgcmV0dXJuIHN0cihzZWxmLnZhbHVlKQogICAgLi4uCiAgICA+Pj4gYSA9IEEoMTApICAgICAgICAgICAgICAgICAgICMgY3JlYXRlIGEgcmVmZXJlbmNlCiAgICA+Pj4gZCA9IHdlYWtyZWYuV2Vha1ZhbHVlRGljdGlvbmFyeSgpCkBAIC0yODUsMTEgKzI4OSwxMSBAQAogc29tZXRpbWVzIHRoZXJlIGlzIGEgbmVlZCBmb3IgYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb25zIHdpdGggZGlmZmVyZW50CiBwZXJmb3JtYW5jZSB0cmFkZS1vZmZzLgogCi1UaGUgOm1vZDpgYXJyYXlgIG1vZHVsZSBwcm92aWRlcyBhbiA6Y2xhc3M6YGFycmF5KClgIG9iamVjdCB0aGF0IGlzIGxpa2UgYSBsaXN0Ci10aGF0IHN0b3JlcyBvbmx5IGhvbW9nZW5lb3VzIGRhdGEgYW5kIHN0b3JlcyBpdCBtb3JlIGNvbXBhY3RseS4gIFRoZSBmb2xsb3dpbmcKLWV4YW1wbGUgc2hvd3MgYW4gYXJyYXkgb2YgbnVtYmVycyBzdG9yZWQgYXMgdHdvIGJ5dGUgdW5zaWduZWQgYmluYXJ5IG51bWJlcnMKLSh0eXBlY29kZSBgYCJIImBgKSByYXRoZXIgdGhhbiB0aGUgdXN1YWwgMTYgYnl0ZXMgcGVyIGVudHJ5IGZvciByZWd1bGFyIGxpc3RzIG9mCi1QeXRob24gaW50IG9iamVjdHM6OgorVGhlIDptb2Q6YGFycmF5YCBtb2R1bGUgcHJvdmlkZXMgYW4gOmNsYXNzOmB+YXJyYXkuYXJyYXkoKWAgb2JqZWN0IHRoYXQgaXMgbGlrZQorYSBsaXN0IHRoYXQgc3RvcmVzIG9ubHkgaG9tb2dlbmVvdXMgZGF0YSBhbmQgc3RvcmVzIGl0IG1vcmUgY29tcGFjdGx5LiAgVGhlCitmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBhbiBhcnJheSBvZiBudW1iZXJzIHN0b3JlZCBhcyB0d28gYnl0ZSB1bnNpZ25lZCBiaW5hcnkKK251bWJlcnMgKHR5cGVjb2RlIGBgIkgiYGApIHJhdGhlciB0aGFuIHRoZSB1c3VhbCAxNiBieXRlcyBwZXIgZW50cnkgZm9yIHJlZ3VsYXIKK2xpc3RzIG9mIFB5dGhvbiBpbnQgb2JqZWN0czo6CiAKICAgID4+PiBmcm9tIGFycmF5IGltcG9ydCBhcnJheQogICAgPj4+IGEgPSBhcnJheSgnSCcsIFs0MDAwLCAxMCwgNzAwLCAyMjIyMl0pCkBAIC0yOTgsMTAgKzMwMiwxMCBAQAogICAgPj4+IGFbMTozXQogICAgYXJyYXkoJ0gnLCBbMTAsIDcwMF0pCiAKLVRoZSA6bW9kOmBjb2xsZWN0aW9uc2AgbW9kdWxlIHByb3ZpZGVzIGEgOmNsYXNzOmBkZXF1ZSgpYCBvYmplY3QgdGhhdCBpcyBsaWtlIGEKLWxpc3Qgd2l0aCBmYXN0ZXIgYXBwZW5kcyBhbmQgcG9wcyBmcm9tIHRoZSBsZWZ0IHNpZGUgYnV0IHNsb3dlciBsb29rdXBzIGluIHRoZQotbWlkZGxlLiBUaGVzZSBvYmplY3RzIGFyZSB3ZWxsIHN1aXRlZCBmb3IgaW1wbGVtZW50aW5nIHF1ZXVlcyBhbmQgYnJlYWR0aCBmaXJzdAotdHJlZSBzZWFyY2hlczo6CitUaGUgOm1vZDpgY29sbGVjdGlvbnNgIG1vZHVsZSBwcm92aWRlcyBhIDpjbGFzczpgfmNvbGxlY3Rpb25zLmRlcXVlKClgIG9iamVjdAordGhhdCBpcyBsaWtlIGEgbGlzdCB3aXRoIGZhc3RlciBhcHBlbmRzIGFuZCBwb3BzIGZyb20gdGhlIGxlZnQgc2lkZSBidXQgc2xvd2VyCitsb29rdXBzIGluIHRoZSBtaWRkbGUuIFRoZXNlIG9iamVjdHMgYXJlIHdlbGwgc3VpdGVkIGZvciBpbXBsZW1lbnRpbmcgcXVldWVzCithbmQgYnJlYWR0aCBmaXJzdCB0cmVlIHNlYXJjaGVzOjoKIAogICAgPj4+IGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCiAgICA+Pj4gZCA9IGRlcXVlKFsidGFzazEiLCAidGFzazIiLCAidGFzazMiXSkKQEAgLTMwOSw2ICszMTMsOCBAQAogICAgPj4+IHByaW50ICJIYW5kbGluZyIsIGQucG9wbGVmdCgpCiAgICBIYW5kbGluZyB0YXNrMQogCis6OgorCiAgICB1bnNlYXJjaGVkID0gZGVxdWUoW3N0YXJ0aW5nX25vZGVdKQogICAgZGVmIGJyZWFkdGhfZmlyc3Rfc2VhcmNoKHVuc2VhcmNoZWQpOgogICAgICAgIG5vZGUgPSB1bnNlYXJjaGVkLnBvcGxlZnQoKQpAQCAtMzQ1LDggKzM1MSw4IEBACiBEZWNpbWFsIEZsb2F0aW5nIFBvaW50IEFyaXRobWV0aWMKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1UaGUgOm1vZDpgZGVjaW1hbGAgbW9kdWxlIG9mZmVycyBhIDpjbGFzczpgRGVjaW1hbGAgZGF0YXR5cGUgZm9yIGRlY2ltYWwKLWZsb2F0aW5nIHBvaW50IGFyaXRobWV0aWMuICBDb21wYXJlZCB0byB0aGUgYnVpbHQtaW4gOmNsYXNzOmBmbG9hdGAKK1RoZSA6bW9kOmBkZWNpbWFsYCBtb2R1bGUgb2ZmZXJzIGEgOmNsYXNzOmB+ZGVjaW1hbC5EZWNpbWFsYCBkYXRhdHlwZSBmb3IKK2RlY2ltYWwgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYy4gIENvbXBhcmVkIHRvIHRoZSBidWlsdC1pbiA6Y2xhc3M6YGZsb2F0YAogaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IGZsb2F0aW5nIHBvaW50LCB0aGUgY2xhc3MgaXMgZXNwZWNpYWxseSBoZWxwZnVsIGZvcgogCiAqIGZpbmFuY2lhbCBhcHBsaWNhdGlvbnMgYW5kIG90aGVyIHVzZXMgd2hpY2ggcmVxdWlyZSBleGFjdCBkZWNpbWFsCkBAIC0zNzAsMTMgKzM3NiwxNSBAQAogICAgPj4+IHJvdW5kKC43MCAqIDEuMDUsIDIpICAgICAgICAgIyBzYW1lIGNhbGN1bGF0aW9uIHdpdGggZmxvYXRzCiAgICAwLjczCiAKLVRoZSA6Y2xhc3M6YERlY2ltYWxgIHJlc3VsdCBrZWVwcyBhIHRyYWlsaW5nIHplcm8sIGF1dG9tYXRpY2FsbHkgaW5mZXJyaW5nIGZvdXIKLXBsYWNlIHNpZ25pZmljYW5jZSBmcm9tIG11bHRpcGxpY2FuZHMgd2l0aCB0d28gcGxhY2Ugc2lnbmlmaWNhbmNlLiAgRGVjaW1hbAotcmVwcm9kdWNlcyBtYXRoZW1hdGljcyBhcyBkb25lIGJ5IGhhbmQgYW5kIGF2b2lkcyBpc3N1ZXMgdGhhdCBjYW4gYXJpc2Ugd2hlbgotYmluYXJ5IGZsb2F0aW5nIHBvaW50IGNhbm5vdCBleGFjdGx5IHJlcHJlc2VudCBkZWNpbWFsIHF1YW50aXRpZXMuCitUaGUgOmNsYXNzOmB+ZGVjaW1hbC5EZWNpbWFsYCByZXN1bHQga2VlcHMgYSB0cmFpbGluZyB6ZXJvLCBhdXRvbWF0aWNhbGx5CitpbmZlcnJpbmcgZm91ciBwbGFjZSBzaWduaWZpY2FuY2UgZnJvbSBtdWx0aXBsaWNhbmRzIHdpdGggdHdvIHBsYWNlCitzaWduaWZpY2FuY2UuICBEZWNpbWFsIHJlcHJvZHVjZXMgbWF0aGVtYXRpY3MgYXMgZG9uZSBieSBoYW5kIGFuZCBhdm9pZHMKK2lzc3VlcyB0aGF0IGNhbiBhcmlzZSB3aGVuIGJpbmFyeSBmbG9hdGluZyBwb2ludCBjYW5ub3QgZXhhY3RseSByZXByZXNlbnQKK2RlY2ltYWwgcXVhbnRpdGllcy4KIAotRXhhY3QgcmVwcmVzZW50YXRpb24gZW5hYmxlcyB0aGUgOmNsYXNzOmBEZWNpbWFsYCBjbGFzcyB0byBwZXJmb3JtIG1vZHVsbwotY2FsY3VsYXRpb25zIGFuZCBlcXVhbGl0eSB0ZXN0cyB0aGF0IGFyZSB1bnN1aXRhYmxlIGZvciBiaW5hcnkgZmxvYXRpbmcgcG9pbnQ6OgorRXhhY3QgcmVwcmVzZW50YXRpb24gZW5hYmxlcyB0aGUgOmNsYXNzOmB+ZGVjaW1hbC5EZWNpbWFsYCBjbGFzcyB0byBwZXJmb3JtCittb2R1bG8gY2FsY3VsYXRpb25zIGFuZCBlcXVhbGl0eSB0ZXN0cyB0aGF0IGFyZSB1bnN1aXRhYmxlIGZvciBiaW5hcnkgZmxvYXRpbmcKK3BvaW50OjoKIAogICAgPj4+IERlY2ltYWwoJzEuMDAnKSAlIERlY2ltYWwoJy4xMCcpCiAgICBEZWNpbWFsKCcwLjAwJykKZGlmZiAtLWdpdCBhL0RvYy90dXRvcmlhbC93aGF0bm93LnJzdCBiL0RvYy90dXRvcmlhbC93aGF0bm93LnJzdAppbmRleCAxNTdjYzlmLi40OGZmNWM4IDEwMDY0NAotLS0gYS9Eb2MvdHV0b3JpYWwvd2hhdG5vdy5yc3QKKysrIGIvRG9jL3R1dG9yaWFsL3doYXRub3cucnN0CkBAIC01NCw5ICs1NCw4IEBACiBtZXNzYWdlcyBwb3N0ZWQgdG8gb25lIHdpbGwgYXV0b21hdGljYWxseSBiZSBmb3J3YXJkZWQgdG8gdGhlIG90aGVyLiAgVGhlcmUgYXJlCiBhcm91bmQgMTIwIHBvc3RpbmdzIGEgZGF5ICh3aXRoIHBlYWtzIHVwIHRvIHNldmVyYWwgaHVuZHJlZCksIGFza2luZyAoYW5kCiBhbnN3ZXJpbmcpIHF1ZXN0aW9ucywgc3VnZ2VzdGluZyBuZXcgZmVhdHVyZXMsIGFuZCBhbm5vdW5jaW5nIG5ldyBtb2R1bGVzLgotQmVmb3JlIHBvc3RpbmcsIGJlIHN1cmUgdG8gY2hlY2sgdGhlIGxpc3Qgb2YgYEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zCi08aHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9mYXEvPmBfIChhbHNvIGNhbGxlZCB0aGUgRkFRKSwgb3IgbG9vayBmb3IgaXQgaW4gdGhlCi06ZmlsZTpgTWlzYy9gIGRpcmVjdG9yeSBvZiB0aGUgUHl0aG9uIHNvdXJjZSBkaXN0cmlidXRpb24uICBNYWlsaW5nIGxpc3QKK0JlZm9yZSBwb3N0aW5nLCBiZSBzdXJlIHRvIGNoZWNrIHRoZSBsaXN0IG9mIDpyZWY6YEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zCis8ZmFxLWluZGV4PmAgKGFsc28gY2FsbGVkIHRoZSBGQVEpLiAgTWFpbGluZyBsaXN0CiBhcmNoaXZlcyBhcmUgYXZhaWxhYmxlIGF0IGh0dHA6Ly9tYWlsLnB5dGhvbi5vcmcvcGlwZXJtYWlsLy4gVGhlIEZBUSBhbnN3ZXJzCiBtYW55IG9mIHRoZSBxdWVzdGlvbnMgdGhhdCBjb21lIHVwIGFnYWluIGFuZCBhZ2FpbiwgYW5kIG1heSBhbHJlYWR5IGNvbnRhaW4gdGhlCiBzb2x1dGlvbiBmb3IgeW91ciBwcm9ibGVtLgpkaWZmIC0tZ2l0IGEvRG9jL3VzaW5nL2NtZGxpbmUucnN0IGIvRG9jL3VzaW5nL2NtZGxpbmUucnN0CmluZGV4IGZlZDgzZGYuLjg0MmIyNjYgMTAwNjQ0Ci0tLSBhL0RvYy91c2luZy9jbWRsaW5lLnJzdAorKysgYi9Eb2MvdXNpbmcvY21kbGluZS5yc3QKQEAgLTI0LDcgKzI0LDcgQEAKIAogV2hlbiBpbnZva2luZyBQeXRob24sIHlvdSBtYXkgc3BlY2lmeSBhbnkgb2YgdGhlc2Ugb3B0aW9uczo6CiAKLSAgICBweXRob24gWy1CZEVpT1FzU3R1VXZWV3hYMz9dIFstYyBjb21tYW5kIHwgLW0gbW9kdWxlLW5hbWUgfCBzY3JpcHQgfCAtIF0gW2FyZ3NdCisgICAgcHl0aG9uIFstQmRFaU9Rc1JTdHVVdlZXeFgzP10gWy1jIGNvbW1hbmQgfCAtbSBtb2R1bGUtbmFtZSB8IHNjcmlwdCB8IC0gXSBbYXJnc10KIAogVGhlIG1vc3QgY29tbW9uIHVzZSBjYXNlIGlzLCBvZiBjb3Vyc2UsIGEgc2ltcGxlIGludm9jYXRpb24gb2YgYSBzY3JpcHQ6OgogCkBAIC0yNTMsNiArMjUzLDI5IEBACiAgICAgICA6cGVwOmAyMzhgIC0tIENoYW5naW5nIHRoZSBkaXZpc2lvbiBvcGVyYXRvcgogCiAKKy4uIGNtZG9wdGlvbjo6IC1SCisKKyAgIFR1cm4gb24gaGFzaCByYW5kb21pemF0aW9uLCBzbyB0aGF0IHRoZSA6bWV0aDpgX19oYXNoX19gIHZhbHVlcyBvZiBzdHIsCisgICBieXRlcyBhbmQgZGF0ZXRpbWUgb2JqZWN0cyBhcmUgInNhbHRlZCIgd2l0aCBhbiB1bnByZWRpY3RhYmxlIHJhbmRvbSB2YWx1ZS4KKyAgIEFsdGhvdWdoIHRoZXkgcmVtYWluIGNvbnN0YW50IHdpdGhpbiBhbiBpbmRpdmlkdWFsIFB5dGhvbiBwcm9jZXNzLCB0aGV5IGFyZQorICAgbm90IHByZWRpY3RhYmxlIGJldHdlZW4gcmVwZWF0ZWQgaW52b2NhdGlvbnMgb2YgUHl0aG9uLgorCisgICBUaGlzIGlzIGludGVuZGVkIHRvIHByb3ZpZGUgcHJvdGVjdGlvbiBhZ2FpbnN0IGEgZGVuaWFsLW9mLXNlcnZpY2UgY2F1c2VkIGJ5CisgICBjYXJlZnVsbHktY2hvc2VuIGlucHV0cyB0aGF0IGV4cGxvaXQgdGhlIHdvcnN0IGNhc2UgcGVyZm9ybWFuY2Ugb2YgYSBkaWN0CisgICBjb25zdHJ1Y3Rpb24sIE8obl4yKSBjb21wbGV4aXR5LiAgU2VlCisgICBodHRwOi8vd3d3Lm9jZXJ0Lm9yZy9hZHZpc29yaWVzL29jZXJ0LTIwMTEtMDAzLmh0bWwgZm9yIGRldGFpbHMuCisKKyAgIENoYW5naW5nIGhhc2ggdmFsdWVzIGFmZmVjdHMgdGhlIG9yZGVyIGluIHdoaWNoIGtleXMgYXJlIHJldHJpZXZlZCBmcm9tIGEKKyAgIGRpY3QuICBBbHRob3VnaCBQeXRob24gaGFzIG5ldmVyIG1hZGUgZ3VhcmFudGVlcyBhYm91dCB0aGlzIG9yZGVyaW5nIChhbmQgaXQKKyAgIHR5cGljYWxseSB2YXJpZXMgYmV0d2VlbiAzMi1iaXQgYW5kIDY0LWJpdCBidWlsZHMpLCBlbm91Z2ggcmVhbC13b3JsZCBjb2RlCisgICBpbXBsaWNpdGx5IHJlbGllcyBvbiB0aGlzIG5vbi1ndWFyYW50ZWVkIGJlaGF2aW9yIHRoYXQgdGhlIHJhbmRvbWl6YXRpb24gaXMKKyAgIGRpc2FibGVkIGJ5IGRlZmF1bHQuCisKKyAgIFNlZSBhbHNvIDplbnZ2YXI6YFBZVEhPTkhBU0hTRUVEYC4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMi42LjgKKworCiAuLiBjbWRvcHRpb246OiAtcwogCiAgICBEb24ndCBhZGQgdGhlIDpkYXRhOmB1c2VyIHNpdGUtcGFja2FnZXMgZGlyZWN0b3J5IDxzaXRlLlVTRVJfU0lURT5gIHRvCkBAIC0zNzQsMTggKzM5Nyw5IEBACiAKIC4uIGNtZG9wdGlvbjo6IC0zCiAKLSAgIFdhcm4gYWJvdXQgUHl0aG9uIDMueCBpbmNvbXBhdGliaWxpdGllcyB3aGljaCBjYW5ub3QgYmUgZml4ZWQgdHJpdmlhbGx5IGJ5Ci0gICA6cmVmOmAydG8zIDwydG8zLXJlZmVyZW5jZT5gLiBBbW9uZyB0aGVzZSBhcmU6Ci0KLSAgICogOm1ldGg6YGRpY3QuaGFzX2tleWAKLSAgICogOmZ1bmM6YGFwcGx5YAotICAgKiA6ZnVuYzpgY2FsbGFibGVgCi0gICAqIDpmdW5jOmBjb2VyY2VgCi0gICAqIDpmdW5jOmBleGVjZmlsZWAKLSAgICogOmZ1bmM6YHJlZHVjZWAKLSAgICogOmZ1bmM6YHJlbG9hZGAKLQotICAgVXNpbmcgdGhlc2Ugd2lsbCBlbWl0IGEgOmV4YzpgRGVwcmVjYXRpb25XYXJuaW5nYC4KKyAgIFdhcm4gYWJvdXQgUHl0aG9uIDMueCBwb3NzaWJsZSBpbmNvbXBhdGliaWxpdGllcyBieSBlbWl0dGluZyBhCisgICA6ZXhjOmBEZXByZWNhdGlvbldhcm5pbmdgIGZvciBmZWF0dXJlcyB0aGF0IGFyZSByZW1vdmVkIG9yIHNpZ25pZmljYW50bHkKKyAgIGNoYW5nZWQgaW4gUHl0aG9uIDMuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNgogCkBAIC00MTksNyArNDMzLDEwIEBACiBFbnZpcm9ubWVudCB2YXJpYWJsZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1UaGVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW5mbHVlbmNlIFB5dGhvbidzIGJlaGF2aW9yLgorVGhlc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluZmx1ZW5jZSBQeXRob24ncyBiZWhhdmlvciwgdGhleSBhcmUgcHJvY2Vzc2VkCitiZWZvcmUgdGhlIGNvbW1hbmQtbGluZSBzd2l0Y2hlcyBvdGhlciB0aGFuIC1FLiAgSXQgaXMgY3VzdG9tYXJ5IHRoYXQKK2NvbW1hbmQtbGluZSBzd2l0Y2hlcyBvdmVycmlkZSBlbnZpcm9ubWVudGFsIHZhcmlhYmxlcyB3aGVyZSB0aGVyZSBpcyBhCitjb25mbGljdC4KIAogLi4gZW52dmFyOjogUFlUSE9OSE9NRQogCkBAIC01MTIsMTYgKzUyOSwzOCBAQAogLi4gZW52dmFyOjogUFlUSE9OQ0FTRU9LCiAKICAgIElmIHRoaXMgaXMgc2V0LCBQeXRob24gaWdub3JlcyBjYXNlIGluIDprZXl3b3JkOmBpbXBvcnRgIHN0YXRlbWVudHMuICBUaGlzCi0gICBvbmx5IHdvcmtzIG9uIFdpbmRvd3MuCisgICBvbmx5IHdvcmtzIG9uIFdpbmRvd3MsIE9TIFgsIE9TLzIsIGFuZCBSaXNjT1MuCiAKIAogLi4gZW52dmFyOjogUFlUSE9ORE9OVFdSSVRFQllURUNPREUKIAogICAgSWYgdGhpcyBpcyBzZXQsIFB5dGhvbiB3b24ndCB0cnkgdG8gd3JpdGUgYGAucHljYGAgb3IgYGAucHlvYGAgZmlsZXMgb24gdGhlCi0gICBpbXBvcnQgb2Ygc291cmNlIG1vZHVsZXMuCisgICBpbXBvcnQgb2Ygc291cmNlIG1vZHVsZXMuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gc3BlY2lmeWluZyB0aGUgOm9wdGlvbjpgLUJgCisgICBvcHRpb24uCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNgogCisuLiBlbnZ2YXI6OiBQWVRIT05IQVNIU0VFRAorCisgICBJZiB0aGlzIHZhcmlhYmxlIGlzIHNldCB0byBgYHJhbmRvbWBgLCB0aGUgZWZmZWN0IGlzIHRoZSBzYW1lIGFzIHNwZWNpZnlpbmcKKyAgIHRoZSA6b3B0aW9uOmAtUmAgb3B0aW9uOiBhIHJhbmRvbSB2YWx1ZSBpcyB1c2VkIHRvIHNlZWQgdGhlIGhhc2hlcyBvZiBzdHIsCisgICBieXRlcyBhbmQgZGF0ZXRpbWUgb2JqZWN0cy4KKworICAgSWYgOmVudnZhcjpgUFlUSE9OSEFTSFNFRURgIGlzIHNldCB0byBhbiBpbnRlZ2VyIHZhbHVlLCBpdCBpcyB1c2VkIGFzIGEKKyAgIGZpeGVkIHNlZWQgZm9yIGdlbmVyYXRpbmcgdGhlIGhhc2goKSBvZiB0aGUgdHlwZXMgY292ZXJlZCBieSB0aGUgaGFzaAorICAgcmFuZG9taXphdGlvbi4KKworICAgSXRzIHB1cnBvc2UgaXMgdG8gYWxsb3cgcmVwZWF0YWJsZSBoYXNoaW5nLCBzdWNoIGFzIGZvciBzZWxmdGVzdHMgZm9yIHRoZQorICAgaW50ZXJwcmV0ZXIgaXRzZWxmLCBvciB0byBhbGxvdyBhIGNsdXN0ZXIgb2YgcHl0aG9uIHByb2Nlc3NlcyB0byBzaGFyZSBoYXNoCisgICB2YWx1ZXMuCisKKyAgIFRoZSBpbnRlZ2VyIG11c3QgYmUgYSBkZWNpbWFsIG51bWJlciBpbiB0aGUgcmFuZ2UgWzAsNDI5NDk2NzI5NV0uCisgICBTcGVjaWZ5aW5nIHRoZSB2YWx1ZSAwIHdpbGwgbGVhZCB0byB0aGUgc2FtZSBoYXNoIHZhbHVlcyBhcyB3aGVuIGhhc2gKKyAgIHJhbmRvbWl6YXRpb24gaXMgZGlzYWJsZWQuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNi44CisKKwogLi4gZW52dmFyOjogUFlUSE9OSU9FTkNPRElORwogCiAgICBPdmVycmlkZXMgdGhlIGVuY29kaW5nIHVzZWQgZm9yIHN0ZGluL3N0ZG91dC9zdGRlcnIsIGluIHRoZSBzeW50YXgKQEAgLTU5Myw0ICs2MzIsMyBAQAogCiAgICBJZiBzZXQsIFB5dGhvbiB3aWxsIHByaW50IG1lbW9yeSBhbGxvY2F0aW9uIHN0YXRpc3RpY3MgZXZlcnkgdGltZSBhIG5ldwogICAgb2JqZWN0IGFyZW5hIGlzIGNyZWF0ZWQsIGFuZCBvbiBzaHV0ZG93bi4KLQpkaWZmIC0tZ2l0IGEvRG9jL3VzaW5nL21hYy5yc3QgYi9Eb2MvdXNpbmcvbWFjLnJzdAppbmRleCBjNWY3ZjJkLi41ZjI5ODEyIDEwMDY0NAotLS0gYS9Eb2MvdXNpbmcvbWFjLnJzdAorKysgYi9Eb2MvdXNpbmcvbWFjLnJzdApAQCAtMjUsMTQgKzI1LDE0IEBACiBHZXR0aW5nIGFuZCBJbnN0YWxsaW5nIE1hY1B5dGhvbgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotTWFjIE9TIFggMTAuNSBjb21lcyB3aXRoIFB5dGhvbiAyLjUuMSBwcmUtaW5zdGFsbGVkIGJ5IEFwcGxlLiAgSWYgeW91IHdpc2gsIHlvdQorTWFjIE9TIFggMTAuOCBjb21lcyB3aXRoIFB5dGhvbiAyLjcgcHJlLWluc3RhbGxlZCBieSBBcHBsZS4gIElmIHlvdSB3aXNoLCB5b3UKIGFyZSBpbnZpdGVkIHRvIGluc3RhbGwgdGhlIG1vc3QgcmVjZW50IHZlcnNpb24gb2YgUHl0aG9uIGZyb20gdGhlIFB5dGhvbiB3ZWJzaXRlCiAoaHR0cDovL3d3dy5weXRob24ub3JnKS4gIEEgY3VycmVudCAidW5pdmVyc2FsIGJpbmFyeSIgYnVpbGQgb2YgUHl0aG9uLCB3aGljaAogcnVucyBuYXRpdmVseSBvbiB0aGUgTWFjJ3MgbmV3IEludGVsIGFuZCBsZWdhY3kgUFBDIENQVSdzLCBpcyBhdmFpbGFibGUgdGhlcmUuCiAKIFdoYXQgeW91IGdldCBhZnRlciBpbnN0YWxsaW5nIGlzIGEgbnVtYmVyIG9mIHRoaW5nczoKIAotKiBBIDpmaWxlOmBNYWNQeXRob24gMi41YCBmb2xkZXIgaW4geW91ciA6ZmlsZTpgQXBwbGljYXRpb25zYCBmb2xkZXIuIEluIGhlcmUKKyogQSA6ZmlsZTpgTWFjUHl0aG9uIDIuN2AgZm9sZGVyIGluIHlvdXIgOmZpbGU6YEFwcGxpY2F0aW9uc2AgZm9sZGVyLiBJbiBoZXJlCiAgIHlvdSBmaW5kIElETEUsIHRoZSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCB0aGF0IGlzIGEgc3RhbmRhcmQgcGFydCBvZiBvZmZpY2lhbAogICBQeXRob24gZGlzdHJpYnV0aW9uczsgUHl0aG9uTGF1bmNoZXIsIHdoaWNoIGhhbmRsZXMgZG91YmxlLWNsaWNraW5nIFB5dGhvbgogICBzY3JpcHRzIGZyb20gdGhlIEZpbmRlcjsgYW5kIHRoZSAiQnVpbGQgQXBwbGV0IiB0b29sLCB3aGljaCBhbGxvd3MgeW91IHRvCkBAIC0xMDAsNyArMTAwLDcgQEAKIGFueXRoaW5nIHRoYXQgaGFzIGEgR1VJKSBuZWVkIHRvIGJlIHJ1biBpbiBhIHNwZWNpYWwgd2F5LiBVc2UgOnByb2dyYW06YHB5dGhvbndgCiBpbnN0ZWFkIG9mIDpwcm9ncmFtOmBweXRob25gIHRvIHN0YXJ0IHN1Y2ggc2NyaXB0cy4KIAotV2l0aCBQeXRob24gMi41LCB5b3UgY2FuIHVzZSBlaXRoZXIgOnByb2dyYW06YHB5dGhvbmAgb3IgOnByb2dyYW06YHB5dGhvbndgLgorV2l0aCBQeXRob24gMi43LCB5b3UgY2FuIHVzZSBlaXRoZXIgOnByb2dyYW06YHB5dGhvbmAgb3IgOnByb2dyYW06YHB5dGhvbndgLgogCiAKIENvbmZpZ3VyYXRpb24KQEAgLTEzMywxMyArMTMzLDExIEBACiAKIFRoZXJlIGFyZSBzZXZlcmFsIG1ldGhvZHMgdG8gaW5zdGFsbCBhZGRpdGlvbmFsIFB5dGhvbiBwYWNrYWdlczoKIAotKiBodHRwOi8vcHl0aG9ubWFjLm9yZy9wYWNrYWdlcy8gY29udGFpbnMgc2VsZWN0ZWQgY29tcGlsZWQgcGFja2FnZXMgZm9yIFB5dGhvbgotICAyLjUsIDIuNCwgYW5kIDIuMy4KLQogKiBQYWNrYWdlcyBjYW4gYmUgaW5zdGFsbGVkIHZpYSB0aGUgc3RhbmRhcmQgUHl0aG9uIGRpc3R1dGlscyBtb2RlIChgYHB5dGhvbgogICBzZXR1cC5weSBpbnN0YWxsYGApLgogCi0qIE1hbnkgcGFja2FnZXMgY2FuIGFsc28gYmUgaW5zdGFsbGVkIHZpYSB0aGUgOnByb2dyYW06YHNldHVwdG9vbHNgIGV4dGVuc2lvbi4KKyogTWFueSBwYWNrYWdlcyBjYW4gYWxzbyBiZSBpbnN0YWxsZWQgdmlhIHRoZSA6cHJvZ3JhbTpgc2V0dXB0b29sc2AgZXh0ZW5zaW9uCisgIG9yIDpwcm9ncmFtOmBwaXBgIHdyYXBwZXIsIHNlZSBodHRwOi8vd3d3LnBpcC1pbnN0YWxsZXIub3JnLy4KIAogCiBHVUkgUHJvZ3JhbW1pbmcgb24gdGhlIE1hYwpAQCAtMTY3LDcgKzE2NSw3IEBACiBEaXN0cmlidXRpbmcgUHl0aG9uIEFwcGxpY2F0aW9ucyBvbiB0aGUgTWFjCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLVRoZSAiQnVpbGQgQXBwbGV0IiB0b29sIHRoYXQgaXMgcGxhY2VkIGluIHRoZSBNYWNQeXRob24gMi41IGZvbGRlciBpcyBmaW5lIGZvcgorVGhlICJCdWlsZCBBcHBsZXQiIHRvb2wgdGhhdCBpcyBwbGFjZWQgaW4gdGhlIE1hY1B5dGhvbiAyLjcgZm9sZGVyIGlzIGZpbmUgZm9yCiBwYWNrYWdpbmcgc21hbGwgUHl0aG9uIHNjcmlwdHMgb24geW91ciBvd24gbWFjaGluZSB0byBydW4gYXMgYSBzdGFuZGFyZCBNYWMKIGFwcGxpY2F0aW9uLiBUaGlzIHRvb2wsIGhvd2V2ZXIsIGlzIG5vdCByb2J1c3QgZW5vdWdoIHRvIGRpc3RyaWJ1dGUgUHl0aG9uCiBhcHBsaWNhdGlvbnMgdG8gb3RoZXIgdXNlcnMuCkBAIC0xNzcsMjAgKzE3NSw2IEBACiBhdCBodHRwOi8vdW5kZWZpbmVkLm9yZy9weXRob24vI3B5MmFwcC4KIAogCi1BcHBsaWNhdGlvbiBTY3JpcHRpbmcKLT09PT09PT09PT09PT09PT09PT09PQotCi1QeXRob24gY2FuIGFsc28gYmUgdXNlZCB0byBzY3JpcHQgb3RoZXIgTWFjIGFwcGxpY2F0aW9ucyB2aWEgQXBwbGUncyBPcGVuCi1TY3JpcHRpbmcgQXJjaGl0ZWN0dXJlIChPU0EpOyBzZWUgaHR0cDovL2FwcHNjcmlwdC5zb3VyY2Vmb3JnZS5uZXQuIEFwcHNjcmlwdCBpcwotYSBoaWdoLWxldmVsLCB1c2VyLWZyaWVuZGx5IEFwcGxlIGV2ZW50IGJyaWRnZSB0aGF0IGFsbG93cyB5b3UgdG8gY29udHJvbAotc2NyaXB0YWJsZSBNYWMgT1MgWCBhcHBsaWNhdGlvbnMgdXNpbmcgb3JkaW5hcnkgUHl0aG9uIHNjcmlwdHMuIEFwcHNjcmlwdCBtYWtlcwotUHl0aG9uIGEgc2VyaW91cyBhbHRlcm5hdGl2ZSB0byBBcHBsZSdzIG93biAqQXBwbGVTY3JpcHQqIGxhbmd1YWdlIGZvcgotYXV0b21hdGluZyB5b3VyIE1hYy4gQSByZWxhdGVkIHBhY2thZ2UsICpQeU9TQSosIGlzIGFuIE9TQSBsYW5ndWFnZSBjb21wb25lbnQKLWZvciB0aGUgUHl0aG9uIHNjcmlwdGluZyBsYW5ndWFnZSwgYWxsb3dpbmcgUHl0aG9uIGNvZGUgdG8gYmUgZXhlY3V0ZWQgYnkgYW55Ci1PU0EtZW5hYmxlZCBhcHBsaWNhdGlvbiAoU2NyaXB0IEVkaXRvciwgTWFpbCwgaVR1bmVzLCBldGMuKS4gUHlPU0EgbWFrZXMgUHl0aG9uCi1hIGZ1bGwgcGVlciB0byBBcHBsZVNjcmlwdC4KLQotCiBPdGhlciBSZXNvdXJjZXMKID09PT09PT09PT09PT09PQogCmRpZmYgLS1naXQgYS9Eb2MvdXNpbmcvdW5peC5yc3QgYi9Eb2MvdXNpbmcvdW5peC5yc3QKaW5kZXggODA2MGQ0MS4uZWM1YWM2YyAxMDA2NDQKLS0tIGEvRG9jL3VzaW5nL3VuaXgucnN0CisrKyBiL0RvYy91c2luZy91bml4LnJzdApAQCAtMjYsMTEgKzI2LDExIEBACiAKIC4uIHNlZWFsc286OgogCi0gICBodHRwOi8vd3d3LmxpbnV4LmNvbS9hcnRpY2xlcy82MDM4MworICAgaHR0cDovL3d3dy5kZWJpYW4ub3JnL2RvYy9tYW51YWxzL21haW50LWd1aWRlL2ZpcnN0LmVuLmh0bWwKICAgICAgIGZvciBEZWJpYW4gdXNlcnMKLSAgIGh0dHA6Ly9saW51eG1hZmlhLmNvbS9wdWIvbGludXgvc3VzZS1saW51eC1pbnRlcm5hbHMvY2hhcHRlcjM1Lmh0bWwKKyAgIGh0dHA6Ly9lbi5vcGVuc3VzZS5vcmcvUG9ydGFsOlBhY2thZ2luZwogICAgICAgZm9yIE9wZW5TdXNlIHVzZXJzCi0gICBodHRwOi8vZG9jcy5mZWRvcmFwcm9qZWN0Lm9yZy9kcmFmdHMvcnBtLWd1aWRlLWVuL2NoLWNyZWF0aW5nLXJwbXMuaHRtbAorICAgaHR0cDovL2RvY3MuZmVkb3JhcHJvamVjdC5vcmcvZW4tVVMvRmVkb3JhX0RyYWZ0X0RvY3VtZW50YXRpb24vMC4xL2h0bWwvUlBNX0d1aWRlL2NoLWNyZWF0aW5nLXJwbXMuaHRtbAogICAgICAgZm9yIEZlZG9yYSB1c2VycwogICAgaHR0cDovL3d3dy5zbGFja2Jvb2sub3JnL2h0bWwvcGFja2FnZS1tYW5hZ2VtZW50LW1ha2luZy1wYWNrYWdlcy5odG1sCiAgICAgICBmb3IgU2xhY2t3YXJlIHVzZXJzCkBAIC0xNDUsNyArMTQ1LDcgQEAKICogaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9weXRob24tbW9kZQogCiBHZWFueSBpcyBhbiBleGNlbGxlbnQgSURFIHdpdGggc3VwcG9ydCBmb3IgYSBsb3Qgb2YgbGFuZ3VhZ2VzLiBGb3IgbW9yZQotaW5mb3JtYXRpb24sIHJlYWQ6IGh0dHA6Ly9nZWFueS51dmVuYS5kZS8KK2luZm9ybWF0aW9uLCByZWFkOiBodHRwOi8vd3d3LmdlYW55Lm9yZy8KIAogS29tb2RvIGVkaXQgaXMgYW5vdGhlciBleHRyZW1lbHkgZ29vZCBJREUuICBJdCBhbHNvIGhhcyBzdXBwb3J0IGZvciBhIGxvdCBvZgogbGFuZ3VhZ2VzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVhZDoKZGlmZiAtLWdpdCBhL0RvYy91c2luZy93aW5kb3dzLnJzdCBiL0RvYy91c2luZy93aW5kb3dzLnJzdAppbmRleCA5Nzg0NDBjLi5iNDliYTdiIDEwMDY0NAotLS0gYS9Eb2MvdXNpbmcvd2luZG93cy5yc3QKKysrIGIvRG9jL3VzaW5nL3dpbmRvd3MucnN0CkBAIC04NCw2ICs4NCw4IEBACiBzZXR0aW5ncyBpbiBXaW5kb3dzLgogCiAKKy4uIF9zZXR0aW5nLWVudnZhcnM6CisKIEV4Y3Vyc3VzOiBTZXR0aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKZGlmZiAtLWdpdCBhL0RvYy93aGF0c25ldy8yLjIucnN0IGIvRG9jL3doYXRzbmV3LzIuMi5yc3QKaW5kZXggODllNGQ3Ni4uNWY2ZmUxMSAxMDA2NDQKLS0tIGEvRG9jL3doYXRzbmV3LzIuMi5yc3QKKysrIGIvRG9jL3doYXRzbmV3LzIuMi5yc3QKQEAgLTQ1MCw5ICs0NTAsOSBAQAogUHl0aG9uIGNsYXNzZXMgY2FuIGRlZmluZSBhbiA6bWV0aDpgX19pdGVyX19gIG1ldGhvZCwgd2hpY2ggc2hvdWxkIGNyZWF0ZSBhbmQKIHJldHVybiBhIG5ldyBpdGVyYXRvciBmb3IgdGhlIG9iamVjdDsgaWYgdGhlIG9iamVjdCBpcyBpdHMgb3duIGl0ZXJhdG9yLCB0aGlzCiBtZXRob2QgY2FuIGp1c3QgcmV0dXJuIGBgc2VsZmBgLiAgSW4gcGFydGljdWxhciwgaXRlcmF0b3JzIHdpbGwgdXN1YWxseSBiZSB0aGVpcgotb3duIGl0ZXJhdG9ycy4gIEV4dGVuc2lvbiB0eXBlcyBpbXBsZW1lbnRlZCBpbiBDIGNhbiBpbXBsZW1lbnQgYSA6YXR0cjpgdHBfaXRlcmAKK293biBpdGVyYXRvcnMuICBFeHRlbnNpb24gdHlwZXMgaW1wbGVtZW50ZWQgaW4gQyBjYW4gaW1wbGVtZW50IGEgOmM6bWVtYmVyOmB+UHlUeXBlT2JqZWN0LnRwX2l0ZXJgCiBmdW5jdGlvbiBpbiBvcmRlciB0byByZXR1cm4gYW4gaXRlcmF0b3IsIGFuZCBleHRlbnNpb24gdHlwZXMgdGhhdCB3YW50IHRvIGJlaGF2ZQotYXMgaXRlcmF0b3JzIGNhbiBkZWZpbmUgYSA6YXR0cjpgdHBfaXRlcm5leHRgIGZ1bmN0aW9uLgorYXMgaXRlcmF0b3JzIGNhbiBkZWZpbmUgYSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfaXRlcm5leHRgIGZ1bmN0aW9uLgogCiBTbywgYWZ0ZXIgYWxsIHRoaXMsIHdoYXQgZG8gaXRlcmF0b3JzIGFjdHVhbGx5IGRvPyAgVGhleSBoYXZlIG9uZSByZXF1aXJlZAogbWV0aG9kLCA6bWV0aDpgbmV4dGAsIHdoaWNoIHRha2VzIG5vIGFyZ3VtZW50cyBhbmQgcmV0dXJucyB0aGUgbmV4dCB2YWx1ZS4gIFdoZW4KQEAgLTQ3OCw3ICs0NzgsNyBAQAogSW4gMi4yLCBQeXRob24ncyA6a2V5d29yZDpgZm9yYCBzdGF0ZW1lbnQgbm8gbG9uZ2VyIGV4cGVjdHMgYSBzZXF1ZW5jZTsgaXQKIGV4cGVjdHMgc29tZXRoaW5nIGZvciB3aGljaCA6ZnVuYzpgaXRlcmAgd2lsbCByZXR1cm4gYW4gaXRlcmF0b3IuIEZvciBiYWNrd2FyZAogY29tcGF0aWJpbGl0eSBhbmQgY29udmVuaWVuY2UsIGFuIGl0ZXJhdG9yIGlzIGF1dG9tYXRpY2FsbHkgY29uc3RydWN0ZWQgZm9yCi1zZXF1ZW5jZXMgdGhhdCBkb24ndCBpbXBsZW1lbnQgOm1ldGg6YF9faXRlcl9fYCBvciBhIDphdHRyOmB0cF9pdGVyYCBzbG90LCBzbworc2VxdWVuY2VzIHRoYXQgZG9uJ3QgaW1wbGVtZW50IDptZXRoOmBfX2l0ZXJfX2Agb3IgYSA6YzptZW1iZXI6YH5QeVR5cGVPYmplY3QudHBfaXRlcmAgc2xvdCwgc28KIGBgZm9yIGkgaW4gWzEsMiwzXWBgIHdpbGwgc3RpbGwgd29yay4gIFdoZXJldmVyIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgbG9vcHMKIG92ZXIgYSBzZXF1ZW5jZSwgaXQncyBiZWVuIGNoYW5nZWQgdG8gdXNlIHRoZSBpdGVyYXRvciBwcm90b2NvbC4gIFRoaXMgbWVhbnMgeW91CiBjYW4gZG8gdGhpbmdzIGxpa2UgdGhpczo6CkBAIC03NTQsNyArNzU0LDcgQEAKIAogKiBDbGFzc2VzIGNhbiBkZWZpbmUgbWV0aG9kcyBjYWxsZWQgOm1ldGg6YF9fdHJ1ZWRpdl9fYCBhbmQgOm1ldGg6YF9fZmxvb3JkaXZfX2AKICAgdG8gb3ZlcmxvYWQgdGhlIHR3byBkaXZpc2lvbiBvcGVyYXRvcnMuICBBdCB0aGUgQyBsZXZlbCwgdGhlcmUgYXJlIGFsc28gc2xvdHMgaW4KLSAgdGhlIDpjdHlwZTpgUHlOdW1iZXJNZXRob2RzYCBzdHJ1Y3R1cmUgc28gZXh0ZW5zaW9uIHR5cGVzIGNhbiBkZWZpbmUgdGhlIHR3bworICB0aGUgOmM6dHlwZTpgUHlOdW1iZXJNZXRob2RzYCBzdHJ1Y3R1cmUgc28gZXh0ZW5zaW9uIHR5cGVzIGNhbiBkZWZpbmUgdGhlIHR3bwogICBvcGVyYXRvcnMuCiAKICogUHl0aG9uIDIuMiBzdXBwb3J0cyBzb21lIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgZm9yIHRlc3Rpbmcgd2hldGhlciBjb2RlIHdpbGwKQEAgLTk4Myw3ICs5ODMsNyBAQAogICBKdW4taWNoaXJvICJpdG9qdW4iIEhhZ2luby4pCiAKICogVHdvIG5ldyBmb3JtYXQgY2hhcmFjdGVycyB3ZXJlIGFkZGVkIHRvIHRoZSA6bW9kOmBzdHJ1Y3RgIG1vZHVsZSBmb3IgNjQtYml0Ci0gIGludGVnZXJzIG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgdGhlIEMgOmN0eXBlOmBsb25nIGxvbmdgIHR5cGUuICBgYHFgYCBpcyBmb3IKKyAgaW50ZWdlcnMgb24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCB0aGUgQyA6Yzp0eXBlOmBsb25nIGxvbmdgIHR5cGUuICBgYHFgYCBpcyBmb3IKICAgYSBzaWduZWQgNjQtYml0IGludGVnZXIsIGFuZCBgYFFgYCBpcyBmb3IgYW4gdW5zaWduZWQgb25lLiAgVGhlIHZhbHVlIGlzCiAgIHJldHVybmVkIGluIFB5dGhvbidzIGxvbmcgaW50ZWdlciB0eXBlLiAgKENvbnRyaWJ1dGVkIGJ5IFRpbSBQZXRlcnMuKQogCkBAIC0xMDU3LDE2ICsxMDU3LDE2IEBACiAgIGF0IG11Y2ggaGlnaGVyIHNwZWVkcyB0aGFuIFB5dGhvbi1iYXNlZCBmdW5jdGlvbnMgYW5kIHNob3VsZCByZWR1Y2UgdGhlIG92ZXJoZWFkCiAgIG9mIHByb2ZpbGluZyBhbmQgdHJhY2luZy4gIFRoaXMgIHdpbGwgYmUgb2YgaW50ZXJlc3QgdG8gYXV0aG9ycyBvZiBkZXZlbG9wbWVudAogICBlbnZpcm9ubWVudHMgZm9yIFB5dGhvbi4gIFR3byBuZXcgQyBmdW5jdGlvbnMgd2VyZSBhZGRlZCB0byBQeXRob24ncyBBUEksCi0gIDpjZnVuYzpgUHlFdmFsX1NldFByb2ZpbGVgIGFuZCA6Y2Z1bmM6YFB5RXZhbF9TZXRUcmFjZWAuIFRoZSBleGlzdGluZworICA6YzpmdW5jOmBQeUV2YWxfU2V0UHJvZmlsZWAgYW5kIDpjOmZ1bmM6YFB5RXZhbF9TZXRUcmFjZWAuIFRoZSBleGlzdGluZwogICA6ZnVuYzpgc3lzLnNldHByb2ZpbGVgIGFuZCA6ZnVuYzpgc3lzLnNldHRyYWNlYCBmdW5jdGlvbnMgc3RpbGwgZXhpc3QsIGFuZCBoYXZlCiAgIHNpbXBseSBiZWVuIGNoYW5nZWQgdG8gdXNlIHRoZSBuZXcgQy1sZXZlbCBpbnRlcmZhY2UuICAoQ29udHJpYnV0ZWQgYnkgRnJlZCBMLgogICBEcmFrZSwgSnIuKQogCiAqIEFub3RoZXIgbG93LWxldmVsIEFQSSwgcHJpbWFyaWx5IG9mIGludGVyZXN0IHRvIGltcGxlbWVudG9ycyBvZiBQeXRob24KLSAgZGVidWdnZXJzIGFuZCBkZXZlbG9wbWVudCB0b29scywgd2FzIGFkZGVkLiA6Y2Z1bmM6YFB5SW50ZXJwcmV0ZXJTdGF0ZV9IZWFkYCBhbmQKLSAgOmNmdW5jOmBQeUludGVycHJldGVyU3RhdGVfTmV4dGAgbGV0IGEgY2FsbGVyIHdhbGsgdGhyb3VnaCBhbGwgdGhlIGV4aXN0aW5nCi0gIGludGVycHJldGVyIG9iamVjdHM7IDpjZnVuYzpgUHlJbnRlcnByZXRlclN0YXRlX1RocmVhZEhlYWRgIGFuZAotICA6Y2Z1bmM6YFB5VGhyZWFkU3RhdGVfTmV4dGAgYWxsb3cgbG9vcGluZyBvdmVyIGFsbCB0aGUgdGhyZWFkIHN0YXRlcyBmb3IgYSBnaXZlbgorICBkZWJ1Z2dlcnMgYW5kIGRldmVsb3BtZW50IHRvb2xzLCB3YXMgYWRkZWQuIDpjOmZ1bmM6YFB5SW50ZXJwcmV0ZXJTdGF0ZV9IZWFkYCBhbmQKKyAgOmM6ZnVuYzpgUHlJbnRlcnByZXRlclN0YXRlX05leHRgIGxldCBhIGNhbGxlciB3YWxrIHRocm91Z2ggYWxsIHRoZSBleGlzdGluZworICBpbnRlcnByZXRlciBvYmplY3RzOyA6YzpmdW5jOmBQeUludGVycHJldGVyU3RhdGVfVGhyZWFkSGVhZGAgYW5kCisgIDpjOmZ1bmM6YFB5VGhyZWFkU3RhdGVfTmV4dGAgYWxsb3cgbG9vcGluZyBvdmVyIGFsbCB0aGUgdGhyZWFkIHN0YXRlcyBmb3IgYSBnaXZlbgogICBpbnRlcnByZXRlci4gIChDb250cmlidXRlZCBieSBEYXZpZCBCZWF6bGV5LikKIAogKiBUaGUgQy1sZXZlbCBpbnRlcmZhY2UgdG8gdGhlIGdhcmJhZ2UgY29sbGVjdG9yIGhhcyBiZWVuIGNoYW5nZWQgdG8gbWFrZSBpdApAQCAtMTA3OCwxOSArMTA3OCwxOSBAQAogCiAgIFRvIHVwZ3JhZGUgYW4gZXh0ZW5zaW9uIG1vZHVsZSB0byB0aGUgbmV3IEFQSSwgcGVyZm9ybSB0aGUgZm9sbG93aW5nIHN0ZXBzOgogCi0qIFJlbmFtZSA6Y2Z1bmM6YFB5X1RQRkxBR1NfR0NgIHRvIDpjZnVuYzpgUHlUUEZMQUdTX0hBVkVfR0NgLgorKiBSZW5hbWUgOmM6ZnVuYzpgUHlfVFBGTEFHU19HQ2AgdG8gOmM6ZnVuYzpgUHlUUEZMQUdTX0hBVkVfR0NgLgogCi0qIFVzZSA6Y2Z1bmM6YFB5T2JqZWN0X0dDX05ld2Agb3IgOmNmdW5jOmBQeU9iamVjdF9HQ19OZXdWYXJgIHRvIGFsbG9jYXRlCi0gICAgb2JqZWN0cywgYW5kIDpjZnVuYzpgUHlPYmplY3RfR0NfRGVsYCB0byBkZWFsbG9jYXRlIHRoZW0uCisqIFVzZSA6YzpmdW5jOmBQeU9iamVjdF9HQ19OZXdgIG9yIDpjOmZ1bmM6YFB5T2JqZWN0X0dDX05ld1ZhcmAgdG8gYWxsb2NhdGUKKyAgICBvYmplY3RzLCBhbmQgOmM6ZnVuYzpgUHlPYmplY3RfR0NfRGVsYCB0byBkZWFsbG9jYXRlIHRoZW0uCiAKLSogUmVuYW1lIDpjZnVuYzpgUHlPYmplY3RfR0NfSW5pdGAgdG8gOmNmdW5jOmBQeU9iamVjdF9HQ19UcmFja2AgYW5kCi0gICAgOmNmdW5jOmBQeU9iamVjdF9HQ19GaW5pYCB0byA6Y2Z1bmM6YFB5T2JqZWN0X0dDX1VuVHJhY2tgLgorKiBSZW5hbWUgOmM6ZnVuYzpgUHlPYmplY3RfR0NfSW5pdGAgdG8gOmM6ZnVuYzpgUHlPYmplY3RfR0NfVHJhY2tgIGFuZAorICAgIDpjOmZ1bmM6YFB5T2JqZWN0X0dDX0ZpbmlgIHRvIDpjOmZ1bmM6YFB5T2JqZWN0X0dDX1VuVHJhY2tgLgogCi0qIFJlbW92ZSA6Y2Z1bmM6YFB5R0NfSEVBRF9TSVpFYCBmcm9tIG9iamVjdCBzaXplIGNhbGN1bGF0aW9ucy4KKyogUmVtb3ZlIDpjOmZ1bmM6YFB5R0NfSEVBRF9TSVpFYCBmcm9tIG9iamVjdCBzaXplIGNhbGN1bGF0aW9ucy4KIAotKiBSZW1vdmUgY2FsbHMgdG8gOmNmdW5jOmBQeU9iamVjdF9BU19HQ2AgYW5kIDpjZnVuYzpgUHlPYmplY3RfRlJPTV9HQ2AuCisqIFJlbW92ZSBjYWxscyB0byA6YzpmdW5jOmBQeU9iamVjdF9BU19HQ2AgYW5kIDpjOmZ1bmM6YFB5T2JqZWN0X0ZST01fR0NgLgogCi0qIEEgbmV3IGBgZXRgYCBmb3JtYXQgc2VxdWVuY2Ugd2FzIGFkZGVkIHRvIDpjZnVuYzpgUHlBcmdfUGFyc2VUdXBsZWA7IGBgZXRgYAorKiBBIG5ldyBgYGV0YGAgZm9ybWF0IHNlcXVlbmNlIHdhcyBhZGRlZCB0byA6YzpmdW5jOmBQeUFyZ19QYXJzZVR1cGxlYDsgYGBldGBgCiAgIHRha2VzIGJvdGggYSBwYXJhbWV0ZXIgYW5kIGFuIGVuY29kaW5nIG5hbWUsIGFuZCBjb252ZXJ0cyB0aGUgcGFyYW1ldGVyIHRvIHRoZQogICBnaXZlbiBlbmNvZGluZyBpZiB0aGUgcGFyYW1ldGVyIHR1cm5zIG91dCB0byBiZSBhIFVuaWNvZGUgc3RyaW5nLCBvciBsZWF2ZXMgaXQKICAgYWxvbmUgaWYgaXQncyBhbiA4LWJpdCBzdHJpbmcsIGFzc3VtaW5nIGl0IHRvIGFscmVhZHkgYmUgaW4gdGhlIGRlc2lyZWQKQEAgLTEwOTksMTAgKzEwOTksMTAgQEAKICAgc3BlY2lmaWVkIG5ldyBlbmNvZGluZy4gKENvbnRyaWJ1dGVkIGJ5IE0uLUEuIExlbWJ1cmcsIGFuZCB1c2VkIGZvciB0aGUgTUJDUwogICBzdXBwb3J0IG9uIFdpbmRvd3MgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbi4pCiAKLSogQSBkaWZmZXJlbnQgYXJndW1lbnQgcGFyc2luZyBmdW5jdGlvbiwgOmNmdW5jOmBQeUFyZ19VbnBhY2tUdXBsZWAsIGhhcyBiZWVuCisqIEEgZGlmZmVyZW50IGFyZ3VtZW50IHBhcnNpbmcgZnVuY3Rpb24sIDpjOmZ1bmM6YFB5QXJnX1VucGFja1R1cGxlYCwgaGFzIGJlZW4KICAgYWRkZWQgdGhhdCdzIHNpbXBsZXIgYW5kIHByZXN1bWFibHkgZmFzdGVyLiAgSW5zdGVhZCBvZiBzcGVjaWZ5aW5nIGEgZm9ybWF0CiAgIHN0cmluZywgdGhlIGNhbGxlciBzaW1wbHkgZ2l2ZXMgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gbnVtYmVyIG9mIGFyZ3VtZW50cwotICBleHBlY3RlZCwgYW5kIGEgc2V0IG9mIHBvaW50ZXJzIHRvIDpjdHlwZTpgUHlPYmplY3RcKmAgdmFyaWFibGVzIHRoYXQgd2lsbCBiZQorICBleHBlY3RlZCwgYW5kIGEgc2V0IG9mIHBvaW50ZXJzIHRvIDpjOnR5cGU6YFB5T2JqZWN0XCpgIHZhcmlhYmxlcyB0aGF0IHdpbGwgYmUKICAgZmlsbGVkIGluIHdpdGggYXJndW1lbnQgdmFsdWVzLgogCiAqIFR3byBuZXcgZmxhZ3MgOmNvbnN0OmBNRVRIX05PQVJHU2AgYW5kIDpjb25zdDpgTUVUSF9PYCBhcmUgYXZhaWxhYmxlIGluIG1ldGhvZApAQCAtMTExMSwxNCArMTExMSwxNCBAQAogICBjb3JyZXNwb25kaW5nIG1ldGhvZCB0aGF0IHVzZXMgOmNvbnN0OmBNRVRIX1ZBUkFSR1NgLiAgQWxzbywgdGhlIG9sZAogICA6Y29uc3Q6YE1FVEhfT0xEQVJHU2Agc3R5bGUgb2Ygd3JpdGluZyBDIG1ldGhvZHMgaXMgIG5vdyBvZmZpY2lhbGx5IGRlcHJlY2F0ZWQuCiAKLSogVHdvIG5ldyB3cmFwcGVyIGZ1bmN0aW9ucywgOmNmdW5jOmBQeU9TX3NucHJpbnRmYCBhbmQgOmNmdW5jOmBQeU9TX3ZzbnByaW50ZmAKKyogVHdvIG5ldyB3cmFwcGVyIGZ1bmN0aW9ucywgOmM6ZnVuYzpgUHlPU19zbnByaW50ZmAgYW5kIDpjOmZ1bmM6YFB5T1NfdnNucHJpbnRmYAogICB3ZXJlIGFkZGVkIHRvIHByb3ZpZGUgIGNyb3NzLXBsYXRmb3JtIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIHJlbGF0aXZlbHkgbmV3Ci0gIDpjZnVuYzpgc25wcmludGZgIGFuZCA6Y2Z1bmM6YHZzbnByaW50ZmAgQyBsaWIgQVBJcy4gSW4gY29udHJhc3QgdG8gdGhlIHN0YW5kYXJkCi0gIDpjZnVuYzpgc3ByaW50ZmAgYW5kIDpjZnVuYzpgdnNwcmludGZgIGZ1bmN0aW9ucywgdGhlIFB5dGhvbiB2ZXJzaW9ucyBjaGVjayB0aGUKKyAgOmM6ZnVuYzpgc25wcmludGZgIGFuZCA6YzpmdW5jOmB2c25wcmludGZgIEMgbGliIEFQSXMuIEluIGNvbnRyYXN0IHRvIHRoZSBzdGFuZGFyZAorICA6YzpmdW5jOmBzcHJpbnRmYCBhbmQgOmM6ZnVuYzpgdnNwcmludGZgIGZ1bmN0aW9ucywgdGhlIFB5dGhvbiB2ZXJzaW9ucyBjaGVjayB0aGUKICAgYm91bmRzIG9mIHRoZSBidWZmZXIgdXNlZCB0byBwcm90ZWN0IGFnYWluc3QgYnVmZmVyIG92ZXJydW5zLiAoQ29udHJpYnV0ZWQgYnkKICAgTS4tQS4gTGVtYnVyZy4pCiAKLSogVGhlIDpjZnVuYzpgX1B5VHVwbGVfUmVzaXplYCBmdW5jdGlvbiBoYXMgbG9zdCBhbiB1bnVzZWQgcGFyYW1ldGVyLCBzbyBub3cgaXQKKyogVGhlIDpjOmZ1bmM6YF9QeVR1cGxlX1Jlc2l6ZWAgZnVuY3Rpb24gaGFzIGxvc3QgYW4gdW51c2VkIHBhcmFtZXRlciwgc28gbm93IGl0CiAgIHRha2VzIDIgcGFyYW1ldGVycyBpbnN0ZWFkIG9mIDMuICBUaGUgdGhpcmQgYXJndW1lbnQgd2FzIG5ldmVyIHVzZWQsIGFuZCBjYW4KICAgc2ltcGx5IGJlIGRpc2NhcmRlZCB3aGVuIHBvcnRpbmcgY29kZSBmcm9tIGVhcmxpZXIgdmVyc2lvbnMgdG8gUHl0aG9uIDIuMi4KIApAQCAtMTIxOSw3ICsxMjE5LDcgQEAKICAgb3BlcmF0b3IsIGJ1dCB0aGVzZSBmZWF0dXJlcyB3ZXJlIHJhcmVseSB1c2VkIGFuZCB0aGVyZWZvcmUgYnVnZ3kuICBUaGUKICAgOm1ldGg6YHRvbGlzdGAgbWV0aG9kIGFuZCB0aGUgOmF0dHI6YHN0YXJ0YCwgOmF0dHI6YHN0b3BgLCBhbmQgOmF0dHI6YHN0ZXBgCiAgIGF0dHJpYnV0ZXMgYXJlIGFsc28gYmVpbmcgZGVwcmVjYXRlZC4gIEF0IHRoZSBDIGxldmVsLCB0aGUgZm91cnRoIGFyZ3VtZW50IHRvCi0gIHRoZSA6Y2Z1bmM6YFB5UmFuZ2VfTmV3YCBmdW5jdGlvbiwgYGByZXBlYXRgYCwgaGFzIGFsc28gYmVlbiBkZXByZWNhdGVkLgorICB0aGUgOmM6ZnVuYzpgUHlSYW5nZV9OZXdgIGZ1bmN0aW9uLCBgYHJlcGVhdGBgLCBoYXMgYWxzbyBiZWVuIGRlcHJlY2F0ZWQuCiAKICogVGhlcmUgd2VyZSBhIGJ1bmNoIG9mIHBhdGNoZXMgdG8gdGhlIGRpY3Rpb25hcnkgaW1wbGVtZW50YXRpb24sIG1vc3RseSB0byBmaXgKICAgcG90ZW50aWFsIGNvcmUgZHVtcHMgaWYgYSBkaWN0aW9uYXJ5IGNvbnRhaW5zIG9iamVjdHMgdGhhdCBzbmVha2lseSBjaGFuZ2VkCkBAIC0xMjQyLDggKzEyNDIsOCBAQAogICB1cCB0byBkaXNwbGF5IHRoZSBvdXRwdXQuICBUaGlzIHBhdGNoIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGltcG9ydCBzdWNoIHNjcmlwdHMsCiAgIGluIGNhc2UgdGhleSdyZSBhbHNvIHVzYWJsZSBhcyBtb2R1bGVzLiAgKEltcGxlbWVudGVkIGJ5IERhdmlkIEJvbGVuLikKIAotKiBPbiBwbGF0Zm9ybXMgd2hlcmUgUHl0aG9uIHVzZXMgdGhlIEMgOmNmdW5jOmBkbG9wZW5gIGZ1bmN0aW9uICB0byBsb2FkCi0gIGV4dGVuc2lvbiBtb2R1bGVzLCBpdCdzIG5vdyBwb3NzaWJsZSB0byBzZXQgdGhlIGZsYWdzIHVzZWQgIGJ5IDpjZnVuYzpgZGxvcGVuYAorKiBPbiBwbGF0Zm9ybXMgd2hlcmUgUHl0aG9uIHVzZXMgdGhlIEMgOmM6ZnVuYzpgZGxvcGVuYCBmdW5jdGlvbiAgdG8gbG9hZAorICBleHRlbnNpb24gbW9kdWxlcywgaXQncyBub3cgcG9zc2libGUgdG8gc2V0IHRoZSBmbGFncyB1c2VkICBieSA6YzpmdW5jOmBkbG9wZW5gCiAgIHVzaW5nIHRoZSA6ZnVuYzpgc3lzLmdldGRsb3BlbmZsYWdzYCBhbmQgOmZ1bmM6YHN5cy5zZXRkbG9wZW5mbGFnc2AgZnVuY3Rpb25zLgogICAoQ29udHJpYnV0ZWQgYnkgQnJhbSBTdG9say4pCiAKZGlmZiAtLWdpdCBhL0RvYy93aGF0c25ldy8yLjMucnN0IGIvRG9jL3doYXRzbmV3LzIuMy5yc3QKaW5kZXggMzFhNWZlMi4uODVmZWE2OCAxMDA2NDQKLS0tIGEvRG9jL3doYXRzbmV3LzIuMy5yc3QKKysrIGIvRG9jL3doYXRzbmV3LzIuMy5yc3QKQEAgLTM2Niw2ICszNjYsOSBAQAogLi4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiAKKy4uIGluZGV4OjoKKyAgIHNpbmdsZTogdW5pdmVyc2FsIG5ld2xpbmVzOyBXaGF0J3MgbmV3CisKIFBFUCAyNzg6IFVuaXZlcnNhbCBOZXdsaW5lIFN1cHBvcnQKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMzc2LDEyICszNzksMTIgQEAKIDEwKSwgTWFjT1MgdXNlcyB0aGUgY2FycmlhZ2UgcmV0dXJuIChBU0NJSSBjaGFyYWN0ZXIgMTMpLCBhbmQgV2luZG93cyB1c2VzIGEKIHR3by1jaGFyYWN0ZXIgc2VxdWVuY2Ugb2YgYSBjYXJyaWFnZSByZXR1cm4gcGx1cyBhIG5ld2xpbmUuCiAKLVB5dGhvbidzIGZpbGUgb2JqZWN0cyBjYW4gbm93IHN1cHBvcnQgZW5kIG9mIGxpbmUgY29udmVudGlvbnMgb3RoZXIgdGhhbiB0aGUgb25lCi1mb2xsb3dlZCBieSB0aGUgcGxhdGZvcm0gb24gd2hpY2ggUHl0aG9uIGlzIHJ1bm5pbmcuIE9wZW5pbmcgYSBmaWxlIHdpdGggdGhlCi1tb2RlIGBgJ1UnYGAgb3IgYGAnclUnYGAgd2lsbCBvcGVuIGEgZmlsZSBmb3IgcmVhZGluZyBpbiB1bml2ZXJzYWwgbmV3bGluZSBtb2RlLgotQWxsIHRocmVlIGxpbmUgZW5kaW5nIGNvbnZlbnRpb25zIHdpbGwgYmUgdHJhbnNsYXRlZCB0byBhIGBgJ1xuJ2BgIGluIHRoZQotc3RyaW5ncyByZXR1cm5lZCBieSB0aGUgdmFyaW91cyBmaWxlIG1ldGhvZHMgc3VjaCBhcyA6bWV0aDpgcmVhZGAgYW5kCi06bWV0aDpgcmVhZGxpbmVgLgorUHl0aG9uJ3MgZmlsZSBvYmplY3RzIGNhbiBub3cgc3VwcG9ydCBlbmQgb2YgbGluZSBjb252ZW50aW9ucyBvdGhlciB0aGFuIHRoZQorb25lIGZvbGxvd2VkIGJ5IHRoZSBwbGF0Zm9ybSBvbiB3aGljaCBQeXRob24gaXMgcnVubmluZy4gT3BlbmluZyBhIGZpbGUgd2l0aAordGhlIG1vZGUgYGAnVSdgYCBvciBgYCdyVSdgYCB3aWxsIG9wZW4gYSBmaWxlIGZvciByZWFkaW5nIGluIDp0ZXJtOmB1bml2ZXJzYWwKK25ld2xpbmVzYCBtb2RlLiAgQWxsIHRocmVlIGxpbmUgZW5kaW5nIGNvbnZlbnRpb25zIHdpbGwgYmUgdHJhbnNsYXRlZCB0byBhCitgYCdcbidgYCBpbiB0aGUgc3RyaW5ncyByZXR1cm5lZCBieSB0aGUgdmFyaW91cyBmaWxlIG1ldGhvZHMgc3VjaCBhcworOm1ldGg6YHJlYWRgIGFuZCA6bWV0aDpgcmVhZGxpbmVgLgogCiBVbml2ZXJzYWwgbmV3bGluZSBzdXBwb3J0IGlzIGFsc28gdXNlZCB3aGVuIGltcG9ydGluZyBtb2R1bGVzIGFuZCB3aGVuIGV4ZWN1dGluZwogYSBmaWxlIHdpdGggdGhlIDpmdW5jOmBleGVjZmlsZWAgZnVuY3Rpb24uICBUaGlzIG1lYW5zIHRoYXQgUHl0aG9uIG1vZHVsZXMgY2FuCkBAIC0xNzk3LDggKzE4MDAsOCBAQAogCiBQeW1hbGxvYywgYSBzcGVjaWFsaXplZCBvYmplY3QgYWxsb2NhdG9yIHdyaXR0ZW4gYnkgVmxhZGltaXIgTWFyYW5nb3pvdiwgd2FzIGEKIGZlYXR1cmUgYWRkZWQgdG8gUHl0aG9uIDIuMS4gIFB5bWFsbG9jIGlzIGludGVuZGVkIHRvIGJlIGZhc3RlciB0aGFuIHRoZSBzeXN0ZW0KLTpjZnVuYzpgbWFsbG9jYCBhbmQgdG8gaGF2ZSBsZXNzIG1lbW9yeSBvdmVyaGVhZCBmb3IgYWxsb2NhdGlvbiBwYXR0ZXJucyB0eXBpY2FsCi1vZiBQeXRob24gcHJvZ3JhbXMuIFRoZSBhbGxvY2F0b3IgdXNlcyBDJ3MgOmNmdW5jOmBtYWxsb2NgIGZ1bmN0aW9uIHRvIGdldCBsYXJnZQorOmM6ZnVuYzpgbWFsbG9jYCBhbmQgdG8gaGF2ZSBsZXNzIG1lbW9yeSBvdmVyaGVhZCBmb3IgYWxsb2NhdGlvbiBwYXR0ZXJucyB0eXBpY2FsCitvZiBQeXRob24gcHJvZ3JhbXMuIFRoZSBhbGxvY2F0b3IgdXNlcyBDJ3MgOmM6ZnVuYzpgbWFsbG9jYCBmdW5jdGlvbiB0byBnZXQgbGFyZ2UKIHBvb2xzIG9mIG1lbW9yeSBhbmQgdGhlbiBmdWxmaWxscyBzbWFsbGVyIG1lbW9yeSByZXF1ZXN0cyBmcm9tIHRoZXNlIHBvb2xzLgogCiBJbiAyLjEgYW5kIDIuMiwgcHltYWxsb2Mgd2FzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCB3YXNuJ3QgZW5hYmxlZCBieQpAQCAtMTgxNCwxMyArMTgxNywxMyBAQAogCiBUaGVyZSdzIG9uZSBwYXJ0aWN1bGFybHkgY29tbW9uIGVycm9yIHRoYXQgY2F1c2VzIHByb2JsZW1zLiAgVGhlcmUgYXJlIGEgbnVtYmVyCiBvZiBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMgaW4gUHl0aG9uJ3MgQyBBUEkgdGhhdCBoYXZlIHByZXZpb3VzbHkganVzdCBiZWVuCi1hbGlhc2VzIGZvciB0aGUgQyBsaWJyYXJ5J3MgOmNmdW5jOmBtYWxsb2NgIGFuZCA6Y2Z1bmM6YGZyZWVgLCBtZWFuaW5nIHRoYXQgaWYKK2FsaWFzZXMgZm9yIHRoZSBDIGxpYnJhcnkncyA6YzpmdW5jOmBtYWxsb2NgIGFuZCA6YzpmdW5jOmBmcmVlYCwgbWVhbmluZyB0aGF0IGlmCiB5b3UgYWNjaWRlbnRhbGx5IGNhbGxlZCBtaXNtYXRjaGVkIGZ1bmN0aW9ucyB0aGUgZXJyb3Igd291bGRuJ3QgYmUgbm90aWNlYWJsZS4KIFdoZW4gdGhlIG9iamVjdCBhbGxvY2F0b3IgaXMgZW5hYmxlZCwgdGhlc2UgZnVuY3Rpb25zIGFyZW4ndCBhbGlhc2VzIG9mCi06Y2Z1bmM6YG1hbGxvY2AgYW5kIDpjZnVuYzpgZnJlZWAgYW55IG1vcmUsIGFuZCBjYWxsaW5nIHRoZSB3cm9uZyBmdW5jdGlvbiB0bworOmM6ZnVuYzpgbWFsbG9jYCBhbmQgOmM6ZnVuYzpgZnJlZWAgYW55IG1vcmUsIGFuZCBjYWxsaW5nIHRoZSB3cm9uZyBmdW5jdGlvbiB0bwogZnJlZSBtZW1vcnkgbWF5IGdldCB5b3UgYSBjb3JlIGR1bXAuICBGb3IgZXhhbXBsZSwgaWYgbWVtb3J5IHdhcyBhbGxvY2F0ZWQgdXNpbmcKLTpjZnVuYzpgUHlPYmplY3RfTWFsbG9jYCwgaXQgaGFzIHRvIGJlIGZyZWVkIHVzaW5nIDpjZnVuYzpgUHlPYmplY3RfRnJlZWAsIG5vdAotOmNmdW5jOmBmcmVlYC4gIEEgZmV3IG1vZHVsZXMgaW5jbHVkZWQgd2l0aCBQeXRob24gZmVsbCBhZm91bCBvZiB0aGlzIGFuZCBoYWQgdG8KKzpjOmZ1bmM6YFB5T2JqZWN0X01hbGxvY2AsIGl0IGhhcyB0byBiZSBmcmVlZCB1c2luZyA6YzpmdW5jOmBQeU9iamVjdF9GcmVlYCwgbm90Cis6YzpmdW5jOmBmcmVlYC4gIEEgZmV3IG1vZHVsZXMgaW5jbHVkZWQgd2l0aCBQeXRob24gZmVsbCBhZm91bCBvZiB0aGlzIGFuZCBoYWQgdG8KIGJlIGZpeGVkOyBkb3VidGxlc3MgdGhlcmUgYXJlIG1vcmUgdGhpcmQtcGFydHkgbW9kdWxlcyB0aGF0IHdpbGwgaGF2ZSB0aGUgc2FtZQogcHJvYmxlbS4KIApAQCAtMTgzMSwxNCArMTgzNCwxNCBAQAogc3BlY2lmaWNhbGx5IGZvciBhbGxvY2F0aW5nIFB5dGhvbiBvYmplY3RzLgogCiAqIFRvIGFsbG9jYXRlIGFuZCBmcmVlIGFuIHVuZGlzdGluZ3Vpc2hlZCBjaHVuayBvZiBtZW1vcnkgdXNlIHRoZSAicmF3IG1lbW9yeSIKLSAgZmFtaWx5OiA6Y2Z1bmM6YFB5TWVtX01hbGxvY2AsIDpjZnVuYzpgUHlNZW1fUmVhbGxvY2AsIGFuZCA6Y2Z1bmM6YFB5TWVtX0ZyZWVgLgorICBmYW1pbHk6IDpjOmZ1bmM6YFB5TWVtX01hbGxvY2AsIDpjOmZ1bmM6YFB5TWVtX1JlYWxsb2NgLCBhbmQgOmM6ZnVuYzpgUHlNZW1fRnJlZWAuCiAKICogVGhlICJvYmplY3QgbWVtb3J5IiBmYW1pbHkgaXMgdGhlIGludGVyZmFjZSB0byB0aGUgcHltYWxsb2MgZmFjaWxpdHkgZGVzY3JpYmVkCiAgIGFib3ZlIGFuZCBpcyBiaWFzZWQgdG93YXJkcyBhIGxhcmdlIG51bWJlciBvZiAic21hbGwiIGFsbG9jYXRpb25zOgotICA6Y2Z1bmM6YFB5T2JqZWN0X01hbGxvY2AsIDpjZnVuYzpgUHlPYmplY3RfUmVhbGxvY2AsIGFuZCA6Y2Z1bmM6YFB5T2JqZWN0X0ZyZWVgLgorICA6YzpmdW5jOmBQeU9iamVjdF9NYWxsb2NgLCA6YzpmdW5jOmBQeU9iamVjdF9SZWFsbG9jYCwgYW5kIDpjOmZ1bmM6YFB5T2JqZWN0X0ZyZWVgLgogCiAqIFRvIGFsbG9jYXRlIGFuZCBmcmVlIFB5dGhvbiBvYmplY3RzLCB1c2UgdGhlICJvYmplY3QiIGZhbWlseQotICA6Y2Z1bmM6YFB5T2JqZWN0X05ld2AsIDpjZnVuYzpgUHlPYmplY3RfTmV3VmFyYCwgYW5kIDpjZnVuYzpgUHlPYmplY3RfRGVsYC4KKyAgOmM6ZnVuYzpgUHlPYmplY3RfTmV3YCwgOmM6ZnVuYzpgUHlPYmplY3RfTmV3VmFyYCwgYW5kIDpjOmZ1bmM6YFB5T2JqZWN0X0RlbGAuCiAKIFRoYW5rcyB0byBsb3RzIG9mIHdvcmsgYnkgVGltIFBldGVycywgcHltYWxsb2MgaW4gMi4zIGFsc28gcHJvdmlkZXMgZGVidWdnaW5nCiBmZWF0dXJlcyB0byBjYXRjaCBtZW1vcnkgb3ZlcndyaXRlcyBhbmQgZG91YmxlZCBmcmVlcyBpbiBib3RoIGV4dGVuc2lvbiBtb2R1bGVzCkBAIC0xODc3LDEwICsxODgwLDEwIEBACiAgICg6ZmlsZTpgbGlicHl0aG9uMi4zLnNvYCkgYnkgc3VwcGx5aW5nIDpvcHRpb246YC0tZW5hYmxlLXNoYXJlZGAgd2hlbiBydW5uaW5nCiAgIFB5dGhvbidzIDpwcm9ncmFtOmBjb25maWd1cmVgIHNjcmlwdC4gIChDb250cmlidXRlZCBieSBPbmRyZWogUGFsa292c2t5LikKIAotKiBUaGUgOmNtYWNybzpgRExfRVhQT1JUYCBhbmQgOmNtYWNybzpgRExfSU1QT1JUYCBtYWNyb3MgYXJlIG5vdyBkZXByZWNhdGVkLgorKiBUaGUgOmM6bWFjcm86YERMX0VYUE9SVGAgYW5kIDpjOm1hY3JvOmBETF9JTVBPUlRgIG1hY3JvcyBhcmUgbm93IGRlcHJlY2F0ZWQuCiAgIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyBmb3IgUHl0aG9uIGV4dGVuc2lvbiBtb2R1bGVzIHNob3VsZCBub3cgYmUgZGVjbGFyZWQKLSAgdXNpbmcgdGhlIG5ldyBtYWNybyA6Y21hY3JvOmBQeU1PRElOSVRfRlVOQ2AsIHdoaWxlIHRoZSBQeXRob24gY29yZSB3aWxsCi0gIGdlbmVyYWxseSB1c2UgdGhlIDpjbWFjcm86YFB5QVBJX0ZVTkNgIGFuZCA6Y21hY3JvOmBQeUFQSV9EQVRBYCBtYWNyb3MuCisgIHVzaW5nIHRoZSBuZXcgbWFjcm8gOmM6bWFjcm86YFB5TU9ESU5JVF9GVU5DYCwgd2hpbGUgdGhlIFB5dGhvbiBjb3JlIHdpbGwKKyAgZ2VuZXJhbGx5IHVzZSB0aGUgOmM6bWFjcm86YFB5QVBJX0ZVTkNgIGFuZCA6YzptYWNybzpgUHlBUElfREFUQWAgbWFjcm9zLgogCiAqIFRoZSBpbnRlcnByZXRlciBjYW4gYmUgY29tcGlsZWQgd2l0aG91dCBhbnkgZG9jc3RyaW5ncyBmb3IgdGhlIGJ1aWx0LWluCiAgIGZ1bmN0aW9ucyBhbmQgbW9kdWxlcyBieSBzdXBwbHlpbmcgOm9wdGlvbjpgLS13aXRob3V0LWRvYy1zdHJpbmdzYCB0byB0aGUKQEAgLTE4ODgsMTkgKzE4OTEsMTkgQEAKICAgYnV0IHdpbGwgYWxzbyBtZWFuIHRoYXQgeW91IGNhbid0IGdldCBoZWxwIGZvciBQeXRob24ncyBidWlsdC1pbnMuICAoQ29udHJpYnV0ZWQKICAgYnkgR3VzdGF2byBOaWVtZXllci4pCiAKLSogVGhlIDpjZnVuYzpgUHlBcmdfTm9BcmdzYCBtYWNybyBpcyBub3cgZGVwcmVjYXRlZCwgYW5kIGNvZGUgdGhhdCB1c2VzIGl0CisqIFRoZSA6YzpmdW5jOmBQeUFyZ19Ob0FyZ3NgIG1hY3JvIGlzIG5vdyBkZXByZWNhdGVkLCBhbmQgY29kZSB0aGF0IHVzZXMgaXQKICAgc2hvdWxkIGJlIGNoYW5nZWQuICBGb3IgUHl0aG9uIDIuMiBhbmQgbGF0ZXIsIHRoZSBtZXRob2QgZGVmaW5pdGlvbiB0YWJsZSBjYW4KICAgc3BlY2lmeSB0aGUgOmNvbnN0OmBNRVRIX05PQVJHU2AgZmxhZywgc2lnbmFsbGluZyB0aGF0IHRoZXJlIGFyZSBubyBhcmd1bWVudHMsCiAgIGFuZCB0aGUgYXJndW1lbnQgY2hlY2tpbmcgY2FuIHRoZW4gYmUgcmVtb3ZlZC4gIElmIGNvbXBhdGliaWxpdHkgd2l0aCBwcmUtMi4yCiAgIHZlcnNpb25zIG9mIFB5dGhvbiBpcyBpbXBvcnRhbnQsIHRoZSBjb2RlIGNvdWxkIHVzZSBgYFB5QXJnX1BhcnNlVHVwbGUoYXJncywKICAgIiIpYGAgaW5zdGVhZCwgYnV0IHRoaXMgd2lsbCBiZSBzbG93ZXIgdGhhbiB1c2luZyA6Y29uc3Q6YE1FVEhfTk9BUkdTYC4KIAotKiA6Y2Z1bmM6YFB5QXJnX1BhcnNlVHVwbGVgIGFjY2VwdHMgbmV3IGZvcm1hdCBjaGFyYWN0ZXJzIGZvciB2YXJpb3VzIHNpemVzIG9mCi0gIHVuc2lnbmVkIGludGVnZXJzOiBgYEJgYCBmb3IgOmN0eXBlOmB1bnNpZ25lZCBjaGFyYCwgYGBIYGAgZm9yIDpjdHlwZTpgdW5zaWduZWQKLSAgc2hvcnQgaW50YCwgIGBgSWBgIGZvciA6Y3R5cGU6YHVuc2lnbmVkIGludGAsICBhbmQgYGBLYGAgZm9yIDpjdHlwZTpgdW5zaWduZWQKKyogOmM6ZnVuYzpgUHlBcmdfUGFyc2VUdXBsZWAgYWNjZXB0cyBuZXcgZm9ybWF0IGNoYXJhY3RlcnMgZm9yIHZhcmlvdXMgc2l6ZXMgb2YKKyAgdW5zaWduZWQgaW50ZWdlcnM6IGBgQmBgIGZvciA6Yzp0eXBlOmB1bnNpZ25lZCBjaGFyYCwgYGBIYGAgZm9yIDpjOnR5cGU6YHVuc2lnbmVkCisgIHNob3J0IGludGAsICBgYElgYCBmb3IgOmM6dHlwZTpgdW5zaWduZWQgaW50YCwgIGFuZCBgYEtgYCBmb3IgOmM6dHlwZTpgdW5zaWduZWQKICAgbG9uZyBsb25nYC4KIAotKiBBIG5ldyBmdW5jdGlvbiwgOmNmdW5jOmBQeU9iamVjdF9EZWxJdGVtU3RyaW5nKG1hcHBpbmcsIGNoYXIgXCprZXkpYCB3YXMgYWRkZWQKKyogQSBuZXcgZnVuY3Rpb24sIDpjOmZ1bmM6YFB5T2JqZWN0X0RlbEl0ZW1TdHJpbmcobWFwcGluZywgY2hhciBcKmtleSlgIHdhcyBhZGRlZAogICBhcyBzaG9ydGhhbmQgZm9yIGBgUHlPYmplY3RfRGVsSXRlbShtYXBwaW5nLCBQeVN0cmluZ19OZXcoa2V5KSlgYC4KIAogKiBGaWxlIG9iamVjdHMgbm93IG1hbmFnZSB0aGVpciBpbnRlcm5hbCBzdHJpbmcgYnVmZmVyIGRpZmZlcmVudGx5LCBpbmNyZWFzaW5nCkBAIC0xOTEwLDcgKzE5MTMsNyBAQAogCiAqIEl0J3Mgbm93IHBvc3NpYmxlIHRvIGRlZmluZSBjbGFzcyBhbmQgc3RhdGljIG1ldGhvZHMgZm9yIGEgQyBleHRlbnNpb24gdHlwZSBieQogICBzZXR0aW5nIGVpdGhlciB0aGUgOmNvbnN0OmBNRVRIX0NMQVNTYCBvciA6Y29uc3Q6YE1FVEhfU1RBVElDYCBmbGFncyBpbiBhCi0gIG1ldGhvZCdzIDpjdHlwZTpgUHlNZXRob2REZWZgIHN0cnVjdHVyZS4KKyAgbWV0aG9kJ3MgOmM6dHlwZTpgUHlNZXRob2REZWZgIHN0cnVjdHVyZS4KIAogKiBQeXRob24gbm93IGluY2x1ZGVzIGEgY29weSBvZiB0aGUgRXhwYXQgWE1MIHBhcnNlcidzIHNvdXJjZSBjb2RlLCByZW1vdmluZyBhbnkKICAgZGVwZW5kZW5jZSBvbiBhIHN5c3RlbSB2ZXJzaW9uIG9yIGxvY2FsIGluc3RhbGxhdGlvbiBvZiBFeHBhdC4KZGlmZiAtLWdpdCBhL0RvYy93aGF0c25ldy8yLjQucnN0IGIvRG9jL3doYXRzbmV3LzIuNC5yc3QKaW5kZXggYTYwMmY3NS4uZmE2YzEyNCAxMDA2NDQKLS0tIGEvRG9jL3doYXRzbmV3LzIuNC5yc3QKKysrIGIvRG9jL3doYXRzbmV3LzIuNC5yc3QKQEAgLTQxMSw2ICs0MTEsOSBAQAogeW91IGNhbiB1c2UgdGhlIGNvbnN0YW50IGBgc3VicHJvY2Vzcy5QSVBFYGAgdG8gY3JlYXRlIGEgcGlwZSBiZXR3ZWVuIHRoZQogc3VicHJvY2VzcyBhbmQgdGhlIHBhcmVudC4KIAorLi4gaW5kZXg6OgorICAgc2luZ2xlOiB1bml2ZXJzYWwgbmV3bGluZXM7IFdoYXQncyBuZXcKKwogVGhlIGNvbnN0cnVjdG9yIGhhcyBhIG51bWJlciBvZiBoYW5keSBvcHRpb25zOgogCiAqICpjbG9zZV9mZHMqIHJlcXVlc3RzIHRoYXQgYWxsIGZpbGUgZGVzY3JpcHRvcnMgYmUgY2xvc2VkIGJlZm9yZSBydW5uaW5nIHRoZQpAQCAtNDI0LDcgKzQyNyw3IEBACiAqICpwcmVleGVjX2ZuKiBpcyBhIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgYmVmb3JlIHRoZSBjaGlsZCBpcyBzdGFydGVkLgogCiAqICp1bml2ZXJzYWxfbmV3bGluZXMqIG9wZW5zIHRoZSBjaGlsZCdzIGlucHV0IGFuZCBvdXRwdXQgdXNpbmcgUHl0aG9uJ3MKLSAgdW5pdmVyc2FsIG5ld2xpbmUgZmVhdHVyZS4KKyAgOnRlcm06YHVuaXZlcnNhbCBuZXdsaW5lc2AgZmVhdHVyZS4KIAogT25jZSB5b3UndmUgY3JlYXRlZCB0aGUgOmNsYXNzOmBQb3BlbmAgaW5zdGFuY2UsICB5b3UgY2FuIGNhbGwgaXRzIDptZXRoOmB3YWl0YAogbWV0aG9kIHRvIHBhdXNlIHVudGlsIHRoZSBzdWJwcm9jZXNzIGhhcyBleGl0ZWQsIDptZXRoOmBwb2xsYCB0byBjaGVjayBpZiBpdCdzCkBAIC00NjksNyArNDcyLDcgQEAKID09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIFB5dGhvbiBoYXMgYWx3YXlzIHN1cHBvcnRlZCBmbG9hdGluZy1wb2ludCAoRlApIG51bWJlcnMsIGJhc2VkIG9uIHRoZSB1bmRlcmx5aW5nCi1DIDpjdHlwZTpgZG91YmxlYCB0eXBlLCBhcyBhIGRhdGEgdHlwZS4gIEhvd2V2ZXIsIHdoaWxlIG1vc3QgcHJvZ3JhbW1pbmcKK0MgOmM6dHlwZTpgZG91YmxlYCB0eXBlLCBhcyBhIGRhdGEgdHlwZS4gIEhvd2V2ZXIsIHdoaWxlIG1vc3QgcHJvZ3JhbW1pbmcKIGxhbmd1YWdlcyBwcm92aWRlIGEgZmxvYXRpbmctcG9pbnQgdHlwZSwgbWFueSBwZW9wbGUgKGV2ZW4gcHJvZ3JhbW1lcnMpIGFyZQogdW5hd2FyZSB0aGF0IGZsb2F0aW5nLXBvaW50IG51bWJlcnMgZG9uJ3QgcmVwcmVzZW50IGNlcnRhaW4gZGVjaW1hbCBmcmFjdGlvbnMKIGFjY3VyYXRlbHkuICBUaGUgbmV3IDpjbGFzczpgRGVjaW1hbGAgdHlwZSBjYW4gcmVwcmVzZW50IHRoZXNlIGZyYWN0aW9ucwpAQCAtNDk4LDcgKzUwMSw3IEBACiA1LgogCiBNb2Rlcm4gc3lzdGVtcyB1c3VhbGx5IHByb3ZpZGUgZmxvYXRpbmctcG9pbnQgc3VwcG9ydCB0aGF0IGNvbmZvcm1zIHRvIGEKLXN0YW5kYXJkIGNhbGxlZCBJRUVFIDc1NC4gIEMncyA6Y3R5cGU6YGRvdWJsZWAgdHlwZSBpcyB1c3VhbGx5IGltcGxlbWVudGVkIGFzIGEKK3N0YW5kYXJkIGNhbGxlZCBJRUVFIDc1NC4gIEMncyA6Yzp0eXBlOmBkb3VibGVgIHR5cGUgaXMgdXN1YWxseSBpbXBsZW1lbnRlZCBhcyBhCiA2NC1iaXQgSUVFRSA3NTQgbnVtYmVyLCB3aGljaCB1c2VzIDUyIGJpdHMgb2Ygc3BhY2UgZm9yIHRoZSBtYW50aXNzYS4gIFRoaXMKIG1lYW5zIHRoYXQgbnVtYmVycyBjYW4gb25seSBiZSBzcGVjaWZpZWQgdG8gNTIgYml0cyBvZiBwcmVjaXNpb24uICBJZiB5b3UncmUKIHRyeWluZyB0byByZXByZXNlbnQgbnVtYmVycyB3aG9zZSBleHBhbnNpb24gcmVwZWF0cyBlbmRsZXNzbHksIHRoZSBleHBhbnNpb24gaXMKQEAgLTczNiw3ICs3MzksNyBAQAogSG93ZXZlciwgdGhlIG1vZHVsZSB3YXMgY2FyZWZ1bCB0byBub3QgY2hhbmdlIHRoZSBudW1lcmljIGxvY2FsZSBiZWNhdXNlIHZhcmlvdXMKIGZ1bmN0aW9ucyBpbiBQeXRob24ncyBpbXBsZW1lbnRhdGlvbiByZXF1aXJlZCB0aGF0IHRoZSBudW1lcmljIGxvY2FsZSByZW1haW4gc2V0CiB0byB0aGUgYGAnQydgYCBsb2NhbGUuICBPZnRlbiB0aGlzIHdhcyBiZWNhdXNlIHRoZSBjb2RlIHdhcyB1c2luZyB0aGUgQwotbGlicmFyeSdzIDpjZnVuYzpgYXRvZmAgZnVuY3Rpb24uCitsaWJyYXJ5J3MgOmM6ZnVuYzpgYXRvZmAgZnVuY3Rpb24uCiAKIE5vdCBzZXR0aW5nIHRoZSBudW1lcmljIGxvY2FsZSBjYXVzZWQgdHJvdWJsZSBmb3IgZXh0ZW5zaW9ucyB0aGF0IHVzZWQgdGhpcmQtCiBwYXJ0eSBDIGxpYnJhcmllcywgaG93ZXZlciwgYmVjYXVzZSB0aGV5IHdvdWxkbid0IGhhdmUgdGhlIGNvcnJlY3QgbG9jYWxlIHNldC4KQEAgLTc0NiwxMSArNzQ5LDExIEBACiBUaGUgc29sdXRpb24gZGVzY3JpYmVkIGluIHRoZSBQRVAgaXMgdG8gYWRkIHRocmVlIG5ldyBmdW5jdGlvbnMgdG8gdGhlIFB5dGhvbgogQVBJIHRoYXQgcGVyZm9ybSBBU0NJSS1vbmx5IGNvbnZlcnNpb25zLCBpZ25vcmluZyB0aGUgbG9jYWxlIHNldHRpbmc6CiAKLSogOmNmdW5jOmBQeU9TX2FzY2lpX3N0cnRvZChzdHIsIHB0cilgICBhbmQgOmNmdW5jOmBQeU9TX2FzY2lpX2F0b2Yoc3RyLCBwdHIpYAotICBib3RoIGNvbnZlcnQgYSBzdHJpbmcgdG8gYSBDIDpjdHlwZTpgZG91YmxlYC4KKyogOmM6ZnVuYzpgUHlPU19hc2NpaV9zdHJ0b2Qoc3RyLCBwdHIpYCAgYW5kIDpjOmZ1bmM6YFB5T1NfYXNjaWlfYXRvZihzdHIsIHB0cilgCisgIGJvdGggY29udmVydCBhIHN0cmluZyB0byBhIEMgOmM6dHlwZTpgZG91YmxlYC4KIAotKiA6Y2Z1bmM6YFB5T1NfYXNjaWlfZm9ybWF0ZChidWZmZXIsIGJ1Zl9sZW4sIGZvcm1hdCwgZClgIGNvbnZlcnRzIGEKLSAgOmN0eXBlOmBkb3VibGVgIHRvIGFuIEFTQ0lJIHN0cmluZy4KKyogOmM6ZnVuYzpgUHlPU19hc2NpaV9mb3JtYXRkKGJ1ZmZlciwgYnVmX2xlbiwgZm9ybWF0LCBkKWAgY29udmVydHMgYQorICA6Yzp0eXBlOmBkb3VibGVgIHRvIGFuIEFTQ0lJIHN0cmluZy4KIAogVGhlIGNvZGUgZm9yIHRoZXNlIGZ1bmN0aW9ucyBjYW1lIGZyb20gdGhlIEdMaWIgbGlicmFyeQogKGh0dHA6Ly9saWJyYXJ5Lmdub21lLm9yZy9kZXZlbC9nbGliL3N0YWJsZS8pLCB3aG9zZSBkZXZlbG9wZXJzIGtpbmRseQpAQCAtODQzLDcgKzg0Niw3IEBACiAgICAgIFsnQScsICdiJywgJ2MnLCAnRCddCiAKICAgRmluYWxseSwgdGhlICpyZXZlcnNlKiBwYXJhbWV0ZXIgdGFrZXMgYSBCb29sZWFuIHZhbHVlLiAgSWYgdGhlIHZhbHVlIGlzIHRydWUsCi0gIHRoZSBsaXN0IHdpbGwgYmUgc29ydGVkIGludG8gcmV2ZXJzZSBvcmRlci4gSW5zdGVhZCBvZiBgYEwuc29ydCgpIDsKKyAgdGhlIGxpc3Qgd2lsbCBiZSBzb3J0ZWQgaW50byByZXZlcnNlIG9yZGVyLiBJbnN0ZWFkIG9mIGBgTC5zb3J0KCk7CiAgIEwucmV2ZXJzZSgpYGAsIHlvdSBjYW4gbm93IHdyaXRlIGBgTC5zb3J0KHJldmVyc2U9VHJ1ZSlgYC4KIAogICBUaGUgcmVzdWx0cyBvZiBzb3J0aW5nIGFyZSBub3cgZ3VhcmFudGVlZCB0byBiZSBzdGFibGUuICBUaGlzIG1lYW5zIHRoYXQgdHdvCkBAIC05MzgsNyArOTQxLDcgQEAKICogVGhlIG1hY2hpbmVyeSBmb3IgZ3Jvd2luZyBhbmQgc2hyaW5raW5nIGxpc3RzIHdhcyBvcHRpbWl6ZWQgZm9yIHNwZWVkIGFuZCBmb3IKICAgc3BhY2UgZWZmaWNpZW5jeS4gIEFwcGVuZGluZyBhbmQgcG9wcGluZyBmcm9tIGxpc3RzIG5vdyBydW5zIGZhc3RlciBkdWUgdG8gbW9yZQogICBlZmZpY2llbnQgY29kZSBwYXRocyBhbmQgbGVzcyBmcmVxdWVudCB1c2Ugb2YgdGhlIHVuZGVybHlpbmcgc3lzdGVtCi0gIDpjZnVuYzpgcmVhbGxvY2AuICBMaXN0IGNvbXByZWhlbnNpb25zIGFsc28gYmVuZWZpdC4gICA6bWV0aDpgbGlzdC5leHRlbmRgIHdhcworICA6YzpmdW5jOmByZWFsbG9jYC4gIExpc3QgY29tcHJlaGVuc2lvbnMgYWxzbyBiZW5lZml0LiAgIDptZXRoOmBsaXN0LmV4dGVuZGAgd2FzCiAgIGFsc28gb3B0aW1pemVkIGFuZCBubyBsb25nZXIgY29udmVydHMgaXRzIGFyZ3VtZW50IGludG8gYSB0ZW1wb3JhcnkgbGlzdCBiZWZvcmUKICAgZXh0ZW5kaW5nIHRoZSBiYXNlIGxpc3QuICAoQ29udHJpYnV0ZWQgYnkgUmF5bW9uZCBIZXR0aW5nZXIuKQogCkBAIC0xNDQ1LDM0ICsxNDQ4LDM0IEBACiBTb21lIG9mIHRoZSBjaGFuZ2VzIHRvIFB5dGhvbidzIGJ1aWxkIHByb2Nlc3MgYW5kIHRvIHRoZSBDIEFQSSBhcmU6CiAKICogVGhyZWUgbmV3IGNvbnZlbmllbmNlIG1hY3JvcyB3ZXJlIGFkZGVkIGZvciBjb21tb24gcmV0dXJuIHZhbHVlcyBmcm9tCi0gIGV4dGVuc2lvbiBmdW5jdGlvbnM6IDpjbWFjcm86YFB5X1JFVFVSTl9OT05FYCwgOmNtYWNybzpgUHlfUkVUVVJOX1RSVUVgLCBhbmQKLSAgOmNtYWNybzpgUHlfUkVUVVJOX0ZBTFNFYC4gKENvbnRyaWJ1dGVkIGJ5IEJyZXR0IENhbm5vbi4pCisgIGV4dGVuc2lvbiBmdW5jdGlvbnM6IDpjOm1hY3JvOmBQeV9SRVRVUk5fTk9ORWAsIDpjOm1hY3JvOmBQeV9SRVRVUk5fVFJVRWAsIGFuZAorICA6YzptYWNybzpgUHlfUkVUVVJOX0ZBTFNFYC4gKENvbnRyaWJ1dGVkIGJ5IEJyZXR0IENhbm5vbi4pCiAKLSogQW5vdGhlciBuZXcgbWFjcm8sIDpjbWFjcm86YFB5X0NMRUFSKG9iailgLCAgZGVjcmVhc2VzIHRoZSByZWZlcmVuY2UgY291bnQgb2YKKyogQW5vdGhlciBuZXcgbWFjcm8sIDpjOm1hY3JvOmBQeV9DTEVBUihvYmopYCwgIGRlY3JlYXNlcyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mCiAgICpvYmoqIGFuZCBzZXRzICpvYmoqIHRvIHRoZSBudWxsIHBvaW50ZXIuICAoQ29udHJpYnV0ZWQgYnkgSmltIEZ1bHRvbi4pCiAKLSogQSBuZXcgZnVuY3Rpb24sIDpjZnVuYzpgUHlUdXBsZV9QYWNrKE4sIG9iajEsIG9iajIsIC4uLiwgb2JqTilgLCBjb25zdHJ1Y3RzCisqIEEgbmV3IGZ1bmN0aW9uLCA6YzpmdW5jOmBQeVR1cGxlX1BhY2soTiwgb2JqMSwgb2JqMiwgLi4uLCBvYmpOKWAsIGNvbnN0cnVjdHMKICAgdHVwbGVzIGZyb20gYSB2YXJpYWJsZSBsZW5ndGggYXJndW1lbnQgbGlzdCBvZiBQeXRob24gb2JqZWN0cy4gIChDb250cmlidXRlZCBieQogICBSYXltb25kIEhldHRpbmdlci4pCiAKLSogQSBuZXcgZnVuY3Rpb24sIDpjZnVuYzpgUHlEaWN0X0NvbnRhaW5zKGQsIGspYCwgaW1wbGVtZW50cyBmYXN0IGRpY3Rpb25hcnkKKyogQSBuZXcgZnVuY3Rpb24sIDpjOmZ1bmM6YFB5RGljdF9Db250YWlucyhkLCBrKWAsIGltcGxlbWVudHMgZmFzdCBkaWN0aW9uYXJ5CiAgIGxvb2t1cHMgd2l0aG91dCBtYXNraW5nIGV4Y2VwdGlvbnMgcmFpc2VkIGR1cmluZyB0aGUgbG9vay11cCBwcm9jZXNzLgogICAoQ29udHJpYnV0ZWQgYnkgUmF5bW9uZCBIZXR0aW5nZXIuKQogCi0qIFRoZSA6Y21hY3JvOmBQeV9JU19OQU4oWClgIG1hY3JvIHJldHVybnMgMSBpZiAgaXRzIGZsb2F0IG9yIGRvdWJsZSBhcmd1bWVudAorKiBUaGUgOmM6bWFjcm86YFB5X0lTX05BTihYKWAgbWFjcm8gcmV0dXJucyAxIGlmICBpdHMgZmxvYXQgb3IgZG91YmxlIGFyZ3VtZW50CiAgICpYKiBpcyBhIE5hTi4gICAoQ29udHJpYnV0ZWQgYnkgVGltIFBldGVycy4pCiAKICogQyBjb2RlIGNhbiBhdm9pZCB1bm5lY2Vzc2FyeSBsb2NraW5nIGJ5IHVzaW5nIHRoZSBuZXcKLSAgOmNmdW5jOmBQeUV2YWxfVGhyZWFkc0luaXRpYWxpemVkYCBmdW5jdGlvbiB0byB0ZWxsICBpZiBhbnkgdGhyZWFkIG9wZXJhdGlvbnMKKyAgOmM6ZnVuYzpgUHlFdmFsX1RocmVhZHNJbml0aWFsaXplZGAgZnVuY3Rpb24gdG8gdGVsbCAgaWYgYW55IHRocmVhZCBvcGVyYXRpb25zCiAgIGhhdmUgYmVlbiBwZXJmb3JtZWQuICBJZiB0aGlzIGZ1bmN0aW9uICByZXR1cm5zIGZhbHNlLCBubyBsb2NrIG9wZXJhdGlvbnMgYXJlCiAgIG5lZWRlZC4gKENvbnRyaWJ1dGVkIGJ5IE5pY2sgQ29naGxhbi4pCiAKLSogQSBuZXcgZnVuY3Rpb24sIDpjZnVuYzpgUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHNgLCBpcyB0aGUgc2FtZSBhcwotICA6Y2Z1bmM6YFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc2AgYnV0IHRha2VzIGEgIDpjdHlwZTpgdmFfbGlzdGAgaW5zdGVhZCBvZiBhCisqIEEgbmV3IGZ1bmN0aW9uLCA6YzpmdW5jOmBQeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3Jkc2AsIGlzIHRoZSBzYW1lIGFzCisgIDpjOmZ1bmM6YFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc2AgYnV0IHRha2VzIGEgIDpjOnR5cGU6YHZhX2xpc3RgIGluc3RlYWQgb2YgYQogICBudW1iZXIgb2YgYXJndW1lbnRzLiAoQ29udHJpYnV0ZWQgYnkgR3JlZyBDaGFwbWFuLikKIAogKiBBIG5ldyBtZXRob2QgZmxhZywgOmNvbnN0OmBNRVRIX0NPRVhJU1RTYCwgYWxsb3dzIGEgZnVuY3Rpb24gZGVmaW5lZCBpbiBzbG90cwotICB0byBjby1leGlzdCB3aXRoIGEgOmN0eXBlOmBQeUNGdW5jdGlvbmAgaGF2aW5nIHRoZSBzYW1lIG5hbWUuICBUaGlzIGNhbiBoYWx2ZQorICB0byBjby1leGlzdCB3aXRoIGEgOmM6dHlwZTpgUHlDRnVuY3Rpb25gIGhhdmluZyB0aGUgc2FtZSBuYW1lLiAgVGhpcyBjYW4gaGFsdmUKICAgdGhlIGFjY2VzcyB0aW1lIGZvciBhIG1ldGhvZCBzdWNoIGFzIDptZXRoOmBzZXQuX19jb250YWluc19fYC4gIChDb250cmlidXRlZCBieQogICBSYXltb25kIEhldHRpbmdlci4pCiAKQEAgLTE0ODYsOCArMTQ4OSw4IEBACiAgIHRob3VnaCB0aGF0IHByb2Nlc3NvciBhcmNoaXRlY3R1cmUgZG9lc24ndCBjYWxsIHRoYXQgcmVnaXN0ZXIgInRoZSBUU0MKICAgcmVnaXN0ZXIiLiAgKENvbnRyaWJ1dGVkIGJ5IEplcmVteSBIeWx0b24uKQogCi0qIFRoZSA6Y3R5cGU6YHRyYWNlYmFja29iamVjdGAgdHlwZSBoYXMgYmVlbiByZW5hbWVkIHRvCi0gIDpjdHlwZTpgUHlUcmFjZWJhY2tPYmplY3RgLgorKiBUaGUgOmM6dHlwZTpgdHJhY2ViYWNrb2JqZWN0YCB0eXBlIGhhcyBiZWVuIHJlbmFtZWQgdG8KKyAgOmM6dHlwZTpgUHlUcmFjZWJhY2tPYmplY3RgLgogCiAuLiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTE1NTQsNyArMTU1Nyw3IEBACiA9PT09PT09PT09PT09PT09CiAKIFRoZSBhdXRob3Igd291bGQgbGlrZSB0byB0aGFuayB0aGUgZm9sbG93aW5nIHBlb3BsZSBmb3Igb2ZmZXJpbmcgc3VnZ2VzdGlvbnMsCi1jb3JyZWN0aW9ucyBhbmQgYXNzaXN0YW5jZSB3aXRoIHZhcmlvdXMgZHJhZnRzIG9mIHRoaXMgYXJ0aWNsZTogS29yYXkgQ2FuLCBIeWUtCi1TaGlrIENoYW5nLCBNaWNoYWVsIER5Y2ssIFJheW1vbmQgSGV0dGluZ2VyLCBCcmlhbiBIdXJ0LCBIYW1pc2ggTGF3c29uLCBGcmVkcmlrCi1MdW5kaCwgU2VhbiBSZWlmc2NobmVpZGVyLCBTYWRydWRkaW4gUmVqZWIuCitjb3JyZWN0aW9ucyBhbmQgYXNzaXN0YW5jZSB3aXRoIHZhcmlvdXMgZHJhZnRzIG9mIHRoaXMgYXJ0aWNsZTogS29yYXkgQ2FuLAorSHllLVNoaWsgQ2hhbmcsIE1pY2hhZWwgRHljaywgUmF5bW9uZCBIZXR0aW5nZXIsIEJyaWFuIEh1cnQsIEhhbWlzaCBMYXdzb24sCitGcmVkcmlrIEx1bmRoLCBTZWFuIFJlaWZzY2huZWlkZXIsIFNhZHJ1ZGRpbiBSZWplYi4KIApkaWZmIC0tZ2l0IGEvRG9jL3doYXRzbmV3LzIuNS5yc3QgYi9Eb2Mvd2hhdHNuZXcvMi41LnJzdAppbmRleCAyODI1ZGQ0Li5jNDIwYTE5IDEwMDY0NAotLS0gYS9Eb2Mvd2hhdHNuZXcvMi41LnJzdAorKysgYi9Eb2Mvd2hhdHNuZXcvMi41LnJzdApAQCAtMjg2LDcgKzI4Niw3IEBACiA6bW9kOmBwa2cuc3RyaW5nYCBhbmQgbG9vayBmb3IgdGhlIHN0YW5kYXJkIG1vZHVsZTsgZ2VuZXJhbGx5IHlvdSBoYWQgdG8gbG9vayBhdAogdGhlIGNvbnRlbnRzIG9mIGBgc3lzLm1vZHVsZXNgYCwgd2hpY2ggaXMgc2xpZ2h0bHkgdW5jbGVhbi4gICAgSG9sZ2VyIEtyZWtlbCdzCiA6bW9kOmBweS5zdGRgIHBhY2thZ2UgcHJvdmlkZXMgYSB0aWRpZXIgd2F5IHRvIHBlcmZvcm0gaW1wb3J0cyBmcm9tIHRoZSBzdGFuZGFyZAotbGlicmFyeSwgYGBpbXBvcnQgcHkgOyBweS5zdGQuc3RyaW5nLmpvaW4oKWBgLCBidXQgdGhhdCBwYWNrYWdlIGlzbid0IGF2YWlsYWJsZQorbGlicmFyeSwgYGBpbXBvcnQgcHk7IHB5LnN0ZC5zdHJpbmcuam9pbigpYGAsIGJ1dCB0aGF0IHBhY2thZ2UgaXNuJ3QgYXZhaWxhYmxlCiBvbiBhbGwgUHl0aG9uIGluc3RhbGxhdGlvbnMuCiAKIFJlYWRpbmcgY29kZSB3aGljaCByZWxpZXMgb24gcmVsYXRpdmUgaW1wb3J0cyBpcyBhbHNvIGxlc3MgY2xlYXIsIGJlY2F1c2UgYQpAQCAtODcwLDMxICs4NzAsMzEgQEAKIFBFUCAzNTM6IFVzaW5nIHNzaXplX3QgYXMgdGhlIGluZGV4IHR5cGUKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotQSB3aWRlLXJhbmdpbmcgY2hhbmdlIHRvIFB5dGhvbidzIEMgQVBJLCB1c2luZyBhIG5ldyAgOmN0eXBlOmBQeV9zc2l6ZV90YCB0eXBlCi1kZWZpbml0aW9uIGluc3RlYWQgb2YgOmN0eXBlOmBpbnRgLCAgd2lsbCBwZXJtaXQgdGhlIGludGVycHJldGVyIHRvIGhhbmRsZSBtb3JlCitBIHdpZGUtcmFuZ2luZyBjaGFuZ2UgdG8gUHl0aG9uJ3MgQyBBUEksIHVzaW5nIGEgbmV3ICA6Yzp0eXBlOmBQeV9zc2l6ZV90YCB0eXBlCitkZWZpbml0aW9uIGluc3RlYWQgb2YgOmM6dHlwZTpgaW50YCwgIHdpbGwgcGVybWl0IHRoZSBpbnRlcnByZXRlciB0byBoYW5kbGUgbW9yZQogZGF0YSBvbiA2NC1iaXQgcGxhdGZvcm1zLiBUaGlzIGNoYW5nZSBkb2Vzbid0IGFmZmVjdCBQeXRob24ncyBjYXBhY2l0eSBvbiAzMi1iaXQKIHBsYXRmb3Jtcy4KIAotVmFyaW91cyBwaWVjZXMgb2YgdGhlIFB5dGhvbiBpbnRlcnByZXRlciB1c2VkIEMncyA6Y3R5cGU6YGludGAgdHlwZSB0byBzdG9yZQorVmFyaW91cyBwaWVjZXMgb2YgdGhlIFB5dGhvbiBpbnRlcnByZXRlciB1c2VkIEMncyA6Yzp0eXBlOmBpbnRgIHR5cGUgdG8gc3RvcmUKIHNpemVzIG9yIGNvdW50czsgZm9yIGV4YW1wbGUsIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gYSBsaXN0IG9yIHR1cGxlIHdlcmUgc3RvcmVkCi1pbiBhbiA6Y3R5cGU6YGludGAuICBUaGUgQyBjb21waWxlcnMgZm9yIG1vc3QgNjQtYml0IHBsYXRmb3JtcyBzdGlsbCBkZWZpbmUKLTpjdHlwZTpgaW50YCBhcyBhIDMyLWJpdCB0eXBlLCBzbyB0aGF0IG1lYW50IHRoYXQgbGlzdHMgY291bGQgb25seSBob2xkIHVwIHRvCitpbiBhbiA6Yzp0eXBlOmBpbnRgLiAgVGhlIEMgY29tcGlsZXJzIGZvciBtb3N0IDY0LWJpdCBwbGF0Zm9ybXMgc3RpbGwgZGVmaW5lCis6Yzp0eXBlOmBpbnRgIGFzIGEgMzItYml0IHR5cGUsIHNvIHRoYXQgbWVhbnQgdGhhdCBsaXN0cyBjb3VsZCBvbmx5IGhvbGQgdXAgdG8KIGBgMioqMzEgLSAxYGAgPSAyMTQ3NDgzNjQ3IGl0ZW1zLiAoVGhlcmUgYXJlIGFjdHVhbGx5IGEgZmV3IGRpZmZlcmVudAogcHJvZ3JhbW1pbmcgbW9kZWxzIHRoYXQgNjQtYml0IEMgY29tcGlsZXJzIGNhbiB1c2UgLS0gc2VlCiBodHRwOi8vd3d3LnVuaXgub3JnL3ZlcnNpb24yL3doYXRzbmV3L2xwNjRfd3AuaHRtbCBmb3IgYSBkaXNjdXNzaW9uIC0tIGJ1dCB0aGUKLW1vc3QgY29tbW9ubHkgYXZhaWxhYmxlIG1vZGVsIGxlYXZlcyA6Y3R5cGU6YGludGAgYXMgMzIgYml0cy4pCittb3N0IGNvbW1vbmx5IGF2YWlsYWJsZSBtb2RlbCBsZWF2ZXMgOmM6dHlwZTpgaW50YCBhcyAzMiBiaXRzLikKIAogQSBsaW1pdCBvZiAyMTQ3NDgzNjQ3IGl0ZW1zIGRvZXNuJ3QgcmVhbGx5IG1hdHRlciBvbiBhIDMyLWJpdCBwbGF0Zm9ybSBiZWNhdXNlCiB5b3UnbGwgcnVuIG91dCBvZiBtZW1vcnkgYmVmb3JlIGhpdHRpbmcgdGhlIGxlbmd0aCBsaW1pdC4gRWFjaCBsaXN0IGl0ZW0KIHJlcXVpcmVzIHNwYWNlIGZvciBhIHBvaW50ZXIsIHdoaWNoIGlzIDQgYnl0ZXMsIHBsdXMgc3BhY2UgZm9yIGEKLTpjdHlwZTpgUHlPYmplY3RgIHJlcHJlc2VudGluZyB0aGUgaXRlbS4gIDIxNDc0ODM2NDdcKjQgaXMgYWxyZWFkeSBtb3JlIGJ5dGVzCis6Yzp0eXBlOmBQeU9iamVjdGAgcmVwcmVzZW50aW5nIHRoZSBpdGVtLiAgMjE0NzQ4MzY0N1wqNCBpcyBhbHJlYWR5IG1vcmUgYnl0ZXMKIHRoYW4gYSAzMi1iaXQgYWRkcmVzcyBzcGFjZSBjYW4gY29udGFpbi4KIAogSXQncyBwb3NzaWJsZSB0byBhZGRyZXNzIHRoYXQgbXVjaCBtZW1vcnkgb24gYSA2NC1iaXQgcGxhdGZvcm0sIGhvd2V2ZXIuICBUaGUKIHBvaW50ZXJzIGZvciBhIGxpc3QgdGhhdCBzaXplIHdvdWxkIG9ubHkgcmVxdWlyZSAxNiBHaUIgb2Ygc3BhY2UsIHNvIGl0J3Mgbm90CiB1bnJlYXNvbmFibGUgdGhhdCBQeXRob24gcHJvZ3JhbW1lcnMgbWlnaHQgY29uc3RydWN0IGxpc3RzIHRoYXQgbGFyZ2UuCiBUaGVyZWZvcmUsIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaGFkIHRvIGJlIGNoYW5nZWQgdG8gdXNlIHNvbWUgdHlwZSBvdGhlciB0aGFuCi06Y3R5cGU6YGludGAsIGFuZCB0aGlzIHdpbGwgYmUgYSA2NC1iaXQgdHlwZSBvbiA2NC1iaXQgcGxhdGZvcm1zLiAgVGhlIGNoYW5nZQorOmM6dHlwZTpgaW50YCwgYW5kIHRoaXMgd2lsbCBiZSBhIDY0LWJpdCB0eXBlIG9uIDY0LWJpdCBwbGF0Zm9ybXMuICBUaGUgY2hhbmdlCiB3aWxsIGNhdXNlIGluY29tcGF0aWJpbGl0aWVzIG9uIDY0LWJpdCBtYWNoaW5lcywgc28gaXQgd2FzIGRlZW1lZCB3b3J0aCBtYWtpbmcKIHRoZSB0cmFuc2l0aW9uIG5vdywgd2hpbGUgdGhlIG51bWJlciBvZiA2NC1iaXQgdXNlcnMgaXMgc3RpbGwgcmVsYXRpdmVseSBzbWFsbC4KIChJbiA1IG9yIDEwIHllYXJzLCB3ZSBtYXkgKmFsbCogYmUgb24gNjQtYml0IG1hY2hpbmVzLCBhbmQgdGhlIHRyYW5zaXRpb24gd291bGQKQEAgLTkwMiwxNSArOTAyLDE1IEBACiAKIFRoaXMgY2hhbmdlIG1vc3Qgc3Ryb25nbHkgYWZmZWN0cyBhdXRob3JzIG9mIEMgZXh0ZW5zaW9uIG1vZHVsZXMuICAgUHl0aG9uCiBzdHJpbmdzIGFuZCBjb250YWluZXIgdHlwZXMgc3VjaCBhcyBsaXN0cyBhbmQgdHVwbGVzICBub3cgdXNlCi06Y3R5cGU6YFB5X3NzaXplX3RgIHRvIHN0b3JlIHRoZWlyIHNpemUuICAgRnVuY3Rpb25zIHN1Y2ggYXMKLTpjZnVuYzpgUHlMaXN0X1NpemVgICBub3cgcmV0dXJuIDpjdHlwZTpgUHlfc3NpemVfdGAuICBDb2RlIGluIGV4dGVuc2lvbiBtb2R1bGVzCi1tYXkgdGhlcmVmb3JlIG5lZWQgdG8gaGF2ZSBzb21lIHZhcmlhYmxlcyBjaGFuZ2VkIHRvIDpjdHlwZTpgUHlfc3NpemVfdGAuCis6Yzp0eXBlOmBQeV9zc2l6ZV90YCB0byBzdG9yZSB0aGVpciBzaXplLiAgIEZ1bmN0aW9ucyBzdWNoIGFzCis6YzpmdW5jOmBQeUxpc3RfU2l6ZWAgIG5vdyByZXR1cm4gOmM6dHlwZTpgUHlfc3NpemVfdGAuICBDb2RlIGluIGV4dGVuc2lvbiBtb2R1bGVzCittYXkgdGhlcmVmb3JlIG5lZWQgdG8gaGF2ZSBzb21lIHZhcmlhYmxlcyBjaGFuZ2VkIHRvIDpjOnR5cGU6YFB5X3NzaXplX3RgLgogCi1UaGUgOmNmdW5jOmBQeUFyZ19QYXJzZVR1cGxlYCBhbmQgOmNmdW5jOmBQeV9CdWlsZFZhbHVlYCBmdW5jdGlvbnMgaGF2ZSBhIG5ldwotY29udmVyc2lvbiBjb2RlLCBgYG5gYCwgZm9yIDpjdHlwZTpgUHlfc3NpemVfdGAuICAgOmNmdW5jOmBQeUFyZ19QYXJzZVR1cGxlYCdzCi1gYHMjYGAgYW5kIGBgdCNgYCBzdGlsbCBvdXRwdXQgOmN0eXBlOmBpbnRgIGJ5IGRlZmF1bHQsIGJ1dCB5b3UgY2FuIGRlZmluZSB0aGUKLW1hY3JvICA6Y21hY3JvOmBQWV9TU0laRV9UX0NMRUFOYCBiZWZvcmUgaW5jbHVkaW5nIDpmaWxlOmBQeXRob24uaGAgIHRvIG1ha2UKLXRoZW0gcmV0dXJuIDpjdHlwZTpgUHlfc3NpemVfdGAuCitUaGUgOmM6ZnVuYzpgUHlBcmdfUGFyc2VUdXBsZWAgYW5kIDpjOmZ1bmM6YFB5X0J1aWxkVmFsdWVgIGZ1bmN0aW9ucyBoYXZlIGEgbmV3Citjb252ZXJzaW9uIGNvZGUsIGBgbmBgLCBmb3IgOmM6dHlwZTpgUHlfc3NpemVfdGAuICAgOmM6ZnVuYzpgUHlBcmdfUGFyc2VUdXBsZWAncworYGBzI2BgIGFuZCBgYHQjYGAgc3RpbGwgb3V0cHV0IDpjOnR5cGU6YGludGAgYnkgZGVmYXVsdCwgYnV0IHlvdSBjYW4gZGVmaW5lIHRoZQorbWFjcm8gIDpjOm1hY3JvOmBQWV9TU0laRV9UX0NMRUFOYCBiZWZvcmUgaW5jbHVkaW5nIDpmaWxlOmBQeXRob24uaGAgIHRvIG1ha2UKK3RoZW0gcmV0dXJuIDpjOnR5cGU6YFB5X3NzaXplX3RgLgogCiA6cGVwOmAzNTNgIGhhcyBhIHNlY3Rpb24gb24gY29udmVyc2lvbiBndWlkZWxpbmVzIHRoYXQgIGV4dGVuc2lvbiBhdXRob3JzIHNob3VsZAogcmVhZCB0byBsZWFybiBhYm91dCBzdXBwb3J0aW5nIDY0LWJpdCBwbGF0Zm9ybXMuCkBAIC05NTQsOCArOTU0LDggQEAKIDpleGM6YFR5cGVFcnJvcmAgaWYgdGhpcyByZXF1aXJlbWVudCBpc24ndCBtZXQuCiAKIEEgY29ycmVzcG9uZGluZyA6YXR0cjpgbmJfaW5kZXhgIHNsb3Qgd2FzIGFkZGVkIHRvIHRoZSBDLWxldmVsCi06Y3R5cGU6YFB5TnVtYmVyTWV0aG9kc2Agc3RydWN0dXJlIHRvIGxldCBDIGV4dGVuc2lvbnMgaW1wbGVtZW50IHRoaXMgcHJvdG9jb2wuCi06Y2Z1bmM6YFB5TnVtYmVyX0luZGV4KG9iailgIGNhbiBiZSB1c2VkIGluIGV4dGVuc2lvbiBjb2RlIHRvIGNhbGwgdGhlCis6Yzp0eXBlOmBQeU51bWJlck1ldGhvZHNgIHN0cnVjdHVyZSB0byBsZXQgQyBleHRlbnNpb25zIGltcGxlbWVudCB0aGlzIHByb3RvY29sLgorOmM6ZnVuYzpgUHlOdW1iZXJfSW5kZXgob2JqKWAgY2FuIGJlIHVzZWQgaW4gZXh0ZW5zaW9uIGNvZGUgdG8gY2FsbCB0aGUKIDptZXRoOmBfX2luZGV4X19gIGZ1bmN0aW9uIGFuZCByZXRyaWV2ZSBpdHMgcmVzdWx0LgogCiAKQEAgLTExNzksNyArMTE3OSw3IEBACiAgIChDb250cmlidXRlZCBieSBCb2IgSXBwb2xpdG8gYXQgdGhlIE5lZWRGb3JTcGVlZCBzcHJpbnQuKQogCiAqIFRoZSA6bW9kOmByZWAgbW9kdWxlIGdvdCBhIDEgb3IgMiUgc3BlZWR1cCBieSBzd2l0Y2hpbmcgdG8gIFB5dGhvbidzIGFsbG9jYXRvcgotICBmdW5jdGlvbnMgaW5zdGVhZCBvZiB0aGUgc3lzdGVtJ3MgIDpjZnVuYzpgbWFsbG9jYCBhbmQgOmNmdW5jOmBmcmVlYC4KKyAgZnVuY3Rpb25zIGluc3RlYWQgb2YgdGhlIHN5c3RlbSdzICA6YzpmdW5jOmBtYWxsb2NgIGFuZCA6YzpmdW5jOmBmcmVlYC4KICAgKENvbnRyaWJ1dGVkIGJ5IEphY2sgRGllZGVyaWNoIGF0IHRoZSBOZWVkRm9yU3BlZWQgc3ByaW50LikKIAogKiBUaGUgY29kZSBnZW5lcmF0b3IncyBwZWVwaG9sZSBvcHRpbWl6ZXIgbm93IHBlcmZvcm1zIHNpbXBsZSBjb25zdGFudCBmb2xkaW5nCkBAIC0xMjAzLDcgKzEyMDMsNyBAQAogICBTZWFuIFJlaWZzY2huZWlkZXIgYXQgdGhlIE5lZWRGb3JTcGVlZCBzcHJpbnQuKQogCiAqIEltcG9ydGluZyBub3cgY2FjaGVzIHRoZSBwYXRocyB0cmllZCwgcmVjb3JkaW5nIHdoZXRoZXIgIHRoZXkgZXhpc3Qgb3Igbm90IHNvCi0gIHRoYXQgdGhlIGludGVycHJldGVyIG1ha2VzIGZld2VyICA6Y2Z1bmM6YG9wZW5gIGFuZCA6Y2Z1bmM6YHN0YXRgIGNhbGxzIG9uCisgIHRoYXQgdGhlIGludGVycHJldGVyIG1ha2VzIGZld2VyICA6YzpmdW5jOmBvcGVuYCBhbmQgOmM6ZnVuYzpgc3RhdGAgY2FsbHMgb24KICAgc3RhcnR1cC4gKENvbnRyaWJ1dGVkIGJ5IE1hcnRpbiB2b24gTMO2d2lzIGFuZCBHZW9yZyBCcmFuZGwuKQogCiAgIC4uIFBhdGNoIDkyMTQ2NgpAQCAtMTMzOCwxMyArMTMzOCwxNyBAQAogCiAgIC4uIFhYWCBuZWVkIHRvIHByb3ZpZGUgc29tZSBtb3JlIGRldGFpbCBoZXJlCiAKKyAgLi4gaW5kZXg6OgorICAgICBzaW5nbGU6IHVuaXZlcnNhbCBuZXdsaW5lczsgV2hhdCdzIG5ldworCiAqIFRoZSA6bW9kOmBmaWxlaW5wdXRgIG1vZHVsZSB3YXMgbWFkZSBtb3JlIGZsZXhpYmxlLiBVbmljb2RlIGZpbGVuYW1lcyBhcmUgbm93CiAgIHN1cHBvcnRlZCwgYW5kIGEgKm1vZGUqIHBhcmFtZXRlciB0aGF0IGRlZmF1bHRzIHRvIGBgInIiYGAgd2FzIGFkZGVkIHRvIHRoZQotICA6ZnVuYzpgaW5wdXRgIGZ1bmN0aW9uIHRvIGFsbG93IG9wZW5pbmcgZmlsZXMgaW4gYmluYXJ5IG9yIHVuaXZlcnNhbC1uZXdsaW5lCi0gIG1vZGUuICBBbm90aGVyIG5ldyBwYXJhbWV0ZXIsICpvcGVuaG9vayosIGxldHMgeW91IHVzZSBhIGZ1bmN0aW9uIG90aGVyIHRoYW4KLSAgOmZ1bmM6YG9wZW5gICB0byBvcGVuIHRoZSBpbnB1dCBmaWxlcy4gIE9uY2UgeW91J3JlIGl0ZXJhdGluZyBvdmVyICB0aGUgc2V0IG9mCi0gIGZpbGVzLCB0aGUgOmNsYXNzOmBGaWxlSW5wdXRgIG9iamVjdCdzIG5ldyA6bWV0aDpgZmlsZW5vYCByZXR1cm5zIHRoZSBmaWxlCi0gIGRlc2NyaXB0b3IgZm9yIHRoZSBjdXJyZW50bHkgb3BlbmVkIGZpbGUuIChDb250cmlidXRlZCBieSBHZW9yZyBCcmFuZGwuKQorICA6ZnVuYzpgaW5wdXRgIGZ1bmN0aW9uIHRvIGFsbG93IG9wZW5pbmcgZmlsZXMgaW4gYmluYXJ5IG9yIDp0ZXJtOmB1bml2ZXJzYWwKKyAgbmV3bGluZXNgIG1vZGUuICBBbm90aGVyIG5ldyBwYXJhbWV0ZXIsICpvcGVuaG9vayosIGxldHMgeW91IHVzZSBhIGZ1bmN0aW9uCisgIG90aGVyIHRoYW4gOmZ1bmM6YG9wZW5gICB0byBvcGVuIHRoZSBpbnB1dCBmaWxlcy4gIE9uY2UgeW91J3JlIGl0ZXJhdGluZyBvdmVyCisgIHRoZSBzZXQgb2YgZmlsZXMsIHRoZSA6Y2xhc3M6YEZpbGVJbnB1dGAgb2JqZWN0J3MgbmV3IDptZXRoOmBmaWxlbm9gIHJldHVybnMKKyAgdGhlIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIGN1cnJlbnRseSBvcGVuZWQgZmlsZS4gKENvbnRyaWJ1dGVkIGJ5IEdlb3JnCisgIEJyYW5kbC4pCiAKICogSW4gdGhlIDptb2Q6YGdjYCBtb2R1bGUsIHRoZSBuZXcgOmZ1bmM6YGdldF9jb3VudGAgZnVuY3Rpb24gcmV0dXJucyBhIDMtdHVwbGUKICAgY29udGFpbmluZyB0aGUgY3VycmVudCBjb2xsZWN0aW9uIGNvdW50cyBmb3IgdGhlIHRocmVlIEdDIGdlbmVyYXRpb25zLiAgVGhpcyBpcwpAQCAtMTU2OCw3ICsxNTcyLDcgQEAKICAgcmVwb3J0aW5nIGBgKCdDUHl0aG9uJywgJ3RydW5rJywgJzQ1MzEzOjQ1MzE1JylgYC4KIAogICBUaGlzIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIHRvIEMgZXh0ZW5zaW9ucyB2aWEgdGhlCi0gIDpjZnVuYzpgUHlfR2V0QnVpbGRJbmZvYCBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSAgc3RyaW5nIG9mIGJ1aWxkIGluZm9ybWF0aW9uCisgIDpjOmZ1bmM6YFB5X0dldEJ1aWxkSW5mb2AgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgIHN0cmluZyBvZiBidWlsZCBpbmZvcm1hdGlvbgogICBsaWtlIHRoaXM6IGBgInRydW5rOjQ1MzU1OjQ1MzU2TSwgQXByIDEzIDIwMDYsIDA3OjQyOjE5ImBgLiAgIChDb250cmlidXRlZCBieQogICBCYXJyeSBXYXJzYXcuKQogCkBAIC0xNjkwLDcgKzE2OTQsNyBAQAogICAgcmVzdWx0ID0gbGliYy5wcmludGYoIkxpbmUgb2Ygb3V0cHV0XG4iKQogCiBUeXBlIGNvbnN0cnVjdG9ycyBmb3IgdGhlIHZhcmlvdXMgQyB0eXBlcyBhcmUgcHJvdmlkZWQ6IDpmdW5jOmBjX2ludGAsCi06ZnVuYzpgY19mbG9hdGAsIDpmdW5jOmBjX2RvdWJsZWAsIDpmdW5jOmBjX2NoYXJfcGAgKGVxdWl2YWxlbnQgdG8gOmN0eXBlOmBjaGFyCis6ZnVuYzpgY19mbG9hdGAsIDpmdW5jOmBjX2RvdWJsZWAsIDpmdW5jOmBjX2NoYXJfcGAgKGVxdWl2YWxlbnQgdG8gOmM6dHlwZTpgY2hhcgogXCpgKSwgYW5kIHNvIGZvcnRoLiAgVW5saWtlIFB5dGhvbidzIHR5cGVzLCB0aGUgQyB2ZXJzaW9ucyBhcmUgYWxsIG11dGFibGU7IHlvdQogY2FuIGFzc2lnbiB0byB0aGVpciA6YXR0cjpgdmFsdWVgIGF0dHJpYnV0ZSB0byBjaGFuZ2UgdGhlIHdyYXBwZWQgdmFsdWUuICBQeXRob24KIGludGVnZXJzIGFuZCBzdHJpbmdzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgQwpAQCAtMTcyMCw3ICsxNzI0LDcgQEAKIGBgY3R5cGVzLnB5dGhvbmFwaWBgIG9iamVjdC4gIFRoaXMgb2JqZWN0IGRvZXMgKm5vdCogIHJlbGVhc2UgdGhlIGdsb2JhbAogaW50ZXJwcmV0ZXIgbG9jayBiZWZvcmUgY2FsbGluZyBhIGZ1bmN0aW9uLCBiZWNhdXNlIHRoZSBsb2NrIG11c3QgYmUgaGVsZCB3aGVuCiBjYWxsaW5nIGludG8gdGhlIGludGVycHJldGVyJ3MgY29kZS4gICBUaGVyZSdzIGEgOmNsYXNzOmBweV9vYmplY3QoKWAgdHlwZQotY29uc3RydWN0b3IgdGhhdCB3aWxsIGNyZWF0ZSBhICA6Y3R5cGU6YFB5T2JqZWN0IFwqYCBwb2ludGVyLiAgQSBzaW1wbGUgdXNhZ2U6OgorY29uc3RydWN0b3IgdGhhdCB3aWxsIGNyZWF0ZSBhICA6Yzp0eXBlOmBQeU9iamVjdCBcKmAgcG9pbnRlci4gIEEgc2ltcGxlIHVzYWdlOjoKIAogICAgaW1wb3J0IGN0eXBlcwogCkBAIC0yMDg3LDggKzIwOTEsOCBAQAogICBodHRwOi8vc2Nhbi5jb3Zlcml0eS5jb20gZm9yIHRoZSBzdGF0aXN0aWNzLgogCiAqIFRoZSBsYXJnZXN0IGNoYW5nZSB0byB0aGUgQyBBUEkgY2FtZSBmcm9tIDpwZXA6YDM1M2AsIHdoaWNoIG1vZGlmaWVzIHRoZQotICBpbnRlcnByZXRlciB0byB1c2UgYSA6Y3R5cGU6YFB5X3NzaXplX3RgIHR5cGUgZGVmaW5pdGlvbiBpbnN0ZWFkIG9mCi0gIDpjdHlwZTpgaW50YC4gIFNlZSB0aGUgZWFybGllciBzZWN0aW9uIDpyZWY6YHBlcC0zNTNgIGZvciBhIGRpc2N1c3Npb24gb2YgdGhpcworICBpbnRlcnByZXRlciB0byB1c2UgYSA6Yzp0eXBlOmBQeV9zc2l6ZV90YCB0eXBlIGRlZmluaXRpb24gaW5zdGVhZCBvZgorICA6Yzp0eXBlOmBpbnRgLiAgU2VlIHRoZSBlYXJsaWVyIHNlY3Rpb24gOnJlZjpgcGVwLTM1M2AgZm9yIGEgZGlzY3Vzc2lvbiBvZiB0aGlzCiAgIGNoYW5nZS4KIAogKiBUaGUgZGVzaWduIG9mIHRoZSBieXRlY29kZSBjb21waWxlciBoYXMgY2hhbmdlZCBhIGdyZWF0IGRlYWwsICBubyBsb25nZXIKQEAgLTIxMTMsMTAgKzIxMTcsMTAgQEAKICAgZGlzY3Vzc2VzIHRoZSBkZXNpZ24uICBUbyBzdGFydCBsZWFybmluZyBhYm91dCB0aGUgY29kZSwgcmVhZCB0aGUgZGVmaW5pdGlvbiBvZgogICB0aGUgdmFyaW91cyBBU1Qgbm9kZXMgaW4gOmZpbGU6YFBhcnNlci9QeXRob24uYXNkbGAuICBBIFB5dGhvbiBzY3JpcHQgcmVhZHMgdGhpcwogICBmaWxlIGFuZCBnZW5lcmF0ZXMgYSBzZXQgb2YgQyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgaW4KLSAgOmZpbGU6YEluY2x1ZGUvUHl0aG9uLWFzdC5oYC4gIFRoZSA6Y2Z1bmM6YFB5UGFyc2VyX0FTVEZyb21TdHJpbmdgIGFuZAotICA6Y2Z1bmM6YFB5UGFyc2VyX0FTVEZyb21GaWxlYCwgZGVmaW5lZCBpbiA6ZmlsZTpgSW5jbHVkZS9weXRob25ydW4uaGAsIHRha2UKKyAgOmZpbGU6YEluY2x1ZGUvUHl0aG9uLWFzdC5oYC4gIFRoZSA6YzpmdW5jOmBQeVBhcnNlcl9BU1RGcm9tU3RyaW5nYCBhbmQKKyAgOmM6ZnVuYzpgUHlQYXJzZXJfQVNURnJvbUZpbGVgLCBkZWZpbmVkIGluIDpmaWxlOmBJbmNsdWRlL3B5dGhvbnJ1bi5oYCwgdGFrZQogICBQeXRob24gc291cmNlIGFzIGlucHV0IGFuZCByZXR1cm4gdGhlIHJvb3Qgb2YgYW4gQVNUIHJlcHJlc2VudGluZyB0aGUgY29udGVudHMuCi0gIFRoaXMgQVNUIGNhbiB0aGVuIGJlIHR1cm5lZCBpbnRvIGEgY29kZSBvYmplY3QgYnkgOmNmdW5jOmBQeUFTVF9Db21waWxlYC4gIEZvcgorICBUaGlzIEFTVCBjYW4gdGhlbiBiZSB0dXJuZWQgaW50byBhIGNvZGUgb2JqZWN0IGJ5IDpjOmZ1bmM6YFB5QVNUX0NvbXBpbGVgLiAgRm9yCiAgIG1vcmUgaW5mb3JtYXRpb24sIHJlYWQgdGhlIHNvdXJjZSBjb2RlLCBhbmQgdGhlbiBhc2sgcXVlc3Rpb25zIG9uIHB5dGhvbi1kZXYuCiAKICAgVGhlIEFTVCBjb2RlIHdhcyBkZXZlbG9wZWQgdW5kZXIgSmVyZW15IEh5bHRvbidzIG1hbmFnZW1lbnQsIGFuZCBpbXBsZW1lbnRlZCBieQpAQCAtMjEzOCw1NSArMjE0Miw1NSBAQAogCiAgIE5vdGUgdGhhdCB0aGlzIGNoYW5nZSBtZWFucyBleHRlbnNpb24gbW9kdWxlcyBtdXN0IGJlIG1vcmUgY2FyZWZ1bCB3aGVuCiAgIGFsbG9jYXRpbmcgbWVtb3J5LiAgUHl0aG9uJ3MgQVBJIGhhcyBtYW55IGRpZmZlcmVudCBmdW5jdGlvbnMgZm9yIGFsbG9jYXRpbmcKLSAgbWVtb3J5IHRoYXQgYXJlIGdyb3VwZWQgaW50byBmYW1pbGllcy4gIEZvciBleGFtcGxlLCA6Y2Z1bmM6YFB5TWVtX01hbGxvY2AsCi0gIDpjZnVuYzpgUHlNZW1fUmVhbGxvY2AsIGFuZCA6Y2Z1bmM6YFB5TWVtX0ZyZWVgIGFyZSBvbmUgZmFtaWx5IHRoYXQgYWxsb2NhdGVzCi0gIHJhdyBtZW1vcnksIHdoaWxlIDpjZnVuYzpgUHlPYmplY3RfTWFsbG9jYCwgOmNmdW5jOmBQeU9iamVjdF9SZWFsbG9jYCwgYW5kCi0gIDpjZnVuYzpgUHlPYmplY3RfRnJlZWAgYXJlIGFub3RoZXIgZmFtaWx5IHRoYXQncyBzdXBwb3NlZCB0byBiZSB1c2VkIGZvcgorICBtZW1vcnkgdGhhdCBhcmUgZ3JvdXBlZCBpbnRvIGZhbWlsaWVzLiAgRm9yIGV4YW1wbGUsIDpjOmZ1bmM6YFB5TWVtX01hbGxvY2AsCisgIDpjOmZ1bmM6YFB5TWVtX1JlYWxsb2NgLCBhbmQgOmM6ZnVuYzpgUHlNZW1fRnJlZWAgYXJlIG9uZSBmYW1pbHkgdGhhdCBhbGxvY2F0ZXMKKyAgcmF3IG1lbW9yeSwgd2hpbGUgOmM6ZnVuYzpgUHlPYmplY3RfTWFsbG9jYCwgOmM6ZnVuYzpgUHlPYmplY3RfUmVhbGxvY2AsIGFuZAorICA6YzpmdW5jOmBQeU9iamVjdF9GcmVlYCBhcmUgYW5vdGhlciBmYW1pbHkgdGhhdCdzIHN1cHBvc2VkIHRvIGJlIHVzZWQgZm9yCiAgIGNyZWF0aW5nIFB5dGhvbiBvYmplY3RzLgogCiAgIFByZXZpb3VzbHkgdGhlc2UgZGlmZmVyZW50IGZhbWlsaWVzIGFsbCByZWR1Y2VkIHRvIHRoZSBwbGF0Zm9ybSdzCi0gIDpjZnVuYzpgbWFsbG9jYCBhbmQgOmNmdW5jOmBmcmVlYCBmdW5jdGlvbnMuICBUaGlzIG1lYW50ICBpdCBkaWRuJ3QgbWF0dGVyIGlmCi0gIHlvdSBnb3QgdGhpbmdzIHdyb25nIGFuZCBhbGxvY2F0ZWQgbWVtb3J5IHdpdGggdGhlIDpjZnVuYzpgUHlNZW1gIGZ1bmN0aW9uIGJ1dAotICBmcmVlZCBpdCB3aXRoIHRoZSA6Y2Z1bmM6YFB5T2JqZWN0YCBmdW5jdGlvbi4gIFdpdGggMi41J3MgY2hhbmdlcyB0byBvYm1hbGxvYywKKyAgOmM6ZnVuYzpgbWFsbG9jYCBhbmQgOmM6ZnVuYzpgZnJlZWAgZnVuY3Rpb25zLiAgVGhpcyBtZWFudCAgaXQgZGlkbid0IG1hdHRlciBpZgorICB5b3UgZ290IHRoaW5ncyB3cm9uZyBhbmQgYWxsb2NhdGVkIG1lbW9yeSB3aXRoIHRoZSA6YzpmdW5jOmBQeU1lbWAgZnVuY3Rpb24gYnV0CisgIGZyZWVkIGl0IHdpdGggdGhlIDpjOmZ1bmM6YFB5T2JqZWN0YCBmdW5jdGlvbi4gIFdpdGggMi41J3MgY2hhbmdlcyB0byBvYm1hbGxvYywKICAgdGhlc2UgZmFtaWxpZXMgbm93IGRvIGRpZmZlcmVudCB0aGluZ3MgYW5kIG1pc21hdGNoZXMgd2lsbCBwcm9iYWJseSByZXN1bHQgaW4gYQogICBzZWdmYXVsdC4gIFlvdSBzaG91bGQgY2FyZWZ1bGx5IHRlc3QgeW91ciBDIGV4dGVuc2lvbiBtb2R1bGVzIHdpdGggUHl0aG9uIDIuNS4KIAotKiBUaGUgYnVpbHQtaW4gc2V0IHR5cGVzIG5vdyBoYXZlIGFuIG9mZmljaWFsIEMgQVBJLiAgQ2FsbCA6Y2Z1bmM6YFB5U2V0X05ld2AKLSAgYW5kIDpjZnVuYzpgUHlGcm96ZW5TZXRfTmV3YCB0byBjcmVhdGUgYSBuZXcgc2V0LCA6Y2Z1bmM6YFB5U2V0X0FkZGAgYW5kCi0gIDpjZnVuYzpgUHlTZXRfRGlzY2FyZGAgdG8gYWRkIGFuZCByZW1vdmUgZWxlbWVudHMsIGFuZCA6Y2Z1bmM6YFB5U2V0X0NvbnRhaW5zYAotICBhbmQgOmNmdW5jOmBQeVNldF9TaXplYCB0byBleGFtaW5lIHRoZSBzZXQncyBzdGF0ZS4gKENvbnRyaWJ1dGVkIGJ5IFJheW1vbmQKKyogVGhlIGJ1aWx0LWluIHNldCB0eXBlcyBub3cgaGF2ZSBhbiBvZmZpY2lhbCBDIEFQSS4gIENhbGwgOmM6ZnVuYzpgUHlTZXRfTmV3YAorICBhbmQgOmM6ZnVuYzpgUHlGcm96ZW5TZXRfTmV3YCB0byBjcmVhdGUgYSBuZXcgc2V0LCA6YzpmdW5jOmBQeVNldF9BZGRgIGFuZAorICA6YzpmdW5jOmBQeVNldF9EaXNjYXJkYCB0byBhZGQgYW5kIHJlbW92ZSBlbGVtZW50cywgYW5kIDpjOmZ1bmM6YFB5U2V0X0NvbnRhaW5zYAorICBhbmQgOmM6ZnVuYzpgUHlTZXRfU2l6ZWAgdG8gZXhhbWluZSB0aGUgc2V0J3Mgc3RhdGUuIChDb250cmlidXRlZCBieSBSYXltb25kCiAgIEhldHRpbmdlci4pCiAKICogQyBjb2RlIGNhbiBub3cgb2J0YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGFjdCByZXZpc2lvbiBvZiB0aGUgUHl0aG9uCi0gIGludGVycHJldGVyIGJ5IGNhbGxpbmcgdGhlICA6Y2Z1bmM6YFB5X0dldEJ1aWxkSW5mb2AgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEKKyAgaW50ZXJwcmV0ZXIgYnkgY2FsbGluZyB0aGUgIDpjOmZ1bmM6YFB5X0dldEJ1aWxkSW5mb2AgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEKICAgc3RyaW5nIG9mIGJ1aWxkIGluZm9ybWF0aW9uIGxpa2UgdGhpczogYGAidHJ1bms6NDUzNTU6NDUzNTZNLCBBcHIgMTMgMjAwNiwKICAgMDc6NDI6MTkiYGAuICAgKENvbnRyaWJ1dGVkIGJ5IEJhcnJ5IFdhcnNhdy4pCiAKICogVHdvIG5ldyBtYWNyb3MgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgQyBmdW5jdGlvbnMgdGhhdCBhcmUgbG9jYWwgdG8gdGhlCiAgIGN1cnJlbnQgZmlsZSBzbyB0aGF0IGEgZmFzdGVyIGNhbGxpbmcgY29udmVudGlvbiBjYW4gYmUgdXNlZC4KLSAgOmNmdW5jOmBQeV9MT0NBTCh0eXBlKWAgZGVjbGFyZXMgdGhlIGZ1bmN0aW9uIGFzIHJldHVybmluZyBhIHZhbHVlIG9mIHRoZQorICA6YzpmdW5jOmBQeV9MT0NBTCh0eXBlKWAgZGVjbGFyZXMgdGhlIGZ1bmN0aW9uIGFzIHJldHVybmluZyBhIHZhbHVlIG9mIHRoZQogICBzcGVjaWZpZWQgKnR5cGUqIGFuZCB1c2VzIGEgZmFzdC1jYWxsaW5nIHF1YWxpZmllci4KLSAgOmNmdW5jOmBQeV9MT0NBTF9JTkxJTkUodHlwZSlgIGRvZXMgdGhlIHNhbWUgdGhpbmcgYW5kIGFsc28gcmVxdWVzdHMgdGhlCi0gIGZ1bmN0aW9uIGJlIGlubGluZWQuICBJZiA6Y2Z1bmM6YFBZX0xPQ0FMX0FHR1JFU1NJVkVgIGlzIGRlZmluZWQgYmVmb3JlCisgIDpjOmZ1bmM6YFB5X0xPQ0FMX0lOTElORSh0eXBlKWAgZG9lcyB0aGUgc2FtZSB0aGluZyBhbmQgYWxzbyByZXF1ZXN0cyB0aGUKKyAgZnVuY3Rpb24gYmUgaW5saW5lZC4gIElmIDpjOmZ1bmM6YFBZX0xPQ0FMX0FHR1JFU1NJVkVgIGlzIGRlZmluZWQgYmVmb3JlCiAgIDpmaWxlOmBweXRob24uaGAgaXMgaW5jbHVkZWQsIGEgc2V0IG9mIG1vcmUgYWdncmVzc2l2ZSBvcHRpbWl6YXRpb25zIGFyZSBlbmFibGVkCiAgIGZvciB0aGUgbW9kdWxlOyB5b3Ugc2hvdWxkIGJlbmNobWFyayB0aGUgcmVzdWx0cyB0byBmaW5kIG91dCBpZiB0aGVzZQogICBvcHRpbWl6YXRpb25zIGFjdHVhbGx5IG1ha2UgdGhlIGNvZGUgZmFzdGVyLiAgKENvbnRyaWJ1dGVkIGJ5IEZyZWRyaWsgTHVuZGggYXQKICAgdGhlIE5lZWRGb3JTcGVlZCBzcHJpbnQuKQogCi0qIDpjZnVuYzpgUHlFcnJfTmV3RXhjZXB0aW9uKG5hbWUsIGJhc2UsIGRpY3QpYCBjYW4gbm93IGFjY2VwdCBhIHR1cGxlIG9mIGJhc2UKKyogOmM6ZnVuYzpgUHlFcnJfTmV3RXhjZXB0aW9uKG5hbWUsIGJhc2UsIGRpY3QpYCBjYW4gbm93IGFjY2VwdCBhIHR1cGxlIG9mIGJhc2UKICAgY2xhc3NlcyBhcyBpdHMgKmJhc2UqIGFyZ3VtZW50LiAgKENvbnRyaWJ1dGVkIGJ5IEdlb3JnIEJyYW5kbC4pCiAKLSogVGhlIDpjZnVuYzpgUHlFcnJfV2FybmAgZnVuY3Rpb24gZm9yIGlzc3Vpbmcgd2FybmluZ3MgaXMgbm93IGRlcHJlY2F0ZWQgaW4KLSAgZmF2b3VyIG9mIDpjZnVuYzpgUHlFcnJfV2FybkV4KGNhdGVnb3J5LCBtZXNzYWdlLCBzdGFja2xldmVsKWAgd2hpY2ggbGV0cyB5b3UKKyogVGhlIDpjOmZ1bmM6YFB5RXJyX1dhcm5gIGZ1bmN0aW9uIGZvciBpc3N1aW5nIHdhcm5pbmdzIGlzIG5vdyBkZXByZWNhdGVkIGluCisgIGZhdm91ciBvZiA6YzpmdW5jOmBQeUVycl9XYXJuRXgoY2F0ZWdvcnksIG1lc3NhZ2UsIHN0YWNrbGV2ZWwpYCB3aGljaCBsZXRzIHlvdQogICBzcGVjaWZ5IHRoZSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHNlcGFyYXRpbmcgdGhpcyBmdW5jdGlvbiBhbmQgdGhlIGNhbGxlci4gIEEKLSAgKnN0YWNrbGV2ZWwqIG9mIDEgaXMgdGhlIGZ1bmN0aW9uIGNhbGxpbmcgOmNmdW5jOmBQeUVycl9XYXJuRXhgLCAyIGlzIHRoZQorICAqc3RhY2tsZXZlbCogb2YgMSBpcyB0aGUgZnVuY3Rpb24gY2FsbGluZyA6YzpmdW5jOmBQeUVycl9XYXJuRXhgLCAyIGlzIHRoZQogICBmdW5jdGlvbiBhYm92ZSB0aGF0LCBhbmQgc28gZm9ydGguICAoQWRkZWQgYnkgTmVhbCBOb3J3aXR6LikKIAogKiBUaGUgQ1B5dGhvbiBpbnRlcnByZXRlciBpcyBzdGlsbCB3cml0dGVuIGluIEMsIGJ1dCAgdGhlIGNvZGUgY2FuIG5vdyBiZQogICBjb21waWxlZCB3aXRoIGEgQysrIGNvbXBpbGVyIHdpdGhvdXQgZXJyb3JzLiAgIChJbXBsZW1lbnRlZCBieSBBbnRob255IEJheHRlciwKICAgTWFydGluIHZvbiBMw7Z3aXMsIFNraXAgTW9udGFuYXJvLikKIAotKiBUaGUgOmNmdW5jOmBQeVJhbmdlX05ld2AgZnVuY3Rpb24gd2FzIHJlbW92ZWQuICBJdCB3YXMgbmV2ZXIgZG9jdW1lbnRlZCwgbmV2ZXIKKyogVGhlIDpjOmZ1bmM6YFB5UmFuZ2VfTmV3YCBmdW5jdGlvbiB3YXMgcmVtb3ZlZC4gIEl0IHdhcyBuZXZlciBkb2N1bWVudGVkLCBuZXZlcgogICB1c2VkIGluIHRoZSBjb3JlIGNvZGUsIGFuZCBoYWQgZGFuZ2Vyb3VzbHkgbGF4IGVycm9yIGNoZWNraW5nLiAgSW4gdGhlIHVubGlrZWx5CiAgIGNhc2UgdGhhdCB5b3VyIGV4dGVuc2lvbnMgd2VyZSB1c2luZyBpdCwgeW91IGNhbiByZXBsYWNlIGl0IGJ5IHNvbWV0aGluZyBsaWtlCiAgIHRoZSBmb2xsb3dpbmc6OgpAQCAtMjIwMyw3ICsyMjA3LDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAqIE1hY09TIFggKDEwLjMgYW5kIGhpZ2hlcik6IGR5bmFtaWMgbG9hZGluZyBvZiBtb2R1bGVzIG5vdyB1c2VzIHRoZQotICA6Y2Z1bmM6YGRsb3BlbmAgZnVuY3Rpb24gaW5zdGVhZCBvZiBNYWNPUy1zcGVjaWZpYyBmdW5jdGlvbnMuCisgIDpjOmZ1bmM6YGRsb3BlbmAgZnVuY3Rpb24gaW5zdGVhZCBvZiBNYWNPUy1zcGVjaWZpYyBmdW5jdGlvbnMuCiAKICogTWFjT1MgWDogYW4gOm9wdGlvbjpgLS1lbmFibGUtdW5pdmVyc2Fsc2RrYCBzd2l0Y2ggd2FzIGFkZGVkIHRvIHRoZQogICA6cHJvZ3JhbTpgY29uZmlndXJlYCBzY3JpcHQgdGhhdCBjb21waWxlcyB0aGUgaW50ZXJwcmV0ZXIgYXMgYSB1bml2ZXJzYWwgYmluYXJ5CkBAIC0yMjU5LDE1ICsyMjYzLDE1IEBACiAgIFNldHRpbmcgIDphdHRyOmBycGNfcGF0aHNgIHRvIGBgTm9uZWBgIG9yIGFuIGVtcHR5IHR1cGxlIGRpc2FibGVzICB0aGlzIHBhdGgKICAgY2hlY2tpbmcuCiAKLSogQyBBUEk6IE1hbnkgZnVuY3Rpb25zIG5vdyB1c2UgOmN0eXBlOmBQeV9zc2l6ZV90YCAgaW5zdGVhZCBvZiA6Y3R5cGU6YGludGAgdG8KKyogQyBBUEk6IE1hbnkgZnVuY3Rpb25zIG5vdyB1c2UgOmM6dHlwZTpgUHlfc3NpemVfdGAgIGluc3RlYWQgb2YgOmM6dHlwZTpgaW50YCB0bwogICBhbGxvdyBwcm9jZXNzaW5nIG1vcmUgZGF0YSBvbiA2NC1iaXQgbWFjaGluZXMuICBFeHRlbnNpb24gY29kZSBtYXkgbmVlZCB0byBtYWtlCiAgIHRoZSBzYW1lIGNoYW5nZSB0byBhdm9pZCB3YXJuaW5ncyBhbmQgdG8gc3VwcG9ydCA2NC1iaXQgbWFjaGluZXMuICBTZWUgdGhlCiAgIGVhcmxpZXIgc2VjdGlvbiA6cmVmOmBwZXAtMzUzYCBmb3IgYSBkaXNjdXNzaW9uIG9mIHRoaXMgY2hhbmdlLgogCiAqIEMgQVBJOiAgVGhlIG9ibWFsbG9jIGNoYW5nZXMgbWVhbiB0aGF0ICB5b3UgbXVzdCBiZSBjYXJlZnVsIHRvIG5vdCBtaXggdXNhZ2UKLSAgb2YgdGhlIDpjZnVuYzpgUHlNZW1fXCpgIGFuZCA6Y2Z1bmM6YFB5T2JqZWN0X1wqYCBmYW1pbGllcyBvZiBmdW5jdGlvbnMuIE1lbW9yeQotICBhbGxvY2F0ZWQgd2l0aCAgb25lIGZhbWlseSdzIDpjZnVuYzpgXCpfTWFsbG9jYCBtdXN0IGJlICBmcmVlZCB3aXRoIHRoZQotICBjb3JyZXNwb25kaW5nIGZhbWlseSdzIDpjZnVuYzpgXCpfRnJlZWAgZnVuY3Rpb24uCisgIG9mIHRoZSA6YzpmdW5jOmBQeU1lbV9cKmAgYW5kIDpjOmZ1bmM6YFB5T2JqZWN0X1wqYCBmYW1pbGllcyBvZiBmdW5jdGlvbnMuIE1lbW9yeQorICBhbGxvY2F0ZWQgd2l0aCAgb25lIGZhbWlseSdzIDpjOmZ1bmM6YFwqX01hbGxvY2AgbXVzdCBiZSAgZnJlZWQgd2l0aCB0aGUKKyAgY29ycmVzcG9uZGluZyBmYW1pbHkncyA6YzpmdW5jOmBcKl9GcmVlYCBmdW5jdGlvbi4KIAogLi4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCmRpZmYgLS1naXQgYS9Eb2Mvd2hhdHNuZXcvMi42LnJzdCBiL0RvYy93aGF0c25ldy8yLjYucnN0CmluZGV4IGNjYzk3YjguLmNlZmRjYWYgMTAwNjQ0Ci0tLSBhL0RvYy93aGF0c25ldy8yLjYucnN0CisrKyBiL0RvYy93aGF0c25ldy8yLjYucnN0CkBAIC01LDggKzUsNiBAQAogLi4gWFhYIGFkZCB0cmFkZW1hcmsgaW5mbyBmb3IgQXBwbGUsIE1pY3Jvc29mdCwgU291cmNlRm9yZ2UuCiAKIDpBdXRob3I6IEEuTS4gS3VjaGxpbmcgKGFtayBhdCBhbWsuY2EpCi06UmVsZWFzZTogfHJlbGVhc2V8Ci06RGF0ZTogfHRvZGF5fAogCiAuLiAkSWQkCiAgICBSdWxlcyBmb3IgbWFpbnRlbmFuY2U6CkBAIC0xMjEsNyArMTE5LDcgQEAKIHdpdGggdGhpcyBzd2l0Y2ggdG8gc2VlIGhvdyBtdWNoIHdvcmsgd2lsbCBiZSBuZWNlc3NhcnkgdG8gcG9ydAogY29kZSB0byAzLjAuICBUaGUgdmFsdWUgb2YgdGhpcyBzd2l0Y2ggaXMgYXZhaWxhYmxlCiB0byBQeXRob24gY29kZSBhcyB0aGUgYm9vbGVhbiB2YXJpYWJsZSA6ZGF0YTpgc3lzLnB5M2t3YXJuaW5nYCwKLWFuZCB0byBDIGV4dGVuc2lvbiBjb2RlIGFzIDpjZGF0YTpgUHlfUHkza1dhcm5pbmdGbGFnYC4KK2FuZCB0byBDIGV4dGVuc2lvbiBjb2RlIGFzIDpjOmRhdGE6YFB5X1B5M2tXYXJuaW5nRmxhZ2AuCiAKIC4uIHNlZWFsc286OgogCkBAIC0yMzIsNyArMjMwLDcgQEAKIAogLi4gc2VlYWxzbzo6CiAKLSAgIDpyZWY6YGRvY3VtZW50aW5nLWluZGV4YAorICAgYERvY3VtZW50aW5nIFB5dGhvbiA8aHR0cDovL2RvY3MucHl0aG9uLm9yZy9kZXZndWlkZS9kb2N1bWVudGluZy5odG1sPmBfXwogICAgICAgIERlc2NyaWJlcyBob3cgdG8gd3JpdGUgZm9yIFB5dGhvbidzIGRvY3VtZW50YXRpb24uCiAKICAgIGBTcGhpbnggPGh0dHA6Ly9zcGhpbngucG9jb28ub3JnLz5gX18KQEAgLTYxMSw4ICs2MDksOCBAQAogICAgICAgICByZXN1bHQgPSBxdWV1ZS5nZXQoKQogICAgICAgICBwcmludCAnRmFjdG9yaWFsJywgTiwgJz0nLCByZXN1bHQKIAotQSA6Y2xhc3M6YFF1ZXVlYCBpcyB1c2VkIHRvIGNvbW11bmljYXRlIHRoZSBpbnB1dCBwYXJhbWV0ZXIgKk4qIGFuZAotdGhlIHJlc3VsdC4gIFRoZSA6Y2xhc3M6YFF1ZXVlYCBvYmplY3QgaXMgc3RvcmVkIGluIGEgZ2xvYmFsIHZhcmlhYmxlLgorQSA6Y2xhc3M6YFF1ZXVlYCBpcyB1c2VkIHRvIGNvbW11bmljYXRlIHRoZSByZXN1bHQgb2YgdGhlIGZhY3RvcmlhbC4KK1RoZSA6Y2xhc3M6YFF1ZXVlYCBvYmplY3QgaXMgc3RvcmVkIGluIGEgZ2xvYmFsIHZhcmlhYmxlLgogVGhlIGNoaWxkIHByb2Nlc3Mgd2lsbCB1c2UgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSB3aGVuIHRoZSBjaGlsZAogd2FzIGNyZWF0ZWQ7IGJlY2F1c2UgaXQncyBhIDpjbGFzczpgUXVldWVgLCBwYXJlbnQgYW5kIGNoaWxkIGNhbiB1c2UKIHRoZSBvYmplY3QgdG8gY29tbXVuaWNhdGUuICAoSWYgdGhlIHBhcmVudCB3ZXJlIHRvIGNoYW5nZSB0aGUgdmFsdWUgb2YKQEAgLTk3NSwxMCArOTczLDEwIEBACiAgICAgcHJpbnQgbGVuKHMpICAgICAgICAgICAgICAgIyAxMiBVbmljb2RlIGNoYXJhY3RlcnMKIAogQXQgdGhlIEMgbGV2ZWwsIFB5dGhvbiAzLjAgd2lsbCByZW5hbWUgdGhlIGV4aXN0aW5nIDgtYml0Ci1zdHJpbmcgdHlwZSwgY2FsbGVkIDpjdHlwZTpgUHlTdHJpbmdPYmplY3RgIGluIFB5dGhvbiAyLngsCi10byA6Y3R5cGU6YFB5Qnl0ZXNPYmplY3RgLiAgUHl0aG9uIDIuNiB1c2VzIGBgI2RlZmluZWBgCi10byBzdXBwb3J0IHVzaW5nIHRoZSBuYW1lcyA6Y2Z1bmM6YFB5Qnl0ZXNPYmplY3RgLAotOmNmdW5jOmBQeUJ5dGVzX0NoZWNrYCwgOmNmdW5jOmBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplYCwKK3N0cmluZyB0eXBlLCBjYWxsZWQgOmM6dHlwZTpgUHlTdHJpbmdPYmplY3RgIGluIFB5dGhvbiAyLngsCit0byA6Yzp0eXBlOmBQeUJ5dGVzT2JqZWN0YC4gIFB5dGhvbiAyLjYgdXNlcyBgYCNkZWZpbmVgYAordG8gc3VwcG9ydCB1c2luZyB0aGUgbmFtZXMgOmM6ZnVuYzpgUHlCeXRlc09iamVjdGAsCis6YzpmdW5jOmBQeUJ5dGVzX0NoZWNrYCwgOmM6ZnVuYzpgUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZWAsCiBhbmQgYWxsIHRoZSBvdGhlciBmdW5jdGlvbnMgYW5kIG1hY3JvcyB1c2VkIHdpdGggc3RyaW5ncy4KIAogSW5zdGFuY2VzIG9mIHRoZSA6Y2xhc3M6YGJ5dGVzYCB0eXBlIGFyZSBpbW11dGFibGUganVzdApAQCAtMTAxMCw4ICsxMDA4LDggQEAKICAgICBieXRlYXJyYXkoYidBQkNkZScpCiAKIFRoZXJlJ3MgYWxzbyBhIGNvcnJlc3BvbmRpbmcgQyBBUEksIHdpdGgKLTpjZnVuYzpgUHlCeXRlQXJyYXlfRnJvbU9iamVjdGAsCi06Y2Z1bmM6YFB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplYCwKKzpjOmZ1bmM6YFB5Qnl0ZUFycmF5X0Zyb21PYmplY3RgLAorOmM6ZnVuYzpgUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemVgLAogYW5kIHZhcmlvdXMgb3RoZXIgZnVuY3Rpb25zLgogCiAuLiBzZWVhbHNvOjoKQEAgLTEwNjcsOSArMTA2NSwxMiBAQAogICBUaGUgOmNsYXNzOmBCeXRlc0lPYCBjbGFzcyBzdXBwb3J0cyByZWFkaW5nLCB3cml0aW5nLCBhbmQgc2Vla2luZwogICBvdmVyIGFuIGluLW1lbW9yeSBidWZmZXIuCiAKKyAgLi4gaW5kZXg6OgorICAgICBzaW5nbGU6IHVuaXZlcnNhbCBuZXdsaW5lczsgV2hhdCdzIG5ldworCiAqIDpjbGFzczpgVGV4dElPQmFzZWA6IFByb3ZpZGVzIGZ1bmN0aW9ucyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZwogICBzdHJpbmdzIChyZW1lbWJlciwgc3RyaW5ncyB3aWxsIGJlIFVuaWNvZGUgaW4gUHl0aG9uIDMuMCksCi0gIGFuZCBzdXBwb3J0aW5nIHVuaXZlcnNhbCBuZXdsaW5lcy4gIDpjbGFzczpgVGV4dElPQmFzZWAgZGVmaW5lcworICBhbmQgc3VwcG9ydGluZyA6dGVybTpgdW5pdmVyc2FsIG5ld2xpbmVzYC4gIDpjbGFzczpgVGV4dElPQmFzZWAgZGVmaW5lcwogICB0aGUgOm1ldGg6YHJlYWRsaW5lYCBtZXRob2QgYW5kIHN1cHBvcnRzIGl0ZXJhdGlvbiB1cG9uCiAgIG9iamVjdHMuCiAKQEAgLTExMzAsNyArMTEzMSw3IEBACiAKIC4uIFhYWCBQeU9iamVjdF9HZXRCdWZmZXIgbm90IGRvY3VtZW50ZWQgaW4gYy1hcGkKIAotVGhlICpmbGFncyogYXJndW1lbnQgdG8gOmNmdW5jOmBQeU9iamVjdF9HZXRCdWZmZXJgIHNwZWNpZmllcworVGhlICpmbGFncyogYXJndW1lbnQgdG8gOmM6ZnVuYzpgUHlPYmplY3RfR2V0QnVmZmVyYCBzcGVjaWZpZXMKIGNvbnN0cmFpbnRzIHVwb24gdGhlIG1lbW9yeSByZXR1cm5lZC4gIFNvbWUgZXhhbXBsZXMgYXJlOgogCiAgKiA6Y29uc3Q6YFB5QlVGX1dSSVRBQkxFYCBpbmRpY2F0ZXMgdGhhdCB0aGUgbWVtb3J5IG11c3QgYmUgd3JpdGFibGUuCkBAIC0xMTQxLDcgKzExNDIsNyBAQAogICAgcmVxdWVzdHMgYSBDLWNvbnRpZ3VvdXMgKGxhc3QgZGltZW5zaW9uIHZhcmllcyB0aGUgZmFzdGVzdCkgb3IKICAgIEZvcnRyYW4tY29udGlndW91cyAoZmlyc3QgZGltZW5zaW9uIHZhcmllcyB0aGUgZmFzdGVzdCkgYXJyYXkgbGF5b3V0LgogCi1Ud28gbmV3IGFyZ3VtZW50IGNvZGVzIGZvciA6Y2Z1bmM6YFB5QXJnX1BhcnNlVHVwbGVgLAorVHdvIG5ldyBhcmd1bWVudCBjb2RlcyBmb3IgOmM6ZnVuYzpgUHlBcmdfUGFyc2VUdXBsZWAsCiBgYHMqYGAgYW5kIGBgeipgYCwgcmV0dXJuIGxvY2tlZCBidWZmZXIgb2JqZWN0cyBmb3IgYSBwYXJhbWV0ZXIuCiAKIC4uIHNlZWFsc286OgpAQCAtMTYzNSw3ICsxNjM2LDcgQEAKICAgOm1ldGg6YF9faGFzaF9fYCBtZXRob2QgaW5oZXJpdGVkIGZyb20gYSBwYXJlbnQgY2xhc3MsIHNvCiAgIGFzc2lnbmluZyBgYE5vbmVgYCB3YXMgaW1wbGVtZW50ZWQgYXMgYW4gb3ZlcnJpZGUuICBBdCB0aGUKICAgQyBsZXZlbCwgZXh0ZW5zaW9ucyBjYW4gc2V0IGBgdHBfaGFzaGBgIHRvCi0gIDpjZnVuYzpgUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkYC4KKyAgOmM6ZnVuYzpgUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkYC4KICAgKEZpeGVkIGJ5IE5pY2sgQ29naGxhbiBhbmQgQW1hdXJ5IEZvcmdlb3QgZCdBcmM7IDppc3N1ZTpgMjIzNWAuKQogCiAqIFRoZSA6ZXhjOmBHZW5lcmF0b3JFeGl0YCBleGNlcHRpb24gbm93IHN1YmNsYXNzZXMKQEAgLTE3MDUsNyArMTcwNiw3IEBACiAgIEJ5IGRlZmF1bHQsIHRoaXMgY2hhbmdlIGlzIG9ubHkgYXBwbGllZCB0byB0eXBlcyB0aGF0IGFyZSBpbmNsdWRlZCB3aXRoCiAgIHRoZSBQeXRob24gY29yZS4gIEV4dGVuc2lvbiBtb2R1bGVzIG1heSBub3QgbmVjZXNzYXJpbHkgYmUgY29tcGF0aWJsZSB3aXRoCiAgIHRoaXMgY2FjaGUsCi0gIHNvIHRoZXkgbXVzdCBleHBsaWNpdGx5IGFkZCA6Y21hY3JvOmBQeV9UUEZMQUdTX0hBVkVfVkVSU0lPTl9UQUdgCisgIHNvIHRoZXkgbXVzdCBleHBsaWNpdGx5IGFkZCA6YzptYWNybzpgUHlfVFBGTEFHU19IQVZFX1ZFUlNJT05fVEFHYAogICB0byB0aGUgbW9kdWxlJ3MgYGB0cF9mbGFnc2BgIGZpZWxkIHRvIGVuYWJsZSB0aGUgbWV0aG9kIGNhY2hlLgogICAoVG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBtZXRob2QgY2FjaGUsIHRoZSBleHRlbnNpb24gbW9kdWxlJ3MgY29kZQogICBtdXN0IG5vdCBkaXJlY3RseSBhY2Nlc3MgYW5kIG1vZGlmeSB0aGUgYGB0cF9kaWN0YGAgbWVtYmVyIG9mCkBAIC0xODg2LDcgKzE4ODcsNyBAQAogICAgID4+PiBkcT1kZXF1ZShtYXhsZW49MykKICAgICA+Pj4gZHEKICAgICBkZXF1ZShbXSwgbWF4bGVuPTMpCi0gICAgPj4+IGRxLmFwcGVuZCgxKSA7IGRxLmFwcGVuZCgyKSA7IGRxLmFwcGVuZCgzKQorICAgID4+PiBkcS5hcHBlbmQoMSk7IGRxLmFwcGVuZCgyKTsgZHEuYXBwZW5kKDMpCiAgICAgPj4+IGRxCiAgICAgZGVxdWUoWzEsIDIsIDNdLCBtYXhsZW49MykKICAgICA+Pj4gZHEuYXBwZW5kKDQpCkBAIC0yMjg0LDcgKzIyODUsNyBAQAogICAoQ29udHJpYnV0ZWQgYnkgUmF5bW9uZCBIZXR0aW5nZXI7IDppc3N1ZTpgMTg2MWAuKQogCiAqIFRoZSA6bW9kOmBzZWxlY3RgIG1vZHVsZSBub3cgaGFzIHdyYXBwZXIgZnVuY3Rpb25zCi0gIGZvciB0aGUgTGludXggOmNmdW5jOmBlcG9sbGAgYW5kIEJTRCA6Y2Z1bmM6YGtxdWV1ZWAgc3lzdGVtIGNhbGxzLgorICBmb3IgdGhlIExpbnV4IDpjOmZ1bmM6YGVwb2xsYCBhbmQgQlNEIDpjOmZ1bmM6YGtxdWV1ZWAgc3lzdGVtIGNhbGxzLgogICA6bWV0aDpgbW9kaWZ5YCBtZXRob2Qgd2FzIGFkZGVkIHRvIHRoZSBleGlzdGluZyA6Y2xhc3M6YHBvbGxgCiAgIG9iamVjdHM7IGBgcG9sbG9iai5tb2RpZnkoZmQsIGV2ZW50bWFzaylgYCB0YWtlcyBhIGZpbGUgZGVzY3JpcHRvcgogICBvciBmaWxlIG9iamVjdCBhbmQgYW4gZXZlbnQgbWFzaywgbW9kaWZ5aW5nIHRoZSByZWNvcmRlZCBldmVudCBtYXNrCkBAIC0yMzE3LDEzICsyMzE4LDEzIEBACiAgIENhbGxpbmcgYGBzaWduYWwuc2V0X3dha2V1cF9mZChmZClgYCBzZXRzIGEgZmlsZSBkZXNjcmlwdG9yCiAgIHRvIGJlIHVzZWQ7IHdoZW4gYSBzaWduYWwgaXMgcmVjZWl2ZWQsIGEgYnl0ZSBpcyB3cml0dGVuIHRvIHRoYXQKICAgZmlsZSBkZXNjcmlwdG9yLiAgVGhlcmUncyBhbHNvIGEgQy1sZXZlbCBmdW5jdGlvbiwKLSAgOmNmdW5jOmBQeVNpZ25hbF9TZXRXYWtldXBGZGAsIGZvciBzZXR0aW5nIHRoZSBkZXNjcmlwdG9yLgorICA6YzpmdW5jOmBQeVNpZ25hbF9TZXRXYWtldXBGZGAsIGZvciBzZXR0aW5nIHRoZSBkZXNjcmlwdG9yLgogCiAgIEV2ZW50IGxvb3BzIHdpbGwgdXNlIHRoaXMgYnkgb3BlbmluZyBhIHBpcGUgdG8gY3JlYXRlIHR3byBkZXNjcmlwdG9ycywKICAgb25lIGZvciByZWFkaW5nIGFuZCBvbmUgZm9yIHdyaXRpbmcuICBUaGUgd3JpdGFibGUgZGVzY3JpcHRvcgogICB3aWxsIGJlIHBhc3NlZCB0byA6ZnVuYzpgc2V0X3dha2V1cF9mZGAsIGFuZCB0aGUgcmVhZGFibGUgZGVzY3JpcHRvcgogICB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIGRlc2NyaXB0b3JzIG1vbml0b3JlZCBieSB0aGUgZXZlbnQgbG9vcCB2aWEKLSAgOmNmdW5jOmBzZWxlY3RgIG9yIDpjZnVuYzpgcG9sbGAuCisgIDpjOmZ1bmM6YHNlbGVjdGAgb3IgOmM6ZnVuYzpgcG9sbGAuCiAgIE9uIHJlY2VpdmluZyBhIHNpZ25hbCwgYSBieXRlIHdpbGwgYmUgd3JpdHRlbiBhbmQgdGhlIG1haW4gZXZlbnQgbG9vcAogICB3aWxsIGJlIHdva2VuIHVwLCBhdm9pZGluZyB0aGUgbmVlZCB0byBwb2xsLgogCkBAIC0yMzg0LDcgKzIzODUsNyBAQAogICBoYXMgYmVlbiB1cGRhdGVkIGZyb20gdmVyc2lvbiAyLjMuMiBpbiBQeXRob24gMi41IHRvCiAgIHZlcnNpb24gMi40LjEuCiAKLSogVGhlIDptb2Q6YHN0cnVjdGAgbW9kdWxlIG5vdyBzdXBwb3J0cyB0aGUgQzk5IDpjdHlwZTpgX0Jvb2xgIHR5cGUsCisqIFRoZSA6bW9kOmBzdHJ1Y3RgIG1vZHVsZSBub3cgc3VwcG9ydHMgdGhlIEM5OSA6Yzp0eXBlOmBfQm9vbGAgdHlwZSwKICAgdXNpbmcgdGhlIGZvcm1hdCBjaGFyYWN0ZXIgYGAnPydgYC4KICAgKENvbnRyaWJ1dGVkIGJ5IERhdmlkIFJlbWFobC4pCiAKQEAgLTIzOTIsNyArMjM5Myw3IEBACiAgIG5vdyBoYXZlIDptZXRoOmB0ZXJtaW5hdGVgLCA6bWV0aDpga2lsbGAsIGFuZCA6bWV0aDpgc2VuZF9zaWduYWxgIG1ldGhvZHMuCiAgIE9uIFdpbmRvd3MsIDptZXRoOmBzZW5kX3NpZ25hbGAgb25seSBzdXBwb3J0cyB0aGUgOmNvbnN0OmBTSUdURVJNYAogICBzaWduYWwsIGFuZCBhbGwgdGhlc2UgbWV0aG9kcyBhcmUgYWxpYXNlcyBmb3IgdGhlIFdpbjMyIEFQSSBmdW5jdGlvbgotICA6Y2Z1bmM6YFRlcm1pbmF0ZVByb2Nlc3NgLgorICA6YzpmdW5jOmBUZXJtaW5hdGVQcm9jZXNzYC4KICAgKENvbnRyaWJ1dGVkIGJ5IENocmlzdGlhbiBIZWltZXMuKQogCiAqIEEgbmV3IHZhcmlhYmxlIGluIHRoZSA6bW9kOmBzeXNgIG1vZHVsZSwgOmF0dHI6YGZsb2F0X2luZm9gLCBpcyBhbgpAQCAtMjc3OCwxMiArMjc3OSwxMiBAQAogdHlwZXMuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBlbmNvZGVzIGFuZCBkZWNvZGVzIGEgZGljdGlvbmFyeTo6CiAKICAgICAgICA+Pj4gaW1wb3J0IGpzb24KLSAgICAgICA+Pj4gZGF0YSA9IHsic3BhbSIgOiAiZm9vIiwgInBhcnJvdCIgOiA0Mn0KKyAgICAgICA+Pj4gZGF0YSA9IHsic3BhbSI6ICJmb28iLCAicGFycm90IjogNDJ9CiAgICAgICAgPj4+IGluX2pzb24gPSBqc29uLmR1bXBzKGRhdGEpICMgRW5jb2RlIHRoZSBkYXRhCiAgICAgICAgPj4+IGluX2pzb24KICAgICAgICAneyJwYXJyb3QiOiA0MiwgInNwYW0iOiAiZm9vIn0nCiAgICAgICAgPj4+IGpzb24ubG9hZHMoaW5fanNvbikgIyBEZWNvZGUgaW50byBhIFB5dGhvbiBvYmplY3QKLSAgICAgICB7InNwYW0iIDogImZvbyIsICJwYXJyb3QiIDogNDJ9CisgICAgICAgeyJzcGFtIjogImZvbyIsICJwYXJyb3QiOiA0Mn0KIAogSXQncyBhbHNvIHBvc3NpYmxlIHRvIHdyaXRlIHlvdXIgb3duIGRlY29kZXJzIGFuZCBlbmNvZGVycyB0byBzdXBwb3J0CiBtb3JlIHR5cGVzLiBQcmV0dHktcHJpbnRpbmcgb2YgdGhlIEpTT04gc3RyaW5ncyBpcyBhbHNvIHN1cHBvcnRlZC4KQEAgLTI5NzcsNyArMjk3OCw3IEBACiAKICogUHl0aG9uIG5vdyBtdXN0IGJlIGNvbXBpbGVkIHdpdGggQzg5IGNvbXBpbGVycyAoYWZ0ZXIgMTkKICAgeWVhcnMhKS4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgUHl0aG9uIHNvdXJjZSB0cmVlIGhhcyBkcm9wcGVkIGl0cwotICBvd24gaW1wbGVtZW50YXRpb25zIG9mIDpjZnVuYzpgbWVtbW92ZWAgYW5kIDpjZnVuYzpgc3RyZXJyb3JgLCB3aGljaAorICBvd24gaW1wbGVtZW50YXRpb25zIG9mIDpjOmZ1bmM6YG1lbW1vdmVgIGFuZCA6YzpmdW5jOmBzdHJlcnJvcmAsIHdoaWNoCiAgIGFyZSBpbiB0aGUgQzg5IHN0YW5kYXJkIGxpYnJhcnkuCiAKICogUHl0aG9uIDIuNiBjYW4gYmUgYnVpbHQgd2l0aCBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAyMDA4ICh2ZXJzaW9uCkBAIC0yOTk5LDcgKzMwMDAsNyBAQAogCiAqIFRoZSBuZXcgYnVmZmVyIGludGVyZmFjZSwgcHJldmlvdXNseSBkZXNjcmliZWQgaW4KICAgYHRoZSBQRVAgMzExOCBzZWN0aW9uIDwjcGVwLTMxMTgtcmV2aXNlZC1idWZmZXItcHJvdG9jb2w+YF9fLAotICBhZGRzIDpjZnVuYzpgUHlPYmplY3RfR2V0QnVmZmVyYCBhbmQgOmNmdW5jOmBQeUJ1ZmZlcl9SZWxlYXNlYCwKKyAgYWRkcyA6YzpmdW5jOmBQeU9iamVjdF9HZXRCdWZmZXJgIGFuZCA6YzpmdW5jOmBQeUJ1ZmZlcl9SZWxlYXNlYCwKICAgYXMgd2VsbCBhcyBhIGZldyBvdGhlciBmdW5jdGlvbnMuCiAKICogUHl0aG9uJ3MgdXNlIG9mIHRoZSBDIHN0ZGlvIGxpYnJhcnkgaXMgbm93IHRocmVhZC1zYWZlLCBvciBhdCBsZWFzdApAQCAtMzAwNywyNyArMzAwOCwyNyBAQAogICBidWcgb2NjdXJyZWQgaWYgb25lIHRocmVhZCBjbG9zZWQgYSBmaWxlIG9iamVjdCB3aGlsZSBhbm90aGVyIHRocmVhZAogICB3YXMgcmVhZGluZyBmcm9tIG9yIHdyaXRpbmcgdG8gdGhlIG9iamVjdC4gIEluIDIuNiBmaWxlIG9iamVjdHMKICAgaGF2ZSBhIHJlZmVyZW5jZSBjb3VudCwgbWFuaXB1bGF0ZWQgYnkgdGhlCi0gIDpjZnVuYzpgUHlGaWxlX0luY1VzZUNvdW50YCBhbmQgOmNmdW5jOmBQeUZpbGVfRGVjVXNlQ291bnRgCisgIDpjOmZ1bmM6YFB5RmlsZV9JbmNVc2VDb3VudGAgYW5kIDpjOmZ1bmM6YFB5RmlsZV9EZWNVc2VDb3VudGAKICAgZnVuY3Rpb25zLiAgRmlsZSBvYmplY3RzIGNhbid0IGJlIGNsb3NlZCB1bmxlc3MgdGhlIHJlZmVyZW5jZSBjb3VudAotICBpcyB6ZXJvLiAgOmNmdW5jOmBQeUZpbGVfSW5jVXNlQ291bnRgIHNob3VsZCBiZSBjYWxsZWQgd2hpbGUgdGhlIEdJTAorICBpcyB6ZXJvLiAgOmM6ZnVuYzpgUHlGaWxlX0luY1VzZUNvdW50YCBzaG91bGQgYmUgY2FsbGVkIHdoaWxlIHRoZSBHSUwKICAgaXMgc3RpbGwgaGVsZCwgYmVmb3JlIGNhcnJ5aW5nIG91dCBhbiBJL08gb3BlcmF0aW9uIHVzaW5nIHRoZQotICBgYEZJTEUgKmBgIHBvaW50ZXIsIGFuZCA6Y2Z1bmM6YFB5RmlsZV9EZWNVc2VDb3VudGAgc2hvdWxkIGJlIGNhbGxlZAorICBgYEZJTEUgKmBgIHBvaW50ZXIsIGFuZCA6YzpmdW5jOmBQeUZpbGVfRGVjVXNlQ291bnRgIHNob3VsZCBiZSBjYWxsZWQKICAgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIEdJTCBpcyByZS1hY3F1aXJlZC4KICAgKENvbnRyaWJ1dGVkIGJ5IEFudG9pbmUgUGl0cm91IGFuZCBHcmVnb3J5IFAuIFNtaXRoLikKIAogKiBJbXBvcnRpbmcgbW9kdWxlcyBzaW11bHRhbmVvdXNseSBpbiB0d28gZGlmZmVyZW50IHRocmVhZHMgbm8gbG9uZ2VyCiAgIGRlYWRsb2NrczsgaXQgd2lsbCBub3cgcmFpc2UgYW4gOmV4YzpgSW1wb3J0RXJyb3JgLiAgQSBuZXcgQVBJCi0gIGZ1bmN0aW9uLCA6Y2Z1bmM6YFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2tgLCB3aWxsIGxvb2sgZm9yIGEKKyAgZnVuY3Rpb24sIDpjOmZ1bmM6YFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2tgLCB3aWxsIGxvb2sgZm9yIGEKICAgbW9kdWxlIGluIGBgc3lzLm1vZHVsZXNgYCBmaXJzdCwgdGhlbiB0cnkgdG8gaW1wb3J0IGl0IGFmdGVyCiAgIGFjcXVpcmluZyBhbiBpbXBvcnQgbG9jay4gIElmIHRoZSBpbXBvcnQgbG9jayBpcyBoZWxkIGJ5IGFub3RoZXIKICAgdGhyZWFkLCBhbiA6ZXhjOmBJbXBvcnRFcnJvcmAgaXMgcmFpc2VkLgogICAoQ29udHJpYnV0ZWQgYnkgQ2hyaXN0aWFuIEhlaW1lcy4pCiAKICogU2V2ZXJhbCBmdW5jdGlvbnMgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwbGF0Zm9ybSdzCi0gIGZsb2F0aW5nLXBvaW50IHN1cHBvcnQuICA6Y2Z1bmM6YFB5RmxvYXRfR2V0TWF4YCByZXR1cm5zCisgIGZsb2F0aW5nLXBvaW50IHN1cHBvcnQuICA6YzpmdW5jOmBQeUZsb2F0X0dldE1heGAgcmV0dXJucwogICB0aGUgbWF4aW11bSByZXByZXNlbnRhYmxlIGZsb2F0aW5nIHBvaW50IHZhbHVlLAotICBhbmQgOmNmdW5jOmBQeUZsb2F0X0dldE1pbmAgcmV0dXJucyB0aGUgbWluaW11bQotICBwb3NpdGl2ZSB2YWx1ZS4gIDpjZnVuYzpgUHlGbG9hdF9HZXRJbmZvYCByZXR1cm5zIGFuIG9iamVjdAorICBhbmQgOmM6ZnVuYzpgUHlGbG9hdF9HZXRNaW5gIHJldHVybnMgdGhlIG1pbmltdW0KKyAgcG9zaXRpdmUgdmFsdWUuICA6YzpmdW5jOmBQeUZsb2F0X0dldEluZm9gIHJldHVybnMgYW4gb2JqZWN0CiAgIGNvbnRhaW5pbmcgbW9yZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSA6ZmlsZTpgZmxvYXQuaGAgZmlsZSwgc3VjaCBhcwogICBgYCJtYW50X2RpZyJgYCAobnVtYmVyIG9mIGRpZ2l0cyBpbiB0aGUgbWFudGlzc2EpLCBgYCJlcHNpbG9uImBgCiAgIChzbWFsbGVzdCBkaWZmZXJlbmNlIGJldHdlZW4gMS4wIGFuZCB0aGUgbmV4dCBsYXJnZXN0IHZhbHVlCkBAIC0zMDM1LDcgKzMwMzYsNyBAQAogICAoQ29udHJpYnV0ZWQgYnkgQ2hyaXN0aWFuIEhlaW1lczsgOmlzc3VlOmAxNTM0YC4pCiAKICogQyBmdW5jdGlvbnMgYW5kIG1ldGhvZHMgdGhhdCB1c2UKLSAgOmNmdW5jOmBQeUNvbXBsZXhfQXNDQ29tcGxleGAgd2lsbCBub3cgYWNjZXB0IGFyZ3VtZW50cyB0aGF0CisgIDpjOmZ1bmM6YFB5Q29tcGxleF9Bc0NDb21wbGV4YCB3aWxsIG5vdyBhY2NlcHQgYXJndW1lbnRzIHRoYXQKICAgaGF2ZSBhIDptZXRoOmBfX2NvbXBsZXhfX2AgbWV0aG9kLiAgSW4gcGFydGljdWxhciwgdGhlIGZ1bmN0aW9ucyBpbiB0aGUKICAgOm1vZDpgY21hdGhgIG1vZHVsZSB3aWxsIG5vdyBhY2NlcHQgb2JqZWN0cyB3aXRoIHRoaXMgbWV0aG9kLgogICBUaGlzIGlzIGEgYmFja3BvcnQgb2YgYSBQeXRob24gMy4wIGNoYW5nZS4KQEAgLTMwNDksMTUgKzMwNTAsMTUgQEAKICogTWFueSBDIGV4dGVuc2lvbnMgZGVmaW5lIHRoZWlyIG93biBsaXR0bGUgbWFjcm8gZm9yIGFkZGluZwogICBpbnRlZ2VycyBhbmQgc3RyaW5ncyB0byB0aGUgbW9kdWxlJ3MgZGljdGlvbmFyeSBpbiB0aGUKICAgYGBpbml0KmBgIGZ1bmN0aW9uLiAgUHl0aG9uIDIuNiBmaW5hbGx5IGRlZmluZXMgc3RhbmRhcmQgbWFjcm9zCi0gIGZvciBhZGRpbmcgdmFsdWVzIHRvIGEgbW9kdWxlLCA6Y21hY3JvOmBQeU1vZHVsZV9BZGRTdHJpbmdNYWNyb2AKLSAgYW5kIDpjbWFjcm86YFB5TW9kdWxlX0FkZEludE1hY3JvKClgLiAgKENvbnRyaWJ1dGVkIGJ5CisgIGZvciBhZGRpbmcgdmFsdWVzIHRvIGEgbW9kdWxlLCA6YzptYWNybzpgUHlNb2R1bGVfQWRkU3RyaW5nTWFjcm9gCisgIGFuZCA6YzptYWNybzpgUHlNb2R1bGVfQWRkSW50TWFjcm8oKWAuICAoQ29udHJpYnV0ZWQgYnkKICAgQ2hyaXN0aWFuIEhlaW1lcy4pCiAKICogU29tZSBtYWNyb3Mgd2VyZSByZW5hbWVkIGluIGJvdGggMy4wIGFuZCAyLjYgdG8gbWFrZSBpdCBjbGVhcmVyIHRoYXQKICAgdGhleSBhcmUgbWFjcm9zLAotICBub3QgZnVuY3Rpb25zLiAgOmNtYWNybzpgUHlfU2l6ZSgpYCBiZWNhbWUgOmNtYWNybzpgUHlfU0laRSgpYCwKLSAgOmNtYWNybzpgUHlfVHlwZSgpYCBiZWNhbWUgOmNtYWNybzpgUHlfVFlQRSgpYCwgYW5kCi0gIDpjbWFjcm86YFB5X1JlZmNudCgpYCBiZWNhbWUgOmNtYWNybzpgUHlfUkVGQ05UKClgLgorICBub3QgZnVuY3Rpb25zLiAgOmM6bWFjcm86YFB5X1NpemUoKWAgYmVjYW1lIDpjOm1hY3JvOmBQeV9TSVpFKClgLAorICA6YzptYWNybzpgUHlfVHlwZSgpYCBiZWNhbWUgOmM6bWFjcm86YFB5X1RZUEUoKWAsIGFuZAorICA6YzptYWNybzpgUHlfUmVmY250KClgIGJlY2FtZSA6YzptYWNybzpgUHlfUkVGQ05UKClgLgogICBUaGUgbWl4ZWQtY2FzZSBtYWNyb3MgYXJlIHN0aWxsIGF2YWlsYWJsZQogICBpbiBQeXRob24gMi42IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgogICAoOmlzc3VlOmAxNjI5YCkKQEAgLTMxMTUsNyArMzExNiw3IEBACiAKICogVGhlIDptb2Q6YHNvY2tldGAgbW9kdWxlJ3Mgc29ja2V0IG9iamVjdHMgbm93IGhhdmUgYW4KICAgOm1ldGg6YGlvY3RsYCBtZXRob2QgdGhhdCBwcm92aWRlcyBhIGxpbWl0ZWQgaW50ZXJmYWNlIHRvIHRoZQotICA6Y2Z1bmM6YFdTQUlvY3RsYCBzeXN0ZW0gaW50ZXJmYWNlLgorICA6YzpmdW5jOmBXU0FJb2N0bGAgc3lzdGVtIGludGVyZmFjZS4KIAogKiBUaGUgOm1vZDpgX3dpbnJlZ2AgbW9kdWxlIG5vdyBoYXMgYSBmdW5jdGlvbiwKICAgOmZ1bmM6YEV4cGFuZEVudmlyb25tZW50U3RyaW5nc2AsCkBAIC0zMjYxLDEzICszMjYyLDEzIEBACiAgIHRoZSBpbXBsZW1lbnRhdGlvbiBub3cgZXhwbGljaXRseSBjaGVja3MgZm9yIHRoaXMgY2FzZSBhbmQgcmFpc2VzCiAgIGFuIDpleGM6YEltcG9ydEVycm9yYC4KIAotKiBDIEFQSTogdGhlIDpjZnVuYzpgUHlJbXBvcnRfSW1wb3J0YCBhbmQgOmNmdW5jOmBQeUltcG9ydF9JbXBvcnRNb2R1bGVgCisqIEMgQVBJOiB0aGUgOmM6ZnVuYzpgUHlJbXBvcnRfSW1wb3J0YCBhbmQgOmM6ZnVuYzpgUHlJbXBvcnRfSW1wb3J0TW9kdWxlYAogICBmdW5jdGlvbnMgbm93IGRlZmF1bHQgdG8gYWJzb2x1dGUgaW1wb3J0cywgbm90IHJlbGF0aXZlIGltcG9ydHMuCiAgIFRoaXMgd2lsbCBhZmZlY3QgQyBleHRlbnNpb25zIHRoYXQgaW1wb3J0IG90aGVyIG1vZHVsZXMuCiAKICogQyBBUEk6IGV4dGVuc2lvbiBkYXRhIHR5cGVzIHRoYXQgc2hvdWxkbid0IGJlIGhhc2hhYmxlCiAgIHNob3VsZCBkZWZpbmUgdGhlaXIgYGB0cF9oYXNoYGAgc2xvdCB0bwotICA6Y2Z1bmM6YFB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZGAuCisgIDpjOmZ1bmM6YFB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZGAuCiAKICogVGhlIDptb2Q6YHNvY2tldGAgbW9kdWxlIGV4Y2VwdGlvbiA6ZXhjOmBzb2NrZXQuZXJyb3JgIG5vdyBpbmhlcml0cwogICBmcm9tIDpleGM6YElPRXJyb3JgLiAgUHJldmlvdXNseSBpdCB3YXNuJ3QgYSBzdWJjbGFzcyBvZgpkaWZmIC0tZ2l0IGEvRG9jL3doYXRzbmV3LzIuNy5yc3QgYi9Eb2Mvd2hhdHNuZXcvMi43LnJzdAppbmRleCA0M2I4NTlkLi4yNDlmNmQ2IDEwMDY0NAotLS0gYS9Eb2Mvd2hhdHNuZXcvMi43LnJzdAorKysgYi9Eb2Mvd2hhdHNuZXcvMi43LnJzdApAQCAtMyw4ICszLDYgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogOkF1dGhvcjogQS5NLiBLdWNobGluZyAoYW1rIGF0IGFtay5jYSkKLTpSZWxlYXNlOiB8cmVsZWFzZXwKLTpEYXRlOiB8dG9kYXl8CiAKIC4uICBoeXBlcmxpbmsgYWxsIHRoZSBtZXRob2RzICYgZnVuY3Rpb25zLgogCkBAIC04MSw0NSArNzksOTEgQEAKIFRoZSBGdXR1cmUgZm9yIFB5dGhvbiAyLngKID09PT09PT09PT09PT09PT09PT09PT09PT0KIAotUHl0aG9uIDIuNyBpcyBpbnRlbmRlZCB0byBiZSB0aGUgbGFzdCBtYWpvciByZWxlYXNlIGluIHRoZSAyLnggc2VyaWVzLgotVGhlIFB5dGhvbiBtYWludGFpbmVycyBhcmUgcGxhbm5pbmcgdG8gZm9jdXMgdGhlaXIgZnV0dXJlIGVmZm9ydHMgb24KLXRoZSBQeXRob24gMy54IHNlcmllcy4KK1B5dGhvbiAyLjcgaXMgdGhlIGxhc3QgbWFqb3IgcmVsZWFzZSBpbiB0aGUgMi54IHNlcmllcywgYXMgdGhlIFB5dGhvbgorbWFpbnRhaW5lcnMgaGF2ZSBzaGlmdGVkIHRoZSBmb2N1cyBvZiB0aGVpciBuZXcgZmVhdHVyZSBkZXZlbG9wbWVudCBlZmZvcnRzCit0byB0aGUgUHl0aG9uIDMueCBzZXJpZXMuIFRoaXMgbWVhbnMgdGhhdCB3aGlsZSBQeXRob24gMiBjb250aW51ZXMgdG8KK3JlY2VpdmUgYnVnIGZpeGVzLCBhbmQgdG8gYmUgdXBkYXRlZCB0byBidWlsZCBjb3JyZWN0bHkgb24gbmV3IGhhcmR3YXJlIGFuZAordmVyc2lvbnMgb2Ygc3VwcG9ydGVkIG9wZXJhdGVkIHN5c3RlbXMsIHRoZXJlIHdpbGwgYmUgbm8gbmV3IGZ1bGwgZmVhdHVyZQorcmVsZWFzZXMgZm9yIHRoZSBsYW5ndWFnZSBvciBzdGFuZGFyZCBsaWJyYXJ5LgogCi1UaGlzIG1lYW5zIHRoYXQgMi43IHdpbGwgcmVtYWluIGluIHBsYWNlIGZvciBhIGxvbmcgdGltZSwgcnVubmluZwotcHJvZHVjdGlvbiBzeXN0ZW1zIHRoYXQgaGF2ZSBub3QgYmVlbiBwb3J0ZWQgdG8gUHl0aG9uIDMueC4KLVR3byBjb25zZXF1ZW5jZXMgb2YgdGhlIGxvbmctdGVybSBzaWduaWZpY2FuY2Ugb2YgMi43IGFyZToKK0hvd2V2ZXIsIHdoaWxlIHRoZXJlIGlzIGEgbGFyZ2UgY29tbW9uIHN1YnNldCBiZXR3ZWVuIFB5dGhvbiAyLjcgYW5kIFB5dGhvbgorMywgYW5kIG1hbnkgb2YgdGhlIGNoYW5nZXMgaW52b2x2ZWQgaW4gbWlncmF0aW5nIHRvIHRoYXQgY29tbW9uIHN1YnNldCwgb3IKK2RpcmVjdGx5IHRvIFB5dGhvbiAzLCBjYW4gYmUgc2FmZWx5IGF1dG9tYXRlZCwgc29tZSBvdGhlciBjaGFuZ2VzIChub3RhYmx5Cit0aG9zZSBhc3NvY2lhdGVkIHdpdGggVW5pY29kZSBoYW5kbGluZykgbWF5IHJlcXVpcmUgY2FyZWZ1bCBjb25zaWRlcmF0aW9uLAorYW5kIHByZWZlcmFibHkgcm9idXN0IGF1dG9tYXRlZCByZWdyZXNzaW9uIHRlc3Qgc3VpdGVzLCB0byBtaWdyYXRlCitlZmZlY3RpdmVseS4KIAotKiBJdCdzIHZlcnkgbGlrZWx5IHRoZSAyLjcgcmVsZWFzZSB3aWxsIGhhdmUgYSBsb25nZXIgcGVyaW9kIG9mCi0gIG1haW50ZW5hbmNlIGNvbXBhcmVkIHRvIGVhcmxpZXIgMi54IHZlcnNpb25zLiAgUHl0aG9uIDIuNyB3aWxsCi0gIGNvbnRpbnVlIHRvIGJlIG1haW50YWluZWQgd2hpbGUgdGhlIHRyYW5zaXRpb24gdG8gMy54IGNvbnRpbnVlcywgYW5kCi0gIHRoZSBkZXZlbG9wZXJzIGFyZSBwbGFubmluZyB0byBzdXBwb3J0IFB5dGhvbiAyLjcgd2l0aCBidWctZml4Ci0gIHJlbGVhc2VzIGJleW9uZCB0aGUgdHlwaWNhbCB0d28geWVhcnMuCitUaGlzIG1lYW5zIHRoYXQgUHl0aG9uIDIuNyB3aWxsIHJlbWFpbiBpbiBwbGFjZSBmb3IgYSBsb25nIHRpbWUsIHByb3ZpZGluZyBhCitzdGFibGUgYW5kIHN1cHBvcnRlZCBiYXNlIHBsYXRmb3JtIGZvciBwcm9kdWN0aW9uIHN5c3RlbXMgdGhhdCBoYXZlIG5vdCB5ZXQKK2JlZW4gcG9ydGVkIHRvIFB5dGhvbiAzLiBUaGUgZnVsbCBleHBlY3RlZCBsaWZlY3ljbGUgb2YgdGhlIFB5dGhvbiAyLjcKK3NlcmllcyBpcyBkZXRhaWxlZCBpbiA6cGVwOmAzNzNgLgogCi0qIEEgcG9saWN5IGRlY2lzaW9uIHdhcyBtYWRlIHRvIHNpbGVuY2Ugd2FybmluZ3Mgb25seSBvZiBpbnRlcmVzdCB0bwotICBkZXZlbG9wZXJzLiAgOmV4YzpgRGVwcmVjYXRpb25XYXJuaW5nYCBhbmQgaXRzCi0gIGRlc2NlbmRhbnRzIGFyZSBub3cgaWdub3JlZCB1bmxlc3Mgb3RoZXJ3aXNlIHJlcXVlc3RlZCwgcHJldmVudGluZwotICB1c2VycyBmcm9tIHNlZWluZyB3YXJuaW5ncyB0cmlnZ2VyZWQgYnkgYW4gYXBwbGljYXRpb24uICBUaGlzIGNoYW5nZQotICB3YXMgYWxzbyBtYWRlIGluIHRoZSBicmFuY2ggdGhhdCB3aWxsIGJlY29tZSBQeXRob24gMy4yLiAoRGlzY3Vzc2VkCi0gIG9uIHN0ZGxpYi1zaWcgYW5kIGNhcnJpZWQgb3V0IGluIDppc3N1ZTpgNzMxOWAuKQorU29tZSBrZXkgY29uc2VxdWVuY2VzIG9mIHRoZSBsb25nLXRlcm0gc2lnbmlmaWNhbmNlIG9mIDIuNyBhcmU6CiAKLSAgSW4gcHJldmlvdXMgcmVsZWFzZXMsIDpleGM6YERlcHJlY2F0aW9uV2FybmluZ2AgbWVzc2FnZXMgd2VyZQotICBlbmFibGVkIGJ5IGRlZmF1bHQsIHByb3ZpZGluZyBQeXRob24gZGV2ZWxvcGVycyB3aXRoIGEgY2xlYXIKLSAgaW5kaWNhdGlvbiBvZiB3aGVyZSB0aGVpciBjb2RlIG1heSBicmVhayBpbiBhIGZ1dHVyZSBtYWpvciB2ZXJzaW9uCi0gIG9mIFB5dGhvbi4KKyogQXMgbm90ZWQgYWJvdmUsIHRoZSAyLjcgcmVsZWFzZSBoYXMgYSBtdWNoIGxvbmdlciBwZXJpb2Qgb2YgbWFpbnRlbmFuY2UKKyAgd2hlbiBjb21wYXJlZCB0byBlYXJsaWVyIDIueCB2ZXJzaW9ucy4gUHl0aG9uIDIuNyBpcyBjdXJyZW50bHkgZXhwZWN0ZWQgdG8KKyAgcmVtYWluIHN1cHBvcnRlZCBieSB0aGUgY29yZSBkZXZlbG9wbWVudCB0ZWFtIChyZWNlaXZpbmcgc2VjdXJpdHkgdXBkYXRlcworICBhbmQgb3RoZXIgYnVnIGZpeGVzKSB1bnRpbCBhdCBsZWFzdCAyMDIwICgxMCB5ZWFycyBhZnRlciBpdHMgaW5pdGlhbAorICByZWxlYXNlLCBjb21wYXJlZCB0byB0aGUgbW9yZSB0eXBpY2FsIHN1cHBvcnQgcGVyaW9kIG9mIDE4LTI0IG1vbnRocykuCiAKLSAgSG93ZXZlciwgdGhlcmUgYXJlIGluY3JlYXNpbmdseSBtYW55IHVzZXJzIG9mIFB5dGhvbi1iYXNlZAotICBhcHBsaWNhdGlvbnMgd2hvIGFyZSBub3QgZGlyZWN0bHkgaW52b2x2ZWQgaW4gdGhlIGRldmVsb3BtZW50IG9mCi0gIHRob3NlIGFwcGxpY2F0aW9ucy4gIDpleGM6YERlcHJlY2F0aW9uV2FybmluZ2AgbWVzc2FnZXMgYXJlCi0gIGlycmVsZXZhbnQgdG8gc3VjaCB1c2VycywgbWFraW5nIHRoZW0gd29ycnkgYWJvdXQgYW4gYXBwbGljYXRpb24KLSAgdGhhdCdzIGFjdHVhbGx5IHdvcmtpbmcgY29ycmVjdGx5IGFuZCBidXJkZW5pbmcgYXBwbGljYXRpb24gZGV2ZWxvcGVycwotICB3aXRoIHJlc3BvbmRpbmcgdG8gdGhlc2UgY29uY2VybnMuCisqIEFzIHRoZSBQeXRob24gMi43IHN0YW5kYXJkIGxpYnJhcnkgYWdlcywgbWFraW5nIGVmZmVjdGl2ZSB1c2Ugb2YgdGhlCisgIFB5dGhvbiBQYWNrYWdlIEluZGV4IChlaXRoZXIgZGlyZWN0bHkgb3IgdmlhIGEgcmVkaXN0cmlidXRvcikgYmVjb21lcworICBtb3JlIGltcG9ydGFudCBmb3IgUHl0aG9uIDIgdXNlcnMuIEluIGFkZGl0aW9uIHRvIGEgd2lkZSB2YXJpZXR5IG9mIHRoaXJkCisgIHBhcnR5IHBhY2thZ2VzIGZvciB2YXJpb3VzIHRhc2tzLCB0aGUgYXZhaWxhYmxlIHBhY2thZ2VzIGluY2x1ZGUgYmFja3BvcnRzCisgIG9mIG5ldyBtb2R1bGVzIGFuZCBmZWF0dXJlcyBmcm9tIHRoZSBQeXRob24gMyBzdGFuZGFyZCBsaWJyYXJ5IHRoYXQgYXJlCisgIGNvbXBhdGlibGUgd2l0aCBQeXRob24gMiwgYXMgd2VsbCBhcyB2YXJpb3VzIHRvb2xzIGFuZCBsaWJyYXJpZXMgdGhhdCBjYW4KKyAgbWFrZSBpdCBlYXNpZXIgdG8gbWlncmF0ZSB0byBQeXRob24gMy4gVGhlIGBQeXRob24gUGFja2FnaW5nIFVzZXIgR3VpZGUKKyAgPGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmc+YF9fIHByb3ZpZGVzIGd1aWRhbmNlIG9uIGRvd25sb2FkaW5nIGFuZAorICBpbnN0YWxsaW5nIHNvZnR3YXJlIGZyb20gdGhlIFB5dGhvbiBQYWNrYWdlIEluZGV4LgogCi0gIFlvdSBjYW4gcmUtZW5hYmxlIGRpc3BsYXkgb2YgOmV4YzpgRGVwcmVjYXRpb25XYXJuaW5nYCBtZXNzYWdlcyBieQotICBydW5uaW5nIFB5dGhvbiB3aXRoIHRoZSA6b3B0aW9uOmAtV2RlZmF1bHQgPC1XPmAgKHNob3J0IGZvcm06Ci0gIDpvcHRpb246YC1XZCA8LVc+YCkgc3dpdGNoLCBvciBieSBzZXR0aW5nIHRoZSA6ZW52dmFyOmBQWVRIT05XQVJOSU5HU2AKLSAgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gYGAiZGVmYXVsdCJgYCAob3IgYGAiZCJgYCkgYmVmb3JlIHJ1bm5pbmcKLSAgUHl0aG9uLiAgUHl0aG9uIGNvZGUgY2FuIGFsc28gcmUtZW5hYmxlIHRoZW0KLSAgYnkgY2FsbGluZyBgYHdhcm5pbmdzLnNpbXBsZWZpbHRlcignZGVmYXVsdCcpYGAuCisqIFdoaWxlIHRoZSBwcmVmZXJyZWQgYXBwcm9hY2ggdG8gZW5oYW5jaW5nIFB5dGhvbiAyIGlzIG5vdyB0aGUgcHVibGljYXRpb24KKyAgb2YgbmV3IHBhY2thZ2VzIG9uIHRoZSBQeXRob24gUGFja2FnZSBJbmRleCwgdGhpcyBhcHByb2FjaCBkb2Vzbid0CisgIG5lY2Vzc2FyaWx5IHdvcmsgaW4gYWxsIGNhc2VzLCBlc3BlY2lhbGx5IHRob3NlIHJlbGF0ZWQgdG8gbmV0d29yaworICBzZWN1cml0eS4gSW4gZXhjZXB0aW9uYWwgY2FzZXMgdGhhdCBjYW5ub3QgYmUgaGFuZGxlZCBhZGVxdWF0ZWx5IGJ5CisgIHB1Ymxpc2hpbmcgbmV3IG9yIHVwZGF0ZWQgcGFja2FnZXMgb24gUHlQSSwgdGhlIFB5dGhvbiBFbmhhbmNlbWVudAorICBQcm9wb3NhbCBwcm9jZXNzIG1heSBiZSB1c2VkIHRvIG1ha2UgdGhlIGNhc2UgZm9yIGFkZGluZyBuZXcgZmVhdHVyZXMKKyAgZGlyZWN0bHkgdG8gdGhlIFB5dGhvbiAyIHN0YW5kYXJkIGxpYnJhcnkuIEFueSBzdWNoIGFkZGl0aW9ucywgYW5kIHRoZQorICBtYWludGVuYW5jZSByZWxlYXNlcyB3aGVyZSB0aGV5IHdlcmUgYWRkZWQsIHdpbGwgYmUgbm90ZWQgaW4gdGhlCisgIDpyZWY6YHB5MjctbWFpbnRlbmFuY2UtZW5oYW5jZW1lbnRzYCBzZWN0aW9uIGJlbG93LgorCitGb3IgcHJvamVjdHMgd2lzaGluZyB0byBtaWdyYXRlIGZyb20gUHl0aG9uIDIgdG8gUHl0aG9uIDMsIG9yIGZvciBsaWJyYXJ5CithbmQgZnJhbWV3b3JrIGRldmVsb3BlcnMgd2lzaGluZyB0byBzdXBwb3J0IHVzZXJzIG9uIGJvdGggUHl0aG9uIDIgYW5kCitQeXRob24gMywgdGhlcmUgYXJlIGEgdmFyaWV0eSBvZiB0b29scyBhbmQgZ3VpZGVzIGF2YWlsYWJsZSB0byBoZWxwIGRlY2lkZQorb24gYSBzdWl0YWJsZSBhcHByb2FjaCBhbmQgbWFuYWdlIHNvbWUgb2YgdGhlIHRlY2huaWNhbCBkZXRhaWxzIGludm9sdmVkLgorVGhlIHJlY29tbWVuZGVkIHN0YXJ0aW5nIHBvaW50IGlzIHRoZSA6cmVmOmBweXBvcnRpbmctaG93dG9gIEhPV1RPIGd1aWRlLgorCisKK0NoYW5nZXMgdG8gdGhlIEhhbmRsaW5nIG9mIERlcHJlY2F0aW9uIFdhcm5pbmdzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitGb3IgUHl0aG9uIDIuNywgYSBwb2xpY3kgZGVjaXNpb24gd2FzIG1hZGUgdG8gc2lsZW5jZSB3YXJuaW5ncyBvbmx5IG9mCitpbnRlcmVzdCB0byBkZXZlbG9wZXJzIGJ5IGRlZmF1bHQuICA6ZXhjOmBEZXByZWNhdGlvbldhcm5pbmdgIGFuZCBpdHMKK2Rlc2NlbmRhbnRzIGFyZSBub3cgaWdub3JlZCB1bmxlc3Mgb3RoZXJ3aXNlIHJlcXVlc3RlZCwgcHJldmVudGluZwordXNlcnMgZnJvbSBzZWVpbmcgd2FybmluZ3MgdHJpZ2dlcmVkIGJ5IGFuIGFwcGxpY2F0aW9uLiAgVGhpcyBjaGFuZ2UKK3dhcyBhbHNvIG1hZGUgaW4gdGhlIGJyYW5jaCB0aGF0IGJlY2FtZSBQeXRob24gMy4yLiAoRGlzY3Vzc2VkCitvbiBzdGRsaWItc2lnIGFuZCBjYXJyaWVkIG91dCBpbiA6aXNzdWU6YDczMTlgLikKKworSW4gcHJldmlvdXMgcmVsZWFzZXMsIDpleGM6YERlcHJlY2F0aW9uV2FybmluZ2AgbWVzc2FnZXMgd2VyZQorZW5hYmxlZCBieSBkZWZhdWx0LCBwcm92aWRpbmcgUHl0aG9uIGRldmVsb3BlcnMgd2l0aCBhIGNsZWFyCitpbmRpY2F0aW9uIG9mIHdoZXJlIHRoZWlyIGNvZGUgbWF5IGJyZWFrIGluIGEgZnV0dXJlIG1ham9yIHZlcnNpb24KK29mIFB5dGhvbi4KKworSG93ZXZlciwgdGhlcmUgYXJlIGluY3JlYXNpbmdseSBtYW55IHVzZXJzIG9mIFB5dGhvbi1iYXNlZAorYXBwbGljYXRpb25zIHdobyBhcmUgbm90IGRpcmVjdGx5IGludm9sdmVkIGluIHRoZSBkZXZlbG9wbWVudCBvZgordGhvc2UgYXBwbGljYXRpb25zLiAgOmV4YzpgRGVwcmVjYXRpb25XYXJuaW5nYCBtZXNzYWdlcyBhcmUKK2lycmVsZXZhbnQgdG8gc3VjaCB1c2VycywgbWFraW5nIHRoZW0gd29ycnkgYWJvdXQgYW4gYXBwbGljYXRpb24KK3RoYXQncyBhY3R1YWxseSB3b3JraW5nIGNvcnJlY3RseSBhbmQgYnVyZGVuaW5nIGFwcGxpY2F0aW9uIGRldmVsb3BlcnMKK3dpdGggcmVzcG9uZGluZyB0byB0aGVzZSBjb25jZXJucy4KKworWW91IGNhbiByZS1lbmFibGUgZGlzcGxheSBvZiA6ZXhjOmBEZXByZWNhdGlvbldhcm5pbmdgIG1lc3NhZ2VzIGJ5CitydW5uaW5nIFB5dGhvbiB3aXRoIHRoZSA6b3B0aW9uOmAtV2RlZmF1bHQgPC1XPmAgKHNob3J0IGZvcm06Cis6b3B0aW9uOmAtV2QgPC1XPmApIHN3aXRjaCwgb3IgYnkgc2V0dGluZyB0aGUgOmVudnZhcjpgUFlUSE9OV0FSTklOR1NgCitlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBgYCJkZWZhdWx0ImBgIChvciBgYCJkImBgKSBiZWZvcmUgcnVubmluZworUHl0aG9uLiAgUHl0aG9uIGNvZGUgY2FuIGFsc28gcmUtZW5hYmxlIHRoZW0KK2J5IGNhbGxpbmcgYGB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2RlZmF1bHQnKWBgLgorCitUaGUgYGB1bml0dGVzdGBgIG1vZHVsZSBhbHNvIGF1dG9tYXRpY2FsbHkgcmVlbmFibGVzIGRlcHJlY2F0aW9uIHdhcm5pbmdzCit3aGVuIHJ1bm5pbmcgdGVzdHMuCiAKIAogUHl0aG9uIDMuMSBGZWF0dXJlcwpAQCAtMTQ3LDggKzE5MSw4IEBACiAgIGBgZmxvYXQocmVwcih4KSlgYCByZWNvdmVycyBgYHhgYC4KICogRmxvYXQtdG8tc3RyaW5nIGFuZCBzdHJpbmctdG8tZmxvYXQgY29udmVyc2lvbnMgYXJlIGNvcnJlY3RseSByb3VuZGVkLgogICBUaGUgOmZ1bmM6YHJvdW5kYCBmdW5jdGlvbiBpcyBhbHNvIG5vdyBjb3JyZWN0bHkgcm91bmRlZC4KLSogVGhlIDpjdHlwZTpgUHlDYXBzdWxlYCB0eXBlLCB1c2VkIHRvIHByb3ZpZGUgYSBDIEFQSSBmb3IgZXh0ZW5zaW9uIG1vZHVsZXMuCi0qIFRoZSA6Y2Z1bmM6YFB5TG9uZ19Bc0xvbmdBbmRPdmVyZmxvd2AgQyBBUEkgZnVuY3Rpb24uCisqIFRoZSA6Yzp0eXBlOmBQeUNhcHN1bGVgIHR5cGUsIHVzZWQgdG8gcHJvdmlkZSBhIEMgQVBJIGZvciBleHRlbnNpb24gbW9kdWxlcy4KKyogVGhlIDpjOmZ1bmM6YFB5TG9uZ19Bc0xvbmdBbmRPdmVyZmxvd2AgQyBBUEkgZnVuY3Rpb24uCiAKIE90aGVyIG5ldyBQeXRob24zLW1vZGUgd2FybmluZ3MgaW5jbHVkZToKIApAQCAtMzExLDcgKzM1NSw3IEBACiBUaGlzIG1lYW5zIFB5dGhvbiBub3cgc3VwcG9ydHMgdGhyZWUgZGlmZmVyZW50IG1vZHVsZXMgZm9yIHBhcnNpbmcKIGNvbW1hbmQtbGluZSBhcmd1bWVudHM6IDptb2Q6YGdldG9wdGAsIDptb2Q6YG9wdHBhcnNlYCwgYW5kCiA6bW9kOmBhcmdwYXJzZWAuICBUaGUgOm1vZDpgZ2V0b3B0YCBtb2R1bGUgY2xvc2VseSByZXNlbWJsZXMgdGhlIEMKLWxpYnJhcnkncyA6Y2Z1bmM6YGdldG9wdGAgZnVuY3Rpb24sIHNvIGl0IHJlbWFpbnMgdXNlZnVsIGlmIHlvdSdyZSB3cml0aW5nIGEKK2xpYnJhcnkncyA6YzpmdW5jOmBnZXRvcHRgIGZ1bmN0aW9uLCBzbyBpdCByZW1haW5zIHVzZWZ1bCBpZiB5b3UncmUgd3JpdGluZyBhCiBQeXRob24gcHJvdG90eXBlIHRoYXQgd2lsbCBldmVudHVhbGx5IGJlIHJld3JpdHRlbiBpbiBDLgogOm1vZDpgb3B0cGFyc2VgIGJlY29tZXMgcmVkdW5kYW50LCBidXQgdGhlcmUgYXJlIG5vIHBsYW5zIHRvIHJlbW92ZSBpdAogYmVjYXVzZSB0aGVyZSBhcmUgbWFueSBzY3JpcHRzIHN0aWxsIHVzaW5nIGl0LCBhbmQgdGhlcmUncyBubwpAQCAtMTQ3OCw3ICsxNTIyLDcgQEAKICogVGhlIDptb2Q6YHNzbGAgbW9kdWxlJ3MgOmNsYXNzOmB+c3NsLlNTTFNvY2tldGAgb2JqZWN0cyBub3cgc3VwcG9ydCB0aGUKICAgYnVmZmVyIEFQSSwgd2hpY2ggZml4ZWQgYSB0ZXN0IHN1aXRlIGZhaWx1cmUgKGZpeCBieSBBbnRvaW5lIFBpdHJvdTsKICAgOmlzc3VlOmA3MTMzYCkgYW5kIGF1dG9tYXRpY2FsbHkgc2V0Ci0gIE9wZW5TU0wncyA6Y21hY3JvOmBTU0xfTU9ERV9BVVRPX1JFVFJZYCwgd2hpY2ggd2lsbCBwcmV2ZW50IGFuIGVycm9yCisgIE9wZW5TU0wncyA6YzptYWNybzpgU1NMX01PREVfQVVUT19SRVRSWWAsIHdoaWNoIHdpbGwgcHJldmVudCBhbiBlcnJvcgogICBjb2RlIGJlaW5nIHJldHVybmVkIGZyb20gOm1ldGg6YHJlY3ZgIG9wZXJhdGlvbnMgdGhhdCB0cmlnZ2VyIGFuIFNTTAogICByZW5lZ290aWF0aW9uIChmaXggYnkgQW50b2luZSBQaXRyb3U7IDppc3N1ZTpgODIyMmApLgogCkBAIC0yMDUwLDQ5ICsyMDk0LDQ5IEBACiAgIGRlYnVnZ2VkIGRvZXNuJ3QgaG9sZCB0aGUgR0lMOyB0aGUgbWFjcm8gbm93IGFjcXVpcmVzIGl0IGJlZm9yZSBwcmludGluZy4KICAgKENvbnRyaWJ1dGVkIGJ5IFZpY3RvciBTdGlubmVyOyA6aXNzdWU6YDM2MzJgLikKIAotKiA6Y2Z1bmM6YFB5X0FkZFBlbmRpbmdDYWxsYCBpcyBub3cgdGhyZWFkLXNhZmUsIGxldHRpbmcgYW55CisqIDpjOmZ1bmM6YFB5X0FkZFBlbmRpbmdDYWxsYCBpcyBub3cgdGhyZWFkLXNhZmUsIGxldHRpbmcgYW55CiAgIHdvcmtlciB0aHJlYWQgc3VibWl0IG5vdGlmaWNhdGlvbnMgdG8gdGhlIG1haW4gUHl0aG9uIHRocmVhZC4gIFRoaXMKICAgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgYXN5bmNocm9ub3VzIElPIG9wZXJhdGlvbnMuCiAgIChDb250cmlidXRlZCBieSBLcmlzdGrDoW4gVmFsdXIgSsOzbnNzb247IDppc3N1ZTpgNDI5M2AuKQogCi0qIE5ldyBmdW5jdGlvbjogOmNmdW5jOmBQeUNvZGVfTmV3RW1wdHlgIGNyZWF0ZXMgYW4gZW1wdHkgY29kZSBvYmplY3Q7CisqIE5ldyBmdW5jdGlvbjogOmM6ZnVuYzpgUHlDb2RlX05ld0VtcHR5YCBjcmVhdGVzIGFuIGVtcHR5IGNvZGUgb2JqZWN0OwogICBvbmx5IHRoZSBmaWxlbmFtZSwgZnVuY3Rpb24gbmFtZSwgYW5kIGZpcnN0IGxpbmUgbnVtYmVyIGFyZSByZXF1aXJlZC4KICAgVGhpcyBpcyB1c2VmdWwgZm9yIGV4dGVuc2lvbiBtb2R1bGVzIHRoYXQgYXJlIGF0dGVtcHRpbmcgdG8KICAgY29uc3RydWN0IGEgbW9yZSB1c2VmdWwgdHJhY2ViYWNrIHN0YWNrLiAgUHJldmlvdXNseSBzdWNoCi0gIGV4dGVuc2lvbnMgbmVlZGVkIHRvIGNhbGwgOmNmdW5jOmBQeUNvZGVfTmV3YCwgd2hpY2ggaGFkIG1hbnkKKyAgZXh0ZW5zaW9ucyBuZWVkZWQgdG8gY2FsbCA6YzpmdW5jOmBQeUNvZGVfTmV3YCwgd2hpY2ggaGFkIG1hbnkKICAgbW9yZSBhcmd1bWVudHMuICAoQWRkZWQgYnkgSmVmZnJleSBZYXNza2luLikKIAotKiBOZXcgZnVuY3Rpb246IDpjZnVuYzpgUHlFcnJfTmV3RXhjZXB0aW9uV2l0aERvY2AgY3JlYXRlcyBhIG5ldwotICBleGNlcHRpb24gY2xhc3MsIGp1c3QgYXMgdGhlIGV4aXN0aW5nIDpjZnVuYzpgUHlFcnJfTmV3RXhjZXB0aW9uYCBkb2VzLAorKiBOZXcgZnVuY3Rpb246IDpjOmZ1bmM6YFB5RXJyX05ld0V4Y2VwdGlvbldpdGhEb2NgIGNyZWF0ZXMgYSBuZXcKKyAgZXhjZXB0aW9uIGNsYXNzLCBqdXN0IGFzIHRoZSBleGlzdGluZyA6YzpmdW5jOmBQeUVycl9OZXdFeGNlcHRpb25gIGRvZXMsCiAgIGJ1dCB0YWtlcyBhbiBleHRyYSBgYGNoYXIgKmBgIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIGRvY3N0cmluZyBmb3IgdGhlCiAgIG5ldyBleGNlcHRpb24gY2xhc3MuICAoQWRkZWQgYnkgJ2xla21hJyBvbiB0aGUgUHl0aG9uIGJ1ZyB0cmFja2VyOwogICA6aXNzdWU6YDcwMzNgLikKIAotKiBOZXcgZnVuY3Rpb246IDpjZnVuYzpgUHlGcmFtZV9HZXRMaW5lTnVtYmVyYCB0YWtlcyBhIGZyYW1lIG9iamVjdAorKiBOZXcgZnVuY3Rpb246IDpjOmZ1bmM6YFB5RnJhbWVfR2V0TGluZU51bWJlcmAgdGFrZXMgYSBmcmFtZSBvYmplY3QKICAgYW5kIHJldHVybnMgdGhlIGxpbmUgbnVtYmVyIHRoYXQgdGhlIGZyYW1lIGlzIGN1cnJlbnRseSBleGVjdXRpbmcuCiAgIFByZXZpb3VzbHkgY29kZSB3b3VsZCBuZWVkIHRvIGdldCB0aGUgaW5kZXggb2YgdGhlIGJ5dGVjb2RlCiAgIGluc3RydWN0aW9uIGN1cnJlbnRseSBleGVjdXRpbmcsIGFuZCB0aGVuIGxvb2sgdXAgdGhlIGxpbmUgbnVtYmVyCiAgIGNvcnJlc3BvbmRpbmcgdG8gdGhhdCBhZGRyZXNzLiAgKEFkZGVkIGJ5IEplZmZyZXkgWWFzc2tpbi4pCiAKLSogTmV3IGZ1bmN0aW9uczogOmNmdW5jOmBQeUxvbmdfQXNMb25nQW5kT3ZlcmZsb3dgIGFuZAotICA6Y2Z1bmM6YFB5TG9uZ19Bc0xvbmdMb25nQW5kT3ZlcmZsb3dgICBhcHByb3hpbWF0ZXMgYSBQeXRob24gbG9uZwotICBpbnRlZ2VyIGFzIGEgQyA6Y3R5cGU6YGxvbmdgIG9yIDpjdHlwZTpgbG9uZyBsb25nYC4KKyogTmV3IGZ1bmN0aW9uczogOmM6ZnVuYzpgUHlMb25nX0FzTG9uZ0FuZE92ZXJmbG93YCBhbmQKKyAgOmM6ZnVuYzpgUHlMb25nX0FzTG9uZ0xvbmdBbmRPdmVyZmxvd2AgIGFwcHJveGltYXRlcyBhIFB5dGhvbiBsb25nCisgIGludGVnZXIgYXMgYSBDIDpjOnR5cGU6YGxvbmdgIG9yIDpjOnR5cGU6YGxvbmcgbG9uZ2AuCiAgIElmIHRoZSBudW1iZXIgaXMgdG9vIGxhcmdlIHRvIGZpdCBpbnRvCiAgIHRoZSBvdXRwdXQgdHlwZSwgYW4gKm92ZXJmbG93KiBmbGFnIGlzIHNldCBhbmQgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KICAgKENvbnRyaWJ1dGVkIGJ5IENhc2UgVmFuIEhvcnNlbjsgOmlzc3VlOmA3NTI4YCBhbmQgOmlzc3VlOmA3NzY3YC4pCiAKICogTmV3IGZ1bmN0aW9uOiBzdGVtbWluZyBmcm9tIHRoZSByZXdyaXRlIG9mIHN0cmluZy10by1mbG9hdCBjb252ZXJzaW9uLAotICBhIG5ldyA6Y2Z1bmM6YFB5T1Nfc3RyaW5nX3RvX2RvdWJsZWAgZnVuY3Rpb24gd2FzIGFkZGVkLiAgVGhlIG9sZAotICA6Y2Z1bmM6YFB5T1NfYXNjaWlfc3RydG9kYCBhbmQgOmNmdW5jOmBQeU9TX2FzY2lpX2F0b2ZgIGZ1bmN0aW9ucworICBhIG5ldyA6YzpmdW5jOmBQeU9TX3N0cmluZ190b19kb3VibGVgIGZ1bmN0aW9uIHdhcyBhZGRlZC4gIFRoZSBvbGQKKyAgOmM6ZnVuYzpgUHlPU19hc2NpaV9zdHJ0b2RgIGFuZCA6YzpmdW5jOmBQeU9TX2FzY2lpX2F0b2ZgIGZ1bmN0aW9ucwogICBhcmUgbm93IGRlcHJlY2F0ZWQuCiAKLSogTmV3IGZ1bmN0aW9uOiA6Y2Z1bmM6YFB5U3lzX1NldEFyZ3ZFeGAgc2V0cyB0aGUgdmFsdWUgb2YKKyogTmV3IGZ1bmN0aW9uOiA6YzpmdW5jOmBQeVN5c19TZXRBcmd2RXhgIHNldHMgdGhlIHZhbHVlIG9mCiAgIGBgc3lzLmFyZ3ZgYCBhbmQgY2FuIG9wdGlvbmFsbHkgdXBkYXRlIGBgc3lzLnBhdGhgYCB0byBpbmNsdWRlIHRoZQogICBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgc2NyaXB0IG5hbWVkIGJ5IGBgc3lzLmFyZ3ZbMF1gYCBkZXBlbmRpbmcKICAgb24gdGhlIHZhbHVlIG9mIGFuICp1cGRhdGVwYXRoKiBwYXJhbWV0ZXIuCiAKICAgVGhpcyBmdW5jdGlvbiB3YXMgYWRkZWQgdG8gY2xvc2UgYSBzZWN1cml0eSBob2xlIGZvciBhcHBsaWNhdGlvbnMKLSAgdGhhdCBlbWJlZCBQeXRob24uICBUaGUgb2xkIGZ1bmN0aW9uLCA6Y2Z1bmM6YFB5U3lzX1NldEFyZ3ZgLCB3b3VsZAorICB0aGF0IGVtYmVkIFB5dGhvbi4gIFRoZSBvbGQgZnVuY3Rpb24sIDpjOmZ1bmM6YFB5U3lzX1NldEFyZ3ZgLCB3b3VsZAogICBhbHdheXMgdXBkYXRlIGBgc3lzLnBhdGhgYCwgYW5kIHNvbWV0aW1lcyBpdCB3b3VsZCBhZGQgdGhlIGN1cnJlbnQKICAgZGlyZWN0b3J5LiAgVGhpcyBtZWFudCB0aGF0LCBpZiB5b3UgcmFuIGFuIGFwcGxpY2F0aW9uIGVtYmVkZGluZwogICBQeXRob24gaW4gYSBkaXJlY3RvcnkgY29udHJvbGxlZCBieSBzb21lb25lIGVsc2UsIGF0dGFja2VycyBjb3VsZApAQCAtMjEwMCw4ICsyMTQ0LDggQEAKICAgOmZpbGU6YG9zLnB5YCkgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIHdvdWxkIHRoZW4gaW1wb3J0IGFuZCBydW4uCiAKICAgSWYgeW91IG1haW50YWluIGEgQy9DKysgYXBwbGljYXRpb24gdGhhdCBlbWJlZHMgUHl0aG9uLCBjaGVjawotICB3aGV0aGVyIHlvdSdyZSBjYWxsaW5nIDpjZnVuYzpgUHlTeXNfU2V0QXJndmAgYW5kIGNhcmVmdWxseSBjb25zaWRlcgotICB3aGV0aGVyIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgYmUgdXNpbmcgOmNmdW5jOmBQeVN5c19TZXRBcmd2RXhgCisgIHdoZXRoZXIgeW91J3JlIGNhbGxpbmcgOmM6ZnVuYzpgUHlTeXNfU2V0QXJndmAgYW5kIGNhcmVmdWxseSBjb25zaWRlcgorICB3aGV0aGVyIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgYmUgdXNpbmcgOmM6ZnVuYzpgUHlTeXNfU2V0QXJndkV4YAogICB3aXRoICp1cGRhdGVwYXRoKiBzZXQgdG8gZmFsc2UuCiAKICAgU2VjdXJpdHkgaXNzdWUgcmVwb3J0ZWQgYXMgYENWRS0yMDA4LTU5ODMKQEAgLTIxMDksMTQgKzIxNTMsMTQgQEAKICAgZGlzY3Vzc2VkIGluIDppc3N1ZTpgNTc1M2AsIGFuZCBmaXhlZCBieSBBbnRvaW5lIFBpdHJvdS4KIAogKiBOZXcgbWFjcm9zOiB0aGUgUHl0aG9uIGhlYWRlciBmaWxlcyBub3cgZGVmaW5lIHRoZSBmb2xsb3dpbmcgbWFjcm9zOgotICA6Y21hY3JvOmBQeV9JU0FMTlVNYCwKLSAgOmNtYWNybzpgUHlfSVNBTFBIQWAsCi0gIDpjbWFjcm86YFB5X0lTRElHSVRgLAotICA6Y21hY3JvOmBQeV9JU0xPV0VSYCwKLSAgOmNtYWNybzpgUHlfSVNTUEFDRWAsCi0gIDpjbWFjcm86YFB5X0lTVVBQRVJgLAotICA6Y21hY3JvOmBQeV9JU1hESUdJVGAsCi0gIDpjbWFjcm86YFB5X1RPTE9XRVJgLCBhbmQgOmNtYWNybzpgUHlfVE9VUFBFUmAuCisgIDpjOm1hY3JvOmBQeV9JU0FMTlVNYCwKKyAgOmM6bWFjcm86YFB5X0lTQUxQSEFgLAorICA6YzptYWNybzpgUHlfSVNESUdJVGAsCisgIDpjOm1hY3JvOmBQeV9JU0xPV0VSYCwKKyAgOmM6bWFjcm86YFB5X0lTU1BBQ0VgLAorICA6YzptYWNybzpgUHlfSVNVUFBFUmAsCisgIDpjOm1hY3JvOmBQeV9JU1hESUdJVGAsCisgIDpjOm1hY3JvOmBQeV9UT0xPV0VSYCwgYW5kIDpjOm1hY3JvOmBQeV9UT1VQUEVSYC4KICAgQWxsIG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUgYW5hbG9nb3VzIHRvIHRoZSBDCiAgIHN0YW5kYXJkIG1hY3JvcyBmb3IgY2xhc3NpZnlpbmcgY2hhcmFjdGVycywgYnV0IGlnbm9yZSB0aGUgY3VycmVudAogICBsb2NhbGUgc2V0dGluZywgYmVjYXVzZSBpbgpAQCAtMjEyNiwxNSArMjE3MCwxNSBAQAogCiAgIC4uIFhYWCB0aGVzZSBtYWNyb3MgZG9uJ3Qgc2VlbSB0byBiZSBkZXNjcmliZWQgaW4gdGhlIGMtYXBpIGRvY3MuCiAKLSogUmVtb3ZlZCBmdW5jdGlvbjogOmNtYWNybzpgUHlFdmFsX0NhbGxPYmplY3RgIGlzIG5vdyBvbmx5IGF2YWlsYWJsZQorKiBSZW1vdmVkIGZ1bmN0aW9uOiA6YzptYWNybzpgUHlFdmFsX0NhbGxPYmplY3RgIGlzIG5vdyBvbmx5IGF2YWlsYWJsZQogICBhcyBhIG1hY3JvLiAgQSBmdW5jdGlvbiB2ZXJzaW9uIHdhcyBiZWluZyBrZXB0IGFyb3VuZCB0byBwcmVzZXJ2ZQogICBBQkkgbGlua2luZyBjb21wYXRpYmlsaXR5LCBidXQgdGhhdCB3YXMgaW4gMTk5NzsgaXQgY2FuIGNlcnRhaW5seSBiZQogICBkZWxldGVkIGJ5IG5vdy4gIChSZW1vdmVkIGJ5IEFudG9pbmUgUGl0cm91OyA6aXNzdWU6YDgyNzZgLikKIAotKiBOZXcgZm9ybWF0IGNvZGVzOiB0aGUgOmNmdW5jOmBQeUZvcm1hdF9Gcm9tU3RyaW5nYCwKLSAgOmNmdW5jOmBQeUZvcm1hdF9Gcm9tU3RyaW5nVmAsIGFuZCA6Y2Z1bmM6YFB5RXJyX0Zvcm1hdGAgZnVuY3Rpb25zIG5vdworKiBOZXcgZm9ybWF0IGNvZGVzOiB0aGUgOmM6ZnVuYzpgUHlGb3JtYXRfRnJvbVN0cmluZ2AsCisgIDpjOmZ1bmM6YFB5Rm9ybWF0X0Zyb21TdHJpbmdWYCwgYW5kIDpjOmZ1bmM6YFB5RXJyX0Zvcm1hdGAgZnVuY3Rpb25zIG5vdwogICBhY2NlcHQgYGAlbGxkYGAgYW5kIGBgJWxsdWBgIGZvcm1hdCBjb2RlcyBmb3IgZGlzcGxheWluZwotICBDJ3MgOmN0eXBlOmBsb25nIGxvbmdgIHR5cGVzLgorICBDJ3MgOmM6dHlwZTpgbG9uZyBsb25nYCB0eXBlcy4KICAgKENvbnRyaWJ1dGVkIGJ5IE1hcmsgRGlja2luc29uOyA6aXNzdWU6YDcyMjhgLikKIAogKiBUaGUgY29tcGxpY2F0ZWQgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aHJlYWRzIGFuZCBwcm9jZXNzIGZvcmtpbmcgaGFzCkBAIC0yMTUwLDE3ICsyMTk0LDE3IEBACiAgIFB5dGhvbiAyLjcgYWNxdWlyZXMgdGhlIGltcG9ydCBsb2NrIGJlZm9yZSBwZXJmb3JtaW5nIGFuCiAgIDpmdW5jOmBvcy5mb3JrYCwgYW5kIHdpbGwgYWxzbyBjbGVhbiB1cCBhbnkgbG9ja3MgY3JlYXRlZCB1c2luZyB0aGUKICAgOm1vZDpgdGhyZWFkaW5nYCBtb2R1bGUuICBDIGV4dGVuc2lvbiBtb2R1bGVzIHRoYXQgaGF2ZSBpbnRlcm5hbAotICBsb2Nrcywgb3IgdGhhdCBjYWxsIDpjZnVuYzpgZm9yaygpYCB0aGVtc2VsdmVzLCB3aWxsIG5vdCBiZW5lZml0CisgIGxvY2tzLCBvciB0aGF0IGNhbGwgOmM6ZnVuYzpgZm9yaygpYCB0aGVtc2VsdmVzLCB3aWxsIG5vdCBiZW5lZml0CiAgIGZyb20gdGhpcyBjbGVhbi11cC4KIAogICAoRml4ZWQgYnkgVGhvbWFzIFdvdXRlcnM7IDppc3N1ZTpgMTU5MDg2NGAuKQogCi0qIFRoZSA6Y2Z1bmM6YFB5X0ZpbmFsaXplYCBmdW5jdGlvbiBub3cgY2FsbHMgdGhlIGludGVybmFsCisqIFRoZSA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAgZnVuY3Rpb24gbm93IGNhbGxzIHRoZSBpbnRlcm5hbAogICA6ZnVuYzpgdGhyZWFkaW5nLl9zaHV0ZG93bmAgZnVuY3Rpb247IHRoaXMgcHJldmVudHMgc29tZSBleGNlcHRpb25zIGZyb20KICAgYmVpbmcgcmFpc2VkIHdoZW4gYW4gaW50ZXJwcmV0ZXIgc2h1dHMgZG93bi4KICAgKFBhdGNoIGJ5IEFkYW0gT2xzZW47IDppc3N1ZTpgMTcyMjM0NGAuKQogCi0qIFdoZW4gdXNpbmcgdGhlIDpjdHlwZTpgUHlNZW1iZXJEZWZgIHN0cnVjdHVyZSB0byBkZWZpbmUgYXR0cmlidXRlcworKiBXaGVuIHVzaW5nIHRoZSA6Yzp0eXBlOmBQeU1lbWJlckRlZmAgc3RydWN0dXJlIHRvIGRlZmluZSBhdHRyaWJ1dGVzCiAgIG9mIGEgdHlwZSwgUHl0aG9uIHdpbGwgbm8gbG9uZ2VyIGxldCB5b3UgdHJ5IHRvIGRlbGV0ZSBvciBzZXQgYQogICA6Y29uc3Q6YFRfU1RSSU5HX0lOUExBQ0VgIGF0dHJpYnV0ZS4KIApAQCAtMjE4Nyw3ICsyMjMxLDcgQEAKICAgOmlzc3VlOmA2NDkxYC4pCiAKICogVGhlIDpwcm9ncmFtOmBjb25maWd1cmVgIHNjcmlwdCBub3cgY2hlY2tzIGZvciBmbG9hdGluZy1wb2ludCByb3VuZGluZyBidWdzCi0gIG9uIGNlcnRhaW4gMzItYml0IEludGVsIGNoaXBzIGFuZCBkZWZpbmVzIGEgOmNtYWNybzpgWDg3X0RPVUJMRV9ST1VORElOR2AKKyAgb24gY2VydGFpbiAzMi1iaXQgSW50ZWwgY2hpcHMgYW5kIGRlZmluZXMgYSA6YzptYWNybzpgWDg3X0RPVUJMRV9ST1VORElOR2AKICAgcHJlcHJvY2Vzc29yIGRlZmluaXRpb24uICBObyBjb2RlIGN1cnJlbnRseSB1c2VzIHRoaXMgZGVmaW5pdGlvbiwKICAgYnV0IGl0J3MgYXZhaWxhYmxlIGlmIGFueW9uZSB3aXNoZXMgdG8gdXNlIGl0LgogICAoQWRkZWQgYnkgTWFyayBEaWNraW5zb247IDppc3N1ZTpgMjkzN2AuKQpAQCAtMjIwOCw3ICsyMjUyLDcgQEAKIENhcHN1bGVzCiAtLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVB5dGhvbiAzLjEgYWRkcyBhIG5ldyBDIGRhdGF0eXBlLCA6Y3R5cGU6YFB5Q2Fwc3VsZWAsIGZvciBwcm92aWRpbmcgYQorUHl0aG9uIDMuMSBhZGRzIGEgbmV3IEMgZGF0YXR5cGUsIDpjOnR5cGU6YFB5Q2Fwc3VsZWAsIGZvciBwcm92aWRpbmcgYQogQyBBUEkgdG8gYW4gZXh0ZW5zaW9uIG1vZHVsZS4gIEEgY2Fwc3VsZSBpcyBlc3NlbnRpYWxseSB0aGUgaG9sZGVyIG9mCiBhIEMgYGB2b2lkICpgYCBwb2ludGVyLCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgYXMgYSBtb2R1bGUgYXR0cmlidXRlOyBmb3IKIGV4YW1wbGUsIHRoZSA6bW9kOmBzb2NrZXRgIG1vZHVsZSdzIEFQSSBpcyBleHBvc2VkIGFzIGBgc29ja2V0LkNBUElgYCwKQEAgLTIyMTgsMTAgKzIyNjIsMTAgQEAKIHRvIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIHRoZSBtb2R1bGUncyB2YXJpb3VzIEFQSSBmdW5jdGlvbnMuCiAKIFRoZXJlIGlzIGFuIGV4aXN0aW5nIGRhdGEgdHlwZSBhbHJlYWR5IHVzZWQgZm9yIHRoaXMsCi06Y3R5cGU6YFB5Q09iamVjdGAsIGJ1dCBpdCBkb2Vzbid0IHByb3ZpZGUgdHlwZSBzYWZldHkuICBFdmlsIGNvZGUKKzpjOnR5cGU6YFB5Q09iamVjdGAsIGJ1dCBpdCBkb2Vzbid0IHByb3ZpZGUgdHlwZSBzYWZldHkuICBFdmlsIGNvZGUKIHdyaXR0ZW4gaW4gcHVyZSBQeXRob24gY291bGQgY2F1c2UgYSBzZWdtZW50YXRpb24gZmF1bHQgYnkgdGFraW5nIGEKLTpjdHlwZTpgUHlDT2JqZWN0YCBmcm9tIG1vZHVsZSBBIGFuZCBzb21laG93IHN1YnN0aXR1dGluZyBpdCBmb3IgdGhlCi06Y3R5cGU6YFB5Q09iamVjdGAgaW4gbW9kdWxlIEIuICAgQ2Fwc3VsZXMga25vdyB0aGVpciBvd24gbmFtZSwKKzpjOnR5cGU6YFB5Q09iamVjdGAgZnJvbSBtb2R1bGUgQSBhbmQgc29tZWhvdyBzdWJzdGl0dXRpbmcgaXQgZm9yIHRoZQorOmM6dHlwZTpgUHlDT2JqZWN0YCBpbiBtb2R1bGUgQi4gICBDYXBzdWxlcyBrbm93IHRoZWlyIG93biBuYW1lLAogYW5kIGdldHRpbmcgdGhlIHBvaW50ZXIgcmVxdWlyZXMgcHJvdmlkaW5nIHRoZSBuYW1lOjoKIAogICAgdm9pZCAqdnRhYmxlOwpAQCAtMjIzNCwxNSArMjI3OCwxNSBAQAogICAgdnRhYmxlID0gUHlDYXBzdWxlX0dldFBvaW50ZXIoY2Fwc3VsZSwgIm15bW9kdWxlLkNBUEkiKTsKIAogWW91IGFyZSBhc3N1cmVkIHRoYXQgYGB2dGFibGVgYCBwb2ludHMgdG8gd2hhdGV2ZXIgeW91J3JlIGV4cGVjdGluZy4KLUlmIGEgZGlmZmVyZW50IGNhcHN1bGUgd2FzIHBhc3NlZCBpbiwgOmNmdW5jOmBQeUNhcHN1bGVfSXNWYWxpZGAgd291bGQKK0lmIGEgZGlmZmVyZW50IGNhcHN1bGUgd2FzIHBhc3NlZCBpbiwgOmM6ZnVuYzpgUHlDYXBzdWxlX0lzVmFsaWRgIHdvdWxkCiBkZXRlY3QgdGhlIG1pc21hdGNoZWQgbmFtZSBhbmQgcmV0dXJuIGZhbHNlLiAgUmVmZXIgdG8KIDpyZWY6YHVzaW5nLWNhcHN1bGVzYCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB1c2luZyB0aGVzZSBvYmplY3RzLgogCiBQeXRob24gMi43IG5vdyB1c2VzIGNhcHN1bGVzIGludGVybmFsbHkgdG8gcHJvdmlkZSB2YXJpb3VzCi1leHRlbnNpb24tbW9kdWxlIEFQSXMsIGJ1dCB0aGUgOmNmdW5jOmBQeUNPYmplY3RfQXNWb2lkUHRyYCB3YXMKK2V4dGVuc2lvbi1tb2R1bGUgQVBJcywgYnV0IHRoZSA6YzpmdW5jOmBQeUNPYmplY3RfQXNWb2lkUHRyYCB3YXMKIG1vZGlmaWVkIHRvIGhhbmRsZSBjYXBzdWxlcywgcHJlc2VydmluZyBjb21waWxlLXRpbWUgY29tcGF0aWJpbGl0eQotd2l0aCB0aGUgOmN0eXBlOmBDT2JqZWN0YCBpbnRlcmZhY2UuICBVc2Ugb2YKLTpjZnVuYzpgUHlDT2JqZWN0X0FzVm9pZFB0cmAgd2lsbCBzaWduYWwgYQord2l0aCB0aGUgOmM6dHlwZTpgQ09iamVjdGAgaW50ZXJmYWNlLiAgVXNlIG9mCis6YzpmdW5jOmBQeUNPYmplY3RfQXNWb2lkUHRyYCB3aWxsIHNpZ25hbCBhCiA6ZXhjOmBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nYCwgd2hpY2ggaXMgc2lsZW50IGJ5IGRlZmF1bHQuCiAKIEltcGxlbWVudGVkIGluIFB5dGhvbiAzLjEgYW5kIGJhY2twb3J0ZWQgdG8gMi43IGJ5IExhcnJ5IEhhc3RpbmdzOwpAQCAtMjI2OSw3ICsyMzEzLDcgQEAKICAgd2VyZSBhbHNvIHRlc3RlZCBhbmQgZG9jdW1lbnRlZC4KICAgKEltcGxlbWVudGVkIGJ5IEJyaWFuIEN1cnRpbjogOmlzc3VlOmA3MzQ3YC4pCiAKLSogVGhlIG5ldyA6Y2Z1bmM6YF9iZWdpbnRocmVhZGV4YCBBUEkgaXMgdXNlZCB0byBzdGFydCB0aHJlYWRzLCBhbmQKKyogVGhlIG5ldyA6YzpmdW5jOmBfYmVnaW50aHJlYWRleGAgQVBJIGlzIHVzZWQgdG8gc3RhcnQgdGhyZWFkcywgYW5kCiAgIHRoZSBuYXRpdmUgdGhyZWFkLWxvY2FsIHN0b3JhZ2UgZnVuY3Rpb25zIGFyZSBub3cgdXNlZC4KICAgKENvbnRyaWJ1dGVkIGJ5IEtyaXN0asOhbiBWYWx1ciBKw7Nuc3NvbjsgOmlzc3VlOmAzNTgyYC4pCiAKQEAgLTIyNzcsNyArMjMyMSw3IEBACiAgIGNhbiBiZSB0aGUgY29uc3RhbnRzIDpjb25zdDpgQ1RSTF9DX0VWRU5UYCwKICAgOmNvbnN0OmBDVFJMX0JSRUFLX0VWRU5UYCwgb3IgYW55IGludGVnZXIuICBUaGUgZmlyc3QgdHdvIGNvbnN0YW50cwogICB3aWxsIHNlbmQgQ29udHJvbC1DIGFuZCBDb250cm9sLUJyZWFrIGtleXN0cm9rZSBldmVudHMgdG8KLSAgc3VicHJvY2Vzc2VzOyBhbnkgb3RoZXIgdmFsdWUgd2lsbCB1c2UgdGhlIDpjZnVuYzpgVGVybWluYXRlUHJvY2Vzc2AKKyAgc3VicHJvY2Vzc2VzOyBhbnkgb3RoZXIgdmFsdWUgd2lsbCB1c2UgdGhlIDpjOmZ1bmM6YFRlcm1pbmF0ZVByb2Nlc3NgCiAgIEFQSS4gIChDb250cmlidXRlZCBieSBNaWtpIFRlYmVrYTsgOmlzc3VlOmAxMjIwMjEyYC4pCiAKICogVGhlIDpmdW5jOmBvcy5saXN0ZGlyYCBmdW5jdGlvbiBub3cgY29ycmVjdGx5IGZhaWxzCkBAIC0yNDUwLDIyICsyNDk0LDcwIEBACiAgIGZhbWlseSBvZiBmdW5jdGlvbnMgd2lsbCBub3cgcmFpc2UgYSA6ZXhjOmBUeXBlRXJyb3JgIGV4Y2VwdGlvbgogICBpbnN0ZWFkIG9mIHRyaWdnZXJpbmcgYSA6ZXhjOmBEZXByZWNhdGlvbldhcm5pbmdgICg6aXNzdWU6YDUwODBgKS4KIAotKiBVc2UgdGhlIG5ldyA6Y2Z1bmM6YFB5T1Nfc3RyaW5nX3RvX2RvdWJsZWAgZnVuY3Rpb24gaW5zdGVhZCBvZiB0aGUgb2xkCi0gIDpjZnVuYzpgUHlPU19hc2NpaV9zdHJ0b2RgIGFuZCA6Y2Z1bmM6YFB5T1NfYXNjaWlfYXRvZmAgZnVuY3Rpb25zLAorKiBVc2UgdGhlIG5ldyA6YzpmdW5jOmBQeU9TX3N0cmluZ190b19kb3VibGVgIGZ1bmN0aW9uIGluc3RlYWQgb2YgdGhlIG9sZAorICA6YzpmdW5jOmBQeU9TX2FzY2lpX3N0cnRvZGAgYW5kIDpjOmZ1bmM6YFB5T1NfYXNjaWlfYXRvZmAgZnVuY3Rpb25zLAogICB3aGljaCBhcmUgbm93IGRlcHJlY2F0ZWQuCiAKIEZvciBhcHBsaWNhdGlvbnMgdGhhdCBlbWJlZCBQeXRob246CiAKLSogVGhlIDpjZnVuYzpgUHlTeXNfU2V0QXJndkV4YCBmdW5jdGlvbiB3YXMgYWRkZWQsIGxldHRpbmcKKyogVGhlIDpjOmZ1bmM6YFB5U3lzX1NldEFyZ3ZFeGAgZnVuY3Rpb24gd2FzIGFkZGVkLCBsZXR0aW5nCiAgIGFwcGxpY2F0aW9ucyBjbG9zZSBhIHNlY3VyaXR5IGhvbGUgd2hlbiB0aGUgZXhpc3RpbmcKLSAgOmNmdW5jOmBQeVN5c19TZXRBcmd2YCBmdW5jdGlvbiB3YXMgdXNlZC4gIENoZWNrIHdoZXRoZXIgeW91J3JlCi0gIGNhbGxpbmcgOmNmdW5jOmBQeVN5c19TZXRBcmd2YCBhbmQgY2FyZWZ1bGx5IGNvbnNpZGVyIHdoZXRoZXIgdGhlCi0gIGFwcGxpY2F0aW9uIHNob3VsZCBiZSB1c2luZyA6Y2Z1bmM6YFB5U3lzX1NldEFyZ3ZFeGAgd2l0aAorICA6YzpmdW5jOmBQeVN5c19TZXRBcmd2YCBmdW5jdGlvbiB3YXMgdXNlZC4gIENoZWNrIHdoZXRoZXIgeW91J3JlCisgIGNhbGxpbmcgOmM6ZnVuYzpgUHlTeXNfU2V0QXJndmAgYW5kIGNhcmVmdWxseSBjb25zaWRlciB3aGV0aGVyIHRoZQorICBhcHBsaWNhdGlvbiBzaG91bGQgYmUgdXNpbmcgOmM6ZnVuYzpgUHlTeXNfU2V0QXJndkV4YCB3aXRoCiAgICp1cGRhdGVwYXRoKiBzZXQgdG8gZmFsc2UuCiAKIC4uID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogCisuLiBfcHkyNy1tYWludGVuYW5jZS1lbmhhbmNlbWVudHM6CisKK05ldyBGZWF0dXJlcyBBZGRlZCB0byBQeXRob24gMi43IE1haW50ZW5hbmNlIFJlbGVhc2VzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitOZXcgZmVhdHVyZXMgbWF5IGJlIGFkZGVkIHRvIFB5dGhvbiAyLjcgbWFpbnRlbmFuY2UgcmVsZWFzZXMgd2hlbiB0aGUKK3NpdHVhdGlvbiBnZW51aW5lbHkgY2FsbHMgZm9yIGl0LiBBbnkgc3VjaCBhZGRpdGlvbnMgbXVzdCBnbyB0aHJvdWdoCit0aGUgUHl0aG9uIEVuaGFuY2VtZW50IFByb3Bvc2FsIHByb2Nlc3MsIGFuZCBtYWtlIGEgY29tcGVsbGluZyBjYXNlIGZvciB3aHkKK3RoZXkgY2FuJ3QgYmUgYWRlcXVhdGVseSBhZGRyZXNzZWQgYnkgZWl0aGVyIGFkZGluZyB0aGUgbmV3IGZlYXR1cmUgc29sZWx5IHRvCitQeXRob24gMywgb3IgZWxzZSBieSBwdWJsaXNoaW5nIGl0IG9uIHRoZSBQeXRob24gUGFja2FnZSBJbmRleC4KKworSW4gYWRkaXRpb24gdG8gdGhlIHNwZWNpZmljIHByb3Bvc2FscyBsaXN0ZWQgYmVsb3csIHRoZXJlIGlzIGEgZ2VuZXJhbAorZXhlbXB0aW9uIGFsbG93aW5nIG5ldyBgYC0zYGAgd2FybmluZ3MgdG8gYmUgYWRkZWQgaW4gYW55IFB5dGhvbiAyLjcKK21haW50ZW5hbmNlIHJlbGVhc2UuCisKKworUEVQIDQzNDogSURMRSBFbmhhbmNlbWVudCBFeGNlcHRpb24gZm9yIEFsbCBCcmFuY2hlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis6cGVwOmA0MzRgIGRlc2NyaWJlcyBhIGdlbmVyYWwgZXhlbXB0aW9uIGZvciBjaGFuZ2VzIG1hZGUgdG8gdGhlIElETEUKK2RldmVsb3BtZW50IGVudmlyb25tZW50IHNoaXBwZWQgYWxvbmcgd2l0aCBQeXRob24uIFRoaXMgZXhlbXB0aW9uIG1ha2VzIGl0Citwb3NzaWJsZSBmb3IgdGhlIElETEUgZGV2ZWxvcGVycyB0byBwcm92aWRlIGEgbW9yZSBjb25zaXN0ZW50IHVzZXIKK2V4cGVyaWVuY2UgYWNyb3NzIGFsbCBzdXBwb3J0ZWQgdmVyc2lvbnMgb2YgUHl0aG9uIDIgYW5kIDMuCisKK0ZvciBkZXRhaWxzIG9mIGFueSBJRExFIGNoYW5nZXMsIHJlZmVyIHRvIHRoZSBORVdTIGZpbGUgZm9yIHRoZSBzcGVjaWZpYworcmVsZWFzZS4KKworCitQRVAgNDY2OiBOZXR3b3JrIFNlY3VyaXR5IEVuaGFuY2VtZW50cyBmb3IgUHl0aG9uIDIuNworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworOnBlcDpgNDY2YCBkZXNjcmliZXMgYSBudW1iZXIgb2YgbmV0d29yayBzZWN1cml0eSBlbmhhbmNlbWVudCBwcm9wb3NhbHMKK3RoYXQgaGF2ZSBiZWVuIGFwcHJvdmVkIGZvciBpbmNsdXNpb24gaW4gUHl0aG9uIDIuNyBtYWludGVuYW5jZSByZWxlYXNlcywKK3dpdGggdGhlIGZpcnN0IG9mIHRob3NlIGNoYW5nZXMgYXBwZWFyaW5nIGluIHRoZSBQeXRob24gMi43LjcgcmVsZWFzZS4KKworOnBlcDpgNDY2YCByZWxhdGVkIGZlYXR1cmVzIGFkZGVkIGluIFB5dGhvbiAyLjcuNzoKKworKiA6ZnVuYzpgaG1hYy5jb21wYXJlX2RpZ2VzdGAgd2FzIGFkZGVkIHRvIG1ha2UgYSB0aW1pbmcgYXR0YWNrIHJlc2lzdGFudAorICBjb21wYXJpc29uIG9wZXJhdGlvbiBicm9hZGx5IGF2YWlsYWJsZSB0byBQeXRob24gMiBhcHBsaWNhdGlvbnMKKyAgKGJhY2twb3J0ZWQgYnkgQWxleCBHYXlub3IgaW4gOmlzc3VlOmAyMTMwNmApCisKKyogdGhlIHZlcnNpb24gb2YgT3BlblNTTCBsaW5rZWQgd2l0aCB0aGUgcHJlYnVpbHQgV2luZG93cyBpbnN0YWxsZXJzCisgIHB1Ymxpc2hlZCBvbiBweXRob24ub3JnIHdhcyB1cGRhdGVkIHRvIDEuMC4xZyAoY29udHJpYnV0ZWQgYnkKKyAgWmFjaGFyeSBXYXJlIGluIDppc3N1ZTpgMjE0NjJgKQorCisKKy4uID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwogLi4gX2Fja3MyNzoKIAogQWNrbm93bGVkZ2VtZW50cwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9hYnN0cmFjdC5oIGIvSW5jbHVkZS9hYnN0cmFjdC5oCmluZGV4IGEzNzc0MjMuLjc4YTE4MjUgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvYWJzdHJhY3QuaAorKysgYi9JbmNsdWRlL2Fic3RyYWN0LmgKQEAgLTExNDksNyArMTE0OSw3IEBACiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVNlcXVlbmNlX0Zhc3QoUHlPYmplY3QgKm8sIGNvbnN0IGNoYXIqIG0pOwogICAgICAgIC8qCi0gICAgIFJldHVybnMgdGhlIHNlcXVlbmNlLCBvLCBhcyBhIHR1cGxlLCB1bmxlc3MgaXQncyBhbHJlYWR5IGEKKyAgICAgUmV0dXJuIHRoZSBzZXF1ZW5jZSwgbywgYXMgYSBsaXN0LCB1bmxlc3MgaXQncyBhbHJlYWR5IGEKICAgICAgdHVwbGUgb3IgbGlzdC4gIFVzZSBQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0gdG8gYWNjZXNzIHRoZQogICAgICBtZW1iZXJzIG9mIHRoaXMgbGlzdCwgYW5kIFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRSB0byBnZXQgaXRzIGxlbmd0aC4KIApkaWZmIC0tZ2l0IGEvSW5jbHVkZS9jU3RyaW5nSU8uaCBiL0luY2x1ZGUvY1N0cmluZ0lPLmgKaW5kZXggNmNhNDRhOC4uOTczYTQ3MSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9jU3RyaW5nSU8uaAorKysgYi9JbmNsdWRlL2NTdHJpbmdJTy5oCkBAIC03LDcgKzcsNyBAQAogCiAgIFRoaXMgaGVhZGVyIHByb3ZpZGVzIGFjY2VzcyB0byBjU3RyaW5nSU8gb2JqZWN0cyBmcm9tIEMuCiAgIEZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQgZm9yIGNhbGxpbmcgY1N0cmluZ0lPIG9iamVjdHMgYW5kCi0gIG1hY3JvcyBhcmUgcHJvdmlkZWQgZm9yIHRlc3Rpbmcgd2hldGhlciB5b3UgaGF2ZSBjU3RyaW5nSU8gCisgIG1hY3JvcyBhcmUgcHJvdmlkZWQgZm9yIHRlc3Rpbmcgd2hldGhlciB5b3UgaGF2ZSBjU3RyaW5nSU8KICAgb2JqZWN0cy4KIAogICBCZWZvcmUgY2FsbGluZyBhbnkgb2YgdGhlIGZ1bmN0aW9ucyBvciBtYWNyb3MsIHlvdSBtdXN0IGluaXRpYWxpemUKQEAgLTI4LDcgKzI4LDcgQEAKIC8qIEJhc2ljIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIGNTdHJpbmdJTyBvYmplY3RzIGZyb20gQyAqLwogCiBzdGF0aWMgc3RydWN0IFB5Y1N0cmluZ0lPX0NBUEkgewotICAKKwogIC8qIFJlYWQgYSBzdHJpbmcgZnJvbSBhbiBpbnB1dCBvYmplY3QuICBJZiB0aGUgbGFzdCBhcmd1bWVudAogICAgIGlzIC0xLCB0aGUgcmVtYWluZGVyIHdpbGwgYmUgcmVhZC4KICAgICAqLwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9kYXRldGltZS5oIGIvSW5jbHVkZS9kYXRldGltZS5oCmluZGV4IDQ3YWJlNWMuLmMwZTdmZmQgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvZGF0ZXRpbWUuaAorKysgYi9JbmNsdWRlL2RhdGV0aW1lLmgKQEAgLTQyLDcgKzQyLDcgQEAKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBQeU9iamVjdF9IRUFEICAgICAgICAgICAgICAgLyogYSBwdXJlIGFic3RyYWN0IGJhc2UgY2xhc2UgKi8KKyAgICBQeU9iamVjdF9IRUFEICAgICAgICAgICAgICAgLyogYSBwdXJlIGFic3RyYWN0IGJhc2UgY2xhc3MgKi8KIH0gUHlEYXRlVGltZV9UWkluZm87CiAKIApkaWZmIC0tZ2l0IGEvSW5jbHVkZS9pbXBvcnQuaCBiL0luY2x1ZGUvaW1wb3J0LmgKaW5kZXggMWI3ZmUwYS4uODlmNTFiNSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9pbXBvcnQuaAorKysgYi9JbmNsdWRlL2ltcG9ydC5oCkBAIC00MCw4ICs0MCw4IEBACiBQeUFQSV9GVU5DKGludCkgX1B5SW1wb3J0X0lzU2NyaXB0KHN0cnVjdCBmaWxlZGVzY3IgKik7CiBQeUFQSV9GVU5DKHZvaWQpIF9QeUltcG9ydF9SZUluaXRMb2NrKHZvaWQpOwogCi1QeUFQSV9GVU5DKFB5T2JqZWN0ICopX1B5SW1wb3J0X0ZpbmRFeHRlbnNpb24oY2hhciAqLCBjaGFyICopOwotUHlBUElfRlVOQyhQeU9iamVjdCAqKV9QeUltcG9ydF9GaXh1cEV4dGVuc2lvbihjaGFyICosIGNoYXIgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeUltcG9ydF9GaW5kRXh0ZW5zaW9uKGNoYXIgKiwgY2hhciAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5SW1wb3J0X0ZpeHVwRXh0ZW5zaW9uKGNoYXIgKiwgY2hhciAqKTsKIAogc3RydWN0IF9pbml0dGFiIHsKICAgICBjaGFyICpuYW1lOwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9pbnRvYmplY3QuaCBiL0luY2x1ZGUvaW50b2JqZWN0LmgKaW5kZXggNzg3NDZhNi4uMjUyZWVhOSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9pbnRvYmplY3QuaAorKysgYi9JbmNsdWRlL2ludG9iamVjdC5oCkBAIC00MCw2ICs0MCw3IEBACiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5SW50X0Zyb21Tc2l6ZV90KFB5X3NzaXplX3QpOwogUHlBUElfRlVOQyhsb25nKSBQeUludF9Bc0xvbmcoUHlPYmplY3QgKik7CiBQeUFQSV9GVU5DKFB5X3NzaXplX3QpIFB5SW50X0FzU3NpemVfdChQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoaW50KSBfUHlJbnRfQXNJbnQoUHlPYmplY3QgKik7CiBQeUFQSV9GVU5DKHVuc2lnbmVkIGxvbmcpIFB5SW50X0FzVW5zaWduZWRMb25nTWFzayhQeU9iamVjdCAqKTsKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwogUHlBUElfRlVOQyh1bnNpZ25lZCBQWV9MT05HX0xPTkcpIFB5SW50X0FzVW5zaWduZWRMb25nTG9uZ01hc2soUHlPYmplY3QgKik7CmRpZmYgLS1naXQgYS9JbmNsdWRlL2xpc3RvYmplY3QuaCBiL0luY2x1ZGUvbGlzdG9iamVjdC5oCmluZGV4IGM0NDU4NzMuLjdjZDYxNmIgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvbGlzdG9iamVjdC5oCisrKyBiL0luY2x1ZGUvbGlzdG9iamVjdC5oCkBAIC00MSw3ICs0MSw3IEBACiBQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlMaXN0X1R5cGU7CiAKICNkZWZpbmUgUHlMaXN0X0NoZWNrKG9wKSBcCi0JCVB5VHlwZV9GYXN0U3ViY2xhc3MoUHlfVFlQRShvcCksIFB5X1RQRkxBR1NfTElTVF9TVUJDTEFTUykKKyAgICBQeVR5cGVfRmFzdFN1YmNsYXNzKFB5X1RZUEUob3ApLCBQeV9UUEZMQUdTX0xJU1RfU1VCQ0xBU1MpCiAjZGVmaW5lIFB5TGlzdF9DaGVja0V4YWN0KG9wKSAoUHlfVFlQRShvcCkgPT0gJlB5TGlzdF9UeXBlKQogCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TGlzdF9OZXcoUHlfc3NpemVfdCBzaXplKTsKZGlmZiAtLWdpdCBhL0luY2x1ZGUvbG9uZ29iamVjdC5oIGIvSW5jbHVkZS9sb25nb2JqZWN0LmgKaW5kZXggMmI0MDQ2MS4uOGJlMjM0NSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9sb25nb2JqZWN0LmgKKysrIGIvSW5jbHVkZS9sb25nb2JqZWN0LmgKQEAgLTI1LDYgKzI1LDcgQEAKIFB5QVBJX0ZVTkModW5zaWduZWQgbG9uZykgUHlMb25nX0FzVW5zaWduZWRMb25nKFB5T2JqZWN0ICopOwogUHlBUElfRlVOQyh1bnNpZ25lZCBsb25nKSBQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrKFB5T2JqZWN0ICopOwogUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBQeUxvbmdfQXNTc2l6ZV90KFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhpbnQpIF9QeUxvbmdfQXNJbnQoUHlPYmplY3QgKik7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TG9uZ19HZXRJbmZvKHZvaWQpOwogCiAvKiBGb3IgdXNlIGJ5IGludG9iamVjdC5jIG9ubHkgKi8KZGlmZiAtLWdpdCBhL0luY2x1ZGUvbm9kZS5oIGIvSW5jbHVkZS9ub2RlLmgKaW5kZXggZTIzZTcwOS4uOWY2NzYwYyAxMDA2NDQKLS0tIGEvSW5jbHVkZS9ub2RlLmgKKysrIGIvSW5jbHVkZS9ub2RlLmgKQEAgLTIwLDYgKzIwLDkgQEAKIFB5QVBJX0ZVTkMoaW50KSBQeU5vZGVfQWRkQ2hpbGQobm9kZSAqbiwgaW50IHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN0ciwgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQpOwogUHlBUElfRlVOQyh2b2lkKSBQeU5vZGVfRnJlZShub2RlICpuKTsKKyNpZm5kZWYgUHlfTElNSVRFRF9BUEkKK1B5X3NzaXplX3QgX1B5Tm9kZV9TaXplT2Yobm9kZSAqbik7CisjZW5kaWYKIAogLyogTm9kZSBhY2Nlc3MgZnVuY3Rpb25zICovCiAjZGVmaW5lIE5DSChuKQkJKChuKS0+bl9uY2hpbGRyZW4pCmRpZmYgLS1naXQgYS9JbmNsdWRlL29iamVjdC5oIGIvSW5jbHVkZS9vYmplY3QuaAppbmRleCBiMzY4OTQ2Li5hZmJjNjhkIDEwMDY0NAotLS0gYS9JbmNsdWRlL29iamVjdC5oCisrKyBiL0luY2x1ZGUvb2JqZWN0LmgKQEAgLTUxNyw2ICs1MTcsMTYgQEAKIFB5QVBJX0ZVTkMobG9uZykgX1B5X0hhc2hEb3VibGUoZG91YmxlKTsKIFB5QVBJX0ZVTkMobG9uZykgX1B5X0hhc2hQb2ludGVyKHZvaWQqKTsKIAordHlwZWRlZiBzdHJ1Y3QgeworICAgIGxvbmcgcHJlZml4OworICAgIGxvbmcgc3VmZml4OworfSBfUHlfSGFzaFNlY3JldF90OworUHlBUElfREFUQShfUHlfSGFzaFNlY3JldF90KSBfUHlfSGFzaFNlY3JldDsKKworI2lmZGVmIFB5X0RFQlVHCitQeUFQSV9EQVRBKGludCkgX1B5X0hhc2hTZWNyZXRfSW5pdGlhbGl6ZWQ7CisjZW5kaWYKKwogLyogSGVscGVyIGZvciBwYXNzaW5nIG9iamVjdHMgdG8gcHJpbnRmIGFuZCB0aGUgbGlrZSAqLwogI2RlZmluZSBQeU9iamVjdF9SRVBSKG9iaikgUHlTdHJpbmdfQVNfU1RSSU5HKFB5T2JqZWN0X1JlcHIob2JqKSkKIApAQCAtOTYxLDI0ICs5NzEsMzkgQEAKIHdpdGggdGhlIGNhbGwgc3RhY2sgbmV2ZXIgZXhjZWVkaW5nIGEgZGVwdGggb2YgUHlUcmFzaF9VTldJTkRfTEVWRUwuCiAqLwogCisvKiBUaGlzIGlzIHRoZSBvbGQgcHJpdmF0ZSBBUEksIGludm9rZWQgYnkgdGhlIG1hY3JvcyBiZWZvcmUgMi43LjQuCisgICBLZXB0IGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eSBvZiBleHRlbnNpb25zLiAqLwogUHlBUElfRlVOQyh2b2lkKSBfUHlUcmFzaF9kZXBvc2l0X29iamVjdChQeU9iamVjdCopOwogUHlBUElfRlVOQyh2b2lkKSBfUHlUcmFzaF9kZXN0cm95X2NoYWluKHZvaWQpOwogUHlBUElfREFUQShpbnQpIF9QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nOwogUHlBUElfREFUQShQeU9iamVjdCAqKSBfUHlUcmFzaF9kZWxldGVfbGF0ZXI7CiAKKy8qIFRoZSBuZXcgdGhyZWFkLXNhZmUgcHJpdmF0ZSBBUEksIGludm9rZWQgYnkgdGhlIG1hY3JvcyBiZWxvdy4gKi8KK1B5QVBJX0ZVTkModm9pZCkgX1B5VHJhc2hfdGhyZWFkX2RlcG9zaXRfb2JqZWN0KFB5T2JqZWN0Kik7CitQeUFQSV9GVU5DKHZvaWQpIF9QeVRyYXNoX3RocmVhZF9kZXN0cm95X2NoYWluKHZvaWQpOworCiAjZGVmaW5lIFB5VHJhc2hfVU5XSU5EX0xFVkVMIDUwCiAKKy8qIE5vdGUgdGhlIHdvcmthcm91bmQgZm9yIHdoZW4gdGhlIHRocmVhZCBzdGF0ZSBpcyBOVUxMIChpc3N1ZSAjMTc3MDMpICovCiAjZGVmaW5lIFB5X1RSQVNIQ0FOX1NBRkVfQkVHSU4ob3ApIFwKLSAgICBpZiAoX1B5VHJhc2hfZGVsZXRlX25lc3RpbmcgPCBQeVRyYXNoX1VOV0lORF9MRVZFTCkgeyBcCi0gICAgICAgICsrX1B5VHJhc2hfZGVsZXRlX25lc3Rpbmc7Ci0gICAgICAgIC8qIFRoZSBib2R5IG9mIHRoZSBkZWFsbG9jYXRvciBpcyBoZXJlLiAqLworICAgIGRvIHsgXAorICAgICAgICBQeVRocmVhZFN0YXRlICpfdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsgXAorICAgICAgICBpZiAoIV90c3RhdGUgfHwgXAorICAgICAgICAgICAgX3RzdGF0ZS0+dHJhc2hfZGVsZXRlX25lc3RpbmcgPCBQeVRyYXNoX1VOV0lORF9MRVZFTCkgeyBcCisgICAgICAgICAgICBpZiAoX3RzdGF0ZSkgXAorICAgICAgICAgICAgICAgICsrX3RzdGF0ZS0+dHJhc2hfZGVsZXRlX25lc3Rpbmc7CisgICAgICAgICAgICAvKiBUaGUgYm9keSBvZiB0aGUgZGVhbGxvY2F0b3IgaXMgaGVyZS4gKi8KICNkZWZpbmUgUHlfVFJBU0hDQU5fU0FGRV9FTkQob3ApIFwKLSAgICAgICAgLS1fUHlUcmFzaF9kZWxldGVfbmVzdGluZzsgXAotICAgICAgICBpZiAoX1B5VHJhc2hfZGVsZXRlX2xhdGVyICYmIF9QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nIDw9IDApIFwKLSAgICAgICAgICAgIF9QeVRyYXNoX2Rlc3Ryb3lfY2hhaW4oKTsgXAotICAgIH0gXAotICAgIGVsc2UgXAotICAgICAgICBfUHlUcmFzaF9kZXBvc2l0X29iamVjdCgoUHlPYmplY3QqKW9wKTsKKyAgICAgICAgICAgIGlmIChfdHN0YXRlKSB7IFwKKyAgICAgICAgICAgICAgICAtLV90c3RhdGUtPnRyYXNoX2RlbGV0ZV9uZXN0aW5nOyBcCisgICAgICAgICAgICAgICAgaWYgKF90c3RhdGUtPnRyYXNoX2RlbGV0ZV9sYXRlciBcCisgICAgICAgICAgICAgICAgICAgICYmIF90c3RhdGUtPnRyYXNoX2RlbGV0ZV9uZXN0aW5nIDw9IDApIFwKKyAgICAgICAgICAgICAgICAgICAgX1B5VHJhc2hfdGhyZWFkX2Rlc3Ryb3lfY2hhaW4oKTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIH0gXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgIF9QeVRyYXNoX3RocmVhZF9kZXBvc2l0X29iamVjdCgoUHlPYmplY3QqKW9wKTsgXAorICAgIH0gd2hpbGUgKDApOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL0luY2x1ZGUvb3NkZWZzLmggYi9JbmNsdWRlL29zZGVmcy5oCmluZGV4IDY5Mzc2NTkuLjc3YWY5MjMgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvb3NkZWZzLmgKKysrIGIvSW5jbHVkZS9vc2RlZnMuaApAQCAtMzYsNiArMzYsMTQgQEAKICNlbmRpZgogCiAvKiBNYXggcGF0aG5hbWUgbGVuZ3RoICovCisjaWZkZWYgX19ocHV4CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaWZuZGVmIFBBVEhfTUFYCisjZGVmaW5lIFBBVEhfTUFYIE1BWFBBVEhMRU4KKyNlbmRpZgorI2VuZGlmCisKICNpZm5kZWYgTUFYUEFUSExFTgogI2lmIGRlZmluZWQoUEFUSF9NQVgpICYmIFBBVEhfTUFYID4gMTAyNAogI2RlZmluZSBNQVhQQVRITEVOIFBBVEhfTUFYCmRpZmYgLS1naXQgYS9JbmNsdWRlL3BhdGNobGV2ZWwuaCBiL0luY2x1ZGUvcGF0Y2hsZXZlbC5oCmluZGV4IGQ2OTc0NjAuLmJkNmJkODQgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcGF0Y2hsZXZlbC5oCisrKyBiL0luY2x1ZGUvcGF0Y2hsZXZlbC5oCkBAIC02LDcgKzYsNyBAQAogICAgZGVmaW5lZChQWV9NQUpPUl9WRVJTSU9OKS4KIAogICAgV2hlbiB0aGUgbWFqb3Igb3IgbWlub3IgdmVyc2lvbiBjaGFuZ2VzLCB0aGUgVkVSU0lPTiB2YXJpYWJsZSBpbgotICAgY29uZmlndXJlLmluIG11c3QgYWxzbyBiZSBjaGFuZ2VkLgorICAgY29uZmlndXJlLmFjIG11c3QgYWxzbyBiZSBjaGFuZ2VkLgogCiAgICBUaGVyZSBpcyBhbHNvIChpbmRlcGVuZGVudCkgQVBJIHZlcnNpb24gaW5mb3JtYXRpb24gaW4gbW9kc3VwcG9ydC5oLgogKi8KQEAgLTIyLDEyICsyMiwxMiBAQAogLyotLXN0YXJ0IGNvbnN0YW50cy0tKi8KICNkZWZpbmUgUFlfTUFKT1JfVkVSU0lPTgkyCiAjZGVmaW5lIFBZX01JTk9SX1ZFUlNJT04JNwotI2RlZmluZSBQWV9NSUNST19WRVJTSU9OCTIKKyNkZWZpbmUgUFlfTUlDUk9fVkVSU0lPTgk4CiAjZGVmaW5lIFBZX1JFTEVBU0VfTEVWRUwJUFlfUkVMRUFTRV9MRVZFTF9GSU5BTAogI2RlZmluZSBQWV9SRUxFQVNFX1NFUklBTAkwCiAKIC8qIFZlcnNpb24gYXMgYSBzdHJpbmcgKi8KLSNkZWZpbmUgUFlfVkVSU0lPTiAgICAgIAkiMi43LjIrIgorI2RlZmluZSBQWV9WRVJTSU9OICAgICAgCSIyLjcuOCsiCiAvKi0tZW5kIGNvbnN0YW50cy0tKi8KIAogLyogU3VidmVyc2lvbiBSZXZpc2lvbiBudW1iZXIgb2YgdGhpcyBmaWxlIChub3Qgb2YgdGhlIHJlcG9zaXRvcnkpLiBFbXB0eQpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weWRlYnVnLmggYi9JbmNsdWRlL3B5ZGVidWcuaAppbmRleCAwZTc5MzdkLi4wZjQ1OTYwIDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5ZGVidWcuaAorKysgYi9JbmNsdWRlL3B5ZGVidWcuaApAQCAtMjYsNiArMjYsNyBAQAogUHlBUElfREFUQShpbnQpIF9QeV9RbmV3RmxhZzsKIC8qIFdhcm4gYWJvdXQgMy54IGlzc3VlcyAqLwogUHlBUElfREFUQShpbnQpIFB5X1B5M2tXYXJuaW5nRmxhZzsKK1B5QVBJX0RBVEEoaW50KSBQeV9IYXNoUmFuZG9taXphdGlvbkZsYWc7CiAKIC8qIHRoaXMgaXMgYSB3cmFwcGVyIGFyb3VuZCBnZXRlbnYoKSB0aGF0IHBheXMgYXR0ZW50aW9uIHRvCiAgICBQeV9JZ25vcmVFbnZpcm9ubWVudEZsYWcuICBJdCBzaG91bGQgYmUgdXNlZCBmb3IgZ2V0dGluZyB2YXJpYWJsZXMgbGlrZQpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weWZwZS5oIGIvSW5jbHVkZS9weWZwZS5oCmluZGV4IDE5MTEwYWIuLmU5NTcxMTkgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHlmcGUuaAorKysgYi9JbmNsdWRlL3B5ZnBlLmgKQEAgLTQsOCArNCw4IEBACiBleHRlcm4gIkMiIHsKICNlbmRpZgogLyoKLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKLSAgICAvICAgICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDE5OTYuICAgICAgICAgICAgICAgICAgICAgICAgICAgXCAKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLyAgICAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAxOTk2LiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIHwgICAgICAgICAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gICAgICAgICAgICAgICAgIHwKICAgIHwgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKQEAgLTM3LDggKzM3LDggQEAKICAgIHwgICBvcGluaW9ucyAgb2YgYXV0aG9ycyBleHByZXNzZWQgaGVyZWluIGRvIG5vdCBuZWNlc3NhcmlseSBzdGF0ZSBvciAgIHwKICAgIHwgICByZWZsZWN0IHRob3NlIG9mIHRoZSBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgb3IgIHRoZSAgVW5pdmVyc2l0eSAgIHwKICAgIHwgICBvZiAgQ2FsaWZvcm5pYSwgIGFuZCBzaGFsbCBub3QgYmUgdXNlZCBmb3IgYWR2ZXJ0aXNpbmcgb3IgcHJvZHVjdCAgIHwKLSAgICBcICBlbmRvcnNlbWVudCBwdXJwb3Nlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAKLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyAgICBcICBlbmRvcnNlbWVudCBwdXJwb3Nlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLworICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCiAKIC8qCmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5Z2V0b3B0LmggYi9JbmNsdWRlL3B5Z2V0b3B0LmgKaW5kZXggODA5MDhiZS4uOTg2MGQzNiAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weWdldG9wdC5oCisrKyBiL0luY2x1ZGUvcHlnZXRvcHQuaApAQCAtOSw2ICs5LDcgQEAKIFB5QVBJX0RBVEEoaW50KSBfUHlPU19vcHRpbmQ7CiBQeUFQSV9EQVRBKGNoYXIgKikgX1B5T1Nfb3B0YXJnOwogCitQeUFQSV9GVU5DKHZvaWQpIF9QeU9TX1Jlc2V0R2V0T3B0KHZvaWQpOwogUHlBUElfRlVOQyhpbnQpIF9QeU9TX0dldE9wdChpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGNoYXIgKm9wdHN0cmluZyk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weXBvcnQuaCBiL0luY2x1ZGUvcHlwb3J0LmgKaW5kZXggMWFiYzE0Yy4uODVlODUyZiAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weXBvcnQuaAorKysgYi9JbmNsdWRlL3B5cG9ydC5oCkBAIC05Myw5ICs5MywxMiBAQAogICogdWludDMyX3QgdG8gYmUgc3VjaCBhIHR5cGUgdW5sZXNzIHN0ZGludC5oIG9yIGludHR5cGVzLmggZGVmaW5lcyB1aW50MzJfdC4KICAqIEhvd2V2ZXIsIGl0IGRvZXNuJ3Qgc2V0IEhBVkVfVUlOVDMyX1QsIHNvIHdlIGRvIHRoYXQgaGVyZS4KICAqLwotI2lmIChkZWZpbmVkIFVJTlQzMl9NQVggfHwgZGVmaW5lZCB1aW50MzJfdCkKLSNpZm5kZWYgUFlfVUlOVDMyX1QKKyNpZmRlZiB1aW50MzJfdAogI2RlZmluZSBIQVZFX1VJTlQzMl9UIDEKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9VSU5UMzJfVAorI2lmbmRlZiBQWV9VSU5UMzJfVAogI2RlZmluZSBQWV9VSU5UMzJfVCB1aW50MzJfdAogI2VuZGlmCiAjZW5kaWYKQEAgLTEwMywyMyArMTA2LDMzIEBACiAvKiBNYWNyb3MgZm9yIGEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIgdHlwZTsgdXNlZCBmb3IgdHlwZSAndHdvZGlnaXRzJyBpbiB0aGUKICAqIGxvbmcgaW50ZWdlciBpbXBsZW1lbnRhdGlvbiwgd2hlbiAzMC1iaXQgZGlnaXRzIGFyZSBlbmFibGVkLgogICovCi0jaWYgKGRlZmluZWQgVUlOVDY0X01BWCB8fCBkZWZpbmVkIHVpbnQ2NF90KQotI2lmbmRlZiBQWV9VSU5UNjRfVAorI2lmZGVmIHVpbnQ2NF90CiAjZGVmaW5lIEhBVkVfVUlOVDY0X1QgMQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1VJTlQ2NF9UCisjaWZuZGVmIFBZX1VJTlQ2NF9UCiAjZGVmaW5lIFBZX1VJTlQ2NF9UIHVpbnQ2NF90CiAjZW5kaWYKICNlbmRpZgogCiAvKiBTaWduZWQgdmFyaWFudHMgb2YgdGhlIGFib3ZlICovCi0jaWYgKGRlZmluZWQgSU5UMzJfTUFYIHx8IGRlZmluZWQgaW50MzJfdCkKLSNpZm5kZWYgUFlfSU5UMzJfVAorI2lmZGVmIGludDMyX3QKICNkZWZpbmUgSEFWRV9JTlQzMl9UIDEKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9JTlQzMl9UCisjaWZuZGVmIFBZX0lOVDMyX1QKICNkZWZpbmUgUFlfSU5UMzJfVCBpbnQzMl90CiAjZW5kaWYKICNlbmRpZgotI2lmIChkZWZpbmVkIElOVDY0X01BWCB8fCBkZWZpbmVkIGludDY0X3QpCi0jaWZuZGVmIFBZX0lOVDY0X1QKKworI2lmZGVmIGludDY0X3QKICNkZWZpbmUgSEFWRV9JTlQ2NF9UIDEKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9JTlQ2NF9UCisjaWZuZGVmIFBZX0lOVDY0X1QKICNkZWZpbmUgUFlfSU5UNjRfVCBpbnQ2NF90CiAjZW5kaWYKICNlbmRpZgpAQCAtNTQ5LDYgKzU2MiwzMCBAQAogICAgICAgICBfUHlfc2V0XzM4N2NvbnRyb2x3b3JkKG9sZF8zODdjb250cm9sd29yZCkKICNlbmRpZgogCisvKiBnZXQgYW5kIHNldCB4ODcgY29udHJvbCB3b3JkIGZvciBWaXN1YWxTdHVkaW8veDg2ICovCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX1dJTjY0KSAvKiB4ODcgbm90IHN1cHBvcnRlZCBpbiA2NC1iaXQgKi8KKyNkZWZpbmUgSEFWRV9QWV9TRVRfNTNCSVRfUFJFQ0lTSU9OIDEKKyNkZWZpbmUgX1B5X1NFVF81M0JJVF9QUkVDSVNJT05fSEVBREVSIFwKKyAgICB1bnNpZ25lZCBpbnQgb2xkXzM4N2NvbnRyb2x3b3JkLCBuZXdfMzg3Y29udHJvbHdvcmQsIG91dF8zODdjb250cm9sd29yZAorLyogV2UgdXNlIHRoZSBfX2NvbnRyb2w4N18yIGZ1bmN0aW9uIHRvIHNldCBvbmx5IHRoZSB4ODcgY29udHJvbCB3b3JkLgorICAgVGhlIFNTRSBjb250cm9sIHdvcmQgaXMgdW5hZmZlY3RlZC4gKi8KKyNkZWZpbmUgX1B5X1NFVF81M0JJVF9QUkVDSVNJT05fU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19jb250cm9sODdfMigwLCAwLCAmb2xkXzM4N2NvbnRyb2x3b3JkLCBOVUxMKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3XzM4N2NvbnRyb2x3b3JkID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAob2xkXzM4N2NvbnRyb2x3b3JkICYgfihfTUNXX1BDIHwgX01DV19SQykpIHwgKF9QQ181MyB8IF9SQ19ORUFSKTsgXAorICAgICAgICBpZiAobmV3XzM4N2NvbnRyb2x3b3JkICE9IG9sZF8zODdjb250cm9sd29yZCkgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19jb250cm9sODdfMihuZXdfMzg3Y29udHJvbHdvcmQsIF9NQ1dfUEMgfCBfTUNXX1JDLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0XzM4N2NvbnRyb2x3b3JkLCBOVUxMKTsgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisjZGVmaW5lIF9QeV9TRVRfNTNCSVRfUFJFQ0lTSU9OX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChuZXdfMzg3Y29udHJvbHdvcmQgIT0gb2xkXzM4N2NvbnRyb2x3b3JkKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX2NvbnRyb2w4N18yKG9sZF8zODdjb250cm9sd29yZCwgX01DV19QQyB8IF9NQ1dfUkMsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRfMzg3Y29udHJvbHdvcmQsIE5VTEwpOyAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCiAvKiBkZWZhdWx0IGRlZmluaXRpb25zIGFyZSBlbXB0eSAqLwogI2lmbmRlZiBIQVZFX1BZX1NFVF81M0JJVF9QUkVDSVNJT04KICNkZWZpbmUgX1B5X1NFVF81M0JJVF9QUkVDSVNJT05fSEVBREVSCkBAIC02MjIsNyArNjU5LDcgQEAKIC8qIE9uIFFOWCA2LCBzdHJ1Y3QgdGVybWlvIG11c3QgYmUgZGVjbGFyZWQgYnkgaW5jbHVkaW5nIHN5cy90ZXJtaW8uaAogICAgaWYgVENHRVRBLCBUQ1NFVEEsIFRDU0VUQVcsIG9yIFRDU0VUQUYgYXJlIHVzZWQuICBzeXMvdGVybWlvLmggbXVzdAogICAgYmUgaW5jbHVkZWQgYmVmb3JlIHRlcm1pb3MuaCBvciBpdCB3aWxsIGdlbmVyYXRlIGFuIGVycm9yLiAqLwotI2lmZGVmIEhBVkVfU1lTX1RFUk1JT19ICisjaWYgZGVmaW5lZChIQVZFX1NZU19URVJNSU9fSCkgJiYgIWRlZmluZWQoX19ocHV4KQogI2luY2x1ZGUgPHN5cy90ZXJtaW8uaD4KICNlbmRpZgogCmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5c3RhdGUuaCBiL0luY2x1ZGUvcHlzdGF0ZS5oCmluZGV4IDhkNzQ5NDAuLmYyY2ZjMzAgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHlzdGF0ZS5oCisrKyBiL0luY2x1ZGUvcHlzdGF0ZS5oCkBAIC05NSw2ICs5NSw5IEBACiAgICAgUHlPYmplY3QgKmFzeW5jX2V4YzsgLyogQXN5bmNocm9ub3VzIGV4Y2VwdGlvbiB0byByYWlzZSAqLwogICAgIGxvbmcgdGhyZWFkX2lkOyAvKiBUaHJlYWQgaWQgd2hlcmUgdGhpcyB0c3RhdGUgd2FzIGNyZWF0ZWQgKi8KIAorICAgIGludCB0cmFzaF9kZWxldGVfbmVzdGluZzsKKyAgICBQeU9iamVjdCAqdHJhc2hfZGVsZXRlX2xhdGVyOworCiAgICAgLyogWFhYIHNpZ25hbCBoYW5kbGVycyBzaG91bGQgYWxzbyBiZSBoZXJlICovCiAKIH0gUHlUaHJlYWRTdGF0ZTsKZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHl0aG9ucnVuLmggYi9JbmNsdWRlL3B5dGhvbnJ1bi5oCmluZGV4IDg1YmRkM2QuLmMzMTljNTIgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHl0aG9ucnVuLmgKKysrIGIvSW5jbHVkZS9weXRob25ydW4uaApAQCAtMTI4LDYgKzEyOCw3IEBACiBQeUFQSV9GVU5DKGludCkgX1B5TG9uZ19Jbml0KHZvaWQpOwogUHlBUElfRlVOQyh2b2lkKSBfUHlGbG9hdF9Jbml0KHZvaWQpOwogUHlBUElfRlVOQyhpbnQpIFB5Qnl0ZUFycmF5X0luaXQodm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIF9QeVJhbmRvbV9Jbml0KHZvaWQpOwogCiAvKiBWYXJpb3VzIGludGVybmFsIGZpbmFsaXplcnMgKi8KIFB5QVBJX0ZVTkModm9pZCkgX1B5RXhjX0Zpbmkodm9pZCk7CkBAIC0xNDUsNiArMTQ2LDggQEAKIFB5QVBJX0ZVTkModm9pZCkgUHlPU19GaW5pSW50ZXJydXB0cyh2b2lkKTsKIFB5QVBJX0ZVTkModm9pZCkgUHlCeXRlQXJyYXlfRmluaSh2b2lkKTsKIAorUHlBUElfREFUQShQeVRocmVhZFN0YXRlICopIF9QeV9GaW5hbGl6aW5nOworCiAvKiBTdHVmZiB3aXRoIG5vIHByb3BlciBob21lICh5ZXQpICovCiBQeUFQSV9GVU5DKGNoYXIgKikgUHlPU19SZWFkbGluZShGSUxFICosIEZJTEUgKiwgY2hhciAqKTsKIFB5QVBJX0RBVEEoaW50KSAoKlB5T1NfSW5wdXRIb29rKSh2b2lkKTsKQEAgLTE3MSw2ICsxNzQsOCBAQAogUHlBUElfRlVOQyhQeU9TX3NpZ2hhbmRsZXJfdCkgUHlPU19nZXRzaWcoaW50KTsKIFB5QVBJX0ZVTkMoUHlPU19zaWdoYW5kbGVyX3QpIFB5T1Nfc2V0c2lnKGludCwgUHlPU19zaWdoYW5kbGVyX3QpOwogCisvKiBSYW5kb20gKi8KK1B5QVBJX0ZVTkMoaW50KSBfUHlPU19VUmFuZG9tICh2b2lkICpidWZmZXIsIFB5X3NzaXplX3Qgc2l6ZSk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9zeXNtb2R1bGUuaCBiL0luY2x1ZGUvc3lzbW9kdWxlLmgKaW5kZXggMTZhZjExOS4uYmY5NjJiNSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9zeXNtb2R1bGUuaAorKysgYi9JbmNsdWRlL3N5c21vZHVsZS5oCkBAIC0xOSw5ICsxOSw2IEBACiBQeUFQSV9GVU5DKHZvaWQpIFB5U3lzX1dyaXRlU3RkZXJyKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogCQkJUHlfR0NDX0FUVFJJQlVURSgoZm9ybWF0KHByaW50ZiwgMSwgMikpKTsKIAotUHlBUElfREFUQShQeU9iamVjdCAqKSBfUHlTeXNfVHJhY2VGdW5jLCAqX1B5U3lzX1Byb2ZpbGVGdW5jOwotUHlBUElfREFUQShpbnQpIF9QeVN5c19DaGVja0ludGVydmFsOwotCiBQeUFQSV9GVU5DKHZvaWQpIFB5U3lzX1Jlc2V0V2Fybk9wdGlvbnModm9pZCk7CiBQeUFQSV9GVU5DKHZvaWQpIFB5U3lzX0FkZFdhcm5PcHRpb24oY2hhciAqKTsKIFB5QVBJX0ZVTkMoaW50KSBQeVN5c19IYXNXYXJuT3B0aW9ucyh2b2lkKTsKZGlmZiAtLWdpdCBhL0luY2x1ZGUvdGltZWZ1bmNzLmggYi9JbmNsdWRlL3RpbWVmdW5jcy5oCmluZGV4IDU1MzE0MmQuLmE5ZDI2YTcgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvdGltZWZ1bmNzLmgKKysrIGIvSW5jbHVkZS90aW1lZnVuY3MuaApAQCAtMTYsNiArMTYsOSBAQAogICovCiBQeUFQSV9GVU5DKHRpbWVfdCkgX1B5VGltZV9Eb3VibGVUb1RpbWV0KGRvdWJsZSB4KTsKIAorLyogR2V0IHRoZSBjdXJyZW50IHRpbWUgc2luY2UgdGhlIGVwb2NoIGluIHNlY29uZHMgKi8KK1B5QVBJX0ZVTkMoZG91YmxlKSBfUHlUaW1lX0Zsb2F0VGltZSh2b2lkKTsKKwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL0luY2x1ZGUvd2Vha3JlZm9iamVjdC5oIGIvSW5jbHVkZS93ZWFrcmVmb2JqZWN0LmgKaW5kZXggZjE1YzlkOWMuLmU3YzBlYWUgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvd2Vha3JlZm9iamVjdC5oCisrKyBiL0luY2x1ZGUvd2Vha3JlZm9iamVjdC5oCkBAIC00OSw5ICs0OSw2IEBACiAgICAgICAgICgoUHlfVFlQRShvcCkgPT0gJl9QeVdlYWtyZWZfUHJveHlUeXBlKSB8fCBcCiAgICAgICAgICAoUHlfVFlQRShvcCkgPT0gJl9QeVdlYWtyZWZfQ2FsbGFibGVQcm94eVR5cGUpKQogCi0vKiBUaGlzIG1hY3JvIGNhbGxzIFB5V2Vha3JlZl9DaGVja1JlZigpIGxhc3Qgc2luY2UgdGhhdCBjYW4gaW52b2x2ZSBhCi0gICBmdW5jdGlvbiBjYWxsOyB0aGlzIG1ha2VzIGl0IG1vcmUgbGlrZWx5IHRoYXQgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgIHdpbGwgYmUgYXZvaWRlZC4gKi8KICNkZWZpbmUgUHlXZWFrcmVmX0NoZWNrKG9wKSBcCiAgICAgICAgIChQeVdlYWtyZWZfQ2hlY2tSZWYob3ApIHx8IFB5V2Vha3JlZl9DaGVja1Byb3h5KG9wKSkKIApAQCAtNjYsNyArNjMsMTcgQEAKIAogUHlBUElfRlVOQyh2b2lkKSBfUHlXZWFrcmVmX0NsZWFyUmVmKFB5V2Vha1JlZmVyZW5jZSAqc2VsZik7CiAKLSNkZWZpbmUgUHlXZWFrcmVmX0dFVF9PQkpFQ1QocmVmKSAoKChQeVdlYWtSZWZlcmVuY2UgKikocmVmKSktPndyX29iamVjdCkKKy8qIEV4cGxhbmF0aW9uIGZvciB0aGUgUHlfUkVGQ05UKCkgY2hlY2s6IHdoZW4gYSB3ZWFrcmVmJ3MgdGFyZ2V0IGlzIHBhcnQKKyAgIG9mIGEgbG9uZyBjaGFpbiBvZiBkZWFsbG9jYXRpb25zIHdoaWNoIHRyaWdnZXJzIHRoZSB0cmFzaGNhbiBtZWNoYW5pc20sCisgICBjbGVhcmluZyB0aGUgd2Vha3JlZnMgY2FuIGJlIGRlbGF5ZWQgbG9uZyBhZnRlciB0aGUgdGFyZ2V0J3MgcmVmY291bnQKKyAgIGhhcyBkcm9wcGVkIHRvIHplcm8uICBJbiB0aGUgbWVhbnRpbWUsIGNvZGUgYWNjZXNzaW5nIHRoZSB3ZWFrcmVmIHdpbGwKKyAgIGJlIGFibGUgdG8gInNlZSIgdGhlIHRhcmdldCBvYmplY3QgZXZlbiB0aG91Z2ggaXQgaXMgc3VwcG9zZWQgdG8gYmUKKyAgIHVucmVhY2hhYmxlLiAgU2VlIGlzc3VlICMxNjYwMi4gKi8KKworI2RlZmluZSBQeVdlYWtyZWZfR0VUX09CSkVDVChyZWYpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChQeV9SRUZDTlQoKChQeVdlYWtSZWZlcmVuY2UgKikocmVmKSktPndyX29iamVjdCkgPiAwICAgXAorICAgICA/ICgoUHlXZWFrUmVmZXJlbmNlICopKHJlZikpLT53cl9vYmplY3QgICAgICAgICAgICAgICAgXAorICAgICA6IFB5X05vbmUpCiAKIAogI2lmZGVmIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS9MSUNFTlNFIGIvTElDRU5TRQppbmRleCA1Y2RiMDFlLi5mOWNhMmM5IDEwMDY0NAotLS0gYS9MSUNFTlNFCisrKyBiL0xJQ0VOU0UKQEAgLTM2LDM0ICszNiw5IEBACiAgICAgMi4xICAgICAgICAgICAgIDIuMCsxLjYuMSAgIDIwMDEgICAgICAgIFBTRiAgICAgICAgIG5vCiAgICAgMi4wLjEgICAgICAgICAgIDIuMCsxLjYuMSAgIDIwMDEgICAgICAgIFBTRiAgICAgICAgIHllcwogICAgIDIuMS4xICAgICAgICAgICAyLjErMi4wLjEgICAyMDAxICAgICAgICBQU0YgICAgICAgICB5ZXMKLSAgICAyLjIgICAgICAgICAgICAgMi4xLjEgICAgICAgMjAwMSAgICAgICAgUFNGICAgICAgICAgeWVzCiAgICAgMi4xLjIgICAgICAgICAgIDIuMS4xICAgICAgIDIwMDIgICAgICAgIFBTRiAgICAgICAgIHllcwogICAgIDIuMS4zICAgICAgICAgICAyLjEuMiAgICAgICAyMDAyICAgICAgICBQU0YgICAgICAgICB5ZXMKLSAgICAyLjIuMSAgICAgICAgICAgMi4yICAgICAgICAgMjAwMiAgICAgICAgUFNGICAgICAgICAgeWVzCi0gICAgMi4yLjIgICAgICAgICAgIDIuMi4xICAgICAgIDIwMDIgICAgICAgIFBTRiAgICAgICAgIHllcwotICAgIDIuMi4zICAgICAgICAgICAyLjIuMiAgICAgICAyMDAzICAgICAgICBQU0YgICAgICAgICB5ZXMKLSAgICAyLjMgICAgICAgICAgICAgMi4yLjIgICAgICAgMjAwMi0yMDAzICAgUFNGICAgICAgICAgeWVzCi0gICAgMi4zLjEgICAgICAgICAgIDIuMyAgICAgICAgIDIwMDItMjAwMyAgIFBTRiAgICAgICAgIHllcwotICAgIDIuMy4yICAgICAgICAgICAyLjMuMSAgICAgICAyMDAyLTIwMDMgICBQU0YgICAgICAgICB5ZXMKLSAgICAyLjMuMyAgICAgICAgICAgMi4zLjIgICAgICAgMjAwMi0yMDAzICAgUFNGICAgICAgICAgeWVzCi0gICAgMi4zLjQgICAgICAgICAgIDIuMy4zICAgICAgIDIwMDQgICAgICAgIFBTRiAgICAgICAgIHllcwotICAgIDIuMy41ICAgICAgICAgICAyLjMuNCAgICAgICAyMDA1ICAgICAgICBQU0YgICAgICAgICB5ZXMKLSAgICAyLjQgICAgICAgICAgICAgMi4zICAgICAgICAgMjAwNCAgICAgICAgUFNGICAgICAgICAgeWVzCi0gICAgMi40LjEgICAgICAgICAgIDIuNCAgICAgICAgIDIwMDUgICAgICAgIFBTRiAgICAgICAgIHllcwotICAgIDIuNC4yICAgICAgICAgICAyLjQuMSAgICAgICAyMDA1ICAgICAgICBQU0YgICAgICAgICB5ZXMKLSAgICAyLjQuMyAgICAgICAgICAgMi40LjIgICAgICAgMjAwNiAgICAgICAgUFNGICAgICAgICAgeWVzCi0gICAgMi40LjQgICAgICAgICAgIDIuNC4zICAgICAgIDIwMDYgICAgICAgIFBTRiAgICAgICAgIHllcwotICAgIDIuNSAgICAgICAgICAgICAyLjQgICAgICAgICAyMDA2ICAgICAgICBQU0YgICAgICAgICB5ZXMKLSAgICAyLjUuMSAgICAgICAgICAgMi41ICAgICAgICAgMjAwNyAgICAgICAgUFNGICAgICAgICAgeWVzCi0gICAgMi41LjIgICAgICAgICAgIDIuNS4xICAgICAgIDIwMDggICAgICAgIFBTRiAgICAgICAgIHllcwotICAgIDIuNS4zICAgICAgICAgICAyLjUuMiAgICAgICAyMDA4ICAgICAgICBQU0YgICAgICAgICB5ZXMKLSAgICAyLjYgICAgICAgICAgICAgMi41ICAgICAgICAgMjAwOCAgICAgICAgUFNGICAgICAgICAgeWVzCi0gICAgMi42LjEgICAgICAgICAgIDIuNiAgICAgICAgIDIwMDggICAgICAgIFBTRiAgICAgICAgIHllcwotICAgIDIuNi4yICAgICAgICAgICAyLjYuMSAgICAgICAyMDA5ICAgICAgICBQU0YgICAgICAgICB5ZXMKLSAgICAyLjYuMyAgICAgICAgICAgMi42LjIgICAgICAgMjAwOSAgICAgICAgUFNGICAgICAgICAgeWVzCi0gICAgMi42LjQgICAgICAgICAgIDIuNi4zICAgICAgIDIwMDkgICAgICAgIFBTRiAgICAgICAgIHllcwotICAgIDIuNi41ICAgICAgICAgICAyLjYuNCAgICAgICAyMDEwICAgICAgICBQU0YgICAgICAgICB5ZXMKLSAgICAyLjcgICAgICAgICAgICAgMi42ICAgICAgICAgMjAxMCAgICAgICAgUFNGICAgICAgICAgeWVzCisgICAgMi4yIGFuZCBhYm92ZSAgIDIuMS4xICAgICAgIDIwMDEtbm93ICAgIFBTRiAgICAgICAgIHllcwogCiBGb290bm90ZXM6CiAKQEAgLTk4LDkgKzczLDkgQEAKIGFuYWx5emUsIHRlc3QsIHBlcmZvcm0gYW5kL29yIGRpc3BsYXkgcHVibGljbHksIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcywKIGRpc3RyaWJ1dGUsIGFuZCBvdGhlcndpc2UgdXNlIFB5dGhvbiBhbG9uZSBvciBpbiBhbnkgZGVyaXZhdGl2ZSB2ZXJzaW9uLAogcHJvdmlkZWQsIGhvd2V2ZXIsIHRoYXQgUFNGJ3MgTGljZW5zZSBBZ3JlZW1lbnQgYW5kIFBTRidzIG5vdGljZSBvZiBjb3B5cmlnaHQsCi1pLmUuLCAiQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCi1QeXRob24gU29mdHdhcmUgRm91bmRhdGlvbjsgQWxsIFJpZ2h0cyBSZXNlcnZlZCIgYXJlIHJldGFpbmVkIGluIFB5dGhvbiBhbG9uZSBvcgotaW4gYW55IGRlcml2YXRpdmUgdmVyc2lvbiBwcmVwYXJlZCBieSBMaWNlbnNlZS4KK2kuZS4sICJDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsCisyMDExLCAyMDEyLCAyMDEzLCAyMDE0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBBbGwgUmlnaHRzIFJlc2VydmVkIiBhcmUgcmV0YWluZWQKK2luIFB5dGhvbiBhbG9uZSBvciBpbiBhbnkgZGVyaXZhdGl2ZSB2ZXJzaW9uIHByZXBhcmVkIGJ5IExpY2Vuc2VlLgogCiAzLiBJbiB0aGUgZXZlbnQgTGljZW5zZWUgcHJlcGFyZXMgYSBkZXJpdmF0aXZlIHdvcmsgdGhhdCBpcyBiYXNlZCBvbgogb3IgaW5jb3Jwb3JhdGVzIFB5dGhvbiBvciBhbnkgcGFydCB0aGVyZW9mLCBhbmQgd2FudHMgdG8gbWFrZQpkaWZmIC0tZ2l0IGEvTGliL0Jhc2VIVFRQU2VydmVyLnB5IGIvTGliL0Jhc2VIVFRQU2VydmVyLnB5CmluZGV4IGRhMDQzMTUuLmRlYWYyZjkgMTAwNjQ0Ci0tLSBhL0xpYi9CYXNlSFRUUFNlcnZlci5weQorKysgYi9MaWIvQmFzZUhUVFBTZXJ2ZXIucHkKQEAgLTI0NCwxNCArMjQ0LDExIEBACiAgICAgICAgIHNlbGYucmVxdWVzdF92ZXJzaW9uID0gdmVyc2lvbiA9IHNlbGYuZGVmYXVsdF9yZXF1ZXN0X3ZlcnNpb24KICAgICAgICAgc2VsZi5jbG9zZV9jb25uZWN0aW9uID0gMQogICAgICAgICByZXF1ZXN0bGluZSA9IHNlbGYucmF3X3JlcXVlc3RsaW5lCi0gICAgICAgIGlmIHJlcXVlc3RsaW5lWy0yOl0gPT0gJ1xyXG4nOgotICAgICAgICAgICAgcmVxdWVzdGxpbmUgPSByZXF1ZXN0bGluZVs6LTJdCi0gICAgICAgIGVsaWYgcmVxdWVzdGxpbmVbLTE6XSA9PSAnXG4nOgotICAgICAgICAgICAgcmVxdWVzdGxpbmUgPSByZXF1ZXN0bGluZVs6LTFdCisgICAgICAgIHJlcXVlc3RsaW5lID0gcmVxdWVzdGxpbmUucnN0cmlwKCdcclxuJykKICAgICAgICAgc2VsZi5yZXF1ZXN0bGluZSA9IHJlcXVlc3RsaW5lCiAgICAgICAgIHdvcmRzID0gcmVxdWVzdGxpbmUuc3BsaXQoKQogICAgICAgICBpZiBsZW4od29yZHMpID09IDM6Ci0gICAgICAgICAgICBbY29tbWFuZCwgcGF0aCwgdmVyc2lvbl0gPSB3b3JkcworICAgICAgICAgICAgY29tbWFuZCwgcGF0aCwgdmVyc2lvbiA9IHdvcmRzCiAgICAgICAgICAgICBpZiB2ZXJzaW9uWzo1XSAhPSAnSFRUUC8nOgogICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9lcnJvcig0MDAsICJCYWQgcmVxdWVzdCB2ZXJzaW9uICglcikiICUgdmVyc2lvbikKICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKQEAgLTI3Nyw3ICsyNzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBIVFRQIFZlcnNpb24gKCVzKSIgJSBiYXNlX3ZlcnNpb25fbnVtYmVyKQogICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICBlbGlmIGxlbih3b3JkcykgPT0gMjoKLSAgICAgICAgICAgIFtjb21tYW5kLCBwYXRoXSA9IHdvcmRzCisgICAgICAgICAgICBjb21tYW5kLCBwYXRoID0gd29yZHMKICAgICAgICAgICAgIHNlbGYuY2xvc2VfY29ubmVjdGlvbiA9IDEKICAgICAgICAgICAgIGlmIGNvbW1hbmQgIT0gJ0dFVCc6CiAgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2Vycm9yKDQwMCwKQEAgLTQ1MCwxMyArNDQ3LDEzIEBACiAgICAgICAgIHNwZWNpZmllZCBhcyBzdWJzZXF1ZW50IGFyZ3VtZW50cyAoaXQncyBqdXN0IGxpa2UKICAgICAgICAgcHJpbnRmISkuCiAKLSAgICAgICAgVGhlIGNsaWVudCBob3N0IGFuZCBjdXJyZW50IGRhdGUvdGltZSBhcmUgcHJlZml4ZWQgdG8KLSAgICAgICAgZXZlcnkgbWVzc2FnZS4KKyAgICAgICAgVGhlIGNsaWVudCBpcCBhZGRyZXNzIGFuZCBjdXJyZW50IGRhdGUvdGltZSBhcmUgcHJlZml4ZWQgdG8gZXZlcnkKKyAgICAgICAgbWVzc2FnZS4KIAogICAgICAgICAiIiIKIAogICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCIlcyAtIC0gWyVzXSAlc1xuIiAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuYWRkcmVzc19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5jbGllbnRfYWRkcmVzc1swXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dfZGF0ZV90aW1lX3N0cmluZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQlYXJncykpCiAKZGlmZiAtLWdpdCBhL0xpYi9DR0lIVFRQU2VydmVyLnB5IGIvTGliL0NHSUhUVFBTZXJ2ZXIucHkKaW5kZXggMTNjYTBiNS4uOGY4YWU1NiAxMDA2NDQKLS0tIGEvTGliL0NHSUhUVFBTZXJ2ZXIucHkKKysrIGIvTGliL0NHSUhUVFBTZXJ2ZXIucHkKQEAgLTg0LDkgKzg0LDExIEBACiAgICAgICAgIHBhdGggYmVnaW5zIHdpdGggb25lIG9mIHRoZSBzdHJpbmdzIGluIHNlbGYuY2dpX2RpcmVjdG9yaWVzCiAgICAgICAgIChhbmQgdGhlIG5leHQgY2hhcmFjdGVyIGlzIGEgJy8nIG9yIHRoZSBlbmQgb2YgdGhlIHN0cmluZykuCiAgICAgICAgICIiIgotICAgICAgICBzcGxpdHBhdGggPSBfdXJsX2NvbGxhcHNlX3BhdGhfc3BsaXQoc2VsZi5wYXRoKQotICAgICAgICBpZiBzcGxpdHBhdGhbMF0gaW4gc2VsZi5jZ2lfZGlyZWN0b3JpZXM6Ci0gICAgICAgICAgICBzZWxmLmNnaV9pbmZvID0gc3BsaXRwYXRoCisgICAgICAgIGNvbGxhcHNlZF9wYXRoID0gX3VybF9jb2xsYXBzZV9wYXRoKHVybGxpYi51bnF1b3RlKHNlbGYucGF0aCkpCisgICAgICAgIGRpcl9zZXAgPSBjb2xsYXBzZWRfcGF0aC5maW5kKCcvJywgMSkKKyAgICAgICAgaGVhZCwgdGFpbCA9IGNvbGxhcHNlZF9wYXRoWzpkaXJfc2VwXSwgY29sbGFwc2VkX3BhdGhbZGlyX3NlcCsxOl0KKyAgICAgICAgaWYgaGVhZCBpbiBzZWxmLmNnaV9kaXJlY3RvcmllczoKKyAgICAgICAgICAgIHNlbGYuY2dpX2luZm8gPSBoZWFkLCB0YWlsCiAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICByZXR1cm4gRmFsc2UKIApAQCAtMTAzLDEwICsxMDUsOSBAQAogCiAgICAgZGVmIHJ1bl9jZ2koc2VsZik6CiAgICAgICAgICIiIkV4ZWN1dGUgYSBDR0kgc2NyaXB0LiIiIgotICAgICAgICBwYXRoID0gc2VsZi5wYXRoCiAgICAgICAgIGRpciwgcmVzdCA9IHNlbGYuY2dpX2luZm8KLQotICAgICAgICBpID0gcGF0aC5maW5kKCcvJywgbGVuKGRpcikgKyAxKQorICAgICAgICBwYXRoID0gZGlyICsgJy8nICsgcmVzdAorICAgICAgICBpID0gcGF0aC5maW5kKCcvJywgbGVuKGRpcikrMSkKICAgICAgICAgd2hpbGUgaSA+PSAwOgogICAgICAgICAgICAgbmV4dGRpciA9IHBhdGhbOmldCiAgICAgICAgICAgICBuZXh0cmVzdCA9IHBhdGhbaSsxOl0KQEAgLTExNCw3ICsxMTUsNyBAQAogICAgICAgICAgICAgc2NyaXB0ZGlyID0gc2VsZi50cmFuc2xhdGVfcGF0aChuZXh0ZGlyKQogICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihzY3JpcHRkaXIpOgogICAgICAgICAgICAgICAgIGRpciwgcmVzdCA9IG5leHRkaXIsIG5leHRyZXN0Ci0gICAgICAgICAgICAgICAgaSA9IHBhdGguZmluZCgnLycsIGxlbihkaXIpICsgMSkKKyAgICAgICAgICAgICAgICBpID0gcGF0aC5maW5kKCcvJywgbGVuKGRpcikrMSkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgYnJlYWsKIApAQCAtMjk4LDQ0ICsyOTksNDYgQEAKICAgICAgICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKCJDR0kgc2NyaXB0IGV4aXRlZCBPSyIpCiAKIAotIyBUT0RPKGdyZWdvcnkucC5zbWl0aCk6IE1vdmUgdGhpcyBpbnRvIGFuIGFwcHJvcHJpYXRlIGxpYnJhcnkuCi1kZWYgX3VybF9jb2xsYXBzZV9wYXRoX3NwbGl0KHBhdGgpOgorZGVmIF91cmxfY29sbGFwc2VfcGF0aChwYXRoKToKICAgICAiIiIKICAgICBHaXZlbiBhIFVSTCBwYXRoLCByZW1vdmUgZXh0cmEgJy8ncyBhbmQgJy4nIHBhdGggZWxlbWVudHMgYW5kIGNvbGxhcHNlCi0gICAgYW55ICcuLicgcmVmZXJlbmNlcy4KKyAgICBhbnkgJy4uJyByZWZlcmVuY2VzIGFuZCByZXR1cm5zIGEgY29sbGxhcHNlZCBwYXRoLgogCiAgICAgSW1wbGVtZW50cyBzb21ldGhpbmcgYWtpbiB0byBSRkMtMjM5NiA1LjIgc3RlcCA2IHRvIHBhcnNlIHJlbGF0aXZlIHBhdGhzLgorICAgIFRoZSB1dGlsaXR5IG9mIHRoaXMgZnVuY3Rpb24gaXMgbGltaXRlZCB0byBpc19jZ2kgbWV0aG9kIGFuZCBoZWxwcworICAgIHByZXZlbnRpbmcgc29tZSBzZWN1cml0eSBhdHRhY2tzLgogCiAgICAgUmV0dXJuczogQSB0dXBsZSBvZiAoaGVhZCwgdGFpbCkgd2hlcmUgdGFpbCBpcyBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaW5hbCAvCiAgICAgYW5kIGhlYWQgaXMgZXZlcnl0aGluZyBiZWZvcmUgaXQuICBIZWFkIHdpbGwgYWx3YXlzIHN0YXJ0IHdpdGggYSAnLycgYW5kLAogICAgIGlmIGl0IGNvbnRhaW5zIGFueXRoaW5nIGVsc2UsIG5ldmVyIGhhdmUgYSB0cmFpbGluZyAnLycuCiAKICAgICBSYWlzZXM6IEluZGV4RXJyb3IgaWYgdG9vIG1hbnkgJy4uJyBvY2N1ciB3aXRoaW4gdGhlIHBhdGguCisKICAgICAiIiIKICAgICAjIFNpbWlsYXIgdG8gb3MucGF0aC5zcGxpdChvcy5wYXRoLm5vcm1wYXRoKHBhdGgpKSBidXQgc3BlY2lmaWMgdG8gVVJMCiAgICAgIyBwYXRoIHNlbWFudGljcyByYXRoZXIgdGhhbiBsb2NhbCBvcGVyYXRpbmcgc3lzdGVtIHNlbWFudGljcy4KLSAgICBwYXRoX3BhcnRzID0gW10KLSAgICBmb3IgcGFydCBpbiBwYXRoLnNwbGl0KCcvJyk6Ci0gICAgICAgIGlmIHBhcnQgPT0gJy4nOgotICAgICAgICAgICAgcGF0aF9wYXJ0cy5hcHBlbmQoJycpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwYXRoX3BhcnRzLmFwcGVuZChwYXJ0KQotICAgICMgRmlsdGVyIG91dCBibGFuayBub24gdHJhaWxpbmcgcGFydHMgYmVmb3JlIGNvbnN1bWluZyB0aGUgJy4uJy4KLSAgICBwYXRoX3BhcnRzID0gW3BhcnQgZm9yIHBhcnQgaW4gcGF0aF9wYXJ0c1s6LTFdIGlmIHBhcnRdICsgcGF0aF9wYXJ0c1stMTpdCisgICAgcGF0aF9wYXJ0cyA9IHBhdGguc3BsaXQoJy8nKQorICAgIGhlYWRfcGFydHMgPSBbXQorICAgIGZvciBwYXJ0IGluIHBhdGhfcGFydHNbOi0xXToKKyAgICAgICAgaWYgcGFydCA9PSAnLi4nOgorICAgICAgICAgICAgaGVhZF9wYXJ0cy5wb3AoKSAjIEluZGV4RXJyb3IgaWYgbW9yZSAnLi4nIHRoYW4gcHJpb3IgcGFydHMKKyAgICAgICAgZWxpZiBwYXJ0IGFuZCBwYXJ0ICE9ICcuJzoKKyAgICAgICAgICAgIGhlYWRfcGFydHMuYXBwZW5kKCBwYXJ0ICkKICAgICBpZiBwYXRoX3BhcnRzOgogICAgICAgICB0YWlsX3BhcnQgPSBwYXRoX3BhcnRzLnBvcCgpCisgICAgICAgIGlmIHRhaWxfcGFydDoKKyAgICAgICAgICAgIGlmIHRhaWxfcGFydCA9PSAnLi4nOgorICAgICAgICAgICAgICAgIGhlYWRfcGFydHMucG9wKCkKKyAgICAgICAgICAgICAgICB0YWlsX3BhcnQgPSAnJworICAgICAgICAgICAgZWxpZiB0YWlsX3BhcnQgPT0gJy4nOgorICAgICAgICAgICAgICAgIHRhaWxfcGFydCA9ICcnCiAgICAgZWxzZToKICAgICAgICAgdGFpbF9wYXJ0ID0gJycKLSAgICBoZWFkX3BhcnRzID0gW10KLSAgICBmb3IgcGFydCBpbiBwYXRoX3BhcnRzOgotICAgICAgICBpZiBwYXJ0ID09ICcuLic6Ci0gICAgICAgICAgICBoZWFkX3BhcnRzLnBvcCgpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBoZWFkX3BhcnRzLmFwcGVuZChwYXJ0KQotICAgIGlmIHRhaWxfcGFydCBhbmQgdGFpbF9wYXJ0ID09ICcuLic6Ci0gICAgICAgIGhlYWRfcGFydHMucG9wKCkKLSAgICAgICAgdGFpbF9wYXJ0ID0gJycKLSAgICByZXR1cm4gKCcvJyArICcvJy5qb2luKGhlYWRfcGFydHMpLCB0YWlsX3BhcnQpCisKKyAgICBzcGxpdHBhdGggPSAoJy8nICsgJy8nLmpvaW4oaGVhZF9wYXJ0cyksIHRhaWxfcGFydCkKKyAgICBjb2xsYXBzZWRfcGF0aCA9ICIvIi5qb2luKHNwbGl0cGF0aCkKKworICAgIHJldHVybiBjb2xsYXBzZWRfcGF0aAogCiAKIG5vYm9keSA9IE5vbmUKZGlmZiAtLWdpdCBhL0xpYi9Db25maWdQYXJzZXIucHkgYi9MaWIvQ29uZmlnUGFyc2VyLnB5CmluZGV4IDk2M2E0MTguLjdlNmNkYmMgMTAwNjQ0Ci0tLSBhL0xpYi9Db25maWdQYXJzZXIucHkKKysrIGIvTGliL0NvbmZpZ1BhcnNlci5weQpAQCAtMTQyLDYgKzE0Miw3IEBACiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlY3Rpb24pOgogICAgICAgICBFcnJvci5fX2luaXRfXyhzZWxmLCAnTm8gc2VjdGlvbjogJXInICUgKHNlY3Rpb24sKSkKICAgICAgICAgc2VsZi5zZWN0aW9uID0gc2VjdGlvbgorICAgICAgICBzZWxmLmFyZ3MgPSAoc2VjdGlvbiwgKQogCiBjbGFzcyBEdXBsaWNhdGVTZWN0aW9uRXJyb3IoRXJyb3IpOgogICAgICIiIlJhaXNlZCB3aGVuIGEgc2VjdGlvbiBpcyBtdWx0aXBseS1jcmVhdGVkLiIiIgpAQCAtMTQ5LDYgKzE1MCw3IEBACiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlY3Rpb24pOgogICAgICAgICBFcnJvci5fX2luaXRfXyhzZWxmLCAiU2VjdGlvbiAlciBhbHJlYWR5IGV4aXN0cyIgJSBzZWN0aW9uKQogICAgICAgICBzZWxmLnNlY3Rpb24gPSBzZWN0aW9uCisgICAgICAgIHNlbGYuYXJncyA9IChzZWN0aW9uLCApCiAKIGNsYXNzIE5vT3B0aW9uRXJyb3IoRXJyb3IpOgogICAgICIiIkEgcmVxdWVzdGVkIG9wdGlvbiB3YXMgbm90IGZvdW5kLiIiIgpAQCAtMTU4LDYgKzE2MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb24sIHNlY3Rpb24pKQogICAgICAgICBzZWxmLm9wdGlvbiA9IG9wdGlvbgogICAgICAgICBzZWxmLnNlY3Rpb24gPSBzZWN0aW9uCisgICAgICAgIHNlbGYuYXJncyA9IChvcHRpb24sIHNlY3Rpb24pCiAKIGNsYXNzIEludGVycG9sYXRpb25FcnJvcihFcnJvcik6CiAgICAgIiIiQmFzZSBjbGFzcyBmb3IgaW50ZXJwb2xhdGlvbi1yZWxhdGVkIGV4Y2VwdGlvbnMuIiIiCkBAIC0xNjYsNiArMTY5LDcgQEAKICAgICAgICAgRXJyb3IuX19pbml0X18oc2VsZiwgbXNnKQogICAgICAgICBzZWxmLm9wdGlvbiA9IG9wdGlvbgogICAgICAgICBzZWxmLnNlY3Rpb24gPSBzZWN0aW9uCisgICAgICAgIHNlbGYuYXJncyA9IChvcHRpb24sIHNlY3Rpb24sIG1zZykKIAogY2xhc3MgSW50ZXJwb2xhdGlvbk1pc3NpbmdPcHRpb25FcnJvcihJbnRlcnBvbGF0aW9uRXJyb3IpOgogICAgICIiIkEgc3RyaW5nIHN1YnN0aXR1dGlvbiByZXF1aXJlZCBhIHNldHRpbmcgd2hpY2ggd2FzIG5vdCBhdmFpbGFibGUuIiIiCkBAIC0xNzksNiArMTgzLDcgQEAKICAgICAgICAgICAgICAgICUgKHNlY3Rpb24sIG9wdGlvbiwgcmVmZXJlbmNlLCByYXd2YWwpKQogICAgICAgICBJbnRlcnBvbGF0aW9uRXJyb3IuX19pbml0X18oc2VsZiwgb3B0aW9uLCBzZWN0aW9uLCBtc2cpCiAgICAgICAgIHNlbGYucmVmZXJlbmNlID0gcmVmZXJlbmNlCisgICAgICAgIHNlbGYuYXJncyA9IChvcHRpb24sIHNlY3Rpb24sIHJhd3ZhbCwgcmVmZXJlbmNlKQogCiBjbGFzcyBJbnRlcnBvbGF0aW9uU3ludGF4RXJyb3IoSW50ZXJwb2xhdGlvbkVycm9yKToKICAgICAiIiJSYWlzZWQgd2hlbiB0aGUgc291cmNlIHRleHQgaW50byB3aGljaCBzdWJzdGl0dXRpb25zIGFyZSBtYWRlCkBAIC0xOTQsNiArMTk5LDcgQEAKICAgICAgICAgICAgICAgICJcdHJhd3ZhbCA6ICVzXG4iCiAgICAgICAgICAgICAgICAlIChzZWN0aW9uLCBvcHRpb24sIHJhd3ZhbCkpCiAgICAgICAgIEludGVycG9sYXRpb25FcnJvci5fX2luaXRfXyhzZWxmLCBvcHRpb24sIHNlY3Rpb24sIG1zZykKKyAgICAgICAgc2VsZi5hcmdzID0gKG9wdGlvbiwgc2VjdGlvbiwgcmF3dmFsKQogCiBjbGFzcyBQYXJzaW5nRXJyb3IoRXJyb3IpOgogICAgICIiIlJhaXNlZCB3aGVuIGEgY29uZmlndXJhdGlvbiBmaWxlIGRvZXMgbm90IGZvbGxvdyBsZWdhbCBzeW50YXguIiIiCkBAIC0yMDIsNiArMjA4LDcgQEAKICAgICAgICAgRXJyb3IuX19pbml0X18oc2VsZiwgJ0ZpbGUgY29udGFpbnMgcGFyc2luZyBlcnJvcnM6ICVzJyAlIGZpbGVuYW1lKQogICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKICAgICAgICAgc2VsZi5lcnJvcnMgPSBbXQorICAgICAgICBzZWxmLmFyZ3MgPSAoZmlsZW5hbWUsICkKIAogICAgIGRlZiBhcHBlbmQoc2VsZiwgbGluZW5vLCBsaW5lKToKICAgICAgICAgc2VsZi5lcnJvcnMuYXBwZW5kKChsaW5lbm8sIGxpbmUpKQpAQCAtMjE4LDYgKzIyNSw3IEBACiAgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQogICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubwogICAgICAgICBzZWxmLmxpbmUgPSBsaW5lCisgICAgICAgIHNlbGYuYXJncyA9IChmaWxlbmFtZSwgbGluZW5vLCBsaW5lKQogCiAKIGNsYXNzIFJhd0NvbmZpZ1BhcnNlcjoKZGlmZiAtLWdpdCBhL0xpYi9Db29raWUucHkgYi9MaWIvQ29va2llLnB5CmluZGV4IDMyMzQ1MGIuLmE1MjM5Y2EgMTAwNjQ0Ci0tLSBhL0xpYi9Db29raWUucHkKKysrIGIvTGliL0Nvb2tpZS5weQpAQCAtMSw2ICsxLDMgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotIwotCiAjIyMjCiAjIENvcHlyaWdodCAyMDAwIGJ5IFRpbW90aHkgTydNYWxsZXkgPHRpbW9AYWx1bS5taXQuZWR1PgogIwpAQCAtNTksNyArNTYsNyBAQAogICAgPj4+IEMgPSBDb29raWUuU21hcnRDb29raWUoKQogCiBbTm90ZTogTG9uZy10aW1lIHVzZXJzIG9mIENvb2tpZS5weSB3aWxsIHJlbWVtYmVyIHVzaW5nCi1Db29raWUuQ29va2llKCkgdG8gY3JlYXRlIGFuIENvb2tpZSBvYmplY3QuICBBbHRob3VnaCBkZXByZWNhdGVkLCBpdAorQ29va2llLkNvb2tpZSgpIHRvIGNyZWF0ZSBhIENvb2tpZSBvYmplY3QuICBBbHRob3VnaCBkZXByZWNhdGVkLCBpdAogaXMgc3RpbGwgc3VwcG9ydGVkIGJ5IHRoZSBjb2RlLiAgU2VlIHRoZSBCYWNrd2FyZCBDb21wYXRpYmlsaXR5IG5vdGVzCiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5dCiAKQEAgLTIzOCw3ICsyMzUsNyBAQAogIyBhIHR3by13YXkgcXVvdGluZyBhbGdvcml0aG0uICBBbnkgbm9uLXRleHQgY2hhcmFjdGVyIGlzIHRyYW5zbGF0ZWQKICMgaW50byBhIDQgY2hhcmFjdGVyIHNlcXVlbmNlOiBhIGZvcndhcmQtc2xhc2ggZm9sbG93ZWQgYnkgdGhlCiAjIHRocmVlLWRpZ2l0IG9jdGFsIGVxdWl2YWxlbnQgb2YgdGhlIGNoYXJhY3Rlci4gIEFueSAnXCcgb3IgJyInIGlzCi0jIHF1b3RlZCB3aXRoIGEgcHJlY2VlZGluZyAnXCcgc2xhc2guCisjIHF1b3RlZCB3aXRoIGEgcHJlY2VkaW5nICdcJyBzbGFzaC4KICMKICMgVGhlc2UgYXJlIHRha2VuIGZyb20gUkZDMjA2OCBhbmQgUkZDMjEwOS4KICMgICAgICAgX0xlZ2FsQ2hhcnMgICAgICAgaXMgdGhlIGxpc3Qgb2YgY2hhcnMgd2hpY2ggZG9uJ3QgcmVxdWlyZSAiJ3MKQEAgLTM5MCw3ICszODcsNyBAQAogICAgIGZyb20gdGltZSBpbXBvcnQgZ210aW1lLCB0aW1lCiAgICAgbm93ID0gdGltZSgpCiAgICAgeWVhciwgbW9udGgsIGRheSwgaGgsIG1tLCBzcywgd2QsIHksIHogPSBnbXRpbWUobm93ICsgZnV0dXJlKQotICAgIHJldHVybiAiJXMsICUwMmQtJTNzLSU0ZCAlMDJkOiUwMmQ6JTAyZCBHTVQiICUgXAorICAgIHJldHVybiAiJXMsICUwMmQgJTNzICU0ZCAlMDJkOiUwMmQ6JTAyZCBHTVQiICUgXAogICAgICAgICAgICAod2Vla2RheW5hbWVbd2RdLCBkYXksIG1vbnRobmFtZVttb250aF0sIHllYXIsIGhoLCBtbSwgc3MpCiAKIApAQCAtNDI5LDYgKzQyNiw4IEBACiAgICAgICAgICAgICAgICAgICAgInZlcnNpb24iIDogIlZlcnNpb24iLAogICAgICAgICAgICAgICAgICAgIH0KIAorICAgIF9mbGFncyA9IHsnc2VjdXJlJywgJ2h0dHBvbmx5J30KKwogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgIyBTZXQgZGVmYXVsdHMKICAgICAgICAgc2VsZi5rZXkgPSBzZWxmLnZhbHVlID0gc2VsZi5jb2RlZF92YWx1ZSA9IE5vbmUKQEAgLTUzNSwxNSArNTM0LDE4IEBACiAgICAgciIoP1A8a2V5PiIgICAgICAgICAgICAgICAgICAgIyBTdGFydCBvZiBncm91cCAna2V5JwogICAgICIiKyBfTGVnYWxDaGFyc1BhdHQgKyIrPyIgICAgICMgQW55IHdvcmQgb2YgYXQgbGVhc3Qgb25lIGxldHRlciwgbm9uZ3JlZWR5CiAgICAgciIpIiAgICAgICAgICAgICAgICAgICAgICAgICAgIyBFbmQgb2YgZ3JvdXAgJ2tleScKKyAgICByIigiICAgICAgICAgICAgICAgICAgICAgICAgICAjIE9wdGlvbmFsIGdyb3VwOiB0aGVyZSBtYXkgbm90IGJlIGEgdmFsdWUuCiAgICAgciJccyo9XHMqIiAgICAgICAgICAgICAgICAgICAgIyBFcXVhbCBTaWduCiAgICAgciIoP1A8dmFsPiIgICAgICAgICAgICAgICAgICAgIyBTdGFydCBvZiBncm91cCAndmFsJwogICAgIHInIig/OlteXFwiXXxcXC4pKiInICAgICAgICAgICAgIyBBbnkgZG91YmxlcXVvdGVkIHN0cmluZwogICAgIHIifCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcgotICAgIHIiXHd7M30sXHNbXHdcZC1dezksMTF9XHNbXGQ6XXs4fVxzR01UIiAjIFNwZWNpYWwgY2FzZSBmb3IgImV4cGlyZXMiIGF0dHIKKyAgICByIlx3ezN9LFxzW1xzXHdcZC1dezksMTF9XHNbXGQ6XXs4fVxzR01UIiAjIFNwZWNpYWwgY2FzZSBmb3IgImV4cGlyZXMiIGF0dHIKICAgICByInwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3IKICAgICAiIisgX0xlZ2FsQ2hhcnNQYXR0ICsiKiIgICAgICAgICMgQW55IHdvcmQgb3IgZW1wdHkgc3RyaW5nCiAgICAgciIpIiAgICAgICAgICAgICAgICAgICAgICAgICAgIyBFbmQgb2YgZ3JvdXAgJ3ZhbCcKLSAgICByIlxzKjs/IiAgICAgICAgICAgICAgICAgICAgICAjIFByb2JhYmx5IGVuZGluZyBpbiBhIHNlbWktY29sb24KKyAgICByIik/IiAgICAgICAgICAgICAgICAgICAgICAgICAjIEVuZCBvZiBvcHRpb25hbCB2YWx1ZSBncm91cAorICAgIHIiXHMqIiAgICAgICAgICAgICAgICAgICAgICAgICMgQW55IG51bWJlciBvZiBzcGFjZXMuCisgICAgciIoXHMrfDt8JCkiICAgICAgICAgICAgICAgICAgIyBFbmRpbmcgZWl0aGVyIGF0IHNwYWNlLCBzZW1pY29sb24sIG9yIEVPUy4KICAgICApCiAKIApAQCAtNjU5LDggKzY2MSwxMiBAQAogICAgICAgICAgICAgICAgICAgICBNWyBLWzE6XSBdID0gVgogICAgICAgICAgICAgZWxpZiBLLmxvd2VyKCkgaW4gTW9yc2VsLl9yZXNlcnZlZDoKICAgICAgICAgICAgICAgICBpZiBNOgotICAgICAgICAgICAgICAgICAgICBNWyBLIF0gPSBfdW5xdW90ZShWKQotICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgViBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgSy5sb3dlcigpIGluIE1vcnNlbC5fZmxhZ3M6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVtLXSA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIE1bS10gPSBfdW5xdW90ZShWKQorICAgICAgICAgICAgZWxpZiBWIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIHJ2YWwsIGN2YWwgPSBzZWxmLnZhbHVlX2RlY29kZShWKQogICAgICAgICAgICAgICAgIHNlbGYuX19zZXQoSywgcnZhbCwgY3ZhbCkKICAgICAgICAgICAgICAgICBNID0gc2VsZltLXQpkaWZmIC0tZ2l0IGEvTGliL0hUTUxQYXJzZXIucHkgYi9MaWIvSFRNTFBhcnNlci5weQppbmRleCAxYzY5ODllLi4zZjk3ODMwIDEwMDY0NAotLS0gYS9MaWIvSFRNTFBhcnNlci5weQorKysgYi9MaWIvSFRNTFBhcnNlci5weQpAQCAtMjIsMjIgKzIyLDI4IEBACiBzdGFydHRhZ29wZW4gPSByZS5jb21waWxlKCc8W2EtekEtWl0nKQogcGljbG9zZSA9IHJlLmNvbXBpbGUoJz4nKQogY29tbWVudGNsb3NlID0gcmUuY29tcGlsZShyJy0tXHMqPicpCi10YWdmaW5kID0gcmUuY29tcGlsZSgnW2EtekEtWl1bLS5hLXpBLVowLTk6X10qJykKKworIyBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDUvdG9rZW5pemF0aW9uLmh0bWwjdGFnLW9wZW4tc3RhdGUKKyMgYW5kIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L3Rva2VuaXphdGlvbi5odG1sI3RhZy1uYW1lLXN0YXRlCisjIG5vdGU6IGlmIHlvdSBjaGFuZ2UgdGFnZmluZC9hdHRyZmluZCByZW1lbWJlciB0byB1cGRhdGUgbG9jYXRlc3RhcnR0YWdlbmQgdG9vCit0YWdmaW5kID0gcmUuY29tcGlsZSgnKFthLXpBLVpdW15cdFxuXHJcZiAvPlx4MDBdKikoPzpcc3wvKD8hPikpKicpCisjIHRoaXMgcmVnZXggaXMgY3VycmVudGx5IHVudXNlZCwgYnV0IGxlZnQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKK3RhZ2ZpbmRfdG9sZXJhbnQgPSByZS5jb21waWxlKCdbYS16QS1aXVteXHRcblxyXGYgLz5ceDAwXSonKQogCiBhdHRyZmluZCA9IHJlLmNvbXBpbGUoCi0gICAgcidccyooKD88PVtcJyJcc10pW15ccy8+XVteXHMvPT5dKikoXHMqPStccyonCi0gICAgcicoXCdbXlwnXSpcJ3wiW14iXSoifCg/IVtcJyJdKVtePlxzXSopKT8nKQorICAgIHInKCg/PD1bXCciXHMvXSlbXlxzLz5dW15ccy89Pl0qKShccyo9K1xzKicKKyAgICByJyhcJ1teXCddKlwnfCJbXiJdKiJ8KD8hW1wnIl0pW14+XHNdKikpPyg/OlxzfC8oPyE+KSkqJykKIAogbG9jYXRlc3RhcnR0YWdlbmQgPSByZS5jb21waWxlKHIiIiIKLSAgPFthLXpBLVpdWy0uYS16QS1aMC05Ol9dKiAgICAgICAgICAjIHRhZyBuYW1lCi0gICg/OlxzKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3aGl0ZXNwYWNlIGJlZm9yZSBhdHRyaWJ1dGUgbmFtZQotICAgICg/Oig/PD1bJyJcc10pW15ccy8+XVteXHMvPT5dKiAgICMgYXR0cmlidXRlIG5hbWUKKyAgPFthLXpBLVpdW15cdFxuXHJcZiAvPlx4MDBdKiAgICAgICAjIHRhZyBuYW1lCisgICg/Oltccy9dKiAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCB3aGl0ZXNwYWNlIGJlZm9yZSBhdHRyaWJ1dGUgbmFtZQorICAgICg/Oig/PD1bJyJccy9dKVteXHMvPl1bXlxzLz0+XSogICMgYXR0cmlidXRlIG5hbWUKICAgICAgICg/OlxzKj0rXHMqICAgICAgICAgICAgICAgICAgICAjIHZhbHVlIGluZGljYXRvcgogICAgICAgICAoPzonW14nXSonICAgICAgICAgICAgICAgICAgICMgTElUQS1lbmNsb3NlZCB2YWx1ZQogICAgICAgICAgIHwiW14iXSoiICAgICAgICAgICAgICAgICAgICMgTElULWVuY2xvc2VkIHZhbHVlCiAgICAgICAgICAgfCg/IVsnIl0pW14+XHNdKiAgICAgICAgICAgIyBiYXJlIHZhbHVlCiAgICAgICAgICApCi0gICAgICAgKT9ccyoKKyAgICAgICApPyg/OlxzfC8oPyE+KSkqCiAgICAgICkqCiAgICApPwogICBccyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdHJhaWxpbmcgd2hpdGVzcGFjZQpAQCAtMTYwLDE2ICsxNjYsMjMgQEAKICAgICAgICAgICAgICAgICBlbGlmIHN0YXJ0c3dpdGgoIjw/IiwgaSk6CiAgICAgICAgICAgICAgICAgICAgIGsgPSBzZWxmLnBhcnNlX3BpKGkpCiAgICAgICAgICAgICAgICAgZWxpZiBzdGFydHN3aXRoKCI8ISIsIGkpOgotICAgICAgICAgICAgICAgICAgICBrID0gc2VsZi5wYXJzZV9kZWNsYXJhdGlvbihpKQorICAgICAgICAgICAgICAgICAgICBrID0gc2VsZi5wYXJzZV9odG1sX2RlY2xhcmF0aW9uKGkpCiAgICAgICAgICAgICAgICAgZWxpZiAoaSArIDEpIDwgbjoKICAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGF0YSgiPCIpCiAgICAgICAgICAgICAgICAgICAgIGsgPSBpICsgMQogICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgaWYgayA8IDA6Ci0gICAgICAgICAgICAgICAgICAgIGlmIGVuZDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IoIkVPRiBpbiBtaWRkbGUgb2YgY29uc3RydWN0IikKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGVuZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGsgPSByYXdkYXRhLmZpbmQoJz4nLCBpICsgMSkKKyAgICAgICAgICAgICAgICAgICAgaWYgayA8IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBrID0gcmF3ZGF0YS5maW5kKCc8JywgaSArIDEpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBrIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrID0gaSArIDEKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGsgKz0gMQorICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKHJhd2RhdGFbaTprXSkKICAgICAgICAgICAgICAgICBpID0gc2VsZi51cGRhdGVwb3MoaSwgaykKICAgICAgICAgICAgIGVsaWYgc3RhcnRzd2l0aCgiJiMiLCBpKToKICAgICAgICAgICAgICAgICBtYXRjaCA9IGNoYXJyZWYubWF0Y2gocmF3ZGF0YSwgaSkKQEAgLTE4Miw5ICsxOTUsOSBAQAogICAgICAgICAgICAgICAgICAgICBpID0gc2VsZi51cGRhdGVwb3MoaSwgaykKICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBpZiAiOyIgaW4gcmF3ZGF0YVtpOl06ICNiYWlsIGJ5IGNvbnN1bWluZyAmIwotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGF0YShyYXdkYXRhWzA6Ml0pCi0gICAgICAgICAgICAgICAgICAgICAgICBpID0gc2VsZi51cGRhdGVwb3MoaSwgMikKKyAgICAgICAgICAgICAgICAgICAgaWYgIjsiIGluIHJhd2RhdGFbaTpdOiAgIyBiYWlsIGJ5IGNvbnN1bWluZyAnJiMnCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKHJhd2RhdGFbaTppKzJdKQorICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHNlbGYudXBkYXRlcG9zKGksIGkrMikKICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgIGVsaWYgc3RhcnRzd2l0aCgnJicsIGkpOgogICAgICAgICAgICAgICAgIG1hdGNoID0gZW50aXR5cmVmLm1hdGNoKHJhd2RhdGEsIGkpCkBAIC0yMTgsNiArMjMxLDQxIEBACiAgICAgICAgICAgICBpID0gc2VsZi51cGRhdGVwb3MoaSwgbikKICAgICAgICAgc2VsZi5yYXdkYXRhID0gcmF3ZGF0YVtpOl0KIAorICAgICMgSW50ZXJuYWwgLS0gcGFyc2UgaHRtbCBkZWNsYXJhdGlvbnMsIHJldHVybiBsZW5ndGggb3IgLTEgaWYgbm90IHRlcm1pbmF0ZWQKKyAgICAjIFNlZSB3My5vcmcvVFIvaHRtbDUvdG9rZW5pemF0aW9uLmh0bWwjbWFya3VwLWRlY2xhcmF0aW9uLW9wZW4tc3RhdGUKKyAgICAjIFNlZSBhbHNvIHBhcnNlX2RlY2xhcmF0aW9uIGluIF9tYXJrdXBiYXNlCisgICAgZGVmIHBhcnNlX2h0bWxfZGVjbGFyYXRpb24oc2VsZiwgaSk6CisgICAgICAgIHJhd2RhdGEgPSBzZWxmLnJhd2RhdGEKKyAgICAgICAgaWYgcmF3ZGF0YVtpOmkrMl0gIT0gJzwhJzoKKyAgICAgICAgICAgIHNlbGYuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FsbCB0byBwYXJzZV9odG1sX2RlY2xhcmF0aW9uKCknKQorICAgICAgICBpZiByYXdkYXRhW2k6aSs0XSA9PSAnPCEtLSc6CisgICAgICAgICAgICAjIHRoaXMgY2FzZSBpcyBhY3R1YWxseSBhbHJlYWR5IGhhbmRsZWQgaW4gZ29haGVhZCgpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZV9jb21tZW50KGkpCisgICAgICAgIGVsaWYgcmF3ZGF0YVtpOmkrM10gPT0gJzwhWyc6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZV9tYXJrZWRfc2VjdGlvbihpKQorICAgICAgICBlbGlmIHJhd2RhdGFbaTppKzldLmxvd2VyKCkgPT0gJzwhZG9jdHlwZSc6CisgICAgICAgICAgICAjIGZpbmQgdGhlIGNsb3NpbmcgPgorICAgICAgICAgICAgZ3Rwb3MgPSByYXdkYXRhLmZpbmQoJz4nLCBpKzkpCisgICAgICAgICAgICBpZiBndHBvcyA9PSAtMToKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RlY2wocmF3ZGF0YVtpKzI6Z3Rwb3NdKQorICAgICAgICAgICAgcmV0dXJuIGd0cG9zKzEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlX2JvZ3VzX2NvbW1lbnQoaSkKKworICAgICMgSW50ZXJuYWwgLS0gcGFyc2UgYm9ndXMgY29tbWVudCwgcmV0dXJuIGxlbmd0aCBvciAtMSBpZiBub3QgdGVybWluYXRlZAorICAgICMgc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L3Rva2VuaXphdGlvbi5odG1sI2JvZ3VzLWNvbW1lbnQtc3RhdGUKKyAgICBkZWYgcGFyc2VfYm9ndXNfY29tbWVudChzZWxmLCBpLCByZXBvcnQ9MSk6CisgICAgICAgIHJhd2RhdGEgPSBzZWxmLnJhd2RhdGEKKyAgICAgICAgaWYgcmF3ZGF0YVtpOmkrMl0gbm90IGluICgnPCEnLCAnPC8nKToKKyAgICAgICAgICAgIHNlbGYuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FsbCB0byBwYXJzZV9jb21tZW50KCknKQorICAgICAgICBwb3MgPSByYXdkYXRhLmZpbmQoJz4nLCBpKzIpCisgICAgICAgIGlmIHBvcyA9PSAtMToKKyAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICBpZiByZXBvcnQ6CisgICAgICAgICAgICBzZWxmLmhhbmRsZV9jb21tZW50KHJhd2RhdGFbaSsyOnBvc10pCisgICAgICAgIHJldHVybiBwb3MgKyAxCisKICAgICAjIEludGVybmFsIC0tIHBhcnNlIHByb2Nlc3NpbmcgaW5zdHIsIHJldHVybiBlbmQgb3IgLTEgaWYgbm90IHRlcm1pbmF0ZWQKICAgICBkZWYgcGFyc2VfcGkoc2VsZiwgaSk6CiAgICAgICAgIHJhd2RhdGEgPSBzZWxmLnJhd2RhdGEKQEAgLTI0NCw3ICsyOTIsNyBAQAogICAgICAgICBtYXRjaCA9IHRhZ2ZpbmQubWF0Y2gocmF3ZGF0YSwgaSsxKQogICAgICAgICBhc3NlcnQgbWF0Y2gsICd1bmV4cGVjdGVkIGNhbGwgdG8gcGFyc2Vfc3RhcnR0YWcoKScKICAgICAgICAgayA9IG1hdGNoLmVuZCgpCi0gICAgICAgIHNlbGYubGFzdHRhZyA9IHRhZyA9IHJhd2RhdGFbaSsxOmtdLmxvd2VyKCkKKyAgICAgICAgc2VsZi5sYXN0dGFnID0gdGFnID0gbWF0Y2guZ3JvdXAoMSkubG93ZXIoKQogCiAgICAgICAgIHdoaWxlIGsgPCBlbmRwb3M6CiAgICAgICAgICAgICBtID0gYXR0cmZpbmQubWF0Y2gocmF3ZGF0YSwgaykKQEAgLTI3MCw4ICszMTgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIC0gc2VsZi5fX3N0YXJ0dGFnX3RleHQucmZpbmQoIlxuIikKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgbGVuKHNlbGYuX19zdGFydHRhZ190ZXh0KQotICAgICAgICAgICAgc2VsZi5lcnJvcigianVuayBjaGFyYWN0ZXJzIGluIHN0YXJ0IHRhZzogJXIiCi0gICAgICAgICAgICAgICAgICAgICAgICUgKHJhd2RhdGFbazplbmRwb3NdWzoyMF0sKSkKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEocmF3ZGF0YVtpOmVuZHBvc10pCisgICAgICAgICAgICByZXR1cm4gZW5kcG9zCiAgICAgICAgIGlmIGVuZC5lbmRzd2l0aCgnLz4nKToKICAgICAgICAgICAgICMgWEhUTUwtc3R5bGUgZW1wdHkgdGFnOiA8c3BhbiBhdHRyPSJ2YWx1ZSIgLz4KICAgICAgICAgICAgIHNlbGYuaGFuZGxlX3N0YXJ0ZW5kdGFnKHRhZywgYXR0cnMpCkBAIC0zMDgsOCArMzU2LDEwIEBACiAgICAgICAgICAgICAgICAgIyBlbmQgb2YgaW5wdXQgaW4gb3IgYmVmb3JlIGF0dHJpYnV0ZSB2YWx1ZSwgb3Igd2UgaGF2ZSB0aGUKICAgICAgICAgICAgICAgICAjICcvJyBmcm9tIGEgJy8+JyBlbmRpbmcKICAgICAgICAgICAgICAgICByZXR1cm4gLTEKLSAgICAgICAgICAgIHNlbGYudXBkYXRlcG9zKGksIGopCi0gICAgICAgICAgICBzZWxmLmVycm9yKCJtYWxmb3JtZWQgc3RhcnQgdGFnIikKKyAgICAgICAgICAgIGlmIGogPiBpOgorICAgICAgICAgICAgICAgIHJldHVybiBqCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBpICsgMQogICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigid2Ugc2hvdWxkIG5vdCBnZXQgaGVyZSEiKQogCiAgICAgIyBJbnRlcm5hbCAtLSBwYXJzZSBlbmR0YWcsIHJldHVybiBlbmQgb3IgLTEgaWYgaW5jb21wbGV0ZQpAQCAtMzE5LDIzICszNjksMzggQEAKICAgICAgICAgbWF0Y2ggPSBlbmRlbmR0YWcuc2VhcmNoKHJhd2RhdGEsIGkrMSkgIyA+CiAgICAgICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICAgICAgIHJldHVybiAtMQotICAgICAgICBqID0gbWF0Y2guZW5kKCkKKyAgICAgICAgZ3Rwb3MgPSBtYXRjaC5lbmQoKQogICAgICAgICBtYXRjaCA9IGVuZHRhZ2ZpbmQubWF0Y2gocmF3ZGF0YSwgaSkgIyA8LyArIHRhZyArID4KICAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICAgaWYgc2VsZi5jZGF0YV9lbGVtIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEocmF3ZGF0YVtpOmpdKQotICAgICAgICAgICAgICAgIHJldHVybiBqCi0gICAgICAgICAgICBzZWxmLmVycm9yKCJiYWQgZW5kIHRhZzogJXIiICUgKHJhd2RhdGFbaTpqXSwpKQorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEocmF3ZGF0YVtpOmd0cG9zXSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZ3Rwb3MKKyAgICAgICAgICAgICMgZmluZCB0aGUgbmFtZTogdzMub3JnL1RSL2h0bWw1L3Rva2VuaXphdGlvbi5odG1sI3RhZy1uYW1lLXN0YXRlCisgICAgICAgICAgICBuYW1lbWF0Y2ggPSB0YWdmaW5kLm1hdGNoKHJhd2RhdGEsIGkrMikKKyAgICAgICAgICAgIGlmIG5vdCBuYW1lbWF0Y2g6CisgICAgICAgICAgICAgICAgIyB3My5vcmcvVFIvaHRtbDUvdG9rZW5pemF0aW9uLmh0bWwjZW5kLXRhZy1vcGVuLXN0YXRlCisgICAgICAgICAgICAgICAgaWYgcmF3ZGF0YVtpOmkrM10gPT0gJzwvPic6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKzMKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZV9ib2d1c19jb21tZW50KGkpCisgICAgICAgICAgICB0YWduYW1lID0gbmFtZW1hdGNoLmdyb3VwKDEpLmxvd2VyKCkKKyAgICAgICAgICAgICMgY29uc3VtZSBhbmQgaWdub3JlIG90aGVyIHN0dWZmIGJldHdlZW4gdGhlIG5hbWUgYW5kIHRoZSA+CisgICAgICAgICAgICAjIE5vdGU6IHRoaXMgaXMgbm90IDEwMCUgY29ycmVjdCwgc2luY2Ugd2UgbWlnaHQgaGF2ZSB0aGluZ3MgbGlrZQorICAgICAgICAgICAgIyA8L3RhZyBhdHRyPSI+Ij4sIGJ1dCBsb29raW5nIGZvciA+IGFmdGVyIHRoYSBuYW1lIHNob3VsZCBjb3ZlcgorICAgICAgICAgICAgIyBtb3N0IG9mIHRoZSBjYXNlcyBhbmQgaXMgbXVjaCBzaW1wbGVyCisgICAgICAgICAgICBndHBvcyA9IHJhd2RhdGEuZmluZCgnPicsIG5hbWVtYXRjaC5lbmQoKSkKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX2VuZHRhZyh0YWduYW1lKQorICAgICAgICAgICAgcmV0dXJuIGd0cG9zKzEKIAogICAgICAgICBlbGVtID0gbWF0Y2guZ3JvdXAoMSkubG93ZXIoKSAjIHNjcmlwdCBvciBzdHlsZQogICAgICAgICBpZiBzZWxmLmNkYXRhX2VsZW0gaXMgbm90IE5vbmU6CiAgICAgICAgICAgICBpZiBlbGVtICE9IHNlbGYuY2RhdGFfZWxlbToKLSAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKHJhd2RhdGFbaTpqXSkKLSAgICAgICAgICAgICAgICByZXR1cm4gagorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEocmF3ZGF0YVtpOmd0cG9zXSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZ3Rwb3MKIAogICAgICAgICBzZWxmLmhhbmRsZV9lbmR0YWcoZWxlbSkKICAgICAgICAgc2VsZi5jbGVhcl9jZGF0YV9tb2RlKCkKLSAgICAgICAgcmV0dXJuIGoKKyAgICAgICAgcmV0dXJuIGd0cG9zCiAKICAgICAjIE92ZXJyaWRhYmxlIC0tIGZpbmlzaCBwcm9jZXNzaW5nIG9mIHN0YXJ0K2VuZCB0YWc6IDx0YWcuLi4vPgogICAgIGRlZiBoYW5kbGVfc3RhcnRlbmR0YWcoc2VsZiwgdGFnLCBhdHRycyk6CkBAIC0zNzUsNyArNDQwLDcgQEAKICAgICAgICAgcGFzcwogCiAgICAgZGVmIHVua25vd25fZGVjbChzZWxmLCBkYXRhKToKLSAgICAgICAgc2VsZi5lcnJvcigidW5rbm93biBkZWNsYXJhdGlvbjogJXIiICUgKGRhdGEsKSkKKyAgICAgICAgcGFzcwogCiAgICAgIyBJbnRlcm5hbCAtLSBoZWxwZXIgdG8gcmVtb3ZlIHNwZWNpYWwgY2hhcmFjdGVyIHF1b3RpbmcKICAgICBlbnRpdHlkZWZzID0gTm9uZQpkaWZmIC0tZ2l0IGEvTGliL1F1ZXVlLnB5IGIvTGliL1F1ZXVlLnB5CmluZGV4IDJkYjhkNzYuLjAwMzY0YjMgMTAwNjQ0Ci0tLSBhL0xpYi9RdWV1ZS5weQorKysgYi9MaWIvUXVldWUucHkKQEAgLTEwOSw3ICsxMDksNyBAQAogCiAgICAgICAgIElmIG9wdGlvbmFsIGFyZ3MgJ2Jsb2NrJyBpcyB0cnVlIGFuZCAndGltZW91dCcgaXMgTm9uZSAodGhlIGRlZmF1bHQpLAogICAgICAgICBibG9jayBpZiBuZWNlc3NhcnkgdW50aWwgYSBmcmVlIHNsb3QgaXMgYXZhaWxhYmxlLiBJZiAndGltZW91dCcgaXMKLSAgICAgICAgYSBwb3NpdGl2ZSBudW1iZXIsIGl0IGJsb2NrcyBhdCBtb3N0ICd0aW1lb3V0JyBzZWNvbmRzIGFuZCByYWlzZXMKKyAgICAgICAgYSBub24tbmVnYXRpdmUgbnVtYmVyLCBpdCBibG9ja3MgYXQgbW9zdCAndGltZW91dCcgc2Vjb25kcyBhbmQgcmFpc2VzCiAgICAgICAgIHRoZSBGdWxsIGV4Y2VwdGlvbiBpZiBubyBmcmVlIHNsb3Qgd2FzIGF2YWlsYWJsZSB3aXRoaW4gdGhhdCB0aW1lLgogICAgICAgICBPdGhlcndpc2UgKCdibG9jaycgaXMgZmFsc2UpLCBwdXQgYW4gaXRlbSBvbiB0aGUgcXVldWUgaWYgYSBmcmVlIHNsb3QKICAgICAgICAgaXMgaW1tZWRpYXRlbHkgYXZhaWxhYmxlLCBlbHNlIHJhaXNlIHRoZSBGdWxsIGV4Y2VwdGlvbiAoJ3RpbWVvdXQnCkBAIC0xMjUsNyArMTI1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgd2hpbGUgc2VsZi5fcXNpemUoKSA9PSBzZWxmLm1heHNpemU6CiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5vdF9mdWxsLndhaXQoKQogICAgICAgICAgICAgICAgIGVsaWYgdGltZW91dCA8IDA6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIid0aW1lb3V0JyBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIikKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiJ3RpbWVvdXQnIG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyIikKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICBlbmR0aW1lID0gX3RpbWUoKSArIHRpbWVvdXQKICAgICAgICAgICAgICAgICAgICAgd2hpbGUgc2VsZi5fcXNpemUoKSA9PSBzZWxmLm1heHNpemU6CkBAIC0xNTIsNyArMTUyLDcgQEAKIAogICAgICAgICBJZiBvcHRpb25hbCBhcmdzICdibG9jaycgaXMgdHJ1ZSBhbmQgJ3RpbWVvdXQnIGlzIE5vbmUgKHRoZSBkZWZhdWx0KSwKICAgICAgICAgYmxvY2sgaWYgbmVjZXNzYXJ5IHVudGlsIGFuIGl0ZW0gaXMgYXZhaWxhYmxlLiBJZiAndGltZW91dCcgaXMKLSAgICAgICAgYSBwb3NpdGl2ZSBudW1iZXIsIGl0IGJsb2NrcyBhdCBtb3N0ICd0aW1lb3V0JyBzZWNvbmRzIGFuZCByYWlzZXMKKyAgICAgICAgYSBub24tbmVnYXRpdmUgbnVtYmVyLCBpdCBibG9ja3MgYXQgbW9zdCAndGltZW91dCcgc2Vjb25kcyBhbmQgcmFpc2VzCiAgICAgICAgIHRoZSBFbXB0eSBleGNlcHRpb24gaWYgbm8gaXRlbSB3YXMgYXZhaWxhYmxlIHdpdGhpbiB0aGF0IHRpbWUuCiAgICAgICAgIE90aGVyd2lzZSAoJ2Jsb2NrJyBpcyBmYWxzZSksIHJldHVybiBhbiBpdGVtIGlmIG9uZSBpcyBpbW1lZGlhdGVseQogICAgICAgICBhdmFpbGFibGUsIGVsc2UgcmFpc2UgdGhlIEVtcHR5IGV4Y2VwdGlvbiAoJ3RpbWVvdXQnIGlzIGlnbm9yZWQKQEAgLTE2Nyw3ICsxNjcsNyBAQAogICAgICAgICAgICAgICAgIHdoaWxlIG5vdCBzZWxmLl9xc2l6ZSgpOgogICAgICAgICAgICAgICAgICAgICBzZWxmLm5vdF9lbXB0eS53YWl0KCkKICAgICAgICAgICAgIGVsaWYgdGltZW91dCA8IDA6Ci0gICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiJ3RpbWVvdXQnIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIiKQorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIid0aW1lb3V0JyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlciIpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIGVuZHRpbWUgPSBfdGltZSgpICsgdGltZW91dAogICAgICAgICAgICAgICAgIHdoaWxlIG5vdCBzZWxmLl9xc2l6ZSgpOgpkaWZmIC0tZ2l0IGEvTGliL1NpbXBsZUhUVFBTZXJ2ZXIucHkgYi9MaWIvU2ltcGxlSFRUUFNlcnZlci5weQppbmRleCAzZTAzMzRkLi5kNDk3ZTFlIDEwMDY0NAotLS0gYS9MaWIvU2ltcGxlSFRUUFNlcnZlci5weQorKysgYi9MaWIvU2ltcGxlSFRUUFNlcnZlci5weQpAQCAtNDMsOCArNDMsMTAgQEAKICAgICAgICAgIiIiU2VydmUgYSBHRVQgcmVxdWVzdC4iIiIKICAgICAgICAgZiA9IHNlbGYuc2VuZF9oZWFkKCkKICAgICAgICAgaWYgZjoKLSAgICAgICAgICAgIHNlbGYuY29weWZpbGUoZiwgc2VsZi53ZmlsZSkKLSAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuY29weWZpbGUoZiwgc2VsZi53ZmlsZSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCiAKICAgICBkZWYgZG9fSEVBRChzZWxmKToKICAgICAgICAgIiIiU2VydmUgYSBIRUFEIHJlcXVlc3QuIiIiCkBAIC04OCwxMyArOTAsMTcgQEAKICAgICAgICAgZXhjZXB0IElPRXJyb3I6CiAgICAgICAgICAgICBzZWxmLnNlbmRfZXJyb3IoNDA0LCAiRmlsZSBub3QgZm91bmQiKQogICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDIwMCkKLSAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC10eXBlIiwgY3R5cGUpCi0gICAgICAgIGZzID0gb3MuZnN0YXQoZi5maWxlbm8oKSkKLSAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1MZW5ndGgiLCBzdHIoZnNbNl0pKQotICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJMYXN0LU1vZGlmaWVkIiwgc2VsZi5kYXRlX3RpbWVfc3RyaW5nKGZzLnN0X210aW1lKSkKLSAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCi0gICAgICAgIHJldHVybiBmCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSgyMDApCisgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJDb250ZW50LXR5cGUiLCBjdHlwZSkKKyAgICAgICAgICAgIGZzID0gb3MuZnN0YXQoZi5maWxlbm8oKSkKKyAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIiwgc3RyKGZzWzZdKSkKKyAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkxhc3QtTW9kaWZpZWQiLCBzZWxmLmRhdGVfdGltZV9zdHJpbmcoZnMuc3RfbXRpbWUpKQorICAgICAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCisgICAgICAgICAgICByZXR1cm4gZgorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHJhaXNlCiAKICAgICBkZWYgbGlzdF9kaXJlY3Rvcnkoc2VsZiwgcGF0aCk6CiAgICAgICAgICIiIkhlbHBlciB0byBwcm9kdWNlIGEgZGlyZWN0b3J5IGxpc3RpbmcgKGFic2VudCBpbmRleC5odG1sKS4KQEAgLTE0OSw2ICsxNTUsOCBAQAogICAgICAgICAjIGFiYW5kb24gcXVlcnkgcGFyYW1ldGVycwogICAgICAgICBwYXRoID0gcGF0aC5zcGxpdCgnPycsMSlbMF0KICAgICAgICAgcGF0aCA9IHBhdGguc3BsaXQoJyMnLDEpWzBdCisgICAgICAgICMgRG9uJ3QgZm9yZ2V0IGV4cGxpY2l0IHRyYWlsaW5nIHNsYXNoIHdoZW4gbm9ybWFsaXppbmcuIElzc3VlMTczMjQKKyAgICAgICAgdHJhaWxpbmdfc2xhc2ggPSBwYXRoLnJzdHJpcCgpLmVuZHN3aXRoKCcvJykKICAgICAgICAgcGF0aCA9IHBvc2l4cGF0aC5ub3JtcGF0aCh1cmxsaWIudW5xdW90ZShwYXRoKSkKICAgICAgICAgd29yZHMgPSBwYXRoLnNwbGl0KCcvJykKICAgICAgICAgd29yZHMgPSBmaWx0ZXIoTm9uZSwgd29yZHMpCkBAIC0xNTgsNiArMTY2LDggQEAKICAgICAgICAgICAgIGhlYWQsIHdvcmQgPSBvcy5wYXRoLnNwbGl0KHdvcmQpCiAgICAgICAgICAgICBpZiB3b3JkIGluIChvcy5jdXJkaXIsIG9zLnBhcmRpcik6IGNvbnRpbnVlCiAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHdvcmQpCisgICAgICAgIGlmIHRyYWlsaW5nX3NsYXNoOgorICAgICAgICAgICAgcGF0aCArPSAnLycKICAgICAgICAgcmV0dXJuIHBhdGgKIAogICAgIGRlZiBjb3B5ZmlsZShzZWxmLCBzb3VyY2UsIG91dHB1dGZpbGUpOgpkaWZmIC0tZ2l0IGEvTGliL1NpbXBsZVhNTFJQQ1NlcnZlci5weSBiL0xpYi9TaW1wbGVYTUxSUENTZXJ2ZXIucHkKaW5kZXggNGNkYzE1NC4uZmNjM2QyZSAxMDA2NDQKLS0tIGEvTGliL1NpbXBsZVhNTFJQQ1NlcnZlci5weQorKysgYi9MaWIvU2ltcGxlWE1MUlBDU2VydmVyLnB5CkBAIC0xLDQgKzEsNCBAQAotIiIiU2ltcGxlIFhNTC1SUEMgU2VydmVyLgorciIiIlNpbXBsZSBYTUwtUlBDIFNlcnZlci4KIAogVGhpcyBtb2R1bGUgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIHNpbXBsZSBYTUwtUlBDIHNlcnZlcnMKIGJ5IGNyZWF0aW5nIGEgc2VydmVyIGFuZCBlaXRoZXIgaW5zdGFsbGluZyBmdW5jdGlvbnMsIGEKQEAgLTQ4Niw3ICs0ODYsMTAgQEAKICAgICAgICAgICAgIEwgPSBbXQogICAgICAgICAgICAgd2hpbGUgc2l6ZV9yZW1haW5pbmc6CiAgICAgICAgICAgICAgICAgY2h1bmtfc2l6ZSA9IG1pbihzaXplX3JlbWFpbmluZywgbWF4X2NodW5rX3NpemUpCi0gICAgICAgICAgICAgICAgTC5hcHBlbmQoc2VsZi5yZmlsZS5yZWFkKGNodW5rX3NpemUpKQorICAgICAgICAgICAgICAgIGNodW5rID0gc2VsZi5yZmlsZS5yZWFkKGNodW5rX3NpemUpCisgICAgICAgICAgICAgICAgaWYgbm90IGNodW5rOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIEwuYXBwZW5kKGNodW5rKQogICAgICAgICAgICAgICAgIHNpemVfcmVtYWluaW5nIC09IGxlbihMWy0xXSkKICAgICAgICAgICAgIGRhdGEgPSAnJy5qb2luKEwpCiAKQEAgLTcwMSw0ICs3MDQsNSBAQAogICAgIHNlcnZlciA9IFNpbXBsZVhNTFJQQ1NlcnZlcigoImxvY2FsaG9zdCIsIDgwMDApKQogICAgIHNlcnZlci5yZWdpc3Rlcl9mdW5jdGlvbihwb3cpCiAgICAgc2VydmVyLnJlZ2lzdGVyX2Z1bmN0aW9uKGxhbWJkYSB4LHk6IHgreSwgJ2FkZCcpCisgICAgc2VydmVyLnJlZ2lzdGVyX211bHRpY2FsbF9mdW5jdGlvbnMoKQogICAgIHNlcnZlci5zZXJ2ZV9mb3JldmVyKCkKZGlmZiAtLWdpdCBhL0xpYi9Tb2NrZXRTZXJ2ZXIucHkgYi9MaWIvU29ja2V0U2VydmVyLnB5CmluZGV4IDJmZjM4ODguLmFmYjg2ODYgMTAwNjQ0Ci0tLSBhL0xpYi9Tb2NrZXRTZXJ2ZXIucHkKKysrIGIvTGliL1NvY2tldFNlcnZlci5weQpAQCAtMTMzLDYgKzEzMyw3IEBACiBpbXBvcnQgc2VsZWN0CiBpbXBvcnQgc3lzCiBpbXBvcnQgb3MKK2ltcG9ydCBlcnJubwogdHJ5OgogICAgIGltcG9ydCB0aHJlYWRpbmcKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKQEAgLTE0Nyw2ICsxNDgsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgIlRocmVhZGluZ1VuaXhTdHJlYW1TZXJ2ZXIiLAogICAgICAgICAgICAgICAgICAgICAiVGhyZWFkaW5nVW5peERhdGFncmFtU2VydmVyIl0pCiAKK2RlZiBfZWludHJfcmV0cnkoZnVuYywgKmFyZ3MpOgorICAgICIiInJlc3RhcnQgYSBzeXN0ZW0gY2FsbCBpbnRlcnJ1cHRlZCBieSBFSU5UUiIiIgorICAgIHdoaWxlIFRydWU6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBmdW5jKCphcmdzKQorICAgICAgICBleGNlcHQgKE9TRXJyb3IsIHNlbGVjdC5lcnJvcikgYXMgZToKKyAgICAgICAgICAgIGlmIGUuYXJnc1swXSAhPSBlcnJuby5FSU5UUjoKKyAgICAgICAgICAgICAgICByYWlzZQorCiBjbGFzcyBCYXNlU2VydmVyOgogCiAgICAgIiIiQmFzZSBjbGFzcyBmb3Igc2VydmVyIGNsYXNzZXMuCkBAIC0yMjIsNyArMjMyLDggQEAKICAgICAgICAgICAgICAgICAjIGNvbm5lY3RpbmcgdG8gdGhlIHNvY2tldCB0byB3YWtlIHRoaXMgdXAgaW5zdGVhZCBvZgogICAgICAgICAgICAgICAgICMgcG9sbGluZy4gUG9sbGluZyByZWR1Y2VzIG91ciByZXNwb25zaXZlbmVzcyB0byBhCiAgICAgICAgICAgICAgICAgIyBzaHV0ZG93biByZXF1ZXN0IGFuZCB3YXN0ZXMgY3B1IGF0IGFsbCBvdGhlciB0aW1lcy4KLSAgICAgICAgICAgICAgICByLCB3LCBlID0gc2VsZWN0LnNlbGVjdChbc2VsZl0sIFtdLCBbXSwgcG9sbF9pbnRlcnZhbCkKKyAgICAgICAgICAgICAgICByLCB3LCBlID0gX2VpbnRyX3JldHJ5KHNlbGVjdC5zZWxlY3QsIFtzZWxmXSwgW10sIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9sbF9pbnRlcnZhbCkKICAgICAgICAgICAgICAgICBpZiBzZWxmIGluIHI6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2hhbmRsZV9yZXF1ZXN0X25vYmxvY2soKQogICAgICAgICBmaW5hbGx5OgpAQCAtMjYyLDcgKzI3Myw3IEBACiAgICAgICAgICAgICB0aW1lb3V0ID0gc2VsZi50aW1lb3V0CiAgICAgICAgIGVsaWYgc2VsZi50aW1lb3V0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgdGltZW91dCA9IG1pbih0aW1lb3V0LCBzZWxmLnRpbWVvdXQpCi0gICAgICAgIGZkX3NldHMgPSBzZWxlY3Quc2VsZWN0KFtzZWxmXSwgW10sIFtdLCB0aW1lb3V0KQorICAgICAgICBmZF9zZXRzID0gX2VpbnRyX3JldHJ5KHNlbGVjdC5zZWxlY3QsIFtzZWxmXSwgW10sIFtdLCB0aW1lb3V0KQogICAgICAgICBpZiBub3QgZmRfc2V0c1swXToKICAgICAgICAgICAgIHNlbGYuaGFuZGxlX3RpbWVvdXQoKQogICAgICAgICAgICAgcmV0dXJuCkBAIC01MDIsMzUgKzUxMywzNyBAQAogCiAgICAgZGVmIGNvbGxlY3RfY2hpbGRyZW4oc2VsZik6CiAgICAgICAgICIiIkludGVybmFsIHJvdXRpbmUgdG8gd2FpdCBmb3IgY2hpbGRyZW4gdGhhdCBoYXZlIGV4aXRlZC4iIiIKLSAgICAgICAgaWYgc2VsZi5hY3RpdmVfY2hpbGRyZW4gaXMgTm9uZTogcmV0dXJuCi0gICAgICAgIHdoaWxlIGxlbihzZWxmLmFjdGl2ZV9jaGlsZHJlbikgPj0gc2VsZi5tYXhfY2hpbGRyZW46Ci0gICAgICAgICAgICAjIFhYWDogVGhpcyB3aWxsIHdhaXQgZm9yIGFueSBjaGlsZCBwcm9jZXNzLCBub3QganVzdCBvbmVzCi0gICAgICAgICAgICAjIHNwYXduZWQgYnkgdGhpcyBsaWJyYXJ5LiBUaGlzIGNvdWxkIGNvbmZ1c2Ugb3RoZXIKLSAgICAgICAgICAgICMgbGlicmFyaWVzIHRoYXQgZXhwZWN0IHRvIGJlIGFibGUgdG8gd2FpdCBmb3IgdGhlaXIgb3duCi0gICAgICAgICAgICAjIGNoaWxkcmVuLgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHBpZCwgc3RhdHVzID0gb3Mud2FpdHBpZCgwLCAwKQotICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgotICAgICAgICAgICAgICAgIHBpZCA9IE5vbmUKLSAgICAgICAgICAgIGlmIHBpZCBub3QgaW4gc2VsZi5hY3RpdmVfY2hpbGRyZW46IGNvbnRpbnVlCi0gICAgICAgICAgICBzZWxmLmFjdGl2ZV9jaGlsZHJlbi5yZW1vdmUocGlkKQorICAgICAgICBpZiBzZWxmLmFjdGl2ZV9jaGlsZHJlbiBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCiAKLSAgICAgICAgIyBYWFg6IFRoaXMgbG9vcCBydW5zIG1vcmUgc3lzdGVtIGNhbGxzIHRoYW4gaXQgb3VnaHQKLSAgICAgICAgIyB0by4gVGhlcmUgc2hvdWxkIGJlIGEgd2F5IHRvIHB1dCB0aGUgYWN0aXZlX2NoaWxkcmVuIGludG8gYQotICAgICAgICAjIHByb2Nlc3MgZ3JvdXAgYW5kIHRoZW4gdXNlIG9zLndhaXRwaWQoLXBnaWQpIHRvIHdhaXQgZm9yIGFueQotICAgICAgICAjIG9mIHRoYXQgc2V0LCBidXQgSSBjb3VsZG4ndCBmaW5kIGEgd2F5IHRvIGFsbG9jYXRlIHBnaWRzCi0gICAgICAgICMgdGhhdCBjb3VsZG4ndCBjb2xsaWRlLgotICAgICAgICBmb3IgY2hpbGQgaW4gc2VsZi5hY3RpdmVfY2hpbGRyZW46CisgICAgICAgICMgSWYgd2UncmUgYWJvdmUgdGhlIG1heCBudW1iZXIgb2YgY2hpbGRyZW4sIHdhaXQgYW5kIHJlYXAgdGhlbSB1bnRpbAorICAgICAgICAjIHdlIGdvIGJhY2sgYmVsb3cgdGhyZXNob2xkLiBOb3RlIHRoYXQgd2UgdXNlIHdhaXRwaWQoLTEpIGJlbG93IHRvIGJlCisgICAgICAgICMgYWJsZSB0byBjb2xsZWN0IGNoaWxkcmVuIGluIHNpemUoPGRlZnVuY3QgY2hpbGRyZW4+KSBzeXNjYWxscyBpbnN0ZWFkCisgICAgICAgICMgb2Ygc2l6ZSg8Y2hpbGRyZW4+KTogdGhlIGRvd25zaWRlIGlzIHRoYXQgdGhpcyBtaWdodCByZWFwIGNoaWxkcmVuCisgICAgICAgICMgd2hpY2ggd2UgZGlkbid0IHNwYXduLCB3aGljaCBpcyB3aHkgd2Ugb25seSByZXNvcnQgdG8gdGhpcyB3aGVuIHdlJ3JlCisgICAgICAgICMgYWJvdmUgbWF4X2NoaWxkcmVuLgorICAgICAgICB3aGlsZSBsZW4oc2VsZi5hY3RpdmVfY2hpbGRyZW4pID49IHNlbGYubWF4X2NoaWxkcmVuOgogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHBpZCwgc3RhdHVzID0gb3Mud2FpdHBpZChjaGlsZCwgb3MuV05PSEFORykKLSAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKLSAgICAgICAgICAgICAgICBwaWQgPSBOb25lCi0gICAgICAgICAgICBpZiBub3QgcGlkOiBjb250aW51ZQorICAgICAgICAgICAgICAgIHBpZCwgXyA9IG9zLndhaXRwaWQoLTEsIDApCisgICAgICAgICAgICAgICAgc2VsZi5hY3RpdmVfY2hpbGRyZW4uZGlzY2FyZChwaWQpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRUNISUxEOgorICAgICAgICAgICAgICAgICAgICAjIHdlIGRvbid0IGhhdmUgYW55IGNoaWxkcmVuLCB3ZSdyZSBkb25lCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWN0aXZlX2NoaWxkcmVuLmNsZWFyKCkKKyAgICAgICAgICAgICAgICBlbGlmIGUuZXJybm8gIT0gZXJybm8uRUlOVFI6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgIyBOb3cgcmVhcCBhbGwgZGVmdW5jdCBjaGlsZHJlbi4KKyAgICAgICAgZm9yIHBpZCBpbiBzZWxmLmFjdGl2ZV9jaGlsZHJlbi5jb3B5KCk6CiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hY3RpdmVfY2hpbGRyZW4ucmVtb3ZlKHBpZCkKLSAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlOgotICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJyVzLiB4PSVkIGFuZCBsaXN0PSVyJyAlIChlLm1lc3NhZ2UsIHBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hY3RpdmVfY2hpbGRyZW4pKQorICAgICAgICAgICAgICAgIHBpZCwgXyA9IG9zLndhaXRwaWQocGlkLCBvcy5XTk9IQU5HKQorICAgICAgICAgICAgICAgICMgaWYgdGhlIGNoaWxkIGhhc24ndCBleGl0ZWQgeWV0LCBwaWQgd2lsbCBiZSAwIGFuZCBpZ25vcmVkIGJ5CisgICAgICAgICAgICAgICAgIyBkaXNjYXJkKCkgYmVsb3cKKyAgICAgICAgICAgICAgICBzZWxmLmFjdGl2ZV9jaGlsZHJlbi5kaXNjYXJkKHBpZCkKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FQ0hJTEQ6CisgICAgICAgICAgICAgICAgICAgICMgc29tZW9uZSBlbHNlIHJlYXBlZCBpdAorICAgICAgICAgICAgICAgICAgICBzZWxmLmFjdGl2ZV9jaGlsZHJlbi5kaXNjYXJkKHBpZCkKIAogICAgIGRlZiBoYW5kbGVfdGltZW91dChzZWxmKToKICAgICAgICAgIiIiV2FpdCBmb3Igem9tYmllcyBhZnRlciBzZWxmLnRpbWVvdXQgc2Vjb25kcyBvZiBpbmFjdGl2aXR5LgpAQCAtNTQ2LDggKzU1OSw4IEBACiAgICAgICAgIGlmIHBpZDoKICAgICAgICAgICAgICMgUGFyZW50IHByb2Nlc3MKICAgICAgICAgICAgIGlmIHNlbGYuYWN0aXZlX2NoaWxkcmVuIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgc2VsZi5hY3RpdmVfY2hpbGRyZW4gPSBbXQotICAgICAgICAgICAgc2VsZi5hY3RpdmVfY2hpbGRyZW4uYXBwZW5kKHBpZCkKKyAgICAgICAgICAgICAgICBzZWxmLmFjdGl2ZV9jaGlsZHJlbiA9IHNldCgpCisgICAgICAgICAgICBzZWxmLmFjdGl2ZV9jaGlsZHJlbi5hZGQocGlkKQogICAgICAgICAgICAgc2VsZi5jbG9zZV9yZXF1ZXN0KHJlcXVlc3QpICNjbG9zZSBoYW5kbGUgaW4gcGFyZW50IHByb2Nlc3MKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBlbHNlOgpAQCAtNjkwLDcgKzcwMywxMiBAQAogCiAgICAgZGVmIGZpbmlzaChzZWxmKToKICAgICAgICAgaWYgbm90IHNlbGYud2ZpbGUuY2xvc2VkOgotICAgICAgICAgICAgc2VsZi53ZmlsZS5mbHVzaCgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi53ZmlsZS5mbHVzaCgpCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgICAgICMgQW4gZmluYWwgc29ja2V0IGVycm9yIG1heSBoYXZlIG9jY3VycmVkIGhlcmUsIHN1Y2ggYXMKKyAgICAgICAgICAgICAgICAjIHRoZSBsb2NhbCBlcnJvciBFQ09OTkFCT1JURUQuCisgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICBzZWxmLndmaWxlLmNsb3NlKCkKICAgICAgICAgc2VsZi5yZmlsZS5jbG9zZSgpCiAKZGlmZiAtLWdpdCBhL0xpYi9TdHJpbmdJTy5weSBiL0xpYi9TdHJpbmdJTy5weQppbmRleCBmNzRhMDY2Li5iNjM1MjViIDEwMDY0NAotLS0gYS9MaWIvU3RyaW5nSU8ucHkKKysrIGIvTGliL1N0cmluZ0lPLnB5CkBAIC0xNTgsNyArMTU4LDcgQEAKICAgICAgICAgICAgIG5ld3BvcyA9IHNlbGYubGVuCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBuZXdwb3MgPSBpKzEKLSAgICAgICAgaWYgbGVuZ3RoIGlzIG5vdCBOb25lIGFuZCBsZW5ndGggPiAwOgorICAgICAgICBpZiBsZW5ndGggaXMgbm90IE5vbmUgYW5kIGxlbmd0aCA+PSAwOgogICAgICAgICAgICAgaWYgc2VsZi5wb3MgKyBsZW5ndGggPCBuZXdwb3M6CiAgICAgICAgICAgICAgICAgbmV3cG9zID0gc2VsZi5wb3MgKyBsZW5ndGgKICAgICAgICAgciA9IHNlbGYuYnVmW3NlbGYucG9zOm5ld3Bvc10KZGlmZiAtLWdpdCBhL0xpYi9fTFdQQ29va2llSmFyLnB5IGIvTGliL19MV1BDb29raWVKYXIucHkKaW5kZXggMmE0ZmE3Yi4uOTBjYzYzMyAxMDA2NDQKLS0tIGEvTGliL19MV1BDb29raWVKYXIucHkKKysrIGIvTGliL19MV1BDb29raWVKYXIucHkKQEAgLTQ4LDcgKzQ4LDcgQEAKIAogY2xhc3MgTFdQQ29va2llSmFyKEZpbGVDb29raWVKYXIpOgogICAgICIiIgotICAgIFRoZSBMV1BDb29raWVKYXIgc2F2ZXMgYSBzZXF1ZW5jZSBvZiJTZXQtQ29va2llMyIgbGluZXMuCisgICAgVGhlIExXUENvb2tpZUphciBzYXZlcyBhIHNlcXVlbmNlIG9mICJTZXQtQ29va2llMyIgbGluZXMuCiAgICAgIlNldC1Db29raWUzIiBpcyB0aGUgZm9ybWF0IHVzZWQgYnkgdGhlIGxpYnd3dy1wZXJsIGxpYmFyeSwgbm90IGtub3duCiAgICAgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGFueSBicm93c2VyLCBidXQgd2hpY2ggaXMgZWFzeSB0byByZWFkIGFuZAogICAgIGRvZXNuJ3QgbG9zZSBpbmZvcm1hdGlvbiBhYm91dCBSRkMgMjk2NSBjb29raWVzLgpAQCAtNjAsNyArNjAsNyBAQAogICAgICIiIgogCiAgICAgZGVmIGFzX2x3cF9zdHIoc2VsZiwgaWdub3JlX2Rpc2NhcmQ9VHJ1ZSwgaWdub3JlX2V4cGlyZXM9VHJ1ZSk6Ci0gICAgICAgICIiIlJldHVybiBjb29raWVzIGFzIGEgc3RyaW5nIG9mICJcbiItc2VwYXJhdGVkICJTZXQtQ29va2llMyIgaGVhZGVycy4KKyAgICAgICAgIiIiUmV0dXJuIGNvb2tpZXMgYXMgYSBzdHJpbmcgb2YgIlxcbiItc2VwYXJhdGVkICJTZXQtQ29va2llMyIgaGVhZGVycy4KIAogICAgICAgICBpZ25vcmVfZGlzY2FyZCBhbmQgaWdub3JlX2V4cGlyZXM6IHNlZSBkb2NzdHJpbmcgZm9yIEZpbGVDb29raWVKYXIuc2F2ZQogCmRpZmYgLS1naXQgYS9MaWIvX01vemlsbGFDb29raWVKYXIucHkgYi9MaWIvX01vemlsbGFDb29raWVKYXIucHkKaW5kZXggMDBlOGJjZi4uNTg1YmMxNyAxMDA2NDQKLS0tIGEvTGliL19Nb3ppbGxhQ29va2llSmFyLnB5CisrKyBiL0xpYi9fTW96aWxsYUNvb2tpZUphci5weQpAQCAtMzksNyArMzksNyBAQAogICAgIG1hZ2ljX3JlID0gIiMoIE5ldHNjYXBlKT8gSFRUUCBDb29raWUgRmlsZSIKICAgICBoZWFkZXIgPSAiIiJcCiAjIE5ldHNjYXBlIEhUVFAgQ29va2llIEZpbGUKLSMgaHR0cDovL3d3dy5uZXRzY2FwZS5jb20vbmV3c3JlZi9zdGQvY29va2llX3NwZWMuaHRtbAorIyBodHRwOi8vY3VybC5oYXh4LnNlL3JmYy9jb29raWVfc3BlYy5odG1sCiAjIFRoaXMgaXMgYSBnZW5lcmF0ZWQgZmlsZSEgIERvIG5vdCBlZGl0LgogCiAiIiIKZGlmZiAtLWdpdCBhL0xpYi9fX2Z1dHVyZV9fLnB5IGIvTGliL19fZnV0dXJlX18ucHkKaW5kZXggOTE1NjQ1OS4uZTA5OTZlYiAxMDA2NDQKLS0tIGEvTGliL19fZnV0dXJlX18ucHkKKysrIGIvTGliL19fZnV0dXJlX18ucHkKQEAgLTExMiw3ICsxMTIsNyBAQAogICAgICAgICAgICAgICAgICAgICBDT19GVVRVUkVfRElWSVNJT04pCiAKIGFic29sdXRlX2ltcG9ydCA9IF9GZWF0dXJlKCgyLCA1LCAwLCAiYWxwaGEiLCAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgyLCA3LCAwLCAiYWxwaGEiLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgzLCAwLCAwLCAiYWxwaGEiLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPX0ZVVFVSRV9BQlNPTFVURV9JTVBPUlQpCiAKIHdpdGhfc3RhdGVtZW50ID0gX0ZlYXR1cmUoKDIsIDUsIDAsICJhbHBoYSIsIDEpLApkaWZmIC0tZ2l0IGEvTGliL19hYmNvbGwucHkgYi9MaWIvX2FiY29sbC5weQppbmRleCBlNzM3NmU0Li4zZDU2N2UzIDEwMDY0NAotLS0gYS9MaWIvX2FiY29sbC5weQorKysgYi9MaWIvX2FiY29sbC5weQpAQCAtNzQsNiArNzQsNyBAQAogCiAgICAgQGFic3RyYWN0bWV0aG9kCiAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICdSZXR1cm4gdGhlIG5leHQgaXRlbSBmcm9tIHRoZSBpdGVyYXRvci4gV2hlbiBleGhhdXN0ZWQsIHJhaXNlIFN0b3BJdGVyYXRpb24nCiAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KIAogICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKQEAgLTE0Miw3ICsxNDMsNyBAQAogICAgIG1ldGhvZHMgZXhjZXB0IGZvciBfX2NvbnRhaW5zX18sIF9faXRlcl9fIGFuZCBfX2xlbl9fLgogCiAgICAgVG8gb3ZlcnJpZGUgdGhlIGNvbXBhcmlzb25zIChwcmVzdW1hYmx5IGZvciBzcGVlZCwgYXMgdGhlCi0gICAgc2VtYW50aWNzIGFyZSBmaXhlZCksIGFsbCB5b3UgaGF2ZSB0byBkbyBpcyByZWRlZmluZSBfX2xlX18gYW5kCisgICAgc2VtYW50aWNzIGFyZSBmaXhlZCksIHJlZGVmaW5lIF9fbGVfXyBhbmQgX19nZV9fLAogICAgIHRoZW4gdGhlIG90aGVyIG9wZXJhdGlvbnMgd2lsbCBhdXRvbWF0aWNhbGx5IGZvbGxvdyBzdWl0LgogICAgICIiIgogCkBAIC0xNjQsMTIgKzE2NSwxNyBAQAogICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgU2V0KToKICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAotICAgICAgICByZXR1cm4gb3RoZXIgPCBzZWxmCisgICAgICAgIHJldHVybiBsZW4oc2VsZikgPiBsZW4ob3RoZXIpIGFuZCBzZWxmLl9fZ2VfXyhvdGhlcikKIAogICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgU2V0KToKICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAotICAgICAgICByZXR1cm4gb3RoZXIgPD0gc2VsZgorICAgICAgICBpZiBsZW4oc2VsZikgPCBsZW4ob3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGZvciBlbGVtIGluIG90aGVyOgorICAgICAgICAgICAgaWYgZWxlbSBub3QgaW4gc2VsZjoKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKIAogICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgU2V0KToKQEAgLTE5Myw3ICsxOTksMTAgQEAKICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgICByZXR1cm4gc2VsZi5fZnJvbV9pdGVyYWJsZSh2YWx1ZSBmb3IgdmFsdWUgaW4gb3RoZXIgaWYgdmFsdWUgaW4gc2VsZikKIAorICAgIF9fcmFuZF9fID0gX19hbmRfXworCiAgICAgZGVmIGlzZGlzam9pbnQoc2VsZiwgb3RoZXIpOgorICAgICAgICAnUmV0dXJuIFRydWUgaWYgdHdvIHNldHMgaGF2ZSBhIG51bGwgaW50ZXJzZWN0aW9uLicKICAgICAgICAgZm9yIHZhbHVlIGluIG90aGVyOgogICAgICAgICAgICAgaWYgdmFsdWUgaW4gc2VsZjoKICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKQEAgLTIwNSw2ICsyMTQsOCBAQAogICAgICAgICBjaGFpbiA9IChlIGZvciBzIGluIChzZWxmLCBvdGhlcikgZm9yIGUgaW4gcykKICAgICAgICAgcmV0dXJuIHNlbGYuX2Zyb21faXRlcmFibGUoY2hhaW4pCiAKKyAgICBfX3Jvcl9fID0gX19vcl9fCisKICAgICBkZWYgX19zdWJfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBTZXQpOgogICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIEl0ZXJhYmxlKToKQEAgLTIxMyw2ICsyMjQsMTQgQEAKICAgICAgICAgcmV0dXJuIHNlbGYuX2Zyb21faXRlcmFibGUodmFsdWUgZm9yIHZhbHVlIGluIHNlbGYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdmFsdWUgbm90IGluIG90aGVyKQogCisgICAgZGVmIF9fcnN1Yl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIFNldCk6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgSXRlcmFibGUpOgorICAgICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICAgICAgb3RoZXIgPSBzZWxmLl9mcm9tX2l0ZXJhYmxlKG90aGVyKQorICAgICAgICByZXR1cm4gc2VsZi5fZnJvbV9pdGVyYWJsZSh2YWx1ZSBmb3IgdmFsdWUgaW4gb3RoZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdmFsdWUgbm90IGluIHNlbGYpCisKICAgICBkZWYgX194b3JfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBTZXQpOgogICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIEl0ZXJhYmxlKToKQEAgLTIyMCw2ICsyMzksOCBAQAogICAgICAgICAgICAgb3RoZXIgPSBzZWxmLl9mcm9tX2l0ZXJhYmxlKG90aGVyKQogICAgICAgICByZXR1cm4gKHNlbGYgLSBvdGhlcikgfCAob3RoZXIgLSBzZWxmKQogCisgICAgX19yeG9yX18gPSBfX3hvcl9fCisKICAgICAjIFNldHMgYXJlIG5vdCBoYXNoYWJsZSBieSBkZWZhdWx0LCBidXQgc3ViY2xhc3NlcyBjYW4gY2hhbmdlIHRoaXMKICAgICBfX2hhc2hfXyA9IE5vbmUKIApAQCAtMjU5LDYgKzI4MCwxNiBAQAogCiAKIGNsYXNzIE11dGFibGVTZXQoU2V0KToKKyAgICAiIiJBIG11dGFibGUgc2V0IGlzIGEgZmluaXRlLCBpdGVyYWJsZSBjb250YWluZXIuCisKKyAgICBUaGlzIGNsYXNzIHByb3ZpZGVzIGNvbmNyZXRlIGdlbmVyaWMgaW1wbGVtZW50YXRpb25zIG9mIGFsbAorICAgIG1ldGhvZHMgZXhjZXB0IGZvciBfX2NvbnRhaW5zX18sIF9faXRlcl9fLCBfX2xlbl9fLAorICAgIGFkZCgpLCBhbmQgZGlzY2FyZCgpLgorCisgICAgVG8gb3ZlcnJpZGUgdGhlIGNvbXBhcmlzb25zIChwcmVzdW1hYmx5IGZvciBzcGVlZCwgYXMgdGhlCisgICAgc2VtYW50aWNzIGFyZSBmaXhlZCksIGFsbCB5b3UgaGF2ZSB0byBkbyBpcyByZWRlZmluZSBfX2xlX18gYW5kCisgICAgdGhlbiB0aGUgb3RoZXIgb3BlcmF0aW9ucyB3aWxsIGF1dG9tYXRpY2FsbHkgZm9sbG93IHN1aXQuCisgICAgIiIiCiAKICAgICBAYWJzdHJhY3RtZXRob2QKICAgICBkZWYgYWRkKHNlbGYsIHZhbHVlKToKQEAgLTMzMywxMSArMzY0LDIwIEBACiAKIGNsYXNzIE1hcHBpbmcoU2l6ZWQsIEl0ZXJhYmxlLCBDb250YWluZXIpOgogCisgICAgIiIiQSBNYXBwaW5nIGlzIGEgZ2VuZXJpYyBjb250YWluZXIgZm9yIGFzc29jaWF0aW5nIGtleS92YWx1ZQorICAgIHBhaXJzLgorCisgICAgVGhpcyBjbGFzcyBwcm92aWRlcyBjb25jcmV0ZSBnZW5lcmljIGltcGxlbWVudGF0aW9ucyBvZiBhbGwKKyAgICBtZXRob2RzIGV4Y2VwdCBmb3IgX19nZXRpdGVtX18sIF9faXRlcl9fLCBhbmQgX19sZW5fXy4KKworICAgICIiIgorCiAgICAgQGFic3RyYWN0bWV0aG9kCiAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgIHJhaXNlIEtleUVycm9yCiAKICAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgJ0QuZ2V0KGtbLGRdKSAtPiBEW2tdIGlmIGsgaW4gRCwgZWxzZSBkLiAgZCBkZWZhdWx0cyB0byBOb25lLicKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgcmV0dXJuIHNlbGZba2V5XQogICAgICAgICBleGNlcHQgS2V5RXJyb3I6CkBAIC0zNTIsMjMgKzM5MiwyOSBAQAogICAgICAgICAgICAgcmV0dXJuIFRydWUKIAogICAgIGRlZiBpdGVya2V5cyhzZWxmKToKKyAgICAgICAgJ0QuaXRlcmtleXMoKSAtPiBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzIG9mIEQnCiAgICAgICAgIHJldHVybiBpdGVyKHNlbGYpCiAKICAgICBkZWYgaXRlcnZhbHVlcyhzZWxmKToKKyAgICAgICAgJ0QuaXRlcnZhbHVlcygpIC0+IGFuIGl0ZXJhdG9yIG92ZXIgdGhlIHZhbHVlcyBvZiBEJwogICAgICAgICBmb3Iga2V5IGluIHNlbGY6CiAgICAgICAgICAgICB5aWVsZCBzZWxmW2tleV0KIAogICAgIGRlZiBpdGVyaXRlbXMoc2VsZik6CisgICAgICAgICdELml0ZXJpdGVtcygpIC0+IGFuIGl0ZXJhdG9yIG92ZXIgdGhlIChrZXksIHZhbHVlKSBpdGVtcyBvZiBEJwogICAgICAgICBmb3Iga2V5IGluIHNlbGY6CiAgICAgICAgICAgICB5aWVsZCAoa2V5LCBzZWxmW2tleV0pCiAKICAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgIkQua2V5cygpIC0+IGxpc3Qgb2YgRCdzIGtleXMiCiAgICAgICAgIHJldHVybiBsaXN0KHNlbGYpCiAKICAgICBkZWYgaXRlbXMoc2VsZik6CisgICAgICAgICJELml0ZW1zKCkgLT4gbGlzdCBvZiBEJ3MgKGtleSwgdmFsdWUpIHBhaXJzLCBhcyAyLXR1cGxlcyIKICAgICAgICAgcmV0dXJuIFsoa2V5LCBzZWxmW2tleV0pIGZvciBrZXkgaW4gc2VsZl0KIAogICAgIGRlZiB2YWx1ZXMoc2VsZik6CisgICAgICAgICJELnZhbHVlcygpIC0+IGxpc3Qgb2YgRCdzIHZhbHVlcyIKICAgICAgICAgcmV0dXJuIFtzZWxmW2tleV0gZm9yIGtleSBpbiBzZWxmXQogCiAgICAgIyBNYXBwaW5ncyBhcmUgbm90IGhhc2hhYmxlIGJ5IGRlZmF1bHQsIGJ1dCBzdWJjbGFzc2VzIGNhbiBjaGFuZ2UgdGhpcwpAQCAtNDQzLDYgKzQ4OSwxNSBAQAogCiBjbGFzcyBNdXRhYmxlTWFwcGluZyhNYXBwaW5nKToKIAorICAgICIiIkEgTXV0YWJsZU1hcHBpbmcgaXMgYSBnZW5lcmljIGNvbnRhaW5lciBmb3IgYXNzb2NpYXRpbmcKKyAgICBrZXkvdmFsdWUgcGFpcnMuCisKKyAgICBUaGlzIGNsYXNzIHByb3ZpZGVzIGNvbmNyZXRlIGdlbmVyaWMgaW1wbGVtZW50YXRpb25zIG9mIGFsbAorICAgIG1ldGhvZHMgZXhjZXB0IGZvciBfX2dldGl0ZW1fXywgX19zZXRpdGVtX18sIF9fZGVsaXRlbV9fLAorICAgIF9faXRlcl9fLCBhbmQgX19sZW5fXy4KKworICAgICIiIgorCiAgICAgQGFic3RyYWN0bWV0aG9kCiAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgogICAgICAgICByYWlzZSBLZXlFcnJvcgpAQCAtNDU0LDYgKzUwOSw5IEBACiAgICAgX19tYXJrZXIgPSBvYmplY3QoKQogCiAgICAgZGVmIHBvcChzZWxmLCBrZXksIGRlZmF1bHQ9X19tYXJrZXIpOgorICAgICAgICAnJydELnBvcChrWyxkXSkgLT4gdiwgcmVtb3ZlIHNwZWNpZmllZCBrZXkgYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZS4KKyAgICAgICAgICBJZiBrZXkgaXMgbm90IGZvdW5kLCBkIGlzIHJldHVybmVkIGlmIGdpdmVuLCBvdGhlcndpc2UgS2V5RXJyb3IgaXMgcmFpc2VkLgorICAgICAgICAnJycKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgdmFsdWUgPSBzZWxmW2tleV0KICAgICAgICAgZXhjZXB0IEtleUVycm9yOgpAQCAtNDY1LDYgKzUyMyw5IEBACiAgICAgICAgICAgICByZXR1cm4gdmFsdWUKIAogICAgIGRlZiBwb3BpdGVtKHNlbGYpOgorICAgICAgICAnJydELnBvcGl0ZW0oKSAtPiAoaywgdiksIHJlbW92ZSBhbmQgcmV0dXJuIHNvbWUgKGtleSwgdmFsdWUpIHBhaXIKKyAgICAgICAgICAgYXMgYSAyLXR1cGxlOyBidXQgcmFpc2UgS2V5RXJyb3IgaWYgRCBpcyBlbXB0eS4KKyAgICAgICAgJycnCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGtleSA9IG5leHQoaXRlcihzZWxmKSkKICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CkBAIC00NzQsNiArNTM1LDcgQEAKICAgICAgICAgcmV0dXJuIGtleSwgdmFsdWUKIAogICAgIGRlZiBjbGVhcihzZWxmKToKKyAgICAgICAgJ0QuY2xlYXIoKSAtPiBOb25lLiAgUmVtb3ZlIGFsbCBpdGVtcyBmcm9tIEQuJwogICAgICAgICB0cnk6CiAgICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgIHNlbGYucG9waXRlbSgpCkBAIC00ODEsNiArNTQzLDExIEBACiAgICAgICAgICAgICBwYXNzCiAKICAgICBkZWYgdXBkYXRlKCphcmdzLCAqKmt3ZHMpOgorICAgICAgICAnJycgRC51cGRhdGUoW0UsIF0qKkYpIC0+IE5vbmUuICBVcGRhdGUgRCBmcm9tIG1hcHBpbmcvaXRlcmFibGUgRSBhbmQgRi4KKyAgICAgICAgICAgIElmIEUgcHJlc2VudCBhbmQgaGFzIGEgLmtleXMoKSBtZXRob2QsIGRvZXM6ICAgICBmb3IgayBpbiBFOiBEW2tdID0gRVtrXQorICAgICAgICAgICAgSWYgRSBwcmVzZW50IGFuZCBsYWNrcyAua2V5cygpIG1ldGhvZCwgZG9lczogICAgIGZvciAoaywgdikgaW4gRTogRFtrXSA9IHYKKyAgICAgICAgICAgIEluIGVpdGhlciBjYXNlLCB0aGlzIGlzIGZvbGxvd2VkIGJ5OiBmb3IgaywgdiBpbiBGLml0ZW1zKCk6IERba10gPSB2CisgICAgICAgICcnJwogICAgICAgICBpZiBsZW4oYXJncykgPiAyOgogICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJ1cGRhdGUoKSB0YWtlcyBhdCBtb3N0IDIgcG9zaXRpb25hbCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50cyAoe30gZ2l2ZW4pIi5mb3JtYXQobGVuKGFyZ3MpKSkKQEAgLTUwMiw2ICs1NjksNyBAQAogICAgICAgICAgICAgc2VsZltrZXldID0gdmFsdWUKIAogICAgIGRlZiBzZXRkZWZhdWx0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgJ0Quc2V0ZGVmYXVsdChrWyxkXSkgLT4gRC5nZXQoayxkKSwgYWxzbyBzZXQgRFtrXT1kIGlmIGsgbm90IGluIEQnCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJldHVybiBzZWxmW2tleV0KICAgICAgICAgZXhjZXB0IEtleUVycm9yOgpAQCAtNTQ2LDEyICs2MTQsMTYgQEAKICAgICAgICAgICAgIHlpZWxkIHNlbGZbaV0KIAogICAgIGRlZiBpbmRleChzZWxmLCB2YWx1ZSk6CisgICAgICAgICcnJ1MuaW5kZXgodmFsdWUpIC0+IGludGVnZXIgLS0gcmV0dXJuIGZpcnN0IGluZGV4IG9mIHZhbHVlLgorICAgICAgICAgICBSYWlzZXMgVmFsdWVFcnJvciBpZiB0aGUgdmFsdWUgaXMgbm90IHByZXNlbnQuCisgICAgICAgICcnJwogICAgICAgICBmb3IgaSwgdiBpbiBlbnVtZXJhdGUoc2VsZik6CiAgICAgICAgICAgICBpZiB2ID09IHZhbHVlOgogICAgICAgICAgICAgICAgIHJldHVybiBpCiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKIAogICAgIGRlZiBjb3VudChzZWxmLCB2YWx1ZSk6CisgICAgICAgICdTLmNvdW50KHZhbHVlKSAtPiBpbnRlZ2VyIC0tIHJldHVybiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdmFsdWUnCiAgICAgICAgIHJldHVybiBzdW0oMSBmb3IgdiBpbiBzZWxmIGlmIHYgPT0gdmFsdWUpCiAKIFNlcXVlbmNlLnJlZ2lzdGVyKHR1cGxlKQpAQCAtNTYyLDYgKzYzNCwxMyBAQAogCiBjbGFzcyBNdXRhYmxlU2VxdWVuY2UoU2VxdWVuY2UpOgogCisgICAgIiIiQWxsIHRoZSBvcGVyYXRpb25zIG9uIGEgcmVhZC1vbmx5IHNlcXVlbmNlLgorCisgICAgQ29uY3JldGUgc3ViY2xhc3NlcyBtdXN0IHByb3ZpZGUgX19uZXdfXyBvciBfX2luaXRfXywKKyAgICBfX2dldGl0ZW1fXywgX19zZXRpdGVtX18sIF9fZGVsaXRlbV9fLCBfX2xlbl9fLCBhbmQgaW5zZXJ0KCkuCisKKyAgICAiIiIKKwogICAgIEBhYnN0cmFjdG1ldGhvZAogICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBpbmRleCwgdmFsdWUpOgogICAgICAgICByYWlzZSBJbmRleEVycm9yCkBAIC01NzIsMjYgKzY1MSwzNiBAQAogCiAgICAgQGFic3RyYWN0bWV0aG9kCiAgICAgZGVmIGluc2VydChzZWxmLCBpbmRleCwgdmFsdWUpOgorICAgICAgICAnUy5pbnNlcnQoaW5kZXgsIG9iamVjdCkgLS0gaW5zZXJ0IG9iamVjdCBiZWZvcmUgaW5kZXgnCiAgICAgICAgIHJhaXNlIEluZGV4RXJyb3IKIAogICAgIGRlZiBhcHBlbmQoc2VsZiwgdmFsdWUpOgorICAgICAgICAnUy5hcHBlbmQob2JqZWN0KSAtLSBhcHBlbmQgb2JqZWN0IHRvIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlJwogICAgICAgICBzZWxmLmluc2VydChsZW4oc2VsZiksIHZhbHVlKQogCiAgICAgZGVmIHJldmVyc2Uoc2VsZik6CisgICAgICAgICdTLnJldmVyc2UoKSAtLSByZXZlcnNlICpJTiBQTEFDRSonCiAgICAgICAgIG4gPSBsZW4oc2VsZikKICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uobi8vMik6CiAgICAgICAgICAgICBzZWxmW2ldLCBzZWxmW24taS0xXSA9IHNlbGZbbi1pLTFdLCBzZWxmW2ldCiAKICAgICBkZWYgZXh0ZW5kKHNlbGYsIHZhbHVlcyk6CisgICAgICAgICdTLmV4dGVuZChpdGVyYWJsZSkgLS0gZXh0ZW5kIHNlcXVlbmNlIGJ5IGFwcGVuZGluZyBlbGVtZW50cyBmcm9tIHRoZSBpdGVyYWJsZScKICAgICAgICAgZm9yIHYgaW4gdmFsdWVzOgogICAgICAgICAgICAgc2VsZi5hcHBlbmQodikKIAogICAgIGRlZiBwb3Aoc2VsZiwgaW5kZXg9LTEpOgorICAgICAgICAnJydTLnBvcChbaW5kZXhdKSAtPiBpdGVtIC0tIHJlbW92ZSBhbmQgcmV0dXJuIGl0ZW0gYXQgaW5kZXggKGRlZmF1bHQgbGFzdCkuCisgICAgICAgICAgIFJhaXNlIEluZGV4RXJyb3IgaWYgbGlzdCBpcyBlbXB0eSBvciBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuCisgICAgICAgICcnJwogICAgICAgICB2ID0gc2VsZltpbmRleF0KICAgICAgICAgZGVsIHNlbGZbaW5kZXhdCiAgICAgICAgIHJldHVybiB2CiAKICAgICBkZWYgcmVtb3ZlKHNlbGYsIHZhbHVlKToKKyAgICAgICAgJycnUy5yZW1vdmUodmFsdWUpIC0tIHJlbW92ZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHZhbHVlLgorICAgICAgICAgICBSYWlzZSBWYWx1ZUVycm9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgcHJlc2VudC4KKyAgICAgICAgJycnCiAgICAgICAgIGRlbCBzZWxmW3NlbGYuaW5kZXgodmFsdWUpXQogCiAgICAgZGVmIF9faWFkZF9fKHNlbGYsIHZhbHVlcyk6CmRpZmYgLS1naXQgYS9MaWIvX29zeF9zdXBwb3J0LnB5IGIvTGliL19vc3hfc3VwcG9ydC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2QxNDI4Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL19vc3hfc3VwcG9ydC5weQpAQCAtMCwwICsxLDUwMiBAQAorIiIiU2hhcmVkIE9TIFggc3VwcG9ydCBmdW5jdGlvbnMuIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3lzCisKK19fYWxsX18gPSBbCisgICAgJ2NvbXBpbGVyX2ZpeHVwJywKKyAgICAnY3VzdG9taXplX2NvbmZpZ192YXJzJywKKyAgICAnY3VzdG9taXplX2NvbXBpbGVyJywKKyAgICAnZ2V0X3BsYXRmb3JtX29zeCcsCitdCisKKyMgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgdGhhdCBtYXkgY29udGFpbiB1bml2ZXJzYWwgYnVpbGQgZmxhZ3MsCisjIGxpa2UgIi1hcmNoIiBvciAiLWlzZGtyb290IiwgdGhhdCBtYXkgbmVlZCBjdXN0b21pemF0aW9uIGZvcgorIyB0aGUgdXNlciBlbnZpcm9ubWVudAorX1VOSVZFUlNBTF9DT05GSUdfVkFSUyA9ICgnQ0ZMQUdTJywgJ0xERkxBR1MnLCAnQ1BQRkxBR1MnLCAnQkFTRUNGTEFHUycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JMRFNIQVJFRCcsICdMRFNIQVJFRCcsICdDQycsICdDWFgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQWV9DRkxBR1MnLCAnUFlfTERGTEFHUycsICdQWV9DUFBGTEFHUycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BZX0NPUkVfQ0ZMQUdTJykKKworIyBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyB0aGF0IG1heSBjb250YWluIGNvbXBpbGVyIGNhbGxzCitfQ09NUElMRVJfQ09ORklHX1ZBUlMgPSAoJ0JMRFNIQVJFRCcsICdMRFNIQVJFRCcsICdDQycsICdDWFgnKQorCisjIHByZWZpeCBhZGRlZCB0byBvcmlnaW5hbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlIG5hbWVzCitfSU5JVFBSRSA9ICdfT1NYX1NVUFBPUlRfSU5JVElBTF8nCisKKworZGVmIF9maW5kX2V4ZWN1dGFibGUoZXhlY3V0YWJsZSwgcGF0aD1Ob25lKToKKyAgICAiIiJUcmllcyB0byBmaW5kICdleGVjdXRhYmxlJyBpbiB0aGUgZGlyZWN0b3JpZXMgbGlzdGVkIGluICdwYXRoJy4KKworICAgIEEgc3RyaW5nIGxpc3RpbmcgZGlyZWN0b3JpZXMgc2VwYXJhdGVkIGJ5ICdvcy5wYXRoc2VwJzsgZGVmYXVsdHMgdG8KKyAgICBvcy5lbnZpcm9uWydQQVRIJ10uICBSZXR1cm5zIHRoZSBjb21wbGV0ZSBmaWxlbmFtZSBvciBOb25lIGlmIG5vdCBmb3VuZC4KKyAgICAiIiIKKyAgICBpZiBwYXRoIGlzIE5vbmU6CisgICAgICAgIHBhdGggPSBvcy5lbnZpcm9uWydQQVRIJ10KKworICAgIHBhdGhzID0gcGF0aC5zcGxpdChvcy5wYXRoc2VwKQorICAgIGJhc2UsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoZXhlY3V0YWJsZSkKKworICAgIGlmIChzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJyBvciBvcy5uYW1lID09ICdvczInKSBhbmQgKGV4dCAhPSAnLmV4ZScpOgorICAgICAgICBleGVjdXRhYmxlID0gZXhlY3V0YWJsZSArICcuZXhlJworCisgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKGV4ZWN1dGFibGUpOgorICAgICAgICBmb3IgcCBpbiBwYXRoczoKKyAgICAgICAgICAgIGYgPSBvcy5wYXRoLmpvaW4ocCwgZXhlY3V0YWJsZSkKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGYpOgorICAgICAgICAgICAgICAgICMgdGhlIGZpbGUgZXhpc3RzLCB3ZSBoYXZlIGEgc2hvdCBhdCBzcGF3biB3b3JraW5nCisgICAgICAgICAgICAgICAgcmV0dXJuIGYKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gZXhlY3V0YWJsZQorCisKK2RlZiBfcmVhZF9vdXRwdXQoY29tbWFuZHN0cmluZyk6CisgICAgIiIiT3V0cHV0IGZyb20gc3VjY2Vzc2Z1bCBjb21tYW5kIGV4ZWN1dGlvbiBvciBOb25lIiIiCisgICAgIyBTaW1pbGFyIHRvIG9zLnBvcGVuKGNvbW1hbmRzdHJpbmcsICJyIikucmVhZCgpLAorICAgICMgYnV0IHdpdGhvdXQgYWN0dWFsbHkgdXNpbmcgb3MucG9wZW4gYmVjYXVzZSB0aGF0CisgICAgIyBmdW5jdGlvbiBpcyBub3QgdXNhYmxlIGR1cmluZyBweXRob24gYm9vdHN0cmFwLgorICAgICMgdGVtcGZpbGUgaXMgYWxzbyBub3QgYXZhaWxhYmxlIHRoZW4uCisgICAgaW1wb3J0IGNvbnRleHRsaWIKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCB0ZW1wZmlsZQorICAgICAgICBmcCA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBmcCA9IG9wZW4oIi90bXAvX29zeF9zdXBwb3J0LiVzIiUoCisgICAgICAgICAgICBvcy5nZXRwaWQoKSwpLCAidytiIikKKworICAgIHdpdGggY29udGV4dGxpYi5jbG9zaW5nKGZwKSBhcyBmcDoKKyAgICAgICAgY21kID0gIiVzIDI+L2Rldi9udWxsID4nJXMnIiAlIChjb21tYW5kc3RyaW5nLCBmcC5uYW1lKQorICAgICAgICByZXR1cm4gZnAucmVhZCgpLnN0cmlwKCkgaWYgbm90IG9zLnN5c3RlbShjbWQpIGVsc2UgTm9uZQorCisKK2RlZiBfZmluZF9idWlsZF90b29sKHRvb2xuYW1lKToKKyAgICAiIiJGaW5kIGEgYnVpbGQgdG9vbCBvbiBjdXJyZW50IHBhdGggb3IgdXNpbmcgeGNydW4iIiIKKyAgICByZXR1cm4gKF9maW5kX2V4ZWN1dGFibGUodG9vbG5hbWUpCisgICAgICAgICAgICAgICAgb3IgX3JlYWRfb3V0cHV0KCIvdXNyL2Jpbi94Y3J1biAtZmluZCAlcyIgJSAodG9vbG5hbWUsKSkKKyAgICAgICAgICAgICAgICBvciAnJworICAgICAgICAgICAgKQorCitfU1lTVEVNX1ZFUlNJT04gPSBOb25lCisKK2RlZiBfZ2V0X3N5c3RlbV92ZXJzaW9uKCk6CisgICAgIiIiUmV0dXJuIHRoZSBPUyBYIHN5c3RlbSB2ZXJzaW9uIGFzIGEgc3RyaW5nIiIiCisgICAgIyBSZWFkaW5nIHRoaXMgcGxpc3QgaXMgYSBkb2N1bWVudGVkIHdheSB0byBnZXQgdGhlIHN5c3RlbQorICAgICMgdmVyc2lvbiAoc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgR2VzdGFsdCBNYW5hZ2VyKQorICAgICMgV2UgYXZvaWQgdXNpbmcgcGxhdGZvcm0ubWFjX3ZlciB0byBhdm9pZCBwb3NzaWJsZSBib290c3RyYXAgaXNzdWVzIGR1cmluZworICAgICMgdGhlIGJ1aWxkIG9mIFB5dGhvbiBpdHNlbGYgKGRpc3R1dGlscyBpcyB1c2VkIHRvIGJ1aWxkIHN0YW5kYXJkIGxpYnJhcnkKKyAgICAjIGV4dGVuc2lvbnMpLgorCisgICAgZ2xvYmFsIF9TWVNURU1fVkVSU0lPTgorCisgICAgaWYgX1NZU1RFTV9WRVJTSU9OIGlzIE5vbmU6CisgICAgICAgIF9TWVNURU1fVkVSU0lPTiA9ICcnCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBvcGVuKCcvU3lzdGVtL0xpYnJhcnkvQ29yZVNlcnZpY2VzL1N5c3RlbVZlcnNpb24ucGxpc3QnKQorICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICMgV2UncmUgb24gYSBwbGFpbiBkYXJ3aW4gYm94LCBmYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQKKyAgICAgICAgICAgICMgYmVoYXZpb3VyLgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG0gPSByZS5zZWFyY2gocic8a2V5PlByb2R1Y3RVc2VyVmlzaWJsZVZlcnNpb248L2tleT5ccyonCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJzxzdHJpbmc+KC4qPyk8L3N0cmluZz4nLCBmLnJlYWQoKSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBpZiBtIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIF9TWVNURU1fVkVSU0lPTiA9ICcuJy5qb2luKG0uZ3JvdXAoMSkuc3BsaXQoJy4nKVs6Ml0pCisgICAgICAgICAgICAjIGVsc2U6IGZhbGwgYmFjayB0byB0aGUgZGVmYXVsdCBiZWhhdmlvdXIKKworICAgIHJldHVybiBfU1lTVEVNX1ZFUlNJT04KKworZGVmIF9yZW1vdmVfb3JpZ2luYWxfdmFsdWVzKF9jb25maWdfdmFycyk6CisgICAgIiIiUmVtb3ZlIG9yaWdpbmFsIHVubW9kaWZpZWQgdmFsdWVzIGZvciB0ZXN0aW5nIiIiCisgICAgIyBUaGlzIGlzIG5lZWRlZCBmb3IgaGlnaGVyLWxldmVsIGNyb3NzLXBsYXRmb3JtIHRlc3RzIG9mIGdldF9wbGF0Zm9ybS4KKyAgICBmb3IgayBpbiBsaXN0KF9jb25maWdfdmFycyk6CisgICAgICAgIGlmIGsuc3RhcnRzd2l0aChfSU5JVFBSRSk6CisgICAgICAgICAgICBkZWwgX2NvbmZpZ192YXJzW2tdCisKK2RlZiBfc2F2ZV9tb2RpZmllZF92YWx1ZShfY29uZmlnX3ZhcnMsIGN2LCBuZXd2YWx1ZSk6CisgICAgIiIiU2F2ZSBtb2RpZmllZCBhbmQgb3JpZ2luYWwgdW5tb2RpZmllZCB2YWx1ZSBvZiBjb25maWd1cmF0aW9uIHZhciIiIgorCisgICAgb2xkdmFsdWUgPSBfY29uZmlnX3ZhcnMuZ2V0KGN2LCAnJykKKyAgICBpZiAob2xkdmFsdWUgIT0gbmV3dmFsdWUpIGFuZCAoX0lOSVRQUkUgKyBjdiBub3QgaW4gX2NvbmZpZ192YXJzKToKKyAgICAgICAgX2NvbmZpZ192YXJzW19JTklUUFJFICsgY3ZdID0gb2xkdmFsdWUKKyAgICBfY29uZmlnX3ZhcnNbY3ZdID0gbmV3dmFsdWUKKworZGVmIF9zdXBwb3J0c191bml2ZXJzYWxfYnVpbGRzKCk6CisgICAgIiIiUmV0dXJucyBUcnVlIGlmIHVuaXZlcnNhbCBidWlsZHMgYXJlIHN1cHBvcnRlZCBvbiB0aGlzIHN5c3RlbSIiIgorICAgICMgQXMgYW4gYXBwcm94aW1hdGlvbiwgd2UgYXNzdW1lIHRoYXQgaWYgd2UgYXJlIHJ1bm5pbmcgb24gMTAuNCBvciBhYm92ZSwKKyAgICAjIHRoZW4gd2UgYXJlIHJ1bm5pbmcgd2l0aCBhbiBYY29kZSBlbnZpcm9ubWVudCB0aGF0IHN1cHBvcnRzIHVuaXZlcnNhbAorICAgICMgYnVpbGRzLCBpbiBwYXJ0aWN1bGFyIC1pc3lzcm9vdCBhbmQgLWFyY2ggYXJndW1lbnRzIHRvIHRoZSBjb21waWxlci4gVGhpcworICAgICMgaXMgaW4gc3VwcG9ydCBvZiBhbGxvd2luZyAxMC40IHVuaXZlcnNhbCBidWlsZHMgdG8gcnVuIG9uIDEwLjMueCBzeXN0ZW1zLgorCisgICAgb3N4X3ZlcnNpb24gPSBfZ2V0X3N5c3RlbV92ZXJzaW9uKCkKKyAgICBpZiBvc3hfdmVyc2lvbjoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3N4X3ZlcnNpb24gPSB0dXBsZShpbnQoaSkgZm9yIGkgaW4gb3N4X3ZlcnNpb24uc3BsaXQoJy4nKSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBvc3hfdmVyc2lvbiA9ICcnCisgICAgcmV0dXJuIGJvb2wob3N4X3ZlcnNpb24gPj0gKDEwLCA0KSkgaWYgb3N4X3ZlcnNpb24gZWxzZSBGYWxzZQorCisKK2RlZiBfZmluZF9hcHByb3ByaWF0ZV9jb21waWxlcihfY29uZmlnX3ZhcnMpOgorICAgICIiIkZpbmQgYXBwcm9wcmlhdGUgQyBjb21waWxlciBmb3IgZXh0ZW5zaW9uIG1vZHVsZSBidWlsZHMiIiIKKworICAgICMgSXNzdWUgIzEzNTkwOgorICAgICMgICAgVGhlIE9TWCBsb2NhdGlvbiBmb3IgdGhlIGNvbXBpbGVyIHZhcmllcyBiZXR3ZWVuIE9TWAorICAgICMgICAgKG9yIHJhdGhlciBYY29kZSkgcmVsZWFzZXMuICBXaXRoIG9sZGVyIHJlbGVhc2VzICh1cC10byAxMC41KQorICAgICMgICAgdGhlIGNvbXBpbGVyIGlzIGluIC91c3IvYmluLCB3aXRoIG5ld2VyIHJlbGVhc2VzIHRoZSBjb21waWxlcgorICAgICMgICAgY2FuIG9ubHkgYmUgZm91bmQgaW5zaWRlIFhjb2RlLmFwcCBpZiB0aGUgIkNvbW1hbmQgTGluZSBUb29scyIKKyAgICAjICAgIGFyZSBub3QgaW5zdGFsbGVkLgorICAgICMKKyAgICAjICAgIEZ1dGhlcm1vcmUsIHRoZSBjb21waWxlciB0aGF0IGNhbiBiZSB1c2VkIHZhcmllcyBiZXR3ZWVuCisgICAgIyAgICBYY29kZSByZWxlYXNlcy4gVXAgdG8gWGNvZGUgNCBpdCB3YXMgcG9zc2libGUgdG8gdXNlICdnY2MtNC4yJworICAgICMgICAgYXMgdGhlIGNvbXBpbGVyLCBhZnRlciB0aGF0ICdjbGFuZycgc2hvdWxkIGJlIHVzZWQgYmVjYXVzZQorICAgICMgICAgZ2NjLTQuMiBpcyBlaXRoZXIgbm90IHByZXNlbnQsIG9yIGEgY29weSBvZiAnbGx2bS1nY2MnIHRoYXQKKyAgICAjICAgIG1pc2NvbXBpbGVzIFB5dGhvbi4KKworICAgICMgc2tpcCBjaGVja3MgaWYgdGhlIGNvbXBpbGVyIHdhcyBvdmVycmlkZW4gd2l0aCBhIENDIGVudiB2YXJpYWJsZQorICAgIGlmICdDQycgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgcmV0dXJuIF9jb25maWdfdmFycworCisgICAgIyBUaGUgQ0MgY29uZmlnIHZhciBtaWdodCBjb250YWluIGFkZGl0aW9uYWwgYXJndW1lbnRzLgorICAgICMgSWdub3JlIHRoZW0gd2hpbGUgc2VhcmNoaW5nLgorICAgIGNjID0gb2xkY2MgPSBfY29uZmlnX3ZhcnNbJ0NDJ10uc3BsaXQoKVswXQorICAgIGlmIG5vdCBfZmluZF9leGVjdXRhYmxlKGNjKToKKyAgICAgICAgIyBDb21waWxlciBpcyBub3QgZm91bmQgb24gdGhlIHNoZWxsIHNlYXJjaCBQQVRILgorICAgICAgICAjIE5vdyBzZWFyY2ggZm9yIGNsYW5nLCBmaXJzdCBvbiBQQVRIIChpZiB0aGUgQ29tbWFuZCBMSW5lCisgICAgICAgICMgVG9vbHMgaGF2ZSBiZWVuIGluc3RhbGxlZCBpbiAvIG9yIGlmIHRoZSB1c2VyIGhhcyBwcm92aWRlZAorICAgICAgICAjIGFub3RoZXIgbG9jYXRpb24gdmlhIENDKS4gIElmIG5vdCBmb3VuZCwgdHJ5IHVzaW5nIHhjcnVuCisgICAgICAgICMgdG8gZmluZCBhbiB1bmluc3RhbGxlZCBjbGFuZyAod2l0aGluIGEgc2VsZWN0ZWQgWGNvZGUpLgorCisgICAgICAgICMgTk9URTogQ2Fubm90IHVzZSBzdWJwcm9jZXNzIGhlcmUgYmVjYXVzZSBvZiBib290c3RyYXAKKyAgICAgICAgIyBpc3N1ZXMgd2hlbiBidWlsZGluZyBQeXRob24gaXRzZWxmIChhbmQgb3MucG9wZW4gaXMKKyAgICAgICAgIyBpbXBsZW1lbnRlZCBvbiB0b3Agb2Ygc3VicHJvY2VzcyBhbmQgaXMgdGhlcmVmb3JlIG5vdAorICAgICAgICAjIHVzYWJsZSBhcyB3ZWxsKQorCisgICAgICAgIGNjID0gX2ZpbmRfYnVpbGRfdG9vbCgnY2xhbmcnKQorCisgICAgZWxpZiBvcy5wYXRoLmJhc2VuYW1lKGNjKS5zdGFydHN3aXRoKCdnY2MnKToKKyAgICAgICAgIyBDb21waWxlciBpcyBHQ0MsIGNoZWNrIGlmIGl0IGlzIExMVk0tR0NDCisgICAgICAgIGRhdGEgPSBfcmVhZF9vdXRwdXQoIiclcycgLS12ZXJzaW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChjYy5yZXBsYWNlKCInIiwgIidcIidcIiciKSwpKQorICAgICAgICBpZiBkYXRhIGFuZCAnbGx2bS1nY2MnIGluIGRhdGE6CisgICAgICAgICAgICAjIEZvdW5kIExMVk0tR0NDLCBmYWxsIGJhY2sgdG8gY2xhbmcKKyAgICAgICAgICAgIGNjID0gX2ZpbmRfYnVpbGRfdG9vbCgnY2xhbmcnKQorCisgICAgaWYgbm90IGNjOgorICAgICAgICByYWlzZSBTeXN0ZW1FcnJvcigKKyAgICAgICAgICAgICAgICJDYW5ub3QgbG9jYXRlIHdvcmtpbmcgY29tcGlsZXIiKQorCisgICAgaWYgY2MgIT0gb2xkY2M6CisgICAgICAgICMgRm91bmQgYSByZXBsYWNlbWVudCBjb21waWxlci4KKyAgICAgICAgIyBNb2RpZnkgY29uZmlnIHZhcnMgdXNpbmcgbmV3IGNvbXBpbGVyLCBpZiBub3QgYWxyZWFkeSBleHBsaWNpdGx5CisgICAgICAgICMgb3ZlcnJpZGVuIGJ5IGFuIGVudiB2YXJpYWJsZSwgcHJlc2VydmluZyBhZGRpdGlvbmFsIGFyZ3VtZW50cy4KKyAgICAgICAgZm9yIGN2IGluIF9DT01QSUxFUl9DT05GSUdfVkFSUzoKKyAgICAgICAgICAgIGlmIGN2IGluIF9jb25maWdfdmFycyBhbmQgY3Ygbm90IGluIG9zLmVudmlyb246CisgICAgICAgICAgICAgICAgY3Zfc3BsaXQgPSBfY29uZmlnX3ZhcnNbY3ZdLnNwbGl0KCkKKyAgICAgICAgICAgICAgICBjdl9zcGxpdFswXSA9IGNjIGlmIGN2ICE9ICdDWFgnIGVsc2UgY2MgKyAnKysnCisgICAgICAgICAgICAgICAgX3NhdmVfbW9kaWZpZWRfdmFsdWUoX2NvbmZpZ192YXJzLCBjdiwgJyAnLmpvaW4oY3Zfc3BsaXQpKQorCisgICAgcmV0dXJuIF9jb25maWdfdmFycworCisKK2RlZiBfcmVtb3ZlX3VuaXZlcnNhbF9mbGFncyhfY29uZmlnX3ZhcnMpOgorICAgICIiIlJlbW92ZSBhbGwgdW5pdmVyc2FsIGJ1aWxkIGFyZ3VtZW50cyBmcm9tIGNvbmZpZyB2YXJzIiIiCisKKyAgICBmb3IgY3YgaW4gX1VOSVZFUlNBTF9DT05GSUdfVkFSUzoKKyAgICAgICAgIyBEbyBub3QgYWx0ZXIgYSBjb25maWcgdmFyIGV4cGxpY2l0bHkgb3ZlcnJpZGVuIGJ5IGVudiB2YXIKKyAgICAgICAgaWYgY3YgaW4gX2NvbmZpZ192YXJzIGFuZCBjdiBub3QgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgIGZsYWdzID0gX2NvbmZpZ192YXJzW2N2XQorICAgICAgICAgICAgZmxhZ3MgPSByZS5zdWIoJy1hcmNoXHMrXHcrXHMnLCAnICcsIGZsYWdzKQorICAgICAgICAgICAgZmxhZ3MgPSByZS5zdWIoJy1pc3lzcm9vdCBbXiBcdF0qJywgJyAnLCBmbGFncykKKyAgICAgICAgICAgIF9zYXZlX21vZGlmaWVkX3ZhbHVlKF9jb25maWdfdmFycywgY3YsIGZsYWdzKQorCisgICAgcmV0dXJuIF9jb25maWdfdmFycworCisKK2RlZiBfcmVtb3ZlX3Vuc3VwcG9ydGVkX2FyY2hzKF9jb25maWdfdmFycyk6CisgICAgIiIiUmVtb3ZlIGFueSB1bnN1cHBvcnRlZCBhcmNocyBmcm9tIGNvbmZpZyB2YXJzIiIiCisgICAgIyBEaWZmZXJlbnQgWGNvZGUgcmVsZWFzZXMgc3VwcG9ydCBkaWZmZXJlbnQgc2V0cyBmb3IgJy1hcmNoJworICAgICMgZmxhZ3MuIEluIHBhcnRpY3VsYXIsIFhjb2RlIDQueCBubyBsb25nZXIgc3VwcG9ydHMgdGhlCisgICAgIyBQUEMgYXJjaGl0ZWN0dXJlcy4KKyAgICAjCisgICAgIyBUaGlzIGNvZGUgYXV0b21hdGljYWxseSByZW1vdmVzICctYXJjaCBwcGMnIGFuZCAnLWFyY2ggcHBjNjQnCisgICAgIyB3aGVuIHRoZXNlIGFyZSBub3Qgc3VwcG9ydGVkLiBUaGF0IG1ha2VzIGl0IHBvc3NpYmxlIHRvCisgICAgIyBidWlsZCBleHRlbnNpb25zIG9uIE9TWCAxMC43IGFuZCBsYXRlciB3aXRoIHRoZSBwcmVidWlsdAorICAgICMgMzItYml0IGluc3RhbGxlciBvbiB0aGUgcHl0aG9uLm9yZyB3ZWJzaXRlLgorCisgICAgIyBza2lwIGNoZWNrcyBpZiB0aGUgY29tcGlsZXIgd2FzIG92ZXJyaWRlbiB3aXRoIGEgQ0MgZW52IHZhcmlhYmxlCisgICAgaWYgJ0NDJyBpbiBvcy5lbnZpcm9uOgorICAgICAgICByZXR1cm4gX2NvbmZpZ192YXJzCisKKyAgICBpZiByZS5zZWFyY2goJy1hcmNoXHMrcHBjJywgX2NvbmZpZ192YXJzWydDRkxBR1MnXSkgaXMgbm90IE5vbmU6CisgICAgICAgICMgTk9URTogQ2Fubm90IHVzZSBzdWJwcm9jZXNzIGhlcmUgYmVjYXVzZSBvZiBib290c3RyYXAKKyAgICAgICAgIyBpc3N1ZXMgd2hlbiBidWlsZGluZyBQeXRob24gaXRzZWxmCisgICAgICAgIHN0YXR1cyA9IG9zLnN5c3RlbSgKKyAgICAgICAgICAgICIiImVjaG8gJ2ludCBtYWlue307JyB8ICIiIgorICAgICAgICAgICAgIiIiJyVzJyAtYyAtYXJjaCBwcGMgLXggYyAtbyAvZGV2L251bGwgL2Rldi9udWxsIDI+L2Rldi9udWxsIiIiCisgICAgICAgICAgICAlKF9jb25maWdfdmFyc1snQ0MnXS5yZXBsYWNlKCInIiwgIidcIidcIiciKSwpKQorICAgICAgICBpZiBzdGF0dXM6CisgICAgICAgICAgICAjIFRoZSBjb21waWxlIGZhaWxlZCBmb3Igc29tZSByZWFzb24uICBCZWNhdXNlIG9mIGRpZmZlcmVuY2VzCisgICAgICAgICAgICAjIGFjcm9zcyBYY29kZSBhbmQgY29tcGlsZXIgdmVyc2lvbnMsIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheQorICAgICAgICAgICAgIyB0byBiZSBzdXJlIHdoeSBpdCBmYWlsZWQuICBBc3N1bWUgaGVyZSBpdCB3YXMgZHVlIHRvIGxhY2sgb2YKKyAgICAgICAgICAgICMgUFBDIHN1cHBvcnQgYW5kIHJlbW92ZSB0aGUgcmVsYXRlZCAnLWFyY2gnIGZsYWdzIGZyb20gZWFjaAorICAgICAgICAgICAgIyBjb25maWcgdmFyaWFibGVzIG5vdCBleHBsaWNpdGx5IG92ZXJyaWRlbiBieSBhbiBlbnZpcm9ubWVudAorICAgICAgICAgICAgIyB2YXJpYWJsZS4gIElmIHRoZSBlcnJvciB3YXMgZm9yIHNvbWUgb3RoZXIgcmVhc29uLCB3ZSBob3BlIHRoZQorICAgICAgICAgICAgIyBmYWlsdXJlIHdpbGwgc2hvdyB1cCBhZ2FpbiB3aGVuIHRyeWluZyB0byBjb21waWxlIGFuIGV4dGVuc2lvbgorICAgICAgICAgICAgIyBtb2R1bGUuCisgICAgICAgICAgICBmb3IgY3YgaW4gX1VOSVZFUlNBTF9DT05GSUdfVkFSUzoKKyAgICAgICAgICAgICAgICBpZiBjdiBpbiBfY29uZmlnX3ZhcnMgYW5kIGN2IG5vdCBpbiBvcy5lbnZpcm9uOgorICAgICAgICAgICAgICAgICAgICBmbGFncyA9IF9jb25maWdfdmFyc1tjdl0KKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSByZS5zdWIoJy1hcmNoXHMrcHBjXHcqXHMnLCAnICcsIGZsYWdzKQorICAgICAgICAgICAgICAgICAgICBfc2F2ZV9tb2RpZmllZF92YWx1ZShfY29uZmlnX3ZhcnMsIGN2LCBmbGFncykKKworICAgIHJldHVybiBfY29uZmlnX3ZhcnMKKworCitkZWYgX292ZXJyaWRlX2FsbF9hcmNocyhfY29uZmlnX3ZhcnMpOgorICAgICIiIkFsbG93IG92ZXJyaWRlIG9mIGFsbCBhcmNocyB3aXRoIEFSQ0hGTEFHUyBlbnYgdmFyIiIiCisgICAgIyBOT1RFOiBUaGlzIG5hbWUgd2FzIGludHJvZHVjZWQgYnkgQXBwbGUgaW4gT1NYIDEwLjUgYW5kCisgICAgIyBpcyB1c2VkIGJ5IHNldmVyYWwgc2NyaXB0aW5nIGxhbmd1YWdlcyBkaXN0cmlidXRlZCB3aXRoCisgICAgIyB0aGF0IE9TIHJlbGVhc2UuCisgICAgaWYgJ0FSQ0hGTEFHUycgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgYXJjaCA9IG9zLmVudmlyb25bJ0FSQ0hGTEFHUyddCisgICAgICAgIGZvciBjdiBpbiBfVU5JVkVSU0FMX0NPTkZJR19WQVJTOgorICAgICAgICAgICAgaWYgY3YgaW4gX2NvbmZpZ192YXJzIGFuZCAnLWFyY2gnIGluIF9jb25maWdfdmFyc1tjdl06CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBfY29uZmlnX3ZhcnNbY3ZdCisgICAgICAgICAgICAgICAgZmxhZ3MgPSByZS5zdWIoJy1hcmNoXHMrXHcrXHMnLCAnICcsIGZsYWdzKQorICAgICAgICAgICAgICAgIGZsYWdzID0gZmxhZ3MgKyAnICcgKyBhcmNoCisgICAgICAgICAgICAgICAgX3NhdmVfbW9kaWZpZWRfdmFsdWUoX2NvbmZpZ192YXJzLCBjdiwgZmxhZ3MpCisKKyAgICByZXR1cm4gX2NvbmZpZ192YXJzCisKKworZGVmIF9jaGVja19mb3JfdW5hdmFpbGFibGVfc2RrKF9jb25maWdfdmFycyk6CisgICAgIiIiUmVtb3ZlIHJlZmVyZW5jZXMgdG8gYW55IFNES3Mgbm90IGF2YWlsYWJsZSIiIgorICAgICMgSWYgd2UncmUgb24gT1NYIDEwLjUgb3IgbGF0ZXIgYW5kIHRoZSB1c2VyIHRyaWVzIHRvCisgICAgIyBjb21waWxlIGFuIGV4dGVuc2lvbiB1c2luZyBhbiBTREsgdGhhdCBpcyBub3QgcHJlc2VudAorICAgICMgb24gdGhlIGN1cnJlbnQgbWFjaGluZSBpdCBpcyBiZXR0ZXIgdG8gbm90IHVzZSBhbiBTREsKKyAgICAjIHRoYW4gdG8gZmFpbC4gIFRoaXMgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCB3aXRoCisgICAgIyB0aGUgc3RhbmRhbG9uZSBDb21tYW5kIExpbmUgVG9vbHMgYWx0ZXJuYXRpdmUgdG8gYQorICAgICMgZnVsbC1ibG93biBYY29kZSBpbnN0YWxsIHNpbmNlIHRoZSBDTFQgcGFja2FnZXMgZG8gbm90CisgICAgIyBwcm92aWRlIFNES3MuICBJZiB0aGUgU0RLIGlzIG5vdCBwcmVzZW50LCBpdCBpcyBhc3N1bWVkCisgICAgIyB0aGF0IHRoZSBoZWFkZXIgZmlsZXMgYW5kIGRldiBsaWJzIGhhdmUgYmVlbiBpbnN0YWxsZWQKKyAgICAjIHRvIC91c3IgYW5kIC9TeXN0ZW0vTGlicmFyeSBieSBlaXRoZXIgYSBzdGFuZGFsb25lIENMVAorICAgICMgcGFja2FnZSBvciB0aGUgQ0xUIGNvbXBvbmVudCB3aXRoaW4gWGNvZGUuCisgICAgY2ZsYWdzID0gX2NvbmZpZ192YXJzLmdldCgnQ0ZMQUdTJywgJycpCisgICAgbSA9IHJlLnNlYXJjaChyJy1pc3lzcm9vdFxzKyhcUyspJywgY2ZsYWdzKQorICAgIGlmIG0gaXMgbm90IE5vbmU6CisgICAgICAgIHNkayA9IG0uZ3JvdXAoMSkKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNkayk6CisgICAgICAgICAgICBmb3IgY3YgaW4gX1VOSVZFUlNBTF9DT05GSUdfVkFSUzoKKyAgICAgICAgICAgICAgICAjIERvIG5vdCBhbHRlciBhIGNvbmZpZyB2YXIgZXhwbGljaXRseSBvdmVycmlkZW4gYnkgZW52IHZhcgorICAgICAgICAgICAgICAgIGlmIGN2IGluIF9jb25maWdfdmFycyBhbmQgY3Ygbm90IGluIG9zLmVudmlyb246CisgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gX2NvbmZpZ192YXJzW2N2XQorICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHJlLnN1YihyJy1pc3lzcm9vdFxzK1xTKyg/OlxzfCQpJywgJyAnLCBmbGFncykKKyAgICAgICAgICAgICAgICAgICAgX3NhdmVfbW9kaWZpZWRfdmFsdWUoX2NvbmZpZ192YXJzLCBjdiwgZmxhZ3MpCisKKyAgICByZXR1cm4gX2NvbmZpZ192YXJzCisKKworZGVmIGNvbXBpbGVyX2ZpeHVwKGNvbXBpbGVyX3NvLCBjY19hcmdzKToKKyAgICAiIiIKKyAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgc3RyaXAgJy1pc3lzcm9vdCBQQVRIJyBhbmQgJy1hcmNoIEFSQ0gnIGZyb20gdGhlCisgICAgY29tcGlsZSBmbGFncyBpZiB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIG9uZSB0aGVtIGluIGV4dHJhX2NvbXBpbGVfZmxhZ3MuCisKKyAgICBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlICctYXJjaCBBUkNIJyBhZGRzIGFub3RoZXIgYXJjaGl0ZWN0dXJlIHRvIHRoZQorICAgIGJ1aWxkLCB3aXRob3V0IGEgd2F5IHRvIHJlbW92ZSBhbiBhcmNoaXRlY3R1cmUuIEZ1cnRoZXJtb3JlIEdDQyB3aWxsCisgICAgYmFyZiBpZiBtdWx0aXBsZSAnLWlzeXNyb290JyBhcmd1bWVudHMgYXJlIHByZXNlbnQuCisgICAgIiIiCisgICAgc3RyaXBBcmNoID0gc3RyaXBTeXNyb290ID0gRmFsc2UKKworICAgIGNvbXBpbGVyX3NvID0gbGlzdChjb21waWxlcl9zbykKKworICAgIGlmIG5vdCBfc3VwcG9ydHNfdW5pdmVyc2FsX2J1aWxkcygpOgorICAgICAgICAjIE9TWCBiZWZvcmUgMTAuNC4wLCB0aGVzZSBkb24ndCBzdXBwb3J0IC1hcmNoIGFuZCAtaXN5c3Jvb3QgYXQKKyAgICAgICAgIyBhbGwuCisgICAgICAgIHN0cmlwQXJjaCA9IHN0cmlwU3lzcm9vdCA9IFRydWUKKyAgICBlbHNlOgorICAgICAgICBzdHJpcEFyY2ggPSAnLWFyY2gnIGluIGNjX2FyZ3MKKyAgICAgICAgc3RyaXBTeXNyb290ID0gJy1pc3lzcm9vdCcgaW4gY2NfYXJncworCisgICAgaWYgc3RyaXBBcmNoIG9yICdBUkNIRkxBR1MnIGluIG9zLmVudmlyb246CisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW5kZXggPSBjb21waWxlcl9zby5pbmRleCgnLWFyY2gnKQorICAgICAgICAgICAgICAgICMgU3RyaXAgdGhpcyBhcmd1bWVudCBhbmQgdGhlIG5leHQgb25lOgorICAgICAgICAgICAgICAgIGRlbCBjb21waWxlcl9zb1tpbmRleDppbmRleCsyXQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgIGlmICdBUkNIRkxBR1MnIGluIG9zLmVudmlyb24gYW5kIG5vdCBzdHJpcEFyY2g6CisgICAgICAgICMgVXNlciBzcGVjaWZpZWQgZGlmZmVyZW50IC1hcmNoIGZsYWdzIGluIHRoZSBlbnZpcm9uLAorICAgICAgICAjIHNlZSBhbHNvIGRpc3R1dGlscy5zeXNjb25maWcKKyAgICAgICAgY29tcGlsZXJfc28gPSBjb21waWxlcl9zbyArIG9zLmVudmlyb25bJ0FSQ0hGTEFHUyddLnNwbGl0KCkKKworICAgIGlmIHN0cmlwU3lzcm9vdDoKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbmRleCA9IGNvbXBpbGVyX3NvLmluZGV4KCctaXN5c3Jvb3QnKQorICAgICAgICAgICAgICAgICMgU3RyaXAgdGhpcyBhcmd1bWVudCBhbmQgdGhlIG5leHQgb25lOgorICAgICAgICAgICAgICAgIGRlbCBjb21waWxlcl9zb1tpbmRleDppbmRleCsyXQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICMgQ2hlY2sgaWYgdGhlIFNESyB0aGF0IGlzIHVzZWQgZHVyaW5nIGNvbXBpbGF0aW9uIGFjdHVhbGx5IGV4aXN0cywKKyAgICAjIHRoZSB1bml2ZXJzYWwgYnVpbGQgcmVxdWlyZXMgdGhlIHVzYWdlIG9mIGEgdW5pdmVyc2FsIFNESyBhbmQgbm90IGFsbAorICAgICMgdXNlcnMgaGF2ZSB0aGF0IGluc3RhbGxlZCBieSBkZWZhdWx0LgorICAgIHN5c3Jvb3QgPSBOb25lCisgICAgaWYgJy1pc3lzcm9vdCcgaW4gY2NfYXJnczoKKyAgICAgICAgaWR4ID0gY2NfYXJncy5pbmRleCgnLWlzeXNyb290JykKKyAgICAgICAgc3lzcm9vdCA9IGNjX2FyZ3NbaWR4KzFdCisgICAgZWxpZiAnLWlzeXNyb290JyBpbiBjb21waWxlcl9zbzoKKyAgICAgICAgaWR4ID0gY29tcGlsZXJfc28uaW5kZXgoJy1pc3lzcm9vdCcpCisgICAgICAgIHN5c3Jvb3QgPSBjb21waWxlcl9zb1tpZHgrMV0KKworICAgIGlmIHN5c3Jvb3QgYW5kIG5vdCBvcy5wYXRoLmlzZGlyKHN5c3Jvb3QpOgorICAgICAgICBmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCisgICAgICAgIGxvZy53YXJuKCJDb21waWxpbmcgd2l0aCBhbiBTREsgdGhhdCBkb2Vzbid0IHNlZW0gdG8gZXhpc3Q6ICVzIiwKKyAgICAgICAgICAgICAgICBzeXNyb290KQorICAgICAgICBsb2cud2FybigiUGxlYXNlIGNoZWNrIHlvdXIgWGNvZGUgaW5zdGFsbGF0aW9uIikKKworICAgIHJldHVybiBjb21waWxlcl9zbworCisKK2RlZiBjdXN0b21pemVfY29uZmlnX3ZhcnMoX2NvbmZpZ192YXJzKToKKyAgICAiIiJDdXN0b21pemUgUHl0aG9uIGJ1aWxkIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzLgorCisgICAgQ2FsbGVkIGludGVybmFsbHkgZnJvbSBzeXNjb25maWcgd2l0aCBhIG11dGFibGUgbWFwcGluZworICAgIGNvbnRhaW5pbmcgbmFtZS92YWx1ZSBwYWlycyBwYXJzZWQgZnJvbSB0aGUgY29uZmlndXJlZAorICAgIG1ha2VmaWxlIHVzZWQgdG8gYnVpbGQgdGhpcyBpbnRlcnByZXRlci4gIFJldHVybnMKKyAgICB0aGUgbWFwcGluZyB1cGRhdGVkIGFzIG5lZWRlZCB0byByZWZsZWN0IHRoZSBlbnZpcm9ubWVudAorICAgIGluIHdoaWNoIHRoZSBpbnRlcnByZXRlciBpcyBydW5uaW5nOyBpbiB0aGUgY2FzZSBvZgorICAgIGEgUHl0aG9uIGZyb20gYSBiaW5hcnkgaW5zdGFsbGVyLCB0aGUgaW5zdGFsbGVkCisgICAgZW52aXJvbm1lbnQgbWF5IGJlIHZlcnkgZGlmZmVyZW50IGZyb20gdGhlIGJ1aWxkCisgICAgZW52aXJvbm1lbnQsIGkuZS4gZGlmZmVyZW50IE9TIGxldmVscywgZGlmZmVyZW50CisgICAgYnVpbHQgdG9vbHMsIGRpZmZlcmVudCBhdmFpbGFibGUgQ1BVIGFyY2hpdGVjdHVyZXMuCisKKyAgICBUaGlzIGN1c3RvbWl6YXRpb24gaXMgcGVyZm9ybWVkIHdoZW5ldmVyCisgICAgZGlzdHV0aWxzLnN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcnMoKSBpcyBmaXJzdAorICAgIGNhbGxlZC4gIEl0IG1heSBiZSB1c2VkIGluIGVudmlyb25tZW50cyB3aGVyZSBubworICAgIGNvbXBpbGVycyBhcmUgcHJlc2VudCwgaS5lLiB3aGVuIGluc3RhbGxpbmcgcHVyZQorICAgIFB5dGhvbiBkaXN0cy4gIEN1c3RvbWl6YXRpb24gb2YgY29tcGlsZXIgcGF0aHMKKyAgICBhbmQgZGV0ZWN0aW9uIG9mIHVuYXZhaWxhYmxlIGFyY2hzIGlzIGRlZmVycmVkCisgICAgdW50aWwgdGhlIGZpcnN0IGV4dGVuc2lvbiBtb2R1bGUgYnVpbGQgaXMKKyAgICByZXF1ZXN0ZWQgKGluIGRpc3R1dGlscy5zeXNjb25maWcuY3VzdG9taXplX2NvbXBpbGVyKS4KKworICAgIEN1cnJlbnRseSBjYWxsZWQgZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnCisgICAgIiIiCisKKyAgICBpZiBub3QgX3N1cHBvcnRzX3VuaXZlcnNhbF9idWlsZHMoKToKKyAgICAgICAgIyBPbiBNYWMgT1MgWCBiZWZvcmUgMTAuNCwgY2hlY2sgaWYgLWFyY2ggYW5kIC1pc3lzcm9vdAorICAgICAgICAjIGFyZSBpbiBDRkxBR1Mgb3IgTERGTEFHUyBhbmQgcmVtb3ZlIHRoZW0gaWYgdGhleSBhcmUuCisgICAgICAgICMgVGhpcyBpcyBuZWVkZWQgd2hlbiBidWlsZGluZyBleHRlbnNpb25zIG9uIGEgMTAuMyBzeXN0ZW0KKyAgICAgICAgIyB1c2luZyBhIHVuaXZlcnNhbCBidWlsZCBvZiBweXRob24uCisgICAgICAgIF9yZW1vdmVfdW5pdmVyc2FsX2ZsYWdzKF9jb25maWdfdmFycykKKworICAgICMgQWxsb3cgdXNlciB0byBvdmVycmlkZSBhbGwgYXJjaHMgd2l0aCBBUkNIRkxBR1MgZW52IHZhcgorICAgIF9vdmVycmlkZV9hbGxfYXJjaHMoX2NvbmZpZ192YXJzKQorCisgICAgIyBSZW1vdmUgcmVmZXJlbmNlcyB0byBzZGtzIHRoYXQgYXJlIG5vdCBmb3VuZAorICAgIF9jaGVja19mb3JfdW5hdmFpbGFibGVfc2RrKF9jb25maWdfdmFycykKKworICAgIHJldHVybiBfY29uZmlnX3ZhcnMKKworCitkZWYgY3VzdG9taXplX2NvbXBpbGVyKF9jb25maWdfdmFycyk6CisgICAgIiIiQ3VzdG9taXplIGNvbXBpbGVyIHBhdGggYW5kIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzLgorCisgICAgVGhpcyBjdXN0b21pemF0aW9uIGlzIHBlcmZvcm1lZCB3aGVuIHRoZSBmaXJzdAorICAgIGV4dGVuc2lvbiBtb2R1bGUgYnVpbGQgaXMgcmVxdWVzdGVkCisgICAgaW4gZGlzdHV0aWxzLnN5c2NvbmZpZy5jdXN0b21pemVfY29tcGlsZXIpLgorICAgICIiIgorCisgICAgIyBGaW5kIGEgY29tcGlsZXIgdG8gdXNlIGZvciBleHRlbnNpb24gbW9kdWxlIGJ1aWxkcworICAgIF9maW5kX2FwcHJvcHJpYXRlX2NvbXBpbGVyKF9jb25maWdfdmFycykKKworICAgICMgUmVtb3ZlIHBwYyBhcmNoIGZsYWdzIGlmIG5vdCBzdXBwb3J0ZWQgaGVyZQorICAgIF9yZW1vdmVfdW5zdXBwb3J0ZWRfYXJjaHMoX2NvbmZpZ192YXJzKQorCisgICAgIyBBbGxvdyB1c2VyIHRvIG92ZXJyaWRlIGFsbCBhcmNocyB3aXRoIEFSQ0hGTEFHUyBlbnYgdmFyCisgICAgX292ZXJyaWRlX2FsbF9hcmNocyhfY29uZmlnX3ZhcnMpCisKKyAgICByZXR1cm4gX2NvbmZpZ192YXJzCisKKworZGVmIGdldF9wbGF0Zm9ybV9vc3goX2NvbmZpZ192YXJzLCBvc25hbWUsIHJlbGVhc2UsIG1hY2hpbmUpOgorICAgICIiIkZpbHRlciB2YWx1ZXMgZm9yIGdldF9wbGF0Zm9ybSgpIiIiCisgICAgIyBjYWxsZWQgZnJvbSBnZXRfcGxhdGZvcm0oKSBpbiBzeXNjb25maWcgYW5kIGRpc3R1dGlscy51dGlsCisgICAgIworICAgICMgRm9yIG91ciBwdXJwb3Nlcywgd2UnbGwgYXNzdW1lIHRoYXQgdGhlIHN5c3RlbSB2ZXJzaW9uIGZyb20KKyAgICAjIGRpc3R1dGlscycgcGVyc3BlY3RpdmUgaXMgd2hhdCBNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgaXMgc2V0CisgICAgIyB0by4gVGhpcyBtYWtlcyB0aGUgY29tcGF0aWJpbGl0eSBzdG9yeSBhIGJpdCBtb3JlIHNhbmUgYmVjYXVzZSB0aGUKKyAgICAjIG1hY2hpbmUgaXMgZ29pbmcgdG8gY29tcGlsZSBhbmQgbGluayBhcyBpZiBpdCB3ZXJlCisgICAgIyBNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQuCisKKyAgICBtYWN2ZXIgPSBfY29uZmlnX3ZhcnMuZ2V0KCdNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQnLCAnJykKKyAgICBtYWNyZWxlYXNlID0gX2dldF9zeXN0ZW1fdmVyc2lvbigpIG9yIG1hY3ZlcgorICAgIG1hY3ZlciA9IG1hY3ZlciBvciBtYWNyZWxlYXNlCisKKyAgICBpZiBtYWN2ZXI6CisgICAgICAgIHJlbGVhc2UgPSBtYWN2ZXIKKyAgICAgICAgb3NuYW1lID0gIm1hY29zeCIKKworICAgICAgICAjIFVzZSB0aGUgb3JpZ2luYWwgQ0ZMQUdTIHZhbHVlLCBpZiBhdmFpbGFibGUsIHNvIHRoYXQgd2UKKyAgICAgICAgIyByZXR1cm4gdGhlIHNhbWUgbWFjaGluZSB0eXBlIGZvciB0aGUgcGxhdGZvcm0gc3RyaW5nLgorICAgICAgICAjIE90aGVyd2lzZSwgZGlzdHV0aWxzIG1heSBjb25zaWRlciB0aGlzIGEgY3Jvc3MtY29tcGlsaW5nCisgICAgICAgICMgY2FzZSBhbmQgZGlzYWxsb3cgaW5zdGFsbHMuCisgICAgICAgIGNmbGFncyA9IF9jb25maWdfdmFycy5nZXQoX0lOSVRQUkUrJ0NGTEFHUycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29uZmlnX3ZhcnMuZ2V0KCdDRkxBR1MnLCAnJykpCisgICAgICAgIGlmIG1hY3JlbGVhc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbWFjcmVsZWFzZSA9IHR1cGxlKGludChpKSBmb3IgaSBpbiBtYWNyZWxlYXNlLnNwbGl0KCcuJylbMDoyXSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIG1hY3JlbGVhc2UgPSAoMTAsIDApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIGFzc3VtZSBubyB1bml2ZXJzYWwgc3VwcG9ydAorICAgICAgICAgICAgbWFjcmVsZWFzZSA9ICgxMCwgMCkKKworICAgICAgICBpZiAobWFjcmVsZWFzZSA+PSAoMTAsIDQpKSBhbmQgJy1hcmNoJyBpbiBjZmxhZ3Muc3RyaXAoKToKKyAgICAgICAgICAgICMgVGhlIHVuaXZlcnNhbCBidWlsZCB3aWxsIGJ1aWxkIGZhdCBiaW5hcmllcywgYnV0IG5vdCBvbgorICAgICAgICAgICAgIyBzeXN0ZW1zIGJlZm9yZSAxMC40CisKKyAgICAgICAgICAgIG1hY2hpbmUgPSAnZmF0JworCisgICAgICAgICAgICBhcmNocyA9IHJlLmZpbmRhbGwoJy1hcmNoXHMrKFxTKyknLCBjZmxhZ3MpCisgICAgICAgICAgICBhcmNocyA9IHR1cGxlKHNvcnRlZChzZXQoYXJjaHMpKSkKKworICAgICAgICAgICAgaWYgbGVuKGFyY2hzKSA9PSAxOgorICAgICAgICAgICAgICAgIG1hY2hpbmUgPSBhcmNoc1swXQorICAgICAgICAgICAgZWxpZiBhcmNocyA9PSAoJ2kzODYnLCAncHBjJyk6CisgICAgICAgICAgICAgICAgbWFjaGluZSA9ICdmYXQnCisgICAgICAgICAgICBlbGlmIGFyY2hzID09ICgnaTM4NicsICd4ODZfNjQnKToKKyAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ2ludGVsJworICAgICAgICAgICAgZWxpZiBhcmNocyA9PSAoJ2kzODYnLCAncHBjJywgJ3g4Nl82NCcpOgorICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAnZmF0MycKKyAgICAgICAgICAgIGVsaWYgYXJjaHMgPT0gKCdwcGM2NCcsICd4ODZfNjQnKToKKyAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ2ZhdDY0JworICAgICAgICAgICAgZWxpZiBhcmNocyA9PSAoJ2kzODYnLCAncHBjJywgJ3BwYzY0JywgJ3g4Nl82NCcpOgorICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAndW5pdmVyc2FsJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICJEb24ndCBrbm93IG1hY2hpbmUgdmFsdWUgZm9yIGFyY2hzPSVyIiAlIChhcmNocywpKQorCisgICAgICAgIGVsaWYgbWFjaGluZSA9PSAnaTM4Nic6CisgICAgICAgICAgICAjIE9uIE9TWCB0aGUgbWFjaGluZSB0eXBlIHJldHVybmVkIGJ5IHVuYW1lIGlzIGFsd2F5cyB0aGUKKyAgICAgICAgICAgICMgMzItYml0IHZhcmlhbnQsIGV2ZW4gaWYgdGhlIGV4ZWN1dGFibGUgYXJjaGl0ZWN0dXJlIGlzCisgICAgICAgICAgICAjIHRoZSA2NC1iaXQgdmFyaWFudAorICAgICAgICAgICAgaWYgc3lzLm1heGludCA+PSAyKiozMjoKKyAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ3g4Nl82NCcKKworICAgICAgICBlbGlmIG1hY2hpbmUgaW4gKCdQb3dlclBDJywgJ1Bvd2VyX01hY2ludG9zaCcpOgorICAgICAgICAgICAgIyBQaWNrIGEgc2FuZSBuYW1lIGZvciB0aGUgUFBDIGFyY2hpdGVjdHVyZS4KKyAgICAgICAgICAgICMgU2VlICdpMzg2JyBjYXNlCisgICAgICAgICAgICBpZiBzeXMubWF4aW50ID49IDIqKjMyOgorICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAncHBjNjQnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAncHBjJworCisgICAgcmV0dXJuIChvc25hbWUsIHJlbGVhc2UsIG1hY2hpbmUpCmRpZmYgLS1naXQgYS9MaWIvX3B5aW8ucHkgYi9MaWIvX3B5aW8ucHkKaW5kZXggMzRkMGM0Yy4uM2FjYmM2NSAxMDA2NDQKLS0tIGEvTGliL19weWlvLnB5CisrKyBiL0xpYi9fcHlpby5weQpAQCAtMTkyLDM4ICsxOTIsNDUgQEAKICAgICAgICAgICAgICAgICAgKGFwcGVuZGluZyBhbmQgImEiIG9yICIiKSArCiAgICAgICAgICAgICAgICAgICh1cGRhdGluZyBhbmQgIisiIG9yICIiKSwKICAgICAgICAgICAgICAgICAgY2xvc2VmZCkKLSAgICBsaW5lX2J1ZmZlcmluZyA9IEZhbHNlCi0gICAgaWYgYnVmZmVyaW5nID09IDEgb3IgYnVmZmVyaW5nIDwgMCBhbmQgcmF3LmlzYXR0eSgpOgotICAgICAgICBidWZmZXJpbmcgPSAtMQotICAgICAgICBsaW5lX2J1ZmZlcmluZyA9IFRydWUKLSAgICBpZiBidWZmZXJpbmcgPCAwOgotICAgICAgICBidWZmZXJpbmcgPSBERUZBVUxUX0JVRkZFUl9TSVpFCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGJzID0gb3MuZnN0YXQocmF3LmZpbGVubygpKS5zdF9ibGtzaXplCi0gICAgICAgIGV4Y2VwdCAob3MuZXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKLSAgICAgICAgICAgIHBhc3MKKyAgICByZXN1bHQgPSByYXcKKyAgICB0cnk6CisgICAgICAgIGxpbmVfYnVmZmVyaW5nID0gRmFsc2UKKyAgICAgICAgaWYgYnVmZmVyaW5nID09IDEgb3IgYnVmZmVyaW5nIDwgMCBhbmQgcmF3LmlzYXR0eSgpOgorICAgICAgICAgICAgYnVmZmVyaW5nID0gLTEKKyAgICAgICAgICAgIGxpbmVfYnVmZmVyaW5nID0gVHJ1ZQorICAgICAgICBpZiBidWZmZXJpbmcgPCAwOgorICAgICAgICAgICAgYnVmZmVyaW5nID0gREVGQVVMVF9CVUZGRVJfU0laRQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGJzID0gb3MuZnN0YXQocmF3LmZpbGVubygpKS5zdF9ibGtzaXplCisgICAgICAgICAgICBleGNlcHQgKG9zLmVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBicyA+IDE6CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcmluZyA9IGJzCisgICAgICAgIGlmIGJ1ZmZlcmluZyA8IDA6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkIGJ1ZmZlcmluZyBzaXplIikKKyAgICAgICAgaWYgYnVmZmVyaW5nID09IDA6CisgICAgICAgICAgICBpZiBiaW5hcnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2FuJ3QgaGF2ZSB1bmJ1ZmZlcmVkIHRleHQgSS9PIikKKyAgICAgICAgaWYgdXBkYXRpbmc6CisgICAgICAgICAgICBidWZmZXIgPSBCdWZmZXJlZFJhbmRvbShyYXcsIGJ1ZmZlcmluZykKKyAgICAgICAgZWxpZiB3cml0aW5nIG9yIGFwcGVuZGluZzoKKyAgICAgICAgICAgIGJ1ZmZlciA9IEJ1ZmZlcmVkV3JpdGVyKHJhdywgYnVmZmVyaW5nKQorICAgICAgICBlbGlmIHJlYWRpbmc6CisgICAgICAgICAgICBidWZmZXIgPSBCdWZmZXJlZFJlYWRlcihyYXcsIGJ1ZmZlcmluZykKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGlmIGJzID4gMToKLSAgICAgICAgICAgICAgICBidWZmZXJpbmcgPSBicwotICAgIGlmIGJ1ZmZlcmluZyA8IDA6Ci0gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImludmFsaWQgYnVmZmVyaW5nIHNpemUiKQotICAgIGlmIGJ1ZmZlcmluZyA9PSAwOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5rbm93biBtb2RlOiAlciIgJSBtb2RlKQorICAgICAgICByZXN1bHQgPSBidWZmZXIKICAgICAgICAgaWYgYmluYXJ5OgotICAgICAgICAgICAgcmV0dXJuIHJhdwotICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW4ndCBoYXZlIHVuYnVmZmVyZWQgdGV4dCBJL08iKQotICAgIGlmIHVwZGF0aW5nOgotICAgICAgICBidWZmZXIgPSBCdWZmZXJlZFJhbmRvbShyYXcsIGJ1ZmZlcmluZykKLSAgICBlbGlmIHdyaXRpbmcgb3IgYXBwZW5kaW5nOgotICAgICAgICBidWZmZXIgPSBCdWZmZXJlZFdyaXRlcihyYXcsIGJ1ZmZlcmluZykKLSAgICBlbGlmIHJlYWRpbmc6Ci0gICAgICAgIGJ1ZmZlciA9IEJ1ZmZlcmVkUmVhZGVyKHJhdywgYnVmZmVyaW5nKQotICAgIGVsc2U6Ci0gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVua25vd24gbW9kZTogJXIiICUgbW9kZSkKLSAgICBpZiBiaW5hcnk6Ci0gICAgICAgIHJldHVybiBidWZmZXIKLSAgICB0ZXh0ID0gVGV4dElPV3JhcHBlcihidWZmZXIsIGVuY29kaW5nLCBlcnJvcnMsIG5ld2xpbmUsIGxpbmVfYnVmZmVyaW5nKQotICAgIHRleHQubW9kZSA9IG1vZGUKLSAgICByZXR1cm4gdGV4dAorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICB0ZXh0ID0gVGV4dElPV3JhcHBlcihidWZmZXIsIGVuY29kaW5nLCBlcnJvcnMsIG5ld2xpbmUsIGxpbmVfYnVmZmVyaW5nKQorICAgICAgICByZXN1bHQgPSB0ZXh0CisgICAgICAgIHRleHQubW9kZSA9IG1vZGUKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgIGV4Y2VwdDoKKyAgICAgICAgcmVzdWx0LmNsb3NlKCkKKyAgICAgICAgcmFpc2UKIAogCiBjbGFzcyBEb2NEZXNjcmlwdG9yOgpAQCAtMjk4LDcgKzMwNSw3IEBACiAgICAgZGVmIHNlZWsoc2VsZiwgcG9zLCB3aGVuY2U9MCk6CiAgICAgICAgICIiIkNoYW5nZSBzdHJlYW0gcG9zaXRpb24uCiAKLSAgICAgICAgQ2hhbmdlIHRoZSBzdHJlYW0gcG9zaXRpb24gdG8gYnl0ZSBvZmZzZXQgb2Zmc2V0LiBvZmZzZXQgaXMKKyAgICAgICAgQ2hhbmdlIHRoZSBzdHJlYW0gcG9zaXRpb24gdG8gYnl0ZSBvZmZzZXQgcG9zLiBBcmd1bWVudCBwb3MgaXMKICAgICAgICAgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gdGhlIHBvc2l0aW9uIGluZGljYXRlZCBieSB3aGVuY2UuICBWYWx1ZXMKICAgICAgICAgZm9yIHdoZW5jZSBhcmU6CiAKQEAgLTM0MCw4ICszNDcsMTAgQEAKICAgICAgICAgVGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdCBpZiB0aGUgZmlsZSBpcyBhbHJlYWR5IGNsb3NlZC4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIG5vdCBzZWxmLl9fY2xvc2VkOgotICAgICAgICAgICAgc2VsZi5mbHVzaCgpCi0gICAgICAgICAgICBzZWxmLl9fY2xvc2VkID0gVHJ1ZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzZWxmLl9fY2xvc2VkID0gVHJ1ZQogCiAgICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgICIiIkRlc3RydWN0b3IuICBDYWxscyBjbG9zZSgpLiIiIgpAQCAtODgzLDEyICs4OTIsMTggQEAKICAgICAgICAgcmV0dXJuIHBvcwogCiAgICAgZGVmIHJlYWRhYmxlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUuIikKICAgICAgICAgcmV0dXJuIFRydWUKIAogICAgIGRlZiB3cml0YWJsZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlLiIpCiAgICAgICAgIHJldHVybiBUcnVlCiAKICAgICBkZWYgc2Vla2FibGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZS4iKQogICAgICAgICByZXR1cm4gVHJ1ZQogCiAKQEAgLTE0NTEsNyArMTQ2Niw3IEBACiAgICAgZW5hYmxlZC4gIFdpdGggdGhpcyBlbmFibGVkLCBvbiBpbnB1dCwgdGhlIGxpbmVzIGVuZGluZ3MgJ1xuJywgJ1xyJywKICAgICBvciAnXHJcbicgYXJlIHRyYW5zbGF0ZWQgdG8gJ1xuJyBiZWZvcmUgYmVpbmcgcmV0dXJuZWQgdG8gdGhlCiAgICAgY2FsbGVyLiBDb252ZXJzZWx5LCBvbiBvdXRwdXQsICdcbicgaXMgdHJhbnNsYXRlZCB0byB0aGUgc3lzdGVtCi0gICAgZGVmYXVsdCBsaW5lIHNlcGVyYXRvciwgb3MubGluZXNlcC4gSWYgbmV3bGluZSBpcyBhbnkgb3RoZXIgb2YgaXRzCisgICAgZGVmYXVsdCBsaW5lIHNlcGFyYXRvciwgb3MubGluZXNlcC4gSWYgbmV3bGluZSBpcyBhbnkgb3RoZXIgb2YgaXRzCiAgICAgbGVnYWwgdmFsdWVzLCB0aGF0IG5ld2xpbmUgYmVjb21lcyB0aGUgbmV3bGluZSB3aGVuIHRoZSBmaWxlIGlzIHJlYWQKICAgICBhbmQgaXQgaXMgcmV0dXJuZWQgdW50cmFuc2xhdGVkLiBPbiBvdXRwdXQsICdcbicgaXMgY29udmVydGVkIHRvIHRoZQogICAgIG5ld2xpbmUuCkBAIC0xNTQ2LDYgKzE1NjEsOCBAQAogICAgICAgICByZXR1cm4gc2VsZi5fYnVmZmVyCiAKICAgICBkZWYgc2Vla2FibGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZS4iKQogICAgICAgICByZXR1cm4gc2VsZi5fc2Vla2FibGUKIAogICAgIGRlZiByZWFkYWJsZShzZWxmKToKQEAgLTE1NjAsOCArMTU3NywxMCBAQAogCiAgICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICBpZiBzZWxmLmJ1ZmZlciBpcyBub3QgTm9uZSBhbmQgbm90IHNlbGYuY2xvc2VkOgotICAgICAgICAgICAgc2VsZi5mbHVzaCgpCi0gICAgICAgICAgICBzZWxmLmJ1ZmZlci5jbG9zZSgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHNlbGYuYnVmZmVyLmNsb3NlKCkKIAogICAgIEBwcm9wZXJ0eQogICAgIGRlZiBjbG9zZWQoc2VsZik6CkBAIC0xOTg1LDcgKzIwMDQsMTMgQEAKIAogICAgIGRlZiBnZXR2YWx1ZShzZWxmKToKICAgICAgICAgc2VsZi5mbHVzaCgpCi0gICAgICAgIHJldHVybiBzZWxmLmJ1ZmZlci5nZXR2YWx1ZSgpLmRlY29kZShzZWxmLl9lbmNvZGluZywgc2VsZi5fZXJyb3JzKQorICAgICAgICBkZWNvZGVyID0gc2VsZi5fZGVjb2RlciBvciBzZWxmLl9nZXRfZGVjb2RlcigpCisgICAgICAgIG9sZF9zdGF0ZSA9IGRlY29kZXIuZ2V0c3RhdGUoKQorICAgICAgICBkZWNvZGVyLnJlc2V0KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGRlY29kZXIuZGVjb2RlKHNlbGYuYnVmZmVyLmdldHZhbHVlKCksIGZpbmFsPVRydWUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBkZWNvZGVyLnNldHN0YXRlKG9sZF9zdGF0ZSkKIAogICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICAgIyBUZXh0SU9XcmFwcGVyIHRlbGxzIHRoZSBlbmNvZGluZyBpbiBpdHMgcmVwci4gSW4gU3RyaW5nSU8sCmRpZmYgLS1naXQgYS9MaWIvX3N0cnB0aW1lLnB5IGIvTGliL19zdHJwdGltZS5weQppbmRleCBkOTU2M2I5Li4wNDJkYjZmIDEwMDY0NAotLS0gYS9MaWIvX3N0cnB0aW1lLnB5CisrKyBiL0xpYi9fc3RycHRpbWUucHkKQEAgLTIyMiw3ICsyMjIsNyBAQAogICAgICAgICAiIiJDb252ZXJ0IGEgbGlzdCB0byBhIHJlZ2V4IHN0cmluZyBmb3IgbWF0Y2hpbmcgYSBkaXJlY3RpdmUuCiAKICAgICAgICAgV2FudCBwb3NzaWJsZSBtYXRjaGluZyB2YWx1ZXMgdG8gYmUgZnJvbSBsb25nZXN0IHRvIHNob3J0ZXN0LiAgVGhpcwotICAgICAgICBwcmV2ZW50cyB0aGUgcG9zc2liaWxpdHkgb2YgYSBtYXRjaCBvY2N1cmluZyBmb3IgYSB2YWx1ZSB0aGF0IGFsc28KKyAgICAgICAgcHJldmVudHMgdGhlIHBvc3NpYmlsaXR5IG9mIGEgbWF0Y2ggb2NjdXJyaW5nIGZvciBhIHZhbHVlIHRoYXQgYWxzbwogICAgICAgICBhIHN1YnN0cmluZyBvZiBhIGxhcmdlciB2YWx1ZSB0aGF0IHNob3VsZCBoYXZlIG1hdGNoZWQgKGUuZy4sICdhYmMnCiAgICAgICAgIG1hdGNoaW5nIHdoZW4gJ2FiY2RlZicgc2hvdWxkIGhhdmUgYmVlbiB0aGUgbWF0Y2gpLgogCkBAIC0zMjYsNyArMzI2LDggQEAKICAgICBpZiBsZW4oZGF0YV9zdHJpbmcpICE9IGZvdW5kLmVuZCgpOgogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmNvbnZlcnRlZCBkYXRhIHJlbWFpbnM6ICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfc3RyaW5nW2ZvdW5kLmVuZCgpOl0pCi0gICAgeWVhciA9IDE5MDAKKworICAgIHllYXIgPSBOb25lCiAgICAgbW9udGggPSBkYXkgPSAxCiAgICAgaG91ciA9IG1pbnV0ZSA9IHNlY29uZCA9IGZyYWN0aW9uID0gMAogICAgIHR6ID0gLTEKQEAgLTQyNSw2ICs0MjYsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgIHR6ID0gdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgbGVhcF95ZWFyX2ZpeCA9IEZhbHNlCisgICAgaWYgeWVhciBpcyBOb25lIGFuZCBtb250aCA9PSAyIGFuZCBkYXkgPT0gMjk6CisgICAgICAgIHllYXIgPSAxOTA0ICAjIDE5MDQgaXMgZmlyc3QgbGVhcCB5ZWFyIG9mIDIwdGggY2VudHVyeQorICAgICAgICBsZWFwX3llYXJfZml4ID0gVHJ1ZQorICAgIGVsaWYgeWVhciBpcyBOb25lOgorICAgICAgICB5ZWFyID0gMTkwMAogICAgICMgSWYgd2Uga25vdyB0aGUgd2VlayBvZiB0aGUgeWVhciBhbmQgd2hhdCBkYXkgb2YgdGhhdCB3ZWVrLCB3ZSBjYW4gZmlndXJlCiAgICAgIyBvdXQgdGhlIEp1bGlhbiBkYXkgb2YgdGhlIHllYXIuCiAgICAgaWYganVsaWFuID09IC0xIGFuZCB3ZWVrX29mX3llYXIgIT0gLTEgYW5kIHdlZWtkYXkgIT0gLTE6CkBAIC00NDYsNiArNDUzLDEyIEBACiAgICAgICAgIGRheSA9IGRhdGV0aW1lX3Jlc3VsdC5kYXkKICAgICBpZiB3ZWVrZGF5ID09IC0xOgogICAgICAgICB3ZWVrZGF5ID0gZGF0ZXRpbWVfZGF0ZSh5ZWFyLCBtb250aCwgZGF5KS53ZWVrZGF5KCkKKyAgICBpZiBsZWFwX3llYXJfZml4OgorICAgICAgICAjIHRoZSBjYWxsZXIgZGlkbid0IHN1cHBseSBhIHllYXIgYnV0IGFza2VkIGZvciBGZWIgMjl0aC4gV2UgY291bGRuJ3QKKyAgICAgICAgIyB1c2UgdGhlIGRlZmF1bHQgb2YgMTkwMCBmb3IgY29tcHV0YXRpb25zLiBXZSBzZXQgaXQgYmFjayB0byBlbnN1cmUKKyAgICAgICAgIyB0aGF0IEZlYnJ1YXJ5IDI5dGggaXMgc21hbGxlciB0aGFuIE1hcmNoIDFzdC4KKyAgICAgICAgeWVhciA9IDE5MDAKKwogICAgIHJldHVybiAodGltZS5zdHJ1Y3RfdGltZSgoeWVhciwgbW9udGgsIGRheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vla2RheSwganVsaWFuLCB0eikpLCBmcmFjdGlvbikKZGlmZiAtLWdpdCBhL0xpYi9fd2Vha3JlZnNldC5weSBiL0xpYi9fd2Vha3JlZnNldC5weQppbmRleCBmZmE1ZTMxLi42Mjc5NTliIDEwMDY0NAotLS0gYS9MaWIvX3dlYWtyZWZzZXQucHkKKysrIGIvTGliL193ZWFrcmVmc2V0LnB5CkBAIC02MCwxMCArNjAsMTIgQEAKICAgICAgICAgICAgIGZvciBpdGVtcmVmIGluIHNlbGYuZGF0YToKICAgICAgICAgICAgICAgICBpdGVtID0gaXRlbXJlZigpCiAgICAgICAgICAgICAgICAgaWYgaXRlbSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgIyBDYXZlYXQ6IHRoZSBpdGVyYXRvciB3aWxsIGtlZXAgYSBzdHJvbmcgcmVmZXJlbmNlIHRvCisgICAgICAgICAgICAgICAgICAgICMgYGl0ZW1gIHVudGlsIGl0IGlzIHJlc3VtZWQgb3IgY2xvc2VkLgogICAgICAgICAgICAgICAgICAgICB5aWVsZCBpdGVtCiAKICAgICBkZWYgX19sZW5fXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHN1bSh4KCkgaXMgbm90IE5vbmUgZm9yIHggaW4gc2VsZi5kYXRhKQorICAgICAgICByZXR1cm4gbGVuKHNlbGYuZGF0YSkgLSBsZW4oc2VsZi5fcGVuZGluZ19yZW1vdmFscykKIAogICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgaXRlbSk6CiAgICAgICAgIHRyeToKQEAgLTExNiwzNiArMTE4LDIxIEBACiAgICAgZGVmIHVwZGF0ZShzZWxmLCBvdGhlcik6CiAgICAgICAgIGlmIHNlbGYuX3BlbmRpbmdfcmVtb3ZhbHM6CiAgICAgICAgICAgICBzZWxmLl9jb21taXRfcmVtb3ZhbHMoKQotICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6Ci0gICAgICAgICAgICBzZWxmLmRhdGEudXBkYXRlKG90aGVyLmRhdGEpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBmb3IgZWxlbWVudCBpbiBvdGhlcjoKLSAgICAgICAgICAgICAgICBzZWxmLmFkZChlbGVtZW50KQorICAgICAgICBmb3IgZWxlbWVudCBpbiBvdGhlcjoKKyAgICAgICAgICAgIHNlbGYuYWRkKGVsZW1lbnQpCiAKICAgICBkZWYgX19pb3JfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIHNlbGYudXBkYXRlKG90aGVyKQogICAgICAgICByZXR1cm4gc2VsZgogCi0gICAgIyBIZWxwZXIgZnVuY3Rpb25zIGZvciBzaW1wbGUgZGVsZWdhdGluZyBtZXRob2RzLgotICAgIGRlZiBfYXBwbHkoc2VsZiwgb3RoZXIsIG1ldGhvZCk6Ci0gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6Ci0gICAgICAgICAgICBvdGhlciA9IHNlbGYuX19jbGFzc19fKG90aGVyKQotICAgICAgICBuZXdkYXRhID0gbWV0aG9kKG90aGVyLmRhdGEpCi0gICAgICAgIG5ld3NldCA9IHNlbGYuX19jbGFzc19fKCkKLSAgICAgICAgbmV3c2V0LmRhdGEgPSBuZXdkYXRhCi0gICAgICAgIHJldHVybiBuZXdzZXQKLQogICAgIGRlZiBkaWZmZXJlbmNlKHNlbGYsIG90aGVyKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX2FwcGx5KG90aGVyLCBzZWxmLmRhdGEuZGlmZmVyZW5jZSkKKyAgICAgICAgbmV3c2V0ID0gc2VsZi5jb3B5KCkKKyAgICAgICAgbmV3c2V0LmRpZmZlcmVuY2VfdXBkYXRlKG90aGVyKQorICAgICAgICByZXR1cm4gbmV3c2V0CiAgICAgX19zdWJfXyA9IGRpZmZlcmVuY2UKIAogICAgIGRlZiBkaWZmZXJlbmNlX3VwZGF0ZShzZWxmLCBvdGhlcik6Ci0gICAgICAgIGlmIHNlbGYuX3BlbmRpbmdfcmVtb3ZhbHM6Ci0gICAgICAgICAgICBzZWxmLl9jb21taXRfcmVtb3ZhbHMoKQotICAgICAgICBpZiBzZWxmIGlzIG90aGVyOgotICAgICAgICAgICAgc2VsZi5kYXRhLmNsZWFyKCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZGF0YS5kaWZmZXJlbmNlX3VwZGF0ZShyZWYoaXRlbSkgZm9yIGl0ZW0gaW4gb3RoZXIpCisgICAgICAgIHNlbGYuX19pc3ViX18ob3RoZXIpCiAgICAgZGVmIF9faXN1Yl9fKHNlbGYsIG90aGVyKToKICAgICAgICAgaWYgc2VsZi5fcGVuZGluZ19yZW1vdmFsczoKICAgICAgICAgICAgIHNlbGYuX2NvbW1pdF9yZW1vdmFscygpCkBAIC0xNTYsMTMgKzE0MywxMSBAQAogICAgICAgICByZXR1cm4gc2VsZgogCiAgICAgZGVmIGludGVyc2VjdGlvbihzZWxmLCBvdGhlcik6Ci0gICAgICAgIHJldHVybiBzZWxmLl9hcHBseShvdGhlciwgc2VsZi5kYXRhLmludGVyc2VjdGlvbikKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKGl0ZW0gZm9yIGl0ZW0gaW4gb3RoZXIgaWYgaXRlbSBpbiBzZWxmKQogICAgIF9fYW5kX18gPSBpbnRlcnNlY3Rpb24KIAogICAgIGRlZiBpbnRlcnNlY3Rpb25fdXBkYXRlKHNlbGYsIG90aGVyKToKLSAgICAgICAgaWYgc2VsZi5fcGVuZGluZ19yZW1vdmFsczoKLSAgICAgICAgICAgIHNlbGYuX2NvbW1pdF9yZW1vdmFscygpCi0gICAgICAgIHNlbGYuZGF0YS5pbnRlcnNlY3Rpb25fdXBkYXRlKHJlZihpdGVtKSBmb3IgaXRlbSBpbiBvdGhlcikKKyAgICAgICAgc2VsZi5fX2lhbmRfXyhvdGhlcikKICAgICBkZWYgX19pYW5kX18oc2VsZiwgb3RoZXIpOgogICAgICAgICBpZiBzZWxmLl9wZW5kaW5nX3JlbW92YWxzOgogICAgICAgICAgICAgc2VsZi5fY29tbWl0X3JlbW92YWxzKCkKQEAgLTE3MSw0NSArMTU2LDQ4IEBACiAKICAgICBkZWYgaXNzdWJzZXQoc2VsZiwgb3RoZXIpOgogICAgICAgICByZXR1cm4gc2VsZi5kYXRhLmlzc3Vic2V0KHJlZihpdGVtKSBmb3IgaXRlbSBpbiBvdGhlcikKLSAgICBfX2x0X18gPSBpc3N1YnNldAorICAgIF9fbGVfXyA9IGlzc3Vic2V0CiAKLSAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKLSAgICAgICAgcmV0dXJuIHNlbGYuZGF0YSA8PSBzZXQocmVmKGl0ZW0pIGZvciBpdGVtIGluIG90aGVyKQorICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhIDwgc2V0KHJlZihpdGVtKSBmb3IgaXRlbSBpbiBvdGhlcikKIAogICAgIGRlZiBpc3N1cGVyc2V0KHNlbGYsIG90aGVyKToKICAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5pc3N1cGVyc2V0KHJlZihpdGVtKSBmb3IgaXRlbSBpbiBvdGhlcikKLSAgICBfX2d0X18gPSBpc3N1cGVyc2V0CisgICAgX19nZV9fID0gaXNzdXBlcnNldAogCi0gICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgIHJldHVybiBzZWxmLmRhdGEgPj0gc2V0KHJlZihpdGVtKSBmb3IgaXRlbSBpbiBvdGhlcikKKyAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YSA+IHNldChyZWYoaXRlbSkgZm9yIGl0ZW0gaW4gb3RoZXIpCiAKICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgICByZXR1cm4gc2VsZi5kYXRhID09IHNldChyZWYoaXRlbSkgZm9yIGl0ZW0gaW4gb3RoZXIpCiAKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgb3Bwb3NpdGUgPSBzZWxmLl9fZXFfXyhvdGhlcikKKyAgICAgICAgaWYgb3Bwb3NpdGUgaXMgTm90SW1wbGVtZW50ZWQ6CisgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICAgICAgcmV0dXJuIG5vdCBvcHBvc2l0ZQorCiAgICAgZGVmIHN5bW1ldHJpY19kaWZmZXJlbmNlKHNlbGYsIG90aGVyKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX2FwcGx5KG90aGVyLCBzZWxmLmRhdGEuc3ltbWV0cmljX2RpZmZlcmVuY2UpCisgICAgICAgIG5ld3NldCA9IHNlbGYuY29weSgpCisgICAgICAgIG5ld3NldC5zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUob3RoZXIpCisgICAgICAgIHJldHVybiBuZXdzZXQKICAgICBfX3hvcl9fID0gc3ltbWV0cmljX2RpZmZlcmVuY2UKIAogICAgIGRlZiBzeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUoc2VsZiwgb3RoZXIpOgotICAgICAgICBpZiBzZWxmLl9wZW5kaW5nX3JlbW92YWxzOgotICAgICAgICAgICAgc2VsZi5fY29tbWl0X3JlbW92YWxzKCkKLSAgICAgICAgaWYgc2VsZiBpcyBvdGhlcjoKLSAgICAgICAgICAgIHNlbGYuZGF0YS5jbGVhcigpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmRhdGEuc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlKHJlZihpdGVtKSBmb3IgaXRlbSBpbiBvdGhlcikKKyAgICAgICAgc2VsZi5fX2l4b3JfXyhvdGhlcikKICAgICBkZWYgX19peG9yX18oc2VsZiwgb3RoZXIpOgogICAgICAgICBpZiBzZWxmLl9wZW5kaW5nX3JlbW92YWxzOgogICAgICAgICAgICAgc2VsZi5fY29tbWl0X3JlbW92YWxzKCkKICAgICAgICAgaWYgc2VsZiBpcyBvdGhlcjoKICAgICAgICAgICAgIHNlbGYuZGF0YS5jbGVhcigpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmRhdGEuc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlKHJlZihpdGVtKSBmb3IgaXRlbSBpbiBvdGhlcikKKyAgICAgICAgICAgIHNlbGYuZGF0YS5zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUocmVmKGl0ZW0sIHNlbGYuX3JlbW92ZSkgZm9yIGl0ZW0gaW4gb3RoZXIpCiAgICAgICAgIHJldHVybiBzZWxmCiAKICAgICBkZWYgdW5pb24oc2VsZiwgb3RoZXIpOgotICAgICAgICByZXR1cm4gc2VsZi5fYXBwbHkob3RoZXIsIHNlbGYuZGF0YS51bmlvbikKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKGUgZm9yIHMgaW4gKHNlbGYsIG90aGVyKSBmb3IgZSBpbiBzKQogICAgIF9fb3JfXyA9IHVuaW9uCiAKICAgICBkZWYgaXNkaXNqb2ludChzZWxmLCBvdGhlcik6CmRpZmYgLS1naXQgYS9MaWIvYWlmYy5weSBiL0xpYi9haWZjLnB5CmluZGV4IDc3YTlkN2QuLjlhYzcxMGYgMTAwNjQ0Ci0tLSBhL0xpYi9haWZjLnB5CisrKyBiL0xpYi9haWZjLnB5CkBAIC0xMjMsNyArMTIzLDcgQEAKIGNvbXByZXNzaW9uIHR5cGUsIGFuZCB0aGVuIHdyaXRlIGF1ZGlvIGZyYW1lcyB1c2luZyB3cml0ZWZyYW1lc3Jhdy4KIFdoZW4gYWxsIGZyYW1lcyBoYXZlIGJlZW4gd3JpdHRlbiwgZWl0aGVyIGNhbGwgd3JpdGVmcmFtZXMoJycpIG9yCiBjbG9zZSgpIHRvIHBhdGNoIHVwIHRoZSBzaXplcyBpbiB0aGUgaGVhZGVyLgotTWFya3MgY2FuIGJlIGFkZGVkIGFueXRpbWUuICBJZiB0aGVyZSBhcmUgYW55IG1hcmtzLCB5cHUgbXVzdCBjYWxsCitNYXJrcyBjYW4gYmUgYWRkZWQgYW55dGltZS4gIElmIHRoZXJlIGFyZSBhbnkgbWFya3MsIHlvdSBtdXN0IGNhbGwKIGNsb3NlKCkgYWZ0ZXIgYWxsIGZyYW1lcyBoYXZlIGJlZW4gd3JpdHRlbi4KIFRoZSBjbG9zZSgpIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBjbGFzcyBpbnN0YW5jZQogaXMgZGVzdHJveWVkLgpAQCAtMTYyLDYgKzE2MiwxMiBAQAogICAgIGV4Y2VwdCBzdHJ1Y3QuZXJyb3I6CiAgICAgICAgIHJhaXNlIEVPRkVycm9yCiAKK2RlZiBfcmVhZF91c2hvcnQoZmlsZSk6CisgICAgdHJ5OgorICAgICAgICByZXR1cm4gc3RydWN0LnVucGFjaygnPkgnLCBmaWxlLnJlYWQoMikpWzBdCisgICAgZXhjZXB0IHN0cnVjdC5lcnJvcjoKKyAgICAgICAgcmFpc2UgRU9GRXJyb3IKKwogZGVmIF9yZWFkX3N0cmluZyhmaWxlKToKICAgICBsZW5ndGggPSBvcmQoZmlsZS5yZWFkKDEpKQogICAgIGlmIGxlbmd0aCA9PSAwOgpAQCAtMTk0LDEzICsyMDAsMTkgQEAKIGRlZiBfd3JpdGVfc2hvcnQoZiwgeCk6CiAgICAgZi53cml0ZShzdHJ1Y3QucGFjaygnPmgnLCB4KSkKIAorZGVmIF93cml0ZV91c2hvcnQoZiwgeCk6CisgICAgZi53cml0ZShzdHJ1Y3QucGFjaygnPkgnLCB4KSkKKwogZGVmIF93cml0ZV9sb25nKGYsIHgpOgorICAgIGYud3JpdGUoc3RydWN0LnBhY2soJz5sJywgeCkpCisKK2RlZiBfd3JpdGVfdWxvbmcoZiwgeCk6CiAgICAgZi53cml0ZShzdHJ1Y3QucGFjaygnPkwnLCB4KSkKIAogZGVmIF93cml0ZV9zdHJpbmcoZiwgcyk6CiAgICAgaWYgbGVuKHMpID4gMjU1OgogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJzdHJpbmcgZXhjZWVkcyBtYXhpbXVtIHBzdHJpbmcgbGVuZ3RoIikKLSAgICBmLndyaXRlKGNocihsZW4ocykpKQorICAgIGYud3JpdGUoc3RydWN0LnBhY2soJ0InLCBsZW4ocykpKQogICAgIGYud3JpdGUocykKICAgICBpZiBsZW4ocykgJiAxID09IDA6CiAgICAgICAgIGYud3JpdGUoY2hyKDApKQpAQCAtMjE4LDcgKzIzMCw3IEBACiAgICAgICAgIGxvbWFudCA9IDAKICAgICBlbHNlOgogICAgICAgICBmbWFudCwgZXhwb24gPSBtYXRoLmZyZXhwKHgpCi0gICAgICAgIGlmIGV4cG9uID4gMTYzODQgb3IgZm1hbnQgPj0gMTogICAgICMgSW5maW5pdHkgb3IgTmFOCisgICAgICAgIGlmIGV4cG9uID4gMTYzODQgb3IgZm1hbnQgPj0gMSBvciBmbWFudCAhPSBmbWFudDogIyBJbmZpbml0eSBvciBOYU4KICAgICAgICAgICAgIGV4cG9uID0gc2lnbnwweDdGRkYKICAgICAgICAgICAgIGhpbWFudCA9IDAKICAgICAgICAgICAgIGxvbWFudCA9IDAKQEAgLTIzNCw5ICsyNDYsOSBAQAogICAgICAgICAgICAgZm1hbnQgPSBtYXRoLmxkZXhwKGZtYW50IC0gZnNtYW50LCAzMikKICAgICAgICAgICAgIGZzbWFudCA9IG1hdGguZmxvb3IoZm1hbnQpCiAgICAgICAgICAgICBsb21hbnQgPSBsb25nKGZzbWFudCkKLSAgICBfd3JpdGVfc2hvcnQoZiwgZXhwb24pCi0gICAgX3dyaXRlX2xvbmcoZiwgaGltYW50KQotICAgIF93cml0ZV9sb25nKGYsIGxvbWFudCkKKyAgICBfd3JpdGVfdXNob3J0KGYsIGV4cG9uKQorICAgIF93cml0ZV91bG9uZyhmLCBoaW1hbnQpCisgICAgX3dyaXRlX3Vsb25nKGYsIGxvbWFudCkKIAogZnJvbSBjaHVuayBpbXBvcnQgQ2h1bmsKIApAQCAtNDY4LDMxICs0ODAsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvbnZlcnQgPSBzZWxmLl9hZHBjbTJsaW4KLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZyYW1lc2l6ZSA9IHNlbGYuX2ZyYW1lc2l6ZSAvLyA0CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zYW1wd2lkdGggPSAyCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgICAjIGZvciBVTEFXIGFuZCBBTEFXIHRyeSBDb21wcmVzc2lvbiBMaWJyYXJ5CiAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICBpbXBvcnQgY2wKICAgICAgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX2NvbXB0eXBlID09ICdVTEFXJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fY29tcHR5cGUgaW4gKCdVTEFXJywgJ3VsYXcnKToKICAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgYXVkaW9vcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvbnZlcnQgPSBzZWxmLl91bGF3MmxpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZyYW1lc2l6ZSA9IHNlbGYuX2ZyYW1lc2l6ZSAvLyAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2FtcHdpZHRoID0gMgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdjYW5ub3QgcmVhZCBjb21wcmVzc2VkIEFJRkYtQyBmaWxlcycKLSAgICAgICAgICAgICAgICBpZiBzZWxmLl9jb21wdHlwZSA9PSAnVUxBVyc6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fY29tcHR5cGUgaW4gKCdVTEFXJywgJ3VsYXcnKToKICAgICAgICAgICAgICAgICAgICAgc2NoZW1lID0gY2wuRzcxMV9VTEFXCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZyYW1lc2l6ZSA9IHNlbGYuX2ZyYW1lc2l6ZSAvLyAyCi0gICAgICAgICAgICAgICAgZWxpZiBzZWxmLl9jb21wdHlwZSA9PSAnQUxBVyc6CisgICAgICAgICAgICAgICAgZWxpZiBzZWxmLl9jb21wdHlwZSBpbiAoJ0FMQVcnLCAnYWxhdycpOgogICAgICAgICAgICAgICAgICAgICBzY2hlbWUgPSBjbC5HNzExX0FMQVcKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5fZnJhbWVzaXplID0gc2VsZi5fZnJhbWVzaXplIC8vIDIKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICByYWlzZSBFcnJvciwgJ3Vuc3VwcG9ydGVkIGNvbXByZXNzaW9uIHR5cGUnCiAgICAgICAgICAgICAgICAgc2VsZi5fZGVjb21wID0gY2wuT3BlbkRlY29tcHJlc3NvcihzY2hlbWUpCiAgICAgICAgICAgICAgICAgc2VsZi5fY29udmVydCA9IHNlbGYuX2RlY29tcF9kYXRhCisgICAgICAgICAgICAgICAgc2VsZi5fc2FtcHdpZHRoID0gMgogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5fY29tcHR5cGUgPSAnTk9ORScKICAgICAgICAgICAgIHNlbGYuX2NvbXBuYW1lID0gJ25vdCBjb21wcmVzc2VkJwpAQCAtNjQzLDcgKzY1NCw3IEBACiAgICAgZGVmIHNldGNvbXB0eXBlKHNlbGYsIGNvbXB0eXBlLCBjb21wbmFtZSk6CiAgICAgICAgIGlmIHNlbGYuX25mcmFtZXN3cml0dGVuOgogICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdjYW5ub3QgY2hhbmdlIHBhcmFtZXRlcnMgYWZ0ZXIgc3RhcnRpbmcgdG8gd3JpdGUnCi0gICAgICAgIGlmIGNvbXB0eXBlIG5vdCBpbiAoJ05PTkUnLCAnVUxBVycsICdBTEFXJywgJ0c3MjInKToKKyAgICAgICAgaWYgY29tcHR5cGUgbm90IGluICgnTk9ORScsICdVTEFXJywgJ3VsYXcnLCAnQUxBVycsICdhbGF3JywgJ0c3MjInKToKICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAndW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gdHlwZScKICAgICAgICAgc2VsZi5fY29tcHR5cGUgPSBjb21wdHlwZQogICAgICAgICBzZWxmLl9jb21wbmFtZSA9IGNvbXBuYW1lCkBAIC02NjMsNyArNjc0LDcgQEAKICAgICAgICAgbmNoYW5uZWxzLCBzYW1wd2lkdGgsIGZyYW1lcmF0ZSwgbmZyYW1lcywgY29tcHR5cGUsIGNvbXBuYW1lID0gaW5mbwogICAgICAgICBpZiBzZWxmLl9uZnJhbWVzd3JpdHRlbjoKICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnY2Fubm90IGNoYW5nZSBwYXJhbWV0ZXJzIGFmdGVyIHN0YXJ0aW5nIHRvIHdyaXRlJwotICAgICAgICBpZiBjb21wdHlwZSBub3QgaW4gKCdOT05FJywgJ1VMQVcnLCAnQUxBVycsICdHNzIyJyk6CisgICAgICAgIGlmIGNvbXB0eXBlIG5vdCBpbiAoJ05PTkUnLCAnVUxBVycsICd1bGF3JywgJ0FMQVcnLCAnYWxhdycsICdHNzIyJyk6CiAgICAgICAgICAgICByYWlzZSBFcnJvciwgJ3Vuc3VwcG9ydGVkIGNvbXByZXNzaW9uIHR5cGUnCiAgICAgICAgIHNlbGYuc2V0bmNoYW5uZWxzKG5jaGFubmVscykKICAgICAgICAgc2VsZi5zZXRzYW1wd2lkdGgoc2FtcHdpZHRoKQpAQCAtNzIwLDIyICs3MzEsMjggQEAKICAgICAgICAgICAgIHNlbGYuX3BhdGNoaGVhZGVyKCkKIAogICAgIGRlZiBjbG9zZShzZWxmKToKLSAgICAgICAgc2VsZi5fZW5zdXJlX2hlYWRlcl93cml0dGVuKDApCi0gICAgICAgIGlmIHNlbGYuX2RhdGF3cml0dGVuICYgMToKLSAgICAgICAgICAgICMgcXVpY2sgcGFkIHRvIGV2ZW4gc2l6ZQotICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZShjaHIoMCkpCi0gICAgICAgICAgICBzZWxmLl9kYXRhd3JpdHRlbiA9IHNlbGYuX2RhdGF3cml0dGVuICsgMQotICAgICAgICBzZWxmLl93cml0ZW1hcmtlcnMoKQotICAgICAgICBpZiBzZWxmLl9uZnJhbWVzd3JpdHRlbiAhPSBzZWxmLl9uZnJhbWVzIG9yIFwKLSAgICAgICAgICAgICAgc2VsZi5fZGF0YWxlbmd0aCAhPSBzZWxmLl9kYXRhd3JpdHRlbiBvciBcCi0gICAgICAgICAgICAgIHNlbGYuX21hcmtsZW5ndGg6Ci0gICAgICAgICAgICBzZWxmLl9wYXRjaGhlYWRlcigpCi0gICAgICAgIGlmIHNlbGYuX2NvbXA6Ci0gICAgICAgICAgICBzZWxmLl9jb21wLkNsb3NlQ29tcHJlc3NvcigpCi0gICAgICAgICAgICBzZWxmLl9jb21wID0gTm9uZQotICAgICAgICAjIFByZXZlbnQgcmVmIGN5Y2xlcwotICAgICAgICBzZWxmLl9jb252ZXJ0ID0gTm9uZQotICAgICAgICBzZWxmLl9maWxlLmNsb3NlKCkKKyAgICAgICAgaWYgc2VsZi5fZmlsZSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2Vuc3VyZV9oZWFkZXJfd3JpdHRlbigwKQorICAgICAgICAgICAgaWYgc2VsZi5fZGF0YXdyaXR0ZW4gJiAxOgorICAgICAgICAgICAgICAgICMgcXVpY2sgcGFkIHRvIGV2ZW4gc2l6ZQorICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoY2hyKDApKQorICAgICAgICAgICAgICAgIHNlbGYuX2RhdGF3cml0dGVuID0gc2VsZi5fZGF0YXdyaXR0ZW4gKyAxCisgICAgICAgICAgICBzZWxmLl93cml0ZW1hcmtlcnMoKQorICAgICAgICAgICAgaWYgc2VsZi5fbmZyYW1lc3dyaXR0ZW4gIT0gc2VsZi5fbmZyYW1lcyBvciBcCisgICAgICAgICAgICAgICAgICBzZWxmLl9kYXRhbGVuZ3RoICE9IHNlbGYuX2RhdGF3cml0dGVuIG9yIFwKKyAgICAgICAgICAgICAgICAgIHNlbGYuX21hcmtsZW5ndGg6CisgICAgICAgICAgICAgICAgc2VsZi5fcGF0Y2hoZWFkZXIoKQorICAgICAgICAgICAgaWYgc2VsZi5fY29tcDoKKyAgICAgICAgICAgICAgICBzZWxmLl9jb21wLkNsb3NlQ29tcHJlc3NvcigpCisgICAgICAgICAgICAgICAgc2VsZi5fY29tcCA9IE5vbmUKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICMgUHJldmVudCByZWYgY3ljbGVzCisgICAgICAgICAgICBzZWxmLl9jb252ZXJ0ID0gTm9uZQorICAgICAgICAgICAgZiA9IHNlbGYuX2ZpbGUKKyAgICAgICAgICAgIHNlbGYuX2ZpbGUgPSBOb25lCisgICAgICAgICAgICBmLmNsb3NlKCkKIAogICAgICMKICAgICAjIEludGVybmFsIG1ldGhvZHMuCkBAIC03NjEsNyArNzc4LDcgQEAKIAogICAgIGRlZiBfZW5zdXJlX2hlYWRlcl93cml0dGVuKHNlbGYsIGRhdGFzaXplKToKICAgICAgICAgaWYgbm90IHNlbGYuX25mcmFtZXN3cml0dGVuOgotICAgICAgICAgICAgaWYgc2VsZi5fY29tcHR5cGUgaW4gKCdVTEFXJywgJ0FMQVcnKToKKyAgICAgICAgICAgIGlmIHNlbGYuX2NvbXB0eXBlIGluICgnVUxBVycsICd1bGF3JywgJ0FMQVcnLCAnYWxhdycpOgogICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9zYW1wd2lkdGg6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NhbXB3aWR0aCA9IDIKICAgICAgICAgICAgICAgICBpZiBzZWxmLl9zYW1wd2lkdGggIT0gMjoKQEAgLTc4Niw3ICs4MDMsNyBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBpbXBvcnQgY2wKICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgaWYgc2VsZi5fY29tcHR5cGUgPT0gJ1VMQVcnOgorICAgICAgICAgICAgaWYgc2VsZi5fY29tcHR5cGUgaW4gKCdVTEFXJywgJ3VsYXcnKToKICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBhdWRpb29wCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvbnZlcnQgPSBzZWxmLl9saW4ydWxhdwpAQCAtNzk0LDkgKzgxMSw5IEBACiAgICAgICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2Nhbm5vdCB3cml0ZSBjb21wcmVzc2VkIEFJRkYtQyBmaWxlcycKLSAgICAgICAgaWYgc2VsZi5fY29tcHR5cGUgPT0gJ1VMQVcnOgorICAgICAgICBpZiBzZWxmLl9jb21wdHlwZSBpbiAoJ1VMQVcnLCAndWxhdycpOgogICAgICAgICAgICAgc2NoZW1lID0gY2wuRzcxMV9VTEFXCi0gICAgICAgIGVsaWYgc2VsZi5fY29tcHR5cGUgPT0gJ0FMQVcnOgorICAgICAgICBlbGlmIHNlbGYuX2NvbXB0eXBlIGluICgnQUxBVycsICdhbGF3Jyk6CiAgICAgICAgICAgICBzY2hlbWUgPSBjbC5HNzExX0FMQVcKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAndW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gdHlwZScKQEAgLTgyNyw3ICs4NDQsNyBAQAogICAgICAgICBpZiBzZWxmLl9kYXRhbGVuZ3RoICYgMToKICAgICAgICAgICAgIHNlbGYuX2RhdGFsZW5ndGggPSBzZWxmLl9kYXRhbGVuZ3RoICsgMQogICAgICAgICBpZiBzZWxmLl9haWZjOgotICAgICAgICAgICAgaWYgc2VsZi5fY29tcHR5cGUgaW4gKCdVTEFXJywgJ0FMQVcnKToKKyAgICAgICAgICAgIGlmIHNlbGYuX2NvbXB0eXBlIGluICgnVUxBVycsICd1bGF3JywgJ0FMQVcnLCAnYWxhdycpOgogICAgICAgICAgICAgICAgIHNlbGYuX2RhdGFsZW5ndGggPSBzZWxmLl9kYXRhbGVuZ3RoIC8vIDIKICAgICAgICAgICAgICAgICBpZiBzZWxmLl9kYXRhbGVuZ3RoICYgMToKICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGF0YWxlbmd0aCA9IHNlbGYuX2RhdGFsZW5ndGggKyAxCkBAIC04MzUsMzAgKzg1MiwzOCBAQAogICAgICAgICAgICAgICAgIHNlbGYuX2RhdGFsZW5ndGggPSAoc2VsZi5fZGF0YWxlbmd0aCArIDMpIC8vIDQKICAgICAgICAgICAgICAgICBpZiBzZWxmLl9kYXRhbGVuZ3RoICYgMToKICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGF0YWxlbmd0aCA9IHNlbGYuX2RhdGFsZW5ndGggKyAxCi0gICAgICAgIHNlbGYuX2Zvcm1fbGVuZ3RoX3BvcyA9IHNlbGYuX2ZpbGUudGVsbCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2Zvcm1fbGVuZ3RoX3BvcyA9IHNlbGYuX2ZpbGUudGVsbCgpCisgICAgICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIElPRXJyb3IpOgorICAgICAgICAgICAgc2VsZi5fZm9ybV9sZW5ndGhfcG9zID0gTm9uZQogICAgICAgICBjb21tbGVuZ3RoID0gc2VsZi5fd3JpdGVfZm9ybV9sZW5ndGgoc2VsZi5fZGF0YWxlbmd0aCkKICAgICAgICAgaWYgc2VsZi5fYWlmYzoKICAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJ0FJRkMnKQogICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnRlZFUicpCi0gICAgICAgICAgICBfd3JpdGVfbG9uZyhzZWxmLl9maWxlLCA0KQotICAgICAgICAgICAgX3dyaXRlX2xvbmcoc2VsZi5fZmlsZSwgc2VsZi5fdmVyc2lvbikKKyAgICAgICAgICAgIF93cml0ZV91bG9uZyhzZWxmLl9maWxlLCA0KQorICAgICAgICAgICAgX3dyaXRlX3Vsb25nKHNlbGYuX2ZpbGUsIHNlbGYuX3ZlcnNpb24pCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKCdBSUZGJykKICAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnQ09NTScpCi0gICAgICAgIF93cml0ZV9sb25nKHNlbGYuX2ZpbGUsIGNvbW1sZW5ndGgpCisgICAgICAgIF93cml0ZV91bG9uZyhzZWxmLl9maWxlLCBjb21tbGVuZ3RoKQogICAgICAgICBfd3JpdGVfc2hvcnQoc2VsZi5fZmlsZSwgc2VsZi5fbmNoYW5uZWxzKQotICAgICAgICBzZWxmLl9uZnJhbWVzX3BvcyA9IHNlbGYuX2ZpbGUudGVsbCgpCi0gICAgICAgIF93cml0ZV9sb25nKHNlbGYuX2ZpbGUsIHNlbGYuX25mcmFtZXMpCi0gICAgICAgIF93cml0ZV9zaG9ydChzZWxmLl9maWxlLCBzZWxmLl9zYW1wd2lkdGggKiA4KQorICAgICAgICBpZiBzZWxmLl9mb3JtX2xlbmd0aF9wb3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl9uZnJhbWVzX3BvcyA9IHNlbGYuX2ZpbGUudGVsbCgpCisgICAgICAgIF93cml0ZV91bG9uZyhzZWxmLl9maWxlLCBzZWxmLl9uZnJhbWVzKQorICAgICAgICBpZiBzZWxmLl9jb21wdHlwZSBpbiAoJ1VMQVcnLCAndWxhdycsICdBTEFXJywgJ2FsYXcnLCAnRzcyMicpOgorICAgICAgICAgICAgX3dyaXRlX3Nob3J0KHNlbGYuX2ZpbGUsIDgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBfd3JpdGVfc2hvcnQoc2VsZi5fZmlsZSwgc2VsZi5fc2FtcHdpZHRoICogOCkKICAgICAgICAgX3dyaXRlX2Zsb2F0KHNlbGYuX2ZpbGUsIHNlbGYuX2ZyYW1lcmF0ZSkKICAgICAgICAgaWYgc2VsZi5fYWlmYzoKICAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoc2VsZi5fY29tcHR5cGUpCiAgICAgICAgICAgICBfd3JpdGVfc3RyaW5nKHNlbGYuX2ZpbGUsIHNlbGYuX2NvbXBuYW1lKQogICAgICAgICBzZWxmLl9maWxlLndyaXRlKCdTU05EJykKLSAgICAgICAgc2VsZi5fc3NuZF9sZW5ndGhfcG9zID0gc2VsZi5fZmlsZS50ZWxsKCkKLSAgICAgICAgX3dyaXRlX2xvbmcoc2VsZi5fZmlsZSwgc2VsZi5fZGF0YWxlbmd0aCArIDgpCi0gICAgICAgIF93cml0ZV9sb25nKHNlbGYuX2ZpbGUsIDApCi0gICAgICAgIF93cml0ZV9sb25nKHNlbGYuX2ZpbGUsIDApCisgICAgICAgIGlmIHNlbGYuX2Zvcm1fbGVuZ3RoX3BvcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX3NzbmRfbGVuZ3RoX3BvcyA9IHNlbGYuX2ZpbGUudGVsbCgpCisgICAgICAgIF93cml0ZV91bG9uZyhzZWxmLl9maWxlLCBzZWxmLl9kYXRhbGVuZ3RoICsgOCkKKyAgICAgICAgX3dyaXRlX3Vsb25nKHNlbGYuX2ZpbGUsIDApCisgICAgICAgIF93cml0ZV91bG9uZyhzZWxmLl9maWxlLCAwKQogCiAgICAgZGVmIF93cml0ZV9mb3JtX2xlbmd0aChzZWxmLCBkYXRhbGVuZ3RoKToKICAgICAgICAgaWYgc2VsZi5fYWlmYzoKQEAgLTg2OSw4ICs4OTQsOCBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgY29tbWxlbmd0aCA9IDE4CiAgICAgICAgICAgICB2ZXJzbGVuZ3RoID0gMAotICAgICAgICBfd3JpdGVfbG9uZyhzZWxmLl9maWxlLCA0ICsgdmVyc2xlbmd0aCArIHNlbGYuX21hcmtsZW5ndGggKyBcCi0gICAgICAgICAgICAgICAgICAgIDggKyBjb21tbGVuZ3RoICsgMTYgKyBkYXRhbGVuZ3RoKQorICAgICAgICBfd3JpdGVfdWxvbmcoc2VsZi5fZmlsZSwgNCArIHZlcnNsZW5ndGggKyBzZWxmLl9tYXJrbGVuZ3RoICsgXAorICAgICAgICAgICAgICAgICAgICAgOCArIGNvbW1sZW5ndGggKyAxNiArIGRhdGFsZW5ndGgpCiAgICAgICAgIHJldHVybiBjb21tbGVuZ3RoCiAKICAgICBkZWYgX3BhdGNoaGVhZGVyKHNlbGYpOgpAQCAtODg4LDkgKzkxMyw5IEBACiAgICAgICAgIHNlbGYuX2ZpbGUuc2VlayhzZWxmLl9mb3JtX2xlbmd0aF9wb3MsIDApCiAgICAgICAgIGR1bW15ID0gc2VsZi5fd3JpdGVfZm9ybV9sZW5ndGgoZGF0YWxlbmd0aCkKICAgICAgICAgc2VsZi5fZmlsZS5zZWVrKHNlbGYuX25mcmFtZXNfcG9zLCAwKQotICAgICAgICBfd3JpdGVfbG9uZyhzZWxmLl9maWxlLCBzZWxmLl9uZnJhbWVzd3JpdHRlbikKKyAgICAgICAgX3dyaXRlX3Vsb25nKHNlbGYuX2ZpbGUsIHNlbGYuX25mcmFtZXN3cml0dGVuKQogICAgICAgICBzZWxmLl9maWxlLnNlZWsoc2VsZi5fc3NuZF9sZW5ndGhfcG9zLCAwKQotICAgICAgICBfd3JpdGVfbG9uZyhzZWxmLl9maWxlLCBkYXRhbGVuZ3RoICsgOCkKKyAgICAgICAgX3dyaXRlX3Vsb25nKHNlbGYuX2ZpbGUsIGRhdGFsZW5ndGggKyA4KQogICAgICAgICBzZWxmLl9maWxlLnNlZWsoY3VycG9zLCAwKQogICAgICAgICBzZWxmLl9uZnJhbWVzID0gc2VsZi5fbmZyYW1lc3dyaXR0ZW4KICAgICAgICAgc2VsZi5fZGF0YWxlbmd0aCA9IGRhdGFsZW5ndGgKQEAgLTkwNSwxMyArOTMwLDEzIEBACiAgICAgICAgICAgICBsZW5ndGggPSBsZW5ndGggKyBsZW4obmFtZSkgKyAxICsgNgogICAgICAgICAgICAgaWYgbGVuKG5hbWUpICYgMSA9PSAwOgogICAgICAgICAgICAgICAgIGxlbmd0aCA9IGxlbmd0aCArIDEKLSAgICAgICAgX3dyaXRlX2xvbmcoc2VsZi5fZmlsZSwgbGVuZ3RoKQorICAgICAgICBfd3JpdGVfdWxvbmcoc2VsZi5fZmlsZSwgbGVuZ3RoKQogICAgICAgICBzZWxmLl9tYXJrbGVuZ3RoID0gbGVuZ3RoICsgOAogICAgICAgICBfd3JpdGVfc2hvcnQoc2VsZi5fZmlsZSwgbGVuKHNlbGYuX21hcmtlcnMpKQogICAgICAgICBmb3IgbWFya2VyIGluIHNlbGYuX21hcmtlcnM6CiAgICAgICAgICAgICBpZCwgcG9zLCBuYW1lID0gbWFya2VyCiAgICAgICAgICAgICBfd3JpdGVfc2hvcnQoc2VsZi5fZmlsZSwgaWQpCi0gICAgICAgICAgICBfd3JpdGVfbG9uZyhzZWxmLl9maWxlLCBwb3MpCisgICAgICAgICAgICBfd3JpdGVfdWxvbmcoc2VsZi5fZmlsZSwgcG9zKQogICAgICAgICAgICAgX3dyaXRlX3N0cmluZyhzZWxmLl9maWxlLCBuYW1lKQogCiBkZWYgb3BlbihmLCBtb2RlPU5vbmUpOgpAQCAtOTM1LDIzICs5NjAsMjcgQEAKICAgICAgICAgc3lzLmFyZ3YuYXBwZW5kKCcvdXNyL2RlbW9zL2RhdGEvYXVkaW8vYmFjaC5haWZmJykKICAgICBmbiA9IHN5cy5hcmd2WzFdCiAgICAgZiA9IG9wZW4oZm4sICdyJykKLSAgICBwcmludCAiUmVhZGluZyIsIGZuCi0gICAgcHJpbnQgIm5jaGFubmVscyA9IiwgZi5nZXRuY2hhbm5lbHMoKQotICAgIHByaW50ICJuZnJhbWVzICAgPSIsIGYuZ2V0bmZyYW1lcygpCi0gICAgcHJpbnQgInNhbXB3aWR0aCA9IiwgZi5nZXRzYW1wd2lkdGgoKQotICAgIHByaW50ICJmcmFtZXJhdGUgPSIsIGYuZ2V0ZnJhbWVyYXRlKCkKLSAgICBwcmludCAiY29tcHR5cGUgID0iLCBmLmdldGNvbXB0eXBlKCkKLSAgICBwcmludCAiY29tcG5hbWUgID0iLCBmLmdldGNvbXBuYW1lKCkKLSAgICBpZiBzeXMuYXJndlsyOl06Ci0gICAgICAgIGduID0gc3lzLmFyZ3ZbMl0KLSAgICAgICAgcHJpbnQgIldyaXRpbmciLCBnbgotICAgICAgICBnID0gb3BlbihnbiwgJ3cnKQotICAgICAgICBnLnNldHBhcmFtcyhmLmdldHBhcmFtcygpKQotICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgZGF0YSA9IGYucmVhZGZyYW1lcygxMDI0KQotICAgICAgICAgICAgaWYgbm90IGRhdGE6Ci0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGcud3JpdGVmcmFtZXMoZGF0YSkKLSAgICAgICAgZy5jbG9zZSgpCisgICAgdHJ5OgorICAgICAgICBwcmludCAiUmVhZGluZyIsIGZuCisgICAgICAgIHByaW50ICJuY2hhbm5lbHMgPSIsIGYuZ2V0bmNoYW5uZWxzKCkKKyAgICAgICAgcHJpbnQgIm5mcmFtZXMgICA9IiwgZi5nZXRuZnJhbWVzKCkKKyAgICAgICAgcHJpbnQgInNhbXB3aWR0aCA9IiwgZi5nZXRzYW1wd2lkdGgoKQorICAgICAgICBwcmludCAiZnJhbWVyYXRlID0iLCBmLmdldGZyYW1lcmF0ZSgpCisgICAgICAgIHByaW50ICJjb21wdHlwZSAgPSIsIGYuZ2V0Y29tcHR5cGUoKQorICAgICAgICBwcmludCAiY29tcG5hbWUgID0iLCBmLmdldGNvbXBuYW1lKCkKKyAgICAgICAgaWYgc3lzLmFyZ3ZbMjpdOgorICAgICAgICAgICAgZ24gPSBzeXMuYXJndlsyXQorICAgICAgICAgICAgcHJpbnQgIldyaXRpbmciLCBnbgorICAgICAgICAgICAgZyA9IG9wZW4oZ24sICd3JykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBnLnNldHBhcmFtcyhmLmdldHBhcmFtcygpKQorICAgICAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBmLnJlYWRmcmFtZXMoMTAyNCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGRhdGE6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBnLndyaXRlZnJhbWVzKGRhdGEpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGcuY2xvc2UoKQorICAgICAgICAgICAgcHJpbnQgIkRvbmUuIgorICAgIGZpbmFsbHk6CiAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICBwcmludCAiRG9uZS4iCmRpZmYgLS1naXQgYS9MaWIvYXJncGFyc2UucHkgYi9MaWIvYXJncGFyc2UucHkKaW5kZXggYTkxMjlkZS4uYjViYjE5YSAxMDA2NDQKLS0tIGEvTGliL2FyZ3BhcnNlLnB5CisrKyBiL0xpYi9hcmdwYXJzZS5weQpAQCAtMTY4LDYgKzE2OCw4IEBACiAgICAgICAgIHNlbGYuX3Byb2cgPSBwcm9nCiAgICAgICAgIHNlbGYuX2luZGVudF9pbmNyZW1lbnQgPSBpbmRlbnRfaW5jcmVtZW50CiAgICAgICAgIHNlbGYuX21heF9oZWxwX3Bvc2l0aW9uID0gbWF4X2hlbHBfcG9zaXRpb24KKyAgICAgICAgc2VsZi5fbWF4X2hlbHBfcG9zaXRpb24gPSBtaW4obWF4X2hlbHBfcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCh3aWR0aCAtIDIwLCBpbmRlbnRfaW5jcmVtZW50ICogMikpCiAgICAgICAgIHNlbGYuX3dpZHRoID0gd2lkdGgKIAogICAgICAgICBzZWxmLl9jdXJyZW50X2luZGVudCA9IDAKQEAgLTMzOSw3ICszNDEsNyBAQAogICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9sZW4gPSBsZW4oaW5kZW50KSAtIDEKICAgICAgICAgICAgICAgICAgICAgZm9yIHBhcnQgaW4gcGFydHM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiBsaW5lX2xlbiArIDEgKyBsZW4ocGFydCkgPiB0ZXh0X3dpZHRoOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluZV9sZW4gKyAxICsgbGVuKHBhcnQpID4gdGV4dF93aWR0aCBhbmQgbGluZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoaW5kZW50ICsgJyAnLmpvaW4obGluZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IFtdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9sZW4gPSBsZW4oaW5kZW50KSAtIDEKQEAgLTQ3OCw3ICs0ODAsNyBAQAogICAgIGRlZiBfZm9ybWF0X3RleHQoc2VsZiwgdGV4dCk6CiAgICAgICAgIGlmICclKHByb2cpJyBpbiB0ZXh0OgogICAgICAgICAgICAgdGV4dCA9IHRleHQgJSBkaWN0KHByb2c9c2VsZi5fcHJvZykKLSAgICAgICAgdGV4dF93aWR0aCA9IHNlbGYuX3dpZHRoIC0gc2VsZi5fY3VycmVudF9pbmRlbnQKKyAgICAgICAgdGV4dF93aWR0aCA9IG1heChzZWxmLl93aWR0aCAtIHNlbGYuX2N1cnJlbnRfaW5kZW50LCAxMSkKICAgICAgICAgaW5kZW50ID0gJyAnICogc2VsZi5fY3VycmVudF9pbmRlbnQKICAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGxfdGV4dCh0ZXh0LCB0ZXh0X3dpZHRoLCBpbmRlbnQpICsgJ1xuXG4nCiAKQEAgLTQ4Niw3ICs0ODgsNyBAQAogICAgICAgICAjIGRldGVybWluZSB0aGUgcmVxdWlyZWQgd2lkdGggYW5kIHRoZSBlbnRyeSBsYWJlbAogICAgICAgICBoZWxwX3Bvc2l0aW9uID0gbWluKHNlbGYuX2FjdGlvbl9tYXhfbGVuZ3RoICsgMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9tYXhfaGVscF9wb3NpdGlvbikKLSAgICAgICAgaGVscF93aWR0aCA9IHNlbGYuX3dpZHRoIC0gaGVscF9wb3NpdGlvbgorICAgICAgICBoZWxwX3dpZHRoID0gbWF4KHNlbGYuX3dpZHRoIC0gaGVscF9wb3NpdGlvbiwgMTEpCiAgICAgICAgIGFjdGlvbl93aWR0aCA9IGhlbHBfcG9zaXRpb24gLSBzZWxmLl9jdXJyZW50X2luZGVudCAtIDIKICAgICAgICAgYWN0aW9uX2hlYWRlciA9IHNlbGYuX2Zvcm1hdF9hY3Rpb25faW52b2NhdGlvbihhY3Rpb24pCiAKQEAgLTc0MCwxMCArNzQyLDEwIEBACiAKICAgICAgICAgLSBkZWZhdWx0IC0tIFRoZSB2YWx1ZSB0byBiZSBwcm9kdWNlZCBpZiB0aGUgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQuCiAKLSAgICAgICAgLSB0eXBlIC0tIFRoZSB0eXBlIHdoaWNoIHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHNob3VsZCBiZSBjb252ZXJ0ZWQKLSAgICAgICAgICAgIHRvLCBzaG91bGQgYmUgb25lIG9mICdzdHJpbmcnLCAnaW50JywgJ2Zsb2F0JywgJ2NvbXBsZXgnIG9yIGEKLSAgICAgICAgICAgIGNhbGxhYmxlIG9iamVjdCB0aGF0IGFjY2VwdHMgYSBzaW5nbGUgc3RyaW5nIGFyZ3VtZW50LiBJZiBOb25lLAotICAgICAgICAgICAgJ3N0cmluZycgaXMgYXNzdW1lZC4KKyAgICAgICAgLSB0eXBlIC0tIEEgY2FsbGFibGUgdGhhdCBhY2NlcHRzIGEgc2luZ2xlIHN0cmluZyBhcmd1bWVudCwgYW5kCisgICAgICAgICAgICByZXR1cm5zIHRoZSBjb252ZXJ0ZWQgdmFsdWUuICBUaGUgc3RhbmRhcmQgUHl0aG9uIHR5cGVzIHN0ciwgaW50LAorICAgICAgICAgICAgZmxvYXQsIGFuZCBjb21wbGV4IGFyZSB1c2VmdWwgZXhhbXBsZXMgb2Ygc3VjaCBjYWxsYWJsZXMuICBJZiBOb25lLAorICAgICAgICAgICAgc3RyIGlzIHVzZWQuCiAKICAgICAgICAgLSBjaG9pY2VzIC0tIEEgY29udGFpbmVyIG9mIHZhbHVlcyB0aGF0IHNob3VsZCBiZSBhbGxvd2VkLiBJZiBub3QgTm9uZSwKICAgICAgICAgICAgIGFmdGVyIGEgY29tbWFuZC1saW5lIGFyZ3VtZW50IGhhcyBiZWVuIGNvbnZlcnRlZCB0byB0aGUgYXBwcm9wcmlhdGUKQEAgLTExNTUsOSArMTE1NywxMyBAQAogICAgIF9faGFzaF9fID0gTm9uZQogCiAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBOYW1lc3BhY2UpOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgIHJldHVybiB2YXJzKHNlbGYpID09IHZhcnMob3RoZXIpCiAKICAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIE5hbWVzcGFjZSk6CisgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKIAogICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KToKQEAgLTE2OTIsOSArMTY5OCwxMiBAQAogICAgICAgICByZXR1cm4gYXJncwogCiAgICAgZGVmIHBhcnNlX2tub3duX2FyZ3Moc2VsZiwgYXJncz1Ob25lLCBuYW1lc3BhY2U9Tm9uZSk6Ci0gICAgICAgICMgYXJncyBkZWZhdWx0IHRvIHRoZSBzeXN0ZW0gYXJncwogICAgICAgICBpZiBhcmdzIGlzIE5vbmU6CisgICAgICAgICAgICAjIGFyZ3MgZGVmYXVsdCB0byB0aGUgc3lzdGVtIGFyZ3MKICAgICAgICAgICAgIGFyZ3MgPSBfc3lzLmFyZ3ZbMTpdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIG1ha2Ugc3VyZSB0aGF0IGFyZ3MgYXJlIG11dGFibGUKKyAgICAgICAgICAgIGFyZ3MgPSBsaXN0KGFyZ3MpCiAKICAgICAgICAgIyBkZWZhdWx0IE5hbWVzcGFjZSBidWlsdCBmcm9tIHBhcnNlciBkZWZhdWx0cwogICAgICAgICBpZiBuYW1lc3BhY2UgaXMgTm9uZToKQEAgLTE3MDUsMTAgKzE3MTQsNyBAQAogICAgICAgICAgICAgaWYgYWN0aW9uLmRlc3QgaXMgbm90IFNVUFBSRVNTOgogICAgICAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRyKG5hbWVzcGFjZSwgYWN0aW9uLmRlc3QpOgogICAgICAgICAgICAgICAgICAgICBpZiBhY3Rpb24uZGVmYXVsdCBpcyBub3QgU1VQUFJFU1M6Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ID0gYWN0aW9uLmRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYWN0aW9uLmRlZmF1bHQsIGJhc2VzdHJpbmcpOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgPSBzZWxmLl9nZXRfdmFsdWUoYWN0aW9uLCBkZWZhdWx0KQotICAgICAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihuYW1lc3BhY2UsIGFjdGlvbi5kZXN0LCBkZWZhdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihuYW1lc3BhY2UsIGFjdGlvbi5kZXN0LCBhY3Rpb24uZGVmYXVsdCkKIAogICAgICAgICAjIGFkZCBhbnkgcGFyc2VyIGRlZmF1bHRzIHRoYXQgYXJlbid0IHByZXNlbnQKICAgICAgICAgZm9yIGRlc3QgaW4gc2VsZi5fZGVmYXVsdHM6CkBAIC0xOTM2LDEyICsxOTQyLDIzIEBACiAgICAgICAgIGlmIHBvc2l0aW9uYWxzOgogICAgICAgICAgICAgc2VsZi5lcnJvcihfKCd0b28gZmV3IGFyZ3VtZW50cycpKQogCi0gICAgICAgICMgbWFrZSBzdXJlIGFsbCByZXF1aXJlZCBhY3Rpb25zIHdlcmUgcHJlc2VudAorICAgICAgICAjIG1ha2Ugc3VyZSBhbGwgcmVxdWlyZWQgYWN0aW9ucyB3ZXJlIHByZXNlbnQsIGFuZCBjb252ZXJ0IGRlZmF1bHRzLgogICAgICAgICBmb3IgYWN0aW9uIGluIHNlbGYuX2FjdGlvbnM6Ci0gICAgICAgICAgICBpZiBhY3Rpb24ucmVxdWlyZWQ6Ci0gICAgICAgICAgICAgICAgaWYgYWN0aW9uIG5vdCBpbiBzZWVuX2FjdGlvbnM6CisgICAgICAgICAgICBpZiBhY3Rpb24gbm90IGluIHNlZW5fYWN0aW9uczoKKyAgICAgICAgICAgICAgICBpZiBhY3Rpb24ucmVxdWlyZWQ6CiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBfZ2V0X2FjdGlvbl9uYW1lKGFjdGlvbikKICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcihfKCdhcmd1bWVudCAlcyBpcyByZXF1aXJlZCcpICUgbmFtZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIENvbnZlcnQgYWN0aW9uIGRlZmF1bHQgbm93IGluc3RlYWQgb2YgZG9pbmcgaXQgYmVmb3JlCisgICAgICAgICAgICAgICAgICAgICMgcGFyc2luZyBhcmd1bWVudHMgdG8gYXZvaWQgY2FsbGluZyBjb252ZXJ0IGZ1bmN0aW9ucworICAgICAgICAgICAgICAgICAgICAjIHR3aWNlICh3aGljaCBtYXkgZmFpbCkgaWYgdGhlIGFyZ3VtZW50IHdhcyBnaXZlbiwgYnV0CisgICAgICAgICAgICAgICAgICAgICMgb25seSBpZiBpdCB3YXMgZGVmaW5lZCBhbHJlYWR5IGluIHRoZSBuYW1lc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbi5kZWZhdWx0IGlzIG5vdCBOb25lIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UoYWN0aW9uLmRlZmF1bHQsIGJhc2VzdHJpbmcpIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2F0dHIobmFtZXNwYWNlLCBhY3Rpb24uZGVzdCkgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLmRlZmF1bHQgaXMgZ2V0YXR0cihuYW1lc3BhY2UsIGFjdGlvbi5kZXN0KSk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKG5hbWVzcGFjZSwgYWN0aW9uLmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2dldF92YWx1ZShhY3Rpb24sIGFjdGlvbi5kZWZhdWx0KSkKIAogICAgICAgICAjIG1ha2Ugc3VyZSBhbGwgcmVxdWlyZWQgZ3JvdXBzIGhhZCBvbmUgb3B0aW9uIHByZXNlbnQKICAgICAgICAgZm9yIGdyb3VwIGluIHNlbGYuX211dHVhbGx5X2V4Y2x1c2l2ZV9ncm91cHM6CkBAIC0xOTY3LDcgKzE5ODQsNyBAQAogICAgICAgICBmb3IgYXJnX3N0cmluZyBpbiBhcmdfc3RyaW5nczoKIAogICAgICAgICAgICAgIyBmb3IgcmVndWxhciBhcmd1bWVudHMsIGp1c3QgYWRkIHRoZW0gYmFjayBpbnRvIHRoZSBsaXN0Ci0gICAgICAgICAgICBpZiBhcmdfc3RyaW5nWzBdIG5vdCBpbiBzZWxmLmZyb21maWxlX3ByZWZpeF9jaGFyczoKKyAgICAgICAgICAgIGlmIG5vdCBhcmdfc3RyaW5nIG9yIGFyZ19zdHJpbmdbMF0gbm90IGluIHNlbGYuZnJvbWZpbGVfcHJlZml4X2NoYXJzOgogICAgICAgICAgICAgICAgIG5ld19hcmdfc3RyaW5ncy5hcHBlbmQoYXJnX3N0cmluZykKIAogICAgICAgICAgICAgIyByZXBsYWNlIGFyZ3VtZW50cyByZWZlcmVuY2luZyBmaWxlcyB3aXRoIHRoZSBmaWxlIGNvbnRlbnQKQEAgLTIxNzQsOSArMjE5MSwxMiBAQAogICAgICMgVmFsdWUgY29udmVyc2lvbiBtZXRob2RzCiAgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBkZWYgX2dldF92YWx1ZXMoc2VsZiwgYWN0aW9uLCBhcmdfc3RyaW5ncyk6Ci0gICAgICAgICMgZm9yIGV2ZXJ5dGhpbmcgYnV0IFBBUlNFUiBhcmdzLCBzdHJpcCBvdXQgJy0tJworICAgICAgICAjIGZvciBldmVyeXRoaW5nIGJ1dCBQQVJTRVIsIFJFTUFJTkRFUiBhcmdzLCBzdHJpcCBvdXQgZmlyc3QgJy0tJwogICAgICAgICBpZiBhY3Rpb24ubmFyZ3Mgbm90IGluIFtQQVJTRVIsIFJFTUFJTkRFUl06Ci0gICAgICAgICAgICBhcmdfc3RyaW5ncyA9IFtzIGZvciBzIGluIGFyZ19zdHJpbmdzIGlmIHMgIT0gJy0tJ10KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBhcmdfc3RyaW5ncy5yZW1vdmUoJy0tJykKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKIAogICAgICAgICAjIG9wdGlvbmFsIGFyZ3VtZW50IHByb2R1Y2VzIGEgZGVmYXVsdCB3aGVuIG5vdCBwcmVzZW50CiAgICAgICAgIGlmIG5vdCBhcmdfc3RyaW5ncyBhbmQgYWN0aW9uLm5hcmdzID09IE9QVElPTkFMOgpkaWZmIC0tZ2l0IGEvTGliL2FzeW5jaGF0LnB5IGIvTGliL2FzeW5jaGF0LnB5CmluZGV4IDkxMTgzM2QuLjU3NDU5YTAgMTAwNjQ0Ci0tLSBhL0xpYi9hc3luY2hhdC5weQorKysgYi9MaWIvYXN5bmNoYXQucHkKQEAgLTQ2LDEyICs0NiwxNyBAQAogeW91IC0gYnkgY2FsbGluZyB5b3VyIHNlbGYuZm91bmRfdGVybWluYXRvcigpIG1ldGhvZC4KICIiIgogCi1pbXBvcnQgc29ja2V0CiBpbXBvcnQgYXN5bmNvcmUKK2ltcG9ydCBlcnJubworaW1wb3J0IHNvY2tldAogZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKIGZyb20gc3lzIGltcG9ydCBweTNrd2FybmluZwogZnJvbSB3YXJuaW5ncyBpbXBvcnQgZmlsdGVyd2FybmluZ3MsIGNhdGNoX3dhcm5pbmdzCiAKK19CTE9DS0lOR19JT19FUlJPUlMgPSAoZXJybm8uRUFHQUlOLCBlcnJuby5FQUxSRUFEWSwgZXJybm8uRUlOUFJPR1JFU1MsCisgICAgICAgICAgICAgICAgICAgICAgIGVycm5vLkVXT1VMREJMT0NLKQorCisKIGNsYXNzIGFzeW5jX2NoYXQgKGFzeW5jb3JlLmRpc3BhdGNoZXIpOgogICAgICIiIlRoaXMgaXMgYW4gYWJzdHJhY3QgY2xhc3MuICBZb3UgbXVzdCBkZXJpdmUgZnJvbSB0aGlzIGNsYXNzLCBhbmQgYWRkCiAgICAgdGhlIHR3byBtZXRob2RzIGNvbGxlY3RfaW5jb21pbmdfZGF0YSgpIGFuZCBmb3VuZF90ZXJtaW5hdG9yKCkiIiIKQEAgLTEwOSw2ICsxMTQsOCBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBkYXRhID0gc2VsZi5yZWN2IChzZWxmLmFjX2luX2J1ZmZlcl9zaXplKQogICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCB3aHk6CisgICAgICAgICAgICBpZiB3aHkuYXJnc1swXSBpbiBfQkxPQ0tJTkdfSU9fRVJST1JTOgorICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgc2VsZi5oYW5kbGVfZXJyb3IoKQogICAgICAgICAgICAgcmV0dXJuCiAKZGlmZiAtLWdpdCBhL0xpYi9hc3luY29yZS5weSBiL0xpYi9hc3luY29yZS5weQppbmRleCAzNWRiMzg3Li4yOTA5OWJkIDEwMDY0NAotLS0gYS9MaWIvYXN5bmNvcmUucHkKKysrIGIvTGliL2FzeW5jb3JlLnB5CkBAIC0yMjUsNiArMjI1LDcgQEAKICAgICBkZWJ1ZyA9IEZhbHNlCiAgICAgY29ubmVjdGVkID0gRmFsc2UKICAgICBhY2NlcHRpbmcgPSBGYWxzZQorICAgIGNvbm5lY3RpbmcgPSBGYWxzZQogICAgIGNsb3NpbmcgPSBGYWxzZQogICAgIGFkZHIgPSBOb25lCiAgICAgaWdub3JlX2xvZ190eXBlcyA9IGZyb3plbnNldChbJ3dhcm5pbmcnXSkKQEAgLTI0OCw3ICsyNDksNyBAQAogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHNlbGYuYWRkciA9IHNvY2suZ2V0cGVlcm5hbWUoKQogICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZXJyOgotICAgICAgICAgICAgICAgIGlmIGVyci5hcmdzWzBdID09IEVOT1RDT05OOgorICAgICAgICAgICAgICAgIGlmIGVyci5hcmdzWzBdIGluIChFTk9UQ09OTiwgRUlOVkFMKToKICAgICAgICAgICAgICAgICAgICAgIyBUbyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2UgZ290IGFuIHVuY29ubmVjdGVkCiAgICAgICAgICAgICAgICAgICAgICMgc29ja2V0LgogICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbm5lY3RlZCA9IEZhbHNlCkBAIC0zNDIsOSArMzQzLDExIEBACiAKICAgICBkZWYgY29ubmVjdChzZWxmLCBhZGRyZXNzKToKICAgICAgICAgc2VsZi5jb25uZWN0ZWQgPSBGYWxzZQorICAgICAgICBzZWxmLmNvbm5lY3RpbmcgPSBUcnVlCiAgICAgICAgIGVyciA9IHNlbGYuc29ja2V0LmNvbm5lY3RfZXgoYWRkcmVzcykKICAgICAgICAgaWYgZXJyIGluIChFSU5QUk9HUkVTUywgRUFMUkVBRFksIEVXT1VMREJMT0NLKSBcCiAgICAgICAgIG9yIGVyciA9PSBFSU5WQUwgYW5kIG9zLm5hbWUgaW4gKCdudCcsICdjZScpOgorICAgICAgICAgICAgc2VsZi5hZGRyID0gYWRkcmVzcwogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIGlmIGVyciBpbiAoMCwgRUlTQ09OTik6CiAgICAgICAgICAgICBzZWxmLmFkZHIgPSBhZGRyZXNzCkBAIC0zOTAsNyArMzkzLDcgQEAKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEKICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgd2h5OgotICAgICAgICAgICAgIyB3aW5zb2NrIHNvbWV0aW1lcyB0aHJvd3MgRU5PVENPTk4KKyAgICAgICAgICAgICMgd2luc29jayBzb21ldGltZXMgcmFpc2VzIEVOT1RDT05OCiAgICAgICAgICAgICBpZiB3aHkuYXJnc1swXSBpbiBfRElTQ09OTkVDVEVEOgogICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2Nsb3NlKCkKICAgICAgICAgICAgICAgICByZXR1cm4gJycKQEAgLTQwMCw2ICs0MDMsNyBAQAogICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAgc2VsZi5jb25uZWN0ZWQgPSBGYWxzZQogICAgICAgICBzZWxmLmFjY2VwdGluZyA9IEZhbHNlCisgICAgICAgIHNlbGYuY29ubmVjdGluZyA9IEZhbHNlCiAgICAgICAgIHNlbGYuZGVsX2NoYW5uZWwoKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzZWxmLnNvY2tldC5jbG9zZSgpCkBAIC00MzgsNyArNDQyLDggQEAKICAgICAgICAgICAgICMgc29ja2V0cyB0aGF0IGFyZSBjb25uZWN0ZWQKICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2FjY2VwdCgpCiAgICAgICAgIGVsaWYgbm90IHNlbGYuY29ubmVjdGVkOgotICAgICAgICAgICAgc2VsZi5oYW5kbGVfY29ubmVjdF9ldmVudCgpCisgICAgICAgICAgICBpZiBzZWxmLmNvbm5lY3Rpbmc6CisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfY29ubmVjdF9ldmVudCgpCiAgICAgICAgICAgICBzZWxmLmhhbmRsZV9yZWFkKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuaGFuZGxlX3JlYWQoKQpAQCAtNDQ5LDYgKzQ1NCw3IEBACiAgICAgICAgICAgICByYWlzZSBzb2NrZXQuZXJyb3IoZXJyLCBfc3RyZXJyb3IoZXJyKSkKICAgICAgICAgc2VsZi5oYW5kbGVfY29ubmVjdCgpCiAgICAgICAgIHNlbGYuY29ubmVjdGVkID0gVHJ1ZQorICAgICAgICBzZWxmLmNvbm5lY3RpbmcgPSBGYWxzZQogCiAgICAgZGVmIGhhbmRsZV93cml0ZV9ldmVudChzZWxmKToKICAgICAgICAgaWYgc2VsZi5hY2NlcHRpbmc6CkBAIC00NTcsMTIgKzQ2Myw4IEBACiAgICAgICAgICAgICByZXR1cm4KIAogICAgICAgICBpZiBub3Qgc2VsZi5jb25uZWN0ZWQ6Ci0gICAgICAgICAgICAjY2hlY2sgZm9yIGVycm9ycwotICAgICAgICAgICAgZXJyID0gc2VsZi5zb2NrZXQuZ2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX0VSUk9SKQotICAgICAgICAgICAgaWYgZXJyICE9IDA6Ci0gICAgICAgICAgICAgICAgcmFpc2Ugc29ja2V0LmVycm9yKGVyciwgX3N0cmVycm9yKGVycikpCi0KLSAgICAgICAgICAgIHNlbGYuaGFuZGxlX2Nvbm5lY3RfZXZlbnQoKQorICAgICAgICAgICAgaWYgc2VsZi5jb25uZWN0aW5nOgorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2Nvbm5lY3RfZXZlbnQoKQogICAgICAgICBzZWxmLmhhbmRsZV93cml0ZSgpCiAKICAgICBkZWYgaGFuZGxlX2V4cHRfZXZlbnQoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvYmRiLnB5IGIvTGliL2JkYi5weQppbmRleCA2YWFkOTc5Li41OTQ0MGE5IDEwMDY0NAotLS0gYS9MaWIvYmRiLnB5CisrKyBiL0xpYi9iZGIucHkKQEAgLTI0LDYgKzI0LDcgQEAKICAgICAgICAgc2VsZi5za2lwID0gc2V0KHNraXApIGlmIHNraXAgZWxzZSBOb25lCiAgICAgICAgIHNlbGYuYnJlYWtzID0ge30KICAgICAgICAgc2VsZi5mbmNhY2hlID0ge30KKyAgICAgICAgc2VsZi5mcmFtZV9yZXR1cm5pbmcgPSBOb25lCiAKICAgICBkZWYgY2Fub25pYyhzZWxmLCBmaWxlbmFtZSk6CiAgICAgICAgIGlmIGZpbGVuYW1lID09ICI8IiArIGZpbGVuYW1lWzE6LTFdICsgIj4iOgpAQCAtODIsNyArODMsMTEgQEAKIAogICAgIGRlZiBkaXNwYXRjaF9yZXR1cm4oc2VsZiwgZnJhbWUsIGFyZyk6CiAgICAgICAgIGlmIHNlbGYuc3RvcF9oZXJlKGZyYW1lKSBvciBmcmFtZSA9PSBzZWxmLnJldHVybmZyYW1lOgotICAgICAgICAgICAgc2VsZi51c2VyX3JldHVybihmcmFtZSwgYXJnKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuZnJhbWVfcmV0dXJuaW5nID0gZnJhbWUKKyAgICAgICAgICAgICAgICBzZWxmLnVzZXJfcmV0dXJuKGZyYW1lLCBhcmcpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHNlbGYuZnJhbWVfcmV0dXJuaW5nID0gTm9uZQogICAgICAgICAgICAgaWYgc2VsZi5xdWl0dGluZzogcmFpc2UgQmRiUXVpdAogICAgICAgICByZXR1cm4gc2VsZi50cmFjZV9kaXNwYXRjaAogCkBAIC0xODYsNiArMTkxLDE0IEBACiAKICAgICBkZWYgc2V0X3N0ZXAoc2VsZik6CiAgICAgICAgICIiIlN0b3AgYWZ0ZXIgb25lIGxpbmUgb2YgY29kZS4iIiIKKyAgICAgICAgIyBJc3N1ZSAjMTMxODM6IHBkYiBza2lwcyBmcmFtZXMgYWZ0ZXIgaGl0dGluZyBhIGJyZWFrcG9pbnQgYW5kIHJ1bm5pbmcKKyAgICAgICAgIyBzdGVwIGNvbW1hbmRzLgorICAgICAgICAjIFJlc3RvcmUgdGhlIHRyYWNlIGZ1bmN0aW9uIGluIHRoZSBjYWxsZXIgKHRoYXQgbWF5IG5vdCBoYXZlIGJlZW4gc2V0CisgICAgICAgICMgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMpIHdoZW4gcmV0dXJuaW5nIGZyb20gdGhlIGN1cnJlbnQgZnJhbWUuCisgICAgICAgIGlmIHNlbGYuZnJhbWVfcmV0dXJuaW5nOgorICAgICAgICAgICAgY2FsbGVyX2ZyYW1lID0gc2VsZi5mcmFtZV9yZXR1cm5pbmcuZl9iYWNrCisgICAgICAgICAgICBpZiBjYWxsZXJfZnJhbWUgYW5kIG5vdCBjYWxsZXJfZnJhbWUuZl90cmFjZToKKyAgICAgICAgICAgICAgICBjYWxsZXJfZnJhbWUuZl90cmFjZSA9IHNlbGYudHJhY2VfZGlzcGF0Y2gKICAgICAgICAgc2VsZi5fc2V0X3N0b3BpbmZvKE5vbmUsIE5vbmUpCiAKICAgICBkZWYgc2V0X25leHQoc2VsZiwgZnJhbWUpOgpkaWZmIC0tZ2l0IGEvTGliL2JzZGRiL19faW5pdF9fLnB5IGIvTGliL2JzZGRiL19faW5pdF9fLnB5CmluZGV4IGVkNGRlZWEuLjEzYzljMjcgMTAwNjQ0Ci0tLSBhL0xpYi9ic2RkYi9fX2luaXRfXy5weQorKysgYi9MaWIvYnNkZGIvX19pbml0X18ucHkKQEAgLTMzLDcgKzMzLDcgQEAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIAotIiIiU3VwcG9ydCBmb3IgQmVya2VsZXkgREIgNC4xIHRocm91Z2ggNC44IHdpdGggYSBzaW1wbGUgaW50ZXJmYWNlLgorIiIiU3VwcG9ydCBmb3IgQmVya2VsZXkgREIgNC4zIHRocm91Z2ggNS4zIHdpdGggYSBzaW1wbGUgaW50ZXJmYWNlLgogCiBGb3IgdGhlIGZ1bGwgZmVhdHVyZWQgb2JqZWN0IG9yaWVudGVkIGludGVyZmFjZSB1c2UgdGhlIGJzZGRiLmRiIG1vZHVsZQogaW5zdGVhZC4gIEl0IG1pcnJvcnMgdGhlIE9yYWNsZSBCZXJrZWxleSBEQiBDIEFQSS4KQEAgLTEzOCw3ICsxMzgsNyBAQAogICAgICAgICAgICAgZXhjZXB0IF9ic2RkYi5EQkN1cnNvckNsb3NlZEVycm9yOgogICAgICAgICAgICAgICAgICMgdGhlIGRhdGFiYXNlIHdhcyBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLiAgYWJvcnQuCiAgICAgICAgICAgICAgICAgcGFzcwotIyBXaGVuIFB5dGhvbiAyLjMgbm90IHN1cHBvcnRlZCBpbiBic2RkYjMsIHdlIGNhbiBjaGFuZ2UgdGhpcyB0byAiZmluYWxseSIKKyMgV2hlbiBQeXRob24gMi40IG5vdCBzdXBwb3J0ZWQgaW4gYnNkZGIzLCB3ZSBjYW4gY2hhbmdlIHRoaXMgdG8gImZpbmFsbHkiCiAgICAgICAgIGV4Y2VwdCA6CiAgICAgICAgICAgICBzZWxmLl9pbl9pdGVyIC09IDEKICAgICAgICAgICAgIHJhaXNlCkBAIC0xODEsNyArMTgxLDcgQEAKICAgICAgICAgICAgIGV4Y2VwdCBfYnNkZGIuREJDdXJzb3JDbG9zZWRFcnJvcjoKICAgICAgICAgICAgICAgICAjIHRoZSBkYXRhYmFzZSB3YXMgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi4gIGFib3J0LgogICAgICAgICAgICAgICAgIHBhc3MKLSMgV2hlbiBQeXRob24gMi4zIG5vdCBzdXBwb3J0ZWQgaW4gYnNkZGIzLCB3ZSBjYW4gY2hhbmdlIHRoaXMgdG8gImZpbmFsbHkiCisjIFdoZW4gUHl0aG9uIDIuNCBub3Qgc3VwcG9ydGVkIGluIGJzZGRiMywgd2UgY2FuIGNoYW5nZSB0aGlzIHRvICJmaW5hbGx5IgogICAgICAgICBleGNlcHQgOgogICAgICAgICAgICAgc2VsZi5faW5faXRlciAtPSAxCiAgICAgICAgICAgICByYWlzZQpkaWZmIC0tZ2l0IGEvTGliL2JzZGRiL2Rib2JqLnB5IGIvTGliL2JzZGRiL2Rib2JqLnB5CmluZGV4IGM3YzczMjIuLjE0MDBmZTEgMTAwNjQ0Ci0tLSBhL0xpYi9ic2RkYi9kYm9iai5weQorKysgYi9MaWIvYnNkZGIvZGJvYmoucHkKQEAgLTMwLDEyICszMCw3IEBACiAgICAgaW1wb3J0IGRiCiAKIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNikgOgotICAgIHRyeToKLSAgICAgICAgZnJvbSBVc2VyRGljdCBpbXBvcnQgRGljdE1peGluCi0gICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAjIERpY3RNaXhpbiBpcyBuZXcgaW4gUHl0aG9uIDIuMwotICAgICAgICBjbGFzcyBEaWN0TWl4aW46IHBhc3MKLSAgICBNdXRhYmxlTWFwcGluZyA9IERpY3RNaXhpbgorICAgIGZyb20gVXNlckRpY3QgaW1wb3J0IERpY3RNaXhpbiBhcyBNdXRhYmxlTWFwcGluZwogZWxzZSA6CiAgICAgaW1wb3J0IGNvbGxlY3Rpb25zCiAgICAgTXV0YWJsZU1hcHBpbmcgPSBjb2xsZWN0aW9ucy5NdXRhYmxlTWFwcGluZwpAQCAtMTk2LDYgKzE5MSw4IEBACiAgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF9idF9jb21wYXJlKCphcmdzLCAqKmt3YXJncykKICAgICBkZWYgc2V0X2NhY2hlc2l6ZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfY2FjaGVzaXplKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgc2V0X2R1cF9jb21wYXJlKHNlbGYsICphcmdzLCAqKmt3YXJncykgOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfZHVwX2NvbXBhcmUoKmFyZ3MsICoqa3dhcmdzKQogICAgIGRlZiBzZXRfZmxhZ3Moc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X2ZsYWdzKCphcmdzLCAqKmt3YXJncykKICAgICBkZWYgc2V0X2hfZmZhY3RvcihzZWxmLCAqYXJncywgKiprd2FyZ3MpOgpkaWZmIC0tZ2l0IGEvTGliL2JzZGRiL2Ric2hlbHZlLnB5IGIvTGliL2JzZGRiL2Ric2hlbHZlLnB5CmluZGV4IGUzZjZkNGMuLjdkMGRhYTIgMTAwNjQ0Ci0tLSBhL0xpYi9ic2RkYi9kYnNoZWx2ZS5weQorKysgYi9MaWIvYnNkZGIvZGJzaGVsdmUucHkKQEAgLTEsNCArMSwzIEBACi0jIS91c3IvYmluL2VudiBweXRob24KICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgICAgICAgICAgIENvcHlyaWdodCAoYykgMTk5Ny0yMDAxIGJ5IFRvdGFsIENvbnRyb2wgU29mdHdhcmUKICMgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZApAQCAtNDMsNyArNDIsNyBAQAogICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNikgOgogICAgICAgICBpbXBvcnQgY1BpY2tsZQogICAgIGVsc2UgOgotICAgICAgICAjIFdoZW4gd2UgZHJvcCBzdXBwb3J0IGZvciBweXRob24gMi4zIGFuZCAyLjQKKyAgICAgICAgIyBXaGVuIHdlIGRyb3Agc3VwcG9ydCBmb3IgcHl0aG9uIDIuNAogICAgICAgICAjIHdlIGNvdWxkIHVzZTogKGluIDIuNSB3ZSBuZWVkIGEgX19mdXR1cmVfXyBzdGF0ZW1lbnQpCiAgICAgICAgICMKICAgICAgICAgIyAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CkBAIC01MSw3ICs1MCw3IEBACiAgICAgICAgICMgICAgICAgIC4uLgogICAgICAgICAjCiAgICAgICAgICMgV2UgY2FuIG5vdCB1c2UgIndpdGgiIGFzIGlzLCBiZWNhdXNlIGl0IHdvdWxkIGJlIGludmFsaWQgc3ludGF4Ci0gICAgICAgICMgaW4gcHl0aG9uIDIuMywgMi40IGFuZCAod2l0aCBubyBfX2Z1dHVyZV9fKSAyLjUuCisgICAgICAgICMgaW4gcHl0aG9uIDIuNCBhbmQgKHdpdGggbm8gX19mdXR1cmVfXykgMi41LgogICAgICAgICAjIEhlcmUgd2Ugc2ltdWxhdGUgIndpdGgiIGZvbGxvd2luZyBQRVAgMzQzIDoKICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCiAgICAgICAgIHcgPSB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpCkBAIC02NSwzMiArNjQsMTIgQEAKICAgICAgICAgICAgIHcuX19leGl0X18oKQogICAgICAgICBkZWwgdwogCi0jQXQgdmVyc2lvbiAyLjMgY1BpY2tsZSBzd2l0Y2hlZCB0byB1c2luZyBwcm90b2NvbCBpbnN0ZWFkIG9mIGJpbgotaWYgc3lzLnZlcnNpb25faW5mbyA+PSAoMiwgMyk6Ci0gICAgSElHSEVTVF9QUk9UT0NPTCA9IGNQaWNrbGUuSElHSEVTVF9QUk9UT0NPTAotIyBJbiBweXRob24gMi4zLiosICJjUGlja2xlLmR1bXBzIiBhY2NlcHRzIG5vCi0jIG5hbWVkIHBhcmFtZXRlcnMuICJwaWNrbGUuZHVtcHMiIGFjY2VwdHMgdGhlbSwKLSMgc28gdGhpcyBzZWVtcyBhIGJ1Zy4KLSAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDQpOgotICAgICAgICBkZWYgX2R1bXBzKG9iamVjdCwgcHJvdG9jb2wpOgotICAgICAgICAgICAgcmV0dXJuIGNQaWNrbGUuZHVtcHMob2JqZWN0LCBwcm90b2NvbCkKLSAgICBlbHNlIDoKLSAgICAgICAgZGVmIF9kdW1wcyhvYmplY3QsIHByb3RvY29sKToKLSAgICAgICAgICAgIHJldHVybiBjUGlja2xlLmR1bXBzKG9iamVjdCwgcHJvdG9jb2w9cHJvdG9jb2wpCi0KLWVsc2U6Ci0gICAgSElHSEVTVF9QUk9UT0NPTCA9IE5vbmUKLSAgICBkZWYgX2R1bXBzKG9iamVjdCwgcHJvdG9jb2wpOgotICAgICAgICByZXR1cm4gY1BpY2tsZS5kdW1wcyhvYmplY3QsIGJpbj1wcm90b2NvbCkKLQorSElHSEVTVF9QUk9UT0NPTCA9IGNQaWNrbGUuSElHSEVTVF9QUk9UT0NPTAorZGVmIF9kdW1wcyhvYmplY3QsIHByb3RvY29sKToKKyAgICByZXR1cm4gY1BpY2tsZS5kdW1wcyhvYmplY3QsIHByb3RvY29sPXByb3RvY29sKQogCiBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDYpIDoKLSAgICB0cnk6Ci0gICAgICAgIGZyb20gVXNlckRpY3QgaW1wb3J0IERpY3RNaXhpbgotICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgIyBEaWN0TWl4aW4gaXMgbmV3IGluIFB5dGhvbiAyLjMKLSAgICAgICAgY2xhc3MgRGljdE1peGluOiBwYXNzCi0gICAgTXV0YWJsZU1hcHBpbmcgPSBEaWN0TWl4aW4KKyAgICBmcm9tIFVzZXJEaWN0IGltcG9ydCBEaWN0TWl4aW4gYXMgTXV0YWJsZU1hcHBpbmcKIGVsc2UgOgogICAgIGltcG9ydCBjb2xsZWN0aW9ucwogICAgIE11dGFibGVNYXBwaW5nID0gY29sbGVjdGlvbnMuTXV0YWJsZU1hcHBpbmcKZGlmZiAtLWdpdCBhL0xpYi9ic2RkYi9kYnRhYmxlcy5weSBiL0xpYi9ic2RkYi9kYnRhYmxlcy5weQppbmRleCAzZWJjNjhkLi5lOGFjZGQwIDEwMDY0NAotLS0gYS9MaWIvYnNkZGIvZGJ0YWJsZXMucHkKKysrIGIvTGliL2JzZGRiL2RidGFibGVzLnB5CkBAIC0zMCw3ICszMCw3IEBACiAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA2KSA6CiAgICAgICAgIGltcG9ydCBjUGlja2xlIGFzIHBpY2tsZQogICAgIGVsc2UgOgotICAgICAgICAjIFdoZW4gd2UgZHJvcCBzdXBwb3J0IGZvciBweXRob24gMi4zIGFuZCAyLjQKKyAgICAgICAgIyBXaGVuIHdlIGRyb3Agc3VwcG9ydCBmb3IgcHl0aG9uIDIuNAogICAgICAgICAjIHdlIGNvdWxkIHVzZTogKGluIDIuNSB3ZSBuZWVkIGEgX19mdXR1cmVfXyBzdGF0ZW1lbnQpCiAgICAgICAgICMKICAgICAgICAgIyAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CkBAIC0zOCw3ICszOCw3IEBACiAgICAgICAgICMgICAgICAgIC4uLgogICAgICAgICAjCiAgICAgICAgICMgV2UgY2FuIG5vdCB1c2UgIndpdGgiIGFzIGlzLCBiZWNhdXNlIGl0IHdvdWxkIGJlIGludmFsaWQgc3ludGF4Ci0gICAgICAgICMgaW4gcHl0aG9uIDIuMywgMi40IGFuZCAod2l0aCBubyBfX2Z1dHVyZV9fKSAyLjUuCisgICAgICAgICMgaW4gcHl0aG9uIDIuNCBhbmQgKHdpdGggbm8gX19mdXR1cmVfXykgMi41LgogICAgICAgICAjIEhlcmUgd2Ugc2ltdWxhdGUgIndpdGgiIGZvbGxvd2luZyBQRVAgMzQzIDoKICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCiAgICAgICAgIHcgPSB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpCmRpZmYgLS1naXQgYS9MaWIvYnNkZGIvdGVzdC90ZXN0X2FsbC5weSBiL0xpYi9ic2RkYi90ZXN0L3Rlc3RfYWxsLnB5CmluZGV4IGU5ZmU2MTguLmNhZWYxYWMgMTAwNjQ0Ci0tLSBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfYWxsLnB5CisrKyBiL0xpYi9ic2RkYi90ZXN0L3Rlc3RfYWxsLnB5CkBAIC0zOTIsMTAgKzM5Miw4IEBACiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZGJlbnYuZ2V0X3RtcF9kaXIoKS5kZWNvZGUoY2hhcnNldCkKIAogICAgICAgICBkZWYgZ2V0X2RhdGFfZGlycyhzZWxmKSA6Ci0gICAgICAgICAgICAjIEhhdmUgdG8gdXNlIGEgbGlzdCBjb21wcmVoZW5zaW9uIGFuZCBub3QKLSAgICAgICAgICAgICMgZ2VuZXJhdG9ycywgYmVjYXVzZSB3ZSBhcmUgc3VwcG9ydGluZyBQeXRob24gMi4zLgogICAgICAgICAgICAgcmV0dXJuIHR1cGxlKAotICAgICAgICAgICAgICAgIFtpLmRlY29kZShjaGFyc2V0KSBmb3IgaSBpbiBzZWxmLl9kYmVudi5nZXRfZGF0YV9kaXJzKCldKQorICAgICAgICAgICAgICAgIChpLmRlY29kZShjaGFyc2V0KSBmb3IgaSBpbiBzZWxmLl9kYmVudi5nZXRfZGF0YV9kaXJzKCkpKQogCiAgICAgY2xhc3MgREJTZXF1ZW5jZV9weTNrKG9iamVjdCkgOgogICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZGIsICphcmdzLCAqKmt3YXJncykgOgpAQCAtNDg0LDYgKzQ4Miw4IEBACiAgICAgcHJpbnQgJy09JyAqIDM4CiAgICAgcHJpbnQgZGIuREJfVkVSU0lPTl9TVFJJTkcKICAgICBwcmludCAnYnNkZGIuZGIudmVyc2lvbigpOiAgICVzJyAlIChkYi52ZXJzaW9uKCksICkKKyAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDUsIDApIDoKKyAgICAgICAgcHJpbnQgJ2JzZGRiLmRiLmZ1bGxfdmVyc2lvbigpOiAlcycgJXJlcHIoZGIuZnVsbF92ZXJzaW9uKCkpCiAgICAgcHJpbnQgJ2JzZGRiLmRiLl9fdmVyc2lvbl9fOiAlcycgJSBkYi5fX3ZlcnNpb25fXwogICAgIHByaW50ICdic2RkYi5kYi5jdnNpZDogICAgICAgJXMnICUgZGIuY3ZzaWQKIApAQCAtNTI4LDcgKzUyOCw4IEBACiAKICMgVGhpcyBwYXRoIGNhbiBiZSBvdmVycmlkZW4gdmlhICJzZXRfdGVzdF9wYXRoX3ByZWZpeCgpIi4KIGltcG9ydCBvcywgb3MucGF0aAotZ2V0X25ld19wYXRoLnByZWZpeD1vcy5wYXRoLmpvaW4ob3Muc2VwLCJ0bXAiLCJ6LUJlcmtlbGV5X0RCIikKK2dldF9uZXdfcGF0aC5wcmVmaXg9b3MucGF0aC5qb2luKG9zLmVudmlyb24uZ2V0KCJUTVBESVIiLAorICAgIG9zLnBhdGguam9pbihvcy5zZXAsInRtcCIpKSwgInotQmVya2VsZXlfREIiKQogZ2V0X25ld19wYXRoLm51bT0wCiAKIGRlZiBnZXRfdGVzdF9wYXRoX3ByZWZpeCgpIDoKZGlmZiAtLWdpdCBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfYmFzaWNzLnB5IGIvTGliL2JzZGRiL3Rlc3QvdGVzdF9iYXNpY3MucHkKaW5kZXggNGQ0MzM5MC4uM2M1N2JlNCAxMDA2NDQKLS0tIGEvTGliL2JzZGRiL3Rlc3QvdGVzdF9iYXNpY3MucHkKKysrIGIvTGliL2JzZGRiL3Rlc3QvdGVzdF9iYXNpY3MucHkKQEAgLTksNiArOSw3IEBACiBmcm9tIHBwcmludCBpbXBvcnQgcHByaW50CiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB0aW1lCitpbXBvcnQgc3lzCiAKIGZyb20gdGVzdF9hbGwgaW1wb3J0IGRiLCB0ZXN0X3N1cHBvcnQsIHZlcmJvc2UsIGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCwgXAogICAgICAgICBnZXRfbmV3X2RhdGFiYXNlX3BhdGgKQEAgLTQ0LDEzICs0NSw2IEBACiAKICAgICBfbnVtS2V5cyAgICAgID0gMTAwMiAgICAjIFBSSVZBVEUuICBOT1RFOiBtdXN0IGJlIGFuIGV2ZW4gdmFsdWUKIAotICAgIGltcG9ydCBzeXMKLSAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDQpOgotICAgICAgICBkZWYgYXNzZXJ0VHJ1ZShzZWxmLCBleHByLCBtc2c9Tm9uZSk6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZXhwcixtc2c9bXNnKQotICAgICAgICBkZWYgYXNzZXJ0RmFsc2Uoc2VsZiwgZXhwciwgbXNnPU5vbmUpOgotICAgICAgICAgICAgc2VsZi5mYWlsSWYoZXhwcixtc2c9bXNnKQotCiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBpZiBzZWxmLnVzZUVudjoKICAgICAgICAgICAgIHNlbGYuaG9tZURpcj1nZXRfbmV3X2Vudmlyb25tZW50X3BhdGgoKQpAQCAtNzQsMTQgKzY4LDEzIEBACiAgICAgICAgICMgY3JlYXRlIGFuZCBvcGVuIHRoZSBEQgogICAgICAgICBzZWxmLmQgPSBkYi5EQihzZWxmLmVudikKICAgICAgICAgaWYgbm90IHNlbGYudXNlRW52IDoKLSAgICAgICAgICAgIGlmIGRiLnZlcnNpb24oKSA+PSAoNCwgMikgOgotICAgICAgICAgICAgICAgIHNlbGYuZC5zZXRfY2FjaGVzaXplKCpzZWxmLmNhY2hlc2l6ZSkKLSAgICAgICAgICAgICAgICBjYWNoZXNpemUgPSBzZWxmLmQuZ2V0X2NhY2hlc2l6ZSgpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYWNoZXNpemVbMF0sIHNlbGYuY2FjaGVzaXplWzBdKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FjaGVzaXplWzJdLCBzZWxmLmNhY2hlc2l6ZVsyXSkKLSAgICAgICAgICAgICAgICAjIEJlcmtlbGV5IERCIGV4cGFuZHMgdGhlIGNhY2hlIDI1JSBhY2NvdW50aW5nIG92ZXJoZWFkLAotICAgICAgICAgICAgICAgICMgaWYgdGhlIGNhY2hlIGlzIHNtYWxsLgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTI1LCBpbnQoMTAwLjAqY2FjaGVzaXplWzFdL3NlbGYuY2FjaGVzaXplWzFdKSkKKyAgICAgICAgICAgIHNlbGYuZC5zZXRfY2FjaGVzaXplKCpzZWxmLmNhY2hlc2l6ZSkKKyAgICAgICAgICAgIGNhY2hlc2l6ZSA9IHNlbGYuZC5nZXRfY2FjaGVzaXplKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FjaGVzaXplWzBdLCBzZWxmLmNhY2hlc2l6ZVswXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FjaGVzaXplWzJdLCBzZWxmLmNhY2hlc2l6ZVsyXSkKKyAgICAgICAgICAgICMgQmVya2VsZXkgREIgZXhwYW5kcyB0aGUgY2FjaGUgMjUlIGFjY291bnRpbmcgb3ZlcmhlYWQsCisgICAgICAgICAgICAjIGlmIHRoZSBjYWNoZSBpcyBzbWFsbC4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTI1LCBpbnQoMTAwLjAqY2FjaGVzaXplWzFdL3NlbGYuY2FjaGVzaXplWzFdKSkKICAgICAgICAgc2VsZi5kLnNldF9mbGFncyhzZWxmLmRic2V0ZmxhZ3MpCiAgICAgICAgIGlmIHNlbGYuZGJuYW1lOgogICAgICAgICAgICAgc2VsZi5kLm9wZW4oc2VsZi5maWxlbmFtZSwgc2VsZi5kYm5hbWUsIHNlbGYuZGJ0eXBlLApAQCAtMTYxLDcgKzE1NCw2IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGQuZGVsZXRlKCdhYmNkJykKICAgICAgICAgZXhjZXB0IGRiLkRCTm90Rm91bmRFcnJvciwgdmFsOgotICAgICAgICAgICAgaW1wb3J0IHN5cwogICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA2KSA6CiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWxbMF0sIGRiLkRCX05PVEZPVU5EKQogICAgICAgICAgICAgZWxzZSA6CkBAIC0xODQsNyArMTc2LDYgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgZC5wdXQoJ2FiY2QnLCAndGhpcyBzaG91bGQgZmFpbCcsIGZsYWdzPWRiLkRCX05PT1ZFUldSSVRFKQogICAgICAgICBleGNlcHQgZGIuREJLZXlFeGlzdEVycm9yLCB2YWw6Ci0gICAgICAgICAgICBpbXBvcnQgc3lzCiAgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDYpIDoKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbFswXSwgZGIuREJfS0VZRVhJU1QpCiAgICAgICAgICAgICBlbHNlIDoKQEAgLTMzOCw3ICszMjksNiBAQAogICAgICAgICAgICAgICAgIHJlYyA9IGMubmV4dCgpCiAgICAgICAgICAgICBleGNlcHQgZGIuREJOb3RGb3VuZEVycm9yLCB2YWw6CiAgICAgICAgICAgICAgICAgaWYgZ2V0X3JhaXNlc19lcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHN5cwogICAgICAgICAgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDYpIDoKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsWzBdLCBkYi5EQl9OT1RGT1VORCkKICAgICAgICAgICAgICAgICAgICAgZWxzZSA6CkBAIC0zNjMsNyArMzUzLDYgQEAKICAgICAgICAgICAgICAgICByZWMgPSBjLnByZXYoKQogICAgICAgICAgICAgZXhjZXB0IGRiLkRCTm90Rm91bmRFcnJvciwgdmFsOgogICAgICAgICAgICAgICAgIGlmIGdldF9yYWlzZXNfZXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgIGltcG9ydCBzeXMKICAgICAgICAgICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA2KSA6CiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbFswXSwgZGIuREJfTk9URk9VTkQpCiAgICAgICAgICAgICAgICAgICAgIGVsc2UgOgpAQCAtMzkwLDcgKzM3OSw2IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG4gPSBjLnNldCgnYmFkIGtleScpCiAgICAgICAgIGV4Y2VwdCBkYi5EQk5vdEZvdW5kRXJyb3IsIHZhbDoKLSAgICAgICAgICAgIGltcG9ydCBzeXMKICAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNikgOgogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsWzBdLCBkYi5EQl9OT1RGT1VORCkKICAgICAgICAgICAgIGVsc2UgOgpAQCAtNDA4LDcgKzM5Niw2IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG4gPSBjLmdldF9ib3RoKCcwNDA0JywgJ2JhZCBkYXRhJykKICAgICAgICAgZXhjZXB0IGRiLkRCTm90Rm91bmRFcnJvciwgdmFsOgotICAgICAgICAgICAgaW1wb3J0IHN5cwogICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA2KSA6CiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWxbMF0sIGRiLkRCX05PVEZPVU5EKQogICAgICAgICAgICAgZWxzZSA6CkBAIC00NDEsNyArNDI4LDYgQEAKICAgICAgICAgICAgIHJlYyA9IGMuY3VycmVudCgpCiAgICAgICAgIGV4Y2VwdCBkYi5EQktleUVtcHR5RXJyb3IsIHZhbDoKICAgICAgICAgICAgIGlmIGdldF9yYWlzZXNfZXJyb3I6Ci0gICAgICAgICAgICAgICAgaW1wb3J0IHN5cwogICAgICAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNikgOgogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbFswXSwgZGIuREJfS0VZRU1QVFkpCiAgICAgICAgICAgICAgICAgZWxzZSA6CkBAIC00OTAsNyArNDc2LDYgQEAKICAgICAgICAgICAgICAgICAjIGEgYnVnIG1heSBjYXVzZSBhIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZS4uLgogICAgICAgICAgICAgICAgIGdldGF0dHIoYywgbWV0aG9kKSgqYXJncykKICAgICAgICAgICAgIGV4Y2VwdCBkYi5EQkVycm9yLCB2YWw6Ci0gICAgICAgICAgICAgICAgaW1wb3J0IHN5cwogICAgICAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNikgOgogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbFswXSwgMCkKICAgICAgICAgICAgICAgICBlbHNlIDoKQEAgLTcxMiwxMSArNjk3LDYgQEAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGNsYXNzIEJhc2ljVHJhbnNhY3Rpb25UZXN0Q2FzZShCYXNpY1Rlc3RDYXNlKToKLSAgICBpbXBvcnQgc3lzCi0gICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA0KToKLSAgICAgICAgZGVmIGFzc2VydFRydWUoc2VsZiwgZXhwciwgbXNnPU5vbmUpOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmFpbFVubGVzcyhleHByLG1zZz1tc2cpCi0KICAgICBpZiAoc3lzLnZlcnNpb25faW5mbyA8ICgyLCA3KSkgb3IgKChzeXMudmVyc2lvbl9pbmZvID49ICgzLCAwKSkgYW5kCiAgICAgICAgICAgICAoc3lzLnZlcnNpb25faW5mbyA8ICgzLCAyKSkpIDoKICAgICAgICAgZGVmIGFzc2VydEluKHNlbGYsIGEsIGIsIG1zZz1Ob25lKSA6CkBAIC03OTIsNyArNzcyLDYgQEAKICAgICAgICAgZm9yIGxvZyBpbiBsb2dzOgogICAgICAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgICAgICBwcmludCAnbG9nIGZpbGU6ICcgKyBsb2cKLSAgICAgICAgaWYgZGIudmVyc2lvbigpID49ICg0LDIpOgogICAgICAgICAgICAgbG9ncyA9IHNlbGYuZW52LmxvZ19hcmNoaXZlKGRiLkRCX0FSQ0hfUkVNT1ZFKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBsb2dzKQogCkBAIC04NzUsNyArODU0LDYgQEAKIAogICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDQsIDIpIDoKICAgICAgICAgZGVmIHRlc3RfZ2V0X3R4X21heChzZWxmKSA6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW52LmdldF90eF9tYXgoKSwgMzApCiAKQEAgLTEwOTgsMTEgKzEwNzYsNiBAQAogCiAKIGNsYXNzIFByaXZhdGVPYmplY3QodW5pdHRlc3QuVGVzdENhc2UpIDoKLSAgICBpbXBvcnQgc3lzCi0gICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA0KToKLSAgICAgICAgZGVmIGFzc2VydFRydWUoc2VsZiwgZXhwciwgbXNnPU5vbmUpOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGV4cHIsbXNnPW1zZykKLQogICAgIGRlZiB0ZWFyRG93bihzZWxmKSA6CiAgICAgICAgIGRlbCBzZWxmLm9iagogCkBAIC0xMTE2LDcgKzEwODksNiBAQAogICAgICAgICBzZWxmLmFzc2VydFRydWUoYSBpcyBiKSAgIyBPYmplY3QgaWRlbnRpdHkKIAogICAgIGRlZiB0ZXN0MDNfbGVha19hc3NpZ25tZW50KHNlbGYpIDoKLSAgICAgICAgaW1wb3J0IHN5cwogICAgICAgICBhID0gImV4YW1wbGUgb2YgcHJpdmF0ZSBvYmplY3QiCiAgICAgICAgIHJlZmNvdW50ID0gc3lzLmdldHJlZmNvdW50KGEpCiAgICAgICAgIHNlbGYub2JqLnNldF9wcml2YXRlKGEpCkBAIC0xMTI1LDcgKzEwOTcsNiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZmNvdW50LCBzeXMuZ2V0cmVmY291bnQoYSkpCiAKICAgICBkZWYgdGVzdDA0X2xlYWtfR0Moc2VsZikgOgotICAgICAgICBpbXBvcnQgc3lzCiAgICAgICAgIGEgPSAiZXhhbXBsZSBvZiBwcml2YXRlIG9iamVjdCIKICAgICAgICAgcmVmY291bnQgPSBzeXMuZ2V0cmVmY291bnQoYSkKICAgICAgICAgc2VsZi5vYmouc2V0X3ByaXZhdGUoYSkKQEAgLTExNDEsMTEgKzExMTIsNiBAQAogICAgICAgICBzZWxmLm9iaiA9IGRiLkRCKCkKIAogY2xhc3MgQ3Jhc2hBbmRCdXJuKHVuaXR0ZXN0LlRlc3RDYXNlKSA6Ci0gICAgaW1wb3J0IHN5cwotICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNCk6Ci0gICAgICAgIGRlZiBhc3NlcnRUcnVlKHNlbGYsIGV4cHIsIG1zZz1Ob25lKToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhleHByLG1zZz1tc2cpCi0KICAgICAjZGVmIHRlc3QwMV9PcGVuQ3Jhc2goc2VsZikgOgogICAgICMgICAgIyBTZWUgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTMzMDcKICAgICAjICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRiLkRCSW52YWxpZEFyZ0Vycm9yLCBkYi5EQiwgTm9uZSwgNjU1MzUpCmRpZmYgLS1naXQgYS9MaWIvYnNkZGIvdGVzdC90ZXN0X2NvbXBhcmUucHkgYi9MaWIvYnNkZGIvdGVzdC90ZXN0X2NvbXBhcmUucHkKaW5kZXggZGI5Y2Q3NC4uY2IzYjQ2MyAxMDA2NDQKLS0tIGEvTGliL2JzZGRiL3Rlc3QvdGVzdF9jb21wYXJlLnB5CisrKyBiL0xpYi9ic2RkYi90ZXN0L3Rlc3RfY29tcGFyZS5weQpAQCAtMSw1ICsxLDUgQEAKICIiIgotVGVzdENhc2VzIGZvciBweXRob24gREIgQnRyZWUga2V5IGNvbXBhcmlzb24gZnVuY3Rpb24uCitUZXN0Q2FzZXMgZm9yIHB5dGhvbiBEQiBkdXBsaWNhdGUgYW5kIEJ0cmVlIGtleSBjb21wYXJpc29uIGZ1bmN0aW9uLgogIiIiCiAKIGltcG9ydCBzeXMsIG9zLCByZQpAQCAtMjAsMzEgKzIwLDI0IEBACiAKIGxleGljYWxfY21wID0gY21wCiAKLWRlZiBsb3dlcmNhc2VfY21wKGxlZnQsIHJpZ2h0KToKLSAgICByZXR1cm4gY21wIChsZWZ0Lmxvd2VyKCksIHJpZ2h0Lmxvd2VyKCkpCitkZWYgbG93ZXJjYXNlX2NtcChsZWZ0LCByaWdodCkgOgorICAgIHJldHVybiBjbXAobGVmdC5sb3dlcigpLCByaWdodC5sb3dlcigpKQogCi1kZWYgbWFrZV9yZXZlcnNlX2NvbXBhcmF0b3IgKGNtcCk6Ci0gICAgZGVmIHJldmVyc2UgKGxlZnQsIHJpZ2h0LCBkZWxlZ2F0ZT1jbXApOgotICAgICAgICByZXR1cm4gLSBkZWxlZ2F0ZSAobGVmdCwgcmlnaHQpCitkZWYgbWFrZV9yZXZlcnNlX2NvbXBhcmF0b3IoY21wKSA6CisgICAgZGVmIHJldmVyc2UobGVmdCwgcmlnaHQsIGRlbGVnYXRlPWNtcCkgOgorICAgICAgICByZXR1cm4gLSBkZWxlZ2F0ZShsZWZ0LCByaWdodCkKICAgICByZXR1cm4gcmV2ZXJzZQogCiBfZXhwZWN0ZWRfbGV4aWNhbF90ZXN0X2RhdGEgPSBbJycsICdDQ0NQJywgJ2EnLCAnYWFhJywgJ2InLCAnYycsICdjY2NjZScsICdjY2NjZiddCiBfZXhwZWN0ZWRfbG93ZXJjYXNlX3Rlc3RfZGF0YSA9IFsnJywgJ2EnLCAnYWFhJywgJ2InLCAnYycsICdDQycsICdjY2NjZScsICdjY2NjZicsICdDQ0NQJ10KIAotY2xhc3MgQ29tcGFyYXRvclRlc3RzICh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA0KSA6Ci0gICAgICAgIGRlZiBhc3NlcnRUcnVlKHNlbGYsIGV4cHIsIG1zZz1Ob25lKSA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5mYWlsVW5sZXNzKGV4cHIsbXNnPW1zZykKLQotICAgIGRlZiBjb21wYXJhdG9yX3Rlc3RfaGVscGVyIChzZWxmLCBjb21wYXJhdG9yLCBleHBlY3RlZF9kYXRhKToKK2NsYXNzIENvbXBhcmF0b3JUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSkgOgorICAgIGRlZiBjb21wYXJhdG9yX3Rlc3RfaGVscGVyKHNlbGYsIGNvbXBhcmF0b3IsIGV4cGVjdGVkX2RhdGEpIDoKICAgICAgICAgZGF0YSA9IGV4cGVjdGVkX2RhdGFbOl0KIAogICAgICAgICBpbXBvcnQgc3lzCiAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNikgOgotICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA0KSA6Ci0gICAgICAgICAgICAgICAgZGF0YS5zb3J0KGNvbXBhcmF0b3IpCi0gICAgICAgICAgICBlbHNlIDoKLSAgICAgICAgICAgICAgICBkYXRhLnNvcnQoY21wPWNvbXBhcmF0b3IpCisgICAgICAgICAgICBkYXRhLnNvcnQoY21wPWNvbXBhcmF0b3IpCiAgICAgICAgIGVsc2UgOiAgIyBJbnNlcnRpb24gU29ydC4gUGxlYXNlLCBpbXByb3ZlCiAgICAgICAgICAgICBkYXRhMiA9IFtdCiAgICAgICAgICAgICBmb3IgaSBpbiBkYXRhIDoKQEAgLTYwLDE0MyArNTMsMTM5IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgZXhwZWN0ZWRfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcGFyYXRvciBgJXMnIGlzIG5vdCByaWdodDogJXMgdnMuICVzIgogICAgICAgICAgICAgICAgICAgICAgICAgICUgKGNvbXBhcmF0b3IsIGV4cGVjdGVkX2RhdGEsIGRhdGEpKQotICAgIGRlZiB0ZXN0X2xleGljYWxfY29tcGFyYXRvciAoc2VsZik6Ci0gICAgICAgIHNlbGYuY29tcGFyYXRvcl90ZXN0X2hlbHBlciAobGV4aWNhbF9jbXAsIF9leHBlY3RlZF9sZXhpY2FsX3Rlc3RfZGF0YSkKLSAgICBkZWYgdGVzdF9yZXZlcnNlX2xleGljYWxfY29tcGFyYXRvciAoc2VsZik6CisgICAgZGVmIHRlc3RfbGV4aWNhbF9jb21wYXJhdG9yKHNlbGYpIDoKKyAgICAgICAgc2VsZi5jb21wYXJhdG9yX3Rlc3RfaGVscGVyKGxleGljYWxfY21wLCBfZXhwZWN0ZWRfbGV4aWNhbF90ZXN0X2RhdGEpCisgICAgZGVmIHRlc3RfcmV2ZXJzZV9sZXhpY2FsX2NvbXBhcmF0b3Ioc2VsZikgOgogICAgICAgICByZXYgPSBfZXhwZWN0ZWRfbGV4aWNhbF90ZXN0X2RhdGFbOl0KLSAgICAgICAgcmV2LnJldmVyc2UgKCkKLSAgICAgICAgc2VsZi5jb21wYXJhdG9yX3Rlc3RfaGVscGVyIChtYWtlX3JldmVyc2VfY29tcGFyYXRvciAobGV4aWNhbF9jbXApLAorICAgICAgICByZXYucmV2ZXJzZSgpCisgICAgICAgIHNlbGYuY29tcGFyYXRvcl90ZXN0X2hlbHBlcihtYWtlX3JldmVyc2VfY29tcGFyYXRvcihsZXhpY2FsX2NtcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2KQotICAgIGRlZiB0ZXN0X2xvd2VyY2FzZV9jb21wYXJhdG9yIChzZWxmKToKLSAgICAgICAgc2VsZi5jb21wYXJhdG9yX3Rlc3RfaGVscGVyIChsb3dlcmNhc2VfY21wLAorICAgIGRlZiB0ZXN0X2xvd2VyY2FzZV9jb21wYXJhdG9yKHNlbGYpIDoKKyAgICAgICAgc2VsZi5jb21wYXJhdG9yX3Rlc3RfaGVscGVyKGxvd2VyY2FzZV9jbXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2V4cGVjdGVkX2xvd2VyY2FzZV90ZXN0X2RhdGEpCiAKLWNsYXNzIEFic3RyYWN0QnRyZWVLZXlDb21wYXJlVGVzdENhc2UgKHVuaXR0ZXN0LlRlc3RDYXNlKToKK2NsYXNzIEFic3RyYWN0QnRyZWVLZXlDb21wYXJlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpIDoKICAgICBlbnYgPSBOb25lCiAgICAgZGIgPSBOb25lCiAKLSAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDQpIDoKLSAgICAgICAgZGVmIGFzc2VydFRydWUoc2VsZiwgZXhwciwgbXNnPU5vbmUpOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGV4cHIsbXNnPW1zZykKLQogICAgIGlmIChzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDcpKSBvciAoKHN5cy52ZXJzaW9uX2luZm8gPj0gKDMsMCkpIGFuZAogICAgICAgICAgICAgKHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMikpKSA6CiAgICAgICAgIGRlZiBhc3NlcnRMZXNzKHNlbGYsIGEsIGIsIG1zZz1Ob25lKSA6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5hc3NlcnRUcnVlKGE8YiwgbXNnPW1zZykKIAotICAgIGRlZiBzZXRVcCAoc2VsZik6CisgICAgZGVmIHNldFVwKHNlbGYpIDoKICAgICAgICAgc2VsZi5maWxlbmFtZSA9IHNlbGYuX19jbGFzc19fLl9fbmFtZV9fICsgJy5kYicKICAgICAgICAgc2VsZi5ob21lRGlyID0gZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoKCkKICAgICAgICAgZW52ID0gZGIuREJFbnYoKQotICAgICAgICBlbnYub3BlbiAoc2VsZi5ob21lRGlyLAorICAgICAgICBlbnYub3BlbihzZWxmLmhvbWVEaXIsCiAgICAgICAgICAgICAgICAgICBkYi5EQl9DUkVBVEUgfCBkYi5EQl9JTklUX01QT09MCiAgICAgICAgICAgICAgICAgICB8IGRiLkRCX0lOSVRfTE9DSyB8IGRiLkRCX1RIUkVBRCkKICAgICAgICAgc2VsZi5lbnYgPSBlbnYKIAotICAgIGRlZiB0ZWFyRG93biAoc2VsZik6CisgICAgZGVmIHRlYXJEb3duKHNlbGYpIDoKICAgICAgICAgc2VsZi5jbG9zZURCKCkKICAgICAgICAgaWYgc2VsZi5lbnYgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICBzZWxmLmVudi5jbG9zZSgpCiAgICAgICAgICAgICBzZWxmLmVudiA9IE5vbmUKICAgICAgICAgdGVzdF9zdXBwb3J0LnJtdHJlZShzZWxmLmhvbWVEaXIpCiAKLSAgICBkZWYgYWRkRGF0YVRvREIgKHNlbGYsIGRhdGEpOgorICAgIGRlZiBhZGREYXRhVG9EQihzZWxmLCBkYXRhKSA6CiAgICAgICAgIGkgPSAwCiAgICAgICAgIGZvciBpdGVtIGluIGRhdGE6Ci0gICAgICAgICAgICBzZWxmLmRiLnB1dCAoaXRlbSwgc3RyIChpKSkKKyAgICAgICAgICAgIHNlbGYuZGIucHV0KGl0ZW0sIHN0cihpKSkKICAgICAgICAgICAgIGkgPSBpICsgMQogCi0gICAgZGVmIGNyZWF0ZURCIChzZWxmLCBrZXlfY29tcGFyYXRvcik6Ci0gICAgICAgIHNlbGYuZGIgPSBkYi5EQiAoc2VsZi5lbnYpCi0gICAgICAgIHNlbGYuc2V0dXBEQiAoa2V5X2NvbXBhcmF0b3IpCi0gICAgICAgIHNlbGYuZGIub3BlbiAoc2VsZi5maWxlbmFtZSwgInRlc3QiLCBkYi5EQl9CVFJFRSwgZGIuREJfQ1JFQVRFKQorICAgIGRlZiBjcmVhdGVEQihzZWxmLCBrZXlfY29tcGFyYXRvcikgOgorICAgICAgICBzZWxmLmRiID0gZGIuREIoc2VsZi5lbnYpCisgICAgICAgIHNlbGYuc2V0dXBEQihrZXlfY29tcGFyYXRvcikKKyAgICAgICAgc2VsZi5kYi5vcGVuKHNlbGYuZmlsZW5hbWUsICJ0ZXN0IiwgZGIuREJfQlRSRUUsIGRiLkRCX0NSRUFURSkKIAotICAgIGRlZiBzZXR1cERCIChzZWxmLCBrZXlfY29tcGFyYXRvcik6Ci0gICAgICAgIHNlbGYuZGIuc2V0X2J0X2NvbXBhcmUgKGtleV9jb21wYXJhdG9yKQorICAgIGRlZiBzZXR1cERCKHNlbGYsIGtleV9jb21wYXJhdG9yKSA6CisgICAgICAgIHNlbGYuZGIuc2V0X2J0X2NvbXBhcmUoa2V5X2NvbXBhcmF0b3IpCiAKLSAgICBkZWYgY2xvc2VEQiAoc2VsZik6CisgICAgZGVmIGNsb3NlREIoc2VsZikgOgogICAgICAgICBpZiBzZWxmLmRiIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2VsZi5kYi5jbG9zZSAoKQorICAgICAgICAgICAgc2VsZi5kYi5jbG9zZSgpCiAgICAgICAgICAgICBzZWxmLmRiID0gTm9uZQogCi0gICAgZGVmIHN0YXJ0VGVzdCAoc2VsZik6CisgICAgZGVmIHN0YXJ0VGVzdChzZWxmKSA6CiAgICAgICAgIHBhc3MKIAotICAgIGRlZiBmaW5pc2hUZXN0IChzZWxmLCBleHBlY3RlZCA9IE5vbmUpOgorICAgIGRlZiBmaW5pc2hUZXN0KHNlbGYsIGV4cGVjdGVkID0gTm9uZSkgOgogICAgICAgICBpZiBleHBlY3RlZCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHNlbGYuY2hlY2tfcmVzdWx0cyAoZXhwZWN0ZWQpCi0gICAgICAgIHNlbGYuY2xvc2VEQiAoKQorICAgICAgICAgICAgc2VsZi5jaGVja19yZXN1bHRzKGV4cGVjdGVkKQorICAgICAgICBzZWxmLmNsb3NlREIoKQogCi0gICAgZGVmIGNoZWNrX3Jlc3VsdHMgKHNlbGYsIGV4cGVjdGVkKToKLSAgICAgICAgY3VycyA9IHNlbGYuZGIuY3Vyc29yICgpCisgICAgZGVmIGNoZWNrX3Jlc3VsdHMoc2VsZiwgZXhwZWN0ZWQpIDoKKyAgICAgICAgY3VycyA9IHNlbGYuZGIuY3Vyc29yKCkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaW5kZXggPSAwCi0gICAgICAgICAgICByZWMgPSBjdXJzLmZpcnN0ICgpCisgICAgICAgICAgICByZWMgPSBjdXJzLmZpcnN0KCkKICAgICAgICAgICAgIHdoaWxlIHJlYzoKICAgICAgICAgICAgICAgICBrZXksIGlnbm9yZSA9IHJlYwotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0TGVzcyhpbmRleCwgbGVuIChleHBlY3RlZCksCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRMZXNzKGluZGV4LCBsZW4oZXhwZWN0ZWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvIG1hbnkgdmFsdWVzIHJldHVybmVkIGZyb20gY3Vyc29yIikKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkW2luZGV4XSwga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHZhbHVlIGAlcycgYXQgJWQgYnV0IGdvdCBgJXMnIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoZXhwZWN0ZWRbaW5kZXhdLCBpbmRleCwga2V5KSkKICAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4ICsgMQotICAgICAgICAgICAgICAgIHJlYyA9IGN1cnMubmV4dCAoKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmRleCwgbGVuIChleHBlY3RlZCksCisgICAgICAgICAgICAgICAgcmVjID0gY3Vycy5uZXh0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5kZXgsIGxlbihleHBlY3RlZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIHZhbHVlcyByZXR1cm5lZCBmcm9tIGN1cnNvciIpCiAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBjdXJzLmNsb3NlICgpCisgICAgICAgICAgICBjdXJzLmNsb3NlKCkKIAotY2xhc3MgQnRyZWVLZXlDb21wYXJlVGVzdENhc2UgKEFic3RyYWN0QnRyZWVLZXlDb21wYXJlVGVzdENhc2UpOgotICAgIGRlZiBydW5Db21wYXJlVGVzdCAoc2VsZiwgY29tcGFyYXRvciwgZGF0YSk6Ci0gICAgICAgIHNlbGYuc3RhcnRUZXN0ICgpCi0gICAgICAgIHNlbGYuY3JlYXRlREIgKGNvbXBhcmF0b3IpCi0gICAgICAgIHNlbGYuYWRkRGF0YVRvREIgKGRhdGEpCi0gICAgICAgIHNlbGYuZmluaXNoVGVzdCAoZGF0YSkKK2NsYXNzIEJ0cmVlS2V5Q29tcGFyZVRlc3RDYXNlKEFic3RyYWN0QnRyZWVLZXlDb21wYXJlVGVzdENhc2UpIDoKKyAgICBkZWYgcnVuQ29tcGFyZVRlc3Qoc2VsZiwgY29tcGFyYXRvciwgZGF0YSkgOgorICAgICAgICBzZWxmLnN0YXJ0VGVzdCgpCisgICAgICAgIHNlbGYuY3JlYXRlREIoY29tcGFyYXRvcikKKyAgICAgICAgc2VsZi5hZGREYXRhVG9EQihkYXRhKQorICAgICAgICBzZWxmLmZpbmlzaFRlc3QoZGF0YSkKIAotICAgIGRlZiB0ZXN0X2xleGljYWxfb3JkZXJpbmcgKHNlbGYpOgotICAgICAgICBzZWxmLnJ1bkNvbXBhcmVUZXN0IChsZXhpY2FsX2NtcCwgX2V4cGVjdGVkX2xleGljYWxfdGVzdF9kYXRhKQorICAgIGRlZiB0ZXN0X2xleGljYWxfb3JkZXJpbmcoc2VsZikgOgorICAgICAgICBzZWxmLnJ1bkNvbXBhcmVUZXN0KGxleGljYWxfY21wLCBfZXhwZWN0ZWRfbGV4aWNhbF90ZXN0X2RhdGEpCiAKLSAgICBkZWYgdGVzdF9yZXZlcnNlX2xleGljYWxfb3JkZXJpbmcgKHNlbGYpOgorICAgIGRlZiB0ZXN0X3JldmVyc2VfbGV4aWNhbF9vcmRlcmluZyhzZWxmKSA6CiAgICAgICAgIGV4cGVjdGVkX3Jldl9kYXRhID0gX2V4cGVjdGVkX2xleGljYWxfdGVzdF9kYXRhWzpdCi0gICAgICAgIGV4cGVjdGVkX3Jldl9kYXRhLnJldmVyc2UgKCkKLSAgICAgICAgc2VsZi5ydW5Db21wYXJlVGVzdCAobWFrZV9yZXZlcnNlX2NvbXBhcmF0b3IgKGxleGljYWxfY21wKSwKKyAgICAgICAgZXhwZWN0ZWRfcmV2X2RhdGEucmV2ZXJzZSgpCisgICAgICAgIHNlbGYucnVuQ29tcGFyZVRlc3QobWFrZV9yZXZlcnNlX2NvbXBhcmF0b3IobGV4aWNhbF9jbXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9yZXZfZGF0YSkKIAotICAgIGRlZiB0ZXN0X2NvbXBhcmVfZnVuY3Rpb25fdXNlbGVzcyAoc2VsZik6Ci0gICAgICAgIHNlbGYuc3RhcnRUZXN0ICgpCi0gICAgICAgIGRlZiBzb2NpYWxpc3RfY29tcGFyYXRvciAobCwgcik6CisgICAgZGVmIHRlc3RfY29tcGFyZV9mdW5jdGlvbl91c2VsZXNzKHNlbGYpIDoKKyAgICAgICAgc2VsZi5zdGFydFRlc3QoKQorICAgICAgICBkZWYgc29jaWFsaXN0X2NvbXBhcmF0b3IobCwgcikgOgogICAgICAgICAgICAgcmV0dXJuIDAKLSAgICAgICAgc2VsZi5jcmVhdGVEQiAoc29jaWFsaXN0X2NvbXBhcmF0b3IpCi0gICAgICAgIHNlbGYuYWRkRGF0YVRvREIgKFsnYicsICdhJywgJ2QnXSkKKyAgICAgICAgc2VsZi5jcmVhdGVEQihzb2NpYWxpc3RfY29tcGFyYXRvcikKKyAgICAgICAgc2VsZi5hZGREYXRhVG9EQihbJ2InLCAnYScsICdkJ10pCiAgICAgICAgICMgYWxsIHRoaW5ncyBiZWluZyBlcXVhbCB0aGUgZmlyc3Qga2V5IHdpbGwgYmUgdGhlIG9ubHkga2V5CiAgICAgICAgICMgaW4gdGhlIGRhdGFiYXNlLi4uICAod2l0aCB0aGUgbGFzdCBrZXkncyB2YWx1ZSBmd2l3KQotICAgICAgICBzZWxmLmZpbmlzaFRlc3QgKFsnYiddKQorICAgICAgICBzZWxmLmZpbmlzaFRlc3QoWydiJ10pCiAKIAotY2xhc3MgQnRyZWVFeGNlcHRpb25zVGVzdENhc2UgKEFic3RyYWN0QnRyZWVLZXlDb21wYXJlVGVzdENhc2UpOgotICAgIGRlZiB0ZXN0X3JhaXNlc19ub25fY2FsbGFibGUgKHNlbGYpOgotICAgICAgICBzZWxmLnN0YXJ0VGVzdCAoKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyAoVHlwZUVycm9yLCBzZWxmLmNyZWF0ZURCLCAnYWJjJykKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMgKFR5cGVFcnJvciwgc2VsZi5jcmVhdGVEQiwgTm9uZSkKLSAgICAgICAgc2VsZi5maW5pc2hUZXN0ICgpCitjbGFzcyBCdHJlZUV4Y2VwdGlvbnNUZXN0Q2FzZShBYnN0cmFjdEJ0cmVlS2V5Q29tcGFyZVRlc3RDYXNlKSA6CisgICAgZGVmIHRlc3RfcmFpc2VzX25vbl9jYWxsYWJsZShzZWxmKSA6CisgICAgICAgIHNlbGYuc3RhcnRUZXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmNyZWF0ZURCLCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmNyZWF0ZURCLCBOb25lKQorICAgICAgICBzZWxmLmZpbmlzaFRlc3QoKQogCi0gICAgZGVmIHRlc3Rfc2V0X2J0X2NvbXBhcmVfd2l0aF9mdW5jdGlvbiAoc2VsZik6Ci0gICAgICAgIHNlbGYuc3RhcnRUZXN0ICgpCi0gICAgICAgIHNlbGYuY3JlYXRlREIgKGxleGljYWxfY21wKQotICAgICAgICBzZWxmLmZpbmlzaFRlc3QgKCkKKyAgICBkZWYgdGVzdF9zZXRfYnRfY29tcGFyZV93aXRoX2Z1bmN0aW9uKHNlbGYpIDoKKyAgICAgICAgc2VsZi5zdGFydFRlc3QoKQorICAgICAgICBzZWxmLmNyZWF0ZURCKGxleGljYWxfY21wKQorICAgICAgICBzZWxmLmZpbmlzaFRlc3QoKQogCi0gICAgZGVmIGNoZWNrX3Jlc3VsdHMgKHNlbGYsIHJlc3VsdHMpOgorICAgIGRlZiBjaGVja19yZXN1bHRzKHNlbGYsIHJlc3VsdHMpIDoKICAgICAgICAgcGFzcwogCi0gICAgZGVmIHRlc3RfY29tcGFyZV9mdW5jdGlvbl9pbmNvcnJlY3QgKHNlbGYpOgotICAgICAgICBzZWxmLnN0YXJ0VGVzdCAoKQotICAgICAgICBkZWYgYmFkX2NvbXBhcmF0b3IgKGwsIHIpOgorICAgIGRlZiB0ZXN0X2NvbXBhcmVfZnVuY3Rpb25faW5jb3JyZWN0KHNlbGYpIDoKKyAgICAgICAgc2VsZi5zdGFydFRlc3QoKQorICAgICAgICBkZWYgYmFkX2NvbXBhcmF0b3IobCwgcikgOgogICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICAgIyB2ZXJpZnkgdGhhdCBzZXRfYnRfY29tcGFyZSBjaGVja3MgdGhhdCBjb21wYXJhdG9yKCcnLCAnJykgPT0gMAotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyAoVHlwZUVycm9yLCBzZWxmLmNyZWF0ZURCLCBiYWRfY29tcGFyYXRvcikKLSAgICAgICAgc2VsZi5maW5pc2hUZXN0ICgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5jcmVhdGVEQiwgYmFkX2NvbXBhcmF0b3IpCisgICAgICAgIHNlbGYuZmluaXNoVGVzdCgpCiAKLSAgICBkZWYgdmVyaWZ5U3RkZXJyKHNlbGYsIG1ldGhvZCwgc3VjY2Vzc1JlKToKKyAgICBkZWYgdmVyaWZ5U3RkZXJyKHNlbGYsIG1ldGhvZCwgc3VjY2Vzc1JlKSA6CiAgICAgICAgICIiIgogICAgICAgICBDYWxsIG1ldGhvZCgpIHdoaWxlIGNhcHR1cmluZyBzeXMuc3RkZXJyIG91dHB1dCBpbnRlcm5hbGx5IGFuZAogICAgICAgICBjYWxsIHNlbGYuZmFpbCgpIGlmIHN1Y2Nlc3NSZS5zZWFyY2goKSBkb2VzIG5vdCBtYXRjaCB0aGUgc3RkZXJyCkBAIC0yMTAsNjQgKzE5OSwyNDkgQEAKICAgICAgICAgICAgIHRlbXAgPSBzeXMuc3RkZXJyCiAgICAgICAgICAgICBzeXMuc3RkZXJyID0gc3RkRXJyCiAgICAgICAgICAgICBlcnJvck91dCA9IHRlbXAuZ2V0dmFsdWUoKQotICAgICAgICAgICAgaWYgbm90IHN1Y2Nlc3NSZS5zZWFyY2goZXJyb3JPdXQpOgorICAgICAgICAgICAgaWYgbm90IHN1Y2Nlc3NSZS5zZWFyY2goZXJyb3JPdXQpIDoKICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInVuZXhwZWN0ZWQgc3RkZXJyIG91dHB1dDpcbiIrZXJyb3JPdXQpCiAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMCkgOiAgIyBYWFg6IEhvdyB0byBkbyB0aGlzIGluIFB5M2sgPz8/CiAgICAgICAgICAgICBzeXMuZXhjX3RyYWNlYmFjayA9IHN5cy5sYXN0X3RyYWNlYmFjayA9IE5vbmUKIAotICAgIGRlZiBfdGVzdF9jb21wYXJlX2Z1bmN0aW9uX2V4Y2VwdGlvbiAoc2VsZik6Ci0gICAgICAgIHNlbGYuc3RhcnRUZXN0ICgpCi0gICAgICAgIGRlZiBiYWRfY29tcGFyYXRvciAobCwgcik6CisgICAgZGVmIF90ZXN0X2NvbXBhcmVfZnVuY3Rpb25fZXhjZXB0aW9uKHNlbGYpIDoKKyAgICAgICAgc2VsZi5zdGFydFRlc3QoKQorICAgICAgICBkZWYgYmFkX2NvbXBhcmF0b3IobCwgcikgOgogICAgICAgICAgICAgaWYgbCA9PSByOgogICAgICAgICAgICAgICAgICMgcGFzcyB0aGUgc2V0X2J0X2NvbXBhcmUgdGVzdAogICAgICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJpJ20gYSBuYXVnaHR5IGNvbXBhcmlzb24gZnVuY3Rpb24iCi0gICAgICAgIHNlbGYuY3JlYXRlREIgKGJhZF9jb21wYXJhdG9yKQorICAgICAgICBzZWxmLmNyZWF0ZURCKGJhZF9jb21wYXJhdG9yKQogICAgICAgICAjcHJpbnQgIlxuKioqIHRlc3Qgc2hvdWxkIHByaW50IDIgdW5jYXRjaGFibGUgdHJhY2ViYWNrcyAqKioiCi0gICAgICAgIHNlbGYuYWRkRGF0YVRvREIgKFsnYScsICdiJywgJ2MnXSkgICMgdGhpcyBzaG91bGQgcmFpc2UsIGJ1dC4uLgotICAgICAgICBzZWxmLmZpbmlzaFRlc3QgKCkKKyAgICAgICAgc2VsZi5hZGREYXRhVG9EQihbJ2EnLCAnYicsICdjJ10pICAjIHRoaXMgc2hvdWxkIHJhaXNlLCBidXQuLi4KKyAgICAgICAgc2VsZi5maW5pc2hUZXN0KCkKIAotICAgIGRlZiB0ZXN0X2NvbXBhcmVfZnVuY3Rpb25fZXhjZXB0aW9uKHNlbGYpOgorICAgIGRlZiB0ZXN0X2NvbXBhcmVfZnVuY3Rpb25fZXhjZXB0aW9uKHNlbGYpIDoKICAgICAgICAgc2VsZi52ZXJpZnlTdGRlcnIoCiAgICAgICAgICAgICAgICAgc2VsZi5fdGVzdF9jb21wYXJlX2Z1bmN0aW9uX2V4Y2VwdGlvbiwKICAgICAgICAgICAgICAgICByZS5jb21waWxlKCcoXlJ1bnRpbWVFcnJvcjouKiBuYXVnaHR5LiopezJ9JywgcmUuTXxyZS5TKQogICAgICAgICApCiAKLSAgICBkZWYgX3Rlc3RfY29tcGFyZV9mdW5jdGlvbl9iYWRfcmV0dXJuIChzZWxmKToKLSAgICAgICAgc2VsZi5zdGFydFRlc3QgKCkKLSAgICAgICAgZGVmIGJhZF9jb21wYXJhdG9yIChsLCByKToKKyAgICBkZWYgX3Rlc3RfY29tcGFyZV9mdW5jdGlvbl9iYWRfcmV0dXJuKHNlbGYpIDoKKyAgICAgICAgc2VsZi5zdGFydFRlc3QoKQorICAgICAgICBkZWYgYmFkX2NvbXBhcmF0b3IobCwgcikgOgogICAgICAgICAgICAgaWYgbCA9PSByOgogICAgICAgICAgICAgICAgICMgcGFzcyB0aGUgc2V0X2J0X2NvbXBhcmUgdGVzdAogICAgICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgICAgICByZXR1cm4gbAotICAgICAgICBzZWxmLmNyZWF0ZURCIChiYWRfY29tcGFyYXRvcikKKyAgICAgICAgc2VsZi5jcmVhdGVEQihiYWRfY29tcGFyYXRvcikKICAgICAgICAgI3ByaW50ICJcbioqKiB0ZXN0IHNob3VsZCBwcmludCAyIGVycm9ycyBhYm91dCByZXR1cm5pbmcgYW4gaW50ICoqKiIKLSAgICAgICAgc2VsZi5hZGREYXRhVG9EQiAoWydhJywgJ2InLCAnYyddKSAgIyB0aGlzIHNob3VsZCByYWlzZSwgYnV0Li4uCi0gICAgICAgIHNlbGYuZmluaXNoVGVzdCAoKQorICAgICAgICBzZWxmLmFkZERhdGFUb0RCKFsnYScsICdiJywgJ2MnXSkgICMgdGhpcyBzaG91bGQgcmFpc2UsIGJ1dC4uLgorICAgICAgICBzZWxmLmZpbmlzaFRlc3QoKQogCi0gICAgZGVmIHRlc3RfY29tcGFyZV9mdW5jdGlvbl9iYWRfcmV0dXJuKHNlbGYpOgorICAgIGRlZiB0ZXN0X2NvbXBhcmVfZnVuY3Rpb25fYmFkX3JldHVybihzZWxmKSA6CiAgICAgICAgIHNlbGYudmVyaWZ5U3RkZXJyKAogICAgICAgICAgICAgICAgIHNlbGYuX3Rlc3RfY29tcGFyZV9mdW5jdGlvbl9iYWRfcmV0dXJuLAogICAgICAgICAgICAgICAgIHJlLmNvbXBpbGUoJyheVHlwZUVycm9yOi4qIHJldHVybiBhbiBpbnQuKil7Mn0nLCByZS5NfHJlLlMpCiAgICAgICAgICkKIAogCi0gICAgZGVmIHRlc3RfY2Fubm90X2Fzc2lnbl90d2ljZSAoc2VsZik6CisgICAgZGVmIHRlc3RfY2Fubm90X2Fzc2lnbl90d2ljZShzZWxmKSA6CiAKLSAgICAgICAgZGVmIG15X2NvbXBhcmUgKGEsIGIpOgorICAgICAgICBkZWYgbXlfY29tcGFyZShhLCBiKSA6CiAgICAgICAgICAgICByZXR1cm4gMAogCiAgICAgICAgIHNlbGYuc3RhcnRUZXN0KCkKICAgICAgICAgc2VsZi5jcmVhdGVEQihteV9jb21wYXJlKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyAoUnVudGltZUVycm9yLCBzZWxmLmRiLnNldF9idF9jb21wYXJlLCBteV9jb21wYXJlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHNlbGYuZGIuc2V0X2J0X2NvbXBhcmUsIG15X2NvbXBhcmUpCiAKLWRlZiB0ZXN0X3N1aXRlICgpOgotICAgIHJlcyA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSAoKQorY2xhc3MgQWJzdHJhY3REdXBsaWNhdGVDb21wYXJlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpIDoKKyAgICBlbnYgPSBOb25lCisgICAgZGIgPSBOb25lCiAKLSAgICByZXMuYWRkVGVzdCAodW5pdHRlc3QubWFrZVN1aXRlIChDb21wYXJhdG9yVGVzdHMpKQotICAgIHJlcy5hZGRUZXN0ICh1bml0dGVzdC5tYWtlU3VpdGUgKEJ0cmVlRXhjZXB0aW9uc1Rlc3RDYXNlKSkKLSAgICByZXMuYWRkVGVzdCAodW5pdHRlc3QubWFrZVN1aXRlIChCdHJlZUtleUNvbXBhcmVUZXN0Q2FzZSkpCisgICAgaWYgKHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNykpIG9yICgoc3lzLnZlcnNpb25faW5mbyA+PSAoMywwKSkgYW5kCisgICAgICAgICAgICAoc3lzLnZlcnNpb25faW5mbyA8ICgzLCAyKSkpIDoKKyAgICAgICAgZGVmIGFzc2VydExlc3Moc2VsZiwgYSwgYiwgbXNnPU5vbmUpIDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmFzc2VydFRydWUoYTxiLCBtc2c9bXNnKQorCisgICAgZGVmIHNldFVwKHNlbGYpIDoKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IHNlbGYuX19jbGFzc19fLl9fbmFtZV9fICsgJy5kYicKKyAgICAgICAgc2VsZi5ob21lRGlyID0gZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoKCkKKyAgICAgICAgZW52ID0gZGIuREJFbnYoKQorICAgICAgICBlbnYub3BlbihzZWxmLmhvbWVEaXIsCisgICAgICAgICAgICAgICAgICBkYi5EQl9DUkVBVEUgfCBkYi5EQl9JTklUX01QT09MCisgICAgICAgICAgICAgICAgICB8IGRiLkRCX0lOSVRfTE9DSyB8IGRiLkRCX1RIUkVBRCkKKyAgICAgICAgc2VsZi5lbnYgPSBlbnYKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKSA6CisgICAgICAgIHNlbGYuY2xvc2VEQigpCisgICAgICAgIGlmIHNlbGYuZW52IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5lbnYuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5lbnYgPSBOb25lCisgICAgICAgIHRlc3Rfc3VwcG9ydC5ybXRyZWUoc2VsZi5ob21lRGlyKQorCisgICAgZGVmIGFkZERhdGFUb0RCKHNlbGYsIGRhdGEpIDoKKyAgICAgICAgZm9yIGl0ZW0gaW4gZGF0YToKKyAgICAgICAgICAgIHNlbGYuZGIucHV0KCJrZXkiLCBpdGVtKQorCisgICAgZGVmIGNyZWF0ZURCKHNlbGYsIGR1cF9jb21wYXJhdG9yKSA6CisgICAgICAgIHNlbGYuZGIgPSBkYi5EQihzZWxmLmVudikKKyAgICAgICAgc2VsZi5zZXR1cERCKGR1cF9jb21wYXJhdG9yKQorICAgICAgICBzZWxmLmRiLm9wZW4oc2VsZi5maWxlbmFtZSwgInRlc3QiLCBkYi5EQl9CVFJFRSwgZGIuREJfQ1JFQVRFKQorCisgICAgZGVmIHNldHVwREIoc2VsZiwgZHVwX2NvbXBhcmF0b3IpIDoKKyAgICAgICAgc2VsZi5kYi5zZXRfZmxhZ3MoZGIuREJfRFVQU09SVCkKKyAgICAgICAgc2VsZi5kYi5zZXRfZHVwX2NvbXBhcmUoZHVwX2NvbXBhcmF0b3IpCisKKyAgICBkZWYgY2xvc2VEQihzZWxmKSA6CisgICAgICAgIGlmIHNlbGYuZGIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmRiLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuZGIgPSBOb25lCisKKyAgICBkZWYgc3RhcnRUZXN0KHNlbGYpIDoKKyAgICAgICAgcGFzcworCisgICAgZGVmIGZpbmlzaFRlc3Qoc2VsZiwgZXhwZWN0ZWQgPSBOb25lKSA6CisgICAgICAgIGlmIGV4cGVjdGVkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5jaGVja19yZXN1bHRzKGV4cGVjdGVkKQorICAgICAgICBzZWxmLmNsb3NlREIoKQorCisgICAgZGVmIGNoZWNrX3Jlc3VsdHMoc2VsZiwgZXhwZWN0ZWQpIDoKKyAgICAgICAgY3VycyA9IHNlbGYuZGIuY3Vyc29yKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW5kZXggPSAwCisgICAgICAgICAgICByZWMgPSBjdXJzLmZpcnN0KCkKKyAgICAgICAgICAgIHdoaWxlIHJlYzoKKyAgICAgICAgICAgICAgICBpZ25vcmUsIGRhdGEgPSByZWMKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydExlc3MoaW5kZXgsIGxlbihleHBlY3RlZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gbWFueSB2YWx1ZXMgcmV0dXJuZWQgZnJvbSBjdXJzb3IiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRbaW5kZXhdLCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHZhbHVlIGAlcycgYXQgJWQgYnV0IGdvdCBgJXMnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoZXhwZWN0ZWRbaW5kZXhdLCBpbmRleCwgZGF0YSkpCisgICAgICAgICAgICAgICAgaW5kZXggPSBpbmRleCArIDEKKyAgICAgICAgICAgICAgICByZWMgPSBjdXJzLm5leHQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmRleCwgbGVuKGV4cGVjdGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBlbm91Z2ggdmFsdWVzIHJldHVybmVkIGZyb20gY3Vyc29yIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGN1cnMuY2xvc2UoKQorCitjbGFzcyBEdXBsaWNhdGVDb21wYXJlVGVzdENhc2UoQWJzdHJhY3REdXBsaWNhdGVDb21wYXJlVGVzdENhc2UpIDoKKyAgICBkZWYgcnVuQ29tcGFyZVRlc3Qoc2VsZiwgY29tcGFyYXRvciwgZGF0YSkgOgorICAgICAgICBzZWxmLnN0YXJ0VGVzdCgpCisgICAgICAgIHNlbGYuY3JlYXRlREIoY29tcGFyYXRvcikKKyAgICAgICAgc2VsZi5hZGREYXRhVG9EQihkYXRhKQorICAgICAgICBzZWxmLmZpbmlzaFRlc3QoZGF0YSkKKworICAgIGRlZiB0ZXN0X2xleGljYWxfb3JkZXJpbmcoc2VsZikgOgorICAgICAgICBzZWxmLnJ1bkNvbXBhcmVUZXN0KGxleGljYWxfY21wLCBfZXhwZWN0ZWRfbGV4aWNhbF90ZXN0X2RhdGEpCisKKyAgICBkZWYgdGVzdF9yZXZlcnNlX2xleGljYWxfb3JkZXJpbmcoc2VsZikgOgorICAgICAgICBleHBlY3RlZF9yZXZfZGF0YSA9IF9leHBlY3RlZF9sZXhpY2FsX3Rlc3RfZGF0YVs6XQorICAgICAgICBleHBlY3RlZF9yZXZfZGF0YS5yZXZlcnNlKCkKKyAgICAgICAgc2VsZi5ydW5Db21wYXJlVGVzdChtYWtlX3JldmVyc2VfY29tcGFyYXRvcihsZXhpY2FsX2NtcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3Jldl9kYXRhKQorCitjbGFzcyBEdXBsaWNhdGVFeGNlcHRpb25zVGVzdENhc2UoQWJzdHJhY3REdXBsaWNhdGVDb21wYXJlVGVzdENhc2UpIDoKKyAgICBkZWYgdGVzdF9yYWlzZXNfbm9uX2NhbGxhYmxlKHNlbGYpIDoKKyAgICAgICAgc2VsZi5zdGFydFRlc3QoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuY3JlYXRlREIsICdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuY3JlYXRlREIsIE5vbmUpCisgICAgICAgIHNlbGYuZmluaXNoVGVzdCgpCisKKyAgICBkZWYgdGVzdF9zZXRfZHVwX2NvbXBhcmVfd2l0aF9mdW5jdGlvbihzZWxmKSA6CisgICAgICAgIHNlbGYuc3RhcnRUZXN0KCkKKyAgICAgICAgc2VsZi5jcmVhdGVEQihsZXhpY2FsX2NtcCkKKyAgICAgICAgc2VsZi5maW5pc2hUZXN0KCkKKworICAgIGRlZiBjaGVja19yZXN1bHRzKHNlbGYsIHJlc3VsdHMpIDoKKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfY29tcGFyZV9mdW5jdGlvbl9pbmNvcnJlY3Qoc2VsZikgOgorICAgICAgICBzZWxmLnN0YXJ0VGVzdCgpCisgICAgICAgIGRlZiBiYWRfY29tcGFyYXRvcihsLCByKSA6CisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAjIHZlcmlmeSB0aGF0IHNldF9kdXBfY29tcGFyZSBjaGVja3MgdGhhdCBjb21wYXJhdG9yKCcnLCAnJykgPT0gMAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuY3JlYXRlREIsIGJhZF9jb21wYXJhdG9yKQorICAgICAgICBzZWxmLmZpbmlzaFRlc3QoKQorCisgICAgZGVmIHRlc3RfY29tcGFyZV9mdW5jdGlvbl91c2VsZXNzKHNlbGYpIDoKKyAgICAgICAgc2VsZi5zdGFydFRlc3QoKQorICAgICAgICBkZWYgc29jaWFsaXN0X2NvbXBhcmF0b3IobCwgcikgOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgc2VsZi5jcmVhdGVEQihzb2NpYWxpc3RfY29tcGFyYXRvcikKKyAgICAgICAgIyBEVVBTT1JUIGRvZXMgbm90IGFsbG93ICJkdXBsaWNhdGUgZHVwbGljYXRlcyIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJLZXlFeGlzdEVycm9yLCBzZWxmLmFkZERhdGFUb0RCLCBbJ2InLCAnYScsICdkJ10pCisgICAgICAgIHNlbGYuZmluaXNoVGVzdCgpCisKKyAgICBkZWYgdmVyaWZ5U3RkZXJyKHNlbGYsIG1ldGhvZCwgc3VjY2Vzc1JlKSA6CisgICAgICAgICIiIgorICAgICAgICBDYWxsIG1ldGhvZCgpIHdoaWxlIGNhcHR1cmluZyBzeXMuc3RkZXJyIG91dHB1dCBpbnRlcm5hbGx5IGFuZAorICAgICAgICBjYWxsIHNlbGYuZmFpbCgpIGlmIHN1Y2Nlc3NSZS5zZWFyY2goKSBkb2VzIG5vdCBtYXRjaCB0aGUgc3RkZXJyCisgICAgICAgIG91dHB1dC4gIFRoaXMgaXMgdXNlZCB0byB0ZXN0IGZvciB1bmNhdGNoYWJsZSBleGNlcHRpb25zLgorICAgICAgICAiIiIKKyAgICAgICAgc3RkRXJyID0gc3lzLnN0ZGVycgorICAgICAgICBzeXMuc3RkZXJyID0gU3RyaW5nSU8oKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtZXRob2QoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdGVtcCA9IHN5cy5zdGRlcnIKKyAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBzdGRFcnIKKyAgICAgICAgICAgIGVycm9yT3V0ID0gdGVtcC5nZXR2YWx1ZSgpCisgICAgICAgICAgICBpZiBub3Qgc3VjY2Vzc1JlLnNlYXJjaChlcnJvck91dCkgOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgidW5leHBlY3RlZCBzdGRlcnIgb3V0cHV0OlxuIitlcnJvck91dCkKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAwKSA6ICAjIFhYWDogSG93IHRvIGRvIHRoaXMgaW4gUHkzayA/Pz8KKyAgICAgICAgICAgIHN5cy5leGNfdHJhY2ViYWNrID0gc3lzLmxhc3RfdHJhY2ViYWNrID0gTm9uZQorCisgICAgZGVmIF90ZXN0X2NvbXBhcmVfZnVuY3Rpb25fZXhjZXB0aW9uKHNlbGYpIDoKKyAgICAgICAgc2VsZi5zdGFydFRlc3QoKQorICAgICAgICBkZWYgYmFkX2NvbXBhcmF0b3IobCwgcikgOgorICAgICAgICAgICAgaWYgbCA9PSByOgorICAgICAgICAgICAgICAgICMgcGFzcyB0aGUgc2V0X2R1cF9jb21wYXJlIHRlc3QKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiaSdtIGEgbmF1Z2h0eSBjb21wYXJpc29uIGZ1bmN0aW9uIgorICAgICAgICBzZWxmLmNyZWF0ZURCKGJhZF9jb21wYXJhdG9yKQorICAgICAgICAjcHJpbnQgIlxuKioqIHRlc3Qgc2hvdWxkIHByaW50IDIgdW5jYXRjaGFibGUgdHJhY2ViYWNrcyAqKioiCisgICAgICAgIHNlbGYuYWRkRGF0YVRvREIoWydhJywgJ2InLCAnYyddKSAgIyB0aGlzIHNob3VsZCByYWlzZSwgYnV0Li4uCisgICAgICAgIHNlbGYuZmluaXNoVGVzdCgpCisKKyAgICBkZWYgdGVzdF9jb21wYXJlX2Z1bmN0aW9uX2V4Y2VwdGlvbihzZWxmKSA6CisgICAgICAgIHNlbGYudmVyaWZ5U3RkZXJyKAorICAgICAgICAgICAgICAgIHNlbGYuX3Rlc3RfY29tcGFyZV9mdW5jdGlvbl9leGNlcHRpb24sCisgICAgICAgICAgICAgICAgcmUuY29tcGlsZSgnKF5SdW50aW1lRXJyb3I6LiogbmF1Z2h0eS4qKXsyfScsIHJlLk18cmUuUykKKyAgICAgICAgKQorCisgICAgZGVmIF90ZXN0X2NvbXBhcmVfZnVuY3Rpb25fYmFkX3JldHVybihzZWxmKSA6CisgICAgICAgIHNlbGYuc3RhcnRUZXN0KCkKKyAgICAgICAgZGVmIGJhZF9jb21wYXJhdG9yKGwsIHIpIDoKKyAgICAgICAgICAgIGlmIGwgPT0gcjoKKyAgICAgICAgICAgICAgICAjIHBhc3MgdGhlIHNldF9kdXBfY29tcGFyZSB0ZXN0CisgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgIHJldHVybiBsCisgICAgICAgIHNlbGYuY3JlYXRlREIoYmFkX2NvbXBhcmF0b3IpCisgICAgICAgICNwcmludCAiXG4qKiogdGVzdCBzaG91bGQgcHJpbnQgMiBlcnJvcnMgYWJvdXQgcmV0dXJuaW5nIGFuIGludCAqKioiCisgICAgICAgIHNlbGYuYWRkRGF0YVRvREIoWydhJywgJ2InLCAnYyddKSAgIyB0aGlzIHNob3VsZCByYWlzZSwgYnV0Li4uCisgICAgICAgIHNlbGYuZmluaXNoVGVzdCgpCisKKyAgICBkZWYgdGVzdF9jb21wYXJlX2Z1bmN0aW9uX2JhZF9yZXR1cm4oc2VsZikgOgorICAgICAgICBzZWxmLnZlcmlmeVN0ZGVycigKKyAgICAgICAgICAgICAgICBzZWxmLl90ZXN0X2NvbXBhcmVfZnVuY3Rpb25fYmFkX3JldHVybiwKKyAgICAgICAgICAgICAgICByZS5jb21waWxlKCcoXlR5cGVFcnJvcjouKiByZXR1cm4gYW4gaW50LiopezJ9JywgcmUuTXxyZS5TKQorICAgICAgICApCisKKworICAgIGRlZiB0ZXN0X2Nhbm5vdF9hc3NpZ25fdHdpY2Uoc2VsZikgOgorCisgICAgICAgIGRlZiBteV9jb21wYXJlKGEsIGIpIDoKKyAgICAgICAgICAgIHJldHVybiAwCisKKyAgICAgICAgc2VsZi5zdGFydFRlc3QoKQorICAgICAgICBzZWxmLmNyZWF0ZURCKG15X2NvbXBhcmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgc2VsZi5kYi5zZXRfZHVwX2NvbXBhcmUsIG15X2NvbXBhcmUpCisKK2RlZiB0ZXN0X3N1aXRlKCkgOgorICAgIHJlcyA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisKKyAgICByZXMuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoQ29tcGFyYXRvclRlc3RzKSkKKyAgICByZXMuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoQnRyZWVFeGNlcHRpb25zVGVzdENhc2UpKQorICAgIHJlcy5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShCdHJlZUtleUNvbXBhcmVUZXN0Q2FzZSkpCisgICAgcmVzLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKER1cGxpY2F0ZUV4Y2VwdGlvbnNUZXN0Q2FzZSkpCisgICAgcmVzLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKER1cGxpY2F0ZUNvbXBhcmVUZXN0Q2FzZSkpCiAgICAgcmV0dXJuIHJlcwogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIHVuaXR0ZXN0Lm1haW4gKGRlZmF1bHRUZXN0ID0gJ3N1aXRlJykKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0ID0gJ3N1aXRlJykKZGlmZiAtLWdpdCBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfZGIucHkgYi9MaWIvYnNkZGIvdGVzdC90ZXN0X2RiLnB5CmluZGV4IDhkM2EzMmIuLjJiYzEwOWYgMTAwNjQ0Ci0tLSBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfZGIucHkKKysrIGIvTGliL2JzZGRiL3Rlc3QvdGVzdF9kYi5weQpAQCAtNywxMSArNyw2IEBACiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBjbGFzcyBEQih1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgaW1wb3J0IHN5cwotICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNCkgOgotICAgICAgICBkZWYgYXNzZXJ0VHJ1ZShzZWxmLCBleHByLCBtc2c9Tm9uZSk6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZXhwcixtc2c9bXNnKQotCiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLnBhdGggPSBnZXRfbmV3X2RhdGFiYXNlX3BhdGgoKQogICAgICAgICBzZWxmLmRiID0gZGIuREIoKQpAQCAtMTksMTAgKzE0LDI4IEBACiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzZWxmLmRiLmNsb3NlKCkKICAgICAgICAgZGVsIHNlbGYuZGIKLSAgICAgICAgdGVzdF9zdXBwb3J0LnJtdHJlZShzZWxmLnBhdGgpCisgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoc2VsZi5wYXRoKQogCiBjbGFzcyBEQl9nZW5lcmFsKERCKSA6Ci0gICAgaWYgZGIudmVyc2lvbigpID49ICg0LCAyKSA6CisgICAgZGVmIHRlc3RfZ2V0X29wZW5fZmxhZ3Moc2VsZikgOgorICAgICAgICBzZWxmLmRiLm9wZW4oc2VsZi5wYXRoLCBkYnR5cGU9ZGIuREJfSEFTSCwgZmxhZ3MgPSBkYi5EQl9DUkVBVEUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGIuREJfQ1JFQVRFLCBzZWxmLmRiLmdldF9vcGVuX2ZsYWdzKCkpCisKKyAgICBkZWYgdGVzdF9nZXRfb3Blbl9mbGFnczIoc2VsZikgOgorICAgICAgICBzZWxmLmRiLm9wZW4oc2VsZi5wYXRoLCBkYnR5cGU9ZGIuREJfSEFTSCwgZmxhZ3MgPSBkYi5EQl9DUkVBVEUgfAorICAgICAgICAgICAgICAgIGRiLkRCX1RIUkVBRCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYi5EQl9DUkVBVEUgfCBkYi5EQl9USFJFQUQsIHNlbGYuZGIuZ2V0X29wZW5fZmxhZ3MoKSkKKworICAgIGRlZiB0ZXN0X2dldF9kYm5hbWVfZmlsZW5hbWUoc2VsZikgOgorICAgICAgICBzZWxmLmRiLm9wZW4oc2VsZi5wYXRoLCBkYnR5cGU9ZGIuREJfSEFTSCwgZmxhZ3MgPSBkYi5EQl9DUkVBVEUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHNlbGYucGF0aCwgTm9uZSksIHNlbGYuZGIuZ2V0X2RibmFtZSgpKQorCisgICAgZGVmIHRlc3RfZ2V0X2RibmFtZV9maWxlbmFtZV9kYXRhYmFzZShzZWxmKSA6CisgICAgICAgIG5hbWUgPSAiamNlYS1yYW5kb20tbmFtZSIKKyAgICAgICAgc2VsZi5kYi5vcGVuKHNlbGYucGF0aCwgZGJuYW1lPW5hbWUsIGRidHlwZT1kYi5EQl9IQVNILAorICAgICAgICAgICAgICAgIGZsYWdzID0gZGIuREJfQ1JFQVRFKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChzZWxmLnBhdGgsIG5hbWUpLCBzZWxmLmRiLmdldF9kYm5hbWUoKSkKKwogICAgICAgICBkZWYgdGVzdF9idF9taW5rZXkoc2VsZikgOgogICAgICAgICAgICAgZm9yIGkgaW4gWzE3LCAxMDgsIDEwMzBdIDoKICAgICAgICAgICAgICAgICBzZWxmLmRiLnNldF9idF9taW5rZXkoaSkKQEAgLTQ0LDMwICs1NywzNCBAQAogICAgICAgICAgICAgICAgIHNlbGYuZGIuc2V0X3ByaW9yaXR5KGZsYWcpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbGFnLCBzZWxmLmRiLmdldF9wcmlvcml0eSgpKQogCisgICAgZGVmIHRlc3RfZ2V0X3RyYW5zYWN0aW9uYWwoc2VsZikgOgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZGIuZ2V0X3RyYW5zYWN0aW9uYWwoKSkKKyAgICAgICAgc2VsZi5kYi5vcGVuKHNlbGYucGF0aCwgZGJ0eXBlPWRiLkRCX0hBU0gsIGZsYWdzID0gZGIuREJfQ1JFQVRFKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZGIuZ2V0X3RyYW5zYWN0aW9uYWwoKSkKKwogY2xhc3MgREJfaGFzaChEQikgOgotICAgIGlmIGRiLnZlcnNpb24oKSA+PSAoNCwgMikgOgotICAgICAgICBkZWYgdGVzdF9oX2ZmYWN0b3Ioc2VsZikgOgotICAgICAgICAgICAgZm9yIGZmYWN0b3IgaW4gWzQsIDE2LCAyNTZdIDoKLSAgICAgICAgICAgICAgICBzZWxmLmRiLnNldF9oX2ZmYWN0b3IoZmZhY3RvcikKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZmYWN0b3IsIHNlbGYuZGIuZ2V0X2hfZmZhY3RvcigpKQorICAgIGRlZiB0ZXN0X2hfZmZhY3RvcihzZWxmKSA6CisgICAgICAgIGZvciBmZmFjdG9yIGluIFs0LCAxNiwgMjU2XSA6CisgICAgICAgICAgICBzZWxmLmRiLnNldF9oX2ZmYWN0b3IoZmZhY3RvcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmZhY3Rvciwgc2VsZi5kYi5nZXRfaF9mZmFjdG9yKCkpCiAKLSAgICAgICAgZGVmIHRlc3RfaF9uZWxlbShzZWxmKSA6Ci0gICAgICAgICAgICBmb3IgbmVsZW0gaW4gWzEsIDIsIDRdIDoKLSAgICAgICAgICAgICAgICBuZWxlbSA9IG5lbGVtKjEwMjQqMTAyNCAgIyBNaWxsaW9ucwotICAgICAgICAgICAgICAgIHNlbGYuZGIuc2V0X2hfbmVsZW0obmVsZW0pCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZWxlbSwgc2VsZi5kYi5nZXRfaF9uZWxlbSgpKQorICAgIGRlZiB0ZXN0X2hfbmVsZW0oc2VsZikgOgorICAgICAgICBmb3IgbmVsZW0gaW4gWzEsIDIsIDRdIDoKKyAgICAgICAgICAgIG5lbGVtID0gbmVsZW0qMTAyNCoxMDI0ICAjIE1pbGxpb25zCisgICAgICAgICAgICBzZWxmLmRiLnNldF9oX25lbGVtKG5lbGVtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZWxlbSwgc2VsZi5kYi5nZXRfaF9uZWxlbSgpKQogCi0gICAgICAgIGRlZiB0ZXN0X3BhZ2VzaXplKHNlbGYpIDoKLSAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSg5LCAxNykgOiAgIyBGcm9tIDUxMiB0byA2NTUzNgotICAgICAgICAgICAgICAgIGkgPSAxPDxpCi0gICAgICAgICAgICAgICAgc2VsZi5kYi5zZXRfcGFnZXNpemUoaSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGksIHNlbGYuZGIuZ2V0X3BhZ2VzaXplKCkpCisgICAgZGVmIHRlc3RfcGFnZXNpemUoc2VsZikgOgorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoOSwgMTcpIDogICMgRnJvbSA1MTIgdG8gNjU1MzYKKyAgICAgICAgICAgIGkgPSAxPDxpCisgICAgICAgICAgICBzZWxmLmRiLnNldF9wYWdlc2l6ZShpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLCBzZWxmLmRiLmdldF9wYWdlc2l6ZSgpKQogCi0gICAgICAgICAgICAjIFRoZSB2YWxpZCB2YWx1ZXMgZ29lcyBmcm9tIDUxMiB0byA2NTUzNgotICAgICAgICAgICAgIyBUZXN0IDEzMTA3MiBieXRlcy4uLgotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJJbnZhbGlkQXJnRXJyb3IsIHNlbGYuZGIuc2V0X3BhZ2VzaXplLCAxPDwxNykKLSAgICAgICAgICAgICMgVGVzdCAyNTYgYnl0ZXMuLi4KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRiLkRCSW52YWxpZEFyZ0Vycm9yLCBzZWxmLmRiLnNldF9wYWdlc2l6ZSwgMTw8OCkKKyAgICAgICAgIyBUaGUgdmFsaWQgdmFsdWVzIGdvZXMgZnJvbSA1MTIgdG8gNjU1MzYKKyAgICAgICAgIyBUZXN0IDEzMTA3MiBieXRlcy4uLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhkYi5EQkludmFsaWRBcmdFcnJvciwgc2VsZi5kYi5zZXRfcGFnZXNpemUsIDE8PDE3KQorICAgICAgICAjIFRlc3QgMjU2IGJ5dGVzLi4uCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRiLkRCSW52YWxpZEFyZ0Vycm9yLCBzZWxmLmRiLnNldF9wYWdlc2l6ZSwgMTw8OCkKIAogY2xhc3MgREJfdHhuKERCKSA6CiAgICAgZGVmIHNldFVwKHNlbGYpIDoKQEAgLTg0LDcgKzEwMSw2IEBACiAgICAgICAgIGRlbCBzZWxmLmVudgogICAgICAgICB0ZXN0X3N1cHBvcnQucm10cmVlKHNlbGYuaG9tZURpcikKIAotICAgIGlmIGRiLnZlcnNpb24oKSA+PSAoNCwgMikgOgogICAgICAgICBkZWYgdGVzdF9mbGFncyhzZWxmKSA6CiAgICAgICAgICAgICBzZWxmLmRiLnNldF9mbGFncyhkYi5EQl9DSEtTVU0pCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRiLkRCX0NIS1NVTSwgc2VsZi5kYi5nZXRfZmxhZ3MoKSkKQEAgLTkyLDQwICsxMDgsNDUgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGIuREJfVFhOX05PVF9EVVJBQkxFIHwgZGIuREJfQ0hLU1VNLAogICAgICAgICAgICAgICAgICAgICBzZWxmLmRiLmdldF9mbGFncygpKQogCisgICAgZGVmIHRlc3RfZ2V0X3RyYW5zYWN0aW9uYWwoc2VsZikgOgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZGIuZ2V0X3RyYW5zYWN0aW9uYWwoKSkKKyAgICAgICAgIyBEQl9BVVRPX0NPTU1JVCA9IEltcGxpY2l0IHRyYW5zYWN0aW9uCisgICAgICAgIHNlbGYuZGIub3BlbigiWFhYIiwgZGJ0eXBlPWRiLkRCX0hBU0gsCisgICAgICAgICAgICAgICAgZmxhZ3MgPSBkYi5EQl9DUkVBVEUgfCBkYi5EQl9BVVRPX0NPTU1JVCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZGIuZ2V0X3RyYW5zYWN0aW9uYWwoKSkKKwogY2xhc3MgREJfcmVjbm8oREIpIDoKLSAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDQsIDIpIDoKLSAgICAgICAgZGVmIHRlc3RfcmVfcGFkKHNlbGYpIDoKLSAgICAgICAgICAgIGZvciBpIGluIFsnICcsICcqJ10gOiAgIyBDaGVjayBjaGFycwotICAgICAgICAgICAgICAgIHNlbGYuZGIuc2V0X3JlX3BhZChpKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3JkKGkpLCBzZWxmLmRiLmdldF9yZV9wYWQoKSkKLSAgICAgICAgICAgIGZvciBpIGluIFs5NywgNjVdIDogICMgQ2hlY2sgaW50ZWdlcnMKLSAgICAgICAgICAgICAgICBzZWxmLmRiLnNldF9yZV9wYWQoaSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGksIHNlbGYuZGIuZ2V0X3JlX3BhZCgpKQorICAgIGRlZiB0ZXN0X3JlX3BhZChzZWxmKSA6CisgICAgICAgIGZvciBpIGluIFsnICcsICcqJ10gOiAgIyBDaGVjayBjaGFycworICAgICAgICAgICAgc2VsZi5kYi5zZXRfcmVfcGFkKGkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9yZChpKSwgc2VsZi5kYi5nZXRfcmVfcGFkKCkpCisgICAgICAgIGZvciBpIGluIFs5NywgNjVdIDogICMgQ2hlY2sgaW50ZWdlcnMKKyAgICAgICAgICAgIHNlbGYuZGIuc2V0X3JlX3BhZChpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLCBzZWxmLmRiLmdldF9yZV9wYWQoKSkKIAotICAgICAgICBkZWYgdGVzdF9yZV9kZWxpbShzZWxmKSA6Ci0gICAgICAgICAgICBmb3IgaSBpbiBbJyAnLCAnKiddIDogICMgQ2hlY2sgY2hhcnMKLSAgICAgICAgICAgICAgICBzZWxmLmRiLnNldF9yZV9kZWxpbShpKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3JkKGkpLCBzZWxmLmRiLmdldF9yZV9kZWxpbSgpKQotICAgICAgICAgICAgZm9yIGkgaW4gWzk3LCA2NV0gOiAgIyBDaGVjayBpbnRlZ2VycwotICAgICAgICAgICAgICAgIHNlbGYuZGIuc2V0X3JlX2RlbGltKGkpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLCBzZWxmLmRiLmdldF9yZV9kZWxpbSgpKQorICAgIGRlZiB0ZXN0X3JlX2RlbGltKHNlbGYpIDoKKyAgICAgICAgZm9yIGkgaW4gWycgJywgJyonXSA6ICAjIENoZWNrIGNoYXJzCisgICAgICAgICAgICBzZWxmLmRiLnNldF9yZV9kZWxpbShpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcmQoaSksIHNlbGYuZGIuZ2V0X3JlX2RlbGltKCkpCisgICAgICAgIGZvciBpIGluIFs5NywgNjVdIDogICMgQ2hlY2sgaW50ZWdlcnMKKyAgICAgICAgICAgIHNlbGYuZGIuc2V0X3JlX2RlbGltKGkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGksIHNlbGYuZGIuZ2V0X3JlX2RlbGltKCkpCiAKLSAgICAgICAgZGVmIHRlc3RfcmVfc291cmNlKHNlbGYpIDoKLSAgICAgICAgICAgIGZvciBpIGluIFsidGVzdCIsICJ0ZXN0MiIsICJ0ZXN0MyJdIDoKLSAgICAgICAgICAgICAgICBzZWxmLmRiLnNldF9yZV9zb3VyY2UoaSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGksIHNlbGYuZGIuZ2V0X3JlX3NvdXJjZSgpKQorICAgIGRlZiB0ZXN0X3JlX3NvdXJjZShzZWxmKSA6CisgICAgICAgIGZvciBpIGluIFsidGVzdCIsICJ0ZXN0MiIsICJ0ZXN0MyJdIDoKKyAgICAgICAgICAgIHNlbGYuZGIuc2V0X3JlX3NvdXJjZShpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLCBzZWxmLmRiLmdldF9yZV9zb3VyY2UoKSkKIAogY2xhc3MgREJfcXVldWUoREIpIDoKLSAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDQsIDIpIDoKLSAgICAgICAgZGVmIHRlc3RfcmVfbGVuKHNlbGYpIDoKLSAgICAgICAgICAgIGZvciBpIGluIFszMywgNjUsIDMwMCwgMjAwMF0gOgotICAgICAgICAgICAgICAgIHNlbGYuZGIuc2V0X3JlX2xlbihpKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSwgc2VsZi5kYi5nZXRfcmVfbGVuKCkpCisgICAgZGVmIHRlc3RfcmVfbGVuKHNlbGYpIDoKKyAgICAgICAgZm9yIGkgaW4gWzMzLCA2NSwgMzAwLCAyMDAwXSA6CisgICAgICAgICAgICBzZWxmLmRiLnNldF9yZV9sZW4oaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSwgc2VsZi5kYi5nZXRfcmVfbGVuKCkpCiAKLSAgICAgICAgZGVmIHRlc3RfcV9leHRlbnRzaXplKHNlbGYpIDoKLSAgICAgICAgICAgIGZvciBpIGluIFsxLCA2MCwgMTAwXSA6Ci0gICAgICAgICAgICAgICAgc2VsZi5kYi5zZXRfcV9leHRlbnRzaXplKGkpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLCBzZWxmLmRiLmdldF9xX2V4dGVudHNpemUoKSkKKyAgICBkZWYgdGVzdF9xX2V4dGVudHNpemUoc2VsZikgOgorICAgICAgICBmb3IgaSBpbiBbMSwgNjAsIDEwMF0gOgorICAgICAgICAgICAgc2VsZi5kYi5zZXRfcV9leHRlbnRzaXplKGkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGksIHNlbGYuZGIuZ2V0X3FfZXh0ZW50c2l6ZSgpKQogCiBkZWYgdGVzdF9zdWl0ZSgpOgogICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKZGlmZiAtLWdpdCBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfZGJlbnYucHkgYi9MaWIvYnNkZGIvdGVzdC90ZXN0X2RiZW52LnB5CmluZGV4IDM3MjgxZGYuLjc2ZWY3ZGIgMTAwNjQ0Ci0tLSBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfZGJlbnYucHkKKysrIGIvTGliL2JzZGRiL3Rlc3QvdGVzdF9kYmVudi5weQpAQCAtNywxNCArNyw2IEBACiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBjbGFzcyBEQkVudih1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgaW1wb3J0IHN5cwotICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNCkgOgotICAgICAgICBkZWYgYXNzZXJ0VHJ1ZShzZWxmLCBleHByLCBtc2c9Tm9uZSk6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZXhwcixtc2c9bXNnKQotCi0gICAgICAgIGRlZiBhc3NlcnRGYWxzZShzZWxmLCBleHByLCBtc2c9Tm9uZSk6Ci0gICAgICAgICAgICBzZWxmLmZhaWxJZihleHByLG1zZz1tc2cpCi0KICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIHNlbGYuaG9tZURpciA9IGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCgpCiAgICAgICAgIHNlbGYuZW52ID0gZGIuREJFbnYoKQpAQCAtMjUsMTIgKzE3LDMxIEBACiAgICAgICAgIHRlc3Rfc3VwcG9ydC5ybXRyZWUoc2VsZi5ob21lRGlyKQogCiBjbGFzcyBEQkVudl9nZW5lcmFsKERCRW52KSA6CisgICAgZGVmIHRlc3RfZ2V0X29wZW5fZmxhZ3Moc2VsZikgOgorICAgICAgICBmbGFncyA9IGRiLkRCX0NSRUFURSB8IGRiLkRCX0lOSVRfTVBPT0wKKyAgICAgICAgc2VsZi5lbnYub3BlbihzZWxmLmhvbWVEaXIsIGZsYWdzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsYWdzLCBzZWxmLmVudi5nZXRfb3Blbl9mbGFncygpKQorCisgICAgZGVmIHRlc3RfZ2V0X29wZW5fZmxhZ3MyKHNlbGYpIDoKKyAgICAgICAgZmxhZ3MgPSBkYi5EQl9DUkVBVEUgfCBkYi5EQl9JTklUX01QT09MIHwgXAorICAgICAgICAgICAgICAgIGRiLkRCX0lOSVRfTE9DSyB8IGRiLkRCX1RIUkVBRAorICAgICAgICBzZWxmLmVudi5vcGVuKHNlbGYuaG9tZURpciwgZmxhZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxhZ3MsIHNlbGYuZW52LmdldF9vcGVuX2ZsYWdzKCkpCisKICAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDQsIDcpIDoKICAgICAgICAgZGVmIHRlc3RfbGtfcGFydGl0aW9ucyhzZWxmKSA6CiAgICAgICAgICAgICBmb3IgaSBpbiBbMTAsIDIwLCA0MF0gOgogICAgICAgICAgICAgICAgIHNlbGYuZW52LnNldF9sa19wYXJ0aXRpb25zKGkpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLCBzZWxmLmVudi5nZXRfbGtfcGFydGl0aW9ucygpKQogCisgICAgICAgIGRlZiB0ZXN0X2dldHNldF9pbnRlcm1lZGlhdGVfZGlyX21vZGUoc2VsZikgOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBzZWxmLmVudi5nZXRfaW50ZXJtZWRpYXRlX2Rpcl9tb2RlKCkpCisgICAgICAgICAgICBmb3IgbW9kZSBpbiBbInJ3eC0tLS0tLSIsICJydy1ydy1ydy0iLCAicnctci0tci0tIl0gOgorICAgICAgICAgICAgICAgIHNlbGYuZW52LnNldF9pbnRlcm1lZGlhdGVfZGlyX21vZGUobW9kZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZGUsIHNlbGYuZW52LmdldF9pbnRlcm1lZGlhdGVfZGlyX21vZGUoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRiLkRCSW52YWxpZEFyZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICBzZWxmLmVudi5zZXRfaW50ZXJtZWRpYXRlX2Rpcl9tb2RlLCAiYWJjZGUiKQorCiAgICAgaWYgZGIudmVyc2lvbigpID49ICg0LCA2KSA6CiAgICAgICAgIGRlZiB0ZXN0X3RocmVhZChzZWxmKSA6CiAgICAgICAgICAgICBmb3IgaSBpbiBbMTYsIDEwMCwgMTAwMF0gOgpAQCAtNTgsMjEgKzY5LDE5IEBACiAgICAgICAgICAgICAgICAgc2VsZi5lbnYuc2V0X2xnX2ZpbGVtb2RlKGkpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLCBzZWxmLmVudi5nZXRfbGdfZmlsZW1vZGUoKSkKIAotICAgIGlmIGRiLnZlcnNpb24oKSA+PSAoNCwgMykgOgotICAgICAgICBkZWYgdGVzdF9tcF9tYXhfb3BlbmZkKHNlbGYpIDoKLSAgICAgICAgICAgIGZvciBpIGluIFsxNywgMzEsIDQyXSA6Ci0gICAgICAgICAgICAgICAgc2VsZi5lbnYuc2V0X21wX21heF9vcGVuZmQoaSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGksIHNlbGYuZW52LmdldF9tcF9tYXhfb3BlbmZkKCkpCisgICAgZGVmIHRlc3RfbXBfbWF4X29wZW5mZChzZWxmKSA6CisgICAgICAgIGZvciBpIGluIFsxNywgMzEsIDQyXSA6CisgICAgICAgICAgICBzZWxmLmVudi5zZXRfbXBfbWF4X29wZW5mZChpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLCBzZWxmLmVudi5nZXRfbXBfbWF4X29wZW5mZCgpKQogCi0gICAgICAgIGRlZiB0ZXN0X21wX21heF93cml0ZShzZWxmKSA6Ci0gICAgICAgICAgICBmb3IgaSBpbiBbMTAwLCAyMDAsIDMwMF0gOgotICAgICAgICAgICAgICAgIGZvciBqIGluIFsxLCAyLCAzXSA6Ci0gICAgICAgICAgICAgICAgICAgIGogKj0gMTAwMDAwMAotICAgICAgICAgICAgICAgICAgICBzZWxmLmVudi5zZXRfbXBfbWF4X3dyaXRlKGksIGopCi0gICAgICAgICAgICAgICAgICAgIHY9c2VsZi5lbnYuZ2V0X21wX21heF93cml0ZSgpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGksIGopLCB2KQorICAgIGRlZiB0ZXN0X21wX21heF93cml0ZShzZWxmKSA6CisgICAgICAgIGZvciBpIGluIFsxMDAsIDIwMCwgMzAwXSA6CisgICAgICAgICAgICBmb3IgaiBpbiBbMSwgMiwgM10gOgorICAgICAgICAgICAgICAgIGogKj0gMTAwMDAwMAorICAgICAgICAgICAgICAgIHNlbGYuZW52LnNldF9tcF9tYXhfd3JpdGUoaSwgaikKKyAgICAgICAgICAgICAgICB2PXNlbGYuZW52LmdldF9tcF9tYXhfd3JpdGUoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGksIGopLCB2KQogCi0gICAgaWYgZGIudmVyc2lvbigpID49ICg0LCAyKSA6CiAgICAgICAgIGRlZiB0ZXN0X2ludmFsaWRfdHhuKHNlbGYpIDoKICAgICAgICAgICAgICMgVGhpcyBlbnZpcm9ubWVudCBkb2Vzbid0IHN1cHBvcnQgdHJhbnNhY3Rpb25zCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhkYi5EQkludmFsaWRBcmdFcnJvciwgc2VsZi5lbnYudHhuX2JlZ2luKQpAQCAtMTE1LDcgKzEyNCw3IEBACiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLCBzZWxmLmVudi5nZXRfbGtfbWF4X2xvY2tlcnMoKSkKIAogICAgICAgICBkZWYgdGVzdF9sZ19yZWdpb25tYXgoc2VsZikgOgotICAgICAgICAgICAgZm9yIGkgaW4gWzEyOCwgMjU2LCAxMDI0XSA6CisgICAgICAgICAgICBmb3IgaSBpbiBbMTI4LCAyNTYsIDEwMDBdIDoKICAgICAgICAgICAgICAgICBpID0gaSoxMDI0KjEwMjQKICAgICAgICAgICAgICAgICBzZWxmLmVudi5zZXRfbGdfcmVnaW9ubWF4KGkpCiAgICAgICAgICAgICAgICAgaiA9IHNlbGYuZW52LmdldF9sZ19yZWdpb25tYXgoKQpAQCAtMTI3LDggKzEzNiw3IEBACiAgICAgICAgICAgICAgICAgICAgIGRiLkRCX0xPQ0tfTUlOTE9DS1MsIGRiLkRCX0xPQ0tfTUlOV1JJVEUsCiAgICAgICAgICAgICAgICAgICAgIGRiLkRCX0xPQ0tfT0xERVNULCBkYi5EQl9MT0NLX1JBTkRPTSwgZGIuREJfTE9DS19ZT1VOR0VTVF0KIAotICAgICAgICAgICAgaWYgZGIudmVyc2lvbigpID49ICg0LCAzKSA6Ci0gICAgICAgICAgICAgICAgZmxhZ3MuYXBwZW5kKGRiLkRCX0xPQ0tfTUFYV1JJVEUpCisgICAgICAgICAgICBmbGFncy5hcHBlbmQoZGIuREJfTE9DS19NQVhXUklURSkKIAogICAgICAgICAgICAgZm9yIGkgaW4gZmxhZ3MgOgogICAgICAgICAgICAgICAgIHNlbGYuZW52LnNldF9sa19kZXRlY3QoaSkKQEAgLTE3Miw4ICsxODAsMTIgQEAKICAgICAgICAgICAgIHNlbGYuZW52Lm9wZW4oc2VsZi5ob21lRGlyLCBkYi5EQl9DUkVBVEUgfCBkYi5EQl9JTklUX01QT09MKQogICAgICAgICAgICAgY2FjaGVzaXplID0gKDAsIDIqMTAyNCoxMDI0LCAxKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJJbnZhbGlkQXJnRXJyb3IsCi0gICAgICAgICAgICAgICAgc2VsZi5lbnYuc2V0X2NhY2hlc2l6ZSwgKmNhY2hlc2l6ZSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FjaGVzaXplMiwgc2VsZi5lbnYuZ2V0X2NhY2hlc2l6ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbnYuc2V0X2NhY2hlc2l6ZSwgKmNhY2hlc2l6ZSkKKyAgICAgICAgICAgIGNhY2hlc2l6ZTMgPSBzZWxmLmVudi5nZXRfY2FjaGVzaXplKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FjaGVzaXplMlswXSwgY2FjaGVzaXplM1swXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FjaGVzaXplMlsyXSwgY2FjaGVzaXplM1syXSkKKyAgICAgICAgICAgICMgSW4gQmVya2VsZXkgREIgNS4xLCB0aGUgY2FjaGVzaXplIGNhbiBjaGFuZ2Ugd2hlbiBvcGVuaW5nIHRoZSBFbnYKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjYWNoZXNpemUyWzFdIDw9IGNhY2hlc2l6ZTNbMV0pCiAKICAgICAgICAgZGVmIHRlc3Rfc2V0X2NhY2hlc2l6ZV9kYmVudl9kYihzZWxmKSA6CiAgICAgICAgICAgICAjIFlvdSBjYW4gbm90IGNvbmZpZ3VyZSB0aGUgY2FjaGVzaXplIHVzaW5nCkBAIC0zMDUsNyArMzE3LDcgQEAKICAgICAgICAgc2VsZi5lbnYub3BlbihzZWxmLmhvbWVEaXIsIGRiLkRCX0NSRUFURSB8IGRiLkRCX0lOSVRfTVBPT0wgfAogICAgICAgICAgICAgICAgIGRiLkRCX0lOSVRfTE9HIHwgZGIuREJfSU5JVF9UWE4pCiAKLSAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDQsIDUpIDoKKyAgICBpZiAoZGIudmVyc2lvbigpID49ICg0LCA1KSkgYW5kIChkYi52ZXJzaW9uKCkgPCAoNSwgMikpIDoKICAgICAgICAgZGVmIHRlc3RfdHhfbWF4KHNlbGYpIDoKICAgICAgICAgICAgIHR4bnM9W10KICAgICAgICAgICAgIGRlZiB0eCgpIDoKZGlmZiAtLWdpdCBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfZGJzaGVsdmUucHkgYi9MaWIvYnNkZGIvdGVzdC90ZXN0X2Ric2hlbHZlLnB5CmluZGV4IGMwMTM1ZmUuLmMzNzAxZTEgMTAwNjQ0Ci0tLSBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfZGJzaGVsdmUucHkKKysrIGIvTGliL2JzZGRiL3Rlc3QvdGVzdF9kYnNoZWx2ZS5weQpAQCAtMTIsOSArMTIsNiBAQAogCiAKIAotaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA0KSA6Ci0gICAgZnJvbSBzZXRzIGltcG9ydCBTZXQgYXMgc2V0Ci0KIAogCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzMsMTAgKzMwLDYgQEAKIAogCiBjbGFzcyBEQlNoZWx2ZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDQpOgotICAgICAgICBkZWYgYXNzZXJ0VHJ1ZShzZWxmLCBleHByLCBtc2c9Tm9uZSk6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5mYWlsVW5sZXNzKGV4cHIsbXNnPW1zZykKLQogICAgIGlmIChzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDcpKSBvciAoKHN5cy52ZXJzaW9uX2luZm8gPj0gKDMsIDApKSBhbmQKICAgICAgICAgICAgIChzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDIpKSkgOgogICAgICAgICBkZWYgYXNzZXJ0SW4oc2VsZiwgYSwgYiwgbXNnPU5vbmUpIDoKZGlmZiAtLWdpdCBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfZGJ0YWJsZXMucHkgYi9MaWIvYnNkZGIvdGVzdC90ZXN0X2RidGFibGVzLnB5CmluZGV4IGJiMzEzODEuLjI1MGM0OTIgMTAwNjQ0Ci0tLSBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfZGJ0YWJsZXMucHkKKysrIGIvTGliL2JzZGRiL3Rlc3QvdGVzdF9kYnRhYmxlcy5weQpAQCAtMSw1ICsxLDMgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotIwogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIEEgdGVzdCBzdWl0ZSBmb3IgdGhlIHRhYmxlIGludGVyZmFjZSBidWlsdCBvbiBic2RkYi5kYgogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9MaWIvYnNkZGIvdGVzdC90ZXN0X2Rpc3RyaWJ1dGVkX3RyYW5zYWN0aW9ucy5weSBiL0xpYi9ic2RkYi90ZXN0L3Rlc3RfZGlzdHJpYnV0ZWRfdHJhbnNhY3Rpb25zLnB5CmluZGV4IDE3MTFmYzUuLjkwNTg1NzUgMTAwNjQ0Ci0tLSBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfZGlzdHJpYnV0ZWRfdHJhbnNhY3Rpb25zLnB5CisrKyBiL0xpYi9ic2RkYi90ZXN0L3Rlc3RfZGlzdHJpYnV0ZWRfdHJhbnNhY3Rpb25zLnB5CkBAIC03LDEzICs3LDYgQEAKIGZyb20gdGVzdF9hbGwgaW1wb3J0IGRiLCB0ZXN0X3N1cHBvcnQsIGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCwgXAogICAgICAgICBnZXRfbmV3X2RhdGFiYXNlX3BhdGgKIAotdHJ5IDoKLSAgICBhPXNldCgpCi1leGNlcHQgOiAjIFB5dGhvbiAyLjMKLSAgICBmcm9tIHNldHMgaW1wb3J0IFNldCBhcyBzZXQKLWVsc2UgOgotICAgIGRlbCBhCi0KIGZyb20gdGVzdF9hbGwgaW1wb3J0IHZlcmJvc2UKIAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTM3LDE1ICszMCwxMSBAQAogICAgICAgICBzZWxmLmRiID0gZGIuREIoc2VsZi5kYmVudikKICAgICAgICAgc2VsZi5kYi5zZXRfcmVfbGVuKGRiLkRCX0dJRF9TSVpFKQogICAgICAgICBpZiBtdXN0X29wZW5fZGIgOgotICAgICAgICAgICAgaWYgZGIudmVyc2lvbigpID49ICg0LDIpIDoKLSAgICAgICAgICAgICAgICB0eG49c2VsZi5kYmVudi50eG5fYmVnaW4oKQotICAgICAgICAgICAgICAgIHNlbGYuZGIub3BlbihzZWxmLmZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgZGIuREJfUVVFVUUsIGRiLkRCX0NSRUFURSB8IGRiLkRCX1RIUkVBRCwgMDY2NiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHR4bj10eG4pCi0gICAgICAgICAgICAgICAgdHhuLmNvbW1pdCgpCi0gICAgICAgICAgICBlbHNlIDoKLSAgICAgICAgICAgICAgICBzZWxmLmRiLm9wZW4oc2VsZi5maWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRiLkRCX1FVRVVFLCBkYi5EQl9DUkVBVEUgfCBkYi5EQl9USFJFQUQsIDA2NjYpCisgICAgICAgICAgICB0eG49c2VsZi5kYmVudi50eG5fYmVnaW4oKQorICAgICAgICAgICAgc2VsZi5kYi5vcGVuKHNlbGYuZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgIGRiLkRCX1FVRVVFLCBkYi5EQl9DUkVBVEUgfCBkYi5EQl9USFJFQUQsIDA2NjYsCisgICAgICAgICAgICAgICAgICAgIHR4bj10eG4pCisgICAgICAgICAgICB0eG4uY29tbWl0KCkKIAogICAgIGRlZiBzZXRVcChzZWxmKSA6CiAgICAgICAgIHNlbGYuaG9tZURpciA9IGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCgpCmRpZmYgLS1naXQgYS9MaWIvYnNkZGIvdGVzdC90ZXN0X2Vhcmx5X2Nsb3NlLnB5IGIvTGliL2JzZGRiL3Rlc3QvdGVzdF9lYXJseV9jbG9zZS5weQppbmRleCA4NmI4NmRjLi5lOTI1Mjc5IDEwMDY0NAotLS0gYS9MaWIvYnNkZGIvdGVzdC90ZXN0X2Vhcmx5X2Nsb3NlLnB5CisrKyBiL0xpYi9ic2RkYi90ZXN0L3Rlc3RfZWFybHlfY2xvc2UucHkKQEAgLTE3NCw3ICsxNzQsNyBAQAogICAgICAgICAgICAgdHhuLmNvbW1pdCgpCiAgICAgICAgICAgICB3YXJuaW5ncy5yZXNldHdhcm5pbmdzKCkKICAgICAgICAgZWxzZSA6Ci0gICAgICAgICAgICAjIFdoZW4gd2UgZHJvcCBzdXBwb3J0IGZvciBweXRob24gMi4zIGFuZCAyLjQKKyAgICAgICAgICAgICMgV2hlbiB3ZSBkcm9wIHN1cHBvcnQgZm9yIHB5dGhvbiAyLjQKICAgICAgICAgICAgICMgd2UgY291bGQgdXNlOiAoaW4gMi41IHdlIG5lZWQgYSBfX2Z1dHVyZV9fIHN0YXRlbWVudCkKICAgICAgICAgICAgICMKICAgICAgICAgICAgICMgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgpAQCAtMTgyLDcgKzE4Miw3IEBACiAgICAgICAgICAgICAjICAgICAgICB0eG4uY29tbWl0KCkKICAgICAgICAgICAgICMKICAgICAgICAgICAgICMgV2UgY2FuIG5vdCB1c2UgIndpdGgiIGFzIGlzLCBiZWNhdXNlIGl0IHdvdWxkIGJlIGludmFsaWQgc3ludGF4Ci0gICAgICAgICAgICAjIGluIHB5dGhvbiAyLjMsIDIuNCBhbmQgKHdpdGggbm8gX19mdXR1cmVfXykgMi41LgorICAgICAgICAgICAgIyBpbiBweXRob24gMi40IGFuZCAod2l0aCBubyBfX2Z1dHVyZV9fKSAyLjUuCiAgICAgICAgICAgICAjIEhlcmUgd2Ugc2ltdWxhdGUgIndpdGgiIGZvbGxvd2luZyBQRVAgMzQzIDoKICAgICAgICAgICAgIHcgPSB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpCiAgICAgICAgICAgICB3Ll9fZW50ZXJfXygpCkBAIC0xOTQsMTUgKzE5NCwxNCBAQAogCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRiLkRCQ3Vyc29yQ2xvc2VkRXJyb3IsIGMyLmZpcnN0KQogCi0gICAgaWYgZGIudmVyc2lvbigpID4gKDQsMywwKSA6Ci0gICAgICAgIGRlZiB0ZXN0MDdfY2xvc2VfZGJfYmVmb3JlX3NlcXVlbmNlKHNlbGYpOgotICAgICAgICAgICAgaW1wb3J0IG9zLnBhdGgKLSAgICAgICAgICAgIHBhdGg9b3MucGF0aC5qb2luKHNlbGYuaG9tZURpcixzZWxmLmZpbGVuYW1lKQotICAgICAgICAgICAgZCA9IGRiLkRCKCkKLSAgICAgICAgICAgIGQub3BlbihwYXRoLCBkYi5EQl9CVFJFRSwgZGIuREJfQ1JFQVRFIHwgZGIuREJfVEhSRUFELCAwNjY2KQotICAgICAgICAgICAgZGJzPWRiLkRCU2VxdWVuY2UoZCkKLSAgICAgICAgICAgIGQuY2xvc2UoKSAgIyBUaGlzICJjbG9zZSIgc2hvdWxkIGNsb3NlIHRoZSBjaGlsZCBEQlNlcXVlbmNlIGFsc28KLSAgICAgICAgICAgIGRicy5jbG9zZSgpICAjIElmIG5vdCBjbG9zZWQsIGNvcmUgZHVtcCAoaW4gQmVya2VsZXkgREIgNC42LiopCisgICAgZGVmIHRlc3QwN19jbG9zZV9kYl9iZWZvcmVfc2VxdWVuY2Uoc2VsZik6CisgICAgICAgIGltcG9ydCBvcy5wYXRoCisgICAgICAgIHBhdGg9b3MucGF0aC5qb2luKHNlbGYuaG9tZURpcixzZWxmLmZpbGVuYW1lKQorICAgICAgICBkID0gZGIuREIoKQorICAgICAgICBkLm9wZW4ocGF0aCwgZGIuREJfQlRSRUUsIGRiLkRCX0NSRUFURSB8IGRiLkRCX1RIUkVBRCwgMDY2NikKKyAgICAgICAgZGJzPWRiLkRCU2VxdWVuY2UoZCkKKyAgICAgICAgZC5jbG9zZSgpICAjIFRoaXMgImNsb3NlIiBzaG91bGQgY2xvc2UgdGhlIGNoaWxkIERCU2VxdWVuY2UgYWxzbworICAgICAgICBkYnMuY2xvc2UoKSAgIyBJZiBub3QgY2xvc2VkLCBjb3JlIGR1bXAgKGluIEJlcmtlbGV5IERCIDQuNi4qKQogCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9MaWIvYnNkZGIvdGVzdC90ZXN0X2xvY2sucHkgYi9MaWIvYnNkZGIvdGVzdC90ZXN0X2xvY2sucHkKaW5kZXggMjUyNjBmYy4uMTBjYThkNiAxMDA2NDQKLS0tIGEvTGliL2JzZGRiL3Rlc3QvdGVzdF9sb2NrLnB5CisrKyBiL0xpYi9ic2RkYi90ZXN0L3Rlc3RfbG9jay5weQpAQCAtMTksMTIgKzE5LDYgQEAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGNsYXNzIExvY2tpbmdUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgaW1wb3J0IHN5cwotICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNCkgOgotICAgICAgICBkZWYgYXNzZXJ0VHJ1ZShzZWxmLCBleHByLCBtc2c9Tm9uZSk6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZXhwcixtc2c9bXNnKQotCi0KICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIHNlbGYuaG9tZURpciA9IGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCgpCiAgICAgICAgIHNlbGYuZW52ID0gZGIuREJFbnYoKQpAQCAtODksNyArODMsNiBAQAogICAgICAgICBmb3IgdCBpbiB0aHJlYWRzOgogICAgICAgICAgICAgdC5qb2luKCkKIAotICAgIGlmIGRiLnZlcnNpb24oKSA+PSAoNCwgMikgOgogICAgICAgICBkZWYgdGVzdDAzX2xvY2tfdGltZW91dChzZWxmKToKICAgICAgICAgICAgIHNlbGYuZW52LnNldF90aW1lb3V0KDAsIGRiLkRCX1NFVF9MT0NLX1RJTUVPVVQpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW52LmdldF90aW1lb3V0KGRiLkRCX1NFVF9MT0NLX1RJTUVPVVQpLCAwKQpkaWZmIC0tZ2l0IGEvTGliL2JzZGRiL3Rlc3QvdGVzdF9taXNjLnB5IGIvTGliL2JzZGRiL3Rlc3QvdGVzdF9taXNjLnB5CmluZGV4IDhkZGEyOTYuLmIxZTkyOGYgMTAwNjQ0Ci0tLSBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfbWlzYy5weQorKysgYi9MaWIvYnNkZGIvdGVzdC90ZXN0X21pc2MucHkKQEAgLTksMTMgKzksNiBAQAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDQpIDoKLSAgICAgICAgZGVmIGFzc2VydFRydWUoc2VsZiwgZXhwciwgbXNnPU5vbmUpOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGV4cHIsIG1zZz1tc2cpCi0KLSAgICAgICAgZGVmIGFzc2VydEZhbHNlKHNlbGYsIGV4cHIsIG1zZz1Ob25lKToKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKGV4cHIsIG1zZz1tc2cpCi0KICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBnZXRfbmV3X2RhdGFiYXNlX3BhdGgoKQogICAgICAgICBzZWxmLmhvbWVEaXIgPSBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgoKQpAQCAtOTcsMTAgKzkwLDYgQEAKICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoc2VsZi5maWxlbmFtZSkKIAogICAgIGRlZiB0ZXN0MDdfREJfc2V0X2ZsYWdzX3BlcnNpc3RzKHNlbGYpOgotICAgICAgICBpZiBkYi52ZXJzaW9uKCkgPCAoNCwyKToKLSAgICAgICAgICAgICMgVGhlIGdldF9mbGFncyBBUEkgcmVxdWlyZWQgZm9yIHRoaXMgdG8gd29yayBpcyBvbmx5IGF2YWlsYWJsZQotICAgICAgICAgICAgIyBpbiBCZXJrZWxleSBEQiA+PSA0LjIKLSAgICAgICAgICAgIHJldHVybgogICAgICAgICB0cnk6CiAgICAgICAgICAgICBkYjEgPSBkYi5EQigpCiAgICAgICAgICAgICBkYjEuc2V0X2ZsYWdzKGRiLkRCX0RVUFNPUlQpCmRpZmYgLS1naXQgYS9MaWIvYnNkZGIvdGVzdC90ZXN0X3F1ZXVlLnB5IGIvTGliL2JzZGRiL3Rlc3QvdGVzdF9xdWV1ZS5weQppbmRleCAyNTFhOGNmLi5jMjEzZmY0IDEwMDY0NAotLS0gYS9MaWIvYnNkZGIvdGVzdC90ZXN0X3F1ZXVlLnB5CisrKyBiL0xpYi9ic2RkYi90ZXN0L3Rlc3RfcXVldWUucHkKQEAgLTk5LDExICs5OSw2IEBACiAgICAgICAgICAgICBwcmludCAnXG4nLCAnLT0nICogMzAKICAgICAgICAgICAgIHByaW50ICJSdW5uaW5nICVzLnRlc3QwMl9iYXNpY1Bvc3QzMi4uLiIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXwogCi0gICAgICAgIGlmIGRiLnZlcnNpb24oKSA8ICgzLCAyLCAwKToKLSAgICAgICAgICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgICAgICAgICAgcHJpbnQgIlRlc3Qgbm90IHJ1biwgREIgbm90IG5ldyBlbm91Z2guLi4iCi0gICAgICAgICAgICByZXR1cm4KLQogICAgICAgICBkID0gZGIuREIoKQogICAgICAgICBkLnNldF9yZV9sZW4oNDApICAjIFF1ZXVlcyBtdXN0IGJlIGZpeGVkIGxlbmd0aAogICAgICAgICBkLm9wZW4oc2VsZi5maWxlbmFtZSwgZGIuREJfUVVFVUUsIGRiLkRCX0NSRUFURSkKZGlmZiAtLWdpdCBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfcmVjbm8ucHkgYi9MaWIvYnNkZGIvdGVzdC90ZXN0X3JlY25vLnB5CmluZGV4IDMxOTFmZGMuLmZiNjk1NmEgMTAwNjQ0Ci0tLSBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfcmVjbm8ucHkKKysrIGIvTGliL2JzZGRiL3Rlc3QvdGVzdF9yZWNuby5weQpAQCAtMTQsMTIgKzE0LDYgQEAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGNsYXNzIFNpbXBsZVJlY25vVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNCkgOgotICAgICAgICBkZWYgYXNzZXJ0RmFsc2Uoc2VsZiwgZXhwciwgbXNnPU5vbmUpIDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLmZhaWxJZihleHByLG1zZz1tc2cpCi0gICAgICAgIGRlZiBhc3NlcnRUcnVlKHNlbGYsIGV4cHIsIG1zZz1Ob25lKSA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5hc3NlcnRUcnVlKGV4cHIsIG1zZz1tc2cpCi0KICAgICBpZiAoc3lzLnZlcnNpb25faW5mbyA8ICgyLCA3KSkgb3IgKChzeXMudmVyc2lvbl9pbmZvID49ICgzLCAwKSkgYW5kCiAgICAgICAgICAgICAoc3lzLnZlcnNpb25faW5mbyA8ICgzLCAyKSkpIDoKICAgICAgICAgZGVmIGFzc2VydElzSW5zdGFuY2Uoc2VsZiwgb2JqLCBkYXRhdHlwZSwgbXNnPU5vbmUpIDoKQEAgLTIzNiw3ICsyMzAsOSBAQAogICAgICAgICBkLmNsb3NlKCkKIAogICAgICAgICAjIGdldCB0aGUgdGV4dCBmcm9tIHRoZSBiYWNraW5nIHNvdXJjZQotICAgICAgICB0ZXh0ID0gb3Blbihzb3VyY2UsICdyJykucmVhZCgpCisgICAgICAgIGYgPSBvcGVuKHNvdXJjZSwgJ3InKQorICAgICAgICB0ZXh0ID0gZi5yZWFkKCkKKyAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgIHRleHQgPSB0ZXh0LnN0cmlwKCkKICAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgIHByaW50IHRleHQKQEAgLTI1Niw3ICsyNTIsOSBAQAogICAgICAgICBkLnN5bmMoKQogICAgICAgICBkLmNsb3NlKCkKIAotICAgICAgICB0ZXh0ID0gb3Blbihzb3VyY2UsICdyJykucmVhZCgpCisgICAgICAgIGYgPSBvcGVuKHNvdXJjZSwgJ3InKQorICAgICAgICB0ZXh0ID0gZi5yZWFkKCkKKyAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgIHRleHQgPSB0ZXh0LnN0cmlwKCkKICAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgIHByaW50IHRleHQKQEAgLTI5OCw2ICsyOTYsMTggQEAKICAgICAgICAgYy5jbG9zZSgpCiAgICAgICAgIGQuY2xvc2UoKQogCisgICAgZGVmIHRlc3QwNF9nZXRfc2l6ZV9lbXB0eShzZWxmKSA6CisgICAgICAgIGQgPSBkYi5EQigpCisgICAgICAgIGQub3BlbihzZWxmLmZpbGVuYW1lLCBkYnR5cGU9ZGIuREJfUkVDTk8sIGZsYWdzPWRiLkRCX0NSRUFURSkKKworICAgICAgICByb3dfaWQgPSBkLmFwcGVuZCgnICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgZC5nZXRfc2l6ZShrZXk9cm93X2lkKSkKKyAgICAgICAgcm93X2lkID0gZC5hcHBlbmQoJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZC5nZXRfc2l6ZShrZXk9cm93X2lkKSkKKworCisKKwogCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9MaWIvYnNkZGIvdGVzdC90ZXN0X3JlcGxpY2F0aW9uLnB5IGIvTGliL2JzZGRiL3Rlc3QvdGVzdF9yZXBsaWNhdGlvbi5weQppbmRleCBmM2U5NzRmLi4xMmFiMmRkIDEwMDY0NAotLS0gYS9MaWIvYnNkZGIvdGVzdC90ZXN0X3JlcGxpY2F0aW9uLnB5CisrKyBiL0xpYi9ic2RkYi90ZXN0L3Rlc3RfcmVwbGljYXRpb24ucHkKQEAgLTEyLDExICsxMiw2IEBACiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBjbGFzcyBEQlJlcGxpY2F0aW9uKHVuaXR0ZXN0LlRlc3RDYXNlKSA6Ci0gICAgaW1wb3J0IHN5cwotICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNCkgOgotICAgICAgICBkZWYgYXNzZXJ0VHJ1ZShzZWxmLCBleHByLCBtc2c9Tm9uZSk6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZXhwcixtc2c9bXNnKQotCiAgICAgZGVmIHNldFVwKHNlbGYpIDoKICAgICAgICAgc2VsZi5ob21lRGlyTWFzdGVyID0gZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoKCkKICAgICAgICAgc2VsZi5ob21lRGlyQ2xpZW50ID0gZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoKCkKQEAgLTc2LDEzICs3MSw1NyBAQAogY2xhc3MgREJSZXBsaWNhdGlvbk1hbmFnZXIoREJSZXBsaWNhdGlvbikgOgogICAgIGRlZiB0ZXN0MDFfYmFzaWNfcmVwbGljYXRpb24oc2VsZikgOgogICAgICAgICBtYXN0ZXJfcG9ydCA9IHRlc3Rfc3VwcG9ydC5maW5kX3VudXNlZF9wb3J0KCkKLSAgICAgICAgc2VsZi5kYmVudk1hc3Rlci5yZXBtZ3Jfc2V0X2xvY2FsX3NpdGUoIjEyNy4wLjAuMSIsIG1hc3Rlcl9wb3J0KQogICAgICAgICBjbGllbnRfcG9ydCA9IHRlc3Rfc3VwcG9ydC5maW5kX3VudXNlZF9wb3J0KCkKLSAgICAgICAgc2VsZi5kYmVudkNsaWVudC5yZXBtZ3Jfc2V0X2xvY2FsX3NpdGUoIjEyNy4wLjAuMSIsIGNsaWVudF9wb3J0KQotICAgICAgICBzZWxmLmRiZW52TWFzdGVyLnJlcG1ncl9hZGRfcmVtb3RlX3NpdGUoIjEyNy4wLjAuMSIsIGNsaWVudF9wb3J0KQotICAgICAgICBzZWxmLmRiZW52Q2xpZW50LnJlcG1ncl9hZGRfcmVtb3RlX3NpdGUoIjEyNy4wLjAuMSIsIG1hc3Rlcl9wb3J0KQotICAgICAgICBzZWxmLmRiZW52TWFzdGVyLnJlcF9zZXRfbnNpdGVzKDIpCi0gICAgICAgIHNlbGYuZGJlbnZDbGllbnQucmVwX3NldF9uc2l0ZXMoMikKKyAgICAgICAgaWYgZGIudmVyc2lvbigpID49ICg1LCAyKSA6CisgICAgICAgICAgICBzZWxmLnNpdGUgPSBzZWxmLmRiZW52TWFzdGVyLnJlcG1ncl9zaXRlKCIxMjcuMC4wLjEiLCBtYXN0ZXJfcG9ydCkKKyAgICAgICAgICAgIHNlbGYuc2l0ZS5zZXRfY29uZmlnKGRiLkRCX0dST1VQX0NSRUFUT1IsIFRydWUpCisgICAgICAgICAgICBzZWxmLnNpdGUuc2V0X2NvbmZpZyhkYi5EQl9MT0NBTF9TSVRFLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5zaXRlMiA9IHNlbGYuZGJlbnZNYXN0ZXIucmVwbWdyX3NpdGUoIjEyNy4wLjAuMSIsIGNsaWVudF9wb3J0KQorCisgICAgICAgICAgICBzZWxmLnNpdGUzID0gc2VsZi5kYmVudkNsaWVudC5yZXBtZ3Jfc2l0ZSgiMTI3LjAuMC4xIiwgbWFzdGVyX3BvcnQpCisgICAgICAgICAgICBzZWxmLnNpdGUzLnNldF9jb25maWcoZGIuREJfQk9PVFNUUkFQX0hFTFBFUiwgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuc2l0ZTQgPSBzZWxmLmRiZW52Q2xpZW50LnJlcG1ncl9zaXRlKCIxMjcuMC4wLjEiLCBjbGllbnRfcG9ydCkKKyAgICAgICAgICAgIHNlbGYuc2l0ZTQuc2V0X2NvbmZpZyhkYi5EQl9MT0NBTF9TSVRFLCBUcnVlKQorCisgICAgICAgICAgICBkID0geworICAgICAgICAgICAgICAgICAgICBkYi5EQl9CT09UU1RSQVBfSEVMUEVSOiBbRmFsc2UsIEZhbHNlLCBUcnVlLCBGYWxzZV0sCisgICAgICAgICAgICAgICAgICAgIGRiLkRCX0dST1VQX0NSRUFUT1I6IFtUcnVlLCBGYWxzZSwgRmFsc2UsIEZhbHNlXSwKKyAgICAgICAgICAgICAgICAgICAgZGIuREJfTEVHQUNZOiBbRmFsc2UsIEZhbHNlLCBGYWxzZSwgRmFsc2VdLAorICAgICAgICAgICAgICAgICAgICBkYi5EQl9MT0NBTF9TSVRFOiBbVHJ1ZSwgRmFsc2UsIEZhbHNlLCBUcnVlXSwKKyAgICAgICAgICAgICAgICAgICAgZGIuREJfUkVQTUdSX1BFRVI6IFtGYWxzZSwgRmFsc2UsIEZhbHNlLCBGYWxzZSBdLAorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIGksIGogaW4gZC5pdGVtcygpIDoKKyAgICAgICAgICAgICAgICBmb3IgaywgdiBpbiBcCisgICAgICAgICAgICAgICAgICAgICAgICB6aXAoW3NlbGYuc2l0ZSwgc2VsZi5zaXRlMiwgc2VsZi5zaXRlMywgc2VsZi5zaXRlNF0sIGopIDoKKyAgICAgICAgICAgICAgICAgICAgaWYgdiA6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoay5nZXRfY29uZmlnKGkpKQorICAgICAgICAgICAgICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoay5nZXRfY29uZmlnKGkpKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuc2l0ZS5nZXRfZWlkKCksIHNlbGYuc2l0ZTIuZ2V0X2VpZCgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLnNpdGUzLmdldF9laWQoKSwgc2VsZi5zaXRlNC5nZXRfZWlkKCkpCisKKyAgICAgICAgICAgIGZvciBpLCBqIGluIHppcChbc2VsZi5zaXRlLCBzZWxmLnNpdGUyLCBzZWxmLnNpdGUzLCBzZWxmLnNpdGU0XSwgXAorICAgICAgICAgICAgICAgICAgICBbbWFzdGVyX3BvcnQsIGNsaWVudF9wb3J0LCBtYXN0ZXJfcG9ydCwgY2xpZW50X3BvcnRdKSA6CisgICAgICAgICAgICAgICAgYWRkciA9IGkuZ2V0X2FkZHJlc3MoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWRkciwgKCIxMjcuMC4wLjEiLCBqKSkKKworICAgICAgICAgICAgZm9yIGkgaW4gW3NlbGYuc2l0ZSwgc2VsZi5zaXRlMl0gOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaS5nZXRfYWRkcmVzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYmVudk1hc3Rlci5yZXBtZ3Jfc2l0ZV9ieV9laWQoaS5nZXRfZWlkKCkpLmdldF9hZGRyZXNzKCkpCisgICAgICAgICAgICBmb3IgaSBpbiBbc2VsZi5zaXRlMywgc2VsZi5zaXRlNF0gOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaS5nZXRfYWRkcmVzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYmVudkNsaWVudC5yZXBtZ3Jfc2l0ZV9ieV9laWQoaS5nZXRfZWlkKCkpLmdldF9hZGRyZXNzKCkpCisgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgc2VsZi5kYmVudk1hc3Rlci5yZXBtZ3Jfc2V0X2xvY2FsX3NpdGUoIjEyNy4wLjAuMSIsIG1hc3Rlcl9wb3J0KQorICAgICAgICAgICAgc2VsZi5kYmVudkNsaWVudC5yZXBtZ3Jfc2V0X2xvY2FsX3NpdGUoIjEyNy4wLjAuMSIsIGNsaWVudF9wb3J0KQorICAgICAgICAgICAgc2VsZi5kYmVudk1hc3Rlci5yZXBtZ3JfYWRkX3JlbW90ZV9zaXRlKCIxMjcuMC4wLjEiLCBjbGllbnRfcG9ydCkKKyAgICAgICAgICAgIHNlbGYuZGJlbnZDbGllbnQucmVwbWdyX2FkZF9yZW1vdGVfc2l0ZSgiMTI3LjAuMC4xIiwgbWFzdGVyX3BvcnQpCisKKyAgICAgICAgICAgIHNlbGYuZGJlbnZNYXN0ZXIucmVwX3NldF9uc2l0ZXMoMikKKyAgICAgICAgICAgIHNlbGYuZGJlbnZDbGllbnQucmVwX3NldF9uc2l0ZXMoMikKKwogICAgICAgICBzZWxmLmRiZW52TWFzdGVyLnJlcF9zZXRfcHJpb3JpdHkoMTApCiAgICAgICAgIHNlbGYuZGJlbnZDbGllbnQucmVwX3NldF9wcmlvcml0eSgwKQogCkBAIC0xNDQsMTcgKzE4MywxOSBAQAogCiAgICAgICAgIGQgPSBzZWxmLmRiZW52TWFzdGVyLnJlcG1ncl9zaXRlX2xpc3QoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgMSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWzBdWzBdLCAiMTI3LjAuMC4xIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWzBdWzFdLCBjbGllbnRfcG9ydCkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChkWzBdWzJdPT1kYi5EQl9SRVBNR1JfQ09OTkVDVEVEKSBvciBcCi0gICAgICAgICAgICAgICAgKGRbMF1bMl09PWRiLkRCX1JFUE1HUl9ESVNDT05ORUNURUQpKQorICAgICAgICBkID0gZC52YWx1ZXMoKVswXSAgIyBUaGVyZSBpcyBvbmx5IG9uZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbMF0sICIxMjcuMC4wLjEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbMV0sIGNsaWVudF9wb3J0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGRbMl09PWRiLkRCX1JFUE1HUl9DT05ORUNURUQpIG9yIFwKKyAgICAgICAgICAgICAgICAoZFsyXT09ZGIuREJfUkVQTUdSX0RJU0NPTk5FQ1RFRCkpCiAKICAgICAgICAgZCA9IHNlbGYuZGJlbnZDbGllbnQucmVwbWdyX3NpdGVfbGlzdCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCAxKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbMF1bMF0sICIxMjcuMC4wLjEiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbMF1bMV0sIG1hc3Rlcl9wb3J0KQotICAgICAgICBzZWxmLmFzc2VydFRydWUoKGRbMF1bMl09PWRiLkRCX1JFUE1HUl9DT05ORUNURUQpIG9yIFwKLSAgICAgICAgICAgICAgICAoZFswXVsyXT09ZGIuREJfUkVQTUdSX0RJU0NPTk5FQ1RFRCkpCisgICAgICAgIGQgPSBkLnZhbHVlcygpWzBdICAjIFRoZXJlIGlzIG9ubHkgb25lCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFswXSwgIjEyNy4wLjAuMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsxXSwgbWFzdGVyX3BvcnQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoZFsyXT09ZGIuREJfUkVQTUdSX0NPTk5FQ1RFRCkgb3IgXAorICAgICAgICAgICAgICAgIChkWzJdPT1kYi5EQl9SRVBNR1JfRElTQ09OTkVDVEVEKSkKIAogICAgICAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDQsNikgOgogICAgICAgICAgICAgZCA9IHNlbGYuZGJlbnZNYXN0ZXIucmVwbWdyX3N0YXQoZmxhZ3M9ZGIuREJfU1RBVF9DTEVBUik7CkBAIC00NjEsNiArNTAyLDEzIEBACiAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmNvbmZpcm1lZF9tYXN0ZXIpCiAKKyAgICAgICAgICAgICMgUmFjZSBjb25kaXRpb24gc2hvd2VkIHVwIGFmdGVyIHVwZ3JhZGluZyB0byBTb2xhcmlzIDEwIFVwZGF0ZSAxMAorICAgICAgICAgICAgIyBodHRwczovL2ZvcnVtcy5vcmFjbGUuY29tL2ZvcnVtcy90aHJlYWQuanNwYT9tZXNzYWdlSUQ9OTkwMjg2MAorICAgICAgICAgICAgIyBqY2VhQGpjZWEuZXM6IFNlZSBwcml2YXRlIGVtYWlsIGZyb20gUGF1bGEgQmluZ2hhbSAoT3JhY2xlKSwKKyAgICAgICAgICAgICMgaW4gMjAxMTA5MjkuCisgICAgICAgICAgICB3aGlsZSBub3QgKHNlbGYuZGJlbnZDbGllbnQucmVwX3N0YXQoKVsic3RhcnR1cF9jb21wbGV0ZSJdKSA6CisgICAgICAgICAgICAgICAgcGFzcworCiAgICAgaWYgZGIudmVyc2lvbigpID49ICg0LDcpIDoKICAgICAgICAgZGVmIHRlc3QwNF90ZXN0X2Nsb2Nrc2tldyhzZWxmKSA6CiAgICAgICAgICAgICBmYXN0LCBzbG93ID0gMTIzNCwgMTIzMApkaWZmIC0tZ2l0IGEvTGliL2JzZGRiL3Rlc3QvdGVzdF9zZXF1ZW5jZS5weSBiL0xpYi9ic2RkYi90ZXN0L3Rlc3Rfc2VxdWVuY2UucHkKaW5kZXggM2QzZWUyOS4uZjBhYTEyYSAxMDA2NDQKLS0tIGEvTGliL2JzZGRiL3Rlc3QvdGVzdF9zZXF1ZW5jZS5weQorKysgYi9MaWIvYnNkZGIvdGVzdC90ZXN0X3NlcXVlbmNlLnB5CkBAIC01LDExICs1LDYgQEAKIAogCiBjbGFzcyBEQlNlcXVlbmNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgaW1wb3J0IHN5cwotICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNCkgOgotICAgICAgICBkZWYgYXNzZXJ0VHJ1ZShzZWxmLCBleHByLCBtc2c9Tm9uZSk6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZXhwcixtc2c9bXNnKQotCiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLmludF8zMl9tYXggPSAweDEwMDAwMDAwMAogICAgICAgICBzZWxmLmhvbWVEaXIgPSBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgoKQpAQCAtMTMzLDggKzEyOCw3IEBACiAKIGRlZiB0ZXN0X3N1aXRlKCk6CiAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQotICAgIGlmIGRiLnZlcnNpb24oKSA+PSAoNCwzKToKLSAgICAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoREJTZXF1ZW5jZVRlc3QpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKERCU2VxdWVuY2VUZXN0KSkKICAgICByZXR1cm4gc3VpdGUKIAogCmRpZmYgLS1naXQgYS9MaWIvYnNkZGIvdGVzdC90ZXN0X3RocmVhZC5weSBiL0xpYi9ic2RkYi90ZXN0L3Rlc3RfdGhyZWFkLnB5CmluZGV4IDkxMDAyYjguLjQyMjEyZTkgMTAwNjQ0Ci0tLSBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfdGhyZWFkLnB5CisrKyBiL0xpYi9ic2RkYi90ZXN0L3Rlc3RfdGhyZWFkLnB5CkBAIC0zNSwxMCArMzUsNiBAQAogICAgIGRic2V0ZmxhZ3MgICA9IDAKICAgICBlbnZmbGFncyAgICAgPSAwCiAKLSAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDQpIDoKLSAgICAgICAgZGVmIGFzc2VydFRydWUoc2VsZiwgZXhwciwgbXNnPU5vbmUpOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGV4cHIsbXNnPW1zZykKLQogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgIGRidXRpbHMuX2RlYWRsb2NrX1ZlcmJvc2VGaWxlID0gc3lzLnN0ZG91dApkaWZmIC0tZ2l0IGEvTGliL2NhbGVuZGFyLnB5IGIvTGliL2NhbGVuZGFyLnB5CmluZGV4IDMxMDZlZjIuLmQzYmQyMzYgMTAwNjQ0Ci0tLSBhL0xpYi9jYWxlbmRhci5weQorKysgYi9MaWIvY2FsZW5kYXIucHkKQEAgLTE2MSw3ICsxNjEsMTEgQEAKICAgICAgICAgb25lZGF5ID0gZGF0ZXRpbWUudGltZWRlbHRhKGRheXM9MSkKICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgIHlpZWxkIGRhdGUKLSAgICAgICAgICAgIGRhdGUgKz0gb25lZGF5CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGF0ZSArPSBvbmVkYXkKKyAgICAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgICAgICMgQWRkaW5nIG9uZSBkYXkgY291bGQgZmFpbCBhZnRlciBkYXRldGltZS5NQVhZRUFSCisgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgIGlmIGRhdGUubW9udGggIT0gbW9udGggYW5kIGRhdGUud2Vla2RheSgpID09IHNlbGYuZmlyc3R3ZWVrZGF5OgogICAgICAgICAgICAgICAgIGJyZWFrCiAKQEAgLTIxNiw3ICsyMjAsNyBAQAogICAgIGRlZiB5ZWFyZGF0ZXNjYWxlbmRhcihzZWxmLCB5ZWFyLCB3aWR0aD0zKToKICAgICAgICAgIiIiCiAgICAgICAgIFJldHVybiB0aGUgZGF0YSBmb3IgdGhlIHNwZWNpZmllZCB5ZWFyIHJlYWR5IGZvciBmb3JtYXR0aW5nLiBUaGUgcmV0dXJuCi0gICAgICAgIHZhbHVlIGlzIGEgbGlzdCBvZiBtb250aCByb3dzLiBFYWNoIG1vbnRoIHJvdyBjb250YWlucyB1cHRvIHdpZHRoIG1vbnRocy4KKyAgICAgICAgdmFsdWUgaXMgYSBsaXN0IG9mIG1vbnRoIHJvd3MuIEVhY2ggbW9udGggcm93IGNvbnRhaW5zIHVwIHRvIHdpZHRoIG1vbnRocy4KICAgICAgICAgRWFjaCBtb250aCBjb250YWlucyBiZXR3ZWVuIDQgYW5kIDYgd2Vla3MgYW5kIGVhY2ggd2VlayBjb250YWlucyAxLTcKICAgICAgICAgZGF5cy4gRGF5cyBhcmUgZGF0ZXRpbWUuZGF0ZSBvYmplY3RzLgogICAgICAgICAiIiIKQEAgLTQ4OCw2ICs0OTIsNyBAQAogICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgIHNlbGYub2xkbG9jYWxlID0gX2xvY2FsZS5nZXRsb2NhbGUoX2xvY2FsZS5MQ19USU1FKQogICAgICAgICBfbG9jYWxlLnNldGxvY2FsZShfbG9jYWxlLkxDX1RJTUUsIHNlbGYubG9jYWxlKQorICAgICAgICByZXR1cm4gX2xvY2FsZS5nZXRsb2NhbGUoX2xvY2FsZS5MQ19USU1FKVsxXQogCiAgICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKICAgICAgICAgX2xvY2FsZS5zZXRsb2NhbGUoX2xvY2FsZS5MQ19USU1FLCBzZWxmLm9sZGxvY2FsZSkKZGlmZiAtLWdpdCBhL0xpYi9jZ2kucHkgYi9MaWIvY2dpLnB5CmluZGV4IGU3Y2Q3NzguLjY0YmE2ZDEgMTAwNzU1Ci0tLSBhL0xpYi9jZ2kucHkKKysrIGIvTGliL2NnaS5weQpAQCAtMzcsNyArMzcsNiBAQAogZnJvbSBvcGVyYXRvciBpbXBvcnQgYXR0cmdldHRlcgogaW1wb3J0IHN5cwogaW1wb3J0IG9zCi1pbXBvcnQgdXJsbGliCiBpbXBvcnQgVXNlckRpY3QKIGltcG9ydCB1cmxwYXJzZQogCkBAIC02OTgsNiArNjk3LDkgQEAKICAgICAgICAgICAgIGlmIG5vdCBsaW5lOgogICAgICAgICAgICAgICAgIHNlbGYuZG9uZSA9IC0xCiAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGRlbGltID09ICJcciI6CisgICAgICAgICAgICAgICAgbGluZSA9IGRlbGltICsgbGluZQorICAgICAgICAgICAgICAgIGRlbGltID0gIiIKICAgICAgICAgICAgIGlmIGxpbmVbOjJdID09ICItLSIgYW5kIGxhc3RfbGluZV9sZmVuZDoKICAgICAgICAgICAgICAgICBzdHJpcHBlZGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgICAgICAgICBpZiBzdHJpcHBlZGxpbmUgPT0gbmV4dDoKQEAgLTcxNCw2ICs3MTYsMTIgQEAKICAgICAgICAgICAgICAgICBkZWxpbSA9ICJcbiIKICAgICAgICAgICAgICAgICBsaW5lID0gbGluZVs6LTFdCiAgICAgICAgICAgICAgICAgbGFzdF9saW5lX2xmZW5kID0gVHJ1ZQorICAgICAgICAgICAgZWxpZiBsaW5lWy0xXSA9PSAiXHIiOgorICAgICAgICAgICAgICAgICMgV2UgbWF5IGludGVycnVwdCBcclxuIHNlcXVlbmNlcyBpZiB0aGV5IHNwYW4gdGhlIDIqKjE2CisgICAgICAgICAgICAgICAgIyBieXRlIGJvdW5kYXJ5CisgICAgICAgICAgICAgICAgZGVsaW0gPSAiXHIiCisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0xXQorICAgICAgICAgICAgICAgIGxhc3RfbGluZV9sZmVuZCA9IEZhbHNlCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIGRlbGltID0gIiIKICAgICAgICAgICAgICAgICBsYXN0X2xpbmVfbGZlbmQgPSBGYWxzZQpkaWZmIC0tZ2l0IGEvTGliL2NnaXRiLnB5IGIvTGliL2NnaXRiLnB5CmluZGV4IDViZWNkZjMuLjhhY2M0YjcgMTAwNjQ0Ci0tLSBhL0xpYi9jZ2l0Yi5weQorKysgYi9MaWIvY2dpdGIucHkKQEAgLTI5NSwxNCArMjk1LDE5IEBACiAgICAgICAgIGlmIHNlbGYubG9nZGlyIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgc3VmZml4ID0gWycudHh0JywgJy5odG1sJ11bc2VsZi5mb3JtYXQ9PSJodG1sIl0KICAgICAgICAgICAgIChmZCwgcGF0aCkgPSB0ZW1wZmlsZS5ta3N0ZW1wKHN1ZmZpeD1zdWZmaXgsIGRpcj1zZWxmLmxvZ2RpcikKKwogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIGZpbGUgPSBvcy5mZG9wZW4oZmQsICd3JykKICAgICAgICAgICAgICAgICBmaWxlLndyaXRlKGRvYykKICAgICAgICAgICAgICAgICBmaWxlLmNsb3NlKCkKLSAgICAgICAgICAgICAgICBtc2cgPSAnPHA+ICVzIGNvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGVycm9yLicgJSBwYXRoCisgICAgICAgICAgICAgICAgbXNnID0gJyVzIGNvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGVycm9yLicgJSBwYXRoCiAgICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgbXNnID0gJzxwPiBUcmllZCB0byBzYXZlIHRyYWNlYmFjayB0byAlcywgYnV0IGZhaWxlZC4nICUgcGF0aAotICAgICAgICAgICAgc2VsZi5maWxlLndyaXRlKG1zZyArICdcbicpCisgICAgICAgICAgICAgICAgbXNnID0gJ1RyaWVkIHRvIHNhdmUgdHJhY2ViYWNrIHRvICVzLCBidXQgZmFpbGVkLicgJSBwYXRoCisKKyAgICAgICAgICAgIGlmIHNlbGYuZm9ybWF0ID09ICdodG1sJzoKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGUud3JpdGUoJzxwPiVzPC9wPlxuJyAlIG1zZykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5maWxlLndyaXRlKG1zZyArICdcbicpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHNlbGYuZmlsZS5mbHVzaCgpCiAgICAgICAgIGV4Y2VwdDogcGFzcwpkaWZmIC0tZ2l0IGEvTGliL2NtZC5weSBiL0xpYi9jbWQucHkKaW5kZXggYWU3ZjEyZS4uMDViYTdlMyAxMDA2NDQKLS0tIGEvTGliL2NtZC5weQorKysgYi9MaWIvY21kLnB5CkBAIC0yOTQsNiArMjk0LDcgQEAKICAgICAgICAgcmV0dXJuIGxpc3QoY29tbWFuZHMgfCB0b3BpY3MpCiAKICAgICBkZWYgZG9faGVscChzZWxmLCBhcmcpOgorICAgICAgICAnTGlzdCBhdmFpbGFibGUgY29tbWFuZHMgd2l0aCAiaGVscCIgb3IgZGV0YWlsZWQgaGVscCB3aXRoICJoZWxwIGNtZCIuJwogICAgICAgICBpZiBhcmc6CiAgICAgICAgICAgICAjIFhYWCBjaGVjayBhcmcgc3ludGF4CiAgICAgICAgICAgICB0cnk6CmRpZmYgLS1naXQgYS9MaWIvY29kZWNzLnB5IGIvTGliL2NvZGVjcy5weQppbmRleCBmNGNkNjBhLi45M2MxNmMzIDEwMDY0NAotLS0gYS9MaWIvY29kZWNzLnB5CisrKyBiL0xpYi9jb2RlY3MucHkKQEAgLTQ1NiwxNiArNDU2LDEzIEBACiAKICAgICAgICAgIyByZWFkIHVudGlsIHdlIGdldCB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgKGlmIGF2YWlsYWJsZSkKICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgICMgY2FuIHRoZSByZXF1ZXN0IGNhbiBiZSBzYXRpc2ZpZWQgZnJvbSB0aGUgY2hhcmFjdGVyIGJ1ZmZlcj8KLSAgICAgICAgICAgIGlmIGNoYXJzIDwgMDoKLSAgICAgICAgICAgICAgICBpZiBzaXplIDwgMDoKLSAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5jaGFyYnVmZmVyOgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICBlbGlmIGxlbihzZWxmLmNoYXJidWZmZXIpID49IHNpemU6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBjYW4gdGhlIHJlcXVlc3QgYmUgc2F0aXNmaWVkIGZyb20gdGhlIGNoYXJhY3RlciBidWZmZXI/CisgICAgICAgICAgICBpZiBjaGFycyA+PSAwOgogICAgICAgICAgICAgICAgIGlmIGxlbihzZWxmLmNoYXJidWZmZXIpID49IGNoYXJzOgogICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxpZiBzaXplID49IDA6CisgICAgICAgICAgICAgICAgaWYgbGVuKHNlbGYuY2hhcmJ1ZmZlcikgPj0gc2l6ZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICMgd2UgbmVlZCBtb3JlIGRhdGEKICAgICAgICAgICAgIGlmIHNpemUgPCAwOgogICAgICAgICAgICAgICAgIG5ld2RhdGEgPSBzZWxmLnN0cmVhbS5yZWFkKCkKZGlmZiAtLWdpdCBhL0xpYi9jb2xsZWN0aW9ucy5weSBiL0xpYi9jb2xsZWN0aW9ucy5weQppbmRleCA5NThlNTIzLi44ODMxZjBiIDEwMDY0NAotLS0gYS9MaWIvY29sbGVjdGlvbnMucHkKKysrIGIvTGliL2NvbGxlY3Rpb25zLnB5CkBAIC02LDExICs2LDEyIEBACiBfX2FsbF9fICs9IF9hYmNvbGwuX19hbGxfXwogCiBmcm9tIF9jb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUsIGRlZmF1bHRkaWN0Ci1mcm9tIG9wZXJhdG9yIGltcG9ydCBpdGVtZ2V0dGVyIGFzIF9pdGVtZ2V0dGVyCitmcm9tIG9wZXJhdG9yIGltcG9ydCBpdGVtZ2V0dGVyIGFzIF9pdGVtZ2V0dGVyLCBlcSBhcyBfZXEKIGZyb20ga2V5d29yZCBpbXBvcnQgaXNrZXl3b3JkIGFzIF9pc2tleXdvcmQKIGltcG9ydCBzeXMgYXMgX3N5cwogaW1wb3J0IGhlYXBxIGFzIF9oZWFwcQogZnJvbSBpdGVydG9vbHMgaW1wb3J0IHJlcGVhdCBhcyBfcmVwZWF0LCBjaGFpbiBhcyBfY2hhaW4sIHN0YXJtYXAgYXMgX3N0YXJtYXAKK2Zyb20gaXRlcnRvb2xzIGltcG9ydCBpbWFwIGFzIF9pbWFwCiAKIHRyeToKICAgICBmcm9tIHRocmVhZCBpbXBvcnQgZ2V0X2lkZW50IGFzIF9nZXRfaWRlbnQKQEAgLTUwLDQ5ICs1MSw0NSBAQAogICAgICAgICAgICAgc2VsZi5fX21hcCA9IHt9CiAgICAgICAgIHNlbGYuX191cGRhdGUoKmFyZ3MsICoqa3dkcykKIAotICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlLCBQUkVWPTAsIE5FWFQ9MSwgZGljdF9zZXRpdGVtPWRpY3QuX19zZXRpdGVtX18pOgorICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlLCBkaWN0X3NldGl0ZW09ZGljdC5fX3NldGl0ZW1fXyk6CiAgICAgICAgICdvZC5fX3NldGl0ZW1fXyhpLCB5KSA8PT0+IG9kW2ldPXknCiAgICAgICAgICMgU2V0dGluZyBhIG5ldyBpdGVtIGNyZWF0ZXMgYSBuZXcgbGluayBhdCB0aGUgZW5kIG9mIHRoZSBsaW5rZWQgbGlzdCwKICAgICAgICAgIyBhbmQgdGhlIGluaGVyaXRlZCBkaWN0aW9uYXJ5IGlzIHVwZGF0ZWQgd2l0aCB0aGUgbmV3IGtleS92YWx1ZSBwYWlyLgogICAgICAgICBpZiBrZXkgbm90IGluIHNlbGY6CiAgICAgICAgICAgICByb290ID0gc2VsZi5fX3Jvb3QKLSAgICAgICAgICAgIGxhc3QgPSByb290W1BSRVZdCi0gICAgICAgICAgICBsYXN0W05FWFRdID0gcm9vdFtQUkVWXSA9IHNlbGYuX19tYXBba2V5XSA9IFtsYXN0LCByb290LCBrZXldCi0gICAgICAgIGRpY3Rfc2V0aXRlbShzZWxmLCBrZXksIHZhbHVlKQorICAgICAgICAgICAgbGFzdCA9IHJvb3RbMF0KKyAgICAgICAgICAgIGxhc3RbMV0gPSByb290WzBdID0gc2VsZi5fX21hcFtrZXldID0gW2xhc3QsIHJvb3QsIGtleV0KKyAgICAgICAgcmV0dXJuIGRpY3Rfc2V0aXRlbShzZWxmLCBrZXksIHZhbHVlKQogCi0gICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSwgUFJFVj0wLCBORVhUPTEsIGRpY3RfZGVsaXRlbT1kaWN0Ll9fZGVsaXRlbV9fKToKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5LCBkaWN0X2RlbGl0ZW09ZGljdC5fX2RlbGl0ZW1fXyk6CiAgICAgICAgICdvZC5fX2RlbGl0ZW1fXyh5KSA8PT0+IGRlbCBvZFt5XScKICAgICAgICAgIyBEZWxldGluZyBhbiBleGlzdGluZyBpdGVtIHVzZXMgc2VsZi5fX21hcCB0byBmaW5kIHRoZSBsaW5rIHdoaWNoIGdldHMKICAgICAgICAgIyByZW1vdmVkIGJ5IHVwZGF0aW5nIHRoZSBsaW5rcyBpbiB0aGUgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciBub2Rlcy4KICAgICAgICAgZGljdF9kZWxpdGVtKHNlbGYsIGtleSkKLSAgICAgICAgbGlua19wcmV2LCBsaW5rX25leHQsIGtleSA9IHNlbGYuX19tYXAucG9wKGtleSkKLSAgICAgICAgbGlua19wcmV2W05FWFRdID0gbGlua19uZXh0Ci0gICAgICAgIGxpbmtfbmV4dFtQUkVWXSA9IGxpbmtfcHJldgorICAgICAgICBsaW5rX3ByZXYsIGxpbmtfbmV4dCwgXyA9IHNlbGYuX19tYXAucG9wKGtleSkKKyAgICAgICAgbGlua19wcmV2WzFdID0gbGlua19uZXh0ICAgICAgICAgICAgICAgICAgICAgICAgIyB1cGRhdGUgbGlua19wcmV2W05FWFRdCisgICAgICAgIGxpbmtfbmV4dFswXSA9IGxpbmtfcHJldiAgICAgICAgICAgICAgICAgICAgICAgICMgdXBkYXRlIGxpbmtfbmV4dFtQUkVWXQogCiAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICAnb2QuX19pdGVyX18oKSA8PT0+IGl0ZXIob2QpJwogICAgICAgICAjIFRyYXZlcnNlIHRoZSBsaW5rZWQgbGlzdCBpbiBvcmRlci4KLSAgICAgICAgTkVYVCwgS0VZID0gMSwgMgogICAgICAgICByb290ID0gc2VsZi5fX3Jvb3QKLSAgICAgICAgY3VyciA9IHJvb3RbTkVYVF0KKyAgICAgICAgY3VyciA9IHJvb3RbMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdGFydCBhdCB0aGUgZmlyc3Qgbm9kZQogICAgICAgICB3aGlsZSBjdXJyIGlzIG5vdCByb290OgotICAgICAgICAgICAgeWllbGQgY3VycltLRVldCi0gICAgICAgICAgICBjdXJyID0gY3VycltORVhUXQorICAgICAgICAgICAgeWllbGQgY3VyclsyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHlpZWxkIHRoZSBjdXJyW0tFWV0KKyAgICAgICAgICAgIGN1cnIgPSBjdXJyWzFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtb3ZlIHRvIG5leHQgbm9kZQogCiAgICAgZGVmIF9fcmV2ZXJzZWRfXyhzZWxmKToKICAgICAgICAgJ29kLl9fcmV2ZXJzZWRfXygpIDw9PT4gcmV2ZXJzZWQob2QpJwogICAgICAgICAjIFRyYXZlcnNlIHRoZSBsaW5rZWQgbGlzdCBpbiByZXZlcnNlIG9yZGVyLgotICAgICAgICBQUkVWLCBLRVkgPSAwLCAyCiAgICAgICAgIHJvb3QgPSBzZWxmLl9fcm9vdAotICAgICAgICBjdXJyID0gcm9vdFtQUkVWXQorICAgICAgICBjdXJyID0gcm9vdFswXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHN0YXJ0IGF0IHRoZSBsYXN0IG5vZGUKICAgICAgICAgd2hpbGUgY3VyciBpcyBub3Qgcm9vdDoKLSAgICAgICAgICAgIHlpZWxkIGN1cnJbS0VZXQotICAgICAgICAgICAgY3VyciA9IGN1cnJbUFJFVl0KKyAgICAgICAgICAgIHlpZWxkIGN1cnJbMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB5aWVsZCB0aGUgY3VycltLRVldCisgICAgICAgICAgICBjdXJyID0gY3VyclswXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbW92ZSB0byBwcmV2aW91cyBub2RlCiAKICAgICBkZWYgY2xlYXIoc2VsZik6CiAgICAgICAgICdvZC5jbGVhcigpIC0+IE5vbmUuICBSZW1vdmUgYWxsIGl0ZW1zIGZyb20gb2QuJwotICAgICAgICBmb3Igbm9kZSBpbiBzZWxmLl9fbWFwLml0ZXJ2YWx1ZXMoKToKLSAgICAgICAgICAgIGRlbCBub2RlWzpdCiAgICAgICAgIHJvb3QgPSBzZWxmLl9fcm9vdAogICAgICAgICByb290WzpdID0gW3Jvb3QsIHJvb3QsIE5vbmVdCiAgICAgICAgIHNlbGYuX19tYXAuY2xlYXIoKQpAQCAtMjA4LDcgKzIwNSw3IEBACiAKICAgICAgICAgJycnCiAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIE9yZGVyZWREaWN0KToKLSAgICAgICAgICAgIHJldHVybiBsZW4oc2VsZik9PWxlbihvdGhlcikgYW5kIHNlbGYuaXRlbXMoKSA9PSBvdGhlci5pdGVtcygpCisgICAgICAgICAgICByZXR1cm4gZGljdC5fX2VxX18oc2VsZiwgb3RoZXIpIGFuZCBhbGwoX2ltYXAoX2VxLCBzZWxmLCBvdGhlcikpCiAgICAgICAgIHJldHVybiBkaWN0Ll9fZXFfXyhzZWxmLCBvdGhlcikKIAogICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgpAQCAtMjM0LDEwICsyMzEsNjQgQEAKICMjIyBuYW1lZHR1cGxlCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCitfY2xhc3NfdGVtcGxhdGUgPSAnJydcCitjbGFzcyB7dHlwZW5hbWV9KHR1cGxlKToKKyAgICAne3R5cGVuYW1lfSh7YXJnX2xpc3R9KScKKworICAgIF9fc2xvdHNfXyA9ICgpCisKKyAgICBfZmllbGRzID0ge2ZpZWxkX25hbWVzIXJ9CisKKyAgICBkZWYgX19uZXdfXyhfY2xzLCB7YXJnX2xpc3R9KToKKyAgICAgICAgJ0NyZWF0ZSBuZXcgaW5zdGFuY2Ugb2Yge3R5cGVuYW1lfSh7YXJnX2xpc3R9KScKKyAgICAgICAgcmV0dXJuIF90dXBsZS5fX25ld19fKF9jbHMsICh7YXJnX2xpc3R9KSkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfbWFrZShjbHMsIGl0ZXJhYmxlLCBuZXc9dHVwbGUuX19uZXdfXywgbGVuPWxlbik6CisgICAgICAgICdNYWtlIGEgbmV3IHt0eXBlbmFtZX0gb2JqZWN0IGZyb20gYSBzZXF1ZW5jZSBvciBpdGVyYWJsZScKKyAgICAgICAgcmVzdWx0ID0gbmV3KGNscywgaXRlcmFibGUpCisgICAgICAgIGlmIGxlbihyZXN1bHQpICE9IHtudW1fZmllbGRzOmR9OgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdFeHBlY3RlZCB7bnVtX2ZpZWxkczpkfSBhcmd1bWVudHMsIGdvdCAlZCcgJSBsZW4ocmVzdWx0KSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAnUmV0dXJuIGEgbmljZWx5IGZvcm1hdHRlZCByZXByZXNlbnRhdGlvbiBzdHJpbmcnCisgICAgICAgIHJldHVybiAne3R5cGVuYW1lfSh7cmVwcl9mbXR9KScgJSBzZWxmCisKKyAgICBkZWYgX2FzZGljdChzZWxmKToKKyAgICAgICAgJ1JldHVybiBhIG5ldyBPcmRlcmVkRGljdCB3aGljaCBtYXBzIGZpZWxkIG5hbWVzIHRvIHRoZWlyIHZhbHVlcycKKyAgICAgICAgcmV0dXJuIE9yZGVyZWREaWN0KHppcChzZWxmLl9maWVsZHMsIHNlbGYpKQorCisgICAgZGVmIF9yZXBsYWNlKF9zZWxmLCAqKmt3ZHMpOgorICAgICAgICAnUmV0dXJuIGEgbmV3IHt0eXBlbmFtZX0gb2JqZWN0IHJlcGxhY2luZyBzcGVjaWZpZWQgZmllbGRzIHdpdGggbmV3IHZhbHVlcycKKyAgICAgICAgcmVzdWx0ID0gX3NlbGYuX21ha2UobWFwKGt3ZHMucG9wLCB7ZmllbGRfbmFtZXMhcn0sIF9zZWxmKSkKKyAgICAgICAgaWYga3dkczoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0dvdCB1bmV4cGVjdGVkIGZpZWxkIG5hbWVzOiAlcicgJSBrd2RzLmtleXMoKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIF9fZ2V0bmV3YXJnc19fKHNlbGYpOgorICAgICAgICAnUmV0dXJuIHNlbGYgYXMgYSBwbGFpbiB0dXBsZS4gIFVzZWQgYnkgY29weSBhbmQgcGlja2xlLicKKyAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYpCisKKyAgICBfX2RpY3RfXyA9IF9wcm9wZXJ0eShfYXNkaWN0KQorCisgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgJ0V4Y2x1ZGUgdGhlIE9yZGVyZWREaWN0IGZyb20gcGlja2xpbmcnCisgICAgICAgIHBhc3MKKwore2ZpZWxkX2RlZnN9CisnJycKKworX3JlcHJfdGVtcGxhdGUgPSAne25hbWV9PSVyJworCitfZmllbGRfdGVtcGxhdGUgPSAnJydcCisgICAge25hbWV9ID0gX3Byb3BlcnR5KF9pdGVtZ2V0dGVyKHtpbmRleDpkfSksIGRvYz0nQWxpYXMgZm9yIGZpZWxkIG51bWJlciB7aW5kZXg6ZH0nKQorJycnCisKIGRlZiBuYW1lZHR1cGxlKHR5cGVuYW1lLCBmaWVsZF9uYW1lcywgdmVyYm9zZT1GYWxzZSwgcmVuYW1lPUZhbHNlKToKICAgICAiIiJSZXR1cm5zIGEgbmV3IHN1YmNsYXNzIG9mIHR1cGxlIHdpdGggbmFtZWQgZmllbGRzLgogCi0gICAgPj4+IFBvaW50ID0gbmFtZWR0dXBsZSgnUG9pbnQnLCAneCB5JykKKyAgICA+Pj4gUG9pbnQgPSBuYW1lZHR1cGxlKCdQb2ludCcsIFsneCcsICd5J10pCiAgICAgPj4+IFBvaW50Ll9fZG9jX18gICAgICAgICAgICAgICAgICAgIyBkb2NzdHJpbmcgZm9yIHRoZSBuZXcgY2xhc3MKICAgICAnUG9pbnQoeCwgeSknCiAgICAgPj4+IHAgPSBQb2ludCgxMSwgeT0yMikgICAgICAgICAgICAgIyBpbnN0YW50aWF0ZSB3aXRoIHBvc2l0aW9uYWwgYXJncyBvciBrZXl3b3JkcwpAQCAtMjU4LDg3ICszMDksNzAgQEAKIAogICAgICIiIgogCi0gICAgIyBQYXJzZSBhbmQgdmFsaWRhdGUgdGhlIGZpZWxkIG5hbWVzLiAgVmFsaWRhdGlvbiBzZXJ2ZXMgdHdvIHB1cnBvc2VzLAotICAgICMgZ2VuZXJhdGluZyBpbmZvcm1hdGl2ZSBlcnJvciBtZXNzYWdlcyBhbmQgcHJldmVudGluZyB0ZW1wbGF0ZSBpbmplY3Rpb24gYXR0YWNrcy4KKyAgICAjIFZhbGlkYXRlIHRoZSBmaWVsZCBuYW1lcy4gIEF0IHRoZSB1c2VyJ3Mgb3B0aW9uLCBlaXRoZXIgZ2VuZXJhdGUgYW4gZXJyb3IKKyAgICAjIG1lc3NhZ2Ugb3IgYXV0b21hdGljYWxseSByZXBsYWNlIHRoZSBmaWVsZCBuYW1lIHdpdGggYSB2YWxpZCBuYW1lLgogICAgIGlmIGlzaW5zdGFuY2UoZmllbGRfbmFtZXMsIGJhc2VzdHJpbmcpOgotICAgICAgICBmaWVsZF9uYW1lcyA9IGZpZWxkX25hbWVzLnJlcGxhY2UoJywnLCAnICcpLnNwbGl0KCkgIyBuYW1lcyBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSBhbmQvb3IgY29tbWFzCi0gICAgZmllbGRfbmFtZXMgPSB0dXBsZShtYXAoc3RyLCBmaWVsZF9uYW1lcykpCisgICAgICAgIGZpZWxkX25hbWVzID0gZmllbGRfbmFtZXMucmVwbGFjZSgnLCcsICcgJykuc3BsaXQoKQorICAgIGZpZWxkX25hbWVzID0gbWFwKHN0ciwgZmllbGRfbmFtZXMpCisgICAgdHlwZW5hbWUgPSBzdHIodHlwZW5hbWUpCiAgICAgaWYgcmVuYW1lOgotICAgICAgICBuYW1lcyA9IGxpc3QoZmllbGRfbmFtZXMpCiAgICAgICAgIHNlZW4gPSBzZXQoKQotICAgICAgICBmb3IgaSwgbmFtZSBpbiBlbnVtZXJhdGUobmFtZXMpOgotICAgICAgICAgICAgaWYgKG5vdCBhbGwoYy5pc2FsbnVtKCkgb3IgYz09J18nIGZvciBjIGluIG5hbWUpIG9yIF9pc2tleXdvcmQobmFtZSkKLSAgICAgICAgICAgICAgICBvciBub3QgbmFtZSBvciBuYW1lWzBdLmlzZGlnaXQoKSBvciBuYW1lLnN0YXJ0c3dpdGgoJ18nKQorICAgICAgICBmb3IgaW5kZXgsIG5hbWUgaW4gZW51bWVyYXRlKGZpZWxkX25hbWVzKToKKyAgICAgICAgICAgIGlmIChub3QgYWxsKGMuaXNhbG51bSgpIG9yIGM9PSdfJyBmb3IgYyBpbiBuYW1lKQorICAgICAgICAgICAgICAgIG9yIF9pc2tleXdvcmQobmFtZSkKKyAgICAgICAgICAgICAgICBvciBub3QgbmFtZQorICAgICAgICAgICAgICAgIG9yIG5hbWVbMF0uaXNkaWdpdCgpCisgICAgICAgICAgICAgICAgb3IgbmFtZS5zdGFydHN3aXRoKCdfJykKICAgICAgICAgICAgICAgICBvciBuYW1lIGluIHNlZW4pOgotICAgICAgICAgICAgICAgIG5hbWVzW2ldID0gJ18lZCcgJSBpCisgICAgICAgICAgICAgICAgZmllbGRfbmFtZXNbaW5kZXhdID0gJ18lZCcgJSBpbmRleAogICAgICAgICAgICAgc2Vlbi5hZGQobmFtZSkKLSAgICAgICAgZmllbGRfbmFtZXMgPSB0dXBsZShuYW1lcykKLSAgICBmb3IgbmFtZSBpbiAodHlwZW5hbWUsKSArIGZpZWxkX25hbWVzOgorICAgIGZvciBuYW1lIGluIFt0eXBlbmFtZV0gKyBmaWVsZF9uYW1lczoKKyAgICAgICAgaWYgdHlwZShuYW1lKSAhPSBzdHI6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ1R5cGUgbmFtZXMgYW5kIGZpZWxkIG5hbWVzIG11c3QgYmUgc3RyaW5ncycpCiAgICAgICAgIGlmIG5vdCBhbGwoYy5pc2FsbnVtKCkgb3IgYz09J18nIGZvciBjIGluIG5hbWUpOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVHlwZSBuYW1lcyBhbmQgZmllbGQgbmFtZXMgY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgdW5kZXJzY29yZXM6ICVyJyAlIG5hbWUpCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdUeXBlIG5hbWVzIGFuZCBmaWVsZCBuYW1lcyBjYW4gb25seSBjb250YWluICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGFuZCB1bmRlcnNjb3JlczogJXInICUgbmFtZSkKICAgICAgICAgaWYgX2lza2V5d29yZChuYW1lKToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1R5cGUgbmFtZXMgYW5kIGZpZWxkIG5hbWVzIGNhbm5vdCBiZSBhIGtleXdvcmQ6ICVyJyAlIG5hbWUpCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdUeXBlIG5hbWVzIGFuZCBmaWVsZCBuYW1lcyBjYW5ub3QgYmUgYSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrZXl3b3JkOiAlcicgJSBuYW1lKQogICAgICAgICBpZiBuYW1lWzBdLmlzZGlnaXQoKToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1R5cGUgbmFtZXMgYW5kIGZpZWxkIG5hbWVzIGNhbm5vdCBzdGFydCB3aXRoIGEgbnVtYmVyOiAlcicgJSBuYW1lKQotICAgIHNlZW5fbmFtZXMgPSBzZXQoKQorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVHlwZSBuYW1lcyBhbmQgZmllbGQgbmFtZXMgY2Fubm90IHN0YXJ0IHdpdGggJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYSBudW1iZXI6ICVyJyAlIG5hbWUpCisgICAgc2VlbiA9IHNldCgpCiAgICAgZm9yIG5hbWUgaW4gZmllbGRfbmFtZXM6CiAgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgnXycpIGFuZCBub3QgcmVuYW1lOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignRmllbGQgbmFtZXMgY2Fubm90IHN0YXJ0IHdpdGggYW4gdW5kZXJzY29yZTogJXInICUgbmFtZSkKLSAgICAgICAgaWYgbmFtZSBpbiBzZWVuX25hbWVzOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignRmllbGQgbmFtZXMgY2Fubm90IHN0YXJ0IHdpdGggYW4gdW5kZXJzY29yZTogJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXInICUgbmFtZSkKKyAgICAgICAgaWYgbmFtZSBpbiBzZWVuOgogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignRW5jb3VudGVyZWQgZHVwbGljYXRlIGZpZWxkIG5hbWU6ICVyJyAlIG5hbWUpCi0gICAgICAgIHNlZW5fbmFtZXMuYWRkKG5hbWUpCisgICAgICAgIHNlZW4uYWRkKG5hbWUpCiAKLSAgICAjIENyZWF0ZSBhbmQgZmlsbC1pbiB0aGUgY2xhc3MgdGVtcGxhdGUKLSAgICBudW1maWVsZHMgPSBsZW4oZmllbGRfbmFtZXMpCi0gICAgYXJndHh0ID0gcmVwcihmaWVsZF9uYW1lcykucmVwbGFjZSgiJyIsICIiKVsxOi0xXSAgICMgdHVwbGUgcmVwciB3aXRob3V0IHBhcmVucyBvciBxdW90ZXMKLSAgICByZXBydHh0ID0gJywgJy5qb2luKCclcz0lJXInICUgbmFtZSBmb3IgbmFtZSBpbiBmaWVsZF9uYW1lcykKLSAgICB0ZW1wbGF0ZSA9ICcnJ2NsYXNzICUodHlwZW5hbWUpcyh0dXBsZSk6Ci0gICAgICAgICclKHR5cGVuYW1lKXMoJShhcmd0eHQpcyknIFxuCi0gICAgICAgIF9fc2xvdHNfXyA9ICgpIFxuCi0gICAgICAgIF9maWVsZHMgPSAlKGZpZWxkX25hbWVzKXIgXG4KLSAgICAgICAgZGVmIF9fbmV3X18oX2NscywgJShhcmd0eHQpcyk6Ci0gICAgICAgICAgICAnQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiAlKHR5cGVuYW1lKXMoJShhcmd0eHQpcyknCi0gICAgICAgICAgICByZXR1cm4gX3R1cGxlLl9fbmV3X18oX2NscywgKCUoYXJndHh0KXMpKSBcbgotICAgICAgICBAY2xhc3NtZXRob2QKLSAgICAgICAgZGVmIF9tYWtlKGNscywgaXRlcmFibGUsIG5ldz10dXBsZS5fX25ld19fLCBsZW49bGVuKToKLSAgICAgICAgICAgICdNYWtlIGEgbmV3ICUodHlwZW5hbWUpcyBvYmplY3QgZnJvbSBhIHNlcXVlbmNlIG9yIGl0ZXJhYmxlJwotICAgICAgICAgICAgcmVzdWx0ID0gbmV3KGNscywgaXRlcmFibGUpCi0gICAgICAgICAgICBpZiBsZW4ocmVzdWx0KSAhPSAlKG51bWZpZWxkcylkOgotICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignRXhwZWN0ZWQgJShudW1maWVsZHMpZCBhcmd1bWVudHMsIGdvdCAlJWQnICUlIGxlbihyZXN1bHQpKQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCBcbgotICAgICAgICBkZWYgX19yZXByX18oc2VsZik6Ci0gICAgICAgICAgICAnUmV0dXJuIGEgbmljZWx5IGZvcm1hdHRlZCByZXByZXNlbnRhdGlvbiBzdHJpbmcnCi0gICAgICAgICAgICByZXR1cm4gJyUodHlwZW5hbWUpcyglKHJlcHJ0eHQpcyknICUlIHNlbGYgXG4KLSAgICAgICAgZGVmIF9hc2RpY3Qoc2VsZik6Ci0gICAgICAgICAgICAnUmV0dXJuIGEgbmV3IE9yZGVyZWREaWN0IHdoaWNoIG1hcHMgZmllbGQgbmFtZXMgdG8gdGhlaXIgdmFsdWVzJwotICAgICAgICAgICAgcmV0dXJuIE9yZGVyZWREaWN0KHppcChzZWxmLl9maWVsZHMsIHNlbGYpKSBcbgotICAgICAgICBfX2RpY3RfXyA9IHByb3BlcnR5KF9hc2RpY3QpIFxuCi0gICAgICAgIGRlZiBfcmVwbGFjZShfc2VsZiwgKiprd2RzKToKLSAgICAgICAgICAgICdSZXR1cm4gYSBuZXcgJSh0eXBlbmFtZSlzIG9iamVjdCByZXBsYWNpbmcgc3BlY2lmaWVkIGZpZWxkcyB3aXRoIG5ldyB2YWx1ZXMnCi0gICAgICAgICAgICByZXN1bHQgPSBfc2VsZi5fbWFrZShtYXAoa3dkcy5wb3AsICUoZmllbGRfbmFtZXMpciwgX3NlbGYpKQotICAgICAgICAgICAgaWYga3dkczoKLSAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdHb3QgdW5leHBlY3RlZCBmaWVsZCBuYW1lczogJSVyJyAlJSBrd2RzLmtleXMoKSkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQgXG4KLSAgICAgICAgZGVmIF9fZ2V0bmV3YXJnc19fKHNlbGYpOgotICAgICAgICAgICAgJ1JldHVybiBzZWxmIGFzIGEgcGxhaW4gdHVwbGUuICBVc2VkIGJ5IGNvcHkgYW5kIHBpY2tsZS4nCi0gICAgICAgICAgICByZXR1cm4gdHVwbGUoc2VsZikgXG5cbicnJyAlIGxvY2FscygpCi0gICAgZm9yIGksIG5hbWUgaW4gZW51bWVyYXRlKGZpZWxkX25hbWVzKToKLSAgICAgICAgdGVtcGxhdGUgKz0gIiAgICAgICAgJXMgPSBfcHJvcGVydHkoX2l0ZW1nZXR0ZXIoJWQpLCBkb2M9J0FsaWFzIGZvciBmaWVsZCBudW1iZXIgJWQnKVxuIiAlIChuYW1lLCBpLCBpKQorICAgICMgRmlsbC1pbiB0aGUgY2xhc3MgdGVtcGxhdGUKKyAgICBjbGFzc19kZWZpbml0aW9uID0gX2NsYXNzX3RlbXBsYXRlLmZvcm1hdCgKKyAgICAgICAgdHlwZW5hbWUgPSB0eXBlbmFtZSwKKyAgICAgICAgZmllbGRfbmFtZXMgPSB0dXBsZShmaWVsZF9uYW1lcyksCisgICAgICAgIG51bV9maWVsZHMgPSBsZW4oZmllbGRfbmFtZXMpLAorICAgICAgICBhcmdfbGlzdCA9IHJlcHIodHVwbGUoZmllbGRfbmFtZXMpKS5yZXBsYWNlKCInIiwgIiIpWzE6LTFdLAorICAgICAgICByZXByX2ZtdCA9ICcsICcuam9pbihfcmVwcl90ZW1wbGF0ZS5mb3JtYXQobmFtZT1uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWVsZF9uYW1lcyksCisgICAgICAgIGZpZWxkX2RlZnMgPSAnXG4nLmpvaW4oX2ZpZWxkX3RlbXBsYXRlLmZvcm1hdChpbmRleD1pbmRleCwgbmFtZT1uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpbmRleCwgbmFtZSBpbiBlbnVtZXJhdGUoZmllbGRfbmFtZXMpKQorICAgICkKICAgICBpZiB2ZXJib3NlOgotICAgICAgICBwcmludCB0ZW1wbGF0ZQorICAgICAgICBwcmludCBjbGFzc19kZWZpbml0aW9uCiAKLSAgICAjIEV4ZWN1dGUgdGhlIHRlbXBsYXRlIHN0cmluZyBpbiBhIHRlbXBvcmFyeSBuYW1lc3BhY2UgYW5kCi0gICAgIyBzdXBwb3J0IHRyYWNpbmcgdXRpbGl0aWVzIGJ5IHNldHRpbmcgYSB2YWx1ZSBmb3IgZnJhbWUuZl9nbG9iYWxzWydfX25hbWVfXyddCisgICAgIyBFeGVjdXRlIHRoZSB0ZW1wbGF0ZSBzdHJpbmcgaW4gYSB0ZW1wb3JhcnkgbmFtZXNwYWNlIGFuZCBzdXBwb3J0CisgICAgIyB0cmFjaW5nIHV0aWxpdGllcyBieSBzZXR0aW5nIGEgdmFsdWUgZm9yIGZyYW1lLmZfZ2xvYmFsc1snX19uYW1lX18nXQogICAgIG5hbWVzcGFjZSA9IGRpY3QoX2l0ZW1nZXR0ZXI9X2l0ZW1nZXR0ZXIsIF9fbmFtZV9fPSduYW1lZHR1cGxlXyVzJyAlIHR5cGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgT3JkZXJlZERpY3Q9T3JkZXJlZERpY3QsIF9wcm9wZXJ0eT1wcm9wZXJ0eSwgX3R1cGxlPXR1cGxlKQogICAgIHRyeToKLSAgICAgICAgZXhlYyB0ZW1wbGF0ZSBpbiBuYW1lc3BhY2UKLSAgICBleGNlcHQgU3ludGF4RXJyb3IsIGU6Ci0gICAgICAgIHJhaXNlIFN5bnRheEVycm9yKGUubWVzc2FnZSArICc6XG4nICsgdGVtcGxhdGUpCisgICAgICAgIGV4ZWMgY2xhc3NfZGVmaW5pdGlvbiBpbiBuYW1lc3BhY2UKKyAgICBleGNlcHQgU3ludGF4RXJyb3IgYXMgZToKKyAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoZS5tZXNzYWdlICsgJzpcbicgKyBjbGFzc19kZWZpbml0aW9uKQogICAgIHJlc3VsdCA9IG5hbWVzcGFjZVt0eXBlbmFtZV0KIAogICAgICMgRm9yIHBpY2tsaW5nIHRvIHdvcmssIHRoZSBfX21vZHVsZV9fIHZhcmlhYmxlIG5lZWRzIHRvIGJlIHNldCB0byB0aGUgZnJhbWUKLSAgICAjIHdoZXJlIHRoZSBuYW1lZCB0dXBsZSBpcyBjcmVhdGVkLiAgQnlwYXNzIHRoaXMgc3RlcCBpbiBlbnZpcm9tZW50cyB3aGVyZQorICAgICMgd2hlcmUgdGhlIG5hbWVkIHR1cGxlIGlzIGNyZWF0ZWQuICBCeXBhc3MgdGhpcyBzdGVwIGluIGVudmlyb25tZW50cyB3aGVyZQogICAgICMgc3lzLl9nZXRmcmFtZSBpcyBub3QgZGVmaW5lZCAoSnl0aG9uIGZvciBleGFtcGxlKSBvciBzeXMuX2dldGZyYW1lIGlzIG5vdAogICAgICMgZGVmaW5lZCBmb3IgYXJndW1lbnRzIGdyZWF0ZXIgdGhhbiAwIChJcm9uUHl0aG9uKS4KICAgICB0cnk6CmRpZmYgLS1naXQgYS9MaWIvY29tcGlsZXIvY29uc3RzLnB5IGIvTGliL2NvbXBpbGVyL2NvbnN0cy5weQppbmRleCAwMjJmNmRhLi5jNjBiMWQwIDEwMDY0NAotLS0gYS9MaWIvY29tcGlsZXIvY29uc3RzLnB5CisrKyBiL0xpYi9jb21waWxlci9jb25zdHMucHkKQEAgLTUsNyArNSw3IEBACiAKIFNDX0xPQ0FMID0gMQogU0NfR0xPQkFMX0lNUExJQ0lUID0gMgotU0NfR0xPQkFMX0VYUExJQ1QgPSAzCitTQ19HTE9CQUxfRVhQTElDSVQgPSAzCiBTQ19GUkVFID0gNAogU0NfQ0VMTCA9IDUKIFNDX1VOS05PV04gPSA2CmRpZmYgLS1naXQgYS9MaWIvY29tcGlsZXIvcHlhc3NlbS5weSBiL0xpYi9jb21waWxlci9weWFzc2VtLnB5CmluZGV4IDI4NmJlMGMuLmY1MmY3ZDAgMTAwNjQ0Ci0tLSBhL0xpYi9jb21waWxlci9weWFzc2VtLnB5CisrKyBiL0xpYi9jb21waWxlci9weWFzc2VtLnB5CkBAIC0xMjUsNyArMTI1LDcgQEAKICAgICAgICAgIyBNYWtlIHN1cmUgZXZlcnkgYmxvY2sgYXBwZWFycyBpbiBkb21pbmF0b3JzLCBldmVuIGlmIG5vCiAgICAgICAgICMgb3RoZXIgYmxvY2sgbXVzdCBwcmVjZWRlIGl0LgogICAgICAgICBkb21pbmF0b3JzLnNldGRlZmF1bHQoYiwgc2V0KCkpCi0gICAgICAgICMgcHJlY2VlZGluZyBibG9ja3MgZG9taW5hdGUgZm9sbG93aW5nIGJsb2NrcworICAgICAgICAjIHByZWNlZGluZyBibG9ja3MgZG9taW5hdGUgZm9sbG93aW5nIGJsb2NrcwogICAgICAgICBmb3IgYyBpbiBiLmdldF9mb2xsb3dlcnMoKToKICAgICAgICAgICAgIHdoaWxlIDE6CiAgICAgICAgICAgICAgICAgZG9taW5hdG9ycy5zZXRkZWZhdWx0KGMsIHNldCgpKS5hZGQoYikKZGlmZiAtLWdpdCBhL0xpYi9jb21waWxlci9weWNvZGVnZW4ucHkgYi9MaWIvY29tcGlsZXIvcHljb2RlZ2VuLnB5CmluZGV4IDRmMmVjZjIuLjY1MTU5NDUgMTAwNjQ0Ci0tLSBhL0xpYi9jb21waWxlci9weWNvZGVnZW4ucHkKKysrIGIvTGliL2NvbXBpbGVyL3B5Y29kZWdlbi5weQpAQCAtNyw3ICs3LDcgQEAKIAogZnJvbSBjb21waWxlciBpbXBvcnQgYXN0LCBwYXJzZSwgd2Fsaywgc3ludGF4CiBmcm9tIGNvbXBpbGVyIGltcG9ydCBweWFzc2VtLCBtaXNjLCBmdXR1cmUsIHN5bWJvbHMKLWZyb20gY29tcGlsZXIuY29uc3RzIGltcG9ydCBTQ19MT0NBTCwgU0NfR0xPQkFMX0lNUExJQ0lULCBTQ19HTE9CQUxfRVhQTElDVCwgXAorZnJvbSBjb21waWxlci5jb25zdHMgaW1wb3J0IFNDX0xPQ0FMLCBTQ19HTE9CQUxfSU1QTElDSVQsIFNDX0dMT0JBTF9FWFBMSUNJVCwgXAogICAgICBTQ19GUkVFLCBTQ19DRUxMCiBmcm9tIGNvbXBpbGVyLmNvbnN0cyBpbXBvcnQgKENPX1ZBUkFSR1MsIENPX1ZBUktFWVdPUkRTLCBDT19ORVdMT0NBTFMsCiAgICAgIENPX05FU1RFRCwgQ09fR0VORVJBVE9SLCBDT19GVVRVUkVfRElWSVNJT04sCkBAIC0yODMsNyArMjgzLDcgQEAKICAgICAgICAgICAgICAgICBzZWxmLmVtaXQocHJlZml4ICsgJ19OQU1FJywgbmFtZSkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgc2VsZi5lbWl0KHByZWZpeCArICdfRkFTVCcsIG5hbWUpCi0gICAgICAgIGVsaWYgc2NvcGUgPT0gU0NfR0xPQkFMX0VYUExJQ1Q6CisgICAgICAgIGVsaWYgc2NvcGUgPT0gU0NfR0xPQkFMX0VYUExJQ0lUOgogICAgICAgICAgICAgc2VsZi5lbWl0KHByZWZpeCArICdfR0xPQkFMJywgbmFtZSkKICAgICAgICAgZWxpZiBzY29wZSA9PSBTQ19HTE9CQUxfSU1QTElDSVQ6CiAgICAgICAgICAgICBpZiBub3Qgc2VsZi5vcHRpbWl6ZWQ6CmRpZmYgLS1naXQgYS9MaWIvY29tcGlsZXIvc3ltYm9scy5weSBiL0xpYi9jb21waWxlci9zeW1ib2xzLnB5CmluZGV4IDBiYmRjNzEuLmFmZWVjNTAgMTAwNjQ0Ci0tLSBhL0xpYi9jb21waWxlci9zeW1ib2xzLnB5CisrKyBiL0xpYi9jb21waWxlci9zeW1ib2xzLnB5CkBAIC0xLDcgKzEsNyBAQAogIiIiTW9kdWxlIHN5bWJvbC10YWJsZSBnZW5lcmF0b3IiIiIKIAogZnJvbSBjb21waWxlciBpbXBvcnQgYXN0Ci1mcm9tIGNvbXBpbGVyLmNvbnN0cyBpbXBvcnQgU0NfTE9DQUwsIFNDX0dMT0JBTF9JTVBMSUNJVCwgU0NfR0xPQkFMX0VYUExJQ1QsIFwKK2Zyb20gY29tcGlsZXIuY29uc3RzIGltcG9ydCBTQ19MT0NBTCwgU0NfR0xPQkFMX0lNUExJQ0lULCBTQ19HTE9CQUxfRVhQTElDSVQsIFwKICAgICBTQ19GUkVFLCBTQ19DRUxMLCBTQ19VTktOT1dOCiBmcm9tIGNvbXBpbGVyLm1pc2MgaW1wb3J0IG1hbmdsZQogaW1wb3J0IHR5cGVzCkBAIC05MCw3ICs5MCw3IEBACiAgICAgICAgIFRoZSBzY29wZSBvZiBhIG5hbWUgY291bGQgYmUgTE9DQUwsIEdMT0JBTCwgRlJFRSwgb3IgQ0VMTC4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIG5hbWUgaW4gc2VsZi5nbG9iYWxzOgotICAgICAgICAgICAgcmV0dXJuIFNDX0dMT0JBTF9FWFBMSUNUCisgICAgICAgICAgICByZXR1cm4gU0NfR0xPQkFMX0VYUExJQ0lUCiAgICAgICAgIGlmIG5hbWUgaW4gc2VsZi5jZWxsczoKICAgICAgICAgICAgIHJldHVybiBTQ19DRUxMCiAgICAgICAgIGlmIG5hbWUgaW4gc2VsZi5kZWZzOgpkaWZmIC0tZ2l0IGEvTGliL2Nvb2tpZWxpYi5weSBiL0xpYi9jb29raWVsaWIucHkKaW5kZXggNjUyMTRkZi4uZjI2MGJjNSAxMDA2NDQKLS0tIGEvTGliL2Nvb2tpZWxpYi5weQorKysgYi9MaWIvY29va2llbGliLnB5CkBAIC0xLDQgKzEsNCBAQAotIiIiSFRUUCBjb29raWUgaGFuZGxpbmcgZm9yIHdlYiBjbGllbnRzLgorciIiIkhUVFAgY29va2llIGhhbmRsaW5nIGZvciB3ZWIgY2xpZW50cy4KIAogVGhpcyBtb2R1bGUgaGFzIChub3cgZmFpcmx5IGRpc3RhbnQpIG9yaWdpbnMgaW4gR2lzbGUgQWFzJyBQZXJsIG1vZHVsZQogSFRUUDo6Q29va2llcywgZnJvbSB0aGUgbGlid3d3LXBlcmwgbGlicmFyeS4KQEAgLTE3MTksMTIgKzE3MTksMTIgQEAKICAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgIHIgPSBbXQogICAgICAgICBmb3IgY29va2llIGluIHNlbGY6IHIuYXBwZW5kKHJlcHIoY29va2llKSkKLSAgICAgICAgcmV0dXJuICI8JXNbJXNdPiIgJSAoc2VsZi5fX2NsYXNzX18sICIsICIuam9pbihyKSkKKyAgICAgICAgcmV0dXJuICI8JXNbJXNdPiIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICIsICIuam9pbihyKSkKIAogICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgICByID0gW10KICAgICAgICAgZm9yIGNvb2tpZSBpbiBzZWxmOiByLmFwcGVuZChzdHIoY29va2llKSkKLSAgICAgICAgcmV0dXJuICI8JXNbJXNdPiIgJSAoc2VsZi5fX2NsYXNzX18sICIsICIuam9pbihyKSkKKyAgICAgICAgcmV0dXJuICI8JXNbJXNdPiIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICIsICIuam9pbihyKSkKIAogCiAjIGRlcml2ZXMgZnJvbSBJT0Vycm9yIGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSB3aXRoIFB5dGhvbiAyLjQuMApkaWZmIC0tZ2l0IGEvTGliL2Nzdi5weSBiL0xpYi9jc3YucHkKaW5kZXggOTg0ZWQ3ZS4uYzE1NWFkYSAxMDA2NDQKLS0tIGEvTGliL2Nzdi5weQorKysgYi9MaWIvY3N2LnB5CkBAIC05Myw2ICs5MywxMCBAQAogICAgICAgICBzZWxmLmxpbmVfbnVtID0gc2VsZi5yZWFkZXIubGluZV9udW0KICAgICAgICAgcmV0dXJuIHNlbGYuX2ZpZWxkbmFtZXMKIAorICAgICMgSXNzdWUgMjAwMDQ6IEJlY2F1c2UgRGljdFJlYWRlciBpcyBhIGNsYXNzaWMgY2xhc3MsIHRoaXMgc2V0dGVyIGlzCisgICAgIyBpZ25vcmVkLiAgQXQgdGhpcyBwb2ludCBpbiAyLjcncyBsaWZlY3ljbGUsIGl0IGlzIHRvbyBsYXRlIHRvIGNoYW5nZSB0aGUKKyAgICAjIGJhc2UgY2xhc3MgZm9yIGZlYXIgb2YgYnJlYWtpbmcgd29ya2luZyBjb2RlLiAgSWYgeW91IHdhbnQgdG8gY2hhbmdlCisgICAgIyBmaWVsZG5hbWVzIHdpdGhvdXQgb3ZlcndyaXRpbmcgdGhlIGdldHRlciwgc2V0IF9maWVsZG5hbWVzIGRpcmVjdGx5LgogICAgIEBmaWVsZG5hbWVzLnNldHRlcgogICAgIGRlZiBmaWVsZG5hbWVzKHNlbGYsIHZhbHVlKToKICAgICAgICAgc2VsZi5fZmllbGRuYW1lcyA9IHZhbHVlCkBAIC0xNDAsOCArMTQ0LDggQEAKICAgICAgICAgaWYgc2VsZi5leHRyYXNhY3Rpb24gPT0gInJhaXNlIjoKICAgICAgICAgICAgIHdyb25nX2ZpZWxkcyA9IFtrIGZvciBrIGluIHJvd2RpY3QgaWYgayBub3QgaW4gc2VsZi5maWVsZG5hbWVzXQogICAgICAgICAgICAgaWYgd3JvbmdfZmllbGRzOgotICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImRpY3QgY29udGFpbnMgZmllbGRzIG5vdCBpbiBmaWVsZG5hbWVzOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsICIuam9pbih3cm9uZ19maWVsZHMpKQorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImRpY3QgY29udGFpbnMgZmllbGRzIG5vdCBpbiBmaWVsZG5hbWVzOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsICIuam9pbihbcmVwcih4KSBmb3IgeCBpbiB3cm9uZ19maWVsZHNdKSkKICAgICAgICAgcmV0dXJuIFtyb3dkaWN0LmdldChrZXksIHNlbGYucmVzdHZhbCkgZm9yIGtleSBpbiBzZWxmLmZpZWxkbmFtZXNdCiAKICAgICBkZWYgd3JpdGVyb3coc2VsZiwgcm93ZGljdCk6CkBAIC0yNjEsOCArMjY1LDkgQEAKIAogICAgICAgICAjIGlmIHdlIHNlZSBhbiBleHRyYSBxdW90ZSBiZXR3ZWVuIGRlbGltaXRlcnMsIHdlJ3ZlIGdvdCBhCiAgICAgICAgICMgZG91YmxlIHF1b3RlZCBmb3JtYXQKLSAgICAgICAgZHFfcmVnZXhwID0gcmUuY29tcGlsZShyIigoJShkZWxpbSlzKXxeKVxXKiUocXVvdGUpc1teJShkZWxpbSlzXG5dKiUocXVvdGUpc1teJShkZWxpbSlzXG5dKiUocXVvdGUpc1xXKigoJShkZWxpbSlzKXwkKSIgJSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydkZWxpbSc6ZGVsaW0sICdxdW90ZSc6cXVvdGVjaGFyfSwgcmUuTVVMVElMSU5FKQorICAgICAgICBkcV9yZWdleHAgPSByZS5jb21waWxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiKCglKGRlbGltKXMpfF4pXFcqJShxdW90ZSlzW14lKGRlbGltKXNcbl0qJShxdW90ZSlzW14lKGRlbGltKXNcbl0qJShxdW90ZSlzXFcqKCglKGRlbGltKXMpfCQpIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2RlbGltJzpyZS5lc2NhcGUoZGVsaW0pLCAncXVvdGUnOnF1b3RlY2hhcn0sIHJlLk1VTFRJTElORSkKIAogCiAKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvX2VuZGlhbi5weSBiL0xpYi9jdHlwZXMvX2VuZGlhbi5weQppbmRleCBlNmI4NTU2Li5mODBlNjc1IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL19lbmRpYW4ucHkKKysrIGIvTGliL2N0eXBlcy9fZW5kaWFuLnB5CkBAIC00LDcgKzQsNyBAQAogaW1wb3J0IHN5cwogZnJvbSBjdHlwZXMgaW1wb3J0ICoKIAotX2FycmF5X3R5cGUgPSB0eXBlKGNfaW50ICogMykKK19hcnJheV90eXBlID0gdHlwZShBcnJheSkKIAogZGVmIF9vdGhlcl9lbmRpYW4odHlwKToKICAgICAiIiJSZXR1cm4gdGhlIHR5cGUgd2l0aCB0aGUgJ290aGVyJyBieXRlIG9yZGVyLiAgU2ltcGxlIHR5cGVzIGxpa2UKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC9fX2luaXRfXy5weSBiL0xpYi9jdHlwZXMvdGVzdC9fX2luaXRfXy5weQppbmRleCA1MjIzMDkyLi5mMmNjMTQzIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvX19pbml0X18ucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L19faW5pdF9fLnB5CkBAIC0yLDcgKzIsMTUgQEAKIAogdXNlX3Jlc291cmNlcyA9IFtdCiAKLWNsYXNzIFJlc291cmNlRGVuaWVkKEV4Y2VwdGlvbik6CitpbXBvcnQgY3R5cGVzCitjdHlwZXNfc3ltYm9scyA9IGRpcihjdHlwZXMpCisKK2RlZiBuZWVkX3N5bWJvbChuYW1lKToKKyAgICByZXR1cm4gdW5pdHRlc3Quc2tpcFVubGVzcyhuYW1lIGluIGN0eXBlc19zeW1ib2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7IXJ9IGlzIHJlcXVpcmVkJy5mb3JtYXQobmFtZSkpCisKKworY2xhc3MgUmVzb3VyY2VEZW5pZWQodW5pdHRlc3QuU2tpcFRlc3QpOgogICAgICIiIlRlc3Qgc2tpcHBlZCBiZWNhdXNlIGl0IHJlcXVlc3RlZCBhIGRpc2FsbG93ZWQgcmVzb3VyY2UuCiAKICAgICBUaGlzIGlzIHJhaXNlZCB3aGVuIGEgdGVzdCBjYWxscyByZXF1aXJlcygpIGZvciBhIHJlc291cmNlIHRoYXQKQEAgLTYyLDcgKzcwLDcgQEAKICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG1vZCA9IF9faW1wb3J0X18obW9kbmFtZSwgZ2xvYmFscygpLCBsb2NhbHMoKSwgWycqJ10pCi0gICAgICAgIGV4Y2VwdCBSZXNvdXJjZURlbmllZCwgZGV0YWlsOgorICAgICAgICBleGNlcHQgKFJlc291cmNlRGVuaWVkLCB1bml0dGVzdC5Ta2lwVGVzdCkgYXMgZGV0YWlsOgogICAgICAgICAgICAgc2tpcHBlZC5hcHBlbmQobW9kbmFtZSkKICAgICAgICAgICAgIGlmIHZlcmJvc2l0eSA+IDE6CiAgICAgICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIlNraXBwZWQgJXM6ICVzIiAlIChtb2RuYW1lLCBkZXRhaWwpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvcnVudGVzdHMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvcnVudGVzdHMucHkKaW5kZXggZWMzMWZjOC4uYjdhMmIyNiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3J1bnRlc3RzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC9ydW50ZXN0cy5weQpAQCAtMiw3ICsyLDcgQEAKIAogUnVuIGFsbCB0ZXN0cyBmb3VuZCBpbiB0aGlzIGRpcmVjdG9yeSwgYW5kIHByaW50IGEgc3VtbWFyeSBvZiB0aGUgcmVzdWx0cy4KIENvbW1hbmQgbGluZSBmbGFnczoKLSAgLXEgICAgIHF1aWV0IG1vZGU6IGRvbid0IHBybnQgYW55dGhpbmcgd2hpbGUgdGhlIHRlc3RzIGFyZSBydW5uaW5nCisgIC1xICAgICBxdWlldCBtb2RlOiBkb24ndCBwcmludCBhbnl0aGluZyB3aGlsZSB0aGUgdGVzdHMgYXJlIHJ1bm5pbmcKICAgLXIgICAgIHJ1biB0ZXN0cyByZXBlYXRlZGx5LCBsb29rIGZvciByZWZjb3VudCBsZWFrcwogICAtdTxyZXNvdXJjZXM+CiAgICAgICAgICBBZGQgcmVzb3VyY2VzIHRvIHRoZSBsaXRzIG9mIGFsbG93ZWQgcmVzb3VyY2VzLiAnKicgYWxsb3dzIGFsbApkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlzLnB5CmluZGV4IDkyNWY4YmYuLjQ3ZTk1ZWUgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2FycmF5cy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9hcnJheXMucHkKQEAgLTEsNiArMSw4IEBACiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gY3R5cGVzIGltcG9ydCAqCiAKK2Zyb20gY3R5cGVzLnRlc3QgaW1wb3J0IG5lZWRfc3ltYm9sCisKIGZvcm1hdHMgPSAiYkJoSGlJbExxUWZkIgogCiBmb3JtYXRzID0gY19ieXRlLCBjX3VieXRlLCBjX3Nob3J0LCBjX3VzaG9ydCwgY19pbnQsIGNfdWludCwgXApAQCAtODcsOCArODksOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlcywgWzEsIDIsIDMsIDQsIDVdKQogCiAgICAgZGVmIHRlc3RfY2xhc3NjYWNoZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBBUlJBWShjX2ludCwgMykgaXMgQVJSQVkoY19pbnQsIDQpKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoQVJSQVkoY19pbnQsIDMpIGlzIEFSUkFZKGNfaW50LCAzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChBUlJBWShjX2ludCwgMyksIEFSUkFZKGNfaW50LCA0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhBUlJBWShjX2ludCwgMyksIEFSUkFZKGNfaW50LCAzKSkKIAogICAgIGRlZiB0ZXN0X2Zyb21fYWRkcmVzcyhzZWxmKToKICAgICAgICAgIyBGYWlsZWQgd2l0aCAwLjkuOCwgcmVwb3J0ZWQgYnkgSlVybmVyCkBAIC0xMDEsMjAgKzEwMywxNiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6WzE6NDoyXSwgIm8iKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6LnZhbHVlLCAiZm9vIikKIAotICAgIHRyeToKLSAgICAgICAgY3JlYXRlX3VuaWNvZGVfYnVmZmVyCi0gICAgZXhjZXB0IE5hbWVFcnJvcjoKLSAgICAgICAgcGFzcwotICAgIGVsc2U6Ci0gICAgICAgIGRlZiB0ZXN0X2Zyb21fYWRkcmVzc1coc2VsZik6Ci0gICAgICAgICAgICBwID0gY3JlYXRlX3VuaWNvZGVfYnVmZmVyKCJmb28iKQotICAgICAgICAgICAgc3ogPSAoY193Y2hhciAqIDMpLmZyb21fYWRkcmVzcyhhZGRyZXNzb2YocCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6WzpdLCAiZm9vIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3pbOjpdLCAiZm9vIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3pbOjotMV0sICJvb2YiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzels6OjNdLCAiZiIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6WzE6NDoyXSwgIm8iKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzei52YWx1ZSwgImZvbyIpCisgICAgQG5lZWRfc3ltYm9sKCdjcmVhdGVfdW5pY29kZV9idWZmZXInKQorICAgIGRlZiB0ZXN0X2Zyb21fYWRkcmVzc1coc2VsZik6CisgICAgICAgIHAgPSBjcmVhdGVfdW5pY29kZV9idWZmZXIoImZvbyIpCisgICAgICAgIHN6ID0gKGNfd2NoYXIgKiAzKS5mcm9tX2FkZHJlc3MoYWRkcmVzc29mKHApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6WzpdLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzels6Ol0sICJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6Wzo6LTFdLCAib29mIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzels6OjNdLCAiZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3pbMTo0OjJdLCAibyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3oudmFsdWUsICJmb28iKQogCiAgICAgZGVmIHRlc3RfY2FjaGUoc2VsZik6CiAgICAgICAgICMgQXJyYXkgdHlwZXMgYXJlIGNhY2hlZCBpbnRlcm5hbGx5IGluIHRoZSBfY3R5cGVzIGV4dGVuc2lvbiwKQEAgLTEyOCw3ICsxMjYsNyBAQAogICAgICAgICAjIENyZWF0ZSBhIG5ldyBhcnJheSB0eXBlIGJhc2VkIG9uIGl0OgogICAgICAgICB0MSA9IG15X2ludCAqIDEKICAgICAgICAgdDIgPSBteV9pbnQgKiAxCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSBpcyB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh0MSwgdDIpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9hc19wYXJhbWV0ZXIucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9hc19wYXJhbWV0ZXIucHkKaW5kZXggYTYwM2E2NC4uZjJmZTEwYSAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYXNfcGFyYW1ldGVyLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2FzX3BhcmFtZXRlci5weQpAQCAtMSw1ICsxLDYgQEAKIGltcG9ydCB1bml0dGVzdAogZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2Zyb20gY3R5cGVzLnRlc3QgaW1wb3J0IG5lZWRfc3ltYm9sCiBpbXBvcnQgX2N0eXBlc190ZXN0CiAKIGRsbCA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQpAQCAtMTcsMTEgKzE4LDggQEAKICAgICBkZWYgd3JhcChzZWxmLCBwYXJhbSk6CiAgICAgICAgIHJldHVybiBwYXJhbQogCisgICAgQG5lZWRfc3ltYm9sKCdjX3djaGFyJykKICAgICBkZWYgdGVzdF93Y2hhcl9wYXJtKHNlbGYpOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBjX3djaGFyCi0gICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6Ci0gICAgICAgICAgICByZXR1cm4KICAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfaV9iaGlsZmQKICAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2J5dGUsIGNfd2NoYXIsIGNfaW50LCBjX2xvbmcsIGNfZmxvYXQsIGNfZG91YmxlXQogICAgICAgICByZXN1bHQgPSBmKHNlbGYud3JhcCgxKSwgc2VsZi53cmFwKHUieCIpLCBzZWxmLndyYXAoMyksIHNlbGYud3JhcCg0KSwgc2VsZi53cmFwKDUuMCksIHNlbGYud3JhcCg2LjApKQpAQCAtMTM0LDcgKzEzMiw3IEBACiAgICAgICAgIGYuYXJndHlwZXMgPSBbY19sb25nbG9uZywgTXlDYWxsYmFja10KIAogICAgICAgICBkZWYgY2FsbGJhY2sodmFsdWUpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodmFsdWUsIChpbnQsIGxvbmcpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh2YWx1ZSwgKGludCwgbG9uZykpCiAgICAgICAgICAgICByZXR1cm4gdmFsdWUgJiAweDdGRkZGRkZGCiAKICAgICAgICAgY2IgPSBNeUNhbGxiYWNrKGNhbGxiYWNrKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYml0ZmllbGRzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYml0ZmllbGRzLnB5CmluZGV4IGU5YzQ2YzIuLjk5MWRiZTggMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2JpdGZpZWxkcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9iaXRmaWVsZHMucHkKQEAgLTEsNCArMSw1IEBACiBmcm9tIGN0eXBlcyBpbXBvcnQgKgorZnJvbSBjdHlwZXMudGVzdCBpbXBvcnQgbmVlZF9zeW1ib2wKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IG9zCiAKQEAgLTEyNywyMCArMTI4LDE4IEBACiAgICAgICAgIHJlc3VsdCA9IHNlbGYuZmFpbF9maWVsZHMoKCJhIiwgY19jaGFyLCAxKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIChUeXBlRXJyb3IsICdiaXQgZmllbGRzIG5vdCBhbGxvd2VkIGZvciB0eXBlIGNfY2hhcicpKQogCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGNfd2NoYXIKLSAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZmFpbF9maWVsZHMoKCJhIiwgY193Y2hhciwgMSkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgKFR5cGVFcnJvciwgJ2JpdCBmaWVsZHMgbm90IGFsbG93ZWQgZm9yIHR5cGUgY193Y2hhcicpKQotCiAgICAgICAgIGNsYXNzIER1bW15KFN0cnVjdHVyZSk6CiAgICAgICAgICAgICBfZmllbGRzXyA9IFtdCiAKICAgICAgICAgcmVzdWx0ID0gc2VsZi5mYWlsX2ZpZWxkcygoImEiLCBEdW1teSwgMSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAoVHlwZUVycm9yLCAnYml0IGZpZWxkcyBub3QgYWxsb3dlZCBmb3IgdHlwZSBEdW1teScpKQogCisgICAgQG5lZWRfc3ltYm9sKCdjX3djaGFyJykKKyAgICBkZWYgdGVzdF9jX3djaGFyKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLmZhaWxfZmllbGRzKCgiYSIsIGNfd2NoYXIsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAoVHlwZUVycm9yLCAnYml0IGZpZWxkcyBub3QgYWxsb3dlZCBmb3IgdHlwZSBjX3djaGFyJykpCisKICAgICBkZWYgdGVzdF9zaW5nbGVfYml0ZmllbGRfc2l6ZShzZWxmKToKICAgICAgICAgZm9yIGNfdHlwIGluIGludF90eXBlczoKICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZmFpbF9maWVsZHMoKCJhIiwgY190eXAsIC0xKSkKQEAgLTIwNyw3ICsyMDYsNyBAQAogICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CiAgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2J5dGUsIDQpLAogICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19pbnQsIDMyKV0KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkqMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIGFsaWdubWVudChjX2ludCkrc2l6ZW9mKGNfaW50KSkKIAogICAgIGRlZiB0ZXN0X21peGVkXzMoc2VsZik6CiAgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKQEAgLTI0MCw1ICsyMzksMjUgQEAKICAgICAgICAgICAgIF9hbm9ueW1vdXNfID0gWyJfIl0KICAgICAgICAgICAgIF9maWVsZHNfID0gWygiXyIsIFgpXQogCisgICAgQG5lZWRfc3ltYm9sKCdjX3VpbnQzMicpCisgICAgZGVmIHRlc3RfdWludDMyKHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX3VpbnQzMiwgMzIpXQorICAgICAgICB4ID0gWCgpCisgICAgICAgIHguYSA9IDEwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5hLCAxMCkKKyAgICAgICAgeC5hID0gMHhGRENCQTk4NworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguYSwgMHhGRENCQTk4NykKKworICAgIEBuZWVkX3N5bWJvbCgnY191aW50NjQnKQorICAgIGRlZiB0ZXN0X3VpbnQ2NChzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY191aW50NjQsIDY0KV0KKyAgICAgICAgeCA9IFgoKQorICAgICAgICB4LmEgPSAxMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguYSwgMTApCisgICAgICAgIHguYSA9IDB4RkVEQ0JBOTg3NjU0MzIxMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguYSwgMHhGRURDQkE5ODc2NTQzMjExKQorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYnVmZmVycy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2J1ZmZlcnMucHkKaW5kZXggMTI5NDVlZC4uODhkODdlOSAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYnVmZmVycy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9idWZmZXJzLnB5CkBAIC0xLDQgKzEsNSBAQAogZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2Zyb20gY3R5cGVzLnRlc3QgaW1wb3J0IG5lZWRfc3ltYm9sCiBpbXBvcnQgdW5pdHRlc3QKIAogY2xhc3MgU3RyaW5nQnVmZmVyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtNywxMiArOCwxMiBAQAogICAgICAgICBiID0gY3JlYXRlX3N0cmluZ19idWZmZXIoMzIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGIpLCAzMikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoYiksIDMyICogc2l6ZW9mKGNfY2hhcikpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGJbMF0pIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGJbMF0pLCBzdHIpCiAKICAgICAgICAgYiA9IGNyZWF0ZV9zdHJpbmdfYnVmZmVyKCJhYmMiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihiKSwgNCkgIyB0cmFpbGluZyBudWwgY2hhcgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihiKSwgNCAqIHNpemVvZihjX2NoYXIpKQotICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShiWzBdKSBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShiWzBdKSwgc3RyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbMF0sICJhIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzpdLCAiYWJjXDAiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjpdLCAiYWJjXDAiKQpAQCAtMzYsMzkgKzM3LDM2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6OjJdLCAiYWMiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjo1XSwgImEiKQogCi0gICAgdHJ5OgotICAgICAgICBjX3djaGFyCi0gICAgZXhjZXB0IE5hbWVFcnJvcjoKLSAgICAgICAgcGFzcwotICAgIGVsc2U6Ci0gICAgICAgIGRlZiB0ZXN0X3VuaWNvZGVfYnVmZmVyKHNlbGYpOgotICAgICAgICAgICAgYiA9IGNyZWF0ZV91bmljb2RlX2J1ZmZlcigzMikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGIpLCAzMikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKGIpLCAzMiAqIHNpemVvZihjX3djaGFyKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGJbMF0pIGlzIHVuaWNvZGUpCisgICAgQG5lZWRfc3ltYm9sKCdjX3djaGFyJykKKyAgICBkZWYgdGVzdF91bmljb2RlX2J1ZmZlcihzZWxmKToKKyAgICAgICAgYiA9IGNyZWF0ZV91bmljb2RlX2J1ZmZlcigzMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYiksIDMyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihiKSwgMzIgKiBzaXplb2YoY193Y2hhcikpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShiWzBdKSwgdW5pY29kZSkKIAotICAgICAgICAgICAgYiA9IGNyZWF0ZV91bmljb2RlX2J1ZmZlcih1ImFiYyIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihiKSwgNCkgIyB0cmFpbGluZyBudWwgY2hhcgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoYiksIDQgKiBzaXplb2YoY193Y2hhcikpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShiWzBdKSBpcyB1bmljb2RlKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzBdLCB1ImEiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzpdLCAiYWJjXDAiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6XSwgImFiY1wwIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6Oi0xXSwgIlwwY2JhIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6OjJdLCAiYWMiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6NV0sICJhIikKKyAgICAgICAgYiA9IGNyZWF0ZV91bmljb2RlX2J1ZmZlcih1ImFiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGIpLCA0KSAjIHRyYWlsaW5nIG51bCBjaGFyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKGIpLCA0ICogc2l6ZW9mKGNfd2NoYXIpKQorICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoYlswXSksIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYlswXSwgdSJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzpdLCAiYWJjXDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjpdLCAiYWJjXDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjotMV0sICJcMGNiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6OjJdLCAiYWMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjo1XSwgImEiKQogCi0gICAgICAgIGRlZiB0ZXN0X3VuaWNvZGVfY29udmVyc2lvbihzZWxmKToKLSAgICAgICAgICAgIGIgPSBjcmVhdGVfdW5pY29kZV9idWZmZXIoImFiYyIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihiKSwgNCkgIyB0cmFpbGluZyBudWwgY2hhcgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoYiksIDQgKiBzaXplb2YoY193Y2hhcikpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShiWzBdKSBpcyB1bmljb2RlKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzBdLCB1ImEiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzpdLCAiYWJjXDAiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6XSwgImFiY1wwIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6Oi0xXSwgIlwwY2JhIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6OjJdLCAiYWMiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6NV0sICJhIikKKyAgICBAbmVlZF9zeW1ib2woJ2Nfd2NoYXInKQorICAgIGRlZiB0ZXN0X3VuaWNvZGVfY29udmVyc2lvbihzZWxmKToKKyAgICAgICAgYiA9IGNyZWF0ZV91bmljb2RlX2J1ZmZlcigiYWJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYiksIDQpICMgdHJhaWxpbmcgbnVsIGNoYXIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoYiksIDQgKiBzaXplb2YoY193Y2hhcikpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShiWzBdKSwgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzBdLCB1ImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOl0sICJhYmNcMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6Ol0sICJhYmNcMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6Oi0xXSwgIlwwY2JhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6Ml0sICJhYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6OjVdLCAiYSIpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9ieXRlc3dhcC5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2J5dGVzd2FwLnB5CmluZGV4IDRiZDc1Y2QuLmQzNjQwMmIgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2J5dGVzd2FwLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2J5dGVzd2FwLnB5CkBAIC0xNCw3ICsxNCw4IEBACiAjIEZvciBTdHJ1Y3R1cmVzIGFuZCBVbmlvbnMsIHRoZXNlIHR5cGVzIGFyZSBjcmVhdGVkIG9uIGRlbWFuZC4KIAogY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgZGVmIFhfdGVzdChzZWxmKToKKyAgICBAdW5pdHRlc3Quc2tpcCgndGVzdCBkaXNhYmxlZCcpCisgICAgZGVmIHRlc3RfWChzZWxmKToKICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIHN5cy5ieXRlb3JkZXIKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMzIpOgogICAgICAgICAgICAgYml0cyA9IEJJVFMoKQpAQCAtMjMsMTEgKzI0LDExIEBACiAKICAgICBkZWYgdGVzdF9lbmRpYW5fc2hvcnQoc2VsZik6CiAgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19zaG9ydC5fX2N0eXBlX2xlX18gaXMgY19zaG9ydCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3Nob3J0Ll9fY3R5cGVfYmVfXy5fX2N0eXBlX2xlX18gaXMgY19zaG9ydCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoY19zaG9ydC5fX2N0eXBlX2xlX18sIGNfc2hvcnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKGNfc2hvcnQuX19jdHlwZV9iZV9fLl9fY3R5cGVfbGVfXywgY19zaG9ydCkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3Nob3J0Ll9fY3R5cGVfYmVfXyBpcyBjX3Nob3J0KQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfc2hvcnQuX19jdHlwZV9sZV9fLl9fY3R5cGVfYmVfXyBpcyBjX3Nob3J0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhjX3Nob3J0Ll9fY3R5cGVfYmVfXywgY19zaG9ydCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoY19zaG9ydC5fX2N0eXBlX2xlX18uX19jdHlwZV9iZV9fLCBjX3Nob3J0KQogICAgICAgICBzID0gY19zaG9ydC5fX2N0eXBlX2JlX18oMHgxMjM0KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiPmgiLCAweDEyMzQpKSwgIjEyMzQiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzKSwgIjEyMzQiKQpAQCAtNTAsMTEgKzUxLDExIEBACiAKICAgICBkZWYgdGVzdF9lbmRpYW5faW50KHNlbGYpOgogICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICJsaXR0bGUiOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfaW50Ll9fY3R5cGVfbGVfXyBpcyBjX2ludCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2ludC5fX2N0eXBlX2JlX18uX19jdHlwZV9sZV9fIGlzIGNfaW50KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhjX2ludC5fX2N0eXBlX2xlX18sIGNfaW50KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhjX2ludC5fX2N0eXBlX2JlX18uX19jdHlwZV9sZV9fLCBjX2ludCkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2ludC5fX2N0eXBlX2JlX18gaXMgY19pbnQpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19pbnQuX19jdHlwZV9sZV9fLl9fY3R5cGVfYmVfXyBpcyBjX2ludCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoY19pbnQuX19jdHlwZV9iZV9fLCBjX2ludCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoY19pbnQuX19jdHlwZV9sZV9fLl9fY3R5cGVfYmVfXywgY19pbnQpCiAKICAgICAgICAgcyA9IGNfaW50Ll9fY3R5cGVfYmVfXygweDEyMzQ1Njc4KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiPmkiLCAweDEyMzQ1Njc4KSksICIxMjM0NTY3OCIpCkBAIC03OCwxMSArNzksMTEgQEAKIAogICAgIGRlZiB0ZXN0X2VuZGlhbl9sb25nbG9uZyhzZWxmKToKICAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2xvbmdsb25nLl9fY3R5cGVfbGVfXyBpcyBjX2xvbmdsb25nKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfbG9uZ2xvbmcuX19jdHlwZV9iZV9fLl9fY3R5cGVfbGVfXyBpcyBjX2xvbmdsb25nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhjX2xvbmdsb25nLl9fY3R5cGVfbGVfXywgY19sb25nbG9uZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoY19sb25nbG9uZy5fX2N0eXBlX2JlX18uX19jdHlwZV9sZV9fLCBjX2xvbmdsb25nKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfbG9uZ2xvbmcuX19jdHlwZV9iZV9fIGlzIGNfbG9uZ2xvbmcpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19sb25nbG9uZy5fX2N0eXBlX2xlX18uX19jdHlwZV9iZV9fIGlzIGNfbG9uZ2xvbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKGNfbG9uZ2xvbmcuX19jdHlwZV9iZV9fLCBjX2xvbmdsb25nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhjX2xvbmdsb25nLl9fY3R5cGVfbGVfXy5fX2N0eXBlX2JlX18sIGNfbG9uZ2xvbmcpCiAKICAgICAgICAgcyA9IGNfbG9uZ2xvbmcuX19jdHlwZV9iZV9fKDB4MTIzNDU2Nzg5MEFCQ0RFRikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oc3RydWN0LnBhY2soIj5xIiwgMHgxMjM0NTY3ODkwQUJDREVGKSksICIxMjM0NTY3ODkwQUJDREVGIikKQEAgLTEwNiwxMSArMTA3LDExIEBACiAKICAgICBkZWYgdGVzdF9lbmRpYW5fZmxvYXQoc2VsZik6CiAgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19mbG9hdC5fX2N0eXBlX2xlX18gaXMgY19mbG9hdCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2Zsb2F0Ll9fY3R5cGVfYmVfXy5fX2N0eXBlX2xlX18gaXMgY19mbG9hdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoY19mbG9hdC5fX2N0eXBlX2xlX18sIGNfZmxvYXQpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKGNfZmxvYXQuX19jdHlwZV9iZV9fLl9fY3R5cGVfbGVfXywgY19mbG9hdCkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2Zsb2F0Ll9fY3R5cGVfYmVfXyBpcyBjX2Zsb2F0KQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfZmxvYXQuX19jdHlwZV9sZV9fLl9fY3R5cGVfYmVfXyBpcyBjX2Zsb2F0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhjX2Zsb2F0Ll9fY3R5cGVfYmVfXywgY19mbG9hdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoY19mbG9hdC5fX2N0eXBlX2xlX18uX19jdHlwZV9iZV9fLCBjX2Zsb2F0KQogICAgICAgICBzID0gY19mbG9hdChtYXRoLnBpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiZiIsIG1hdGgucGkpKSwgYmluKHMpKQogICAgICAgICAjIEhtLCB3aGF0J3MgdGhlIHByZWNpc2lvbiBvZiBhIGZsb2F0IGNvbXBhcmVkIHRvIGEgZG91YmxlPwpAQCAtMTI0LDExICsxMjUsMTEgQEAKIAogICAgIGRlZiB0ZXN0X2VuZGlhbl9kb3VibGUoc2VsZik6CiAgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19kb3VibGUuX19jdHlwZV9sZV9fIGlzIGNfZG91YmxlKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfZG91YmxlLl9fY3R5cGVfYmVfXy5fX2N0eXBlX2xlX18gaXMgY19kb3VibGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKGNfZG91YmxlLl9fY3R5cGVfbGVfXywgY19kb3VibGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKGNfZG91YmxlLl9fY3R5cGVfYmVfXy5fX2N0eXBlX2xlX18sIGNfZG91YmxlKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfZG91YmxlLl9fY3R5cGVfYmVfXyBpcyBjX2RvdWJsZSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2RvdWJsZS5fX2N0eXBlX2xlX18uX19jdHlwZV9iZV9fIGlzIGNfZG91YmxlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhjX2RvdWJsZS5fX2N0eXBlX2JlX18sIGNfZG91YmxlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhjX2RvdWJsZS5fX2N0eXBlX2xlX18uX19jdHlwZV9iZV9fLCBjX2RvdWJsZSkKICAgICAgICAgcyA9IGNfZG91YmxlKG1hdGgucGkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy52YWx1ZSwgbWF0aC5waSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oc3RydWN0LnBhY2soImQiLCBtYXRoLnBpKSksIGJpbihzKSkKQEAgLTE0MCwxNCArMTQxLDE0IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHN0cnVjdC5wYWNrKCI+ZCIsIG1hdGgucGkpKSwgYmluKHMpKQogCiAgICAgZGVmIHRlc3RfZW5kaWFuX290aGVyKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydFRydWUoY19ieXRlLl9fY3R5cGVfbGVfXyBpcyBjX2J5dGUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2J5dGUuX19jdHlwZV9iZV9fIGlzIGNfYnl0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhjX2J5dGUuX19jdHlwZV9sZV9fLCBjX2J5dGUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoY19ieXRlLl9fY3R5cGVfYmVfXywgY19ieXRlKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3VieXRlLl9fY3R5cGVfbGVfXyBpcyBjX3VieXRlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoY191Ynl0ZS5fX2N0eXBlX2JlX18gaXMgY191Ynl0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhjX3VieXRlLl9fY3R5cGVfbGVfXywgY191Ynl0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhjX3VieXRlLl9fY3R5cGVfYmVfXywgY191Ynl0ZSkKIAotICAgICAgICBzZWxmLmFzc2VydFRydWUoY19jaGFyLl9fY3R5cGVfbGVfXyBpcyBjX2NoYXIpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2NoYXIuX19jdHlwZV9iZV9fIGlzIGNfY2hhcikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhjX2NoYXIuX19jdHlwZV9sZV9fLCBjX2NoYXIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoY19jaGFyLl9fY3R5cGVfYmVfXywgY19jaGFyKQogCiAgICAgZGVmIHRlc3Rfc3RydWN0X2ZpZWxkc18xKHNlbGYpOgogICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICJsaXR0bGUiOgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2FsbGJhY2tzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2FsbGJhY2tzLnB5CmluZGV4IGJlMGMxN2UuLmMyZTk1M2IgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2NhbGxiYWNrcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jYWxsYmFja3MucHkKQEAgLTEsNSArMSw2IEBACiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gY3R5cGVzIGltcG9ydCAqCitmcm9tIGN0eXBlcy50ZXN0IGltcG9ydCBuZWVkX3N5bWJvbAogaW1wb3J0IF9jdHlwZXNfdGVzdAogCiBjbGFzcyBDYWxsYmFja3ModW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtOTQsOSArOTUsMTAgQEAKICAgICAjIGRpc2FibGVkOiB3b3VsZCBub3cgKGNvcnJlY3RseSkgcmFpc2UgYSBSdW50aW1lV2FybmluZyBhYm91dAogICAgICMgYSBtZW1vcnkgbGVhay4gIEEgY2FsbGJhY2sgZnVuY3Rpb24gY2Fubm90IHJldHVybiBhIG5vbi1pbnRlZ3JhbAogICAgICMgQyB0eXBlIHdpdGhvdXQgY2F1c2luZyBhIG1lbW9yeSBsZWFrLgotIyMgICAgZGVmIHRlc3RfY2hhcl9wKHNlbGYpOgotIyMgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX2NoYXJfcCwgImFiYyIpCi0jIyAgICAgICAgc2VsZi5jaGVja190eXBlKGNfY2hhcl9wLCAiZGVmIikKKyAgICBAdW5pdHRlc3Quc2tpcCgndGVzdCBkaXNhYmxlZCcpCisgICAgZGVmIHRlc3RfY2hhcl9wKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY19jaGFyX3AsICJhYmMiKQorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY19jaGFyX3AsICJkZWYiKQogCiAgICAgZGVmIHRlc3RfcHlvYmplY3Qoc2VsZik6CiAgICAgICAgIG8gPSAoKQpAQCAtMTQ4LDEzICsxNTAsMTIgQEAKICAgICAgICAgQ0ZVTkNUWVBFKE5vbmUpKGxhbWJkYSB4PU5hc3R5KCk6IE5vbmUpCiAKIAotdHJ5OgotICAgIFdJTkZVTkNUWVBFCi1leGNlcHQgTmFtZUVycm9yOgotICAgIHBhc3MKLWVsc2U6Ci0gICAgY2xhc3MgU3RkY2FsbENhbGxiYWNrcyhDYWxsYmFja3MpOgorQG5lZWRfc3ltYm9sKCdXSU5GVU5DVFlQRScpCitjbGFzcyBTdGRjYWxsQ2FsbGJhY2tzKENhbGxiYWNrcyk6CisgICAgdHJ5OgogICAgICAgICBmdW5jdHlwZSA9IFdJTkZVTkNUWVBFCisgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgcGFzcwogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKQEAgLTE4NCw3ICsxODUsNyBAQAogICAgICAgICBmcm9tIGN0eXBlcy51dGlsIGltcG9ydCBmaW5kX2xpYnJhcnkKICAgICAgICAgbGliY19wYXRoID0gZmluZF9saWJyYXJ5KCJjIikKICAgICAgICAgaWYgbm90IGxpYmNfcGF0aDoKLSAgICAgICAgICAgIHJldHVybiAjIGNhbm5vdCB0ZXN0CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCdjb3VsZCBub3QgZmluZCBsaWJjJykKICAgICAgICAgbGliYyA9IENETEwobGliY19wYXRoKQogCiAgICAgICAgIEBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoY19pbnQpLCBQT0lOVEVSKGNfaW50KSkKQEAgLTE5NiwyMyArMTk3LDE5IEBACiAgICAgICAgIGxpYmMucXNvcnQoYXJyYXksIGxlbihhcnJheSksIHNpemVvZihjX2ludCksIGNtcF9mdW5jKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFycmF5WzpdLCBbMSwgNSwgNywgMzMsIDk5XSkKIAotICAgIHRyeToKLSAgICAgICAgV0lORlVOQ1RZUEUKLSAgICBleGNlcHQgTmFtZUVycm9yOgotICAgICAgICBwYXNzCi0gICAgZWxzZToKLSAgICAgICAgZGVmIHRlc3RfaXNzdWVfODk1OV9iKHNlbGYpOgotICAgICAgICAgICAgZnJvbSBjdHlwZXMud2ludHlwZXMgaW1wb3J0IEJPT0wsIEhXTkQsIExQQVJBTQorICAgIEBuZWVkX3N5bWJvbCgnV0lORlVOQ1RZUEUnKQorICAgIGRlZiB0ZXN0X2lzc3VlXzg5NTlfYihzZWxmKToKKyAgICAgICAgZnJvbSBjdHlwZXMud2ludHlwZXMgaW1wb3J0IEJPT0wsIEhXTkQsIExQQVJBTQorICAgICAgICBnbG9iYWwgd2luZG93Q291bnQKKyAgICAgICAgd2luZG93Q291bnQgPSAwCisKKyAgICAgICAgQFdJTkZVTkNUWVBFKEJPT0wsIEhXTkQsIExQQVJBTSkKKyAgICAgICAgZGVmIEVudW1XaW5kb3dzQ2FsbGJhY2tGdW5jKGh3bmQsIGxQYXJhbSk6CiAgICAgICAgICAgICBnbG9iYWwgd2luZG93Q291bnQKLSAgICAgICAgICAgIHdpbmRvd0NvdW50ID0gMAorICAgICAgICAgICAgd2luZG93Q291bnQgKz0gMQorICAgICAgICAgICAgcmV0dXJuIFRydWUgI0FsbG93IHdpbmRvd3MgdG8ga2VlcCBlbnVtZXJhdGluZwogCi0gICAgICAgICAgICBAV0lORlVOQ1RZUEUoQk9PTCwgSFdORCwgTFBBUkFNKQotICAgICAgICAgICAgZGVmIEVudW1XaW5kb3dzQ2FsbGJhY2tGdW5jKGh3bmQsIGxQYXJhbSk6Ci0gICAgICAgICAgICAgICAgZ2xvYmFsIHdpbmRvd0NvdW50Ci0gICAgICAgICAgICAgICAgd2luZG93Q291bnQgKz0gMQotICAgICAgICAgICAgICAgIHJldHVybiBUcnVlICNBbGxvdyB3aW5kb3dzIHRvIGtlZXAgZW51bWVyYXRpbmcKLQotICAgICAgICAgICAgd2luZGxsLnVzZXIzMi5FbnVtV2luZG93cyhFbnVtV2luZG93c0NhbGxiYWNrRnVuYywgMCkKKyAgICAgICAgd2luZGxsLnVzZXIzMi5FbnVtV2luZG93cyhFbnVtV2luZG93c0NhbGxiYWNrRnVuYywgMCkKIAogICAgIGRlZiB0ZXN0X2NhbGxiYWNrX3JlZ2lzdGVyX2ludChzZWxmKToKICAgICAgICAgIyBJc3N1ZSAjODI3NTogYnVnZ3kgaGFuZGxpbmcgb2YgY2FsbGJhY2sgYXJncyB1bmRlciBXaW42NApkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2FzdC5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Nhc3QucHkKaW5kZXggOTA2ZmZmYy4uZDI0ZTBiNSAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2FzdC5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jYXN0LnB5CkBAIC0xLDQgKzEsNSBAQAogZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2Zyb20gY3R5cGVzLnRlc3QgaW1wb3J0IG5lZWRfc3ltYm9sCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBzeXMKIApAQCAtMzgsMTQgKzM5LDE0IEBACiAKICAgICAgICAgcCA9IGNhc3QoYXJyYXksIFBPSU5URVIoY19jaGFyX3ApKQogICAgICAgICAjIGFycmF5IGFuZCBwIHNoYXJlIGEgY29tbW9uIF9vYmplY3RzIGF0dHJpYnV0ZQotICAgICAgICBzZWxmLmFzc2VydFRydWUocC5fb2JqZWN0cyBpcyBhcnJheS5fb2JqZWN0cykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhwLl9vYmplY3RzLCBhcnJheS5fb2JqZWN0cykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcnJheS5fb2JqZWN0cywgeycwJzogImZvbyBiYXIiLCBpZChhcnJheSk6IGFycmF5fSkKICAgICAgICAgcFswXSA9ICJzcGFtIHNwYW0iCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5fb2JqZWN0cywgeycwJzogInNwYW0gc3BhbSIsIGlkKGFycmF5KTogYXJyYXl9KQotICAgICAgICBzZWxmLmFzc2VydFRydWUoYXJyYXkuX29iamVjdHMgaXMgcC5fb2JqZWN0cykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhhcnJheS5fb2JqZWN0cywgcC5fb2JqZWN0cykKICAgICAgICAgcFsxXSA9ICJmb28gYmFyIgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuX29iamVjdHMsIHsnMSc6ICdmb28gYmFyJywgJzAnOiAic3BhbSBzcGFtIiwgaWQoYXJyYXkpOiBhcnJheX0pCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhcnJheS5fb2JqZWN0cyBpcyBwLl9vYmplY3RzKQorICAgICAgICBzZWxmLmFzc2VydElzKGFycmF5Ll9vYmplY3RzLCBwLl9vYmplY3RzKQogCiAgICAgZGVmIHRlc3Rfb3RoZXIoc2VsZik6CiAgICAgICAgIHAgPSBjYXN0KChjX2ludCAqIDQpKDEsIDIsIDMsIDQpLCBQT0lOVEVSKGNfaW50KSkKQEAgLTc1LDE1ICs3NiwxMSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhc3QoY2FzdChzLCBjX3ZvaWRfcCksIGNfY2hhcl9wKS52YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhpaG8iKQogCi0gICAgdHJ5OgotICAgICAgICBjX3djaGFyX3AKLSAgICBleGNlcHQgTmFtZUVycm9yOgotICAgICAgICBwYXNzCi0gICAgZWxzZToKLSAgICAgICAgZGVmIHRlc3Rfd2NoYXJfcChzZWxmKToKLSAgICAgICAgICAgIHMgPSBjX3djaGFyX3AoImhpaG8iKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYXN0KGNhc3QocywgY192b2lkX3ApLCBjX3djaGFyX3ApLnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhpaG8iKQorICAgIEBuZWVkX3N5bWJvbCgnY193Y2hhcl9wJykKKyAgICBkZWYgdGVzdF93Y2hhcl9wKHNlbGYpOgorICAgICAgICBzID0gY193Y2hhcl9wKCJoaWhvIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYXN0KGNhc3QocywgY192b2lkX3ApLCBjX3djaGFyX3ApLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGlobyIpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jZnVuY3MucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jZnVuY3MucHkKaW5kZXggNDkzY2JlOS4uNzY1NDA4YyAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2Z1bmNzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2NmdW5jcy5weQpAQCAtMyw2ICszLDcgQEAKIAogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIGN0eXBlcyBpbXBvcnQgKgorZnJvbSBjdHlwZXMudGVzdCBpbXBvcnQgbmVlZF9zeW1ib2wKIAogaW1wb3J0IF9jdHlwZXNfdGVzdAogCkBAIC0xODgsMTIgKzE4OSwxMiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50dl9pKC00MiksIE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5TKCksIC00MikKIAotIyBUaGUgZm9sbG93aW5nIHJlcGVhdGVzIHRoZSBhYm92ZSB0ZXN0cyB3aXRoIHN0ZGNhbGwgZnVuY3Rpb25zICh3aGVyZQorIyBUaGUgZm9sbG93aW5nIHJlcGVhdHMgdGhlIGFib3ZlIHRlc3RzIHdpdGggc3RkY2FsbCBmdW5jdGlvbnMgKHdoZXJlCiAjIHRoZXkgYXJlIGF2YWlsYWJsZSkKIHRyeToKICAgICBXaW5ETEwKIGV4Y2VwdCBOYW1lRXJyb3I6Ci0gICAgcGFzcworICAgIGRlZiBzdGRjYWxsX2RsbCgqXyk6IHBhc3MKIGVsc2U6CiAgICAgY2xhc3Mgc3RkY2FsbF9kbGwoV2luRExMKToKICAgICAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgpAQCAtMjAzLDkgKzIwNCw5IEBACiAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIGZ1bmMpCiAgICAgICAgICAgICByZXR1cm4gZnVuYwogCi0gICAgY2xhc3Mgc3RkY2FsbENGdW5jdGlvbnMoQ0Z1bmN0aW9ucyk6Ci0gICAgICAgIF9kbGwgPSBzdGRjYWxsX2RsbChfY3R5cGVzX3Rlc3QuX19maWxlX18pCi0gICAgICAgIHBhc3MKK0BuZWVkX3N5bWJvbCgnV2luRExMJykKK2NsYXNzIHN0ZGNhbGxDRnVuY3Rpb25zKENGdW5jdGlvbnMpOgorICAgIF9kbGwgPSBzdGRjYWxsX2RsbChfY3R5cGVzX3Rlc3QuX19maWxlX18pCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jaGVja3JldHZhbC5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2NoZWNrcmV0dmFsLnB5CmluZGV4IDAxY2NjNTcuLmEwZGM1MzQgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2NoZWNrcmV0dmFsLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2NoZWNrcmV0dmFsLnB5CkBAIC0xLDYgKzEsNyBAQAogaW1wb3J0IHVuaXR0ZXN0CiAKIGZyb20gY3R5cGVzIGltcG9ydCAqCitmcm9tIGN0eXBlcy50ZXN0IGltcG9ydCBuZWVkX3N5bWJvbAogCiBjbGFzcyBDSEVDS0VEKGNfaW50KToKICAgICBkZWYgX2NoZWNrX3JldHZhbF8odmFsdWUpOgpAQCAtMjUsMTUgKzI2LDExIEBACiAgICAgICAgIGRlbCBkbGwuX3Rlc3RmdW5jX3BfcC5yZXN0eXBlCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGRsbC5fdGVzdGZ1bmNfcF9wKDQyKSkKIAotICAgIHRyeToKLSAgICAgICAgb2xlZGxsCi0gICAgZXhjZXB0IE5hbWVFcnJvcjoKLSAgICAgICAgcGFzcwotICAgIGVsc2U6Ci0gICAgICAgIGRlZiB0ZXN0X29sZWRsbChzZWxmKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFdpbmRvd3NFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGVkbGwub2xlYXV0MzIuQ3JlYXRlVHlwZUxpYjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTm9uZSwgTm9uZSkKKyAgICBAbmVlZF9zeW1ib2woJ29sZWRsbCcpCisgICAgZGVmIHRlc3Rfb2xlZGxsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhXaW5kb3dzRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGVkbGwub2xlYXV0MzIuQ3JlYXRlVHlwZUxpYjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOb25lLCBOb25lKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZXJyY2hlY2sucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9lcnJjaGVjay5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ5MTNmOS4uMDAwMDAwMAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9lcnJjaGVjay5weQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLWltcG9ydCBzeXMKLWZyb20gY3R5cGVzIGltcG9ydCAqCi0KLSMjY2xhc3MgSE1PRFVMRShTdHJ1Y3R1cmUpOgotIyMgICAgX2ZpZWxkc18gPSBbKCJ2YWx1ZSIsIGNfdm9pZF9wKV0KLQotIyMgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgotIyMgICAgICAgIHJldHVybiAiPEhNT0RVTEUgJXM+IiAlIHNlbGYudmFsdWUKLQotIyN3aW5kbGwua2VybmVsMzIuR2V0TW9kdWxlSGFuZGxlQS5yZXN0eXBlID0gSE1PRFVMRQotCi0jI3ByaW50IHdpbmRsbC5rZXJuZWwzMi5HZXRNb2R1bGVIYW5kbGVBKCJweXRob24yMy5kbGwiKQotIyNwcmludCBoZXgoc3lzLmRsbGhhbmRsZSkKLQotIyNkZWYgbm9uemVybyhoYW5kbGUpOgotIyMgICAgcmV0dXJuIChHZXRMYXN0RXJyb3IoKSwgaGFuZGxlKQotCi0jI3dpbmRsbC5rZXJuZWwzMi5HZXRNb2R1bGVIYW5kbGVBLmVycmNoZWNrID0gbm9uemVybwotIyNwcmludCB3aW5kbGwua2VybmVsMzIuR2V0TW9kdWxlSGFuZGxlQSgic3BhbSIpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9maW5kLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZmluZC5weQppbmRleCA3N2U3ODlmLi5jNWY2YWNlIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9maW5kLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2ZpbmQucHkKQEAgLTEsNCArMSw1IEBACiBpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBvcwogaW1wb3J0IHN5cwogZnJvbSBjdHlwZXMgaW1wb3J0ICoKIGZyb20gY3R5cGVzLnV0aWwgaW1wb3J0IGZpbmRfbGlicmFyeQpAQCAtNDAsNDMgKzQxLDQzIEBACiAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgICAgICBwYXNzCiAKLSAgICBpZiBsaWJfZ2w6Ci0gICAgICAgIGRlZiB0ZXN0X2dsKHNlbGYpOgotICAgICAgICAgICAgaWYgc2VsZi5nbDoKLSAgICAgICAgICAgICAgICBzZWxmLmdsLmdsQ2xlYXJJbmRleAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGxpYl9nbCwgJ2xpYl9nbCBub3QgYXZhaWxhYmxlJykKKyAgICBkZWYgdGVzdF9nbChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5nbDoKKyAgICAgICAgICAgIHNlbGYuZ2wuZ2xDbGVhckluZGV4CiAKLSAgICBpZiBsaWJfZ2x1OgotICAgICAgICBkZWYgdGVzdF9nbHUoc2VsZik6Ci0gICAgICAgICAgICBpZiBzZWxmLmdsdToKLSAgICAgICAgICAgICAgICBzZWxmLmdsdS5nbHVCZWdpbkN1cnZlCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MobGliX2dsdSwgJ2xpYl9nbHUgbm90IGF2YWlsYWJsZScpCisgICAgZGVmIHRlc3RfZ2x1KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmdsdToKKyAgICAgICAgICAgIHNlbGYuZ2x1LmdsdUJlZ2luQ3VydmUKIAotICAgIGlmIGxpYl9nbGU6Ci0gICAgICAgIGRlZiB0ZXN0X2dsZShzZWxmKToKLSAgICAgICAgICAgIGlmIHNlbGYuZ2xlOgotICAgICAgICAgICAgICAgIHNlbGYuZ2xlLmdsZUdldEpvaW5TdHlsZQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGxpYl9nbGUsICdsaWJfZ2xlIG5vdCBhdmFpbGFibGUnKQorICAgIGRlZiB0ZXN0X2dsZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5nbGU6CisgICAgICAgICAgICBzZWxmLmdsZS5nbGVHZXRKb2luU3R5bGUKIAotIyNpZiBvcy5uYW1lID09ICJwb3NpeCIgYW5kIHN5cy5wbGF0Zm9ybSAhPSAiZGFyd2luIjoKLQotIyMgICAgIyBPbiBwbGF0Zm9ybXMgd2hlcmUgdGhlIGRlZmF1bHQgc2hhcmVkIGxpYnJhcnkgc3VmZml4IGlzICcuc28nLAotIyMgICAgIyBhdCBsZWFzdCBzb21lIGxpYnJhcmllcyBjYW4gYmUgbG9hZGVkIGFzIGF0dHJpYnV0ZXMgb2YgdGhlIGNkbGwKLSMjICAgICMgb2JqZWN0LCBzaW5jZSBjdHlwZXMgbm93IHRyaWVzIGxvYWRpbmcgdGhlIGxpYiBhZ2FpbgotIyMgICAgIyB3aXRoICcuc28nIGFwcGVuZGVkIG9mIHRoZSBmaXJzdCB0cnkgZmFpbHMuCi0jIyAgICAjCi0jIyAgICAjIFdvbid0IHdvcmsgZm9yIGxpYmMsIHVuZm9ydHVuYXRlbHkuICBPVE9ILCBpdCBpc24ndAotIyMgICAgIyBuZWVkZWQgZm9yIGxpYmMgc2luY2UgdGhpcyBpcyBhbHJlYWR5IG1hcHBlZCBpbnRvIHRoZSBjdXJyZW50Ci0jIyAgICAjIHByb2Nlc3MgKD8pCi0jIyAgICAjCi0jIyAgICAjIE9uIE1BQyBPU1gsIGl0IHdvbid0IHdvcmsgZWl0aGVyLCBiZWNhdXNlIGRsb3BlbigpIG5lZWRzIGEgZnVsbCBwYXRoLAotIyMgICAgIyBhbmQgdGhlIGRlZmF1bHQgc3VmZml4IGlzIGVpdGhlciBub25lIG9yICcuZHlsaWInLgotCi0jIyAgICBjbGFzcyBMb2FkTGlicyh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0jIyAgICAgICAgZGVmIHRlc3RfbGlibShzZWxmKToKLSMjICAgICAgICAgICAgaW1wb3J0IG1hdGgKLSMjICAgICAgICAgICAgbGlibSA9IGNkbGwubGlibQotIyMgICAgICAgICAgICBzcXJ0ID0gbGlibS5zcXJ0Ci0jIyAgICAgICAgICAgIHNxcnQuYXJndHlwZXMgPSAoY19kb3VibGUsKQotIyMgICAgICAgICAgICBzcXJ0LnJlc3R5cGUgPSBjX2RvdWJsZQotIyMgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNxcnQoMiksIG1hdGguc3FydCgyKSkKKyMgT24gcGxhdGZvcm1zIHdoZXJlIHRoZSBkZWZhdWx0IHNoYXJlZCBsaWJyYXJ5IHN1ZmZpeCBpcyAnLnNvJywKKyMgYXQgbGVhc3Qgc29tZSBsaWJyYXJpZXMgY2FuIGJlIGxvYWRlZCBhcyBhdHRyaWJ1dGVzIG9mIHRoZSBjZGxsCisjIG9iamVjdCwgc2luY2UgY3R5cGVzIG5vdyB0cmllcyBsb2FkaW5nIHRoZSBsaWIgYWdhaW4KKyMgd2l0aCAnLnNvJyBhcHBlbmRlZCBvZiB0aGUgZmlyc3QgdHJ5IGZhaWxzLgorIworIyBXb24ndCB3b3JrIGZvciBsaWJjLCB1bmZvcnR1bmF0ZWx5LiAgT1RPSCwgaXQgaXNuJ3QKKyMgbmVlZGVkIGZvciBsaWJjIHNpbmNlIHRoaXMgaXMgYWxyZWFkeSBtYXBwZWQgaW50byB0aGUgY3VycmVudAorIyBwcm9jZXNzICg/KQorIworIyBPbiBNQUMgT1NYLCBpdCB3b24ndCB3b3JrIGVpdGhlciwgYmVjYXVzZSBkbG9wZW4oKSBuZWVkcyBhIGZ1bGwgcGF0aCwKKyMgYW5kIHRoZSBkZWZhdWx0IHN1ZmZpeCBpcyBlaXRoZXIgbm9uZSBvciAnLmR5bGliJy4KK0B1bml0dGVzdC5za2lwKCd0ZXN0IGRpc2FibGVkJykKK0B1bml0dGVzdC5za2lwVW5sZXNzKG9zLm5hbWU9PSJwb3NpeCIgYW5kIHN5cy5wbGF0Zm9ybSAhPSAiZGFyd2luIiwKKyAgICAgICAgICAgICAgICAgICAgICd0ZXN0IG5vdCBzdWl0YWJsZSBmb3IgdGhpcyBwbGF0Zm9ybScpCitjbGFzcyBMb2FkTGlicyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfbGlibShzZWxmKToKKyAgICAgICAgaW1wb3J0IG1hdGgKKyAgICAgICAgbGlibSA9IGNkbGwubGlibQorICAgICAgICBzcXJ0ID0gbGlibS5zcXJ0CisgICAgICAgIHNxcnQuYXJndHlwZXMgPSAoY19kb3VibGUsKQorICAgICAgICBzcXJ0LnJlc3R5cGUgPSBjX2RvdWJsZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNxcnQoMiksIG1hdGguc3FydCgyKSkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Zyb21idWZmZXIucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9mcm9tYnVmZmVyLnB5CmluZGV4IDYyNGZiNzAuLjlmNGJiMjggMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Zyb21idWZmZXIucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZnJvbWJ1ZmZlci5weQpAQCAtMjMsNyArMjMsNyBAQAogICAgICAgICBhWzBdLCBhWy0xXSA9IDIwMCwgLTIwMAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHhbOl0sIGEudG9saXN0KCkpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaW4geC5fb2JqZWN0cy52YWx1ZXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihhLCB4Ll9vYmplY3RzLnZhbHVlcygpKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfaW50LmZyb21fYnVmZmVyLCBhLCAtMSkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Z1bmNwdHIucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jcHRyLnB5CmluZGV4IDk5YWY1ZWQuLjU4Y2JiNDcgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Z1bmNwdHIucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3B0ci5weQpAQCAtNzUsNyArNzUsNyBAQAogICAgICAgICAjIyAgICAgICAgICAgICAgICAgICJscGZuV25kUHJvYyIsIFdORFBST0NfMih3bmRwcm9jKSkKICAgICAgICAgIyBpbnN0ZWFkOgogCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShXTkRQUk9DIGlzIFdORFBST0NfMikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhXTkRQUk9DLCBXTkRQUk9DXzIpCiAgICAgICAgICMgJ3duZGNsYXNzLmxwZm5XbmRQcm9jJyBsZWFrcyA5NCByZWZlcmVuY2VzLiAgV2h5PwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHduZGNsYXNzLmxwZm5XbmRQcm9jKDEsIDIsIDMsIDQpLCAxMCkKIApkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3Rpb25zLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3Rpb25zLnB5CmluZGV4IDhlODk4YTguLmEzNzQ0MTUgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Z1bmN0aW9ucy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jdGlvbnMucHkKQEAgLTYsNiArNiw3IEBACiAiIiIKIAogZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2Zyb20gY3R5cGVzLnRlc3QgaW1wb3J0IG5lZWRfc3ltYm9sCiBpbXBvcnQgc3lzLCB1bml0dGVzdAogCiB0cnk6CkBAIC02MywyMiArNjQsMTYgQEAKICAgICAgICAgICAgIHBhc3MKIAogCisgICAgQG5lZWRfc3ltYm9sKCdjX3djaGFyJykKICAgICBkZWYgdGVzdF93Y2hhcl9wYXJtKHNlbGYpOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBjX3djaGFyCi0gICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6Ci0gICAgICAgICAgICByZXR1cm4KICAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfaV9iaGlsZmQKICAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2J5dGUsIGNfd2NoYXIsIGNfaW50LCBjX2xvbmcsIGNfZmxvYXQsIGNfZG91YmxlXQogICAgICAgICByZXN1bHQgPSBmKDEsIHUieCIsIDMsIDQsIDUuMCwgNi4wKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgMTM5KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocmVzdWx0KSwgaW50KQogCisgICAgQG5lZWRfc3ltYm9sKCdjX3djaGFyJykKICAgICBkZWYgdGVzdF93Y2hhcl9yZXN1bHQoc2VsZik6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGNfd2NoYXIKLSAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKLSAgICAgICAgICAgIHJldHVybgogICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19pX2JoaWxmZAogICAgICAgICBmLmFyZ3R5cGVzID0gW2NfYnl0ZSwgY19zaG9ydCwgY19pbnQsIGNfbG9uZywgY19mbG9hdCwgY19kb3VibGVdCiAgICAgICAgIGYucmVzdHlwZSA9IGNfd2NoYXIKQEAgLTE1NSwxMSArMTUwLDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIC0yMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJlc3VsdCksIGZsb2F0KQogCisgICAgQG5lZWRfc3ltYm9sKCdjX2xvbmdsb25nJykKICAgICBkZWYgdGVzdF9sb25nbG9uZ3Jlc3VsdChzZWxmKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgY19sb25nbG9uZwotICAgICAgICBleGNlcHQgTmFtZUVycm9yOgotICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX3FfYmhpbGZkCiAgICAgICAgIGYucmVzdHlwZSA9IGNfbG9uZ2xvbmcKICAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2J5dGUsIGNfc2hvcnQsIGNfaW50LCBjX2xvbmcsIGNfZmxvYXQsIGNfZG91YmxlXQpAQCAtMjk2LDYgKzI4OCw3IEBACiAgICAgICAgIHJlc3VsdCA9IGYoLTEwLCBjYikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIC0xOCkKIAorICAgIEBuZWVkX3N5bWJvbCgnY19sb25nbG9uZycpCiAgICAgZGVmIHRlc3RfbG9uZ2xvbmdfY2FsbGJhY2tzKHNlbGYpOgogCiAgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX2NhbGxiYWNrX3FfcWYKQEAgLTMwNiw3ICsyOTksNyBAQAogICAgICAgICBmLmFyZ3R5cGVzID0gW2NfbG9uZ2xvbmcsIE15Q2FsbGJhY2tdCiAKICAgICAgICAgZGVmIGNhbGxiYWNrKHZhbHVlKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHZhbHVlLCAoaW50LCBsb25nKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UodmFsdWUsIChpbnQsIGxvbmcpKQogICAgICAgICAgICAgcmV0dXJuIHZhbHVlICYgMHg3RkZGRkZGRgogCiAgICAgICAgIGNiID0gTXlDYWxsYmFjayhjYWxsYmFjaykKQEAgLTM0OCwxNiArMzQxLDE2IEBACiAgICAgICAgIHMyaCA9IGRsbC5yZXRfMmhfZnVuYyhpbnApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHMyaC54LCBzMmgueSksICg5OSoyLCA4OCozKSkKIAotICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgotICAgICAgICBkZWYgdGVzdF9zdHJ1Y3RfcmV0dXJuXzJIX3N0ZGNhbGwoc2VsZik6Ci0gICAgICAgICAgICBjbGFzcyBTMkgoU3RydWN0dXJlKToKLSAgICAgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX3Nob3J0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInkiLCBjX3Nob3J0KV0KKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwgJ1dpbmRvd3Mtc3BlY2lmaWMgdGVzdCcpCisgICAgZGVmIHRlc3Rfc3RydWN0X3JldHVybl8ySF9zdGRjYWxsKHNlbGYpOgorICAgICAgICBjbGFzcyBTMkgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIGNfc2hvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJ5IiwgY19zaG9ydCldCiAKLSAgICAgICAgICAgIHdpbmRsbC5zX3JldF8yaF9mdW5jLnJlc3R5cGUgPSBTMkgKLSAgICAgICAgICAgIHdpbmRsbC5zX3JldF8yaF9mdW5jLmFyZ3R5cGVzID0gW1MySF0KLSAgICAgICAgICAgIHMyaCA9IHdpbmRsbC5zX3JldF8yaF9mdW5jKFMySCg5OSwgODgpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoczJoLngsIHMyaC55KSwgKDk5KjIsIDg4KjMpKQorICAgICAgICB3aW5kbGwuc19yZXRfMmhfZnVuYy5yZXN0eXBlID0gUzJICisgICAgICAgIHdpbmRsbC5zX3JldF8yaF9mdW5jLmFyZ3R5cGVzID0gW1MySF0KKyAgICAgICAgczJoID0gd2luZGxsLnNfcmV0XzJoX2Z1bmMoUzJIKDk5LCA4OCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHMyaC54LCBzMmgueSksICg5OSoyLCA4OCozKSkKIAogICAgIGRlZiB0ZXN0X3N0cnVjdF9yZXR1cm5fOEgoc2VsZik6CiAgICAgICAgIGNsYXNzIFM4SShTdHJ1Y3R1cmUpOgpAQCAtMzc2LDIzICszNjksMjQgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoczhpLmEsIHM4aS5iLCBzOGkuYywgczhpLmQsIHM4aS5lLCBzOGkuZiwgczhpLmcsIHM4aS5oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDkqMiwgOCozLCA3KjQsIDYqNSwgNSo2LCA0KjcsIDMqOCwgMio5KSkKIAotICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgotICAgICAgICBkZWYgdGVzdF9zdHJ1Y3RfcmV0dXJuXzhIX3N0ZGNhbGwoc2VsZik6Ci0gICAgICAgICAgICBjbGFzcyBTOEkoU3RydWN0dXJlKToKLSAgICAgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2ludCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19pbnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiYyIsIGNfaW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImQiLCBjX2ludCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJlIiwgY19pbnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZiIsIGNfaW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImciLCBjX2ludCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJoIiwgY19pbnQpXQotICAgICAgICAgICAgd2luZGxsLnNfcmV0XzhpX2Z1bmMucmVzdHlwZSA9IFM4SQotICAgICAgICAgICAgd2luZGxsLnNfcmV0XzhpX2Z1bmMuYXJndHlwZXMgPSBbUzhJXQotICAgICAgICAgICAgaW5wID0gUzhJKDksIDgsIDcsIDYsIDUsIDQsIDMsIDIpCi0gICAgICAgICAgICBzOGkgPSB3aW5kbGwuc19yZXRfOGlfZnVuYyhpbnApCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChzOGkuYSwgczhpLmIsIHM4aS5jLCBzOGkuZCwgczhpLmUsIHM4aS5mLCBzOGkuZywgczhpLmgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDkqMiwgOCozLCA3KjQsIDYqNSwgNSo2LCA0KjcsIDMqOCwgMio5KSkKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwgJ1dpbmRvd3Mtc3BlY2lmaWMgdGVzdCcpCisgICAgZGVmIHRlc3Rfc3RydWN0X3JldHVybl84SF9zdGRjYWxsKHNlbGYpOgorICAgICAgICBjbGFzcyBTOEkoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYyIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiZCIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiZSIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiZiIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiZyIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiaCIsIGNfaW50KV0KKyAgICAgICAgd2luZGxsLnNfcmV0XzhpX2Z1bmMucmVzdHlwZSA9IFM4SQorICAgICAgICB3aW5kbGwuc19yZXRfOGlfZnVuYy5hcmd0eXBlcyA9IFtTOEldCisgICAgICAgIGlucCA9IFM4SSg5LCA4LCA3LCA2LCA1LCA0LCAzLCAyKQorICAgICAgICBzOGkgPSB3aW5kbGwuc19yZXRfOGlfZnVuYyhpbnApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgKHM4aS5hLCBzOGkuYiwgczhpLmMsIHM4aS5kLCBzOGkuZSwgczhpLmYsIHM4aS5nLCBzOGkuaCksCisgICAgICAgICAgICAgICAgKDkqMiwgOCozLCA3KjQsIDYqNSwgNSo2LCA0KjcsIDMqOCwgMio5KSkKIAogICAgIGRlZiB0ZXN0X3NmMTY1MTIzNShzZWxmKToKICAgICAgICAgIyBzZWUgaHR0cDovL3d3dy5weXRob24ub3JnL3NmLzE2NTEyMzUKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2ludGVnZXJzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfaW50ZWdlcnMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNjQ1M2EuLjAwMDAwMDAKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfaW50ZWdlcnMucHkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMgc3VwZXJzZWVkZWQgYnkgdGVzdF9udW1iZXJzLnB5Ci1pbXBvcnQgdW5pdHRlc3QKLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfa2VlcHJlZnMucHkKaW5kZXggYjUwNGMwYy4uYjJhNTBhYiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfa2VlcHJlZnMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfa2VlcHJlZnMucHkKQEAgLTk0LDcgKzk0LDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9vYmplY3RzLCB7JzEnOiBpfSkKIAogY2xhc3MgRGVsZXRlUG9pbnRlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBkZWYgWF90ZXN0KHNlbGYpOgorICAgIEB1bml0dGVzdC5za2lwKCd0ZXN0IGRpc2FibGVkJykKKyAgICBkZWYgdGVzdF9YKHNlbGYpOgogICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CiAgICAgICAgICAgICBfZmllbGRzXyA9IFsoInAiLCBQT0lOVEVSKGNfY2hhcl9wKSldCiAgICAgICAgIHggPSBYKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xvYWRpbmcucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9sb2FkaW5nLnB5CmluZGV4IDI2NjgzZDguLjgxYTI3ZTMgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xvYWRpbmcucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbG9hZGluZy5weQpAQCAtMjEsMTggKzIxLDIxIEBACiAKICAgICB1bmtub3duZGxsID0gInh4cmFuZG9tbmFtZXh4IgogCi0gICAgaWYgbGliY19uYW1lIGlzIG5vdCBOb25lOgotICAgICAgICBkZWYgdGVzdF9sb2FkKHNlbGYpOgotICAgICAgICAgICAgQ0RMTChsaWJjX25hbWUpCi0gICAgICAgICAgICBDRExMKG9zLnBhdGguYmFzZW5hbWUobGliY19uYW1lKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIENETEwsIHNlbGYudW5rbm93bmRsbCkKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhsaWJjX25hbWUgaXMgbm90IE5vbmUsICdjb3VsZCBub3QgZmluZCBsaWJjJykKKyAgICBkZWYgdGVzdF9sb2FkKHNlbGYpOgorICAgICAgICBDRExMKGxpYmNfbmFtZSkKKyAgICAgICAgQ0RMTChvcy5wYXRoLmJhc2VuYW1lKGxpYmNfbmFtZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIENETEwsIHNlbGYudW5rbm93bmRsbCkKIAotICAgIGlmIGxpYmNfbmFtZSBpcyBub3QgTm9uZSBhbmQgb3MucGF0aC5iYXNlbmFtZShsaWJjX25hbWUpID09ICJsaWJjLnNvLjYiOgotICAgICAgICBkZWYgdGVzdF9sb2FkX3ZlcnNpb24oc2VsZik6Ci0gICAgICAgICAgICBjZGxsLkxvYWRMaWJyYXJ5KCJsaWJjLnNvLjYiKQotICAgICAgICAgICAgIyBsaW51eCB1c2VzIHZlcnNpb24sIGxpYmMgOSBzaG91bGQgbm90IGV4aXN0Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBjZGxsLkxvYWRMaWJyYXJ5LCAibGliYy5zby45IikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIGNkbGwuTG9hZExpYnJhcnksIHNlbGYudW5rbm93bmRsbCkKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhsaWJjX25hbWUgaXMgbm90IE5vbmUsICdjb3VsZCBub3QgZmluZCBsaWJjJykKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhsaWJjX25hbWUgaXMgbm90IE5vbmUgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShsaWJjX25hbWUpID09ICJsaWJjLnNvLjYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICd3cm9uZyBsaWJjIHBhdGggZm9yIHRlc3QnKQorICAgIGRlZiB0ZXN0X2xvYWRfdmVyc2lvbihzZWxmKToKKyAgICAgICAgY2RsbC5Mb2FkTGlicmFyeSgibGliYy5zby42IikKKyAgICAgICAgIyBsaW51eCB1c2VzIHZlcnNpb24sIGxpYmMgOSBzaG91bGQgbm90IGV4aXN0CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIGNkbGwuTG9hZExpYnJhcnksICJsaWJjLnNvLjkiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBjZGxsLkxvYWRMaWJyYXJ5LCBzZWxmLnVua25vd25kbGwpCiAKICAgICBkZWYgdGVzdF9maW5kKHNlbGYpOgogICAgICAgICBmb3IgbmFtZSBpbiAoImMiLCAibSIpOgpAQCAtNDEsNjYgKzQ0LDcxIEBACiAgICAgICAgICAgICAgICAgY2RsbC5Mb2FkTGlicmFyeShsaWIpCiAgICAgICAgICAgICAgICAgQ0RMTChsaWIpCiAKLSAgICBpZiBvcy5uYW1lIGluICgibnQiLCAiY2UiKToKLSAgICAgICAgZGVmIHRlc3RfbG9hZF9saWJyYXJ5KHNlbGYpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsaWJjX25hbWUgaXMgTm9uZSkKLSAgICAgICAgICAgIGlmIGlzX3Jlc291cmNlX2VuYWJsZWQoInByaW50aW5nIik6Ci0gICAgICAgICAgICAgICAgcHJpbnQgZmluZF9saWJyYXJ5KCJrZXJuZWwzMiIpCi0gICAgICAgICAgICAgICAgcHJpbnQgZmluZF9saWJyYXJ5KCJ1c2VyMzIiKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKG9zLm5hbWUgaW4gKCJudCIsICJjZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0IHNwZWNpZmljIHRvIFdpbmRvd3MgKE5UL0NFKScpCisgICAgZGVmIHRlc3RfbG9hZF9saWJyYXJ5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZShsaWJjX25hbWUpCisgICAgICAgIGlmIGlzX3Jlc291cmNlX2VuYWJsZWQoInByaW50aW5nIik6CisgICAgICAgICAgICBwcmludCBmaW5kX2xpYnJhcnkoImtlcm5lbDMyIikKKyAgICAgICAgICAgIHByaW50IGZpbmRfbGlicmFyeSgidXNlcjMyIikKIAotICAgICAgICAgICAgaWYgb3MubmFtZSA9PSAibnQiOgotICAgICAgICAgICAgICAgIHdpbmRsbC5rZXJuZWwzMi5HZXRNb2R1bGVIYW5kbGVXCi0gICAgICAgICAgICAgICAgd2luZGxsWyJrZXJuZWwzMiJdLkdldE1vZHVsZUhhbmRsZVcKLSAgICAgICAgICAgICAgICB3aW5kbGwuTG9hZExpYnJhcnkoImtlcm5lbDMyIikuR2V0TW9kdWxlSGFuZGxlVwotICAgICAgICAgICAgICAgIFdpbkRMTCgia2VybmVsMzIiKS5HZXRNb2R1bGVIYW5kbGVXCi0gICAgICAgICAgICBlbGlmIG9zLm5hbWUgPT0gImNlIjoKLSAgICAgICAgICAgICAgICB3aW5kbGwuY29yZWRsbC5HZXRNb2R1bGVIYW5kbGVXCi0gICAgICAgICAgICAgICAgd2luZGxsWyJjb3JlZGxsIl0uR2V0TW9kdWxlSGFuZGxlVwotICAgICAgICAgICAgICAgIHdpbmRsbC5Mb2FkTGlicmFyeSgiY29yZWRsbCIpLkdldE1vZHVsZUhhbmRsZVcKLSAgICAgICAgICAgICAgICBXaW5ETEwoImNvcmVkbGwiKS5HZXRNb2R1bGVIYW5kbGVXCisgICAgICAgIGlmIG9zLm5hbWUgPT0gIm50IjoKKyAgICAgICAgICAgIHdpbmRsbC5rZXJuZWwzMi5HZXRNb2R1bGVIYW5kbGVXCisgICAgICAgICAgICB3aW5kbGxbImtlcm5lbDMyIl0uR2V0TW9kdWxlSGFuZGxlVworICAgICAgICAgICAgd2luZGxsLkxvYWRMaWJyYXJ5KCJrZXJuZWwzMiIpLkdldE1vZHVsZUhhbmRsZVcKKyAgICAgICAgICAgIFdpbkRMTCgia2VybmVsMzIiKS5HZXRNb2R1bGVIYW5kbGVXCisgICAgICAgIGVsaWYgb3MubmFtZSA9PSAiY2UiOgorICAgICAgICAgICAgd2luZGxsLmNvcmVkbGwuR2V0TW9kdWxlSGFuZGxlVworICAgICAgICAgICAgd2luZGxsWyJjb3JlZGxsIl0uR2V0TW9kdWxlSGFuZGxlVworICAgICAgICAgICAgd2luZGxsLkxvYWRMaWJyYXJ5KCJjb3JlZGxsIikuR2V0TW9kdWxlSGFuZGxlVworICAgICAgICAgICAgV2luRExMKCJjb3JlZGxsIikuR2V0TW9kdWxlSGFuZGxlVwogCi0gICAgICAgIGRlZiB0ZXN0X2xvYWRfb3JkaW5hbF9mdW5jdGlvbnMoc2VsZik6Ci0gICAgICAgICAgICBpbXBvcnQgX2N0eXBlc190ZXN0Ci0gICAgICAgICAgICBkbGwgPSBXaW5ETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQotICAgICAgICAgICAgIyBXZSBsb2FkIHRoZSBzYW1lIGZ1bmN0aW9uIGJvdGggdmlhIG9yZGluYWwgYW5kIG5hbWUKLSAgICAgICAgICAgIGZ1bmNfb3JkID0gZGxsWzJdCi0gICAgICAgICAgICBmdW5jX25hbWUgPSBkbGwuR2V0U3RyaW5nCi0gICAgICAgICAgICAjIGFkZHJlc3NvZiBnZXRzIHRoZSBhZGRyZXNzIHdoZXJlIHRoZSBmdW5jdGlvbiBwb2ludGVyIGlzIHN0b3JlZAotICAgICAgICAgICAgYV9vcmQgPSBhZGRyZXNzb2YoZnVuY19vcmQpCi0gICAgICAgICAgICBhX25hbWUgPSBhZGRyZXNzb2YoZnVuY19uYW1lKQotICAgICAgICAgICAgZl9vcmRfYWRkciA9IGNfdm9pZF9wLmZyb21fYWRkcmVzcyhhX29yZCkudmFsdWUKLSAgICAgICAgICAgIGZfbmFtZV9hZGRyID0gY192b2lkX3AuZnJvbV9hZGRyZXNzKGFfbmFtZSkudmFsdWUKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGV4KGZfb3JkX2FkZHIpLCBoZXgoZl9uYW1lX2FkZHIpKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKG9zLm5hbWUgaW4gKCJudCIsICJjZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0IHNwZWNpZmljIHRvIFdpbmRvd3MgKE5UL0NFKScpCisgICAgZGVmIHRlc3RfbG9hZF9vcmRpbmFsX2Z1bmN0aW9ucyhzZWxmKToKKyAgICAgICAgaW1wb3J0IF9jdHlwZXNfdGVzdAorICAgICAgICBkbGwgPSBXaW5ETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICAjIFdlIGxvYWQgdGhlIHNhbWUgZnVuY3Rpb24gYm90aCB2aWEgb3JkaW5hbCBhbmQgbmFtZQorICAgICAgICBmdW5jX29yZCA9IGRsbFsyXQorICAgICAgICBmdW5jX25hbWUgPSBkbGwuR2V0U3RyaW5nCisgICAgICAgICMgYWRkcmVzc29mIGdldHMgdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgaXMgc3RvcmVkCisgICAgICAgIGFfb3JkID0gYWRkcmVzc29mKGZ1bmNfb3JkKQorICAgICAgICBhX25hbWUgPSBhZGRyZXNzb2YoZnVuY19uYW1lKQorICAgICAgICBmX29yZF9hZGRyID0gY192b2lkX3AuZnJvbV9hZGRyZXNzKGFfb3JkKS52YWx1ZQorICAgICAgICBmX25hbWVfYWRkciA9IGNfdm9pZF9wLmZyb21fYWRkcmVzcyhhX25hbWUpLnZhbHVlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGV4KGZfb3JkX2FkZHIpLCBoZXgoZl9uYW1lX2FkZHIpKQogCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZGxsLl9fZ2V0aXRlbV9fLCAxMjM0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZGxsLl9fZ2V0aXRlbV9fLCAxMjM0KQogCi0gICAgaWYgb3MubmFtZSA9PSAibnQiOgotICAgICAgICBkZWYgdGVzdF8xNzAzMjg2X0Eoc2VsZik6Ci0gICAgICAgICAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IExvYWRMaWJyYXJ5LCBGcmVlTGlicmFyeQotICAgICAgICAgICAgIyBPbiB3aW5YUCA2NC1iaXQsIGFkdmFwaTMyIGxvYWRzIGF0IGFuIGFkZHJlc3MgdGhhdCBkb2VzCi0gICAgICAgICAgICAjIE5PVCBmaXQgaW50byBhIDMyLWJpdCBpbnRlZ2VyLiAgRnJlZUxpYnJhcnkgbXVzdCBiZSBhYmxlCi0gICAgICAgICAgICAjIHRvIGFjY2VwdCB0aGlzIGFkZHJlc3MuCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Mob3MubmFtZSA9PSAibnQiLCAnV2luZG93cy1zcGVjaWZpYyB0ZXN0JykKKyAgICBkZWYgdGVzdF8xNzAzMjg2X0Eoc2VsZik6CisgICAgICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgTG9hZExpYnJhcnksIEZyZWVMaWJyYXJ5CisgICAgICAgICMgT24gd2luWFAgNjQtYml0LCBhZHZhcGkzMiBsb2FkcyBhdCBhbiBhZGRyZXNzIHRoYXQgZG9lcworICAgICAgICAjIE5PVCBmaXQgaW50byBhIDMyLWJpdCBpbnRlZ2VyLiAgRnJlZUxpYnJhcnkgbXVzdCBiZSBhYmxlCisgICAgICAgICMgdG8gYWNjZXB0IHRoaXMgYWRkcmVzcy4KIAotICAgICAgICAgICAgIyBUaGVzZSBhcmUgdGVzdHMgZm9yIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9zZi8xNzAzMjg2Ci0gICAgICAgICAgICBoYW5kbGUgPSBMb2FkTGlicmFyeSgiYWR2YXBpMzIiKQotICAgICAgICAgICAgRnJlZUxpYnJhcnkoaGFuZGxlKQorICAgICAgICAjIFRoZXNlIGFyZSB0ZXN0cyBmb3IgaHR0cDovL3d3dy5weXRob24ub3JnL3NmLzE3MDMyODYKKyAgICAgICAgaGFuZGxlID0gTG9hZExpYnJhcnkoImFkdmFwaTMyIikKKyAgICAgICAgRnJlZUxpYnJhcnkoaGFuZGxlKQogCi0gICAgICAgIGRlZiB0ZXN0XzE3MDMyODZfQihzZWxmKToKLSAgICAgICAgICAgICMgU2luY2Ugb24gd2luWFAgNjQtYml0IGFkdmFwaTMyIGxvYWRzIGxpa2UgZGVzY3JpYmVkCi0gICAgICAgICAgICAjIGFib3ZlLCB0aGUgKGFyYml0cmFyaWx5IHNlbGVjdGVkKSBDbG9zZUV2ZW50TG9nIGZ1bmN0aW9uCi0gICAgICAgICAgICAjIGFsc28gaGFzIGEgaGlnaCBhZGRyZXNzLiAgJ2NhbGxfZnVuY3Rpb24nIHNob3VsZCBhY2NlcHQKLSAgICAgICAgICAgICMgYWRkcmVzc2VzIHNvIGxhcmdlLgotICAgICAgICAgICAgZnJvbSBfY3R5cGVzIGltcG9ydCBjYWxsX2Z1bmN0aW9uCi0gICAgICAgICAgICBhZHZhcGkzMiA9IHdpbmRsbC5hZHZhcGkzMgotICAgICAgICAgICAgIyBDYWxsaW5nIENsb3NlRXZlbnRMb2cgd2l0aCBhIE5VTEwgYXJndW1lbnQgc2hvdWxkIGZhaWwsCi0gICAgICAgICAgICAjIGJ1dCB0aGUgY2FsbCBzaG91bGQgbm90IHNlZ2ZhdWx0IG9yIHNvLgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBhZHZhcGkzMi5DbG9zZUV2ZW50TG9nKE5vbmUpKQotICAgICAgICAgICAgd2luZGxsLmtlcm5lbDMyLkdldFByb2NBZGRyZXNzLmFyZ3R5cGVzID0gY192b2lkX3AsIGNfY2hhcl9wCi0gICAgICAgICAgICB3aW5kbGwua2VybmVsMzIuR2V0UHJvY0FkZHJlc3MucmVzdHlwZSA9IGNfdm9pZF9wCi0gICAgICAgICAgICBwcm9jID0gd2luZGxsLmtlcm5lbDMyLkdldFByb2NBZGRyZXNzKGFkdmFwaTMyLl9oYW5kbGUsICJDbG9zZUV2ZW50TG9nIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm9jKQotICAgICAgICAgICAgIyBUaGlzIGlzIHRoZSByZWFsIHRlc3Q6IGNhbGwgdGhlIGZ1bmN0aW9uIHZpYSAnY2FsbF9mdW5jdGlvbicKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgY2FsbF9mdW5jdGlvbihwcm9jLCAoTm9uZSwpKSkKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhvcy5uYW1lID09ICJudCIsICdXaW5kb3dzLXNwZWNpZmljIHRlc3QnKQorICAgIGRlZiB0ZXN0XzE3MDMyODZfQihzZWxmKToKKyAgICAgICAgIyBTaW5jZSBvbiB3aW5YUCA2NC1iaXQgYWR2YXBpMzIgbG9hZHMgbGlrZSBkZXNjcmliZWQKKyAgICAgICAgIyBhYm92ZSwgdGhlIChhcmJpdHJhcmlseSBzZWxlY3RlZCkgQ2xvc2VFdmVudExvZyBmdW5jdGlvbgorICAgICAgICAjIGFsc28gaGFzIGEgaGlnaCBhZGRyZXNzLiAgJ2NhbGxfZnVuY3Rpb24nIHNob3VsZCBhY2NlcHQKKyAgICAgICAgIyBhZGRyZXNzZXMgc28gbGFyZ2UuCisgICAgICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgY2FsbF9mdW5jdGlvbgorICAgICAgICBhZHZhcGkzMiA9IHdpbmRsbC5hZHZhcGkzMgorICAgICAgICAjIENhbGxpbmcgQ2xvc2VFdmVudExvZyB3aXRoIGEgTlVMTCBhcmd1bWVudCBzaG91bGQgZmFpbCwKKyAgICAgICAgIyBidXQgdGhlIGNhbGwgc2hvdWxkIG5vdCBzZWdmYXVsdCBvciBzby4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBhZHZhcGkzMi5DbG9zZUV2ZW50TG9nKE5vbmUpKQorICAgICAgICB3aW5kbGwua2VybmVsMzIuR2V0UHJvY0FkZHJlc3MuYXJndHlwZXMgPSBjX3ZvaWRfcCwgY19jaGFyX3AKKyAgICAgICAgd2luZGxsLmtlcm5lbDMyLkdldFByb2NBZGRyZXNzLnJlc3R5cGUgPSBjX3ZvaWRfcAorICAgICAgICBwcm9jID0gd2luZGxsLmtlcm5lbDMyLkdldFByb2NBZGRyZXNzKGFkdmFwaTMyLl9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsb3NlRXZlbnRMb2ciKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJvYykKKyAgICAgICAgIyBUaGlzIGlzIHRoZSByZWFsIHRlc3Q6IGNhbGwgdGhlIGZ1bmN0aW9uIHZpYSAnY2FsbF9mdW5jdGlvbicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBjYWxsX2Z1bmN0aW9uKHByb2MsIChOb25lLCkpKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbWFjaG9saWIucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9tYWNob2xpYi5weQppbmRleCBlZGE4NDZkLi45Nzc5YjJmIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9tYWNob2xpYi5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9tYWNob2xpYi5weQpAQCAtNDUsMTggKzQ1LDIxIEBACiAgICAgcmFpc2UgVmFsdWVFcnJvcigiJXMgbm90IGZvdW5kIiAlIChuYW1lLCkpCiAKIGNsYXNzIE1hY2hPVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgotICAgICAgICBkZWYgdGVzdF9maW5kKHNlbGYpOgorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIiwgJ09TWC1zcGVjaWZpYyB0ZXN0JykKKyAgICBkZWYgdGVzdF9maW5kKHNlbGYpOgogCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbmRfbGliKCdwdGhyZWFkJyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9saWIvbGliU3lzdGVtLkIuZHlsaWInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbmRfbGliKCdwdGhyZWFkJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvdXNyL2xpYi9saWJTeXN0ZW0uQi5keWxpYicpCiAKLSAgICAgICAgICAgIHJlc3VsdCA9IGZpbmRfbGliKCd6JykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQuc3RhcnRzd2l0aCgnL3Vzci9saWIvbGliei4xJykpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0LmVuZHN3aXRoKCcuZHlsaWInKSkKKyAgICAgICAgcmVzdWx0ID0gZmluZF9saWIoJ3onKQorICAgICAgICAjIElzc3VlICMyMTA5MzogZHlsZCBkZWZhdWx0IHNlYXJjaCBwYXRoIGluY2x1ZGVzICRIT01FL2xpYiBhbmQKKyAgICAgICAgIyAvdXNyL2xvY2FsL2xpYiBiZWZvcmUgL3Vzci9saWIsIHdoaWNoIGNhdXNlZCB0ZXN0IGZhaWx1cmVzIGlmCisgICAgICAgICMgYSBsb2NhbCBjb3B5IG9mIGxpYnogZXhpc3RzIGluIG9uZSBvZiB0aGVtLiBOb3cgaWdub3JlIHRoZSBoZWFkCisgICAgICAgICMgb2YgdGhlIHBhdGguCisgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXhwTWF0Y2hlcyhyZXN1bHQsIHIiLiovbGliL2xpYnpcLi4qLipcLmR5bGliIikKIAotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaW5kX2xpYignSU9LaXQnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9JT0tpdC5mcmFtZXdvcmsvVmVyc2lvbnMvQS9JT0tpdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmluZF9saWIoJ0lPS2l0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9JT0tpdC5mcmFtZXdvcmsvVmVyc2lvbnMvQS9JT0tpdCcpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9tZW1mdW5jdGlvbnMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9tZW1mdW5jdGlvbnMucHkKaW5kZXggZDA3MjYwMy4uYmE5ZWVhNiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbWVtZnVuY3Rpb25zLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X21lbWZ1bmN0aW9ucy5weQpAQCAtMSwxNyArMSwxOSBAQAogaW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIGN0eXBlcyBpbXBvcnQgKgorZnJvbSBjdHlwZXMudGVzdCBpbXBvcnQgbmVlZF9zeW1ib2wKIAogY2xhc3MgTWVtRnVuY3Rpb25zVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0jIyAgICBkZWYgdGVzdF9vdmVyZmxvdyhzZWxmKToKLSMjICAgICAgICAjIHN0cmluZ19hdCBhbmQgd3N0cmluZ19hdCBtdXN0IHVzZSB0aGUgUHl0aG9uIGNhbGxpbmcKLSMjICAgICAgICAjIGNvbnZlbnRpb24gKHdoaWNoIGFjcXVpcmVzIHRoZSBHSUwgYW5kIGNoZWNrcyB0aGUgUHl0aG9uCi0jIyAgICAgICAgIyBlcnJvciBmbGFnKS4gIFByb3Zva2UgYW4gZXJyb3IgYW5kIGNhdGNoIGl0OyBzZWUgYWxzbyBpc3N1ZQotIyMgICAgICAgICMgIzM1NTQ6IDxodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMzU1ND4KLSMjICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoT3ZlcmZsb3dFcnJvciwgTWVtb3J5RXJyb3IsIFN5c3RlbUVycm9yKSwKLSMjICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IHdzdHJpbmdfYXQodSJmb28iLCBzeXMubWF4aW50IC0gMSkpCi0jIyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKE92ZXJmbG93RXJyb3IsIE1lbW9yeUVycm9yLCBTeXN0ZW1FcnJvciksCi0jIyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBzdHJpbmdfYXQoImZvbyIsIHN5cy5tYXhpbnQgLSAxKSkKKyAgICBAdW5pdHRlc3Quc2tpcCgndGVzdCBkaXNhYmxlZCcpCisgICAgZGVmIHRlc3Rfb3ZlcmZsb3coc2VsZik6CisgICAgICAgICMgc3RyaW5nX2F0IGFuZCB3c3RyaW5nX2F0IG11c3QgdXNlIHRoZSBQeXRob24gY2FsbGluZworICAgICAgICAjIGNvbnZlbnRpb24gKHdoaWNoIGFjcXVpcmVzIHRoZSBHSUwgYW5kIGNoZWNrcyB0aGUgUHl0aG9uCisgICAgICAgICMgZXJyb3IgZmxhZykuICBQcm92b2tlIGFuIGVycm9yIGFuZCBjYXRjaCBpdDsgc2VlIGFsc28gaXNzdWUKKyAgICAgICAgIyAjMzU1NDogPGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUzNTU0PgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoT3ZlcmZsb3dFcnJvciwgTWVtb3J5RXJyb3IsIFN5c3RlbUVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiB3c3RyaW5nX2F0KHUiZm9vIiwgc3lzLm1heGludCAtIDEpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoT3ZlcmZsb3dFcnJvciwgTWVtb3J5RXJyb3IsIFN5c3RlbUVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBzdHJpbmdfYXQoImZvbyIsIHN5cy5tYXhpbnQgLSAxKSkKIAogICAgIGRlZiB0ZXN0X21lbW1vdmUoc2VsZik6CiAgICAgICAgICMgbGFyZ2UgYnVmZmVycyBhcHBhcmVudGx5IGluY3JlYXNlIHRoZSBjaGFuY2UgdGhhdCB0aGUgbWVtb3J5CkBAIC01OSwyMSArNjEsMTcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpbmdfYXQoImZvbyBiYXIiLCA4KSwgImZvbyBiYXJcMCIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nX2F0KCJmb28gYmFyIiwgMyksICJmb28iKQogCi0gICAgdHJ5OgotICAgICAgICBjcmVhdGVfdW5pY29kZV9idWZmZXIKLSAgICBleGNlcHQgTmFtZUVycm9yOgotICAgICAgICBwYXNzCi0gICAgZWxzZToKLSAgICAgICAgZGVmIHRlc3Rfd3N0cmluZ19hdChzZWxmKToKLSAgICAgICAgICAgIHAgPSBjcmVhdGVfdW5pY29kZV9idWZmZXIoIkhlbGxvLCBXb3JsZCIpCi0gICAgICAgICAgICBhID0gY3JlYXRlX3VuaWNvZGVfYnVmZmVyKDEwMDAwMDApCi0gICAgICAgICAgICByZXN1bHQgPSBtZW1tb3ZlKGEsIHAsIGxlbihwKSAqIHNpemVvZihjX3djaGFyKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS52YWx1ZSwgIkhlbGxvLCBXb3JsZCIpCisgICAgQG5lZWRfc3ltYm9sKCdjcmVhdGVfdW5pY29kZV9idWZmZXInKQorICAgIGRlZiB0ZXN0X3dzdHJpbmdfYXQoc2VsZik6CisgICAgICAgIHAgPSBjcmVhdGVfdW5pY29kZV9idWZmZXIoIkhlbGxvLCBXb3JsZCIpCisgICAgICAgIGEgPSBjcmVhdGVfdW5pY29kZV9idWZmZXIoMTAwMDAwMCkKKyAgICAgICAgcmVzdWx0ID0gbWVtbW92ZShhLCBwLCBsZW4ocCkgKiBzaXplb2YoY193Y2hhcikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS52YWx1ZSwgIkhlbGxvLCBXb3JsZCIpCiAKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3N0cmluZ19hdChhKSwgIkhlbGxvLCBXb3JsZCIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdzdHJpbmdfYXQoYSwgNSksICJIZWxsbyIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdzdHJpbmdfYXQoYSwgMTYpLCAiSGVsbG8sIFdvcmxkXDBcMFwwXDAiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3c3RyaW5nX2F0KGEsIDApLCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3c3RyaW5nX2F0KGEpLCAiSGVsbG8sIFdvcmxkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3c3RyaW5nX2F0KGEsIDUpLCAiSGVsbG8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdzdHJpbmdfYXQoYSwgMTYpLCAiSGVsbG8sIFdvcmxkXDBcMFwwXDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdzdHJpbmdfYXQoYSwgMCksICIiKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbnVtYmVycy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X251bWJlcnMucHkKaW5kZXggMjI2NzY5My4uZDYyMzQ2NSAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbnVtYmVycy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9udW1iZXJzLnB5CkBAIC04MiwxMiArODIsMTMgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdCwgIiIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQsIE5vbmUpCiAKLSMjICAgIGRlZiB0ZXN0X3ZhbGlkX3JhbmdlcyhzZWxmKToKLSMjICAgICAgICAjIGludmFsaWQgdmFsdWVzIG9mIHRoZSBjb3JyZWN0IHR5cGUKLSMjICAgICAgICAjIHJhaXNlIFZhbHVlRXJyb3IgKG5vdCBPdmVyZmxvd0Vycm9yKQotIyMgICAgICAgIGZvciB0LCAobCwgaCkgaW4gemlwKHVuc2lnbmVkX3R5cGVzLCB1bnNpZ25lZF9yYW5nZXMpOgotIyMgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LCBsLTEpCi0jIyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQsIGgrMSkKKyAgICBAdW5pdHRlc3Quc2tpcCgndGVzdCBkaXNhYmxlZCcpCisgICAgZGVmIHRlc3RfdmFsaWRfcmFuZ2VzKHNlbGYpOgorICAgICAgICAjIGludmFsaWQgdmFsdWVzIG9mIHRoZSBjb3JyZWN0IHR5cGUKKyAgICAgICAgIyByYWlzZSBWYWx1ZUVycm9yIChub3QgT3ZlcmZsb3dFcnJvcikKKyAgICAgICAgZm9yIHQsIChsLCBoKSBpbiB6aXAodW5zaWduZWRfdHlwZXMsIHVuc2lnbmVkX3Jhbmdlcyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LCBsLTEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LCBoKzEpCiAKICAgICBkZWYgdGVzdF9mcm9tX3BhcmFtKHNlbGYpOgogICAgICAgICAjIHRoZSBmcm9tX3BhcmFtIGNsYXNzIG1ldGhvZCBhdHRyaWJ1dGUgYWx3YXlzCkBAIC0xODEsMTAgKzE4MiwxMCBAQAogICAgICAgICAgICAgYSA9IGFycmF5KHQuX3R5cGVfLCBbMy4xNF0pCiAgICAgICAgICAgICB2ID0gdC5mcm9tX2FkZHJlc3MoYS5idWZmZXJfaW5mbygpWzBdKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnZhbHVlLCBhWzBdKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodikgaXMgdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZSh2KSwgdCkKICAgICAgICAgICAgIGFbMF0gPSAyLjM0NTZlMTcKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodi52YWx1ZSwgYVswXSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHYpIGlzIHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUodiksIHQpCiAKICAgICBkZWYgdGVzdF9jaGFyX2Zyb21fYWRkcmVzcyhzZWxmKToKICAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNfY2hhcgpAQCAtMTkzLDMxICsxOTQsNDMgQEAKICAgICAgICAgYSA9IGFycmF5KCdjJywgJ3gnKQogICAgICAgICB2ID0gY19jaGFyLmZyb21fYWRkcmVzcyhhLmJ1ZmZlcl9pbmZvKClbMF0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodi52YWx1ZSwgYVswXSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodikgaXMgY19jaGFyKQorICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUodiksIGNfY2hhcikKIAogICAgICAgICBhWzBdID0gJz8nCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodi52YWx1ZSwgYVswXSkKIAogICAgICMgYXJyYXkgZG9lcyBub3Qgc3VwcG9ydCBjX2Jvb2wgLyAndCcKLSAgICAjIGRlZiB0ZXN0X2Jvb2xfZnJvbV9hZGRyZXNzKHNlbGYpOgotICAgICMgICAgIGZyb20gY3R5cGVzIGltcG9ydCBjX2Jvb2wKLSAgICAjICAgICBmcm9tIGFycmF5IGltcG9ydCBhcnJheQotICAgICMgICAgIGEgPSBhcnJheShjX2Jvb2wuX3R5cGVfLCBbVHJ1ZV0pCi0gICAgIyAgICAgdiA9IHQuZnJvbV9hZGRyZXNzKGEuYnVmZmVyX2luZm8oKVswXSkKLSAgICAjICAgICBzZWxmLmFzc2VydEVxdWFsKHYudmFsdWUsIGFbMF0pCi0gICAgIyAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHYpIGlzIHQpCi0gICAgIyAgICAgYVswXSA9IEZhbHNlCi0gICAgIyAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnZhbHVlLCBhWzBdKQotICAgICMgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2KSBpcyB0KQorICAgIEB1bml0dGVzdC5za2lwKCd0ZXN0IGRpc2FibGVkJykKKyAgICBkZWYgdGVzdF9ib29sX2Zyb21fYWRkcmVzcyhzZWxmKToKKyAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNfYm9vbAorICAgICAgICBmcm9tIGFycmF5IGltcG9ydCBhcnJheQorICAgICAgICBhID0gYXJyYXkoY19ib29sLl90eXBlXywgW1RydWVdKQorICAgICAgICB2ID0gdC5mcm9tX2FkZHJlc3MoYS5idWZmZXJfaW5mbygpWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYudmFsdWUsIGFbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2KSBpcyB0KQorICAgICAgICBhWzBdID0gRmFsc2UKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnZhbHVlLCBhWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodikgaXMgdCkKIAogICAgIGRlZiB0ZXN0X2luaXQoc2VsZik6CiAgICAgICAgICMgY19pbnQoKSBjYW4gYmUgaW5pdGlhbGl6ZWQgZnJvbSBQeXRob24ncyBpbnQsIGFuZCBjX2ludC4KLSAgICAgICAgIyBOb3QgZnJvbSBjX2xvbmcgb3Igc28sIHdoaWNoIHNlZW1zIHN0cmFuZ2UsIGFiZCBzaG91bGQKKyAgICAgICAgIyBOb3QgZnJvbSBjX2xvbmcgb3Igc28sIHdoaWNoIHNlZW1zIHN0cmFuZ2UsIGFiYyBzaG91bGQKICAgICAgICAgIyBwcm9iYWJseSBiZSBjaGFuZ2VkOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNfaW50LCBjX2xvbmcoNDIpKQogCi0jIyAgICBkZWYgdGVzdF9wZXJmKHNlbGYpOgotIyMgICAgICAgIGNoZWNrX3BlcmYoKQorICAgIGRlZiB0ZXN0X2Zsb2F0X292ZXJmbG93KHNlbGYpOgorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIGJpZ19pbnQgPSBpbnQoc3lzLmZsb2F0X2luZm8ubWF4KSAqIDIKKyAgICAgICAgZm9yIHQgaW4gZmxvYXRfdHlwZXMgKyBbY19sb25nZG91YmxlXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHQsIGJpZ19pbnQpCisgICAgICAgICAgICBpZiAoaGFzYXR0cih0LCAiX19jdHlwZV9iZV9fIikpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHQuX19jdHlwZV9iZV9fLCBiaWdfaW50KQorICAgICAgICAgICAgaWYgKGhhc2F0dHIodCwgIl9fY3R5cGVfbGVfXyIpKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCB0Ll9fY3R5cGVfbGVfXywgYmlnX2ludCkKKworICAgIEB1bml0dGVzdC5za2lwKCd0ZXN0IGRpc2FibGVkJykKKyAgICBkZWYgdGVzdF9wZXJmKHNlbGYpOgorICAgICAgICBjaGVja19wZXJmKCkKIAogZnJvbSBjdHlwZXMgaW1wb3J0IF9TaW1wbGVDRGF0YQogY2xhc3MgY19pbnRfUyhfU2ltcGxlQ0RhdGEpOgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfb2JqZWN0cy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X29iamVjdHMucHkKaW5kZXggNGQ5MjFkMi4uYTdjNTI0NyAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfb2JqZWN0cy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9vYmplY3RzLnB5CkBAIC01OSwxMiArNTksOSBAQAogaW1wb3J0IGN0eXBlcy50ZXN0LnRlc3Rfb2JqZWN0cwogCiBjbGFzcyBUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgaWYgc3lzLmhleHZlcnNpb24gPiAweDAyMDQwMDAwOgotICAgICAgICAjIFB5dGhvbiAyLjMgaGFzIG5vIEVMTElQU0lTIGZsYWcsIHNvIHdlIGRvbid0IHRlc3Qgd2l0aCB0aGlzCi0gICAgICAgICMgdmVyc2lvbjoKLSAgICAgICAgZGVmIHRlc3Qoc2VsZik6Ci0gICAgICAgICAgICBkb2N0ZXN0LnRlc3Rtb2QoY3R5cGVzLnRlc3QudGVzdF9vYmplY3RzKQorICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICBmYWlsdXJlcywgdGVzdHMgPSBkb2N0ZXN0LnRlc3Rtb2QoY3R5cGVzLnRlc3QudGVzdF9vYmplY3RzKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGZhaWx1cmVzLCAnZG9jdGVzdHMgZmFpbGVkLCBzZWUgb3V0cHV0IGFib3ZlJykKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICBpZiBzeXMuaGV4dmVyc2lvbiA+IDB4MDIwNDAwMDA6Ci0gICAgICAgIGRvY3Rlc3QudGVzdG1vZChjdHlwZXMudGVzdC50ZXN0X29iamVjdHMpCisgICAgZG9jdGVzdC50ZXN0bW9kKGN0eXBlcy50ZXN0LnRlc3Rfb2JqZWN0cykKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BhcmFtZXRlcnMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wYXJhbWV0ZXJzLnB5CmluZGV4IDgyNzA0ZDUuLjE5MmQ5ZWQgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BhcmFtZXRlcnMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcGFyYW1ldGVycy5weQpAQCAtMSw0ICsxLDUgQEAKIGltcG9ydCB1bml0dGVzdCwgc3lzCitmcm9tIGN0eXBlcy50ZXN0IGltcG9ydCBuZWVkX3N5bWJvbAogCiBjbGFzcyBTaW1wbGVUeXBlc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtMzYsMTAgKzM3LDkgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDVk9JRFAuZnJvbV9wYXJhbSgiYWJjIiksICJhYmNhYmMiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKENDSEFSUC5mcm9tX3BhcmFtKCJhYmMiKSwgImFiY2FiY2FiY2FiYyIpCiAKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNfd2NoYXJfcAotICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgICAgICByZXR1cm4KKyAgICBAbmVlZF9zeW1ib2woJ2Nfd2NoYXJfcCcpCisgICAgZGVmIHRlc3Rfc3ViY2xhc3Nlc19jX3djaGFyX3Aoc2VsZik6CisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBjX3djaGFyX3AKIAogICAgICAgICBjbGFzcyBDV0NIQVJQKGNfd2NoYXJfcCk6CiAgICAgICAgICAgICBkZWYgZnJvbV9wYXJhbShjbHMsIHZhbHVlKToKQEAgLTU1LDcgKzU1LDcgQEAKICAgICAgICAgIyBjX2NoYXJfcC5mcm9tX3BhcmFtIG9uIGEgUHl0aG9uIFN0cmluZyBwYWNrcyB0aGUgc3RyaW5nCiAgICAgICAgICMgaW50byBhIGNwYXJhbSBvYmplY3QKICAgICAgICAgcyA9ICIxMjMiCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2NoYXJfcC5mcm9tX3BhcmFtKHMpLl9vYmogaXMgcykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhjX2NoYXJfcC5mcm9tX3BhcmFtKHMpLl9vYmosIHMpCiAKICAgICAgICAgIyBuZXcgaW4gMC45LjE6IGNvbnZlcnQgKGVuY29kZSkgdW5pY29kZSB0byBhc2NpaQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNfY2hhcl9wLmZyb21fcGFyYW0odSIxMjMiKS5fb2JqLCAiMTIzIikKQEAgLTY2LDE1ICs2NiwxMSBAQAogICAgICAgICAjIGNhbGxpbmcgY19jaGFyX3AuZnJvbV9wYXJhbSB3aXRoIGEgY19jaGFyX3AgaW5zdGFuY2UKICAgICAgICAgIyByZXR1cm5zIHRoZSBhcmd1bWVudCBpdHNlbGY6CiAgICAgICAgIGEgPSBjX2NoYXJfcCgiMTIzIikKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfY2hhcl9wLmZyb21fcGFyYW0oYSkgaXMgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhjX2NoYXJfcC5mcm9tX3BhcmFtKGEpLCBhKQogCisgICAgQG5lZWRfc3ltYm9sKCdjX3djaGFyX3AnKQogICAgIGRlZiB0ZXN0X2N3X3N0cmluZ3Moc2VsZik6Ci0gICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBieXJlZgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY193Y2hhcl9wCi0gICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSMjICAgICAgICAgICAgcHJpbnQgIihObyBjX3djaGFyX3ApIgotICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBieXJlZiwgY193Y2hhcl9wCiAgICAgICAgIHMgPSB1IjEyMyIKICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY193Y2hhcl9wLmZyb21fcGFyYW0ocykuX29iaiBpcyBzKQpAQCAtMTQ0LDkgKzE0MCw2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgTFBJTlQuZnJvbV9wYXJhbSwgY19sb25nKjMpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgTFBJTlQuZnJvbV9wYXJhbSwgY191aW50KjMpCiAKLSMjICAgIGRlZiB0ZXN0X3BlcmZvcm1hbmNlKHNlbGYpOgotIyMgICAgICAgIGNoZWNrX3BlcmYoKQotCiAgICAgZGVmIHRlc3Rfbm9jdHlwZXNfYXJndHlwZShzZWxmKToKICAgICAgICAgaW1wb3J0IF9jdHlwZXNfdGVzdAogICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgQ0RMTCwgY192b2lkX3AsIEFyZ3VtZW50RXJyb3IKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BlcDMxMTgucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wZXAzMTE4LnB5CmluZGV4IDk3NjQ3M2MuLjNlMDA3ZTEgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BlcDMxMTgucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcGVwMzExOC5weQpAQCAtOTIsNiArOTIsMTAgQEAKIGNsYXNzIGFVbmlvbihVbmlvbik6CiAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19pbnQpXQogCitjbGFzcyBTdHJ1Y3RXaXRoQXJyYXlzKFN0cnVjdHVyZSk6CisgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19sb25nICogMyAqIDIpLCAoInkiLCBQb2ludCAqIDQpXQorCisKIGNsYXNzIEluY29tcGxldGUoU3RydWN0dXJlKToKICAgICBwYXNzCiAKQEAgLTE0MSwxMCArMTQ1LDEwIEBACiAKICAgICAjIyBhcnJheXMgYW5kIHBvaW50ZXJzCiAKLSAgICAoY19kb3VibGUgKiA0LCAgICAgICAgICAgICAgIig0KTxkIiwgICAgICAgICAgICAgICAgKDQsKSwgICAgICAgICAgIGNfZG91YmxlKSwKLSAgICAoY19mbG9hdCAqIDQgKiAzICogMiwgICAgICAgIigyLDMsNCk8ZiIsICAgICAgICAgICAgKDIsMyw0KSwgICAgICAgIGNfZmxvYXQpLAotICAgIChQT0lOVEVSKGNfc2hvcnQpICogMiwgICAgICAiKDIpJjxoIiwgICAgICAgICAgICAgICAoMiwpLCAgICAgICAgICAgUE9JTlRFUihjX3Nob3J0KSksCi0gICAgKFBPSU5URVIoY19zaG9ydCkgKiAyICogMywgICIoMywyKSY8aCIsICAgICAgICAgICAgICgzLDIsKSwgICAgICAgICBQT0lOVEVSKGNfc2hvcnQpKSwKKyAgICAoY19kb3VibGUgKiA0LCAgICAgICAgICAgICAgIjxkIiwgICAgICAgICAgICAgICAgICAgKDQsKSwgICAgICAgICAgIGNfZG91YmxlKSwKKyAgICAoY19mbG9hdCAqIDQgKiAzICogMiwgICAgICAgIjxmIiwgICAgICAgICAgICAgICAgICAgKDIsMyw0KSwgICAgICAgIGNfZmxvYXQpLAorICAgIChQT0lOVEVSKGNfc2hvcnQpICogMiwgICAgICAiJjxoIiwgICAgICAgICAgICAgICAgICAoMiwpLCAgICAgICAgICAgUE9JTlRFUihjX3Nob3J0KSksCisgICAgKFBPSU5URVIoY19zaG9ydCkgKiAyICogMywgICImPGgiLCAgICAgICAgICAgICAgICAgICgzLDIsKSwgICAgICAgICBQT0lOVEVSKGNfc2hvcnQpKSwKICAgICAoUE9JTlRFUihjX3Nob3J0ICogMiksICAgICAgIiYoMik8aCIsICAgICAgICAgICAgICAgTm9uZSwgICAgICAgICAgIFBPSU5URVIoY19zaG9ydCkpLAogCiAgICAgIyMgc3RydWN0dXJlcyBhbmQgdW5pb25zCkBAIC0xNTYsNiArMTYwLDkgQEAKICAgICAoRW1wdHlTdHJ1Y3QsICAgICAgICAgICAgICAgIlR7fSIsICAgICAgICAgICAgICAgICAgTm9uZSwgICAgICAgICAgIEVtcHR5U3RydWN0KSwKICAgICAjIHRoZSBwZXAgZG9lcyd0IHN1cHBvcnQgdW5pb25zCiAgICAgKGFVbmlvbiwgICAgICAgICAgICAgICAgICAgICJCIiwgICAgICAgICAgICAgICAgICAgIE5vbmUsICAgICAgICAgICBhVW5pb24pLAorICAgICMgc3RydWN0dXJlIHdpdGggc3ViLWFycmF5cworICAgIChTdHJ1Y3RXaXRoQXJyYXlzLCAgICAgICAgICAiVHsoMiwzKTxsOng6KDQpVHs8bDp4OjxsOnk6fTp5On0iLCBOb25lLCAgU3RydWN0V2l0aEFycmF5cyksCisgICAgKFN0cnVjdFdpdGhBcnJheXMgKiAzLCAgICAgICJUeygyLDMpPGw6eDooNClUezxsOng6PGw6eTp9Onk6fSIsICgzLCksICBTdHJ1Y3RXaXRoQXJyYXlzKSwKIAogICAgICMjIHBvaW50ZXIgdG8gaW5jb21wbGV0ZSBzdHJ1Y3R1cmUKICAgICAoSW5jb21wbGV0ZSwgICAgICAgICAgICAgICAgIkIiLCAgICAgICAgICAgICAgICAgICAgTm9uZSwgICAgICAgICAgIEluY29tcGxldGUpLApkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcG9pbnRlcnMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wb2ludGVycy5weQppbmRleCA5MmI4Y2U2Li45NTMxMTU4IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wb2ludGVycy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wb2ludGVycy5weQpAQCAtNzgsNyArNzgsNyBAQAogCiAjIyAgICAgICAgaSA9IGNfaW50KDQyKQogIyMgICAgICAgIGNhbGxiYWNrKGJ5cmVmKGkpKQotIyMgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpLnZhbHVlID09IDg0KQorIyMgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaS52YWx1ZSwgODQpCiAKICAgICAgICAgZG9pdChjYWxsYmFjaykKICMjICAgICAgICBwcmludCBzZWxmLnJlc3VsdApAQCAtOTEsMTEgKzkxLDExIEBACiAgICAgICAgICAgICBpID0gY3QoNDIpCiAgICAgICAgICAgICBwID0gcG9pbnRlcihpKQogIyMgICAgICAgICAgICBwcmludCB0eXBlKHAuY29udGVudHMpLCBjdAotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUocC5jb250ZW50cykgaXMgY3QpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUocC5jb250ZW50cyksIGN0KQogICAgICAgICAgICAgIyBwLmNvbnRlbnRzIGlzIHRoZSBzYW1lIGFzIHBbMF0KICMjICAgICAgICAgICAgcHJpbnQgcC5jb250ZW50cwotIyMgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocC5jb250ZW50cyA9PSA0MikKLSMjICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBbMF0gPT0gNDIpCisjIyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5jb250ZW50cywgNDIpCisjIyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFswXSwgNDIpCiAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZGVsaXRlbSwgcCwgMCkKIApkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcHJvdG90eXBlcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3Byb3RvdHlwZXMucHkKaW5kZXggMDliYTY1NS4uYTEwMzE3YiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcHJvdG90eXBlcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wcm90b3R5cGVzLnB5CkBAIC0xLDQgKzEsNSBAQAogZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2Zyb20gY3R5cGVzLnRlc3QgaW1wb3J0IG5lZWRfc3ltYm9sCiBpbXBvcnQgdW5pdHRlc3QKIAogIyBJTVBPUlRBTlQgSU5GTzoKQEAgLTEzNSwxMyArMTM2LDE0IEBACiAgICAgICAgIGZ1bmMocG9pbnRlcihjX2ludCgpKSkKICAgICAgICAgZnVuYygoY19pbnQgKiAzKSgpKQogCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGZ1bmMucmVzdHlwZSA9IGNfd2NoYXJfcAotICAgICAgICBleGNlcHQgTmFtZUVycm9yOgotICAgICAgICAgICAgcGFzcwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKGNfd2NoYXJfcChOb25lKSkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiMTIzIiwgZnVuYyhjX3djaGFyX3AodSIxMjMiKSkpCisgICAgQG5lZWRfc3ltYm9sKCdjX3djaGFyX3AnKQorICAgIGRlZiB0ZXN0X2Nfdm9pZF9wX2FyZ193aXRoX2Nfd2NoYXJfcChzZWxmKToKKyAgICAgICAgZnVuYyA9IHRlc3RkbGwuX3Rlc3RmdW5jX3BfcAorICAgICAgICBmdW5jLnJlc3R5cGUgPSBjX3djaGFyX3AKKyAgICAgICAgZnVuYy5hcmd0eXBlcyA9IGNfdm9pZF9wLAorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZnVuYyhjX3djaGFyX3AoTm9uZSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiMTIzIiwgZnVuYyhjX3djaGFyX3AodSIxMjMiKSkpCiAKICAgICBkZWYgdGVzdF9pbnN0YW5jZShzZWxmKToKICAgICAgICAgZnVuYyA9IHRlc3RkbGwuX3Rlc3RmdW5jX3BfcApAQCAtMTU2LDUxICsxNTgsNDcgQEAKICAgICAgICAgZnVuYy5hcmd0eXBlcyA9IE5vbmUKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKFgoKSkpCiAKLXRyeToKLSAgICBjX3djaGFyCi1leGNlcHQgTmFtZUVycm9yOgotICAgIHBhc3MKLWVsc2U6Ci0gICAgY2xhc3MgV0NoYXJQb2ludGVyc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKK0BuZWVkX3N5bWJvbCgnY193Y2hhcicpCitjbGFzcyBXQ2hhclBvaW50ZXJzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogCi0gICAgICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgICAgIGZ1bmMgPSB0ZXN0ZGxsLl90ZXN0ZnVuY19wX3AKLSAgICAgICAgICAgIGZ1bmMucmVzdHlwZSA9IGNfaW50Ci0gICAgICAgICAgICBmdW5jLmFyZ3R5cGVzID0gTm9uZQorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgZnVuYyA9IHRlc3RkbGwuX3Rlc3RmdW5jX3BfcAorICAgICAgICBmdW5jLnJlc3R5cGUgPSBjX2ludAorICAgICAgICBmdW5jLmFyZ3R5cGVzID0gTm9uZQogCiAKLSAgICAgICAgZGVmIHRlc3RfUE9JTlRFUl9jX3djaGFyX2FyZyhzZWxmKToKLSAgICAgICAgICAgIGZ1bmMgPSB0ZXN0ZGxsLl90ZXN0ZnVuY19wX3AKLSAgICAgICAgICAgIGZ1bmMucmVzdHlwZSA9IGNfd2NoYXJfcAotICAgICAgICAgICAgZnVuYy5hcmd0eXBlcyA9IFBPSU5URVIoY193Y2hhciksCisgICAgZGVmIHRlc3RfUE9JTlRFUl9jX3djaGFyX2FyZyhzZWxmKToKKyAgICAgICAgZnVuYyA9IHRlc3RkbGwuX3Rlc3RmdW5jX3BfcAorICAgICAgICBmdW5jLnJlc3R5cGUgPSBjX3djaGFyX3AKKyAgICAgICAgZnVuYy5hcmd0eXBlcyA9IFBPSU5URVIoY193Y2hhciksCiAKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZnVuYyhOb25lKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSIxMjMiLCBmdW5jKHUiMTIzIikpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGZ1bmMoY193Y2hhcl9wKE5vbmUpKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSIxMjMiLCBmdW5jKGNfd2NoYXJfcCh1IjEyMyIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiMTIzIiwgZnVuYyh1IjEyMyIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGZ1bmMoY193Y2hhcl9wKE5vbmUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1IjEyMyIsIGZ1bmMoY193Y2hhcl9wKHUiMTIzIikpKQogCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiMTIzIiwgZnVuYyhjX3didWZmZXIodSIxMjMiKSkpCi0gICAgICAgICAgICBjYSA9IGNfd2NoYXIoImEiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1ImEiLCBmdW5jKHBvaW50ZXIoY2EpKVswXSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJhIiwgZnVuYyhieXJlZihjYSkpWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiMTIzIiwgZnVuYyhjX3didWZmZXIodSIxMjMiKSkpCisgICAgICAgIGNhID0gY193Y2hhcigiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJhIiwgZnVuYyhwb2ludGVyKGNhKSlbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJhIiwgZnVuYyhieXJlZihjYSkpWzBdKQogCi0gICAgICAgIGRlZiB0ZXN0X2Nfd2NoYXJfcF9hcmcoc2VsZik6Ci0gICAgICAgICAgICBmdW5jID0gdGVzdGRsbC5fdGVzdGZ1bmNfcF9wCi0gICAgICAgICAgICBmdW5jLnJlc3R5cGUgPSBjX3djaGFyX3AKLSAgICAgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBjX3djaGFyX3AsCisgICAgZGVmIHRlc3RfY193Y2hhcl9wX2FyZyhzZWxmKToKKyAgICAgICAgZnVuYyA9IHRlc3RkbGwuX3Rlc3RmdW5jX3BfcAorICAgICAgICBmdW5jLnJlc3R5cGUgPSBjX3djaGFyX3AKKyAgICAgICAgZnVuYy5hcmd0eXBlcyA9IGNfd2NoYXJfcCwKIAotICAgICAgICAgICAgY193Y2hhcl9wLmZyb21fcGFyYW0odSIxMjMiKQorICAgICAgICBjX3djaGFyX3AuZnJvbV9wYXJhbSh1IjEyMyIpCiAKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZnVuYyhOb25lKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjEyMyIsIGZ1bmModSIxMjMiKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZnVuYyhjX3djaGFyX3AoTm9uZSkpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMTIzIiwgZnVuYyhjX3djaGFyX3AoIjEyMyIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIxMjMiLCBmdW5jKHUiMTIzIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZnVuYyhjX3djaGFyX3AoTm9uZSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIxMjMiLCBmdW5jKGNfd2NoYXJfcCgiMTIzIikpKQogCi0gICAgICAgICAgICAjIFhYWCBDdXJyZW50bHksIHRoZXNlIHJhaXNlIFR5cGVFcnJvcnMsIGFsdGhvdWdoIHRoZXkgc2hvdWxkbid0OgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMTIzIiwgZnVuYyhjX3didWZmZXIoIjEyMyIpKSkKLSAgICAgICAgICAgIGNhID0gY193Y2hhcigiYSIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJhIiwgZnVuYyhwb2ludGVyKGNhKSlbMF0pCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJhIiwgZnVuYyhieXJlZihjYSkpWzBdKQorICAgICAgICAjIFhYWCBDdXJyZW50bHksIHRoZXNlIHJhaXNlIFR5cGVFcnJvcnMsIGFsdGhvdWdoIHRoZXkgc2hvdWxkbid0OgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIxMjMiLCBmdW5jKGNfd2J1ZmZlcigiMTIzIikpKQorICAgICAgICBjYSA9IGNfd2NoYXIoImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJhIiwgZnVuYyhwb2ludGVyKGNhKSlbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImEiLCBmdW5jKGJ5cmVmKGNhKSlbMF0pCiAKIGNsYXNzIEFycmF5VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3Qoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9weXRob25fYXBpLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcHl0aG9uX2FwaS5weQppbmRleCA2OTgxNzBmLi5iYzJmZmQwIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9weXRob25fYXBpLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3B5dGhvbl9hcGkucHkKQEAgLTEsNiArMSw2IEBACiBmcm9tIGN0eXBlcyBpbXBvcnQgKgogaW1wb3J0IHVuaXR0ZXN0LCBzeXMKLWZyb20gY3R5cGVzLnRlc3QgaW1wb3J0IGlzX3Jlc291cmNlX2VuYWJsZWQKK2Zyb20gY3R5cGVzLnRlc3QgaW1wb3J0IHJlcXVpcmVzCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgVGhpcyBzZWN0aW9uIHNob3VsZCBiZSBtb3ZlZCBpbnRvIGN0eXBlc1xfX2luaXRfXy5weSwgd2hlbiBpdCdzIHJlYWR5LgpAQCAtMzcsMzEgKzM3LDMxIEBACiAgICAgICAgIGRlbCBweW9iCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ3JjKHMpLCByZWZjbnQpCiAKLSAgICBpZiBpc19yZXNvdXJjZV9lbmFibGVkKCJyZWZjb3VudCIpOgotICAgICAgICAjIFRoaXMgdGVzdCBpcyB1bnJlbGlhYmxlLCBiZWNhdXNlIGl0IGlzIHBvc3NpYmxlIHRoYXQgY29kZSBpbgotICAgICAgICAjIHVuaXR0ZXN0IGNoYW5nZXMgdGhlIHJlZmNvdW50IG9mIHRoZSAnNDInIGludGVnZXIuICBTbywgaXQKLSAgICAgICAgIyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgotICAgICAgICBkZWYgdGVzdF9QeUludF9Mb25nKHNlbGYpOgotICAgICAgICAgICAgcmVmNDIgPSBncmMoNDIpCi0gICAgICAgICAgICBweXRob25hcGkuUHlJbnRfRnJvbUxvbmcucmVzdHlwZSA9IHB5X29iamVjdAotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChweXRob25hcGkuUHlJbnRfRnJvbUxvbmcoNDIpLCA0MikKKyAgICAjIFRoaXMgdGVzdCBpcyB1bnJlbGlhYmxlLCBiZWNhdXNlIGl0IGlzIHBvc3NpYmxlIHRoYXQgY29kZSBpbgorICAgICMgdW5pdHRlc3QgY2hhbmdlcyB0aGUgcmVmY291bnQgb2YgdGhlICc0MicgaW50ZWdlci4gIFNvLCBpdAorICAgICMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKyAgICBkZWYgdGVzdF9QeUludF9Mb25nKHNlbGYpOgorICAgICAgICByZXF1aXJlcygicmVmY291bnQiKQorICAgICAgICByZWY0MiA9IGdyYyg0MikKKyAgICAgICAgcHl0aG9uYXBpLlB5SW50X0Zyb21Mb25nLnJlc3R5cGUgPSBweV9vYmplY3QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChweXRob25hcGkuUHlJbnRfRnJvbUxvbmcoNDIpLCA0MikKIAotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMoNDIpLCByZWY0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMoNDIpLCByZWY0MikKIAotICAgICAgICAgICAgcHl0aG9uYXBpLlB5SW50X0FzTG9uZy5hcmd0eXBlcyA9IChweV9vYmplY3QsKQotICAgICAgICAgICAgcHl0aG9uYXBpLlB5SW50X0FzTG9uZy5yZXN0eXBlID0gY19sb25nCisgICAgICAgIHB5dGhvbmFwaS5QeUludF9Bc0xvbmcuYXJndHlwZXMgPSAocHlfb2JqZWN0LCkKKyAgICAgICAgcHl0aG9uYXBpLlB5SW50X0FzTG9uZy5yZXN0eXBlID0gY19sb25nCiAKLSAgICAgICAgICAgIHJlcyA9IHB5dGhvbmFwaS5QeUludF9Bc0xvbmcoNDIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdyYyhyZXMpLCByZWY0MiArIDEpCi0gICAgICAgICAgICBkZWwgcmVzCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdyYyg0MiksIHJlZjQyKQorICAgICAgICByZXMgPSBweXRob25hcGkuUHlJbnRfQXNMb25nKDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdyYyhyZXMpLCByZWY0MiArIDEpCisgICAgICAgIGRlbCByZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMoNDIpLCByZWY0MikKIAogICAgIGRlZiB0ZXN0X1B5T2JqX0Zyb21QdHIoc2VsZik6CiAgICAgICAgIHMgPSAiYWJjIGRlZiBnaGkgamtsIgogICAgICAgICByZWYgPSBncmMocykKICAgICAgICAgIyBpZChweXRob24tb2JqZWN0KSBpcyB0aGUgYWRkcmVzcwogICAgICAgICBweW9iaiA9IFB5T2JqX0Zyb21QdHIoaWQocykpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzIGlzIHB5b2JqKQorICAgICAgICBzZWxmLmFzc2VydElzKHMsIHB5b2JqKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ3JjKHMpLCByZWYgKyAxKQogICAgICAgICBkZWwgcHlvYmoKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JhbmRvbV90aGluZ3MucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9yYW5kb21fdGhpbmdzLnB5CmluZGV4IDFjMjE3YzMuLjBjYWZmZTMgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JhbmRvbV90aGluZ3MucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmFuZG9tX3RoaW5ncy5weQpAQCAtNSwyMyArNSwyMiBAQAogICAgIDQyIC8vIGFyZwogICAgIHJhaXNlIFZhbHVlRXJyb3IoYXJnKQogCi1pZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKK0B1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiLCAnV2luZG93cy1zcGVjaWZpYyB0ZXN0JykKK2NsYXNzIGNhbGxfZnVuY3Rpb25fVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgX2N0eXBlcy5jYWxsX2Z1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgYW5kIHByaXZhdGUsIGJ1dCB1c2VkIGJ5CisgICAgIyBHYXJ5IEJpc2hwJ3MgcmVhZGxpbmUgbW9kdWxlLiAgSWYgd2UgaGF2ZSBpdCwgd2UgbXVzdCB0ZXN0IGl0IGFzIHdlbGwuCiAKLSAgICBjbGFzcyBjYWxsX2Z1bmN0aW9uX1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICAgICAgIyBfY3R5cGVzLmNhbGxfZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCBhbmQgcHJpdmF0ZSwgYnV0IHVzZWQgYnkKLSAgICAgICAgIyBHYXJ5IEJpc2hwJ3MgcmVhZGxpbmUgbW9kdWxlLiAgSWYgd2UgaGF2ZSBpdCwgd2UgbXVzdCB0ZXN0IGl0IGFzIHdlbGwuCisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgY2FsbF9mdW5jdGlvbgorICAgICAgICB3aW5kbGwua2VybmVsMzIuTG9hZExpYnJhcnlBLnJlc3R5cGUgPSBjX3ZvaWRfcAorICAgICAgICB3aW5kbGwua2VybmVsMzIuR2V0UHJvY0FkZHJlc3MuYXJndHlwZXMgPSBjX3ZvaWRfcCwgY19jaGFyX3AKKyAgICAgICAgd2luZGxsLmtlcm5lbDMyLkdldFByb2NBZGRyZXNzLnJlc3R5cGUgPSBjX3ZvaWRfcAogCi0gICAgICAgIGRlZiB0ZXN0KHNlbGYpOgotICAgICAgICAgICAgZnJvbSBfY3R5cGVzIGltcG9ydCBjYWxsX2Z1bmN0aW9uCi0gICAgICAgICAgICB3aW5kbGwua2VybmVsMzIuTG9hZExpYnJhcnlBLnJlc3R5cGUgPSBjX3ZvaWRfcAotICAgICAgICAgICAgd2luZGxsLmtlcm5lbDMyLkdldFByb2NBZGRyZXNzLmFyZ3R5cGVzID0gY192b2lkX3AsIGNfY2hhcl9wCi0gICAgICAgICAgICB3aW5kbGwua2VybmVsMzIuR2V0UHJvY0FkZHJlc3MucmVzdHlwZSA9IGNfdm9pZF9wCisgICAgICAgIGhkbGwgPSB3aW5kbGwua2VybmVsMzIuTG9hZExpYnJhcnlBKCJrZXJuZWwzMiIpCisgICAgICAgIGZ1bmNhZGRyID0gd2luZGxsLmtlcm5lbDMyLkdldFByb2NBZGRyZXNzKGhkbGwsICJHZXRNb2R1bGVIYW5kbGVBIikKIAotICAgICAgICAgICAgaGRsbCA9IHdpbmRsbC5rZXJuZWwzMi5Mb2FkTGlicmFyeUEoImtlcm5lbDMyIikKLSAgICAgICAgICAgIGZ1bmNhZGRyID0gd2luZGxsLmtlcm5lbDMyLkdldFByb2NBZGRyZXNzKGhkbGwsICJHZXRNb2R1bGVIYW5kbGVBIikKLQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYWxsX2Z1bmN0aW9uKGZ1bmNhZGRyLCAoTm9uZSwpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRsbC5rZXJuZWwzMi5HZXRNb2R1bGVIYW5kbGVBKE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhbGxfZnVuY3Rpb24oZnVuY2FkZHIsIChOb25lLCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kbGwua2VybmVsMzIuR2V0TW9kdWxlSGFuZGxlQShOb25lKSkKIAogY2xhc3MgQ2FsbGJhY2tUcmFjYmFja1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAjIFdoZW4gYW4gZXhjZXB0aW9uIGlzIHJhaXNlZCBpbiBhIGN0eXBlcyBjYWxsYmFjayBmdW5jdGlvbiwgdGhlIEMKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JlZmNvdW50cy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JlZmNvdW50cy5weQppbmRleCAzNWE4MWFhLi4yMDMxMzQ2IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9yZWZjb3VudHMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmVmY291bnRzLnB5CkBAIC0yNCw3ICsyNCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ3JjKGNhbGxiYWNrKSwgMikKICAgICAgICAgY2IgPSBNeUNhbGxiYWNrKGNhbGxiYWNrKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShncmMoY2FsbGJhY2spID4gMikKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKGdyYyhjYWxsYmFjayksIDIpCiAgICAgICAgIHJlc3VsdCA9IGYoLTEwLCBjYikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIC0xOCkKICAgICAgICAgY2IgPSBOb25lCkBAIC00MSwyOSArNDEsMjkgQEAKICAgICAgICAgIyB0aGlzIGlzIHRoZSBzdGFuZGFyZCByZWZjb3VudCBmb3IgZnVuYwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdyYyhmdW5jKSwgMikKIAotICAgICAgICAjIHRoZSBDRnVuY1B0ciBpbnN0YW5jZSBob2xkcyBhdHIgbGVhc3Qgb25lIHJlZmNvdW50IG9uIGZ1bmM6CisgICAgICAgICMgdGhlIENGdW5jUHRyIGluc3RhbmNlIGhvbGRzIGF0IGxlYXN0IG9uZSByZWZjb3VudCBvbiBmdW5jOgogICAgICAgICBmID0gT3RoZXJDYWxsYmFjayhmdW5jKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoZ3JjKGZ1bmMpID4gMikKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKGdyYyhmdW5jKSwgMikKIAogICAgICAgICAjIGFuZCBtYXkgcmVsZWFzZSBpdCBhZ2FpbgogICAgICAgICBkZWwgZgotICAgICAgICBzZWxmLmFzc2VydFRydWUoZ3JjKGZ1bmMpID49IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKGdyYyhmdW5jKSwgMikKIAogICAgICAgICAjIGJ1dCBub3cgaXQgbXVzdCBiZSBnb25lCiAgICAgICAgIGdjLmNvbGxlY3QoKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoZ3JjKGZ1bmMpID09IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ3JjKGZ1bmMpLCAyKQogCiAgICAgICAgIGNsYXNzIFgoY3R5cGVzLlN0cnVjdHVyZSk6CiAgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBPdGhlckNhbGxiYWNrKV0KICAgICAgICAgeCA9IFgoKQogICAgICAgICB4LmEgPSBPdGhlckNhbGxiYWNrKGZ1bmMpCiAKLSAgICAgICAgIyB0aGUgQ0Z1bmNQdHIgaW5zdGFuY2UgaG9sZHMgYXRyIGxlYXN0IG9uZSByZWZjb3VudCBvbiBmdW5jOgotICAgICAgICBzZWxmLmFzc2VydFRydWUoZ3JjKGZ1bmMpID4gMikKKyAgICAgICAgIyB0aGUgQ0Z1bmNQdHIgaW5zdGFuY2UgaG9sZHMgYXQgbGVhc3Qgb25lIHJlZmNvdW50IG9uIGZ1bmM6CisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcihncmMoZnVuYyksIDIpCiAKICAgICAgICAgIyBhbmQgbWF5IHJlbGVhc2UgaXQgYWdhaW4KICAgICAgICAgZGVsIHgKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdyYyhmdW5jKSA+PSAyKQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChncmMoZnVuYyksIDIpCiAKICAgICAgICAgIyBhbmQgbm93IGl0IG11c3QgYmUgZ29uZSBhZ2FpbgogICAgICAgICBnYy5jb2xsZWN0KCkKQEAgLTcxLDggKzcxLDggQEAKIAogICAgICAgICBmID0gT3RoZXJDYWxsYmFjayhmdW5jKQogCi0gICAgICAgICMgdGhlIENGdW5jUHRyIGluc3RhbmNlIGhvbGRzIGF0ciBsZWFzdCBvbmUgcmVmY291bnQgb24gZnVuYzoKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdyYyhmdW5jKSA+IDIpCisgICAgICAgICMgdGhlIENGdW5jUHRyIGluc3RhbmNlIGhvbGRzIGF0IGxlYXN0IG9uZSByZWZjb3VudCBvbiBmdW5jOgorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIoZ3JjKGZ1bmMpLCAyKQogCiAgICAgICAgICMgY3JlYXRlIGEgY3ljbGUKICAgICAgICAgZi5jeWNsZSA9IGYKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JldHVybmZ1bmNwdHJzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHkKaW5kZXggZjc2NjE4OS4uMDgyN2YwYSAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHkKQEAgLTEsNSArMSw2IEBACiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gY3R5cGVzIGltcG9ydCAqCitpbXBvcnQgb3MKIAogaW1wb3J0IF9jdHlwZXNfdGVzdAogCkBAIC0zMSw1ICszMiwzNCBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBcmd1bWVudEVycm9yLCBzdHJjaHIsICJhYmNkZWYiLCAzKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN0cmNociwgImFiY2RlZiIpCiAKKyAgICBkZWYgdGVzdF9mcm9tX2RsbChzZWxmKToKKyAgICAgICAgZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisgICAgICAgICMgX0NGdW5jUHRyIGluc3RhbmNlcyBhcmUgbm93IGNhbGxhYmxlIHdpdGggYSB0dXBsZSBhcmd1bWVudAorICAgICAgICAjIHdoaWNoIGRlbm90ZXMgYSBmdW5jdGlvbiBuYW1lIGFuZCBhIGRsbDoKKyAgICAgICAgc3RyY2hyID0gQ0ZVTkNUWVBFKGNfY2hhcl9wLCBjX2NoYXJfcCwgY19jaGFyKSgoIm15X3N0cmNociIsIGRsbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJjaHIoYiJhYmNkZWYiLCBiImIiKSwgImJjZGVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJjaHIoYiJhYmNkZWYiLCBiIngiKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJndW1lbnRFcnJvciwgc3RyY2hyLCBiImFiY2RlZiIsIDMuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzdHJjaHIsIGIiYWJjZGVmIikKKworICAgICMgSXNzdWUgNjA4MzogUmVmZXJlbmNlIGNvdW50aW5nIGJ1ZworICAgIGRlZiB0ZXN0X2Zyb21fZGxsX3JlZmNvdW50KHNlbGYpOgorICAgICAgICBjbGFzcyBCYWRTZXF1ZW5jZSh0dXBsZSk6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICBpZiBrZXkgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJteV9zdHJjaHIiCisgICAgICAgICAgICAgICAgaWYga2V5ID09IDE6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKyAgICAgICAgICAgICAgICByYWlzZSBJbmRleEVycm9yCisKKyAgICAgICAgIyBfQ0Z1bmNQdHIgaW5zdGFuY2VzIGFyZSBub3cgY2FsbGFibGUgd2l0aCBhIHR1cGxlIGFyZ3VtZW50CisgICAgICAgICMgd2hpY2ggZGVub3RlcyBhIGZ1bmN0aW9uIG5hbWUgYW5kIGEgZGxsOgorICAgICAgICBzdHJjaHIgPSBDRlVOQ1RZUEUoY19jaGFyX3AsIGNfY2hhcl9wLCBjX2NoYXIpKAorICAgICAgICAgICAgICAgIEJhZFNlcXVlbmNlKCgibXlfc3RyY2hyIiwgQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJjaHIoYiJhYmNkZWYiLCBiImIiKSwgImJjZGVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJjaHIoYiJhYmNkZWYiLCBiIngiKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJndW1lbnRFcnJvciwgc3RyY2hyLCBiImFiY2RlZiIsIDMuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzdHJjaHIsIGIiYWJjZGVmIikKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NsaWNpbmcucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zbGljaW5nLnB5CmluZGV4IGE1NjMyZWMuLmE5ZWUzYTggMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NsaWNpbmcucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2xpY2luZy5weQpAQCAtMSw1ICsxLDYgQEAKIGltcG9ydCB1bml0dGVzdAogZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2Zyb20gY3R5cGVzLnRlc3QgaW1wb3J0IG5lZWRfc3ltYm9sCiAKIGltcG9ydCBfY3R5cGVzX3Rlc3QKIApAQCAtMTMxLDQ2ICsxMzIsNDIgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzI6NTotM10sIHNbMjo1Oi0zXSkKIAogCi0gICAgdHJ5OgotICAgICAgICBjX3djaGFyCi0gICAgZXhjZXB0IE5hbWVFcnJvcjoKLSAgICAgICAgcGFzcwotICAgIGVsc2U6Ci0gICAgICAgIGRlZiB0ZXN0X3djaGFyX3B0cihzZWxmKToKLSAgICAgICAgICAgIHMgPSB1ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XDAiCisgICAgQG5lZWRfc3ltYm9sKCdjX3djaGFyJykKKyAgICBkZWYgdGVzdF93Y2hhcl9wdHIoc2VsZik6CisgICAgICAgIHMgPSB1ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XDAiCiAKLSAgICAgICAgICAgIGRsbCA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQotICAgICAgICAgICAgZGxsLm15X3djc2R1cC5yZXN0eXBlID0gUE9JTlRFUihjX3djaGFyKQotICAgICAgICAgICAgZGxsLm15X3djc2R1cC5hcmd0eXBlcyA9IFBPSU5URVIoY193Y2hhciksCi0gICAgICAgICAgICBkbGwubXlfZnJlZS5yZXN0eXBlID0gTm9uZQotICAgICAgICAgICAgcmVzID0gZGxsLm15X3djc2R1cChzKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbOmxlbihzKV0sIHMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1s6bGVuKHMpOl0sIHMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1tsZW4ocyktMTotMTotMV0sIHNbOjotMV0pCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1tsZW4ocyktMTo1Oi03XSwgc1s6NTotN10pCisgICAgICAgIGRsbCA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICBkbGwubXlfd2NzZHVwLnJlc3R5cGUgPSBQT0lOVEVSKGNfd2NoYXIpCisgICAgICAgIGRsbC5teV93Y3NkdXAuYXJndHlwZXMgPSBQT0lOVEVSKGNfd2NoYXIpLAorICAgICAgICBkbGwubXlfZnJlZS5yZXN0eXBlID0gTm9uZQorICAgICAgICByZXMgPSBkbGwubXlfd2NzZHVwKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzWzpsZW4ocyldLCBzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1s6bGVuKHMpOl0sIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzW2xlbihzKS0xOi0xOi0xXSwgc1s6Oi0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbbGVuKHMpLTE6NTotN10sIHNbOjU6LTddKQogCi0gICAgICAgICAgICBpbXBvcnQgb3BlcmF0b3IKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc2V0c2xpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMsIDAsIDUsIHUiYWJjZGUiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRpdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLCBzbGljZSgwLCA1KSwgdSJhYmNkZSIpCi0gICAgICAgICAgICBkbGwubXlfZnJlZShyZXMpCisgICAgICAgIGltcG9ydCBvcGVyYXRvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnNldHNsaWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZXMsIDAsIDUsIHUiYWJjZGUiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnNldGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcywgc2xpY2UoMCwgNSksIHUiYWJjZGUiKQorICAgICAgICBkbGwubXlfZnJlZShyZXMpCiAKLSAgICAgICAgICAgIGlmIHNpemVvZihjX3djaGFyKSA9PSBzaXplb2YoY19zaG9ydCk6Ci0gICAgICAgICAgICAgICAgZGxsLm15X3djc2R1cC5yZXN0eXBlID0gUE9JTlRFUihjX3Nob3J0KQotICAgICAgICAgICAgZWxpZiBzaXplb2YoY193Y2hhcikgPT0gc2l6ZW9mKGNfaW50KToKLSAgICAgICAgICAgICAgICBkbGwubXlfd2NzZHVwLnJlc3R5cGUgPSBQT0lOVEVSKGNfaW50KQotICAgICAgICAgICAgZWxpZiBzaXplb2YoY193Y2hhcikgPT0gc2l6ZW9mKGNfbG9uZyk6Ci0gICAgICAgICAgICAgICAgZGxsLm15X3djc2R1cC5yZXN0eXBlID0gUE9JTlRFUihjX2xvbmcpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgcmVzID0gZGxsLm15X3djc2R1cChzKQotICAgICAgICAgICAgdG1wbCA9IHJhbmdlKG9yZCgiYSIpLCBvcmQoInoiKSsxKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbOmxlbihzKS0xXSwgdG1wbCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzWzpsZW4ocyktMTpdLCB0bXBsKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbbGVuKHMpLTI6LTE6LTFdLCB0bXBsWzo6LTFdKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbbGVuKHMpLTI6NTotN10sIHRtcGxbOjU6LTddKQotICAgICAgICAgICAgZGxsLm15X2ZyZWUocmVzKQorICAgICAgICBpZiBzaXplb2YoY193Y2hhcikgPT0gc2l6ZW9mKGNfc2hvcnQpOgorICAgICAgICAgICAgZGxsLm15X3djc2R1cC5yZXN0eXBlID0gUE9JTlRFUihjX3Nob3J0KQorICAgICAgICBlbGlmIHNpemVvZihjX3djaGFyKSA9PSBzaXplb2YoY19pbnQpOgorICAgICAgICAgICAgZGxsLm15X3djc2R1cC5yZXN0eXBlID0gUE9JTlRFUihjX2ludCkKKyAgICAgICAgZWxpZiBzaXplb2YoY193Y2hhcikgPT0gc2l6ZW9mKGNfbG9uZyk6CisgICAgICAgICAgICBkbGwubXlfd2NzZHVwLnJlc3R5cGUgPSBQT0lOVEVSKGNfbG9uZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ1BvaW50ZXJzIHRvIGNfd2NoYXIgYXJlIG5vdCBzdXBwb3J0ZWQnKQorICAgICAgICByZXMgPSBkbGwubXlfd2NzZHVwKHMpCisgICAgICAgIHRtcGwgPSByYW5nZShvcmQoImEiKSwgb3JkKCJ6IikrMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbOmxlbihzKS0xXSwgdG1wbCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbOmxlbihzKS0xOl0sIHRtcGwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzW2xlbihzKS0yOi0xOi0xXSwgdG1wbFs6Oi0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbbGVuKHMpLTI6NTotN10sIHRtcGxbOjU6LTddKQorICAgICAgICBkbGwubXlfZnJlZShyZXMpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIApkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RyaW5ncy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cmluZ3MucHkKaW5kZXggODk0NWQwYy4uNGI1OGU3YyAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RyaW5ncy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdzLnB5CkBAIC0xLDUgKzEsNiBAQAogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIGN0eXBlcyBpbXBvcnQgKgorZnJvbSBjdHlwZXMudGVzdCBpbXBvcnQgbmVlZF9zeW1ib2wKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiAKIGNsYXNzIFN0cmluZ0FycmF5VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtNjAsMjkgKzYxLDI2IEBACiAjIyAgICAgICAgcHJpbnQgQlVGLmZyb21fcGFyYW0oY19jaGFyX3AoInB5dGhvbiIpKQogIyMgICAgICAgIHByaW50IEJVRi5mcm9tX3BhcmFtKEJVRigqInB5dGgiKSkKIAotdHJ5OgotICAgIGNfd2NoYXIKLWV4Y2VwdCBOYW1lRXJyb3I6Ci0gICAgcGFzcwotZWxzZToKLSAgICBjbGFzcyBXU3RyaW5nQXJyYXlUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgICAgIGRlZiB0ZXN0KHNlbGYpOgotICAgICAgICAgICAgQlVGID0gY193Y2hhciAqIDQKK0BuZWVkX3N5bWJvbCgnY193Y2hhcicpCitjbGFzcyBXU3RyaW5nQXJyYXlUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgIEJVRiA9IGNfd2NoYXIgKiA0CiAKLSAgICAgICAgICAgIGJ1ZiA9IEJVRih1ImEiLCB1ImIiLCB1ImMiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsIHUiYWJjIikKKyAgICAgICAgYnVmID0gQlVGKHUiYSIsIHUiYiIsIHUiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLnZhbHVlLCB1ImFiYyIpCiAKLSAgICAgICAgICAgIGJ1Zi52YWx1ZSA9IHUiQUJDRCIKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLnZhbHVlLCB1IkFCQ0QiKQorICAgICAgICBidWYudmFsdWUgPSB1IkFCQ0QiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLnZhbHVlLCB1IkFCQ0QiKQogCi0gICAgICAgICAgICBidWYudmFsdWUgPSB1IngiCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi52YWx1ZSwgdSJ4IikKKyAgICAgICAgYnVmLnZhbHVlID0gdSJ4IgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi52YWx1ZSwgdSJ4IikKIAotICAgICAgICAgICAgYnVmWzFdID0gdSJaIgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsIHUieFpDRCIpCisgICAgICAgIGJ1ZlsxXSA9IHUiWiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsIHUieFpDRCIpCiAKIGNsYXNzIFN0cmluZ1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBkZWYgWFhfdGVzdF9iYXNpY19zdHJpbmdzKHNlbGYpOgorICAgIEB1bml0dGVzdC5za2lwKCd0ZXN0IGRpc2FibGVkJykKKyAgICBkZWYgdGVzdF9iYXNpY19zdHJpbmdzKHNlbGYpOgogICAgICAgICBjcyA9IGNfc3RyaW5nKCJhYmNkZWYiKQogCiAgICAgICAgICMgQ2Fubm90IGNhbGwgbGVuIG9uIGEgY19zdHJpbmcgYW55IGxvbmdlcgpAQCAtMTA4LDMzICsxMDYsMzYgQEAKIAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNfc3RyaW5nLCB1IjEyMyIpCiAKLSAgICBkZWYgWFhfdGVzdF9zaXplZF9zdHJpbmdzKHNlbGYpOgorICAgIEB1bml0dGVzdC5za2lwKCd0ZXN0IGRpc2FibGVkJykKKyAgICBkZWYgdGVzdF9zaXplZF9zdHJpbmdzKHNlbGYpOgogCiAgICAgICAgICMgTmV3IGluIHJlbGVhc2VzIGxhdGVyIHRoYW4gMC40LjA6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY19zdHJpbmcsIE5vbmUpCiAKICAgICAgICAgIyBOZXcgaW4gcmVsZWFzZXMgbGF0ZXIgdGhhbiAwLjQuMDoKICAgICAgICAgIyBjX3N0cmluZyhudW1iZXIpIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nIG9mIHNpemUgbnVtYmVyCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oY19zdHJpbmcoMzIpLnJhdykgPT0gMzIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGNfc3RyaW5nKDMyKS5yYXcpLCAzMikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY19zdHJpbmcsIC0xKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjX3N0cmluZywgMCkKIAogICAgICAgICAjIFRoZXNlIHRlc3RzIGZhaWwsIGJlY2F1c2UgaXQgaXMgbm8gbG9uZ2VyIGluaXRpYWxpemVkCi0jIyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfc3RyaW5nKDIpLnZhbHVlID09ICIiKQotIyMgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3N0cmluZygyKS5yYXcgPT0gIlwwMDBcMDAwIikKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfc3RyaW5nKDIpLnJhd1stMV0gPT0gIlwwMDAiKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGNfc3RyaW5nKDIpLnJhdykgPT0gMikKKyMjICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNfc3RyaW5nKDIpLnZhbHVlLCAiIikKKyMjICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNfc3RyaW5nKDIpLnJhdywgIlwwMDBcMDAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjX3N0cmluZygyKS5yYXdbLTFdLCAiXDAwMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGNfc3RyaW5nKDIpLnJhdyksIDIpCiAKLSAgICBkZWYgWFhfdGVzdF9pbml0aWFsaXplZF9zdHJpbmdzKHNlbGYpOgorICAgIEB1bml0dGVzdC5za2lwKCd0ZXN0IGRpc2FibGVkJykKKyAgICBkZWYgdGVzdF9pbml0aWFsaXplZF9zdHJpbmdzKHNlbGYpOgogCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3N0cmluZygiYWIiLCA0KS5yYXdbOjJdID09ICJhYiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3N0cmluZygiYWIiLCA0KS5yYXdbOjI6XSA9PSAiYWIiKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoY19zdHJpbmcoImFiIiwgNCkucmF3WzoyOi0xXSA9PSAiYmEiKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoY19zdHJpbmcoImFiIiwgNCkucmF3WzoyOjJdID09ICJhIikKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfc3RyaW5nKCJhYiIsIDQpLnJhd1stMV0gPT0gIlwwMDAiKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoY19zdHJpbmcoImFiIiwgMikucmF3ID09ICJhXDAwMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY19zdHJpbmcoImFiIiwgNCkucmF3WzoyXSwgImFiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjX3N0cmluZygiYWIiLCA0KS5yYXdbOjI6XSwgImFiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjX3N0cmluZygiYWIiLCA0KS5yYXdbOjI6LTFdLCAiYmEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNfc3RyaW5nKCJhYiIsIDQpLnJhd1s6MjoyXSwgImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNfc3RyaW5nKCJhYiIsIDQpLnJhd1stMV0sICJcMDAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjX3N0cmluZygiYWIiLCAyKS5yYXcsICJhXDAwMCIpCiAKLSAgICBkZWYgWFhfdGVzdF90b29sb25nKHNlbGYpOgorICAgIEB1bml0dGVzdC5za2lwKCd0ZXN0IGRpc2FibGVkJykKKyAgICBkZWYgdGVzdF90b29sb25nKHNlbGYpOgogICAgICAgICBjcyA9IGNfc3RyaW5nKCJhYmNkZWYiKQogICAgICAgICAjIE11Y2ggdG9vIGxvbmcgc3RyaW5nOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZXRhdHRyLCBjcywgInZhbHVlIiwgIjEyMzQ1Njc4OTAxMjM0NSIpCkBAIC0xNDIsNTQgKzE0Myw1MyBAQAogICAgICAgICAjIE9uZSBjaGFyIHRvbyBsb25nIHZhbHVlczoKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2V0YXR0ciwgY3MsICJ2YWx1ZSIsICIxMjM0NTY3IikKIAotIyMgICAgZGVmIHRlc3RfcGVyZihzZWxmKToKLSMjICAgICAgICBjaGVja19wZXJmKCkKKyAgICBAdW5pdHRlc3Quc2tpcCgndGVzdCBkaXNhYmxlZCcpCisgICAgZGVmIHRlc3RfcGVyZihzZWxmKToKKyAgICAgICAgY2hlY2tfcGVyZigpCiAKLXRyeToKLSAgICBjX3djaGFyCi1leGNlcHQgTmFtZUVycm9yOgotICAgIHBhc3MKLWVsc2U6Ci0gICAgY2xhc3MgV1N0cmluZ1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICAgICAgZGVmIHRlc3Rfd2NoYXIoc2VsZik6Ci0gICAgICAgICAgICBjX3djaGFyKHUieCIpCi0gICAgICAgICAgICByZXByKGJ5cmVmKGNfd2NoYXIodSJ4IikpKQotICAgICAgICAgICAgY193Y2hhcigieCIpCitAbmVlZF9zeW1ib2woJ2Nfd2NoYXInKQorY2xhc3MgV1N0cmluZ1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF93Y2hhcihzZWxmKToKKyAgICAgICAgY193Y2hhcih1IngiKQorICAgICAgICByZXByKGJ5cmVmKGNfd2NoYXIodSJ4IikpKQorICAgICAgICBjX3djaGFyKCJ4IikKIAogCi0gICAgICAgIGRlZiBYX3Rlc3RfYmFzaWNfd3N0cmluZ3Moc2VsZik6Ci0gICAgICAgICAgICBjcyA9IGNfd3N0cmluZyh1ImFiY2RlZiIpCisgICAgQHVuaXR0ZXN0LnNraXAoJ3Rlc3QgZGlzYWJsZWQnKQorICAgIGRlZiB0ZXN0X2Jhc2ljX3dzdHJpbmdzKHNlbGYpOgorICAgICAgICBjcyA9IGNfd3N0cmluZyh1ImFiY2RlZiIpCiAKLSAgICAgICAgICAgICMgWFhYIFRoaXMgYmVoYXZpb3VyIGlzIGFib3V0IHRvIGNoYW5nZToKLSAgICAgICAgICAgICMgbGVuIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGludGVybmFsIGJ1ZmZlciBpbiBieXRlcy4KLSAgICAgICAgICAgICMgVGhpcyBpbmNsdWRlcyB0aGUgdGVybWluYXRpbmcgTlVMIGNoYXJhY3Rlci4KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzaXplb2YoY3MpID09IDE0KQorICAgICAgICAjIFhYWCBUaGlzIGJlaGF2aW91ciBpcyBhYm91dCB0byBjaGFuZ2U6CisgICAgICAgICMgbGVuIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGludGVybmFsIGJ1ZmZlciBpbiBieXRlcy4KKyAgICAgICAgIyBUaGlzIGluY2x1ZGVzIHRoZSB0ZXJtaW5hdGluZyBOVUwgY2hhcmFjdGVyLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihjcyksIDE0KQogCi0gICAgICAgICAgICAjIFRoZSB2YWx1ZSBwcm9wZXJ0eSBpcyB0aGUgc3RyaW5nIHVwIHRvIHRoZSBmaXJzdCB0ZXJtaW5hdGluZyBOVUwuCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY3MudmFsdWUgPT0gdSJhYmNkZWYiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfd3N0cmluZyh1ImFiY1wwMDBkZWYiKS52YWx1ZSA9PSB1ImFiYyIpCisgICAgICAgICMgVGhlIHZhbHVlIHByb3BlcnR5IGlzIHRoZSBzdHJpbmcgdXAgdG8gdGhlIGZpcnN0IHRlcm1pbmF0aW5nIE5VTC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjcy52YWx1ZSwgdSJhYmNkZWYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNfd3N0cmluZyh1ImFiY1wwMDBkZWYiKS52YWx1ZSwgdSJhYmMiKQogCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY193c3RyaW5nKHUiYWJjXDAwMGRlZiIpLnZhbHVlID09IHUiYWJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjX3dzdHJpbmcodSJhYmNcMDAwZGVmIikudmFsdWUsIHUiYWJjIikKIAotICAgICAgICAgICAgIyBUaGUgcmF3IHByb3BlcnR5IGlzIHRoZSB0b3RhbCBidWZmZXIgY29udGVudHM6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY3MucmF3ID09IHUiYWJjZGVmXDAwMCIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY193c3RyaW5nKHUiYWJjXDAwMGRlZiIpLnJhdyA9PSB1ImFiY1wwMDBkZWZcMDAwIikKKyAgICAgICAgIyBUaGUgcmF3IHByb3BlcnR5IGlzIHRoZSB0b3RhbCBidWZmZXIgY29udGVudHM6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3MucmF3LCB1ImFiY2RlZlwwMDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNfd3N0cmluZyh1ImFiY1wwMDBkZWYiKS5yYXcsIHUiYWJjXDAwMGRlZlwwMDAiKQogCi0gICAgICAgICAgICAjIFdlIGNhbiBjaGFuZ2UgdGhlIHZhbHVlOgotICAgICAgICAgICAgY3MudmFsdWUgPSB1ImFiIgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNzLnZhbHVlID09IHUiYWIiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNzLnJhdyA9PSB1ImFiXDAwMFwwMDBcMDAwXDAwMFwwMDAiKQorICAgICAgICAjIFdlIGNhbiBjaGFuZ2UgdGhlIHZhbHVlOgorICAgICAgICBjcy52YWx1ZSA9IHUiYWIiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3MudmFsdWUsIHUiYWIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNzLnJhdywgdSJhYlwwMDBcMDAwXDAwMFwwMDBcMDAwIikKIAotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjX3dzdHJpbmcsICIxMjMiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY193c3RyaW5nLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNfd3N0cmluZywgIjEyMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNfd3N0cmluZywgMCkKIAotICAgICAgICBkZWYgWF90ZXN0X3Rvb2xvbmcoc2VsZik6Ci0gICAgICAgICAgICBjcyA9IGNfd3N0cmluZyh1ImFiY2RlZiIpCi0gICAgICAgICAgICAjIE11Y2ggdG9vIGxvbmcgc3RyaW5nOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2V0YXR0ciwgY3MsICJ2YWx1ZSIsIHUiMTIzNDU2Nzg5MDEyMzQ1IikKKyAgICBAdW5pdHRlc3Quc2tpcCgndGVzdCBkaXNhYmxlZCcpCisgICAgZGVmIHRlc3RfdG9vbG9uZyhzZWxmKToKKyAgICAgICAgY3MgPSBjX3dzdHJpbmcodSJhYmNkZWYiKQorICAgICAgICAjIE11Y2ggdG9vIGxvbmcgc3RyaW5nOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZXRhdHRyLCBjcywgInZhbHVlIiwgdSIxMjM0NTY3ODkwMTIzNDUiKQogCi0gICAgICAgICAgICAjIE9uZSBjaGFyIHRvbyBsb25nIHZhbHVlczoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNldGF0dHIsIGNzLCAidmFsdWUiLCB1IjEyMzQ1NjciKQorICAgICAgICAjIE9uZSBjaGFyIHRvbyBsb25nIHZhbHVlczoKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2V0YXR0ciwgY3MsICJ2YWx1ZSIsIHUiMTIzNDU2NyIpCiAKIAogZGVmIHJ1bl90ZXN0KHJlcCwgbXNnLCBmdW5jLCBhcmcpOgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0dXJlcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdHVyZXMucHkKaW5kZXggMWJkZTEwMS4uMmZhNDJiZCAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0dXJlcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3R1cmVzLnB5CkBAIC0xLDYgKzEsOCBAQAogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIGN0eXBlcyBpbXBvcnQgKgorZnJvbSBjdHlwZXMudGVzdCBpbXBvcnQgbmVlZF9zeW1ib2wKIGZyb20gc3RydWN0IGltcG9ydCBjYWxjc2l6ZQoraW1wb3J0IF90ZXN0Y2FwaQogCiBjbGFzcyBTdWJjbGFzc2VzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3Rfc3ViY2xhc3Moc2VsZik6CkBAIC04Miw3ICs4NCw3IEBACiAgICAgICAgIGNsYXNzIFkoU3RydWN0dXJlKToKICAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIGNfY2hhciAqIDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgKCJ5IiwgY19pbnQpXQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsaWdubWVudChZKSwgY2FsY3NpemUoImkiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGlnbm1lbnQoWSksIGFsaWdubWVudChjX2ludCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFkpLCBjYWxjc2l6ZSgiM3NpIikpCiAKICAgICAgICAgY2xhc3MgU0koU3RydWN0dXJlKToKQEAgLTEwNyw3ICsxMDksNyBAQAogICAgIGRlZiB0ZXN0X2VtdHB5KHNlbGYpOgogICAgICAgICAjIEkgaGFkIHByb2JsZW1zIHdpdGggdGhlc2UKICAgICAgICAgIwotICAgICAgICAjIEFsdGhvdWdoIHRoZXNlIGFyZSBwYXRvbG9naWNhbCBjYXNlczogRW1wdHkgU3RydWN0dXJlcyEKKyAgICAgICAgIyBBbHRob3VnaCB0aGVzZSBhcmUgcGF0aG9sb2dpY2FsIGNhc2VzOiBFbXB0eSBTdHJ1Y3R1cmVzIQogICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CiAgICAgICAgICAgICBfZmllbGRzXyA9IFtdCiAKQEAgLTE3NCwxMyArMTc2LDYgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIDEwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFguYi5vZmZzZXQsIDIpCiAKLSAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgotICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19ieXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfbG9uZ2xvbmcpXQotICAgICAgICAgICAgX3BhY2tfID0gNAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgMTIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC5iLm9mZnNldCwgNCkKLQogICAgICAgICBpbXBvcnQgc3RydWN0CiAgICAgICAgIGxvbmdsb25nX3NpemUgPSBzdHJ1Y3QuY2FsY3NpemUoInEiKQogICAgICAgICBsb25nbG9uZ19hbGlnbiA9IHN0cnVjdC5jYWxjc2l6ZSgiYnEiKSAtIGxvbmdsb25nX3NpemUKQEAgLTE4OCw5ICsxODMsMTYgQEAKICAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19ieXRlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfbG9uZ2xvbmcpXQorICAgICAgICAgICAgX3BhY2tfID0gNAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgbWluKDQsIGxvbmdsb25nX2FsaWduKSArIGxvbmdsb25nX3NpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC5iLm9mZnNldCwgbWluKDQsIGxvbmdsb25nX2FsaWduKSkKKworICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2J5dGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19sb25nbG9uZyldCiAgICAgICAgICAgICBfcGFja18gPSA4CiAKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIGxvbmdsb25nX2FsaWduICsgbG9uZ2xvbmdfc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIG1pbig4LCBsb25nbG9uZ19hbGlnbikgKyBsb25nbG9uZ19zaXplKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFguYi5vZmZzZXQsIG1pbig4LCBsb25nbG9uZ19hbGlnbikpCiAKIApAQCAtMTk5LDYgKzIwMSwxNCBAQAogICAgICAgICAgICAgICJfcGFja18iOiAtMX0KICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdHlwZShTdHJ1Y3R1cmUpLCAiWCIsIChTdHJ1Y3R1cmUsKSwgZCkKIAorICAgICAgICAjIElzc3VlIDE1OTg5CisgICAgICAgIGQgPSB7Il9maWVsZHNfIjogWygiYSIsIGNfYnl0ZSldLAorICAgICAgICAgICAgICJfcGFja18iOiBfdGVzdGNhcGkuSU5UX01BWCArIDF9CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHR5cGUoU3RydWN0dXJlKSwgIlgiLCAoU3RydWN0dXJlLCksIGQpCisgICAgICAgIGQgPSB7Il9maWVsZHNfIjogWygiYSIsIGNfYnl0ZSldLAorICAgICAgICAgICAgICJfcGFja18iOiBfdGVzdGNhcGkuVUlOVF9NQVggKyAyfQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0eXBlKFN0cnVjdHVyZSksICJYIiwgKFN0cnVjdHVyZSwpLCBkKQorCiAgICAgZGVmIHRlc3RfaW5pdGlhbGl6ZXJzKHNlbGYpOgogICAgICAgICBjbGFzcyBQZXJzb24oU3RydWN0dXJlKToKICAgICAgICAgICAgIF9maWVsZHNfID0gWygibmFtZSIsIGNfY2hhcio2KSwKQEAgLTI4MiwxMiArMjkyLDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBob25lLm51bWJlciwgIjU2NzgiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuYWdlLCA1KQogCisgICAgQG5lZWRfc3ltYm9sKCdjX3djaGFyJykKICAgICBkZWYgdGVzdF9zdHJ1Y3R1cmVzX3dpdGhfd2NoYXIoc2VsZik6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGNfd2NoYXIKLSAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKLSAgICAgICAgICAgIHJldHVybiAjIG5vIHVuaWNvZGUKLQogICAgICAgICBjbGFzcyBQZXJzb25XKFN0cnVjdHVyZSk6CiAgICAgICAgICAgICBfZmllbGRzXyA9IFsoIm5hbWUiLCBjX3djaGFyICogMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgKCJhZ2UiLCBjX2ludCldCkBAIC0zNTEsMTQgKzM1NywxNCBAQAogICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBkZXRhaWw6CiAgICAgICAgICAgICByZXR1cm4gZGV0YWlsLl9fY2xhc3NfXywgc3RyKGRldGFpbCkKIAotCi0jIyAgICBkZWYgdGVzdF9zdWJjbGFzc19jcmVhdGlvbihzZWxmKToKLSMjICAgICAgICBtZXRhID0gdHlwZShTdHJ1Y3R1cmUpCi0jIyAgICAgICAgIyBzYW1lIGFzICdjbGFzcyBYKFN0cnVjdHVyZSk6IHBhc3MnCi0jIyAgICAgICAgIyBmYWlscywgc2luY2Ugd2UgbmVlZCBlaXRoZXIgYSBfZmllbGRzXyBvciBhIF9hYnN0cmFjdF8gYXR0cmlidXRlCi0jIyAgICAgICAgY2xzLCBtc2cgPSBzZWxmLmdldF9leGNlcHQobWV0YSwgIlgiLCAoU3RydWN0dXJlLCksIHt9KQotIyMgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGNscywgbXNnKSwKLSMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXR0cmlidXRlRXJyb3IsICJjbGFzcyBtdXN0IGRlZmluZSBhICdfZmllbGRzXycgYXR0cmlidXRlIikpCisgICAgQHVuaXR0ZXN0LnNraXAoJ3Rlc3QgZGlzYWJsZWQnKQorICAgIGRlZiB0ZXN0X3N1YmNsYXNzX2NyZWF0aW9uKHNlbGYpOgorICAgICAgICBtZXRhID0gdHlwZShTdHJ1Y3R1cmUpCisgICAgICAgICMgc2FtZSBhcyAnY2xhc3MgWChTdHJ1Y3R1cmUpOiBwYXNzJworICAgICAgICAjIGZhaWxzLCBzaW5jZSB3ZSBuZWVkIGVpdGhlciBhIF9maWVsZHNfIG9yIGEgX2Fic3RyYWN0XyBhdHRyaWJ1dGUKKyAgICAgICAgY2xzLCBtc2cgPSBzZWxmLmdldF9leGNlcHQobWV0YSwgIlgiLCAoU3RydWN0dXJlLCksIHt9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChjbHMsIG1zZyksCisgICAgICAgICAgICAgICAgKEF0dHJpYnV0ZUVycm9yLCAiY2xhc3MgbXVzdCBkZWZpbmUgYSAnX2ZpZWxkc18nIGF0dHJpYnV0ZSIpKQogCiAgICAgZGVmIHRlc3RfYWJzdHJhY3RfY2xhc3Moc2VsZik6CiAgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKQEAgLTM3MSw5ICszNzcsOSBAQAogIyMgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKICMjICAgICAgICAgICAgX2ZpZWxkc18gPSBbXQogCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiaW5fZGxsIiBpbiBkaXIodHlwZShTdHJ1Y3R1cmUpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJmcm9tX2FkZHJlc3MiIGluIGRpcih0eXBlKFN0cnVjdHVyZSkpKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoImluX2RsbCIgaW4gZGlyKHR5cGUoU3RydWN0dXJlKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oImluX2RsbCIsIGRpcih0eXBlKFN0cnVjdHVyZSkpKQorICAgICAgICBzZWxmLmFzc2VydEluKCJmcm9tX2FkZHJlc3MiLCBkaXIodHlwZShTdHJ1Y3R1cmUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiaW5fZGxsIiwgZGlyKHR5cGUoU3RydWN0dXJlKSkpCiAKICAgICBkZWYgdGVzdF9wb3NpdGlvbmFsX2FyZ3Moc2VsZik6CiAgICAgICAgICMgc2VlIGFsc28gaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTUwNDIKQEAgLTQ0Myw4ICs0NDksOCBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBSZWN1cnNpdmUuX2ZpZWxkc18gPSBbKCJuZXh0IiwgUmVjdXJzaXZlKV0KICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yLCBkZXRhaWxzOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJTdHJ1Y3R1cmUgb3IgdW5pb24gY2Fubm90IGNvbnRhaW4gaXRzZWxmIiBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cihkZXRhaWxzKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oIlN0cnVjdHVyZSBvciB1bmlvbiBjYW5ub3QgY29udGFpbiBpdHNlbGYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIoZGV0YWlscykpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwoIlN0cnVjdHVyZSBvciB1bmlvbiBjYW5ub3QgY29udGFpbiBpdHNlbGYiKQogCkBAIC00NjAsOCArNDY2LDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgU2Vjb25kLl9maWVsZHNfID0gWygiZmlyc3QiLCBGaXJzdCldCiAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvciwgZGV0YWlsczoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiX2ZpZWxkc18gaXMgZmluYWwiIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKGRldGFpbHMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigiX2ZpZWxkc18gaXMgZmluYWwiLCBzdHIoZGV0YWlscykpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwoIkF0dHJpYnV0ZUVycm9yIG5vdCByYWlzZWQiKQogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF91bmljb2RlLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdW5pY29kZS5weQppbmRleCA2NTU3NDc5Li4xZGE1YTI1IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF91bmljb2RlLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3VuaWNvZGUucHkKQEAgLTEsMTI5ICsxLDEzOCBAQAogIyBjb2Rpbmc6IGxhdGluLTEKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IGN0eXBlcworZnJvbSBjdHlwZXMudGVzdCBpbXBvcnQgbmVlZF9zeW1ib2wKK2ltcG9ydCBfY3R5cGVzX3Rlc3QKIAotdHJ5OgotICAgIGN0eXBlcy5jX3djaGFyCi1leGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgcGFzcwotZWxzZToKLSAgICBpbXBvcnQgX2N0eXBlc190ZXN0Ci0gICAgZGxsID0gY3R5cGVzLkNETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQotICAgIHdjc2xlbiA9IGRsbC5teV93Y3NsZW4KLSAgICB3Y3NsZW4uYXJndHlwZXMgPSBbY3R5cGVzLmNfd2NoYXJfcF0KK0BuZWVkX3N5bWJvbCgnY193Y2hhcicpCitjbGFzcyBVbmljb2RlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIGRsbCA9IGN0eXBlcy5DRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKyAgICAgICAgY2xzLndjc2xlbiA9IGRsbC5teV93Y3NsZW4KKyAgICAgICAgY2xzLndjc2xlbi5hcmd0eXBlcyA9IFtjdHlwZXMuY193Y2hhcl9wXQorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5wcmV2X2NvbnZfbW9kZSA9IGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJzdHJpY3QiKQogCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgqc2VsZi5wcmV2X2NvbnZfbW9kZSkKIAotICAgIGNsYXNzIFVuaWNvZGVUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgICAgIHNlbGYucHJldl9jb252X21vZGUgPSBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKKyAgICBkZWYgdGVzdF9hc2NpaV9zdHJpY3Qoc2VsZik6CisgICAgICAgIHdjc2xlbiA9IHNlbGYud2NzbGVuCisgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJzdHJpY3QiKQorICAgICAgICAjIG5vIGNvbnZlcnNpb25zIHRha2UgcGxhY2Ugd2l0aCB1bmljb2RlIGFyZ3VtZW50cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbih1ImFiYyIpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbih1ImFiXHUyMDcwIiksIDMpCisgICAgICAgICMgc3RyaW5nIGFyZ3MgYXJlIGNvbnZlcnRlZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbigiYWJjIiksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGN0eXBlcy5Bcmd1bWVudEVycm9yLCB3Y3NsZW4sICJhYuQiKQogCi0gICAgICAgIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCpzZWxmLnByZXZfY29udl9tb2RlKQorICAgIGRlZiB0ZXN0X2FzY2lpX3JlcGxhY2Uoc2VsZik6CisgICAgICAgIHdjc2xlbiA9IHNlbGYud2NzbGVuCisgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJyZXBsYWNlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4odSJhYmMiKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4odSJhYlx1MjA3MCIpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbigiYWJjIiksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKCJhYuQiKSwgMykKIAotICAgICAgICBkZWYgdGVzdF9hc2NpaV9zdHJpY3Qoc2VsZik6Ci0gICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKLSAgICAgICAgICAgICMgbm8gY29udmVyc2lvbnMgdGFrZSBwbGFjZSB3aXRoIHVuaWNvZGUgYXJndW1lbnRzCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbih1ImFiYyIpLCAzKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4odSJhYlx1MjA3MCIpLCAzKQotICAgICAgICAgICAgIyBzdHJpbmcgYXJncyBhcmUgY29udmVydGVkCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbigiYWJjIiksIDMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjdHlwZXMuQXJndW1lbnRFcnJvciwgd2NzbGVuLCAiYWLkIikKKyAgICBkZWYgdGVzdF9hc2NpaV9pZ25vcmUoc2VsZik6CisgICAgICAgIHdjc2xlbiA9IHNlbGYud2NzbGVuCisgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJpZ25vcmUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbih1ImFiYyIpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbih1ImFiXHUyMDcwIiksIDMpCisgICAgICAgICMgaWdub3JlIGVycm9yIG1vZGUgc2tpcHMgbm9uLWFzY2lpIGNoYXJhY3RlcnMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4oImFiYyIpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbigi5Pb83yIpLCAwKQogCi0gICAgICAgIGRlZiB0ZXN0X2FzY2lpX3JlcGxhY2Uoc2VsZik6Ci0gICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAicmVwbGFjZSIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbih1ImFiYyIpLCAzKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4odSJhYlx1MjA3MCIpLCAzKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4oImFiYyIpLCAzKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4oImFi5CIpLCAzKQorICAgIGRlZiB0ZXN0X2xhdGluMV9zdHJpY3Qoc2VsZik6CisgICAgICAgIHdjc2xlbiA9IHNlbGYud2NzbGVuCisgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJsYXRpbi0xIiwgInN0cmljdCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJjIiksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJcdTIwNzAiKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4oImFiYyIpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbigi5Pb83yIpLCA0KQogCi0gICAgICAgIGRlZiB0ZXN0X2FzY2lpX2lnbm9yZShzZWxmKToKLSAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJpZ25vcmUiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4odSJhYmMiKSwgMykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJcdTIwNzAiKSwgMykKLSAgICAgICAgICAgICMgaWdub3JlIGVycm9yIG1vZGUgc2tpcHMgbm9uLWFzY2lpIGNoYXJhY3RlcnMKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKCJhYmMiKSwgMykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKCLk9vzfIiksIDApCisgICAgZGVmIHRlc3RfYnVmZmVycyhzZWxmKToKKyAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgInN0cmljdCIpCisgICAgICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfdW5pY29kZV9idWZmZXIoImFiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGJ1ZiksIDMrMSkKIAotICAgICAgICBkZWYgdGVzdF9sYXRpbjFfc3RyaWN0KHNlbGYpOgotICAgICAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImxhdGluLTEiLCAic3RyaWN0IikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJjIiksIDMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbih1ImFiXHUyMDcwIiksIDMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbigiYWJjIiksIDMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbigi5Pb83yIpLCA0KQorICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAicmVwbGFjZSIpCisgICAgICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfdW5pY29kZV9idWZmZXIoImFi5Pb8IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOl0sIHUiYWJcdUZGRkRcdUZGRkRcdUZGRkRcMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6XSwgdSJhYlx1RkZGRFx1RkZGRFx1RkZGRFwwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjotMV0sIHUiXDBcdUZGRkRcdUZGRkRcdUZGRkRiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6Ml0sIHUiYVx1RkZGRFx1RkZGRCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzY6NTotMV0sIHUiIikKIAotICAgICAgICBkZWYgdGVzdF9idWZmZXJzKHNlbGYpOgotICAgICAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgInN0cmljdCIpCi0gICAgICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3VuaWNvZGVfYnVmZmVyKCJhYmMiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYnVmKSwgMysxKQorICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAiaWdub3JlIikKKyAgICAgICAgYnVmID0gY3R5cGVzLmNyZWF0ZV91bmljb2RlX2J1ZmZlcigiYWLk9vwiKQorICAgICAgICAjIGlzIHRoYXQgY29ycmVjdD8gbm90IHN1cmUuICBCdXQgd2l0aCAnaWdub3JlJywgeW91IGdldCB3aGF0IHlvdSBwYXkgZm9yLi4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOl0sIHUiYWJcMFwwXDBcMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6XSwgdSJhYlwwXDBcMFwwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjotMV0sIHUiXDBcMFwwXDBiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6Ml0sIHUiYVwwXDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls2OjU6LTFdLCB1IiIpCiAKLSAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJyZXBsYWNlIikKLSAgICAgICAgICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfdW5pY29kZV9idWZmZXIoImFi5Pb8IikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzpdLCB1ImFiXHVGRkZEXHVGRkZEXHVGRkZEXDAiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjpdLCB1ImFiXHVGRkZEXHVGRkZEXHVGRkZEXDAiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjotMV0sIHUiXDBcdUZGRkRcdUZGRkRcdUZGRkRiYSIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6OjJdLCB1ImFcdUZGRkRcdUZGRkQiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbNjo1Oi0xXSwgdSIiKQorQG5lZWRfc3ltYm9sKCdjX3djaGFyJykKK2NsYXNzIFN0cmluZ1Rlc3RDYXNlKFVuaWNvZGVUZXN0Q2FzZSk6CisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgc3VwZXIoU3RyaW5nVGVzdENhc2UsIGNscykuc2V0VXBDbGFzcygpCisgICAgICAgIGNscy5mdW5jID0gY3R5cGVzLkNETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKS5fdGVzdGZ1bmNfcF9wCiAKLSAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJpZ25vcmUiKQotICAgICAgICAgICAgYnVmID0gY3R5cGVzLmNyZWF0ZV91bmljb2RlX2J1ZmZlcigiYWLk9vwiKQotICAgICAgICAgICAgIyBpcyB0aGF0IGNvcnJlY3Q/IG5vdCBzdXJlLiAgQnV0IHdpdGggJ2lnbm9yZScsIHlvdSBnZXQgd2hhdCB5b3UgcGF5IGZvci4uCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6XSwgdSJhYlwwXDBcMFwwIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6XSwgdSJhYlwwXDBcMFwwIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6LTFdLCB1IlwwXDBcMFwwYmEiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjoyXSwgdSJhXDBcMCIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls2OjU6LTFdLCB1IiIpCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBmdW5jID0gc2VsZi5mdW5jCisgICAgICAgIHNlbGYucHJldl9jb252X21vZGUgPSBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKKyAgICAgICAgZnVuYy5hcmd0eXBlcyA9IFtjdHlwZXMuY19jaGFyX3BdCisgICAgICAgIGZ1bmMucmVzdHlwZSA9IGN0eXBlcy5jX2NoYXJfcAogCi0gICAgaW1wb3J0IF9jdHlwZXNfdGVzdAotICAgIGZ1bmMgPSBjdHlwZXMuQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pLl90ZXN0ZnVuY19wX3AKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGZ1bmMgPSBzZWxmLmZ1bmMKKyAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoKnNlbGYucHJldl9jb252X21vZGUpCisgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBOb25lCisgICAgICAgIGZ1bmMucmVzdHlwZSA9IGN0eXBlcy5jX2ludAogCi0gICAgY2xhc3MgU3RyaW5nVGVzdENhc2UoVW5pY29kZVRlc3RDYXNlKToKLSAgICAgICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICAgICAgc2VsZi5wcmV2X2NvbnZfbW9kZSA9IGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJzdHJpY3QiKQotICAgICAgICAgICAgZnVuYy5hcmd0eXBlcyA9IFtjdHlwZXMuY19jaGFyX3BdCi0gICAgICAgICAgICBmdW5jLnJlc3R5cGUgPSBjdHlwZXMuY19jaGFyX3AKKyAgICBkZWYgdGVzdF9hc2NpaV9yZXBsYWNlKHNlbGYpOgorICAgICAgICBmdW5jID0gc2VsZi5mdW5jCisgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJzdHJpY3QiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMoImFiYyIpLCAiYWJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKHUiYWJjIiksICJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjdHlwZXMuQXJndW1lbnRFcnJvciwgZnVuYywgdSJhYuQiKQogCi0gICAgICAgIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCpzZWxmLnByZXZfY29udl9tb2RlKQotICAgICAgICAgICAgZnVuYy5hcmd0eXBlcyA9IE5vbmUKLSAgICAgICAgICAgIGZ1bmMucmVzdHlwZSA9IGN0eXBlcy5jX2ludAorICAgIGRlZiB0ZXN0X2FzY2lpX2lnbm9yZShzZWxmKToKKyAgICAgICAgZnVuYyA9IHNlbGYuZnVuYworICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAiaWdub3JlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKCJhYmMiKSwgImFiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyh1ImFiYyIpLCAiYWJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKHUi5Pb83yIpLCAiIikKIAotICAgICAgICBkZWYgdGVzdF9hc2NpaV9yZXBsYWNlKHNlbGYpOgotICAgICAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgInN0cmljdCIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMoImFiYyIpLCAiYWJjIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyh1ImFiYyIpLCAiYWJjIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGN0eXBlcy5Bcmd1bWVudEVycm9yLCBmdW5jLCB1ImFi5CIpCisgICAgZGVmIHRlc3RfYXNjaWlfcmVwbGFjZShzZWxmKToKKyAgICAgICAgZnVuYyA9IHNlbGYuZnVuYworICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAicmVwbGFjZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYygiYWJjIiksICJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmModSJhYmMiKSwgImFiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyh1IuT2/N8iKSwgIj8/Pz8iKQogCi0gICAgICAgIGRlZiB0ZXN0X2FzY2lpX2lnbm9yZShzZWxmKToKLSAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJpZ25vcmUiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKCJhYmMiKSwgImFiYyIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmModSJhYmMiKSwgImFiYyIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmModSLk9vzfIiksICIiKQorICAgIGRlZiB0ZXN0X2J1ZmZlcnMoc2VsZik6CisgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJzdHJpY3QiKQorICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3N0cmluZ19idWZmZXIodSJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihidWYpLCAzKzEpCiAKLSAgICAgICAgZGVmIHRlc3RfYXNjaWlfcmVwbGFjZShzZWxmKToKLSAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJyZXBsYWNlIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYygiYWJjIiksICJhYmMiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKHUiYWJjIiksICJhYmMiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKHUi5Pb83yIpLCAiPz8/PyIpCisgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJyZXBsYWNlIikKKyAgICAgICAgYnVmID0gY3R5cGVzLmNyZWF0ZV9zdHJpbmdfYnVmZmVyKHUiYWLk9vwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6XSwgImFiPz8/XDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6Ol0sICJhYj8/P1wwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjotMV0sICJcMD8/P2JhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjoyXSwgImE/PyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzY6NTotMV0sICIiKQogCi0gICAgICAgIGRlZiB0ZXN0X2J1ZmZlcnMoc2VsZik6Ci0gICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKLSAgICAgICAgICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfc3RyaW5nX2J1ZmZlcih1ImFiYyIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihidWYpLCAzKzEpCi0KLSAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJyZXBsYWNlIikKLSAgICAgICAgICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfc3RyaW5nX2J1ZmZlcih1ImFi5Pb8IikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzpdLCAiYWI/Pz9cMCIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6Ol0sICJhYj8/P1wwIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6LTFdLCAiXDA/Pz9iYSIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6OjJdLCAiYT8/IikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzY6NTotMV0sICIiKQotCi0gICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAiaWdub3JlIikKLSAgICAgICAgICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfc3RyaW5nX2J1ZmZlcih1ImFi5Pb8IikKLSAgICAgICAgICAgICMgaXMgdGhhdCBjb3JyZWN0PyBub3Qgc3VyZS4gIEJ1dCB3aXRoICdpZ25vcmUnLCB5b3UgZ2V0IHdoYXQgeW91IHBheSBmb3IuLgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOl0sICJhYlwwXDBcMFwwIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6XSwgImFiXDBcMFwwXDAiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjotMV0sICJcMFwwXDBcMGJhIikKKyAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgImlnbm9yZSIpCisgICAgICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfc3RyaW5nX2J1ZmZlcih1ImFi5Pb8IikKKyAgICAgICAgIyBpcyB0aGF0IGNvcnJlY3Q/IG5vdCBzdXJlLiAgQnV0IHdpdGggJ2lnbm9yZScsIHlvdSBnZXQgd2hhdCB5b3UgcGF5IGZvci4uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzpdLCAiYWJcMFwwXDBcMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6XSwgImFiXDBcMFwwXDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6Oi0xXSwgIlwwXDBcMFwwYmEiKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdmFsdWVzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdmFsdWVzLnB5CmluZGV4IDRjYmZkNGIuLjE0ZDY5ZmUgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3ZhbHVlcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF92YWx1ZXMucHkKQEAgLTMsNiArMyw3IEBACiAiIiIKIAogaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3lzCiBmcm9tIGN0eXBlcyBpbXBvcnQgKgogCiBpbXBvcnQgX2N0eXBlc190ZXN0CkBAIC0yMSw2MiArMjIsNjMgQEAKICAgICAgICAgY3RkbGwgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY19pbnQuaW5fZGxsLCBjdGRsbCwgIlVuZGVmaW5lZF9TeW1ib2wiKQogCi0gICAgY2xhc3MgV2luX1ZhbHVlc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICAgICAgIiIiVGhpcyB0ZXN0IG9ubHkgd29ya3Mgd2hlbiBweXRob24gaXRzZWxmIGlzIGEgZGxsL3NoYXJlZCBsaWJyYXJ5IiIiCitAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJywgJ1dpbmRvd3Mtc3BlY2lmaWMgdGVzdCcpCitjbGFzcyBXaW5fVmFsdWVzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRoaXMgdGVzdCBvbmx5IHdvcmtzIHdoZW4gcHl0aG9uIGl0c2VsZiBpcyBhIGRsbC9zaGFyZWQgbGlicmFyeSIiIgogCi0gICAgICAgIGRlZiB0ZXN0X29wdGltaXplZmxhZyhzZWxmKToKLSAgICAgICAgICAgICMgVGhpcyB0ZXN0IGFjY2Vzc2VzIHRoZSBQeV9PcHRpbWl6ZUZsYWcgaW50Z2VyLCB3aGljaCBpcwotICAgICAgICAgICAgIyBleHBvcnRlZCBieSB0aGUgUHl0aG9uIGRsbC4KKyAgICBkZWYgdGVzdF9vcHRpbWl6ZWZsYWcoc2VsZik6CisgICAgICAgICMgVGhpcyB0ZXN0IGFjY2Vzc2VzIHRoZSBQeV9PcHRpbWl6ZUZsYWcgaW50Z2VyLCB3aGljaCBpcworICAgICAgICAjIGV4cG9ydGVkIGJ5IHRoZSBQeXRob24gZGxsLgogCi0gICAgICAgICAgICAjIEl0J3MgdmFsdWUgaXMgc2V0IGRlcGVuZGluZyBvbiB0aGUgLU8gYW5kIC1PTyBmbGFnczoKLSAgICAgICAgICAgICMgaWYgbm90IGdpdmVuLCBpdCBpcyAwIGFuZCBfX2RlYnVnX18gaXMgMS4KLSAgICAgICAgICAgICMgSWYgLU8gaXMgZ2l2ZW4sIHRoZSBmbGFnIGlzIDEsIGZvciAtT08gaXQgaXMgMi4KLSAgICAgICAgICAgICMgZG9jc3RyaW5ncyBhcmUgYWxzbyByZW1vdmVkIGluIHRoZSBsYXR0ZXIgY2FzZS4KLSAgICAgICAgICAgIG9wdCA9IGNfaW50LmluX2RsbChweWRsbCwgIlB5X09wdGltaXplRmxhZyIpLnZhbHVlCi0gICAgICAgICAgICBpZiBfX2RlYnVnX186Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHQsIDApCi0gICAgICAgICAgICBlbGlmIFZhbHVlc1Rlc3RDYXNlLl9fZG9jX18gaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHQsIDEpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0LCAyKQorICAgICAgICAjIEl0J3MgdmFsdWUgaXMgc2V0IGRlcGVuZGluZyBvbiB0aGUgLU8gYW5kIC1PTyBmbGFnczoKKyAgICAgICAgIyBpZiBub3QgZ2l2ZW4sIGl0IGlzIDAgYW5kIF9fZGVidWdfXyBpcyAxLgorICAgICAgICAjIElmIC1PIGlzIGdpdmVuLCB0aGUgZmxhZyBpcyAxLCBmb3IgLU9PIGl0IGlzIDIuCisgICAgICAgICMgZG9jc3RyaW5ncyBhcmUgYWxzbyByZW1vdmVkIGluIHRoZSBsYXR0ZXIgY2FzZS4KKyAgICAgICAgb3B0ID0gY19pbnQuaW5fZGxsKHB5dGhvbmFwaSwgIlB5X09wdGltaXplRmxhZyIpLnZhbHVlCisgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0LCAwKQorICAgICAgICBlbGlmIFZhbHVlc1Rlc3RDYXNlLl9fZG9jX18gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdCwgMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0LCAyKQogCi0gICAgICAgIGRlZiB0ZXN0X2Zyb3plbnRhYmxlKHNlbGYpOgotICAgICAgICAgICAgIyBQeXRob24gZXhwb3J0cyBhIFB5SW1wb3J0X0Zyb3plbk1vZHVsZXMgc3ltYm9sLiBUaGlzIGlzIGEKLSAgICAgICAgICAgICMgcG9pbnRlciB0byBhbiBhcnJheSBvZiBzdHJ1Y3QgX2Zyb3plbiBlbnRyaWVzLiAgVGhlIGVuZCBvZiB0aGUKLSAgICAgICAgICAgICMgYXJyYXkgaXMgbWFya2VkIGJ5IGFuIGVudHJ5IGNvbnRhaW5pbmcgYSBOVUxMIG5hbWUgYW5kIHplcm8KLSAgICAgICAgICAgICMgc2l6ZS4KKyAgICBkZWYgdGVzdF9mcm96ZW50YWJsZShzZWxmKToKKyAgICAgICAgIyBQeXRob24gZXhwb3J0cyBhIFB5SW1wb3J0X0Zyb3plbk1vZHVsZXMgc3ltYm9sLiBUaGlzIGlzIGEKKyAgICAgICAgIyBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHN0cnVjdCBfZnJvemVuIGVudHJpZXMuICBUaGUgZW5kIG9mIHRoZQorICAgICAgICAjIGFycmF5IGlzIG1hcmtlZCBieSBhbiBlbnRyeSBjb250YWluaW5nIGEgTlVMTCBuYW1lIGFuZCB6ZXJvCisgICAgICAgICMgc2l6ZS4KIAotICAgICAgICAgICAgIyBJbiBzdGFuZGFyZCBQeXRob24sIHRoaXMgdGFibGUgY29udGFpbnMgYSBfX2hlbGxvX18KLSAgICAgICAgICAgICMgbW9kdWxlLCBhbmQgYSBfX3BoZWxsb19fIHBhY2thZ2UgY29udGFpbmluZyBhIHNwYW0KLSAgICAgICAgICAgICMgbW9kdWxlLgotICAgICAgICAgICAgY2xhc3Mgc3RydWN0X2Zyb3plbihTdHJ1Y3R1cmUpOgotICAgICAgICAgICAgICAgIF9maWVsZHNfID0gWygibmFtZSIsIGNfY2hhcl9wKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImNvZGUiLCBQT0lOVEVSKGNfdWJ5dGUpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInNpemUiLCBjX2ludCldCi0gICAgICAgICAgICBGcm96ZW5UYWJsZSA9IFBPSU5URVIoc3RydWN0X2Zyb3plbikKKyAgICAgICAgIyBJbiBzdGFuZGFyZCBQeXRob24sIHRoaXMgdGFibGUgY29udGFpbnMgYSBfX2hlbGxvX18KKyAgICAgICAgIyBtb2R1bGUsIGFuZCBhIF9fcGhlbGxvX18gcGFja2FnZSBjb250YWluaW5nIGEgc3BhbQorICAgICAgICAjIG1vZHVsZS4KKyAgICAgICAgY2xhc3Mgc3RydWN0X2Zyb3plbihTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJuYW1lIiwgY19jaGFyX3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJjb2RlIiwgUE9JTlRFUihjX3VieXRlKSksCisgICAgICAgICAgICAgICAgICAgICAgICAoInNpemUiLCBjX2ludCldCisgICAgICAgIEZyb3plblRhYmxlID0gUE9JTlRFUihzdHJ1Y3RfZnJvemVuKQogCi0gICAgICAgICAgICBmdCA9IEZyb3plblRhYmxlLmluX2RsbChweWRsbCwgIlB5SW1wb3J0X0Zyb3plbk1vZHVsZXMiKQotICAgICAgICAgICAgIyBmdCBpcyBhIHBvaW50ZXIgdG8gdGhlIHN0cnVjdF9mcm96ZW4gZW50cmllczoKLSAgICAgICAgICAgIGl0ZW1zID0gW10KLSAgICAgICAgICAgIGZvciBlbnRyeSBpbiBmdDoKLSAgICAgICAgICAgICAgICAjIFRoaXMgaXMgZGFuZ2Vyb3VzLiBXZSAqY2FuKiBpdGVyYXRlIG92ZXIgYSBwb2ludGVyLCBidXQKLSAgICAgICAgICAgICAgICAjIHRoZSBsb29wIHdpbGwgbm90IHRlcm1pbmF0ZSAobWF5YmUgd2l0aCBhbiBhY2Nlc3MKLSAgICAgICAgICAgICAgICAjIHZpb2xhdGlvbjstKSBiZWNhdXNlIHRoZSBwb2ludGVyIGluc3RhbmNlIGhhcyBubyBzaXplLgotICAgICAgICAgICAgICAgIGlmIGVudHJ5Lm5hbWUgaXMgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICBpdGVtcy5hcHBlbmQoKGVudHJ5Lm5hbWUsIGVudHJ5LnNpemUpKQotICAgICAgICAgICAgaW1wb3J0IHN5cwotICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPj0gKDIsIDMpOgotICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gWygiX19oZWxsb19fIiwgMTA0KSwgKCJfX3BoZWxsb19fIiwgLTEwNCksICgiX19waGVsbG9fXy5zcGFtIiwgMTA0KV0KLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBbKCJfX2hlbGxvX18iLCAxMDApLCAoIl9fcGhlbGxvX18iLCAtMTAwKSwgKCJfX3BoZWxsb19fLnNwYW0iLCAxMDApXQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpdGVtcywgZXhwZWN0ZWQpCisgICAgICAgIGZ0ID0gRnJvemVuVGFibGUuaW5fZGxsKHB5dGhvbmFwaSwgIlB5SW1wb3J0X0Zyb3plbk1vZHVsZXMiKQorICAgICAgICAjIGZ0IGlzIGEgcG9pbnRlciB0byB0aGUgc3RydWN0X2Zyb3plbiBlbnRyaWVzOgorICAgICAgICBpdGVtcyA9IFtdCisgICAgICAgIGZvciBlbnRyeSBpbiBmdDoKKyAgICAgICAgICAgICMgVGhpcyBpcyBkYW5nZXJvdXMuIFdlICpjYW4qIGl0ZXJhdGUgb3ZlciBhIHBvaW50ZXIsIGJ1dAorICAgICAgICAgICAgIyB0aGUgbG9vcCB3aWxsIG5vdCB0ZXJtaW5hdGUgKG1heWJlIHdpdGggYW4gYWNjZXNzCisgICAgICAgICAgICAjIHZpb2xhdGlvbjstKSBiZWNhdXNlIHRoZSBwb2ludGVyIGluc3RhbmNlIGhhcyBubyBzaXplLgorICAgICAgICAgICAgaWYgZW50cnkubmFtZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpdGVtcy5hcHBlbmQoKGVudHJ5Lm5hbWUsIGVudHJ5LnNpemUpKQogCi0gICAgICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgX3BvaW50ZXJfdHlwZV9jYWNoZQotICAgICAgICAgICAgZGVsIF9wb2ludGVyX3R5cGVfY2FjaGVbc3RydWN0X2Zyb3plbl0KKyAgICAgICAgZXhwZWN0ZWQgPSBbKCJfX2hlbGxvX18iLCAxMDQpLAorICAgICAgICAgICAgICAgICAgICAoIl9fcGhlbGxvX18iLCAtMTA0KSwKKyAgICAgICAgICAgICAgICAgICAgKCJfX3BoZWxsb19fLnNwYW0iLCAxMDQpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGl0ZW1zLCBleHBlY3RlZCkKIAotICAgICAgICBkZWYgdGVzdF91bmRlZmluZWQoc2VsZik6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjX2ludC5pbl9kbGwsIHB5ZGxsLCAiVW5kZWZpbmVkX1N5bWJvbCIpCisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBfcG9pbnRlcl90eXBlX2NhY2hlCisgICAgICAgIGRlbCBfcG9pbnRlcl90eXBlX2NhY2hlW3N0cnVjdF9mcm96ZW5dCisKKyAgICBkZWYgdGVzdF91bmRlZmluZWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNfaW50LmluX2RsbCwgcHl0aG9uYXBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5kZWZpbmVkX1N5bWJvbCIpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF93aW4zMi5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3dpbjMyLnB5CmluZGV4IDI1MzRhNzQuLjJkZDdiNDUgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3dpbjMyLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3dpbjMyLnB5CkBAIC0xLDc0ICsxLDgyIEBACiAjIFdpbmRvd3Mgc3BlY2lmaWMgdGVzdHMKIAogZnJvbSBjdHlwZXMgaW1wb3J0ICoKLWZyb20gY3R5cGVzLnRlc3QgaW1wb3J0IGlzX3Jlc291cmNlX2VuYWJsZWQKK2Zyb20gY3R5cGVzLnRlc3QgaW1wb3J0IHJlcXVpcmVzCiBpbXBvcnQgdW5pdHRlc3QsIHN5cworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQgYXMgc3VwcG9ydAogCiBpbXBvcnQgX2N0eXBlc190ZXN0CiAKLWlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiIGFuZCBzaXplb2YoY192b2lkX3ApID09IHNpemVvZihjX2ludCk6Ci0gICAgIyBPbmx5IHdpbmRvd3MgMzItYml0IGhhcyBkaWZmZXJlbnQgY2FsbGluZyBjb252ZW50aW9ucy4KKyMgT25seSB3aW5kb3dzIDMyLWJpdCBoYXMgZGlmZmVyZW50IGNhbGxpbmcgY29udmVudGlvbnMuCitAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwgJ1dpbmRvd3Mtc3BlY2lmaWMgdGVzdCcpCitAdW5pdHRlc3Quc2tpcFVubGVzcyhzaXplb2YoY192b2lkX3ApID09IHNpemVvZihjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAic2l6ZW9mIGNfdm9pZF9wIGFuZCBjX2ludCBkaWZmZXIiKQorY2xhc3MgV2luZG93c1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9jYWxsY29udl8xKHNlbGYpOgorICAgICAgICAjIFRlc3Rpbmcgc3RkY2FsbCBmdW5jdGlvbgogCi0gICAgY2xhc3MgV2luZG93c1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICAgICAgZGVmIHRlc3RfY2FsbGNvbnZfMShzZWxmKToKLSAgICAgICAgICAgICMgVGVzdGluZyBzdGRjYWxsIGZ1bmN0aW9uCisgICAgICAgIElzV2luZG93ID0gd2luZGxsLnVzZXIzMi5Jc1dpbmRvdworICAgICAgICAjIFZhbHVlRXJyb3I6IFByb2NlZHVyZSBwcm9iYWJseSBjYWxsZWQgd2l0aCBub3QgZW5vdWdoIGFyZ3VtZW50cworICAgICAgICAjICg0IGJ5dGVzIG1pc3NpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIElzV2luZG93KQogCi0gICAgICAgICAgICBJc1dpbmRvdyA9IHdpbmRsbC51c2VyMzIuSXNXaW5kb3cKLSAgICAgICAgICAgICMgVmFsdWVFcnJvcjogUHJvY2VkdXJlIHByb2JhYmx5IGNhbGxlZCB3aXRoIG5vdCBlbm91Z2ggYXJndW1lbnRzICg0IGJ5dGVzIG1pc3NpbmcpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBJc1dpbmRvdykKKyAgICAgICAgIyBUaGlzIG9uZSBzaG91bGQgc3VjY2VlZC4uLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIElzV2luZG93KDApKQogCi0gICAgICAgICAgICAjIFRoaXMgb25lIHNob3VsZCBzdWNjZWVkLi4uCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIElzV2luZG93KDApKQorICAgICAgICAjIFZhbHVlRXJyb3I6IFByb2NlZHVyZSBwcm9iYWJseSBjYWxsZWQgd2l0aCB0b28gbWFueSBhcmd1bWVudHMKKyAgICAgICAgIyAoOCBieXRlcyBpbiBleGNlc3MpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIElzV2luZG93LCAwLCAwLCAwKQogCi0gICAgICAgICAgICAjIFZhbHVlRXJyb3I6IFByb2NlZHVyZSBwcm9iYWJseSBjYWxsZWQgd2l0aCB0b28gbWFueSBhcmd1bWVudHMgKDggYnl0ZXMgaW4gZXhjZXNzKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgSXNXaW5kb3csIDAsIDAsIDApCisgICAgZGVmIHRlc3RfY2FsbGNvbnZfMihzZWxmKToKKyAgICAgICAgIyBDYWxsaW5nIHN0ZGNhbGwgZnVuY3Rpb24gYXMgY2RlY2wKIAotICAgICAgICBkZWYgdGVzdF9jYWxsY29udl8yKHNlbGYpOgotICAgICAgICAgICAgIyBDYWxsaW5nIHN0ZGNhbGwgZnVuY3Rpb24gYXMgY2RlY2wKKyAgICAgICAgSXNXaW5kb3cgPSBjZGxsLnVzZXIzMi5Jc1dpbmRvdwogCi0gICAgICAgICAgICBJc1dpbmRvdyA9IGNkbGwudXNlcjMyLklzV2luZG93CisgICAgICAgICMgVmFsdWVFcnJvcjogUHJvY2VkdXJlIGNhbGxlZCB3aXRoIG5vdCBlbm91Z2ggYXJndW1lbnRzCisgICAgICAgICMgKDQgYnl0ZXMgbWlzc2luZykgb3Igd3JvbmcgY2FsbGluZyBjb252ZW50aW9uCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIElzV2luZG93LCBOb25lKQogCi0gICAgICAgICAgICAjIFZhbHVlRXJyb3I6IFByb2NlZHVyZSBjYWxsZWQgd2l0aCBub3QgZW5vdWdoIGFyZ3VtZW50cyAoNCBieXRlcyBtaXNzaW5nKQotICAgICAgICAgICAgIyBvciB3cm9uZyBjYWxsaW5nIGNvbnZlbnRpb24KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIElzV2luZG93LCBOb25lKQorQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIsICdXaW5kb3dzLXNwZWNpZmljIHRlc3QnKQorY2xhc3MgRnVuY3Rpb25DYWxsVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKCdNU0MnIGluIHN5cy52ZXJzaW9uLCAiU0VIIG9ubHkgc3VwcG9ydGVkIGJ5IE1TQyIpCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMuZXhlY3V0YWJsZS5lbmRzd2l0aCgnX2QuZXhlJyksCisgICAgICAgICAgICAgICAgICAgICAiU0VIIG5vdCBlbmFibGVkIGluIGRlYnVnIGJ1aWxkcyIpCisgICAgZGVmIHRlc3RfU0VIKHNlbGYpOgorICAgICAgICByZXF1aXJlcygiU0VIIikKKyAgICAgICAgIyBDYWxsIGZ1bmN0aW9ucyB3aXRoIGludmFsaWQgYXJndW1lbnRzLCBhbmQgbWFrZSBzdXJlCisgICAgICAgICMgdGhhdCBhY2Nlc3MgdmlvbGF0aW9ucyBhcmUgdHJhcHBlZCBhbmQgcmFpc2UgYW4KKyAgICAgICAgIyBleGNlcHRpb24uCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFdpbmRvd3NFcnJvciwgd2luZGxsLmtlcm5lbDMyLkdldE1vZHVsZUhhbmRsZUEsIDMyKQogCi1pZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKLSAgICBjbGFzcyBGdW5jdGlvbkNhbGxUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Rfbm9hcmdzKHNlbGYpOgorICAgICAgICAjIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2Ugb24gd2luMzIgeDY0CisgICAgICAgIHdpbmRsbC51c2VyMzIuR2V0RGVza3RvcFdpbmRvdygpCiAKLSAgICAgICAgaWYgaXNfcmVzb3VyY2VfZW5hYmxlZCgiU0VIIik6Ci0gICAgICAgICAgICBkZWYgdGVzdF9TRUgoc2VsZik6Ci0gICAgICAgICAgICAgICAgIyBDYWxsIGZ1bmN0aW9ucyB3aXRoIGludmFsaWQgYXJndW1lbnRzLCBhbmQgbWFrZSBzdXJlCi0gICAgICAgICAgICAgICAgIyB0aGF0IGFjY2VzcyB2aW9sYXRpb25zIGFyZSB0cmFwcGVkIGFuZCByYWlzZSBhbgotICAgICAgICAgICAgICAgICMgZXhjZXB0aW9uLgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFdpbmRvd3NFcnJvciwgd2luZGxsLmtlcm5lbDMyLkdldE1vZHVsZUhhbmRsZUEsIDMyKQorQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIsICdXaW5kb3dzLXNwZWNpZmljIHRlc3QnKQorY2xhc3MgVGVzdFdpbnR5cGVzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9IV05EKHNlbGYpOgorICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgd2ludHlwZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2Yod2ludHlwZXMuSFdORCksIHNpemVvZihjX3ZvaWRfcCkpCiAKLSAgICAgICAgZGVmIHRlc3Rfbm9hcmdzKHNlbGYpOgotICAgICAgICAgICAgIyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIG9uIHdpbjMyIHg2NAotICAgICAgICAgICAgd2luZGxsLnVzZXIzMi5HZXREZXNrdG9wV2luZG93KCkKKyAgICBkZWYgdGVzdF9QQVJBTShzZWxmKToKKyAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IHdpbnR5cGVzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKHdpbnR5cGVzLldQQVJBTSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjX3ZvaWRfcCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKHdpbnR5cGVzLkxQQVJBTSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjX3ZvaWRfcCkpCiAKLSAgICBjbGFzcyBUZXN0V2ludHlwZXModW5pdHRlc3QuVGVzdENhc2UpOgotICAgICAgICBkZWYgdGVzdF9IV05EKHNlbGYpOgotICAgICAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IHdpbnR5cGVzCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZih3aW50eXBlcy5IV05EKSwgc2l6ZW9mKGNfdm9pZF9wKSkKKyAgICBkZWYgdGVzdF9DT01FcnJvcihzZWxmKToKKyAgICAgICAgZnJvbSBfY3R5cGVzIGltcG9ydCBDT01FcnJvcgorICAgICAgICBpZiBzdXBwb3J0LkhBVkVfRE9DU1RSSU5HUzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ09NRXJyb3IuX19kb2NfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJhaXNlZCB3aGVuIGEgQ09NIG1ldGhvZCBjYWxsIGZhaWxlZC4iKQogCi0gICAgICAgIGRlZiB0ZXN0X1BBUkFNKHNlbGYpOgotICAgICAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IHdpbnR5cGVzCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZih3aW50eXBlcy5XUEFSQU0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNfdm9pZF9wKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKHdpbnR5cGVzLkxQQVJBTSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY192b2lkX3ApKQotCi0gICAgICAgIGRlZiB0ZXN0X0NPTUVycm9yKHNlbGYpOgotICAgICAgICAgICAgZnJvbSBfY3R5cGVzIGltcG9ydCBDT01FcnJvcgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDT01FcnJvci5fX2RvY19fLCAiUmFpc2VkIHdoZW4gYSBDT00gbWV0aG9kIGNhbGwgZmFpbGVkLiIpCi0KLSAgICAgICAgICAgIGV4ID0gQ09NRXJyb3IoLTEsICJ0ZXh0IiwgKCJkZXRhaWxzIiwpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleC5ocmVzdWx0LCAtMSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXgudGV4dCwgInRleHQiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleC5kZXRhaWxzLCAoImRldGFpbHMiLCkpCisgICAgICAgIGV4ID0gQ09NRXJyb3IoLTEsICJ0ZXh0IiwgKCJkZXRhaWxzIiwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4LmhyZXN1bHQsIC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4LnRleHQsICJ0ZXh0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleC5kZXRhaWxzLCAoImRldGFpbHMiLCkpCiAKIGNsYXNzIFN0cnVjdHVyZXModW5pdHRlc3QuVGVzdENhc2UpOgotCiAgICAgZGVmIHRlc3Rfc3RydWN0X2J5X3ZhbHVlKHNlbGYpOgogICAgICAgICBjbGFzcyBQT0lOVChTdHJ1Y3R1cmUpOgogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19sb25nKSwKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3dpbnR5cGVzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfd2ludHlwZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE0NDJkZgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3dpbnR5cGVzLnB5CkBAIC0wLDAgKzEsNDEgQEAKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIGN0eXBlcyBpbXBvcnQgKgorCitAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnd2luJyksICdXaW5kb3dzLW9ubHkgdGVzdCcpCitjbGFzcyBXaW5UeXBlc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3ZhcmlhbnRfYm9vbChzZWxmKToKKyAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IHdpbnR5cGVzCisgICAgICAgICMgcmVhZHMgMTYtYml0cyBmcm9tIG1lbW9yeSwgYW55dGhpbmcgbm9uLXplcm8gaXMgVHJ1ZQorICAgICAgICBmb3IgdHJ1ZV92YWx1ZSBpbiAoMSwgMzI3NjcsIDMyNzY4LCA2NTUzNSwgNjU1MzcpOgorICAgICAgICAgICAgdHJ1ZSA9IFBPSU5URVIoY19pbnQxNikoY19pbnQxNih0cnVlX3ZhbHVlKSkKKyAgICAgICAgICAgIHZhbHVlID0gY2FzdCh0cnVlLCBQT0lOVEVSKHdpbnR5cGVzLlZBUklBTlRfQk9PTCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIodmFsdWUuY29udGVudHMpLCAnVkFSSUFOVF9CT09MKFRydWUpJykKKworICAgICAgICAgICAgdmIgPSB3aW50eXBlcy5WQVJJQU5UX0JPT0woKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh2Yi52YWx1ZSwgRmFsc2UpCisgICAgICAgICAgICB2Yi52YWx1ZSA9IFRydWUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModmIudmFsdWUsIFRydWUpCisgICAgICAgICAgICB2Yi52YWx1ZSA9IHRydWVfdmFsdWUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModmIudmFsdWUsIFRydWUpCisKKyAgICAgICAgZm9yIGZhbHNlX3ZhbHVlIGluICgwLCA2NTUzNiwgMjYyMTQ0LCAyKiozMyk6CisgICAgICAgICAgICBmYWxzZSA9IFBPSU5URVIoY19pbnQxNikoY19pbnQxNihmYWxzZV92YWx1ZSkpCisgICAgICAgICAgICB2YWx1ZSA9IGNhc3QoZmFsc2UsIFBPSU5URVIod2ludHlwZXMuVkFSSUFOVF9CT09MKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih2YWx1ZS5jb250ZW50cyksICdWQVJJQU5UX0JPT0woRmFsc2UpJykKKworICAgICAgICAjIGFsbG93IGFueSBib29sIGNvbnZlcnNpb24gb24gYXNzaWdubWVudCB0byB2YWx1ZQorICAgICAgICBmb3Igc2V0X3ZhbHVlIGluICg2NTUzNiwgMjYyMTQ0LCAyKiozMyk6CisgICAgICAgICAgICB2YiA9IHdpbnR5cGVzLlZBUklBTlRfQk9PTCgpCisgICAgICAgICAgICB2Yi52YWx1ZSA9IHNldF92YWx1ZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh2Yi52YWx1ZSwgVHJ1ZSkKKworICAgICAgICB2YiA9IHdpbnR5cGVzLlZBUklBTlRfQk9PTCgpCisgICAgICAgIHZiLnZhbHVlID0gWzIsIDNdCisgICAgICAgIHNlbGYuYXNzZXJ0SXModmIudmFsdWUsIFRydWUpCisgICAgICAgIHZiLnZhbHVlID0gW10KKyAgICAgICAgc2VsZi5hc3NlcnRJcyh2Yi52YWx1ZSwgRmFsc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3V0aWwucHkgYi9MaWIvY3R5cGVzL3V0aWwucHkKaW5kZXggNTJiMzUyMC4uZmUwZWQwYSAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy91dGlsLnB5CisrKyBiL0xpYi9jdHlwZXMvdXRpbC5weQpAQCAtOTMsNyArOTMsNyBAQAogICAgICAgICBmZG91dCwgY2NvdXQgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKICAgICAgICAgb3MuY2xvc2UoZmRvdXQpCiAgICAgICAgIGNtZCA9ICdpZiB0eXBlIGdjYyA+L2Rldi9udWxsIDI+JjE7IHRoZW4gQ0M9Z2NjOyBlbGlmIHR5cGUgY2MgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIENDPWNjO2Vsc2UgZXhpdCAxMDsgZmk7JyBcCi0gICAgICAgICAgICAgICckQ0MgLVdsLC10IC1vICcgKyBjY291dCArICcgMj4mMSAtbCcgKyBuYW1lCisgICAgICAgICAgICAgICdMQU5HPUMgTENfQUxMPUMgJENDIC1XbCwtdCAtbyAnICsgY2NvdXQgKyAnIDI+JjEgLWwnICsgbmFtZQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBmID0gb3MucG9wZW4oY21kKQogICAgICAgICAgICAgdHJ5OgpAQCAtMTgwLDI5ICsxODAsMzYgQEAKICAgICAgICAgICAgIHJlcy5zb3J0KGNtcD0gbGFtYmRhIHgseTogY21wKF9udW1fdmVyc2lvbih4KSwgX251bV92ZXJzaW9uKHkpKSkKICAgICAgICAgICAgIHJldHVybiByZXNbLTFdCiAKLSAgICBlbHNlOgorICAgIGVsaWYgc3lzLnBsYXRmb3JtID09ICJzdW5vczUiOgogCi0gICAgICAgIGRlZiBfZmluZExpYl9sZGNvbmZpZyhuYW1lKToKLSAgICAgICAgICAgICMgWFhYIGFzc3VtaW5nIEdMSUJDJ3MgbGRjb25maWcgKHdpdGggb3B0aW9uIC1wKQotICAgICAgICAgICAgZXhwciA9IHInL1teXChcKVxzXSpsaWIlc1wuW15cKFwpXHNdKicgJSByZS5lc2NhcGUobmFtZSkKLSAgICAgICAgICAgIGYgPSBvcy5wb3BlbignTENfQUxMPUMgTEFORz1DIC9zYmluL2xkY29uZmlnIC1wIDI+L2Rldi9udWxsJykKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICByZXMgPSByZS5zZWFyY2goZXhwciwgZGF0YSkKLSAgICAgICAgICAgIGlmIG5vdCByZXM6Ci0gICAgICAgICAgICAgICAgIyBIbSwgdGhpcyB3b3JrcyBvbmx5IGZvciBsaWJzIG5lZWRlZCBieSB0aGUgcHl0aG9uIGV4ZWN1dGFibGUuCi0gICAgICAgICAgICAgICAgY21kID0gJ2xkZCAlcyAyPi9kZXYvbnVsbCcgJSBzeXMuZXhlY3V0YWJsZQotICAgICAgICAgICAgICAgIGYgPSBvcy5wb3BlbihjbWQpCi0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKLSAgICAgICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgICAgICByZXMgPSByZS5zZWFyY2goZXhwciwgZGF0YSkKLSAgICAgICAgICAgICAgICBpZiBub3QgcmVzOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICAgICAgcmV0dXJuIHJlcy5ncm91cCgwKQorICAgICAgICBkZWYgX2ZpbmRMaWJfY3JsZShuYW1lLCBpczY0KToKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cygnL3Vzci9iaW4vY3JsZScpOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgICAgIGlmIGlzNjQ6CisgICAgICAgICAgICAgICAgY21kID0gJ2VudiBMQ19BTEw9QyAvdXNyL2Jpbi9jcmxlIC02NCAyPi9kZXYvbnVsbCcKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY21kID0gJ2VudiBMQ19BTEw9QyAvdXNyL2Jpbi9jcmxlIDI+L2Rldi9udWxsJworCisgICAgICAgICAgICBmb3IgbGluZSBpbiBvcy5wb3BlbihjbWQpLnJlYWRsaW5lcygpOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKKyAgICAgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJ0RlZmF1bHQgTGlicmFyeSBQYXRoIChFTEYpOicpOgorICAgICAgICAgICAgICAgICAgICBwYXRocyA9IGxpbmUuc3BsaXQoKVs0XQorCisgICAgICAgICAgICBpZiBub3QgcGF0aHM6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICAgICAgZm9yIGRpciBpbiBwYXRocy5zcGxpdCgiOiIpOgorICAgICAgICAgICAgICAgIGxpYmZpbGUgPSBvcy5wYXRoLmpvaW4oZGlyLCAibGliJXMuc28iICUgbmFtZSkKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhsaWJmaWxlKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpYmZpbGUKKworICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBkZWYgZmluZF9saWJyYXJ5KG5hbWUsIGlzNjQgPSBGYWxzZSk6CisgICAgICAgICAgICByZXR1cm4gX2dldF9zb25hbWUoX2ZpbmRMaWJfY3JsZShuYW1lLCBpczY0KSBvciBfZmluZExpYl9nY2MobmFtZSkpCisKKyAgICBlbHNlOgogCiAgICAgICAgIGRlZiBfZmluZFNvbmFtZV9sZGNvbmZpZyhuYW1lKToKICAgICAgICAgICAgIGltcG9ydCBzdHJ1Y3QKQEAgLTIyMCw4ICsyMjcsNyBAQAogICAgICAgICAgICAgYWJpX3R5cGUgPSBtYWNoX21hcC5nZXQobWFjaGluZSwgJ2xpYmM2JykKIAogICAgICAgICAgICAgIyBYWFggYXNzdW1pbmcgR0xJQkMncyBsZGNvbmZpZyAod2l0aCBvcHRpb24gLXApCi0gICAgICAgICAgICBleHByID0gcicoXFMrKVxzK1woKCVzKD86LCBPUyBBQkk6W15cKV0qKT8pXClbXi9dKigvW15cKFwpXHNdKmxpYiVzXC5bXlwoXClcc10qKScgXAotICAgICAgICAgICAgICAgICAgICUgKGFiaV90eXBlLCByZS5lc2NhcGUobmFtZSkpCisgICAgICAgICAgICBleHByID0gcidccysobGliJXNcLlteXHNdKylccytcKCVzJyAlIChyZS5lc2NhcGUobmFtZSksIGFiaV90eXBlKQogICAgICAgICAgICAgZiA9IG9zLnBvcGVuKCcvc2Jpbi9sZGNvbmZpZyAtcCAyPi9kZXYvbnVsbCcpCiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCmRpZmYgLS1naXQgYS9MaWIvY3Vyc2VzL19faW5pdF9fLnB5IGIvTGliL2N1cnNlcy9fX2luaXRfXy5weQppbmRleCBiZDdkNWY2Li5lY2Y1OWRlIDEwMDY0NAotLS0gYS9MaWIvY3Vyc2VzL19faW5pdF9fLnB5CisrKyBiL0xpYi9jdXJzZXMvX19pbml0X18ucHkKQEAgLTUsNyArNSw3IEBACiAKICAgIGltcG9ydCBjdXJzZXMKICAgIGZyb20gY3Vyc2VzIGltcG9ydCB0ZXh0cGFkCi0gICBjdXJzZXMuaW5pdHdpbigpCisgICBjdXJzZXMuaW5pdHNjcigpCiAgICAuLi4KIAogIiIiCmRpZmYgLS1naXQgYS9MaWIvZGVjaW1hbC5weSBiL0xpYi9kZWNpbWFsLnB5CmluZGV4IDNjYjNiODAuLjA0YmY1YzIgMTAwNjQ0Ci0tLSBhL0xpYi9kZWNpbWFsLnB5CisrKyBiL0xpYi9kZWNpbWFsLnB5CkBAIC0yNSw3ICsyNSw3IEBACiAKIGFuZCBJRUVFIHN0YW5kYXJkIDg1NC0xOTg3OgogCi0gICAgd3d3LmNzLmJlcmtlbGV5LmVkdS9+ZWpyL3Byb2plY3RzLzc1NC9wcml2YXRlL2RyYWZ0cy84NTQtMTk4Ny9kaXIuaHRtbAorICAgIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSUVFRV84NTQtMTk4NwogCiBEZWNpbWFsIGZsb2F0aW5nIHBvaW50IGhhcyBmaW5pdGUgcHJlY2lzaW9uIHdpdGggYXJiaXRyYXJpbHkgbGFyZ2UgYm91bmRzLgogCkBAIC0xNTgxLDcgKzE1ODEsMTMgQEAKIAogICAgIGRlZiBfX2Zsb2F0X18oc2VsZik6CiAgICAgICAgICIiIkZsb2F0IHJlcHJlc2VudGF0aW9uLiIiIgotICAgICAgICByZXR1cm4gZmxvYXQoc3RyKHNlbGYpKQorICAgICAgICBpZiBzZWxmLl9pc25hbigpOgorICAgICAgICAgICAgaWYgc2VsZi5pc19zbmFuKCk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQ2Fubm90IGNvbnZlcnQgc2lnbmFsaW5nIE5hTiB0byBmbG9hdCIpCisgICAgICAgICAgICBzID0gIi1uYW4iIGlmIHNlbGYuX3NpZ24gZWxzZSAibmFuIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcyA9IHN0cihzZWxmKQorICAgICAgICByZXR1cm4gZmxvYXQocykKIAogICAgIGRlZiBfX2ludF9fKHNlbGYpOgogICAgICAgICAiIiJDb252ZXJ0cyBzZWxmIHRvIGFuIGludCwgdHJ1bmNhdGluZyBpZiBuZWNlc3NhcnkuIiIiCmRpZmYgLS1naXQgYS9MaWIvZGlmZmxpYi5weSBiL0xpYi9kaWZmbGliLnB5CmluZGV4IDNiYmNiNzYuLjM4ODBkODQgMTAwNjQ0Ci0tLSBhL0xpYi9kaWZmbGliLnB5CisrKyBiL0xpYi9kaWZmbGliLnB5CkBAIC0xLDUgKzEsMyBAQAotIyEgL3Vzci9iaW4vZW52IHB5dGhvbgotCiAiIiIKIE1vZHVsZSBkaWZmbGliIC0tIGhlbHBlcnMgZm9yIGNvbXB1dGluZyBkZWx0YXMgYmV0d2VlbiBvYmplY3RzLgogCkBAIC01MjUsOCArNTIzLDggQEAKICAgICAgICAgICAgIG5vbl9hZGphY2VudC5hcHBlbmQoKGkxLCBqMSwgazEpKQogCiAgICAgICAgIG5vbl9hZGphY2VudC5hcHBlbmQoIChsYSwgbGIsIDApICkKLSAgICAgICAgc2VsZi5tYXRjaGluZ19ibG9ja3MgPSBub25fYWRqYWNlbnQKLSAgICAgICAgcmV0dXJuIG1hcChNYXRjaC5fbWFrZSwgc2VsZi5tYXRjaGluZ19ibG9ja3MpCisgICAgICAgIHNlbGYubWF0Y2hpbmdfYmxvY2tzID0gbWFwKE1hdGNoLl9tYWtlLCBub25fYWRqYWNlbnQpCisgICAgICAgIHJldHVybiBzZWxmLm1hdGNoaW5nX2Jsb2NrcwogCiAgICAgZGVmIGdldF9vcGNvZGVzKHNlbGYpOgogICAgICAgICAiIiJSZXR1cm4gbGlzdCBvZiA1LXR1cGxlcyBkZXNjcmliaW5nIGhvdyB0byB0dXJuIGEgaW50byBiLgpAQCAtNTg2LDcgKzU4NCw3IEBACiAgICAgZGVmIGdldF9ncm91cGVkX29wY29kZXMoc2VsZiwgbj0zKToKICAgICAgICAgIiIiIElzb2xhdGUgY2hhbmdlIGNsdXN0ZXJzIGJ5IGVsaW1pbmF0aW5nIHJhbmdlcyB3aXRoIG5vIGNoYW5nZXMuCiAKLSAgICAgICAgUmV0dXJuIGEgZ2VuZXJhdG9yIG9mIGdyb3VwcyB3aXRoIHVwdG8gbiBsaW5lcyBvZiBjb250ZXh0LgorICAgICAgICBSZXR1cm4gYSBnZW5lcmF0b3Igb2YgZ3JvdXBzIHdpdGggdXAgdG8gbiBsaW5lcyBvZiBjb250ZXh0LgogICAgICAgICBFYWNoIGdyb3VwIGlzIGluIHRoZSBzYW1lIGZvcm1hdCBhcyByZXR1cm5lZCBieSBnZXRfb3Bjb2RlcygpLgogCiAgICAgICAgID4+PiBmcm9tIHBwcmludCBpbXBvcnQgcHByaW50CkBAIC0xMzYxLDcgKzEzNTksNyBAQAogICAgIGxpbmVqdW5rIC0tIHBhc3NlZCBvbiB0byBuZGlmZiAoc2VlIG5kaWZmIGRvY3VtZW50YXRpb24pCiAgICAgY2hhcmp1bmsgLS0gcGFzc2VkIG9uIHRvIG5kaWZmIChzZWUgbmRpZmYgZG9jdW1lbnRhdGlvbikKIAotICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBpbnRlcmF0b3Igd2hpY2ggcmV0dXJucyBhIHR1cGxlOgorICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBpdGVyYXRvciB3aGljaCByZXR1cm5zIGEgdHVwbGU6CiAgICAgKGZyb20gbGluZSB0dXBsZSwgdG8gbGluZSB0dXBsZSwgYm9vbGVhbiBmbGFnKQogCiAgICAgZnJvbS90byBsaW5lIHR1cGxlIC0tIChsaW5lIG51bSwgbGluZSB0ZXh0KQpAQCAtMTk2Myw3ICsxOTYxLDcgQEAKICAgICAgICAgc2VsZi5fbWFrZV9wcmVmaXgoKQogCiAgICAgICAgICMgY2hhbmdlIHRhYnMgdG8gc3BhY2VzIGJlZm9yZSBpdCBnZXRzIG1vcmUgZGlmZmljdWx0IGFmdGVyIHdlIGluc2VydAotICAgICAgICAjIG1hcmtrdXAKKyAgICAgICAgIyBtYXJrdXAKICAgICAgICAgZnJvbWxpbmVzLHRvbGluZXMgPSBzZWxmLl90YWJfbmV3bGluZV9yZXBsYWNlKGZyb21saW5lcyx0b2xpbmVzKQogCiAgICAgICAgICMgY3JlYXRlIGRpZmZzIGl0ZXJhdG9yIHdoaWNoIGdlbmVyYXRlcyBzaWRlIGJ5IHNpZGUgZnJvbS90byBkYXRhCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL19faW5pdF9fLnB5IGIvTGliL2Rpc3R1dGlscy9fX2luaXRfXy5weQppbmRleCBhODQ5ZjFhLi43YjhiOTI0IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL19faW5pdF9fLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvX19pbml0X18ucHkKQEAgLTE1LDUgKzE1LDUgQEAKICMgVXBkYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBQeXRob24gcmVsZWFzZSBwcm9jZXNzLgogIwogIy0tc3RhcnQgY29uc3RhbnRzLS0KLV9fdmVyc2lvbl9fID0gIjIuNy4yIgorX192ZXJzaW9uX18gPSAiMi43LjgiCiAjLS1lbmQgY29uc3RhbnRzLS0KZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY2NvbXBpbGVyLnB5IGIvTGliL2Rpc3R1dGlscy9jY29tcGlsZXIucHkKaW5kZXggYzJiMWY2Zi4uNDkwN2EwYSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jY29tcGlsZXIucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jY29tcGlsZXIucHkKQEAgLTE3LDU4ICsxNyw4IEBACiBmcm9tIGRpc3R1dGlscy5kZXBfdXRpbCBpbXBvcnQgbmV3ZXJfZ3JvdXAKIGZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IHNwbGl0X3F1b3RlZCwgZXhlY3V0ZQogZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwotCi1fc3lzY29uZmlnID0gX19pbXBvcnRfXygnc3lzY29uZmlnJykKLQotZGVmIGN1c3RvbWl6ZV9jb21waWxlcihjb21waWxlcik6Ci0gICAgIiIiRG8gYW55IHBsYXRmb3JtLXNwZWNpZmljIGN1c3RvbWl6YXRpb24gb2YgYSBDQ29tcGlsZXIgaW5zdGFuY2UuCi0KLSAgICBNYWlubHkgbmVlZGVkIG9uIFVuaXgsIHNvIHdlIGNhbiBwbHVnIGluIHRoZSBpbmZvcm1hdGlvbiB0aGF0Ci0gICAgdmFyaWVzIGFjcm9zcyBVbmljZXMgYW5kIGlzIHN0b3JlZCBpbiBQeXRob24ncyBNYWtlZmlsZS4KLSAgICAiIiIKLSAgICBpZiBjb21waWxlci5jb21waWxlcl90eXBlID09ICJ1bml4IjoKLSAgICAgICAgKGNjLCBjeHgsIG9wdCwgY2ZsYWdzLCBjY3NoYXJlZCwgbGRzaGFyZWQsIHNvX2V4dCwgYXIsIGFyX2ZsYWdzKSA9IFwKLSAgICAgICAgICAgIF9zeXNjb25maWcuZ2V0X2NvbmZpZ192YXJzKCdDQycsICdDWFgnLCAnT1BUJywgJ0NGTEFHUycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ0NTSEFSRUQnLCAnTERTSEFSRUQnLCAnU08nLCAnQVInLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FSRkxBR1MnKQotCi0gICAgICAgIGlmICdDQycgaW4gb3MuZW52aXJvbjoKLSAgICAgICAgICAgIGNjID0gb3MuZW52aXJvblsnQ0MnXQotICAgICAgICBpZiAnQ1hYJyBpbiBvcy5lbnZpcm9uOgotICAgICAgICAgICAgY3h4ID0gb3MuZW52aXJvblsnQ1hYJ10KLSAgICAgICAgaWYgJ0xEU0hBUkVEJyBpbiBvcy5lbnZpcm9uOgotICAgICAgICAgICAgbGRzaGFyZWQgPSBvcy5lbnZpcm9uWydMRFNIQVJFRCddCi0gICAgICAgIGlmICdDUFAnIGluIG9zLmVudmlyb246Ci0gICAgICAgICAgICBjcHAgPSBvcy5lbnZpcm9uWydDUFAnXQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgY3BwID0gY2MgKyAiIC1FIiAgICAgICAgICAgIyBub3QgYWx3YXlzCi0gICAgICAgIGlmICdMREZMQUdTJyBpbiBvcy5lbnZpcm9uOgotICAgICAgICAgICAgbGRzaGFyZWQgPSBsZHNoYXJlZCArICcgJyArIG9zLmVudmlyb25bJ0xERkxBR1MnXQotICAgICAgICBpZiAnQ0ZMQUdTJyBpbiBvcy5lbnZpcm9uOgotICAgICAgICAgICAgY2ZsYWdzID0gb3B0ICsgJyAnICsgb3MuZW52aXJvblsnQ0ZMQUdTJ10KLSAgICAgICAgICAgIGxkc2hhcmVkID0gbGRzaGFyZWQgKyAnICcgKyBvcy5lbnZpcm9uWydDRkxBR1MnXQotICAgICAgICBpZiAnQ1BQRkxBR1MnIGluIG9zLmVudmlyb246Ci0gICAgICAgICAgICBjcHAgPSBjcHAgKyAnICcgKyBvcy5lbnZpcm9uWydDUFBGTEFHUyddCi0gICAgICAgICAgICBjZmxhZ3MgPSBjZmxhZ3MgKyAnICcgKyBvcy5lbnZpcm9uWydDUFBGTEFHUyddCi0gICAgICAgICAgICBsZHNoYXJlZCA9IGxkc2hhcmVkICsgJyAnICsgb3MuZW52aXJvblsnQ1BQRkxBR1MnXQotICAgICAgICBpZiAnQVInIGluIG9zLmVudmlyb246Ci0gICAgICAgICAgICBhciA9IG9zLmVudmlyb25bJ0FSJ10KLSAgICAgICAgaWYgJ0FSRkxBR1MnIGluIG9zLmVudmlyb246Ci0gICAgICAgICAgICBhcmNoaXZlciA9IGFyICsgJyAnICsgb3MuZW52aXJvblsnQVJGTEFHUyddCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBhcmNoaXZlciA9IGFyICsgJyAnICsgYXJfZmxhZ3MKLQotICAgICAgICBjY19jbWQgPSBjYyArICcgJyArIGNmbGFncwotICAgICAgICBjb21waWxlci5zZXRfZXhlY3V0YWJsZXMoCi0gICAgICAgICAgICBwcmVwcm9jZXNzb3I9Y3BwLAotICAgICAgICAgICAgY29tcGlsZXI9Y2NfY21kLAotICAgICAgICAgICAgY29tcGlsZXJfc289Y2NfY21kICsgJyAnICsgY2NzaGFyZWQsCi0gICAgICAgICAgICBjb21waWxlcl9jeHg9Y3h4LAotICAgICAgICAgICAgbGlua2VyX3NvPWxkc2hhcmVkLAotICAgICAgICAgICAgbGlua2VyX2V4ZT1jYywKLSAgICAgICAgICAgIGFyY2hpdmVyPWFyY2hpdmVyKQotCi0gICAgICAgIGNvbXBpbGVyLnNoYXJlZF9saWJfZXh0ZW5zaW9uID0gc29fZXh0CisjIGZvbGxvd2luZyBpbXBvcnQgaXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKK2Zyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgY3VzdG9taXplX2NvbXBpbGVyCiAKIGNsYXNzIENDb21waWxlcjoKICAgICAiIiJBYnN0cmFjdCBiYXNlIGNsYXNzIHRvIGRlZmluZSB0aGUgaW50ZXJmYWNlIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3JwbS5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9ycG0ucHkKaW5kZXggMGJiYTM2My4uNDc3ZTBlZSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3JwbS5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfcnBtLnB5CkBAIC0xMiw2ICsxMiw3IEBACiBmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBDb21tYW5kCiBmcm9tIGRpc3R1dGlscy5kZWJ1ZyBpbXBvcnQgREVCVUcKIGZyb20gZGlzdHV0aWxzLmZpbGVfdXRpbCBpbXBvcnQgd3JpdGVfZmlsZQorZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBnZXRfcHl0aG9uX3ZlcnNpb24KIGZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgKERpc3R1dGlsc09wdGlvbkVycm9yLCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzdHV0aWxzRmlsZUVycm9yLCBEaXN0dXRpbHNFeGVjRXJyb3IpCiBmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCkBAIC0zNzksMTYgKzM4MCwyOCBAQAogICAgICAgICBzZWxmLnNwYXduKHJwbV9jbWQpCiAKICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKKyAgICAgICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19leHRfbW9kdWxlcygpOgorICAgICAgICAgICAgICAgIHB5dmVyc2lvbiA9IGdldF9weXRob25fdmVyc2lvbigpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHB5dmVyc2lvbiA9ICdhbnknCisKICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmJpbmFyeV9vbmx5OgogICAgICAgICAgICAgICAgIHNycG0gPSBvcy5wYXRoLmpvaW4ocnBtX2RpclsnU1JQTVMnXSwgc291cmNlX3JwbSkKICAgICAgICAgICAgICAgICBhc3NlcnQob3MucGF0aC5leGlzdHMoc3JwbSkpCiAgICAgICAgICAgICAgICAgc2VsZi5tb3ZlX2ZpbGUoc3JwbSwgc2VsZi5kaXN0X2RpcikKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmRpc3RfZGlyLCBzb3VyY2VfcnBtKQorICAgICAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLmRpc3RfZmlsZXMuYXBwZW5kKAorICAgICAgICAgICAgICAgICAgICAoJ2JkaXN0X3JwbScsIHB5dmVyc2lvbiwgZmlsZW5hbWUpKQogCiAgICAgICAgICAgICBpZiBub3Qgc2VsZi5zb3VyY2Vfb25seToKICAgICAgICAgICAgICAgICBmb3IgcnBtIGluIGJpbmFyeV9ycG1zOgogICAgICAgICAgICAgICAgICAgICBycG0gPSBvcy5wYXRoLmpvaW4ocnBtX2RpclsnUlBNUyddLCBycG0pCiAgICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJwbSk6CiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1vdmVfZmlsZShycG0sIHNlbGYuZGlzdF9kaXIpCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmRpc3RfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShycG0pKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uZGlzdF9maWxlcy5hcHBlbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdiZGlzdF9ycG0nLCBweXZlcnNpb24sIGZpbGVuYW1lKSkKICAgICAjIHJ1bigpCiAKICAgICBkZWYgX2Rpc3RfcGF0aChzZWxmLCBwYXRoKToKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9jbGliLnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2NsaWIucHkKaW5kZXggOThhMTcyNi4uMjA1NTg3ZSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2NsaWIucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2NsaWIucHkKQEAgLTE5LDcgKzE5LDcgQEAKIGltcG9ydCBvcwogZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgQ29tbWFuZAogZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNTZXR1cEVycm9yCi1mcm9tIGRpc3R1dGlscy5jY29tcGlsZXIgaW1wb3J0IGN1c3RvbWl6ZV9jb21waWxlcgorZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBjdXN0b21pemVfY29tcGlsZXIKIGZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKIAogZGVmIHNob3dfY29tcGlsZXJzKCk6CmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfZXh0LnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2V4dC5weQppbmRleCA1NWE0Mjg4Li5mMGE3ZDRjIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfZXh0LnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9leHQucHkKQEAgLTE2MCw4ICsxNjAsNyBAQAogICAgICAgICBpZiBwbGF0X3B5X2luY2x1ZGUgIT0gcHlfaW5jbHVkZToKICAgICAgICAgICAgIHNlbGYuaW5jbHVkZV9kaXJzLmFwcGVuZChwbGF0X3B5X2luY2x1ZGUpCiAKLSAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmxpYnJhcmllcywgc3RyKToKLSAgICAgICAgICAgIHNlbGYubGlicmFyaWVzID0gW3NlbGYubGlicmFyaWVzXQorICAgICAgICBzZWxmLmVuc3VyZV9zdHJpbmdfbGlzdCgnbGlicmFyaWVzJykKIAogICAgICAgICAjIExpZmUgaXMgZWFzaWVyIGlmIHdlJ3JlIG5vdCBmb3JldmVyIGNoZWNraW5nIGZvciBOb25lLCBzbwogICAgICAgICAjIHNpbXBsaWZ5IHRoZXNlIG9wdGlvbnMgdG8gZW1wdHkgbGlzdHMgaWYgdW5zZXQKQEAgLTIzMiwxMiArMjMxLDEwIEBACiAgICAgICAgICAgICAgICAgIyBidWlsZGluZyBweXRob24gc3RhbmRhcmQgZXh0ZW5zaW9ucwogICAgICAgICAgICAgICAgIHNlbGYubGlicmFyeV9kaXJzLmFwcGVuZCgnLicpCiAKLSAgICAgICAgIyBmb3IgZXh0ZW5zaW9ucyB1bmRlciBMaW51eCBvciBTb2xhcmlzIHdpdGggYSBzaGFyZWQgUHl0aG9uIGxpYnJhcnksCisgICAgICAgICMgRm9yIGJ1aWxkaW5nIGV4dGVuc2lvbnMgd2l0aCBhIHNoYXJlZCBQeXRob24gbGlicmFyeSwKICAgICAgICAgIyBQeXRob24ncyBsaWJyYXJ5IGRpcmVjdG9yeSBtdXN0IGJlIGFwcGVuZGVkIHRvIGxpYnJhcnlfZGlycwotICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1B5X0VOQUJMRV9TSEFSRUQnKQotICAgICAgICBpZiAoKHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdsaW51eCcpIG9yIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdnbnUnKQotICAgICAgICAgICAgIG9yIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdzdW5vcycpKQotICAgICAgICAgICAgYW5kIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignUHlfRU5BQkxFX1NIQVJFRCcpKToKKyAgICAgICAgIyBTZWUgSXNzdWVzOiAjMTYwMDg2MCwgIzQzNjYKKyAgICAgICAgaWYgKHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignUHlfRU5BQkxFX1NIQVJFRCcpKToKICAgICAgICAgICAgIGlmIHN5cy5leGVjdXRhYmxlLnN0YXJ0c3dpdGgob3MucGF0aC5qb2luKHN5cy5leGVjX3ByZWZpeCwgImJpbiIpKToKICAgICAgICAgICAgICAgICAjIGJ1aWxkaW5nIHRoaXJkIHBhcnR5IGV4dGVuc2lvbnMKICAgICAgICAgICAgICAgICBzZWxmLmxpYnJhcnlfZGlycy5hcHBlbmQoc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdMSUJESVInKSkKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9weS5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9weS5weQppbmRleCAwNGM0NTVmLi5jMTIzYzYyIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfcHkucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX3B5LnB5CkBAIC0xMjgsNyArMTI4LDggQEAKICAgICAgICAgICAgICMgRWFjaCBwYXR0ZXJuIGhhcyB0byBiZSBjb252ZXJ0ZWQgdG8gYSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoCiAgICAgICAgICAgICBmaWxlbGlzdCA9IGdsb2Iob3MucGF0aC5qb2luKHNyY19kaXIsIGNvbnZlcnRfcGF0aChwYXR0ZXJuKSkpCiAgICAgICAgICAgICAjIEZpbGVzIHRoYXQgbWF0Y2ggbW9yZSB0aGFuIG9uZSBwYXR0ZXJuIGFyZSBvbmx5IGFkZGVkIG9uY2UKLSAgICAgICAgICAgIGZpbGVzLmV4dGVuZChbZm4gZm9yIGZuIGluIGZpbGVsaXN0IGlmIGZuIG5vdCBpbiBmaWxlc10pCisgICAgICAgICAgICBmaWxlcy5leHRlbmQoW2ZuIGZvciBmbiBpbiBmaWxlbGlzdCBpZiBmbiBub3QgaW4gZmlsZXMKKyAgICAgICAgICAgICAgICBhbmQgb3MucGF0aC5pc2ZpbGUoZm4pXSkKICAgICAgICAgcmV0dXJuIGZpbGVzCiAKICAgICBkZWYgYnVpbGRfcGFja2FnZV9kYXRhKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2NoZWNrLnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2NoZWNrLnB5CmluZGV4IDRiNjRlNDUuLjE1MmJmMGQgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9jaGVjay5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvY2hlY2sucHkKQEAgLTI2LDYgKzI2LDkgQEAKIAogICAgICAgICBkZWYgc3lzdGVtX21lc3NhZ2Uoc2VsZiwgbGV2ZWwsIG1lc3NhZ2UsICpjaGlsZHJlbiwgKiprd2FyZ3MpOgogICAgICAgICAgICAgc2VsZi5tZXNzYWdlcy5hcHBlbmQoKGxldmVsLCBtZXNzYWdlLCBjaGlsZHJlbiwga3dhcmdzKSkKKyAgICAgICAgICAgIHJldHVybiBub2Rlcy5zeXN0ZW1fbWVzc2FnZShtZXNzYWdlLCBsZXZlbD1sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPXNlbGYubGV2ZWxzW2xldmVsXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY2hpbGRyZW4sICoqa3dhcmdzKQogCiAgICAgSEFTX0RPQ1VUSUxTID0gVHJ1ZQogZXhjZXB0IEltcG9ydEVycm9yOgpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2NvbmZpZy5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9jb25maWcucHkKaW5kZXggZGE4ZGE1OS4uYjA4NDkxMyAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2NvbmZpZy5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvY29uZmlnLnB5CkBAIC0xNiw3ICsxNiw3IEBACiAKIGZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQKIGZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXhlY0Vycm9yCi1mcm9tIGRpc3R1dGlscy5jY29tcGlsZXIgaW1wb3J0IGN1c3RvbWl6ZV9jb21waWxlcgorZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBjdXN0b21pemVfY29tcGlsZXIKIGZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKIAogTEFOR19FWFQgPSB7J2MnOiAnLmMnLCAnYysrJzogJy5jeHgnfQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGwucHkgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weQppbmRleCBmMWYzYmQ1Li5iOWYxYzZjIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weQpAQCAtMjY1LDggKzI2NSw4IEBACiAKICAgICAgICAgaWYgc2VsZi51c2VyIGFuZCAoc2VsZi5wcmVmaXggb3Igc2VsZi5leGVjX3ByZWZpeCBvciBzZWxmLmhvbWUgb3IKICAgICAgICAgICAgICAgICBzZWxmLmluc3RhbGxfYmFzZSBvciBzZWxmLmluc3RhbGxfcGxhdGJhc2UpOgotICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoImNhbid0IGNvbWJpbmUgdXNlciB3aXRoIHdpdGggcHJlZml4LyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGVjX3ByZWZpeC9ob21lIG9yIGluc3RhbGxfKHBsYXQpYmFzZSIpCisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigiY2FuJ3QgY29tYmluZSB1c2VyIHdpdGggcHJlZml4LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhlY19wcmVmaXgvaG9tZSwgb3IgaW5zdGFsbF8ocGxhdCliYXNlIikKIAogICAgICAgICAjIE5leHQsIHN0dWZmIHRoYXQncyB3cm9uZyAob3IgZHViaW91cykgb25seSBvbiBjZXJ0YWluIHBsYXRmb3Jtcy4KICAgICAgICAgaWYgb3MubmFtZSAhPSAicG9zaXgiOgpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL3NkaXN0LnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL3NkaXN0LnB5CmluZGV4IGQzMGRlMTAuLjgyMTQyMGQgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9zZGlzdC5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvc2Rpc3QucHkKQEAgLTE4Myw3ICsxODMsNyBAQAogICAgICAgICBkZXBlbmRzIG9uIHRoZSB1c2VyJ3Mgb3B0aW9ucy4KICAgICAgICAgIiIiCiAgICAgICAgICMgbmV3IGJlaGF2aW9yIHdoZW4gdXNpbmcgYSB0ZW1wbGF0ZToKLSAgICAgICAgIyB0aGUgZmlsZSBsaXN0IGlzIHJlY2FsY3VsYXRlZCBldmVyeXRpbWUgYmVjYXVzZQorICAgICAgICAjIHRoZSBmaWxlIGxpc3QgaXMgcmVjYWxjdWxhdGVkIGV2ZXJ5IHRpbWUgYmVjYXVzZQogICAgICAgICAjIGV2ZW4gaWYgTUFOSUZFU1QuaW4gb3Igc2V0dXAucHkgYXJlIG5vdCBjaGFuZ2VkCiAgICAgICAgICMgdGhlIHVzZXIgbWlnaHQgaGF2ZSBhZGRlZCBzb21lIGZpbGVzIGluIHRoZSB0cmVlIHRoYXQKICAgICAgICAgIyBuZWVkIHRvIGJlIGluY2x1ZGVkLgpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL3VwbG9hZC5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC91cGxvYWQucHkKaW5kZXggZDAxMzMzNS4uOWFhNTRlZSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL3VwbG9hZC5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvdXBsb2FkLnB5CkBAIC0xMCw3ICsxMCw3IEBACiBpbXBvcnQgY1N0cmluZ0lPIGFzIFN0cmluZ0lPCiBmcm9tIGhhc2hsaWIgaW1wb3J0IG1kNQogCi1mcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc09wdGlvbkVycm9yCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0Vycm9yLCBEaXN0dXRpbHNPcHRpb25FcnJvcgogZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgUHlQSVJDQ29tbWFuZAogZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IHNwYXduCiBmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCkBAIC0xNzcsMTEgKzE3NywxMSBAQAogICAgICAgICAgICAgc3RhdHVzID0gcmVzdWx0LmdldGNvZGUoKQogICAgICAgICAgICAgcmVhc29uID0gcmVzdWx0Lm1zZwogICAgICAgICAgICAgaWYgc2VsZi5zaG93X3Jlc3BvbnNlOgotICAgICAgICAgICAgICAgIG1zZyA9ICdcbicuam9pbigoJy0nICogNzUsIHIucmVhZCgpLCAnLScgKiA3NSkpCisgICAgICAgICAgICAgICAgbXNnID0gJ1xuJy5qb2luKCgnLScgKiA3NSwgcmVzdWx0LnJlYWQoKSwgJy0nICogNzUpKQogICAgICAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UobXNnLCBsb2cuSU5GTykKICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZToKICAgICAgICAgICAgIHNlbGYuYW5ub3VuY2Uoc3RyKGUpLCBsb2cuRVJST1IpCi0gICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHJhaXNlCiAgICAgICAgIGV4Y2VwdCBIVFRQRXJyb3IsIGU6CiAgICAgICAgICAgICBzdGF0dXMgPSBlLmNvZGUKICAgICAgICAgICAgIHJlYXNvbiA9IGUubXNnCkBAIC0xOTAsNSArMTkwLDYgQEAKICAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoJ1NlcnZlciByZXNwb25zZSAoJXMpOiAlcycgJSAoc3RhdHVzLCByZWFzb24pLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuSU5GTykKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoJ1VwbG9hZCBmYWlsZWQgKCVzKTogJXMnICUgKHN0YXR1cywgcmVhc29uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLkVSUk9SKQorICAgICAgICAgICAgbXNnID0gJ1VwbG9hZCBmYWlsZWQgKCVzKTogJXMnICUgKHN0YXR1cywgcmVhc29uKQorICAgICAgICAgICAgc2VsZi5hbm5vdW5jZShtc2csIGxvZy5FUlJPUikKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKG1zZykKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY29uZmlnLnB5IGIvTGliL2Rpc3R1dGlscy9jb25maWcucHkKaW5kZXggYWZhNDAzZi4uN2RiY2M0NiAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb25maWcucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jb25maWcucHkKQEAgLTIxLDcgKzIxLDcgQEAKIGNsYXNzIFB5UElSQ0NvbW1hbmQoQ29tbWFuZCk6CiAgICAgIiIiQmFzZSBjb21tYW5kIHRoYXQga25vd3MgaG93IHRvIGhhbmRsZSB0aGUgLnB5cGlyYyBmaWxlCiAgICAgIiIiCi0gICAgREVGQVVMVF9SRVBPU0lUT1JZID0gJ2h0dHA6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaScKKyAgICBERUZBVUxUX1JFUE9TSVRPUlkgPSAnaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaScKICAgICBERUZBVUxUX1JFQUxNID0gJ3B5cGknCiAgICAgcmVwb3NpdG9yeSA9IE5vbmUKICAgICByZWFsbSA9IE5vbmUKQEAgLTQyLDE2ICs0MiwxMSBAQAogICAgIGRlZiBfc3RvcmVfcHlwaXJjKHNlbGYsIHVzZXJuYW1lLCBwYXNzd29yZCk6CiAgICAgICAgICIiIkNyZWF0ZXMgYSBkZWZhdWx0IC5weXBpcmMgZmlsZS4iIiIKICAgICAgICAgcmMgPSBzZWxmLl9nZXRfcmNfZmlsZSgpCi0gICAgICAgIGYgPSBvcGVuKHJjLCAndycpCisgICAgICAgIGYgPSBvcy5mZG9wZW4ob3Mub3BlbihyYywgb3MuT19DUkVBVCB8IG9zLk9fV1JPTkxZLCAwNjAwKSwgJ3cnKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBmLndyaXRlKERFRkFVTFRfUFlQSVJDICUgKHVzZXJuYW1lLCBwYXNzd29yZCkpCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgb3MuY2htb2QocmMsIDA2MDApCi0gICAgICAgIGV4Y2VwdCBPU0Vycm9yOgotICAgICAgICAgICAgIyBzaG91bGQgZG8gc29tZXRoaW5nIGJldHRlciBoZXJlCi0gICAgICAgICAgICBwYXNzCiAKICAgICBkZWYgX3JlYWRfcHlwaXJjKHNlbGYpOgogICAgICAgICAiIiJSZWFkcyB0aGUgLnB5cGlyYyBmaWxlLiIiIgpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb3JlLnB5IGIvTGliL2Rpc3R1dGlscy9jb3JlLnB5CmluZGV4IGI4OTU1N2QuLmZjYjIwNjAgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29yZS5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvcmUucHkKQEAgLTE0LDcgKzE0LDYgQEAKIGZyb20gZGlzdHV0aWxzLmRlYnVnIGltcG9ydCBERUJVRwogZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAoRGlzdHV0aWxzU2V0dXBFcnJvciwgRGlzdHV0aWxzQXJnRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXN0dXRpbHNFcnJvciwgQ0NvbXBpbGVyRXJyb3IpCi1mcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBncm9rX2Vudmlyb25tZW50X2Vycm9yCiAKICMgTWFpbmx5IGltcG9ydCB0aGVzZSBzbyBzZXR1cCBzY3JpcHRzIGNhbiAiZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQiIHRoZW0uCiBmcm9tIGRpc3R1dGlscy5kaXN0IGltcG9ydCBEaXN0cmlidXRpb24KQEAgLTE1MywxMyArMTUyLDExIEBACiAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKICAgICAgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQsICJpbnRlcnJ1cHRlZCIKICAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBvcy5lcnJvciksIGV4YzoKLSAgICAgICAgICAgIGVycm9yID0gZ3Jva19lbnZpcm9ubWVudF9lcnJvcihleGMpCi0KICAgICAgICAgICAgIGlmIERFQlVHOgotICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoZXJyb3IgKyAiXG4iKQorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoImVycm9yOiAlc1xuIiAlIChleGMsKSkKICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICByYWlzZSBTeXN0ZW1FeGl0LCBlcnJvcgorICAgICAgICAgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQsICJlcnJvcjogJXMiICUgKGV4YywpCiAKICAgICAgICAgZXhjZXB0IChEaXN0dXRpbHNFcnJvciwKICAgICAgICAgICAgICAgICBDQ29tcGlsZXJFcnJvciksIG1zZzoKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY3lnd2luY2NvbXBpbGVyLnB5IGIvTGliL2Rpc3R1dGlscy9jeWd3aW5jY29tcGlsZXIucHkKaW5kZXggYTFlZTgxNS4uNWQxMTY4NyAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jeWd3aW5jY29tcGlsZXIucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jeWd3aW5jY29tcGlsZXIucHkKQEAgLTMxOSwxMyArMzE5LDE4IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBlbnRyeV9wb2ludCA9ICcnCiAKLSAgICAgICAgc2VsZi5zZXRfZXhlY3V0YWJsZXMoY29tcGlsZXI9J2djYyAtbW5vLWN5Z3dpbiAtTyAtV2FsbCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyX3NvPSdnY2MgLW1uby1jeWd3aW4gLW1kbGwgLU8gLVdhbGwnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlcl9jeHg9J2crKyAtbW5vLWN5Z3dpbiAtTyAtV2FsbCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtlcl9leGU9J2djYyAtbW5vLWN5Z3dpbicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtlcl9zbz0nJXMgLW1uby1jeWd3aW4gJXMgJXMnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi5saW5rZXJfZGxsLCBzaGFyZWRfb3B0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5X3BvaW50KSkKKyAgICAgICAgaWYgc2VsZi5nY2NfdmVyc2lvbiA8ICc0JyBvciBpc19jeWd3aW5nY2MoKToKKyAgICAgICAgICAgIG5vX2N5Z3dpbiA9ICcgLW1uby1jeWd3aW4nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBub19jeWd3aW4gPSAnJworCisgICAgICAgIHNlbGYuc2V0X2V4ZWN1dGFibGVzKGNvbXBpbGVyPSdnY2MlcyAtTyAtV2FsbCcgJSBub19jeWd3aW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyX3NvPSdnY2MlcyAtbWRsbCAtTyAtV2FsbCcgJSBub19jeWd3aW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyX2N4eD0nZysrJXMgLU8gLVdhbGwnICUgbm9fY3lnd2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rZXJfZXhlPSdnY2MlcycgJSBub19jeWd3aW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtlcl9zbz0nJXMlcyAlcyAlcycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHNlbGYubGlua2VyX2RsbCwgbm9fY3lnd2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX29wdGlvbiwgZW50cnlfcG9pbnQpKQogICAgICAgICAjIE1heWJlIHdlIHNob3VsZCBhbHNvIGFwcGVuZCAtbXRocmVhZHMsIGJ1dCB0aGVuIHRoZSBmaW5pc2hlZAogICAgICAgICAjIGRsbHMgbmVlZCBhbm90aGVyIGRsbCAobWluZ3dtMTAuZGxsIHNlZSBNaW5ndzMyIGRvY3MpCiAgICAgICAgICMgKC1tdGhyZWFkczogU3VwcG9ydCB0aHJlYWQtc2FmZSBleGNlcHRpb24gaGFuZGxpbmcgb24gYE1pbmd3MzInKQpAQCAtNDQ3LDMgKzQ1MiwxMiBAQAogICAgIGVsc2U6CiAgICAgICAgIGRsbHdyYXBfdmVyc2lvbiA9IE5vbmUKICAgICByZXR1cm4gKGdjY192ZXJzaW9uLCBsZF92ZXJzaW9uLCBkbGx3cmFwX3ZlcnNpb24pCisKK2RlZiBpc19jeWd3aW5nY2MoKToKKyAgICAnJydUcnkgdG8gZGV0ZXJtaW5lIGlmIHRoZSBnY2MgdGhhdCB3b3VsZCBiZSB1c2VkIGlzIGZyb20gY3lnd2luLicnJworICAgIG91dCA9IG9zLnBvcGVuKCdnY2MgLWR1bXBtYWNoaW5lJywgJ3InKQorICAgIG91dF9zdHJpbmcgPSBvdXQucmVhZCgpCisgICAgb3V0LmNsb3NlKCkKKyAgICAjIG91dF9zdHJpbmcgaXMgdGhlIHRhcmdldCB0cmlwbGV0IGNwdS12ZW5kb3Itb3MKKyAgICAjIEN5Z3dpbidzIGdjYyBzZXRzIHRoZSBvcyB0byAnY3lnd2luJworICAgIHJldHVybiBvdXRfc3RyaW5nLnN0cmlwKCkuZW5kc3dpdGgoJ2N5Z3dpbicpCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2Rpcl91dGlsLnB5IGIvTGliL2Rpc3R1dGlscy9kaXJfdXRpbC5weQppbmRleCA5YzVjZjMzLi5lMmRjNmY0IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2Rpcl91dGlsLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvZGlyX3V0aWwucHkKQEAgLTE0NCw2ICsxNDQsMTAgQEAKICAgICAgICAgc3JjX25hbWUgPSBvcy5wYXRoLmpvaW4oc3JjLCBuKQogICAgICAgICBkc3RfbmFtZSA9IG9zLnBhdGguam9pbihkc3QsIG4pCiAKKyAgICAgICAgaWYgbi5zdGFydHN3aXRoKCcubmZzJyk6CisgICAgICAgICAgICAjIHNraXAgTkZTIHJlbmFtZSBmaWxlcworICAgICAgICAgICAgY29udGludWUKKwogICAgICAgICBpZiBwcmVzZXJ2ZV9zeW1saW5rcyBhbmQgb3MucGF0aC5pc2xpbmsoc3JjX25hbWUpOgogICAgICAgICAgICAgbGlua19kZXN0ID0gb3MucmVhZGxpbmsoc3JjX25hbWUpCiAgICAgICAgICAgICBpZiB2ZXJib3NlID49IDE6CkBAIC0xODEsNyArMTg1LDYgQEAKICAgICBBbnkgZXJyb3JzIGFyZSBpZ25vcmVkIChhcGFydCBmcm9tIGJlaW5nIHJlcG9ydGVkIHRvIHN0ZG91dCBpZiAndmVyYm9zZScKICAgICBpcyB0cnVlKS4KICAgICAiIiIKLSAgICBmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBncm9rX2Vudmlyb25tZW50X2Vycm9yCiAgICAgZ2xvYmFsIF9wYXRoX2NyZWF0ZWQKIAogICAgIGlmIHZlcmJvc2UgPj0gMToKQEAgLTE5OCw4ICsyMDEsNyBAQAogICAgICAgICAgICAgaWYgYWJzcGF0aCBpbiBfcGF0aF9jcmVhdGVkOgogICAgICAgICAgICAgICAgIGRlbCBfcGF0aF9jcmVhdGVkW2Fic3BhdGhdCiAgICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgT1NFcnJvciksIGV4YzoKLSAgICAgICAgICAgIGxvZy53YXJuKGdyb2tfZW52aXJvbm1lbnRfZXJyb3IoCi0gICAgICAgICAgICAgICAgICAgIGV4YywgImVycm9yIHJlbW92aW5nICVzOiAiICUgZGlyZWN0b3J5KSkKKyAgICAgICAgICAgIGxvZy53YXJuKCJlcnJvciByZW1vdmluZyAlczogJXMiLCBkaXJlY3RvcnksIGV4YykKIAogZGVmIGVuc3VyZV9yZWxhdGl2ZShwYXRoKToKICAgICAiIiJUYWtlIHRoZSBmdWxsIHBhdGggJ3BhdGgnLCBhbmQgbWFrZSBpdCBhIHJlbGF0aXZlIHBhdGguCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2ZpbGVsaXN0LnB5IGIvTGliL2Rpc3R1dGlscy9maWxlbGlzdC5weQppbmRleCBlYmQxNDExLi4yZjFjNDU3IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2ZpbGVsaXN0LnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvZmlsZWxpc3QucHkKQEAgLTIxMCw2ICsyMTAsNyBAQAogCiAgICAgICAgIFJldHVybiAxIGlmIGZpbGVzIGFyZSBmb3VuZC4KICAgICAgICAgIiIiCisgICAgICAgICMgWFhYIGRvY3N0cmluZyBseWluZyBhYm91dCB3aGF0IHRoZSBzcGVjaWFsIGNoYXJzIGFyZT8KICAgICAgICAgZmlsZXNfZm91bmQgPSAwCiAgICAgICAgIHBhdHRlcm5fcmUgPSB0cmFuc2xhdGVfcGF0dGVybihwYXR0ZXJuLCBhbmNob3IsIHByZWZpeCwgaXNfcmVnZXgpCiAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoImluY2x1ZGVfcGF0dGVybjogYXBwbHlpbmcgcmVnZXggciclcyciICUKQEAgLTI5NywxMSArMjk4LDE0IEBACiAgICAgIyBJTUhPIGlzIHdyb25nIC0tICc/JyBhbmQgJyonIGFyZW4ndCBzdXBwb3NlZCB0byBtYXRjaCBzbGFzaCBpbiBVbml4LAogICAgICMgYW5kIGJ5IGV4dGVuc2lvbiB0aGV5IHNob3VsZG4ndCBtYXRjaCBzdWNoICJzcGVjaWFsIGNoYXJhY3RlcnMiIHVuZGVyCiAgICAgIyBhbnkgT1MuICBTbyBjaGFuZ2UgYWxsIG5vbi1lc2NhcGVkIGRvdHMgaW4gdGhlIFJFIHRvIG1hdGNoIGFueQotICAgICMgY2hhcmFjdGVyIGV4Y2VwdCB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzLgotICAgICMgWFhYIGN1cnJlbnRseSB0aGUgInNwZWNpYWwgY2hhcmFjdGVycyIgYXJlIGp1c3Qgc2xhc2ggLS0gaS5lLiB0aGlzIGlzCi0gICAgIyBVbml4LW9ubHkuCi0gICAgcGF0dGVybl9yZSA9IHJlLnN1YihyJygoPzwhXFwpKFxcXFwpKilcLicsIHInXDFbXi9dJywgcGF0dGVybl9yZSkKLQorICAgICMgY2hhcmFjdGVyIGV4Y2VwdCB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzIChjdXJyZW50bHk6IGp1c3Qgb3Muc2VwKS4KKyAgICBzZXAgPSBvcy5zZXAKKyAgICBpZiBvcy5zZXAgPT0gJ1xcJzoKKyAgICAgICAgIyB3ZSdyZSB1c2luZyBhIHJlZ2V4IHRvIG1hbmlwdWxhdGUgYSByZWdleCwgc28gd2UgbmVlZAorICAgICAgICAjIHRvIGVzY2FwZSB0aGUgYmFja3NsYXNoIHR3aWNlCisgICAgICAgIHNlcCA9IHInXFxcXCcKKyAgICBlc2NhcGVkID0gcidcMVteJXNdJyAlIHNlcAorICAgIHBhdHRlcm5fcmUgPSByZS5zdWIocicoKD88IVxcKShcXFxcKSopXC4nLCBlc2NhcGVkLCBwYXR0ZXJuX3JlKQogICAgIHJldHVybiBwYXR0ZXJuX3JlCiAKIApAQCAtMzI4LDEwICszMzIsMTAgQEAKICAgICAgICAgIyBkaXRjaCBlbmQgb2YgcGF0dGVybiBjaGFyYWN0ZXIKICAgICAgICAgZW1wdHlfcGF0dGVybiA9IGdsb2JfdG9fcmUoJycpCiAgICAgICAgIHByZWZpeF9yZSA9IGdsb2JfdG9fcmUocHJlZml4KVs6LWxlbihlbXB0eV9wYXR0ZXJuKV0KLSAgICAgICAgIyBtYXRjaCBib3RoIHBhdGggc2VwYXJhdG9ycywgYXMgaW4gUG9zdGVsJ3MgcHJpbmNpcGxlCi0gICAgICAgIHNlcF9wYXQgPSAiWyIgKyByZS5lc2NhcGUob3MucGF0aC5zZXAgKyBvcy5wYXRoLmFsdHNlcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguYWx0c2VwIGVsc2Ugb3MucGF0aC5zZXApICsgIl0iCi0gICAgICAgIHBhdHRlcm5fcmUgPSAiXiIgKyBzZXBfcGF0LmpvaW4oW3ByZWZpeF9yZSwgIi4qIiArIHBhdHRlcm5fcmVdKQorICAgICAgICBzZXAgPSBvcy5zZXAKKyAgICAgICAgaWYgb3Muc2VwID09ICdcXCc6CisgICAgICAgICAgICBzZXAgPSByJ1xcJworICAgICAgICBwYXR0ZXJuX3JlID0gIl4iICsgc2VwLmpvaW4oKHByZWZpeF9yZSwgIi4qIiArIHBhdHRlcm5fcmUpKQogICAgIGVsc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm8gcHJlZml4IC0tIHJlc3BlY3QgYW5jaG9yIGZsYWcKICAgICAgICAgaWYgYW5jaG9yOgogICAgICAgICAgICAgcGF0dGVybl9yZSA9ICJeIiArIHBhdHRlcm5fcmUKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvc3Bhd24ucHkgYi9MaWIvZGlzdHV0aWxzL3NwYXduLnB5CmluZGV4IDczMDYwOTkuLjMyMTM0NGEgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvc3Bhd24ucHkKKysrIGIvTGliL2Rpc3R1dGlscy9zcGF3bi5weQpAQCAtMTIsNiArMTIsNyBAQAogaW1wb3J0IG9zCiAKIGZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwgRGlzdHV0aWxzRXhlY0Vycm9yCitmcm9tIGRpc3R1dGlscy5kZWJ1ZyBpbXBvcnQgREVCVUcKIGZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKIAogZGVmIHNwYXduKGNtZCwgc2VhcmNoX3BhdGg9MSwgdmVyYm9zZT0wLCBkcnlfcnVuPTApOgpAQCAtMzAsNiArMzEsOSBAQAogICAgIFJhaXNlIERpc3R1dGlsc0V4ZWNFcnJvciBpZiBydW5uaW5nIHRoZSBwcm9ncmFtIGZhaWxzIGluIGFueSB3YXk7IGp1c3QKICAgICByZXR1cm4gb24gc3VjY2Vzcy4KICAgICAiIiIKKyAgICAjIGNtZCBpcyBkb2N1bWVudGVkIGFzIGEgbGlzdCwgYnV0IGp1c3QgaW4gY2FzZSBzb21lIGNvZGUgcGFzc2VzIGEgdHVwbGUKKyAgICAjIGluLCBwcm90ZWN0IG91ciAlLWZvcm1hdHRpbmcgY29kZSBhZ2FpbnN0IGhvcnJpYmxlIGRlYXRoCisgICAgY21kID0gbGlzdChjbWQpCiAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnOgogICAgICAgICBfc3Bhd25fcG9zaXgoY21kLCBzZWFyY2hfcGF0aCwgZHJ5X3J1bj1kcnlfcnVuKQogICAgIGVsaWYgb3MubmFtZSA9PSAnbnQnOgpAQCAtNjksMTIgKzczLDE2IEBACiAgICAgICAgICAgICByYyA9IG9zLnNwYXdudihvcy5QX1dBSVQsIGV4ZWN1dGFibGUsIGNtZCkKICAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGV4YzoKICAgICAgICAgICAgICMgdGhpcyBzZWVtcyB0byBoYXBwZW4gd2hlbiB0aGUgY29tbWFuZCBpc24ndCBmb3VuZAorICAgICAgICAgICAgaWYgbm90IERFQlVHOgorICAgICAgICAgICAgICAgIGNtZCA9IGV4ZWN1dGFibGUKICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0V4ZWNFcnJvciwgXAotICAgICAgICAgICAgICAgICAgImNvbW1hbmQgJyVzJyBmYWlsZWQ6ICVzIiAlIChjbWRbMF0sIGV4Y1stMV0pCisgICAgICAgICAgICAgICAgICAiY29tbWFuZCAlciBmYWlsZWQ6ICVzIiAlIChjbWQsIGV4Y1stMV0pCiAgICAgICAgIGlmIHJjICE9IDA6CiAgICAgICAgICAgICAjIGFuZCB0aGlzIHJlZmxlY3RzIHRoZSBjb21tYW5kIHJ1bm5pbmcgYnV0IGZhaWxpbmcKKyAgICAgICAgICAgIGlmIG5vdCBERUJVRzoKKyAgICAgICAgICAgICAgICBjbWQgPSBleGVjdXRhYmxlCiAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFeGVjRXJyb3IsIFwKLSAgICAgICAgICAgICAgICAgICJjb21tYW5kICclcycgZmFpbGVkIHdpdGggZXhpdCBzdGF0dXMgJWQiICUgKGNtZFswXSwgcmMpCisgICAgICAgICAgICAgICAgICAiY29tbWFuZCAlciBmYWlsZWQgd2l0aCBleGl0IHN0YXR1cyAlZCIgJSAoY21kLCByYykKIAogZGVmIF9zcGF3bl9vczIoY21kLCBzZWFyY2hfcGF0aD0xLCB2ZXJib3NlPTAsIGRyeV9ydW49MCk6CiAgICAgZXhlY3V0YWJsZSA9IGNtZFswXQpAQCAtODgsMTMgKzk2LDE3IEBACiAgICAgICAgICAgICByYyA9IG9zLnNwYXdudihvcy5QX1dBSVQsIGV4ZWN1dGFibGUsIGNtZCkKICAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGV4YzoKICAgICAgICAgICAgICMgdGhpcyBzZWVtcyB0byBoYXBwZW4gd2hlbiB0aGUgY29tbWFuZCBpc24ndCBmb3VuZAorICAgICAgICAgICAgaWYgbm90IERFQlVHOgorICAgICAgICAgICAgICAgIGNtZCA9IGV4ZWN1dGFibGUKICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0V4ZWNFcnJvciwgXAotICAgICAgICAgICAgICAgICAgImNvbW1hbmQgJyVzJyBmYWlsZWQ6ICVzIiAlIChjbWRbMF0sIGV4Y1stMV0pCisgICAgICAgICAgICAgICAgICAiY29tbWFuZCAlciBmYWlsZWQ6ICVzIiAlIChjbWQsIGV4Y1stMV0pCiAgICAgICAgIGlmIHJjICE9IDA6CiAgICAgICAgICAgICAjIGFuZCB0aGlzIHJlZmxlY3RzIHRoZSBjb21tYW5kIHJ1bm5pbmcgYnV0IGZhaWxpbmcKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiY29tbWFuZCAnJXMnIGZhaWxlZCB3aXRoIGV4aXQgc3RhdHVzICVkIiAlIChjbWRbMF0sIHJjKSkKKyAgICAgICAgICAgIGlmIG5vdCBERUJVRzoKKyAgICAgICAgICAgICAgICBjbWQgPSBleGVjdXRhYmxlCisgICAgICAgICAgICBsb2cuZGVidWcoImNvbW1hbmQgJXIgZmFpbGVkIHdpdGggZXhpdCBzdGF0dXMgJWQiICUgKGNtZCwgcmMpKQogICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXhlY0Vycm9yLCBcCi0gICAgICAgICAgICAgICAgICAiY29tbWFuZCAnJXMnIGZhaWxlZCB3aXRoIGV4aXQgc3RhdHVzICVkIiAlIChjbWRbMF0sIHJjKQorICAgICAgICAgICAgICAgICAgImNvbW1hbmQgJXIgZmFpbGVkIHdpdGggZXhpdCBzdGF0dXMgJWQiICUgKGNtZCwgcmMpCiAKIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKICAgICBmcm9tIGRpc3R1dGlscyBpbXBvcnQgc3lzY29uZmlnCkBAIC0xMDUsOCArMTE3LDkgQEAKICAgICBsb2cuaW5mbygnICcuam9pbihjbWQpKQogICAgIGlmIGRyeV9ydW46CiAgICAgICAgIHJldHVybgorICAgIGV4ZWN1dGFibGUgPSBjbWRbMF0KICAgICBleGVjX2ZuID0gc2VhcmNoX3BhdGggYW5kIG9zLmV4ZWN2cCBvciBvcy5leGVjdgotICAgIGV4ZWNfYXJncyA9IFtjbWRbMF0sIGNtZF0KKyAgICBlbnYgPSBOb25lCiAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgogICAgICAgICBnbG9iYWwgX2NmZ190YXJnZXQsIF9jZmdfdGFyZ2V0X3NwbGl0CiAgICAgICAgIGlmIF9jZmdfdGFyZ2V0IGlzIE5vbmU6CkBAIC0xMjcsMTggKzE0MCwyNCBAQAogICAgICAgICAgICAgZW52ID0gZGljdChvcy5lbnZpcm9uLAogICAgICAgICAgICAgICAgICAgICAgICBNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQ9Y3VyX3RhcmdldCkKICAgICAgICAgICAgIGV4ZWNfZm4gPSBzZWFyY2hfcGF0aCBhbmQgb3MuZXhlY3ZwZSBvciBvcy5leGVjdmUKLSAgICAgICAgICAgIGV4ZWNfYXJncy5hcHBlbmQoZW52KQogICAgIHBpZCA9IG9zLmZvcmsoKQogCiAgICAgaWYgcGlkID09IDA6ICAjIGluIHRoZSBjaGlsZAogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBleGVjX2ZuKCpleGVjX2FyZ3MpCisgICAgICAgICAgICBpZiBlbnYgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBleGVjX2ZuKGV4ZWN1dGFibGUsIGNtZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXhlY19mbihleGVjdXRhYmxlLCBjbWQsIGVudikKICAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGU6Ci0gICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJ1bmFibGUgdG8gZXhlY3V0ZSAlczogJXNcbiIgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY21kWzBdLCBlLnN0cmVycm9yKSkKKyAgICAgICAgICAgIGlmIG5vdCBERUJVRzoKKyAgICAgICAgICAgICAgICBjbWQgPSBleGVjdXRhYmxlCisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJ1bmFibGUgdG8gZXhlY3V0ZSAlcjogJXNcbiIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY21kLCBlLnN0cmVycm9yKSkKICAgICAgICAgICAgIG9zLl9leGl0KDEpCiAKLSAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgidW5hYmxlIHRvIGV4ZWN1dGUgJXMgZm9yIHVua25vd24gcmVhc29ucyIgJSBjbWRbMF0pCisgICAgICAgIGlmIG5vdCBERUJVRzoKKyAgICAgICAgICAgIGNtZCA9IGV4ZWN1dGFibGUKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgidW5hYmxlIHRvIGV4ZWN1dGUgJXIgZm9yIHVua25vd24gcmVhc29ucyIgJSBjbWQpCiAgICAgICAgIG9zLl9leGl0KDEpCiAgICAgZWxzZTogICAjIGluIHRoZSBwYXJlbnQKICAgICAgICAgIyBMb29wIHVudGlsIHRoZSBjaGlsZCBlaXRoZXIgZXhpdHMgb3IgaXMgdGVybWluYXRlZCBieSBhIHNpZ25hbApAQCAtMTUwLDI5ICsxNjksMzcgQEAKICAgICAgICAgICAgICAgICBpbXBvcnQgZXJybm8KICAgICAgICAgICAgICAgICBpZiBleGMuZXJybm8gPT0gZXJybm8uRUlOVFI6CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgbm90IERFQlVHOgorICAgICAgICAgICAgICAgICAgICBjbWQgPSBleGVjdXRhYmxlCiAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXhlY0Vycm9yLCBcCi0gICAgICAgICAgICAgICAgICAgICAgImNvbW1hbmQgJyVzJyBmYWlsZWQ6ICVzIiAlIChjbWRbMF0sIGV4Y1stMV0pCisgICAgICAgICAgICAgICAgICAgICAgImNvbW1hbmQgJXIgZmFpbGVkOiAlcyIgJSAoY21kLCBleGNbLTFdKQogICAgICAgICAgICAgaWYgb3MuV0lGU0lHTkFMRUQoc3RhdHVzKToKKyAgICAgICAgICAgICAgICBpZiBub3QgREVCVUc6CisgICAgICAgICAgICAgICAgICAgIGNtZCA9IGV4ZWN1dGFibGUKICAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFeGVjRXJyb3IsIFwKLSAgICAgICAgICAgICAgICAgICAgICAiY29tbWFuZCAnJXMnIHRlcm1pbmF0ZWQgYnkgc2lnbmFsICVkIiAlIFwKLSAgICAgICAgICAgICAgICAgICAgICAoY21kWzBdLCBvcy5XVEVSTVNJRyhzdGF0dXMpKQorICAgICAgICAgICAgICAgICAgICAgICJjb21tYW5kICVyIHRlcm1pbmF0ZWQgYnkgc2lnbmFsICVkIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAoY21kLCBvcy5XVEVSTVNJRyhzdGF0dXMpKQogCiAgICAgICAgICAgICBlbGlmIG9zLldJRkVYSVRFRChzdGF0dXMpOgogICAgICAgICAgICAgICAgIGV4aXRfc3RhdHVzID0gb3MuV0VYSVRTVEFUVVMoc3RhdHVzKQogICAgICAgICAgICAgICAgIGlmIGV4aXRfc3RhdHVzID09IDA6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgICMgaGV5LCBpdCBzdWNjZWVkZWQhCiAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IERFQlVHOgorICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gZXhlY3V0YWJsZQogICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFeGVjRXJyb3IsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbW1hbmQgJyVzJyBmYWlsZWQgd2l0aCBleGl0IHN0YXR1cyAlZCIgJSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChjbWRbMF0sIGV4aXRfc3RhdHVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tbWFuZCAlciBmYWlsZWQgd2l0aCBleGl0IHN0YXR1cyAlZCIgJSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjbWQsIGV4aXRfc3RhdHVzKQogCiAgICAgICAgICAgICBlbGlmIG9zLldJRlNUT1BQRUQoc3RhdHVzKToKICAgICAgICAgICAgICAgICBjb250aW51ZQogCiAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIG5vdCBERUJVRzoKKyAgICAgICAgICAgICAgICAgICAgY21kID0gZXhlY3V0YWJsZQogICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0V4ZWNFcnJvciwgXAotICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIGVycm9yIGV4ZWN1dGluZyAnJXMnOiB0ZXJtaW5hdGlvbiBzdGF0dXMgJWQiICUgXAotICAgICAgICAgICAgICAgICAgICAgIChjbWRbMF0sIHN0YXR1cykKKyAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biBlcnJvciBleGVjdXRpbmcgJXI6IHRlcm1pbmF0aW9uIHN0YXR1cyAlZCIgJSBcCisgICAgICAgICAgICAgICAgICAgICAgKGNtZCwgc3RhdHVzKQogCiBkZWYgZmluZF9leGVjdXRhYmxlKGV4ZWN1dGFibGUsIHBhdGg9Tm9uZSk6CiAgICAgIiIiVHJpZXMgdG8gZmluZCAnZXhlY3V0YWJsZScgaW4gdGhlIGRpcmVjdG9yaWVzIGxpc3RlZCBpbiAncGF0aCcuCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3N5c2NvbmZpZy5weSBiL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CmluZGV4IDBkNmQ0YzQuLmRlN2RhMWQgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CkBAIC0zNyw2ICszNywxMSBAQAogICAgIHByb2plY3RfYmFzZSA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4ocHJvamVjdF9iYXNlLCBvcy5wYXRoLnBhcmRpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGgucGFyZGlyKSkKIAorIyBzZXQgZm9yIGNyb3NzIGJ1aWxkcworaWYgIl9QWVRIT05fUFJPSkVDVF9CQVNFIiBpbiBvcy5lbnZpcm9uOgorICAgICMgdGhpcyBpcyB0aGUgYnVpbGQgZGlyZWN0b3J5LCBhdCBsZWFzdCBmb3IgcG9zaXgKKyAgICBwcm9qZWN0X2Jhc2UgPSBvcy5wYXRoLm5vcm1wYXRoKG9zLmVudmlyb25bIl9QWVRIT05fUFJPSkVDVF9CQVNFIl0pCisKICMgcHl0aG9uX2J1aWxkOiAoQm9vbGVhbikgaWYgdHJ1ZSwgd2UncmUgZWl0aGVyIGJ1aWxkaW5nIFB5dGhvbiBvcgogIyBidWlsZGluZyBhbiBleHRlbnNpb24gd2l0aCBhbiB1bi1pbnN0YWxsZWQgUHl0aG9uLCBzbyB3ZSB1c2UKICMgZGlmZmVyZW50IChoYXJkLXdpcmVkKSBkaXJlY3Rvcmllcy4KQEAgLTE0Miw2ICsxNDcsNyBAQAogICAgICAgICAgICAgIm9uIHBsYXRmb3JtICclcyciICUgb3MubmFtZSkKIAogCisKIGRlZiBjdXN0b21pemVfY29tcGlsZXIoY29tcGlsZXIpOgogICAgICIiIkRvIGFueSBwbGF0Zm9ybS1zcGVjaWZpYyBjdXN0b21pemF0aW9uIG9mIGEgQ0NvbXBpbGVyIGluc3RhbmNlLgogCkBAIC0xNDksMTIgKzE1NSwzNiBAQAogICAgIHZhcmllcyBhY3Jvc3MgVW5pY2VzIGFuZCBpcyBzdG9yZWQgaW4gUHl0aG9uJ3MgTWFrZWZpbGUuCiAgICAgIiIiCiAgICAgaWYgY29tcGlsZXIuY29tcGlsZXJfdHlwZSA9PSAidW5peCI6Ci0gICAgICAgIChjYywgY3h4LCBvcHQsIGNmbGFncywgY2NzaGFyZWQsIGxkc2hhcmVkLCBzb19leHQpID0gXAorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CisgICAgICAgICAgICAjIFBlcmZvcm0gZmlyc3QtdGltZSBjdXN0b21pemF0aW9uIG9mIGNvbXBpbGVyLXJlbGF0ZWQKKyAgICAgICAgICAgICMgY29uZmlnIHZhcnMgb24gT1MgWCBub3cgdGhhdCB3ZSBrbm93IHdlIG5lZWQgYSBjb21waWxlci4KKyAgICAgICAgICAgICMgVGhpcyBpcyBwcmltYXJpbHkgdG8gc3VwcG9ydCBQeXRob25zIGZyb20gYmluYXJ5CisgICAgICAgICAgICAjIGluc3RhbGxlcnMuICBUaGUga2luZCBhbmQgcGF0aHMgdG8gYnVpbGQgdG9vbHMgb24KKyAgICAgICAgICAgICMgdGhlIHVzZXIgc3lzdGVtIG1heSB2YXJ5IHNpZ25pZmljYW50bHkgZnJvbSB0aGUgc3lzdGVtCisgICAgICAgICAgICAjIHRoYXQgUHl0aG9uIGl0c2VsZiB3YXMgYnVpbHQgb24uICBBbHNvIHRoZSB1c2VyIE9TCisgICAgICAgICAgICAjIHZlcnNpb24gYW5kIGJ1aWxkIHRvb2xzIG1heSBub3Qgc3VwcG9ydCB0aGUgc2FtZSBzZXQKKyAgICAgICAgICAgICMgb2YgQ1BVIGFyY2hpdGVjdHVyZXMgZm9yIHVuaXZlcnNhbCBidWlsZHMuCisgICAgICAgICAgICBnbG9iYWwgX2NvbmZpZ192YXJzCisgICAgICAgICAgICAjIFVzZSBnZXRfY29uZmlnX3ZhcigpIHRvIGVuc3VyZSBfY29uZmlnX3ZhcnMgaXMgaW5pdGlhbGl6ZWQuCisgICAgICAgICAgICBpZiBub3QgZ2V0X2NvbmZpZ192YXIoJ0NVU1RPTUlaRURfT1NYX0NPTVBJTEVSJyk6CisgICAgICAgICAgICAgICAgaW1wb3J0IF9vc3hfc3VwcG9ydAorICAgICAgICAgICAgICAgIF9vc3hfc3VwcG9ydC5jdXN0b21pemVfY29tcGlsZXIoX2NvbmZpZ192YXJzKQorICAgICAgICAgICAgICAgIF9jb25maWdfdmFyc1snQ1VTVE9NSVpFRF9PU1hfQ09NUElMRVInXSA9ICdUcnVlJworCisgICAgICAgIChjYywgY3h4LCBvcHQsIGNmbGFncywgY2NzaGFyZWQsIGxkc2hhcmVkLCBzb19leHQsIGFyLCBhcl9mbGFncykgPSBcCiAgICAgICAgICAgICBnZXRfY29uZmlnX3ZhcnMoJ0NDJywgJ0NYWCcsICdPUFQnLCAnQ0ZMQUdTJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ0NTSEFSRUQnLCAnTERTSEFSRUQnLCAnU08nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDQ1NIQVJFRCcsICdMRFNIQVJFRCcsICdTTycsICdBUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FSRkxBR1MnKQogCiAgICAgICAgIGlmICdDQycgaW4gb3MuZW52aXJvbjoKLSAgICAgICAgICAgIGNjID0gb3MuZW52aXJvblsnQ0MnXQorICAgICAgICAgICAgbmV3Y2MgPSBvcy5lbnZpcm9uWydDQyddCisgICAgICAgICAgICBpZiAoc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nCisgICAgICAgICAgICAgICAgICAgIGFuZCAnTERTSEFSRUQnIG5vdCBpbiBvcy5lbnZpcm9uCisgICAgICAgICAgICAgICAgICAgIGFuZCBsZHNoYXJlZC5zdGFydHN3aXRoKGNjKSk6CisgICAgICAgICAgICAgICAgIyBPbiBPUyBYLCBpZiBDQyBpcyBvdmVycmlkZGVuLCB1c2UgdGhhdCBhcyB0aGUgZGVmYXVsdAorICAgICAgICAgICAgICAgICMgICAgICAgY29tbWFuZCBmb3IgTERTSEFSRUQgYXMgd2VsbAorICAgICAgICAgICAgICAgIGxkc2hhcmVkID0gbmV3Y2MgKyBsZHNoYXJlZFtsZW4oY2MpOl0KKyAgICAgICAgICAgIGNjID0gbmV3Y2MKICAgICAgICAgaWYgJ0NYWCcgaW4gb3MuZW52aXJvbjoKICAgICAgICAgICAgIGN4eCA9IG9zLmVudmlyb25bJ0NYWCddCiAgICAgICAgIGlmICdMRFNIQVJFRCcgaW4gb3MuZW52aXJvbjoKQEAgLTE3Miw2ICsyMDIsMTIgQEAKICAgICAgICAgICAgIGNwcCA9IGNwcCArICcgJyArIG9zLmVudmlyb25bJ0NQUEZMQUdTJ10KICAgICAgICAgICAgIGNmbGFncyA9IGNmbGFncyArICcgJyArIG9zLmVudmlyb25bJ0NQUEZMQUdTJ10KICAgICAgICAgICAgIGxkc2hhcmVkID0gbGRzaGFyZWQgKyAnICcgKyBvcy5lbnZpcm9uWydDUFBGTEFHUyddCisgICAgICAgIGlmICdBUicgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgIGFyID0gb3MuZW52aXJvblsnQVInXQorICAgICAgICBpZiAnQVJGTEFHUycgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgIGFyY2hpdmVyID0gYXIgKyAnICcgKyBvcy5lbnZpcm9uWydBUkZMQUdTJ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFyY2hpdmVyID0gYXIgKyAnICcgKyBhcl9mbGFncwogCiAgICAgICAgIGNjX2NtZCA9IGNjICsgJyAnICsgY2ZsYWdzCiAgICAgICAgIGNvbXBpbGVyLnNldF9leGVjdXRhYmxlcygKQEAgLTE4MCw3ICsyMTYsOCBAQAogICAgICAgICAgICAgY29tcGlsZXJfc289Y2NfY21kICsgJyAnICsgY2NzaGFyZWQsCiAgICAgICAgICAgICBjb21waWxlcl9jeHg9Y3h4LAogICAgICAgICAgICAgbGlua2VyX3NvPWxkc2hhcmVkLAotICAgICAgICAgICAgbGlua2VyX2V4ZT1jYykKKyAgICAgICAgICAgIGxpbmtlcl9leGU9Y2MsCisgICAgICAgICAgICBhcmNoaXZlcj1hcmNoaXZlcikKIAogICAgICAgICBjb21waWxlci5zaGFyZWRfbGliX2V4dGVuc2lvbiA9IHNvX2V4dAogCkBAIC0yMDUsNyArMjQyLDcgQEAKIGRlZiBnZXRfbWFrZWZpbGVfZmlsZW5hbWUoKToKICAgICAiIiJSZXR1cm4gZnVsbCBwYXRobmFtZSBvZiBpbnN0YWxsZWQgTWFrZWZpbGUgZnJvbSB0aGUgUHl0aG9uIGJ1aWxkLiIiIgogICAgIGlmIHB5dGhvbl9idWlsZDoKLSAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoc3lzLmV4ZWN1dGFibGUpLCAiTWFrZWZpbGUiKQorICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHByb2plY3RfYmFzZSwgIk1ha2VmaWxlIikKICAgICBsaWJfZGlyID0gZ2V0X3B5dGhvbl9saWIocGxhdF9zcGVjaWZpYz0xLCBzdGFuZGFyZF9saWI9MSkKICAgICByZXR1cm4gb3MucGF0aC5qb2luKGxpYl9kaXIsICJjb25maWciLCAiTWFrZWZpbGUiKQogCkBAIC0zNTcsNjYgKzM5NCwxMSBAQAogCiBkZWYgX2luaXRfcG9zaXgoKToKICAgICAiIiJJbml0aWFsaXplIHRoZSBtb2R1bGUgYXMgYXBwcm9wcmlhdGUgZm9yIFBPU0lYIHN5c3RlbXMuIiIiCi0gICAgZyA9IHt9Ci0gICAgIyBsb2FkIHRoZSBpbnN0YWxsZWQgTWFrZWZpbGU6Ci0gICAgdHJ5OgotICAgICAgICBmaWxlbmFtZSA9IGdldF9tYWtlZmlsZV9maWxlbmFtZSgpCi0gICAgICAgIHBhcnNlX21ha2VmaWxlKGZpbGVuYW1lLCBnKQotICAgIGV4Y2VwdCBJT0Vycm9yLCBtc2c6Ci0gICAgICAgIG15X21zZyA9ICJpbnZhbGlkIFB5dGhvbiBpbnN0YWxsYXRpb246IHVuYWJsZSB0byBvcGVuICVzIiAlIGZpbGVuYW1lCi0gICAgICAgIGlmIGhhc2F0dHIobXNnLCAic3RyZXJyb3IiKToKLSAgICAgICAgICAgIG15X21zZyA9IG15X21zZyArICIgKCVzKSIgJSBtc2cuc3RyZXJyb3IKLQotICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yKG15X21zZykKLQotICAgICMgbG9hZCB0aGUgaW5zdGFsbGVkIHB5Y29uZmlnLmg6Ci0gICAgdHJ5OgotICAgICAgICBmaWxlbmFtZSA9IGdldF9jb25maWdfaF9maWxlbmFtZSgpCi0gICAgICAgIHBhcnNlX2NvbmZpZ19oKGZpbGUoZmlsZW5hbWUpLCBnKQotICAgIGV4Y2VwdCBJT0Vycm9yLCBtc2c6Ci0gICAgICAgIG15X21zZyA9ICJpbnZhbGlkIFB5dGhvbiBpbnN0YWxsYXRpb246IHVuYWJsZSB0byBvcGVuICVzIiAlIGZpbGVuYW1lCi0gICAgICAgIGlmIGhhc2F0dHIobXNnLCAic3RyZXJyb3IiKToKLSAgICAgICAgICAgIG15X21zZyA9IG15X21zZyArICIgKCVzKSIgJSBtc2cuc3RyZXJyb3IKLQotICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yKG15X21zZykKLQotICAgICMgT24gQUlYLCB0aGVyZSBhcmUgd3JvbmcgcGF0aHMgdG8gdGhlIGxpbmtlciBzY3JpcHRzIGluIHRoZSBNYWtlZmlsZQotICAgICMgLS0gdGhlc2UgcGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBQeXRob24gc291cmNlLCBidXQgd2hlbiBpbnN0YWxsZWQKLSAgICAjIHRoZSBzY3JpcHRzIGFyZSBpbiBhbm90aGVyIGRpcmVjdG9yeS4KLSAgICBpZiBweXRob25fYnVpbGQ6Ci0gICAgICAgIGdbJ0xEU0hBUkVEJ10gPSBnWydCTERTSEFSRUQnXQotCi0gICAgZWxpZiBnZXRfcHl0aG9uX3ZlcnNpb24oKSA8ICcyLjEnOgotICAgICAgICAjIFRoZSBmb2xsb3dpbmcgdHdvIGJyYW5jaGVzIGFyZSBmb3IgMS41LjIgY29tcGF0aWJpbGl0eS4KLSAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdhaXg0JzogICAgICAgICAgIyB3aGF0IGFib3V0IEFJWCAzLnggPwotICAgICAgICAgICAgIyBMaW5rZXIgc2NyaXB0IGlzIGluIHRoZSBjb25maWcgZGlyZWN0b3J5LCBub3QgaW4gTW9kdWxlcyBhcyB0aGUKLSAgICAgICAgICAgICMgTWFrZWZpbGUgc2F5cy4KLSAgICAgICAgICAgIHB5dGhvbl9saWIgPSBnZXRfcHl0aG9uX2xpYihzdGFuZGFyZF9saWI9MSkKLSAgICAgICAgICAgIGxkX3NvX2FpeCA9IG9zLnBhdGguam9pbihweXRob25fbGliLCAnY29uZmlnJywgJ2xkX3NvX2FpeCcpCi0gICAgICAgICAgICBweXRob25fZXhwID0gb3MucGF0aC5qb2luKHB5dGhvbl9saWIsICdjb25maWcnLCAncHl0aG9uLmV4cCcpCi0KLSAgICAgICAgICAgIGdbJ0xEU0hBUkVEJ10gPSAiJXMgJXMgLWJJOiVzIiAlIChsZF9zb19haXgsIGdbJ0NDJ10sIHB5dGhvbl9leHApCi0KLSAgICAgICAgZWxpZiBzeXMucGxhdGZvcm0gPT0gJ2Jlb3MnOgotICAgICAgICAgICAgIyBMaW5rZXIgc2NyaXB0IGlzIGluIHRoZSBjb25maWcgZGlyZWN0b3J5LiAgSW4gdGhlIE1ha2VmaWxlIGl0IGlzCi0gICAgICAgICAgICAjIHJlbGF0aXZlIHRvIHRoZSBzcmNkaXIsIHdoaWNoIGFmdGVyIGluc3RhbGxhdGlvbiBubyBsb25nZXIgbWFrZXMKLSAgICAgICAgICAgICMgc2Vuc2UuCi0gICAgICAgICAgICBweXRob25fbGliID0gZ2V0X3B5dGhvbl9saWIoc3RhbmRhcmRfbGliPTEpCi0gICAgICAgICAgICBsaW5rZXJzY3JpcHRfcGF0aCA9IHN0cmluZy5zcGxpdChnWydMRFNIQVJFRCddKVswXQotICAgICAgICAgICAgbGlua2Vyc2NyaXB0X25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGxpbmtlcnNjcmlwdF9wYXRoKQotICAgICAgICAgICAgbGlua2Vyc2NyaXB0ID0gb3MucGF0aC5qb2luKHB5dGhvbl9saWIsICdjb25maWcnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtlcnNjcmlwdF9uYW1lKQotCi0gICAgICAgICAgICAjIFhYWCB0aGlzIGlzbid0IHRoZSByaWdodCBwbGFjZSB0byBkbyB0aGlzOiBhZGRpbmcgdGhlIFB5dGhvbgotICAgICAgICAgICAgIyBsaWJyYXJ5IHRvIHRoZSBsaW5rLCBpZiBuZWVkZWQsIHNob3VsZCBiZSBpbiB0aGUgImJ1aWxkX2V4dCIKLSAgICAgICAgICAgICMgY29tbWFuZC4gIChJdCdzIGFsc28gbmVlZGVkIGZvciBub24tTVMgY29tcGlsZXJzIG9uIFdpbmRvd3MsIGFuZAotICAgICAgICAgICAgIyBpdCdzIHRha2VuIGNhcmUgb2YgZm9yIHRoZW0gYnkgdGhlICdidWlsZF9leHQuZ2V0X2xpYnJhcmllcygpJwotICAgICAgICAgICAgIyBtZXRob2QuKQotICAgICAgICAgICAgZ1snTERTSEFSRUQnXSA9ICgiJXMgLUwlcy9saWIgLWxweXRob24lcyIgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGlua2Vyc2NyaXB0LCBQUkVGSVgsIGdldF9weXRob25fdmVyc2lvbigpKSkKLQorICAgICMgX3N5c2NvbmZpZ2RhdGEgaXMgZ2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUsIHNlZSB0aGUgc3lzY29uZmlnIG1vZHVsZQorICAgIGZyb20gX3N5c2NvbmZpZ2RhdGEgaW1wb3J0IGJ1aWxkX3RpbWVfdmFycwogICAgIGdsb2JhbCBfY29uZmlnX3ZhcnMKLSAgICBfY29uZmlnX3ZhcnMgPSBnCisgICAgX2NvbmZpZ192YXJzID0ge30KKyAgICBfY29uZmlnX3ZhcnMudXBkYXRlKGJ1aWxkX3RpbWVfdmFycykKIAogCiBkZWYgX2luaXRfbnQoKToKQEAgLTQ3OSw2NiArNDYxLDExIEBACiAgICAgICAgIF9jb25maWdfdmFyc1sncHJlZml4J10gPSBQUkVGSVgKICAgICAgICAgX2NvbmZpZ192YXJzWydleGVjX3ByZWZpeCddID0gRVhFQ19QUkVGSVgKIAorICAgICAgICAjIE9TIFggcGxhdGZvcm1zIHJlcXVpcmUgc3BlY2lhbCBjdXN0b21pemF0aW9uIHRvIGhhbmRsZQorICAgICAgICAjIG11bHRpLWFyY2hpdGVjdHVyZSwgbXVsdGktb3MtdmVyc2lvbiBpbnN0YWxsZXJzCiAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKLSAgICAgICAgICAgIGtlcm5lbF92ZXJzaW9uID0gb3MudW5hbWUoKVsyXSAjIEtlcm5lbCB2ZXJzaW9uICg4LjQuMykKLSAgICAgICAgICAgIG1ham9yX3ZlcnNpb24gPSBpbnQoa2VybmVsX3ZlcnNpb24uc3BsaXQoJy4nKVswXSkKLQotICAgICAgICAgICAgaWYgbWFqb3JfdmVyc2lvbiA8IDg6Ci0gICAgICAgICAgICAgICAgIyBPbiBNYWMgT1MgWCBiZWZvcmUgMTAuNCwgY2hlY2sgaWYgLWFyY2ggYW5kIC1pc3lzcm9vdAotICAgICAgICAgICAgICAgICMgYXJlIGluIENGTEFHUyBvciBMREZMQUdTIGFuZCByZW1vdmUgdGhlbSBpZiB0aGV5IGFyZS4KLSAgICAgICAgICAgICAgICAjIFRoaXMgaXMgbmVlZGVkIHdoZW4gYnVpbGRpbmcgZXh0ZW5zaW9ucyBvbiBhIDEwLjMgc3lzdGVtCi0gICAgICAgICAgICAgICAgIyB1c2luZyBhIHVuaXZlcnNhbCBidWlsZCBvZiBweXRob24uCi0gICAgICAgICAgICAgICAgZm9yIGtleSBpbiAoJ0xERkxBR1MnLCAnQkFTRUNGTEFHUycsICdMRFNIQVJFRCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAjIGEgbnVtYmVyIG9mIGRlcml2ZWQgdmFyaWFibGVzLiBUaGVzZSBuZWVkIHRvIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAjIHBhdGNoZWQgdXAgYXMgd2VsbC4KLSAgICAgICAgICAgICAgICAgICAgICAgICdDRkxBR1MnLCAnUFlfQ0ZMQUdTJywgJ0JMRFNIQVJFRCcpOgotICAgICAgICAgICAgICAgICAgICBmbGFncyA9IF9jb25maWdfdmFyc1trZXldCi0gICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcmUuc3ViKCctYXJjaFxzK1x3K1xzJywgJyAnLCBmbGFncykKLSAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSByZS5zdWIoJy1pc3lzcm9vdCBbXiBcdF0qJywgJyAnLCBmbGFncykKLSAgICAgICAgICAgICAgICAgICAgX2NvbmZpZ192YXJzW2tleV0gPSBmbGFncwotCi0gICAgICAgICAgICBlbHNlOgotCi0gICAgICAgICAgICAgICAgIyBBbGxvdyB0aGUgdXNlciB0byBvdmVycmlkZSB0aGUgYXJjaGl0ZWN0dXJlIGZsYWdzIHVzaW5nCi0gICAgICAgICAgICAgICAgIyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLSAgICAgICAgICAgICAgICAjIE5PVEU6IFRoaXMgbmFtZSB3YXMgaW50cm9kdWNlZCBieSBBcHBsZSBpbiBPU1ggMTAuNSBhbmQKLSAgICAgICAgICAgICAgICAjIGlzIHVzZWQgYnkgc2V2ZXJhbCBzY3JpcHRpbmcgbGFuZ3VhZ2VzIGRpc3RyaWJ1dGVkIHdpdGgKLSAgICAgICAgICAgICAgICAjIHRoYXQgT1MgcmVsZWFzZS4KLQotICAgICAgICAgICAgICAgIGlmICdBUkNIRkxBR1MnIGluIG9zLmVudmlyb246Ci0gICAgICAgICAgICAgICAgICAgIGFyY2ggPSBvcy5lbnZpcm9uWydBUkNIRkxBR1MnXQotICAgICAgICAgICAgICAgICAgICBmb3Iga2V5IGluICgnTERGTEFHUycsICdCQVNFQ0ZMQUdTJywgJ0xEU0hBUkVEJywKLSAgICAgICAgICAgICAgICAgICAgICAgICMgYSBudW1iZXIgb2YgZGVyaXZlZCB2YXJpYWJsZXMuIFRoZXNlIG5lZWQgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICMgcGF0Y2hlZCB1cCBhcyB3ZWxsLgotICAgICAgICAgICAgICAgICAgICAgICAgJ0NGTEFHUycsICdQWV9DRkxBR1MnLCAnQkxEU0hBUkVEJyk6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gX2NvbmZpZ192YXJzW2tleV0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcmUuc3ViKCctYXJjaFxzK1x3K1xzJywgJyAnLCBmbGFncykKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gZmxhZ3MgKyAnICcgKyBhcmNoCi0gICAgICAgICAgICAgICAgICAgICAgICBfY29uZmlnX3ZhcnNba2V5XSA9IGZsYWdzCi0KLSAgICAgICAgICAgICAgICAjIElmIHdlJ3JlIG9uIE9TWCAxMC41IG9yIGxhdGVyIGFuZCB0aGUgdXNlciB0cmllcyB0bwotICAgICAgICAgICAgICAgICMgY29tcGlsZXMgYW4gZXh0ZW5zaW9uIHVzaW5nIGFuIFNESyB0aGF0IGlzIG5vdCBwcmVzZW50Ci0gICAgICAgICAgICAgICAgIyBvbiB0aGUgY3VycmVudCBtYWNoaW5lIGl0IGlzIGJldHRlciB0byBub3QgdXNlIGFuIFNESwotICAgICAgICAgICAgICAgICMgdGhhbiB0byBmYWlsLgotICAgICAgICAgICAgICAgICMKLSAgICAgICAgICAgICAgICAjIFRoZSBtYWpvciB1c2VjYXNlIGZvciB0aGlzIGlzIHVzZXJzIHVzaW5nIGEgUHl0aG9uLm9yZwotICAgICAgICAgICAgICAgICMgYmluYXJ5IGluc3RhbGxlciAgb24gT1NYIDEwLjY6IHRoYXQgaW5zdGFsbGVyIHVzZXMKLSAgICAgICAgICAgICAgICAjIHRoZSAxMC40dSBTREssIGJ1dCB0aGF0IFNESyBpcyBub3QgaW5zdGFsbGVkIGJ5IGRlZmF1bHQKLSAgICAgICAgICAgICAgICAjIHdoZW4geW91IGluc3RhbGwgWGNvZGUuCi0gICAgICAgICAgICAgICAgIwotICAgICAgICAgICAgICAgIG0gPSByZS5zZWFyY2goJy1pc3lzcm9vdFxzKyhcUyspJywgX2NvbmZpZ192YXJzWydDRkxBR1MnXSkKLSAgICAgICAgICAgICAgICBpZiBtIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgICAgICBzZGsgPSBtLmdyb3VwKDEpCi0gICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZGspOgotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGtleSBpbiAoJ0xERkxBR1MnLCAnQkFTRUNGTEFHUycsICdMRFNIQVJFRCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYSBudW1iZXIgb2YgZGVyaXZlZCB2YXJpYWJsZXMuIFRoZXNlIG5lZWQgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwYXRjaGVkIHVwIGFzIHdlbGwuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NGTEFHUycsICdQWV9DRkxBR1MnLCAnQkxEU0hBUkVEJyk6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IF9jb25maWdfdmFyc1trZXldCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSByZS5zdWIoJy1pc3lzcm9vdFxzK1xTKyhcc3wkKScsICcgJywgZmxhZ3MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbmZpZ192YXJzW2tleV0gPSBmbGFncworICAgICAgICAgICAgaW1wb3J0IF9vc3hfc3VwcG9ydAorICAgICAgICAgICAgX29zeF9zdXBwb3J0LmN1c3RvbWl6ZV9jb25maWdfdmFycyhfY29uZmlnX3ZhcnMpCiAKICAgICBpZiBhcmdzOgogICAgICAgICB2YWxzID0gW10KZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvc3VwcG9ydC5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvc3VwcG9ydC5weQppbmRleCBhMjE5MGMwLi45NmRjZDk0IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3N1cHBvcnQucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy9zdXBwb3J0LnB5CkBAIC0yMDAsNiArMjAwLDkgQEAKICAgICAgICAgY21kID0gYnVpbGRfZXh0KGRpc3QpCiAgICAgICAgIHN1cHBvcnQuZml4dXBfYnVpbGRfZXh0KGNtZCkKICAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorCisgICAgVW5saWtlIG1vc3Qgb3RoZXIgVW5peCBwbGF0Zm9ybXMsIE1hYyBPUyBYIGVtYmVkcyBhYnNvbHV0ZSBwYXRocworICAgIHRvIHNoYXJlZCBsaWJyYXJpZXMgaW50byBleGVjdXRhYmxlcywgc28gdGhlIGZpeHVwIGlzIG5vdCBuZWVkZWQgdGhlcmUuCiAgICAgIiIiCiAgICAgaWYgb3MubmFtZSA9PSAnbnQnOgogICAgICAgICBjbWQuZGVidWcgPSBzeXMuZXhlY3V0YWJsZS5lbmRzd2l0aCgnX2QuZXhlJykKQEAgLTIxMSw1ICsyMTQsOCBAQAogICAgICAgICBpZiBydW5zaGFyZWQgaXMgTm9uZToKICAgICAgICAgICAgIGNtZC5saWJyYXJ5X2RpcnMgPSBbJy4nXQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgbmFtZSwgZXF1YWxzLCB2YWx1ZSA9IHJ1bnNoYXJlZC5wYXJ0aXRpb24oJz0nKQotICAgICAgICAgICAgY21kLmxpYnJhcnlfZGlycyA9IHZhbHVlLnNwbGl0KG9zLnBhdGhzZXApCisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgICAgICAgICAgY21kLmxpYnJhcnlfZGlycyA9IFtdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5hbWUsIGVxdWFscywgdmFsdWUgPSBydW5zaGFyZWQucGFydGl0aW9uKCc9JykKKyAgICAgICAgICAgICAgICBjbWQubGlicmFyeV9kaXJzID0gW2QgZm9yIGQgaW4gdmFsdWUuc3BsaXQob3MucGF0aHNlcCkgaWYgZF0KZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9hcmNoaXZlX3V0aWwucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYXJjaGl2ZV91dGlsLnB5CmluZGV4IDFmNzEwNmYuLmVkN2MyY2UgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9hcmNoaXZlX3V0aWwucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2FyY2hpdmVfdXRpbC5weQpAQCAtMSw4ICsxLDEwIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQogIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5hcmNoaXZlX3V0aWwuIiIiCiBfX3JldmlzaW9uX18gPSAiJElkJCIKIAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgb3MKK2ltcG9ydCBzeXMKIGltcG9ydCB0YXJmaWxlCiBmcm9tIG9zLnBhdGggaW1wb3J0IHNwbGl0ZHJpdmUKIGltcG9ydCB3YXJuaW5ncwpAQCAtMzMsNiArMzUsMTggQEAKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICB6bGliID0gTm9uZQogCitkZWYgY2FuX2ZzX2VuY29kZShmaWxlbmFtZSk6CisgICAgIiIiCisgICAgUmV0dXJuIFRydWUgaWYgdGhlIGZpbGVuYW1lIGNhbiBiZSBzYXZlZCBpbiB0aGUgZmlsZSBzeXN0ZW0uCisgICAgIiIiCisgICAgaWYgb3MucGF0aC5zdXBwb3J0c191bmljb2RlX2ZpbGVuYW1lczoKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICB0cnk6CisgICAgICAgIGZpbGVuYW1lLmVuY29kZShzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkpCisgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgcmV0dXJuIFRydWUKKwogCiBjbGFzcyBBcmNoaXZlVXRpbFRlc3RDYXNlKHN1cHBvcnQuVGVtcGRpck1hbmFnZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQuTG9nZ2luZ1NpbGVuY2VyLApAQCAtNDAsNiArNTQsOSBAQAogCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQogICAgIGRlZiB0ZXN0X21ha2VfdGFyYmFsbChzZWxmKToKKyAgICAgICAgc2VsZi5fbWFrZV90YXJiYWxsKCdhcmNoaXZlJykKKworICAgIGRlZiBfbWFrZV90YXJiYWxsKHNlbGYsIHRhcmdldF9uYW1lKToKICAgICAgICAgIyBjcmVhdGluZyBzb21ldGhpbmcgdG8gdGFyCiAgICAgICAgIHRtcGRpciA9IHNlbGYubWtkdGVtcCgpCiAgICAgICAgIHNlbGYud3JpdGVfZmlsZShbdG1wZGlyLCAnZmlsZTEnXSwgJ3h4eCcpCkBAIC01MSw3ICs2OCw3IEBACiAgICAgICAgIHVuaXR0ZXN0LnNraXBVbmxlc3Moc3BsaXRkcml2ZSh0bXBkaXIpWzBdID09IHNwbGl0ZHJpdmUodG1wZGlyMilbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZSBhbmQgdGFyZ2V0IHNob3VsZCBiZSBvbiBzYW1lIGRyaXZlIikKIAotICAgICAgICBiYXNlX25hbWUgPSBvcy5wYXRoLmpvaW4odG1wZGlyMiwgJ2FyY2hpdmUnKQorICAgICAgICBiYXNlX25hbWUgPSBvcy5wYXRoLmpvaW4odG1wZGlyMiwgdGFyZ2V0X25hbWUpCiAKICAgICAgICAgIyB3b3JraW5nIHdpdGggcmVsYXRpdmUgcGF0aHMgdG8gYXZvaWQgdGFyIHdhcm5pbmdzCiAgICAgICAgIG9sZF9kaXIgPSBvcy5nZXRjd2QoKQpAQCAtNjYsNyArODMsNyBAQAogICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHModGFyYmFsbCkpCiAKICAgICAgICAgIyB0cnlpbmcgYW4gdW5jb21wcmVzc2VkIG9uZQotICAgICAgICBiYXNlX25hbWUgPSBvcy5wYXRoLmpvaW4odG1wZGlyMiwgJ2FyY2hpdmUnKQorICAgICAgICBiYXNlX25hbWUgPSBvcy5wYXRoLmpvaW4odG1wZGlyMiwgdGFyZ2V0X25hbWUpCiAgICAgICAgIG9sZF9kaXIgPSBvcy5nZXRjd2QoKQogICAgICAgICBvcy5jaGRpcih0bXBkaXIpCiAgICAgICAgIHRyeToKQEAgLTE4Miw3ICsxOTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcnlfcnVuPVRydWUpCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBvcy5jaGRpcihvbGRfZGlyKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG9zLnBhdGguZXhpc3RzKHRhcmJhbGwpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9zLnBhdGguZXhpc3RzKHRhcmJhbGwpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3Lndhcm5pbmdzKSwgMSkKIAogICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHpsaWIsICJSZXF1aXJlcyB6bGliIikKQEAgLTI3Nyw2ICsyOTQsMzMgQEAKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIGRlbCBBUkNISVZFX0ZPUk1BVFNbJ3h4eCddCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgZGVmIHRlc3RfbWFrZV90YXJiYWxsX3VuaWNvZGUoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBNaXJyb3IgdGVzdF9tYWtlX3RhcmJhbGwsIGV4Y2VwdCBmaWxlbmFtZSBpcyB1bmljb2RlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fbWFrZV90YXJiYWxsKHUnYXJjaGl2ZScpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoY2FuX2ZzX2VuY29kZSh1J8OlcmNoaXYnKSwKKyAgICAgICAgJ0ZpbGUgc3lzdGVtIGNhbm5vdCBoYW5kbGUgdGhpcyBmaWxlbmFtZScpCisgICAgZGVmIHRlc3RfbWFrZV90YXJiYWxsX3VuaWNvZGVfbGF0aW4xKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgTWlycm9yIHRlc3RfbWFrZV90YXJiYWxsLCBleGNlcHQgZmlsZW5hbWUgaXMgdW5pY29kZSBhbmQgY29udGFpbnMKKyAgICAgICAgbGF0aW4gY2hhcmFjdGVycy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX21ha2VfdGFyYmFsbCh1J8OlcmNoaXYnKSAjIG5vdGUgdGhpcyBpc24ndCBhIHJlYWwgd29yZAorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGNhbl9mc19lbmNvZGUodSfjga7jgqLjg7zjgqvjgqTjg5YnKSwKKyAgICAgICAgJ0ZpbGUgc3lzdGVtIGNhbm5vdCBoYW5kbGUgdGhpcyBmaWxlbmFtZScpCisgICAgZGVmIHRlc3RfbWFrZV90YXJiYWxsX3VuaWNvZGVfZXh0ZW5kZWQoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBNaXJyb3IgdGVzdF9tYWtlX3RhcmJhbGwsIGV4Y2VwdCBmaWxlbmFtZSBpcyB1bmljb2RlIGFuZCBjb250YWlucworICAgICAgICBjaGFyYWN0ZXJzIG91dHNpZGUgdGhlIGxhdGluIGNoYXJzZXQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9tYWtlX3RhcmJhbGwodSfjga7jgqLjg7zjgqvjgqTjg5YnKSAjIGphcGFuZXNlIGZvciBhcmNoaXZlCisKIGRlZiB0ZXN0X3N1aXRlKCk6CiAgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShBcmNoaXZlVXRpbFRlc3RDYXNlKQogCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfZHVtYi5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF9kdW1iLnB5CmluZGV4IDVhMjJhMTAuLjVkYjNhODUgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF9kdW1iLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF9kdW1iLnB5CkBAIC0xLDggKzEsMTAgQEAKICIiIlRlc3RzIGZvciBkaXN0dXRpbHMuY29tbWFuZC5iZGlzdF9kdW1iLiIiIgogCi1pbXBvcnQgdW5pdHRlc3QKLWltcG9ydCBzeXMKIGltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHppcGZpbGUKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CiAKICMgemxpYiBpcyBub3QgdXNlZCBoZXJlLCBidXQgaWYgaXQncyBub3QgYXZhaWxhYmxlCiAjIHRlc3Rfc2ltcGxlX2J1aWx0IHdpbGwgZmFpbApAQCAtMTEsOCArMTMsNiBAQAogZXhjZXB0IEltcG9ydEVycm9yOgogICAgIHpsaWIgPSBOb25lCiAKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAotCiBmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBEaXN0cmlidXRpb24KIGZyb20gZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3RfZHVtYiBpbXBvcnQgYmRpc3RfZHVtYgogZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKQEAgLTczLDE1ICs3MywyNCBAQAogCiAgICAgICAgICMgc2VlIHdoYXQgd2UgaGF2ZQogICAgICAgICBkaXN0X2NyZWF0ZWQgPSBvcy5saXN0ZGlyKG9zLnBhdGguam9pbihwa2dfZGlyLCAnZGlzdCcpKQotICAgICAgICBiYXNlID0gIiVzLiVzIiAlIChkaXN0LmdldF9mdWxsbmFtZSgpLCBjbWQucGxhdF9uYW1lKQorICAgICAgICBiYXNlID0gIiVzLiVzLnppcCIgJSAoZGlzdC5nZXRfZnVsbG5hbWUoKSwgY21kLnBsYXRfbmFtZSkKICAgICAgICAgaWYgb3MubmFtZSA9PSAnb3MyJzoKICAgICAgICAgICAgIGJhc2UgPSBiYXNlLnJlcGxhY2UoJzonLCAnLScpCiAKLSAgICAgICAgd2FudGVkID0gWyclcy56aXAnICUgYmFzZV0KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXN0X2NyZWF0ZWQsIHdhbnRlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXN0X2NyZWF0ZWQsIFtiYXNlXSkKIAogICAgICAgICAjIG5vdyBsZXQncyBjaGVjayB3aGF0IHdlIGhhdmUgaW4gdGhlIHppcCBmaWxlCi0gICAgICAgICMgWFhYIHRvIGJlIGRvbmUKKyAgICAgICAgZnAgPSB6aXBmaWxlLlppcEZpbGUob3MucGF0aC5qb2luKCdkaXN0JywgYmFzZSkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbnRlbnRzID0gZnAubmFtZWxpc3QoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorCisgICAgICAgIGNvbnRlbnRzID0gc29ydGVkKG9zLnBhdGguYmFzZW5hbWUoZm4pIGZvciBmbiBpbiBjb250ZW50cykKKyAgICAgICAgd2FudGVkID0gWydmb28tMC4xLXB5JXMuJXMuZWdnLWluZm8nICUgc3lzLnZlcnNpb25faW5mb1s6Ml0sICdmb28ucHknXQorICAgICAgICBpZiBub3Qgc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGU6CisgICAgICAgICAgICB3YW50ZWQuYXBwZW5kKCdmb28ucHljJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb250ZW50cywgc29ydGVkKHdhbnRlZCkpCiAKICAgICBkZWYgdGVzdF9maW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgICBwa2dfZGlyLCBkaXN0ID0gc2VsZi5jcmVhdGVfZGlzdCgpCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfbXNpLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X21zaS5weQppbmRleCAxYzg5N2FiLi5mOThiN2EyIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfbXNpLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF9tc2kucHkKQEAgLTEsMTIgKzEsMTEgQEAKICIiIlRlc3RzIGZvciBkaXN0dXRpbHMuY29tbWFuZC5iZGlzdF9tc2kuIiIiCi1pbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBzeXMKLQoraW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKLQogZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKIAotQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtPT0id2luMzIiLCAiVGhlc2UgdGVzdHMgYXJlIG9ubHkgZm9yIHdpbjMyIikKKworQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICd3aW4zMicsICd0aGVzZSB0ZXN0cyByZXF1aXJlIFdpbmRvd3MnKQogY2xhc3MgQkRpc3RNU0lUZXN0Q2FzZShzdXBwb3J0LlRlbXBkaXJNYW5hZ2VyLAogICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LkxvZ2dpbmdTaWxlbmNlciwKICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtMTQsMTAgKzEzLDExIEBACiAgICAgZGVmIHRlc3RfbWluaW1hbChzZWxmKToKICAgICAgICAgIyBtaW5pbWFsIHRlc3QgWFhYIG5lZWQgbW9yZSB0ZXN0cwogICAgICAgICBmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJkaXN0X21zaSBpbXBvcnQgYmRpc3RfbXNpCi0gICAgICAgIHBrZ19wdGgsIGRpc3QgPSBzZWxmLmNyZWF0ZV9kaXN0KCkKKyAgICAgICAgcHJvamVjdF9kaXIsIGRpc3QgPSBzZWxmLmNyZWF0ZV9kaXN0KCkKICAgICAgICAgY21kID0gYmRpc3RfbXNpKGRpc3QpCiAgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKIAorCiBkZWYgdGVzdF9zdWl0ZSgpOgogICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoQkRpc3RNU0lUZXN0Q2FzZSkKIApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3JwbS5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF9ycG0ucHkKaW5kZXggMjVhNTc2My4uODNkNDA2NSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3JwbS5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfcnBtLnB5CkBAIC0zOSwxOCArMzksMTUgQEAKICAgICAgICAgc3lzLmFyZ3ZbOl0gPSBzZWxmLm9sZF9zeXNfYXJndlsxXQogICAgICAgICBzdXBlcihCdWlsZFJwbVRlc3RDYXNlLCBzZWxmKS50ZWFyRG93bigpCiAKKyAgICAjIFhYWCBJIGFtIHVuYWJsZSB5ZXQgdG8gbWFrZSB0aGlzIHRlc3Qgd29yayB3aXRob3V0CisgICAgIyBzcHVyaW91cyBzZHRvdXQvc3RkZXJyIG91dHB1dCB1bmRlciBNYWMgT1MgWAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdsaW51eCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdzcHVyaW91cyBzZHRvdXQvc3RkZXJyIG91dHB1dCB1bmRlciBNYWMgT1MgWCcpCisgICAgQHVuaXR0ZXN0LnNraXBJZihmaW5kX2V4ZWN1dGFibGUoJ3JwbScpIGlzIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAndGhlIHJwbSBjb21tYW5kIGlzIG5vdCBmb3VuZCcpCisgICAgQHVuaXR0ZXN0LnNraXBJZihmaW5kX2V4ZWN1dGFibGUoJ3JwbWJ1aWxkJykgaXMgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICd0aGUgcnBtYnVpbGQgY29tbWFuZCBpcyBub3QgZm91bmQnKQogICAgIGRlZiB0ZXN0X3F1aWV0KHNlbGYpOgotCi0gICAgICAgICMgWFhYIEkgYW0gdW5hYmxlIHlldCB0byBtYWtlIHRoaXMgdGVzdCB3b3JrIHdpdGhvdXQKLSAgICAgICAgIyBzcHVyaW91cyBzZHRvdXQvc3RkZXJyIG91dHB1dCB1bmRlciBNYWMgT1MgWAotICAgICAgICBpZiBzeXMucGxhdGZvcm0gIT0gJ2xpbnV4Mic6Ci0gICAgICAgICAgICByZXR1cm4KLQotICAgICAgICAjIHRoaXMgdGVzdCB3aWxsIHJ1biBvbmx5IGlmIHRoZSBycG0gY29tbWFuZHMgYXJlIGZvdW5kCi0gICAgICAgIGlmIChmaW5kX2V4ZWN1dGFibGUoJ3JwbScpIGlzIE5vbmUgb3IKLSAgICAgICAgICAgIGZpbmRfZXhlY3V0YWJsZSgncnBtYnVpbGQnKSBpcyBOb25lKToKLSAgICAgICAgICAgIHJldHVybgotCiAgICAgICAgICMgbGV0J3MgY3JlYXRlIGEgcGFja2FnZQogICAgICAgICB0bXBfZGlyID0gc2VsZi5ta2R0ZW1wKCkKICAgICAgICAgcGtnX2RpciA9IG9zLnBhdGguam9pbih0bXBfZGlyLCAnZm9vJykKQEAgLTc3LDIxICs3NCwyMiBAQAogICAgICAgICBjbWQucnVuKCkKIAogICAgICAgICBkaXN0X2NyZWF0ZWQgPSBvcy5saXN0ZGlyKG9zLnBhdGguam9pbihwa2dfZGlyLCAnZGlzdCcpKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2Zvby0wLjEtMS5ub2FyY2gucnBtJyBpbiBkaXN0X2NyZWF0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2Zvby0wLjEtMS5ub2FyY2gucnBtJywgZGlzdF9jcmVhdGVkKQogCisgICAgICAgICMgYnVnICMyOTQ1OiB1cGxvYWQgaWdub3JlcyBiZGlzdF9ycG0gZmlsZXMKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2JkaXN0X3JwbScsICdhbnknLCAnZGlzdC9mb28tMC4xLTEuc3JjLnJwbScpLCBkaXN0LmRpc3RfZmlsZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdiZGlzdF9ycG0nLCAnYW55JywgJ2Rpc3QvZm9vLTAuMS0xLm5vYXJjaC5ycG0nKSwgZGlzdC5kaXN0X2ZpbGVzKQorCisgICAgIyBYWFggSSBhbSB1bmFibGUgeWV0IHRvIG1ha2UgdGhpcyB0ZXN0IHdvcmsgd2l0aG91dAorICAgICMgc3B1cmlvdXMgc2R0b3V0L3N0ZGVyciBvdXRwdXQgdW5kZXIgTWFjIE9TIFgKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnbGludXgnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnc3B1cmlvdXMgc2R0b3V0L3N0ZGVyciBvdXRwdXQgdW5kZXIgTWFjIE9TIFgnKQorICAgICMgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTE1MzMxNjQKKyAgICBAdW5pdHRlc3Quc2tpcElmKGZpbmRfZXhlY3V0YWJsZSgncnBtJykgaXMgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICd0aGUgcnBtIGNvbW1hbmQgaXMgbm90IGZvdW5kJykKKyAgICBAdW5pdHRlc3Quc2tpcElmKGZpbmRfZXhlY3V0YWJsZSgncnBtYnVpbGQnKSBpcyBOb25lLAorICAgICAgICAgICAgICAgICAgICAgJ3RoZSBycG1idWlsZCBjb21tYW5kIGlzIG5vdCBmb3VuZCcpCiAgICAgZGVmIHRlc3Rfbm9fb3B0aW1pemVfZmxhZyhzZWxmKToKLQotICAgICAgICAjIFhYWCBJIGFtIHVuYWJsZSB5ZXQgdG8gbWFrZSB0aGlzIHRlc3Qgd29yayB3aXRob3V0Ci0gICAgICAgICMgc3B1cmlvdXMgc2R0b3V0L3N0ZGVyciBvdXRwdXQgdW5kZXIgTWFjIE9TIFgKLSAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICdsaW51eDInOgotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAgICAgIyBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTUzMzE2NAotICAgICAgICAjIHRoaXMgdGVzdCB3aWxsIHJ1biBvbmx5IGlmIHRoZSBycG0gY29tbWFuZCBpcyBmb3VuZAotICAgICAgICBpZiAoZmluZF9leGVjdXRhYmxlKCdycG0nKSBpcyBOb25lIG9yCi0gICAgICAgICAgICBmaW5kX2V4ZWN1dGFibGUoJ3JwbWJ1aWxkJykgaXMgTm9uZSk6Ci0gICAgICAgICAgICByZXR1cm4KLQogICAgICAgICAjIGxldCdzIGNyZWF0ZSBhIHBhY2thZ2UgdGhhdCBicmFrZXMgYmRpc3RfcnBtCiAgICAgICAgIHRtcF9kaXIgPSBzZWxmLm1rZHRlbXAoKQogICAgICAgICBwa2dfZGlyID0gb3MucGF0aC5qb2luKHRtcF9kaXIsICdmb28nKQpAQCAtMTE3LDcgKzExNSwxMiBAQAogICAgICAgICBjbWQucnVuKCkKIAogICAgICAgICBkaXN0X2NyZWF0ZWQgPSBvcy5saXN0ZGlyKG9zLnBhdGguam9pbihwa2dfZGlyLCAnZGlzdCcpKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2Zvby0wLjEtMS5ub2FyY2gucnBtJyBpbiBkaXN0X2NyZWF0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2Zvby0wLjEtMS5ub2FyY2gucnBtJywgZGlzdF9jcmVhdGVkKQorCisgICAgICAgICMgYnVnICMyOTQ1OiB1cGxvYWQgaWdub3JlcyBiZGlzdF9ycG0gZmlsZXMKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2JkaXN0X3JwbScsICdhbnknLCAnZGlzdC9mb28tMC4xLTEuc3JjLnJwbScpLCBkaXN0LmRpc3RfZmlsZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdiZGlzdF9ycG0nLCAnYW55JywgJ2Rpc3QvZm9vLTAuMS0xLm5vYXJjaC5ycG0nKSwgZGlzdC5kaXN0X2ZpbGVzKQorCiAgICAgICAgIG9zLnJlbW92ZShvcy5wYXRoLmpvaW4ocGtnX2RpciwgJ2Rpc3QnLCAnZm9vLTAuMS0xLm5vYXJjaC5ycG0nKSkKIAogZGVmIHRlc3Rfc3VpdGUoKToKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF93aW5pbnN0LnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3dpbmluc3QucHkKaW5kZXggYzJiMTNiMy4uMjQ3ZTkyOSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3dpbmluc3QucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3dpbmluc3QucHkKQEAgLTIzLDcgKzIzLDcgQEAKICAgICAgICAgIyBhbmQgbWFrZSBzdXJlIGl0IGZpbmRzIGl0IGFuZCByZXR1cm5zIGl0cyBjb250ZW50CiAgICAgICAgICMgbm8gbWF0dGVyIHdoYXQgcGxhdGZvcm0gd2UgaGF2ZQogICAgICAgICBleGVfZmlsZSA9IGNtZC5nZXRfZXhlX2J5dGVzKCkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihleGVfZmlsZSkgPiAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKGxlbihleGVfZmlsZSksIDEwKQogCiBkZWYgdGVzdF9zdWl0ZSgpOgogICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoQnVpbGRXaW5JbnN0VGVzdENhc2UpCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfY2xpYi5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9jbGliLnB5CmluZGV4IDRmNGUyYmMuLmQ0YTFlNjkgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9jbGliLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9jbGliLnB5CkBAIC03Nyw3ICs3Nyw3IEBACiAKICAgICAgICAgY21kLmNvbXBpbGVyID0gRmFrZUNvbXBpbGVyKCkKIAotICAgICAgICAjIGJ1aWxkX2xpYnJhcmllcyBpcyBhbHNvIGRvaW5nIGEgYml0IG9mIHR5cG9lIGNoZWNraW5nCisgICAgICAgICMgYnVpbGRfbGlicmFyaWVzIGlzIGFsc28gZG9pbmcgYSBiaXQgb2YgdHlwbyBjaGVja2luZwogICAgICAgICBsaWIgPSBbKCduYW1lJywgeydzb3VyY2VzJzogJ25vdHZhbGlkJ30pXQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNTZXR1cEVycm9yLCBjbWQuYnVpbGRfbGlicmFyaWVzLCBsaWIpCiAKQEAgLTEwMiwxMSArMTAyLDggQEAKICAgICAgICAgY21kLmRpc3RyaWJ1dGlvbi5saWJyYXJpZXMgPSAnV09OVFdPUksnCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1NldHVwRXJyb3IsIGNtZC5maW5hbGl6ZV9vcHRpb25zKQogCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJywgImNhbid0IHRlc3Qgb24gV2luZG93cyIpCiAgICAgZGVmIHRlc3RfcnVuKHNlbGYpOgotICAgICAgICAjIGNhbid0IHRlc3Qgb24gd2luZG93cwotICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKLSAgICAgICAgICAgIHJldHVybgotCiAgICAgICAgIHBrZ19kaXIsIGRpc3QgPSBzZWxmLmNyZWF0ZV9kaXN0KCkKICAgICAgICAgY21kID0gYnVpbGRfY2xpYihkaXN0KQogCkBAIC0xMjIsNyArMTE5LDggQEAKICAgICAgICAgIyBiZWZvcmUgd2UgcnVuIHRoZSBjb21tYW5kLCB3ZSB3YW50IHRvIG1ha2Ugc3VyZQogICAgICAgICAjIGFsbCBjb21tYW5kcyBhcmUgcHJlc2VudCBvbiB0aGUgc3lzdGVtCiAgICAgICAgICMgYnkgY3JlYXRpbmcgYSBjb21waWxlciBhbmQgY2hlY2tpbmcgaXRzIGV4ZWN1dGFibGVzCi0gICAgICAgIGZyb20gZGlzdHV0aWxzLmNjb21waWxlciBpbXBvcnQgbmV3X2NvbXBpbGVyLCBjdXN0b21pemVfY29tcGlsZXIKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMuY2NvbXBpbGVyIGltcG9ydCBuZXdfY29tcGlsZXIKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBjdXN0b21pemVfY29tcGlsZXIKIAogICAgICAgICBjb21waWxlciA9IG5ld19jb21waWxlcigpCiAgICAgICAgIGN1c3RvbWl6ZV9jb21waWxlcihjb21waWxlcikKQEAgLTEzMCwxMyArMTI4LDEzIEBACiAgICAgICAgICAgICBpZiBjY21kIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgIGlmIGZpbmRfZXhlY3V0YWJsZShjY21kWzBdKSBpcyBOb25lOgotICAgICAgICAgICAgICAgIHJldHVybiAjIGNhbid0IHRlc3QKKyAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCdUaGUgJXIgY29tbWFuZCBpcyBub3QgZm91bmQnICUgY2NtZFswXSkKIAogICAgICAgICAjIHRoaXMgc2hvdWxkIHdvcmsKICAgICAgICAgY21kLnJ1bigpCiAKICAgICAgICAgIyBsZXQncyBjaGVjayB0aGUgcmVzdWx0Ci0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnbGliZm9vLmEnIGluIG9zLmxpc3RkaXIoYnVpbGRfdGVtcCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2xpYmZvby5hJywgb3MubGlzdGRpcihidWlsZF90ZW1wKSkKIAogZGVmIHRlc3Rfc3VpdGUoKToKICAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKEJ1aWxkQ0xpYlRlc3RDYXNlKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2V4dC5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9leHQucHkKaW5kZXggMmZhNjNkMy4uZDM4MGNiNiAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2V4dC5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfZXh0LnB5CkBAIC02NSw5ICs2NSw5IEBACiAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gb2xkX3N0ZG91dAogCiAgICAgICAgIGlmIEFMUkVBRFlfVEVTVEVEOgotICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCdBbHJlYWR5IHRlc3RlZCBpbiAlcycgJSBBTFJFQURZX1RFU1RFRCkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIEFMUkVBRFlfVEVTVEVEID0gVHJ1ZQorICAgICAgICAgICAgQUxSRUFEWV9URVNURUQgPSB0eXBlKHNlbGYpLl9fbmFtZV9fCiAKICAgICAgICAgaW1wb3J0IHh4CiAKQEAgLTc3LDEwICs3NywxMSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHh4LmZvbygyLCA1KSwgNykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4eC5mb28oMTMsMTUpLCAyOCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4eC5uZXcoKS5kZW1vKCksIE5vbmUpCi0gICAgICAgIGRvYyA9ICdUaGlzIGlzIGEgdGVtcGxhdGUgbW9kdWxlIGp1c3QgZm9yIGluc3RydWN0aW9uLicKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4eC5fX2RvY19fLCBkb2MpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHh4Lk51bGwoKSwgeHguTnVsbCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHh4LlN0cigpLCB4eC5TdHIpKQorICAgICAgICBpZiB0ZXN0X3N1cHBvcnQuSEFWRV9ET0NTVFJJTkdTOgorICAgICAgICAgICAgZG9jID0gJ1RoaXMgaXMgYSB0ZW1wbGF0ZSBtb2R1bGUganVzdCBmb3IgaW5zdHJ1Y3Rpb24uJworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4eC5fX2RvY19fLCBkb2MpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh4eC5OdWxsKCksIHh4Lk51bGwpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh4eC5TdHIoKSwgeHguU3RyKQogCiAgICAgZGVmIHRlc3Rfc29sYXJpc19lbmFibGVfc2hhcmVkKHNlbGYpOgogICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKHsnbmFtZSc6ICd4eCd9KQpAQCAtMTAxLDEzICsxMDIsMTEgQEAKICAgICAgICAgICAgICAgICBfY29uZmlnX3ZhcnNbJ1B5X0VOQUJMRV9TSEFSRUQnXSA9IG9sZF92YXIKIAogICAgICAgICAjIG1ha2Ugc3VyZSB3ZSBnZXQgc29tZSBsaWJyYXJ5IGRpcnMgdW5kZXIgc29sYXJpcwotICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGNtZC5saWJyYXJ5X2RpcnMpID4gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKGxlbihjbWQubGlicmFyeV9kaXJzKSwgMCkKIAorICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLnZlcnNpb24gPCAnMi42JywKKyAgICAgICAgICAgICAgICAgICAgICdzaXRlLlVTRVJfU0lURSB3YXMgaW50cm9kdWNlZCBpbiAyLjYnKQogICAgIGRlZiB0ZXN0X3VzZXJfc2l0ZShzZWxmKToKLSAgICAgICAgIyBzaXRlLlVTRVJfU0lURSB3YXMgaW50cm9kdWNlZCBpbiAyLjYKLSAgICAgICAgaWYgc3lzLnZlcnNpb24gPCAnMi42JzoKLSAgICAgICAgICAgIHJldHVybgotCiAgICAgICAgIGltcG9ydCBzaXRlCiAgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oeyduYW1lJzogJ3h4J30pCiAgICAgICAgIGNtZCA9IGJ1aWxkX2V4dChkaXN0KQpAQCAtMTQyLDI5ICsxNDEsMzAgQEAKICAgICAgICAgY21kLmZpbmFsaXplX29wdGlvbnMoKQogCiAgICAgICAgIHB5X2luY2x1ZGUgPSBzeXNjb25maWcuZ2V0X3B5dGhvbl9pbmMoKQotICAgICAgICBzZWxmLmFzc2VydFRydWUocHlfaW5jbHVkZSBpbiBjbWQuaW5jbHVkZV9kaXJzKQorICAgICAgICBzZWxmLmFzc2VydEluKHB5X2luY2x1ZGUsIGNtZC5pbmNsdWRlX2RpcnMpCiAKICAgICAgICAgcGxhdF9weV9pbmNsdWRlID0gc3lzY29uZmlnLmdldF9weXRob25faW5jKHBsYXRfc3BlY2lmaWM9MSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBsYXRfcHlfaW5jbHVkZSBpbiBjbWQuaW5jbHVkZV9kaXJzKQorICAgICAgICBzZWxmLmFzc2VydEluKHBsYXRfcHlfaW5jbHVkZSwgY21kLmluY2x1ZGVfZGlycykKIAogICAgICAgICAjIG1ha2Ugc3VyZSBjbWQubGlicmFyaWVzIGlzIHR1cm5lZCBpbnRvIGEgbGlzdAogICAgICAgICAjIGlmIGl0J3MgYSBzdHJpbmcKICAgICAgICAgY21kID0gYnVpbGRfZXh0KGRpc3QpCi0gICAgICAgIGNtZC5saWJyYXJpZXMgPSAnbXlfbGliJworICAgICAgICBjbWQubGlicmFyaWVzID0gJ215X2xpYiwgb3RoZXJfbGliIGxhc3RsaWInCiAgICAgICAgIGNtZC5maW5hbGl6ZV9vcHRpb25zKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQubGlicmFyaWVzLCBbJ215X2xpYiddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5saWJyYXJpZXMsIFsnbXlfbGliJywgJ290aGVyX2xpYicsICdsYXN0bGliJ10pCiAKICAgICAgICAgIyBtYWtlIHN1cmUgY21kLmxpYnJhcnlfZGlycyBpcyB0dXJuZWQgaW50byBhIGxpc3QKICAgICAgICAgIyBpZiBpdCdzIGEgc3RyaW5nCiAgICAgICAgIGNtZCA9IGJ1aWxkX2V4dChkaXN0KQotICAgICAgICBjbWQubGlicmFyeV9kaXJzID0gJ215X2xpYl9kaXInCisgICAgICAgIGNtZC5saWJyYXJ5X2RpcnMgPSAnbXlfbGliX2RpciVzb3RoZXJfbGliX2RpcicgJSBvcy5wYXRoc2VwCiAgICAgICAgIGNtZC5maW5hbGl6ZV9vcHRpb25zKCkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdteV9saWJfZGlyJyBpbiBjbWQubGlicmFyeV9kaXJzKQorICAgICAgICBzZWxmLmFzc2VydEluKCdteV9saWJfZGlyJywgY21kLmxpYnJhcnlfZGlycykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignb3RoZXJfbGliX2RpcicsIGNtZC5saWJyYXJ5X2RpcnMpCiAKICAgICAgICAgIyBtYWtlIHN1cmUgcnBhdGggaXMgdHVybmVkIGludG8gYSBsaXN0Ci0gICAgICAgICMgaWYgaXQncyBhIGxpc3Qgb2Ygb3MucGF0aHNlcCdzIHBhdGhzCisgICAgICAgICMgaWYgaXQncyBhIHN0cmluZwogICAgICAgICBjbWQgPSBidWlsZF9leHQoZGlzdCkKLSAgICAgICAgY21kLnJwYXRoID0gb3MucGF0aHNlcC5qb2luKFsnb25lJywgJ3R3byddKQorICAgICAgICBjbWQucnBhdGggPSAnb25lJXN0d28nICUgb3MucGF0aHNlcAogICAgICAgICBjbWQuZmluYWxpemVfb3B0aW9ucygpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLnJwYXRoLCBbJ29uZScsICd0d28nXSkKIApAQCAtMjI0LDEzICsyMjQsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvbWUnOiAnYmFyJ30pXQogICAgICAgICBjbWQuY2hlY2tfZXh0ZW5zaW9uc19saXN0KGV4dHMpCiAgICAgICAgIGV4dCA9IGV4dHNbMF0KLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoZXh0LCBFeHRlbnNpb24pKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZXh0LCBFeHRlbnNpb24pCiAKICAgICAgICAgIyBjaGVja19leHRlbnNpb25zX2xpc3QgYWRkcyBpbiBleHQgdGhlIHZhbHVlcyBwYXNzZWQKICAgICAgICAgIyB3aGVuIHRoZXkgYXJlIGluICgnaW5jbHVkZV9kaXJzJywgJ2xpYnJhcnlfZGlycycsICdsaWJyYXJpZXMnCiAgICAgICAgICMgJ2V4dHJhX29iamVjdHMnLCAnZXh0cmFfY29tcGlsZV9hcmdzJywgJ2V4dHJhX2xpbmtfYXJncycpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXh0LmxpYnJhcmllcywgJ2ZvbycpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaGFzYXR0cihleHQsICdzb21lJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihleHQsICdzb21lJykpCiAKICAgICAgICAgIyAnbWFjcm9zJyBlbGVtZW50IG9mIGJ1aWxkIGluZm8gZGljdCBtdXN0IGJlIDEtIG9yIDItdHVwbGUKICAgICAgICAgZXh0cyA9IFsoJ2Zvby5iYXInLCB7J3NvdXJjZXMnOiBbJyddLCAnbGlicmFyaWVzJzogJ2ZvbycsCkBAIC00MTIsOSArNDEyLDggQEAKICAgICAgICAgd2FudGVkID0gb3MucGF0aC5qb2luKGNtZC5idWlsZF9saWIsICdVcGRhdGVNYW5hZ2VyJywgJ2Zkc2VuZCcgKyBleHQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXh0X3BhdGgsIHdhbnRlZCkKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInLCAndGhlc2UgdGVzdHMgcmVxdWlyZSBXaW5kb3dzJykKICAgICBkZWYgdGVzdF9idWlsZF9leHRfcGF0aF9jcm9zc19wbGF0Zm9ybShzZWxmKToKLSAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICd3aW4zMic6Ci0gICAgICAgICAgICByZXR1cm4KICAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbih7J25hbWUnOiAnVXBkYXRlTWFuYWdlcid9KQogICAgICAgICBjbWQgPSBidWlsZF9leHQoZGlzdCkKICAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQpAQCAtNDgwLDggKzQ3OSwxNiBAQAogCiAgICAgICAgICMgZ2V0IHRoZSBkZXBsb3ltZW50IHRhcmdldCB0aGF0IHRoZSBpbnRlcnByZXRlciB3YXMgYnVpbHQgd2l0aAogICAgICAgICB0YXJnZXQgPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCcpCi0gICAgICAgIHRhcmdldCA9IHR1cGxlKG1hcChpbnQsIHRhcmdldC5zcGxpdCgnLicpKSkKLSAgICAgICAgdGFyZ2V0ID0gJyUwMmQlMDFkMCcgJSB0YXJnZXQKKyAgICAgICAgdGFyZ2V0ID0gdHVwbGUobWFwKGludCwgdGFyZ2V0LnNwbGl0KCcuJylbMDoyXSkpCisgICAgICAgICMgZm9ybWF0IHRoZSB0YXJnZXQgdmFsdWUgYXMgZGVmaW5lZCBpbiB0aGUgQXBwbGUKKyAgICAgICAgIyBBdmFpbGFiaWxpdHkgTWFjcm9zLiAgV2UgY2FuJ3QgdXNlIHRoZSBtYWNybyBuYW1lcyBzaW5jZQorICAgICAgICAjIGF0IGxlYXN0IG9uZSB2YWx1ZSB3ZSB0ZXN0IHdpdGggd2lsbCBub3QgZXhpc3QgeWV0LgorICAgICAgICBpZiB0YXJnZXRbMV0gPCAxMDoKKyAgICAgICAgICAgICMgZm9yIDEwLjEgdGhyb3VnaCAxMC45LnggLT4gIjEwbjAiCisgICAgICAgICAgICB0YXJnZXQgPSAnJTAyZCUwMWQwJyAlIHRhcmdldAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBmb3IgMTAuMTAgYW5kIGJleW9uZCAtPiAiMTBubjAwIgorICAgICAgICAgICAgdGFyZ2V0ID0gJyUwMmQlMDJkMDAnICUgdGFyZ2V0CiAgICAgICAgIGRlcHRhcmdldF9leHQgPSBFeHRlbnNpb24oCiAgICAgICAgICAgICAnZGVwdGFyZ2V0JywKICAgICAgICAgICAgIFtkZXB0YXJnZXRfY10sCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfcHkucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfcHkucHkKaW5kZXggNmM2ZWMyMC4uYzQ0OThiYyAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX3B5LnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9weS5weQpAQCAtOTksNiArOTksMzcgQEAKICAgICAgICAgICAgIG9zLmNoZGlyKGN3ZCkKICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBvbGRfc3Rkb3V0CiAKKyAgICBkZWYgdGVzdF9kaXJfaW5fcGFja2FnZV9kYXRhKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQSBkaXJlY3RvcnkgaW4gcGFja2FnZV9kYXRhIHNob3VsZCBub3QgYmUgYWRkZWQgdG8gdGhlIGZpbGVsaXN0LgorICAgICAgICAiIiIKKyAgICAgICAgIyBTZWUgYnVnIDE5Mjg2CisgICAgICAgIHNvdXJjZXMgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBwa2dfZGlyID0gb3MucGF0aC5qb2luKHNvdXJjZXMsICJwa2ciKQorCisgICAgICAgIG9zLm1rZGlyKHBrZ19kaXIpCisgICAgICAgIG9wZW4ob3MucGF0aC5qb2luKHBrZ19kaXIsICJfX2luaXRfXy5weSIpLCAidyIpLmNsb3NlKCkKKworICAgICAgICBkb2NkaXIgPSBvcy5wYXRoLmpvaW4ocGtnX2RpciwgImRvYyIpCisgICAgICAgIG9zLm1rZGlyKGRvY2RpcikKKyAgICAgICAgb3Blbihvcy5wYXRoLmpvaW4oZG9jZGlyLCAidGVzdGZpbGUiKSwgInciKS5jbG9zZSgpCisKKyAgICAgICAgIyBjcmVhdGUgdGhlIGRpcmVjdG9yeSB0aGF0IGNvdWxkIGJlIGluY29ycmVjdGx5IGRldGVjdGVkIGFzIGEgZmlsZQorICAgICAgICBvcy5ta2Rpcihvcy5wYXRoLmpvaW4oZG9jZGlyLCAnb3RoZXJkaXInKSkKKworICAgICAgICBvcy5jaGRpcihzb3VyY2VzKQorICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKHsicGFja2FnZXMiOiBbInBrZyJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZV9kYXRhIjogeyJwa2ciOiBbImRvYy8qIl19fSkKKyAgICAgICAgIyBzY3JpcHRfbmFtZSBuZWVkIG5vdCBleGlzdCwgaXQganVzdCBuZWVkIHRvIGJlIGluaXRpYWxpemVkCisgICAgICAgIGRpc3Quc2NyaXB0X25hbWUgPSBvcy5wYXRoLmpvaW4oc291cmNlcywgInNldHVwLnB5IikKKyAgICAgICAgZGlzdC5zY3JpcHRfYXJncyA9IFsiYnVpbGQiXQorICAgICAgICBkaXN0LnBhcnNlX2NvbW1hbmRfbGluZSgpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGlzdC5ydW5fY29tbWFuZHMoKQorICAgICAgICBleGNlcHQgRGlzdHV0aWxzRmlsZUVycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJmYWlsZWQgcGFja2FnZV9kYXRhIHdoZW4gZGF0YSBkaXIgaW5jbHVkZXMgYSBkaXIiKQorCiAgICAgZGVmIHRlc3RfZG9udF93cml0ZV9ieXRlY29kZShzZWxmKToKICAgICAgICAgIyBtYWtlcyBzdXJlIGJ5dGVfY29tcGlsZSBpcyBub3QgdXNlZAogICAgICAgICBwa2dfZGlyLCBkaXN0ID0gc2VsZi5jcmVhdGVfZGlzdCgpCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfc2NyaXB0cy5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9zY3JpcHRzLnB5CmluZGV4IDRkYTkzY2MuLmFkM2MxYTIgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9zY3JpcHRzLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9zY3JpcHRzLnB5CkBAIC0xNyw4ICsxNyw4IEBACiAKICAgICBkZWYgdGVzdF9kZWZhdWx0X3NldHRpbmdzKHNlbGYpOgogICAgICAgICBjbWQgPSBzZWxmLmdldF9idWlsZF9zY3JpcHRzX2NtZCgiL2Zvby9iYXIiLCBbXSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjbWQuZm9yY2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbWQuYnVpbGRfZGlyIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY21kLmZvcmNlKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShjbWQuYnVpbGRfZGlyKQogCiAgICAgICAgIGNtZC5maW5hbGl6ZV9vcHRpb25zKCkKIApAQCAtMzgsNyArMzgsNyBAQAogCiAgICAgICAgIGJ1aWx0ID0gb3MubGlzdGRpcih0YXJnZXQpCiAgICAgICAgIGZvciBuYW1lIGluIGV4cGVjdGVkOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5hbWUgaW4gYnVpbHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKG5hbWUsIGJ1aWx0KQogCiAgICAgZGVmIGdldF9idWlsZF9zY3JpcHRzX2NtZChzZWxmLCB0YXJnZXQsIHNjcmlwdHMpOgogICAgICAgICBpbXBvcnQgc3lzCkBAIC0xMDMsNyArMTAzLDcgQEAKIAogICAgICAgICBidWlsdCA9IG9zLmxpc3RkaXIodGFyZ2V0KQogICAgICAgICBmb3IgbmFtZSBpbiBleHBlY3RlZDoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuYW1lIGluIGJ1aWx0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihuYW1lLCBidWlsdCkKIAogZGVmIHRlc3Rfc3VpdGUoKToKICAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKEJ1aWxkU2NyaXB0c1Rlc3RDYXNlKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2Njb21waWxlci5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jY29tcGlsZXIucHkKaW5kZXggZTIxODczZS4uNDQ2ZWFjMiAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2Njb21waWxlci5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2NvbXBpbGVyLnB5CkBAIC00LDcgKzQsOCBAQAogZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgY2FwdHVyZWRfc3Rkb3V0CiAKIGZyb20gZGlzdHV0aWxzLmNjb21waWxlciBpbXBvcnQgKGdlbl9saWJfb3B0aW9ucywgQ0NvbXBpbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2RlZmF1bHRfY29tcGlsZXIsIGN1c3RvbWl6ZV9jb21waWxlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9kZWZhdWx0X2NvbXBpbGVyKQorZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBjdXN0b21pemVfY29tcGlsZXIKIGZyb20gZGlzdHV0aWxzIGltcG9ydCBkZWJ1ZwogZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKIApAQCAtNTQsMTIgKzU1LDkgQEAKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIGRlYnVnLkRFQlVHID0gRmFsc2UKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGdldF9kZWZhdWx0X2NvbXBpbGVyKCkgPT0gJ3VuaXgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICdub3QgdGVzdGluZyBpZiBkZWZhdWx0IGNvbXBpbGVyIGlzIG5vdCB1bml4JykKICAgICBkZWYgdGVzdF9jdXN0b21pemVfY29tcGlsZXIoc2VsZik6Ci0KLSAgICAgICAgIyBub3QgdGVzdGluZyBpZiBkZWZhdWx0IGNvbXBpbGVyIGlzIG5vdCB1bml4Ci0gICAgICAgIGlmIGdldF9kZWZhdWx0X2NvbXBpbGVyKCkgIT0gJ3VuaXgnOgotICAgICAgICAgICAgcmV0dXJuCi0KICAgICAgICAgb3MuZW52aXJvblsnQVInXSA9ICdteV9hcicKICAgICAgICAgb3MuZW52aXJvblsnQVJGTEFHUyddID0gJy1hcmZsYWdzJwogCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2hlY2sucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2hlY2sucHkKaW5kZXggZjczMzQyYS4uZjg2ZjEyOSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NoZWNrLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jaGVjay5weQpAQCAtNTYsOSArNTYsOCBAQAogICAgICAgICBjbWQgPSBzZWxmLl9ydW4obWV0YWRhdGEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLl93YXJuaW5ncywgMCkKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKEhBU19ET0NVVElMUywgIndvbid0IHRlc3Qgd2l0aG91dCBkb2N1dGlscyIpCiAgICAgZGVmIHRlc3RfY2hlY2tfZG9jdW1lbnQoc2VsZik6Ci0gICAgICAgIGlmIG5vdCBIQVNfRE9DVVRJTFM6ICMgd29uJ3QgdGVzdCB3aXRob3V0IGRvY3V0aWxzCi0gICAgICAgICAgICByZXR1cm4KICAgICAgICAgcGtnX2luZm8sIGRpc3QgPSBzZWxmLmNyZWF0ZV9kaXN0KCkKICAgICAgICAgY21kID0gY2hlY2soZGlzdCkKIApAQCAtNzIsOSArNzEsOCBAQAogICAgICAgICBtc2dzID0gY21kLl9jaGVja19yc3RfZGF0YShyZXN0KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihtc2dzKSwgMCkKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKEhBU19ET0NVVElMUywgIndvbid0IHRlc3Qgd2l0aG91dCBkb2N1dGlscyIpCiAgICAgZGVmIHRlc3RfY2hlY2tfcmVzdHJ1Y3R1cmVkdGV4dChzZWxmKToKLSAgICAgICAgaWYgbm90IEhBU19ET0NVVElMUzogIyB3b24ndCB0ZXN0IHdpdGhvdXQgZG9jdXRpbHMKLSAgICAgICAgICAgIHJldHVybgogICAgICAgICAjIGxldCdzIHNlZSBpZiBpdCBkZXRlY3RzIGJyb2tlbiByZXN0IGluIGxvbmdfZGVzY3JpcHRpb24KICAgICAgICAgYnJva2VuX3Jlc3QgPSAndGl0bGVcbj09PVxuXG50ZXN0JwogICAgICAgICBwa2dfaW5mbywgZGlzdCA9IHNlbGYuY3JlYXRlX2Rpc3QobG9uZ19kZXNjcmlwdGlvbj1icm9rZW5fcmVzdCkKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jbGVhbi5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jbGVhbi5weQppbmRleCA3Yjk4OGY3Li5lODQ2NzBkIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2xlYW4ucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NsZWFuLnB5CkBAIC0zNiw3ICszNiw3IEBACiAKICAgICAgICAgIyBtYWtlIHN1cmUgdGhlIGZpbGVzIHdoZXJlIHJlbW92ZWQKICAgICAgICAgZm9yIG5hbWUsIHBhdGggaW4gZGlyczoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgb3MucGF0aC5leGlzdHMocGF0aCksCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9zLnBhdGguZXhpc3RzKHBhdGgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICclcyB3YXMgbm90IHJlbW92ZWQnICUgcGF0aCkKIAogICAgICAgICAjIGxldCdzIHJ1biB0aGUgY29tbWFuZCBhZ2FpbiAoc2hvdWxkIHNwaXQgd2FybmluZ3MgYnV0IHN1Y2NlZWQpCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY21kLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NtZC5weQppbmRleCBlMDc0MDk5Li41MTQyMGM5IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY21kLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jbWQucHkKQEAgLTM0LDYgKzM0LDE4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc09wdGlvbkVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQuZW5zdXJlX3N0cmluZ19saXN0LCAnbm90X3N0cmluZ19saXN0MicpCiAKKyAgICAgICAgY21kLm9wdGlvbjEgPSAnb2ssZG9rJworICAgICAgICBjbWQuZW5zdXJlX3N0cmluZ19saXN0KCdvcHRpb24xJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQub3B0aW9uMSwgWydvaycsICdkb2snXSkKKworICAgICAgICBjbWQub3B0aW9uMiA9IFsneHh4JywgJ3d3dyddCisgICAgICAgIGNtZC5lbnN1cmVfc3RyaW5nX2xpc3QoJ29wdGlvbjInKQorCisgICAgICAgIGNtZC5vcHRpb24zID0gWydvaycsIDJdCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc09wdGlvbkVycm9yLCBjbWQuZW5zdXJlX3N0cmluZ19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAnb3B0aW9uMycpCisKKwogICAgIGRlZiB0ZXN0X21ha2VfZmlsZShzZWxmKToKIAogICAgICAgICBjbWQgPSBzZWxmLmNtZApAQCAtNzcsMTkgKzg5LDYgQEAKICAgICAgICAgY21kLm9wdGlvbjMgPSAxCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc09wdGlvbkVycm9yLCBjbWQuZW5zdXJlX3N0cmluZywgJ29wdGlvbjMnKQogCi0gICAgZGVmIHRlc3RfZW5zdXJlX3N0cmluZ19saXN0KHNlbGYpOgotICAgICAgICBjbWQgPSBzZWxmLmNtZAotICAgICAgICBjbWQub3B0aW9uMSA9ICdvayxkb2snCi0gICAgICAgIGNtZC5lbnN1cmVfc3RyaW5nX2xpc3QoJ29wdGlvbjEnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5vcHRpb24xLCBbJ29rJywgJ2RvayddKQotCi0gICAgICAgIGNtZC5vcHRpb24yID0gWyd4eHgnLCAnd3d3J10KLSAgICAgICAgY21kLmVuc3VyZV9zdHJpbmdfbGlzdCgnb3B0aW9uMicpCi0KLSAgICAgICAgY21kLm9wdGlvbjMgPSBbJ29rJywgMl0KLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzT3B0aW9uRXJyb3IsIGNtZC5lbnN1cmVfc3RyaW5nX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICdvcHRpb24zJykKLQogICAgIGRlZiB0ZXN0X2Vuc3VyZV9maWxlbmFtZShzZWxmKToKICAgICAgICAgY21kID0gc2VsZi5jbWQKICAgICAgICAgY21kLm9wdGlvbjEgPSBfX2ZpbGVfXwpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvbmZpZy5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb25maWcucHkKaW5kZXggY2ZkMDk2ZS4uMTdkYjk4ZiAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvbmZpZy5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnLnB5CkBAIC04OSw3ICs4OSw3IEBACiAgICAgICAgIGNvbmZpZyA9IGNvbmZpZy5pdGVtcygpCiAgICAgICAgIGNvbmZpZy5zb3J0KCkKICAgICAgICAgd2FpdGVkID0gWygncGFzc3dvcmQnLCAnc2VjcmV0JyksICgncmVhbG0nLCAncHlwaScpLAotICAgICAgICAgICAgICAgICAgKCdyZXBvc2l0b3J5JywgJ2h0dHA6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaScpLAorICAgICAgICAgICAgICAgICAgKCdyZXBvc2l0b3J5JywgJ2h0dHBzOi8vcHlwaS5weXRob24ub3JnL3B5cGknKSwKICAgICAgICAgICAgICAgICAgICgnc2VydmVyJywgJ3NlcnZlcjEnKSwgKCd1c2VybmFtZScsICdtZScpXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbmZpZywgd2FpdGVkKQogCkBAIC05OSwxNCArOTksMTQgQEAKICAgICAgICAgY29uZmlnID0gY29uZmlnLml0ZW1zKCkKICAgICAgICAgY29uZmlnLnNvcnQoKQogICAgICAgICB3YWl0ZWQgPSBbKCdwYXNzd29yZCcsICdzZWNyZXQnKSwgKCdyZWFsbScsICdweXBpJyksCi0gICAgICAgICAgICAgICAgICAoJ3JlcG9zaXRvcnknLCAnaHR0cDovL3B5cGkucHl0aG9uLm9yZy9weXBpJyksCisgICAgICAgICAgICAgICAgICAoJ3JlcG9zaXRvcnknLCAnaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaScpLAogICAgICAgICAgICAgICAgICAgKCdzZXJ2ZXInLCAnc2VydmVyLWxvZ2luJyksICgndXNlcm5hbWUnLCAndGFyZWsnKV0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb25maWcsIHdhaXRlZCkKIAogICAgIGRlZiB0ZXN0X3NlcnZlcl9lbXB0eV9yZWdpc3RyYXRpb24oc2VsZik6CiAgICAgICAgIGNtZCA9IHNlbGYuX2NtZChzZWxmLmRpc3QpCiAgICAgICAgIHJjID0gY21kLl9nZXRfcmNfZmlsZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgb3MucGF0aC5leGlzdHMocmMpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9zLnBhdGguZXhpc3RzKHJjKSkKICAgICAgICAgY21kLl9zdG9yZV9weXBpcmMoJ3RhcmVrJywgJ3h4eCcpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhyYykpCiAgICAgICAgIGYgPSBvcGVuKHJjKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvbmZpZ19jbWQucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnX2NtZC5weQppbmRleCAyY2YzODg2Li5iMmE0MThlIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnX2NtZC5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnX2NtZC5weQpAQCAtMzcsOSArMzcsOCBAQAogICAgICAgICBkdW1wX2ZpbGUodGhpc19maWxlLCAnSSBhbSB0aGUgaGVhZGVyJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fbG9ncyksIG51bWxpbmVzKzEpCiAKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInLCAiY2FuJ3QgdGVzdCBvbiBXaW5kb3dzIikKICAgICBkZWYgdGVzdF9zZWFyY2hfY3BwKHNlbGYpOgotICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKLSAgICAgICAgICAgIHJldHVybgogICAgICAgICBwa2dfZGlyLCBkaXN0ID0gc2VsZi5jcmVhdGVfZGlzdCgpCiAgICAgICAgIGNtZCA9IGNvbmZpZyhkaXN0KQogCkBAIC04MSw3ICs4MCw3IEBACiAgICAgICAgIGNtZC5fY2xlYW4oZjEsIGYyKQogCiAgICAgICAgIGZvciBmIGluIChmMSwgZjIpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBvcy5wYXRoLmV4aXN0cyhmKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3MucGF0aC5leGlzdHMoZikpCiAKIGRlZiB0ZXN0X3N1aXRlKCk6CiAgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShDb25maWdUZXN0Q2FzZSkKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kaXJfdXRpbC5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kaXJfdXRpbC5weQppbmRleCA2OTNmNzdjLi5kODJkOTEzIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGlyX3V0aWwucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2Rpcl91dGlsLnB5CkBAIC0xMDEsNiArMTAxLDI0IEBACiAgICAgICAgIHJlbW92ZV90cmVlKHNlbGYucm9vdF90YXJnZXQsIHZlcmJvc2U9MCkKICAgICAgICAgcmVtb3ZlX3RyZWUoc2VsZi50YXJnZXQyLCB2ZXJib3NlPTApCiAKKyAgICBkZWYgdGVzdF9jb3B5X3RyZWVfc2tpcHNfbmZzX3RlbXBfZmlsZXMoc2VsZik6CisgICAgICAgIG1rcGF0aChzZWxmLnRhcmdldCwgdmVyYm9zZT0wKQorCisgICAgICAgIGFfZmlsZSA9IG9zLnBhdGguam9pbihzZWxmLnRhcmdldCwgJ29rLnR4dCcpCisgICAgICAgIG5mc19maWxlID0gb3MucGF0aC5qb2luKHNlbGYudGFyZ2V0LCAnLm5mczEyM2FiYycpCisgICAgICAgIGZvciBmIGluIGFfZmlsZSwgbmZzX2ZpbGU6CisgICAgICAgICAgICBmaCA9IG9wZW4oZiwgJ3cnKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZoLndyaXRlKCdzb21lIGNvbnRlbnQnKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBmaC5jbG9zZSgpCisKKyAgICAgICAgY29weV90cmVlKHNlbGYudGFyZ2V0LCBzZWxmLnRhcmdldDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MubGlzdGRpcihzZWxmLnRhcmdldDIpLCBbJ29rLnR4dCddKQorCisgICAgICAgIHJlbW92ZV90cmVlKHNlbGYucm9vdF90YXJnZXQsIHZlcmJvc2U9MCkKKyAgICAgICAgcmVtb3ZlX3RyZWUoc2VsZi50YXJnZXQyLCB2ZXJib3NlPTApCisKICAgICBkZWYgdGVzdF9lbnN1cmVfcmVsYXRpdmUoc2VsZik6CiAgICAgICAgIGlmIG9zLnNlcCA9PSAnLyc6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuc3VyZV9yZWxhdGl2ZSgnL2hvbWUvZm9vJyksICdob21lL2ZvbycpCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZmlsZWxpc3QucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZmlsZWxpc3QucHkKaW5kZXggMWUwNDA3Ny4uNjliODhmMiAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2ZpbGVsaXN0LnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9maWxlbGlzdC5weQpAQCAtMSw3ICsxLDcgQEAKICIiIlRlc3RzIGZvciBkaXN0dXRpbHMuZmlsZWxpc3QuIiIiCitpbXBvcnQgb3MKIGltcG9ydCByZQogaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIG9zLnBhdGggaW1wb3J0IGpvaW4KIGZyb20gZGlzdHV0aWxzIGltcG9ydCBkZWJ1ZwogZnJvbSBkaXN0dXRpbHMubG9nIGltcG9ydCBXQVJOCiBmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc1RlbXBsYXRlRXJyb3IKQEAgLTE1LDYgKzE1LDcgQEAKIGluY2x1ZGUgeG8KIGV4Y2x1ZGUgeG8KIGluY2x1ZGUgZm9vLnRtcAoraW5jbHVkZSBidWlsZG91dC5jZmcKIGdsb2JhbC1pbmNsdWRlICoueAogZ2xvYmFsLWluY2x1ZGUgKi50eHQKIGdsb2JhbC1leGNsdWRlICoudG1wCkBAIC0yNSw2ICsyNiwxMSBAQAogIiIiCiAKIAorZGVmIG1ha2VfbG9jYWxfcGF0aChzKToKKyAgICAiIiJDb252ZXJ0cyAnLycgaW4gYSBzdHJpbmcgdG8gb3Muc2VwIiIiCisgICAgcmV0dXJuIHMucmVwbGFjZSgnLycsIG9zLnNlcCkKKworCiBjbGFzcyBGaWxlTGlzdFRlc3RDYXNlKHN1cHBvcnQuTG9nZ2luZ1NpbGVuY2VyLAogICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CiAKQEAgLTM3LDQyICs0Myw2MCBAQAogICAgICAgICBzZWxmLmNsZWFyX2xvZ3MoKQogCiAgICAgZGVmIHRlc3RfZ2xvYl90b19yZShzZWxmKToKLSAgICAgICAgIyBzaW1wbGUgY2FzZXMKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnbG9iX3RvX3JlKCdmb28qJyksICdmb29bXi9dKlxcWig/bXMpJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnbG9iX3RvX3JlKCdmb28/JyksICdmb29bXi9dXFxaKD9tcyknKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdsb2JfdG9fcmUoJ2Zvbz8/JyksICdmb29bXi9dW14vXVxcWig/bXMpJykKKyAgICAgICAgc2VwID0gb3Muc2VwCisgICAgICAgIGlmIG9zLnNlcCA9PSAnXFwnOgorICAgICAgICAgICAgc2VwID0gcmUuZXNjYXBlKG9zLnNlcCkKIAotICAgICAgICAjIHNwZWNpYWwgY2FzZXMKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnbG9iX3RvX3JlKHInZm9vXFwqJyksIHInZm9vXFxcXFteL10qXFooP21zKScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2xvYl90b19yZShyJ2Zvb1xcXConKSwgcidmb29cXFxcXFxbXi9dKlxaKD9tcyknKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdsb2JfdG9fcmUoJ2Zvbz8/Pz8nKSwgcidmb29bXi9dW14vXVteL11bXi9dXFooP21zKScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2xvYl90b19yZShyJ2Zvb1xcPz8nKSwgcidmb29cXFxcW14vXVteL11cWig/bXMpJykKKyAgICAgICAgZm9yIGdsb2IsIHJlZ2V4IGluICgKKyAgICAgICAgICAgICMgc2ltcGxlIGNhc2VzCisgICAgICAgICAgICAoJ2ZvbyonLCByJ2Zvb1teJShzZXApc10qXFooP21zKScpLAorICAgICAgICAgICAgKCdmb28/Jywgcidmb29bXiUoc2VwKXNdXFooP21zKScpLAorICAgICAgICAgICAgKCdmb28/PycsIHInZm9vW14lKHNlcClzXVteJShzZXApc11cWig/bXMpJyksCisgICAgICAgICAgICAjIHNwZWNpYWwgY2FzZXMKKyAgICAgICAgICAgIChyJ2Zvb1xcKicsIHInZm9vXFxcXFteJShzZXApc10qXFooP21zKScpLAorICAgICAgICAgICAgKHInZm9vXFxcKicsIHInZm9vXFxcXFxcW14lKHNlcClzXSpcWig/bXMpJyksCisgICAgICAgICAgICAoJ2Zvbz8/Pz8nLCByJ2Zvb1teJShzZXApc11bXiUoc2VwKXNdW14lKHNlcClzXVteJShzZXApc11cWig/bXMpJyksCisgICAgICAgICAgICAocidmb29cXD8/Jywgcidmb29cXFxcW14lKHNlcClzXVteJShzZXApc11cWig/bXMpJykpOgorICAgICAgICAgICAgcmVnZXggPSByZWdleCAlIHsnc2VwJzogc2VwfQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnbG9iX3RvX3JlKGdsb2IpLCByZWdleCkKIAogICAgIGRlZiB0ZXN0X3Byb2Nlc3NfdGVtcGxhdGVfbGluZShzZWxmKToKICAgICAgICAgIyB0ZXN0aW5nICBhbGwgTUFOSUZFU1QuaW4gdGVtcGxhdGUgcGF0dGVybnMKICAgICAgICAgZmlsZV9saXN0ID0gRmlsZUxpc3QoKQorICAgICAgICBsID0gbWFrZV9sb2NhbF9wYXRoCiAKICAgICAgICAgIyBzaW11bGF0ZWQgZmlsZSBsaXN0CiAgICAgICAgIGZpbGVfbGlzdC5hbGxmaWxlcyA9IFsnZm9vLnRtcCcsICdvaycsICd4bycsICdmb3VyLnR4dCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luKCdnbG9iYWwnLCAnb25lLnR4dCcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbignZ2xvYmFsJywgJ3R3by50eHQnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4oJ2dsb2JhbCcsICdmaWxlcy54JyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luKCdnbG9iYWwnLCAnaGVyZS50bXAnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4oJ2YnLCAnbycsICdmLm9vJyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luKCdkaXInLCAnZ3JhZnQtb25lJyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luKCdkaXInLCAnZGlyMicsICdncmFmdDInKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4oJ2RpcjMnLCAnb2snKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4oJ2RpcjMnLCAnc3ViJywgJ29rLnR4dCcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1aWxkb3V0LmNmZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZpbGVsaXN0IGRvZXMgbm90IGZpbHRlciBvdXQgVkNTIGRpcmVjdG9yaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpdCdzIHNkaXN0IHRoYXQgZG9lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCgnLmhnL2xhc3QtbWVzc2FnZS50eHQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwoJ2dsb2JhbC9vbmUudHh0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsKCdnbG9iYWwvdHdvLnR4dCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCgnZ2xvYmFsL2ZpbGVzLngnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwoJ2dsb2JhbC9oZXJlLnRtcCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCgnZi9vL2Yub28nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwoJ2Rpci9ncmFmdC1vbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwoJ2Rpci9kaXIyL2dyYWZ0MicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCgnZGlyMy9vaycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCgnZGlyMy9zdWIvb2sudHh0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KIAogICAgICAgICBmb3IgbGluZSBpbiBNQU5JRkVTVF9JTi5zcGxpdCgnXG4nKToKICAgICAgICAgICAgIGlmIGxpbmUuc3RyaXAoKSA9PSAnJzoKICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgZmlsZV9saXN0LnByb2Nlc3NfdGVtcGxhdGVfbGluZShsaW5lKQogCi0gICAgICAgIHdhbnRlZCA9IFsnb2snLCAnZm91ci50eHQnLCBqb2luKCdnbG9iYWwnLCAnb25lLnR4dCcpLAotICAgICAgICAgICAgICAgICAgam9pbignZ2xvYmFsJywgJ3R3by50eHQnKSwgam9pbignZicsICdvJywgJ2Yub28nKSwKLSAgICAgICAgICAgICAgICAgIGpvaW4oJ2RpcicsICdncmFmdC1vbmUnKSwgam9pbignZGlyJywgJ2RpcjInLCAnZ3JhZnQyJyldCisgICAgICAgIHdhbnRlZCA9IFsnb2snLAorICAgICAgICAgICAgICAgICAgJ2J1aWxkb3V0LmNmZycsCisgICAgICAgICAgICAgICAgICAnZm91ci50eHQnLAorICAgICAgICAgICAgICAgICAgbCgnLmhnL2xhc3QtbWVzc2FnZS50eHQnKSwKKyAgICAgICAgICAgICAgICAgIGwoJ2dsb2JhbC9vbmUudHh0JyksCisgICAgICAgICAgICAgICAgICBsKCdnbG9iYWwvdHdvLnR4dCcpLAorICAgICAgICAgICAgICAgICAgbCgnZi9vL2Yub28nKSwKKyAgICAgICAgICAgICAgICAgIGwoJ2Rpci9ncmFmdC1vbmUnKSwKKyAgICAgICAgICAgICAgICAgIGwoJ2Rpci9kaXIyL2dyYWZ0MicpLAorICAgICAgICAgICAgICAgICBdCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2xpc3QuZmlsZXMsIHdhbnRlZCkKIApAQCAtMTYwLDYgKzE4NCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9saXN0LmFsbGZpbGVzLCBbJ2EucHknLCAnYi50eHQnXSkKIAogICAgIGRlZiB0ZXN0X3Byb2Nlc3NfdGVtcGxhdGUoc2VsZik6CisgICAgICAgIGwgPSBtYWtlX2xvY2FsX3BhdGgKICAgICAgICAgIyBpbnZhbGlkIGxpbmVzCiAgICAgICAgIGZpbGVfbGlzdCA9IEZpbGVMaXN0KCkKICAgICAgICAgZm9yIGFjdGlvbiBpbiAoJ2luY2x1ZGUnLCAnZXhjbHVkZScsICdnbG9iYWwtaW5jbHVkZScsCkBAIC0xNzAsNyArMTk1LDcgQEAKIAogICAgICAgICAjIGluY2x1ZGUKICAgICAgICAgZmlsZV9saXN0ID0gRmlsZUxpc3QoKQotICAgICAgICBmaWxlX2xpc3Quc2V0X2FsbGZpbGVzKFsnYS5weScsICdiLnR4dCcsICdkL2MucHknXSkKKyAgICAgICAgZmlsZV9saXN0LnNldF9hbGxmaWxlcyhbJ2EucHknLCAnYi50eHQnLCBsKCdkL2MucHknKV0pCiAKICAgICAgICAgZmlsZV9saXN0LnByb2Nlc3NfdGVtcGxhdGVfbGluZSgnaW5jbHVkZSAqLnB5JykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2xpc3QuZmlsZXMsIFsnYS5weSddKQpAQCAtMTgyLDMxICsyMDcsMzEgQEAKIAogICAgICAgICAjIGV4Y2x1ZGUKICAgICAgICAgZmlsZV9saXN0ID0gRmlsZUxpc3QoKQotICAgICAgICBmaWxlX2xpc3QuZmlsZXMgPSBbJ2EucHknLCAnYi50eHQnLCAnZC9jLnB5J10KKyAgICAgICAgZmlsZV9saXN0LmZpbGVzID0gWydhLnB5JywgJ2IudHh0JywgbCgnZC9jLnB5JyldCiAKICAgICAgICAgZmlsZV9saXN0LnByb2Nlc3NfdGVtcGxhdGVfbGluZSgnZXhjbHVkZSAqLnB5JykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2xpc3QuZmlsZXMsIFsnYi50eHQnLCAnZC9jLnB5J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9saXN0LmZpbGVzLCBbJ2IudHh0JywgbCgnZC9jLnB5JyldKQogICAgICAgICBzZWxmLmFzc2VydE5vV2FybmluZ3MoKQogCiAgICAgICAgIGZpbGVfbGlzdC5wcm9jZXNzX3RlbXBsYXRlX2xpbmUoJ2V4Y2x1ZGUgKi5yYicpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9saXN0LmZpbGVzLCBbJ2IudHh0JywgJ2QvYy5weSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfbGlzdC5maWxlcywgWydiLnR4dCcsIGwoJ2QvYy5weScpXSkKICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5ncygpCiAKICAgICAgICAgIyBnbG9iYWwtaW5jbHVkZQogICAgICAgICBmaWxlX2xpc3QgPSBGaWxlTGlzdCgpCi0gICAgICAgIGZpbGVfbGlzdC5zZXRfYWxsZmlsZXMoWydhLnB5JywgJ2IudHh0JywgJ2QvYy5weSddKQorICAgICAgICBmaWxlX2xpc3Quc2V0X2FsbGZpbGVzKFsnYS5weScsICdiLnR4dCcsIGwoJ2QvYy5weScpXSkKIAogICAgICAgICBmaWxlX2xpc3QucHJvY2Vzc190ZW1wbGF0ZV9saW5lKCdnbG9iYWwtaW5jbHVkZSAqLnB5JykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2xpc3QuZmlsZXMsIFsnYS5weScsICdkL2MucHknXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2xpc3QuZmlsZXMsIFsnYS5weScsIGwoJ2QvYy5weScpXSkKICAgICAgICAgc2VsZi5hc3NlcnROb1dhcm5pbmdzKCkKIAogICAgICAgICBmaWxlX2xpc3QucHJvY2Vzc190ZW1wbGF0ZV9saW5lKCdnbG9iYWwtaW5jbHVkZSAqLnJiJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2xpc3QuZmlsZXMsIFsnYS5weScsICdkL2MucHknXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2xpc3QuZmlsZXMsIFsnYS5weScsIGwoJ2QvYy5weScpXSkKICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5ncygpCiAKICAgICAgICAgIyBnbG9iYWwtZXhjbHVkZQogICAgICAgICBmaWxlX2xpc3QgPSBGaWxlTGlzdCgpCi0gICAgICAgIGZpbGVfbGlzdC5maWxlcyA9IFsnYS5weScsICdiLnR4dCcsICdkL2MucHknXQorICAgICAgICBmaWxlX2xpc3QuZmlsZXMgPSBbJ2EucHknLCAnYi50eHQnLCBsKCdkL2MucHknKV0KIAogICAgICAgICBmaWxlX2xpc3QucHJvY2Vzc190ZW1wbGF0ZV9saW5lKCdnbG9iYWwtZXhjbHVkZSAqLnB5JykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2xpc3QuZmlsZXMsIFsnYi50eHQnXSkKQEAgLTIxOCw1MCArMjQzLDUyIEBACiAKICAgICAgICAgIyByZWN1cnNpdmUtaW5jbHVkZQogICAgICAgICBmaWxlX2xpc3QgPSBGaWxlTGlzdCgpCi0gICAgICAgIGZpbGVfbGlzdC5zZXRfYWxsZmlsZXMoWydhLnB5JywgJ2QvYi5weScsICdkL2MudHh0JywgJ2QvZC9lLnB5J10pCisgICAgICAgIGZpbGVfbGlzdC5zZXRfYWxsZmlsZXMoWydhLnB5JywgbCgnZC9iLnB5JyksIGwoJ2QvYy50eHQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCgnZC9kL2UucHknKV0pCiAKICAgICAgICAgZmlsZV9saXN0LnByb2Nlc3NfdGVtcGxhdGVfbGluZSgncmVjdXJzaXZlLWluY2x1ZGUgZCAqLnB5JykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2xpc3QuZmlsZXMsIFsnZC9iLnB5JywgJ2QvZC9lLnB5J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9saXN0LmZpbGVzLCBbbCgnZC9iLnB5JyksIGwoJ2QvZC9lLnB5JyldKQogICAgICAgICBzZWxmLmFzc2VydE5vV2FybmluZ3MoKQogCiAgICAgICAgIGZpbGVfbGlzdC5wcm9jZXNzX3RlbXBsYXRlX2xpbmUoJ3JlY3Vyc2l2ZS1pbmNsdWRlIGUgKi5weScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9saXN0LmZpbGVzLCBbJ2QvYi5weScsICdkL2QvZS5weSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfbGlzdC5maWxlcywgW2woJ2QvYi5weScpLCBsKCdkL2QvZS5weScpXSkKICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5ncygpCiAKICAgICAgICAgIyByZWN1cnNpdmUtZXhjbHVkZQogICAgICAgICBmaWxlX2xpc3QgPSBGaWxlTGlzdCgpCi0gICAgICAgIGZpbGVfbGlzdC5maWxlcyA9IFsnYS5weScsICdkL2IucHknLCAnZC9jLnR4dCcsICdkL2QvZS5weSddCisgICAgICAgIGZpbGVfbGlzdC5maWxlcyA9IFsnYS5weScsIGwoJ2QvYi5weScpLCBsKCdkL2MudHh0JyksIGwoJ2QvZC9lLnB5JyldCiAKICAgICAgICAgZmlsZV9saXN0LnByb2Nlc3NfdGVtcGxhdGVfbGluZSgncmVjdXJzaXZlLWV4Y2x1ZGUgZCAqLnB5JykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2xpc3QuZmlsZXMsIFsnYS5weScsICdkL2MudHh0J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9saXN0LmZpbGVzLCBbJ2EucHknLCBsKCdkL2MudHh0JyldKQogICAgICAgICBzZWxmLmFzc2VydE5vV2FybmluZ3MoKQogCiAgICAgICAgIGZpbGVfbGlzdC5wcm9jZXNzX3RlbXBsYXRlX2xpbmUoJ3JlY3Vyc2l2ZS1leGNsdWRlIGUgKi5weScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9saXN0LmZpbGVzLCBbJ2EucHknLCAnZC9jLnR4dCddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfbGlzdC5maWxlcywgWydhLnB5JywgbCgnZC9jLnR4dCcpXSkKICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5ncygpCiAKICAgICAgICAgIyBncmFmdAogICAgICAgICBmaWxlX2xpc3QgPSBGaWxlTGlzdCgpCi0gICAgICAgIGZpbGVfbGlzdC5zZXRfYWxsZmlsZXMoWydhLnB5JywgJ2QvYi5weScsICdkL2QvZS5weScsICdmL2YucHknXSkKKyAgICAgICAgZmlsZV9saXN0LnNldF9hbGxmaWxlcyhbJ2EucHknLCBsKCdkL2IucHknKSwgbCgnZC9kL2UucHknKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCgnZi9mLnB5JyldKQogCiAgICAgICAgIGZpbGVfbGlzdC5wcm9jZXNzX3RlbXBsYXRlX2xpbmUoJ2dyYWZ0IGQnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfbGlzdC5maWxlcywgWydkL2IucHknLCAnZC9kL2UucHknXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2xpc3QuZmlsZXMsIFtsKCdkL2IucHknKSwgbCgnZC9kL2UucHknKV0pCiAgICAgICAgIHNlbGYuYXNzZXJ0Tm9XYXJuaW5ncygpCiAKICAgICAgICAgZmlsZV9saXN0LnByb2Nlc3NfdGVtcGxhdGVfbGluZSgnZ3JhZnQgZScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9saXN0LmZpbGVzLCBbJ2QvYi5weScsICdkL2QvZS5weSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfbGlzdC5maWxlcywgW2woJ2QvYi5weScpLCBsKCdkL2QvZS5weScpXSkKICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5ncygpCiAKICAgICAgICAgIyBwcnVuZQogICAgICAgICBmaWxlX2xpc3QgPSBGaWxlTGlzdCgpCi0gICAgICAgIGZpbGVfbGlzdC5maWxlcyA9IFsnYS5weScsICdkL2IucHknLCAnZC9kL2UucHknLCAnZi9mLnB5J10KKyAgICAgICAgZmlsZV9saXN0LmZpbGVzID0gWydhLnB5JywgbCgnZC9iLnB5JyksIGwoJ2QvZC9lLnB5JyksIGwoJ2YvZi5weScpXQogCiAgICAgICAgIGZpbGVfbGlzdC5wcm9jZXNzX3RlbXBsYXRlX2xpbmUoJ3BydW5lIGQnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfbGlzdC5maWxlcywgWydhLnB5JywgJ2YvZi5weSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfbGlzdC5maWxlcywgWydhLnB5JywgbCgnZi9mLnB5JyldKQogICAgICAgICBzZWxmLmFzc2VydE5vV2FybmluZ3MoKQogCiAgICAgICAgIGZpbGVfbGlzdC5wcm9jZXNzX3RlbXBsYXRlX2xpbmUoJ3BydW5lIGUnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfbGlzdC5maWxlcywgWydhLnB5JywgJ2YvZi5weSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfbGlzdC5maWxlcywgWydhLnB5JywgbCgnZi9mLnB5JyldKQogICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmdzKCkKIAogCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbC5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsLnB5CmluZGV4IGViZmIwNGYuLmMzNDkyYjggMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsLnB5CkBAIC02NSwxMSArNjUsOSBAQAogICAgICAgICBjaGVja19wYXRoKGNtZC5pbnN0YWxsX3NjcmlwdHMsIG9zLnBhdGguam9pbihkZXN0aW5hdGlvbiwgImJpbiIpKQogICAgICAgICBjaGVja19wYXRoKGNtZC5pbnN0YWxsX2RhdGEsIGRlc3RpbmF0aW9uKQogCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMudmVyc2lvbiA8ICcyLjYnLAorICAgICAgICAgICAgICAgICAgICAgJ3NpdGUuVVNFUl9TSVRFIHdhcyBpbnRyb2R1Y2VkIGluIDIuNicpCiAgICAgZGVmIHRlc3RfdXNlcl9zaXRlKHNlbGYpOgotICAgICAgICAjIHNpdGUuVVNFUl9TSVRFIHdhcyBpbnRyb2R1Y2VkIGluIDIuNgotICAgICAgICBpZiBzeXMudmVyc2lvbiA8ICcyLjYnOgotICAgICAgICAgICAgcmV0dXJuCi0KICAgICAgICAgIyBwcmVwYXJpbmcgdGhlIGVudmlyb25tZW50IGZvciB0aGUgdGVzdAogICAgICAgICBzZWxmLm9sZF91c2VyX2Jhc2UgPSBzaXRlLlVTRVJfQkFTRQogICAgICAgICBzZWxmLm9sZF91c2VyX3NpdGUgPSBzaXRlLlVTRVJfU0lURQpAQCAtODYsMTkgKzg0LDE3IEBACiAgICAgICAgIHNlbGYub2xkX2V4cGFuZCA9IG9zLnBhdGguZXhwYW5kdXNlcgogICAgICAgICBvcy5wYXRoLmV4cGFuZHVzZXIgPSBfZXhwYW5kdXNlcgogCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgICMgdGhpcyBpcyB0aGUgYWN0dWFsIHRlc3QKLSAgICAgICAgICAgIHNlbGYuX3Rlc3RfdXNlcl9zaXRlKCkKLSAgICAgICAgZmluYWxseToKKyAgICAgICAgZGVmIGNsZWFudXAoKToKICAgICAgICAgICAgIHNpdGUuVVNFUl9CQVNFID0gc2VsZi5vbGRfdXNlcl9iYXNlCiAgICAgICAgICAgICBzaXRlLlVTRVJfU0lURSA9IHNlbGYub2xkX3VzZXJfc2l0ZQogICAgICAgICAgICAgaW5zdGFsbF9tb2R1bGUuVVNFUl9CQVNFID0gc2VsZi5vbGRfdXNlcl9iYXNlCiAgICAgICAgICAgICBpbnN0YWxsX21vZHVsZS5VU0VSX1NJVEUgPSBzZWxmLm9sZF91c2VyX3NpdGUKICAgICAgICAgICAgIG9zLnBhdGguZXhwYW5kdXNlciA9IHNlbGYub2xkX2V4cGFuZAogCi0gICAgZGVmIF90ZXN0X3VzZXJfc2l0ZShzZWxmKToKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKGNsZWFudXApCisKICAgICAgICAgZm9yIGtleSBpbiAoJ250X3VzZXInLCAndW5peF91c2VyJywgJ29zMl9ob21lJyk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoa2V5IGluIElOU1RBTExfU0NIRU1FUykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oa2V5LCBJTlNUQUxMX1NDSEVNRVMpCiAKICAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbih7J25hbWUnOiAneHgnfSkKICAgICAgICAgY21kID0gaW5zdGFsbChkaXN0KQpAQCAtMTA2LDE0ICsxMDIsMTQgQEAKICAgICAgICAgIyBtYWtpbmcgc3VyZSB0aGUgdXNlciBvcHRpb24gaXMgdGhlcmUKICAgICAgICAgb3B0aW9ucyA9IFtuYW1lIGZvciBuYW1lLCBzaG9ydCwgbGFibGUgaW4KICAgICAgICAgICAgICAgICAgICBjbWQudXNlcl9vcHRpb25zXQotICAgICAgICBzZWxmLmFzc2VydFRydWUoJ3VzZXInIGluIG9wdGlvbnMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3VzZXInLCBvcHRpb25zKQogCiAgICAgICAgICMgc2V0dGluZyBhIHZhbHVlCiAgICAgICAgIGNtZC51c2VyID0gMQogCiAgICAgICAgICMgdXNlciBiYXNlIGFuZCBzaXRlIHNob3VsZG4ndCBiZSBjcmVhdGVkIHlldAotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG9zLnBhdGguZXhpc3RzKHNlbGYudXNlcl9iYXNlKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLnVzZXJfc2l0ZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3MucGF0aC5leGlzdHMoc2VsZi51c2VyX2Jhc2UpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9zLnBhdGguZXhpc3RzKHNlbGYudXNlcl9zaXRlKSkKIAogICAgICAgICAjIGxldCdzIHJ1biBmaW5hbGl6ZQogICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCkBAIC0xMjIsOCArMTE4LDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHNlbGYudXNlcl9iYXNlKSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHNlbGYudXNlcl9zaXRlKSkKIAotICAgICAgICBzZWxmLmFzc2VydFRydWUoJ3VzZXJiYXNlJyBpbiBjbWQuY29uZmlnX3ZhcnMpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgndXNlcnNpdGUnIGluIGNtZC5jb25maWdfdmFycykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigndXNlcmJhc2UnLCBjbWQuY29uZmlnX3ZhcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3VzZXJzaXRlJywgY21kLmNvbmZpZ192YXJzKQogCiAgICAgZGVmIHRlc3RfaGFuZGxlX2V4dHJhX3BhdGgoc2VsZik6CiAgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oeyduYW1lJzogJ3h4JywgJ2V4dHJhX3BhdGgnOiAncGF0aCxkaXJzJ30pCkBAIC0xNjgsNyArMTY0LDcgQEAKICAgICAgICAgY21kLmhvbWUgPSAnaG9tZScKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzT3B0aW9uRXJyb3IsIGNtZC5maW5hbGl6ZV9vcHRpb25zKQogCi0gICAgICAgICMgY2FuJ3QgY29tYmluZSB1c2VyIHdpdGggd2l0aCBwcmVmaXgvZXhlY19wcmVmaXgvaG9tZSBvcgorICAgICAgICAjIGNhbid0IGNvbWJpbmUgdXNlciB3aXRoIHByZWZpeC9leGVjX3ByZWZpeC9ob21lIG9yCiAgICAgICAgICMgaW5zdGFsbF8ocGxhdCliYXNlCiAgICAgICAgIGNtZC5wcmVmaXggPSBOb25lCiAgICAgICAgIGNtZC51c2VyID0gJ3VzZXInCkBAIC0xNzYsMTUgKzE3MiwxNiBAQAogCiAgICAgZGVmIHRlc3RfcmVjb3JkKHNlbGYpOgogICAgICAgICBpbnN0YWxsX2RpciA9IHNlbGYubWtkdGVtcCgpCi0gICAgICAgIHByb2plY3RfZGlyLCBkaXN0ID0gc2VsZi5jcmVhdGVfZGlzdChzY3JpcHRzPVsnaGVsbG8nXSkKLSAgICAgICAgc2VsZi5hZGRDbGVhbnVwKG9zLmNoZGlyLCBvcy5nZXRjd2QoKSkKKyAgICAgICAgcHJvamVjdF9kaXIsIGRpc3QgPSBzZWxmLmNyZWF0ZV9kaXN0KHB5X21vZHVsZXM9WydoZWxsbyddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0cz1bJ3NheWhpJ10pCiAgICAgICAgIG9zLmNoZGlyKHByb2plY3RfZGlyKQotICAgICAgICBzZWxmLndyaXRlX2ZpbGUoJ2hlbGxvJywgInByaW50KCdvIGhhaScpIikKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKCdoZWxsby5weScsICJkZWYgbWFpbigpOiBwcmludCAnbyBoYWknIikKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKCdzYXloaScsICdmcm9tIGhlbGxvIGltcG9ydCBtYWluOyBtYWluKCknKQogCiAgICAgICAgIGNtZCA9IGluc3RhbGwoZGlzdCkKICAgICAgICAgZGlzdC5jb21tYW5kX29ialsnaW5zdGFsbCddID0gY21kCiAgICAgICAgIGNtZC5yb290ID0gaW5zdGFsbF9kaXIKLSAgICAgICAgY21kLnJlY29yZCA9IG9zLnBhdGguam9pbihwcm9qZWN0X2RpciwgJ1JFQ09SRCcpCisgICAgICAgIGNtZC5yZWNvcmQgPSBvcy5wYXRoLmpvaW4ocHJvamVjdF9kaXIsICdmaWxlbGlzdCcpCiAgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKICAgICAgICAgY21kLnJ1bigpCiAKQEAgLTE5NSw3ICsxOTIsNyBAQAogICAgICAgICAgICAgZi5jbG9zZSgpCiAKICAgICAgICAgZm91bmQgPSBbb3MucGF0aC5iYXNlbmFtZShsaW5lKSBmb3IgbGluZSBpbiBjb250ZW50LnNwbGl0bGluZXMoKV0KLSAgICAgICAgZXhwZWN0ZWQgPSBbJ2hlbGxvJywKKyAgICAgICAgZXhwZWN0ZWQgPSBbJ2hlbGxvLnB5JywgJ2hlbGxvLnB5YycsICdzYXloaScsCiAgICAgICAgICAgICAgICAgICAgICdVTktOT1dOLTAuMC4wLXB5JXMuJXMuZWdnLWluZm8nICUgc3lzLnZlcnNpb25faW5mb1s6Ml1dCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm91bmQsIGV4cGVjdGVkKQogCkBAIC0yMDMsNyArMjAwLDYgQEAKICAgICAgICAgaW5zdGFsbF9kaXIgPSBzZWxmLm1rZHRlbXAoKQogICAgICAgICBwcm9qZWN0X2RpciwgZGlzdCA9IHNlbGYuY3JlYXRlX2Rpc3QoZXh0X21vZHVsZXM9WwogICAgICAgICAgICAgRXh0ZW5zaW9uKCd4eCcsIFsneHhtb2R1bGUuYyddKV0pCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy5jaGRpciwgb3MuZ2V0Y3dkKCkpCiAgICAgICAgIG9zLmNoZGlyKHByb2plY3RfZGlyKQogICAgICAgICBzdXBwb3J0LmNvcHlfeHhtb2R1bGVfYyhwcm9qZWN0X2RpcikKIApAQCAtMjE1LDcgKzIxMSw3IEBACiAgICAgICAgIGRpc3QuY29tbWFuZF9vYmpbJ2luc3RhbGwnXSA9IGNtZAogICAgICAgICBkaXN0LmNvbW1hbmRfb2JqWydidWlsZF9leHQnXSA9IGJ1aWxkZXh0Y21kCiAgICAgICAgIGNtZC5yb290ID0gaW5zdGFsbF9kaXIKLSAgICAgICAgY21kLnJlY29yZCA9IG9zLnBhdGguam9pbihwcm9qZWN0X2RpciwgJ1JFQ09SRCcpCisgICAgICAgIGNtZC5yZWNvcmQgPSBvcy5wYXRoLmpvaW4ocHJvamVjdF9kaXIsICdmaWxlbGlzdCcpCiAgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKICAgICAgICAgY21kLnJ1bigpCiAKQEAgLTIzOSw3ICsyMzUsOCBAQAogICAgICAgICAgICAgICAgIHNlbGYudGVzdF9yZWNvcmQoKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgaW5zdGFsbF9tb2R1bGUuREVCVUcgPSBGYWxzZQotICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYubG9ncykgPiBvbGRfbG9nc19sZW4pCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcihsZW4oc2VsZi5sb2dzKSwgb2xkX2xvZ3NfbGVuKQorCiAKIGRlZiB0ZXN0X3N1aXRlKCk6CiAgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShJbnN0YWxsVGVzdENhc2UpCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9saWIucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9saWIucHkKaW5kZXggNGQ4NjMwOC4uMGRlZmJkNiAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfbGliLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2xpYi5weQpAQCAtNjUsNyArNjUsNyBAQAogICAgICAgICBjbWQuZGlzdHJpYnV0aW9uLnNjcmlwdF9uYW1lID0gJ3NldHVwLnB5JwogCiAgICAgICAgICMgZ2V0X291dHB1dCBzaG91bGQgcmV0dXJuIDQgZWxlbWVudHMKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihjbWQuZ2V0X291dHB1dHMoKSkgPj0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwobGVuKGNtZC5nZXRfb3V0cHV0cygpKSwgMikKIAogICAgIGRlZiB0ZXN0X2dldF9pbnB1dHMoc2VsZik6CiAgICAgICAgIHBrZ19kaXIsIGRpc3QgPSBzZWxmLmNyZWF0ZV9kaXN0KCkKQEAgLTk4LDcgKzk4LDcgQEAKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIHN5cy5kb250X3dyaXRlX2J5dGVjb2RlID0gb2xkX2RvbnRfd3JpdGVfYnl0ZWNvZGUKIAotICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2J5dGUtY29tcGlsaW5nIGlzIGRpc2FibGVkJyBpbiBzZWxmLmxvZ3NbMF1bMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2J5dGUtY29tcGlsaW5nIGlzIGRpc2FibGVkJywgc2VsZi5sb2dzWzBdWzFdKQogCiBkZWYgdGVzdF9zdWl0ZSgpOgogICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoSW5zdGFsbExpYlRlc3RDYXNlKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfc2NyaXB0cy5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX3NjcmlwdHMucHkKaW5kZXggNDYwODU0NS4uOWMwYmE2ZCAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfc2NyaXB0cy5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9zY3JpcHRzLnB5CkBAIC0yNCwxMCArMjQsMTAgQEAKICAgICAgICAgICAgIHNraXBfYnVpbGQ9MSwKICAgICAgICAgICAgICkKICAgICAgICAgY21kID0gaW5zdGFsbF9zY3JpcHRzKGRpc3QpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY21kLmZvcmNlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGNtZC5za2lwX2J1aWxkKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoY21kLmJ1aWxkX2RpciBpcyBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoY21kLmluc3RhbGxfZGlyIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY21kLmZvcmNlKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNtZC5za2lwX2J1aWxkKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShjbWQuYnVpbGRfZGlyKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShjbWQuaW5zdGFsbF9kaXIpCiAKICAgICAgICAgY21kLmZpbmFsaXplX29wdGlvbnMoKQogCkBAIC03Miw3ICs3Miw3IEBACiAKICAgICAgICAgaW5zdGFsbGVkID0gb3MubGlzdGRpcih0YXJnZXQpCiAgICAgICAgIGZvciBuYW1lIGluIGV4cGVjdGVkOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5hbWUgaW4gaW5zdGFsbGVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihuYW1lLCBpbnN0YWxsZWQpCiAKIAogZGVmIHRlc3Rfc3VpdGUoKToKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9tc3ZjOWNvbXBpbGVyLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X21zdmM5Y29tcGlsZXIucHkKaW5kZXggNzM0NzA3Mi4uMTZhOTVhZCAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X21zdmM5Y29tcGlsZXIucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X21zdmM5Y29tcGlsZXIucHkKQEAgLTEwNCw3ICsxMDQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X25vX2NvbXBpbGVyKHNlbGYpOgotICAgICAgICAjIG1ha2VzIHN1cmUgcXVlcnlfdmN2YXJzYWxsIHRocm93cworICAgICAgICAjIG1ha2VzIHN1cmUgcXVlcnlfdmN2YXJzYWxsIHJhaXNlcwogICAgICAgICAjIGEgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciBpZiB0aGUgY29tcGlsZXIKICAgICAgICAgIyBpcyBub3QgZm91bmQKICAgICAgICAgZnJvbSBkaXN0dXRpbHMubXN2Yzljb21waWxlciBpbXBvcnQgcXVlcnlfdmN2YXJzYWxsCkBAIC0xMjgsNyArMTI4LDcgQEAKICAgICAgICAgIyB3aW5kb3dzIHJlZ2lzdGVyaWVzIHZlcnNpb25zLgogICAgICAgICBwYXRoID0gcidDb250cm9sIFBhbmVsXERlc2t0b3AnCiAgICAgICAgIHYgPSBSZWcuZ2V0X3ZhbHVlKHBhdGgsIHUnZHJhZ2Z1bGx3aW5kb3dzJykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYgaW4gKHUnMCcsIHUnMScsIHUnMicpKQorICAgICAgICBzZWxmLmFzc2VydEluKHYsICh1JzAnLCB1JzEnLCB1JzInKSkKIAogICAgICAgICBpbXBvcnQgX3dpbnJlZwogICAgICAgICBIS0NVID0gX3dpbnJlZy5IS0VZX0NVUlJFTlRfVVNFUgpAQCAtMTM2LDcgKzEzNiw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoa2V5cywgTm9uZSkKIAogICAgICAgICBrZXlzID0gUmVnLnJlYWRfa2V5cyhIS0NVLCByJ0NvbnRyb2wgUGFuZWwnKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoJ0Rlc2t0b3AnIGluIGtleXMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ0Rlc2t0b3AnLCBrZXlzKQogCiAgICAgZGVmIHRlc3RfcmVtb3ZlX3Zpc3VhbF9jX3JlZihzZWxmKToKICAgICAgICAgZnJvbSBkaXN0dXRpbHMubXN2Yzljb21waWxlciBpbXBvcnQgTVNWQ0NvbXBpbGVyCkBAIC0xNzQsNyArMTc0LDcgQEAKIAogICAgICAgICBjb21waWxlciA9IE1TVkNDb21waWxlcigpCiAgICAgICAgIGdvdCA9IGNvbXBpbGVyLl9yZW1vdmVfdmlzdWFsX2NfcmVmKG1hbmlmZXN0KQotICAgICAgICBzZWxmLmFzc2VydElzKGdvdCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoZ290KQogCiAKIGRlZiB0ZXN0X3N1aXRlKCk6CmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfcmVnaXN0ZXIucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfcmVnaXN0ZXIucHkKaW5kZXggYWE5YmM0My4uY2E3ZDc5YiAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3JlZ2lzdGVyLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9yZWdpc3Rlci5weQpAQCAtMSw2ICsxLDUgQEAKICMgLSotIGVuY29kaW5nOiB1dGY4IC0qLQogIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5jb21tYW5kLnJlZ2lzdGVyLiIiIgotaW1wb3J0IHN5cwogaW1wb3J0IG9zCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBnZXRwYXNzCkBAIC0xMSwxMSArMTAsMTQgQEAKIAogZnJvbSBkaXN0dXRpbHMuY29tbWFuZCBpbXBvcnQgcmVnaXN0ZXIgYXMgcmVnaXN0ZXJfbW9kdWxlCiBmcm9tIGRpc3R1dGlscy5jb21tYW5kLnJlZ2lzdGVyIGltcG9ydCByZWdpc3RlcgotZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgRGlzdHJpYnV0aW9uCiBmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc1NldHVwRXJyb3IKIAotZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKLWZyb20gZGlzdHV0aWxzLnRlc3RzLnRlc3RfY29uZmlnIGltcG9ydCBQWVBJUkMsIFB5UElSQ0NvbW1hbmRUZXN0Q2FzZQorZnJvbSBkaXN0dXRpbHMudGVzdHMudGVzdF9jb25maWcgaW1wb3J0IFB5UElSQ0NvbW1hbmRUZXN0Q2FzZQorCit0cnk6CisgICAgaW1wb3J0IGRvY3V0aWxzCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZG9jdXRpbHMgPSBOb25lCiAKIFBZUElSQ19OT1BBU1NXT1JEID0gIiIiXAogW2Rpc3R1dGlsc10KQEAgLTk3LDcgKzk5LDcgQEAKICAgICAgICAgY21kID0gc2VsZi5fZ2V0X2NtZCgpCiAKICAgICAgICAgIyB3ZSBzaG91bGRuJ3QgaGF2ZSBhIC5weXBpcmMgZmlsZSB5ZXQKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLnJjKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcy5wYXRoLmV4aXN0cyhzZWxmLnJjKSkKIAogICAgICAgICAjIHBhdGNoaW5nIHJhd19pbnB1dCBhbmQgZ2V0cGFzcy5nZXRwYXNzCiAgICAgICAgICMgc28gcmVnaXN0ZXIgZ2V0cyBoYXBweQpAQCAtMTQyLDcgKzE0NCw3IEBACiAgICAgICAgIHJlcTEgPSBkaWN0KHNlbGYuY29ubi5yZXFzWzBdLmhlYWRlcnMpCiAgICAgICAgIHJlcTIgPSBkaWN0KHNlbGYuY29ubi5yZXFzWzFdLmhlYWRlcnMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxMlsnQ29udGVudC1sZW5ndGgnXSwgcmVxMVsnQ29udGVudC1sZW5ndGgnXSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCd4eHgnIGluIHNlbGYuY29ubi5yZXFzWzFdLmRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3h4eCcsIHNlbGYuY29ubi5yZXFzWzFdLmRhdGEpCiAKICAgICBkZWYgdGVzdF9wYXNzd29yZF9ub3RfaW5fZmlsZShzZWxmKToKIApAQCAtMTcyLDcgKzE3NCw3IEBACiAgICAgICAgIHJlcSA9IHNlbGYuY29ubi5yZXFzWzBdCiAgICAgICAgIGhlYWRlcnMgPSBkaWN0KHJlcS5oZWFkZXJzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhlYWRlcnNbJ0NvbnRlbnQtbGVuZ3RoJ10sICc2MDgnKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoJ3RhcmVrJyBpbiByZXEuZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigndGFyZWsnLCByZXEuZGF0YSkKIAogICAgIGRlZiB0ZXN0X3Bhc3N3b3JkX3Jlc2V0KHNlbGYpOgogICAgICAgICAjIHRoaXMgdGVzdCBydW5zIGNob2ljZSAzCkBAIC0xOTAsOCArMTkyLDkgQEAKICAgICAgICAgcmVxID0gc2VsZi5jb25uLnJlcXNbMF0KICAgICAgICAgaGVhZGVycyA9IGRpY3QocmVxLmhlYWRlcnMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGVhZGVyc1snQ29udGVudC1sZW5ndGgnXSwgJzI5MCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgndGFyZWsnIGluIHJlcS5kYXRhKQorICAgICAgICBzZWxmLmFzc2VydEluKCd0YXJlaycsIHJlcS5kYXRhKQogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoZG9jdXRpbHMgaXMgbm90IE5vbmUsICduZWVkcyBkb2N1dGlscycpCiAgICAgZGVmIHRlc3Rfc3RyaWN0KHNlbGYpOgogICAgICAgICAjIHRlc3RpbmcgdGhlIHNjcmlwdCBvcHRpb24KICAgICAgICAgIyB3aGVuIG9uLCB0aGUgcmVnaXN0ZXIgY29tbWFuZCBzdG9wcyBpZgpAQCAtMjA0LDEzICsyMDcsNiBAQAogICAgICAgICBjbWQuc3RyaWN0ID0gMQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNTZXR1cEVycm9yLCBjbWQucnVuKQogCi0gICAgICAgICMgd2UgZG9uJ3QgdGVzdCB0aGUgcmVTdCBmZWF0dXJlIGlmIGRvY3V0aWxzCi0gICAgICAgICMgaXMgbm90IGluc3RhbGxlZAotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBpbXBvcnQgZG9jdXRpbHMKLSAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgcmV0dXJuCi0KICAgICAgICAgIyBtZXRhZGF0YSBhcmUgT0sgYnV0IGxvbmdfZGVzY3JpcHRpb24gaXMgYnJva2VuCiAgICAgICAgIG1ldGFkYXRhID0geyd1cmwnOiAneHh4JywgJ2F1dGhvcic6ICd4eHgnLAogICAgICAgICAgICAgICAgICAgICAnYXV0aG9yX2VtYWlsJzogdSfDqXjDqXjDqScsCkBAIC0yNjQsNiArMjYwLDIxIEBACiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBkZWwgcmVnaXN0ZXJfbW9kdWxlLnJhd19pbnB1dAogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoZG9jdXRpbHMgaXMgbm90IE5vbmUsICduZWVkcyBkb2N1dGlscycpCisgICAgZGVmIHRlc3RfcmVnaXN0ZXJfaW52YWxpZF9sb25nX2Rlc2NyaXB0aW9uKHNlbGYpOgorICAgICAgICBkZXNjcmlwdGlvbiA9ICc6ZnVua2llOmBzdHJgJyAgIyBtaW1pYyBTcGhpbngtc3BlY2lmaWMgbWFya3VwCisgICAgICAgIG1ldGFkYXRhID0geyd1cmwnOiAneHh4JywgJ2F1dGhvcic6ICd4eHgnLAorICAgICAgICAgICAgICAgICAgICAnYXV0aG9yX2VtYWlsJzogJ3h4eCcsCisgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3h4eCcsICd2ZXJzaW9uJzogJ3h4eCcsCisgICAgICAgICAgICAgICAgICAgICdsb25nX2Rlc2NyaXB0aW9uJzogZGVzY3JpcHRpb259CisgICAgICAgIGNtZCA9IHNlbGYuX2dldF9jbWQobWV0YWRhdGEpCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgY21kLnN0cmljdCA9IFRydWUKKyAgICAgICAgaW5wdXRzID0gUmF3SW5wdXRzKCcyJywgJ3RhcmVrJywgJ3RhcmVrQHppYWRlLm9yZycpCisgICAgICAgIHJlZ2lzdGVyX21vZHVsZS5yYXdfaW5wdXQgPSBpbnB1dHMKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKGRlbGF0dHIsIHJlZ2lzdGVyX21vZHVsZSwgJ3Jhd19pbnB1dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1NldHVwRXJyb3IsIGNtZC5ydW4pCisKICAgICBkZWYgdGVzdF9jaGVja19tZXRhZGF0YV9kZXByZWNhdGVkKHNlbGYpOgogICAgICAgICAjIG1ha2VzIHN1cmUgbWFrZV9tZXRhZGF0YSBpcyBkZXByZWNhdGVkCiAgICAgICAgIGNtZCA9IHNlbGYuX2dldF9jbWQoKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3NkaXN0LnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3NkaXN0LnB5CmluZGV4IDMzZjZlZTYuLjAyYzFkMTIgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zZGlzdC5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3Rfc2Rpc3QucHkKQEAgLTYsNiArNiw3IEBACiBpbXBvcnQgemlwZmlsZQogZnJvbSBvcy5wYXRoIGltcG9ydCBqb2luCiBmcm9tIHRleHR3cmFwIGltcG9ydCBkZWRlbnQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IGNhcHR1cmVkX3N0ZG91dCwgY2hlY2tfd2FybmluZ3MsIHJ1bl91bml0dGVzdAogCiAjIHpsaWIgaXMgbm90IHVzZWQgaGVyZSwgYnV0IGlmIGl0J3Mgbm90IGF2YWlsYWJsZQogIyB0aGUgdGVzdHMgdGhhdCB1c2UgemlwZmlsZSBtYXkgZmFpbApAQCAtMjEsNyArMjIsNiBAQAogZXhjZXB0IEltcG9ydEVycm9yOgogICAgIFVJRF9HSURfU1VQUE9SVCA9IEZhbHNlCiAKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IGNhcHR1cmVkX3N0ZG91dCwgY2hlY2tfd2FybmluZ3MsIHJ1bl91bml0dGVzdAogCiBmcm9tIGRpc3R1dGlscy5jb21tYW5kLnNkaXN0IGltcG9ydCBzZGlzdCwgc2hvd19mb3JtYXRzCiBmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBEaXN0cmlidXRpb24KQEAgLTQyLDYgKzQyLDcgQEAKIE1BTklGRVNUID0gIiIiXAogIyBmaWxlIEdFTkVSQVRFRCBieSBkaXN0dXRpbHMsIGRvIE5PVCBlZGl0CiBSRUFETUUKK2J1aWxkb3V0LmNmZwogaW5yb290LnR4dAogc2V0dXAucHkKIGRhdGElKHNlcClzZGF0YS5kdApAQCAtOTAsOSArOTEsOCBAQAogCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQogICAgIGRlZiB0ZXN0X3BydW5lX2ZpbGVfbGlzdChzZWxmKToKLSAgICAgICAgIyB0aGlzIHRlc3QgY3JlYXRlcyBhIHBhY2thZ2Ugd2l0aCBzb21lIHZjcyBkaXJzIGluIGl0Ci0gICAgICAgICMgYW5kIGxhdW5jaCBzZGlzdCB0byBtYWtlIHN1cmUgdGhleSBnZXQgcHJ1bmVkCi0gICAgICAgICMgb24gYWxsIHN5c3RlbXMKKyAgICAgICAgIyB0aGlzIHRlc3QgY3JlYXRlcyBhIHByb2plY3Qgd2l0aCBzb21lIFZDUyBkaXJzIGFuZCBhbiBORlMgcmVuYW1lCisgICAgICAgICMgZmlsZSwgdGhlbiBsYXVuY2hlcyBzZGlzdCB0byBjaGVjayB0aGV5IGdldCBwcnVuZWQgb24gYWxsIHN5c3RlbXMKIAogICAgICAgICAjIGNyZWF0aW5nIFZDUyBkaXJlY3RvcmllcyB3aXRoIHNvbWUgZmlsZXMgaW4gdGhlbQogICAgICAgICBvcy5ta2Rpcihqb2luKHNlbGYudG1wX2RpciwgJ3NvbWVjb2RlJywgJy5zdm4nKSkKQEAgLTEwNiw2ICsxMDYsOCBAQAogICAgICAgICBzZWxmLndyaXRlX2ZpbGUoKHNlbGYudG1wX2RpciwgJ3NvbWVjb2RlJywgJy5naXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICdvaycpLCAneHh4JykKIAorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoKHNlbGYudG1wX2RpciwgJ3NvbWVjb2RlJywgJy5uZnMwMDAxJyksICd4eHgnKQorCiAgICAgICAgICMgbm93IGJ1aWxkaW5nIGEgc2Rpc3QKICAgICAgICAgZGlzdCwgY21kID0gc2VsZi5nZXRfY21kKCkKIApAQCAtMTMyLDEyICsxMzQsNiBAQAogCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQogICAgIGRlZiB0ZXN0X21ha2VfZGlzdHJpYnV0aW9uKHNlbGYpOgotCi0gICAgICAgICMgY2hlY2sgaWYgdGFyIGFuZCBnemlwIGFyZSBpbnN0YWxsZWQKLSAgICAgICAgaWYgKGZpbmRfZXhlY3V0YWJsZSgndGFyJykgaXMgTm9uZSBvcgotICAgICAgICAgICAgZmluZF9leGVjdXRhYmxlKCdnemlwJykgaXMgTm9uZSk6Ci0gICAgICAgICAgICByZXR1cm4KLQogICAgICAgICAjIG5vdyBidWlsZGluZyBhIHNkaXN0CiAgICAgICAgIGRpc3QsIGNtZCA9IHNlbGYuZ2V0X2NtZCgpCiAKQEAgLTE1MCw3ICsxNDYsNyBAQAogICAgICAgICBkaXN0X2ZvbGRlciA9IGpvaW4oc2VsZi50bXBfZGlyLCAnZGlzdCcpCiAgICAgICAgIHJlc3VsdCA9IG9zLmxpc3RkaXIoZGlzdF9mb2xkZXIpCiAgICAgICAgIHJlc3VsdC5zb3J0KCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIFsnZmFrZS0xLjAudGFyJywgJ2Zha2UtMS4wLnRhci5neiddICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIFsnZmFrZS0xLjAudGFyJywgJ2Zha2UtMS4wLnRhci5neiddKQogCiAgICAgICAgIG9zLnJlbW92ZShqb2luKGRpc3RfZm9sZGVyLCAnZmFrZS0xLjAudGFyJykpCiAgICAgICAgIG9zLnJlbW92ZShqb2luKGRpc3RfZm9sZGVyLCAnZmFrZS0xLjAudGFyLmd6JykpCkBAIC0xNjYsNiArMTYyLDI4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBbJ2Zha2UtMS4wLnRhcicsICdmYWtlLTEuMC50YXIuZ3onXSkKIAogICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHpsaWIsICJyZXF1aXJlcyB6bGliIikKKyAgICBkZWYgdGVzdF91bmljb2RlX21ldGFkYXRhX3RneihzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFVuaWNvZGUgbmFtZSBvciB2ZXJzaW9uIHNob3VsZCBub3QgYnJlYWsgYnVpbGRpbmcgdG8gdGFyLmd6IGZvcm1hdC4KKyAgICAgICAgUmVmZXJlbmNlIGlzc3VlICMxMTYzOC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgIyBjcmVhdGUgdGhlIHNkaXN0IGNvbW1hbmQgd2l0aCB1bmljb2RlIHBhcmFtZXRlcnMKKyAgICAgICAgZGlzdCwgY21kID0gc2VsZi5nZXRfY21kKHsnbmFtZSc6IHUnZmFrZScsICd2ZXJzaW9uJzogdScxLjAnfSkKKworICAgICAgICAjIGNyZWF0ZSB0aGUgc2Rpc3QgYXMgZ3p0YXIgYW5kIHJ1biB0aGUgY29tbWFuZAorICAgICAgICBjbWQuZm9ybWF0cyA9IFsnZ3p0YXInXQorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGNtZC5ydW4oKQorCisgICAgICAgICMgVGhlIGNvbW1hbmQgc2hvdWxkIGhhdmUgY3JlYXRlZCB0aGUgLnRhci5neiBmaWxlCisgICAgICAgIGRpc3RfZm9sZGVyID0gam9pbihzZWxmLnRtcF9kaXIsICdkaXN0JykKKyAgICAgICAgcmVzdWx0ID0gb3MubGlzdGRpcihkaXN0X2ZvbGRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIFsnZmFrZS0xLjAudGFyLmd6J10pCisKKyAgICAgICAgb3MucmVtb3ZlKGpvaW4oZGlzdF9mb2xkZXIsICdmYWtlLTEuMC50YXIuZ3onKSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHpsaWIsICJyZXF1aXJlcyB6bGliIikKICAgICBkZWYgdGVzdF9hZGRfZGVmYXVsdHMoc2VsZik6CiAKICAgICAgICAgIyBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjI3OQpAQCAtMTg3LDExICsyMDUsMTggQEAKICAgICAgICAgc2VsZi53cml0ZV9maWxlKChkYXRhX2RpciwgJ2RhdGEuZHQnKSwgJyMnKQogICAgICAgICBzb21lX2RpciA9IGpvaW4oc2VsZi50bXBfZGlyLCAnc29tZScpCiAgICAgICAgIG9zLm1rZGlyKHNvbWVfZGlyKQorICAgICAgICAjIG1ha2Ugc3VyZSBWQ1MgZGlyZWN0b3JpZXMgYXJlIHBydW5lZCAoIzE0MDA0KQorICAgICAgICBoZ19kaXIgPSBqb2luKHNlbGYudG1wX2RpciwgJy5oZycpCisgICAgICAgIG9zLm1rZGlyKGhnX2RpcikKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChoZ19kaXIsICdsYXN0LW1lc3NhZ2UudHh0JyksICcjJykKKyAgICAgICAgIyBhIGJ1Z2d5IHJlZ2V4IHVzZWQgdG8gcHJldmVudCB0aGlzIGZyb20gd29ya2luZyBvbiB3aW5kb3dzICgjNjg4NCkKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChzZWxmLnRtcF9kaXIsICdidWlsZG91dC5jZmcnKSwgJyMnKQogICAgICAgICBzZWxmLndyaXRlX2ZpbGUoKHNlbGYudG1wX2RpciwgJ2lucm9vdC50eHQnKSwgJyMnKQogICAgICAgICBzZWxmLndyaXRlX2ZpbGUoKHNvbWVfZGlyLCAnZmlsZS50eHQnKSwgJyMnKQogICAgICAgICBzZWxmLndyaXRlX2ZpbGUoKHNvbWVfZGlyLCAnb3RoZXJfZmlsZS50eHQnKSwgJyMnKQogCiAgICAgICAgIGRpc3QuZGF0YV9maWxlcyA9IFsoJ2RhdGEnLCBbJ2RhdGEvZGF0YS5kdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1aWxkb3V0LmNmZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lucm9vdC50eHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdub3RleGlzdGluZyddKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb21lL2ZpbGUudHh0JywKQEAgLTIyMSwxNSArMjQ2LDE1IEBACiAgICAgICAgICAgICB6aXBfZmlsZS5jbG9zZSgpCiAKICAgICAgICAgIyBtYWtpbmcgc3VyZSBldmVyeXRoaW5nIHdhcyBhZGRlZAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjb250ZW50KSwgMTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGNvbnRlbnQpLCAxMikKIAogICAgICAgICAjIGNoZWNraW5nIHRoZSBNQU5JRkVTVAogICAgICAgICBmID0gb3Blbihqb2luKHNlbGYudG1wX2RpciwgJ01BTklGRVNUJykpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG1hbmlmZXN0ID0gZi5yZWFkKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFuaWZlc3QsIE1BTklGRVNUICUgeydzZXAnOiBvcy5zZXB9KQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFuaWZlc3QsIE1BTklGRVNUICUgeydzZXAnOiBvcy5zZXB9KQogCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQogICAgIGRlZiB0ZXN0X21ldGFkYXRhX2NoZWNrX29wdGlvbihzZWxmKToKQEAgLTI5NCwxMyArMzE5LDExIEBACiAKICAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoVUlEX0dJRF9TVVBQT1JULCAiUmVxdWlyZXMgZ3JwIGFuZCBwd2Qgc3VwcG9ydCIpCisgICAgQHVuaXR0ZXN0LnNraXBJZihmaW5kX2V4ZWN1dGFibGUoJ3RhcicpIGlzIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAiVGhlIHRhciBjb21tYW5kIGlzIG5vdCBmb3VuZCIpCisgICAgQHVuaXR0ZXN0LnNraXBJZihmaW5kX2V4ZWN1dGFibGUoJ2d6aXAnKSBpcyBOb25lLAorICAgICAgICAgICAgICAgICAgICAgIlRoZSBnemlwIGNvbW1hbmQgaXMgbm90IGZvdW5kIikKICAgICBkZWYgdGVzdF9tYWtlX2Rpc3RyaWJ1dGlvbl9vd25lcl9ncm91cChzZWxmKToKLQotICAgICAgICAjIGNoZWNrIGlmIHRhciBhbmQgZ3ppcCBhcmUgaW5zdGFsbGVkCi0gICAgICAgIGlmIChmaW5kX2V4ZWN1dGFibGUoJ3RhcicpIGlzIE5vbmUgb3IKLSAgICAgICAgICAgIGZpbmRfZXhlY3V0YWJsZSgnZ3ppcCcpIGlzIE5vbmUpOgotICAgICAgICAgICAgcmV0dXJuCi0KICAgICAgICAgIyBub3cgYnVpbGRpbmcgYSBzZGlzdAogICAgICAgICBkaXN0LCBjbWQgPSBzZWxmLmdldF9jbWQoKQogCkBAIC0zNDUsNyArMzY4LDcgQEAKICAgICAjIHRoZSBmb2xsb3dpbmcgdGVzdHMgbWFrZSBzdXJlIHRoZXJlIGlzIGEgbmljZSBlcnJvciBtZXNzYWdlIGluc3RlYWQKICAgICAjIG9mIGEgdHJhY2ViYWNrIHdoZW4gcGFyc2luZyBhbiBpbnZhbGlkIG1hbmlmZXN0IHRlbXBsYXRlCiAKLSAgICBkZWYgX3Rlc3RfdGVtcGxhdGUoc2VsZiwgY29udGVudCk6CisgICAgZGVmIF9jaGVja190ZW1wbGF0ZShzZWxmLCBjb250ZW50KToKICAgICAgICAgZGlzdCwgY21kID0gc2VsZi5nZXRfY21kKCkKICAgICAgICAgb3MuY2hkaXIoc2VsZi50bXBfZGlyKQogICAgICAgICBzZWxmLndyaXRlX2ZpbGUoJ01BTklGRVNULmluJywgY29udGVudCkKQEAgLTM1NiwxNyArMzc5LDE3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHdhcm5pbmdzKSwgMSkKIAogICAgIGRlZiB0ZXN0X2ludmFsaWRfdGVtcGxhdGVfdW5rbm93bl9jb21tYW5kKHNlbGYpOgotICAgICAgICBzZWxmLl90ZXN0X3RlbXBsYXRlKCd0YXVudCBrbmlnaHRzIConKQorICAgICAgICBzZWxmLl9jaGVja190ZW1wbGF0ZSgndGF1bnQga25pZ2h0cyAqJykKIAogICAgIGRlZiB0ZXN0X2ludmFsaWRfdGVtcGxhdGVfd3JvbmdfYXJndW1lbnRzKHNlbGYpOgogICAgICAgICAjIHRoaXMgbWFuaWZlc3QgY29tbWFuZCB0YWtlcyBvbmUgYXJndW1lbnQKLSAgICAgICAgc2VsZi5fdGVzdF90ZW1wbGF0ZSgncHJ1bmUnKQorICAgICAgICBzZWxmLl9jaGVja190ZW1wbGF0ZSgncHJ1bmUnKQogCiAgICAgQHVuaXR0ZXN0LnNraXBJZihvcy5uYW1lICE9ICdudCcsICd0ZXN0IHJlbGV2YW50IGZvciBXaW5kb3dzIG9ubHknKQogICAgIGRlZiB0ZXN0X2ludmFsaWRfdGVtcGxhdGVfd3JvbmdfcGF0aChzZWxmKToKICAgICAgICAgIyBvbiBXaW5kb3dzLCB0cmFpbGluZyBzbGFzaGVzIGFyZSBub3QgYWxsb3dlZAogICAgICAgICAjIHRoaXMgdXNlZCB0byBjcmFzaCBpbnN0ZWFkIG9mIHJhaXNpbmcgYSB3YXJuaW5nOiAjODI4NgotICAgICAgICBzZWxmLl90ZXN0X3RlbXBsYXRlKCdpbmNsdWRlIGV4YW1wbGVzLycpCisgICAgICAgIHNlbGYuX2NoZWNrX3RlbXBsYXRlKCdpbmNsdWRlIGV4YW1wbGVzLycpCiAKICAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCiAgICAgZGVmIHRlc3RfZ2V0X2ZpbGVfbGlzdChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zeXNjb25maWcucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3Rfc3lzY29uZmlnLnB5CmluZGV4IDQ5NTcwYzQuLmViNGQyN2MgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zeXNjb25maWcucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3N5c2NvbmZpZy5weQpAQCAtMyw2ICszLDkgQEAKIGltcG9ydCB0ZXN0CiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBzaHV0aWwKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgdGV4dHdyYXAKIAogZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHN5c2NvbmZpZwogZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKQEAgLTcyLDYgKzc1LDUzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPVEhFUic6ICdmb28nfSkKIAogCisgICAgZGVmIHRlc3Rfc3lzY29uZmlnX21vZHVsZShzZWxmKToKKyAgICAgICAgaW1wb3J0IHN5c2NvbmZpZyBhcyBnbG9iYWxfc3lzY29uZmlnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2xvYmFsX3N5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignQ0ZMQUdTJyksIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignQ0ZMQUdTJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2xvYmFsX3N5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignTERGTEFHUycpLCBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ0xERkxBR1MnKSkKKworICAgIEB1bml0dGVzdC5za2lwSWYoc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdDVVNUT01JWkVEX09TWF9DT01QSUxFUicpLCdjb21waWxlciBmbGFncyBjdXN0b21pemVkJykKKyAgICBkZWYgdGVzdF9zeXNjb25maWdfY29tcGlsZXJfdmFycyhzZWxmKToKKyAgICAgICAgIyBPbiBPUyBYLCBiaW5hcnkgaW5zdGFsbGVycyBzdXBwb3J0IGV4dGVuc2lvbiBtb2R1bGUgYnVpbGRpbmcgb24KKyAgICAgICAgIyB2YXJpb3VzIGxldmVscyBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSB3aXRoIGRpZmZlcmluZyBYY29kZQorICAgICAgICAjIGNvbmZpZ3VyYXRpb25zLiAgVGhpcyByZXF1aXJlcyBjdXN0b21pemF0aW9uIG9mIHNvbWUgb2YgdGhlCisgICAgICAgICMgY29tcGlsZXIgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzIHRvIHN1aXQgdGhlIGVudmlyb25tZW50IG9uCisgICAgICAgICMgdGhlIGluc3RhbGxlZCBtYWNoaW5lLiAgU29tZSBvZiB0aGVzZSBjdXN0b21pemF0aW9ucyBtYXkgcmVxdWlyZQorICAgICAgICAjIHJ1bm5pbmcgZXh0ZXJuYWwgcHJvZ3JhbXMgYW5kLCBzbywgYXJlIGRlZmVycmVkIHVudGlsIG5lZWRlZCBieQorICAgICAgICAjIHRoZSBmaXJzdCBleHRlbnNpb24gbW9kdWxlIGJ1aWxkLiAgV2l0aCBQeXRob24gMy4zLCBvbmx5CisgICAgICAgICMgdGhlIERpc3R1dGlscyB2ZXJzaW9uIG9mIHN5c2NvbmZpZyBpcyB1c2VkIGZvciBleHRlbnNpb24gbW9kdWxlCisgICAgICAgICMgYnVpbGRzLCB3aGljaCBoYXBwZW5zIGVhcmxpZXIgaW4gdGhlIERpc3R1dGlscyB0ZXN0cy4gIFRoaXMgbWF5CisgICAgICAgICMgY2F1c2UgdGhlIGZvbGxvd2luZyB0ZXN0cyB0byBmYWlsIHNpbmNlIG5vIHRlc3RzIGhhdmUgY2F1c2VkCisgICAgICAgICMgdGhlIGdsb2JhbCB2ZXJzaW9uIG9mIHN5c2NvbmZpZyB0byBjYWxsIHRoZSBjdXN0b21pemF0aW9uIHlldC4KKyAgICAgICAgIyBUaGUgc29sdXRpb24gZm9yIG5vdyBpcyB0byBzaW1wbHkgc2tpcCB0aGlzIHRlc3QgaW4gdGhpcyBjYXNlLgorICAgICAgICAjIFRoZSBsb25nZXItdGVybSBzb2x1dGlvbiBpcyB0byBvbmx5IGhhdmUgb25lIHZlcnNpb24gb2Ygc3lzY29uZmlnLgorCisgICAgICAgIGltcG9ydCBzeXNjb25maWcgYXMgZ2xvYmFsX3N5c2NvbmZpZworICAgICAgICBpZiBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ0NVU1RPTUlaRURfT1NYX0NPTVBJTEVSJyk6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCdjb21waWxlciBmbGFncyBjdXN0b21pemVkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnbG9iYWxfc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdMRFNIQVJFRCcpLCBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ0xEU0hBUkVEJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2xvYmFsX3N5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignQ0MnKSwgc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdDQycpKQorCisgICAgZGVmIHRlc3RfY3VzdG9taXplX2NvbXBpbGVyX2JlZm9yZV9nZXRfY29uZmlnX3ZhcnMoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzIxOTIzOiB0ZXN0IHRoYXQgYSBEaXN0cmlidXRpb24gY29tcGlsZXIKKyAgICAgICAgIyBpbnN0YW5jZSBjYW4gYmUgY2FsbGVkIHdpdGhvdXQgYW4gZXhwbGljaXQgY2FsbCB0bworICAgICAgICAjIGdldF9jb25maWdfdmFycygpLgorICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAndycpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlbGluZXModGV4dHdyYXAuZGVkZW50KCcnJ1wKKyAgICAgICAgICAgICAgICBmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBEaXN0cmlidXRpb24KKyAgICAgICAgICAgICAgICBjb25maWcgPSBEaXN0cmlidXRpb24oKS5nZXRfY29tbWFuZF9vYmooJ2NvbmZpZycpCisgICAgICAgICAgICAgICAgIyB0cnlfY29tcGlsZSBtYXkgcGFzcyBvciBpdCBtYXkgZmFpbCBpZiBubyBjb21waWxlcgorICAgICAgICAgICAgICAgICMgaXMgZm91bmQgYnV0IGl0IHNob3VsZCBub3QgcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgICAgICAgICAgICAgIHJjID0gY29uZmlnLnRyeV9jb21waWxlKCdpbnQgeDsnKQorICAgICAgICAgICAgICAgICcnJykpCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzdHIoc3lzLmV4ZWN1dGFibGUpLCBURVNURk5dLAorICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VULAorICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlKQorICAgICAgICBvdXRzLCBlcnJzID0gcC5jb21tdW5pY2F0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcC5yZXR1cm5jb2RlLCAiU3VicHJvY2VzcyBmYWlsZWQ6ICIgKyBvdXRzKQorCisKIGRlZiB0ZXN0X3N1aXRlKCk6CiAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQogICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKFN5c2NvbmZpZ1Rlc3RDYXNlKSkKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF91bml4Y2NvbXBpbGVyLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VuaXhjY29tcGlsZXIucHkKaW5kZXggNDBjOTA4YS4uZmVjMWVhNiAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VuaXhjY29tcGlsZXIucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VuaXhjY29tcGlsZXIucHkKQEAgLTEsNyArMSw4IEBACiAiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLnVuaXhjY29tcGlsZXIuIiIiCitpbXBvcnQgb3MKIGltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBFbnZpcm9ubWVudFZhckd1YXJkLCBydW5fdW5pdHRlc3QKIAogZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHN5c2NvbmZpZwogZnJvbSBkaXN0dXRpbHMudW5peGNjb21waWxlciBpbXBvcnQgVW5peENDb21waWxlcgpAQCAtMjAsMTIgKzIxLDggQEAKICAgICAgICAgc3lzLnBsYXRmb3JtID0gc2VsZi5fYmFja3VwX3BsYXRmb3JtCiAgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhciA9IHNlbGYuX2JhY2t1cF9nZXRfY29uZmlnX3ZhcgogCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJywgImNhbid0IHRlc3Qgb24gV2luZG93cyIpCiAgICAgZGVmIHRlc3RfcnVudGltZV9saWJkaXJfb3B0aW9uKHNlbGYpOgotCi0gICAgICAgICMgbm90IHRlc3RlZCB1bmRlciB3aW5kb3dzCi0gICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgotICAgICAgICAgICAgcmV0dXJuCi0KICAgICAgICAgIyBJc3N1ZSM1OTAwCiAgICAgICAgICMKICAgICAgICAgIyBFbnN1cmUgUlVOUEFUSCBpcyBhZGRlZCB0byBleHRlbnNpb24gbW9kdWxlcyB3aXRoIFJQQVRIIGlmCkBAIC0xMjIsNiArMTE5LDM3IEBACiAgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhciA9IGdjdgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2MucnBhdGhfZm9vKCksICctUi9mb28nKQogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nLCAndGVzdCBvbmx5IHJlbGV2YW50IGZvciBPUyBYJykKKyAgICBkZWYgdGVzdF9vc3hfY2Nfb3ZlcnJpZGVzX2xkc2hhcmVkKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxODA4MDoKKyAgICAgICAgIyBlbnN1cmUgdGhhdCBzZXR0aW5nIENDIGVudiB2YXJpYWJsZSBhbHNvIGNoYW5nZXMgZGVmYXVsdCBsaW5rZXIKKyAgICAgICAgZGVmIGdjdih2KToKKyAgICAgICAgICAgIGlmIHYgPT0gJ0xEU0hBUkVEJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gJ2djYy00LjIgLWJ1bmRsZSAtdW5kZWZpbmVkIGR5bmFtaWNfbG9va3VwICcKKyAgICAgICAgICAgIHJldHVybiAnZ2NjLTQuMicKKyAgICAgICAgc3lzY29uZmlnLmdldF9jb25maWdfdmFyID0gZ2N2CisgICAgICAgIHdpdGggRW52aXJvbm1lbnRWYXJHdWFyZCgpIGFzIGVudjoKKyAgICAgICAgICAgIGVudlsnQ0MnXSA9ICdteV9jYycKKyAgICAgICAgICAgIGRlbCBlbnZbJ0xEU0hBUkVEJ10KKyAgICAgICAgICAgIHN5c2NvbmZpZy5jdXN0b21pemVfY29tcGlsZXIoc2VsZi5jYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNjLmxpbmtlcl9zb1swXSwgJ215X2NjJykKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJywgJ3Rlc3Qgb25seSByZWxldmFudCBmb3IgT1MgWCcpCisgICAgZGVmIHRlc3Rfb3N4X2V4cGxpY3RfbGRzaGFyZWQoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzE4MDgwOgorICAgICAgICAjIGVuc3VyZSB0aGF0IHNldHRpbmcgQ0MgZW52IHZhcmlhYmxlIGRvZXMgbm90IGNoYW5nZQorICAgICAgICAjICAgZXhwbGljaXQgTERTSEFSRUQgc2V0dGluZyBmb3IgbGlua2VyCisgICAgICAgIGRlZiBnY3Yodik6CisgICAgICAgICAgICBpZiB2ID09ICdMRFNIQVJFRCc6CisgICAgICAgICAgICAgICAgcmV0dXJuICdnY2MtNC4yIC1idW5kbGUgLXVuZGVmaW5lZCBkeW5hbWljX2xvb2t1cCAnCisgICAgICAgICAgICByZXR1cm4gJ2djYy00LjInCisgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhciA9IGdjdgorICAgICAgICB3aXRoIEVudmlyb25tZW50VmFyR3VhcmQoKSBhcyBlbnY6CisgICAgICAgICAgICBlbnZbJ0NDJ10gPSAnbXlfY2MnCisgICAgICAgICAgICBlbnZbJ0xEU0hBUkVEJ10gPSAnbXlfbGQgLWJ1bmRsZSAtZHluYW1pYycKKyAgICAgICAgICAgIHN5c2NvbmZpZy5jdXN0b21pemVfY29tcGlsZXIoc2VsZi5jYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNjLmxpbmtlcl9zb1swXSwgJ215X2xkJykKKwogCiBkZWYgdGVzdF9zdWl0ZSgpOgogICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoVW5peENDb21waWxlclRlc3RDYXNlKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VwbG9hZC5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF91cGxvYWQucHkKaW5kZXggOTkxMTE5OS4uMTc3MzVkMyAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VwbG9hZC5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdXBsb2FkLnB5CkBAIC03LDYgKzcsNyBAQAogZnJvbSBkaXN0dXRpbHMuY29tbWFuZCBpbXBvcnQgdXBsb2FkIGFzIHVwbG9hZF9tb2QKIGZyb20gZGlzdHV0aWxzLmNvbW1hbmQudXBsb2FkIGltcG9ydCB1cGxvYWQKIGZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IERpc3RyaWJ1dGlvbgorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFcnJvcgogCiBmcm9tIGRpc3R1dGlscy50ZXN0cy50ZXN0X2NvbmZpZyBpbXBvcnQgUFlQSVJDLCBQeVBJUkNDb21tYW5kVGVzdENhc2UKIApAQCAtNDEsMTYgKzQyLDE3IEBACiAKIGNsYXNzIEZha2VPcGVuKG9iamVjdCk6CiAKLSAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsLCBtc2c9Tm9uZSwgY29kZT1Ob25lKToKICAgICAgICAgc2VsZi51cmwgPSB1cmwKICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodXJsLCBzdHIpOgogICAgICAgICAgICAgc2VsZi5yZXEgPSB1cmwKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYucmVxID0gTm9uZQotICAgICAgICBzZWxmLm1zZyA9ICdPSycKKyAgICAgICAgc2VsZi5tc2cgPSBtc2cgb3IgJ09LJworICAgICAgICBzZWxmLmNvZGUgPSBjb2RlIG9yIDIwMAogCiAgICAgZGVmIGdldGNvZGUoc2VsZik6Ci0gICAgICAgIHJldHVybiAyMDAKKyAgICAgICAgcmV0dXJuIHNlbGYuY29kZQogCiAKIGNsYXNzIHVwbG9hZFRlc3RDYXNlKFB5UElSQ0NvbW1hbmRUZXN0Q2FzZSk6CkBAIC02MCwxMyArNjIsMTUgQEAKICAgICAgICAgc2VsZi5vbGRfb3BlbiA9IHVwbG9hZF9tb2QudXJsb3BlbgogICAgICAgICB1cGxvYWRfbW9kLnVybG9wZW4gPSBzZWxmLl91cmxvcGVuCiAgICAgICAgIHNlbGYubGFzdF9vcGVuID0gTm9uZQorICAgICAgICBzZWxmLm5leHRfbXNnID0gTm9uZQorICAgICAgICBzZWxmLm5leHRfY29kZSA9IE5vbmUKIAogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICAgdXBsb2FkX21vZC51cmxvcGVuID0gc2VsZi5vbGRfb3BlbgogICAgICAgICBzdXBlcih1cGxvYWRUZXN0Q2FzZSwgc2VsZikudGVhckRvd24oKQogCiAgICAgZGVmIF91cmxvcGVuKHNlbGYsIHVybCk6Ci0gICAgICAgIHNlbGYubGFzdF9vcGVuID0gRmFrZU9wZW4odXJsKQorICAgICAgICBzZWxmLmxhc3Rfb3BlbiA9IEZha2VPcGVuKHVybCwgbXNnPXNlbGYubmV4dF9tc2csIGNvZGU9c2VsZi5uZXh0X2NvZGUpCiAgICAgICAgIHJldHVybiBzZWxmLmxhc3Rfb3BlbgogCiAgICAgZGVmIHRlc3RfZmluYWxpemVfb3B0aW9ucyhzZWxmKToKQEAgLTc4LDcgKzgyLDcgQEAKICAgICAgICAgY21kLmZpbmFsaXplX29wdGlvbnMoKQogICAgICAgICBmb3IgYXR0ciwgd2FpdGVkIGluICgoJ3VzZXJuYW1lJywgJ21lJyksICgncGFzc3dvcmQnLCAnc2VjcmV0JyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgncmVhbG0nLCAncHlwaScpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3JlcG9zaXRvcnknLCAnaHR0cDovL3B5cGkucHl0aG9uLm9yZy9weXBpJykpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3JlcG9zaXRvcnknLCAnaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaScpKToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXR0cihjbWQsIGF0dHIpLCB3YWl0ZWQpCiAKICAgICBkZWYgdGVzdF9zYXZlZF9wYXNzd29yZChzZWxmKToKQEAgLTExOSwxMCArMTIzLDE1IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoZWFkZXJzWydDb250ZW50LXR5cGUnXS5zdGFydHN3aXRoKCdtdWx0aXBhcnQvZm9ybS1kYXRhJykpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sYXN0X29wZW4ucmVxLmdldF9tZXRob2QoKSwgJ1BPU1QnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubGFzdF9vcGVuLnJlcS5nZXRfZnVsbF91cmwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAnaHR0cDovL3B5cGkucHl0aG9uLm9yZy9weXBpJykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCd4eHgnIGluIHNlbGYubGFzdF9vcGVuLnJlcS5kYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICdodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigneHh4Jywgc2VsZi5sYXN0X29wZW4ucmVxLmRhdGEpCiAgICAgICAgIGF1dGggPSBzZWxmLmxhc3Rfb3Blbi5yZXEuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddCi0gICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoJ1xuJyBpbiBhdXRoKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdcbicsIGF1dGgpCisKKyAgICBkZWYgdGVzdF91cGxvYWRfZmFpbHMoc2VsZik6CisgICAgICAgIHNlbGYubmV4dF9tc2cgPSAiTm90IEZvdW5kIgorICAgICAgICBzZWxmLm5leHRfY29kZSA9IDQwNAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNFcnJvciwgc2VsZi50ZXN0X3VwbG9hZCkKIAogZGVmIHRlc3Rfc3VpdGUoKToKICAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKHVwbG9hZFRlc3RDYXNlKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3V0aWwucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdXRpbC5weQppbmRleCA2N2NkNGNjLi4yZDdiMTAxIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdXRpbC5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdXRpbC5weQpAQCAtMyw4ICszLDkgQEAKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CiAKLWZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwgRGlzdHV0aWxzQnl0ZUNvbXBpbGVFcnJvcgotZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgYnl0ZV9jb21waWxlCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0J5dGVDb21waWxlRXJyb3IKK2Zyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGJ5dGVfY29tcGlsZSwgZ3Jva19lbnZpcm9ubWVudF9lcnJvcgorCiAKIGNsYXNzIFV0aWxUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKQEAgLTE4LDYgKzE5LDEzIEBACiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBzeXMuZG9udF93cml0ZV9ieXRlY29kZSA9IG9sZF9kb250X3dyaXRlX2J5dGVjb2RlCiAKKyAgICBkZWYgdGVzdF9ncm9rX2Vudmlyb25tZW50X2Vycm9yKHNlbGYpOgorICAgICAgICAjIHRlc3Qgb2Jzb2xldGUgZnVuY3Rpb24gdG8gZW5zdXJlIGJhY2t3YXJkIGNvbXBhdCAoIzQ5MzEpCisgICAgICAgIGV4YyA9IElPRXJyb3IoIlVuYWJsZSB0byBmaW5kIGJhdGNoIGZpbGUiKQorICAgICAgICBtc2cgPSBncm9rX2Vudmlyb25tZW50X2Vycm9yKGV4YykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csICJlcnJvcjogVW5hYmxlIHRvIGZpbmQgYmF0Y2ggZmlsZSIpCisKKwogZGVmIHRlc3Rfc3VpdGUoKToKICAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKFV0aWxUZXN0Q2FzZSkKIApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy91bml4Y2NvbXBpbGVyLnB5IGIvTGliL2Rpc3R1dGlscy91bml4Y2NvbXBpbGVyLnB5CmluZGV4IGM0OWFjOWIuLjJhYTFjYjEgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdW5peGNjb21waWxlci5weQorKysgYi9MaWIvZGlzdHV0aWxzL3VuaXhjY29tcGlsZXIucHkKQEAgLTI2LDYgKzI2LDkgQEAKICAgICAgRGlzdHV0aWxzRXhlY0Vycm9yLCBDb21waWxlRXJyb3IsIExpYkVycm9yLCBMaW5rRXJyb3IKIGZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKIAoraWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgIGltcG9ydCBfb3N4X3N1cHBvcnQKKwogIyBYWFggVGhpbmdzIG5vdCBjdXJyZW50bHkgaGFuZGxlZDoKICMgICAqIG9wdGltaXphdGlvbi9kZWJ1Zy93YXJuaW5nIGZsYWdzOyB3ZSBqdXN0IHVzZSB3aGF0ZXZlcidzIGluIFB5dGhvbidzCiAjICAgICBNYWtlZmlsZSBhbmQgbGl2ZSB3aXRoIGl0LiAgSXMgdGhpcyBhZGVxdWF0ZT8gIElmIG5vdCwgd2UgbWlnaHQKQEAgLTQxLDY4ICs0NCw2IEBACiAjICAgICBzaG91bGQganVzdCBoYXBwaWx5IHN0dWZmIHRoZW0gaW50byB0aGUgcHJlcHJvY2Vzc29yL2NvbXBpbGVyL2xpbmtlcgogIyAgICAgb3B0aW9ucyBhbmQgY2Fycnkgb24uCiAKLWRlZiBfZGFyd2luX2NvbXBpbGVyX2ZpeHVwKGNvbXBpbGVyX3NvLCBjY19hcmdzKToKLSAgICAiIiIKLSAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgc3RyaXAgJy1pc3lzcm9vdCBQQVRIJyBhbmQgJy1hcmNoIEFSQ0gnIGZyb20gdGhlCi0gICAgY29tcGlsZSBmbGFncyBpZiB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIG9uZSB0aGVtIGluIGV4dHJhX2NvbXBpbGVfZmxhZ3MuCi0KLSAgICBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlICctYXJjaCBBUkNIJyBhZGRzIGFub3RoZXIgYXJjaGl0ZWN0dXJlIHRvIHRoZQotICAgIGJ1aWxkLCB3aXRob3V0IGEgd2F5IHRvIHJlbW92ZSBhbiBhcmNoaXRlY3R1cmUuIEZ1cnRoZXJtb3JlIEdDQyB3aWxsCi0gICAgYmFyZiBpZiBtdWx0aXBsZSAnLWlzeXNyb290JyBhcmd1bWVudHMgYXJlIHByZXNlbnQuCi0gICAgIiIiCi0gICAgc3RyaXBBcmNoID0gc3RyaXBTeXNyb290ID0gMAotCi0gICAgY29tcGlsZXJfc28gPSBsaXN0KGNvbXBpbGVyX3NvKQotICAgIGtlcm5lbF92ZXJzaW9uID0gb3MudW5hbWUoKVsyXSAjIDguNC4zCi0gICAgbWFqb3JfdmVyc2lvbiA9IGludChrZXJuZWxfdmVyc2lvbi5zcGxpdCgnLicpWzBdKQotCi0gICAgaWYgbWFqb3JfdmVyc2lvbiA8IDg6Ci0gICAgICAgICMgT1NYIGJlZm9yZSAxMC40LjAsIHRoZXNlIGRvbid0IHN1cHBvcnQgLWFyY2ggYW5kIC1pc3lzcm9vdCBhdAotICAgICAgICAjIGFsbC4KLSAgICAgICAgc3RyaXBBcmNoID0gc3RyaXBTeXNyb290ID0gVHJ1ZQotICAgIGVsc2U6Ci0gICAgICAgIHN0cmlwQXJjaCA9ICctYXJjaCcgaW4gY2NfYXJncwotICAgICAgICBzdHJpcFN5c3Jvb3QgPSAnLWlzeXNyb290JyBpbiBjY19hcmdzCi0KLSAgICBpZiBzdHJpcEFyY2ggb3IgJ0FSQ0hGTEFHUycgaW4gb3MuZW52aXJvbjoKLSAgICAgICAgd2hpbGUgMToKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBpbmRleCA9IGNvbXBpbGVyX3NvLmluZGV4KCctYXJjaCcpCi0gICAgICAgICAgICAgICAgIyBTdHJpcCB0aGlzIGFyZ3VtZW50IGFuZCB0aGUgbmV4dCBvbmU6Ci0gICAgICAgICAgICAgICAgZGVsIGNvbXBpbGVyX3NvW2luZGV4OmluZGV4KzJdCi0gICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgICAgICBicmVhawotCi0gICAgaWYgJ0FSQ0hGTEFHUycgaW4gb3MuZW52aXJvbiBhbmQgbm90IHN0cmlwQXJjaDoKLSAgICAgICAgIyBVc2VyIHNwZWNpZmllZCBkaWZmZXJlbnQgLWFyY2ggZmxhZ3MgaW4gdGhlIGVudmlyb24sCi0gICAgICAgICMgc2VlIGFsc28gZGlzdHV0aWxzLnN5c2NvbmZpZwotICAgICAgICBjb21waWxlcl9zbyA9IGNvbXBpbGVyX3NvICsgb3MuZW52aXJvblsnQVJDSEZMQUdTJ10uc3BsaXQoKQotCi0gICAgaWYgc3RyaXBTeXNyb290OgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBpbmRleCA9IGNvbXBpbGVyX3NvLmluZGV4KCctaXN5c3Jvb3QnKQotICAgICAgICAgICAgIyBTdHJpcCB0aGlzIGFyZ3VtZW50IGFuZCB0aGUgbmV4dCBvbmU6Ci0gICAgICAgICAgICBkZWwgY29tcGlsZXJfc29baW5kZXg6aW5kZXgrMl0KLSAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCi0KLSAgICAjIENoZWNrIGlmIHRoZSBTREsgdGhhdCBpcyB1c2VkIGR1cmluZyBjb21waWxhdGlvbiBhY3R1YWxseSBleGlzdHMsCi0gICAgIyB0aGUgdW5pdmVyc2FsIGJ1aWxkIHJlcXVpcmVzIHRoZSB1c2FnZSBvZiBhIHVuaXZlcnNhbCBTREsgYW5kIG5vdCBhbGwKLSAgICAjIHVzZXJzIGhhdmUgdGhhdCBpbnN0YWxsZWQgYnkgZGVmYXVsdC4KLSAgICBzeXNyb290ID0gTm9uZQotICAgIGlmICctaXN5c3Jvb3QnIGluIGNjX2FyZ3M6Ci0gICAgICAgIGlkeCA9IGNjX2FyZ3MuaW5kZXgoJy1pc3lzcm9vdCcpCi0gICAgICAgIHN5c3Jvb3QgPSBjY19hcmdzW2lkeCsxXQotICAgIGVsaWYgJy1pc3lzcm9vdCcgaW4gY29tcGlsZXJfc286Ci0gICAgICAgIGlkeCA9IGNvbXBpbGVyX3NvLmluZGV4KCctaXN5c3Jvb3QnKQotICAgICAgICBzeXNyb290ID0gY29tcGlsZXJfc29baWR4KzFdCi0KLSAgICBpZiBzeXNyb290IGFuZCBub3Qgb3MucGF0aC5pc2RpcihzeXNyb290KToKLSAgICAgICAgbG9nLndhcm4oIkNvbXBpbGluZyB3aXRoIGFuIFNESyB0aGF0IGRvZXNuJ3Qgc2VlbSB0byBleGlzdDogJXMiLAotICAgICAgICAgICAgICAgIHN5c3Jvb3QpCi0gICAgICAgIGxvZy53YXJuKCJQbGVhc2UgY2hlY2sgeW91ciBYY29kZSBpbnN0YWxsYXRpb24iKQotCi0gICAgcmV0dXJuIGNvbXBpbGVyX3NvCiAKIGNsYXNzIFVuaXhDQ29tcGlsZXIoQ0NvbXBpbGVyKToKIApAQCAtMTcyLDcgKzExMyw4IEBACiAgICAgZGVmIF9jb21waWxlKHNlbGYsIG9iaiwgc3JjLCBleHQsIGNjX2FyZ3MsIGV4dHJhX3Bvc3RhcmdzLCBwcF9vcHRzKToKICAgICAgICAgY29tcGlsZXJfc28gPSBzZWxmLmNvbXBpbGVyX3NvCiAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKLSAgICAgICAgICAgIGNvbXBpbGVyX3NvID0gX2Rhcndpbl9jb21waWxlcl9maXh1cChjb21waWxlcl9zbywgY2NfYXJncyArIGV4dHJhX3Bvc3RhcmdzKQorICAgICAgICAgICAgY29tcGlsZXJfc28gPSBfb3N4X3N1cHBvcnQuY29tcGlsZXJfZml4dXAoY29tcGlsZXJfc28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NfYXJncyArIGV4dHJhX3Bvc3RhcmdzKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzZWxmLnNwYXduKGNvbXBpbGVyX3NvICsgY2NfYXJncyArIFtzcmMsICctbycsIG9ial0gKwogICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9wb3N0YXJncykKQEAgLTI1MSw3ICsxOTMsNyBAQAogICAgICAgICAgICAgICAgICAgICBsaW5rZXJbaV0gPSBzZWxmLmNvbXBpbGVyX2N4eFtpXQogCiAgICAgICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgotICAgICAgICAgICAgICAgICAgICBsaW5rZXIgPSBfZGFyd2luX2NvbXBpbGVyX2ZpeHVwKGxpbmtlciwgbGRfYXJncykKKyAgICAgICAgICAgICAgICAgICAgbGlua2VyID0gX29zeF9zdXBwb3J0LmNvbXBpbGVyX2ZpeHVwKGxpbmtlciwgbGRfYXJncykKIAogICAgICAgICAgICAgICAgIHNlbGYuc3Bhd24obGlua2VyICsgbGRfYXJncykKICAgICAgICAgICAgIGV4Y2VwdCBEaXN0dXRpbHNFeGVjRXJyb3IsIG1zZzoKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdXRpbC5weSBiL0xpYi9kaXN0dXRpbHMvdXRpbC5weQppbmRleCA2YzQ5ZjBiLi4yYjRkNzg0IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3V0aWwucHkKKysrIGIvTGliL2Rpc3R1dGlscy91dGlsLnB5CkBAIC01MSw2ICs1MSwxMCBAQAogICAgICAgICAgICAgcmV0dXJuICd3aW4taWE2NCcKICAgICAgICAgcmV0dXJuIHN5cy5wbGF0Zm9ybQogCisgICAgIyBTZXQgZm9yIGNyb3NzIGJ1aWxkcyBleHBsaWNpdGx5CisgICAgaWYgIl9QWVRIT05fSE9TVF9QTEFURk9STSIgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgcmV0dXJuIG9zLmVudmlyb25bIl9QWVRIT05fSE9TVF9QTEFURk9STSJdCisKICAgICBpZiBvcy5uYW1lICE9ICJwb3NpeCIgb3Igbm90IGhhc2F0dHIob3MsICd1bmFtZScpOgogICAgICAgICAjIFhYWCB3aGF0IGFib3V0IHRoZSBhcmNoaXRlY3R1cmU/IE5UIGlzIEludGVsIG9yIEFscGhhLAogICAgICAgICAjIE1hYyBPUyBpcyBNNjhrIG9yIFBQQywgZXRjLgpAQCAtNzYsNiArODAsMTEgQEAKICAgICAgICAgaWYgcmVsZWFzZVswXSA+PSAiNSI6ICAgICAgICAgICAjIFN1bk9TIDUgPT0gU29sYXJpcyAyCiAgICAgICAgICAgICBvc25hbWUgPSAic29sYXJpcyIKICAgICAgICAgICAgIHJlbGVhc2UgPSAiJWQuJXMiICUgKGludChyZWxlYXNlWzBdKSAtIDMsIHJlbGVhc2VbMjpdKQorICAgICAgICAgICAgIyBXZSBjYW4ndCB1c2UgInBsYXRmb3JtLmFyY2hpdGVjdHVyZSgpWzBdIiBiZWNhdXNlIGEKKyAgICAgICAgICAgICMgYm9vdHN0cmFwIHByb2JsZW0uIFdlIHVzZSBhIGRpY3QgdG8gZ2V0IGFuIGVycm9yCisgICAgICAgICAgICAjIGlmIHNvbWUgc3VzcGljaW91cyBoYXBwZW5zLgorICAgICAgICAgICAgYml0bmVzcyA9IHsyMTQ3NDgzNjQ3OiIzMmJpdCIsIDkyMjMzNzIwMzY4NTQ3NzU4MDc6IjY0Yml0In0KKyAgICAgICAgICAgIG1hY2hpbmUgKz0gIi4lcyIgJSBiaXRuZXNzW3N5cy5tYXhpbnRdCiAgICAgICAgICMgZmFsbCB0aHJvdWdoIHRvIHN0YW5kYXJkIG9zbmFtZS1yZWxlYXNlLW1hY2hpbmUgcmVwcmVzZW50YXRpb24KICAgICBlbGlmIG9zbmFtZVs6NF0gPT0gImlyaXgiOiAgICAgICAgICAgICAgIyBjb3VsZCBiZSAiaXJpeDY0IiEKICAgICAgICAgcmV0dXJuICIlcy0lcyIgJSAob3NuYW1lLCByZWxlYXNlKQpAQCAtODgsOTQgKzk3LDEwIEBACiAgICAgICAgIGlmIG06CiAgICAgICAgICAgICByZWxlYXNlID0gbS5ncm91cCgpCiAgICAgZWxpZiBvc25hbWVbOjZdID09ICJkYXJ3aW4iOgotICAgICAgICAjCi0gICAgICAgICMgRm9yIG91ciBwdXJwb3Nlcywgd2UnbGwgYXNzdW1lIHRoYXQgdGhlIHN5c3RlbSB2ZXJzaW9uIGZyb20KLSAgICAgICAgIyBkaXN0dXRpbHMnIHBlcnNwZWN0aXZlIGlzIHdoYXQgTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUIGlzIHNldAotICAgICAgICAjIHRvLiBUaGlzIG1ha2VzIHRoZSBjb21wYXRpYmlsaXR5IHN0b3J5IGEgYml0IG1vcmUgc2FuZSBiZWNhdXNlIHRoZQotICAgICAgICAjIG1hY2hpbmUgaXMgZ29pbmcgdG8gY29tcGlsZSBhbmQgbGluayBhcyBpZiBpdCB3ZXJlCi0gICAgICAgICMgTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VULgotICAgICAgICBmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGdldF9jb25maWdfdmFycwotICAgICAgICBjZmd2YXJzID0gZ2V0X2NvbmZpZ192YXJzKCkKLQotICAgICAgICBtYWN2ZXIgPSBjZmd2YXJzLmdldCgnTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJykKLQotICAgICAgICBpZiAxOgotICAgICAgICAgICAgIyBBbHdheXMgY2FsY3VsYXRlIHRoZSByZWxlYXNlIG9mIHRoZSBydW5uaW5nIG1hY2hpbmUsCi0gICAgICAgICAgICAjIG5lZWRlZCB0byBkZXRlcm1pbmUgaWYgd2UgY2FuIGJ1aWxkIGZhdCBiaW5hcmllcyBvciBub3QuCi0KLSAgICAgICAgICAgIG1hY3JlbGVhc2UgPSBtYWN2ZXIKLSAgICAgICAgICAgICMgR2V0IHRoZSBzeXN0ZW0gdmVyc2lvbi4gUmVhZGluZyB0aGlzIHBsaXN0IGlzIGEgZG9jdW1lbnRlZAotICAgICAgICAgICAgIyB3YXkgdG8gZ2V0IHRoZSBzeXN0ZW0gdmVyc2lvbiAoc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvcgotICAgICAgICAgICAgIyB0aGUgR2VzdGFsdCBNYW5hZ2VyKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGYgPSBvcGVuKCcvU3lzdGVtL0xpYnJhcnkvQ29yZVNlcnZpY2VzL1N5c3RlbVZlcnNpb24ucGxpc3QnKQotICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6Ci0gICAgICAgICAgICAgICAgIyBXZSdyZSBvbiBhIHBsYWluIGRhcndpbiBib3gsIGZhbGwgYmFjayB0byB0aGUgZGVmYXVsdAotICAgICAgICAgICAgICAgICMgYmVoYXZpb3VyLgotICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBtID0gcmUuc2VhcmNoKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInPGtleT5Qcm9kdWN0VXNlclZpc2libGVWZXJzaW9uPC9rZXk+XHMqJyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcic8c3RyaW5nPiguKj8pPC9zdHJpbmc+JywgZi5yZWFkKCkpCi0gICAgICAgICAgICAgICAgICAgIGlmIG0gaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYWNyZWxlYXNlID0gJy4nLmpvaW4obS5ncm91cCgxKS5zcGxpdCgnLicpWzoyXSkKLSAgICAgICAgICAgICAgICAgICAgIyBlbHNlOiBmYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQgYmVoYXZpb3VyCi0gICAgICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCi0KLSAgICAgICAgaWYgbm90IG1hY3ZlcjoKLSAgICAgICAgICAgIG1hY3ZlciA9IG1hY3JlbGVhc2UKLQotICAgICAgICBpZiBtYWN2ZXI6Ci0gICAgICAgICAgICBmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGdldF9jb25maWdfdmFycwotICAgICAgICAgICAgcmVsZWFzZSA9IG1hY3ZlcgotICAgICAgICAgICAgb3NuYW1lID0gIm1hY29zeCIKLQotICAgICAgICAgICAgaWYgKG1hY3JlbGVhc2UgKyAnLicpID49ICcxMC40LicgYW5kIFwKLSAgICAgICAgICAgICAgICAgICAgJy1hcmNoJyBpbiBnZXRfY29uZmlnX3ZhcnMoKS5nZXQoJ0NGTEFHUycsICcnKS5zdHJpcCgpOgotICAgICAgICAgICAgICAgICMgVGhlIHVuaXZlcnNhbCBidWlsZCB3aWxsIGJ1aWxkIGZhdCBiaW5hcmllcywgYnV0IG5vdCBvbgotICAgICAgICAgICAgICAgICMgc3lzdGVtcyBiZWZvcmUgMTAuNAotICAgICAgICAgICAgICAgICMKLSAgICAgICAgICAgICAgICAjIFRyeSB0byBkZXRlY3QgNC13YXkgdW5pdmVyc2FsIGJ1aWxkcywgdGhvc2UgaGF2ZSBtYWNoaW5lLXR5cGUKLSAgICAgICAgICAgICAgICAjICd1bml2ZXJzYWwnIGluc3RlYWQgb2YgJ2ZhdCcuCi0KLSAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ2ZhdCcKLSAgICAgICAgICAgICAgICBjZmxhZ3MgPSBnZXRfY29uZmlnX3ZhcnMoKS5nZXQoJ0NGTEFHUycpCi0KLSAgICAgICAgICAgICAgICBhcmNocyA9IHJlLmZpbmRhbGwoJy1hcmNoXHMrKFxTKyknLCBjZmxhZ3MpCi0gICAgICAgICAgICAgICAgYXJjaHMgPSB0dXBsZShzb3J0ZWQoc2V0KGFyY2hzKSkpCi0KLSAgICAgICAgICAgICAgICBpZiBsZW4oYXJjaHMpID09IDE6Ci0gICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgPSBhcmNoc1swXQotICAgICAgICAgICAgICAgIGVsaWYgYXJjaHMgPT0gKCdpMzg2JywgJ3BwYycpOgotICAgICAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ2ZhdCcKLSAgICAgICAgICAgICAgICBlbGlmIGFyY2hzID09ICgnaTM4NicsICd4ODZfNjQnKToKLSAgICAgICAgICAgICAgICAgICAgbWFjaGluZSA9ICdpbnRlbCcKLSAgICAgICAgICAgICAgICBlbGlmIGFyY2hzID09ICgnaTM4NicsICdwcGMnLCAneDg2XzY0Jyk6Ci0gICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAnZmF0MycKLSAgICAgICAgICAgICAgICBlbGlmIGFyY2hzID09ICgncHBjNjQnLCAneDg2XzY0Jyk6Ci0gICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAnZmF0NjQnCi0gICAgICAgICAgICAgICAgZWxpZiBhcmNocyA9PSAoJ2kzODYnLCAncHBjJywgJ3BwYzY0JywgJ3g4Nl82NCcpOgotICAgICAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ3VuaXZlcnNhbCcKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAiRG9uJ3Qga25vdyBtYWNoaW5lIHZhbHVlIGZvciBhcmNocz0lciIlKGFyY2hzLCkpCi0KLSAgICAgICAgICAgIGVsaWYgbWFjaGluZSA9PSAnaTM4Nic6Ci0gICAgICAgICAgICAgICAgIyBPbiBPU1ggdGhlIG1hY2hpbmUgdHlwZSByZXR1cm5lZCBieSB1bmFtZSBpcyBhbHdheXMgdGhlCi0gICAgICAgICAgICAgICAgIyAzMi1iaXQgdmFyaWFudCwgZXZlbiBpZiB0aGUgZXhlY3V0YWJsZSBhcmNoaXRlY3R1cmUgaXMKLSAgICAgICAgICAgICAgICAjIHRoZSA2NC1iaXQgdmFyaWFudAotICAgICAgICAgICAgICAgIGlmIHN5cy5tYXhpbnQgPj0gMioqMzI6Ci0gICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAneDg2XzY0JwotCi0gICAgICAgICAgICBlbGlmIG1hY2hpbmUgaW4gKCdQb3dlclBDJywgJ1Bvd2VyX01hY2ludG9zaCcpOgotICAgICAgICAgICAgICAgICMgUGljayBhIHNhbmUgbmFtZSBmb3IgdGhlIFBQQyBhcmNoaXRlY3R1cmUuCi0gICAgICAgICAgICAgICAgbWFjaGluZSA9ICdwcGMnCi0KLSAgICAgICAgICAgICAgICAjIFNlZSAnaTM4NicgY2FzZQotICAgICAgICAgICAgICAgIGlmIHN5cy5tYXhpbnQgPj0gMioqMzI6Ci0gICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAncHBjNjQnCisgICAgICAgIGltcG9ydCBfb3N4X3N1cHBvcnQsIGRpc3R1dGlscy5zeXNjb25maWcKKyAgICAgICAgb3NuYW1lLCByZWxlYXNlLCBtYWNoaW5lID0gX29zeF9zdXBwb3J0LmdldF9wbGF0Zm9ybV9vc3goCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHV0aWxzLnN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc25hbWUsIHJlbGVhc2UsIG1hY2hpbmUpCiAKICAgICByZXR1cm4gIiVzLSVzLSVzIiAlIChvc25hbWUsIHJlbGVhc2UsIG1hY2hpbmUpCiAKQEAgLTI4OCwyNSArMjEzLDEwIEBACiAKIAogZGVmIGdyb2tfZW52aXJvbm1lbnRfZXJyb3IgKGV4YywgcHJlZml4PSJlcnJvcjogIik6Ci0gICAgIiIiR2VuZXJhdGUgYSB1c2VmdWwgZXJyb3IgbWVzc2FnZSBmcm9tIGFuIEVudmlyb25tZW50RXJyb3IgKElPRXJyb3Igb3IKLSAgICBPU0Vycm9yKSBleGNlcHRpb24gb2JqZWN0LiAgSGFuZGxlcyBQeXRob24gMS41LjEgYW5kIDEuNS4yIHN0eWxlcywgYW5kCi0gICAgZG9lcyB3aGF0IGl0IGNhbiB0byBkZWFsIHdpdGggZXhjZXB0aW9uIG9iamVjdHMgdGhhdCBkb24ndCBoYXZlIGEKLSAgICBmaWxlbmFtZSAod2hpY2ggaGFwcGVucyB3aGVuIHRoZSBlcnJvciBpcyBkdWUgdG8gYSB0d28tZmlsZSBvcGVyYXRpb24sCi0gICAgc3VjaCBhcyAncmVuYW1lKCknIG9yICdsaW5rKCknLiAgUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZSBhcyBhIHN0cmluZwotICAgIHByZWZpeGVkIHdpdGggJ3ByZWZpeCcuCi0gICAgIiIiCi0gICAgIyBjaGVjayBmb3IgUHl0aG9uIDEuNS4yLXN0eWxlIHtJTyxPU31FcnJvciBleGNlcHRpb24gb2JqZWN0cwotICAgIGlmIGhhc2F0dHIoZXhjLCAnZmlsZW5hbWUnKSBhbmQgaGFzYXR0cihleGMsICdzdHJlcnJvcicpOgotICAgICAgICBpZiBleGMuZmlsZW5hbWU6Ci0gICAgICAgICAgICBlcnJvciA9IHByZWZpeCArICIlczogJXMiICUgKGV4Yy5maWxlbmFtZSwgZXhjLnN0cmVycm9yKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgIyB0d28tYXJndW1lbnQgZnVuY3Rpb25zIGluIHBvc2l4IG1vZHVsZSBkb24ndAotICAgICAgICAgICAgIyBpbmNsdWRlIHRoZSBmaWxlbmFtZSBpbiB0aGUgZXhjZXB0aW9uIG9iamVjdCEKLSAgICAgICAgICAgIGVycm9yID0gcHJlZml4ICsgIiVzIiAlIGV4Yy5zdHJlcnJvcgotICAgIGVsc2U6Ci0gICAgICAgIGVycm9yID0gcHJlZml4ICsgc3RyKGV4Y1stMV0pCi0KLSAgICByZXR1cm4gZXJyb3IKKyAgICAjIEZ1bmN0aW9uIGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgICAgIyBVc2VkIHRvIHRyeSBjbGV2ZXIgdGhpbmdzIHdpdGggRW52aXJvbm1lbnRFcnJvcnMsCisgICAgIyBidXQgbm93YWRheXMgc3RyKGV4Y2VwdGlvbikgcHJvZHVjZXMgZ29vZCBtZXNzYWdlcy4KKyAgICByZXR1cm4gcHJlZml4ICsgc3RyKGV4YykKIAogCiAjIE5lZWRlZCBieSAnc3BsaXRfcXVvdGVkKCknCmRpZmYgLS1naXQgYS9MaWIvZG9jdGVzdC5weSBiL0xpYi9kb2N0ZXN0LnB5CmluZGV4IDYyMmY2OGQuLjg2Yzk4MzkgMTAwNjQ0Ci0tLSBhL0xpYi9kb2N0ZXN0LnB5CisrKyBiL0xpYi9kb2N0ZXN0LnB5CkBAIC0zMjYsNiArMzI2LDMyIEBACiAgICAgZWxzZToKICAgICAgICAgcmV0dXJuICcjJwogCitkZWYgX3N0cmlwX2V4Y2VwdGlvbl9kZXRhaWxzKG1zZyk6CisgICAgIyBTdXBwb3J0IGZvciBJR05PUkVfRVhDRVBUSU9OX0RFVEFJTC4KKyAgICAjIEdldCByaWQgb2YgZXZlcnl0aGluZyBleGNlcHQgdGhlIGV4Y2VwdGlvbiBuYW1lOyBpbiBwYXJ0aWN1bGFyLCBkcm9wCisgICAgIyB0aGUgcG9zc2libHkgZG90dGVkIG1vZHVsZSBwYXRoIChpZiBhbnkpIGFuZCB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgKGlmCisgICAgIyBhbnkpLiAgV2UgYXNzdW1lIHRoYXQgYSBjb2xvbiBpcyBuZXZlciBwYXJ0IG9mIGEgZG90dGVkIG5hbWUsIG9yIG9mIGFuCisgICAgIyBleGNlcHRpb24gbmFtZS4KKyAgICAjIEUuZy4sIGdpdmVuCisgICAgIyAgICAiZm9vLmJhci5NeUVycm9yOiBsYSBkaSBkYSIKKyAgICAjIHJldHVybiAiTXlFcnJvciIKKyAgICAjIE9yIGZvciAiYWJjLmRlZiIgb3IgImFiYy5kZWY6XG4iIHJldHVybiAiZGVmIi4KKworICAgIHN0YXJ0LCBlbmQgPSAwLCBsZW4obXNnKQorICAgICMgVGhlIGV4Y2VwdGlvbiBuYW1lIG11c3QgYXBwZWFyIG9uIHRoZSBmaXJzdCBsaW5lLgorICAgIGkgPSBtc2cuZmluZCgiXG4iKQorICAgIGlmIGkgPj0gMDoKKyAgICAgICAgZW5kID0gaQorICAgICMgcmV0YWluIHVwIHRvIHRoZSBmaXJzdCBjb2xvbiAoaWYgYW55KQorICAgIGkgPSBtc2cuZmluZCgnOicsIDAsIGVuZCkKKyAgICBpZiBpID49IDA6CisgICAgICAgIGVuZCA9IGkKKyAgICAjIHJldGFpbiBqdXN0IHRoZSBleGNlcHRpb24gbmFtZQorICAgIGkgPSBtc2cucmZpbmQoJy4nLCAwLCBlbmQpCisgICAgaWYgaSA+PSAwOgorICAgICAgICBzdGFydCA9IGkrMQorICAgIHJldHVybiBtc2dbc3RhcnQ6IGVuZF0KKwogY2xhc3MgX091dHB1dFJlZGlyZWN0aW5nUGRiKHBkYi5QZGIpOgogICAgICIiIgogICAgIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgcHl0aG9uIGRlYnVnZ2VyIHRoYXQgcmVkaXJlY3RzIHN0ZG91dApAQCAtNDI0LDcgKzQ1MCw3IEBACiAgICAgICAgIHplcm8tYmFzZWQsIHdpdGggcmVzcGVjdCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBEb2NUZXN0LgogCiAgICAgICAtIGluZGVudDogVGhlIGV4YW1wbGUncyBpbmRlbnRhdGlvbiBpbiB0aGUgRG9jVGVzdCBzdHJpbmcuCi0gICAgICAgIEkuZS4sIHRoZSBudW1iZXIgb2Ygc3BhY2UgY2hhcmFjdGVycyB0aGF0IHByZWNlZWQgdGhlCisgICAgICAgIEkuZS4sIHRoZSBudW1iZXIgb2Ygc3BhY2UgY2hhcmFjdGVycyB0aGF0IHByZWNlZGUgdGhlCiAgICAgICAgIGV4YW1wbGUncyBmaXJzdCBwcm9tcHQuCiAKICAgICAgIC0gb3B0aW9uczogQSBkaWN0aW9uYXJ5IG1hcHBpbmcgZnJvbSBvcHRpb24gZmxhZ3MgdG8gVHJ1ZSBvcgpAQCAtNDUxLDYgKzQ3NywyNSBAQAogICAgICAgICBzZWxmLm9wdGlvbnMgPSBvcHRpb25zCiAgICAgICAgIHNlbGYuZXhjX21zZyA9IGV4Y19tc2cKIAorICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiB0eXBlKHNlbGYpIGlzIG5vdCB0eXBlKG90aGVyKToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorCisgICAgICAgIHJldHVybiBzZWxmLnNvdXJjZSA9PSBvdGhlci5zb3VyY2UgYW5kIFwKKyAgICAgICAgICAgICAgIHNlbGYud2FudCA9PSBvdGhlci53YW50IGFuZCBcCisgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9PSBvdGhlci5saW5lbm8gYW5kIFwKKyAgICAgICAgICAgICAgIHNlbGYuaW5kZW50ID09IG90aGVyLmluZGVudCBhbmQgXAorICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zID09IG90aGVyLm9wdGlvbnMgYW5kIFwKKyAgICAgICAgICAgICAgIHNlbGYuZXhjX21zZyA9PSBvdGhlci5leGNfbXNnCisKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCisKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiBoYXNoKChzZWxmLnNvdXJjZSwgc2VsZi53YW50LCBzZWxmLmxpbmVubywgc2VsZi5pbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLmV4Y19tc2cpKQorCisKIGNsYXNzIERvY1Rlc3Q6CiAgICAgIiIiCiAgICAgQSBjb2xsZWN0aW9uIG9mIGRvY3Rlc3QgZXhhbXBsZXMgdGhhdCBzaG91bGQgYmUgcnVuIGluIGEgc2luZ2xlCkBAIC00OTksNiArNTQ0LDIyIEBACiAgICAgICAgIHJldHVybiAoJzxEb2NUZXN0ICVzIGZyb20gJXM6JXMgKCVzKT4nICUKICAgICAgICAgICAgICAgICAoc2VsZi5uYW1lLCBzZWxmLmZpbGVuYW1lLCBzZWxmLmxpbmVubywgZXhhbXBsZXMpKQogCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIHR5cGUoc2VsZikgaXMgbm90IHR5cGUob3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisKKyAgICAgICAgcmV0dXJuIHNlbGYuZXhhbXBsZXMgPT0gb3RoZXIuZXhhbXBsZXMgYW5kIFwKKyAgICAgICAgICAgICAgIHNlbGYuZG9jc3RyaW5nID09IG90aGVyLmRvY3N0cmluZyBhbmQgXAorICAgICAgICAgICAgICAgc2VsZi5nbG9icyA9PSBvdGhlci5nbG9icyBhbmQgXAorICAgICAgICAgICAgICAgc2VsZi5uYW1lID09IG90aGVyLm5hbWUgYW5kIFwKKyAgICAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUgPT0gb3RoZXIuZmlsZW5hbWUgYW5kIFwKKyAgICAgICAgICAgICAgIHNlbGYubGluZW5vID09IG90aGVyLmxpbmVubworCisgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgorCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gaGFzaCgoc2VsZi5kb2NzdHJpbmcsIHNlbGYubmFtZSwgc2VsZi5maWxlbmFtZSwgc2VsZi5saW5lbm8pKQogCiAgICAgIyBUaGlzIGxldHMgdXMgc29ydCB0ZXN0cyBieSBuYW1lOgogICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKQEAgLTUyOSw3ICs1OTAsNyBAQAogICAgICAgICAjIFdhbnQgY29uc2lzdHMgb2YgYW55IG5vbi1ibGFuayBsaW5lcyB0aGF0IGRvIG5vdCBzdGFydCB3aXRoIFBTMS4KICAgICAgICAgKD9QPHdhbnQ+ICg/Oig/IVsgXSokKSAgICAjIE5vdCBhIGJsYW5rIGxpbmUKICAgICAgICAgICAgICAgICAgICAgICg/IVsgXSo+Pj4pICAjIE5vdCBhIGxpbmUgc3RhcnRpbmcgd2l0aCBQUzEKLSAgICAgICAgICAgICAgICAgICAgIC4qJFxuPyAgICAgICAjIEJ1dCBhbnkgb3RoZXIgbGluZQorICAgICAgICAgICAgICAgICAgICAgLiskXG4/ICAgICAgICMgQnV0IGFueSBvdGhlciBsaW5lCiAgICAgICAgICAgICAgICAgICApKikKICAgICAgICAgJycnLCByZS5NVUxUSUxJTkUgfCByZS5WRVJCT1NFKQogCkBAIC04NjAsNyArOTIxLDcgQEAKICAgICAgICAgaWYgJ19fbmFtZV9fJyBub3QgaW4gZ2xvYnM6CiAgICAgICAgICAgICBnbG9ic1snX19uYW1lX18nXSA9ICdfX21haW5fXycgICMgcHJvdmlkZSBhIGRlZmF1bHQgbW9kdWxlIG5hbWUKIAotICAgICAgICAjIFJlY3Vyc2l2ZWx5IGV4cG9yZSBgb2JqYCwgZXh0cmFjdGluZyBEb2NUZXN0cy4KKyAgICAgICAgIyBSZWN1cnNpdmVseSBleHBsb3JlIGBvYmpgLCBleHRyYWN0aW5nIERvY1Rlc3RzLgogICAgICAgICB0ZXN0cyA9IFtdCiAgICAgICAgIHNlbGYuX2ZpbmQodGVzdHMsIG9iaiwgbmFtZSwgbW9kdWxlLCBzb3VyY2VfbGluZXMsIGdsb2JzLCB7fSkKICAgICAgICAgIyBTb3J0IHRoZSB0ZXN0cyBieSBhbHBoYSBvcmRlciBvZiBuYW1lcywgZm9yIGNvbnNpc3RlbmN5IGluCkBAIC0xMjg4LDEwICsxMzQ5LDkgQEAKIAogICAgICAgICAgICAgICAgICMgQW5vdGhlciBjaGFuY2UgaWYgdGhleSBkaWRuJ3QgY2FyZSBhYm91dCB0aGUgZGV0YWlsLgogICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5vcHRpb25mbGFncyAmIElHTk9SRV9FWENFUFRJT05fREVUQUlMOgotICAgICAgICAgICAgICAgICAgICBtMSA9IHJlLm1hdGNoKHInKD86W146XSpcLik/KFteOl0qOiknLCBleGFtcGxlLmV4Y19tc2cpCi0gICAgICAgICAgICAgICAgICAgIG0yID0gcmUubWF0Y2gocicoPzpbXjpdKlwuKT8oW146XSo6KScsIGV4Y19tc2cpCi0gICAgICAgICAgICAgICAgICAgIGlmIG0xIGFuZCBtMiBhbmQgY2hlY2sobTEuZ3JvdXAoMSksIG0yLmdyb3VwKDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9uZmxhZ3MpOgorICAgICAgICAgICAgICAgICAgICBpZiBjaGVjayhfc3RyaXBfZXhjZXB0aW9uX2RldGFpbHMoZXhhbXBsZS5leGNfbXNnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N0cmlwX2V4Y2VwdGlvbl9kZXRhaWxzKGV4Y19tc2cpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbmZsYWdzKToKICAgICAgICAgICAgICAgICAgICAgICAgIG91dGNvbWUgPSBTVUNDRVNTCiAKICAgICAgICAgICAgICMgUmVwb3J0IHRoZSBvdXRjb21lLgpAQCAtMjI1Miw2ICsyMzEyLDIzIEBACiAgICAgZGVmIGlkKHNlbGYpOgogICAgICAgICByZXR1cm4gc2VsZi5fZHRfdGVzdC5uYW1lCiAKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgdHlwZShzZWxmKSBpcyBub3QgdHlwZShvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKworICAgICAgICByZXR1cm4gc2VsZi5fZHRfdGVzdCA9PSBvdGhlci5fZHRfdGVzdCBhbmQgXAorICAgICAgICAgICAgICAgc2VsZi5fZHRfb3B0aW9uZmxhZ3MgPT0gb3RoZXIuX2R0X29wdGlvbmZsYWdzIGFuZCBcCisgICAgICAgICAgICAgICBzZWxmLl9kdF9zZXRVcCA9PSBvdGhlci5fZHRfc2V0VXAgYW5kIFwKKyAgICAgICAgICAgICAgIHNlbGYuX2R0X3RlYXJEb3duID09IG90aGVyLl9kdF90ZWFyRG93biBhbmQgXAorICAgICAgICAgICAgICAgc2VsZi5fZHRfY2hlY2tlciA9PSBvdGhlci5fZHRfY2hlY2tlcgorCisgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgorCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gaGFzaCgoc2VsZi5fZHRfb3B0aW9uZmxhZ3MsIHNlbGYuX2R0X3NldFVwLCBzZWxmLl9kdF90ZWFyRG93biwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0X2NoZWNrZXIpKQorCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICBuYW1lID0gc2VsZi5fZHRfdGVzdC5uYW1lLnNwbGl0KCcuJykKICAgICAgICAgcmV0dXJuICIlcyAoJXMpIiAlIChuYW1lWy0xXSwgJy4nLmpvaW4obmFtZVs6LTFdKSkKQEAgLTIyNjIsNyArMjMzOSw4IEBACiAgICAgICAgIHJldHVybiAiRG9jdGVzdDogIiArIHNlbGYuX2R0X3Rlc3QubmFtZQogCiBjbGFzcyBTa2lwRG9jVGVzdENhc2UoRG9jVGVzdENhc2UpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlKToKKyAgICAgICAgc2VsZi5tb2R1bGUgPSBtb2R1bGUKICAgICAgICAgRG9jVGVzdENhc2UuX19pbml0X18oc2VsZiwgTm9uZSkKIAogICAgIGRlZiBzZXRVcChzZWxmKToKQEAgLTIyNzIsNyArMjM1MCwxMCBAQAogICAgICAgICBwYXNzCiAKICAgICBkZWYgc2hvcnREZXNjcmlwdGlvbihzZWxmKToKLSAgICAgICAgcmV0dXJuICJTa2lwcGluZyB0ZXN0cyBmcm9tICVzIiAlIG1vZHVsZS5fX25hbWVfXworICAgICAgICByZXR1cm4gIlNraXBwaW5nIHRlc3RzIGZyb20gJXMiICUgc2VsZi5tb2R1bGUuX19uYW1lX18KKworICAgIF9fc3RyX18gPSBzaG9ydERlc2NyaXB0aW9uCisKIAogZGVmIERvY1Rlc3RTdWl0ZShtb2R1bGU9Tm9uZSwgZ2xvYnM9Tm9uZSwgZXh0cmFnbG9icz1Ob25lLCB0ZXN0X2ZpbmRlcj1Ob25lLAogICAgICAgICAgICAgICAgICAqKm9wdGlvbnMpOgpAQCAtMjMyMCwxMiArMjQwMSwxNyBAQAogICAgIGlmIG5vdCB0ZXN0cyBhbmQgc3lzLmZsYWdzLm9wdGltaXplID49MjoKICAgICAgICAgIyBTa2lwIGRvY3Rlc3RzIHdoZW4gcnVubmluZyB3aXRoIC1PMgogICAgICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCi0gICAgICAgIHN1aXRlLmFkZFRlc3QoU2tpcERvY1Rlc3RDYXNlKCkpCisgICAgICAgIHN1aXRlLmFkZFRlc3QoU2tpcERvY1Rlc3RDYXNlKG1vZHVsZSkpCiAgICAgICAgIHJldHVybiBzdWl0ZQogICAgIGVsaWYgbm90IHRlc3RzOgogICAgICAgICAjIFdoeSBkbyB3ZSB3YW50IHRvIGRvIHRoaXM/IEJlY2F1c2UgaXQgcmV2ZWFscyBhIGJ1ZyB0aGF0IG1pZ2h0CiAgICAgICAgICMgb3RoZXJ3aXNlIGJlIGhpZGRlbi4KLSAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihtb2R1bGUsICJoYXMgbm8gdGVzdHMiKQorICAgICAgICAjIEl0IGlzIHByb2JhYmx5IGEgYnVnIHRoYXQgdGhpcyBleGNlcHRpb24gaXMgbm90IGFsc28gcmFpc2VkIGlmIHRoZQorICAgICAgICAjIG51bWJlciBvZiBkb2N0ZXN0IGV4YW1wbGVzIGluIHRlc3RzIGlzIHplcm8gKGkuZS4gaWYgbm8gZG9jdGVzdAorICAgICAgICAjIGV4YW1wbGVzIHdlcmUgZm91bmQpLiAgSG93ZXZlciwgd2Ugc2hvdWxkIHByb2JhYmx5IG5vdCBiZSByYWlzaW5nCisgICAgICAgICMgYW4gZXhjZXB0aW9uIGF0IGFsbCBoZXJlLCB0aG91Z2ggaXQgaXMgdG9vIGxhdGUgdG8gbWFrZSB0aGlzIGNoYW5nZQorICAgICAgICAjIGZvciBhIG1haW50ZW5hbmNlIHJlbGVhc2UuICBTZWUgYWxzbyBpc3N1ZSAjMTQ2NDkuCisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobW9kdWxlLCAiaGFzIG5vIGRvY3N0cmluZ3MiKQogCiAgICAgdGVzdHMuc29ydCgpCiAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQpkaWZmIC0tZ2l0IGEvTGliL2R1bWJkYm0ucHkgYi9MaWIvZHVtYmRibS5weQppbmRleCBmYjU0YTkzLi40YTBjM2E3IDEwMDY0NAotLS0gYS9MaWIvZHVtYmRibS5weQorKysgYi9MaWIvZHVtYmRibS5weQpAQCAtNjgsOSArNjgsMTAgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgZiA9IF9vcGVuKHNlbGYuX2RhdGZpbGUsICdyJykKICAgICAgICAgZXhjZXB0IElPRXJyb3I6Ci0gICAgICAgICAgICBmID0gX29wZW4oc2VsZi5fZGF0ZmlsZSwgJ3cnKQotICAgICAgICAgICAgc2VsZi5fY2htb2Qoc2VsZi5fZGF0ZmlsZSkKLSAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICB3aXRoIF9vcGVuKHNlbGYuX2RhdGZpbGUsICd3JykgYXMgZjoKKyAgICAgICAgICAgICAgICBzZWxmLl9jaG1vZChzZWxmLl9kYXRmaWxlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgIHNlbGYuX3VwZGF0ZSgpCiAKICAgICAjIFJlYWQgZGlyZWN0b3J5IGZpbGUgaW50byB0aGUgaW4tbWVtb3J5IGluZGV4IGRpY3QuCkBAIC04MSwxMSArODIsMTEgQEAKICAgICAgICAgZXhjZXB0IElPRXJyb3I6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBmb3IgbGluZSBpbiBmOgotICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnJzdHJpcCgpCi0gICAgICAgICAgICAgICAga2V5LCBwb3NfYW5kX3Npel9wYWlyID0gZXZhbChsaW5lKQotICAgICAgICAgICAgICAgIHNlbGYuX2luZGV4W2tleV0gPSBwb3NfYW5kX3Npel9wYWlyCi0gICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHdpdGggZjoKKyAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBmOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5yc3RyaXAoKQorICAgICAgICAgICAgICAgICAgICBrZXksIHBvc19hbmRfc2l6X3BhaXIgPSBldmFsKGxpbmUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2luZGV4W2tleV0gPSBwb3NfYW5kX3Npel9wYWlyCiAKICAgICAjIFdyaXRlIHRoZSBpbmRleCBkaWN0IHRvIHRoZSBkaXJlY3RvcnkgZmlsZS4gIFRoZSBvcmlnaW5hbCBkaXJlY3RvcnkKICAgICAjIGZpbGUgKGlmIGFueSkgaXMgcmVuYW1lZCB3aXRoIGEgLmJhayBleHRlbnNpb24gZmlyc3QuICBJZiBhIC5iYWsKQEAgLTEwNywyMCArMTA4LDE4IEBACiAgICAgICAgIGV4Y2VwdCBzZWxmLl9vcy5lcnJvcjoKICAgICAgICAgICAgIHBhc3MKIAotICAgICAgICBmID0gc2VsZi5fb3BlbihzZWxmLl9kaXJmaWxlLCAndycpCi0gICAgICAgIHNlbGYuX2NobW9kKHNlbGYuX2RpcmZpbGUpCi0gICAgICAgIGZvciBrZXksIHBvc19hbmRfc2l6X3BhaXIgaW4gc2VsZi5faW5kZXguaXRlcml0ZW1zKCk6Ci0gICAgICAgICAgICBmLndyaXRlKCIlciwgJXJcbiIgJSAoa2V5LCBwb3NfYW5kX3Npel9wYWlyKSkKLSAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHdpdGggc2VsZi5fb3BlbihzZWxmLl9kaXJmaWxlLCAndycpIGFzIGY6CisgICAgICAgICAgICBzZWxmLl9jaG1vZChzZWxmLl9kaXJmaWxlKQorICAgICAgICAgICAgZm9yIGtleSwgcG9zX2FuZF9zaXpfcGFpciBpbiBzZWxmLl9pbmRleC5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgICAgICBmLndyaXRlKCIlciwgJXJcbiIgJSAoa2V5LCBwb3NfYW5kX3Npel9wYWlyKSkKIAogICAgIHN5bmMgPSBfY29tbWl0CiAKICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICAgcG9zLCBzaXogPSBzZWxmLl9pbmRleFtrZXldICAgICAjIG1heSByYWlzZSBLZXlFcnJvcgotICAgICAgICBmID0gX29wZW4oc2VsZi5fZGF0ZmlsZSwgJ3JiJykKLSAgICAgICAgZi5zZWVrKHBvcykKLSAgICAgICAgZGF0ID0gZi5yZWFkKHNpeikKLSAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHdpdGggX29wZW4oc2VsZi5fZGF0ZmlsZSwgJ3JiJykgYXMgZjoKKyAgICAgICAgICAgIGYuc2Vlayhwb3MpCisgICAgICAgICAgICBkYXQgPSBmLnJlYWQoc2l6KQogICAgICAgICByZXR1cm4gZGF0CiAKICAgICAjIEFwcGVuZCB2YWwgdG8gdGhlIGRhdGEgZmlsZSwgc3RhcnRpbmcgYXQgYSBfQkxPQ0tTSVpFLWFsaWduZWQKQEAgLTEyOCwxNCArMTI3LDEzIEBACiAgICAgIyB0byBnZXQgdG8gYW4gYWxpZ25lZCBvZmZzZXQuICBSZXR1cm4gcGFpcgogICAgICMgICAgIChzdGFydGluZyBvZmZzZXQgb2YgdmFsLCBsZW4odmFsKSkKICAgICBkZWYgX2FkZHZhbChzZWxmLCB2YWwpOgotICAgICAgICBmID0gX29wZW4oc2VsZi5fZGF0ZmlsZSwgJ3JiKycpCi0gICAgICAgIGYuc2VlaygwLCAyKQotICAgICAgICBwb3MgPSBpbnQoZi50ZWxsKCkpCi0gICAgICAgIG5wb3MgPSAoKHBvcyArIF9CTE9DS1NJWkUgLSAxKSAvLyBfQkxPQ0tTSVpFKSAqIF9CTE9DS1NJWkUKLSAgICAgICAgZi53cml0ZSgnXDAnKihucG9zLXBvcykpCi0gICAgICAgIHBvcyA9IG5wb3MKLSAgICAgICAgZi53cml0ZSh2YWwpCi0gICAgICAgIGYuY2xvc2UoKQorICAgICAgICB3aXRoIF9vcGVuKHNlbGYuX2RhdGZpbGUsICdyYisnKSBhcyBmOgorICAgICAgICAgICAgZi5zZWVrKDAsIDIpCisgICAgICAgICAgICBwb3MgPSBpbnQoZi50ZWxsKCkpCisgICAgICAgICAgICBucG9zID0gKChwb3MgKyBfQkxPQ0tTSVpFIC0gMSkgLy8gX0JMT0NLU0laRSkgKiBfQkxPQ0tTSVpFCisgICAgICAgICAgICBmLndyaXRlKCdcMCcqKG5wb3MtcG9zKSkKKyAgICAgICAgICAgIHBvcyA9IG5wb3MKKyAgICAgICAgICAgIGYud3JpdGUodmFsKQogICAgICAgICByZXR1cm4gKHBvcywgbGVuKHZhbCkpCiAKICAgICAjIFdyaXRlIHZhbCB0byB0aGUgZGF0YSBmaWxlLCBzdGFydGluZyBhdCBvZmZzZXQgcG9zLiAgVGhlIGNhbGxlcgpAQCAtMTQzLDEwICsxNDEsOSBAQAogICAgICMgcG9zIHRvIGhvbGQgdmFsLCB3aXRob3V0IG92ZXJ3cml0aW5nIHNvbWUgb3RoZXIgdmFsdWUuICBSZXR1cm4KICAgICAjIHBhaXIgKHBvcywgbGVuKHZhbCkpLgogICAgIGRlZiBfc2V0dmFsKHNlbGYsIHBvcywgdmFsKToKLSAgICAgICAgZiA9IF9vcGVuKHNlbGYuX2RhdGZpbGUsICdyYisnKQotICAgICAgICBmLnNlZWsocG9zKQotICAgICAgICBmLndyaXRlKHZhbCkKLSAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHdpdGggX29wZW4oc2VsZi5fZGF0ZmlsZSwgJ3JiKycpIGFzIGY6CisgICAgICAgICAgICBmLnNlZWsocG9zKQorICAgICAgICAgICAgZi53cml0ZSh2YWwpCiAgICAgICAgIHJldHVybiAocG9zLCBsZW4odmFsKSkKIAogICAgICMga2V5IGlzIGEgbmV3IGtleSB3aG9zZSBhc3NvY2lhdGVkIHZhbHVlIHN0YXJ0cyBpbiB0aGUgZGF0YSBmaWxlCkBAIC0xNTQsMTAgKzE1MSw5IEBACiAgICAgIyB0aGUgaW4tbWVtb3J5IGluZGV4IGRpY3QsIGFuZCBhcHBlbmQgb25lIHRvIHRoZSBkaXJlY3RvcnkgZmlsZS4KICAgICBkZWYgX2FkZGtleShzZWxmLCBrZXksIHBvc19hbmRfc2l6X3BhaXIpOgogICAgICAgICBzZWxmLl9pbmRleFtrZXldID0gcG9zX2FuZF9zaXpfcGFpcgotICAgICAgICBmID0gX29wZW4oc2VsZi5fZGlyZmlsZSwgJ2EnKQotICAgICAgICBzZWxmLl9jaG1vZChzZWxmLl9kaXJmaWxlKQotICAgICAgICBmLndyaXRlKCIlciwgJXJcbiIgJSAoa2V5LCBwb3NfYW5kX3Npel9wYWlyKSkKLSAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHdpdGggX29wZW4oc2VsZi5fZGlyZmlsZSwgJ2EnKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5fY2htb2Qoc2VsZi5fZGlyZmlsZSkKKyAgICAgICAgICAgIGYud3JpdGUoIiVyLCAlclxuIiAlIChrZXksIHBvc19hbmRfc2l6X3BhaXIpKQogCiAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsKToKICAgICAgICAgaWYgbm90IHR5cGUoa2V5KSA9PSB0eXBlKCcnKSA9PSB0eXBlKHZhbCk6CmRpZmYgLS1naXQgYS9MaWIvZW1haWwvX3BhcnNlYWRkci5weSBiL0xpYi9lbWFpbC9fcGFyc2VhZGRyLnB5CmluZGV4IDNiZDRiYTQuLjY5MGRiMmMgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9fcGFyc2VhZGRyLnB5CisrKyBiL0xpYi9lbWFpbC9fcGFyc2VhZGRyLnB5CkBAIC0xMyw3ICsxMyw3IEBACiAgICAgJ3F1b3RlJywKICAgICBdCiAKLWltcG9ydCB0aW1lCitpbXBvcnQgdGltZSwgY2FsZW5kYXIKIAogU1BBQ0UgPSAnICcKIEVNUFRZU1RSSU5HID0gJycKQEAgLTE1MCwxMyArMTUwLDEzIEBACiAKIAogZGVmIG1rdGltZV90eihkYXRhKToKLSAgICAiIiJUdXJuIGEgMTAtdHVwbGUgYXMgcmV0dXJuZWQgYnkgcGFyc2VkYXRlX3R6KCkgaW50byBhIFVUQyB0aW1lc3RhbXAuIiIiCisgICAgIiIiVHVybiBhIDEwLXR1cGxlIGFzIHJldHVybmVkIGJ5IHBhcnNlZGF0ZV90eigpIGludG8gYSBQT1NJWCB0aW1lc3RhbXAuIiIiCiAgICAgaWYgZGF0YVs5XSBpcyBOb25lOgogICAgICAgICAjIE5vIHpvbmUgaW5mbywgc28gbG9jYWx0aW1lIGlzIGJldHRlciBhc3N1bXB0aW9uIHRoYW4gR01UCiAgICAgICAgIHJldHVybiB0aW1lLm1rdGltZShkYXRhWzo4XSArICgtMSwpKQogICAgIGVsc2U6Ci0gICAgICAgIHQgPSB0aW1lLm1rdGltZShkYXRhWzo4XSArICgwLCkpCi0gICAgICAgIHJldHVybiB0IC0gZGF0YVs5XSAtIHRpbWUudGltZXpvbmUKKyAgICAgICAgdCA9IGNhbGVuZGFyLnRpbWVnbShkYXRhKQorICAgICAgICByZXR1cm4gdCAtIGRhdGFbOV0KIAogCiBkZWYgcXVvdGUoc3RyKToKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9iYXNlNjRtaW1lLnB5IGIvTGliL2VtYWlsL2Jhc2U2NG1pbWUucHkKaW5kZXggODgwNDQyNy4uNGFhODAwMCAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL2Jhc2U2NG1pbWUucHkKKysrIGIvTGliL2VtYWlsL2Jhc2U2NG1pbWUucHkKQEAgLTEzMCw3ICsxMzAsNyBAQAogICAgIHZlcmJhdGltICh0aGlzIGlzIHRoZSBkZWZhdWx0KS4KIAogICAgIEVhY2ggbGluZSBvZiBlbmNvZGVkIHRleHQgd2lsbCBlbmQgd2l0aCBlb2wsIHdoaWNoIGRlZmF1bHRzIHRvICJcXG4iLiAgU2V0Ci0gICAgdGhpcyB0byAiXHJcbiIgaWYgeW91IHdpbGwgYmUgdXNpbmcgdGhlIHJlc3VsdCBvZiB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5CisgICAgdGhpcyB0byAiXFxyXFxuIiBpZiB5b3Ugd2lsbCBiZSB1c2luZyB0aGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkKICAgICBpbiBhbiBlbWFpbC4KICAgICAiIiIKICAgICBpZiBub3QgczoKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9jaGFyc2V0LnB5IGIvTGliL2VtYWlsL2NoYXJzZXQucHkKaW5kZXggZGRkYWE3Ni4uMzBhMTNmZiAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL2NoYXJzZXQucHkKKysrIGIvTGliL2VtYWlsL2NoYXJzZXQucHkKQEAgLTE4Myw3ICsxODMsNyBAQAogICAgICAgICAgICAgICAgICAgIGhlYWRlciBlbmNvZGluZy4gIENoYXJzZXQuU0hPUlRFU1QgaXMgbm90IGFsbG93ZWQgZm9yCiAgICAgICAgICAgICAgICAgICAgYm9keV9lbmNvZGluZy4KIAotICAgIG91dHB1dF9jaGFyc2V0OiBTb21lIGNoYXJhY3RlciBzZXRzIG11c3QgYmUgY29udmVydGVkIGJlZm9yZSB0aGUgY2FuIGJlCisgICAgb3V0cHV0X2NoYXJzZXQ6IFNvbWUgY2hhcmFjdGVyIHNldHMgbXVzdCBiZSBjb252ZXJ0ZWQgYmVmb3JlIHRoZXkgY2FuIGJlCiAgICAgICAgICAgICAgICAgICAgIHVzZWQgaW4gZW1haWwgaGVhZGVycyBvciBib2RpZXMuICBJZiB0aGUgaW5wdXRfY2hhcnNldCBpcwogICAgICAgICAgICAgICAgICAgICBvbmUgb2YgdGhlbSwgdGhpcyBhdHRyaWJ1dGUgd2lsbCBjb250YWluIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICAgICAgICAgICBjaGFyc2V0IG91dHB1dCB3aWxsIGJlIGNvbnZlcnRlZCB0by4gIE90aGVyd2lzZSwgaXQgd2lsbApkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL2ZlZWRwYXJzZXIucHkgYi9MaWIvZW1haWwvZmVlZHBhcnNlci5weQppbmRleCA1ZmYyNjZmLi4xNWRiMjZkIDEwMDY0NAotLS0gYS9MaWIvZW1haWwvZmVlZHBhcnNlci5weQorKysgYi9MaWIvZW1haWwvZmVlZHBhcnNlci5weQpAQCAtMTMsNyArMTMsNyBAQAogZGF0YS4gIFdoZW4geW91IGhhdmUgbm8gbW9yZSBkYXRhIHRvIHB1c2ggaW50byB0aGUgcGFyc2VyLCBjYWxsIC5jbG9zZSgpLgogVGhpcyBjb21wbGV0ZXMgdGhlIHBhcnNpbmcgYW5kIHJldHVybnMgdGhlIHJvb3QgbWVzc2FnZSBvYmplY3QuCiAKLVRoZSBvdGhlciBhZHZhbnRhZ2Ugb2YgdGhpcyBwYXJzZXIgaXMgdGhhdCBpdCB3aWxsIG5ldmVyIHRocm93IGEgcGFyc2luZworVGhlIG90aGVyIGFkdmFudGFnZSBvZiB0aGlzIHBhcnNlciBpcyB0aGF0IGl0IHdpbGwgbmV2ZXIgcmFpc2UgYSBwYXJzaW5nCiBleGNlcHRpb24uICBJbnN0ZWFkLCB3aGVuIGl0IGZpbmRzIHNvbWV0aGluZyB1bmV4cGVjdGVkLCBpdCBhZGRzIGEgJ2RlZmVjdCcgdG8KIHRoZSBjdXJyZW50IG1lc3NhZ2UuICBEZWZlY3RzIGFyZSBqdXN0IGluc3RhbmNlcyB0aGF0IGxpdmUgb24gdGhlIG1lc3NhZ2UKIG9iamVjdCdzIC5kZWZlY3RzIGF0dHJpYnV0ZS4KQEAgLTIxNCw3ICsyMTQsNyBAQAogICAgICAgICAjIHN1cHBvc2VkIHRvIHNlZSBpbiB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZS4KICAgICAgICAgc2VsZi5fcGFyc2VfaGVhZGVycyhoZWFkZXJzKQogICAgICAgICAjIEhlYWRlcnMtb25seSBwYXJzaW5nIGlzIGEgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaGFjaywgd2hpY2ggd2FzCi0gICAgICAgICMgbmVjZXNzYXJ5IGluIHRoZSBvbGRlciBwYXJzZXIsIHdoaWNoIGNvdWxkIHRocm93IGVycm9ycy4gIEFsbAorICAgICAgICAjIG5lY2Vzc2FyeSBpbiB0aGUgb2xkZXIgcGFyc2VyLCB3aGljaCBjb3VsZCByYWlzZSBlcnJvcnMuICBBbGwKICAgICAgICAgIyByZW1haW5pbmcgbGluZXMgaW4gdGhlIGlucHV0IGFyZSB0aHJvd24gaW50byB0aGUgbWVzc2FnZSBib2R5LgogICAgICAgICBpZiBzZWxmLl9oZWFkZXJzb25seToKICAgICAgICAgICAgIGxpbmVzID0gW10KZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9nZW5lcmF0b3IucHkgYi9MaWIvZW1haWwvZ2VuZXJhdG9yLnB5CmluZGV4IGViNzEwNDQuLmU1MGY5MTIgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9nZW5lcmF0b3IucHkKKysrIGIvTGliL2VtYWlsL2dlbmVyYXRvci5weQpAQCAtMjEyLDcgKzIxMiwxMSBAQAogICAgICAgICAgICAgbXNnLnNldF9ib3VuZGFyeShib3VuZGFyeSkKICAgICAgICAgIyBJZiB0aGVyZSdzIGEgcHJlYW1ibGUsIHdyaXRlIGl0IG91dCwgd2l0aCBhIHRyYWlsaW5nIENSTEYKICAgICAgICAgaWYgbXNnLnByZWFtYmxlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5fZnAsIG1zZy5wcmVhbWJsZQorICAgICAgICAgICAgaWYgc2VsZi5fbWFuZ2xlX2Zyb21fOgorICAgICAgICAgICAgICAgIHByZWFtYmxlID0gZmNyZS5zdWIoJz5Gcm9tICcsIG1zZy5wcmVhbWJsZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJlYW1ibGUgPSBtc2cucHJlYW1ibGUKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuX2ZwLCBwcmVhbWJsZQogICAgICAgICAjIGRhc2gtYm91bmRhcnkgdHJhbnNwb3J0LXBhZGRpbmcgQ1JMRgogICAgICAgICBwcmludCA+PiBzZWxmLl9mcCwgJy0tJyArIGJvdW5kYXJ5CiAgICAgICAgICMgYm9keS1wYXJ0CkBAIC0yMjcsMTAgKzIzMSwxMyBAQAogICAgICAgICAgICAgIyBib2R5LXBhcnQKICAgICAgICAgICAgIHNlbGYuX2ZwLndyaXRlKGJvZHlfcGFydCkKICAgICAgICAgIyBjbG9zZS1kZWxpbWl0ZXIgdHJhbnNwb3J0LXBhZGRpbmcKLSAgICAgICAgc2VsZi5fZnAud3JpdGUoJ1xuLS0nICsgYm91bmRhcnkgKyAnLS0nKQorICAgICAgICBzZWxmLl9mcC53cml0ZSgnXG4tLScgKyBib3VuZGFyeSArICctLScgKyBOTCkKICAgICAgICAgaWYgbXNnLmVwaWxvZ3VlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5fZnAKLSAgICAgICAgICAgIHNlbGYuX2ZwLndyaXRlKG1zZy5lcGlsb2d1ZSkKKyAgICAgICAgICAgIGlmIHNlbGYuX21hbmdsZV9mcm9tXzoKKyAgICAgICAgICAgICAgICBlcGlsb2d1ZSA9IGZjcmUuc3ViKCc+RnJvbSAnLCBtc2cuZXBpbG9ndWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVwaWxvZ3VlID0gbXNnLmVwaWxvZ3VlCisgICAgICAgICAgICBzZWxmLl9mcC53cml0ZShlcGlsb2d1ZSkKIAogICAgIGRlZiBfaGFuZGxlX211bHRpcGFydF9zaWduZWQoc2VsZiwgbXNnKToKICAgICAgICAgIyBUaGUgY29udGVudHMgb2Ygc2lnbmVkIHBhcnRzIGhhcyB0byBzdGF5IHVubW9kaWZpZWQgaW4gb3JkZXIgdG8ga2VlcApkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDIudHh0IGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDIudHh0CmluZGV4IDQzZjI0ODAuLjVkMGE3ZTEgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzAyLnR4dAorKysgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18wMi50eHQKQEAgLTExOSw2ICsxMTksNyBAQAogCiAKIC0tX18tLV9fLS0tLQorCiAtLTE5Mi4xNjguMS4yLjg4OS4zMjYxNC45ODc4MTIyNTUuNTAwLjIxODE0CiBDb250ZW50LXR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkKIENvbnRlbnQtZGVzY3JpcHRpb246IERpZ2VzdCBGb290ZXIKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWwucHkgYi9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsLnB5CmluZGV4IDVjOWE3MjUuLmM0YTkwZDggMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWwucHkKKysrIGIvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbC5weQpAQCAtOSw2ICs5LDcgQEAKIGltcG9ydCBkaWZmbGliCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB3YXJuaW5ncworaW1wb3J0IHRleHR3cmFwCiBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KIAogaW1wb3J0IGVtYWlsCkBAIC0yNjYsMTIgKzI2NywxMiBAQAogICAgICAgICBtc2dbJ0Zyb20nXSA9ICdNZScKICAgICAgICAgbXNnWyd0byddID0gJ1lvdScKICAgICAgICAgIyBDaGVjayBmb3IgY2FzZSBpbnNlbnNpdGl2aXR5Ci0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnZnJvbScgaW4gbXNnKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoJ0Zyb20nIGluIG1zZykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdGUk9NJyBpbiBtc2cpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgndG8nIGluIG1zZykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdUbycgaW4gbXNnKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoJ1RPJyBpbiBtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2Zyb20nLCBtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ0Zyb20nLCBtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ0ZST00nLCBtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3RvJywgbXNnKQorICAgICAgICBzZWxmLmFzc2VydEluKCdUbycsIG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignVE8nLCBtc2cpCiAKICAgICBkZWYgdGVzdF9hc19zdHJpbmcoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbApAQCAtOTQ4LDYgKzk0OSwyOCBAQAogQmxhaCBibGFoIGJsYWgKICIiIikKIAorICAgIGRlZiB0ZXN0X21hbmdsZV9mcm9tX2luX3ByZWFtYmxlX2FuZF9lcGlsb2coc2VsZik6CisgICAgICAgIHMgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3IocywgbWFuZ2xlX2Zyb21fPVRydWUpCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcodGV4dHdyYXAuZGVkZW50KCIiIlwKKyAgICAgICAgICAgIEZyb206IGZvb0BiYXIuY29tCisgICAgICAgICAgICBNaW1lLVZlcnNpb246IDEuMAorICAgICAgICAgICAgQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PVhYWAorCisgICAgICAgICAgICBGcm9tIHNvbWV3aGVyZSB1bmtub3duCisKKyAgICAgICAgICAgIC0tWFhYCisgICAgICAgICAgICBDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KKworICAgICAgICAgICAgZm9vCisKKyAgICAgICAgICAgIC0tWFhYLS0KKworICAgICAgICAgICAgRnJvbSBzb21ld2hlcmUgdW5rbm93YWJsZQorICAgICAgICAgICAgIiIiKSkKKyAgICAgICAgZy5mbGF0dGVuKG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oWzEgZm9yIHggaW4gcy5nZXR2YWx1ZSgpLnNwbGl0KCdcbicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgeC5zdGFydHN3aXRoKCc+RnJvbSAnKV0pLCAyKQogCiAKICMgVGVzdCB0aGUgYmFzaWMgTUlNRUF1ZGlvIGNsYXNzCkBAIC05NzksNyArMTAwMiw2IEBACiAKICAgICBkZWYgdGVzdF9hZGRfaGVhZGVyKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKLSAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIHNlbGYuX2F1LmFkZF9oZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9J2F1ZGlvdGVzdC5hdScpCiAgICAgICAgIGVxKHNlbGYuX2F1Wydjb250ZW50LWRpc3Bvc2l0aW9uJ10sCkBAIC05OTAsMTIgKzEwMTIsMTIgQEAKICAgICAgICAgICAgJ2F1ZGlvdGVzdC5hdScpCiAgICAgICAgIG1pc3NpbmcgPSBbXQogICAgICAgICBlcShzZWxmLl9hdS5nZXRfcGFyYW0oJ2F0dGFjaG1lbnQnLCBoZWFkZXI9J2NvbnRlbnQtZGlzcG9zaXRpb24nKSwgJycpCi0gICAgICAgIHVubGVzcyhzZWxmLl9hdS5nZXRfcGFyYW0oJ2ZvbycsIGZhaWxvYmo9bWlzc2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXI9J2NvbnRlbnQtZGlzcG9zaXRpb24nKSBpcyBtaXNzaW5nKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYuX2F1LmdldF9wYXJhbSgnZm9vJywgZmFpbG9iaj1taXNzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXI9J2NvbnRlbnQtZGlzcG9zaXRpb24nKSwgbWlzc2luZykKICAgICAgICAgIyBUcnkgc29tZSBtaXNzaW5nIHN0dWZmCi0gICAgICAgIHVubGVzcyhzZWxmLl9hdS5nZXRfcGFyYW0oJ2Zvb2JhcicsIG1pc3NpbmcpIGlzIG1pc3NpbmcpCi0gICAgICAgIHVubGVzcyhzZWxmLl9hdS5nZXRfcGFyYW0oJ2F0dGFjaG1lbnQnLCBtaXNzaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcj0nZm9vYmFyJykgaXMgbWlzc2luZykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLl9hdS5nZXRfcGFyYW0oJ2Zvb2JhcicsIG1pc3NpbmcpLCBtaXNzaW5nKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYuX2F1LmdldF9wYXJhbSgnYXR0YWNobWVudCcsIG1pc3NpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcj0nZm9vYmFyJyksIG1pc3NpbmcpCiAKIAogCkBAIC0xMDIyLDcgKzEwNDQsNiBAQAogCiAgICAgZGVmIHRlc3RfYWRkX2hlYWRlcihzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCi0gICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICBzZWxmLl9pbS5hZGRfaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPSdkaW5ndXNmaXNoLmdpZicpCiAgICAgICAgIGVxKHNlbGYuX2ltWydjb250ZW50LWRpc3Bvc2l0aW9uJ10sCkBAIC0xMDMzLDEyICsxMDU0LDEyIEBACiAgICAgICAgICAgICdkaW5ndXNmaXNoLmdpZicpCiAgICAgICAgIG1pc3NpbmcgPSBbXQogICAgICAgICBlcShzZWxmLl9pbS5nZXRfcGFyYW0oJ2F0dGFjaG1lbnQnLCBoZWFkZXI9J2NvbnRlbnQtZGlzcG9zaXRpb24nKSwgJycpCi0gICAgICAgIHVubGVzcyhzZWxmLl9pbS5nZXRfcGFyYW0oJ2ZvbycsIGZhaWxvYmo9bWlzc2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXI9J2NvbnRlbnQtZGlzcG9zaXRpb24nKSBpcyBtaXNzaW5nKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYuX2ltLmdldF9wYXJhbSgnZm9vJywgZmFpbG9iaj1taXNzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXI9J2NvbnRlbnQtZGlzcG9zaXRpb24nKSwgbWlzc2luZykKICAgICAgICAgIyBUcnkgc29tZSBtaXNzaW5nIHN0dWZmCi0gICAgICAgIHVubGVzcyhzZWxmLl9pbS5nZXRfcGFyYW0oJ2Zvb2JhcicsIG1pc3NpbmcpIGlzIG1pc3NpbmcpCi0gICAgICAgIHVubGVzcyhzZWxmLl9pbS5nZXRfcGFyYW0oJ2F0dGFjaG1lbnQnLCBtaXNzaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcj0nZm9vYmFyJykgaXMgbWlzc2luZykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLl9pbS5nZXRfcGFyYW0oJ2Zvb2JhcicsIG1pc3NpbmcpLCBtaXNzaW5nKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYuX2ltLmdldF9wYXJhbSgnYXR0YWNobWVudCcsIG1pc3NpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcj0nZm9vYmFyJyksIG1pc3NpbmcpCiAKIAogCkBAIC0xMDQ5LDE3ICsxMDcwLDE2IEBACiAKICAgICBkZWYgdGVzdF90eXBlcyhzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCi0gICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICBlcShzZWxmLl9tc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCiAgICAgICAgIGVxKHNlbGYuX21zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnKSwgJ3VzLWFzY2lpJykKICAgICAgICAgbWlzc2luZyA9IFtdCi0gICAgICAgIHVubGVzcyhzZWxmLl9tc2cuZ2V0X3BhcmFtKCdmb29iYXInLCBtaXNzaW5nKSBpcyBtaXNzaW5nKQotICAgICAgICB1bmxlc3Moc2VsZi5fbXNnLmdldF9wYXJhbSgnY2hhcnNldCcsIG1pc3NpbmcsIGhlYWRlcj0nZm9vYmFyJykKLSAgICAgICAgICAgICAgIGlzIG1pc3NpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5fbXNnLmdldF9wYXJhbSgnZm9vYmFyJywgbWlzc2luZyksIG1pc3NpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5fbXNnLmdldF9wYXJhbSgnY2hhcnNldCcsIG1pc3NpbmcsIGhlYWRlcj0nZm9vYmFyJyksCisgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZykKIAogICAgIGRlZiB0ZXN0X3BheWxvYWQoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fbXNnLmdldF9wYXlsb2FkKCksICdoZWxsbyB0aGVyZScpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgc2VsZi5fbXNnLmlzX211bHRpcGFydCgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuX21zZy5pc19tdWx0aXBhcnQoKSkKIAogICAgIGRlZiB0ZXN0X2NoYXJzZXQoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbApAQCAtMTA3OCw3ICsxMDk4LDcgQEAKICAgICAgICAgbXNnID0gTUlNRVRleHQodSdoZWxsbyB0aGVyZScpCiAgICAgICAgIGVxKG1zZy5nZXRfY2hhcnNldCgpLCAndXMtYXNjaWknKQogICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiJykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdoZWxsbyB0aGVyZScgaW4gbXNnLmFzX3N0cmluZygpKQorICAgICAgICBzZWxmLmFzc2VydEluKCdoZWxsbyB0aGVyZScsIG1zZy5hc19zdHJpbmcoKSkKIAogICAgIGRlZiB0ZXN0XzhiaXRfdW5pY29kZV9pbnB1dChzZWxmKToKICAgICAgICAgdGVzdHN0ciA9IHUnXHUwNDNhXHUwNDM4XHUwNDQwXHUwNDM4XHUwNDNiXHUwNDM4XHUwNDQ2XHUwNDMwJwpAQCAtMTEzOSwyMSArMTE1OSwyMCBAQAogICAgIGRlZiB0ZXN0X2hpZXJhcmNoeShzZWxmKToKICAgICAgICAgIyBjb252ZW5pZW5jZQogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKLSAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIHJhaXNlcyA9IHNlbGYuYXNzZXJ0UmFpc2VzCiAgICAgICAgICMgdGVzdHMKICAgICAgICAgbSA9IHNlbGYuX21zZwotICAgICAgICB1bmxlc3MobS5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG0uaXNfbXVsdGlwYXJ0KCkpCiAgICAgICAgIGVxKG0uZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L21peGVkJykKICAgICAgICAgZXEobGVuKG0uZ2V0X3BheWxvYWQoKSksIDIpCiAgICAgICAgIHJhaXNlcyhJbmRleEVycm9yLCBtLmdldF9wYXlsb2FkLCAyKQogICAgICAgICBtMCA9IG0uZ2V0X3BheWxvYWQoMCkKICAgICAgICAgbTEgPSBtLmdldF9wYXlsb2FkKDEpCi0gICAgICAgIHVubGVzcyhtMCBpcyBzZWxmLl90eHQpCi0gICAgICAgIHVubGVzcyhtMSBpcyBzZWxmLl9pbSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhtMCwgc2VsZi5fdHh0KQorICAgICAgICBzZWxmLmFzc2VydElzKG0xLCBzZWxmLl9pbSkKICAgICAgICAgZXEobS5nZXRfcGF5bG9hZCgpLCBbbTAsIG0xXSkKLSAgICAgICAgdW5sZXNzKG5vdCBtMC5pc19tdWx0aXBhcnQoKSkKLSAgICAgICAgdW5sZXNzKG5vdCBtMS5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtMC5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtMS5pc19tdWx0aXBhcnQoKSkKIAogICAgIGRlZiB0ZXN0X2VtcHR5X211bHRpcGFydF9pZGVtcG90ZW50KHNlbGYpOgogICAgICAgICB0ZXh0ID0gIiIiXApAQCAtMTE4Nyw3ICsxMjA2LDggQEAKIAogLS1CT1VOREFSWQogCi0tLUJPVU5EQVJZLS0nJycpCistLUJPVU5EQVJZLS0KKycnJykKIAogICAgIGRlZiB0ZXN0X25vX3BhcnRzX2luX2FfbXVsdGlwYXJ0X3dpdGhfZW1wdHlfZXBpbG9ndWUoc2VsZik6CiAgICAgICAgIG91dGVyID0gTUlNRUJhc2UoJ211bHRpcGFydCcsICdtaXhlZCcpCkBAIC0xMjMyLDcgKzEyNTIsOCBAQAogQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAogCiBoZWxsbyB3b3JsZAotLS1CT1VOREFSWS0tJycnKQorLS1CT1VOREFSWS0tCisnJycpCiAKICAgICBkZWYgdGVzdF9zZXFfcGFydHNfaW5fYV9tdWx0aXBhcnRfd2l0aF9lbXB0eV9wcmVhbWJsZShzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKQEAgLTEyNTgsNyArMTI3OSw4IEBACiBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CiAKIGhlbGxvIHdvcmxkCi0tLUJPVU5EQVJZLS0nJycpCistLUJPVU5EQVJZLS0KKycnJykKIAogCiAgICAgZGVmIHRlc3Rfc2VxX3BhcnRzX2luX2FfbXVsdGlwYXJ0X3dpdGhfbm9uZV9wcmVhbWJsZShzZWxmKToKQEAgLTEyODQsNyArMTMwNiw4IEBACiBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CiAKIGhlbGxvIHdvcmxkCi0tLUJPVU5EQVJZLS0nJycpCistLUJPVU5EQVJZLS0KKycnJykKIAogCiAgICAgZGVmIHRlc3Rfc2VxX3BhcnRzX2luX2FfbXVsdGlwYXJ0X3dpdGhfbm9uZV9lcGlsb2d1ZShzZWxmKToKQEAgLTEzMTAsNyArMTMzMyw4IEBACiBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CiAKIGhlbGxvIHdvcmxkCi0tLUJPVU5EQVJZLS0nJycpCistLUJPVU5EQVJZLS0KKycnJykKIAogCiAgICAgZGVmIHRlc3Rfc2VxX3BhcnRzX2luX2FfbXVsdGlwYXJ0X3dpdGhfZW1wdHlfZXBpbG9ndWUoc2VsZik6CkBAIC0xNDgzLDIzICsxNTA3LDIyIEBACiAgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCksICdwbGFpbicpCiAKICAgICBkZWYgdGVzdF9zYW1lX2JvdW5kYXJ5X2lubmVyX291dGVyKHNlbGYpOgotICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMTUudHh0JykKICAgICAgICAgIyBYWFggV2UgY2FuIHByb2JhYmx5IGV2ZW50dWFsbHkgZG8gYmV0dGVyCiAgICAgICAgIGlubmVyID0gbXNnLmdldF9wYXlsb2FkKDApCi0gICAgICAgIHVubGVzcyhoYXNhdHRyKGlubmVyLCAnZGVmZWN0cycpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihpbm5lciwgJ2RlZmVjdHMnKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaW5uZXIuZGVmZWN0cyksIDEpCi0gICAgICAgIHVubGVzcyhpc2luc3RhbmNlKGlubmVyLmRlZmVjdHNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9ycy5TdGFydEJvdW5kYXJ5Tm90Rm91bmREZWZlY3QpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoaW5uZXIuZGVmZWN0c1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9ycy5TdGFydEJvdW5kYXJ5Tm90Rm91bmREZWZlY3QpCiAKICAgICBkZWYgdGVzdF9tdWx0aXBhcnRfbm9fYm91bmRhcnkoc2VsZik6Ci0gICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18yNS50eHQnKQotICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShtc2cuZ2V0X3BheWxvYWQoKSwgc3RyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1zZy5nZXRfcGF5bG9hZCgpLCBzdHIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1zZy5kZWZlY3RzKSwgMikKLSAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLmRlZmVjdHNbMF0sIEVycm9ycy5Ob0JvdW5kYXJ5SW5NdWx0aXBhcnREZWZlY3QpKQotICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShtc2cuZGVmZWN0c1sxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JzLk11bHRpcGFydEludmFyaWFudFZpb2xhdGlvbkRlZmVjdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtc2cuZGVmZWN0c1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9ycy5Ob0JvdW5kYXJ5SW5NdWx0aXBhcnREZWZlY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtc2cuZGVmZWN0c1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9ycy5NdWx0aXBhcnRJbnZhcmlhbnRWaW9sYXRpb25EZWZlY3QpCiAKICAgICBkZWYgdGVzdF9pbnZhbGlkX2NvbnRlbnRfdHlwZShzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCkBAIC0xNTUxLDEzICsxNTc0LDEzIEBACiAiIiIpCiAKICAgICBkZWYgdGVzdF9seWluZ19tdWx0aXBhcnQoc2VsZik6Ci0gICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ180MS50eHQnKQotICAgICAgICB1bmxlc3MoaGFzYXR0cihtc2csICdkZWZlY3RzJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKG1zZywgJ2RlZmVjdHMnKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obXNnLmRlZmVjdHMpLCAyKQotICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShtc2cuZGVmZWN0c1swXSwgRXJyb3JzLk5vQm91bmRhcnlJbk11bHRpcGFydERlZmVjdCkpCi0gICAgICAgIHVubGVzcyhpc2luc3RhbmNlKG1zZy5kZWZlY3RzWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnMuTXVsdGlwYXJ0SW52YXJpYW50VmlvbGF0aW9uRGVmZWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1zZy5kZWZlY3RzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JzLk5vQm91bmRhcnlJbk11bHRpcGFydERlZmVjdCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1zZy5kZWZlY3RzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JzLk11bHRpcGFydEludmFyaWFudFZpb2xhdGlvbkRlZmVjdCkKIAogICAgIGRlZiB0ZXN0X21pc3Npbmdfc3RhcnRfYm91bmRhcnkoc2VsZik6CiAgICAgICAgIG91dGVyID0gc2VsZi5fbXNnb2JqKCdtc2dfNDIudHh0JykKQEAgLTE1NzEsOCArMTU5NCw4IEBACiAgICAgICAgICMgWypdIFRoaXMgbWVzc2FnZSBpcyBtaXNzaW5nIGl0cyBzdGFydCBib3VuZGFyeQogICAgICAgICBiYWQgPSBvdXRlci5nZXRfcGF5bG9hZCgxKS5nZXRfcGF5bG9hZCgwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihiYWQuZGVmZWN0cyksIDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGJhZC5kZWZlY3RzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnMuU3RhcnRCb3VuZGFyeU5vdEZvdW5kRGVmZWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGJhZC5kZWZlY3RzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JzLlN0YXJ0Qm91bmRhcnlOb3RGb3VuZERlZmVjdCkKIAogICAgIGRlZiB0ZXN0X2ZpcnN0X2xpbmVfaXNfY29udGludWF0aW9uX2hlYWRlcihzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCkBAIC0xNTgxLDggKzE2MDQsOCBAQAogICAgICAgICBlcShtc2cua2V5cygpLCBbXSkKICAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKCksICdMaW5lIDJcbkxpbmUgMycpCiAgICAgICAgIGVxKGxlbihtc2cuZGVmZWN0cyksIDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG1zZy5kZWZlY3RzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnMuRmlyc3RIZWFkZXJMaW5lSXNDb250aW51YXRpb25EZWZlY3QpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobXNnLmRlZmVjdHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnMuRmlyc3RIZWFkZXJMaW5lSXNDb250aW51YXRpb25EZWZlY3QpCiAgICAgICAgIGVxKG1zZy5kZWZlY3RzWzBdLmxpbmUsICcgTGluZSAxXG4nKQogCiAKQEAgLTE2NjQsMTcgKzE2ODcsMTYgQEAKIAogICAgIGRlZiB0ZXN0X3ZhbGlkX2FyZ3VtZW50KHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKLSAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIHN1YmplY3QgPSAnQSBzdWItbWVzc2FnZScKICAgICAgICAgbSA9IE1lc3NhZ2UoKQogICAgICAgICBtWydTdWJqZWN0J10gPSBzdWJqZWN0CiAgICAgICAgIHIgPSBNSU1FTWVzc2FnZShtKQogICAgICAgICBlcShyLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKICAgICAgICAgcGF5bG9hZCA9IHIuZ2V0X3BheWxvYWQoKQotICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShwYXlsb2FkLCBsaXN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHBheWxvYWQsIGxpc3QpCiAgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKICAgICAgICAgc3VicGFydCA9IHBheWxvYWRbMF0KLSAgICAgICAgdW5sZXNzKHN1YnBhcnQgaXMgbSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzdWJwYXJ0LCBtKQogICAgICAgICBlcShzdWJwYXJ0WydzdWJqZWN0J10sIHN1YmplY3QpCiAKICAgICBkZWYgdGVzdF9iYWRfbXVsdGlwYXJ0KHNlbGYpOgpAQCAtMTcwOCwyNCArMTczMCwyMiBAQAogCiAgICAgZGVmIHRlc3RfcGFyc2VfbWVzc2FnZV9yZmM4MjIoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAotICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMTEudHh0JykKICAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKICAgICAgICAgcGF5bG9hZCA9IG1zZy5nZXRfcGF5bG9hZCgpCi0gICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UocGF5bG9hZCwgbGlzdCkKICAgICAgICAgZXEobGVuKHBheWxvYWQpLCAxKQogICAgICAgICBzdWJtc2cgPSBwYXlsb2FkWzBdCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHN1Ym1zZywgTWVzc2FnZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdWJtc2csIE1lc3NhZ2UpCiAgICAgICAgIGVxKHN1Ym1zZ1snc3ViamVjdCddLCAnQW4gZW5jbG9zZWQgbWVzc2FnZScpCiAgICAgICAgIGVxKHN1Ym1zZy5nZXRfcGF5bG9hZCgpLCAnSGVyZSBpcyB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZS5cbicpCiAKICAgICBkZWYgdGVzdF9kc24oc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAotICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgIyBtc2cgMTYgaXMgYSBEZWxpdmVyeSBTdGF0dXMgTm90aWZpY2F0aW9uLCBzZWUgUkZDIDE4OTQKICAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMTYudHh0JykKICAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ211bHRpcGFydC9yZXBvcnQnKQotICAgICAgICB1bmxlc3MobXNnLmlzX211bHRpcGFydCgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmlzX211bHRpcGFydCgpKQogICAgICAgICBlcShsZW4obXNnLmdldF9wYXlsb2FkKCkpLCAzKQogICAgICAgICAjIFN1YnBhcnQgMSBpcyBhIHRleHQvcGxhaW4sIGh1bWFuIHJlYWRhYmxlIHNlY3Rpb24KICAgICAgICAgc3VicGFydCA9IG1zZy5nZXRfcGF5bG9hZCgwKQpAQCAtMTc1NCwxMyArMTc3NCwxMyBAQAogICAgICAgICAjIG1lc3NhZ2UvZGVsaXZlcnktc3RhdHVzIHNob3VsZCB0cmVhdCBlYWNoIGJsb2NrIGFzIGEgYnVuY2ggb2YKICAgICAgICAgIyBoZWFkZXJzLCBpLmUuIGEgYnVuY2ggb2YgTWVzc2FnZSBvYmplY3RzLgogICAgICAgICBkc24xID0gc3VicGFydC5nZXRfcGF5bG9hZCgwKQotICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShkc24xLCBNZXNzYWdlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGRzbjEsIE1lc3NhZ2UpCiAgICAgICAgIGVxKGRzbjFbJ29yaWdpbmFsLWVudmVsb3BlLWlkJ10sICcwR0s1MDBCNEhEMDg4OEBjb3VnYXIubm9jLnVjbGEuZWR1JykKICAgICAgICAgZXEoZHNuMS5nZXRfcGFyYW0oJ2RucycsIGhlYWRlcj0ncmVwb3J0aW5nLW10YScpLCAnJykKICAgICAgICAgIyBUcnkgYSBtaXNzaW5nIG9uZSA8d2luaz4KICAgICAgICAgZXEoZHNuMS5nZXRfcGFyYW0oJ25zZCcsIGhlYWRlcj0ncmVwb3J0aW5nLW10YScpLCBOb25lKQogICAgICAgICBkc24yID0gc3VicGFydC5nZXRfcGF5bG9hZCgxKQotICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShkc24yLCBNZXNzYWdlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGRzbjIsIE1lc3NhZ2UpCiAgICAgICAgIGVxKGRzbjJbJ2FjdGlvbiddLCAnZmFpbGVkJykKICAgICAgICAgZXEoZHNuMi5nZXRfcGFyYW1zKGhlYWRlcj0nb3JpZ2luYWwtcmVjaXBpZW50JyksCiAgICAgICAgICAgIFsoJ3JmYzgyMicsICcnKSwgKCdqYW5nZWwxQGNvdWdhci5ub2MudWNsYS5lZHUnLCAnJyldKQpAQCAtMTc2OSwxMCArMTc4OSwxMCBAQAogICAgICAgICBzdWJwYXJ0ID0gbXNnLmdldF9wYXlsb2FkKDIpCiAgICAgICAgIGVxKHN1YnBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQogICAgICAgICBwYXlsb2FkID0gc3VicGFydC5nZXRfcGF5bG9hZCgpCi0gICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UocGF5bG9hZCwgbGlzdCkKICAgICAgICAgZXEobGVuKHBheWxvYWQpLCAxKQogICAgICAgICBzdWJzdWJwYXJ0ID0gcGF5bG9hZFswXQotICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShzdWJzdWJwYXJ0LCBNZXNzYWdlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN1YnN1YnBhcnQsIE1lc3NhZ2UpCiAgICAgICAgIGVxKHN1YnN1YnBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCiAgICAgICAgIGVxKHN1YnN1YnBhcnRbJ21lc3NhZ2UtaWQnXSwKICAgICAgICAgICAgJzwwMDIwMDFjMTQ0YTYkODc1MmUwNjAkNTYxMDQ1ODZAb3h5LmVkdT4nKQpAQCAtMjA3MSw3ICsyMDkxLDYgQEAKIAogICAgIGRlZiB0ZXN0X2NvbnRlbnRfdHlwZShzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCi0gICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICAjIEdldCBhIG1lc3NhZ2Ugb2JqZWN0IGFuZCByZXNldCB0aGUgc2VlayBwb2ludGVyIGZvciBvdGhlciB0ZXN0cwogICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wNS50eHQnKQogICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L3JlcG9ydCcpCkBAIC0yMDkzLDI5ICsyMTEyLDI4IEBACiAgICAgICAgIGVxKG1zZzIuZ2V0X3BheWxvYWQoKSwgJ1lhZGRhIHlhZGRhIHlhZGRhXG4nKQogICAgICAgICBtc2czID0gbXNnLmdldF9wYXlsb2FkKDIpCiAgICAgICAgIGVxKG1zZzMuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShtc2czLCBNZXNzYWdlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1zZzMsIE1lc3NhZ2UpCiAgICAgICAgIHBheWxvYWQgPSBtc2czLmdldF9wYXlsb2FkKCkKLSAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShwYXlsb2FkLCBsaXN0KQogICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCiAgICAgICAgIG1zZzQgPSBwYXlsb2FkWzBdCi0gICAgICAgIHVubGVzcyhpc2luc3RhbmNlKG1zZzQsIE1lc3NhZ2UpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobXNnNCwgTWVzc2FnZSkKICAgICAgICAgZXEobXNnNC5nZXRfcGF5bG9hZCgpLCAnWWFkZGEgeWFkZGEgeWFkZGFcbicpCiAKICAgICBkZWYgdGVzdF9wYXJzZXIoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAotICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMDYudHh0JykKICAgICAgICAgIyBDaGVjayBzb21lIG9mIHRoZSBvdXRlciBoZWFkZXJzCiAgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCiAgICAgICAgICMgTWFrZSBzdXJlIHRoZSBwYXlsb2FkIGlzIGEgbGlzdCBvZiBleGFjdGx5IG9uZSBzdWItTWVzc2FnZSwgYW5kIHRoYXQKICAgICAgICAgIyB0aGF0IHN1Ym1lc3NhZ2UgaGFzIGEgdHlwZSBvZiB0ZXh0L3BsYWluCiAgICAgICAgIHBheWxvYWQgPSBtc2cuZ2V0X3BheWxvYWQoKQotICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShwYXlsb2FkLCBsaXN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHBheWxvYWQsIGxpc3QpCiAgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKICAgICAgICAgbXNnMSA9IHBheWxvYWRbMF0KLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobXNnMSwgTWVzc2FnZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtc2cxLCBNZXNzYWdlKQogICAgICAgICBlcShtc2cxLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShtc2cxLmdldF9wYXlsb2FkKCksIHN0cikpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtc2cxLmdldF9wYXlsb2FkKCksIHN0cikKICAgICAgICAgZXEobXNnMS5nZXRfcGF5bG9hZCgpLCAnXG4nKQogCiAKQEAgLTIxNTIsNyArMjE3MCw2IEBACiAgICAgICAgICAgICBmcC5jbG9zZSgpCiAKICAgICBkZWYgdGVzdF9tZXNzYWdlX2Zyb21fc3RyaW5nX3dpdGhfY2xhc3Moc2VsZik6Ci0gICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMDEudHh0JykKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgdGV4dCA9IGZwLnJlYWQoKQpAQCAtMjE2Myw3ICsyMTgwLDcgQEAKICAgICAgICAgICAgIHBhc3MKIAogICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKHRleHQsIE15TWVzc2FnZSkKLSAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLCBNeU1lc3NhZ2UpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobXNnLCBNeU1lc3NhZ2UpCiAgICAgICAgICMgVHJ5IHNvbWV0aGluZyBtb3JlIGNvbXBsaWNhdGVkCiAgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18wMi50eHQnKQogICAgICAgICB0cnk6CkBAIC0yMTcyLDEwICsyMTg5LDkgQEAKICAgICAgICAgICAgIGZwLmNsb3NlKCkKICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyh0ZXh0LCBNeU1lc3NhZ2UpCiAgICAgICAgIGZvciBzdWJwYXJ0IGluIG1zZy53YWxrKCk6Ci0gICAgICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShzdWJwYXJ0LCBNeU1lc3NhZ2UpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN1YnBhcnQsIE15TWVzc2FnZSkKIAogICAgIGRlZiB0ZXN0X21lc3NhZ2VfZnJvbV9maWxlX3dpdGhfY2xhc3Moc2VsZik6Ci0gICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICAjIENyZWF0ZSBhIHN1YmNsYXNzCiAgICAgICAgIGNsYXNzIE15TWVzc2FnZShNZXNzYWdlKToKICAgICAgICAgICAgIHBhc3MKQEAgLTIxODUsNyArMjIwMSw3IEBACiAgICAgICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fZmlsZShmcCwgTXlNZXNzYWdlKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgZnAuY2xvc2UoKQotICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShtc2csIE15TWVzc2FnZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtc2csIE15TWVzc2FnZSkKICAgICAgICAgIyBUcnkgc29tZXRoaW5nIG1vcmUgY29tcGxpY2F0ZWQKICAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzAyLnR4dCcpCiAgICAgICAgIHRyeToKQEAgLTIxOTMsNyArMjIwOSw3IEBACiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBmcC5jbG9zZSgpCiAgICAgICAgIGZvciBzdWJwYXJ0IGluIG1zZy53YWxrKCk6Ci0gICAgICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShzdWJwYXJ0LCBNeU1lc3NhZ2UpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN1YnBhcnQsIE15TWVzc2FnZSkKIAogICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKICAgICAgICAgbW9kdWxlID0gX19pbXBvcnRfXygnZW1haWwnKQpAQCAtMjI2Miw2ICsyMjc4LDEyIEBACiAgICAgICAgIGVxKHRpbWUubG9jYWx0aW1lKHQpWzo2XSwgdGltZXR1cFs6Nl0pCiAgICAgICAgIGVxKGludCh0aW1lLnN0cmZ0aW1lKCclWScsIHRpbWV0dXBbOjldKSksIDIwMDMpCiAKKyAgICBkZWYgdGVzdF9ta3RpbWVfdHooc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVXRpbHMubWt0aW1lX3R6KCgxOTcwLCAxLCAxLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIC0xLCAtMSwgMCkpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFV0aWxzLm1rdGltZV90eigoMTk3MCwgMSwgMSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAtMSwgLTEsIDEyMzQpKSwgLTEyMzQpCisKICAgICBkZWYgdGVzdF9wYXJzZWRhdGVfeTJrKHNlbGYpOgogICAgICAgICAiIiJUZXN0IGZvciBwYXJzaW5nIGEgZGF0ZSB3aXRoIGEgdHdvLWRpZ2l0IHllYXIuCiAKQEAgLTI1NjIsOSArMjU4NCw5IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgb20uYXBwZW5kKG9sKQogICAgICAgICAgICAgICAgIG4xICs9IDEKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuID09IG4xKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKG9tKSA9PSBudCkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCcnLmpvaW4oW2lsIGZvciBpbCwgbiBpbiBpbXRdKSA9PSAnJy5qb2luKG9tKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobiwgbjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG9tKSwgbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycuam9pbihbaWwgZm9yIGlsLCBuIGluIGltdF0pLCAnJy5qb2luKG9tKSkKIAogCiAKQEAgLTI1ODEsNyArMjYwMyw3IEBACiAgICAgICAgIGVxKG1zZ1sndG8nXSwgJ3BwcEB6enoub3JnJykKICAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ211bHRpcGFydC9taXhlZCcpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobXNnLmlzX211bHRpcGFydCgpKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShtc2cuZ2V0X3BheWxvYWQoKSwgc3RyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1zZy5nZXRfcGF5bG9hZCgpLCBzdHIpCiAKICAgICBkZWYgdGVzdF93aGl0ZXNwYWNlX2NvbnRpbnVhdGlvbihzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCkBAIC0yOTk4LDcgKzMwMjAsNyBAQAogICAgICAgICBoID0gSGVhZGVyKCJJIGFtIHRoZSB2ZXJ5IG1vZGVsIG9mIGEgbW9kZXJuIE1ham9yLUdlbmVyYWw7IEkndmUgaW5mb3JtYXRpb24gdmVnZXRhYmxlLCBhbmltYWwsIGFuZCBtaW5lcmFsOyBJIGtub3cgdGhlIGtpbmdzIG9mIEVuZ2xhbmQsIGFuZCBJIHF1b3RlIHRoZSBmaWdodHMgaGlzdG9yaWNhbCBmcm9tIE1hcmF0aG9uIHRvIFdhdGVybG9vLCBpbiBvcmRlciBjYXRlZ29yaWNhbDsgSSdtIHZlcnkgd2VsbCBhY3F1YWludGVkLCB0b28sIHdpdGggbWF0dGVycyBtYXRoZW1hdGljYWw7IEkgdW5kZXJzdGFuZCBlcXVhdGlvbnMsIGJvdGggdGhlIHNpbXBsZSBhbmQgcXVhZHJhdGljYWw7IGFib3V0IGJpbm9taWFsIHRoZW9yZW0gSSdtIHRlZW1pbmcgd2l0aCBhIGxvdCBvJyBuZXdzLCB3aXRoIG1hbnkgY2hlZXJmdWwgZmFjdHMgYWJvdXQgdGhlIHNxdWFyZSBvZiB0aGUgaHlwb3RlbnVzZS4iLAogICAgICAgICAgICAgICAgICAgIG1heGxpbmVsZW49NzYpCiAgICAgICAgIGZvciBsIGluIGguZW5jb2RlKHNwbGl0Y2hhcnM9JyAnKS5zcGxpdCgnXG4gJyk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGwpIDw9IDc2KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwobGVuKGwpLCA3NikKIAogICAgIGRlZiB0ZXN0X211bHRpbGluZ3VhbChzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKQEAgLTMyNTAsNyArMzI3Miw3IEBACiAnJycKICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQogICAgICAgICBwYXJhbSA9IG1zZy5nZXRfcGFyYW0oJ05BTUUnKQotICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzaW5zdGFuY2UocGFyYW0sIHR1cGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKHBhcmFtLCB0dXBsZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgIHBhcmFtLAogICAgICAgICAgICAgJ2ZpbGVfX19fQ19fRE9DVU1FTlRTXzIwQU5EXzIwU0VUVElOR1NfRkFCSUVOX0xPQ0FMXzIwU0VUVElOR1NfVEVNUF9uc21haWwuaHRtJykKQEAgLTM0MDMsNyArMzQyNSw3IEBACiAiIiIKICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQogICAgICAgICBwYXJhbSA9IG1zZy5nZXRfcGFyYW0oJ25hbWUnKQotICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzaW5zdGFuY2UocGFyYW0sIHR1cGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKHBhcmFtLCB0dXBsZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJhbSwgIkZyYW5rJ3MgRG9jdW1lbnQiKQogCiAgICAgZGVmIHRlc3RfcmZjMjIzMV90aWNrX2F0dGFja19leHRlbmRlZChzZWxmKToKQEAgLTM0MjcsNyArMzQ0OSw3IEBACiAiIiIKICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQogICAgICAgICBwYXJhbSA9IG1zZy5nZXRfcGFyYW0oJ25hbWUnKQotICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzaW5zdGFuY2UocGFyYW0sIHR1cGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKHBhcmFtLCB0dXBsZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJhbSwgInVzLWFzY2lpJ2VuLXVzJ0ZyYW5rJ3MgRG9jdW1lbnQiKQogCiAgICAgZGVmIHRlc3RfcmZjMjIzMV9ub19leHRlbmRlZF92YWx1ZXMoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsX3JlbmFtZWQucHkgYi9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsX3JlbmFtZWQucHkKaW5kZXggNDk3YjY2Yi4uNWE0MTcwMSAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5CisrKyBiL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weQpAQCAtMjMxLDEyICsyMzEsMTIgQEAKICAgICAgICAgbXNnWydGcm9tJ10gPSAnTWUnCiAgICAgICAgIG1zZ1sndG8nXSA9ICdZb3UnCiAgICAgICAgICMgQ2hlY2sgZm9yIGNhc2UgaW5zZW5zaXRpdml0eQotICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2Zyb20nIGluIG1zZykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdGcm9tJyBpbiBtc2cpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnRlJPTScgaW4gbXNnKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoJ3RvJyBpbiBtc2cpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnVG8nIGluIG1zZykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdUTycgaW4gbXNnKQorICAgICAgICBzZWxmLmFzc2VydEluKCdmcm9tJywgbXNnKQorICAgICAgICBzZWxmLmFzc2VydEluKCdGcm9tJywgbXNnKQorICAgICAgICBzZWxmLmFzc2VydEluKCdGUk9NJywgbXNnKQorICAgICAgICBzZWxmLmFzc2VydEluKCd0bycsIG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignVG8nLCBtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ1RPJywgbXNnKQogCiAgICAgZGVmIHRlc3RfYXNfc3RyaW5nKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKQEAgLTkxNiw3ICs5MTYsNiBAQAogCiAgICAgZGVmIHRlc3RfYWRkX2hlYWRlcihzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCi0gICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICBzZWxmLl9hdS5hZGRfaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPSdhdWRpb3Rlc3QuYXUnKQogICAgICAgICBlcShzZWxmLl9hdVsnY29udGVudC1kaXNwb3NpdGlvbiddLApAQCAtOTI3LDEyICs5MjYsMTMgQEAKICAgICAgICAgICAgJ2F1ZGlvdGVzdC5hdScpCiAgICAgICAgIG1pc3NpbmcgPSBbXQogICAgICAgICBlcShzZWxmLl9hdS5nZXRfcGFyYW0oJ2F0dGFjaG1lbnQnLCBoZWFkZXI9J2NvbnRlbnQtZGlzcG9zaXRpb24nKSwgJycpCi0gICAgICAgIHVubGVzcyhzZWxmLl9hdS5nZXRfcGFyYW0oJ2ZvbycsIGZhaWxvYmo9bWlzc2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXI9J2NvbnRlbnQtZGlzcG9zaXRpb24nKSBpcyBtaXNzaW5nKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYuX2F1LmdldF9wYXJhbSgnZm9vJywgZmFpbG9iaj1taXNzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXI9J2NvbnRlbnQtZGlzcG9zaXRpb24nKSwKKyAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nKQogICAgICAgICAjIFRyeSBzb21lIG1pc3Npbmcgc3R1ZmYKLSAgICAgICAgdW5sZXNzKHNlbGYuX2F1LmdldF9wYXJhbSgnZm9vYmFyJywgbWlzc2luZykgaXMgbWlzc2luZykKLSAgICAgICAgdW5sZXNzKHNlbGYuX2F1LmdldF9wYXJhbSgnYXR0YWNobWVudCcsIG1pc3NpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyPSdmb29iYXInKSBpcyBtaXNzaW5nKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYuX2F1LmdldF9wYXJhbSgnZm9vYmFyJywgbWlzc2luZyksIG1pc3NpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5fYXUuZ2V0X3BhcmFtKCdhdHRhY2htZW50JywgbWlzc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyPSdmb29iYXInKSwgbWlzc2luZykKIAogCiAKQEAgLTk1OSw3ICs5NTksNiBAQAogCiAgICAgZGVmIHRlc3RfYWRkX2hlYWRlcihzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCi0gICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICBzZWxmLl9pbS5hZGRfaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPSdkaW5ndXNmaXNoLmdpZicpCiAgICAgICAgIGVxKHNlbGYuX2ltWydjb250ZW50LWRpc3Bvc2l0aW9uJ10sCkBAIC05NzAsMTIgKzk2OSwxMyBAQAogICAgICAgICAgICAnZGluZ3VzZmlzaC5naWYnKQogICAgICAgICBtaXNzaW5nID0gW10KICAgICAgICAgZXEoc2VsZi5faW0uZ2V0X3BhcmFtKCdhdHRhY2htZW50JywgaGVhZGVyPSdjb250ZW50LWRpc3Bvc2l0aW9uJyksICcnKQotICAgICAgICB1bmxlc3Moc2VsZi5faW0uZ2V0X3BhcmFtKCdmb28nLCBmYWlsb2JqPW1pc3NpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyPSdjb250ZW50LWRpc3Bvc2l0aW9uJykgaXMgbWlzc2luZykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLl9pbS5nZXRfcGFyYW0oJ2ZvbycsIGZhaWxvYmo9bWlzc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyPSdjb250ZW50LWRpc3Bvc2l0aW9uJyksCisgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZykKICAgICAgICAgIyBUcnkgc29tZSBtaXNzaW5nIHN0dWZmCi0gICAgICAgIHVubGVzcyhzZWxmLl9pbS5nZXRfcGFyYW0oJ2Zvb2JhcicsIG1pc3NpbmcpIGlzIG1pc3NpbmcpCi0gICAgICAgIHVubGVzcyhzZWxmLl9pbS5nZXRfcGFyYW0oJ2F0dGFjaG1lbnQnLCBtaXNzaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcj0nZm9vYmFyJykgaXMgbWlzc2luZykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLl9pbS5nZXRfcGFyYW0oJ2Zvb2JhcicsIG1pc3NpbmcpLCBtaXNzaW5nKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYuX2ltLmdldF9wYXJhbSgnYXR0YWNobWVudCcsIG1pc3NpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcj0nZm9vYmFyJyksIG1pc3NpbmcpCiAKIAogCkBAIC05OTQsNiArOTk0LDM4IEBACiAgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgpLCAnK3Z2OC9mNy8nKQogICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCBieXRlcykKIAorICAgIGRlZiB0ZXN0X2JpbmFyeV9ib2R5X3dpdGhfZW5jb2RlXzdvcjhiaXQoc2VsZik6CisgICAgICAgICMgSXNzdWUgMTcxNzEuCisgICAgICAgIGJ5dGVzZGF0YSA9IGInXHhmYVx4ZmJceGZjXHhmZFx4ZmVceGZmJworICAgICAgICBtc2cgPSBNSU1FQXBwbGljYXRpb24oYnl0ZXNkYXRhLCBfZW5jb2Rlcj1lbmNvZGVycy5lbmNvZGVfN29yOGJpdCkKKyAgICAgICAgIyBUcmVhdGVkIGFzIGEgc3RyaW5nLCB0aGlzIHdpbGwgYmUgaW52YWxpZCBjb2RlIHBvaW50cy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoKSwgYnl0ZXNkYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZChkZWNvZGU9VHJ1ZSksIGJ5dGVzZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dbJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnXSwgJzhiaXQnKQorICAgICAgICBzID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHMpCisgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgIHdpcmVmb3JtID0gcy5nZXR2YWx1ZSgpCisgICAgICAgIG1zZzIgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKHdpcmVmb3JtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZCgpLCBieXRlc2RhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnMi5nZXRfcGF5bG9hZChkZWNvZGU9VHJ1ZSksIGJ5dGVzZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cyWydDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nJ10sICc4Yml0JykKKworICAgIGRlZiB0ZXN0X2JpbmFyeV9ib2R5X3dpdGhfZW5jb2RlX25vb3Aoc2VsZik6CisgICAgICAgICMgSXNzdWUgMTY1NjQ6IFRoaXMgZG9lcyBub3QgcHJvZHVjZSBhbiBSRkMgdmFsaWQgbWVzc2FnZSwgc2luY2UgdG8gYmUKKyAgICAgICAgIyB2YWxpZCBpdCBzaG91bGQgaGF2ZSBhIENURSBvZiBiaW5hcnkuICBCdXQgdGhlIGJlbG93IHdvcmtzLCBhbmQgaXMKKyAgICAgICAgIyBkb2N1bWVudGVkIGFzIHdvcmtpbmcgdGhpcyB3YXkuCisgICAgICAgIGJ5dGVzZGF0YSA9IGInXHhmYVx4ZmJceGZjXHhmZFx4ZmVceGZmJworICAgICAgICBtc2cgPSBNSU1FQXBwbGljYXRpb24oYnl0ZXNkYXRhLCBfZW5jb2Rlcj1lbmNvZGVycy5lbmNvZGVfbm9vcCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoKSwgYnl0ZXNkYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZChkZWNvZGU9VHJ1ZSksIGJ5dGVzZGF0YSkKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICB3aXJlZm9ybSA9IHMuZ2V0dmFsdWUoKQorICAgICAgICBtc2cyID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyh3aXJlZm9ybSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoKSwgYnl0ZXNkYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZzIuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCBieXRlc2RhdGEpCiAKIAogIyBUZXN0IHRoZSBiYXNpYyBNSU1FVGV4dCBjbGFzcwpAQCAtMTAwMywxNyArMTAzNSwxNiBAQAogCiAgICAgZGVmIHRlc3RfdHlwZXMoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAotICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgZXEoc2VsZi5fbXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQogICAgICAgICBlcShzZWxmLl9tc2cuZ2V0X3BhcmFtKCdjaGFyc2V0JyksICd1cy1hc2NpaScpCiAgICAgICAgIG1pc3NpbmcgPSBbXQotICAgICAgICB1bmxlc3Moc2VsZi5fbXNnLmdldF9wYXJhbSgnZm9vYmFyJywgbWlzc2luZykgaXMgbWlzc2luZykKLSAgICAgICAgdW5sZXNzKHNlbGYuX21zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnLCBtaXNzaW5nLCBoZWFkZXI9J2Zvb2JhcicpCi0gICAgICAgICAgICAgICBpcyBtaXNzaW5nKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYuX21zZy5nZXRfcGFyYW0oJ2Zvb2JhcicsIG1pc3NpbmcpLCBtaXNzaW5nKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYuX21zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnLCBtaXNzaW5nLCBoZWFkZXI9J2Zvb2JhcicpLAorICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmcpCiAKICAgICBkZWYgdGVzdF9wYXlsb2FkKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX21zZy5nZXRfcGF5bG9hZCgpLCAnaGVsbG8gdGhlcmUnKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHNlbGYuX21zZy5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLl9tc2cuaXNfbXVsdGlwYXJ0KCkpCiAKICAgICBkZWYgdGVzdF9jaGFyc2V0KHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKQEAgLTEwNjgsMjEgKzEwOTksMjAgQEAKICAgICBkZWYgdGVzdF9oaWVyYXJjaHkoc2VsZik6CiAgICAgICAgICMgY29udmVuaWVuY2UKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCi0gICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICByYWlzZXMgPSBzZWxmLmFzc2VydFJhaXNlcwogICAgICAgICAjIHRlc3RzCiAgICAgICAgIG0gPSBzZWxmLl9tc2cKLSAgICAgICAgdW5sZXNzKG0uaXNfbXVsdGlwYXJ0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtLmlzX211bHRpcGFydCgpKQogICAgICAgICBlcShtLmdldF9jb250ZW50X3R5cGUoKSwgJ211bHRpcGFydC9taXhlZCcpCiAgICAgICAgIGVxKGxlbihtLmdldF9wYXlsb2FkKCkpLCAyKQogICAgICAgICByYWlzZXMoSW5kZXhFcnJvciwgbS5nZXRfcGF5bG9hZCwgMikKICAgICAgICAgbTAgPSBtLmdldF9wYXlsb2FkKDApCiAgICAgICAgIG0xID0gbS5nZXRfcGF5bG9hZCgxKQotICAgICAgICB1bmxlc3MobTAgaXMgc2VsZi5fdHh0KQotICAgICAgICB1bmxlc3MobTEgaXMgc2VsZi5faW0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXMobTAsIHNlbGYuX3R4dCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhtMSwgc2VsZi5faW0pCiAgICAgICAgIGVxKG0uZ2V0X3BheWxvYWQoKSwgW20wLCBtMV0pCi0gICAgICAgIHVubGVzcyhub3QgbTAuaXNfbXVsdGlwYXJ0KCkpCi0gICAgICAgIHVubGVzcyhub3QgbTEuaXNfbXVsdGlwYXJ0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobTAuaXNfbXVsdGlwYXJ0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobTEuaXNfbXVsdGlwYXJ0KCkpCiAKICAgICBkZWYgdGVzdF9lbXB0eV9tdWx0aXBhcnRfaWRlbXBvdGVudChzZWxmKToKICAgICAgICAgdGV4dCA9ICIiIlwKQEAgLTExMTYsNyArMTE0Niw4IEBACiAKIC0tQk9VTkRBUlkKIAotLS1CT1VOREFSWS0tJycnKQorLS1CT1VOREFSWS0tCisnJycpCiAKICAgICBkZWYgdGVzdF9ub19wYXJ0c19pbl9hX211bHRpcGFydF93aXRoX2VtcHR5X2VwaWxvZ3VlKHNlbGYpOgogICAgICAgICBvdXRlciA9IE1JTUVCYXNlKCdtdWx0aXBhcnQnLCAnbWl4ZWQnKQpAQCAtMTE2MSw3ICsxMTkyLDggQEAKIENvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKIAogaGVsbG8gd29ybGQKLS0tQk9VTkRBUlktLScnJykKKy0tQk9VTkRBUlktLQorJycnKQogCiAgICAgZGVmIHRlc3Rfc2VxX3BhcnRzX2luX2FfbXVsdGlwYXJ0X3dpdGhfZW1wdHlfcHJlYW1ibGUoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCkBAIC0xMTg3LDcgKzEyMTksOCBAQAogQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAogCiBoZWxsbyB3b3JsZAotLS1CT1VOREFSWS0tJycnKQorLS1CT1VOREFSWS0tCisnJycpCiAKIAogICAgIGRlZiB0ZXN0X3NlcV9wYXJ0c19pbl9hX211bHRpcGFydF93aXRoX25vbmVfcHJlYW1ibGUoc2VsZik6CkBAIC0xMjEzLDcgKzEyNDYsOCBAQAogQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAogCiBoZWxsbyB3b3JsZAotLS1CT1VOREFSWS0tJycnKQorLS1CT1VOREFSWS0tCisnJycpCiAKIAogICAgIGRlZiB0ZXN0X3NlcV9wYXJ0c19pbl9hX211bHRpcGFydF93aXRoX25vbmVfZXBpbG9ndWUoc2VsZik6CkBAIC0xMjM5LDcgKzEyNzMsOCBAQAogQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAogCiBoZWxsbyB3b3JsZAotLS1CT1VOREFSWS0tJycnKQorLS1CT1VOREFSWS0tCisnJycpCiAKIAogICAgIGRlZiB0ZXN0X3NlcV9wYXJ0c19pbl9hX211bHRpcGFydF93aXRoX2VtcHR5X2VwaWxvZ3VlKHNlbGYpOgpAQCAtMTQxMiwyMyArMTQ0NywyMiBAQAogICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQogCiAgICAgZGVmIHRlc3Rfc2FtZV9ib3VuZGFyeV9pbm5lcl9vdXRlcihzZWxmKToKLSAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzE1LnR4dCcpCiAgICAgICAgICMgWFhYIFdlIGNhbiBwcm9iYWJseSBldmVudHVhbGx5IGRvIGJldHRlcgogICAgICAgICBpbm5lciA9IG1zZy5nZXRfcGF5bG9hZCgwKQotICAgICAgICB1bmxlc3MoaGFzYXR0cihpbm5lciwgJ2RlZmVjdHMnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoaW5uZXIsICdkZWZlY3RzJykpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGlubmVyLmRlZmVjdHMpLCAxKQotICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShpbm5lci5kZWZlY3RzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuU3RhcnRCb3VuZGFyeU5vdEZvdW5kRGVmZWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGlubmVyLmRlZmVjdHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuU3RhcnRCb3VuZGFyeU5vdEZvdW5kRGVmZWN0KQogCiAgICAgZGVmIHRlc3RfbXVsdGlwYXJ0X25vX2JvdW5kYXJ5KHNlbGYpOgotICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMjUudHh0JykKLSAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLmdldF9wYXlsb2FkKCksIHN0cikpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtc2cuZ2V0X3BheWxvYWQoKSwgc3RyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihtc2cuZGVmZWN0cyksIDIpCi0gICAgICAgIHVubGVzcyhpc2luc3RhbmNlKG1zZy5kZWZlY3RzWzBdLCBlcnJvcnMuTm9Cb3VuZGFyeUluTXVsdGlwYXJ0RGVmZWN0KSkKLSAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLmRlZmVjdHNbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5NdWx0aXBhcnRJbnZhcmlhbnRWaW9sYXRpb25EZWZlY3QpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobXNnLmRlZmVjdHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuTm9Cb3VuZGFyeUluTXVsdGlwYXJ0RGVmZWN0KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobXNnLmRlZmVjdHNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuTXVsdGlwYXJ0SW52YXJpYW50VmlvbGF0aW9uRGVmZWN0KQogCiAgICAgZGVmIHRlc3RfaW52YWxpZF9jb250ZW50X3R5cGUoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbApAQCAtMTQ4MCwxMyArMTUxNCwxMyBAQAogIiIiKQogCiAgICAgZGVmIHRlc3RfbHlpbmdfbXVsdGlwYXJ0KHNlbGYpOgotICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfNDEudHh0JykKLSAgICAgICAgdW5sZXNzKGhhc2F0dHIobXNnLCAnZGVmZWN0cycpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihtc2csICdkZWZlY3RzJykpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1zZy5kZWZlY3RzKSwgMikKLSAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLmRlZmVjdHNbMF0sIGVycm9ycy5Ob0JvdW5kYXJ5SW5NdWx0aXBhcnREZWZlY3QpKQotICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShtc2cuZGVmZWN0c1sxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLk11bHRpcGFydEludmFyaWFudFZpb2xhdGlvbkRlZmVjdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtc2cuZGVmZWN0c1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5Ob0JvdW5kYXJ5SW5NdWx0aXBhcnREZWZlY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtc2cuZGVmZWN0c1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5NdWx0aXBhcnRJbnZhcmlhbnRWaW9sYXRpb25EZWZlY3QpCiAKICAgICBkZWYgdGVzdF9taXNzaW5nX3N0YXJ0X2JvdW5kYXJ5KHNlbGYpOgogICAgICAgICBvdXRlciA9IHNlbGYuX21zZ29iaignbXNnXzQyLnR4dCcpCkBAIC0xNTAwLDggKzE1MzQsOCBAQAogICAgICAgICAjIFsqXSBUaGlzIG1lc3NhZ2UgaXMgbWlzc2luZyBpdHMgc3RhcnQgYm91bmRhcnkKICAgICAgICAgYmFkID0gb3V0ZXIuZ2V0X3BheWxvYWQoMSkuZ2V0X3BheWxvYWQoMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYmFkLmRlZmVjdHMpLCAxKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShiYWQuZGVmZWN0c1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLlN0YXJ0Qm91bmRhcnlOb3RGb3VuZERlZmVjdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShiYWQuZGVmZWN0c1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5TdGFydEJvdW5kYXJ5Tm90Rm91bmREZWZlY3QpCiAKICAgICBkZWYgdGVzdF9maXJzdF9saW5lX2lzX2NvbnRpbnVhdGlvbl9oZWFkZXIoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbApAQCAtMTUxMCw4ICsxNTQ0LDggQEAKICAgICAgICAgZXEobXNnLmtleXMoKSwgW10pCiAgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgpLCAnTGluZSAyXG5MaW5lIDMnKQogICAgICAgICBlcShsZW4obXNnLmRlZmVjdHMpLCAxKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShtc2cuZGVmZWN0c1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLkZpcnN0SGVhZGVyTGluZUlzQ29udGludWF0aW9uRGVmZWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1zZy5kZWZlY3RzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLkZpcnN0SGVhZGVyTGluZUlzQ29udGludWF0aW9uRGVmZWN0KQogICAgICAgICBlcShtc2cuZGVmZWN0c1swXS5saW5lLCAnIExpbmUgMVxuJykKIAogCkBAIC0xNTc3LDE3ICsxNjExLDE2IEBACiAKICAgICBkZWYgdGVzdF92YWxpZF9hcmd1bWVudChzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCi0gICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICBzdWJqZWN0ID0gJ0Egc3ViLW1lc3NhZ2UnCiAgICAgICAgIG0gPSBNZXNzYWdlKCkKICAgICAgICAgbVsnU3ViamVjdCddID0gc3ViamVjdAogICAgICAgICByID0gTUlNRU1lc3NhZ2UobSkKICAgICAgICAgZXEoci5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCiAgICAgICAgIHBheWxvYWQgPSByLmdldF9wYXlsb2FkKCkKLSAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShwYXlsb2FkLCBsaXN0KQogICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCiAgICAgICAgIHN1YnBhcnQgPSBwYXlsb2FkWzBdCi0gICAgICAgIHVubGVzcyhzdWJwYXJ0IGlzIG0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc3VicGFydCwgbSkKICAgICAgICAgZXEoc3VicGFydFsnc3ViamVjdCddLCBzdWJqZWN0KQogCiAgICAgZGVmIHRlc3RfYmFkX211bHRpcGFydChzZWxmKToKQEAgLTE2MjEsMjQgKzE2NTQsMjIgQEAKIAogICAgIGRlZiB0ZXN0X3BhcnNlX21lc3NhZ2VfcmZjODIyKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKLSAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzExLnR4dCcpCiAgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCiAgICAgICAgIHBheWxvYWQgPSBtc2cuZ2V0X3BheWxvYWQoKQotICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShwYXlsb2FkLCBsaXN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHBheWxvYWQsIGxpc3QpCiAgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKICAgICAgICAgc3VibXNnID0gcGF5bG9hZFswXQotICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzdWJtc2csIE1lc3NhZ2UpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3VibXNnLCBNZXNzYWdlKQogICAgICAgICBlcShzdWJtc2dbJ3N1YmplY3QnXSwgJ0FuIGVuY2xvc2VkIG1lc3NhZ2UnKQogICAgICAgICBlcShzdWJtc2cuZ2V0X3BheWxvYWQoKSwgJ0hlcmUgaXMgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UuXG4nKQogCiAgICAgZGVmIHRlc3RfZHNuKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKLSAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgICMgbXNnIDE2IGlzIGEgRGVsaXZlcnkgU3RhdHVzIE5vdGlmaWNhdGlvbiwgc2VlIFJGQyAxODk0CiAgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzE2LnR4dCcpCiAgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtdWx0aXBhcnQvcmVwb3J0JykKLSAgICAgICAgdW5sZXNzKG1zZy5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5pc19tdWx0aXBhcnQoKSkKICAgICAgICAgZXEobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMykKICAgICAgICAgIyBTdWJwYXJ0IDEgaXMgYSB0ZXh0L3BsYWluLCBodW1hbiByZWFkYWJsZSBzZWN0aW9uCiAgICAgICAgIHN1YnBhcnQgPSBtc2cuZ2V0X3BheWxvYWQoMCkKQEAgLTE2NjcsMTMgKzE2OTgsMTMgQEAKICAgICAgICAgIyBtZXNzYWdlL2RlbGl2ZXJ5LXN0YXR1cyBzaG91bGQgdHJlYXQgZWFjaCBibG9jayBhcyBhIGJ1bmNoIG9mCiAgICAgICAgICMgaGVhZGVycywgaS5lLiBhIGJ1bmNoIG9mIE1lc3NhZ2Ugb2JqZWN0cy4KICAgICAgICAgZHNuMSA9IHN1YnBhcnQuZ2V0X3BheWxvYWQoMCkKLSAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UoZHNuMSwgTWVzc2FnZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkc24xLCBNZXNzYWdlKQogICAgICAgICBlcShkc24xWydvcmlnaW5hbC1lbnZlbG9wZS1pZCddLCAnMEdLNTAwQjRIRDA4ODhAY291Z2FyLm5vYy51Y2xhLmVkdScpCiAgICAgICAgIGVxKGRzbjEuZ2V0X3BhcmFtKCdkbnMnLCBoZWFkZXI9J3JlcG9ydGluZy1tdGEnKSwgJycpCiAgICAgICAgICMgVHJ5IGEgbWlzc2luZyBvbmUgPHdpbms+CiAgICAgICAgIGVxKGRzbjEuZ2V0X3BhcmFtKCduc2QnLCBoZWFkZXI9J3JlcG9ydGluZy1tdGEnKSwgTm9uZSkKICAgICAgICAgZHNuMiA9IHN1YnBhcnQuZ2V0X3BheWxvYWQoMSkKLSAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UoZHNuMiwgTWVzc2FnZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkc24yLCBNZXNzYWdlKQogICAgICAgICBlcShkc24yWydhY3Rpb24nXSwgJ2ZhaWxlZCcpCiAgICAgICAgIGVxKGRzbjIuZ2V0X3BhcmFtcyhoZWFkZXI9J29yaWdpbmFsLXJlY2lwaWVudCcpLAogICAgICAgICAgICBbKCdyZmM4MjInLCAnJyksICgnamFuZ2VsMUBjb3VnYXIubm9jLnVjbGEuZWR1JywgJycpXSkKQEAgLTE2ODIsMTAgKzE3MTMsMTAgQEAKICAgICAgICAgc3VicGFydCA9IG1zZy5nZXRfcGF5bG9hZCgyKQogICAgICAgICBlcShzdWJwYXJ0LmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKICAgICAgICAgcGF5bG9hZCA9IHN1YnBhcnQuZ2V0X3BheWxvYWQoKQotICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShwYXlsb2FkLCBsaXN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHBheWxvYWQsIGxpc3QpCiAgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKICAgICAgICAgc3Vic3VicGFydCA9IHBheWxvYWRbMF0KLSAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2Uoc3Vic3VicGFydCwgTWVzc2FnZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdWJzdWJwYXJ0LCBNZXNzYWdlKQogICAgICAgICBlcShzdWJzdWJwYXJ0LmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQogICAgICAgICBlcShzdWJzdWJwYXJ0WydtZXNzYWdlLWlkJ10sCiAgICAgICAgICAgICc8MDAyMDAxYzE0NGE2JDg3NTJlMDYwJDU2MTA0NTg2QG94eS5lZHU+JykKQEAgLTE5ODEsNyArMjAxMiw2IEBACiAKICAgICBkZWYgdGVzdF9jb250ZW50X3R5cGUoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAotICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgIyBHZXQgYSBtZXNzYWdlIG9iamVjdCBhbmQgcmVzZXQgdGhlIHNlZWsgcG9pbnRlciBmb3Igb3RoZXIgdGVzdHMKICAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMDUudHh0JykKICAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ211bHRpcGFydC9yZXBvcnQnKQpAQCAtMjAwMywyOSArMjAzMywyOCBAQAogICAgICAgICBlcShtc2cyLmdldF9wYXlsb2FkKCksICdZYWRkYSB5YWRkYSB5YWRkYVxuJykKICAgICAgICAgbXNnMyA9IG1zZy5nZXRfcGF5bG9hZCgyKQogICAgICAgICBlcShtc2czLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobXNnMywgTWVzc2FnZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtc2czLCBNZXNzYWdlKQogICAgICAgICBwYXlsb2FkID0gbXNnMy5nZXRfcGF5bG9hZCgpCi0gICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UocGF5bG9hZCwgbGlzdCkKICAgICAgICAgZXEobGVuKHBheWxvYWQpLCAxKQogICAgICAgICBtc2c0ID0gcGF5bG9hZFswXQotICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShtc2c0LCBNZXNzYWdlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1zZzQsIE1lc3NhZ2UpCiAgICAgICAgIGVxKG1zZzQuZ2V0X3BheWxvYWQoKSwgJ1lhZGRhIHlhZGRhIHlhZGRhXG4nKQogCiAgICAgZGVmIHRlc3RfcGFyc2VyKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKLSAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzA2LnR4dCcpCiAgICAgICAgICMgQ2hlY2sgc29tZSBvZiB0aGUgb3V0ZXIgaGVhZGVycwogICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQogICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgcGF5bG9hZCBpcyBhIGxpc3Qgb2YgZXhhY3RseSBvbmUgc3ViLU1lc3NhZ2UsIGFuZCB0aGF0CiAgICAgICAgICMgdGhhdCBzdWJtZXNzYWdlIGhhcyBhIHR5cGUgb2YgdGV4dC9wbGFpbgogICAgICAgICBwYXlsb2FkID0gbXNnLmdldF9wYXlsb2FkKCkKLSAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShwYXlsb2FkLCBsaXN0KQogICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCiAgICAgICAgIG1zZzEgPSBwYXlsb2FkWzBdCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG1zZzEsIE1lc3NhZ2UpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobXNnMSwgTWVzc2FnZSkKICAgICAgICAgZXEobXNnMS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobXNnMS5nZXRfcGF5bG9hZCgpLCBzdHIpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobXNnMS5nZXRfcGF5bG9hZCgpLCBzdHIpCiAgICAgICAgIGVxKG1zZzEuZ2V0X3BheWxvYWQoKSwgJ1xuJykKIAogCkBAIC0yMDYyLDcgKzIwOTEsNiBAQAogICAgICAgICAgICAgZnAuY2xvc2UoKQogCiAgICAgZGVmIHRlc3RfbWVzc2FnZV9mcm9tX3N0cmluZ193aXRoX2NsYXNzKHNlbGYpOgotICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzAxLnR4dCcpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHRleHQgPSBmcC5yZWFkKCkKQEAgLTIwNzMsNyArMjEwMSw3IEBACiAgICAgICAgICAgICBwYXNzCiAKICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyh0ZXh0LCBNeU1lc3NhZ2UpCi0gICAgICAgIHVubGVzcyhpc2luc3RhbmNlKG1zZywgTXlNZXNzYWdlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1zZywgTXlNZXNzYWdlKQogICAgICAgICAjIFRyeSBzb21ldGhpbmcgbW9yZSBjb21wbGljYXRlZAogICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMDIudHh0JykKICAgICAgICAgdHJ5OgpAQCAtMjA4MiwxMCArMjExMCw5IEBACiAgICAgICAgICAgICBmcC5jbG9zZSgpCiAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcodGV4dCwgTXlNZXNzYWdlKQogICAgICAgICBmb3Igc3VicGFydCBpbiBtc2cud2FsaygpOgotICAgICAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2Uoc3VicGFydCwgTXlNZXNzYWdlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdWJwYXJ0LCBNeU1lc3NhZ2UpCiAKICAgICBkZWYgdGVzdF9tZXNzYWdlX2Zyb21fZmlsZV93aXRoX2NsYXNzKHNlbGYpOgotICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgIyBDcmVhdGUgYSBzdWJjbGFzcwogICAgICAgICBjbGFzcyBNeU1lc3NhZ2UoTWVzc2FnZSk6CiAgICAgICAgICAgICBwYXNzCkBAIC0yMDk1LDcgKzIxMjIsNyBAQAogICAgICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX2ZpbGUoZnAsIE15TWVzc2FnZSkKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIGZwLmNsb3NlKCkKLSAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLCBNeU1lc3NhZ2UpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobXNnLCBNeU1lc3NhZ2UpCiAgICAgICAgICMgVHJ5IHNvbWV0aGluZyBtb3JlIGNvbXBsaWNhdGVkCiAgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18wMi50eHQnKQogICAgICAgICB0cnk6CkBAIC0yMTAzLDcgKzIxMzAsNyBAQAogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgZnAuY2xvc2UoKQogICAgICAgICBmb3Igc3VicGFydCBpbiBtc2cud2FsaygpOgotICAgICAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2Uoc3VicGFydCwgTXlNZXNzYWdlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdWJwYXJ0LCBNeU1lc3NhZ2UpCiAKICAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CiAgICAgICAgIG1vZHVsZSA9IF9faW1wb3J0X18oJ2VtYWlsJykKQEAgLTI0MjgsNyArMjQ1NSw3IEBACiAgICAgICAgIGVxKG1zZ1sndG8nXSwgJ3BwcEB6enoub3JnJykKICAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ211bHRpcGFydC9taXhlZCcpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobXNnLmlzX211bHRpcGFydCgpKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShtc2cuZ2V0X3BheWxvYWQoKSwgc3RyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1zZy5nZXRfcGF5bG9hZCgpLCBzdHIpCiAKICAgICBkZWYgdGVzdF93aGl0ZXNwYWNlX2NvbnRpbnVhdGlvbihzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCkBAIC0yODI0LDcgKzI4NTEsNyBAQAogICAgICAgICBoID0gSGVhZGVyKCJJIGFtIHRoZSB2ZXJ5IG1vZGVsIG9mIGEgbW9kZXJuIE1ham9yLUdlbmVyYWw7IEkndmUgaW5mb3JtYXRpb24gdmVnZXRhYmxlLCBhbmltYWwsIGFuZCBtaW5lcmFsOyBJIGtub3cgdGhlIGtpbmdzIG9mIEVuZ2xhbmQsIGFuZCBJIHF1b3RlIHRoZSBmaWdodHMgaGlzdG9yaWNhbCBmcm9tIE1hcmF0aG9uIHRvIFdhdGVybG9vLCBpbiBvcmRlciBjYXRlZ29yaWNhbDsgSSdtIHZlcnkgd2VsbCBhY3F1YWludGVkLCB0b28sIHdpdGggbWF0dGVycyBtYXRoZW1hdGljYWw7IEkgdW5kZXJzdGFuZCBlcXVhdGlvbnMsIGJvdGggdGhlIHNpbXBsZSBhbmQgcXVhZHJhdGljYWw7IGFib3V0IGJpbm9taWFsIHRoZW9yZW0gSSdtIHRlZW1pbmcgd2l0aCBhIGxvdCBvJyBuZXdzLCB3aXRoIG1hbnkgY2hlZXJmdWwgZmFjdHMgYWJvdXQgdGhlIHNxdWFyZSBvZiB0aGUgaHlwb3RlbnVzZS4iLAogICAgICAgICAgICAgICAgICAgIG1heGxpbmVsZW49NzYpCiAgICAgICAgIGZvciBsIGluIGguZW5jb2RlKHNwbGl0Y2hhcnM9JyAnKS5zcGxpdCgnXG4gJyk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGwpIDw9IDc2KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwobGVuKGwpLCA3NikKIAogICAgIGRlZiB0ZXN0X211bHRpbGluZ3VhbChzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC91dGlscy5weSBiL0xpYi9lbWFpbC91dGlscy5weQppbmRleCA2ZDIyY2E3Li5jOTc2MDIxIDEwMDY0NAotLS0gYS9MaWIvZW1haWwvdXRpbHMucHkKKysrIGIvTGliL2VtYWlsL3V0aWxzLnB5CkBAIC02Myw3ICs2Myw3IEBACiAgICAgIiIiRGVjb2RlcyBhIGJhc2U2NCBzdHJpbmcuCiAKICAgICBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gYmFzZTY0LmRlY29kZXN0cmluZyBhbmQgaXQncyByZXRhaW5lZCBvbmx5Ci0gICAgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIEl0IHVzZWQgdG8gcmVtb3ZlIHRoZSBsYXN0IFxuIG9mIHRoZSBkZWNvZGVkCisgICAgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIEl0IHVzZWQgdG8gcmVtb3ZlIHRoZSBsYXN0IFxcbiBvZiB0aGUgZGVjb2RlZAogICAgIHN0cmluZywgaWYgaXQgaGFkIGFueSAoc2VlIGlzc3VlIDcxNDMpLgogICAgICIiIgogICAgIGlmIG5vdCBzOgpAQCAtNzMsNyArNzMsNyBAQAogCiAMCiBkZWYgZml4X2VvbHMocyk6Ci0gICAgIiIiUmVwbGFjZSBhbGwgbGluZS1lbmRpbmcgY2hhcmFjdGVycyB3aXRoIFxyXG4uIiIiCisgICAgIiIiUmVwbGFjZSBhbGwgbGluZS1lbmRpbmcgY2hhcmFjdGVycyB3aXRoIFxcclxcbi4iIiIKICAgICAjIEZpeCBuZXdsaW5lcyB3aXRoIG5vIHByZWNlZGluZyBjYXJyaWFnZSByZXR1cm4KICAgICBzID0gcmUuc3ViKHInKD88IVxyKVxuJywgQ1JMRiwgcykKICAgICAjIEZpeCBjYXJyaWFnZSByZXR1cm5zIHdpdGggbm8gZm9sbG93aW5nIG5ld2xpbmUKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3Mvcm90XzEzLnB5IGIvTGliL2VuY29kaW5ncy9yb3RfMTMucHkKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQpkaWZmIC0tZ2l0IGEvTGliL2ZpbGVjbXAucHkgYi9MaWIvZmlsZWNtcC5weQppbmRleCA0NzI4MzE3Li4zYTc5MzgxIDEwMDY0NAotLS0gYS9MaWIvZmlsZWNtcC5weQorKysgYi9MaWIvZmlsZWNtcC5weQpAQCAtMjY4LDcgKzI2OCw3IEBACiBkZWYgX2NtcChhLCBiLCBzaCwgYWJzPWFicywgY21wPWNtcCk6CiAgICAgdHJ5OgogICAgICAgICByZXR1cm4gbm90IGFicyhjbXAoYSwgYiwgc2gpKQotICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICBleGNlcHQgKG9zLmVycm9yLCBJT0Vycm9yKToKICAgICAgICAgcmV0dXJuIDIKIAogCmRpZmYgLS1naXQgYS9MaWIvZmlsZWlucHV0LnB5IGIvTGliL2ZpbGVpbnB1dC5weQppbmRleCBiYTQ4NTc1Li4yMWMyZDFmIDEwMDY0NAotLS0gYS9MaWIvZmlsZWlucHV0LnB5CisrKyBiL0xpYi9maWxlaW5wdXQucHkKQEAgLTkwLDEyICs5MCwxMSBAQAogCiBkZWYgaW5wdXQoZmlsZXM9Tm9uZSwgaW5wbGFjZT0wLCBiYWNrdXA9IiIsIGJ1ZnNpemU9MCwKICAgICAgICAgICBtb2RlPSJyIiwgb3Blbmhvb2s9Tm9uZSk6Ci0gICAgIiIiaW5wdXQoW2ZpbGVzWywgaW5wbGFjZVssIGJhY2t1cFssIG1vZGVbLCBvcGVuaG9va11dXV1dKQorICAgICIiIlJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgRmlsZUlucHV0IGNsYXNzLCB3aGljaCBjYW4gYmUgaXRlcmF0ZWQuCiAKLSAgICBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIEZpbGVJbnB1dCBjbGFzcy4gVGhlIGluc3RhbmNlIHdpbGwgYmUgdXNlZAotICAgIGFzIGdsb2JhbCBzdGF0ZSBmb3IgdGhlIGZ1bmN0aW9ucyBvZiB0aGlzIG1vZHVsZSwgYW5kIGlzIGFsc28gcmV0dXJuZWQKLSAgICB0byB1c2UgZHVyaW5nIGl0ZXJhdGlvbi4gVGhlIHBhcmFtZXRlcnMgdG8gdGhpcyBmdW5jdGlvbiB3aWxsIGJlIHBhc3NlZAotICAgIGFsb25nIHRvIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgRmlsZUlucHV0IGNsYXNzLgorICAgIFRoZSBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBGaWxlSW5wdXQgY2xhc3MuCisgICAgVGhlIHJldHVybmVkIGluc3RhbmNlLCBpbiBhZGRpdGlvbiB0byBiZWluZyBhbiBpdGVyYXRvciwKKyAgICBrZWVwcyBnbG9iYWwgc3RhdGUgZm9yIHRoZSBmdW5jdGlvbnMgb2YgdGhpcyBtb2R1bGUsLgogICAgICIiIgogICAgIGdsb2JhbCBfc3RhdGUKICAgICBpZiBfc3RhdGUgYW5kIF9zdGF0ZS5fZmlsZToKQEAgLTE4Miw3ICsxODEsNyBAQAogICAgIHJldHVybiBfc3RhdGUuaXNzdGRpbigpCiAKIGNsYXNzIEZpbGVJbnB1dDoKLSAgICAiIiJjbGFzcyBGaWxlSW5wdXQoW2ZpbGVzWywgaW5wbGFjZVssIGJhY2t1cFssIG1vZGVbLCBvcGVuaG9va11dXV1dKQorICAgICIiIkZpbGVJbnB1dChbZmlsZXNbLCBpbnBsYWNlWywgYmFja3VwWywgYnVmc2l6ZVssIG1vZGVbLCBvcGVuaG9va11dXV1dXSkKIAogICAgIENsYXNzIEZpbGVJbnB1dCBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZHVsZTsgaXRzIG1ldGhvZHMKICAgICBmaWxlbmFtZSgpLCBsaW5lbm8oKSwgZmlsZWxpbmUoKSwgaXNmaXJzdGxpbmUoKSwgaXNzdGRpbigpLCBmaWxlbm8oKSwKQEAgLTM4OCw5ICszODcsMTAgQEAKIAogCiBkZWYgaG9va19lbmNvZGVkKGVuY29kaW5nKToKLSAgICBpbXBvcnQgY29kZWNzCisgICAgaW1wb3J0IGlvCiAgICAgZGVmIG9wZW5ob29rKGZpbGVuYW1lLCBtb2RlKToKLSAgICAgICAgcmV0dXJuIGNvZGVjcy5vcGVuKGZpbGVuYW1lLCBtb2RlLCBlbmNvZGluZykKKyAgICAgICAgbW9kZSA9IG1vZGUucmVwbGFjZSgnVScsICcnKS5yZXBsYWNlKCdiJywgJycpIG9yICdyJworICAgICAgICByZXR1cm4gaW8ub3BlbihmaWxlbmFtZSwgbW9kZSwgZW5jb2Rpbmc9ZW5jb2RpbmcsIG5ld2xpbmU9JycpCiAgICAgcmV0dXJuIG9wZW5ob29rCiAKIApkaWZmIC0tZ2l0IGEvTGliL2Z0cGxpYi5weSBiL0xpYi9mdHBsaWIucHkKaW5kZXggYzg5NjQzMy4uYzk4MjkwYyAxMDA2NDQKLS0tIGEvTGliL2Z0cGxpYi5weQorKysgYi9MaWIvZnRwbGliLnB5CkBAIC01NSw2ICs1NSw4IEBACiAKICMgVGhlIHN0YW5kYXJkIEZUUCBzZXJ2ZXIgY29udHJvbCBwb3J0CiBGVFBfUE9SVCA9IDIxCisjIFRoZSBzaXplaGludCBwYXJhbWV0ZXIgcGFzc2VkIHRvIHJlYWRsaW5lKCkgY2FsbHMKK01BWExJTkUgPSA4MTkyCiAKIAogIyBFeGNlcHRpb24gcmFpc2VkIHdoZW4gYW4gZXJyb3Igb3IgaW52YWxpZCByZXNwb25zZSBpcyByZWNlaXZlZApAQCAtMTAxLDYgKzEwMyw3IEBACiAgICAgZGVidWdnaW5nID0gMAogICAgIGhvc3QgPSAnJwogICAgIHBvcnQgPSBGVFBfUE9SVAorICAgIG1heGxpbmUgPSBNQVhMSU5FCiAgICAgc29jayA9IE5vbmUKICAgICBmaWxlID0gTm9uZQogICAgIHdlbGNvbWUgPSBOb25lCkBAIC0xODAsNyArMTgzLDkgQEAKICAgICAjIEludGVybmFsOiByZXR1cm4gb25lIGxpbmUgZnJvbSB0aGUgc2VydmVyLCBzdHJpcHBpbmcgQ1JMRi4KICAgICAjIFJhaXNlIEVPRkVycm9yIGlmIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZAogICAgIGRlZiBnZXRsaW5lKHNlbGYpOgotICAgICAgICBsaW5lID0gc2VsZi5maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgbGluZSA9IHNlbGYuZmlsZS5yZWFkbGluZShzZWxmLm1heGxpbmUgKyAxKQorICAgICAgICBpZiBsZW4obGluZSkgPiBzZWxmLm1heGxpbmU6CisgICAgICAgICAgICByYWlzZSBFcnJvcigiZ290IG1vcmUgdGhhbiAlZCBieXRlcyIgJSBzZWxmLm1heGxpbmUpCiAgICAgICAgIGlmIHNlbGYuZGVidWdnaW5nID4gMToKICAgICAgICAgICAgIHByaW50ICcqZ2V0KicsIHNlbGYuc2FuaXRpemUobGluZSkKICAgICAgICAgaWYgbm90IGxpbmU6IHJhaXNlIEVPRkVycm9yCkBAIC0yNzMsMjEgKzI3OCwyNCBAQAogCiAgICAgZGVmIG1ha2Vwb3J0KHNlbGYpOgogICAgICAgICAnJydDcmVhdGUgYSBuZXcgc29ja2V0IGFuZCBzZW5kIGEgUE9SVCBjb21tYW5kIGZvciBpdC4nJycKLSAgICAgICAgbXNnID0gImdldGFkZHJpbmZvIHJldHVybnMgYW4gZW1wdHkgbGlzdCIKKyAgICAgICAgZXJyID0gTm9uZQogICAgICAgICBzb2NrID0gTm9uZQogICAgICAgICBmb3IgcmVzIGluIHNvY2tldC5nZXRhZGRyaW5mbyhOb25lLCAwLCBzZWxmLmFmLCBzb2NrZXQuU09DS19TVFJFQU0sIDAsIHNvY2tldC5BSV9QQVNTSVZFKToKICAgICAgICAgICAgIGFmLCBzb2NrdHlwZSwgcHJvdG8sIGNhbm9ubmFtZSwgc2EgPSByZXMKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChhZiwgc29ja3R5cGUsIHByb3RvKQogICAgICAgICAgICAgICAgIHNvY2suYmluZChzYSkKLSAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIG1zZzoKKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGVycjoKICAgICAgICAgICAgICAgICBpZiBzb2NrOgogICAgICAgICAgICAgICAgICAgICBzb2NrLmNsb3NlKCkKICAgICAgICAgICAgICAgICBzb2NrID0gTm9uZQogICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICBicmVhawotICAgICAgICBpZiBub3Qgc29jazoKLSAgICAgICAgICAgIHJhaXNlIHNvY2tldC5lcnJvciwgbXNnCisgICAgICAgIGlmIHNvY2sgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIGVyciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSBlcnIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2Ugc29ja2V0LmVycm9yKCJnZXRhZGRyaW5mbyByZXR1cm5zIGFuIGVtcHR5IGxpc3QiKQogICAgICAgICBzb2NrLmxpc3RlbigxKQogICAgICAgICBwb3J0ID0gc29jay5nZXRzb2NrbmFtZSgpWzFdICMgR2V0IHByb3BlciBwb3J0CiAgICAgICAgIGhvc3QgPSBzZWxmLnNvY2suZ2V0c29ja25hbWUoKVswXSAjIEdldCBwcm9wZXIgaG9zdApAQCAtNDI5LDcgKzQzNyw5IEBACiAgICAgICAgIGNvbm4gPSBzZWxmLnRyYW5zZmVyY21kKGNtZCkKICAgICAgICAgZnAgPSBjb25uLm1ha2VmaWxlKCdyYicpCiAgICAgICAgIHdoaWxlIDE6Ci0gICAgICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKQorICAgICAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKHNlbGYubWF4bGluZSArIDEpCisgICAgICAgICAgICBpZiBsZW4obGluZSkgPiBzZWxmLm1heGxpbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IoImdvdCBtb3JlIHRoYW4gJWQgYnl0ZXMiICUgc2VsZi5tYXhsaW5lKQogICAgICAgICAgICAgaWYgc2VsZi5kZWJ1Z2dpbmcgPiAyOiBwcmludCAnKnJldHIqJywgcmVwcihsaW5lKQogICAgICAgICAgICAgaWYgbm90IGxpbmU6CiAgICAgICAgICAgICAgICAgYnJlYWsKQEAgLTQ1MSw3ICs0NjEsNyBAQAogICAgICAgICAgIGJsb2Nrc2l6ZTogVGhlIG1heGltdW0gZGF0YSBzaXplIHRvIHJlYWQgZnJvbSBmcCBhbmQgc2VuZCBvdmVyCiAgICAgICAgICAgICAgICAgICAgICB0aGUgY29ubmVjdGlvbiBhdCBvbmNlLiAgW2RlZmF1bHQ6IDgxOTJdCiAgICAgICAgICAgY2FsbGJhY2s6IEFuIG9wdGlvbmFsIHNpbmdsZSBwYXJhbWV0ZXIgY2FsbGFibGUgdGhhdCBpcyBjYWxsZWQgb24KLSAgICAgICAgICAgICAgICAgICAgb24gZWFjaCBibG9jayBvZiBkYXRhIGFmdGVyIGl0IGlzIHNlbnQuICBbZGVmYXVsdDogTm9uZV0KKyAgICAgICAgICAgICAgICAgICAgZWFjaCBibG9jayBvZiBkYXRhIGFmdGVyIGl0IGlzIHNlbnQuICBbZGVmYXVsdDogTm9uZV0KICAgICAgICAgICByZXN0OiBQYXNzZWQgdG8gdHJhbnNmZXJjbWQoKS4gIFtkZWZhdWx0OiBOb25lXQogCiAgICAgICAgIFJldHVybnM6CkBAIC00NzQsNyArNDg0LDcgQEAKICAgICAgICAgICBjbWQ6IEEgU1RPUiBjb21tYW5kLgogICAgICAgICAgIGZwOiBBIGZpbGUtbGlrZSBvYmplY3Qgd2l0aCBhIHJlYWRsaW5lKCkgbWV0aG9kLgogICAgICAgICAgIGNhbGxiYWNrOiBBbiBvcHRpb25hbCBzaW5nbGUgcGFyYW1ldGVyIGNhbGxhYmxlIHRoYXQgaXMgY2FsbGVkIG9uCi0gICAgICAgICAgICAgICAgICAgIG9uIGVhY2ggbGluZSBhZnRlciBpdCBpcyBzZW50LiAgW2RlZmF1bHQ6IE5vbmVdCisgICAgICAgICAgICAgICAgICAgIGVhY2ggbGluZSBhZnRlciBpdCBpcyBzZW50LiAgW2RlZmF1bHQ6IE5vbmVdCiAKICAgICAgICAgUmV0dXJuczoKICAgICAgICAgICBUaGUgcmVzcG9uc2UgY29kZS4KQEAgLTQ4Miw3ICs0OTIsOSBAQAogICAgICAgICBzZWxmLnZvaWRjbWQoJ1RZUEUgQScpCiAgICAgICAgIGNvbm4gPSBzZWxmLnRyYW5zZmVyY21kKGNtZCkKICAgICAgICAgd2hpbGUgMToKLSAgICAgICAgICAgIGJ1ZiA9IGZwLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGJ1ZiA9IGZwLnJlYWRsaW5lKHNlbGYubWF4bGluZSArIDEpCisgICAgICAgICAgICBpZiBsZW4oYnVmKSA+IHNlbGYubWF4bGluZToKKyAgICAgICAgICAgICAgICByYWlzZSBFcnJvcigiZ290IG1vcmUgdGhhbiAlZCBieXRlcyIgJSBzZWxmLm1heGxpbmUpCiAgICAgICAgICAgICBpZiBub3QgYnVmOiBicmVhawogICAgICAgICAgICAgaWYgYnVmWy0yOl0gIT0gQ1JMRjoKICAgICAgICAgICAgICAgICBpZiBidWZbLTFdIGluIENSTEY6IGJ1ZiA9IGJ1Zls6LTFdCkBAIC03MDcsNyArNzE5LDkgQEAKICAgICAgICAgICAgIGZwID0gY29ubi5tYWtlZmlsZSgncmInKQogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHdoaWxlIDE6Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUgPSBmcC5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBmcC5yZWFkbGluZShzZWxmLm1heGxpbmUgKyAxKQorICAgICAgICAgICAgICAgICAgICBpZiBsZW4obGluZSkgPiBzZWxmLm1heGxpbmU6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBFcnJvcigiZ290IG1vcmUgdGhhbiAlZCBieXRlcyIgJSBzZWxmLm1heGxpbmUpCiAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWdnaW5nID4gMjogcHJpbnQgJypyZXRyKicsIHJlcHIobGluZSkKICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawpAQCAtNzQ1LDcgKzc1OSw5IEBACiAgICAgICAgICAgICBjb25uID0gc2VsZi50cmFuc2ZlcmNtZChjbWQpCiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgd2hpbGUgMToKLSAgICAgICAgICAgICAgICAgICAgYnVmID0gZnAucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgICAgICBidWYgPSBmcC5yZWFkbGluZShzZWxmLm1heGxpbmUgKyAxKQorICAgICAgICAgICAgICAgICAgICBpZiBsZW4oYnVmKSA+IHNlbGYubWF4bGluZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yKCJnb3QgbW9yZSB0aGFuICVkIGJ5dGVzIiAlIHNlbGYubWF4bGluZSkKICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGJ1ZjogYnJlYWsKICAgICAgICAgICAgICAgICAgICAgaWYgYnVmWy0yOl0gIT0gQ1JMRjoKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGJ1ZlstMV0gaW4gQ1JMRjogYnVmID0gYnVmWzotMV0KQEAgLTkwMiw3ICs5MTgsOSBAQAogICAgICAgICBmcCA9IG9wZW4oZmlsZW5hbWUsICJyIikKICAgICAgICAgaW5fbWFjcm8gPSAwCiAgICAgICAgIHdoaWxlIDE6Ci0gICAgICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKQorICAgICAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKHNlbGYubWF4bGluZSArIDEpCisgICAgICAgICAgICBpZiBsZW4obGluZSkgPiBzZWxmLm1heGxpbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IoImdvdCBtb3JlIHRoYW4gJWQgYnl0ZXMiICUgc2VsZi5tYXhsaW5lKQogICAgICAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCiAgICAgICAgICAgICBpZiBpbl9tYWNybyBhbmQgbGluZS5zdHJpcCgpOgogICAgICAgICAgICAgICAgIG1hY3JvX2xpbmVzLmFwcGVuZChsaW5lKQpkaWZmIC0tZ2l0IGEvTGliL2dlbmVyaWNwYXRoLnB5IGIvTGliL2dlbmVyaWNwYXRoLnB5CmluZGV4IGEwYmY2MDEuLjdkZGI5NGMgMTAwNjQ0Ci0tLSBhL0xpYi9nZW5lcmljcGF0aC5weQorKysgYi9MaWIvZ2VuZXJpY3BhdGgucHkKQEAgLTIyLDcgKzIyLDcgQEAKIAogCiAjIFRoaXMgZm9sbG93cyBzeW1ib2xpYyBsaW5rcywgc28gYm90aCBpc2xpbmsoKSBhbmQgaXNkaXIoKSBjYW4gYmUgdHJ1ZQotIyBmb3IgdGhlIHNhbWUgcGF0aCBvbm8gc3lzdGVtcyB0aGF0IHN1cHBvcnQgc3ltbGlua3MKKyMgZm9yIHRoZSBzYW1lIHBhdGggb24gc3lzdGVtcyB0aGF0IHN1cHBvcnQgc3ltbGlua3MKIGRlZiBpc2ZpbGUocGF0aCk6CiAgICAgIiIiVGVzdCB3aGV0aGVyIGEgcGF0aCBpcyBhIHJlZ3VsYXIgZmlsZSIiIgogICAgIHRyeToKZGlmZiAtLWdpdCBhL0xpYi9nbG9iLnB5IGIvTGliL2dsb2IucHkKaW5kZXggMDQzNjRiZS4uZjM0NTM0YiAxMDA2NDQKLS0tIGEvTGliL2dsb2IucHkKKysrIGIvTGliL2dsb2IucHkKQEAgLTUsMTIgKzUsMjMgQEAKIGltcG9ydCByZQogaW1wb3J0IGZubWF0Y2gKIAordHJ5OgorICAgIF91bmljb2RlID0gdW5pY29kZQorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAjIElmIFB5dGhvbiBpcyBidWlsdCB3aXRob3V0IFVuaWNvZGUgc3VwcG9ydCwgdGhlIHVuaWNvZGUgdHlwZQorICAgICMgd2lsbCBub3QgZXhpc3QuIEZha2Ugb25lLgorICAgIGNsYXNzIF91bmljb2RlKG9iamVjdCk6CisgICAgICAgIHBhc3MKKwogX19hbGxfXyA9IFsiZ2xvYiIsICJpZ2xvYiJdCiAKIGRlZiBnbG9iKHBhdGhuYW1lKToKICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHBhdGhzIG1hdGNoaW5nIGEgcGF0aG5hbWUgcGF0dGVybi4KIAotICAgIFRoZSBwYXR0ZXJuIG1heSBjb250YWluIHNpbXBsZSBzaGVsbC1zdHlsZSB3aWxkY2FyZHMgYSBsYSBmbm1hdGNoLgorICAgIFRoZSBwYXR0ZXJuIG1heSBjb250YWluIHNpbXBsZSBzaGVsbC1zdHlsZSB3aWxkY2FyZHMgYSBsYQorICAgIGZubWF0Y2guIEhvd2V2ZXIsIHVubGlrZSBmbm1hdGNoLCBmaWxlbmFtZXMgc3RhcnRpbmcgd2l0aCBhCisgICAgZG90IGFyZSBzcGVjaWFsIGNhc2VzIHRoYXQgYXJlIG5vdCBtYXRjaGVkIGJ5ICcqJyBhbmQgJz8nCisgICAgcGF0dGVybnMuCiAKICAgICAiIiIKICAgICByZXR1cm4gbGlzdChpZ2xvYihwYXRobmFtZSkpCkBAIC0xOCw3ICsyOSwxMCBAQAogZGVmIGlnbG9iKHBhdGhuYW1lKToKICAgICAiIiJSZXR1cm4gYW4gaXRlcmF0b3Igd2hpY2ggeWllbGRzIHRoZSBwYXRocyBtYXRjaGluZyBhIHBhdGhuYW1lIHBhdHRlcm4uCiAKLSAgICBUaGUgcGF0dGVybiBtYXkgY29udGFpbiBzaW1wbGUgc2hlbGwtc3R5bGUgd2lsZGNhcmRzIGEgbGEgZm5tYXRjaC4KKyAgICBUaGUgcGF0dGVybiBtYXkgY29udGFpbiBzaW1wbGUgc2hlbGwtc3R5bGUgd2lsZGNhcmRzIGEgbGEKKyAgICBmbm1hdGNoLiBIb3dldmVyLCB1bmxpa2UgZm5tYXRjaCwgZmlsZW5hbWVzIHN0YXJ0aW5nIHdpdGggYQorICAgIGRvdCBhcmUgc3BlY2lhbCBjYXNlcyB0aGF0IGFyZSBub3QgbWF0Y2hlZCBieSAnKicgYW5kICc/JworICAgIHBhdHRlcm5zLgogCiAgICAgIiIiCiAgICAgaWYgbm90IGhhc19tYWdpYyhwYXRobmFtZSk6CkBAIC0zMCw3ICs0NCwxMCBAQAogICAgICAgICBmb3IgbmFtZSBpbiBnbG9iMShvcy5jdXJkaXIsIGJhc2VuYW1lKToKICAgICAgICAgICAgIHlpZWxkIG5hbWUKICAgICAgICAgcmV0dXJuCi0gICAgaWYgaGFzX21hZ2ljKGRpcm5hbWUpOgorICAgICMgYG9zLnBhdGguc3BsaXQoKWAgcmV0dXJucyB0aGUgYXJndW1lbnQgaXRzZWxmIGFzIGEgZGlybmFtZSBpZiBpdCBpcyBhCisgICAgIyBkcml2ZSBvciBVTkMgcGF0aC4gIFByZXZlbnQgYW4gaW5maW5pdGUgcmVjdXJzaW9uIGlmIGEgZHJpdmUgb3IgVU5DIHBhdGgKKyAgICAjIGNvbnRhaW5zIG1hZ2ljIGNoYXJhY3RlcnMgKGkuZS4gcidcXD9cQzonKS4KKyAgICBpZiBkaXJuYW1lICE9IHBhdGhuYW1lIGFuZCBoYXNfbWFnaWMoZGlybmFtZSk6CiAgICAgICAgIGRpcnMgPSBpZ2xvYihkaXJuYW1lKQogICAgIGVsc2U6CiAgICAgICAgIGRpcnMgPSBbZGlybmFtZV0KQEAgLTQ5LDcgKzY2LDcgQEAKIGRlZiBnbG9iMShkaXJuYW1lLCBwYXR0ZXJuKToKICAgICBpZiBub3QgZGlybmFtZToKICAgICAgICAgZGlybmFtZSA9IG9zLmN1cmRpcgotICAgIGlmIGlzaW5zdGFuY2UocGF0dGVybiwgdW5pY29kZSkgYW5kIG5vdCBpc2luc3RhbmNlKGRpcm5hbWUsIHVuaWNvZGUpOgorICAgIGlmIGlzaW5zdGFuY2UocGF0dGVybiwgX3VuaWNvZGUpIGFuZCBub3QgaXNpbnN0YW5jZShkaXJuYW1lLCB1bmljb2RlKToKICAgICAgICAgZGlybmFtZSA9IHVuaWNvZGUoZGlybmFtZSwgc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKSkKICAgICB0cnk6CmRpZmYgLS1naXQgYS9MaWIvZ3ppcC5weSBiL0xpYi9nemlwLnB5CmluZGV4IDJiY2I0ZGIuLmE2MTNiYWUgMTAwNjQ0Ci0tLSBhL0xpYi9nemlwLnB5CisrKyBiL0xpYi9nemlwLnB5CkBAIC02Niw5ICs2NiwxMCBAQAogICAgICAgICBCZSBhd2FyZSB0aGF0IG9ubHkgdGhlICdyYicsICdhYicsIGFuZCAnd2InIHZhbHVlcyBzaG91bGQgYmUgdXNlZAogICAgICAgICBmb3IgY3Jvc3MtcGxhdGZvcm0gcG9ydGFiaWxpdHkuCiAKLSAgICAgICAgVGhlIGNvbXByZXNzbGV2ZWwgYXJndW1lbnQgaXMgYW4gaW50ZWdlciBmcm9tIDEgdG8gOSBjb250cm9sbGluZyB0aGUKKyAgICAgICAgVGhlIGNvbXByZXNzbGV2ZWwgYXJndW1lbnQgaXMgYW4gaW50ZWdlciBmcm9tIDAgdG8gOSBjb250cm9sbGluZyB0aGUKICAgICAgICAgbGV2ZWwgb2YgY29tcHJlc3Npb247IDEgaXMgZmFzdGVzdCBhbmQgcHJvZHVjZXMgdGhlIGxlYXN0IGNvbXByZXNzaW9uLAotICAgICAgICBhbmQgOSBpcyBzbG93ZXN0IGFuZCBwcm9kdWNlcyB0aGUgbW9zdCBjb21wcmVzc2lvbi4gIFRoZSBkZWZhdWx0IGlzIDkuCisgICAgICAgIGFuZCA5IGlzIHNsb3dlc3QgYW5kIHByb2R1Y2VzIHRoZSBtb3N0IGNvbXByZXNzaW9uLiAwIGlzIG5vIGNvbXByZXNzaW9uCisgICAgICAgIGF0IGFsbC4gVGhlIGRlZmF1bHQgaXMgOS4KIAogICAgICAgICBUaGUgbXRpbWUgYXJndW1lbnQgaXMgYW4gb3B0aW9uYWwgbnVtZXJpYyB0aW1lc3RhbXAgdG8gYmUgd3JpdHRlbgogICAgICAgICB0byB0aGUgc3RyZWFtIHdoZW4gY29tcHJlc3NpbmcuICBBbGwgZ3ppcCBjb21wcmVzc2VkIHN0cmVhbXMKQEAgLTgxLDYgKzgyLDEwIEBACiAKICAgICAgICAgIiIiCiAKKyAgICAgICAgIyBNYWtlIHN1cmUgd2UgZG9uJ3QgaW5hZHZlcnRlbnRseSBlbmFibGUgdW5pdmVyc2FsIG5ld2xpbmVzIG9uIHRoZQorICAgICAgICAjIHVuZGVybHlpbmcgZmlsZSBvYmplY3QgLSBpbiByZWFkIG1vZGUsIHRoaXMgY2F1c2VzIGRhdGEgY29ycnVwdGlvbi4KKyAgICAgICAgaWYgbW9kZToKKyAgICAgICAgICAgIG1vZGUgPSBtb2RlLnJlcGxhY2UoJ1UnLCAnJykKICAgICAgICAgIyBndWFyYW50ZWUgdGhlIGZpbGUgaXMgb3BlbmVkIGluIGJpbmFyeSBtb2RlIG9uIHBsYXRmb3JtcwogICAgICAgICAjIHRoYXQgY2FyZSBhYm91dCB0aGF0IHNvcnQgb2YgdGhpbmcKICAgICAgICAgaWYgbW9kZSBhbmQgJ2InIG5vdCBpbiBtb2RlOgpAQCAtODgsOCArOTMsMTIgQEAKICAgICAgICAgaWYgZmlsZW9iaiBpcyBOb25lOgogICAgICAgICAgICAgZmlsZW9iaiA9IHNlbGYubXlmaWxlb2JqID0gX19idWlsdGluX18ub3BlbihmaWxlbmFtZSwgbW9kZSBvciAncmInKQogICAgICAgICBpZiBmaWxlbmFtZSBpcyBOb25lOgotICAgICAgICAgICAgaWYgaGFzYXR0cihmaWxlb2JqLCAnbmFtZScpOiBmaWxlbmFtZSA9IGZpbGVvYmoubmFtZQotICAgICAgICAgICAgZWxzZTogZmlsZW5hbWUgPSAnJworICAgICAgICAgICAgIyBJc3N1ZSAjMTM3ODE6IG9zLmZkb3BlbigpIGNyZWF0ZXMgYSBmaWxlb2JqIHdpdGggYSBib2d1cyBuYW1lCisgICAgICAgICAgICAjIGF0dHJpYnV0ZS4gQXZvaWQgc2F2aW5nIHRoaXMgaW4gdGhlIGd6aXAgaGVhZGVyJ3MgZmlsZW5hbWUgZmllbGQuCisgICAgICAgICAgICBpZiBoYXNhdHRyKGZpbGVvYmosICduYW1lJykgYW5kIGZpbGVvYmoubmFtZSAhPSAnPGZkb3Blbj4nOgorICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW9iai5uYW1lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gJycKICAgICAgICAgaWYgbW9kZSBpcyBOb25lOgogICAgICAgICAgICAgaWYgaGFzYXR0cihmaWxlb2JqLCAnbW9kZScpOiBtb2RlID0gZmlsZW9iai5tb2RlCiAgICAgICAgICAgICBlbHNlOiBtb2RlID0gJ3JiJwpAQCAtNDEzLDcgKzQyMiw3IEBACiAgICAgICAgICAgICBpZiBvZmZzZXQgPCBzZWxmLm9mZnNldDoKICAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCdOZWdhdGl2ZSBzZWVrIGluIHdyaXRlIG1vZGUnKQogICAgICAgICAgICAgY291bnQgPSBvZmZzZXQgLSBzZWxmLm9mZnNldAotICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoY291bnQgLy8gMTAyNCk6CisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoY291bnQgLy8gMTAyNCk6CiAgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgxMDI0ICogJ1wwJykKICAgICAgICAgICAgIHNlbGYud3JpdGUoKGNvdW50ICUgMTAyNCkgKiAnXDAnKQogICAgICAgICBlbGlmIHNlbGYubW9kZSA9PSBSRUFEOgpAQCAtNDIxLDcgKzQzMCw3IEBACiAgICAgICAgICAgICAgICAgIyBmb3IgbmVnYXRpdmUgc2VlaywgcmV3aW5kIGFuZCBkbyBwb3NpdGl2ZSBzZWVrCiAgICAgICAgICAgICAgICAgc2VsZi5yZXdpbmQoKQogICAgICAgICAgICAgY291bnQgPSBvZmZzZXQgLSBzZWxmLm9mZnNldAotICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoY291bnQgLy8gMTAyNCk6CisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoY291bnQgLy8gMTAyNCk6CiAgICAgICAgICAgICAgICAgc2VsZi5yZWFkKDEwMjQpCiAgICAgICAgICAgICBzZWxmLnJlYWQoY291bnQgJSAxMDI0KQogCmRpZmYgLS1naXQgYS9MaWIvaGFzaGxpYi5weSBiL0xpYi9oYXNobGliLnB5CmluZGV4IDI3MzJkMTguLjZkNjlhZDIgMTAwNjQ0Ci0tLSBhL0xpYi9oYXNobGliLnB5CisrKyBiL0xpYi9oYXNobGliLnB5CkBAIC02MCw3ICs2MCw3IEBACiAKIGFsZ29yaXRobXMgPSBfX2Fsd2F5c19zdXBwb3J0ZWQKIAotX19hbGxfXyA9IF9fYWx3YXlzX3N1cHBvcnRlZCArICgnbmV3JywgJ2FsZ29yaXRobXMnKQorX19hbGxfXyA9IF9fYWx3YXlzX3N1cHBvcnRlZCArICgnbmV3JywgJ2FsZ29yaXRobXMnLCAncGJrZGYyX2htYWMnKQogCiAKIGRlZiBfX2dldF9idWlsdGluX2NvbnN0cnVjdG9yKG5hbWUpOgpAQCAtODgsNyArODgsNyBAQAogICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgcGFzcyAgIyBubyBleHRlbnNpb24gbW9kdWxlLCB0aGlzIGhhc2ggaXMgdW5zdXBwb3J0ZWQuCiAKLSAgICByYWlzZSBWYWx1ZUVycm9yKCd1bnN1cHBvcnRlZCBoYXNoIHR5cGUgJXMnICUgbmFtZSkKKyAgICByYWlzZSBWYWx1ZUVycm9yKCd1bnN1cHBvcnRlZCBoYXNoIHR5cGUgJyArIG5hbWUpCiAKIAogZGVmIF9fZ2V0X29wZW5zc2xfY29uc3RydWN0b3IobmFtZSk6CkBAIC0xNDEsNiArMTQxLDczIEBACiAgICAgICAgIGltcG9ydCBsb2dnaW5nCiAgICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKCdjb2RlIGZvciBoYXNoICVzIHdhcyBub3QgZm91bmQuJywgX19mdW5jX25hbWUpCiAKKwordHJ5OgorICAgICMgT3BlblNTTCdzIFBLQ1M1X1BCS0RGMl9ITUFDIHJlcXVpcmVzIE9wZW5TU0wgMS4wKyB3aXRoIEhNQUMgYW5kIFNIQQorICAgIGZyb20gX2hhc2hsaWIgaW1wb3J0IHBia2RmMl9obWFjCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgaW1wb3J0IGJpbmFzY2lpCisgICAgaW1wb3J0IHN0cnVjdAorCisgICAgX3RyYW5zXzVDID0gYiIiLmpvaW4oY2hyKHggXiAweDVDKSBmb3IgeCBpbiByYW5nZSgyNTYpKQorICAgIF90cmFuc18zNiA9IGIiIi5qb2luKGNocih4IF4gMHgzNikgZm9yIHggaW4gcmFuZ2UoMjU2KSkKKworICAgIGRlZiBwYmtkZjJfaG1hYyhoYXNoX25hbWUsIHBhc3N3b3JkLCBzYWx0LCBpdGVyYXRpb25zLCBka2xlbj1Ob25lKToKKyAgICAgICAgIiIiUGFzc3dvcmQgYmFzZWQga2V5IGRlcml2YXRpb24gZnVuY3Rpb24gMiAoUEtDUyAjNSB2Mi4wKQorCisgICAgICAgIFRoaXMgUHl0aG9uIGltcGxlbWVudGF0aW9ucyBiYXNlZCBvbiB0aGUgaG1hYyBtb2R1bGUgYWJvdXQgYXMgZmFzdAorICAgICAgICBhcyBPcGVuU1NMJ3MgUEtDUzVfUEJLREYyX0hNQUMgZm9yIHNob3J0IHBhc3N3b3JkcyBhbmQgbXVjaCBmYXN0ZXIKKyAgICAgICAgZm9yIGxvbmcgcGFzc3dvcmRzLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaGFzaF9uYW1lLCBzdHIpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKGhhc2hfbmFtZSkKKworICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShwYXNzd29yZCwgKGJ5dGVzLCBieXRlYXJyYXkpKToKKyAgICAgICAgICAgIHBhc3N3b3JkID0gYnl0ZXMoYnVmZmVyKHBhc3N3b3JkKSkKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc2FsdCwgKGJ5dGVzLCBieXRlYXJyYXkpKToKKyAgICAgICAgICAgIHNhbHQgPSBieXRlcyhidWZmZXIoc2FsdCkpCisKKyAgICAgICAgIyBGYXN0IGlubGluZSBITUFDIGltcGxlbWVudGF0aW9uCisgICAgICAgIGlubmVyID0gbmV3KGhhc2hfbmFtZSkKKyAgICAgICAgb3V0ZXIgPSBuZXcoaGFzaF9uYW1lKQorICAgICAgICBibG9ja3NpemUgPSBnZXRhdHRyKGlubmVyLCAnYmxvY2tfc2l6ZScsIDY0KQorICAgICAgICBpZiBsZW4ocGFzc3dvcmQpID4gYmxvY2tzaXplOgorICAgICAgICAgICAgcGFzc3dvcmQgPSBuZXcoaGFzaF9uYW1lLCBwYXNzd29yZCkuZGlnZXN0KCkKKyAgICAgICAgcGFzc3dvcmQgPSBwYXNzd29yZCArIGInXHgwMCcgKiAoYmxvY2tzaXplIC0gbGVuKHBhc3N3b3JkKSkKKyAgICAgICAgaW5uZXIudXBkYXRlKHBhc3N3b3JkLnRyYW5zbGF0ZShfdHJhbnNfMzYpKQorICAgICAgICBvdXRlci51cGRhdGUocGFzc3dvcmQudHJhbnNsYXRlKF90cmFuc181QykpCisKKyAgICAgICAgZGVmIHByZihtc2csIGlubmVyPWlubmVyLCBvdXRlcj1vdXRlcik6CisgICAgICAgICAgICAjIFBCS0RGMl9ITUFDIHVzZXMgdGhlIHBhc3N3b3JkIGFzIGtleS4gV2UgY2FuIHJlLXVzZSB0aGUgc2FtZQorICAgICAgICAgICAgIyBkaWdlc3Qgb2JqZWN0cyBhbmQgYW5kIGp1c3QgdXBkYXRlIGNvcGllcyB0byBza2lwIGluaXRpYWxpemF0aW9uLgorICAgICAgICAgICAgaWNweSA9IGlubmVyLmNvcHkoKQorICAgICAgICAgICAgb2NweSA9IG91dGVyLmNvcHkoKQorICAgICAgICAgICAgaWNweS51cGRhdGUobXNnKQorICAgICAgICAgICAgb2NweS51cGRhdGUoaWNweS5kaWdlc3QoKSkKKyAgICAgICAgICAgIHJldHVybiBvY3B5LmRpZ2VzdCgpCisKKyAgICAgICAgaWYgaXRlcmF0aW9ucyA8IDE6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGl0ZXJhdGlvbnMpCisgICAgICAgIGlmIGRrbGVuIGlzIE5vbmU6CisgICAgICAgICAgICBka2xlbiA9IG91dGVyLmRpZ2VzdF9zaXplCisgICAgICAgIGlmIGRrbGVuIDwgMToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZGtsZW4pCisKKyAgICAgICAgaGV4X2Zvcm1hdF9zdHJpbmcgPSAiJSUwJWl4IiAlIChuZXcoaGFzaF9uYW1lKS5kaWdlc3Rfc2l6ZSAqIDIpCisKKyAgICAgICAgZGtleSA9IGInJworICAgICAgICBsb29wID0gMQorICAgICAgICB3aGlsZSBsZW4oZGtleSkgPCBka2xlbjoKKyAgICAgICAgICAgIHByZXYgPSBwcmYoc2FsdCArIHN0cnVjdC5wYWNrKGInPkknLCBsb29wKSkKKyAgICAgICAgICAgIHJrZXkgPSBpbnQoYmluYXNjaWkuaGV4bGlmeShwcmV2KSwgMTYpCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoaXRlcmF0aW9ucyAtIDEpOgorICAgICAgICAgICAgICAgIHByZXYgPSBwcmYocHJldikKKyAgICAgICAgICAgICAgICBya2V5IF49IGludChiaW5hc2NpaS5oZXhsaWZ5KHByZXYpLCAxNikKKyAgICAgICAgICAgIGxvb3AgKz0gMQorICAgICAgICAgICAgZGtleSArPSBiaW5hc2NpaS51bmhleGxpZnkoaGV4X2Zvcm1hdF9zdHJpbmcgJSBya2V5KQorCisgICAgICAgIHJldHVybiBka2V5Wzpka2xlbl0KKwogIyBDbGVhbnVwIGxvY2FscygpCiBkZWwgX19hbHdheXNfc3VwcG9ydGVkLCBfX2Z1bmNfbmFtZSwgX19nZXRfaGFzaAogZGVsIF9fcHlfbmV3LCBfX2hhc2hfbmV3LCBfX2dldF9vcGVuc3NsX2NvbnN0cnVjdG9yCmRpZmYgLS1naXQgYS9MaWIvaGVhcHEucHkgYi9MaWIvaGVhcHEucHkKaW5kZXggNmE0ZTBmNC4uNGIyYzBjNCAxMDA2NDQKLS0tIGEvTGliL2hlYXBxLnB5CisrKyBiL0xpYi9oZWFwcS5weQpAQCAtMTI5LDkgKzEyOSw4IEBACiBfX2FsbF9fID0gWydoZWFwcHVzaCcsICdoZWFwcG9wJywgJ2hlYXBpZnknLCAnaGVhcHJlcGxhY2UnLCAnbWVyZ2UnLAogICAgICAgICAgICAnbmxhcmdlc3QnLCAnbnNtYWxsZXN0JywgJ2hlYXBwdXNocG9wJ10KIAotZnJvbSBpdGVydG9vbHMgaW1wb3J0IGlzbGljZSwgcmVwZWF0LCBjb3VudCwgaW1hcCwgaXppcCwgdGVlLCBjaGFpbgorZnJvbSBpdGVydG9vbHMgaW1wb3J0IGlzbGljZSwgY291bnQsIGltYXAsIGl6aXAsIHRlZSwgY2hhaW4KIGZyb20gb3BlcmF0b3IgaW1wb3J0IGl0ZW1nZXR0ZXIKLWltcG9ydCBiaXNlY3QKIAogZGVmIGNtcF9sdCh4LCB5KToKICAgICAjIFVzZSBfX2x0X18gaWYgYXZhaWxhYmxlOyBvdGhlcndpc2UsIHRyeSBfX2xlX18uCkBAIC0xODgsNiArMTg3LDE5IEBACiAgICAgZm9yIGkgaW4gcmV2ZXJzZWQoeHJhbmdlKG4vLzIpKToKICAgICAgICAgX3NpZnR1cCh4LCBpKQogCitkZWYgX2hlYXBwdXNocG9wX21heChoZWFwLCBpdGVtKToKKyAgICAiIiJNYXhoZWFwIHZlcnNpb24gb2YgYSBoZWFwcHVzaCBmb2xsb3dlZCBieSBhIGhlYXBwb3AuIiIiCisgICAgaWYgaGVhcCBhbmQgY21wX2x0KGl0ZW0sIGhlYXBbMF0pOgorICAgICAgICBpdGVtLCBoZWFwWzBdID0gaGVhcFswXSwgaXRlbQorICAgICAgICBfc2lmdHVwX21heChoZWFwLCAwKQorICAgIHJldHVybiBpdGVtCisKK2RlZiBfaGVhcGlmeV9tYXgoeCk6CisgICAgIiIiVHJhbnNmb3JtIGxpc3QgaW50byBhIG1heGhlYXAsIGluLXBsYWNlLCBpbiBPKGxlbih4KSkgdGltZS4iIiIKKyAgICBuID0gbGVuKHgpCisgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2Uobi8vMikpOgorICAgICAgICBfc2lmdHVwX21heCh4LCBpKQorCiBkZWYgbmxhcmdlc3QobiwgaXRlcmFibGUpOgogICAgICIiIkZpbmQgdGhlIG4gbGFyZ2VzdCBlbGVtZW50cyBpbiBhIGRhdGFzZXQuCiAKQEAgLTIxMywzMCArMjI1LDE2IEBACiAgICAgIiIiCiAgICAgaWYgbiA8IDA6CiAgICAgICAgIHJldHVybiBbXQotICAgIGlmIGhhc2F0dHIoaXRlcmFibGUsICdfX2xlbl9fJykgYW5kIG4gKiAxMCA8PSBsZW4oaXRlcmFibGUpOgotICAgICAgICAjIEZvciBzbWFsbGVyIHZhbHVlcyBvZiBuLCB0aGUgYmlzZWN0IG1ldGhvZCBpcyBmYXN0ZXIgdGhhbiBhIG1pbmhlYXAuCi0gICAgICAgICMgSXQgaXMgYWxzbyBtZW1vcnkgZWZmaWNpZW50LCBjb25zdW1pbmcgb25seSBuIGVsZW1lbnRzIG9mIHNwYWNlLgotICAgICAgICBpdCA9IGl0ZXIoaXRlcmFibGUpCi0gICAgICAgIHJlc3VsdCA9IHNvcnRlZChpc2xpY2UoaXQsIDAsIG4pKQotICAgICAgICBpZiBub3QgcmVzdWx0OgotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAotICAgICAgICBpbnNvcnQgPSBiaXNlY3QuaW5zb3J0Ci0gICAgICAgIHBvcCA9IHJlc3VsdC5wb3AKLSAgICAgICAgbG9zID0gcmVzdWx0Wy0xXSAgICAjIGxvcyAtLT4gTGFyZ2VzdCBvZiB0aGUgbnNtYWxsZXN0Ci0gICAgICAgIGZvciBlbGVtIGluIGl0OgotICAgICAgICAgICAgaWYgY21wX2x0KGVsZW0sIGxvcyk6Ci0gICAgICAgICAgICAgICAgaW5zb3J0KHJlc3VsdCwgZWxlbSkKLSAgICAgICAgICAgICAgICBwb3AoKQotICAgICAgICAgICAgICAgIGxvcyA9IHJlc3VsdFstMV0KKyAgICBpdCA9IGl0ZXIoaXRlcmFibGUpCisgICAgcmVzdWx0ID0gbGlzdChpc2xpY2UoaXQsIG4pKQorICAgIGlmIG5vdCByZXN1bHQ6CiAgICAgICAgIHJldHVybiByZXN1bHQKLSAgICAjIEFuIGFsdGVybmF0aXZlIGFwcHJvYWNoIG1hbmlmZXN0cyB0aGUgd2hvbGUgaXRlcmFibGUgaW4gbWVtb3J5IGJ1dAotICAgICMgc2F2ZXMgY29tcGFyaXNvbnMgYnkgaGVhcGlmeWluZyBhbGwgYXQgb25jZS4gIEFsc28sIHNhdmVzIHRpbWUKLSAgICAjIG92ZXIgYmlzZWN0Lmluc29ydCgpIHdoaWNoIGhhcyBPKG4pIGRhdGEgbW92ZW1lbnQgdGltZSBmb3IgZXZlcnkKLSAgICAjIGluc2VydGlvbi4gIEZpbmRpbmcgdGhlIG4gc21hbGxlc3Qgb2YgYW4gbSBsZW5ndGggaXRlcmFibGUgcmVxdWlyZXMKLSAgICAjICAgIE8obSkgKyBPKG4gbG9nIG0pIGNvbXBhcmlzb25zLgotICAgIGggPSBsaXN0KGl0ZXJhYmxlKQotICAgIGhlYXBpZnkoaCkKLSAgICByZXR1cm4gbWFwKGhlYXBwb3AsIHJlcGVhdChoLCBtaW4obiwgbGVuKGgpKSkpCisgICAgX2hlYXBpZnlfbWF4KHJlc3VsdCkKKyAgICBfaGVhcHB1c2hwb3AgPSBfaGVhcHB1c2hwb3BfbWF4CisgICAgZm9yIGVsZW0gaW4gaXQ6CisgICAgICAgIF9oZWFwcHVzaHBvcChyZXN1bHQsIGVsZW0pCisgICAgcmVzdWx0LnNvcnQoKQorICAgIHJldHVybiByZXN1bHQKIAogIyAnaGVhcCcgaXMgYSBoZWFwIGF0IGFsbCBpbmRpY2VzID49IHN0YXJ0cG9zLCBleGNlcHQgcG9zc2libHkgZm9yIHBvcy4gIHBvcwogIyBpcyB0aGUgaW5kZXggb2YgYSBsZWFmIHdpdGggYSBwb3NzaWJseSBvdXQtb2Ytb3JkZXIgdmFsdWUuICBSZXN0b3JlIHRoZQpAQCAtMzE0LDYgKzMxMiw0MiBAQAogICAgIGhlYXBbcG9zXSA9IG5ld2l0ZW0KICAgICBfc2lmdGRvd24oaGVhcCwgc3RhcnRwb3MsIHBvcykKIAorZGVmIF9zaWZ0ZG93bl9tYXgoaGVhcCwgc3RhcnRwb3MsIHBvcyk6CisgICAgJ01heGhlYXAgdmFyaWFudCBvZiBfc2lmdGRvd24nCisgICAgbmV3aXRlbSA9IGhlYXBbcG9zXQorICAgICMgRm9sbG93IHRoZSBwYXRoIHRvIHRoZSByb290LCBtb3ZpbmcgcGFyZW50cyBkb3duIHVudGlsIGZpbmRpbmcgYSBwbGFjZQorICAgICMgbmV3aXRlbSBmaXRzLgorICAgIHdoaWxlIHBvcyA+IHN0YXJ0cG9zOgorICAgICAgICBwYXJlbnRwb3MgPSAocG9zIC0gMSkgPj4gMQorICAgICAgICBwYXJlbnQgPSBoZWFwW3BhcmVudHBvc10KKyAgICAgICAgaWYgY21wX2x0KHBhcmVudCwgbmV3aXRlbSk6CisgICAgICAgICAgICBoZWFwW3Bvc10gPSBwYXJlbnQKKyAgICAgICAgICAgIHBvcyA9IHBhcmVudHBvcworICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgYnJlYWsKKyAgICBoZWFwW3Bvc10gPSBuZXdpdGVtCisKK2RlZiBfc2lmdHVwX21heChoZWFwLCBwb3MpOgorICAgICdNYXhoZWFwIHZhcmlhbnQgb2YgX3NpZnR1cCcKKyAgICBlbmRwb3MgPSBsZW4oaGVhcCkKKyAgICBzdGFydHBvcyA9IHBvcworICAgIG5ld2l0ZW0gPSBoZWFwW3Bvc10KKyAgICAjIEJ1YmJsZSB1cCB0aGUgbGFyZ2VyIGNoaWxkIHVudGlsIGhpdHRpbmcgYSBsZWFmLgorICAgIGNoaWxkcG9zID0gMipwb3MgKyAxICAgICMgbGVmdG1vc3QgY2hpbGQgcG9zaXRpb24KKyAgICB3aGlsZSBjaGlsZHBvcyA8IGVuZHBvczoKKyAgICAgICAgIyBTZXQgY2hpbGRwb3MgdG8gaW5kZXggb2YgbGFyZ2VyIGNoaWxkLgorICAgICAgICByaWdodHBvcyA9IGNoaWxkcG9zICsgMQorICAgICAgICBpZiByaWdodHBvcyA8IGVuZHBvcyBhbmQgbm90IGNtcF9sdChoZWFwW3JpZ2h0cG9zXSwgaGVhcFtjaGlsZHBvc10pOgorICAgICAgICAgICAgY2hpbGRwb3MgPSByaWdodHBvcworICAgICAgICAjIE1vdmUgdGhlIGxhcmdlciBjaGlsZCB1cC4KKyAgICAgICAgaGVhcFtwb3NdID0gaGVhcFtjaGlsZHBvc10KKyAgICAgICAgcG9zID0gY2hpbGRwb3MKKyAgICAgICAgY2hpbGRwb3MgPSAyKnBvcyArIDEKKyAgICAjIFRoZSBsZWFmIGF0IHBvcyBpcyBlbXB0eSBub3cuICBQdXQgbmV3aXRlbSB0aGVyZSwgYW5kIGJ1YmJsZSBpdCB1cAorICAgICMgdG8gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UgKGJ5IHNpZnRpbmcgaXRzIHBhcmVudHMgZG93bikuCisgICAgaGVhcFtwb3NdID0gbmV3aXRlbQorICAgIF9zaWZ0ZG93bl9tYXgoaGVhcCwgc3RhcnRwb3MsIHBvcykKKwogIyBJZiBhdmFpbGFibGUsIHVzZSBDIGltcGxlbWVudGF0aW9uCiB0cnk6CiAgICAgZnJvbSBfaGVhcHEgaW1wb3J0ICoKQEAgLTMzMiw2ICszNjYsNyBAQAogCiAgICAgJycnCiAgICAgX2hlYXBwb3AsIF9oZWFwcmVwbGFjZSwgX1N0b3BJdGVyYXRpb24gPSBoZWFwcG9wLCBoZWFwcmVwbGFjZSwgU3RvcEl0ZXJhdGlvbgorICAgIF9sZW4gPSBsZW4KIAogICAgIGggPSBbXQogICAgIGhfYXBwZW5kID0gaC5hcHBlbmQKQEAgLTM0MywxNyArMzc4LDIxIEBACiAgICAgICAgICAgICBwYXNzCiAgICAgaGVhcGlmeShoKQogCi0gICAgd2hpbGUgMToKKyAgICB3aGlsZSBfbGVuKGgpID4gMToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgd2hpbGUgMToKLSAgICAgICAgICAgICAgICB2LCBpdG51bSwgbmV4dCA9IHMgPSBoWzBdICAgIyByYWlzZXMgSW5kZXhFcnJvciB3aGVuIGggaXMgZW1wdHkKKyAgICAgICAgICAgICAgICB2LCBpdG51bSwgbmV4dCA9IHMgPSBoWzBdCiAgICAgICAgICAgICAgICAgeWllbGQgdgogICAgICAgICAgICAgICAgIHNbMF0gPSBuZXh0KCkgICAgICAgICAgICAgICAjIHJhaXNlcyBTdG9wSXRlcmF0aW9uIHdoZW4gZXhoYXVzdGVkCiAgICAgICAgICAgICAgICAgX2hlYXByZXBsYWNlKGgsIHMpICAgICAgICAgICMgcmVzdG9yZSBoZWFwIGNvbmRpdGlvbgogICAgICAgICBleGNlcHQgX1N0b3BJdGVyYXRpb246CiAgICAgICAgICAgICBfaGVhcHBvcChoKSAgICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIGVtcHR5IGl0ZXJhdG9yCi0gICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgotICAgICAgICAgICAgcmV0dXJuCisgICAgaWYgaDoKKyAgICAgICAgIyBmYXN0IGNhc2Ugd2hlbiBvbmx5IGEgc2luZ2xlIGl0ZXJhdG9yIHJlbWFpbnMKKyAgICAgICAgdiwgaXRudW0sIG5leHQgPSBoWzBdCisgICAgICAgIHlpZWxkIHYKKyAgICAgICAgZm9yIHYgaW4gbmV4dC5fX3NlbGZfXzoKKyAgICAgICAgICAgIHlpZWxkIHYKIAogIyBFeHRlbmQgdGhlIGltcGxlbWVudGF0aW9ucyBvZiBuc21hbGxlc3QgYW5kIG5sYXJnZXN0IHRvIHVzZSBhIGtleT0gYXJndW1lbnQKIF9uc21hbGxlc3QgPSBuc21hbGxlc3QKZGlmZiAtLWdpdCBhL0xpYi9obWFjLnB5IGIvTGliL2htYWMucHkKaW5kZXggNTM4ODEwNi4uOWNkMWE5ZiAxMDA2NDQKLS0tIGEvTGliL2htYWMucHkKKysrIGIvTGliL2htYWMucHkKQEAgLTUsNiArNSw5IEBACiAKIGltcG9ydCB3YXJuaW5ncyBhcyBfd2FybmluZ3MKIAorZnJvbSBvcGVyYXRvciBpbXBvcnQgX2NvbXBhcmVfZGlnZXN0IGFzIGNvbXBhcmVfZGlnZXN0CisKKwogdHJhbnNfNUMgPSAiIi5qb2luIChbY2hyICh4IF4gMHg1QykgZm9yIHggaW4geHJhbmdlKDI1NildKQogdHJhbnNfMzYgPSAiIi5qb2luIChbY2hyICh4IF4gMHgzNikgZm9yIHggaW4geHJhbmdlKDI1NildKQogCmRpZmYgLS1naXQgYS9MaWIvaHR0cGxpYi5weSBiL0xpYi9odHRwbGliLnB5CmluZGV4IDE5YmNkMWIuLjUzNjhjZDkgMTAwNjQ0Ci0tLSBhL0xpYi9odHRwbGliLnB5CisrKyBiL0xpYi9odHRwbGliLnB5CkBAIC0xLDQgKzEsNCBAQAotIiIiSFRUUC8xLjEgY2xpZW50IGxpYnJhcnkKK3IiIiJIVFRQLzEuMSBjbGllbnQgbGlicmFyeQogCiA8aW50cm8gc3R1ZmYgZ29lcyBoZXJlPgogPG90aGVyIHN0dWZmLCB0b28+CkBAIC0zNjIsNyArMzYyLDkgQEAKIAogICAgIGRlZiBfcmVhZF9zdGF0dXMoc2VsZik6CiAgICAgICAgICMgSW5pdGlhbGl6ZSB3aXRoIFNpbXBsZS1SZXNwb25zZSBkZWZhdWx0cwotICAgICAgICBsaW5lID0gc2VsZi5mcC5yZWFkbGluZSgpCisgICAgICAgIGxpbmUgPSBzZWxmLmZwLnJlYWRsaW5lKF9NQVhMSU5FICsgMSkKKyAgICAgICAgaWYgbGVuKGxpbmUpID4gX01BWExJTkU6CisgICAgICAgICAgICByYWlzZSBMaW5lVG9vTG9uZygiaGVhZGVyIGxpbmUiKQogICAgICAgICBpZiBzZWxmLmRlYnVnbGV2ZWwgPiAwOgogICAgICAgICAgICAgcHJpbnQgInJlcGx5OiIsIHJlcHIobGluZSkKICAgICAgICAgaWYgbm90IGxpbmU6CkBAIC01NDUsNyArNTQ3LDExIEBACiAgICAgICAgICAgICBpZiBzZWxmLmxlbmd0aCBpcyBOb25lOgogICAgICAgICAgICAgICAgIHMgPSBzZWxmLmZwLnJlYWQoKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzID0gc2VsZi5fc2FmZV9yZWFkKHNlbGYubGVuZ3RoKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcyA9IHNlbGYuX3NhZmVfcmVhZChzZWxmLmxlbmd0aCkKKyAgICAgICAgICAgICAgICBleGNlcHQgSW5jb21wbGV0ZVJlYWQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgIHNlbGYubGVuZ3RoID0gMAogICAgICAgICAgICAgc2VsZi5jbG9zZSgpICAgICAgICAjIHdlIHJlYWQgZXZlcnl0aGluZwogICAgICAgICAgICAgcmV0dXJuIHMKQEAgLTU1OSwxMCArNTY1LDE1IEBACiAgICAgICAgICMgY29ubmVjdGlvbiwgYW5kIHRoZSB1c2VyIGlzIHJlYWRpbmcgbW9yZSBieXRlcyB0aGFuIHdpbGwgYmUgcHJvdmlkZWQKICAgICAgICAgIyAoZm9yIGV4YW1wbGUsIHJlYWRpbmcgaW4gMWsgY2h1bmtzKQogICAgICAgICBzID0gc2VsZi5mcC5yZWFkKGFtdCkKKyAgICAgICAgaWYgbm90IHMgYW5kIGFtdDoKKyAgICAgICAgICAgICMgSWRlYWxseSwgd2Ugd291bGQgcmFpc2UgSW5jb21wbGV0ZVJlYWQgaWYgdGhlIGNvbnRlbnQtbGVuZ3RoCisgICAgICAgICAgICAjIHdhc24ndCBzYXRpc2ZpZWQsIGJ1dCBpdCBtaWdodCBicmVhayBjb21wYXRpYmlsaXR5LgorICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAgICAgICAgIGlmIHNlbGYubGVuZ3RoIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgc2VsZi5sZW5ndGggLT0gbGVuKHMpCiAgICAgICAgICAgICBpZiBub3Qgc2VsZi5sZW5ndGg6CiAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisKICAgICAgICAgcmV0dXJuIHMKIAogICAgIGRlZiBfcmVhZF9jaHVua2VkKHNlbGYsIGFtdCk6CkBAIC02ODksMTcgKzcwMCwzMyBAQAogICAgICAgICBzZWxmLl90dW5uZWxfaG9zdCA9IE5vbmUKICAgICAgICAgc2VsZi5fdHVubmVsX3BvcnQgPSBOb25lCiAgICAgICAgIHNlbGYuX3R1bm5lbF9oZWFkZXJzID0ge30KLQotICAgICAgICBzZWxmLl9zZXRfaG9zdHBvcnQoaG9zdCwgcG9ydCkKICAgICAgICAgaWYgc3RyaWN0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgc2VsZi5zdHJpY3QgPSBzdHJpY3QKIAorICAgICAgICAoc2VsZi5ob3N0LCBzZWxmLnBvcnQpID0gc2VsZi5fZ2V0X2hvc3Rwb3J0KGhvc3QsIHBvcnQpCisKKyAgICAgICAgIyBUaGlzIGlzIHN0b3JlZCBhcyBhbiBpbnN0YW5jZSB2YXJpYWJsZSB0byBhbGxvdyB1bml0dGVzdHMKKyAgICAgICAgIyB0byByZXBsYWNlIHdpdGggYSBzdWl0YWJsZSBtb2NrCisgICAgICAgIHNlbGYuX2NyZWF0ZV9jb25uZWN0aW9uID0gc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uCisKICAgICBkZWYgc2V0X3R1bm5lbChzZWxmLCBob3N0LCBwb3J0PU5vbmUsIGhlYWRlcnM9Tm9uZSk6Ci0gICAgICAgICIiIiBTZXRzIHVwIHRoZSBob3N0IGFuZCB0aGUgcG9ydCBmb3IgdGhlIEhUVFAgQ09OTkVDVCBUdW5uZWxsaW5nLgorICAgICAgICAiIiIgU2V0IHVwIGhvc3QgYW5kIHBvcnQgZm9yIEhUVFAgQ09OTkVDVCB0dW5uZWxsaW5nLgorCisgICAgICAgIEluIGEgY29ubmVjdGlvbiB0aGF0IHVzZXMgSFRUUCBDb25uZWN0IHR1bm5lbGluZywgdGhlIGhvc3QgcGFzc2VkIHRvIHRoZQorICAgICAgICBjb25zdHJ1Y3RvciBpcyB1c2VkIGFzIHByb3h5IHNlcnZlciB0aGF0IHJlbGF5cyBhbGwgY29tbXVuaWNhdGlvbiB0byB0aGUKKyAgICAgICAgZW5kcG9pbnQgcGFzc2VkIHRvIHNldF90dW5uZWwuIFRoaXMgaXMgZG9uZSBieSBzZW5kaW5nIGEgSFRUUCBDT05ORUNUCisgICAgICAgIHJlcXVlc3QgdG8gdGhlIHByb3h5IHNlcnZlciB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLgorCisgICAgICAgIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgSFRNTCBjb25uZWN0aW9uIGhhcyBiZWVuCisgICAgICAgIGVzdGFibGlzaGVkLgogCiAgICAgICAgIFRoZSBoZWFkZXJzIGFyZ3VtZW50IHNob3VsZCBiZSBhIG1hcHBpbmcgb2YgZXh0cmEgSFRUUCBoZWFkZXJzCiAgICAgICAgIHRvIHNlbmQgd2l0aCB0aGUgQ09OTkVDVCByZXF1ZXN0LgogICAgICAgICAiIiIKKyAgICAgICAgIyBWZXJpZnkgaWYgdGhpcyBpcyByZXF1aXJlZC4KKyAgICAgICAgaWYgc2VsZi5zb2NrOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJDYW4ndCBzZXR1cCB0dW5uZWwgZm9yIGVzdGFibGlzaGVkIGNvbm5lY3Rpb24uIikKKwogICAgICAgICBzZWxmLl90dW5uZWxfaG9zdCA9IGhvc3QKICAgICAgICAgc2VsZi5fdHVubmVsX3BvcnQgPSBwb3J0CiAgICAgICAgIGlmIGhlYWRlcnM6CkBAIC03MDcsNyArNzM0LDcgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuX3R1bm5lbF9oZWFkZXJzLmNsZWFyKCkKIAotICAgIGRlZiBfc2V0X2hvc3Rwb3J0KHNlbGYsIGhvc3QsIHBvcnQpOgorICAgIGRlZiBfZ2V0X2hvc3Rwb3J0KHNlbGYsIGhvc3QsIHBvcnQpOgogICAgICAgICBpZiBwb3J0IGlzIE5vbmU6CiAgICAgICAgICAgICBpID0gaG9zdC5yZmluZCgnOicpCiAgICAgICAgICAgICBqID0gaG9zdC5yZmluZCgnXScpICAgICAgICAgIyBpcHY2IGFkZHJlc3NlcyBoYXZlIFsuLi5dCkBAIC03MjQsMTUgKzc1MSwxNCBAQAogICAgICAgICAgICAgICAgIHBvcnQgPSBzZWxmLmRlZmF1bHRfcG9ydAogICAgICAgICAgICAgaWYgaG9zdCBhbmQgaG9zdFswXSA9PSAnWycgYW5kIGhvc3RbLTFdID09ICddJzoKICAgICAgICAgICAgICAgICBob3N0ID0gaG9zdFsxOi0xXQotICAgICAgICBzZWxmLmhvc3QgPSBob3N0Ci0gICAgICAgIHNlbGYucG9ydCA9IHBvcnQKKyAgICAgICAgcmV0dXJuIChob3N0LCBwb3J0KQogCiAgICAgZGVmIHNldF9kZWJ1Z2xldmVsKHNlbGYsIGxldmVsKToKICAgICAgICAgc2VsZi5kZWJ1Z2xldmVsID0gbGV2ZWwKIAogICAgIGRlZiBfdHVubmVsKHNlbGYpOgotICAgICAgICBzZWxmLl9zZXRfaG9zdHBvcnQoc2VsZi5fdHVubmVsX2hvc3QsIHNlbGYuX3R1bm5lbF9wb3J0KQotICAgICAgICBzZWxmLnNlbmQoIkNPTk5FQ1QgJXM6JWQgSFRUUC8xLjBcclxuIiAlIChzZWxmLmhvc3QsIHNlbGYucG9ydCkpCisgICAgICAgIChob3N0LCBwb3J0KSA9IHNlbGYuX2dldF9ob3N0cG9ydChzZWxmLl90dW5uZWxfaG9zdCwgc2VsZi5fdHVubmVsX3BvcnQpCisgICAgICAgIHNlbGYuc2VuZCgiQ09OTkVDVCAlczolZCBIVFRQLzEuMFxyXG4iICUgKGhvc3QsIHBvcnQpKQogICAgICAgICBmb3IgaGVhZGVyLCB2YWx1ZSBpbiBzZWxmLl90dW5uZWxfaGVhZGVycy5pdGVyaXRlbXMoKToKICAgICAgICAgICAgIHNlbGYuc2VuZCgiJXM6ICVzXHJcbiIgJSAoaGVhZGVyLCB2YWx1ZSkpCiAgICAgICAgIHNlbGYuc2VuZCgiXHJcbiIpCkBAIC03NDgsMTMgKzc3NCwxNyBAQAogICAgICAgICAgICAgbGluZSA9IHJlc3BvbnNlLmZwLnJlYWRsaW5lKF9NQVhMSU5FICsgMSkKICAgICAgICAgICAgIGlmIGxlbihsaW5lKSA+IF9NQVhMSU5FOgogICAgICAgICAgICAgICAgIHJhaXNlIExpbmVUb29Mb25nKCJoZWFkZXIgbGluZSIpCi0gICAgICAgICAgICBpZiBsaW5lID09ICdcclxuJzogYnJlYWsKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgICMgZm9yIHNpdGVzIHdoaWNoIEVPRiB3aXRob3V0IHNlbmRpbmcgdHJhaWxlcgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBsaW5lID09ICdcclxuJzoKKyAgICAgICAgICAgICAgICBicmVhawogCiAKICAgICBkZWYgY29ubmVjdChzZWxmKToKICAgICAgICAgIiIiQ29ubmVjdCB0byB0aGUgaG9zdCBhbmQgcG9ydCBzcGVjaWZpZWQgaW4gX19pbml0X18uIiIiCi0gICAgICAgIHNlbGYuc29jayA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoc2VsZi5ob3N0LHNlbGYucG9ydCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRpbWVvdXQsIHNlbGYuc291cmNlX2FkZHJlc3MpCisgICAgICAgIHNlbGYuc29jayA9IHNlbGYuX2NyZWF0ZV9jb25uZWN0aW9uKChzZWxmLmhvc3Qsc2VsZi5wb3J0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRpbWVvdXQsIHNlbGYuc291cmNlX2FkZHJlc3MpCiAKICAgICAgICAgaWYgc2VsZi5fdHVubmVsX2hvc3Q6CiAgICAgICAgICAgICBzZWxmLl90dW5uZWwoKQpAQCAtODkyLDE3ICs5MjIsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG5ldGxvY19lbmMgPSBuZXRsb2MuZW5jb2RlKCJpZG5hIikKICAgICAgICAgICAgICAgICAgICAgc2VsZi5wdXRoZWFkZXIoJ0hvc3QnLCBuZXRsb2NfZW5jKQogICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX3R1bm5lbF9ob3N0OgorICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCA9IHNlbGYuX3R1bm5lbF9ob3N0CisgICAgICAgICAgICAgICAgICAgICAgICBwb3J0ID0gc2VsZi5fdHVubmVsX3BvcnQKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QgPSBzZWxmLmhvc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBzZWxmLnBvcnQKKwogICAgICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBob3N0X2VuYyA9IHNlbGYuaG9zdC5lbmNvZGUoImFzY2lpIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RfZW5jID0gaG9zdC5lbmNvZGUoImFzY2lpIikKICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RfZW5jID0gc2VsZi5ob3N0LmVuY29kZSgiaWRuYSIpCisgICAgICAgICAgICAgICAgICAgICAgICBob3N0X2VuYyA9IGhvc3QuZW5jb2RlKCJpZG5hIikKICAgICAgICAgICAgICAgICAgICAgIyBXcmFwIHRoZSBJUHY2IEhvc3QgSGVhZGVyIHdpdGggW10gKFJGQyAyNzMyKQogICAgICAgICAgICAgICAgICAgICBpZiBob3N0X2VuYy5maW5kKCc6JykgPj0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RfZW5jID0gIlsiICsgaG9zdF9lbmMgKyAiXSIKLSAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5wb3J0ID09IHNlbGYuZGVmYXVsdF9wb3J0OgorICAgICAgICAgICAgICAgICAgICBpZiBwb3J0ID09IHNlbGYuZGVmYXVsdF9wb3J0OgogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wdXRoZWFkZXIoJ0hvc3QnLCBob3N0X2VuYykKICAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHV0aGVhZGVyKCdIb3N0JywgIiVzOiVzIiAlIChob3N0X2VuYywgc2VsZi5wb3J0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHV0aGVhZGVyKCdIb3N0JywgIiVzOiVzIiAlIChob3N0X2VuYywgcG9ydCkpCiAKICAgICAgICAgICAgICMgbm90ZTogd2UgYXJlIGFzc3VtaW5nIHRoYXQgY2xpZW50cyB3aWxsIG5vdCBhdHRlbXB0IHRvIHNldCB0aGVzZQogICAgICAgICAgICAgIyAgICAgICBoZWFkZXJzIHNpbmNlICp0aGlzKiBsaWJyYXJ5IG11c3QgZGVhbCB3aXRoIHRoZQpAQCAtOTg1LDcgKzEwMjIsNyBAQAogCiAgICAgICAgIHNlbGYucHV0cmVxdWVzdChtZXRob2QsIHVybCwgKipza2lwcykKIAotICAgICAgICBpZiBib2R5IGFuZCAoJ2NvbnRlbnQtbGVuZ3RoJyBub3QgaW4gaGVhZGVyX25hbWVzKToKKyAgICAgICAgaWYgYm9keSBpcyBub3QgTm9uZSBhbmQgJ2NvbnRlbnQtbGVuZ3RoJyBub3QgaW4gaGVhZGVyX25hbWVzOgogICAgICAgICAgICAgc2VsZi5fc2V0X2NvbnRlbnRfbGVuZ3RoKGJvZHkpCiAgICAgICAgIGZvciBoZHIsIHZhbHVlIGluIGhlYWRlcnMuaXRlcml0ZW1zKCk6CiAgICAgICAgICAgICBzZWxmLnB1dGhlYWRlcihoZHIsIHZhbHVlKQpAQCAtMTA1OCw3ICsxMDk1LDcgQEAKICAgICAgICAgaWYgcG9ydCA9PSAwOgogICAgICAgICAgICAgcG9ydCA9IE5vbmUKIAotICAgICAgICAjIE5vdGUgdGhhdCB3ZSBtYXkgcGFzcyBhbiBlbXB0eSBzdHJpbmcgYXMgdGhlIGhvc3Q7IHRoaXMgd2lsbCB0aHJvdworICAgICAgICAjIE5vdGUgdGhhdCB3ZSBtYXkgcGFzcyBhbiBlbXB0eSBzdHJpbmcgYXMgdGhlIGhvc3Q7IHRoaXMgd2lsbCByYWlzZQogICAgICAgICAjIGFuIGVycm9yIHdoZW4gd2UgYXR0ZW1wdCB0byBjb25uZWN0LiBQcmVzdW1hYmx5LCB0aGUgY2xpZW50IGNvZGUKICAgICAgICAgIyB3aWxsIGNhbGwgY29ubmVjdCBiZWZvcmUgdGhlbiwgd2l0aCBhIHByb3BlciBob3N0LgogICAgICAgICBzZWxmLl9zZXR1cChzZWxmLl9jb25uZWN0aW9uX2NsYXNzKGhvc3QsIHBvcnQsIHN0cmljdCkpCkBAIC0xMTUzLDggKzExOTAsOCBAQAogICAgICAgICBkZWYgY29ubmVjdChzZWxmKToKICAgICAgICAgICAgICJDb25uZWN0IHRvIGEgaG9zdCBvbiBhIGdpdmVuIChTU0wpIHBvcnQuIgogCi0gICAgICAgICAgICBzb2NrID0gc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uKChzZWxmLmhvc3QsIHNlbGYucG9ydCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGltZW91dCwgc2VsZi5zb3VyY2VfYWRkcmVzcykKKyAgICAgICAgICAgIHNvY2sgPSBzZWxmLl9jcmVhdGVfY29ubmVjdGlvbigoc2VsZi5ob3N0LCBzZWxmLnBvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50aW1lb3V0LCBzZWxmLnNvdXJjZV9hZGRyZXNzKQogICAgICAgICAgICAgaWYgc2VsZi5fdHVubmVsX2hvc3Q6CiAgICAgICAgICAgICAgICAgc2VsZi5zb2NrID0gc29jawogICAgICAgICAgICAgICAgIHNlbGYuX3R1bm5lbCgpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9BdXRvQ29tcGxldGUucHkgYi9MaWIvaWRsZWxpYi9BdXRvQ29tcGxldGUucHkKaW5kZXggZmExNzMzZi4uMTI0OGYwMCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvQXV0b0NvbXBsZXRlLnB5CisrKyBiL0xpYi9pZGxlbGliL0F1dG9Db21wbGV0ZS5weQpAQCAtMTU2LDEyICsxNTYsOSBAQAogICAgICAgICBpZiBub3QgY29tcF9saXN0c1swXToKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBzZWxmLmF1dG9jb21wbGV0ZXdpbmRvdyA9IHNlbGYuX21ha2VfYXV0b2NvbXBsZXRlX3dpbmRvdygpCi0gICAgICAgIHNlbGYuYXV0b2NvbXBsZXRld2luZG93LnNob3dfd2luZG93KGNvbXBfbGlzdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnNlcnQtJWRjIiAlIGxlbihjb21wX3N0YXJ0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJXYW50c1dpbikKLSAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmLmF1dG9jb21wbGV0ZXdpbmRvdy5zaG93X3dpbmRvdygKKyAgICAgICAgICAgICAgICBjb21wX2xpc3RzLCAiaW5zZXJ0LSVkYyIgJSBsZW4oY29tcF9zdGFydCksCisgICAgICAgICAgICAgICAgY29tcGxldGUsIG1vZGUsIHVzZXJXYW50c1dpbikKIAogICAgIGRlZiBmZXRjaF9jb21wbGV0aW9ucyhzZWxmLCB3aGF0LCBtb2RlKToKICAgICAgICAgIiIiUmV0dXJuIGEgcGFpciBvZiBsaXN0cyBvZiBjb21wbGV0aW9ucyBmb3Igc29tZXRoaW5nLiBUaGUgZmlyc3QgbGlzdApAQCAtMTkwLDggKzE4Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgIGJpZ2wgPSBldmFsKCJkaXIoKSIsIG5hbWVzcGFjZSkKICAgICAgICAgICAgICAgICAgICAgYmlnbC5zb3J0KCkKICAgICAgICAgICAgICAgICAgICAgaWYgIl9fYWxsX18iIGluIGJpZ2w6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzbWFsbGwgPSBldmFsKCJfX2FsbF9fIiwgbmFtZXNwYWNlKQotICAgICAgICAgICAgICAgICAgICAgICAgc21hbGxsLnNvcnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgc21hbGxsID0gc29ydGVkKGV2YWwoIl9fYWxsX18iLCBuYW1lc3BhY2UpKQogICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgc21hbGxsID0gW3MgZm9yIHMgaW4gYmlnbCBpZiBzWzoxXSAhPSAnXyddCiAgICAgICAgICAgICAgICAgZWxzZToKQEAgLTIwMCw4ICsxOTYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgYmlnbCA9IGRpcihlbnRpdHkpCiAgICAgICAgICAgICAgICAgICAgICAgICBiaWdsLnNvcnQoKQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgIl9fYWxsX18iIGluIGJpZ2w6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc21hbGxsID0gZW50aXR5Ll9fYWxsX18KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWFsbGwuc29ydCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21hbGxsID0gc29ydGVkKGVudGl0eS5fX2FsbF9fKQogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWFsbGwgPSBbcyBmb3IgcyBpbiBiaWdsIGlmIHNbOjFdICE9ICdfJ10KICAgICAgICAgICAgICAgICAgICAgZXhjZXB0OgpAQCAtMjI3LDMgKzIyMiw4IEBACiAgICAgICAgIG5hbWVzcGFjZSA9IHN5cy5tb2R1bGVzLmNvcHkoKQogICAgICAgICBuYW1lc3BhY2UudXBkYXRlKF9fbWFpbl9fLl9fZGljdF9fKQogICAgICAgICByZXR1cm4gZXZhbChuYW1lLCBuYW1lc3BhY2UpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBmcm9tIHVuaXR0ZXN0IGltcG9ydCBtYWluCisgICAgbWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF9hdXRvY29tcGxldGUnLCB2ZXJib3NpdHk9MikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0F1dG9Db21wbGV0ZVdpbmRvdy5weSBiL0xpYi9pZGxlbGliL0F1dG9Db21wbGV0ZVdpbmRvdy5weQppbmRleCAyOTgxNzdmLi4yN2IwZTU2IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9BdXRvQ29tcGxldGVXaW5kb3cucHkKKysrIGIvTGliL2lkbGVsaWIvQXV0b0NvbXBsZXRlV2luZG93LnB5CkBAIC0xNTcsMTMgKzE1NywxNCBAQAogICAgICAgICBzZWxmLnN0YXJ0ID0gc2VsZi53aWRnZXQuZ2V0KHNlbGYuc3RhcnRpbmRleCwgImluc2VydCIpCiAgICAgICAgIGlmIGNvbXBsZXRlOgogICAgICAgICAgICAgY29tcGxldGVkID0gc2VsZi5fY29tcGxldGVfc3RyaW5nKHNlbGYuc3RhcnQpCisgICAgICAgICAgICBzdGFydCA9IHNlbGYuc3RhcnQKICAgICAgICAgICAgIHNlbGYuX2NoYW5nZV9zdGFydChjb21wbGV0ZWQpCiAgICAgICAgICAgICBpID0gc2VsZi5fYmluYXJ5X3NlYXJjaChjb21wbGV0ZWQpCiAgICAgICAgICAgICBpZiBzZWxmLmNvbXBsZXRpb25zW2ldID09IGNvbXBsZXRlZCBhbmQgXAogICAgICAgICAgICAgICAgKGkgPT0gbGVuKHNlbGYuY29tcGxldGlvbnMpLTEgb3IKICAgICAgICAgICAgICAgICBzZWxmLmNvbXBsZXRpb25zW2krMV1bOmxlbihjb21wbGV0ZWQpXSAhPSBjb21wbGV0ZWQpOgogICAgICAgICAgICAgICAgICMgVGhlcmUgaXMgZXhhY3RseSBvbmUgbWF0Y2hpbmcgY29tcGxldGlvbgotICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWQgPT0gc3RhcnQKICAgICAgICAgc2VsZi51c2Vyd2FudHN3aW5kb3cgPSB1c2VyV2FudHNXaW4KICAgICAgICAgc2VsZi5sYXN0dHlwZWRzdGFydCA9IHNlbGYuc3RhcnQKIApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvQXV0b0V4cGFuZC5weSBiL0xpYi9pZGxlbGliL0F1dG9FeHBhbmQucHkKaW5kZXggOWU5M2Q1Ny4uNzA1OTA1NCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvQXV0b0V4cGFuZC5weQorKysgYi9MaWIvaWRsZWxpYi9BdXRvRXhwYW5kLnB5CkBAIC0xLDMgKzEsMTcgQEAKKycnJ0NvbXBsZXRlIHRoZSBjdXJyZW50IHdvcmQgYmVmb3JlIHRoZSBjdXJzb3Igd2l0aCB3b3JkcyBpbiB0aGUgZWRpdG9yLgorCitFYWNoIG1lbnUgc2VsZWN0aW9uIG9yIHNob3J0Y3V0IGtleSBzZWxlY3Rpb24gcmVwbGFjZXMgdGhlIHdvcmQgd2l0aCBhCitkaWZmZXJlbnQgd29yZCB3aXRoIHRoZSBzYW1lIHByZWZpeC4gVGhlIHNlYXJjaCBmb3IgbWF0Y2hlcyBiZWdpbnMKK2JlZm9yZSB0aGUgdGFyZ2V0IGFuZCBtb3ZlcyB0b3dhcmQgdGhlIHRvcCBvZiB0aGUgZWRpdG9yLiBJdCB0aGVuIHN0YXJ0cworYWZ0ZXIgdGhlIGN1cnNvciBhbmQgbW92ZXMgZG93bi4gSXQgdGhlbiByZXR1cm5zIHRvIHRoZSBvcmlnaW5hbCB3b3JkIGFuZAordGhlIGN5Y2xlIHN0YXJ0cyBhZ2Fpbi4KKworQ2hhbmdpbmcgdGhlIGN1cnJlbnQgdGV4dCBsaW5lIG9yIGxlYXZpbmcgdGhlIGN1cnNvciBpbiBhIGRpZmZlcmVudAorcGxhY2UgYmVmb3JlIHJlcXVlc3RpbmcgdGhlIG5leHQgc2VsZWN0aW9uIGNhdXNlcyBBdXRvRXhwYW5kIHRvIHJlc2V0CitpdHMgc3RhdGUuCisKK1RoaXMgaXMgYW4gZXh0ZW5zaW9uIGZpbGUgYW5kIHRoZXJlIGlzIG9ubHkgb25lIGluc3RhbmNlIG9mIEF1dG9FeHBhbmQuCisnJycKIGltcG9ydCBzdHJpbmcKIGltcG9ydCByZQogCkBAIC0yMCw2ICszNCw3IEBACiAgICAgICAgIHNlbGYuc3RhdGUgPSBOb25lCiAKICAgICBkZWYgZXhwYW5kX3dvcmRfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICAiUmVwbGFjZSB0aGUgY3VycmVudCB3b3JkIHdpdGggdGhlIG5leHQgZXhwYW5zaW9uLiIKICAgICAgICAgY3VyaW5zZXJ0ID0gc2VsZi50ZXh0LmluZGV4KCJpbnNlcnQiKQogICAgICAgICBjdXJsaW5lID0gc2VsZi50ZXh0LmdldCgiaW5zZXJ0IGxpbmVzdGFydCIsICJpbnNlcnQgbGluZWVuZCIpCiAgICAgICAgIGlmIG5vdCBzZWxmLnN0YXRlOgpAQCAtNDYsNiArNjEsNyBAQAogICAgICAgICByZXR1cm4gImJyZWFrIgogCiAgICAgZGVmIGdldHdvcmRzKHNlbGYpOgorICAgICAgICAiUmV0dXJuIGEgbGlzdCBvZiB3b3JkcyB0aGF0IG1hdGNoIHRoZSBwcmVmaXggYmVmb3JlIHRoZSBjdXJzb3IuIgogICAgICAgICB3b3JkID0gc2VsZi5nZXRwcmV2d29yZCgpCiAgICAgICAgIGlmIG5vdCB3b3JkOgogICAgICAgICAgICAgcmV0dXJuIFtdCkBAIC03Niw4ICs5MiwxMyBAQAogICAgICAgICByZXR1cm4gd29yZHMKIAogICAgIGRlZiBnZXRwcmV2d29yZChzZWxmKToKKyAgICAgICAgIlJldHVybiB0aGUgd29yZCBwcmVmaXggYmVmb3JlIHRoZSBjdXJzb3IuIgogICAgICAgICBsaW5lID0gc2VsZi50ZXh0LmdldCgiaW5zZXJ0IGxpbmVzdGFydCIsICJpbnNlcnQiKQogICAgICAgICBpID0gbGVuKGxpbmUpCiAgICAgICAgIHdoaWxlIGkgPiAwIGFuZCBsaW5lW2ktMV0gaW4gc2VsZi53b3JkY2hhcnM6CiAgICAgICAgICAgICBpID0gaS0xCiAgICAgICAgIHJldHVybiBsaW5lW2k6XQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCB1bml0dGVzdAorICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfYXV0b2V4cGFuZCcsIHZlcmJvc2l0eT0yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvQmluZGluZ3MucHkgYi9MaWIvaWRsZWxpYi9CaW5kaW5ncy5weQppbmRleCBlYzI3MjBiLi5kZjJiMjUxIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9CaW5kaW5ncy5weQorKysgYi9MaWIvaWRsZWxpYi9CaW5kaW5ncy5weQpAQCAtOCwxNCArOCwxOSBAQAogd2luZG93cy4KIAogIiIiCi1pbXBvcnQgc3lzCiBmcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKLWZyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4U3VwcG9ydAorCisjICAgV2FybmluZzogbWVudWRlZnMgaXMgYWx0ZXJlZCBpbiBtYWNvc3hTdXBwb3J0Lm92ZXJyaWRlUm9vdE1lbnUoKQorIyAgIGFmdGVyIGl0IGlzIGRldGVybWluZWQgdGhhdCBhbiBPUyBYIEFxdWEgVGsgaXMgaW4gdXNlLAorIyAgIHdoaWNoIGNhbm5vdCBiZSBkb25lIHVudGlsIGFmdGVyIFRrKCkgaXMgZmlyc3QgY2FsbGVkLgorIyAgIERvIG5vdCBhbHRlciB0aGUgJ2ZpbGUnLCAnb3B0aW9ucycsIG9yICdoZWxwJyBjYXNjYWRlcyBoZXJlCisjICAgd2l0aG91dCBhbHRlcmluZyBvdmVycmlkZVJvb3RNZW51KCkgYXMgd2VsbC4KKyMgICAgICAgVE9ETzogTWFrZSB0aGlzIG1vcmUgcm9idXN0CiAKIG1lbnVkZWZzID0gWwogICMgdW5kZXJzY29yZSBwcmVmaXhlcyBjaGFyYWN0ZXIgdG8gdW5kZXJzY29yZQogICgnZmlsZScsIFsKLSAgICgnX05ldyBXaW5kb3cnLCAnPDxvcGVuLW5ldy13aW5kb3c+PicpLAorICAgKCdfTmV3IEZpbGUnLCAnPDxvcGVuLW5ldy13aW5kb3c+PicpLAogICAgKCdfT3Blbi4uLicsICc8PG9wZW4td2luZG93LWZyb20tZmlsZT4+JyksCiAgICAoJ09wZW4gX01vZHVsZS4uLicsICc8PG9wZW4tbW9kdWxlPj4nKSwKICAgICgnQ2xhc3MgX0Jyb3dzZXInLCAnPDxvcGVuLWNsYXNzLWJyb3dzZXI+PicpLApAQCAtODEsMjMgKzg2LDQgQEAKICAgIF0pLAogXQogCi1pZiBtYWNvc3hTdXBwb3J0LnJ1bm5pbmdBc09TWEFwcCgpOgotICAgICMgUnVubmluZyBhcyBhIHByb3BlciBNYWNPUyBhcHBsaWNhdGlvbiBidW5kbGUuIFRoaXMgYmxvY2sgcmVzdHJ1Y3R1cmVzCi0gICAgIyB0aGUgbWVudXMgYSBsaXR0bGUgdG8gbWFrZSB0aGVtIGNvbmZvcm0gYmV0dGVyIHRvIHRoZSBISUcuCi0KLSAgICBxdWl0SXRlbSA9IG1lbnVkZWZzWzBdWzFdWy0xXQotICAgIGNsb3NlSXRlbSA9IG1lbnVkZWZzWzBdWzFdWy0yXQotCi0gICAgIyBSZW1vdmUgdGhlIGxhc3QgMyBpdGVtcyBvZiB0aGUgZmlsZSBtZW51OiBhIHNlcGFyYXRvciwgY2xvc2Ugd2luZG93IGFuZAotICAgICMgcXVpdC4gQ2xvc2Ugd2luZG93IHdpbGwgYmUgcmVpbnNlcnRlZCBqdXN0IGFib3ZlIHRoZSBzYXZlIGl0ZW0sIHdoZXJlCi0gICAgIyBpdCBzaG91bGQgYmUgYWNjb3JkaW5nIHRvIHRoZSBISUcuIFF1aXQgaXMgaW4gdGhlIGFwcGxpY2F0aW9uIG1lbnUuCi0gICAgZGVsIG1lbnVkZWZzWzBdWzFdWy0zOl0KLSAgICBtZW51ZGVmc1swXVsxXS5pbnNlcnQoNiwgY2xvc2VJdGVtKQotCi0gICAgIyBSZW1vdmUgdGhlICdBYm91dCcgZW50cnkgZnJvbSB0aGUgaGVscCBtZW51LCBpdCBpcyBpbiB0aGUgYXBwbGljYXRpb24KLSAgICAjIG1lbnUKLSAgICBkZWwgbWVudWRlZnNbLTFdWzFdWzA6Ml0KLQogZGVmYXVsdF9rZXlkZWZzID0gaWRsZUNvbmYuR2V0Q3VycmVudEtleVNldCgpCi0KLWRlbCBzeXMKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0NhbGxUaXBXaW5kb3cucHkgYi9MaWIvaWRsZWxpYi9DYWxsVGlwV2luZG93LnB5CmluZGV4IDIyMjM4ODUuLjIwNzc0MDcgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0NhbGxUaXBXaW5kb3cucHkKKysrIGIvTGliL2lkbGVsaWIvQ2FsbFRpcFdpbmRvdy5weQpAQCAtMiw5ICsyLDggQEAKIAogQWZ0ZXIgVG9vbFRpcC5weSwgd2hpY2ggdXNlcyBpZGVhcyBnbGVhbmVkIGZyb20gUHlTb2wKIFVzZWQgYnkgdGhlIENhbGxUaXBzIElETEUgZXh0ZW5zaW9uLgotCiAiIiIKLWZyb20gVGtpbnRlciBpbXBvcnQgKgorZnJvbSBUa2ludGVyIGltcG9ydCBUb3BsZXZlbCwgTGFiZWwsIExFRlQsIFNPTElELCBUY2xFcnJvcgogCiBISURFX1ZJUlRVQUxfRVZFTlRfTkFNRSA9ICI8PGNhbGx0aXB3aW5kb3ctaGlkZT4+IgogSElERV9TRVFVRU5DRVMgPSAoIjxLZXktRXNjYXBlPiIsICI8Rm9jdXNPdXQ+IikKQEAgLTIyLDYgKzIxLDcgQEAKICAgICAgICAgc2VsZi5wYXJlbmxpbmUgPSBzZWxmLnBhcmVuY29sID0gTm9uZQogICAgICAgICBzZWxmLmxhc3RsaW5lID0gTm9uZQogICAgICAgICBzZWxmLmhpZGVpZCA9IHNlbGYuY2hlY2toaWRlaWQgPSBOb25lCisgICAgICAgIHNlbGYuY2hlY2toaWRlX2FmdGVyX2lkID0gTm9uZQogCiAgICAgZGVmIHBvc2l0aW9uX3dpbmRvdyhzZWxmKToKICAgICAgICAgIiIiQ2hlY2sgaWYgbmVlZHMgdG8gcmVwb3NpdGlvbiB0aGUgd2luZG93LCBhbmQgaWYgc28gLSBkbyBpdC4iIiIKQEAgLTQ3LDEzICs0Nyw3IEBACiAgICAgZGVmIHNob3d0aXAoc2VsZiwgdGV4dCwgcGFyZW5sZWZ0LCBwYXJlbnJpZ2h0KToKICAgICAgICAgIiIiU2hvdyB0aGUgY2FsbHRpcCwgYmluZCBldmVudHMgd2hpY2ggd2lsbCBjbG9zZSBpdCBhbmQgcmVwb3NpdGlvbiBpdC4KICAgICAgICAgIiIiCi0gICAgICAgICMgdHJ1bmNhdGUgb3Zlcmx5IGxvbmcgY2FsbHRpcAotICAgICAgICBpZiBsZW4odGV4dCkgPj0gNzk6Ci0gICAgICAgICAgICB0ZXh0bGluZXMgPSB0ZXh0LnNwbGl0bGluZXMoKQotICAgICAgICAgICAgZm9yIGksIGxpbmUgaW4gZW51bWVyYXRlKHRleHRsaW5lcyk6Ci0gICAgICAgICAgICAgICAgaWYgbGVuKGxpbmUpID4gNzk6Ci0gICAgICAgICAgICAgICAgICAgIHRleHRsaW5lc1tpXSA9IGxpbmVbOjc1XSArICcgLi4uJwotICAgICAgICAgICAgdGV4dCA9ICdcbicuam9pbih0ZXh0bGluZXMpCisgICAgICAgICMgT25seSBjYWxsZWQgaW4gQ2FsbFRpcHMsIHdoZXJlIGxpbmVzIGFyZSB0cnVuY2F0ZWQKICAgICAgICAgc2VsZi50ZXh0ID0gdGV4dAogICAgICAgICBpZiBzZWxmLnRpcHdpbmRvdyBvciBub3Qgc2VsZi50ZXh0OgogICAgICAgICAgICAgcmV0dXJuCkBAIC0xMDIsNyArOTYsMTAgQEAKICAgICAgICAgICAgIHNlbGYuaGlkZXRpcCgpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLnBvc2l0aW9uX3dpbmRvdygpCi0gICAgICAgICAgICBzZWxmLndpZGdldC5hZnRlcihDSEVDS0hJREVfVElNRSwgc2VsZi5jaGVja2hpZGVfZXZlbnQpCisgICAgICAgICAgICBpZiBzZWxmLmNoZWNraGlkZV9hZnRlcl9pZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLndpZGdldC5hZnRlcl9jYW5jZWwoc2VsZi5jaGVja2hpZGVfYWZ0ZXJfaWQpCisgICAgICAgICAgICBzZWxmLmNoZWNraGlkZV9hZnRlcl9pZCA9IFwKKyAgICAgICAgICAgICAgICBzZWxmLndpZGdldC5hZnRlcihDSEVDS0hJREVfVElNRSwgc2VsZi5jaGVja2hpZGVfZXZlbnQpCiAKICAgICBkZWYgaGlkZV9ldmVudChzZWxmLCBldmVudCk6CiAgICAgICAgIGlmIG5vdCBzZWxmLnRpcHdpbmRvdzoKQEAgLTEzNSwzNyArMTMyLDM5IEBACiAgICAgICAgIHJldHVybiBib29sKHNlbGYudGlwd2luZG93KQogCiAKK2RlZiBfY2FsbHRpcF93aW5kb3cocGFyZW50KTogICMgaHRlc3QgIworICAgIGltcG9ydCByZQorICAgIGZyb20gVGtpbnRlciBpbXBvcnQgVGssIFRleHQsIExFRlQsIEJPVEgKIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBUZXN0IENvZGUKLSMKLWNsYXNzIGNvbnRhaW5lcjogIyBDb25jZXB0dWFsbHkgYW4gZWRpdG9yX3dpbmRvdwotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgcm9vdCA9IFRrKCkKLSAgICAgICAgdGV4dCA9IHNlbGYudGV4dCA9IFRleHQocm9vdCkKLSAgICAgICAgdGV4dC5wYWNrKHNpZGU9TEVGVCwgZmlsbD1CT1RILCBleHBhbmQ9MSkKLSAgICAgICAgdGV4dC5pbnNlcnQoImluc2VydCIsICJzdHJpbmcuc3BsaXQiKQotICAgICAgICByb290LnVwZGF0ZSgpCi0gICAgICAgIHNlbGYuY2FsbHRpcCA9IENhbGxUaXAodGV4dCkKKyAgICByb290ID0gVGsoKQorICAgIHJvb3QudGl0bGUoIlRlc3QgY2FsbHRpcHMiKQorICAgIHdpZHRoLCBoZWlnaHQsIHgsIHkgPSBsaXN0KG1hcChpbnQsIHJlLnNwbGl0KCdbeCtdJywgcGFyZW50Lmdlb21ldHJ5KCkpKSkKKyAgICByb290Lmdlb21ldHJ5KCIrJWQrJWQiJSh4LCB5ICsgMTUwKSkKIAotICAgICAgICB0ZXh0LmV2ZW50X2FkZCgiPDxjYWxsdGlwLXNob3c+PiIsICIoIikKLSAgICAgICAgdGV4dC5ldmVudF9hZGQoIjw8Y2FsbHRpcC1oaWRlPj4iLCAiKSIpCi0gICAgICAgIHRleHQuYmluZCgiPDxjYWxsdGlwLXNob3c+PiIsIHNlbGYuY2FsbHRpcF9zaG93KQotICAgICAgICB0ZXh0LmJpbmQoIjw8Y2FsbHRpcC1oaWRlPj4iLCBzZWxmLmNhbGx0aXBfaGlkZSkKKyAgICBjbGFzcyBNeUVkaXRXaW46ICMgY29uY2VwdHVhbGx5IGFuIGVkaXRvcl93aW5kb3cKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgdGV4dCA9IHNlbGYudGV4dCA9IFRleHQocm9vdCkKKyAgICAgICAgICAgIHRleHQucGFjayhzaWRlPUxFRlQsIGZpbGw9Qk9USCwgZXhwYW5kPTEpCisgICAgICAgICAgICB0ZXh0Lmluc2VydCgiaW5zZXJ0IiwgInN0cmluZy5zcGxpdCIpCisgICAgICAgICAgICByb290LnVwZGF0ZSgpCisgICAgICAgICAgICBzZWxmLmNhbGx0aXAgPSBDYWxsVGlwKHRleHQpCiAKLSAgICAgICAgdGV4dC5mb2N1c19zZXQoKQotICAgICAgICByb290Lm1haW5sb29wKCkKKyAgICAgICAgICAgIHRleHQuZXZlbnRfYWRkKCI8PGNhbGx0aXAtc2hvdz4+IiwgIigiKQorICAgICAgICAgICAgdGV4dC5ldmVudF9hZGQoIjw8Y2FsbHRpcC1oaWRlPj4iLCAiKSIpCisgICAgICAgICAgICB0ZXh0LmJpbmQoIjw8Y2FsbHRpcC1zaG93Pj4iLCBzZWxmLmNhbGx0aXBfc2hvdykKKyAgICAgICAgICAgIHRleHQuYmluZCgiPDxjYWxsdGlwLWhpZGU+PiIsIHNlbGYuY2FsbHRpcF9oaWRlKQogCi0gICAgZGVmIGNhbGx0aXBfc2hvdyhzZWxmLCBldmVudCk6Ci0gICAgICAgIHNlbGYuY2FsbHRpcC5zaG93dGlwKCJIZWxsbyB3b3JsZCIpCisgICAgICAgICAgICB0ZXh0LmZvY3VzX3NldCgpCisgICAgICAgICAgICByb290Lm1haW5sb29wKCkKIAotICAgIGRlZiBjYWxsdGlwX2hpZGUoc2VsZiwgZXZlbnQpOgotICAgICAgICBzZWxmLmNhbGx0aXAuaGlkZXRpcCgpCisgICAgICAgIGRlZiBjYWxsdGlwX3Nob3coc2VsZiwgZXZlbnQpOgorICAgICAgICAgICAgc2VsZi5jYWxsdGlwLnNob3d0aXAoIkhlbGxvIHdvcmxkIiwgImluc2VydCIsICJlbmQiKQogCi1kZWYgbWFpbigpOgotICAgICMgVGVzdCBjb2RlCi0gICAgYz1jb250YWluZXIoKQorICAgICAgICBkZWYgY2FsbHRpcF9oaWRlKHNlbGYsIGV2ZW50KToKKyAgICAgICAgICAgIHNlbGYuY2FsbHRpcC5oaWRldGlwKCkKKworICAgIE15RWRpdFdpbigpCiAKIGlmIF9fbmFtZV9fPT0nX19tYWluX18nOgotICAgIG1haW4oKQorICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgorICAgIHJ1bihfY2FsbHRpcF93aW5kb3cpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9DYWxsVGlwcy5weSBiL0xpYi9pZGxlbGliL0NhbGxUaXBzLnB5CmluZGV4IGY4ZjMxZTIuLjNkYjI2MzYgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0NhbGxUaXBzLnB5CisrKyBiL0xpYi9pZGxlbGliL0NhbGxUaXBzLnB5CkBAIC01LDE0ICs1LDE1IEBACiB3aGljaCBkaXNhcHBlYXIgd2hlbiB5b3UgdHlwZSBhIGNsb3NpbmcgcGFyZW50aGVzaXMuCiAKICIiIgoraW1wb3J0IF9fbWFpbl9fCiBpbXBvcnQgcmUKIGltcG9ydCBzeXMKK2ltcG9ydCB0ZXh0d3JhcAogaW1wb3J0IHR5cGVzCiAKIGZyb20gaWRsZWxpYiBpbXBvcnQgQ2FsbFRpcFdpbmRvdwogZnJvbSBpZGxlbGliLkh5cGVyUGFyc2VyIGltcG9ydCBIeXBlclBhcnNlcgogCi1pbXBvcnQgX19tYWluX18KIAogY2xhc3MgQ2FsbFRpcHM6CiAKQEAgLTcxLDE2ICs3MiwxNiBAQAogICAgICAgICBpZiBub3Qgc3VyX3BhcmVuOgogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIGhwLnNldF9pbmRleChzdXJfcGFyZW5bMF0pCi0gICAgICAgIG5hbWUgPSBocC5nZXRfZXhwcmVzc2lvbigpCi0gICAgICAgIGlmIG5vdCBuYW1lIG9yIChub3QgZXZhbGZ1bmNzIGFuZCBuYW1lLmZpbmQoJygnKSAhPSAtMSk6CisgICAgICAgIGV4cHJlc3Npb24gPSBocC5nZXRfZXhwcmVzc2lvbigpCisgICAgICAgIGlmIG5vdCBleHByZXNzaW9uIG9yIChub3QgZXZhbGZ1bmNzIGFuZCBleHByZXNzaW9uLmZpbmQoJygnKSAhPSAtMSk6CiAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgYXJnX3RleHQgPSBzZWxmLmZldGNoX3RpcChuYW1lKQorICAgICAgICBhcmdfdGV4dCA9IHNlbGYuZmV0Y2hfdGlwKGV4cHJlc3Npb24pCiAgICAgICAgIGlmIG5vdCBhcmdfdGV4dDoKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBzZWxmLmNhbGx0aXAgPSBzZWxmLl9tYWtlX2NhbGx0aXBfd2luZG93KCkKICAgICAgICAgc2VsZi5jYWxsdGlwLnNob3d0aXAoYXJnX3RleHQsIHN1cl9wYXJlblswXSwgc3VyX3BhcmVuWzFdKQogCi0gICAgZGVmIGZldGNoX3RpcChzZWxmLCBuYW1lKToKKyAgICBkZWYgZmV0Y2hfdGlwKHNlbGYsIGV4cHJlc3Npb24pOgogICAgICAgICAiIiJSZXR1cm4gdGhlIGFyZ3VtZW50IGxpc3QgYW5kIGRvY3N0cmluZyBvZiBhIGZ1bmN0aW9uIG9yIGNsYXNzCiAKICAgICAgICAgSWYgdGhlcmUgaXMgYSBQeXRob24gc3VicHJvY2VzcywgZ2V0IHRoZSBjYWxsdGlwIHRoZXJlLiAgT3RoZXJ3aXNlLApAQCAtOTYsMjMgKzk3LDI3IEBACiAgICAgICAgICIiIgogICAgICAgICB0cnk6CiAgICAgICAgICAgICBycGNjbHQgPSBzZWxmLmVkaXR3aW4uZmxpc3QucHlzaGVsbC5pbnRlcnAucnBjY2x0Ci0gICAgICAgIGV4Y2VwdDoKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgcnBjY2x0ID0gTm9uZQogICAgICAgICBpZiBycGNjbHQ6CiAgICAgICAgICAgICByZXR1cm4gcnBjY2x0LnJlbW90ZWNhbGwoImV4ZWMiLCAiZ2V0X3RoZV9jYWxsdGlwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmFtZSwpLCB7fSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXhwcmVzc2lvbiwpLCB7fSkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGVudGl0eSA9IHNlbGYuZ2V0X2VudGl0eShuYW1lKQorICAgICAgICAgICAgZW50aXR5ID0gc2VsZi5nZXRfZW50aXR5KGV4cHJlc3Npb24pCiAgICAgICAgICAgICByZXR1cm4gZ2V0X2FyZ190ZXh0KGVudGl0eSkKIAotICAgIGRlZiBnZXRfZW50aXR5KHNlbGYsIG5hbWUpOgotICAgICAgICAiTG9va3VwIG5hbWUgaW4gYSBuYW1lc3BhY2Ugc3Bhbm5pbmcgc3lzLm1vZHVsZXMgYW5kIF9fbWFpbi5kaWN0X18iCi0gICAgICAgIGlmIG5hbWU6CisgICAgZGVmIGdldF9lbnRpdHkoc2VsZiwgZXhwcmVzc2lvbik6CisgICAgICAgICIiIlJldHVybiB0aGUgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gZXhwcmVzc2lvbiBldmFsdWF0ZWQKKyAgICAgICAgaW4gYSBuYW1lc3BhY2Ugc3Bhbm5pbmcgc3lzLm1vZHVsZXMgYW5kIF9fbWFpbi5kaWN0X18uCisgICAgICAgICIiIgorICAgICAgICBpZiBleHByZXNzaW9uOgogICAgICAgICAgICAgbmFtZXNwYWNlID0gc3lzLm1vZHVsZXMuY29weSgpCiAgICAgICAgICAgICBuYW1lc3BhY2UudXBkYXRlKF9fbWFpbl9fLl9fZGljdF9fKQogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHJldHVybiBldmFsKG5hbWUsIG5hbWVzcGFjZSkKLSAgICAgICAgICAgIGV4Y2VwdCAoTmFtZUVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGV2YWwoZXhwcmVzc2lvbiwgbmFtZXNwYWNlKQorICAgICAgICAgICAgZXhjZXB0IEJhc2VFeGNlcHRpb246CisgICAgICAgICAgICAgICAgIyBBbiB1bmNhdWdodCBleGNlcHRpb24gY2xvc2VzIGlkbGUsIGFuZCBldmFsIGNhbiByYWlzZSBhbnkKKyAgICAgICAgICAgICAgICAjIGV4Y2VwdGlvbiwgZXNwZWNpYWxseSBpZiB1c2VyIGNsYXNzZXMgYXJlIGludm9sdmVkLgogICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAKIGRlZiBfZmluZF9jb25zdHJ1Y3RvcihjbGFzc19vYik6CkBAIC0xMjYsOTYgKzEzMSw4OSBAQAogICAgICAgICAgICAgaWYgcmMgaXMgbm90IE5vbmU6IHJldHVybiByYwogICAgIHJldHVybiBOb25lCiAKKyMgVGhlIGZvbGxvd2luZyBhcmUgdXNlZCBpbiBnZXRfYXJnX3RleHQKK19NQVhfQ09MUyA9IDg1CitfTUFYX0xJTkVTID0gNSAgIyBlbm91Z2ggZm9yIGJ5dGVzCitfSU5ERU5UID0gJyAnKjQgICMgZm9yIHdyYXBwZWQgc2lnbmF0dXJlcworCiBkZWYgZ2V0X2FyZ190ZXh0KG9iKToKLSAgICAiIiJHZXQgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgYXJndW1lbnRzIGZvciB0aGUgZ2l2ZW4gb2JqZWN0IiIiCi0gICAgYXJnX3RleHQgPSAiIgotICAgIGlmIG9iIGlzIG5vdCBOb25lOgotICAgICAgICBhcmdfb2Zmc2V0ID0gMAotICAgICAgICBpZiB0eXBlKG9iKSBpbiAodHlwZXMuQ2xhc3NUeXBlLCB0eXBlcy5UeXBlVHlwZSk6Ci0gICAgICAgICAgICAjIExvb2sgZm9yIHRoZSBoaWdoZXN0IF9faW5pdF9fIGluIHRoZSBjbGFzcyBjaGFpbi4KLSAgICAgICAgICAgIGZvYiA9IF9maW5kX2NvbnN0cnVjdG9yKG9iKQotICAgICAgICAgICAgaWYgZm9iIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgZm9iID0gbGFtYmRhOiBOb25lCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGFyZ19vZmZzZXQgPSAxCi0gICAgICAgIGVsaWYgdHlwZShvYik9PXR5cGVzLk1ldGhvZFR5cGU6Ci0gICAgICAgICAgICAjIGJpdCBvZiBhIGhhY2sgZm9yIG1ldGhvZHMgLSB0dXJuIGl0IGludG8gYSBmdW5jdGlvbgotICAgICAgICAgICAgIyBidXQgd2UgZHJvcCB0aGUgInNlbGYiIHBhcmFtLgotICAgICAgICAgICAgZm9iID0gb2IuaW1fZnVuYwotICAgICAgICAgICAgYXJnX29mZnNldCA9IDEKKyAgICAnJydSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgc2lnbmF0dXJlIG9mIGEgY2FsbGFibGUgb2JqZWN0LCBvciAnJy4KKworICAgIEZvciBQeXRob24tY29kZWQgZnVuY3Rpb25zIGFuZCBtZXRob2RzLCB0aGUgZmlyc3QgbGluZSBpcyBpbnRyb3NwZWN0ZWQuCisgICAgRGVsZXRlICdzZWxmJyBwYXJhbWV0ZXIgZm9yIGNsYXNzZXMgKC5fX2luaXRfXykgYW5kIGJvdW5kIG1ldGhvZHMuCisgICAgVGhlIG5leHQgbGluZXMgYXJlIHRoZSBmaXJzdCBsaW5lcyBvZiB0aGUgZG9jIHN0cmluZyB1cCB0byB0aGUgZmlyc3QKKyAgICBlbXB0eSBsaW5lIG9yIF9NQVhfTElORVMuICAgIEZvciBidWlsdGlucywgdGhpcyB0eXBpY2FsbHkgaW5jbHVkZXMKKyAgICB0aGUgYXJndW1lbnRzIGluIGFkZGl0aW9uIHRvIHRoZSByZXR1cm4gdmFsdWUuCisgICAgJycnCisgICAgYXJnc3BlYyA9ICIiCisgICAgdHJ5OgorICAgICAgICBvYl9jYWxsID0gb2IuX19jYWxsX18KKyAgICBleGNlcHQgQmFzZUV4Y2VwdGlvbjoKKyAgICAgICAgaWYgdHlwZShvYikgaXMgdHlwZXMuQ2xhc3NUeXBlOiAgIyBvbGQtc3R5bGUKKyAgICAgICAgICAgIG9iX2NhbGwgPSBvYgogICAgICAgICBlbHNlOgotICAgICAgICAgICAgZm9iID0gb2IKLSAgICAgICAgIyBUcnkgdG8gYnVpbGQgb25lIGZvciBQeXRob24gZGVmaW5lZCBmdW5jdGlvbnMKLSAgICAgICAgaWYgdHlwZShmb2IpIGluIFt0eXBlcy5GdW5jdGlvblR5cGUsIHR5cGVzLkxhbWJkYVR5cGVdOgotICAgICAgICAgICAgYXJnY291bnQgPSBmb2IuZnVuY19jb2RlLmNvX2FyZ2NvdW50Ci0gICAgICAgICAgICByZWFsX2FyZ3MgPSBmb2IuZnVuY19jb2RlLmNvX3Zhcm5hbWVzW2FyZ19vZmZzZXQ6YXJnY291bnRdCi0gICAgICAgICAgICBkZWZhdWx0cyA9IGZvYi5mdW5jX2RlZmF1bHRzIG9yIFtdCi0gICAgICAgICAgICBkZWZhdWx0cyA9IGxpc3QobWFwKGxhbWJkYSBuYW1lOiAiPSVzIiAlIHJlcHIobmFtZSksIGRlZmF1bHRzKSkKLSAgICAgICAgICAgIGRlZmF1bHRzID0gWyIiXSAqIChsZW4ocmVhbF9hcmdzKSAtIGxlbihkZWZhdWx0cykpICsgZGVmYXVsdHMKLSAgICAgICAgICAgIGl0ZW1zID0gbWFwKGxhbWJkYSBhcmcsIGRmbHQ6IGFyZyArIGRmbHQsIHJlYWxfYXJncywgZGVmYXVsdHMpCi0gICAgICAgICAgICBpZiBmb2IuZnVuY19jb2RlLmNvX2ZsYWdzICYgMHg0OgotICAgICAgICAgICAgICAgIGl0ZW1zLmFwcGVuZCgiLi4uIikKLSAgICAgICAgICAgIGlmIGZvYi5mdW5jX2NvZGUuY29fZmxhZ3MgJiAweDg6Ci0gICAgICAgICAgICAgICAgaXRlbXMuYXBwZW5kKCIqKioiKQotICAgICAgICAgICAgYXJnX3RleHQgPSAiLCAiLmpvaW4oaXRlbXMpCi0gICAgICAgICAgICBhcmdfdGV4dCA9ICIoJXMpIiAlIHJlLnN1YigiXC5cZCsiLCAiPHR1cGxlPiIsIGFyZ190ZXh0KQotICAgICAgICAjIFNlZSBpZiB3ZSBjYW4gdXNlIHRoZSBkb2NzdHJpbmcKKyAgICAgICAgICAgIHJldHVybiBhcmdzcGVjCisKKyAgICBhcmdfb2Zmc2V0ID0gMAorICAgIGlmIHR5cGUob2IpIGluICh0eXBlcy5DbGFzc1R5cGUsIHR5cGVzLlR5cGVUeXBlKToKKyAgICAgICAgIyBMb29rIGZvciB0aGUgZmlyc3QgX19pbml0X18gaW4gdGhlIGNsYXNzIGNoYWluIHdpdGggLmltX2Z1bmMuCisgICAgICAgICMgU2xvdCB3cmFwcGVycyAoYnVpbHRpbnMsIGNsYXNzZXMgZGVmaW5lZCBpbiBmdW5jcykgZG8gbm90LgorICAgICAgICBmb2IgPSBfZmluZF9jb25zdHJ1Y3RvcihvYikKKyAgICAgICAgaWYgZm9iIGlzIE5vbmU6CisgICAgICAgICAgICBmb2IgPSBsYW1iZGE6IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFyZ19vZmZzZXQgPSAxCisgICAgZWxpZiB0eXBlKG9iKSA9PSB0eXBlcy5NZXRob2RUeXBlOgorICAgICAgICAjIGJpdCBvZiBhIGhhY2sgZm9yIG1ldGhvZHMgLSB0dXJuIGl0IGludG8gYSBmdW5jdGlvbgorICAgICAgICAjIGFuZCBkcm9wIHRoZSAic2VsZiIgcGFyYW0gZm9yIGJvdW5kIG1ldGhvZHMKKyAgICAgICAgZm9iID0gb2IuaW1fZnVuYworICAgICAgICBpZiBvYi5pbV9zZWxmIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYXJnX29mZnNldCA9IDEKKyAgICBlbGlmIHR5cGUob2JfY2FsbCkgPT0gdHlwZXMuTWV0aG9kVHlwZToKKyAgICAgICAgIyBhIGNhbGxhYmxlIGNsYXNzIGluc3RhbmNlCisgICAgICAgIGZvYiA9IG9iX2NhbGwuaW1fZnVuYworICAgICAgICBhcmdfb2Zmc2V0ID0gMQorICAgIGVsc2U6CisgICAgICAgIGZvYiA9IG9iCisgICAgIyBUcnkgdG8gYnVpbGQgb25lIGZvciBQeXRob24gZGVmaW5lZCBmdW5jdGlvbnMKKyAgICBpZiB0eXBlKGZvYikgaW4gW3R5cGVzLkZ1bmN0aW9uVHlwZSwgdHlwZXMuTGFtYmRhVHlwZV06CisgICAgICAgIGFyZ2NvdW50ID0gZm9iLmZ1bmNfY29kZS5jb19hcmdjb3VudAorICAgICAgICByZWFsX2FyZ3MgPSBmb2IuZnVuY19jb2RlLmNvX3Zhcm5hbWVzW2FyZ19vZmZzZXQ6YXJnY291bnRdCisgICAgICAgIGRlZmF1bHRzID0gZm9iLmZ1bmNfZGVmYXVsdHMgb3IgW10KKyAgICAgICAgZGVmYXVsdHMgPSBsaXN0KG1hcChsYW1iZGEgbmFtZTogIj0lcyIgJSByZXByKG5hbWUpLCBkZWZhdWx0cykpCisgICAgICAgIGRlZmF1bHRzID0gWyIiXSAqIChsZW4ocmVhbF9hcmdzKSAtIGxlbihkZWZhdWx0cykpICsgZGVmYXVsdHMKKyAgICAgICAgaXRlbXMgPSBtYXAobGFtYmRhIGFyZywgZGZsdDogYXJnICsgZGZsdCwgcmVhbF9hcmdzLCBkZWZhdWx0cykKKyAgICAgICAgZm9yIGZsYWcsIHByZSwgbmFtZSBpbiAoKDB4NCwgJyonLCAnYXJncycpLCAoMHg4LCAnKionLCAna3dhcmdzJykpOgorICAgICAgICAgICAgaWYgZm9iLmZ1bmNfY29kZS5jb19mbGFncyAmIGZsYWc6CisgICAgICAgICAgICAgICAgcHJlX25hbWUgPSBwcmUgKyBuYW1lCisgICAgICAgICAgICAgICAgaWYgbmFtZSBub3QgaW4gcmVhbF9hcmdzOgorICAgICAgICAgICAgICAgICAgICBpdGVtcy5hcHBlbmQocHJlX25hbWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaSA9IDEKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChuYW1lKyclcycpICUgaSkgaW4gcmVhbF9hcmdzOgorICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICAgICAgICAgIGl0ZW1zLmFwcGVuZCgocHJlX25hbWUrJyVzJykgJSBpKQorICAgICAgICBhcmdzcGVjID0gIiwgIi5qb2luKGl0ZW1zKQorICAgICAgICBhcmdzcGVjID0gIiglcykiICUgcmUuc3ViKCIoPzwhXGQpXC5cZCsiLCAiPHR1cGxlPiIsIGFyZ3NwZWMpCisKKyAgICBsaW5lcyA9ICh0ZXh0d3JhcC53cmFwKGFyZ3NwZWMsIF9NQVhfQ09MUywgc3Vic2VxdWVudF9pbmRlbnQ9X0lOREVOVCkKKyAgICAgICAgICAgIGlmIGxlbihhcmdzcGVjKSA+IF9NQVhfQ09MUyBlbHNlIFthcmdzcGVjXSBpZiBhcmdzcGVjIGVsc2UgW10pCisKKyAgICBpZiBpc2luc3RhbmNlKG9iX2NhbGwsIHR5cGVzLk1ldGhvZFR5cGUpOgorICAgICAgICBkb2MgPSBvYl9jYWxsLl9fZG9jX18KKyAgICBlbHNlOgogICAgICAgICBkb2MgPSBnZXRhdHRyKG9iLCAiX19kb2NfXyIsICIiKQotICAgICAgICBpZiBkb2M6Ci0gICAgICAgICAgICBkb2MgPSBkb2MubHN0cmlwKCkKLSAgICAgICAgICAgIHBvcyA9IGRvYy5maW5kKCJcbiIpCi0gICAgICAgICAgICBpZiBwb3MgPCAwIG9yIHBvcyA+IDcwOgotICAgICAgICAgICAgICAgIHBvcyA9IDcwCi0gICAgICAgICAgICBpZiBhcmdfdGV4dDoKLSAgICAgICAgICAgICAgICBhcmdfdGV4dCArPSAiXG4iCi0gICAgICAgICAgICBhcmdfdGV4dCArPSBkb2NbOnBvc10KLSAgICByZXR1cm4gYXJnX3RleHQKKyAgICBpZiBkb2M6CisgICAgICAgIGZvciBsaW5lIGluIGRvYy5zcGxpdCgnXG4nLCBfTUFYX0xJTkVTKVs6X01BWF9MSU5FU106CisgICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCisgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgbGVuKGxpbmUpID4gX01BWF9DT0xTOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzogX01BWF9DT0xTIC0gM10gKyAnLi4uJworICAgICAgICAgICAgbGluZXMuYXBwZW5kKGxpbmUpCisgICAgICAgIGFyZ3NwZWMgPSAnXG4nLmpvaW4obGluZXMpCisgICAgcmV0dXJuIGFyZ3NwZWMKIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBUZXN0IGNvZGUKLSMKLWlmIF9fbmFtZV9fPT0nX19tYWluX18nOgotCi0gICAgZGVmIHQxKCk6ICIoKSIKLSAgICBkZWYgdDIoYSwgYj1Ob25lKTogIihhLCBiPU5vbmUpIgotICAgIGRlZiB0MyhhLCAqYXJncyk6ICIoYSwgLi4uKSIKLSAgICBkZWYgdDQoKmFyZ3MpOiAiKC4uLikiCi0gICAgZGVmIHQ1KGEsICphcmdzKTogIihhLCAuLi4pIgotICAgIGRlZiB0NihhLCBiPU5vbmUsICphcmdzLCAqKmt3KTogIihhLCBiPU5vbmUsIC4uLiwgKioqKSIKLSAgICBkZWYgdDcoKGEsIGIpLCBjLCAoZCwgZSkpOiAiKDx0dXBsZT4sIGMsIDx0dXBsZT4pIgotCi0gICAgY2xhc3MgVEMob2JqZWN0KToKLSAgICAgICAgIihhaT1Ob25lLCAuLi4pIgotICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgYWk9Tm9uZSwgKmIpOiAiKGFpPU5vbmUsIC4uLikiCi0gICAgICAgIGRlZiB0MShzZWxmKTogIigpIgotICAgICAgICBkZWYgdDIoc2VsZiwgYWksIGI9Tm9uZSk6ICIoYWksIGI9Tm9uZSkiCi0gICAgICAgIGRlZiB0MyhzZWxmLCBhaSwgKmFyZ3MpOiAiKGFpLCAuLi4pIgotICAgICAgICBkZWYgdDQoc2VsZiwgKmFyZ3MpOiAiKC4uLikiCi0gICAgICAgIGRlZiB0NShzZWxmLCBhaSwgKmFyZ3MpOiAiKGFpLCAuLi4pIgotICAgICAgICBkZWYgdDYoc2VsZiwgYWksIGI9Tm9uZSwgKmFyZ3MsICoqa3cpOiAiKGFpLCBiPU5vbmUsIC4uLiwgKioqKSIKLSAgICAgICAgZGVmIHQ3KHNlbGYsIChhaSwgYiksIGMsIChkLCBlKSk6ICIoPHR1cGxlPiwgYywgPHR1cGxlPikiCi0KLSAgICBkZWYgdGVzdCh0ZXN0cyk6Ci0gICAgICAgIGN0ID0gQ2FsbFRpcHMoKQotICAgICAgICBmYWlsZWQ9W10KLSAgICAgICAgZm9yIHQgaW4gdGVzdHM6Ci0gICAgICAgICAgICBleHBlY3RlZCA9IHQuX19kb2NfXyArICJcbiIgKyB0Ll9fZG9jX18KLSAgICAgICAgICAgIG5hbWUgPSB0Ll9fbmFtZV9fCi0gICAgICAgICAgICAjIGV4ZXJjaXNlIGZldGNoX3RpcCgpLCBub3QganVzdCBnZXRfYXJnX3RleHQoKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHF1YWxpZmllZF9uYW1lID0gIiVzLiVzIiAlICh0LmltX2NsYXNzLl9fbmFtZV9fLCBuYW1lKQotICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICAgICAgICAgICAgIHF1YWxpZmllZF9uYW1lID0gbmFtZQotICAgICAgICAgICAgYXJnX3RleHQgPSBjdC5mZXRjaF90aXAocXVhbGlmaWVkX25hbWUpCi0gICAgICAgICAgICBpZiBhcmdfdGV4dCAhPSBleHBlY3RlZDoKLSAgICAgICAgICAgICAgICBmYWlsZWQuYXBwZW5kKHQpCi0gICAgICAgICAgICAgICAgZm10ID0gIiVzIC0gZXhwZWN0ZWQgJXMsIGJ1dCBnb3QgJXMiCi0gICAgICAgICAgICAgICAgcHJpbnQgIGZtdCAlICh0Ll9fbmFtZV9fLCBleHBlY3RlZCwgZ2V0X2FyZ190ZXh0KHQpKQotICAgICAgICBwcmludCAiJWQgb2YgJWQgdGVzdHMgZmFpbGVkIiAlIChsZW4oZmFpbGVkKSwgbGVuKHRlc3RzKSkKLQotICAgIHRjID0gVEMoKQotICAgIHRlc3RzID0gKHQxLCB0MiwgdDMsIHQ0LCB0NSwgdDYsIHQ3LAotICAgICAgICAgICAgIFRDLCB0Yy50MSwgdGMudDIsIHRjLnQzLCB0Yy50NCwgdGMudDUsIHRjLnQ2LCB0Yy50NykKLQotICAgIHRlc3QodGVzdHMpCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGZyb20gdW5pdHRlc3QgaW1wb3J0IG1haW4KKyAgICBtYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X2NhbGx0aXBzJywgdmVyYm9zaXR5PTIpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9DbGFzc0Jyb3dzZXIucHkgYi9MaWIvaWRsZWxpYi9DbGFzc0Jyb3dzZXIucHkKaW5kZXggMDk1YjMwZC4uYTBlNzgyZSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvQ2xhc3NCcm93c2VyLnB5CisrKyBiL0xpYi9pZGxlbGliL0NsYXNzQnJvd3Nlci5weQpAQCAtMjEsMTEgKzIxLDE1IEBACiAKIGNsYXNzIENsYXNzQnJvd3NlcjoKIAotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmbGlzdCwgbmFtZSwgcGF0aCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZsaXN0LCBuYW1lLCBwYXRoLCBfaHRlc3Q9RmFsc2UpOgogICAgICAgICAjIFhYWCBUaGlzIEFQSSBzaG91bGQgY2hhbmdlLCBpZiB0aGUgZmlsZSBkb2Vzbid0IGVuZCBpbiAiLnB5IgogICAgICAgICAjIFhYWCB0aGUgY29kZSBoZXJlIGlzIGJvZ3VzIQorICAgICAgICAiIiIKKyAgICAgICAgX2h0ZXN0IC0gYm9vbCwgY2hhbmdlIGJveCB3aGVuIGxvY2F0aW9uIHJ1bm5pbmcgaHRlc3QuCisgICAgICAgICIiIgogICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgIHNlbGYuZmlsZSA9IG9zLnBhdGguam9pbihwYXRoWzBdLCBzZWxmLm5hbWUgKyAiLnB5IikKKyAgICAgICAgc2VsZi5faHRlc3QgPSBfaHRlc3QKICAgICAgICAgc2VsZi5pbml0KGZsaXN0KQogCiAgICAgZGVmIGNsb3NlKHNlbGYsIGV2ZW50PU5vbmUpOgpAQCAtNDAsNiArNDQsOSBAQAogICAgICAgICBzZWxmLnRvcCA9IHRvcCA9IExpc3RlZFRvcGxldmVsKGZsaXN0LnJvb3QpCiAgICAgICAgIHRvcC5wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsIHNlbGYuY2xvc2UpCiAgICAgICAgIHRvcC5iaW5kKCI8RXNjYXBlPiIsIHNlbGYuY2xvc2UpCisgICAgICAgIGlmIHNlbGYuX2h0ZXN0OiAjIHBsYWNlIGRpYWxvZyBiZWxvdyBwYXJlbnQgaWYgcnVubmluZyBodGVzdAorICAgICAgICAgICAgdG9wLmdlb21ldHJ5KCIrJWQrJWQiICUKKyAgICAgICAgICAgICAgICAoZmxpc3Qucm9vdC53aW5mb19yb290eCgpLCBmbGlzdC5yb290LndpbmZvX3Jvb3R5KCkgKyAyMDApKQogICAgICAgICBzZWxmLnNldHRpdGxlKCkKICAgICAgICAgdG9wLmZvY3VzX3NldCgpCiAgICAgICAgICMgY3JlYXRlIHNjcm9sbGVkIGNhbnZhcwpAQCAtOTQsNyArMTAxLDcgQEAKICAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBkaWN0ID0gcHljbGJyLnJlYWRtb2R1bGVfZXgobmFtZSwgW2Rpcl0gKyBzeXMucGF0aCkKLSAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yLCBtc2c6CisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgICBpdGVtcyA9IFtdCiAgICAgICAgIHNlbGYuY2xhc3NlcyA9IHt9CkBAIC0yMDIsNyArMjA5LDcgQEAKICAgICAgICAgZWRpdCA9IFB5U2hlbGwuZmxpc3Qub3BlbihzZWxmLmZpbGUpCiAgICAgICAgIGVkaXQuZ290b2xpbmUoc2VsZi5jbC5tZXRob2RzW3NlbGYubmFtZV0pCiAKLWRlZiBtYWluKCk6CitkZWYgX2NsYXNzX2Jyb3dzZXIocGFyZW50KTogI1dyYXBwZXIgZm9yIGh0ZXN0CiAgICAgdHJ5OgogICAgICAgICBmaWxlID0gX19maWxlX18KICAgICBleGNlcHQgTmFtZUVycm9yOgpAQCAtMjEzLDkgKzIyMCwxMCBAQAogICAgICAgICAgICAgZmlsZSA9IHN5cy5hcmd2WzBdCiAgICAgZGlyLCBmaWxlID0gb3MucGF0aC5zcGxpdChmaWxlKQogICAgIG5hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGUpWzBdCi0gICAgQ2xhc3NCcm93c2VyKFB5U2hlbGwuZmxpc3QsIG5hbWUsIFtkaXJdKQotICAgIGlmIHN5cy5zdGRpbiBpcyBzeXMuX19zdGRpbl9fOgotICAgICAgICBtYWlubG9vcCgpCisgICAgZmxpc3QgPSBQeVNoZWxsLlB5U2hlbGxGaWxlTGlzdChwYXJlbnQpCisgICAgQ2xhc3NCcm93c2VyKGZsaXN0LCBuYW1lLCBbZGlyXSwgX2h0ZXN0PVRydWUpCisgICAgcGFyZW50Lm1haW5sb29wKCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICBtYWluKCkKKyAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KKyAgICBydW4oX2NsYXNzX2Jyb3dzZXIpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9Db2xvckRlbGVnYXRvci5weSBiL0xpYi9pZGxlbGliL0NvbG9yRGVsZWdhdG9yLnB5CmluZGV4IDdmNGQ3NDAuLjBjNjI1ZDMgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0NvbG9yRGVsZWdhdG9yLnB5CisrKyBiL0xpYi9pZGxlbGliL0NvbG9yRGVsZWdhdG9yLnB5CkBAIC0xNiwxNCArMTYsMTggQEAKICAgICBrdyA9IHIiXGIiICsgYW55KCJLRVlXT1JEIiwga2V5d29yZC5rd2xpc3QpICsgciJcYiIKICAgICBidWlsdGlubGlzdCA9IFtzdHIobmFtZSkgZm9yIG5hbWUgaW4gZGlyKF9fYnVpbHRpbl9fKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBuYW1lLnN0YXJ0c3dpdGgoJ18nKV0KKyAgICAjIFdlIGRvbid0IGtub3cgd2hldGhlciAicHJpbnQiIGlzIGEgZnVuY3Rpb24gb3IgYSBrZXl3b3JkLAorICAgICMgc28gd2UgYWx3YXlzIHRyZWF0IGlzIGFzIGEga2V5d29yZCAodGhlIG1vc3QgY29tbW9uIGNhc2UpLgorICAgIGJ1aWx0aW5saXN0LnJlbW92ZSgncHJpbnQnKQogICAgICMgc2VsZi5maWxlID0gZmlsZSgiZmlsZSIpIDoKICAgICAjIDFzdCAnZmlsZScgY29sb3JpemVkIG5vcm1hbCwgMm5kIGFzIGJ1aWx0aW4sIDNyZCBhcyBzdHJpbmcKICAgICBidWlsdGluID0gciIoW14uJ1wiXFwjXVxifF4pIiArIGFueSgiQlVJTFRJTiIsIGJ1aWx0aW5saXN0KSArIHIiXGIiCiAgICAgY29tbWVudCA9IGFueSgiQ09NTUVOVCIsIFtyIiNbXlxuXSoiXSkKLSAgICBzcXN0cmluZyA9IHIiKFxiW3JSdVVdKT8nW14nXFxcbl0qKFxcLlteJ1xcXG5dKikqJz8iCi0gICAgZHFzdHJpbmcgPSByJyhcYltyUnVVXSk/IlteIlxcXG5dKihcXC5bXiJcXFxuXSopKiI/JwotICAgIHNxM3N0cmluZyA9IHIiKFxiW3JSdVVdKT8nJydbXidcXF0qKChcXC58Jyg/IScnKSlbXidcXF0qKSooJycnKT8iCi0gICAgZHEzc3RyaW5nID0gcicoXGJbclJ1VV0pPyIiIlteIlxcXSooKFxcLnwiKD8hIiIpKVteIlxcXSopKigiIiIpPycKKyAgICBzdHJpbmdwcmVmaXggPSByIihcYnJ8dXx1cnxSfFV8VVJ8VXJ8dVJ8YnxCfGJyfEJyfGJSfEJSKT8iCisgICAgc3FzdHJpbmcgPSBzdHJpbmdwcmVmaXggKyByIidbXidcXFxuXSooXFwuW14nXFxcbl0qKSonPyIKKyAgICBkcXN0cmluZyA9IHN0cmluZ3ByZWZpeCArIHInIlteIlxcXG5dKihcXC5bXiJcXFxuXSopKiI/JworICAgIHNxM3N0cmluZyA9IHN0cmluZ3ByZWZpeCArIHIiJycnW14nXFxdKigoXFwufCcoPyEnJykpW14nXFxdKikqKCcnJyk/IgorICAgIGRxM3N0cmluZyA9IHN0cmluZ3ByZWZpeCArIHInIiIiW14iXFxdKigoXFwufCIoPyEiIikpW14iXFxdKikqKCIiIik/JwogICAgIHN0cmluZyA9IGFueSgiU1RSSU5HIiwgW3NxM3N0cmluZywgZHEzc3RyaW5nLCBzcXN0cmluZywgZHFzdHJpbmddKQogICAgIHJldHVybiBrdyArICJ8IiArIGJ1aWx0aW4gKyAifCIgKyBjb21tZW50ICsgInwiICsgc3RyaW5nICtcCiAgICAgICAgICAgICJ8IiArIGFueSgiU1lOQyIsIFtyIlxuIl0pCkBAIC00OSw2ICs1MywxMCBAQAogICAgICAgICAgICAgc2VsZi5jb25maWdfY29sb3JzKCkKICAgICAgICAgICAgIHNlbGYuYmluZCgiPDx0b2dnbGUtYXV0by1jb2xvcmluZz4+Iiwgc2VsZi50b2dnbGVfY29sb3JpemVfZXZlbnQpCiAgICAgICAgICAgICBzZWxmLm5vdGlmeV9yYW5nZSgiMS4wIiwgImVuZCIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIE5vIGRlbGVnYXRlIC0gc3RvcCBhbnkgY29sb3JpemluZworICAgICAgICAgICAgc2VsZi5zdG9wX2NvbG9yaXppbmcgPSBUcnVlCisgICAgICAgICAgICBzZWxmLmFsbG93X2NvbG9yaXppbmcgPSBGYWxzZQogCiAgICAgZGVmIGNvbmZpZ19jb2xvcnMoc2VsZik6CiAgICAgICAgIGZvciB0YWcsIGNuZiBpbiBzZWxmLnRhZ2RlZnMuaXRlbXMoKToKQEAgLTI0NywxNyArMjU1LDIxIEBACiAgICAgICAgIGZvciB0YWcgaW4gc2VsZi50YWdkZWZzLmtleXMoKToKICAgICAgICAgICAgIHNlbGYudGFnX3JlbW92ZSh0YWcsICIxLjAiLCAiZW5kIikKIAotZGVmIG1haW4oKToKK2RlZiBfY29sb3JfZGVsZWdhdG9yKHBhcmVudCk6CiAgICAgZnJvbSBpZGxlbGliLlBlcmNvbGF0b3IgaW1wb3J0IFBlcmNvbGF0b3IKICAgICByb290ID0gVGsoKQotICAgIHJvb3Qud21fcHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCByb290LnF1aXQpCi0gICAgdGV4dCA9IFRleHQoYmFja2dyb3VuZD0id2hpdGUiKQorICAgIHJvb3QudGl0bGUoIlRlc3QgQ29sb3JEZWxlZ2F0b3IiKQorICAgIHdpZHRoLCBoZWlnaHQsIHgsIHkgPSBsaXN0KG1hcChpbnQsIHJlLnNwbGl0KCdbeCtdJywgcGFyZW50Lmdlb21ldHJ5KCkpKSkKKyAgICByb290Lmdlb21ldHJ5KCIrJWQrJWQiJSh4LCB5ICsgMTUwKSkKKyAgICBzb3VyY2UgPSAiaWYgc29tZW5hbWU6IHggPSAnYWJjJyAjIGNvbW1lbnRcbnByaW50IgorICAgIHRleHQgPSBUZXh0KHJvb3QsIGJhY2tncm91bmQ9IndoaXRlIikKKyAgICB0ZXh0Lmluc2VydCgiaW5zZXJ0Iiwgc291cmNlKQogICAgIHRleHQucGFjayhleHBhbmQ9MSwgZmlsbD0iYm90aCIpCi0gICAgdGV4dC5mb2N1c19zZXQoKQogICAgIHAgPSBQZXJjb2xhdG9yKHRleHQpCiAgICAgZCA9IENvbG9yRGVsZWdhdG9yKCkKICAgICBwLmluc2VydGZpbHRlcihkKQogICAgIHJvb3QubWFpbmxvb3AoKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIG1haW4oKQorICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgorICAgIHJ1bihfY29sb3JfZGVsZWdhdG9yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvRGVidWdnZXIucHkgYi9MaWIvaWRsZWxpYi9EZWJ1Z2dlci5weQppbmRleCAwNGVlYTMyLi43MTA0NWRkIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9EZWJ1Z2dlci5weQorKysgYi9MaWIvaWRsZWxpYi9EZWJ1Z2dlci5weQpAQCAtMSw2ICsxLDUgQEAKIGltcG9ydCBvcwogaW1wb3J0IGJkYgotaW1wb3J0IHR5cGVzCiBmcm9tIFRraW50ZXIgaW1wb3J0ICoKIGZyb20gaWRsZWxpYi5XaW5kb3dMaXN0IGltcG9ydCBMaXN0ZWRUb3BsZXZlbAogZnJvbSBpZGxlbGliLlNjcm9sbGVkTGlzdCBpbXBvcnQgU2Nyb2xsZWRMaXN0CkBAIC0yNTMsOCArMjUyLDggQEAKICAgICAgICAgaWYgc2VsZi52c291cmNlLmdldCgpOgogICAgICAgICAgICAgc2VsZi5zeW5jX3NvdXJjZV9saW5lKCkKIAotICAgIGRlZiBzaG93X2ZyYW1lKHNlbGYsIChmcmFtZSwgbGluZW5vKSk6Ci0gICAgICAgIHNlbGYuZnJhbWUgPSBmcmFtZQorICAgIGRlZiBzaG93X2ZyYW1lKHNlbGYsIHN0YWNraXRlbSk6CisgICAgICAgIHNlbGYuZnJhbWUgPSBzdGFja2l0ZW1bMF0gICMgbGluZW5vIGlzIHN0YWNraXRlbVsxXQogICAgICAgICBzZWxmLnNob3dfdmFyaWFibGVzKCkKIAogICAgIGxvY2Fsc3ZpZXdlciA9IE5vbmUKQEAgLTMyMyw3ICszMjIsNyBAQAogY2xhc3MgU3RhY2tWaWV3ZXIoU2Nyb2xsZWRMaXN0KToKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIGZsaXN0LCBndWkpOgotICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LnJ1bm5pbmdBc09TWEFwcCgpOgorICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LmlzQXF1YVRrKCk6CiAgICAgICAgICAgICAjIEF0IGxlYXN0IG9uIHdpdGggdGhlIHN0b2NrIEFxdWFUayB2ZXJzaW9uIG9uIE9TWCAxMC40IHlvdSdsbAogICAgICAgICAgICAgIyBnZXQgYW4gc2hha2luZyBHVUkgdGhhdCBldmVudHVhbGx5IGtpbGxzIElETEUgaWYgdGhlIHdpZHRoCiAgICAgICAgICAgICAjIGFyZ3VtZW50IGlzIHNwZWNpZmllZC4KZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0RlbGVnYXRvci5weSBiL0xpYi9pZGxlbGliL0RlbGVnYXRvci5weQppbmRleCA2MTI1NTkxLi5jNDc2NTE2IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9EZWxlZ2F0b3IucHkKKysrIGIvTGliL2lkbGVsaWIvRGVsZWdhdG9yLnB5CkBAIC00LDMwICs0LDIyIEBACiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgZGVsZWdhdGU9Tm9uZSk6CiAgICAgICAgIHNlbGYuZGVsZWdhdGUgPSBkZWxlZ2F0ZQotICAgICAgICBzZWxmLl9fY2FjaGUgPSB7fQorICAgICAgICBzZWxmLl9fY2FjaGUgPSBzZXQoKQogCiAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgogICAgICAgICBhdHRyID0gZ2V0YXR0cihzZWxmLmRlbGVnYXRlLCBuYW1lKSAjIE1heSByYWlzZSBBdHRyaWJ1dGVFcnJvcgogICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIGF0dHIpCi0gICAgICAgIHNlbGYuX19jYWNoZVtuYW1lXSA9IGF0dHIKKyAgICAgICAgc2VsZi5fX2NhY2hlLmFkZChuYW1lKQogICAgICAgICByZXR1cm4gYXR0cgogCiAgICAgZGVmIHJlc2V0Y2FjaGUoc2VsZik6Ci0gICAgICAgIGZvciBrZXkgaW4gc2VsZi5fX2NhY2hlLmtleXMoKToKKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLl9fY2FjaGU6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgZGVsYXR0cihzZWxmLCBrZXkpCiAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICBzZWxmLl9fY2FjaGUuY2xlYXIoKQogCi0gICAgZGVmIGNhY2hlcmVwb3J0KHNlbGYpOgotICAgICAgICBrZXlzID0gc2VsZi5fX2NhY2hlLmtleXMoKQotICAgICAgICBrZXlzLnNvcnQoKQotICAgICAgICBwcmludCBrZXlzCi0KICAgICBkZWYgc2V0ZGVsZWdhdGUoc2VsZiwgZGVsZWdhdGUpOgogICAgICAgICBzZWxmLnJlc2V0Y2FjaGUoKQogICAgICAgICBzZWxmLmRlbGVnYXRlID0gZGVsZWdhdGUKLQotICAgIGRlZiBnZXRkZWxlZ2F0ZShzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuZGVsZWdhdGUKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0VkaXRvcldpbmRvdy5weSBiL0xpYi9pZGxlbGliL0VkaXRvcldpbmRvdy5weQppbmRleCA3N2RjZDUwLi45NTdkNTUwIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9FZGl0b3JXaW5kb3cucHkKKysrIGIvTGliL2lkbGVsaWIvRWRpdG9yV2luZG93LnB5CkBAIC0xLDUgKzEsNiBAQAogaW1wb3J0IHN5cwogaW1wb3J0IG9zCitmcm9tIHBsYXRmb3JtIGltcG9ydCBweXRob25fdmVyc2lvbgogaW1wb3J0IHJlCiBpbXBvcnQgaW1wCiBmcm9tIFRraW50ZXIgaW1wb3J0ICoKQEAgLTY1LDYgKzY2LDUyIEBACiAgICAgICAgICAgICBkZXNjciA9IGZpbGVuYW1lLCBOb25lLCBpbXAuUFlfU09VUkNFCiAgICAgcmV0dXJuIGZpbGUsIGZpbGVuYW1lLCBkZXNjcgogCisKK2NsYXNzIEhlbHBEaWFsb2cob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5wYXJlbnQgPSBOb25lICAgICAgIyBwYXJlbnQgb2YgaGVscCB3aW5kb3cKKyAgICAgICAgc2VsZi5kbGcgPSBOb25lICAgICAgICAgIyB0aGUgaGVscCB3aW5kb3cgaXRlc2VsZgorCisgICAgZGVmIGRpc3BsYXkoc2VsZiwgcGFyZW50LCBuZWFyPU5vbmUpOgorICAgICAgICAiIiIgRGlzcGxheSB0aGUgaGVscCBkaWFsb2cuCisKKyAgICAgICAgICAgIHBhcmVudCAtIHBhcmVudCB3aWRnZXQgZm9yIHRoZSBoZWxwIHdpbmRvdworCisgICAgICAgICAgICBuZWFyIC0gYSBUb3BsZXZlbCB3aWRnZXQgKGUuZy4gRWRpdG9yV2luZG93IG9yIFB5U2hlbGwpCisgICAgICAgICAgICAgICAgICAgdG8gdXNlIGFzIGEgcmVmZXJlbmNlIGZvciBwbGFjaW5nIHRoZSBoZWxwIHdpbmRvdworICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5kbGcgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuc2hvd19kaWFsb2cocGFyZW50KQorICAgICAgICBpZiBuZWFyOgorICAgICAgICAgICAgc2VsZi5uZWFyd2luZG93KG5lYXIpCisKKyAgICBkZWYgc2hvd19kaWFsb2coc2VsZiwgcGFyZW50KToKKyAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKKyAgICAgICAgZm49b3MucGF0aC5qb2luKG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKSwnaGVscC50eHQnKQorICAgICAgICBzZWxmLmRsZyA9IGRsZyA9IHRleHRWaWV3LnZpZXdfZmlsZShwYXJlbnQsJ0hlbHAnLGZuLCBtb2RhbD1GYWxzZSkKKyAgICAgICAgZGxnLmJpbmQoJzxEZXN0cm95PicsIHNlbGYuZGVzdHJveSwgJysnKQorCisgICAgZGVmIG5lYXJ3aW5kb3coc2VsZiwgbmVhcik6CisgICAgICAgICMgUGxhY2UgdGhlIGhlbHAgZGlhbG9nIG5lYXIgdGhlIHdpbmRvdyBzcGVjaWZpZWQgYnkgcGFyZW50LgorICAgICAgICAjIE5vdGUgLSB0aGlzIG1heSBub3QgcmVwb3NpdGlvbiB0aGUgd2luZG93IGluIE1ldGFjaXR5CisgICAgICAgICMgIGlmICIvYXBwcy9tZXRhY2l0eS9nZW5lcmFsL2Rpc2FibGVfd29ya2Fyb3VuZHMiIGlzIGVuYWJsZWQKKyAgICAgICAgZGxnID0gc2VsZi5kbGcKKyAgICAgICAgZ2VvbSA9IChuZWFyLndpbmZvX3Jvb3R4KCkgKyAxMCwgbmVhci53aW5mb19yb290eSgpICsgMTApCisgICAgICAgIGRsZy53aXRoZHJhdygpCisgICAgICAgIGRsZy5nZW9tZXRyeSgiPSslZCslZCIgJSBnZW9tKQorICAgICAgICBkbGcuZGVpY29uaWZ5KCkKKyAgICAgICAgZGxnLmxpZnQoKQorCisgICAgZGVmIGRlc3Ryb3koc2VsZiwgZXY9Tm9uZSk6CisgICAgICAgIHNlbGYuZGxnID0gTm9uZQorICAgICAgICBzZWxmLnBhcmVudCA9IE5vbmUKKworaGVscERpYWxvZyA9IEhlbHBEaWFsb2coKSAgIyBzaW5nbGV0b24gaW5zdGFuY2UKK2RlZiBfaGVscF9kaWFsb2cocGFyZW50KTogICMgd3JhcHBlciBmb3IgaHRlc3QKKyAgICBoZWxwRGlhbG9nLnNob3dfZGlhbG9nKHBhcmVudCkKKworCiBjbGFzcyBFZGl0b3JXaW5kb3cob2JqZWN0KToKICAgICBmcm9tIGlkbGVsaWIuUGVyY29sYXRvciBpbXBvcnQgUGVyY29sYXRvcgogICAgIGZyb20gaWRsZWxpYi5Db2xvckRlbGVnYXRvciBpbXBvcnQgQ29sb3JEZWxlZ2F0b3IKQEAgLTkzLDggKzE0MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUHl0aG9uJXMuY2htJyAlIF9zcGhpbnhfdmVyc2lvbigpKQogICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGNobWZpbGUpOgogICAgICAgICAgICAgICAgICAgICBkb2Nob21lID0gY2htZmlsZQotICAgICAgICAgICAgZWxpZiBtYWNvc3hTdXBwb3J0LnJ1bm5pbmdBc09TWEFwcCgpOgotICAgICAgICAgICAgICAgICMgZG9jdW1lbnRhdGlvbiBpcyBzdG9yZWQgaW5zaWRlIHRoZSBweXRob24gZnJhbWV3b3JrCisgICAgICAgICAgICBlbGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgICAgICAgICAjIGRvY3VtZW50YXRpb24gbWF5IGJlIHN0b3JlZCBpbnNpZGUgYSBweXRob24gZnJhbWV3b3JrCiAgICAgICAgICAgICAgICAgZG9jaG9tZSA9IG9zLnBhdGguam9pbihzeXMucHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgJ1Jlc291cmNlcy9FbmdsaXNoLmxwcm9qL0RvY3VtZW50YXRpb24vaW5kZXguaHRtbCcpCiAgICAgICAgICAgICBkb2Nob21lID0gb3MucGF0aC5ub3JtcGF0aChkb2Nob21lKQpAQCAtMTI4LDEzICsxNzUsMTMgQEAKICAgICAgICAgICAgICAgICAncmVjZW50LWZpbGVzLmxzdCcpCiAgICAgICAgIHNlbGYudGV4dF9mcmFtZSA9IHRleHRfZnJhbWUgPSBGcmFtZSh0b3ApCiAgICAgICAgIHNlbGYudmJhciA9IHZiYXIgPSBTY3JvbGxiYXIodGV4dF9mcmFtZSwgbmFtZT0ndmJhcicpCi0gICAgICAgIHNlbGYud2lkdGggPSBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCdFZGl0b3JXaW5kb3cnLCd3aWR0aCcpCisgICAgICAgIHNlbGYud2lkdGggPSBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCdFZGl0b3JXaW5kb3cnLCd3aWR0aCcsIHR5cGU9J2ludCcpCiAgICAgICAgIHRleHRfb3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgICAnbmFtZSc6ICd0ZXh0JywKICAgICAgICAgICAgICAgICAncGFkeCc6IDUsCiAgICAgICAgICAgICAgICAgJ3dyYXAnOiAnbm9uZScsCiAgICAgICAgICAgICAgICAgJ3dpZHRoJzogc2VsZi53aWR0aCwKLSAgICAgICAgICAgICAgICAnaGVpZ2h0JzogaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywgJ0VkaXRvcldpbmRvdycsICdoZWlnaHQnKX0KKyAgICAgICAgICAgICAgICAnaGVpZ2h0JzogaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywgJ0VkaXRvcldpbmRvdycsICdoZWlnaHQnLCB0eXBlPSdpbnQnKX0KICAgICAgICAgaWYgVGtWZXJzaW9uID49IDguNToKICAgICAgICAgICAgICMgU3RhcnRpbmcgd2l0aCB0ayA4LjUgd2UgaGF2ZSB0byBzZXQgdGhlIG5ldyB0YWJzdHlsZSBvcHRpb24KICAgICAgICAgICAgICMgdG8gJ3dvcmRwcm9jZXNzb3InIHRvIGFjaGlldmUgdGhlIHNhbWUgZGlzcGxheSBvZiB0YWJzIGFzIGluCkBAIC0xNDgsNyArMTk1LDcgQEAKIAogICAgICAgICBzZWxmLnRvcC5wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsIHNlbGYuY2xvc2UpCiAgICAgICAgIHNlbGYudG9wLmJpbmQoIjw8Y2xvc2Utd2luZG93Pj4iLCBzZWxmLmNsb3NlX2V2ZW50KQotICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LnJ1bm5pbmdBc09TWEFwcCgpOgorICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LmlzQXF1YVRrKCk6CiAgICAgICAgICAgICAjIENvbW1hbmQtVyBvbiBlZGl0b3J3aW5kb3dzIGRvZXNuJ3Qgd29yayB3aXRob3V0IHRoaXMuCiAgICAgICAgICAgICB0ZXh0LmJpbmQoJzw8Y2xvc2Utd2luZG93Pj4nLCBzZWxmLmNsb3NlX2V2ZW50KQogICAgICAgICAgICAgIyBTb21lIE9TIFggc3lzdGVtcyBoYXZlIG9ubHkgb25lIG1vdXNlIGJ1dHRvbiwKQEAgLTIxMSw3ICsyNTgsOCBAQAogICAgICAgICBpZiBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCAnRWRpdG9yV2luZG93JywgJ2ZvbnQtYm9sZCcsIHR5cGU9J2Jvb2wnKToKICAgICAgICAgICAgIGZvbnRXZWlnaHQ9J2JvbGQnCiAgICAgICAgIHRleHQuY29uZmlnKGZvbnQ9KGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsICdFZGl0b3JXaW5kb3cnLCAnZm9udCcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCAnRWRpdG9yV2luZG93JywgJ2ZvbnQtc2l6ZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCAnRWRpdG9yV2luZG93JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb250LXNpemUnLCB0eXBlPSdpbnQnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udFdlaWdodCkpCiAgICAgICAgIHRleHRfZnJhbWUucGFjayhzaWRlPUxFRlQsIGZpbGw9Qk9USCwgZXhwYW5kPTEpCiAgICAgICAgIHRleHQucGFjayhzaWRlPVRPUCwgZmlsbD1CT1RILCBleHBhbmQ9MSkKQEAgLTMwMSw2ICszNDksMzYgQEAKICAgICAgICAgc2VsZi5hc2tpbnRlZ2VyID0gdGtTaW1wbGVEaWFsb2cuYXNraW50ZWdlcgogICAgICAgICBzZWxmLnNob3dlcnJvciA9IHRrTWVzc2FnZUJveC5zaG93ZXJyb3IKIAorICAgICAgICBzZWxmLl9oaWdobGlnaHRfd29ya2Fyb3VuZCgpICAjIEZpeCBzZWxlY3Rpb24gdGFncyBvbiBXaW5kb3dzCisKKyAgICBkZWYgX2hpZ2hsaWdodF93b3JrYXJvdW5kKHNlbGYpOgorICAgICAgICAjIE9uIFdpbmRvd3MsIFRrIHJlbW92ZXMgcGFpbnRpbmcgb2YgdGhlIHNlbGVjdGlvbgorICAgICAgICAjIHRhZ3Mgd2hpY2ggaXMgZGlmZmVyZW50IGJlaGF2aW9yIHRoYW4gb24gTGludXggYW5kIE1hYy4KKyAgICAgICAgIyBTZWUgaXNzdWUxNDE0NiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgaWYgbm90IHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCd3aW4nKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHRleHQgPSBzZWxmLnRleHQKKyAgICAgICAgdGV4dC5ldmVudF9hZGQoIjw8SGlnaGxpZ2h0LUZvY3VzT3V0Pj4iLCAiPEZvY3VzT3V0PiIpCisgICAgICAgIHRleHQuZXZlbnRfYWRkKCI8PEhpZ2hsaWdodC1Gb2N1c0luPj4iLCAiPEZvY3VzSW4+IikKKyAgICAgICAgZGVmIGhpZ2hsaWdodF9maXgoZm9jdXMpOgorICAgICAgICAgICAgc2VsX3JhbmdlID0gdGV4dC50YWdfcmFuZ2VzKCJzZWwiKQorICAgICAgICAgICAgaWYgc2VsX3JhbmdlOgorICAgICAgICAgICAgICAgIGlmIGZvY3VzID09ICdvdXQnOgorICAgICAgICAgICAgICAgICAgICBISUxJVEVfQ09ORklHID0gaWRsZUNvbmYuR2V0SGlnaGxpZ2h0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkbGVDb25mLkN1cnJlbnRUaGVtZSgpLCAnaGlsaXRlJykKKyAgICAgICAgICAgICAgICAgICAgdGV4dC50YWdfY29uZmlnKCJzZWxfZml4IiwgSElMSVRFX0NPTkZJRykKKyAgICAgICAgICAgICAgICAgICAgdGV4dC50YWdfcmFpc2UoInNlbF9maXgiKQorICAgICAgICAgICAgICAgICAgICB0ZXh0LnRhZ19hZGQoInNlbF9maXgiLCAqc2VsX3JhbmdlKQorICAgICAgICAgICAgICAgIGVsaWYgZm9jdXMgPT0gJ2luJzoKKyAgICAgICAgICAgICAgICAgICAgdGV4dC50YWdfcmVtb3ZlKCJzZWxfZml4IiwgIjEuMCIsICJlbmQiKQorCisgICAgICAgIHRleHQuYmluZCgiPDxIaWdobGlnaHQtRm9jdXNPdXQ+PiIsCisgICAgICAgICAgICAgICAgbGFtYmRhIGV2OiBoaWdobGlnaHRfZml4KCJvdXQiKSkKKyAgICAgICAgdGV4dC5iaW5kKCI8PEhpZ2hsaWdodC1Gb2N1c0luPj4iLAorICAgICAgICAgICAgICAgIGxhbWJkYSBldjogaGlnaGxpZ2h0X2ZpeCgiaW4iKSkKKworCiAgICAgZGVmIF9maWxlbmFtZV90b191bmljb2RlKHNlbGYsIGZpbGVuYW1lKToKICAgICAgICAgIiIiY29udmVydCBmaWxlbmFtZSB0byB1bmljb2RlIGluIG9yZGVyIHRvIGRpc3BsYXkgaXQgaW4gVGsiIiIKICAgICAgICAgaWYgaXNpbnN0YW5jZShmaWxlbmFtZSwgdW5pY29kZSkgb3Igbm90IGZpbGVuYW1lOgpAQCAtMzY0LDcgKzQ0Miw3IEBACiAKICAgICBkZWYgc2V0X3N0YXR1c19iYXIoc2VsZik6CiAgICAgICAgIHNlbGYuc3RhdHVzX2JhciA9IHNlbGYuTXVsdGlTdGF0dXNCYXIoc2VsZi50b3ApCi0gICAgICAgIGlmIG1hY29zeFN1cHBvcnQucnVubmluZ0FzT1NYQXBwKCk6CisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKICAgICAgICAgICAgICMgSW5zZXJ0IHNvbWUgcGFkZGluZyB0byBhdm9pZCBvYnNjdXJpbmcgc29tZSBvZiB0aGUgc3RhdHVzYmFyCiAgICAgICAgICAgICAjIGJ5IHRoZSByZXNpemUgd2lkZ2V0LgogICAgICAgICAgICAgc2VsZi5zdGF0dXNfYmFyLnNldF9sYWJlbCgnX3BhZGRpbmcxJywgJyAgICAnLCBzaWRlPVJJR0hUKQpAQCAtMzkxLDggKzQ2OSw3IEBACiAgICAgICAgICgiaGVscCIsICJfSGVscCIpLAogICAgIF0KIAotICAgIGlmIG1hY29zeFN1cHBvcnQucnVubmluZ0FzT1NYQXBwKCk6Ci0gICAgICAgIGRlbCBtZW51X3NwZWNzWy0zXQorICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKICAgICAgICAgbWVudV9zcGVjc1stMl0gPSAoIndpbmRvd3MiLCAiX1dpbmRvdyIpCiAKIApAQCAtNDA0LDcgKzQ4MSw3IEBACiAgICAgICAgICAgICBtZW51ZGljdFtuYW1lXSA9IG1lbnUgPSBNZW51KG1iYXIsIG5hbWU9bmFtZSkKICAgICAgICAgICAgIG1iYXIuYWRkX2Nhc2NhZGUobGFiZWw9bGFiZWwsIG1lbnU9bWVudSwgdW5kZXJsaW5lPXVuZGVybGluZSkKIAotICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LmlzQ2FyYm9uQXF1YVRrKHNlbGYucm9vdCk6CisgICAgICAgIGlmIG1hY29zeFN1cHBvcnQuaXNDYXJib25UaygpOgogICAgICAgICAgICAgIyBJbnNlcnQgdGhlIGFwcGxpY2F0aW9uIG1lbnUKICAgICAgICAgICAgIG1lbnVkaWN0WydhcHBsaWNhdGlvbiddID0gbWVudSA9IE1lbnUobWJhciwgbmFtZT0nYXBwbGUnKQogICAgICAgICAgICAgbWJhci5hZGRfY2FzY2FkZShsYWJlbD0nSURMRScsIG1lbnU9bWVudSkKQEAgLTQyNiw3ICs1MDMsNiBAQAogICAgIHJtZW51ID0gTm9uZQogCiAgICAgZGVmIHJpZ2h0X21lbnVfZXZlbnQoc2VsZiwgZXZlbnQpOgotICAgICAgICBzZWxmLnRleHQudGFnX3JlbW92ZSgic2VsIiwgIjEuMCIsICJlbmQiKQogICAgICAgICBzZWxmLnRleHQubWFya19zZXQoImluc2VydCIsICJAJWQsJWQiICUgKGV2ZW50LngsIGV2ZW50LnkpKQogICAgICAgICBpZiBub3Qgc2VsZi5ybWVudToKICAgICAgICAgICAgIHNlbGYubWFrZV9ybWVudSgpCkBAIC00MzUsMjMgKzUxMSw1OCBAQAogICAgICAgICBpc3dpbiA9IHN5cy5wbGF0Zm9ybVs6M10gPT0gJ3dpbicKICAgICAgICAgaWYgaXN3aW46CiAgICAgICAgICAgICBzZWxmLnRleHQuY29uZmlnKGN1cnNvcj0iYXJyb3ciKQorCisgICAgICAgIGZvciBpdGVtIGluIHNlbGYucm1lbnVfc3BlY3M6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbGFiZWwsIGV2ZW50bmFtZSwgdmVyaWZ5X3N0YXRlID0gaXRlbQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6ICMgc2VlIGlzc3VlMTIwNzU4OQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIHZlcmlmeV9zdGF0ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzdGF0ZSA9IGdldGF0dHIoc2VsZiwgdmVyaWZ5X3N0YXRlKSgpCisgICAgICAgICAgICBybWVudS5lbnRyeWNvbmZpZ3VyZShsYWJlbCwgc3RhdGU9c3RhdGUpCisKICAgICAgICAgcm1lbnUudGtfcG9wdXAoZXZlbnQueF9yb290LCBldmVudC55X3Jvb3QpCiAgICAgICAgIGlmIGlzd2luOgogICAgICAgICAgICAgc2VsZi50ZXh0LmNvbmZpZyhjdXJzb3I9ImliZWFtIikKIAogICAgIHJtZW51X3NwZWNzID0gWwotICAgICAgICAjICgiTGFiZWwiLCAiPDx2aXJ0dWFsLWV2ZW50Pj4iKSwgLi4uCi0gICAgICAgICgiQ2xvc2UiLCAiPDxjbG9zZS13aW5kb3c+PiIpLCAjIEV4YW1wbGUKKyAgICAgICAgIyAoIkxhYmVsIiwgIjw8dmlydHVhbC1ldmVudD4+IiwgInN0YXRlZnVuY25hbWUiKSwgLi4uCisgICAgICAgICgiQ2xvc2UiLCAiPDxjbG9zZS13aW5kb3c+PiIsIE5vbmUpLCAjIEV4YW1wbGUKICAgICBdCiAKICAgICBkZWYgbWFrZV9ybWVudShzZWxmKToKICAgICAgICAgcm1lbnUgPSBNZW51KHNlbGYudGV4dCwgdGVhcm9mZj0wKQotICAgICAgICBmb3IgbGFiZWwsIGV2ZW50bmFtZSBpbiBzZWxmLnJtZW51X3NwZWNzOgotICAgICAgICAgICAgZGVmIGNvbW1hbmQodGV4dD1zZWxmLnRleHQsIGV2ZW50bmFtZT1ldmVudG5hbWUpOgotICAgICAgICAgICAgICAgIHRleHQuZXZlbnRfZ2VuZXJhdGUoZXZlbnRuYW1lKQotICAgICAgICAgICAgcm1lbnUuYWRkX2NvbW1hbmQobGFiZWw9bGFiZWwsIGNvbW1hbmQ9Y29tbWFuZCkKKyAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5ybWVudV9zcGVjczoKKyAgICAgICAgICAgIGxhYmVsLCBldmVudG5hbWUgPSBpdGVtWzBdLCBpdGVtWzFdCisgICAgICAgICAgICBpZiBsYWJlbCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBkZWYgY29tbWFuZCh0ZXh0PXNlbGYudGV4dCwgZXZlbnRuYW1lPWV2ZW50bmFtZSk6CisgICAgICAgICAgICAgICAgICAgIHRleHQuZXZlbnRfZ2VuZXJhdGUoZXZlbnRuYW1lKQorICAgICAgICAgICAgICAgIHJtZW51LmFkZF9jb21tYW5kKGxhYmVsPWxhYmVsLCBjb21tYW5kPWNvbW1hbmQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJtZW51LmFkZF9zZXBhcmF0b3IoKQogICAgICAgICBzZWxmLnJtZW51ID0gcm1lbnUKIAorICAgIGRlZiBybWVudV9jaGVja19jdXQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJtZW51X2NoZWNrX2NvcHkoKQorCisgICAgZGVmIHJtZW51X2NoZWNrX2NvcHkoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGluZHggPSBzZWxmLnRleHQuaW5kZXgoJ3NlbC5maXJzdCcpCisgICAgICAgIGV4Y2VwdCBUY2xFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiAnZGlzYWJsZWQnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gJ25vcm1hbCcgaWYgaW5keCBlbHNlICdkaXNhYmxlZCcKKworICAgIGRlZiBybWVudV9jaGVja19wYXN0ZShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi50ZXh0LnRrLmNhbGwoJ3RrOjpHZXRTZWxlY3Rpb24nLCBzZWxmLnRleHQsICdDTElQQk9BUkQnKQorICAgICAgICBleGNlcHQgVGNsRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gJ2Rpc2FibGVkJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICdub3JtYWwnCisKICAgICBkZWYgYWJvdXRfZGlhbG9nKHNlbGYsIGV2ZW50PU5vbmUpOgogICAgICAgICBhYm91dERpYWxvZy5BYm91dERpYWxvZyhzZWxmLnRvcCwnQWJvdXQgSURMRScpCiAKQEAgLTQ1OSw4ICs1NzAsMTEgQEAKICAgICAgICAgY29uZmlnRGlhbG9nLkNvbmZpZ0RpYWxvZyhzZWxmLnRvcCwnU2V0dGluZ3MnKQogCiAgICAgZGVmIGhlbHBfZGlhbG9nKHNlbGYsIGV2ZW50PU5vbmUpOgotICAgICAgICBmbj1vcy5wYXRoLmpvaW4ob3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpLCdoZWxwLnR4dCcpCi0gICAgICAgIHRleHRWaWV3LnZpZXdfZmlsZShzZWxmLnRvcCwnSGVscCcsZm4pCisgICAgICAgIGlmIHNlbGYucm9vdDoKKyAgICAgICAgICAgIHBhcmVudCA9IHNlbGYucm9vdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGFyZW50ID0gc2VsZi50b3AKKyAgICAgICAgaGVscERpYWxvZy5kaXNwbGF5KHBhcmVudCwgbmVhcj1zZWxmLnRvcCkKIAogICAgIGRlZiBweXRob25fZG9jcyhzZWxmLCBldmVudD1Ob25lKToKICAgICAgICAgaWYgc3lzLnBsYXRmb3JtWzozXSA9PSAnd2luJzoKQEAgLTU3OCw3ICs2OTIsNyBAQAogICAgICAgICAjIFhYWCBPdWdodCB0byBpbnNlcnQgY3VycmVudCBmaWxlJ3MgZGlyZWN0b3J5IGluIGZyb250IG9mIHBhdGgKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgKGYsIGZpbGUsIChzdWZmaXgsIG1vZGUsIHR5cGUpKSA9IF9maW5kX21vZHVsZShuYW1lKQotICAgICAgICBleGNlcHQgKE5hbWVFcnJvciwgSW1wb3J0RXJyb3IpLCBtc2c6CisgICAgICAgIGV4Y2VwdCAoTmFtZUVycm9yLCBJbXBvcnRFcnJvcikgYXMgbXNnOgogICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcigiSW1wb3J0IGVycm9yIiwgc3RyKG1zZyksIHBhcmVudD1zZWxmLnRleHQpCiAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgaWYgdHlwZSAhPSBpbXAuUFlfU09VUkNFOgpAQCAtNjg4LDcgKzgwMiw4IEBACiAgICAgICAgIGlmIGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsJ0VkaXRvcldpbmRvdycsJ2ZvbnQtYm9sZCcsdHlwZT0nYm9vbCcpOgogICAgICAgICAgICAgZm9udFdlaWdodD0nYm9sZCcKICAgICAgICAgc2VsZi50ZXh0LmNvbmZpZyhmb250PShpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCdFZGl0b3JXaW5kb3cnLCdmb250JyksCi0gICAgICAgICAgICAgICAgaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywnRWRpdG9yV2luZG93JywnZm9udC1zaXplJyksCisgICAgICAgICAgICAgICAgaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywnRWRpdG9yV2luZG93JywnZm9udC1zaXplJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0naW50JyksCiAgICAgICAgICAgICAgICAgZm9udFdlaWdodCkpCiAKICAgICBkZWYgUmVtb3ZlS2V5YmluZGluZ3Moc2VsZik6CkBAIC03MjEsNyArODM2LDExIEBACiAgICAgICAgICAgICAgICAgICAgIG1lbnVFdmVudERpY3RbbWVudVswXV1bcHJlcHN0cihpdGVtWzBdKVsxXV0gPSBpdGVtWzFdCiAgICAgICAgIGZvciBtZW51YmFySXRlbSBpbiBzZWxmLm1lbnVkaWN0LmtleXMoKToKICAgICAgICAgICAgIG1lbnUgPSBzZWxmLm1lbnVkaWN0W21lbnViYXJJdGVtXQotICAgICAgICAgICAgZW5kID0gbWVudS5pbmRleChFTkQpICsgMQorICAgICAgICAgICAgZW5kID0gbWVudS5pbmRleChFTkQpCisgICAgICAgICAgICBpZiBlbmQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAjIFNraXAgZW1wdHkgbWVudXMKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZW5kICs9IDEKICAgICAgICAgICAgIGZvciBpbmRleCBpbiByYW5nZSgwLCBlbmQpOgogICAgICAgICAgICAgICAgIGlmIG1lbnUudHlwZShpbmRleCkgPT0gJ2NvbW1hbmQnOgogICAgICAgICAgICAgICAgICAgICBhY2NlbCA9IG1lbnUuZW50cnljZ2V0KGluZGV4LCAnYWNjZWxlcmF0b3InKQpAQCAtNzc4LDExICs4OTcsOCBAQAogICAgICAgICAiTG9hZCBhbmQgdXBkYXRlIHRoZSByZWNlbnQgZmlsZXMgbGlzdCBhbmQgbWVudXMiCiAgICAgICAgIHJmX2xpc3QgPSBbXQogICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLnJlY2VudF9maWxlc19wYXRoKToKLSAgICAgICAgICAgIHJmX2xpc3RfZmlsZSA9IG9wZW4oc2VsZi5yZWNlbnRfZmlsZXNfcGF0aCwncicpCi0gICAgICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoICBvcGVuKHNlbGYucmVjZW50X2ZpbGVzX3BhdGgsICdyJykgYXMgcmZfbGlzdF9maWxlOgogICAgICAgICAgICAgICAgIHJmX2xpc3QgPSByZl9saXN0X2ZpbGUucmVhZGxpbmVzKCkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcmZfbGlzdF9maWxlLmNsb3NlKCkKICAgICAgICAgaWYgbmV3X2ZpbGU6CiAgICAgICAgICAgICBuZXdfZmlsZSA9IG9zLnBhdGguYWJzcGF0aChuZXdfZmlsZSkgKyAnXG4nCiAgICAgICAgICAgICBpZiBuZXdfZmlsZSBpbiByZl9saXN0OgpAQCAtNzk2LDE1ICs5MTIsMjAgQEAKICAgICAgICAgcmZfbGlzdCA9IFtwYXRoIGZvciBwYXRoIGluIHJmX2xpc3QgaWYgcGF0aCBub3QgaW4gYmFkX3BhdGhzXQogICAgICAgICB1bGNoYXJzID0gIjEyMzQ1Njc4OTBBQkNERUZHSElKSyIKICAgICAgICAgcmZfbGlzdCA9IHJmX2xpc3RbMDpsZW4odWxjaGFycyldCi0gICAgICAgIHJmX2ZpbGUgPSBvcGVuKHNlbGYucmVjZW50X2ZpbGVzX3BhdGgsICd3JykKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmZfZmlsZS53cml0ZWxpbmVzKHJmX2xpc3QpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICByZl9maWxlLmNsb3NlKCkKKyAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLnJlY2VudF9maWxlc19wYXRoLCAndycpIGFzIHJmX2ZpbGU6CisgICAgICAgICAgICAgICAgcmZfZmlsZS53cml0ZWxpbmVzKHJmX2xpc3QpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGVycjoKKyAgICAgICAgICAgIGlmIG5vdCBnZXRhdHRyKHNlbGYucm9vdCwgInJlY2VudGZpbGVsaXN0X2Vycm9yX2Rpc3BsYXllZCIsIEZhbHNlKToKKyAgICAgICAgICAgICAgICBzZWxmLnJvb3QucmVjZW50ZmlsZWxpc3RfZXJyb3JfZGlzcGxheWVkID0gVHJ1ZQorICAgICAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IodGl0bGU9J0lETEUgRXJyb3InLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdVbmFibGUgdG8gdXBkYXRlIFJlY2VudCBGaWxlcyBsaXN0OlxuJXMnCisgICAgICAgICAgICAgICAgICAgICAgICAlIHN0cihlcnIpLAorICAgICAgICAgICAgICAgICAgICBwYXJlbnQ9c2VsZi50ZXh0KQogICAgICAgICAjIGZvciBlYWNoIGVkaXQgd2luZG93IGluc3RhbmNlLCBjb25zdHJ1Y3QgdGhlIHJlY2VudCBmaWxlcyBtZW51CiAgICAgICAgIGZvciBpbnN0YW5jZSBpbiBzZWxmLnRvcC5pbnN0YW5jZV9kaWN0LmtleXMoKToKICAgICAgICAgICAgIG1lbnUgPSBpbnN0YW5jZS5yZWNlbnRfZmlsZXNfbWVudQotICAgICAgICAgICAgbWVudS5kZWxldGUoMSwgRU5EKSAgIyBjbGVhciwgYW5kIHJlYnVpbGQ6CisgICAgICAgICAgICBtZW51LmRlbGV0ZSgwLCBFTkQpICAjIGNsZWFyLCBhbmQgcmVidWlsZDoKICAgICAgICAgICAgIGZvciBpLCBmaWxlX25hbWUgaW4gZW51bWVyYXRlKHJmX2xpc3QpOgogICAgICAgICAgICAgICAgIGZpbGVfbmFtZSA9IGZpbGVfbmFtZS5yc3RyaXAoKSAgIyB6YXAgXG4KICAgICAgICAgICAgICAgICAjIG1ha2UgdW5pY29kZSBzdHJpbmcgdG8gZGlzcGxheSBub24tQVNDSUkgY2hhcnMgY29ycmVjdGx5CkBAIC04NDcsMTEgKzk2OCwxNCBAQAogICAgICAgICBzZWxmLnVuZG8ucmVzZXRfdW5kbygpCiAKICAgICBkZWYgc2hvcnRfdGl0bGUoc2VsZik6CisgICAgICAgIHB5dmVyc2lvbiA9ICJQeXRob24gIiArIHB5dGhvbl92ZXJzaW9uKCkgKyAiOiAiCiAgICAgICAgIGZpbGVuYW1lID0gc2VsZi5pby5maWxlbmFtZQogICAgICAgICBpZiBmaWxlbmFtZToKICAgICAgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZpbGVuYW1lID0gIlVudGl0bGVkIgogICAgICAgICAjIHJldHVybiB1bmljb2RlIHN0cmluZyB0byBkaXNwbGF5IG5vbi1BU0NJSSBjaGFycyBjb3JyZWN0bHkKLSAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVuYW1lX3RvX3VuaWNvZGUoZmlsZW5hbWUpCisgICAgICAgIHJldHVybiBweXZlcnNpb24gKyBzZWxmLl9maWxlbmFtZV90b191bmljb2RlKGZpbGVuYW1lKQogCiAgICAgZGVmIGxvbmdfdGl0bGUoc2VsZik6CiAgICAgICAgICMgcmV0dXJuIHVuaWNvZGUgc3RyaW5nIHRvIGRpc3BsYXkgbm9uLUFTQ0lJIGNoYXJzIGNvcnJlY3RseQpAQCAtMTEzMCw3ICsxMjU0LDEwIEBACiAgICAgICAgIGFzc2VydCBoYXZlID4gMAogICAgICAgICB3YW50ID0gKChoYXZlIC0gMSkgLy8gc2VsZi5pbmRlbnR3aWR0aCkgKiBzZWxmLmluZGVudHdpZHRoCiAgICAgICAgICMgRGVidWcgcHJvbXB0IGlzIG11bHRpbGluZWQuLi4uCi0gICAgICAgIGxhc3RfbGluZV9vZl9wcm9tcHQgPSBzeXMucHMxLnNwbGl0KCdcbicpWy0xXQorICAgICAgICBpZiBzZWxmLmNvbnRleHRfdXNlX3BzMToKKyAgICAgICAgICAgIGxhc3RfbGluZV9vZl9wcm9tcHQgPSBzeXMucHMxLnNwbGl0KCdcbicpWy0xXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbGFzdF9saW5lX29mX3Byb21wdCA9ICcnCiAgICAgICAgIG5jaGFyc2RlbGV0ZWQgPSAwCiAgICAgICAgIHdoaWxlIDE6CiAgICAgICAgICAgICBpZiBjaGFycyA9PSBsYXN0X2xpbmVfb2ZfcHJvbXB0OgpAQCAtMTM0MCw2ICsxNDY3LDcgQEAKICAgICBkZWYgdGFiaWZ5X3JlZ2lvbl9ldmVudChzZWxmLCBldmVudCk6CiAgICAgICAgIGhlYWQsIHRhaWwsIGNoYXJzLCBsaW5lcyA9IHNlbGYuZ2V0X3JlZ2lvbigpCiAgICAgICAgIHRhYndpZHRoID0gc2VsZi5fYXNrdGFid2lkdGgoKQorICAgICAgICBpZiB0YWJ3aWR0aCBpcyBOb25lOiByZXR1cm4KICAgICAgICAgZm9yIHBvcyBpbiByYW5nZShsZW4obGluZXMpKToKICAgICAgICAgICAgIGxpbmUgPSBsaW5lc1twb3NdCiAgICAgICAgICAgICBpZiBsaW5lOgpAQCAtMTM1MSw2ICsxNDc5LDcgQEAKICAgICBkZWYgdW50YWJpZnlfcmVnaW9uX2V2ZW50KHNlbGYsIGV2ZW50KToKICAgICAgICAgaGVhZCwgdGFpbCwgY2hhcnMsIGxpbmVzID0gc2VsZi5nZXRfcmVnaW9uKCkKICAgICAgICAgdGFid2lkdGggPSBzZWxmLl9hc2t0YWJ3aWR0aCgpCisgICAgICAgIGlmIHRhYndpZHRoIGlzIE5vbmU6IHJldHVybgogICAgICAgICBmb3IgcG9zIGluIHJhbmdlKGxlbihsaW5lcykpOgogICAgICAgICAgICAgbGluZXNbcG9zXSA9IGxpbmVzW3Bvc10uZXhwYW5kdGFicyh0YWJ3aWR0aCkKICAgICAgICAgc2VsZi5zZXRfcmVnaW9uKGhlYWQsIHRhaWwsIGNoYXJzLCBsaW5lcykKQEAgLTE0NDQsNyArMTU3Myw3IEBACiAgICAgICAgICAgICBwYXJlbnQ9c2VsZi50ZXh0LAogICAgICAgICAgICAgaW5pdGlhbHZhbHVlPXNlbGYuaW5kZW50d2lkdGgsCiAgICAgICAgICAgICBtaW52YWx1ZT0yLAotICAgICAgICAgICAgbWF4dmFsdWU9MTYpIG9yIHNlbGYudGFid2lkdGgKKyAgICAgICAgICAgIG1heHZhbHVlPTE2KQogCiAgICAgIyBHdWVzcyBpbmRlbnR3aWR0aCBmcm9tIHRleHQgY29udGVudC4KICAgICAjIFJldHVybiBndWVzc2VkIGluZGVudHdpZHRoLiAgVGhpcyBzaG91bGQgbm90IGJlIGJlbGlldmVkIHVubGVzcwpAQCAtMTUyNiw3ICsxNjU1LDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIF90b2tlbml6ZS50b2tlbml6ZShzZWxmLnJlYWRsaW5lLCBzZWxmLnRva2VuZWF0ZXIpCi0gICAgICAgICAgICBleGNlcHQgX3Rva2VuaXplLlRva2VuRXJyb3I6CisgICAgICAgICAgICBleGNlcHQgKF90b2tlbml6ZS5Ub2tlbkVycm9yLCBTeW50YXhFcnJvcik6CiAgICAgICAgICAgICAgICAgIyBzaW5jZSB3ZSBjdXQgb2ZmIHRoZSB0b2tlbml6ZXIgZWFybHksIHdlIGNhbiB0cmlnZ2VyCiAgICAgICAgICAgICAgICAgIyBzcHVyaW91cyBlcnJvcnMKICAgICAgICAgICAgICAgICBwYXNzCkBAIC0xNTU1LDcgKzE2ODQsNyBAQAogICAgIGtleWxpc3QgPSBrZXlkZWZzLmdldChldmVudG5hbWUpCiAgICAgIyBpc3N1ZTEwOTQwOiB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCB0byBwcmV2ZW50IGhhbmcgd2l0aCBPUyBYIENvY29hIFRrIDguNQogICAgICMgaWYgbm90IGtleWxpc3Q6Ci0gICAgaWYgKG5vdCBrZXlsaXN0KSBvciAobWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKSBhbmQgZXZlbnRuYW1lIGluIHsKKyAgICBpZiAobm90IGtleWxpc3QpIG9yIChtYWNvc3hTdXBwb3J0LmlzQ29jb2FUaygpIGFuZCBldmVudG5hbWUgaW4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8PG9wZW4tbW9kdWxlPj4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8PGdvdG8tbGluZT4+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPDxjaGFuZ2UtaW5kZW50d2lkdGg+PiJ9KToKQEAgLTE1ODIsMTkgKzE3MTEsMTkgQEAKICAgICB0ay5jYWxsKCdzZXQnLCAndGNsX25vbndvcmRjaGFycycsICdbXmEtekEtWjAtOV9dJykKIAogCi1kZWYgdGVzdCgpOgotICAgIHJvb3QgPSBUaygpCitkZWYgX2VkaXRvcl93aW5kb3cocGFyZW50KToKKyAgICByb290ID0gcGFyZW50CiAgICAgZml4d29yZGJyZWFrcyhyb290KQotICAgIHJvb3Qud2l0aGRyYXcoKQogICAgIGlmIHN5cy5hcmd2WzE6XToKICAgICAgICAgZmlsZW5hbWUgPSBzeXMuYXJndlsxXQogICAgIGVsc2U6CiAgICAgICAgIGZpbGVuYW1lID0gTm9uZQorICAgIG1hY29zeFN1cHBvcnQuc2V0dXBBcHAocm9vdCwgTm9uZSkKICAgICBlZGl0ID0gRWRpdG9yV2luZG93KHJvb3Q9cm9vdCwgZmlsZW5hbWU9ZmlsZW5hbWUpCi0gICAgZWRpdC5zZXRfY2xvc2VfaG9vayhyb290LnF1aXQpCiAgICAgZWRpdC50ZXh0LmJpbmQoIjw8Y2xvc2UtYWxsLXdpbmRvd3M+PiIsIGVkaXQuY2xvc2VfZXZlbnQpCi0gICAgcm9vdC5tYWlubG9vcCgpCi0gICAgcm9vdC5kZXN0cm95KCkKKyAgICBwYXJlbnQubWFpbmxvb3AoKQorCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgdGVzdCgpCisgICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuCisgICAgcnVuKF9oZWxwX2RpYWxvZywgX2VkaXRvcl93aW5kb3cpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9Gb3JtYXRQYXJhZ3JhcGgucHkgYi9MaWIvaWRsZWxpYi9Gb3JtYXRQYXJhZ3JhcGgucHkKaW5kZXggNmE1ZjliNS4uOWIxMGMwYSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvRm9ybWF0UGFyYWdyYXBoLnB5CisrKyBiL0xpYi9pZGxlbGliL0Zvcm1hdFBhcmFncmFwaC5weQpAQCAtMSwxOCArMSwxOSBAQAotIyBFeHRlbnNpb24gdG8gZm9ybWF0IGEgcGFyYWdyYXBoCisiIiJFeHRlbnNpb24gdG8gZm9ybWF0IGEgcGFyYWdyYXBoIG9yIHNlbGVjdGlvbiB0byBhIG1heCB3aWR0aC4KIAotIyBEb2VzIGJhc2ljLCBzdGFuZGFyZCB0ZXh0IGZvcm1hdHRpbmcsIGFuZCBhbHNvIHVuZGVyc3RhbmRzIFB5dGhvbgotIyBjb21tZW50IGJsb2Nrcy4gIFRodXMsIGZvciBlZGl0aW5nIFB5dGhvbiBzb3VyY2UgY29kZSwgdGhpcwotIyBleHRlbnNpb24gaXMgcmVhbGx5IG9ubHkgc3VpdGFibGUgZm9yIHJlZm9ybWF0dGluZyB0aGVzZSBjb21tZW50Ci0jIGJsb2NrcyBvciB0cmlwbGUtcXVvdGVkIHN0cmluZ3MuCitEb2VzIGJhc2ljLCBzdGFuZGFyZCB0ZXh0IGZvcm1hdHRpbmcsIGFuZCBhbHNvIHVuZGVyc3RhbmRzIFB5dGhvbgorY29tbWVudCBibG9ja3MuIFRodXMsIGZvciBlZGl0aW5nIFB5dGhvbiBzb3VyY2UgY29kZSwgdGhpcworZXh0ZW5zaW9uIGlzIHJlYWxseSBvbmx5IHN1aXRhYmxlIGZvciByZWZvcm1hdHRpbmcgdGhlc2UgY29tbWVudAorYmxvY2tzIG9yIHRyaXBsZS1xdW90ZWQgc3RyaW5ncy4KIAotIyBLbm93biBwcm9ibGVtcyB3aXRoIGNvbW1lbnQgcmVmb3JtYXR0aW5nOgotIyAqIElmIHRoZXJlIGlzIGEgc2VsZWN0aW9uIG1hcmtlZCwgYW5kIHRoZSBmaXJzdCBsaW5lIG9mIHRoZQotIyAgIHNlbGVjdGlvbiBpcyBub3QgY29tcGxldGUsIHRoZSBibG9jayB3aWxsIHByb2JhYmx5IG5vdCBiZSBkZXRlY3RlZAotIyAgIGFzIGNvbW1lbnRzLCBhbmQgd2lsbCBoYXZlIHRoZSBub3JtYWwgInRleHQgZm9ybWF0dGluZyIgcnVsZXMKLSMgICBhcHBsaWVkLgotIyAqIElmIGEgY29tbWVudCBibG9jayBoYXMgbGVhZGluZyB3aGl0ZXNwYWNlIHRoYXQgbWl4ZXMgdGFicyBhbmQKLSMgICBzcGFjZXMsIHRoZXkgd2lsbCBub3QgYmUgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBzYW1lIGJsb2NrLgotIyAqIEZhbmN5IGNvbW1lbnRzLCBsaWtlIHRoaXMgYnVsbGV0ZWQgbGlzdCwgYXJlbnQgaGFuZGxlZCA6LSkKK0tub3duIHByb2JsZW1zIHdpdGggY29tbWVudCByZWZvcm1hdHRpbmc6CisqIElmIHRoZXJlIGlzIGEgc2VsZWN0aW9uIG1hcmtlZCwgYW5kIHRoZSBmaXJzdCBsaW5lIG9mIHRoZQorICBzZWxlY3Rpb24gaXMgbm90IGNvbXBsZXRlLCB0aGUgYmxvY2sgd2lsbCBwcm9iYWJseSBub3QgYmUgZGV0ZWN0ZWQKKyAgYXMgY29tbWVudHMsIGFuZCB3aWxsIGhhdmUgdGhlIG5vcm1hbCAidGV4dCBmb3JtYXR0aW5nIiBydWxlcworICBhcHBsaWVkLgorKiBJZiBhIGNvbW1lbnQgYmxvY2sgaGFzIGxlYWRpbmcgd2hpdGVzcGFjZSB0aGF0IG1peGVzIHRhYnMgYW5kCisgIHNwYWNlcywgdGhleSB3aWxsIG5vdCBiZSBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHNhbWUgYmxvY2suCisqIEZhbmN5IGNvbW1lbnRzLCBsaWtlIHRoaXMgYnVsbGV0ZWQgbGlzdCwgYXJlbid0IGhhbmRsZWQgOi0pCisiIiIKIAogaW1wb3J0IHJlCiBmcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKQEAgLTMxLDQxICszMiwzNSBAQAogICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAgc2VsZi5lZGl0d2luID0gTm9uZQogCi0gICAgZGVmIGZvcm1hdF9wYXJhZ3JhcGhfZXZlbnQoc2VsZiwgZXZlbnQpOgotICAgICAgICBtYXhmb3JtYXR3aWR0aCA9IGludChpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCdGb3JtYXRQYXJhZ3JhcGgnLCdwYXJhZ3JhcGgnKSkKKyAgICBkZWYgZm9ybWF0X3BhcmFncmFwaF9ldmVudChzZWxmLCBldmVudCwgbGltaXQ9Tm9uZSk6CisgICAgICAgICIiIkZvcm1hdHMgcGFyYWdyYXBoIHRvIGEgbWF4IHdpZHRoIHNwZWNpZmllZCBpbiBpZGxlQ29uZi4KKworICAgICAgICBJZiB0ZXh0IGlzIHNlbGVjdGVkLCBmb3JtYXRfcGFyYWdyYXBoX2V2ZW50IHdpbGwgc3RhcnQgYnJlYWtpbmcgbGluZXMKKyAgICAgICAgYXQgdGhlIG1heCB3aWR0aCwgc3RhcnRpbmcgZnJvbSB0aGUgYmVnaW5uaW5nIHNlbGVjdGlvbi4KKworICAgICAgICBJZiBubyB0ZXh0IGlzIHNlbGVjdGVkLCBmb3JtYXRfcGFyYWdyYXBoX2V2ZW50IHVzZXMgdGhlIGN1cnJlbnQKKyAgICAgICAgY3Vyc29yIGxvY2F0aW9uIHRvIGRldGVybWluZSB0aGUgcGFyYWdyYXBoIChsaW5lcyBvZiB0ZXh0IHN1cnJvdW5kZWQKKyAgICAgICAgYnkgYmxhbmsgbGluZXMpIGFuZCBmb3JtYXRzIGl0LgorCisgICAgICAgIFRoZSBsZW5ndGggbGltaXQgcGFyYW1ldGVyIGlzIGZvciB0ZXN0aW5nIHdpdGggYSBrbm93biB2YWx1ZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGxpbWl0ID09IE5vbmU6CisgICAgICAgICAgICBsaW1pdCA9IGlkbGVDb25mLkdldE9wdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJ21haW4nLCAnRm9ybWF0UGFyYWdyYXBoJywgJ3BhcmFncmFwaCcsIHR5cGU9J2ludCcpCiAgICAgICAgIHRleHQgPSBzZWxmLmVkaXR3aW4udGV4dAogICAgICAgICBmaXJzdCwgbGFzdCA9IHNlbGYuZWRpdHdpbi5nZXRfc2VsZWN0aW9uX2luZGljZXMoKQogICAgICAgICBpZiBmaXJzdCBhbmQgbGFzdDoKICAgICAgICAgICAgIGRhdGEgPSB0ZXh0LmdldChmaXJzdCwgbGFzdCkKLSAgICAgICAgICAgIGNvbW1lbnRfaGVhZGVyID0gJycKKyAgICAgICAgICAgIGNvbW1lbnRfaGVhZGVyID0gZ2V0X2NvbW1lbnRfaGVhZGVyKGRhdGEpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBmaXJzdCwgbGFzdCwgY29tbWVudF9oZWFkZXIsIGRhdGEgPSBcCiAgICAgICAgICAgICAgICAgICAgIGZpbmRfcGFyYWdyYXBoKHRleHQsIHRleHQuaW5kZXgoImluc2VydCIpKQogICAgICAgICBpZiBjb21tZW50X2hlYWRlcjoKLSAgICAgICAgICAgICMgUmVmb3JtYXQgdGhlIGNvbW1lbnQgbGluZXMgLSBjb252ZXJ0IHRvIHRleHQgc2FucyBoZWFkZXIuCi0gICAgICAgICAgICBsaW5lcyA9IGRhdGEuc3BsaXQoIlxuIikKLSAgICAgICAgICAgIGxpbmVzID0gbWFwKGxhbWJkYSBzdCwgbD1sZW4oY29tbWVudF9oZWFkZXIpOiBzdFtsOl0sIGxpbmVzKQotICAgICAgICAgICAgZGF0YSA9ICJcbiIuam9pbihsaW5lcykKLSAgICAgICAgICAgICMgUmVmb3JtYXQgdG8gbWF4Zm9ybWF0d2lkdGggY2hhcnMgb3IgYSAyMCBjaGFyIHdpZHRoLCB3aGljaGV2ZXIgaXMgZ3JlYXRlci4KLSAgICAgICAgICAgIGZvcm1hdF93aWR0aCA9IG1heChtYXhmb3JtYXR3aWR0aCAtIGxlbihjb21tZW50X2hlYWRlciksIDIwKQotICAgICAgICAgICAgbmV3ZGF0YSA9IHJlZm9ybWF0X3BhcmFncmFwaChkYXRhLCBmb3JtYXRfd2lkdGgpCi0gICAgICAgICAgICAjIHJlLXNwbGl0IGFuZCByZS1pbnNlcnQgdGhlIGNvbW1lbnQgaGVhZGVyLgotICAgICAgICAgICAgbmV3ZGF0YSA9IG5ld2RhdGEuc3BsaXQoIlxuIikKLSAgICAgICAgICAgICMgSWYgdGhlIGJsb2NrIGVuZHMgaW4gYSBcbiwgd2UgZG9udCB3YW50IHRoZSBjb21tZW50Ci0gICAgICAgICAgICAjIHByZWZpeCBpbnNlcnRlZCBhZnRlciBpdC4gKEltIG5vdCBzdXJlIGl0IG1ha2VzIHNlbnNlIHRvCi0gICAgICAgICAgICAjIHJlZm9ybWF0IGEgY29tbWVudCBibG9jayB0aGF0IGlzbnQgbWFkZSBvZiBjb21wbGV0ZQotICAgICAgICAgICAgIyBsaW5lcywgYnV0IHdoYXRldmVyISkgIENhbid0IHRoaW5rIG9mIGEgY2xlYW4gc29sdXRpb24sCi0gICAgICAgICAgICAjIHNvIHdlIGhhY2sgYXdheQotICAgICAgICAgICAgYmxvY2tfc3VmZml4ID0gIiIKLSAgICAgICAgICAgIGlmIG5vdCBuZXdkYXRhWy0xXToKLSAgICAgICAgICAgICAgICBibG9ja19zdWZmaXggPSAiXG4iCi0gICAgICAgICAgICAgICAgbmV3ZGF0YSA9IG5ld2RhdGFbOi0xXQotICAgICAgICAgICAgYnVpbGRlciA9IGxhbWJkYSBpdGVtLCBwcmVmaXg9Y29tbWVudF9oZWFkZXI6IHByZWZpeCtpdGVtCi0gICAgICAgICAgICBuZXdkYXRhID0gJ1xuJy5qb2luKG1hcChidWlsZGVyLCBuZXdkYXRhKSkgKyBibG9ja19zdWZmaXgKKyAgICAgICAgICAgIG5ld2RhdGEgPSByZWZvcm1hdF9jb21tZW50KGRhdGEsIGxpbWl0LCBjb21tZW50X2hlYWRlcikKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICMgSnVzdCBhIG5vcm1hbCB0ZXh0IGZvcm1hdAotICAgICAgICAgICAgbmV3ZGF0YSA9IHJlZm9ybWF0X3BhcmFncmFwaChkYXRhLCBtYXhmb3JtYXR3aWR0aCkKKyAgICAgICAgICAgIG5ld2RhdGEgPSByZWZvcm1hdF9wYXJhZ3JhcGgoZGF0YSwgbGltaXQpCiAgICAgICAgIHRleHQudGFnX3JlbW92ZSgic2VsIiwgIjEuMCIsICJlbmQiKQorCiAgICAgICAgIGlmIG5ld2RhdGEgIT0gZGF0YToKICAgICAgICAgICAgIHRleHQubWFya19zZXQoImluc2VydCIsIGZpcnN0KQogICAgICAgICAgICAgdGV4dC51bmRvX2Jsb2NrX3N0YXJ0KCkKQEAgLTc4LDMxICs3Myw0NCBAQAogICAgICAgICByZXR1cm4gImJyZWFrIgogCiBkZWYgZmluZF9wYXJhZ3JhcGgodGV4dCwgbWFyayk6CisgICAgIiIiUmV0dXJucyB0aGUgc3RhcnQvc3RvcCBpbmRpY2VzIGVuY2xvc2luZyB0aGUgcGFyYWdyYXBoIHRoYXQgbWFyayBpcyBpbi4KKworICAgIEFsc28gcmV0dXJucyB0aGUgY29tbWVudCBmb3JtYXQgc3RyaW5nLCBpZiBhbnksIGFuZCBwYXJhZ3JhcGggb2YgdGV4dAorICAgIGJldHdlZW4gdGhlIHN0YXJ0L3N0b3AgaW5kaWNlcy4KKyAgICAiIiIKICAgICBsaW5lbm8sIGNvbCA9IG1hcChpbnQsIG1hcmsuc3BsaXQoIi4iKSkKLSAgICBsaW5lID0gdGV4dC5nZXQoIiVkLjAiICUgbGluZW5vLCAiJWQuMCBsaW5lZW5kIiAlIGxpbmVubykKKyAgICBsaW5lID0gdGV4dC5nZXQoIiVkLjAiICUgbGluZW5vLCAiJWQuZW5kIiAlIGxpbmVubykKKworICAgICMgTG9vayBmb3Igc3RhcnQgb2YgbmV4dCBwYXJhZ3JhcGggaWYgdGhlIGluZGV4IHBhc3NlZCBpbiBpcyBhIGJsYW5rIGxpbmUKICAgICB3aGlsZSB0ZXh0LmNvbXBhcmUoIiVkLjAiICUgbGluZW5vLCAiPCIsICJlbmQiKSBhbmQgaXNfYWxsX3doaXRlKGxpbmUpOgogICAgICAgICBsaW5lbm8gPSBsaW5lbm8gKyAxCi0gICAgICAgIGxpbmUgPSB0ZXh0LmdldCgiJWQuMCIgJSBsaW5lbm8sICIlZC4wIGxpbmVlbmQiICUgbGluZW5vKQorICAgICAgICBsaW5lID0gdGV4dC5nZXQoIiVkLjAiICUgbGluZW5vLCAiJWQuZW5kIiAlIGxpbmVubykKICAgICBmaXJzdF9saW5lbm8gPSBsaW5lbm8KICAgICBjb21tZW50X2hlYWRlciA9IGdldF9jb21tZW50X2hlYWRlcihsaW5lKQogICAgIGNvbW1lbnRfaGVhZGVyX2xlbiA9IGxlbihjb21tZW50X2hlYWRlcikKKworICAgICMgT25jZSBzdGFydCBsaW5lIGZvdW5kLCBzZWFyY2ggZm9yIGVuZCBvZiBwYXJhZ3JhcGggKGEgYmxhbmsgbGluZSkKICAgICB3aGlsZSBnZXRfY29tbWVudF9oZWFkZXIobGluZSk9PWNvbW1lbnRfaGVhZGVyIGFuZCBcCiAgICAgICAgICAgICAgIG5vdCBpc19hbGxfd2hpdGUobGluZVtjb21tZW50X2hlYWRlcl9sZW46XSk6CiAgICAgICAgIGxpbmVubyA9IGxpbmVubyArIDEKLSAgICAgICAgbGluZSA9IHRleHQuZ2V0KCIlZC4wIiAlIGxpbmVubywgIiVkLjAgbGluZWVuZCIgJSBsaW5lbm8pCisgICAgICAgIGxpbmUgPSB0ZXh0LmdldCgiJWQuMCIgJSBsaW5lbm8sICIlZC5lbmQiICUgbGluZW5vKQogICAgIGxhc3QgPSAiJWQuMCIgJSBsaW5lbm8KLSAgICAjIFNlYXJjaCBiYWNrIHRvIGJlZ2lubmluZyBvZiBwYXJhZ3JhcGgKKworICAgICMgU2VhcmNoIGJhY2sgdG8gYmVnaW5uaW5nIG9mIHBhcmFncmFwaCAoZmlyc3QgYmxhbmsgbGluZSBiZWZvcmUpCiAgICAgbGluZW5vID0gZmlyc3RfbGluZW5vIC0gMQotICAgIGxpbmUgPSB0ZXh0LmdldCgiJWQuMCIgJSBsaW5lbm8sICIlZC4wIGxpbmVlbmQiICUgbGluZW5vKQorICAgIGxpbmUgPSB0ZXh0LmdldCgiJWQuMCIgJSBsaW5lbm8sICIlZC5lbmQiICUgbGluZW5vKQogICAgIHdoaWxlIGxpbmVubyA+IDAgYW5kIFwKICAgICAgICAgICAgICAgZ2V0X2NvbW1lbnRfaGVhZGVyKGxpbmUpPT1jb21tZW50X2hlYWRlciBhbmQgXAogICAgICAgICAgICAgICBub3QgaXNfYWxsX3doaXRlKGxpbmVbY29tbWVudF9oZWFkZXJfbGVuOl0pOgogICAgICAgICBsaW5lbm8gPSBsaW5lbm8gLSAxCi0gICAgICAgIGxpbmUgPSB0ZXh0LmdldCgiJWQuMCIgJSBsaW5lbm8sICIlZC4wIGxpbmVlbmQiICUgbGluZW5vKQorICAgICAgICBsaW5lID0gdGV4dC5nZXQoIiVkLjAiICUgbGluZW5vLCAiJWQuZW5kIiAlIGxpbmVubykKICAgICBmaXJzdCA9ICIlZC4wIiAlIChsaW5lbm8rMSkKKwogICAgIHJldHVybiBmaXJzdCwgbGFzdCwgY29tbWVudF9oZWFkZXIsIHRleHQuZ2V0KGZpcnN0LCBsYXN0KQogCisjIFRoaXMgc2hvdWxkIHBlcmhhcHMgYmUgcmVwbGFjZWQgd2l0aCB0ZXh0d3JhcC53cmFwCiBkZWYgcmVmb3JtYXRfcGFyYWdyYXBoKGRhdGEsIGxpbWl0KToKKyAgICAiIiJSZXR1cm4gZGF0YSByZWZvcm1hdHRlZCB0byBzcGVjaWZpZWQgd2lkdGggKGxpbWl0KS4iIiIKICAgICBsaW5lcyA9IGRhdGEuc3BsaXQoIlxuIikKICAgICBpID0gMAogICAgIG4gPSBsZW4obGluZXMpCkBAIC0xMjUsNyArMTMzLDcgQEAKICAgICAgICAgICAgIGlmIG5vdCB3b3JkOgogICAgICAgICAgICAgICAgIGNvbnRpbnVlICMgQ2FuIGhhcHBlbiB3aGVuIGxpbmUgZW5kcyBpbiB3aGl0ZXNwYWNlCiAgICAgICAgICAgICBpZiBsZW4oKHBhcnRpYWwgKyB3b3JkKS5leHBhbmR0YWJzKCkpID4gbGltaXQgYW5kIFwKLSAgICAgICAgICAgICAgIHBhcnRpYWwgIT0gaW5kZW50MToKKyAgICAgICAgICAgICAgICAgICBwYXJ0aWFsICE9IGluZGVudDE6CiAgICAgICAgICAgICAgICAgbmV3LmFwcGVuZChwYXJ0aWFsLnJzdHJpcCgpKQogICAgICAgICAgICAgICAgIHBhcnRpYWwgPSBpbmRlbnQyCiAgICAgICAgICAgICBwYXJ0aWFsID0gcGFydGlhbCArIHdvcmQgKyAiICIKQEAgLTEzNywxMyArMTQ1LDQ5IEBACiAgICAgbmV3LmV4dGVuZChsaW5lc1tpOl0pCiAgICAgcmV0dXJuICJcbiIuam9pbihuZXcpCiAKK2RlZiByZWZvcm1hdF9jb21tZW50KGRhdGEsIGxpbWl0LCBjb21tZW50X2hlYWRlcik6CisgICAgIiIiUmV0dXJuIGRhdGEgcmVmb3JtYXR0ZWQgdG8gc3BlY2lmaWVkIHdpZHRoIHdpdGggY29tbWVudCBoZWFkZXIuIiIiCisKKyAgICAjIFJlbW92ZSBoZWFkZXIgZnJvbSB0aGUgY29tbWVudCBsaW5lcworICAgIGxjID0gbGVuKGNvbW1lbnRfaGVhZGVyKQorICAgIGRhdGEgPSAiXG4iLmpvaW4obGluZVtsYzpdIGZvciBsaW5lIGluIGRhdGEuc3BsaXQoIlxuIikpCisgICAgIyBSZWZvcm1hdCB0byBtYXhmb3JtYXR3aWR0aCBjaGFycyBvciBhIDIwIGNoYXIgd2lkdGgsCisgICAgIyB3aGljaGV2ZXIgaXMgZ3JlYXRlci4KKyAgICBmb3JtYXRfd2lkdGggPSBtYXgobGltaXQgLSBsZW4oY29tbWVudF9oZWFkZXIpLCAyMCkKKyAgICBuZXdkYXRhID0gcmVmb3JtYXRfcGFyYWdyYXBoKGRhdGEsIGZvcm1hdF93aWR0aCkKKyAgICAjIHJlLXNwbGl0IGFuZCByZS1pbnNlcnQgdGhlIGNvbW1lbnQgaGVhZGVyLgorICAgIG5ld2RhdGEgPSBuZXdkYXRhLnNwbGl0KCJcbiIpCisgICAgIyBJZiB0aGUgYmxvY2sgZW5kcyBpbiBhIFxuLCB3ZSBkb250IHdhbnQgdGhlIGNvbW1lbnQgcHJlZml4CisgICAgIyBpbnNlcnRlZCBhZnRlciBpdC4gKEltIG5vdCBzdXJlIGl0IG1ha2VzIHNlbnNlIHRvIHJlZm9ybWF0IGEKKyAgICAjIGNvbW1lbnQgYmxvY2sgdGhhdCBpcyBub3QgbWFkZSBvZiBjb21wbGV0ZSBsaW5lcywgYnV0IHdoYXRldmVyISkKKyAgICAjIENhbid0IHRoaW5rIG9mIGEgY2xlYW4gc29sdXRpb24sIHNvIHdlIGhhY2sgYXdheQorICAgIGJsb2NrX3N1ZmZpeCA9ICIiCisgICAgaWYgbm90IG5ld2RhdGFbLTFdOgorICAgICAgICBibG9ja19zdWZmaXggPSAiXG4iCisgICAgICAgIG5ld2RhdGEgPSBuZXdkYXRhWzotMV0KKyAgICByZXR1cm4gJ1xuJy5qb2luKGNvbW1lbnRfaGVhZGVyK2xpbmUgZm9yIGxpbmUgaW4gbmV3ZGF0YSkgKyBibG9ja19zdWZmaXgKKwogZGVmIGlzX2FsbF93aGl0ZShsaW5lKToKKyAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBsaW5lIGlzIGVtcHR5IG9yIGFsbCB3aGl0ZXNwYWNlLiIiIgorCiAgICAgcmV0dXJuIHJlLm1hdGNoKHIiXlxzKiQiLCBsaW5lKSBpcyBub3QgTm9uZQogCiBkZWYgZ2V0X2luZGVudChsaW5lKToKLSAgICByZXR1cm4gcmUubWF0Y2gociJeKFxzKikiLCBsaW5lKS5ncm91cCgpCisgICAgIiIiUmV0dXJuIHRoZSBpbml0aWFsIHNwYWNlIG9yIHRhYiBpbmRlbnQgb2YgbGluZS4iIiIKKyAgICByZXR1cm4gcmUubWF0Y2gociJeKFsgXHRdKikiLCBsaW5lKS5ncm91cCgpCiAKIGRlZiBnZXRfY29tbWVudF9oZWFkZXIobGluZSk6Ci0gICAgbSA9IHJlLm1hdGNoKHIiXihccyojKikiLCBsaW5lKQorICAgICIiIlJldHVybiBzdHJpbmcgd2l0aCBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kICcjJyBmcm9tIGxpbmUgb3IgJycuCisKKyAgICBBIG51bGwgcmV0dXJuIGluZGljYXRlcyB0aGF0IHRoZSBsaW5lIGlzIG5vdCBhIGNvbW1lbnQgbGluZS4gQSBub24tCisgICAgbnVsbCByZXR1cm4sIHN1Y2ggYXMgJyAgICAjJywgd2lsbCBiZSB1c2VkIHRvIGZpbmQgdGhlIG90aGVyIGxpbmVzIG9mCisgICAgYSBjb21tZW50IGJsb2NrIHdpdGggdGhlIHNhbWUgIGluZGVudC4KKyAgICAiIiIKKyAgICBtID0gcmUubWF0Y2gociJeKFsgXHRdKiMqKSIsIGxpbmUpCiAgICAgaWYgbSBpcyBOb25lOiByZXR1cm4gIiIKICAgICByZXR1cm4gbS5ncm91cCgxKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGltcG9ydCB1bml0dGVzdAorICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfZm9ybWF0cGFyYWdyYXBoJywKKyAgICAgICAgICAgIHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvR3JlcERpYWxvZy5weSBiL0xpYi9pZGxlbGliL0dyZXBEaWFsb2cucHkKaW5kZXggZTQwZTU0Ni4uNzcxOTViOSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvR3JlcERpYWxvZy5weQorKysgYi9MaWIvaWRsZWxpYi9HcmVwRGlhbG9nLnB5CkBAIC0xLDkgKzEsMTQgQEAKIGltcG9ydCBvcwogaW1wb3J0IGZubWF0Y2gKK2ltcG9ydCByZSAgIyBmb3IgaHRlc3QKIGltcG9ydCBzeXMKLWZyb20gVGtpbnRlciBpbXBvcnQgKgorZnJvbSBUa2ludGVyIGltcG9ydCBTdHJpbmdWYXIsIEJvb2xlYW5WYXIsIENoZWNrYnV0dG9uICAjIGZvciBHcmVwRGlhbG9nCitmcm9tIFRraW50ZXIgaW1wb3J0IFRrLCBUZXh0LCBCdXR0b24sIFNFTCwgRU5EICAjIGZvciBodGVzdAogZnJvbSBpZGxlbGliIGltcG9ydCBTZWFyY2hFbmdpbmUKK2ltcG9ydCBpdGVydG9vbHMKIGZyb20gaWRsZWxpYi5TZWFyY2hEaWFsb2dCYXNlIGltcG9ydCBTZWFyY2hEaWFsb2dCYXNlCisjIEltcG9ydGluZyBPdXRwdXRXaW5kb3cgZmFpbHMgZHVlIHRvIGltcG9ydCBsb29wCisjIEVkaXRvcldpbmRvdyAtPiBHcmVwRGlhbG9wIC0+IE91dHB1dFdpbmRvdyAtPiBFZGl0b3JXaW5kb3cKIAogZGVmIGdyZXAodGV4dCwgaW89Tm9uZSwgZmxpc3Q9Tm9uZSk6CiAgICAgcm9vdCA9IHRleHQuX3Jvb3QoKQpAQCAtNDAsMTAgKzQ1LDEwIEBACiAKICAgICBkZWYgY3JlYXRlX2VudHJpZXMoc2VsZik6CiAgICAgICAgIFNlYXJjaERpYWxvZ0Jhc2UuY3JlYXRlX2VudHJpZXMoc2VsZikKLSAgICAgICAgc2VsZi5nbG9iZW50ID0gc2VsZi5tYWtlX2VudHJ5KCJJbiBmaWxlczoiLCBzZWxmLmdsb2J2YXIpCisgICAgICAgIHNlbGYuZ2xvYmVudCA9IHNlbGYubWFrZV9lbnRyeSgiSW4gZmlsZXM6Iiwgc2VsZi5nbG9idmFyKVswXQogCiAgICAgZGVmIGNyZWF0ZV9vdGhlcl9idXR0b25zKHNlbGYpOgotICAgICAgICBmID0gc2VsZi5tYWtlX2ZyYW1lKCkKKyAgICAgICAgZiA9IHNlbGYubWFrZV9mcmFtZSgpWzBdCiAKICAgICAgICAgYnRuID0gQ2hlY2tidXR0b24oZiwgYW5jaG9yPSJ3IiwKICAgICAgICAgICAgICAgICB2YXJpYWJsZT1zZWxmLnJlY3ZhciwKQEAgLTYzLDcgKzY4LDcgQEAKICAgICAgICAgaWYgbm90IHBhdGg6CiAgICAgICAgICAgICBzZWxmLnRvcC5iZWxsKCkKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBmcm9tIGlkbGVsaWIuT3V0cHV0V2luZG93IGltcG9ydCBPdXRwdXRXaW5kb3cKKyAgICAgICAgZnJvbSBpZGxlbGliLk91dHB1dFdpbmRvdyBpbXBvcnQgT3V0cHV0V2luZG93ICAjIGxlYXZlIGhlcmUhCiAgICAgICAgIHNhdmUgPSBzeXMuc3Rkb3V0CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBPdXRwdXRXaW5kb3coc2VsZi5mbGlzdCkKQEAgLTc3LDQxICs4MiwzNCBAQAogICAgICAgICBsaXN0LnNvcnQoKQogICAgICAgICBzZWxmLmNsb3NlKCkKICAgICAgICAgcGF0ID0gc2VsZi5lbmdpbmUuZ2V0cGF0KCkKLSAgICAgICAgcHJpbnQgIlNlYXJjaGluZyAlciBpbiAlcyAuLi4iICUgKHBhdCwgcGF0aCkKKyAgICAgICAgcHJpbnQoIlNlYXJjaGluZyAlciBpbiAlcyAuLi4iICUgKHBhdCwgcGF0aCkpCiAgICAgICAgIGhpdHMgPSAwCi0gICAgICAgIGZvciBmbiBpbiBsaXN0OgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGYgPSBvcGVuKGZuKQotICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IsIG1zZzoKLSAgICAgICAgICAgICAgICBwcmludCBtc2cKLSAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgbGluZW5vID0gMAotICAgICAgICAgICAgd2hpbGUgMToKLSAgICAgICAgICAgICAgICBibG9jayA9IGYucmVhZGxpbmVzKDEwMDAwMCkKLSAgICAgICAgICAgICAgICBpZiBub3QgYmxvY2s6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gYmxvY2s6Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVubyA9IGxpbmVubyArIDEKLSAgICAgICAgICAgICAgICAgICAgaWYgbGluZVstMTpdID09ICdcbic6Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZVs6LTFdCi0gICAgICAgICAgICAgICAgICAgIGlmIHByb2cuc2VhcmNoKGxpbmUpOgotICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiJXM6ICVzOiAlc1xuIiAlIChmbiwgbGluZW5vLCBsaW5lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGhpdHMgPSBoaXRzICsgMQotICAgICAgICBpZiBoaXRzOgotICAgICAgICAgICAgaWYgaGl0cyA9PSAxOgotICAgICAgICAgICAgICAgIHMgPSAiIgotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzID0gInMiCi0gICAgICAgICAgICBwcmludCAiRm91bmQiLCBoaXRzLCAiaGl0JXMuIiAlIHMKLSAgICAgICAgICAgIHByaW50ICIoSGludDogcmlnaHQtY2xpY2sgdG8gb3BlbiBsb2NhdGlvbnMuKSIKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHByaW50ICJObyBoaXRzLiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIGZuIGluIGxpc3Q6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4oZm4pIGFzIGY6CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGluZW5vLCBsaW5lIGluIGVudW1lcmF0ZShmLCAxKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsaW5lWy0xOl0gPT0gJ1xuJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0xXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHByb2cuc2VhcmNoKGxpbmUpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCIlczogJXM6ICVzXG4iICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm4sIGxpbmVubywgbGluZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpdHMgKz0gMQorICAgICAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yIGFzIG1zZzoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQobXNnKQorICAgICAgICAgICAgcHJpbnQoKCJIaXRzIGZvdW5kOiAlc1xuIgorICAgICAgICAgICAgICAgICAgIihIaW50OiByaWdodC1jbGljayB0byBvcGVuIGxvY2F0aW9ucy4pIgorICAgICAgICAgICAgICAgICAgJSBoaXRzKSBpZiBoaXRzIGVsc2UgIk5vIGhpdHMuIikKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgIyBUayB3aW5kb3cgaGFzIGJlZW4gY2xvc2VkLCBPdXRwdXRXaW5kb3cudGV4dCA9IE5vbmUsCisgICAgICAgICAgICAjIHNvIGluIE9XLndyaXRlLCBPVy50ZXh0Lmluc2VydCBmYWlscy4KKyAgICAgICAgICAgIHBhc3MKIAogICAgIGRlZiBmaW5kZmlsZXMoc2VsZiwgZGlyLCBiYXNlLCByZWMpOgogICAgICAgICB0cnk6CiAgICAgICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIoZGlyIG9yIG9zLmN1cmRpcikKLSAgICAgICAgZXhjZXB0IG9zLmVycm9yLCBtc2c6Ci0gICAgICAgICAgICBwcmludCBtc2cKKyAgICAgICAgZXhjZXB0IG9zLmVycm9yIGFzIG1zZzoKKyAgICAgICAgICAgIHByaW50KG1zZykKICAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgICBsaXN0ID0gW10KICAgICAgICAgc3ViZGlycyA9IFtdCkBAIC0xMzEsMyArMTI5LDMxIEBACiAgICAgICAgIGlmIHNlbGYudG9wOgogICAgICAgICAgICAgc2VsZi50b3AuZ3JhYl9yZWxlYXNlKCkKICAgICAgICAgICAgIHNlbGYudG9wLndpdGhkcmF3KCkKKworCitkZWYgX2dyZXBfZGlhbG9nKHBhcmVudCk6ICAjIGZvciBodGVzdAorICAgIGZyb20gaWRsZWxpYi5QeVNoZWxsIGltcG9ydCBQeVNoZWxsRmlsZUxpc3QKKyAgICByb290ID0gVGsoKQorICAgIHJvb3QudGl0bGUoIlRlc3QgR3JlcERpYWxvZyIpCisgICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQorICAgIHJvb3QuZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNTApKQorCisgICAgZmxpc3QgPSBQeVNoZWxsRmlsZUxpc3Qocm9vdCkKKyAgICB0ZXh0ID0gVGV4dChyb290LCBoZWlnaHQ9NSkKKyAgICB0ZXh0LnBhY2soKQorCisgICAgZGVmIHNob3dfZ3JlcF9kaWFsb2coKToKKyAgICAgICAgdGV4dC50YWdfYWRkKFNFTCwgIjEuMCIsIEVORCkKKyAgICAgICAgZ3JlcCh0ZXh0LCBmbGlzdD1mbGlzdCkKKyAgICAgICAgdGV4dC50YWdfcmVtb3ZlKFNFTCwgIjEuMCIsIEVORCkKKworICAgIGJ1dHRvbiA9IEJ1dHRvbihyb290LCB0ZXh0PSJTaG93IEdyZXBEaWFsb2ciLCBjb21tYW5kPXNob3dfZ3JlcF9kaWFsb2cpCisgICAgYnV0dG9uLnBhY2soKQorICAgIHJvb3QubWFpbmxvb3AoKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGltcG9ydCB1bml0dGVzdAorICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfZ3JlcCcsIHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQorCisgICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuCisgICAgcnVuKF9ncmVwX2RpYWxvZykKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0h5cGVyUGFyc2VyLnB5IGIvTGliL2lkbGVsaWIvSHlwZXJQYXJzZXIucHkKaW5kZXggMzhhMTlmMi4uNTgxNmQwMCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvSHlwZXJQYXJzZXIucHkKKysrIGIvTGliL2lkbGVsaWIvSHlwZXJQYXJzZXIucHkKQEAgLTEsMTEgKzEsOCBAQAotIiIiCi1IeXBlclBhcnNlcgotPT09PT09PT09PT0KLVRoaXMgbW9kdWxlIGRlZmluZXMgdGhlIEh5cGVyUGFyc2VyIGNsYXNzLCB3aGljaCBwcm92aWRlcyBhZHZhbmNlZCBwYXJzaW5nCi1hYmlsaXRpZXMgZm9yIHRoZSBQYXJlbk1hdGNoIGFuZCBvdGhlciBleHRlbnNpb25zLgotVGhlIEh5cGVyUGFyc2VyIHVzZXMgUHlQYXJzZXIuIFB5UGFyc2VyIGlzIGludGVuZGVkIG1vc3RseSB0byBnaXZlIGluZm9ybWF0aW9uCi1vbiB0aGUgcHJvcGVyIGluZGVudGF0aW9uIG9mIGNvZGUuIEh5cGVyUGFyc2VyIGdpdmVzIHNvbWUgaW5mb3JtYXRpb24gb24gdGhlCi1zdHJ1Y3R1cmUgb2YgY29kZSwgdXNlZCBieSBleHRlbnNpb25zIHRvIGhlbHAgdGhlIHVzZXIuCisiIiJQcm92aWRlIGFkdmFuY2VkIHBhcnNpbmcgYWJpbGl0aWVzIGZvciBQYXJlbk1hdGNoIGFuZCBvdGhlciBleHRlbnNpb25zLgorCitIeXBlclBhcnNlciB1c2VzIFB5UGFyc2VyLiAgUHlQYXJzZXIgbW9zdGx5IGdpdmVzIGluZm9ybWF0aW9uIG9uIHRoZQorcHJvcGVyIGluZGVudGF0aW9uIG9mIGNvZGUuICBIeXBlclBhcnNlciBnaXZlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uCit0aGUgc3RydWN0dXJlIG9mIGNvZGUuCiAiIiIKIAogaW1wb3J0IHN0cmluZwpAQCAtMTUsOSArMTIsNyBAQAogY2xhc3MgSHlwZXJQYXJzZXI6CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgZWRpdHdpbiwgaW5kZXgpOgotICAgICAgICAiIiJJbml0aWFsaXplIHRoZSBIeXBlclBhcnNlciB0byBhbmFseXplIHRoZSBzdXJyb3VuZGluZ3Mgb2YgdGhlIGdpdmVuCi0gICAgICAgIGluZGV4LgotICAgICAgICAiIiIKKyAgICAgICAgIlRvIGluaXRpYWxpemUsIGFuYWx5emUgdGhlIHN1cnJvdW5kaW5ncyBvZiB0aGUgZ2l2ZW4gaW5kZXguIgogCiAgICAgICAgIHNlbGYuZWRpdHdpbiA9IGVkaXR3aW4KICAgICAgICAgc2VsZi50ZXh0ID0gdGV4dCA9IGVkaXR3aW4udGV4dApAQCAtMzMsOSArMjgsMTAgQEAKICAgICAgICAgICAgICAgICBzdGFydGF0ID0gbWF4KGxubyAtIGNvbnRleHQsIDEpCiAgICAgICAgICAgICAgICAgc3RhcnRhdGluZGV4ID0gcmVwcihzdGFydGF0KSArICIuMCIKICAgICAgICAgICAgICAgICBzdG9wYXRpbmRleCA9ICIlZC5lbmQiICUgbG5vCi0gICAgICAgICAgICAgICAgIyBXZSBhZGQgdGhlIG5ld2xpbmUgYmVjYXVzZSBQeVBhcnNlIHJlcXVpcmVzIGEgbmV3bGluZSBhdCBlbmQuCi0gICAgICAgICAgICAgICAgIyBXZSBhZGQgYSBzcGFjZSBzbyB0aGF0IGluZGV4IHdvbid0IGJlIGF0IGVuZCBvZiBsaW5lLCBzbyB0aGF0Ci0gICAgICAgICAgICAgICAgIyBpdHMgc3RhdHVzIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIGNoYXIgYmVmb3JlIGl0LCBpZiBzaG91bGQuCisgICAgICAgICAgICAgICAgIyBXZSBhZGQgdGhlIG5ld2xpbmUgYmVjYXVzZSBQeVBhcnNlIHJlcXVpcmVzIGEgbmV3bGluZQorICAgICAgICAgICAgICAgICMgYXQgZW5kLiBXZSBhZGQgYSBzcGFjZSBzbyB0aGF0IGluZGV4IHdvbid0IGJlIGF0IGVuZAorICAgICAgICAgICAgICAgICMgb2YgbGluZSwgc28gdGhhdCBpdHMgc3RhdHVzIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlCisgICAgICAgICAgICAgICAgIyBjaGFyIGJlZm9yZSBpdCwgaWYgc2hvdWxkLgogICAgICAgICAgICAgICAgIHBhcnNlci5zZXRfc3RyKHRleHQuZ2V0KHN0YXJ0YXRpbmRleCwgc3RvcGF0aW5kZXgpKycgXG4nKQogICAgICAgICAgICAgICAgIGJvZCA9IHBhcnNlci5maW5kX2dvb2RfcGFyc2Vfc3RhcnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXR3aW4uX2J1aWxkX2NoYXJfaW5fc3RyaW5nX2Z1bmMoc3RhcnRhdGluZGV4KSkKQEAgLTQ5LDEyMiArNDUsMTMwIEBACiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHN0YXJ0YXRpbmRleCA9ICIxLjAiCiAgICAgICAgICAgICBzdG9wYXRpbmRleCA9ICIlZC5lbmQiICUgbG5vCi0gICAgICAgICAgICAjIFdlIGFkZCB0aGUgbmV3bGluZSBiZWNhdXNlIFB5UGFyc2UgcmVxdWlyZXMgYSBuZXdsaW5lIGF0IGVuZC4KLSAgICAgICAgICAgICMgV2UgYWRkIGEgc3BhY2Ugc28gdGhhdCBpbmRleCB3b24ndCBiZSBhdCBlbmQgb2YgbGluZSwgc28gdGhhdAotICAgICAgICAgICAgIyBpdHMgc3RhdHVzIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIGNoYXIgYmVmb3JlIGl0LCBpZiBzaG91bGQuCisgICAgICAgICAgICAjIFdlIGFkZCB0aGUgbmV3bGluZSBiZWNhdXNlIFB5UGFyc2UgcmVxdWlyZXMgaXQuIFdlIGFkZCBhCisgICAgICAgICAgICAjIHNwYWNlIHNvIHRoYXQgaW5kZXggd29uJ3QgYmUgYXQgZW5kIG9mIGxpbmUsIHNvIHRoYXQgaXRzCisgICAgICAgICAgICAjIHN0YXR1cyB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBjaGFyIGJlZm9yZSBpdCwgaWYgc2hvdWxkLgogICAgICAgICAgICAgcGFyc2VyLnNldF9zdHIodGV4dC5nZXQoc3RhcnRhdGluZGV4LCBzdG9wYXRpbmRleCkrJyBcbicpCiAgICAgICAgICAgICBwYXJzZXIuc2V0X2xvKDApCiAKLSAgICAgICAgIyBXZSB3YW50IHdoYXQgdGhlIHBhcnNlciBoYXMsIGV4Y2VwdCBmb3IgdGhlIGxhc3QgbmV3bGluZSBhbmQgc3BhY2UuCisgICAgICAgICMgV2Ugd2FudCB3aGF0IHRoZSBwYXJzZXIgaGFzLCBtaW51cyB0aGUgbGFzdCBuZXdsaW5lIGFuZCBzcGFjZS4KICAgICAgICAgc2VsZi5yYXd0ZXh0ID0gcGFyc2VyLnN0cls6LTJdCi0gICAgICAgICMgQXMgZmFyIGFzIEkgY2FuIHNlZSwgcGFyc2VyLnN0ciBwcmVzZXJ2ZXMgdGhlIHN0YXRlbWVudCB3ZSBhcmUgaW4sCi0gICAgICAgICMgc28gdGhhdCBzdG9wYXRpbmRleCBjYW4gYmUgdXNlZCB0byBzeW5jaHJvbml6ZSB0aGUgc3RyaW5nIHdpdGggdGhlCi0gICAgICAgICMgdGV4dCBib3ggaW5kaWNlcy4KKyAgICAgICAgIyBQYXJzZXIuc3RyIGFwcGFyZW50bHkgcHJlc2VydmVzIHRoZSBzdGF0ZW1lbnQgd2UgYXJlIGluLCBzbworICAgICAgICAjIHRoYXQgc3RvcGF0aW5kZXggY2FuIGJlIHVzZWQgdG8gc3luY2hyb25pemUgdGhlIHN0cmluZyB3aXRoCisgICAgICAgICMgdGhlIHRleHQgYm94IGluZGljZXMuCiAgICAgICAgIHNlbGYuc3RvcGF0aW5kZXggPSBzdG9wYXRpbmRleAogICAgICAgICBzZWxmLmJyYWNrZXRpbmcgPSBwYXJzZXIuZ2V0X2xhc3Rfc3RtdF9icmFja2V0aW5nKCkKLSAgICAgICAgIyBmaW5kIHdoaWNoIHBhaXJzIG9mIGJyYWNrZXRpbmcgYXJlIG9wZW5lcnMuIFRoZXNlIGFsd2F5cyBjb3JyZXNwb25kCi0gICAgICAgICMgdG8gYSBjaGFyYWN0ZXIgb2YgcmF3dGV4dC4KLSAgICAgICAgc2VsZi5pc29wZW5lciA9IFtpPjAgYW5kIHNlbGYuYnJhY2tldGluZ1tpXVsxXSA+IHNlbGYuYnJhY2tldGluZ1tpLTFdWzFdCisgICAgICAgICMgZmluZCB3aGljaCBwYWlycyBvZiBicmFja2V0aW5nIGFyZSBvcGVuZXJzLiBUaGVzZSBhbHdheXMKKyAgICAgICAgIyBjb3JyZXNwb25kIHRvIGEgY2hhcmFjdGVyIG9mIHJhd3RleHQuCisgICAgICAgIHNlbGYuaXNvcGVuZXIgPSBbaT4wIGFuZCBzZWxmLmJyYWNrZXRpbmdbaV1bMV0gPgorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYnJhY2tldGluZ1tpLTFdWzFdCiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuYnJhY2tldGluZykpXQogCiAgICAgICAgIHNlbGYuc2V0X2luZGV4KGluZGV4KQogCiAgICAgZGVmIHNldF9pbmRleChzZWxmLCBpbmRleCk6Ci0gICAgICAgICIiIlNldCB0aGUgaW5kZXggdG8gd2hpY2ggdGhlIGZ1bmN0aW9ucyByZWxhdGUuIE5vdGUgdGhhdCBpdCBtdXN0IGJlCi0gICAgICAgIGluIHRoZSBzYW1lIHN0YXRlbWVudC4KKyAgICAgICAgIiIiU2V0IHRoZSBpbmRleCB0byB3aGljaCB0aGUgZnVuY3Rpb25zIHJlbGF0ZS4KKworICAgICAgICBUaGUgaW5kZXggbXVzdCBiZSBpbiB0aGUgc2FtZSBzdGF0ZW1lbnQuCiAgICAgICAgICIiIgotICAgICAgICBpbmRleGlucmF3dGV4dCA9IFwKLSAgICAgICAgICAgIGxlbihzZWxmLnJhd3RleHQpIC0gbGVuKHNlbGYudGV4dC5nZXQoaW5kZXgsIHNlbGYuc3RvcGF0aW5kZXgpKQorICAgICAgICBpbmRleGlucmF3dGV4dCA9IChsZW4oc2VsZi5yYXd0ZXh0KSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbihzZWxmLnRleHQuZ2V0KGluZGV4LCBzZWxmLnN0b3BhdGluZGV4KSkpCiAgICAgICAgIGlmIGluZGV4aW5yYXd0ZXh0IDwgMDoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlRoZSBpbmRleCBnaXZlbiBpcyBiZWZvcmUgdGhlIGFuYWx5emVkIHN0YXRlbWVudCIpCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbmRleCAlcyBwcmVjZWRlcyB0aGUgYW5hbHl6ZWQgc3RhdGVtZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIGluZGV4KQogICAgICAgICBzZWxmLmluZGV4aW5yYXd0ZXh0ID0gaW5kZXhpbnJhd3RleHQKICAgICAgICAgIyBmaW5kIHRoZSByaWdodG1vc3QgYnJhY2tldCB0byB3aGljaCBpbmRleCBiZWxvbmdzCiAgICAgICAgIHNlbGYuaW5kZXhicmFja2V0ID0gMAotICAgICAgICB3aGlsZSBzZWxmLmluZGV4YnJhY2tldCA8IGxlbihzZWxmLmJyYWNrZXRpbmcpLTEgYW5kIFwKLSAgICAgICAgICAgICAgc2VsZi5icmFja2V0aW5nW3NlbGYuaW5kZXhicmFja2V0KzFdWzBdIDwgc2VsZi5pbmRleGlucmF3dGV4dDoKKyAgICAgICAgd2hpbGUgKHNlbGYuaW5kZXhicmFja2V0IDwgbGVuKHNlbGYuYnJhY2tldGluZyktMSBhbmQKKyAgICAgICAgICAgICAgIHNlbGYuYnJhY2tldGluZ1tzZWxmLmluZGV4YnJhY2tldCsxXVswXSA8IHNlbGYuaW5kZXhpbnJhd3RleHQpOgogICAgICAgICAgICAgc2VsZi5pbmRleGJyYWNrZXQgKz0gMQotICAgICAgICBpZiBzZWxmLmluZGV4YnJhY2tldCA8IGxlbihzZWxmLmJyYWNrZXRpbmcpLTEgYW5kIFwKLSAgICAgICAgICAgc2VsZi5icmFja2V0aW5nW3NlbGYuaW5kZXhicmFja2V0KzFdWzBdID09IHNlbGYuaW5kZXhpbnJhd3RleHQgYW5kIFwKLSAgICAgICAgICAgbm90IHNlbGYuaXNvcGVuZXJbc2VsZi5pbmRleGJyYWNrZXQrMV06CisgICAgICAgIGlmIChzZWxmLmluZGV4YnJhY2tldCA8IGxlbihzZWxmLmJyYWNrZXRpbmcpLTEgYW5kCisgICAgICAgICAgICBzZWxmLmJyYWNrZXRpbmdbc2VsZi5pbmRleGJyYWNrZXQrMV1bMF0gPT0gc2VsZi5pbmRleGlucmF3dGV4dCBhbmQKKyAgICAgICAgICAgbm90IHNlbGYuaXNvcGVuZXJbc2VsZi5pbmRleGJyYWNrZXQrMV0pOgogICAgICAgICAgICAgc2VsZi5pbmRleGJyYWNrZXQgKz0gMQogCiAgICAgZGVmIGlzX2luX3N0cmluZyhzZWxmKToKLSAgICAgICAgIiIiSXMgdGhlIGluZGV4IGdpdmVuIHRvIHRoZSBIeXBlclBhcnNlciBpcyBpbiBhIHN0cmluZz8iIiIKKyAgICAgICAgIiIiSXMgdGhlIGluZGV4IGdpdmVuIHRvIHRoZSBIeXBlclBhcnNlciBpbiBhIHN0cmluZz8iIiIKICAgICAgICAgIyBUaGUgYnJhY2tldCB0byB3aGljaCB3ZSBiZWxvbmcgc2hvdWxkIGJlIGFuIG9wZW5lci4KICAgICAgICAgIyBJZiBpdCdzIGFuIG9wZW5lciwgaXQgaGFzIHRvIGhhdmUgYSBjaGFyYWN0ZXIuCi0gICAgICAgIHJldHVybiBzZWxmLmlzb3BlbmVyW3NlbGYuaW5kZXhicmFja2V0XSBhbmQgXAotICAgICAgICAgICAgICAgc2VsZi5yYXd0ZXh0W3NlbGYuYnJhY2tldGluZ1tzZWxmLmluZGV4YnJhY2tldF1bMF1dIGluICgnIicsICInIikKKyAgICAgICAgcmV0dXJuIChzZWxmLmlzb3BlbmVyW3NlbGYuaW5kZXhicmFja2V0XSBhbmQKKyAgICAgICAgICAgICAgICBzZWxmLnJhd3RleHRbc2VsZi5icmFja2V0aW5nW3NlbGYuaW5kZXhicmFja2V0XVswXV0KKyAgICAgICAgICAgICAgICBpbiAoJyInLCAiJyIpKQogCiAgICAgZGVmIGlzX2luX2NvZGUoc2VsZik6Ci0gICAgICAgICIiIklzIHRoZSBpbmRleCBnaXZlbiB0byB0aGUgSHlwZXJQYXJzZXIgaXMgaW4gYSBub3JtYWwgY29kZT8iIiIKLSAgICAgICAgcmV0dXJuIG5vdCBzZWxmLmlzb3BlbmVyW3NlbGYuaW5kZXhicmFja2V0XSBvciBcCi0gICAgICAgICAgICAgICBzZWxmLnJhd3RleHRbc2VsZi5icmFja2V0aW5nW3NlbGYuaW5kZXhicmFja2V0XVswXV0gbm90IGluIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJyMnLCAnIicsICInIikKKyAgICAgICAgIiIiSXMgdGhlIGluZGV4IGdpdmVuIHRvIHRoZSBIeXBlclBhcnNlciBpbiBub3JtYWwgY29kZT8iIiIKKyAgICAgICAgcmV0dXJuIChub3Qgc2VsZi5pc29wZW5lcltzZWxmLmluZGV4YnJhY2tldF0gb3IKKyAgICAgICAgICAgICAgICBzZWxmLnJhd3RleHRbc2VsZi5icmFja2V0aW5nW3NlbGYuaW5kZXhicmFja2V0XVswXV0KKyAgICAgICAgICAgICAgICBub3QgaW4gKCcjJywgJyInLCAiJyIpKQogCiAgICAgZGVmIGdldF9zdXJyb3VuZGluZ19icmFja2V0cyhzZWxmLCBvcGVuZXJzPScoW3snLCBtdXN0Y2xvc2U9RmFsc2UpOgotICAgICAgICAiIiJJZiB0aGUgaW5kZXggZ2l2ZW4gdG8gdGhlIEh5cGVyUGFyc2VyIGlzIHN1cnJvdW5kZWQgYnkgYSBicmFja2V0Ci0gICAgICAgIGRlZmluZWQgaW4gb3BlbmVycyAob3IgYXQgbGVhc3QgaGFzIG9uZSBiZWZvcmUgaXQpLCByZXR1cm4gdGhlCi0gICAgICAgIGluZGljZXMgb2YgdGhlIG9wZW5pbmcgYnJhY2tldCBhbmQgdGhlIGNsb3NpbmcgYnJhY2tldCAob3IgdGhlCi0gICAgICAgIGVuZCBvZiBsaW5lLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QpLgotICAgICAgICBJZiBpdCBpcyBub3Qgc3Vycm91bmRlZCBieSBicmFja2V0cywgb3IgdGhlIGVuZCBvZiBsaW5lIGNvbWVzIGJlZm9yZQotICAgICAgICB0aGUgY2xvc2luZyBicmFja2V0IGFuZCBtdXN0Y2xvc2UgaXMgVHJ1ZSwgcmV0dXJucyBOb25lLgorICAgICAgICAiIiJSZXR1cm4gYnJhY2tldCBpbmRleGVzIG9yIE5vbmUuCisKKyAgICAgICAgSWYgdGhlIGluZGV4IGdpdmVuIHRvIHRoZSBIeXBlclBhcnNlciBpcyBzdXJyb3VuZGVkIGJ5IGEKKyAgICAgICAgYnJhY2tldCBkZWZpbmVkIGluIG9wZW5lcnMgKG9yIGF0IGxlYXN0IGhhcyBvbmUgYmVmb3JlIGl0KSwKKyAgICAgICAgcmV0dXJuIHRoZSBpbmRpY2VzIG9mIHRoZSBvcGVuaW5nIGJyYWNrZXQgYW5kIHRoZSBjbG9zaW5nCisgICAgICAgIGJyYWNrZXQgKG9yIHRoZSBlbmQgb2YgbGluZSwgd2hpY2hldmVyIGNvbWVzIGZpcnN0KS4KKworICAgICAgICBJZiBpdCBpcyBub3Qgc3Vycm91bmRlZCBieSBicmFja2V0cywgb3IgdGhlIGVuZCBvZiBsaW5lIGNvbWVzCisgICAgICAgIGJlZm9yZSB0aGUgY2xvc2luZyBicmFja2V0IGFuZCBtdXN0Y2xvc2UgaXMgVHJ1ZSwgcmV0dXJucyBOb25lLgogICAgICAgICAiIiIKKwogICAgICAgICBicmFja2V0aW5nbGV2ZWwgPSBzZWxmLmJyYWNrZXRpbmdbc2VsZi5pbmRleGJyYWNrZXRdWzFdCiAgICAgICAgIGJlZm9yZSA9IHNlbGYuaW5kZXhicmFja2V0Ci0gICAgICAgIHdoaWxlIG5vdCBzZWxmLmlzb3BlbmVyW2JlZm9yZV0gb3IgXAotICAgICAgICAgICAgICBzZWxmLnJhd3RleHRbc2VsZi5icmFja2V0aW5nW2JlZm9yZV1bMF1dIG5vdCBpbiBvcGVuZXJzIG9yIFwKLSAgICAgICAgICAgICAgc2VsZi5icmFja2V0aW5nW2JlZm9yZV1bMV0gPiBicmFja2V0aW5nbGV2ZWw6CisgICAgICAgIHdoaWxlIChub3Qgc2VsZi5pc29wZW5lcltiZWZvcmVdIG9yCisgICAgICAgICAgICAgIHNlbGYucmF3dGV4dFtzZWxmLmJyYWNrZXRpbmdbYmVmb3JlXVswXV0gbm90IGluIG9wZW5lcnMgb3IKKyAgICAgICAgICAgICAgc2VsZi5icmFja2V0aW5nW2JlZm9yZV1bMV0gPiBicmFja2V0aW5nbGV2ZWwpOgogICAgICAgICAgICAgYmVmb3JlIC09IDEKICAgICAgICAgICAgIGlmIGJlZm9yZSA8IDA6CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgIGJyYWNrZXRpbmdsZXZlbCA9IG1pbihicmFja2V0aW5nbGV2ZWwsIHNlbGYuYnJhY2tldGluZ1tiZWZvcmVdWzFdKQogICAgICAgICBhZnRlciA9IHNlbGYuaW5kZXhicmFja2V0ICsgMQotICAgICAgICB3aGlsZSBhZnRlciA8IGxlbihzZWxmLmJyYWNrZXRpbmcpIGFuZCBcCi0gICAgICAgICAgICAgIHNlbGYuYnJhY2tldGluZ1thZnRlcl1bMV0gPj0gYnJhY2tldGluZ2xldmVsOgorICAgICAgICB3aGlsZSAoYWZ0ZXIgPCBsZW4oc2VsZi5icmFja2V0aW5nKSBhbmQKKyAgICAgICAgICAgICAgc2VsZi5icmFja2V0aW5nW2FmdGVyXVsxXSA+PSBicmFja2V0aW5nbGV2ZWwpOgogICAgICAgICAgICAgYWZ0ZXIgKz0gMQogCiAgICAgICAgIGJlZm9yZWluZGV4ID0gc2VsZi50ZXh0LmluZGV4KCIlcy0lZGMiICUKICAgICAgICAgICAgIChzZWxmLnN0b3BhdGluZGV4LCBsZW4oc2VsZi5yYXd0ZXh0KS1zZWxmLmJyYWNrZXRpbmdbYmVmb3JlXVswXSkpCi0gICAgICAgIGlmIGFmdGVyID49IGxlbihzZWxmLmJyYWNrZXRpbmcpIG9yIFwKLSAgICAgICAgICAgc2VsZi5icmFja2V0aW5nW2FmdGVyXVswXSA+IGxlbihzZWxmLnJhd3RleHQpOgorICAgICAgICBpZiAoYWZ0ZXIgPj0gbGVuKHNlbGYuYnJhY2tldGluZykgb3IKKyAgICAgICAgICAgc2VsZi5icmFja2V0aW5nW2FmdGVyXVswXSA+IGxlbihzZWxmLnJhd3RleHQpKToKICAgICAgICAgICAgIGlmIG11c3RjbG9zZToKICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICAgYWZ0ZXJpbmRleCA9IHNlbGYuc3RvcGF0aW5kZXgKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICMgV2UgYXJlIGFmdGVyIGEgcmVhbCBjaGFyLCBzbyBpdCBpcyBhICcpJyBhbmQgd2UgZ2l2ZSB0aGUgaW5kZXgKLSAgICAgICAgICAgICMgYmVmb3JlIGl0LgotICAgICAgICAgICAgYWZ0ZXJpbmRleCA9IHNlbGYudGV4dC5pbmRleCgiJXMtJWRjIiAlCi0gICAgICAgICAgICAgICAgKHNlbGYuc3RvcGF0aW5kZXgsCisgICAgICAgICAgICAjIFdlIGFyZSBhZnRlciBhIHJlYWwgY2hhciwgc28gaXQgaXMgYSAnKScgYW5kIHdlIGdpdmUgdGhlCisgICAgICAgICAgICAjIGluZGV4IGJlZm9yZSBpdC4KKyAgICAgICAgICAgIGFmdGVyaW5kZXggPSBzZWxmLnRleHQuaW5kZXgoCisgICAgICAgICAgICAgICAgIiVzLSVkYyIgJSAoc2VsZi5zdG9wYXRpbmRleCwKICAgICAgICAgICAgICAgICAgbGVuKHNlbGYucmF3dGV4dCktKHNlbGYuYnJhY2tldGluZ1thZnRlcl1bMF0tMSkpKQogCiAgICAgICAgIHJldHVybiBiZWZvcmVpbmRleCwgYWZ0ZXJpbmRleAogCi0gICAgIyBUaGlzIHN0cmluZyBpbmNsdWRlcyBhbGwgY2hhcnMgdGhhdCBtYXkgYmUgaW4gYSB3aGl0ZSBzcGFjZQorICAgICMgQXNjaWkgY2hhcnMgdGhhdCBtYXkgYmUgaW4gYSB3aGl0ZSBzcGFjZQogICAgIF93aGl0ZXNwYWNlX2NoYXJzID0gIiBcdFxuXFwiCi0gICAgIyBUaGlzIHN0cmluZyBpbmNsdWRlcyBhbGwgY2hhcnMgdGhhdCBtYXkgYmUgaW4gYW4gaWRlbnRpZmllcgorICAgICMgQXNjaWkgY2hhcnMgdGhhdCBtYXkgYmUgaW4gYW4gaWRlbnRpZmllcgogICAgIF9pZF9jaGFycyA9IHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cyArICJfIgotICAgICMgVGhpcyBzdHJpbmcgaW5jbHVkZXMgYWxsIGNoYXJzIHRoYXQgbWF5IGJlIHRoZSBmaXJzdCBjaGFyIG9mIGFuIGlkZW50aWZpZXIKKyAgICAjIEFzY2lpIGNoYXJzIHRoYXQgbWF5IGJlIHRoZSBmaXJzdCBjaGFyIG9mIGFuIGlkZW50aWZpZXIKICAgICBfaWRfZmlyc3RfY2hhcnMgPSBzdHJpbmcuYXNjaWlfbGV0dGVycyArICJfIgogCi0gICAgIyBHaXZlbiBhIHN0cmluZyBhbmQgcG9zLCByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFycyBpbiB0aGUgaWRlbnRpZmllcgotICAgICMgd2hpY2ggZW5kcyBhdCBwb3MsIG9yIDAgaWYgdGhlcmUgaXMgbm8gc3VjaCBvbmUuIFNhdmVkIHdvcmRzIGFyZSBub3QKLSAgICAjIGlkZW50aWZpZXJzLgorICAgICMgR2l2ZW4gYSBzdHJpbmcgYW5kIHBvcywgcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcnMgaW4gdGhlCisgICAgIyBpZGVudGlmaWVyIHdoaWNoIGVuZHMgYXQgcG9zLCBvciAwIGlmIHRoZXJlIGlzIG5vIHN1Y2ggb25lLiBTYXZlZAorICAgICMgd29yZHMgYXJlIG5vdCBpZGVudGlmaWVycy4KICAgICBkZWYgX2VhdF9pZGVudGlmaWVyKHNlbGYsIHN0ciwgbGltaXQsIHBvcyk6CiAgICAgICAgIGkgPSBwb3MKICAgICAgICAgd2hpbGUgaSA+IGxpbWl0IGFuZCBzdHJbaS0xXSBpbiBzZWxmLl9pZF9jaGFyczoKICAgICAgICAgICAgIGkgLT0gMQotICAgICAgICBpZiBpIDwgcG9zIGFuZCAoc3RyW2ldIG5vdCBpbiBzZWxmLl9pZF9maXJzdF9jaGFycyBvciBcCi0gICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkLmlza2V5d29yZChzdHJbaTpwb3NdKSk6CisgICAgICAgIGlmIChpIDwgcG9zIGFuZCAoc3RyW2ldIG5vdCBpbiBzZWxmLl9pZF9maXJzdF9jaGFycyBvcgorICAgICAgICAgICAga2V5d29yZC5pc2tleXdvcmQoc3RyW2k6cG9zXSkpKToKICAgICAgICAgICAgIGkgPSBwb3MKICAgICAgICAgcmV0dXJuIHBvcyAtIGkKIAogICAgIGRlZiBnZXRfZXhwcmVzc2lvbihzZWxmKToKLSAgICAgICAgIiIiUmV0dXJuIGEgc3RyaW5nIHdpdGggdGhlIFB5dGhvbiBleHByZXNzaW9uIHdoaWNoIGVuZHMgYXQgdGhlIGdpdmVuCi0gICAgICAgIGluZGV4LCB3aGljaCBpcyBlbXB0eSBpZiB0aGVyZSBpcyBubyByZWFsIG9uZS4KKyAgICAgICAgIiIiUmV0dXJuIGEgc3RyaW5nIHdpdGggdGhlIFB5dGhvbiBleHByZXNzaW9uIHdoaWNoIGVuZHMgYXQgdGhlCisgICAgICAgIGdpdmVuIGluZGV4LCB3aGljaCBpcyBlbXB0eSBpZiB0aGVyZSBpcyBubyByZWFsIG9uZS4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIG5vdCBzZWxmLmlzX2luX2NvZGUoKToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImdldF9leHByZXNzaW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiBpbmRleCAiXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXMgaW5zaWRlIGEgY29kZS4iKQorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZ2V0X2V4cHJlc3Npb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWYgaW5kZXggaXMgaW5zaWRlIGEgY29kZS4iKQogCiAgICAgICAgIHJhd3RleHQgPSBzZWxmLnJhd3RleHQKICAgICAgICAgYnJhY2tldGluZyA9IHNlbGYuYnJhY2tldGluZwpAQCAtMTc3LDIwICsxODEsMjAgQEAKICAgICAgICAgcG9zdGRvdF9waGFzZSA9IFRydWUKIAogICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgIyBFYXQgd2hpdGVzcGFjZXMsIGNvbW1lbnRzLCBhbmQgaWYgcG9zdGRvdF9waGFzZSBpcyBGYWxzZSAtIG9uZSBkb3QKKyAgICAgICAgICAgICMgRWF0IHdoaXRlc3BhY2VzLCBjb21tZW50cywgYW5kIGlmIHBvc3Rkb3RfcGhhc2UgaXMgRmFsc2UgLSBhIGRvdAogICAgICAgICAgICAgd2hpbGUgMToKICAgICAgICAgICAgICAgICBpZiBwb3M+YnJja19saW1pdCBhbmQgcmF3dGV4dFtwb3MtMV0gaW4gc2VsZi5fd2hpdGVzcGFjZV9jaGFyczoKICAgICAgICAgICAgICAgICAgICAgIyBFYXQgYSB3aGl0ZXNwYWNlCiAgICAgICAgICAgICAgICAgICAgIHBvcyAtPSAxCi0gICAgICAgICAgICAgICAgZWxpZiBub3QgcG9zdGRvdF9waGFzZSBhbmQgXAotICAgICAgICAgICAgICAgICAgICAgcG9zID4gYnJja19saW1pdCBhbmQgcmF3dGV4dFtwb3MtMV0gPT0gJy4nOgorICAgICAgICAgICAgICAgIGVsaWYgKG5vdCBwb3N0ZG90X3BoYXNlIGFuZAorICAgICAgICAgICAgICAgICAgICAgIHBvcyA+IGJyY2tfbGltaXQgYW5kIHJhd3RleHRbcG9zLTFdID09ICcuJyk6CiAgICAgICAgICAgICAgICAgICAgICMgRWF0IGEgZG90CiAgICAgICAgICAgICAgICAgICAgIHBvcyAtPSAxCiAgICAgICAgICAgICAgICAgICAgIHBvc3Rkb3RfcGhhc2UgPSBUcnVlCi0gICAgICAgICAgICAgICAgIyBUaGUgbmV4dCBsaW5lIHdpbGwgZmFpbCBpZiB3ZSBhcmUgKmluc2lkZSogYSBjb21tZW50LCBidXQgd2UKLSAgICAgICAgICAgICAgICAjIHNob3VsZG4ndCBiZS4KLSAgICAgICAgICAgICAgICBlbGlmIHBvcyA9PSBicmNrX2xpbWl0IGFuZCBicmNrX2luZGV4ID4gMCBhbmQgXAotICAgICAgICAgICAgICAgICAgICAgcmF3dGV4dFticmFja2V0aW5nW2JyY2tfaW5kZXgtMV1bMF1dID09ICcjJzoKKyAgICAgICAgICAgICAgICAjIFRoZSBuZXh0IGxpbmUgd2lsbCBmYWlsIGlmIHdlIGFyZSAqaW5zaWRlKiBhIGNvbW1lbnQsCisgICAgICAgICAgICAgICAgIyBidXQgd2Ugc2hvdWxkbid0IGJlLgorICAgICAgICAgICAgICAgIGVsaWYgKHBvcyA9PSBicmNrX2xpbWl0IGFuZCBicmNrX2luZGV4ID4gMCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICByYXd0ZXh0W2JyYWNrZXRpbmdbYnJja19pbmRleC0xXVswXV0gPT0gJyMnKToKICAgICAgICAgICAgICAgICAgICAgIyBFYXQgYSBjb21tZW50CiAgICAgICAgICAgICAgICAgICAgIGJyY2tfaW5kZXggLT0gMgogICAgICAgICAgICAgICAgICAgICBicmNrX2xpbWl0ID0gYnJhY2tldGluZ1ticmNrX2luZGV4XVswXQpAQCAtMjAwLDggKzIwNCw4IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAKICAgICAgICAgICAgIGlmIG5vdCBwb3N0ZG90X3BoYXNlOgotICAgICAgICAgICAgICAgICMgV2UgZGlkbid0IGZpbmQgYSBkb3QsIHNvIHRoZSBleHByZXNzaW9uIGVuZCBhdCB0aGUgbGFzdAotICAgICAgICAgICAgICAgICMgaWRlbnRpZmllciBwb3MuCisgICAgICAgICAgICAgICAgIyBXZSBkaWRuJ3QgZmluZCBhIGRvdCwgc28gdGhlIGV4cHJlc3Npb24gZW5kIGF0IHRoZQorICAgICAgICAgICAgICAgICMgbGFzdCBpZGVudGlmaWVyIHBvcy4KICAgICAgICAgICAgICAgICBicmVhawogCiAgICAgICAgICAgICByZXQgPSBzZWxmLl9lYXRfaWRlbnRpZmllcihyYXd0ZXh0LCBicmNrX2xpbWl0LCBwb3MpCkBAIC0yMDksMTMgKzIxMywxMyBAQAogICAgICAgICAgICAgICAgICMgVGhlcmUgaXMgYW4gaWRlbnRpZmllciB0byBlYXQKICAgICAgICAgICAgICAgICBwb3MgPSBwb3MgLSByZXQKICAgICAgICAgICAgICAgICBsYXN0X2lkZW50aWZpZXJfcG9zID0gcG9zCi0gICAgICAgICAgICAgICAgIyBOb3csIGluIG9yZGVyIHRvIGNvbnRpbnVlIHRoZSBzZWFyY2gsIHdlIG11c3QgZmluZCBhIGRvdC4KKyAgICAgICAgICAgICAgICAjIE5vdywgdG8gY29udGludWUgdGhlIHNlYXJjaCwgd2UgbXVzdCBmaW5kIGEgZG90LgogICAgICAgICAgICAgICAgIHBvc3Rkb3RfcGhhc2UgPSBGYWxzZQogICAgICAgICAgICAgICAgICMgKHRoZSBsb29wIGNvbnRpbnVlcyBub3cpCiAKICAgICAgICAgICAgIGVsaWYgcG9zID09IGJyY2tfbGltaXQ6Ci0gICAgICAgICAgICAgICAgIyBXZSBhcmUgYXQgYSBicmFja2V0aW5nIGxpbWl0LiBJZiBpdCBpcyBhIGNsb3NpbmcgYnJhY2tldCwKLSAgICAgICAgICAgICAgICAjIGVhdCB0aGUgYnJhY2tldCwgb3RoZXJ3aXNlLCBzdG9wIHRoZSBzZWFyY2guCisgICAgICAgICAgICAgICAgIyBXZSBhcmUgYXQgYSBicmFja2V0aW5nIGxpbWl0LiBJZiBpdCBpcyBhIGNsb3NpbmcKKyAgICAgICAgICAgICAgICAjIGJyYWNrZXQsIGVhdCB0aGUgYnJhY2tldCwgb3RoZXJ3aXNlLCBzdG9wIHRoZSBzZWFyY2guCiAgICAgICAgICAgICAgICAgbGV2ZWwgPSBicmFja2V0aW5nW2JyY2tfaW5kZXhdWzFdCiAgICAgICAgICAgICAgICAgd2hpbGUgYnJja19pbmRleCA+IDAgYW5kIGJyYWNrZXRpbmdbYnJja19pbmRleC0xXVsxXSA+IGxldmVsOgogICAgICAgICAgICAgICAgICAgICBicmNrX2luZGV4IC09IDEKQEAgLTIzMiw2ICsyMzYsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICMgV2UgY2FuJ3QgY29udGludWUgYWZ0ZXIgb3RoZXIgdHlwZXMgb2YgYnJhY2tldHMKKyAgICAgICAgICAgICAgICAgICAgaWYgcmF3dGV4dFtwb3NdIGluICInXCIiOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBTY2FuIGEgc3RyaW5nIHByZWZpeAorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgcG9zID4gMCBhbmQgcmF3dGV4dFtwb3MgLSAxXSBpbiAiclJiQnVVIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgLT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9pZGVudGlmaWVyX3BvcyA9IHBvcwogICAgICAgICAgICAgICAgICAgICBicmVhawogCiAgICAgICAgICAgICBlbHNlOgpAQCAtMjM5LDMgKzI0OCw4IEBACiAgICAgICAgICAgICAgICAgYnJlYWsKIAogICAgICAgICByZXR1cm4gcmF3dGV4dFtsYXN0X2lkZW50aWZpZXJfcG9zOnNlbGYuaW5kZXhpbnJhd3RleHRdCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpbXBvcnQgdW5pdHRlc3QKKyAgICB1bml0dGVzdC5tYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X2h5cGVycGFyc2VyJywgdmVyYm9zaXR5PTIpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9JT0JpbmRpbmcucHkgYi9MaWIvaWRsZWxpYi9JT0JpbmRpbmcucHkKaW5kZXggYzUxNTQzMi4uYWVkZDM3MiAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvSU9CaW5kaW5nLnB5CisrKyBiL0xpYi9pZGxlbGliL0lPQmluZGluZy5weQpAQCAtNyw2ICs3LDcgQEAKIAogaW1wb3J0IG9zCiBpbXBvcnQgdHlwZXMKK2ltcG9ydCBwaXBlcwogaW1wb3J0IHN5cwogaW1wb3J0IGNvZGVjcwogaW1wb3J0IHRlbXBmaWxlCkBAIC03MCw3ICs3MSw3IEBACiAKIGVuY29kaW5nID0gZW5jb2RpbmcubG93ZXIoKQogCi1jb2RpbmdfcmUgPSByZS5jb21waWxlKCJjb2RpbmdbOj1dXHMqKFstXHdfLl0rKSIpCitjb2RpbmdfcmUgPSByZS5jb21waWxlKHInXlsgXHRcZl0qIy4qY29kaW5nWzo9XVsgXHRdKihbLVx3Ll0rKScpCiAKIGNsYXNzIEVuY29kaW5nTWVzc2FnZShTaW1wbGVEaWFsb2cpOgogICAgICJJbmZvcm0gdXNlciB0aGF0IGFuIGVuY29kaW5nIGRlY2xhcmF0aW9uIGlzIG5lZWRlZC4iCkBAIC0xMjQsMTEgKzEyNSwxMiBAQAogICAgIFJhaXNlIExvb2t1cEVycm9yIGlmIHRoZSBlbmNvZGluZyBpcyBkZWNsYXJlZCBidXQgdW5rbm93bi4KICAgICAiIiIKICAgICAjIE9ubHkgY29uc2lkZXIgdGhlIGZpcnN0IHR3byBsaW5lcwotICAgIHN0ciA9IHN0ci5zcGxpdCgiXG4iKVs6Ml0KLSAgICBzdHIgPSAiXG4iLmpvaW4oc3RyKQotCi0gICAgbWF0Y2ggPSBjb2RpbmdfcmUuc2VhcmNoKHN0cikKLSAgICBpZiBub3QgbWF0Y2g6CisgICAgbHN0ID0gc3RyLnNwbGl0KCJcbiIsIDIpWzoyXQorICAgIGZvciBsaW5lIGluIGxzdDoKKyAgICAgICAgbWF0Y2ggPSBjb2RpbmdfcmUubWF0Y2gobGluZSkKKyAgICAgICAgaWYgbWF0Y2ggaXMgbm90IE5vbmU6CisgICAgICAgICAgICBicmVhaworICAgIGVsc2U6CiAgICAgICAgIHJldHVybiBOb25lCiAgICAgbmFtZSA9IG1hdGNoLmdyb3VwKDEpCiAgICAgIyBDaGVjayB3aGV0aGVyIHRoZSBlbmNvZGluZyBpcyBrbm93bgpAQCAtMTk2LDI5ICsxOTgsMzMgQEAKICAgICAgICAgICAgICAgICBzZWxmLmZpbGVuYW1lX2NoYW5nZV9ob29rKCkKIAogICAgIGRlZiBvcGVuKHNlbGYsIGV2ZW50PU5vbmUsIGVkaXRGaWxlPU5vbmUpOgotICAgICAgICBpZiBzZWxmLmVkaXR3aW4uZmxpc3Q6CisgICAgICAgIGZsaXN0ID0gc2VsZi5lZGl0d2luLmZsaXN0CisgICAgICAgICMgU2F2ZSBpbiBjYXNlIHBhcmVudCB3aW5kb3cgaXMgY2xvc2VkIChpZSwgZHVyaW5nIGFza29wZW5maWxlKCkpLgorICAgICAgICBpZiBmbGlzdDoKICAgICAgICAgICAgIGlmIG5vdCBlZGl0RmlsZToKICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IHNlbGYuYXNrb3BlbmZpbGUoKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBmaWxlbmFtZT1lZGl0RmlsZQogICAgICAgICAgICAgaWYgZmlsZW5hbWU6Ci0gICAgICAgICAgICAgICAgIyBJZiB0aGUgY3VycmVudCB3aW5kb3cgaGFzIG5vIGZpbGVuYW1lIGFuZCBoYXNuJ3QgYmVlbgotICAgICAgICAgICAgICAgICMgbW9kaWZpZWQsIHdlIHJlcGxhY2UgaXRzIGNvbnRlbnRzIChubyBsb3NzKS4gIE90aGVyd2lzZQotICAgICAgICAgICAgICAgICMgd2Ugb3BlbiBhIG5ldyB3aW5kb3cuICBCdXQgd2Ugd29uJ3QgcmVwbGFjZSB0aGUKLSAgICAgICAgICAgICAgICAjIHNoZWxsIHdpbmRvdyAod2hpY2ggaGFzIGFuIGludGVycChyZXRlcikgYXR0cmlidXRlKSwgd2hpY2gKLSAgICAgICAgICAgICAgICAjIGdldHMgc2V0IHRvICJub3QgbW9kaWZpZWQiIGF0IGV2ZXJ5IG5ldyBwcm9tcHQuCi0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBpbnRlcnAgPSBzZWxmLmVkaXR3aW4uaW50ZXJwCi0gICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICAgICAgICAgICAgICAgICBpbnRlcnAgPSBOb25lCi0gICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuZmlsZW5hbWUgYW5kIHNlbGYuZ2V0X3NhdmVkKCkgYW5kIG5vdCBpbnRlcnA6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdHdpbi5mbGlzdC5vcGVuKGZpbGVuYW1lLCBzZWxmLmxvYWRmaWxlKQorICAgICAgICAgICAgICAgICMgSWYgZWRpdEZpbGUgaXMgdmFsaWQgYW5kIGFscmVhZHkgb3BlbiwgZmxpc3Qub3BlbiB3aWxsCisgICAgICAgICAgICAgICAgIyBzaGlmdCBmb2N1cyB0byBpdHMgZXhpc3Rpbmcgd2luZG93LgorICAgICAgICAgICAgICAgICMgSWYgdGhlIGN1cnJlbnQgd2luZG93IGV4aXN0cyBhbmQgaXMgYSBmcmVzaCB1bm5hbWVkLAorICAgICAgICAgICAgICAgICMgdW5tb2RpZmllZCBlZGl0b3Igd2luZG93IChub3QgYW4gaW50ZXJwcmV0ZXIgc2hlbGwpLAorICAgICAgICAgICAgICAgICMgcGFzcyBzZWxmLmxvYWRmaWxlIHRvIGZsaXN0Lm9wZW4gc28gaXQgd2lsbCBsb2FkIHRoZSBmaWxlCisgICAgICAgICAgICAgICAgIyBpbiB0aGUgY3VycmVudCB3aW5kb3cgKGlmIHRoZSBmaWxlIGlzIG5vdCBhbHJlYWR5IG9wZW4pCisgICAgICAgICAgICAgICAgIyBpbnN0ZWFkIG9mIGEgbmV3IHdpbmRvdy4KKyAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0d2luIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgbm90IGdldGF0dHIoc2VsZi5lZGl0d2luLCAnaW50ZXJwJywgTm9uZSkgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICBub3Qgc2VsZi5maWxlbmFtZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3NhdmVkKCkpOgorICAgICAgICAgICAgICAgICAgICBmbGlzdC5vcGVuKGZpbGVuYW1lLCBzZWxmLmxvYWRmaWxlKQogICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdHdpbi5mbGlzdC5vcGVuKGZpbGVuYW1lKQorICAgICAgICAgICAgICAgICAgICBmbGlzdC5vcGVuKGZpbGVuYW1lKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLnRleHQuZm9jdXNfc2V0KCkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnRleHQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudGV4dC5mb2N1c19zZXQoKQogICAgICAgICAgICAgcmV0dXJuICJicmVhayIKLSAgICAgICAgIworCiAgICAgICAgICMgQ29kZSBmb3IgdXNlIG91dHNpZGUgSURMRToKICAgICAgICAgaWYgc2VsZi5nZXRfc2F2ZWQoKToKICAgICAgICAgICAgIHJlcGx5ID0gc2VsZi5tYXliZXNhdmUoKQpAQCAtMjQzLDEwICsyNDksOSBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICAjIG9wZW4gdGhlIGZpbGUgaW4gYmluYXJ5IG1vZGUgc28gdGhhdCB3ZSBjYW4gaGFuZGxlCiAgICAgICAgICAgICAjICAgZW5kLW9mLWxpbmUgY29udmVudGlvbiBvdXJzZWx2ZXMuCi0gICAgICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwncmInKQotICAgICAgICAgICAgY2hhcnMgPSBmLnJlYWQoKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBtc2c6CisgICAgICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICdyYicpIGFzIGY6CisgICAgICAgICAgICAgICAgY2hhcnMgPSBmLnJlYWQoKQorICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBtc2c6CiAgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKCJJL08gRXJyb3IiLCBzdHIobXNnKSwgbWFzdGVyPXNlbGYudGV4dCkKICAgICAgICAgICAgIHJldHVybiBGYWxzZQogCkBAIC0yODksNyArMjk0LDcgQEAKICAgICAgICAgIyBOZXh0IGxvb2sgZm9yIGNvZGluZyBzcGVjaWZpY2F0aW9uCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGVuYyA9IGNvZGluZ19zcGVjKGNoYXJzKQotICAgICAgICBleGNlcHQgTG9va3VwRXJyb3IsIG5hbWU6CisgICAgICAgIGV4Y2VwdCBMb29rdXBFcnJvciBhcyBuYW1lOgogICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcigKICAgICAgICAgICAgICAgICB0aXRsZT0iRXJyb3IgbG9hZGluZyB0aGUgZmlsZSIsCiAgICAgICAgICAgICAgICAgbWVzc2FnZT0iVGhlIGVuY29kaW5nICclcycgaXMgbm90IGtub3duIHRvIHRoaXMgUHl0aG9uICJcCkBAIC0zNzgsMTIgKzM4MywxMCBAQAogICAgICAgICBpZiBzZWxmLmVvbF9jb252ZW50aW9uICE9ICJcbiI6CiAgICAgICAgICAgICBjaGFycyA9IGNoYXJzLnJlcGxhY2UoIlxuIiwgc2VsZi5lb2xfY29udmVudGlvbikKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICJ3YiIpCi0gICAgICAgICAgICBmLndyaXRlKGNoYXJzKQotICAgICAgICAgICAgZi5mbHVzaCgpCi0gICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgIndiIikgYXMgZjoKKyAgICAgICAgICAgICAgICBmLndyaXRlKGNoYXJzKQogICAgICAgICAgICAgcmV0dXJuIFRydWUKLSAgICAgICAgZXhjZXB0IElPRXJyb3IsIG1zZzoKKyAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgbXNnOgogICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcigiSS9PIEVycm9yIiwgc3RyKG1zZyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc3Rlcj1zZWxmLnRleHQpCiAgICAgICAgICAgICByZXR1cm4gRmFsc2UKQEAgLTQwMyw3ICs0MDYsNyBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBlbmMgPSBjb2Rpbmdfc3BlYyhjaGFycykKICAgICAgICAgICAgIGZhaWxlZCA9IE5vbmUKLSAgICAgICAgZXhjZXB0IExvb2t1cEVycm9yLCBtc2c6CisgICAgICAgIGV4Y2VwdCBMb29rdXBFcnJvciBhcyBtc2c6CiAgICAgICAgICAgICBmYWlsZWQgPSBtc2cKICAgICAgICAgICAgIGVuYyA9IE5vbmUKICAgICAgICAgaWYgZW5jOgpAQCAtNDk5LDcgKzUwMiw3IEBACiAgICAgICAgIGVsc2U6ICNubyBwcmludGluZyBmb3IgdGhpcyBwbGF0Zm9ybQogICAgICAgICAgICAgcHJpbnRQbGF0Zm9ybSA9IEZhbHNlCiAgICAgICAgIGlmIHByaW50UGxhdGZvcm06ICAjd2UgY2FuIHRyeSB0byBwcmludCBmb3IgdGhpcyBwbGF0Zm9ybQotICAgICAgICAgICAgY29tbWFuZCA9IGNvbW1hbmQgJSBmaWxlbmFtZQorICAgICAgICAgICAgY29tbWFuZCA9IGNvbW1hbmQgJSBwaXBlcy5xdW90ZShmaWxlbmFtZSkKICAgICAgICAgICAgIHBpcGUgPSBvcy5wb3Blbihjb21tYW5kLCAiciIpCiAgICAgICAgICAgICAjIHRoaW5ncyBjYW4gZ2V0IHVnbHkgb24gTlQgaWYgdGhlcmUgaXMgbm8gcHJpbnRlciBhdmFpbGFibGUuCiAgICAgICAgICAgICBvdXRwdXQgPSBwaXBlLnJlYWQoKS5zdHJpcCgpCkBAIC01NjIsMTYgKzU2NSwxNyBAQAogICAgICAgICAiVXBkYXRlIHJlY2VudCBmaWxlIGxpc3Qgb24gYWxsIGVkaXRvciB3aW5kb3dzIgogICAgICAgICBzZWxmLmVkaXR3aW4udXBkYXRlX3JlY2VudF9maWxlc19saXN0KGZpbGVuYW1lKQogCi1kZWYgdGVzdCgpOgorZGVmIF9pb19iaW5kaW5nKHBhcmVudCk6CiAgICAgcm9vdCA9IFRrKCkKKyAgICByb290LnRpdGxlKCJUZXN0IElPQmluZGluZyIpCisgICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQorICAgIHJvb3QuZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNTApKQogICAgIGNsYXNzIE15RWRpdFdpbjoKICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRleHQpOgogICAgICAgICAgICAgc2VsZi50ZXh0ID0gdGV4dAogICAgICAgICAgICAgc2VsZi5mbGlzdCA9IE5vbmUKICAgICAgICAgICAgIHNlbGYudGV4dC5iaW5kKCI8Q29udHJvbC1vPiIsIHNlbGYub3BlbikKICAgICAgICAgICAgIHNlbGYudGV4dC5iaW5kKCI8Q29udHJvbC1zPiIsIHNlbGYuc2F2ZSkKLSAgICAgICAgICAgIHNlbGYudGV4dC5iaW5kKCI8QWx0LXM+Iiwgc2VsZi5zYXZlX2FzKQotICAgICAgICAgICAgc2VsZi50ZXh0LmJpbmQoIjxBbHQtej4iLCBzZWxmLnNhdmVfYV9jb3B5KQogICAgICAgICBkZWYgZ2V0X3NhdmVkKHNlbGYpOiByZXR1cm4gMAogICAgICAgICBkZWYgc2V0X3NhdmVkKHNlbGYsIGZsYWcpOiBwYXNzCiAgICAgICAgIGRlZiByZXNldF91bmRvKHNlbGYpOiBwYXNzCkBAIC01NzksMTYgKzU4MywxMyBAQAogICAgICAgICAgICAgc2VsZi50ZXh0LmV2ZW50X2dlbmVyYXRlKCI8PG9wZW4td2luZG93LWZyb20tZmlsZT4+IikKICAgICAgICAgZGVmIHNhdmUoc2VsZiwgZXZlbnQpOgogICAgICAgICAgICAgc2VsZi50ZXh0LmV2ZW50X2dlbmVyYXRlKCI8PHNhdmUtd2luZG93Pj4iKQotICAgICAgICBkZWYgc2F2ZV9hcyhzZWxmLCBldmVudCk6Ci0gICAgICAgICAgICBzZWxmLnRleHQuZXZlbnRfZ2VuZXJhdGUoIjw8c2F2ZS13aW5kb3ctYXMtZmlsZT4+IikKLSAgICAgICAgZGVmIHNhdmVfYV9jb3B5KHNlbGYsIGV2ZW50KToKLSAgICAgICAgICAgIHNlbGYudGV4dC5ldmVudF9nZW5lcmF0ZSgiPDxzYXZlLWNvcHktb2Ytd2luZG93LWFzLWZpbGU+PiIpCisKICAgICB0ZXh0ID0gVGV4dChyb290KQogICAgIHRleHQucGFjaygpCiAgICAgdGV4dC5mb2N1c19zZXQoKQogICAgIGVkaXR3aW4gPSBNeUVkaXRXaW4odGV4dCkKICAgICBpbyA9IElPQmluZGluZyhlZGl0d2luKQotICAgIHJvb3QubWFpbmxvb3AoKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIHRlc3QoKQorICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgorICAgIHJ1bihfaW9fYmluZGluZykKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0ljb25zL2lkbGUuaWNvIGIvTGliL2lkbGVsaWIvSWNvbnMvaWRsZS5pY28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM1N2FlZgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL0ljb25zL2lkbGUuaWNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0ljb25zL2lkbGVfMTYuZ2lmIGIvTGliL2lkbGVsaWIvSWNvbnMvaWRsZV8xNi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwMDFiMQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL0ljb25zL2lkbGVfMTYuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0ljb25zL2lkbGVfMTYucG5nIGIvTGliL2lkbGVsaWIvSWNvbnMvaWRsZV8xNi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFiZGUwYQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL0ljb25zL2lkbGVfMTYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0ljb25zL2lkbGVfMzIuZ2lmIGIvTGliL2lkbGVsaWIvSWNvbnMvaWRsZV8zMi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY1YjJkNQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL0ljb25zL2lkbGVfMzIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0ljb25zL2lkbGVfMzIucG5nIGIvTGliL2lkbGVsaWIvSWNvbnMvaWRsZV8zMi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFiNzBkYgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL0ljb25zL2lkbGVfMzIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0ljb25zL2lkbGVfNDguZ2lmIGIvTGliL2lkbGVsaWIvSWNvbnMvaWRsZV80OC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1MzA0ZgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL0ljb25zL2lkbGVfNDguZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0ljb25zL2lkbGVfNDgucG5nIGIvTGliL2lkbGVsaWIvSWNvbnMvaWRsZV80OC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVmYTkyOAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL0ljb25zL2lkbGVfNDgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0ljb25zL3B5dGhvbi5naWYgYi9MaWIvaWRsZWxpYi9JY29ucy9weXRob24uZ2lmCmluZGV4IDU4MjcxZWQuLmIxODljMmMgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0ljb25zL3B5dGhvbi5naWYKKysrIGIvTGliL2lkbGVsaWIvSWNvbnMvcHl0aG9uLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9JZGxlSGlzdG9yeS5weSBiL0xpYi9pZGxlbGliL0lkbGVIaXN0b3J5LnB5CmluZGV4IDk4M2ExNDAuLjA3OGFmMjkgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0lkbGVIaXN0b3J5LnB5CisrKyBiL0xpYi9pZGxlbGliL0lkbGVIaXN0b3J5LnB5CkBAIC0xLDgxICsxLDkzIEBACisiSW1wbGVtZW50IElkbGUgU2hlbGwgaGlzdG9yeSBtZWNoYW5pc20gd2l0aCBIaXN0b3J5IGNsYXNzIgorCiBmcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKIAogY2xhc3MgSGlzdG9yeToKKyAgICAnJycgSW1wbGVtZW50IElkbGUgU2hlbGwgaGlzdG9yeSBtZWNoYW5pc20uCiAKLSAgICBkZWYgX19pbml0X18oc2VsZiwgdGV4dCwgb3V0cHV0X3NlcCA9ICJcbiIpOgorICAgIHN0b3JlIC0gU3RvcmUgc291cmNlIHN0YXRlbWVudCAoY2FsbGVkIGZyb20gUHlTaGVsbC5yZXNldG91dHB1dCkuCisgICAgZmV0Y2ggLSBGZXRjaCBzdG9yZWQgc3RhdGVtZW50IG1hdGNoaW5nIHByZWZpeCBhbHJlYWR5IGVudGVyZWQuCisgICAgaGlzdG9yeV9uZXh0IC0gQm91bmQgdG8gPDxoaXN0b3J5LW5leHQ+PiBldmVudCAoZGVmYXVsdCBBbHQtTikuCisgICAgaGlzdG9yeV9wcmV2IC0gQm91bmQgdG8gPDxoaXN0b3J5LXByZXY+PiBldmVudCAoZGVmYXVsdCBBbHQtUCkuCisgICAgJycnCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRleHQpOgorICAgICAgICAnJydJbml0aWFsaXplIGRhdGEgYXR0cmlidXRlcyBhbmQgYmluZCBldmVudCBtZXRob2RzLgorCisgICAgICAgIC50ZXh0IC0gSWRsZSB3cmFwcGVyIG9mIHRrIFRleHQgd2lkZ2V0LCB3aXRoIC5iZWxsKCkuCisgICAgICAgIC5oaXN0b3J5IC0gc291cmNlIHN0YXRlbWVudHMsIHBvc3NpYmx5IHdpdGggbXVsdGlwbGUgbGluZXMuCisgICAgICAgIC5wcmVmaXggLSBzb3VyY2UgYWxyZWFkeSBlbnRlcmVkIGF0IHByb21wdDsgZmlsdGVycyBoaXN0b3J5IGxpc3QuCisgICAgICAgIC5wb2ludGVyIC0gaW5kZXggaW50byBoaXN0b3J5LgorICAgICAgICAuY3ljbGljIC0gd3JhcCBhcm91bmQgaGlzdG9yeSBsaXN0IChvciBub3QpLgorICAgICAgICAnJycKICAgICAgICAgc2VsZi50ZXh0ID0gdGV4dAogICAgICAgICBzZWxmLmhpc3RvcnkgPSBbXQotICAgICAgICBzZWxmLmhpc3RvcnlfcHJlZml4ID0gTm9uZQotICAgICAgICBzZWxmLmhpc3RvcnlfcG9pbnRlciA9IE5vbmUKLSAgICAgICAgc2VsZi5vdXRwdXRfc2VwID0gb3V0cHV0X3NlcAorICAgICAgICBzZWxmLnByZWZpeCA9IE5vbmUKKyAgICAgICAgc2VsZi5wb2ludGVyID0gTm9uZQogICAgICAgICBzZWxmLmN5Y2xpYyA9IGlkbGVDb25mLkdldE9wdGlvbigibWFpbiIsICJIaXN0b3J5IiwgImN5Y2xpYyIsIDEsICJib29sIikKICAgICAgICAgdGV4dC5iaW5kKCI8PGhpc3RvcnktcHJldmlvdXM+PiIsIHNlbGYuaGlzdG9yeV9wcmV2KQogICAgICAgICB0ZXh0LmJpbmQoIjw8aGlzdG9yeS1uZXh0Pj4iLCBzZWxmLmhpc3RvcnlfbmV4dCkKIAogICAgIGRlZiBoaXN0b3J5X25leHQoc2VsZiwgZXZlbnQpOgotICAgICAgICBzZWxmLmhpc3RvcnlfZG8oMCkKKyAgICAgICAgIkZldGNoIGxhdGVyIHN0YXRlbWVudDsgc3RhcnQgd2l0aCBlYWxpZXN0IGlmIGN5Y2xpYy4iCisgICAgICAgIHNlbGYuZmV0Y2gocmV2ZXJzZT1GYWxzZSkKICAgICAgICAgcmV0dXJuICJicmVhayIKIAogICAgIGRlZiBoaXN0b3J5X3ByZXYoc2VsZiwgZXZlbnQpOgotICAgICAgICBzZWxmLmhpc3RvcnlfZG8oMSkKKyAgICAgICAgIkZldGNoIGVhcmxpZXIgc3RhdGVtZW50OyBzdGFydCB3aXRoIG1vc3QgcmVjZW50LiIKKyAgICAgICAgc2VsZi5mZXRjaChyZXZlcnNlPVRydWUpCiAgICAgICAgIHJldHVybiAiYnJlYWsiCiAKLSAgICBkZWYgX2dldF9zb3VyY2Uoc2VsZiwgc3RhcnQsIGVuZCk6Ci0gICAgICAgICMgR2V0IHNvdXJjZSBjb2RlIGZyb20gc3RhcnQgaW5kZXggdG8gZW5kIGluZGV4LiAgTGluZXMgaW4gdGhlCi0gICAgICAgICMgdGV4dCBjb250cm9sIG1heSBiZSBzZXBhcmF0ZWQgYnkgc3lzLnBzMiAuCi0gICAgICAgIGxpbmVzID0gc2VsZi50ZXh0LmdldChzdGFydCwgZW5kKS5zcGxpdChzZWxmLm91dHB1dF9zZXApCi0gICAgICAgIHJldHVybiAiXG4iLmpvaW4obGluZXMpCisgICAgZGVmIGZldGNoKHNlbGYsIHJldmVyc2UpOgorICAgICAgICAnJydGZXRjaCBzdGF0ZW1lbXQgYW5kIHJlcGxhY2UgY3VycmVudCBsaW5lIGluIHRleHQgd2lkZ2V0LgogCi0gICAgZGVmIF9wdXRfc291cmNlKHNlbGYsIHdoZXJlLCBzb3VyY2UpOgotICAgICAgICBvdXRwdXQgPSBzZWxmLm91dHB1dF9zZXAuam9pbihzb3VyY2Uuc3BsaXQoIlxuIikpCi0gICAgICAgIHNlbGYudGV4dC5pbnNlcnQod2hlcmUsIG91dHB1dCkKLQotICAgIGRlZiBoaXN0b3J5X2RvKHNlbGYsIHJldmVyc2UpOgorICAgICAgICBTZXQgcHJlZml4IGFuZCBwb2ludGVyIGFzIG5lZWRlZCBmb3Igc3VjY2Vzc2l2ZSBmZXRjaGVzLgorICAgICAgICBSZXNldCB0aGVtIHRvIE5vbmUsIE5vbmUgd2hlbiByZXR1cm5pbmcgdG8gdGhlIHN0YXJ0IGxpbmUuCisgICAgICAgIFNvdW5kIGJlbGwgd2hlbiByZXR1cm4gdG8gc3RhcnQgbGluZSBvciBjYW5ub3QgbGVhdmUgYSBsaW5lCisgICAgICAgIGJlY2F1c2UgY3ljbGljIGlzIEZhbHNlLgorICAgICAgICAnJycKICAgICAgICAgbmhpc3QgPSBsZW4oc2VsZi5oaXN0b3J5KQotICAgICAgICBwb2ludGVyID0gc2VsZi5oaXN0b3J5X3BvaW50ZXIKLSAgICAgICAgcHJlZml4ID0gc2VsZi5oaXN0b3J5X3ByZWZpeAorICAgICAgICBwb2ludGVyID0gc2VsZi5wb2ludGVyCisgICAgICAgIHByZWZpeCA9IHNlbGYucHJlZml4CiAgICAgICAgIGlmIHBvaW50ZXIgaXMgbm90IE5vbmUgYW5kIHByZWZpeCBpcyBub3QgTm9uZToKICAgICAgICAgICAgIGlmIHNlbGYudGV4dC5jb21wYXJlKCJpbnNlcnQiLCAiIT0iLCAiZW5kLTFjIikgb3IgXAotICAgICAgICAgICAgICAgc2VsZi5fZ2V0X3NvdXJjZSgiaW9tYXJrIiwgImVuZC0xYyIpICE9IHNlbGYuaGlzdG9yeVtwb2ludGVyXToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50ZXh0LmdldCgiaW9tYXJrIiwgImVuZC0xYyIpICE9IHNlbGYuaGlzdG9yeVtwb2ludGVyXToKICAgICAgICAgICAgICAgICBwb2ludGVyID0gcHJlZml4ID0gTm9uZQorICAgICAgICAgICAgICAgIHNlbGYudGV4dC5tYXJrX3NldCgiaW5zZXJ0IiwgImVuZC0xYyIpICAjICE9IGFmdGVyIGN1cnNvciBtb3ZlCiAgICAgICAgIGlmIHBvaW50ZXIgaXMgTm9uZSBvciBwcmVmaXggaXMgTm9uZToKLSAgICAgICAgICAgIHByZWZpeCA9IHNlbGYuX2dldF9zb3VyY2UoImlvbWFyayIsICJlbmQtMWMiKQorICAgICAgICAgICAgcHJlZml4ID0gc2VsZi50ZXh0LmdldCgiaW9tYXJrIiwgImVuZC0xYyIpCiAgICAgICAgICAgICBpZiByZXZlcnNlOgotICAgICAgICAgICAgICAgIHBvaW50ZXIgPSBuaGlzdAorICAgICAgICAgICAgICAgIHBvaW50ZXIgPSBuaGlzdCAgIyB3aWxsIGJlIGRlY3JlbWVudGVkCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIGlmIHNlbGYuY3ljbGljOgotICAgICAgICAgICAgICAgICAgICBwb2ludGVyID0gLTEKLSAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwb2ludGVyID0gLTEgICMgd2lsbCBiZSBpbmNyZW1lbnRlZAorICAgICAgICAgICAgICAgIGVsc2U6ICAjIGFib3J0IGhpc3RvcnlfbmV4dAogICAgICAgICAgICAgICAgICAgICBzZWxmLnRleHQuYmVsbCgpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICBucHJlZml4ID0gbGVuKHByZWZpeCkKICAgICAgICAgd2hpbGUgMToKLSAgICAgICAgICAgIGlmIHJldmVyc2U6Ci0gICAgICAgICAgICAgICAgcG9pbnRlciA9IHBvaW50ZXIgLSAxCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHBvaW50ZXIgPSBwb2ludGVyICsgMQorICAgICAgICAgICAgcG9pbnRlciArPSAtMSBpZiByZXZlcnNlIGVsc2UgMQogICAgICAgICAgICAgaWYgcG9pbnRlciA8IDAgb3IgcG9pbnRlciA+PSBuaGlzdDoKICAgICAgICAgICAgICAgICBzZWxmLnRleHQuYmVsbCgpCi0gICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuY3ljbGljIGFuZCBwb2ludGVyIDwgMDoKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5jeWNsaWMgYW5kIHBvaW50ZXIgPCAwOiAgIyBhYm9ydCBoaXN0b3J5X3ByZXYKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fZ2V0X3NvdXJjZSgiaW9tYXJrIiwgImVuZC0xYyIpICE9IHByZWZpeDoKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi50ZXh0LmdldCgiaW9tYXJrIiwgImVuZC0xYyIpICE9IHByZWZpeDoKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGV4dC5kZWxldGUoImlvbWFyayIsICJlbmQtMWMiKQotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcHV0X3NvdXJjZSgiaW9tYXJrIiwgcHJlZml4KQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50ZXh0Lmluc2VydCgiaW9tYXJrIiwgcHJlZml4KQogICAgICAgICAgICAgICAgICAgICBwb2ludGVyID0gcHJlZml4ID0gTm9uZQogICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICBpdGVtID0gc2VsZi5oaXN0b3J5W3BvaW50ZXJdCiAgICAgICAgICAgICBpZiBpdGVtWzpucHJlZml4XSA9PSBwcmVmaXggYW5kIGxlbihpdGVtKSA+IG5wcmVmaXg6CiAgICAgICAgICAgICAgICAgc2VsZi50ZXh0LmRlbGV0ZSgiaW9tYXJrIiwgImVuZC0xYyIpCi0gICAgICAgICAgICAgICAgc2VsZi5fcHV0X3NvdXJjZSgiaW9tYXJrIiwgaXRlbSkKKyAgICAgICAgICAgICAgICBzZWxmLnRleHQuaW5zZXJ0KCJpb21hcmsiLCBpdGVtKQogICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIHNlbGYudGV4dC5tYXJrX3NldCgiaW5zZXJ0IiwgImVuZC0xYyIpCiAgICAgICAgIHNlbGYudGV4dC5zZWUoImluc2VydCIpCiAgICAgICAgIHNlbGYudGV4dC50YWdfcmVtb3ZlKCJzZWwiLCAiMS4wIiwgImVuZCIpCi0gICAgICAgIHNlbGYuaGlzdG9yeV9wb2ludGVyID0gcG9pbnRlcgotICAgICAgICBzZWxmLmhpc3RvcnlfcHJlZml4ID0gcHJlZml4CisgICAgICAgIHNlbGYucG9pbnRlciA9IHBvaW50ZXIKKyAgICAgICAgc2VsZi5wcmVmaXggPSBwcmVmaXgKIAotICAgIGRlZiBoaXN0b3J5X3N0b3JlKHNlbGYsIHNvdXJjZSk6CisgICAgZGVmIHN0b3JlKHNlbGYsIHNvdXJjZSk6CisgICAgICAgICJTdG9yZSBTaGVsbCBpbnB1dCBzdGF0ZW1lbnQgaW50byBoaXN0b3J5IGxpc3QuIgogICAgICAgICBzb3VyY2UgPSBzb3VyY2Uuc3RyaXAoKQogICAgICAgICBpZiBsZW4oc291cmNlKSA+IDI6CiAgICAgICAgICAgICAjIGF2b2lkIGR1cGxpY2F0ZXMKQEAgLTg0LDUgKzk2LDkgQEAKICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgIHNlbGYuaGlzdG9yeS5hcHBlbmQoc291cmNlKQotICAgICAgICBzZWxmLmhpc3RvcnlfcG9pbnRlciA9IE5vbmUKLSAgICAgICAgc2VsZi5oaXN0b3J5X3ByZWZpeCA9IE5vbmUKKyAgICAgICAgc2VsZi5wb2ludGVyID0gTm9uZQorICAgICAgICBzZWxmLnByZWZpeCA9IE5vbmUKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBmcm9tIHVuaXR0ZXN0IGltcG9ydCBtYWluCisgICAgbWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF9pZGxlaGlzdG9yeScsIHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvTXVsdGlDYWxsLnB5IGIvTGliL2lkbGVsaWIvTXVsdGlDYWxsLnB5CmluZGV4IGI4MWM1ZWQuLjMxYTRmYjcgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL011bHRpQ2FsbC5weQorKysgYi9MaWIvaWRsZWxpYi9NdWx0aUNhbGwucHkKQEAgLTMzLDcgKzMzLDYgQEAKIGltcG9ydCBzdHJpbmcKIGltcG9ydCByZQogaW1wb3J0IFRraW50ZXIKLWZyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4U3VwcG9ydAogCiAjIHRoZSBldmVudCB0eXBlIGNvbnN0YW50cywgd2hpY2ggZGVmaW5lIHRoZSBtZWFuaW5nIG9mIG1jX3R5cGUKIE1DX0tFWVBSRVNTPTA7IE1DX0tFWVJFTEVBU0U9MTsgTUNfQlVUVE9OUFJFU1M9MjsgTUNfQlVUVE9OUkVMRUFTRT0zOwpAQCAtNDYsNyArNDUsNyBAQAogTUNfT1BUSU9OID0gMTw8NjsgTUNfQ09NTUFORCA9IDE8PDcKIAogIyBkZWZpbmUgdGhlIGxpc3Qgb2YgbW9kaWZpZXJzLCB0byBiZSB1c2VkIGluIGNvbXBsZXggZXZlbnQgdHlwZXMuCi1pZiBtYWNvc3hTdXBwb3J0LnJ1bm5pbmdBc09TWEFwcCgpOgoraWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgogICAgIF9tb2RpZmllcnMgPSAoKCJTaGlmdCIsKSwgKCJDb250cm9sIiwpLCAoIk9wdGlvbiIsKSwgKCJDb21tYW5kIiwpKQogICAgIF9tb2RpZmllcl9tYXNrcyA9IChNQ19TSElGVCwgTUNfQ09OVFJPTCwgTUNfT1BUSU9OLCBNQ19DT01NQU5EKQogZWxzZToKQEAgLTE3MSw4ICsxNzAsOSBAQAogICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgaXNoYW5kbGVycnVubmluZ1s6XSA9IFtdCiAgICAgICAgICAgICAjIENhbGwgYWxsIGZ1bmN0aW9ucyBpbiBkb2FmdGVyaGFuZGxlciBhbmQgcmVtb3ZlIHRoZW0gZnJvbSBsaXN0Ci0gICAgICAgICAgICB3aGlsZSBkb2FmdGVyaGFuZGxlcjoKLSAgICAgICAgICAgICAgICBkb2FmdGVyaGFuZGxlci5wb3AoKSgpCisgICAgICAgICAgICBmb3IgZiBpbiBkb2FmdGVyaGFuZGxlcjoKKyAgICAgICAgICAgICAgICBmKCkKKyAgICAgICAgICAgIGRvYWZ0ZXJoYW5kbGVyWzpdID0gW10KICAgICAgICAgICAgIGlmIHI6CiAgICAgICAgICAgICAgICAgcmV0dXJuIHIKICAgICAgICAgcmV0dXJuIGhhbmRsZXIKQEAgLTM5Nyw5ICszOTcsMTIgQEAKICAgICBfbXVsdGljYWxsX2RpY3Rbd2lkZ2V0XSA9IE11bHRpQ2FsbAogICAgIHJldHVybiBNdWx0aUNhbGwKIAotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICAjIFRlc3QKKworZGVmIF9tdWx0aV9jYWxsKHBhcmVudCk6CiAgICAgcm9vdCA9IFRraW50ZXIuVGsoKQorICAgIHJvb3QudGl0bGUoIlRlc3QgTXVsdGlDYWxsIikKKyAgICB3aWR0aCwgaGVpZ2h0LCB4LCB5ID0gbGlzdChtYXAoaW50LCByZS5zcGxpdCgnW3grXScsIHBhcmVudC5nZW9tZXRyeSgpKSkpCisgICAgcm9vdC5nZW9tZXRyeSgiKyVkKyVkIiUoeCwgeSArIDE1MCkpCiAgICAgdGV4dCA9IE11bHRpQ2FsbENyZWF0b3IoVGtpbnRlci5UZXh0KShyb290KQogICAgIHRleHQucGFjaygpCiAgICAgZGVmIGJpbmRzZXEoc2VxLCBuPVswXSk6CkBAIC00MTUsOCArNDE4LDEzIEBACiAgICAgYmluZHNlcSgiPEFsdC1Db250cm9sLUtleS1hPiIpCiAgICAgYmluZHNlcSgiPEtleS1iPiIpCiAgICAgYmluZHNlcSgiPENvbnRyb2wtQnV0dG9uLTE+IikKKyAgICBiaW5kc2VxKCI8QnV0dG9uLTI+IikKICAgICBiaW5kc2VxKCI8QWx0LUJ1dHRvbi0xPiIpCiAgICAgYmluZHNlcSgiPEZvY3VzT3V0PiIpCiAgICAgYmluZHNlcSgiPEVudGVyPiIpCiAgICAgYmluZHNlcSgiPExlYXZlPiIpCiAgICAgcm9vdC5tYWlubG9vcCgpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuCisgICAgcnVuKF9tdWx0aV9jYWxsKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvTXVsdGlTdGF0dXNCYXIucHkgYi9MaWIvaWRsZWxpYi9NdWx0aVN0YXR1c0Jhci5weQppbmRleCA4ZWUyZDAzLi5kZjEzNmI4IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9NdWx0aVN0YXR1c0Jhci5weQorKysgYi9MaWIvaWRsZWxpYi9NdWx0aVN0YXR1c0Jhci5weQpAQCAtMTcsMTYgKzE3LDI5IEBACiAgICAgICAgICAgICBsYWJlbCA9IHNlbGYubGFiZWxzW25hbWVdCiAgICAgICAgIGxhYmVsLmNvbmZpZyh0ZXh0PXRleHQpCiAKLWRlZiBfdGVzdCgpOgotICAgIGIgPSBGcmFtZSgpCi0gICAgYyA9IFRleHQoYikKLSAgICBjLnBhY2soc2lkZT1UT1ApCi0gICAgYSA9IE11bHRpU3RhdHVzQmFyKGIpCi0gICAgYS5zZXRfbGFiZWwoIm9uZSIsICJoZWxsbyIpCi0gICAgYS5zZXRfbGFiZWwoInR3byIsICJ3b3JsZCIpCi0gICAgYS5wYWNrKHNpZGU9Qk9UVE9NLCBmaWxsPVgpCi0gICAgYi5wYWNrKCkKLSAgICBiLm1haW5sb29wKCkKK2RlZiBfbXVsdGlzdGF0dXNfYmFyKHBhcmVudCk6CisgICAgcm9vdCA9IFRrKCkKKyAgICB3aWR0aCwgaGVpZ2h0LCB4LCB5ID0gbGlzdChtYXAoaW50LCByZS5zcGxpdCgnW3grXScsIHBhcmVudC5nZW9tZXRyeSgpKSkpCisgICAgcm9vdC5nZW9tZXRyeSgiKyVkKyVkIiAlKHgsIHkgKyAxNTApKQorICAgIHJvb3QudGl0bGUoIlRlc3QgbXVsdGlzdGF0dXMgYmFyIikKKyAgICBmcmFtZSA9IEZyYW1lKHJvb3QpCisgICAgdGV4dCA9IFRleHQoZnJhbWUpCisgICAgdGV4dC5wYWNrKCkKKyAgICBtc2IgPSBNdWx0aVN0YXR1c0JhcihmcmFtZSkKKyAgICBtc2Iuc2V0X2xhYmVsKCJvbmUiLCAiaGVsbG8iKQorICAgIG1zYi5zZXRfbGFiZWwoInR3byIsICJ3b3JsZCIpCisgICAgbXNiLnBhY2soc2lkZT1CT1RUT00sIGZpbGw9WCkKKworICAgIGRlZiBjaGFuZ2UoKToKKyAgICAgICAgbXNiLnNldF9sYWJlbCgib25lIiwgImZvbyIpCisgICAgICAgIG1zYi5zZXRfbGFiZWwoInR3byIsICJiYXIiKQorCisgICAgYnV0dG9uID0gQnV0dG9uKHJvb3QsIHRleHQ9IlVwZGF0ZSBzdGF0dXMiLCBjb21tYW5kPWNoYW5nZSkKKyAgICBidXR0b24ucGFjayhzaWRlPUJPVFRPTSkKKyAgICBmcmFtZS5wYWNrKCkKKyAgICBmcmFtZS5tYWlubG9vcCgpCisgICAgcm9vdC5tYWlubG9vcCgpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgX3Rlc3QoKQorICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgorICAgIHJ1bihfbXVsdGlzdGF0dXNfYmFyKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvTkVXUy50eHQgYi9MaWIvaWRsZWxpYi9ORVdTLnR4dAppbmRleCA0NmVmM2NiLi44ZGE3OTJlIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9ORVdTLnR4dAorKysgYi9MaWIvaWRsZWxpYi9ORVdTLnR4dApAQCAtMSw0MSArMSwzNDEgQEAKLVdoYXQncyBOZXcgaW4gSURMRSAyLjcuMj8KLT09PT09PT09PT09PT09PT09PT09PT09CitXaGF0J3MgTmV3IGluIElETEUgMi43Ljk/Cis9PT09PT09PT09PT09PT09PT09PT09PT09CiAKLSpSZWxlYXNlIGRhdGU6IDI5LU1heS0yMDExKgorV2hhdCdzIE5ldyBpbiBJRExFIDIuNy44PworPT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAyMDE0LTA2LTI5KgorCistIElzc3VlICMyMTk0MDogQWRkIHVuaXR0ZXN0IGZvciBXaWRnZXRSZWRpcmVjdG9yLiBJbml0aWFsIHBhdGNoIGJ5IFNhaW1hZGhhdgorICBIZWJsaWthci4KKworLSBJc3N1ZSAjMTg1OTI6IEFkZCB1bml0dGVzdCBmb3IgU2VhcmNoRGlhbG9nQmFzZS4gUGF0Y2ggYnkgUGhpbCBXZWJzdGVyLgorCistIElzc3VlICMyMTY5NDogQWRkIHVuaXR0ZXN0IGZvciBQYXJlbk1hdGNoLiBQYXRjaCBieSBTYWltYWRoYXYgSGVibGlrYXIuCisKKy0gSXNzdWUgIzIxNjg2OiBhZGQgdW5pdHRlc3QgZm9yIEh5cGVyUGFyc2VyLiBPcmlnaW5hbCBwYXRjaCBieSBTYWltYWRoYXYKKyAgSGVibGlrYXIuCisKKy0gSXNzdWUgIzEyMzg3OiBBZGQgbWlzc2luZyB1cHBlcihsb3dlciljYXNlIHZlcnNpb25zIG9mIGRlZmF1bHQgV2luZG93cyBrZXkKKyAgYmluZGluZ3MgZm9yIElkbGUgc28gQ2FwcyBMb2NrIGRvZXMgbm90IGRpc2FibGUgdGhlbS4gUGF0Y2ggYnkgUm9nZXIgU2Vyd3kuCisKKy0gSXNzdWUgIzIxNjk1OiBDbG9zaW5nIGEgRmluZC1pbi1maWxlcyBvdXRwdXQgd2luZG93IHdoaWxlIHRoZSBzZWFyY2ggaXMKKyAgc3RpbGwgaW4gcHJvZ3Jlc3Mgbm8gbG9uZ2VyIGNsb3NlcyBJZGxlLgorCistIElzc3VlICMxODkxMDogQWRkIHVuaXR0ZXN0IGZvciB0ZXh0Vmlldy4gUGF0Y2ggYnkgUGhpbCBXZWJzdGVyLgorCistIElzc3VlICMxODI5MjogQWRkIHVuaXR0ZXN0IGZvciBBdXRvRXhwYW5kLiBQYXRjaCBieSBTYWloYWRoYXYgSGVibGlrYXIuCisKKy0gSXNzdWUgIzE4NDA5OiBBZGQgdW5pdHRlc3QgZm9yIEF1dG9Db21wbGV0ZS4gUGF0Y2ggYnkgUGhpbCBXZWJzdGVyLgorCisKK1doYXQncyBOZXcgaW4gSURMRSAyLjcuNz8KKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMjAxNC0wNS0zMSoKKworLSBJc3N1ZSAjMTgxMDQ6IEFkZCBpZGxlbGliL2lkbGVfdGVzdC9odGVzdC5weSB3aXRoIGEgZmV3IHNhbXBsZSB0ZXN0cyB0byBiZWdpbgorICBjb25zb2xpZGF0aW5nIGFuZCBpbXByb3ZpbmcgaHVtYW4tdmFsaWRhdGVkIHRlc3RzIG9mIElkbGUuIENoYW5nZSBvdGhlciBmaWxlcworICBhcyBuZWVkZWQgdG8gd29yayB3aXRoIGh0ZXN0LiAgUnVubmluZyB0aGUgbW9kdWxlIGFzIF9fbWFpbl9fIHJ1bnMgYWxsIHRlc3RzLgorCistIElzc3VlICMyMTEzOTogQ2hhbmdlIGRlZmF1bHQgcGFyYWdyYXBoIHdpZHRoIHRvIDcyLCB0aGUgUEVQIDggcmVjb21tZW5kYXRpb24uCisKKy0gSXNzdWUgIzIxMjg0OiBQYXJhZ3JhcGggcmVmb3JtYXQgdGVzdCBwYXNzZXMgYWZ0ZXIgdXNlciBjaGFuZ2VzIHJlZm9ybWF0IHdpZHRoLgorCistIElzc3VlICMyMDQwNjogVXNlIFB5dGhvbiBhcHBsaWNhdGlvbiBpY29ucyBmb3IgSWRsZSB3aW5kb3cgdGl0bGUgYmFycy4KKyAgUGF0Y2ggbW9zdGx5IGJ5IFNlcmhpeSBTdG9yY2hha2EuCisKKy0gSXNzdWUgIzIxMDI5OiBPY2N1cnJlbmNlcyBvZiAicHJpbnQiIGFyZSBub3cgY29uc2lzdGVudGx5IGNvbG9yZWQgYXMKKyAgYmVpbmcgYSBrZXl3b3JkICh0aGUgY29sb3JpemVyIGRvZXNuJ3Qga25vdyBpZiBwcmludCBmdW5jdGlvbnMgYXJlCisgIGVuYWJsZWQgaW4gdGhlIHNvdXJjZSkuCisKKy0gSXNzdWUgIzE3NzIxOiBSZW1vdmUgbm9uLWZ1bmN0aW9uYWwgY29uZmlndXJhdGlvbiBkaWFsb2cgaGVscCBidXR0b24gdW50aWwgd2UKKyAgbWFrZSBpdCBhY3R1YWxseSBnaXZlcyBzb21lIGhlbHAgd2hlbiBjbGlja2VkLiBQYXRjaCBieSBHdWlsaGVybWUgU2lt9WVzLgorCistIElzc3VlICMxNzM5MDogQWRkIFB5dGhvbiB2ZXJzaW9uIHRvIElkbGUgZWRpdG9yIHdpbmRvdyB0aXRsZSBiYXIuCisgIE9yaWdpbmFsIHBhdGNoZXMgYnkgRWRtb25kIEJ1cm5ldHQgYW5kIEtlbnQgSm9obnNvbi4KKworLSBJc3N1ZSAjMjAwNTg6IHN5cy5zdGRpbi5yZWFkbGluZSgpIGluIElETEUgbm93IGFsd2F5cyByZXR1cm5zIG9ubHkgb25lIGxpbmUuCisKKy0gSXNzdWUgIzE5NDgxOiBwcmludCgpIG9mIHVuaWNvZGUsIHN0ciBvciBieXRlYXJyYXkgc3ViY2xhc3MgaW5zdGFuY2UgaW4gSURMRQorICBubyBtb3JlIGhhbmdzLgorCistIElzc3VlICMxODI3MDogUHJldmVudCBwb3NzaWJsZSBJRExFIEF0dHJpYnV0ZUVycm9yIG9uIE9TIFggd2hlbiBubyBpbml0aWFsCisgIHNoZWxsIHdpbmRvdyBpcyBwcmVzZW50LgorCistIElzc3VlICMxNzY1NDogRW5zdXJlIElETEUgbWVudXMgYXJlIGN1c3RvbWl6ZWQgcHJvcGVybHkgb24gT1MgWCBmb3IKKyAgbm9uLWZyYW1ld29yayBidWlsZHMgYW5kIGZvciBhbGwgdmFyaWFudHMgb2YgVGsuCisKKworV2hhdCdzIE5ldyBpbiBJRExFIDIuNy42PworPT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAyMDEzLTExLTEwKgorCistIElzc3VlICMxOTQyNjogRml4ZWQgdGhlIG9wZW5pbmcgb2YgUHl0aG9uIHNvdXJjZSBmaWxlIHdpdGggc3BlY2lmaWVkIGVuY29kaW5nLgorCistIElzc3VlICMxODg3MzogSURMRSBub3cgZGV0ZWN0cyBQeXRob24gc291cmNlIGNvZGUgZW5jb2Rpbmcgb25seSBpbiBjb21tZW50CisgIGxpbmVzLgorCistIElzc3VlICMxODk4ODogVGhlICJUYWIiIGtleSBub3cgd29ya3Mgd2hlbiBhIHdvcmQgaXMgYWxyZWFkeSBhdXRvY29tcGxldGVkLgorCistIElzc3VlICMxODQ4OTogQWRkIHRlc3RzIGZvciBTZWFyY2hFbmdpbmUuIE9yaWdpbmFsIHBhdGNoIGJ5IFBoaWwgV2Vic3Rlci4KKworLSBJc3N1ZSAjMTg0Mjk6IEZvcm1hdCAvIEZvcm1hdCBQYXJhZ3JhcGgsIG5vdyB3b3JrcyB3aGVuIGNvbW1lbnQgYmxvY2tzCisgIGFyZSBzZWxlY3RlZC4gQXMgd2l0aCB0ZXh0IGJsb2NrcywgdGhpcyB3b3JrcyBiZXN0IHdoZW4gdGhlIHNlbGVjdGlvbgorICBvbmx5IGluY2x1ZGVzIGNvbXBsZXRlIGxpbmVzLgorCistIElzc3VlICMxODIyNjogQWRkIGRvY3N0cmluZ3MgYW5kIHVuaXR0ZXN0cyBmb3IgRm9ybWF0UGFyYWdyYXBoLnB5LgorICBPcmlnaW5hbCBwYXRjaGVzIGJ5IFRvZGQgUm92aXRvIGFuZCBQaGlsIFdlYnN0ZXIuCisKKy0gSXNzdWUgIzE4Mjc5OiBGb3JtYXQgLSBTdHJpcCB0cmFpbGluZyB3aGl0ZXNwYWNlIG5vIGxvbmdlciBtYXJrcyBhIGZpbGUgYXMKKyAgY2hhbmdlZCB3aGVuIGl0IGhhcyBub3QgYmVlbiBjaGFuZ2VkLiBUaGlzIGZpeCBmb2xsb3dlZCB0aGUgYWRkaXRpb24gb2YgYQorICB0ZXN0IGZpbGUgb3JpZ2luYWxseSB3cml0dGVuIGJ5IFBoaWwgV2Vic3RlciAodGhlIGlzc3VlJ3MgbWFpbiBnb2FsKS4KKworLSBJc3N1ZSAjMTg1Mzk6IENhbGx0aXBzIG5vdyB3b3JrIGZvciBmbG9hdCBkZWZhdWx0IGFyZ3VtZW50cy4KKworLSBJc3N1ZSAjNzEzNjogSW4gdGhlIElkbGUgRmlsZSBtZW51LCAiTmV3IFdpbmRvdyIgaXMgcmVuYW1lZCAiTmV3IEZpbGUiLgorICBQYXRjaCBieSBUYWwgRWluYXQsIFJvZ2V0IFNlcnd5LCBhbmQgVG9kZCBSb3ZpdG8uCisKKy0gSXNzdWUgIzg1MTU6IFNldCBfX2ZpbGVfXyB3aGVuIHJ1biBmaWxlIGluIElETEUuCisgIEluaXRpYWwgcGF0Y2ggYnkgQnJ1Y2UgRnJlZGVyaWtzZW4uCisKKy0gSXNzdWUgIzU0OTI6IEF2b2lkIHRyYWNlYmFjayB3aGVuIGV4aXRpbmcgSURMRSBjYXVzZWQgYnkgYSByYWNlIGNvbmRpdGlvbi4KKworLSBJc3N1ZSAjMTc1MTE6IEtlZXAgSURMRSBmaW5kIGRpYWxvZyBvcGVuIGFmdGVyIGNsaWNraW5nICJGaW5kIE5leHQiLgorICBPcmlnaW5hbCBwYXRjaCBieSBTYXJhaCBLLgorCistIElzc3VlICMxNTM5MjogQ3JlYXRlIGEgdW5pdHRlc3QgZnJhbWV3b3JrIGZvciBJRExFLgorICBQcmVsaW1pbmFyeSBwYXRjaCBieSBSYWphZ29wYWxhc2FybWEgSmF5YWtyaXNobmFuCisgIFNlZSBMaWIvaWRsZWxpYi9pZGxlX3Rlc3QvUkVBRE1FLnR4dCBmb3IgaG93IHRvIHJ1biBJZGxlIHRlc3RzLgorCistIElzc3VlICMxNDE0NjogSGlnaGxpZ2h0IHNvdXJjZSBsaW5lIHdoaWxlIGRlYnVnZ2luZyBvbiBXaW5kb3dzLgorCistIElzc3VlICMxNzUzMjogQWx3YXlzIGluY2x1ZGUgT3B0aW9ucyBtZW51IGZvciBJRExFIG9uIE9TIFguCisgIFBhdGNoIGJ5IEd1aWxoZXJtZSBTaW31ZXMuCisKKworV2hhdCdzIE5ldyBpbiBJRExFIDIuNy41PworPT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAyMDEzLTA1LTEyKgorCistIElzc3VlICMxNzgzODogQWxsb3cgc3lzLnN0ZGluIHRvIGJlIHJlYXNzaWduZWQuCisKKy0gSXNzdWUgIzE0NzM1OiBVcGRhdGUgSURMRSBkb2NzIHRvIG9taXQgIkNvbnRyb2wteiBvbiBXaW5kb3dzIi4KKworLSBJc3N1ZSAjMTc1ODU6IEZpeGVkIElETEUgcmVncmVzc2lvbi4gTm93IGNsb3NlcyB3aGVuIHVzaW5nIGV4aXQoKSBvciBxdWl0KCkuCisKKy0gSXNzdWUgIzE3NjU3OiBTaG93IGZ1bGwgVGsgdmVyc2lvbiBpbiBJRExFJ3MgYWJvdXQgZGlhbG9nLgorICBQYXRjaCBieSBUb2RkIFJvdml0by4KKworLSBJc3N1ZSAjMTc2MTM6IFByZXZlbnQgdHJhY2ViYWNrIHdoZW4gcmVtb3Zpbmcgc3ludGF4IGNvbG9yaXplciBpbiBJRExFLgorCistIElzc3VlICMxMjA3NTg5OiBCYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBwYXRjaCBmb3IgcmlnaHQtY2xpY2sgbWVudSBpbiBJRExFLgorCistIElzc3VlICMxNjg4NzogSURMRSBub3cgYWNjZXB0cyBDYW5jZWwgaW4gdGFiaWZ5L3VudGFiaWZ5IGRpYWxvZyBib3guCisKKy0gSXNzdWUgIzE0MjU0OiBJRExFIG5vdyBoYW5kbGVzIHJlYWRsaW5lIGNvcnJlY3RseSBhY3Jvc3Mgc2hlbGwgcmVzdGFydHMuCisKKy0gSXNzdWUgIzE3NjE0OiBJRExFIG5vIGxvbmdlciByYWlzZXMgZXhjZXB0aW9uIHdoZW4gcXVpY2tseSBjbG9zaW5nIGEgZmlsZS4KKworLSBJc3N1ZSAjNjY5ODogSURMRSBub3cgb3BlbnMganVzdCBhbiBlZGl0b3Igd2luZG93IHdoZW4gY29uZmlndXJlZCB0byBkbyBzby4KKworLSBJc3N1ZSAjODkwMDogVXNpbmcga2V5Ym9hcmQgc2hvcnRjdXRzIGluIElETEUgdG8gb3BlbiBhIGZpbGUgbm8gbG9uZ2VyCisgIHJhaXNlcyBhbiBleGNlcHRpb24uCisKKy0gSXNzdWUgIzY2NDk6IEZpeGVkIG1pc3NpbmcgZXhpdCBzdGF0dXMgaW4gSURMRS4gUGF0Y2ggYnkgR3VpbGhlcm1lIFBvbG8uCisKKy0gSXNzdWUgIzE3MzkwOiBEaXNwbGF5IFB5dGhvbiB2ZXJzaW9uIG9uIElkbGUgdGl0bGUgYmFyLgorICBJbml0aWFsIHBhdGNoIGJ5IEVkbW9uZCBCdXJuZXR0LgorCisKK1doYXQncyBOZXcgaW4gSURMRSAyLjcuND8KKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMjAxMy0wNC0wNioKKworLSBJc3N1ZSAjMTc2MjU6IEluIElETEUsIGNsb3NlIHRoZSByZXBsYWNlIGRpYWxvZyBhZnRlciBpdCBpcyB1c2VkLgorCistIElETEUgd2FzIGRpc3BsYXlpbmcgc3B1cmlvdXMgU3lzdGVtRXhpdCB0cmFjZWJhY2tzIHdoZW4gcnVubmluZyBzY3JpcHRzCisgIHRoYXQgdGVybWluYXRlZCBieSByYWlzaW5nIFN5c3RlbUV4aXQgKGkuZS4gdW5pdHRlc3QgYW5kIHR1cnRsZWRlbW8pLgorCistIElzc3VlICM5MjkwOiBJbiBJRExFIHRoZSBzeXMuc3RkKiBzdHJlYW1zIG5vdyBpbXBsZW1lbnQgaW8uVGV4dElPQmFzZQorICBpbnRlcmZhY2UgYW5kIHN1cHBvcnQgYWxsIG1hbmRhdG9yeSBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzLgorCistIElzc3VlICMxNjgyOTogSURMRSBwcmludGluZyBubyBsb25nZXIgZmFpbHMgaWYgdGhlcmUgYXJlIHNwYWNlcyBvciBvdGhlcgorICBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gdGhlIGZpbGUgcGF0aC4KKworLSBJc3N1ZSAjMTY4MTk6IElETEUgbWV0aG9kIGNvbXBsZXRpb24gbm93IGNvcnJlY3RseSB3b3JrcyBmb3IgdW5pY29kZSBsaXRlcmFscy4KKworLSBJc3N1ZSAjMTY1MDQ6IElETEUgbm93IGNhdGNoZXMgU3ludGF4RXJyb3JzIHJhaXNlZCBieSB0b2tlbml6ZXIuIFBhdGNoIGJ5CisgIFJvZ2VyIFNlcnd5LgorCistIElzc3VlICMxMjA3NTg5OiBBZGQgQ3V0L0NvcHkvUGFzdGUgaXRlbXMgdG8gSURMRSByaWdodCBjbGljayBDb250ZXh0IE1lbnUKKyAgUGF0Y2ggYnkgVG9kZCBSb3ZpdG8uCisKKy0gSXNzdWUgIzEzMDUyOiBGaXggSURMRSBjcmFzaGluZyB3aGVuIHJlcGxhY2Ugc3RyaW5nIGluIFNlYXJjaC9SZXBsYWNlIGRpYWxvZworICBlbmRlZCB3aXRoICdcJy4gUGF0Y2ggYnkgUm9nZXIgU2Vyd3kuCisKKy0gSXNzdWUgIzk4MDM6IERvbid0IGNsb3NlIElETEUgb24gc2F2aW5nIGlmIGJyZWFrcG9pbnQgaXMgb3Blbi4KKyAgUGF0Y2ggYnkgUm9nZXIgU2Vyd3kuCisKKy0gSXNzdWUgIzE0OTU4OiBDaGFuZ2UgSURMRSBzeXN0YXggaGlnaGxpZ2h0aW5nIHRvIHJlY29nbml6ZSBhbGwgc3RyaW5nIGFuZCBieXRlCisgIGxpdGVyYWxzIGN1cnJlbnRseSBzdXBwb3J0ZWQgaW4gUHl0aG9uIDIuNy4KKworLSBJc3N1ZSAjMTQ5NjI6IFVwZGF0ZSB0ZXh0IGNvbG9yaW5nIGluIElETEUgc2hlbGwgd2luZG93IGFmdGVyIGNoYW5naW5nCisgIG9wdGlvbnMuICBQYXRjaCBieSBSb2dlciBTZXJ3eS4KKworLSBJc3N1ZSAjMTA5OTc6IFByZXZlbnQgYSBkdXBsaWNhdGUgZW50cnkgaW4gSURMRSdzICJSZWNlbnQgRmlsZXMiIG1lbnUuCisKKy0gSXNzdWUgIzEyNTEwOiBBdHRlbXB0aW5nIHRvIGdldCBpbnZhbGlkIHRvb2x0aXAgbm8gbG9uZ2VyIGNsb3NlcyBJRExFLgorICBPcmlnaW5hbCBwYXRjaCBieSBSb2dlciBTZXJ3eS4KKworLSBJc3N1ZSAjMTAzNjU6IEZpbGUgb3BlbiBkaWFsb2cgbm93IHdvcmtzIGluc3RlYWQgb2YgY3Jhc2hpbmcKKyAgZXZlbiB3aGVuIHBhcmVudCB3aW5kb3cgaXMgY2xvc2VkLiBQYXRjaCBieSBSb2dlciBTZXJ3eS4KKworLSBJc3N1ZSAjMTQ4NzY6IFVzZSB1c2VyLXNlbGVjdGVkIGZvbnQgZm9yIGhpZ2hsaWdodCBjb25maWd1cmF0aW9uLgorICBQYXRjaCBieSBSb2dlciBTZXJ3eS4KKworLSBJc3N1ZSAjMTQ0MDk6IElETEUgbm93IHByb3Blcmx5IGV4ZWN1dGVzIGNvbW1hbmRzIGluIHRoZSBTaGVsbCB3aW5kb3cKKyAgd2hlbiBpdCBjYW5ub3QgcmVhZCB0aGUgbm9ybWFsIGNvbmZpZyBmaWxlcyBvbiBzdGFydHVwIGFuZAorICBoYXMgdG8gdXNlIHRoZSBidWlsdC1pbiBkZWZhdWx0IGtleSBiaW5kaW5ncy4KKyAgVGhlcmUgd2FzIHByZXZpb3VzbHkgYSBidWcgaW4gb25lIG9mIHRoZSBkZWZhdWx0cy4KKworLSBJc3N1ZSAjMzU3MzogSURMRSBoYW5ncyB3aGVuIHBhc3NpbmcgaW52YWxpZCBjb21tYW5kIGxpbmUgYXJncworICAoZGlyZWN0b3J5KGllcykgaW5zdGVhZCBvZiBmaWxlKHMpKSAoUGF0Y2ggYnkgR3VpbGhlcm1lIFBvbG8pCisKKy0gSXNzdWUgIzUyMTk6IFByZXZlbnQgZXZlbnQgaGFuZGxlciBjYXNjYWRlIGluIElETEUuCisKKy0gSXNzdWUgIzE1MzE4OiBQcmV2ZW50IHdyaXRpbmcgdG8gc3lzLnN0ZGluLgorCistIElzc3VlICMxMzUzMiwgIzE1MzE5OiBDaGVjayB0aGF0IGFyZ3VtZW50cyB0byBzeXMuc3Rkb3V0LndyaXRlIGFyZSBzdHJpbmdzLgorCistIElzc3VlICMxMDM2NTogRmlsZSBvcGVuIGRpYWxvZyBub3cgd29ya3MgaW5zdGVhZCBvZiBjcmFzaGluZyBldmVuIHdoZW4KKyAgcGFyZW50IHdpbmRvdyBpcyBjbG9zZWQgd2hpbGUgZGlhbG9nIGlzIG9wZW4uCisKKy0gSXNzdWUgIzE0MDE4OiBVcGRhdGUgY2hlY2tzIGZvciB1bnN0YWJsZSBzeXN0ZW0gVGNsL1RrIHZlcnNpb25zIG9uIE9TIFgKKyAgdG8gaW5jbHVkZSB2ZXJzaW9ucyBzaGlwcGVkIHdpdGggT1MgWCAxMC43IGFuZCAxMC44IGluIGFkZGl0aW9uIHRvIDEwLjYuCisKKy0gSXNzdWUgIzE1ODUzOiBQcmV2ZW50IElETEUgY3Jhc2ggb24gT1MgWCB3aGVuIG9wZW5pbmcgUHJlZmVyZW5jZXMgbWVudQorICB3aXRoIGNlcnRhaW4gdmVyc2lvbnMgb2YgVGsgOC41LiAgSW5pdGlhbCBwYXRjaCBieSBLZXZpbiBXYWx6ZXIuCisKKworV2hhdCdzIE5ldyBpbiBJRExFIDIuNy4zPworPT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAyMDEyLTA0LTA5KgorCistIElzc3VlICM5NjQ0MzcgTWFrZSBJRExFIGhlbHAgd2luZG93IG5vbi1tb2RhbC4KKyAgUGF0Y2ggYnkgR3VpbGhlcm1lIFBvbG8gYW5kIFJvZ2VyIFNlcnd5LgorCistIElzc3VlICMxMzkzMzogSURMRSBhdXRvLWNvbXBsZXRlIGRpZCBub3Qgd29yayB3aXRoIHNvbWUgaW1wb3J0ZWQKKyAgbW9kdWxlLCBsaWtlIGhhc2hsaWIuICAoUGF0Y2ggYnkgUm9nZXIgU2Vyd3kpCisKKy0gSXNzdWUgIzEzNTA2OiBBZGQgJycgdG8gcGF0aCBmb3IgSURMRSBTaGVsbCB3aGVuIHN0YXJ0ZWQgYW5kIHJlc3RhcnRlZCB3aXRoIFJlc3RhcnQgU2hlbGwuCisgIE9yaWdpbmFsIHBhdGNoZXMgYnkgTWFyY28gU2NhdGFnbGluaSBhbmQgUm9nZXIgU2Vyd3kuCisKKy0gSXNzdWUgIzQ2MjU6IElmIElETEUgY2Fubm90IHdyaXRlIHRvIGl0cyByZWNlbnQgZmlsZSBvciBicmVha3BvaW50CisgIGZpbGVzLCBkaXNwbGF5IGEgbWVzc2FnZSBwb3B1cCBhbmQgY29udGludWUgcmF0aGVyIHRoYW4gY3Jhc2guCisgIChvcmlnaW5hbCBwYXRjaCBieSBSb2dlciBTZXJ3eSkKKworLSBJc3N1ZSAjODc5MzogUHJldmVudCBJRExFIGNyYXNoIHdoZW4gZ2l2ZW4gc3RyaW5ncyB3aXRoIGludmFsaWQgaGV4IGVzY2FwZQorICBzZXF1ZW5jZXMuCisKKy0gSXNzdWUgIzEzMjk2OiBGaXggSURMRSB0byBjbGVhciBjb21waWxlIF9fZnV0dXJlX18gZmxhZ3Mgb24gc2hlbGwgcmVzdGFydC4KKyAgKFBhdGNoIGJ5IFJvZ2VyIFNlcnd5KQorCistIElzc3VlICMxNDQwOTogSURMRSBub3cgcHJvcGVybHkgZXhlY3V0ZXMgY29tbWFuZHMgaW4gdGhlIFNoZWxsIHdpbmRvdworICB3aGVuIGl0IGNhbm5vdCByZWFkIHRoZSBub3JtYWwgY29uZmlnIGZpbGVzIG9uIHN0YXJ0dXAgYW5kCisgIGhhcyB0byB1c2UgdGhlIGJ1aWx0LWluIGRlZmF1bHQga2V5IGJpbmRpbmdzLgorICBUaGVyZSB3YXMgcHJldmlvdXNseSBhIGJ1ZyBpbiBvbmUgb2YgdGhlIGRlZmF1bHRzLgorCistIElzc3VlICMzNTczOiBJRExFIGhhbmdzIHdoZW4gcGFzc2luZyBpbnZhbGlkIGNvbW1hbmQgbGluZSBhcmdzCisgIChkaXJlY3RvcnkoaWVzKSBpbnN0ZWFkIG9mIGZpbGUocykpLgorCisKK1doYXQncyBOZXcgaW4gSURMRSAyLjcuMj8KKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMjAxMS0wNi0xMSoKKworLSBJc3N1ZSAjMTE3MTg6IElETEUncyBvcGVuIG1vZHVsZSBkaWFsb2cgY291bGRuJ3QgZmluZCB0aGUgX19pbml0X18ucHkKKyAgZmlsZSBpbiBhIHBhY2thZ2UuCisKKy0gSXNzdWUgIzEyNTkwOiBJRExFIGVkaXRvciB3aW5kb3cgbm93IGFsd2F5cyBkaXNwbGF5cyB0aGUgZmlyc3QgbGluZQorICB3aGVuIG9wZW5pbmcgYSBsb25nIGZpbGUuICBXaXRoIFRrIDguNSwgdGhlIGZpcnN0IGxpbmUgd2FzIGhpZGRlbi4KKworLSBJc3N1ZSAjMTEwODg6IGRvbid0IGNyYXNoIHdoZW4gdXNpbmcgRjUgdG8gcnVuIGEgc2NyaXB0IGluIElETEUgb24gTWFjT1NYCisgIHdpdGggVGsgOC41LgorCistIElzc3VlICMxMDk0MDogV29ya2Fyb3VuZCBhbiBJRExFIGhhbmcgb24gTWFjIE9TIFggMTAuNiB3aGVuIHVzaW5nIHRoZQorICBtZW51IGFjY2VsZXJhdG9ycyBmb3IgT3BlbiBNb2R1bGUsIEdvIHRvIExpbmUsIGFuZCBOZXcgSW5kZW50IFdpZHRoLgorICBUaGUgYWNjZWxlcmF0b3JzIHN0aWxsIHdvcmsgYnV0IG5vIGxvbmdlciBhcHBlYXIgaW4gdGhlIG1lbnUgaXRlbXMuCisKKy0gSXNzdWUgIzEwOTA3OiBXYXJuIE9TIFggMTAuNiBJRExFIHVzZXJzIHRvIHVzZSBBY3RpdmVTdGF0ZSBUY2wvVGsgOC41LCByYXRoZXIKKyAgdGhhbiB0aGUgY3VycmVudGx5IHByb2JsZW1hdGljIEFwcGxlLXN1cHBsaWVkIG9uZSwgd2hlbiBydW5uaW5nIHdpdGggdGhlCisgIDY0LS8zMi1iaXQgaW5zdGFsbGVyIHZhcmlhbnQuCisKKy0gSXNzdWUgIzExMDUyOiBDb3JyZWN0IElETEUgbWVudSBhY2NlbGVyYXRvcnMgb24gTWFjIE9TIFggZm9yIFNhdmUKKyAgY29tbWFuZHMuCisKKy0gSXNzdWUgIzYwNzU6IElETEUgb24gTWFjIE9TIFggbm93IHdvcmtzIHdpdGggYm90aCBDYXJib24gQXF1YVRrIGFuZAorICBDb2NvYSBBcXVhVGsuCisKKy0gSXNzdWUgIzEwNDA0OiBVc2UgY3RsLWJ1dHRvbi0xIG9uIE9TWCBmb3IgdGhlIGNvbnRleHQgbWVudSBpbiBJZGxlLgorCistIElzc3VlICMxMDEwNzogV2FybiBhYm91dCB1bnNhdmVkIGZpbGVzIGluIElETEUgb24gT1NYLgorCistIElzc3VlICMxMDQwNjogRW5hYmxlIFJzdHJpcCBJRExFIGV4dGVuc2lvbiBvbiBPU1ggKGp1c3QgbGlrZSBvbiBvdGhlcgorICBwbGF0Zm9ybXMpLgogCiAtIElzc3VlICM2Mzc4OiBGdXJ0aGVyIGFkanVzdCBpZGxlLmJhdCB0byBzdGFydCBhc3NvY2lhdGVkIFB5dGhvbgogCiAtIElzc3VlICMxMTg5NjogU2F2ZSBvbiBDbG9zZSBmYWlsZWQgZGVzcGl0ZSBzZWxlY3RpbmcgIlllcyIgaW4gZGlhbG9nLgogCi0tIDxIb21lPiB0b2dnbGUgZmFpbGluZyBvbiBUayA4LjUsIGNhdXNpbmcgSURMRSBleGl0cyBhbmQgc3RyYW5nZSBzZWxlY3Rpb24KLSAgYmVoYXZpb3IuIElzc3VlIDQ2NzYuICBJbXByb3ZlIHNlbGVjdGlvbiBleHRlbnNpb24gYmVoYXZpb3VyLgorLSBJc3N1ZSAjNDY3NjogPEhvbWU+IHRvZ2dsZSBmYWlsaW5nIG9uIFRrIDguNSwgY2F1c2luZyBJRExFIGV4aXRzIGFuZAorICBzdHJhbmdlIHNlbGVjdGlvbiBiZWhhdmlvci4gIEltcHJvdmUgc2VsZWN0aW9uIGV4dGVuc2lvbiBiZWhhdmlvdXIuCiAKLS0gPEhvbWU+IHRvZ2dsZSBub24tZnVuY3Rpb25hbCB3aGVuIE51bUxvY2sgc2V0IG9uIFdpbmRvd3MuICBJc3N1ZSAzODUxLgorLSBJc3N1ZSAjMzg1MSA8SG9tZT4gdG9nZ2xlIG5vbi1mdW5jdGlvbmFsIHdoZW4gTnVtTG9jayBzZXQgb24gV2luZG93cy4KKworCitXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjcuMT8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAyMDEwLTExLTI3KgorCistIElzc3VlICM2Mzc4OiBpZGxlLmJhdCBub3cgcnVucyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBQeXRob24gdmVyc2lvbiByYXRoZXIgdGhhbgorICB0aGUgc3lzdGVtIGRlZmF1bHQuIFBhdGNoIGJ5IFNyaWRoYXIgUmF0bmFrdW1hci4KIAogCiBXaGF0J3MgTmV3IGluIElETEUgMi43PwogPT09PT09PT09PT09PT09PT09PT09PT0KIAotKlJlbGVhc2UgZGF0ZTogMDctMDMtMjAxMCoKKypSZWxlYXNlIGRhdGU6IDIwMTAtMDctMDMqCisKKy0gSXNzdWUgIzUxNTA6IElETEUncyBmb3JtYXQgbWVudSBub3cgaGFzIGFuIG9wdGlvbiB0byBzdHJpcCB0cmFpbGluZworICB3aGl0ZXNwYWNlLgorCistIElzc3VlICM1ODQ3OiBSZW1vdmUgLW4gc3dpdGNoIG9uICJFZGl0IHdpdGggSURMRSIgbWVudSBpdGVtLgogCiAtIGlkbGUucHkgbW9kaWZpZWQgYW5kIHNpbXBsaWZpZWQgdG8gYmV0dGVyIHN1cHBvcnQgZGV2ZWxvcGluZyBleHBlcmltZW50YWwKICAgdmVyc2lvbnMgb2YgSURMRSB3aGljaCBhcmUgbm90IGluc3RhbGxlZCBpbiB0aGUgc3RhbmRhcmQgbG9jYXRpb24uCiAKLS0gT3V0cHV0V2luZG93L1B5U2hlbGwgcmlnaHQgY2xpY2sgbWVudSAiR28gdG8gZmlsZS9saW5lIiB3YXNuJ3Qgd29ya2luZyB3aXRoCi0gIGZpbGUgcGF0aHMgY29udGFpbmluZyBzcGFjZXMuICBCdWcgNTU1OS4KKy0gSXNzdWUgIzU1NTk6IE91dHB1dFdpbmRvdy9QeVNoZWxsIHJpZ2h0IGNsaWNrIG1lbnUgIkdvIHRvIGZpbGUvbGluZSIKKyAgd2Fzbid0IHdvcmtpbmcgd2l0aCBmaWxlIHBhdGhzIGNvbnRhaW5pbmcgc3BhY2VzLgogCi0tIFdpbmRvd3M6IFZlcnNpb24gc3RyaW5nIGZvciB0aGUgLmNobSBoZWxwIGZpbGUgY2hhbmdlZCwgZmlsZSBub3QgYmVpbmcKLSAgYWNjZXNzZWQgIFBhdGNoIDU3ODMgR3VpbGhlcm1lIFBvbG8KKy0gSXNzdWUgIzU3ODM6IFdpbmRvd3M6IFZlcnNpb24gc3RyaW5nIGZvciB0aGUgLmNobSBoZWxwIGZpbGUgY2hhbmdlZCwKKyAgZmlsZSBub3QgYmVpbmcgYWNjZXNzZWQgIFBhdGNoIGJ5IEd1aWxoZXJtZSBQb2xvLwogCi0tIEFsbG93IG11bHRpcGxlIElETEUgR1VJL3N1YnByb2Nlc3MgcGFpcnMgdG8gZXhpc3Qgc2ltdWx0YW5lb3VzbHkuIFRoYW5rcyB0bwotICBEYXZpZCBTY2hlcmVyIGZvciBzdWdnZXN0aW5nIHRoZSB1c2Ugb2YgYW4gZXBoZW1lcmFsIHBvcnQgZm9yIHRoZSBHVUkuCi0gIFBhdGNoIDE1MjkxNDIgV2VlYmxlLgorLSBJc3N1ZSAjMTUyOTE0MjogQWxsb3cgbXVsdGlwbGUgSURMRSBHVUkvc3VicHJvY2VzcyBwYWlycyB0byBleGlzdAorICBzaW11bHRhbmVvdXNseS4gVGhhbmtzIHRvIERhdmlkIFNjaGVyZXIgZm9yIHN1Z2dlc3RpbmcgdGhlIHVzZSBvZiBhbgorICBlcGhlbWVyYWwgcG9ydCBmb3IgdGhlIEdVSS4gIFBhdGNoIGJ5IFdlZWJsZS4KIAogLSBSZW1vdmUgcG9ydCBzcGVjIGZyb20gcnVuLnB5IGFuZCBmaXggYnVnIHdoZXJlIHN1YnByb2Nlc3MgZmFpbHMgdG8KICAgZXh0cmFjdCBwb3J0IGZyb20gY29tbWFuZCBsaW5lIHdoZW4gd2FybmluZ3MgYXJlIHByZXNlbnQuCiAKLS0gVGsgOC41IFRleHQgd2lkZ2V0IHJlcXVpcmVzICd3b3JkcHJvY2Vzc29yJyB0YWJzdHlsZSBhdHRyIHRvIGhhbmRsZQotICBtaXhlZCBzcGFjZS90YWIgcHJvcGVybHkuIElzc3VlIDUxMjksIHBhdGNoIGJ5IEd1aWxoZXJtZSBQb2xvLgorLSBJc3N1ZSAjNTEyOTogVGsgOC41IFRleHQgd2lkZ2V0IHJlcXVpcmVzICd3b3JkcHJvY2Vzc29yJyB0YWJzdHlsZSBhdHRyCisgIHRvIGhhbmRsZSBtaXhlZCBzcGFjZS90YWIgcHJvcGVybHkuIFBhdGNoIGJ5IEd1aWxoZXJtZSBQb2xvLgogCiAtIElzc3VlICMzNTQ5OiBPbiBNYWNPUyB0aGUgcHJlZmVyZW5jZXMgbWVudSB3YXMgbm90IHByZXNlbnQKIApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvT2JqZWN0QnJvd3Nlci5weSBiL0xpYi9pZGxlbGliL09iamVjdEJyb3dzZXIucHkKaW5kZXggN2RlNjk4OC4uZTY5MzY1YyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvT2JqZWN0QnJvd3Nlci5weQorKysgYi9MaWIvaWRsZWxpYi9PYmplY3RCcm93c2VyLnB5CkBAIC05LDYgKzksOCBAQAogIyBYWFggVE8gRE86CiAjIC0gZm9yIGNsYXNzZXMvbW9kdWxlcywgYWRkICJvcGVuIHNvdXJjZSIgdG8gb2JqZWN0IGJyb3dzZXIKIAoraW1wb3J0IHJlCisKIGZyb20gaWRsZWxpYi5UcmVlV2lkZ2V0IGltcG9ydCBUcmVlSXRlbSwgVHJlZU5vZGUsIFNjcm9sbGVkQ2FudmFzCiAKIGZyb20gcmVwciBpbXBvcnQgUmVwcgpAQCAtMTMyLDEyICsxMzQsMTQgQEAKICAgICAgICAgYyA9IE9iamVjdFRyZWVJdGVtCiAgICAgcmV0dXJuIGMobGFiZWx0ZXh0LCBvYmplY3QsIHNldGZ1bmN0aW9uKQogCi0jIFRlc3Qgc2NyaXB0CiAKLWRlZiBfdGVzdCgpOgorZGVmIF9vYmplY3RfYnJvd3NlcihwYXJlbnQpOgogICAgIGltcG9ydCBzeXMKICAgICBmcm9tIFRraW50ZXIgaW1wb3J0IFRrCiAgICAgcm9vdCA9IFRrKCkKKyAgICByb290LnRpdGxlKCJUZXN0IE9iamVjdEJyb3dzZXIiKQorICAgIHdpZHRoLCBoZWlnaHQsIHgsIHkgPSBsaXN0KG1hcChpbnQsIHJlLnNwbGl0KCdbeCtdJywgcGFyZW50Lmdlb21ldHJ5KCkpKSkKKyAgICByb290Lmdlb21ldHJ5KCIrJWQrJWQiJSh4LCB5ICsgMTUwKSkKICAgICByb290LmNvbmZpZ3VyZShiZD0wLCBiZz0ieWVsbG93IikKICAgICByb290LmZvY3VzX3NldCgpCiAgICAgc2MgPSBTY3JvbGxlZENhbnZhcyhyb290LCBiZz0id2hpdGUiLCBoaWdobGlnaHR0aGlja25lc3M9MCwgdGFrZWZvY3VzPTEpCkBAIC0xNDgsNCArMTUyLDUgQEAKICAgICByb290Lm1haW5sb29wKCkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICBfdGVzdCgpCisgICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuCisgICAgcnVuKF9vYmplY3RfYnJvd3NlcikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL091dHB1dFdpbmRvdy5weSBiL0xpYi9pZGxlbGliL091dHB1dFdpbmRvdy5weQppbmRleCA2MGQwOWMwLi5lMThkODQ2IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9PdXRwdXRXaW5kb3cucHkKKysrIGIvTGliL2lkbGVsaWIvT3V0cHV0V2luZG93LnB5CkBAIC01Nyw3ICs1NywxMSBAQAogICAgICMgT3VyIG93biByaWdodC1idXR0b24gbWVudQogCiAgICAgcm1lbnVfc3BlY3MgPSBbCi0gICAgICAgICgiR28gdG8gZmlsZS9saW5lIiwgIjw8Z290by1maWxlLWxpbmU+PiIpLAorICAgICAgICAoIkN1dCIsICI8PGN1dD4+IiwgInJtZW51X2NoZWNrX2N1dCIpLAorICAgICAgICAoIkNvcHkiLCAiPDxjb3B5Pj4iLCAicm1lbnVfY2hlY2tfY29weSIpLAorICAgICAgICAoIlBhc3RlIiwgIjw8cGFzdGU+PiIsICJybWVudV9jaGVja19wYXN0ZSIpLAorICAgICAgICAoTm9uZSwgTm9uZSwgTm9uZSksCisgICAgICAgICgiR28gdG8gZmlsZS9saW5lIiwgIjw8Z290by1maWxlLWxpbmU+PiIsIE5vbmUpLAogICAgIF0KIAogICAgIGZpbGVfbGluZV9wYXRzID0gWwpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvUGFyZW5NYXRjaC5weSBiL0xpYi9pZGxlbGliL1BhcmVuTWF0Y2gucHkKaW5kZXggNmQ5MWIzOS4uMTliYWQ4YyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvUGFyZW5NYXRjaC5weQorKysgYi9MaWIvaWRsZWxpYi9QYXJlbk1hdGNoLnB5CkBAIC05MCw3ICs5MCw4IEBACiAgICAgICAgICAgICBzZWxmLnNldF90aW1lb3V0ID0gc2VsZi5zZXRfdGltZW91dF9ub25lCiAKICAgICBkZWYgZmxhc2hfcGFyZW5fZXZlbnQoc2VsZiwgZXZlbnQpOgotICAgICAgICBpbmRpY2VzID0gSHlwZXJQYXJzZXIoc2VsZi5lZGl0d2luLCAiaW5zZXJ0IikuZ2V0X3N1cnJvdW5kaW5nX2JyYWNrZXRzKCkKKyAgICAgICAgaW5kaWNlcyA9IChIeXBlclBhcnNlcihzZWxmLmVkaXR3aW4sICJpbnNlcnQiKQorICAgICAgICAgICAgICAgICAgIC5nZXRfc3Vycm91bmRpbmdfYnJhY2tldHMoKSkKICAgICAgICAgaWYgaW5kaWNlcyBpcyBOb25lOgogICAgICAgICAgICAgc2VsZi53YXJuX21pc21hdGNoZWQoKQogICAgICAgICAgICAgcmV0dXJuCkBAIC0xNjcsNiArMTY4LDExIEBACiAgICAgICAgICMgYXNzb2NpYXRlIGEgY291bnRlciB3aXRoIGFuIGV2ZW50OyBvbmx5IGRpc2FibGUgdGhlICJwYXJlbiIKICAgICAgICAgIyB0YWcgaWYgdGhlIGV2ZW50IGlzIGZvciB0aGUgbW9zdCByZWNlbnQgdGltZXIuCiAgICAgICAgIHNlbGYuY291bnRlciArPSAxCi0gICAgICAgIHNlbGYuZWRpdHdpbi50ZXh0X2ZyYW1lLmFmdGVyKHNlbGYuRkxBU0hfREVMQVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSBzZWxmPXNlbGYsIGM9c2VsZi5jb3VudGVyOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX3Jlc3RvcmVfdGltZXIoYykpCisgICAgICAgIHNlbGYuZWRpdHdpbi50ZXh0X2ZyYW1lLmFmdGVyKAorICAgICAgICAgICAgc2VsZi5GTEFTSF9ERUxBWSwKKyAgICAgICAgICAgIGxhbWJkYSBzZWxmPXNlbGYsIGM9c2VsZi5jb3VudGVyOiBzZWxmLmhhbmRsZV9yZXN0b3JlX3RpbWVyKGMpKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaW1wb3J0IHVuaXR0ZXN0CisgICAgdW5pdHRlc3QubWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF9wYXJlbm1hdGNoJywgdmVyYm9zaXR5PTIpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9QYXRoQnJvd3Nlci5weSBiL0xpYi9pZGxlbGliL1BhdGhCcm93c2VyLnB5CmluZGV4IGQ4OGE0OGUuLmVmN2Y4ZmYgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1BhdGhCcm93c2VyLnB5CisrKyBiL0xpYi9pZGxlbGliL1BhdGhCcm93c2VyLnB5CkBAIC00LDEwICs0LDE2IEBACiAKIGZyb20gaWRsZWxpYi5UcmVlV2lkZ2V0IGltcG9ydCBUcmVlSXRlbQogZnJvbSBpZGxlbGliLkNsYXNzQnJvd3NlciBpbXBvcnQgQ2xhc3NCcm93c2VyLCBNb2R1bGVCcm93c2VyVHJlZUl0ZW0KK2Zyb20gaWRsZWxpYi5QeVNoZWxsIGltcG9ydCBQeVNoZWxsRmlsZUxpc3QKKwogCiBjbGFzcyBQYXRoQnJvd3NlcihDbGFzc0Jyb3dzZXIpOgogCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGZsaXN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmxpc3QsIF9odGVzdD1GYWxzZSk6CisgICAgICAgICIiIgorICAgICAgICBfaHRlc3QgLSBib29sLCBjaGFuZ2UgYm94IGxvY2F0aW9uIHdoZW4gcnVubmluZyBodGVzdAorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5faHRlc3QgPSBfaHRlc3QKICAgICAgICAgc2VsZi5pbml0KGZsaXN0KQogCiAgICAgZGVmIHNldHRpdGxlKHNlbGYpOgpAQCAtODUsMTEgKzkxLDE0IEBACiAgICAgICAgIHNvcnRlZC5zb3J0KCkKICAgICAgICAgcmV0dXJuIHNvcnRlZAogCi1kZWYgbWFpbigpOgotICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgUHlTaGVsbAotICAgIFBhdGhCcm93c2VyKFB5U2hlbGwuZmxpc3QpCi0gICAgaWYgc3lzLnN0ZGluIGlzIHN5cy5fX3N0ZGluX186Ci0gICAgICAgIG1haW5sb29wKCkKK2RlZiBfcGF0aF9icm93c2VyKHBhcmVudCk6CisgICAgZmxpc3QgPSBQeVNoZWxsRmlsZUxpc3QocGFyZW50KQorICAgIFBhdGhCcm93c2VyKGZsaXN0LCBfaHRlc3Q9VHJ1ZSkKKyAgICBwYXJlbnQubWFpbmxvb3AoKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIG1haW4oKQorICAgIGZyb20gdW5pdHRlc3QgaW1wb3J0IG1haW4KKyAgICBtYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X3BhdGhicm93c2VyJywgdmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCisKKyAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KKyAgICBydW4oX3BhdGhfYnJvd3NlcikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1BlcmNvbGF0b3IucHkgYi9MaWIvaWRsZWxpYi9QZXJjb2xhdG9yLnB5CmluZGV4IGUyNDY4OWIuLmUwZThjYWQgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1BlcmNvbGF0b3IucHkKKysrIGIvTGliL2lkbGVsaWIvUGVyY29sYXRvci5weQpAQCAtNTIsNyArNTIsOSBAQAogICAgICAgICAgICAgZmlsdGVyLnNldGRlbGVnYXRlKE5vbmUpCiAKIAotZGVmIG1haW4oKToKK2RlZiBfcGVyY29sYXRvcihwYXJlbnQpOgorICAgIGltcG9ydCBUa2ludGVyIGFzIHRrCisgICAgaW1wb3J0IHJlCiAgICAgY2xhc3MgVHJhY2VyKERlbGVnYXRvcik6CiAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKICAgICAgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKQEAgLTYzLDIzICs2NSwzOSBAQAogICAgICAgICBkZWYgZGVsZXRlKHNlbGYsICphcmdzKToKICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogZGVsZXRlIiwgYXJncwogICAgICAgICAgICAgc2VsZi5kZWxlZ2F0ZS5kZWxldGUoKmFyZ3MpCi0gICAgcm9vdCA9IFRrKCkKLSAgICByb290LndtX3Byb3RvY29sKCJXTV9ERUxFVEVfV0lORE9XIiwgcm9vdC5xdWl0KQotICAgIHRleHQgPSBUZXh0KCkKLSAgICB0ZXh0LnBhY2soKQotICAgIHRleHQuZm9jdXNfc2V0KCkKKyAgICByb290ID0gdGsuVGsoKQorICAgIHJvb3QudGl0bGUoIlRlc3QgUGVyY29sYXRvciIpCisgICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQorICAgIHJvb3QuZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNTApKQorICAgIHRleHQgPSB0ay5UZXh0KHJvb3QpCiAgICAgcCA9IFBlcmNvbGF0b3IodGV4dCkKICAgICB0MSA9IFRyYWNlcigidDEiKQogICAgIHQyID0gVHJhY2VyKCJ0MiIpCi0gICAgcC5pbnNlcnRmaWx0ZXIodDEpCi0gICAgcC5pbnNlcnRmaWx0ZXIodDIpCi0gICAgcm9vdC5tYWlubG9vcCgpCi0gICAgcC5yZW1vdmVmaWx0ZXIodDIpCi0gICAgcm9vdC5tYWlubG9vcCgpCi0gICAgcC5pbnNlcnRmaWx0ZXIodDIpCi0gICAgcC5yZW1vdmVmaWx0ZXIodDEpCi0gICAgcm9vdC5tYWlubG9vcCgpCisKKyAgICBkZWYgdG9nZ2xlMSgpOgorICAgICAgICBpZiB2YXIxLmdldCgpID09IDA6CisgICAgICAgICAgICB2YXIxLnNldCgxKQorICAgICAgICAgICAgcC5pbnNlcnRmaWx0ZXIodDEpCisgICAgICAgIGVsaWYgdmFyMS5nZXQoKSA9PSAxOgorICAgICAgICAgICAgdmFyMS5zZXQoMCkKKyAgICAgICAgICAgIHAucmVtb3ZlZmlsdGVyKHQxKQorCisgICAgZGVmIHRvZ2dsZTIoKToKKyAgICAgICAgaWYgdmFyMi5nZXQoKSA9PSAwOgorICAgICAgICAgICAgdmFyMi5zZXQoMSkKKyAgICAgICAgICAgIHAuaW5zZXJ0ZmlsdGVyKHQyKQorICAgICAgICBlbGlmIHZhcjIuZ2V0KCkgPT0gMToKKyAgICAgICAgICAgIHZhcjIuc2V0KDApCisgICAgICAgICAgICBwLnJlbW92ZWZpbHRlcih0MikKKworICAgIHRleHQucGFjaygpCisgICAgdmFyMSA9IHRrLkludFZhcigpCisgICAgY2IxID0gdGsuQ2hlY2tidXR0b24ocm9vdCwgdGV4dD0iVHJhY2VyMSIsIGNvbW1hbmQ9dG9nZ2xlMSwgdmFyaWFibGU9dmFyMSkKKyAgICBjYjEucGFjaygpCisgICAgdmFyMiA9IHRrLkludFZhcigpCisgICAgY2IyID0gdGsuQ2hlY2tidXR0b24ocm9vdCwgdGV4dD0iVHJhY2VyMiIsIGNvbW1hbmQ9dG9nZ2xlMiwgdmFyaWFibGU9dmFyMikKKyAgICBjYjIucGFjaygpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgZnJvbSBUa2ludGVyIGltcG9ydCAqCi0gICAgbWFpbigpCisgICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuCisgICAgcnVuKF9wZXJjb2xhdG9yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvUHlTaGVsbC5weSBiL0xpYi9pZGxlbGliL1B5U2hlbGwucHkKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBjZTgzZjE5Li4wZDk0OTQ0Ci0tLSBhL0xpYi9pZGxlbGliL1B5U2hlbGwucHkKKysrIGIvTGliL2lkbGVsaWIvUHlTaGVsbC5weQpAQCAtMTEsOSArMTEsMTEgQEAKIGltcG9ydCB0aHJlYWRpbmcKIGltcG9ydCB0cmFjZWJhY2sKIGltcG9ydCB0eXBlcworaW1wb3J0IGlvCiAKIGltcG9ydCBsaW5lY2FjaGUKIGZyb20gY29kZSBpbXBvcnQgSW50ZXJhY3RpdmVJbnRlcnByZXRlcgorZnJvbSBwbGF0Zm9ybSBpbXBvcnQgcHl0aG9uX3ZlcnNpb24sIHN5c3RlbQogCiB0cnk6CiAgICAgZnJvbSBUa2ludGVyIGltcG9ydCAqCkBAIC00OCwzNSArNTAsNTUgQEAKICMgaW50ZXJuYWwgd2FybmluZ3MgdG8gdGhlIGNvbnNvbGUuICBTY3JpcHRCaW5kaW5nLmNoZWNrX3N5bnRheCgpIHdpbGwKICMgdGVtcG9yYXJpbHkgcmVkaXJlY3QgdGhlIHN0cmVhbSB0byB0aGUgc2hlbGwgd2luZG93IHRvIGRpc3BsYXkgd2FybmluZ3Mgd2hlbgogIyBjaGVja2luZyB1c2VyJ3MgY29kZS4KLWdsb2JhbCB3YXJuaW5nX3N0cmVhbQotd2FybmluZ19zdHJlYW0gPSBzeXMuX19zdGRlcnJfXwotdHJ5OgotICAgIGltcG9ydCB3YXJuaW5ncwotZXhjZXB0IEltcG9ydEVycm9yOgotICAgIHBhc3MKLWVsc2U6Ci0gICAgZGVmIGlkbGVfc2hvd3dhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmlsZT1Ob25lLCBsaW5lPU5vbmUpOgotICAgICAgICBpZiBmaWxlIGlzIE5vbmU6Ci0gICAgICAgICAgICBmaWxlID0gd2FybmluZ19zdHJlYW0KLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZmlsZS53cml0ZSh3YXJuaW5ncy5mb3JtYXR3YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm8sIGxpbmU9bGluZSkpCi0gICAgICAgIGV4Y2VwdCBJT0Vycm9yOgotICAgICAgICAgICAgcGFzcyAgIyMgZmlsZSAocHJvYmFibHkgX19zdGRlcnJfXykgaXMgaW52YWxpZCwgd2FybmluZyBkcm9wcGVkLgotICAgIHdhcm5pbmdzLnNob3d3YXJuaW5nID0gaWRsZV9zaG93d2FybmluZwotICAgIGRlZiBpZGxlX2Zvcm1hdHdhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGxpbmU9Tm9uZSk6Ci0gICAgICAgICIiIkZvcm1hdCB3YXJuaW5ncyB0aGUgSURMRSB3YXkiIiIKLSAgICAgICAgcyA9ICJcbldhcm5pbmcgKGZyb20gd2FybmluZ3MgbW9kdWxlKTpcbiIKLSAgICAgICAgcyArPSAnICBGaWxlIFwiJXNcIiwgbGluZSAlc1xuJyAlIChmaWxlbmFtZSwgbGluZW5vKQotICAgICAgICBpZiBsaW5lIGlzIE5vbmU6Ci0gICAgICAgICAgICBsaW5lID0gbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIGxpbmVubykKLSAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQotICAgICAgICBpZiBsaW5lOgotICAgICAgICAgICAgcyArPSAiICAgICVzXG4iICUgbGluZQotICAgICAgICBzICs9ICIlczogJXNcbj4+PiAiICUgKGNhdGVnb3J5Ll9fbmFtZV9fLCBtZXNzYWdlKQotICAgICAgICByZXR1cm4gcwotICAgIHdhcm5pbmdzLmZvcm1hdHdhcm5pbmcgPSBpZGxlX2Zvcm1hdHdhcm5pbmcKK3dhcm5pbmdfc3RyZWFtID0gc3lzLl9fc3RkZXJyX18gICMgTm9uZSwgYXQgbGVhc3Qgb24gV2luZG93cywgaWYgbm8gY29uc29sZS4KK2ltcG9ydCB3YXJuaW5ncworCitkZWYgaWRsZV9mb3JtYXR3YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBsaW5lPU5vbmUpOgorICAgICIiIkZvcm1hdCB3YXJuaW5ncyB0aGUgSURMRSB3YXkuIiIiCisKKyAgICBzID0gIlxuV2FybmluZyAoZnJvbSB3YXJuaW5ncyBtb2R1bGUpOlxuIgorICAgIHMgKz0gJyAgRmlsZSBcIiVzXCIsIGxpbmUgJXNcbicgJSAoZmlsZW5hbWUsIGxpbmVubykKKyAgICBpZiBsaW5lIGlzIE5vbmU6CisgICAgICAgIGxpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZShmaWxlbmFtZSwgbGluZW5vKQorICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKKyAgICBpZiBsaW5lOgorICAgICAgICBzICs9ICIgICAgJXNcbiIgJSBsaW5lCisgICAgcyArPSAiJXM6ICVzXG4iICUgKGNhdGVnb3J5Ll9fbmFtZV9fLCBtZXNzYWdlKQorICAgIHJldHVybiBzCisKK2RlZiBpZGxlX3Nob3d3YXJuaW5nKAorICAgICAgICBtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgZmlsZT1Ob25lLCBsaW5lPU5vbmUpOgorICAgICIiIlNob3cgSWRsZS1mb3JtYXQgd2FybmluZyAoYWZ0ZXIgcmVwbGFjaW5nIHdhcm5pbmdzLnNob3d3YXJuaW5nKS4KKworICAgIFRoZSBkaWZmZXJlbmNlcyBhcmUgdGhlIGZvcm1hdHRlciBjYWxsZWQsIHRoZSBmaWxlPU5vbmUgcmVwbGFjZW1lbnQsCisgICAgd2hpY2ggY2FuIGJlIE5vbmUsIHRoZSBjYXB0dXJlIG9mIHRoZSBjb25zZXF1ZW5jZSBBdHRyaWJ1dGVFcnJvciwKKyAgICBhbmQgdGhlIG91dHB1dCBvZiBhIGhhcmQtY29kZWQgcHJvbXB0LgorICAgICIiIgorICAgIGlmIGZpbGUgaXMgTm9uZToKKyAgICAgICAgZmlsZSA9IHdhcm5pbmdfc3RyZWFtCisgICAgdHJ5OgorICAgICAgICBmaWxlLndyaXRlKGlkbGVfZm9ybWF0d2FybmluZygKKyAgICAgICAgICAgICAgICBtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgbGluZT1saW5lKSkKKyAgICAgICAgZmlsZS53cml0ZSgiPj4+ICIpCisgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgSU9FcnJvcik6CisgICAgICAgIHBhc3MgICMgaWYgZmlsZSAocHJvYmFibHkgX19zdGRlcnJfXykgaXMgaW52YWxpZCwgc2tpcCB3YXJuaW5nLgorCitfd2FybmluZ3Nfc2hvd3dhcm5pbmcgPSBOb25lCisKK2RlZiBjYXB0dXJlX3dhcm5pbmdzKGNhcHR1cmUpOgorICAgICJSZXBsYWNlIHdhcm5pbmcuc2hvd3dhcm5pbmcgd2l0aCBpZGxlX3Nob3d3YXJuaW5nLCBvciByZXZlcnNlLiIKKworICAgIGdsb2JhbCBfd2FybmluZ3Nfc2hvd3dhcm5pbmcKKyAgICBpZiBjYXB0dXJlOgorICAgICAgICBpZiBfd2FybmluZ3Nfc2hvd3dhcm5pbmcgaXMgTm9uZToKKyAgICAgICAgICAgIF93YXJuaW5nc19zaG93d2FybmluZyA9IHdhcm5pbmdzLnNob3d3YXJuaW5nCisgICAgICAgICAgICB3YXJuaW5ncy5zaG93d2FybmluZyA9IGlkbGVfc2hvd3dhcm5pbmcKKyAgICBlbHNlOgorICAgICAgICBpZiBfd2FybmluZ3Nfc2hvd3dhcm5pbmcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB3YXJuaW5ncy5zaG93d2FybmluZyA9IF93YXJuaW5nc19zaG93d2FybmluZworICAgICAgICAgICAgX3dhcm5pbmdzX3Nob3d3YXJuaW5nID0gTm9uZQorCitjYXB0dXJlX3dhcm5pbmdzKFRydWUpCiAKIGRlZiBleHRlbmRlZF9saW5lY2FjaGVfY2hlY2tjYWNoZShmaWxlbmFtZT1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdfY2hlY2tjYWNoZT1saW5lY2FjaGUuY2hlY2tjYWNoZSk6CkBAIC0xMTQsMTUgKzEzNiwyMSBAQAogICAgICAgICBzZWxmLmJyZWFrcG9pbnRQYXRoID0gb3MucGF0aC5qb2luKGlkbGVDb25mLkdldFVzZXJDZmdEaXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnJlYWtwb2ludHMubHN0JykKICAgICAgICAgIyB3aGVuZXZlciBhIGZpbGUgaXMgY2hhbmdlZCwgcmVzdG9yZSBicmVha3BvaW50cwotICAgICAgICBpZiBzZWxmLmlvLmZpbGVuYW1lOiBzZWxmLnJlc3RvcmVfZmlsZV9icmVha3MoKQogICAgICAgICBkZWYgZmlsZW5hbWVfY2hhbmdlZF9ob29rKG9sZF9ob29rPXNlbGYuaW8uZmlsZW5hbWVfY2hhbmdlX2hvb2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZj1zZWxmKToKICAgICAgICAgICAgIHNlbGYucmVzdG9yZV9maWxlX2JyZWFrcygpCiAgICAgICAgICAgICBvbGRfaG9vaygpCiAgICAgICAgIHNlbGYuaW8uc2V0X2ZpbGVuYW1lX2NoYW5nZV9ob29rKGZpbGVuYW1lX2NoYW5nZWRfaG9vaykKKyAgICAgICAgaWYgc2VsZi5pby5maWxlbmFtZToKKyAgICAgICAgICAgIHNlbGYucmVzdG9yZV9maWxlX2JyZWFrcygpCiAKLSAgICBybWVudV9zcGVjcyA9IFsoIlNldCBCcmVha3BvaW50IiwgIjw8c2V0LWJyZWFrcG9pbnQtaGVyZT4+IiksCi0gICAgICAgICAgICAgICAgICAgKCJDbGVhciBCcmVha3BvaW50IiwgIjw8Y2xlYXItYnJlYWtwb2ludC1oZXJlPj4iKV0KKyAgICBybWVudV9zcGVjcyA9IFsKKyAgICAgICAgKCJDdXQiLCAiPDxjdXQ+PiIsICJybWVudV9jaGVja19jdXQiKSwKKyAgICAgICAgKCJDb3B5IiwgIjw8Y29weT4+IiwgInJtZW51X2NoZWNrX2NvcHkiKSwKKyAgICAgICAgKCJQYXN0ZSIsICI8PHBhc3RlPj4iLCAicm1lbnVfY2hlY2tfcGFzdGUiKSwKKyAgICAgICAgKCJTZXQgQnJlYWtwb2ludCIsICI8PHNldC1icmVha3BvaW50LWhlcmU+PiIsIE5vbmUpLAorICAgICAgICAoIkNsZWFyIEJyZWFrcG9pbnQiLCAiPDxjbGVhci1icmVha3BvaW50LWhlcmU+PiIsIE5vbmUpCisgICAgXQogCiAgICAgZGVmIHNldF9icmVha3BvaW50KHNlbGYsIGxpbmVubyk6CiAgICAgICAgIHRleHQgPSBzZWxmLnRleHQKQEAgLTIwNywyMSArMjM1LDMyIEBACiAgICAgICAgIGJyZWFrcyA9IHNlbGYuYnJlYWtwb2ludHMKICAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmlvLmZpbGVuYW1lCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIGxpbmVzID0gb3BlbihzZWxmLmJyZWFrcG9pbnRQYXRoLCJyIikucmVhZGxpbmVzKCkKKyAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLmJyZWFrcG9pbnRQYXRoLCJyIikgYXMgb2xkX2ZpbGU6CisgICAgICAgICAgICAgICAgbGluZXMgPSBvbGRfZmlsZS5yZWFkbGluZXMoKQogICAgICAgICBleGNlcHQgSU9FcnJvcjoKICAgICAgICAgICAgIGxpbmVzID0gW10KLSAgICAgICAgbmV3X2ZpbGUgPSBvcGVuKHNlbGYuYnJlYWtwb2ludFBhdGgsInciKQotICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKLSAgICAgICAgICAgIGlmIG5vdCBsaW5lLnN0YXJ0c3dpdGgoZmlsZW5hbWUgKyAnPScpOgotICAgICAgICAgICAgICAgIG5ld19maWxlLndyaXRlKGxpbmUpCi0gICAgICAgIHNlbGYudXBkYXRlX2JyZWFrcG9pbnRzKCkKLSAgICAgICAgYnJlYWtzID0gc2VsZi5icmVha3BvaW50cwotICAgICAgICBpZiBicmVha3M6Ci0gICAgICAgICAgICBuZXdfZmlsZS53cml0ZShmaWxlbmFtZSArICc9JyArIHN0cihicmVha3MpICsgJ1xuJykKLSAgICAgICAgbmV3X2ZpbGUuY2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5icmVha3BvaW50UGF0aCwidyIpIGFzIG5ld19maWxlOgorICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgbGluZS5zdGFydHN3aXRoKGZpbGVuYW1lICsgJz0nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld19maWxlLndyaXRlKGxpbmUpCisgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVfYnJlYWtwb2ludHMoKQorICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlbGYuYnJlYWtwb2ludHMKKyAgICAgICAgICAgICAgICBpZiBicmVha3M6CisgICAgICAgICAgICAgICAgICAgIG5ld19maWxlLndyaXRlKGZpbGVuYW1lICsgJz0nICsgc3RyKGJyZWFrcykgKyAnXG4nKQorICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlcnI6CisgICAgICAgICAgICBpZiBub3QgZ2V0YXR0cihzZWxmLnJvb3QsICJicmVha3BvaW50X2Vycm9yX2Rpc3BsYXllZCIsIEZhbHNlKToKKyAgICAgICAgICAgICAgICBzZWxmLnJvb3QuYnJlYWtwb2ludF9lcnJvcl9kaXNwbGF5ZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcih0aXRsZT0nSURMRSBFcnJvcicsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J1VuYWJsZSB0byB1cGRhdGUgYnJlYWtwb2ludCBsaXN0OlxuJXMnCisgICAgICAgICAgICAgICAgICAgICAgICAlIHN0cihlcnIpLAorICAgICAgICAgICAgICAgICAgICBwYXJlbnQ9c2VsZi50ZXh0KQogCiAgICAgZGVmIHJlc3RvcmVfZmlsZV9icmVha3Moc2VsZik6CiAgICAgICAgIHNlbGYudGV4dC51cGRhdGUoKSAgICMgdGhpcyBlbmFibGVzIHNldHRpbmcgIkJSRUFLIiB0YWdzIHRvIGJlIHZpc2libGUKKyAgICAgICAgaWYgc2VsZi5pbyBpcyBOb25lOgorICAgICAgICAgICAgIyBjYW4gaGFwcGVuIGlmIElETEUgY2xvc2VzIGR1ZSB0byB0aGUgLnVwZGF0ZSgpIGNhbGwKKyAgICAgICAgICAgIHJldHVybgogICAgICAgICBmaWxlbmFtZSA9IHNlbGYuaW8uZmlsZW5hbWUKICAgICAgICAgaWYgZmlsZW5hbWUgaXMgTm9uZToKICAgICAgICAgICAgIHJldHVybgpAQCAtMjQzLDggKzI4Miw4IEBACiAgICAgZGVmIHJhbmdlc190b19saW5lbnVtYmVycyhzZWxmLCByYW5nZXMpOgogICAgICAgICBsaW5lcyA9IFtdCiAgICAgICAgIGZvciBpbmRleCBpbiByYW5nZSgwLCBsZW4ocmFuZ2VzKSwgMik6Ci0gICAgICAgICAgICBsaW5lbm8gPSBpbnQoZmxvYXQocmFuZ2VzW2luZGV4XSkpCi0gICAgICAgICAgICBlbmQgPSBpbnQoZmxvYXQocmFuZ2VzW2luZGV4KzFdKSkKKyAgICAgICAgICAgIGxpbmVubyA9IGludChmbG9hdChyYW5nZXNbaW5kZXhdLnN0cmluZykpCisgICAgICAgICAgICBlbmQgPSBpbnQoZmxvYXQocmFuZ2VzW2luZGV4KzFdLnN0cmluZykpCiAgICAgICAgICAgICB3aGlsZSBsaW5lbm8gPCBlbmQ6CiAgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKGxpbmVubykKICAgICAgICAgICAgICAgICBsaW5lbm8gKz0gMQpAQCAtMzA1LDYgKzM0NCwxMSBAQAogICAgICAgICAgICAgImNvbnNvbGUiOiBpZGxlQ29uZi5HZXRIaWdobGlnaHQodGhlbWUsICJjb25zb2xlIiksCiAgICAgICAgIH0pCiAKKyAgICBkZWYgcmVtb3ZlY29sb3JzKHNlbGYpOgorICAgICAgICAjIERvbid0IHJlbW92ZSBzaGVsbCBjb2xvciB0YWdzIGJlZm9yZSAiaW9tYXJrIgorICAgICAgICBmb3IgdGFnIGluIHNlbGYudGFnZGVmczoKKyAgICAgICAgICAgIHNlbGYudGFnX3JlbW92ZSh0YWcsICJpb21hcmsiLCAiZW5kIikKKwogY2xhc3MgTW9kaWZpZWRVbmRvRGVsZWdhdG9yKFVuZG9EZWxlZ2F0b3IpOgogICAgICJFeHRlbmQgYmFzZSBjbGFzczogZm9yYmlkIGluc2VydC9kZWxldGUgYmVmb3JlIHRoZSBJL08gbWFyayIKIApAQCAtMzQ2LDYgKzM5MCw3IEBACiAgICAgICAgIHNlbGYucG9ydCA9IFBPUlQKICAgICAgICAgc2VsZi5vcmlnaW5hbF9jb21waWxlcl9mbGFncyA9IHNlbGYuY29tcGlsZS5jb21waWxlci5mbGFncwogCisgICAgX2FmdGVyaWQgPSBOb25lCiAgICAgcnBjY2x0ID0gTm9uZQogICAgIHJwY3BpZCA9IE5vbmUKIApAQCAtMzg1LDcgKzQzMCw3IEBACiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgc2VsZi5ycGNjbHQgPSBNeVJQQ0NsaWVudChhZGRyKQogICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlcnI6CisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yIGFzIGVycjoKICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmRpc3BsYXlfcG9ydF9iaW5kaW5nX2Vycm9yKCkKQEAgLTQwNiwyMCArNDUxLDIxIEBACiAgICAgICAgIHNlbGYucnBjY2x0Lmxpc3RlbmluZ19zb2NrLnNldHRpbWVvdXQoMTApCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHNlbGYucnBjY2x0LmFjY2VwdCgpCi0gICAgICAgIGV4Y2VwdCBzb2NrZXQudGltZW91dCwgZXJyOgorICAgICAgICBleGNlcHQgc29ja2V0LnRpbWVvdXQgYXMgZXJyOgogICAgICAgICAgICAgc2VsZi5kaXNwbGF5X25vX3N1YnByb2Nlc3NfZXJyb3IoKQogICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAgc2VsZi5ycGNjbHQucmVnaXN0ZXIoInN0ZGluIiwgc2VsZi50a2NvbnNvbGUpCisgICAgICAgIHNlbGYucnBjY2x0LnJlZ2lzdGVyKCJjb25zb2xlIiwgc2VsZi50a2NvbnNvbGUpCisgICAgICAgIHNlbGYucnBjY2x0LnJlZ2lzdGVyKCJzdGRpbiIsIHNlbGYudGtjb25zb2xlLnN0ZGluKQogICAgICAgICBzZWxmLnJwY2NsdC5yZWdpc3Rlcigic3Rkb3V0Iiwgc2VsZi50a2NvbnNvbGUuc3Rkb3V0KQogICAgICAgICBzZWxmLnJwY2NsdC5yZWdpc3Rlcigic3RkZXJyIiwgc2VsZi50a2NvbnNvbGUuc3RkZXJyKQogICAgICAgICBzZWxmLnJwY2NsdC5yZWdpc3RlcigiZmxpc3QiLCBzZWxmLnRrY29uc29sZS5mbGlzdCkKICAgICAgICAgc2VsZi5ycGNjbHQucmVnaXN0ZXIoImxpbmVjYWNoZSIsIGxpbmVjYWNoZSkKICAgICAgICAgc2VsZi5ycGNjbHQucmVnaXN0ZXIoImludGVycCIsIHNlbGYpCi0gICAgICAgIHNlbGYudHJhbnNmZXJfcGF0aCgpCisgICAgICAgIHNlbGYudHJhbnNmZXJfcGF0aCh3aXRoX2N3ZD1UcnVlKQogICAgICAgICBzZWxmLnBvbGxfc3VicHJvY2VzcygpCiAgICAgICAgIHJldHVybiBzZWxmLnJwY2NsdAogCi0gICAgZGVmIHJlc3RhcnRfc3VicHJvY2VzcyhzZWxmKToKKyAgICBkZWYgcmVzdGFydF9zdWJwcm9jZXNzKHNlbGYsIHdpdGhfY3dkPUZhbHNlKToKICAgICAgICAgaWYgc2VsZi5yZXN0YXJ0aW5nOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYucnBjY2x0CiAgICAgICAgIHNlbGYucmVzdGFydGluZyA9IFRydWUKQEAgLTQ0MCwxMCArNDg2LDExIEBACiAgICAgICAgIHNlbGYuc3Bhd25fc3VicHJvY2VzcygpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHNlbGYucnBjY2x0LmFjY2VwdCgpCi0gICAgICAgIGV4Y2VwdCBzb2NrZXQudGltZW91dCwgZXJyOgorICAgICAgICBleGNlcHQgc29ja2V0LnRpbWVvdXQgYXMgZXJyOgogICAgICAgICAgICAgc2VsZi5kaXNwbGF5X25vX3N1YnByb2Nlc3NfZXJyb3IoKQogICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAgc2VsZi50cmFuc2Zlcl9wYXRoKCkKKyAgICAgICAgc2VsZi50cmFuc2Zlcl9wYXRoKHdpdGhfY3dkPXdpdGhfY3dkKQorICAgICAgICBjb25zb2xlLnN0b3BfcmVhZGxpbmUoKQogICAgICAgICAjIGFubm90YXRlIHJlc3RhcnQgaW4gc2hlbGwgd2luZG93IGFuZCBtYXJrIGl0CiAgICAgICAgIGNvbnNvbGUudGV4dC5kZWxldGUoImlvbWFyayIsICJlbmQtMWMiKQogICAgICAgICBpZiB3YXNfZXhlY3V0aW5nOgpAQCAtNDcxLDYgKzUxOCw4IEBACiAgICAgICAgIHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYuX19yZXF1ZXN0X2ludGVycnVwdCkuc3RhcnQoKQogCiAgICAgZGVmIGtpbGxfc3VicHJvY2VzcyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fYWZ0ZXJpZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYudGtjb25zb2xlLnRleHQuYWZ0ZXJfY2FuY2VsKHNlbGYuX2FmdGVyaWQpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHNlbGYucnBjY2x0LmNsb3NlKCkKICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOiAgIyBubyBzb2NrZXQKQEAgLTQ5MywxMiArNTQyLDE4IEBACiAgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybgogCi0gICAgZGVmIHRyYW5zZmVyX3BhdGgoc2VsZik6CisgICAgZGVmIHRyYW5zZmVyX3BhdGgoc2VsZiwgd2l0aF9jd2Q9RmFsc2UpOgorICAgICAgICBpZiB3aXRoX2N3ZDogICAgICAgICMgSXNzdWUgMTM1MDYKKyAgICAgICAgICAgIHBhdGggPSBbJyddICAgICAjIGluY2x1ZGUgQ3VycmVudCBXb3JraW5nIERpcmVjdG9yeQorICAgICAgICAgICAgcGF0aC5leHRlbmQoc3lzLnBhdGgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXRoID0gc3lzLnBhdGgKKwogICAgICAgICBzZWxmLnJ1bmNvbW1hbmQoIiIiaWYgMToKICAgICAgICAgaW1wb3J0IHN5cyBhcyBfc3lzCiAgICAgICAgIF9zeXMucGF0aCA9ICVyCiAgICAgICAgIGRlbCBfc3lzCi0gICAgICAgIFxuIiIiICUgKHN5cy5wYXRoLCkpCisgICAgICAgIFxuIiIiICUgKHBhdGgsKSkKIAogICAgIGFjdGl2ZV9zZXEgPSBOb25lCiAKQEAgLTUzNyw4ICs1OTIsOCBAQAogICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgIyBSZXNjaGVkdWxlIG15c2VsZgogICAgICAgICBpZiBub3Qgc2VsZi50a2NvbnNvbGUuY2xvc2luZzoKLSAgICAgICAgICAgIHNlbGYudGtjb25zb2xlLnRleHQuYWZ0ZXIoc2VsZi50a2NvbnNvbGUucG9sbGludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBvbGxfc3VicHJvY2VzcykKKyAgICAgICAgICAgIHNlbGYuX2FmdGVyaWQgPSBzZWxmLnRrY29uc29sZS50ZXh0LmFmdGVyKAorICAgICAgICAgICAgICAgIHNlbGYudGtjb25zb2xlLnBvbGxpbnRlcnZhbCwgc2VsZi5wb2xsX3N1YnByb2Nlc3MpCiAKICAgICBkZWJ1Z2dlciA9IE5vbmUKIApAQCAtNzk1LDcgKzg1MCw3IEBACiAKIGNsYXNzIFB5U2hlbGwoT3V0cHV0V2luZG93KToKIAotICAgIHNoZWxsX3RpdGxlID0gIlB5dGhvbiBTaGVsbCIKKyAgICBzaGVsbF90aXRsZSA9ICJQeXRob24gIiArIHB5dGhvbl92ZXJzaW9uKCkgKyAiIFNoZWxsIgogCiAgICAgIyBPdmVycmlkZSBjbGFzc2VzCiAgICAgQ29sb3JEZWxlZ2F0b3IgPSBNb2RpZmllZENvbG9yRGVsZWdhdG9yCkBAIC04MTEsOCArODY2LDcgQEAKICAgICAgICAgKCJoZWxwIiwgIl9IZWxwIiksCiAgICAgXQogCi0gICAgaWYgbWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKToKLSAgICAgICAgZGVsIG1lbnVfc3BlY3NbLTNdCisgICAgaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgogICAgICAgICBtZW51X3NwZWNzWy0yXSA9ICgid2luZG93cyIsICJfV2luZG93IikKIAogCkBAIC04NTYsMTMgKzkxMCwxNCBAQAogICAgICAgICBzZWxmLnNhdmVfc3RkZXJyID0gc3lzLnN0ZGVycgogICAgICAgICBzZWxmLnNhdmVfc3RkaW4gPSBzeXMuc3RkaW4KICAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBJT0JpbmRpbmcKLSAgICAgICAgc2VsZi5zdGRvdXQgPSBQc2V1ZG9GaWxlKHNlbGYsICJzdGRvdXQiLCBJT0JpbmRpbmcuZW5jb2RpbmcpCi0gICAgICAgIHNlbGYuc3RkZXJyID0gUHNldWRvRmlsZShzZWxmLCAic3RkZXJyIiwgSU9CaW5kaW5nLmVuY29kaW5nKQotICAgICAgICBzZWxmLmNvbnNvbGUgPSBQc2V1ZG9GaWxlKHNlbGYsICJjb25zb2xlIiwgSU9CaW5kaW5nLmVuY29kaW5nKQorICAgICAgICBzZWxmLnN0ZGluID0gUHNldWRvSW5wdXRGaWxlKHNlbGYsICJzdGRpbiIsIElPQmluZGluZy5lbmNvZGluZykKKyAgICAgICAgc2VsZi5zdGRvdXQgPSBQc2V1ZG9PdXRwdXRGaWxlKHNlbGYsICJzdGRvdXQiLCBJT0JpbmRpbmcuZW5jb2RpbmcpCisgICAgICAgIHNlbGYuc3RkZXJyID0gUHNldWRvT3V0cHV0RmlsZShzZWxmLCAic3RkZXJyIiwgSU9CaW5kaW5nLmVuY29kaW5nKQorICAgICAgICBzZWxmLmNvbnNvbGUgPSBQc2V1ZG9PdXRwdXRGaWxlKHNlbGYsICJjb25zb2xlIiwgSU9CaW5kaW5nLmVuY29kaW5nKQogICAgICAgICBpZiBub3QgdXNlX3N1YnByb2Nlc3M6CiAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc2VsZi5zdGRvdXQKICAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBzZWxmLnN0ZGVycgotICAgICAgICAgICAgc3lzLnN0ZGluID0gc2VsZgorICAgICAgICAgICAgc3lzLnN0ZGluID0gc2VsZi5zdGRpbgogICAgICAgICAjCiAgICAgICAgIHNlbGYuaGlzdG9yeSA9IHNlbGYuSGlzdG9yeShzZWxmLnRleHQpCiAgICAgICAgICMKQEAgLTg3Niw2ICs5MzEsNyBAQAogICAgIGNhbmNlbGVkID0gRmFsc2UKICAgICBlbmRvZmZpbGUgPSBGYWxzZQogICAgIGNsb3NpbmcgPSBGYWxzZQorICAgIF9zdG9wX3JlYWRsaW5lX2ZsYWcgPSBGYWxzZQogCiAgICAgZGVmIHNldF93YXJuaW5nX3N0cmVhbShzZWxmLCBzdHJlYW0pOgogICAgICAgICBnbG9iYWwgd2FybmluZ19zdHJlYW0KQEAgLTk1MSwxNCArMTAwNyw5IEBACiAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYudGV4dCkKICAgICAgICAgICAgIGlmIHJlc3BvbnNlIGlzIEZhbHNlOgogICAgICAgICAgICAgICAgIHJldHVybiAiY2FuY2VsIgotICAgICAgICBpZiBzZWxmLnJlYWRpbmc6Ci0gICAgICAgICAgICBzZWxmLnRvcC5xdWl0KCkKKyAgICAgICAgc2VsZi5zdG9wX3JlYWRsaW5lKCkKICAgICAgICAgc2VsZi5jYW5jZWxlZCA9IFRydWUKICAgICAgICAgc2VsZi5jbG9zaW5nID0gVHJ1ZQotICAgICAgICAjIFdhaXQgZm9yIHBvbGxfc3VicHJvY2VzcygpIHJlc2NoZWR1bGluZyB0byBzdG9wCi0gICAgICAgIHNlbGYudGV4dC5hZnRlcigyICogc2VsZi5wb2xsaW50ZXJ2YWwsIHNlbGYuY2xvc2UyKQotCi0gICAgZGVmIGNsb3NlMihzZWxmKToKICAgICAgICAgcmV0dXJuIEVkaXRvcldpbmRvdy5jbG9zZShzZWxmKQogCiAgICAgZGVmIF9jbG9zZShzZWxmKToKQEAgLTEwMDQsNiArMTA1NSwxMiBAQAogICAgICAgICBUa2ludGVyLl9kZWZhdWx0X3Jvb3QgPSBOb25lICMgMDNKYW4wNCBLQksgV2hhdCdzIHRoaXM/CiAgICAgICAgIHJldHVybiBUcnVlCiAKKyAgICBkZWYgc3RvcF9yZWFkbGluZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYucmVhZGluZzogICMgbm8gbmVzdGVkIG1haW5sb29wIHRvIGV4aXQuCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5fc3RvcF9yZWFkbGluZV9mbGFnID0gVHJ1ZQorICAgICAgICBzZWxmLnRvcC5xdWl0KCkKKwogICAgIGRlZiByZWFkbGluZShzZWxmKToKICAgICAgICAgc2F2ZSA9IHNlbGYucmVhZGluZwogICAgICAgICB0cnk6CkBAIC0xMDExLDYgKzEwNjgsOSBAQAogICAgICAgICAgICAgc2VsZi50b3AubWFpbmxvb3AoKSAgIyBuZXN0ZWQgbWFpbmxvb3AoKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgc2VsZi5yZWFkaW5nID0gc2F2ZQorICAgICAgICBpZiBzZWxmLl9zdG9wX3JlYWRsaW5lX2ZsYWc6CisgICAgICAgICAgICBzZWxmLl9zdG9wX3JlYWRsaW5lX2ZsYWcgPSBGYWxzZQorICAgICAgICAgICAgcmV0dXJuICIiCiAgICAgICAgIGxpbmUgPSBzZWxmLnRleHQuZ2V0KCJpb21hcmsiLCAiZW5kLTFjIikKICAgICAgICAgaWYgbGVuKGxpbmUpID09IDA6ICAjIG1heSBiZSBFT0YgaWYgd2UgcXVpdCBvdXIgbWFpbmxvb3Agd2l0aCBDdHJsLUMKICAgICAgICAgICAgIGxpbmUgPSAiXG4iCkBAIC0xMjAxLDcgKzEyNjEsOCBAQAogICAgICAgICBzZWxmLnRleHQuc2VlKCJyZXN0YXJ0IikKIAogICAgIGRlZiByZXN0YXJ0X3NoZWxsKHNlbGYsIGV2ZW50PU5vbmUpOgotICAgICAgICBzZWxmLmludGVycC5yZXN0YXJ0X3N1YnByb2Nlc3MoKQorICAgICAgICAiQ2FsbGJhY2sgZm9yIFJ1bi9SZXN0YXJ0IFNoZWxsIENudGwtRjYiCisgICAgICAgIHNlbGYuaW50ZXJwLnJlc3RhcnRfc3VicHJvY2Vzcyh3aXRoX2N3ZD1UcnVlKQogCiAgICAgZGVmIHNob3dwcm9tcHQoc2VsZik6CiAgICAgICAgIHNlbGYucmVzZXRvdXRwdXQoKQpAQCAtMTIxNyw3ICsxMjc4LDcgQEAKICAgICBkZWYgcmVzZXRvdXRwdXQoc2VsZik6CiAgICAgICAgIHNvdXJjZSA9IHNlbGYudGV4dC5nZXQoImlvbWFyayIsICJlbmQtMWMiKQogICAgICAgICBpZiBzZWxmLmhpc3Rvcnk6Ci0gICAgICAgICAgICBzZWxmLmhpc3RvcnkuaGlzdG9yeV9zdG9yZShzb3VyY2UpCisgICAgICAgICAgICBzZWxmLmhpc3Rvcnkuc3RvcmUoc291cmNlKQogICAgICAgICBpZiBzZWxmLnRleHQuZ2V0KCJlbmQtMmMiKSAhPSAiXG4iOgogICAgICAgICAgICAgc2VsZi50ZXh0Lmluc2VydCgiZW5kLTFjIiwgIlxuIikKICAgICAgICAgc2VsZi50ZXh0Lm1hcmtfc2V0KCJpb21hcmsiLCAiZW5kLTFjIikKQEAgLTEyMzYsMjggKzEyOTcsMTEyIEBACiAgICAgICAgICAgICBpZiBub3QgdXNlX3N1YnByb2Nlc3M6CiAgICAgICAgICAgICAgICAgcmFpc2UgS2V5Ym9hcmRJbnRlcnJ1cHQKIAotY2xhc3MgUHNldWRvRmlsZShvYmplY3QpOgorICAgIGRlZiBybWVudV9jaGVja19jdXQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYudGV4dC5jb21wYXJlKCdzZWwuZmlyc3QnLCAnPCcsICdpb21hcmsnKToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ2Rpc2FibGVkJworICAgICAgICBleGNlcHQgVGNsRXJyb3I6ICMgbm8gc2VsZWN0aW9uLCBzbyB0aGUgaW5kZXggJ3NlbC5maXJzdCcgZG9lc24ndCBleGlzdAorICAgICAgICAgICAgcmV0dXJuICdkaXNhYmxlZCcKKyAgICAgICAgcmV0dXJuIHN1cGVyKFB5U2hlbGwsIHNlbGYpLnJtZW51X2NoZWNrX2N1dCgpCisKKyAgICBkZWYgcm1lbnVfY2hlY2tfcGFzdGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYudGV4dC5jb21wYXJlKCdpbnNlcnQnLCAnPCcsICdpb21hcmsnKToKKyAgICAgICAgICAgIHJldHVybiAnZGlzYWJsZWQnCisgICAgICAgIHJldHVybiBzdXBlcihQeVNoZWxsLCBzZWxmKS5ybWVudV9jaGVja19wYXN0ZSgpCisKK2NsYXNzIFBzZXVkb0ZpbGUoaW8uVGV4dElPQmFzZSk6CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgc2hlbGwsIHRhZ3MsIGVuY29kaW5nPU5vbmUpOgogICAgICAgICBzZWxmLnNoZWxsID0gc2hlbGwKICAgICAgICAgc2VsZi50YWdzID0gdGFncwogICAgICAgICBzZWxmLnNvZnRzcGFjZSA9IDAKLSAgICAgICAgc2VsZi5lbmNvZGluZyA9IGVuY29kaW5nCisgICAgICAgIHNlbGYuX2VuY29kaW5nID0gZW5jb2RpbmcKIAotICAgIGRlZiB3cml0ZShzZWxmLCBzKToKLSAgICAgICAgc2VsZi5zaGVsbC53cml0ZShzLCBzZWxmLnRhZ3MpCisgICAgQHByb3BlcnR5CisgICAgZGVmIGVuY29kaW5nKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZW5jb2RpbmcKIAotICAgIGRlZiB3cml0ZWxpbmVzKHNlbGYsIGxpbmVzKToKLSAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6Ci0gICAgICAgICAgICBzZWxmLndyaXRlKGxpbmUpCi0KLSAgICBkZWYgZmx1c2goc2VsZik6Ci0gICAgICAgIHBhc3MKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuICc8JXM+JyAlIHNlbGYudGFncwogCiAgICAgZGVmIGlzYXR0eShzZWxmKToKICAgICAgICAgcmV0dXJuIFRydWUKIAogCitjbGFzcyBQc2V1ZG9PdXRwdXRGaWxlKFBzZXVkb0ZpbGUpOgorCisgICAgZGVmIHdyaXRhYmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHdyaXRlKHNlbGYsIHMpOgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIndyaXRlIHRvIGNsb3NlZCBmaWxlIikKKyAgICAgICAgaWYgdHlwZShzKSBub3QgaW4gKHVuaWNvZGUsIHN0ciwgYnl0ZWFycmF5KToKKyAgICAgICAgICAgICMgU2VlIGlzc3VlICMxOTQ4MQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzLCB1bmljb2RlKToKKyAgICAgICAgICAgICAgICBzID0gdW5pY29kZS5fX2dldHNsaWNlX18ocywgTm9uZSwgTm9uZSkKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShzLCBzdHIpOgorICAgICAgICAgICAgICAgIHMgPSBzdHIuX19zdHJfXyhzKQorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHMsIGJ5dGVhcnJheSk6CisgICAgICAgICAgICAgICAgcyA9IGJ5dGVhcnJheS5fX3N0cl9fKHMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignbXVzdCBiZSBzdHJpbmcsIG5vdCAnICsgdHlwZShzKS5fX25hbWVfXykKKyAgICAgICAgcmV0dXJuIHNlbGYuc2hlbGwud3JpdGUocywgc2VsZi50YWdzKQorCisKK2NsYXNzIFBzZXVkb0lucHV0RmlsZShQc2V1ZG9GaWxlKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaGVsbCwgdGFncywgZW5jb2Rpbmc9Tm9uZSk6CisgICAgICAgIFBzZXVkb0ZpbGUuX19pbml0X18oc2VsZiwgc2hlbGwsIHRhZ3MsIGVuY29kaW5nKQorICAgICAgICBzZWxmLl9saW5lX2J1ZmZlciA9ICcnCisKKyAgICBkZWYgcmVhZGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgcmVhZChzZWxmLCBzaXplPS0xKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJyZWFkIGZyb20gY2xvc2VkIGZpbGUiKQorICAgICAgICBpZiBzaXplIGlzIE5vbmU6CisgICAgICAgICAgICBzaXplID0gLTEKKyAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShzaXplLCBpbnQpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdtdXN0IGJlIGludCwgbm90ICcgKyB0eXBlKHNpemUpLl9fbmFtZV9fKQorICAgICAgICByZXN1bHQgPSBzZWxmLl9saW5lX2J1ZmZlcgorICAgICAgICBzZWxmLl9saW5lX2J1ZmZlciA9ICcnCisgICAgICAgIGlmIHNpemUgPCAwOgorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5zaGVsbC5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGxpbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHdoaWxlIGxlbihyZXN1bHQpIDwgc2l6ZToKKyAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5zaGVsbC5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGxpbmUKKyAgICAgICAgICAgIHNlbGYuX2xpbmVfYnVmZmVyID0gcmVzdWx0W3NpemU6XQorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0WzpzaXplXQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZiwgc2l6ZT0tMSk6CisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicmVhZCBmcm9tIGNsb3NlZCBmaWxlIikKKyAgICAgICAgaWYgc2l6ZSBpcyBOb25lOgorICAgICAgICAgICAgc2l6ZSA9IC0xCisgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uoc2l6ZSwgaW50KToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignbXVzdCBiZSBpbnQsIG5vdCAnICsgdHlwZShzaXplKS5fX25hbWVfXykKKyAgICAgICAgbGluZSA9IHNlbGYuX2xpbmVfYnVmZmVyIG9yIHNlbGYuc2hlbGwucmVhZGxpbmUoKQorICAgICAgICBpZiBzaXplIDwgMDoKKyAgICAgICAgICAgIHNpemUgPSBsZW4obGluZSkKKyAgICAgICAgZW9sID0gbGluZS5maW5kKCdcbicsIDAsIHNpemUpCisgICAgICAgIGlmIGVvbCA+PSAwOgorICAgICAgICAgICAgc2l6ZSA9IGVvbCArIDEKKyAgICAgICAgc2VsZi5fbGluZV9idWZmZXIgPSBsaW5lW3NpemU6XQorICAgICAgICByZXR1cm4gbGluZVs6c2l6ZV0KKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5zaGVsbC5jbG9zZSgpCisKKwogdXNhZ2VfbXNnID0gIiIiXAogCiBVU0FHRTogaWRsZSAgWy1kZWluc10gWy10IHRpdGxlXSBbZmlsZV0qCkBAIC0xMzE0LDggKzE0NTksOSBAQAogZGVmIG1haW4oKToKICAgICBnbG9iYWwgZmxpc3QsIHJvb3QsIHVzZV9zdWJwcm9jZXNzCiAKKyAgICBjYXB0dXJlX3dhcm5pbmdzKFRydWUpCiAgICAgdXNlX3N1YnByb2Nlc3MgPSBUcnVlCi0gICAgZW5hYmxlX3NoZWxsID0gVHJ1ZQorICAgIGVuYWJsZV9zaGVsbCA9IEZhbHNlCiAgICAgZW5hYmxlX2VkaXQgPSBGYWxzZQogICAgIGRlYnVnID0gRmFsc2UKICAgICBjbWQgPSBOb25lCkBAIC0xMzIzLDcgKzE0NjksNyBAQAogICAgIHN0YXJ0dXAgPSBGYWxzZQogICAgIHRyeToKICAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAiYzpkZWlobnI6c3Q6IikKLSAgICBleGNlcHQgZ2V0b3B0LmVycm9yLCBtc2c6CisgICAgZXhjZXB0IGdldG9wdC5lcnJvciBhcyBtc2c6CiAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIkVycm9yOiAlc1xuIiAlIHN0cihtc2cpKQogICAgICAgICBzeXMuc3RkZXJyLndyaXRlKHVzYWdlX21zZykKICAgICAgICAgc3lzLmV4aXQoMikKQEAgLTEzMzYsNyArMTQ4Miw2IEBACiAgICAgICAgICAgICBlbmFibGVfc2hlbGwgPSBUcnVlCiAgICAgICAgIGlmIG8gPT0gJy1lJzoKICAgICAgICAgICAgIGVuYWJsZV9lZGl0ID0gVHJ1ZQotICAgICAgICAgICAgZW5hYmxlX3NoZWxsID0gRmFsc2UKICAgICAgICAgaWYgbyA9PSAnLWgnOgogICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSh1c2FnZV9tc2cpCiAgICAgICAgICAgICBzeXMuZXhpdCgpCkBAIC0xMzg3LDkgKzE1MzIsMjIgQEAKICAgICBlZGl0X3N0YXJ0ID0gaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywgJ0dlbmVyYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VkaXRvci1vbi1zdGFydHVwJywgdHlwZT0nYm9vbCcpCiAgICAgZW5hYmxlX2VkaXQgPSBlbmFibGVfZWRpdCBvciBlZGl0X3N0YXJ0CisgICAgZW5hYmxlX3NoZWxsID0gZW5hYmxlX3NoZWxsIG9yIG5vdCBlbmFibGVfZWRpdAogICAgICMgc3RhcnQgZWRpdG9yIGFuZC9vciBzaGVsbCB3aW5kb3dzOgogICAgIHJvb3QgPSBUayhjbGFzc05hbWU9IklkbGUiKQogCisgICAgIyBzZXQgYXBwbGljYXRpb24gaWNvbgorICAgIGljb25kaXIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgJ0ljb25zJykKKyAgICBpZiBzeXN0ZW0oKSA9PSAnV2luZG93cyc6CisgICAgICAgIGljb25maWxlID0gb3MucGF0aC5qb2luKGljb25kaXIsICdpZGxlLmljbycpCisgICAgICAgIHJvb3Qud21faWNvbmJpdG1hcChkZWZhdWx0PWljb25maWxlKQorICAgIGVsaWYgVGtWZXJzaW9uID49IDguNToKKyAgICAgICAgZXh0ID0gJy5wbmcnIGlmIFRrVmVyc2lvbiA+PSA4LjYgZWxzZSAnLmdpZicKKyAgICAgICAgaWNvbmZpbGVzID0gW29zLnBhdGguam9pbihpY29uZGlyLCAnaWRsZV8lZCVzJyAlIChzaXplLCBleHQpKQorICAgICAgICAgICAgICAgICAgICAgZm9yIHNpemUgaW4gKDE2LCAzMiwgNDgpXQorICAgICAgICBpY29ucyA9IFtQaG90b0ltYWdlKGZpbGU9aWNvbmZpbGUpIGZvciBpY29uZmlsZSBpbiBpY29uZmlsZXNdCisgICAgICAgIHJvb3QudGsuY2FsbCgnd20nLCAnaWNvbnBob3RvJywgc3RyKHJvb3QpLCAiLWRlZmF1bHQiLCAqaWNvbnMpCisKICAgICBmaXh3b3JkYnJlYWtzKHJvb3QpCiAgICAgcm9vdC53aXRoZHJhdygpCiAgICAgZmxpc3QgPSBQeVNoZWxsRmlsZUxpc3Qocm9vdCkKQEAgLTEzOTcsMjQgKzE1NTUsMjggQEAKIAogICAgIGlmIGVuYWJsZV9lZGl0OgogICAgICAgICBpZiBub3QgKGNtZCBvciBzY3JpcHQpOgotICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGFyZ3M6Ci0gICAgICAgICAgICAgICAgZmxpc3Qub3BlbihmaWxlbmFtZSkKKyAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBhcmdzWzpdOgorICAgICAgICAgICAgICAgIGlmIGZsaXN0Lm9wZW4oZmlsZW5hbWUpIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICMgZmlsZW5hbWUgaXMgYSBkaXJlY3RvcnkgYWN0dWFsbHksIGRpc2NvbnNpZGVyIGl0CisgICAgICAgICAgICAgICAgICAgIGFyZ3MucmVtb3ZlKGZpbGVuYW1lKQogICAgICAgICAgICAgaWYgbm90IGFyZ3M6CiAgICAgICAgICAgICAgICAgZmxpc3QubmV3KCkKKwogICAgIGlmIGVuYWJsZV9zaGVsbDoKICAgICAgICAgc2hlbGwgPSBmbGlzdC5vcGVuX3NoZWxsKCkKICAgICAgICAgaWYgbm90IHNoZWxsOgogICAgICAgICAgICAgcmV0dXJuICMgY291bGRuJ3Qgb3BlbiBzaGVsbAotCi0gICAgICAgIGlmIG1hY29zeFN1cHBvcnQucnVubmluZ0FzT1NYQXBwKCkgYW5kIGZsaXN0LmRpY3Q6CisgICAgICAgIGlmIG1hY29zeFN1cHBvcnQuaXNBcXVhVGsoKSBhbmQgZmxpc3QuZGljdDoKICAgICAgICAgICAgICMgT24gT1NYOiB3aGVuIHRoZSB1c2VyIGhhcyBkb3VibGUtY2xpY2tlZCBvbiBhIGZpbGUgdGhhdCBjYXVzZXMKICAgICAgICAgICAgICMgSURMRSB0byBiZSBsYXVuY2hlZCB0aGUgc2hlbGwgd2luZG93IHdpbGwgb3BlbiBqdXN0IGluIGZyb250IG9mCiAgICAgICAgICAgICAjIHRoZSBmaWxlIHNoZSB3YW50cyB0byBzZWUuIExvd2VyIHRoZSBpbnRlcnByZXRlciB3aW5kb3cgd2hlbgogICAgICAgICAgICAgIyB0aGVyZSBhcmUgb3BlbiBmaWxlcy4KICAgICAgICAgICAgIHNoZWxsLnRvcC5sb3dlcigpCisgICAgZWxzZToKKyAgICAgICAgc2hlbGwgPSBmbGlzdC5weXNoZWxsCiAKLSAgICBzaGVsbCA9IGZsaXN0LnB5c2hlbGwKLSAgICAjIGhhbmRsZSByZW1haW5pbmcgb3B0aW9uczoKKyAgICAjIEhhbmRsZSByZW1haW5pbmcgb3B0aW9ucy4gSWYgYW55IG9mIHRoZXNlIGFyZSBzZXQsIGVuYWJsZV9zaGVsbAorICAgICMgd2FzIHNldCBhbHNvLCBzbyBzaGVsbCBtdXN0IGJlIHRydWUgdG8gcmVhY2ggaGVyZS4KICAgICBpZiBkZWJ1ZzoKICAgICAgICAgc2hlbGwub3Blbl9kZWJ1Z2dlcigpCiAgICAgaWYgc3RhcnR1cDoKQEAgLTE0MjIsNyArMTU4NCw3IEBACiAgICAgICAgICAgICAgICAgICAgb3MuZW52aXJvbi5nZXQoIlBZVEhPTlNUQVJUVVAiKQogICAgICAgICBpZiBmaWxlbmFtZSBhbmQgb3MucGF0aC5pc2ZpbGUoZmlsZW5hbWUpOgogICAgICAgICAgICAgc2hlbGwuaW50ZXJwLmV4ZWNmaWxlKGZpbGVuYW1lKQotICAgIGlmIHNoZWxsIGFuZCBjbWQgb3Igc2NyaXB0OgorICAgIGlmIGNtZCBvciBzY3JpcHQ6CiAgICAgICAgIHNoZWxsLmludGVycC5ydW5jb21tYW5kKCIiImlmIDE6CiAgICAgICAgICAgICBpbXBvcnQgc3lzIGFzIF9zeXMKICAgICAgICAgICAgIF9zeXMuYXJndiA9ICVyCkBAIC0xNDMzLDE3ICsxNTk1LDIyIEBACiAgICAgICAgIGVsaWYgc2NyaXB0OgogICAgICAgICAgICAgc2hlbGwuaW50ZXJwLnByZXBlbmRfc3lzcGF0aChzY3JpcHQpCiAgICAgICAgICAgICBzaGVsbC5pbnRlcnAuZXhlY2ZpbGUoc2NyaXB0KQorICAgIGVsaWYgc2hlbGw6CisgICAgICAgICMgSWYgdGhlcmUgaXMgYSBzaGVsbCB3aW5kb3cgYW5kIG5vIGNtZCBvciBzY3JpcHQgaW4gcHJvZ3Jlc3MsCisgICAgICAgICMgY2hlY2sgZm9yIHByb2JsZW1hdGljIE9TIFggVGsgdmVyc2lvbnMgYW5kIHByaW50IGEgd2FybmluZworICAgICAgICAjIG1lc3NhZ2UgaW4gdGhlIElETEUgc2hlbGwgd2luZG93OyB0aGlzIGlzIGxlc3MgaW50cnVzaXZlCisgICAgICAgICMgdGhhbiBhbHdheXMgb3BlbmluZyBhIHNlcGFyYXRlIHdpbmRvdy4KKyAgICAgICAgdGt2ZXJzaW9ud2FybmluZyA9IG1hY29zeFN1cHBvcnQudGtWZXJzaW9uV2FybmluZyhyb290KQorICAgICAgICBpZiB0a3ZlcnNpb253YXJuaW5nOgorICAgICAgICAgICAgc2hlbGwuaW50ZXJwLnJ1bmNvbW1hbmQoInByaW50KCclcycpIiAlIHRrdmVyc2lvbndhcm5pbmcpCiAKLSAgICAjIENoZWNrIGZvciBwcm9ibGVtYXRpYyBPUyBYIFRrIHZlcnNpb25zIGFuZCBwcmludCBhIHdhcm5pbmcgbWVzc2FnZQotICAgICMgaW4gdGhlIElETEUgc2hlbGwgd2luZG93OyB0aGlzIGlzIGxlc3MgaW50cnVzaXZlIHRoYW4gYWx3YXlzIG9wZW5pbmcKLSAgICAjIGEgc2VwYXJhdGUgd2luZG93LgotICAgIHRrdmVyc2lvbndhcm5pbmcgPSBtYWNvc3hTdXBwb3J0LnRrVmVyc2lvbldhcm5pbmcocm9vdCkKLSAgICBpZiB0a3ZlcnNpb253YXJuaW5nOgotICAgICAgICBzaGVsbC5pbnRlcnAucnVuY29tbWFuZCgnJy5qb2luKCgicHJpbnQoJyIsIHRrdmVyc2lvbndhcm5pbmcsICInKSIpKSkKLQotICAgIHJvb3QubWFpbmxvb3AoKQorICAgIHdoaWxlIGZsaXN0LmludmVyc2VkaWN0OiAgIyBrZWVwIElETEUgcnVubmluZyB3aGlsZSBmaWxlcyBhcmUgb3Blbi4KKyAgICAgICAgcm9vdC5tYWlubG9vcCgpCiAgICAgcm9vdC5kZXN0cm95KCkKKyAgICBjYXB0dXJlX3dhcm5pbmdzKEZhbHNlKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHN5cy5tb2R1bGVzWydQeVNoZWxsJ10gPSBzeXMubW9kdWxlc1snX19tYWluX18nXQogICAgIG1haW4oKQorCitjYXB0dXJlX3dhcm5pbmdzKEZhbHNlKSAgIyBNYWtlIHN1cmUgdHVybmVkIG9mZjsgc2VlIGlzc3VlIDE4MDgxCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9SZXBsYWNlRGlhbG9nLnB5IGIvTGliL2lkbGVsaWIvUmVwbGFjZURpYWxvZy5weQppbmRleCAyZDZjODAyLi45YTlmNzRjIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9SZXBsYWNlRGlhbG9nLnB5CisrKyBiL0xpYi9pZGxlbGliL1JlcGxhY2VEaWFsb2cucHkKQEAgLTIsNiArMiw4IEBACiAKIGZyb20gaWRsZWxpYiBpbXBvcnQgU2VhcmNoRW5naW5lCiBmcm9tIGlkbGVsaWIuU2VhcmNoRGlhbG9nQmFzZSBpbXBvcnQgU2VhcmNoRGlhbG9nQmFzZQoraW1wb3J0IHJlCisKIAogZGVmIHJlcGxhY2UodGV4dCk6CiAgICAgcm9vdCA9IHRleHQuX3Jvb3QoKQpAQCAtMTEsNiArMTMsNyBAQAogICAgIGRpYWxvZyA9IGVuZ2luZS5fcmVwbGFjZWRpYWxvZwogICAgIGRpYWxvZy5vcGVuKHRleHQpCiAKKwogY2xhc3MgUmVwbGFjZURpYWxvZyhTZWFyY2hEaWFsb2dCYXNlKToKIAogICAgIHRpdGxlID0gIlJlcGxhY2UgRGlhbG9nIgpAQCAtMzcsNyArNDAsNyBAQAogCiAgICAgZGVmIGNyZWF0ZV9lbnRyaWVzKHNlbGYpOgogICAgICAgICBTZWFyY2hEaWFsb2dCYXNlLmNyZWF0ZV9lbnRyaWVzKHNlbGYpCi0gICAgICAgIHNlbGYucmVwbGVudCA9IHNlbGYubWFrZV9lbnRyeSgiUmVwbGFjZSB3aXRoOiIsIHNlbGYucmVwbHZhcikKKyAgICAgICAgc2VsZi5yZXBsZW50ID0gc2VsZi5tYWtlX2VudHJ5KCJSZXBsYWNlIHdpdGg6Iiwgc2VsZi5yZXBsdmFyKVswXQogCiAgICAgZGVmIGNyZWF0ZV9jb21tYW5kX2J1dHRvbnMoc2VsZik6CiAgICAgICAgIFNlYXJjaERpYWxvZ0Jhc2UuY3JlYXRlX2NvbW1hbmRfYnV0dG9ucyhzZWxmKQpAQCAtNTUsOCArNTgsMjIgQEAKIAogICAgIGRlZiBkZWZhdWx0X2NvbW1hbmQoc2VsZiwgZXZlbnQ9Tm9uZSk6CiAgICAgICAgIGlmIHNlbGYuZG9fZmluZChzZWxmLm9rKToKLSAgICAgICAgICAgIHNlbGYuZG9fcmVwbGFjZSgpCi0gICAgICAgICAgICBzZWxmLmRvX2ZpbmQoMCkKKyAgICAgICAgICAgIGlmIHNlbGYuZG9fcmVwbGFjZSgpOiAgICMgT25seSBmaW5kIG5leHQgbWF0Y2ggaWYgcmVwbGFjZSBzdWNjZWVkZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEEgYmFkIHJlIGNhbiBjYXVzZSBhIGl0IHRvIGZhaWwuCisgICAgICAgICAgICAgICAgc2VsZi5kb19maW5kKDApCisKKyAgICBkZWYgX3JlcGxhY2VfZXhwYW5kKHNlbGYsIG0sIHJlcGwpOgorICAgICAgICAiIiIgSGVscGVyIGZ1bmN0aW9uIGZvciBleHBhbmRpbmcgYSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICAgICAgICAgIGluIHRoZSByZXBsYWNlIGZpZWxkLCBpZiBuZWVkZWQuICIiIgorICAgICAgICBpZiBzZWxmLmVuZ2luZS5pc3JlKCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbmV3ID0gbS5leHBhbmQocmVwbCkKKyAgICAgICAgICAgIGV4Y2VwdCByZS5lcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmVuZ2luZS5yZXBvcnRfZXJyb3IocmVwbCwgJ0ludmFsaWQgUmVwbGFjZSBFeHByZXNzaW9uJykKKyAgICAgICAgICAgICAgICBuZXcgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuZXcgPSByZXBsCisgICAgICAgIHJldHVybiBuZXcKIAogICAgIGRlZiByZXBsYWNlX2FsbChzZWxmLCBldmVudD1Ob25lKToKICAgICAgICAgcHJvZyA9IHNlbGYuZW5naW5lLmdldHByb2coKQpAQCAtODYsNyArMTAzLDkgQEAKICAgICAgICAgICAgIGxpbmUsIG0gPSByZXMKICAgICAgICAgICAgIGNoYXJzID0gdGV4dC5nZXQoIiVkLjAiICUgbGluZSwgIiVkLjAiICUgKGxpbmUrMSkpCiAgICAgICAgICAgICBvcmlnID0gbS5ncm91cCgpCi0gICAgICAgICAgICBuZXcgPSBtLmV4cGFuZChyZXBsKQorICAgICAgICAgICAgbmV3ID0gc2VsZi5fcmVwbGFjZV9leHBhbmQobSwgcmVwbCkKKyAgICAgICAgICAgIGlmIG5ldyBpcyBOb25lOgorICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICBpLCBqID0gbS5zcGFuKCkKICAgICAgICAgICAgIGZpcnN0ID0gIiVkLiVkIiAlIChsaW5lLCBpKQogICAgICAgICAgICAgbGFzdCA9ICIlZC4lZCIgJSAobGluZSwgaikKQEAgLTEzOCw3ICsxNTcsOSBAQAogICAgICAgICBtID0gcHJvZy5tYXRjaChjaGFycywgY29sKQogICAgICAgICBpZiBub3QgcHJvZzoKICAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICBuZXcgPSBtLmV4cGFuZChzZWxmLnJlcGx2YXIuZ2V0KCkpCisgICAgICAgIG5ldyA9IHNlbGYuX3JlcGxhY2VfZXhwYW5kKG0sIHNlbGYucmVwbHZhci5nZXQoKSkKKyAgICAgICAgaWYgbmV3IGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgdGV4dC5tYXJrX3NldCgiaW5zZXJ0IiwgZmlyc3QpCiAgICAgICAgIHRleHQudW5kb19ibG9ja19zdGFydCgpCiAgICAgICAgIGlmIG0uZ3JvdXAoKToKQEAgLTE2NiwzICsxODcsMzQgQEAKICAgICBkZWYgY2xvc2Uoc2VsZiwgZXZlbnQ9Tm9uZSk6CiAgICAgICAgIFNlYXJjaERpYWxvZ0Jhc2UuY2xvc2Uoc2VsZiwgZXZlbnQpCiAgICAgICAgIHNlbGYudGV4dC50YWdfcmVtb3ZlKCJoaXQiLCAiMS4wIiwgImVuZCIpCisKK2RlZiBfcmVwbGFjZV9kaWFsb2cocGFyZW50KToKKyAgICByb290ID0gVGsoKQorICAgIHJvb3QudGl0bGUoIlRlc3QgUmVwbGFjZURpYWxvZyIpCisgICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQorICAgIHJvb3QuZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNTApKQorCisgICAgIyBtb2NrIHVuZG8gZGVsZWdhdG9yIG1ldGhvZHMKKyAgICBkZWYgdW5kb19ibG9ja19zdGFydCgpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdW5kb19ibG9ja19zdG9wKCk6CisgICAgICAgIHBhc3MKKworICAgIHRleHQgPSBUZXh0KHJvb3QpCisgICAgdGV4dC51bmRvX2Jsb2NrX3N0YXJ0ID0gdW5kb19ibG9ja19zdGFydAorICAgIHRleHQudW5kb19ibG9ja19zdG9wID0gdW5kb19ibG9ja19zdG9wCisgICAgdGV4dC5wYWNrKCkKKyAgICB0ZXh0Lmluc2VydCgiaW5zZXJ0IiwiVGhpcyBpcyBhIHNhbXBsZSBzdHJpbmcuXG4iKjEwKQorCisgICAgZGVmIHNob3dfcmVwbGFjZSgpOgorICAgICAgICB0ZXh0LnRhZ19hZGQoU0VMLCAiMS4wIiwgRU5EKQorICAgICAgICByZXBsYWNlKHRleHQpCisgICAgICAgIHRleHQudGFnX3JlbW92ZShTRUwsICIxLjAiLCBFTkQpCisKKyAgICBidXR0b24gPSBCdXR0b24ocm9vdCwgdGV4dD0iUmVwbGFjZSIsIGNvbW1hbmQ9c2hvd19yZXBsYWNlKQorICAgIGJ1dHRvbi5wYWNrKCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KKyAgICBydW4oX3JlcGxhY2VfZGlhbG9nKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvUnN0cmlwRXh0ZW5zaW9uLnB5IGIvTGliL2lkbGVsaWIvUnN0cmlwRXh0ZW5zaW9uLnB5CmluZGV4IDE5ZTM1ZDQuLjJjZTNjN2UgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1JzdHJpcEV4dGVuc2lvbi5weQorKysgYi9MaWIvaWRsZWxpYi9Sc3RyaXBFeHRlbnNpb24ucHkKQEAgLTEsMTMgKzEsOSBAQAogJ1Byb3ZpZGVzICJTdHJpcCB0cmFpbGluZyB3aGl0ZXNwYWNlIiB1bmRlciB0aGUgIkZvcm1hdCIgbWVudS4nCiAKLV9fYXV0aG9yX18gPSAiUm9nZXIgRC4gU2Vyd3kgPHJvZ2VyLnNlcnd5IGF0IGdtYWlsLmNvbT4iCi0KIGNsYXNzIFJzdHJpcEV4dGVuc2lvbjoKIAogICAgIG1lbnVkZWZzID0gWwotICAgICAgICAoJ2Zvcm1hdCcsIFtOb25lLAotICAgICAgICAgICAgICAgKCdTdHJpcCB0cmFpbGluZyB3aGl0ZXNwYWNlJywgJzw8ZG8tcnN0cmlwPj4nKSwKLSAgICAgICBdKSxdCisgICAgICAgICgnZm9ybWF0JywgW05vbmUsICgnU3RyaXAgdHJhaWxpbmcgd2hpdGVzcGFjZScsICc8PGRvLXJzdHJpcD4+JyksIF0gKSwgXQogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVkaXR3aW4pOgogICAgICAgICBzZWxmLmVkaXR3aW4gPSBlZGl0d2luCkBAIC0yMCwxMCArMTYsMTggQEAKIAogICAgICAgICB1bmRvLnVuZG9fYmxvY2tfc3RhcnQoKQogCi0gICAgICAgIGVuZF9saW5lID0gaW50KGZsb2F0KHRleHQuaW5kZXgoJ2VuZCcpKSkgKyAxCisgICAgICAgIGVuZF9saW5lID0gaW50KGZsb2F0KHRleHQuaW5kZXgoJ2VuZCcpKSkKICAgICAgICAgZm9yIGN1ciBpbiByYW5nZSgxLCBlbmRfbGluZSk6Ci0gICAgICAgICAgICB0eHQgPSB0ZXh0LmdldCgnJWkuMCcgJSBjdXIsICclaS4wIGxpbmVlbmQnICUgY3VyKQorICAgICAgICAgICAgdHh0ID0gdGV4dC5nZXQoJyVpLjAnICUgY3VyLCAnJWkuZW5kJyAlIGN1cikKKyAgICAgICAgICAgIHJhdyA9IGxlbih0eHQpCiAgICAgICAgICAgICBjdXQgPSBsZW4odHh0LnJzdHJpcCgpKQotICAgICAgICAgICAgdGV4dC5kZWxldGUoJyVpLiVpJyAlIChjdXIsIGN1dCksICclaS4wIGxpbmVlbmQnICUgY3VyKQorICAgICAgICAgICAgIyBTaW5jZSB0ZXh0LmRlbGV0ZSgpIG1hcmtzIGZpbGUgYXMgY2hhbmdlZCwgZXZlbiBpZiBub3QsCisgICAgICAgICAgICAjIG9ubHkgY2FsbCBpdCB3aGVuIG5lZWRlZCB0byBhY3R1YWxseSBkZWxldGUgc29tZXRoaW5nLgorICAgICAgICAgICAgaWYgY3V0IDwgcmF3OgorICAgICAgICAgICAgICAgIHRleHQuZGVsZXRlKCclaS4laScgJSAoY3VyLCBjdXQpLCAnJWkuZW5kJyAlIGN1cikKIAogICAgICAgICB1bmRvLnVuZG9fYmxvY2tfc3RvcCgpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgaW1wb3J0IHVuaXR0ZXN0CisgICAgdW5pdHRlc3QubWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF9yc3RyaXAnLCB2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1NjcmlwdEJpbmRpbmcucHkgYi9MaWIvaWRsZWxpYi9TY3JpcHRCaW5kaW5nLnB5CmluZGV4IDRjNmRjODIuLmFiMmEzZjIgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1NjcmlwdEJpbmRpbmcucHkKKysrIGIvTGliL2lkbGVsaWIvU2NyaXB0QmluZGluZy5weQpAQCAtNTQsNyArNTQsNyBAQAogICAgICAgICBzZWxmLmZsaXN0ID0gc2VsZi5lZGl0d2luLmZsaXN0CiAgICAgICAgIHNlbGYucm9vdCA9IHNlbGYuZWRpdHdpbi5yb290CiAKLSAgICAgICAgaWYgbWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKToKKyAgICAgICAgaWYgbWFjb3N4U3VwcG9ydC5pc0NvY29hVGsoKToKICAgICAgICAgICAgIHNlbGYuZWRpdHdpbi50ZXh0X2ZyYW1lLmJpbmQoJzw8cnVuLW1vZHVsZS1ldmVudC0yPj4nLCBzZWxmLl9ydW5fbW9kdWxlX2V2ZW50KQogCiAgICAgZGVmIGNoZWNrX21vZHVsZV9ldmVudChzZWxmLCBldmVudCk6CkBAIC03MCwxMyArNzAsMTMgQEAKICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICdyJykKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgdGFibmFubnkucHJvY2Vzc190b2tlbnModG9rZW5pemUuZ2VuZXJhdGVfdG9rZW5zKGYucmVhZGxpbmUpKQotICAgICAgICBleGNlcHQgdG9rZW5pemUuVG9rZW5FcnJvciwgbXNnOgorICAgICAgICBleGNlcHQgdG9rZW5pemUuVG9rZW5FcnJvciBhcyBtc2c6CiAgICAgICAgICAgICBtc2d0eHQsIChsaW5lbm8sIHN0YXJ0KSA9IG1zZwogICAgICAgICAgICAgc2VsZi5lZGl0d2luLmdvdG9saW5lKGxpbmVubykKICAgICAgICAgICAgIHNlbGYuZXJyb3Jib3goIlRhYm5hbm55IFRva2VuaXppbmcgRXJyb3IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiVG9rZW4gRXJyb3I6ICVzIiAlIG1zZ3R4dCkKICAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICBleGNlcHQgdGFibmFubnkuTmFubnlOYWcsIG5hZzoKKyAgICAgICAgZXhjZXB0IHRhYm5hbm55Lk5hbm55TmFnIGFzIG5hZzoKICAgICAgICAgICAgICMgVGhlIGVycm9yIG1lc3NhZ2VzIGZyb20gdGFibmFubnkgYXJlIHRvbyBjb25mdXNpbmcuLi4KICAgICAgICAgICAgIHNlbGYuZWRpdHdpbi5nb3RvbGluZShuYWcuZ2V0X2xpbmVubygpKQogICAgICAgICAgICAgc2VsZi5lcnJvcmJveCgiVGFiL3NwYWNlIGVycm9yIiwgaW5kZW50X21lc3NhZ2UpCkBAIC04Nyw5ICs4Nyw4IEBACiAgICAgICAgIHNlbGYuc2hlbGwgPSBzaGVsbCA9IHNlbGYuZmxpc3Qub3Blbl9zaGVsbCgpCiAgICAgICAgIHNhdmVkX3N0cmVhbSA9IHNoZWxsLmdldF93YXJuaW5nX3N0cmVhbSgpCiAgICAgICAgIHNoZWxsLnNldF93YXJuaW5nX3N0cmVhbShzaGVsbC5zdGRlcnIpCi0gICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAncicpCi0gICAgICAgIHNvdXJjZSA9IGYucmVhZCgpCi0gICAgICAgIGYuY2xvc2UoKQorICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICdyJykgYXMgZjoKKyAgICAgICAgICAgIHNvdXJjZSA9IGYucmVhZCgpCiAgICAgICAgIGlmICdccicgaW4gc291cmNlOgogICAgICAgICAgICAgc291cmNlID0gcmUuc3ViKHIiXHJcbiIsICJcbiIsIHNvdXJjZSkKICAgICAgICAgICAgIHNvdXJjZSA9IHJlLnN1YihyIlxyIiwgIlxuIiwgc291cmNlKQpAQCAtMTAxLDcgKzEwMCw3IEBACiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgIyBJZiBzdWNjZXNzZnVsLCByZXR1cm4gdGhlIGNvbXBpbGVkIGNvZGUKICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGlsZShzb3VyY2UsIGZpbGVuYW1lLCAiZXhlYyIpCi0gICAgICAgICAgICBleGNlcHQgKFN5bnRheEVycm9yLCBPdmVyZmxvd0Vycm9yLCBWYWx1ZUVycm9yKSwgZXJyOgorICAgICAgICAgICAgZXhjZXB0IChTeW50YXhFcnJvciwgT3ZlcmZsb3dFcnJvciwgVmFsdWVFcnJvcikgYXMgZXJyOgogICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgbXNnLCAoZXJyb3JmaWxlbmFtZSwgbGluZW5vLCBvZmZzZXQsIGxpbmUpID0gZXJyCiAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBlcnJvcmZpbGVuYW1lOgpAQCAtMTQ2LDIzICsxNDUsMjIgQEAKICAgICAgICAgICAgIHJldHVybiAnYnJlYWsnCiAgICAgICAgIGlmIG5vdCBzZWxmLnRhYm5hbm55KGZpbGVuYW1lKToKICAgICAgICAgICAgIHJldHVybiAnYnJlYWsnCi0gICAgICAgIHNoZWxsID0gc2VsZi5zaGVsbAotICAgICAgICBpbnRlcnAgPSBzaGVsbC5pbnRlcnAKKyAgICAgICAgaW50ZXJwID0gc2VsZi5zaGVsbC5pbnRlcnAKICAgICAgICAgaWYgUHlTaGVsbC51c2Vfc3VicHJvY2VzczoKLSAgICAgICAgICAgIHNoZWxsLnJlc3RhcnRfc2hlbGwoKQorICAgICAgICAgICAgaW50ZXJwLnJlc3RhcnRfc3VicHJvY2Vzcyh3aXRoX2N3ZD1GYWxzZSkKICAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguZGlybmFtZShmaWxlbmFtZSkKICAgICAgICAgIyBYWFggVG9vIG9mdGVuIHRoaXMgZGlzY2FyZHMgYXJndW1lbnRzIHRoZSB1c2VyIGp1c3Qgc2V0Li4uCiAgICAgICAgIGludGVycC5ydW5jb21tYW5kKCIiImlmIDE6Ci0gICAgICAgICAgICBfZmlsZW5hbWUgPSAlcgorICAgICAgICAgICAgX19maWxlX18gPSB7ZmlsZW5hbWUhcn0KICAgICAgICAgICAgIGltcG9ydCBzeXMgYXMgX3N5cwogICAgICAgICAgICAgZnJvbSBvcy5wYXRoIGltcG9ydCBiYXNlbmFtZSBhcyBfYmFzZW5hbWUKICAgICAgICAgICAgIGlmIChub3QgX3N5cy5hcmd2IG9yCi0gICAgICAgICAgICAgICAgX2Jhc2VuYW1lKF9zeXMuYXJndlswXSkgIT0gX2Jhc2VuYW1lKF9maWxlbmFtZSkpOgotICAgICAgICAgICAgICAgIF9zeXMuYXJndiA9IFtfZmlsZW5hbWVdCisgICAgICAgICAgICAgICAgX2Jhc2VuYW1lKF9zeXMuYXJndlswXSkgIT0gX2Jhc2VuYW1lKF9fZmlsZV9fKSk6CisgICAgICAgICAgICAgICAgX3N5cy5hcmd2ID0gW19fZmlsZV9fXQogICAgICAgICAgICAgaW1wb3J0IG9zIGFzIF9vcwotICAgICAgICAgICAgX29zLmNoZGlyKCVyKQotICAgICAgICAgICAgZGVsIF9maWxlbmFtZSwgX3N5cywgX2Jhc2VuYW1lLCBfb3MKLSAgICAgICAgICAgIFxuIiIiICUgKGZpbGVuYW1lLCBkaXJuYW1lKSkKKyAgICAgICAgICAgIF9vcy5jaGRpcih7ZGlybmFtZSFyfSkKKyAgICAgICAgICAgIGRlbCBfc3lzLCBfYmFzZW5hbWUsIF9vcworICAgICAgICAgICAgXG4iIiIuZm9ybWF0KGZpbGVuYW1lPWZpbGVuYW1lLCBkaXJuYW1lPWRpcm5hbWUpKQogICAgICAgICBpbnRlcnAucHJlcGVuZF9zeXNwYXRoKGZpbGVuYW1lKQogICAgICAgICAjIFhYWCBLQksgMDNKdWwwNCBXaGVuIHJ1biB3L28gc3VicHJvY2VzcywgcnVudGltZSB3YXJuaW5ncyBzdGlsbAogICAgICAgICAjICAgICAgICAgZ28gdG8gX19zdGRlcnJfXy4gIFdpdGggc3VicHJvY2VzcywgdGhleSBnbyB0byB0aGUgc2hlbGwuCkBAIC0xNzAsNyArMTY4LDcgQEAKICAgICAgICAgaW50ZXJwLnJ1bmNvZGUoY29kZSkKICAgICAgICAgcmV0dXJuICdicmVhaycKIAotICAgIGlmIG1hY29zeFN1cHBvcnQucnVubmluZ0FzT1NYQXBwKCk6CisgICAgaWYgbWFjb3N4U3VwcG9ydC5pc0NvY29hVGsoKToKICAgICAgICAgIyBUay1Db2NvYSBpbiBNYWNPU1ggaXMgYnJva2VuIHVudGlsIGF0IGxlYXN0CiAgICAgICAgICMgVGsgOC41LjksIGFuZCB3aXRob3V0IHRoaXMgcmF0aGVyCiAgICAgICAgICMgY3J1ZGUgd29ya2Fyb3VuZCBJRExFIHdvdWxkIGhhbmcgd2hlbiBhIHVzZXIKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1Njcm9sbGVkTGlzdC5weSBiL0xpYi9pZGxlbGliL1Njcm9sbGVkTGlzdC5weQppbmRleCA5MjExOTM2Li5lMjM1NjYxIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9TY3JvbGxlZExpc3QucHkKKysrIGIvTGliL2lkbGVsaWIvU2Nyb2xsZWRMaXN0LnB5CkBAIC0xMTksMjEgKzExOSwyMiBAQAogICAgICAgICBwYXNzCiAKIAotZGVmIHRlc3QoKToKK2RlZiBfc2Nyb2xsZWRfbGlzdChwYXJlbnQpOgogICAgIHJvb3QgPSBUaygpCi0gICAgcm9vdC5wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsIHJvb3QuZGVzdHJveSkKKyAgICByb290LnRpdGxlKCJUZXN0IFNjcm9sbGVkTGlzdCIpCisgICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQorICAgIHJvb3QuZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNTApKQogICAgIGNsYXNzIE15U2Nyb2xsZWRMaXN0KFNjcm9sbGVkTGlzdCk6Ci0gICAgICAgIGRlZiBmaWxsX21lbnUoc2VsZik6IHNlbGYubWVudS5hZGRfY29tbWFuZChsYWJlbD0icGFzcyIpCisgICAgICAgIGRlZiBmaWxsX21lbnUoc2VsZik6IHNlbGYubWVudS5hZGRfY29tbWFuZChsYWJlbD0icmlnaHQgY2xpY2siKQogICAgICAgICBkZWYgb25fc2VsZWN0KHNlbGYsIGluZGV4KTogcHJpbnQgInNlbGVjdCIsIHNlbGYuZ2V0KGluZGV4KQogICAgICAgICBkZWYgb25fZG91YmxlKHNlbGYsIGluZGV4KTogcHJpbnQgImRvdWJsZSIsIHNlbGYuZ2V0KGluZGV4KQotICAgIHMgPSBNeVNjcm9sbGVkTGlzdChyb290KQotICAgIGZvciBpIGluIHJhbmdlKDMwKToKLSAgICAgICAgcy5hcHBlbmQoIml0ZW0gJTAyZCIgJSBpKQotICAgIHJldHVybiByb290CiAKLWRlZiBtYWluKCk6Ci0gICAgcm9vdCA9IHRlc3QoKQorICAgIHNjcm9sbGVkX2xpc3QgPSBNeVNjcm9sbGVkTGlzdChyb290KQorICAgIGZvciBpIGluIHJhbmdlKDMwKToKKyAgICAgICAgc2Nyb2xsZWRfbGlzdC5hcHBlbmQoIkl0ZW0gJTAyZCIgJSBpKQorCiAgICAgcm9vdC5tYWlubG9vcCgpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgbWFpbigpCisgICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuCisgICAgcnVuKF9zY3JvbGxlZF9saXN0KQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvU2VhcmNoRGlhbG9nLnB5IGIvTGliL2lkbGVsaWIvU2VhcmNoRGlhbG9nLnB5CmluZGV4IDdjNzBiODQuLjJhYWRiODQgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1NlYXJjaERpYWxvZy5weQorKysgYi9MaWIvaWRsZWxpYi9TZWFyY2hEaWFsb2cucHkKQEAgLTI0LDEzICsyNCwxMiBAQAogCiAgICAgZGVmIGNyZWF0ZV93aWRnZXRzKHNlbGYpOgogICAgICAgICBmID0gU2VhcmNoRGlhbG9nQmFzZS5jcmVhdGVfd2lkZ2V0cyhzZWxmKQotICAgICAgICBzZWxmLm1ha2VfYnV0dG9uKCJGaW5kIiwgc2VsZi5kZWZhdWx0X2NvbW1hbmQsIDEpCisgICAgICAgIHNlbGYubWFrZV9idXR0b24oIkZpbmQgTmV4dCIsIHNlbGYuZGVmYXVsdF9jb21tYW5kLCAxKQogCiAgICAgZGVmIGRlZmF1bHRfY29tbWFuZChzZWxmLCBldmVudD1Ob25lKToKICAgICAgICAgaWYgbm90IHNlbGYuZW5naW5lLmdldHByb2coKToKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBpZiBzZWxmLmZpbmRfYWdhaW4oc2VsZi50ZXh0KToKLSAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICBzZWxmLmZpbmRfYWdhaW4oc2VsZi50ZXh0KQogCiAgICAgZGVmIGZpbmRfYWdhaW4oc2VsZiwgdGV4dCk6CiAgICAgICAgIGlmIG5vdCBzZWxmLmVuZ2luZS5nZXRwYXQoKToKQEAgLTY2LDMgKzY1LDI1IEBACiAgICAgICAgIGlmIHBhdDoKICAgICAgICAgICAgIHNlbGYuZW5naW5lLnNldGNvb2tlZHBhdChwYXQpCiAgICAgICAgIHJldHVybiBzZWxmLmZpbmRfYWdhaW4odGV4dCkKKworZGVmIF9zZWFyY2hfZGlhbG9nKHBhcmVudCk6CisgICAgcm9vdCA9IFRrKCkKKyAgICByb290LnRpdGxlKCJUZXN0IFNlYXJjaERpYWxvZyIpCisgICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQorICAgIHJvb3QuZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNTApKQorICAgIHRleHQgPSBUZXh0KHJvb3QpCisgICAgdGV4dC5wYWNrKCkKKyAgICB0ZXh0Lmluc2VydCgiaW5zZXJ0IiwiVGhpcyBpcyBhIHNhbXBsZSBzdHJpbmcuXG4iKjEwKQorCisgICAgZGVmIHNob3dfZmluZCgpOgorICAgICAgICB0ZXh0LnRhZ19hZGQoU0VMLCAiMS4wIiwgRU5EKQorICAgICAgICBzID0gX3NldHVwKHRleHQpCisgICAgICAgIHMub3Blbih0ZXh0KQorICAgICAgICB0ZXh0LnRhZ19yZW1vdmUoU0VMLCAiMS4wIiwgRU5EKQorCisgICAgYnV0dG9uID0gQnV0dG9uKHJvb3QsIHRleHQ9IlNlYXJjaCIsIGNvbW1hbmQ9c2hvd19maW5kKQorICAgIGJ1dHRvbi5wYWNrKCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KKyAgICBydW4oX3NlYXJjaF9kaWFsb2cpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9TZWFyY2hEaWFsb2dCYXNlLnB5IGIvTGliL2lkbGVsaWIvU2VhcmNoRGlhbG9nQmFzZS5weQppbmRleCBmNjNlN2FlLi42NTFlN2Y0IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9TZWFyY2hEaWFsb2dCYXNlLnB5CisrKyBiL0xpYi9pZGxlbGliL1NlYXJjaERpYWxvZ0Jhc2UucHkKQEAgLTEsMTcgKzEsNTEgQEAKLWZyb20gVGtpbnRlciBpbXBvcnQgKgorJycnRGVmaW5lIFNlYXJjaERpYWxvZ0Jhc2UgdXNlZCBieSBTZWFyY2gsIFJlcGxhY2UsIGFuZCBHcmVwIGRpYWxvZ3MuJycnCisKK2Zyb20gVGtpbnRlciBpbXBvcnQgKFRvcGxldmVsLCBGcmFtZSwgRW50cnksIExhYmVsLCBCdXR0b24sCisgICAgICAgICAgICAgICAgICAgICBDaGVja2J1dHRvbiwgUmFkaW9idXR0b24pCiAKIGNsYXNzIFNlYXJjaERpYWxvZ0Jhc2U6CisgICAgJycnQ3JlYXRlIG1vc3Qgb2YgYSAzIG9yIDQgcm93LCAzIGNvbHVtbiBzZWFyY2ggZGlhbG9nLgogCi0gICAgdGl0bGUgPSAiU2VhcmNoIERpYWxvZyIKKyAgICBUaGUgbGVmdCBhbmQgd2lkZSBtaWRkbGUgY29sdW1uIGNvbnRhaW46CisgICAgMSBvciAyIGxhYmVsZWQgdGV4dCBlbnRyeSBsaW5lcyAobWFrZV9lbnRyeSwgY3JlYXRlX2VudHJpZXMpOworICAgIGEgcm93IG9mIHN0YW5kYXJkIENoZWNrYnV0dG9ucyAobWFrZV9mcmFtZSwgY3JlYXRlX29wdGlvbl9idXR0b25zKSwKKyAgICBlYWNoIG9mIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGEgc2VhcmNoIGVuZ2luZSBWYXJpYWJsZTsKKyAgICBhIHJvdyBvZiBkaWFsb2ctc3BlY2lmaWMgQ2hlY2svUmFkaW9idXR0b25zIChjcmVhdGVfb3RoZXJfYnV0dG9ucykuCisKKyAgICBUaGUgbmFycm93IHJpZ2h0IGNvbHVtbiBjb250YWlucyBjb21tYW5kIGJ1dHRvbnMKKyAgICAobWFrZV9idXR0b24sIGNyZWF0ZV9jb21tYW5kX2J1dHRvbnMpLgorICAgIFRoZXNlIGFyZSBib3VuZCB0byBmdW5jdGlvbnMgdGhhdCBleGVjdXRlIHRoZSBjb21tYW5kLgorCisgICAgRXhjZXB0IGZvciBjb21tYW5kIGJ1dHRvbnMsIHRoaXMgYmFzZSBjbGFzcyBpcyBub3QgbGltaXRlZCB0byBpdGVtcworICAgIGNvbW1vbiB0byBhbGwgdGhyZWUgc3ViY2xhc3Nlcy4gIFJhdGhlciwgaXQgaXMgdGhlIEZpbmQgZGlhbG9nIG1pbnVzCisgICAgdGhlICJGaW5kIE5leHQiIGNvbW1hbmQsIGl0cyBleGVjdXRpb24gZnVuY3Rpb24sIGFuZCB0aGUKKyAgICBkZWZhdWx0X2NvbW1hbmQgYXR0cmlidXRlIG5lZWRlZCBpbiBjcmVhdGVfd2lkZ2V0cy4gVGhlIG90aGVyCisgICAgZGlhbG9ncyBvdmVycmlkZSBhdHRyaWJ1dGVzIGFuZCBtZXRob2RzLCB0aGUgbGF0dGVyIHRvIHJlcGxhY2UgYW5kCisgICAgYWRkIHdpZGdldHMuCisgICAgJycnCisKKyAgICB0aXRsZSA9ICJTZWFyY2ggRGlhbG9nIiAgIyByZXBsYWNlIGluIHN1YmNsYXNzZXMKICAgICBpY29uID0gIlNlYXJjaCIKLSAgICBuZWVkd3JhcGJ1dHRvbiA9IDEKKyAgICBuZWVkd3JhcGJ1dHRvbiA9IDEgICMgbm90IGluIEZpbmQgaW4gRmlsZXMKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb290LCBlbmdpbmUpOgorICAgICAgICAnJydJbml0aWFsaXplIHJvb3QsIGVuZ2luZSwgYW5kIHRvcCBhdHRyaWJ1dGVzLgorCisgICAgICAgIHRvcCAobGV2ZWwgd2lkZ2V0KTogc2V0IGluIGNyZWF0ZV93aWRnZXRzKCkgY2FsbGVkIGZyb20gb3BlbigpLgorICAgICAgICB0ZXh0IChUZXh0IHNlYXJjaGVkKTogc2V0IGluIG9wZW4oKSwgb25seSB1c2VkIGluIHN1YmNsYXNzZXMoKS4KKyAgICAgICAgZW50IChyeSk6IGNyZWF0ZWQgaW4gbWFrZV9lbnRyeSgpIGNhbGxlZCBmcm9tIGNyZWF0ZV9lbnRyeSgpLgorICAgICAgICByb3cgKG9mIGdyaWQpOiAwIGluIGNyZWF0ZV93aWRnZXRzKCksICsxIGluIG1ha2VfZW50cnkvZnJhbWUoKS4KKyAgICAgICAgZGVmYXVsdF9jb21tYW5kOiBzZXQgaW4gc3ViY2xhc3NlcywgdXNlZCBpbiBjcmVhdGVfd2lkZ2VycygpLgorCisgICAgICAgIHRpdGxlIChvZiBkaWFsb2cpOiBjbGFzcyBhdHRyaWJ1dGUsIG92ZXJyaWRlIGluIHN1YmNsYXNzZXMuCisgICAgICAgIGljb24gKG9mIGRpYWxvZyk6IGRpdHRvLCB1c2UgdW5jbGVhciBpZiBjYW5ub3QgbWluaW1pemUgZGlhbG9nLgorICAgICAgICAnJycKICAgICAgICAgc2VsZi5yb290ID0gcm9vdAogICAgICAgICBzZWxmLmVuZ2luZSA9IGVuZ2luZQogICAgICAgICBzZWxmLnRvcCA9IE5vbmUKIAogICAgIGRlZiBvcGVuKHNlbGYsIHRleHQsIHNlYXJjaHBocmFzZT1Ob25lKToKKyAgICAgICAgIk1ha2UgZGlhbG9nIHZpc2libGUgb24gdG9wIG9mIG90aGVycyBhbmQgcmVhZHkgdG8gdXNlLiIKICAgICAgICAgc2VsZi50ZXh0ID0gdGV4dAogICAgICAgICBpZiBub3Qgc2VsZi50b3A6CiAgICAgICAgICAgICBzZWxmLmNyZWF0ZV93aWRnZXRzKCkKQEAgLTI3LDExICs2MSwxNyBAQAogICAgICAgICBzZWxmLnRvcC5ncmFiX3NldCgpCiAKICAgICBkZWYgY2xvc2Uoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgICJQdXQgZGlhbG9nIGF3YXkgZm9yIGxhdGVyIHVzZS4iCiAgICAgICAgIGlmIHNlbGYudG9wOgogICAgICAgICAgICAgc2VsZi50b3AuZ3JhYl9yZWxlYXNlKCkKICAgICAgICAgICAgIHNlbGYudG9wLndpdGhkcmF3KCkKIAogICAgIGRlZiBjcmVhdGVfd2lkZ2V0cyhzZWxmKToKKyAgICAgICAgJycnQ3JlYXRlIGJhc2ljIDMgcm93IHggMyBjb2wgc2VhcmNoIChmaW5kKSBkaWFsb2cuCisKKyAgICAgICAgT3RoZXIgZGlhbG9ncyBvdmVycmlkZSBzdWJzaWRpYXJ5IGNyZWF0ZV94IG1ldGhvZHMgYXMgbmVlZGVkLgorICAgICAgICBSZXBsYWNlIGFuZCBGaW5kLWluLUZpbGVzIGFkZCBhbm90aGVyIGVudHJ5IHJvdy4KKyAgICAgICAgJycnCiAgICAgICAgIHRvcCA9IFRvcGxldmVsKHNlbGYucm9vdCkKICAgICAgICAgdG9wLmJpbmQoIjxSZXR1cm4+Iiwgc2VsZi5kZWZhdWx0X2NvbW1hbmQpCiAgICAgICAgIHRvcC5iaW5kKCI8RXNjYXBlPiIsIHNlbGYuY2xvc2UpCkBAIC00NCwyOSArODQsODQgQEAKICAgICAgICAgc2VsZi50b3AuZ3JpZF9jb2x1bW5jb25maWd1cmUoMCwgcGFkPTIsIHdlaWdodD0wKQogICAgICAgICBzZWxmLnRvcC5ncmlkX2NvbHVtbmNvbmZpZ3VyZSgxLCBwYWQ9MiwgbWluc2l6ZT0xMDAsIHdlaWdodD0xMDApCiAKLSAgICAgICAgc2VsZi5jcmVhdGVfZW50cmllcygpCi0gICAgICAgIHNlbGYuY3JlYXRlX29wdGlvbl9idXR0b25zKCkKLSAgICAgICAgc2VsZi5jcmVhdGVfb3RoZXJfYnV0dG9ucygpCi0gICAgICAgIHJldHVybiBzZWxmLmNyZWF0ZV9jb21tYW5kX2J1dHRvbnMoKQorICAgICAgICBzZWxmLmNyZWF0ZV9lbnRyaWVzKCkgICMgcm93IDAgKGFuZCBtYXliZSAxKSwgY29scyAwLCAxCisgICAgICAgIHNlbGYuY3JlYXRlX29wdGlvbl9idXR0b25zKCkgICMgbmV4dCByb3csIGNvbHMgMCwgMQorICAgICAgICBzZWxmLmNyZWF0ZV9vdGhlcl9idXR0b25zKCkgICMgbmV4dCByb3csIGNvbHMgMCwgMQorICAgICAgICBzZWxmLmNyZWF0ZV9jb21tYW5kX2J1dHRvbnMoKSAgIyBjb2wgMiwgYWxsIHJvd3MKIAotICAgIGRlZiBtYWtlX2VudHJ5KHNlbGYsIGxhYmVsLCB2YXIpOgotICAgICAgICBsID0gTGFiZWwoc2VsZi50b3AsIHRleHQ9bGFiZWwpCi0gICAgICAgIGwuZ3JpZChyb3c9c2VsZi5yb3csIGNvbHVtbj0wLCBzdGlja3k9Im53IikKLSAgICAgICAgZSA9IEVudHJ5KHNlbGYudG9wLCB0ZXh0dmFyaWFibGU9dmFyLCBleHBvcnRzZWxlY3Rpb249MCkKLSAgICAgICAgZS5ncmlkKHJvdz1zZWxmLnJvdywgY29sdW1uPTEsIHN0aWNreT0ibndlIikKKyAgICBkZWYgbWFrZV9lbnRyeShzZWxmLCBsYWJlbF90ZXh0LCB2YXIpOgorICAgICAgICAnJydSZXR1cm4gKGVudHJ5LCBsYWJlbCksIC4KKworICAgICAgICBlbnRyeSAtIGdyaWRkZWQgbGFiZWxlZCBFbnRyeSBmb3IgdGV4dCBlbnRyeS4KKyAgICAgICAgbGFiZWwgLSBMYWJlbCB3aWRnZXQsIHJldHVybmVkIGZvciB0ZXN0aW5nLgorICAgICAgICAnJycKKyAgICAgICAgbGFiZWwgPSBMYWJlbChzZWxmLnRvcCwgdGV4dD1sYWJlbF90ZXh0KQorICAgICAgICBsYWJlbC5ncmlkKHJvdz1zZWxmLnJvdywgY29sdW1uPTAsIHN0aWNreT0ibnciKQorICAgICAgICBlbnRyeSA9IEVudHJ5KHNlbGYudG9wLCB0ZXh0dmFyaWFibGU9dmFyLCBleHBvcnRzZWxlY3Rpb249MCkKKyAgICAgICAgZW50cnkuZ3JpZChyb3c9c2VsZi5yb3csIGNvbHVtbj0xLCBzdGlja3k9Im53ZSIpCiAgICAgICAgIHNlbGYucm93ID0gc2VsZi5yb3cgKyAxCi0gICAgICAgIHJldHVybiBlCisgICAgICAgIHJldHVybiBlbnRyeSwgbGFiZWwKKworICAgIGRlZiBjcmVhdGVfZW50cmllcyhzZWxmKToKKyAgICAgICAgIkNyZWF0ZSBvbmUgb3IgbW9yZSBlbnRyeSBsaW5lcyB3aXRoIG1ha2VfZW50cnkuIgorICAgICAgICBzZWxmLmVudCA9IHNlbGYubWFrZV9lbnRyeSgiRmluZDoiLCBzZWxmLmVuZ2luZS5wYXR2YXIpWzBdCiAKICAgICBkZWYgbWFrZV9mcmFtZShzZWxmLGxhYmVsdGV4dD1Ob25lKToKKyAgICAgICAgJycnUmV0dXJuIChmcmFtZSwgbGFiZWwpLgorCisgICAgICAgIGZyYW1lIC0gZ3JpZGRlZCBsYWJlbGVkIEZyYW1lIGZvciBvcHRpb24gb3Igb3RoZXIgYnV0dG9ucy4KKyAgICAgICAgbGFiZWwgLSBMYWJlbCB3aWRnZXQsIHJldHVybmVkIGZvciB0ZXN0aW5nLgorICAgICAgICAnJycKICAgICAgICAgaWYgbGFiZWx0ZXh0OgotICAgICAgICAgICAgbCA9IExhYmVsKHNlbGYudG9wLCB0ZXh0PWxhYmVsdGV4dCkKLSAgICAgICAgICAgIGwuZ3JpZChyb3c9c2VsZi5yb3csIGNvbHVtbj0wLCBzdGlja3k9Im53IikKLSAgICAgICAgZiA9IEZyYW1lKHNlbGYudG9wKQotICAgICAgICBmLmdyaWQocm93PXNlbGYucm93LCBjb2x1bW49MSwgY29sdW1uc3Bhbj0xLCBzdGlja3k9Im53ZSIpCisgICAgICAgICAgICBsYWJlbCA9IExhYmVsKHNlbGYudG9wLCB0ZXh0PWxhYmVsdGV4dCkKKyAgICAgICAgICAgIGxhYmVsLmdyaWQocm93PXNlbGYucm93LCBjb2x1bW49MCwgc3RpY2t5PSJudyIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsYWJlbCA9ICcnCisgICAgICAgIGZyYW1lID0gRnJhbWUoc2VsZi50b3ApCisgICAgICAgIGZyYW1lLmdyaWQocm93PXNlbGYucm93LCBjb2x1bW49MSwgY29sdW1uc3Bhbj0xLCBzdGlja3k9Im53ZSIpCiAgICAgICAgIHNlbGYucm93ID0gc2VsZi5yb3cgKyAxCi0gICAgICAgIHJldHVybiBmCisgICAgICAgIHJldHVybiBmcmFtZSwgbGFiZWwKKworICAgIGRlZiBjcmVhdGVfb3B0aW9uX2J1dHRvbnMoc2VsZik6CisgICAgICAgICcnJ1JldHVybiAoZmlsbGVkIGZyYW1lLCBvcHRpb25zKSBmb3IgdGVzdGluZy4KKworICAgICAgICBPcHRpb25zIGlzIGEgbGlzdCBvZiBTZWFyY2hFbmdpbmUgYm9vbGVhbnZhciwgbGFiZWwgcGFpcnMuCisgICAgICAgIEEgZ3JpZGRlZCBmcmFtZSBmcm9tIG1ha2VfZnJhbWUgaXMgZmlsbGVkIHdpdGggYSBDaGVja2J1dHRvbgorICAgICAgICBmb3IgZWFjaCBwYWlyLCBib3VuZCB0byB0aGUgdmFyLCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGxhYmVsLgorICAgICAgICAnJycKKyAgICAgICAgZnJhbWUgPSBzZWxmLm1ha2VfZnJhbWUoIk9wdGlvbnMiKVswXQorICAgICAgICBlbmdpbmUgPSBzZWxmLmVuZ2luZQorICAgICAgICBvcHRpb25zID0gWyhlbmdpbmUucmV2YXIsICJSZWd1bGFyIGV4cHJlc3Npb24iKSwKKyAgICAgICAgICAgICAgICAgICAoZW5naW5lLmNhc2V2YXIsICJNYXRjaCBjYXNlIiksCisgICAgICAgICAgICAgICAgICAgKGVuZ2luZS53b3JkdmFyLCAiV2hvbGUgd29yZCIpXQorICAgICAgICBpZiBzZWxmLm5lZWR3cmFwYnV0dG9uOgorICAgICAgICAgICAgb3B0aW9ucy5hcHBlbmQoKGVuZ2luZS53cmFwdmFyLCAiV3JhcCBhcm91bmQiKSkKKyAgICAgICAgZm9yIHZhciwgbGFiZWwgaW4gb3B0aW9uczoKKyAgICAgICAgICAgIGJ0biA9IENoZWNrYnV0dG9uKGZyYW1lLCBhbmNob3I9InciLCB2YXJpYWJsZT12YXIsIHRleHQ9bGFiZWwpCisgICAgICAgICAgICBidG4ucGFjayhzaWRlPSJsZWZ0IiwgZmlsbD0iYm90aCIpCisgICAgICAgICAgICBpZiB2YXIuZ2V0KCk6CisgICAgICAgICAgICAgICAgYnRuLnNlbGVjdCgpCisgICAgICAgIHJldHVybiBmcmFtZSwgb3B0aW9ucworCisgICAgZGVmIGNyZWF0ZV9vdGhlcl9idXR0b25zKHNlbGYpOgorICAgICAgICAnJydSZXR1cm4gKGZyYW1lLCBvdGhlcnMpIGZvciB0ZXN0aW5nLgorCisgICAgICAgIE90aGVycyBpcyBhIGxpc3Qgb2YgdmFsdWUsIGxhYmVsIHBhaXJzLgorICAgICAgICBBIGdyaWRkZWQgZnJhbWUgZnJvbSBtYWtlX2ZyYW1lIGlzIGZpbGxlZCB3aXRoIHJhZGlvIGJ1dHRvbnMuCisgICAgICAgICcnJworICAgICAgICBmcmFtZSA9IHNlbGYubWFrZV9mcmFtZSgiRGlyZWN0aW9uIilbMF0KKyAgICAgICAgdmFyID0gc2VsZi5lbmdpbmUuYmFja3ZhcgorICAgICAgICBvdGhlcnMgPSBbKDEsICdVcCcpLCAoMCwgJ0Rvd24nKV0KKyAgICAgICAgZm9yIHZhbCwgbGFiZWwgaW4gb3RoZXJzOgorICAgICAgICAgICAgYnRuID0gUmFkaW9idXR0b24oZnJhbWUsIGFuY2hvcj0idyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZT12YXIsIHZhbHVlPXZhbCwgdGV4dD1sYWJlbCkKKyAgICAgICAgICAgIGJ0bi5wYWNrKHNpZGU9ImxlZnQiLCBmaWxsPSJib3RoIikKKyAgICAgICAgICAgIGlmIHZhci5nZXQoKSA9PSB2YWw6CisgICAgICAgICAgICAgICAgYnRuLnNlbGVjdCgpCisgICAgICAgIHJldHVybiBmcmFtZSwgb3RoZXJzCiAKICAgICBkZWYgbWFrZV9idXR0b24oc2VsZiwgbGFiZWwsIGNvbW1hbmQsIGlzZGVmPTApOgorICAgICAgICAiUmV0dXJuIGNvbW1hbmQgYnV0dG9uIGdyaWRkZWQgaW4gY29tbWFuZCBmcmFtZS4iCiAgICAgICAgIGIgPSBCdXR0b24oc2VsZi5idXR0b25mcmFtZSwKICAgICAgICAgICAgICAgICAgICB0ZXh0PWxhYmVsLCBjb21tYW5kPWNvbW1hbmQsCiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1pc2RlZiBhbmQgImFjdGl2ZSIgb3IgIm5vcm1hbCIpCkBAIC03NSw2NiArMTcwLDE1IEBACiAgICAgICAgIHNlbGYuYnV0dG9uZnJhbWUuZ3JpZChyb3dzcGFuPXJvd3MrMSkKICAgICAgICAgcmV0dXJuIGIKIAotICAgIGRlZiBjcmVhdGVfZW50cmllcyhzZWxmKToKLSAgICAgICAgc2VsZi5lbnQgPSBzZWxmLm1ha2VfZW50cnkoIkZpbmQ6Iiwgc2VsZi5lbmdpbmUucGF0dmFyKQotCi0gICAgZGVmIGNyZWF0ZV9vcHRpb25fYnV0dG9ucyhzZWxmKToKLSAgICAgICAgZiA9IHNlbGYubWFrZV9mcmFtZSgiT3B0aW9ucyIpCi0KLSAgICAgICAgYnRuID0gQ2hlY2tidXR0b24oZiwgYW5jaG9yPSJ3IiwKLSAgICAgICAgICAgICAgICB2YXJpYWJsZT1zZWxmLmVuZ2luZS5yZXZhciwKLSAgICAgICAgICAgICAgICB0ZXh0PSJSZWd1bGFyIGV4cHJlc3Npb24iKQotICAgICAgICBidG4ucGFjayhzaWRlPSJsZWZ0IiwgZmlsbD0iYm90aCIpCi0gICAgICAgIGlmIHNlbGYuZW5naW5lLmlzcmUoKToKLSAgICAgICAgICAgIGJ0bi5zZWxlY3QoKQotCi0gICAgICAgIGJ0biA9IENoZWNrYnV0dG9uKGYsIGFuY2hvcj0idyIsCi0gICAgICAgICAgICAgICAgdmFyaWFibGU9c2VsZi5lbmdpbmUuY2FzZXZhciwKLSAgICAgICAgICAgICAgICB0ZXh0PSJNYXRjaCBjYXNlIikKLSAgICAgICAgYnRuLnBhY2soc2lkZT0ibGVmdCIsIGZpbGw9ImJvdGgiKQotICAgICAgICBpZiBzZWxmLmVuZ2luZS5pc2Nhc2UoKToKLSAgICAgICAgICAgIGJ0bi5zZWxlY3QoKQotCi0gICAgICAgIGJ0biA9IENoZWNrYnV0dG9uKGYsIGFuY2hvcj0idyIsCi0gICAgICAgICAgICAgICAgdmFyaWFibGU9c2VsZi5lbmdpbmUud29yZHZhciwKLSAgICAgICAgICAgICAgICB0ZXh0PSJXaG9sZSB3b3JkIikKLSAgICAgICAgYnRuLnBhY2soc2lkZT0ibGVmdCIsIGZpbGw9ImJvdGgiKQotICAgICAgICBpZiBzZWxmLmVuZ2luZS5pc3dvcmQoKToKLSAgICAgICAgICAgIGJ0bi5zZWxlY3QoKQotCi0gICAgICAgIGlmIHNlbGYubmVlZHdyYXBidXR0b246Ci0gICAgICAgICAgICBidG4gPSBDaGVja2J1dHRvbihmLCBhbmNob3I9InciLAotICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZT1zZWxmLmVuZ2luZS53cmFwdmFyLAotICAgICAgICAgICAgICAgICAgICB0ZXh0PSJXcmFwIGFyb3VuZCIpCi0gICAgICAgICAgICBidG4ucGFjayhzaWRlPSJsZWZ0IiwgZmlsbD0iYm90aCIpCi0gICAgICAgICAgICBpZiBzZWxmLmVuZ2luZS5pc3dyYXAoKToKLSAgICAgICAgICAgICAgICBidG4uc2VsZWN0KCkKLQotICAgIGRlZiBjcmVhdGVfb3RoZXJfYnV0dG9ucyhzZWxmKToKLSAgICAgICAgZiA9IHNlbGYubWFrZV9mcmFtZSgiRGlyZWN0aW9uIikKLQotICAgICAgICAjbGJsID0gTGFiZWwoZiwgdGV4dD0iRGlyZWN0aW9uOiAiKQotICAgICAgICAjbGJsLnBhY2soc2lkZT0ibGVmdCIpCi0KLSAgICAgICAgYnRuID0gUmFkaW9idXR0b24oZiwgYW5jaG9yPSJ3IiwKLSAgICAgICAgICAgICAgICB2YXJpYWJsZT1zZWxmLmVuZ2luZS5iYWNrdmFyLCB2YWx1ZT0xLAotICAgICAgICAgICAgICAgIHRleHQ9IlVwIikKLSAgICAgICAgYnRuLnBhY2soc2lkZT0ibGVmdCIsIGZpbGw9ImJvdGgiKQotICAgICAgICBpZiBzZWxmLmVuZ2luZS5pc2JhY2soKToKLSAgICAgICAgICAgIGJ0bi5zZWxlY3QoKQotCi0gICAgICAgIGJ0biA9IFJhZGlvYnV0dG9uKGYsIGFuY2hvcj0idyIsCi0gICAgICAgICAgICAgICAgdmFyaWFibGU9c2VsZi5lbmdpbmUuYmFja3ZhciwgdmFsdWU9MCwKLSAgICAgICAgICAgICAgICB0ZXh0PSJEb3duIikKLSAgICAgICAgYnRuLnBhY2soc2lkZT0ibGVmdCIsIGZpbGw9ImJvdGgiKQotICAgICAgICBpZiBub3Qgc2VsZi5lbmdpbmUuaXNiYWNrKCk6Ci0gICAgICAgICAgICBidG4uc2VsZWN0KCkKLQogICAgIGRlZiBjcmVhdGVfY29tbWFuZF9idXR0b25zKHNlbGYpOgotICAgICAgICAjCi0gICAgICAgICMgcGxhY2UgYnV0dG9uIGZyYW1lIG9uIHRoZSByaWdodAorICAgICAgICAiUGxhY2UgYnV0dG9ucyBpbiB2ZXJ0aWNhbCBjb21tYW5kIGZyYW1lIGdyaWRkZWQgb24gcmlnaHQuIgogICAgICAgICBmID0gc2VsZi5idXR0b25mcmFtZSA9IEZyYW1lKHNlbGYudG9wKQogICAgICAgICBmLmdyaWQocm93PTAsY29sdW1uPTIscGFkeD0yLHBhZHk9MixpcGFkeD0yLGlwYWR5PTIpCiAKICAgICAgICAgYiA9IHNlbGYubWFrZV9idXR0b24oImNsb3NlIiwgc2VsZi5jbG9zZSkKICAgICAgICAgYi5sb3dlcigpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaW1wb3J0IHVuaXR0ZXN0CisgICAgdW5pdHRlc3QubWFpbigKKyAgICAgICAgJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3Rfc2VhcmNoZGlhbG9nYmFzZScsIHZlcmJvc2l0eT0yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvU2VhcmNoRW5naW5lLnB5IGIvTGliL2lkbGVsaWIvU2VhcmNoRW5naW5lLnB5CmluZGV4IGNjNDBhMDAuLjIxMThjZDMgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1NlYXJjaEVuZ2luZS5weQorKysgYi9MaWIvaWRsZWxpYi9TZWFyY2hFbmdpbmUucHkKQEAgLTEsMjYgKzEsMzQgQEAKKycnJ0RlZmluZSBTZWFyY2hFbmdpbmUgZm9yIHNlYXJjaCBkaWFsb2dzLicnJwogaW1wb3J0IHJlCi1mcm9tIFRraW50ZXIgaW1wb3J0ICoKK2Zyb20gVGtpbnRlciBpbXBvcnQgU3RyaW5nVmFyLCBCb29sZWFuVmFyLCBUY2xFcnJvcgogaW1wb3J0IHRrTWVzc2FnZUJveAogCiBkZWYgZ2V0KHJvb3QpOgorICAgICcnJ1JldHVybiB0aGUgc2luZ2xldG9uIFNlYXJjaEVuZ2luZSBpbnN0YW5jZSBmb3IgdGhlIHByb2Nlc3MuCisKKyAgICBUaGUgc2luZ2xlIFNlYXJjaEVuZ2luZSBzYXZlcyBzZXR0aW5ncyBiZXR3ZWVuIGRpYWxvZyBpbnN0YW5jZXMuCisgICAgSWYgdGhlcmUgaXMgbm90IGEgU2VhcmNoRW5naW5lIGFscmVhZHksIG1ha2Ugb25lLgorICAgICcnJwogICAgIGlmIG5vdCBoYXNhdHRyKHJvb3QsICJfc2VhcmNoZW5naW5lIik6CiAgICAgICAgIHJvb3QuX3NlYXJjaGVuZ2luZSA9IFNlYXJjaEVuZ2luZShyb290KQotICAgICAgICAjIFhYWCBUaGlzIHdpbGwgbmV2ZXIgZ2FyYmFnZS1jb2xsZWN0IC0tIHdobyBjYXJlcworICAgICAgICAjIFRoaXMgY3JlYXRlcyBhIGN5Y2xlIHRoYXQgcGVyc2lzdHMgdW50aWwgcm9vdCBpcyBkZWxldGVkLgogICAgIHJldHVybiByb290Ll9zZWFyY2hlbmdpbmUKIAogY2xhc3MgU2VhcmNoRW5naW5lOgorICAgICIiIkhhbmRsZXMgc2VhcmNoaW5nIGEgdGV4dCB3aWRnZXQgZm9yIEZpbmQsIFJlcGxhY2UsIGFuZCBHcmVwLiIiIgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJvb3QpOgotICAgICAgICBzZWxmLnJvb3QgPSByb290Ci0gICAgICAgICMgU3RhdGUgc2hhcmVkIGJ5IHNlYXJjaCwgcmVwbGFjZSwgYW5kIGdyZXA7Ci0gICAgICAgICMgdGhlIHNlYXJjaCBkaWFsb2dzIGJpbmQgdGhlc2UgdG8gVUkgZWxlbWVudHMuCi0gICAgICAgIHNlbGYucGF0dmFyID0gU3RyaW5nVmFyKHJvb3QpICAgICAgICAgICAjIHNlYXJjaCBwYXR0ZXJuCi0gICAgICAgIHNlbGYucmV2YXIgPSBCb29sZWFuVmFyKHJvb3QpICAgICAgICAgICAjIHJlZ3VsYXIgZXhwcmVzc2lvbj8KLSAgICAgICAgc2VsZi5jYXNldmFyID0gQm9vbGVhblZhcihyb290KSAgICAgICAgICMgbWF0Y2ggY2FzZT8KLSAgICAgICAgc2VsZi53b3JkdmFyID0gQm9vbGVhblZhcihyb290KSAgICAgICAgICMgbWF0Y2ggd2hvbGUgd29yZD8KLSAgICAgICAgc2VsZi53cmFwdmFyID0gQm9vbGVhblZhcihyb290KSAgICAgICAgICMgd3JhcCBhcm91bmQgYnVmZmVyPwotICAgICAgICBzZWxmLndyYXB2YXIuc2V0KDEpICAgICAgICAgICAgICAgICAgICAgIyAob24gYnkgZGVmYXVsdCkKLSAgICAgICAgc2VsZi5iYWNrdmFyID0gQm9vbGVhblZhcihyb290KSAgICAgICAgICMgc2VhcmNoIGJhY2t3YXJkcz8KKyAgICAgICAgJycnSW5pdGlhbGl6ZSBWYXJpYWJsZXMgdGhhdCBzYXZlIHNlYXJjaCBzdGF0ZS4KKworICAgICAgICBUaGUgZGlhbG9ncyBiaW5kIHRoZXNlIHRvIHRoZSBVSSBlbGVtZW50cyBwcmVzZW50IGluIHRoZSBkaWFsb2dzLgorICAgICAgICAnJycKKyAgICAgICAgc2VsZi5yb290ID0gcm9vdCAgIyBuZWVkIGZvciByZXBvcnRfZXJyb3IoKQorICAgICAgICBzZWxmLnBhdHZhciA9IFN0cmluZ1Zhcihyb290LCAnJykgICAjIHNlYXJjaCBwYXR0ZXJuCisgICAgICAgIHNlbGYucmV2YXIgPSBCb29sZWFuVmFyKHJvb3QsIEZhbHNlKSAgICMgcmVndWxhciBleHByZXNzaW9uPworICAgICAgICBzZWxmLmNhc2V2YXIgPSBCb29sZWFuVmFyKHJvb3QsIEZhbHNlKSAgICMgbWF0Y2ggY2FzZT8KKyAgICAgICAgc2VsZi53b3JkdmFyID0gQm9vbGVhblZhcihyb290LCBGYWxzZSkgICAjIG1hdGNoIHdob2xlIHdvcmQ/CisgICAgICAgIHNlbGYud3JhcHZhciA9IEJvb2xlYW5WYXIocm9vdCwgVHJ1ZSkgICAjIHdyYXAgYXJvdW5kIGJ1ZmZlcj8KKyAgICAgICAgc2VsZi5iYWNrdmFyID0gQm9vbGVhblZhcihyb290LCBGYWxzZSkgICAjIHNlYXJjaCBiYWNrd2FyZHM/CiAKICAgICAjIEFjY2VzcyBtZXRob2RzCiAKQEAgLTQ3LDE1ICs1NSwyMyBAQAogCiAgICAgIyBIaWdoZXIgbGV2ZWwgYWNjZXNzIG1ldGhvZHMKIAorICAgIGRlZiBzZXRjb29rZWRwYXQoc2VsZiwgcGF0KToKKyAgICAgICAgIlNldCBwYXR0ZXJuIGFmdGVyIGVzY2FwaW5nIGlmIHJlLiIKKyAgICAgICAgIyBjYWxsZWQgb25seSBpbiBTZWFyY2hEaWFsb2cucHk6IDY2CisgICAgICAgIGlmIHNlbGYuaXNyZSgpOgorICAgICAgICAgICAgcGF0ID0gcmUuZXNjYXBlKHBhdCkKKyAgICAgICAgc2VsZi5zZXRwYXQocGF0KQorCiAgICAgZGVmIGdldGNvb2tlZHBhdChzZWxmKToKICAgICAgICAgcGF0ID0gc2VsZi5nZXRwYXQoKQotICAgICAgICBpZiBub3Qgc2VsZi5pc3JlKCk6CisgICAgICAgIGlmIG5vdCBzZWxmLmlzcmUoKTogICMgaWYgVHJ1ZSwgc2VlIHNldGNvb2tlZHBhdAogICAgICAgICAgICAgcGF0ID0gcmUuZXNjYXBlKHBhdCkKICAgICAgICAgaWYgc2VsZi5pc3dvcmQoKToKICAgICAgICAgICAgIHBhdCA9IHIiXGIlc1xiIiAlIHBhdAogICAgICAgICByZXR1cm4gcGF0CiAKICAgICBkZWYgZ2V0cHJvZyhzZWxmKToKKyAgICAgICAgIlJldHVybiBjb21waWxlZCBjb29rZWQgc2VhcmNoIHBhdHRlcm4uIgogICAgICAgICBwYXQgPSBzZWxmLmdldHBhdCgpCiAgICAgICAgIGlmIG5vdCBwYXQ6CiAgICAgICAgICAgICBzZWxmLnJlcG9ydF9lcnJvcihwYXQsICJFbXB0eSByZWd1bGFyIGV4cHJlc3Npb24iKQpAQCAtNjYsNTEgKzgyLDQyIEBACiAgICAgICAgICAgICBmbGFncyA9IGZsYWdzIHwgcmUuSUdOT1JFQ0FTRQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBwcm9nID0gcmUuY29tcGlsZShwYXQsIGZsYWdzKQotICAgICAgICBleGNlcHQgcmUuZXJyb3IsIHdoYXQ6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgbXNnLCBjb2wgPSB3aGF0Ci0gICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgbXNnID0gc3RyKHdoYXQpCi0gICAgICAgICAgICAgICAgY29sID0gLTEKKyAgICAgICAgZXhjZXB0IHJlLmVycm9yIGFzIHdoYXQ6CisgICAgICAgICAgICBhcmdzID0gd2hhdC5hcmdzCisgICAgICAgICAgICBtc2cgPSBhcmdzWzBdCisgICAgICAgICAgICBjb2wgPSBhcmdzWzFdIGlmIGxlbihhcmdzKSA+PSAyIGVsc2UgLTEKICAgICAgICAgICAgIHNlbGYucmVwb3J0X2Vycm9yKHBhdCwgbXNnLCBjb2wpCiAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICByZXR1cm4gcHJvZwogCiAgICAgZGVmIHJlcG9ydF9lcnJvcihzZWxmLCBwYXQsIG1zZywgY29sPS0xKToKLSAgICAgICAgIyBEZXJpdmVkIGNsYXNzIGNvdWxkIG92ZXJyaWQgdGhpcyB3aXRoIHNvbWV0aGluZyBmYW5jaWVyCisgICAgICAgICMgRGVyaXZlZCBjbGFzcyBjb3VsZCBvdmVycmlkZSB0aGlzIHdpdGggc29tZXRoaW5nIGZhbmNpZXIKICAgICAgICAgbXNnID0gIkVycm9yOiAiICsgc3RyKG1zZykKICAgICAgICAgaWYgcGF0OgotICAgICAgICAgICAgbXNnID0gbXNnICsgIlxucFxQYXR0ZXJuOiAiICsgc3RyKHBhdCkKKyAgICAgICAgICAgIG1zZyA9IG1zZyArICJcblBhdHRlcm46ICIgKyBzdHIocGF0KQogICAgICAgICBpZiBjb2wgPj0gMDoKICAgICAgICAgICAgIG1zZyA9IG1zZyArICJcbk9mZnNldDogIiArIHN0cihjb2wpCiAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IoIlJlZ3VsYXIgZXhwcmVzc2lvbiBlcnJvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLCBtYXN0ZXI9c2VsZi5yb290KQogCi0gICAgZGVmIHNldGNvb2tlZHBhdChzZWxmLCBwYXQpOgotICAgICAgICBpZiBzZWxmLmlzcmUoKToKLSAgICAgICAgICAgIHBhdCA9IHJlLmVzY2FwZShwYXQpCi0gICAgICAgIHNlbGYuc2V0cGF0KHBhdCkKLQogICAgIGRlZiBzZWFyY2hfdGV4dChzZWxmLCB0ZXh0LCBwcm9nPU5vbmUsIG9rPTApOgotICAgICAgICAiIiJTZWFyY2ggYSB0ZXh0IHdpZGdldCBmb3IgdGhlIHBhdHRlcm4uCisgICAgICAgICcnJ1JldHVybiAobGluZW5vLCBtYXRjaG9iaikgb3IgTm9uZSBmb3IgZm9yd2FyZC9iYWNrd2FyZCBzZWFyY2guCiAKLSAgICAgICAgSWYgcHJvZyBpcyBnaXZlbiwgaXQgc2hvdWxkIGJlIHRoZSBwcmVjb21waWxlZCBwYXR0ZXJuLgotICAgICAgICBSZXR1cm4gYSB0dXBsZSAobGluZW5vLCBtYXRjaG9iaik7IE5vbmUgaWYgbm90IGZvdW5kLgorICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbGxzIHRoZSByaWdodCBmdW5jdGlvbiB3aXRoIHRoZSByaWdodCBhcmd1bWVudHMuCisgICAgICAgIEl0IGRpcmVjdGx5IHJldHVybiB0aGUgcmVzdWx0IG9mIHRoYXQgY2FsbC4KIAotICAgICAgICBUaGlzIG9iZXlzIHRoZSB3cmFwIGFuZCBkaXJlY3Rpb24gKGJhY2spIHNldHRpbmdzLgorICAgICAgICBUZXh0IGlzIGEgdGV4dCB3aWRnZXQuIFByb2cgaXMgYSBwcmVjb21waWxlZCBwYXR0ZXJuLgorICAgICAgICBUaGUgb2sgcGFyYW1ldGVyaXMgYSBiaXQgY29tcGxpY2F0ZWQgYXMgaXQgaGFzIHR3byBlZmZlY3RzLgogCi0gICAgICAgIFRoZSBzZWFyY2ggc3RhcnRzIGF0IHRoZSBzZWxlY3Rpb24gKGlmIHRoZXJlIGlzIG9uZSkgb3IKLSAgICAgICAgYXQgdGhlIGluc2VydCBtYXJrIChvdGhlcndpc2UpLiAgSWYgdGhlIHNlYXJjaCBpcyBmb3J3YXJkLAotICAgICAgICBpdCBzdGFydHMgYXQgdGhlIHJpZ2h0IG9mIHRoZSBzZWxlY3Rpb247IGZvciBhIGJhY2t3YXJkCi0gICAgICAgIHNlYXJjaCwgaXQgc3RhcnRzIGF0IHRoZSBsZWZ0IGVuZC4gIEFuIGVtcHR5IG1hdGNoIGV4YWN0bHkKLSAgICAgICAgYXQgZWl0aGVyIGVuZCBvZiB0aGUgc2VsZWN0aW9uIChvciBhdCB0aGUgaW5zZXJ0IG1hcmsgaWYKLSAgICAgICAgdGhlcmUgaXMgbm8gc2VsZWN0aW9uKSBpcyBpZ25vcmVkICB1bmxlc3MgdGhlIG9rIGZsYWcgaXMgdHJ1ZQotICAgICAgICAtLSB0aGlzIGlzIGRvbmUgdG8gZ3VhcmFudGVlIHByb2dyZXNzLgorICAgICAgICBJZiB0aGVyZSBpcyBhIHNlbGVjdGlvbiwgdGhlIHNlYXJjaCBiZWdpbiBhdCBlaXRoZXIgZW5kLAorICAgICAgICBkZXBlbmRpbmcgb24gdGhlIGRpcmVjdGlvbiBzZXR0aW5nIGFuZCBvaywgd2l0aCBvayBtZWFuaW5nIHRoYXQKKyAgICAgICAgdGhlIHNlYXJjaCBzdGFydHMgd2l0aCB0aGUgc2VsZWN0aW9uLiBPdGhlcndpc2UsIHNlYXJjaCBiZWdpbnMKKyAgICAgICAgYXQgdGhlIGluc2VydCBtYXJrLgogCi0gICAgICAgIElmIHRoZSBzZWFyY2ggaXMgYWxsb3dlZCB0byB3cmFwIGFyb3VuZCwgaXQgd2lsbCByZXR1cm4gdGhlCi0gICAgICAgIG9yaWdpbmFsIHNlbGVjdGlvbiBpZiAoYW5kIG9ubHkgaWYpIGl0IGlzIHRoZSBvbmx5IG1hdGNoLgorICAgICAgICBUbyBhaWQgcHJvZ3Jlc3MsIHRoZSBzZWFyY2ggZnVuY3Rpb25zIGRvIG5vdCByZXR1cm4gYW4gZW1wdHkKKyAgICAgICAgbWF0Y2ggYXQgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIHVubGVzcyBvayBpcyBUcnVlLgorICAgICAgICAnJycKIAotICAgICAgICAiIiIKICAgICAgICAgaWYgbm90IHByb2c6CiAgICAgICAgICAgICBwcm9nID0gc2VsZi5nZXRwcm9nKCkKICAgICAgICAgICAgIGlmIG5vdCBwcm9nOgpAQCAtMTc5LDE1ICsxODYsMTkgQEAKICAgICAgICAgICAgIGNvbCA9IGxlbihjaGFycykgLSAxCiAgICAgICAgIHJldHVybiBOb25lCiAKLSMgSGVscGVyIHRvIHNlYXJjaCBiYWNrd2FyZHMgaW4gYSBzdHJpbmcuCi0jIChPcHRpbWl6ZWQgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSBwYXR0ZXJuIGlzbid0IGZvdW5kLikKLQogZGVmIHNlYXJjaF9yZXZlcnNlKHByb2csIGNoYXJzLCBjb2wpOgorICAgICcnJ1NlYXJjaCBiYWNrd2FyZHMgYW5kIHJldHVybiBhbiByZSBtYXRjaCBvYmplY3Qgb3IgTm9uZS4KKworICAgIFRoaXMgaXMgZG9uZSBieSBzZWFyY2hpbmcgZm9yd2FyZHMgdW50aWwgdGhlcmUgaXMgbm8gbWF0Y2guCisgICAgUHJvZzogY29tcGlsZWQgcmUgb2JqZWN0IHdpdGggYSBzZWFyY2ggbWV0aG9kIHJldHVybmluZyBhIG1hdGNoLgorICAgIENoYXJzOiBsaW5lIG9mIHRleHQsIHdpdGhvdXQgXG4uCisgICAgQ29sOiBzdG9wIGluZGV4IGZvciB0aGUgc2VhcmNoOyB0aGUgbGltaXQgZm9yIG1hdGNoLmVuZCgpLgorICAgICcnJwogICAgIG0gPSBwcm9nLnNlYXJjaChjaGFycykKICAgICBpZiBub3QgbToKICAgICAgICAgcmV0dXJuIE5vbmUKICAgICBmb3VuZCA9IE5vbmUKLSAgICBpLCBqID0gbS5zcGFuKCkKKyAgICBpLCBqID0gbS5zcGFuKCkgICMgbS5zdGFydCgpLCBtLmVuZCgpID09IG1hdGNoIHNsaWNlIGluZGV4ZXMKICAgICB3aGlsZSBpIDwgY29sIGFuZCBqIDw9IGNvbDoKICAgICAgICAgZm91bmQgPSBtCiAgICAgICAgIGlmIGkgPT0gajoKQEAgLTE5OCwxMCArMjA5LDkgQEAKICAgICAgICAgaSwgaiA9IG0uc3BhbigpCiAgICAgcmV0dXJuIGZvdW5kCiAKLSMgSGVscGVyIHRvIGdldCBzZWxlY3Rpb24gZW5kIHBvaW50cywgZGVmYXVsdGluZyB0byBpbnNlcnQgbWFyay4KLSMgUmV0dXJuIGEgdHVwbGUgb2YgaW5kaWNlcyAoImxpbmUuY29sIiBzdHJpbmdzKS4KLQogZGVmIGdldF9zZWxlY3Rpb24odGV4dCk6CisgICAgJycnUmV0dXJuIHR1cGxlIG9mICdsaW5lLmNvbCcgaW5kZXhlcyBmcm9tIHNlbGVjdGlvbiBvciBpbnNlcnQgbWFyay4KKyAgICAnJycKICAgICB0cnk6CiAgICAgICAgIGZpcnN0ID0gdGV4dC5pbmRleCgic2VsLmZpcnN0IikKICAgICAgICAgbGFzdCA9IHRleHQuaW5kZXgoInNlbC5sYXN0IikKQEAgLTIxMyw4ICsyMjMsMTEgQEAKICAgICAgICAgbGFzdCA9IGZpcnN0CiAgICAgcmV0dXJuIGZpcnN0LCBsYXN0CiAKLSMgSGVscGVyIHRvIHBhcnNlIGEgdGV4dCBpbmRleCBpbnRvIGEgKGxpbmUsIGNvbCkgdHVwbGUuCi0KIGRlZiBnZXRfbGluZV9jb2woaW5kZXgpOgorICAgICcnJ1JldHVybiAobGluZSwgY29sKSB0dXBsZSBvZiBpbnRzIGZyb20gJ2xpbmUuY29sJyBzdHJpbmcuJycnCiAgICAgbGluZSwgY29sID0gbWFwKGludCwgaW5kZXguc3BsaXQoIi4iKSkgIyBGYWlscyBvbiBpbnZhbGlkIGluZGV4CiAgICAgcmV0dXJuIGxpbmUsIGNvbAorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGltcG9ydCB1bml0dGVzdAorICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3Rfc2VhcmNoZW5naW5lJywgdmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9TdGFja1ZpZXdlci5weSBiL0xpYi9pZGxlbGliL1N0YWNrVmlld2VyLnB5CmluZGV4IDczMjc3M2YuLmNjZjYyODMgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1N0YWNrVmlld2VyLnB5CisrKyBiL0xpYi9pZGxlbGliL1N0YWNrVmlld2VyLnB5CkBAIC0xLDkgKzEsMTIgQEAKIGltcG9ydCBvcwogaW1wb3J0IHN5cwogaW1wb3J0IGxpbmVjYWNoZQoraW1wb3J0IHJlCitpbXBvcnQgVGtpbnRlciBhcyB0awogCiBmcm9tIGlkbGVsaWIuVHJlZVdpZGdldCBpbXBvcnQgVHJlZU5vZGUsIFRyZWVJdGVtLCBTY3JvbGxlZENhbnZhcwogZnJvbSBpZGxlbGliLk9iamVjdEJyb3dzZXIgaW1wb3J0IE9iamVjdFRyZWVJdGVtLCBtYWtlX29iamVjdHRyZWVpdGVtCitmcm9tIGlkbGVsaWIuUHlTaGVsbCBpbXBvcnQgUHlTaGVsbEZpbGVMaXN0CiAKIGRlZiBTdGFja0Jyb3dzZXIocm9vdCwgZmxpc3Q9Tm9uZSwgdGI9Tm9uZSwgdG9wPU5vbmUpOgogICAgIGlmIHRvcCBpcyBOb25lOgpAQCAtMTIxLDE3ICsxMjQsMjkgQEAKICAgICAgICAgICAgIHN1Ymxpc3QuYXBwZW5kKGl0ZW0pCiAgICAgICAgIHJldHVybiBzdWJsaXN0CiAKK2RlZiBfc3RhY2tfdmlld2VyKHBhcmVudCk6CisgICAgcm9vdCA9IHRrLlRrKCkKKyAgICByb290LnRpdGxlKCJUZXN0IFN0YWNrVmlld2VyIikKKyAgICB3aWR0aCwgaGVpZ2h0LCB4LCB5ID0gbGlzdChtYXAoaW50LCByZS5zcGxpdCgnW3grXScsIHBhcmVudC5nZW9tZXRyeSgpKSkpCisgICAgcm9vdC5nZW9tZXRyeSgiKyVkKyVkIiUoeCwgeSArIDE1MCkpCisgICAgZmxpc3QgPSBQeVNoZWxsRmlsZUxpc3Qocm9vdCkKKyAgICB0cnk6ICMgdG8gb2J0YWluIGEgdHJhY2ViYWNrIG9iamVjdAorICAgICAgICBpbnRlbnRpb25hbF9uYW1lX2Vycm9yCisgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgZXhjX3R5cGUsIGV4Y192YWx1ZSwgZXhjX3RiID0gc3lzLmV4Y19pbmZvKCkKIAotZGVmIF90ZXN0KCk6Ci0gICAgdHJ5OgotICAgICAgICBpbXBvcnQgdGVzdGNvZGUKLSAgICAgICAgcmVsb2FkKHRlc3Rjb2RlKQotICAgIGV4Y2VwdDoKLSAgICAgICAgc3lzLmxhc3RfdHlwZSwgc3lzLmxhc3RfdmFsdWUsIHN5cy5sYXN0X3RyYWNlYmFjayA9IHN5cy5leGNfaW5mbygpCi0gICAgZnJvbSBUa2ludGVyIGltcG9ydCBUawotICAgIHJvb3QgPSBUaygpCi0gICAgU3RhY2tCcm93c2VyKE5vbmUsIHRvcD1yb290KQotICAgIHJvb3QubWFpbmxvb3AoKQorICAgICMgaW5qZWN0IHN0YWNrIHRyYWNlIHRvIHN5cworICAgIHN5cy5sYXN0X3R5cGUgPSBleGNfdHlwZQorICAgIHN5cy5sYXN0X3ZhbHVlID0gZXhjX3ZhbHVlCisgICAgc3lzLmxhc3RfdHJhY2ViYWNrID0gZXhjX3RiCiAKLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgX3Rlc3QoKQorICAgIFN0YWNrQnJvd3Nlcihyb290LCBmbGlzdD1mbGlzdCwgdG9wPXJvb3QsIHRiPWV4Y190YikKKworICAgICMgcmVzdG9yZSBzeXMgdG8gb3JpZ2luYWwgc3RhdGUKKyAgICBkZWwgc3lzLmxhc3RfdHlwZQorICAgIGRlbCBzeXMubGFzdF92YWx1ZQorICAgIGRlbCBzeXMubGFzdF90cmFjZWJhY2sKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KKyAgICBydW4oX3N0YWNrX3ZpZXdlcikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1Rvb2xUaXAucHkgYi9MaWIvaWRsZWxpYi9Ub29sVGlwLnB5CmluZGV4IGNlN2EzZDMuLjExMTM2YzQgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1Rvb2xUaXAucHkKKysrIGIvTGliL2lkbGVsaWIvVG9vbFRpcC5weQpAQCAtNzYsMTQgKzc2LDIyIEBACiAgICAgICAgIGZvciBpdGVtIGluIHNlbGYuaXRlbXM6CiAgICAgICAgICAgICBsaXN0Ym94Lmluc2VydChFTkQsIGl0ZW0pCiAKLWRlZiBtYWluKCk6Ci0gICAgIyBUZXN0IGNvZGUKK2RlZiBfdG9vbHRpcChwYXJlbnQpOgogICAgIHJvb3QgPSBUaygpCi0gICAgYiA9IEJ1dHRvbihyb290LCB0ZXh0PSJIZWxsbyIsIGNvbW1hbmQ9cm9vdC5kZXN0cm95KQotICAgIGIucGFjaygpCi0gICAgcm9vdC51cGRhdGUoKQotICAgIHRpcCA9IExpc3Rib3hUb29sVGlwKGIsIFsiSGVsbG8iLCAid29ybGQiXSkKKyAgICByb290LnRpdGxlKCJUZXN0IHRvb2x0aXAiKQorICAgIHdpZHRoLCBoZWlnaHQsIHgsIHkgPSBsaXN0KG1hcChpbnQsIHJlLnNwbGl0KCdbeCtdJywgcGFyZW50Lmdlb21ldHJ5KCkpKSkKKyAgICByb290Lmdlb21ldHJ5KCIrJWQrJWQiJSh4LCB5ICsgMTUwKSkKKyAgICBsYWJlbCA9IExhYmVsKHJvb3QsIHRleHQ9IlBsYWNlIHlvdXIgbW91c2Ugb3ZlciBidXR0b25zIikKKyAgICBsYWJlbC5wYWNrKCkKKyAgICBidXR0b24xID0gQnV0dG9uKHJvb3QsIHRleHQ9IkJ1dHRvbiAxIikKKyAgICBidXR0b24yID0gQnV0dG9uKHJvb3QsIHRleHQ9IkJ1dHRvbiAyIikKKyAgICBidXR0b24xLnBhY2soKQorICAgIGJ1dHRvbjIucGFjaygpCisgICAgVG9vbFRpcChidXR0b24xLCAiVGhpcyBpcyB0b29sdGlwIHRleHQgZm9yIGJ1dHRvbjEuIikKKyAgICBMaXN0Ym94VG9vbFRpcChidXR0b24yLCBbIlRoaXMgaXMiLCJtdWx0aXBsZSBsaW5lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG9vbHRpcCB0ZXh0IiwiZm9yIGJ1dHRvbjIiXSkKICAgICByb290Lm1haW5sb29wKCkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICBtYWluKCkKKyAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KKyAgICBydW4oX3Rvb2x0aXApCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9UcmVlV2lkZ2V0LnB5IGIvTGliL2lkbGVsaWIvVHJlZVdpZGdldC5weQppbmRleCAwZmVjYTAxLi5lYmIxZjAyIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9UcmVlV2lkZ2V0LnB5CisrKyBiL0xpYi9pZGxlbGliL1RyZWVXaWRnZXQucHkKQEAgLTQ0OSwyOSArNDQ5LDE4IEBACiAgICAgICAgIHJldHVybiAiYnJlYWsiCiAKIAotIyBUZXN0aW5nIGZ1bmN0aW9ucwotCi1kZWYgdGVzdCgpOgotICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgUHlTaGVsbAotICAgIHJvb3QgPSBUb3BsZXZlbChQeVNoZWxsLnJvb3QpCi0gICAgcm9vdC5jb25maWd1cmUoYmQ9MCwgYmc9InllbGxvdyIpCi0gICAgcm9vdC5mb2N1c19zZXQoKQorZGVmIF90cmVlX3dpZGdldChwYXJlbnQpOgorICAgIHJvb3QgPSBUaygpCisgICAgcm9vdC50aXRsZSgiVGVzdCBUcmVlV2lkZ2V0IikKKyAgICB3aWR0aCwgaGVpZ2h0LCB4LCB5ID0gbGlzdChtYXAoaW50LCByZS5zcGxpdCgnW3grXScsIHBhcmVudC5nZW9tZXRyeSgpKSkpCisgICAgcm9vdC5nZW9tZXRyeSgiKyVkKyVkIiUoeCwgeSArIDE1MCkpCiAgICAgc2MgPSBTY3JvbGxlZENhbnZhcyhyb290LCBiZz0id2hpdGUiLCBoaWdobGlnaHR0aGlja25lc3M9MCwgdGFrZWZvY3VzPTEpCi0gICAgc2MuZnJhbWUucGFjayhleHBhbmQ9MSwgZmlsbD0iYm90aCIpCi0gICAgaXRlbSA9IEZpbGVUcmVlSXRlbSgiQzovd2luZG93cy9kZXNrdG9wIikKKyAgICBzYy5mcmFtZS5wYWNrKGV4cGFuZD0xLCBmaWxsPSJib3RoIiwgc2lkZT1MRUZUKQorICAgIGl0ZW0gPSBGaWxlVHJlZUl0ZW0ob3MuZ2V0Y3dkKCkpCiAgICAgbm9kZSA9IFRyZWVOb2RlKHNjLmNhbnZhcywgTm9uZSwgaXRlbSkKICAgICBub2RlLmV4cGFuZCgpCi0KLWRlZiB0ZXN0MigpOgotICAgICMgdGVzdCB3L28gc2Nyb2xsaW5nIGNhbnZhcwotICAgIHJvb3QgPSBUaygpCi0gICAgcm9vdC5jb25maWd1cmUoYmQ9MCkKLSAgICBjYW52YXMgPSBDYW52YXMocm9vdCwgYmc9IndoaXRlIiwgaGlnaGxpZ2h0dGhpY2tuZXNzPTApCi0gICAgY2FudmFzLnBhY2soZXhwYW5kPTEsIGZpbGw9ImJvdGgiKQotICAgIGl0ZW0gPSBGaWxlVHJlZUl0ZW0ob3MuY3VyZGlyKQotICAgIG5vZGUgPSBUcmVlTm9kZShjYW52YXMsIE5vbmUsIGl0ZW0pCi0gICAgbm9kZS51cGRhdGUoKQotICAgIGNhbnZhcy5mb2N1c19zZXQoKQorICAgIHJvb3QubWFpbmxvb3AoKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIHRlc3QoKQorICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgorICAgIHJ1bihfdHJlZV93aWRnZXQpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9VbmRvRGVsZWdhdG9yLnB5IGIvTGliL2lkbGVsaWIvVW5kb0RlbGVnYXRvci5weQppbmRleCAxNmQzYWUxLi5jZGVhY2VhIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9VbmRvRGVsZWdhdG9yLnB5CisrKyBiL0xpYi9pZGxlbGliL1VuZG9EZWxlZ2F0b3IucHkKQEAgLTMzNiwxNyArMzM2LDMwIEBACiAgICAgICAgIHNlbGYuZGVwdGggPSBzZWxmLmRlcHRoICsgaW5jcgogICAgICAgICByZXR1cm4gc2VsZi5kZXB0aAogCi1kZWYgbWFpbigpOgorZGVmIF91bmRvX2RlbGVnYXRvcihwYXJlbnQpOgogICAgIGZyb20gaWRsZWxpYi5QZXJjb2xhdG9yIGltcG9ydCBQZXJjb2xhdG9yCiAgICAgcm9vdCA9IFRrKCkKLSAgICByb290LndtX3Byb3RvY29sKCJXTV9ERUxFVEVfV0lORE9XIiwgcm9vdC5xdWl0KQotICAgIHRleHQgPSBUZXh0KCkKKyAgICByb290LnRpdGxlKCJUZXN0IFVuZG9EZWxlZ2F0b3IiKQorICAgIHdpZHRoLCBoZWlnaHQsIHgsIHkgPSBsaXN0KG1hcChpbnQsIHJlLnNwbGl0KCdbeCtdJywgcGFyZW50Lmdlb21ldHJ5KCkpKSkKKyAgICByb290Lmdlb21ldHJ5KCIrJWQrJWQiJSh4LCB5ICsgMTUwKSkKKworICAgIHRleHQgPSBUZXh0KHJvb3QpCisgICAgdGV4dC5jb25maWcoaGVpZ2h0PTEwKQogICAgIHRleHQucGFjaygpCiAgICAgdGV4dC5mb2N1c19zZXQoKQogICAgIHAgPSBQZXJjb2xhdG9yKHRleHQpCiAgICAgZCA9IFVuZG9EZWxlZ2F0b3IoKQogICAgIHAuaW5zZXJ0ZmlsdGVyKGQpCisKKyAgICB1bmRvID0gQnV0dG9uKHJvb3QsIHRleHQ9IlVuZG8iLCBjb21tYW5kPWxhbWJkYTpkLnVuZG9fZXZlbnQoTm9uZSkpCisgICAgdW5kby5wYWNrKHNpZGU9J2xlZnQnKQorICAgIHJlZG8gPSBCdXR0b24ocm9vdCwgdGV4dD0iUmVkbyIsIGNvbW1hbmQ9bGFtYmRhOmQucmVkb19ldmVudChOb25lKSkKKyAgICByZWRvLnBhY2soc2lkZT0nbGVmdCcpCisgICAgZHVtcCA9IEJ1dHRvbihyb290LCB0ZXh0PSJEdW1wIiwgY29tbWFuZD1sYW1iZGE6ZC5kdW1wX2V2ZW50KE5vbmUpKQorICAgIGR1bXAucGFjayhzaWRlPSdsZWZ0JykKKwogICAgIHJvb3QubWFpbmxvb3AoKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIG1haW4oKQorICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgorICAgIHJ1bihfdW5kb19kZWxlZ2F0b3IpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9XaWRnZXRSZWRpcmVjdG9yLnB5IGIvTGliL2lkbGVsaWIvV2lkZ2V0UmVkaXJlY3Rvci5weQppbmRleCA3YzM0MWYyLi4xMDNiZmQwIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9XaWRnZXRSZWRpcmVjdG9yLnB5CisrKyBiL0xpYi9pZGxlbGliL1dpZGdldFJlZGlyZWN0b3IucHkKQEAgLTEsMjkgKzEsNDAgQEAKLWZyb20gVGtpbnRlciBpbXBvcnQgKgorZnJvbSBUa2ludGVyIGltcG9ydCBUY2xFcnJvcgogCiBjbGFzcyBXaWRnZXRSZWRpcmVjdG9yOgotCiAgICAgIiIiU3VwcG9ydCBmb3IgcmVkaXJlY3RpbmcgYXJiaXRyYXJ5IHdpZGdldCBzdWJjb21tYW5kcy4KIAotICAgIFNvbWUgVGsgb3BlcmF0aW9ucyBkb24ndCBub3JtYWxseSBwYXNzIHRocm91Z2ggVGtpbnRlci4gIEZvciBleGFtcGxlLCBpZiBhCisgICAgU29tZSBUayBvcGVyYXRpb25zIGRvbid0IG5vcm1hbGx5IHBhc3MgdGhyb3VnaCB0a2ludGVyLiAgRm9yIGV4YW1wbGUsIGlmIGEKICAgICBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQgaW50byBhIFRleHQgd2lkZ2V0IGJ5IHByZXNzaW5nIGEga2V5LCBhIGRlZmF1bHQgVGsKICAgICBiaW5kaW5nIHRvIHRoZSB3aWRnZXQncyAnaW5zZXJ0JyBvcGVyYXRpb24gaXMgYWN0aXZhdGVkLCBhbmQgdGhlIFRrIGxpYnJhcnkKLSAgICBwcm9jZXNzZXMgdGhlIGluc2VydCB3aXRob3V0IGNhbGxpbmcgYmFjayBpbnRvIFRraW50ZXIuCisgICAgcHJvY2Vzc2VzIHRoZSBpbnNlcnQgd2l0aG91dCBjYWxsaW5nIGJhY2sgaW50byB0a2ludGVyLgogCi0gICAgQWx0aG91Z2ggYSBiaW5kaW5nIHRvIDxLZXk+IGNvdWxkIGJlIG1hZGUgdmlhIFRraW50ZXIsIHdoYXQgd2UgcmVhbGx5IHdhbnQKLSAgICB0byBkbyBpcyB0byBob29rIHRoZSBUayAnaW5zZXJ0JyBvcGVyYXRpb24gaXRzZWxmLgorICAgIEFsdGhvdWdoIGEgYmluZGluZyB0byA8S2V5PiBjb3VsZCBiZSBtYWRlIHZpYSB0a2ludGVyLCB3aGF0IHdlIHJlYWxseSB3YW50CisgICAgdG8gZG8gaXMgdG8gaG9vayB0aGUgVGsgJ2luc2VydCcgb3BlcmF0aW9uIGl0c2VsZi4gIEZvciBvbmUgdGhpbmcsIHdlIHdhbnQKKyAgICBhIHRleHQuaW5zZXJ0IGNhbGwgaW4gaWRsZSBjb2RlIHRvIGhhdmUgdGhlIHNhbWUgZWZmZWN0IGFzIGEga2V5IHByZXNzLgogCiAgICAgV2hlbiBhIHdpZGdldCBpcyBpbnN0YW50aWF0ZWQsIGEgVGNsIGNvbW1hbmQgaXMgY3JlYXRlZCB3aG9zZSBuYW1lIGlzIHRoZQogICAgIHNhbWUgYXMgdGhlIHBhdGhuYW1lIHdpZGdldC5fdy4gIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGludm9rZSB0aGUgdmFyaW91cwogICAgIHdpZGdldCBvcGVyYXRpb25zLCBlLmcuIGluc2VydCAoZm9yIGEgVGV4dCB3aWRnZXQpLiBXZSBhcmUgZ29pbmcgdG8gaG9vawogICAgIHRoaXMgY29tbWFuZCBhbmQgcHJvdmlkZSBhIGZhY2lsaXR5ICgncmVnaXN0ZXInKSB0byBpbnRlcmNlcHQgdGhlIHdpZGdldAotICAgIG9wZXJhdGlvbi4KKyAgICBvcGVyYXRpb24uICBXZSB3aWxsIGFsc28gaW50ZXJjZXB0IG1ldGhvZCBjYWxscyBvbiB0aGUgVGtpbnRlciBjbGFzcworICAgIGluc3RhbmNlIHRoYXQgcmVwcmVzZW50cyB0aGUgdGsgd2lkZ2V0LgogCi0gICAgSW4gSURMRSwgdGhlIGZ1bmN0aW9uIGJlaW5nIHJlZ2lzdGVyZWQgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSB0b3Agb2YgYQotICAgIFBlcmNvbGF0b3IgY2hhaW4uICBBdCB0aGUgYm90dG9tIG9mIHRoZSBjaGFpbiBpcyBhIGNhbGwgdG8gdGhlIG9yaWdpbmFsCi0gICAgVGsgd2lkZ2V0IG9wZXJhdGlvbi4KLQorICAgIEluIElETEUsIFdpZGdldFJlZGlyZWN0b3IgaXMgdXNlZCBpbiBQZXJjb2xhdG9yIHRvIGludGVyY2VwdCBUZXh0CisgICAgY29tbWFuZHMuICBUaGUgZnVuY3Rpb24gYmVpbmcgcmVnaXN0ZXJlZCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHRvcAorICAgIG9mIGEgUGVyY29sYXRvciBjaGFpbi4gIEF0IHRoZSBib3R0b20gb2YgdGhlIGNoYWluIGlzIGEgY2FsbCB0byB0aGUKKyAgICBvcmlnaW5hbCBUayB3aWRnZXQgb3BlcmF0aW9uLgogICAgICIiIgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3aWRnZXQpOgorICAgICAgICAnJydJbml0aWFsaXplIGF0dHJpYnV0ZXMgYW5kIHNldHVwIHJlZGlyZWN0aW9uLgorCisgICAgICAgIF9vcGVyYXRpb25zOiBkaWN0IG1hcHBpbmcgb3BlcmF0aW9uIG5hbWUgdG8gbmV3IGZ1bmN0aW9uLgorICAgICAgICB3aWRnZXQ6IHRoZSB3aWRnZXQgd2hvc2UgdGNsIGNvbW1hbmQgaXMgdG8gYmUgaW50ZXJjZXB0ZWQuCisgICAgICAgIHRrOiB3aWRnZXQudGssIGEgY29udmVuaWVuY2UgYXR0cmlidXRlLCBwcm9iYWJseSBub3QgbmVlZGVkLgorICAgICAgICBvcmlnOiBuZXcgbmFtZSBvZiB0aGUgb3JpZ2luYWwgdGNsIGNvbW1hbmQuCisKKyAgICAgICAgU2luY2UgcmVuYW1pbmcgdG8gb3JpZyBmYWlscyB3aXRoIFRjbEVycm9yIHdoZW4gb3JpZyBhbHJlYWR5CisgICAgICAgIGV4aXN0cywgb25seSBvbmUgV2lkZ2V0RGlyZWN0b3IgY2FuIGV4aXN0IGZvciBhIGdpdmVuIHdpZGdldC4KKyAgICAgICAgJycnCiAgICAgICAgIHNlbGYuX29wZXJhdGlvbnMgPSB7fQogICAgICAgICBzZWxmLndpZGdldCA9IHdpZGdldCAgICAgICAgICAgICMgd2lkZ2V0IGluc3RhbmNlCiAgICAgICAgIHNlbGYudGsgPSB0ayA9IHdpZGdldC50ayAgICAgICAgIyB3aWRnZXQncyByb290CkBAIC00MCwyNyArNTEsNDUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2lkZ2V0Ll93KQogCiAgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiVW5yZWdpc3RlciBvcGVyYXRpb25zIGFuZCByZXZlcnQgcmVkaXJlY3Rpb24gY3JlYXRlZCBieSAuX19pbml0X18uIgogICAgICAgICBmb3Igb3BlcmF0aW9uIGluIGxpc3Qoc2VsZi5fb3BlcmF0aW9ucyk6CiAgICAgICAgICAgICBzZWxmLnVucmVnaXN0ZXIob3BlcmF0aW9uKQotICAgICAgICB3aWRnZXQgPSBzZWxmLndpZGdldDsgZGVsIHNlbGYud2lkZ2V0Ci0gICAgICAgIG9yaWcgPSBzZWxmLm9yaWc7IGRlbCBzZWxmLm9yaWcKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi53aWRnZXQKICAgICAgICAgdGsgPSB3aWRnZXQudGsKICAgICAgICAgdyA9IHdpZGdldC5fdworICAgICAgICAjIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHdpZGdldCBUY2wgY29tbWFuZC4KICAgICAgICAgdGsuZGVsZXRlY29tbWFuZCh3KQotICAgICAgICAjIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHdpZGdldCBUY2wgY29tbWFuZDoKLSAgICAgICAgdGsuY2FsbCgicmVuYW1lIiwgb3JpZywgdykKKyAgICAgICAgdGsuY2FsbCgicmVuYW1lIiwgc2VsZi5vcmlnLCB3KQorICAgICAgICBkZWwgc2VsZi53aWRnZXQsIHNlbGYudGsgICMgU2hvdWxkIG5vdCBiZSBuZWVkZWQKKyAgICAgICAgIyBpZiBpbnN0YW5jZSBpcyBkZWxldGVkIGFmdGVyIGNsb3NlLCBhcyBpbiBQZXJjb2xhdG9yLgogCiAgICAgZGVmIHJlZ2lzdGVyKHNlbGYsIG9wZXJhdGlvbiwgZnVuY3Rpb24pOgorICAgICAgICAnJydSZXR1cm4gT3JpZ2luYWxDb21tYW5kKG9wZXJhdGlvbikgYWZ0ZXIgcmVnaXN0ZXJpbmcgZnVuY3Rpb24uCisKKyAgICAgICAgUmVnaXN0cmF0aW9uIGFkZHMgYW4gb3BlcmF0aW9uOiBmdW5jdGlvbiBwYWlyIHRvIC5fb3BlcmF0aW9ucy4KKyAgICAgICAgSXQgYWxzbyBhZGRzIGFuIHdpZGdldCBmdW5jdGlvbiBhdHRyaWJ1dGUgdGhhdCBtYXNrcyB0aGUgVGtpbnRlcgorICAgICAgICBjbGFzcyBpbnN0YW5jZSBtZXRob2QuICBNZXRob2QgbWFza2luZyBvcGVyYXRlcyBpbmRlcGVuZGVudGx5CisgICAgICAgIGZyb20gY29tbWFuZCBkaXNwYXRjaC4KKworICAgICAgICBJZiBhIHNlY29uZCBmdW5jdGlvbiBpcyByZWdpc3RlcmVkIGZvciB0aGUgc2FtZSBvcGVyYXRpb24sIHRoZQorICAgICAgICBmaXJzdCBmdW5jdGlvbiBpcyByZXBsYWNlZCBpbiBib3RoIHBsYWNlcy4KKyAgICAgICAgJycnCiAgICAgICAgIHNlbGYuX29wZXJhdGlvbnNbb3BlcmF0aW9uXSA9IGZ1bmN0aW9uCiAgICAgICAgIHNldGF0dHIoc2VsZi53aWRnZXQsIG9wZXJhdGlvbiwgZnVuY3Rpb24pCiAgICAgICAgIHJldHVybiBPcmlnaW5hbENvbW1hbmQoc2VsZiwgb3BlcmF0aW9uKQogCiAgICAgZGVmIHVucmVnaXN0ZXIoc2VsZiwgb3BlcmF0aW9uKToKKyAgICAgICAgJycnUmV0dXJuIHRoZSBmdW5jdGlvbiBmb3IgdGhlIG9wZXJhdGlvbiwgb3IgTm9uZS4KKworICAgICAgICBEZWxldGluZyB0aGUgaW5zdGFuY2UgYXR0cmlidXRlIHVubWFza3MgdGhlIGNsYXNzIGF0dHJpYnV0ZS4KKyAgICAgICAgJycnCiAgICAgICAgIGlmIG9wZXJhdGlvbiBpbiBzZWxmLl9vcGVyYXRpb25zOgogICAgICAgICAgICAgZnVuY3Rpb24gPSBzZWxmLl9vcGVyYXRpb25zW29wZXJhdGlvbl0KICAgICAgICAgICAgIGRlbCBzZWxmLl9vcGVyYXRpb25zW29wZXJhdGlvbl0KLSAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi53aWRnZXQsIG9wZXJhdGlvbik6CisgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgZGVsYXR0cihzZWxmLndpZGdldCwgb3BlcmF0aW9uKQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbgogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmV0dXJuIE5vbmUKQEAgLTg4LDE0ICsxMTcsMjkgQEAKIAogCiBjbGFzcyBPcmlnaW5hbENvbW1hbmQ6CisgICAgJycnQ2FsbGFibGUgZm9yIG9yaWdpbmFsIHRrIGNvbW1hbmQgdGhhdCBoYXMgYmVlbiByZWRpcmVjdGVkLgorCisgICAgUmV0dXJuZWQgYnkgLnJlZ2lzdGVyOyBjYW4gYmUgdXNlZCBpbiB0aGUgZnVuY3Rpb24gcmVnaXN0ZXJlZC4KKyAgICByZWRpciA9IFdpZGdldFJlZGlyZWN0b3IodGV4dCkKKyAgICBkZWYgbXlfaW5zZXJ0KCphcmdzKToKKyAgICAgICAgcHJpbnQoImluc2VydCIsIGFyZ3MpCisgICAgICAgIG9yaWdpbmFsX2luc2VydCgqYXJncykKKyAgICBvcmlnaW5hbF9pbnNlcnQgPSByZWRpci5yZWdpc3RlcigiaW5zZXJ0IiwgbXlfaW5zZXJ0KQorICAgICcnJwogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlZGlyLCBvcGVyYXRpb24pOgorICAgICAgICAnJydDcmVhdGUgLnRrX2NhbGwgYW5kIC5vcmlnX2FuZF9vcGVyYXRpb24gZm9yIC5fX2NhbGxfXyBtZXRob2QuCisKKyAgICAgICAgLnJlZGlyIGFuZCAub3BlcmF0aW9uIHN0b3JlIHRoZSBpbnB1dCBhcmdzIGZvciBfX3JlcHJfXy4KKyAgICAgICAgLnRrIGFuZCAub3JpZyBjb3B5IGF0dHJpYnV0ZXMgb2YgLnJlZGlyIChwcm9iYWJseSBub3QgbmVlZGVkKS4KKyAgICAgICAgJycnCiAgICAgICAgIHNlbGYucmVkaXIgPSByZWRpcgogICAgICAgICBzZWxmLm9wZXJhdGlvbiA9IG9wZXJhdGlvbgotICAgICAgICBzZWxmLnRrID0gcmVkaXIudGsKLSAgICAgICAgc2VsZi5vcmlnID0gcmVkaXIub3JpZwotICAgICAgICBzZWxmLnRrX2NhbGwgPSBzZWxmLnRrLmNhbGwKLSAgICAgICAgc2VsZi5vcmlnX2FuZF9vcGVyYXRpb24gPSAoc2VsZi5vcmlnLCBzZWxmLm9wZXJhdGlvbikKKyAgICAgICAgc2VsZi50ayA9IHJlZGlyLnRrICAjIHJlZHVuZGFudCB3aXRoIHNlbGYucmVkaXIKKyAgICAgICAgc2VsZi5vcmlnID0gcmVkaXIub3JpZyAgIyByZWR1bmRhbnQgd2l0aCBzZWxmLnJlZGlyCisgICAgICAgICMgVGhlc2UgdHdvIGNvdWxkIGJlIGRlbGV0ZWQgYWZ0ZXIgY2hlY2tpbmcgcmVjaXBpZW50IGNvZGUuCisgICAgICAgIHNlbGYudGtfY2FsbCA9IHJlZGlyLnRrLmNhbGwKKyAgICAgICAgc2VsZi5vcmlnX2FuZF9vcGVyYXRpb24gPSAocmVkaXIub3JpZywgb3BlcmF0aW9uKQogCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gIk9yaWdpbmFsQ29tbWFuZCglciwgJXIpIiAlIChzZWxmLnJlZGlyLCBzZWxmLm9wZXJhdGlvbikKQEAgLTEwNCwyMyArMTQ4LDI3IEBACiAgICAgICAgIHJldHVybiBzZWxmLnRrX2NhbGwoc2VsZi5vcmlnX2FuZF9vcGVyYXRpb24gKyBhcmdzKQogCiAKLWRlZiBtYWluKCk6CitkZWYgX3dpZGdldF9yZWRpcmVjdG9yKHBhcmVudCk6ICAjIGh0ZXN0ICMKKyAgICBmcm9tIFRraW50ZXIgaW1wb3J0IFRrLCBUZXh0CisgICAgaW1wb3J0IHJlCisKICAgICByb290ID0gVGsoKQotICAgIHJvb3Qud21fcHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCByb290LnF1aXQpCi0gICAgdGV4dCA9IFRleHQoKQorICAgIHJvb3QudGl0bGUoIlRlc3QgV2lkZ2V0UmVkaXJlY3RvciIpCisgICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQorICAgIHJvb3QuZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNTApKQorICAgIHRleHQgPSBUZXh0KHJvb3QpCiAgICAgdGV4dC5wYWNrKCkKICAgICB0ZXh0LmZvY3VzX3NldCgpCiAgICAgcmVkaXIgPSBXaWRnZXRSZWRpcmVjdG9yKHRleHQpCi0gICAgZ2xvYmFsIHByZXZpb3VzX3RjbF9mY24KICAgICBkZWYgbXlfaW5zZXJ0KCphcmdzKToKICAgICAgICAgcHJpbnQgImluc2VydCIsIGFyZ3MKLSAgICAgICAgcHJldmlvdXNfdGNsX2ZjbigqYXJncykKLSAgICBwcmV2aW91c190Y2xfZmNuID0gcmVkaXIucmVnaXN0ZXIoImluc2VydCIsIG15X2luc2VydCkKKyAgICAgICAgb3JpZ2luYWxfaW5zZXJ0KCphcmdzKQorICAgIG9yaWdpbmFsX2luc2VydCA9IHJlZGlyLnJlZ2lzdGVyKCJpbnNlcnQiLCBteV9pbnNlcnQpCiAgICAgcm9vdC5tYWlubG9vcCgpCi0gICAgcmVkaXIudW5yZWdpc3RlcigiaW5zZXJ0IikgICMgcnVucyBhZnRlciBmaXJzdCAnY2xvc2Ugd2luZG93JwotICAgIHJlZGlyLmNsb3NlKCkKLSAgICByb290Lm1haW5sb29wKCkKLSAgICByb290LmRlc3Ryb3koKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIG1haW4oKQorICAgIGltcG9ydCB1bml0dGVzdAorICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3Rfd2lkZ2V0cmVkaXInLAorICAgICAgICAgICAgICAgICAgdmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCisgICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuCisgICAgcnVuKF93aWRnZXRfcmVkaXJlY3RvcikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1pvb21IZWlnaHQucHkgYi9MaWIvaWRsZWxpYi9ab29tSGVpZ2h0LnB5CmluZGV4IGU4ZDE3MTAuLmE1ZDY3OWUgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1pvb21IZWlnaHQucHkKKysrIGIvTGliL2lkbGVsaWIvWm9vbUhlaWdodC5weQpAQCAtMzIsNyArMzIsNyBAQAogICAgICAgICBuZXd5ID0gMAogICAgICAgICBuZXdoZWlnaHQgPSBuZXdoZWlnaHQgLSA3MgogCi0gICAgZWxpZiBtYWNvc3hTdXBwb3J0LnJ1bm5pbmdBc09TWEFwcCgpOgorICAgIGVsaWYgbWFjb3N4U3VwcG9ydC5pc0FxdWFUaygpOgogICAgICAgICAjIFRoZSAnODgnIGJlbG93IGlzIGEgbWFnaWMgbnVtYmVyIHRoYXQgYXZvaWRzIHBsYWNpbmcgdGhlIGJvdHRvbQogICAgICAgICAjIG9mIHRoZSB3aW5kb3cgYmVsb3cgdGhlIHBhbmVsIG9uIG15IG1hY2hpbmUuIEkgZG9uJ3Qga25vdyBob3cKICAgICAgICAgIyB0byBjYWxjdWxhdGUgdGhlIGNvcnJlY3QgdmFsdWUgZm9yIHRoaXMgd2l0aCB0a2ludGVyLgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvYWJvdXREaWFsb2cucHkgYi9MaWIvaWRsZWxpYi9hYm91dERpYWxvZy5weQppbmRleCA0M2ExMzEzLi5mYzVjNTMxIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9hYm91dERpYWxvZy5weQorKysgYi9MaWIvaWRsZWxpYi9hYm91dERpYWxvZy5weQpAQCAtMTIsMTEgKzEyLDE2IEBACiAgICAgIiIiTW9kYWwgYWJvdXQgZGlhbG9nIGZvciBpZGxlCiAKICAgICAiIiIKLSAgICBkZWYgX19pbml0X18oc2VsZixwYXJlbnQsdGl0bGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQsIHRpdGxlLCBfaHRlc3Q9RmFsc2UpOgorICAgICAgICAiIiIKKyAgICAgICAgX2h0ZXN0IC0gYm9vbCwgY2hhbmdlIGJveCBsb2NhdGlvbiB3aGVuIHJ1bm5pbmcgaHRlc3QKKyAgICAgICAgIiIiCiAgICAgICAgIFRvcGxldmVsLl9faW5pdF9fKHNlbGYsIHBhcmVudCkKICAgICAgICAgc2VsZi5jb25maWd1cmUoYm9yZGVyd2lkdGg9NSkKLSAgICAgICAgc2VsZi5nZW9tZXRyeSgiKyVkKyVkIiAlIChwYXJlbnQud2luZm9fcm9vdHgoKSszMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHkoKSszMCkpCisgICAgICAgICMgcGxhY2UgZGlhbG9nIGJlbG93IHBhcmVudCBpZiBydW5uaW5nIGh0ZXN0CisgICAgICAgIHNlbGYuZ2VvbWV0cnkoIislZCslZCIgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHgoKSszMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC53aW5mb19yb290eSgpKygzMCBpZiBub3QgX2h0ZXN0IGVsc2UgMTAwKSkpCiAgICAgICAgIHNlbGYuYmcgPSAiIzcwNzA3MCIKICAgICAgICAgc2VsZi5mZyA9ICIjZmZmZmZmIgogICAgICAgICBzZWxmLkNyZWF0ZVdpZGdldHMoKQpAQCAtNjYsMTIgKzcxLDcgQEAKICAgICAgICAgbGFiZWxQeXRob25WZXIgPSBMYWJlbChmcmFtZUJnLCB0ZXh0PSdQeXRob24gdmVyc2lvbjogICcgKyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnZlcnNpb24uc3BsaXQoKVswXSwgZmc9c2VsZi5mZywgYmc9c2VsZi5iZykKICAgICAgICAgbGFiZWxQeXRob25WZXIuZ3JpZChyb3c9OSwgY29sdW1uPTAsIHN0aWNreT1XLCBwYWR4PTEwLCBwYWR5PTApCi0gICAgICAgICMgaGFuZGxlIHdlaXJkIHRrIHZlcnNpb24gbnVtIGluIHdpbmRvemUgcHl0aG9uID49IDEuNiAoPyE/KQotICAgICAgICB0a1ZlciA9IHJlcHIoVGtWZXJzaW9uKS5zcGxpdCgnLicpCi0gICAgICAgIHRrVmVyW2xlbih0a1ZlciktMV0gPSBzdHIoJyUuM2cnICUgKGZsb2F0KCcuJyt0a1ZlcltsZW4odGtWZXIpLTFdKSkpWzI6XQotICAgICAgICBpZiB0a1ZlcltsZW4odGtWZXIpLTFdID09ICcnOgotICAgICAgICAgICAgdGtWZXJbbGVuKHRrVmVyKS0xXSA9ICcwJwotICAgICAgICB0a1ZlciA9ICcuJy5qb2luKHRrVmVyKQorICAgICAgICB0a1ZlciA9IHNlbGYudGsuY2FsbCgnaW5mbycsICdwYXRjaGxldmVsJykKICAgICAgICAgbGFiZWxUa1ZlciA9IExhYmVsKGZyYW1lQmcsIHRleHQ9J1RrIHZlcnNpb246ICAnKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGtWZXIsIGZnPXNlbGYuZmcsIGJnPXNlbGYuYmcpCiAgICAgICAgIGxhYmVsVGtWZXIuZ3JpZChyb3c9OSwgY29sdW1uPTEsIHN0aWNreT1XLCBwYWR4PTIsIHBhZHk9MCkKQEAgLTE0MSwxMCArMTQxLDUgQEAKICAgICAgICAgc2VsZi5kZXN0cm95KCkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICAjIHRlc3QgdGhlIGRpYWxvZwotICAgIHJvb3QgPSBUaygpCi0gICAgZGVmIHJ1bigpOgotICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IGFib3V0RGlhbG9nCi0gICAgICAgIGFib3V0RGlhbG9nLkFib3V0RGlhbG9nKHJvb3QsICdBYm91dCcpCi0gICAgQnV0dG9uKHJvb3QsIHRleHQ9J0RpYWxvZycsIGNvbW1hbmQ9cnVuKS5wYWNrKCkKLSAgICByb290Lm1haW5sb29wKCkKKyAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KKyAgICBydW4oQWJvdXREaWFsb2cpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9jb25maWctZXh0ZW5zaW9ucy5kZWYgYi9MaWIvaWRsZWxpYi9jb25maWctZXh0ZW5zaW9ucy5kZWYKaW5kZXggNzhiNjhmNi4uMzllNjljZSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvY29uZmlnLWV4dGVuc2lvbnMuZGVmCisrKyBiL0xpYi9pZGxlbGliL2NvbmZpZy1leHRlbnNpb25zLmRlZgpAQCAtNDYsNiArNDYsOCBAQAogCiBbU2NyaXB0QmluZGluZ10KIGVuYWJsZT0xCitlbmFibGVfc2hlbGw9MAorZW5hYmxlX2VkaXRvcj0xCiBbU2NyaXB0QmluZGluZ19jZmdCaW5kaW5nc10KIHJ1bi1tb2R1bGU9PEtleS1GNT4KIGNoZWNrLW1vZHVsZT08QWx0LUtleS14PgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvY29uZmlnLWtleXMuZGVmIGIvTGliL2lkbGVsaWIvY29uZmlnLWtleXMuZGVmCmluZGV4IGZkYzM1YmEuLjNiZmNiNjkgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2NvbmZpZy1rZXlzLmRlZgorKysgYi9MaWIvaWRsZWxpYi9jb25maWcta2V5cy5kZWYKQEAgLTEzLDM3ICsxMywzNyBAQAogcGFzdGU9PENvbnRyb2wtS2V5LXY+IDxDb250cm9sLUtleS1WPgogYmVnaW5uaW5nLW9mLWxpbmU9IDxLZXktSG9tZT4KIGNlbnRlci1pbnNlcnQ9PENvbnRyb2wtS2V5LWw+IDxDb250cm9sLUtleS1MPgotY2xvc2UtYWxsLXdpbmRvd3M9PENvbnRyb2wtS2V5LXE+CitjbG9zZS1hbGwtd2luZG93cz08Q29udHJvbC1LZXktcT4gPENvbnRyb2wtS2V5LVE+CiBjbG9zZS13aW5kb3c9PEFsdC1LZXktRjQ+IDxNZXRhLUtleS1GND4KIGRvLW5vdGhpbmc9PENvbnRyb2wtS2V5LUYxMj4KIGVuZC1vZi1maWxlPTxDb250cm9sLUtleS1kPiA8Q29udHJvbC1LZXktRD4KIHB5dGhvbi1kb2NzPTxLZXktRjE+CiBweXRob24tY29udGV4dC1oZWxwPTxTaGlmdC1LZXktRjE+Ci1oaXN0b3J5LW5leHQ9PEFsdC1LZXktbj4gPE1ldGEtS2V5LW4+Ci1oaXN0b3J5LXByZXZpb3VzPTxBbHQtS2V5LXA+IDxNZXRhLUtleS1wPgoraGlzdG9yeS1uZXh0PTxBbHQtS2V5LW4+IDxNZXRhLUtleS1uPiA8QWx0LUtleS1OPiA8TWV0YS1LZXktTj4KK2hpc3RvcnktcHJldmlvdXM9PEFsdC1LZXktcD4gPE1ldGEtS2V5LXA+IDxBbHQtS2V5LVA+IDxNZXRhLUtleS1QPgogaW50ZXJydXB0LWV4ZWN1dGlvbj08Q29udHJvbC1LZXktYz4gPENvbnRyb2wtS2V5LUM+CiB2aWV3LXJlc3RhcnQ9PEtleS1GNj4KIHJlc3RhcnQtc2hlbGw9PENvbnRyb2wtS2V5LUY2Pgotb3Blbi1jbGFzcy1icm93c2VyPTxBbHQtS2V5LWM+IDxNZXRhLUtleS1jPiA8QWx0LUtleS1DPgotb3Blbi1tb2R1bGU9PEFsdC1LZXktbT4gPE1ldGEtS2V5LW0+IDxBbHQtS2V5LU0+CitvcGVuLWNsYXNzLWJyb3dzZXI9PEFsdC1LZXktYz4gPE1ldGEtS2V5LWM+IDxBbHQtS2V5LUM+IDxNZXRhLUtleS1DPgorb3Blbi1tb2R1bGU9PEFsdC1LZXktbT4gPE1ldGEtS2V5LW0+IDxBbHQtS2V5LU0+IDxNZXRhLUtleS1NPgogb3Blbi1uZXctd2luZG93PTxDb250cm9sLUtleS1uPiA8Q29udHJvbC1LZXktTj4KIG9wZW4td2luZG93LWZyb20tZmlsZT08Q29udHJvbC1LZXktbz4gPENvbnRyb2wtS2V5LU8+CiBwbGFpbi1uZXdsaW5lLWFuZC1pbmRlbnQ9PENvbnRyb2wtS2V5LWo+IDxDb250cm9sLUtleS1KPgogcHJpbnQtd2luZG93PTxDb250cm9sLUtleS1wPiA8Q29udHJvbC1LZXktUD4KLXJlZG89PENvbnRyb2wtU2hpZnQtS2V5LVo+CityZWRvPTxDb250cm9sLVNoaWZ0LUtleS1aPiA8Q29udHJvbC1TaGlmdC1LZXktej4KIHJlbW92ZS1zZWxlY3Rpb249PEtleS1Fc2NhcGU+Ci1zYXZlLWNvcHktb2Ytd2luZG93LWFzLWZpbGU9PEFsdC1TaGlmdC1LZXktUz4KLXNhdmUtd2luZG93LWFzLWZpbGU9PENvbnRyb2wtU2hpZnQtS2V5LVM+Ci1zYXZlLXdpbmRvdz08Q29udHJvbC1LZXktcz4KLXNlbGVjdC1hbGw9PENvbnRyb2wtS2V5LWE+CitzYXZlLWNvcHktb2Ytd2luZG93LWFzLWZpbGU9PEFsdC1TaGlmdC1LZXktUz4gPEFsdC1TaGlmdC1LZXktcz4KK3NhdmUtd2luZG93LWFzLWZpbGU9PENvbnRyb2wtU2hpZnQtS2V5LVM+IDxDb250cm9sLVNoaWZ0LUtleS1zPgorc2F2ZS13aW5kb3c9PENvbnRyb2wtS2V5LXM+IDxDb250cm9sLUtleS1TPgorc2VsZWN0LWFsbD08Q29udHJvbC1LZXktYT4gPENvbnRyb2wtS2V5LUE+CiB0b2dnbGUtYXV0by1jb2xvcmluZz08Q29udHJvbC1LZXktc2xhc2g+CiB1bmRvPTxDb250cm9sLUtleS16PiA8Q29udHJvbC1LZXktWj4KIGZpbmQ9PENvbnRyb2wtS2V5LWY+IDxDb250cm9sLUtleS1GPgotZmluZC1hZ2Fpbj08Q29udHJvbC1LZXktZz4gPEtleS1GMz4KK2ZpbmQtYWdhaW49PENvbnRyb2wtS2V5LWc+IDxLZXktRjM+IDxDb250cm9sLUtleS1HPgogZmluZC1pbi1maWxlcz08QWx0LUtleS1GMz4gPE1ldGEtS2V5LUYzPgogZmluZC1zZWxlY3Rpb249PENvbnRyb2wtS2V5LUYzPgogcmVwbGFjZT08Q29udHJvbC1LZXktaD4gPENvbnRyb2wtS2V5LUg+Ci1nb3RvLWxpbmU9PEFsdC1LZXktZz4gPE1ldGEtS2V5LWc+Citnb3RvLWxpbmU9PEFsdC1LZXktZz4gPE1ldGEtS2V5LWc+IDxBbHQtS2V5LUc+IDxNZXRhLUtleS1HPgogc21hcnQtYmFja3NwYWNlPTxLZXktQmFja1NwYWNlPgogbmV3bGluZS1hbmQtaW5kZW50PTxLZXktUmV0dXJuPiA8S2V5LUtQX0VudGVyPgogc21hcnQtaW5kZW50PTxLZXktVGFiPgpAQCAtNTMsOCArNTMsOCBAQAogdW5jb21tZW50LXJlZ2lvbj08QWx0LUtleS00PiA8TWV0YS1LZXktND4KIHRhYmlmeS1yZWdpb249PEFsdC1LZXktNT4gPE1ldGEtS2V5LTU+CiB1bnRhYmlmeS1yZWdpb249PEFsdC1LZXktNj4gPE1ldGEtS2V5LTY+Ci10b2dnbGUtdGFicz08QWx0LUtleS10PiA8TWV0YS1LZXktdD4gPEFsdC1LZXktVD4KLWNoYW5nZS1pbmRlbnR3aWR0aD08QWx0LUtleS11PiA8TWV0YS1LZXktdT4gPEFsdC1LZXktVT4KK3RvZ2dsZS10YWJzPTxBbHQtS2V5LXQ+IDxNZXRhLUtleS10PiA8QWx0LUtleS1UPiA8TWV0YS1LZXktVD4KK2NoYW5nZS1pbmRlbnR3aWR0aD08QWx0LUtleS11PiA8TWV0YS1LZXktdT4gPEFsdC1LZXktVT4gPE1ldGEtS2V5LVU+CiBkZWwtd29yZC1sZWZ0PTxDb250cm9sLUtleS1CYWNrU3BhY2U+CiBkZWwtd29yZC1yaWdodD08Q29udHJvbC1LZXktRGVsZXRlPgogCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9jb25maWctbWFpbi5kZWYgYi9MaWIvaWRsZWxpYi9jb25maWctbWFpbi5kZWYKaW5kZXggNWRkZDA5OC4uMTMyNzk3YyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvY29uZmlnLW1haW4uZGVmCisrKyBiL0xpYi9pZGxlbGliL2NvbmZpZy1tYWluLmRlZgpAQCAtNTksNyArNTksNyBAQAogZW5jb2Rpbmc9IG5vbmUKIAogW0Zvcm1hdFBhcmFncmFwaF0KLXBhcmFncmFwaD03MAorcGFyYWdyYXBoPTcyCiAKIFtJbmRlbnRdCiB1c2Utc3BhY2VzPSAxCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9jb25maWdEaWFsb2cucHkgYi9MaWIvaWRsZWxpYi9jb25maWdEaWFsb2cucHkKaW5kZXggZGJhZWRjNy4uYmNmMzljMyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvY29uZmlnRGlhbG9nLnB5CisrKyBiL0xpYi9pZGxlbGliL2NvbmZpZ0RpYWxvZy5weQpAQCAtMTEsNyArMTEsNiBAQAogIiIiCiBmcm9tIFRraW50ZXIgaW1wb3J0ICoKIGltcG9ydCB0a01lc3NhZ2VCb3gsIHRrQ29sb3JDaG9vc2VyLCB0a0ZvbnQKLWltcG9ydCBzdHJpbmcKIAogZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCiBmcm9tIGlkbGVsaWIuZHluT3B0aW9uTWVudVdpZGdldCBpbXBvcnQgRHluT3B0aW9uTWVudQpAQCAtMjMsMTQgKzIyLDIxIEBACiAKIGNsYXNzIENvbmZpZ0RpYWxvZyhUb3BsZXZlbCk6CiAKLSAgICBkZWYgX19pbml0X18oc2VsZixwYXJlbnQsdGl0bGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQsIHRpdGxlLCBfaHRlc3Q9RmFsc2UsIF91dGVzdD1GYWxzZSk6CisgICAgICAgICIiIgorICAgICAgICBfaHRlc3QgLSBib29sLCBjaGFuZ2UgYm94IGxvY2F0aW9uIHdoZW4gcnVubmluZyBodGVzdAorICAgICAgICBfdXRlc3QgLSBib29sLCBkb24ndCB3YWl0X3dpbmRvdyB3aGVuIHJ1bm5pbmcgdW5pdHRlc3QKKyAgICAgICAgIiIiCiAgICAgICAgIFRvcGxldmVsLl9faW5pdF9fKHNlbGYsIHBhcmVudCkKKyAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKICAgICAgICAgc2VsZi53bV93aXRoZHJhdygpCiAKICAgICAgICAgc2VsZi5jb25maWd1cmUoYm9yZGVyd2lkdGg9NSkKICAgICAgICAgc2VsZi50aXRsZSgnSURMRSBQcmVmZXJlbmNlcycpCisgICAgICAgIGlmIF9odGVzdDoKKyAgICAgICAgICAgIHBhcmVudC5pbnN0YW5jZV9kaWN0ID0ge30KICAgICAgICAgc2VsZi5nZW9tZXRyeSgiKyVkKyVkIiAlIChwYXJlbnQud2luZm9fcm9vdHgoKSsyMCwKLSAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHkoKSszMCkpCisgICAgICAgICAgICAgICAgcGFyZW50LndpbmZvX3Jvb3R5KCkrKDMwIGlmIG5vdCBfaHRlc3QgZWxzZSAxNTApKSkKICAgICAgICAgI1RoZW1lIEVsZW1lbnRzLiBFYWNoIHRoZW1lIGVsZW1lbnQga2V5IGlzIGl0cyBkaXNwbGF5IG5hbWUuCiAgICAgICAgICNUaGUgZmlyc3QgdmFsdWUgb2YgdGhlIHR1cGxlIGlzIHRoZSBzYW1wbGUgYXJlYSB0YWcgbmFtZS4KICAgICAgICAgI1RoZSBzZWNvbmQgdmFsdWUgaXMgdGhlIGRpc3BsYXkgbmFtZSBsaXN0IHNvcnQgaW5kZXguCkBAIC01NCw3ICs2MCw2IEBACiAgICAgICAgIHNlbGYudHJhbnNpZW50KHBhcmVudCkKICAgICAgICAgc2VsZi5ncmFiX3NldCgpCiAgICAgICAgIHNlbGYucHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBzZWxmLkNhbmNlbCkKLSAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKICAgICAgICAgc2VsZi50YWJQYWdlcy5mb2N1c19zZXQoKQogICAgICAgICAja2V5IGJpbmRpbmdzIGZvciB0aGlzIGRpYWxvZwogICAgICAgICAjc2VsZi5iaW5kKCc8RXNjYXBlPicsc2VsZi5DYW5jZWwpICNkaXNtaXNzIGRpYWxvZywgbm8gc2F2ZQpAQCAtNjMsMjQgKzY4LDI2IEBACiAgICAgICAgIHNlbGYuTG9hZENvbmZpZ3MoKQogICAgICAgICBzZWxmLkF0dGFjaFZhckNhbGxiYWNrcygpICNhdm9pZCBjYWxsYmFja3MgZHVyaW5nIExvYWRDb25maWdzCiAKLSAgICAgICAgc2VsZi53bV9kZWljb25pZnkoKQotICAgICAgICBzZWxmLndhaXRfd2luZG93KCkKKyAgICAgICAgaWYgbm90IF91dGVzdDoKKyAgICAgICAgICAgIHNlbGYud21fZGVpY29uaWZ5KCkKKyAgICAgICAgICAgIHNlbGYud2FpdF93aW5kb3coKQogCiAgICAgZGVmIENyZWF0ZVdpZGdldHMoc2VsZik6CiAgICAgICAgIHNlbGYudGFiUGFnZXMgPSBUYWJiZWRQYWdlU2V0KHNlbGYsCiAgICAgICAgICAgICAgICAgcGFnZV9uYW1lcz1bJ0ZvbnRzL1RhYnMnLCdIaWdobGlnaHRpbmcnLCdLZXlzJywnR2VuZXJhbCddKQogICAgICAgICBmcmFtZUFjdGlvbkJ1dHRvbnMgPSBGcmFtZShzZWxmLHBhZHk9MikKICAgICAgICAgI2FjdGlvbiBidXR0b25zCi0gICAgICAgIGlmIG1hY29zeFN1cHBvcnQucnVubmluZ0FzT1NYQXBwKCk6CisgICAgICAgIGlmIG1hY29zeFN1cHBvcnQuaXNBcXVhVGsoKToKICAgICAgICAgICAgICMgQ2hhbmdpbmcgdGhlIGRlZmF1bHQgcGFkZGluZyBvbiBPU1ggcmVzdWx0cyBpbiB1bnJlYWRhYmxlCiAgICAgICAgICAgICAjIHRleHQgaW4gdGhlIGJ1dHRvbnMKICAgICAgICAgICAgIHBhZGRpbmdBcmdzPXt9CiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBwYWRkaW5nQXJncz17J3BhZHgnOjYsICdwYWR5JzozfQogCi0gICAgICAgIHNlbGYuYnV0dG9uSGVscCA9IEJ1dHRvbihmcmFtZUFjdGlvbkJ1dHRvbnMsdGV4dD0nSGVscCcsCi0gICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLkhlbHAsdGFrZWZvY3VzPUZBTFNFLAotICAgICAgICAgICAgICAgICoqcGFkZGluZ0FyZ3MpCisjIENvbW1lbnQgb3V0IGJ1dHRvbiBjcmVhdGlvbiBhbmQgcGFja2luZyB1bnRpbCBpbXBsZW1lbnQgc2VsZi5IZWxwCisjIyAgICAgICAgc2VsZi5idXR0b25IZWxwID0gQnV0dG9uKGZyYW1lQWN0aW9uQnV0dG9ucyx0ZXh0PSdIZWxwJywKKyMjICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5IZWxwLHRha2Vmb2N1cz1GQUxTRSwKKyMjICAgICAgICAgICAgICAgICoqcGFkZGluZ0FyZ3MpCiAgICAgICAgIHNlbGYuYnV0dG9uT2sgPSBCdXR0b24oZnJhbWVBY3Rpb25CdXR0b25zLHRleHQ9J09rJywKICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYuT2ssdGFrZWZvY3VzPUZBTFNFLAogICAgICAgICAgICAgICAgICoqcGFkZGluZ0FyZ3MpCkBAIC05NCw3ICsxMDEsNyBAQAogICAgICAgICBzZWxmLkNyZWF0ZVBhZ2VIaWdobGlnaHQoKQogICAgICAgICBzZWxmLkNyZWF0ZVBhZ2VLZXlzKCkKICAgICAgICAgc2VsZi5DcmVhdGVQYWdlR2VuZXJhbCgpCi0gICAgICAgIHNlbGYuYnV0dG9uSGVscC5wYWNrKHNpZGU9UklHSFQscGFkeD01KQorIyMgICAgICAgIHNlbGYuYnV0dG9uSGVscC5wYWNrKHNpZGU9UklHSFQscGFkeD01KQogICAgICAgICBzZWxmLmJ1dHRvbk9rLnBhY2soc2lkZT1MRUZULHBhZHg9NSkKICAgICAgICAgc2VsZi5idXR0b25BcHBseS5wYWNrKHNpZGU9TEVGVCxwYWR4PTUpCiAgICAgICAgIHNlbGYuYnV0dG9uQ2FuY2VsLnBhY2soc2lkZT1MRUZULHBhZHg9NSkKQEAgLTEwMywxMiArMTEwLDEzIEBACiAgICAgICAgIHNlbGYudGFiUGFnZXMucGFjayhzaWRlPVRPUCxleHBhbmQ9VFJVRSxmaWxsPUJPVEgpCiAKICAgICBkZWYgQ3JlYXRlUGFnZUZvbnRUYWIoc2VsZik6Ci0gICAgICAgICN0a1ZhcnMKLSAgICAgICAgc2VsZi5mb250U2l6ZT1TdHJpbmdWYXIoc2VsZikKLSAgICAgICAgc2VsZi5mb250Qm9sZD1Cb29sZWFuVmFyKHNlbGYpCi0gICAgICAgIHNlbGYuZm9udE5hbWU9U3RyaW5nVmFyKHNlbGYpCi0gICAgICAgIHNlbGYuc3BhY2VOdW09SW50VmFyKHNlbGYpCi0gICAgICAgIHNlbGYuZWRpdEZvbnQ9dGtGb250LkZvbnQoc2VsZiwoJ2NvdXJpZXInLDEwLCdub3JtYWwnKSkKKyAgICAgICAgcGFyZW50ID0gc2VsZi5wYXJlbnQKKyAgICAgICAgc2VsZi5mb250U2l6ZSA9IFN0cmluZ1ZhcihwYXJlbnQpCisgICAgICAgIHNlbGYuZm9udEJvbGQgPSBCb29sZWFuVmFyKHBhcmVudCkKKyAgICAgICAgc2VsZi5mb250TmFtZSA9IFN0cmluZ1ZhcihwYXJlbnQpCisgICAgICAgIHNlbGYuc3BhY2VOdW0gPSBJbnRWYXIocGFyZW50KQorICAgICAgICBzZWxmLmVkaXRGb250ID0gdGtGb250LkZvbnQocGFyZW50LCgnY291cmllcicsMTAsJ25vcm1hbCcpKQorCiAgICAgICAgICMjd2lkZ2V0IGNyZWF0aW9uCiAgICAgICAgICNib2R5IGZyYW1lCiAgICAgICAgIGZyYW1lPXNlbGYudGFiUGFnZXMucGFnZXNbJ0ZvbnRzL1RhYnMnXS5mcmFtZQpAQCAtMTQ0LDYgKzE1Miw3IEBACiAgICAgICAgIHNlbGYuc2NhbGVTcGFjZU51bT1TY2FsZShmcmFtZUluZGVudFNpemUsIHZhcmlhYmxlPXNlbGYuc3BhY2VOdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnQ9J2hvcml6b250YWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlja2ludGVydmFsPTIsIGZyb21fPTIsIHRvPTE2KQorCiAgICAgICAgICN3aWRnZXQgcGFja2luZwogICAgICAgICAjYm9keQogICAgICAgICBmcmFtZUZvbnQucGFjayhzaWRlPUxFRlQscGFkeD01LHBhZHk9NSxleHBhbmQ9VFJVRSxmaWxsPUJPVEgpCkBAIC0xNjYsMTMgKzE3NSwxNSBAQAogICAgICAgICByZXR1cm4gZnJhbWUKIAogICAgIGRlZiBDcmVhdGVQYWdlSGlnaGxpZ2h0KHNlbGYpOgotICAgICAgICBzZWxmLmJ1aWx0aW5UaGVtZT1TdHJpbmdWYXIoc2VsZikKLSAgICAgICAgc2VsZi5jdXN0b21UaGVtZT1TdHJpbmdWYXIoc2VsZikKLSAgICAgICAgc2VsZi5mZ0hpbGl0ZT1Cb29sZWFuVmFyKHNlbGYpCi0gICAgICAgIHNlbGYuY29sb3VyPVN0cmluZ1ZhcihzZWxmKQotICAgICAgICBzZWxmLmZvbnROYW1lPVN0cmluZ1ZhcihzZWxmKQotICAgICAgICBzZWxmLnRoZW1lSXNCdWlsdGluPUJvb2xlYW5WYXIoc2VsZikKLSAgICAgICAgc2VsZi5oaWdobGlnaHRUYXJnZXQ9U3RyaW5nVmFyKHNlbGYpCisgICAgICAgIHBhcmVudCA9IHNlbGYucGFyZW50CisgICAgICAgIHNlbGYuYnVpbHRpblRoZW1lID0gU3RyaW5nVmFyKHBhcmVudCkKKyAgICAgICAgc2VsZi5jdXN0b21UaGVtZSA9IFN0cmluZ1ZhcihwYXJlbnQpCisgICAgICAgIHNlbGYuZmdIaWxpdGUgPSBCb29sZWFuVmFyKHBhcmVudCkKKyAgICAgICAgc2VsZi5jb2xvdXIgPSBTdHJpbmdWYXIocGFyZW50KQorICAgICAgICBzZWxmLmZvbnROYW1lID0gU3RyaW5nVmFyKHBhcmVudCkKKyAgICAgICAgc2VsZi50aGVtZUlzQnVpbHRpbiA9IEJvb2xlYW5WYXIocGFyZW50KQorICAgICAgICBzZWxmLmhpZ2hsaWdodFRhcmdldCA9IFN0cmluZ1ZhcihwYXJlbnQpCisKICAgICAgICAgIyN3aWRnZXQgY3JlYXRpb24KICAgICAgICAgI2JvZHkgZnJhbWUKICAgICAgICAgZnJhbWU9c2VsZi50YWJQYWdlcy5wYWdlc1snSGlnaGxpZ2h0aW5nJ10uZnJhbWUKQEAgLTE4Myw3ICsxOTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0nIEhpZ2hsaWdodGluZyBUaGVtZSAnKQogICAgICAgICAjZnJhbWVDdXN0b20KICAgICAgICAgc2VsZi50ZXh0SGlnaGxpZ2h0U2FtcGxlPVRleHQoZnJhbWVDdXN0b20scmVsaWVmPVNPTElELGJvcmRlcndpZHRoPTEsCi0gICAgICAgICAgICBmb250PSgnY291cmllcicsMTIsJycpLGN1cnNvcj0naGFuZDInLHdpZHRoPTIxLGhlaWdodD0xMCwKKyAgICAgICAgICAgIGZvbnQ9KCdjb3VyaWVyJywxMiwnJyksY3Vyc29yPSdoYW5kMicsd2lkdGg9MjEsaGVpZ2h0PTExLAogICAgICAgICAgICAgdGFrZWZvY3VzPUZBTFNFLGhpZ2hsaWdodHRoaWNrbmVzcz0wLHdyYXA9Tk9ORSkKICAgICAgICAgdGV4dD1zZWxmLnRleHRIaWdobGlnaHRTYW1wbGUKICAgICAgICAgdGV4dC5iaW5kKCc8RG91YmxlLUJ1dHRvbi0xPicsbGFtYmRhIGU6ICdicmVhaycpCkBAIC0yMDEsNyArMjEyLDcgQEAKICAgICAgICAgICAgICgnICcsJ25vcm1hbCcpLCgnc3RkZXJyJywnc3RkZXJyJyksKCdcbicsJ25vcm1hbCcpKQogICAgICAgICBmb3IgdHhUYSBpbiB0ZXh0QW5kVGFnczoKICAgICAgICAgICAgIHRleHQuaW5zZXJ0KEVORCx0eFRhWzBdLHR4VGFbMV0pCi0gICAgICAgIGZvciBlbGVtZW50IGluIHNlbGYudGhlbWVFbGVtZW50cy5rZXlzKCk6CisgICAgICAgIGZvciBlbGVtZW50IGluIHNlbGYudGhlbWVFbGVtZW50czoKICAgICAgICAgICAgIHRleHQudGFnX2JpbmQoc2VsZi50aGVtZUVsZW1lbnRzW2VsZW1lbnRdWzBdLCc8QnV0dG9uUHJlc3MtMT4nLAogICAgICAgICAgICAgICAgIGxhbWJkYSBldmVudCxlbGVtPWVsZW1lbnQ6IGV2ZW50LndpZGdldC53aW5mb190b3BsZXZlbCgpCiAgICAgICAgICAgICAgICAgLmhpZ2hsaWdodFRhcmdldC5zZXQoZWxlbSkpCkBAIC0yMzEsNiArMjQyLDcgQEAKICAgICAgICAgICAgIHNlbGYuY3VzdG9tVGhlbWUsTm9uZSxjb21tYW5kPU5vbmUpCiAgICAgICAgIHNlbGYuYnV0dG9uRGVsZXRlQ3VzdG9tVGhlbWU9QnV0dG9uKGZyYW1lVGhlbWUsdGV4dD0nRGVsZXRlIEN1c3RvbSBUaGVtZScsCiAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLkRlbGV0ZUN1c3RvbVRoZW1lKQorCiAgICAgICAgICMjd2lkZ2V0IHBhY2tpbmcKICAgICAgICAgI2JvZHkKICAgICAgICAgZnJhbWVDdXN0b20ucGFjayhzaWRlPUxFRlQscGFkeD01LHBhZHk9NSxleHBhbmQ9VFJVRSxmaWxsPUJPVEgpCkBAIC0yNTUsMTIgKzI2NywxMyBAQAogICAgICAgICByZXR1cm4gZnJhbWUKIAogICAgIGRlZiBDcmVhdGVQYWdlS2V5cyhzZWxmKToKLSAgICAgICAgI3RrVmFycwotICAgICAgICBzZWxmLmJpbmRpbmdUYXJnZXQ9U3RyaW5nVmFyKHNlbGYpCi0gICAgICAgIHNlbGYuYnVpbHRpbktleXM9U3RyaW5nVmFyKHNlbGYpCi0gICAgICAgIHNlbGYuY3VzdG9tS2V5cz1TdHJpbmdWYXIoc2VsZikKLSAgICAgICAgc2VsZi5rZXlzQXJlQnVpbHRpbj1Cb29sZWFuVmFyKHNlbGYpCi0gICAgICAgIHNlbGYua2V5QmluZGluZz1TdHJpbmdWYXIoc2VsZikKKyAgICAgICAgcGFyZW50ID0gc2VsZi5wYXJlbnQKKyAgICAgICAgc2VsZi5iaW5kaW5nVGFyZ2V0ID0gU3RyaW5nVmFyKHBhcmVudCkKKyAgICAgICAgc2VsZi5idWlsdGluS2V5cyA9IFN0cmluZ1ZhcihwYXJlbnQpCisgICAgICAgIHNlbGYuY3VzdG9tS2V5cyA9IFN0cmluZ1ZhcihwYXJlbnQpCisgICAgICAgIHNlbGYua2V5c0FyZUJ1aWx0aW4gPSBCb29sZWFuVmFyKHBhcmVudCkKKyAgICAgICAgc2VsZi5rZXlCaW5kaW5nID0gU3RyaW5nVmFyKHBhcmVudCkKKwogICAgICAgICAjI3dpZGdldCBjcmVhdGlvbgogICAgICAgICAjYm9keSBmcmFtZQogICAgICAgICBmcmFtZT1zZWxmLnRhYlBhZ2VzLnBhZ2VzWydLZXlzJ10uZnJhbWUKQEAgLTI5OCw2ICszMTEsNyBAQAogICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5EZWxldGVDdXN0b21LZXlzKQogICAgICAgICBidXR0b25TYXZlQ3VzdG9tS2V5cz1CdXR0b24oZnJhbWVzWzFdLAogICAgICAgICAgICAgICAgIHRleHQ9J1NhdmUgYXMgTmV3IEN1c3RvbSBLZXkgU2V0Jyxjb21tYW5kPXNlbGYuU2F2ZUFzTmV3S2V5U2V0KQorCiAgICAgICAgICMjd2lkZ2V0IHBhY2tpbmcKICAgICAgICAgI2JvZHkKICAgICAgICAgZnJhbWVDdXN0b20ucGFjayhzaWRlPUJPVFRPTSxwYWR4PTUscGFkeT01LGV4cGFuZD1UUlVFLGZpbGw9Qk9USCkKQEAgLTMyNCwxNSArMzM4LDE2IEBACiAgICAgICAgIHJldHVybiBmcmFtZQogCiAgICAgZGVmIENyZWF0ZVBhZ2VHZW5lcmFsKHNlbGYpOgotICAgICAgICAjdGtWYXJzCi0gICAgICAgIHNlbGYud2luV2lkdGg9U3RyaW5nVmFyKHNlbGYpCi0gICAgICAgIHNlbGYud2luSGVpZ2h0PVN0cmluZ1ZhcihzZWxmKQotICAgICAgICBzZWxmLnBhcmFXaWR0aD1TdHJpbmdWYXIoc2VsZikKLSAgICAgICAgc2VsZi5zdGFydHVwRWRpdD1JbnRWYXIoc2VsZikKLSAgICAgICAgc2VsZi5hdXRvU2F2ZT1JbnRWYXIoc2VsZikKLSAgICAgICAgc2VsZi5lbmNvZGluZz1TdHJpbmdWYXIoc2VsZikKLSAgICAgICAgc2VsZi51c2VySGVscEJyb3dzZXI9Qm9vbGVhblZhcihzZWxmKQotICAgICAgICBzZWxmLmhlbHBCcm93c2VyPVN0cmluZ1ZhcihzZWxmKQorICAgICAgICBwYXJlbnQgPSBzZWxmLnBhcmVudAorICAgICAgICBzZWxmLndpbldpZHRoID0gU3RyaW5nVmFyKHBhcmVudCkKKyAgICAgICAgc2VsZi53aW5IZWlnaHQgPSBTdHJpbmdWYXIocGFyZW50KQorICAgICAgICBzZWxmLnBhcmFXaWR0aCA9IFN0cmluZ1ZhcihwYXJlbnQpCisgICAgICAgIHNlbGYuc3RhcnR1cEVkaXQgPSBJbnRWYXIocGFyZW50KQorICAgICAgICBzZWxmLmF1dG9TYXZlID0gSW50VmFyKHBhcmVudCkKKyAgICAgICAgc2VsZi5lbmNvZGluZyA9IFN0cmluZ1ZhcihwYXJlbnQpCisgICAgICAgIHNlbGYudXNlckhlbHBCcm93c2VyID0gQm9vbGVhblZhcihwYXJlbnQpCisgICAgICAgIHNlbGYuaGVscEJyb3dzZXIgPSBTdHJpbmdWYXIocGFyZW50KQorCiAgICAgICAgICN3aWRnZXQgY3JlYXRpb24KICAgICAgICAgI2JvZHkKICAgICAgICAgZnJhbWU9c2VsZi50YWJQYWdlcy5wYWdlc1snR2VuZXJhbCddLmZyYW1lCkBAIC0zOTUsNiArNDEwLDcgQEAKICAgICAgICAgICAgICAgICB3aWR0aD04LGNvbW1hbmQ9c2VsZi5IZWxwTGlzdEl0ZW1BZGQpCiAgICAgICAgIHNlbGYuYnV0dG9uSGVscExpc3RSZW1vdmU9QnV0dG9uKGZyYW1lSGVscExpc3RCdXR0b25zLHRleHQ9J1JlbW92ZScsCiAgICAgICAgICAgICAgICAgc3RhdGU9RElTQUJMRUQsd2lkdGg9OCxjb21tYW5kPXNlbGYuSGVscExpc3RJdGVtUmVtb3ZlKQorCiAgICAgICAgICN3aWRnZXQgcGFja2luZwogICAgICAgICAjYm9keQogICAgICAgICBmcmFtZVJ1bi5wYWNrKHNpZGU9VE9QLHBhZHg9NSxwYWR5PTUsZmlsbD1YKQpAQCAtNTY4LDcgKzU4NCw3IEBACiAKICAgICBkZWYgR2V0RGVmYXVsdEl0ZW1zKHNlbGYpOgogICAgICAgICBkSXRlbXM9eydtYWluJzp7fSwnaGlnaGxpZ2h0Jzp7fSwna2V5cyc6e30sJ2V4dGVuc2lvbnMnOnt9fQotICAgICAgICBmb3IgY29uZmlnVHlwZSBpbiBkSXRlbXMua2V5cygpOgorICAgICAgICBmb3IgY29uZmlnVHlwZSBpbiBkSXRlbXM6CiAgICAgICAgICAgICBzZWN0aW9ucz1pZGxlQ29uZi5HZXRTZWN0aW9uTGlzdCgnZGVmYXVsdCcsY29uZmlnVHlwZSkKICAgICAgICAgICAgIGZvciBzZWN0aW9uIGluIHNlY3Rpb25zOgogICAgICAgICAgICAgICAgIGRJdGVtc1tjb25maWdUeXBlXVtzZWN0aW9uXT17fQpAQCAtNjA5LDkgKzYyNSw5IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBjdXJyZW50S2V5U2V0TmFtZT1zZWxmLmN1c3RvbUtleXMuZ2V0KCkKICAgICAgICAgY3VycmVudEJpbmRpbmdzPWlkbGVDb25mLkdldEN1cnJlbnRLZXlTZXQoKQotICAgICAgICBpZiBjdXJyZW50S2V5U2V0TmFtZSBpbiBzZWxmLmNoYW5nZWRJdGVtc1sna2V5cyddLmtleXMoKTogI3Vuc2F2ZWQgY2hhbmdlcworICAgICAgICBpZiBjdXJyZW50S2V5U2V0TmFtZSBpbiBzZWxmLmNoYW5nZWRJdGVtc1sna2V5cyddOiAjdW5zYXZlZCBjaGFuZ2VzCiAgICAgICAgICAgICBrZXlTZXRDaGFuZ2VzPXNlbGYuY2hhbmdlZEl0ZW1zWydrZXlzJ11bY3VycmVudEtleVNldE5hbWVdCi0gICAgICAgICAgICBmb3IgZXZlbnQgaW4ga2V5U2V0Q2hhbmdlcy5rZXlzKCk6CisgICAgICAgICAgICBmb3IgZXZlbnQgaW4ga2V5U2V0Q2hhbmdlczoKICAgICAgICAgICAgICAgICBjdXJyZW50QmluZGluZ3NbZXZlbnRdPWtleVNldENoYW5nZXNbZXZlbnRdLnNwbGl0KCkKICAgICAgICAgY3VycmVudEtleVNlcXVlbmNlcz1jdXJyZW50QmluZGluZ3MudmFsdWVzKCkKICAgICAgICAgbmV3S2V5cz1HZXRLZXlzRGlhbG9nKHNlbGYsJ0dldCBOZXcgS2V5cycsYmluZE5hbWUsCkBAIC02NjAsMTQgKzY3NiwxNCBAQAogICAgICAgICAgICAgcHJldktleVNldE5hbWU9c2VsZi5jdXN0b21LZXlzLmdldCgpCiAgICAgICAgIHByZXZLZXlzPWlkbGVDb25mLkdldENvcmVLZXlzKHByZXZLZXlTZXROYW1lKQogICAgICAgICBuZXdLZXlzPXt9Ci0gICAgICAgIGZvciBldmVudCBpbiBwcmV2S2V5cy5rZXlzKCk6ICNhZGQga2V5IHNldCB0byBjaGFuZ2VkIGl0ZW1zCisgICAgICAgIGZvciBldmVudCBpbiBwcmV2S2V5czogI2FkZCBrZXkgc2V0IHRvIGNoYW5nZWQgaXRlbXMKICAgICAgICAgICAgIGV2ZW50TmFtZT1ldmVudFsyOi0yXSAjdHJpbSBvZmYgdGhlIGFuZ2xlIGJyYWNrZXRzCi0gICAgICAgICAgICBiaW5kaW5nPXN0cmluZy5qb2luKHByZXZLZXlzW2V2ZW50XSkKKyAgICAgICAgICAgIGJpbmRpbmc9JyAnLmpvaW4ocHJldktleXNbZXZlbnRdKQogICAgICAgICAgICAgbmV3S2V5c1tldmVudE5hbWVdPWJpbmRpbmcKICAgICAgICAgI2hhbmRsZSBhbnkgdW5zYXZlZCBjaGFuZ2VzIHRvIHByZXYga2V5IHNldAotICAgICAgICBpZiBwcmV2S2V5U2V0TmFtZSBpbiBzZWxmLmNoYW5nZWRJdGVtc1sna2V5cyddLmtleXMoKToKKyAgICAgICAgaWYgcHJldktleVNldE5hbWUgaW4gc2VsZi5jaGFuZ2VkSXRlbXNbJ2tleXMnXToKICAgICAgICAgICAgIGtleVNldENoYW5nZXM9c2VsZi5jaGFuZ2VkSXRlbXNbJ2tleXMnXVtwcmV2S2V5U2V0TmFtZV0KLSAgICAgICAgICAgIGZvciBldmVudCBpbiBrZXlTZXRDaGFuZ2VzLmtleXMoKToKKyAgICAgICAgICAgIGZvciBldmVudCBpbiBrZXlTZXRDaGFuZ2VzOgogICAgICAgICAgICAgICAgIG5ld0tleXNbZXZlbnRdPWtleVNldENoYW5nZXNbZXZlbnRdCiAgICAgICAgICNzYXZlIHRoZSBuZXcgdGhlbWUKICAgICAgICAgc2VsZi5TYXZlTmV3S2V5U2V0KG5ld0tleVNldE5hbWUsbmV3S2V5cykKQEAgLTY4OSwxMSArNzA1LDExIEBACiAgICAgICAgIGJpbmROYW1lcy5zb3J0KCkKICAgICAgICAgc2VsZi5saXN0QmluZGluZ3MuZGVsZXRlKDAsRU5EKQogICAgICAgICBmb3IgYmluZE5hbWUgaW4gYmluZE5hbWVzOgotICAgICAgICAgICAga2V5PXN0cmluZy5qb2luKGtleVNldFtiaW5kTmFtZV0pICNtYWtlIGtleShzKSBpbnRvIGEgc3RyaW5nCisgICAgICAgICAgICBrZXk9JyAnLmpvaW4oa2V5U2V0W2JpbmROYW1lXSkgI21ha2Uga2V5KHMpIGludG8gYSBzdHJpbmcKICAgICAgICAgICAgIGJpbmROYW1lPWJpbmROYW1lWzI6LTJdICN0cmltIG9mZiB0aGUgYW5nbGUgYnJhY2tldHMKLSAgICAgICAgICAgIGlmIGtleVNldE5hbWUgaW4gc2VsZi5jaGFuZ2VkSXRlbXNbJ2tleXMnXS5rZXlzKCk6CisgICAgICAgICAgICBpZiBrZXlTZXROYW1lIGluIHNlbGYuY2hhbmdlZEl0ZW1zWydrZXlzJ106CiAgICAgICAgICAgICAgICAgI2hhbmRsZSBhbnkgdW5zYXZlZCBjaGFuZ2VzIHRvIHRoaXMga2V5IHNldAotICAgICAgICAgICAgICAgIGlmIGJpbmROYW1lIGluIHNlbGYuY2hhbmdlZEl0ZW1zWydrZXlzJ11ba2V5U2V0TmFtZV0ua2V5cygpOgorICAgICAgICAgICAgICAgIGlmIGJpbmROYW1lIGluIHNlbGYuY2hhbmdlZEl0ZW1zWydrZXlzJ11ba2V5U2V0TmFtZV06CiAgICAgICAgICAgICAgICAgICAgIGtleT1zZWxmLmNoYW5nZWRJdGVtc1sna2V5cyddW2tleVNldE5hbWVdW2JpbmROYW1lXQogICAgICAgICAgICAgc2VsZi5saXN0QmluZGluZ3MuaW5zZXJ0KEVORCwgYmluZE5hbWUrJyAtICcra2V5KQogICAgICAgICBpZiByZXNlbGVjdDoKQEAgLTgwOCw5ICs4MjQsOSBAQAogICAgICAgICAgICAgdGhlbWVOYW1lPXNlbGYuY3VzdG9tVGhlbWUuZ2V0KCkKICAgICAgICAgbmV3VGhlbWU9aWRsZUNvbmYuR2V0VGhlbWVEaWN0KHRoZW1lVHlwZSx0aGVtZU5hbWUpCiAgICAgICAgICNhcHBseSBhbnkgb2YgdGhlIG9sZCB0aGVtZSdzIHVuc2F2ZWQgY2hhbmdlcyB0byB0aGUgbmV3IHRoZW1lCi0gICAgICAgIGlmIHRoZW1lTmFtZSBpbiBzZWxmLmNoYW5nZWRJdGVtc1snaGlnaGxpZ2h0J10ua2V5cygpOgorICAgICAgICBpZiB0aGVtZU5hbWUgaW4gc2VsZi5jaGFuZ2VkSXRlbXNbJ2hpZ2hsaWdodCddOgogICAgICAgICAgICAgdGhlbWVDaGFuZ2VzPXNlbGYuY2hhbmdlZEl0ZW1zWydoaWdobGlnaHQnXVt0aGVtZU5hbWVdCi0gICAgICAgICAgICBmb3IgZWxlbWVudCBpbiB0aGVtZUNoYW5nZXMua2V5cygpOgorICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gdGhlbWVDaGFuZ2VzOgogICAgICAgICAgICAgICAgIG5ld1RoZW1lW2VsZW1lbnRdPXRoZW1lQ2hhbmdlc1tlbGVtZW50XQogICAgICAgICAjc2F2ZSB0aGUgbmV3IHRoZW1lCiAgICAgICAgIHNlbGYuU2F2ZU5ld1RoZW1lKG5ld1RoZW1lTmFtZSxuZXdUaGVtZSkKQEAgLTgzMiw4ICs4NDgsOSBAQAogICAgICAgICAgICAgZm9udFdlaWdodD10a0ZvbnQuQk9MRAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgZm9udFdlaWdodD10a0ZvbnQuTk9STUFMCi0gICAgICAgIHNlbGYuZWRpdEZvbnQuY29uZmlnKHNpemU9c2VsZi5mb250U2l6ZS5nZXQoKSwKLSAgICAgICAgICAgICAgICB3ZWlnaHQ9Zm9udFdlaWdodCxmYW1pbHk9Zm9udE5hbWUpCisgICAgICAgIG5ld0ZvbnQgPSAoZm9udE5hbWUsIHNlbGYuZm9udFNpemUuZ2V0KCksIGZvbnRXZWlnaHQpCisgICAgICAgIHNlbGYubGFiZWxGb250U2FtcGxlLmNvbmZpZyhmb250PW5ld0ZvbnQpCisgICAgICAgIHNlbGYudGV4dEhpZ2hsaWdodFNhbXBsZS5jb25maWd1cmUoZm9udD1uZXdGb250KQogCiAgICAgZGVmIFNldEhpZ2hsaWdodFRhcmdldChzZWxmKToKICAgICAgICAgaWYgc2VsZi5oaWdobGlnaHRUYXJnZXQuZ2V0KCk9PSdDdXJzb3InOiAjYmcgbm90IHBvc3NpYmxlCkBAIC04NjIsMTQgKzg3OSwxNCBAQAogICAgICAgICAgICAgdGhlbWU9c2VsZi5idWlsdGluVGhlbWUuZ2V0KCkKICAgICAgICAgZWxzZTogI2EgdXNlciB0aGVtZQogICAgICAgICAgICAgdGhlbWU9c2VsZi5jdXN0b21UaGVtZS5nZXQoKQotICAgICAgICBmb3IgZWxlbWVudFRpdGxlIGluIHNlbGYudGhlbWVFbGVtZW50cy5rZXlzKCk6CisgICAgICAgIGZvciBlbGVtZW50VGl0bGUgaW4gc2VsZi50aGVtZUVsZW1lbnRzOgogICAgICAgICAgICAgZWxlbWVudD1zZWxmLnRoZW1lRWxlbWVudHNbZWxlbWVudFRpdGxlXVswXQogICAgICAgICAgICAgY29sb3Vycz1pZGxlQ29uZi5HZXRIaWdobGlnaHQodGhlbWUsZWxlbWVudCkKICAgICAgICAgICAgIGlmIGVsZW1lbnQ9PSdjdXJzb3InOiAjY3Vyc29yIHNhbXBsZSBuZWVkcyBzcGVjaWFsIHBhaW50aW5nCiAgICAgICAgICAgICAgICAgY29sb3Vyc1snYmFja2dyb3VuZCddPWlkbGVDb25mLkdldEhpZ2hsaWdodCh0aGVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICdub3JtYWwnLCBmZ0JnPSdiZycpCiAgICAgICAgICAgICAjaGFuZGxlIGFueSB1bnNhdmVkIGNoYW5nZXMgdG8gdGhpcyB0aGVtZQotICAgICAgICAgICAgaWYgdGhlbWUgaW4gc2VsZi5jaGFuZ2VkSXRlbXNbJ2hpZ2hsaWdodCddLmtleXMoKToKKyAgICAgICAgICAgIGlmIHRoZW1lIGluIHNlbGYuY2hhbmdlZEl0ZW1zWydoaWdobGlnaHQnXToKICAgICAgICAgICAgICAgICB0aGVtZURpY3Q9c2VsZi5jaGFuZ2VkSXRlbXNbJ2hpZ2hsaWdodCddW3RoZW1lXQogICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQrJy1mb3JlZ3JvdW5kJyBpbiB0aGVtZURpY3Q6CiAgICAgICAgICAgICAgICAgICAgIGNvbG91cnNbJ2ZvcmVncm91bmQnXT10aGVtZURpY3RbZWxlbWVudCsnLWZvcmVncm91bmQnXQpAQCAtOTI2LDcgKzk0Myw3IEBACiAgICAgICAgIHNlbGYuY2hhbmdlZEl0ZW1zWydtYWluJ11bJ0hlbHBGaWxlcyddID0ge30KICAgICAgICAgZm9yIG51bSBpbiByYW5nZSgxLGxlbihzZWxmLnVzZXJIZWxwTGlzdCkrMSk6CiAgICAgICAgICAgICBzZWxmLkFkZENoYW5nZWRJdGVtKCdtYWluJywnSGVscEZpbGVzJyxzdHIobnVtKSwKLSAgICAgICAgICAgICAgICAgICAgc3RyaW5nLmpvaW4oc2VsZi51c2VySGVscExpc3RbbnVtLTFdWzoyXSwnOycpKQorICAgICAgICAgICAgICAgICAgICAnOycuam9pbihzZWxmLnVzZXJIZWxwTGlzdFtudW0tMV1bOjJdKSkKIAogICAgIGRlZiBMb2FkRm9udENmZyhzZWxmKToKICAgICAgICAgIyNiYXNlIGVkaXRvciBmb250IHNlbGVjdGlvbiBsaXN0CkBAIC05MzUsNyArOTUyLDcgQEAKICAgICAgICAgZm9yIGZvbnQgaW4gZm9udHM6CiAgICAgICAgICAgICBzZWxmLmxpc3RGb250TmFtZS5pbnNlcnQoRU5ELGZvbnQpCiAgICAgICAgIGNvbmZpZ3VyZWRGb250PWlkbGVDb25mLkdldE9wdGlvbignbWFpbicsJ0VkaXRvcldpbmRvdycsJ2ZvbnQnLAotICAgICAgICAgICAgICAgIGRlZmF1bHQ9J2NvdXJpZXInKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0nY291cmllcicpCiAgICAgICAgIGxjX2NvbmZpZ3VyZWRGb250ID0gY29uZmlndXJlZEZvbnQubG93ZXIoKQogICAgICAgICBzZWxmLmZvbnROYW1lLnNldChsY19jb25maWd1cmVkRm9udCkKICAgICAgICAgbGNfZm9udHMgPSBbcy5sb3dlcigpIGZvciBzIGluIGZvbnRzXQpAQCAtOTQ1LDEzICs5NjIsMTMgQEAKICAgICAgICAgICAgIHNlbGYubGlzdEZvbnROYW1lLnNlbGVjdF9zZXQoY3VycmVudEZvbnRJbmRleCkKICAgICAgICAgICAgIHNlbGYubGlzdEZvbnROYW1lLnNlbGVjdF9hbmNob3IoY3VycmVudEZvbnRJbmRleCkKICAgICAgICAgIyNmb250IHNpemUgZHJvcGRvd24KLSAgICAgICAgZm9udFNpemU9aWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywnRWRpdG9yV2luZG93JywnZm9udC1zaXplJywKLSAgICAgICAgICAgICAgICBkZWZhdWx0PScxMCcpCisgICAgICAgIGZvbnRTaXplPWlkbGVDb25mLkdldE9wdGlvbignbWFpbicsICdFZGl0b3JXaW5kb3cnLCAnZm9udC1zaXplJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9J2ludCcsIGRlZmF1bHQ9JzEwJykKICAgICAgICAgc2VsZi5vcHRNZW51Rm9udFNpemUuU2V0TWVudSgoJzcnLCc4JywnOScsJzEwJywnMTEnLCcxMicsJzEzJywnMTQnLAotICAgICAgICAgICAgICAgICcxNicsJzE4JywnMjAnLCcyMicpLGZvbnRTaXplICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzE2JywnMTgnLCcyMCcsJzIyJyksIGZvbnRTaXplICkKICAgICAgICAgIyNmb250V2VpZ2h0CiAgICAgICAgIHNlbGYuZm9udEJvbGQuc2V0KGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsJ0VkaXRvcldpbmRvdycsCi0gICAgICAgICAgICAgICAgJ2ZvbnQtYm9sZCcsZGVmYXVsdD0wLHR5cGU9J2Jvb2wnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb250LWJvbGQnLGRlZmF1bHQ9MCx0eXBlPSdib29sJykpCiAgICAgICAgICMjZm9udCBzYW1wbGUKICAgICAgICAgc2VsZi5TZXRGb250U2FtcGxlKCkKIApAQCAtMTAzMiwxMCArMTA0OSwxMyBAQAogICAgICAgICBzZWxmLmF1dG9TYXZlLnNldChpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCAnR2VuZXJhbCcsICdhdXRvc2F2ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PTAsIHR5cGU9J2Jvb2wnKSkKICAgICAgICAgI2luaXRpYWwgd2luZG93IHNpemUKLSAgICAgICAgc2VsZi53aW5XaWR0aC5zZXQoaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywnRWRpdG9yV2luZG93Jywnd2lkdGgnKSkKLSAgICAgICAgc2VsZi53aW5IZWlnaHQuc2V0KGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsJ0VkaXRvcldpbmRvdycsJ2hlaWdodCcpKQorICAgICAgICBzZWxmLndpbldpZHRoLnNldChpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCdFZGl0b3JXaW5kb3cnLCd3aWR0aCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSdpbnQnKSkKKyAgICAgICAgc2VsZi53aW5IZWlnaHQuc2V0KGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsJ0VkaXRvcldpbmRvdycsJ2hlaWdodCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0naW50JykpCiAgICAgICAgICNpbml0aWFsIHBhcmFncmFwaCByZWZvcm1hdCBzaXplCi0gICAgICAgIHNlbGYucGFyYVdpZHRoLnNldChpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCdGb3JtYXRQYXJhZ3JhcGgnLCdwYXJhZ3JhcGgnKSkKKyAgICAgICAgc2VsZi5wYXJhV2lkdGguc2V0KGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsJ0Zvcm1hdFBhcmFncmFwaCcsJ3BhcmFncmFwaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0naW50JykpCiAgICAgICAgICMgZGVmYXVsdCBzb3VyY2UgZW5jb2RpbmcKICAgICAgICAgc2VsZi5lbmNvZGluZy5zZXQoaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywgJ0VkaXRvcldpbmRvdycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5jb2RpbmcnLCBkZWZhdWx0PSdub25lJykpCkBAIC0xMDY4LDcgKzEwODgsNyBAQAogICAgICAgICAiIiIKICAgICAgICAgaWYgbm90IGlkbGVDb25mLnVzZXJDZmdbJ2tleXMnXS5oYXNfc2VjdGlvbihrZXlTZXROYW1lKToKICAgICAgICAgICAgIGlkbGVDb25mLnVzZXJDZmdbJ2tleXMnXS5hZGRfc2VjdGlvbihrZXlTZXROYW1lKQotICAgICAgICBmb3IgZXZlbnQgaW4ga2V5U2V0LmtleXMoKToKKyAgICAgICAgZm9yIGV2ZW50IGluIGtleVNldDoKICAgICAgICAgICAgIHZhbHVlPWtleVNldFtldmVudF0KICAgICAgICAgICAgIGlkbGVDb25mLnVzZXJDZmdbJ2tleXMnXS5TZXRPcHRpb24oa2V5U2V0TmFtZSxldmVudCx2YWx1ZSkKIApAQCAtMTA4MCw3ICsxMTAwLDcgQEAKICAgICAgICAgIiIiCiAgICAgICAgIGlmIG5vdCBpZGxlQ29uZi51c2VyQ2ZnWydoaWdobGlnaHQnXS5oYXNfc2VjdGlvbih0aGVtZU5hbWUpOgogICAgICAgICAgICAgaWRsZUNvbmYudXNlckNmZ1snaGlnaGxpZ2h0J10uYWRkX3NlY3Rpb24odGhlbWVOYW1lKQotICAgICAgICBmb3IgZWxlbWVudCBpbiB0aGVtZS5rZXlzKCk6CisgICAgICAgIGZvciBlbGVtZW50IGluIHRoZW1lOgogICAgICAgICAgICAgdmFsdWU9dGhlbWVbZWxlbWVudF0KICAgICAgICAgICAgIGlkbGVDb25mLnVzZXJDZmdbJ2hpZ2hsaWdodCddLlNldE9wdGlvbih0aGVtZU5hbWUsZWxlbWVudCx2YWx1ZSkKIApAQCAtMTA5NSwxNCArMTExNSwxNCBAQAogICAgIGRlZiBTYXZlQWxsQ2hhbmdlZENvbmZpZ3Moc2VsZik6CiAgICAgICAgICJTYXZlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyB0byB0aGUgdXNlciBjb25maWcgZmlsZS4iCiAgICAgICAgIGlkbGVDb25mLnVzZXJDZmdbJ21haW4nXS5TYXZlKCkKLSAgICAgICAgZm9yIGNvbmZpZ1R5cGUgaW4gc2VsZi5jaGFuZ2VkSXRlbXMua2V5cygpOgorICAgICAgICBmb3IgY29uZmlnVHlwZSBpbiBzZWxmLmNoYW5nZWRJdGVtczoKICAgICAgICAgICAgIGNmZ1R5cGVIYXNDaGFuZ2VzID0gRmFsc2UKLSAgICAgICAgICAgIGZvciBzZWN0aW9uIGluIHNlbGYuY2hhbmdlZEl0ZW1zW2NvbmZpZ1R5cGVdLmtleXMoKToKKyAgICAgICAgICAgIGZvciBzZWN0aW9uIGluIHNlbGYuY2hhbmdlZEl0ZW1zW2NvbmZpZ1R5cGVdOgogICAgICAgICAgICAgICAgIGlmIHNlY3Rpb24gPT0gJ0hlbHBGaWxlcyc6CiAgICAgICAgICAgICAgICAgICAgICN0aGlzIHNlY3Rpb24gZ2V0cyBjb21wbGV0ZWx5IHJlcGxhY2VkCiAgICAgICAgICAgICAgICAgICAgIGlkbGVDb25mLnVzZXJDZmdbJ21haW4nXS5yZW1vdmVfc2VjdGlvbignSGVscEZpbGVzJykKICAgICAgICAgICAgICAgICAgICAgY2ZnVHlwZUhhc0NoYW5nZXMgPSBUcnVlCi0gICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5jaGFuZ2VkSXRlbXNbY29uZmlnVHlwZV1bc2VjdGlvbl0ua2V5cygpOgorICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIHNlbGYuY2hhbmdlZEl0ZW1zW2NvbmZpZ1R5cGVdW3NlY3Rpb25dOgogICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuY2hhbmdlZEl0ZW1zW2NvbmZpZ1R5cGVdW3NlY3Rpb25dW2l0ZW1dCiAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuU2V0VXNlclZhbHVlKGNvbmZpZ1R5cGUsc2VjdGlvbixpdGVtLHZhbHVlKToKICAgICAgICAgICAgICAgICAgICAgICAgIGNmZ1R5cGVIYXNDaGFuZ2VzID0gVHJ1ZQpAQCAtMTExNiwxMyArMTEzNiwxMyBAQAogICAgIGRlZiBEZWFjdGl2YXRlQ3VycmVudENvbmZpZyhzZWxmKToKICAgICAgICAgI0JlZm9yZSBhIGNvbmZpZyBpcyBzYXZlZCwgc29tZSBjbGVhbnVwIG9mIGN1cnJlbnQKICAgICAgICAgI2NvbmZpZyBtdXN0IGJlIGRvbmUgLSByZW1vdmUgdGhlIHByZXZpb3VzIGtleWJpbmRpbmdzCi0gICAgICAgIHdpbkluc3RhbmNlcz1zZWxmLnBhcmVudC5pbnN0YW5jZV9kaWN0LmtleXMoKQorICAgICAgICB3aW5JbnN0YW5jZXM9c2VsZi5wYXJlbnQuaW5zdGFuY2VfZGljdAogICAgICAgICBmb3IgaW5zdGFuY2UgaW4gd2luSW5zdGFuY2VzOgogICAgICAgICAgICAgaW5zdGFuY2UuUmVtb3ZlS2V5YmluZGluZ3MoKQogCiAgICAgZGVmIEFjdGl2YXRlQ29uZmlnQ2hhbmdlcyhzZWxmKToKICAgICAgICAgIkR5bmFtaWNhbGx5IGFwcGx5IGNvbmZpZ3VyYXRpb24gY2hhbmdlcyIKLSAgICAgICAgd2luSW5zdGFuY2VzPXNlbGYucGFyZW50Lmluc3RhbmNlX2RpY3Qua2V5cygpCisgICAgICAgIHdpbkluc3RhbmNlcyA9IHNlbGYucGFyZW50Lmluc3RhbmNlX2RpY3Qua2V5cygpCiAgICAgICAgIGZvciBpbnN0YW5jZSBpbiB3aW5JbnN0YW5jZXM6CiAgICAgICAgICAgICBpbnN0YW5jZS5SZXNldENvbG9yaXplcigpCiAgICAgICAgICAgICBpbnN0YW5jZS5SZXNldEZvbnQoKQpAQCAtMTE0Niw5ICsxMTY2LDkgQEAKICAgICAgICAgcGFzcwogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgICN0ZXN0IHRoZSBkaWFsb2cKLSAgICByb290PVRrKCkKLSAgICBCdXR0b24ocm9vdCx0ZXh0PSdEaWFsb2cnLAotICAgICAgICAgICAgY29tbWFuZD1sYW1iZGE6Q29uZmlnRGlhbG9nKHJvb3QsJ1NldHRpbmdzJykpLnBhY2soKQotICAgIHJvb3QuaW5zdGFuY2VfZGljdD17fQotICAgIHJvb3QubWFpbmxvb3AoKQorICAgIGltcG9ydCB1bml0dGVzdAorICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfY29uZmlnZGlhbG9nJywKKyAgICAgICAgICAgICAgICAgIHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQorCisgICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuCisgICAgcnVuKENvbmZpZ0RpYWxvZykKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2NvbmZpZ0hhbmRsZXIucHkgYi9MaWIvaWRsZWxpYi9jb25maWdIYW5kbGVyLnB5CmluZGV4IDczNDg3ZDUuLjE3Mzc1MWUgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2NvbmZpZ0hhbmRsZXIucHkKKysrIGIvTGliL2lkbGVsaWIvY29uZmlnSGFuZGxlci5weQpAQCAtMjAsOCArMjAsNyBAQAogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCiBpbXBvcnQgc3RyaW5nCi1mcm9tIGlkbGVsaWIgaW1wb3J0IG1hY29zeFN1cHBvcnQKLWZyb20gQ29uZmlnUGFyc2VyIGltcG9ydCBDb25maWdQYXJzZXIsIE5vT3B0aW9uRXJyb3IsIE5vU2VjdGlvbkVycm9yCitmcm9tIENvbmZpZ1BhcnNlciBpbXBvcnQgQ29uZmlnUGFyc2VyCiAKIGNsYXNzIEludmFsaWRDb25maWdUeXBlKEV4Y2VwdGlvbik6IHBhc3MKIGNsYXNzIEludmFsaWRDb25maWdTZXQoRXhjZXB0aW9uKTogcGFzcwpAQCAtMjM3LDI0ICsyMzYsMzkgQEAKICAgICAgICAgcHJpbnRlZCB0byBzdGRlcnIuCiAKICAgICAgICAgIiIiCi0gICAgICAgIGlmIHNlbGYudXNlckNmZ1tjb25maWdUeXBlXS5oYXNfb3B0aW9uKHNlY3Rpb24sb3B0aW9uKToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLnVzZXJDZmdbY29uZmlnVHlwZV0uR2V0KHNlY3Rpb24sIG9wdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9dHlwZSwgcmF3PXJhdykKLSAgICAgICAgZWxpZiBzZWxmLmRlZmF1bHRDZmdbY29uZmlnVHlwZV0uaGFzX29wdGlvbihzZWN0aW9uLG9wdGlvbik6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5kZWZhdWx0Q2ZnW2NvbmZpZ1R5cGVdLkdldChzZWN0aW9uLCBvcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPXR5cGUsIHJhdz1yYXcpCi0gICAgICAgIGVsc2U6ICNyZXR1cm5pbmcgZGVmYXVsdCwgcHJpbnQgd2FybmluZwotICAgICAgICAgICAgaWYgd2Fybl9vbl9kZWZhdWx0OgotICAgICAgICAgICAgICAgIHdhcm5pbmcgPSAoJ1xuIFdhcm5pbmc6IGNvbmZpZ0hhbmRsZXIucHkgLSBJZGxlQ29uZi5HZXRPcHRpb24gLVxuJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBwcm9ibGVtIHJldHJpZXZpbmcgY29uZmlndXJhdGlvbiBvcHRpb24gJXJcbicKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICcgZnJvbSBzZWN0aW9uICVyLlxuJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgJyByZXR1cm5pbmcgZGVmYXVsdCB2YWx1ZTogJXJcbicgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvbiwgc2VjdGlvbiwgZGVmYXVsdCkpCi0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKHdhcm5pbmcpCi0gICAgICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIHJldHVybiBkZWZhdWx0CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYudXNlckNmZ1tjb25maWdUeXBlXS5oYXNfb3B0aW9uKHNlY3Rpb24sb3B0aW9uKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi51c2VyQ2ZnW2NvbmZpZ1R5cGVdLkdldChzZWN0aW9uLCBvcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT10eXBlLCByYXc9cmF3KQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHdhcm5pbmcgPSAoJ1xuIFdhcm5pbmc6IGNvbmZpZ0hhbmRsZXIucHkgLSBJZGxlQ29uZi5HZXRPcHRpb24gLVxuJworICAgICAgICAgICAgICAgICAgICAgICAnIGludmFsaWQgJXIgdmFsdWUgZm9yIGNvbmZpZ3VyYXRpb24gb3B0aW9uICVyXG4nCisgICAgICAgICAgICAgICAgICAgICAgICcgZnJvbSBzZWN0aW9uICVyOiAlclxuJyAlCisgICAgICAgICAgICAgICAgICAgICAgICh0eXBlLCBvcHRpb24sIHNlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnVzZXJDZmdbY29uZmlnVHlwZV0uR2V0KHNlY3Rpb24sIG9wdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3PXJhdykpKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUod2FybmluZykKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5kZWZhdWx0Q2ZnW2NvbmZpZ1R5cGVdLmhhc19vcHRpb24oc2VjdGlvbixvcHRpb24pOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRlZmF1bHRDZmdbY29uZmlnVHlwZV0uR2V0KHNlY3Rpb24sIG9wdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPXR5cGUsIHJhdz1yYXcpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICAjcmV0dXJuaW5nIGRlZmF1bHQsIHByaW50IHdhcm5pbmcKKyAgICAgICAgaWYgd2Fybl9vbl9kZWZhdWx0OgorICAgICAgICAgICAgd2FybmluZyA9ICgnXG4gV2FybmluZzogY29uZmlnSGFuZGxlci5weSAtIElkbGVDb25mLkdldE9wdGlvbiAtXG4nCisgICAgICAgICAgICAgICAgICAgICAgICcgcHJvYmxlbSByZXRyaWV2aW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9uICVyXG4nCisgICAgICAgICAgICAgICAgICAgICAgICcgZnJvbSBzZWN0aW9uICVyLlxuJworICAgICAgICAgICAgICAgICAgICAgICAnIHJldHVybmluZyBkZWZhdWx0IHZhbHVlOiAlclxuJyAlCisgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb24sIHNlY3Rpb24sIGRlZmF1bHQpKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUod2FybmluZykKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcmV0dXJuIGRlZmF1bHQKIAogICAgIGRlZiBTZXRPcHRpb24oc2VsZiwgY29uZmlnVHlwZSwgc2VjdGlvbiwgb3B0aW9uLCB2YWx1ZSk6CiAgICAgICAgICIiIkluIHVzZXIncyBjb25maWcgZmlsZSwgc2V0IHNlY3Rpb24ncyBvcHRpb24gdG8gdmFsdWUuCkBAIC01MTEsMTAgKzUyNSwxMyBAQAogICAgIGRlZiBHZXRDdXJyZW50S2V5U2V0KHNlbGYpOgogICAgICAgICByZXN1bHQgPSBzZWxmLkdldEtleVNldChzZWxmLkN1cnJlbnRLZXlzKCkpCiAKLSAgICAgICAgaWYgbWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKToKLSAgICAgICAgICAgICMgV2UncmUgdXNpbmcgQXF1YVRrLCByZXBsYWNlIGFsbCBrZXliaW5naW5ncyB0aGF0IHVzZSB0aGUKLSAgICAgICAgICAgICMgQWx0IGtleSBieSBvbmVzIHRoYXQgdXNlIHRoZSBPcHRpb24ga2V5IGJlY2F1c2UgdGhlIGZvcm1lcgotICAgICAgICAgICAgIyBkb24ndCB3b3JrIHJlbGlhYmx5LgorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CisgICAgICAgICAgICAjIE9TIFggVGsgdmFyaWFudHMgZG8gbm90IHN1cHBvcnQgdGhlICJBbHQiIGtleWJvYXJkIG1vZGlmaWVyLgorICAgICAgICAgICAgIyBTbyByZXBsYWNlIGFsbCBrZXliaW5naW5ncyB0aGF0IHVzZSAiQWx0IiB3aXRoIG9uZXMgdGhhdAorICAgICAgICAgICAgIyB1c2UgdGhlICJPcHRpb24iIGtleWJvYXJkIG1vZGlmaWVyLgorICAgICAgICAgICAgIyBUTyBETzogdGhlICJPcHRpb24iIG1vZGlmaWVyIGRvZXMgbm90IHdvcmsgcHJvcGVybHkgZm9yCisgICAgICAgICAgICAjICAgICAgICBDb2NvYSBUayBhbmQgWFF1YXJ0eiBUayBzbyB3ZSBzaG91bGQgbm90IHVzZSBpdAorICAgICAgICAgICAgIyAgICAgICAgaW4gZGVmYXVsdCBPUyBYIEtleVNldHMuCiAgICAgICAgICAgICBmb3IgaywgdiBpbiByZXN1bHQuaXRlbXMoKToKICAgICAgICAgICAgICAgICB2MiA9IFsgeC5yZXBsYWNlKCc8QWx0LScsICc8T3B0aW9uLScpIGZvciB4IGluIHYgXQogICAgICAgICAgICAgICAgIGlmIHYgIT0gdjI6CkBAIC01OTUsNyArNjEyLDcgQEAKICAgICAgICAgICAgICc8PHJlcGxhY2U+Pic6IFsnPENvbnRyb2wtaD4nXSwKICAgICAgICAgICAgICc8PGdvdG8tbGluZT4+JzogWyc8QWx0LWc+J10sCiAgICAgICAgICAgICAnPDxzbWFydC1iYWNrc3BhY2U+Pic6IFsnPEtleS1CYWNrU3BhY2U+J10sCi0gICAgICAgICAgICAnPDxuZXdsaW5lLWFuZC1pbmRlbnQ+Pic6IFsnPEtleS1SZXR1cm4+IDxLZXktS1BfRW50ZXI+J10sCisgICAgICAgICAgICAnPDxuZXdsaW5lLWFuZC1pbmRlbnQ+Pic6IFsnPEtleS1SZXR1cm4+JywgJzxLZXktS1BfRW50ZXI+J10sCiAgICAgICAgICAgICAnPDxzbWFydC1pbmRlbnQ+Pic6IFsnPEtleS1UYWI+J10sCiAgICAgICAgICAgICAnPDxpbmRlbnQtcmVnaW9uPj4nOiBbJzxDb250cm9sLUtleS1icmFja2V0cmlnaHQ+J10sCiAgICAgICAgICAgICAnPDxkZWRlbnQtcmVnaW9uPj4nOiBbJzxDb250cm9sLUtleS1icmFja2V0bGVmdD4nXSwKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2NvbmZpZ0hlbHBTb3VyY2VFZGl0LnB5IGIvTGliL2lkbGVsaWIvY29uZmlnSGVscFNvdXJjZUVkaXQucHkKaW5kZXggNjYxMTYyMS4uNTgxNjQ0OSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvY29uZmlnSGVscFNvdXJjZUVkaXQucHkKKysrIGIvTGliL2lkbGVsaWIvY29uZmlnSGVscFNvdXJjZUVkaXQucHkKQEAgLTgsMTMgKzgsMTQgQEAKIGltcG9ydCB0a0ZpbGVEaWFsb2cKIAogY2xhc3MgR2V0SGVscFNvdXJjZURpYWxvZyhUb3BsZXZlbCk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCwgdGl0bGUsIG1lbnVJdGVtPScnLCBmaWxlUGF0aD0nJyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCwgdGl0bGUsIG1lbnVJdGVtPScnLCBmaWxlUGF0aD0nJywgX2h0ZXN0PUZhbHNlKToKICAgICAgICAgIiIiR2V0IG1lbnUgZW50cnkgYW5kIHVybC8gbG9jYWwgZmlsZSBsb2NhdGlvbiBmb3IgQWRkaXRpb25hbCBIZWxwCiAKICAgICAgICAgVXNlciBzZWxlY3RzIGEgbmFtZSBmb3IgdGhlIEhlbHAgcmVzb3VyY2UgYW5kIHByb3ZpZGVzIGEgd2ViIHVybAogICAgICAgICBvciBhIGxvY2FsIGZpbGUgYXMgaXRzIHNvdXJjZS4gIFRoZSB1c2VyIGNhbiBlbnRlciBhIHVybCBvciBicm93c2UKICAgICAgICAgZm9yIHRoZSBmaWxlLgogCisgICAgICAgIF9odGVzdCAtIGJvb2wsIGNoYW5nZSBib3ggbG9jYXRpb24gd2hlbiBydW5uaW5nIGh0ZXN0CiAgICAgICAgICIiIgogICAgICAgICBUb3BsZXZlbC5fX2luaXRfXyhzZWxmLCBwYXJlbnQpCiAgICAgICAgIHNlbGYuY29uZmlndXJlKGJvcmRlcndpZHRoPTUpCkBAIC0zMSwxMiArMzIsMTQgQEAKICAgICAgICAgc2VsZi53aXRoZHJhdygpICNoaWRlIHdoaWxlIHNldHRpbmcgZ2VvbWV0cnkKICAgICAgICAgI25lZWRzIHRvIGJlIGRvbmUgaGVyZSBzbyB0aGF0IHRoZSB3aW5mb19yZXF3aWR0aCBpcyB2YWxpZAogICAgICAgICBzZWxmLnVwZGF0ZV9pZGxldGFza3MoKQotICAgICAgICAjY2VudHJlIGRpYWxvZyBvdmVyIHBhcmVudDoKLSAgICAgICAgc2VsZi5nZW9tZXRyeSgiKyVkKyVkIiAlCi0gICAgICAgICAgICAgICAgICAgICAgKChwYXJlbnQud2luZm9fcm9vdHgoKSArICgocGFyZW50LndpbmZvX3dpZHRoKCkvMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oc2VsZi53aW5mb19yZXF3aWR0aCgpLzIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC53aW5mb19yb290eSgpICsgKChwYXJlbnQud2luZm9faGVpZ2h0KCkvMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oc2VsZi53aW5mb19yZXFoZWlnaHQoKS8yKSkpKSkKKyAgICAgICAgI2NlbnRyZSBkaWFsb2cgb3ZlciBwYXJlbnQuIGJlbG93IHBhcmVudCBpZiBydW5uaW5nIGh0ZXN0LgorICAgICAgICBzZWxmLmdlb21ldHJ5KAorICAgICAgICAgICAgICAgICIrJWQrJWQiICUgKAorICAgICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHgoKSArCisgICAgICAgICAgICAgICAgICAgIChwYXJlbnQud2luZm9fd2lkdGgoKS8yIC0gc2VsZi53aW5mb19yZXF3aWR0aCgpLzIpLAorICAgICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHkoKSArCisgICAgICAgICAgICAgICAgICAgICgocGFyZW50LndpbmZvX2hlaWdodCgpLzIgLSBzZWxmLndpbmZvX3JlcWhlaWdodCgpLzIpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBfaHRlc3QgZWxzZSAxNTApKSkKICAgICAgICAgc2VsZi5kZWljb25pZnkoKSAjZ2VvbWV0cnkgc2V0LCB1bmhpZGUKICAgICAgICAgc2VsZi5iaW5kKCc8UmV0dXJuPicsIHNlbGYuT2spCiAgICAgICAgIHNlbGYud2FpdF93aW5kb3coKQpAQCAtMTU5LDExICsxNjIsNSBAQAogICAgICAgICBzZWxmLmRlc3Ryb3koKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgICN0ZXN0IHRoZSBkaWFsb2cKLSAgICByb290ID0gVGsoKQotICAgIGRlZiBydW4oKToKLSAgICAgICAga2V5U2VxID0gJycKLSAgICAgICAgZGxnID0gR2V0SGVscFNvdXJjZURpYWxvZyhyb290LCAnR2V0IEhlbHAgU291cmNlJykKLSAgICAgICAgcHJpbnQgZGxnLnJlc3VsdAotICAgIEJ1dHRvbihyb290LHRleHQ9J0RpYWxvZycsIGNvbW1hbmQ9cnVuKS5wYWNrKCkKLSAgICByb290Lm1haW5sb29wKCkKKyAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KKyAgICBydW4oR2V0SGVscFNvdXJjZURpYWxvZykKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2NvbmZpZ1NlY3Rpb25OYW1lRGlhbG9nLnB5IGIvTGliL2lkbGVsaWIvY29uZmlnU2VjdGlvbk5hbWVEaWFsb2cucHkKaW5kZXggNGYxYjAwMi4uYzA5ZGNhOCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvY29uZmlnU2VjdGlvbk5hbWVEaWFsb2cucHkKKysrIGIvTGliL2lkbGVsaWIvY29uZmlnU2VjdGlvbk5hbWVEaWFsb2cucHkKQEAgLTEsOTcgKzEsOTIgQEAKICIiIgogRGlhbG9nIHRoYXQgYWxsb3dzIHVzZXIgdG8gc3BlY2lmeSBhIG5ldyBjb25maWcgZmlsZSBzZWN0aW9uIG5hbWUuCiBVc2VkIHRvIGdldCBuZXcgaGlnaGxpZ2h0IHRoZW1lIGFuZCBrZXliaW5kaW5nIHNldCBuYW1lcy4KK1RoZSAncmV0dXJuIHZhbHVlJyBmb3IgdGhlIGRpYWxvZywgdXNlZCB0d28gcGxhY2VkIGluIGNvbmZpZ0RpYWxvZy5weSwKK2lzIHRoZSAucmVzdWx0IGF0dHJpYnV0ZSBzZXQgaW4gdGhlIE9rIGFuZCBDYW5jZWwgbWV0aG9kcy4KICIiIgogZnJvbSBUa2ludGVyIGltcG9ydCAqCiBpbXBvcnQgdGtNZXNzYWdlQm94Ci0KIGNsYXNzIEdldENmZ1NlY3Rpb25OYW1lRGlhbG9nKFRvcGxldmVsKToKLSAgICBkZWYgX19pbml0X18oc2VsZixwYXJlbnQsdGl0bGUsbWVzc2FnZSx1c2VkTmFtZXMpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQsIHRpdGxlLCBtZXNzYWdlLCB1c2VkX25hbWVzLCBfaHRlc3Q9RmFsc2UpOgogICAgICAgICAiIiIKICAgICAgICAgbWVzc2FnZSAtIHN0cmluZywgaW5mb3JtYXRpb25hbCBtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICAgICAgdXNlZE5hbWVzIC0gbGlzdCwgbGlzdCBvZiBuYW1lcyBhbHJlYWR5IGluIHVzZSBmb3IgdmFsaWRpdHkgY2hlY2sKKyAgICAgICAgdXNlZF9uYW1lcyAtIHN0cmluZyBjb2xsZWN0aW9uLCBuYW1lcyBhbHJlYWR5IGluIHVzZSBmb3IgdmFsaWRpdHkgY2hlY2sKKyAgICAgICAgX2h0ZXN0IC0gYm9vbCwgY2hhbmdlIGJveCBsb2NhdGlvbiB3aGVuIHJ1bm5pbmcgaHRlc3QKICAgICAgICAgIiIiCiAgICAgICAgIFRvcGxldmVsLl9faW5pdF9fKHNlbGYsIHBhcmVudCkKICAgICAgICAgc2VsZi5jb25maWd1cmUoYm9yZGVyd2lkdGg9NSkKLSAgICAgICAgc2VsZi5yZXNpemFibGUoaGVpZ2h0PUZBTFNFLHdpZHRoPUZBTFNFKQorICAgICAgICBzZWxmLnJlc2l6YWJsZShoZWlnaHQ9RkFMU0UsIHdpZHRoPUZBTFNFKQogICAgICAgICBzZWxmLnRpdGxlKHRpdGxlKQogICAgICAgICBzZWxmLnRyYW5zaWVudChwYXJlbnQpCiAgICAgICAgIHNlbGYuZ3JhYl9zZXQoKQogICAgICAgICBzZWxmLnByb3RvY29sKCJXTV9ERUxFVEVfV0lORE9XIiwgc2VsZi5DYW5jZWwpCiAgICAgICAgIHNlbGYucGFyZW50ID0gcGFyZW50Ci0gICAgICAgIHNlbGYubWVzc2FnZT1tZXNzYWdlCi0gICAgICAgIHNlbGYudXNlZE5hbWVzPXVzZWROYW1lcwotICAgICAgICBzZWxmLnJlc3VsdD0nJwotICAgICAgICBzZWxmLkNyZWF0ZVdpZGdldHMoKQotICAgICAgICBzZWxmLndpdGhkcmF3KCkgI2hpZGUgd2hpbGUgc2V0dGluZyBnZW9tZXRyeQorICAgICAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCisgICAgICAgIHNlbGYudXNlZF9uYW1lcyA9IHVzZWRfbmFtZXMKKyAgICAgICAgc2VsZi5jcmVhdGVfd2lkZ2V0cygpCisgICAgICAgIHNlbGYud2l0aGRyYXcoKSAgI2hpZGUgd2hpbGUgc2V0dGluZyBnZW9tZXRyeQogICAgICAgICBzZWxmLnVwZGF0ZV9pZGxldGFza3MoKQogICAgICAgICAjbmVlZHMgdG8gYmUgZG9uZSBoZXJlIHNvIHRoYXQgdGhlIHdpbmZvX3JlcXdpZHRoIGlzIHZhbGlkCiAgICAgICAgIHNlbGYubWVzc2FnZUluZm8uY29uZmlnKHdpZHRoPXNlbGYuZnJhbWVNYWluLndpbmZvX3JlcXdpZHRoKCkpCi0gICAgICAgIHNlbGYuZ2VvbWV0cnkoIislZCslZCIgJQotICAgICAgICAgICAgKChwYXJlbnQud2luZm9fcm9vdHgoKSsoKHBhcmVudC53aW5mb193aWR0aCgpLzIpCi0gICAgICAgICAgICAgICAgLShzZWxmLndpbmZvX3JlcXdpZHRoKCkvMikpLAotICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHkoKSsoKHBhcmVudC53aW5mb19oZWlnaHQoKS8yKQotICAgICAgICAgICAgICAgIC0oc2VsZi53aW5mb19yZXFoZWlnaHQoKS8yKSkgKSkgKSAjY2VudHJlIGRpYWxvZyBvdmVyIHBhcmVudAotICAgICAgICBzZWxmLmRlaWNvbmlmeSgpICNnZW9tZXRyeSBzZXQsIHVuaGlkZQorICAgICAgICBzZWxmLmdlb21ldHJ5KAorICAgICAgICAgICAgICAgICIrJWQrJWQiICUgKAorICAgICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHgoKSArCisgICAgICAgICAgICAgICAgICAgIChwYXJlbnQud2luZm9fd2lkdGgoKS8yIC0gc2VsZi53aW5mb19yZXF3aWR0aCgpLzIpLAorICAgICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHkoKSArCisgICAgICAgICAgICAgICAgICAgICgocGFyZW50LndpbmZvX2hlaWdodCgpLzIgLSBzZWxmLndpbmZvX3JlcWhlaWdodCgpLzIpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBfaHRlc3QgZWxzZSAxMDApCisgICAgICAgICAgICAgICAgKSApICAjY2VudHJlIGRpYWxvZyBvdmVyIHBhcmVudCAob3IgYmVsb3cgaHRlc3QgYm94KQorICAgICAgICBzZWxmLmRlaWNvbmlmeSgpICAjZ2VvbWV0cnkgc2V0LCB1bmhpZGUKICAgICAgICAgc2VsZi53YWl0X3dpbmRvdygpCi0KLSAgICBkZWYgQ3JlYXRlV2lkZ2V0cyhzZWxmKToKLSAgICAgICAgc2VsZi5uYW1lPVN0cmluZ1ZhcihzZWxmKQotICAgICAgICBzZWxmLmZvbnRTaXplPVN0cmluZ1ZhcihzZWxmKQotICAgICAgICBzZWxmLmZyYW1lTWFpbiA9IEZyYW1lKHNlbGYsYm9yZGVyd2lkdGg9MixyZWxpZWY9U1VOS0VOKQotICAgICAgICBzZWxmLmZyYW1lTWFpbi5wYWNrKHNpZGU9VE9QLGV4cGFuZD1UUlVFLGZpbGw9Qk9USCkKLSAgICAgICAgc2VsZi5tZXNzYWdlSW5mbz1NZXNzYWdlKHNlbGYuZnJhbWVNYWluLGFuY2hvcj1XLGp1c3RpZnk9TEVGVCxwYWR4PTUscGFkeT01LAotICAgICAgICAgICAgICAgIHRleHQ9c2VsZi5tZXNzYWdlKSMsYXNwZWN0PTIwMCkKLSAgICAgICAgZW50cnlOYW1lPUVudHJ5KHNlbGYuZnJhbWVNYWluLHRleHR2YXJpYWJsZT1zZWxmLm5hbWUsd2lkdGg9MzApCisgICAgZGVmIGNyZWF0ZV93aWRnZXRzKHNlbGYpOgorICAgICAgICBzZWxmLm5hbWUgPSBTdHJpbmdWYXIoc2VsZi5wYXJlbnQpCisgICAgICAgIHNlbGYuZm9udFNpemUgPSBTdHJpbmdWYXIoc2VsZi5wYXJlbnQpCisgICAgICAgIHNlbGYuZnJhbWVNYWluID0gRnJhbWUoc2VsZiwgYm9yZGVyd2lkdGg9MiwgcmVsaWVmPVNVTktFTikKKyAgICAgICAgc2VsZi5mcmFtZU1haW4ucGFjayhzaWRlPVRPUCwgZXhwYW5kPVRSVUUsIGZpbGw9Qk9USCkKKyAgICAgICAgc2VsZi5tZXNzYWdlSW5mbyA9IE1lc3NhZ2Uoc2VsZi5mcmFtZU1haW4sIGFuY2hvcj1XLCBqdXN0aWZ5PUxFRlQsCisgICAgICAgICAgICAgICAgICAgIHBhZHg9NSwgcGFkeT01LCB0ZXh0PXNlbGYubWVzc2FnZSkgIyxhc3BlY3Q9MjAwKQorICAgICAgICBlbnRyeU5hbWUgPSBFbnRyeShzZWxmLmZyYW1lTWFpbiwgdGV4dHZhcmlhYmxlPXNlbGYubmFtZSwgd2lkdGg9MzApCiAgICAgICAgIGVudHJ5TmFtZS5mb2N1c19zZXQoKQotICAgICAgICBzZWxmLm1lc3NhZ2VJbmZvLnBhY2socGFkeD01LHBhZHk9NSkjLGV4cGFuZD1UUlVFLGZpbGw9Qk9USCkKLSAgICAgICAgZW50cnlOYW1lLnBhY2socGFkeD01LHBhZHk9NSkKLSAgICAgICAgZnJhbWVCdXR0b25zPUZyYW1lKHNlbGYpCi0gICAgICAgIGZyYW1lQnV0dG9ucy5wYWNrKHNpZGU9Qk9UVE9NLGZpbGw9WCkKLSAgICAgICAgc2VsZi5idXR0b25PayA9IEJ1dHRvbihmcmFtZUJ1dHRvbnMsdGV4dD0nT2snLAotICAgICAgICAgICAgICAgIHdpZHRoPTgsY29tbWFuZD1zZWxmLk9rKQotICAgICAgICBzZWxmLmJ1dHRvbk9rLmdyaWQocm93PTAsY29sdW1uPTAscGFkeD01LHBhZHk9NSkKLSAgICAgICAgc2VsZi5idXR0b25DYW5jZWwgPSBCdXR0b24oZnJhbWVCdXR0b25zLHRleHQ9J0NhbmNlbCcsCi0gICAgICAgICAgICAgICAgd2lkdGg9OCxjb21tYW5kPXNlbGYuQ2FuY2VsKQotICAgICAgICBzZWxmLmJ1dHRvbkNhbmNlbC5ncmlkKHJvdz0wLGNvbHVtbj0xLHBhZHg9NSxwYWR5PTUpCisgICAgICAgIHNlbGYubWVzc2FnZUluZm8ucGFjayhwYWR4PTUsIHBhZHk9NSkgIywgZXhwYW5kPVRSVUUsIGZpbGw9Qk9USCkKKyAgICAgICAgZW50cnlOYW1lLnBhY2socGFkeD01LCBwYWR5PTUpCisgICAgICAgIGZyYW1lQnV0dG9ucyA9IEZyYW1lKHNlbGYsIHBhZHk9MikKKyAgICAgICAgZnJhbWVCdXR0b25zLnBhY2soc2lkZT1CT1RUT00pCisgICAgICAgIHNlbGYuYnV0dG9uT2sgPSBCdXR0b24oZnJhbWVCdXR0b25zLCB0ZXh0PSdPaycsCisgICAgICAgICAgICAgICAgd2lkdGg9OCwgY29tbWFuZD1zZWxmLk9rKQorICAgICAgICBzZWxmLmJ1dHRvbk9rLnBhY2soc2lkZT1MRUZULCBwYWR4PTUpCisgICAgICAgIHNlbGYuYnV0dG9uQ2FuY2VsID0gQnV0dG9uKGZyYW1lQnV0dG9ucywgdGV4dD0nQ2FuY2VsJywKKyAgICAgICAgICAgICAgICB3aWR0aD04LCBjb21tYW5kPXNlbGYuQ2FuY2VsKQorICAgICAgICBzZWxmLmJ1dHRvbkNhbmNlbC5wYWNrKHNpZGU9UklHSFQsIHBhZHg9NSkKIAotICAgIGRlZiBOYW1lT2soc2VsZik6Ci0gICAgICAgICNzaW1wbGUgdmFsaWRpdHkgY2hlY2sgZm9yIGEgc2Vuc2libGUKLSAgICAgICAgI0NvbmZpZ1BhcnNlciBmaWxlIHNlY3Rpb24gbmFtZQotICAgICAgICBuYW1lT2s9MQotICAgICAgICBuYW1lPXNlbGYubmFtZS5nZXQoKQotICAgICAgICBuYW1lLnN0cmlwKCkKKyAgICBkZWYgbmFtZV9vayhzZWxmKToKKyAgICAgICAgJycnIEFmdGVyIHN0cmlwcGluZyBlbnRlcmVkIG5hbWUsIGNoZWNrIHRoYXQgaXQgaXMgYSAgc2Vuc2libGUKKyAgICAgICAgQ29uZmlnUGFyc2VyIGZpbGUgc2VjdGlvbiBuYW1lLiBSZXR1cm4gaXQgaWYgaXQgaXMsICcnIGlmIG5vdC4KKyAgICAgICAgJycnCisgICAgICAgIG5hbWUgPSBzZWxmLm5hbWUuZ2V0KCkuc3RyaXAoKQogICAgICAgICBpZiBub3QgbmFtZTogI25vIG5hbWUgc3BlY2lmaWVkCiAgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKHRpdGxlPSdOYW1lIEVycm9yJywKICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nTm8gbmFtZSBzcGVjaWZpZWQuJywgcGFyZW50PXNlbGYpCi0gICAgICAgICAgICBuYW1lT2s9MAogICAgICAgICBlbGlmIGxlbihuYW1lKT4zMDogI25hbWUgdG9vIGxvbmcKICAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IodGl0bGU9J05hbWUgRXJyb3InLAogICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdOYW1lIHRvbyBsb25nLiBJdCBzaG91bGQgYmUgbm8gbW9yZSB0aGFuICcrCiAgICAgICAgICAgICAgICAgICAgICczMCBjaGFyYWN0ZXJzLicsIHBhcmVudD1zZWxmKQotICAgICAgICAgICAgbmFtZU9rPTAKLSAgICAgICAgZWxpZiBuYW1lIGluIHNlbGYudXNlZE5hbWVzOgorICAgICAgICAgICAgbmFtZSA9ICcnCisgICAgICAgIGVsaWYgbmFtZSBpbiBzZWxmLnVzZWRfbmFtZXM6CiAgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKHRpdGxlPSdOYW1lIEVycm9yJywKICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nVGhpcyBuYW1lIGlzIGFscmVhZHkgaW4gdXNlLicsIHBhcmVudD1zZWxmKQotICAgICAgICAgICAgbmFtZU9rPTAKLSAgICAgICAgcmV0dXJuIG5hbWVPawotCisgICAgICAgICAgICBuYW1lID0gJycKKyAgICAgICAgcmV0dXJuIG5hbWUKICAgICBkZWYgT2soc2VsZiwgZXZlbnQ9Tm9uZSk6Ci0gICAgICAgIGlmIHNlbGYuTmFtZU9rKCk6Ci0gICAgICAgICAgICBzZWxmLnJlc3VsdD1zZWxmLm5hbWUuZ2V0KCkuc3RyaXAoKQorICAgICAgICBuYW1lID0gc2VsZi5uYW1lX29rKCkKKyAgICAgICAgaWYgbmFtZToKKyAgICAgICAgICAgIHNlbGYucmVzdWx0ID0gbmFtZQogICAgICAgICAgICAgc2VsZi5kZXN0cm95KCkKLQogICAgIGRlZiBDYW5jZWwoc2VsZiwgZXZlbnQ9Tm9uZSk6Ci0gICAgICAgIHNlbGYucmVzdWx0PScnCisgICAgICAgIHNlbGYucmVzdWx0ID0gJycKICAgICAgICAgc2VsZi5kZXN0cm95KCkKLQogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICAjdGVzdCB0aGUgZGlhbG9nCi0gICAgcm9vdD1UaygpCi0gICAgZGVmIHJ1bigpOgotICAgICAgICBrZXlTZXE9JycKLSAgICAgICAgZGxnPUdldENmZ1NlY3Rpb25OYW1lRGlhbG9nKHJvb3QsJ0dldCBOYW1lJywKLSAgICAgICAgICAgICAgICAnVGhlIGluZm9ybWF0aW9uIGhlcmUgc2hvdWxkIG5lZWQgdG8gYmUgd29yZCB3cmFwcGVkLiBUZXN0LicpCi0gICAgICAgIHByaW50IGRsZy5yZXN1bHQKLSAgICBCdXR0b24ocm9vdCx0ZXh0PSdEaWFsb2cnLGNvbW1hbmQ9cnVuKS5wYWNrKCkKLSAgICByb290Lm1haW5sb29wKCkKKyAgICBpbXBvcnQgdW5pdHRlc3QKKyAgICB1bml0dGVzdC5tYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X2NvbmZpZ19uYW1lJywgdmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCisKKyAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KKyAgICBydW4oR2V0Q2ZnU2VjdGlvbk5hbWVEaWFsb2cpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9keW5PcHRpb25NZW51V2lkZ2V0LnB5IGIvTGliL2lkbGVsaWIvZHluT3B0aW9uTWVudVdpZGdldC5weQppbmRleCBlODFmN2JhLi4xMzNjNmZkIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9keW5PcHRpb25NZW51V2lkZ2V0LnB5CisrKyBiL0xpYi9pZGxlbGliL2R5bk9wdGlvbk1lbnVXaWRnZXQucHkKQEAgLTIsOSArMiwxMCBAQAogT3B0aW9uTWVudSB3aWRnZXQgbW9kaWZpZWQgdG8gYWxsb3cgZHluYW1pYyBtZW51IHJlY29uZmlndXJhdGlvbgogYW5kIHNldHRpbmcgb2YgaGlnaGxpZ2h0dGhpY2tuZXNzCiAiIiIKLWZyb20gVGtpbnRlciBpbXBvcnQgT3B0aW9uTWVudQotZnJvbSBUa2ludGVyIGltcG9ydCBfc2V0aXQKK2Zyb20gVGtpbnRlciBpbXBvcnQgT3B0aW9uTWVudSwgX3NldGl0LCBUaywgU3RyaW5nVmFyLCBCdXR0b24KKwogaW1wb3J0IGNvcHkKK2ltcG9ydCByZQogCiBjbGFzcyBEeW5PcHRpb25NZW51KE9wdGlvbk1lbnUpOgogICAgICIiIgpAQCAtMzMsMyArMzQsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1fc2V0aXQoc2VsZi52YXJpYWJsZSxpdGVtLHNlbGYuY29tbWFuZCkpCiAgICAgICAgIGlmIHZhbHVlOgogICAgICAgICAgICAgc2VsZi52YXJpYWJsZS5zZXQodmFsdWUpCisKK2RlZiBfZHluX29wdGlvbl9tZW51KHBhcmVudCk6CisgICAgcm9vdCA9IFRrKCkKKyAgICByb290LnRpdGxlKCJUZXRzIGR5bmFtaWMgb3B0aW9uIG1lbnUiKQorICAgIHZhciA9IFN0cmluZ1Zhcihyb290KQorICAgIHdpZHRoLCBoZWlnaHQsIHgsIHkgPSBsaXN0KG1hcChpbnQsIHJlLnNwbGl0KCdbeCtdJywgcGFyZW50Lmdlb21ldHJ5KCkpKSkKKyAgICByb290Lmdlb21ldHJ5KCIrJWQrJWQiJSh4LCB5ICsgMTUwKSkKKyAgICB2YXIuc2V0KCJPbGQgb3B0aW9uIHNldCIpICNTZXQgdGhlIGRlZmF1bHQgdmFsdWUKKyAgICBkeW4gPSBEeW5PcHRpb25NZW51KHJvb3QsdmFyLCAib2xkMSIsIm9sZDIiLCJvbGQzIiwib2xkNCIpCisgICAgZHluLnBhY2soKQorCisgICAgZGVmIHVwZGF0ZSgpOgorICAgICAgICBkeW4uU2V0TWVudShbIm5ldzEiLCJuZXcyIiwibmV3MyIsIm5ldzQiXSx2YWx1ZT0ibmV3IG9wdGlvbiBzZXQiKQorCisgICAgYnV0dG9uID0gQnV0dG9uKHJvb3QsIHRleHQ9IkNoYW5nZSBvcHRpb24gc2V0IiwgY29tbWFuZD11cGRhdGUpCisgICAgYnV0dG9uLnBhY2soKQorICAgIHJvb3QubWFpbmxvb3AoKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgorICAgIHJ1bihfZHluX29wdGlvbl9tZW51KQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvZXh0ZW5kLnR4dCBiL0xpYi9pZGxlbGliL2V4dGVuZC50eHQKaW5kZXggMTY1ZTA0NC4uYzljYjJlOCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvZXh0ZW5kLnR4dAorKysgYi9MaWIvaWRsZWxpYi9leHRlbmQudHh0CkBAIC01NCw3ICs1NCw3IEBACiBpbXBsZW1lbnQuICAoVGhleSBhcmUgYWxzbyBub3QgcmVxdWlyZWQgdG8gY3JlYXRlIGtleWJpbmRpbmdzLCBidXQgaW4gdGhhdAogY2FzZSB0aGVyZSBtdXN0IGJlIGVtcHR5IGJpbmRpbmdzIGluIGNvZmlnLWV4dGVuc2lvbnMuZGVmKQogCi1IZXJlIGlzIGEgY29tcGxldGUgZXhhbXBsZSBleGFtcGxlOgorSGVyZSBpcyBhIGNvbXBsZXRlIGV4YW1wbGU6CiAKIGNsYXNzIFpvb21IZWlnaHQ6CiAKQEAgLTcyLDcgKzcyLDcgQEAKICAgICAgICAgIi4uLkRvIHdoYXQgeW91IHdhbnQgaGVyZS4uLiIKIAogVGhlIGZpbmFsIHBpZWNlIG9mIHRoZSBwdXp6bGUgaXMgdGhlIGZpbGUgImNvbmZpZy1leHRlbnNpb25zLmRlZiIsIHdoaWNoIGlzCi11c2VkIHRvIHRvIGNvbmZpZ3VyZSB0aGUgbG9hZGluZyBvZiBleHRlbnNpb25zIGFuZCB0byBlc3RhYmxpc2gga2V5IChvciwgbW9yZQordXNlZCB0byBjb25maWd1cmUgdGhlIGxvYWRpbmcgb2YgZXh0ZW5zaW9ucyBhbmQgdG8gZXN0YWJsaXNoIGtleSAob3IsIG1vcmUKIGdlbmVyYWxseSwgZXZlbnQpIGJpbmRpbmdzIHRvIHRoZSB2aXJ0dWFsIGV2ZW50cyBkZWZpbmVkIGluIHRoZSBleHRlbnNpb25zLgogCiBTZWUgdGhlIGNvbW1lbnRzIGF0IHRoZSB0b3Agb2YgY29uZmlnLWV4dGVuc2lvbnMuZGVmIGZvciBpbmZvcm1hdGlvbi4gIEl0J3MKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2hlbHAudHh0IGIvTGliL2lkbGVsaWIvaGVscC50eHQKaW5kZXggN2JmZDJjYS4uYmQ2ODIyYyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaGVscC50eHQKKysrIGIvTGliL2lkbGVsaWIvaGVscC50eHQKQEAgLTUsNyArNSw3IEBACiAKIEZpbGUgTWVudToKIAotCU5ldyBXaW5kb3cgICAgICAgLS0gQ3JlYXRlIGEgbmV3IGVkaXRpbmcgd2luZG93CisJTmV3IEZpbGUgICAgICAgICAtLSBDcmVhdGUgYSBuZXcgZWRpdGluZyB3aW5kb3cKIAlPcGVuLi4uICAgICAgICAgIC0tIE9wZW4gYW4gZXhpc3RpbmcgZmlsZQogCVJlY2VudCBGaWxlcy4uLiAgLS0gT3BlbiBhIGxpc3Qgb2YgcmVjZW50IGZpbGVzCiAJT3BlbiBNb2R1bGUuLi4gICAtLSBPcGVuIGFuIGV4aXN0aW5nIG1vZHVsZSAoc2VhcmNoZXMgc3lzLnBhdGgpCkBAIC04MCw3ICs4MCw3IEBACiBEZWJ1ZyBNZW51IChvbmx5IGluIFNoZWxsIHdpbmRvdyk6CiAKIAlHbyB0byBGaWxlL0xpbmUgICAtLSBsb29rIGFyb3VuZCB0aGUgaW5zZXJ0IHBvaW50IGZvciBhIGZpbGVuYW1lCi0JCSAgICAgICAgICAgICBhbmQgbGluZW51bWJlciwgb3BlbiB0aGUgZmlsZSwgYW5kIHNob3cgdGhlIGxpbmUKKwkJICAgICAgICAgICAgIGFuZCBsaW5lIG51bWJlciwgb3BlbiB0aGUgZmlsZSwgYW5kIHNob3cgdGhlIGxpbmUKIAlEZWJ1Z2dlciAodG9nZ2xlKSAtLSBSdW4gY29tbWFuZHMgaW4gdGhlIHNoZWxsIHVuZGVyIHRoZSBkZWJ1Z2dlcgogCVN0YWNrIFZpZXdlciAgICAgIC0tIFNob3cgdGhlIHN0YWNrIHRyYWNlYmFjayBvZiB0aGUgbGFzdCBleGNlcHRpb24KIAlBdXRvLW9wZW4gU3RhY2sgVmlld2VyICh0b2dnbGUpIC0tIE9wZW4gc3RhY2sgdmlld2VyIG9uIHRyYWNlYmFjawpAQCAtOTIsNyArOTIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydHVwIFByZWZlcmVuY2VzIG1heSBiZSBzZXQsIGFuZCBBZGRpdGlvbmFsIEhlbHAKICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlcyBjYW4gYmUgc3BlY2lmaWVkLgogCQkJICAKLQkJCSAgT24gTWFjT1MgWCB0aGlzIG1lbnUgaXMgbm90IHByZXNlbnQsIHVzZQorCQkJICBPbiBPUyBYIHRoaXMgbWVudSBpcyBub3QgcHJlc2VudCwgdXNlCiAJCQkgIG1lbnUgJ0lETEUgLT4gUHJlZmVyZW5jZXMuLi4nIGluc3RlYWQuCiAJLS0tCiAJQ29kZSBDb250ZXh0IC0tCSAgT3BlbiBhIHBhbmUgYXQgdGhlIHRvcCBvZiB0aGUgZWRpdCB3aW5kb3cgd2hpY2gKQEAgLTEyMCw2ICsxMjAsMjQgQEAKIAktLS0KIAkoQWRkaXRpb25hbCBIZWxwIFNvdXJjZXMgbWF5IGJlIGFkZGVkIGhlcmUpCiAKK0VkaXQgY29udGV4dCBtZW51IChSaWdodC1jbGljayAvIENvbnRyb2wtY2xpY2sgb24gT1MgWCBpbiBFZGl0IHdpbmRvdyk6CisKKyAgICAJQ3V0ICAgICAgICAgICAgICAtLSBDb3B5IGEgc2VsZWN0aW9uIGludG8gc3lzdGVtLXdpZGUgY2xpcGJvYXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gZGVsZXRlIHRoZSBzZWxlY3Rpb24KKwlDb3B5ICAgICAgICAgICAgIC0tIENvcHkgc2VsZWN0aW9uIGludG8gc3lzdGVtLXdpZGUgY2xpcGJvYXJkCisJUGFzdGUgICAgICAgICAgICAtLSBJbnNlcnQgc3lzdGVtLXdpZGUgY2xpcGJvYXJkIGludG8gd2luZG93CisJU2V0IEJyZWFrcG9pbnQgICAtLSBTZXRzIGEgYnJlYWtwb2ludCAod2hlbiBkZWJ1Z2dlciBvcGVuKQorCUNsZWFyIEJyZWFrcG9pbnQgLS0gQ2xlYXJzIHRoZSBicmVha3BvaW50IG9uIHRoYXQgbGluZQorCitTaGVsbCBjb250ZXh0IG1lbnUgKFJpZ2h0LWNsaWNrIC8gQ29udHJvbC1jbGljayBvbiBPUyBYIGluIFNoZWxsIHdpbmRvdyk6CisKKwlDdXQgICAgICAgICAgICAgIC0tIENvcHkgYSBzZWxlY3Rpb24gaW50byBzeXN0ZW0td2lkZSBjbGlwYm9hcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBkZWxldGUgdGhlIHNlbGVjdGlvbgorCUNvcHkgICAgICAgICAgICAgLS0gQ29weSBzZWxlY3Rpb24gaW50byBzeXN0ZW0td2lkZSBjbGlwYm9hcmQKKwlQYXN0ZSAgICAgICAgICAgIC0tIEluc2VydCBzeXN0ZW0td2lkZSBjbGlwYm9hcmQgaW50byB3aW5kb3cKKyAgICAgICAgLS0tCisJR28gdG8gZmlsZS9saW5lICAtLSBTYW1lIGFzIGluIERlYnVnIG1lbnUKKwogCiAqKiBUSVBTICoqCiA9PT09PT09PT09CkBAIC0yMTUsMTQgKzIzMywxMyBAQAogUHl0aG9uIFNoZWxsIHdpbmRvdzoKIAogCUNvbnRyb2wtYyBpbnRlcnJ1cHRzIGV4ZWN1dGluZyBjb21tYW5kLgotCUNvbnRyb2wtZCBzZW5kcyBlbmQtb2YtZmlsZTsgY2xvc2VzIHdpbmRvdyBpZiB0eXBlZCBhdCA+Pj4gcHJvbXB0Ci0JCSh0aGlzIGlzIENvbnRyb2wteiBvbiBXaW5kb3dzKS4KKwlDb250cm9sLWQgc2VuZHMgZW5kLW9mLWZpbGU7IGNsb3NlcyB3aW5kb3cgaWYgdHlwZWQgYXQgPj4+IHByb21wdC4KIAogICAgIENvbW1hbmQgaGlzdG9yeToKIAogCUFsdC1wIHJldHJpZXZlcyBwcmV2aW91cyBjb21tYW5kIG1hdGNoaW5nIHdoYXQgeW91IGhhdmUgdHlwZWQuCiAJQWx0LW4gcmV0cmlldmVzIG5leHQuCi0JICAgICAgKFRoZXNlIGFyZSBDb250cm9sLXAsIENvbnRyb2wtbiBvbiB0aGUgTWFjKQorCSAgICAgIChUaGVzZSBhcmUgQ29udHJvbC1wLCBDb250cm9sLW4gb24gT1MgWCkKIAlSZXR1cm4gd2hpbGUgY3Vyc29yIGlzIG9uIGEgcHJldmlvdXMgY29tbWFuZCByZXRyaWV2ZXMgdGhhdCBjb21tYW5kLgogCUV4cGFuZCB3b3JkIGlzIGFsc28gdXNlZnVsIHRvIHJlZHVjZSB0eXBpbmcuCiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC9SRUFETUUudHh0IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZiNmEyMQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC9SRUFETUUudHh0CkBAIC0wLDAgKzEsMTE1IEBACitSRUFETUUgRk9SIElETEUgVEVTVFMgSU4gSURMRUxJQi5JRExFX1RFU1QKKworCisxLiBUZXN0IEZpbGVzCisKK1RoZSBpZGxlIGRpcmVjdG9yeSwgaWRsZWxpYiwgaGFzIG92ZXIgNjAgeHl6LnB5IGZpbGVzLiBUaGUgaWRsZV90ZXN0CitzdWJkaXJlY3Rvcnkgc2hvdWxkIGNvbnRhaW4gYSB0ZXN0X3h5eS5weSBmb3IgZWFjaC4gKEZvciB0ZXN0IG1vZHVsZXMsIG1ha2UKKyd4eXonIGxvd2VyIGNhc2UsIGFuZCBwb3NzaWJseSBzaG9ydGVuIGl0LikgRWFjaCBmaWxlIHNob3VsZCBzdGFydCB3aXRoIHRoZQorc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZyB0ZW1wbGF0ZSwgd2l0aCB0aGUgYmxhbmtzIGFmdGVyIGFmdGVyICcuJyBhbmQgJ2FzJywKK2FuZCBiZWZvcmUgYW5kIGFmdGVyICdfJyBmaWxsZWQgaW4uCistLS0KK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCitpbXBvcnQgaWRsZWxpYi4gYXMKKworY2xhc3MgX1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfKHNlbGYpOgorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIsIGV4aXQ9MikKKy0tLQorSWRsZSB0ZXN0cyBhcmUgcnVuIHdpdGggdW5pdHRlc3Q7IGRvIG5vdCB1c2UgcmVncnRlc3QncyB0ZXN0X21haW4uCisKK09uY2UgdGVzdF94eXkgaXMgd3JpdHRlbiwgdGhlIGZvbGxvd2luZyBzaG91bGQgZ28gYXQgdGhlIGVuZCBvZiB4eXkucHksCit3aXRoIHh5eiAobG93ZXJjYXNlZCkgYWRkZWQgYWZ0ZXIgJ3Rlc3RfJy4KKy0tLQoraWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBpbXBvcnQgdW5pdHRlc3QKKyAgICB1bml0dGVzdC5tYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0XycsIHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQorLS0tCisKKworMi4gR3VpIFRlc3RzCisKK0d1aSB0ZXN0cyBuZWVkICdyZXF1aXJlcycgZnJvbSB0ZXN0LnN1cHBvcnQgKHRlc3QudGVzdF9zdXBwb3J0IGluIDIuNykuIEEKK3Rlc3QgaXMgYSBndWkgdGVzdCBpZiBpdCBjcmVhdGVzIGEgVGsgcm9vdCBvciBtYXN0ZXIgb2JqZWN0IGVpdGhlciBkaXJlY3RseQorb3IgaW5kaXJlY3RseSBieSBpbnN0YW50aWF0aW5nIGEgdGtpbnRlciBvciBpZGxlIGNsYXNzLiBGb3IgdGhlIGJlbmVmaXQgb2YKK3Rlc3QgcHJvY2Vzc2VzIHRoYXQgZWl0aGVyIGhhdmUgbm8gZ3JhcGhpY2FsIGVudmlyb25tZW50IGF2YWlsYWJsZSBvciBhcmUgbm90CithbGxvd2VkIHRvIHVzZSBpdCwgZ3VpIHRlc3RzIG11c3QgYmUgJ2d1YXJkZWQnIGJ5ICJyZXF1aXJlcygnZ3VpJykiIGluIGEKK3NldFVwIGZ1bmN0aW9uIG9yIG1ldGhvZC4gVGhpcyB3aWxsIHR5cGljYWxseSBiZSBzZXRVcENsYXNzLgorCitUbyBhdm9pZCBpbnRlcmZlcmluZyB3aXRoIG90aGVyIGd1aSB0ZXN0cywgYWxsIGd1aSBvYmplY3RzIG11c3QgYmUgZGVzdHJveWVkCithbmQgZGVsZXRlZCBieSB0aGUgZW5kIG9mIHRoZSB0ZXN0LiAgSWYgYSB3aWRnZXQsIHN1Y2ggYXMgYSBUayByb290LCBpcyBjcmVhdGVkCitpbiBhIHNldFVwWCBmdW5jdGlvbiwgZGVzdHJveSBpdCBpbiB0aGUgY29ycmVzcG9uZGluZyB0ZWFyRG93blguICBGb3IgbW9kdWxlCithbmQgY2xhc3MgYXR0cmlidXRlcywgYWxzbyBkZWxldGUgdGhlIHdpZGdldC4KKy0tLQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIHJlcXVpcmVzKCdndWknKQorICAgICAgICBjbHMucm9vdCA9IHRrLlRrKCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgIGNscy5yb290LmRlc3Ryb3koKQorICAgICAgICBkZWwgY2xzLnJvb3QKKy0tLQorCitTdXBwb3J0LnJlcXVpcmVzKCdndWknKSBjYXVzZXMgdGhlIHRlc3QocykgaXQgZ3VhcmRzIHRvIGJlIHNraXBwZWQgaWYgYW55IG9mCithIGZldyBjb25kaXRpb25zIGFyZSBtZXQ6CisgLSBUaGUgdGVzdHMgYXJlIGJlaW5nIHJ1biBieSByZWdydGVzdC5weSwgYW5kIGl0IHdhcyBzdGFydGVkIHdpdGhvdXQKKyAgIGVuYWJsaW5nIHRoZSAiZ3VpIiByZXNvdXJjZSB3aXRoIHRoZSAiLXUiIGNvbW1hbmQgbGluZSBvcHRpb24uCisgLSBUaGUgdGVzdHMgYXJlIGJlaW5nIHJ1biBvbiBXaW5kb3dzIGJ5IGEgc2VydmljZSB0aGF0IGlzIG5vdCBhbGxvd2VkIHRvCisgICBpbnRlcmFjdCB3aXRoIHRoZSBncmFwaGljYWwgZW52aXJvbm1lbnQuCisgLSBUaGUgdGVzdHMgYXJlIGJlaW5nIHJ1biBvbiBNYWMgT1NYIGluIGEgcHJvY2VzcyB0aGF0IGNhbm5vdCBtYWtlIGEgd2luZG93CisgICBtYW5hZ2VyIGNvbm5lY3Rpb24uCisgLSB0a2ludGVyLlRrIGNhbm5vdCBiZSBzdWNjZXNzZnVsbHkgaW5zdGFudGlhdGVkIGZvciBzb21lIHJlYXNvbi4KKyAtIHRlc3Quc3VwcG9ydC51c2VfcmVzb3VyY2VzIGhhcyBiZWVuIHNldCBieSBzb21ldGhpbmcgb3RoZXIgdGhhbgorICAgcmVncnRlc3QucHkgYW5kIGRvZXMgbm90IGNvbnRhaW4gImd1aSIuCisKK1NpbmNlIG5vbi1ndWkgdGVzdHMgYWx3YXlzIHJ1biwgYnV0IGd1aSB0ZXN0cyBvbmx5IHNvbWV0aW1lcywgdGVzdHMgb2Ygbm9uLWd1aQorb3BlcmF0aW9ucyBzaG91bGQgYmVzdCBhdm9pZCBuZWVkaW5nIGEgZ3VpLiBNZXRob2RzIHRoYXQgbWFrZSBpbmNpZGVudGFsIHVzZSBvZgordGtpbnRlciAodGspIHZhcmlhYmxlcyBhbmQgbWVzc2FnZWJveGVzIGNhbiBkbyB0aGlzIGJ5IHVzaW5nIHRoZSBtb2NrIGNsYXNzZXMgaW4KK2lkbGVfdGVzdC9tb2NrX3RrLnB5LiBUaGVyZSBpcyBhbHNvIGEgbW9jayB0ZXh0IHRoYXQgd2lsbCBoYW5kbGUgc29tZSB1c2VzIG9mIHRoZQordGsgVGV4dCB3aWRnZXQuCisKKworMy4gUnVubmluZyBUZXN0cworCitBc3N1bWUgdGhhdCB4eXoucHkgYW5kIHRlc3RfeHl6LnB5IGVuZCB3aXRoIHRoZSAiaWYgX19uYW1lX18iIHN0YXRlbWVudHMgZ2l2ZW4KK2Fib3ZlLiBJbiBJZGxlLCBwcmVzc2luZyBGNSBpbiBhbiBlZGl0b3Igd2luZG93IHdpdGggZWl0aGVyIGxvYWRlZCB3aWxsIHJ1biBhbGwKK3Rlc3RzIGluIHRoZSB0ZXN0X3h5eiBmaWxlIHdpdGggdGhlIHZlcnNpb24gb2YgUHl0aG9uIHJ1bm5pbmcgSWRsZS4gIFRoZSB0ZXN0CityZXBvcnQgYW5kIGFueSB0cmFjZWJhY2tzIHdpbGwgYXBwZWFyIGluIHRoZSBTaGVsbCB3aW5kb3cuIFRoZSBvcHRpb25zIGluIHRoZXNlCisiaWYgX19uYW1lX18iIHN0YXRlbWVudHMgYXJlIGFwcHJvcHJpYXRlIGZvciBkZXZlbG9wZXJzIHJ1bm5pbmcgKGFzIG9wcG9zZWQgdG8KK2ltcG9ydGluZykgZWl0aGVyIG9mIHRoZSBmaWxlcyBkdXJpbmcgZGV2ZWxvcG1lbnQ6IHZlcmJvc2l0eT0yIGxpc3RzIGFsbCB0ZXN0CittZXRob2RzIGluIHRoZSBmaWxlOyBleGl0PUZhbHNlIGF2b2lkcyBhIHNwdXJpb3VzIHN5cy5leGl0IHRyYWNlYmFjayB0aGF0IHdvdWxkCitvdGhlcndpc2Ugb2NjdXIgd2hlbiBydW5uaW5nIGluIElkbGUuIFRoZSBmb2xsb3dpbmcgY29tbWFuZCBsaW5lcyBhbHNvIHJ1bgorYWxsIHRlc3QgbWV0aG9kcywgaW5jbHVkaW5nIGd1aSB0ZXN0cywgaW4gdGVzdF94eXoucHkuIChUaGUgZXhjZXB0aW9ucyBhcmUgdGhhdAoraWRsZWxpYiBhbmQgaWRsZWxpYi5pZGxlIHN0YXJ0IElkbGUgYW5kIGlkbGVsaWIuUHlTaGVsbCBzaG91bGQgKGlzc3VlIDE4MzMwKS4pCisKK3B5dGhvbiAtbSBpZGxlbGliLnh5eiAgIyBXaXRoIHRoZSBjYXBpdGFsaXphdGlvbiBvZiB0aGUgeHl6IG1vZHVsZQorcHl0aG9uIC1tIGlkbGVsaWIuaWRsZV90ZXN0LnRlc3RfeHl6CisKK1RvIHJ1biBhbGwgaWRsZV90ZXN0L3Rlc3RfKi5weSB0ZXN0cywgZWl0aGVyIGludGVyYWN0aXZlbHkKKygnPj4+Jywgd2l0aCB1bml0dGVzdCBpbXBvcnRlZCkgb3IgZnJvbSBhIGNvbW1hbmQgbGluZSwgdXNlIG9uZSBvZiB0aGUKK2ZvbGxvd2luZy4gKE5vdGVzOiBpbiAyLjcsICd0ZXN0ICcgKHdpdGggdGhlIHNwYWNlKSBpcyAndGVzdC5yZWdydGVzdCAnOword2hlcmUgcHJlc2VudCwgLXYgYW5kIC11Z3VpIGNhbiBiZSBvbWl0dGVkLikKKworPj4+IHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0JywgdmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCitweXRob24gLW0gdW5pdHRlc3QgLXYgaWRsZWxpYi5pZGxlX3Rlc3QKK3B5dGhvbiAtbSB0ZXN0IC12IC11Z3VpIHRlc3RfaWRsZQorcHl0aG9uIC1tIHRlc3QudGVzdF9pZGxlCisKK1RoZSBpZGxlIHRlc3RzIGFyZSAnZGlzY292ZXJlZCcgYnkgaWRsZWxpYi5pZGxlX3Rlc3QuX19pbml0X18ubG9hZF90ZXN0cywKK3doaWNoIGlzIGFsc28gaW1wb3J0ZWQgaW50byB0ZXN0LnRlc3RfaWRsZS4gTm9ybWFsbHksIG5laXRoZXIgZmlsZSBzaG91bGQgYmUKK2NoYW5nZWQgd2hlbiB3b3JraW5nIG9uIGluZGl2aWR1YWwgdGVzdCBtb2R1bGVzLiBUaGUgdGhpcmQgY29tbWFuZCBydW5zCit1bml0dGVzdCBpbmRpcmVjdGx5IHRocm91Z2ggcmVncnRlc3QuIFRoZSBzYW1lIGhhcHBlbnMgd2hlbiB0aGUgZW50aXJlIHRlc3QKK3N1aXRlIGlzIHJ1biB3aXRoICdweXRob24gLW0gdGVzdCcuIFNvIHRoYXQgY29tbWFuZCBtdXN0IHdvcmsgZm9yIGJ1aWxkYm90cwordG8gc3RheSBncmVlbi4gSWRsZSB0ZXN0cyBtdXN0IG5vdCBkaXN0dXJiIHRoZSBlbnZpcm9ubWVudCBpbiBhIHdheSB0aGF0CittYWtlcyBvdGhlciB0ZXN0cyBmYWlsIChpc3N1ZSAxODA4MSkuCisKK1RvIHJ1biBhbiBpbmRpdmlkdWFsIFRlc3RjYXNlIG9yIHRlc3QgbWV0aG9kLCBleHRlbmQgdGhlIGRvdHRlZCBuYW1lIGdpdmVuIHRvCit1bml0dGVzdCBvbiB0aGUgY29tbWFuZCBsaW5lLgorCitweXRob24gLW0gdW5pdHRlc3QgLXYgaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF94eXouVGVzdF9jYXNlLnRlc3RfbWV0aApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L19faW5pdF9fLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYzk1MzYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvX19pbml0X18ucHkKQEAgLTAsMCArMSw5IEBACitmcm9tIG9zLnBhdGggaW1wb3J0IGRpcm5hbWUKKworZGVmIGxvYWRfdGVzdHMobG9hZGVyLCBzdGFuZGFyZF90ZXN0cywgcGF0dGVybik6CisgICAgdGhpc19kaXIgPSBkaXJuYW1lKF9fZmlsZV9fKQorICAgIHRvcF9kaXIgPSBkaXJuYW1lKGRpcm5hbWUodGhpc19kaXIpKQorICAgIHBhY2thZ2VfdGVzdHMgPSBsb2FkZXIuZGlzY292ZXIoc3RhcnRfZGlyPXRoaXNfZGlyLCBwYXR0ZXJuPSd0ZXN0Ki5weScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BfbGV2ZWxfZGlyPXRvcF9kaXIpCisgICAgc3RhbmRhcmRfdGVzdHMuYWRkVGVzdHMocGFja2FnZV90ZXN0cykKKyAgICByZXR1cm4gc3RhbmRhcmRfdGVzdHMKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC9odGVzdC5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC9odGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmUwMmI4Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L2h0ZXN0LnB5CkBAIC0wLDAgKzEsMzY4IEBACisnJydSdW4gaHVtYW4gdGVzdHMgb2YgSWRsZSdzIHdpbmRvdywgZGlhbG9nLCBhbmQgcG9wdXAgd2lkZ2V0cy4KKworcnVuKCp0ZXN0cykKK1J1biBlYWNoIGNhbGxhYmxlIGluIHRlc3RzIGFmdGVyIGZpbmRpbmcgdGhlIG1hdGNoaW5nIHRlc3Qgc3BlYyBpbiB0aGlzIGZpbGUuCitJZiB0aGVyZSBhcmUgbm9uZSwgcnVuIGFuIGh0ZXN0IGZvciBlYWNoIHNwZWMgZGljdCBpbiB0aGlzIGZpbGUgYWZ0ZXIgZmluZGluZwordGhlIG1hdGNoaW5nIGNhbGxhYmxlIGluIHRoZSBtb2R1bGUgbmFtZWQgaW4gdGhlIHNwZWMuCisKK0luIGEgdGVzdGVkIG1vZHVsZSwgbGV0IFggYmUgYSBnbG9iYWwgbmFtZSBib3VuZCB0byBhIHdpZGdldCBjYWxsYWJsZS4KK0VuZCB0aGUgbW9kdWxlIHdpdGgKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICA8dW5pdHRlc3QsIGlmIHRoZXJlIGlzIG9uZT4KKyAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KKyAgICBydW4oWCkKKworVGhlIFggb2JqZWN0IG11c3QgaGF2ZSBhIC5fX25hbWVfXyBhdHRyaWJ1dGUgYW5kIGEgJ3BhcmVudCcgcGFyYW1ldGVyLgorWCB3aWxsIG9mdGVuIGJlIGEgd2lkZ2V0IGNsYXNzLCBidXQgYSBjYWxsYWJsZSBpbnN0YW5jZSB3aXRoIC5fX25hbWVfXworb3IgYSB3cmFwcGVyIGZ1bmN0aW9uIGFsc28gd29yay4gVGhlIG5hbWUgb2Ygd3JhcHBlciBmdW5jdGlvbnMsIGxpa2UKKydfZWRpdG9yX3dpbmRvdycsIHNob3VsZCBzdGFydCB3aXRoICdfJy4KKworVGhpcyBmaWxlIG11c3QgY29udGFpbiBhIG1hdGNoaW5nIGluc3RhbmNlIG9mIHRoZSBmb2xsb3dpbmcgdGVtcGxhdGUsCit3aXRoIFguX19uYW1lX18gcHJlcGVuZGVkLCBhcyBpbiAnX2VkaXRvcl93aW5kb3dfc3BlYyAuLi4nLgorCitfc3BlYyA9IHsKKyAgICAnZmlsZSc6ICcnLAorICAgICdrd2RzJzogeyd0aXRsZSc6ICcnfSwKKyAgICAnbXNnJzogIiIKKyAgICB9CisKK2ZpbGUgKG5vIC5weSk6IHVzZWQgaW4gcnVuKCkgdG8gaW1wb3J0IHRoZSBmaWxlIGFuZCBnZXQgWC4KK2t3ZHM6IHBhc3NlZCB0byBYICgqKmt3ZHMpLCBhZnRlciAncGFyZW50JyBpcyBhZGRlZCwgdG8gaW5pdGlhbGl6ZSBYLgordGl0bGU6IGFuIGV4YW1wbGU7IHVzZWQgZm9yIHNvbWUgd2lkZ2V0cywgZGVsZXRlIGlmIG5vdC4KK21zZzogZGlzcGxheWVkIGluIGEgbWFzdGVyIHdpbmRvdy4gSGludHMgYXMgdG8gaG93IHRoZSB1c2VyIG1pZ2h0CisgIHRlc3QgdGhlIHdpZGdldC4gQ2xvc2UgdGhlIHdpbmRvdyB0byBza2lwIG9yIGVuZCB0aGUgdGVzdC4KKworTW9kdWxlcyBub3QgYmVpbmcgdGVzdGVkIGF0IHRoZSBtb21lbnQ6CitQeVNoZWxsLlB5U2hlbGxFZGl0b3JXaW5kb3cKK0RlYnVnZ2VyLkRlYnVnZ2VyCitBdXRvQ29tcGxldGVXaW5kb3cuQXV0b0NvbXBsZXRlV2luZG93CitPdXRwdXRXaW5kb3cuT3V0cHV0V2luZG93IChpbmRpcmVjdGx5IGJlaW5nIHRlc3RlZCB3aXRoIGdyZXAgdGVzdCkKKycnJworZnJvbSBpbXBvcnRsaWIgaW1wb3J0IGltcG9ydF9tb2R1bGUKK2Zyb20gaWRsZWxpYi5tYWNvc3hTdXBwb3J0IGltcG9ydCBfaW5pdGlhbGl6ZVRrVmFyaWFudFRlc3RzCitpbXBvcnQgVGtpbnRlciBhcyB0aworCitBYm91dERpYWxvZ19zcGVjID0geworICAgICdmaWxlJzogJ2Fib3V0RGlhbG9nJywKKyAgICAna3dkcyc6IHsndGl0bGUnOiAnYWJvdXREaWFsb2cgdGVzdCcsCisgICAgICAgICAgICAgJ19odGVzdCc6IFRydWUsCisgICAgICAgICAgICAgfSwKKyAgICAnbXNnJzogIlRlc3QgZXZlcnkgYnV0dG9uLiBFbnN1cmUgUHl0aG9uLCBUSyBhbmQgSURMRSB2ZXJzaW9ucyAiCisgICAgICAgICAgICJhcmUgY29ycmVjdGx5IGRpc3BsYXllZC5cbiBbQ2xvc2VdIHRvIGV4aXQuIiwKKyAgICB9CisKK19jYWxsdGlwX3dpbmRvd19zcGVjID0geworICAgICdmaWxlJzogJ0NhbGxUaXBXaW5kb3cnLAorICAgICdrd2RzJzoge30sCisgICAgJ21zZyc6ICJUeXBpbmcgJygnIHNob3VsZCBkaXNwbGF5IGEgY2FsbHRpcC5cbiIKKyAgICAgICAgICAgIlR5cGluZyAnKSBzaG91bGQgaGlkZSB0aGUgY2FsbHRpcC5cbiIKKyAgICB9CisKK19jbGFzc19icm93c2VyX3NwZWMgPSB7CisgICAgJ2ZpbGUnOiAnQ2xhc3NCcm93c2VyJywKKyAgICAna3dkcyc6IHt9LAorICAgICdtc2cnOiAiSW5zcGVjdCBuYW1lcyBvZiBtb2R1bGUsIGNsYXNzKHdpdGggc3VwZXJjbGFzcyBpZiAiCisgICAgICAgICAgICJhcHBsaWNhYmxlKSwgbWV0aG9kcyBhbmQgZnVuY3Rpb25zLlxuVG9nZ2xlIG5lc3RlZCBpdGVtcy5cbiIKKyAgICAgICAgICAgIkRvdWJsZSBjbGlja2luZyBvbiBpdGVtcyBwcmludHMgYSB0cmFjZWJhY2sgZm9yIGFuIGV4Y2VwdGlvbiAiCisgICAgICAgICAgICJ0aGF0IGlzIGlnbm9yZWQuIgorICAgIH0KKworX2NvbG9yX2RlbGVnYXRvcl9zcGVjID0geworICAgICdmaWxlJzogJ0NvbG9yRGVsZWdhdG9yJywKKyAgICAna3dkcyc6IHt9LAorICAgICdtc2cnOiAiVGhlIHRleHQgaXMgc2FtcGxlIFB5dGhvbiBjb2RlLlxuIgorICAgICAgICAgICAiRW5zdXJlIGNvbXBvbmVudHMgbGlrZSBjb21tZW50cywga2V5d29yZHMsIGJ1aWx0aW5zLFxuIgorICAgICAgICAgICAic3RyaW5nLCBkZWZpbml0aW9ucywgYW5kIGJyZWFrIGFyZSBjb3JyZWN0bHkgY29sb3JlZC5cbiIKKyAgICAgICAgICAgIlRoZSBkZWZhdWx0IGNvbG9yIHNjaGVtZSBpcyBpbiBpZGxlbGliL2NvbmZpZy1oaWdobGlnaHQuZGVmIgorICAgIH0KKworQ29uZmlnRGlhbG9nX3NwZWMgPSB7CisgICAgJ2ZpbGUnOiAnY29uZmlnRGlhbG9nJywKKyAgICAna3dkcyc6IHsndGl0bGUnOiAnU2V0dGluZ3MnLAorICAgICAgICAgICAgICdfaHRlc3QnOiBUcnVlLH0sCisgICAgJ21zZyc6ICJJRExFIHByZWZlcmVuY2VzIGRpYWxvZy5cbiIKKyAgICAgICAgICAgIkluIHRoZSAnRm9udHMvVGFicycgdGFiLCBjaGFuZ2luZyBmb250IGZhY2UsIHNob3VsZCB1cGRhdGUgdGhlICIKKyAgICAgICAgICAgImZvbnQgZmFjZSBvZiB0aGUgdGV4dCBpbiB0aGUgYXJlYSBiZWxvdyBpdC5cbkluIHRoZSAiCisgICAgICAgICAgICInSGlnaGxpZ2h0aW5nJyB0YWIsIHRyeSBkaWZmZXJlbnQgY29sb3Igc2NoZW1lcy4gQ2xpY2tpbmcgIgorICAgICAgICAgICAiaXRlbXMgaW4gdGhlIHNhbXBsZSBwcm9ncmFtIHNob3VsZCB1cGRhdGUgdGhlIGNob2ljZXMgYWJvdmUgaXQuIgorICAgICAgICAgICAiXG5JbiB0aGUgJ0tleXMnIGFuZCAnR2VuZXJhbCcgdGFiLCB0ZXN0IHNldHRpbmdzIG9mIGludGVyZXN0LiIKKyAgICAgICAgICAgIlxuW09rXSB0byBjbG9zZSB0aGUgZGlhbG9nLltBcHBseV0gdG8gYXBwbHkgdGhlIHNldHRpbmdzIGFuZCAiCisgICAgICAgICAgICJhbmQgW0NhbmNlbF0gdG8gcmV2ZXJ0IGFsbCBjaGFuZ2VzLlxuUmUtcnVuIHRoZSB0ZXN0IHRvIGVuc3VyZSAiCisgICAgICAgICAgICJjaGFuZ2VzIG1hZGUgaGF2ZSBwZXJzaXN0ZWQuIgorICAgIH0KKworX2R5bl9vcHRpb25fbWVudV9zcGVjID0geworICAgICdmaWxlJzogJ2R5bk9wdGlvbk1lbnVXaWRnZXQnLAorICAgICdrd2RzJzoge30sCisgICAgJ21zZyc6ICJTZWxlY3Qgb25lIG9mIHRoZSBtYW55IG9wdGlvbnMgaW4gdGhlICdvbGQgb3B0aW9uIHNldCcuXG4iCisgICAgICAgICAgICJDbGljayB0aGUgYnV0dG9uIHRvIGNoYW5nZSB0aGUgb3B0aW9uIHNldC5cbiIKKyAgICAgICAgICAgIlNlbGVjdCBvbmUgb2YgdGhlIG1hbnkgb3B0aW9ucyBpbiB0aGUgJ25ldyBvcHRpb24gc2V0Jy4iCisgICAgfQorCitfZWRpdG9yX3dpbmRvd19zcGVjID0geworICAgJ2ZpbGUnOiAnRWRpdG9yV2luZG93JywKKyAgICAna3dkcyc6IHt9LAorICAgICdtc2cnOiAiVGVzdCBlZGl0b3IgZnVuY3Rpb25zIG9mIGludGVyZXN0LiIKKyAgICB9CisKK0dldENmZ1NlY3Rpb25OYW1lRGlhbG9nX3NwZWMgPSB7CisgICAgJ2ZpbGUnOiAnY29uZmlnU2VjdGlvbk5hbWVEaWFsb2cnLAorICAgICdrd2RzJzogeyd0aXRsZSc6J0dldCBOYW1lJywKKyAgICAgICAgICAgICAnbWVzc2FnZSc6J0VudGVyIHNvbWV0aGluZycsCisgICAgICAgICAgICAgJ3VzZWRfbmFtZXMnOiB7J2FiYyd9LAorICAgICAgICAgICAgICdfaHRlc3QnOiBUcnVlfSwKKyAgICAnbXNnJzogIkFmdGVyIHRoZSB0ZXh0IGVudGVyZWQgd2l0aCBbT2tdIGlzIHN0cmlwcGVkLCA8bm90aGluZz4sICIKKyAgICAgICAgICAgIidhYmMnLCBvciBtb3JlIHRoYXQgMzAgY2hhcnMgYXJlIGVycm9ycy5cbiIKKyAgICAgICAgICAgIkNsb3NlICdHZXQgTmFtZScgd2l0aCBhIHZhbGlkIGVudHJ5IChwcmludGVkIHRvIFNoZWxsKSwgIgorICAgICAgICAgICAiW0NhbmNlbF0sIG9yIFtYXSIsCisgICAgfQorCitHZXRIZWxwU291cmNlRGlhbG9nX3NwZWMgPSB7CisgICAgJ2ZpbGUnOiAnY29uZmlnSGVscFNvdXJjZUVkaXQnLAorICAgICdrd2RzJzogeyd0aXRsZSc6ICdHZXQgaGVscHNvdXJjZScsCisgICAgICAgICAgICAgJ19odGVzdCc6IFRydWV9LAorICAgICdtc2cnOiAiRW50ZXIgbWVudSBpdGVtIG5hbWUgYW5kIGhlbHAgZmlsZSBwYXRoXG4gIgorICAgICAgICAgICAiPG5vdGhpbmc+IGFuZCBtb3JlIHRoYW4gMzAgY2hhcnMgYXJlIGludmFsaWQgbWVudSBpdGVtIG5hbWVzLlxuIgorICAgICAgICAgICAiPG5vdGhpbmc+LCBmaWxlIGRvZXMgbm90IGV4aXN0IGFyZSBpbnZhbGlkIHBhdGggaXRlbXMuXG4iCisgICAgICAgICAgICJUZXN0IGZvciBpbmNvbXBsZXRlIHdlYiBhZGRyZXNzIGZvciBoZWxwIGZpbGUgcGF0aC5cbiIKKyAgICAgICAgICAgIkEgdmFsaWQgZW50cnkgd2lsbCBiZSBwcmludGVkIHRvIHNoZWxsIHdpdGggWzBrXS5cbiIKKyAgICAgICAgICAgIltDYW5jZWxdIHdpbGwgcHJpbnQgTm9uZSB0byBzaGVsbCIsCisgICAgfQorCisjIFVwZGF0ZSBvbmNlIGlzc3VlMjE1MTkgaXMgcmVzb2x2ZWQuCitHZXRLZXlzRGlhbG9nX3NwZWMgPSB7CisgICAgJ2ZpbGUnOiAna2V5YmluZGluZ0RpYWxvZycsCisgICAgJ2t3ZHMnOiB7J3RpdGxlJzogJ1Rlc3Qga2V5YmluZGluZ3MnLAorICAgICAgICAgICAgICdhY3Rpb24nOiAnZmluZC1hZ2FpbicsCisgICAgICAgICAgICAgJ2N1cnJlbnRLZXlTZXF1ZW5jZXMnOiBbJyddICwKKyAgICAgICAgICAgICAnX2h0ZXN0JzogVHJ1ZSwKKyAgICAgICAgICAgICB9LAorICAgICdtc2cnOiAiVGVzdCBmb3IgZGlmZmVyZW50IGtleSBtb2RpZmllciBzZXF1ZW5jZXMuXG4iCisgICAgICAgICAgICI8bm90aGluZz4gaXMgaW52YWxpZC5cbiIKKyAgICAgICAgICAgIk5vIG1vZGlmaWVyIGtleSBpcyBpbnZhbGlkLlxuIgorICAgICAgICAgICAiU2hpZnQga2V5IHdpdGggW2Etel0sWzAtOV0sIGZ1bmN0aW9uIGtleSwgbW92ZSBrZXksIHRhYiwgc3BhY2UiCisgICAgICAgICAgICJpcyBpbnZhbGlkLlxuTm8gdmFsaWRpdGl0eSBjaGVja2luZyBpZiBhZHZhbmNlZCBrZXkgYmluZGluZyAiCisgICAgICAgICAgICJlbnRyeSBpcyB1c2VkLiIKKyAgICB9CisKK19ncmVwX2RpYWxvZ19zcGVjID0geworICAgICdmaWxlJzogJ0dyZXBEaWFsb2cnLAorICAgICdrd2RzJzoge30sCisgICAgJ21zZyc6ICJDbGljayB0aGUgJ1Nob3cgR3JlcERpYWxvZycgYnV0dG9uLlxuIgorICAgICAgICAgICAiVGVzdCB0aGUgdmFyaW91cyAnRmluZC1pbi1maWxlcycgZnVuY3Rpb25zLlxuIgorICAgICAgICAgICAiVGhlIHJlc3VsdHMgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiBhIG5ldyAnKk91dHB1dConIHdpbmRvdy5cbiIKKyAgICAgICAgICAgIidSaWdodC1jbGljayctPidHb3RvIGZpbGUvbGluZScgYW55d2hlcmUgaW4gdGhlIHNlYXJjaCByZXN1bHRzICIKKyAgICAgICAgICAgInNob3VsZCBvcGVuIHRoYXQgZmlsZSBcbmluIGEgbmV3IEVkaXRvcldpbmRvdy4iCisgICAgfQorCitfaGVscF9kaWFsb2dfc3BlYyA9IHsKKyAgICAnZmlsZSc6ICdFZGl0b3JXaW5kb3cnLAorICAgICdrd2RzJzoge30sCisgICAgJ21zZyc6ICJJZiB0aGUgaGVscCB0ZXh0IGRpc3BsYXlzLCB0aGlzIHdvcmtzLlxuIgorICAgICAgICAgICAiVGV4dCBpcyBzZWxlY3RhYmxlLiBXaW5kb3cgaXMgc2Nyb2xsYWJsZS4iCisgICAgfQorCitfaW9fYmluZGluZ19zcGVjID0geworICAgICdmaWxlJzogJ0lPQmluZGluZycsCisgICAgJ2t3ZHMnOiB7fSwKKyAgICAnbXNnJzogIlRlc3QgdGhlIGZvbGxvd2luZyBiaW5kaW5nc1xuIgorICAgICAgICAgICAiPENvbnRyb2wtbz4gdG8gZGlzcGxheSBvcGVuIHdpbmRvdyBmcm9tIGZpbGUgZGlhbG9nLlxuIgorICAgICAgICAgICAiPENvbnRyb2wtcz4gdG8gc2F2ZSB0aGUgZmlsZVxuIgorICAgIH0KKworX211bHRpX2NhbGxfc3BlYyA9IHsKKyAgICAnZmlsZSc6ICdNdWx0aUNhbGwnLAorICAgICdrd2RzJzoge30sCisgICAgJ21zZyc6ICJUaGUgZm9sbG93aW5nIGFjdGlvbnMgc2hvdWxkIHRyaWdnZXIgYSBwcmludCB0byBjb25zb2xlIG9yIElETEUiCisgICAgICAgICAgICIgU2hlbGwuXG5FbnRlcmluZyBhbmQgbGVhdmluZyB0aGUgdGV4dCBhcmVhLCBrZXkgZW50cnksICIKKyAgICAgICAgICAgIjxDb250cm9sLUtleT4sXG48QWx0LUtleS1hPiwgPENvbnRyb2wtS2V5LWE+LCAiCisgICAgICAgICAgICI8QWx0LUNvbnRyb2wtS2V5LWE+LCBcbjxDb250cm9sLUJ1dHRvbi0xPiwgPEFsdC1CdXR0b24tMT4gYW5kICIKKyAgICAgICAgICAgImZvY3VzaW5nIG91dCBvZiB0aGUgd2luZG93XG5hcmUgc2VxdWVuY2VzIHRvIGJlIHRlc3RlZC4iCisgICAgfQorCitfbXVsdGlzdGF0dXNfYmFyX3NwZWMgPSB7CisgICAgJ2ZpbGUnOiAnTXVsdGlTdGF0dXNCYXInLAorICAgICdrd2RzJzoge30sCisgICAgJ21zZyc6ICJFbnN1cmUgcHJlc2VuY2Ugb2YgbXVsdGktc3RhdHVzIGJhciBiZWxvdyB0ZXh0IGFyZWEuXG4iCisgICAgICAgICAgICJDbGljayAnVXBkYXRlIFN0YXR1cycgdG8gY2hhbmdlIHRoZSBtdWx0aS1zdGF0dXMgdGV4dCIKKyAgICB9CisKK19vYmplY3RfYnJvd3Nlcl9zcGVjID0geworICAgICdmaWxlJzogJ09iamVjdEJyb3dzZXInLAorICAgICdrd2RzJzoge30sCisgICAgJ21zZyc6ICJEb3VibGUgY2xpY2sgb24gaXRlbXMgdXB0byB0aGUgbG93ZXN0IGxldmVsLlxuIgorICAgICAgICAgICAiQXR0cmlidXRlcyBvZiB0aGUgb2JqZWN0cyBhbmQgcmVsYXRlZCBpbmZvcm1hdGlvbiAiCisgICAgICAgICAgICJ3aWxsIGJlIGRpc3BsYXllZCBzaWRlLWJ5LXNpZGUgYXQgZWFjaCBsZXZlbC4iCisgICAgfQorCitfcGF0aF9icm93c2VyX3NwZWMgPSB7CisgICAgJ2ZpbGUnOiAnUGF0aEJyb3dzZXInLAorICAgICdrd2RzJzoge30sCisgICAgJ21zZyc6ICJUZXN0IGZvciBjb3JyZWN0IGRpc3BsYXkgb2YgYWxsIHBhdGhzIGluIHN5cy5wYXRoLlxuIgorICAgICAgICAgICAiVG9nZ2xlIG5lc3RlZCBpdGVtcyB1cHRvIHRoZSBsb3dlc3QgbGV2ZWwuXG4iCisgICAgICAgICAgICJEb3VibGUgY2xpY2tpbmcgb24gYW4gaXRlbSBwcmludHMgYSB0cmFjZWJhY2tcbiIKKyAgICAgICAgICAgImZvciBhbiBleGNlcHRpb24gdGhhdCBpcyBpZ25vcmVkLiIKKyAgICB9CisKK19wZXJjb2xhdG9yX3NwZWMgPSB7CisgICAgJ2ZpbGUnOiAnUGVyY29sYXRvcicsCisgICAgJ2t3ZHMnOiB7fSwKKyAgICAnbXNnJzogIlRoZXJlIGFyZSB0d28gdHJhY2VycyB3aGljaCBjYW4gYmUgdG9nZ2xlZCB1c2luZyBhIGNoZWNrYm94LlxuIgorICAgICAgICAgICAiVG9nZ2xpbmcgYSB0cmFjZXIgJ29uJyBieSBjaGVja2luZyBpdCBzaG91bGQgcHJpbnQgdHJhY2VyIgorICAgICAgICAgICAib3V0cHV0IHRvIHRoZSBjb25zb2xlIG9yIHRvIHRoZSBJRExFIHNoZWxsLlxuIgorICAgICAgICAgICAiSWYgYm90aCB0aGUgdHJhY2VycyBhcmUgJ29uJywgdGhlIG91dHB1dCBmcm9tIHRoZSB0cmFjZXIgd2hpY2ggIgorICAgICAgICAgICAid2FzIHN3aXRjaGVkICdvbicgbGF0ZXIsIHNob3VsZCBiZSBwcmludGVkIGZpcnN0XG4iCisgICAgICAgICAgICJUZXN0IGZvciBhY3Rpb25zIGxpa2UgdGV4dCBlbnRyeSwgYW5kIHJlbW92YWwuIgorICAgIH0KKworX3JlcGxhY2VfZGlhbG9nX3NwZWMgPSB7CisgICAgJ2ZpbGUnOiAnUmVwbGFjZURpYWxvZycsCisgICAgJ2t3ZHMnOiB7fSwKKyAgICAnbXNnJzogIkNsaWNrIHRoZSAnUmVwbGFjZScgYnV0dG9uLlxuIgorICAgICAgICAgICAiVGVzdCB2YXJpb3VzIHJlcGxhY2Ugb3B0aW9ucyBpbiB0aGUgJ1JlcGxhY2UgZGlhbG9nJy5cbiIKKyAgICAgICAgICAgIkNsaWNrIFtDbG9zZV0gb3IgW1hdIHRvIGNsb3NlIHRoZSAnUmVwbGFjZSBEaWFsb2cnLiIKKyAgICB9CisKK19zZWFyY2hfZGlhbG9nX3NwZWMgPSB7CisgICAgJ2ZpbGUnOiAnU2VhcmNoRGlhbG9nJywKKyAgICAna3dkcyc6IHt9LAorICAgICdtc2cnOiAiQ2xpY2sgdGhlICdTZWFyY2gnIGJ1dHRvbi5cbiIKKyAgICAgICAgICAgIlRlc3QgdmFyaW91cyBzZWFyY2ggb3B0aW9ucyBpbiB0aGUgJ1NlYXJjaCBkaWFsb2cnLlxuIgorICAgICAgICAgICAiQ2xpY2sgW0Nsb3NlXSBvciBbWF0gdG8gY2xvc2UgdGhlICdTZWFyY2ggRGlhbG9nJy4iCisgICAgfQorCitfc2Nyb2xsZWRfbGlzdF9zcGVjID0geworICAgICdmaWxlJzogJ1Njcm9sbGVkTGlzdCcsCisgICAgJ2t3ZHMnOiB7fSwKKyAgICAnbXNnJzogIllvdSBzaG91bGQgc2VlIGEgc2Nyb2xsYWJsZSBsaXN0IG9mIGl0ZW1zXG4iCisgICAgICAgICAgICJTZWxlY3RpbmcgKGNsaWNraW5nKSBvciBkb3VibGUgY2xpY2tpbmcgYW4gaXRlbSAiCisgICAgICAgICAgICJwcmludHMgdGhlIG5hbWUgdG8gdGhlIGNvbnNvbGUgb3IgSWRsZSBzaGVsbC5cbiIKKyAgICAgICAgICAgIlJpZ2h0IGNsaWNraW5nIGFuIGl0ZW0gd2lsbCBkaXNwbGF5IGEgcG9wdXAuIgorICAgIH0KKworX3N0YWNrX3ZpZXdlcl9zcGVjID0geworICAgICdmaWxlJzogJ1N0YWNrVmlld2VyJywKKyAgICAna3dkcyc6IHt9LAorICAgICdtc2cnOiAiQSBzdGFja3RyYWNlIGZvciBhIE5hbWVFcnJvciBleGNlcHRpb24uXG4iCisgICAgICAgICAgICJFeHBhbmQgJ2lkbGVsaWIgLi4uJyBhbmQgJzxsb2NhbHM+Jy5cbiIKKyAgICAgICAgICAgIkNoZWNrIHRoYXQgZXhjX3ZhbHVlLCBleGNfdGIsIGFuZCBleGNfdHlwZSBhcmUgY29ycmVjdC5cbiIKKyAgICB9CisKK190YWJiZWRfcGFnZXNfc3BlYyA9IHsKKyAgICAnZmlsZSc6ICd0YWJiZWRwYWdlcycsCisgICAgJ2t3ZHMnOiB7fSwKKyAgICAnbXNnJzogIlRvZ2dsZSBiZXR3ZWVuIHRoZSB0d28gdGFicyAnZm9vJyBhbmQgJ2JhcidcbiIKKyAgICAgICAgICAgIkFkZCBhIHRhYiBieSBlbnRlcmluZyBhIHN1aXRhYmxlIG5hbWUgZm9yIGl0LlxuIgorICAgICAgICAgICAiUmVtb3ZlIGFuIGV4aXN0aW5nIHRhYiBieSBlbnRlcmluZyBpdHMgbmFtZS5cbiIKKyAgICAgICAgICAgIlJlbW92ZSBhbGwgZXhpc3RpbmcgdGFicy5cbiIKKyAgICAgICAgICAgIjxub3RoaW5nPiBpcyBhbiBpbnZhbGlkIGFkZCBwYWdlIGFuZCByZW1vdmUgcGFnZSBuYW1lLlxuIgorICAgIH0KKworVGV4dFZpZXdlcl9zcGVjID0geworICAgICdmaWxlJzogJ3RleHRWaWV3JywKKyAgICAna3dkcyc6IHsndGl0bGUnOiAnVGVzdCB0ZXh0VmlldycsCisgICAgICAgICAgICAgJ3RleHQnOidUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9nLlxuJyozNSwKKyAgICAgICAgICAgICAnX2h0ZXN0JzogVHJ1ZX0sCisgICAgJ21zZyc6ICJUZXN0IGZvciByZWFkLW9ubHkgcHJvcGVydHkgb2YgdGV4dC5cbiIKKyAgICAgICAgICAgIlRleHQgaXMgc2VsZWN0YWJsZS4gV2luZG93IGlzIHNjcm9sbGFibGUuIiwKKyAgICAgfQorCitfdG9vbHRpcF9zcGVjID0geworICAgICdmaWxlJzogJ1Rvb2xUaXAnLAorICAgICdrd2RzJzoge30sCisgICAgJ21zZyc6ICJQbGFjZSBtb3VzZSBjdXJzb3Igb3ZlciBib3RoIHRoZSBidXR0b25zXG4iCisgICAgICAgICAgICJBIHRvb2x0aXAgc2hvdWxkIGFwcGVhciB3aXRoIHNvbWUgdGV4dC4iCisgICAgfQorCitfdHJlZV93aWRnZXRfc3BlYyA9IHsKKyAgICAnZmlsZSc6ICdUcmVlV2lkZ2V0JywKKyAgICAna3dkcyc6IHt9LAorICAgICdtc2cnOiAiVGhlIGNhbnZhcyBpcyBzY3JvbGxhYmxlLlxuIgorICAgICAgICAgICAiQ2xpY2sgb24gZm9sZGVycyB1cHRvIHRvIHRoZSBsb3dlc3QgbGV2ZWwuIgorICAgIH0KKworX3VuZG9fZGVsZWdhdG9yX3NwZWMgPSB7CisgICAgJ2ZpbGUnOiAnVW5kb0RlbGVnYXRvcicsCisgICAgJ2t3ZHMnOiB7fSwKKyAgICAnbXNnJzogIkNsaWNrIFtVbmRvXSB0byB1bmRvIGFueSBhY3Rpb24uXG4iCisgICAgICAgICAgICJDbGljayBbUmVkb10gdG8gcmVkbyBhbnkgYWN0aW9uLlxuIgorICAgICAgICAgICAiQ2xpY2sgW0R1bXBdIHRvIGR1bXAgdGhlIGN1cnJlbnQgc3RhdGUgIgorICAgICAgICAgICAiYnkgcHJpbnRpbmcgdG8gdGhlIGNvbnNvbGUgb3IgdGhlIElETEUgc2hlbGwuXG4iCisgICAgfQorCitfd2lkZ2V0X3JlZGlyZWN0b3Jfc3BlYyA9IHsKKyAgICAnZmlsZSc6ICdXaWRnZXRSZWRpcmVjdG9yJywKKyAgICAna3dkcyc6IHt9LAorICAgICdtc2cnOiAiRXZlcnkgdGV4dCBpbnNlcnQgc2hvdWxkIGJlIHByaW50ZWQgdG8gdGhlIGNvbnNvbGUuIgorICAgICAgICAgICAib3IgdGhlIElETEUgc2hlbGwuIgorICAgIH0KKworZGVmIHJ1bigqdGVzdHMpOgorICAgIHJvb3QgPSB0ay5UaygpCisgICAgcm9vdC50aXRsZSgnSURMRSBodGVzdCcpCisgICAgcm9vdC5yZXNpemFibGUoMCwgMCkKKyAgICBfaW5pdGlhbGl6ZVRrVmFyaWFudFRlc3RzKHJvb3QpCisKKyAgICAjIGEgc2Nyb2xsYWJsZSBMYWJlbCBsaWtlIGNvbnN0YW50IHdpZHRoIHRleHQgd2lkZ2V0LgorICAgIGZyYW1lTGFiZWwgPSB0ay5GcmFtZShyb290LCBwYWR4PTEwKQorICAgIGZyYW1lTGFiZWwucGFjaygpCisgICAgdGV4dCA9IHRrLlRleHQoZnJhbWVMYWJlbCwgd3JhcD0nd29yZCcpCisgICAgdGV4dC5jb25maWd1cmUoYmc9cm9vdC5jZ2V0KCdiZycpLCByZWxpZWY9J2ZsYXQnLCBoZWlnaHQ9NCwgd2lkdGg9NzApCisgICAgc2Nyb2xsYmFyID0gdGsuU2Nyb2xsYmFyKGZyYW1lTGFiZWwsIGNvbW1hbmQ9dGV4dC55dmlldykKKyAgICB0ZXh0LmNvbmZpZyh5c2Nyb2xsY29tbWFuZD1zY3JvbGxiYXIuc2V0KQorICAgIHNjcm9sbGJhci5wYWNrKHNpZGU9J3JpZ2h0JywgZmlsbD0neScsIGV4cGFuZD1GYWxzZSkKKyAgICB0ZXh0LnBhY2soc2lkZT0nbGVmdCcsIGZpbGw9J2JvdGgnLCBleHBhbmQ9VHJ1ZSkKKworICAgIHRlc3RfbGlzdCA9IFtdICMgTGlzdCBvZiB0dXBsZXMgb2YgdGhlIGZvcm0gKHNwZWMsIGNhbGxhYmxlIHdpZGdldCkKKyAgICBpZiB0ZXN0czoKKyAgICAgICAgZm9yIHRlc3QgaW4gdGVzdHM6CisgICAgICAgICAgICB0ZXN0X3NwZWMgPSBnbG9iYWxzKClbdGVzdC5fX25hbWVfXyArICdfc3BlYyddCisgICAgICAgICAgICB0ZXN0X3NwZWNbJ25hbWUnXSA9IHRlc3QuX19uYW1lX18KKyAgICAgICAgICAgIHRlc3RfbGlzdC5hcHBlbmQoKHRlc3Rfc3BlYywgIHRlc3QpKQorICAgIGVsc2U6CisgICAgICAgIGZvciBrLCBkIGluIGdsb2JhbHMoKS5pdGVtcygpOgorICAgICAgICAgICAgaWYgay5lbmRzd2l0aCgnX3NwZWMnKToKKyAgICAgICAgICAgICAgICB0ZXN0X25hbWUgPSBrWzotNV0KKyAgICAgICAgICAgICAgICB0ZXN0X3NwZWMgPSBkCisgICAgICAgICAgICAgICAgdGVzdF9zcGVjWyduYW1lJ10gPSB0ZXN0X25hbWUKKyAgICAgICAgICAgICAgICBtb2QgPSBpbXBvcnRfbW9kdWxlKCdpZGxlbGliLicgKyB0ZXN0X3NwZWNbJ2ZpbGUnXSkKKyAgICAgICAgICAgICAgICB0ZXN0ID0gZ2V0YXR0cihtb2QsIHRlc3RfbmFtZSkKKyAgICAgICAgICAgICAgICB0ZXN0X2xpc3QuYXBwZW5kKCh0ZXN0X3NwZWMsIHRlc3QpKQorCisgICAgdGVzdF9uYW1lID0gW3RrLlN0cmluZ1ZhcignJyldCisgICAgY2FsbGFibGVfb2JqZWN0ID0gW05vbmVdCisgICAgdGVzdF9rd2RzID0gW05vbmVdCisKKworICAgIGRlZiBuZXh0KCk6CisgICAgICAgIGlmIGxlbih0ZXN0X2xpc3QpID09IDE6CisgICAgICAgICAgICBuZXh0X2J1dHRvbi5wYWNrX2ZvcmdldCgpCisgICAgICAgIHRlc3Rfc3BlYywgY2FsbGFibGVfb2JqZWN0WzBdID0gdGVzdF9saXN0LnBvcCgpCisgICAgICAgIHRlc3Rfa3dkc1swXSA9IHRlc3Rfc3BlY1sna3dkcyddCisgICAgICAgIHRlc3Rfa3dkc1swXVsncGFyZW50J10gPSByb290CisgICAgICAgIHRlc3RfbmFtZVswXS5zZXQoJ1Rlc3QgJyArIHRlc3Rfc3BlY1snbmFtZSddKQorCisgICAgICAgIHRleHQuY29uZmlndXJlKHN0YXRlPSdub3JtYWwnKSAjIGVuYWJsZSB0ZXh0IGVkaXRpbmcKKyAgICAgICAgdGV4dC5kZWxldGUoJzEuMCcsJ2VuZCcpCisgICAgICAgIHRleHQuaW5zZXJ0KCIxLjAiLHRlc3Rfc3BlY1snbXNnJ10pCisgICAgICAgIHRleHQuY29uZmlndXJlKHN0YXRlPSdkaXNhYmxlZCcpICMgcHJlc2VydmUgcmVhZC1vbmx5IHByb3BlcnR5CisKKyAgICBkZWYgcnVuX3Rlc3QoKToKKyAgICAgICAgd2lkZ2V0ID0gY2FsbGFibGVfb2JqZWN0WzBdKCoqdGVzdF9rd2RzWzBdKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwcmludCh3aWRnZXQucmVzdWx0KQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBidXR0b24gPSB0ay5CdXR0b24ocm9vdCwgdGV4dHZhcmlhYmxlPXRlc3RfbmFtZVswXSwgY29tbWFuZD1ydW5fdGVzdCkKKyAgICBidXR0b24ucGFjaygpCisgICAgbmV4dF9idXR0b24gPSB0ay5CdXR0b24ocm9vdCwgdGV4dD0iTmV4dCIsIGNvbW1hbmQ9bmV4dCkKKyAgICBuZXh0X2J1dHRvbi5wYWNrKCkKKworICAgIG5leHQoKQorCisgICAgcm9vdC5tYWlubG9vcCgpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgcnVuKCkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC9tb2NrX2lkbGUucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvbW9ja19pZGxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMDlmODMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvbW9ja19pZGxlLnB5CkBAIC0wLDAgKzEsNTUgQEAKKycnJ01vY2sgY2xhc3NlcyB0aGF0IGltaXRhdGUgaWRsZWxpYiBtb2R1bGVzIG9yIGNsYXNzZXMuCisKK0F0dHJpYnV0ZXMgYW5kIG1ldGhvZHMgd2lsbCBiZSBhZGRlZCBhcyBuZWVkZWQgZm9yIHRlc3RzLgorJycnCisKK2Zyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgVGV4dAorCitjbGFzcyBGdW5jKG9iamVjdCk6CisgICAgJycnTW9jayBmdW5jdGlvbiBjYXB0dXJlcyBhcmdzIGFuZCByZXR1cm5zIHJlc3VsdCBzZXQgYnkgdGVzdC4KKworICAgIEF0dHJpYnV0ZXM6CisgICAgc2VsZi5jYWxsZWQgLSByZWNvcmRzIGNhbGwgZXZlbiBpZiBubyBhcmdzLCBrd2RzIHBhc3NlZC4KKyAgICBzZWxmLnJlc3VsdCAtIHNldCBieSBpbml0LCByZXR1cm5lZCBieSBjYWxsLgorICAgIHNlbGYuYXJncyAtIGNhcHR1cmVzIHBvc2l0aW9uYWwgYXJndW1lbnRzLgorICAgIHNlbGYua3dkcyAtIGNhcHR1cmVzIGtleXdvcmQgYXJndW1lbnRzLgorCisgICAgTW9zdCBjb21tb24gdXNlIHdpbGwgcHJvYmFibHkgYmUgdG8gbW9jayBtZXRob2RzLgorICAgIE1vY2tfdGsuVmFyIGFuZCBNYm94X2Z1bmMgYXJlIHNwZWNpYWwgdmFyaWFudHMgb2YgdGhpcy4KKyAgICAnJycKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcmVzdWx0PU5vbmUpOgorICAgICAgICBzZWxmLmNhbGxlZCA9IEZhbHNlCisgICAgICAgIHNlbGYucmVzdWx0ID0gcmVzdWx0CisgICAgICAgIHNlbGYuYXJncyA9IE5vbmUKKyAgICAgICAgc2VsZi5rd2RzID0gTm9uZQorICAgIGRlZiBfX2NhbGxfXyhzZWxmLCAqYXJncywgKiprd2RzKToKKyAgICAgICAgc2VsZi5jYWxsZWQgPSBUcnVlCisgICAgICAgIHNlbGYuYXJncyA9IGFyZ3MKKyAgICAgICAgc2VsZi5rd2RzID0ga3dkcworICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYucmVzdWx0LCBCYXNlRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHJhaXNlIHNlbGYucmVzdWx0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5yZXN1bHQKKworCitjbGFzcyBFZGl0b3Iob2JqZWN0KToKKyAgICAnJydNaW5pbWFsbHkgaW1pdGF0ZSBFZGl0b3JXaW5kb3cuRWRpdG9yV2luZG93IGNsYXNzLgorICAgICcnJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmbGlzdD1Ob25lLCBmaWxlbmFtZT1Ob25lLCBrZXk9Tm9uZSwgcm9vdD1Ob25lKToKKyAgICAgICAgc2VsZi50ZXh0ID0gVGV4dCgpCisgICAgICAgIHNlbGYudW5kbyA9IFVuZG9EZWxlZ2F0b3IoKQorCisgICAgZGVmIGdldF9zZWxlY3Rpb25faW5kaWNlcyhzZWxmKToKKyAgICAgICAgZmlyc3QgPSBzZWxmLnRleHQuaW5kZXgoJzEuMCcpCisgICAgICAgIGxhc3QgPSBzZWxmLnRleHQuaW5kZXgoJ2VuZCcpCisgICAgICAgIHJldHVybiBmaXJzdCwgbGFzdAorCisKK2NsYXNzIFVuZG9EZWxlZ2F0b3Iob2JqZWN0KToKKyAgICAnJydNaW5pbWFsbHkgaW1pdGF0ZSBVbmRvRGVsZWdhdG9yLFVuZG9EZWxlZ2F0b3IgY2xhc3MuCisgICAgJycnCisgICAgIyBBIHJlYWwgdW5kbyBibG9jayBpcyBvbmx5IG5lZWRlZCBmb3IgdXNlciBpbnRlcmFjdGlvbi4KKyAgICBkZWYgdW5kb19ibG9ja19zdGFydCgqYXJncyk6CisgICAgICAgIHBhc3MKKyAgICBkZWYgdW5kb19ibG9ja19zdG9wKCphcmdzKToKKyAgICAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L21vY2tfdGsucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvbW9ja190ay5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTJlYTFhCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L21vY2tfdGsucHkKQEAgLTAsMCArMSwyOTggQEAKKyIiIkNsYXNzZXMgdGhhdCByZXBsYWNlIHRraW50ZXIgZ3VpIG9iamVjdHMgdXNlZCBieSBhbiBvYmplY3QgYmVpbmcgdGVzdGVkLgorCitBIGd1aSBvYmplY3QgaXMgYW55dGhpbmcgd2l0aCBhIG1hc3RlciBvciBwYXJlbnQgcGFyYW1lbnRlciwgd2hpY2ggaXMKK3R5cGljYWxseSByZXF1aXJlZCBpbiBzcGl0ZSBvZiB3aGF0IHRoZSBkb2Mgc3RyaW5ncyBzYXkuCisiIiIKKworY2xhc3MgRXZlbnQob2JqZWN0KToKKyAgICAnJydNaW5pbWFsIG1vY2sgd2l0aCBhdHRyaWJ1dGVzIGZvciB0ZXN0aW5nIGV2ZW50IGhhbmRsZXJzLgorCisgICAgVGhpcyBpcyBub3QgYSBndWkgb2JqZWN0LCBidXQgaXMgdXNlZCBhcyBhbiBhcmd1bWVudCBmb3IgY2FsbGJhY2tzCisgICAgdGhhdCBhY2Nlc3MgYXR0cmlidXRlcyBvZiB0aGUgZXZlbnQgcGFzc2VkLiBJZiBhIGNhbGxiYWNrIGlnbm9yZXMKKyAgICB0aGUgZXZlbnQsIG90aGVyIHRoYW4gdGhlIGZhY3QgdGhhdCBpcyBoYXBwZW5lZCwgcGFzcyAnZXZlbnQnLgorCisgICAgS2V5Ym9hcmQsIG1vdXNlLCB3aW5kb3csIGFuZCBvdGhlciBzb3VyY2VzIGdlbmVyYXRlIEV2ZW50IGluc3RhbmNlcy4KKyAgICBFdmVudCBpbnN0YW5jZXMgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6IHNlcmlhbCAobnVtYmVyIG9mCisgICAgZXZlbnQpLCB0aW1lIChvZiBldmVudCksIHR5cGUgKG9mIGV2ZW50IGFzIG51bWJlciksIHdpZGdldCAoaW4gd2hpY2gKKyAgICBldmVudCBvY2N1cnJlZCksIGFuZCB4LHkgKHBvc2l0aW9uIG9mIG1vdXNlKS4gVGhlcmUgYXJlIG90aGVyCisgICAgYXR0cmlidXRlcyBmb3Igc3BlY2lmaWMgZXZlbnRzLCBzdWNoIGFzIGtleWNvZGUgZm9yIGtleSBldmVudHMuCisgICAgdGtpbnRlci5FdmVudC5fX2RvY19fIGhhcyBtb3JlIGJ1dCBpcyBzdGlsbCBub3QgY29tcGxldGUuCisgICAgJycnCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICoqa3dkcyk6CisgICAgICAgICJDcmVhdGUgZXZlbnQgd2l0aCBhdHRyaWJ1dGVzIG5lZWRlZCBmb3IgdGVzdCIKKyAgICAgICAgc2VsZi5fX2RpY3RfXy51cGRhdGUoa3dkcykKKworY2xhc3MgVmFyKG9iamVjdCk6CisgICAgIlVzZSBmb3IgU3RyaW5nL0ludC9Cb29sZWFuVmFyOiBpbmNvbXBsZXRlIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgdmFsdWU9Tm9uZSwgbmFtZT1Ob25lKToKKyAgICAgICAgc2VsZi5tYXN0ZXIgPSBtYXN0ZXIKKyAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICBkZWYgc2V0KHNlbGYsIHZhbHVlKToKKyAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgZGVmIGdldChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUKKworY2xhc3MgTWJveF9mdW5jKG9iamVjdCk6CisgICAgIiIiR2VuZXJpYyBtb2NrIGZvciBtZXNzYWdlYm94IGZ1bmN0aW9ucywgd2hpY2ggYWxsIGhhdmUgdGhlIHNhbWUgc2lnbmF0dXJlLgorCisgICAgSW5zdGVhZCBvZiBkaXNwbGF5aW5nIGEgbWVzc2FnZSBib3gsIHRoZSBtb2NrJ3MgY2FsbCBtZXRob2Qgc2F2ZXMgdGhlCisgICAgYXJndW1lbnRzIGFzIGluc3RhbmNlIGF0dHJpYnV0ZXMsIHdoaWNoIHRlc3QgZnVuY3Rpb25zIGNhbiB0aGVuIGV4YW1pbWUuCisgICAgVGhlIHRlc3QgY2FuIHNldCB0aGUgcmVzdWx0IHJldHVybmVkIHRvIGFzayBmdW5jdGlvbgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXN1bHQ9Tm9uZSk6CisgICAgICAgIHNlbGYucmVzdWx0ID0gcmVzdWx0ICAjIFJldHVybiBOb25lIGZvciBhbGwgc2hvdyBmdW5jcworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCB0aXRsZSwgbWVzc2FnZSwgKmFyZ3MsICoqa3dkcyk6CisgICAgICAgICMgU2F2ZSBhbGwgYXJncyBmb3IgcG9zc2libGUgZXhhbWluYXRpb24gYnkgdGVzdGVyCisgICAgICAgIHNlbGYudGl0bGUgPSB0aXRsZQorICAgICAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCisgICAgICAgIHNlbGYuYXJncyA9IGFyZ3MKKyAgICAgICAgc2VsZi5rd2RzID0ga3dkcworICAgICAgICByZXR1cm4gc2VsZi5yZXN1bHQgICMgU2V0IGJ5IHRlc3RlciBmb3IgYXNrIGZ1bmN0aW9ucworCitjbGFzcyBNYm94KG9iamVjdCk6CisgICAgIiIiTW9jayBmb3IgdGtpbnRlci5tZXNzYWdlYm94IHdpdGggYW4gTWJveF9mdW5jIGZvciBlYWNoIGZ1bmN0aW9uLgorCisgICAgVGhpcyBtb2R1bGUgd2FzICd0a01lc3NhZ2VCb3gnIGluIDIueDsgaGVuY2UgdGhlICdpbXBvcnQgYXMnIGluICAzLnguCisgICAgRXhhbXBsZSB1c2FnZSBpbiB0ZXN0X21vZHVsZS5weSBmb3IgdGVzdGluZyBmdW5jdGlvbnMgaW4gbW9kdWxlLnB5OgorICAgIC0tLQorZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX3RrIGltcG9ydCBNYm94CitpbXBvcnQgbW9kdWxlCisKK29yaWdfbWJveCA9IG1vZHVsZS50a01lc3NhZ2VCb3gKK3Nob3dlcnJvciA9IE1ib3guc2hvd2Vycm9yICAjIGV4YW1wbGUsIGZvciBhdHRyaWJ1dGUgYWNjZXNzIGluIHRlc3QgbWV0aG9kcworCitjbGFzcyBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIG1vZHVsZS50a01lc3NhZ2VCb3ggPSBNYm94CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICBtb2R1bGUudGtNZXNzYWdlQm94ID0gb3JpZ19tYm94CisgICAgLS0tCisgICAgRm9yICdhc2snIGZ1bmN0aW9ucywgc2V0IGZ1bmMucmVzdWx0IHJldHVybiB2YWx1ZSBiZWZvcmUgY2FsbGluZyB0aGUgbWV0aG9kCisgICAgdGhhdCB1c2VzIHRoZSBtZXNzYWdlIGZ1bmN0aW9uLiBXaGVuIHRrTWVzc2FnZUJveCBmdW5jdGlvbnMgYXJlIHRoZQorICAgIG9ubHkgZ3VpIGFsbHMgaW4gYSBtZXRob2QsIHRoaXMgcmVwbGFjZW1lbnQgbWFrZXMgdGhlIG1ldGhvZCBndWktZnJlZSwKKyAgICAiIiIKKyAgICBhc2tva2NhbmNlbCA9IE1ib3hfZnVuYygpICAgICAjIFRydWUgb3IgRmFsc2UKKyAgICBhc2txdWVzdGlvbiA9IE1ib3hfZnVuYygpICAgICAjICd5ZXMnIG9yICdubycKKyAgICBhc2tyZXRyeWNhbmNlbCA9IE1ib3hfZnVuYygpICAjIFRydWUgb3IgRmFsc2UKKyAgICBhc2t5ZXNubyA9IE1ib3hfZnVuYygpICAgICAgICAjIFRydWUgb3IgRmFsc2UKKyAgICBhc2t5ZXNub2NhbmNlbCA9IE1ib3hfZnVuYygpICAjIFRydWUsIEZhbHNlLCBvciBOb25lCisgICAgc2hvd2Vycm9yID0gTWJveF9mdW5jKCkgICAgIyBOb25lCisgICAgc2hvd2luZm8gPSBNYm94X2Z1bmMoKSAgICAgIyBOb25lCisgICAgc2hvd3dhcm5pbmcgPSBNYm94X2Z1bmMoKSAgIyBOb25lCisKK2Zyb20gX3RraW50ZXIgaW1wb3J0IFRjbEVycm9yCisKK2NsYXNzIFRleHQob2JqZWN0KToKKyAgICAiIiJBIHNlbWktZnVuY3Rpb25hbCBub24tZ3VpIHJlcGxhY2VtZW50IGZvciB0a2ludGVyLlRleHQgdGV4dCBlZGl0b3JzLgorCisgICAgVGhlIG1vY2sncyBkYXRhIG1vZGVsIGlzIHRoYXQgYSB0ZXh0IGlzIGEgbGlzdCBvZiBcbi10ZXJtaW5hdGVkIGxpbmVzLgorICAgIFRoZSBtb2NrIGFkZHMgYW4gZW1wdHkgc3RyaW5nIGF0ICB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0IHNvIHRoYXQgdGhlCisgICAgaW5kZXggb2YgYWN0dWFsIGxpbmVzIHN0YXJ0IGF0IDEsIGFzIHdpdGggVGsuIFRoZSBtZXRob2RzIG5ldmVyIHNlZSB0aGlzLgorICAgIFRrIGluaXRpYWxpemVzIGZpbGVzIHdpdGggYSB0ZXJtaW5hbCBcbiB0aGF0IGNhbm5vdCBiZSBkZWxldGVkLiBJdCBpcworICAgIGludmlzaWJsZSBpbiB0aGUgc2Vuc2UgdGhhdCBvbmUgY2Fubm90IG1vdmUgdGhlIGN1cnNvciBiZXlvbmQgaXQuCisKKyAgICBUaGlzIGNsYXNzIGlzIG9ubHkgdGVzdGVkIChhbmQgdmFsaWQpIHdpdGggc3RyaW5ncyBvZiBhc2NpaSBjaGFycy4KKyAgICBGb3IgdGVzdGluZywgd2UgYXJlIG5vdCBjb25jZXJuZWQgd2l0aCBUayBUZXh0J3MgdHJlYXRtZW50IG9mLAorICAgIGZvciBpbnN0YW5jZSwgMC13aWR0aCBjaGFyYWN0ZXJzIG9yIGNoYXJhY3RlciArIGFjY2VudC4KKyAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgJycnSW5pdGlhbGl6ZSBtb2NrLCBub24tZ3VpLCB0ZXh0LW9ubHkgVGV4dCB3aWRnZXQuCisKKyAgICAgICAgQXQgcHJlc2VudCwgYWxsIGFyZ3MgYXJlIGlnbm9yZWQuIEFsbW9zdCBhbGwgYWZmZWN0IHZpc3VhbCBiZWhhdmlvci4KKyAgICAgICAgVGhlcmUgYXJlIGp1c3QgYSBmZXcgVGV4dC1vbmx5IG9wdGlvbnMgdGhhdCBhZmZlY3QgdGV4dCBiZWhhdmlvci4KKyAgICAgICAgJycnCisgICAgICAgIHNlbGYuZGF0YSA9IFsnJywgJ1xuJ10KKworICAgIGRlZiBpbmRleChzZWxmLCBpbmRleCk6CisgICAgICAgICJSZXR1cm4gc3RyaW5nIHZlcnNpb24gb2YgaW5kZXggZGVjb2RlZCBhY2NvcmRpbmcgdG8gY3VycmVudCB0ZXh0LiIKKyAgICAgICAgcmV0dXJuICIlcy4lcyIgJSBzZWxmLl9kZWNvZGUoaW5kZXgsIGVuZGZsYWc9MSkKKworICAgIGRlZiBfZGVjb2RlKHNlbGYsIGluZGV4LCBlbmRmbGFnPTApOgorICAgICAgICAiIiJSZXR1cm4gYSAobGluZSwgY2hhcikgdHVwbGUgb2YgaW50IGluZGV4ZXMgaW50byBzZWxmLmRhdGEuCisKKyAgICAgICAgVGhpcyBpbXBsZW1lbnRzIC5pbmRleCB3aXRob3V0IGNvbnZlcnRpbmcgdGhlIHJlc3VsdCBiYWNrIHRvIGEgc3RyaW5nLgorICAgICAgICBUaGUgcmVzdWx0IGlzIGNvbnRyYWluZWQgYnkgdGhlIG51bWJlciBvZiBsaW5lcyBhbmQgbGluZWxlbmd0aHMgb2YKKyAgICAgICAgc2VsZi5kYXRhLiBGb3IgbWFueSBpbmRleGVzLCB0aGUgcmVzdWx0IGlzIGluaXRpYWxseSAoMSwgMCkuCisKKyAgICAgICAgVGhlIGlucHV0IGluZGV4IG1heSBoYXZlIGFueSBvZiBzZXZlcmFsIHBvc3NpYmxlIGZvcm1zOgorICAgICAgICAqIGxpbmUuY2hhciBmbG9hdDogY29udmVydGVkIHRvICdsaW5lLmNoYXInIHN0cmluZzsKKyAgICAgICAgKiAnbGluZS5jaGFyJyBzdHJpbmcsIHdoZXJlIGxpbmUgYW5kIGNoYXIgYXJlIGRlY2ltYWwgaW50ZWdlcnM7CisgICAgICAgICogJ2xpbmUuY2hhciBsaW5lZW5kJywgd2hlcmUgbGluZWVuZD0nbGluZWVuZCcgKGFuZCBjaGFyIGlzIGlnbm9yZWQpOworICAgICAgICAqICdsaW5lLmVuZCcsIHdoZXJlIGVuZD0nZW5kJyAoc2FtZSBhcyBhYm92ZSk7CisgICAgICAgICogJ2luc2VydCcsIHRoZSBwb3NpdGlvbnMgYmVmb3JlIHRlcm1pbmFsIFxuOworICAgICAgICAqICdlbmQnLCB3aG9zZSBtZWFuaW5nIGRlcGVuZHMgb24gdGhlIGVuZGZsYWcgcGFzc2VkIHRvIC5fZW5kZXguCisgICAgICAgICogJ3NlbC5maXJzdCcgb3IgJ3NlbC5sYXN0Jywgd2hlcmUgc2VsIGlzIGEgdGFnIC0tIG5vdCBpbXBsZW1lbnRlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2UoaW5kZXgsIChmbG9hdCwgYnl0ZXMpKToKKyAgICAgICAgICAgIGluZGV4ID0gc3RyKGluZGV4KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbmRleD1pbmRleC5sb3dlcigpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFRjbEVycm9yKCdiYWQgdGV4dCBpbmRleCAiJXMiJyAlIGluZGV4KQorCisgICAgICAgIGxhc3RsaW5lID0gIGxlbihzZWxmLmRhdGEpIC0gMSAgIyBzYW1lIGFzIG51bWJlciBvZiB0ZXh0IGxpbmVzCisgICAgICAgIGlmIGluZGV4ID09ICdpbnNlcnQnOgorICAgICAgICAgICAgcmV0dXJuIGxhc3RsaW5lLCBsZW4oc2VsZi5kYXRhW2xhc3RsaW5lXSkgLSAxCisgICAgICAgIGVsaWYgaW5kZXggPT0gJ2VuZCc6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZW5kZXgoZW5kZmxhZykKKworICAgICAgICBsaW5lLCBjaGFyID0gaW5kZXguc3BsaXQoJy4nKQorICAgICAgICBsaW5lID0gaW50KGxpbmUpCisKKyAgICAgICAgIyBPdXQgb2YgYm91bmRzIGxpbmUgYmVjb21lcyBmaXJzdCBvciBsYXN0ICgnZW5kJykgaW5kZXgKKyAgICAgICAgaWYgbGluZSA8IDE6CisgICAgICAgICAgICByZXR1cm4gMSwgMAorICAgICAgICBlbGlmIGxpbmUgPiBsYXN0bGluZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9lbmRleChlbmRmbGFnKQorCisgICAgICAgIGxpbmVsZW5ndGggPSBsZW4oc2VsZi5kYXRhW2xpbmVdKSAgLTEgICMgcG9zaXRpb24gYmVmb3JlL2F0IFxuCisgICAgICAgIGlmIGNoYXIuZW5kc3dpdGgoJyBsaW5lZW5kJykgb3IgY2hhciA9PSAnZW5kJzoKKyAgICAgICAgICAgIHJldHVybiBsaW5lLCBsaW5lbGVuZ3RoCisgICAgICAgICAgICAjIFRrIHJlcXVpcmVzIHRoYXQgaWdub3JlZCBjaGFycyBiZWZvcmUgJyBsaW5lZW5kJyBiZSB2YWxpZCBpbnQKKworICAgICAgICAjIE91dCBvZiBib3VuZHMgY2hhciBiZWNvbWVzIGZpcnN0IG9yIGxhc3QgaW5kZXggb2YgbGluZQorICAgICAgICBjaGFyID0gaW50KGNoYXIpCisgICAgICAgIGlmIGNoYXIgPCAwOgorICAgICAgICAgICAgY2hhciA9IDAKKyAgICAgICAgZWxpZiBjaGFyID4gbGluZWxlbmd0aDoKKyAgICAgICAgICAgIGNoYXIgPSBsaW5lbGVuZ3RoCisgICAgICAgIHJldHVybiBsaW5lLCBjaGFyCisKKyAgICBkZWYgX2VuZGV4KHNlbGYsIGVuZGZsYWcpOgorICAgICAgICAnJydSZXR1cm4gcG9zaXRpb24gZm9yICdlbmQnIG9yIGxpbmUgb3ZlcmZsb3cgY29ycmVzcG9uZGluZyB0byBlbmRmbGFnLgorCisgICAgICAgLTE6IHBvc2l0aW9uIGJlZm9yZSB0ZXJtaW5hbCBcbjsgZm9yIC5pbnNlcnQoKSwgLmRlbGV0ZQorICAgICAgIDA6IHBvc2l0aW9uIGFmdGVyIHRlcm1pbmFsIFxuOyBmb3IgLmdldCwgLmRlbGV0ZSBpbmRleCAxCisgICAgICAgMTogc2FtZSB2aWV3ZWQgYXMgYmVnaW5uaW5nIG9mIG5vbi1leGlzdGVudCBuZXh0IGxpbmUgKGZvciAuaW5kZXgpCisgICAgICAgJycnCisgICAgICAgIG4gPSBsZW4oc2VsZi5kYXRhKQorICAgICAgICBpZiBlbmRmbGFnID09IDE6CisgICAgICAgICAgICByZXR1cm4gbiwgMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbiAtPSAxCisgICAgICAgICAgICByZXR1cm4gbiwgbGVuKHNlbGYuZGF0YVtuXSkgKyBlbmRmbGFnCisKKworICAgIGRlZiBpbnNlcnQoc2VsZiwgaW5kZXgsIGNoYXJzKToKKyAgICAgICAgIkluc2VydCBjaGFycyBiZWZvcmUgdGhlIGNoYXJhY3RlciBhdCBpbmRleC4iCisKKyAgICAgICAgaWYgbm90IGNoYXJzOiAgIyAnJy5zcGxpdGxpbmVzKCkgaXMgW10sIG5vdCBbJyddCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgY2hhcnMgPSBjaGFycy5zcGxpdGxpbmVzKFRydWUpCisgICAgICAgIGlmIGNoYXJzWy0xXVstMV0gPT0gJ1xuJzoKKyAgICAgICAgICAgIGNoYXJzLmFwcGVuZCgnJykKKyAgICAgICAgbGluZSwgY2hhciA9IHNlbGYuX2RlY29kZShpbmRleCwgLTEpCisgICAgICAgIGJlZm9yZSA9IHNlbGYuZGF0YVtsaW5lXVs6Y2hhcl0KKyAgICAgICAgYWZ0ZXIgPSBzZWxmLmRhdGFbbGluZV1bY2hhcjpdCisgICAgICAgIHNlbGYuZGF0YVtsaW5lXSA9IGJlZm9yZSArIGNoYXJzWzBdCisgICAgICAgIHNlbGYuZGF0YVtsaW5lKzE6bGluZSsxXSA9IGNoYXJzWzE6XQorICAgICAgICBzZWxmLmRhdGFbbGluZStsZW4oY2hhcnMpLTFdICs9IGFmdGVyCisKKworICAgIGRlZiBnZXQoc2VsZiwgaW5kZXgxLCBpbmRleDI9Tm9uZSk6CisgICAgICAgICJSZXR1cm4gc2xpY2UgZnJvbSBpbmRleDEgdG8gaW5kZXgyIChkZWZhdWx0IGlzICdpbmRleDErMScpLiIKKworICAgICAgICBzdGFydGxpbmUsIHN0YXJ0Y2hhciA9IHNlbGYuX2RlY29kZShpbmRleDEpCisgICAgICAgIGlmIGluZGV4MiBpcyBOb25lOgorICAgICAgICAgICAgZW5kbGluZSwgZW5kY2hhciA9IHN0YXJ0bGluZSwgc3RhcnRjaGFyKzEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVuZGxpbmUsIGVuZGNoYXIgPSBzZWxmLl9kZWNvZGUoaW5kZXgyKQorCisgICAgICAgIGlmIHN0YXJ0bGluZSA9PSBlbmRsaW5lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVtzdGFydGxpbmVdW3N0YXJ0Y2hhcjplbmRjaGFyXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbGluZXMgPSBbc2VsZi5kYXRhW3N0YXJ0bGluZV1bc3RhcnRjaGFyOl1dCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzdGFydGxpbmUrMSwgZW5kbGluZSk6CisgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKHNlbGYuZGF0YVtpXSkKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZChzZWxmLmRhdGFbZW5kbGluZV1bOmVuZGNoYXJdKQorICAgICAgICAgICAgcmV0dXJuICcnLmpvaW4obGluZXMpCisKKworICAgIGRlZiBkZWxldGUoc2VsZiwgaW5kZXgxLCBpbmRleDI9Tm9uZSk6CisgICAgICAgICcnJ0RlbGV0ZSBzbGljZSBmcm9tIGluZGV4MSB0byBpbmRleDIgKGRlZmF1bHQgaXMgJ2luZGV4MSsxJykuCisKKyAgICAgICAgQWRqdXN0IGRlZmF1bHQgaW5kZXgyICgnaW5kZXgrMSkgZm9yIGxpbmUgZW5kcy4KKyAgICAgICAgRG8gbm90IGRlbGV0ZSB0aGUgdGVybWluYWwgXG4gYXQgdGhlIHZlcnkgZW5kIG9mIHNlbGYuZGF0YSAoWy0xXVstMV0pLgorICAgICAgICAnJycKKyAgICAgICAgc3RhcnRsaW5lLCBzdGFydGNoYXIgPSBzZWxmLl9kZWNvZGUoaW5kZXgxLCAtMSkKKyAgICAgICAgaWYgaW5kZXgyIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBzdGFydGNoYXIgPCBsZW4oc2VsZi5kYXRhW3N0YXJ0bGluZV0pLTE6CisgICAgICAgICAgICAgICAgIyBub3QgZGVsZXRpbmcgXG4KKyAgICAgICAgICAgICAgICBlbmRsaW5lLCBlbmRjaGFyID0gc3RhcnRsaW5lLCBzdGFydGNoYXIrMQorICAgICAgICAgICAgZWxpZiBzdGFydGxpbmUgPCBsZW4oc2VsZi5kYXRhKSAtIDE6CisgICAgICAgICAgICAgICAgIyBkZWxldGluZyBub24tdGVybWluYWwgXG4sIGNvbnZlcnQgJ2luZGV4MSsxIHRvIHN0YXJ0IG9mIG5leHQgbGluZQorICAgICAgICAgICAgICAgIGVuZGxpbmUsIGVuZGNoYXIgPSBzdGFydGxpbmUrMSwgMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIGRvIG5vdCBkZWxldGUgdGVybWluYWwgXG4gaWYgaW5kZXgxID09ICdpbnNlcnQnCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbmRsaW5lLCBlbmRjaGFyID0gc2VsZi5fZGVjb2RlKGluZGV4MiwgLTEpCisgICAgICAgICAgICAjIHJlc3RyaWN0aW5nIGVuZCBwb3NpdGlvbiB0byBpbnNlcnQgcG9zaXRpb24gZXhjbHVkZXMgdGVybWluYWwgXG4KKworICAgICAgICBpZiBzdGFydGxpbmUgPT0gZW5kbGluZSBhbmQgc3RhcnRjaGFyIDwgZW5kY2hhcjoKKyAgICAgICAgICAgIHNlbGYuZGF0YVtzdGFydGxpbmVdID0gc2VsZi5kYXRhW3N0YXJ0bGluZV1bOnN0YXJ0Y2hhcl0gKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGFbc3RhcnRsaW5lXVtlbmRjaGFyOl0KKyAgICAgICAgZWxpZiBzdGFydGxpbmUgPCBlbmRsaW5lOgorICAgICAgICAgICAgc2VsZi5kYXRhW3N0YXJ0bGluZV0gPSBzZWxmLmRhdGFbc3RhcnRsaW5lXVs6c3RhcnRjaGFyXSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhW2VuZGxpbmVdW2VuZGNoYXI6XQorICAgICAgICAgICAgc3RhcnRsaW5lICs9IDEKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0bGluZSwgZW5kbGluZSsxKToKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5kYXRhW3N0YXJ0bGluZV0KKworICAgIGRlZiBjb21wYXJlKHNlbGYsIGluZGV4MSwgb3AsIGluZGV4Mik6CisgICAgICAgIGxpbmUxLCBjaGFyMSA9IHNlbGYuX2RlY29kZShpbmRleDEpCisgICAgICAgIGxpbmUyLCBjaGFyMiA9IHNlbGYuX2RlY29kZShpbmRleDIpCisgICAgICAgIGlmIG9wID09ICc8JzoKKyAgICAgICAgICAgIHJldHVybiBsaW5lMSA8IGxpbmUyIG9yIGxpbmUxID09IGxpbmUyIGFuZCBjaGFyMSA8IGNoYXIyCisgICAgICAgIGVsaWYgb3AgPT0gJzw9JzoKKyAgICAgICAgICAgIHJldHVybiBsaW5lMSA8IGxpbmUyIG9yIGxpbmUxID09IGxpbmUyIGFuZCBjaGFyMSA8PSBjaGFyMgorICAgICAgICBlbGlmIG9wID09ICc+JzoKKyAgICAgICAgICAgIHJldHVybiBsaW5lMSA+IGxpbmUyIG9yIGxpbmUxID09IGxpbmUyIGFuZCBjaGFyMSA+IGNoYXIyCisgICAgICAgIGVsaWYgb3AgPT0gJz49JzoKKyAgICAgICAgICAgIHJldHVybiBsaW5lMSA+IGxpbmUyIG9yIGxpbmUxID09IGxpbmUyIGFuZCBjaGFyMSA+PSBjaGFyMgorICAgICAgICBlbGlmIG9wID09ICc9PSc6CisgICAgICAgICAgICByZXR1cm4gbGluZTEgPT0gbGluZTIgYW5kIGNoYXIxID09IGNoYXIyCisgICAgICAgIGVsaWYgb3AgPT0gJyE9JzoKKyAgICAgICAgICAgIHJldHVybiBsaW5lMSAhPSBsaW5lMiBvciAgY2hhcjEgIT0gY2hhcjIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFRjbEVycm9yKCcnJ2JhZCBjb21wYXJpc29uIG9wZXJhdG9yICIlcyI6JycnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycnbXVzdCBiZSA8LCA8PSwgPT0sID49LCA+LCBvciAhPScnJyAlIG9wKQorCisgICAgIyBUaGUgZm9sbG93aW5nIFRleHQgbWV0aG9kcyBub3JtYWxseSBkbyBzb21ldGhpbmcgYW5kIHJldHVybiBOb25lLgorICAgICMgV2hldGhlciBkb2luZyBub3RoaW5nIGlzIHN1ZmZpY2llbnQgZm9yIGEgdGVzdCB3aWxsIGRlcGVuZCBvbiB0aGUgdGVzdC4KKworICAgIGRlZiBtYXJrX3NldChzZWxmLCBuYW1lLCBpbmRleCk6CisgICAgICAgICJTZXQgbWFyayAqbmFtZSogYmVmb3JlIHRoZSBjaGFyYWN0ZXIgYXQgaW5kZXguIgorICAgICAgICBwYXNzCisKKyAgICBkZWYgbWFya191bnNldChzZWxmLCAqbWFya05hbWVzKToKKyAgICAgICAgIkRlbGV0ZSBhbGwgbWFya3MgaW4gbWFya05hbWVzLiIKKworICAgIGRlZiB0YWdfcmVtb3ZlKHNlbGYsIHRhZ05hbWUsIGluZGV4MSwgaW5kZXgyPU5vbmUpOgorICAgICAgICAiUmVtb3ZlIHRhZyB0YWdOYW1lIGZyb20gYWxsIGNoYXJhY3RlcnMgYmV0d2VlbiBpbmRleDEgYW5kIGluZGV4Mi4iCisgICAgICAgIHBhc3MKKworICAgICMgVGhlIGZvbGxvd2luZyBUZXh0IG1ldGhvZHMgYWZmZWN0IHRoZSBncmFwaGljcyBzY3JlZW4gYW5kIHJldHVybiBOb25lLgorICAgICMgRG9pbmcgbm90aGluZyBzaG91bGQgYWx3YXlzIGJlIHN1ZmZpY2llbnQgZm9yIHRlc3RzLgorCisgICAgZGVmIHNjYW5fZHJhZ3RvKHNlbGYsIHgsIHkpOgorICAgICAgICAiQWRqdXN0IHRoZSB2aWV3IG9mIHRoZSB0ZXh0IGFjY29yZGluZyB0byBzY2FuX21hcmsiCisKKyAgICBkZWYgc2Nhbl9tYXJrKHNlbGYsIHgsIHkpOgorICAgICAgICAiUmVtZW1iZXIgdGhlIGN1cnJlbnQgWCwgWSBjb29yZGluYXRlcy4iCisKKyAgICBkZWYgc2VlKHNlbGYsIGluZGV4KToKKyAgICAgICAgIlNjcm9sbCBzY3JlZW4gdG8gbWFrZSB0aGUgY2hhcmFjdGVyIGF0IElOREVYIGlzIHZpc2libGUuIgorICAgICAgICBwYXNzCisKKyAgICAjICBUaGUgZm9sbG93aW5nIGlzIGEgTWlzYyBtZXRob2QgaW5oZXJpdGVkIGJ5IFRleHQuCisgICAgIyBJdCBzaG91bGQgcHJvcGVybHkgZ28gaW4gYSBNaXNjIG1vY2ssIGJ1dCBpcyBpbmNsdWRlZCBoZXJlIGZvciBub3cuCisKKyAgICBkZWYgYmluZChzZXF1ZW5jZT1Ob25lLCBmdW5jPU5vbmUsIGFkZD1Ob25lKToKKyAgICAgICAgIkJpbmQgdG8gdGhpcyB3aWRnZXQgYXQgZXZlbnQgc2VxdWVuY2UgYSBjYWxsIHRvIGZ1bmN0aW9uIGZ1bmMuIgorICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9hdXRvY29tcGxldGUucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9hdXRvY29tcGxldGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU5ZDBlZAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2F1dG9jb21wbGV0ZS5weQpAQCAtMCwwICsxLDE0MyBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCByZXF1aXJlcworZnJvbSBUa2ludGVyIGltcG9ydCBUaywgVGV4dCwgVGNsRXJyb3IKKworaW1wb3J0IGlkbGVsaWIuQXV0b0NvbXBsZXRlIGFzIGFjCitpbXBvcnQgaWRsZWxpYi5BdXRvQ29tcGxldGVXaW5kb3cgYXMgYWN3CitpbXBvcnQgaWRsZWxpYi5tYWNvc3hTdXBwb3J0IGFzIG1hYworZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX2lkbGUgaW1wb3J0IEZ1bmMKK2Zyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgRXZlbnQKKworY2xhc3MgQXV0b0NvbXBsZXRlV2luZG93OgorICAgIGRlZiBjb21wbGV0ZSgpOgorICAgICAgICByZXR1cm4KKworY2xhc3MgRHVtbXlFZGl0d2luOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb290LCB0ZXh0KToKKyAgICAgICAgc2VsZi5yb290ID0gcm9vdAorICAgICAgICBzZWxmLnRleHQgPSB0ZXh0CisgICAgICAgIHNlbGYuaW5kZW50d2lkdGggPSA4CisgICAgICAgIHNlbGYudGFid2lkdGggPSA4CisgICAgICAgIHNlbGYuY29udGV4dF91c2VfcHMxID0gVHJ1ZQorCisKK2NsYXNzIEF1dG9Db21wbGV0ZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgcmVxdWlyZXMoJ2d1aScpCisgICAgICAgIGNscy5yb290ID0gVGsoKQorICAgICAgICBtYWMuc2V0dXBBcHAoY2xzLnJvb3QsIE5vbmUpCisgICAgICAgIGNscy50ZXh0ID0gVGV4dChjbHMucm9vdCkKKyAgICAgICAgY2xzLmVkaXRvciA9IER1bW15RWRpdHdpbihjbHMucm9vdCwgY2xzLnRleHQpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICBjbHMucm9vdC5kZXN0cm95KCkKKyAgICAgICAgZGVsIGNscy50ZXh0CisgICAgICAgIGRlbCBjbHMuZWRpdG9yCisgICAgICAgIGRlbCBjbHMucm9vdAorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmVkaXRvci50ZXh0LmRlbGV0ZSgnMS4wJywgJ2VuZCcpCisgICAgICAgIHNlbGYuYXV0b2NvbXBsZXRlID0gYWMuQXV0b0NvbXBsZXRlKHNlbGYuZWRpdG9yKQorCisgICAgZGVmIHRlc3RfaW5pdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmF1dG9jb21wbGV0ZS5lZGl0d2luLCBzZWxmLmVkaXRvcikKKworICAgIGRlZiB0ZXN0X21ha2VfYXV0b2NvbXBsZXRlX3dpbmRvdyhzZWxmKToKKyAgICAgICAgdGVzdHdpbiA9IHNlbGYuYXV0b2NvbXBsZXRlLl9tYWtlX2F1dG9jb21wbGV0ZV93aW5kb3coKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UodGVzdHdpbiwgYWN3LkF1dG9Db21wbGV0ZVdpbmRvdykKKworICAgIGRlZiB0ZXN0X3JlbW92ZV9hdXRvY29tcGxldGVfd2luZG93KHNlbGYpOgorICAgICAgICBzZWxmLmF1dG9jb21wbGV0ZS5hdXRvY29tcGxldGV3aW5kb3cgPSAoCisgICAgICAgICAgICBzZWxmLmF1dG9jb21wbGV0ZS5fbWFrZV9hdXRvY29tcGxldGVfd2luZG93KCkpCisgICAgICAgIHNlbGYuYXV0b2NvbXBsZXRlLl9yZW1vdmVfYXV0b2NvbXBsZXRlX3dpbmRvdygpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNlbGYuYXV0b2NvbXBsZXRlLmF1dG9jb21wbGV0ZXdpbmRvdykKKworICAgIGRlZiB0ZXN0X2ZvcmNlX29wZW5fY29tcGxldGlvbnNfZXZlbnQoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IGZvcmNlX29wZW5fY29tcGxldGlvbnNfZXZlbnQgY2FsbHMgX29wZW5fY29tcGxldGlvbnMKKyAgICAgICAgb19jcyA9IEZ1bmMoKQorICAgICAgICBzZWxmLmF1dG9jb21wbGV0ZS5vcGVuX2NvbXBsZXRpb25zID0gb19jcworICAgICAgICBzZWxmLmF1dG9jb21wbGV0ZS5mb3JjZV9vcGVuX2NvbXBsZXRpb25zX2V2ZW50KCdldmVudCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob19jcy5hcmdzLCAoVHJ1ZSwgRmFsc2UsIFRydWUpKQorCisgICAgZGVmIHRlc3RfdHJ5X29wZW5fY29tcGxldGlvbnNfZXZlbnQoc2VsZik6CisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBhdXRvY29tcGxldGUgPSBzZWxmLmF1dG9jb21wbGV0ZQorICAgICAgICB0cnljb21wbGV0aW9ucyA9IHNlbGYuYXV0b2NvbXBsZXRlLnRyeV9vcGVuX2NvbXBsZXRpb25zX2V2ZW50CisgICAgICAgIG9fY19sID0gRnVuYygpCisgICAgICAgIGF1dG9jb21wbGV0ZS5fb3Blbl9jb21wbGV0aW9uc19sYXRlciA9IG9fY19sCisKKyAgICAgICAgIyBfb3Blbl9jb21wbGV0aW9uc19sYXRlciBzaG91bGQgbm90IGJlIGNhbGxlZCB3aXRoIG5vIHRleHQgaW4gZWRpdG9yCisgICAgICAgIHRyeWNvbXBsZXRpb25zKCdldmVudCcpCisgICAgICAgIEVxdWFsKG9fY19sLmFyZ3MsIE5vbmUpCisKKyAgICAgICAgIyBfb3Blbl9jb21wbGV0aW9uc19sYXRlciBzaG91bGQgYmUgY2FsbGVkIHdpdGggQ09NUExFVEVfQVRUUklCVVRFUyAoMSkKKyAgICAgICAgc2VsZi50ZXh0Lmluc2VydCgnMS4wJywgJ3JlLicpCisgICAgICAgIHRyeWNvbXBsZXRpb25zKCdldmVudCcpCisgICAgICAgIEVxdWFsKG9fY19sLmFyZ3MsIChGYWxzZSwgRmFsc2UsIEZhbHNlLCAxKSkKKworICAgICAgICAjIF9vcGVuX2NvbXBsZXRpb25zX2xhdGVyIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBDT01QTEVURV9GSUxFUyAoMikKKyAgICAgICAgc2VsZi50ZXh0LmRlbGV0ZSgnMS4wJywgJ2VuZCcpCisgICAgICAgIHNlbGYudGV4dC5pbnNlcnQoJzEuMCcsICciLi9MaWIvJykKKyAgICAgICAgdHJ5Y29tcGxldGlvbnMoJ2V2ZW50JykKKyAgICAgICAgRXF1YWwob19jX2wuYXJncywgKEZhbHNlLCBGYWxzZSwgRmFsc2UsIDIpKQorCisgICAgZGVmIHRlc3RfYXV0b2NvbXBsZXRlX2V2ZW50KHNlbGYpOgorICAgICAgICBFcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgYXV0b2NvbXBsZXRlID0gc2VsZi5hdXRvY29tcGxldGUKKworICAgICAgICAjIFRlc3QgdGhhdCB0aGUgYXV0b2NvbXBsZXRlIGV2ZW50IGlzIGlnbm9yZWQgaWYgdXNlciBpcyBwcmVzc2luZyBhCisgICAgICAgICMgbW9kaWZpZXIga2V5IGluIGFkZGl0aW9uIHRvIHRoZSB0YWIga2V5CisgICAgICAgIGV2ID0gRXZlbnQobWNfc3RhdGU9VHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoYXV0b2NvbXBsZXRlLmF1dG9jb21wbGV0ZV9ldmVudChldikpCisgICAgICAgIGRlbCBldi5tY19zdGF0ZQorCisgICAgICAgICMgSWYgYXV0b2NvbXBsZXRlIHdpbmRvdyBpcyBvcGVuLCBjb21wbGV0ZSgpIG1ldGhvZCBpcyBjYWxsZWQKKyAgICAgICAgdGVzdHdpbiA9IHNlbGYuYXV0b2NvbXBsZXRlLl9tYWtlX2F1dG9jb21wbGV0ZV93aW5kb3coKQorICAgICAgICBzZWxmLnRleHQuaW5zZXJ0KCcxLjAnLCAncmUuJykKKyAgICAgICAgRXF1YWwoc2VsZi5hdXRvY29tcGxldGUuYXV0b2NvbXBsZXRlX2V2ZW50KGV2KSwgJ2JyZWFrJykKKworICAgICAgICAjIElmIGF1dG9jb21wbGV0ZSB3aW5kb3cgaXMgbm90IGFjdGl2ZSBvciBkb2VzIG5vdCBleGlzdCwKKyAgICAgICAgIyBvcGVuX2NvbXBsZXRpb25zIGlzIGNhbGxlZC4gUmV0dXJuIGRlcGVuZHMgb24gaXRzIHJldHVybi4KKyAgICAgICAgYXV0b2NvbXBsZXRlLl9yZW1vdmVfYXV0b2NvbXBsZXRlX3dpbmRvdygpCisgICAgICAgIG9fY3MgPSBGdW5jKCkgICMgLnJlc3VsdCA9IE5vbmUKKyAgICAgICAgYXV0b2NvbXBsZXRlLm9wZW5fY29tcGxldGlvbnMgPSBvX2NzCisgICAgICAgIEVxdWFsKHNlbGYuYXV0b2NvbXBsZXRlLmF1dG9jb21wbGV0ZV9ldmVudChldiksIE5vbmUpCisgICAgICAgIEVxdWFsKG9fY3MuYXJncywgKEZhbHNlLCBUcnVlLCBUcnVlKSkKKyAgICAgICAgb19jcy5yZXN1bHQgPSBUcnVlCisgICAgICAgIEVxdWFsKHNlbGYuYXV0b2NvbXBsZXRlLmF1dG9jb21wbGV0ZV9ldmVudChldiksICdicmVhaycpCisgICAgICAgIEVxdWFsKG9fY3MuYXJncywgKEZhbHNlLCBUcnVlLCBUcnVlKSkKKworICAgIGRlZiB0ZXN0X29wZW5fY29tcGxldGlvbnNfbGF0ZXIoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IGF1dG9jb21wbGV0ZS5fZGVsYXllZF9jb21wbGV0aW9uX2lkIGlzIHNldAorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9kZWxheWVkX29wZW5fY29tcGxldGlvbnMoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IGF1dG9jb21wbGV0ZS5fZGVsYXllZF9jb21wbGV0aW9uX2lkIHNldCB0byBOb25lIGFuZCB0aGF0CisgICAgICAgICMgb3Blbl9jb21wbGV0aW9ucyBvbmx5IGNhbGxlZCBpZiBpbnNlcnRpb24gaW5kZXggaXMgdGhlIHNhbWUgYXMKKyAgICAgICAgIyBfZGVsYXllZF9jb21wbGV0aW9uX2luZGV4CisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X29wZW5fY29tcGxldGlvbnMoc2VsZik6CisgICAgICAgICMgVGVzdCBjb21wbGV0aW9ucyBvZiBmaWxlcyBhbmQgYXR0cmlidXRlcyBhcyB3ZWxsIGFzIG5vbi1jb21wbGV0aW9uCisgICAgICAgICMgb2YgZXJyb3JzCisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2ZldGNoX2NvbXBsZXRpb25zKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBmZXRjaF9jb21wbGV0aW9ucyByZXR1cm5zIDIgbGlzdHM6CisgICAgICAgICMgRm9yIGF0dHJpYnV0ZSBjb21wbGV0aW9uLCBhIGxhcmdlIGxpc3QgY29udGFpbmluZyBhbGwgdmFyaWFibGVzLCBhbmQKKyAgICAgICAgIyBhIHNtYWxsIGxpc3QgY29udGFpbmluZyBub24tcHJpdmF0ZSB2YXJpYWJsZXMuCisgICAgICAgICMgRm9yIGZpbGUgY29tcGxldGlvbiwgYSBsYXJnZSBsaXN0IGNvbnRhaW5pbmcgYWxsIGZpbGVzIGluIHRoZSBwYXRoLAorICAgICAgICAjIGFuZCBhIHNtYWxsIGxpc3QgY29udGFpbmluZyBmaWxlcyB0aGF0IGRvIG5vdCBzdGFydCB3aXRoICcuJworICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9nZXRfZW50aXR5KHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBhIG5hbWUgaXMgaW4gdGhlIG5hbWVzcGFjZSBvZiBzeXMubW9kdWxlcyBhbmQKKyAgICAgICAgIyBfX21haW5fXy5fX2RpY3RfXworICAgICAgICBwYXNzCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfYXV0b2V4cGFuZC5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2F1dG9leHBhbmQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRiN2U4YgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2F1dG9leHBhbmQucHkKQEAgLTAsMCArMSwxNDEgQEAKKyIiIlVuaXQgdGVzdHMgZm9yIGlkbGVsaWIuQXV0b0V4cGFuZCIiIgoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCByZXF1aXJlcworZnJvbSBUa2ludGVyIGltcG9ydCBUZXh0LCBUaworI2Zyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgVGV4dAorZnJvbSBpZGxlbGliLkF1dG9FeHBhbmQgaW1wb3J0IEF1dG9FeHBhbmQKKworCitjbGFzcyBEdW1teV9FZGl0d2luOgorICAgICMgQXV0b0V4cGFuZC5fX2luaXRfXyBvbmx5IG5lZWRzIC50ZXh0CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRleHQpOgorICAgICAgICBzZWxmLnRleHQgPSB0ZXh0CisKK2NsYXNzIEF1dG9FeHBhbmRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIGlmICdUa2ludGVyJyBpbiBzdHIoVGV4dCk6CisgICAgICAgICAgICByZXF1aXJlcygnZ3VpJykKKyAgICAgICAgICAgIGNscy50ayA9IFRrKCkKKyAgICAgICAgICAgIGNscy50ZXh0ID0gVGV4dChjbHMudGspCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjbHMudGV4dCA9IFRleHQoKQorICAgICAgICBjbHMuYXV0b19leHBhbmQgPSBBdXRvRXhwYW5kKER1bW15X0VkaXR3aW4oY2xzLnRleHQpKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKKyAgICAgICAgaWYgaGFzYXR0cihjbHMsICd0aycpOgorICAgICAgICAgICAgY2xzLnRrLmRlc3Ryb3koKQorICAgICAgICAgICAgZGVsIGNscy50aworICAgICAgICBkZWwgY2xzLnRleHQsIGNscy5hdXRvX2V4cGFuZAorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLnRleHQuZGVsZXRlKCcxLjAnLCAnZW5kJykKKworICAgIGRlZiB0ZXN0X2dldF9wcmV2d29yZChzZWxmKToKKyAgICAgICAgdGV4dCA9IHNlbGYudGV4dAorICAgICAgICBwcmV2aW91cyA9IHNlbGYuYXV0b19leHBhbmQuZ2V0cHJldndvcmQKKyAgICAgICAgZXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCisKKyAgICAgICAgZXF1YWwocHJldmlvdXMoKSwgJycpCisKKyAgICAgICAgdGV4dC5pbnNlcnQoJ2luc2VydCcsICd0JykKKyAgICAgICAgZXF1YWwocHJldmlvdXMoKSwgJ3QnKQorCisgICAgICAgIHRleHQuaW5zZXJ0KCdpbnNlcnQnLCAnaGlzJykKKyAgICAgICAgZXF1YWwocHJldmlvdXMoKSwgJ3RoaXMnKQorCisgICAgICAgIHRleHQuaW5zZXJ0KCdpbnNlcnQnLCAnICcpCisgICAgICAgIGVxdWFsKHByZXZpb3VzKCksICcnKQorCisgICAgICAgIHRleHQuaW5zZXJ0KCdpbnNlcnQnLCAnaXMnKQorICAgICAgICBlcXVhbChwcmV2aW91cygpLCAnaXMnKQorCisgICAgICAgIHRleHQuaW5zZXJ0KCdpbnNlcnQnLCAnXG5zYW1wbGVcbnN0cmluZycpCisgICAgICAgIGVxdWFsKHByZXZpb3VzKCksICdzdHJpbmcnKQorCisgICAgICAgIHRleHQuZGVsZXRlKCczLjAnLCAnaW5zZXJ0JykKKyAgICAgICAgZXF1YWwocHJldmlvdXMoKSwgJycpCisKKyAgICAgICAgdGV4dC5kZWxldGUoJzEuMCcsICdlbmQnKQorICAgICAgICBlcXVhbChwcmV2aW91cygpLCAnJykKKworICAgIGRlZiB0ZXN0X2JlZm9yZV9vbmx5KHNlbGYpOgorICAgICAgICBwcmV2aW91cyA9IHNlbGYuYXV0b19leHBhbmQuZ2V0cHJldndvcmQKKyAgICAgICAgZXhwYW5kID0gc2VsZi5hdXRvX2V4cGFuZC5leHBhbmRfd29yZF9ldmVudAorICAgICAgICBlcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKworICAgICAgICBzZWxmLnRleHQuaW5zZXJ0KCdpbnNlcnQnLCAnYWIgYWMgYnggYWQgYWIgYScpCisgICAgICAgIGVxdWFsKHNlbGYuYXV0b19leHBhbmQuZ2V0d29yZHMoKSwgWydhYicsICdhZCcsICdhYycsICdhJ10pCisgICAgICAgIGV4cGFuZCgnZXZlbnQnKQorICAgICAgICBlcXVhbChwcmV2aW91cygpLCAnYWInKQorICAgICAgICBleHBhbmQoJ2V2ZW50JykKKyAgICAgICAgZXF1YWwocHJldmlvdXMoKSwgJ2FkJykKKyAgICAgICAgZXhwYW5kKCdldmVudCcpCisgICAgICAgIGVxdWFsKHByZXZpb3VzKCksICdhYycpCisgICAgICAgIGV4cGFuZCgnZXZlbnQnKQorICAgICAgICBlcXVhbChwcmV2aW91cygpLCAnYScpCisKKyAgICBkZWYgdGVzdF9hZnRlcl9vbmx5KHNlbGYpOgorICAgICAgICAjIEFsc28gYWRkIHB1bmN0dWF0aW9uICdub2lzZScgdGhhdCBzaG91ZCBiZSBpZ25vcmVkLgorICAgICAgICB0ZXh0ID0gc2VsZi50ZXh0CisgICAgICAgIHByZXZpb3VzID0gc2VsZi5hdXRvX2V4cGFuZC5nZXRwcmV2d29yZAorICAgICAgICBleHBhbmQgPSBzZWxmLmF1dG9fZXhwYW5kLmV4cGFuZF93b3JkX2V2ZW50CisgICAgICAgIGVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgIHRleHQuaW5zZXJ0KCdpbnNlcnQnLCAnYSwgW2FiXSBhYzogKCkgYngiIiBjZCBhYz0gYWQgeWEnKQorICAgICAgICB0ZXh0Lm1hcmtfc2V0KCdpbnNlcnQnLCAnMS4xJykKKyAgICAgICAgZXF1YWwoc2VsZi5hdXRvX2V4cGFuZC5nZXR3b3JkcygpLCBbJ2FiJywgJ2FjJywgJ2FkJywgJ2EnXSkKKyAgICAgICAgZXhwYW5kKCdldmVudCcpCisgICAgICAgIGVxdWFsKHByZXZpb3VzKCksICdhYicpCisgICAgICAgIGV4cGFuZCgnZXZlbnQnKQorICAgICAgICBlcXVhbChwcmV2aW91cygpLCAnYWMnKQorICAgICAgICBleHBhbmQoJ2V2ZW50JykKKyAgICAgICAgZXF1YWwocHJldmlvdXMoKSwgJ2FkJykKKyAgICAgICAgZXhwYW5kKCdldmVudCcpCisgICAgICAgIGVxdWFsKHByZXZpb3VzKCksICdhJykKKworICAgIGRlZiB0ZXN0X2JvdGhfYmVmb3JlX2FmdGVyKHNlbGYpOgorICAgICAgICB0ZXh0ID0gc2VsZi50ZXh0CisgICAgICAgIHByZXZpb3VzID0gc2VsZi5hdXRvX2V4cGFuZC5nZXRwcmV2d29yZAorICAgICAgICBleHBhbmQgPSBzZWxmLmF1dG9fZXhwYW5kLmV4cGFuZF93b3JkX2V2ZW50CisgICAgICAgIGVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgIHRleHQuaW5zZXJ0KCdpbnNlcnQnLCAnYWIgeHkgeXpcbicpCisgICAgICAgIHRleHQuaW5zZXJ0KCdpbnNlcnQnLCAnYSBhYyBieSBhYycpCisKKyAgICAgICAgdGV4dC5tYXJrX3NldCgnaW5zZXJ0JywgJzIuMScpCisgICAgICAgIGVxdWFsKHNlbGYuYXV0b19leHBhbmQuZ2V0d29yZHMoKSwgWydhYicsICdhYycsICdhJ10pCisgICAgICAgIGV4cGFuZCgnZXZlbnQnKQorICAgICAgICBlcXVhbChwcmV2aW91cygpLCAnYWInKQorICAgICAgICBleHBhbmQoJ2V2ZW50JykKKyAgICAgICAgZXF1YWwocHJldmlvdXMoKSwgJ2FjJykKKyAgICAgICAgZXhwYW5kKCdldmVudCcpCisgICAgICAgIGVxdWFsKHByZXZpb3VzKCksICdhJykKKworICAgIGRlZiB0ZXN0X290aGVyX2V4cGFuZF9jYXNlcyhzZWxmKToKKyAgICAgICAgdGV4dCA9IHNlbGYudGV4dAorICAgICAgICBleHBhbmQgPSBzZWxmLmF1dG9fZXhwYW5kLmV4cGFuZF93b3JkX2V2ZW50CisgICAgICAgIGVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgICMgbm8gZXhwYW5zaW9uIGNhbmRpZGF0ZSBmb3VuZAorICAgICAgICBlcXVhbChzZWxmLmF1dG9fZXhwYW5kLmdldHdvcmRzKCksIFtdKQorICAgICAgICBlcXVhbChleHBhbmQoJ2V2ZW50JyksICdicmVhaycpCisKKyAgICAgICAgdGV4dC5pbnNlcnQoJ2luc2VydCcsICdieCBjeSBkeiBhJykKKyAgICAgICAgZXF1YWwoc2VsZi5hdXRvX2V4cGFuZC5nZXR3b3JkcygpLCBbXSkKKworICAgICAgICAjIHJlc2V0IHN0YXRlIGJ5IHN1Y2Nlc3NmdWxseSBleHBhbmRpbmcgb25jZQorICAgICAgICAjIG1vdmUgY3Vyc29yIHRvIGFub3RoZXIgcG9zaXRpb24gYW5kIGV4cGFuZCBhZ2FpbgorICAgICAgICB0ZXh0Lmluc2VydCgnaW5zZXJ0JywgJ2FjIHh5IGEgYWMgYWQgYScpCisgICAgICAgIHRleHQubWFya19zZXQoJ2luc2VydCcsICcxLjcnKQorICAgICAgICBleHBhbmQoJ2V2ZW50JykKKyAgICAgICAgaW5pdGlhbF9zdGF0ZSA9IHNlbGYuYXV0b19leHBhbmQuc3RhdGUKKyAgICAgICAgdGV4dC5tYXJrX3NldCgnaW5zZXJ0JywgJzEuZW5kJykKKyAgICAgICAgZXhwYW5kKCdldmVudCcpCisgICAgICAgIG5ld19zdGF0ZSA9IHNlbGYuYXV0b19leHBhbmQuc3RhdGUKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpbml0aWFsX3N0YXRlLCBuZXdfc3RhdGUpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NhbGx0aXBzLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY2FsbHRpcHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM3MTgwOQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NhbGx0aXBzLnB5CkBAIC0wLDAgKzEsMTgwIEBACitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBpZGxlbGliLkNhbGxUaXBzIGFzIGN0CitDVGkgPSBjdC5DYWxsVGlwcygpICAjIG5lZWRlZCBmb3IgZ2V0X2VudGl0eSB0ZXN0IGluIDIuNworaW1wb3J0IHRleHR3cmFwCitpbXBvcnQgdHlwZXMKK2ltcG9ydCB3YXJuaW5ncworCitkZWZhdWx0X3RpcCA9ICcnCisKKyMgVGVzdCBDbGFzcyBUQyBpcyB1c2VkIGluIG11bHRpcGxlIGdldF9hcmdzcGVjIHRlc3QgbWV0aG9kcworY2xhc3MgVEMob2JqZWN0KToKKyAgICAnZG9jJworICAgIHRpcCA9ICIoYWk9Tm9uZSwgKmFyZ3MpIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhaT1Ob25lLCAqYik6ICdkb2MnCisgICAgX19pbml0X18udGlwID0gIihzZWxmLCBhaT1Ob25lLCAqYXJncykiCisgICAgZGVmIHQxKHNlbGYpOiAnZG9jJworICAgIHQxLnRpcCA9ICIoc2VsZikiCisgICAgZGVmIHQyKHNlbGYsIGFpLCBiPU5vbmUpOiAnZG9jJworICAgIHQyLnRpcCA9ICIoc2VsZiwgYWksIGI9Tm9uZSkiCisgICAgZGVmIHQzKHNlbGYsIGFpLCAqYXJncyk6ICdkb2MnCisgICAgdDMudGlwID0gIihzZWxmLCBhaSwgKmFyZ3MpIgorICAgIGRlZiB0NChzZWxmLCAqYXJncyk6ICdkb2MnCisgICAgdDQudGlwID0gIihzZWxmLCAqYXJncykiCisgICAgZGVmIHQ1KHNlbGYsIGFpLCBiPU5vbmUsICphcmdzLCAqKmt3KTogJ2RvYycKKyAgICB0NS50aXAgPSAiKHNlbGYsIGFpLCBiPU5vbmUsICphcmdzLCAqKmt3YXJncykiCisgICAgZGVmIHQ2KG5vLCBzZWxmKTogJ2RvYycKKyAgICB0Ni50aXAgPSAiKG5vLCBzZWxmKSIKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgY2kpOiAnZG9jJworICAgIF9fY2FsbF9fLnRpcCA9ICIoc2VsZiwgY2kpIgorICAgICMgYXR0YWNoaW5nIC50aXAgdG8gd3JhcHBlZCBtZXRob2RzIGRvZXMgbm90IHdvcmsKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgY20oY2xzLCBhKTogJ2RvYycKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIHNtKGIpOiAnZG9jJworCit0YyA9IFRDKCkKKworc2lnbmF0dXJlID0gY3QuZ2V0X2FyZ190ZXh0ICAjIDIuNyBhbmQgMy54IHVzZSBkaWZmZXJlbnQgZnVuY3Rpb25zCitjbGFzcyBHZXRfc2lnbmF0dXJlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBUaGUgc2lnbmF0dXJlIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGEgc3RyaW5nLCBldmVuIGlmIGJsYW5rLgorICAgICMgVGVzdCBhIHZhcmlldHkgb2Ygb2JqZWN0cyB0byBiZSBzdXJlIHRoYXQgbm9uZSBjYXVzZSBpdCB0byByYWlzZQorICAgICMgKHF1aXRlIGFzaWRlIGZyb20gZ2V0dGluZyBhcyBjb3JyZWN0IGFuIGFuc3dlciBhcyBwb3NzaWJsZSkuCisgICAgIyBUaGUgdGVzdHMgb2YgYnVpbHRpbnMgbWF5IGJyZWFrIGlmIHRoZSBkb2NzdHJpbmdzIGNoYW5nZSwKKyAgICAjIGJ1dCBhIHJlZCBidWlsZGJvdCBpcyBiZXR0ZXIgdGhhbiBhIHVzZXIgY3Jhc2ggKGFzIGhhcyBoYXBwZW5lZCkuCisgICAgIyBGb3IgYSBzaW1wbGUgbWlzbWF0Y2gsIGNoYW5nZSB0aGUgZXhwZWN0ZWQgb3V0cHV0IHRvIHRoZSBhY3R1YWwuCisKKyAgICBkZWYgdGVzdF9idWlsdGlucyhzZWxmKToKKyAgICAgICAgIyAyLjcgcHV0cyAnKClcbicgd2hlcmUgMy54IGRvZXMgbm90LCBvdGhlciBtaW5vciBkaWZmZXJlbmNlcworCisgICAgICAgICMgUHl0aG9uIGNsYXNzIHRoYXQgaW5oZXJpdHMgYnVpbHRpbiBtZXRob2RzCisgICAgICAgIGNsYXNzIExpc3QobGlzdCk6ICJMaXN0KCkgZG9jIgorICAgICAgICAjIFNpbXVsYXRlIGJ1aWx0aW4gd2l0aCBubyBkb2NzdHJpbmcgZm9yIGRlZmF1bHQgYXJnc3BlYyB0ZXN0CisgICAgICAgIGNsYXNzIFNCOiAgX19jYWxsX18gPSBOb25lCisKKyAgICAgICAgZGVmIGd0ZXN0KG9iaiwgb3V0KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2lnbmF0dXJlKG9iaiksIG91dCkKKworICAgICAgICBndGVzdChMaXN0LCAnKClcbicgKyBMaXN0Ll9fZG9jX18pCisgICAgICAgIGd0ZXN0KGxpc3QuX19uZXdfXywKKyAgICAgICAgICAgICAgICdULl9fbmV3X18oUywgLi4uKSAtPiBhIG5ldyBvYmplY3Qgd2l0aCB0eXBlIFMsIGEgc3VidHlwZSBvZiBUJykKKyAgICAgICAgZ3Rlc3QobGlzdC5fX2luaXRfXywKKyAgICAgICAgICAgICAgICd4Ll9faW5pdF9fKC4uLikgaW5pdGlhbGl6ZXMgeDsgc2VlIGhlbHAodHlwZSh4KSkgZm9yIHNpZ25hdHVyZScpCisgICAgICAgIGFwcGVuZF9kb2MgPSAgIkwuYXBwZW5kKG9iamVjdCkgLS0gYXBwZW5kIG9iamVjdCB0byBlbmQiCisgICAgICAgIGd0ZXN0KGxpc3QuYXBwZW5kLCBhcHBlbmRfZG9jKQorICAgICAgICBndGVzdChbXS5hcHBlbmQsIGFwcGVuZF9kb2MpCisgICAgICAgIGd0ZXN0KExpc3QuYXBwZW5kLCBhcHBlbmRfZG9jKQorCisgICAgICAgIGd0ZXN0KHR5cGVzLk1ldGhvZFR5cGUsICcoKVxuaW5zdGFuY2VtZXRob2QoZnVuY3Rpb24sIGluc3RhbmNlLCBjbGFzcyknKQorICAgICAgICBndGVzdChTQigpLCBkZWZhdWx0X3RpcCkKKworICAgIGRlZiB0ZXN0X3NpZ25hdHVyZV93cmFwKHNlbGYpOgorICAgICAgICAjIFRoaXMgaXMgYWxzbyBhIHRlc3Qgb2YgYW4gb2xkLXN0eWxlIGNsYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2lnbmF0dXJlKHRleHR3cmFwLlRleHRXcmFwcGVyKSwgJycnXAorKHdpZHRoPTcwLCBpbml0aWFsX2luZGVudD0nJywgc3Vic2VxdWVudF9pbmRlbnQ9JycsIGV4cGFuZF90YWJzPVRydWUsCisgICAgcmVwbGFjZV93aGl0ZXNwYWNlPVRydWUsIGZpeF9zZW50ZW5jZV9lbmRpbmdzPUZhbHNlLCBicmVha19sb25nX3dvcmRzPVRydWUsCisgICAgZHJvcF93aGl0ZXNwYWNlPVRydWUsIGJyZWFrX29uX2h5cGhlbnM9VHJ1ZSknJycpCisKKyAgICBkZWYgdGVzdF9kb2NsaW5lX3RydW5jYXRpb24oc2VsZik6CisgICAgICAgIGRlZiBmKCk6IHBhc3MKKyAgICAgICAgZi5fX2RvY19fID0gJ2EnKjMwMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpZ25hdHVyZShmKSwgJygpXG4nICsgJ2EnICogKGN0Ll9NQVhfQ09MUy0zKSArICcuLi4nKQorCisgICAgZGVmIHRlc3RfbXVsdGlsaW5lX2RvY3N0cmluZyhzZWxmKToKKyAgICAgICAgIyBUZXN0IGZld2VyIGxpbmVzIHRoYW4gbWF4LgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpZ25hdHVyZShsaXN0KSwKKyAgICAgICAgICAgICAgICAiKClcbmxpc3QoKSAtPiBuZXcgZW1wdHkgbGlzdFxuIgorICAgICAgICAgICAgICAgICJsaXN0KGl0ZXJhYmxlKSAtPiBuZXcgbGlzdCBpbml0aWFsaXplZCBmcm9tIGl0ZXJhYmxlJ3MgaXRlbXMiKQorCisgICAgICAgICMgVGVzdCBtYXggbGluZXMgYW5kIGxpbmUgKGN1cnJlbnRseSkgdG9vIGxvbmcuCisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHMgPSAnYVxuYlxuY1xuZFxuJworICAgICAgICBmLl9fZG9jX18gPSBzICsgMzAwICogJ2UnICsgJ2YnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2lnbmF0dXJlKGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICcoKVxuJyArIHMgKyAoY3QuX01BWF9DT0xTIC0gMykgKiAnZScgKyAnLi4uJykKKworICAgIGRlZiB0ZXN0X2Z1bmN0aW9ucyhzZWxmKToKKyAgICAgICAgZGVmIHQxKCk6ICdkb2MnCisgICAgICAgIHQxLnRpcCA9ICIoKSIKKyAgICAgICAgZGVmIHQyKGEsIGI9Tm9uZSk6ICdkb2MnCisgICAgICAgIHQyLnRpcCA9ICIoYSwgYj1Ob25lKSIKKyAgICAgICAgZGVmIHQzKGEsICphcmdzKTogJ2RvYycKKyAgICAgICAgdDMudGlwID0gIihhLCAqYXJncykiCisgICAgICAgIGRlZiB0NCgqYXJncyk6ICdkb2MnCisgICAgICAgIHQ0LnRpcCA9ICIoKmFyZ3MpIgorICAgICAgICBkZWYgdDUoYSwgYj1Ob25lLCAqYXJncywgKiprd2RzKTogJ2RvYycKKyAgICAgICAgdDUudGlwID0gIihhLCBiPU5vbmUsICphcmdzLCAqKmt3YXJncykiCisKKyAgICAgICAgZm9yIGZ1bmMgaW4gKHQxLCB0MiwgdDMsIHQ0LCB0NSwgVEMpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaWduYXR1cmUoZnVuYyksIGZ1bmMudGlwICsgJ1xuZG9jJykKKworICAgIGRlZiB0ZXN0X21ldGhvZHMoc2VsZik6CisgICAgICAgIGZvciBtZXRoIGluIChUQy50MSwgVEMudDIsIFRDLnQzLCBUQy50NCwgVEMudDUsIFRDLnQ2LCBUQy5fX2NhbGxfXyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpZ25hdHVyZShtZXRoKSwgbWV0aC50aXAgKyAiXG5kb2MiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpZ25hdHVyZShUQy5jbSksICIoYSlcbmRvYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2lnbmF0dXJlKFRDLnNtKSwgIihiKVxuZG9jIikKKworICAgIGRlZiB0ZXN0X2JvdW5kX21ldGhvZHMoc2VsZik6CisgICAgICAgICMgdGVzdCB0aGF0IGZpcnN0IHBhcmFtZXRlciBpcyBjb3JyZWN0bHkgcmVtb3ZlZCBmcm9tIGFyZ3NwZWMKKyAgICAgICAgZm9yIG1ldGgsIG10aXAgIGluICgodGMudDEsICIoKSIpLCAodGMudDQsICIoKmFyZ3MpIiksICh0Yy50NiwgIihzZWxmKSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0Yy5fX2NhbGxfXywgJyhjaSknKSwgKHRjLCAnKGNpKScpLCAoVEMuY20sICIoYSkiKSwpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaWduYXR1cmUobWV0aCksIG10aXAgKyAiXG5kb2MiKQorCisgICAgZGVmIHRlc3Rfc3RhcnJlZF9wYXJhbWV0ZXIoc2VsZik6CisgICAgICAgICMgdGVzdCB0aGF0IHN0YXJyZWQgZmlyc3QgcGFyYW1ldGVyIGlzICpub3QqIHJlbW92ZWQgZnJvbSBhcmdzcGVjCisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBkZWYgbTEoKmFyZ3MpOiBwYXNzCisgICAgICAgICAgICBkZWYgbTIoKiprd2RzKTogcGFzcworICAgICAgICBkZWYgZjEoYXJncywga3dhcmdzLCAqYSwgKiprKTogcGFzcworICAgICAgICBkZWYgZjIoYXJncywga3dhcmdzLCBhcmdzMSwga3dhcmdzMSwgKmEsICoqayk6IHBhc3MKKyAgICAgICAgYyA9IEMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpZ25hdHVyZShDLm0xKSwgJygqYXJncyknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpZ25hdHVyZShjLm0xKSwgJygqYXJncyknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpZ25hdHVyZShDLm0yKSwgJygqKmt3YXJncyknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpZ25hdHVyZShjLm0yKSwgJygqKmt3YXJncyknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpZ25hdHVyZShmMSksICcoYXJncywga3dhcmdzLCAqYXJnczEsICoqa3dhcmdzMSknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpZ25hdHVyZShmMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgJyhhcmdzLCBrd2FyZ3MsIGFyZ3MxLCBrd2FyZ3MxLCAqYXJnczIsICoqa3dhcmdzMiknKQorCisgICAgZGVmIHRlc3Rfbm9fZG9jc3RyaW5nKHNlbGYpOgorICAgICAgICBkZWYgbmQocyk6IHBhc3MKKyAgICAgICAgVEMubmQgPSBuZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpZ25hdHVyZShuZCksICIocykiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpZ25hdHVyZShUQy5uZCksICIocykiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpZ25hdHVyZSh0Yy5uZCksICIoKSIpCisKKyAgICBkZWYgdGVzdF9hdHRyaWJ1dGVfZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBjbGFzcyBOb0NhbGwob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgICAgICAgICByYWlzZSBCYXNlRXhjZXB0aW9uCisgICAgICAgIGNsYXNzIENhbGwoTm9DYWxsKToKKyAgICAgICAgICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBjaSk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBmb3IgbWV0aCwgbXRpcCAgaW4gKChOb0NhbGwsICcoKScpLCAoQ2FsbCwgJygpJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5vQ2FsbCgpLCAnJyksIChDYWxsKCksICcoY2kpJykpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaWduYXR1cmUobWV0aCksIG10aXApCisKKyAgICBkZWYgdGVzdF9ub25fY2FsbGFibGVzKHNlbGYpOgorICAgICAgICBmb3Igb2JqIGluICgwLCAwLjAsICcwJywgYicwJywgW10sIHt9KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2lnbmF0dXJlKG9iaiksICcnKQorCitjbGFzcyBHZXRfZW50aXR5VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBJbiAzLngsIGdldF9lbnRpdHkgY2hhbmdlZCBmcm9tICdpbnN0YW5jZSBtZXRob2QnIHRvIG1vZHVsZSBmdW5jdGlvbgorICAgICMgc2luY2UgJ3NlbGYnIG5vdCB1c2VkLiBVc2UgZHVtbXkgaW5zdGFuY2UgdW50aWwgY2hhbmdlIDIuNyBhbHNvLgorICAgIGRlZiB0ZXN0X2JhZF9lbnRpdHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKENUaS5nZXRfZW50aXR5KCcxLzAnKSkKKyAgICBkZWYgdGVzdF9nb29kX2VudGl0eShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhDVGkuZ2V0X2VudGl0eSgnaW50JyksIGludCkKKworY2xhc3MgUHkyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfcGFyYW10dXBsZV9mbG9hdChzZWxmKToKKyAgICAgICAgIyAxODUzOTogKGEsYikgYmVjb21lcyAnLjAnIGluIGNvZGUgb2JqZWN0OyBjaGFuZ2UgdGhhdCBidXQgbm90IDAuMAorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgICAgICAgICAjIFN1cHBlc3MgbWVzc2FnZSBvZiBweTMgZGVwcmVjYXRpb24gb2YgcGFyYW1ldGVyIHVucGFja2luZworICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJpZ25vcmUiKQorICAgICAgICAgICAgZXhlYyAiZGVmIGYoKGEsYiksIGM9MC4wKTogcGFzcyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaWduYXR1cmUoZiksICcoPHR1cGxlPiwgYz0wLjApJykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29uZmlnX25hbWUucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9jb25maWdfbmFtZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDAzZjg3Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29uZmlnX25hbWUucHkKQEAgLTAsMCArMSw3NSBAQAorIiIiVW5pdCB0ZXN0cyBmb3IgaWRsZWxpYi5jb25maWdTZWN0aW9uTmFtZURpYWxvZyIiIgoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lm1vY2tfdGsgaW1wb3J0IFZhciwgTWJveAorZnJvbSBpZGxlbGliIGltcG9ydCBjb25maWdTZWN0aW9uTmFtZURpYWxvZyBhcyBuYW1lX2RpYWxvZ19tb2R1bGUKKworbmFtZV9kaWFsb2cgPSBuYW1lX2RpYWxvZ19tb2R1bGUuR2V0Q2ZnU2VjdGlvbk5hbWVEaWFsb2cKKworY2xhc3MgRHVtbXlfbmFtZV9kaWFsb2cob2JqZWN0KToKKyAgICAjIE1vY2sgZm9yIHRlc3RpbmcgdGhlIGZvbGxvd2luZyBtZXRob2RzIG9mIG5hbWVfZGlhbG9nCisgICAgbmFtZV9vayA9IG5hbWVfZGlhbG9nLm5hbWVfb2suaW1fZnVuYworICAgIE9rID0gbmFtZV9kaWFsb2cuT2suaW1fZnVuYworICAgIENhbmNlbCA9IG5hbWVfZGlhbG9nLkNhbmNlbC5pbV9mdW5jCisgICAgIyBBdHRyaWJ1dGVzLCBjb25zdGFudCBvciB2YXJpYWJsZSwgbmVlZGVkIGZvciB0ZXN0cworICAgIHVzZWRfbmFtZXMgPSBbJ3VzZWQnXQorICAgIG5hbWUgPSBWYXIoKQorICAgIHJlc3VsdCA9IE5vbmUKKyAgICBkZXN0cm95ZWQgPSBGYWxzZQorICAgIGRlZiBkZXN0cm95KHNlbGYpOgorICAgICAgICBzZWxmLmRlc3Ryb3llZCA9IFRydWUKKworIyBuYW1lX29rIGNhbGxzIE1ib3guc2hvd2Vycm9yIGlmIG5hbWUgaXMgbm90IG9rCitvcmlnX21ib3ggPSBuYW1lX2RpYWxvZ19tb2R1bGUudGtNZXNzYWdlQm94CitzaG93ZXJyb3IgPSBNYm94LnNob3dlcnJvcgorCitjbGFzcyBDb25maWdOYW1lVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGlhbG9nID0gRHVtbXlfbmFtZV9kaWFsb2coKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgbmFtZV9kaWFsb2dfbW9kdWxlLnRrTWVzc2FnZUJveCA9IE1ib3gKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgIG5hbWVfZGlhbG9nX21vZHVsZS50a01lc3NhZ2VCb3ggPSBvcmlnX21ib3gKKworICAgIGRlZiB0ZXN0X2JsYW5rX25hbWUoc2VsZik6CisgICAgICAgIHNlbGYuZGlhbG9nLm5hbWUuc2V0KCcgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpYWxvZy5uYW1lX29rKCksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNob3dlcnJvci50aXRsZSwgJ05hbWUgRXJyb3InKQorICAgICAgICBzZWxmLmFzc2VydEluKCdObycsIHNob3dlcnJvci5tZXNzYWdlKQorCisgICAgZGVmIHRlc3RfdXNlZF9uYW1lKHNlbGYpOgorICAgICAgICBzZWxmLmRpYWxvZy5uYW1lLnNldCgndXNlZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaWFsb2cubmFtZV9vaygpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaG93ZXJyb3IudGl0bGUsICdOYW1lIEVycm9yJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigndXNlJywgc2hvd2Vycm9yLm1lc3NhZ2UpCisKKyAgICBkZWYgdGVzdF9sb25nX25hbWUoc2VsZik6CisgICAgICAgIHNlbGYuZGlhbG9nLm5hbWUuc2V0KCdnb29kJyo4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlhbG9nLm5hbWVfb2soKSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2hvd2Vycm9yLnRpdGxlLCAnTmFtZSBFcnJvcicpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3RvbyBsb25nJywgc2hvd2Vycm9yLm1lc3NhZ2UpCisKKyAgICBkZWYgdGVzdF9nb29kX25hbWUoc2VsZik6CisgICAgICAgIHNlbGYuZGlhbG9nLm5hbWUuc2V0KCcgIGdvb2QgJykKKyAgICAgICAgc2hvd2Vycm9yLnRpdGxlID0gJ05vIEVycm9yJyAgIyBzaG91bGQgbm90IGJlIGNhbGxlZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlhbG9nLm5hbWVfb2soKSwgJ2dvb2QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNob3dlcnJvci50aXRsZSwgJ05vIEVycm9yJykKKworICAgIGRlZiB0ZXN0X29rKHNlbGYpOgorICAgICAgICBzZWxmLmRpYWxvZy5kZXN0cm95ZWQgPSBGYWxzZQorICAgICAgICBzZWxmLmRpYWxvZy5uYW1lLnNldCgnZ29vZCcpCisgICAgICAgIHNlbGYuZGlhbG9nLk9rKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpYWxvZy5yZXN1bHQsICdnb29kJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZGlhbG9nLmRlc3Ryb3llZCkKKworICAgIGRlZiB0ZXN0X2NhbmNlbChzZWxmKToKKyAgICAgICAgc2VsZi5kaWFsb2cuZGVzdHJveWVkID0gRmFsc2UKKyAgICAgICAgc2VsZi5kaWFsb2cuQ2FuY2VsKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpYWxvZy5yZXN1bHQsICcnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5kaWFsb2cuZGVzdHJveWVkKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NvbmZpZ2RpYWxvZy5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NvbmZpZ2RpYWxvZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmJjODIyCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29uZmlnZGlhbG9nLnB5CkBAIC0wLDAgKzEsMzIgQEAKKycnJ1VuaXR0ZXN0cyBmb3IgaWRsZWxpYi9jb25maWdIYW5kbGVyLnB5CisKK0NvdmVyYWdlOiA0NiUganVzdCBieSBjcmVhdGluZyBkaWFsb2cuIFRoZSBvdGhlciBoYWxmIGlzIGNoYW5nZSBjb2RlLgorCisnJycKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKK2Zyb20gVGtpbnRlciBpbXBvcnQgVGsKK2Zyb20gaWRsZWxpYi5jb25maWdEaWFsb2cgaW1wb3J0IENvbmZpZ0RpYWxvZworZnJvbSBpZGxlbGliLm1hY29zeFN1cHBvcnQgaW1wb3J0IF9pbml0aWFsaXplVGtWYXJpYW50VGVzdHMKKworCitjbGFzcyBDb25maWdEaWFsb2dUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIHJlcXVpcmVzKCdndWknKQorICAgICAgICBjbHMucm9vdCA9IFRrKCkKKyAgICAgICAgX2luaXRpYWxpemVUa1ZhcmlhbnRUZXN0cyhjbHMucm9vdCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgIGNscy5yb290LmRlc3Ryb3koKQorICAgICAgICBkZWwgY2xzLnJvb3QKKworICAgIGRlZiB0ZXN0X2RpYWxvZyhzZWxmKToKKyAgICAgICAgZD1Db25maWdEaWFsb2coc2VsZi5yb290LCAnVGVzdCcsIF91dGVzdD1UcnVlKQorICAgICAgICBkLmRlc3Ryb3koKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2RlbGVnYXRvci5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2RlbGVnYXRvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGFlNWVlCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZGVsZWdhdG9yLnB5CkBAIC0wLDAgKzEsMzcgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBpZGxlbGliLkRlbGVnYXRvciBpbXBvcnQgRGVsZWdhdG9yCisKK2NsYXNzIERlbGVnYXRvclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfbXlkZWwoc2VsZik6CisgICAgICAgICMgdGVzdCBhIHNpbXBsZSB1c2Ugc2NlbmFyaW8KKworICAgICAgICAjIGluaXRpYWxpemUKKyAgICAgICAgbXlkZWwgPSBEZWxlZ2F0b3IoaW50KQorICAgICAgICBzZWxmLmFzc2VydElzKG15ZGVsLmRlbGVnYXRlLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXlkZWwuX0RlbGVnYXRvcl9fY2FjaGUsIHNldCgpKQorCisgICAgICAgICMgYWRkIGFuIGF0dHJpYnV0ZToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIG15ZGVsLl9fZ2V0YXR0cl9fLCAneHl6JykKKyAgICAgICAgYmwgPSBteWRlbC5iaXRfbGVuZ3RoCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoYmwsIGludC5iaXRfbGVuZ3RoKQorICAgICAgICBzZWxmLmFzc2VydElzKG15ZGVsLl9fZGljdF9fWydiaXRfbGVuZ3RoJ10sIGludC5iaXRfbGVuZ3RoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG15ZGVsLl9EZWxlZ2F0b3JfX2NhY2hlLCB7J2JpdF9sZW5ndGgnfSkKKworICAgICAgICAjIGFkZCBhIHNlY29uZCBhdHRyaWJ1dGUKKyAgICAgICAgbXlkZWwubnVtZXJhdG9yCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXlkZWwuX0RlbGVnYXRvcl9fY2FjaGUsIHsnYml0X2xlbmd0aCcsICdudW1lcmF0b3InfSkKKworICAgICAgICAjIGRlbGV0ZSB0aGUgc2Vjb25kICh3aGljaCwgaG93ZXZlciwgbGVhdmVzIGl0IGluIHRoZSBuYW1lIGNhY2hlKQorICAgICAgICBkZWwgbXlkZWwubnVtZXJhdG9yCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ251bWVyYXRvcicsIG15ZGVsLl9fZGljdF9fKQorICAgICAgICBzZWxmLmFzc2VydEluKCdudW1lcmF0b3InLCBteWRlbC5fRGVsZWdhdG9yX19jYWNoZSkKKworICAgICAgICAjIHJlc2V0IGJ5IGNhbGxpbmcgLnNldGRlbGVnYXRlLCB3aGljaCBjYWxscyAucmVzZXRjYWNoZQorICAgICAgICBteWRlbC5zZXRkZWxlZ2F0ZShmbG9hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhteWRlbC5kZWxlZ2F0ZSwgZmxvYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ2JpdF9sZW5ndGgnLCBteWRlbC5fX2RpY3RfXykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChteWRlbC5fRGVsZWdhdG9yX19jYWNoZSwgc2V0KCkpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MiwgZXhpdD0yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZm9ybWF0cGFyYWdyYXBoLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZm9ybWF0cGFyYWdyYXBoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YmJmMTYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9mb3JtYXRwYXJhZ3JhcGgucHkKQEAgLTAsMCArMSwzNzcgQEAKKyMgVGVzdCB0aGUgZnVuY3Rpb25zIGFuZCBtYWluIGNsYXNzIG1ldGhvZCBvZiBGb3JtYXRQYXJhZ3JhcGgucHkKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBpZGxlbGliIGltcG9ydCBGb3JtYXRQYXJhZ3JhcGggYXMgZnAKK2Zyb20gaWRsZWxpYi5FZGl0b3JXaW5kb3cgaW1wb3J0IEVkaXRvcldpbmRvdworZnJvbSBUa2ludGVyIGltcG9ydCBUaywgVGV4dCwgVGNsRXJyb3IKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCisKKworY2xhc3MgSXNfR2V0X1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhlIGlzXyBhbmQgZ2V0XyBmdW5jdGlvbnMiIiIKKyAgICB0ZXN0X2NvbW1lbnQgPSAnIyBUaGlzIGlzIGEgY29tbWVudCcKKyAgICB0ZXN0X25vY29tbWVudCA9ICdUaGlzIGlzIG5vdCBhIGNvbW1lbnQnCisgICAgdHJhaWxpbmd3c19jb21tZW50ID0gJyMgVGhpcyBpcyBhIGNvbW1lbnQgICAnCisgICAgbGVhZGluZ3dzX2NvbW1lbnQgPSAnICAgICMgVGhpcyBpcyBhIGNvbW1lbnQnCisgICAgbGVhZGluZ3dzX25vY29tbWVudCA9ICcgICAgVGhpcyBpcyBub3QgYSBjb21tZW50JworCisgICAgZGVmIHRlc3RfaXNfYWxsX3doaXRlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoZnAuaXNfYWxsX3doaXRlKCcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZwLmlzX2FsbF93aGl0ZSgnXHRcblxyXGZcdicpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGZwLmlzX2FsbF93aGl0ZShzZWxmLnRlc3RfY29tbWVudCkpCisKKyAgICBkZWYgdGVzdF9nZXRfaW5kZW50KHNlbGYpOgorICAgICAgICBFcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgRXF1YWwoZnAuZ2V0X2luZGVudChzZWxmLnRlc3RfY29tbWVudCksICcnKQorICAgICAgICBFcXVhbChmcC5nZXRfaW5kZW50KHNlbGYudHJhaWxpbmd3c19jb21tZW50KSwgJycpCisgICAgICAgIEVxdWFsKGZwLmdldF9pbmRlbnQoc2VsZi5sZWFkaW5nd3NfY29tbWVudCksICcgICAgJykKKyAgICAgICAgRXF1YWwoZnAuZ2V0X2luZGVudChzZWxmLmxlYWRpbmd3c19ub2NvbW1lbnQpLCAnICAgICcpCisKKyAgICBkZWYgdGVzdF9nZXRfY29tbWVudF9oZWFkZXIoc2VsZik6CisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIFRlc3QgY29tbWVudCBzdHJpbmdzCisgICAgICAgIEVxdWFsKGZwLmdldF9jb21tZW50X2hlYWRlcihzZWxmLnRlc3RfY29tbWVudCksICcjJykKKyAgICAgICAgRXF1YWwoZnAuZ2V0X2NvbW1lbnRfaGVhZGVyKHNlbGYudHJhaWxpbmd3c19jb21tZW50KSwgJyMnKQorICAgICAgICBFcXVhbChmcC5nZXRfY29tbWVudF9oZWFkZXIoc2VsZi5sZWFkaW5nd3NfY29tbWVudCksICcgICAgIycpCisgICAgICAgICMgVGVzdCBub24tY29tbWVudCBzdHJpbmdzCisgICAgICAgIEVxdWFsKGZwLmdldF9jb21tZW50X2hlYWRlcihzZWxmLmxlYWRpbmd3c19ub2NvbW1lbnQpLCAnICAgICcpCisgICAgICAgIEVxdWFsKGZwLmdldF9jb21tZW50X2hlYWRlcihzZWxmLnRlc3Rfbm9jb21tZW50KSwgJycpCisKKworY2xhc3MgRmluZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhlIGZpbmRfcGFyYWdyYXBoIGZ1bmN0aW9uIGluIEZvcm1hdFBhcmFncmFwaC4KKworICAgIFVzaW5nIHRoZSBydW5jYXNlKCkgZnVuY3Rpb24sIGZpbmRfcGFyYWdyYXBoKCkgaXMgY2FsbGVkIHdpdGggJ21hcmsnIHNldCBhdAorICAgIG11bHRpcGxlIGluZGV4ZXMgYmVmb3JlIGFuZCBpbnNpZGUgdGhlIHRlc3QgcGFyYWdyYXBoLgorCisgICAgSXQgYXBwZWFycyB0aGF0IGNvZGUgd2l0aCB0aGUgc2FtZSBpbmRlbnRhdGlvbiBhcyBhIHF1b3RlZCBzdHJpbmcgaXMgZ3JvdXBlZAorICAgIGFzIHBhcnQgb2YgdGhlIHNhbWUgcGFyYWdyYXBoLCB3aGljaCBpcyBwcm9iYWJseSBpbmNvcnJlY3QgYmVoYXZpb3IuCisgICAgIiIiCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lm1vY2tfdGsgaW1wb3J0IFRleHQKKyAgICAgICAgY2xzLnRleHQgPSBUZXh0KCkKKworICAgIGRlZiBydW5jYXNlKHNlbGYsIGluc2VydHRleHQsIHN0b3BsaW5lLCBleHBlY3RlZCk6CisgICAgICAgICMgQ2hlY2sgdGhhdCBmaW5kX3BhcmFncmFwaCByZXR1cm5zIHRoZSBleHBlY3RlZCBwYXJhZ3JhcGggd2hlbgorICAgICAgICAjIHRoZSBtYXJrIGluZGV4IGlzIHNldCB0byBiZWdpbm5pbmcsIG1pZGRsZSwgZW5kIG9mIGVhY2ggbGluZQorICAgICAgICAjIHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nIHRoZSBzdG9wIGxpbmUKKyAgICAgICAgdGV4dCA9IHNlbGYudGV4dAorICAgICAgICB0ZXh0Lmluc2VydCgnMS4wJywgaW5zZXJ0dGV4dCkKKyAgICAgICAgZm9yIGxpbmUgaW4gcmFuZ2UoMSwgc3RvcGxpbmUpOgorICAgICAgICAgICAgbGluZWxlbmd0aCA9IGludCh0ZXh0LmluZGV4KCIlZC5lbmQiICUgbGluZSkuc3BsaXQoJy4nKVsxXSkKKyAgICAgICAgICAgIGZvciBjb2wgaW4gKDAsIGxpbmVsZW5ndGgvLzIsIGxpbmVsZW5ndGgpOgorICAgICAgICAgICAgICAgIHRlbXBpbmRleCA9ICIlZC4lZCIgJSAobGluZSwgY29sKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnAuZmluZF9wYXJhZ3JhcGgodGV4dCwgdGVtcGluZGV4KSwgZXhwZWN0ZWQpCisgICAgICAgIHRleHQuZGVsZXRlKCcxLjAnLCAnZW5kJykKKworICAgIGRlZiB0ZXN0X2ZpbmRfY29tbWVudChzZWxmKToKKyAgICAgICAgY29tbWVudCA9ICgKKyAgICAgICAgICAgICIjIENvbW1lbnQgYmxvY2sgd2l0aCBubyBibGFuayBsaW5lcyBiZWZvcmVcbiIKKyAgICAgICAgICAgICIjIENvbW1lbnQgbGluZVxuIgorICAgICAgICAgICAgIlxuIikKKyAgICAgICAgc2VsZi5ydW5jYXNlKGNvbW1lbnQsIDMsICgnMS4wJywgJzMuMCcsICcjJywgY29tbWVudFswOjU4XSkpCisKKyAgICAgICAgY29tbWVudCA9ICgKKyAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICIjIENvbW1lbnQgYmxvY2sgd2l0aCB3aGl0ZXNwYWNlIGxpbmUgYmVmb3JlIGFuZCBhZnRlclxuIgorICAgICAgICAgICAgIiMgQ29tbWVudCBsaW5lXG4iCisgICAgICAgICAgICAiXG4iKQorICAgICAgICBzZWxmLnJ1bmNhc2UoY29tbWVudCwgNCwgKCcyLjAnLCAnNC4wJywgJyMnLCBjb21tZW50WzE6NzBdKSkKKworICAgICAgICBjb21tZW50ID0gKAorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgIiAgICAjIEluZGVudGVkIGNvbW1lbnQgYmxvY2sgd2l0aCB3aGl0ZXNwYWNlIGJlZm9yZSBhbmQgYWZ0ZXJcbiIKKyAgICAgICAgICAgICIgICAgIyBDb21tZW50IGxpbmVcbiIKKyAgICAgICAgICAgICJcbiIpCisgICAgICAgIHNlbGYucnVuY2FzZShjb21tZW50LCA0LCAoJzIuMCcsICc0LjAnLCAnICAgICMnLCBjb21tZW50WzE6ODJdKSkKKworICAgICAgICBjb21tZW50ID0gKAorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgIiMgU2luZ2xlIGxpbmUgY29tbWVudFxuIgorICAgICAgICAgICAgIlxuIikKKyAgICAgICAgc2VsZi5ydW5jYXNlKGNvbW1lbnQsIDMsICgnMi4wJywgJzMuMCcsICcjJywgY29tbWVudFsxOjIzXSkpCisKKyAgICAgICAgY29tbWVudCA9ICgKKyAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICIgICAgIyBTaW5nbGUgbGluZSBjb21tZW50IHdpdGggbGVhZGluZyB3aGl0ZXNwYWNlXG4iCisgICAgICAgICAgICAiXG4iKQorICAgICAgICBzZWxmLnJ1bmNhc2UoY29tbWVudCwgMywgKCcyLjAnLCAnMy4wJywgJyAgICAjJywgY29tbWVudFsxOjUxXSkpCisKKyAgICAgICAgY29tbWVudCA9ICgKKyAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICIjIENvbW1lbnQgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgY29kZVxuIgorICAgICAgICAgICAgInggPSA0MlxuIgorICAgICAgICAgICAgIlxuIikKKyAgICAgICAgc2VsZi5ydW5jYXNlKGNvbW1lbnQsIDMsICgnMi4wJywgJzMuMCcsICcjJywgY29tbWVudFsxOjQwXSkpCisKKyAgICAgICAgY29tbWVudCA9ICgKKyAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICIgICAgIyBJbmRlbnRlZCBjb21tZW50IGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGNvZGVcbiIKKyAgICAgICAgICAgICJ4ID0gNDJcbiIKKyAgICAgICAgICAgICJcbiIpCisgICAgICAgIHNlbGYucnVuY2FzZShjb21tZW50LCAzLCAoJzIuMCcsICczLjAnLCAnICAgICMnLCBjb21tZW50WzE6NTNdKSkKKworICAgICAgICBjb21tZW50ID0gKAorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgIiMgQ29tbWVudCBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBpbmRlbnRlZCBjb2RlXG4iCisgICAgICAgICAgICAiICAgIHggPSA0MlxuIgorICAgICAgICAgICAgIlxuIikKKyAgICAgICAgc2VsZi5ydW5jYXNlKGNvbW1lbnQsIDMsICgnMi4wJywgJzMuMCcsICcjJywgY29tbWVudFsxOjQ5XSkpCisKKyAgICBkZWYgdGVzdF9maW5kX3BhcmFncmFwaChzZWxmKToKKyAgICAgICAgdGVzdHN0cmluZyA9ICgKKyAgICAgICAgICAgICciIiJTdHJpbmcgd2l0aCBubyBibGFuayBsaW5lcyBiZWZvcmVcbicKKyAgICAgICAgICAgICdTdHJpbmcgbGluZVxuJworICAgICAgICAgICAgJyIiIlxuJworICAgICAgICAgICAgJ1xuJykKKyAgICAgICAgc2VsZi5ydW5jYXNlKHRlc3RzdHJpbmcsIDQsICgnMS4wJywgJzQuMCcsICcnLCB0ZXN0c3RyaW5nWzA6NTNdKSkKKworICAgICAgICB0ZXN0c3RyaW5nID0gKAorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgJyIiIlN0cmluZyB3aXRoIHdoaXRlc3BhY2UgbGluZSBiZWZvcmUgYW5kIGFmdGVyXG4nCisgICAgICAgICAgICAnU3RyaW5nIGxpbmUuXG4nCisgICAgICAgICAgICAnIiIiXG4nCisgICAgICAgICAgICAnXG4nKQorICAgICAgICBzZWxmLnJ1bmNhc2UodGVzdHN0cmluZywgNSwgKCcyLjAnLCAnNS4wJywgJycsIHRlc3RzdHJpbmdbMTo2Nl0pKQorCisgICAgICAgIHRlc3RzdHJpbmcgPSAoCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnICAgICIiIkluZGVudGVkIHN0cmluZyB3aXRoIHdoaXRlc3BhY2UgYmVmb3JlIGFuZCBhZnRlclxuJworICAgICAgICAgICAgJyAgICBDb21tZW50IHN0cmluZy5cbicKKyAgICAgICAgICAgICcgICAgIiIiXG4nCisgICAgICAgICAgICAnXG4nKQorICAgICAgICBzZWxmLnJ1bmNhc2UodGVzdHN0cmluZywgNSwgKCcyLjAnLCAnNS4wJywgJyAgICAnLCB0ZXN0c3RyaW5nWzE6ODVdKSkKKworICAgICAgICB0ZXN0c3RyaW5nID0gKAorICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJyIiIlNpbmdsZSBsaW5lIHN0cmluZy4iIiJcbicKKyAgICAgICAgICAgICdcbicpCisgICAgICAgIHNlbGYucnVuY2FzZSh0ZXN0c3RyaW5nLCAzLCAoJzIuMCcsICczLjAnLCAnJywgdGVzdHN0cmluZ1sxOjI3XSkpCisKKyAgICAgICAgdGVzdHN0cmluZyA9ICgKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICcgICAgIiIiU2luZ2xlIGxpbmUgc3RyaW5nIHdpdGggbGVhZGluZyB3aGl0ZXNwYWNlLiIiIlxuJworICAgICAgICAgICAgJ1xuJykKKyAgICAgICAgc2VsZi5ydW5jYXNlKHRlc3RzdHJpbmcsIDMsICgnMi4wJywgJzMuMCcsICcgICAgJywgdGVzdHN0cmluZ1sxOjU1XSkpCisKKworY2xhc3MgUmVmb3JtYXRGdW5jdGlvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhlIHJlZm9ybWF0X3BhcmFncmFwaCBmdW5jdGlvbiB3aXRob3V0IHRoZSBlZGl0b3Igd2luZG93LiIiIgorCisgICAgZGVmIHRlc3RfcmVmb3JtYXRfcGFyYWdyYWgoc2VsZik6CisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICByZWZvcm0gPSBmcC5yZWZvcm1hdF9wYXJhZ3JhcGgKKyAgICAgICAgaHcgPSAiTyBoZWxsbyB3b3JsZCIKKyAgICAgICAgRXF1YWwocmVmb3JtKCcgJywgMSksICcgJykKKyAgICAgICAgRXF1YWwocmVmb3JtKCJIZWxsbyAgICB3b3JsZCIsIDIwKSwgIkhlbGxvICB3b3JsZCIpCisKKyAgICAgICAgIyBUZXN0IHdpdGhvdXQgbGVhZGluZyBuZXdsaW5lCisgICAgICAgIEVxdWFsKHJlZm9ybShodywgMSksICJPXG5oZWxsb1xud29ybGQiKQorICAgICAgICBFcXVhbChyZWZvcm0oaHcsIDYpLCAiT1xuaGVsbG9cbndvcmxkIikKKyAgICAgICAgRXF1YWwocmVmb3JtKGh3LCA3KSwgIk8gaGVsbG9cbndvcmxkIikKKyAgICAgICAgRXF1YWwocmVmb3JtKGh3LCAxMiksICJPIGhlbGxvXG53b3JsZCIpCisgICAgICAgIEVxdWFsKHJlZm9ybShodywgMTMpLCAiTyBoZWxsbyB3b3JsZCIpCisKKyAgICAgICAgIyBUZXN0IHdpdGggbGVhZGluZyBuZXdsaW5lCisgICAgICAgIGh3ID0gIlxuTyBoZWxsbyB3b3JsZCIKKyAgICAgICAgRXF1YWwocmVmb3JtKGh3LCAxKSwgIlxuT1xuaGVsbG9cbndvcmxkIikKKyAgICAgICAgRXF1YWwocmVmb3JtKGh3LCA2KSwgIlxuT1xuaGVsbG9cbndvcmxkIikKKyAgICAgICAgRXF1YWwocmVmb3JtKGh3LCA3KSwgIlxuTyBoZWxsb1xud29ybGQiKQorICAgICAgICBFcXVhbChyZWZvcm0oaHcsIDEyKSwgIlxuTyBoZWxsb1xud29ybGQiKQorICAgICAgICBFcXVhbChyZWZvcm0oaHcsIDEzKSwgIlxuTyBoZWxsbyB3b3JsZCIpCisKKworY2xhc3MgUmVmb3JtYXRDb21tZW50VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB0aGUgcmVmb3JtYXRfY29tbWVudCBmdW5jdGlvbiB3aXRob3V0IHRoZSBlZGl0b3Igd2luZG93LiIiIgorCisgICAgZGVmIHRlc3RfcmVmb3JtYXRfY29tbWVudChzZWxmKToKKyAgICAgICAgRXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCisKKyAgICAgICAgIyByZWZvcm1hdF9jb21tZW50IGZvcm1hdHMgdG8gYSBtaW5pbXVtIG9mIDIwIGNoYXJhY3RlcnMKKyAgICAgICAgdGVzdF9zdHJpbmcgPSAoCisgICAgICAgICAgICAiICAgIFwiXCJcInRoaXMgaXMgYSB0ZXN0IG9mIGEgcmVmb3JtYXQgZm9yIGEgdHJpcGxlIHF1b3RlZCBzdHJpbmciCisgICAgICAgICAgICAiIHdpbGwgaXQgcmVmb3JtYXQgdG8gbGVzcyB0aGFuIDcwIGNoYXJhY3RlcnMgZm9yIG1lP1wiXCJcIiIpCisgICAgICAgIHJlc3VsdCA9IGZwLnJlZm9ybWF0X2NvbW1lbnQodGVzdF9zdHJpbmcsIDcwLCAiICAgICIpCisgICAgICAgIGV4cGVjdGVkID0gKAorICAgICAgICAgICAgIiAgICBcIlwiXCJ0aGlzIGlzIGEgdGVzdCBvZiBhIHJlZm9ybWF0IGZvciBhIHRyaXBsZSBxdW90ZWQgc3RyaW5nIHdpbGwgaXRcbiIKKyAgICAgICAgICAgICIgICAgcmVmb3JtYXQgdG8gbGVzcyB0aGFuIDcwIGNoYXJhY3RlcnMgZm9yIG1lP1wiXCJcIiIpCisgICAgICAgIEVxdWFsKHJlc3VsdCwgZXhwZWN0ZWQpCisKKyAgICAgICAgdGVzdF9jb21tZW50ID0gKAorICAgICAgICAgICAgIiMgdGhpcyBpcyBhIHRlc3Qgb2YgYSByZWZvcm1hdCBmb3IgYSB0cmlwbGUgcXVvdGVkIHN0cmluZyB3aWxsICIKKyAgICAgICAgICAgICJpdCByZWZvcm1hdCB0byBsZXNzIHRoYW4gNzAgY2hhcmFjdGVycyBmb3IgbWU/IikKKyAgICAgICAgcmVzdWx0ID0gZnAucmVmb3JtYXRfY29tbWVudCh0ZXN0X2NvbW1lbnQsIDcwLCAiIyIpCisgICAgICAgIGV4cGVjdGVkID0gKAorICAgICAgICAgICAgIiMgdGhpcyBpcyBhIHRlc3Qgb2YgYSByZWZvcm1hdCBmb3IgYSB0cmlwbGUgcXVvdGVkIHN0cmluZyB3aWxsIGl0XG4iCisgICAgICAgICAgICAiIyByZWZvcm1hdCB0byBsZXNzIHRoYW4gNzAgY2hhcmFjdGVycyBmb3IgbWU/IikKKyAgICAgICAgRXF1YWwocmVzdWx0LCBleHBlY3RlZCkKKworCitjbGFzcyBGb3JtYXRDbGFzc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2luaXRfY2xvc2Uoc2VsZik6CisgICAgICAgIGluc3RhbmNlID0gZnAuRm9ybWF0UGFyYWdyYXBoKCdlZGl0b3InKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3RhbmNlLmVkaXR3aW4sICdlZGl0b3InKQorICAgICAgICBpbnN0YW5jZS5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zdGFuY2UuZWRpdHdpbiwgTm9uZSkKKworCisjIEZvciB0ZXN0aW5nIGZvcm1hdF9wYXJhZ3JhcGhfZXZlbnQsIEluaXRpYWxpemUgRm9ybWF0UGFyYWdyYXBoIHdpdGgKKyMgYSBtb2NrIEVkaXRvciB3aXRoIC50ZXh0IGFuZCAgLmdldF9zZWxlY3Rpb25faW5kaWNlcy4gIFRoZSB0ZXh0IG11c3QKKyMgYmUgYSBUZXh0IHdyYXBwZXIgdGhhdCBhZGRzIHR3byBtZXRob2RzCisKKyMgQSByZWFsIEVkaXRvcldpbmRvdyBjcmVhdGVzIHVubmVlZGVkLCB0aW1lLWNvbnN1bWluZyBiYWdnYWdlIGFuZAorIyBzb21ldGltZXMgZW1pdHMgc2h1dGRvd24gd2FybmluZ3MgbGlrZSB0aGlzOgorIyAid2FybmluZzogY2FsbGJhY2sgZmFpbGVkIGluIFdpbmRvd0xpc3QgPGNsYXNzICdfdGtpbnRlci5UY2xFcnJvcic+CisjIDogaW52YWxpZCBjb21tYW5kIG5hbWUgIi41NTEzMTM2OC53aW5kb3dzIi4KKyMgQ2FsbGluZyBFZGl0b3JXaW5kb3cuX2Nsb3NlIGluIHRlYXJEb3duQ2xhc3MgcHJldmVudHMgdGhpcyBidXQgY2F1c2VzCisjIG90aGVyIHByb2JsZW1zICh3aW5kb3dzIGxlZnQgb3BlbikuCisKK2NsYXNzIFRleHRXcmFwcGVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIpOgorICAgICAgICBzZWxmLnRleHQgPSBUZXh0KG1hc3Rlcj1tYXN0ZXIpCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLnRleHQsIG5hbWUpCisgICAgZGVmIHVuZG9fYmxvY2tfc3RhcnQoc2VsZik6IHBhc3MKKyAgICBkZWYgdW5kb19ibG9ja19zdG9wKHNlbGYpOiBwYXNzCisKK2NsYXNzIEVkaXRvcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdCk6CisgICAgICAgIHNlbGYudGV4dCA9IFRleHRXcmFwcGVyKHJvb3QpCisgICAgZ2V0X3NlbGVjdGlvbl9pbmRpY2VzID0gRWRpdG9yV2luZG93LiBnZXRfc2VsZWN0aW9uX2luZGljZXMuaW1fZnVuYworCitjbGFzcyBGb3JtYXRFdmVudFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhlIGZvcm1hdHRpbmcgb2YgdGV4dCBpbnNpZGUgYSBUZXh0IHdpZGdldC4KKworICAgIFRoaXMgaXMgZG9uZSB3aXRoIEZvcm1hdFBhcmFncmFwaC5mb3JtYXQucGFyYWdyYXBoX2V2ZW50LAorICAgIHdoaWNoIGNhbGxzIGZ1bmN0aW9ucyBpbiB0aGUgbW9kdWxlIGFzIGFwcHJvcHJpYXRlLgorICAgICIiIgorICAgIHRlc3Rfc3RyaW5nID0gKAorICAgICAgICAiICAgICcnJ3RoaXMgaXMgYSB0ZXN0IG9mIGEgcmVmb3JtYXQgZm9yIGEgdHJpcGxlICIKKyAgICAgICAgInF1b3RlZCBzdHJpbmcgd2lsbCBpdCByZWZvcm1hdCB0byBsZXNzIHRoYW4gNzAgIgorICAgICAgICAiY2hhcmFjdGVycyBmb3IgbWU/JycnXG4iKQorICAgIG11bHRpbGluZV90ZXN0X3N0cmluZyA9ICgKKyAgICAgICAgIiAgICAnJydUaGUgZmlyc3QgbGluZSBpcyB1bmRlciB0aGUgbWF4IHdpZHRoLlxuIgorICAgICAgICAiICAgIFRoZSBzZWNvbmQgbGluZSdzIGxlbmd0aCBpcyB3YXkgb3ZlciB0aGUgbWF4IHdpZHRoLiBJdCBnb2VzICIKKyAgICAgICAgIm9uIGFuZCBvbiB1bnRpbCBpdCBpcyBvdmVyIDEwMCBjaGFyYWN0ZXJzIGxvbmcuXG4iCisgICAgICAgICIgICAgU2FtZSB0aGluZyB3aXRoIHRoZSB0aGlyZCBsaW5lLiBJdCBpcyBhbHNvIHdheSBvdmVyIHRoZSBtYXggIgorICAgICAgICAid2lkdGgsIGJ1dCBGb3JtYXRQYXJhZ3JhcGggd2lsbCBmaXggaXQuXG4iCisgICAgICAgICIgICAgJycnXG4iKQorICAgIG11bHRpbGluZV90ZXN0X2NvbW1lbnQgPSAoCisgICAgICAgICIjIFRoZSBmaXJzdCBsaW5lIGlzIHVuZGVyIHRoZSBtYXggd2lkdGguXG4iCisgICAgICAgICIjIFRoZSBzZWNvbmQgbGluZSdzIGxlbmd0aCBpcyB3YXkgb3ZlciB0aGUgbWF4IHdpZHRoLiBJdCBnb2VzIG9uICIKKyAgICAgICAgImFuZCBvbiB1bnRpbCBpdCBpcyBvdmVyIDEwMCBjaGFyYWN0ZXJzIGxvbmcuXG4iCisgICAgICAgICIjIFNhbWUgdGhpbmcgd2l0aCB0aGUgdGhpcmQgbGluZS4gSXQgaXMgYWxzbyB3YXkgb3ZlciB0aGUgbWF4ICIKKyAgICAgICAgIndpZHRoLCBidXQgRm9ybWF0UGFyYWdyYXBoIHdpbGwgZml4IGl0LlxuIgorICAgICAgICAiIyBUaGUgZm91cnRoIGxpbmUgaXMgc2hvcnQgbGlrZSB0aGUgZmlyc3QgbGluZS4iKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgcmVxdWlyZXMoJ2d1aScpCisgICAgICAgIGNscy5yb290ID0gVGsoKQorICAgICAgICBlZGl0b3IgPSBFZGl0b3Iocm9vdD1jbHMucm9vdCkKKyAgICAgICAgY2xzLnRleHQgPSBlZGl0b3IudGV4dC50ZXh0ICAjIFRlc3QgY29kZSBkb2VzIG5vdCBuZWVkIHRoZSB3cmFwcGVyLgorICAgICAgICBjbHMuZm9ybWF0dGVyID0gZnAuRm9ybWF0UGFyYWdyYXBoKGVkaXRvcikuZm9ybWF0X3BhcmFncmFwaF9ldmVudAorICAgICAgICAjIFNldHMgdGhlIGluc2VydCBtYXJrIGp1c3QgYWZ0ZXIgdGhlIHJlLXdyYXBwZWQgYW5kIGluc2VydGVkICB0ZXh0LgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKKyAgICAgICAgY2xzLnJvb3QuZGVzdHJveSgpCisgICAgICAgIGRlbCBjbHMucm9vdAorICAgICAgICBkZWwgY2xzLnRleHQKKyAgICAgICAgZGVsIGNscy5mb3JtYXR0ZXIKKworICAgIGRlZiB0ZXN0X3Nob3J0X2xpbmUoc2VsZik6CisgICAgICAgIHNlbGYudGV4dC5pbnNlcnQoJzEuMCcsICJTaG9ydCBsaW5lXG4iKQorICAgICAgICBzZWxmLmZvcm1hdHRlcigiRHVtbXkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGV4dC5nZXQoJzEuMCcsICdpbnNlcnQnKSwgIlNob3J0IGxpbmVcbiIgKQorICAgICAgICBzZWxmLnRleHQuZGVsZXRlKCcxLjAnLCAnZW5kJykKKworICAgIGRlZiB0ZXN0X2xvbmdfbGluZShzZWxmKToKKyAgICAgICAgdGV4dCA9IHNlbGYudGV4dAorCisgICAgICAgICMgU2V0IGN1cnNvciAoJ2luc2VydCcgbWFyaykgdG8gJzEuMCcsIHdpdGhpbiB0ZXh0LgorICAgICAgICB0ZXh0Lmluc2VydCgnMS4wJywgc2VsZi50ZXN0X3N0cmluZykKKyAgICAgICAgdGV4dC5tYXJrX3NldCgnaW5zZXJ0JywgJzEuMCcpCisgICAgICAgIHNlbGYuZm9ybWF0dGVyKCdQYXJhbWV0ZXJEb2VzTm90aGluZycsIGxpbWl0PTcwKQorICAgICAgICByZXN1bHQgPSB0ZXh0LmdldCgnMS4wJywgJ2luc2VydCcpCisgICAgICAgICMgZmluZCBmdW5jdGlvbiBpbmNsdWRlcyBcbgorICAgICAgICBleHBlY3RlZCA9ICgKKyIgICAgJycndGhpcyBpcyBhIHRlc3Qgb2YgYSByZWZvcm1hdCBmb3IgYSB0cmlwbGUgcXVvdGVkIHN0cmluZyB3aWxsIGl0XG4iCisiICAgIHJlZm9ybWF0IHRvIGxlc3MgdGhhbiA3MCBjaGFyYWN0ZXJzIGZvciBtZT8nJydcbiIpICAjIHllcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZXhwZWN0ZWQpCisgICAgICAgIHRleHQuZGVsZXRlKCcxLjAnLCAnZW5kJykKKworICAgICAgICAjIFNlbGVjdCBmcm9tIDEuMTEgdG8gbGluZSBlbmQuCisgICAgICAgIHRleHQuaW5zZXJ0KCcxLjAnLCBzZWxmLnRlc3Rfc3RyaW5nKQorICAgICAgICB0ZXh0LnRhZ19hZGQoJ3NlbCcsICcxLjExJywgJzEuZW5kJykKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIoJ1BhcmFtZXRlckRvZXNOb3RoaW5nJywgbGltaXQ9NzApCisgICAgICAgIHJlc3VsdCA9IHRleHQuZ2V0KCcxLjAnLCAnaW5zZXJ0JykKKyAgICAgICAgIyBzZWxlY3Rpb24gZXhjbHVkZXMgXG4KKyAgICAgICAgZXhwZWN0ZWQgPSAoCisiICAgICcnJ3RoaXMgaXMgYSB0ZXN0IG9mIGEgcmVmb3JtYXQgZm9yIGEgdHJpcGxlIHF1b3RlZCBzdHJpbmcgd2lsbCBpdCByZWZvcm1hdFxuIgorIiB0byBsZXNzIHRoYW4gNzAgY2hhcmFjdGVycyBmb3IgbWU/JycnIikgICMgbm8KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGV4cGVjdGVkKQorICAgICAgICB0ZXh0LmRlbGV0ZSgnMS4wJywgJ2VuZCcpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBsZV9saW5lcyhzZWxmKToKKyAgICAgICAgdGV4dCA9IHNlbGYudGV4dAorICAgICAgICAjICBTZWxlY3QgMiBsb25nIGxpbmVzLgorICAgICAgICB0ZXh0Lmluc2VydCgnMS4wJywgc2VsZi5tdWx0aWxpbmVfdGVzdF9zdHJpbmcpCisgICAgICAgIHRleHQudGFnX2FkZCgnc2VsJywgJzIuMCcsICc0LjAnKQorICAgICAgICBzZWxmLmZvcm1hdHRlcignUGFyYW1ldGVyRG9lc05vdGhpbmcnLCBsaW1pdD03MCkKKyAgICAgICAgcmVzdWx0ID0gdGV4dC5nZXQoJzIuMCcsICdpbnNlcnQnKQorICAgICAgICBleHBlY3RlZCA9ICgKKyIgICAgVGhlIHNlY29uZCBsaW5lJ3MgbGVuZ3RoIGlzIHdheSBvdmVyIHRoZSBtYXggd2lkdGguIEl0IGdvZXMgb24gYW5kXG4iCisiICAgIG9uIHVudGlsIGl0IGlzIG92ZXIgMTAwIGNoYXJhY3RlcnMgbG9uZy4gU2FtZSB0aGluZyB3aXRoIHRoZSB0aGlyZFxuIgorIiAgICBsaW5lLiBJdCBpcyBhbHNvIHdheSBvdmVyIHRoZSBtYXggd2lkdGgsIGJ1dCBGb3JtYXRQYXJhZ3JhcGggd2lsbFxuIgorIiAgICBmaXggaXQuXG4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZXhwZWN0ZWQpCisgICAgICAgIHRleHQuZGVsZXRlKCcxLjAnLCAnZW5kJykKKworICAgIGRlZiB0ZXN0X2NvbW1lbnRfYmxvY2soc2VsZik6CisgICAgICAgIHRleHQgPSBzZWxmLnRleHQKKworICAgICAgICAjIFNldCBjdXJzb3IgKCdpbnNlcnQnKSB0byAnMS4wJywgd2l0aGluIGJsb2NrLgorICAgICAgICB0ZXh0Lmluc2VydCgnMS4wJywgc2VsZi5tdWx0aWxpbmVfdGVzdF9jb21tZW50KQorICAgICAgICBzZWxmLmZvcm1hdHRlcignUGFyYW1ldGVyRG9lc05vdGhpbmcnLCBsaW1pdD03MCkKKyAgICAgICAgcmVzdWx0ID0gdGV4dC5nZXQoJzEuMCcsICdpbnNlcnQnKQorICAgICAgICBleHBlY3RlZCA9ICgKKyIjIFRoZSBmaXJzdCBsaW5lIGlzIHVuZGVyIHRoZSBtYXggd2lkdGguIFRoZSBzZWNvbmQgbGluZSdzIGxlbmd0aCBpc1xuIgorIiMgd2F5IG92ZXIgdGhlIG1heCB3aWR0aC4gSXQgZ29lcyBvbiBhbmQgb24gdW50aWwgaXQgaXMgb3ZlciAxMDBcbiIKKyIjIGNoYXJhY3RlcnMgbG9uZy4gU2FtZSB0aGluZyB3aXRoIHRoZSB0aGlyZCBsaW5lLiBJdCBpcyBhbHNvIHdheSBvdmVyXG4iCisiIyB0aGUgbWF4IHdpZHRoLCBidXQgRm9ybWF0UGFyYWdyYXBoIHdpbGwgZml4IGl0LiBUaGUgZm91cnRoIGxpbmUgaXNcbiIKKyIjIHNob3J0IGxpa2UgdGhlIGZpcnN0IGxpbmUuXG4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZXhwZWN0ZWQpCisgICAgICAgIHRleHQuZGVsZXRlKCcxLjAnLCAnZW5kJykKKworICAgICAgICAjIFNlbGVjdCBsaW5lIDIsIHZlcmlmeSBsaW5lIDEgdW5hZmZlY3RlZC4KKyAgICAgICAgdGV4dC5pbnNlcnQoJzEuMCcsIHNlbGYubXVsdGlsaW5lX3Rlc3RfY29tbWVudCkKKyAgICAgICAgdGV4dC50YWdfYWRkKCdzZWwnLCAnMi4wJywgJzMuMCcpCisgICAgICAgIHNlbGYuZm9ybWF0dGVyKCdQYXJhbWV0ZXJEb2VzTm90aGluZycsIGxpbWl0PTcwKQorICAgICAgICByZXN1bHQgPSB0ZXh0LmdldCgnMS4wJywgJ2luc2VydCcpCisgICAgICAgIGV4cGVjdGVkID0gKAorIiMgVGhlIGZpcnN0IGxpbmUgaXMgdW5kZXIgdGhlIG1heCB3aWR0aC5cbiIKKyIjIFRoZSBzZWNvbmQgbGluZSdzIGxlbmd0aCBpcyB3YXkgb3ZlciB0aGUgbWF4IHdpZHRoLiBJdCBnb2VzIG9uIGFuZFxuIgorIiMgb24gdW50aWwgaXQgaXMgb3ZlciAxMDAgY2hhcmFjdGVycyBsb25nLlxuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGV4cGVjdGVkKQorICAgICAgICB0ZXh0LmRlbGV0ZSgnMS4wJywgJ2VuZCcpCisKKyMgVGhlIGZvbGxvd2luZyBibG9jayB3b3JrZWQgd2l0aCBFZGl0b3JXaW5kb3cgYnV0IGZhaWxzIHdpdGggdGhlIG1vY2suCisjIExpbmVzIDIgYW5kIDMgZ2V0IHBhc3RlZCB0b2dldGhlciBldmVuIHRob3VnaCB0aGUgcHJldmlvdXMgYmxvY2sgbGVmdAorIyB0aGUgcHJldmlvdXMgbGluZSBhbG9uZS4gTW9yZSBpbnZlc3RpZ2F0aW9uIGlzIG5lZWRlZC4KKyMjICAgICAgICAjIFNlbGVjdCBsaW5lcyAzIGFuZCA0CisjIyAgICAgICAgdGV4dC5pbnNlcnQoJzEuMCcsIHNlbGYubXVsdGlsaW5lX3Rlc3RfY29tbWVudCkKKyMjICAgICAgICB0ZXh0LnRhZ19hZGQoJ3NlbCcsICczLjAnLCAnNS4wJykKKyMjICAgICAgICBzZWxmLmZvcm1hdHRlcignUGFyYW1ldGVyRG9lc05vdGhpbmcnKQorIyMgICAgICAgIHJlc3VsdCA9IHRleHQuZ2V0KCczLjAnLCAnaW5zZXJ0JykKKyMjICAgICAgICBleHBlY3RlZCA9ICgKKyMjIiMgU2FtZSB0aGluZyB3aXRoIHRoZSB0aGlyZCBsaW5lLiBJdCBpcyBhbHNvIHdheSBvdmVyIHRoZSBtYXggd2lkdGgsXG4iCisjIyIjIGJ1dCBGb3JtYXRQYXJhZ3JhcGggd2lsbCBmaXggaXQuIFRoZSBmb3VydGggbGluZSBpcyBzaG9ydCBsaWtlIHRoZVxuIgorIyMiIyBmaXJzdCBsaW5lLlxuIikKKyMjICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZXhwZWN0ZWQpCisjIyAgICAgICAgdGV4dC5kZWxldGUoJzEuMCcsICdlbmQnKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MiwgZXhpdD0yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZ3JlcC5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2dyZXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlmNGYyMgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2dyZXAucHkKQEAgLTAsMCArMSw4MiBAQAorIiIiICFDaGFuZ2luZyB0aGlzIGxpbmUgd2lsbCBicmVhayBUZXN0X2ZpbmRmaWxlLnRlc3RfZm91bmQhCitOb24tZ3VpIHVuaXQgdGVzdHMgZm9yIGlkbGVsaWIuR3JlcERpYWxvZyBtZXRob2RzLgorZHVtbXlfY29tbWFuZCBjYWxscyBncmVwX2l0IGNhbGxzIGZpbmRmaWxlcy4KK0FuIGV4Y2VwdGlvbiByYWlzZWQgaW4gb25lIG1ldGhvZCB3aWxsIGZhaWwgY2FsbGVycy4KK090aGVyd2lzZSwgdGVzdHMgYXJlIG1vc3RseSBpbmRlcGVuZGVudC4KKyoqKiBDdXJyZW50bHkgb25seSB0ZXN0IGdyZXBfaXQuCisiIiIKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgY2FwdHVyZWRfc3Rkb3V0LCBmaW5kZmlsZQorZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX3RrIGltcG9ydCBWYXIKK2Zyb20gaWRsZWxpYi5HcmVwRGlhbG9nIGltcG9ydCBHcmVwRGlhbG9nCitpbXBvcnQgcmUKKworX19maWxlX18gPSBmaW5kZmlsZSgnaWRsZWxpYi9pZGxlX3Rlc3QnKSArICcvdGVzdF9ncmVwLnB5JworCitjbGFzcyBEdW1teV9zZWFyY2hlbmdpbmU6CisgICAgJycnR3JlcERpYWxvZy5fX2luaXRfXyBjYWxscyBwYXJlbnQgU2VhcmNoRGlhYm9sQmFzZSB3aGljaCBhdHRhY2hlcyB0aGUKKyAgICBwYXNzZWQgaW4gU2VhcmNoRW5naW5lIGluc3RhbmNlIGFzIGF0dHJpYnV0ZSAnZW5naW5lJy4gT25seSBhIGZldyBvZiB0aGUKKyAgICBtYW55IHBvc3NpYmxlIHNlbGYuZW5naW5lLnggYXR0cmlidXRlcyBhcmUgbmVlZGVkIGhlcmUuCisgICAgJycnCisgICAgZGVmIGdldHBhdChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3BhdAorCitzZWFyY2hlbmdpbmUgPSBEdW1teV9zZWFyY2hlbmdpbmUoKQorCitjbGFzcyBEdW1teV9ncmVwOgorICAgICMgTWV0aG9kcyB0ZXN0ZWQKKyAgICAjZGVmYXVsdF9jb21tYW5kID0gR3JlcERpYWxvZy5kZWZhdWx0X2NvbW1hbmQKKyAgICBncmVwX2l0ID0gR3JlcERpYWxvZy5ncmVwX2l0LmltX2Z1bmMKKyAgICBmaW5kZmlsZXMgPSBHcmVwRGlhbG9nLmZpbmRmaWxlcy5pbV9mdW5jCisgICAgIyBPdGhlciBzdHVmZiBuZWVkZWQKKyAgICByZWN2YXIgPSBWYXIoRmFsc2UpCisgICAgZW5naW5lID0gc2VhcmNoZW5naW5lCisgICAgZGVmIGNsb3NlKHNlbGYpOiAgIyBndWkgbWV0aG9kCisgICAgICAgIHBhc3MKKworZ3JlcCA9IER1bW15X2dyZXAoKQorCitjbGFzcyBGaW5kZmlsZXNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIGZpbmRmaWxlcyBpcyByZWFsbHkgYSBmdW5jdGlvbiwgbm90IGEgbWV0aG9kLCBjb3VsZCBiZSBpdGVyYXRvcgorICAgICMgdGVzdCB0aGF0IGZpbGVuYW1lIHJldHVybiBmaWxlbmFtZQorICAgICMgdGVzdCB0aGF0IGlkbGVsaWIgaGFzIG1hbnkgLnB5IGZpbGVzCisgICAgIyB0ZXN0IHRoYXQgcmVjdXJzaXZlIGZsYWcgYWRkcyBpZGxlX3Rlc3QgLnB5IGZpbGVzCisgICAgcGFzcworCitjbGFzcyBHcmVwX2l0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBUZXN0IGNhcHR1cmVkIHJlcG9ydHMgd2l0aCAwIGFuZCBzb21lIGhpdHMuCisgICAgIyBTaG91bGQgdGVzdCBmaWxlIG5hbWVzLCBidXQgV2luZG93cyByZXBvcnRzIGhhdmUgbWl4ZWQgLyBhbmQgXCBzZXBhcmF0b3JzCisgICAgIyBmcm9tIGluY29tcGxldGUgcmVwbGFjZW1lbnQsIHNvICdsYXRlcicuCisKKyAgICBkZWYgcmVwb3J0KHNlbGYsIHBhdCk6CisgICAgICAgIGdyZXAuZW5naW5lLl9wYXQgPSBwYXQKKyAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBzOgorICAgICAgICAgICAgZ3JlcC5ncmVwX2l0KHJlLmNvbXBpbGUocGF0KSwgX19maWxlX18pCisgICAgICAgIGxpbmVzID0gcy5nZXR2YWx1ZSgpLnNwbGl0KCdcbicpCisgICAgICAgIGxpbmVzLnBvcCgpICAjIHJlbW92ZSBib2d1cyAnJyBhZnRlciBsYXN0IFxuCisgICAgICAgIHJldHVybiBsaW5lcworCisgICAgZGVmIHRlc3RfdW5mb3VuZChzZWxmKToKKyAgICAgICAgcGF0ID0gJ3h5eionKjcKKyAgICAgICAgbGluZXMgPSBzZWxmLnJlcG9ydChwYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpbmVzKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRJbihwYXQsIGxpbmVzWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmVzWzFdLCAnTm8gaGl0cy4nKQorCisgICAgZGVmIHRlc3RfZm91bmQoc2VsZik6CisKKyAgICAgICAgcGF0ID0gJyIiIiAhQ2hhbmdpbmcgdGhpcyBsaW5lIHdpbGwgYnJlYWsgVGVzdF9maW5kZmlsZS50ZXN0X2ZvdW5kIScKKyAgICAgICAgbGluZXMgPSBzZWxmLnJlcG9ydChwYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpbmVzKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihwYXQsIGxpbmVzWzBdKQorICAgICAgICBzZWxmLmFzc2VydEluKCdweTogMTonLCBsaW5lc1sxXSkgICMgbGluZSBudW1iZXIgMQorICAgICAgICBzZWxmLmFzc2VydEluKCcyJywgbGluZXNbM10pICAjIGhpdHMgZm91bmQgMgorICAgICAgICBzZWxmLmFzc2VydFRydWUobGluZXNbNF0uc3RhcnRzd2l0aCgnKEhpbnQ6JykpCisKK2NsYXNzIERlZmF1bHRfY29tbWFuZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgVG8gd3JpdGUgdGhpcywgbW9kZSBPdXRwdXRXaW5kb3cgaW1wb3J0IHRvIHRvcCBvZiBHcmVwRGlhbG9nCisgICAgIyBzbyBpdCBjYW4gYmUgcmVwbGFjZWQgYnkgY2FwdHVyZWRfc3Rkb3V0IGluIGNsYXNzIHNldHVwL3RlYXJkb3duLgorICAgIHBhc3MKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaHlwZXJwYXJzZXIucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9oeXBlcnBhcnNlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDgwNjg0Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaHlwZXJwYXJzZXIucHkKQEAgLTAsMCArMSwxOTEgQEAKKyIiIlVuaXR0ZXN0IGZvciBpZGxlbGliLkh5cGVyUGFyc2VyIiIiCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCitmcm9tIFRraW50ZXIgaW1wb3J0IFRrLCBUZXh0Citmcm9tIGlkbGVsaWIuRWRpdG9yV2luZG93IGltcG9ydCBFZGl0b3JXaW5kb3cKK2Zyb20gaWRsZWxpYi5IeXBlclBhcnNlciBpbXBvcnQgSHlwZXJQYXJzZXIKKworY2xhc3MgRHVtbXlFZGl0d2luOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXh0KToKKyAgICAgICAgc2VsZi50ZXh0ID0gdGV4dAorICAgICAgICBzZWxmLmluZGVudHdpZHRoID0gOAorICAgICAgICBzZWxmLnRhYndpZHRoID0gOAorICAgICAgICBzZWxmLmNvbnRleHRfdXNlX3BzMSA9IFRydWUKKyAgICAgICAgc2VsZi5udW1fY29udGV4dF9saW5lcyA9IDUwLCA1MDAsIDEwMDAKKworICAgIF9idWlsZF9jaGFyX2luX3N0cmluZ19mdW5jID0gRWRpdG9yV2luZG93Ll9idWlsZF9jaGFyX2luX3N0cmluZ19mdW5jLmltX2Z1bmMKKyAgICBpc19jaGFyX2luX3N0cmluZyA9IEVkaXRvcldpbmRvdy5pc19jaGFyX2luX3N0cmluZy5pbV9mdW5jCisKKworY2xhc3MgSHlwZXJQYXJzZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBjb2RlID0gKAorICAgICAgICAgICAgJyIiIlRoaXMgaXMgYSBtb2R1bGUgZG9jc3RyaW5nIiIiXG4nCisgICAgICAgICAgICAnIyB0aGlzIGxpbmUgaXMgYSBjb21tZW50XG4nCisgICAgICAgICAgICAneCA9ICJ0aGlzIGlzIGEgc3RyaW5nIlxuJworICAgICAgICAgICAgInkgPSAndGhpcyBpcyBhbHNvIGEgc3RyaW5nJ1xuIgorICAgICAgICAgICAgJ2wgPSBbaSBmb3IgaSBpbiByYW5nZSgxMCldXG4nCisgICAgICAgICAgICAnbSA9IFtweSpweSBmb3IgIyBjb21tZW50XG4nCisgICAgICAgICAgICAnICAgICAgIHB5IGluIGxdXG4nCisgICAgICAgICAgICAneC5fX2xlbl9fXG4nCisgICAgICAgICAgICAieiA9ICgocidhc2RmJykrKCdhJykpKVxuIgorICAgICAgICAgICAgJ1t4IGZvciB4IGluXG4nCisgICAgICAgICAgICAnZm9yID0gRmFsc2VcbicKKyAgICAgICAgICAgICkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIHJlcXVpcmVzKCdndWknKQorICAgICAgICBjbHMucm9vdCA9IFRrKCkKKyAgICAgICAgY2xzLnRleHQgPSBUZXh0KGNscy5yb290KQorICAgICAgICBjbHMuZWRpdHdpbiA9IER1bW15RWRpdHdpbihjbHMudGV4dCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgIGRlbCBjbHMudGV4dCwgY2xzLmVkaXR3aW4KKyAgICAgICAgY2xzLnJvb3QuZGVzdHJveSgpCisgICAgICAgIGRlbCBjbHMucm9vdAorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnRleHQuaW5zZXJ0KCdpbnNlcnQnLCBzZWxmLmNvZGUpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYudGV4dC5kZWxldGUoJzEuMCcsICdlbmQnKQorICAgICAgICBzZWxmLmVkaXR3aW4uY29udGV4dF91c2VfcHMxID0gVHJ1ZQorCisgICAgZGVmIGdldF9wYXJzZXIoc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgcGFyc2VyIG9iamVjdCB3aXRoIGluZGV4IGF0ICdpbmRleCcKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBIeXBlclBhcnNlcihzZWxmLmVkaXR3aW4sIGluZGV4KQorCisgICAgZGVmIHRlc3RfaW5pdChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIHRlc3QgY29ybmVyIGNhc2VzIGluIHRoZSBpbml0IG1ldGhvZAorICAgICAgICAiIiIKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKSBhcyB2ZToKKyAgICAgICAgICAgIHNlbGYudGV4dC50YWdfYWRkKCdjb25zb2xlJywgJzEuMCcsICcxLmVuZCcpCisgICAgICAgICAgICBwID0gc2VsZi5nZXRfcGFyc2VyKCcxLjUnKQorICAgICAgICBzZWxmLmFzc2VydEluKCdwcmVjZWRlcycsIHN0cih2ZS5leGNlcHRpb24pKQorCisgICAgICAgICMgdGVzdCB3aXRob3V0IHBzMQorICAgICAgICBzZWxmLmVkaXR3aW4uY29udGV4dF91c2VfcHMxID0gRmFsc2UKKworICAgICAgICAjIG51bWJlciBvZiBsaW5lcyBsZXNzZXIgdGhhbiA1MAorICAgICAgICBwID0gc2VsZi5nZXRfcGFyc2VyKCdlbmQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucmF3dGV4dCwgc2VsZi50ZXh0LmdldCgnMS4wJywgJ2VuZCcpKQorCisgICAgICAgICMgbnVtYmVyIG9mIGxpbmVzIGdyZWF0ZXIgdGhhbiA1MAorICAgICAgICBzZWxmLnRleHQuaW5zZXJ0KCdlbmQnLCBzZWxmLnRleHQuZ2V0KCcxLjAnLCAnZW5kJykqNCkKKyAgICAgICAgcCA9IHNlbGYuZ2V0X3BhcnNlcignNTQuNScpCisKKyAgICBkZWYgdGVzdF9pc19pbl9zdHJpbmcoc2VsZik6CisgICAgICAgIGdldCA9IHNlbGYuZ2V0X3BhcnNlcgorCisgICAgICAgIHAgPSBnZXQoJzEuMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocC5pc19pbl9zdHJpbmcoKSkKKyAgICAgICAgcCA9IGdldCgnMS40JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHAuaXNfaW5fc3RyaW5nKCkpCisgICAgICAgIHAgPSBnZXQoJzIuMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocC5pc19pbl9zdHJpbmcoKSkKKyAgICAgICAgcCA9IGdldCgnMy4zJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwLmlzX2luX3N0cmluZygpKQorICAgICAgICBwID0gZ2V0KCczLjcnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocC5pc19pbl9zdHJpbmcoKSkKKyAgICAgICAgcCA9IGdldCgnNC42JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHAuaXNfaW5fc3RyaW5nKCkpCisKKyAgICBkZWYgdGVzdF9pc19pbl9jb2RlKHNlbGYpOgorICAgICAgICBnZXQgPSBzZWxmLmdldF9wYXJzZXIKKworICAgICAgICBwID0gZ2V0KCcxLjAnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocC5pc19pbl9jb2RlKCkpCisgICAgICAgIHAgPSBnZXQoJzEuMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocC5pc19pbl9jb2RlKCkpCisgICAgICAgIHAgPSBnZXQoJzIuNScpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocC5pc19pbl9jb2RlKCkpCisgICAgICAgIHAgPSBnZXQoJzMuNCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwLmlzX2luX2NvZGUoKSkKKyAgICAgICAgcCA9IGdldCgnMy42JykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwLmlzX2luX2NvZGUoKSkKKyAgICAgICAgcCA9IGdldCgnNC4xNCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocC5pc19pbl9jb2RlKCkpCisKKyAgICBkZWYgdGVzdF9nZXRfc3Vycm91bmRpbmdfYnJhY2tldChzZWxmKToKKyAgICAgICAgZ2V0ID0gc2VsZi5nZXRfcGFyc2VyCisKKyAgICAgICAgZGVmIHdpdGhvdXRfbXVzdGNsb3NlKHBhcnNlcik6CisgICAgICAgICAgICAjIGEgdXRpbGl0eSBmdW5jdGlvbiB0byBnZXQgc3Vycm91bmRpbmcgYnJhY2tldAorICAgICAgICAgICAgIyB3aXRoIG11c3RjbG9zZT1GYWxzZQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlci5nZXRfc3Vycm91bmRpbmdfYnJhY2tldHMobXVzdGNsb3NlPUZhbHNlKQorCisgICAgICAgIGRlZiB3aXRoX211c3RjbG9zZShwYXJzZXIpOgorICAgICAgICAgICAgIyBhIHV0aWxpdHkgZnVuY3Rpb24gdG8gZ2V0IHN1cnJvdW5kaW5nIGJyYWNrZXQKKyAgICAgICAgICAgICMgd2l0aCBtdXN0Y2xvc2U9VHJ1ZQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlci5nZXRfc3Vycm91bmRpbmdfYnJhY2tldHMobXVzdGNsb3NlPVRydWUpCisKKyAgICAgICAgcCA9IGdldCgnMy4yJykKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUod2l0aF9tdXN0Y2xvc2UocCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHdpdGhvdXRfbXVzdGNsb3NlKHApKQorCisgICAgICAgIHAgPSBnZXQoJzUuNicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHVwbGVFcXVhbCh3aXRob3V0X211c3RjbG9zZShwKSwgKCc1LjQnLCAnNS4yNScpKQorICAgICAgICBzZWxmLmFzc2VydFR1cGxlRXF1YWwod2l0aG91dF9tdXN0Y2xvc2UocCksIHdpdGhfbXVzdGNsb3NlKHApKQorCisgICAgICAgIHAgPSBnZXQoJzUuMjMnKQorICAgICAgICBzZWxmLmFzc2VydFR1cGxlRXF1YWwod2l0aG91dF9tdXN0Y2xvc2UocCksICgnNS4yMScsICc1LjI0JykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHVwbGVFcXVhbCh3aXRob3V0X211c3RjbG9zZShwKSwgd2l0aF9tdXN0Y2xvc2UocCkpCisKKyAgICAgICAgcCA9IGdldCgnNi4xNScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHVwbGVFcXVhbCh3aXRob3V0X211c3RjbG9zZShwKSwgKCc2LjQnLCAnNi5lbmQnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUod2l0aF9tdXN0Y2xvc2UocCkpCisKKyAgICAgICAgcCA9IGdldCgnOS5lbmQnKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZSh3aXRoX211c3RjbG9zZShwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUod2l0aG91dF9tdXN0Y2xvc2UocCkpCisKKyAgICBkZWYgdGVzdF9nZXRfZXhwcmVzc2lvbihzZWxmKToKKyAgICAgICAgZ2V0ID0gc2VsZi5nZXRfcGFyc2VyCisKKyAgICAgICAgcCA9IGdldCgnNC4yJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmdldF9leHByZXNzaW9uKCksICd5ICcpCisKKyAgICAgICAgcCA9IGdldCgnNC43JykKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKSBhcyB2ZToKKyAgICAgICAgICAgIHAuZ2V0X2V4cHJlc3Npb24oKQorICAgICAgICBzZWxmLmFzc2VydEluKCdpcyBpbnNpZGUgYSBjb2RlJywgc3RyKHZlLmV4Y2VwdGlvbikpCisKKyAgICAgICAgcCA9IGdldCgnNS4yNScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5nZXRfZXhwcmVzc2lvbigpLCAncmFuZ2UoMTApJykKKworICAgICAgICBwID0gZ2V0KCc2LjcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuZ2V0X2V4cHJlc3Npb24oKSwgJ3B5JykKKworICAgICAgICBwID0gZ2V0KCc2LjgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuZ2V0X2V4cHJlc3Npb24oKSwgJycpCisKKyAgICAgICAgcCA9IGdldCgnNy45JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmdldF9leHByZXNzaW9uKCksICdweScpCisKKyAgICAgICAgcCA9IGdldCgnOC5lbmQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuZ2V0X2V4cHJlc3Npb24oKSwgJ3guX19sZW5fXycpCisKKyAgICAgICAgcCA9IGdldCgnOS4xMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5nZXRfZXhwcmVzc2lvbigpLCAicidhc2RmJyIpCisKKyAgICAgICAgcCA9IGdldCgnOS4xNycpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcikgYXMgdmU6CisgICAgICAgICAgICBwLmdldF9leHByZXNzaW9uKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignaXMgaW5zaWRlIGEgY29kZScsIHN0cih2ZS5leGNlcHRpb24pKQorCisgICAgICAgIHAgPSBnZXQoJzEwLjAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuZ2V0X2V4cHJlc3Npb24oKSwgJycpCisKKyAgICAgICAgcCA9IGdldCgnMTEuMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5nZXRfZXhwcmVzc2lvbigpLCAnJykKKworICAgICAgICBwID0gZ2V0KCcxMS4xMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5nZXRfZXhwcmVzc2lvbigpLCAnRmFsc2UnKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2lkbGVoaXN0b3J5LnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaWRsZWhpc3RvcnkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM2YmIzMgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2lkbGVoaXN0b3J5LnB5CkBAIC0wLDAgKzEsMTY3IEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCisKK2ltcG9ydCBUa2ludGVyIGFzIHRrCitmcm9tIFRraW50ZXIgaW1wb3J0IFRleHQgYXMgdGtUZXh0Citmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lm1vY2tfdGsgaW1wb3J0IFRleHQgYXMgbWtUZXh0Citmcm9tIGlkbGVsaWIuSWRsZUhpc3RvcnkgaW1wb3J0IEhpc3RvcnkKK2Zyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgorCitsaW5lMSA9ICdhID0gNycKK2xpbmUyID0gJ2IgPSBhJworCitjbGFzcyBTdG9yZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICcnJ1Rlc3RzIEhpc3RvcnkuX19pbml0X18gYW5kIEhpc3Rvcnkuc3RvcmUgd2l0aCBtb2NrIFRleHQnJycKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIGNscy50ZXh0ID0gbWtUZXh0KCkKKyAgICAgICAgY2xzLmhpc3RvcnkgPSBIaXN0b3J5KGNscy50ZXh0KQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLnRleHQuZGVsZXRlKCcxLjAnLCAnZW5kJykKKyAgICAgICAgc2VsZi5oaXN0b3J5Lmhpc3RvcnkgPSBbXQorCisgICAgZGVmIHRlc3RfaW5pdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLmhpc3RvcnkudGV4dCwgc2VsZi50ZXh0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuaGlzdG9yeS5oaXN0b3J5LCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc2VsZi5oaXN0b3J5LnByZWZpeCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc2VsZi5oaXN0b3J5LnBvaW50ZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5oaXN0b3J5LmN5Y2xpYywKKyAgICAgICAgICAgICAgICBpZGxlQ29uZi5HZXRPcHRpb24oIm1haW4iLCAiSGlzdG9yeSIsICAiY3ljbGljIiwgMSwgImJvb2wiKSkKKworICAgIGRlZiB0ZXN0X3N0b3JlX3Nob3J0KHNlbGYpOgorICAgICAgICBzZWxmLmhpc3Rvcnkuc3RvcmUoJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuaGlzdG9yeS5oaXN0b3J5LCBbXSkKKyAgICAgICAgc2VsZi5oaXN0b3J5LnN0b3JlKCcgIGEgICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5oaXN0b3J5Lmhpc3RvcnksIFtdKQorCisgICAgZGVmIHRlc3Rfc3RvcmVfZHVwKHNlbGYpOgorICAgICAgICBzZWxmLmhpc3Rvcnkuc3RvcmUobGluZTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5oaXN0b3J5Lmhpc3RvcnksIFtsaW5lMV0pCisgICAgICAgIHNlbGYuaGlzdG9yeS5zdG9yZShsaW5lMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmhpc3RvcnkuaGlzdG9yeSwgW2xpbmUxLCBsaW5lMl0pCisgICAgICAgIHNlbGYuaGlzdG9yeS5zdG9yZShsaW5lMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmhpc3RvcnkuaGlzdG9yeSwgW2xpbmUyLCBsaW5lMV0pCisKKyAgICBkZWYgdGVzdF9zdG9yZV9yZXNldChzZWxmKToKKyAgICAgICAgc2VsZi5oaXN0b3J5LnByZWZpeCA9IGxpbmUxCisgICAgICAgIHNlbGYuaGlzdG9yeS5wb2ludGVyID0gMAorICAgICAgICBzZWxmLmhpc3Rvcnkuc3RvcmUobGluZTIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNlbGYuaGlzdG9yeS5wcmVmaXgpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNlbGYuaGlzdG9yeS5wb2ludGVyKQorCisKK2NsYXNzIFRleHRXcmFwcGVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIpOgorICAgICAgICBzZWxmLnRleHQgPSB0a1RleHQobWFzdGVyPW1hc3RlcikKKyAgICAgICAgc2VsZi5fYmVsbCA9IEZhbHNlCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLnRleHQsIG5hbWUpCisgICAgZGVmIGJlbGwoc2VsZik6CisgICAgICAgIHNlbGYuX2JlbGwgPSBUcnVlCisKK2NsYXNzIEZldGNoVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgJycnVGVzdCBIaXN0b3J5LmZldGNoIHdpdGggd3JhcHBlZCB0ay5UZXh0LgorICAgICcnJworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIHJlcXVpcmVzKCdndWknKQorICAgICAgICBjbHMucm9vdCA9IHRrLlRrKCkKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi50ZXh0ID0gdGV4dCA9IFRleHRXcmFwcGVyKHNlbGYucm9vdCkKKyAgICAgICAgdGV4dC5pbnNlcnQoJzEuMCcsICI+Pj4gIikKKyAgICAgICAgdGV4dC5tYXJrX3NldCgnaW9tYXJrJywgJzEuNCcpCisgICAgICAgIHRleHQubWFya19ncmF2aXR5KCdpb21hcmsnLCAnbGVmdCcpCisgICAgICAgIHNlbGYuaGlzdG9yeSA9IEhpc3RvcnkodGV4dCkKKyAgICAgICAgc2VsZi5oaXN0b3J5Lmhpc3RvcnkgPSBbbGluZTEsIGxpbmUyXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKKyAgICAgICAgY2xzLnJvb3QuZGVzdHJveSgpCisgICAgICAgIGRlbCBjbHMucm9vdAorCisgICAgZGVmIGZldGNoX3Rlc3Qoc2VsZiwgcmV2ZXJzZSwgbGluZSwgcHJlZml4LCBpbmRleCwgYmVsbD1GYWxzZSk6CisgICAgICAgICMgUGVyZm9ybSBvbmUgZmV0Y2ggYXMgaW52b2tlZCBieSBBbHQtTiBvciBBbHQtUAorICAgICAgICAjIFRlc3QgdGhlIHJlc3VsdC4gVGhlIGxpbmUgdGVzdCBpcyB0aGUgbW9zdCBpbXBvcnRhbnQuCisgICAgICAgICMgVGhlIGxhc3QgdHdvIGFyZSBkaWFnbm9zdGljIG9mIGZldGNoIGludGVybmFscy4KKyAgICAgICAgSGlzdG9yeSA9IHNlbGYuaGlzdG9yeQorICAgICAgICBIaXN0b3J5LmZldGNoKHJldmVyc2UpCisKKyAgICAgICAgRXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIEVxdWFsKHNlbGYudGV4dC5nZXQoJ2lvbWFyaycsICdlbmQtMWMnKSwgbGluZSkKKyAgICAgICAgRXF1YWwoc2VsZi50ZXh0Ll9iZWxsLCBiZWxsKQorICAgICAgICBpZiBiZWxsOgorICAgICAgICAgICAgc2VsZi50ZXh0Ll9iZWxsID0gRmFsc2UKKyAgICAgICAgRXF1YWwoSGlzdG9yeS5wcmVmaXgsIHByZWZpeCkKKyAgICAgICAgRXF1YWwoSGlzdG9yeS5wb2ludGVyLCBpbmRleCkKKyAgICAgICAgRXF1YWwoc2VsZi50ZXh0LmNvbXBhcmUoImluc2VydCIsICc9PScsICJlbmQtMWMiKSwgMSkKKworICAgIGRlZiB0ZXN0X2ZldGNoX3ByZXZfY3ljbGljKHNlbGYpOgorICAgICAgICBwcmVmaXggPSAnJworICAgICAgICB0ZXN0ID0gc2VsZi5mZXRjaF90ZXN0CisgICAgICAgIHRlc3QoVHJ1ZSwgbGluZTIsIHByZWZpeCwgMSkKKyAgICAgICAgdGVzdChUcnVlLCBsaW5lMSwgcHJlZml4LCAwKQorICAgICAgICB0ZXN0KFRydWUsIHByZWZpeCwgTm9uZSwgTm9uZSwgYmVsbD1UcnVlKQorCisgICAgZGVmIHRlc3RfZmV0Y2hfbmV4dF9jeWNsaWMoc2VsZik6CisgICAgICAgIHByZWZpeCA9ICcnCisgICAgICAgIHRlc3QgID0gc2VsZi5mZXRjaF90ZXN0CisgICAgICAgIHRlc3QoRmFsc2UsIGxpbmUxLCBwcmVmaXgsIDApCisgICAgICAgIHRlc3QoRmFsc2UsIGxpbmUyLCBwcmVmaXgsIDEpCisgICAgICAgIHRlc3QoRmFsc2UsIHByZWZpeCwgTm9uZSwgTm9uZSwgYmVsbD1UcnVlKQorCisgICAgIyBQcmVmaXggJ2EnIHRlc3RzIHNraXAgbGluZTIsIHdoaWNoIHN0YXJ0cyB3aXRoICdiJworICAgIGRlZiB0ZXN0X2ZldGNoX3ByZXZfcHJlZml4KHNlbGYpOgorICAgICAgICBwcmVmaXggPSAnYScKKyAgICAgICAgc2VsZi50ZXh0Lmluc2VydCgnaW9tYXJrJywgcHJlZml4KQorICAgICAgICBzZWxmLmZldGNoX3Rlc3QoVHJ1ZSwgbGluZTEsIHByZWZpeCwgMCkKKyAgICAgICAgc2VsZi5mZXRjaF90ZXN0KFRydWUsIHByZWZpeCwgTm9uZSwgTm9uZSwgYmVsbD1UcnVlKQorCisgICAgZGVmIHRlc3RfZmV0Y2hfbmV4dF9wcmVmaXgoc2VsZik6CisgICAgICAgIHByZWZpeCA9ICdhJworICAgICAgICBzZWxmLnRleHQuaW5zZXJ0KCdpb21hcmsnLCBwcmVmaXgpCisgICAgICAgIHNlbGYuZmV0Y2hfdGVzdChGYWxzZSwgbGluZTEsIHByZWZpeCwgMCkKKyAgICAgICAgc2VsZi5mZXRjaF90ZXN0KEZhbHNlLCBwcmVmaXgsIE5vbmUsIE5vbmUsIGJlbGw9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X2ZldGNoX3ByZXZfbm9uY3ljbGljKHNlbGYpOgorICAgICAgICBwcmVmaXggPSAnJworICAgICAgICBzZWxmLmhpc3RvcnkuY3ljbGljID0gRmFsc2UKKyAgICAgICAgdGVzdCA9IHNlbGYuZmV0Y2hfdGVzdAorICAgICAgICB0ZXN0KFRydWUsIGxpbmUyLCBwcmVmaXgsIDEpCisgICAgICAgIHRlc3QoVHJ1ZSwgbGluZTEsIHByZWZpeCwgMCkKKyAgICAgICAgdGVzdChUcnVlLCBsaW5lMSwgcHJlZml4LCAwLCBiZWxsPVRydWUpCisKKyAgICBkZWYgdGVzdF9mZXRjaF9uZXh0X25vbmN5Y2xpYyhzZWxmKToKKyAgICAgICAgcHJlZml4ID0gJycKKyAgICAgICAgc2VsZi5oaXN0b3J5LmN5Y2xpYyA9IEZhbHNlCisgICAgICAgIHRlc3QgID0gc2VsZi5mZXRjaF90ZXN0CisgICAgICAgIHRlc3QoRmFsc2UsIHByZWZpeCwgTm9uZSwgTm9uZSwgYmVsbD1UcnVlKQorICAgICAgICB0ZXN0KFRydWUsIGxpbmUyLCBwcmVmaXgsIDEpCisgICAgICAgIHRlc3QoRmFsc2UsIHByZWZpeCwgTm9uZSwgTm9uZSwgYmVsbD1UcnVlKQorICAgICAgICB0ZXN0KEZhbHNlLCBwcmVmaXgsIE5vbmUsIE5vbmUsIGJlbGw9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X2ZldGNoX2N1cnNvcl9tb3ZlKHNlbGYpOgorICAgICAgICAjIE1vdmUgY3Vyc29yIGFmdGVyIGZldGNoCisgICAgICAgIHNlbGYuaGlzdG9yeS5mZXRjaChyZXZlcnNlPVRydWUpICAjIGluaXRpYWxpemF0aW9uCisgICAgICAgIHNlbGYudGV4dC5tYXJrX3NldCgnaW5zZXJ0JywgJ2lvbWFyaycpCisgICAgICAgIHNlbGYuZmV0Y2hfdGVzdChUcnVlLCBsaW5lMiwgTm9uZSwgTm9uZSwgYmVsbD1UcnVlKQorCisgICAgZGVmIHRlc3RfZmV0Y2hfZWRpdChzZWxmKToKKyAgICAgICAgIyBFZGl0IGFmdGVyIGZldGNoCisgICAgICAgIHNlbGYuaGlzdG9yeS5mZXRjaChyZXZlcnNlPVRydWUpICAjIGluaXRpYWxpemF0aW9uCisgICAgICAgIHNlbGYudGV4dC5kZWxldGUoJ2lvbWFyaycsICdpbnNlcnQnLCApCisgICAgICAgIHNlbGYudGV4dC5pbnNlcnQoJ2lvbWFyaycsICdhID0nKQorICAgICAgICBzZWxmLmZldGNoX3Rlc3QoVHJ1ZSwgbGluZTEsICdhID0nLCAwKSAgIyBwcmVmaXggaXMgcmVzZXQKKworICAgIGRlZiB0ZXN0X2hpc3RvcnlfcHJldl9uZXh0KHNlbGYpOgorICAgICAgICAjIE1pbmltYWxseSB0ZXN0IGZ1bmN0aW9ucyBib3VuZCB0byBldmVudHMKKyAgICAgICAgc2VsZi5oaXN0b3J5Lmhpc3RvcnlfcHJldignZHVtbXkgZXZlbnQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuaGlzdG9yeS5wb2ludGVyLCAxKQorICAgICAgICBzZWxmLmhpc3RvcnkuaGlzdG9yeV9uZXh0KCdkdW1teSBldmVudCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5oaXN0b3J5LnBvaW50ZXIsIE5vbmUpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yLCBleGl0PTIpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9wYXJlbm1hdGNoLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcGFyZW5tYXRjaC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjIxOTgxCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcGFyZW5tYXRjaC5weQpAQCAtMCwwICsxLDEyMSBAQAorIiIiVGVzdCBpZGxlbGliLlBhcmVuTWF0Y2guIiIiCisjIFRoaXMgbXVzdCBjdXJyZW50bHkgYmUgYSBndWkgdGVzdCBiZWNhdXNlIFBhcmVuTWF0Y2ggbWV0aG9kcyB1c2UKKyMgc2V2ZXJhbCB0ZXh0IG1ldGhvZHMgbm90IGRlZmluZWQgb24gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ay5UZXh0LgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCitmcm9tIFRraW50ZXIgaW1wb3J0IFRrLCBUZXh0Citmcm9tIGlkbGVsaWIuUGFyZW5NYXRjaCBpbXBvcnQgUGFyZW5NYXRjaAorCitjbGFzcyBNb2NrOiAgIyAyLjcgZG9lcyBub3QgaGF2ZSB1bml0dGVzdC5tb2NrCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuY2FsbGVkID0gRmFsc2UKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBzZWxmLmNhbGxlZCA9IFRydWUKKworICAgIGRlZiByZXNldF9tb2NrKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuY2FsbGVkID0gRmFsc2UKKworICAgIGRlZiBhZnRlcihzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBwYXNzCisKK2NsYXNzIER1bW15RWRpdHdpbjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGV4dCk6CisgICAgICAgIHNlbGYudGV4dCA9IHRleHQKKyAgICAgICAgc2VsZi5pbmRlbnR3aWR0aCA9IDgKKyAgICAgICAgc2VsZi50YWJ3aWR0aCA9IDgKKyAgICAgICAgc2VsZi5jb250ZXh0X3VzZV9wczEgPSBUcnVlCisKKworY2xhc3MgUGFyZW5NYXRjaFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgcmVxdWlyZXMoJ2d1aScpCisgICAgICAgIGNscy5yb290ID0gVGsoKQorICAgICAgICBjbHMudGV4dCA9IFRleHQoY2xzLnJvb3QpCisgICAgICAgIGNscy5lZGl0d2luID0gRHVtbXlFZGl0d2luKGNscy50ZXh0KQorICAgICAgICBjbHMuZWRpdHdpbi50ZXh0X2ZyYW1lID0gTW9jaygpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICBkZWwgY2xzLnRleHQsIGNscy5lZGl0d2luCisgICAgICAgIGNscy5yb290LmRlc3Ryb3koKQorICAgICAgICBkZWwgY2xzLnJvb3QKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi50ZXh0LmRlbGV0ZSgnMS4wJywgJ2VuZCcpCisKKyAgICBkZWYgdGVzdF9wYXJlbl9leHByZXNzaW9uKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVGVzdCBQYXJlbk1hdGNoIHdpdGggJ2V4cHJlc3Npb24nIHN0eWxlLgorICAgICAgICAiIiIKKyAgICAgICAgdGV4dCA9IHNlbGYudGV4dAorICAgICAgICBwbSA9IFBhcmVuTWF0Y2goc2VsZi5lZGl0d2luKQorICAgICAgICBwbS5zZXRfc3R5bGUoJ2V4cHJlc3Npb24nKQorCisgICAgICAgIHRleHQuaW5zZXJ0KCdpbnNlcnQnLCAnZGVmIGZvb2JhcihhLCBiJykKKyAgICAgICAgcG0uZmxhc2hfcGFyZW5fZXZlbnQoJ2V2ZW50JykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignPDxwYXJlbm1hdGNoLWNoZWNrLXJlc3RvcmU+PicsIHRleHQuZXZlbnRfaW5mbygpKQorICAgICAgICBzZWxmLmFzc2VydFR1cGxlRXF1YWwodGV4dC50YWdfcHJldnJhbmdlKCdwYXJlbicsICdlbmQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCcxLjEwJywgJzEuMTUnKSkKKyAgICAgICAgdGV4dC5pbnNlcnQoJ2luc2VydCcsICcpJykKKyAgICAgICAgcG0ucmVzdG9yZV9ldmVudCgpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJzw8cGFyZW5tYXRjaC1jaGVjay1yZXN0b3JlPj4nLCB0ZXh0LmV2ZW50X2luZm8oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0LnRhZ19wcmV2cmFuZ2UoJ3BhcmVuJywgJ2VuZCcpLCAoKSkKKworICAgICAgICAjIHBhcmVuX2Nsb3NlZF9ldmVudCBjYW4gb25seSBiZSB0ZXN0ZWQgYXMgYmVsb3cKKyAgICAgICAgcG0ucGFyZW5fY2xvc2VkX2V2ZW50KCdldmVudCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHVwbGVFcXVhbCh0ZXh0LnRhZ19wcmV2cmFuZ2UoJ3BhcmVuJywgJ2VuZCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCcxLjEwJywgJzEuMTYnKSkKKworICAgIGRlZiB0ZXN0X3BhcmVuX2RlZmF1bHQoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBUZXN0IFBhcmVuTWF0Y2ggd2l0aCAnZGVmYXVsdCcgc3R5bGUuCisgICAgICAgICIiIgorICAgICAgICB0ZXh0ID0gc2VsZi50ZXh0CisgICAgICAgIHBtID0gUGFyZW5NYXRjaChzZWxmLmVkaXR3aW4pCisgICAgICAgIHBtLnNldF9zdHlsZSgnZGVmYXVsdCcpCisKKyAgICAgICAgdGV4dC5pbnNlcnQoJ2luc2VydCcsICdkZWYgZm9vYmFyKGEsIGInKQorICAgICAgICBwbS5mbGFzaF9wYXJlbl9ldmVudCgnZXZlbnQnKQorICAgICAgICBzZWxmLmFzc2VydEluKCc8PHBhcmVubWF0Y2gtY2hlY2stcmVzdG9yZT4+JywgdGV4dC5ldmVudF9pbmZvKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHVwbGVFcXVhbCh0ZXh0LnRhZ19wcmV2cmFuZ2UoJ3BhcmVuJywgJ2VuZCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJzEuMTAnLCAnMS4xMScpKQorICAgICAgICB0ZXh0Lmluc2VydCgnaW5zZXJ0JywgJyknKQorICAgICAgICBwbS5yZXN0b3JlX2V2ZW50KCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignPDxwYXJlbm1hdGNoLWNoZWNrLXJlc3RvcmU+PicsIHRleHQuZXZlbnRfaW5mbygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQudGFnX3ByZXZyYW5nZSgncGFyZW4nLCAnZW5kJyksICgpKQorCisgICAgZGVmIHRlc3RfcGFyZW5fY29ybmVyKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVGVzdCBjb3JuZXIgY2FzZXMgaW4gZmxhc2hfcGFyZW5fZXZlbnQgYW5kIHBhcmVuX2Nsb3NlZF9ldmVudC4KKworICAgICAgICBUaGVzZSBjYXNlcyBmb3JjZSBjb25kaXRpb25hbCBleHByZXNzaW9uIGFuZCBhbHRlcm5hdGUgcGF0aHMuCisgICAgICAgICIiIgorICAgICAgICB0ZXh0ID0gc2VsZi50ZXh0CisgICAgICAgIHBtID0gUGFyZW5NYXRjaChzZWxmLmVkaXR3aW4pCisKKyAgICAgICAgdGV4dC5pbnNlcnQoJ2luc2VydCcsICcjIHRoaXMgaXMgYSBjb21tZW4pJykKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocG0ucGFyZW5fY2xvc2VkX2V2ZW50KCdldmVudCcpKQorCisgICAgICAgIHRleHQuaW5zZXJ0KCdpbnNlcnQnLCAnXG5kZWYnKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShwbS5mbGFzaF9wYXJlbl9ldmVudCgnZXZlbnQnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocG0ucGFyZW5fY2xvc2VkX2V2ZW50KCdldmVudCcpKQorCisgICAgICAgIHRleHQuaW5zZXJ0KCdpbnNlcnQnLCAnIGEsICphcmcpJykKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocG0ucGFyZW5fY2xvc2VkX2V2ZW50KCdldmVudCcpKQorCisgICAgZGVmIHRlc3RfaGFuZGxlX3Jlc3RvcmVfdGltZXIoc2VsZik6CisgICAgICAgIHBtID0gUGFyZW5NYXRjaChzZWxmLmVkaXR3aW4pCisgICAgICAgIHBtLnJlc3RvcmVfZXZlbnQgPSBNb2NrKCkKKyAgICAgICAgcG0uaGFuZGxlX3Jlc3RvcmVfdGltZXIoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBtLnJlc3RvcmVfZXZlbnQuY2FsbGVkKQorICAgICAgICBwbS5yZXN0b3JlX2V2ZW50LnJlc2V0X21vY2soKQorICAgICAgICBwbS5oYW5kbGVfcmVzdG9yZV90aW1lcigxKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHBtLnJlc3RvcmVfZXZlbnQuY2FsbGVkKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3BhdGhicm93c2VyLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcGF0aGJyb3dzZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FkN2M5NwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3BhdGhicm93c2VyLnB5CkBAIC0wLDAgKzEsMTIgQEAKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IGlkbGVsaWIuUGF0aEJyb3dzZXIgYXMgUGF0aEJyb3dzZXIKKworY2xhc3MgUGF0aEJyb3dzZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X0RpckJyb3dzZXJUcmVlSXRlbShzZWxmKToKKyAgICAgICAgIyBJc3N1ZTE2MjI2IC0gbWFrZSBzdXJlIHRoYXQgZ2V0dGluZyBhIHN1Ymxpc3Qgd29ya3MKKyAgICAgICAgZCA9IFBhdGhCcm93c2VyLkRpckJyb3dzZXJUcmVlSXRlbSgnJykKKyAgICAgICAgZC5HZXRTdWJMaXN0KCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcnN0cmlwLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcnN0cmlwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjOTBiOTMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9yc3RyaXAucHkKQEAgLTAsMCArMSw0OSBAQAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgaWRsZWxpYi5Sc3RyaXBFeHRlbnNpb24gYXMgcnMKK2Zyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja19pZGxlIGltcG9ydCBFZGl0b3IKKworY2xhc3MgcnN0cmlwVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9yc3RyaXBfbGluZShzZWxmKToKKyAgICAgICAgZWRpdG9yID0gRWRpdG9yKCkKKyAgICAgICAgdGV4dCA9IGVkaXRvci50ZXh0CisgICAgICAgIGRvX3JzdHJpcCA9IHJzLlJzdHJpcEV4dGVuc2lvbihlZGl0b3IpLmRvX3JzdHJpcAorCisgICAgICAgIGRvX3JzdHJpcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dC5nZXQoJzEuMCcsICdpbnNlcnQnKSwgJycpCisgICAgICAgIHRleHQuaW5zZXJ0KCcxLjAnLCAnICAgICAnKQorICAgICAgICBkb19yc3RyaXAoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQuZ2V0KCcxLjAnLCAnaW5zZXJ0JyksICcnKQorICAgICAgICB0ZXh0Lmluc2VydCgnMS4wJywgJyAgICAgXG4nKQorICAgICAgICBkb19yc3RyaXAoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQuZ2V0KCcxLjAnLCAnaW5zZXJ0JyksICdcbicpCisKKyAgICBkZWYgdGVzdF9yc3RyaXBfbXVsdGlwbGUoc2VsZik6CisgICAgICAgIGVkaXRvciA9IEVkaXRvcigpCisgICAgICAgICMgIFVuY29tbWVudCBmb2xsb3dpbmcgdG8gdmVyaWZ5IHRoYXQgdGVzdCBwYXNzZXMgd2l0aCByZWFsIHdpZGdldHMuCisjIyAgICAgICAgZnJvbSBpZGxlbGliLkVkaXRvcldpbmRvdyBpbXBvcnQgRWRpdG9yV2luZG93IGFzIEVkaXRvcgorIyMgICAgICAgIGZyb20gdGtpbnRlciBpbXBvcnQgVGsKKyMjICAgICAgICBlZGl0b3IgPSBFZGl0b3Iocm9vdD1UaygpKQorICAgICAgICB0ZXh0ID0gZWRpdG9yLnRleHQKKyAgICAgICAgZG9fcnN0cmlwID0gcnMuUnN0cmlwRXh0ZW5zaW9uKGVkaXRvcikuZG9fcnN0cmlwCisKKyAgICAgICAgb3JpZ2luYWwgPSAoCisgICAgICAgICAgICAiTGluZSB3aXRoIGFuIGVuZGluZyB0YWIgICAgXG4iCisgICAgICAgICAgICAiTGluZSBlbmRpbmcgaW4gNSBzcGFjZXMgICAgIFxuIgorICAgICAgICAgICAgIkxpbmV3aXRobm9zcGFjZXNcbiIKKyAgICAgICAgICAgICIgICAgaW5kZW50ZWQgbGluZVxuIgorICAgICAgICAgICAgIiAgICBpbmRlbnRlZCBsaW5lIHdpdGggdHJhaWxpbmcgc3BhY2UgXG4iCisgICAgICAgICAgICAiICAgICIpCisgICAgICAgIHN0cmlwcGVkID0gKAorICAgICAgICAgICAgIkxpbmUgd2l0aCBhbiBlbmRpbmcgdGFiXG4iCisgICAgICAgICAgICAiTGluZSBlbmRpbmcgaW4gNSBzcGFjZXNcbiIKKyAgICAgICAgICAgICJMaW5ld2l0aG5vc3BhY2VzXG4iCisgICAgICAgICAgICAiICAgIGluZGVudGVkIGxpbmVcbiIKKyAgICAgICAgICAgICIgICAgaW5kZW50ZWQgbGluZSB3aXRoIHRyYWlsaW5nIHNwYWNlXG4iKQorCisgICAgICAgIHRleHQuaW5zZXJ0KCcxLjAnLCBvcmlnaW5hbCkKKyAgICAgICAgZG9fcnN0cmlwKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0LmdldCgnMS4wJywgJ2luc2VydCcpLCBzdHJpcHBlZCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2VhcmNoZGlhbG9nYmFzZS5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3NlYXJjaGRpYWxvZ2Jhc2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFiZWUzZQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3NlYXJjaGRpYWxvZ2Jhc2UucHkKQEAgLTAsMCArMSwxNjUgQEAKKycnJ1VuaXR0ZXN0cyBmb3IgaWRsZWxpYi9TZWFyY2hEaWFsb2dCYXNlLnB5CisKK0NvdmVyYWdlOiA5OSUuIFRoZSBvbmx5IHRoaW5nIG5vdCBjb3ZlcmVkIGlzIGluY29uc2VxdWVudGlhbCAtLQordGVzdGluZyBza2lwcGluZyBvZiBzdWl0ZSB3aGVuIHNlbGYubmVlZHdyYXBidXR0b24gaXMgZmFsc2UuCisKKycnJworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCByZXF1aXJlcworZnJvbSBUa2ludGVyIGltcG9ydCBUaywgVG9wbGV2ZWwsIEZyYW1lLCBMYWJlbCwgQm9vbGVhblZhciwgU3RyaW5nVmFyCitmcm9tIGlkbGVsaWIgaW1wb3J0IFNlYXJjaEVuZ2luZSBhcyBzZQorZnJvbSBpZGxlbGliIGltcG9ydCBTZWFyY2hEaWFsb2dCYXNlIGFzIHNkYgorZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX2lkbGUgaW1wb3J0IEZ1bmMKK2Zyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgVmFyLCBNYm94CisKKyMgVGhlIGZvbGxvd2luZyBjb3VsZCBoZWxwIG1ha2Ugc29tZSB0ZXN0cyBndWktZnJlZS4KKyMgSG93ZXZlciwgdGhleSBjdXJyZW50bHkgbWFrZSByYWRpb2J1dHRvbiB0ZXN0cyBmYWlsLgorIyNkZWYgc2V0VXBNb2R1bGUoKToKKyMjICAgICMgUmVwbGFjZSB0ayBvYmplY3RzIHVzZWQgdG8gaW5pdGlhbGl6ZSBzZS5TZWFyY2hFbmdpbmUuCisjIyAgICBzZS5Cb29sZWFuVmFyID0gVmFyCisjIyAgICBzZS5TdHJpbmdWYXIgPSBWYXIKKyMjCisjI2RlZiB0ZWFyRG93bk1vZHVsZSgpOgorIyMgICAgc2UuQm9vbGVhblZhciA9IEJvb2xlYW5WYXIKKyMjICAgIHNlLlN0cmluZ1ZhciA9IFN0cmluZ1ZhcgorCitjbGFzcyBTZWFyY2hEaWFsb2dCYXNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICByZXF1aXJlcygnZ3VpJykKKyAgICAgICAgY2xzLnJvb3QgPSBUaygpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICBjbHMucm9vdC5kZXN0cm95KCkKKyAgICAgICAgZGVsIGNscy5yb290CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZW5naW5lID0gc2UuU2VhcmNoRW5naW5lKHNlbGYucm9vdCkgICMgTm9uZSBhbHNvIHNlZW1zIHRvIHdvcmsKKyAgICAgICAgc2VsZi5kaWFsb2cgPSBzZGIuU2VhcmNoRGlhbG9nQmFzZShyb290PXNlbGYucm9vdCwgZW5naW5lPXNlbGYuZW5naW5lKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmRpYWxvZy5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9vcGVuX2FuZF9jbG9zZShzZWxmKToKKyAgICAgICAgIyBvcGVuIGNhbGxzIGNyZWF0ZV93aWRnZXRzLCB3aGljaCBuZWVkcyBkZWZhdWx0X2NvbW1hbmQKKyAgICAgICAgc2VsZi5kaWFsb2cuZGVmYXVsdF9jb21tYW5kID0gTm9uZQorCisgICAgICAgICMgU2luY2UgdGV4dCBwYXJhbWV0ZXIgb2YgLm9wZW4gaXMgbm90IHVzZWQgaW4gYmFzZSBjbGFzcywKKyAgICAgICAgIyBwYXNzIGR1bW15ICd0ZXh0JyBpbnN0ZWFkIG9mIHRrLlRleHQoKS4KKyAgICAgICAgc2VsZi5kaWFsb2cub3BlbigndGV4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaWFsb2cudG9wLnN0YXRlKCksICdub3JtYWwnKQorICAgICAgICBzZWxmLmRpYWxvZy5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaWFsb2cudG9wLnN0YXRlKCksICd3aXRoZHJhd24nKQorCisgICAgICAgIHNlbGYuZGlhbG9nLm9wZW4oJ3RleHQnLCBzZWFyY2hwaHJhc2U9ImhlbGxvIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpYWxvZy5lbnQuZ2V0KCksICdoZWxsbycpCisgICAgICAgIHNlbGYuZGlhbG9nLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2NyZWF0ZV93aWRnZXRzKHNlbGYpOgorICAgICAgICBzZWxmLmRpYWxvZy5jcmVhdGVfZW50cmllcyA9IEZ1bmMoKQorICAgICAgICBzZWxmLmRpYWxvZy5jcmVhdGVfb3B0aW9uX2J1dHRvbnMgPSBGdW5jKCkKKyAgICAgICAgc2VsZi5kaWFsb2cuY3JlYXRlX290aGVyX2J1dHRvbnMgPSBGdW5jKCkKKyAgICAgICAgc2VsZi5kaWFsb2cuY3JlYXRlX2NvbW1hbmRfYnV0dG9ucyA9IEZ1bmMoKQorCisgICAgICAgIHNlbGYuZGlhbG9nLmRlZmF1bHRfY29tbWFuZCA9IE5vbmUKKyAgICAgICAgc2VsZi5kaWFsb2cuY3JlYXRlX3dpZGdldHMoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmRpYWxvZy5jcmVhdGVfZW50cmllcy5jYWxsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmRpYWxvZy5jcmVhdGVfb3B0aW9uX2J1dHRvbnMuY2FsbGVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5kaWFsb2cuY3JlYXRlX290aGVyX2J1dHRvbnMuY2FsbGVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5kaWFsb2cuY3JlYXRlX2NvbW1hbmRfYnV0dG9ucy5jYWxsZWQpCisKKyAgICBkZWYgdGVzdF9tYWtlX2VudHJ5KHNlbGYpOgorICAgICAgICBlcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgc2VsZi5kaWFsb2cucm93ID0gMAorICAgICAgICBzZWxmLmRpYWxvZy50b3AgPSBUb3BsZXZlbChzZWxmLnJvb3QpCisgICAgICAgIGVudHJ5LCBsYWJlbCA9IHNlbGYuZGlhbG9nLm1ha2VfZW50cnkoIlRlc3Q6IiwgJ2hlbGxvJykKKyAgICAgICAgZXF1YWwobGFiZWxbJ3RleHQnXSwgJ1Rlc3Q6JykKKworICAgICAgICBzZWxmLmFzc2VydEluKGVudHJ5LmdldCgpLCAnaGVsbG8nKQorICAgICAgICBlZ2kgPSBlbnRyeS5ncmlkX2luZm8oKQorICAgICAgICBlcXVhbChpbnQoZWdpWydyb3cnXSksIDApCisgICAgICAgIGVxdWFsKGludChlZ2lbJ2NvbHVtbiddKSwgMSkKKyAgICAgICAgZXF1YWwoaW50KGVnaVsncm93c3BhbiddKSwgMSkKKyAgICAgICAgZXF1YWwoaW50KGVnaVsnY29sdW1uc3BhbiddKSwgMSkKKyAgICAgICAgZXF1YWwoc2VsZi5kaWFsb2cucm93LCAxKQorCisgICAgZGVmIHRlc3RfY3JlYXRlX2VudHJpZXMoc2VsZik6CisgICAgICAgIHNlbGYuZGlhbG9nLnJvdyA9IDAKKyAgICAgICAgc2VsZi5lbmdpbmUuc2V0cGF0KCdoZWxsbycpCisgICAgICAgIHNlbGYuZGlhbG9nLmNyZWF0ZV9lbnRyaWVzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihzZWxmLmRpYWxvZy5lbnQuZ2V0KCksICdoZWxsbycpCisKKyAgICBkZWYgdGVzdF9tYWtlX2ZyYW1lKHNlbGYpOgorICAgICAgICBzZWxmLmRpYWxvZy5yb3cgPSAwCisgICAgICAgIHNlbGYuZGlhbG9nLnRvcCA9IFRvcGxldmVsKHNlbGYucm9vdCkKKyAgICAgICAgZnJhbWUsIGxhYmVsID0gc2VsZi5kaWFsb2cubWFrZV9mcmFtZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGFiZWwsICcnKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZnJhbWUsIEZyYW1lKQorCisgICAgICAgIGZyYW1lLCBsYWJlbCA9IHNlbGYuZGlhbG9nLm1ha2VfZnJhbWUoJ3Rlc3RsYWJlbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGFiZWxbJ3RleHQnXSwgJ3Rlc3RsYWJlbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShmcmFtZSwgRnJhbWUpCisKKyAgICBkZWYgYnRuX3Rlc3Rfc2V0dXAoc2VsZiwgbWV0aCk6CisgICAgICAgIHNlbGYuZGlhbG9nLnRvcCA9IFRvcGxldmVsKHNlbGYucm9vdCkKKyAgICAgICAgc2VsZi5kaWFsb2cucm93ID0gMAorICAgICAgICByZXR1cm4gbWV0aCgpCisKKyAgICBkZWYgdGVzdF9jcmVhdGVfb3B0aW9uX2J1dHRvbnMoc2VsZik6CisgICAgICAgIGUgPSBzZWxmLmVuZ2luZQorICAgICAgICBmb3Igc3RhdGUgaW4gKDAsIDEpOgorICAgICAgICAgICAgZm9yIHZhciBpbiAoZS5yZXZhciwgZS5jYXNldmFyLCBlLndvcmR2YXIsIGUud3JhcHZhcik6CisgICAgICAgICAgICAgICAgdmFyLnNldChzdGF0ZSkKKyAgICAgICAgICAgIGZyYW1lLCBvcHRpb25zID0gc2VsZi5idG5fdGVzdF9zZXR1cCgKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kaWFsb2cuY3JlYXRlX29wdGlvbl9idXR0b25zKQorICAgICAgICAgICAgZm9yIHNwZWMsIGJ1dHRvbiBpbiB6aXAgKG9wdGlvbnMsIGZyYW1lLnBhY2tfc2xhdmVzKCkpOgorICAgICAgICAgICAgICAgIHZhciwgbGFiZWwgPSBzcGVjCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidXR0b25bJ3RleHQnXSwgbGFiZWwpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YXIuZ2V0KCksIHN0YXRlKQorICAgICAgICAgICAgICAgIGlmIHN0YXRlID09IDE6CisgICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5kZXNlbGVjdCgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnNlbGVjdCgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YXIuZ2V0KCksIDEgLSBzdGF0ZSkKKworICAgIGRlZiB0ZXN0X2NyZWF0ZV9vdGhlcl9idXR0b25zKHNlbGYpOgorICAgICAgICBmb3Igc3RhdGUgaW4gKEZhbHNlLCBUcnVlKToKKyAgICAgICAgICAgIHZhciA9IHNlbGYuZW5naW5lLmJhY2t2YXIKKyAgICAgICAgICAgIHZhci5zZXQoc3RhdGUpCisgICAgICAgICAgICBmcmFtZSwgb3RoZXJzID0gc2VsZi5idG5fdGVzdF9zZXR1cCgKKyAgICAgICAgICAgICAgICBzZWxmLmRpYWxvZy5jcmVhdGVfb3RoZXJfYnV0dG9ucykKKyAgICAgICAgICAgIGJ1dHRvbnMgPSBmcmFtZS5wYWNrX3NsYXZlcygpCisgICAgICAgICAgICBmb3Igc3BlYywgYnV0dG9uIGluIHppcChvdGhlcnMsIGJ1dHRvbnMpOgorICAgICAgICAgICAgICAgIHZhbCwgbGFiZWwgPSBzcGVjCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidXR0b25bJ3RleHQnXSwgbGFiZWwpCisgICAgICAgICAgICAgICAgaWYgdmFsID09IHN0YXRlOgorICAgICAgICAgICAgICAgICAgICAjIGhpdCBvdGhlciBidXR0b24sIHRoZW4gdGhpcyBvbmUKKyAgICAgICAgICAgICAgICAgICAgIyBpbmRleGVzIGRlcGVuZCBvbiBidXR0b24gb3JkZXIKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YXIuZ2V0KCksIHN0YXRlKQorICAgICAgICAgICAgICAgICAgICBidXR0b25zW3ZhbF0uc2VsZWN0KCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YXIuZ2V0KCksIDEgLSBzdGF0ZSkKKyAgICAgICAgICAgICAgICAgICAgYnV0dG9uc1sxLXZhbF0uc2VsZWN0KCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YXIuZ2V0KCksIHN0YXRlKQorCisgICAgZGVmIHRlc3RfbWFrZV9idXR0b24oc2VsZik6CisgICAgICAgIHNlbGYuZGlhbG9nLnRvcCA9IFRvcGxldmVsKHNlbGYucm9vdCkKKyAgICAgICAgc2VsZi5kaWFsb2cuYnV0dG9uZnJhbWUgPSBGcmFtZShzZWxmLmRpYWxvZy50b3ApCisgICAgICAgIGJ0biA9IHNlbGYuZGlhbG9nLm1ha2VfYnV0dG9uKCdUZXN0Jywgc2VsZi5kaWFsb2cuY2xvc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnRuWyd0ZXh0J10sICdUZXN0JykKKworICAgIGRlZiB0ZXN0X2NyZWF0ZV9jb21tYW5kX2J1dHRvbnMoc2VsZik6CisgICAgICAgIHNlbGYuZGlhbG9nLmNyZWF0ZV9jb21tYW5kX2J1dHRvbnMoKQorICAgICAgICAjIExvb2sgZm9yIGNsb3NlIGJ1dHRvbiBjb21tYW5kIGluIGJ1dHRvbmZyYW1lCisgICAgICAgIGNsb3NlYnV0dG9uY29tbWFuZCA9ICcnCisgICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLmRpYWxvZy5idXR0b25mcmFtZS53aW5mb19jaGlsZHJlbigpOgorICAgICAgICAgICAgaWYgY2hpbGRbJ3RleHQnXSA9PSAnY2xvc2UnOgorICAgICAgICAgICAgICAgIGNsb3NlYnV0dG9uY29tbWFuZCA9IGNoaWxkWydjb21tYW5kJ10KKyAgICAgICAgc2VsZi5hc3NlcnRJbignY2xvc2UnLCBjbG9zZWJ1dHRvbmNvbW1hbmQpCisKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIsIGV4aXQ9MikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3NlYXJjaGVuZ2luZS5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3NlYXJjaGVuZ2luZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTI1YTEzCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2VhcmNoZW5naW5lLnB5CkBAIC0wLDAgKzEsMzI5IEBACisnJydUZXN0IGZ1bmN0aW9ucyBhbmQgU2VhcmNoRW5naW5lIGNsYXNzIGluIFNlYXJjaEVuZ2luZS5weS4nJycKKworIyBXaXRoIG1vY2sgcmVwbGFjZW1lbnRzLCB0aGUgbW9kdWxlIGRvZXMgbm90IHVzZSBhbnkgZ3VpIHdpZGdldHMuCisjIFRoZSB1c2Ugb2YgdGsuVGV4dCBpcyBhdm9pZGVkIChmb3Igbm93LCB1bnRpbCBtb2NrIFRleHQgaXMgaW1wcm92ZWQpCisjIGJ5IHBhdGNoaW5nIGluc3RhbmNlcyB3aXRoIGFuIGluZGV4IGZ1bmN0aW9uIHJldHVybmluZyB3aGF0IGlzIG5lZWRlZC4KKyMgVGhpcyB3b3JrcyBiZWNhdXNlIG1vY2sgVGV4dC5nZXQgZG9lcyBub3QgdXNlIC5pbmRleC4KKworaW1wb3J0IHJlCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCitmcm9tIFRraW50ZXIgaW1wb3J0ICBCb29sZWFuVmFyLCBTdHJpbmdWYXIsIFRjbEVycm9yICAjICxUaywgVGV4dAoraW1wb3J0IHRrTWVzc2FnZUJveAorZnJvbSBpZGxlbGliIGltcG9ydCBTZWFyY2hFbmdpbmUgYXMgc2UKK2Zyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgVmFyLCBNYm94Citmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lm1vY2tfdGsgaW1wb3J0IFRleHQgYXMgbW9ja1RleHQKKworZGVmIHNldFVwTW9kdWxlKCk6CisgICAgIyBSZXBsYWNlIHMtZSBtb2R1bGUgdGtpbnRlciBpbXBvcnRzIG90aGVyIHRoYW4gbm9uLWd1aSBUY2xFcnJvci4KKyAgICBzZS5Cb29sZWFuVmFyID0gVmFyCisgICAgc2UuU3RyaW5nVmFyID0gVmFyCisgICAgc2UudGtNZXNzYWdlQm94ID0gTWJveAorCitkZWYgdGVhckRvd25Nb2R1bGUoKToKKyAgICAjIFJlc3RvcmUgJ2p1c3QgaW4gY2FzZScsIHRob3VnaCBvdGhlciB0ZXN0cyBzaG91bGQgYWxzbyByZXBsYWNlLgorICAgIHNlLkJvb2xlYW5WYXIgPSBCb29sZWFuVmFyCisgICAgc2UuU3RyaW5nVmFyID0gU3RyaW5nVmFyCisgICAgc2UudGtNZXNzYWdlQm94ID0gdGtNZXNzYWdlQm94CisKKworY2xhc3MgTW9jazoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKTogcGFzcworCitjbGFzcyBHZXRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFNlYXJjaEVuZ2luZS5nZXQgcmV0dXJucyBzaW5nbGV0b24gY3JlYXRlZCAmIHNhdmVkIG9uIGZpcnN0IGNhbGwuCisgICAgZGVmIHRlc3RfZ2V0KHNlbGYpOgorICAgICAgICBzYXZlZF9FbmdpbmUgPSBzZS5TZWFyY2hFbmdpbmUKKyAgICAgICAgc2UuU2VhcmNoRW5naW5lID0gTW9jayAgIyBtb25rZXktcGF0Y2ggY2xhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcm9vdCA9IE1vY2soKQorICAgICAgICAgICAgZW5naW5lID0gc2UuZ2V0KHJvb3QpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZW5naW5lLCBzZS5TZWFyY2hFbmdpbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHJvb3QuX3NlYXJjaGVuZ2luZSwgZW5naW5lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzZS5nZXQocm9vdCksIGVuZ2luZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlLlNlYXJjaEVuZ2luZSA9IHNhdmVkX0VuZ2luZSAgIyByZXN0b3JlIGNsYXNzIHRvIG1vZHVsZQorCitjbGFzcyBHZXRMaW5lQ29sVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyAgVGVzdCBzaW1wbGUgdGV4dC1pbmRlcGVuZGVudCBoZWxwZXIgZnVuY3Rpb24KKyAgICBkZWYgdGVzdF9nZXRfbGluZV9jb2woc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2UuZ2V0X2xpbmVfY29sKCcxLjAnKSwgKDEsIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlLmdldF9saW5lX2NvbCgnMS4xMScpLCAoMSwgMTEpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlLmdldF9saW5lX2NvbCwgKCcxLjAgbGluZWVuZCcpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZS5nZXRfbGluZV9jb2wsICgnZW5kJykpCisKK2NsYXNzIEdldFNlbGVjdGlvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgVGVzdCB0ZXh0LWRlcGVuZGVudCBoZWxwZXIgZnVuY3Rpb24uCisjIyAgICAjIE5lZWQgZ3VpIGZvciB0ZXh0LmluZGV4KCdzZWwuZmlyc3Qvc2VsLmxhc3QvaW5zZXJ0JykuCisjIyAgICBAY2xhc3NtZXRob2QKKyMjICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisjIyAgICAgICAgcmVxdWlyZXMoJ2d1aScpCisjIyAgICAgICAgY2xzLnJvb3QgPSBUaygpCisjIworIyMgICAgQGNsYXNzbWV0aG9kCisjIyAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorIyMgICAgICAgIGNscy5yb290LmRlc3Ryb3koKQorIyMgICAgICAgIGRlbCBjbHMucm9vdAorCisgICAgZGVmIHRlc3RfZ2V0X3NlbGVjdGlvbihzZWxmKToKKyAgICAgICAgIyB0ZXh0ID0gVGV4dChtYXN0ZXI9c2VsZi5yb290KQorICAgICAgICB0ZXh0ID0gbW9ja1RleHQoKQorICAgICAgICB0ZXh0Lmluc2VydCgnMS4wJywgICdIZWxsbyBXb3JsZCEnKQorCisgICAgICAgICMgZml4IHRleHQuaW5kZXggcmVzdWx0IHdoZW4gY2FsbGVkIGluIGdldF9zZWxlY3Rpb24KKyAgICAgICAgZGVmIHNlbChzKToKKyAgICAgICAgICAgICMgc2VsZWN0IGVudGlyZSB0ZXh0LCBjdXJzb3IgaXJyZWxldmFudAorICAgICAgICAgICAgaWYgcyA9PSAnc2VsLmZpcnN0JzogcmV0dXJuICcxLjAnCisgICAgICAgICAgICBpZiBzID09ICdzZWwubGFzdCc6IHJldHVybiAnMS4xMicKKyAgICAgICAgICAgIHJhaXNlIFRjbEVycm9yCisgICAgICAgIHRleHQuaW5kZXggPSBzZWwgICMgcmVwbGFjZXMgLnRhZ19hZGQoJ3NlbCcsICcxLjAsICcxLjEyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZS5nZXRfc2VsZWN0aW9uKHRleHQpLCAoJzEuMCcsICcxLjEyJykpCisKKyAgICAgICAgZGVmIG1hcmsocyk6CisgICAgICAgICAgICAjIG5vIHNlbGVjdGlvbiwgY3Vyc29yIGFmdGVyICdIZWxsbycKKyAgICAgICAgICAgIGlmIHMgPT0gJ2luc2VydCc6IHJldHVybiAnMS41JworICAgICAgICAgICAgcmFpc2UgVGNsRXJyb3IKKyAgICAgICAgdGV4dC5pbmRleCA9IG1hcmsgICMgcmVwbGFjZXMgLm1hcmtfc2V0KCdpbnNlcnQnLCAnMS41JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZS5nZXRfc2VsZWN0aW9uKHRleHQpLCAoJzEuNScsICcxLjUnKSkKKworCitjbGFzcyBSZXZlcnNlU2VhcmNoVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBUZXN0IGhlbHBlciBmdW5jdGlvbiB0aGF0IHNlYXJjaGVzIGJhY2t3YXJkcyB3aXRoaW4gYSBsaW5lLgorICAgIGRlZiB0ZXN0X3NlYXJjaF9yZXZlcnNlKHNlbGYpOgorICAgICAgICBFcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbGluZSA9ICJIZXJlIGlzIGFuICdpcycgdGVzdCB0ZXh0LiIKKyAgICAgICAgcHJvZyA9IHJlLmNvbXBpbGUoJ2lzJykKKyAgICAgICAgRXF1YWwoc2Uuc2VhcmNoX3JldmVyc2UocHJvZywgbGluZSwgbGVuKGxpbmUpKS5zcGFuKCksICgxMiwgMTQpKQorICAgICAgICBFcXVhbChzZS5zZWFyY2hfcmV2ZXJzZShwcm9nLCBsaW5lLCAxNCkuc3BhbigpLCAoMTIsIDE0KSkKKyAgICAgICAgRXF1YWwoc2Uuc2VhcmNoX3JldmVyc2UocHJvZywgbGluZSwgMTMpLnNwYW4oKSwgKDUsIDcpKQorICAgICAgICBFcXVhbChzZS5zZWFyY2hfcmV2ZXJzZShwcm9nLCBsaW5lLCA3KS5zcGFuKCksICg1LCA3KSkKKyAgICAgICAgRXF1YWwoc2Uuc2VhcmNoX3JldmVyc2UocHJvZywgbGluZSwgNiksIE5vbmUpCisKKworY2xhc3MgU2VhcmNoRW5naW5lVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBUZXN0IGNsYXNzIG1ldGhvZHMgdGhhdCBkbyBub3QgdXNlIFRleHQgd2lkZ2V0LgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmVuZ2luZSA9IHNlLlNlYXJjaEVuZ2luZShyb290PU5vbmUpCisgICAgICAgICMgRW5naW5lLnJvb3QgaXMgb25seSB1c2VkIHRvIGNyZWF0ZSBlcnJvciBtZXNzYWdlIGJveGVzLgorICAgICAgICAjIFRoZSBtb2NrIHJlcGxhY2VtZW50IGlnbm9yZXMgdGhlIHJvb3QgYXJndW1lbnQuCisKKyAgICBkZWYgdGVzdF9pc19nZXQoc2VsZik6CisgICAgICAgIGVuZ2luZSA9IHNlbGYuZW5naW5lCisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgIEVxdWFsKGVuZ2luZS5nZXRwYXQoKSwgJycpCisgICAgICAgIGVuZ2luZS5zZXRwYXQoJ2hlbGxvJykKKyAgICAgICAgRXF1YWwoZW5naW5lLmdldHBhdCgpLCAnaGVsbG8nKQorCisgICAgICAgIEVxdWFsKGVuZ2luZS5pc3JlKCksIEZhbHNlKQorICAgICAgICBlbmdpbmUucmV2YXIuc2V0KDEpCisgICAgICAgIEVxdWFsKGVuZ2luZS5pc3JlKCksIFRydWUpCisKKyAgICAgICAgRXF1YWwoZW5naW5lLmlzY2FzZSgpLCBGYWxzZSkKKyAgICAgICAgZW5naW5lLmNhc2V2YXIuc2V0KDEpCisgICAgICAgIEVxdWFsKGVuZ2luZS5pc2Nhc2UoKSwgVHJ1ZSkKKworICAgICAgICBFcXVhbChlbmdpbmUuaXN3b3JkKCksIEZhbHNlKQorICAgICAgICBlbmdpbmUud29yZHZhci5zZXQoMSkKKyAgICAgICAgRXF1YWwoZW5naW5lLmlzd29yZCgpLCBUcnVlKQorCisgICAgICAgIEVxdWFsKGVuZ2luZS5pc3dyYXAoKSwgVHJ1ZSkKKyAgICAgICAgZW5naW5lLndyYXB2YXIuc2V0KDApCisgICAgICAgIEVxdWFsKGVuZ2luZS5pc3dyYXAoKSwgRmFsc2UpCisKKyAgICAgICAgRXF1YWwoZW5naW5lLmlzYmFjaygpLCBGYWxzZSkKKyAgICAgICAgZW5naW5lLmJhY2t2YXIuc2V0KDEpCisgICAgICAgIEVxdWFsKGVuZ2luZS5pc2JhY2soKSwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X3NldGNvb2tlZHBhdChzZWxmKToKKyAgICAgICAgZW5naW5lID0gc2VsZi5lbmdpbmUKKyAgICAgICAgZW5naW5lLnNldGNvb2tlZHBhdCgnXHMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuZ2luZS5nZXRwYXQoKSwgJ1xzJykKKyAgICAgICAgZW5naW5lLnJldmFyLnNldCgxKQorICAgICAgICBlbmdpbmUuc2V0Y29va2VkcGF0KCdccycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5naW5lLmdldHBhdCgpLCByJ1xccycpCisKKyAgICBkZWYgdGVzdF9nZXRjb29rZWRwYXQoc2VsZik6CisgICAgICAgIGVuZ2luZSA9IHNlbGYuZW5naW5lCisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgIEVxdWFsKGVuZ2luZS5nZXRjb29rZWRwYXQoKSwgJycpCisgICAgICAgIGVuZ2luZS5zZXRwYXQoJ2hlbGxvJykKKyAgICAgICAgRXF1YWwoZW5naW5lLmdldGNvb2tlZHBhdCgpLCAnaGVsbG8nKQorICAgICAgICBlbmdpbmUud29yZHZhci5zZXQoVHJ1ZSkKKyAgICAgICAgRXF1YWwoZW5naW5lLmdldGNvb2tlZHBhdCgpLCByJ1xiaGVsbG9cYicpCisgICAgICAgIGVuZ2luZS53b3JkdmFyLnNldChGYWxzZSkKKworICAgICAgICBlbmdpbmUuc2V0cGF0KCdccycpCisgICAgICAgIEVxdWFsKGVuZ2luZS5nZXRjb29rZWRwYXQoKSwgcidcXHMnKQorICAgICAgICBlbmdpbmUucmV2YXIuc2V0KFRydWUpCisgICAgICAgIEVxdWFsKGVuZ2luZS5nZXRjb29rZWRwYXQoKSwgJ1xzJykKKworICAgIGRlZiB0ZXN0X2dldHByb2coc2VsZik6CisgICAgICAgIGVuZ2luZSA9IHNlbGYuZW5naW5lCisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgIGVuZ2luZS5zZXRwYXQoJ0hlbGxvJykKKyAgICAgICAgdGVtcHBhdCA9IGVuZ2luZS5nZXRwcm9nKCkKKyAgICAgICAgRXF1YWwodGVtcHBhdC5wYXR0ZXJuLCByZS5jb21waWxlKCdIZWxsbycsIHJlLklHTk9SRUNBU0UpLnBhdHRlcm4pCisgICAgICAgIGVuZ2luZS5jYXNldmFyLnNldCgxKQorICAgICAgICB0ZW1wcGF0ID0gZW5naW5lLmdldHByb2coKQorICAgICAgICBFcXVhbCh0ZW1wcGF0LnBhdHRlcm4sIHJlLmNvbXBpbGUoJ0hlbGxvJykucGF0dGVybiwgMCkKKworICAgICAgICBlbmdpbmUuc2V0cGF0KCcnKQorICAgICAgICBFcXVhbChlbmdpbmUuZ2V0cHJvZygpLCBOb25lKQorICAgICAgICBlbmdpbmUuc2V0cGF0KCcrJykKKyAgICAgICAgZW5naW5lLnJldmFyLnNldCgxKQorICAgICAgICBFcXVhbChlbmdpbmUuZ2V0cHJvZygpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE1ib3guc2hvd2Vycm9yLm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdFcnJvcjogbm90aGluZyB0byByZXBlYXRcblBhdHRlcm46ICsnKQorCisgICAgZGVmIHRlc3RfcmVwb3J0X2Vycm9yKHNlbGYpOgorICAgICAgICBzaG93ZXJyb3IgPSBNYm94LnNob3dlcnJvcgorICAgICAgICBFcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgcGF0ID0gJ1thLXonCisgICAgICAgIG1zZyA9ICd1bmV4cGVjdGVkIGVuZCBvZiByZWd1bGFyIGV4cHJlc3Npb24nCisKKyAgICAgICAgRXF1YWwoc2VsZi5lbmdpbmUucmVwb3J0X2Vycm9yKHBhdCwgbXNnKSwgTm9uZSkKKyAgICAgICAgRXF1YWwoc2hvd2Vycm9yLnRpdGxlLCAnUmVndWxhciBleHByZXNzaW9uIGVycm9yJykKKyAgICAgICAgZXhwZWN0ZWRfbWVzc2FnZSA9ICgiRXJyb3I6ICIgKyBtc2cgKyAiXG5QYXR0ZXJuOiBbYS16IikKKyAgICAgICAgRXF1YWwoc2hvd2Vycm9yLm1lc3NhZ2UsIGV4cGVjdGVkX21lc3NhZ2UpCisKKyAgICAgICAgRXF1YWwoc2VsZi5lbmdpbmUucmVwb3J0X2Vycm9yKHBhdCwgbXNnLCA1KSwgTm9uZSkKKyAgICAgICAgRXF1YWwoc2hvd2Vycm9yLnRpdGxlLCAnUmVndWxhciBleHByZXNzaW9uIGVycm9yJykKKyAgICAgICAgZXhwZWN0ZWRfbWVzc2FnZSArPSAiXG5PZmZzZXQ6IDUiCisgICAgICAgIEVxdWFsKHNob3dlcnJvci5tZXNzYWdlLCBleHBlY3RlZF9tZXNzYWdlKQorCisKK2NsYXNzIFNlYXJjaFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgVGVzdCB0aGF0IHNlYXJjaF90ZXh0IG1ha2VzIHJpZ2h0IGNhbGwgdG8gcmlnaHQgbWV0aG9kLgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyMjICAgICAgICByZXF1aXJlcygnZ3VpJykKKyMjICAgICAgICBjbHMucm9vdCA9IFRrKCkKKyMjICAgICAgICBjbHMudGV4dCA9IFRleHQobWFzdGVyPWNscy5yb290KQorICAgICAgICBjbHMudGV4dCA9IG1vY2tUZXh0KCkKKyAgICAgICAgdGVzdF90ZXh0ID0gKAorICAgICAgICAgICAgJ0ZpcnN0IGxpbmVcbicKKyAgICAgICAgICAgICdMaW5lIHdpdGggdGFyZ2V0XG4nCisgICAgICAgICAgICAnTGFzdCBsaW5lXG4nKQorICAgICAgICBjbHMudGV4dC5pbnNlcnQoJzEuMCcsIHRlc3RfdGV4dCkKKyAgICAgICAgY2xzLnBhdCA9IHJlLmNvbXBpbGUoJ3RhcmdldCcpCisKKyAgICAgICAgY2xzLmVuZ2luZSA9IHNlLlNlYXJjaEVuZ2luZShOb25lKQorICAgICAgICBjbHMuZW5naW5lLnNlYXJjaF9mb3J3YXJkID0gbGFtYmRhICphcmdzOiAoJ2YnLCBhcmdzKQorICAgICAgICBjbHMuZW5naW5lLnNlYXJjaF9iYWNrd2FyZCA9IGxhbWJkYSAqYXJnczogKCdiJywgYXJncykKKworIyMgICAgQGNsYXNzbWV0aG9kCisjIyAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorIyMgICAgICAgIGNscy5yb290LmRlc3Ryb3koKQorIyMgICAgICAgIGRlbCBjbHMucm9vdAorCisgICAgZGVmIHRlc3Rfc2VhcmNoKHNlbGYpOgorICAgICAgICBFcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZW5naW5lID0gc2VsZi5lbmdpbmUKKyAgICAgICAgc2VhcmNoID0gZW5naW5lLnNlYXJjaF90ZXh0CisgICAgICAgIHRleHQgPSBzZWxmLnRleHQKKyAgICAgICAgcGF0ID0gc2VsZi5wYXQKKworICAgICAgICBlbmdpbmUucGF0dmFyLnNldChOb25lKQorICAgICAgICAjZW5naW5lLnJldmFyLnNldChwYXQpCisgICAgICAgIEVxdWFsKHNlYXJjaCh0ZXh0KSwgTm9uZSkKKworICAgICAgICBkZWYgbWFyayhzKToKKyAgICAgICAgICAgICMgbm8gc2VsZWN0aW9uLCBjdXJzb3IgYWZ0ZXIgJ0hlbGxvJworICAgICAgICAgICAgaWYgcyA9PSAnaW5zZXJ0JzogcmV0dXJuICcxLjUnCisgICAgICAgICAgICByYWlzZSBUY2xFcnJvcgorICAgICAgICB0ZXh0LmluZGV4ID0gbWFyaworICAgICAgICBFcXVhbChzZWFyY2godGV4dCwgcGF0KSwgKCdmJywgKHRleHQsIHBhdCwgMSwgNSwgVHJ1ZSwgRmFsc2UpKSkKKyAgICAgICAgZW5naW5lLndyYXB2YXIuc2V0KEZhbHNlKQorICAgICAgICBFcXVhbChzZWFyY2godGV4dCwgcGF0KSwgKCdmJywgKHRleHQsIHBhdCwgMSwgNSwgRmFsc2UsIEZhbHNlKSkpCisgICAgICAgIGVuZ2luZS53cmFwdmFyLnNldChUcnVlKQorICAgICAgICBlbmdpbmUuYmFja3Zhci5zZXQoVHJ1ZSkKKyAgICAgICAgRXF1YWwoc2VhcmNoKHRleHQsIHBhdCksICgnYicsICh0ZXh0LCBwYXQsIDEsIDUsIFRydWUsIEZhbHNlKSkpCisgICAgICAgIGVuZ2luZS5iYWNrdmFyLnNldChGYWxzZSkKKworICAgICAgICBkZWYgc2VsKHMpOgorICAgICAgICAgICAgaWYgcyA9PSAnc2VsLmZpcnN0JzogcmV0dXJuICcyLjEwJworICAgICAgICAgICAgaWYgcyA9PSAnc2VsLmxhc3QnOiByZXR1cm4gJzIuMTYnCisgICAgICAgICAgICByYWlzZSBUY2xFcnJvcgorICAgICAgICB0ZXh0LmluZGV4ID0gc2VsCisgICAgICAgIEVxdWFsKHNlYXJjaCh0ZXh0LCBwYXQpLCAoJ2YnLCAodGV4dCwgcGF0LCAyLCAxNiwgVHJ1ZSwgRmFsc2UpKSkKKyAgICAgICAgRXF1YWwoc2VhcmNoKHRleHQsIHBhdCwgVHJ1ZSksICgnZicsICh0ZXh0LCBwYXQsIDIsIDEwLCBUcnVlLCBUcnVlKSkpCisgICAgICAgIGVuZ2luZS5iYWNrdmFyLnNldChUcnVlKQorICAgICAgICBFcXVhbChzZWFyY2godGV4dCwgcGF0KSwgKCdiJywgKHRleHQsIHBhdCwgMiwgMTAsIFRydWUsIEZhbHNlKSkpCisgICAgICAgIEVxdWFsKHNlYXJjaCh0ZXh0LCBwYXQsIFRydWUpLCAoJ2InLCAodGV4dCwgcGF0LCAyLCAxNiwgVHJ1ZSwgVHJ1ZSkpKQorCisKK2NsYXNzIEZvcndhcmRCYWNrd2FyZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgVGVzdCB0aGF0IHNlYXJjaF9mb3J3YXJkIG1ldGhvZCBmaW5kcyB0aGUgdGFyZ2V0LgorIyMgICAgQGNsYXNzbWV0aG9kCisjIyAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorIyMgICAgICAgIGNscy5yb290LmRlc3Ryb3koKQorIyMgICAgICAgIGRlbCBjbHMucm9vdAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgY2xzLmVuZ2luZSA9IHNlLlNlYXJjaEVuZ2luZShOb25lKQorIyMgICAgICAgIHJlcXVpcmVzKCdndWknKQorIyMgICAgICAgIGNscy5yb290ID0gVGsoKQorIyMgICAgICAgIGNscy50ZXh0ID0gVGV4dChtYXN0ZXI9Y2xzLnJvb3QpCisgICAgICAgIGNscy50ZXh0ID0gbW9ja1RleHQoKQorICAgICAgICAjIHNlYXJjaF9iYWNrd2FyZCBjYWxscyBpbmRleCgnZW5kLTFjJykKKyAgICAgICAgY2xzLnRleHQuaW5kZXggPSBsYW1iZGEgaW5kZXg6ICc0LjAnCisgICAgICAgIHRlc3RfdGV4dCA9ICgKKyAgICAgICAgICAgICdGaXJzdCBsaW5lXG4nCisgICAgICAgICAgICAnTGluZSB3aXRoIHRhcmdldFxuJworICAgICAgICAgICAgJ0xhc3QgbGluZVxuJykKKyAgICAgICAgY2xzLnRleHQuaW5zZXJ0KCcxLjAnLCB0ZXN0X3RleHQpCisgICAgICAgIGNscy5wYXQgPSByZS5jb21waWxlKCd0YXJnZXQnKQorICAgICAgICBjbHMucmVzID0gKDIsICgxMCwgMTYpKSAgIyBsaW5lLCBzbGljZSBpbmRleGVzIG9mICd0YXJnZXQnCisgICAgICAgIGNscy5mYWlscGF0ID0gcmUuY29tcGlsZSgneHl6JykgICMgbm90IGluIHRleHQKKyAgICAgICAgY2xzLmVtcHR5cGF0ID0gcmUuY29tcGlsZSgnXHcqJykgICMgZW1wdHkgbWF0Y2ggcG9zc2libGUKKworICAgIGRlZiBtYWtlX3NlYXJjaChzZWxmLCBmdW5jKToKKyAgICAgICAgZGVmIHNlYXJjaChwYXQsIGxpbmUsIGNvbCwgd3JhcCwgb2s9MCk6CisgICAgICAgICAgICByZXMgPSBmdW5jKHNlbGYudGV4dCwgcGF0LCBsaW5lLCBjb2wsIHdyYXAsIG9rKQorICAgICAgICAgICAgIyByZXMgaXMgKGxpbmUsIG1hdGNob2JqZWN0KSBvciBOb25lCisgICAgICAgICAgICByZXR1cm4gKHJlc1swXSwgcmVzWzFdLnNwYW4oKSkgaWYgcmVzIGVsc2UgcmVzCisgICAgICAgIHJldHVybiBzZWFyY2gKKworICAgIGRlZiB0ZXN0X3NlYXJjaF9mb3J3YXJkKHNlbGYpOgorICAgICAgICAjIHNlYXJjaCBmb3Igbm9uLWVtcHR5IG1hdGNoCisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBmb3J3YXJkID0gc2VsZi5tYWtlX3NlYXJjaChzZWxmLmVuZ2luZS5zZWFyY2hfZm9yd2FyZCkKKyAgICAgICAgcGF0ID0gc2VsZi5wYXQKKyAgICAgICAgRXF1YWwoZm9yd2FyZChwYXQsIDEsIDAsIFRydWUpLCBzZWxmLnJlcykKKyAgICAgICAgRXF1YWwoZm9yd2FyZChwYXQsIDMsIDAsIFRydWUpLCBzZWxmLnJlcykgICMgd3JhcAorICAgICAgICBFcXVhbChmb3J3YXJkKHBhdCwgMywgMCwgRmFsc2UpLCBOb25lKSAgIyBubyB3cmFwCisgICAgICAgIEVxdWFsKGZvcndhcmQocGF0LCAyLCAxMCwgRmFsc2UpLCBzZWxmLnJlcykKKworICAgICAgICBFcXVhbChmb3J3YXJkKHNlbGYuZmFpbHBhdCwgMSwgMCwgVHJ1ZSksIE5vbmUpCisgICAgICAgIEVxdWFsKGZvcndhcmQoc2VsZi5lbXB0eXBhdCwgMiwgIDksIFRydWUsIG9rPVRydWUpLCAoMiwgKDksIDkpKSkKKyAgICAgICAgI0VxdWFsKGZvcndhcmQoc2VsZi5lbXB0eXBhdCwgMiwgOSwgVHJ1ZSksIHNlbGYucmVzKQorICAgICAgICAjIFdoaWxlIHRoZSBpbml0aWFsIGVtcHR5IG1hdGNoIGlzIGNvcnJlY3RseSBpZ25vcmVkLCBza2lwcGluZworICAgICAgICAjIHRoZSByZXN0IG9mIHRoZSBsaW5lIGFuZCByZXR1cm5pbmcgKDMsICgwLDQpKSBzZWVtcyBidWdneSAtIHRqci4KKyAgICAgICAgRXF1YWwoZm9yd2FyZChzZWxmLmVtcHR5cGF0LCAyLCAxMCwgVHJ1ZSksIHNlbGYucmVzKQorCisgICAgZGVmIHRlc3Rfc2VhcmNoX2JhY2t3YXJkKHNlbGYpOgorICAgICAgICAjIHNlYXJjaCBmb3Igbm9uLWVtcHR5IG1hdGNoCisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBiYWNrd2FyZCA9IHNlbGYubWFrZV9zZWFyY2goc2VsZi5lbmdpbmUuc2VhcmNoX2JhY2t3YXJkKQorICAgICAgICBwYXQgPSBzZWxmLnBhdAorICAgICAgICBFcXVhbChiYWNrd2FyZChwYXQsIDMsIDUsIFRydWUpLCBzZWxmLnJlcykKKyAgICAgICAgRXF1YWwoYmFja3dhcmQocGF0LCAyLCAwLCBUcnVlKSwgc2VsZi5yZXMpICAjIHdyYXAKKyAgICAgICAgRXF1YWwoYmFja3dhcmQocGF0LCAyLCAwLCBGYWxzZSksIE5vbmUpICAjIG5vIHdyYXAKKyAgICAgICAgRXF1YWwoYmFja3dhcmQocGF0LCAyLCAxNiwgRmFsc2UpLCBzZWxmLnJlcykKKworICAgICAgICBFcXVhbChiYWNrd2FyZChzZWxmLmZhaWxwYXQsIDMsIDksIFRydWUpLCBOb25lKQorICAgICAgICBFcXVhbChiYWNrd2FyZChzZWxmLmVtcHR5cGF0LCAyLCAgMTAsIFRydWUsIG9rPVRydWUpLCAoMiwgKDksOSkpKQorICAgICAgICAjIEFjY2VwdGVkIGJlY2F1c2UgOSA8IDEwLCBub3QgYmVjYXVzZSBvaz1UcnVlLgorICAgICAgICAjIEl0IGlzIG5vdCBjbGVhciB0aGF0IG9rPVRydWUgaXMgdXNlZnVsIGdvaW5nIGJhY2sgLSB0anIKKyAgICAgICAgRXF1YWwoYmFja3dhcmQoc2VsZi5lbXB0eXBhdCwgMiwgOSwgVHJ1ZSksICgyLCAoNSwgOSkpKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MiwgZXhpdD0yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdGV4dC5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3RleHQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBiOWI3NgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3RleHQucHkKQEAgLTAsMCArMSwyMjggQEAKKyMgVGVzdCBtb2NrX3RrLlRleHQgY2xhc3MgYWdhaW5zdCB0a2ludGVyLlRleHQgY2xhc3MgYnkgcnVubmluZyBzYW1lIHRlc3RzIHdpdGggYm90aC4KK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKKworZnJvbSBfdGtpbnRlciBpbXBvcnQgVGNsRXJyb3IKK2ltcG9ydCBUa2ludGVyIGFzIHRrCisKK2NsYXNzIFRleHRUZXN0KG9iamVjdCk6CisKKyAgICBodyA9ICdoZWxsb1xud29ybGQnICAjIHVzdWFsIGluaXRpYWwgaW5zZXJ0IGFmdGVyIGluaXRpYWxpemF0aW9uCisgICAgaHduID0gaHcrJ1xuJyAgIyBcbiBwcmVzZW50IGF0IGluaXRpYWxpemF0aW9uLCBiZWZvcmUgaW5zZXJ0CisKKyAgICBUZXh0ID0gTm9uZQorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi50ZXh0ID0gc2VsZi5UZXh0KCkKKworICAgIGRlZiB0ZXN0X2luaXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50ZXh0LmdldCgnMS4wJyksICdcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50ZXh0LmdldCgnZW5kJyksICcnKQorCisgICAgZGVmIHRlc3RfaW5kZXhfZW1wdHkoc2VsZik6CisgICAgICAgIGluZGV4ID0gc2VsZi50ZXh0LmluZGV4CisKKyAgICAgICAgZm9yIGRleCBpbiAoLTEuMCwgMC4zLCAnMS4tMScsICcxLjAnLCAnMS4wIGxpbmVlbmQnLCAnMS5lbmQnLCAnMS4zMycsCisgICAgICAgICAgICAgICAgJ2luc2VydCcpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmRleChkZXgpLCAnMS4wJykKKworICAgICAgICBmb3IgZGV4IGluICdlbmQnLCAyLjAsICcyLjEnLCAnMzMuNDQnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmRleChkZXgpLCAnMi4wJykKKworICAgIGRlZiB0ZXN0X2luZGV4X2RhdGEoc2VsZik6CisgICAgICAgIGluZGV4ID0gc2VsZi50ZXh0LmluZGV4CisgICAgICAgIHNlbGYudGV4dC5pbnNlcnQoJzEuMCcsIHNlbGYuaHcpCisKKyAgICAgICAgZm9yIGRleCBpbiAtMS4wLCAwLjMsICcxLi0xJywgJzEuMCc6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZGV4KGRleCksICcxLjAnKQorCisgICAgICAgIGZvciBkZXggaW4gJzEuMCBsaW5lZW5kJywgJzEuZW5kJywgJzEuMzMnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmRleChkZXgpLCAnMS41JykKKworICAgICAgICBmb3IgZGV4IGluICdlbmQnLCAgJzMzLjQ0JzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5kZXgoZGV4KSwgJzMuMCcpCisKKyAgICBkZWYgdGVzdF9nZXQoc2VsZik6CisgICAgICAgIGdldCA9IHNlbGYudGV4dC5nZXQKKyAgICAgICAgRXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHNlbGYudGV4dC5pbnNlcnQoJzEuMCcsIHNlbGYuaHcpCisKKyAgICAgICAgRXF1YWwoZ2V0KCdlbmQnKSwgJycpCisgICAgICAgIEVxdWFsKGdldCgnZW5kJywgJ2VuZCcpLCAnJykKKyAgICAgICAgRXF1YWwoZ2V0KCcxLjAnKSwgJ2gnKQorICAgICAgICBFcXVhbChnZXQoJzEuMCcsICcxLjEnKSwgJ2gnKQorICAgICAgICBFcXVhbChnZXQoJzEuMCcsICcxLjMnKSwgJ2hlbCcpCisgICAgICAgIEVxdWFsKGdldCgnMS4xJywgJzEuMycpLCAnZWwnKQorICAgICAgICBFcXVhbChnZXQoJzEuMCcsICcxLjAgbGluZWVuZCcpLCAnaGVsbG8nKQorICAgICAgICBFcXVhbChnZXQoJzEuMCcsICcxLjEwJyksICdoZWxsbycpCisgICAgICAgIEVxdWFsKGdldCgnMS4wIGxpbmVlbmQnKSwgJ1xuJykKKyAgICAgICAgRXF1YWwoZ2V0KCcxLjEnLCAnMi4zJyksICdlbGxvXG53b3InKQorICAgICAgICBFcXVhbChnZXQoJzEuMCcsICcyLjUnKSwgc2VsZi5odykKKyAgICAgICAgRXF1YWwoZ2V0KCcxLjAnLCAnZW5kJyksIHNlbGYuaHduKQorICAgICAgICBFcXVhbChnZXQoJzAuMCcsICc1LjAnKSwgc2VsZi5od24pCisKKyAgICBkZWYgdGVzdF9pbnNlcnQoc2VsZik6CisgICAgICAgIGluc2VydCA9IHNlbGYudGV4dC5pbnNlcnQKKyAgICAgICAgZ2V0ID0gc2VsZi50ZXh0LmdldAorICAgICAgICBFcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKworICAgICAgICBpbnNlcnQoJzEuMCcsIHNlbGYuaHcpCisgICAgICAgIEVxdWFsKGdldCgnMS4wJywgJ2VuZCcpLCBzZWxmLmh3bikKKworICAgICAgICBpbnNlcnQoJzEuMCcsICcnKSAgIyBub3RoaW5nCisgICAgICAgIEVxdWFsKGdldCgnMS4wJywgJ2VuZCcpLCBzZWxmLmh3bikKKworICAgICAgICBpbnNlcnQoJzEuMCcsICcqJykKKyAgICAgICAgRXF1YWwoZ2V0KCcxLjAnLCAnZW5kJyksICcqaGVsbG9cbndvcmxkXG4nKQorCisgICAgICAgIGluc2VydCgnMS4wIGxpbmVlbmQnLCAnKicpCisgICAgICAgIEVxdWFsKGdldCgnMS4wJywgJ2VuZCcpLCAnKmhlbGxvKlxud29ybGRcbicpCisKKyAgICAgICAgaW5zZXJ0KCcyLjMnLCAnKicpCisgICAgICAgIEVxdWFsKGdldCgnMS4wJywgJ2VuZCcpLCAnKmhlbGxvKlxud29yKmxkXG4nKQorCisgICAgICAgIGluc2VydCgnZW5kJywgJ3gnKQorICAgICAgICBFcXVhbChnZXQoJzEuMCcsICdlbmQnKSwgJypoZWxsbypcbndvcipsZHhcbicpCisKKyAgICAgICAgaW5zZXJ0KCcxLjQnLCAneFxuJykKKyAgICAgICAgRXF1YWwoZ2V0KCcxLjAnLCAnZW5kJyksICcqaGVseFxubG8qXG53b3IqbGR4XG4nKQorCisgICAgZGVmIHRlc3Rfbm9fZGVsZXRlKHNlbGYpOgorICAgICAgICAjIGlmIGluZGV4MSA9PSAnaW5zZXJ0JyBvciAnZW5kJyBvciA+PSBlbmQsIHRoZXJlIGlzIG5vIGRlbGV0aW9uCisgICAgICAgIGRlbGV0ZSA9IHNlbGYudGV4dC5kZWxldGUKKyAgICAgICAgZ2V0ID0gc2VsZi50ZXh0LmdldAorICAgICAgICBFcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgc2VsZi50ZXh0Lmluc2VydCgnMS4wJywgc2VsZi5odykKKworICAgICAgICBkZWxldGUoJ2luc2VydCcpCisgICAgICAgIEVxdWFsKGdldCgnMS4wJywgJ2VuZCcpLCBzZWxmLmh3bikKKworICAgICAgICBkZWxldGUoJ2VuZCcpCisgICAgICAgIEVxdWFsKGdldCgnMS4wJywgJ2VuZCcpLCBzZWxmLmh3bikKKworICAgICAgICBkZWxldGUoJ2luc2VydCcsICdlbmQnKQorICAgICAgICBFcXVhbChnZXQoJzEuMCcsICdlbmQnKSwgc2VsZi5od24pCisKKyAgICAgICAgZGVsZXRlKCdpbnNlcnQnLCAnNS41JykKKyAgICAgICAgRXF1YWwoZ2V0KCcxLjAnLCAnZW5kJyksIHNlbGYuaHduKQorCisgICAgICAgIGRlbGV0ZSgnMS40JywgJzEuMCcpCisgICAgICAgIEVxdWFsKGdldCgnMS4wJywgJ2VuZCcpLCBzZWxmLmh3bikKKworICAgICAgICBkZWxldGUoJzEuNCcsICcxLjQnKQorICAgICAgICBFcXVhbChnZXQoJzEuMCcsICdlbmQnKSwgc2VsZi5od24pCisKKyAgICBkZWYgdGVzdF9kZWxldGVfY2hhcihzZWxmKToKKyAgICAgICAgZGVsZXRlID0gc2VsZi50ZXh0LmRlbGV0ZQorICAgICAgICBnZXQgPSBzZWxmLnRleHQuZ2V0CisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBzZWxmLnRleHQuaW5zZXJ0KCcxLjAnLCBzZWxmLmh3KQorCisgICAgICAgIGRlbGV0ZSgnMS4wJykKKyAgICAgICAgRXF1YWwoZ2V0KCcxLjAnLCAnMS5lbmQnKSwgJ2VsbG8nKQorCisgICAgICAgIGRlbGV0ZSgnMS4wJywgJzEuMScpCisgICAgICAgIEVxdWFsKGdldCgnMS4wJywgJzEuZW5kJyksICdsbG8nKQorCisgICAgICAgICMgZGVsZXRlIFxuIGFuZCBjb21iaW5lIDIgbGluZXMgaW50byAxCisgICAgICAgIGRlbGV0ZSgnMS5lbmQnKQorICAgICAgICBFcXVhbChnZXQoJzEuMCcsICcxLmVuZCcpLCAnbGxvd29ybGQnKQorCisgICAgICAgIHNlbGYudGV4dC5pbnNlcnQoJzEuMycsICdcbicpCisgICAgICAgIGRlbGV0ZSgnMS4xMCcpCisgICAgICAgIEVxdWFsKGdldCgnMS4wJywgJzEuZW5kJyksICdsbG93b3JsZCcpCisKKyAgICAgICAgc2VsZi50ZXh0Lmluc2VydCgnMS4zJywgJ1xuJykKKyAgICAgICAgZGVsZXRlKCcxLjMnLCAnMi4wJykKKyAgICAgICAgRXF1YWwoZ2V0KCcxLjAnLCAnMS5lbmQnKSwgJ2xsb3dvcmxkJykKKworICAgIGRlZiB0ZXN0X2RlbGV0ZV9zbGljZShzZWxmKToKKyAgICAgICAgZGVsZXRlID0gc2VsZi50ZXh0LmRlbGV0ZQorICAgICAgICBnZXQgPSBzZWxmLnRleHQuZ2V0CisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBzZWxmLnRleHQuaW5zZXJ0KCcxLjAnLCBzZWxmLmh3KQorCisgICAgICAgIGRlbGV0ZSgnMS4wJywgJzEuMCBsaW5lZW5kJykKKyAgICAgICAgRXF1YWwoZ2V0KCcxLjAnLCAnZW5kJyksICdcbndvcmxkXG4nKQorCisgICAgICAgIGRlbGV0ZSgnMS4wJywgJ2VuZCcpCisgICAgICAgIEVxdWFsKGdldCgnMS4wJywgJ2VuZCcpLCAnXG4nKQorCisgICAgICAgIHNlbGYudGV4dC5pbnNlcnQoJzEuMCcsIHNlbGYuaHcpCisgICAgICAgIGRlbGV0ZSgnMS4wJywgJzIuMCcpCisgICAgICAgIEVxdWFsKGdldCgnMS4wJywgJ2VuZCcpLCAnd29ybGRcbicpCisKKyAgICAgICAgZGVsZXRlKCcxLjAnLCAnZW5kJykKKyAgICAgICAgRXF1YWwoZ2V0KCcxLjAnLCAnZW5kJyksICdcbicpCisKKyAgICAgICAgc2VsZi50ZXh0Lmluc2VydCgnMS4wJywgc2VsZi5odykKKyAgICAgICAgZGVsZXRlKCcxLjInLCAnMi4zJykKKyAgICAgICAgRXF1YWwoZ2V0KCcxLjAnLCAnZW5kJyksICdoZWxkXG4nKQorCisgICAgZGVmIHRlc3RfbXVsdGlwbGVfbGluZXMoc2VsZik6ICAjIGluc2VydCBhbmQgZGVsZXRlCisgICAgICAgIHNlbGYudGV4dC5pbnNlcnQoJzEuMCcsICdoZWxsbycpCisKKyAgICAgICAgc2VsZi50ZXh0Lmluc2VydCgnMS4zJywgJzFcbjJcbjNcbjRcbjUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGV4dC5nZXQoJzEuMCcsICdlbmQnKSwgJ2hlbDFcbjJcbjNcbjRcbjVsb1xuJykKKworICAgICAgICBzZWxmLnRleHQuZGVsZXRlKCcxLjMnLCAnNS4xJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRleHQuZ2V0KCcxLjAnLCAnZW5kJyksICdoZWxsb1xuJykKKworICAgIGRlZiB0ZXN0X2NvbXBhcmUoc2VsZik6CisgICAgICAgIGNvbXBhcmUgPSBzZWxmLnRleHQuY29tcGFyZQorICAgICAgICBFcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBuZWVkIGRhdGEgc28gaW5kZXhlcyBub3Qgc3F1aXNoZWQgdG8gMSwwCisgICAgICAgIHNlbGYudGV4dC5pbnNlcnQoJzEuMCcsICdGaXJzdFxuU2Vjb25kXG5UaGlyZFxuJykKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUY2xFcnJvciwgY29tcGFyZSwgJzIuMicsICdvcCcsICcyLjInKQorCisgICAgICAgIGZvciBvcCwgbGVzczEsIGxlc3MwLCBlcXVhbCwgZ3JlYXRlcjAsIGdyZWF0ZXIxIGluICgKKyAgICAgICAgICAgICAgICAoJzwnLCBUcnVlLCBUcnVlLCBGYWxzZSwgRmFsc2UsIEZhbHNlKSwKKyAgICAgICAgICAgICAgICAoJzw9JywgVHJ1ZSwgVHJ1ZSwgVHJ1ZSwgRmFsc2UsIEZhbHNlKSwKKyAgICAgICAgICAgICAgICAoJz4nLCBGYWxzZSwgRmFsc2UsIEZhbHNlLCBUcnVlLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAoJz49JywgRmFsc2UsIEZhbHNlLCBUcnVlLCBUcnVlLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAoJz09JywgRmFsc2UsIEZhbHNlLCBUcnVlLCBGYWxzZSwgRmFsc2UpLAorICAgICAgICAgICAgICAgICgnIT0nLCBUcnVlLCBUcnVlLCBGYWxzZSwgVHJ1ZSwgVHJ1ZSksCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgIEVxdWFsKGNvbXBhcmUoJzEuMScsIG9wLCAnMi4yJyksIGxlc3MxLCBvcCkKKyAgICAgICAgICAgIEVxdWFsKGNvbXBhcmUoJzIuMScsIG9wLCAnMi4yJyksIGxlc3MwLCBvcCkKKyAgICAgICAgICAgIEVxdWFsKGNvbXBhcmUoJzIuMicsIG9wLCAnMi4yJyksIGVxdWFsLCBvcCkKKyAgICAgICAgICAgIEVxdWFsKGNvbXBhcmUoJzIuMycsIG9wLCAnMi4yJyksIGdyZWF0ZXIwLCBvcCkKKyAgICAgICAgICAgIEVxdWFsKGNvbXBhcmUoJzMuMycsIG9wLCAnMi4yJyksIGdyZWF0ZXIxLCBvcCkKKworCitjbGFzcyBNb2NrVGV4dFRlc3QoVGV4dFRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgVGV4dAorICAgICAgICBjbHMuVGV4dCA9IFRleHQKKworICAgIGRlZiB0ZXN0X2RlY29kZShzZWxmKToKKyAgICAgICAgIyB0ZXN0IGVuZGZsYWdzICgtMSwgMCkgbm90IHRlc3RlZCBieSB0ZXN0X2luZGV4ICh3aGljaCB1c2VzICsxKQorICAgICAgICBkZWNvZGUgPSBzZWxmLnRleHQuX2RlY29kZQorICAgICAgICBFcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgc2VsZi50ZXh0Lmluc2VydCgnMS4wJywgc2VsZi5odykKKworICAgICAgICBFcXVhbChkZWNvZGUoJ2VuZCcsIC0xKSwgKDIsIDUpKQorICAgICAgICBFcXVhbChkZWNvZGUoJzMuMScsIC0xKSwgKDIsIDUpKQorICAgICAgICBFcXVhbChkZWNvZGUoJ2VuZCcsICAwKSwgKDIsIDYpKQorICAgICAgICBFcXVhbChkZWNvZGUoJzMuMScsIDApLCAoMiwgNikpCisKKworY2xhc3MgVGtUZXh0VGVzdChUZXh0VGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgcmVxdWlyZXMoJ2d1aScpCisgICAgICAgIGZyb20gVGtpbnRlciBpbXBvcnQgVGssIFRleHQKKyAgICAgICAgY2xzLlRleHQgPSBUZXh0CisgICAgICAgIGNscy5yb290ID0gVGsoKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKKyAgICAgICAgY2xzLnJvb3QuZGVzdHJveSgpCisgICAgICAgIGRlbCBjbHMucm9vdAorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3RleHR2aWV3LnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdGV4dHZpZXcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4MWI2MwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3RleHR2aWV3LnB5CkBAIC0wLDAgKzEsOTYgQEAKKycnJ1Rlc3QgdGhlIGZ1bmN0aW9ucyBhbmQgbWFpbiBjbGFzcyBtZXRob2Qgb2YgdGV4dFZpZXcucHkuJycnCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9zCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCByZXF1aXJlcworZnJvbSBUa2ludGVyIGltcG9ydCBUaworZnJvbSBpZGxlbGliIGltcG9ydCB0ZXh0VmlldyBhcyB0dgorZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX2lkbGUgaW1wb3J0IEZ1bmMKK2Zyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgTWJveAorCitvcmlnX21ib3ggPSB0di50a01lc3NhZ2VCb3gKKworY2xhc3MgdGV4dHZpZXdDbGFzc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgcmVxdWlyZXMoJ2d1aScpCisgICAgICAgIGNscy5yb290ID0gVGsoKQorICAgICAgICBjbHMuVFYgPSBUViA9IHR2LlRleHRWaWV3ZXIKKyAgICAgICAgVFYudHJhbnNpZW50ID0gRnVuYygpCisgICAgICAgIFRWLmdyYWJfc2V0ID0gRnVuYygpCisgICAgICAgIFRWLndhaXRfd2luZG93ID0gRnVuYygpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICBjbHMucm9vdC5kZXN0cm95KCkKKyAgICAgICAgVFYgPSBjbHMuVFYKKyAgICAgICAgZGVsIGNscy5yb290LCBjbHMuVFYKKyAgICAgICAgZGVsIFRWLnRyYW5zaWVudCwgVFYuZ3JhYl9zZXQsIFRWLndhaXRfd2luZG93CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIFRWID0gc2VsZi5UVgorICAgICAgICBUVi50cmFuc2llbnQuX19pbml0X18oKQorICAgICAgICBUVi5ncmFiX3NldC5fX2luaXRfXygpCisgICAgICAgIFRWLndhaXRfd2luZG93Ll9faW5pdF9fKCkKKworCisgICAgZGVmIHRlc3RfaW5pdF9tb2RhbChzZWxmKToKKyAgICAgICAgVFYgPSBzZWxmLlRWCisgICAgICAgIHZpZXcgPSBUVihzZWxmLnJvb3QsICdUaXRsZScsICd0ZXN0IHRleHQnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoVFYudHJhbnNpZW50LmNhbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFRWLmdyYWJfc2V0LmNhbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFRWLndhaXRfd2luZG93LmNhbGxlZCkKKyAgICAgICAgdmlldy5PaygpCisKKyAgICBkZWYgdGVzdF9pbml0X25vbm1vZGFsKHNlbGYpOgorICAgICAgICBUViA9IHNlbGYuVFYKKyAgICAgICAgdmlldyA9IFRWKHNlbGYucm9vdCwgJ1RpdGxlJywgJ3Rlc3QgdGV4dCcsIG1vZGFsPUZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKFRWLnRyYW5zaWVudC5jYWxsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoVFYuZ3JhYl9zZXQuY2FsbGVkKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKFRWLndhaXRfd2luZG93LmNhbGxlZCkKKyAgICAgICAgdmlldy5PaygpCisKKyAgICBkZWYgdGVzdF9vayhzZWxmKToKKyAgICAgICAgdmlldyA9IHNlbGYuVFYoc2VsZi5yb290LCAnVGl0bGUnLCAndGVzdCB0ZXh0JywgbW9kYWw9RmFsc2UpCisgICAgICAgIHZpZXcuZGVzdHJveSA9IEZ1bmMoKQorICAgICAgICB2aWV3Lk9rKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZpZXcuZGVzdHJveS5jYWxsZWQpCisgICAgICAgIGRlbCB2aWV3LmRlc3Ryb3kgICMgdW5tYXNrIHJlYWwgZnVuY3Rpb24KKyAgICAgICAgdmlldy5kZXN0cm95CisKKworY2xhc3MgdGV4dHZpZXdUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIHJlcXVpcmVzKCdndWknKQorICAgICAgICBjbHMucm9vdCA9IFRrKCkKKyAgICAgICAgdHYudGtNZXNzYWdlQm94ID0gTWJveAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKKyAgICAgICAgY2xzLnJvb3QuZGVzdHJveSgpCisgICAgICAgIGRlbCBjbHMucm9vdAorICAgICAgICB0di50a01lc3NhZ2VCb3ggPSBvcmlnX21ib3gKKworICAgIGRlZiB0ZXN0X3ZpZXdfdGV4dChzZWxmKToKKyAgICAgICAgIyBJZiBtb2RhbCBUcnVlLCB0a2ludGVyIHdpbGwgZXJyb3Igd2l0aCAnY2FuJ3QgaW52b2tlICJldmVudCIgY29tbWFuZCcKKyAgICAgICAgdmlldyA9IHR2LnZpZXdfdGV4dChzZWxmLnJvb3QsICdUaXRsZScsICd0ZXN0IHRleHQnLCBtb2RhbD1GYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHZpZXcsIHR2LlRleHRWaWV3ZXIpCisKKyAgICBkZWYgdGVzdF92aWV3X2ZpbGUoc2VsZik6CisgICAgICAgIHRlc3RfZGlyID0gb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQorICAgICAgICB0ZXN0ZmlsZSA9IG9zLnBhdGguam9pbih0ZXN0X2RpciwgJ3Rlc3RfdGV4dHZpZXcucHknKQorICAgICAgICB2aWV3ID0gdHYudmlld19maWxlKHNlbGYucm9vdCwgJ1RpdGxlJywgdGVzdGZpbGUsIG1vZGFsPUZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UodmlldywgdHYuVGV4dFZpZXdlcikKKyAgICAgICAgc2VsZi5hc3NlcnRJbignVGVzdCcsIHZpZXcudGV4dFZpZXcuZ2V0KCcxLjAnLCAnMS5lbmQnKSkKKyAgICAgICAgdmlldy5PaygpCisKKyAgICAgICAgIyBNb2NrIG1lc3NhZ2Vib3ggd2lsbCBiZSB1c2VkIGFuZCB2aWV3X2ZpbGUgd2lsbCBub3QgcmV0dXJuIGFueXRoaW5nCisgICAgICAgIHRlc3RmaWxlID0gb3MucGF0aC5qb2luKHRlc3RfZGlyLCAnLi4vbm90dGhlcmUucHknKQorICAgICAgICB2aWV3ID0gdHYudmlld19maWxlKHNlbGYucm9vdCwgJ1RpdGxlJywgdGVzdGZpbGUsIG1vZGFsPUZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZSh2aWV3KQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF93YXJuaW5nLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfd2FybmluZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTFkOGExCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfd2FybmluZy5weQpAQCAtMCwwICsxLDczIEBACisnJydUZXN0IHdhcm5pbmdzIHJlcGxhY2VtZW50IGluIFB5U2hlbGwucHkgYW5kIHJ1bi5weS4KKworVGhpcyBmaWxlIGNvdWxkIGJlIGV4cGFuZGVkIHRvIGluY2x1ZGUgdHJhY2ViYWNrIG92ZXJyaWRlcworKGluIHNhbWUgdHdvIG1vZHVsZXMpLiBJZiBzbywgY2hhbmdlIG5hbWUuCitSZXZpc2UgaWYgb3V0cHV0IGRlc3RpbmF0aW9uIGNoYW5nZXMgKGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxODMxOCkuCitNYWtlIHN1cmUgd2FybmluZ3MgbW9kdWxlIGlzIGxlZnQgdW5hbHRlcmVkIChodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTgwODEpLgorJycnCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgY2FwdHVyZWRfc3RkZXJyCisKK2ltcG9ydCB3YXJuaW5ncworIyBUcnkgdG8gY2FwdHVyZSBkZWZhdWx0IHNob3d3YXJuaW5nIGJlZm9yZSBJZGxlIG1vZHVsZXMgYXJlIGltcG9ydGVkLgorc2hvd3dhcm5pbmcgPSB3YXJuaW5ncy5zaG93d2FybmluZworIyBCdXQgaWYgd2UgcnVuIHRoaXMgZmlsZSB3aXRoaW4gaWRsZSwgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHJ1bi5tYWluIGxvb3AKKyMgYW5kIGRlZmF1bHQgc2hvd3dhcm5pbmdzIGhhcyBhbHJlYWR5IGJlZW4gcmVwbGFjZWQuCitydW5uaW5nX2luX2lkbGUgPSAnaWRsZScgaW4gc2hvd3dhcm5pbmcuX19uYW1lX18KKworZnJvbSBpZGxlbGliIGltcG9ydCBydW4KK2Zyb20gaWRsZWxpYiBpbXBvcnQgUHlTaGVsbCBhcyBzaGVsbAorCisjIFRoZSBmb2xsb3dpbmcgd2FzIGdlbmVyYXRlZCBmcm9tIFB5U2hlbGwuaWRsZV9mb3JtYXR3YXJuaW5nCisjIGFuZCBjaGVja2VkIGFzIG1hdGNoaW5nIGV4cGVjdGF0aW9uLgoraWRsZW1zZyA9ICcnJworV2FybmluZyAoZnJvbSB3YXJuaW5ncyBtb2R1bGUpOgorICBGaWxlICJ0ZXN0X3dhcm5pbmcucHkiLCBsaW5lIDk5CisgICAgTGluZSBvZiBjb2RlCitVc2VyV2FybmluZzogVGVzdAorJycnCitzaGVsbG1zZyA9IGlkbGVtc2cgKyAiPj4+ICIKKworY2xhc3MgUnVuV2FyblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQHVuaXR0ZXN0LnNraXBJZihydW5uaW5nX2luX2lkbGUsICJEb2VzIG5vdCB3b3JrIHdoZW4gcnVuIHdpdGhpbiBJZGxlLiIpCisgICAgZGVmIHRlc3Rfc2hvd3dhcm5pbmdzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydElzKHdhcm5pbmdzLnNob3d3YXJuaW5nLCBzaG93d2FybmluZykKKyAgICAgICAgcnVuLmNhcHR1cmVfd2FybmluZ3MoVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh3YXJuaW5ncy5zaG93d2FybmluZywgcnVuLmlkbGVfc2hvd3dhcm5pbmdfc3VicHJvYykKKyAgICAgICAgcnVuLmNhcHR1cmVfd2FybmluZ3MoRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMod2FybmluZ3Muc2hvd3dhcm5pbmcsIHNob3d3YXJuaW5nKQorCisgICAgZGVmIHRlc3RfcnVuX3Nob3coc2VsZik6CisgICAgICAgIHdpdGggY2FwdHVyZWRfc3RkZXJyKCkgYXMgZjoKKyAgICAgICAgICAgIHJ1bi5pZGxlX3Nob3d3YXJuaW5nX3N1YnByb2MoCisgICAgICAgICAgICAgICAgICAgICdUZXN0JywgVXNlcldhcm5pbmcsICd0ZXN0X3dhcm5pbmcucHknLCA5OSwgZiwgJ0xpbmUgb2YgY29kZScpCisgICAgICAgICAgICAjIFRoZSBmb2xsb3dpbmcgdXNlcyAuc3BsaXRsaW5lcyB0byBlcmFzZSBsaW5lLWVuZGluZyBkaWZmZXJlbmNlcworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpZGxlbXNnLnNwbGl0bGluZXMoKSwgZi5nZXR2YWx1ZSgpLnNwbGl0bGluZXMoKSkKKworY2xhc3MgU2hlbGxXYXJuVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBAdW5pdHRlc3Quc2tpcElmKHJ1bm5pbmdfaW5faWRsZSwgIkRvZXMgbm90IHdvcmsgd2hlbiBydW4gd2l0aGluIElkbGUuIikKKyAgICBkZWYgdGVzdF9zaG93d2FybmluZ3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SXMod2FybmluZ3Muc2hvd3dhcm5pbmcsIHNob3d3YXJuaW5nKQorICAgICAgICBzaGVsbC5jYXB0dXJlX3dhcm5pbmdzKFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMod2FybmluZ3Muc2hvd3dhcm5pbmcsIHNoZWxsLmlkbGVfc2hvd3dhcm5pbmcpCisgICAgICAgIHNoZWxsLmNhcHR1cmVfd2FybmluZ3MoRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMod2FybmluZ3Muc2hvd3dhcm5pbmcsIHNob3d3YXJuaW5nKQorCisgICAgZGVmIHRlc3RfaWRsZV9mb3JtYXR0ZXIoc2VsZik6CisgICAgICAgICMgV2lsbCBmYWlsIGlmIGZvcm1hdCBjaGFuZ2VkIHdpdGhvdXQgcmVnZW5lcmF0aW5nIGlkbGVtc2cKKyAgICAgICAgcyA9IHNoZWxsLmlkbGVfZm9ybWF0d2FybmluZygKKyAgICAgICAgICAgICAgICAnVGVzdCcsIFVzZXJXYXJuaW5nLCAndGVzdF93YXJuaW5nLnB5JywgOTksICdMaW5lIG9mIGNvZGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlkbGVtc2csIHMpCisKKyAgICBkZWYgdGVzdF9zaGVsbF9zaG93KHNlbGYpOgorICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZGVycigpIGFzIGY6CisgICAgICAgICAgICBzaGVsbC5pZGxlX3Nob3d3YXJuaW5nKAorICAgICAgICAgICAgICAgICAgICAnVGVzdCcsIFVzZXJXYXJuaW5nLCAndGVzdF93YXJuaW5nLnB5JywgOTksIGYsICdMaW5lIG9mIGNvZGUnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaGVsbG1zZy5zcGxpdGxpbmVzKCksIGYuZ2V0dmFsdWUoKS5zcGxpdGxpbmVzKCkpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfd2lkZ2V0cmVkaXIucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF93aWRnZXRyZWRpci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTIzMWZkCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfd2lkZ2V0cmVkaXIucHkKQEAgLTAsMCArMSwxMjIgQEAKKyIiIlVuaXR0ZXN0IGZvciBpZGxlbGliLldpZGdldFJlZGlyZWN0b3IKKworMTAwJSBjb3ZlcmFnZQorIiIiCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCByZXF1aXJlcworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lm1vY2tfaWRsZSBpbXBvcnQgRnVuYworZnJvbSBUa2ludGVyIGltcG9ydCBUaywgVGV4dCwgVGNsRXJyb3IKK2Zyb20gaWRsZWxpYi5XaWRnZXRSZWRpcmVjdG9yIGltcG9ydCBXaWRnZXRSZWRpcmVjdG9yCisKKworY2xhc3MgSW5pdENsb3NlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICByZXF1aXJlcygnZ3VpJykKKyAgICAgICAgY2xzLnRrID0gVGsoKQorICAgICAgICBjbHMudGV4dCA9IFRleHQoY2xzLnRrKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKKyAgICAgICAgY2xzLnRleHQuZGVzdHJveSgpCisgICAgICAgIGNscy50ay5kZXN0cm95KCkKKyAgICAgICAgZGVsIGNscy50ZXh0LCBjbHMudGsKKworICAgIGRlZiB0ZXN0X2luaXQoc2VsZik6CisgICAgICAgIHJlZGlyID0gV2lkZ2V0UmVkaXJlY3RvcihzZWxmLnRleHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVkaXIud2lkZ2V0LCBzZWxmLnRleHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVkaXIudGssIHNlbGYudGV4dC50aykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGNsRXJyb3IsIFdpZGdldFJlZGlyZWN0b3IsIHNlbGYudGV4dCkKKyAgICAgICAgcmVkaXIuY2xvc2UoKSAgIyByZXN0b3JlIHNlbGYudGssIHNlbGYudGV4dAorCisgICAgZGVmIHRlc3RfY2xvc2Uoc2VsZik6CisgICAgICAgIHJlZGlyID0gV2lkZ2V0UmVkaXJlY3RvcihzZWxmLnRleHQpCisgICAgICAgIHJlZGlyLnJlZ2lzdGVyKCdpbnNlcnQnLCBGdW5jKQorICAgICAgICByZWRpci5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVkaXIuX29wZXJhdGlvbnMsIHt9KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoc2VsZi50ZXh0LCAnd2lkZ2V0JykpCisKKworY2xhc3MgV2lkZ2V0UmVkaXJlY3RvclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgcmVxdWlyZXMoJ2d1aScpCisgICAgICAgIGNscy50ayA9IFRrKCkKKyAgICAgICAgY2xzLnRleHQgPSBUZXh0KGNscy50aykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgIGNscy50ZXh0LmRlc3Ryb3koKQorICAgICAgICBjbHMudGsuZGVzdHJveSgpCisgICAgICAgIGRlbCBjbHMudGV4dCwgY2xzLnRrCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYucmVkaXIgPSBXaWRnZXRSZWRpcmVjdG9yKHNlbGYudGV4dCkKKyAgICAgICAgc2VsZi5mdW5jID0gRnVuYygpCisgICAgICAgIHNlbGYub3JpZ19pbnNlcnQgPSBzZWxmLnJlZGlyLnJlZ2lzdGVyKCdpbnNlcnQnLCBzZWxmLmZ1bmMpCisgICAgICAgIHNlbGYudGV4dC5pbnNlcnQoJ2luc2VydCcsICdhc2RmJykgICMgbGVhdmVzIHNlbGYudGV4dCBlbXB0eQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLnRleHQuZGVsZXRlKCcxLjAnLCAnZW5kJykKKyAgICAgICAgc2VsZi5yZWRpci5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9yZXByKHNlbGYpOiAgIyBwYXJ0bHkgZm9yIDEwMCUgY292ZXJhZ2UKKyAgICAgICAgc2VsZi5hc3NlcnRJbignUmVkaXJlY3RvcicsIHJlcHIoc2VsZi5yZWRpcikpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ09yaWdpbmFsJywgcmVwcihzZWxmLm9yaWdfaW5zZXJ0KSkKKworICAgIGRlZiB0ZXN0X3JlZ2lzdGVyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGV4dC5nZXQoJzEuMCcsICdlbmQnKSwgJ1xuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZ1bmMuYXJncywgKCdpbnNlcnQnLCAnYXNkZicpKQorICAgICAgICBzZWxmLmFzc2VydEluKCdpbnNlcnQnLCBzZWxmLnJlZGlyLl9vcGVyYXRpb25zKQorICAgICAgICBzZWxmLmFzc2VydEluKCdpbnNlcnQnLCBzZWxmLnRleHQuX19kaWN0X18pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50ZXh0Lmluc2VydCwgc2VsZi5mdW5jKQorCisgICAgZGVmIHRlc3Rfb3JpZ2luYWxfY29tbWFuZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm9yaWdfaW5zZXJ0Lm9wZXJhdGlvbiwgJ2luc2VydCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5vcmlnX2luc2VydC50a19jYWxsLCBzZWxmLnRleHQudGsuY2FsbCkKKyAgICAgICAgc2VsZi5vcmlnX2luc2VydCgnaW5zZXJ0JywgJ2FzZGYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGV4dC5nZXQoJzEuMCcsICdlbmQnKSwgJ2FzZGZcbicpCisKKyAgICBkZWYgdGVzdF91bnJlZ2lzdGVyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzZWxmLnJlZGlyLnVucmVnaXN0ZXIoJ2ludmFsaWQgb3BlcmF0aW9uIG5hbWUnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJlZGlyLnVucmVnaXN0ZXIoJ2luc2VydCcpLCBzZWxmLmZ1bmMpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ2luc2VydCcsIHNlbGYucmVkaXIuX29wZXJhdGlvbnMpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ2luc2VydCcsIHNlbGYudGV4dC5fX2RpY3RfXykKKworICAgIGRlZiB0ZXN0X3VucmVnaXN0ZXJfbm9fYXR0cmlidXRlKHNlbGYpOgorICAgICAgICBkZWwgc2VsZi50ZXh0Lmluc2VydAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucmVkaXIudW5yZWdpc3RlcignaW5zZXJ0JyksIHNlbGYuZnVuYykKKworICAgIGRlZiB0ZXN0X2Rpc3BhdGNoX2ludGVyY2VwdChzZWxmKToKKyAgICAgICAgc2VsZi5mdW5jLl9faW5pdF9fKFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnJlZGlyLmRpc3BhdGNoKCdpbnNlcnQnLCBGYWxzZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5mdW5jLmFyZ3NbMF0pCisKKyAgICBkZWYgdGVzdF9kaXNwYXRjaF9ieXBhc3Moc2VsZik6CisgICAgICAgIHNlbGYub3JpZ19pbnNlcnQoJ2luc2VydCcsICdhc2RmJykKKyAgICAgICAgIyB0ay5jYWxsIHJldHVybnMgJycgd2hlcmUgUHl0aG9uIHdvdWxkIHJldHVybiBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yZWRpci5kaXNwYXRjaCgnZGVsZXRlJywgJzEuMCcsICdlbmQnKSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50ZXh0LmdldCgnMS4wJywgJ2VuZCcpLCAnXG4nKQorCisgICAgZGVmIHRlc3RfZGlzcGF0Y2hfZXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuZnVuYy5fX2luaXRfXyhUY2xFcnJvcigpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucmVkaXIuZGlzcGF0Y2goJ2luc2VydCcsIEZhbHNlKSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yZWRpci5kaXNwYXRjaCgnaW52YWxpZCcpLCAnJykKKworICAgIGRlZiB0ZXN0X2NvbW1hbmRfZGlzcGF0Y2goc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IC5fX2luaXRfXyBjYXVzZXMgcmVkaXJlY3Rpb24gb2YgdGsgY2FsbHMKKyAgICAgICAgIyB0aHJvdWdoIHJlZGlyLmRpc3BhdGNoCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLnRleHQuX3csICdpbnNlcnQnLCAnaGVsbG8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZnVuYy5hcmdzLCAoJ2hlbGxvJywpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGV4dC5nZXQoJzEuMCcsICdlbmQnKSwgJ1xuJykKKyAgICAgICAgIyBFbnN1cmUgdGhhdCBjYWxsZWQgdGhyb3VnaCByZWRpciAuZGlzcGF0Y2ggYW5kIG5vdCB0aHJvdWdoCisgICAgICAgICMgc2VsZi50ZXh0Lmluc2VydCBieSBoYXZpbmcgbW9jayByYWlzZSBUY2xFcnJvci4KKyAgICAgICAgc2VsZi5mdW5jLl9faW5pdF9fKFRjbEVycm9yKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50ay5jYWxsKHNlbGYudGV4dC5fdywgJ2luc2VydCcsICdib28nKSwgJycpCisKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxldmVyLnB5IGIvTGliL2lkbGVsaWIvaWRsZXZlci5weQppbmRleCAzZjhiY2ZmLi5jODI2ODgyIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxldmVyLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGV2ZXIucHkKQEAgLTEgKzEgQEAKLUlETEVfVkVSU0lPTiA9ICIyLjcuMiIKK0lETEVfVkVSU0lPTiA9ICIyLjcuOCIKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2tleWJpbmRpbmdEaWFsb2cucHkgYi9MaWIvaWRsZWxpYi9rZXliaW5kaW5nRGlhbG9nLnB5CmluZGV4IDUzMzlmODguLjRkMzJjYTkgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2tleWJpbmRpbmdEaWFsb2cucHkKKysrIGIvTGliL2lkbGVsaWIva2V5YmluZGluZ0RpYWxvZy5weQpAQCAtNCwxNCArNCwxNiBAQAogZnJvbSBUa2ludGVyIGltcG9ydCAqCiBpbXBvcnQgdGtNZXNzYWdlQm94CiBpbXBvcnQgc3RyaW5nCitpbXBvcnQgc3lzCiAKIGNsYXNzIEdldEtleXNEaWFsb2coVG9wbGV2ZWwpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLHBhcmVudCx0aXRsZSxhY3Rpb24sY3VycmVudEtleVNlcXVlbmNlcyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYscGFyZW50LHRpdGxlLGFjdGlvbixjdXJyZW50S2V5U2VxdWVuY2VzLF9odGVzdD1GYWxzZSk6CiAgICAgICAgICIiIgogICAgICAgICBhY3Rpb24gLSBzdHJpbmcsIHRoZSBuYW1lIG9mIHRoZSB2aXJ0dWFsIGV2ZW50IHRoZXNlIGtleXMgd2lsbCBiZQogICAgICAgICAgICAgICAgICBtYXBwZWQgdG8KICAgICAgICAgY3VycmVudEtleXMgLSBsaXN0LCBhIGxpc3Qgb2YgYWxsIGtleSBzZXF1ZW5jZSBsaXN0cyBjdXJyZW50bHkgbWFwcGVkCiAgICAgICAgICAgICAgICAgIHRvIHZpcnR1YWwgZXZlbnRzLCBmb3Igb3ZlcmxhcCBjaGVja2luZworICAgICAgICBfaHRlc3QgLSBib29sLCBjaGFuZ2UgYm94IGxvY2F0aW9uIHdoZW4gcnVubmluZyBodGVzdAogICAgICAgICAiIiIKICAgICAgICAgVG9wbGV2ZWwuX19pbml0X18oc2VsZiwgcGFyZW50KQogICAgICAgICBzZWxmLmNvbmZpZ3VyZShib3JkZXJ3aWR0aD01KQpAQCAtMzcsMTEgKzM5LDE0IEBACiAgICAgICAgIHNlbGYuTG9hZEZpbmFsS2V5TGlzdCgpCiAgICAgICAgIHNlbGYud2l0aGRyYXcoKSAjaGlkZSB3aGlsZSBzZXR0aW5nIGdlb21ldHJ5CiAgICAgICAgIHNlbGYudXBkYXRlX2lkbGV0YXNrcygpCi0gICAgICAgIHNlbGYuZ2VvbWV0cnkoIislZCslZCIgJQotICAgICAgICAgICAgKChwYXJlbnQud2luZm9fcm9vdHgoKSsoKHBhcmVudC53aW5mb193aWR0aCgpLzIpCi0gICAgICAgICAgICAgICAgLShzZWxmLndpbmZvX3JlcXdpZHRoKCkvMikpLAotICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHkoKSsoKHBhcmVudC53aW5mb19oZWlnaHQoKS8yKQotICAgICAgICAgICAgICAgIC0oc2VsZi53aW5mb19yZXFoZWlnaHQoKS8yKSkgKSkgKSAjY2VudHJlIGRpYWxvZyBvdmVyIHBhcmVudAorICAgICAgICBzZWxmLmdlb21ldHJ5KAorICAgICAgICAgICAgICAgICIrJWQrJWQiICUgKAorICAgICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHgoKSArCisgICAgICAgICAgICAgICAgICAgIChwYXJlbnQud2luZm9fd2lkdGgoKS8yIC0gc2VsZi53aW5mb19yZXF3aWR0aCgpLzIpLAorICAgICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHkoKSArCisgICAgICAgICAgICAgICAgICAgICgocGFyZW50LndpbmZvX2hlaWdodCgpLzIgLSBzZWxmLndpbmZvX3JlcWhlaWdodCgpLzIpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBfaHRlc3QgZWxzZSAxNTApCisgICAgICAgICAgICAgICAgKSApICAjY2VudHJlIGRpYWxvZyBvdmVyIHBhcmVudCAob3IgYmVsb3cgaHRlc3QgYm94KQogICAgICAgICBzZWxmLmRlaWNvbmlmeSgpICNnZW9tZXRyeSBzZXQsIHVuaGlkZQogICAgICAgICBzZWxmLndhaXRfd2luZG93KCkKIApAQCAtMTMyLDggKzEzNyw3IEBACiAgICAgICAgIG9yZGVyIGlzIGFsc28gaW1wb3J0YW50OiBrZXkgYmluZGluZyBlcXVhbGl0eSBkZXBlbmRzIG9uIGl0LCBzbwogICAgICAgICBjb25maWcta2V5cy5kZWYgbXVzdCB1c2UgdGhlIHNhbWUgb3JkZXJpbmcuCiAgICAgICAgICIiIgotICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IG1hY29zeFN1cHBvcnQKLSAgICAgICAgaWYgbWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKToKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgogICAgICAgICAgICAgc2VsZi5tb2RpZmllcnMgPSBbJ1NoaWZ0JywgJ0NvbnRyb2wnLCAnT3B0aW9uJywgJ0NvbW1hbmQnXQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5tb2RpZmllcnMgPSBbJ0NvbnRyb2wnLCAnQWx0JywgJ1NoaWZ0J10KQEAgLTI1OCwxMSArMjYyLDUgQEAKICAgICAgICAgcmV0dXJuIGtleXNPSwogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgICN0ZXN0IHRoZSBkaWFsb2cKLSAgICByb290PVRrKCkKLSAgICBkZWYgcnVuKCk6Ci0gICAgICAgIGtleVNlcT0nJwotICAgICAgICBkbGc9R2V0S2V5c0RpYWxvZyhyb290LCdHZXQgS2V5cycsJ2ZpbmQtYWdhaW4nLFtdKQotICAgICAgICBwcmludCBkbGcucmVzdWx0Ci0gICAgQnV0dG9uKHJvb3QsdGV4dD0nRGlhbG9nJyxjb21tYW5kPXJ1bikucGFjaygpCi0gICAgcm9vdC5tYWlubG9vcCgpCisgICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuCisgICAgcnVuKEdldEtleXNEaWFsb2cpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9tYWNvc3hTdXBwb3J0LnB5IGIvTGliL2lkbGVsaWIvbWFjb3N4U3VwcG9ydC5weQppbmRleCA0YmU2MGEzLi40ZjUyNTljIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9tYWNvc3hTdXBwb3J0LnB5CisrKyBiL0xpYi9pZGxlbGliL21hY29zeFN1cHBvcnQucHkKQEAgLTEsNTMgKzEsOTAgQEAKICIiIgotQSBudW1iZXIgb2YgZnVuY3Rpb24gdGhhdCBlbmhhbmNlIElETEUgb24gTWFjT1NYIHdoZW4gaXQgdXNlZCBhcyBhIG5vcm1hbAotR1VJIGFwcGxpY2F0aW9uIChhcyBvcHBvc2VkIHRvIGFuIFgxMSBhcHBsaWNhdGlvbikuCitBIG51bWJlciBvZiBmdW5jdGlvbnMgdGhhdCBlbmhhbmNlIElETEUgb24gTWFjIE9TWC4KICIiIgogaW1wb3J0IHN5cwogaW1wb3J0IFRraW50ZXIKIGZyb20gb3MgaW1wb3J0IHBhdGgKIAogCi1fYXBwYnVuZGxlID0gTm9uZQoraW1wb3J0IHdhcm5pbmdzCiAKIGRlZiBydW5uaW5nQXNPU1hBcHAoKToKLSAgICAiIiIKLSAgICBSZXR1cm5zIFRydWUgaWYgUHl0aG9uIGlzIHJ1bm5pbmcgZnJvbSB3aXRoaW4gYW4gYXBwIG9uIE9TWC4KLSAgICBJZiBzbywgYXNzdW1lIHRoYXQgUHl0aG9uIHdhcyBidWlsdCB3aXRoIEFxdWEgVGNsL1RrIHJhdGhlciB0aGFuCi0gICAgWDExIFRjbC9Uay4KLSAgICAiIiIKLSAgICBnbG9iYWwgX2FwcGJ1bmRsZQotICAgIGlmIF9hcHBidW5kbGUgaXMgTm9uZToKLSAgICAgICAgX2FwcGJ1bmRsZSA9IChzeXMucGxhdGZvcm0gPT0gJ2RhcndpbicgYW5kICcuYXBwJyBpbiBzeXMuZXhlY3V0YWJsZSkKLSAgICByZXR1cm4gX2FwcGJ1bmRsZQotCi1fY2FyYm9uYXF1YXRrID0gTm9uZQorICAgIHdhcm5pbmdzLndhcm4oInJ1bm5pbmdBc09TWEFwcCgpIGlzIGRlcHJlY2F0ZWQsIHVzZSBpc0FxdWFUaygpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgIHJldHVybiBpc0FxdWFUaygpCiAKIGRlZiBpc0NhcmJvbkFxdWFUayhyb290KToKKyAgICB3YXJuaW5ncy53YXJuKCJpc0NhcmJvbkFxdWFUayhyb290KSBpcyBkZXByZWNhdGVkLCB1c2UgaXNDYXJib25UaygpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgIHJldHVybiBpc0NhcmJvblRrKCkKKworX3RrX3R5cGUgPSBOb25lCisKK2RlZiBfaW5pdGlhbGl6ZVRrVmFyaWFudFRlc3RzKHJvb3QpOgorICAgICIiIgorICAgIEluaXRpYWxpemVzIE9TIFggVGsgdmFyaWFudCB2YWx1ZXMgZm9yCisgICAgaXNBcXVhVGsoKSwgaXNDYXJib25UaygpLCBpc0NvY29hVGsoKSwgYW5kIGlzWFF1YXJ0eigpLgorICAgICIiIgorICAgIGdsb2JhbCBfdGtfdHlwZQorICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgd3MgPSByb290LnRrLmNhbGwoJ3RrJywgJ3dpbmRvd2luZ3N5c3RlbScpCisgICAgICAgIGlmICd4MTEnIGluIHdzOgorICAgICAgICAgICAgX3RrX3R5cGUgPSAieHF1YXJ0eiIKKyAgICAgICAgZWxpZiAnYXF1YScgbm90IGluIHdzOgorICAgICAgICAgICAgX3RrX3R5cGUgPSAib3RoZXIiCisgICAgICAgIGVsaWYgJ0FwcEtpdCcgaW4gcm9vdC50ay5jYWxsKCd3aW5mbycsICdzZXJ2ZXInLCAnLicpOgorICAgICAgICAgICAgX3RrX3R5cGUgPSAiY29jb2EiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBfdGtfdHlwZSA9ICJjYXJib24iCisgICAgZWxzZToKKyAgICAgICAgX3RrX3R5cGUgPSAib3RoZXIiCisKK2RlZiBpc0FxdWFUaygpOgorICAgICIiIgorICAgIFJldHVybnMgVHJ1ZSBpZiBJRExFIGlzIHVzaW5nIGEgbmF0aXZlIE9TIFggVGsgKENvY29hIG9yIENhcmJvbikuCisgICAgIiIiCisgICAgYXNzZXJ0IF90a190eXBlIGlzIG5vdCBOb25lCisgICAgcmV0dXJuIF90a190eXBlID09ICJjb2NvYSIgb3IgX3RrX3R5cGUgPT0gImNhcmJvbiIKKworZGVmIGlzQ2FyYm9uVGsoKToKICAgICAiIiIKICAgICBSZXR1cm5zIFRydWUgaWYgSURMRSBpcyB1c2luZyBhIENhcmJvbiBBcXVhIFRrIChpbnN0ZWFkIG9mIHRoZQogICAgIG5ld2VyIENvY29hIEFxdWEgVGspLgogICAgICIiIgotICAgIGdsb2JhbCBfY2FyYm9uYXF1YXRrCi0gICAgaWYgX2NhcmJvbmFxdWF0ayBpcyBOb25lOgotICAgICAgICBfY2FyYm9uYXF1YXRrID0gKHJ1bm5pbmdBc09TWEFwcCgpIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICdhcXVhJyBpbiByb290LnRrLmNhbGwoJ3RrJywgJ3dpbmRvd2luZ3N5c3RlbScpIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICdBcHBLaXQnIG5vdCBpbiByb290LnRrLmNhbGwoJ3dpbmZvJywgJ3NlcnZlcicsICcuJykpCi0gICAgcmV0dXJuIF9jYXJib25hcXVhdGsKKyAgICBhc3NlcnQgX3RrX3R5cGUgaXMgbm90IE5vbmUKKyAgICByZXR1cm4gX3RrX3R5cGUgPT0gImNhcmJvbiIKKworZGVmIGlzQ29jb2FUaygpOgorICAgICIiIgorICAgIFJldHVybnMgVHJ1ZSBpZiBJRExFIGlzIHVzaW5nIGEgQ29jb2EgQXF1YSBUay4KKyAgICAiIiIKKyAgICBhc3NlcnQgX3RrX3R5cGUgaXMgbm90IE5vbmUKKyAgICByZXR1cm4gX3RrX3R5cGUgPT0gImNvY29hIgorCitkZWYgaXNYUXVhcnR6KCk6CisgICAgIiIiCisgICAgUmV0dXJucyBUcnVlIGlmIElETEUgaXMgdXNpbmcgYW4gT1MgWCBYMTEgVGsuCisgICAgIiIiCisgICAgYXNzZXJ0IF90a190eXBlIGlzIG5vdCBOb25lCisgICAgcmV0dXJuIF90a190eXBlID09ICJ4cXVhcnR6IgogCiBkZWYgdGtWZXJzaW9uV2FybmluZyhyb290KToKICAgICAiIiIKICAgICBSZXR1cm5zIGEgc3RyaW5nIHdhcm5pbmcgbWVzc2FnZSBpZiB0aGUgVGsgdmVyc2lvbiBpbiB1c2UgYXBwZWFycyB0bwotICAgIGJlIG9uZSBrbm93biB0byBjYXVzZSBwcm9ibGVtcyB3aXRoIElETEUuICBUaGUgQXBwbGUgQ29jb2EtYmFzZWQgVGsgOC41Ci0gICAgdGhhdCB3YXMgc2hpcHBlZCB3aXRoIE1hYyBPUyBYIDEwLjYuCisgICAgYmUgb25lIGtub3duIHRvIGNhdXNlIHByb2JsZW1zIHdpdGggSURMRS4KKyAgICAxLiBBcHBsZSBDb2NvYS1iYXNlZCBUayA4LjUuNyBzaGlwcGVkIHdpdGggTWFjIE9TIFggMTAuNiBpcyB1bnVzYWJsZS4KKyAgICAyLiBBcHBsZSBDb2NvYS1iYXNlZCBUayA4LjUuOSBpbiBPUyBYIDEwLjcgYW5kIDEwLjggaXMgYmV0dGVyIGJ1dAorICAgICAgICBjYW4gc3RpbGwgY3Jhc2ggdW5leHBlY3RlZGx5LgogICAgICIiIgogCi0gICAgaWYgKHJ1bm5pbmdBc09TWEFwcCgpIGFuZAotICAgICAgICAgICAgKCdBcHBLaXQnIGluIHJvb3QudGsuY2FsbCgnd2luZm8nLCAnc2VydmVyJywgJy4nKSkgYW5kCi0gICAgICAgICAgICAocm9vdC50ay5jYWxsKCdpbmZvJywgJ3BhdGNobGV2ZWwnKSA9PSAnOC41LjcnKSApOgotICAgICAgICByZXR1cm4gKHIiV0FSTklORzogVGhlIHZlcnNpb24gb2YgVGNsL1RrICg4LjUuNykgaW4gdXNlIG1heSIKKyAgICBpZiBpc0NvY29hVGsoKToKKyAgICAgICAgcGF0Y2hsZXZlbCA9IHJvb3QudGsuY2FsbCgnaW5mbycsICdwYXRjaGxldmVsJykKKyAgICAgICAgaWYgcGF0Y2hsZXZlbCBub3QgaW4gKCc4LjUuNycsICc4LjUuOScpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiAociJXQVJOSU5HOiBUaGUgdmVyc2lvbiBvZiBUY2wvVGsgKHswfSkgaW4gdXNlIG1heSIKICAgICAgICAgICAgICAgICByIiBiZSB1bnN0YWJsZS5cbiIKICAgICAgICAgICAgICAgICByIlZpc2l0IGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb3dubG9hZC9tYWMvdGNsdGsvIgotICAgICAgICAgICAgICAgIHIiIGZvciBjdXJyZW50IGluZm9ybWF0aW9uLiIpCisgICAgICAgICAgICAgICAgciIgZm9yIGN1cnJlbnQgaW5mb3JtYXRpb24uIi5mb3JtYXQocGF0Y2hsZXZlbCkpCiAgICAgZWxzZToKICAgICAgICAgcmV0dXJuIEZhbHNlCiAKQEAgLTc0LDggKzExMSw4IEBACiAKIGRlZiBvdmVycmlkZVJvb3RNZW51KHJvb3QsIGZsaXN0KToKICAgICAiIiIKLSAgICBSZXBsYWNlIHRoZSBUayByb290IG1lbnUgYnkgc29tZXRoaW5nIHRoYXQncyBtb3JlIGFwcHJvcHJpYXRlIGZvcgotICAgIElETEUuCisgICAgUmVwbGFjZSB0aGUgVGsgcm9vdCBtZW51IGJ5IHNvbWV0aGluZyB0aGF0IGlzIG1vcmUgYXBwcm9wcmlhdGUgZm9yCisgICAgSURMRSB3aXRoIGFuIEFxdWEgVGsuCiAgICAgIiIiCiAgICAgIyBUaGUgbWVudSB0aGF0IGlzIGF0dGFjaGVkIHRvIHRoZSBUayByb290ICgiLiIpIGlzIGFsc28gdXNlZCBieSBBcXVhVGsgZm9yCiAgICAgIyBhbGwgd2luZG93cyB0aGF0IGRvbid0IHNwZWNpZnkgYSBtZW51IG9mIHRoZWlyIG93bi4gVGhlIGRlZmF1bHQgbWVudWJhcgpAQCAtOTQsNiArMTMxLDIyIEBACiAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBXaW5kb3dMaXN0CiAgICAgZnJvbSBpZGxlbGliLk11bHRpQ2FsbCBpbXBvcnQgTXVsdGlDYWxsQ3JlYXRvcgogCisgICAgY2xvc2VJdGVtID0gQmluZGluZ3MubWVudWRlZnNbMF1bMV1bLTJdCisKKyAgICAjIFJlbW92ZSB0aGUgbGFzdCAzIGl0ZW1zIG9mIHRoZSBmaWxlIG1lbnU6IGEgc2VwYXJhdG9yLCBjbG9zZSB3aW5kb3cgYW5kCisgICAgIyBxdWl0LiBDbG9zZSB3aW5kb3cgd2lsbCBiZSByZWluc2VydGVkIGp1c3QgYWJvdmUgdGhlIHNhdmUgaXRlbSwgd2hlcmUKKyAgICAjIGl0IHNob3VsZCBiZSBhY2NvcmRpbmcgdG8gdGhlIEhJRy4gUXVpdCBpcyBpbiB0aGUgYXBwbGljYXRpb24gbWVudS4KKyAgICBkZWwgQmluZGluZ3MubWVudWRlZnNbMF1bMV1bLTM6XQorICAgIEJpbmRpbmdzLm1lbnVkZWZzWzBdWzFdLmluc2VydCg2LCBjbG9zZUl0ZW0pCisKKyAgICAjIFJlbW92ZSB0aGUgJ0Fib3V0JyBlbnRyeSBmcm9tIHRoZSBoZWxwIG1lbnUsIGl0IGlzIGluIHRoZSBhcHBsaWNhdGlvbgorICAgICMgbWVudQorICAgIGRlbCBCaW5kaW5ncy5tZW51ZGVmc1stMV1bMV1bMDoyXQorCisgICAgIyBSZW1vdmUgdGhlICdDb25maWd1cmUnIGVudHJ5IGZyb20gdGhlIG9wdGlvbnMgbWVudSwgaXQgaXMgaW4gdGhlCisgICAgIyBhcHBsaWNhdGlvbiBtZW51IGFzICdQcmVmZXJlbmNlcycKKyAgICBkZWwgQmluZGluZ3MubWVudWRlZnNbLTJdWzFdWzA6Ml0KKwogICAgIG1lbnViYXIgPSBNZW51KHJvb3QpCiAgICAgcm9vdC5jb25maWd1cmUobWVudT1tZW51YmFyKQogICAgIG1lbnVkaWN0ID0ge30KQEAgLTEzNiw3ICsxODksNyBAQAogICAgICAgICAjIHJpZ2h0IHRoaW5nIGZvciBub3cuCiAgICAgICAgIHJvb3QuY3JlYXRlY29tbWFuZCgnZXhpdCcsIGZsaXN0LmNsb3NlX2FsbF9jYWxsYmFjaykKIAotICAgIGlmIGlzQ2FyYm9uQXF1YVRrKHJvb3QpOgorICAgIGlmIGlzQ2FyYm9uVGsoKToKICAgICAgICAgIyBmb3IgQ2FyYm9uIEFxdWFUaywgcmVwbGFjZSB0aGUgZGVmYXVsdCBUayBhcHBsZSBtZW51CiAgICAgICAgIG1lbnVkaWN0WydhcHBsaWNhdGlvbiddID0gbWVudSA9IE1lbnUobWVudWJhciwgbmFtZT0nYXBwbGUnKQogICAgICAgICBtZW51YmFyLmFkZF9jYXNjYWRlKGxhYmVsPSdJRExFJywgbWVudT1tZW51KQpAQCAtMTUxLDggKzIwNCw3IEBACiAgICAgICAgICAgICBCaW5kaW5ncy5tZW51ZGVmc1swXVsxXS5hcHBlbmQoCiAgICAgICAgICAgICAgICAgICAgICgnX1ByZWZlcmVuY2VzLi4uLicsICc8PG9wZW4tY29uZmlnLWRpYWxvZz4+JyksCiAgICAgICAgICAgICAgICAgKQotICAgIGVsc2U6Ci0gICAgICAgICMgYXNzdW1lIENvY29hIEFxdWFUaworICAgIGlmIGlzQ29jb2FUaygpOgogICAgICAgICAjIHJlcGxhY2UgZGVmYXVsdCBBYm91dCBkaWFsb2cgd2l0aCBBYm91dCBJRExFIG9uZQogICAgICAgICByb290LmNyZWF0ZWNvbW1hbmQoJ3RrQWJvdXREaWFsb2cnLCBhYm91dF9kaWFsb2cpCiAgICAgICAgICMgcmVwbGFjZSBkZWZhdWx0ICJIZWxwIiBpdGVtIGluIEhlbHAgbWVudQpAQCAtMTYyLDEwICsyMTQsMjIgQEAKIAogZGVmIHNldHVwQXBwKHJvb3QsIGZsaXN0KToKICAgICAiIiIKLSAgICBQZXJmb3JtIHNldHVwIGZvciB0aGUgT1NYIGFwcGxpY2F0aW9uIGJ1bmRsZS4KLSAgICAiIiIKLSAgICBpZiBub3QgcnVubmluZ0FzT1NYQXBwKCk6IHJldHVybgorICAgIFBlcmZvcm0gaW5pdGlhbCBPUyBYIGN1c3RvbWl6YXRpb25zIGlmIG5lZWRlZC4KKyAgICBDYWxsZWQgZnJvbSBQeVNoZWxsLm1haW4oKSBhZnRlciBpbml0aWFsIGNhbGxzIHRvIFRrKCkKIAotICAgIGhpZGVUa0NvbnNvbGUocm9vdCkKLSAgICBvdmVycmlkZVJvb3RNZW51KHJvb3QsIGZsaXN0KQotICAgIGFkZE9wZW5FdmVudFN1cHBvcnQocm9vdCwgZmxpc3QpCisgICAgVGhlcmUgYXJlIGN1cnJlbnRseSB0aHJlZSBtYWpvciB2ZXJzaW9ucyBvZiBUayBpbiB1c2Ugb24gT1MgWDoKKyAgICAgICAgMS4gQXF1YSBDb2NvYSBUayAobmF0aXZlIGRlZmF1bHQgc2luY2UgT1MgWCAxMC42KQorICAgICAgICAyLiBBcXVhIENhcmJvbiBUayAob3JpZ2luYWwgbmF0aXZlLCAzMi1iaXQgb25seSwgZGVwcmVjYXRlZCkKKyAgICAgICAgMy4gWDExIChzdXBwb3J0ZWQgYnkgc29tZSB0aGlyZC1wYXJ0eSBkaXN0cmlidXRvcnMsIGRlcHJlY2F0ZWQpCisgICAgVGhlcmUgYXJlIHZhcmlvdXMgZGlmZmVyZW5jZXMgYW1vbmcgdGhlIHRocmVlIHRoYXQgYWZmZWN0IElETEUKKyAgICBiZWhhdmlvciwgcHJpbWFyaWx5IHdpdGggbWVudXMsIG1vdXNlIGtleSBldmVudHMsIGFuZCBhY2NlbGVyYXRvcnMuCisgICAgU29tZSBvbmUtdGltZSBjdXN0b21pemF0aW9ucyBhcmUgcGVyZm9ybWVkIGhlcmUuCisgICAgT3RoZXJzIGFyZSBkeW5hbWljYWxseSB0ZXN0ZWQgdGhyb3VnaG91dCBpZGxlbGliIGJ5IGNhbGxzIHRvIHRoZQorICAgIGlzQXF1YVRrKCksIGlzQ2FyYm9uVGsoKSwgaXNDb2NvYVRrKCksIGlzWFF1YXJ0eigpIGZ1bmN0aW9ucyB3aGljaAorICAgIGFyZSBpbml0aWFsaXplZCBoZXJlIGFzIHdlbGwuCisgICAgIiIiCisgICAgX2luaXRpYWxpemVUa1ZhcmlhbnRUZXN0cyhyb290KQorICAgIGlmIGlzQXF1YVRrKCk6CisgICAgICAgIGhpZGVUa0NvbnNvbGUocm9vdCkKKyAgICAgICAgb3ZlcnJpZGVSb290TWVudShyb290LCBmbGlzdCkKKyAgICAgICAgYWRkT3BlbkV2ZW50U3VwcG9ydChyb290LCBmbGlzdCkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL3JwYy5weSBiL0xpYi9pZGxlbGliL3JwYy5weQppbmRleCAxMzk1MDU4Li44ZjYxMWEzIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9ycGMucHkKKysrIGIvTGliL2lkbGVsaWIvcnBjLnB5CkBAIC0yLDcgKzIsNyBAQAogCiBGb3Igc2VjdXJpdHkgcmVhc29ucywgR3ZSIHJlcXVlc3RlZCB0aGF0IElkbGUncyBQeXRob24gZXhlY3V0aW9uIHNlcnZlciBwcm9jZXNzCiBjb25uZWN0IHRvIHRoZSBJZGxlIHByb2Nlc3MsIHdoaWNoIGxpc3RlbnMgZm9yIHRoZSBjb25uZWN0aW9uLiAgU2luY2UgSWRsZSBoYXMKLWhhcyBvbmx5IG9uZSBjbGllbnQgcGVyIHNlcnZlciwgdGhpcyB3YXMgbm90IGEgbGltaXRhdGlvbi4KK29ubHkgb25lIGNsaWVudCBwZXIgc2VydmVyLCB0aGlzIHdhcyBub3QgYSBsaW1pdGF0aW9uLgogCiAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyArLS0tLS0tLS0tLS0tLSsKICAgIHwgU29ja2V0U2VydmVyLkJhc2VSZXF1ZXN0SGFuZGxlciB8IHwgU29ja2V0SU8gICAgfApAQCAtMTQ0LDcgKzE0NCw3IEBACiAKICAgICBkZWYgZXhpdGhvb2soc2VsZik6CiAgICAgICAgICJvdmVycmlkZSBmb3Igc3BlY2lmaWMgZXhpdCBhY3Rpb24iCi0gICAgICAgIG9zLl9leGl0KCkKKyAgICAgICAgb3MuX2V4aXQoMCkKIAogICAgIGRlZiBkZWJ1ZyhzZWxmLCAqYXJncyk6CiAgICAgICAgIGlmIG5vdCBzZWxmLmRlYnVnZ2luZzoKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL3J1bi5weSBiL0xpYi9pZGxlbGliL3J1bi5weQppbmRleCA2NDJiOTc5Li42MDRjNWNkIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9ydW4ucHkKKysrIGIvTGliL2lkbGVsaWIvcnVuLnB5CkBAIC0xLDQgKzEsNSBAQAogaW1wb3J0IHN5cworaW1wb3J0IGlvCiBpbXBvcnQgbGluZWNhY2hlCiBpbXBvcnQgdGltZQogaW1wb3J0IHNvY2tldApAQCAtMTQsMjkgKzE1LDQ1IEBACiBmcm9tIGlkbGVsaWIgaW1wb3J0IFJlbW90ZU9iamVjdEJyb3dzZXIKIGZyb20gaWRsZWxpYiBpbXBvcnQgU3RhY2tWaWV3ZXIKIGZyb20gaWRsZWxpYiBpbXBvcnQgcnBjCitmcm9tIGlkbGVsaWIgaW1wb3J0IFB5U2hlbGwKK2Zyb20gaWRsZWxpYiBpbXBvcnQgSU9CaW5kaW5nCiAKIGltcG9ydCBfX21haW5fXwogCiBMT0NBTEhPU1QgPSAnMTI3LjAuMC4xJwogCi10cnk6Ci0gICAgaW1wb3J0IHdhcm5pbmdzCi1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgcGFzcwotZWxzZToKLSAgICBkZWYgaWRsZV9mb3JtYXR3YXJuaW5nX3N1YnByb2MobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU9Tm9uZSk6Ci0gICAgICAgICIiIkZvcm1hdCB3YXJuaW5ncyB0aGUgSURMRSB3YXkiIiIKLSAgICAgICAgcyA9ICJcbldhcm5pbmcgKGZyb20gd2FybmluZ3MgbW9kdWxlKTpcbiIKLSAgICAgICAgcyArPSAnICBGaWxlIFwiJXNcIiwgbGluZSAlc1xuJyAlIChmaWxlbmFtZSwgbGluZW5vKQotICAgICAgICBpZiBsaW5lIGlzIE5vbmU6Ci0gICAgICAgICAgICBsaW5lID0gbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIGxpbmVubykKLSAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQotICAgICAgICBpZiBsaW5lOgotICAgICAgICAgICAgcyArPSAiICAgICVzXG4iICUgbGluZQotICAgICAgICBzICs9ICIlczogJXNcbiIgJSAoY2F0ZWdvcnkuX19uYW1lX18sIG1lc3NhZ2UpCi0gICAgICAgIHJldHVybiBzCi0gICAgd2FybmluZ3MuZm9ybWF0d2FybmluZyA9IGlkbGVfZm9ybWF0d2FybmluZ19zdWJwcm9jCitpbXBvcnQgd2FybmluZ3MKKworZGVmIGlkbGVfc2hvd3dhcm5pbmdfc3VicHJvYygKKyAgICAgICAgbWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGZpbGU9Tm9uZSwgbGluZT1Ob25lKToKKyAgICAiIiJTaG93IElkbGUtZm9ybWF0IHdhcm5pbmcgYWZ0ZXIgcmVwbGFjaW5nIHdhcm5pbmdzLnNob3d3YXJuaW5nLgorCisgICAgVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGUgZm9ybWF0dGVyIGNhbGxlZC4KKyAgICAiIiIKKyAgICBpZiBmaWxlIGlzIE5vbmU6CisgICAgICAgIGZpbGUgPSBzeXMuc3RkZXJyCisgICAgdHJ5OgorICAgICAgICBmaWxlLndyaXRlKFB5U2hlbGwuaWRsZV9mb3JtYXR3YXJuaW5nKAorICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBsaW5lKSkKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgcGFzcyAjIHRoZSBmaWxlIChwcm9iYWJseSBzdGRlcnIpIGlzIGludmFsaWQgLSB0aGlzIHdhcm5pbmcgZ2V0cyBsb3N0LgorCitfd2FybmluZ3Nfc2hvd3dhcm5pbmcgPSBOb25lCisKK2RlZiBjYXB0dXJlX3dhcm5pbmdzKGNhcHR1cmUpOgorICAgICJSZXBsYWNlIHdhcm5pbmcuc2hvd3dhcm5pbmcgd2l0aCBpZGxlX3Nob3d3YXJuaW5nX3N1YnByb2MsIG9yIHJldmVyc2UuIgorCisgICAgZ2xvYmFsIF93YXJuaW5nc19zaG93d2FybmluZworICAgIGlmIGNhcHR1cmU6CisgICAgICAgIGlmIF93YXJuaW5nc19zaG93d2FybmluZyBpcyBOb25lOgorICAgICAgICAgICAgX3dhcm5pbmdzX3Nob3d3YXJuaW5nID0gd2FybmluZ3Muc2hvd3dhcm5pbmcKKyAgICAgICAgICAgIHdhcm5pbmdzLnNob3d3YXJuaW5nID0gaWRsZV9zaG93d2FybmluZ19zdWJwcm9jCisgICAgZWxzZToKKyAgICAgICAgaWYgX3dhcm5pbmdzX3Nob3d3YXJuaW5nIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgd2FybmluZ3Muc2hvd3dhcm5pbmcgPSBfd2FybmluZ3Nfc2hvd3dhcm5pbmcKKyAgICAgICAgICAgIF93YXJuaW5nc19zaG93d2FybmluZyA9IE5vbmUKKworY2FwdHVyZV93YXJuaW5ncyhUcnVlKQogCiAjIFRocmVhZCBzaGFyZWQgZ2xvYmFsczogRXN0YWJsaXNoIGEgcXVldWUgYmV0d2VlbiBhIHN1YnRocmVhZCAod2hpY2ggaGFuZGxlcwogIyB0aGUgc29ja2V0KSBhbmQgdGhlIG1haW4gdGhyZWFkICh3aGljaCBydW5zIHVzZXIgY29kZSksIHBsdXMgZ2xvYmFsCkBAIC03NSw2ICs5Miw4IEBACiAgICAgZXhjZXB0OgogICAgICAgICBwcmludD4+c3lzLnN0ZGVyciwgIklETEUgU3VicHJvY2Vzczogbm8gSVAgcG9ydCBwYXNzZWQgaW4gc3lzLmFyZ3YuIgogICAgICAgICByZXR1cm4KKworICAgIGNhcHR1cmVfd2FybmluZ3MoVHJ1ZSkKICAgICBzeXMuYXJndls6XSA9IFsiIl0KICAgICBzb2NrdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9bWFuYWdlX3NvY2tldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSdTb2NrVGhyZWFkJywKQEAgLTEwMSw2ICsxMjAsNyBAQAogICAgICAgICAgICAgICAgIGV4aXRfbm93ID0gVHJ1ZQogICAgICAgICAgICAgY29udGludWUKICAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQ6CisgICAgICAgICAgICBjYXB0dXJlX3dhcm5pbmdzKEZhbHNlKQogICAgICAgICAgICAgcmFpc2UKICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgdHlwZSwgdmFsdWUsIHRiID0gc3lzLmV4Y19pbmZvKCkKQEAgLTEyMCw3ICsxNDAsNyBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzZXJ2ZXIgPSBNeVJQQ1NlcnZlcihhZGRyZXNzLCBNeUhhbmRsZXIpCiAgICAgICAgICAgICBicmVhawotICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlcnI6CisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgZXJyOgogICAgICAgICAgICAgcHJpbnQ+PnN5cy5fX3N0ZGVycl9fLCJJRExFIFN1YnByb2Nlc3M6IHNvY2tldCBlcnJvcjogIlwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGVyci5hcmdzWzFdICsgIiwgcmV0cnlpbmcuLi4uIgogICAgIGVsc2U6CkBAIC0yMTYsNiArMjM2LDcgQEAKICAgICAgICAgICAgIGRlbCBzeXMuZXhpdGZ1bmMKICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgcGFzcworICAgIGNhcHR1cmVfd2FybmluZ3MoRmFsc2UpCiAgICAgc3lzLmV4aXQoMCkKIAogY2xhc3MgTXlSUENTZXJ2ZXIocnBjLlJQQ1NlcnZlcik6CkBAIC0yNDgsMTkgKzI2OSwyNCBAQAogICAgICAgICAgICAgcXVpdHRpbmcgPSBUcnVlCiAgICAgICAgICAgICB0aHJlYWQuaW50ZXJydXB0X21haW4oKQogCi0KIGNsYXNzIE15SGFuZGxlcihycGMuUlBDSGFuZGxlcik6CiAKICAgICBkZWYgaGFuZGxlKHNlbGYpOgogICAgICAgICAiIiJPdmVycmlkZSBiYXNlIG1ldGhvZCIiIgogICAgICAgICBleGVjdXRpdmUgPSBFeGVjdXRpdmUoc2VsZikKICAgICAgICAgc2VsZi5yZWdpc3RlcigiZXhlYyIsIGV4ZWN1dGl2ZSkKLSAgICAgICAgc3lzLnN0ZGluID0gc2VsZi5jb25zb2xlID0gc2VsZi5nZXRfcmVtb3RlX3Byb3h5KCJzdGRpbiIpCi0gICAgICAgIHN5cy5zdGRvdXQgPSBzZWxmLmdldF9yZW1vdGVfcHJveHkoInN0ZG91dCIpCi0gICAgICAgIHN5cy5zdGRlcnIgPSBzZWxmLmdldF9yZW1vdGVfcHJveHkoInN0ZGVyciIpCi0gICAgICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgSU9CaW5kaW5nCi0gICAgICAgIHN5cy5zdGRpbi5lbmNvZGluZyA9IHN5cy5zdGRvdXQuZW5jb2RpbmcgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIuZW5jb2RpbmcgPSBJT0JpbmRpbmcuZW5jb2RpbmcKKyAgICAgICAgc2VsZi5jb25zb2xlID0gc2VsZi5nZXRfcmVtb3RlX3Byb3h5KCJjb25zb2xlIikKKyAgICAgICAgc3lzLnN0ZGluID0gUHlTaGVsbC5Qc2V1ZG9JbnB1dEZpbGUoc2VsZi5jb25zb2xlLCAic3RkaW4iLAorICAgICAgICAgICAgICAgIElPQmluZGluZy5lbmNvZGluZykKKyAgICAgICAgc3lzLnN0ZG91dCA9IFB5U2hlbGwuUHNldWRvT3V0cHV0RmlsZShzZWxmLmNvbnNvbGUsICJzdGRvdXQiLAorICAgICAgICAgICAgICAgIElPQmluZGluZy5lbmNvZGluZykKKyAgICAgICAgc3lzLnN0ZGVyciA9IFB5U2hlbGwuUHNldWRvT3V0cHV0RmlsZShzZWxmLmNvbnNvbGUsICJzdGRlcnIiLAorICAgICAgICAgICAgICAgIElPQmluZGluZy5lbmNvZGluZykKKworICAgICAgICAjIEtlZXAgYSByZWZlcmVuY2UgdG8gc3RkaW4gc28gdGhhdCBpdCB3b24ndCB0cnkgdG8gZXhpdCBJRExFIGlmCisgICAgICAgICMgc3lzLnN0ZGluIGdldHMgY2hhbmdlZCBmcm9tIHdpdGhpbiBJRExFJ3Mgc2hlbGwuIFNlZSBpc3N1ZTE3ODM4LgorICAgICAgICBzZWxmLl9rZWVwX3N0ZGluID0gc3lzLnN0ZGluCisKICAgICAgICAgc2VsZi5pbnRlcnAgPSBzZWxmLmdldF9yZW1vdGVfcHJveHkoImludGVycCIpCiAgICAgICAgIHJwYy5SUENIYW5kbGVyLmdldHJlc3BvbnNlKHNlbGYsIG15c2VxPU5vbmUsIHdhaXQ9MC4wNSkKIApAQCAtMjk4LDExICszMjQsMTQgQEAKICAgICAgICAgICAgICAgICBleGVjIGNvZGUgaW4gc2VsZi5sb2NhbHMKICAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICAgaW50ZXJydXB0YWJsZSA9IEZhbHNlCisgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0OgorICAgICAgICAgICAgIyBTY3JpcHRzIHRoYXQgcmFpc2UgU3lzdGVtRXhpdCBzaG91bGQganVzdAorICAgICAgICAgICAgIyByZXR1cm4gdG8gdGhlIGludGVyYWN0aXZlIHByb21wdAorICAgICAgICAgICAgcGFzcwogICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICBzZWxmLnVzcl9leGNfaW5mbyA9IHN5cy5leGNfaW5mbygpCiAgICAgICAgICAgICBpZiBxdWl0dGluZzoKICAgICAgICAgICAgICAgICBleGl0KCkKLSAgICAgICAgICAgICMgZXZlbiBwcmludCBhIHVzZXIgY29kZSBTeXN0ZW1FeGl0IGV4Y2VwdGlvbiwgY29udGludWUKICAgICAgICAgICAgIHByaW50X2V4Y2VwdGlvbigpCiAgICAgICAgICAgICBqaXQgPSBzZWxmLnJwY2hhbmRsZXIuY29uc29sZS5nZXR2YXIoIjw8dG9nZ2xlLWppdC1zdGFjay12aWV3ZXI+PiIpCiAgICAgICAgICAgICBpZiBqaXQ6CkBAIC0zNDEsMyArMzcwLDUgQEAKICAgICAgICAgc3lzLmxhc3RfdmFsdWUgPSB2YWwKICAgICAgICAgaXRlbSA9IFN0YWNrVmlld2VyLlN0YWNrVHJlZUl0ZW0oZmxpc3QsIHRiKQogICAgICAgICByZXR1cm4gUmVtb3RlT2JqZWN0QnJvd3Nlci5yZW1vdGVfb2JqZWN0X3RyZWVfaXRlbShpdGVtKQorCitjYXB0dXJlX3dhcm5pbmdzKEZhbHNlKSAgIyBNYWtlIHN1cmUgdHVybmVkIG9mZjsgc2VlIGlzc3VlIDE4MDgxCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi90YWJiZWRwYWdlcy5weSBiL0xpYi9pZGxlbGliL3RhYmJlZHBhZ2VzLnB5CmluZGV4IDhkNzExM2QuLjA3MjNkOTQgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL3RhYmJlZHBhZ2VzLnB5CisrKyBiL0xpYi9pZGxlbGliL3RhYmJlZHBhZ2VzLnB5CkBAIC00NjcsOSArNDY3LDEyIEBACiAKICAgICAgICAgc2VsZi5fdGFiX3NldC5zZXRfc2VsZWN0ZWRfdGFiKHBhZ2VfbmFtZSkKIAotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKK2RlZiBfdGFiYmVkX3BhZ2VzKHBhcmVudCk6CiAgICAgIyB0ZXN0IGRpYWxvZwogICAgIHJvb3Q9VGsoKQorICAgIHdpZHRoLCBoZWlnaHQsIHgsIHkgPSBsaXN0KG1hcChpbnQsIHJlLnNwbGl0KCdbeCtdJywgcGFyZW50Lmdlb21ldHJ5KCkpKSkKKyAgICByb290Lmdlb21ldHJ5KCIrJWQrJWQiJSh4LCB5ICsgMTc1KSkKKyAgICByb290LnRpdGxlKCJUZXN0IHRhYmJlZCBwYWdlcyIpCiAgICAgdGFiUGFnZT1UYWJiZWRQYWdlU2V0KHJvb3QsIHBhZ2VfbmFtZXM9WydGb29iYXInLCdCYXonXSwgbl9yb3dzPTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZF90YWJzPUZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICApCkBAIC00ODgsMyArNDkxLDggQEAKICAgICBsYWJlbFBnTmFtZS5wYWNrKHBhZHg9NSkKICAgICBlbnRyeVBnTmFtZS5wYWNrKHBhZHg9NSkKICAgICByb290Lm1haW5sb29wKCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgorICAgIHJ1bihfdGFiYmVkX3BhZ2VzKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvdGV4dFZpZXcucHkgYi9MaWIvaWRsZWxpYi90ZXh0Vmlldy5weQppbmRleCAwZTdlNjYzLi5lYjYwMjc0IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi90ZXh0Vmlldy5weQorKysgYi9MaWIvaWRsZWxpYi90ZXh0Vmlldy5weQpAQCAtOSwyMyArOSwyNyBAQAogICAgICIiIkEgc2ltcGxlIHRleHQgdmlld2VyIGRpYWxvZyBmb3IgSURMRQogCiAgICAgIiIiCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCwgdGl0bGUsIHRleHQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQsIHRpdGxlLCB0ZXh0LCBtb2RhbD1UcnVlLCBfaHRlc3Q9RmFsc2UpOgogICAgICAgICAiIiJTaG93IHRoZSBnaXZlbiB0ZXh0IGluIGEgc2Nyb2xsYWJsZSB3aW5kb3cgd2l0aCBhICdjbG9zZScgYnV0dG9uCiAKKyAgICAgICAgSWYgbW9kYWwgb3B0aW9uIHNldCB0byBGYWxzZSwgdXNlciBjYW4gaW50ZXJhY3Qgd2l0aCBvdGhlciB3aW5kb3dzLAorICAgICAgICBvdGhlcndpc2UgdGhleSB3aWxsIGJlIHVuYWJsZSB0byBpbnRlcmFjdCB3aXRoIG90aGVyIHdpbmRvd3MgdW50aWwKKyAgICAgICAgdGhlIHRleHR2aWV3IHdpbmRvdyBpcyBjbG9zZWQuCisKKyAgICAgICAgX2h0ZXN0IC0gYm9vbDsgY2hhbmdlIGJveCBsb2NhdGlvbiB3aGVuIHJ1bm5pbmcgaHRlc3QuCiAgICAgICAgICIiIgogICAgICAgICBUb3BsZXZlbC5fX2luaXRfXyhzZWxmLCBwYXJlbnQpCiAgICAgICAgIHNlbGYuY29uZmlndXJlKGJvcmRlcndpZHRoPTUpCisgICAgICAgICMgcGxhY2UgZGlhbG9nIGJlbG93IHBhcmVudCBpZiBydW5uaW5nIGh0ZXN0CiAgICAgICAgIHNlbGYuZ2VvbWV0cnkoIj0lZHglZCslZCslZCIgJSAoNjI1LCA1MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LndpbmZvX3Jvb3R4KCkgKyAxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHkoKSArIDEwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC53aW5mb19yb290eCgpICsgMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHkoKSArICgxMCBpZiBub3QgX2h0ZXN0IGVsc2UgMTAwKSkpCiAgICAgICAgICNlbGd1YXZhcyAtIGNvbmZpZyBwbGFjZWhvbGRlcnMgdGlsIGNvbmZpZyBzdHVmZiBjb21wbGV0ZWQKICAgICAgICAgc2VsZi5iZyA9ICcjZmZmZmZmJwogICAgICAgICBzZWxmLmZnID0gJyMwMDAwMDAnCiAKICAgICAgICAgc2VsZi5DcmVhdGVXaWRnZXRzKCkKICAgICAgICAgc2VsZi50aXRsZSh0aXRsZSkKLSAgICAgICAgc2VsZi50cmFuc2llbnQocGFyZW50KQotICAgICAgICBzZWxmLmdyYWJfc2V0KCkKICAgICAgICAgc2VsZi5wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsIHNlbGYuT2spCiAgICAgICAgIHNlbGYucGFyZW50ID0gcGFyZW50CiAgICAgICAgIHNlbGYudGV4dFZpZXcuZm9jdXNfc2V0KCkKQEAgLTM0LDcgKzM4LDExIEBACiAgICAgICAgIHNlbGYuYmluZCgnPEVzY2FwZT4nLHNlbGYuT2spICNkaXNtaXNzIGRpYWxvZwogICAgICAgICBzZWxmLnRleHRWaWV3Lmluc2VydCgwLjAsIHRleHQpCiAgICAgICAgIHNlbGYudGV4dFZpZXcuY29uZmlnKHN0YXRlPURJU0FCTEVEKQotICAgICAgICBzZWxmLndhaXRfd2luZG93KCkKKworICAgICAgICBpZiBtb2RhbDoKKyAgICAgICAgICAgIHNlbGYudHJhbnNpZW50KHBhcmVudCkKKyAgICAgICAgICAgIHNlbGYuZ3JhYl9zZXQoKQorICAgICAgICAgICAgc2VsZi53YWl0X3dpbmRvdygpCiAKICAgICBkZWYgQ3JlYXRlV2lkZ2V0cyhzZWxmKToKICAgICAgICAgZnJhbWVUZXh0ID0gRnJhbWUoc2VsZiwgcmVsaWVmPVNVTktFTiwgaGVpZ2h0PTcwMCkKQEAgLTU3LDEwICs2NSwxMCBAQAogICAgICAgICBzZWxmLmRlc3Ryb3koKQogCiAKLWRlZiB2aWV3X3RleHQocGFyZW50LCB0aXRsZSwgdGV4dCk6Ci0gICAgVGV4dFZpZXdlcihwYXJlbnQsIHRpdGxlLCB0ZXh0KQorZGVmIHZpZXdfdGV4dChwYXJlbnQsIHRpdGxlLCB0ZXh0LCBtb2RhbD1UcnVlKToKKyAgICByZXR1cm4gVGV4dFZpZXdlcihwYXJlbnQsIHRpdGxlLCB0ZXh0LCBtb2RhbCkKIAotZGVmIHZpZXdfZmlsZShwYXJlbnQsIHRpdGxlLCBmaWxlbmFtZSwgZW5jb2Rpbmc9Tm9uZSk6CitkZWYgdmlld19maWxlKHBhcmVudCwgdGl0bGUsIGZpbGVuYW1lLCBlbmNvZGluZz1Ob25lLCBtb2RhbD1UcnVlKToKICAgICB0cnk6CiAgICAgICAgIGlmIGVuY29kaW5nOgogICAgICAgICAgICAgaW1wb3J0IGNvZGVjcwpAQCAtNjgsMjYgKzc2LDE1IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICB0ZXh0RmlsZSA9IG9wZW4oZmlsZW5hbWUsICdyJykKICAgICBleGNlcHQgSU9FcnJvcjoKLSAgICAgICAgaW1wb3J0IHRrTWVzc2FnZUJveAogICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKHRpdGxlPSdGaWxlIExvYWQgRXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J1VuYWJsZSB0byBsb2FkIGZpbGUgJXIgLicgJSBmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ9cGFyZW50KQogICAgIGVsc2U6Ci0gICAgICAgIHJldHVybiB2aWV3X3RleHQocGFyZW50LCB0aXRsZSwgdGV4dEZpbGUucmVhZCgpKQorICAgICAgICByZXR1cm4gdmlld190ZXh0KHBhcmVudCwgdGl0bGUsIHRleHRGaWxlLnJlYWQoKSwgbW9kYWwpCiAKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICAjdGVzdCB0aGUgZGlhbG9nCi0gICAgcm9vdD1UaygpCi0gICAgcm9vdC50aXRsZSgndGV4dFZpZXcgdGVzdCcpCi0gICAgZmlsZW5hbWUgPSAnLi90ZXh0Vmlldy5weScKLSAgICB0ZXh0ID0gZmlsZShmaWxlbmFtZSwgJ3InKS5yZWFkKCkKLSAgICBidG4xID0gQnV0dG9uKHJvb3QsIHRleHQ9J3ZpZXdfdGV4dCcsCi0gICAgICAgICAgICAgICAgIGNvbW1hbmQ9bGFtYmRhOnZpZXdfdGV4dChyb290LCAndmlld190ZXh0JywgdGV4dCkpCi0gICAgYnRuMS5wYWNrKHNpZGU9TEVGVCkKLSAgICBidG4yID0gQnV0dG9uKHJvb3QsIHRleHQ9J3ZpZXdfZmlsZScsCi0gICAgICAgICAgICAgICAgICBjb21tYW5kPWxhbWJkYTp2aWV3X2ZpbGUocm9vdCwgJ3ZpZXdfZmlsZScsIGZpbGVuYW1lKSkKLSAgICBidG4yLnBhY2soc2lkZT1MRUZUKQotICAgIGNsb3NlID0gQnV0dG9uKHJvb3QsIHRleHQ9J0Nsb3NlJywgY29tbWFuZD1yb290LmRlc3Ryb3kpCi0gICAgY2xvc2UucGFjayhzaWRlPVJJR0hUKQotICAgIHJvb3QubWFpbmxvb3AoKQorICAgIGltcG9ydCB1bml0dGVzdAorICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfdGV4dHZpZXcnLCB2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKKyAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KKyAgICBydW4oVGV4dFZpZXdlcikKZGlmZiAtLWdpdCBhL0xpYi9pbWFwbGliLnB5IGIvTGliL2ltYXBsaWIucHkKaW5kZXggYzU3NjkyNy4uMTBmZjM0MCAxMDA2NDQKLS0tIGEvTGliL2ltYXBsaWIucHkKKysrIGIvTGliL2ltYXBsaWIucHkKQEAgLTM1LDYgKzM1LDE1IEBACiBJTUFQNF9TU0xfUE9SVCA9IDk5MwogQWxsb3dlZFZlcnNpb25zID0gKCdJTUFQNFJFVjEnLCAnSU1BUDQnKSAgICAgICAgIyBNb3N0IHJlY2VudCBmaXJzdAogCisjIE1heGltYWwgbGluZSBsZW5ndGggd2hlbiBjYWxsaW5nIHJlYWRsaW5lKCkuIFRoaXMgaXMgdG8gcHJldmVudAorIyByZWFkaW5nIGFyYml0cmFyeSBsZW5ndGggbGluZXMuIFJGQyAzNTAxIGFuZCAyMDYwIChJTUFQIDRyZXYxKQorIyBkb24ndCBzcGVjaWZ5IGEgbGluZSBsZW5ndGguIFJGQyAyNjgzIGhvd2V2ZXIgc3VnZ2VzdHMgbGltaXRpbmcgY2xpZW50CisjIGNvbW1hbmQgbGluZXMgdG8gMTAwMCBvY3RldHMgYW5kIHNlcnZlciBjb21tYW5kIGxpbmVzIHRvIDgwMDAgb2N0ZXRzLgorIyBXZSBoYXZlIHNlbGVjdGVkIDEwMDAwIGZvciBzb21lIGV4dHJhIG1hcmdpbiBhbmQgc2luY2UgdGhhdCBpcyBzdXBwb3NlZGx5CisjIGFsc28gd2hhdCBVVyBhbmQgUGFuZGEgSU1BUCBkb2VzLgorX01BWExJTkUgPSAxMDAwMAorCisKICMgICAgICAgQ29tbWFuZHMKIAogQ29tbWFuZHMgPSB7CkBAIC0yMzcsNyArMjQ2LDEwIEBACiAKICAgICBkZWYgcmVhZGxpbmUoc2VsZik6CiAgICAgICAgICIiIlJlYWQgbGluZSBmcm9tIHJlbW90ZS4iIiIKLSAgICAgICAgcmV0dXJuIHNlbGYuZmlsZS5yZWFkbGluZSgpCisgICAgICAgIGxpbmUgPSBzZWxmLmZpbGUucmVhZGxpbmUoX01BWExJTkUgKyAxKQorICAgICAgICBpZiBsZW4obGluZSkgPiBfTUFYTElORToKKyAgICAgICAgICAgIHJhaXNlIHNlbGYuZXJyb3IoImdvdCBtb3JlIHRoYW4gJWQgYnl0ZXMiICUgX01BWExJTkUpCisgICAgICAgIHJldHVybiBsaW5lCiAKIAogICAgIGRlZiBzZW5kKHNlbGYsIGRhdGEpOgpAQCAtOTkwLDYgKzEwMDIsMTEgQEAKICAgICAgICAgICAgICAgICBkZWwgc2VsZi50YWdnZWRfY29tbWFuZHNbdGFnXQogICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQKIAorICAgICAgICAgICAgIyBJZiB3ZSd2ZSBzZWVuIGEgQllFIGF0IHRoaXMgcG9pbnQsIHRoZSBzb2NrZXQgd2lsbCBiZQorICAgICAgICAgICAgIyBjbG9zZWQsIHNvIHJlcG9ydCB0aGUgQllFIG5vdy4KKworICAgICAgICAgICAgc2VsZi5fY2hlY2tfYnllKCkKKwogICAgICAgICAgICAgIyBTb21lIGhhdmUgcmVwb3J0ZWQgInVuZXhwZWN0ZWQgcmVzcG9uc2UiIGV4Y2VwdGlvbnMuCiAgICAgICAgICAgICAjIE5vdGUgdGhhdCBpZ25vcmluZyB0aGVtIGhlcmUgY2F1c2VzIGxvb3BzLgogICAgICAgICAgICAgIyBJbnN0ZWFkLCBzZW5kIG1lIGRldGFpbHMgb2YgdGhlIHVuZXhwZWN0ZWQgcmVzcG9uc2UgYW5kCmRpZmYgLS1naXQgYS9MaWIvaW1naGRyLnB5IGIvTGliL2ltZ2hkci5weQppbmRleCAxNjgzMDI0Li5mYzg2NGMzIDEwMDY0NAotLS0gYS9MaWIvaW1naGRyLnB5CisrKyBiL0xpYi9pbWdoZHIucHkKQEAgLTcsMTggKzcsMTYgQEAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwogCiBkZWYgd2hhdChmaWxlLCBoPU5vbmUpOgotICAgIGlmIGggaXMgTm9uZToKLSAgICAgICAgaWYgaXNpbnN0YW5jZShmaWxlLCBiYXNlc3RyaW5nKToKLSAgICAgICAgICAgIGYgPSBvcGVuKGZpbGUsICdyYicpCi0gICAgICAgICAgICBoID0gZi5yZWFkKDMyKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgbG9jYXRpb24gPSBmaWxlLnRlbGwoKQotICAgICAgICAgICAgaCA9IGZpbGUucmVhZCgzMikKLSAgICAgICAgICAgIGZpbGUuc2Vlayhsb2NhdGlvbikKLSAgICAgICAgICAgIGYgPSBOb25lCi0gICAgZWxzZToKLSAgICAgICAgZiA9IE5vbmUKKyAgICBmID0gTm9uZQogICAgIHRyeToKKyAgICAgICAgaWYgaCBpcyBOb25lOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShmaWxlLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgICAgICBmID0gb3BlbihmaWxlLCAncmInKQorICAgICAgICAgICAgICAgIGggPSBmLnJlYWQoMzIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gZmlsZS50ZWxsKCkKKyAgICAgICAgICAgICAgICBoID0gZmlsZS5yZWFkKDMyKQorICAgICAgICAgICAgICAgIGZpbGUuc2Vlayhsb2NhdGlvbikKICAgICAgICAgZm9yIHRmIGluIHRlc3RzOgogICAgICAgICAgICAgcmVzID0gdGYoaCwgZikKICAgICAgICAgICAgIGlmIHJlczoKZGlmZiAtLWdpdCBhL0xpYi9pbnNwZWN0LnB5IGIvTGliL2luc3BlY3QucHkKaW5kZXggYzcyNzUzMC4uOTMzNjk0MyAxMDA2NDQKLS0tIGEvTGliL2luc3BlY3QucHkKKysrIGIvTGliL2luc3BlY3QucHkKQEAgLTE2NSw3ICsxNjUsNyBAQAogICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBnZW5lcmF0b3IuCiAKICAgICBHZW5lcmF0b3Igb2JqZWN0cyBwcm92aWRlIHRoZXNlIGF0dHJpYnV0ZXM6Ci0gICAgICAgIF9faXRlcl9fICAgICAgICBkZWZpbmVkIHRvIHN1cHBvcnQgaW50ZXJhdGlvbiBvdmVyIGNvbnRhaW5lcgorICAgICAgICBfX2l0ZXJfXyAgICAgICAgZGVmaW5lZCB0byBzdXBwb3J0IGl0ZXJhdGlvbiBvdmVyIGNvbnRhaW5lcgogICAgICAgICBjbG9zZSAgICAgICAgICAgcmFpc2VzIGEgbmV3IEdlbmVyYXRvckV4aXQgZXhjZXB0aW9uIGluc2lkZSB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvciB0byB0ZXJtaW5hdGUgdGhlIGl0ZXJhdGlvbgogICAgICAgICBnaV9jb2RlICAgICAgICAgY29kZSBvYmplY3QKQEAgLTI4OCwzMCArMjg4LDIxIEBACiAgICAgbmFtZXMgPSBkaXIoY2xzKQogICAgIHJlc3VsdCA9IFtdCiAgICAgZm9yIG5hbWUgaW4gbmFtZXM6Ci0gICAgICAgICMgR2V0IHRoZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lLgorICAgICAgICAjIEdldCB0aGUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZSwgYW5kIHdoZXJlIGl0IHdhcyBkZWZpbmVkLgogICAgICAgICAjIEdldHRpbmcgYW4gb2JqIGZyb20gdGhlIF9fZGljdF9fIHNvbWV0aW1lcyByZXZlYWxzIG1vcmUgdGhhbgogICAgICAgICAjIHVzaW5nIGdldGF0dHIuICBTdGF0aWMgYW5kIGNsYXNzIG1ldGhvZHMgYXJlIGRyYW1hdGljIGV4YW1wbGVzLgotICAgICAgICBpZiBuYW1lIGluIGNscy5fX2RpY3RfXzoKLSAgICAgICAgICAgIG9iaiA9IGNscy5fX2RpY3RfX1tuYW1lXQorICAgICAgICAjIEZ1cnRoZXJtb3JlLCBzb21lIG9iamVjdHMgbWF5IHJhaXNlIGFuIEV4Y2VwdGlvbiB3aGVuIGZldGNoZWQgd2l0aAorICAgICAgICAjIGdldGF0dHIoKS4gVGhpcyBpcyB0aGUgY2FzZSB3aXRoIHNvbWUgZGVzY3JpcHRvcnMgKGJ1ZyAjMTc4NSkuCisgICAgICAgICMgVGh1cywgd2Ugb25seSB1c2UgZ2V0YXR0cigpIGFzIGEgbGFzdCByZXNvcnQuCisgICAgICAgIGhvbWVjbHMgPSBOb25lCisgICAgICAgIGZvciBiYXNlIGluIChjbHMsKSArIG1ybzoKKyAgICAgICAgICAgIGlmIG5hbWUgaW4gYmFzZS5fX2RpY3RfXzoKKyAgICAgICAgICAgICAgICBvYmogPSBiYXNlLl9fZGljdF9fW25hbWVdCisgICAgICAgICAgICAgICAgaG9tZWNscyA9IGJhc2UKKyAgICAgICAgICAgICAgICBicmVhawogICAgICAgICBlbHNlOgogICAgICAgICAgICAgb2JqID0gZ2V0YXR0cihjbHMsIG5hbWUpCi0KLSAgICAgICAgIyBGaWd1cmUgb3V0IHdoZXJlIGl0IHdhcyBkZWZpbmVkLgotICAgICAgICBob21lY2xzID0gZ2V0YXR0cihvYmosICJfX29iamNsYXNzX18iLCBOb25lKQotICAgICAgICBpZiBob21lY2xzIGlzIE5vbmU6Ci0gICAgICAgICAgICAjIHNlYXJjaCB0aGUgZGljdHMuCi0gICAgICAgICAgICBmb3IgYmFzZSBpbiBtcm86Ci0gICAgICAgICAgICAgICAgaWYgbmFtZSBpbiBiYXNlLl9fZGljdF9fOgotICAgICAgICAgICAgICAgICAgICBob21lY2xzID0gYmFzZQotICAgICAgICAgICAgICAgICAgICBicmVhawotCi0gICAgICAgICMgR2V0IHRoZSBvYmplY3QgYWdhaW4sIGluIG9yZGVyIHRvIGdldCBpdCBmcm9tIHRoZSBkZWZpbmluZwotICAgICAgICAjIF9fZGljdF9fIGluc3RlYWQgb2YgdmlhIGdldGF0dHIgKGlmIHBvc3NpYmxlKS4KLSAgICAgICAgaWYgaG9tZWNscyBpcyBub3QgTm9uZSBhbmQgbmFtZSBpbiBob21lY2xzLl9fZGljdF9fOgotICAgICAgICAgICAgb2JqID0gaG9tZWNscy5fX2RpY3RfX1tuYW1lXQotCi0gICAgICAgICMgQWxzbyBnZXQgdGhlIG9iamVjdCB2aWEgZ2V0YXR0ci4KLSAgICAgICAgb2JqX3ZpYV9nZXRhdHRyID0gZ2V0YXR0cihjbHMsIG5hbWUpCisgICAgICAgICAgICBob21lY2xzID0gZ2V0YXR0cihvYmosICJfX29iamNsYXNzX18iLCBob21lY2xzKQogCiAgICAgICAgICMgQ2xhc3NpZnkgdGhlIG9iamVjdC4KICAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosIHN0YXRpY21ldGhvZCk6CkBAIC0zMjAsMTEgKzMxMSwxOCBAQAogICAgICAgICAgICAga2luZCA9ICJjbGFzcyBtZXRob2QiCiAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvYmosIHByb3BlcnR5KToKICAgICAgICAgICAgIGtpbmQgPSAicHJvcGVydHkiCi0gICAgICAgIGVsaWYgKGlzbWV0aG9kKG9ial92aWFfZ2V0YXR0cikgb3IKLSAgICAgICAgICAgICAgaXNtZXRob2RkZXNjcmlwdG9yKG9ial92aWFfZ2V0YXR0cikpOgorICAgICAgICBlbGlmIGlzbWV0aG9kZGVzY3JpcHRvcihvYmopOgogICAgICAgICAgICAga2luZCA9ICJtZXRob2QiCi0gICAgICAgIGVsc2U6CisgICAgICAgIGVsaWYgaXNkYXRhZGVzY3JpcHRvcihvYmopOgogICAgICAgICAgICAga2luZCA9ICJkYXRhIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb2JqX3ZpYV9nZXRhdHRyID0gZ2V0YXR0cihjbHMsIG5hbWUpCisgICAgICAgICAgICBpZiAoaXNtZXRob2Qob2JqX3ZpYV9nZXRhdHRyKSBvcgorICAgICAgICAgICAgICAgIGlzbWV0aG9kZGVzY3JpcHRvcihvYmpfdmlhX2dldGF0dHIpKToKKyAgICAgICAgICAgICAgICBraW5kID0gIm1ldGhvZCIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAga2luZCA9ICJkYXRhIgorICAgICAgICAgICAgb2JqID0gb2JqX3ZpYV9nZXRhdHRyCiAKICAgICAgICAgcmVzdWx0LmFwcGVuZChBdHRyaWJ1dGUobmFtZSwga2luZCwgaG9tZWNscywgb2JqKSkKIApAQCAtNTI3LDcgKzUyNSw3IEBACiAKICAgICBmaWxlID0gZ2V0ZmlsZShvYmplY3QpCiAgICAgc291cmNlZmlsZSA9IGdldHNvdXJjZWZpbGUob2JqZWN0KQotICAgIGlmIG5vdCBzb3VyY2VmaWxlIGFuZCBmaWxlWzBdICsgZmlsZVstMV0gIT0gJzw+JzoKKyAgICBpZiBub3Qgc291cmNlZmlsZSBhbmQgZmlsZVs6MV0gKyBmaWxlWy0xOl0gIT0gJzw+JzoKICAgICAgICAgcmFpc2UgSU9FcnJvcignc291cmNlIGNvZGUgbm90IGF2YWlsYWJsZScpCiAgICAgZmlsZSA9IHNvdXJjZWZpbGUgaWYgc291cmNlZmlsZSBlbHNlIGZpbGUKIApAQCAtNzMwLDcgKzcyOCw4IEBACiAgICAgICAgICAgICBmb3IgcGFyZW50IGluIGMuX19iYXNlc19fOgogICAgICAgICAgICAgICAgIGlmIG5vdCBwYXJlbnQgaW4gY2hpbGRyZW46CiAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuW3BhcmVudF0gPSBbXQotICAgICAgICAgICAgICAgIGNoaWxkcmVuW3BhcmVudF0uYXBwZW5kKGMpCisgICAgICAgICAgICAgICAgaWYgYyBub3QgaW4gY2hpbGRyZW5bcGFyZW50XToKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5bcGFyZW50XS5hcHBlbmQoYykKICAgICAgICAgICAgICAgICBpZiB1bmlxdWUgYW5kIHBhcmVudCBpbiBjbGFzc2VzOiBicmVhawogICAgICAgICBlbGlmIGMgbm90IGluIHJvb3RzOgogICAgICAgICAgICAgcm9vdHMuYXBwZW5kKGMpCmRpZmYgLS1naXQgYS9MaWIvaW8ucHkgYi9MaWIvaW8ucHkKaW5kZXggNWM0MjljNi4uMTQzODQ5MyAxMDA2NDQKLS0tIGEvTGliL2lvLnB5CisrKyBiL0xpYi9pby5weQpAQCAtNCw3ICs0LDcgQEAKIEF0IHRoZSB0b3Agb2YgdGhlIEkvTyBoaWVyYXJjaHkgaXMgdGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgSU9CYXNlLiBJdAogZGVmaW5lcyB0aGUgYmFzaWMgaW50ZXJmYWNlIHRvIGEgc3RyZWFtLiBOb3RlLCBob3dldmVyLCB0aGF0IHRoZXJlIGlzIG5vCiBzZXBhcmF0aW9uIGJldHdlZW4gcmVhZGluZyBhbmQgd3JpdGluZyB0byBzdHJlYW1zOyBpbXBsZW1lbnRhdGlvbnMgYXJlCi1hbGxvd2VkIHRvIHRocm93IGFuIElPRXJyb3IgaWYgdGhleSBkbyBub3Qgc3VwcG9ydCBhIGdpdmVuIG9wZXJhdGlvbi4KK2FsbG93ZWQgdG8gcmFpc2UgYW4gSU9FcnJvciBpZiB0aGV5IGRvIG5vdCBzdXBwb3J0IGEgZ2l2ZW4gb3BlcmF0aW9uLgogCiBFeHRlbmRpbmcgSU9CYXNlIGlzIFJhd0lPQmFzZSB3aGljaCBkZWFscyBzaW1wbHkgd2l0aCB0aGUgcmVhZGluZyBhbmQKIHdyaXRpbmcgb2YgcmF3IGJ5dGVzIHRvIGEgc3RyZWFtLiBGaWxlSU8gc3ViY2xhc3NlcyBSYXdJT0Jhc2UgdG8gcHJvdmlkZQpAQCAtMzQsMTUgKzM0LDYgQEAKICIiIgogIyBOZXcgSS9PIGxpYnJhcnkgY29uZm9ybWluZyB0byBQRVAgMzExNi4KIAotIyBYWFggZWRnZSBjYXNlcyB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIHJlYWRpbmcvd3JpdGluZwotIyBYWFggbmVlZCB0byBzdXBwb3J0IDEgbWVhbmluZyBsaW5lLWJ1ZmZlcmVkCi0jIFhYWCB3aGVuZXZlciBhbiBhcmd1bWVudCBpcyBOb25lLCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUKLSMgWFhYIHJlYWQvd3JpdGUgb3BzIHNob3VsZCBjaGVjayByZWFkYWJsZS93cml0YWJsZQotIyBYWFggYnVmZmVyZWQgcmVhZGludG8gc2hvdWxkIHdvcmsgd2l0aCBhcmJpdHJhcnkgYnVmZmVyIG9iamVjdHMKLSMgWFhYIHVzZSBpbmNyZW1lbnRhbCBlbmNvZGVyIGZvciB0ZXh0IG91dHB1dCwgYXQgbGVhc3QgZm9yIFVURi0xNiBhbmQgVVRGLTgtU0lHCi0jIFhYWCBjaGVjayB3cml0YWJsZSwgcmVhZGFibGUgYW5kIHNlZWthYmxlIGluIGFwcHJvcHJpYXRlIHBsYWNlcwotCi0KIF9fYXV0aG9yX18gPSAoIkd1aWRvIHZhbiBSb3NzdW0gPGd1aWRvQHB5dGhvbi5vcmc+LCAiCiAgICAgICAgICAgICAgICJNaWtlIFZlcmRvbmUgPG1pa2UudmVyZG9uZUBnbWFpbC5jb20+LCAiCiAgICAgICAgICAgICAgICJNYXJrIFJ1c3NlbGwgPG1hcmsucnVzc2VsbEB6ZW4uY28udWs+LCAiCkBAIC03NywxNSArNjgsMTYgQEAKICMgdmVyc2lvbiBob3dldmVyLgogY2xhc3MgSU9CYXNlKF9pby5fSU9CYXNlKToKICAgICBfX21ldGFjbGFzc19fID0gYWJjLkFCQ01ldGEKKyAgICBfX2RvY19fID0gX2lvLl9JT0Jhc2UuX19kb2NfXwogCiBjbGFzcyBSYXdJT0Jhc2UoX2lvLl9SYXdJT0Jhc2UsIElPQmFzZSk6Ci0gICAgcGFzcworICAgIF9fZG9jX18gPSBfaW8uX1Jhd0lPQmFzZS5fX2RvY19fCiAKIGNsYXNzIEJ1ZmZlcmVkSU9CYXNlKF9pby5fQnVmZmVyZWRJT0Jhc2UsIElPQmFzZSk6Ci0gICAgcGFzcworICAgIF9fZG9jX18gPSBfaW8uX0J1ZmZlcmVkSU9CYXNlLl9fZG9jX18KIAogY2xhc3MgVGV4dElPQmFzZShfaW8uX1RleHRJT0Jhc2UsIElPQmFzZSk6Ci0gICAgcGFzcworICAgIF9fZG9jX18gPSBfaW8uX1RleHRJT0Jhc2UuX19kb2NfXwogCiBSYXdJT0Jhc2UucmVnaXN0ZXIoRmlsZUlPKQogCmRpZmYgLS1naXQgYS9MaWIvanNvbi9fX2luaXRfXy5weSBiL0xpYi9qc29uL19faW5pdF9fLnB5CmluZGV4IDQxNGM3MDIuLjBiZTg1ZGEgMTAwNjQ0Ci0tLSBhL0xpYi9qc29uL19faW5pdF9fLnB5CisrKyBiL0xpYi9qc29uL19faW5pdF9fLnB5CkBAIC0zMSwxNCArMzEsMTQgQEAKIENvbXBhY3QgZW5jb2Rpbmc6OgogCiAgICAgPj4+IGltcG9ydCBqc29uCi0gICAgPj4+IGpzb24uZHVtcHMoWzEsMiwzLHsnNCc6IDUsICc2JzogN31dLCBzZXBhcmF0b3JzPSgnLCcsJzonKSkKKyAgICA+Pj4ganNvbi5kdW1wcyhbMSwyLDMseyc0JzogNSwgJzYnOiA3fV0sIHNvcnRfa2V5cz1UcnVlLCBzZXBhcmF0b3JzPSgnLCcsJzonKSkKICAgICAnWzEsMiwzLHsiNCI6NSwiNiI6N31dJwogCiBQcmV0dHkgcHJpbnRpbmc6OgogCiAgICAgPj4+IGltcG9ydCBqc29uCi0gICAgPj4+IHMgPSBqc29uLmR1bXBzKHsnNCc6IDUsICc2JzogN30sIHNvcnRfa2V5cz1UcnVlLCBpbmRlbnQ9NCkKLSAgICA+Pj4gcHJpbnQgJ1xuJy5qb2luKFtsLnJzdHJpcCgpIGZvciBsIGluICBzLnNwbGl0bGluZXMoKV0pCisgICAgPj4+IHByaW50IGpzb24uZHVtcHMoeyc0JzogNSwgJzYnOiA3fSwgc29ydF9rZXlzPVRydWUsCisgICAgLi4uICAgICAgICAgICAgICAgICAgaW5kZW50PTQsIHNlcGFyYXRvcnM9KCcsJywgJzogJykpCiAgICAgewogICAgICAgICAiNCI6IDUsCiAgICAgICAgICI2IjogNwpAQCAtOTUsNyArOTUsNyBAQAogICAgICAgICAianNvbiI6ICJvYmoiCiAgICAgfQogICAgICQgZWNobyAneyAxLjI6My40fScgfCBweXRob24gLW0ganNvbi50b29sCi0gICAgRXhwZWN0aW5nIHByb3BlcnR5IG5hbWU6IGxpbmUgMSBjb2x1bW4gMiAoY2hhciAyKQorICAgIEV4cGVjdGluZyBwcm9wZXJ0eSBuYW1lIGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXM6IGxpbmUgMSBjb2x1bW4gMyAoY2hhciAyKQogIiIiCiBfX3ZlcnNpb25fXyA9ICcyLjAuOScKIF9fYWxsX18gPSBbCkBAIC0xMjEsNyArMTIxLDcgQEAKIAogZGVmIGR1bXAob2JqLCBmcCwgc2tpcGtleXM9RmFsc2UsIGVuc3VyZV9hc2NpaT1UcnVlLCBjaGVja19jaXJjdWxhcj1UcnVlLAogICAgICAgICBhbGxvd19uYW49VHJ1ZSwgY2xzPU5vbmUsIGluZGVudD1Ob25lLCBzZXBhcmF0b3JzPU5vbmUsCi0gICAgICAgIGVuY29kaW5nPSd1dGYtOCcsIGRlZmF1bHQ9Tm9uZSwgKiprdyk6CisgICAgICAgIGVuY29kaW5nPSd1dGYtOCcsIGRlZmF1bHQ9Tm9uZSwgc29ydF9rZXlzPUZhbHNlLCAqKmt3KToKICAgICAiIiJTZXJpYWxpemUgYGBvYmpgYCBhcyBhIEpTT04gZm9ybWF0dGVkIHN0cmVhbSB0byBgYGZwYGAgKGEKICAgICBgYC53cml0ZSgpYGAtc3VwcG9ydGluZyBmaWxlLWxpa2Ugb2JqZWN0KS4KIApAQCAtMTI5LDExICsxMjksMTQgQEAKICAgICAoYGBzdHJgYCwgYGB1bmljb2RlYGAsIGBgaW50YGAsIGBgbG9uZ2BgLCBgYGZsb2F0YGAsIGBgYm9vbGBgLCBgYE5vbmVgYCkKICAgICB3aWxsIGJlIHNraXBwZWQgaW5zdGVhZCBvZiByYWlzaW5nIGEgYGBUeXBlRXJyb3JgYC4KIAotICAgIElmIGBgZW5zdXJlX2FzY2lpYGAgaXMgZmFsc2UsIHRoZW4gdGhlIHNvbWUgY2h1bmtzIHdyaXR0ZW4gdG8gYGBmcGBgCi0gICAgbWF5IGJlIGBgdW5pY29kZWBgIGluc3RhbmNlcywgc3ViamVjdCB0byBub3JtYWwgUHl0aG9uIGBgc3RyYGAgdG8KLSAgICBgYHVuaWNvZGVgYCBjb2VyY2lvbiBydWxlcy4gVW5sZXNzIGBgZnAud3JpdGUoKWBgIGV4cGxpY2l0bHkKLSAgICB1bmRlcnN0YW5kcyBgYHVuaWNvZGVgYCAoYXMgaW4gYGBjb2RlY3MuZ2V0d3JpdGVyKClgYCkgdGhpcyBpcyBsaWtlbHkKLSAgICB0byBjYXVzZSBhbiBlcnJvci4KKyAgICBJZiBgYGVuc3VyZV9hc2NpaWBgIGlzIHRydWUgKHRoZSBkZWZhdWx0KSwgYWxsIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGluIHRoZQorICAgIG91dHB1dCBhcmUgZXNjYXBlZCB3aXRoIGBgXHVYWFhYYGAgc2VxdWVuY2VzLCBhbmQgdGhlIHJlc3VsdCBpcyBhIGBgc3RyYGAKKyAgICBpbnN0YW5jZSBjb25zaXN0aW5nIG9mIEFTQ0lJIGNoYXJhY3RlcnMgb25seS4gIElmIGBgZW5zdXJlX2FzY2lpYGAgaXMKKyAgICBgYEZhbHNlYGAsIHNvbWUgY2h1bmtzIHdyaXR0ZW4gdG8gYGBmcGBgIG1heSBiZSBgYHVuaWNvZGVgYCBpbnN0YW5jZXMuCisgICAgVGhpcyB1c3VhbGx5IGhhcHBlbnMgYmVjYXVzZSB0aGUgaW5wdXQgY29udGFpbnMgdW5pY29kZSBzdHJpbmdzIG9yIHRoZQorICAgIGBgZW5jb2RpbmdgYCBwYXJhbWV0ZXIgaXMgdXNlZC4gVW5sZXNzIGBgZnAud3JpdGUoKWBgIGV4cGxpY2l0bHkKKyAgICB1bmRlcnN0YW5kcyBgYHVuaWNvZGVgYCAoYXMgaW4gYGBjb2RlY3MuZ2V0d3JpdGVyYGApIHRoaXMgaXMgbGlrZWx5IHRvCisgICAgY2F1c2UgYW4gZXJyb3IuCiAKICAgICBJZiBgYGNoZWNrX2NpcmN1bGFyYGAgaXMgZmFsc2UsIHRoZW4gdGhlIGNpcmN1bGFyIHJlZmVyZW5jZSBjaGVjawogICAgIGZvciBjb250YWluZXIgdHlwZXMgd2lsbCBiZSBza2lwcGVkIGFuZCBhIGNpcmN1bGFyIHJlZmVyZW5jZSB3aWxsCkBAIC0xNDcsNyArMTUwLDkgQEAKICAgICBJZiBgYGluZGVudGBgIGlzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIsIHRoZW4gSlNPTiBhcnJheSBlbGVtZW50cyBhbmQKICAgICBvYmplY3QgbWVtYmVycyB3aWxsIGJlIHByZXR0eS1wcmludGVkIHdpdGggdGhhdCBpbmRlbnQgbGV2ZWwuIEFuIGluZGVudAogICAgIGxldmVsIG9mIDAgd2lsbCBvbmx5IGluc2VydCBuZXdsaW5lcy4gYGBOb25lYGAgaXMgdGhlIG1vc3QgY29tcGFjdAotICAgIHJlcHJlc2VudGF0aW9uLgorICAgIHJlcHJlc2VudGF0aW9uLiAgU2luY2UgdGhlIGRlZmF1bHQgaXRlbSBzZXBhcmF0b3IgaXMgYGAnLCAnYGAsICB0aGUKKyAgICBvdXRwdXQgbWlnaHQgaW5jbHVkZSB0cmFpbGluZyB3aGl0ZXNwYWNlIHdoZW4gYGBpbmRlbnRgYCBpcyBzcGVjaWZpZWQuCisgICAgWW91IGNhbiB1c2UgYGBzZXBhcmF0b3JzPSgnLCcsICc6ICcpYGAgdG8gYXZvaWQgdGhpcy4KIAogICAgIElmIGBgc2VwYXJhdG9yc2BgIGlzIGFuIGBgKGl0ZW1fc2VwYXJhdG9yLCBkaWN0X3NlcGFyYXRvcilgYCB0dXBsZQogICAgIHRoZW4gaXQgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgYGAoJywgJywgJzogJylgYCBzZXBhcmF0b3JzLgpAQCAtMTU4LDYgKzE2Myw5IEBACiAgICAgYGBkZWZhdWx0KG9iailgYCBpcyBhIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIHJldHVybiBhIHNlcmlhbGl6YWJsZSB2ZXJzaW9uCiAgICAgb2Ygb2JqIG9yIHJhaXNlIFR5cGVFcnJvci4gVGhlIGRlZmF1bHQgc2ltcGx5IHJhaXNlcyBUeXBlRXJyb3IuCiAKKyAgICBJZiAqc29ydF9rZXlzKiBpcyBgYFRydWVgYCAoZGVmYXVsdDogYGBGYWxzZWBgKSwgdGhlbiB0aGUgb3V0cHV0IG9mCisgICAgZGljdGlvbmFyaWVzIHdpbGwgYmUgc29ydGVkIGJ5IGtleS4KKwogICAgIFRvIHVzZSBhIGN1c3RvbSBgYEpTT05FbmNvZGVyYGAgc3ViY2xhc3MgKGUuZy4gb25lIHRoYXQgb3ZlcnJpZGVzIHRoZQogICAgIGBgLmRlZmF1bHQoKWBgIG1ldGhvZCB0byBzZXJpYWxpemUgYWRkaXRpb25hbCB0eXBlcyksIHNwZWNpZnkgaXQgd2l0aAogICAgIHRoZSBgYGNsc2BgIGt3YXJnOyBvdGhlcndpc2UgYGBKU09ORW5jb2RlcmBgIGlzIHVzZWQuCkBAIC0xNjcsNyArMTc1LDcgQEAKICAgICBpZiAobm90IHNraXBrZXlzIGFuZCBlbnN1cmVfYXNjaWkgYW5kCiAgICAgICAgIGNoZWNrX2NpcmN1bGFyIGFuZCBhbGxvd19uYW4gYW5kCiAgICAgICAgIGNscyBpcyBOb25lIGFuZCBpbmRlbnQgaXMgTm9uZSBhbmQgc2VwYXJhdG9ycyBpcyBOb25lIGFuZAotICAgICAgICBlbmNvZGluZyA9PSAndXRmLTgnIGFuZCBkZWZhdWx0IGlzIE5vbmUgYW5kIG5vdCBrdyk6CisgICAgICAgIGVuY29kaW5nID09ICd1dGYtOCcgYW5kIGRlZmF1bHQgaXMgTm9uZSBhbmQgbm90IHNvcnRfa2V5cyBhbmQgbm90IGt3KToKICAgICAgICAgaXRlcmFibGUgPSBfZGVmYXVsdF9lbmNvZGVyLml0ZXJlbmNvZGUob2JqKQogICAgIGVsc2U6CiAgICAgICAgIGlmIGNscyBpcyBOb25lOgpAQCAtMTc1LDcgKzE4Myw3IEBACiAgICAgICAgIGl0ZXJhYmxlID0gY2xzKHNraXBrZXlzPXNraXBrZXlzLCBlbnN1cmVfYXNjaWk9ZW5zdXJlX2FzY2lpLAogICAgICAgICAgICAgY2hlY2tfY2lyY3VsYXI9Y2hlY2tfY2lyY3VsYXIsIGFsbG93X25hbj1hbGxvd19uYW4sIGluZGVudD1pbmRlbnQsCiAgICAgICAgICAgICBzZXBhcmF0b3JzPXNlcGFyYXRvcnMsIGVuY29kaW5nPWVuY29kaW5nLAotICAgICAgICAgICAgZGVmYXVsdD1kZWZhdWx0LCAqKmt3KS5pdGVyZW5jb2RlKG9iaikKKyAgICAgICAgICAgIGRlZmF1bHQ9ZGVmYXVsdCwgc29ydF9rZXlzPXNvcnRfa2V5cywgKiprdykuaXRlcmVuY29kZShvYmopCiAgICAgIyBjb3VsZCBhY2NlbGVyYXRlIHdpdGggd3JpdGVsaW5lcyBpbiBzb21lIHZlcnNpb25zIG9mIFB5dGhvbiwgYXQKICAgICAjIGEgZGVidWdnYWJpbGl0eSBjb3N0CiAgICAgZm9yIGNodW5rIGluIGl0ZXJhYmxlOgpAQCAtMTg0LDE2ICsxOTIsMTUgQEAKIAogZGVmIGR1bXBzKG9iaiwgc2tpcGtleXM9RmFsc2UsIGVuc3VyZV9hc2NpaT1UcnVlLCBjaGVja19jaXJjdWxhcj1UcnVlLAogICAgICAgICBhbGxvd19uYW49VHJ1ZSwgY2xzPU5vbmUsIGluZGVudD1Ob25lLCBzZXBhcmF0b3JzPU5vbmUsCi0gICAgICAgIGVuY29kaW5nPSd1dGYtOCcsIGRlZmF1bHQ9Tm9uZSwgKiprdyk6CisgICAgICAgIGVuY29kaW5nPSd1dGYtOCcsIGRlZmF1bHQ9Tm9uZSwgc29ydF9rZXlzPUZhbHNlLCAqKmt3KToKICAgICAiIiJTZXJpYWxpemUgYGBvYmpgYCB0byBhIEpTT04gZm9ybWF0dGVkIGBgc3RyYGAuCiAKICAgICBJZiBgYHNraXBrZXlzYGAgaXMgZmFsc2UgdGhlbiBgYGRpY3RgYCBrZXlzIHRoYXQgYXJlIG5vdCBiYXNpYyB0eXBlcwogICAgIChgYHN0cmBgLCBgYHVuaWNvZGVgYCwgYGBpbnRgYCwgYGBsb25nYGAsIGBgZmxvYXRgYCwgYGBib29sYGAsIGBgTm9uZWBgKQogICAgIHdpbGwgYmUgc2tpcHBlZCBpbnN0ZWFkIG9mIHJhaXNpbmcgYSBgYFR5cGVFcnJvcmBgLgogCi0gICAgSWYgYGBlbnN1cmVfYXNjaWlgYCBpcyBmYWxzZSwgdGhlbiB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYQotICAgIGBgdW5pY29kZWBgIGluc3RhbmNlIHN1YmplY3QgdG8gbm9ybWFsIFB5dGhvbiBgYHN0cmBgIHRvIGBgdW5pY29kZWBgCi0gICAgY29lcmNpb24gcnVsZXMgaW5zdGVhZCBvZiBiZWluZyBlc2NhcGVkIHRvIGFuIEFTQ0lJIGBgc3RyYGAuCisgICAgSWYgYGBlbnN1cmVfYXNjaWlgYCBpcyBmYWxzZSwgYWxsIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGFyZSBub3QgZXNjYXBlZCwgYW5kCisgICAgdGhlIHJldHVybiB2YWx1ZSBtYXkgYmUgYSBgYHVuaWNvZGVgYCBpbnN0YW5jZS4gU2VlIGBgZHVtcGBgIGZvciBkZXRhaWxzLgogCiAgICAgSWYgYGBjaGVja19jaXJjdWxhcmBgIGlzIGZhbHNlLCB0aGVuIHRoZSBjaXJjdWxhciByZWZlcmVuY2UgY2hlY2sKICAgICBmb3IgY29udGFpbmVyIHR5cGVzIHdpbGwgYmUgc2tpcHBlZCBhbmQgYSBjaXJjdWxhciByZWZlcmVuY2Ugd2lsbApAQCAtMjA3LDcgKzIxNCw5IEBACiAgICAgSWYgYGBpbmRlbnRgYCBpcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCB0aGVuIEpTT04gYXJyYXkgZWxlbWVudHMgYW5kCiAgICAgb2JqZWN0IG1lbWJlcnMgd2lsbCBiZSBwcmV0dHktcHJpbnRlZCB3aXRoIHRoYXQgaW5kZW50IGxldmVsLiBBbiBpbmRlbnQKICAgICBsZXZlbCBvZiAwIHdpbGwgb25seSBpbnNlcnQgbmV3bGluZXMuIGBgTm9uZWBgIGlzIHRoZSBtb3N0IGNvbXBhY3QKLSAgICByZXByZXNlbnRhdGlvbi4KKyAgICByZXByZXNlbnRhdGlvbi4gIFNpbmNlIHRoZSBkZWZhdWx0IGl0ZW0gc2VwYXJhdG9yIGlzIGBgJywgJ2BgLCAgdGhlCisgICAgb3V0cHV0IG1pZ2h0IGluY2x1ZGUgdHJhaWxpbmcgd2hpdGVzcGFjZSB3aGVuIGBgaW5kZW50YGAgaXMgc3BlY2lmaWVkLgorICAgIFlvdSBjYW4gdXNlIGBgc2VwYXJhdG9ycz0oJywnLCAnOiAnKWBgIHRvIGF2b2lkIHRoaXMuCiAKICAgICBJZiBgYHNlcGFyYXRvcnNgYCBpcyBhbiBgYChpdGVtX3NlcGFyYXRvciwgZGljdF9zZXBhcmF0b3IpYGAgdHVwbGUKICAgICB0aGVuIGl0IHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGBgKCcsICcsICc6ICcpYGAgc2VwYXJhdG9ycy4KQEAgLTIxOCw2ICsyMjcsOSBAQAogICAgIGBgZGVmYXVsdChvYmopYGAgaXMgYSBmdW5jdGlvbiB0aGF0IHNob3VsZCByZXR1cm4gYSBzZXJpYWxpemFibGUgdmVyc2lvbgogICAgIG9mIG9iaiBvciByYWlzZSBUeXBlRXJyb3IuIFRoZSBkZWZhdWx0IHNpbXBseSByYWlzZXMgVHlwZUVycm9yLgogCisgICAgSWYgKnNvcnRfa2V5cyogaXMgYGBUcnVlYGAgKGRlZmF1bHQ6IGBgRmFsc2VgYCksIHRoZW4gdGhlIG91dHB1dCBvZgorICAgIGRpY3Rpb25hcmllcyB3aWxsIGJlIHNvcnRlZCBieSBrZXkuCisKICAgICBUbyB1c2UgYSBjdXN0b20gYGBKU09ORW5jb2RlcmBgIHN1YmNsYXNzIChlLmcuIG9uZSB0aGF0IG92ZXJyaWRlcyB0aGUKICAgICBgYC5kZWZhdWx0KClgYCBtZXRob2QgdG8gc2VyaWFsaXplIGFkZGl0aW9uYWwgdHlwZXMpLCBzcGVjaWZ5IGl0IHdpdGgKICAgICB0aGUgYGBjbHNgYCBrd2FyZzsgb3RoZXJ3aXNlIGBgSlNPTkVuY29kZXJgYCBpcyB1c2VkLgpAQCAtMjI3LDcgKzIzOSw3IEBACiAgICAgaWYgKG5vdCBza2lwa2V5cyBhbmQgZW5zdXJlX2FzY2lpIGFuZAogICAgICAgICBjaGVja19jaXJjdWxhciBhbmQgYWxsb3dfbmFuIGFuZAogICAgICAgICBjbHMgaXMgTm9uZSBhbmQgaW5kZW50IGlzIE5vbmUgYW5kIHNlcGFyYXRvcnMgaXMgTm9uZSBhbmQKLSAgICAgICAgZW5jb2RpbmcgPT0gJ3V0Zi04JyBhbmQgZGVmYXVsdCBpcyBOb25lIGFuZCBub3Qga3cpOgorICAgICAgICBlbmNvZGluZyA9PSAndXRmLTgnIGFuZCBkZWZhdWx0IGlzIE5vbmUgYW5kIG5vdCBzb3J0X2tleXMgYW5kIG5vdCBrdyk6CiAgICAgICAgIHJldHVybiBfZGVmYXVsdF9lbmNvZGVyLmVuY29kZShvYmopCiAgICAgaWYgY2xzIGlzIE5vbmU6CiAgICAgICAgIGNscyA9IEpTT05FbmNvZGVyCkBAIC0yMzUsNyArMjQ3LDcgQEAKICAgICAgICAgc2tpcGtleXM9c2tpcGtleXMsIGVuc3VyZV9hc2NpaT1lbnN1cmVfYXNjaWksCiAgICAgICAgIGNoZWNrX2NpcmN1bGFyPWNoZWNrX2NpcmN1bGFyLCBhbGxvd19uYW49YWxsb3dfbmFuLCBpbmRlbnQ9aW5kZW50LAogICAgICAgICBzZXBhcmF0b3JzPXNlcGFyYXRvcnMsIGVuY29kaW5nPWVuY29kaW5nLCBkZWZhdWx0PWRlZmF1bHQsCi0gICAgICAgICoqa3cpLmVuY29kZShvYmopCisgICAgICAgIHNvcnRfa2V5cz1zb3J0X2tleXMsICoqa3cpLmVuY29kZShvYmopCiAKIAogX2RlZmF1bHRfZGVjb2RlciA9IEpTT05EZWNvZGVyKGVuY29kaW5nPU5vbmUsIG9iamVjdF9ob29rPU5vbmUsCmRpZmYgLS1naXQgYS9MaWIvanNvbi9kZWNvZGVyLnB5IGIvTGliL2pzb24vZGVjb2Rlci5weQppbmRleCAxZjJkYTcyLi4xYjQzMjM4IDEwMDY0NAotLS0gYS9MaWIvanNvbi9kZWNvZGVyLnB5CisrKyBiL0xpYi9qc29uL2RlY29kZXIucHkKQEAgLTI3LDcgKzI3LDcgQEAKIGRlZiBsaW5lY29sKGRvYywgcG9zKToKICAgICBsaW5lbm8gPSBkb2MuY291bnQoJ1xuJywgMCwgcG9zKSArIDEKICAgICBpZiBsaW5lbm8gPT0gMToKLSAgICAgICAgY29sbm8gPSBwb3MKKyAgICAgICAgY29sbm8gPSBwb3MgKyAxCiAgICAgZWxzZToKICAgICAgICAgY29sbm8gPSBwb3MgLSBkb2MucmluZGV4KCdcbicsIDAsIHBvcykKICAgICByZXR1cm4gbGluZW5vLCBjb2xubwpAQCAtNjIsNiArNjIsMTYgQEAKIAogREVGQVVMVF9FTkNPRElORyA9ICJ1dGYtOCIKIAorZGVmIF9kZWNvZGVfdVhYWFgocywgcG9zKToKKyAgICBlc2MgPSBzW3BvcyArIDE6cG9zICsgNV0KKyAgICBpZiBsZW4oZXNjKSA9PSA0IGFuZCBlc2NbMV0gbm90IGluICd4WCc6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBpbnQoZXNjLCAxNikKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgbXNnID0gIkludmFsaWQgXFx1WFhYWCBlc2NhcGUiCisgICAgcmFpc2UgVmFsdWVFcnJvcihlcnJtc2cobXNnLCBzLCBwb3MpKQorCiBkZWYgcHlfc2NhbnN0cmluZyhzLCBlbmQsIGVuY29kaW5nPU5vbmUsIHN0cmljdD1UcnVlLAogICAgICAgICBfYj1CQUNLU0xBU0gsIF9tPVNUUklOR0NIVU5LLm1hdGNoKToKICAgICAiIiJTY2FuIHRoZSBzdHJpbmcgcyBmb3IgYSBKU09OIHN0cmluZy4gRW5kIGlzIHRoZSBpbmRleCBvZiB0aGUKQEAgLTExNiwyNSArMTI2LDE2IEBACiAgICAgICAgICAgICBlbmQgKz0gMQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgIyBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZQotICAgICAgICAgICAgZXNjID0gc1tlbmQgKyAxOmVuZCArIDVdCi0gICAgICAgICAgICBuZXh0X2VuZCA9IGVuZCArIDUKLSAgICAgICAgICAgIGlmIGxlbihlc2MpICE9IDQ6Ci0gICAgICAgICAgICAgICAgbXNnID0gIkludmFsaWQgXFx1WFhYWCBlc2NhcGUiCi0gICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihlcnJtc2cobXNnLCBzLCBlbmQpKQotICAgICAgICAgICAgdW5pID0gaW50KGVzYywgMTYpCisgICAgICAgICAgICB1bmkgPSBfZGVjb2RlX3VYWFhYKHMsIGVuZCkKKyAgICAgICAgICAgIGVuZCArPSA1CiAgICAgICAgICAgICAjIENoZWNrIGZvciBzdXJyb2dhdGUgcGFpciBvbiBVQ1MtNCBzeXN0ZW1zCi0gICAgICAgICAgICBpZiAweGQ4MDAgPD0gdW5pIDw9IDB4ZGJmZiBhbmQgc3lzLm1heHVuaWNvZGUgPiA2NTUzNToKLSAgICAgICAgICAgICAgICBtc2cgPSAiSW52YWxpZCBcXHVYWFhYXFx1WFhYWCBzdXJyb2dhdGUgcGFpciIKLSAgICAgICAgICAgICAgICBpZiBub3Qgc1tlbmQgKyA1OmVuZCArIDddID09ICdcXHUnOgotICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGVycm1zZyhtc2csIHMsIGVuZCkpCi0gICAgICAgICAgICAgICAgZXNjMiA9IHNbZW5kICsgNzplbmQgKyAxMV0KLSAgICAgICAgICAgICAgICBpZiBsZW4oZXNjMikgIT0gNDoKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihlcnJtc2cobXNnLCBzLCBlbmQpKQotICAgICAgICAgICAgICAgIHVuaTIgPSBpbnQoZXNjMiwgMTYpCi0gICAgICAgICAgICAgICAgdW5pID0gMHgxMDAwMCArICgoKHVuaSAtIDB4ZDgwMCkgPDwgMTApIHwgKHVuaTIgLSAweGRjMDApKQotICAgICAgICAgICAgICAgIG5leHRfZW5kICs9IDYKKyAgICAgICAgICAgIGlmIHN5cy5tYXh1bmljb2RlID4gNjU1MzUgYW5kIFwKKyAgICAgICAgICAgICAgIDB4ZDgwMCA8PSB1bmkgPD0gMHhkYmZmIGFuZCBzW2VuZDplbmQgKyAyXSA9PSAnXFx1JzoKKyAgICAgICAgICAgICAgICB1bmkyID0gX2RlY29kZV91WFhYWChzLCBlbmQgKyAxKQorICAgICAgICAgICAgICAgIGlmIDB4ZGMwMCA8PSB1bmkyIDw9IDB4ZGZmZjoKKyAgICAgICAgICAgICAgICAgICAgdW5pID0gMHgxMDAwMCArICgoKHVuaSAtIDB4ZDgwMCkgPDwgMTApIHwgKHVuaTIgLSAweGRjMDApKQorICAgICAgICAgICAgICAgICAgICBlbmQgKz0gNgogICAgICAgICAgICAgY2hhciA9IHVuaWNocih1bmkpCi0gICAgICAgICAgICBlbmQgPSBuZXh0X2VuZAogICAgICAgICAjIEFwcGVuZCB0aGUgdW5lc2NhcGVkIGNoYXJhY3RlcgogICAgICAgICBfYXBwZW5kKGNoYXIpCiAgICAgcmV0dXJuIHUnJy5qb2luKGNodW5rcyksIGVuZApAQCAtMTYzLDEzICsxNjQsMTQgQEAKICAgICAgICAgaWYgbmV4dGNoYXIgPT0gJ30nOgogICAgICAgICAgICAgaWYgb2JqZWN0X3BhaXJzX2hvb2sgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gb2JqZWN0X3BhaXJzX2hvb2socGFpcnMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCwgZW5kCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCwgZW5kICsgMQogICAgICAgICAgICAgcGFpcnMgPSB7fQogICAgICAgICAgICAgaWYgb2JqZWN0X2hvb2sgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgcGFpcnMgPSBvYmplY3RfaG9vayhwYWlycykKICAgICAgICAgICAgIHJldHVybiBwYWlycywgZW5kICsgMQogICAgICAgICBlbGlmIG5leHRjaGFyICE9ICciJzoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZXJybXNnKCJFeHBlY3RpbmcgcHJvcGVydHkgbmFtZSIsIHMsIGVuZCkpCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGVycm1zZygKKyAgICAgICAgICAgICAgICAiRXhwZWN0aW5nIHByb3BlcnR5IG5hbWUgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3RlcyIsIHMsIGVuZCkpCiAgICAgZW5kICs9IDEKICAgICB3aGlsZSBUcnVlOgogICAgICAgICBrZXksIGVuZCA9IHNjYW5zdHJpbmcocywgZW5kLCBlbmNvZGluZywgc3RyaWN0KQpAQCAtMTc5LDggKzE4MSw3IEBACiAgICAgICAgIGlmIHNbZW5kOmVuZCArIDFdICE9ICc6JzoKICAgICAgICAgICAgIGVuZCA9IF93KHMsIGVuZCkuZW5kKCkKICAgICAgICAgICAgIGlmIHNbZW5kOmVuZCArIDFdICE9ICc6JzoKLSAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGVycm1zZygiRXhwZWN0aW5nIDogZGVsaW1pdGVyIiwgcywgZW5kKSkKLQorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZXJybXNnKCJFeHBlY3RpbmcgJzonIGRlbGltaXRlciIsIHMsIGVuZCkpCiAgICAgICAgIGVuZCArPSAxCiAKICAgICAgICAgdHJ5OgpAQCAtMjA5LDcgKzIxMCw3IEBACiAgICAgICAgIGlmIG5leHRjaGFyID09ICd9JzoKICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgIGVsaWYgbmV4dGNoYXIgIT0gJywnOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihlcnJtc2coIkV4cGVjdGluZyAsIGRlbGltaXRlciIsIHMsIGVuZCAtIDEpKQorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihlcnJtc2coIkV4cGVjdGluZyAnLCcgZGVsaW1pdGVyIiwgcywgZW5kIC0gMSkpCiAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgbmV4dGNoYXIgPSBzW2VuZF0KQEAgLTIyNCw4ICsyMjUsOCBAQAogCiAgICAgICAgIGVuZCArPSAxCiAgICAgICAgIGlmIG5leHRjaGFyICE9ICciJzoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZXJybXNnKCJFeHBlY3RpbmcgcHJvcGVydHkgbmFtZSIsIHMsIGVuZCAtIDEpKQotCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGVycm1zZygKKyAgICAgICAgICAgICAgICAiRXhwZWN0aW5nIHByb3BlcnR5IG5hbWUgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3RlcyIsIHMsIGVuZCAtIDEpKQogICAgIGlmIG9iamVjdF9wYWlyc19ob29rIGlzIG5vdCBOb25lOgogICAgICAgICByZXN1bHQgPSBvYmplY3RfcGFpcnNfaG9vayhwYWlycykKICAgICAgICAgcmV0dXJuIHJlc3VsdCwgZW5kCkBAIC0yNTksOCArMjYwLDcgQEAKICAgICAgICAgaWYgbmV4dGNoYXIgPT0gJ10nOgogICAgICAgICAgICAgYnJlYWsKICAgICAgICAgZWxpZiBuZXh0Y2hhciAhPSAnLCc6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGVycm1zZygiRXhwZWN0aW5nICwgZGVsaW1pdGVyIiwgcywgZW5kKSkKLQorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihlcnJtc2coIkV4cGVjdGluZyAnLCcgZGVsaW1pdGVyIiwgcywgZW5kKSkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaWYgc1tlbmRdIGluIF93czoKICAgICAgICAgICAgICAgICBlbmQgKz0gMQpkaWZmIC0tZ2l0IGEvTGliL2pzb24vZW5jb2Rlci5weSBiL0xpYi9qc29uL2VuY29kZXIucHkKaW5kZXggOTA2YzQ2Mi4uZjVlZWVkNyAxMDA2NDQKLS0tIGEvTGliL2pzb24vZW5jb2Rlci5weQorKysgYi9MaWIvanNvbi9lbmNvZGVyLnB5CkBAIC0yNyw4ICsyNyw3IEBACiAgICAgRVNDQVBFX0RDVC5zZXRkZWZhdWx0KGNocihpKSwgJ1xcdXswOjA0eH0nLmZvcm1hdChpKSkKICAgICAjRVNDQVBFX0RDVC5zZXRkZWZhdWx0KGNocihpKSwgJ1xcdSUwNHgnICUgKGksKSkKIAotIyBBc3N1bWUgdGhpcyBwcm9kdWNlcyBhbiBpbmZpbml0eSBvbiBhbGwgbWFjaGluZXMgKHByb2JhYmx5IG5vdCBndWFyYW50ZWVkKQotSU5GSU5JVFkgPSBmbG9hdCgnMWU2NjY2NicpCitJTkZJTklUWSA9IGZsb2F0KCdpbmYnKQogRkxPQVRfUkVQUiA9IHJlcHIKIAogZGVmIGVuY29kZV9iYXNlc3RyaW5nKHMpOgpAQCAtMTA4LDkgKzEwNywxMiBAQAogICAgICAgICBlbmNvZGluZyBvZiBrZXlzIHRoYXQgYXJlIG5vdCBzdHIsIGludCwgbG9uZywgZmxvYXQgb3IgTm9uZS4gIElmCiAgICAgICAgIHNraXBrZXlzIGlzIFRydWUsIHN1Y2ggaXRlbXMgYXJlIHNpbXBseSBza2lwcGVkLgogCi0gICAgICAgIElmIGVuc3VyZV9hc2NpaSBpcyB0cnVlLCB0aGUgb3V0cHV0IGlzIGd1YXJhbnRlZWQgdG8gYmUgc3RyCi0gICAgICAgIG9iamVjdHMgd2l0aCBhbGwgaW5jb21pbmcgdW5pY29kZSBjaGFyYWN0ZXJzIGVzY2FwZWQuICBJZgotICAgICAgICBlbnN1cmVfYXNjaWkgaXMgZmFsc2UsIHRoZSBvdXRwdXQgd2lsbCBiZSB1bmljb2RlIG9iamVjdC4KKyAgICAgICAgSWYgKmVuc3VyZV9hc2NpaSogaXMgdHJ1ZSAodGhlIGRlZmF1bHQpLCBhbGwgbm9uLUFTQ0lJCisgICAgICAgIGNoYXJhY3RlcnMgaW4gdGhlIG91dHB1dCBhcmUgZXNjYXBlZCB3aXRoIFx1WFhYWCBzZXF1ZW5jZXMsCisgICAgICAgIGFuZCB0aGUgcmVzdWx0cyBhcmUgc3RyIGluc3RhbmNlcyBjb25zaXN0aW5nIG9mIEFTQ0lJCisgICAgICAgIGNoYXJhY3RlcnMgb25seS4gIElmIGVuc3VyZV9hc2NpaSBpcyBGYWxzZSwgYSByZXN1bHQgbWF5IGJlIGEKKyAgICAgICAgdW5pY29kZSBpbnN0YW5jZS4gIFRoaXMgdXN1YWxseSBoYXBwZW5zIGlmIHRoZSBpbnB1dCBjb250YWlucworICAgICAgICB1bmljb2RlIHN0cmluZ3Mgb3IgdGhlICplbmNvZGluZyogcGFyYW1ldGVyIGlzIHVzZWQuCiAKICAgICAgICAgSWYgY2hlY2tfY2lyY3VsYXIgaXMgdHJ1ZSwgdGhlbiBsaXN0cywgZGljdHMsIGFuZCBjdXN0b20gZW5jb2RlZAogICAgICAgICBvYmplY3RzIHdpbGwgYmUgY2hlY2tlZCBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcyBkdXJpbmcgZW5jb2RpbmcgdG8KQEAgLTEyOSw3ICsxMzEsMTAgQEAKICAgICAgICAgSWYgaW5kZW50IGlzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIsIHRoZW4gSlNPTiBhcnJheQogICAgICAgICBlbGVtZW50cyBhbmQgb2JqZWN0IG1lbWJlcnMgd2lsbCBiZSBwcmV0dHktcHJpbnRlZCB3aXRoIHRoYXQKICAgICAgICAgaW5kZW50IGxldmVsLiAgQW4gaW5kZW50IGxldmVsIG9mIDAgd2lsbCBvbmx5IGluc2VydCBuZXdsaW5lcy4KLSAgICAgICAgTm9uZSBpcyB0aGUgbW9zdCBjb21wYWN0IHJlcHJlc2VudGF0aW9uLgorICAgICAgICBOb25lIGlzIHRoZSBtb3N0IGNvbXBhY3QgcmVwcmVzZW50YXRpb24uICBTaW5jZSB0aGUgZGVmYXVsdAorICAgICAgICBpdGVtIHNlcGFyYXRvciBpcyAnLCAnLCAgdGhlIG91dHB1dCBtaWdodCBpbmNsdWRlIHRyYWlsaW5nCisgICAgICAgIHdoaXRlc3BhY2Ugd2hlbiBpbmRlbnQgaXMgc3BlY2lmaWVkLiAgWW91IGNhbiB1c2UKKyAgICAgICAgc2VwYXJhdG9ycz0oJywnLCAnOiAnKSB0byBhdm9pZCB0aGlzLgogCiAgICAgICAgIElmIHNwZWNpZmllZCwgc2VwYXJhdG9ycyBzaG91bGQgYmUgYSAoaXRlbV9zZXBhcmF0b3IsIGtleV9zZXBhcmF0b3IpCiAgICAgICAgIHR1cGxlLiAgVGhlIGRlZmF1bHQgaXMgKCcsICcsICc6ICcpLiAgVG8gZ2V0IHRoZSBtb3N0IGNvbXBhY3QgSlNPTgpAQCAtMTcyLDYgKzE3Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGlzdChpdGVyYWJsZSkKKyAgICAgICAgICAgICAgICAjIExldCB0aGUgYmFzZSBjbGFzcyBkZWZhdWx0IG1ldGhvZCByYWlzZSB0aGUgVHlwZUVycm9yCiAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT05FbmNvZGVyLmRlZmF1bHQoc2VsZiwgbykKIAogICAgICAgICAiIiIKZGlmZiAtLWdpdCBhL0xpYi9qc29uL3Rlc3RzL3Rlc3RfZGVjb2RlLnB5IGIvTGliL2pzb24vdGVzdHMvdGVzdF9kZWNvZGUucHkKaW5kZXggYWE4YmJlOS4uNzhkN2ZiYiAxMDA2NDQKLS0tIGEvTGliL2pzb24vdGVzdHMvdGVzdF9kZWNvZGUucHkKKysrIGIvTGliL2pzb24vdGVzdHMvdGVzdF9kZWNvZGUucHkKQEAgLTQwLDExICs0MCwzMCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9kLCBPcmRlcmVkRGljdChwKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKG9kKSwgT3JkZXJlZERpY3QpCiAgICAgICAgICMgdGhlIG9iamVjdF9wYWlyc19ob29rIHRha2VzIHByaW9yaXR5IG92ZXIgdGhlIG9iamVjdF9ob29rCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2FkcyhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3BhaXJzX2hvb2s9T3JkZXJlZERpY3QsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2FkcyhzLCBvYmplY3RfcGFpcnNfaG9vaz1PcmRlcmVkRGljdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9ob29rPWxhbWJkYSB4OiBOb25lKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBPcmRlcmVkRGljdChwKSkKKyAgICAgICAgIyBjaGVjayB0aGF0IGVtcHR5IG9iamVjdHMgbGl0ZXJhbHMgd29yayAoc2VlICMxNzM2OCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxvYWRzKCd7fScsIG9iamVjdF9wYWlyc19ob29rPU9yZGVyZWREaWN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcmRlcmVkRGljdCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubG9hZHMoJ3siZW1wdHkiOiB7fX0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3BhaXJzX2hvb2s9T3JkZXJlZERpY3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9yZGVyZWREaWN0KFsoJ2VtcHR5JywgT3JkZXJlZERpY3QoKSldKSkKIAorICAgIGRlZiB0ZXN0X2V4dHJhX2RhdGEoc2VsZik6CisgICAgICAgIHMgPSAnWzEsIDIsIDNdNScKKyAgICAgICAgbXNnID0gJ0V4dHJhIGRhdGEnCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFZhbHVlRXJyb3IsIG1zZywgc2VsZi5sb2FkcywgcykKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfZXNjYXBlKHNlbGYpOgorICAgICAgICBzID0gJ1siYWJjXFx5Il0nCisgICAgICAgIG1zZyA9ICdlc2NhcGUnCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFZhbHVlRXJyb3IsIG1zZywgc2VsZi5sb2FkcywgcykKKworICAgIGRlZiB0ZXN0X25lZ2F0aXZlX2luZGV4KHNlbGYpOgorICAgICAgICBkID0gc2VsZi5qc29uLkpTT05EZWNvZGVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZC5yYXdfZGVjb2RlLCAnYScqNDIsIC01MDAwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZC5yYXdfZGVjb2RlLCB1J2EnKjQyLCAtNTAwMDApCiAKIGNsYXNzIFRlc3RQeURlY29kZShUZXN0RGVjb2RlLCBQeVRlc3QpOiBwYXNzCiBjbGFzcyBUZXN0Q0RlY29kZShUZXN0RGVjb2RlLCBDVGVzdCk6IHBhc3MKZGlmZiAtLWdpdCBhL0xpYi9qc29uL3Rlc3RzL3Rlc3RfZHVtcC5weSBiL0xpYi9qc29uL3Rlc3RzL3Rlc3RfZHVtcC5weQppbmRleCA5YTdjOGNjLi5jZDkyNTY5IDEwMDY0NAotLS0gYS9MaWIvanNvbi90ZXN0cy90ZXN0X2R1bXAucHkKKysrIGIvTGliL2pzb24vdGVzdHMvdGVzdF9kdW1wLnB5CkBAIC0xOSw1ICsxOSwxNCBAQAogICAgICAgICAgICAgICAgIHsyOiAzLjAsIDQuMDogNUwsIEZhbHNlOiAxLCA2TDogVHJ1ZX0sIHNvcnRfa2V5cz1UcnVlKSwKICAgICAgICAgICAgICAgICAneyJmYWxzZSI6IDEsICIyIjogMy4wLCAiNC4wIjogNSwgIjYiOiB0cnVlfScpCiAKKyAgICAjIElzc3VlIDE2MjI4OiBDcmFzaCBvbiBlbmNvZGluZyByZXNpemVkIGxpc3QKKyAgICBkZWYgdGVzdF9lbmNvZGVfbXV0YXRlZChzZWxmKToKKyAgICAgICAgYSA9IFtvYmplY3QoKV0gKiAxMAorICAgICAgICBkZWYgY3Jhc2hlcihvYmopOgorICAgICAgICAgICAgZGVsIGFbLTFdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kdW1wcyhhLCBkZWZhdWx0PWNyYXNoZXIpLAorICAgICAgICAgICAgICAgICAnW251bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGxdJykKKworCiBjbGFzcyBUZXN0UHlEdW1wKFRlc3REdW1wLCBQeVRlc3QpOiBwYXNzCiBjbGFzcyBUZXN0Q0R1bXAoVGVzdER1bXAsIENUZXN0KTogcGFzcwpkaWZmIC0tZ2l0IGEvTGliL2pzb24vdGVzdHMvdGVzdF9mYWlsLnB5IGIvTGliL2pzb24vdGVzdHMvdGVzdF9mYWlsLnB5CmluZGV4IGFlOTYyYzguLmUzMWIzNzkgMTAwNjQ0Ci0tLSBhL0xpYi9qc29uL3Rlc3RzL3Rlc3RfZmFpbC5weQorKysgYi9MaWIvanNvbi90ZXN0cy90ZXN0X2ZhaWwucHkKQEAgLTEsMTMgKzEsMTMgQEAKIGZyb20ganNvbi50ZXN0cyBpbXBvcnQgUHlUZXN0LCBDVGVzdAogCi0jIEZyaSBEZWMgMzAgMTg6NTc6MjYgMjAwNQorIyAyMDA3LTEwLTA1CiBKU09ORE9DUyA9IFsKICAgICAjIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9mYWlsMS5qc29uCiAgICAgJyJBIEpTT04gcGF5bG9hZCBzaG91bGQgYmUgYW4gb2JqZWN0IG9yIGFycmF5LCBub3QgYSBzdHJpbmcuIicsCiAgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDIuanNvbgogICAgICdbIlVuY2xvc2VkIGFycmF5IicsCiAgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDMuanNvbgotICAgICd7dW5xdW90ZWRfa2V5OiAia2V5cyBtdXN0IGJlIHF1b3RlZH0nLAorICAgICd7dW5xdW90ZWRfa2V5OiAia2V5cyBtdXN0IGJlIHF1b3RlZCJ9JywKICAgICAjIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9mYWlsNC5qc29uCiAgICAgJ1siZXh0cmEgY29tbWEiLF0nLAogICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWw1Lmpzb24KQEAgLTMzLDcgKzMzLDcgQEAKICAgICAjIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9mYWlsMTUuanNvbgogICAgICdbIklsbGVnYWwgYmFja3NsYXNoIGVzY2FwZTogXFx4MTUiXScsCiAgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDE2Lmpzb24KLSAgICAnWyJJbGxlZ2FsIGJhY2tzbGFzaCBlc2NhcGU6IFxcXCciXScsCisgICAgJ1tcXG5ha2VkXScsCiAgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDE3Lmpzb24KICAgICAnWyJJbGxlZ2FsIGJhY2tzbGFzaCBlc2NhcGU6IFxcMDE3Il0nLAogICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWwxOC5qc29uCkBAIC01MCw2ICs1MCwyNCBAQAogICAgICdbIkJhZCB2YWx1ZSIsIHRydXRoXScsCiAgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDI0Lmpzb24KICAgICAiWydzaW5nbGUgcXVvdGUnXSIsCisgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDI1Lmpzb24KKyAgICAnWyJcdHRhYlx0Y2hhcmFjdGVyXHRpblx0c3RyaW5nXHQiXScsCisgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDI2Lmpzb24KKyAgICAnWyJ0YWJcXCAgIGNoYXJhY3RlclxcICAgaW5cXCAgc3RyaW5nXFwgICJdJywKKyAgICAjIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9mYWlsMjcuanNvbgorICAgICdbImxpbmVcbmJyZWFrIl0nLAorICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWwyOC5qc29uCisgICAgJ1sibGluZVxcXG5icmVhayJdJywKKyAgICAjIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9mYWlsMjkuanNvbgorICAgICdbMGVdJywKKyAgICAjIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9mYWlsMzAuanNvbgorICAgICdbMGUrXScsCisgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDMxLmpzb24KKyAgICAnWzBlKy0xXScsCisgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDMyLmpzb24KKyAgICAneyJDb21tYSBpbnN0ZWFkIGlmIGNsb3NpbmcgYnJhY2UiOiB0cnVlLCcsCisgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDMzLmpzb24KKyAgICAnWyJtaXNtYXRjaCJ9JywKICAgICAjIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9zaW1wbGVqc29uL2lzc3Vlcy9kZXRhaWw/aWQ9MwogICAgIHUnWyJBXHUwMDFGWiBjb250cm9sIGNoYXJhY3RlcnMgaW4gc3RyaW5nIl0nLAogXQpkaWZmIC0tZ2l0IGEvTGliL2pzb24vdGVzdHMvdGVzdF9mbG9hdC5weSBiL0xpYi9qc29uL3Rlc3RzL3Rlc3RfZmxvYXQucHkKaW5kZXggMTJkMzUwNy4uMDQ5ZjlhZSAxMDA2NDQKLS0tIGEvTGliL2pzb24vdGVzdHMvdGVzdF9mbG9hdC5weQorKysgYi9MaWIvanNvbi90ZXN0cy90ZXN0X2Zsb2F0LnB5CkBAIC0xNyw2ICsxNywyMSBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxvYWRzKHNlbGYuZHVtcHMobnVtKSksIG51bSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2Fkcyh1bmljb2RlKHNlbGYuZHVtcHMobnVtKSkpLCBudW0pCiAKKyAgICBkZWYgdGVzdF9vdXRfb2ZfcmFuZ2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2FkcygnWzIzNDU2Nzg5MDEyRTY2Nl0nKSwgW2Zsb2F0KCdpbmYnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2FkcygnWy0yMzQ1Njc4OTAxMkU2NjZdJyksIFtmbG9hdCgnLWluZicpXSkKKworICAgIGRlZiB0ZXN0X2FsbG93X25hbihzZWxmKToKKyAgICAgICAgZm9yIHZhbCBpbiAoZmxvYXQoJ2luZicpLCBmbG9hdCgnLWluZicpLCBmbG9hdCgnbmFuJykpOgorICAgICAgICAgICAgb3V0ID0gc2VsZi5kdW1wcyhbdmFsXSkKKyAgICAgICAgICAgIGlmIHZhbCA9PSB2YWw6ICAjIGluZgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2FkcyhvdXQpLCBbdmFsXSkKKyAgICAgICAgICAgIGVsc2U6ICAjIG5hbgorICAgICAgICAgICAgICAgIHJlcyA9IHNlbGYubG9hZHMob3V0KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDEpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyZXNbMF0sIHJlc1swXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuZHVtcHMsIFt2YWxdLCBhbGxvd19uYW49RmFsc2UpCisKIAogY2xhc3MgVGVzdFB5RmxvYXQoVGVzdEZsb2F0LCBQeVRlc3QpOiBwYXNzCiBjbGFzcyBUZXN0Q0Zsb2F0KFRlc3RGbG9hdCwgQ1Rlc3QpOiBwYXNzCmRpZmYgLS1naXQgYS9MaWIvanNvbi90ZXN0cy90ZXN0X3Bhc3MxLnB5IGIvTGliL2pzb24vdGVzdHMvdGVzdF9wYXNzMS5weQppbmRleCA4MmQ3MTU0Li5kZjgyNTliIDEwMDY0NAotLS0gYS9MaWIvanNvbi90ZXN0cy90ZXN0X3Bhc3MxLnB5CisrKyBiL0xpYi9qc29uL3Rlc3RzL3Rlc3RfcGFzczEucHkKQEAgLTE3LDcgKzE3LDcgQEAKICAgICAgICAgInJlYWwiOiAtOTg3Ni41NDMyMTAsCiAgICAgICAgICJlIjogMC4xMjM0NTY3ODllLTEyLAogICAgICAgICAiRSI6IDEuMjM0NTY3ODkwRSszNCwKLSAgICAgICAgIiI6ICAyMzQ1Njc4OTAxMkU2NjYsCisgICAgICAgICIiOiAgMjM0NTY3ODkwMTJFNjYsCiAgICAgICAgICJ6ZXJvIjogMCwKICAgICAgICAgIm9uZSI6IDEsCiAgICAgICAgICJzcGFjZSI6ICIgIiwKQEAgLTI4LDYgKzI4LDcgQEAKICAgICAgICAgImFscGhhIjogImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eXoiLAogICAgICAgICAiQUxQSEEiOiAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldZWiIsCiAgICAgICAgICJkaWdpdCI6ICIwMTIzNDU2Nzg5IiwKKyAgICAgICAgIjAxMjM0NTY3ODkiOiAiZGlnaXQiLAogICAgICAgICAic3BlY2lhbCI6ICJgMX4hQCMkJV4mKigpXystPXsnOlssXX18Oy48Lz4/IiwKICAgICAgICAgImhleCI6ICJcdTAxMjNcdTQ1NjdcdTg5QUJcdUNERUZcdWFiY2RcdWVmNEEiLAogICAgICAgICAidHJ1ZSI6IHRydWUsCkBAIC00Myw4ICs0NCw3IEBACiAKICwKIAotNCAsIDUgICAgICAgICwgICAgICAgICAgNiAgICAgICAgICAgLDcgICAgICAgIF0sCi0gICAgICAgICJjb21wYWN0IjogWzEsMiwzLDQsNSw2LDddLAorNCAsIDUgICAgICAgICwgICAgICAgICAgNiAgICAgICAgICAgLDcgICAgICAgIF0sImNvbXBhY3QiOlsxLDIsMyw0LDUsNiw3XSwKICAgICAgICAgImpzb250ZXh0IjogIntcIm9iamVjdCB3aXRoIDEgbWVtYmVyXCI6W1wiYXJyYXkgd2l0aCAxIGVsZW1lbnRcIl19IiwKICAgICAgICAgInF1b3RlcyI6ICImIzM0OyBcdTAwMjIgJTIyIDB4MjIgMDM0ICYjeDIyOyIsCiAgICAgICAgICJcL1xcXCJcdUNBRkVcdUJBQkVcdUFCOThcdUZDREVcdWJjZGFcdWVmNEFcYlxmXG5cclx0YDF+IUAjJCVeJiooKV8rLT1bXXt9fDs6JywuLzw+PyIKQEAgLTU1LDkgKzU1LDExIEBACiA5OS40NAogLAogCi0xMDY2Ci0KLQorMTA2NiwKKzFlMSwKKzAuMWUxLAorMWUtMSwKKzFlMDAsMmUrMDAsMmUtMDAKICwicm9zZWJ1ZCJdCiAnJycKIApAQCAtNjcsMTIgKzY5LDYgQEAKICAgICAgICAgcmVzID0gc2VsZi5sb2FkcyhKU09OKQogICAgICAgICBvdXQgPSBzZWxmLmR1bXBzKHJlcykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIHNlbGYubG9hZHMob3V0KSkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5kdW1wcyhyZXMsIGFsbG93X25hbj1GYWxzZSkKLSAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmZhaWwoIjIzNDU2Nzg5MDEyRTY2NiBzaG91bGQgYmUgb3V0IG9mIHJhbmdlIikKIAogCiBjbGFzcyBUZXN0UHlQYXNzMShUZXN0UGFzczEsIFB5VGVzdCk6IHBhc3MKZGlmZiAtLWdpdCBhL0xpYi9qc29uL3Rlc3RzL3Rlc3Rfc2NhbnN0cmluZy5weSBiL0xpYi9qc29uL3Rlc3RzL3Rlc3Rfc2NhbnN0cmluZy5weQppbmRleCA0ZmVmOGNiLi5lZDgwYTQxIDEwMDY0NAotLS0gYS9MaWIvanNvbi90ZXN0cy90ZXN0X3NjYW5zdHJpbmcucHkKKysrIGIvTGliL2pzb24vdGVzdHMvdGVzdF9zY2Fuc3RyaW5nLnB5CkBAIC01LDEwICs1LDYgQEAKIGNsYXNzIFRlc3RTY2Fuc3RyaW5nKG9iamVjdCk6CiAgICAgZGVmIHRlc3Rfc2NhbnN0cmluZyhzZWxmKToKICAgICAgICAgc2NhbnN0cmluZyA9IHNlbGYuanNvbi5kZWNvZGVyLnNjYW5zdHJpbmcKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgICAgIHNjYW5zdHJpbmcoJyJ6XFx1ZDgzNFxcdWRkMjB4IicsIDEsIE5vbmUsIFRydWUpLAotICAgICAgICAgICAgKHUnelxVMDAwMWQxMjB4JywgMTYpKQotCiAgICAgICAgIGlmIHN5cy5tYXh1bmljb2RlID09IDY1NTM1OgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgICAgICBzY2Fuc3RyaW5nKHUnInpcVTAwMDFkMTIweCInLCAxLCBOb25lLCBUcnVlKSwKQEAgLTk0LDYgKzkwLDU4IEBACiAgICAgICAgICAgICBzY2Fuc3RyaW5nKCdbIkJhZCB2YWx1ZSIsIHRydXRoXScsIDIsIE5vbmUsIFRydWUpLAogICAgICAgICAgICAgKHUnQmFkIHZhbHVlJywgMTIpKQogCisgICAgZGVmIHRlc3Rfc3Vycm9nYXRlcyhzZWxmKToKKyAgICAgICAgc2NhbnN0cmluZyA9IHNlbGYuanNvbi5kZWNvZGVyLnNjYW5zdHJpbmcKKyAgICAgICAgZGVmIGFzc2VydFNjYW4oZ2l2ZW4sIGV4cGVjdCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNjYW5zdHJpbmcoZ2l2ZW4sIDEsIE5vbmUsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXhwZWN0LCBsZW4oZ2l2ZW4pKSkKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGdpdmVuLCB1bmljb2RlKToKKyAgICAgICAgICAgICAgICBnaXZlbiA9IHVuaWNvZGUoZ2l2ZW4pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzY2Fuc3RyaW5nKGdpdmVuLCAxLCBOb25lLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleHBlY3QsIGxlbihnaXZlbikpKQorCisgICAgICAgIHN1cnJvZ2F0ZXMgPSB1bmljaHIoMHhkODM0KSArIHVuaWNocigweGRkMjApCisgICAgICAgIGFzc2VydFNjYW4oJyJ6XFx1ZDgzNFxcdTAwNzl4IicsIHUnelx1ZDgzNHl4JykKKyAgICAgICAgYXNzZXJ0U2NhbignInpcXHVkODM0XFx1ZGQyMHgiJywgdSd6XFUwMDAxZDEyMHgnKQorICAgICAgICBhc3NlcnRTY2FuKCcielxcdWQ4MzRcXHVkODM0XFx1ZGQyMHgiJywgdSd6XHVkODM0XFUwMDAxZDEyMHgnKQorICAgICAgICBhc3NlcnRTY2FuKCcielxcdWQ4MzR4IicsIHUnelx1ZDgzNHgnKQorICAgICAgICBhc3NlcnRTY2FuKHUnInpcXHVkODM0XHVkZDIweDEyMzQ1IicsIHUneiVzeDEyMzQ1JyAlIHN1cnJvZ2F0ZXMpCisgICAgICAgIGFzc2VydFNjYW4oJyJ6XFx1ZGQyMHgiJywgdSd6XHVkZDIweCcpCisgICAgICAgIGFzc2VydFNjYW4odScielx1ZDgzNFx1ZGQyMHgiJywgdSd6XHVkODM0XHVkZDIweCcpCisgICAgICAgIGFzc2VydFNjYW4odScielx1ZDgzNFxcdWRkMjB4IicsIHUneiVzeCcgJSBzdXJyb2dhdGVzKQorICAgICAgICBhc3NlcnRTY2FuKHUnInpcdWQ4MzR4IicsIHUnelx1ZDgzNHgnKQorCisgICAgZGVmIHRlc3RfYmFkX2VzY2FwZXMoc2VsZik6CisgICAgICAgIHNjYW5zdHJpbmcgPSBzZWxmLmpzb24uZGVjb2Rlci5zY2Fuc3RyaW5nCisgICAgICAgIGJhZF9lc2NhcGVzID0gWworICAgICAgICAgICAgJyJcXCInLAorICAgICAgICAgICAgJyJcXHgiJywKKyAgICAgICAgICAgICciXFx1IicsCisgICAgICAgICAgICAnIlxcdTAiJywKKyAgICAgICAgICAgICciXFx1MDEiJywKKyAgICAgICAgICAgICciXFx1MDEyIicsCisgICAgICAgICAgICAnIlxcdXowMTIiJywKKyAgICAgICAgICAgICciXFx1MHoxMiInLAorICAgICAgICAgICAgJyJcXHUwMXoyIicsCisgICAgICAgICAgICAnIlxcdTAxMnoiJywKKyAgICAgICAgICAgICciXFx1MHgxMiInLAorICAgICAgICAgICAgJyJcXHUwWDEyIicsCisgICAgICAgICAgICAnIlxcdWQ4MzRcXCInLAorICAgICAgICAgICAgJyJcXHVkODM0XFx1IicsCisgICAgICAgICAgICAnIlxcdWQ4MzRcXHVkIicsCisgICAgICAgICAgICAnIlxcdWQ4MzRcXHVkZCInLAorICAgICAgICAgICAgJyJcXHVkODM0XFx1ZGQyIicsCisgICAgICAgICAgICAnIlxcdWQ4MzRcXHV6ZGQyIicsCisgICAgICAgICAgICAnIlxcdWQ4MzRcXHVkemQyIicsCisgICAgICAgICAgICAnIlxcdWQ4MzRcXHVkZHoyIicsCisgICAgICAgICAgICAnIlxcdWQ4MzRcXHVkZDJ6IicsCisgICAgICAgICAgICAnIlxcdWQ4MzRcXHUweDIwIicsCisgICAgICAgICAgICAnIlxcdWQ4MzRcXHUwWDIwIicsCisgICAgICAgIF0KKyAgICAgICAgZm9yIHMgaW4gYmFkX2VzY2FwZXM6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgICAgIHNjYW5zdHJpbmcocywgMSwgTm9uZSwgVHJ1ZSkKKwogICAgIGRlZiB0ZXN0X2lzc3VlMzYyMyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5qc29uLmRlY29kZXIuc2NhbnN0cmluZywgYiJ4eHgiLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAieHh4IikKZGlmZiAtLWdpdCBhL0xpYi9qc29uL3Rlc3RzL3Rlc3RfdG9vbC5weSBiL0xpYi9qc29uL3Rlc3RzL3Rlc3RfdG9vbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2RmYjg0Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2pzb24vdGVzdHMvdGVzdF90b29sLnB5CkBAIC0wLDAgKzEsNjkgQEAKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHRleHR3cmFwCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzdWJwcm9jZXNzCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSB0ZXN0LnNjcmlwdF9oZWxwZXIgaW1wb3J0IGFzc2VydF9weXRob25fb2sKKworY2xhc3MgVGVzdFRvb2wodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRhdGEgPSAiIiIKKworICAgICAgICBbWyJibG9ycGllIl0sWyAid2hvb3BzIiBdICwgWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcdCJkLXNodGFlb3UiLFxyImQtbnRoaW91aCIsCisgICAgICAgICJpLXZoYmpraG50aCIsIHsibmlmdHkiOjg3fSwgeyJtb3JlZmllbGQiIDpcdGZhbHNlLCJmaWVsZCIKKyAgICAgICAgICAgIDoieWVzIn0gIF0KKyAgICAgICAgICAgIiIiCisKKyAgICBleHBlY3QgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiXAorICAgIFsKKyAgICAgICAgWworICAgICAgICAgICAgImJsb3JwaWUiCisgICAgICAgIF0sCisgICAgICAgIFsKKyAgICAgICAgICAgICJ3aG9vcHMiCisgICAgICAgIF0sCisgICAgICAgIFtdLAorICAgICAgICAiZC1zaHRhZW91IiwKKyAgICAgICAgImQtbnRoaW91aCIsCisgICAgICAgICJpLXZoYmpraG50aCIsCisgICAgICAgIHsKKyAgICAgICAgICAgICJuaWZ0eSI6IDg3CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmaWVsZCI6ICJ5ZXMiLAorICAgICAgICAgICAgIm1vcmVmaWVsZCI6IGZhbHNlCisgICAgICAgIH0KKyAgICBdCisgICAgIiIiKQorCisgICAgZGVmIHRlc3Rfc3RkaW5fc3Rkb3V0KHNlbGYpOgorICAgICAgICBwcm9jID0gc3VicHJvY2Vzcy5Qb3BlbigKKyAgICAgICAgICAgICAgICAoc3lzLmV4ZWN1dGFibGUsICctbScsICdqc29uLnRvb2wnKSwKKyAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIG91dCwgZXJyID0gcHJvYy5jb21tdW5pY2F0ZShzZWxmLmRhdGEuZW5jb2RlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LnNwbGl0bGluZXMoKSwgc2VsZi5leHBlY3QuZW5jb2RlKCkuc3BsaXRsaW5lcygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyciwgTm9uZSkKKworICAgIGRlZiBfY3JlYXRlX2luZmlsZShzZWxmKToKKyAgICAgICAgaW5maWxlID0gdGVzdF9zdXBwb3J0LlRFU1RGTgorICAgICAgICB3aXRoIG9wZW4oaW5maWxlLCAidyIpIGFzIGZwOgorICAgICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKG9zLnJlbW92ZSwgaW5maWxlKQorICAgICAgICAgICAgZnAud3JpdGUoc2VsZi5kYXRhKQorICAgICAgICByZXR1cm4gaW5maWxlCisKKyAgICBkZWYgdGVzdF9pbmZpbGVfc3Rkb3V0KHNlbGYpOgorICAgICAgICBpbmZpbGUgPSBzZWxmLl9jcmVhdGVfaW5maWxlKCkKKyAgICAgICAgcmMsIG91dCwgZXJyID0gYXNzZXJ0X3B5dGhvbl9vaygnLW0nLCAnanNvbi50b29sJywgaW5maWxlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dC5zcGxpdGxpbmVzKCksIHNlbGYuZXhwZWN0LmVuY29kZSgpLnNwbGl0bGluZXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIsIGInJykKKworICAgIGRlZiB0ZXN0X2luZmlsZV9vdXRmaWxlKHNlbGYpOgorICAgICAgICBpbmZpbGUgPSBzZWxmLl9jcmVhdGVfaW5maWxlKCkKKyAgICAgICAgb3V0ZmlsZSA9IHRlc3Rfc3VwcG9ydC5URVNURk4gKyAnLm91dCcKKyAgICAgICAgcmMsIG91dCwgZXJyID0gYXNzZXJ0X3B5dGhvbl9vaygnLW0nLCAnanNvbi50b29sJywgaW5maWxlLCBvdXRmaWxlKQorICAgICAgICBzZWxmLmFkZENsZWFudXAob3MucmVtb3ZlLCBvdXRmaWxlKQorICAgICAgICB3aXRoIG9wZW4ob3V0ZmlsZSwgInIiKSBhcyBmcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnAucmVhZCgpLCBzZWxmLmV4cGVjdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXQsIGInJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIsIGInJykKZGlmZiAtLWdpdCBhL0xpYi9qc29uL3Rlc3RzL3Rlc3RfdW5pY29kZS5weSBiL0xpYi9qc29uL3Rlc3RzL3Rlc3RfdW5pY29kZS5weQppbmRleCAzMWNmMzg5Li5lOTBmMTU4IDEwMDY0NAotLS0gYS9MaWIvanNvbi90ZXN0cy90ZXN0X3VuaWNvZGUucHkKKysrIGIvTGliL2pzb24vdGVzdHMvdGVzdF91bmljb2RlLnB5CkBAIC04MCw2ICs4MCwxMCBAQAogICAgICAgICAjIElzc3VlIDEwMDM4LgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoc2VsZi5sb2FkcygnImZvbyInKSksIHVuaWNvZGUpCiAKKyAgICBkZWYgdGVzdF9iYWRfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFbmNvZGVFcnJvciwgc2VsZi5sb2FkcywgJyJhIicsIHUicmF0XHhlOSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5sb2FkcywgJyJhIicsIDEpCisKIAogY2xhc3MgVGVzdFB5VW5pY29kZShUZXN0VW5pY29kZSwgUHlUZXN0KTogcGFzcwogY2xhc3MgVGVzdENVbmljb2RlKFRlc3RVbmljb2RlLCBDVGVzdCk6IHBhc3MKZGlmZiAtLWdpdCBhL0xpYi9qc29uL3Rvb2wucHkgYi9MaWIvanNvbi90b29sLnB5CmluZGV4IGMzN2JiNzcuLmZjNWQ3NDkgMTAwNjQ0Ci0tLSBhL0xpYi9qc29uL3Rvb2wucHkKKysrIGIvTGliL2pzb24vdG9vbC5weQpAQCAtNyw3ICs3LDcgQEAKICAgICAgICAgImpzb24iOiAib2JqIgogICAgIH0KICAgICAkIGVjaG8gJ3sgMS4yOjMuNH0nIHwgcHl0aG9uIC1tIGpzb24udG9vbAotICAgIEV4cGVjdGluZyBwcm9wZXJ0eSBuYW1lOiBsaW5lIDEgY29sdW1uIDIgKGNoYXIgMikKKyAgICBFeHBlY3RpbmcgcHJvcGVydHkgbmFtZSBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzOiBsaW5lIDEgY29sdW1uIDMgKGNoYXIgMikKIAogIiIiCiBpbXBvcnQgc3lzCkBAIC0yNSwxMiArMjUsMTUgQEAKICAgICAgICAgb3V0ZmlsZSA9IG9wZW4oc3lzLmFyZ3ZbMl0sICd3YicpCiAgICAgZWxzZToKICAgICAgICAgcmFpc2UgU3lzdGVtRXhpdChzeXMuYXJndlswXSArICIgW2luZmlsZSBbb3V0ZmlsZV1dIikKLSAgICB0cnk6Ci0gICAgICAgIG9iaiA9IGpzb24ubG9hZChpbmZpbGUpCi0gICAgZXhjZXB0IFZhbHVlRXJyb3IsIGU6Ci0gICAgICAgIHJhaXNlIFN5c3RlbUV4aXQoZSkKLSAgICBqc29uLmR1bXAob2JqLCBvdXRmaWxlLCBzb3J0X2tleXM9VHJ1ZSwgaW5kZW50PTQpCi0gICAgb3V0ZmlsZS53cml0ZSgnXG4nKQorICAgIHdpdGggaW5maWxlOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvYmogPSBqc29uLmxvYWQoaW5maWxlKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvciwgZToKKyAgICAgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQoZSkKKyAgICB3aXRoIG91dGZpbGU6CisgICAgICAgIGpzb24uZHVtcChvYmosIG91dGZpbGUsIHNvcnRfa2V5cz1UcnVlLAorICAgICAgICAgICAgICAgICAgaW5kZW50PTQsIHNlcGFyYXRvcnM9KCcsJywgJzogJykpCisgICAgICAgIG91dGZpbGUud3JpdGUoJ1xuJykKIAogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgpkaWZmIC0tZ2l0IGEvTGliL2tleXdvcmQucHkgYi9MaWIva2V5d29yZC5weQppbmRleCA4ZWIyODYwLi42OTc5NGJkIDEwMDc1NQotLS0gYS9MaWIva2V5d29yZC5weQorKysgYi9MaWIva2V5d29yZC5weQpAQCAtNyw3ICs3LDcgQEAKIFRvIHVwZGF0ZSB0aGUgc3ltYm9scyBpbiB0aGlzIGZpbGUsICdjZCcgdG8gdGhlIHRvcCBkaXJlY3Rvcnkgb2YKIHRoZSBweXRob24gc291cmNlIHRyZWUgYWZ0ZXIgYnVpbGRpbmcgdGhlIGludGVycHJldGVyIGFuZCBydW46CiAKLSAgICBweXRob24gTGliL2tleXdvcmQucHkKKyAgICAuL3B5dGhvbiBMaWIva2V5d29yZC5weQogIiIiCiAKIF9fYWxsX18gPSBbImlza2V5d29yZCIsICJrd2xpc3QiXQpkaWZmIC0tZ2l0IGEvTGliL2xpYi10ay9UaXgucHkgYi9MaWIvbGliLXRrL1RpeC5weQppbmRleCBkNDc0MjM1Li4xZjI4ZTU2IDEwMDY0NAotLS0gYS9MaWIvbGliLXRrL1RpeC5weQorKysgYi9MaWIvbGliLXRrL1RpeC5weQpAQCAtMTIyLDEzICsxMjIsOSBAQAogICAgICAgICBlbGlmIGNuZjoKICAgICAgICAgICAgIGNuZiA9IF9jbmZtZXJnZShjbmYpCiAgICAgICAgIGlmIGNuZiBpcyBOb25lOgotICAgICAgICAgICAgY25mID0ge30KLSAgICAgICAgICAgIGZvciB4IGluIHNlbGYudGsuc3BsaXQoc2VsZi50ay5jYWxsKCd0aXgnLCAnY29uZmlndXJlJykpOgotICAgICAgICAgICAgICAgIGNuZlt4WzBdWzE6XV0gPSAoeFswXVsxOl0sKSArIHhbMTpdCi0gICAgICAgICAgICByZXR1cm4gY25mCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0Y29uZmlndXJlKCd0aXgnLCAnY29uZmlndXJlJykKICAgICAgICAgaWYgaXNpbnN0YW5jZShjbmYsIFN0cmluZ1R5cGUpOgotICAgICAgICAgICAgeCA9IHNlbGYudGsuc3BsaXQoc2VsZi50ay5jYWxsKCd0aXgnLCAnY29uZmlndXJlJywgJy0nK2NuZikpCi0gICAgICAgICAgICByZXR1cm4gKHhbMF1bMTpdLCkgKyB4WzE6XQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldGNvbmZpZ3VyZTEoJ3RpeCcsICdjb25maWd1cmUnLCAnLScrY25mKQogICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCgndGl4JywgJ2NvbmZpZ3VyZScpICsgc2VsZi5fb3B0aW9ucyhjbmYpKQogCiAgICAgZGVmIHRpeF9maWxlZGlhbG9nKHNlbGYsIGRsZ2NsYXNzPU5vbmUpOgpAQCAtMzgwLDcgKzM3Niw3IEBACiAgICAgICAgICIiIlJldHVybiB0aGUgbmFtZSBvZiBhbGwgc3Vid2lkZ2V0cy4iIiIKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgeCA9IHNlbGYudGsuY2FsbChzZWxmLl93LCAnc3Vid2lkZ2V0cycsICctYWxsJykKLSAgICAgICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0KHgpCisgICAgICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdGxpc3QoeCkKICAgICAgICAgZXhjZXB0IFRjbEVycm9yOgogICAgICAgICAgICAgcmV0dXJuIE5vbmUKIApAQCAtNDczLDEzICs0NjksNiBAQAogICAgICAgICAgICAgc2VsZi50ay5jYWxsKCdkZXN0cm95Jywgc2VsZi5fdykKIAogCi0jIFVzZWZ1bCBmdW5jLiB0byBzcGxpdCBUY2wgbGlzdHMgYW5kIHJldHVybiBhcyBhIGRpY3QuIEZyb20gVGtpbnRlci5weQotZGVmIF9sc3QyZGljdChsc3QpOgotICAgIGRpY3QgPSB7fQotICAgIGZvciB4IGluIGxzdDoKLSAgICAgICAgZGljdFt4WzBdWzE6XV0gPSAoeFswXVsxOl0sKSArIHhbMTpdCi0gICAgcmV0dXJuIGRpY3QKLQogIyBVc2VmdWwgY2xhc3MgdG8gY3JlYXRlIGEgZGlzcGxheSBzdHlsZSAtIGxhdGVyIHNoYXJlZCBieSBtYW55IGl0ZW1zLgogIyBDb250cmlidXRlZCBieSBTdGVmZmVuIEtyZW1zZXIKIGNsYXNzIERpc3BsYXlTdHlsZToKQEAgLTUxNSwxMCArNTA0LDggQEAKICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuc3R5bGVuYW1lLCAnY29uZmlndXJlJywgJy0lcycla2V5LCB2YWx1ZSkKIAogICAgIGRlZiBjb25maWcoc2VsZiwgY25mPXt9LCAqKmt3KToKLSAgICAgICAgcmV0dXJuIF9sc3QyZGljdCgKLSAgICAgICAgICAgIHNlbGYudGsuc3BsaXQoCi0gICAgICAgICAgICBzZWxmLnRrLmNhbGwoCi0gICAgICAgICAgICAgICAgICBzZWxmLnN0eWxlbmFtZSwgJ2NvbmZpZ3VyZScsICpzZWxmLl9vcHRpb25zKGNuZixrdykpKSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGNvbmZpZ3VyZSgKKyAgICAgICAgICAgIHNlbGYuc3R5bGVuYW1lLCAnY29uZmlndXJlJywgKnNlbGYuX29wdGlvbnMoY25mLGt3KSkKIAogICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLGtleSk6CiAgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5zdHlsZW5hbWUsICdjZ2V0JywgJy0lcycla2V5KQpAQCAtOTI4LDkgKzkxNSw3IEBACiAKICAgICBkZWYgaGVhZGVyX2NvbmZpZ3VyZShzZWxmLCBjb2wsIGNuZj17fSwgKiprdyk6CiAgICAgICAgIGlmIGNuZiBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuIF9sc3QyZGljdCgKLSAgICAgICAgICAgICAgICBzZWxmLnRrLnNwbGl0KAotICAgICAgICAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaGVhZGVyJywgJ2NvbmZpZ3VyZScsIGNvbCkpKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldGNvbmZpZ3VyZShzZWxmLl93LCAnaGVhZGVyJywgJ2NvbmZpZ3VyZScsIGNvbCkKICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdoZWFkZXInLCAnY29uZmlndXJlJywgY29sLAogICAgICAgICAgICAgICAgICAgICAgKnNlbGYuX29wdGlvbnMoY25mLCBrdykpCiAKQEAgLTk1NSw5ICs5NDAsOCBAQAogCiAgICAgZGVmIGluZGljYXRvcl9jb25maWd1cmUoc2VsZiwgZW50cnksIGNuZj17fSwgKiprdyk6CiAgICAgICAgIGlmIGNuZiBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuIF9sc3QyZGljdCgKLSAgICAgICAgICAgICAgICBzZWxmLnRrLnNwbGl0KAotICAgICAgICAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW5kaWNhdG9yJywgJ2NvbmZpZ3VyZScsIGVudHJ5KSkpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0Y29uZmlndXJlKAorICAgICAgICAgICAgICAgIHNlbGYuX3csICdpbmRpY2F0b3InLCAnY29uZmlndXJlJywgZW50cnkpCiAgICAgICAgIHNlbGYudGsuY2FsbCgKICAgICAgICAgICAgICAgc2VsZi5fdywgJ2luZGljYXRvcicsICdjb25maWd1cmUnLCBlbnRyeSwgKnNlbGYuX29wdGlvbnMoY25mLCBrdykpCiAKQEAgLTEwMTcsOSArMTAwMSw3IEBACiAKICAgICBkZWYgaXRlbV9jb25maWd1cmUoc2VsZiwgZW50cnksIGNvbCwgY25mPXt9LCAqKmt3KToKICAgICAgICAgaWYgY25mIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gX2xzdDJkaWN0KAotICAgICAgICAgICAgICAgIHNlbGYudGsuc3BsaXQoCi0gICAgICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdpdGVtJywgJ2NvbmZpZ3VyZScsIGVudHJ5LCBjb2wpKSkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRjb25maWd1cmUoc2VsZi5fdywgJ2l0ZW0nLCAnY29uZmlndXJlJywgZW50cnksIGNvbCkKICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdpdGVtJywgJ2NvbmZpZ3VyZScsIGVudHJ5LCBjb2wsCiAgICAgICAgICAgICAgICpzZWxmLl9vcHRpb25zKGNuZiwga3cpKQogCkBAIC0xMDM4LDkgKzEwMjAsNyBAQAogCiAgICAgZGVmIGVudHJ5Y29uZmlndXJlKHNlbGYsIGVudHJ5LCBjbmY9e30sICoqa3cpOgogICAgICAgICBpZiBjbmYgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybiBfbHN0MmRpY3QoCi0gICAgICAgICAgICAgICAgc2VsZi50ay5zcGxpdCgKLSAgICAgICAgICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2VudHJ5Y29uZmlndXJlJywgZW50cnkpKSkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRjb25maWd1cmUoc2VsZi5fdywgJ2VudHJ5Y29uZmlndXJlJywgZW50cnkpCiAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZW50cnljb25maWd1cmUnLCBlbnRyeSwKICAgICAgICAgICAgICAgKnNlbGYuX29wdGlvbnMoY25mLCBrdykpCiAKQEAgLTEyNTUsOSArMTIzNSw3IEBACiAKICAgICBkZWYgcGFuZWNvbmZpZ3VyZShzZWxmLCBlbnRyeSwgY25mPXt9LCAqKmt3KToKICAgICAgICAgaWYgY25mIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gX2xzdDJkaWN0KAotICAgICAgICAgICAgICAgIHNlbGYudGsuc3BsaXQoCi0gICAgICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdwYW5lY29uZmlndXJlJywgZW50cnkpKSkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRjb25maWd1cmUoc2VsZi5fdywgJ3BhbmVjb25maWd1cmUnLCBlbnRyeSkKICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdwYW5lY29uZmlndXJlJywgZW50cnksICpzZWxmLl9vcHRpb25zKGNuZiwga3cpKQogCiAgICAgZGVmIHBhbmVzKHNlbGYpOgpAQCAtMTkwMiwzOCArMTg4MCwzOSBAQAogICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZiwgJ3NldCcsIHgsIHksICphcmdzKQogCiAgICAgZGVmIHNpemVfY29sdW1uKHNlbGYsIGluZGV4LCAqKmt3KToKLSAgICAgICAgIiIiUXVlcmllcyAgb3IgIHNldHMgdGhlIHNpemUgb2YgdGhlIGNvbHVtbiBnaXZlbiBieQotICAgICAgICBJTkRFWC4gIElOREVYIG1heSBiZSBhbnkgIG5vbi1uZWdhdGl2ZQotICAgICAgICBpbnRlZ2VyICB0aGF0ICBnaXZlcyAgdGhlICBwb3NpdGlvbiAgb2YgYSBnaXZlbiBjb2x1bW4uCisgICAgICAgICIiIlF1ZXJpZXMgb3Igc2V0cyB0aGUgc2l6ZSBvZiB0aGUgY29sdW1uIGdpdmVuIGJ5CisgICAgICAgIElOREVYLiAgSU5ERVggbWF5IGJlIGFueSBub24tbmVnYXRpdmUKKyAgICAgICAgaW50ZWdlciB0aGF0IGdpdmVzIHRoZSBwb3NpdGlvbiBvZiBhIGdpdmVuIGNvbHVtbi4KICAgICAgICAgSU5ERVggY2FuIGFsc28gYmUgdGhlIHN0cmluZyAiZGVmYXVsdCI7IGluIHRoaXMgY2FzZSwgdGhpcyBjb21tYW5kCiAgICAgICAgIHF1ZXJpZXMgb3Igc2V0cyB0aGUgZGVmYXVsdCBzaXplIG9mIGFsbCBjb2x1bW5zLgotICAgICAgICBXaGVuICBubyAgb3B0aW9uLXZhbHVlICBwYWlyIGlzIGdpdmVuLCB0aGlzIGNvbW1hbmQgcmV0dXJucyBhIHR1cGxlCi0gICAgICAgIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgc2l6ZSBzZXR0aW5nIG9mIHRoZSBnaXZlbiAgY29sdW1uLiAgV2hlbgotICAgICAgICBvcHRpb24tdmFsdWUgIHBhaXJzICBhcmUgIGdpdmVuLCAgdGhlIGNvcnJlc3BvbmRpbmcgb3B0aW9ucyBvZiB0aGUKKyAgICAgICAgV2hlbiBubyBvcHRpb24tdmFsdWUgcGFpciBpcyBnaXZlbiwgdGhpcyBjb21tYW5kIHJldHVybnMgYSB0dXBsZQorICAgICAgICBjb250YWluaW5nIHRoZSBjdXJyZW50IHNpemUgc2V0dGluZyBvZiB0aGUgZ2l2ZW4gY29sdW1uLiAgV2hlbgorICAgICAgICBvcHRpb24tdmFsdWUgcGFpcnMgYXJlIGdpdmVuLCB0aGUgY29ycmVzcG9uZGluZyBvcHRpb25zIG9mIHRoZQogICAgICAgICBzaXplIHNldHRpbmcgb2YgdGhlIGdpdmVuIGNvbHVtbiBhcmUgY2hhbmdlZC4gT3B0aW9ucyBtYXkgYmUgb25lCi0gICAgICAgIG9mICB0aGUgIGZvbGx3aW5nOgorICAgICAgICBvZiB0aGUgZm9sbHdpbmc6CiAgICAgICAgICAgICAgIHBhZDAgcGl4ZWxzCiAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHBhZGRpbmdzIHRvIHRoZSBsZWZ0IG9mIGEgY29sdW1uLgogICAgICAgICAgICAgICBwYWQxIHBpeGVscwotICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBwYWRkaW5ncyB0byB0aGUgcmlnaHQgb2YgYSAgY29sdW1uLgorICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBwYWRkaW5ncyB0byB0aGUgcmlnaHQgb2YgYSBjb2x1bW4uCiAgICAgICAgICAgICAgIHNpemUgdmFsCi0gICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgIHRoZSAgd2lkdGggb2YgYSBjb2x1bW4gLgotICAgICAgICAgICAgICAgICAgICAgVmFsIG1heSBiZTogImF1dG8iIC0tIHRoZSB3aWR0aCBvZiB0aGUgY29sdW1uIGlzIHNldCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIHRoZSB3aWRlc3QgY2VsbCBpbiB0aGUgY29sdW1uOyBhIHZhbGlkIFRrIHNjcmVlbiBkaXN0YW5jZQotICAgICAgICAgICAgICAgICAgICAgdW5pdDsgb3IgYSByZWFsIG51bWJlciBmb2xsb3dpbmcgYnkgdGhlIHdvcmQgY2hhcnMKKyAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgd2lkdGggb2YgYSBjb2x1bW4uICBWYWwgbWF5IGJlOgorICAgICAgICAgICAgICAgICAgICAgImF1dG8iIC0tIHRoZSB3aWR0aCBvZiB0aGUgY29sdW1uIGlzIHNldCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgIHdpZHRoIG9mIHRoZSB3aWRlc3QgY2VsbCBpbiB0aGUgY29sdW1uOworICAgICAgICAgICAgICAgICAgICAgYSB2YWxpZCBUayBzY3JlZW4gZGlzdGFuY2UgdW5pdDsKKyAgICAgICAgICAgICAgICAgICAgIG9yIGEgcmVhbCBudW1iZXIgZm9sbG93aW5nIGJ5IHRoZSB3b3JkIGNoYXJzCiAgICAgICAgICAgICAgICAgICAgICAoZS5nLiAzLjRjaGFycykgdGhhdCBzZXRzIHRoZSB3aWR0aCBvZiB0aGUgY29sdW1uIHRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gbnVtYmVyIG9mIGNoYXJhY3RlcnMuIiIiCiAgICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0KHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2l6ZScsICdjb2x1bW4nLCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNlbGYuX29wdGlvbnMoe30sIGt3KSkpCiAKICAgICBkZWYgc2l6ZV9yb3coc2VsZiwgaW5kZXgsICoqa3cpOgotICAgICAgICAiIiJRdWVyaWVzICBvciAgc2V0cyB0aGUgc2l6ZSBvZiB0aGUgcm93IGdpdmVuIGJ5Ci0gICAgICAgIElOREVYLiBJTkRFWCBtYXkgYmUgYW55ICBub24tbmVnYXRpdmUKLSAgICAgICAgaW50ZWdlciAgdGhhdCAgZ2l2ZXMgIHRoZSAgcG9zaXRpb24gIG9mIGEgZ2l2ZW4gcm93IC4KKyAgICAgICAgIiIiUXVlcmllcyBvciBzZXRzIHRoZSBzaXplIG9mIHRoZSByb3cgZ2l2ZW4gYnkKKyAgICAgICAgSU5ERVguIElOREVYIG1heSBiZSBhbnkgbm9uLW5lZ2F0aXZlCisgICAgICAgIGludGVnZXIgdGhhdCBnaXZlcyB0aGUgcG9zaXRpb24gb2YgYSBnaXZlbiByb3cgLgogICAgICAgICBJTkRFWCBjYW4gYWxzbyBiZSB0aGUgc3RyaW5nICJkZWZhdWx0IjsgaW4gdGhpcyBjYXNlLCB0aGlzIGNvbW1hbmQKICAgICAgICAgcXVlcmllcyBvciBzZXRzIHRoZSBkZWZhdWx0IHNpemUgb2YgYWxsIHJvd3MuCi0gICAgICAgIFdoZW4gIG5vIG9wdGlvbi12YWx1ZSBwYWlyIGlzIGdpdmVuLCB0aGlzIGNvbW1hbmQgcmV0dXJucyBhIGxpc3QgY29uLQotICAgICAgICB0YWluaW5nIHRoZSBjdXJyZW50IHNpemUgc2V0dGluZyBvZiB0aGUgZ2l2ZW4gIHJvdyAuIFdoZW4gb3B0aW9uLXZhbHVlCisgICAgICAgIFdoZW4gbm8gb3B0aW9uLXZhbHVlIHBhaXIgaXMgZ2l2ZW4sIHRoaXMgY29tbWFuZCByZXR1cm5zIGEgbGlzdCBjb24tCisgICAgICAgIHRhaW5pbmcgdGhlIGN1cnJlbnQgc2l6ZSBzZXR0aW5nIG9mIHRoZSBnaXZlbiByb3cgLiBXaGVuIG9wdGlvbi12YWx1ZQogICAgICAgICBwYWlycyBhcmUgZ2l2ZW4sIHRoZSBjb3JyZXNwb25kaW5nIG9wdGlvbnMgb2YgdGhlIHNpemUgc2V0dGluZyBvZiB0aGUKICAgICAgICAgZ2l2ZW4gcm93IGFyZSBjaGFuZ2VkLiBPcHRpb25zIG1heSBiZSBvbmUgb2YgdGhlIGZvbGx3aW5nOgogICAgICAgICAgICAgICBwYWQwIHBpeGVscwpAQCAtMTk0MSwxMCArMTkyMCwxMSBAQAogICAgICAgICAgICAgICBwYWQxIHBpeGVscwogICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBwYWRkaW5ncyB0byB0aGUgYm90dG9tIG9mIGEgcm93LgogICAgICAgICAgICAgICBzaXplIHZhbAotICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzICB0aGUgaGVpZ2h0IG9mIGEgcm93LgotICAgICAgICAgICAgICAgICAgICAgVmFsIG1heSBiZTogImF1dG8iIC0tIHRoZSBoZWlnaHQgb2YgdGhlIHJvdyAgaXMgIHNldCAgdGhlCi0gICAgICAgICAgICAgICAgICAgICB0aGUgaGlnaGVzdCBjZWxsIGluIHRoZSByb3c7IGEgdmFsaWQgVGsgc2NyZWVuIGRpc3RhbmNlCi0gICAgICAgICAgICAgICAgICAgICB1bml0OyBvciBhIHJlYWwgbnVtYmVyIGZvbGxvd2luZyBieSB0aGUgd29yZCBjaGFycworICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBoZWlnaHQgb2YgYSByb3cuICBWYWwgbWF5IGJlOgorICAgICAgICAgICAgICAgICAgICAgImF1dG8iIC0tIHRoZSBoZWlnaHQgb2YgdGhlIHJvdyBpcyBzZXQgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgb2YgdGhlIGhpZ2hlc3QgY2VsbCBpbiB0aGUgcm93OworICAgICAgICAgICAgICAgICAgICAgYSB2YWxpZCBUayBzY3JlZW4gZGlzdGFuY2UgdW5pdDsKKyAgICAgICAgICAgICAgICAgICAgIG9yIGEgcmVhbCBudW1iZXIgZm9sbG93aW5nIGJ5IHRoZSB3b3JkIGNoYXJzCiAgICAgICAgICAgICAgICAgICAgICAoZS5nLiAzLjRjaGFycykgdGhhdCBzZXRzIHRoZSBoZWlnaHQgb2YgdGhlIHJvdyB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIG51bWJlciBvZiBjaGFyYWN0ZXJzLiIiIgogICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdChzZWxmLnRrLmNhbGwoCmRpZmYgLS1naXQgYS9MaWIvbGliLXRrL1RraW50ZXIucHkgYi9MaWIvbGliLXRrL1RraW50ZXIucHkKaW5kZXggNTg2MTI5YS4uYWFkZTY0OSAxMDA2NDQKLS0tIGEvTGliL2xpYi10ay9Ua2ludGVyLnB5CisrKyBiL0xpYi9saWItdGsvVGtpbnRlci5weQpAQCAtNDEsNiArNDEsNyBAQAogVGNsRXJyb3IgPSBfdGtpbnRlci5UY2xFcnJvcgogZnJvbSB0eXBlcyBpbXBvcnQgKgogZnJvbSBUa2NvbnN0YW50cyBpbXBvcnQgKgoraW1wb3J0IHJlCiAKIHdhbnRvYmplY3RzID0gMQogCkBAIC01OCw2ICs1OSwzNyBAQAogZXhjZXB0IEF0dHJpYnV0ZUVycm9yOiBfdGtpbnRlci5kZWxldGVmaWxlaGFuZGxlciA9IE5vbmUKIAogCitfbWFnaWNfcmUgPSByZS5jb21waWxlKHInKFtcXHt9XSknKQorX3NwYWNlX3JlID0gcmUuY29tcGlsZShyJyhbXHNdKScpCisKK2RlZiBfam9pbih2YWx1ZSk6CisgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIiIiCisgICAgcmV0dXJuICcgJy5qb2luKG1hcChfc3RyaW5naWZ5LCB2YWx1ZSkpCisKK2RlZiBfc3RyaW5naWZ5KHZhbHVlKToKKyAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbi4iIiIKKyAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCAobGlzdCwgdHVwbGUpKToKKyAgICAgICAgaWYgbGVuKHZhbHVlKSA9PSAxOgorICAgICAgICAgICAgdmFsdWUgPSBfc3RyaW5naWZ5KHZhbHVlWzBdKQorICAgICAgICAgICAgaWYgdmFsdWVbMF0gPT0gJ3snOgorICAgICAgICAgICAgICAgIHZhbHVlID0gJ3slc30nICUgdmFsdWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHZhbHVlID0gJ3slc30nICUgX2pvaW4odmFsdWUpCisgICAgZWxzZToKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyKToKKyAgICAgICAgICAgIHZhbHVlID0gdW5pY29kZSh2YWx1ZSwgJ3V0Zi04JykKKyAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgdW5pY29kZSk6CisgICAgICAgICAgICB2YWx1ZSA9IHN0cih2YWx1ZSkKKyAgICAgICAgaWYgbm90IHZhbHVlOgorICAgICAgICAgICAgdmFsdWUgPSAne30nCisgICAgICAgIGVsaWYgX21hZ2ljX3JlLnNlYXJjaCh2YWx1ZSk6CisgICAgICAgICAgICAjIGFkZCAnXCcgYmVmb3JlIHNwZWNpYWwgY2hhcmFjdGVycyBhbmQgc3BhY2VzCisgICAgICAgICAgICB2YWx1ZSA9IF9tYWdpY19yZS5zdWIocidcXFwxJywgdmFsdWUpCisgICAgICAgICAgICB2YWx1ZSA9IF9zcGFjZV9yZS5zdWIocidcXFwxJywgdmFsdWUpCisgICAgICAgIGVsaWYgdmFsdWVbMF0gPT0gJyInIG9yIF9zcGFjZV9yZS5zZWFyY2godmFsdWUpOgorICAgICAgICAgICAgdmFsdWUgPSAneyVzfScgJSB2YWx1ZQorICAgIHJldHVybiB2YWx1ZQorCiBkZWYgX2ZsYXR0ZW4odHVwbGUpOgogICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiIiIgogICAgIHJlcyA9ICgpCkBAIC0xNTQsOCArMTg2LDEyIEBACiAgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIiIiCiAgICAgcGFzcwogCi1kZWYgX2V4aXQoY29kZT0nMCcpOgotICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiBDYWxsaW5nIGl0IHdpbGwgdGhyb3cgdGhlIGV4Y2VwdGlvbiBTeXN0ZW1FeGl0LiIiIgorZGVmIF9leGl0KGNvZGU9MCk6CisgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIENhbGxpbmcgaXQgd2lsbCByYWlzZSB0aGUgZXhjZXB0aW9uIFN5c3RlbUV4aXQuIiIiCisgICAgdHJ5OgorICAgICAgICBjb2RlID0gaW50KGNvZGUpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHBhc3MKICAgICByYWlzZSBTeXN0ZW1FeGl0LCBjb2RlCiAKIF92YXJudW0gPSAwCkBAIC0xODcsMTEgKzIyMywxMyBAQAogICAgICAgICAgICAgX3Zhcm51bSArPSAxCiAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgc2VsZi5zZXQodmFsdWUpCi0gICAgICAgIGVsaWYgbm90IHNlbGYuX3RrLmNhbGwoImluZm8iLCAiZXhpc3RzIiwgc2VsZi5fbmFtZSk6CisgICAgICAgIGVsaWYgbm90IHNlbGYuX3RrLmdldGJvb2xlYW4oc2VsZi5fdGsuY2FsbCgiaW5mbyIsICJleGlzdHMiLCBzZWxmLl9uYW1lKSk6CiAgICAgICAgICAgICBzZWxmLnNldChzZWxmLl9kZWZhdWx0KQogICAgIGRlZiBfX2RlbF9fKHNlbGYpOgogICAgICAgICAiIiJVbnNldCB0aGUgdmFyaWFibGUgaW4gVGNsLiIiIgotICAgICAgICBzZWxmLl90ay5nbG9iYWx1bnNldHZhcihzZWxmLl9uYW1lKQorICAgICAgICBpZiAoc2VsZi5fdGsgaXMgbm90IE5vbmUgYW5kCisgICAgICAgICAgICBzZWxmLl90ay5nZXRib29sZWFuKHNlbGYuX3RrLmNhbGwoImluZm8iLCAiZXhpc3RzIiwgc2VsZi5fbmFtZSkpKToKKyAgICAgICAgICAgIHNlbGYuX3RrLmdsb2JhbHVuc2V0dmFyKHNlbGYuX25hbWUpCiAgICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgICIiIlJldHVybiB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgaW4gVGNsLiIiIgogICAgICAgICByZXR1cm4gc2VsZi5fbmFtZQpAQCAtMzg3LDcgKzQyNSwxMCBAQAogICAgICAgICAgICAgICArIF9mbGF0dGVuKGFyZ3MpICsgX2ZsYXR0ZW4oa3cuaXRlbXMoKSkpCiAgICAgZGVmIHRrX21lbnVCYXIoc2VsZiwgKmFyZ3MpOgogICAgICAgICAiIiJEbyBub3QgdXNlLiBOZWVkZWQgaW4gVGsgMy42IGFuZCBlYXJsaWVyLiIiIgotICAgICAgICBwYXNzICMgb2Jzb2xldGUgc2luY2UgVGsgNC4wCisgICAgICAgICMgb2Jzb2xldGUgc2luY2UgVGsgNC4wCisgICAgICAgIGltcG9ydCB3YXJuaW5ncworICAgICAgICB3YXJuaW5ncy53YXJuKCd0a19tZW51QmFyKCkgZG9lcyBub3RoaW5nIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gMy42JywKKyAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICBkZWYgd2FpdF92YXJpYWJsZShzZWxmLCBuYW1lPSdQWV9WQVInKToKICAgICAgICAgIiIiV2FpdCB1bnRpbCB0aGUgdmFyaWFibGUgaXMgbW9kaWZpZWQuCiAKQEAgLTUzNCwxMiArNTc1LDE5IEBACiAKICAgICAgICAgVGhlIHR5cGUga2V5d29yZCBzcGVjaWZpZXMgdGhlIGZvcm0gaW4gd2hpY2ggdGhlIGRhdGEgaXMKICAgICAgICAgdG8gYmUgcmV0dXJuZWQgYW5kIHNob3VsZCBiZSBhbiBhdG9tIG5hbWUgc3VjaCBhcyBTVFJJTkcKLSAgICAgICAgb3IgRklMRV9OQU1FLiAgVHlwZSBkZWZhdWx0cyB0byBTVFJJTkcuCisgICAgICAgIG9yIEZJTEVfTkFNRS4gIFR5cGUgZGVmYXVsdHMgdG8gU1RSSU5HLCBleGNlcHQgb24gWDExLCB3aGVyZSB0aGUgZGVmYXVsdAorICAgICAgICBpcyB0byB0cnkgVVRGOF9TVFJJTkcgYW5kIGZhbGwgYmFjayB0byBTVFJJTkcuCiAKICAgICAgICAgVGhpcyBjb21tYW5kIGlzIGVxdWl2YWxlbnQgdG86CiAKICAgICAgICAgc2VsZWN0aW9uX2dldChDTElQQk9BUkQpCiAgICAgICAgICIiIgorICAgICAgICBpZiAndHlwZScgbm90IGluIGt3IGFuZCBzZWxmLl93aW5kb3dpbmdzeXN0ZW0gPT0gJ3gxMSc6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAga3dbJ3R5cGUnXSA9ICdVVEY4X1NUUklORycKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCgnY2xpcGJvYXJkJywgJ2dldCcpICsgc2VsZi5fb3B0aW9ucyhrdykpCisgICAgICAgICAgICBleGNlcHQgVGNsRXJyb3I6CisgICAgICAgICAgICAgICAgZGVsIGt3Wyd0eXBlJ10KICAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgoJ2NsaXBib2FyZCcsICdnZXQnKSArIHNlbGYuX29wdGlvbnMoa3cpKQogCiAgICAgZGVmIGNsaXBib2FyZF9jbGVhcihzZWxmLCAqKmt3KToKQEAgLTYyMSw4ICs2NjksMTYgQEAKICAgICAgICAgQSBrZXl3b3JkIHBhcmFtZXRlciBzZWxlY3Rpb24gc3BlY2lmaWVzIHRoZSBuYW1lIG9mCiAgICAgICAgIHRoZSBzZWxlY3Rpb24gYW5kIGRlZmF1bHRzIHRvIFBSSU1BUlkuICBBIGtleXdvcmQKICAgICAgICAgcGFyYW1ldGVyIGRpc3BsYXlvZiBzcGVjaWZpZXMgYSB3aWRnZXQgb24gdGhlIGRpc3BsYXkKLSAgICAgICAgdG8gdXNlLiIiIgorICAgICAgICB0byB1c2UuIEEga2V5d29yZCBwYXJhbWV0ZXIgdHlwZSBzcGVjaWZpZXMgdGhlIGZvcm0gb2YgZGF0YSB0byBiZQorICAgICAgICBmZXRjaGVkLCBkZWZhdWx0aW5nIHRvIFNUUklORyBleGNlcHQgb24gWDExLCB3aGVyZSBVVEY4X1NUUklORyBpcyB0cmllZAorICAgICAgICBiZWZvcmUgU1RSSU5HLiIiIgogICAgICAgICBpZiAnZGlzcGxheW9mJyBub3QgaW4ga3c6IGt3WydkaXNwbGF5b2YnXSA9IHNlbGYuX3cKKyAgICAgICAgaWYgJ3R5cGUnIG5vdCBpbiBrdyBhbmQgc2VsZi5fd2luZG93aW5nc3lzdGVtID09ICd4MTEnOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGt3Wyd0eXBlJ10gPSAnVVRGOF9TVFJJTkcnCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgoJ3NlbGVjdGlvbicsICdnZXQnKSArIHNlbGYuX29wdGlvbnMoa3cpKQorICAgICAgICAgICAgZXhjZXB0IFRjbEVycm9yOgorICAgICAgICAgICAgICAgIGRlbCBrd1sndHlwZSddCiAgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoKCdzZWxlY3Rpb24nLCAnZ2V0JykgKyBzZWxmLl9vcHRpb25zKGt3KSkKICAgICBkZWYgc2VsZWN0aW9uX2hhbmRsZShzZWxmLCBjb21tYW5kLCAqKmt3KToKICAgICAgICAgIiIiU3BlY2lmeSBhIGZ1bmN0aW9uIENPTU1BTkQgdG8gY2FsbCBpZiB0aGUgWApAQCAtMTAzNyw2ICsxMDkzLDE1IEBACiAgICAgICAgIGlmIGRpc3BsYXlvZiBpcyBOb25lOgogICAgICAgICAgICAgcmV0dXJuICgnLWRpc3BsYXlvZicsIHNlbGYuX3cpCiAgICAgICAgIHJldHVybiAoKQorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBfd2luZG93aW5nc3lzdGVtKHNlbGYpOgorICAgICAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbi4iIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Jvb3QoKS5fd2luZG93aW5nc3lzdGVtX2NhY2hlZAorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICB3cyA9IHNlbGYuX3Jvb3QoKS5fd2luZG93aW5nc3lzdGVtX2NhY2hlZCA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGsuY2FsbCgndGsnLCAnd2luZG93aW5nc3lzdGVtJykKKyAgICAgICAgICAgIHJldHVybiB3cwogICAgIGRlZiBfb3B0aW9ucyhzZWxmLCBjbmYsIGt3ID0gTm9uZSk6CiAgICAgICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiIiIgogICAgICAgICBpZiBrdzoKQEAgLTEwNTgsNyArMTEyMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnYuYXBwZW5kKCclZCcgJSBpdGVtKQogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZvcm1hdCBpdCB0byBwcm9wZXIgVGNsIGNvZGUgaWYgaXQgY29udGFpbnMgc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudi5hcHBlbmQoKCd7JXN9JyBpZiAnICcgaW4gaXRlbSBlbHNlICclcycpICUgaXRlbSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudi5hcHBlbmQoX3N0cmluZ2lmeShpdGVtKSkKICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSAnICcuam9pbihudikKICAgICAgICAgICAgICAgICByZXMgPSByZXMgKyAoJy0nK2ssIHYpCkBAIC0xMTc0LDYgKzEyMzksMTkgQEAKICAgICAgICAgZXhjLCB2YWwsIHRiID0gc3lzLmV4Y190eXBlLCBzeXMuZXhjX3ZhbHVlLCBzeXMuZXhjX3RyYWNlYmFjawogICAgICAgICByb290ID0gc2VsZi5fcm9vdCgpCiAgICAgICAgIHJvb3QucmVwb3J0X2NhbGxiYWNrX2V4Y2VwdGlvbihleGMsIHZhbCwgdGIpCisKKyAgICBkZWYgX2dldGNvbmZpZ3VyZShzZWxmLCAqYXJncyk6CisgICAgICAgICIiIkNhbGwgVGNsIGNvbmZpZ3VyZSBjb21tYW5kIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcyBhIGRpY3QuIiIiCisgICAgICAgIGNuZiA9IHt9CisgICAgICAgIGZvciB4IGluIHNlbGYudGsuc3BsaXRsaXN0KHNlbGYudGsuY2FsbCgqYXJncykpOgorICAgICAgICAgICAgeCA9IHNlbGYudGsuc3BsaXRsaXN0KHgpCisgICAgICAgICAgICBjbmZbeFswXVsxOl1dID0gKHhbMF1bMTpdLCkgKyB4WzE6XQorICAgICAgICByZXR1cm4gY25mCisKKyAgICBkZWYgX2dldGNvbmZpZ3VyZTEoc2VsZiwgKmFyZ3MpOgorICAgICAgICB4ID0gc2VsZi50ay5zcGxpdGxpc3Qoc2VsZi50ay5jYWxsKCphcmdzKSkKKyAgICAgICAgcmV0dXJuICh4WzBdWzE6XSwpICsgeFsxOl0KKwogICAgIGRlZiBfY29uZmlndXJlKHNlbGYsIGNtZCwgY25mLCBrdyk6CiAgICAgICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiIiIgogICAgICAgICBpZiBrdzoKQEAgLTExODEsMTUgKzEyNTksOSBAQAogICAgICAgICBlbGlmIGNuZjoKICAgICAgICAgICAgIGNuZiA9IF9jbmZtZXJnZShjbmYpCiAgICAgICAgIGlmIGNuZiBpcyBOb25lOgotICAgICAgICAgICAgY25mID0ge30KLSAgICAgICAgICAgIGZvciB4IGluIHNlbGYudGsuc3BsaXQoCi0gICAgICAgICAgICAgICAgICAgIHNlbGYudGsuY2FsbChfZmxhdHRlbigoc2VsZi5fdywgY21kKSkpKToKLSAgICAgICAgICAgICAgICBjbmZbeFswXVsxOl1dID0gKHhbMF1bMTpdLCkgKyB4WzE6XQotICAgICAgICAgICAgcmV0dXJuIGNuZgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldGNvbmZpZ3VyZShfZmxhdHRlbigoc2VsZi5fdywgY21kKSkpCiAgICAgICAgIGlmIHR5cGUoY25mKSBpcyBTdHJpbmdUeXBlOgotICAgICAgICAgICAgeCA9IHNlbGYudGsuc3BsaXQoCi0gICAgICAgICAgICAgICAgICAgIHNlbGYudGsuY2FsbChfZmxhdHRlbigoc2VsZi5fdywgY21kLCAnLScrY25mKSkpKQotICAgICAgICAgICAgcmV0dXJuICh4WzBdWzE6XSwpICsgeFsxOl0KKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRjb25maWd1cmUxKF9mbGF0dGVuKChzZWxmLl93LCBjbWQsICctJytjbmYpKSkKICAgICAgICAgc2VsZi50ay5jYWxsKF9mbGF0dGVuKChzZWxmLl93LCBjbWQpKSArIHNlbGYuX29wdGlvbnMoY25mKSkKICAgICAjIFRoZXNlIHVzZWQgdG8gYmUgZGVmaW5lZCBpbiBXaWRnZXQ6CiAgICAgZGVmIGNvbmZpZ3VyZShzZWxmLCBjbmY9Tm9uZSwgKiprdyk6CkBAIC0xMjExLDggKzEyODMsOCBAQAogICAgICAgICByYWlzZSBUeXBlRXJyb3IoIlRraW50ZXIgb2JqZWN0cyBkb24ndCBzdXBwb3J0ICdpbicgdGVzdHMuIikKICAgICBkZWYga2V5cyhzZWxmKToKICAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgcmVzb3VyY2UgbmFtZXMgb2YgdGhpcyB3aWRnZXQuIiIiCi0gICAgICAgIHJldHVybiBtYXAobGFtYmRhIHg6IHhbMF1bMTpdLAotICAgICAgICAgICAgICAgc2VsZi50ay5zcGxpdChzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2NvbmZpZ3VyZScpKSkKKyAgICAgICAgcmV0dXJuIFt4WzBdWzE6XSBmb3IgeCBpbgorICAgICAgICAgICAgICAgIHNlbGYudGsuc3BsaXRsaXN0KHNlbGYudGsuY2FsbChzZWxmLl93LCAnY29uZmlndXJlJykpXQogICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIHdpbmRvdyBwYXRoIG5hbWUgb2YgdGhpcyB3aWRnZXQuIiIiCiAgICAgICAgIHJldHVybiBzZWxmLl93CkBAIC0xMjY3LDYgKzEzMzksMjEgQEAKICAgICAgICAgcmV0dXJuIHNlbGYuX2dldGludHMoc2VsZi50ay5jYWxsKCphcmdzKSkgb3IgTm9uZQogCiAgICAgYmJveCA9IGdyaWRfYmJveAorCisgICAgZGVmIF9ncmlkY29udnZhbHVlKHNlbGYsIHZhbHVlKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgKHN0ciwgX3RraW50ZXIuVGNsX09iaikpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHN2YWx1ZSA9IHN0cih2YWx1ZSkKKyAgICAgICAgICAgICAgICBpZiBub3Qgc3ZhbHVlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgICAgIGVsaWYgJy4nIGluIHN2YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldGRvdWJsZShzdmFsdWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldGludChzdmFsdWUpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHJldHVybiB2YWx1ZQorCiAgICAgZGVmIF9ncmlkX2NvbmZpZ3VyZShzZWxmLCBjb21tYW5kLCBpbmRleCwgY25mLCBrdyk6CiAgICAgICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiIiIgogICAgICAgICBpZiB0eXBlKGNuZikgaXMgU3RyaW5nVHlwZSBhbmQgbm90IGt3OgpAQCAtMTI4NSwyMiArMTM3MiwxNCBAQAogICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKHdvcmRzKSwgMik6CiAgICAgICAgICAgICAgICAga2V5ID0gd29yZHNbaV1bMTpdCiAgICAgICAgICAgICAgICAgdmFsdWUgPSB3b3Jkc1tpKzFdCi0gICAgICAgICAgICAgICAgaWYgbm90IHZhbHVlOgotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IE5vbmUKLSAgICAgICAgICAgICAgICBlbGlmICcuJyBpbiB2YWx1ZToKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRkb3VibGUodmFsdWUpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRpbnQodmFsdWUpCi0gICAgICAgICAgICAgICAgZGljdFtrZXldID0gdmFsdWUKKyAgICAgICAgICAgICAgICBkaWN0W2tleV0gPSBzZWxmLl9ncmlkY29udnZhbHVlKHZhbHVlKQogICAgICAgICAgICAgcmV0dXJuIGRpY3QKICAgICAgICAgcmVzID0gc2VsZi50ay5jYWxsKAogICAgICAgICAgICAgICAgICAgKCdncmlkJywgY29tbWFuZCwgc2VsZi5fdywgaW5kZXgpCiAgICAgICAgICAgICAgICAgICArIG9wdGlvbnMpCiAgICAgICAgIGlmIGxlbihvcHRpb25zKSA9PSAxOgotICAgICAgICAgICAgaWYgbm90IHJlczogcmV0dXJuIE5vbmUKLSAgICAgICAgICAgICMgSW4gVGsgNy41LCAtd2lkdGggY2FuIGJlIGEgZmxvYXQKLSAgICAgICAgICAgIGlmICcuJyBpbiByZXM6IHJldHVybiBnZXRkb3VibGUocmVzKQotICAgICAgICAgICAgcmV0dXJuIGdldGludChyZXMpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZ3JpZGNvbnZ2YWx1ZShyZXMpCisKICAgICBkZWYgZ3JpZF9jb2x1bW5jb25maWd1cmUoc2VsZiwgaW5kZXgsIGNuZj17fSwgKiprdyk6CiAgICAgICAgICIiIkNvbmZpZ3VyZSBjb2x1bW4gSU5ERVggb2YgYSBncmlkLgogCkBAIC0xMzg3LDExICsxNDY2LDExIEBACiAKICAgICBkZWYgaW1hZ2VfbmFtZXMoc2VsZik6CiAgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYWxsIGV4aXN0aW5nIGltYWdlIG5hbWVzLiIiIgotICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCdpbWFnZScsICduYW1lcycpCisgICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0bGlzdChzZWxmLnRrLmNhbGwoJ2ltYWdlJywgJ25hbWVzJykpCiAKICAgICBkZWYgaW1hZ2VfdHlwZXMoc2VsZik6CiAgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBpbWFnZSB0eXBlcyAoZS5nLiBwaG90ZSBiaXRtYXApLiIiIgotICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCdpbWFnZScsICd0eXBlcycpCisgICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0bGlzdChzZWxmLnRrLmNhbGwoJ2ltYWdlJywgJ3R5cGVzJykpCiAKIAogY2xhc3MgQ2FsbFdyYXBwZXI6CkBAIC0xNTA1LDcgKzE1ODQsMTAgQEAKICAgICAgICAgaWYgbGVuKHdsaXN0KSA+IDE6CiAgICAgICAgICAgICB3bGlzdCA9ICh3bGlzdCwpICMgVGsgbmVlZHMgYSBsaXN0IG9mIHdpbmRvd3MgaGVyZQogICAgICAgICBhcmdzID0gKCd3bScsICdjb2xvcm1hcHdpbmRvd3MnLCBzZWxmLl93KSArIHdsaXN0Ci0gICAgICAgIHJldHVybiBtYXAoc2VsZi5fbmFtZXRvd2lkZ2V0LCBzZWxmLnRrLmNhbGwoYXJncykpCisgICAgICAgIGlmIHdsaXN0OgorICAgICAgICAgICAgc2VsZi50ay5jYWxsKGFyZ3MpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gbWFwKHNlbGYuX25hbWV0b3dpZGdldCwgc2VsZi50ay5zcGxpdGxpc3Qoc2VsZi50ay5jYWxsKGFyZ3MpKSkKICAgICBjb2xvcm1hcHdpbmRvd3MgPSB3bV9jb2xvcm1hcHdpbmRvd3MKICAgICBkZWYgd21fY29tbWFuZChzZWxmLCB2YWx1ZT1Ob25lKToKICAgICAgICAgIiIiU3RvcmUgVkFMVUUgaW4gV01fQ09NTUFORCBwcm9wZXJ0eS4gSXQgaXMgdGhlIGNvbW1hbmQKQEAgLTE2NzYsNyArMTc1OCw3IEBACiAgICAgICAgICMgZW5zdXJlIHRoYXQgc2VsZi50ayBpcyBhbHdheXMgX3NvbWV0aGluZ18uCiAgICAgICAgIHNlbGYudGsgPSBOb25lCiAgICAgICAgIGlmIGJhc2VOYW1lIGlzIE5vbmU6Ci0gICAgICAgICAgICBpbXBvcnQgc3lzLCBvcworICAgICAgICAgICAgaW1wb3J0IG9zCiAgICAgICAgICAgICBiYXNlTmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoc3lzLmFyZ3ZbMF0pCiAgICAgICAgICAgICBiYXNlTmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChiYXNlTmFtZSkKICAgICAgICAgICAgIGlmIGV4dCBub3QgaW4gKCcucHknLCAnLnB5YycsICcucHlvJyk6CkBAIC0xNjg1LDcgKzE3NjcsOSBAQAogICAgICAgICBzZWxmLnRrID0gX3RraW50ZXIuY3JlYXRlKHNjcmVlbk5hbWUsIGJhc2VOYW1lLCBjbGFzc05hbWUsIGludGVyYWN0aXZlLCB3YW50b2JqZWN0cywgdXNlVGssIHN5bmMsIHVzZSkKICAgICAgICAgaWYgdXNlVGs6CiAgICAgICAgICAgICBzZWxmLl9sb2FkdGsoKQotICAgICAgICBzZWxmLnJlYWRwcm9maWxlKGJhc2VOYW1lLCBjbGFzc05hbWUpCisgICAgICAgIGlmIG5vdCBzeXMuZmxhZ3MuaWdub3JlX2Vudmlyb25tZW50OgorICAgICAgICAgICAgIyBJc3N1ZSAjMTYyNDg6IEhvbm9yIHRoZSAtRSBmbGFnIHRvIGF2b2lkIGNvZGUgaW5qZWN0aW9uLgorICAgICAgICAgICAgc2VsZi5yZWFkcHJvZmlsZShiYXNlTmFtZSwgY2xhc3NOYW1lKQogICAgIGRlZiBsb2FkdGsoc2VsZik6CiAgICAgICAgIGlmIG5vdCBzZWxmLl90a2xvYWRlZDoKICAgICAgICAgICAgIHNlbGYudGsubG9hZHRrKCkKQEAgLTE4MTgsNyArMTkwMiw3IEBACiAgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbih3b3JkcyksIDIpOgogICAgICAgICAgICAga2V5ID0gd29yZHNbaV1bMTpdCiAgICAgICAgICAgICB2YWx1ZSA9IHdvcmRzW2krMV0KLSAgICAgICAgICAgIGlmIHZhbHVlWzoxXSA9PSAnLic6CisgICAgICAgICAgICBpZiBzdHIodmFsdWUpWzoxXSA9PSAnLic6CiAgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9uYW1ldG93aWRnZXQodmFsdWUpCiAgICAgICAgICAgICBkaWN0W2tleV0gPSB2YWx1ZQogICAgICAgICByZXR1cm4gZGljdApAQCAtMTg2OSw3ICsxOTUzLDcgQEAKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKHdvcmRzKSwgMik6CiAgICAgICAgICAgICBrZXkgPSB3b3Jkc1tpXVsxOl0KICAgICAgICAgICAgIHZhbHVlID0gd29yZHNbaSsxXQotICAgICAgICAgICAgaWYgdmFsdWVbOjFdID09ICcuJzoKKyAgICAgICAgICAgIGlmIHN0cih2YWx1ZSlbOjFdID09ICcuJzoKICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuX25hbWV0b3dpZGdldCh2YWx1ZSkKICAgICAgICAgICAgIGRpY3Rba2V5XSA9IHZhbHVlCiAgICAgICAgIHJldHVybiBkaWN0CkBAIC0xOTE4LDcgKzIwMDIsNyBAQAogICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4od29yZHMpLCAyKToKICAgICAgICAgICAgIGtleSA9IHdvcmRzW2ldWzE6XQogICAgICAgICAgICAgdmFsdWUgPSB3b3Jkc1tpKzFdCi0gICAgICAgICAgICBpZiB2YWx1ZVs6MV0gPT0gJy4nOgorICAgICAgICAgICAgaWYgc3RyKHZhbHVlKVs6MV0gPT0gJy4nOgogICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fbmFtZXRvd2lkZ2V0KHZhbHVlKQogICAgICAgICAgICAgZGljdFtrZXldID0gdmFsdWUKICAgICAgICAgcmV0dXJuIGRpY3QKQEAgLTI0ODgsMjIgKzI1NzIsMTkgQEAKICAgICBkZWYgYWN0aXZhdGUoc2VsZiwgaW5kZXgpOgogICAgICAgICAiIiJBY3RpdmF0ZSBpdGVtIGlkZW50aWZpZWQgYnkgSU5ERVguIiIiCiAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnYWN0aXZhdGUnLCBpbmRleCkKLSAgICBkZWYgYmJveChzZWxmLCAqYXJncyk6CisgICAgZGVmIGJib3goc2VsZiwgaW5kZXgpOgogICAgICAgICAiIiJSZXR1cm4gYSB0dXBsZSBvZiBYMSxZMSxYMixZMiBjb29yZGluYXRlcyBmb3IgYSByZWN0YW5nbGUKLSAgICAgICAgd2hpY2ggZW5jbG9zZXMgdGhlIGl0ZW0gaWRlbnRpZmllZCBieSBpbmRleCBpbiBBUkdTLiIiIgotICAgICAgICByZXR1cm4gc2VsZi5fZ2V0aW50cygKLSAgICAgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ2Jib3gnKSArIGFyZ3MpKSBvciBOb25lCisgICAgICAgIHdoaWNoIGVuY2xvc2VzIHRoZSBpdGVtIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGluZGV4LiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0aW50cyhzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2Jib3gnLCBpbmRleCkpIG9yIE5vbmUKICAgICBkZWYgY3Vyc2VsZWN0aW9uKHNlbGYpOgotICAgICAgICAiIiJSZXR1cm4gbGlzdCBvZiBpbmRpY2VzIG9mIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtLiIiIgotICAgICAgICAjIFhYWCBPdWdodCB0byBhcHBseSBzZWxmLl9nZXRpbnRzKCkuLi4KLSAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXRsaXN0KHNlbGYudGsuY2FsbCgKLSAgICAgICAgICAgIHNlbGYuX3csICdjdXJzZWxlY3Rpb24nKSkKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBpbmRpY2VzIG9mIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0aW50cyhzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2N1cnNlbGVjdGlvbicpKSBvciAoKQogICAgIGRlZiBkZWxldGUoc2VsZiwgZmlyc3QsIGxhc3Q9Tm9uZSk6Ci0gICAgICAgICIiIkRlbGV0ZSBpdGVtcyBmcm9tIEZJUlNUIHRvIExBU1QgKG5vdCBpbmNsdWRlZCkuIiIiCisgICAgICAgICIiIkRlbGV0ZSBpdGVtcyBmcm9tIEZJUlNUIHRvIExBU1QgKGluY2x1ZGVkKS4iIiIKICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdkZWxldGUnLCBmaXJzdCwgbGFzdCkKICAgICBkZWYgZ2V0KHNlbGYsIGZpcnN0LCBsYXN0PU5vbmUpOgotICAgICAgICAiIiJHZXQgbGlzdCBvZiBpdGVtcyBmcm9tIEZJUlNUIHRvIExBU1QgKG5vdCBpbmNsdWRlZCkuIiIiCi0gICAgICAgIGlmIGxhc3Q6CisgICAgICAgICIiIkdldCBsaXN0IG9mIGl0ZW1zIGZyb20gRklSU1QgdG8gTEFTVCAoaW5jbHVkZWQpLiIiIgorICAgICAgICBpZiBsYXN0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXRsaXN0KHNlbGYudGsuY2FsbCgKICAgICAgICAgICAgICAgICBzZWxmLl93LCAnZ2V0JywgZmlyc3QsIGxhc3QpKQogICAgICAgICBlbHNlOgpAQCAtMjUzNiw3ICsyNjE3LDcgQEAKICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdzZWxlY3Rpb24nLCAnYW5jaG9yJywgaW5kZXgpCiAgICAgc2VsZWN0X2FuY2hvciA9IHNlbGVjdGlvbl9hbmNob3IKICAgICBkZWYgc2VsZWN0aW9uX2NsZWFyKHNlbGYsIGZpcnN0LCBsYXN0PU5vbmUpOgotICAgICAgICAiIiJDbGVhciB0aGUgc2VsZWN0aW9uIGZyb20gRklSU1QgdG8gTEFTVCAobm90IGluY2x1ZGVkKS4iIiIKKyAgICAgICAgIiIiQ2xlYXIgdGhlIHNlbGVjdGlvbiBmcm9tIEZJUlNUIHRvIExBU1QgKGluY2x1ZGVkKS4iIiIKICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csCiAgICAgICAgICAgICAgICAgICdzZWxlY3Rpb24nLCAnY2xlYXInLCBmaXJzdCwgbGFzdCkKICAgICBzZWxlY3RfY2xlYXIgPSBzZWxlY3Rpb25fY2xlYXIKQEAgLTI1NDYsNyArMjYyNyw3IEBACiAgICAgICAgICAgICBzZWxmLl93LCAnc2VsZWN0aW9uJywgJ2luY2x1ZGVzJywgaW5kZXgpKQogICAgIHNlbGVjdF9pbmNsdWRlcyA9IHNlbGVjdGlvbl9pbmNsdWRlcwogICAgIGRlZiBzZWxlY3Rpb25fc2V0KHNlbGYsIGZpcnN0LCBsYXN0PU5vbmUpOgotICAgICAgICAiIiJTZXQgdGhlIHNlbGVjdGlvbiBmcm9tIEZJUlNUIHRvIExBU1QgKG5vdCBpbmNsdWRlZCkgd2l0aG91dAorICAgICAgICAiIiJTZXQgdGhlIHNlbGVjdGlvbiBmcm9tIEZJUlNUIHRvIExBU1QgKGluY2x1ZGVkKSB3aXRob3V0CiAgICAgICAgIGNoYW5naW5nIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZWxlbWVudHMuIiIiCiAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2VsZWN0aW9uJywgJ3NldCcsIGZpcnN0LCBsYXN0KQogICAgIHNlbGVjdF9zZXQgPSBzZWxlY3Rpb25fc2V0CkBAIC0yNTc5LDcgKzI2NjAsMTEgQEAKICAgICAgICAgc2VsZWN0Y29sb3IsIHRha2Vmb2N1cywgdGVhcm9mZiwgdGVhcm9mZmNvbW1hbmQsIHRpdGxlLCB0eXBlLiIiIgogICAgICAgICBXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAnbWVudScsIGNuZiwga3cpCiAgICAgZGVmIHRrX2JpbmRGb3JUcmF2ZXJzYWwoc2VsZik6Ci0gICAgICAgIHBhc3MgIyBvYnNvbGV0ZSBzaW5jZSBUayA0LjAKKyAgICAgICAgIyBvYnNvbGV0ZSBzaW5jZSBUayA0LjAKKyAgICAgICAgaW1wb3J0IHdhcm5pbmdzCisgICAgICAgIHdhcm5pbmdzLndhcm4oJ3RrX2JpbmRGb3JUcmF2ZXJzYWwoKSBkb2VzIG5vdGhpbmcgYW5kICcKKyAgICAgICAgICAgICAgICAgICAgICAnd2lsbCBiZSByZW1vdmVkIGluIDMuNicsCisgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgZGVmIHRrX21iUG9zdChzZWxmKToKICAgICAgICAgc2VsZi50ay5jYWxsKCd0a19tYlBvc3QnLCBzZWxmLl93KQogICAgIGRlZiB0a19tYlVucG9zdChzZWxmKToKQEAgLTI4NDYsOCArMjkzMSw5IEBACiAgICAgZGVmIGRlYnVnKHNlbGYsIGJvb2xlYW49Tm9uZSk6CiAgICAgICAgICIiIlR1cm4gb24gdGhlIGludGVybmFsIGNvbnNpc3RlbmN5IGNoZWNrcyBvZiB0aGUgQi1UcmVlIGluc2lkZSB0aGUgdGV4dAogICAgICAgICB3aWRnZXQgYWNjb3JkaW5nIHRvIEJPT0xFQU4uIiIiCi0gICAgICAgIHJldHVybiBzZWxmLnRrLmdldGJvb2xlYW4oc2VsZi50ay5jYWxsKAotICAgICAgICAgICAgc2VsZi5fdywgJ2RlYnVnJywgYm9vbGVhbikpCisgICAgICAgIGlmIGJvb2xlYW4gaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRrLmdldGJvb2xlYW4oc2VsZi50ay5jYWxsKHNlbGYuX3csICdkZWJ1ZycpKQorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2RlYnVnJywgYm9vbGVhbikKICAgICBkZWYgZGVsZXRlKHNlbGYsIGluZGV4MSwgaW5kZXgyPU5vbmUpOgogICAgICAgICAiIiJEZWxldGUgdGhlIGNoYXJhY3RlcnMgYmV0d2VlbiBJTkRFWDEgYW5kIElOREVYMiAobm90IGluY2x1ZGVkKS4iIiIKICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdkZWxldGUnLCBpbmRleDEsIGluZGV4MikKQEAgLTMxOTYsNiArMzI4Miw4IEBACiAgICAgICAgIGZvciBrLCB2IGluIGNuZi5pdGVtcygpOgogICAgICAgICAgICAgaWYgaGFzYXR0cih2LCAnX19jYWxsX18nKToKICAgICAgICAgICAgICAgICB2ID0gc2VsZi5fcmVnaXN0ZXIodikKKyAgICAgICAgICAgIGVsaWYgayBpbiAoJ2RhdGEnLCAnbWFza2RhdGEnKToKKyAgICAgICAgICAgICAgICB2ID0gc2VsZi50ay5fY3JlYXRlYnl0ZWFycmF5KHYpCiAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyArICgnLScraywgdikKICAgICAgICAgc2VsZi50ay5jYWxsKCgnaW1hZ2UnLCAnY3JlYXRlJywgaW1ndHlwZSwgbmFtZSwpICsgb3B0aW9ucykKICAgICAgICAgc2VsZi5uYW1lID0gbmFtZQpAQCAtMzIxOSw2ICszMzA3LDggQEAKICAgICAgICAgICAgICAgICBpZiBrWy0xXSA9PSAnXyc6IGsgPSBrWzotMV0KICAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKHYsICdfX2NhbGxfXycpOgogICAgICAgICAgICAgICAgICAgICB2ID0gc2VsZi5fcmVnaXN0ZXIodikKKyAgICAgICAgICAgICAgICBlbGlmIGsgaW4gKCdkYXRhJywgJ21hc2tkYXRhJyk6CisgICAgICAgICAgICAgICAgICAgIHYgPSBzZWxmLnRrLl9jcmVhdGVieXRlYXJyYXkodikKICAgICAgICAgICAgICAgICByZXMgPSByZXMgKyAoJy0nK2ssIHYpCiAgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5uYW1lLCAnY29uZmlnJykgKyByZXMpCiAgICAgY29uZmlnID0gY29uZmlndXJlCkBAIC0zMzAyLDggKzMzOTIsMTEgQEAKICAgICAgICAgVmFsaWQgcmVzb3VyY2UgbmFtZXM6IGJhY2tncm91bmQsIGRhdGEsIGZpbGUsIGZvcmVncm91bmQsIG1hc2tkYXRhLCBtYXNrZmlsZS4iIiIKICAgICAgICAgSW1hZ2UuX19pbml0X18oc2VsZiwgJ2JpdG1hcCcsIG5hbWUsIGNuZiwgbWFzdGVyLCAqKmt3KQogCi1kZWYgaW1hZ2VfbmFtZXMoKTogcmV0dXJuIF9kZWZhdWx0X3Jvb3QudGsuY2FsbCgnaW1hZ2UnLCAnbmFtZXMnKQotZGVmIGltYWdlX3R5cGVzKCk6IHJldHVybiBfZGVmYXVsdF9yb290LnRrLmNhbGwoJ2ltYWdlJywgJ3R5cGVzJykKK2RlZiBpbWFnZV9uYW1lcygpOgorICAgIHJldHVybiBfZGVmYXVsdF9yb290LnRrLnNwbGl0bGlzdChfZGVmYXVsdF9yb290LnRrLmNhbGwoJ2ltYWdlJywgJ25hbWVzJykpCisKK2RlZiBpbWFnZV90eXBlcygpOgorICAgIHJldHVybiBfZGVmYXVsdF9yb290LnRrLnNwbGl0bGlzdChfZGVmYXVsdF9yb290LnRrLmNhbGwoJ2ltYWdlJywgJ3R5cGVzJykpCiAKIAogY2xhc3MgU3BpbmJveChXaWRnZXQsIFhWaWV3KToKQEAgLTMzNDksNyArMzQ0Miw3IEBACiAgICAgICAgIGJvdW5kaW5nIGJveCBtYXkgcmVmZXIgdG8gYSByZWdpb24gb3V0c2lkZSB0aGUKICAgICAgICAgdmlzaWJsZSBhcmVhIG9mIHRoZSB3aW5kb3cuCiAgICAgICAgICIiIgotICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdiYm94JywgaW5kZXgpCisgICAgICAgIHJldHVybiBzZWxmLl9nZXRpbnRzKHNlbGYudGsuY2FsbChzZWxmLl93LCAnYmJveCcsIGluZGV4KSkgb3IgTm9uZQogCiAgICAgZGVmIGRlbGV0ZShzZWxmLCBmaXJzdCwgbGFzdD1Ob25lKToKICAgICAgICAgIiIiRGVsZXRlIG9uZSBvciBtb3JlIGVsZW1lbnRzIG9mIHRoZSBzcGluYm94LgpAQCAtMzY2MiwyMyArMzc1NSwxNyBAQAogCiAgICAgICAgICIiIgogICAgICAgICBpZiBjbmYgaXMgTm9uZSBhbmQgbm90IGt3OgotICAgICAgICAgICAgY25mID0ge30KLSAgICAgICAgICAgIGZvciB4IGluIHNlbGYudGsuc3BsaXQoCi0gICAgICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgJ3BhbmVjb25maWd1cmUnLCB0YWdPcklkKSk6Ci0gICAgICAgICAgICAgICAgY25mW3hbMF1bMTpdXSA9ICh4WzBdWzE6XSwpICsgeFsxOl0KLSAgICAgICAgICAgIHJldHVybiBjbmYKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRjb25maWd1cmUoc2VsZi5fdywgJ3BhbmVjb25maWd1cmUnLCB0YWdPcklkKQogICAgICAgICBpZiB0eXBlKGNuZikgPT0gU3RyaW5nVHlwZSBhbmQgbm90IGt3OgotICAgICAgICAgICAgeCA9IHNlbGYudGsuc3BsaXQoc2VsZi50ay5jYWxsKAotICAgICAgICAgICAgICAgIHNlbGYuX3csICdwYW5lY29uZmlndXJlJywgdGFnT3JJZCwgJy0nK2NuZikpCi0gICAgICAgICAgICByZXR1cm4gKHhbMF1bMTpdLCkgKyB4WzE6XQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldGNvbmZpZ3VyZTEoCisgICAgICAgICAgICAgICAgc2VsZi5fdywgJ3BhbmVjb25maWd1cmUnLCB0YWdPcklkLCAnLScrY25mKQogICAgICAgICBzZWxmLnRrLmNhbGwoKHNlbGYuX3csICdwYW5lY29uZmlndXJlJywgdGFnT3JJZCkgKwogICAgICAgICAgICAgICAgICBzZWxmLl9vcHRpb25zKGNuZiwga3cpKQogICAgIHBhbmVjb25maWcgPSBwYW5lY29uZmlndXJlCiAKICAgICBkZWYgcGFuZXMoc2VsZik6CiAgICAgICAgICIiIlJldHVybnMgYW4gb3JkZXJlZCBsaXN0IG9mIHRoZSBjaGlsZCBwYW5lcy4iIiIKLSAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAncGFuZXMnKQorICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdGxpc3Qoc2VsZi50ay5jYWxsKHNlbGYuX3csICdwYW5lcycpKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIEV4dGVuc2lvbnM6CmRpZmYgLS1naXQgYS9MaWIvbGliLXRrL3Rlc3QvcnVudGt0ZXN0cy5weSBiL0xpYi9saWItdGsvdGVzdC9ydW50a3Rlc3RzLnB5CmluZGV4IDk1ZTE3MjguLmQ0YjE4OTMgMTAwNjQ0Ci0tLSBhL0xpYi9saWItdGsvdGVzdC9ydW50a3Rlc3RzLnB5CisrKyBiL0xpYi9saWItdGsvdGVzdC9ydW50a3Rlc3RzLnB5CkBAIC0xNCw0OSArMTQsNiBAQAogCiB0aGlzX2Rpcl9wYXRoID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCiAKLV90a191bmF2YWlsYWJsZSA9IE5vbmUKLQotZGVmIGNoZWNrX3RrX2F2YWlsYWJpbGl0eSgpOgotICAgICIiIkNoZWNrIHRoYXQgVGsgaXMgaW5zdGFsbGVkIGFuZCBhdmFpbGFibGUuIiIiCi0gICAgZ2xvYmFsIF90a191bmF2YWlsYWJsZQotCi0gICAgaWYgX3RrX3VuYXZhaWxhYmxlIGlzIE5vbmU6Ci0gICAgICAgIF90a191bmF2YWlsYWJsZSA9IEZhbHNlCi0gICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKLSAgICAgICAgICAgICMgVGhlIEFxdWEgVGsgaW1wbGVtZW50YXRpb25zIG9uIE9TIFggY2FuIGFib3J0IHRoZSBwcm9jZXNzIGlmCi0gICAgICAgICAgICAjIGJlaW5nIGNhbGxlZCBpbiBhbiBlbnZpcm9ubWVudCB3aGVyZSBhIHdpbmRvdyBzZXJ2ZXIgY29ubmVjdGlvbgotICAgICAgICAgICAgIyBjYW5ub3QgYmUgbWFkZSwgZm9yIGluc3RhbmNlIHdoZW4gaW52b2tlZCBieSBhIGJ1aWxkYm90IG9yIHNzaAotICAgICAgICAgICAgIyBwcm9jZXNzIG5vdCBydW5uaW5nIHVuZGVyIHRoZSBzYW1lIHVzZXIgaWQgYXMgdGhlIGN1cnJlbnQgY29uc29sZQotICAgICAgICAgICAgIyB1c2VyLiAgVG8gYXZvaWQgdGhhdCwgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZSB3aW5kb3cgbWFuYWdlcgotICAgICAgICAgICAgIyBjb25uZWN0aW9uIGlzIG5vdCBhdmFpbGFibGUuCi0gICAgICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY2RsbCwgY19pbnQsIHBvaW50ZXIsIFN0cnVjdHVyZQotICAgICAgICAgICAgZnJvbSBjdHlwZXMudXRpbCBpbXBvcnQgZmluZF9saWJyYXJ5Ci0KLSAgICAgICAgICAgIGFwcF9zZXJ2aWNlcyA9IGNkbGwuTG9hZExpYnJhcnkoZmluZF9saWJyYXJ5KCJBcHBsaWNhdGlvblNlcnZpY2VzIikpCi0KLSAgICAgICAgICAgIGlmIGFwcF9zZXJ2aWNlcy5DR01haW5EaXNwbGF5SUQoKSA9PSAwOgotICAgICAgICAgICAgICAgIF90a191bmF2YWlsYWJsZSA9ICJjYW5ub3QgcnVuIHdpdGhvdXQgT1MgWCB3aW5kb3cgbWFuYWdlciIKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgY2xhc3MgUHJvY2Vzc1NlcmlhbE51bWJlcihTdHJ1Y3R1cmUpOgotICAgICAgICAgICAgICAgICAgICBfZmllbGRzXyA9IFsoImhpZ2hMb25nT2ZQU04iLCBjX2ludCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgibG93TG9uZ09mUFNOIiwgY19pbnQpXQotICAgICAgICAgICAgICAgIHBzbiA9IFByb2Nlc3NTZXJpYWxOdW1iZXIoKQotICAgICAgICAgICAgICAgIHBzbl9wID0gcG9pbnRlcihwc24pCi0gICAgICAgICAgICAgICAgaWYgKCAgKGFwcF9zZXJ2aWNlcy5HZXRDdXJyZW50UHJvY2Vzcyhwc25fcCkgPCAwKSBvcgotICAgICAgICAgICAgICAgICAgICAgIChhcHBfc2VydmljZXMuU2V0RnJvbnRQcm9jZXNzKHBzbl9wKSA8IDApICk6Ci0gICAgICAgICAgICAgICAgICAgIF90a191bmF2YWlsYWJsZSA9ICJjYW5ub3QgcnVuIHdpdGhvdXQgT1MgWCBndWkgcHJvY2VzcyIKLSAgICAgICAgZWxzZTogICAjIG5vdCBPUyBYCi0gICAgICAgICAgICBpbXBvcnQgVGtpbnRlcgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIFRraW50ZXIuQnV0dG9uKCkKLSAgICAgICAgICAgIGV4Y2VwdCBUa2ludGVyLlRjbEVycm9yIGFzIG1zZzoKLSAgICAgICAgICAgICAgICAjIGFzc3VtaW5nIHRrIGlzIG5vdCBhdmFpbGFibGUKLSAgICAgICAgICAgICAgICBfdGtfdW5hdmFpbGFibGUgPSAidGsgbm90IGF2YWlsYWJsZTogJXMiICUgbXNnCi0KLSAgICBpZiBfdGtfdW5hdmFpbGFibGU6Ci0gICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KF90a191bmF2YWlsYWJsZSkKLSAgICByZXR1cm4KLQogZGVmIGlzX3BhY2thZ2UocGF0aCk6CiAgICAgZm9yIG5hbWUgaW4gb3MubGlzdGRpcihwYXRoKToKICAgICAgICAgaWYgbmFtZSBpbiAoJ19faW5pdF9fLnB5JywgJ19faW5pdF9fLnB5YycsICdfX2luaXQucHlvJyk6CkBAIC02OCw3ICsyNSw3IEBACiAgICAgYW5kIGFyZSBpbnNpZGUgcGFja2FnZXMgZm91bmQgaW4gdGhlIHBhdGggc3RhcnRpbmcgYXQgYmFzZXBhdGguCiAKICAgICBJZiBwYWNrYWdlcyBpcyBzcGVjaWZpZWQgaXQgc2hvdWxkIGNvbnRhaW4gcGFja2FnZSBuYW1lcyB0aGF0IHdhbnQKLSAgICB0aGVpciB0ZXN0cyBjb2xsZXRlZC4KKyAgICB0aGVpciB0ZXN0cyBjb2xsZWN0ZWQuCiAgICAgIiIiCiAgICAgcHlfZXh0ID0gJy5weScKIApAQCAtMTEwLDUgKzY3LDQgQEAKICAgICAgICAgICAgICAgICB5aWVsZCB0ZXN0CiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgdGVzdC50ZXN0X3N1cHBvcnQudXNlX3Jlc291cmNlcyA9IFsnZ3VpJ10KICAgICB0ZXN0LnRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKmdldF90ZXN0cygpKQpkaWZmIC0tZ2l0IGEvTGliL2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X2ZvbnQucHkgYi9MaWIvbGliLXRrL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfZm9udC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTIwZjRkCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X2ZvbnQucHkKQEAgLTAsMCArMSwzNSBAQAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgVGtpbnRlcgorI2Zyb20gVGtpbnRlcgoraW1wb3J0IHRrRm9udCBhcyBmb250Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCByZXF1aXJlcywgcnVuX3VuaXR0ZXN0CitpbXBvcnQgdGVzdF90dGsuc3VwcG9ydCBhcyBzdXBwb3J0CisKK3JlcXVpcmVzKCdndWknKQorCitjbGFzcyBGb250VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cHBvcnQucm9vdF9kZWljb25pZnkoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzdXBwb3J0LnJvb3Rfd2l0aGRyYXcoKQorCisgICAgZGVmIHRlc3RfZm9udF9lcShzZWxmKToKKyAgICAgICAgZm9udG5hbWUgPSAiVGtEZWZhdWx0Rm9udCIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IGZvbnQuRm9udChuYW1lPWZvbnRuYW1lLCBleGlzdHM9VHJ1ZSkKKyAgICAgICAgZXhjZXB0IHRraW50ZXIuX3RraW50ZXIuVGNsRXJyb3I6CisgICAgICAgICAgICBmID0gZm9udC5Gb250KG5hbWU9Zm9udG5hbWUsIGV4aXN0cz1GYWxzZSkKKyAgICAgICAgZm9udDEgPSBmb250Lm5hbWV0b2ZvbnQoZm9udG5hbWUpCisgICAgICAgIGZvbnQyID0gZm9udC5uYW1ldG9mb250KGZvbnRuYW1lKQorICAgICAgICBzZWxmLmFzc2VydElzTm90KGZvbnQxLCBmb250MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb250MSwgZm9udDIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZm9udDEsIGZvbnQxLmNvcHkoKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChmb250MSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihmb250MSwgWzBdKQorCit0ZXN0c19ndWkgPSAoRm9udFRlc3QsICkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBydW5fdW5pdHRlc3QoKnRlc3RzX2d1aSkKZGlmZiAtLWdpdCBhL0xpYi9saWItdGsvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF9nZW9tZXRyeV9tYW5hZ2Vycy5weSBiL0xpYi9saWItdGsvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF9nZW9tZXRyeV9tYW5hZ2Vycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzYwMzlmCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X2dlb21ldHJ5X21hbmFnZXJzLnB5CkBAIC0wLDAgKzEsODg5IEBACitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCByZQoraW1wb3J0IFRraW50ZXIKK2Zyb20gVGtpbnRlciBpbXBvcnQgVGNsRXJyb3IKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJlcXVpcmVzLCBydW5fdW5pdHRlc3QKKworZnJvbSB0ZXN0X3R0ay5zdXBwb3J0IGltcG9ydCBwaXhlbHNfY29udiwgdGNsX3ZlcnNpb24sIHJlcXVpcmVzX3RjbAorZnJvbSB3aWRnZXRfdGVzdHMgaW1wb3J0IEFic3RyYWN0V2lkZ2V0VGVzdCwgaW50X3JvdW5kCisKK3JlcXVpcmVzKCdndWknKQorCisKK2NsYXNzIFBhY2tUZXN0KEFic3RyYWN0V2lkZ2V0VGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIGNyZWF0ZTIoc2VsZik6CisgICAgICAgIHBhY2sgPSBUa2ludGVyLlRvcGxldmVsKHNlbGYucm9vdCwgbmFtZT0ncGFjaycpCisgICAgICAgIHBhY2sud21fZ2VvbWV0cnkoJzMwMHgyMDArMCswJykKKyAgICAgICAgcGFjay53bV9taW5zaXplKDEsIDEpCisgICAgICAgIGEgPSBUa2ludGVyLkZyYW1lKHBhY2ssIG5hbWU9J2EnLCB3aWR0aD0yMCwgaGVpZ2h0PTQwLCBiZz0ncmVkJykKKyAgICAgICAgYiA9IFRraW50ZXIuRnJhbWUocGFjaywgbmFtZT0nYicsIHdpZHRoPTUwLCBoZWlnaHQ9MzAsIGJnPSdibHVlJykKKyAgICAgICAgYyA9IFRraW50ZXIuRnJhbWUocGFjaywgbmFtZT0nYycsIHdpZHRoPTgwLCBoZWlnaHQ9ODAsIGJnPSdncmVlbicpCisgICAgICAgIGQgPSBUa2ludGVyLkZyYW1lKHBhY2ssIG5hbWU9J2QnLCB3aWR0aD00MCwgaGVpZ2h0PTMwLCBiZz0neWVsbG93JykKKyAgICAgICAgcmV0dXJuIHBhY2ssIGEsIGIsIGMsIGQKKworICAgIGRlZiB0ZXN0X3BhY2tfY29uZmlndXJlX2FmdGVyKHNlbGYpOgorICAgICAgICBwYWNrLCBhLCBiLCBjLCBkID0gc2VsZi5jcmVhdGUyKCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUY2xFcnJvciwgJ3dpbmRvdyAiJXMiIGlzblwndCBwYWNrZWQnICUgYik6CisgICAgICAgICAgICBhLnBhY2tfY29uZmlndXJlKGFmdGVyPWIpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVGNsRXJyb3IsICdiYWQgd2luZG93IHBhdGggbmFtZSAiLmZvbyInKToKKyAgICAgICAgICAgIGEucGFja19jb25maWd1cmUoYWZ0ZXI9Jy5mb28nKQorICAgICAgICBhLnBhY2tfY29uZmlndXJlKHNpZGU9J3RvcCcpCisgICAgICAgIGIucGFja19jb25maWd1cmUoc2lkZT0ndG9wJykKKyAgICAgICAgYy5wYWNrX2NvbmZpZ3VyZShzaWRlPSd0b3AnKQorICAgICAgICBkLnBhY2tfY29uZmlndXJlKHNpZGU9J3RvcCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFjay5wYWNrX3NsYXZlcygpLCBbYSwgYiwgYywgZF0pCisgICAgICAgIGEucGFja19jb25maWd1cmUoYWZ0ZXI9YikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYWNrLnBhY2tfc2xhdmVzKCksIFtiLCBhLCBjLCBkXSkKKyAgICAgICAgYS5wYWNrX2NvbmZpZ3VyZShhZnRlcj1hKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhY2sucGFja19zbGF2ZXMoKSwgW2IsIGEsIGMsIGRdKQorCisgICAgZGVmIHRlc3RfcGFja19jb25maWd1cmVfYW5jaG9yKHNlbGYpOgorICAgICAgICBwYWNrLCBhLCBiLCBjLCBkID0gc2VsZi5jcmVhdGUyKCkKKyAgICAgICAgZGVmIGNoZWNrKGFuY2hvciwgZ2VvbSk6CisgICAgICAgICAgICBhLnBhY2tfY29uZmlndXJlKHNpZGU9J3RvcCcsIGlwYWR4PTUsIHBhZHg9MTAsIGlwYWR5PTE1LCBwYWR5PTIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmQ9VHJ1ZSwgYW5jaG9yPWFuY2hvcikKKyAgICAgICAgICAgIHNlbGYucm9vdC51cGRhdGUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLndpbmZvX2dlb21ldHJ5KCksIGdlb20pCisgICAgICAgIGNoZWNrKCduJywgJzMweDcwKzEzNSsyMCcpCisgICAgICAgIGNoZWNrKCduZScsICczMHg3MCsyNjArMjAnKQorICAgICAgICBjaGVjaygnZScsICczMHg3MCsyNjArNjUnKQorICAgICAgICBjaGVjaygnc2UnLCAnMzB4NzArMjYwKzExMCcpCisgICAgICAgIGNoZWNrKCdzJywgJzMweDcwKzEzNSsxMTAnKQorICAgICAgICBjaGVjaygnc3cnLCAnMzB4NzArMTArMTEwJykKKyAgICAgICAgY2hlY2soJ3cnLCAnMzB4NzArMTArNjUnKQorICAgICAgICBjaGVjaygnbncnLCAnMzB4NzArMTArMjAnKQorICAgICAgICBjaGVjaygnY2VudGVyJywgJzMweDcwKzEzNSs2NScpCisKKyAgICBkZWYgdGVzdF9wYWNrX2NvbmZpZ3VyZV9iZWZvcmUoc2VsZik6CisgICAgICAgIHBhY2ssIGEsIGIsIGMsIGQgPSBzZWxmLmNyZWF0ZTIoKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFRjbEVycm9yLCAnd2luZG93ICIlcyIgaXNuXCd0IHBhY2tlZCcgJSBiKToKKyAgICAgICAgICAgIGEucGFja19jb25maWd1cmUoYmVmb3JlPWIpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVGNsRXJyb3IsICdiYWQgd2luZG93IHBhdGggbmFtZSAiLmZvbyInKToKKyAgICAgICAgICAgIGEucGFja19jb25maWd1cmUoYmVmb3JlPScuZm9vJykKKyAgICAgICAgYS5wYWNrX2NvbmZpZ3VyZShzaWRlPSd0b3AnKQorICAgICAgICBiLnBhY2tfY29uZmlndXJlKHNpZGU9J3RvcCcpCisgICAgICAgIGMucGFja19jb25maWd1cmUoc2lkZT0ndG9wJykKKyAgICAgICAgZC5wYWNrX2NvbmZpZ3VyZShzaWRlPSd0b3AnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhY2sucGFja19zbGF2ZXMoKSwgW2EsIGIsIGMsIGRdKQorICAgICAgICBhLnBhY2tfY29uZmlndXJlKGJlZm9yZT1kKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhY2sucGFja19zbGF2ZXMoKSwgW2IsIGMsIGEsIGRdKQorICAgICAgICBhLnBhY2tfY29uZmlndXJlKGJlZm9yZT1hKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhY2sucGFja19zbGF2ZXMoKSwgW2IsIGMsIGEsIGRdKQorCisgICAgZGVmIHRlc3RfcGFja19jb25maWd1cmVfZXhwYW5kKHNlbGYpOgorICAgICAgICBwYWNrLCBhLCBiLCBjLCBkID0gc2VsZi5jcmVhdGUyKCkKKyAgICAgICAgZGVmIGNoZWNrKCpnZW9tcyk6CisgICAgICAgICAgICBzZWxmLnJvb3QudXBkYXRlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS53aW5mb19nZW9tZXRyeSgpLCBnZW9tc1swXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi53aW5mb19nZW9tZXRyeSgpLCBnZW9tc1sxXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy53aW5mb19nZW9tZXRyeSgpLCBnZW9tc1syXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC53aW5mb19nZW9tZXRyeSgpLCBnZW9tc1szXSkKKyAgICAgICAgYS5wYWNrX2NvbmZpZ3VyZShzaWRlPSdsZWZ0JykKKyAgICAgICAgYi5wYWNrX2NvbmZpZ3VyZShzaWRlPSd0b3AnKQorICAgICAgICBjLnBhY2tfY29uZmlndXJlKHNpZGU9J3JpZ2h0JykKKyAgICAgICAgZC5wYWNrX2NvbmZpZ3VyZShzaWRlPSdib3R0b20nKQorICAgICAgICBjaGVjaygnMjB4NDArMCs4MCcsICc1MHgzMCsxMzUrMCcsICc4MHg4MCsyMjArNzUnLCAnNDB4MzArMTAwKzE3MCcpCisgICAgICAgIGEucGFja19jb25maWd1cmUoc2lkZT0nbGVmdCcsIGV4cGFuZD0neWVzJykKKyAgICAgICAgYi5wYWNrX2NvbmZpZ3VyZShzaWRlPSd0b3AnLCBleHBhbmQ9J29uJykKKyAgICAgICAgYy5wYWNrX2NvbmZpZ3VyZShzaWRlPSdyaWdodCcsIGV4cGFuZD1UcnVlKQorICAgICAgICBkLnBhY2tfY29uZmlndXJlKHNpZGU9J2JvdHRvbScsIGV4cGFuZD0xKQorICAgICAgICBjaGVjaygnMjB4NDArNDArODAnLCAnNTB4MzArMTc1KzM1JywgJzgweDgwKzE4MCsxMTAnLCAnNDB4MzArMTAwKzEzNScpCisgICAgICAgIGEucGFja19jb25maWd1cmUoc2lkZT0nbGVmdCcsIGV4cGFuZD0neWVzJywgZmlsbD0nYm90aCcpCisgICAgICAgIGIucGFja19jb25maWd1cmUoc2lkZT0ndG9wJywgZXhwYW5kPSdvbicsIGZpbGw9J2JvdGgnKQorICAgICAgICBjLnBhY2tfY29uZmlndXJlKHNpZGU9J3JpZ2h0JywgZXhwYW5kPVRydWUsIGZpbGw9J2JvdGgnKQorICAgICAgICBkLnBhY2tfY29uZmlndXJlKHNpZGU9J2JvdHRvbScsIGV4cGFuZD0xLCBmaWxsPSdib3RoJykKKyAgICAgICAgY2hlY2soJzEwMHgyMDArMCswJywgJzIwMHgxMDArMTAwKzAnLCAnMTYweDEwMCsxNDArMTAwJywgJzQweDEwMCsxMDArMTAwJykKKworICAgIGRlZiB0ZXN0X3BhY2tfY29uZmlndXJlX2luKHNlbGYpOgorICAgICAgICBwYWNrLCBhLCBiLCBjLCBkID0gc2VsZi5jcmVhdGUyKCkKKyAgICAgICAgYS5wYWNrX2NvbmZpZ3VyZShzaWRlPSd0b3AnKQorICAgICAgICBiLnBhY2tfY29uZmlndXJlKHNpZGU9J3RvcCcpCisgICAgICAgIGMucGFja19jb25maWd1cmUoc2lkZT0ndG9wJykKKyAgICAgICAgZC5wYWNrX2NvbmZpZ3VyZShzaWRlPSd0b3AnKQorICAgICAgICBhLnBhY2tfY29uZmlndXJlKGluXz1wYWNrKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhY2sucGFja19zbGF2ZXMoKSwgW2IsIGMsIGQsIGFdKQorICAgICAgICBhLnBhY2tfY29uZmlndXJlKGluXz1jKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhY2sucGFja19zbGF2ZXMoKSwgW2IsIGMsIGRdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMucGFja19zbGF2ZXMoKSwgW2FdKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFRjbEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYW5cJ3QgcGFjayAlcyBpbnNpZGUgaXRzZWxmJyAlIChhLCkpOgorICAgICAgICAgICAgYS5wYWNrX2NvbmZpZ3VyZShpbl89YSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUY2xFcnJvciwgJ2JhZCB3aW5kb3cgcGF0aCBuYW1lICIuZm9vIicpOgorICAgICAgICAgICAgYS5wYWNrX2NvbmZpZ3VyZShpbl89Jy5mb28nKQorCisgICAgZGVmIHRlc3RfcGFja19jb25maWd1cmVfcGFkeF9pcGFkeF9maWxsKHNlbGYpOgorICAgICAgICBwYWNrLCBhLCBiLCBjLCBkID0gc2VsZi5jcmVhdGUyKCkKKyAgICAgICAgZGVmIGNoZWNrKGdlb20xLCBnZW9tMiwgKiprd2FyZ3MpOgorICAgICAgICAgICAgYS5wYWNrX2ZvcmdldCgpCisgICAgICAgICAgICBiLnBhY2tfZm9yZ2V0KCkKKyAgICAgICAgICAgIGEucGFja19jb25maWd1cmUoKiprd2FyZ3MpCisgICAgICAgICAgICBiLnBhY2tfY29uZmlndXJlKGV4cGFuZD1UcnVlLCBmaWxsPSdib3RoJykKKyAgICAgICAgICAgIHNlbGYucm9vdC51cGRhdGUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLndpbmZvX2dlb21ldHJ5KCksIGdlb20xKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLndpbmZvX2dlb21ldHJ5KCksIGdlb20yKQorICAgICAgICBjaGVjaygnMjB4NDArMjYwKzgwJywgJzI0MHgyMDArMCswJywgc2lkZT0ncmlnaHQnLCBwYWR4PTIwKQorICAgICAgICBjaGVjaygnMjB4NDArMjUwKzgwJywgJzI0MHgyMDArMCswJywgc2lkZT0ncmlnaHQnLCBwYWR4PSgxMCwgMzApKQorICAgICAgICBjaGVjaygnNjB4NDArMjQwKzgwJywgJzI0MHgyMDArMCswJywgc2lkZT0ncmlnaHQnLCBpcGFkeD0yMCkKKyAgICAgICAgY2hlY2soJzMweDQwKzI2MCs4MCcsICcyNTB4MjAwKzArMCcsIHNpZGU9J3JpZ2h0JywgaXBhZHg9NSwgcGFkeD0xMCkKKyAgICAgICAgY2hlY2soJzIweDQwKzI2MCs4MCcsICcyNDB4MjAwKzArMCcsIHNpZGU9J3JpZ2h0JywgcGFkeD0yMCwgZmlsbD0neCcpCisgICAgICAgIGNoZWNrKCcyMHg0MCsyNDkrODAnLCAnMjQweDIwMCswKzAnLAorICAgICAgICAgICAgICBzaWRlPSdyaWdodCcsIHBhZHg9KDksIDMxKSwgZmlsbD0neCcpCisgICAgICAgIGNoZWNrKCc2MHg0MCsyNDArODAnLCAnMjQweDIwMCswKzAnLCBzaWRlPSdyaWdodCcsIGlwYWR4PTIwLCBmaWxsPSd4JykKKyAgICAgICAgY2hlY2soJzMweDQwKzI2MCs4MCcsICcyNTB4MjAwKzArMCcsCisgICAgICAgICAgICAgIHNpZGU9J3JpZ2h0JywgaXBhZHg9NSwgcGFkeD0xMCwgZmlsbD0neCcpCisgICAgICAgIGNoZWNrKCczMHg0MCsyNTUrODAnLCAnMjUweDIwMCswKzAnLAorICAgICAgICAgICAgICBzaWRlPSdyaWdodCcsIGlwYWR4PTUsIHBhZHg9KDUsIDE1KSwgZmlsbD0neCcpCisgICAgICAgIGNoZWNrKCcyMHg0MCsxNDArMCcsICczMDB4MTYwKzArNDAnLCBzaWRlPSd0b3AnLCBwYWR4PTIwKQorICAgICAgICBjaGVjaygnMjB4NDArMTIwKzAnLCAnMzAweDE2MCswKzQwJywgc2lkZT0ndG9wJywgcGFkeD0oMCwgNDApKQorICAgICAgICBjaGVjaygnNjB4NDArMTIwKzAnLCAnMzAweDE2MCswKzQwJywgc2lkZT0ndG9wJywgaXBhZHg9MjApCisgICAgICAgIGNoZWNrKCczMHg0MCsxMzUrMCcsICczMDB4MTYwKzArNDAnLCBzaWRlPSd0b3AnLCBpcGFkeD01LCBwYWR4PTEwKQorICAgICAgICBjaGVjaygnMzB4NDArMTMwKzAnLCAnMzAweDE2MCswKzQwJywgc2lkZT0ndG9wJywgaXBhZHg9NSwgcGFkeD0oNSwgMTUpKQorICAgICAgICBjaGVjaygnMjYweDQwKzIwKzAnLCAnMzAweDE2MCswKzQwJywgc2lkZT0ndG9wJywgcGFkeD0yMCwgZmlsbD0neCcpCisgICAgICAgIGNoZWNrKCcyNjB4NDArMjUrMCcsICczMDB4MTYwKzArNDAnLAorICAgICAgICAgICAgICBzaWRlPSd0b3AnLCBwYWR4PSgyNSwgMTUpLCBmaWxsPSd4JykKKyAgICAgICAgY2hlY2soJzMwMHg0MCswKzAnLCAnMzAweDE2MCswKzQwJywgc2lkZT0ndG9wJywgaXBhZHg9MjAsIGZpbGw9J3gnKQorICAgICAgICBjaGVjaygnMjgweDQwKzEwKzAnLCAnMzAweDE2MCswKzQwJywKKyAgICAgICAgICAgICAgc2lkZT0ndG9wJywgaXBhZHg9NSwgcGFkeD0xMCwgZmlsbD0neCcpCisgICAgICAgIGNoZWNrKCcyODB4NDArNSswJywgJzMwMHgxNjArMCs0MCcsCisgICAgICAgICAgICAgIHNpZGU9J3RvcCcsIGlwYWR4PTUsIHBhZHg9KDUsIDE1KSwgZmlsbD0neCcpCisgICAgICAgIGEucGFja19jb25maWd1cmUocGFkeD0nMWMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEucGFja19pbmZvKClbJ3BhZHgnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zdHIocGFjay53aW5mb19waXhlbHMoJzFjJykpKQorICAgICAgICBhLnBhY2tfY29uZmlndXJlKGlwYWR4PScxYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5wYWNrX2luZm8oKVsnaXBhZHgnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zdHIocGFjay53aW5mb19waXhlbHMoJzFjJykpKQorCisgICAgZGVmIHRlc3RfcGFja19jb25maWd1cmVfcGFkeV9pcGFkeV9maWxsKHNlbGYpOgorICAgICAgICBwYWNrLCBhLCBiLCBjLCBkID0gc2VsZi5jcmVhdGUyKCkKKyAgICAgICAgZGVmIGNoZWNrKGdlb20xLCBnZW9tMiwgKiprd2FyZ3MpOgorICAgICAgICAgICAgYS5wYWNrX2ZvcmdldCgpCisgICAgICAgICAgICBiLnBhY2tfZm9yZ2V0KCkKKyAgICAgICAgICAgIGEucGFja19jb25maWd1cmUoKiprd2FyZ3MpCisgICAgICAgICAgICBiLnBhY2tfY29uZmlndXJlKGV4cGFuZD1UcnVlLCBmaWxsPSdib3RoJykKKyAgICAgICAgICAgIHNlbGYucm9vdC51cGRhdGUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLndpbmZvX2dlb21ldHJ5KCksIGdlb20xKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLndpbmZvX2dlb21ldHJ5KCksIGdlb20yKQorICAgICAgICBjaGVjaygnMjB4NDArMjgwKzgwJywgJzI4MHgyMDArMCswJywgc2lkZT0ncmlnaHQnLCBwYWR5PTIwKQorICAgICAgICBjaGVjaygnMjB4NDArMjgwKzcwJywgJzI4MHgyMDArMCswJywgc2lkZT0ncmlnaHQnLCBwYWR5PSgxMCwgMzApKQorICAgICAgICBjaGVjaygnMjB4ODArMjgwKzYwJywgJzI4MHgyMDArMCswJywgc2lkZT0ncmlnaHQnLCBpcGFkeT0yMCkKKyAgICAgICAgY2hlY2soJzIweDUwKzI4MCs3NScsICcyODB4MjAwKzArMCcsIHNpZGU9J3JpZ2h0JywgaXBhZHk9NSwgcGFkeT0xMCkKKyAgICAgICAgY2hlY2soJzIweDQwKzI4MCs4MCcsICcyODB4MjAwKzArMCcsIHNpZGU9J3JpZ2h0JywgcGFkeT0yMCwgZmlsbD0neCcpCisgICAgICAgIGNoZWNrKCcyMHg0MCsyODArNjknLCAnMjgweDIwMCswKzAnLAorICAgICAgICAgICAgICBzaWRlPSdyaWdodCcsIHBhZHk9KDksIDMxKSwgZmlsbD0neCcpCisgICAgICAgIGNoZWNrKCcyMHg4MCsyODArNjAnLCAnMjgweDIwMCswKzAnLCBzaWRlPSdyaWdodCcsIGlwYWR5PTIwLCBmaWxsPSd4JykKKyAgICAgICAgY2hlY2soJzIweDUwKzI4MCs3NScsICcyODB4MjAwKzArMCcsCisgICAgICAgICAgICAgIHNpZGU9J3JpZ2h0JywgaXBhZHk9NSwgcGFkeT0xMCwgZmlsbD0neCcpCisgICAgICAgIGNoZWNrKCcyMHg1MCsyODArNzAnLCAnMjgweDIwMCswKzAnLAorICAgICAgICAgICAgICBzaWRlPSdyaWdodCcsIGlwYWR5PTUsIHBhZHk9KDUsIDE1KSwgZmlsbD0neCcpCisgICAgICAgIGNoZWNrKCcyMHg0MCsxNDArMjAnLCAnMzAweDEyMCswKzgwJywgc2lkZT0ndG9wJywgcGFkeT0yMCkKKyAgICAgICAgY2hlY2soJzIweDQwKzE0MCswJywgJzMwMHgxMjArMCs4MCcsIHNpZGU9J3RvcCcsIHBhZHk9KDAsIDQwKSkKKyAgICAgICAgY2hlY2soJzIweDgwKzE0MCswJywgJzMwMHgxMjArMCs4MCcsIHNpZGU9J3RvcCcsIGlwYWR5PTIwKQorICAgICAgICBjaGVjaygnMjB4NTArMTQwKzEwJywgJzMwMHgxMzArMCs3MCcsIHNpZGU9J3RvcCcsIGlwYWR5PTUsIHBhZHk9MTApCisgICAgICAgIGNoZWNrKCcyMHg1MCsxNDArNScsICczMDB4MTMwKzArNzAnLCBzaWRlPSd0b3AnLCBpcGFkeT01LCBwYWR5PSg1LCAxNSkpCisgICAgICAgIGNoZWNrKCczMDB4NDArMCsyMCcsICczMDB4MTIwKzArODAnLCBzaWRlPSd0b3AnLCBwYWR5PTIwLCBmaWxsPSd4JykKKyAgICAgICAgY2hlY2soJzMwMHg0MCswKzI1JywgJzMwMHgxMjArMCs4MCcsCisgICAgICAgICAgICAgIHNpZGU9J3RvcCcsIHBhZHk9KDI1LCAxNSksIGZpbGw9J3gnKQorICAgICAgICBjaGVjaygnMzAweDgwKzArMCcsICczMDB4MTIwKzArODAnLCBzaWRlPSd0b3AnLCBpcGFkeT0yMCwgZmlsbD0neCcpCisgICAgICAgIGNoZWNrKCczMDB4NTArMCsxMCcsICczMDB4MTMwKzArNzAnLAorICAgICAgICAgICAgICBzaWRlPSd0b3AnLCBpcGFkeT01LCBwYWR5PTEwLCBmaWxsPSd4JykKKyAgICAgICAgY2hlY2soJzMwMHg1MCswKzUnLCAnMzAweDEzMCswKzcwJywKKyAgICAgICAgICAgICAgc2lkZT0ndG9wJywgaXBhZHk9NSwgcGFkeT0oNSwgMTUpLCBmaWxsPSd4JykKKyAgICAgICAgYS5wYWNrX2NvbmZpZ3VyZShwYWR5PScxYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5wYWNrX2luZm8oKVsncGFkeSddLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3N0cihwYWNrLndpbmZvX3BpeGVscygnMWMnKSkpCisgICAgICAgIGEucGFja19jb25maWd1cmUoaXBhZHk9JzFjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLnBhY2tfaW5mbygpWydpcGFkeSddLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3N0cihwYWNrLndpbmZvX3BpeGVscygnMWMnKSkpCisKKyAgICBkZWYgdGVzdF9wYWNrX2NvbmZpZ3VyZV9zaWRlKHNlbGYpOgorICAgICAgICBwYWNrLCBhLCBiLCBjLCBkID0gc2VsZi5jcmVhdGUyKCkKKyAgICAgICAgZGVmIGNoZWNrKHNpZGUsIGdlb20xLCBnZW9tMik6CisgICAgICAgICAgICBhLnBhY2tfY29uZmlndXJlKHNpZGU9c2lkZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5wYWNrX2luZm8oKVsnc2lkZSddLCBzaWRlKQorICAgICAgICAgICAgYi5wYWNrX2NvbmZpZ3VyZShleHBhbmQ9VHJ1ZSwgZmlsbD0nYm90aCcpCisgICAgICAgICAgICBzZWxmLnJvb3QudXBkYXRlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS53aW5mb19nZW9tZXRyeSgpLCBnZW9tMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi53aW5mb19nZW9tZXRyeSgpLCBnZW9tMikKKyAgICAgICAgY2hlY2soJ3RvcCcsICcyMHg0MCsxNDArMCcsICczMDB4MTYwKzArNDAnKQorICAgICAgICBjaGVjaygnYm90dG9tJywgJzIweDQwKzE0MCsxNjAnLCAnMzAweDE2MCswKzAnKQorICAgICAgICBjaGVjaygnbGVmdCcsICcyMHg0MCswKzgwJywgJzI4MHgyMDArMjArMCcpCisgICAgICAgIGNoZWNrKCdyaWdodCcsICcyMHg0MCsyODArODAnLCAnMjgweDIwMCswKzAnKQorCisgICAgZGVmIHRlc3RfcGFja19mb3JnZXQoc2VsZik6CisgICAgICAgIHBhY2ssIGEsIGIsIGMsIGQgPSBzZWxmLmNyZWF0ZTIoKQorICAgICAgICBhLnBhY2tfY29uZmlndXJlKCkKKyAgICAgICAgYi5wYWNrX2NvbmZpZ3VyZSgpCisgICAgICAgIGMucGFja19jb25maWd1cmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhY2sucGFja19zbGF2ZXMoKSwgW2EsIGIsIGNdKQorICAgICAgICBiLnBhY2tfZm9yZ2V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYWNrLnBhY2tfc2xhdmVzKCksIFthLCBjXSkKKyAgICAgICAgYi5wYWNrX2ZvcmdldCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFjay5wYWNrX3NsYXZlcygpLCBbYSwgY10pCisgICAgICAgIGQucGFja19mb3JnZXQoKQorCisgICAgZGVmIHRlc3RfcGFja19pbmZvKHNlbGYpOgorICAgICAgICBwYWNrLCBhLCBiLCBjLCBkID0gc2VsZi5jcmVhdGUyKCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUY2xFcnJvciwgJ3dpbmRvdyAiJXMiIGlzblwndCBwYWNrZWQnICUgYSk6CisgICAgICAgICAgICBhLnBhY2tfaW5mbygpCisgICAgICAgIGEucGFja19jb25maWd1cmUoKQorICAgICAgICBiLnBhY2tfY29uZmlndXJlKHNpZGU9J3JpZ2h0JywgaW5fPWEsIGFuY2hvcj0ncycsIGV4cGFuZD1UcnVlLCBmaWxsPSd4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpcGFkeD01LCBwYWR4PTEwLCBpcGFkeT0yLCBwYWR5PSg1LCAxNSkpCisgICAgICAgIGluZm8gPSBhLnBhY2tfaW5mbygpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShpbmZvLCBkaWN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm9bJ2FuY2hvciddLCAnY2VudGVyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvWydleHBhbmQnXSwgc2VsZi5fc3RyKDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm9bJ2ZpbGwnXSwgJ25vbmUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm9bJ2luJ10sIHBhY2spCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mb1snaXBhZHgnXSwgc2VsZi5fc3RyKDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm9bJ2lwYWR5J10sIHNlbGYuX3N0cigwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvWydwYWR4J10sIHNlbGYuX3N0cigwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvWydwYWR5J10sIHNlbGYuX3N0cigwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvWydzaWRlJ10sICd0b3AnKQorICAgICAgICBpbmZvID0gYi5wYWNrX2luZm8oKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoaW5mbywgZGljdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvWydhbmNob3InXSwgJ3MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm9bJ2V4cGFuZCddLCBzZWxmLl9zdHIoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mb1snZmlsbCddLCAneCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mb1snaW4nXSwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvWydpcGFkeCddLCBzZWxmLl9zdHIoNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mb1snaXBhZHknXSwgc2VsZi5fc3RyKDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm9bJ3BhZHgnXSwgc2VsZi5fc3RyKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvWydwYWR5J10sIHNlbGYuX3N0cigoNSwgMTUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvWydzaWRlJ10sICdyaWdodCcpCisKKyAgICBkZWYgdGVzdF9wYWNrX3Byb3BhZ2F0ZShzZWxmKToKKyAgICAgICAgcGFjaywgYSwgYiwgYywgZCA9IHNlbGYuY3JlYXRlMigpCisgICAgICAgIHBhY2suY29uZmlndXJlKHdpZHRoPTMwMCwgaGVpZ2h0PTIwMCkKKyAgICAgICAgYS5wYWNrX2NvbmZpZ3VyZSgpCisgICAgICAgIHBhY2sucGFja19wcm9wYWdhdGUoRmFsc2UpCisgICAgICAgIHNlbGYucm9vdC51cGRhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhY2sud2luZm9fcmVxd2lkdGgoKSwgMzAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhY2sud2luZm9fcmVxaGVpZ2h0KCksIDIwMCkKKyAgICAgICAgcGFjay5wYWNrX3Byb3BhZ2F0ZShUcnVlKQorICAgICAgICBzZWxmLnJvb3QudXBkYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYWNrLndpbmZvX3JlcXdpZHRoKCksIDIwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhY2sud2luZm9fcmVxaGVpZ2h0KCksIDQwKQorCisgICAgZGVmIHRlc3RfcGFja19zbGF2ZXMoc2VsZik6CisgICAgICAgIHBhY2ssIGEsIGIsIGMsIGQgPSBzZWxmLmNyZWF0ZTIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhY2sucGFja19zbGF2ZXMoKSwgW10pCisgICAgICAgIGEucGFja19jb25maWd1cmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhY2sucGFja19zbGF2ZXMoKSwgW2FdKQorICAgICAgICBiLnBhY2tfY29uZmlndXJlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYWNrLnBhY2tfc2xhdmVzKCksIFthLCBiXSkKKworCitjbGFzcyBQbGFjZVRlc3QoQWJzdHJhY3RXaWRnZXRUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgY3JlYXRlMihzZWxmKToKKyAgICAgICAgdCA9IFRraW50ZXIuVG9wbGV2ZWwoc2VsZi5yb290LCB3aWR0aD0zMDAsIGhlaWdodD0yMDAsIGJkPTApCisgICAgICAgIHQud21fZ2VvbWV0cnkoJyswKzAnKQorICAgICAgICBmID0gVGtpbnRlci5GcmFtZSh0LCB3aWR0aD0xNTQsIGhlaWdodD04NCwgYmQ9MiwgcmVsaWVmPSdyYWlzZWQnKQorICAgICAgICBmLnBsYWNlX2NvbmZpZ3VyZSh4PTQ4LCB5PTM4KQorICAgICAgICBmMiA9IFRraW50ZXIuRnJhbWUodCwgd2lkdGg9MzAsIGhlaWdodD02MCwgYmQ9MiwgcmVsaWVmPSdyYWlzZWQnKQorICAgICAgICBzZWxmLnJvb3QudXBkYXRlKCkKKyAgICAgICAgcmV0dXJuIHQsIGYsIGYyCisKKyAgICBkZWYgdGVzdF9wbGFjZV9jb25maWd1cmVfaW4oc2VsZik6CisgICAgICAgIHQsIGYsIGYyID0gc2VsZi5jcmVhdGUyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmMi53aW5mb19tYW5hZ2VyKCksICcnKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFRjbEVycm9yLCAiY2FuJ3QgcGxhY2UgJXMgcmVsYXRpdmUgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdHNlbGYiICUgcmUuZXNjYXBlKHN0cihmMikpKToKKyAgICAgICAgICAgIGYyLnBsYWNlX2NvbmZpZ3VyZShpbl89ZjIpCisgICAgICAgIGlmIHRjbF92ZXJzaW9uID49ICg4LCA1KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZjIud2luZm9fbWFuYWdlcigpLCAnJykKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUY2xFcnJvciwgJ2JhZCB3aW5kb3cgcGF0aCBuYW1lJyk6CisgICAgICAgICAgICBmMi5wbGFjZV9jb25maWd1cmUoaW5fPSdzcGFtJykKKyAgICAgICAgZjIucGxhY2VfY29uZmlndXJlKGluXz1mKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYyLndpbmZvX21hbmFnZXIoKSwgJ3BsYWNlJykKKworICAgIGRlZiB0ZXN0X3BsYWNlX2NvbmZpZ3VyZV94KHNlbGYpOgorICAgICAgICB0LCBmLCBmMiA9IHNlbGYuY3JlYXRlMigpCisgICAgICAgIGYyLnBsYWNlX2NvbmZpZ3VyZShpbl89ZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmMi5wbGFjZV9pbmZvKClbJ3gnXSwgJzAnKQorICAgICAgICBzZWxmLnJvb3QudXBkYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmMi53aW5mb194KCksIDUwKQorICAgICAgICBmMi5wbGFjZV9jb25maWd1cmUoeD0xMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZjIucGxhY2VfaW5mbygpWyd4J10sICcxMDAnKQorICAgICAgICBzZWxmLnJvb3QudXBkYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmMi53aW5mb194KCksIDE1MCkKKyAgICAgICAgZjIucGxhY2VfY29uZmlndXJlKHg9LTEwLCByZWx4PTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZjIucGxhY2VfaW5mbygpWyd4J10sICctMTAnKQorICAgICAgICBzZWxmLnJvb3QudXBkYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmMi53aW5mb194KCksIDE5MCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUY2xFcnJvciwgJ2JhZCBzY3JlZW4gZGlzdGFuY2UgInNwYW0iJyk6CisgICAgICAgICAgICBmMi5wbGFjZV9jb25maWd1cmUoaW5fPWYsIHg9J3NwYW0nKQorCisgICAgZGVmIHRlc3RfcGxhY2VfY29uZmlndXJlX3koc2VsZik6CisgICAgICAgIHQsIGYsIGYyID0gc2VsZi5jcmVhdGUyKCkKKyAgICAgICAgZjIucGxhY2VfY29uZmlndXJlKGluXz1mKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYyLnBsYWNlX2luZm8oKVsneSddLCAnMCcpCisgICAgICAgIHNlbGYucm9vdC51cGRhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYyLndpbmZvX3koKSwgNDApCisgICAgICAgIGYyLnBsYWNlX2NvbmZpZ3VyZSh5PTUwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYyLnBsYWNlX2luZm8oKVsneSddLCAnNTAnKQorICAgICAgICBzZWxmLnJvb3QudXBkYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmMi53aW5mb195KCksIDkwKQorICAgICAgICBmMi5wbGFjZV9jb25maWd1cmUoeT0tMTAsIHJlbHk9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmMi5wbGFjZV9pbmZvKClbJ3knXSwgJy0xMCcpCisgICAgICAgIHNlbGYucm9vdC51cGRhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYyLndpbmZvX3koKSwgMTEwKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFRjbEVycm9yLCAnYmFkIHNjcmVlbiBkaXN0YW5jZSAic3BhbSInKToKKyAgICAgICAgICAgIGYyLnBsYWNlX2NvbmZpZ3VyZShpbl89ZiwgeT0nc3BhbScpCisKKyAgICBkZWYgdGVzdF9wbGFjZV9jb25maWd1cmVfcmVseChzZWxmKToKKyAgICAgICAgdCwgZiwgZjIgPSBzZWxmLmNyZWF0ZTIoKQorICAgICAgICBmMi5wbGFjZV9jb25maWd1cmUoaW5fPWYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZjIucGxhY2VfaW5mbygpWydyZWx4J10sICcwJykKKyAgICAgICAgc2VsZi5yb290LnVwZGF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZjIud2luZm9feCgpLCA1MCkKKyAgICAgICAgZjIucGxhY2VfY29uZmlndXJlKHJlbHg9MC41KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYyLnBsYWNlX2luZm8oKVsncmVseCddLCAnMC41JykKKyAgICAgICAgc2VsZi5yb290LnVwZGF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZjIud2luZm9feCgpLCAxMjUpCisgICAgICAgIGYyLnBsYWNlX2NvbmZpZ3VyZShyZWx4PTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZjIucGxhY2VfaW5mbygpWydyZWx4J10sICcxJykKKyAgICAgICAgc2VsZi5yb290LnVwZGF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZjIud2luZm9feCgpLCAyMDApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVGNsRXJyb3IsICdleHBlY3RlZCBmbG9hdGluZy1wb2ludCBudW1iZXIgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidXQgZ290ICJzcGFtIicpOgorICAgICAgICAgICAgZjIucGxhY2VfY29uZmlndXJlKGluXz1mLCByZWx4PSdzcGFtJykKKworICAgIGRlZiB0ZXN0X3BsYWNlX2NvbmZpZ3VyZV9yZWx5KHNlbGYpOgorICAgICAgICB0LCBmLCBmMiA9IHNlbGYuY3JlYXRlMigpCisgICAgICAgIGYyLnBsYWNlX2NvbmZpZ3VyZShpbl89ZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmMi5wbGFjZV9pbmZvKClbJ3JlbHknXSwgJzAnKQorICAgICAgICBzZWxmLnJvb3QudXBkYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmMi53aW5mb195KCksIDQwKQorICAgICAgICBmMi5wbGFjZV9jb25maWd1cmUocmVseT0wLjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZjIucGxhY2VfaW5mbygpWydyZWx5J10sICcwLjUnKQorICAgICAgICBzZWxmLnJvb3QudXBkYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmMi53aW5mb195KCksIDgwKQorICAgICAgICBmMi5wbGFjZV9jb25maWd1cmUocmVseT0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYyLnBsYWNlX2luZm8oKVsncmVseSddLCAnMScpCisgICAgICAgIHNlbGYucm9vdC51cGRhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYyLndpbmZvX3koKSwgMTIwKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFRjbEVycm9yLCAnZXhwZWN0ZWQgZmxvYXRpbmctcG9pbnQgbnVtYmVyICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnV0IGdvdCAic3BhbSInKToKKyAgICAgICAgICAgIGYyLnBsYWNlX2NvbmZpZ3VyZShpbl89ZiwgcmVseT0nc3BhbScpCisKKyAgICBkZWYgdGVzdF9wbGFjZV9jb25maWd1cmVfYW5jaG9yKHNlbGYpOgorICAgICAgICBmID0gVGtpbnRlci5GcmFtZShzZWxmLnJvb3QpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVGNsRXJyb3IsICdiYWQgYW5jaG9yICJqIicpOgorICAgICAgICAgICAgZi5wbGFjZV9jb25maWd1cmUoYW5jaG9yPSdqJykKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUY2xFcnJvciwgJ2FtYmlndW91cyBhbmNob3IgIiInKToKKyAgICAgICAgICAgIGYucGxhY2VfY29uZmlndXJlKGFuY2hvcj0nJykKKyAgICAgICAgZm9yIHZhbHVlIGluICduJywgJ25lJywgJ2UnLCAnc2UnLCAncycsICdzdycsICd3JywgJ253JywgJ2NlbnRlcic6CisgICAgICAgICAgICBmLnBsYWNlX2NvbmZpZ3VyZShhbmNob3I9dmFsdWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucGxhY2VfaW5mbygpWydhbmNob3InXSwgdmFsdWUpCisKKyAgICBkZWYgdGVzdF9wbGFjZV9jb25maWd1cmVfd2lkdGgoc2VsZik6CisgICAgICAgIHQsIGYsIGYyID0gc2VsZi5jcmVhdGUyKCkKKyAgICAgICAgZjIucGxhY2VfY29uZmlndXJlKGluXz1mLCB3aWR0aD0xMjApCisgICAgICAgIHNlbGYucm9vdC51cGRhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYyLndpbmZvX3dpZHRoKCksIDEyMCkKKyAgICAgICAgZjIucGxhY2VfY29uZmlndXJlKHdpZHRoPScnKQorICAgICAgICBzZWxmLnJvb3QudXBkYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmMi53aW5mb193aWR0aCgpLCAzMCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUY2xFcnJvciwgJ2JhZCBzY3JlZW4gZGlzdGFuY2UgImFiY2QiJyk6CisgICAgICAgICAgICBmMi5wbGFjZV9jb25maWd1cmUod2lkdGg9J2FiY2QnKQorCisgICAgZGVmIHRlc3RfcGxhY2VfY29uZmlndXJlX2hlaWdodChzZWxmKToKKyAgICAgICAgdCwgZiwgZjIgPSBzZWxmLmNyZWF0ZTIoKQorICAgICAgICBmMi5wbGFjZV9jb25maWd1cmUoaW5fPWYsIGhlaWdodD0xMjApCisgICAgICAgIHNlbGYucm9vdC51cGRhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYyLndpbmZvX2hlaWdodCgpLCAxMjApCisgICAgICAgIGYyLnBsYWNlX2NvbmZpZ3VyZShoZWlnaHQ9JycpCisgICAgICAgIHNlbGYucm9vdC51cGRhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYyLndpbmZvX2hlaWdodCgpLCA2MCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUY2xFcnJvciwgJ2JhZCBzY3JlZW4gZGlzdGFuY2UgImFiY2QiJyk6CisgICAgICAgICAgICBmMi5wbGFjZV9jb25maWd1cmUoaGVpZ2h0PSdhYmNkJykKKworICAgIGRlZiB0ZXN0X3BsYWNlX2NvbmZpZ3VyZV9yZWx3aWR0aChzZWxmKToKKyAgICAgICAgdCwgZiwgZjIgPSBzZWxmLmNyZWF0ZTIoKQorICAgICAgICBmMi5wbGFjZV9jb25maWd1cmUoaW5fPWYsIHJlbHdpZHRoPTAuNSkKKyAgICAgICAgc2VsZi5yb290LnVwZGF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZjIud2luZm9fd2lkdGgoKSwgNzUpCisgICAgICAgIGYyLnBsYWNlX2NvbmZpZ3VyZShyZWx3aWR0aD0nJykKKyAgICAgICAgc2VsZi5yb290LnVwZGF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZjIud2luZm9fd2lkdGgoKSwgMzApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVGNsRXJyb3IsICdleHBlY3RlZCBmbG9hdGluZy1wb2ludCBudW1iZXIgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidXQgZ290ICJhYmNkIicpOgorICAgICAgICAgICAgZjIucGxhY2VfY29uZmlndXJlKHJlbHdpZHRoPSdhYmNkJykKKworICAgIGRlZiB0ZXN0X3BsYWNlX2NvbmZpZ3VyZV9yZWxoZWlnaHQoc2VsZik6CisgICAgICAgIHQsIGYsIGYyID0gc2VsZi5jcmVhdGUyKCkKKyAgICAgICAgZjIucGxhY2VfY29uZmlndXJlKGluXz1mLCByZWxoZWlnaHQ9MC41KQorICAgICAgICBzZWxmLnJvb3QudXBkYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmMi53aW5mb19oZWlnaHQoKSwgNDApCisgICAgICAgIGYyLnBsYWNlX2NvbmZpZ3VyZShyZWxoZWlnaHQ9JycpCisgICAgICAgIHNlbGYucm9vdC51cGRhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYyLndpbmZvX2hlaWdodCgpLCA2MCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUY2xFcnJvciwgJ2V4cGVjdGVkIGZsb2F0aW5nLXBvaW50IG51bWJlciAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1dCBnb3QgImFiY2QiJyk6CisgICAgICAgICAgICBmMi5wbGFjZV9jb25maWd1cmUocmVsaGVpZ2h0PSdhYmNkJykKKworICAgIGRlZiB0ZXN0X3BsYWNlX2NvbmZpZ3VyZV9ib3JkZXJtb2RlKHNlbGYpOgorICAgICAgICBmID0gVGtpbnRlci5GcmFtZShzZWxmLnJvb3QpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVGNsRXJyb3IsICdiYWQgYm9yZGVybW9kZSAiaiInKToKKyAgICAgICAgICAgIGYucGxhY2VfY29uZmlndXJlKGJvcmRlcm1vZGU9J2onKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFRjbEVycm9yLCAnYW1iaWd1b3VzIGJvcmRlcm1vZGUgIiInKToKKyAgICAgICAgICAgIGYucGxhY2VfY29uZmlndXJlKGJvcmRlcm1vZGU9JycpCisgICAgICAgIGZvciB2YWx1ZSBpbiAnaW5zaWRlJywgJ291dHNpZGUnLCAnaWdub3JlJzoKKyAgICAgICAgICAgIGYucGxhY2VfY29uZmlndXJlKGJvcmRlcm1vZGU9dmFsdWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucGxhY2VfaW5mbygpWydib3JkZXJtb2RlJ10sIHZhbHVlKQorCisgICAgZGVmIHRlc3RfcGxhY2VfZm9yZ2V0KHNlbGYpOgorICAgICAgICBmb28gPSBUa2ludGVyLkZyYW1lKHNlbGYucm9vdCkKKyAgICAgICAgZm9vLnBsYWNlX2NvbmZpZ3VyZSh3aWR0aD01MCwgaGVpZ2h0PTUwKQorICAgICAgICBzZWxmLnJvb3QudXBkYXRlKCkKKyAgICAgICAgZm9vLnBsYWNlX2ZvcmdldCgpCisgICAgICAgIHNlbGYucm9vdC51cGRhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGZvby53aW5mb19pc21hcHBlZCgpKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBmb28ucGxhY2VfZm9yZ2V0KDApCisKKyAgICBkZWYgdGVzdF9wbGFjZV9pbmZvKHNlbGYpOgorICAgICAgICB0LCBmLCBmMiA9IHNlbGYuY3JlYXRlMigpCisgICAgICAgIGYyLnBsYWNlX2NvbmZpZ3VyZShpbl89ZiwgeD0xLCB5PTIsIHdpZHRoPTMsIGhlaWdodD00LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVseD0wLjEsIHJlbHk9MC4yLCByZWx3aWR0aD0wLjMsIHJlbGhlaWdodD0wLjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3I9J3NlJywgYm9yZGVybW9kZT0nb3V0c2lkZScpCisgICAgICAgIGluZm8gPSBmMi5wbGFjZV9pbmZvKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGluZm8sIGRpY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mb1sneCddLCAnMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mb1sneSddLCAnMicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mb1snd2lkdGgnXSwgJzMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm9bJ2hlaWdodCddLCAnNCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mb1sncmVseCddLCAnMC4xJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvWydyZWx5J10sICcwLjInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm9bJ3JlbHdpZHRoJ10sICcwLjMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm9bJ3JlbGhlaWdodCddLCAnMC40JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvWydhbmNob3InXSwgJ3NlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvWydib3JkZXJtb2RlJ10sICdvdXRzaWRlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvWyd4J10sICcxJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvWyd4J10sICcxJykKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgZjIucGxhY2VfaW5mbygwKQorCisgICAgZGVmIHRlc3RfcGxhY2Vfc2xhdmVzKHNlbGYpOgorICAgICAgICBmb28gPSBUa2ludGVyLkZyYW1lKHNlbGYucm9vdCkKKyAgICAgICAgYmFyID0gVGtpbnRlci5GcmFtZShzZWxmLnJvb3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9vLnBsYWNlX3NsYXZlcygpLCBbXSkKKyAgICAgICAgYmFyLnBsYWNlX2NvbmZpZ3VyZShpbl89Zm9vKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvby5wbGFjZV9zbGF2ZXMoKSwgW2Jhcl0pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIGZvby5wbGFjZV9zbGF2ZXMoMCkKKworCitjbGFzcyBHcmlkVGVzdChBYnN0cmFjdFdpZGdldFRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc3VwZXIoR3JpZFRlc3QsIHNlbGYpLnRlYXJEb3duKCkKKyAgICAgICAgY29scywgcm93cyA9IHNlbGYucm9vdC5ncmlkX3NpemUoKQorICAgICAgICBmb3IgaSBpbiByYW5nZShjb2xzICsgMSk6CisgICAgICAgICAgICBzZWxmLnJvb3QuZ3JpZF9jb2x1bW5jb25maWd1cmUoaSwgd2VpZ2h0PTAsIG1pbnNpemU9MCwgcGFkPTAsIHVuaWZvcm09JycpCisgICAgICAgIGZvciBpIGluIHJhbmdlKHJvd3MgKyAxKToKKyAgICAgICAgICAgIHNlbGYucm9vdC5ncmlkX3Jvd2NvbmZpZ3VyZShpLCB3ZWlnaHQ9MCwgbWluc2l6ZT0wLCBwYWQ9MCwgdW5pZm9ybT0nJykKKyAgICAgICAgc2VsZi5yb290LmdyaWRfcHJvcGFnYXRlKDEpCisKKyAgICBkZWYgdGVzdF9ncmlkX2NvbmZpZ3VyZShzZWxmKToKKyAgICAgICAgYiA9IFRraW50ZXIuQnV0dG9uKHNlbGYucm9vdCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKGIuZGVzdHJveSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmdyaWRfaW5mbygpLCB7fSkKKyAgICAgICAgYi5ncmlkX2NvbmZpZ3VyZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5ncmlkX2luZm8oKVsnaW4nXSwgc2VsZi5yb290KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuZ3JpZF9pbmZvKClbJ2NvbHVtbiddLCBzZWxmLl9zdHIoMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5ncmlkX2luZm8oKVsncm93J10sIHNlbGYuX3N0cigwKSkKKyAgICAgICAgYi5ncmlkX2NvbmZpZ3VyZSh7J2NvbHVtbic6IDF9LCByb3c9MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmdyaWRfaW5mbygpWydjb2x1bW4nXSwgc2VsZi5fc3RyKDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuZ3JpZF9pbmZvKClbJ3JvdyddLCBzZWxmLl9zdHIoMikpCisKKyAgICBkZWYgdGVzdF9ncmlkX2NvbmZpZ3VyZV9jb2x1bW4oc2VsZik6CisgICAgICAgIGIgPSBUa2ludGVyLkJ1dHRvbihzZWxmLnJvb3QpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVGNsRXJyb3IsICdiYWQgY29sdW1uIHZhbHVlICItMSI6ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyJyk6CisgICAgICAgICAgICBiLmdyaWRfY29uZmlndXJlKGNvbHVtbj0tMSkKKyAgICAgICAgYi5ncmlkX2NvbmZpZ3VyZShjb2x1bW49MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmdyaWRfaW5mbygpWydjb2x1bW4nXSwgc2VsZi5fc3RyKDIpKQorCisgICAgZGVmIHRlc3RfZ3JpZF9jb25maWd1cmVfY29sdW1uc3BhbihzZWxmKToKKyAgICAgICAgYiA9IFRraW50ZXIuQnV0dG9uKHNlbGYucm9vdCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUY2xFcnJvciwgJ2JhZCBjb2x1bW5zcGFuIHZhbHVlICIwIjogJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlcicpOgorICAgICAgICAgICAgYi5ncmlkX2NvbmZpZ3VyZShjb2x1bW5zcGFuPTApCisgICAgICAgIGIuZ3JpZF9jb25maWd1cmUoY29sdW1uc3Bhbj0yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuZ3JpZF9pbmZvKClbJ2NvbHVtbnNwYW4nXSwgc2VsZi5fc3RyKDIpKQorCisgICAgZGVmIHRlc3RfZ3JpZF9jb25maWd1cmVfaW4oc2VsZik6CisgICAgICAgIGYgPSBUa2ludGVyLkZyYW1lKHNlbGYucm9vdCkKKyAgICAgICAgYiA9IFRraW50ZXIuQnV0dG9uKHNlbGYucm9vdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmdyaWRfaW5mbygpLCB7fSkKKyAgICAgICAgYi5ncmlkX2NvbmZpZ3VyZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5ncmlkX2luZm8oKVsnaW4nXSwgc2VsZi5yb290KQorICAgICAgICBiLmdyaWRfY29uZmlndXJlKGluXz1mKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuZ3JpZF9pbmZvKClbJ2luJ10sIGYpCisgICAgICAgIGIuZ3JpZF9jb25maWd1cmUoeydpbic6IHNlbGYucm9vdH0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5ncmlkX2luZm8oKVsnaW4nXSwgc2VsZi5yb290KQorCisgICAgZGVmIHRlc3RfZ3JpZF9jb25maWd1cmVfaXBhZHgoc2VsZik6CisgICAgICAgIGIgPSBUa2ludGVyLkJ1dHRvbihzZWxmLnJvb3QpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVGNsRXJyb3IsICdiYWQgaXBhZHggdmFsdWUgIi0xIjogJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtdXN0IGJlIHBvc2l0aXZlIHNjcmVlbiBkaXN0YW5jZScpOgorICAgICAgICAgICAgYi5ncmlkX2NvbmZpZ3VyZShpcGFkeD0tMSkKKyAgICAgICAgYi5ncmlkX2NvbmZpZ3VyZShpcGFkeD0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuZ3JpZF9pbmZvKClbJ2lwYWR4J10sIHNlbGYuX3N0cigxKSkKKyAgICAgICAgYi5ncmlkX2NvbmZpZ3VyZShpcGFkeD0nLjVjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmdyaWRfaW5mbygpWydpcGFkeCddLAorICAgICAgICAgICAgICAgIHNlbGYuX3N0cihpbnRfcm91bmQocGl4ZWxzX2NvbnYoJy41YycpICogc2VsZi5zY2FsaW5nKSkpCisKKyAgICBkZWYgdGVzdF9ncmlkX2NvbmZpZ3VyZV9pcGFkeShzZWxmKToKKyAgICAgICAgYiA9IFRraW50ZXIuQnV0dG9uKHNlbGYucm9vdCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUY2xFcnJvciwgJ2JhZCBpcGFkeSB2YWx1ZSAiLTEiOiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ211c3QgYmUgcG9zaXRpdmUgc2NyZWVuIGRpc3RhbmNlJyk6CisgICAgICAgICAgICBiLmdyaWRfY29uZmlndXJlKGlwYWR5PS0xKQorICAgICAgICBiLmdyaWRfY29uZmlndXJlKGlwYWR5PTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5ncmlkX2luZm8oKVsnaXBhZHknXSwgc2VsZi5fc3RyKDEpKQorICAgICAgICBiLmdyaWRfY29uZmlndXJlKGlwYWR5PScuNWMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuZ3JpZF9pbmZvKClbJ2lwYWR5J10sCisgICAgICAgICAgICAgICAgc2VsZi5fc3RyKGludF9yb3VuZChwaXhlbHNfY29udignLjVjJykgKiBzZWxmLnNjYWxpbmcpKSkKKworICAgIGRlZiB0ZXN0X2dyaWRfY29uZmlndXJlX3BhZHgoc2VsZik6CisgICAgICAgIGIgPSBUa2ludGVyLkJ1dHRvbihzZWxmLnJvb3QpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVGNsRXJyb3IsICdiYWQgcGFkIHZhbHVlICItMSI6ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXVzdCBiZSBwb3NpdGl2ZSBzY3JlZW4gZGlzdGFuY2UnKToKKyAgICAgICAgICAgIGIuZ3JpZF9jb25maWd1cmUocGFkeD0tMSkKKyAgICAgICAgYi5ncmlkX2NvbmZpZ3VyZShwYWR4PTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5ncmlkX2luZm8oKVsncGFkeCddLCBzZWxmLl9zdHIoMSkpCisgICAgICAgIGIuZ3JpZF9jb25maWd1cmUocGFkeD0oMTAsIDUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuZ3JpZF9pbmZvKClbJ3BhZHgnXSwgc2VsZi5fc3RyKCgxMCwgNSkpKQorICAgICAgICBiLmdyaWRfY29uZmlndXJlKHBhZHg9Jy41YycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5ncmlkX2luZm8oKVsncGFkeCddLAorICAgICAgICAgICAgICAgIHNlbGYuX3N0cihpbnRfcm91bmQocGl4ZWxzX2NvbnYoJy41YycpICogc2VsZi5zY2FsaW5nKSkpCisKKyAgICBkZWYgdGVzdF9ncmlkX2NvbmZpZ3VyZV9wYWR5KHNlbGYpOgorICAgICAgICBiID0gVGtpbnRlci5CdXR0b24oc2VsZi5yb290KQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFRjbEVycm9yLCAnYmFkIHBhZCB2YWx1ZSAiLTEiOiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ211c3QgYmUgcG9zaXRpdmUgc2NyZWVuIGRpc3RhbmNlJyk6CisgICAgICAgICAgICBiLmdyaWRfY29uZmlndXJlKHBhZHk9LTEpCisgICAgICAgIGIuZ3JpZF9jb25maWd1cmUocGFkeT0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuZ3JpZF9pbmZvKClbJ3BhZHknXSwgc2VsZi5fc3RyKDEpKQorICAgICAgICBiLmdyaWRfY29uZmlndXJlKHBhZHk9KDEwLCA1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmdyaWRfaW5mbygpWydwYWR5J10sIHNlbGYuX3N0cigoMTAsIDUpKSkKKyAgICAgICAgYi5ncmlkX2NvbmZpZ3VyZShwYWR5PScuNWMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuZ3JpZF9pbmZvKClbJ3BhZHknXSwKKyAgICAgICAgICAgICAgICBzZWxmLl9zdHIoaW50X3JvdW5kKHBpeGVsc19jb252KCcuNWMnKSAqIHNlbGYuc2NhbGluZykpKQorCisgICAgZGVmIHRlc3RfZ3JpZF9jb25maWd1cmVfcm93KHNlbGYpOgorICAgICAgICBiID0gVGtpbnRlci5CdXR0b24oc2VsZi5yb290KQorICAgICAgICBzZWxmLmFkZENsZWFudXAoYi5kZXN0cm95KQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFRjbEVycm9yLCAnYmFkIChyb3d8Z3JpZCkgdmFsdWUgIi0xIjogJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKToKKyAgICAgICAgICAgIGIuZ3JpZF9jb25maWd1cmUocm93PS0xKQorICAgICAgICBiLmdyaWRfY29uZmlndXJlKHJvdz0yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuZ3JpZF9pbmZvKClbJ3JvdyddLCBzZWxmLl9zdHIoMikpCisKKyAgICBkZWYgdGVzdF9ncmlkX2NvbmZpZ3VyZV9yb3duc3BhbihzZWxmKToKKyAgICAgICAgYiA9IFRraW50ZXIuQnV0dG9uKHNlbGYucm9vdCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUY2xFcnJvciwgJ2JhZCByb3dzcGFuIHZhbHVlICIwIjogJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlcicpOgorICAgICAgICAgICAgYi5ncmlkX2NvbmZpZ3VyZShyb3dzcGFuPTApCisgICAgICAgIGIuZ3JpZF9jb25maWd1cmUocm93c3Bhbj0yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuZ3JpZF9pbmZvKClbJ3Jvd3NwYW4nXSwgc2VsZi5fc3RyKDIpKQorCisgICAgZGVmIHRlc3RfZ3JpZF9jb25maWd1cmVfc3RpY2t5KHNlbGYpOgorICAgICAgICBmID0gVGtpbnRlci5GcmFtZShzZWxmLnJvb3QsIGJnPSdyZWQnKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFRjbEVycm9yLCAnYmFkIHN0aWNreW5lc3MgdmFsdWUgImdsdWUiJyk6CisgICAgICAgICAgICBmLmdyaWRfY29uZmlndXJlKHN0aWNreT0nZ2x1ZScpCisgICAgICAgIGYuZ3JpZF9jb25maWd1cmUoc3RpY2t5PSduZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5ncmlkX2luZm8oKVsnc3RpY2t5J10sICduZScpCisgICAgICAgIGYuZ3JpZF9jb25maWd1cmUoc3RpY2t5PSduLHMsZSx3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmdyaWRfaW5mbygpWydzdGlja3knXSwgJ25lc3cnKQorCisgICAgZGVmIHRlc3RfZ3JpZF9jb2x1bW5jb25maWd1cmUoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIHNlbGYucm9vdC5ncmlkX2NvbHVtbmNvbmZpZ3VyZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yb290LmdyaWRfY29sdW1uY29uZmlndXJlKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgIHsnbWluc2l6ZSc6IDAsICdwYWQnOiAwLCAndW5pZm9ybSc6IE5vbmUsICd3ZWlnaHQnOiAwfSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUY2xFcnJvciwgJ2JhZCBvcHRpb24gIi1mb28iJyk6CisgICAgICAgICAgICBzZWxmLnJvb3QuZ3JpZF9jb2x1bW5jb25maWd1cmUoMCwgJ2ZvbycpCisgICAgICAgIHNlbGYucm9vdC5ncmlkX2NvbHVtbmNvbmZpZ3VyZSgoMCwgMyksIHdlaWdodD0yKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFRjbEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtdXN0IHNwZWNpZnkgYSBzaW5nbGUgZWxlbWVudCBvbiByZXRyaWV2YWwnKToKKyAgICAgICAgICAgIHNlbGYucm9vdC5ncmlkX2NvbHVtbmNvbmZpZ3VyZSgoMCwgMykpCisgICAgICAgIGIgPSBUa2ludGVyLkJ1dHRvbihzZWxmLnJvb3QpCisgICAgICAgIGIuZ3JpZF9jb25maWd1cmUoY29sdW1uPTAsIHJvdz0wKQorICAgICAgICBpZiB0Y2xfdmVyc2lvbiA+PSAoOCwgNSk6CisgICAgICAgICAgICBzZWxmLnJvb3QuZ3JpZF9jb2x1bW5jb25maWd1cmUoJ2FsbCcsIHdlaWdodD0zKQorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUY2xFcnJvciwgJ2V4cGVjdGVkIGludGVnZXIgYnV0IGdvdCAiYWxsIicpOgorICAgICAgICAgICAgICAgIHNlbGYucm9vdC5ncmlkX2NvbHVtbmNvbmZpZ3VyZSgnYWxsJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yb290LmdyaWRfY29sdW1uY29uZmlndXJlKDAsICd3ZWlnaHQnKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJvb3QuZ3JpZF9jb2x1bW5jb25maWd1cmUoMywgJ3dlaWdodCcpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucm9vdC5ncmlkX2NvbHVtbmNvbmZpZ3VyZSgyNjUsICd3ZWlnaHQnKSwgMCkKKyAgICAgICAgaWYgdGNsX3ZlcnNpb24gPj0gKDgsIDUpOgorICAgICAgICAgICAgc2VsZi5yb290LmdyaWRfY29sdW1uY29uZmlndXJlKGIsIHdlaWdodD00KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJvb3QuZ3JpZF9jb2x1bW5jb25maWd1cmUoMCwgJ3dlaWdodCcpLCA0KQorCisgICAgZGVmIHRlc3RfZ3JpZF9jb2x1bW5jb25maWd1cmVfbWluc2l6ZShzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUY2xFcnJvciwgJ2JhZCBzY3JlZW4gZGlzdGFuY2UgImZvbyInKToKKyAgICAgICAgICAgIHNlbGYucm9vdC5ncmlkX2NvbHVtbmNvbmZpZ3VyZSgwLCBtaW5zaXplPSdmb28nKQorICAgICAgICBzZWxmLnJvb3QuZ3JpZF9jb2x1bW5jb25maWd1cmUoMCwgbWluc2l6ZT0xMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJvb3QuZ3JpZF9jb2x1bW5jb25maWd1cmUoMCwgJ21pbnNpemUnKSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yb290LmdyaWRfY29sdW1uY29uZmlndXJlKDApWydtaW5zaXplJ10sIDEwKQorCisgICAgZGVmIHRlc3RfZ3JpZF9jb2x1bW5jb25maWd1cmVfd2VpZ2h0KHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFRjbEVycm9yLCAnZXhwZWN0ZWQgaW50ZWdlciBidXQgZ290ICJiYWQiJyk6CisgICAgICAgICAgICBzZWxmLnJvb3QuZ3JpZF9jb2x1bW5jb25maWd1cmUoMCwgd2VpZ2h0PSdiYWQnKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFRjbEVycm9yLCAnaW52YWxpZCBhcmcgIi13ZWlnaHQiOiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Nob3VsZCBiZSBub24tbmVnYXRpdmUnKToKKyAgICAgICAgICAgIHNlbGYucm9vdC5ncmlkX2NvbHVtbmNvbmZpZ3VyZSgwLCB3ZWlnaHQ9LTMpCisgICAgICAgIHNlbGYucm9vdC5ncmlkX2NvbHVtbmNvbmZpZ3VyZSgwLCB3ZWlnaHQ9MykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJvb3QuZ3JpZF9jb2x1bW5jb25maWd1cmUoMCwgJ3dlaWdodCcpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucm9vdC5ncmlkX2NvbHVtbmNvbmZpZ3VyZSgwKVsnd2VpZ2h0J10sIDMpCisKKyAgICBkZWYgdGVzdF9ncmlkX2NvbHVtbmNvbmZpZ3VyZV9wYWQoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVGNsRXJyb3IsICdiYWQgc2NyZWVuIGRpc3RhbmNlICJmb28iJyk6CisgICAgICAgICAgICBzZWxmLnJvb3QuZ3JpZF9jb2x1bW5jb25maWd1cmUoMCwgcGFkPSdmb28nKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFRjbEVycm9yLCAnaW52YWxpZCBhcmcgIi1wYWQiOiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Nob3VsZCBiZSBub24tbmVnYXRpdmUnKToKKyAgICAgICAgICAgIHNlbGYucm9vdC5ncmlkX2NvbHVtbmNvbmZpZ3VyZSgwLCBwYWQ9LTMpCisgICAgICAgIHNlbGYucm9vdC5ncmlkX2NvbHVtbmNvbmZpZ3VyZSgwLCBwYWQ9MykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJvb3QuZ3JpZF9jb2x1bW5jb25maWd1cmUoMCwgJ3BhZCcpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucm9vdC5ncmlkX2NvbHVtbmNvbmZpZ3VyZSgwKVsncGFkJ10sIDMpCisKKyAgICBkZWYgdGVzdF9ncmlkX2NvbHVtbmNvbmZpZ3VyZV91bmlmb3JtKHNlbGYpOgorICAgICAgICBzZWxmLnJvb3QuZ3JpZF9jb2x1bW5jb25maWd1cmUoMCwgdW5pZm9ybT0nZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJvb3QuZ3JpZF9jb2x1bW5jb25maWd1cmUoMCwgJ3VuaWZvcm0nKSwgJ2ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yb290LmdyaWRfY29sdW1uY29uZmlndXJlKDApWyd1bmlmb3JtJ10sICdmb28nKQorCisgICAgZGVmIHRlc3RfZ3JpZF9yb3djb25maWd1cmUoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIHNlbGYucm9vdC5ncmlkX3Jvd2NvbmZpZ3VyZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yb290LmdyaWRfcm93Y29uZmlndXJlKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgIHsnbWluc2l6ZSc6IDAsICdwYWQnOiAwLCAndW5pZm9ybSc6IE5vbmUsICd3ZWlnaHQnOiAwfSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUY2xFcnJvciwgJ2JhZCBvcHRpb24gIi1mb28iJyk6CisgICAgICAgICAgICBzZWxmLnJvb3QuZ3JpZF9yb3djb25maWd1cmUoMCwgJ2ZvbycpCisgICAgICAgIHNlbGYucm9vdC5ncmlkX3Jvd2NvbmZpZ3VyZSgoMCwgMyksIHdlaWdodD0yKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFRjbEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtdXN0IHNwZWNpZnkgYSBzaW5nbGUgZWxlbWVudCBvbiByZXRyaWV2YWwnKToKKyAgICAgICAgICAgIHNlbGYucm9vdC5ncmlkX3Jvd2NvbmZpZ3VyZSgoMCwgMykpCisgICAgICAgIGIgPSBUa2ludGVyLkJ1dHRvbihzZWxmLnJvb3QpCisgICAgICAgIGIuZ3JpZF9jb25maWd1cmUoY29sdW1uPTAsIHJvdz0wKQorICAgICAgICBpZiB0Y2xfdmVyc2lvbiA+PSAoOCwgNSk6CisgICAgICAgICAgICBzZWxmLnJvb3QuZ3JpZF9yb3djb25maWd1cmUoJ2FsbCcsIHdlaWdodD0zKQorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUY2xFcnJvciwgJ2V4cGVjdGVkIGludGVnZXIgYnV0IGdvdCAiYWxsIicpOgorICAgICAgICAgICAgICAgIHNlbGYucm9vdC5ncmlkX3Jvd2NvbmZpZ3VyZSgnYWxsJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yb290LmdyaWRfcm93Y29uZmlndXJlKDAsICd3ZWlnaHQnKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJvb3QuZ3JpZF9yb3djb25maWd1cmUoMywgJ3dlaWdodCcpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucm9vdC5ncmlkX3Jvd2NvbmZpZ3VyZSgyNjUsICd3ZWlnaHQnKSwgMCkKKyAgICAgICAgaWYgdGNsX3ZlcnNpb24gPj0gKDgsIDUpOgorICAgICAgICAgICAgc2VsZi5yb290LmdyaWRfcm93Y29uZmlndXJlKGIsIHdlaWdodD00KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJvb3QuZ3JpZF9yb3djb25maWd1cmUoMCwgJ3dlaWdodCcpLCA0KQorCisgICAgZGVmIHRlc3RfZ3JpZF9yb3djb25maWd1cmVfbWluc2l6ZShzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUY2xFcnJvciwgJ2JhZCBzY3JlZW4gZGlzdGFuY2UgImZvbyInKToKKyAgICAgICAgICAgIHNlbGYucm9vdC5ncmlkX3Jvd2NvbmZpZ3VyZSgwLCBtaW5zaXplPSdmb28nKQorICAgICAgICBzZWxmLnJvb3QuZ3JpZF9yb3djb25maWd1cmUoMCwgbWluc2l6ZT0xMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJvb3QuZ3JpZF9yb3djb25maWd1cmUoMCwgJ21pbnNpemUnKSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yb290LmdyaWRfcm93Y29uZmlndXJlKDApWydtaW5zaXplJ10sIDEwKQorCisgICAgZGVmIHRlc3RfZ3JpZF9yb3djb25maWd1cmVfd2VpZ2h0KHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFRjbEVycm9yLCAnZXhwZWN0ZWQgaW50ZWdlciBidXQgZ290ICJiYWQiJyk6CisgICAgICAgICAgICBzZWxmLnJvb3QuZ3JpZF9yb3djb25maWd1cmUoMCwgd2VpZ2h0PSdiYWQnKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFRjbEVycm9yLCAnaW52YWxpZCBhcmcgIi13ZWlnaHQiOiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Nob3VsZCBiZSBub24tbmVnYXRpdmUnKToKKyAgICAgICAgICAgIHNlbGYucm9vdC5ncmlkX3Jvd2NvbmZpZ3VyZSgwLCB3ZWlnaHQ9LTMpCisgICAgICAgIHNlbGYucm9vdC5ncmlkX3Jvd2NvbmZpZ3VyZSgwLCB3ZWlnaHQ9MykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJvb3QuZ3JpZF9yb3djb25maWd1cmUoMCwgJ3dlaWdodCcpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucm9vdC5ncmlkX3Jvd2NvbmZpZ3VyZSgwKVsnd2VpZ2h0J10sIDMpCisKKyAgICBkZWYgdGVzdF9ncmlkX3Jvd2NvbmZpZ3VyZV9wYWQoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVGNsRXJyb3IsICdiYWQgc2NyZWVuIGRpc3RhbmNlICJmb28iJyk6CisgICAgICAgICAgICBzZWxmLnJvb3QuZ3JpZF9yb3djb25maWd1cmUoMCwgcGFkPSdmb28nKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFRjbEVycm9yLCAnaW52YWxpZCBhcmcgIi1wYWQiOiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Nob3VsZCBiZSBub24tbmVnYXRpdmUnKToKKyAgICAgICAgICAgIHNlbGYucm9vdC5ncmlkX3Jvd2NvbmZpZ3VyZSgwLCBwYWQ9LTMpCisgICAgICAgIHNlbGYucm9vdC5ncmlkX3Jvd2NvbmZpZ3VyZSgwLCBwYWQ9MykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJvb3QuZ3JpZF9yb3djb25maWd1cmUoMCwgJ3BhZCcpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucm9vdC5ncmlkX3Jvd2NvbmZpZ3VyZSgwKVsncGFkJ10sIDMpCisKKyAgICBkZWYgdGVzdF9ncmlkX3Jvd2NvbmZpZ3VyZV91bmlmb3JtKHNlbGYpOgorICAgICAgICBzZWxmLnJvb3QuZ3JpZF9yb3djb25maWd1cmUoMCwgdW5pZm9ybT0nZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJvb3QuZ3JpZF9yb3djb25maWd1cmUoMCwgJ3VuaWZvcm0nKSwgJ2ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yb290LmdyaWRfcm93Y29uZmlndXJlKDApWyd1bmlmb3JtJ10sICdmb28nKQorCisgICAgZGVmIHRlc3RfZ3JpZF9mb3JnZXQoc2VsZik6CisgICAgICAgIGIgPSBUa2ludGVyLkJ1dHRvbihzZWxmLnJvb3QpCisgICAgICAgIGMgPSBUa2ludGVyLkJ1dHRvbihzZWxmLnJvb3QpCisgICAgICAgIGIuZ3JpZF9jb25maWd1cmUocm93PTIsIGNvbHVtbj0yLCByb3dzcGFuPTIsIGNvbHVtbnNwYW49MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYWR4PTMsIHBhZHk9NCwgc3RpY2t5PSducycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yb290LmdyaWRfc2xhdmVzKCksIFtiXSkKKyAgICAgICAgYi5ncmlkX2ZvcmdldCgpCisgICAgICAgIGMuZ3JpZF9mb3JnZXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucm9vdC5ncmlkX3NsYXZlcygpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmdyaWRfaW5mbygpLCB7fSkKKyAgICAgICAgYi5ncmlkX2NvbmZpZ3VyZShyb3c9MCwgY29sdW1uPTApCisgICAgICAgIGluZm8gPSBiLmdyaWRfaW5mbygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mb1sncm93J10sIHNlbGYuX3N0cigwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvWydjb2x1bW4nXSwgc2VsZi5fc3RyKDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm9bJ3Jvd3NwYW4nXSwgc2VsZi5fc3RyKDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm9bJ2NvbHVtbnNwYW4nXSwgc2VsZi5fc3RyKDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm9bJ3BhZHgnXSwgc2VsZi5fc3RyKDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm9bJ3BhZHknXSwgc2VsZi5fc3RyKDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm9bJ3N0aWNreSddLCAnJykKKworICAgIGRlZiB0ZXN0X2dyaWRfcmVtb3ZlKHNlbGYpOgorICAgICAgICBiID0gVGtpbnRlci5CdXR0b24oc2VsZi5yb290KQorICAgICAgICBjID0gVGtpbnRlci5CdXR0b24oc2VsZi5yb290KQorICAgICAgICBiLmdyaWRfY29uZmlndXJlKHJvdz0yLCBjb2x1bW49Miwgcm93c3Bhbj0yLCBjb2x1bW5zcGFuPTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFkeD0zLCBwYWR5PTQsIHN0aWNreT0nbnMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucm9vdC5ncmlkX3NsYXZlcygpLCBbYl0pCisgICAgICAgIGIuZ3JpZF9yZW1vdmUoKQorICAgICAgICBjLmdyaWRfcmVtb3ZlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJvb3QuZ3JpZF9zbGF2ZXMoKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5ncmlkX2luZm8oKSwge30pCisgICAgICAgIGIuZ3JpZF9jb25maWd1cmUocm93PTAsIGNvbHVtbj0wKQorICAgICAgICBpbmZvID0gYi5ncmlkX2luZm8oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm9bJ3JvdyddLCBzZWxmLl9zdHIoMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mb1snY29sdW1uJ10sIHNlbGYuX3N0cigwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvWydyb3dzcGFuJ10sIHNlbGYuX3N0cigyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvWydjb2x1bW5zcGFuJ10sIHNlbGYuX3N0cigyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvWydwYWR4J10sIHNlbGYuX3N0cigzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvWydwYWR5J10sIHNlbGYuX3N0cig0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvWydzdGlja3knXSwgJ25zJykKKworICAgIGRlZiB0ZXN0X2dyaWRfaW5mbyhzZWxmKToKKyAgICAgICAgYiA9IFRraW50ZXIuQnV0dG9uKHNlbGYucm9vdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmdyaWRfaW5mbygpLCB7fSkKKyAgICAgICAgYi5ncmlkX2NvbmZpZ3VyZShyb3c9MiwgY29sdW1uPTIsIHJvd3NwYW49MiwgY29sdW1uc3Bhbj0yLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhZHg9MywgcGFkeT00LCBzdGlja3k9J25zJykKKyAgICAgICAgaW5mbyA9IGIuZ3JpZF9pbmZvKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGluZm8sIGRpY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mb1snaW4nXSwgc2VsZi5yb290KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm9bJ3JvdyddLCBzZWxmLl9zdHIoMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mb1snY29sdW1uJ10sIHNlbGYuX3N0cigyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvWydyb3dzcGFuJ10sIHNlbGYuX3N0cigyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvWydjb2x1bW5zcGFuJ10sIHNlbGYuX3N0cigyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvWydwYWR4J10sIHNlbGYuX3N0cigzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvWydwYWR5J10sIHNlbGYuX3N0cig0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvWydzdGlja3knXSwgJ25zJykKKworICAgIGRlZiB0ZXN0X2dyaWRfYmJveChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJvb3QuZ3JpZF9iYm94KCksICgwLCAwLCAwLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJvb3QuZ3JpZF9iYm94KDAsIDApLCAoMCwgMCwgMCwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yb290LmdyaWRfYmJveCgwLCAwLCAxLCAxKSwgKDAsIDAsIDAsIDApKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFRjbEVycm9yLCAnZXhwZWN0ZWQgaW50ZWdlciBidXQgZ290ICJ4IicpOgorICAgICAgICAgICAgc2VsZi5yb290LmdyaWRfYmJveCgneCcsIDApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVGNsRXJyb3IsICdleHBlY3RlZCBpbnRlZ2VyIGJ1dCBnb3QgIngiJyk6CisgICAgICAgICAgICBzZWxmLnJvb3QuZ3JpZF9iYm94KDAsICd4JykKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUY2xFcnJvciwgJ2V4cGVjdGVkIGludGVnZXIgYnV0IGdvdCAieCInKToKKyAgICAgICAgICAgIHNlbGYucm9vdC5ncmlkX2Jib3goMCwgMCwgJ3gnLCAwKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFRjbEVycm9yLCAnZXhwZWN0ZWQgaW50ZWdlciBidXQgZ290ICJ4IicpOgorICAgICAgICAgICAgc2VsZi5yb290LmdyaWRfYmJveCgwLCAwLCAwLCAneCcpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIHNlbGYucm9vdC5ncmlkX2Jib3goMCwgMCwgMCwgMCwgMCkKKyAgICAgICAgdCA9IFRraW50ZXIuVG9wbGV2ZWwoc2VsZi5yb290KQorICAgICAgICAjIGRlLW1heGltaXplCisgICAgICAgIHQud21fZ2VvbWV0cnkoJzF4MSswKzAnKQorICAgICAgICB0LndtX2dlb21ldHJ5KCcnKQorICAgICAgICBmMSA9IFRraW50ZXIuRnJhbWUodCwgd2lkdGg9NzUsIGhlaWdodD03NSwgYmc9J3JlZCcpCisgICAgICAgIGYyID0gVGtpbnRlci5GcmFtZSh0LCB3aWR0aD05MCwgaGVpZ2h0PTkwLCBiZz0nYmx1ZScpCisgICAgICAgIGYxLmdyaWRfY29uZmlndXJlKHJvdz0wLCBjb2x1bW49MCkKKyAgICAgICAgZjIuZ3JpZF9jb25maWd1cmUocm93PTEsIGNvbHVtbj0xKQorICAgICAgICBzZWxmLnJvb3QudXBkYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LmdyaWRfYmJveCgpLCAoMCwgMCwgMTY1LCAxNjUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuZ3JpZF9iYm94KDAsIDApLCAoMCwgMCwgNzUsIDc1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LmdyaWRfYmJveCgwLCAwLCAxLCAxKSwgKDAsIDAsIDE2NSwgMTY1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LmdyaWRfYmJveCgxLCAxKSwgKDc1LCA3NSwgOTAsIDkwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LmdyaWRfYmJveCgxMCwgMTAsIDAsIDApLCAoMCwgMCwgMTY1LCAxNjUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuZ3JpZF9iYm94KC0yLCAtMiwgLTEsIC0xKSwgKDAsIDAsIDAsIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuZ3JpZF9iYm94KDEwLCAxMCwgMTIsIDEyKSwgKDE2NSwgMTY1LCAwLCAwKSkKKworICAgIGRlZiB0ZXN0X2dyaWRfbG9jYXRpb24oc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIHNlbGYucm9vdC5ncmlkX2xvY2F0aW9uKCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgc2VsZi5yb290LmdyaWRfbG9jYXRpb24oMCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgc2VsZi5yb290LmdyaWRfbG9jYXRpb24oMCwgMCwgMCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUY2xFcnJvciwgJ2JhZCBzY3JlZW4gZGlzdGFuY2UgIngiJyk6CisgICAgICAgICAgICBzZWxmLnJvb3QuZ3JpZF9sb2NhdGlvbigneCcsICd5JykKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUY2xFcnJvciwgJ2JhZCBzY3JlZW4gZGlzdGFuY2UgInkiJyk6CisgICAgICAgICAgICBzZWxmLnJvb3QuZ3JpZF9sb2NhdGlvbignMWMnLCAneScpCisgICAgICAgIHQgPSBUa2ludGVyLlRvcGxldmVsKHNlbGYucm9vdCkKKyAgICAgICAgIyBkZS1tYXhpbWl6ZQorICAgICAgICB0LndtX2dlb21ldHJ5KCcxeDErMCswJykKKyAgICAgICAgdC53bV9nZW9tZXRyeSgnJykKKyAgICAgICAgZiA9IFRraW50ZXIuRnJhbWUodCwgd2lkdGg9MjAwLCBoZWlnaHQ9MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdobGlnaHR0aGlja25lc3M9MCwgYmc9J3JlZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5ncmlkX2xvY2F0aW9uKDEwLCAxMCksICgtMSwgLTEpKQorICAgICAgICBmLmdyaWRfY29uZmlndXJlKCkKKyAgICAgICAgc2VsZi5yb290LnVwZGF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5ncmlkX2xvY2F0aW9uKC0xMCwgLTEwKSwgKC0xLCAtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5ncmlkX2xvY2F0aW9uKC0xMCwgMCksICgtMSwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5ncmlkX2xvY2F0aW9uKC0xLCAwKSwgKC0xLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LmdyaWRfbG9jYXRpb24oMCwgLTEwKSwgKDAsIC0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LmdyaWRfbG9jYXRpb24oMCwgLTEpLCAoMCwgLTEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuZ3JpZF9sb2NhdGlvbigwLCAwKSwgKDAsIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuZ3JpZF9sb2NhdGlvbigyMDAsIDApLCAoMCwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5ncmlkX2xvY2F0aW9uKDIwMSwgMCksICgxLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LmdyaWRfbG9jYXRpb24oMCwgMTAwKSwgKDAsIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuZ3JpZF9sb2NhdGlvbigwLCAxMDEpLCAoMCwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5ncmlkX2xvY2F0aW9uKDIwMSwgMTAxKSwgKDEsIDEpKQorCisgICAgZGVmIHRlc3RfZ3JpZF9wcm9wYWdhdGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yb290LmdyaWRfcHJvcGFnYXRlKCksIFRydWUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIHNlbGYucm9vdC5ncmlkX3Byb3BhZ2F0ZShGYWxzZSwgRmFsc2UpCisgICAgICAgIHNlbGYucm9vdC5ncmlkX3Byb3BhZ2F0ZShGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnJvb3QuZ3JpZF9wcm9wYWdhdGUoKSkKKyAgICAgICAgZiA9IFRraW50ZXIuRnJhbWUoc2VsZi5yb290LCB3aWR0aD0xMDAsIGhlaWdodD0xMDAsIGJnPSdyZWQnKQorICAgICAgICBmLmdyaWRfY29uZmlndXJlKHJvdz0wLCBjb2x1bW49MCkKKyAgICAgICAgc2VsZi5yb290LnVwZGF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi53aW5mb193aWR0aCgpLCAxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi53aW5mb19oZWlnaHQoKSwgMTAwKQorICAgICAgICBmLmdyaWRfcHJvcGFnYXRlKEZhbHNlKQorICAgICAgICBnID0gVGtpbnRlci5GcmFtZShzZWxmLnJvb3QsIHdpZHRoPTc1LCBoZWlnaHQ9ODUsIGJnPSdncmVlbicpCisgICAgICAgIGcuZ3JpZF9jb25maWd1cmUoaW5fPWYsIHJvdz0wLCBjb2x1bW49MCkKKyAgICAgICAgc2VsZi5yb290LnVwZGF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi53aW5mb193aWR0aCgpLCAxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi53aW5mb19oZWlnaHQoKSwgMTAwKQorICAgICAgICBmLmdyaWRfcHJvcGFnYXRlKFRydWUpCisgICAgICAgIHNlbGYucm9vdC51cGRhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYud2luZm9fd2lkdGgoKSwgNzUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi53aW5mb19oZWlnaHQoKSwgODUpCisKKyAgICBkZWYgdGVzdF9ncmlkX3NpemUoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIHNlbGYucm9vdC5ncmlkX3NpemUoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJvb3QuZ3JpZF9zaXplKCksICgwLCAwKSkKKyAgICAgICAgZiA9IFRraW50ZXIuU2NhbGUoc2VsZi5yb290KQorICAgICAgICBmLmdyaWRfY29uZmlndXJlKHJvdz0wLCBjb2x1bW49MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJvb3QuZ3JpZF9zaXplKCksICgxLCAxKSkKKyAgICAgICAgZi5ncmlkX2NvbmZpZ3VyZShyb3c9NCwgY29sdW1uPTUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yb290LmdyaWRfc2l6ZSgpLCAoNiwgNSkpCisKKyAgICBkZWYgdGVzdF9ncmlkX3NsYXZlcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJvb3QuZ3JpZF9zbGF2ZXMoKSwgW10pCisgICAgICAgIGEgPSBUa2ludGVyLkxhYmVsKHNlbGYucm9vdCkKKyAgICAgICAgYS5ncmlkX2NvbmZpZ3VyZShyb3c9MCwgY29sdW1uPTEpCisgICAgICAgIGIgPSBUa2ludGVyLkxhYmVsKHNlbGYucm9vdCkKKyAgICAgICAgYi5ncmlkX2NvbmZpZ3VyZShyb3c9MSwgY29sdW1uPTApCisgICAgICAgIGMgPSBUa2ludGVyLkxhYmVsKHNlbGYucm9vdCkKKyAgICAgICAgYy5ncmlkX2NvbmZpZ3VyZShyb3c9MSwgY29sdW1uPTEpCisgICAgICAgIGQgPSBUa2ludGVyLkxhYmVsKHNlbGYucm9vdCkKKyAgICAgICAgZC5ncmlkX2NvbmZpZ3VyZShyb3c9MSwgY29sdW1uPTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yb290LmdyaWRfc2xhdmVzKCksIFtkLCBjLCBiLCBhXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJvb3QuZ3JpZF9zbGF2ZXMocm93PTApLCBbYV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yb290LmdyaWRfc2xhdmVzKHJvdz0xKSwgW2QsIGMsIGJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucm9vdC5ncmlkX3NsYXZlcyhjb2x1bW49MCksIFtiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJvb3QuZ3JpZF9zbGF2ZXMoY29sdW1uPTEpLCBbZCwgYywgYV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yb290LmdyaWRfc2xhdmVzKHJvdz0xLCBjb2x1bW49MSksIFtkLCBjXSkKKworCit0ZXN0c19ndWkgPSAoCisgICAgUGFja1Rlc3QsIFBsYWNlVGVzdCwgR3JpZFRlc3QsCispCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgcnVuX3VuaXR0ZXN0KCp0ZXN0c19ndWkpCmRpZmYgLS1naXQgYS9MaWIvbGliLXRrL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfaW1hZ2VzLnB5IGIvTGliL2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X2ltYWdlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2M1Yjc1Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X2ltYWdlcy5weQpAQCAtMCwwICsxLDMzNiBAQAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgVGtpbnRlciBhcyB0a2ludGVyCitpbXBvcnQgdHRrCitpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQgYXMgc3VwcG9ydAorZnJvbSB0ZXN0X3R0ay5zdXBwb3J0IGltcG9ydCByZXF1aXJlc190Y2wKKworc3VwcG9ydC5yZXF1aXJlcygnZ3VpJykKKworCitjbGFzcyBNaXNjVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYucm9vdCA9IHR0ay5zZXR1cF9tYXN0ZXIoKQorCisgICAgZGVmIHRlc3RfaW1hZ2VfdHlwZXMoc2VsZik6CisgICAgICAgIGltYWdlX3R5cGVzID0gc2VsZi5yb290LmltYWdlX3R5cGVzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGltYWdlX3R5cGVzLCB0dXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigncGhvdG8nLCBpbWFnZV90eXBlcykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignYml0bWFwJywgaW1hZ2VfdHlwZXMpCisKKyAgICBkZWYgdGVzdF9pbWFnZV9uYW1lcyhzZWxmKToKKyAgICAgICAgaW1hZ2VfbmFtZXMgPSBzZWxmLnJvb3QuaW1hZ2VfbmFtZXMoKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoaW1hZ2VfbmFtZXMsIHR1cGxlKQorCisKK2NsYXNzIEJpdG1hcEltYWdlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICBjbHMudGVzdGZpbGUgPSBzdXBwb3J0LmZpbmRmaWxlKCdweXRob24ueGJtJywgc3ViZGlyPSdpbWdoZHJkYXRhJykKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5yb290ID0gdHRrLnNldHVwX21hc3RlcigpCisKKyAgICBkZWYgdGVzdF9jcmVhdGVfZnJvbV9maWxlKHNlbGYpOgorICAgICAgICBpbWFnZSA9IHRraW50ZXIuQml0bWFwSW1hZ2UoJzo6aW1nOjp0ZXN0JywgbWFzdGVyPXNlbGYucm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVncm91bmQ9J3llbGxvdycsIGJhY2tncm91bmQ9J2JsdWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZT1zZWxmLnRlc3RmaWxlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihpbWFnZSksICc6OmltZzo6dGVzdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2UudHlwZSgpLCAnYml0bWFwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZS53aWR0aCgpLCAxNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZS5oZWlnaHQoKSwgMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJzo6aW1nOjp0ZXN0Jywgc2VsZi5yb290LmltYWdlX25hbWVzKCkpCisgICAgICAgIGRlbCBpbWFnZQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCc6OmltZzo6dGVzdCcsIHNlbGYucm9vdC5pbWFnZV9uYW1lcygpKQorCisgICAgZGVmIHRlc3RfY3JlYXRlX2Zyb21fZGF0YShzZWxmKToKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYudGVzdGZpbGUsICdyYicpIGFzIGY6CisgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKKyAgICAgICAgaW1hZ2UgPSB0a2ludGVyLkJpdG1hcEltYWdlKCc6OmltZzo6dGVzdCcsIG1hc3Rlcj1zZWxmLnJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlZ3JvdW5kPSd5ZWxsb3cnLCBiYWNrZ3JvdW5kPSdibHVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9ZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoaW1hZ2UpLCAnOjppbWc6OnRlc3QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltYWdlLnR5cGUoKSwgJ2JpdG1hcCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2Uud2lkdGgoKSwgMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2UuaGVpZ2h0KCksIDE2KQorICAgICAgICBzZWxmLmFzc2VydEluKCc6OmltZzo6dGVzdCcsIHNlbGYucm9vdC5pbWFnZV9uYW1lcygpKQorICAgICAgICBkZWwgaW1hZ2UKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignOjppbWc6OnRlc3QnLCBzZWxmLnJvb3QuaW1hZ2VfbmFtZXMoKSkKKworICAgIGRlZiBhc3NlcnRFcXVhbFN0ckxpc3Qoc2VsZiwgYWN0dWFsLCBleHBlY3RlZCk6CisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShhY3R1YWwsIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJvb3Quc3BsaXRsaXN0KGFjdHVhbCksIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfY29uZmlndXJlX2RhdGEoc2VsZik6CisgICAgICAgIGltYWdlID0gdGtpbnRlci5CaXRtYXBJbWFnZSgnOjppbWc6OnRlc3QnLCBtYXN0ZXI9c2VsZi5yb290KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltYWdlWydkYXRhJ10sICctZGF0YSB7fSB7fSB7fSB7fScpCisgICAgICAgIHdpdGggb3BlbihzZWxmLnRlc3RmaWxlLCAncmInKSBhcyBmOgorICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCisgICAgICAgIGltYWdlLmNvbmZpZ3VyZShkYXRhPWRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxTdHJMaXN0KGltYWdlWydkYXRhJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnLWRhdGEnLCAnJywgJycsICcnLCBkYXRhKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZS53aWR0aCgpLCAxNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZS5oZWlnaHQoKSwgMTYpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZVsnbWFza2RhdGEnXSwgJy1tYXNrZGF0YSB7fSB7fSB7fSB7fScpCisgICAgICAgIGltYWdlLmNvbmZpZ3VyZShtYXNrZGF0YT1kYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsU3RyTGlzdChpbWFnZVsnbWFza2RhdGEnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCctbWFza2RhdGEnLCAnJywgJycsICcnLCBkYXRhKSkKKworICAgIGRlZiB0ZXN0X2NvbmZpZ3VyZV9maWxlKHNlbGYpOgorICAgICAgICBpbWFnZSA9IHRraW50ZXIuQml0bWFwSW1hZ2UoJzo6aW1nOjp0ZXN0JywgbWFzdGVyPXNlbGYucm9vdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZVsnZmlsZSddLCAnLWZpbGUge30ge30ge30ge30nKQorICAgICAgICBpbWFnZS5jb25maWd1cmUoZmlsZT1zZWxmLnRlc3RmaWxlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsU3RyTGlzdChpbWFnZVsnZmlsZSddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJy1maWxlJywgJycsICcnLCAnJyxzZWxmLnRlc3RmaWxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZS53aWR0aCgpLCAxNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZS5oZWlnaHQoKSwgMTYpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZVsnbWFza2ZpbGUnXSwgJy1tYXNrZmlsZSB7fSB7fSB7fSB7fScpCisgICAgICAgIGltYWdlLmNvbmZpZ3VyZShtYXNrZmlsZT1zZWxmLnRlc3RmaWxlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsU3RyTGlzdChpbWFnZVsnbWFza2ZpbGUnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCctbWFza2ZpbGUnLCAnJywgJycsICcnLCBzZWxmLnRlc3RmaWxlKSkKKworICAgIGRlZiB0ZXN0X2NvbmZpZ3VyZV9iYWNrZ3JvdW5kKHNlbGYpOgorICAgICAgICBpbWFnZSA9IHRraW50ZXIuQml0bWFwSW1hZ2UoJzo6aW1nOjp0ZXN0JywgbWFzdGVyPXNlbGYucm9vdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZVsnYmFja2dyb3VuZCddLCAnLWJhY2tncm91bmQge30ge30ge30ge30nKQorICAgICAgICBpbWFnZS5jb25maWd1cmUoYmFja2dyb3VuZD0nYmx1ZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2VbJ2JhY2tncm91bmQnXSwgJy1iYWNrZ3JvdW5kIHt9IHt9IHt9IGJsdWUnKQorCisgICAgZGVmIHRlc3RfY29uZmlndXJlX2ZvcmVncm91bmQoc2VsZik6CisgICAgICAgIGltYWdlID0gdGtpbnRlci5CaXRtYXBJbWFnZSgnOjppbWc6OnRlc3QnLCBtYXN0ZXI9c2VsZi5yb290KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltYWdlWydmb3JlZ3JvdW5kJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgJy1mb3JlZ3JvdW5kIHt9IHt9ICMwMDAwMDAgIzAwMDAwMCcpCisgICAgICAgIGltYWdlLmNvbmZpZ3VyZShmb3JlZ3JvdW5kPSd5ZWxsb3cnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltYWdlWydmb3JlZ3JvdW5kJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgJy1mb3JlZ3JvdW5kIHt9IHt9ICMwMDAwMDAgeWVsbG93JykKKworCitjbGFzcyBQaG90b0ltYWdlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICBjbHMudGVzdGZpbGUgPSBzdXBwb3J0LmZpbmRmaWxlKCdweXRob24uZ2lmJywgc3ViZGlyPSdpbWdoZHJkYXRhJykKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5yb290ID0gdHRrLnNldHVwX21hc3RlcigpCisgICAgICAgIHNlbGYud2FudG9iamVjdHMgPSBzZWxmLnJvb3Qud2FudG9iamVjdHMoKQorCisgICAgZGVmIGNyZWF0ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHRraW50ZXIuUGhvdG9JbWFnZSgnOjppbWc6OnRlc3QnLCBtYXN0ZXI9c2VsZi5yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU9c2VsZi50ZXN0ZmlsZSkKKworICAgIGRlZiBjb2xvcmxpc3Qoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiB0a2ludGVyLlRrVmVyc2lvbiA+PSA4LjYgYW5kIHNlbGYud2FudG9iamVjdHM6CisgICAgICAgICAgICByZXR1cm4gYXJncworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHRraW50ZXIuX2pvaW4oYXJncykKKworICAgIGRlZiBjaGVja19jcmVhdGVfZnJvbV9maWxlKHNlbGYsIGV4dCk6CisgICAgICAgIHRlc3RmaWxlID0gc3VwcG9ydC5maW5kZmlsZSgncHl0aG9uLicgKyBleHQsIHN1YmRpcj0naW1naGRyZGF0YScpCisgICAgICAgIGltYWdlID0gdGtpbnRlci5QaG90b0ltYWdlKCc6OmltZzo6dGVzdCcsIG1hc3Rlcj1zZWxmLnJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU9dGVzdGZpbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGltYWdlKSwgJzo6aW1nOjp0ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZS50eXBlKCksICdwaG90bycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2Uud2lkdGgoKSwgMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2UuaGVpZ2h0KCksIDE2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltYWdlWydkYXRhJ10sICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltYWdlWydmaWxlJ10sIHRlc3RmaWxlKQorICAgICAgICBzZWxmLmFzc2VydEluKCc6OmltZzo6dGVzdCcsIHNlbGYucm9vdC5pbWFnZV9uYW1lcygpKQorICAgICAgICBkZWwgaW1hZ2UKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignOjppbWc6OnRlc3QnLCBzZWxmLnJvb3QuaW1hZ2VfbmFtZXMoKSkKKworICAgIGRlZiBjaGVja19jcmVhdGVfZnJvbV9kYXRhKHNlbGYsIGV4dCk6CisgICAgICAgIHRlc3RmaWxlID0gc3VwcG9ydC5maW5kZmlsZSgncHl0aG9uLicgKyBleHQsIHN1YmRpcj0naW1naGRyZGF0YScpCisgICAgICAgIHdpdGggb3Blbih0ZXN0ZmlsZSwgJ3JiJykgYXMgZjoKKyAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQorICAgICAgICBpbWFnZSA9IHRraW50ZXIuUGhvdG9JbWFnZSgnOjppbWc6OnRlc3QnLCBtYXN0ZXI9c2VsZi5yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGltYWdlKSwgJzo6aW1nOjp0ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZS50eXBlKCksICdwaG90bycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2Uud2lkdGgoKSwgMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2UuaGVpZ2h0KCksIDE2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltYWdlWydkYXRhJ10sIGRhdGEgaWYgc2VsZi53YW50b2JqZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZGF0YS5kZWNvZGUoJ2xhdGluMScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltYWdlWydmaWxlJ10sICcnKQorICAgICAgICBzZWxmLmFzc2VydEluKCc6OmltZzo6dGVzdCcsIHNlbGYucm9vdC5pbWFnZV9uYW1lcygpKQorICAgICAgICBkZWwgaW1hZ2UKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignOjppbWc6OnRlc3QnLCBzZWxmLnJvb3QuaW1hZ2VfbmFtZXMoKSkKKworICAgIGRlZiB0ZXN0X2NyZWF0ZV9mcm9tX3BwbV9maWxlKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2NyZWF0ZV9mcm9tX2ZpbGUoJ3BwbScpCisKKyAgICBkZWYgdGVzdF9jcmVhdGVfZnJvbV9wcG1fZGF0YShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19jcmVhdGVfZnJvbV9kYXRhKCdwcG0nKQorCisgICAgZGVmIHRlc3RfY3JlYXRlX2Zyb21fcGdtX2ZpbGUoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfY3JlYXRlX2Zyb21fZmlsZSgncGdtJykKKworICAgIGRlZiB0ZXN0X2NyZWF0ZV9mcm9tX3BnbV9kYXRhKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2NyZWF0ZV9mcm9tX2RhdGEoJ3BnbScpCisKKyAgICBkZWYgdGVzdF9jcmVhdGVfZnJvbV9naWZfZmlsZShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19jcmVhdGVfZnJvbV9maWxlKCdnaWYnKQorCisgICAgZGVmIHRlc3RfY3JlYXRlX2Zyb21fZ2lmX2RhdGEoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfY3JlYXRlX2Zyb21fZGF0YSgnZ2lmJykKKworICAgIEByZXF1aXJlc190Y2woOCwgNikKKyAgICBkZWYgdGVzdF9jcmVhdGVfZnJvbV9wbmdfZmlsZShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19jcmVhdGVfZnJvbV9maWxlKCdwbmcnKQorCisgICAgQHJlcXVpcmVzX3RjbCg4LCA2KQorICAgIGRlZiB0ZXN0X2NyZWF0ZV9mcm9tX3BuZ19kYXRhKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2NyZWF0ZV9mcm9tX2RhdGEoJ3BuZycpCisKKyAgICBkZWYgdGVzdF9jb25maWd1cmVfZGF0YShzZWxmKToKKyAgICAgICAgaW1hZ2UgPSB0a2ludGVyLlBob3RvSW1hZ2UoJzo6aW1nOjp0ZXN0JywgbWFzdGVyPXNlbGYucm9vdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZVsnZGF0YSddLCAnJykKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYudGVzdGZpbGUsICdyYicpIGFzIGY6CisgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKKyAgICAgICAgaW1hZ2UuY29uZmlndXJlKGRhdGE9ZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZVsnZGF0YSddLCBkYXRhIGlmIHNlbGYud2FudG9iamVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGRhdGEuZGVjb2RlKCdsYXRpbjEnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZS53aWR0aCgpLCAxNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZS5oZWlnaHQoKSwgMTYpCisKKyAgICBkZWYgdGVzdF9jb25maWd1cmVfZm9ybWF0KHNlbGYpOgorICAgICAgICBpbWFnZSA9IHRraW50ZXIuUGhvdG9JbWFnZSgnOjppbWc6OnRlc3QnLCBtYXN0ZXI9c2VsZi5yb290KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltYWdlWydmb3JtYXQnXSwgJycpCisgICAgICAgIGltYWdlLmNvbmZpZ3VyZShmaWxlPXNlbGYudGVzdGZpbGUsIGZvcm1hdD0nZ2lmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZVsnZm9ybWF0J10sICgnZ2lmJywpIGlmIHNlbGYud2FudG9iamVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgJ2dpZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2Uud2lkdGgoKSwgMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2UuaGVpZ2h0KCksIDE2KQorCisgICAgZGVmIHRlc3RfY29uZmlndXJlX2ZpbGUoc2VsZik6CisgICAgICAgIGltYWdlID0gdGtpbnRlci5QaG90b0ltYWdlKCc6OmltZzo6dGVzdCcsIG1hc3Rlcj1zZWxmLnJvb3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2VbJ2ZpbGUnXSwgJycpCisgICAgICAgIGltYWdlLmNvbmZpZ3VyZShmaWxlPXNlbGYudGVzdGZpbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2VbJ2ZpbGUnXSwgc2VsZi50ZXN0ZmlsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZS53aWR0aCgpLCAxNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZS5oZWlnaHQoKSwgMTYpCisKKyAgICBkZWYgdGVzdF9jb25maWd1cmVfZ2FtbWEoc2VsZik6CisgICAgICAgIGltYWdlID0gdGtpbnRlci5QaG90b0ltYWdlKCc6OmltZzo6dGVzdCcsIG1hc3Rlcj1zZWxmLnJvb3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2VbJ2dhbW1hJ10sICcxLjAnKQorICAgICAgICBpbWFnZS5jb25maWd1cmUoZ2FtbWE9Mi4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltYWdlWydnYW1tYSddLCAnMi4wJykKKworICAgIGRlZiB0ZXN0X2NvbmZpZ3VyZV93aWR0aF9oZWlnaHQoc2VsZik6CisgICAgICAgIGltYWdlID0gdGtpbnRlci5QaG90b0ltYWdlKCc6OmltZzo6dGVzdCcsIG1hc3Rlcj1zZWxmLnJvb3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2VbJ3dpZHRoJ10sICcwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZVsnaGVpZ2h0J10sICcwJykKKyAgICAgICAgaW1hZ2UuY29uZmlndXJlKHdpZHRoPTIwKQorICAgICAgICBpbWFnZS5jb25maWd1cmUoaGVpZ2h0PTEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltYWdlWyd3aWR0aCddLCAnMjAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltYWdlWydoZWlnaHQnXSwgJzEwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZS53aWR0aCgpLCAyMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZS5oZWlnaHQoKSwgMTApCisKKyAgICBkZWYgdGVzdF9jb25maWd1cmVfcGFsZXR0ZShzZWxmKToKKyAgICAgICAgaW1hZ2UgPSB0a2ludGVyLlBob3RvSW1hZ2UoJzo6aW1nOjp0ZXN0JywgbWFzdGVyPXNlbGYucm9vdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZVsncGFsZXR0ZSddLCAnJykKKyAgICAgICAgaW1hZ2UuY29uZmlndXJlKHBhbGV0dGU9MjU2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltYWdlWydwYWxldHRlJ10sICcyNTYnKQorICAgICAgICBpbWFnZS5jb25maWd1cmUocGFsZXR0ZT0nMy80LzInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltYWdlWydwYWxldHRlJ10sICczLzQvMicpCisKKyAgICBkZWYgdGVzdF9ibGFuayhzZWxmKToKKyAgICAgICAgaW1hZ2UgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIGltYWdlLmJsYW5rKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZS53aWR0aCgpLCAxNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZS5oZWlnaHQoKSwgMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2UuZ2V0KDQsIDYpLCBzZWxmLmNvbG9ybGlzdCgwLCAwLCAwKSkKKworICAgIGRlZiB0ZXN0X2NvcHkoc2VsZik6CisgICAgICAgIGltYWdlID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBpbWFnZTIgPSBpbWFnZS5jb3B5KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZTIud2lkdGgoKSwgMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2UyLmhlaWdodCgpLCAxNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZS5nZXQoNCwgNiksIGltYWdlLmdldCg0LCA2KSkKKworICAgIGRlZiB0ZXN0X3N1YnNhbXBsZShzZWxmKToKKyAgICAgICAgaW1hZ2UgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIGltYWdlMiA9IGltYWdlLnN1YnNhbXBsZSgyLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltYWdlMi53aWR0aCgpLCA4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltYWdlMi5oZWlnaHQoKSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZTIuZ2V0KDIsIDIpLCBpbWFnZS5nZXQoNCwgNikpCisKKyAgICAgICAgaW1hZ2UyID0gaW1hZ2Uuc3Vic2FtcGxlKDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2UyLndpZHRoKCksIDgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2UyLmhlaWdodCgpLCA4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltYWdlMi5nZXQoMiwgMyksIGltYWdlLmdldCg0LCA2KSkKKworICAgIGRlZiB0ZXN0X3pvb20oc2VsZik6CisgICAgICAgIGltYWdlID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBpbWFnZTIgPSBpbWFnZS56b29tKDIsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2UyLndpZHRoKCksIDMyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltYWdlMi5oZWlnaHQoKSwgNDgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2UyLmdldCg4LCAxOCksIGltYWdlLmdldCg0LCA2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZTIuZ2V0KDksIDIwKSwgaW1hZ2UuZ2V0KDQsIDYpKQorCisgICAgICAgIGltYWdlMiA9IGltYWdlLnpvb20oMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZTIud2lkdGgoKSwgMzIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2UyLmhlaWdodCgpLCAzMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZTIuZ2V0KDgsIDEyKSwgaW1hZ2UuZ2V0KDQsIDYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltYWdlMi5nZXQoOSwgMTMpLCBpbWFnZS5nZXQoNCwgNikpCisKKyAgICBkZWYgdGVzdF9wdXQoc2VsZik6CisgICAgICAgIGltYWdlID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBpbWFnZS5wdXQoJ3tyZWQgZ3JlZW59IHtibHVlIHllbGxvd30nLCB0bz0oNCwgNikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2UuZ2V0KDQsIDYpLCBzZWxmLmNvbG9ybGlzdCgyNTUsIDAsIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltYWdlLmdldCg1LCA2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbG9ybGlzdCgwLCAxMjggaWYgdGtpbnRlci5Ua1ZlcnNpb24gPj0gOC42CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAyNTUsIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltYWdlLmdldCg0LCA3KSwgc2VsZi5jb2xvcmxpc3QoMCwgMCwgMjU1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZS5nZXQoNSwgNyksIHNlbGYuY29sb3JsaXN0KDI1NSwgMjU1LCAwKSkKKworICAgICAgICBpbWFnZS5wdXQoKCgnI2YwMCcsICcjMDBmZjAwJyksICgnIzAwMDAwMGZmZicsICcjZmZmZmZmZmYwMDAwJykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltYWdlLmdldCgwLCAwKSwgc2VsZi5jb2xvcmxpc3QoMjU1LCAwLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZS5nZXQoMSwgMCksIHNlbGYuY29sb3JsaXN0KDAsIDI1NSwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2UuZ2V0KDAsIDEpLCBzZWxmLmNvbG9ybGlzdCgwLCAwLCAyNTUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltYWdlLmdldCgxLCAxKSwgc2VsZi5jb2xvcmxpc3QoMjU1LCAyNTUsIDApKQorCisgICAgZGVmIHRlc3RfZ2V0KHNlbGYpOgorICAgICAgICBpbWFnZSA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZS5nZXQoNCwgNiksIHNlbGYuY29sb3JsaXN0KDYyLCAxMTYsIDE2MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2UuZ2V0KDAsIDApLCBzZWxmLmNvbG9ybGlzdCgwLCAwLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZS5nZXQoMTUsIDE1KSwgc2VsZi5jb2xvcmxpc3QoMCwgMCwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRraW50ZXIuVGNsRXJyb3IsIGltYWdlLmdldCwgLTEsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRraW50ZXIuVGNsRXJyb3IsIGltYWdlLmdldCwgMCwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRraW50ZXIuVGNsRXJyb3IsIGltYWdlLmdldCwgMTYsIDE1KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0a2ludGVyLlRjbEVycm9yLCBpbWFnZS5nZXQsIDE1LCAxNikKKworICAgIGRlZiB0ZXN0X3dyaXRlKHNlbGYpOgorICAgICAgICBpbWFnZSA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBzdXBwb3J0LlRFU1RGTikKKworICAgICAgICBpbWFnZS53cml0ZShzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgaW1hZ2UyID0gdGtpbnRlci5QaG90b0ltYWdlKCc6OmltZzo6dGVzdDInLCBtYXN0ZXI9c2VsZi5yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0PSdwcG0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZT1zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoaW1hZ2UyKSwgJzo6aW1nOjp0ZXN0MicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2UyLnR5cGUoKSwgJ3Bob3RvJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZTIud2lkdGgoKSwgMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2UyLmhlaWdodCgpLCAxNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZTIuZ2V0KDAsIDApLCBpbWFnZS5nZXQoMCwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2UyLmdldCgxNSwgOCksIGltYWdlLmdldCgxNSwgOCkpCisKKyAgICAgICAgaW1hZ2Uud3JpdGUoc3VwcG9ydC5URVNURk4sIGZvcm1hdD0nZ2lmJywgZnJvbV9jb29yZHM9KDQsIDYsIDYsIDkpKQorICAgICAgICBpbWFnZTMgPSB0a2ludGVyLlBob3RvSW1hZ2UoJzo6aW1nOjp0ZXN0MycsIG1hc3Rlcj1zZWxmLnJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ9J2dpZicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlPXN1cHBvcnQuVEVTVEZOKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihpbWFnZTMpLCAnOjppbWc6OnRlc3QzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZTMudHlwZSgpLCAncGhvdG8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltYWdlMy53aWR0aCgpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltYWdlMy5oZWlnaHQoKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWFnZTMuZ2V0KDAsIDApLCBpbWFnZS5nZXQoNCwgNikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1hZ2UzLmdldCgxLCAyKSwgaW1hZ2UuZ2V0KDUsIDgpKQorCisKK3Rlc3RzX2d1aSA9IChNaXNjVGVzdCwgQml0bWFwSW1hZ2VUZXN0LCBQaG90b0ltYWdlVGVzdCwpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RzX2d1aSkKZGlmZiAtLWdpdCBhL0xpYi9saWItdGsvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF90ZXh0LnB5IGIvTGliL2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X3RleHQucHkKaW5kZXggZTZjMDhiZS4uY2EyMWI2MCAxMDA2NDQKLS0tIGEvTGliL2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X3RleHQucHkKKysrIGIvTGliL2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X3RleHQucHkKQEAgLTE0LDYgKzE0LDE3IEBACiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzZWxmLnRleHQuZGVzdHJveSgpCiAKKyAgICBkZWYgdGVzdF9kZWJ1ZyhzZWxmKToKKyAgICAgICAgdGV4dCA9IHNlbGYudGV4dAorICAgICAgICBvbGRkZWJ1ZyA9IHRleHQuZGVidWcoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXh0LmRlYnVnKDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQuZGVidWcoKSwgMCkKKyAgICAgICAgICAgIHRleHQuZGVidWcoMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dC5kZWJ1ZygpLCAxKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdGV4dC5kZWJ1ZyhvbGRkZWJ1ZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dC5kZWJ1ZygpLCBvbGRkZWJ1ZykKIAogICAgIGRlZiB0ZXN0X3NlYXJjaChzZWxmKToKICAgICAgICAgdGV4dCA9IHNlbGYudGV4dApkaWZmIC0tZ2l0IGEvTGliL2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X3ZhcmlhYmxlcy5weSBiL0xpYi9saWItdGsvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF92YXJpYWJsZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI0ZWEzOAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9saWItdGsvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF92YXJpYWJsZXMucHkKQEAgLTAsMCArMSwxNjYgQEAKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIFRraW50ZXIgaW1wb3J0IFZhcmlhYmxlLCBTdHJpbmdWYXIsIEludFZhciwgRG91YmxlVmFyLCBCb29sZWFuVmFyLCBUaywgVGNsRXJyb3IKKworCitjbGFzcyBUZXN0QmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYucm9vdCA9IFRrKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5yb290LmRlc3Ryb3koKQorCisKK2NsYXNzIFRlc3RWYXJpYWJsZShUZXN0QmFzZSk6CisKKyAgICBkZWYgaW5mb19leGlzdHMoc2VsZiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5yb290LmdldGJvb2xlYW4oc2VsZi5yb290LmNhbGwoImluZm8iLCAiZXhpc3RzIiwgKmFyZ3MpKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdChzZWxmKToKKyAgICAgICAgdiA9IFZhcmlhYmxlKHNlbGYucm9vdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiIiwgdi5nZXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleHBNYXRjaGVzKHN0cih2KSwgciJeUFlfVkFSKFxkKykkIikKKworICAgIGRlZiB0ZXN0X25hbWVfYW5kX3ZhbHVlKHNlbGYpOgorICAgICAgICB2ID0gVmFyaWFibGUoc2VsZi5yb290LCAic2FtcGxlIHN0cmluZyIsICJ2YXJuYW1lIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgic2FtcGxlIHN0cmluZyIsIHYuZ2V0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInZhcm5hbWUiLCBzdHIodikpCisKKyAgICBkZWYgdGVzdF9fX2RlbF9fKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuaW5mb19leGlzdHMoInZhcm5hbWUiKSkKKyAgICAgICAgdiA9IFZhcmlhYmxlKHNlbGYucm9vdCwgInNhbXBsZSBzdHJpbmciLCAidmFybmFtZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmluZm9fZXhpc3RzKCJ2YXJuYW1lIikpCisgICAgICAgIGRlbCB2CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5pbmZvX2V4aXN0cygidmFybmFtZSIpKQorCisgICAgZGVmIHRlc3RfZG9udF91bnNldF9ub3RfZXhpc3Rpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5pbmZvX2V4aXN0cygidmFybmFtZSIpKQorICAgICAgICB2MSA9IFZhcmlhYmxlKHNlbGYucm9vdCwgbmFtZT0ibmFtZSIpCisgICAgICAgIHYyID0gVmFyaWFibGUoc2VsZi5yb290LCBuYW1lPSJuYW1lIikKKyAgICAgICAgZGVsIHYxCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5pbmZvX2V4aXN0cygibmFtZSIpKQorICAgICAgICAjIHNob3VsZG4ndCByYWlzZSBleGNlcHRpb24KKyAgICAgICAgZGVsIHYyCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5pbmZvX2V4aXN0cygibmFtZSIpKQorCisgICAgZGVmIHRlc3RfX19lcV9fKHNlbGYpOgorICAgICAgICAjIHZhbHVlcyBkb2Vzbid0IG1hdHRlciwgb25seSBjbGFzcyBhbmQgbmFtZSBhcmUgY2hlY2tlZAorICAgICAgICB2MSA9IFZhcmlhYmxlKHNlbGYucm9vdCwgbmFtZT0iYWJjIikKKyAgICAgICAgdjIgPSBWYXJpYWJsZShzZWxmLnJvb3QsIG5hbWU9ImFiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodjEsIHYyKQorCisgICAgICAgIHYzID0gVmFyaWFibGUoc2VsZi5yb290LCBuYW1lPSJhYmMiKQorICAgICAgICB2NCA9IFN0cmluZ1ZhcihzZWxmLnJvb3QsIG5hbWU9ImFiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwodjMsIHY0KQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9uYW1lKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBWYXJpYWJsZShzZWxmLnJvb3QsIG5hbWU9MTIzKQorCisgICAgZGVmIHRlc3RfbnVsbF9pbl9uYW1lKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgVmFyaWFibGUoc2VsZi5yb290LCBuYW1lPSd2YXJceDAwbmFtZScpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICBzZWxmLnJvb3QuZ2xvYmFsc2V0dmFyKCd2YXJceDAwbmFtZScsICJ2YWx1ZSIpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICBzZWxmLnJvb3Quc2V0dmFyKCd2YXJceDAwbmFtZScsICJ2YWx1ZSIpCisKKworY2xhc3MgVGVzdFN0cmluZ1ZhcihUZXN0QmFzZSk6CisKKyAgICBkZWYgdGVzdF9kZWZhdWx0KHNlbGYpOgorICAgICAgICB2ID0gU3RyaW5nVmFyKHNlbGYucm9vdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiIiwgdi5nZXQoKSkKKworICAgIGRlZiB0ZXN0X2dldChzZWxmKToKKyAgICAgICAgdiA9IFN0cmluZ1ZhcihzZWxmLnJvb3QsICJhYmMiLCAibmFtZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImFiYyIsIHYuZ2V0KCkpCisgICAgICAgIHNlbGYucm9vdC5nbG9iYWxzZXR2YXIoIm5hbWUiLCAidmFsdWUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJ2YWx1ZSIsIHYuZ2V0KCkpCisKKyAgICBkZWYgdGVzdF9nZXRfbnVsbChzZWxmKToKKyAgICAgICAgdiA9IFN0cmluZ1ZhcihzZWxmLnJvb3QsICJhYmNceDAwZGVmIiwgIm5hbWUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJhYmNceDAwZGVmIiwgdi5nZXQoKSkKKyAgICAgICAgc2VsZi5yb290Lmdsb2JhbHNldHZhcigibmFtZSIsICJ2YWxceDAwdWUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJ2YWxceDAwdWUiLCB2LmdldCgpKQorCisKK2NsYXNzIFRlc3RJbnRWYXIoVGVzdEJhc2UpOgorCisgICAgZGVmIHRlc3RfZGVmYXVsdChzZWxmKToKKyAgICAgICAgdiA9IEludFZhcihzZWxmLnJvb3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgdi5nZXQoKSkKKworICAgIGRlZiB0ZXN0X2dldChzZWxmKToKKyAgICAgICAgdiA9IEludFZhcihzZWxmLnJvb3QsIDEyMywgIm5hbWUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEyMywgdi5nZXQoKSkKKyAgICAgICAgc2VsZi5yb290Lmdsb2JhbHNldHZhcigibmFtZSIsICIzNDUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDM0NSwgdi5nZXQoKSkKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfdmFsdWUoc2VsZik6CisgICAgICAgIHYgPSBJbnRWYXIoc2VsZi5yb290LCBuYW1lPSJuYW1lIikKKyAgICAgICAgc2VsZi5yb290Lmdsb2JhbHNldHZhcigibmFtZSIsICJ2YWx1ZSIpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICB2LmdldCgpCisgICAgICAgIHNlbGYucm9vdC5nbG9iYWxzZXR2YXIoIm5hbWUiLCAiMzQ1LjAiKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgdi5nZXQoKQorCisKK2NsYXNzIFRlc3REb3VibGVWYXIoVGVzdEJhc2UpOgorCisgICAgZGVmIHRlc3RfZGVmYXVsdChzZWxmKToKKyAgICAgICAgdiA9IERvdWJsZVZhcihzZWxmLnJvb3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMC4wLCB2LmdldCgpKQorCisgICAgZGVmIHRlc3RfZ2V0KHNlbGYpOgorICAgICAgICB2ID0gRG91YmxlVmFyKHNlbGYucm9vdCwgMS4yMywgIm5hbWUiKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKDEuMjMsIHYuZ2V0KCkpCisgICAgICAgIHNlbGYucm9vdC5nbG9iYWxzZXR2YXIoIm5hbWUiLCAiMy40NSIpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoMy40NSwgdi5nZXQoKSkKKworICAgIGRlZiB0ZXN0X2dldF9mcm9tX2ludChzZWxmKToKKyAgICAgICAgdiA9IERvdWJsZVZhcihzZWxmLnJvb3QsIDEuMjMsICJuYW1lIikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgxLjIzLCB2LmdldCgpKQorICAgICAgICBzZWxmLnJvb3QuZ2xvYmFsc2V0dmFyKCJuYW1lIiwgIjMuNDUiKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKDMuNDUsIHYuZ2V0KCkpCisgICAgICAgIHNlbGYucm9vdC5nbG9iYWxzZXR2YXIoIm5hbWUiLCAiNDU2IikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCg0NTYsIHYuZ2V0KCkpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX3ZhbHVlKHNlbGYpOgorICAgICAgICB2ID0gRG91YmxlVmFyKHNlbGYucm9vdCwgbmFtZT0ibmFtZSIpCisgICAgICAgIHNlbGYucm9vdC5nbG9iYWxzZXR2YXIoIm5hbWUiLCAidmFsdWUiKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgdi5nZXQoKQorCisKK2NsYXNzIFRlc3RCb29sZWFuVmFyKFRlc3RCYXNlKToKKworICAgIGRlZiB0ZXN0X2RlZmF1bHQoc2VsZik6CisgICAgICAgIHYgPSBCb29sZWFuVmFyKHNlbGYucm9vdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgdi5nZXQoKSkKKworICAgIGRlZiB0ZXN0X2dldChzZWxmKToKKyAgICAgICAgdiA9IEJvb2xlYW5WYXIoc2VsZi5yb290LCBUcnVlLCAibmFtZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoVHJ1ZSwgdi5nZXQoKSkKKyAgICAgICAgc2VsZi5yb290Lmdsb2JhbHNldHZhcigibmFtZSIsICIwIikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChGYWxzZSwgdi5nZXQoKSkKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfdmFsdWVfZG9tYWluKHNlbGYpOgorICAgICAgICB2ID0gQm9vbGVhblZhcihzZWxmLnJvb3QsIG5hbWU9Im5hbWUiKQorICAgICAgICBzZWxmLnJvb3QuZ2xvYmFsc2V0dmFyKCJuYW1lIiwgInZhbHVlIikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUY2xFcnJvcik6CisgICAgICAgICAgICB2LmdldCgpCisgICAgICAgIHNlbGYucm9vdC5nbG9iYWxzZXR2YXIoIm5hbWUiLCAiMS4wIikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUY2xFcnJvcik6CisgICAgICAgICAgICB2LmdldCgpCisKKwordGVzdHNfZ3VpID0gKFRlc3RWYXJpYWJsZSwgVGVzdFN0cmluZ1ZhciwgVGVzdEludFZhciwKKyAgICAgICAgICAgICBUZXN0RG91YmxlVmFyLCBUZXN0Qm9vbGVhblZhcikKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKKyAgICBydW5fdW5pdHRlc3QoKnRlc3RzX2d1aSkKZGlmZiAtLWdpdCBhL0xpYi9saWItdGsvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF93aWRnZXRzLnB5IGIvTGliL2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X3dpZGdldHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVjNzE4NwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9saWItdGsvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF93aWRnZXRzLnB5CkBAIC0wLDAgKzEsMTE5MCBAQAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgVGtpbnRlcgorZnJvbSBUa2ludGVyIGltcG9ydCBUY2xFcnJvcgoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCByZXF1aXJlcywgcnVuX3VuaXR0ZXN0CisKK2Zyb20gdGVzdF90dGsuc3VwcG9ydCBpbXBvcnQgKHRjbF92ZXJzaW9uLCByZXF1aXJlc190Y2wsIGdldF90a19wYXRjaGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0X2VxKQorZnJvbSB3aWRnZXRfdGVzdHMgaW1wb3J0ICgKKyAgICBhZGRfc3RhbmRhcmRfb3B0aW9ucywgbm9jb252LCBub2NvbnZfbWV0aCwgaW50X3JvdW5kLCBwaXhlbHNfcm91bmQsCisgICAgQWJzdHJhY3RXaWRnZXRUZXN0LCBTdGFuZGFyZE9wdGlvbnNUZXN0cywKKyAgICBJbnRlZ2VyU2l6ZVRlc3RzLCBQaXhlbFNpemVUZXN0cywKKyAgICBzZXRVcE1vZHVsZSkKKworcmVxdWlyZXMoJ2d1aScpCisKKworY2xhc3MgQWJzdHJhY3RUb3BsZXZlbFRlc3QoQWJzdHJhY3RXaWRnZXRUZXN0LCBQaXhlbFNpemVUZXN0cyk6CisgICAgX2NvbnZfcGFkX3BpeGVscyA9IG5vY29udl9tZXRoCisKKyAgICBkZWYgdGVzdF9jbGFzcyhzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdpZGdldFsnY2xhc3MnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXQuX19jbGFzc19fLl9fbmFtZV9fLnRpdGxlKCkpCisgICAgICAgIHNlbGYuY2hlY2tJbnZhbGlkUGFyYW0od2lkZ2V0LCAnY2xhc3MnLCAnRm9vJywKKyAgICAgICAgICAgICAgICBlcnJtc2c9ImNhbid0IG1vZGlmeSAtY2xhc3Mgb3B0aW9uIGFmdGVyIHdpZGdldCBpcyBjcmVhdGVkIikKKyAgICAgICAgd2lkZ2V0MiA9IHNlbGYuY3JlYXRlKGNsYXNzXz0nRm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3aWRnZXQyWydjbGFzcyddLCAnRm9vJykKKworICAgIGRlZiB0ZXN0X2NvbG9ybWFwKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2lkZ2V0Wydjb2xvcm1hcCddLCAnJykKKyAgICAgICAgc2VsZi5jaGVja0ludmFsaWRQYXJhbSh3aWRnZXQsICdjb2xvcm1hcCcsICduZXcnLAorICAgICAgICAgICAgICAgIGVycm1zZz0iY2FuJ3QgbW9kaWZ5IC1jb2xvcm1hcCBvcHRpb24gYWZ0ZXIgd2lkZ2V0IGlzIGNyZWF0ZWQiKQorICAgICAgICB3aWRnZXQyID0gc2VsZi5jcmVhdGUoY29sb3JtYXA9J25ldycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2lkZ2V0MlsnY29sb3JtYXAnXSwgJ25ldycpCisKKyAgICBkZWYgdGVzdF9jb250YWluZXIoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3aWRnZXRbJ2NvbnRhaW5lciddLCAwIGlmIHNlbGYud2FudG9iamVjdHMgZWxzZSAnMCcpCisgICAgICAgIHNlbGYuY2hlY2tJbnZhbGlkUGFyYW0od2lkZ2V0LCAnY29udGFpbmVyJywgMSwKKyAgICAgICAgICAgICAgICBlcnJtc2c9ImNhbid0IG1vZGlmeSAtY29udGFpbmVyIG9wdGlvbiBhZnRlciB3aWRnZXQgaXMgY3JlYXRlZCIpCisgICAgICAgIHdpZGdldDIgPSBzZWxmLmNyZWF0ZShjb250YWluZXI9VHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3aWRnZXQyWydjb250YWluZXInXSwgMSBpZiBzZWxmLndhbnRvYmplY3RzIGVsc2UgJzEnKQorCisgICAgZGVmIHRlc3RfdmlzdWFsKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2lkZ2V0Wyd2aXN1YWwnXSwgJycpCisgICAgICAgIHNlbGYuY2hlY2tJbnZhbGlkUGFyYW0od2lkZ2V0LCAndmlzdWFsJywgJ2RlZmF1bHQnLAorICAgICAgICAgICAgICAgIGVycm1zZz0iY2FuJ3QgbW9kaWZ5IC12aXN1YWwgb3B0aW9uIGFmdGVyIHdpZGdldCBpcyBjcmVhdGVkIikKKyAgICAgICAgd2lkZ2V0MiA9IHNlbGYuY3JlYXRlKHZpc3VhbD0nZGVmYXVsdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2lkZ2V0MlsndmlzdWFsJ10sICdkZWZhdWx0JykKKworCitAYWRkX3N0YW5kYXJkX29wdGlvbnMoU3RhbmRhcmRPcHRpb25zVGVzdHMpCitjbGFzcyBUb3BsZXZlbFRlc3QoQWJzdHJhY3RUb3BsZXZlbFRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBPUFRJT05TID0gKAorICAgICAgICAnYmFja2dyb3VuZCcsICdib3JkZXJ3aWR0aCcsCisgICAgICAgICdjbGFzcycsICdjb2xvcm1hcCcsICdjb250YWluZXInLCAnY3Vyc29yJywgJ2hlaWdodCcsCisgICAgICAgICdoaWdobGlnaHRiYWNrZ3JvdW5kJywgJ2hpZ2hsaWdodGNvbG9yJywgJ2hpZ2hsaWdodHRoaWNrbmVzcycsCisgICAgICAgICdtZW51JywgJ3BhZHgnLCAncGFkeScsICdyZWxpZWYnLCAnc2NyZWVuJywKKyAgICAgICAgJ3Rha2Vmb2N1cycsICd1c2UnLCAndmlzdWFsJywgJ3dpZHRoJywKKyAgICApCisKKyAgICBkZWYgX2NyZWF0ZShzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBUa2ludGVyLlRvcGxldmVsKHNlbGYucm9vdCwgKiprd2FyZ3MpCisKKyAgICBkZWYgdGVzdF9tZW51KHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIG1lbnUgPSBUa2ludGVyLk1lbnUoc2VsZi5yb290KQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnbWVudScsIG1lbnUsIGVxPXdpZGdldF9lcSkKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ21lbnUnLCAnJykKKworICAgIGRlZiB0ZXN0X3NjcmVlbihzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdpZGdldFsnc2NyZWVuJ10sICcnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkaXNwbGF5ID0gb3MuZW52aXJvblsnRElTUExBWSddCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ05vICRESVNQTEFZIHNldC4nKQorICAgICAgICBzZWxmLmNoZWNrSW52YWxpZFBhcmFtKHdpZGdldCwgJ3NjcmVlbicsIGRpc3BsYXksCisgICAgICAgICAgICAgICAgZXJybXNnPSJjYW4ndCBtb2RpZnkgLXNjcmVlbiBvcHRpb24gYWZ0ZXIgd2lkZ2V0IGlzIGNyZWF0ZWQiKQorICAgICAgICB3aWRnZXQyID0gc2VsZi5jcmVhdGUoc2NyZWVuPWRpc3BsYXkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2lkZ2V0Mlsnc2NyZWVuJ10sIGRpc3BsYXkpCisKKyAgICBkZWYgdGVzdF91c2Uoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3aWRnZXRbJ3VzZSddLCAnJykKKyAgICAgICAgcGFyZW50ID0gc2VsZi5jcmVhdGUoY29udGFpbmVyPVRydWUpCisgICAgICAgIHdpZCA9IHBhcmVudC53aW5mb19pZCgpCisgICAgICAgIHdpZGdldDIgPSBzZWxmLmNyZWF0ZSh1c2U9d2lkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCh3aWRnZXQyWyd1c2UnXSksIHdpZCkKKworCitAYWRkX3N0YW5kYXJkX29wdGlvbnMoU3RhbmRhcmRPcHRpb25zVGVzdHMpCitjbGFzcyBGcmFtZVRlc3QoQWJzdHJhY3RUb3BsZXZlbFRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBPUFRJT05TID0gKAorICAgICAgICAnYmFja2dyb3VuZCcsICdib3JkZXJ3aWR0aCcsCisgICAgICAgICdjbGFzcycsICdjb2xvcm1hcCcsICdjb250YWluZXInLCAnY3Vyc29yJywgJ2hlaWdodCcsCisgICAgICAgICdoaWdobGlnaHRiYWNrZ3JvdW5kJywgJ2hpZ2hsaWdodGNvbG9yJywgJ2hpZ2hsaWdodHRoaWNrbmVzcycsCisgICAgICAgICdyZWxpZWYnLCAndGFrZWZvY3VzJywgJ3Zpc3VhbCcsICd3aWR0aCcsCisgICAgKQorCisgICAgZGVmIF9jcmVhdGUoc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gVGtpbnRlci5GcmFtZShzZWxmLnJvb3QsICoqa3dhcmdzKQorCisKK0BhZGRfc3RhbmRhcmRfb3B0aW9ucyhTdGFuZGFyZE9wdGlvbnNUZXN0cykKK2NsYXNzIExhYmVsRnJhbWVUZXN0KEFic3RyYWN0VG9wbGV2ZWxUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgT1BUSU9OUyA9ICgKKyAgICAgICAgJ2JhY2tncm91bmQnLCAnYm9yZGVyd2lkdGgnLAorICAgICAgICAnY2xhc3MnLCAnY29sb3JtYXAnLCAnY29udGFpbmVyJywgJ2N1cnNvcicsCisgICAgICAgICdmb250JywgJ2ZvcmVncm91bmQnLCAnaGVpZ2h0JywKKyAgICAgICAgJ2hpZ2hsaWdodGJhY2tncm91bmQnLCAnaGlnaGxpZ2h0Y29sb3InLCAnaGlnaGxpZ2h0dGhpY2tuZXNzJywKKyAgICAgICAgJ2xhYmVsYW5jaG9yJywgJ2xhYmVsd2lkZ2V0JywgJ3BhZHgnLCAncGFkeScsICdyZWxpZWYnLAorICAgICAgICAndGFrZWZvY3VzJywgJ3RleHQnLCAndmlzdWFsJywgJ3dpZHRoJywKKyAgICApCisKKyAgICBkZWYgX2NyZWF0ZShzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBUa2ludGVyLkxhYmVsRnJhbWUoc2VsZi5yb290LCAqKmt3YXJncykKKworICAgIGRlZiB0ZXN0X2xhYmVsYW5jaG9yKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tFbnVtUGFyYW0od2lkZ2V0LCAnbGFiZWxhbmNob3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJywgJ2VuJywgJ2VzJywgJ24nLCAnbmUnLCAnbncnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJywgJ3NlJywgJ3N3JywgJ3cnLCAnd24nLCAnd3MnKQorICAgICAgICBzZWxmLmNoZWNrSW52YWxpZFBhcmFtKHdpZGdldCwgJ2xhYmVsYW5jaG9yJywgJ2NlbnRlcicpCisKKyAgICBkZWYgdGVzdF9sYWJlbHdpZGdldChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBsYWJlbCA9IFRraW50ZXIuTGFiZWwoc2VsZi5yb290LCB0ZXh0PSdNdXBwJywgbmFtZT0nZm9vJykKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ2xhYmVsd2lkZ2V0JywgbGFiZWwsIGV4cGVjdGVkPScuZm9vJykKKyAgICAgICAgbGFiZWwuZGVzdHJveSgpCisKKworY2xhc3MgQWJzdHJhY3RMYWJlbFRlc3QoQWJzdHJhY3RXaWRnZXRUZXN0LCBJbnRlZ2VyU2l6ZVRlc3RzKToKKyAgICBfY29udl9waXhlbHMgPSBub2NvbnZfbWV0aAorCisgICAgZGVmIHRlc3RfaGlnaGxpZ2h0dGhpY2tuZXNzKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tQaXhlbHNQYXJhbSh3aWRnZXQsICdoaWdobGlnaHR0aGlja25lc3MnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMS4zLCAyLjYsIDYsIC0yLCAnMTBwJykKKworCitAYWRkX3N0YW5kYXJkX29wdGlvbnMoU3RhbmRhcmRPcHRpb25zVGVzdHMpCitjbGFzcyBMYWJlbFRlc3QoQWJzdHJhY3RMYWJlbFRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBPUFRJT05TID0gKAorICAgICAgICAnYWN0aXZlYmFja2dyb3VuZCcsICdhY3RpdmVmb3JlZ3JvdW5kJywgJ2FuY2hvcicsCisgICAgICAgICdiYWNrZ3JvdW5kJywgJ2JpdG1hcCcsICdib3JkZXJ3aWR0aCcsICdjb21wb3VuZCcsICdjdXJzb3InLAorICAgICAgICAnZGlzYWJsZWRmb3JlZ3JvdW5kJywgJ2ZvbnQnLCAnZm9yZWdyb3VuZCcsICdoZWlnaHQnLAorICAgICAgICAnaGlnaGxpZ2h0YmFja2dyb3VuZCcsICdoaWdobGlnaHRjb2xvcicsICdoaWdobGlnaHR0aGlja25lc3MnLAorICAgICAgICAnaW1hZ2UnLCAnanVzdGlmeScsICdwYWR4JywgJ3BhZHknLCAncmVsaWVmJywgJ3N0YXRlJywKKyAgICAgICAgJ3Rha2Vmb2N1cycsICd0ZXh0JywgJ3RleHR2YXJpYWJsZScsCisgICAgICAgICd1bmRlcmxpbmUnLCAnd2lkdGgnLCAnd3JhcGxlbmd0aCcsCisgICAgKQorCisgICAgZGVmIF9jcmVhdGUoc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gVGtpbnRlci5MYWJlbChzZWxmLnJvb3QsICoqa3dhcmdzKQorCisKK0BhZGRfc3RhbmRhcmRfb3B0aW9ucyhTdGFuZGFyZE9wdGlvbnNUZXN0cykKK2NsYXNzIEJ1dHRvblRlc3QoQWJzdHJhY3RMYWJlbFRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBPUFRJT05TID0gKAorICAgICAgICAnYWN0aXZlYmFja2dyb3VuZCcsICdhY3RpdmVmb3JlZ3JvdW5kJywgJ2FuY2hvcicsCisgICAgICAgICdiYWNrZ3JvdW5kJywgJ2JpdG1hcCcsICdib3JkZXJ3aWR0aCcsCisgICAgICAgICdjb21tYW5kJywgJ2NvbXBvdW5kJywgJ2N1cnNvcicsICdkZWZhdWx0JywKKyAgICAgICAgJ2Rpc2FibGVkZm9yZWdyb3VuZCcsICdmb250JywgJ2ZvcmVncm91bmQnLCAnaGVpZ2h0JywKKyAgICAgICAgJ2hpZ2hsaWdodGJhY2tncm91bmQnLCAnaGlnaGxpZ2h0Y29sb3InLCAnaGlnaGxpZ2h0dGhpY2tuZXNzJywKKyAgICAgICAgJ2ltYWdlJywgJ2p1c3RpZnknLCAnb3ZlcnJlbGllZicsICdwYWR4JywgJ3BhZHknLCAncmVsaWVmJywKKyAgICAgICAgJ3JlcGVhdGRlbGF5JywgJ3JlcGVhdGludGVydmFsJywKKyAgICAgICAgJ3N0YXRlJywgJ3Rha2Vmb2N1cycsICd0ZXh0JywgJ3RleHR2YXJpYWJsZScsCisgICAgICAgICd1bmRlcmxpbmUnLCAnd2lkdGgnLCAnd3JhcGxlbmd0aCcpCisKKyAgICBkZWYgX2NyZWF0ZShzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBUa2ludGVyLkJ1dHRvbihzZWxmLnJvb3QsICoqa3dhcmdzKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrRW51bVBhcmFtKHdpZGdldCwgJ2RlZmF1bHQnLCAnYWN0aXZlJywgJ2Rpc2FibGVkJywgJ25vcm1hbCcpCisKKworQGFkZF9zdGFuZGFyZF9vcHRpb25zKFN0YW5kYXJkT3B0aW9uc1Rlc3RzKQorY2xhc3MgQ2hlY2tidXR0b25UZXN0KEFic3RyYWN0TGFiZWxUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgT1BUSU9OUyA9ICgKKyAgICAgICAgJ2FjdGl2ZWJhY2tncm91bmQnLCAnYWN0aXZlZm9yZWdyb3VuZCcsICdhbmNob3InLAorICAgICAgICAnYmFja2dyb3VuZCcsICdiaXRtYXAnLCAnYm9yZGVyd2lkdGgnLAorICAgICAgICAnY29tbWFuZCcsICdjb21wb3VuZCcsICdjdXJzb3InLAorICAgICAgICAnZGlzYWJsZWRmb3JlZ3JvdW5kJywgJ2ZvbnQnLCAnZm9yZWdyb3VuZCcsICdoZWlnaHQnLAorICAgICAgICAnaGlnaGxpZ2h0YmFja2dyb3VuZCcsICdoaWdobGlnaHRjb2xvcicsICdoaWdobGlnaHR0aGlja25lc3MnLAorICAgICAgICAnaW1hZ2UnLCAnaW5kaWNhdG9yb24nLCAnanVzdGlmeScsCisgICAgICAgICdvZmZyZWxpZWYnLCAnb2ZmdmFsdWUnLCAnb252YWx1ZScsICdvdmVycmVsaWVmJywKKyAgICAgICAgJ3BhZHgnLCAncGFkeScsICdyZWxpZWYnLCAnc2VsZWN0Y29sb3InLCAnc2VsZWN0aW1hZ2UnLCAnc3RhdGUnLAorICAgICAgICAndGFrZWZvY3VzJywgJ3RleHQnLCAndGV4dHZhcmlhYmxlJywKKyAgICAgICAgJ3RyaXN0YXRlaW1hZ2UnLCAndHJpc3RhdGV2YWx1ZScsCisgICAgICAgICd1bmRlcmxpbmUnLCAndmFyaWFibGUnLCAnd2lkdGgnLCAnd3JhcGxlbmd0aCcsCisgICAgKQorCisgICAgZGVmIF9jcmVhdGUoc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gVGtpbnRlci5DaGVja2J1dHRvbihzZWxmLnJvb3QsICoqa3dhcmdzKQorCisKKyAgICBkZWYgdGVzdF9vZmZ2YWx1ZShzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW1zKHdpZGdldCwgJ29mZnZhbHVlJywgMSwgMi4zLCAnJywgJ2FueSBzdHJpbmcnKQorCisgICAgZGVmIHRlc3Rfb252YWx1ZShzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW1zKHdpZGdldCwgJ29udmFsdWUnLCAxLCAyLjMsICcnLCAnYW55IHN0cmluZycpCisKKworQGFkZF9zdGFuZGFyZF9vcHRpb25zKFN0YW5kYXJkT3B0aW9uc1Rlc3RzKQorY2xhc3MgUmFkaW9idXR0b25UZXN0KEFic3RyYWN0TGFiZWxUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgT1BUSU9OUyA9ICgKKyAgICAgICAgJ2FjdGl2ZWJhY2tncm91bmQnLCAnYWN0aXZlZm9yZWdyb3VuZCcsICdhbmNob3InLAorICAgICAgICAnYmFja2dyb3VuZCcsICdiaXRtYXAnLCAnYm9yZGVyd2lkdGgnLAorICAgICAgICAnY29tbWFuZCcsICdjb21wb3VuZCcsICdjdXJzb3InLAorICAgICAgICAnZGlzYWJsZWRmb3JlZ3JvdW5kJywgJ2ZvbnQnLCAnZm9yZWdyb3VuZCcsICdoZWlnaHQnLAorICAgICAgICAnaGlnaGxpZ2h0YmFja2dyb3VuZCcsICdoaWdobGlnaHRjb2xvcicsICdoaWdobGlnaHR0aGlja25lc3MnLAorICAgICAgICAnaW1hZ2UnLCAnaW5kaWNhdG9yb24nLCAnanVzdGlmeScsICdvZmZyZWxpZWYnLCAnb3ZlcnJlbGllZicsCisgICAgICAgICdwYWR4JywgJ3BhZHknLCAncmVsaWVmJywgJ3NlbGVjdGNvbG9yJywgJ3NlbGVjdGltYWdlJywgJ3N0YXRlJywKKyAgICAgICAgJ3Rha2Vmb2N1cycsICd0ZXh0JywgJ3RleHR2YXJpYWJsZScsCisgICAgICAgICd0cmlzdGF0ZWltYWdlJywgJ3RyaXN0YXRldmFsdWUnLAorICAgICAgICAndW5kZXJsaW5lJywgJ3ZhbHVlJywgJ3ZhcmlhYmxlJywgJ3dpZHRoJywgJ3dyYXBsZW5ndGgnLAorICAgICkKKworICAgIGRlZiBfY3JlYXRlKHNlbGYsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIFRraW50ZXIuUmFkaW9idXR0b24oc2VsZi5yb290LCAqKmt3YXJncykKKworICAgIGRlZiB0ZXN0X3ZhbHVlKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbXMod2lkZ2V0LCAndmFsdWUnLCAxLCAyLjMsICcnLCAnYW55IHN0cmluZycpCisKKworQGFkZF9zdGFuZGFyZF9vcHRpb25zKFN0YW5kYXJkT3B0aW9uc1Rlc3RzKQorY2xhc3MgTWVudWJ1dHRvblRlc3QoQWJzdHJhY3RMYWJlbFRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBPUFRJT05TID0gKAorICAgICAgICAnYWN0aXZlYmFja2dyb3VuZCcsICdhY3RpdmVmb3JlZ3JvdW5kJywgJ2FuY2hvcicsCisgICAgICAgICdiYWNrZ3JvdW5kJywgJ2JpdG1hcCcsICdib3JkZXJ3aWR0aCcsCisgICAgICAgICdjb21wb3VuZCcsICdjdXJzb3InLCAnZGlyZWN0aW9uJywKKyAgICAgICAgJ2Rpc2FibGVkZm9yZWdyb3VuZCcsICdmb250JywgJ2ZvcmVncm91bmQnLCAnaGVpZ2h0JywKKyAgICAgICAgJ2hpZ2hsaWdodGJhY2tncm91bmQnLCAnaGlnaGxpZ2h0Y29sb3InLCAnaGlnaGxpZ2h0dGhpY2tuZXNzJywKKyAgICAgICAgJ2ltYWdlJywgJ2luZGljYXRvcm9uJywgJ2p1c3RpZnknLCAnbWVudScsCisgICAgICAgICdwYWR4JywgJ3BhZHknLCAncmVsaWVmJywgJ3N0YXRlJywKKyAgICAgICAgJ3Rha2Vmb2N1cycsICd0ZXh0JywgJ3RleHR2YXJpYWJsZScsCisgICAgICAgICd1bmRlcmxpbmUnLCAnd2lkdGgnLCAnd3JhcGxlbmd0aCcsCisgICAgKQorICAgIF9jb252X3BpeGVscyA9IHN0YXRpY21ldGhvZChwaXhlbHNfcm91bmQpCisKKyAgICBkZWYgX2NyZWF0ZShzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBUa2ludGVyLk1lbnVidXR0b24oc2VsZi5yb290LCAqKmt3YXJncykKKworICAgIGRlZiB0ZXN0X2RpcmVjdGlvbihzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrRW51bVBhcmFtKHdpZGdldCwgJ2RpcmVjdGlvbicsCisgICAgICAgICAgICAgICAgJ2Fib3ZlJywgJ2JlbG93JywgJ2ZsdXNoJywgJ2xlZnQnLCAncmlnaHQnKQorCisgICAgZGVmIHRlc3RfaGVpZ2h0KHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tJbnRlZ2VyUGFyYW0od2lkZ2V0LCAnaGVpZ2h0JywgMTAwLCAtMTAwLCAwLCBjb252PXN0cikKKworICAgIHRlc3RfaGlnaGxpZ2h0dGhpY2tuZXNzID0gU3RhbmRhcmRPcHRpb25zVGVzdHMudGVzdF9oaWdobGlnaHR0aGlja25lc3MuaW1fZnVuYworCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0gJ2RhcndpbicsCisgICAgICAgICAgICAgICAgICAgICAnY3Jhc2hlcyB3aXRoIENvY29hIFRrIChpc3N1ZTE5NzMzKScpCisgICAgZGVmIHRlc3RfaW1hZ2Uoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgaW1hZ2UgPSBUa2ludGVyLlBob3RvSW1hZ2UoJ2ltYWdlMScpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbSh3aWRnZXQsICdpbWFnZScsIGltYWdlLCBjb252PXN0cikKKyAgICAgICAgZXJybXNnID0gJ2ltYWdlICJzcGFtIiBkb2VzblwndCBleGlzdCcKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yKSBhcyBjbToKKyAgICAgICAgICAgIHdpZGdldFsnaW1hZ2UnXSA9ICdzcGFtJworICAgICAgICBpZiBlcnJtc2cgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLCBlcnJtc2cpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvcikgYXMgY206CisgICAgICAgICAgICB3aWRnZXQuY29uZmlndXJlKHsnaW1hZ2UnOiAnc3BhbSd9KQorICAgICAgICBpZiBlcnJtc2cgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLCBlcnJtc2cpCisKKyAgICBkZWYgdGVzdF9tZW51KHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIG1lbnUgPSBUa2ludGVyLk1lbnUod2lkZ2V0LCBuYW1lPSdtZW51JykKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ21lbnUnLCBtZW51LCBlcT13aWRnZXRfZXEpCisgICAgICAgIG1lbnUuZGVzdHJveSgpCisKKyAgICBkZWYgdGVzdF9wYWR4KHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tQaXhlbHNQYXJhbSh3aWRnZXQsICdwYWR4JywgMywgNC40LCA1LjYsICcxMm0nKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAncGFkeCcsIC0yLCBleHBlY3RlZD0wKQorCisgICAgZGVmIHRlc3RfcGFkeShzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGl4ZWxzUGFyYW0od2lkZ2V0LCAncGFkeScsIDMsIDQuNCwgNS42LCAnMTJtJykKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ3BhZHknLCAtMiwgZXhwZWN0ZWQ9MCkKKworICAgIGRlZiB0ZXN0X3dpZHRoKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tJbnRlZ2VyUGFyYW0od2lkZ2V0LCAnd2lkdGgnLCA0MDIsIC00MDIsIDAsIGNvbnY9c3RyKQorCisKK2NsYXNzIE9wdGlvbk1lbnVUZXN0KE1lbnVidXR0b25UZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgX2NyZWF0ZShzZWxmLCBkZWZhdWx0PSdiJywgdmFsdWVzPSgnYScsICdiJywgJ2MnKSwgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gVGtpbnRlci5PcHRpb25NZW51KHNlbGYucm9vdCwgTm9uZSwgZGVmYXVsdCwgKnZhbHVlcywgKiprd2FyZ3MpCisKKworQGFkZF9zdGFuZGFyZF9vcHRpb25zKEludGVnZXJTaXplVGVzdHMsIFN0YW5kYXJkT3B0aW9uc1Rlc3RzKQorY2xhc3MgRW50cnlUZXN0KEFic3RyYWN0V2lkZ2V0VGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIE9QVElPTlMgPSAoCisgICAgICAgICdiYWNrZ3JvdW5kJywgJ2JvcmRlcndpZHRoJywgJ2N1cnNvcicsCisgICAgICAgICdkaXNhYmxlZGJhY2tncm91bmQnLCAnZGlzYWJsZWRmb3JlZ3JvdW5kJywKKyAgICAgICAgJ2V4cG9ydHNlbGVjdGlvbicsICdmb250JywgJ2ZvcmVncm91bmQnLAorICAgICAgICAnaGlnaGxpZ2h0YmFja2dyb3VuZCcsICdoaWdobGlnaHRjb2xvcicsICdoaWdobGlnaHR0aGlja25lc3MnLAorICAgICAgICAnaW5zZXJ0YmFja2dyb3VuZCcsICdpbnNlcnRib3JkZXJ3aWR0aCcsCisgICAgICAgICdpbnNlcnRvZmZ0aW1lJywgJ2luc2VydG9udGltZScsICdpbnNlcnR3aWR0aCcsCisgICAgICAgICdpbnZhbGlkY29tbWFuZCcsICdqdXN0aWZ5JywgJ3JlYWRvbmx5YmFja2dyb3VuZCcsICdyZWxpZWYnLAorICAgICAgICAnc2VsZWN0YmFja2dyb3VuZCcsICdzZWxlY3Rib3JkZXJ3aWR0aCcsICdzZWxlY3Rmb3JlZ3JvdW5kJywKKyAgICAgICAgJ3Nob3cnLCAnc3RhdGUnLCAndGFrZWZvY3VzJywgJ3RleHR2YXJpYWJsZScsCisgICAgICAgICd2YWxpZGF0ZScsICd2YWxpZGF0ZWNvbW1hbmQnLCAnd2lkdGgnLCAneHNjcm9sbGNvbW1hbmQnLAorICAgICkKKworICAgIGRlZiBfY3JlYXRlKHNlbGYsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIFRraW50ZXIuRW50cnkoc2VsZi5yb290LCAqKmt3YXJncykKKworICAgIGRlZiB0ZXN0X2Rpc2FibGVkYmFja2dyb3VuZChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrQ29sb3JQYXJhbSh3aWRnZXQsICdkaXNhYmxlZGJhY2tncm91bmQnKQorCisgICAgZGVmIHRlc3RfaW5zZXJ0Ym9yZGVyd2lkdGgoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKGluc2VydHdpZHRoPTEwMCkKKyAgICAgICAgc2VsZi5jaGVja1BpeGVsc1BhcmFtKHdpZGdldCwgJ2luc2VydGJvcmRlcndpZHRoJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEuMywgMi42LCA2LCAtMiwgJzEwcCcpCisgICAgICAgICMgaW5zZXJ0Ym9yZGVyd2lkdGggaXMgYm91bmRlZCBhYm92ZSBieSBhIGhhbGYgb2YgaW5zZXJ0d2lkdGguCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbSh3aWRnZXQsICdpbnNlcnRib3JkZXJ3aWR0aCcsIDYwLCBleHBlY3RlZD0xMDAvLzIpCisKKyAgICBkZWYgdGVzdF9pbnNlcnR3aWR0aChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGl4ZWxzUGFyYW0od2lkZ2V0LCAnaW5zZXJ0d2lkdGgnLCAxLjMsIDMuNiwgJzEwcCcpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbSh3aWRnZXQsICdpbnNlcnR3aWR0aCcsIDAuMSwgZXhwZWN0ZWQ9MikKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ2luc2VydHdpZHRoJywgLTIsIGV4cGVjdGVkPTIpCisgICAgICAgIGlmIHBpeGVsc19yb3VuZCgwLjkpIDw9IDA6CisgICAgICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnaW5zZXJ0d2lkdGgnLCAwLjksIGV4cGVjdGVkPTIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnaW5zZXJ0d2lkdGgnLCAwLjksIGV4cGVjdGVkPTEpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkY29tbWFuZChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrQ29tbWFuZFBhcmFtKHdpZGdldCwgJ2ludmFsaWRjb21tYW5kJykKKyAgICAgICAgc2VsZi5jaGVja0NvbW1hbmRQYXJhbSh3aWRnZXQsICdpbnZjbWQnKQorCisgICAgZGVmIHRlc3RfcmVhZG9ubHliYWNrZ3JvdW5kKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tDb2xvclBhcmFtKHdpZGdldCwgJ3JlYWRvbmx5YmFja2dyb3VuZCcpCisKKyAgICBkZWYgdGVzdF9zaG93KHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbSh3aWRnZXQsICdzaG93JywgJyonKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnc2hvdycsICcnKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnc2hvdycsICcgJykKKworICAgIGRlZiB0ZXN0X3N0YXRlKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tFbnVtUGFyYW0od2lkZ2V0LCAnc3RhdGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXNhYmxlZCcsICdub3JtYWwnLCAncmVhZG9ubHknKQorCisgICAgZGVmIHRlc3RfdmFsaWRhdGUoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja0VudW1QYXJhbSh3aWRnZXQsICd2YWxpZGF0ZScsCisgICAgICAgICAgICAgICAgJ2FsbCcsICdrZXknLCAnZm9jdXMnLCAnZm9jdXNpbicsICdmb2N1c291dCcsICdub25lJykKKworICAgIGRlZiB0ZXN0X3ZhbGlkYXRlY29tbWFuZChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrQ29tbWFuZFBhcmFtKHdpZGdldCwgJ3ZhbGlkYXRlY29tbWFuZCcpCisgICAgICAgIHNlbGYuY2hlY2tDb21tYW5kUGFyYW0od2lkZ2V0LCAndmNtZCcpCisKKworQGFkZF9zdGFuZGFyZF9vcHRpb25zKFN0YW5kYXJkT3B0aW9uc1Rlc3RzKQorY2xhc3MgU3BpbmJveFRlc3QoRW50cnlUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgT1BUSU9OUyA9ICgKKyAgICAgICAgJ2FjdGl2ZWJhY2tncm91bmQnLCAnYmFja2dyb3VuZCcsICdib3JkZXJ3aWR0aCcsCisgICAgICAgICdidXR0b25iYWNrZ3JvdW5kJywgJ2J1dHRvbmN1cnNvcicsICdidXR0b25kb3ducmVsaWVmJywgJ2J1dHRvbnVwcmVsaWVmJywKKyAgICAgICAgJ2NvbW1hbmQnLCAnY3Vyc29yJywgJ2Rpc2FibGVkYmFja2dyb3VuZCcsICdkaXNhYmxlZGZvcmVncm91bmQnLAorICAgICAgICAnZXhwb3J0c2VsZWN0aW9uJywgJ2ZvbnQnLCAnZm9yZWdyb3VuZCcsICdmb3JtYXQnLCAnZnJvbScsCisgICAgICAgICdoaWdobGlnaHRiYWNrZ3JvdW5kJywgJ2hpZ2hsaWdodGNvbG9yJywgJ2hpZ2hsaWdodHRoaWNrbmVzcycsCisgICAgICAgICdpbmNyZW1lbnQnLAorICAgICAgICAnaW5zZXJ0YmFja2dyb3VuZCcsICdpbnNlcnRib3JkZXJ3aWR0aCcsCisgICAgICAgICdpbnNlcnRvZmZ0aW1lJywgJ2luc2VydG9udGltZScsICdpbnNlcnR3aWR0aCcsCisgICAgICAgICdpbnZhbGlkY29tbWFuZCcsICdqdXN0aWZ5JywgJ3JlbGllZicsICdyZWFkb25seWJhY2tncm91bmQnLAorICAgICAgICAncmVwZWF0ZGVsYXknLCAncmVwZWF0aW50ZXJ2YWwnLAorICAgICAgICAnc2VsZWN0YmFja2dyb3VuZCcsICdzZWxlY3Rib3JkZXJ3aWR0aCcsICdzZWxlY3Rmb3JlZ3JvdW5kJywKKyAgICAgICAgJ3N0YXRlJywgJ3Rha2Vmb2N1cycsICd0ZXh0dmFyaWFibGUnLCAndG8nLAorICAgICAgICAndmFsaWRhdGUnLCAndmFsaWRhdGVjb21tYW5kJywgJ3ZhbHVlcycsCisgICAgICAgICd3aWR0aCcsICd3cmFwJywgJ3hzY3JvbGxjb21tYW5kJywKKyAgICApCisKKyAgICBkZWYgX2NyZWF0ZShzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBUa2ludGVyLlNwaW5ib3goc2VsZi5yb290LCAqKmt3YXJncykKKworICAgIHRlc3Rfc2hvdyA9IE5vbmUKKworICAgIGRlZiB0ZXN0X2J1dHRvbmJhY2tncm91bmQoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja0NvbG9yUGFyYW0od2lkZ2V0LCAnYnV0dG9uYmFja2dyb3VuZCcpCisKKyAgICBkZWYgdGVzdF9idXR0b25jdXJzb3Ioc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja0N1cnNvclBhcmFtKHdpZGdldCwgJ2J1dHRvbmN1cnNvcicpCisKKyAgICBkZWYgdGVzdF9idXR0b25kb3ducmVsaWVmKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tSZWxpZWZQYXJhbSh3aWRnZXQsICdidXR0b25kb3ducmVsaWVmJykKKworICAgIGRlZiB0ZXN0X2J1dHRvbnVwcmVsaWVmKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tSZWxpZWZQYXJhbSh3aWRnZXQsICdidXR0b251cHJlbGllZicpCisKKyAgICBkZWYgdGVzdF9mb3JtYXQoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ2Zvcm1hdCcsICclMmYnKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnZm9ybWF0JywgJyUyLjJmJykKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ2Zvcm1hdCcsICclLjJmJykKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ2Zvcm1hdCcsICclMi5mJykKKyAgICAgICAgc2VsZi5jaGVja0ludmFsaWRQYXJhbSh3aWRnZXQsICdmb3JtYXQnLCAnJTJlLTFmJykKKyAgICAgICAgc2VsZi5jaGVja0ludmFsaWRQYXJhbSh3aWRnZXQsICdmb3JtYXQnLCAnMi4yJykKKyAgICAgICAgc2VsZi5jaGVja0ludmFsaWRQYXJhbSh3aWRnZXQsICdmb3JtYXQnLCAnJTIuLTJmJykKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ2Zvcm1hdCcsICclLTIuMDJmJykKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ2Zvcm1hdCcsICclIDIuMDJmJykKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ2Zvcm1hdCcsICclIC0yLjIwMGYnKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnZm9ybWF0JywgJyUwOS4yMDBmJykKKyAgICAgICAgc2VsZi5jaGVja0ludmFsaWRQYXJhbSh3aWRnZXQsICdmb3JtYXQnLCAnJWQnKQorCisgICAgZGVmIHRlc3RfZnJvbShzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAndG8nLCAxMDAuMCkKKyAgICAgICAgc2VsZi5jaGVja0Zsb2F0UGFyYW0od2lkZ2V0LCAnZnJvbScsIC0xMCwgMTAuMiwgMTEuNykKKyAgICAgICAgc2VsZi5jaGVja0ludmFsaWRQYXJhbSh3aWRnZXQsICdmcm9tJywgMjAwLAorICAgICAgICAgICAgICAgIGVycm1zZz0nLXRvIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIC1mcm9tIHZhbHVlJykKKworICAgIGRlZiB0ZXN0X2luY3JlbWVudChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrRmxvYXRQYXJhbSh3aWRnZXQsICdpbmNyZW1lbnQnLCAtMSwgMSwgMTAuMiwgMTIuOCwgMCkKKworICAgIGRlZiB0ZXN0X3RvKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbSh3aWRnZXQsICdmcm9tJywgLTEwMC4wKQorICAgICAgICBzZWxmLmNoZWNrRmxvYXRQYXJhbSh3aWRnZXQsICd0bycsIC0xMCwgMTAuMiwgMTEuNykKKyAgICAgICAgc2VsZi5jaGVja0ludmFsaWRQYXJhbSh3aWRnZXQsICd0bycsIC0yMDAsCisgICAgICAgICAgICAgICAgZXJybXNnPSctdG8gdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gLWZyb20gdmFsdWUnKQorCisgICAgZGVmIHRlc3RfdmFsdWVzKHNlbGYpOgorICAgICAgICAjIFhYWAorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2lkZ2V0Wyd2YWx1ZXMnXSwgJycpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbSh3aWRnZXQsICd2YWx1ZXMnLCAnbW9uIHR1ZSB3ZWQgdGh1cicpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbSh3aWRnZXQsICd2YWx1ZXMnLCAoJ21vbicsICd0dWUnLCAnd2VkJywgJ3RodXInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkPSdtb24gdHVlIHdlZCB0aHVyJykKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ3ZhbHVlcycsICg0MiwgMy4xNCwgJycsICdhbnkgc3RyaW5nJyksCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD0nNDIgMy4xNCB7fSB7YW55IHN0cmluZ30nKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAndmFsdWVzJywgJycpCisKKyAgICBkZWYgdGVzdF93cmFwKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tCb29sZWFuUGFyYW0od2lkZ2V0LCAnd3JhcCcpCisKKyAgICBkZWYgdGVzdF9iYm94KHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNCb3VuZGluZ0JveCh3aWRnZXQuYmJveCgwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgd2lkZ2V0LmJib3gsICdub2luZGV4JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgd2lkZ2V0LmJib3gsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgd2lkZ2V0LmJib3gpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgd2lkZ2V0LmJib3gsIDAsIDEpCisKKworQGFkZF9zdGFuZGFyZF9vcHRpb25zKFN0YW5kYXJkT3B0aW9uc1Rlc3RzKQorY2xhc3MgVGV4dFRlc3QoQWJzdHJhY3RXaWRnZXRUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgT1BUSU9OUyA9ICgKKyAgICAgICAgJ2F1dG9zZXBhcmF0b3JzJywgJ2JhY2tncm91bmQnLCAnYmxvY2tjdXJzb3InLCAnYm9yZGVyd2lkdGgnLAorICAgICAgICAnY3Vyc29yJywgJ2VuZGxpbmUnLCAnZXhwb3J0c2VsZWN0aW9uJywKKyAgICAgICAgJ2ZvbnQnLCAnZm9yZWdyb3VuZCcsICdoZWlnaHQnLAorICAgICAgICAnaGlnaGxpZ2h0YmFja2dyb3VuZCcsICdoaWdobGlnaHRjb2xvcicsICdoaWdobGlnaHR0aGlja25lc3MnLAorICAgICAgICAnaW5hY3RpdmVzZWxlY3RiYWNrZ3JvdW5kJywgJ2luc2VydGJhY2tncm91bmQnLCAnaW5zZXJ0Ym9yZGVyd2lkdGgnLAorICAgICAgICAnaW5zZXJ0b2ZmdGltZScsICdpbnNlcnRvbnRpbWUnLCAnaW5zZXJ0dW5mb2N1c3NlZCcsICdpbnNlcnR3aWR0aCcsCisgICAgICAgICdtYXh1bmRvJywgJ3BhZHgnLCAncGFkeScsICdyZWxpZWYnLAorICAgICAgICAnc2VsZWN0YmFja2dyb3VuZCcsICdzZWxlY3Rib3JkZXJ3aWR0aCcsICdzZWxlY3Rmb3JlZ3JvdW5kJywKKyAgICAgICAgJ3NldGdyaWQnLCAnc3BhY2luZzEnLCAnc3BhY2luZzInLCAnc3BhY2luZzMnLCAnc3RhcnRsaW5lJywgJ3N0YXRlJywKKyAgICAgICAgJ3RhYnMnLCAndGFic3R5bGUnLCAndGFrZWZvY3VzJywgJ3VuZG8nLCAnd2lkdGgnLCAnd3JhcCcsCisgICAgICAgICd4c2Nyb2xsY29tbWFuZCcsICd5c2Nyb2xsY29tbWFuZCcsCisgICAgKQorICAgIGlmIHRjbF92ZXJzaW9uIDwgKDgsIDUpOgorICAgICAgICB3YW50b2JqZWN0cyA9IEZhbHNlCisKKyAgICBkZWYgX2NyZWF0ZShzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBUa2ludGVyLlRleHQoc2VsZi5yb290LCAqKmt3YXJncykKKworICAgIGRlZiB0ZXN0X2F1dG9zZXBhcmF0b3JzKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tCb29sZWFuUGFyYW0od2lkZ2V0LCAnYXV0b3NlcGFyYXRvcnMnKQorCisgICAgQHJlcXVpcmVzX3RjbCg4LCA1KQorICAgIGRlZiB0ZXN0X2Jsb2NrY3Vyc29yKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tCb29sZWFuUGFyYW0od2lkZ2V0LCAnYmxvY2tjdXJzb3InKQorCisgICAgQHJlcXVpcmVzX3RjbCg4LCA1KQorICAgIGRlZiB0ZXN0X2VuZGxpbmUoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgdGV4dCA9ICdcbicuam9pbignTGluZSAlZCcgZm9yIGkgaW4gcmFuZ2UoMTAwKSkKKyAgICAgICAgd2lkZ2V0Lmluc2VydCgnZW5kJywgdGV4dCkKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ2VuZGxpbmUnLCAyMDAsIGV4cGVjdGVkPScnKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnZW5kbGluZScsIC0xMCwgZXhwZWN0ZWQ9JycpCisgICAgICAgIHNlbGYuY2hlY2tJbnZhbGlkUGFyYW0od2lkZ2V0LCAnZW5kbGluZScsICdzcGFtJywKKyAgICAgICAgICAgICAgICBlcnJtc2c9J2V4cGVjdGVkIGludGVnZXIgYnV0IGdvdCAic3BhbSInKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnZW5kbGluZScsIDUwKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnc3RhcnRsaW5lJywgMTUpCisgICAgICAgIHNlbGYuY2hlY2tJbnZhbGlkUGFyYW0od2lkZ2V0LCAnZW5kbGluZScsIDEwLAorICAgICAgICAgICAgICAgIGVycm1zZz0nLXN0YXJ0bGluZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAtZW5kbGluZScpCisKKyAgICBkZWYgdGVzdF9oZWlnaHQoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja1BpeGVsc1BhcmFtKHdpZGdldCwgJ2hlaWdodCcsIDEwMCwgMTAxLjIsIDEwMi42LCAnM2MnKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnaGVpZ2h0JywgLTEwMCwgZXhwZWN0ZWQ9MSkKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ2hlaWdodCcsIDAsIGV4cGVjdGVkPTEpCisKKyAgICBkZWYgdGVzdF9tYXh1bmRvKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tJbnRlZ2VyUGFyYW0od2lkZ2V0LCAnbWF4dW5kbycsIDAsIDUsIC0xKQorCisgICAgQHJlcXVpcmVzX3RjbCg4LCA1KQorICAgIGRlZiB0ZXN0X2luYWN0aXZlc2VsZWN0YmFja2dyb3VuZChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrQ29sb3JQYXJhbSh3aWRnZXQsICdpbmFjdGl2ZXNlbGVjdGJhY2tncm91bmQnKQorCisgICAgQHJlcXVpcmVzX3RjbCg4LCA2KQorICAgIGRlZiB0ZXN0X2luc2VydHVuZm9jdXNzZWQoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja0VudW1QYXJhbSh3aWRnZXQsICdpbnNlcnR1bmZvY3Vzc2VkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG9sbG93JywgJ25vbmUnLCAnc29saWQnKQorCisgICAgZGVmIHRlc3Rfc2VsZWN0Ym9yZGVyd2lkdGgoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja1BpeGVsc1BhcmFtKHdpZGdldCwgJ3NlbGVjdGJvcmRlcndpZHRoJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMywgMi42LCAtMiwgJzEwcCcsIGNvbnY9bm9jb252LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcF9vcmlnPXRjbF92ZXJzaW9uID49ICg4LCA1KSkKKworICAgIGRlZiB0ZXN0X3NwYWNpbmcxKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tQaXhlbHNQYXJhbSh3aWRnZXQsICdzcGFjaW5nMScsIDIwLCAyMS40LCAyMi42LCAnMC41YycpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbSh3aWRnZXQsICdzcGFjaW5nMScsIC01LCBleHBlY3RlZD0wKQorCisgICAgZGVmIHRlc3Rfc3BhY2luZzIoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja1BpeGVsc1BhcmFtKHdpZGdldCwgJ3NwYWNpbmcyJywgNSwgNi40LCA3LjYsICcwLjFjJykKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ3NwYWNpbmcyJywgLTEsIGV4cGVjdGVkPTApCisKKyAgICBkZWYgdGVzdF9zcGFjaW5nMyhzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGl4ZWxzUGFyYW0od2lkZ2V0LCAnc3BhY2luZzMnLCAyMCwgMjEuNCwgMjIuNiwgJzAuNWMnKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnc3BhY2luZzMnLCAtMTAsIGV4cGVjdGVkPTApCisKKyAgICBAcmVxdWlyZXNfdGNsKDgsIDUpCisgICAgZGVmIHRlc3Rfc3RhcnRsaW5lKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHRleHQgPSAnXG4nLmpvaW4oJ0xpbmUgJWQnIGZvciBpIGluIHJhbmdlKDEwMCkpCisgICAgICAgIHdpZGdldC5pbnNlcnQoJ2VuZCcsIHRleHQpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbSh3aWRnZXQsICdzdGFydGxpbmUnLCAyMDAsIGV4cGVjdGVkPScnKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnc3RhcnRsaW5lJywgLTEwLCBleHBlY3RlZD0nJykKKyAgICAgICAgc2VsZi5jaGVja0ludmFsaWRQYXJhbSh3aWRnZXQsICdzdGFydGxpbmUnLCAnc3BhbScsCisgICAgICAgICAgICAgICAgZXJybXNnPSdleHBlY3RlZCBpbnRlZ2VyIGJ1dCBnb3QgInNwYW0iJykKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ3N0YXJ0bGluZScsIDEwKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnZW5kbGluZScsIDUwKQorICAgICAgICBzZWxmLmNoZWNrSW52YWxpZFBhcmFtKHdpZGdldCwgJ3N0YXJ0bGluZScsIDcwLAorICAgICAgICAgICAgICAgIGVycm1zZz0nLXN0YXJ0bGluZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAtZW5kbGluZScpCisKKyAgICBkZWYgdGVzdF9zdGF0ZShzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBpZiB0Y2xfdmVyc2lvbiA8ICg4LCA1KToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tQYXJhbXMod2lkZ2V0LCAnc3RhdGUnLCAnZGlzYWJsZWQnLCAnbm9ybWFsJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tFbnVtUGFyYW0od2lkZ2V0LCAnc3RhdGUnLCAnZGlzYWJsZWQnLCAnbm9ybWFsJykKKworICAgIGRlZiB0ZXN0X3RhYnMoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgaWYgZ2V0X3RrX3BhdGNobGV2ZWwoKSA8ICg4LCA1LCAxMSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAndGFicycsICgxMC4yLCAyMC43LCAnMWknLCAnMmknKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD0oJzEwLjInLCAnMjAuNycsICcxaScsICcyaScpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ3RhYnMnLCAoMTAuMiwgMjAuNywgJzFpJywgJzJpJykpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbSh3aWRnZXQsICd0YWJzJywgJzEwLjIgMjAuNyAxaSAyaScsCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD0oJzEwLjInLCAnMjAuNycsICcxaScsICcyaScpKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAndGFicycsICcyYyBsZWZ0IDRjIDZjIGNlbnRlcicsCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD0oJzJjJywgJ2xlZnQnLCAnNGMnLCAnNmMnLCAnY2VudGVyJykpCisgICAgICAgIHNlbGYuY2hlY2tJbnZhbGlkUGFyYW0od2lkZ2V0LCAndGFicycsICdzcGFtJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJtc2c9J2JhZCBzY3JlZW4gZGlzdGFuY2UgInNwYW0iJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwX29yaWc9dGNsX3ZlcnNpb24gPj0gKDgsIDUpKQorCisgICAgQHJlcXVpcmVzX3RjbCg4LCA1KQorICAgIGRlZiB0ZXN0X3RhYnN0eWxlKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tFbnVtUGFyYW0od2lkZ2V0LCAndGFic3R5bGUnLCAndGFidWxhcicsICd3b3JkcHJvY2Vzc29yJykKKworICAgIGRlZiB0ZXN0X3VuZG8oc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja0Jvb2xlYW5QYXJhbSh3aWRnZXQsICd1bmRvJykKKworICAgIGRlZiB0ZXN0X3dpZHRoKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tJbnRlZ2VyUGFyYW0od2lkZ2V0LCAnd2lkdGgnLCA0MDIpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbSh3aWRnZXQsICd3aWR0aCcsIC00MDIsIGV4cGVjdGVkPTEpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbSh3aWRnZXQsICd3aWR0aCcsIDAsIGV4cGVjdGVkPTEpCisKKyAgICBkZWYgdGVzdF93cmFwKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIGlmIHRjbF92ZXJzaW9uIDwgKDgsIDUpOgorICAgICAgICAgICAgc2VsZi5jaGVja1BhcmFtcyh3aWRnZXQsICd3cmFwJywgJ2NoYXInLCAnbm9uZScsICd3b3JkJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tFbnVtUGFyYW0od2lkZ2V0LCAnd3JhcCcsICdjaGFyJywgJ25vbmUnLCAnd29yZCcpCisKKyAgICBkZWYgdGVzdF9iYm94KHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNCb3VuZGluZ0JveCh3aWRnZXQuYmJveCgnMS4xJykpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHdpZGdldC5iYm94KCdlbmQnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgd2lkZ2V0LmJib3gsICdub2luZGV4JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgd2lkZ2V0LmJib3gsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHdpZGdldC5iYm94KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCB3aWRnZXQuYmJveCwgJzEuMScsICdlbmQnKQorCisKK0BhZGRfc3RhbmRhcmRfb3B0aW9ucyhQaXhlbFNpemVUZXN0cywgU3RhbmRhcmRPcHRpb25zVGVzdHMpCitjbGFzcyBDYW52YXNUZXN0KEFic3RyYWN0V2lkZ2V0VGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIE9QVElPTlMgPSAoCisgICAgICAgICdiYWNrZ3JvdW5kJywgJ2JvcmRlcndpZHRoJywKKyAgICAgICAgJ2Nsb3NlZW5vdWdoJywgJ2NvbmZpbmUnLCAnY3Vyc29yJywgJ2hlaWdodCcsCisgICAgICAgICdoaWdobGlnaHRiYWNrZ3JvdW5kJywgJ2hpZ2hsaWdodGNvbG9yJywgJ2hpZ2hsaWdodHRoaWNrbmVzcycsCisgICAgICAgICdpbnNlcnRiYWNrZ3JvdW5kJywgJ2luc2VydGJvcmRlcndpZHRoJywKKyAgICAgICAgJ2luc2VydG9mZnRpbWUnLCAnaW5zZXJ0b250aW1lJywgJ2luc2VydHdpZHRoJywKKyAgICAgICAgJ3JlbGllZicsICdzY3JvbGxyZWdpb24nLAorICAgICAgICAnc2VsZWN0YmFja2dyb3VuZCcsICdzZWxlY3Rib3JkZXJ3aWR0aCcsICdzZWxlY3Rmb3JlZ3JvdW5kJywKKyAgICAgICAgJ3N0YXRlJywgJ3Rha2Vmb2N1cycsCisgICAgICAgICd4c2Nyb2xsY29tbWFuZCcsICd4c2Nyb2xsaW5jcmVtZW50JywKKyAgICAgICAgJ3lzY3JvbGxjb21tYW5kJywgJ3lzY3JvbGxpbmNyZW1lbnQnLCAnd2lkdGgnLAorICAgICkKKworICAgIF9jb252X3BpeGVscyA9IHN0YXRpY21ldGhvZChpbnRfcm91bmQpCisgICAgd2FudG9iamVjdHMgPSBGYWxzZQorCisgICAgZGVmIF9jcmVhdGUoc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gVGtpbnRlci5DYW52YXMoc2VsZi5yb290LCAqKmt3YXJncykKKworICAgIGRlZiB0ZXN0X2Nsb3NlZW5vdWdoKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tGbG9hdFBhcmFtKHdpZGdldCwgJ2Nsb3NlZW5vdWdoJywgMjQsIDIuNCwgMy42LCAtMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udj1mbG9hdCkKKworICAgIGRlZiB0ZXN0X2NvbmZpbmUoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja0Jvb2xlYW5QYXJhbSh3aWRnZXQsICdjb25maW5lJykKKworICAgIGRlZiB0ZXN0X3Njcm9sbHJlZ2lvbihzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnc2Nyb2xscmVnaW9uJywgJzAgMCAyMDAgMTUwJykKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ3Njcm9sbHJlZ2lvbicsICgwLCAwLCAyMDAsIDE1MCksCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD0nMCAwIDIwMCAxNTAnKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnc2Nyb2xscmVnaW9uJywgJycpCisgICAgICAgIHNlbGYuY2hlY2tJbnZhbGlkUGFyYW0od2lkZ2V0LCAnc2Nyb2xscmVnaW9uJywgJ3NwYW0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm1zZz0nYmFkIHNjcm9sbFJlZ2lvbiAic3BhbSInKQorICAgICAgICBzZWxmLmNoZWNrSW52YWxpZFBhcmFtKHdpZGdldCwgJ3Njcm9sbHJlZ2lvbicsICgwLCAwLCAyMDAsICdzcGFtJykpCisgICAgICAgIHNlbGYuY2hlY2tJbnZhbGlkUGFyYW0od2lkZ2V0LCAnc2Nyb2xscmVnaW9uJywgKDAsIDAsIDIwMCkpCisgICAgICAgIHNlbGYuY2hlY2tJbnZhbGlkUGFyYW0od2lkZ2V0LCAnc2Nyb2xscmVnaW9uJywgKDAsIDAsIDIwMCwgMTUwLCAwKSkKKworICAgIGRlZiB0ZXN0X3N0YXRlKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tFbnVtUGFyYW0od2lkZ2V0LCAnc3RhdGUnLCAnZGlzYWJsZWQnLCAnbm9ybWFsJywKKyAgICAgICAgICAgICAgICBlcnJtc2c9J2JhZCBzdGF0ZSB2YWx1ZSAie30iOiBtdXN0IGJlIG5vcm1hbCBvciBkaXNhYmxlZCcpCisKKyAgICBkZWYgdGVzdF94c2Nyb2xsaW5jcmVtZW50KHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tQaXhlbHNQYXJhbSh3aWRnZXQsICd4c2Nyb2xsaW5jcmVtZW50JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwLCAwLCA0MS4yLCA0My42LCAtNDAsICcwLjVpJykKKworICAgIGRlZiB0ZXN0X3lzY3JvbGxpbmNyZW1lbnQoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja1BpeGVsc1BhcmFtKHdpZGdldCwgJ3lzY3JvbGxpbmNyZW1lbnQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAsIDAsIDExLjIsIDEzLjYsIC0xMCwgJzAuMWknKQorCisKK0BhZGRfc3RhbmRhcmRfb3B0aW9ucyhJbnRlZ2VyU2l6ZVRlc3RzLCBTdGFuZGFyZE9wdGlvbnNUZXN0cykKK2NsYXNzIExpc3Rib3hUZXN0KEFic3RyYWN0V2lkZ2V0VGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIE9QVElPTlMgPSAoCisgICAgICAgICdhY3RpdmVzdHlsZScsICdiYWNrZ3JvdW5kJywgJ2JvcmRlcndpZHRoJywgJ2N1cnNvcicsCisgICAgICAgICdkaXNhYmxlZGZvcmVncm91bmQnLCAnZXhwb3J0c2VsZWN0aW9uJywKKyAgICAgICAgJ2ZvbnQnLCAnZm9yZWdyb3VuZCcsICdoZWlnaHQnLAorICAgICAgICAnaGlnaGxpZ2h0YmFja2dyb3VuZCcsICdoaWdobGlnaHRjb2xvcicsICdoaWdobGlnaHR0aGlja25lc3MnLAorICAgICAgICAnbGlzdHZhcmlhYmxlJywgJ3JlbGllZicsCisgICAgICAgICdzZWxlY3RiYWNrZ3JvdW5kJywgJ3NlbGVjdGJvcmRlcndpZHRoJywgJ3NlbGVjdGZvcmVncm91bmQnLAorICAgICAgICAnc2VsZWN0bW9kZScsICdzZXRncmlkJywgJ3N0YXRlJywKKyAgICAgICAgJ3Rha2Vmb2N1cycsICd3aWR0aCcsICd4c2Nyb2xsY29tbWFuZCcsICd5c2Nyb2xsY29tbWFuZCcsCisgICAgKQorCisgICAgZGVmIF9jcmVhdGUoc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gVGtpbnRlci5MaXN0Ym94KHNlbGYucm9vdCwgKiprd2FyZ3MpCisKKyAgICBkZWYgdGVzdF9hY3RpdmVzdHlsZShzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrRW51bVBhcmFtKHdpZGdldCwgJ2FjdGl2ZXN0eWxlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZG90Ym94JywgJ25vbmUnLCAndW5kZXJsaW5lJykKKworICAgIGRlZiB0ZXN0X2xpc3R2YXJpYWJsZShzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICB2YXIgPSBUa2ludGVyLkRvdWJsZVZhcigpCisgICAgICAgIHNlbGYuY2hlY2tWYXJpYWJsZVBhcmFtKHdpZGdldCwgJ2xpc3R2YXJpYWJsZScsIHZhcikKKworICAgIGRlZiB0ZXN0X3NlbGVjdG1vZGUoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ3NlbGVjdG1vZGUnLCAnc2luZ2xlJykKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ3NlbGVjdG1vZGUnLCAnYnJvd3NlJykKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ3NlbGVjdG1vZGUnLCAnbXVsdGlwbGUnKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnc2VsZWN0bW9kZScsICdleHRlbmRlZCcpCisKKyAgICBkZWYgdGVzdF9zdGF0ZShzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrRW51bVBhcmFtKHdpZGdldCwgJ3N0YXRlJywgJ2Rpc2FibGVkJywgJ25vcm1hbCcpCisKKyAgICBkZWYgdGVzdF9pdGVtY29uZmlndXJlKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVGNsRXJyb3IsICdpdGVtIG51bWJlciAiMCIgb3V0IG9mIHJhbmdlJyk6CisgICAgICAgICAgICB3aWRnZXQuaXRlbWNvbmZpZ3VyZSgwKQorICAgICAgICBjb2xvcnMgPSAncmVkIG9yYW5nZSB5ZWxsb3cgZ3JlZW4gYmx1ZSB3aGl0ZSB2aW9sZXQnLnNwbGl0KCkKKyAgICAgICAgd2lkZ2V0Lmluc2VydCgnZW5kJywgKmNvbG9ycykKKyAgICAgICAgZm9yIGksIGNvbG9yIGluIGVudW1lcmF0ZShjb2xvcnMpOgorICAgICAgICAgICAgd2lkZ2V0Lml0ZW1jb25maWd1cmUoaSwgYmFja2dyb3VuZD1jb2xvcikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgd2lkZ2V0Lml0ZW1jb25maWd1cmUoKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFRjbEVycm9yLCAnYmFkIGxpc3Rib3ggaW5kZXggInJlZCInKToKKyAgICAgICAgICAgIHdpZGdldC5pdGVtY29uZmlndXJlKCdyZWQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdpZGdldC5pdGVtY29uZmlndXJlKDAsICdiYWNrZ3JvdW5kJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdiYWNrZ3JvdW5kJywgJ2JhY2tncm91bmQnLCAnQmFja2dyb3VuZCcsICcnLCAncmVkJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2lkZ2V0Lml0ZW1jb25maWd1cmUoJ2VuZCcsICdiYWNrZ3JvdW5kJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdiYWNrZ3JvdW5kJywgJ2JhY2tncm91bmQnLCAnQmFja2dyb3VuZCcsICcnLCAndmlvbGV0JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2lkZ2V0Lml0ZW1jb25maWd1cmUoJ0AwLDAnLCAnYmFja2dyb3VuZCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgnYmFja2dyb3VuZCcsICdiYWNrZ3JvdW5kJywgJ0JhY2tncm91bmQnLCAnJywgJ3JlZCcpKQorCisgICAgICAgIGQgPSB3aWRnZXQuaXRlbWNvbmZpZ3VyZSgwKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZCwgZGljdCkKKyAgICAgICAgZm9yIGssIHYgaW4gZC5pdGVtcygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihsZW4odiksICgyLCA1KSkKKyAgICAgICAgICAgIGlmIGxlbih2KSA9PSA1OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgd2lkZ2V0Lml0ZW1jb25maWd1cmUoMCwgaykpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2WzRdLCB3aWRnZXQuaXRlbWNnZXQoMCwgaykpCisKKyAgICBkZWYgY2hlY2tfaXRlbWNvbmZpZ3VyZShzZWxmLCBuYW1lLCB2YWx1ZSk6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgd2lkZ2V0Lmluc2VydCgnZW5kJywgJ2EnLCAnYicsICdjJywgJ2QnKQorICAgICAgICB3aWRnZXQuaXRlbWNvbmZpZ3VyZSgwLCAqKntuYW1lOiB2YWx1ZX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2lkZ2V0Lml0ZW1jb25maWd1cmUoMCwgbmFtZSlbNF0sIHZhbHVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdpZGdldC5pdGVtY2dldCgwLCBuYW1lKSwgdmFsdWUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVGNsRXJyb3IsICd1bmtub3duIGNvbG9yIG5hbWUgInNwYW0iJyk6CisgICAgICAgICAgICB3aWRnZXQuaXRlbWNvbmZpZ3VyZSgwLCAqKntuYW1lOiAnc3BhbSd9KQorCisgICAgZGVmIHRlc3RfaXRlbWNvbmZpZ3VyZV9iYWNrZ3JvdW5kKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2l0ZW1jb25maWd1cmUoJ2JhY2tncm91bmQnLCAnI2ZmMDAwMCcpCisKKyAgICBkZWYgdGVzdF9pdGVtY29uZmlndXJlX2JnKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2l0ZW1jb25maWd1cmUoJ2JnJywgJyNmZjAwMDAnKQorCisgICAgZGVmIHRlc3RfaXRlbWNvbmZpZ3VyZV9mZyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19pdGVtY29uZmlndXJlKCdmZycsICcjMTEwMDIyJykKKworICAgIGRlZiB0ZXN0X2l0ZW1jb25maWd1cmVfZm9yZWdyb3VuZChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19pdGVtY29uZmlndXJlKCdmb3JlZ3JvdW5kJywgJyMxMTAwMjInKQorCisgICAgZGVmIHRlc3RfaXRlbWNvbmZpZ3VyZV9zZWxlY3RiYWNrZ3JvdW5kKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2l0ZW1jb25maWd1cmUoJ3NlbGVjdGJhY2tncm91bmQnLCAnIzExMDAyMicpCisKKyAgICBkZWYgdGVzdF9pdGVtY29uZmlndXJlX3NlbGVjdGZvcmVncm91bmQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfaXRlbWNvbmZpZ3VyZSgnc2VsZWN0Zm9yZWdyb3VuZCcsICcjNjU0MzIxJykKKworICAgIGRlZiB0ZXN0X2JveChzZWxmKToKKyAgICAgICAgbGIgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIGxiLmluc2VydCgwLCAqKCdlbCVkJyAlIGkgZm9yIGkgaW4gcmFuZ2UoOCkpKQorICAgICAgICBsYi5wYWNrKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0JvdW5kaW5nQm94KGxiLmJib3goMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKGxiLmJib3goLTEpKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShsYi5iYm94KDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGNsRXJyb3IsIGxiLmJib3gsICdub2luZGV4JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGNsRXJyb3IsIGxiLmJib3gsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGIuYmJveCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYi5iYm94LCAwLCAxKQorCisgICAgZGVmIHRlc3RfY3Vyc2VsZWN0aW9uKHNlbGYpOgorICAgICAgICBsYiA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgbGIuaW5zZXJ0KDAsICooJ2VsJWQnICUgaSBmb3IgaSBpbiByYW5nZSg4KSkpCisgICAgICAgIGxiLnNlbGVjdGlvbl9jbGVhcigwLCBUa2ludGVyLkVORCkKKyAgICAgICAgbGIuc2VsZWN0aW9uX3NldCgyLCA0KQorICAgICAgICBsYi5zZWxlY3Rpb25fc2V0KDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGIuY3Vyc2VsZWN0aW9uKCksICgyLCAzLCA0LCA2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYi5jdXJzZWxlY3Rpb24sIDApCisKKyAgICBkZWYgdGVzdF9nZXQoc2VsZik6CisgICAgICAgIGxiID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBsYi5pbnNlcnQoMCwgKignZWwlZCcgJSBpIGZvciBpIGluIHJhbmdlKDgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsYi5nZXQoMCksICdlbDAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxiLmdldCgzKSwgJ2VsMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGIuZ2V0KCdlbmQnKSwgJ2VsNycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGIuZ2V0KDgpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsYi5nZXQoLTEpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsYi5nZXQoMywgNSksICgnZWwzJywgJ2VsNCcsICdlbDUnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsYi5nZXQoNSwgJ2VuZCcpLCAoJ2VsNScsICdlbDYnLCAnZWw3JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGIuZ2V0KDUsIDApLCAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsYi5nZXQoMCwgMCksICgnZWwwJywpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUY2xFcnJvciwgbGIuZ2V0LCAnbm9pbmRleCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRjbEVycm9yLCBsYi5nZXQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGIuZ2V0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUY2xFcnJvciwgbGIuZ2V0LCAnZW5kJywgJ25vaW5kZXgnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxiLmdldCwgMSwgMiwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGNsRXJyb3IsIGxiLmdldCwgMi40KQorCisKK0BhZGRfc3RhbmRhcmRfb3B0aW9ucyhQaXhlbFNpemVUZXN0cywgU3RhbmRhcmRPcHRpb25zVGVzdHMpCitjbGFzcyBTY2FsZVRlc3QoQWJzdHJhY3RXaWRnZXRUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgT1BUSU9OUyA9ICgKKyAgICAgICAgJ2FjdGl2ZWJhY2tncm91bmQnLCAnYmFja2dyb3VuZCcsICdiaWdpbmNyZW1lbnQnLCAnYm9yZGVyd2lkdGgnLAorICAgICAgICAnY29tbWFuZCcsICdjdXJzb3InLCAnZGlnaXRzJywgJ2ZvbnQnLCAnZm9yZWdyb3VuZCcsICdmcm9tJywKKyAgICAgICAgJ2hpZ2hsaWdodGJhY2tncm91bmQnLCAnaGlnaGxpZ2h0Y29sb3InLCAnaGlnaGxpZ2h0dGhpY2tuZXNzJywKKyAgICAgICAgJ2xhYmVsJywgJ2xlbmd0aCcsICdvcmllbnQnLCAncmVsaWVmJywKKyAgICAgICAgJ3JlcGVhdGRlbGF5JywgJ3JlcGVhdGludGVydmFsJywKKyAgICAgICAgJ3Jlc29sdXRpb24nLCAnc2hvd3ZhbHVlJywgJ3NsaWRlcmxlbmd0aCcsICdzbGlkZXJyZWxpZWYnLCAnc3RhdGUnLAorICAgICAgICAndGFrZWZvY3VzJywgJ3RpY2tpbnRlcnZhbCcsICd0bycsICd0cm91Z2hjb2xvcicsICd2YXJpYWJsZScsICd3aWR0aCcsCisgICAgKQorICAgIGRlZmF1bHRfb3JpZW50ID0gJ3ZlcnRpY2FsJworCisgICAgZGVmIF9jcmVhdGUoc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gVGtpbnRlci5TY2FsZShzZWxmLnJvb3QsICoqa3dhcmdzKQorCisgICAgZGVmIHRlc3RfYmlnaW5jcmVtZW50KHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tGbG9hdFBhcmFtKHdpZGdldCwgJ2JpZ2luY3JlbWVudCcsIDEyLjQsIDIzLjYsIC01KQorCisgICAgZGVmIHRlc3RfZGlnaXRzKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tJbnRlZ2VyUGFyYW0od2lkZ2V0LCAnZGlnaXRzJywgNSwgMCkKKworICAgIGRlZiB0ZXN0X2Zyb20oc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja0Zsb2F0UGFyYW0od2lkZ2V0LCAnZnJvbScsIDEwMCwgMTQuOSwgMTUuMSwgY29udj1yb3VuZCkKKworICAgIGRlZiB0ZXN0X2xhYmVsKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbSh3aWRnZXQsICdsYWJlbCcsICdhbnkgc3RyaW5nJykKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ2xhYmVsJywgJycpCisKKyAgICBkZWYgdGVzdF9sZW5ndGgoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja1BpeGVsc1BhcmFtKHdpZGdldCwgJ2xlbmd0aCcsIDEzMCwgMTMxLjIsIDEzNS42LCAnNWknKQorCisgICAgZGVmIHRlc3RfcmVzb2x1dGlvbihzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrRmxvYXRQYXJhbSh3aWRnZXQsICdyZXNvbHV0aW9uJywgNC4yLCAwLCA2LjcsIC0yKQorCisgICAgZGVmIHRlc3Rfc2hvd3ZhbHVlKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tCb29sZWFuUGFyYW0od2lkZ2V0LCAnc2hvd3ZhbHVlJykKKworICAgIGRlZiB0ZXN0X3NsaWRlcmxlbmd0aChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGl4ZWxzUGFyYW0od2lkZ2V0LCAnc2xpZGVybGVuZ3RoJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLCAxMS4yLCAxNS42LCAtMywgJzNtJykKKworICAgIGRlZiB0ZXN0X3NsaWRlcnJlbGllZihzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUmVsaWVmUGFyYW0od2lkZ2V0LCAnc2xpZGVycmVsaWVmJykKKworICAgIGRlZiB0ZXN0X3RpY2tpbnRlcnZhbChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrRmxvYXRQYXJhbSh3aWRnZXQsICd0aWNraW50ZXJ2YWwnLCAxLCA0LjMsIDcuNiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udj1yb3VuZCkKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ3RpY2tpbnRlcnZhbCcsIC0yLCBleHBlY3RlZD0yLAorICAgICAgICAgICAgICAgICAgICAgICAgY29udj1yb3VuZCkKKworICAgIGRlZiB0ZXN0X3RvKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tGbG9hdFBhcmFtKHdpZGdldCwgJ3RvJywgMzAwLCAxNC45LCAxNS4xLCAtMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnY9cm91bmQpCisKKworQGFkZF9zdGFuZGFyZF9vcHRpb25zKFBpeGVsU2l6ZVRlc3RzLCBTdGFuZGFyZE9wdGlvbnNUZXN0cykKK2NsYXNzIFNjcm9sbGJhclRlc3QoQWJzdHJhY3RXaWRnZXRUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgT1BUSU9OUyA9ICgKKyAgICAgICAgJ2FjdGl2ZWJhY2tncm91bmQnLCAnYWN0aXZlcmVsaWVmJywKKyAgICAgICAgJ2JhY2tncm91bmQnLCAnYm9yZGVyd2lkdGgnLAorICAgICAgICAnY29tbWFuZCcsICdjdXJzb3InLCAnZWxlbWVudGJvcmRlcndpZHRoJywKKyAgICAgICAgJ2hpZ2hsaWdodGJhY2tncm91bmQnLCAnaGlnaGxpZ2h0Y29sb3InLCAnaGlnaGxpZ2h0dGhpY2tuZXNzJywKKyAgICAgICAgJ2p1bXAnLCAnb3JpZW50JywgJ3JlbGllZicsCisgICAgICAgICdyZXBlYXRkZWxheScsICdyZXBlYXRpbnRlcnZhbCcsCisgICAgICAgICd0YWtlZm9jdXMnLCAndHJvdWdoY29sb3InLCAnd2lkdGgnLAorICAgICkKKyAgICBfY29udl9waXhlbHMgPSBzdGF0aWNtZXRob2QoaW50X3JvdW5kKQorICAgIHdhbnRvYmplY3RzID0gRmFsc2UKKyAgICBkZWZhdWx0X29yaWVudCA9ICd2ZXJ0aWNhbCcKKworICAgIGRlZiBfY3JlYXRlKHNlbGYsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIFRraW50ZXIuU2Nyb2xsYmFyKHNlbGYucm9vdCwgKiprd2FyZ3MpCisKKyAgICBkZWYgdGVzdF9hY3RpdmVyZWxpZWYoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja1JlbGllZlBhcmFtKHdpZGdldCwgJ2FjdGl2ZXJlbGllZicpCisKKyAgICBkZWYgdGVzdF9lbGVtZW50Ym9yZGVyd2lkdGgoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja1BpeGVsc1BhcmFtKHdpZGdldCwgJ2VsZW1lbnRib3JkZXJ3aWR0aCcsIDQuMywgNS42LCAtMiwgJzFtJykKKworICAgIGRlZiB0ZXN0X29yaWVudChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrRW51bVBhcmFtKHdpZGdldCwgJ29yaWVudCcsICd2ZXJ0aWNhbCcsICdob3Jpem9udGFsJywKKyAgICAgICAgICAgICAgICBlcnJtc2c9J2JhZCBvcmllbnRhdGlvbiAie30iOiBtdXN0IGJlIHZlcnRpY2FsIG9yIGhvcml6b250YWwnKQorCisgICAgZGVmIHRlc3RfYWN0aXZhdGUoc2VsZik6CisgICAgICAgIHNiID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBmb3IgZSBpbiAoJ2Fycm93MScsICdzbGlkZXInLCAnYXJyb3cyJyk6CisgICAgICAgICAgICBzYi5hY3RpdmF0ZShlKQorICAgICAgICBzYi5hY3RpdmF0ZSgnJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzYi5hY3RpdmF0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzYi5hY3RpdmF0ZSwgJ2Fycm93MScsICdhcnJvdzInKQorCisgICAgZGVmIHRlc3Rfc2V0KHNlbGYpOgorICAgICAgICBzYiA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2Iuc2V0KDAuMiwgMC40KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNiLmdldCgpLCAoMC4yLCAwLjQpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUY2xFcnJvciwgc2Iuc2V0LCAnYWJjJywgJ2RlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRjbEVycm9yLCBzYi5zZXQsIDAuNiwgJ2RlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRjbEVycm9yLCBzYi5zZXQsIDAuNiwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGNsRXJyb3IsIHNiLnNldCwgMC42KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUY2xFcnJvciwgc2Iuc2V0LCAwLjYsIDAuNywgMC44KQorCisKK0BhZGRfc3RhbmRhcmRfb3B0aW9ucyhTdGFuZGFyZE9wdGlvbnNUZXN0cykKK2NsYXNzIFBhbmVkV2luZG93VGVzdChBYnN0cmFjdFdpZGdldFRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBPUFRJT05TID0gKAorICAgICAgICAnYmFja2dyb3VuZCcsICdib3JkZXJ3aWR0aCcsICdjdXJzb3InLAorICAgICAgICAnaGFuZGxlcGFkJywgJ2hhbmRsZXNpemUnLCAnaGVpZ2h0JywKKyAgICAgICAgJ29wYXF1ZXJlc2l6ZScsICdvcmllbnQnLCAncmVsaWVmJywKKyAgICAgICAgJ3Nhc2hjdXJzb3InLCAnc2FzaHBhZCcsICdzYXNocmVsaWVmJywgJ3Nhc2h3aWR0aCcsCisgICAgICAgICdzaG93aGFuZGxlJywgJ3dpZHRoJywKKyAgICApCisgICAgZGVmYXVsdF9vcmllbnQgPSAnaG9yaXpvbnRhbCcKKworICAgIGRlZiBfY3JlYXRlKHNlbGYsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIFRraW50ZXIuUGFuZWRXaW5kb3coc2VsZi5yb290LCAqKmt3YXJncykKKworICAgIGRlZiB0ZXN0X2hhbmRsZXBhZChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGl4ZWxzUGFyYW0od2lkZ2V0LCAnaGFuZGxlcGFkJywgNSwgNi40LCA3LjYsIC0zLCAnMW0nKQorCisgICAgZGVmIHRlc3RfaGFuZGxlc2l6ZShzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGl4ZWxzUGFyYW0od2lkZ2V0LCAnaGFuZGxlc2l6ZScsIDgsIDkuNCwgMTAuNiwgLTMsICcybScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252PW5vY29udikKKworICAgIGRlZiB0ZXN0X2hlaWdodChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGl4ZWxzUGFyYW0od2lkZ2V0LCAnaGVpZ2h0JywgMTAwLCAxMDEuMiwgMTAyLjYsIC0xMDAsIDAsICcxaScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252PW5vY29udikKKworICAgIGRlZiB0ZXN0X29wYXF1ZXJlc2l6ZShzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrQm9vbGVhblBhcmFtKHdpZGdldCwgJ29wYXF1ZXJlc2l6ZScpCisKKyAgICBkZWYgdGVzdF9zYXNoY3Vyc29yKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tDdXJzb3JQYXJhbSh3aWRnZXQsICdzYXNoY3Vyc29yJykKKworICAgIGRlZiB0ZXN0X3Nhc2hwYWQoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja1BpeGVsc1BhcmFtKHdpZGdldCwgJ3Nhc2hwYWQnLCA4LCAxLjMsIDIuNiwgLTIsICcybScpCisKKyAgICBkZWYgdGVzdF9zYXNocmVsaWVmKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tSZWxpZWZQYXJhbSh3aWRnZXQsICdzYXNocmVsaWVmJykKKworICAgIGRlZiB0ZXN0X3Nhc2h3aWR0aChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGl4ZWxzUGFyYW0od2lkZ2V0LCAnc2FzaHdpZHRoJywgMTAsIDExLjEsIDE1LjYsIC0zLCAnMW0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udj1ub2NvbnYpCisKKyAgICBkZWYgdGVzdF9zaG93aGFuZGxlKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tCb29sZWFuUGFyYW0od2lkZ2V0LCAnc2hvd2hhbmRsZScpCisKKyAgICBkZWYgdGVzdF93aWR0aChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGl4ZWxzUGFyYW0od2lkZ2V0LCAnd2lkdGgnLCA0MDIsIDQwMy40LCA0MDQuNiwgLTQwMiwgMCwgJzVpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnY9bm9jb252KQorCisgICAgZGVmIGNyZWF0ZTIoc2VsZik6CisgICAgICAgIHAgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIGIgPSBUa2ludGVyLkJ1dHRvbihwKQorICAgICAgICBjID0gVGtpbnRlci5CdXR0b24ocCkKKyAgICAgICAgcC5hZGQoYikKKyAgICAgICAgcC5hZGQoYykKKyAgICAgICAgcmV0dXJuIHAsIGIsIGMKKworICAgIGRlZiB0ZXN0X3BhbmVjb25maWd1cmUoc2VsZik6CisgICAgICAgIHAsIGIsIGMgPSBzZWxmLmNyZWF0ZTIoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHAucGFuZWNvbmZpZ3VyZSkKKyAgICAgICAgZCA9IHAucGFuZWNvbmZpZ3VyZShiKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZCwgZGljdCkKKyAgICAgICAgZm9yIGssIHYgaW4gZC5pdGVtcygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odiksIDUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIHAucGFuZWNvbmZpZ3VyZShiLCBrKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodls0XSwgcC5wYW5lY2dldChiLCBrKSkKKworICAgIGRlZiBjaGVja19wYW5lY29uZmlndXJlKHNlbGYsIHAsIGIsIG5hbWUsIHZhbHVlLCBleHBlY3RlZCwgc3RyaW5naWZ5PUZhbHNlKToKKyAgICAgICAgY29udiA9IGxhbWJkYSB4OiB4CisgICAgICAgIGlmIG5vdCBzZWxmLndhbnRvYmplY3RzIG9yIHN0cmluZ2lmeToKKyAgICAgICAgICAgIGV4cGVjdGVkID0gc3RyKGV4cGVjdGVkKQorICAgICAgICBpZiBzZWxmLndhbnRvYmplY3RzIGFuZCBzdHJpbmdpZnk6CisgICAgICAgICAgICBjb252ID0gc3RyCisgICAgICAgIHAucGFuZWNvbmZpZ3VyZShiLCAqKntuYW1lOiB2YWx1ZX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29udihwLnBhbmVjb25maWd1cmUoYiwgbmFtZSlbNF0pLCBleHBlY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb252KHAucGFuZWNnZXQoYiwgbmFtZSkpLCBleHBlY3RlZCkKKworICAgIGRlZiBjaGVja19wYW5lY29uZmlndXJlX2JhZChzZWxmLCBwLCBiLCBuYW1lLCBtc2cpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFRjbEVycm9yLCBtc2cpOgorICAgICAgICAgICAgcC5wYW5lY29uZmlndXJlKGIsICoqe25hbWU6ICdiYWRWYWx1ZSd9KQorCisgICAgZGVmIHRlc3RfcGFuZWNvbmZpZ3VyZV9hZnRlcihzZWxmKToKKyAgICAgICAgcCwgYiwgYyA9IHNlbGYuY3JlYXRlMigpCisgICAgICAgIHNlbGYuY2hlY2tfcGFuZWNvbmZpZ3VyZShwLCBiLCAnYWZ0ZXInLCBjLCBzdHIoYykpCisgICAgICAgIHNlbGYuY2hlY2tfcGFuZWNvbmZpZ3VyZV9iYWQocCwgYiwgJ2FmdGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmFkIHdpbmRvdyBwYXRoIG5hbWUgImJhZFZhbHVlIicpCisKKyAgICBkZWYgdGVzdF9wYW5lY29uZmlndXJlX2JlZm9yZShzZWxmKToKKyAgICAgICAgcCwgYiwgYyA9IHNlbGYuY3JlYXRlMigpCisgICAgICAgIHNlbGYuY2hlY2tfcGFuZWNvbmZpZ3VyZShwLCBiLCAnYmVmb3JlJywgYywgc3RyKGMpKQorICAgICAgICBzZWxmLmNoZWNrX3BhbmVjb25maWd1cmVfYmFkKHAsIGIsICdiZWZvcmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYWQgd2luZG93IHBhdGggbmFtZSAiYmFkVmFsdWUiJykKKworICAgIGRlZiB0ZXN0X3BhbmVjb25maWd1cmVfaGVpZ2h0KHNlbGYpOgorICAgICAgICBwLCBiLCBjID0gc2VsZi5jcmVhdGUyKCkKKyAgICAgICAgc2VsZi5jaGVja19wYW5lY29uZmlndXJlKHAsIGIsICdoZWlnaHQnLCAxMCwgMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdpZnk9dGNsX3ZlcnNpb24gPCAoOCwgNSkpCisgICAgICAgIHNlbGYuY2hlY2tfcGFuZWNvbmZpZ3VyZV9iYWQocCwgYiwgJ2hlaWdodCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JhZCBzY3JlZW4gZGlzdGFuY2UgImJhZFZhbHVlIicpCisKKyAgICBAcmVxdWlyZXNfdGNsKDgsIDUpCisgICAgZGVmIHRlc3RfcGFuZWNvbmZpZ3VyZV9oaWRlKHNlbGYpOgorICAgICAgICBwLCBiLCBjID0gc2VsZi5jcmVhdGUyKCkKKyAgICAgICAgc2VsZi5jaGVja19wYW5lY29uZmlndXJlKHAsIGIsICdoaWRlJywgRmFsc2UsIDApCisgICAgICAgIHNlbGYuY2hlY2tfcGFuZWNvbmZpZ3VyZV9iYWQocCwgYiwgJ2hpZGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdleHBlY3RlZCBib29sZWFuIHZhbHVlIGJ1dCBnb3QgImJhZFZhbHVlIicpCisKKyAgICBkZWYgdGVzdF9wYW5lY29uZmlndXJlX21pbnNpemUoc2VsZik6CisgICAgICAgIHAsIGIsIGMgPSBzZWxmLmNyZWF0ZTIoKQorICAgICAgICBzZWxmLmNoZWNrX3BhbmVjb25maWd1cmUocCwgYiwgJ21pbnNpemUnLCAxMCwgMTApCisgICAgICAgIHNlbGYuY2hlY2tfcGFuZWNvbmZpZ3VyZV9iYWQocCwgYiwgJ21pbnNpemUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYWQgc2NyZWVuIGRpc3RhbmNlICJiYWRWYWx1ZSInKQorCisgICAgZGVmIHRlc3RfcGFuZWNvbmZpZ3VyZV9wYWR4KHNlbGYpOgorICAgICAgICBwLCBiLCBjID0gc2VsZi5jcmVhdGUyKCkKKyAgICAgICAgc2VsZi5jaGVja19wYW5lY29uZmlndXJlKHAsIGIsICdwYWR4JywgMS4zLCAxKQorICAgICAgICBzZWxmLmNoZWNrX3BhbmVjb25maWd1cmVfYmFkKHAsIGIsICdwYWR4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmFkIHNjcmVlbiBkaXN0YW5jZSAiYmFkVmFsdWUiJykKKworICAgIGRlZiB0ZXN0X3BhbmVjb25maWd1cmVfcGFkeShzZWxmKToKKyAgICAgICAgcCwgYiwgYyA9IHNlbGYuY3JlYXRlMigpCisgICAgICAgIHNlbGYuY2hlY2tfcGFuZWNvbmZpZ3VyZShwLCBiLCAncGFkeScsIDEuMywgMSkKKyAgICAgICAgc2VsZi5jaGVja19wYW5lY29uZmlndXJlX2JhZChwLCBiLCAncGFkeScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JhZCBzY3JlZW4gZGlzdGFuY2UgImJhZFZhbHVlIicpCisKKyAgICBkZWYgdGVzdF9wYW5lY29uZmlndXJlX3N0aWNreShzZWxmKToKKyAgICAgICAgcCwgYiwgYyA9IHNlbGYuY3JlYXRlMigpCisgICAgICAgIHNlbGYuY2hlY2tfcGFuZWNvbmZpZ3VyZShwLCBiLCAnc3RpY2t5JywgJ25zZXcnLCAnbmVzdycpCisgICAgICAgIHNlbGYuY2hlY2tfcGFuZWNvbmZpZ3VyZV9iYWQocCwgYiwgJ3N0aWNreScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JhZCBzdGlja3luZXNzIHZhbHVlICJiYWRWYWx1ZSI6IG11c3QgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiZSBhIHN0cmluZyBjb250YWluaW5nIHplcm8gb3IgbW9yZSBvZiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24sIGUsIHMsIGFuZCB3JykKKworICAgIEByZXF1aXJlc190Y2woOCwgNSkKKyAgICBkZWYgdGVzdF9wYW5lY29uZmlndXJlX3N0cmV0Y2goc2VsZik6CisgICAgICAgIHAsIGIsIGMgPSBzZWxmLmNyZWF0ZTIoKQorICAgICAgICBzZWxmLmNoZWNrX3BhbmVjb25maWd1cmUocCwgYiwgJ3N0cmV0Y2gnLCAnYWx3JywgJ2Fsd2F5cycpCisgICAgICAgIHNlbGYuY2hlY2tfcGFuZWNvbmZpZ3VyZV9iYWQocCwgYiwgJ3N0cmV0Y2gnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYWQgc3RyZXRjaCAiYmFkVmFsdWUiOiBtdXN0IGJlICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWx3YXlzLCBmaXJzdCwgbGFzdCwgbWlkZGxlLCBvciBuZXZlcicpCisKKyAgICBkZWYgdGVzdF9wYW5lY29uZmlndXJlX3dpZHRoKHNlbGYpOgorICAgICAgICBwLCBiLCBjID0gc2VsZi5jcmVhdGUyKCkKKyAgICAgICAgc2VsZi5jaGVja19wYW5lY29uZmlndXJlKHAsIGIsICd3aWR0aCcsIDEwLCAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ2lmeT10Y2xfdmVyc2lvbiA8ICg4LCA1KSkKKyAgICAgICAgc2VsZi5jaGVja19wYW5lY29uZmlndXJlX2JhZChwLCBiLCAnd2lkdGgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYWQgc2NyZWVuIGRpc3RhbmNlICJiYWRWYWx1ZSInKQorCisKK0BhZGRfc3RhbmRhcmRfb3B0aW9ucyhTdGFuZGFyZE9wdGlvbnNUZXN0cykKK2NsYXNzIE1lbnVUZXN0KEFic3RyYWN0V2lkZ2V0VGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIE9QVElPTlMgPSAoCisgICAgICAgICdhY3RpdmViYWNrZ3JvdW5kJywgJ2FjdGl2ZWJvcmRlcndpZHRoJywgJ2FjdGl2ZWZvcmVncm91bmQnLAorICAgICAgICAnYmFja2dyb3VuZCcsICdib3JkZXJ3aWR0aCcsICdjdXJzb3InLAorICAgICAgICAnZGlzYWJsZWRmb3JlZ3JvdW5kJywgJ2ZvbnQnLCAnZm9yZWdyb3VuZCcsCisgICAgICAgICdwb3N0Y29tbWFuZCcsICdyZWxpZWYnLCAnc2VsZWN0Y29sb3InLCAndGFrZWZvY3VzJywKKyAgICAgICAgJ3RlYXJvZmYnLCAndGVhcm9mZmNvbW1hbmQnLCAndGl0bGUnLCAndHlwZScsCisgICAgKQorICAgIF9jb252X3BpeGVscyA9IG5vY29udl9tZXRoCisKKyAgICBkZWYgX2NyZWF0ZShzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBUa2ludGVyLk1lbnUoc2VsZi5yb290LCAqKmt3YXJncykKKworICAgIGRlZiB0ZXN0X3Bvc3Rjb21tYW5kKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tDb21tYW5kUGFyYW0od2lkZ2V0LCAncG9zdGNvbW1hbmQnKQorCisgICAgZGVmIHRlc3RfdGVhcm9mZihzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrQm9vbGVhblBhcmFtKHdpZGdldCwgJ3RlYXJvZmYnKQorCisgICAgZGVmIHRlc3RfdGVhcm9mZmNvbW1hbmQoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja0NvbW1hbmRQYXJhbSh3aWRnZXQsICd0ZWFyb2ZmY29tbWFuZCcpCisKKyAgICBkZWYgdGVzdF90aXRsZShzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAndGl0bGUnLCAnYW55IHN0cmluZycpCisKKyAgICBkZWYgdGVzdF90eXBlKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tFbnVtUGFyYW0od2lkZ2V0LCAndHlwZScsCisgICAgICAgICAgICAgICAgJ25vcm1hbCcsICd0ZWFyb2ZmJywgJ21lbnViYXInKQorCisgICAgZGVmIHRlc3RfZW50cnljb25maWd1cmUoc2VsZik6CisgICAgICAgIG0xID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBtMS5hZGRfY29tbWFuZChsYWJlbD0ndGVzdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbTEuZW50cnljb25maWd1cmUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVGNsRXJyb3IsICdiYWQgbWVudSBlbnRyeSBpbmRleCAiZm9vIicpOgorICAgICAgICAgICAgbTEuZW50cnljb25maWd1cmUoJ2ZvbycpCisgICAgICAgIGQgPSBtMS5lbnRyeWNvbmZpZ3VyZSgxKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZCwgZGljdCkKKyAgICAgICAgZm9yIGssIHYgaW4gZC5pdGVtcygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGssIHN0cikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh2LCB0dXBsZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHYpLCA1KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2WzBdLCBrKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtMS5lbnRyeWNnZXQoMSwgayksIHZbNF0pCisgICAgICAgIG0xLmRlc3Ryb3koKQorCisgICAgZGVmIHRlc3RfZW50cnljb25maWd1cmVfbGFiZWwoc2VsZik6CisgICAgICAgIG0xID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBtMS5hZGRfY29tbWFuZChsYWJlbD0ndGVzdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobTEuZW50cnljZ2V0KDEsICdsYWJlbCcpLCAndGVzdCcpCisgICAgICAgIG0xLmVudHJ5Y29uZmlndXJlKDEsIGxhYmVsPSdjaGFuZ2VkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtMS5lbnRyeWNnZXQoMSwgJ2xhYmVsJyksICdjaGFuZ2VkJykKKworICAgIGRlZiB0ZXN0X2VudHJ5Y29uZmlndXJlX3ZhcmlhYmxlKHNlbGYpOgorICAgICAgICBtMSA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgdjEgPSBUa2ludGVyLkJvb2xlYW5WYXIoc2VsZi5yb290KQorICAgICAgICB2MiA9IFRraW50ZXIuQm9vbGVhblZhcihzZWxmLnJvb3QpCisgICAgICAgIG0xLmFkZF9jaGVja2J1dHRvbih2YXJpYWJsZT12MSwgb252YWx1ZT1UcnVlLCBvZmZ2YWx1ZT1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPSdOb25zZW5zZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKG0xLmVudHJ5Y2dldCgxLCAndmFyaWFibGUnKSksIHN0cih2MSkpCisgICAgICAgIG0xLmVudHJ5Y29uZmlndXJlKDEsIHZhcmlhYmxlPXYyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihtMS5lbnRyeWNnZXQoMSwgJ3ZhcmlhYmxlJykpLCBzdHIodjIpKQorCisKK0BhZGRfc3RhbmRhcmRfb3B0aW9ucyhQaXhlbFNpemVUZXN0cywgU3RhbmRhcmRPcHRpb25zVGVzdHMpCitjbGFzcyBNZXNzYWdlVGVzdChBYnN0cmFjdFdpZGdldFRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBPUFRJT05TID0gKAorICAgICAgICAnYW5jaG9yJywgJ2FzcGVjdCcsICdiYWNrZ3JvdW5kJywgJ2JvcmRlcndpZHRoJywKKyAgICAgICAgJ2N1cnNvcicsICdmb250JywgJ2ZvcmVncm91bmQnLAorICAgICAgICAnaGlnaGxpZ2h0YmFja2dyb3VuZCcsICdoaWdobGlnaHRjb2xvcicsICdoaWdobGlnaHR0aGlja25lc3MnLAorICAgICAgICAnanVzdGlmeScsICdwYWR4JywgJ3BhZHknLCAncmVsaWVmJywKKyAgICAgICAgJ3Rha2Vmb2N1cycsICd0ZXh0JywgJ3RleHR2YXJpYWJsZScsICd3aWR0aCcsCisgICAgKQorICAgIF9jb252X3BhZF9waXhlbHMgPSBub2NvbnZfbWV0aAorCisgICAgZGVmIF9jcmVhdGUoc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gVGtpbnRlci5NZXNzYWdlKHNlbGYucm9vdCwgKiprd2FyZ3MpCisKKyAgICBkZWYgdGVzdF9hc3BlY3Qoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja0ludGVnZXJQYXJhbSh3aWRnZXQsICdhc3BlY3QnLCAyNTAsIDAsIC0zMDApCisKKwordGVzdHNfZ3VpID0gWworICAgICAgICBCdXR0b25UZXN0LCBDYW52YXNUZXN0LCBDaGVja2J1dHRvblRlc3QsIEVudHJ5VGVzdCwKKyAgICAgICAgRnJhbWVUZXN0LCBMYWJlbEZyYW1lVGVzdCxMYWJlbFRlc3QsIExpc3Rib3hUZXN0LAorICAgICAgICBNZW51YnV0dG9uVGVzdCwgTWVudVRlc3QsIE1lc3NhZ2VUZXN0LCBPcHRpb25NZW51VGVzdCwKKyAgICAgICAgUGFuZWRXaW5kb3dUZXN0LCBSYWRpb2J1dHRvblRlc3QsIFNjYWxlVGVzdCwgU2Nyb2xsYmFyVGVzdCwKKyAgICAgICAgU3BpbmJveFRlc3QsIFRleHRUZXN0LCBUb3BsZXZlbFRlc3QsCitdCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgcnVuX3VuaXR0ZXN0KCp0ZXN0c19ndWkpCmRpZmYgLS1naXQgYS9MaWIvbGliLXRrL3Rlc3QvdGVzdF90dGsvc3VwcG9ydC5weSBiL0xpYi9saWItdGsvdGVzdC90ZXN0X3R0ay9zdXBwb3J0LnB5CmluZGV4IDU3ZTc4MDMuLmUxMGY4MGMgMTAwNjQ0Ci0tLSBhL0xpYi9saWItdGsvdGVzdC90ZXN0X3R0ay9zdXBwb3J0LnB5CisrKyBiL0xpYi9saWItdGsvdGVzdC90ZXN0X3R0ay9zdXBwb3J0LnB5CkBAIC0xLDMgKzEsNCBAQAoraW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgVGtpbnRlcgogCiBkZWYgZ2V0X3RrX3Jvb3QoKToKQEAgLTMxLDMgKzMyLDU3IEBACiAgICAgd2lkZ2V0LmV2ZW50X2dlbmVyYXRlKCc8TW90aW9uPicsIHg9eCwgeT15KQogICAgIHdpZGdldC5ldmVudF9nZW5lcmF0ZSgnPEJ1dHRvblByZXNzLTE+JywgeD14LCB5PXkpCiAgICAgd2lkZ2V0LmV2ZW50X2dlbmVyYXRlKCc8QnV0dG9uUmVsZWFzZS0xPicsIHg9eCwgeT15KQorCisKK2ltcG9ydCBfdGtpbnRlcgordGNsX3ZlcnNpb24gPSB0dXBsZShtYXAoaW50LCBfdGtpbnRlci5UQ0xfVkVSU0lPTi5zcGxpdCgnLicpKSkKKworZGVmIHJlcXVpcmVzX3RjbCgqdmVyc2lvbik6CisgICAgcmV0dXJuIHVuaXR0ZXN0LnNraXBVbmxlc3ModGNsX3ZlcnNpb24gPj0gdmVyc2lvbiwKKyAgICAgICAgICAgICdyZXF1aXJlcyBUY2wgdmVyc2lvbiA+PSAnICsgJy4nLmpvaW4obWFwKHN0ciwgdmVyc2lvbikpKQorCitfdGtfcGF0Y2hsZXZlbCA9IE5vbmUKK2RlZiBnZXRfdGtfcGF0Y2hsZXZlbCgpOgorICAgIGdsb2JhbCBfdGtfcGF0Y2hsZXZlbAorICAgIGlmIF90a19wYXRjaGxldmVsIGlzIE5vbmU6CisgICAgICAgIHRjbCA9IFRraW50ZXIuVGNsKCkKKyAgICAgICAgcGF0Y2hsZXZlbCA9IFtdCisgICAgICAgIGZvciB4IGluIHRjbC5jYWxsKCdpbmZvJywgJ3BhdGNobGV2ZWwnKS5zcGxpdCgnLicpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHggPSBpbnQoeCwgMTApCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICB4ID0gLTEKKyAgICAgICAgICAgIHBhdGNobGV2ZWwuYXBwZW5kKHgpCisgICAgICAgIF90a19wYXRjaGxldmVsID0gdHVwbGUocGF0Y2hsZXZlbCkKKyAgICByZXR1cm4gX3RrX3BhdGNobGV2ZWwKKwordW5pdHMgPSB7CisgICAgJ2MnOiA3MiAvIDIuNTQsICAgICAjIGNlbnRpbWV0ZXJzCisgICAgJ2knOiA3MiwgICAgICAgICAgICAjIGluY2hlcworICAgICdtJzogNzIgLyAyNS40LCAgICAgIyBtaWxsaW1ldGVycworICAgICdwJzogMSwgICAgICAgICAgICAgIyBwb2ludHMKK30KKworZGVmIHBpeGVsc19jb252KHZhbHVlKToKKyAgICByZXR1cm4gZmxvYXQodmFsdWVbOi0xXSkgKiB1bml0c1t2YWx1ZVstMTpdXQorCitkZWYgdGNsX29ial9lcShhY3R1YWwsIGV4cGVjdGVkKToKKyAgICBpZiBhY3R1YWwgPT0gZXhwZWN0ZWQ6CisgICAgICAgIHJldHVybiBUcnVlCisgICAgaWYgaXNpbnN0YW5jZShhY3R1YWwsIF90a2ludGVyLlRjbF9PYmopOgorICAgICAgICBpZiBpc2luc3RhbmNlKGV4cGVjdGVkLCBzdHIpOgorICAgICAgICAgICAgcmV0dXJuIHN0cihhY3R1YWwpID09IGV4cGVjdGVkCisgICAgaWYgaXNpbnN0YW5jZShhY3R1YWwsIHR1cGxlKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShleHBlY3RlZCwgdHVwbGUpOgorICAgICAgICAgICAgcmV0dXJuIChsZW4oYWN0dWFsKSA9PSBsZW4oZXhwZWN0ZWQpIGFuZAorICAgICAgICAgICAgICAgICAgICBhbGwodGNsX29ial9lcShhY3QsIGV4cCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhY3QsIGV4cCBpbiB6aXAoYWN0dWFsLCBleHBlY3RlZCkpKQorICAgIHJldHVybiBGYWxzZQorCitkZWYgd2lkZ2V0X2VxKGFjdHVhbCwgZXhwZWN0ZWQpOgorICAgIGlmIGFjdHVhbCA9PSBleHBlY3RlZDoKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICBpZiBpc2luc3RhbmNlKGFjdHVhbCwgKHN0ciwgVGtpbnRlci5XaWRnZXQpKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShleHBlY3RlZCwgKHN0ciwgVGtpbnRlci5XaWRnZXQpKToKKyAgICAgICAgICAgIHJldHVybiBzdHIoYWN0dWFsKSA9PSBzdHIoZXhwZWN0ZWQpCisgICAgcmV0dXJuIEZhbHNlCmRpZmYgLS1naXQgYS9MaWIvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9leHRlbnNpb25zLnB5IGIvTGliL2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3RfZXh0ZW5zaW9ucy5weQppbmRleCA2ZTQ2Y2JjLi44MzAxZjg3IDEwMDY0NAotLS0gYS9MaWIvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9leHRlbnNpb25zLnB5CisrKyBiL0xpYi9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X2V4dGVuc2lvbnMucHkKQEAgLTI5LDcgKzI5LDEwIEBACiAgICAgICAgIG5hbWUgPSBteXZhci5fbmFtZQogICAgICAgICB4ID0gdHRrLkxhYmVsZWRTY2FsZSh2YXJpYWJsZT1teXZhcikKICAgICAgICAgeC5kZXN0cm95KCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnRrLmdsb2JhbGdldHZhcihuYW1lKSwgbXl2YXIuZ2V0KCkpCisgICAgICAgIGlmIHgudGsud2FudG9iamVjdHMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC50ay5nbG9iYWxnZXR2YXIobmFtZSksIG15dmFyLmdldCgpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCh4LnRrLmdsb2JhbGdldHZhcihuYW1lKSksIG15dmFyLmdldCgpKQogICAgICAgICBkZWwgbXl2YXIKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgeC50ay5nbG9iYWxnZXR2YXIsIG5hbWUpCiAKQEAgLTQ1LDcgKzQ4LDcgQEAKICAgICAgICAgIyBpdCB0cmllcyBjYWxsaW5nIGluc3RhbmNlIGF0dHJpYnV0ZXMgbm90IHlldCBkZWZpbmVkLgogICAgICAgICB0dGsuTGFiZWxlZFNjYWxlKHZhcmlhYmxlPW15dmFyKQogICAgICAgICBpZiBoYXNhdHRyKHN5cywgJ2xhc3RfdHlwZScpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzeXMubGFzdF90eXBlID09IFRraW50ZXIuVGNsRXJyb3IpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHN5cy5sYXN0X3R5cGUsIFRraW50ZXIuVGNsRXJyb3IpCiAKIAogICAgIGRlZiB0ZXN0X2luaXRpYWxpemF0aW9uKHNlbGYpOgpAQCAtNTksOCArNjIsMTAgQEAKICAgICAgICAgeC5kZXN0cm95KCkKIAogICAgICAgICAjIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uL3Bhc3NpbmcKLSAgICAgICAgcGFzc2VkX2V4cGVjdGVkID0gKCgyLjUsIDIpLCAoJzAnLCAwKSwgKDAsIDApLCAoMTAsIDEwKSwKKyAgICAgICAgcGFzc2VkX2V4cGVjdGVkID0gKCgnMCcsIDApLCAoMCwgMCksICgxMCwgMTApLAogICAgICAgICAgICAgKC0xLCAtMSksIChzeXMubWF4aW50ICsgMSwgc3lzLm1heGludCArIDEpKQorICAgICAgICBpZiB4LnRrLndhbnRvYmplY3RzKCk6CisgICAgICAgICAgICBwYXNzZWRfZXhwZWN0ZWQgKz0gKCgyLjUsIDIpLCkKICAgICAgICAgZm9yIHBhaXIgaW4gcGFzc2VkX2V4cGVjdGVkOgogICAgICAgICAgICAgeCA9IHR0ay5MYWJlbGVkU2NhbGUoZnJvbV89cGFpclswXSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC52YWx1ZSwgcGFpclsxXSkKQEAgLTEyMCwxNCArMTI1LDE0IEBACiAgICAgICAgICMgYXQgdGhlIHNhbWUgdGltZSB0aGlzIHNob3VsZG4ndCBhZmZlY3QgdGVzdCBvdXRjb21lCiAgICAgICAgIGxzY2FsZS51cGRhdGUoKQogICAgICAgICBjdXJyX3hjb29yZCA9IGxzY2FsZS5zY2FsZS5jb29yZHMoKVswXQotICAgICAgICBzZWxmLmFzc2VydFRydWUocHJldl94Y29vcmQgIT0gY3Vycl94Y29vcmQpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocHJldl94Y29vcmQsIGN1cnJfeGNvb3JkKQogICAgICAgICAjIHRoZSBsYWJlbCB3aWRnZXQgc2hvdWxkIGhhdmUgYmVlbiByZXBvc2l0aW9uZWQgdG9vCiAgICAgICAgIGxpbmZvXzIgPSBsc2NhbGUubGFiZWwucGxhY2VfaW5mbygpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobHNjYWxlLmxhYmVsWyd0ZXh0J10sIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobHNjYWxlLmxhYmVsWyd0ZXh0J10sIDAgaWYgbHNjYWxlLnRrLndhbnRvYmplY3RzKCkgZWxzZSAnMCcpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3Vycl94Y29vcmQsIGludChsaW5mb18yWyd4J10pKQogICAgICAgICAjIGNoYW5nZSB0aGUgcmFuZ2UgYmFjawogICAgICAgICBsc2NhbGUuc2NhbGUuY29uZmlndXJlKGZyb21fPTAsIHRvPTEwKQotICAgICAgICBzZWxmLmFzc2VydFRydWUocHJldl94Y29vcmQgIT0gY3Vycl94Y29vcmQpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocHJldl94Y29vcmQsIGN1cnJfeGNvb3JkKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByZXZfeGNvb3JkLCBpbnQobGluZm9fMVsneCddKSkKIAogICAgICAgICBsc2NhbGUuZGVzdHJveSgpCkBAIC0xNDUsMTUgKzE1MCwyMCBAQAogICAgICAgICAjIFRoZSBmb2xsb3dpbmcgdXBkYXRlIGlzIG5lZWRlZCBzaW5jZSB0aGUgdGVzdCBkb2Vzbid0IHVzZSBtYWlubG9vcCwKICAgICAgICAgIyBhdCB0aGUgc2FtZSB0aW1lIHRoaXMgc2hvdWxkbid0IGFmZmVjdCB0ZXN0IG91dGNvbWUKICAgICAgICAgeC51cGRhdGUoKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgubGFiZWxbJ3RleHQnXSwgbmV3dmFsKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoeC5zY2FsZS5jb29yZHMoKVswXSA+IGN1cnJfeGNvb3JkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgubGFiZWxbJ3RleHQnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXd2YWwgaWYgeC50ay53YW50b2JqZWN0cygpIGVsc2Ugc3RyKG5ld3ZhbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcih4LnNjYWxlLmNvb3JkcygpWzBdLCBjdXJyX3hjb29yZCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnNjYWxlLmNvb3JkcygpWzBdLAogICAgICAgICAgICAgaW50KHgubGFiZWwucGxhY2VfaW5mbygpWyd4J10pKQogCiAgICAgICAgICMgdmFsdWUgb3V0c2lkZSByYW5nZQotICAgICAgICB4LnZhbHVlID0geC5zY2FsZVsndG8nXSArIDEgIyBubyBjaGFuZ2VzIHNob3VsZG4ndCBoYXBwZW4KKyAgICAgICAgaWYgeC50ay53YW50b2JqZWN0cygpOgorICAgICAgICAgICAgY29udiA9IGxhbWJkYSB4OiB4CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb252ID0gaW50CisgICAgICAgIHgudmFsdWUgPSBjb252KHguc2NhbGVbJ3RvJ10pICsgMSAjIG5vIGNoYW5nZXMgc2hvdWxkbid0IGhhcHBlbgogICAgICAgICB4LnVwZGF0ZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5sYWJlbFsndGV4dCddLCBuZXd2YWwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29udih4LmxhYmVsWyd0ZXh0J10pLCBuZXd2YWwpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5zY2FsZS5jb29yZHMoKVswXSwKICAgICAgICAgICAgIGludCh4LmxhYmVsLnBsYWNlX2luZm8oKVsneCddKSkKIApAQCAtMjM4LDcgKzI0OCw3IEBACiAgICAgICAgICAgICBpZiBsYXN0ID09IGN1cnI6CiAgICAgICAgICAgICAgICAgIyBubyBtb3JlIG1lbnUgZW50cmllcwogICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGN1cnIgPT0gZGVmYXVsdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoY3VyciwgZGVmYXVsdCkKICAgICAgICAgICAgIGkgKz0gMQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGksIGxlbihpdGVtcykpCiAKZGlmZiAtLWdpdCBhL0xpYi9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X2Z1bmN0aW9ucy5weSBiL0xpYi9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X2Z1bmN0aW9ucy5weQppbmRleCA5ZGUyNWE0Li41MGM1YWViIDEwMDY0NAotLS0gYS9MaWIvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9mdW5jdGlvbnMucHkKKysrIGIvTGliL2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3RfZnVuY3Rpb25zLnB5CkBAIC0zLDYgKzMsMTcgQEAKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHR0awogCitjbGFzcyBNb2NrVGtBcHA6CisKKyAgICBkZWYgc3BsaXRsaXN0KHNlbGYsIGFyZyk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJnLCB0dXBsZSk6CisgICAgICAgICAgICByZXR1cm4gYXJnCisgICAgICAgIHJldHVybiBhcmcuc3BsaXQoJzonKQorCisgICAgZGVmIHdhbnRvYmplY3RzKHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisKIGNsYXNzIE1vY2tUY2xPYmoob2JqZWN0KToKICAgICB0eXBlbmFtZSA9ICd0ZXN0JwogCkBAIC01MCwxMyArNjEsMTcgQEAKICAgICAgICAgICAgIHR0ay5fZm9ybWF0X29wdGRpY3Qoeyd0ZXN0JzogeydsZWZ0JzogJ2FzIGlzJ319KSwKICAgICAgICAgICAgIHsnLXRlc3QnOiB7J2xlZnQnOiAnYXMgaXMnfX0pCiAKLSAgICAgICAgIyBjaGVjayBzY3JpcHQgZm9ybWF0dGluZyBhbmQgdW50b3VjaGVkIHZhbHVlKHMpCisgICAgICAgICMgY2hlY2sgc2NyaXB0IGZvcm1hdHRpbmcKICAgICAgICAgY2hlY2tfYWdhaW5zdCgKICAgICAgICAgICAgIHR0ay5fZm9ybWF0X29wdGRpY3QoCi0gICAgICAgICAgICAgICAgeyd0ZXN0JzogWzEsIC0xLCAnJywgJzJtJywgMF0sICdub2NoYW5nZTEnOiAzLAotICAgICAgICAgICAgICAgICAnbm9jaGFuZ2UyJzogJ2FiYyBkZWYnfSwgc2NyaXB0PVRydWUpLAotICAgICAgICAgICAgeyctdGVzdCc6ICd7MSAtMSB7fSAybSAwfScsICctbm9jaGFuZ2UxJzogMywKLSAgICAgICAgICAgICAnLW5vY2hhbmdlMic6ICdhYmMgZGVmJyB9KQorICAgICAgICAgICAgICAgIHsndGVzdCc6IFsxLCAtMSwgJycsICcybScsIDBdLCAndGVzdDInOiAzLAorICAgICAgICAgICAgICAgICAndGVzdDMnOiAnJywgJ3Rlc3Q0JzogJ2FiYyBkZWYnLAorICAgICAgICAgICAgICAgICAndGVzdDUnOiAnImFiYyInLCAndGVzdDYnOiAne30nLAorICAgICAgICAgICAgICAgICAndGVzdDcnOiAnfSAtc3BhbSB7J30sIHNjcmlwdD1UcnVlKSwKKyAgICAgICAgICAgIHsnLXRlc3QnOiAnezEgLTEge30gMm0gMH0nLCAnLXRlc3QyJzogJzMnLAorICAgICAgICAgICAgICctdGVzdDMnOiAne30nLCAnLXRlc3Q0JzogJ3thYmMgZGVmfScsCisgICAgICAgICAgICAgJy10ZXN0NSc6ICd7ImFiYyJ9JywgJy10ZXN0Nic6IHInXHtcfScsCisgICAgICAgICAgICAgJy10ZXN0Nyc6IHInXH1cIC1zcGFtXCBceyd9KQogCiAgICAgICAgIG9wdHMgPSB7dSfOsc6yzrMnOiBUcnVlLCB1J8OhJzogRmFsc2V9CiAgICAgICAgIG9yaWdfb3B0cyA9IG9wdHMuY29weSgpCkBAIC03MCw2ICs4NSwzMiBAQAogICAgICAgICAgICAgdHRrLl9mb3JtYXRfb3B0ZGljdCgKICAgICAgICAgICAgICAgICB7J29wdGlvbic6ICgnb25lIHR3bycsICd0aHJlZScpfSksCiAgICAgICAgICAgICB7Jy1vcHRpb24nOiAne29uZSB0d299IHRocmVlJ30pCisgICAgICAgIGNoZWNrX2FnYWluc3QoCisgICAgICAgICAgICB0dGsuX2Zvcm1hdF9vcHRkaWN0KAorICAgICAgICAgICAgICAgIHsnb3B0aW9uJzogKCdvbmVcdHR3bycsICd0aHJlZScpfSksCisgICAgICAgICAgICB7Jy1vcHRpb24nOiAne29uZVx0dHdvfSB0aHJlZSd9KQorCisgICAgICAgICMgcGFzc2luZyBlbXB0eSBzdHJpbmdzIGluc2lkZSBhIHR1cGxlL2xpc3QKKyAgICAgICAgY2hlY2tfYWdhaW5zdCgKKyAgICAgICAgICAgIHR0ay5fZm9ybWF0X29wdGRpY3QoCisgICAgICAgICAgICAgICAgeydvcHRpb24nOiAoJycsICdvbmUnKX0pLAorICAgICAgICAgICAgeyctb3B0aW9uJzogJ3t9IG9uZSd9KQorCisgICAgICAgICMgcGFzc2luZyB2YWx1ZXMgd2l0aCBicmFjZXMgaW5zaWRlIGEgdHVwbGUvbGlzdAorICAgICAgICBjaGVja19hZ2FpbnN0KAorICAgICAgICAgICAgdHRrLl9mb3JtYXRfb3B0ZGljdCgKKyAgICAgICAgICAgICAgICB7J29wdGlvbic6ICgnb25lfSB7dHdvJywgJ3RocmVlJyl9KSwKKyAgICAgICAgICAgIHsnLW9wdGlvbic6IHInb25lXH1cIFx7dHdvIHRocmVlJ30pCisKKyAgICAgICAgIyBwYXNzaW5nIHF1b3RlZCBzdHJpbmdzIGluc2lkZSBhIHR1cGxlL2xpc3QKKyAgICAgICAgY2hlY2tfYWdhaW5zdCgKKyAgICAgICAgICAgIHR0ay5fZm9ybWF0X29wdGRpY3QoCisgICAgICAgICAgICAgICAgeydvcHRpb24nOiAoJyJvbmUiJywgJ3R3bycpfSksCisgICAgICAgICAgICB7Jy1vcHRpb24nOiAneyJvbmUifSB0d28nfSkKKyAgICAgICAgY2hlY2tfYWdhaW5zdCgKKyAgICAgICAgICAgIHR0ay5fZm9ybWF0X29wdGRpY3QoCisgICAgICAgICAgICAgICAgeydvcHRpb24nOiAoJ3tvbmV9JywgJ3R3bycpfSksCisgICAgICAgICAgICB7Jy1vcHRpb24nOiByJ1x7b25lXH0gdHdvJ30pCiAKICAgICAgICAgIyBpZ25vcmUgYW4gb3B0aW9uCiAgICAgICAgIGFtb3VudF9vcHRzID0gbGVuKHR0ay5fZm9ybWF0X29wdGRpY3Qob3B0cywgaWdub3JlPSh1J8OhJykpKSAvLyAyCkBAIC0xNDMsOCArMTg0LDEwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSgnaW1hZ2UnLCBGYWxzZSwgJ3Rlc3QnLAogICAgICAgICAgICAgKCdhJywgJ2InLCAnYycpKSwgKCJ0ZXN0IHthIGJ9IGMiLCAoKSkpCiAgICAgICAgICMgc3RhdGUgc3BlYyBhbmQgb3B0aW9ucwotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUoJ2ltYWdlJywgRmFsc2UsICd0ZXN0JywKLSAgICAgICAgICAgICgnYScsICdiJyksIGE9J3gnLCBiPSd5JyksICgidGVzdCBhIGIiLCAoIi1hIiwgIngiLCAiLWIiLCAieSIpKSkKKyAgICAgICAgcmVzID0gdHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSgnaW1hZ2UnLCBGYWxzZSwgJ3Rlc3QnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnYScsICdiJyksIGE9J3gnLCBiPSd5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbMF0sICJ0ZXN0IGEgYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KHJlc1sxXSksIHsiLWEiLCAieCIsICItYiIsICJ5In0pCiAgICAgICAgICMgZm9ybWF0IHJldHVybmVkIHZhbHVlcyBhcyBhIHRjbCBzY3JpcHQKICAgICAgICAgIyBzdGF0ZSBzcGVjIHdpdGggbXVsdGlwbGUgc3RhdGVzIGFuZCBhbiBvcHRpb24gd2l0aCBhIG11bHRpdmFsdWUKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlKCdpbWFnZScsIFRydWUsICd0ZXN0JywKQEAgLTMyMSwyMCArMzY0LDIyIEBACiAKIAogICAgIGRlZiB0ZXN0X2xpc3RfZnJvbV9sYXlvdXR0dXBsZShzZWxmKToKKyAgICAgICAgdGsgPSBNb2NrVGtBcHAoKQorCiAgICAgICAgICMgZW1wdHkgbGF5b3V0IHR1cGxlCi0gICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodHRrLl9saXN0X2Zyb21fbGF5b3V0dHVwbGUoKCkpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHR0ay5fbGlzdF9mcm9tX2xheW91dHR1cGxlKHRrLCAoKSkpCiAKICAgICAgICAgIyBzaG9ydGVzdCBsYXlvdXQgdHVwbGUKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2xpc3RfZnJvbV9sYXlvdXR0dXBsZSgoJ25hbWUnLCApKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2xpc3RfZnJvbV9sYXlvdXR0dXBsZSh0aywgKCduYW1lJywgKSksCiAgICAgICAgICAgICBbKCduYW1lJywge30pXSkKIAogICAgICAgICAjIG5vdCBzbyBpbnRlcmVzdGluZyBsdHVwbGUKICAgICAgICAgc2FtcGxlX2x0dXBsZSA9ICgnbmFtZScsICctb3B0aW9uJywgJ3ZhbHVlJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2xpc3RfZnJvbV9sYXlvdXR0dXBsZShzYW1wbGVfbHR1cGxlKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2xpc3RfZnJvbV9sYXlvdXR0dXBsZSh0aywgc2FtcGxlX2x0dXBsZSksCiAgICAgICAgICAgICBbKCduYW1lJywgeydvcHRpb24nOiAndmFsdWUnfSldKQogCiAgICAgICAgICMgZW1wdHkgY2hpbGRyZW4KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2xpc3RfZnJvbV9sYXlvdXR0dXBsZSgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2xpc3RfZnJvbV9sYXlvdXR0dXBsZSh0aywKICAgICAgICAgICAgICgnc29tZXRoaW5nJywgJy1jaGlsZHJlbicsICgpKSksCiAgICAgICAgICAgICBbKCdzb21ldGhpbmcnLCB7J2NoaWxkcmVuJzogW119KV0KICAgICAgICAgKQpAQCAtMzQ3LDcgKzM5Miw3IEBACiAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgKQogICAgICAgICApCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9saXN0X2Zyb21fbGF5b3V0dHVwbGUobHR1cGxlKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2xpc3RfZnJvbV9sYXlvdXR0dXBsZSh0aywgbHR1cGxlKSwKICAgICAgICAgICAgIFsoJ25hbWUnLCB7J29wdGlvbic6ICduaWNlb25lJywgJ2NoaWxkcmVuJzoKICAgICAgICAgICAgICAgICBbKCdvdGhlcm9uZScsIHsnb3RoZXJvcHQnOiAnb3RoZXJ2YWx1ZScsICdjaGlsZHJlbic6CiAgICAgICAgICAgICAgICAgICAgIFsoJ2NoaWxkJywge30pXQpAQCAtMzU2LDI3ICs0MDEsMzUgQEAKICAgICAgICAgKQogCiAgICAgICAgICMgYmFkIHR1cGxlcwotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0dGsuX2xpc3RfZnJvbV9sYXlvdXR0dXBsZSwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdHRrLl9saXN0X2Zyb21fbGF5b3V0dHVwbGUsIHRrLAogICAgICAgICAgICAgKCduYW1lJywgJ25vX21pbnVzJykpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHR0ay5fbGlzdF9mcm9tX2xheW91dHR1cGxlLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0dGsuX2xpc3RfZnJvbV9sYXlvdXR0dXBsZSwgdGssCiAgICAgICAgICAgICAoJ25hbWUnLCAnbm9fbWludXMnLCAndmFsdWUnKSkKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdHRrLl9saXN0X2Zyb21fbGF5b3V0dHVwbGUsCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHR0ay5fbGlzdF9mcm9tX2xheW91dHR1cGxlLCB0aywKICAgICAgICAgICAgICgnc29tZXRoaW5nJywgJy1jaGlsZHJlbicpKSAjIG5vIGNoaWxkcmVuCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHR0ay5fbGlzdF9mcm9tX2xheW91dHR1cGxlLAotICAgICAgICAgICAgKCdzb21ldGhpbmcnLCAnLWNoaWxkcmVuJywgJ3ZhbHVlJykpICMgaW52YWxpZCBjaGlsZHJlbgogCiAKICAgICBkZWYgdGVzdF92YWxfb3JfZGljdChzZWxmKToKLSAgICAgICAgZGVmIGZ1bmMob3B0LCB2YWw9Tm9uZSk6CisgICAgICAgIGRlZiBmdW5jKHJlcywgb3B0PU5vbmUsIHZhbD1Ob25lKToKKyAgICAgICAgICAgIGlmIG9wdCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiByZXMKICAgICAgICAgICAgIGlmIHZhbCBpcyBOb25lOgogICAgICAgICAgICAgICAgIHJldHVybiAidGVzdCB2YWwiCiAgICAgICAgICAgICByZXR1cm4gKG9wdCwgdmFsKQogCi0gICAgICAgIG9wdGlvbnMgPSB7J3Rlc3QnOiBOb25lfQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fdmFsX29yX2RpY3Qob3B0aW9ucywgZnVuYyksICJ0ZXN0IHZhbCIpCisgICAgICAgIHRrID0gTW9ja1RrQXBwKCkKKyAgICAgICAgdGsuY2FsbCA9IGZ1bmMKIAotICAgICAgICBvcHRpb25zID0geyd0ZXN0JzogM30KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX3ZhbF9vcl9kaWN0KG9wdGlvbnMsIGZ1bmMpLCBvcHRpb25zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fdmFsX29yX2RpY3QodGssIHt9LCAnLXRlc3Q6MycpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHsndGVzdCc6ICczJ30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl92YWxfb3JfZGljdCh0aywge30sICgnLXRlc3QnLCAzKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgeyd0ZXN0JzogM30pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX3ZhbF9vcl9kaWN0KHRrLCB7J3Rlc3QnOiBOb25lfSwgJ3g6eScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0IHZhbCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX3ZhbF9vcl9kaWN0KHRrLCB7J3Rlc3QnOiAzfSwgJ3g6eScpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHsndGVzdCc6IDN9KQogCiAKICAgICBkZWYgdGVzdF9jb252ZXJ0X3N0cmluZ3ZhbChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X3N0eWxlLnB5IGIvTGliL2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3Rfc3R5bGUucHkKaW5kZXggNjMwZTA3NS4uZTkwZWVlYSAxMDA2NDQKLS0tIGEvTGliL2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3Rfc3R5bGUucHkKKysrIGIvTGliL2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3Rfc3R5bGUucHkKQEAgLTE4LDE1ICsxOCwxNiBAQAogICAgICAgICBzdHlsZS5jb25maWd1cmUoJ1RCdXR0b24nLCBiYWNrZ3JvdW5kPSd5ZWxsb3cnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0eWxlLmNvbmZpZ3VyZSgnVEJ1dHRvbicsICdiYWNrZ3JvdW5kJyksCiAgICAgICAgICAgICAneWVsbG93JykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc3R5bGUuY29uZmlndXJlKCdUQnV0dG9uJyksIGRpY3QpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3R5bGUuY29uZmlndXJlKCdUQnV0dG9uJyksIGRpY3QpCiAKIAogICAgIGRlZiB0ZXN0X21hcChzZWxmKToKICAgICAgICAgc3R5bGUgPSBzZWxmLnN0eWxlCiAgICAgICAgIHN0eWxlLm1hcCgnVEJ1dHRvbicsIGJhY2tncm91bmQ9WygnYWN0aXZlJywgJ2JhY2tncm91bmQnLCAnYmx1ZScpXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHlsZS5tYXAoJ1RCdXR0b24nLCAnYmFja2dyb3VuZCcpLAotICAgICAgICAgICAgWygnYWN0aXZlJywgJ2JhY2tncm91bmQnLCAnYmx1ZScpXSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc3R5bGUubWFwKCdUQnV0dG9uJyksIGRpY3QpKQorICAgICAgICAgICAgWygnYWN0aXZlJywgJ2JhY2tncm91bmQnLCAnYmx1ZScpXSBpZiBzdHlsZS50ay53YW50b2JqZWN0cygpIGVsc2UKKyAgICAgICAgICAgIFsoJ2FjdGl2ZSBiYWNrZ3JvdW5kJywgJ2JsdWUnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdHlsZS5tYXAoJ1RCdXR0b24nKSwgZGljdCkKIAogCiAgICAgZGVmIHRlc3RfbG9va3VwKHNlbGYpOgpAQCAtNTcsNyArNTgsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0eWxlLmxheW91dCgnVHJlZXZpZXcnKSwgdHZfc3R5bGUpCiAKICAgICAgICAgIyBzaG91bGQgcmV0dXJuIGEgbGlzdAotICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzdHlsZS5sYXlvdXQoJ1RCdXR0b24nKSwgbGlzdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdHlsZS5sYXlvdXQoJ1RCdXR0b24nKSwgbGlzdCkKIAogICAgICAgICAjIGNvcnJlY3QgbGF5b3V0LCBidXQgIm9wdGlvbiIgZG9lc24ndCBleGlzdCBhcyBvcHRpb24KICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc3R5bGUubGF5b3V0LCAnVHJlZXZpZXcnLApkaWZmIC0tZ2l0IGEvTGliL2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3Rfd2lkZ2V0cy5weSBiL0xpYi9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X3dpZGdldHMucHkKaW5kZXggYWNhOTBjZi4uNGIwMTM2NCAxMDA2NDQKLS0tIGEvTGliL2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3Rfd2lkZ2V0cy5weQorKysgYi9MaWIvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF93aWRnZXRzLnB5CkBAIC02LDkgKzYsNTQgQEAKIAogaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdF9mdW5jdGlvbnMgaW1wb3J0IE1vY2tUY2xPYmosIE1vY2tTdGF0ZVNwZWMKK2Zyb20gc3VwcG9ydCBpbXBvcnQgdGNsX3ZlcnNpb24sIGdldF90a19wYXRjaGxldmVsCitmcm9tIHdpZGdldF90ZXN0cyBpbXBvcnQgKGFkZF9zdGFuZGFyZF9vcHRpb25zLCBub2NvbnYsIG5vY29udl9tZXRoLAorICAgIEFic3RyYWN0V2lkZ2V0VGVzdCwgU3RhbmRhcmRPcHRpb25zVGVzdHMsCisgICAgSW50ZWdlclNpemVUZXN0cywgUGl4ZWxTaXplVGVzdHMsCisgICAgc2V0VXBNb2R1bGUpCiAKIHJlcXVpcmVzKCdndWknKQogCisKK2NsYXNzIFN0YW5kYXJkVHRrT3B0aW9uc1Rlc3RzKFN0YW5kYXJkT3B0aW9uc1Rlc3RzKToKKworICAgIGRlZiB0ZXN0X2NsYXNzKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2lkZ2V0WydjbGFzcyddLCAnJykKKyAgICAgICAgZXJybXNnPSdhdHRlbXB0IHRvIGNoYW5nZSByZWFkLW9ubHkgb3B0aW9uJworICAgICAgICBpZiBnZXRfdGtfcGF0Y2hsZXZlbCgpIDwgKDgsIDYsIDApOiAjIGFjdHVhbGx5IHRoaXMgd2FzIGNoYW5nZWQgaW4gOC42YjMKKyAgICAgICAgICAgIGVycm1zZz0nQXR0ZW1wdCB0byBjaGFuZ2UgcmVhZC1vbmx5IG9wdGlvbicKKyAgICAgICAgc2VsZi5jaGVja0ludmFsaWRQYXJhbSh3aWRnZXQsICdjbGFzcycsICdGb28nLCBlcnJtc2c9ZXJybXNnKQorICAgICAgICB3aWRnZXQyID0gc2VsZi5jcmVhdGUoY2xhc3NfPSdGb28nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdpZGdldDJbJ2NsYXNzJ10sICdGb28nKQorCisgICAgZGVmIHRlc3RfcGFkZGluZyhzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAncGFkZGluZycsIDAsIGV4cGVjdGVkPSgnMCcsKSkKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ3BhZGRpbmcnLCA1LCBleHBlY3RlZD0oJzUnLCkpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbSh3aWRnZXQsICdwYWRkaW5nJywgKDUsIDYpLCBleHBlY3RlZD0oJzUnLCAnNicpKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAncGFkZGluZycsICg1LCA2LCA3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkPSgnNScsICc2JywgJzcnKSkKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ3BhZGRpbmcnLCAoNSwgNiwgNywgOCksCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD0oJzUnLCAnNicsICc3JywgJzgnKSkKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ3BhZGRpbmcnLCAoJzVwJywgJzZwJywgJzdwJywgJzhwJykpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbSh3aWRnZXQsICdwYWRkaW5nJywgKCksIGV4cGVjdGVkPScnKQorCisgICAgZGVmIHRlc3Rfc3R5bGUoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3aWRnZXRbJ3N0eWxlJ10sICcnKQorICAgICAgICBlcnJtc2cgPSAnTGF5b3V0IEZvbyBub3QgZm91bmQnCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgJ2RlZmF1bHRfb3JpZW50Jyk6CisgICAgICAgICAgICBlcnJtc2cgPSAoJ0xheW91dCAlcy5Gb28gbm90IGZvdW5kJyAlCisgICAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihzZWxmLCAnZGVmYXVsdF9vcmllbnQnKS50aXRsZSgpKQorICAgICAgICBzZWxmLmNoZWNrSW52YWxpZFBhcmFtKHdpZGdldCwgJ3N0eWxlJywgJ0ZvbycsCisgICAgICAgICAgICAgICAgZXJybXNnPWVycm1zZykKKyAgICAgICAgd2lkZ2V0MiA9IHNlbGYuY3JlYXRlKGNsYXNzXz0nRm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3aWRnZXQyWydjbGFzcyddLCAnRm9vJykKKyAgICAgICAgIyBYWFgKKyAgICAgICAgcGFzcworCisKIGNsYXNzIFdpZGdldFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgICIiIlRlc3RzIG1ldGhvZHMgYXZhaWxhYmxlIGluIGV2ZXJ5IHR0ayB3aWRnZXQuIiIiCiAKQEAgLTI2LDggKzcxLDggQEAKICAgICBkZWYgdGVzdF9pZGVudGlmeShzZWxmKToKICAgICAgICAgc2VsZi53aWRnZXQudXBkYXRlX2lkbGV0YXNrcygpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi53aWRnZXQuaWRlbnRpZnkoCi0gICAgICAgICAgICBpbnQoc2VsZi53aWRnZXQud2luZm9fd2lkdGgoKSAvIDIpLAotICAgICAgICAgICAgaW50KHNlbGYud2lkZ2V0LndpbmZvX2hlaWdodCgpIC8gMikKKyAgICAgICAgICAgIHNlbGYud2lkZ2V0LndpbmZvX3dpZHRoKCkgLy8gMiwKKyAgICAgICAgICAgIHNlbGYud2lkZ2V0LndpbmZvX2hlaWdodCgpIC8vIDIKICAgICAgICAgICAgICksICJsYWJlbCIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi53aWRnZXQuaWRlbnRpZnkoLTEsIC0xKSwgIiIpCiAKQEAgLTcyLDcgKzExNywxMTIgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLndpZGdldC5zdGF0ZSgpLCAoJ2FjdGl2ZScsICkpCiAKIAotY2xhc3MgQnV0dG9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CitjbGFzcyBBYnN0cmFjdFRvcGxldmVsVGVzdChBYnN0cmFjdFdpZGdldFRlc3QsIFBpeGVsU2l6ZVRlc3RzKToKKyAgICBfY29udl9waXhlbHMgPSBub2NvbnZfbWV0aAorCisKK0BhZGRfc3RhbmRhcmRfb3B0aW9ucyhTdGFuZGFyZFR0a09wdGlvbnNUZXN0cykKK2NsYXNzIEZyYW1lVGVzdChBYnN0cmFjdFRvcGxldmVsVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIE9QVElPTlMgPSAoCisgICAgICAgICdib3JkZXJ3aWR0aCcsICdjbGFzcycsICdjdXJzb3InLCAnaGVpZ2h0JywKKyAgICAgICAgJ3BhZGRpbmcnLCAncmVsaWVmJywgJ3N0eWxlJywgJ3Rha2Vmb2N1cycsCisgICAgICAgICd3aWR0aCcsCisgICAgKQorCisgICAgZGVmIF9jcmVhdGUoc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gdHRrLkZyYW1lKHNlbGYucm9vdCwgKiprd2FyZ3MpCisKKworQGFkZF9zdGFuZGFyZF9vcHRpb25zKFN0YW5kYXJkVHRrT3B0aW9uc1Rlc3RzKQorY2xhc3MgTGFiZWxGcmFtZVRlc3QoQWJzdHJhY3RUb3BsZXZlbFRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBPUFRJT05TID0gKAorICAgICAgICAnYm9yZGVyd2lkdGgnLCAnY2xhc3MnLCAnY3Vyc29yJywgJ2hlaWdodCcsCisgICAgICAgICdsYWJlbGFuY2hvcicsICdsYWJlbHdpZGdldCcsCisgICAgICAgICdwYWRkaW5nJywgJ3JlbGllZicsICdzdHlsZScsICd0YWtlZm9jdXMnLAorICAgICAgICAndGV4dCcsICd1bmRlcmxpbmUnLCAnd2lkdGgnLAorICAgICkKKworICAgIGRlZiBfY3JlYXRlKHNlbGYsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHR0ay5MYWJlbEZyYW1lKHNlbGYucm9vdCwgKiprd2FyZ3MpCisKKyAgICBkZWYgdGVzdF9sYWJlbGFuY2hvcihzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrRW51bVBhcmFtKHdpZGdldCwgJ2xhYmVsYW5jaG9yJywKKyAgICAgICAgICAgICAgICAnZScsICdlbicsICdlcycsICduJywgJ25lJywgJ253JywgJ3MnLCAnc2UnLCAnc3cnLCAndycsICd3bicsICd3cycsCisgICAgICAgICAgICAgICAgZXJybXNnPSdCYWQgbGFiZWwgYW5jaG9yIHNwZWNpZmljYXRpb24ge30nKQorICAgICAgICBzZWxmLmNoZWNrSW52YWxpZFBhcmFtKHdpZGdldCwgJ2xhYmVsYW5jaG9yJywgJ2NlbnRlcicpCisKKyAgICBkZWYgdGVzdF9sYWJlbHdpZGdldChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBsYWJlbCA9IHR0ay5MYWJlbChzZWxmLnJvb3QsIHRleHQ9J011cHAnLCBuYW1lPSdmb28nKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnbGFiZWx3aWRnZXQnLCBsYWJlbCwgZXhwZWN0ZWQ9Jy5mb28nKQorICAgICAgICBsYWJlbC5kZXN0cm95KCkKKworCitjbGFzcyBBYnN0cmFjdExhYmVsVGVzdChBYnN0cmFjdFdpZGdldFRlc3QpOgorCisgICAgZGVmIGNoZWNrSW1hZ2VQYXJhbShzZWxmLCB3aWRnZXQsIG5hbWUpOgorICAgICAgICBpbWFnZSA9IFRraW50ZXIuUGhvdG9JbWFnZSgnaW1hZ2UxJykKKyAgICAgICAgaW1hZ2UyID0gVGtpbnRlci5QaG90b0ltYWdlKCdpbWFnZTInKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCBuYW1lLCBpbWFnZSwgZXhwZWN0ZWQ9KCdpbWFnZTEnLCkpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbSh3aWRnZXQsIG5hbWUsICdpbWFnZTEnLCBleHBlY3RlZD0oJ2ltYWdlMScsKSkKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgbmFtZSwgKGltYWdlLCksIGV4cGVjdGVkPSgnaW1hZ2UxJywpKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCBuYW1lLCAoaW1hZ2UsICdhY3RpdmUnLCBpbWFnZTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ9KCdpbWFnZTEnLCAnYWN0aXZlJywgJ2ltYWdlMicpKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCBuYW1lLCAnaW1hZ2UxIGFjdGl2ZSBpbWFnZTInLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ9KCdpbWFnZTEnLCAnYWN0aXZlJywgJ2ltYWdlMicpKQorICAgICAgICBzZWxmLmNoZWNrSW52YWxpZFBhcmFtKHdpZGdldCwgbmFtZSwgJ3NwYW0nLAorICAgICAgICAgICAgICAgIGVycm1zZz0naW1hZ2UgInNwYW0iIGRvZXNuXCd0IGV4aXN0JykKKworICAgIGRlZiB0ZXN0X2NvbXBvdW5kKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tFbnVtUGFyYW0od2lkZ2V0LCAnY29tcG91bmQnLAorICAgICAgICAgICAgICAgICdub25lJywgJ3RleHQnLCAnaW1hZ2UnLCAnY2VudGVyJywKKyAgICAgICAgICAgICAgICAndG9wJywgJ2JvdHRvbScsICdsZWZ0JywgJ3JpZ2h0JykKKworICAgIGRlZiB0ZXN0X3N0YXRlKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbXMod2lkZ2V0LCAnc3RhdGUnLCAnYWN0aXZlJywgJ2Rpc2FibGVkJywgJ25vcm1hbCcpCisKKyAgICBkZWYgdGVzdF93aWR0aChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW1zKHdpZGdldCwgJ3dpZHRoJywgNDAyLCAtNDAyLCAwKQorCisKK0BhZGRfc3RhbmRhcmRfb3B0aW9ucyhTdGFuZGFyZFR0a09wdGlvbnNUZXN0cykKK2NsYXNzIExhYmVsVGVzdChBYnN0cmFjdExhYmVsVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIE9QVElPTlMgPSAoCisgICAgICAgICdhbmNob3InLCAnYmFja2dyb3VuZCcsCisgICAgICAgICdjbGFzcycsICdjb21wb3VuZCcsICdjdXJzb3InLCAnZm9udCcsICdmb3JlZ3JvdW5kJywKKyAgICAgICAgJ2ltYWdlJywgJ2p1c3RpZnknLCAncGFkZGluZycsICdyZWxpZWYnLCAnc3RhdGUnLCAnc3R5bGUnLAorICAgICAgICAndGFrZWZvY3VzJywgJ3RleHQnLCAndGV4dHZhcmlhYmxlJywKKyAgICAgICAgJ3VuZGVybGluZScsICd3aWR0aCcsICd3cmFwbGVuZ3RoJywKKyAgICApCisgICAgX2NvbnZfcGl4ZWxzID0gbm9jb252X21ldGgKKworICAgIGRlZiBfY3JlYXRlKHNlbGYsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHR0ay5MYWJlbChzZWxmLnJvb3QsICoqa3dhcmdzKQorCisgICAgZGVmIHRlc3RfZm9udChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnZm9udCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnLUFkb2JlLUhlbHZldGljYS1NZWRpdW0tUi1Ob3JtYWwtLSotMTIwLSotKi0qLSotKi0qJykKKworCitAYWRkX3N0YW5kYXJkX29wdGlvbnMoU3RhbmRhcmRUdGtPcHRpb25zVGVzdHMpCitjbGFzcyBCdXR0b25UZXN0KEFic3RyYWN0TGFiZWxUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgT1BUSU9OUyA9ICgKKyAgICAgICAgJ2NsYXNzJywgJ2NvbW1hbmQnLCAnY29tcG91bmQnLCAnY3Vyc29yJywgJ2RlZmF1bHQnLAorICAgICAgICAnaW1hZ2UnLCAnc3RhdGUnLCAnc3R5bGUnLCAndGFrZWZvY3VzJywgJ3RleHQnLCAndGV4dHZhcmlhYmxlJywKKyAgICAgICAgJ3VuZGVybGluZScsICd3aWR0aCcsCisgICAgKQorCisgICAgZGVmIF9jcmVhdGUoc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gdHRrLkJ1dHRvbihzZWxmLnJvb3QsICoqa3dhcmdzKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrRW51bVBhcmFtKHdpZGdldCwgJ2RlZmF1bHQnLCAnbm9ybWFsJywgJ2FjdGl2ZScsICdkaXNhYmxlZCcpCiAKICAgICBkZWYgdGVzdF9pbnZva2Uoc2VsZik6CiAgICAgICAgIHN1Y2Nlc3MgPSBbXQpAQCAtODEsNyArMjMxLDI3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdWNjZXNzKQogCiAKLWNsYXNzIENoZWNrYnV0dG9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CitAYWRkX3N0YW5kYXJkX29wdGlvbnMoU3RhbmRhcmRUdGtPcHRpb25zVGVzdHMpCitjbGFzcyBDaGVja2J1dHRvblRlc3QoQWJzdHJhY3RMYWJlbFRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBPUFRJT05TID0gKAorICAgICAgICAnY2xhc3MnLCAnY29tbWFuZCcsICdjb21wb3VuZCcsICdjdXJzb3InLAorICAgICAgICAnaW1hZ2UnLAorICAgICAgICAnb2ZmdmFsdWUnLCAnb252YWx1ZScsCisgICAgICAgICdzdGF0ZScsICdzdHlsZScsCisgICAgICAgICd0YWtlZm9jdXMnLCAndGV4dCcsICd0ZXh0dmFyaWFibGUnLAorICAgICAgICAndW5kZXJsaW5lJywgJ3ZhcmlhYmxlJywgJ3dpZHRoJywKKyAgICApCisKKyAgICBkZWYgX2NyZWF0ZShzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiB0dGsuQ2hlY2tidXR0b24oc2VsZi5yb290LCAqKmt3YXJncykKKworICAgIGRlZiB0ZXN0X29mZnZhbHVlKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbXMod2lkZ2V0LCAnb2ZmdmFsdWUnLCAxLCAyLjMsICcnLCAnYW55IHN0cmluZycpCisKKyAgICBkZWYgdGVzdF9vbnZhbHVlKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbXMod2lkZ2V0LCAnb252YWx1ZScsIDEsIDIuMywgJycsICdhbnkgc3RyaW5nJykKIAogICAgIGRlZiB0ZXN0X2ludm9rZShzZWxmKToKICAgICAgICAgc3VjY2VzcyA9IFtdCkBAIC0xMDQsMjEgKzI3NCw0MCBAQAogCiAgICAgICAgIGNidG5bJ2NvbW1hbmQnXSA9ICcnCiAgICAgICAgIHJlcyA9IGNidG4uaW52b2tlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsICcnKQotICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGxlbihzdWNjZXNzKSA+IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc3RyKHJlcykpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKGxlbihzdWNjZXNzKSwgMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYnRuWydvZmZ2YWx1ZSddLAogICAgICAgICAgICAgY2J0bi50ay5nbG9iYWxnZXR2YXIoY2J0blsndmFyaWFibGUnXSkpCiAKIAotY2xhc3MgQ29tYm9ib3hUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKK0BhZGRfc3RhbmRhcmRfb3B0aW9ucyhJbnRlZ2VyU2l6ZVRlc3RzLCBTdGFuZGFyZFR0a09wdGlvbnNUZXN0cykKK2NsYXNzIENvbWJvYm94VGVzdChBYnN0cmFjdFdpZGdldFRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBPUFRJT05TID0gKAorICAgICAgICAnY2xhc3MnLCAnY3Vyc29yJywgJ2V4cG9ydHNlbGVjdGlvbicsICdoZWlnaHQnLAorICAgICAgICAnanVzdGlmeScsICdwb3N0Y29tbWFuZCcsICdzdGF0ZScsICdzdHlsZScsCisgICAgICAgICd0YWtlZm9jdXMnLCAndGV4dHZhcmlhYmxlJywgJ3ZhbHVlcycsICd3aWR0aCcsCisgICAgKQogCiAgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihDb21ib2JveFRlc3QsIHNlbGYpLnNldFVwKCkKICAgICAgICAgc3VwcG9ydC5yb290X2RlaWNvbmlmeSgpCi0gICAgICAgIHNlbGYuY29tYm8gPSB0dGsuQ29tYm9ib3goKQorICAgICAgICBzZWxmLmNvbWJvID0gc2VsZi5jcmVhdGUoKQogCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzZWxmLmNvbWJvLmRlc3Ryb3koKQogICAgICAgICBzdXBwb3J0LnJvb3Rfd2l0aGRyYXcoKQorICAgICAgICBzdXBlcihDb21ib2JveFRlc3QsIHNlbGYpLnRlYXJEb3duKCkKKworICAgIGRlZiBfY3JlYXRlKHNlbGYsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHR0ay5Db21ib2JveChzZWxmLnJvb3QsICoqa3dhcmdzKQorCisgICAgZGVmIHRlc3RfaGVpZ2h0KHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbXMod2lkZ2V0LCAnaGVpZ2h0JywgMTAwLCAxMDEuMiwgMTAyLjYsIC0xMDAsIDAsICcxaScpCisKKyAgICBkZWYgdGVzdF9zdGF0ZShzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW1zKHdpZGdldCwgJ3N0YXRlJywgJ2FjdGl2ZScsICdkaXNhYmxlZCcsICdub3JtYWwnKQogCiAgICAgZGVmIF9zaG93X2Ryb3BfZG93bl9saXN0Ym94KHNlbGYpOgogICAgICAgICB3aWR0aCA9IHNlbGYuY29tYm8ud2luZm9fd2lkdGgoKQpAQCAtMTY2LDggKzM1NSwxNiBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbWJvLmdldCgpLCBnZXR2YWwpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tYm8uY3VycmVudCgpLCBjdXJydmFsKQogCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb21ib1sndmFsdWVzJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgKCkgaWYgdGNsX3ZlcnNpb24gPCAoOCwgNSkgZWxzZSAnJykKICAgICAgICAgY2hlY2tfZ2V0X2N1cnJlbnQoJycsIC0xKQogCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbShzZWxmLmNvbWJvLCAndmFsdWVzJywgJ21vbiB0dWUgd2VkIHRodXInLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ9KCdtb24nLCAndHVlJywgJ3dlZCcsICd0aHVyJykpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbShzZWxmLmNvbWJvLCAndmFsdWVzJywgKCdtb24nLCAndHVlJywgJ3dlZCcsICd0aHVyJykpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbShzZWxmLmNvbWJvLCAndmFsdWVzJywgKDQyLCAzLjE0LCAnJywgJ2FueSBzdHJpbmcnKSkKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHNlbGYuY29tYm8sICd2YWx1ZXMnLCAoKSBpZiB0Y2xfdmVyc2lvbiA8ICg4LCA1KSBlbHNlICcnKQorCiAgICAgICAgIHNlbGYuY29tYm9bJ3ZhbHVlcyddID0gWydhJywgMSwgJ2MnXQogCiAgICAgICAgIHNlbGYuY29tYm8uc2V0KCdjJykKQEAgLTE4Niw3ICszODMsMjEgQEAKIAogICAgICAgICAjIHRlc3RpbmcgdmFsdWVzIHdpdGggZW1wdHkgc3RyaW5nIHNldCB0aHJvdWdoIGNvbmZpZ3VyZQogICAgICAgICBzZWxmLmNvbWJvLmNvbmZpZ3VyZSh2YWx1ZXM9WzEsICcnLCAyXSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbWJvWyd2YWx1ZXMnXSwgKCcxJywgJycsICcyJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb21ib1sndmFsdWVzJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgKCcxJywgJycsICcyJykgaWYgc2VsZi53YW50b2JqZWN0cyBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgJzEge30gMicpCisKKyAgICAgICAgIyB0ZXN0aW5nIHZhbHVlcyB3aXRoIHNwYWNlcworICAgICAgICBzZWxmLmNvbWJvWyd2YWx1ZXMnXSA9IFsnYSBiJywgJ2FcdGInLCAnYVxuYiddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb21ib1sndmFsdWVzJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdhIGInLCAnYVx0YicsICdhXG5iJykgaWYgc2VsZi53YW50b2JqZWN0cyBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3thIGJ9IHthXHRifSB7YVxuYn0nKQorCisgICAgICAgICMgdGVzdGluZyB2YWx1ZXMgd2l0aCBzcGVjaWFsIGNoYXJhY3RlcnMKKyAgICAgICAgc2VsZi5jb21ib1sndmFsdWVzJ10gPSBbcidhXHRiJywgJyJhIicsICd9IHsnXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tYm9bJ3ZhbHVlcyddLAorICAgICAgICAgICAgICAgICAgICAgICAgIChyJ2FcdGInLCAnImEiJywgJ30geycpIGlmIHNlbGYud2FudG9iamVjdHMgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgIHInYVxcdGIgeyJhIn0gXH1cIFx7JykKIAogICAgICAgICAjIG91dCBvZiByYW5nZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLmNvbWJvLmN1cnJlbnQsCkBAIC0xOTYsMjYgKzQwNyw2MSBAQAogCiAgICAgICAgICMgdGVzdGluZyBjcmVhdGluZyBjb21ib2JveCB3aXRoIGVtcHR5IHN0cmluZyBpbiB2YWx1ZXMKICAgICAgICAgY29tYm8yID0gdHRrLkNvbWJvYm94KHZhbHVlcz1bMSwgMiwgJyddKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbWJvMlsndmFsdWVzJ10sICgnMScsICcyJywgJycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbWJvMlsndmFsdWVzJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgKCcxJywgJzInLCAnJykgaWYgc2VsZi53YW50b2JqZWN0cyBlbHNlICcxIDIge30nKQogICAgICAgICBjb21ibzIuZGVzdHJveSgpCiAKIAotY2xhc3MgRW50cnlUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKK0BhZGRfc3RhbmRhcmRfb3B0aW9ucyhJbnRlZ2VyU2l6ZVRlc3RzLCBTdGFuZGFyZFR0a09wdGlvbnNUZXN0cykKK2NsYXNzIEVudHJ5VGVzdChBYnN0cmFjdFdpZGdldFRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBPUFRJT05TID0gKAorICAgICAgICAnYmFja2dyb3VuZCcsICdjbGFzcycsICdjdXJzb3InLAorICAgICAgICAnZXhwb3J0c2VsZWN0aW9uJywgJ2ZvbnQnLAorICAgICAgICAnaW52YWxpZGNvbW1hbmQnLCAnanVzdGlmeScsCisgICAgICAgICdzaG93JywgJ3N0YXRlJywgJ3N0eWxlJywgJ3Rha2Vmb2N1cycsICd0ZXh0dmFyaWFibGUnLAorICAgICAgICAndmFsaWRhdGUnLCAndmFsaWRhdGVjb21tYW5kJywgJ3dpZHRoJywgJ3hzY3JvbGxjb21tYW5kJywKKyAgICApCiAKICAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKEVudHJ5VGVzdCwgc2VsZikuc2V0VXAoKQogICAgICAgICBzdXBwb3J0LnJvb3RfZGVpY29uaWZ5KCkKLSAgICAgICAgc2VsZi5lbnRyeSA9IHR0ay5FbnRyeSgpCisgICAgICAgIHNlbGYuZW50cnkgPSBzZWxmLmNyZWF0ZSgpCiAKICAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIHNlbGYuZW50cnkuZGVzdHJveSgpCiAgICAgICAgIHN1cHBvcnQucm9vdF93aXRoZHJhdygpCisgICAgICAgIHN1cGVyKEVudHJ5VGVzdCwgc2VsZikudGVhckRvd24oKQorCisgICAgZGVmIF9jcmVhdGUoc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gdHRrLkVudHJ5KHNlbGYucm9vdCwgKiprd2FyZ3MpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkY29tbWFuZChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrQ29tbWFuZFBhcmFtKHdpZGdldCwgJ2ludmFsaWRjb21tYW5kJykKKworICAgIGRlZiB0ZXN0X3Nob3coc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ3Nob3cnLCAnKicpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbSh3aWRnZXQsICdzaG93JywgJycpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbSh3aWRnZXQsICdzaG93JywgJyAnKQorCisgICAgZGVmIHRlc3Rfc3RhdGUoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtcyh3aWRnZXQsICdzdGF0ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc2FibGVkJywgJ25vcm1hbCcsICdyZWFkb25seScpCisKKyAgICBkZWYgdGVzdF92YWxpZGF0ZShzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrRW51bVBhcmFtKHdpZGdldCwgJ3ZhbGlkYXRlJywKKyAgICAgICAgICAgICAgICAnYWxsJywgJ2tleScsICdmb2N1cycsICdmb2N1c2luJywgJ2ZvY3Vzb3V0JywgJ25vbmUnKQorCisgICAgZGVmIHRlc3RfdmFsaWRhdGVjb21tYW5kKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tDb21tYW5kUGFyYW0od2lkZ2V0LCAndmFsaWRhdGVjb21tYW5kJykKIAogCiAgICAgZGVmIHRlc3RfYmJveChzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5lbnRyeS5iYm94KDApKSwgNCkKLSAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5lbnRyeS5iYm94KDApOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoaXRlbSwgaW50KSkKLQorICAgICAgICBzZWxmLmFzc2VydElzQm91bmRpbmdCb3goc2VsZi5lbnRyeS5iYm94KDApKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLmVudHJ5LmJib3gsICdub2luZGV4JykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5lbnRyeS5iYm94LCBOb25lKQogCkBAIC0zMDQsMTYgKzU1MCwzNiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW50cnkuc3RhdGUoKSwgKCkpCiAKIAotY2xhc3MgUGFuZWR3aW5kb3dUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKK0BhZGRfc3RhbmRhcmRfb3B0aW9ucyhJbnRlZ2VyU2l6ZVRlc3RzLCBTdGFuZGFyZFR0a09wdGlvbnNUZXN0cykKK2NsYXNzIFBhbmVkV2luZG93VGVzdChBYnN0cmFjdFdpZGdldFRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBPUFRJT05TID0gKAorICAgICAgICAnY2xhc3MnLCAnY3Vyc29yJywgJ2hlaWdodCcsCisgICAgICAgICdvcmllbnQnLCAnc3R5bGUnLCAndGFrZWZvY3VzJywgJ3dpZHRoJywKKyAgICApCiAKICAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKFBhbmVkV2luZG93VGVzdCwgc2VsZikuc2V0VXAoKQogICAgICAgICBzdXBwb3J0LnJvb3RfZGVpY29uaWZ5KCkKLSAgICAgICAgc2VsZi5wYW5lZCA9IHR0ay5QYW5lZHdpbmRvdygpCisgICAgICAgIHNlbGYucGFuZWQgPSBzZWxmLmNyZWF0ZSgpCiAKICAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIHNlbGYucGFuZWQuZGVzdHJveSgpCiAgICAgICAgIHN1cHBvcnQucm9vdF93aXRoZHJhdygpCisgICAgICAgIHN1cGVyKFBhbmVkV2luZG93VGVzdCwgc2VsZikudGVhckRvd24oKQogCisgICAgZGVmIF9jcmVhdGUoc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gdHRrLlBhbmVkV2luZG93KHNlbGYucm9vdCwgKiprd2FyZ3MpCisKKyAgICBkZWYgdGVzdF9vcmllbnQoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIod2lkZ2V0WydvcmllbnQnXSksICd2ZXJ0aWNhbCcpCisgICAgICAgIGVycm1zZz0nYXR0ZW1wdCB0byBjaGFuZ2UgcmVhZC1vbmx5IG9wdGlvbicKKyAgICAgICAgaWYgZ2V0X3RrX3BhdGNobGV2ZWwoKSA8ICg4LCA2LCAwKTogIyBhY3R1YWxseSB0aGlzIHdhcyBjaGFuZ2VkIGluIDguNmIzCisgICAgICAgICAgICBlcnJtc2c9J0F0dGVtcHQgdG8gY2hhbmdlIHJlYWQtb25seSBvcHRpb24nCisgICAgICAgIHNlbGYuY2hlY2tJbnZhbGlkUGFyYW0od2lkZ2V0LCAnb3JpZW50JywgJ2hvcml6b250YWwnLAorICAgICAgICAgICAgICAgIGVycm1zZz1lcnJtc2cpCisgICAgICAgIHdpZGdldDIgPSBzZWxmLmNyZWF0ZShvcmllbnQ9J2hvcml6b250YWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih3aWRnZXQyWydvcmllbnQnXSksICdob3Jpem9udGFsJykKIAogICAgIGRlZiB0ZXN0X2FkZChzZWxmKToKICAgICAgICAgIyBhdHRlbXB0IHRvIGFkZCBhIGNoaWxkIHRoYXQgaXMgbm90IGEgZGlyZWN0IGNoaWxkIG9mIHRoZSBwYW5lZCB3aW5kb3cKQEAgLTM5MiwxMCArNjU4LDEyIEBACiAKICAgICAgICAgY2hpbGQgPSB0dGsuTGFiZWwoKQogICAgICAgICBzZWxmLnBhbmVkLmFkZChjaGlsZCkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi5wYW5lZC5wYW5lKDApLCBkaWN0KSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhbmVkLnBhbmUoMCwgd2VpZ2h0PU5vbmUpLCAwKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2VsZi5wYW5lZC5wYW5lKDApLCBkaWN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFuZWQucGFuZSgwLCB3ZWlnaHQ9Tm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgMCBpZiBzZWxmLndhbnRvYmplY3RzIGVsc2UgJzAnKQogICAgICAgICAjIG5ld2VyIGZvcm0gZm9yIHF1ZXJ5aW5nIGEgc2luZ2xlIG9wdGlvbgotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFuZWQucGFuZSgwLCAnd2VpZ2h0JyksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYW5lZC5wYW5lKDAsICd3ZWlnaHQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwIGlmIHNlbGYud2FudG9iamVjdHMgZWxzZSAnMCcpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYW5lZC5wYW5lKDApLCBzZWxmLnBhbmVkLnBhbmUoc3RyKGNoaWxkKSkpCiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5wYW5lLCAwLApAQCAtNDE5LDExICs2ODcsMjYgQEAKIAogICAgICAgICBjdXJyX3BvcyA9IHNlbGYucGFuZWQuc2FzaHBvcygwKQogICAgICAgICBzZWxmLnBhbmVkLnNhc2hwb3MoMCwgMTAwMCkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGN1cnJfcG9zICE9IHNlbGYucGFuZWQuc2FzaHBvcygwKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi5wYW5lZC5zYXNocG9zKDApLCBpbnQpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGN1cnJfcG9zLCBzZWxmLnBhbmVkLnNhc2hwb3MoMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWxmLnBhbmVkLnNhc2hwb3MoMCksIGludCkKIAogCi1jbGFzcyBSYWRpb2J1dHRvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorQGFkZF9zdGFuZGFyZF9vcHRpb25zKFN0YW5kYXJkVHRrT3B0aW9uc1Rlc3RzKQorY2xhc3MgUmFkaW9idXR0b25UZXN0KEFic3RyYWN0TGFiZWxUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgT1BUSU9OUyA9ICgKKyAgICAgICAgJ2NsYXNzJywgJ2NvbW1hbmQnLCAnY29tcG91bmQnLCAnY3Vyc29yJywKKyAgICAgICAgJ2ltYWdlJywKKyAgICAgICAgJ3N0YXRlJywgJ3N0eWxlJywKKyAgICAgICAgJ3Rha2Vmb2N1cycsICd0ZXh0JywgJ3RleHR2YXJpYWJsZScsCisgICAgICAgICd1bmRlcmxpbmUnLCAndmFsdWUnLCAndmFyaWFibGUnLCAnd2lkdGgnLAorICAgICkKKworICAgIGRlZiBfY3JlYXRlKHNlbGYsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHR0ay5SYWRpb2J1dHRvbihzZWxmLnJvb3QsICoqa3dhcmdzKQorCisgICAgZGVmIHRlc3RfdmFsdWUoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtcyh3aWRnZXQsICd2YWx1ZScsIDEsIDIuMywgJycsICdhbnkgc3RyaW5nJykKIAogICAgIGRlZiB0ZXN0X2ludm9rZShzZWxmKToKICAgICAgICAgc3VjY2VzcyA9IFtdCkBAIC00MzUsMzcgKzcxOCw5MSBAQAogICAgICAgICBjYnRuID0gdHRrLlJhZGlvYnV0dG9uKGNvbW1hbmQ9Y2JfdGVzdCwgdmFyaWFibGU9bXl2YXIsIHZhbHVlPTApCiAgICAgICAgIGNidG4yID0gdHRrLlJhZGlvYnV0dG9uKGNvbW1hbmQ9Y2JfdGVzdCwgdmFyaWFibGU9bXl2YXIsIHZhbHVlPTEpCiAKKyAgICAgICAgaWYgc2VsZi53YW50b2JqZWN0czoKKyAgICAgICAgICAgIGNvbnYgPSBsYW1iZGEgeDogeAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29udiA9IGludAorCiAgICAgICAgIHJlcyA9IGNidG4uaW52b2tlKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsICJjYiB0ZXN0IGNhbGxlZCIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2J0blsndmFsdWUnXSwgbXl2YXIuZ2V0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29udihjYnRuWyd2YWx1ZSddKSwgbXl2YXIuZ2V0KCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXl2YXIuZ2V0KCksCi0gICAgICAgICAgICBjYnRuLnRrLmdsb2JhbGdldHZhcihjYnRuWyd2YXJpYWJsZSddKSkKKyAgICAgICAgICAgIGNvbnYoY2J0bi50ay5nbG9iYWxnZXR2YXIoY2J0blsndmFyaWFibGUnXSkpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUoc3VjY2VzcykKIAogICAgICAgICBjYnRuMlsnY29tbWFuZCddID0gJycKICAgICAgICAgcmVzID0gY2J0bjIuaW52b2tlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsICcnKQotICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGxlbihzdWNjZXNzKSA+IDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2J0bjJbJ3ZhbHVlJ10sIG15dmFyLmdldCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihyZXMpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwobGVuKHN1Y2Nlc3MpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnYoY2J0bjJbJ3ZhbHVlJ10pLCBteXZhci5nZXQoKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChteXZhci5nZXQoKSwKLSAgICAgICAgICAgIGNidG4udGsuZ2xvYmFsZ2V0dmFyKGNidG5bJ3ZhcmlhYmxlJ10pKQorICAgICAgICAgICAgY29udihjYnRuLnRrLmdsb2JhbGdldHZhcihjYnRuWyd2YXJpYWJsZSddKSkpCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY2J0blsndmFyaWFibGUnXSksIHN0cihjYnRuMlsndmFyaWFibGUnXSkpCiAKIAorY2xhc3MgTWVudWJ1dHRvblRlc3QoQWJzdHJhY3RMYWJlbFRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBPUFRJT05TID0gKAorICAgICAgICAnY2xhc3MnLCAnY29tcG91bmQnLCAnY3Vyc29yJywgJ2RpcmVjdGlvbicsCisgICAgICAgICdpbWFnZScsICdtZW51JywgJ3N0YXRlJywgJ3N0eWxlJywKKyAgICAgICAgJ3Rha2Vmb2N1cycsICd0ZXh0JywgJ3RleHR2YXJpYWJsZScsCisgICAgICAgICd1bmRlcmxpbmUnLCAnd2lkdGgnLAorICAgICkKIAotY2xhc3MgU2NhbGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgX2NyZWF0ZShzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiB0dGsuTWVudWJ1dHRvbihzZWxmLnJvb3QsICoqa3dhcmdzKQorCisgICAgZGVmIHRlc3RfZGlyZWN0aW9uKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tFbnVtUGFyYW0od2lkZ2V0LCAnZGlyZWN0aW9uJywKKyAgICAgICAgICAgICAgICAnYWJvdmUnLCAnYmVsb3cnLCAnbGVmdCcsICdyaWdodCcsICdmbHVzaCcpCisKKyAgICBkZWYgdGVzdF9tZW51KHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIG1lbnUgPSBUa2ludGVyLk1lbnUod2lkZ2V0LCBuYW1lPSdtZW51JykKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ21lbnUnLCBtZW51LCBjb252PXN0cikKKyAgICAgICAgbWVudS5kZXN0cm95KCkKKworCitAYWRkX3N0YW5kYXJkX29wdGlvbnMoU3RhbmRhcmRUdGtPcHRpb25zVGVzdHMpCitjbGFzcyBTY2FsZVRlc3QoQWJzdHJhY3RXaWRnZXRUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgT1BUSU9OUyA9ICgKKyAgICAgICAgJ2NsYXNzJywgJ2NvbW1hbmQnLCAnY3Vyc29yJywgJ2Zyb20nLCAnbGVuZ3RoJywKKyAgICAgICAgJ29yaWVudCcsICdzdHlsZScsICd0YWtlZm9jdXMnLCAndG8nLCAndmFsdWUnLCAndmFyaWFibGUnLAorICAgICkKKyAgICBfY29udl9waXhlbHMgPSBub2NvbnZfbWV0aAorICAgIGRlZmF1bHRfb3JpZW50ID0gJ2hvcml6b250YWwnCiAKICAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKFNjYWxlVGVzdCwgc2VsZikuc2V0VXAoKQogICAgICAgICBzdXBwb3J0LnJvb3RfZGVpY29uaWZ5KCkKLSAgICAgICAgc2VsZi5zY2FsZSA9IHR0ay5TY2FsZSgpCisgICAgICAgIHNlbGYuc2NhbGUgPSBzZWxmLmNyZWF0ZSgpCiAgICAgICAgIHNlbGYuc2NhbGUucGFjaygpCiAgICAgICAgIHNlbGYuc2NhbGUudXBkYXRlKCkKIAogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICAgc2VsZi5zY2FsZS5kZXN0cm95KCkKICAgICAgICAgc3VwcG9ydC5yb290X3dpdGhkcmF3KCkKKyAgICAgICAgc3VwZXIoU2NhbGVUZXN0LCBzZWxmKS50ZWFyRG93bigpCiAKKyAgICBkZWYgX2NyZWF0ZShzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiB0dGsuU2NhbGUoc2VsZi5yb290LCAqKmt3YXJncykKKworICAgIGRlZiB0ZXN0X2Zyb20oc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja0Zsb2F0UGFyYW0od2lkZ2V0LCAnZnJvbScsIDEwMCwgMTQuOSwgMTUuMSwgY29udj1GYWxzZSkKKworICAgIGRlZiB0ZXN0X2xlbmd0aChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGl4ZWxzUGFyYW0od2lkZ2V0LCAnbGVuZ3RoJywgMTMwLCAxMzEuMiwgMTM1LjYsICc1aScpCisKKyAgICBkZWYgdGVzdF90byhzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrRmxvYXRQYXJhbSh3aWRnZXQsICd0bycsIDMwMCwgMTQuOSwgMTUuMSwgLTEwLCBjb252PUZhbHNlKQorCisgICAgZGVmIHRlc3RfdmFsdWUoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja0Zsb2F0UGFyYW0od2lkZ2V0LCAndmFsdWUnLCAzMDAsIDE0LjksIDE1LjEsIC0xMCwgY29udj1GYWxzZSkKIAogICAgIGRlZiB0ZXN0X2N1c3RvbV9ldmVudChzZWxmKToKICAgICAgICAgZmFpbHVyZSA9IFsxLCAxLCAxXSAjIHdpbGwgbmVlZCB0byBiZSBlbXB0eQpAQCAtNDg3LDEwICs4MjQsMTUgQEAKIAogCiAgICAgZGVmIHRlc3RfZ2V0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLndhbnRvYmplY3RzOgorICAgICAgICAgICAgY29udiA9IGxhbWJkYSB4OiB4CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb252ID0gZmxvYXQKKwogICAgICAgICBzY2FsZV93aWR0aCA9IHNlbGYuc2NhbGUud2luZm9fd2lkdGgoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2NhbGUuZ2V0KHNjYWxlX3dpZHRoLCAwKSwgc2VsZi5zY2FsZVsndG8nXSkKIAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2NhbGUuZ2V0KDAsIDApLCBzZWxmLnNjYWxlWydmcm9tJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29udihzZWxmLnNjYWxlLmdldCgwLCAwKSksIGNvbnYoc2VsZi5zY2FsZVsnZnJvbSddKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNjYWxlLmdldCgpLCBzZWxmLnNjYWxlWyd2YWx1ZSddKQogICAgICAgICBzZWxmLnNjYWxlWyd2YWx1ZSddID0gMzAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNjYWxlLmdldCgpLCBzZWxmLnNjYWxlWyd2YWx1ZSddKQpAQCAtNTAwLDQxICs4NDIsOTkgQEAKIAogCiAgICAgZGVmIHRlc3Rfc2V0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLndhbnRvYmplY3RzOgorICAgICAgICAgICAgY29udiA9IGxhbWJkYSB4OiB4CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb252ID0gZmxvYXQKKwogICAgICAgICAjIHNldCByZXN0cmljdHMgdGhlIG1heC9taW4gdmFsdWVzIGFjY29yZGluZyB0byB0aGUgY3VycmVudCByYW5nZQotICAgICAgICBtYXggPSBzZWxmLnNjYWxlWyd0byddCisgICAgICAgIG1heCA9IGNvbnYoc2VsZi5zY2FsZVsndG8nXSkKICAgICAgICAgbmV3X21heCA9IG1heCArIDEwCiAgICAgICAgIHNlbGYuc2NhbGUuc2V0KG5ld19tYXgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zY2FsZS5nZXQoKSwgbWF4KQotICAgICAgICBtaW4gPSBzZWxmLnNjYWxlWydmcm9tJ10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb252KHNlbGYuc2NhbGUuZ2V0KCkpLCBtYXgpCisgICAgICAgIG1pbiA9IGNvbnYoc2VsZi5zY2FsZVsnZnJvbSddKQogICAgICAgICBzZWxmLnNjYWxlLnNldChtaW4gLSAxKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2NhbGUuZ2V0KCksIG1pbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb252KHNlbGYuc2NhbGUuZ2V0KCkpLCBtaW4pCiAKICAgICAgICAgIyBjaGFuZ2luZyBkaXJlY3RseSB0aGUgdmFyaWFibGUgZG9lc24ndCBpbXBvc2UgdGhpcyBsaW1pdGF0aW9uIHRobwogICAgICAgICB2YXIgPSBUa2ludGVyLkRvdWJsZVZhcigpCiAgICAgICAgIHNlbGYuc2NhbGVbJ3ZhcmlhYmxlJ10gPSB2YXIKICAgICAgICAgdmFyLnNldChtYXggKyA1KQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2NhbGUuZ2V0KCksIHZhci5nZXQoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNjYWxlLmdldCgpLCBtYXggKyA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnYoc2VsZi5zY2FsZS5nZXQoKSksIHZhci5nZXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb252KHNlbGYuc2NhbGUuZ2V0KCkpLCBtYXggKyA1KQogICAgICAgICBkZWwgdmFyCiAKICAgICAgICAgIyB0aGUgc2FtZSBoYXBwZW5zIHdpdGggdGhlIHZhbHVlIG9wdGlvbgogICAgICAgICBzZWxmLnNjYWxlWyd2YWx1ZSddID0gbWF4ICsgMTAKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNjYWxlLmdldCgpLCBtYXggKyAxMCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNjYWxlLmdldCgpLCBzZWxmLnNjYWxlWyd2YWx1ZSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnYoc2VsZi5zY2FsZS5nZXQoKSksIG1heCArIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnYoc2VsZi5zY2FsZS5nZXQoKSksIGNvbnYoc2VsZi5zY2FsZVsndmFsdWUnXSkpCiAKICAgICAgICAgIyBuZXZlcnRoZWxlc3MsIG5vdGUgdGhhdCB0aGUgbWF4L21pbiB2YWx1ZXMgd2UgY2FuIGdldCBzcGVjaWZ5aW5nCiAgICAgICAgICMgeCwgeSBjb29yZHMgYXJlIHRoZSBvbmVzIGFjY29yZGluZyB0byB0aGUgY3VycmVudCByYW5nZQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2NhbGUuZ2V0KDAsIDApLCBtaW4pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zY2FsZS5nZXQoc2VsZi5zY2FsZS53aW5mb193aWR0aCgpLCAwKSwgbWF4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnYoc2VsZi5zY2FsZS5nZXQoMCwgMCkpLCBtaW4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29udihzZWxmLnNjYWxlLmdldChzZWxmLnNjYWxlLndpbmZvX3dpZHRoKCksIDApKSwgbWF4KQogCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYuc2NhbGUuc2V0LCBOb25lKQogCiAKLWNsYXNzIE5vdGVib29rVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CitAYWRkX3N0YW5kYXJkX29wdGlvbnMoU3RhbmRhcmRUdGtPcHRpb25zVGVzdHMpCitjbGFzcyBQcm9ncmVzc2JhclRlc3QoQWJzdHJhY3RXaWRnZXRUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgT1BUSU9OUyA9ICgKKyAgICAgICAgJ2NsYXNzJywgJ2N1cnNvcicsICdvcmllbnQnLCAnbGVuZ3RoJywKKyAgICAgICAgJ21vZGUnLCAnbWF4aW11bScsICdwaGFzZScsCisgICAgICAgICdzdHlsZScsICd0YWtlZm9jdXMnLCAndmFsdWUnLCAndmFyaWFibGUnLAorICAgICkKKyAgICBfY29udl9waXhlbHMgPSBub2NvbnZfbWV0aAorICAgIGRlZmF1bHRfb3JpZW50ID0gJ2hvcml6b250YWwnCisKKyAgICBkZWYgX2NyZWF0ZShzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiB0dGsuUHJvZ3Jlc3NiYXIoc2VsZi5yb290LCAqKmt3YXJncykKKworICAgIGRlZiB0ZXN0X2xlbmd0aChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGl4ZWxzUGFyYW0od2lkZ2V0LCAnbGVuZ3RoJywgMTAwLjEsIDU2LjcsICcyaScpCisKKyAgICBkZWYgdGVzdF9tYXhpbXVtKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tGbG9hdFBhcmFtKHdpZGdldCwgJ21heGltdW0nLCAxNTAuMiwgNzcuNywgMCwgLTEwLCBjb252PUZhbHNlKQorCisgICAgZGVmIHRlc3RfbW9kZShzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrRW51bVBhcmFtKHdpZGdldCwgJ21vZGUnLCAnZGV0ZXJtaW5hdGUnLCAnaW5kZXRlcm1pbmF0ZScpCisKKyAgICBkZWYgdGVzdF9waGFzZShzZWxmKToKKyAgICAgICAgIyBYWFgKKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfdmFsdWUoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja0Zsb2F0UGFyYW0od2lkZ2V0LCAndmFsdWUnLCAxNTAuMiwgNzcuNywgMCwgLTEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252PUZhbHNlKQorCisKK0B1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nLAorICAgICAgICAgICAgICAgICAndHRrLlNjcm9sbGJhciBpcyBzcGVjaWFsIG9uIE1hY09TWCcpCitAYWRkX3N0YW5kYXJkX29wdGlvbnMoU3RhbmRhcmRUdGtPcHRpb25zVGVzdHMpCitjbGFzcyBTY3JvbGxiYXJUZXN0KEFic3RyYWN0V2lkZ2V0VGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIE9QVElPTlMgPSAoCisgICAgICAgICdjbGFzcycsICdjb21tYW5kJywgJ2N1cnNvcicsICdvcmllbnQnLCAnc3R5bGUnLCAndGFrZWZvY3VzJywKKyAgICApCisgICAgZGVmYXVsdF9vcmllbnQgPSAndmVydGljYWwnCisKKyAgICBkZWYgX2NyZWF0ZShzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiB0dGsuU2Nyb2xsYmFyKHNlbGYucm9vdCwgKiprd2FyZ3MpCisKKworQGFkZF9zdGFuZGFyZF9vcHRpb25zKEludGVnZXJTaXplVGVzdHMsIFN0YW5kYXJkVHRrT3B0aW9uc1Rlc3RzKQorY2xhc3MgTm90ZWJvb2tUZXN0KEFic3RyYWN0V2lkZ2V0VGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIE9QVElPTlMgPSAoCisgICAgICAgICdjbGFzcycsICdjdXJzb3InLCAnaGVpZ2h0JywgJ3BhZGRpbmcnLCAnc3R5bGUnLCAndGFrZWZvY3VzJywKKyAgICApCiAKICAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKE5vdGVib29rVGVzdCwgc2VsZikuc2V0VXAoKQogICAgICAgICBzdXBwb3J0LnJvb3RfZGVpY29uaWZ5KCkKLSAgICAgICAgc2VsZi5uYiA9IHR0ay5Ob3RlYm9vayhwYWRkaW5nPTApCisgICAgICAgIHNlbGYubmIgPSBzZWxmLmNyZWF0ZShwYWRkaW5nPTApCiAgICAgICAgIHNlbGYuY2hpbGQxID0gdHRrLkxhYmVsKCkKICAgICAgICAgc2VsZi5jaGlsZDIgPSB0dGsuTGFiZWwoKQogICAgICAgICBzZWxmLm5iLmFkZChzZWxmLmNoaWxkMSwgdGV4dD0nYScpCkBAIC01NDUsNyArOTQ1LDEwIEBACiAgICAgICAgIHNlbGYuY2hpbGQyLmRlc3Ryb3koKQogICAgICAgICBzZWxmLm5iLmRlc3Ryb3koKQogICAgICAgICBzdXBwb3J0LnJvb3Rfd2l0aGRyYXcoKQorICAgICAgICBzdXBlcihOb3RlYm9va1Rlc3QsIHNlbGYpLnRlYXJEb3duKCkKIAorICAgIGRlZiBfY3JlYXRlKHNlbGYsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHR0ay5Ob3RlYm9vayhzZWxmLnJvb3QsICoqa3dhcmdzKQogCiAgICAgZGVmIHRlc3RfdGFiX2lkZW50aWZpZXJzKHNlbGYpOgogICAgICAgICBzZWxmLm5iLmZvcmdldCgwKQpAQCAtNjAyLDcgKzEwMDUsNyBAQAogICAgICAgICBzZWxmLm5iLmFkZChzZWxmLmNoaWxkMikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLnRhYnMoKSwgdGFicykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLmluZGV4KHNlbGYuY2hpbGQyKSwgY2hpbGQyX2luZGV4KQotICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyKHNlbGYuY2hpbGQyKSA9PSBzZWxmLm5iLnRhYnMoKVtjaGlsZDJfaW5kZXhdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihzZWxmLmNoaWxkMiksIHNlbGYubmIudGFicygpW2NoaWxkMl9pbmRleF0pCiAgICAgICAgICMgYnV0IHRoZSB0YWIgbmV4dCB0byBpdCAobm90IGhpZGRlbikgaXMgdGhlIG9uZSBzZWxlY3RlZCBub3cKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLmluZGV4KCdjdXJyZW50JyksIGN1cnIgKyAxKQogCkBAIC02MTUsMTkgKzEwMTgsMTkgQEAKICAgICAgICAgdGFicyA9IHNlbGYubmIudGFicygpCiAgICAgICAgIGNoaWxkMV9pbmRleCA9IHNlbGYubmIuaW5kZXgoc2VsZi5jaGlsZDEpCiAgICAgICAgIHNlbGYubmIuZm9yZ2V0KHNlbGYuY2hpbGQxKQotICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHN0cihzZWxmLmNoaWxkMSkgaW4gc2VsZi5uYi50YWJzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oc3RyKHNlbGYuY2hpbGQxKSwgc2VsZi5uYi50YWJzKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRhYnMpIC0gMSwgbGVuKHNlbGYubmIudGFicygpKSkKIAogICAgICAgICBzZWxmLm5iLmFkZChzZWxmLmNoaWxkMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLmluZGV4KHNlbGYuY2hpbGQxKSwgMSkKLSAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjaGlsZDFfaW5kZXggPT0gc2VsZi5uYi5pbmRleChzZWxmLmNoaWxkMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoY2hpbGQxX2luZGV4LCBzZWxmLm5iLmluZGV4KHNlbGYuY2hpbGQxKSkKIAogCiAgICAgZGVmIHRlc3RfaW5kZXgoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuaW5kZXgsIC0xKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmluZGV4LCBOb25lKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNlbGYubmIuaW5kZXgoJ2VuZCcpLCBpbnQpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2VsZi5uYi5pbmRleCgnZW5kJyksIGludCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLmluZGV4KHNlbGYuY2hpbGQxKSwgMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLmluZGV4KHNlbGYuY2hpbGQyKSwgMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLmluZGV4KCdlbmQnKSwgMikKQEAgLTY5MSw3ICsxMDk0LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi50YWIsICdub3RhYicpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIudGFiLCBOb25lKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNlbGYubmIudGFiKHNlbGYuY2hpbGQxKSwgZGljdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWxmLm5iLnRhYihzZWxmLmNoaWxkMSksIGRpY3QpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi50YWIoc2VsZi5jaGlsZDEsIHRleHQ9Tm9uZSksICdhJykKICAgICAgICAgIyBuZXdlciBmb3JtIGZvciBxdWVyeWluZyBhIHNpbmdsZSBvcHRpb24KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLnRhYihzZWxmLmNoaWxkMSwgJ3RleHQnKSwgJ2EnKQpAQCAtNzM3LDE2ICsxMTQwLDY4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi5zZWxlY3QoKSwgc3RyKHNlbGYuY2hpbGQxKSkKIAogCi1jbGFzcyBUcmVldmlld1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorQGFkZF9zdGFuZGFyZF9vcHRpb25zKFN0YW5kYXJkVHRrT3B0aW9uc1Rlc3RzKQorY2xhc3MgVHJlZXZpZXdUZXN0KEFic3RyYWN0V2lkZ2V0VGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIE9QVElPTlMgPSAoCisgICAgICAgICdjbGFzcycsICdjb2x1bW5zJywgJ2N1cnNvcicsICdkaXNwbGF5Y29sdW1ucycsCisgICAgICAgICdoZWlnaHQnLCAncGFkZGluZycsICdzZWxlY3Rtb2RlJywgJ3Nob3cnLAorICAgICAgICAnc3R5bGUnLCAndGFrZWZvY3VzJywgJ3hzY3JvbGxjb21tYW5kJywgJ3lzY3JvbGxjb21tYW5kJywKKyAgICApCiAKICAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKFRyZWV2aWV3VGVzdCwgc2VsZikuc2V0VXAoKQogICAgICAgICBzdXBwb3J0LnJvb3RfZGVpY29uaWZ5KCkKLSAgICAgICAgc2VsZi50diA9IHR0ay5UcmVldmlldyhwYWRkaW5nPTApCisgICAgICAgIHNlbGYudHYgPSBzZWxmLmNyZWF0ZShwYWRkaW5nPTApCiAKICAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIHNlbGYudHYuZGVzdHJveSgpCiAgICAgICAgIHN1cHBvcnQucm9vdF93aXRoZHJhdygpCisgICAgICAgIHN1cGVyKFRyZWV2aWV3VGVzdCwgc2VsZikudGVhckRvd24oKQogCisgICAgZGVmIF9jcmVhdGUoc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gdHRrLlRyZWV2aWV3KHNlbGYucm9vdCwgKiprd2FyZ3MpCisKKyAgICBkZWYgdGVzdF9jb2x1bW5zKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbSh3aWRnZXQsICdjb2x1bW5zJywgJ2EgYiBjJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkPSgnYScsICdiJywgJ2MnKSkKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ2NvbHVtbnMnLCAoJ2EnLCAnYicsICdjJykpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbSh3aWRnZXQsICdjb2x1bW5zJywgKCkgaWYgdGNsX3ZlcnNpb24gPCAoOCwgNSkgZWxzZSAnJykKKworICAgIGRlZiB0ZXN0X2Rpc3BsYXljb2x1bW5zKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHdpZGdldFsnY29sdW1ucyddID0gKCdhJywgJ2InLCAnYycpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbSh3aWRnZXQsICdkaXNwbGF5Y29sdW1ucycsICdiIGEgYycsCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD0oJ2InLCAnYScsICdjJykpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbSh3aWRnZXQsICdkaXNwbGF5Y29sdW1ucycsICgnYicsICdhJywgJ2MnKSkKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ2Rpc3BsYXljb2x1bW5zJywgJyNhbGwnLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ9KCcjYWxsJywpKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnZGlzcGxheWNvbHVtbnMnLCAoMiwgMSwgMCkpCisgICAgICAgIHNlbGYuY2hlY2tJbnZhbGlkUGFyYW0od2lkZ2V0LCAnZGlzcGxheWNvbHVtbnMnLCAoJ2EnLCAnYicsICdkJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybXNnPSdJbnZhbGlkIGNvbHVtbiBpbmRleCBkJykKKyAgICAgICAgc2VsZi5jaGVja0ludmFsaWRQYXJhbSh3aWRnZXQsICdkaXNwbGF5Y29sdW1ucycsICgxLCAyLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJtc2c9J0NvbHVtbiBpbmRleCAzIG91dCBvZiBib3VuZHMnKQorICAgICAgICBzZWxmLmNoZWNrSW52YWxpZFBhcmFtKHdpZGdldCwgJ2Rpc3BsYXljb2x1bW5zJywgKDEsIC0yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJtc2c9J0NvbHVtbiBpbmRleCAtMiBvdXQgb2YgYm91bmRzJykKKworICAgIGRlZiB0ZXN0X2hlaWdodChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGl4ZWxzUGFyYW0od2lkZ2V0LCAnaGVpZ2h0JywgMTAwLCAtMTAwLCAwLCAnM2MnLCBjb252PUZhbHNlKQorICAgICAgICBzZWxmLmNoZWNrUGl4ZWxzUGFyYW0od2lkZ2V0LCAnaGVpZ2h0JywgMTAxLjIsIDEwMi42LCBjb252PW5vY29udikKKworICAgIGRlZiB0ZXN0X3NlbGVjdG1vZGUoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja0VudW1QYXJhbSh3aWRnZXQsICdzZWxlY3Rtb2RlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbm9uZScsICdicm93c2UnLCAnZXh0ZW5kZWQnKQorCisgICAgZGVmIHRlc3Rfc2hvdyhzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnc2hvdycsICd0cmVlIGhlYWRpbmdzJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkPSgndHJlZScsICdoZWFkaW5ncycpKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnc2hvdycsICgndHJlZScsICdoZWFkaW5ncycpKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnc2hvdycsICgnaGVhZGluZ3MnLCAndHJlZScpKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnc2hvdycsICd0cmVlJywgZXhwZWN0ZWQ9KCd0cmVlJywpKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnc2hvdycsICdoZWFkaW5ncycsIGV4cGVjdGVkPSgnaGVhZGluZ3MnLCkpCiAKICAgICBkZWYgdGVzdF9iYm94KHNlbGYpOgogICAgICAgICBzZWxmLnR2LnBhY2soKQpAQCAtNzU5LDE4ICsxMjE0LDE1IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjaGlsZHJlbikKIAogICAgICAgICBiYm94ID0gc2VsZi50di5iYm94KGNoaWxkcmVuWzBdKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihiYm94KSwgNCkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoYmJveCwgdHVwbGUpKQotICAgICAgICBmb3IgaXRlbSBpbiBiYm94OgotICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaXRlbSwgaW50KToKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkludmFsaWQgYm91bmRpbmcgYm94OiAlcyIgJSBiYm94KQotICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHNlbGYuYXNzZXJ0SXNCb3VuZGluZ0JveChiYm94KQogCiAgICAgICAgICMgY29tcGFyZSB3aWR0aCBpbiBiYm94ZXMKICAgICAgICAgc2VsZi50dlsnY29sdW1ucyddID0gWyd0ZXN0J10KICAgICAgICAgc2VsZi50di5jb2x1bW4oJ3Rlc3QnLCB3aWR0aD01MCkKICAgICAgICAgYmJveF9jb2x1bW4wID0gc2VsZi50di5iYm94KGNoaWxkcmVuWzBdLCAwKQogICAgICAgICByb290X3dpZHRoID0gc2VsZi50di5jb2x1bW4oJyMwJywgd2lkdGg9Tm9uZSkKKyAgICAgICAgaWYgbm90IHNlbGYud2FudG9iamVjdHM6CisgICAgICAgICAgICByb290X3dpZHRoID0gaW50KHJvb3Rfd2lkdGgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmJveF9jb2x1bW4wWzBdLCBiYm94WzBdICsgcm9vdF93aWR0aCkKIAogICAgICAgICAjIHZlcmlmeSB0aGF0IGJib3ggb2YgYSBjbG9zZWQgaXRlbSBpcyB0aGUgZW1wdHkgc3RyaW5nCkBAIC03ODMsNyArMTIzNSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oKSwgKCkpCiAKICAgICAgICAgaXRlbV9pZCA9IHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi50di5nZXRfY2hpbGRyZW4oKSwgdHVwbGUpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2VsZi50di5nZXRfY2hpbGRyZW4oKSwgdHVwbGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oKVswXSwgaXRlbV9pZCkKIAogICAgICAgICAjIGFkZCBpdGVtX2lkIGFuZCBjaGlsZDMgYXMgY2hpbGRyZW4gb2YgY2hpbGQyCkBAIC04MDgsMTQgKzEyNjAsMTcgQEAKIAogICAgIGRlZiB0ZXN0X2NvbHVtbihzZWxmKToKICAgICAgICAgIyByZXR1cm4gYSBkaWN0IHdpdGggYWxsIG9wdGlvbnMvdmFsdWVzCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNlbGYudHYuY29sdW1uKCcjMCcpLCBkaWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNlbGYudHYuY29sdW1uKCcjMCcpLCBkaWN0KQogICAgICAgICAjIHJldHVybiBhIHNpbmdsZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gb3B0aW9uCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNlbGYudHYuY29sdW1uKCcjMCcsIHdpZHRoPU5vbmUpLCBpbnQpKQorICAgICAgICBpZiBzZWxmLndhbnRvYmplY3RzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNlbGYudHYuY29sdW1uKCcjMCcsIHdpZHRoPU5vbmUpLCBpbnQpCiAgICAgICAgICMgc2V0IGEgbmV3IHZhbHVlIGZvciBhbiBvcHRpb24KICAgICAgICAgc2VsZi50di5jb2x1bW4oJyMwJywgd2lkdGg9MTApCiAgICAgICAgICMgdGVzdGluZyBuZXcgd2F5IHRvIGdldCBvcHRpb24gdmFsdWUKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmNvbHVtbignIzAnLCAnd2lkdGgnKSwgMTApCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5jb2x1bW4oJyMwJywgd2lkdGg9Tm9uZSksIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuY29sdW1uKCcjMCcsICd3aWR0aCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgIDEwIGlmIHNlbGYud2FudG9iamVjdHMgZWxzZSAnMTAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuY29sdW1uKCcjMCcsIHdpZHRoPU5vbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIDEwIGlmIHNlbGYud2FudG9iamVjdHMgZWxzZSAnMTAnKQogICAgICAgICAjIGNoZWNrIHJlYWQtb25seSBvcHRpb24KICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5jb2x1bW4sICcjMCcsIGlkPSdYJykKIApAQCAtOTIzLDcgKzEzNzgsNyBAQAogCiAgICAgZGVmIHRlc3RfaGVhZGluZyhzZWxmKToKICAgICAgICAgIyBjaGVjayBhIGRpY3QgaXMgcmV0dXJuZWQKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi50di5oZWFkaW5nKCcjMCcpLCBkaWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNlbGYudHYuaGVhZGluZygnIzAnKSwgZGljdCkKIAogICAgICAgICAjIGNoZWNrIGEgdmFsdWUgaXMgcmV0dXJuZWQKICAgICAgICAgc2VsZi50di5oZWFkaW5nKCcjMCcsIHRleHQ9J2hpJykKQEAgLTkzNywxMiArMTM5MiwxMCBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmhlYWRpbmcsICcjMCcsCiAgICAgICAgICAgICBhbmNob3I9MSkKIAotICAgICMgWFhYIHNraXBwaW5nIGZvciBub3c7IHNob3VsZCBiZSBmaXhlZCB0byB3b3JrIHdpdGggbmV3ZXIgdHRrCi0gICAgQHVuaXR0ZXN0LnNraXAoInNraXBwaW5nIHBlbmRpbmcgcmVzb2x1dGlvbiBvZiBJc3N1ZSAjMTA3MzQiKQogICAgIGRlZiB0ZXN0X2hlYWRpbmdfY2FsbGJhY2soc2VsZik6CiAgICAgICAgIGRlZiBzaW11bGF0ZV9oZWFkaW5nX2NsaWNrKHgsIHkpOgogICAgICAgICAgICAgc3VwcG9ydC5zaW11bGF0ZV9tb3VzZV9jbGljayhzZWxmLnR2LCB4LCB5KQotICAgICAgICAgICAgc2VsZi50di51cGRhdGVfaWRsZXRhc2tzKCkKKyAgICAgICAgICAgIHNlbGYudHYudXBkYXRlKCkKIAogICAgICAgICBzdWNjZXNzID0gW10gIyBubyBzdWNjZXNzIGZvciBub3cKIApAQCAtMTAzMCwxMyArMTQ4MywxNiBAQAogICAgICAgICAjIHVuaWNvZGUgdmFsdWVzCiAgICAgICAgIHZhbHVlID0gdSdceGUxYmEnCiAgICAgICAgIGl0ZW0gPSBzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcsIHZhbHVlcz0odmFsdWUsICkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pdGVtKGl0ZW0sICd2YWx1ZXMnKSwgKHZhbHVlLCApKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9Tm9uZSksICh2YWx1ZSwgKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2Lml0ZW0oaXRlbSwgJ3ZhbHVlcycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSwpIGlmIHNlbGYud2FudG9iamVjdHMgZWxzZSB2YWx1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2Lml0ZW0oaXRlbSwgdmFsdWVzPU5vbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSwpIGlmIHNlbGYud2FudG9iamVjdHMgZWxzZSB2YWx1ZSkKIAotICAgICAgICBzZWxmLnR2Lml0ZW0oaXRlbSwgdmFsdWVzPWxpc3Qoc2VsZi50di5pdGVtKGl0ZW0sIHZhbHVlcz1Ob25lKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pdGVtKGl0ZW0sIHZhbHVlcz1Ob25lKSwgKHZhbHVlLCApKQorICAgICAgICBzZWxmLnR2Lml0ZW0oaXRlbSwgdmFsdWVzPXNlbGYucm9vdC5zcGxpdGxpc3Qoc2VsZi50di5pdGVtKGl0ZW0sIHZhbHVlcz1Ob25lKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pdGVtKGl0ZW0sIHZhbHVlcz1Ob25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUsKSBpZiBzZWxmLndhbnRvYmplY3RzIGVsc2UgdmFsdWUpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi50di5pdGVtKGl0ZW0pLCBkaWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNlbGYudHYuaXRlbShpdGVtKSwgZGljdCkKIAogICAgICAgICAjIGVyYXNlIGl0ZW0gdmFsdWVzCiAgICAgICAgIHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9JycpCkBAIC0xMDQ0LDE3ICsxNTAwLDIxIEBACiAKICAgICAgICAgIyBpdGVtIHRhZ3MKICAgICAgICAgaXRlbSA9IHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJywgdGFncz1bMSwgMiwgdmFsdWVdKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB0YWdzPU5vbmUpLCAoJzEnLCAnMicsIHZhbHVlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2Lml0ZW0oaXRlbSwgdGFncz1Ob25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJzEnLCAnMicsIHZhbHVlKSBpZiBzZWxmLndhbnRvYmplY3RzIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAnMSAyICVzJyAlIHZhbHVlKQogICAgICAgICBzZWxmLnR2Lml0ZW0oaXRlbSwgdGFncz1bXSkKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnR2Lml0ZW0oaXRlbSwgdGFncz1Ob25lKSkKICAgICAgICAgc2VsZi50di5pdGVtKGl0ZW0sIHRhZ3M9KDEsIDIpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB0YWdzPU5vbmUpLCAoJzEnLCAnMicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB0YWdzPU5vbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgnMScsICcyJykgaWYgc2VsZi53YW50b2JqZWN0cyBlbHNlICcxIDInKQogCiAgICAgICAgICMgdmFsdWVzIHdpdGggc3BhY2VzCiAgICAgICAgIGl0ZW0gPSBzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcsIHZhbHVlcz0oJ2EgYiBjJywKICAgICAgICAgICAgICclcyAlcycgJSAodmFsdWUsIHZhbHVlKSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pdGVtKGl0ZW0sIHZhbHVlcz1Ob25lKSwKLSAgICAgICAgICAgICgnYSBiIGMnLCAnJXMgJXMnICUgKHZhbHVlLCB2YWx1ZSkpKQorICAgICAgICAgICAgKCdhIGIgYycsICclcyAlcycgJSAodmFsdWUsIHZhbHVlKSkgaWYgc2VsZi53YW50b2JqZWN0cyBlbHNlCisgICAgICAgICAgICAne2EgYiBjfSB7JXMgJXN9JyAlICh2YWx1ZSwgdmFsdWUpKQogCiAgICAgICAgICMgdGV4dAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaXRlbSgKQEAgLTEwNzEsMTkgKzE1MzEsMjQgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNldChpdGVtKSwgeydBJzogJ2EnLCAnQic6ICdiJ30pCiAKICAgICAgICAgc2VsZi50di5zZXQoaXRlbSwgJ0InLCAnYScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pdGVtKGl0ZW0sIHZhbHVlcz1Ob25lKSwgKCdhJywgJ2EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2Lml0ZW0oaXRlbSwgdmFsdWVzPU5vbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgnYScsICdhJykgaWYgc2VsZi53YW50b2JqZWN0cyBlbHNlICdhIGEnKQogCiAgICAgICAgIHNlbGYudHZbJ2NvbHVtbnMnXSA9IFsnQiddCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZXQoaXRlbSksIHsnQic6ICdhJ30pCiAKICAgICAgICAgc2VsZi50di5zZXQoaXRlbSwgJ0InLCAnYicpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZXQoaXRlbSwgY29sdW1uPSdCJyksICdiJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2Lml0ZW0oaXRlbSwgdmFsdWVzPU5vbmUpLCAoJ2InLCAnYScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9Tm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdiJywgJ2EnKSBpZiBzZWxmLndhbnRvYmplY3RzIGVsc2UgJ2IgYScpCiAKICAgICAgICAgc2VsZi50di5zZXQoaXRlbSwgJ0InLCAxMjMpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZXQoaXRlbSwgJ0InKSwgMTIzKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9Tm9uZSksICgxMjMsICdhJykpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZXQoaXRlbSksIHsnQic6IDEyM30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZXQoaXRlbSwgJ0InKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAxMjMgaWYgc2VsZi53YW50b2JqZWN0cyBlbHNlICcxMjMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9Tm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKDEyMywgJ2EnKSBpZiBzZWxmLndhbnRvYmplY3RzIGVsc2UgJzEyMyBhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNldChpdGVtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB7J0InOiAxMjN9IGlmIHNlbGYud2FudG9iamVjdHMgZWxzZSB7J0InOiAnMTIzJ30pCiAKICAgICAgICAgIyBpbmV4aXN0ZW50IGNvbHVtbgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LnNldCwgaXRlbSwgJ0EnKQpAQCAtMTEzNywxMyArMTYwMiwzOCBAQAogICAgICAgICAgICAgJ2JsdWUnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihzZWxmLnR2LnRhZ19jb25maWd1cmUoJ3Rlc3QnLCBmb3JlZ3JvdW5kPU5vbmUpKSwKICAgICAgICAgICAgICdibHVlJykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi50di50YWdfY29uZmlndXJlKCd0ZXN0JyksIGRpY3QpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2VsZi50di50YWdfY29uZmlndXJlKCd0ZXN0JyksIGRpY3QpCisKKworQGFkZF9zdGFuZGFyZF9vcHRpb25zKFN0YW5kYXJkVHRrT3B0aW9uc1Rlc3RzKQorY2xhc3MgU2VwYXJhdG9yVGVzdChBYnN0cmFjdFdpZGdldFRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBPUFRJT05TID0gKAorICAgICAgICAnY2xhc3MnLCAnY3Vyc29yJywgJ29yaWVudCcsICdzdHlsZScsICd0YWtlZm9jdXMnLAorICAgICAgICAjICdzdGF0ZSc/CisgICAgKQorICAgIGRlZmF1bHRfb3JpZW50ID0gJ2hvcml6b250YWwnCisKKyAgICBkZWYgX2NyZWF0ZShzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiB0dGsuU2VwYXJhdG9yKHNlbGYucm9vdCwgKiprd2FyZ3MpCisKKworQGFkZF9zdGFuZGFyZF9vcHRpb25zKFN0YW5kYXJkVHRrT3B0aW9uc1Rlc3RzKQorY2xhc3MgU2l6ZWdyaXBUZXN0KEFic3RyYWN0V2lkZ2V0VGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIE9QVElPTlMgPSAoCisgICAgICAgICdjbGFzcycsICdjdXJzb3InLCAnc3R5bGUnLCAndGFrZWZvY3VzJywKKyAgICAgICAgIyAnc3RhdGUnPworICAgICkKKworICAgIGRlZiBfY3JlYXRlKHNlbGYsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHR0ay5TaXplZ3JpcChzZWxmLnJvb3QsICoqa3dhcmdzKQogCiAKIHRlc3RzX2d1aSA9ICgKLSAgICAgICAgV2lkZ2V0VGVzdCwgQnV0dG9uVGVzdCwgQ2hlY2tidXR0b25UZXN0LCBSYWRpb2J1dHRvblRlc3QsCi0gICAgICAgIENvbWJvYm94VGVzdCwgRW50cnlUZXN0LCBQYW5lZHdpbmRvd1Rlc3QsIFNjYWxlVGVzdCwgTm90ZWJvb2tUZXN0LAotICAgICAgICBUcmVldmlld1Rlc3QKKyAgICAgICAgQnV0dG9uVGVzdCwgQ2hlY2tidXR0b25UZXN0LCBDb21ib2JveFRlc3QsIEVudHJ5VGVzdCwKKyAgICAgICAgRnJhbWVUZXN0LCBMYWJlbEZyYW1lVGVzdCwgTGFiZWxUZXN0LCBNZW51YnV0dG9uVGVzdCwKKyAgICAgICAgTm90ZWJvb2tUZXN0LCBQYW5lZFdpbmRvd1Rlc3QsIFByb2dyZXNzYmFyVGVzdCwKKyAgICAgICAgUmFkaW9idXR0b25UZXN0LCBTY2FsZVRlc3QsIFNjcm9sbGJhclRlc3QsIFNlcGFyYXRvclRlc3QsCisgICAgICAgIFNpemVncmlwVGVzdCwgVHJlZXZpZXdUZXN0LCBXaWRnZXRUZXN0LAogICAgICAgICApCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CmRpZmYgLS1naXQgYS9MaWIvbGliLXRrL3Rlc3Qvd2lkZ2V0X3Rlc3RzLnB5IGIvTGliL2xpYi10ay90ZXN0L3dpZGdldF90ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGIyNDVkCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2xpYi10ay90ZXN0L3dpZGdldF90ZXN0cy5weQpAQCAtMCwwICsxLDU0NyBAQAorIyBDb21tb24gdGVzdHMgZm9yIHRlc3RfdGtpbnRlci90ZXN0X3dpZGdldHMucHkgYW5kIHRlc3RfdHRrL3Rlc3Rfd2lkZ2V0cy5weQorCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKK2ltcG9ydCBUa2ludGVyCitmcm9tIHR0ayBpbXBvcnQgc2V0dXBfbWFzdGVyLCBTY2FsZQorZnJvbSB0ZXN0X3R0ay5zdXBwb3J0IGltcG9ydCAodGNsX3ZlcnNpb24sIHJlcXVpcmVzX3RjbCwgZ2V0X3RrX3BhdGNobGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNfY29udiwgdGNsX29ial9lcSkKK2ltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydAorCisKK25vY29udiA9IG5vY29udl9tZXRoID0gRmFsc2UKK2lmIGdldF90a19wYXRjaGxldmVsKCkgPCAoOCwgNSwgMTEpOgorICAgIG5vY29udiA9IHN0cgorbm9jb252X21ldGggPSBub2NvbnYgYW5kIHN0YXRpY21ldGhvZChub2NvbnYpCisKK2RlZiBpbnRfcm91bmQoeCk6CisgICAgcmV0dXJuIGludChyb3VuZCh4KSkKKworcGl4ZWxzX3JvdW5kID0gaW50X3JvdW5kCitpZiBnZXRfdGtfcGF0Y2hsZXZlbCgpWzozXSA9PSAoOCwgNSwgMTEpOgorICAgICMgSXNzdWUgIzE5MDg1OiBXb3JrYXJvdW5kIGEgYnVnIGluIFRrCisgICAgIyBodHRwOi8vY29yZS50Y2wudGsvdGsvaW5mby8zNDk3ODQ4CisgICAgcGl4ZWxzX3JvdW5kID0gaW50CisKKworX3NlbnRpbmVsID0gb2JqZWN0KCkKKworY2xhc3MgQWJzdHJhY3RXaWRnZXRUZXN0KG9iamVjdCk6CisgICAgX2NvbnZfcGl4ZWxzID0gc3RhdGljbWV0aG9kKHBpeGVsc19yb3VuZCkKKyAgICBfY29udl9wYWRfcGl4ZWxzID0gTm9uZQorICAgIHdhbnRvYmplY3RzID0gVHJ1ZQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnJvb3QgPSBzZXR1cF9tYXN0ZXIoKQorICAgICAgICBzZWxmLnNjYWxpbmcgPSBmbG9hdChzZWxmLnJvb3QuY2FsbCgndGsnLCAnc2NhbGluZycpKQorICAgICAgICBpZiBub3Qgc2VsZi5yb290LndhbnRvYmplY3RzKCk6CisgICAgICAgICAgICBzZWxmLndhbnRvYmplY3RzID0gRmFsc2UKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZm9yIHcgaW4gc2VsZi5yb290LndpbmZvX2NoaWxkcmVuKCk6CisgICAgICAgICAgICB3LmRlc3Ryb3koKQorCisgICAgZGVmIF9zdHIoc2VsZiwgdmFsdWUpOgorICAgICAgICBpZiBzZWxmLndhbnRvYmplY3RzIGFuZCB0Y2xfdmVyc2lvbiA+PSAoOCwgNik6CisgICAgICAgICAgICByZXR1cm4gdmFsdWUKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgdHVwbGUpOgorICAgICAgICAgICAgcmV0dXJuICcgJy5qb2luKG1hcChzZWxmLl9zdHIsIHZhbHVlKSkKKyAgICAgICAgcmV0dXJuIHN0cih2YWx1ZSkKKworICAgIGRlZiBjcmVhdGUoc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLl9jcmVhdGUoKiprd2FyZ3MpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cCh3aWRnZXQuZGVzdHJveSkKKyAgICAgICAgcmV0dXJuIHdpZGdldAorCisgICAgZGVmIGFzc2VydEVxdWFsMihzZWxmLCBhY3R1YWwsIGV4cGVjdGVkLCBtc2c9Tm9uZSwgZXE9b2JqZWN0Ll9fZXFfXyk6CisgICAgICAgIGlmIGVxKGFjdHVhbCwgZXhwZWN0ZWQpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbXNnKQorCisgICAgZGVmIGNoZWNrUGFyYW0oc2VsZiwgd2lkZ2V0LCBuYW1lLCB2YWx1ZSwgZXhwZWN0ZWQ9X3NlbnRpbmVsLAorICAgICAgICAgICAgICAgICAgIGNvbnY9RmFsc2UsIGVxPU5vbmUpOgorICAgICAgICB3aWRnZXRbbmFtZV0gPSB2YWx1ZQorICAgICAgICBpZiBleHBlY3RlZCBpcyBfc2VudGluZWw6CisgICAgICAgICAgICBleHBlY3RlZCA9IHZhbHVlCisgICAgICAgIGlmIGNvbnY6CisgICAgICAgICAgICBleHBlY3RlZCA9IGNvbnYoZXhwZWN0ZWQpCisgICAgICAgIGlmIG5vdCBzZWxmLndhbnRvYmplY3RzOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleHBlY3RlZCwgdHVwbGUpOgorICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gVGtpbnRlci5fam9pbihleHBlY3RlZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBzdHIoZXhwZWN0ZWQpCisgICAgICAgIGlmIGVxIGlzIE5vbmU6CisgICAgICAgICAgICBlcSA9IHRjbF9vYmpfZXEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbDIod2lkZ2V0W25hbWVdLCBleHBlY3RlZCwgZXE9ZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwyKHdpZGdldC5jZ2V0KG5hbWUpLCBleHBlY3RlZCwgZXE9ZXEpCisgICAgICAgICMgWFhYCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHdpZGdldCwgU2NhbGUpOgorICAgICAgICAgICAgdCA9IHdpZGdldC5jb25maWd1cmUobmFtZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHQpLCA1KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbDIodFs0XSwgZXhwZWN0ZWQsIGVxPWVxKQorCisgICAgZGVmIGNoZWNrSW52YWxpZFBhcmFtKHNlbGYsIHdpZGdldCwgbmFtZSwgdmFsdWUsIGVycm1zZz1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwX29yaWc9VHJ1ZSk6CisgICAgICAgIG9yaWcgPSB3aWRnZXRbbmFtZV0KKyAgICAgICAgaWYgZXJybXNnIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZXJybXNnID0gZXJybXNnLmZvcm1hdCh2YWx1ZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yKSBhcyBjbToKKyAgICAgICAgICAgIHdpZGdldFtuYW1lXSA9IHZhbHVlCisgICAgICAgIGlmIGVycm1zZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNtLmV4Y2VwdGlvbiksIGVycm1zZykKKyAgICAgICAgaWYga2VlcF9vcmlnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3aWRnZXRbbmFtZV0sIG9yaWcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3aWRnZXRbbmFtZV0gPSBvcmlnCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvcikgYXMgY206CisgICAgICAgICAgICB3aWRnZXQuY29uZmlndXJlKHtuYW1lOiB2YWx1ZX0pCisgICAgICAgIGlmIGVycm1zZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNtLmV4Y2VwdGlvbiksIGVycm1zZykKKyAgICAgICAgaWYga2VlcF9vcmlnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3aWRnZXRbbmFtZV0sIG9yaWcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3aWRnZXRbbmFtZV0gPSBvcmlnCisKKyAgICBkZWYgY2hlY2tQYXJhbXMoc2VsZiwgd2lkZ2V0LCBuYW1lLCAqdmFsdWVzLCAqKmt3YXJncyk6CisgICAgICAgIGZvciB2YWx1ZSBpbiB2YWx1ZXM6CisgICAgICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCBuYW1lLCB2YWx1ZSwgKiprd2FyZ3MpCisKKyAgICBkZWYgY2hlY2tJbnRlZ2VyUGFyYW0oc2VsZiwgd2lkZ2V0LCBuYW1lLCAqdmFsdWVzLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuY2hlY2tQYXJhbXMod2lkZ2V0LCBuYW1lLCAqdmFsdWVzLCAqKmt3YXJncykKKyAgICAgICAgc2VsZi5jaGVja0ludmFsaWRQYXJhbSh3aWRnZXQsIG5hbWUsICcnLAorICAgICAgICAgICAgICAgIGVycm1zZz0nZXhwZWN0ZWQgaW50ZWdlciBidXQgZ290ICIiJykKKyAgICAgICAgc2VsZi5jaGVja0ludmFsaWRQYXJhbSh3aWRnZXQsIG5hbWUsICcxMHAnLAorICAgICAgICAgICAgICAgIGVycm1zZz0nZXhwZWN0ZWQgaW50ZWdlciBidXQgZ290ICIxMHAiJykKKyAgICAgICAgc2VsZi5jaGVja0ludmFsaWRQYXJhbSh3aWRnZXQsIG5hbWUsIDMuMiwKKyAgICAgICAgICAgICAgICBlcnJtc2c9J2V4cGVjdGVkIGludGVnZXIgYnV0IGdvdCAiMy4yIicpCisKKyAgICBkZWYgY2hlY2tGbG9hdFBhcmFtKHNlbGYsIHdpZGdldCwgbmFtZSwgKnZhbHVlcywgKiprd2FyZ3MpOgorICAgICAgICBpZiAnY29udicgaW4ga3dhcmdzOgorICAgICAgICAgICAgY29udiA9IGt3YXJncy5wb3AoJ2NvbnYnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29udiA9IGZsb2F0CisgICAgICAgIGZvciB2YWx1ZSBpbiB2YWx1ZXM6CisgICAgICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCBuYW1lLCB2YWx1ZSwgY29udj1jb252LCAqKmt3YXJncykKKyAgICAgICAgc2VsZi5jaGVja0ludmFsaWRQYXJhbSh3aWRnZXQsIG5hbWUsICcnLAorICAgICAgICAgICAgICAgIGVycm1zZz0nZXhwZWN0ZWQgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGJ1dCBnb3QgIiInKQorICAgICAgICBzZWxmLmNoZWNrSW52YWxpZFBhcmFtKHdpZGdldCwgbmFtZSwgJ3NwYW0nLAorICAgICAgICAgICAgICAgIGVycm1zZz0nZXhwZWN0ZWQgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGJ1dCBnb3QgInNwYW0iJykKKworICAgIGRlZiBjaGVja0Jvb2xlYW5QYXJhbShzZWxmLCB3aWRnZXQsIG5hbWUpOgorICAgICAgICBmb3IgdmFsdWUgaW4gKEZhbHNlLCAwLCAnZmFsc2UnLCAnbm8nLCAnb2ZmJyk6CisgICAgICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCBuYW1lLCB2YWx1ZSwgZXhwZWN0ZWQ9MCkKKyAgICAgICAgZm9yIHZhbHVlIGluIChUcnVlLCAxLCAndHJ1ZScsICd5ZXMnLCAnb24nKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tQYXJhbSh3aWRnZXQsIG5hbWUsIHZhbHVlLCBleHBlY3RlZD0xKQorICAgICAgICBzZWxmLmNoZWNrSW52YWxpZFBhcmFtKHdpZGdldCwgbmFtZSwgJycsCisgICAgICAgICAgICAgICAgZXJybXNnPSdleHBlY3RlZCBib29sZWFuIHZhbHVlIGJ1dCBnb3QgIiInKQorICAgICAgICBzZWxmLmNoZWNrSW52YWxpZFBhcmFtKHdpZGdldCwgbmFtZSwgJ3NwYW0nLAorICAgICAgICAgICAgICAgIGVycm1zZz0nZXhwZWN0ZWQgYm9vbGVhbiB2YWx1ZSBidXQgZ290ICJzcGFtIicpCisKKyAgICBkZWYgY2hlY2tDb2xvclBhcmFtKHNlbGYsIHdpZGdldCwgbmFtZSwgYWxsb3dfZW1wdHk9Tm9uZSwgKiprd2FyZ3MpOgorICAgICAgICBzZWxmLmNoZWNrUGFyYW1zKHdpZGdldCwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnI2ZmMDAwMCcsICcjMDBmZjAwJywgJyMwMDAwZmYnLCAnIzEyMzQ1NicsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlZCcsICdncmVlbicsICdibHVlJywgJ3doaXRlJywgJ2JsYWNrJywgJ2dyZXknLAorICAgICAgICAgICAgICAgICAgICAgICAgICoqa3dhcmdzKQorICAgICAgICBzZWxmLmNoZWNrSW52YWxpZFBhcmFtKHdpZGdldCwgbmFtZSwgJ3NwYW0nLAorICAgICAgICAgICAgICAgIGVycm1zZz0ndW5rbm93biBjb2xvciBuYW1lICJzcGFtIicpCisKKyAgICBkZWYgY2hlY2tDdXJzb3JQYXJhbShzZWxmLCB3aWRnZXQsIG5hbWUsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtcyh3aWRnZXQsIG5hbWUsICdhcnJvdycsICd3YXRjaCcsICdjcm9zcycsICcnLCoqa3dhcmdzKQorICAgICAgICBpZiB0Y2xfdmVyc2lvbiA+PSAoOCwgNSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCBuYW1lLCAnbm9uZScpCisgICAgICAgIHNlbGYuY2hlY2tJbnZhbGlkUGFyYW0od2lkZ2V0LCBuYW1lLCAnc3BhbScsCisgICAgICAgICAgICAgICAgZXJybXNnPSdiYWQgY3Vyc29yIHNwZWMgInNwYW0iJykKKworICAgIGRlZiBjaGVja0NvbW1hbmRQYXJhbShzZWxmLCB3aWRnZXQsIG5hbWUpOgorICAgICAgICBkZWYgY29tbWFuZCgqYXJncyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHdpZGdldFtuYW1lXSA9IGNvbW1hbmQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdpZGdldFtuYW1lXSkKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtcyh3aWRnZXQsIG5hbWUsICcnKQorCisgICAgZGVmIGNoZWNrRW51bVBhcmFtKHNlbGYsIHdpZGdldCwgbmFtZSwgKnZhbHVlcywgKiprd2FyZ3MpOgorICAgICAgICBpZiAnZXJybXNnJyBpbiBrd2FyZ3M6CisgICAgICAgICAgICBlcnJtc2cgPSBrd2FyZ3MucG9wKCdlcnJtc2cnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZXJybXNnID0gTm9uZQorICAgICAgICBzZWxmLmNoZWNrUGFyYW1zKHdpZGdldCwgbmFtZSwgKnZhbHVlcywgKiprd2FyZ3MpCisgICAgICAgIGlmIGVycm1zZyBpcyBOb25lOgorICAgICAgICAgICAgZXJybXNnMiA9ICcgJXMgInt9IjogbXVzdCBiZSAlcyVzIG9yICVzJyAlICgKKyAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgJywgJy5qb2luKHZhbHVlc1s6LTFdKSwKKyAgICAgICAgICAgICAgICAgICAgJywnIGlmIGxlbih2YWx1ZXMpID4gMiBlbHNlICcnLAorICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbLTFdKQorICAgICAgICAgICAgc2VsZi5jaGVja0ludmFsaWRQYXJhbSh3aWRnZXQsIG5hbWUsICcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJtc2c9J2FtYmlndW91cycgKyBlcnJtc2cyKQorICAgICAgICAgICAgZXJybXNnID0gJ2JhZCcgKyBlcnJtc2cyCisgICAgICAgIHNlbGYuY2hlY2tJbnZhbGlkUGFyYW0od2lkZ2V0LCBuYW1lLCAnc3BhbScsIGVycm1zZz1lcnJtc2cpCisKKyAgICBkZWYgY2hlY2tQaXhlbHNQYXJhbShzZWxmLCB3aWRnZXQsIG5hbWUsICp2YWx1ZXMsICoqa3dhcmdzKToKKyAgICAgICAgaWYgJ2NvbnYnIGluIGt3YXJnczoKKyAgICAgICAgICAgIGNvbnYgPSBrd2FyZ3MucG9wKCdjb252JykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvbnYgPSBOb25lCisgICAgICAgIGlmIGNvbnYgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnYgPSBzZWxmLl9jb252X3BpeGVscworICAgICAgICBpZiAna2VlcF9vcmlnJyBpbiBrd2FyZ3M6CisgICAgICAgICAgICBrZWVwX29yaWcgPSBrd2FyZ3MucG9wKCdrZWVwX29yaWcnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAga2VlcF9vcmlnID0gVHJ1ZQorICAgICAgICBmb3IgdmFsdWUgaW4gdmFsdWVzOgorICAgICAgICAgICAgZXhwZWN0ZWQgPSBfc2VudGluZWwKKyAgICAgICAgICAgIGNvbnYxID0gY29udgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyKToKKyAgICAgICAgICAgICAgICBpZiBjb252MSBhbmQgY29udjEgaXMgbm90IHN0cjoKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBwaXhlbHNfY29udih2YWx1ZSkgKiBzZWxmLnNjYWxpbmcKKyAgICAgICAgICAgICAgICAgICAgY29udjEgPSBpbnRfcm91bmQKKyAgICAgICAgICAgIHNlbGYuY2hlY2tQYXJhbSh3aWRnZXQsIG5hbWUsIHZhbHVlLCBleHBlY3RlZD1leHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252PWNvbnYxLCAqKmt3YXJncykKKyAgICAgICAgc2VsZi5jaGVja0ludmFsaWRQYXJhbSh3aWRnZXQsIG5hbWUsICc2eCcsCisgICAgICAgICAgICAgICAgZXJybXNnPSdiYWQgc2NyZWVuIGRpc3RhbmNlICI2eCInLCBrZWVwX29yaWc9a2VlcF9vcmlnKQorICAgICAgICBzZWxmLmNoZWNrSW52YWxpZFBhcmFtKHdpZGdldCwgbmFtZSwgJ3NwYW0nLAorICAgICAgICAgICAgICAgIGVycm1zZz0nYmFkIHNjcmVlbiBkaXN0YW5jZSAic3BhbSInLCBrZWVwX29yaWc9a2VlcF9vcmlnKQorCisgICAgZGVmIGNoZWNrUmVsaWVmUGFyYW0oc2VsZiwgd2lkZ2V0LCBuYW1lKToKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtcyh3aWRnZXQsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZsYXQnLCAnZ3Jvb3ZlJywgJ3JhaXNlZCcsICdyaWRnZScsICdzb2xpZCcsICdzdW5rZW4nKQorICAgICAgICBlcnJtc2c9J2JhZCByZWxpZWYgInNwYW0iOiBtdXN0IGJlICdcCisgICAgICAgICAgICAgICAnZmxhdCwgZ3Jvb3ZlLCByYWlzZWQsIHJpZGdlLCBzb2xpZCwgb3Igc3Vua2VuJworICAgICAgICBpZiB0Y2xfdmVyc2lvbiA8ICg4LCA2KToKKyAgICAgICAgICAgIGVycm1zZyA9IE5vbmUKKyAgICAgICAgc2VsZi5jaGVja0ludmFsaWRQYXJhbSh3aWRnZXQsIG5hbWUsICdzcGFtJywKKyAgICAgICAgICAgICAgICBlcnJtc2c9ZXJybXNnKQorCisgICAgZGVmIGNoZWNrSW1hZ2VQYXJhbShzZWxmLCB3aWRnZXQsIG5hbWUpOgorICAgICAgICBpbWFnZSA9IFRraW50ZXIuUGhvdG9JbWFnZSgnaW1hZ2UxJykKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgbmFtZSwgaW1hZ2UsIGNvbnY9c3RyKQorICAgICAgICBzZWxmLmNoZWNrSW52YWxpZFBhcmFtKHdpZGdldCwgbmFtZSwgJ3NwYW0nLAorICAgICAgICAgICAgICAgIGVycm1zZz0naW1hZ2UgInNwYW0iIGRvZXNuXCd0IGV4aXN0JykKKyAgICAgICAgd2lkZ2V0W25hbWVdID0gJycKKworICAgIGRlZiBjaGVja1ZhcmlhYmxlUGFyYW0oc2VsZiwgd2lkZ2V0LCBuYW1lLCB2YXIpOgorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCBuYW1lLCB2YXIsIGNvbnY9c3RyKQorCisgICAgZGVmIGFzc2VydElzQm91bmRpbmdCb3goc2VsZiwgYmJveCk6CisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKGJib3gpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShiYm94LCB0dXBsZSkKKyAgICAgICAgaWYgbGVuKGJib3gpICE9IDQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ0ludmFsaWQgYm91bmRpbmcgYm94OiAlcicgJSAoYmJveCwpKQorICAgICAgICBmb3IgaXRlbSBpbiBiYm94OgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaXRlbSwgaW50KToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ0ludmFsaWQgYm91bmRpbmcgYm94OiAlcicgJSAoYmJveCwpKQorICAgICAgICAgICAgICAgIGJyZWFrCisKKworY2xhc3MgU3RhbmRhcmRPcHRpb25zVGVzdHMob2JqZWN0KToKKyAgICBTVEFOREFSRF9PUFRJT05TID0gKAorICAgICAgICAnYWN0aXZlYmFja2dyb3VuZCcsICdhY3RpdmVib3JkZXJ3aWR0aCcsICdhY3RpdmVmb3JlZ3JvdW5kJywgJ2FuY2hvcicsCisgICAgICAgICdiYWNrZ3JvdW5kJywgJ2JpdG1hcCcsICdib3JkZXJ3aWR0aCcsICdjb21wb3VuZCcsICdjdXJzb3InLAorICAgICAgICAnZGlzYWJsZWRmb3JlZ3JvdW5kJywgJ2V4cG9ydHNlbGVjdGlvbicsICdmb250JywgJ2ZvcmVncm91bmQnLAorICAgICAgICAnaGlnaGxpZ2h0YmFja2dyb3VuZCcsICdoaWdobGlnaHRjb2xvcicsICdoaWdobGlnaHR0aGlja25lc3MnLAorICAgICAgICAnaW1hZ2UnLCAnaW5zZXJ0YmFja2dyb3VuZCcsICdpbnNlcnRib3JkZXJ3aWR0aCcsCisgICAgICAgICdpbnNlcnRvZmZ0aW1lJywgJ2luc2VydG9udGltZScsICdpbnNlcnR3aWR0aCcsCisgICAgICAgICdqdW1wJywgJ2p1c3RpZnknLCAnb3JpZW50JywgJ3BhZHgnLCAncGFkeScsICdyZWxpZWYnLAorICAgICAgICAncmVwZWF0ZGVsYXknLCAncmVwZWF0aW50ZXJ2YWwnLAorICAgICAgICAnc2VsZWN0YmFja2dyb3VuZCcsICdzZWxlY3Rib3JkZXJ3aWR0aCcsICdzZWxlY3Rmb3JlZ3JvdW5kJywKKyAgICAgICAgJ3NldGdyaWQnLCAndGFrZWZvY3VzJywgJ3RleHQnLCAndGV4dHZhcmlhYmxlJywgJ3Ryb3VnaGNvbG9yJywKKyAgICAgICAgJ3VuZGVybGluZScsICd3cmFwbGVuZ3RoJywgJ3hzY3JvbGxjb21tYW5kJywgJ3lzY3JvbGxjb21tYW5kJywKKyAgICApCisKKyAgICBkZWYgdGVzdF9hY3RpdmViYWNrZ3JvdW5kKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tDb2xvclBhcmFtKHdpZGdldCwgJ2FjdGl2ZWJhY2tncm91bmQnKQorCisgICAgZGVmIHRlc3RfYWN0aXZlYm9yZGVyd2lkdGgoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja1BpeGVsc1BhcmFtKHdpZGdldCwgJ2FjdGl2ZWJvcmRlcndpZHRoJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEuMywgMi45LCA2LCAtMiwgJzEwcCcpCisKKyAgICBkZWYgdGVzdF9hY3RpdmVmb3JlZ3JvdW5kKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tDb2xvclBhcmFtKHdpZGdldCwgJ2FjdGl2ZWZvcmVncm91bmQnKQorCisgICAgZGVmIHRlc3RfYW5jaG9yKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tFbnVtUGFyYW0od2lkZ2V0LCAnYW5jaG9yJywKKyAgICAgICAgICAgICAgICAnbicsICduZScsICdlJywgJ3NlJywgJ3MnLCAnc3cnLCAndycsICdudycsICdjZW50ZXInKQorCisgICAgZGVmIHRlc3RfYmFja2dyb3VuZChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrQ29sb3JQYXJhbSh3aWRnZXQsICdiYWNrZ3JvdW5kJykKKyAgICAgICAgaWYgJ2JnJyBpbiBzZWxmLk9QVElPTlM6CisgICAgICAgICAgICBzZWxmLmNoZWNrQ29sb3JQYXJhbSh3aWRnZXQsICdiZycpCisKKyAgICBkZWYgdGVzdF9iaXRtYXAoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ2JpdG1hcCcsICdxdWVzdGhlYWQnKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnYml0bWFwJywgJ2dyYXk1MCcpCisgICAgICAgIGZpbGVuYW1lID0gdGVzdC50ZXN0X3N1cHBvcnQuZmluZGZpbGUoJ3B5dGhvbi54Ym0nLCBzdWJkaXI9J2ltZ2hkcmRhdGEnKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnYml0bWFwJywgJ0AnICsgZmlsZW5hbWUpCisgICAgICAgICMgQ29jb2EgVGsgd2lkZ2V0cyBkb24ndCBkZXRlY3QgaW52YWxpZCAtYml0bWFwIHZhbHVlcworICAgICAgICAjIFNlZSBodHRwczovL2NvcmUudGNsLnRrL3RrL2luZm8vMzFjZDMzZGJmMAorICAgICAgICBpZiBub3QgKCdhcXVhJyBpbiBzZWxmLnJvb3QudGsuY2FsbCgndGsnLCAnd2luZG93aW5nc3lzdGVtJykgYW5kCisgICAgICAgICAgICAgICAgJ0FwcEtpdCcgaW4gc2VsZi5yb290LndpbmZvX3NlcnZlcigpKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tJbnZhbGlkUGFyYW0od2lkZ2V0LCAnYml0bWFwJywgJ3NwYW0nLAorICAgICAgICAgICAgICAgICAgICBlcnJtc2c9J2JpdG1hcCAic3BhbSIgbm90IGRlZmluZWQnKQorCisgICAgZGVmIHRlc3RfYm9yZGVyd2lkdGgoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja1BpeGVsc1BhcmFtKHdpZGdldCwgJ2JvcmRlcndpZHRoJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEuMywgMi42LCA2LCAtMiwgJzEwcCcpCisgICAgICAgIGlmICdiZCcgaW4gc2VsZi5PUFRJT05TOgorICAgICAgICAgICAgc2VsZi5jaGVja1BpeGVsc1BhcmFtKHdpZGdldCwgJ2JkJywgMCwgMS4zLCAyLjYsIDYsIC0yLCAnMTBwJykKKworICAgIGRlZiB0ZXN0X2NvbXBvdW5kKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tFbnVtUGFyYW0od2lkZ2V0LCAnY29tcG91bmQnLAorICAgICAgICAgICAgICAgICdib3R0b20nLCAnY2VudGVyJywgJ2xlZnQnLCAnbm9uZScsICdyaWdodCcsICd0b3AnKQorCisgICAgZGVmIHRlc3RfY3Vyc29yKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tDdXJzb3JQYXJhbSh3aWRnZXQsICdjdXJzb3InKQorCisgICAgZGVmIHRlc3RfZGlzYWJsZWRmb3JlZ3JvdW5kKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tDb2xvclBhcmFtKHdpZGdldCwgJ2Rpc2FibGVkZm9yZWdyb3VuZCcpCisKKyAgICBkZWYgdGVzdF9leHBvcnRzZWxlY3Rpb24oc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja0Jvb2xlYW5QYXJhbSh3aWRnZXQsICdleHBvcnRzZWxlY3Rpb24nKQorCisgICAgZGVmIHRlc3RfZm9udChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAnZm9udCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnLUFkb2JlLUhlbHZldGljYS1NZWRpdW0tUi1Ob3JtYWwtLSotMTIwLSotKi0qLSotKi0qJykKKyAgICAgICAgc2VsZi5jaGVja0ludmFsaWRQYXJhbSh3aWRnZXQsICdmb250JywgJycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybXNnPSdmb250ICIiIGRvZXNuXCd0IGV4aXN0JykKKworICAgIGRlZiB0ZXN0X2ZvcmVncm91bmQoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja0NvbG9yUGFyYW0od2lkZ2V0LCAnZm9yZWdyb3VuZCcpCisgICAgICAgIGlmICdmZycgaW4gc2VsZi5PUFRJT05TOgorICAgICAgICAgICAgc2VsZi5jaGVja0NvbG9yUGFyYW0od2lkZ2V0LCAnZmcnKQorCisgICAgZGVmIHRlc3RfaGlnaGxpZ2h0YmFja2dyb3VuZChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrQ29sb3JQYXJhbSh3aWRnZXQsICdoaWdobGlnaHRiYWNrZ3JvdW5kJykKKworICAgIGRlZiB0ZXN0X2hpZ2hsaWdodGNvbG9yKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tDb2xvclBhcmFtKHdpZGdldCwgJ2hpZ2hsaWdodGNvbG9yJykKKworICAgIGRlZiB0ZXN0X2hpZ2hsaWdodHRoaWNrbmVzcyhzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGl4ZWxzUGFyYW0od2lkZ2V0LCAnaGlnaGxpZ2h0dGhpY2tuZXNzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEuMywgMi42LCA2LCAnMTBwJykKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtKHdpZGdldCwgJ2hpZ2hsaWdodHRoaWNrbmVzcycsIC0yLCBleHBlY3RlZD0wLAorICAgICAgICAgICAgICAgICAgICAgICAgY29udj1zZWxmLl9jb252X3BpeGVscykKKworICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nLAorICAgICAgICAgICAgICAgICAgICAgJ2NyYXNoZXMgd2l0aCBDb2NvYSBUayAoaXNzdWUxOTczMyknKQorICAgIGRlZiB0ZXN0X2ltYWdlKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tJbWFnZVBhcmFtKHdpZGdldCwgJ2ltYWdlJykKKworICAgIGRlZiB0ZXN0X2luc2VydGJhY2tncm91bmQoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja0NvbG9yUGFyYW0od2lkZ2V0LCAnaW5zZXJ0YmFja2dyb3VuZCcpCisKKyAgICBkZWYgdGVzdF9pbnNlcnRib3JkZXJ3aWR0aChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGl4ZWxzUGFyYW0od2lkZ2V0LCAnaW5zZXJ0Ym9yZGVyd2lkdGgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMS4zLCAyLjYsIDYsIC0yLCAnMTBwJykKKworICAgIGRlZiB0ZXN0X2luc2VydG9mZnRpbWUoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja0ludGVnZXJQYXJhbSh3aWRnZXQsICdpbnNlcnRvZmZ0aW1lJywgMTAwKQorCisgICAgZGVmIHRlc3RfaW5zZXJ0b250aW1lKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tJbnRlZ2VyUGFyYW0od2lkZ2V0LCAnaW5zZXJ0b250aW1lJywgMTAwKQorCisgICAgZGVmIHRlc3RfaW5zZXJ0d2lkdGgoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja1BpeGVsc1BhcmFtKHdpZGdldCwgJ2luc2VydHdpZHRoJywgMS4zLCAyLjYsIC0yLCAnMTBwJykKKworICAgIGRlZiB0ZXN0X2p1bXAoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja0Jvb2xlYW5QYXJhbSh3aWRnZXQsICdqdW1wJykKKworICAgIGRlZiB0ZXN0X2p1c3RpZnkoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja0VudW1QYXJhbSh3aWRnZXQsICdqdXN0aWZ5JywgJ2xlZnQnLCAncmlnaHQnLCAnY2VudGVyJywKKyAgICAgICAgICAgICAgICBlcnJtc2c9J2JhZCBqdXN0aWZpY2F0aW9uICJ7fSI6IG11c3QgYmUgJworICAgICAgICAgICAgICAgICAgICAgICAnbGVmdCwgcmlnaHQsIG9yIGNlbnRlcicpCisgICAgICAgIHNlbGYuY2hlY2tJbnZhbGlkUGFyYW0od2lkZ2V0LCAnanVzdGlmeScsICcnLAorICAgICAgICAgICAgICAgIGVycm1zZz0nYW1iaWd1b3VzIGp1c3RpZmljYXRpb24gIiI6IG11c3QgYmUgJworICAgICAgICAgICAgICAgICAgICAgICAnbGVmdCwgcmlnaHQsIG9yIGNlbnRlcicpCisKKyAgICBkZWYgdGVzdF9vcmllbnQoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIod2lkZ2V0WydvcmllbnQnXSksIHNlbGYuZGVmYXVsdF9vcmllbnQpCisgICAgICAgIHNlbGYuY2hlY2tFbnVtUGFyYW0od2lkZ2V0LCAnb3JpZW50JywgJ2hvcml6b250YWwnLCAndmVydGljYWwnKQorCisgICAgZGVmIHRlc3RfcGFkeChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGl4ZWxzUGFyYW0od2lkZ2V0LCAncGFkeCcsIDMsIDQuNCwgNS42LCAtMiwgJzEybScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252PXNlbGYuX2NvbnZfcGFkX3BpeGVscykKKworICAgIGRlZiB0ZXN0X3BhZHkoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja1BpeGVsc1BhcmFtKHdpZGdldCwgJ3BhZHknLCAzLCA0LjQsIDUuNiwgLTIsICcxMm0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udj1zZWxmLl9jb252X3BhZF9waXhlbHMpCisKKyAgICBkZWYgdGVzdF9yZWxpZWYoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja1JlbGllZlBhcmFtKHdpZGdldCwgJ3JlbGllZicpCisKKyAgICBkZWYgdGVzdF9yZXBlYXRkZWxheShzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrSW50ZWdlclBhcmFtKHdpZGdldCwgJ3JlcGVhdGRlbGF5JywgLTUwMCwgNTAwKQorCisgICAgZGVmIHRlc3RfcmVwZWF0aW50ZXJ2YWwoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja0ludGVnZXJQYXJhbSh3aWRnZXQsICdyZXBlYXRpbnRlcnZhbCcsIC01MDAsIDUwMCkKKworICAgIGRlZiB0ZXN0X3NlbGVjdGJhY2tncm91bmQoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja0NvbG9yUGFyYW0od2lkZ2V0LCAnc2VsZWN0YmFja2dyb3VuZCcpCisKKyAgICBkZWYgdGVzdF9zZWxlY3Rib3JkZXJ3aWR0aChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGl4ZWxzUGFyYW0od2lkZ2V0LCAnc2VsZWN0Ym9yZGVyd2lkdGgnLCAxLjMsIDIuNiwgLTIsICcxMHAnKQorCisgICAgZGVmIHRlc3Rfc2VsZWN0Zm9yZWdyb3VuZChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrQ29sb3JQYXJhbSh3aWRnZXQsICdzZWxlY3Rmb3JlZ3JvdW5kJykKKworICAgIGRlZiB0ZXN0X3NldGdyaWQoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja0Jvb2xlYW5QYXJhbSh3aWRnZXQsICdzZXRncmlkJykKKworICAgIGRlZiB0ZXN0X3N0YXRlKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tFbnVtUGFyYW0od2lkZ2V0LCAnc3RhdGUnLCAnYWN0aXZlJywgJ2Rpc2FibGVkJywgJ25vcm1hbCcpCisKKyAgICBkZWYgdGVzdF90YWtlZm9jdXMoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja1BhcmFtcyh3aWRnZXQsICd0YWtlZm9jdXMnLCAnMCcsICcxJywgJycpCisKKyAgICBkZWYgdGVzdF90ZXh0KHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tQYXJhbXMod2lkZ2V0LCAndGV4dCcsICcnLCAnYW55IHN0cmluZycpCisKKyAgICBkZWYgdGVzdF90ZXh0dmFyaWFibGUoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgdmFyID0gVGtpbnRlci5TdHJpbmdWYXIoKQorICAgICAgICBzZWxmLmNoZWNrVmFyaWFibGVQYXJhbSh3aWRnZXQsICd0ZXh0dmFyaWFibGUnLCB2YXIpCisKKyAgICBkZWYgdGVzdF90cm91Z2hjb2xvcihzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrQ29sb3JQYXJhbSh3aWRnZXQsICd0cm91Z2hjb2xvcicpCisKKyAgICBkZWYgdGVzdF91bmRlcmxpbmUoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja0ludGVnZXJQYXJhbSh3aWRnZXQsICd1bmRlcmxpbmUnLCAwLCAxLCAxMCkKKworICAgIGRlZiB0ZXN0X3dyYXBsZW5ndGgoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja1BpeGVsc1BhcmFtKHdpZGdldCwgJ3dyYXBsZW5ndGgnLCAxMDApCisKKyAgICBkZWYgdGVzdF94c2Nyb2xsY29tbWFuZChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrQ29tbWFuZFBhcmFtKHdpZGdldCwgJ3hzY3JvbGxjb21tYW5kJykKKworICAgIGRlZiB0ZXN0X3lzY3JvbGxjb21tYW5kKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tDb21tYW5kUGFyYW0od2lkZ2V0LCAneXNjcm9sbGNvbW1hbmQnKQorCisgICAgIyBub24tc3RhbmRhcmQgYnV0IGNvbW1vbiBvcHRpb25zCisKKyAgICBkZWYgdGVzdF9jb21tYW5kKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tDb21tYW5kUGFyYW0od2lkZ2V0LCAnY29tbWFuZCcpCisKKyAgICBkZWYgdGVzdF9pbmRpY2F0b3JvbihzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrQm9vbGVhblBhcmFtKHdpZGdldCwgJ2luZGljYXRvcm9uJykKKworICAgIGRlZiB0ZXN0X29mZnJlbGllZihzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUmVsaWVmUGFyYW0od2lkZ2V0LCAnb2ZmcmVsaWVmJykKKworICAgIGRlZiB0ZXN0X292ZXJyZWxpZWYoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja1JlbGllZlBhcmFtKHdpZGdldCwgJ292ZXJyZWxpZWYnKQorCisgICAgZGVmIHRlc3Rfc2VsZWN0Y29sb3Ioc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja0NvbG9yUGFyYW0od2lkZ2V0LCAnc2VsZWN0Y29sb3InKQorCisgICAgZGVmIHRlc3Rfc2VsZWN0aW1hZ2Uoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja0ltYWdlUGFyYW0od2lkZ2V0LCAnc2VsZWN0aW1hZ2UnKQorCisgICAgQHJlcXVpcmVzX3RjbCg4LCA1KQorICAgIGRlZiB0ZXN0X3RyaXN0YXRlaW1hZ2Uoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja0ltYWdlUGFyYW0od2lkZ2V0LCAndHJpc3RhdGVpbWFnZScpCisKKyAgICBAcmVxdWlyZXNfdGNsKDgsIDUpCisgICAgZGVmIHRlc3RfdHJpc3RhdGV2YWx1ZShzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrUGFyYW0od2lkZ2V0LCAndHJpc3RhdGV2YWx1ZScsICd1bmtub3dhYmxlJykKKworICAgIGRlZiB0ZXN0X3ZhcmlhYmxlKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHZhciA9IFRraW50ZXIuRG91YmxlVmFyKCkKKyAgICAgICAgc2VsZi5jaGVja1ZhcmlhYmxlUGFyYW0od2lkZ2V0LCAndmFyaWFibGUnLCB2YXIpCisKKworY2xhc3MgSW50ZWdlclNpemVUZXN0cyhvYmplY3QpOgorICAgIGRlZiB0ZXN0X2hlaWdodChzZWxmKToKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQorICAgICAgICBzZWxmLmNoZWNrSW50ZWdlclBhcmFtKHdpZGdldCwgJ2hlaWdodCcsIDEwMCwgLTEwMCwgMCkKKworICAgIGRlZiB0ZXN0X3dpZHRoKHNlbGYpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCisgICAgICAgIHNlbGYuY2hlY2tJbnRlZ2VyUGFyYW0od2lkZ2V0LCAnd2lkdGgnLCA0MDIsIC00MDIsIDApCisKKworY2xhc3MgUGl4ZWxTaXplVGVzdHMob2JqZWN0KToKKyAgICBkZWYgdGVzdF9oZWlnaHQoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja1BpeGVsc1BhcmFtKHdpZGdldCwgJ2hlaWdodCcsIDEwMCwgMTAxLjIsIDEwMi42LCAtMTAwLCAwLCAnM2MnKQorCisgICAgZGVmIHRlc3Rfd2lkdGgoc2VsZik6CisgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja1BpeGVsc1BhcmFtKHdpZGdldCwgJ3dpZHRoJywgNDAyLCA0MDMuNCwgNDA0LjYsIC00MDIsIDAsICc1aScpCisKKworZGVmIGFkZF9zdGFuZGFyZF9vcHRpb25zKCpzb3VyY2VfY2xhc3Nlcyk6CisgICAgIyBUaGlzIGRlY29yYXRvciBhZGRzIHRlc3RfeHh4IG1ldGhvZHMgZnJvbSBzb3VyY2UgY2xhc3NlcyBmb3IgZXZlcnkgeHh4CisgICAgIyBvcHRpb24gaW4gdGhlIE9QVElPTlMgY2xhc3MgYXR0cmlidXRlIGlmIHRoZXkgYXJlIG5vdCBkZWZpbmVkIGV4cGxpY2l0bHkuCisgICAgZGVmIGRlY29yYXRvcihjbHMpOgorICAgICAgICBmb3Igb3B0aW9uIGluIGNscy5PUFRJT05TOgorICAgICAgICAgICAgbWV0aG9kbmFtZSA9ICd0ZXN0XycgKyBvcHRpb24KKyAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRyKGNscywgbWV0aG9kbmFtZSk6CisgICAgICAgICAgICAgICAgZm9yIHNvdXJjZV9jbGFzcyBpbiBzb3VyY2VfY2xhc3NlczoKKyAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihzb3VyY2VfY2xhc3MsIG1ldGhvZG5hbWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihjbHMsIG1ldGhvZG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGF0dHIoc291cmNlX2NsYXNzLCBtZXRob2RuYW1lKS5pbV9mdW5jKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBkZWYgdGVzdChzZWxmLCBvcHRpb249b3B0aW9uKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZGdldFtvcHRpb25dCisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcignT3B0aW9uICIlcyIgaXMgbm90IHRlc3RlZCBpbiAlcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvbiwgY2xzLl9fbmFtZV9fKSkKKyAgICAgICAgICAgICAgICAgICAgdGVzdC5fX25hbWVfXyA9IG1ldGhvZG5hbWUKKyAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihjbHMsIG1ldGhvZG5hbWUsIHRlc3QpCisgICAgICAgIHJldHVybiBjbHMKKyAgICByZXR1cm4gZGVjb3JhdG9yCisKK2RlZiBzZXRVcE1vZHVsZSgpOgorICAgIGlmIHRlc3QudGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgIHRjbCA9IFRraW50ZXIuVGNsKCkKKyAgICAgICAgcHJpbnQgJ3BhdGNobGV2ZWwgPScsIHRjbC5jYWxsKCdpbmZvJywgJ3BhdGNobGV2ZWwnKQpkaWZmIC0tZ2l0IGEvTGliL2xpYi10ay90a0ZvbnQucHkgYi9MaWIvbGliLXRrL3RrRm9udC5weQppbmRleCAyMjlmMjUxLi5kZmRlZTQyIDEwMDY0NAotLS0gYS9MaWIvbGliLXRrL3RrRm9udC5weQorKysgYi9MaWIvbGliLXRrL3RrRm9udC5weQpAQCAtNzgsNyArNzgsOCBAQAogICAgICAgICBpZiBleGlzdHM6CiAgICAgICAgICAgICBzZWxmLmRlbGV0ZV9mb250ID0gRmFsc2UKICAgICAgICAgICAgICMgY29uZmlybSBmb250IGV4aXN0cwotICAgICAgICAgICAgaWYgc2VsZi5uYW1lIG5vdCBpbiByb290LnRrLmNhbGwoImZvbnQiLCAibmFtZXMiKToKKyAgICAgICAgICAgIGlmIHNlbGYubmFtZSBub3QgaW4gcm9vdC50ay5zcGxpdGxpc3QoCisgICAgICAgICAgICAgICAgICAgIHJvb3QudGsuY2FsbCgiZm9udCIsICJuYW1lcyIpKToKICAgICAgICAgICAgICAgICByYWlzZSBUa2ludGVyLl90a2ludGVyLlRjbEVycm9yLCAibmFtZWQgZm9udCAlcyBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IiAlIChzZWxmLm5hbWUsKQogICAgICAgICAgICAgIyBpZiBmb250IGNvbmZpZyBpbmZvIHN1cHBsaWVkLCBhcHBseSBpdAogICAgICAgICAgICAgaWYgZm9udDoKQEAgLTk2LDcgKzk3LDcgQEAKICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQogCiAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgIHJldHVybiBzZWxmLm5hbWUgPT0gb3RoZXIubmFtZSBhbmQgaXNpbnN0YW5jZShvdGhlciwgRm9udCkKKyAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uob3RoZXIsIEZvbnQpIGFuZCBzZWxmLm5hbWUgPT0gb3RoZXIubmFtZQogCiAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgIHJldHVybiBzZWxmLmNnZXQoa2V5KQpkaWZmIC0tZ2l0IGEvTGliL2xpYi10ay90a1NpbXBsZURpYWxvZy5weSBiL0xpYi9saWItdGsvdGtTaW1wbGVEaWFsb2cucHkKaW5kZXggMjQzODhhNS4uMDIzNDc1ZCAxMDA2NDQKLS0tIGEvTGliL2xpYi10ay90a1NpbXBsZURpYWxvZy5weQorKysgYi9MaWIvbGliLXRrL3RrU2ltcGxlRGlhbG9nLnB5CkBAIC0yMDAsNyArMjAwLDcgQEAKICAgICAgICAgc2VsZi5lbnRyeSA9IEVudHJ5KG1hc3RlciwgbmFtZT0iZW50cnkiKQogICAgICAgICBzZWxmLmVudHJ5LmdyaWQocm93PTEsIHBhZHg9NSwgc3RpY2t5PVcrRSkKIAotICAgICAgICBpZiBzZWxmLmluaXRpYWx2YWx1ZToKKyAgICAgICAgaWYgc2VsZi5pbml0aWFsdmFsdWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICBzZWxmLmVudHJ5Lmluc2VydCgwLCBzZWxmLmluaXRpYWx2YWx1ZSkKICAgICAgICAgICAgIHNlbGYuZW50cnkuc2VsZWN0X3JhbmdlKDAsIEVORCkKIApkaWZmIC0tZ2l0IGEvTGliL2xpYi10ay90dGsucHkgYi9MaWIvbGliLXRrL3R0ay5weQppbmRleCAyZmQ1MTNhLi43N2YxZDNhIDEwMDY0NAotLS0gYS9MaWIvbGliLXRrL3R0ay5weQorKysgYi9MaWIvbGliLXRrL3R0ay5weQpAQCAtMjYsOCArMjYsNyBAQAogICAgICAgICAgICAidGNsb2Jqc190b19weSIsICJzZXR1cF9tYXN0ZXIiXQogCiBpbXBvcnQgVGtpbnRlcgotCi1fZmxhdHRlbiA9IFRraW50ZXIuX2ZsYXR0ZW4KK2Zyb20gVGtpbnRlciBpbXBvcnQgX2ZsYXR0ZW4sIF9qb2luLCBfc3RyaW5naWZ5CiAKICMgVmVyaWZ5IGlmIFRrIGlzIG5ldyBlbm91Z2ggdG8gbm90IG5lZWQgdGhlIFRpbGUgcGFja2FnZQogX1JFUVVJUkVfVElMRSA9IFRydWUgaWYgVGtpbnRlci5Ua1ZlcnNpb24gPCA4LjUgZWxzZSBGYWxzZQpAQCAtNDcsNDAgKzQ2LDU3IEBACiAgICAgICAgIG1hc3Rlci50ay5ldmFsKCdwYWNrYWdlIHJlcXVpcmUgdGlsZScpICMgVGNsRXJyb3IgbWF5IGJlIHJhaXNlZCBoZXJlCiAgICAgICAgIG1hc3Rlci5fdGlsZV9sb2FkZWQgPSBUcnVlCiAKK2RlZiBfZm9ybWF0X29wdHZhbHVlKHZhbHVlLCBzY3JpcHQ9RmFsc2UpOgorICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiIiIgorICAgIGlmIHNjcmlwdDoKKyAgICAgICAgIyBpZiBjYWxsZXIgcGFzc2VzIGEgVGNsIHNjcmlwdCB0byB0ay5jYWxsLCBhbGwgdGhlIHZhbHVlcyBuZWVkIHRvCisgICAgICAgICMgYmUgZ3JvdXBlZCBpbnRvIHdvcmRzIChhcmd1bWVudHMgdG8gYSBjb21tYW5kIGluIFRjbCBkaWFsZWN0KQorICAgICAgICB2YWx1ZSA9IF9zdHJpbmdpZnkodmFsdWUpCisgICAgZWxpZiBpc2luc3RhbmNlKHZhbHVlLCAobGlzdCwgdHVwbGUpKToKKyAgICAgICAgdmFsdWUgPSBfam9pbih2YWx1ZSkKKyAgICByZXR1cm4gdmFsdWUKKwogZGVmIF9mb3JtYXRfb3B0ZGljdChvcHRkaWN0LCBzY3JpcHQ9RmFsc2UsIGlnbm9yZT1Ob25lKToKICAgICAiIiJGb3JtYXRzIG9wdGRpY3QgdG8gYSB0dXBsZSB0byBwYXNzIGl0IHRvIHRrLmNhbGwuCiAKICAgICBFLmcuIChzY3JpcHQ9RmFsc2UpOgogICAgICAgeydmb3JlZ3JvdW5kJzogJ2JsdWUnLCAncGFkZGluZyc6IFsxLCAyLCAzLCA0XX0gcmV0dXJuczoKICAgICAgICgnLWZvcmVncm91bmQnLCAnYmx1ZScsICctcGFkZGluZycsICcxIDIgMyA0JykiIiIKLSAgICBmb3JtYXQgPSAiJXMiIGlmIG5vdCBzY3JpcHQgZWxzZSAieyVzfSIKIAogICAgIG9wdHMgPSBbXQogICAgIGZvciBvcHQsIHZhbHVlIGluIG9wdGRpY3QuaXRlcml0ZW1zKCk6Ci0gICAgICAgIGlmIGlnbm9yZSBhbmQgb3B0IGluIGlnbm9yZToKLSAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIG5vdCBpZ25vcmUgb3Igb3B0IG5vdCBpbiBpZ25vcmU6CisgICAgICAgICAgICBvcHRzLmFwcGVuZCgiLSVzIiAlIG9wdCkKKyAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIG9wdHMuYXBwZW5kKF9mb3JtYXRfb3B0dmFsdWUodmFsdWUsIHNjcmlwdCkpCiAKLSAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgKGxpc3QsIHR1cGxlKSk6Ci0gICAgICAgICAgICB2ID0gW10KLSAgICAgICAgICAgIGZvciB2YWwgaW4gdmFsdWU6Ci0gICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWwsIGJhc2VzdHJpbmcpOgotICAgICAgICAgICAgICAgICAgICB2LmFwcGVuZCh1bmljb2RlKHZhbCkgaWYgdmFsIGVsc2UgJ3t9JykKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICB2LmFwcGVuZChzdHIodmFsKSkKLQotICAgICAgICAgICAgIyBmb3JtYXQgdiBhY2NvcmRpbmcgdG8gdGhlIHNjcmlwdCBvcHRpb24sIGJ1dCBhbHNvIGNoZWNrIGZvcgotICAgICAgICAgICAgIyBzcGFjZSBpbiBhbnkgdmFsdWUgaW4gdiBpbiBvcmRlciB0byBncm91cCB0aGVtIGNvcnJlY3RseQotICAgICAgICAgICAgdmFsdWUgPSBmb3JtYXQgJSAnICcuam9pbigKLSAgICAgICAgICAgICAgICAoJ3slc30nIGlmICcgJyBpbiB2YWwgZWxzZSAnJXMnKSAlIHZhbCBmb3IgdmFsIGluIHYpCi0KLSAgICAgICAgaWYgc2NyaXB0IGFuZCB2YWx1ZSA9PSAnJzoKLSAgICAgICAgICAgIHZhbHVlID0gJ3t9JyAjIGVtcHR5IHN0cmluZyBpbiBQeXRob24gaXMgZXF1aXZhbGVudCB0byB7fSBpbiBUY2wKLQotICAgICAgICBvcHRzLmFwcGVuZCgoIi0lcyIgJSBvcHQsIHZhbHVlKSkKLQotICAgICMgUmVtZW1iZXI6IF9mbGF0dGVuIHNraXBzIG92ZXIgTm9uZQogICAgIHJldHVybiBfZmxhdHRlbihvcHRzKQogCitkZWYgX21hcGRpY3RfdmFsdWVzKGl0ZW1zKToKKyAgICAjIGVhY2ggdmFsdWUgaW4gbWFwZGljdCBpcyBleHBlY3RlZCB0byBiZSBhIHNlcXVlbmNlLCB3aGVyZSBlYWNoIGl0ZW0KKyAgICAjIGlzIGFub3RoZXIgc2VxdWVuY2UgY29udGFpbmluZyBhIHN0YXRlIChvciBzZXZlcmFsKSBhbmQgYSB2YWx1ZQorICAgICMgRS5nLiAoc2NyaXB0PUZhbHNlKToKKyAgICAjICAgWygnYWN0aXZlJywgJ3NlbGVjdGVkJywgJ2dyZXknKSwgKCdmb2N1cycsIFsxLCAyLCAzLCA0XSldCisgICAgIyAgIHJldHVybnM6CisgICAgIyAgIFsnYWN0aXZlIHNlbGVjdGVkJywgJ2dyZXknLCAnZm9jdXMnLCBbMSwgMiwgMywgNF1dCisgICAgb3B0X3ZhbCA9IFtdCisgICAgZm9yIGl0ZW0gaW4gaXRlbXM6CisgICAgICAgIHN0YXRlID0gaXRlbVs6LTFdCisgICAgICAgIHZhbCA9IGl0ZW1bLTFdCisgICAgICAgICMgaGFja3MgZm9yIGJha3dhcmQgY29tcGF0aWJpbGl0eQorICAgICAgICBzdGF0ZVswXSAjIHJhaXNlIEluZGV4RXJyb3IgaWYgZW1wdHkKKyAgICAgICAgaWYgbGVuKHN0YXRlKSA9PSAxOgorICAgICAgICAgICAgIyBpZiBpdCBpcyBlbXB0eSAoc29tZXRoaW5nIHRoYXQgZXZhbHVhdGVzIHRvIEZhbHNlKSwgdGhlbgorICAgICAgICAgICAgIyBmb3JtYXQgaXQgdG8gVGNsIGNvZGUgdG8gZGVub3RlIHRoZSAibm9ybWFsIiBzdGF0ZQorICAgICAgICAgICAgc3RhdGUgPSBzdGF0ZVswXSBvciAnJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBncm91cCBtdWx0aXBsZSBzdGF0ZXMKKyAgICAgICAgICAgIHN0YXRlID0gJyAnLmpvaW4oc3RhdGUpICMgcmFpc2UgVHlwZUVycm9yIGlmIG5vdCBzdHIKKyAgICAgICAgb3B0X3ZhbC5hcHBlbmQoc3RhdGUpCisgICAgICAgIGlmIHZhbCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG9wdF92YWwuYXBwZW5kKHZhbCkKKyAgICByZXR1cm4gb3B0X3ZhbAorCiBkZWYgX2Zvcm1hdF9tYXBkaWN0KG1hcGRpY3QsIHNjcmlwdD1GYWxzZSk6CiAgICAgIiIiRm9ybWF0cyBtYXBkaWN0IHRvIHBhc3MgaXQgdG8gdGsuY2FsbC4KIApAQCAtOTAsMzIgKzEwNiwxMSBAQAogICAgICAgcmV0dXJuczoKIAogICAgICAgKCctZXhwYW5kJywgJ3thY3RpdmUgc2VsZWN0ZWR9IGdyZXkgZm9jdXMgezEsIDIsIDMsIDR9JykiIiIKLSAgICAjIGlmIGNhbGxlciBwYXNzZXMgYSBUY2wgc2NyaXB0IHRvIHRrLmNhbGwsIGFsbCB0aGUgdmFsdWVzIG5lZWQgdG8KLSAgICAjIGJlIGdyb3VwZWQgaW50byB3b3JkcyAoYXJndW1lbnRzIHRvIGEgY29tbWFuZCBpbiBUY2wgZGlhbGVjdCkKLSAgICBmb3JtYXQgPSAiJXMiIGlmIG5vdCBzY3JpcHQgZWxzZSAieyVzfSIKIAogICAgIG9wdHMgPSBbXQogICAgIGZvciBvcHQsIHZhbHVlIGluIG1hcGRpY3QuaXRlcml0ZW1zKCk6Ci0KLSAgICAgICAgb3B0X3ZhbCA9IFtdCi0gICAgICAgICMgZWFjaCB2YWx1ZSBpbiBtYXBkaWN0IGlzIGV4cGVjdGVkIHRvIGJlIGEgc2VxdWVuY2UsIHdoZXJlIGVhY2ggaXRlbQotICAgICAgICAjIGlzIGFub3RoZXIgc2VxdWVuY2UgY29udGFpbmluZyBhIHN0YXRlIChvciBzZXZlcmFsKSBhbmQgYSB2YWx1ZQotICAgICAgICBmb3Igc3RhdGVzcGVjIGluIHZhbHVlOgotICAgICAgICAgICAgc3RhdGUsIHZhbCA9IHN0YXRlc3BlY1s6LTFdLCBzdGF0ZXNwZWNbLTFdCi0KLSAgICAgICAgICAgIGlmIGxlbihzdGF0ZSkgPiAxOiAjIGdyb3VwIG11bHRpcGxlIHN0YXRlcwotICAgICAgICAgICAgICAgIHN0YXRlID0gInslc30iICUgJyAnLmpvaW4oc3RhdGUpCi0gICAgICAgICAgICBlbHNlOiAjIHNpbmdsZSBzdGF0ZQotICAgICAgICAgICAgICAgICMgaWYgaXQgaXMgZW1wdHkgKHNvbWV0aGluZyB0aGF0IGV2YWx1YXRlcyB0byBGYWxzZSksIHRoZW4KLSAgICAgICAgICAgICAgICAjIGZvcm1hdCBpdCB0byBUY2wgY29kZSB0byBkZW5vdGUgdGhlICJub3JtYWwiIHN0YXRlCi0gICAgICAgICAgICAgICAgc3RhdGUgPSBzdGF0ZVswXSBvciAne30nCi0KLSAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsLCAobGlzdCwgdHVwbGUpKTogIyB2YWwgbmVlZHMgdG8gYmUgZ3JvdXBlZAotICAgICAgICAgICAgICAgIHZhbCA9ICJ7JXN9IiAlICcgJy5qb2luKG1hcChzdHIsIHZhbCkpCi0KLSAgICAgICAgICAgIG9wdF92YWwuYXBwZW5kKCIlcyAlcyIgJSAoc3RhdGUsIHZhbCkpCi0KLSAgICAgICAgb3B0cy5hcHBlbmQoKCItJXMiICUgb3B0LCBmb3JtYXQgJSAnICcuam9pbihvcHRfdmFsKSkpCisgICAgICAgIG9wdHMuZXh0ZW5kKCgiLSVzIiAlIG9wdCwKKyAgICAgICAgICAgICAgICAgICAgIF9mb3JtYXRfb3B0dmFsdWUoX21hcGRpY3RfdmFsdWVzKHZhbHVlKSwgc2NyaXB0KSkpCiAKICAgICByZXR1cm4gX2ZsYXR0ZW4ob3B0cykKIApAQCAtMTI5LDcgKzEyNCw3IEBACiAgICAgICAgICAgICBpbmFtZSA9IGFyZ3NbMF0KICAgICAgICAgICAgICMgbmV4dCBhcmdzLCBpZiBhbnksIGFyZSBzdGF0ZXNwZWMvdmFsdWUgcGFpcnMgd2hpY2ggaXMgYWxtb3N0CiAgICAgICAgICAgICAjIGEgbWFwZGljdCwgYnV0IHdlIGp1c3QgbmVlZCB0aGUgdmFsdWUKLSAgICAgICAgICAgIGltYWdlc3BlYyA9IF9mb3JtYXRfbWFwZGljdCh7Tm9uZTogYXJnc1sxOl19KVsxXQorICAgICAgICAgICAgaW1hZ2VzcGVjID0gX2pvaW4oX21hcGRpY3RfdmFsdWVzKGFyZ3NbMTpdKSkKICAgICAgICAgICAgIHNwZWMgPSAiJXMgJXMiICUgKGluYW1lLCBpbWFnZXNwZWMpCiAKICAgICAgICAgZWxzZToKQEAgLTEzOCw3ICsxMzMsNyBAQAogICAgICAgICAgICAgIyB0aGVtZWQgc3R5bGVzIG9uIFdpbmRvd3MgWFAgYW5kIFZpc3RhLgogICAgICAgICAgICAgIyBBdmFpbGFiaWxpdHk6IFRrIDguNiwgV2luZG93cyBYUCBhbmQgVmlzdGEuCiAgICAgICAgICAgICBjbGFzc19uYW1lLCBwYXJ0X2lkID0gYXJnc1s6Ml0KLSAgICAgICAgICAgIHN0YXRlbWFwID0gX2Zvcm1hdF9tYXBkaWN0KHtOb25lOiBhcmdzWzI6XX0pWzFdCisgICAgICAgICAgICBzdGF0ZW1hcCA9IF9qb2luKF9tYXBkaWN0X3ZhbHVlcyhhcmdzWzI6XSkpCiAgICAgICAgICAgICBzcGVjID0gIiVzICVzICVzIiAlIChjbGFzc19uYW1lLCBwYXJ0X2lkLCBzdGF0ZW1hcCkKIAogICAgICAgICBvcHRzID0gX2Zvcm1hdF9vcHRkaWN0KGt3LCBzY3JpcHQpCkBAIC0xNDgsMTEgKzE0MywxMSBAQAogICAgICAgICAjIG90aGVyd2lzZSBpdCB3aWxsIGNsb25lIHt9IChlbXB0eSBlbGVtZW50KQogICAgICAgICBzcGVjID0gYXJnc1swXSAjIHRoZW1lIG5hbWUKICAgICAgICAgaWYgbGVuKGFyZ3MpID4gMTogIyBlbGVtZW50ZnJvbSBzcGVjaWZpZWQKLSAgICAgICAgICAgIG9wdHMgPSAoYXJnc1sxXSwgKQorICAgICAgICAgICAgb3B0cyA9IChfZm9ybWF0X29wdHZhbHVlKGFyZ3NbMV0sIHNjcmlwdCksKQogCiAgICAgaWYgc2NyaXB0OgogICAgICAgICBzcGVjID0gJ3slc30nICUgc3BlYwotICAgICAgICBvcHRzID0gJyAnLmpvaW4obWFwKHN0ciwgb3B0cykpCisgICAgICAgIG9wdHMgPSAnICcuam9pbihvcHRzKQogCiAgICAgcmV0dXJuIHNwZWMsIG9wdHMKIApAQCAtMTg5LDcgKzE4NCw3IEBACiAgICAgZm9yIGxheW91dF9lbGVtIGluIGxheW91dDoKICAgICAgICAgZWxlbSwgb3B0cyA9IGxheW91dF9lbGVtCiAgICAgICAgIG9wdHMgPSBvcHRzIG9yIHt9Ci0gICAgICAgIGZvcHRzID0gJyAnLmpvaW4obWFwKHN0ciwgX2Zvcm1hdF9vcHRkaWN0KG9wdHMsIFRydWUsICJjaGlsZHJlbiIpKSkKKyAgICAgICAgZm9wdHMgPSAnICcuam9pbihfZm9ybWF0X29wdGRpY3Qob3B0cywgVHJ1ZSwgKCJjaGlsZHJlbiIsKSkpCiAgICAgICAgIGhlYWQgPSAiJXMlcyVzIiAlICgnICcgKiBpbmRlbnQsIGVsZW0sICgiICVzIiAlIGZvcHRzKSBpZiBmb3B0cyBlbHNlICcnKQogCiAgICAgICAgIGlmICJjaGlsZHJlbiIgaW4gb3B0czoKQEAgLTIxNSwxMSArMjEwLDExIEBACiAgICAgZm9yIG5hbWUsIG9wdHMgaW4gc2V0dGluZ3MuaXRlcml0ZW1zKCk6CiAgICAgICAgICMgd2lsbCBmb3JtYXQgc3BlY2lmaWMga2V5cyBhY2NvcmRpbmcgdG8gVGNsIGNvZGUKICAgICAgICAgaWYgb3B0cy5nZXQoJ2NvbmZpZ3VyZScpOiAjIGZvcm1hdCAnY29uZmlndXJlJwotICAgICAgICAgICAgcyA9ICcgJy5qb2luKG1hcCh1bmljb2RlLCBfZm9ybWF0X29wdGRpY3Qob3B0c1snY29uZmlndXJlJ10sIFRydWUpKSkKKyAgICAgICAgICAgIHMgPSAnICcuam9pbihfZm9ybWF0X29wdGRpY3Qob3B0c1snY29uZmlndXJlJ10sIFRydWUpKQogICAgICAgICAgICAgc2NyaXB0LmFwcGVuZCgidHRrOjpzdHlsZSBjb25maWd1cmUgJXMgJXM7IiAlIChuYW1lLCBzKSkKIAogICAgICAgICBpZiBvcHRzLmdldCgnbWFwJyk6ICMgZm9ybWF0ICdtYXAnCi0gICAgICAgICAgICBzID0gJyAnLmpvaW4obWFwKHVuaWNvZGUsIF9mb3JtYXRfbWFwZGljdChvcHRzWydtYXAnXSwgVHJ1ZSkpKQorICAgICAgICAgICAgcyA9ICcgJy5qb2luKF9mb3JtYXRfbWFwZGljdChvcHRzWydtYXAnXSwgVHJ1ZSkpCiAgICAgICAgICAgICBzY3JpcHQuYXBwZW5kKCJ0dGs6OnN0eWxlIG1hcCAlcyAlczsiICUgKG5hbWUsIHMpKQogCiAgICAgICAgIGlmICdsYXlvdXQnIGluIG9wdHM6ICMgZm9ybWF0ICdsYXlvdXQnIHdoaWNoIG1heSBiZSBlbXB0eQpAQCAtMjc5LDkgKzI3NCwxMCBAQAogICAgIGl0ID0gaXRlcihudmFsKQogICAgIHJldHVybiBbX2ZsYXR0ZW4oc3BlYykgZm9yIHNwZWMgaW4gemlwKGl0LCBpdCldCiAKLWRlZiBfbGlzdF9mcm9tX2xheW91dHR1cGxlKGx0dXBsZSk6CitkZWYgX2xpc3RfZnJvbV9sYXlvdXR0dXBsZSh0aywgbHR1cGxlKToKICAgICAiIiJDb25zdHJ1Y3QgYSBsaXN0IGZyb20gdGhlIHR1cGxlIHJldHVybmVkIGJ5IHR0azo6bGF5b3V0LCB0aGlzIGlzCiAgICAgc29tZXdoYXQgdGhlIHJldmVyc2Ugb2YgX2Zvcm1hdF9sYXlvdXRsaXN0LiIiIgorICAgIGx0dXBsZSA9IHRrLnNwbGl0bGlzdChsdHVwbGUpCiAgICAgcmVzID0gW10KIAogICAgIGluZHggPSAwCkBAIC0zMDAsMTQgKzI5NiwxNCBAQAogICAgICAgICAgICAgaW5keCArPSAyCiAKICAgICAgICAgICAgIGlmIG9wdCA9PSAnY2hpbGRyZW4nOgotICAgICAgICAgICAgICAgIHZhbCA9IF9saXN0X2Zyb21fbGF5b3V0dHVwbGUodmFsKQorICAgICAgICAgICAgICAgIHZhbCA9IF9saXN0X2Zyb21fbGF5b3V0dHVwbGUodGssIHZhbCkKIAogICAgICAgICAgICAgb3B0c1tvcHRdID0gdmFsCiAKICAgICByZXR1cm4gcmVzCiAKLWRlZiBfdmFsX29yX2RpY3Qob3B0aW9ucywgZnVuYywgKmFyZ3MpOgotICAgICIiIkZvcm1hdCBvcHRpb25zIHRoZW4gY2FsbCBmdW5jIHdpdGggYXJncyBhbmQgb3B0aW9ucyBhbmQgcmV0dXJuCitkZWYgX3ZhbF9vcl9kaWN0KHRrLCBvcHRpb25zLCAqYXJncyk6CisgICAgIiIiRm9ybWF0IG9wdGlvbnMgdGhlbiBjYWxsIFRrIGNvbW1hbmQgd2l0aCBhcmdzIGFuZCBvcHRpb25zIGFuZCByZXR1cm4KICAgICB0aGUgYXBwcm9wcmlhdGUgcmVzdWx0LgogCiAgICAgSWYgbm8gb3B0aW9uIGlzIHNwZWNpZmllZCwgYSBkaWN0IGlzIHJldHVybmVkLiBJZiBhIG9wdGlvbiBpcwpAQCAtMzE1LDEyICszMTEsMTIgQEAKICAgICBPdGhlcndpc2UsIHRoZSBmdW5jdGlvbiBqdXN0IHNldHMgdGhlIHBhc3NlZCBvcHRpb25zIGFuZCB0aGUgY2FsbGVyCiAgICAgc2hvdWxkbid0IGJlIGV4cGVjdGluZyBhIHJldHVybiB2YWx1ZSBhbnl3YXkuIiIiCiAgICAgb3B0aW9ucyA9IF9mb3JtYXRfb3B0ZGljdChvcHRpb25zKQotICAgIHJlcyA9IGZ1bmMoKihhcmdzICsgb3B0aW9ucykpCisgICAgcmVzID0gdGsuY2FsbCgqKGFyZ3MgKyBvcHRpb25zKSkKIAogICAgIGlmIGxlbihvcHRpb25zKSAlIDI6ICMgb3B0aW9uIHNwZWNpZmllZCB3aXRob3V0IGEgdmFsdWUsIHJldHVybiBpdHMgdmFsdWUKICAgICAgICAgcmV0dXJuIHJlcwogCi0gICAgcmV0dXJuIF9kaWN0X2Zyb21fdGNsdHVwbGUocmVzKQorICAgIHJldHVybiBfZGljdF9mcm9tX3RjbHR1cGxlKHRrLnNwbGl0bGlzdChyZXMpKQogCiBkZWYgX2NvbnZlcnRfc3RyaW5ndmFsKHZhbHVlKToKICAgICAiIiJDb252ZXJ0cyBhIHZhbHVlIHRvLCBob3BlZnVsbHksIGEgbW9yZSBhcHByb3ByaWF0ZSBQeXRob24gb2JqZWN0LiIiIgpAQCAtMzMyLDYgKzMyOCwxNCBAQAogCiAgICAgcmV0dXJuIHZhbHVlCiAKK2RlZiBfdG9fbnVtYmVyKHgpOgorICAgIGlmIGlzaW5zdGFuY2UoeCwgc3RyKToKKyAgICAgICAgaWYgJy4nIGluIHg6CisgICAgICAgICAgICB4ID0gZmxvYXQoeCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHggPSBpbnQoeCkKKyAgICByZXR1cm4geAorCiBkZWYgdGNsb2Jqc190b19weShhZGljdCk6CiAgICAgIiIiUmV0dXJucyBhZGljdCB3aXRoIGl0cyB2YWx1ZXMgY29udmVydGVkIGZyb20gVGNsIG9iamVjdHMgdG8gUHl0aG9uCiAgICAgb2JqZWN0cy4iIiIKQEAgLTM5MCw3ICszOTQsNyBAQAogICAgICAgICBhIHNlcXVlbmNlIGlkZW50aWZ5aW5nIHRoZSB2YWx1ZSBmb3IgdGhhdCBvcHRpb24uIiIiCiAgICAgICAgIGlmIHF1ZXJ5X29wdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgIGt3W3F1ZXJ5X29wdF0gPSBOb25lCi0gICAgICAgIHJldHVybiBfdmFsX29yX2RpY3Qoa3csIHNlbGYudGsuY2FsbCwgc2VsZi5fbmFtZSwgImNvbmZpZ3VyZSIsIHN0eWxlKQorICAgICAgICByZXR1cm4gX3ZhbF9vcl9kaWN0KHNlbGYudGssIGt3LCBzZWxmLl9uYW1lLCAiY29uZmlndXJlIiwgc3R5bGUpCiAKIAogICAgIGRlZiBtYXAoc2VsZiwgc3R5bGUsIHF1ZXJ5X29wdD1Ob25lLCAqKmt3KToKQEAgLTQwMiwxMSArNDA2LDExIEBACiAgICAgICAgIG9yIHNvbWV0aGluZyBlbHNlIG9mIHlvdXIgcHJlZmVyZW5jZS4gQSBzdGF0ZXNwZWMgaXMgY29tcG91bmQgb2YKICAgICAgICAgb25lIG9yIG1vcmUgc3RhdGVzIGFuZCB0aGVuIGEgdmFsdWUuIiIiCiAgICAgICAgIGlmIHF1ZXJ5X29wdCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHJldHVybiBfbGlzdF9mcm9tX3N0YXRlc3BlYygKLSAgICAgICAgICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fbmFtZSwgIm1hcCIsIHN0eWxlLCAnLSVzJyAlIHF1ZXJ5X29wdCkpCisgICAgICAgICAgICByZXR1cm4gX2xpc3RfZnJvbV9zdGF0ZXNwZWMoc2VsZi50ay5zcGxpdGxpc3QoCisgICAgICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX25hbWUsICJtYXAiLCBzdHlsZSwgJy0lcycgJSBxdWVyeV9vcHQpKSkKIAotICAgICAgICByZXR1cm4gX2RpY3RfZnJvbV90Y2x0dXBsZSgKLSAgICAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl9uYW1lLCAibWFwIiwgc3R5bGUsICooX2Zvcm1hdF9tYXBkaWN0KGt3KSkpKQorICAgICAgICByZXR1cm4gX2RpY3RfZnJvbV90Y2x0dXBsZShzZWxmLnRrLnNwbGl0bGlzdCgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl9uYW1lLCAibWFwIiwgc3R5bGUsICooX2Zvcm1hdF9tYXBkaWN0KGt3KSkpKSkKIAogCiAgICAgZGVmIGxvb2t1cChzZWxmLCBzdHlsZSwgb3B0aW9uLCBzdGF0ZT1Ob25lLCBkZWZhdWx0PU5vbmUpOgpAQCAtNDYwLDcgKzQ2NCw3IEBACiAgICAgICAgICAgICBsc3BlYyA9ICJudWxsIiAjIGNvdWxkIGJlIGFueSBvdGhlciB3b3JkLCBidXQgdGhpcyBtYXkgbWFrZSBzZW5zZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3aGVuIGNhbGxpbmcgbGF5b3V0KHN0eWxlKSBsYXRlcgogCi0gICAgICAgIHJldHVybiBfbGlzdF9mcm9tX2xheW91dHR1cGxlKAorICAgICAgICByZXR1cm4gX2xpc3RfZnJvbV9sYXlvdXR0dXBsZShzZWxmLnRrLAogICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX25hbWUsICJsYXlvdXQiLCBzdHlsZSwgbHNwZWMpKQogCiAKQEAgLTQ3MywxMiArNDc3LDEyIEBACiAKICAgICBkZWYgZWxlbWVudF9uYW1lcyhzZWxmKToKICAgICAgICAgIiIiUmV0dXJucyB0aGUgbGlzdCBvZiBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IHRoZW1lLiIiIgotICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX25hbWUsICJlbGVtZW50IiwgIm5hbWVzIikKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXRsaXN0KHNlbGYudGsuY2FsbChzZWxmLl9uYW1lLCAiZWxlbWVudCIsICJuYW1lcyIpKQogCiAKICAgICBkZWYgZWxlbWVudF9vcHRpb25zKHNlbGYsIGVsZW1lbnRuYW1lKToKICAgICAgICAgIiIiUmV0dXJuIHRoZSBsaXN0IG9mIGVsZW1lbnRuYW1lJ3Mgb3B0aW9ucy4iIiIKLSAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl9uYW1lLCAiZWxlbWVudCIsICJvcHRpb25zIiwgZWxlbWVudG5hbWUpCisgICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0bGlzdChzZWxmLnRrLmNhbGwoc2VsZi5fbmFtZSwgImVsZW1lbnQiLCAib3B0aW9ucyIsIGVsZW1lbnRuYW1lKSkKIAogCiAgICAgZGVmIHRoZW1lX2NyZWF0ZShzZWxmLCB0aGVtZW5hbWUsIHBhcmVudD1Ob25lLCBzZXR0aW5ncz1Ob25lKToKQEAgLTUxMiw3ICs1MTYsNyBAQAogCiAgICAgZGVmIHRoZW1lX25hbWVzKHNlbGYpOgogICAgICAgICAiIiJSZXR1cm5zIGEgbGlzdCBvZiBhbGwga25vd24gdGhlbWVzLiIiIgotICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX25hbWUsICJ0aGVtZSIsICJuYW1lcyIpCisgICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0bGlzdChzZWxmLnRrLmNhbGwoc2VsZi5fbmFtZSwgInRoZW1lIiwgIm5hbWVzIikpCiAKIAogICAgIGRlZiB0aGVtZV91c2Uoc2VsZiwgdGhlbWVuYW1lPU5vbmUpOgpAQCAtNTc1LDcgKzU3OSw4IEBACiAgICAgICAgIG1hdGNoZXMgc3RhdGVzcGVjIGFuZCBGYWxzZSBvdGhlcndpc2UuIElmIGNhbGxiYWNrIGlzIHNwZWNpZmllZCwKICAgICAgICAgdGhlbiBpdCB3aWxsIGJlIGludm9rZWQgd2l0aCAqYXJncywgKiprdyBpZiB0aGUgd2lkZ2V0IHN0YXRlCiAgICAgICAgIG1hdGNoZXMgc3RhdGVzcGVjLiBzdGF0ZXNwZWMgaXMgZXhwZWN0ZWQgdG8gYmUgYSBzZXF1ZW5jZS4iIiIKLSAgICAgICAgcmV0ID0gc2VsZi50ay5jYWxsKHNlbGYuX3csICJpbnN0YXRlIiwgJyAnLmpvaW4oc3RhdGVzcGVjKSkKKyAgICAgICAgcmV0ID0gc2VsZi50ay5nZXRib29sZWFuKAorICAgICAgICAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAiaW5zdGF0ZSIsICcgJy5qb2luKHN0YXRlc3BlYykpKQogICAgICAgICBpZiByZXQgYW5kIGNhbGxiYWNrOgogICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCphcmdzLCAqKmt3KQogCkBAIC02NzQsNyArNjc5LDcgQEAKICAgICBkZWYgYmJveChzZWxmLCBpbmRleCk6CiAgICAgICAgICIiIlJldHVybiBhIHR1cGxlIG9mICh4LCB5LCB3aWR0aCwgaGVpZ2h0KSB3aGljaCBkZXNjcmliZXMgdGhlCiAgICAgICAgIGJvdW5kaW5nIGJveCBvZiB0aGUgY2hhcmFjdGVyIGdpdmVuIGJ5IGluZGV4LiIiIgotICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICJiYm94IiwgaW5kZXgpCisgICAgICAgIHJldHVybiBzZWxmLl9nZXRpbnRzKHNlbGYudGsuY2FsbChzZWxmLl93LCAiYmJveCIsIGluZGV4KSkKIAogCiAgICAgZGVmIGlkZW50aWZ5KHNlbGYsIHgsIHkpOgpAQCAtNjg3LDcgKzY5Miw3IEBACiAgICAgICAgICIiIkZvcmNlIHJldmFsaWRhdGlvbiwgaW5kZXBlbmRlbnQgb2YgdGhlIGNvbmRpdGlvbnMgc3BlY2lmaWVkCiAgICAgICAgIGJ5IHRoZSB2YWxpZGF0ZSBvcHRpb24uIFJldHVybnMgRmFsc2UgaWYgdmFsaWRhdGlvbiBmYWlscywgVHJ1ZQogICAgICAgICBpZiBpdCBzdWNjZWVkcy4gU2V0cyBvciBjbGVhcnMgdGhlIGludmFsaWQgc3RhdGUgYWNjb3JkaW5nbHkuIiIiCi0gICAgICAgIHJldHVybiBib29sKHNlbGYudGsuY2FsbChzZWxmLl93LCAidmFsaWRhdGUiKSkKKyAgICAgICAgcmV0dXJuIGJvb2woc2VsZi50ay5nZXRib29sZWFuKHNlbGYudGsuY2FsbChzZWxmLl93LCAidmFsaWRhdGUiKSkpCiAKIAogY2xhc3MgQ29tYm9ib3goRW50cnkpOgpAQCAtNzA2LDM1ICs3MTEsMTYgQEAKICAgICAgICAgICAgIGV4cG9ydHNlbGVjdGlvbiwganVzdGlmeSwgaGVpZ2h0LCBwb3N0Y29tbWFuZCwgc3RhdGUsCiAgICAgICAgICAgICB0ZXh0dmFyaWFibGUsIHZhbHVlcywgd2lkdGgKICAgICAgICAgIiIiCi0gICAgICAgICMgVGhlICJ2YWx1ZXMiIG9wdGlvbiBtYXkgbmVlZCBzcGVjaWFsIGZvcm1hdHRpbmcsIHNvIGxlYXZlIHRvCi0gICAgICAgICMgX2Zvcm1hdF9vcHRkaWN0IHRoZSByZXNwb25zaWJpbGl0eSB0byBmb3JtYXQgaXQKLSAgICAgICAgaWYgInZhbHVlcyIgaW4ga3c6Ci0gICAgICAgICAgICBrd1sidmFsdWVzIl0gPSBfZm9ybWF0X29wdGRpY3Qoeyd2Jzoga3dbInZhbHVlcyJdfSlbMV0KLQogICAgICAgICBFbnRyeS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICJ0dGs6OmNvbWJvYm94IiwgKiprdykKIAogCi0gICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGl0ZW0sIHZhbHVlKToKLSAgICAgICAgaWYgaXRlbSA9PSAidmFsdWVzIjoKLSAgICAgICAgICAgIHZhbHVlID0gX2Zvcm1hdF9vcHRkaWN0KHtpdGVtOiB2YWx1ZX0pWzFdCi0KLSAgICAgICAgRW50cnkuX19zZXRpdGVtX18oc2VsZiwgaXRlbSwgdmFsdWUpCi0KLQotICAgIGRlZiBjb25maWd1cmUoc2VsZiwgY25mPU5vbmUsICoqa3cpOgotICAgICAgICAiIiJDdXN0b20gQ29tYm9ib3ggY29uZmlndXJlLCBjcmVhdGVkIHRvIHByb3Blcmx5IGZvcm1hdCB0aGUgdmFsdWVzCi0gICAgICAgIG9wdGlvbi4iIiIKLSAgICAgICAgaWYgInZhbHVlcyIgaW4ga3c6Ci0gICAgICAgICAgICBrd1sidmFsdWVzIl0gPSBfZm9ybWF0X29wdGRpY3Qoeyd2Jzoga3dbInZhbHVlcyJdfSlbMV0KLQotICAgICAgICByZXR1cm4gRW50cnkuY29uZmlndXJlKHNlbGYsIGNuZiwgKiprdykKLQotCiAgICAgZGVmIGN1cnJlbnQoc2VsZiwgbmV3aW5kZXg9Tm9uZSk6CiAgICAgICAgICIiIklmIG5ld2luZGV4IGlzIHN1cHBsaWVkLCBzZXRzIHRoZSBjb21ib2JveCB2YWx1ZSB0byB0aGUKICAgICAgICAgZWxlbWVudCBhdCBwb3NpdGlvbiBuZXdpbmRleCBpbiB0aGUgbGlzdCBvZiB2YWx1ZXMuIE90aGVyd2lzZSwKICAgICAgICAgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlIGxpc3Qgb2YgdmFsdWVzCiAgICAgICAgIG9yIC0xIGlmIHRoZSBjdXJyZW50IHZhbHVlIGRvZXMgbm90IGFwcGVhciBpbiB0aGUgbGlzdC4iIiIKKyAgICAgICAgaWYgbmV3aW5kZXggaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRrLmdldGludChzZWxmLnRrLmNhbGwoc2VsZi5fdywgImN1cnJlbnQiKSkKICAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAiY3VycmVudCIsIG5ld2luZGV4KQogCiAKQEAgLTg4OSw3ICs4NzUsNyBAQAogICAgIGRlZiBpbmRleChzZWxmLCB0YWJfaWQpOgogICAgICAgICAiIiJSZXR1cm5zIHRoZSBudW1lcmljIGluZGV4IG9mIHRoZSB0YWIgc3BlY2lmaWVkIGJ5IHRhYl9pZCwgb3IKICAgICAgICAgdGhlIHRvdGFsIG51bWJlciBvZiB0YWJzIGlmIHRhYl9pZCBpcyB0aGUgc3RyaW5nICJlbmQiLiIiIgotICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICJpbmRleCIsIHRhYl9pZCkKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuZ2V0aW50KHNlbGYudGsuY2FsbChzZWxmLl93LCAiaW5kZXgiLCB0YWJfaWQpKQogCiAKICAgICBkZWYgaW5zZXJ0KHNlbGYsIHBvcywgY2hpbGQsICoqa3cpOgpAQCAtOTE5LDEyICs5MDUsMTIgQEAKICAgICAgICAgb3B0aW9ucyB0byB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMuIiIiCiAgICAgICAgIGlmIG9wdGlvbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgIGt3W29wdGlvbl0gPSBOb25lCi0gICAgICAgIHJldHVybiBfdmFsX29yX2RpY3Qoa3csIHNlbGYudGsuY2FsbCwgc2VsZi5fdywgInRhYiIsIHRhYl9pZCkKKyAgICAgICAgcmV0dXJuIF92YWxfb3JfZGljdChzZWxmLnRrLCBrdywgc2VsZi5fdywgInRhYiIsIHRhYl9pZCkKIAogCiAgICAgZGVmIHRhYnMoc2VsZik6CiAgICAgICAgICIiIlJldHVybnMgYSBsaXN0IG9mIHdpbmRvd3MgbWFuYWdlZCBieSB0aGUgbm90ZWJvb2suIiIiCi0gICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgInRhYnMiKSBvciAoKQorICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdGxpc3Qoc2VsZi50ay5jYWxsKHNlbGYuX3csICJ0YWJzIikgb3IgKCkpCiAKIAogICAgIGRlZiBlbmFibGVfdHJhdmVyc2FsKHNlbGYpOgpAQCAtOTk2LDcgKzk4Miw3IEBACiAgICAgICAgIE90aGVyd2lzZSwgc2V0cyB0aGUgb3B0aW9ucyB0byB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMuIiIiCiAgICAgICAgIGlmIG9wdGlvbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgIGt3W29wdGlvbl0gPSBOb25lCi0gICAgICAgIHJldHVybiBfdmFsX29yX2RpY3Qoa3csIHNlbGYudGsuY2FsbCwgc2VsZi5fdywgInBhbmUiLCBwYW5lKQorICAgICAgICByZXR1cm4gX3ZhbF9vcl9kaWN0KHNlbGYudGssIGt3LCBzZWxmLl93LCAicGFuZSIsIHBhbmUpCiAKIAogICAgIGRlZiBzYXNocG9zKHNlbGYsIGluZGV4LCBuZXdwb3M9Tm9uZSk6CkBAIC0xMDA3LDcgKzk5Myw3IEBACiAgICAgICAgIGNvbnN0cmFpbmVkIHRvIGJlIGJldHdlZW4gMCBhbmQgdGhlIHRvdGFsIHNpemUgb2YgdGhlIHdpZGdldC4KIAogICAgICAgICBSZXR1cm5zIHRoZSBuZXcgcG9zaXRpb24gb2Ygc2FzaCBudW1iZXIgaW5kZXguIiIiCi0gICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgInNhc2hwb3MiLCBpbmRleCwgbmV3cG9zKQorICAgICAgICByZXR1cm4gc2VsZi50ay5nZXRpbnQoc2VsZi50ay5jYWxsKHNlbGYuX3csICJzYXNocG9zIiwgaW5kZXgsIG5ld3BvcykpCiAKIFBhbmVkV2luZG93ID0gUGFuZWR3aW5kb3cgIyBUa2ludGVyIG5hbWUgY29tcGF0aWJpbGl0eQogCkBAIC0xMjA3LDE0ICsxMTkzLDE1IEBACiAgICAgICAgIElmIGNvbHVtbiBpcyBzcGVjaWZpZWQsIHJldHVybnMgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGF0IGNlbGwuCiAgICAgICAgIElmIHRoZSBpdGVtIGlzIG5vdCB2aXNpYmxlIChpLmUuLCBpZiBpdCBpcyBhIGRlc2NlbmRhbnQgb2YgYQogICAgICAgICBjbG9zZWQgaXRlbSBvciBpcyBzY3JvbGxlZCBvZmZzY3JlZW4pLCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4iIiIKLSAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAiYmJveCIsIGl0ZW0sIGNvbHVtbikKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGludHMoc2VsZi50ay5jYWxsKHNlbGYuX3csICJiYm94IiwgaXRlbSwgY29sdW1uKSkgb3IgJycKIAogCiAgICAgZGVmIGdldF9jaGlsZHJlbihzZWxmLCBpdGVtPU5vbmUpOgogICAgICAgICAiIiJSZXR1cm5zIGEgdHVwbGUgb2YgY2hpbGRyZW4gYmVsb25naW5nIHRvIGl0ZW0uCiAKICAgICAgICAgSWYgaXRlbSBpcyBub3Qgc3BlY2lmaWVkLCByZXR1cm5zIHJvb3QgY2hpbGRyZW4uIiIiCi0gICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgImNoaWxkcmVuIiwgaXRlbSBvciAnJykgb3IgKCkKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXRsaXN0KAorICAgICAgICAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAiY2hpbGRyZW4iLCBpdGVtIG9yICcnKSBvciAoKSkKIAogCiAgICAgZGVmIHNldF9jaGlsZHJlbihzZWxmLCBpdGVtLCAqbmV3Y2hpbGRyZW4pOgpAQCAtMTIzNCw3ICsxMjIxLDcgQEAKICAgICAgICAgT3RoZXJ3aXNlLCBzZXRzIHRoZSBvcHRpb25zIHRvIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcy4iIiIKICAgICAgICAgaWYgb3B0aW9uIGlzIG5vdCBOb25lOgogICAgICAgICAgICAga3dbb3B0aW9uXSA9IE5vbmUKLSAgICAgICAgcmV0dXJuIF92YWxfb3JfZGljdChrdywgc2VsZi50ay5jYWxsLCBzZWxmLl93LCAiY29sdW1uIiwgY29sdW1uKQorICAgICAgICByZXR1cm4gX3ZhbF9vcl9kaWN0KHNlbGYudGssIGt3LCBzZWxmLl93LCAiY29sdW1uIiwgY29sdW1uKQogCiAKICAgICBkZWYgZGVsZXRlKHNlbGYsICppdGVtcyk6CkBAIC0xMjUzLDkgKzEyNDAsOSBAQAogCiAKICAgICBkZWYgZXhpc3RzKHNlbGYsIGl0ZW0pOgotICAgICAgICAiIiJSZXR1cm5zIFRydWUgaWYgdGhlIHNwZWNpZmllZCBpdGVtIGlzIHByZXNlbnQgaW4gdGhlIHRocmVlLAorICAgICAgICAiIiJSZXR1cm5zIFRydWUgaWYgdGhlIHNwZWNpZmllZCBpdGVtIGlzIHByZXNlbnQgaW4gdGhlIHRyZWUsCiAgICAgICAgIEZhbHNlIG90aGVyd2lzZS4iIiIKLSAgICAgICAgcmV0dXJuIGJvb2woc2VsZi50ay5jYWxsKHNlbGYuX3csICJleGlzdHMiLCBpdGVtKSkKKyAgICAgICAgcmV0dXJuIGJvb2woc2VsZi50ay5nZXRib29sZWFuKHNlbGYudGsuY2FsbChzZWxmLl93LCAiZXhpc3RzIiwgaXRlbSkpKQogCiAKICAgICBkZWYgZm9jdXMoc2VsZiwgaXRlbT1Ob25lKToKQEAgLTEyOTMsNyArMTI4MCw3IEBACiAgICAgICAgIGlmIG9wdGlvbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgIGt3W29wdGlvbl0gPSBOb25lCiAKLSAgICAgICAgcmV0dXJuIF92YWxfb3JfZGljdChrdywgc2VsZi50ay5jYWxsLCBzZWxmLl93LCAnaGVhZGluZycsIGNvbHVtbikKKyAgICAgICAgcmV0dXJuIF92YWxfb3JfZGljdChzZWxmLnRrLCBrdywgc2VsZi5fdywgJ2hlYWRpbmcnLCBjb2x1bW4pCiAKIAogICAgIGRlZiBpZGVudGlmeShzZWxmLCBjb21wb25lbnQsIHgsIHkpOgpAQCAtMTMzNyw3ICsxMzI0LDcgQEAKICAgICBkZWYgaW5kZXgoc2VsZiwgaXRlbSk6CiAgICAgICAgICIiIlJldHVybnMgdGhlIGludGVnZXIgaW5kZXggb2YgaXRlbSB3aXRoaW4gaXRzIHBhcmVudCdzIGxpc3QKICAgICAgICAgb2YgY2hpbGRyZW4uIiIiCi0gICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgImluZGV4IiwgaXRlbSkKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuZ2V0aW50KHNlbGYudGsuY2FsbChzZWxmLl93LCAiaW5kZXgiLCBpdGVtKSkKIAogCiAgICAgZGVmIGluc2VydChzZWxmLCBwYXJlbnQsIGluZGV4LCBpaWQ9Tm9uZSwgKiprdyk6CkBAIC0xMzcyLDcgKzEzNTksNyBAQAogICAgICAgICB2YWx1ZXMgYXMgZ2l2ZW4gYnkga3cuIiIiCiAgICAgICAgIGlmIG9wdGlvbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgIGt3W29wdGlvbl0gPSBOb25lCi0gICAgICAgIHJldHVybiBfdmFsX29yX2RpY3Qoa3csIHNlbGYudGsuY2FsbCwgc2VsZi5fdywgIml0ZW0iLCBpdGVtKQorICAgICAgICByZXR1cm4gX3ZhbF9vcl9kaWN0KHNlbGYudGssIGt3LCBzZWxmLl93LCAiaXRlbSIsIGl0ZW0pCiAKIAogICAgIGRlZiBtb3ZlKHNlbGYsIGl0ZW0sIHBhcmVudCwgaW5kZXgpOgpAQCAtMTQ0Niw3ICsxNDMzLDcgQEAKICAgICAgICAgdmFsdWUgb2YgZ2l2ZW4gY29sdW1uIGluIGdpdmVuIGl0ZW0gdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4iIiIKICAgICAgICAgcmVzID0gc2VsZi50ay5jYWxsKHNlbGYuX3csICJzZXQiLCBpdGVtLCBjb2x1bW4sIHZhbHVlKQogICAgICAgICBpZiBjb2x1bW4gaXMgTm9uZSBhbmQgdmFsdWUgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybiBfZGljdF9mcm9tX3RjbHR1cGxlKHJlcywgRmFsc2UpCisgICAgICAgICAgICByZXR1cm4gX2RpY3RfZnJvbV90Y2x0dXBsZShzZWxmLnRrLnNwbGl0bGlzdChyZXMpLCBGYWxzZSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJldHVybiByZXMKIApAQCAtMTQ2Nyw3ICsxNDU0LDcgQEAKICAgICAgICAgdmFsdWVzIGZvciB0aGUgZ2l2ZW4gdGFnbmFtZS4iIiIKICAgICAgICAgaWYgb3B0aW9uIGlzIG5vdCBOb25lOgogICAgICAgICAgICAga3dbb3B0aW9uXSA9IE5vbmUKLSAgICAgICAgcmV0dXJuIF92YWxfb3JfZGljdChrdywgc2VsZi50ay5jYWxsLCBzZWxmLl93LCAidGFnIiwgImNvbmZpZ3VyZSIsCisgICAgICAgIHJldHVybiBfdmFsX29yX2RpY3Qoc2VsZi50aywga3csIHNlbGYuX3csICJ0YWciLCAiY29uZmlndXJlIiwKICAgICAgICAgICAgIHRhZ25hbWUpCiAKIApAQCAtMTQ3Nyw3ICsxNDY0LDggQEAKICAgICAgICAgYWxsIGl0ZW1zIHdoaWNoIGhhdmUgdGhlIHNwZWNpZmllZCB0YWcuCiAKICAgICAgICAgKiBBdmFpbGFiaWxpdHk6IFRrIDguNiIiIgotICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICJ0YWciLCAiaGFzIiwgdGFnbmFtZSwgaXRlbSkKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuZ2V0Ym9vbGVhbigKKyAgICAgICAgICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgInRhZyIsICJoYXMiLCB0YWduYW1lLCBpdGVtKSkKIAogCiAjIEV4dGVuc2lvbnMKQEAgLTE1NDksNyArMTUzNyw4IEBACiAKICAgICAgICAgICAgIHNlbGYubGFiZWwucGxhY2VfY29uZmlndXJlKHg9eCwgeT15KQogCi0gICAgICAgIGZyb21fLCB0byA9IHNlbGYuc2NhbGVbJ2Zyb20nXSwgc2VsZi5zY2FsZVsndG8nXQorICAgICAgICBmcm9tXyA9IF90b19udW1iZXIoc2VsZi5zY2FsZVsnZnJvbSddKQorICAgICAgICB0byA9IF90b19udW1iZXIoc2VsZi5zY2FsZVsndG8nXSkKICAgICAgICAgaWYgdG8gPCBmcm9tXzoKICAgICAgICAgICAgIGZyb21fLCB0byA9IHRvLCBmcm9tXwogICAgICAgICBuZXd2YWwgPSBzZWxmLl92YXJpYWJsZS5nZXQoKQpkaWZmIC0tZ2l0IGEvTGliL2xpYi10ay90dXJ0bGUucHkgYi9MaWIvbGliLXRrL3R1cnRsZS5weQppbmRleCBhYTRmZTg0Li43NTY3M2E0IDEwMDY0NAotLS0gYS9MaWIvbGliLXRrL3R1cnRsZS5weQorKysgYi9MaWIvbGliLXRrL3R1cnRsZS5weQpAQCAtMTQyLDcgKzE0Miw3IEBACiAgICAgICAgICdsb2cxMCcsICdtb2RmJywgJ3BpJywgJ3BvdycsICdzaW4nLCAnc2luaCcsICdzcXJ0JywgJ3RhbicsICd0YW5oJ10KIAogX19hbGxfXyA9IChfdGdfY2xhc3NlcyArIF90Z19zY3JlZW5fZnVuY3Rpb25zICsgX3RnX3R1cnRsZV9mdW5jdGlvbnMgKwotICAgICAgICAgICBfdGdfdXRpbGl0aWVzICsgX21hdGhfZnVuY3Rpb25zKQorICAgICAgICAgICBfdGdfdXRpbGl0aWVzICsgWydUZXJtaW5hdG9yJ10gKyBfbWF0aF9mdW5jdGlvbnMpCiAKIF9hbGlhc19saXN0ID0gWydhZGRzaGFwZScsICdiYWNrd2FyZCcsICdiaycsICdmZCcsICdodCcsICdsdCcsICdwZCcsICdwb3MnLAogICAgICAgICAgICAgICAgJ3B1JywgJ3J0JywgJ3NldGgnLCAnc2V0cG9zJywgJ3NldHBvc2l0aW9uJywgJ3N0JywKQEAgLTgxMSw4ICs4MTEsOCBAQAogY2xhc3MgVGVybWluYXRvciAoRXhjZXB0aW9uKToKICAgICAiIiJXaWxsIGJlIHJhaXNlZCBpbiBUdXJ0bGVTY3JlZW4udXBkYXRlLCBpZiBfUlVOTklORyBiZWNvbWVzIEZhbHNlLgogCi0gICAgVGh1cyBzdG9wcyBleGVjdXRpb24gb2YgdHVydGxlIGdyYXBoaWNzIHNjcmlwdC4gTWFpbiBwdXJwb3NlOiB1c2UgaW4KLSAgICBpbiB0aGUgRGVtby1WaWV3ZXIgdHVydGxlLkRlbW8ucHkuCisgICAgVGhpcyBzdG9wcyBleGVjdXRpb24gb2YgYSB0dXJ0bGUgZ3JhcGhpY3Mgc2NyaXB0LgorICAgIE1haW4gcHVycG9zZTogdXNlIGluIHRoZSBEZW1vLVZpZXdlciB0dXJ0bGUuRGVtby5weS4KICAgICAiIiIKICAgICBwYXNzCiAKQEAgLTgzNSw3ICs4MzUsNyBAQAogICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBsaXN0KToKICAgICAgICAgICAgICAgICBkYXRhID0gdHVwbGUoZGF0YSkKICAgICAgICAgZWxpZiB0eXBlXyA9PSAiaW1hZ2UiOgotICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBzdHIpOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgICAgICBpZiBkYXRhLmxvd2VyKCkuZW5kc3dpdGgoIi5naWYiKSBhbmQgaXNmaWxlKGRhdGEpOgogICAgICAgICAgICAgICAgICAgICBkYXRhID0gVHVydGxlU2NyZWVuLl9pbWFnZShkYXRhKQogICAgICAgICAgICAgICAgICMgZWxzZSBkYXRhIGFzc3VtZWQgdG8gYmUgUGhvdG9pbWFnZQpAQCAtMTA5OCw3ICsxMDk4LDcgQEAKICAgICAgICAgIiIiCiAgICAgICAgIGlmIGxlbihjb2xvcikgPT0gMToKICAgICAgICAgICAgIGNvbG9yID0gY29sb3JbMF0KLSAgICAgICAgaWYgaXNpbnN0YW5jZShjb2xvciwgc3RyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShjb2xvciwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgICBpZiBzZWxmLl9pc2NvbG9yc3RyaW5nKGNvbG9yKSBvciBjb2xvciA9PSAiIjoKICAgICAgICAgICAgICAgICByZXR1cm4gY29sb3IKICAgICAgICAgICAgIGVsc2U6CkBAIC0xMjMzLDcgKzEyMzMsNyBAQAogICAgICAgICBzZWxmLl9kZWxheXZhbHVlID0gaW50KGRlbGF5KQogCiAgICAgZGVmIF9pbmNyZW1lbnR1ZGMoc2VsZik6Ci0gICAgICAgICIiIkluY3JlbWVudCB1cGFkYXRlIGNvdW50ZXIuIiIiCisgICAgICAgICIiIkluY3JlbWVudCB1cGRhdGUgY291bnRlci4iIiIKICAgICAgICAgaWYgbm90IFR1cnRsZVNjcmVlbi5fUlVOTklORzoKICAgICAgICAgICAgIFR1cnRsZVNjcmVlbi5fUlVOTk5JTkcgPSBUcnVlCiAgICAgICAgICAgICByYWlzZSBUZXJtaW5hdG9yCkBAIC0yNDM5LDcgKzI0MzksNyBAQAogICAgICAgICAgICAgICAgIHNlbGYuc2NyZWVuID0gVHVydGxlU2NyZWVuKGNhbnZhcykKICAgICAgICAgICAgICAgICBSYXdUdXJ0bGUuc2NyZWVucy5hcHBlbmQoc2VsZi5zY3JlZW4pCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZSBUdXJ0bGVHcmFwaGljc0Vycm9yKCJiYWQgY2F2YXMgYXJndW1lbnQgJXMiICUgY2FudmFzKQorICAgICAgICAgICAgcmFpc2UgVHVydGxlR3JhcGhpY3NFcnJvcigiYmFkIGNhbnZhcyBhcmd1bWVudCAlcyIgJSBjYW52YXMpCiAKICAgICAgICAgc2NyZWVuID0gc2VsZi5zY3JlZW4KICAgICAgICAgVE5hdmlnYXRvci5fX2luaXRfXyhzZWxmLCBzY3JlZW4ubW9kZSgpKQpAQCAtMjQ5OSw3ICsyNDk5LDcgQEAKICAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CiAgICAgICAgID4+PiB0dXJ0bGUuc2V0dW5kb2J1ZmZlcig0MikKICAgICAgICAgIiIiCi0gICAgICAgIGlmIHNpemUgaXMgTm9uZToKKyAgICAgICAgaWYgc2l6ZSBpcyBOb25lIG9yIHNpemUgPD0gMDoKICAgICAgICAgICAgIHNlbGYudW5kb2J1ZmZlciA9IE5vbmUKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYudW5kb2J1ZmZlciA9IFRidWZmZXIoc2l6ZSkKQEAgLTI2MDIsNyArMjYwMiw3IEBACiAgICAgZGVmIF9jYyhzZWxmLCBhcmdzKToKICAgICAgICAgIiIiQ29udmVydCBjb2xvcnRyaXBsZXMgdG8gaGV4c3RyaW5ncy4KICAgICAgICAgIiIiCi0gICAgICAgIGlmIGlzaW5zdGFuY2UoYXJncywgc3RyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShhcmdzLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgIHJldHVybiBhcmdzCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHIsIGcsIGIgPSBhcmdzCkBAIC0yNjg0LDcgKzI2ODQsNyBAQAogICAgIGRlZiBzaGFwZXNpemUoc2VsZiwgc3RyZXRjaF93aWQ9Tm9uZSwgc3RyZXRjaF9sZW49Tm9uZSwgb3V0bGluZT1Ob25lKToKICAgICAgICAgIiIiU2V0L3JldHVybiB0dXJ0bGUncyBzdHJldGNoZmFjdG9ycy9vdXRsaW5lLiBTZXQgcmVzaXplbW9kZSB0byAidXNlciIuCiAKLSAgICAgICAgT3B0aW5vbmFsIGFyZ3VtZW50czoKKyAgICAgICAgT3B0aW9uYWwgYXJndW1lbnRzOgogICAgICAgICAgICBzdHJldGNoX3dpZCA6IHBvc2l0aXZlIG51bWJlcgogICAgICAgICAgICBzdHJldGNoX2xlbiA6IHBvc2l0aXZlIG51bWJlcgogICAgICAgICAgICBvdXRsaW5lICA6IHBvc2l0aXZlIG51bWJlcgpAQCAtMjk3NSw3ICsyOTc1LDcgQEAKIAogICAgIGRlZiBfZ290byhzZWxmLCBlbmQpOgogICAgICAgICAiIiJNb3ZlIHRoZSBwZW4gdG8gdGhlIHBvaW50IGVuZCwgdGhlcmVieSBkcmF3aW5nIGEgbGluZQotICAgICAgICBpZiBwZW4gaXMgZG93bi4gQWxsIG90aGVyIG1ldGhvZGVzIGZvciB0dXJ0bGUgbW92ZW1lbnQgZGVwZW5kCisgICAgICAgIGlmIHBlbiBpcyBkb3duLiBBbGwgb3RoZXIgbWV0aG9kcyBmb3IgdHVydGxlIG1vdmVtZW50IGRlcGVuZAogICAgICAgICBvbiB0aGlzIG9uZS4KICAgICAgICAgIiIiCiAgICAgICAgICMjIFZlcnNpb24gbWl0IHVuZG8tc3R1ZmYKQEAgLTMyMjgsNyArMzIyOCw3IEBACiAgICAgICAgICIiIgogICAgICAgICAjcHJpbnQgImRvdC0xOiIsIHNpemUsIGNvbG9yCiAgICAgICAgIGlmIG5vdCBjb2xvcjoKLSAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2l6ZSwgKHN0ciwgdHVwbGUpKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2l6ZSwgKGJhc2VzdHJpbmcsIHR1cGxlKSk6CiAgICAgICAgICAgICAgICAgY29sb3IgPSBzZWxmLl9jb2xvcnN0cihzaXplKQogICAgICAgICAgICAgICAgIHNpemUgPSBzZWxmLl9wZW5zaXplICsgbWF4KHNlbGYuX3BlbnNpemUsIDQpCiAgICAgICAgICAgICBlbHNlOgpAQCAtMzkxMyw3ICszOTEzLDcgQEAKICAgICAgICAgZG93bigpCiAgICAgICAgICMgc29tZSB0ZXh0CiAgICAgICAgIHdyaXRlKCJzdGFydHN0YXJ0IiwgMSkKLSAgICAgICAgd3JpdGUoInN0YXJ0IiwgMSkKKyAgICAgICAgd3JpdGUodSJzdGFydCIsIDEpCiAgICAgICAgIGNvbG9yKCJyZWQiKQogICAgICAgICAjIHN0YWlyY2FzZQogICAgICAgICBmb3IgaSBpbiByYW5nZSg1KToKQEAgLTM5ODgsNyArMzk4OCw3IEBACiAgICAgICAgIHRyaSA9IGdldHR1cnRsZSgpCiAgICAgICAgIHRyaS5yZXNpemVtb2RlKCJhdXRvIikKICAgICAgICAgdHVydGxlID0gVHVydGxlKCkKLSAgICAgICAgdHVydGxlLnJlc2l6ZW1vZGUoImF1dG8iKQorICAgICAgICB0dXJ0bGUucmVzaXplbW9kZSh1ImF1dG8iKQogICAgICAgICB0dXJ0bGUuc2hhcGUoInR1cnRsZSIpCiAgICAgICAgIHR1cnRsZS5yZXNldCgpCiAgICAgICAgIHR1cnRsZS5sZWZ0KDkwKQpAQCAtMzk5OCw3ICszOTk4LDcgQEAKICAgICAgICAgdHVydGxlLmx0KDMwKQogICAgICAgICB0dXJ0bGUuZG93bigpCiAgICAgICAgIHR1cnRsZS5zcGVlZCg2KQotICAgICAgICB0dXJ0bGUuY29sb3IoImJsdWUiLCJvcmFuZ2UiKQorICAgICAgICB0dXJ0bGUuY29sb3IoImJsdWUiLHUib3JhbmdlIikKICAgICAgICAgdHVydGxlLnBlbnNpemUoMikKICAgICAgICAgdHJpLnNwZWVkKDYpCiAgICAgICAgIHNldGhlYWRpbmcodG93YXJkcyh0dXJ0bGUpKQpAQCAtNDAxMyw5ICs0MDEzLDkgQEAKICAgICAgICAgICAgICAgICB0cmkuc3RhbXAoKQogICAgICAgICAgICAgICAgIHN3aXRjaHBlbigpCiAgICAgICAgICAgICBjb3VudCArPSAxCi0gICAgICAgIHRyaS53cml0ZSgiQ0FVR0hUISAiLCBmb250PSgiQXJpYWwiLCAxNiwgImJvbGQiKSwgYWxpZ249InJpZ2h0IikKKyAgICAgICAgdHJpLndyaXRlKCJDQVVHSFQhICIsIGZvbnQ9KCJBcmlhbCIsIDE2LCAiYm9sZCIpLCBhbGlnbj11InJpZ2h0IikKICAgICAgICAgdHJpLnBlbmNvbG9yKCJibGFjayIpCi0gICAgICAgIHRyaS5wZW5jb2xvcigicmVkIikKKyAgICAgICAgdHJpLnBlbmNvbG9yKHUicmVkIikKIAogICAgICAgICBkZWYgYmFiYSh4ZHVtbXksIHlkdW1teSk6CiAgICAgICAgICAgICBjbGVhcnNjcmVlbigpCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9HcmFtbWFyLnR4dCBiL0xpYi9saWIydG8zL0dyYW1tYXIudHh0CmluZGV4IDhhOTY3MjYuLmU2NjdiY2QgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL0dyYW1tYXIudHh0CisrKyBiL0xpYi9saWIydG8zL0dyYW1tYXIudHh0CkBAIC0xLDQgKzEsNCBAQAotIyBHcmFtbWFyIGZvciBQeXRob24KKyMgR3JhbW1hciBmb3IgMnRvMy4gVGhpcyBncmFtbWFyIHN1cHBvcnRzIFB5dGhvbiAyLnggYW5kIDMueC4KIAogIyBOb3RlOiAgQ2hhbmdpbmcgdGhlIGdyYW1tYXIgc3BlY2lmaWVkIGluIHRoaXMgZmlsZSB3aWxsIG1vc3QgbGlrZWx5CiAjICAgICAgICByZXF1aXJlIGNvcnJlc3BvbmRpbmcgY2hhbmdlcyBpbiB0aGUgcGFyc2VyIG1vZHVsZQpAQCAtNTYsNyArNTYsNyBAQAogZXhwcl9zdG10OiB0ZXN0bGlzdF9zdGFyX2V4cHIgKGF1Z2Fzc2lnbiAoeWllbGRfZXhwcnx0ZXN0bGlzdCkgfAogICAgICAgICAgICAgICAgICAgICAgKCc9JyAoeWllbGRfZXhwcnx0ZXN0bGlzdF9zdGFyX2V4cHIpKSopCiB0ZXN0bGlzdF9zdGFyX2V4cHI6ICh0ZXN0fHN0YXJfZXhwcikgKCcsJyAodGVzdHxzdGFyX2V4cHIpKSogWycsJ10KLWF1Z2Fzc2lnbjogKCcrPScgfCAnLT0nIHwgJyo9JyB8ICcvPScgfCAnJT0nIHwgJyY9JyB8ICd8PScgfCAnXj0nIHwKK2F1Z2Fzc2lnbjogKCcrPScgfCAnLT0nIHwgJyo9JyB8ICdAPScgfCAnLz0nIHwgJyU9JyB8ICcmPScgfCAnfD0nIHwgJ149JyB8CiAgICAgICAgICAgICAnPDw9JyB8ICc+Pj0nIHwgJyoqPScgfCAnLy89JykKICMgRm9yIG5vcm1hbCBhc3NpZ25tZW50cywgYWRkaXRpb25hbCByZXN0cmljdGlvbnMgZW5mb3JjZWQgYnkgdGhlIGludGVycHJldGVyCiBwcmludF9zdG10OiAncHJpbnQnICggWyB0ZXN0ICgnLCcgdGVzdCkqIFsnLCddIF0gfApAQCAtMTE5LDcgKzExOSw3IEBACiBhbmRfZXhwcjogc2hpZnRfZXhwciAoJyYnIHNoaWZ0X2V4cHIpKgogc2hpZnRfZXhwcjogYXJpdGhfZXhwciAoKCc8PCd8Jz4+JykgYXJpdGhfZXhwcikqCiBhcml0aF9leHByOiB0ZXJtICgoJysnfCctJykgdGVybSkqCi10ZXJtOiBmYWN0b3IgKCgnKid8Jy8nfCclJ3wnLy8nKSBmYWN0b3IpKgordGVybTogZmFjdG9yICgoJyonfCdAJ3wnLyd8JyUnfCcvLycpIGZhY3RvcikqCiBmYWN0b3I6ICgnKyd8Jy0nfCd+JykgZmFjdG9yIHwgcG93ZXIKIHBvd2VyOiBhdG9tIHRyYWlsZXIqIFsnKionIGZhY3Rvcl0KIGF0b206ICgnKCcgW3lpZWxkX2V4cHJ8dGVzdGxpc3RfZ2V4cF0gJyknIHwKQEAgLTE1NSw0ICsxNTUsNSBAQAogIyBub3QgdXNlZCBpbiBncmFtbWFyLCBidXQgbWF5IGFwcGVhciBpbiAibm9kZSIgcGFzc2VkIGZyb20gUGFyc2VyIHRvIENvbXBpbGVyCiBlbmNvZGluZ19kZWNsOiBOQU1FCiAKLXlpZWxkX2V4cHI6ICd5aWVsZCcgW3Rlc3RsaXN0XQoreWllbGRfZXhwcjogJ3lpZWxkJyBbeWllbGRfYXJnXQoreWllbGRfYXJnOiAnZnJvbScgdGVzdCB8IHRlc3RsaXN0CmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcl91dGlsLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXJfdXRpbC5weQppbmRleCAzMGRhODkzLi43OGZkZjI2IDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcl91dGlsLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVyX3V0aWwucHkKQEAgLTE2NSw3ICsxNjUsNyBAQAogCiAKIGNvbnN1bWluZ19jYWxscyA9IHNldChbInNvcnRlZCIsICJsaXN0IiwgInNldCIsICJhbnkiLCAiYWxsIiwgInR1cGxlIiwgInN1bSIsCi0gICAgICAgICAgICAgICAgICAgICAgICJtaW4iLCAibWF4Il0pCisgICAgICAgICAgICAgICAgICAgICAgICJtaW4iLCAibWF4IiwgImVudW1lcmF0ZSJdKQogCiBkZWYgYXR0cl9jaGFpbihvYmosIGF0dHIpOgogICAgICIiIkZvbGxvdyBhbiBhdHRyaWJ1dGUgY2hhaW4uCkBAIC0xOTIsMTQgKzE5MiwxNCBAQAogcDEgPSAiIiIKIHBvd2VyPAogICAgICggJ2l0ZXInIHwgJ2xpc3QnIHwgJ3R1cGxlJyB8ICdzb3J0ZWQnIHwgJ3NldCcgfCAnc3VtJyB8Ci0gICAgICAnYW55JyB8ICdhbGwnIHwgKGFueSogdHJhaWxlcjwgJy4nICdqb2luJyA+KSApCisgICAgICAnYW55JyB8ICdhbGwnIHwgJ2VudW1lcmF0ZScgfCAoYW55KiB0cmFpbGVyPCAnLicgJ2pvaW4nID4pICkKICAgICB0cmFpbGVyPCAnKCcgbm9kZT1hbnkgJyknID4KICAgICBhbnkqCiA+CiAiIiIKIHAyID0gIiIiCiBwb3dlcjwKLSAgICAnc29ydGVkJworICAgICggJ3NvcnRlZCcgfCAnZW51bWVyYXRlJyApCiAgICAgdHJhaWxlcjwgJygnIGFyZ2xpc3Q8bm9kZT1hbnkgYW55Kj4gJyknID4KICAgICBhbnkqCiA+CkBAIC0yMDcsMTQgKzIwNywxNCBAQAogcGF0c19idWlsdCA9IEZhbHNlCiBkZWYgaW5fc3BlY2lhbF9jb250ZXh0KG5vZGUpOgogICAgICIiIiBSZXR1cm5zIHRydWUgaWYgbm9kZSBpcyBpbiBhbiBlbnZpcm9ubWVudCB3aGVyZSBhbGwgdGhhdCBpcyByZXF1aXJlZAotICAgICAgICBvZiBpdCBpcyBiZWluZyBpdHRlcmFibGUgKGllLCBpdCBkb2Vzbid0IG1hdHRlciBpZiBpdCByZXR1cm5zIGEgbGlzdAotICAgICAgICBvciBhbiBpdHRlcmF0b3IpLgorICAgICAgICBvZiBpdCBpcyBiZWluZyBpdGVyYWJsZSAoaWUsIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIGl0IHJldHVybnMgYSBsaXN0CisgICAgICAgIG9yIGFuIGl0ZXJhdG9yKS4KICAgICAgICAgU2VlIHRlc3RfbWFwX25vY2hhbmdlIGluIHRlc3RfZml4ZXJzLnB5IGZvciBzb21lIGV4YW1wbGVzIGFuZCB0ZXN0cy4KICAgICAgICAgIiIiCiAgICAgZ2xvYmFsIHAwLCBwMSwgcDIsIHBhdHNfYnVpbHQKICAgICBpZiBub3QgcGF0c19idWlsdDoKLSAgICAgICAgcDEgPSBwYXRjb21wLmNvbXBpbGVfcGF0dGVybihwMSkKICAgICAgICAgcDAgPSBwYXRjb21wLmNvbXBpbGVfcGF0dGVybihwMCkKKyAgICAgICAgcDEgPSBwYXRjb21wLmNvbXBpbGVfcGF0dGVybihwMSkKICAgICAgICAgcDIgPSBwYXRjb21wLmNvbXBpbGVfcGF0dGVybihwMikKICAgICAgICAgcGF0c19idWlsdCA9IFRydWUKICAgICBwYXR0ZXJucyA9IFtwMCwgcDEsIHAyXQpAQCAtMjc0LDkgKzI3NCw5IEBACiAgICAgIiIiRmluZCB0aGUgdG9wIGxldmVsIG5hbWVzcGFjZS4iIiIKICAgICAjIFNjYW1wZXIgdXAgdG8gdGhlIHRvcCBsZXZlbCBuYW1lc3BhY2UKICAgICB3aGlsZSBub2RlLnR5cGUgIT0gc3ltcy5maWxlX2lucHV0OgotICAgICAgICBhc3NlcnQgbm9kZS5wYXJlbnQsICJUcmVlIGlzIGluc2FuZSEgcm9vdCBmb3VuZCBiZWZvcmUgIlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlX2lucHV0IG5vZGUgd2FzIGZvdW5kLiIKICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50CisgICAgICAgIGlmIG5vdCBub2RlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicm9vdCBmb3VuZCBiZWZvcmUgZmlsZV9pbnB1dCBub2RlIHdhcyBmb3VuZC4iKQogICAgIHJldHVybiBub2RlCiAKIGRlZiBkb2VzX3RyZWVfaW1wb3J0KHBhY2thZ2UsIG5hbWUsIG5vZGUpOgpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydC5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9pbXBvcnQucHkKaW5kZXggMjAxZTgxMS4uODhlOWQxMCAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydC5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfaW1wb3J0LnB5CkBAIC0zMiw3ICszMiw3IEBACiAgICAgICAgIGVsaWYgbm9kZS50eXBlID09IHN5bXMuZG90dGVkX2FzX25hbWVzOgogICAgICAgICAgICAgcGVuZGluZy5leHRlbmQobm9kZS5jaGlsZHJlbls6Oi0yXSkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJ1bmtvd24gbm9kZSB0eXBlIikKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJ1bmtub3duIG5vZGUgdHlwZSIpCiAKIAogY2xhc3MgRml4SW1wb3J0KGZpeGVyX2Jhc2UuQmFzZUZpeCk6CmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfaXRlcnRvb2xzLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2l0ZXJ0b29scy5weQppbmRleCAyN2Y4YTQ5Li4wNjc2NDFiIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfaXRlcnRvb2xzLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9pdGVydG9vbHMucHkKQEAgLTM0LDggKzM0LDggQEAKICAgICAgICAgICAgICMgUmVtb3ZlIHRoZSAnaXRlcnRvb2xzJwogICAgICAgICAgICAgcHJlZml4ID0gaXQucHJlZml4CiAgICAgICAgICAgICBpdC5yZW1vdmUoKQotICAgICAgICAgICAgIyBSZXBsYWNlIHRoZSBub2RlIHdpY2ggY29udGFpbnMgKCcuJywgJ2Z1bmN0aW9uJykgd2l0aCB0aGUKLSAgICAgICAgICAgICMgZnVuY3Rpb24gKHRvIGJlIGNvbnNpc3RhbnQgd2l0aCB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlIHBhdHRlcm4pCisgICAgICAgICAgICAjIFJlcGxhY2UgdGhlIG5vZGUgd2hpY2ggY29udGFpbnMgKCcuJywgJ2Z1bmN0aW9uJykgd2l0aCB0aGUKKyAgICAgICAgICAgICMgZnVuY3Rpb24gKHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlIHBhdHRlcm4pCiAgICAgICAgICAgICBkb3QucmVtb3ZlKCkKICAgICAgICAgICAgIGZ1bmMucGFyZW50LnJlcGxhY2UoZnVuYykKIApkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X21ldGFjbGFzcy5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9tZXRhY2xhc3MucHkKaW5kZXggYzg2ZmJlYS4uNGY1NTkzYyAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X21ldGFjbGFzcy5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfbWV0YWNsYXNzLnB5CkBAIC03MSw3ICs3MSw3IEBACiBkZWYgZml4dXBfc2ltcGxlX3N0bXQocGFyZW50LCBpLCBzdG10X25vZGUpOgogICAgICIiIiBpZiB0aGVyZSBpcyBhIHNlbWktY29sb24gYWxsIHRoZSBwYXJ0cyBjb3VudCBhcyBwYXJ0IG9mIHRoZSBzYW1lCiAgICAgICAgIHNpbXBsZV9zdG10LiAgV2UganVzdCB3YW50IHRoZSBfX21ldGFjbGFzc19fIHBhcnQgc28gd2UgbW92ZQotICAgICAgICBldmVyeXRoaW5nIGVmdGVyIHRoZSBzZW1pLWNvbG9uIGludG8gaXRzIG93biBzaW1wbGVfc3RtdCBub2RlCisgICAgICAgIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIHNlbWktY29sb24gaW50byBpdHMgb3duIHNpbXBsZV9zdG10IG5vZGUKICAgICAiIiIKICAgICBmb3Igc2VtaV9pbmQsIG5vZGUgaW4gZW51bWVyYXRlKHN0bXRfbm9kZS5jaGlsZHJlbik6CiAgICAgICAgIGlmIG5vZGUudHlwZSA9PSB0b2tlbi5TRU1JOiAjICpzaWdoKgpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3VuaWNvZGUucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfdW5pY29kZS5weQppbmRleCA2Yzg5NTc2Li4yZDc3NmY2IDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfdW5pY29kZS5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfdW5pY29kZS5weQpAQCAtMSwyNSArMSw0MiBAQAotIiIiRml4ZXIgdGhhdCBjaGFuZ2VzIHVuaWNvZGUgdG8gc3RyLCB1bmljaHIgdG8gY2hyLCBhbmQgdSIuLi4iIGludG8gIi4uLiIuCityIiIiRml4ZXIgZm9yIHVuaWNvZGUuCisKKyogQ2hhbmdlcyB1bmljb2RlIHRvIHN0ciBhbmQgdW5pY2hyIHRvIGNoci4KKworKiBJZiAiLi4uXHUuLi4iIGlzIG5vdCB1bmljb2RlIGxpdGVyYWwgY2hhbmdlIGl0IGludG8gIi4uLlxcdS4uLiIuCisKKyogQ2hhbmdlIHUiLi4uIiBpbnRvICIuLi4iLgogCiAiIiIKIAotaW1wb3J0IHJlCiBmcm9tIC4ucGdlbjIgaW1wb3J0IHRva2VuCiBmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCiAKIF9tYXBwaW5nID0ge3UidW5pY2hyIiA6IHUiY2hyIiwgdSJ1bmljb2RlIiA6IHUic3RyIn0KLV9saXRlcmFsX3JlID0gcmUuY29tcGlsZSh1ciJbdVVdW3JSXT9bXCdcIl0iKQogCiBjbGFzcyBGaXhVbmljb2RlKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CiAgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKICAgICBQQVRURVJOID0gIlNUUklORyB8ICd1bmljb2RlJyB8ICd1bmljaHInIgogCisgICAgZGVmIHN0YXJ0X3RyZWUoc2VsZiwgdHJlZSwgZmlsZW5hbWUpOgorICAgICAgICBzdXBlcihGaXhVbmljb2RlLCBzZWxmKS5zdGFydF90cmVlKHRyZWUsIGZpbGVuYW1lKQorICAgICAgICBzZWxmLnVuaWNvZGVfbGl0ZXJhbHMgPSAndW5pY29kZV9saXRlcmFscycgaW4gdHJlZS5mdXR1cmVfZmVhdHVyZXMKKwogICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CiAgICAgICAgIGlmIG5vZGUudHlwZSA9PSB0b2tlbi5OQU1FOgogICAgICAgICAgICAgbmV3ID0gbm9kZS5jbG9uZSgpCiAgICAgICAgICAgICBuZXcudmFsdWUgPSBfbWFwcGluZ1tub2RlLnZhbHVlXQogICAgICAgICAgICAgcmV0dXJuIG5ldwogICAgICAgICBlbGlmIG5vZGUudHlwZSA9PSB0b2tlbi5TVFJJTkc6Ci0gICAgICAgICAgICBpZiBfbGl0ZXJhbF9yZS5tYXRjaChub2RlLnZhbHVlKToKLSAgICAgICAgICAgICAgICBuZXcgPSBub2RlLmNsb25lKCkKLSAgICAgICAgICAgICAgICBuZXcudmFsdWUgPSBuZXcudmFsdWVbMTpdCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldworICAgICAgICAgICAgdmFsID0gbm9kZS52YWx1ZQorICAgICAgICAgICAgaWYgbm90IHNlbGYudW5pY29kZV9saXRlcmFscyBhbmQgdmFsWzBdIGluIHUnXCciJyBhbmQgdSdcXCcgaW4gdmFsOgorICAgICAgICAgICAgICAgIHZhbCA9IHVyJ1xcJy5qb2luKFsKKyAgICAgICAgICAgICAgICAgICAgdi5yZXBsYWNlKHUnXFx1JywgdXInXFx1JykucmVwbGFjZSh1J1xcVScsIHVyJ1xcVScpCisgICAgICAgICAgICAgICAgICAgIGZvciB2IGluIHZhbC5zcGxpdCh1cidcXCcpCisgICAgICAgICAgICAgICAgXSkKKyAgICAgICAgICAgIGlmIHZhbFswXSBpbiB1J3VVJzoKKyAgICAgICAgICAgICAgICB2YWwgPSB2YWxbMTpdCisgICAgICAgICAgICBpZiB2YWwgPT0gbm9kZS52YWx1ZToKKyAgICAgICAgICAgICAgICByZXR1cm4gbm9kZQorICAgICAgICAgICAgbmV3ID0gbm9kZS5jbG9uZSgpCisgICAgICAgICAgICBuZXcudmFsdWUgPSB2YWwKKyAgICAgICAgICAgIHJldHVybiBuZXcKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL21haW4ucHkgYi9MaWIvbGliMnRvMy9tYWluLnB5CmluZGV4IDM5MjlkYjcuLmFkMDYyNWUgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL21haW4ucHkKKysrIGIvTGliL2xpYjJ0bzMvbWFpbi5weQpAQCAtMjUsMTIgKzI1LDQxIEBACiAKIGNsYXNzIFN0ZG91dFJlZmFjdG9yaW5nVG9vbChyZWZhY3Rvci5NdWx0aXByb2Nlc3NSZWZhY3RvcmluZ1Rvb2wpOgogICAgICIiIgorICAgIEEgcmVmYWN0b3JpbmcgdG9vbCB0aGF0IGNhbiBhdm9pZCBvdmVyd3JpdGluZyBpdHMgaW5wdXQgZmlsZXMuCiAgICAgUHJpbnRzIG91dHB1dCB0byBzdGRvdXQuCisKKyAgICBPdXRwdXQgZmlsZXMgY2FuIG9wdGlvbmFsbHkgYmUgd3JpdHRlbiB0byBhIGRpZmZlcmVudCBkaXJlY3RvcnkgYW5kIG9yCisgICAgaGF2ZSBhbiBleHRyYSBmaWxlIHN1ZmZpeCBhcHBlbmRlZCB0byB0aGVpciBuYW1lIGZvciB1c2UgaW4gc2l0dWF0aW9ucworICAgIHdoZXJlIHlvdSBkbyBub3Qgd2FudCB0byByZXBsYWNlIHRoZSBpbnB1dCBmaWxlcy4KICAgICAiIiIKIAotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaXhlcnMsIG9wdGlvbnMsIGV4cGxpY2l0LCBub2JhY2t1cHMsIHNob3dfZGlmZnMpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaXhlcnMsIG9wdGlvbnMsIGV4cGxpY2l0LCBub2JhY2t1cHMsIHNob3dfZGlmZnMsCisgICAgICAgICAgICAgICAgIGlucHV0X2Jhc2VfZGlyPScnLCBvdXRwdXRfZGlyPScnLCBhcHBlbmRfc3VmZml4PScnKToKKyAgICAgICAgIiIiCisgICAgICAgIEFyZ3M6CisgICAgICAgICAgICBmaXhlcnM6IEEgbGlzdCBvZiBmaXhlcnMgdG8gaW1wb3J0LgorICAgICAgICAgICAgb3B0aW9uczogQSBkaWN0IHdpdGggUmVmYWN0b3JpbmdUb29sIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAgICBleHBsaWNpdDogQSBsaXN0IG9mIGZpeGVycyB0byBydW4gZXZlbiBpZiB0aGV5IGFyZSBleHBsaWNpdC4KKyAgICAgICAgICAgIG5vYmFja3VwczogSWYgdHJ1ZSBubyBiYWNrdXAgJy5iYWsnIGZpbGVzIHdpbGwgYmUgY3JlYXRlZCBmb3IgdGhvc2UKKyAgICAgICAgICAgICAgICBmaWxlcyB0aGF0IGFyZSBiZWluZyByZWZhY3RvcmVkLgorICAgICAgICAgICAgc2hvd19kaWZmczogU2hvdWxkIGRpZmZzIG9mIHRoZSByZWZhY3RvcmluZyBiZSBwcmludGVkIHRvIHN0ZG91dD8KKyAgICAgICAgICAgIGlucHV0X2Jhc2VfZGlyOiBUaGUgYmFzZSBkaXJlY3RvcnkgZm9yIGFsbCBpbnB1dCBmaWxlcy4gIFRoaXMgY2xhc3MKKyAgICAgICAgICAgICAgICB3aWxsIHN0cmlwIHRoaXMgcGF0aCBwcmVmaXggb2ZmIG9mIGZpbGVuYW1lcyBiZWZvcmUgc3Vic3RpdHV0aW5nCisgICAgICAgICAgICAgICAgaXQgd2l0aCBvdXRwdXRfZGlyLiAgT25seSBtZWFuaW5nZnVsIGlmIG91dHB1dF9kaXIgaXMgc3VwcGxpZWQuCisgICAgICAgICAgICAgICAgQWxsIGZpbGVzIHByb2Nlc3NlZCBieSByZWZhY3RvcigpIG11c3Qgc3RhcnQgd2l0aCB0aGlzIHBhdGguCisgICAgICAgICAgICBvdXRwdXRfZGlyOiBJZiBzdXBwbGllZCwgYWxsIGNvbnZlcnRlZCBmaWxlcyB3aWxsIGJlIHdyaXR0ZW4gaW50bworICAgICAgICAgICAgICAgIHRoaXMgZGlyZWN0b3J5IHRyZWUgaW5zdGVhZCBvZiBpbnB1dF9iYXNlX2Rpci4KKyAgICAgICAgICAgIGFwcGVuZF9zdWZmaXg6IElmIHN1cHBsaWVkLCBhbGwgZmlsZXMgb3V0cHV0IGJ5IHRoaXMgdG9vbCB3aWxsIGhhdmUKKyAgICAgICAgICAgICAgICB0aGlzIGFwcGVuZGVkIHRvIHRoZWlyIGZpbGVuYW1lLiAgVXNlZnVsIGZvciBjaGFuZ2luZyAucHkgdG8KKyAgICAgICAgICAgICAgICAucHkzIGZvciBleGFtcGxlIGJ5IHBhc3NpbmcgYXBwZW5kX3N1ZmZpeD0nMycuCisgICAgICAgICIiIgogICAgICAgICBzZWxmLm5vYmFja3VwcyA9IG5vYmFja3VwcwogICAgICAgICBzZWxmLnNob3dfZGlmZnMgPSBzaG93X2RpZmZzCisgICAgICAgIGlmIGlucHV0X2Jhc2VfZGlyIGFuZCBub3QgaW5wdXRfYmFzZV9kaXIuZW5kc3dpdGgob3Muc2VwKToKKyAgICAgICAgICAgIGlucHV0X2Jhc2VfZGlyICs9IG9zLnNlcAorICAgICAgICBzZWxmLl9pbnB1dF9iYXNlX2RpciA9IGlucHV0X2Jhc2VfZGlyCisgICAgICAgIHNlbGYuX291dHB1dF9kaXIgPSBvdXRwdXRfZGlyCisgICAgICAgIHNlbGYuX2FwcGVuZF9zdWZmaXggPSBhcHBlbmRfc3VmZml4CiAgICAgICAgIHN1cGVyKFN0ZG91dFJlZmFjdG9yaW5nVG9vbCwgc2VsZikuX19pbml0X18oZml4ZXJzLCBvcHRpb25zLCBleHBsaWNpdCkKIAogICAgIGRlZiBsb2dfZXJyb3Ioc2VsZiwgbXNnLCAqYXJncywgKiprd2FyZ3MpOgpAQCAtMzgsNiArNjcsMjMgQEAKICAgICAgICAgc2VsZi5sb2dnZXIuZXJyb3IobXNnLCAqYXJncywgKiprd2FyZ3MpCiAKICAgICBkZWYgd3JpdGVfZmlsZShzZWxmLCBuZXdfdGV4dCwgZmlsZW5hbWUsIG9sZF90ZXh0LCBlbmNvZGluZyk6CisgICAgICAgIG9yaWdfZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBpZiBzZWxmLl9vdXRwdXRfZGlyOgorICAgICAgICAgICAgaWYgZmlsZW5hbWUuc3RhcnRzd2l0aChzZWxmLl9pbnB1dF9iYXNlX2Rpcik6CisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5fb3V0cHV0X2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZVtsZW4oc2VsZi5faW5wdXRfYmFzZV9kaXIpOl0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2ZpbGVuYW1lICVzIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbnB1dF9iYXNlX2RpciAlcycgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBzZWxmLl9pbnB1dF9iYXNlX2RpcikpCisgICAgICAgIGlmIHNlbGYuX2FwcGVuZF9zdWZmaXg6CisgICAgICAgICAgICBmaWxlbmFtZSArPSBzZWxmLl9hcHBlbmRfc3VmZml4CisgICAgICAgIGlmIG9yaWdfZmlsZW5hbWUgIT0gZmlsZW5hbWU6CisgICAgICAgICAgICBvdXRwdXRfZGlyID0gb3MucGF0aC5kaXJuYW1lKGZpbGVuYW1lKQorICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIob3V0cHV0X2Rpcik6CisgICAgICAgICAgICAgICAgb3MubWFrZWRpcnMob3V0cHV0X2RpcikKKyAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoJ1dyaXRpbmcgY29udmVydGVkICVzIHRvICVzLicsIG9yaWdfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lKQogICAgICAgICBpZiBub3Qgc2VsZi5ub2JhY2t1cHM6CiAgICAgICAgICAgICAjIE1ha2UgYmFja3VwCiAgICAgICAgICAgICBiYWNrdXAgPSBmaWxlbmFtZSArICIuYmFrIgpAQCAtNTUsNiArMTAxLDkgQEAKICAgICAgICAgd3JpdGUobmV3X3RleHQsIGZpbGVuYW1lLCBvbGRfdGV4dCwgZW5jb2RpbmcpCiAgICAgICAgIGlmIG5vdCBzZWxmLm5vYmFja3VwczoKICAgICAgICAgICAgIHNodXRpbC5jb3B5bW9kZShiYWNrdXAsIGZpbGVuYW1lKQorICAgICAgICBpZiBvcmlnX2ZpbGVuYW1lICE9IGZpbGVuYW1lOgorICAgICAgICAgICAgIyBQcmVzZXJ2ZSB0aGUgZmlsZSBtb2RlIGluIHRoZSBuZXcgb3V0cHV0IGRpcmVjdG9yeS4KKyAgICAgICAgICAgIHNodXRpbC5jb3B5bW9kZShvcmlnX2ZpbGVuYW1lLCBmaWxlbmFtZSkKIAogICAgIGRlZiBwcmludF9vdXRwdXQoc2VsZiwgb2xkLCBuZXcsIGZpbGVuYW1lLCBlcXVhbCk6CiAgICAgICAgIGlmIGVxdWFsOgpAQCAtMTE0LDExICsxNjMsMzMgQEAKICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJXcml0ZSBiYWNrIG1vZGlmaWVkIGZpbGVzIikKICAgICBwYXJzZXIuYWRkX29wdGlvbigiLW4iLCAiLS1ub2JhY2t1cHMiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZWZhdWx0PUZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkRvbid0IHdyaXRlIGJhY2t1cHMgZm9yIG1vZGlmaWVkIGZpbGVzIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLW8iLCAiLS1vdXRwdXQtZGlyIiwgYWN0aW9uPSJzdG9yZSIsIHR5cGU9InN0ciIsCisgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iIiwgaGVscD0iUHV0IG91dHB1dCBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSAiCisgICAgICAgICAgICAgICAgICAgICAgImluc3RlYWQgb2Ygb3ZlcndyaXRpbmcgdGhlIGlucHV0IGZpbGVzLiAgUmVxdWlyZXMgLW4uIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLVciLCAiLS13cml0ZS11bmNoYW5nZWQtZmlsZXMiLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkFsc28gd3JpdGUgZmlsZXMgZXZlbiBpZiBubyBjaGFuZ2VzIHdlcmUgcmVxdWlyZWQiCisgICAgICAgICAgICAgICAgICAgICAgIiAodXNlZnVsIHdpdGggLS1vdXRwdXQtZGlyKTsgaW1wbGllcyAtdy4iKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLWFkZC1zdWZmaXgiLCBhY3Rpb249InN0b3JlIiwgdHlwZT0ic3RyIiwgZGVmYXVsdD0iIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJBcHBlbmQgdGhpcyBzdHJpbmcgdG8gYWxsIG91dHB1dCBmaWxlbmFtZXMuIgorICAgICAgICAgICAgICAgICAgICAgICIgUmVxdWlyZXMgLW4gaWYgbm9uLWVtcHR5LiAgIgorICAgICAgICAgICAgICAgICAgICAgICJleDogLS1hZGQtc3VmZml4PSczJyB3aWxsIGdlbmVyYXRlIC5weTMgZmlsZXMuIikKIAogICAgICMgUGFyc2UgY29tbWFuZCBsaW5lIGFyZ3VtZW50cwogICAgIHJlZmFjdG9yX3N0ZGluID0gRmFsc2UKICAgICBmbGFncyA9IHt9CiAgICAgb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3MpCisgICAgaWYgb3B0aW9ucy53cml0ZV91bmNoYW5nZWRfZmlsZXM6CisgICAgICAgIGZsYWdzWyJ3cml0ZV91bmNoYW5nZWRfZmlsZXMiXSA9IFRydWUKKyAgICAgICAgaWYgbm90IG9wdGlvbnMud3JpdGU6CisgICAgICAgICAgICB3YXJuKCItLXdyaXRlLXVuY2hhbmdlZC1maWxlcy8tVyBpbXBsaWVzIC13LiIpCisgICAgICAgIG9wdGlvbnMud3JpdGUgPSBUcnVlCisgICAgIyBJZiB3ZSBhbGxvd2VkIHRoZXNlLCB0aGUgb3JpZ2luYWwgZmlsZXMgd291bGQgYmUgcmVuYW1lZCB0byBiYWNrdXAgbmFtZXMKKyAgICAjIGJ1dCBub3QgcmVwbGFjZWQuCisgICAgaWYgb3B0aW9ucy5vdXRwdXRfZGlyIGFuZCBub3Qgb3B0aW9ucy5ub2JhY2t1cHM6CisgICAgICAgIHBhcnNlci5lcnJvcigiQ2FuJ3QgdXNlIC0tb3V0cHV0LWRpci8tbyB3aXRob3V0IC1uLiIpCisgICAgaWYgb3B0aW9ucy5hZGRfc3VmZml4IGFuZCBub3Qgb3B0aW9ucy5ub2JhY2t1cHM6CisgICAgICAgIHBhcnNlci5lcnJvcigiQ2FuJ3QgdXNlIC0tYWRkLXN1ZmZpeCB3aXRob3V0IC1uLiIpCisKICAgICBpZiBub3Qgb3B0aW9ucy53cml0ZSBhbmQgb3B0aW9ucy5ub19kaWZmczoKICAgICAgICAgd2Fybigibm90IHdyaXRpbmcgZmlsZXMgYW5kIG5vdCBwcmludGluZyBkaWZmczsgdGhhdCdzIG5vdCB2ZXJ5IHVzZWZ1bCIpCiAgICAgaWYgbm90IG9wdGlvbnMud3JpdGUgYW5kIG9wdGlvbnMubm9iYWNrdXBzOgpAQCAtMTQ0LDYgKzIxNSw3IEBACiAgICAgIyBTZXQgdXAgbG9nZ2luZyBoYW5kbGVyCiAgICAgbGV2ZWwgPSBsb2dnaW5nLkRFQlVHIGlmIG9wdGlvbnMudmVyYm9zZSBlbHNlIGxvZ2dpbmcuSU5GTwogICAgIGxvZ2dpbmcuYmFzaWNDb25maWcoZm9ybWF0PSclKG5hbWUpczogJShtZXNzYWdlKXMnLCBsZXZlbD1sZXZlbCkKKyAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcignbGliMnRvMy5tYWluJykKIAogICAgICMgSW5pdGlhbGl6ZSB0aGUgcmVmYWN0b3JpbmcgdG9vbAogICAgIGF2YWlsX2ZpeGVzID0gc2V0KHJlZmFjdG9yLmdldF9maXhlcnNfZnJvbV9wYWNrYWdlKGZpeGVyX3BrZykpCkBAIC0xNjAsOCArMjMyLDIzIEBACiAgICAgZWxzZToKICAgICAgICAgcmVxdWVzdGVkID0gYXZhaWxfZml4ZXMudW5pb24oZXhwbGljaXQpCiAgICAgZml4ZXJfbmFtZXMgPSByZXF1ZXN0ZWQuZGlmZmVyZW5jZSh1bndhbnRlZF9maXhlcykKLSAgICBydCA9IFN0ZG91dFJlZmFjdG9yaW5nVG9vbChzb3J0ZWQoZml4ZXJfbmFtZXMpLCBmbGFncywgc29ydGVkKGV4cGxpY2l0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm5vYmFja3Vwcywgbm90IG9wdGlvbnMubm9fZGlmZnMpCisgICAgaW5wdXRfYmFzZV9kaXIgPSBvcy5wYXRoLmNvbW1vbnByZWZpeChhcmdzKQorICAgIGlmIChpbnB1dF9iYXNlX2RpciBhbmQgbm90IGlucHV0X2Jhc2VfZGlyLmVuZHN3aXRoKG9zLnNlcCkKKyAgICAgICAgYW5kIG5vdCBvcy5wYXRoLmlzZGlyKGlucHV0X2Jhc2VfZGlyKSk6CisgICAgICAgICMgT25lIG9yIG1vcmUgc2ltaWxhciBuYW1lcyB3ZXJlIHBhc3NlZCwgdGhlaXIgZGlyZWN0b3J5IGlzIHRoZSBiYXNlLgorICAgICAgICAjIG9zLnBhdGguY29tbW9ucHJlZml4KCkgaXMgaWdub3JhbnQgb2YgcGF0aCBlbGVtZW50cywgdGhpcyBjb3JyZWN0cworICAgICAgICAjIGZvciB0aGF0IHdlaXJkIEFQSS4KKyAgICAgICAgaW5wdXRfYmFzZV9kaXIgPSBvcy5wYXRoLmRpcm5hbWUoaW5wdXRfYmFzZV9kaXIpCisgICAgaWYgb3B0aW9ucy5vdXRwdXRfZGlyOgorICAgICAgICBpbnB1dF9iYXNlX2RpciA9IGlucHV0X2Jhc2VfZGlyLnJzdHJpcChvcy5zZXApCisgICAgICAgIGxvZ2dlci5pbmZvKCdPdXRwdXQgaW4gJXIgd2lsbCBtaXJyb3IgdGhlIGlucHV0IGRpcmVjdG9yeSAlciBsYXlvdXQuJywKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vdXRwdXRfZGlyLCBpbnB1dF9iYXNlX2RpcikKKyAgICBydCA9IFN0ZG91dFJlZmFjdG9yaW5nVG9vbCgKKyAgICAgICAgICAgIHNvcnRlZChmaXhlcl9uYW1lcyksIGZsYWdzLCBzb3J0ZWQoZXhwbGljaXQpLAorICAgICAgICAgICAgb3B0aW9ucy5ub2JhY2t1cHMsIG5vdCBvcHRpb25zLm5vX2RpZmZzLAorICAgICAgICAgICAgaW5wdXRfYmFzZV9kaXI9aW5wdXRfYmFzZV9kaXIsCisgICAgICAgICAgICBvdXRwdXRfZGlyPW9wdGlvbnMub3V0cHV0X2RpciwKKyAgICAgICAgICAgIGFwcGVuZF9zdWZmaXg9b3B0aW9ucy5hZGRfc3VmZml4KQogCiAgICAgIyBSZWZhY3RvciBhbGwgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHBhc3NlZCBhcyBhcmd1bWVudHMKICAgICBpZiBub3QgcnQuZXJyb3JzOgpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvcGdlbjIvZHJpdmVyLnB5IGIvTGliL2xpYjJ0bzMvcGdlbjIvZHJpdmVyLnB5CmluZGV4IDE2YWRlYzAuLjM5ZGFmYjkgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL3BnZW4yL2RyaXZlci5weQorKysgYi9MaWIvbGliMnRvMy9wZ2VuMi9kcml2ZXIucHkKQEAgLTEzOCwzICsxMzgsMjAgQEAKICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoYik6CiAgICAgICAgIHJldHVybiBUcnVlCiAgICAgcmV0dXJuIG9zLnBhdGguZ2V0bXRpbWUoYSkgPj0gb3MucGF0aC5nZXRtdGltZShiKQorCisKK2RlZiBtYWluKCphcmdzKToKKyAgICAiIiJNYWluIHByb2dyYW0sIHdoZW4gcnVuIGFzIGEgc2NyaXB0OiBwcm9kdWNlIGdyYW1tYXIgcGlja2xlIGZpbGVzLgorCisgICAgQ2FsbHMgbG9hZF9ncmFtbWFyIGZvciBlYWNoIGFyZ3VtZW50LCBhIHBhdGggdG8gYSBncmFtbWFyIHRleHQgZmlsZS4KKyAgICAiIiIKKyAgICBpZiBub3QgYXJnczoKKyAgICAgICAgYXJncyA9IHN5cy5hcmd2WzE6XQorICAgIGxvZ2dpbmcuYmFzaWNDb25maWcobGV2ZWw9bG9nZ2luZy5JTkZPLCBzdHJlYW09c3lzLnN0ZG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdD0nJShtZXNzYWdlKXMnKQorICAgIGZvciBndCBpbiBhcmdzOgorICAgICAgICBsb2FkX2dyYW1tYXIoZ3QsIHNhdmU9VHJ1ZSwgZm9yY2U9VHJ1ZSkKKyAgICByZXR1cm4gVHJ1ZQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHN5cy5leGl0KGludChub3QgbWFpbigpKSkKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3BnZW4yL2dyYW1tYXIucHkgYi9MaWIvbGliMnRvMy9wZ2VuMi9ncmFtbWFyLnB5CmluZGV4IDA0ODM0MjQuLjgyMjBiMGEgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL3BnZW4yL2dyYW1tYXIucHkKKysrIGIvTGliL2xpYjJ0bzMvcGdlbjIvZ3JhbW1hci5weQpAQCAtMjAsNyArMjAsNyBAQAogCiAKIGNsYXNzIEdyYW1tYXIob2JqZWN0KToKLSAgICAiIiJQZ2VuIHBhcnNpbmcgdGFibGVzIHRhYmxlcyBjb252ZXJzaW9uIGNsYXNzLgorICAgICIiIlBnZW4gcGFyc2luZyB0YWJsZXMgY29udmVyc2lvbiBjbGFzcy4KIAogICAgIE9uY2UgaW5pdGlhbGl6ZWQsIHRoaXMgY2xhc3Mgc3VwcGxpZXMgdGhlIGdyYW1tYXIgdGFibGVzIGZvciB0aGUKICAgICBwYXJzaW5nIGVuZ2luZSBpbXBsZW1lbnRlZCBieSBwYXJzZS5weS4gIFRoZSBwYXJzaW5nIGVuZ2luZQpAQCAtNDUsNyArNDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgdGhlc2UgdHdvIGFyZSBlYWNoIG90aGVyJ3MgaW52ZXJzZS4KIAogICAgIHN0YXRlcyAgICAgICAgLS0gYSBsaXN0IG9mIERGQXMsIHdoZXJlIGVhY2ggREZBIGlzIGEgbGlzdCBvZgotICAgICAgICAgICAgICAgICAgICAgc3RhdGVzLCBlYWNoIHN0YXRlIGlzIGlzIGEgbGlzdCBvZiBhcmNzLCBhbmQgZWFjaAorICAgICAgICAgICAgICAgICAgICAgc3RhdGVzLCBlYWNoIHN0YXRlIGlzIGEgbGlzdCBvZiBhcmNzLCBhbmQgZWFjaAogICAgICAgICAgICAgICAgICAgICAgYXJjIGlzIGEgKGksIGopIHBhaXIgd2hlcmUgaSBpcyBhIGxhYmVsIGFuZCBqIGlzCiAgICAgICAgICAgICAgICAgICAgICBhIHN0YXRlIG51bWJlci4gIFRoZSBERkEgbnVtYmVyIGlzIHRoZSBpbmRleCBpbnRvCiAgICAgICAgICAgICAgICAgICAgICB0aGlzIGxpc3QuICAoVGhpcyBuYW1lIGlzIHNsaWdodGx5IGNvbmZ1c2luZy4pCkBAIC0xNTEsNiArMTUxLDcgQEAKIHsgTEJSQUNFCiB9IFJCUkFDRQogQCBBVAorQD0gQVRFUVVBTAogPT0gRVFFUVVBTAogIT0gTk9URVFVQUwKIDw+IE5PVEVRVUFMCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9wZ2VuMi90b2tlbi5weSBiL0xpYi9saWIydG8zL3BnZW4yL3Rva2VuLnB5CmluZGV4IDYxNDY4YjMuLjVmYWM1Y2UgMTAwNzU1Ci0tLSBhL0xpYi9saWIydG8zL3BnZW4yL3Rva2VuLnB5CisrKyBiL0xpYi9saWIydG8zL3BnZW4yL3Rva2VuLnB5CkBAIC01NywxMiArNTcsMTMgQEAKIERPVUJMRVNMQVNIID0gNDgKIERPVUJMRVNMQVNIRVFVQUwgPSA0OQogQVQgPSA1MAotT1AgPSA1MQotQ09NTUVOVCA9IDUyCi1OTCA9IDUzCi1SQVJST1cgPSA1NAotRVJST1JUT0tFTiA9IDU1Ci1OX1RPS0VOUyA9IDU2CitBVEVRVUFMID0gNTEKK09QID0gNTIKK0NPTU1FTlQgPSA1MworTkwgPSA1NAorUkFSUk9XID0gNTUKK0VSUk9SVE9LRU4gPSA1NgorTl9UT0tFTlMgPSA1NwogTlRfT0ZGU0VUID0gMjU2CiAjLS1lbmQgY29uc3RhbnRzLS0KIApkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvcGdlbjIvdG9rZW5pemUucHkgYi9MaWIvbGliMnRvMy9wZ2VuMi90b2tlbml6ZS5weQppbmRleCBlMDkwYWE5Li40Y2IyYTQxIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9wZ2VuMi90b2tlbml6ZS5weQorKysgYi9MaWIvbGliMnRvMy9wZ2VuMi90b2tlbml6ZS5weQpAQCAtODQsNyArODQsNyBAQAogIyByZWNvZ25pemVkIGFzIHR3byBpbnN0YW5jZXMgb2YgPSkuCiBPcGVyYXRvciA9IGdyb3VwKHIiXCpcKj0/IiwgciI+Pj0/IiwgciI8PD0/IiwgciI8PiIsIHIiIT0iLAogICAgICAgICAgICAgICAgICByIi8vPT8iLCByIi0+IiwKLSAgICAgICAgICAgICAgICAgciJbK1wtKi8lJnxePTw+XT0/IiwKKyAgICAgICAgICAgICAgICAgciJbK1wtKi8lJkB8Xj08Pl09PyIsCiAgICAgICAgICAgICAgICAgIHIifiIpCiAKIEJyYWNrZXQgPSAnW11bKCl7fV0nCkBAIC0yMzYsNyArMjM2LDcgQEAKICAgICAgICAgICAgICAgICBzdGFydGxpbmUgPSBGYWxzZQogICAgICAgICAgICAgdG9rc19hcHBlbmQodG9rdmFsKQogCi1jb29raWVfcmUgPSByZS5jb21waWxlKCJjb2RpbmdbOj1dXHMqKFstXHcuXSspIikKK2Nvb2tpZV9yZSA9IHJlLmNvbXBpbGUocideWyBcdFxmXSojLipjb2RpbmdbOj1dWyBcdF0qKFstXHcuXSspJykKIAogZGVmIF9nZXRfbm9ybWFsX25hbWUob3JpZ19lbmMpOgogICAgICIiIkltaXRhdGVzIGdldF9ub3JtYWxfbmFtZSBpbiB0b2tlbml6ZXIuYy4iIiIKQEAgLTI1Miw3ICsyNTIsNyBAQAogZGVmIGRldGVjdF9lbmNvZGluZyhyZWFkbGluZSk6CiAgICAgIiIiCiAgICAgVGhlIGRldGVjdF9lbmNvZGluZygpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZGV0ZWN0IHRoZSBlbmNvZGluZyB0aGF0IHNob3VsZAotICAgIGJlIHVzZWQgdG8gZGVjb2RlIGEgUHl0aG9uIHNvdXJjZSBmaWxlLiBJdCByZXF1aXJlcyBvbmUgYXJnbWVudCwgcmVhZGxpbmUsCisgICAgYmUgdXNlZCB0byBkZWNvZGUgYSBQeXRob24gc291cmNlIGZpbGUuIEl0IHJlcXVpcmVzIG9uZSBhcmd1bWVudCwgcmVhZGxpbmUsCiAgICAgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZSB0b2tlbml6ZSgpIGdlbmVyYXRvci4KIAogICAgIEl0IHdpbGwgY2FsbCByZWFkbGluZSBhIG1heGltdW0gb2YgdHdpY2UsIGFuZCByZXR1cm4gdGhlIGVuY29kaW5nIHVzZWQKQEAgLTI4MSwxMSArMjgxLDEwIEBACiAgICAgICAgICAgICBsaW5lX3N0cmluZyA9IGxpbmUuZGVjb2RlKCdhc2NpaScpCiAgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CiAgICAgICAgICAgICByZXR1cm4gTm9uZQotCi0gICAgICAgIG1hdGNoZXMgPSBjb29raWVfcmUuZmluZGFsbChsaW5lX3N0cmluZykKLSAgICAgICAgaWYgbm90IG1hdGNoZXM6CisgICAgICAgIG1hdGNoID0gY29va2llX3JlLm1hdGNoKGxpbmVfc3RyaW5nKQorICAgICAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICBlbmNvZGluZyA9IF9nZXRfbm9ybWFsX25hbWUobWF0Y2hlc1swXSkKKyAgICAgICAgZW5jb2RpbmcgPSBfZ2V0X25vcm1hbF9uYW1lKG1hdGNoLmdyb3VwKDEpKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBjb2RlYyA9IGxvb2t1cChlbmNvZGluZykKICAgICAgICAgZXhjZXB0IExvb2t1cEVycm9yOgpAQCAtMzQ0LDcgKzM0Myw3IEBACiAKIGRlZiBnZW5lcmF0ZV90b2tlbnMocmVhZGxpbmUpOgogICAgICIiIgotICAgIFRoZSBnZW5lcmF0ZV90b2tlbnMoKSBnZW5lcmF0b3IgcmVxdWlyZXMgb25lIGFyZ21lbnQsIHJlYWRsaW5lLCB3aGljaAorICAgIFRoZSBnZW5lcmF0ZV90b2tlbnMoKSBnZW5lcmF0b3IgcmVxdWlyZXMgb25lIGFyZ3VtZW50LCByZWFkbGluZSwgd2hpY2gKICAgICBtdXN0IGJlIGEgY2FsbGFibGUgb2JqZWN0IHdoaWNoIHByb3ZpZGVzIHRoZSBzYW1lIGludGVyZmFjZSBhcyB0aGUKICAgICByZWFkbGluZSgpIG1ldGhvZCBvZiBidWlsdC1pbiBmaWxlIG9iamVjdHMuIEVhY2ggY2FsbCB0byB0aGUgZnVuY3Rpb24KICAgICBzaG91bGQgcmV0dXJuIG9uZSBsaW5lIG9mIGlucHV0IGFzIGEgc3RyaW5nLiAgQWx0ZXJuYXRlbHksIHJlYWRsaW5lCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9yZWZhY3Rvci5weSBiL0xpYi9saWIydG8zL3JlZmFjdG9yLnB5CmluZGV4IDdkMDBkMTIuLmE0YzE2OGQgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL3JlZmFjdG9yLnB5CisrKyBiL0xpYi9saWIydG8zL3JlZmFjdG9yLnB5CkBAIC0xNzMsNyArMTczLDggQEAKIAogY2xhc3MgUmVmYWN0b3JpbmdUb29sKG9iamVjdCk6CiAKLSAgICBfZGVmYXVsdF9vcHRpb25zID0geyJwcmludF9mdW5jdGlvbiIgOiBGYWxzZX0KKyAgICBfZGVmYXVsdF9vcHRpb25zID0geyJwcmludF9mdW5jdGlvbiIgOiBGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZV91bmNoYW5nZWRfZmlsZXMiIDogRmFsc2V9CiAKICAgICBDTEFTU19QUkVGSVggPSAiRml4IiAjIFRoZSBwcmVmaXggZm9yIGZpeGVyIGNsYXNzZXMKICAgICBGSUxFX1BSRUZJWCA9ICJmaXhfIiAjIFRoZSBwcmVmaXggZm9yIG1vZHVsZXMgd2l0aCBhIGZpeGVyIHdpdGhpbgpAQCAtMTk1LDYgKzE5NiwxMCBAQAogICAgICAgICAgICAgc2VsZi5ncmFtbWFyID0gcHlncmFtLnB5dGhvbl9ncmFtbWFyX25vX3ByaW50X3N0YXRlbWVudAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5ncmFtbWFyID0gcHlncmFtLnB5dGhvbl9ncmFtbWFyCisgICAgICAgICMgV2hlbiB0aGlzIGlzIFRydWUsIHRoZSByZWZhY3RvciooKSBtZXRob2RzIHdpbGwgY2FsbCB3cml0ZV9maWxlKCkgZm9yCisgICAgICAgICMgZmlsZXMgcHJvY2Vzc2VkIGV2ZW4gaWYgdGhleSB3ZXJlIG5vdCBjaGFuZ2VkIGR1cmluZyByZWZhY3RvcmluZy4gSWYKKyAgICAgICAgIyBhbmQgb25seSBpZiB0aGUgcmVmYWN0b3IgbWV0aG9kJ3Mgd3JpdGUgcGFyYW1ldGVyIHdhcyBUcnVlLgorICAgICAgICBzZWxmLndyaXRlX3VuY2hhbmdlZF9maWxlcyA9IHNlbGYub3B0aW9ucy5nZXQoIndyaXRlX3VuY2hhbmdlZF9maWxlcyIpCiAgICAgICAgIHNlbGYuZXJyb3JzID0gW10KICAgICAgICAgc2VsZi5sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiUmVmYWN0b3JpbmdUb29sIikKICAgICAgICAgc2VsZi5maXhlcl9sb2cgPSBbXQpAQCAtMzQxLDEzICszNDYsMTMgQEAKICAgICAgICAgaWYgZG9jdGVzdHNfb25seToKICAgICAgICAgICAgIHNlbGYubG9nX2RlYnVnKCJSZWZhY3RvcmluZyBkb2N0ZXN0cyBpbiAlcyIsIGZpbGVuYW1lKQogICAgICAgICAgICAgb3V0cHV0ID0gc2VsZi5yZWZhY3Rvcl9kb2NzdHJpbmcoaW5wdXQsIGZpbGVuYW1lKQotICAgICAgICAgICAgaWYgb3V0cHV0ICE9IGlucHV0OgorICAgICAgICAgICAgaWYgc2VsZi53cml0ZV91bmNoYW5nZWRfZmlsZXMgb3Igb3V0cHV0ICE9IGlucHV0OgogICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc2VkX2ZpbGUob3V0cHV0LCBmaWxlbmFtZSwgaW5wdXQsIHdyaXRlLCBlbmNvZGluZykKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgc2VsZi5sb2dfZGVidWcoIk5vIGRvY3Rlc3QgY2hhbmdlcyBpbiAlcyIsIGZpbGVuYW1lKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgdHJlZSA9IHNlbGYucmVmYWN0b3Jfc3RyaW5nKGlucHV0LCBmaWxlbmFtZSkKLSAgICAgICAgICAgIGlmIHRyZWUgYW5kIHRyZWUud2FzX2NoYW5nZWQ6CisgICAgICAgICAgICBpZiBzZWxmLndyaXRlX3VuY2hhbmdlZF9maWxlcyBvciAodHJlZSBhbmQgdHJlZS53YXNfY2hhbmdlZCk6CiAgICAgICAgICAgICAgICAgIyBUaGUgWzotMV0gaXMgdG8gdGFrZSBvZmYgdGhlIFxuIHdlIGFkZGVkIGVhcmxpZXIKICAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NlZF9maWxlKHVuaWNvZGUodHJlZSlbOi0xXSwgZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZT13cml0ZSwgZW5jb2Rpbmc9ZW5jb2RpbmcpCkBAIC0zODYsMTMgKzM5MSwxMyBAQAogICAgICAgICBpZiBkb2N0ZXN0c19vbmx5OgogICAgICAgICAgICAgc2VsZi5sb2dfZGVidWcoIlJlZmFjdG9yaW5nIGRvY3Rlc3RzIGluIHN0ZGluIikKICAgICAgICAgICAgIG91dHB1dCA9IHNlbGYucmVmYWN0b3JfZG9jc3RyaW5nKGlucHV0LCAiPHN0ZGluPiIpCi0gICAgICAgICAgICBpZiBvdXRwdXQgIT0gaW5wdXQ6CisgICAgICAgICAgICBpZiBzZWxmLndyaXRlX3VuY2hhbmdlZF9maWxlcyBvciBvdXRwdXQgIT0gaW5wdXQ6CiAgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzZWRfZmlsZShvdXRwdXQsICI8c3RkaW4+IiwgaW5wdXQpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHNlbGYubG9nX2RlYnVnKCJObyBkb2N0ZXN0IGNoYW5nZXMgaW4gc3RkaW4iKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgdHJlZSA9IHNlbGYucmVmYWN0b3Jfc3RyaW5nKGlucHV0LCAiPHN0ZGluPiIpCi0gICAgICAgICAgICBpZiB0cmVlIGFuZCB0cmVlLndhc19jaGFuZ2VkOgorICAgICAgICAgICAgaWYgc2VsZi53cml0ZV91bmNoYW5nZWRfZmlsZXMgb3IgKHRyZWUgYW5kIHRyZWUud2FzX2NoYW5nZWQpOgogICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc2VkX2ZpbGUodW5pY29kZSh0cmVlKSwgIjxzdGRpbj4iLCBpbnB1dCkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgc2VsZi5sb2dfZGVidWcoIk5vIGNoYW5nZXMgaW4gc3RkaW4iKQpAQCAtNDQwLDcgKzQ0NSw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kX3Jvb3Qobm9kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBBc3NlcnRpb25FcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhpcyBub2RlIGhhcyBiZWVuIGN1dCBvZmYgZnJvbSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmV2aW91cyB0cmFuc2Zvcm1hdGlvbiA7IHNraXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQpAQCAtNTAyLDcgKzUwNyw3IEBACiAgICAgZGVmIHByb2Nlc3NlZF9maWxlKHNlbGYsIG5ld190ZXh0LCBmaWxlbmFtZSwgb2xkX3RleHQ9Tm9uZSwgd3JpdGU9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nPU5vbmUpOgogICAgICAgICAiIiIKLSAgICAgICAgQ2FsbGVkIHdoZW4gYSBmaWxlIGhhcyBiZWVuIHJlZmFjdG9yZWQsIGFuZCB0aGVyZSBhcmUgY2hhbmdlcy4KKyAgICAgICAgQ2FsbGVkIHdoZW4gYSBmaWxlIGhhcyBiZWVuIHJlZmFjdG9yZWQgYW5kIHRoZXJlIG1heSBiZSBjaGFuZ2VzLgogICAgICAgICAiIiIKICAgICAgICAgc2VsZi5maWxlcy5hcHBlbmQoZmlsZW5hbWUpCiAgICAgICAgIGlmIG9sZF90ZXh0IGlzIE5vbmU6CkBAIC01MTMsNyArNTE4LDggQEAKICAgICAgICAgc2VsZi5wcmludF9vdXRwdXQob2xkX3RleHQsIG5ld190ZXh0LCBmaWxlbmFtZSwgZXF1YWwpCiAgICAgICAgIGlmIGVxdWFsOgogICAgICAgICAgICAgc2VsZi5sb2dfZGVidWcoIk5vIGNoYW5nZXMgdG8gJXMiLCBmaWxlbmFtZSkKLSAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaWYgbm90IHNlbGYud3JpdGVfdW5jaGFuZ2VkX2ZpbGVzOgorICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICBpZiB3cml0ZToKICAgICAgICAgICAgIHNlbGYud3JpdGVfZmlsZShuZXdfdGV4dCwgZmlsZW5hbWUsIG9sZF90ZXh0LCBlbmNvZGluZykKICAgICAgICAgZWxzZToKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3Rlc3RzL2RhdGEvZGlmZmVyZW50X2VuY29kaW5nLnB5IGIvTGliL2xpYjJ0bzMvdGVzdHMvZGF0YS9kaWZmZXJlbnRfZW5jb2RpbmcucHkKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvdGVzdHMvZGF0YS9mYWxzZV9lbmNvZGluZy5weSBiL0xpYi9saWIydG8zL3Rlc3RzL2RhdGEvZmFsc2VfZW5jb2RpbmcucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjRlNTllNwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9saWIydG8zL3Rlc3RzL2RhdGEvZmFsc2VfZW5jb2RpbmcucHkKQEAgLTAsMCArMSwyIEBACisjIS91c3IvYmluL2VudiBweXRob24KK3ByaW50ICcjY29kaW5nPTAnCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X2ZpeGVycy5weSBiL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfZml4ZXJzLnB5CmluZGV4IDg4Njc5ZjAuLmRkMzQwMjggMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfZml4ZXJzLnB5CisrKyBiL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfZml4ZXJzLnB5CkBAIC00MSw3ICs0MSw3IEBACiAKICAgICBkZWYgd2FybnMoc2VsZiwgYmVmb3JlLCBhZnRlciwgbWVzc2FnZSwgdW5jaGFuZ2VkPUZhbHNlKToKICAgICAgICAgdHJlZSA9IHNlbGYuX2NoZWNrKGJlZm9yZSwgYWZ0ZXIpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlIGluICIiLmpvaW4oc2VsZi5maXhlcl9sb2cpKQorICAgICAgICBzZWxmLmFzc2VydEluKG1lc3NhZ2UsICIiLmpvaW4oc2VsZi5maXhlcl9sb2cpKQogICAgICAgICBpZiBub3QgdW5jaGFuZ2VkOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRyZWUud2FzX2NoYW5nZWQpCiAKQEAgLTE0MDUsMjcgKzE0MDUsMjcgQEAKICAgICAgICAgYSA9ICJkLnZhbHVlcygpIgogICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCiAKLSAgICBkZWYgdGVzdF8xNChzZWxmKToKKyAgICBkZWYgdGVzdF8yOChzZWxmKToKICAgICAgICAgYiA9ICJbaSBmb3IgaSBpbiBkLnZpZXdrZXlzKCldIgogICAgICAgICBhID0gIltpIGZvciBpIGluIGQua2V5cygpXSIKICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQogCi0gICAgZGVmIHRlc3RfMTUoc2VsZik6CisgICAgZGVmIHRlc3RfMjkoc2VsZik6CiAgICAgICAgIGIgPSAiKGkgZm9yIGkgaW4gZC52aWV3a2V5cygpKSIKICAgICAgICAgYSA9ICIoaSBmb3IgaSBpbiBkLmtleXMoKSkiCiAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKIAotICAgIGRlZiB0ZXN0XzE3KHNlbGYpOgorICAgIGRlZiB0ZXN0XzMwKHNlbGYpOgogICAgICAgICBiID0gIml0ZXIoZC52aWV3a2V5cygpKSIKICAgICAgICAgYSA9ICJpdGVyKGQua2V5cygpKSIKICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQogCi0gICAgZGVmIHRlc3RfMTgoc2VsZik6CisgICAgZGVmIHRlc3RfMzEoc2VsZik6CiAgICAgICAgIGIgPSAibGlzdChkLnZpZXdrZXlzKCkpIgogICAgICAgICBhID0gImxpc3QoZC5rZXlzKCkpIgogICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCiAKLSAgICBkZWYgdGVzdF8xOShzZWxmKToKKyAgICBkZWYgdGVzdF8zMihzZWxmKToKICAgICAgICAgYiA9ICJzb3J0ZWQoZC52aWV3a2V5cygpKSIKICAgICAgICAgYSA9ICJzb3J0ZWQoZC5rZXlzKCkpIgogICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCkBAIC0yODI0LDYgKzI4MjQsNDMgQEAKICAgICAgICAgYSA9ICIiIlInJyd4JycnICIiIgogICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCiAKKyAgICBkZWYgdGVzdF9uYXRpdmVfbGl0ZXJhbF9lc2NhcGVfdShzZWxmKToKKyAgICAgICAgYiA9ICIiIidcXFxcXFx1MjBhY1xcVTAwMDFkMTIxXFxcXHUyMGFjJyIiIgorICAgICAgICBhID0gIiIiJ1xcXFxcXFxcdTIwYWNcXFxcVTAwMDFkMTIxXFxcXHUyMGFjJyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInInXFxcXFxcdTIwYWNcXFUwMDAxZDEyMVxcXFx1MjBhYyciIiIKKyAgICAgICAgYSA9ICIiInInXFxcXFxcdTIwYWNcXFUwMDAxZDEyMVxcXFx1MjBhYyciIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfYnl0ZXNfbGl0ZXJhbF9lc2NhcGVfdShzZWxmKToKKyAgICAgICAgYiA9ICIiImInXFxcXFxcdTIwYWNcXFUwMDAxZDEyMVxcXFx1MjBhYyciIiIKKyAgICAgICAgYSA9ICIiImInXFxcXFxcdTIwYWNcXFUwMDAxZDEyMVxcXFx1MjBhYyciIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJicidcXFxcXFx1MjBhY1xcVTAwMDFkMTIxXFxcXHUyMGFjJyIiIgorICAgICAgICBhID0gIiIiYnInXFxcXFxcdTIwYWNcXFUwMDAxZDEyMVxcXFx1MjBhYyciIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdW5pY29kZV9saXRlcmFsX2VzY2FwZV91KHNlbGYpOgorICAgICAgICBiID0gIiIidSdcXFxcXFx1MjBhY1xcVTAwMDFkMTIxXFxcXHUyMGFjJyIiIgorICAgICAgICBhID0gIiIiJ1xcXFxcXHUyMGFjXFxVMDAwMWQxMjFcXFxcdTIwYWMnIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIidXInXFxcXFxcdTIwYWNcXFUwMDAxZDEyMVxcXFx1MjBhYyciIiIKKyAgICAgICAgYSA9ICIiInInXFxcXFxcdTIwYWNcXFUwMDAxZDEyMVxcXFx1MjBhYyciIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfbmF0aXZlX3VuaWNvZGVfbGl0ZXJhbF9lc2NhcGVfdShzZWxmKToKKyAgICAgICAgZiA9ICdmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHVuaWNvZGVfbGl0ZXJhbHNcbicKKyAgICAgICAgYiA9IGYgKyAiIiInXFxcXFxcdTIwYWNcXFUwMDAxZDEyMVxcXFx1MjBhYyciIiIKKyAgICAgICAgYSA9IGYgKyAiIiInXFxcXFxcdTIwYWNcXFUwMDAxZDEyMVxcXFx1MjBhYyciIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSBmICsgIiIicidcXFxcXFx1MjBhY1xcVTAwMDFkMTIxXFxcXHUyMGFjJyIiIgorICAgICAgICBhID0gZiArICIiInInXFxcXFxcdTIwYWNcXFUwMDAxZDEyMVxcXFx1MjBhYyciIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCiBjbGFzcyBUZXN0X2NhbGxhYmxlKEZpeGVyVGVzdENhc2UpOgogICAgIGZpeGVyID0gImNhbGxhYmxlIgogCkBAIC0yOTgxLDYgKzMwMTgsMTAgQEAKICAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKICAgICAgICAgYSA9ICIiInNvcnRlZChmaWx0ZXIoZiwgJ2FiYycpLCBrZXk9YmxhaClbMF0iIiIKICAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiImVudW1lcmF0ZShmaWx0ZXIoZiwgJ2FiYycpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIiZW51bWVyYXRlKGZpbHRlcihmLCAnYWJjJyksIHN0YXJ0PTEpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCiAgICAgICAgIGEgPSAiIiJmb3IgaSBpbiBmaWx0ZXIoZiwgJ2FiYycpOiBwYXNzIiIiCiAgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCiAgICAgICAgIGEgPSAiIiJbeCBmb3IgeCBpbiBmaWx0ZXIoZiwgJ2FiYycpXSIiIgpAQCAtMzA4OSw2ICszMTMwLDEwIEBACiAgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCiAgICAgICAgIGEgPSAiIiJzb3J0ZWQobWFwKGYsICdhYmMnKSwga2V5PWJsYWgpWzBdIiIiCiAgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJlbnVtZXJhdGUobWFwKGYsICdhYmMnKSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiImVudW1lcmF0ZShtYXAoZiwgJ2FiYycpLCBzdGFydD0xKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQogICAgICAgICBhID0gIiIiZm9yIGkgaW4gbWFwKGYsICdhYmMnKTogcGFzcyIiIgogICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQogICAgICAgICBhID0gIiIiW3ggZm9yIHggaW4gbWFwKGYsICdhYmMnKV0iIiIKQEAgLTMxNTIsNiArMzE5NywxMCBAQAogICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQogICAgICAgICBhID0gIiIic29ydGVkKHppcChhLCBiKSwga2V5PWJsYWgpWzBdIiIiCiAgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJlbnVtZXJhdGUoemlwKGEsIGIpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIiZW51bWVyYXRlKHppcChhLCBiKSwgc3RhcnQ9MSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKICAgICAgICAgYSA9ICIiImZvciBpIGluIHppcChhLCBiKTogcGFzcyIiIgogICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQogICAgICAgICBhID0gIiIiW3ggZm9yIHggaW4gemlwKGEsIGIpXSIiIgpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9tYWluLnB5IGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9tYWluLnB5CmluZGV4IDU4NmI4ZGYuLjA0MTMxY2YgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfbWFpbi5weQorKysgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X21haW4ucHkKQEAgLTIsMTcgKzIsNDAgQEAKIGltcG9ydCBzeXMKIGltcG9ydCBjb2RlY3MKIGltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHNodXRpbAogaW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKIGltcG9ydCB1bml0dGVzdAogCiBmcm9tIGxpYjJ0bzMgaW1wb3J0IG1haW4KIAogCitURVNUX0RBVEFfRElSID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICJkYXRhIikKK1BZMl9URVNUX01PRFVMRSA9IG9zLnBhdGguam9pbihURVNUX0RBVEFfRElSLCAicHkyX3Rlc3RfZ3JhbW1hci5weSIpCisKKwogY2xhc3MgVGVzdE1haW4odW5pdHRlc3QuVGVzdENhc2UpOgogCisgICAgaWYgbm90IGhhc2F0dHIodW5pdHRlc3QuVGVzdENhc2UsICdhc3NlcnROb3RSZWdleCcpOgorICAgICAgICAjIFRoaXMgbWV0aG9kIHdhcyBvbmx5IGludHJvZHVjZWQgaW4gMy4yLgorICAgICAgICBkZWYgYXNzZXJ0Tm90UmVnZXgoc2VsZiwgdGV4dCwgcmVnZXhwLCBtc2c9Tm9uZSk6CisgICAgICAgICAgICBpbXBvcnQgcmUKKyAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRyKHJlZ2V4cCwgJ3NlYXJjaCcpOgorICAgICAgICAgICAgICAgIHJlZ2V4cCA9IHJlLmNvbXBpbGUocmVnZXhwKQorICAgICAgICAgICAgaWYgcmVnZXhwLnNlYXJjaCh0ZXh0KToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInJlZ2V4cCAlcyBNQVRDSEVEIHRleHQgJXIiICUgKHJlZ2V4cC5wYXR0ZXJuLCB0ZXh0KSkKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi50ZW1wX2RpciA9IE5vbmUgICMgdGVhckRvd24oKSB3aWxsIHJtdHJlZSB0aGlzIGRpcmVjdG9yeSBpZiBzZXQuCisKICAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgICMgQ2xlYW4gdXAgbG9nZ2luZyBjb25maWd1cmF0aW9uIGRvd24gYnkgbWFpbi4KICAgICAgICAgZGVsIGxvZ2dpbmcucm9vdC5oYW5kbGVyc1s6XQorICAgICAgICBpZiBzZWxmLnRlbXBfZGlyOgorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLnRlbXBfZGlyKQogCiAgICAgZGVmIHJ1bl8ydG8zX2NhcHR1cmUoc2VsZiwgYXJncywgaW5fY2FwdHVyZSwgb3V0X2NhcHR1cmUsIGVycl9jYXB0dXJlKToKICAgICAgICAgc2F2ZV9zdGRpbiA9IHN5cy5zdGRpbgpAQCAtMzYsNiArNTksOTEgQEAKICAgICAgICAgcmV0ID0gc2VsZi5ydW5fMnRvM19jYXB0dXJlKFsiLSJdLCBpbnB1dF9zdHJlYW0sIG91dF9lbmMsIGVycikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXQsIDApCiAgICAgICAgIG91dHB1dCA9IG91dC5nZXR2YWx1ZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiLXByaW50ICdub3RoaW5nJyIgaW4gb3V0cHV0KQotICAgICAgICBzZWxmLmFzc2VydFRydWUoIldBUk5JTkc6IGNvdWxkbid0IGVuY29kZSA8c3RkaW4+J3MgZGlmZiBmb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgInlvdXIgdGVybWluYWwiIGluIGVyci5nZXR2YWx1ZSgpKQorICAgICAgICBzZWxmLmFzc2VydEluKCItcHJpbnQgJ25vdGhpbmcnIiwgb3V0cHV0KQorICAgICAgICBzZWxmLmFzc2VydEluKCJXQVJOSU5HOiBjb3VsZG4ndCBlbmNvZGUgPHN0ZGluPidzIGRpZmYgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAieW91ciB0ZXJtaW5hbCIsIGVyci5nZXR2YWx1ZSgpKQorCisgICAgZGVmIHNldHVwX3Rlc3Rfc291cmNlX3RyZWVzKHNlbGYpOgorICAgICAgICAiIiJTZXR1cCBhIHRlc3Qgc291cmNlIHRyZWUgYW5kIG91dHB1dCBkZXN0aW5hdGlvbiB0cmVlLiIiIgorICAgICAgICBzZWxmLnRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpICAjIHRlYXJEb3duKCkgY2xlYW5zIHRoaXMgdXAuCisgICAgICAgIHNlbGYucHkyX3NyY19kaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZW1wX2RpciwgInB5dGhvbjJfcHJvamVjdCIpCisgICAgICAgIHNlbGYucHkzX2Rlc3RfZGlyID0gb3MucGF0aC5qb2luKHNlbGYudGVtcF9kaXIsICJweXRob24zX3Byb2plY3QiKQorICAgICAgICBvcy5ta2RpcihzZWxmLnB5Ml9zcmNfZGlyKQorICAgICAgICBvcy5ta2RpcihzZWxmLnB5M19kZXN0X2RpcikKKyAgICAgICAgIyBUdXJuIGl0IGludG8gYSBwYWNrYWdlIHdpdGggYSBmZXcgZmlsZXMuCisgICAgICAgIHNlbGYuc2V0dXBfZmlsZXMgPSBbXQorICAgICAgICBvcGVuKG9zLnBhdGguam9pbihzZWxmLnB5Ml9zcmNfZGlyLCAiX19pbml0X18ucHkiKSwgInciKS5jbG9zZSgpCisgICAgICAgIHNlbGYuc2V0dXBfZmlsZXMuYXBwZW5kKCJfX2luaXRfXy5weSIpCisgICAgICAgIHNodXRpbC5jb3B5KFBZMl9URVNUX01PRFVMRSwgc2VsZi5weTJfc3JjX2RpcikKKyAgICAgICAgc2VsZi5zZXR1cF9maWxlcy5hcHBlbmQob3MucGF0aC5iYXNlbmFtZShQWTJfVEVTVF9NT0RVTEUpKQorICAgICAgICBzZWxmLnRyaXZpYWxfcHkyX2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi5weTJfc3JjX2RpciwgInRyaXZpYWwucHkiKQorICAgICAgICBzZWxmLmluaXRfcHkyX2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi5weTJfc3JjX2RpciwgIl9faW5pdF9fLnB5IikKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYudHJpdmlhbF9weTJfZmlsZSwgInciKSBhcyB0cml2aWFsOgorICAgICAgICAgICAgdHJpdmlhbC53cml0ZSgicHJpbnQgJ0kgbmVlZCBhIHNpbXBsZSBjb252ZXJzaW9uLiciKQorICAgICAgICBzZWxmLnNldHVwX2ZpbGVzLmFwcGVuZCgidHJpdmlhbC5weSIpCisKKyAgICBkZWYgdGVzdF9maWxlbmFtZV9jaGFuZ2luZ19vbl9vdXRwdXRfc2luZ2xlX2RpcihzZWxmKToKKyAgICAgICAgIiIiMnRvMyBhIHNpbmdsZSBkaXJlY3Rvcnkgd2l0aCBhIG5ldyBvdXRwdXQgZGlyIGFuZCBzdWZmaXguIiIiCisgICAgICAgIHNlbGYuc2V0dXBfdGVzdF9zb3VyY2VfdHJlZXMoKQorICAgICAgICBvdXQgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIGVyciA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgc3VmZml4ID0gIlRFU1QiCisgICAgICAgIHJldCA9IHNlbGYucnVuXzJ0bzNfY2FwdHVyZSgKKyAgICAgICAgICAgICAgICBbIi1uIiwgIi0tYWRkLXN1ZmZpeCIsIHN1ZmZpeCwgIi0td3JpdGUtdW5jaGFuZ2VkLWZpbGVzIiwKKyAgICAgICAgICAgICAgICAgIi0tbm8tZGlmZnMiLCAiLS1vdXRwdXQtZGlyIiwKKyAgICAgICAgICAgICAgICAgc2VsZi5weTNfZGVzdF9kaXIsIHNlbGYucHkyX3NyY19kaXJdLAorICAgICAgICAgICAgICAgIFN0cmluZ0lPLlN0cmluZ0lPKCIiKSwgb3V0LCBlcnIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmV0LCAwKQorICAgICAgICBzdGRlcnIgPSBlcnIuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydEluKCIgaW1wbGllcyAtdy4iLCBzdGRlcnIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oCisgICAgICAgICAgICAgICAgIk91dHB1dCBpbiAlciB3aWxsIG1pcnJvciB0aGUgaW5wdXQgZGlyZWN0b3J5ICVyIGxheW91dCIgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnB5M19kZXN0X2Rpciwgc2VsZi5weTJfc3JjX2RpciksIHN0ZGVycikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQobmFtZStzdWZmaXggZm9yIG5hbWUgaW4gc2VsZi5zZXR1cF9maWxlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2V0KG9zLmxpc3RkaXIoc2VsZi5weTNfZGVzdF9kaXIpKSkKKyAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5zZXR1cF9maWxlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oIldyaXRpbmcgY29udmVydGVkICVzIHRvICVzIiAlICgKKyAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYucHkyX3NyY19kaXIsIG5hbWUpLAorICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5weTNfZGVzdF9kaXIsIG5hbWUrc3VmZml4KSksIHN0ZGVycikKKyAgICAgICAgc2VwID0gcmUuZXNjYXBlKG9zLnNlcCkKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleHBNYXRjaGVzKAorICAgICAgICAgICAgICAgIHN0ZGVyciwgciJObyBjaGFuZ2VzIHRvIC4qL19faW5pdF9fXC5weSIucmVwbGFjZSgiLyIsIHNlcCkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90UmVnZXgoCisgICAgICAgICAgICAgICAgc3RkZXJyLCByIk5vIGNoYW5nZXMgdG8gLiovdHJpdmlhbFwucHkiLnJlcGxhY2UoIi8iLCBzZXApKQorCisgICAgZGVmIHRlc3RfZmlsZW5hbWVfY2hhbmdpbmdfb25fb3V0cHV0X3R3b19maWxlcyhzZWxmKToKKyAgICAgICAgIiIiMnRvMyB0d28gZmlsZXMgaW4gb25lIGRpcmVjdG9yeSB3aXRoIGEgbmV3IG91dHB1dCBkaXIuIiIiCisgICAgICAgIHNlbGYuc2V0dXBfdGVzdF9zb3VyY2VfdHJlZXMoKQorICAgICAgICBlcnIgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHB5Ml9maWxlcyA9IFtzZWxmLnRyaXZpYWxfcHkyX2ZpbGUsIHNlbGYuaW5pdF9weTJfZmlsZV0KKyAgICAgICAgZXhwZWN0ZWRfZmlsZXMgPSBzZXQob3MucGF0aC5iYXNlbmFtZShuYW1lKSBmb3IgbmFtZSBpbiBweTJfZmlsZXMpCisgICAgICAgIHJldCA9IHNlbGYucnVuXzJ0bzNfY2FwdHVyZSgKKyAgICAgICAgICAgICAgICBbIi1uIiwgIi13IiwgIi0td3JpdGUtdW5jaGFuZ2VkLWZpbGVzIiwKKyAgICAgICAgICAgICAgICAgIi0tbm8tZGlmZnMiLCAiLS1vdXRwdXQtZGlyIiwgc2VsZi5weTNfZGVzdF9kaXJdICsgcHkyX2ZpbGVzLAorICAgICAgICAgICAgICAgIFN0cmluZ0lPLlN0cmluZ0lPKCIiKSwgU3RyaW5nSU8uU3RyaW5nSU8oKSwgZXJyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJldCwgMCkKKyAgICAgICAgc3RkZXJyID0gZXJyLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigKKyAgICAgICAgICAgICAgICAiT3V0cHV0IGluICVyIHdpbGwgbWlycm9yIHRoZSBpbnB1dCBkaXJlY3RvcnkgJXIgbGF5b3V0IiAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHkzX2Rlc3RfZGlyLCBzZWxmLnB5Ml9zcmNfZGlyKSwgc3RkZXJyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX2ZpbGVzLCBzZXQob3MubGlzdGRpcihzZWxmLnB5M19kZXN0X2RpcikpKQorCisgICAgZGVmIHRlc3RfZmlsZW5hbWVfY2hhbmdpbmdfb25fb3V0cHV0X3NpbmdsZV9maWxlKHNlbGYpOgorICAgICAgICAiIiIydG8zIGEgc2luZ2xlIGZpbGUgd2l0aCBhIG5ldyBvdXRwdXQgZGlyLiIiIgorICAgICAgICBzZWxmLnNldHVwX3Rlc3Rfc291cmNlX3RyZWVzKCkKKyAgICAgICAgZXJyID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICByZXQgPSBzZWxmLnJ1bl8ydG8zX2NhcHR1cmUoCisgICAgICAgICAgICAgICAgWyItbiIsICItdyIsICItLW5vLWRpZmZzIiwgIi0tb3V0cHV0LWRpciIsIHNlbGYucHkzX2Rlc3RfZGlyLAorICAgICAgICAgICAgICAgICBzZWxmLnRyaXZpYWxfcHkyX2ZpbGVdLAorICAgICAgICAgICAgICAgIFN0cmluZ0lPLlN0cmluZ0lPKCIiKSwgU3RyaW5nSU8uU3RyaW5nSU8oKSwgZXJyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJldCwgMCkKKyAgICAgICAgc3RkZXJyID0gZXJyLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigKKyAgICAgICAgICAgICAgICAiT3V0cHV0IGluICVyIHdpbGwgbWlycm9yIHRoZSBpbnB1dCBkaXJlY3RvcnkgJXIgbGF5b3V0IiAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHkzX2Rlc3RfZGlyLCBzZWxmLnB5Ml9zcmNfZGlyKSwgc3RkZXJyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChbb3MucGF0aC5iYXNlbmFtZShzZWxmLnRyaXZpYWxfcHkyX2ZpbGUpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2V0KG9zLmxpc3RkaXIoc2VsZi5weTNfZGVzdF9kaXIpKSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9wYXJzZXIucHkgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3BhcnNlci5weQppbmRleCAyNjAyMzgxLi45YzU0NjNhIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3BhcnNlci5weQorKysgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3BhcnNlci5weQpAQCAtNDQsNiArNDQsMTkgQEAKICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJTeW50YXggc2hvdWxkbid0IGhhdmUgYmVlbiB2YWxpZCIpCiAKIAorY2xhc3MgVGVzdE1hdHJpeE11bHRpcGxpY2F0aW9uKEdyYW1tYXJUZXN0KToKKyAgICBkZWYgdGVzdF9tYXRyaXhfbXVsdGlwbGljYXRpb25fb3BlcmF0b3Ioc2VsZik6CisgICAgICAgIHNlbGYudmFsaWRhdGUoImEgQCBiIikKKyAgICAgICAgc2VsZi52YWxpZGF0ZSgiYSBAPSBiIikKKworCitjbGFzcyBUZXN0WWllbGRGcm9tKEdyYW1tYXJUZXN0KToKKyAgICBkZWYgdGVzdF9tYXRyaXhfbXVsdGlwbGljYXRpb25fb3BlcmF0b3Ioc2VsZik6CisgICAgICAgIHNlbGYudmFsaWRhdGUoInlpZWxkIGZyb20geCIpCisgICAgICAgIHNlbGYudmFsaWRhdGUoIih5aWVsZCBmcm9tIHgpICsgeSIpCisgICAgICAgIHNlbGYuaW52YWxpZF9zeW50YXgoInlpZWxkIGZyb20iKQorCisKIGNsYXNzIFRlc3RSYWlzZUNoYW5nZXMoR3JhbW1hclRlc3QpOgogICAgIGRlZiB0ZXN0XzJ4X3N0eWxlXzEoc2VsZik6CiAgICAgICAgIHNlbGYudmFsaWRhdGUoInJhaXNlIikKQEAgLTczLDcgKzg2LDcgQEAKICAgICAgICAgc2VsZi5pbnZhbGlkX3N5bnRheCgicmFpc2UgRSBmcm9tIikKIAogCi0jIEFkYXBhdGVkIGZyb20gUHl0aG9uIDMncyBMaWIvdGVzdC90ZXN0X2dyYW1tYXIucHk6R3JhbW1hclRlc3RzLnRlc3RGdW5jZGVmCisjIEFkYXB0YXRlZCBmcm9tIFB5dGhvbiAzJ3MgTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5OkdyYW1tYXJUZXN0cy50ZXN0RnVuY2RlZgogY2xhc3MgVGVzdEZ1bmN0aW9uQW5ub3RhdGlvbnMoR3JhbW1hclRlc3QpOgogICAgIGRlZiB0ZXN0XzEoc2VsZik6CiAgICAgICAgIHNlbGYudmFsaWRhdGUoIiIiZGVmIGYoeCkgLT4gbGlzdDogcGFzcyIiIikKQEAgLTE2NSw4ICsxNzgsOCBAQAogICAgICAgICBmb3IgZmlsZXBhdGggaW4gc3VwcG9ydC5hbGxfcHJvamVjdF9maWxlcygpOgogICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVwYXRoLCAicmIiKSBhcyBmcDoKICAgICAgICAgICAgICAgICBlbmNvZGluZyA9IHRva2VuaXplLmRldGVjdF9lbmNvZGluZyhmcC5yZWFkbGluZSlbMF0KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbmNvZGluZyBpcyBub3QgTm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgZGV0ZWN0IGVuY29kaW5nIGZvciAlcyIgJSBmaWxlcGF0aCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKGVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IGRldGVjdCBlbmNvZGluZyBmb3IgJXMiICUgZmlsZXBhdGgpCiAgICAgICAgICAgICB3aXRoIG9wZW4oZmlsZXBhdGgsICJyIikgYXMgZnA6CiAgICAgICAgICAgICAgICAgc291cmNlID0gZnAucmVhZCgpCiAgICAgICAgICAgICAgICAgc291cmNlID0gc291cmNlLmRlY29kZShlbmNvZGluZykKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfcHl0cmVlLnB5IGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9weXRyZWUucHkKaW5kZXggYWM3ZDkwMC4uY2NkZGNlNiAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9weXRyZWUucHkKKysrIGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9weXRyZWUucHkKQEAgLTE2MCwxMiArMTYwLDEyIEBACiAgICAgICAgIGwzID0gcHl0cmVlLkxlYWYoMTAwLCAiYmFyIikKICAgICAgICAgbjEgPSBweXRyZWUuTm9kZSgxMDAwLCBbbDEsIGwyLCBsM10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEuY2hpbGRyZW4sIFtsMSwgbDIsIGwzXSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobjEuY2hpbGRyZW4sIGxpc3QpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobjEuY2hpbGRyZW4sIGxpc3QpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobjEud2FzX2NoYW5nZWQpCiAgICAgICAgIGwybmV3ID0gcHl0cmVlLkxlYWYoMTAwLCAiLSIpCiAgICAgICAgIGwyLnJlcGxhY2UobDJuZXcpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEuY2hpbGRyZW4sIFtsMSwgbDJuZXcsIGwzXSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobjEuY2hpbGRyZW4sIGxpc3QpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobjEuY2hpbGRyZW4sIGxpc3QpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuMS53YXNfY2hhbmdlZCkKIAogICAgIGRlZiB0ZXN0X3JlcGxhY2Vfd2l0aF9saXN0KHNlbGYpOgpAQCAtMTc2LDcgKzE3Niw3IEBACiAKICAgICAgICAgbDIucmVwbGFjZShbcHl0cmVlLkxlYWYoMTAwLCAiKiIpLCBweXRyZWUuTGVhZigxMDAsICIqIildKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihuMSksICJmb28qKmJhciIpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG4xLmNoaWxkcmVuLCBsaXN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG4xLmNoaWxkcmVuLCBsaXN0KQogCiAgICAgZGVmIHRlc3RfbGVhdmVzKHNlbGYpOgogICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIpCkBAIC0zNDcsNyArMzQ3LDcgQEAKICAgICAgICAgbjIgPSBweXRyZWUuTm9kZSgxMDAwLCBbXSkKICAgICAgICAgcDEgPSBweXRyZWUuTm9kZSgxMDAwLCBbbjEsIG4yXSkKIAotICAgICAgICBzZWxmLmFzc2VydFRydWUobjEubmV4dF9zaWJsaW5nIGlzIG4yKQorICAgICAgICBzZWxmLmFzc2VydElzKG4xLm5leHRfc2libGluZywgbjIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjIubmV4dF9zaWJsaW5nLCBOb25lKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAxLm5leHRfc2libGluZywgTm9uZSkKIApAQCAtMzU2LDcgKzM1Niw3IEBACiAgICAgICAgIGwyID0gcHl0cmVlLkxlYWYoMTAwLCAiYiIpCiAgICAgICAgIHAxID0gcHl0cmVlLk5vZGUoMTAwMCwgW2wxLCBsMl0pCiAKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGwxLm5leHRfc2libGluZyBpcyBsMikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhsMS5uZXh0X3NpYmxpbmcsIGwyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwyLm5leHRfc2libGluZywgTm9uZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMS5uZXh0X3NpYmxpbmcsIE5vbmUpCiAKQEAgLTM2NSw3ICszNjUsNyBAQAogICAgICAgICBuMiA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtdKQogICAgICAgICBwMSA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtuMSwgbjJdKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuMi5wcmV2X3NpYmxpbmcgaXMgbjEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMobjIucHJldl9zaWJsaW5nLCBuMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMS5wcmV2X3NpYmxpbmcsIE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocDEucHJldl9zaWJsaW5nLCBOb25lKQogCkBAIC0zNzQsNyArMzc0LDcgQEAKICAgICAgICAgbDIgPSBweXRyZWUuTGVhZigxMDAsICJiIikKICAgICAgICAgcDEgPSBweXRyZWUuTm9kZSgxMDAwLCBbbDEsIGwyXSkKIAotICAgICAgICBzZWxmLmFzc2VydFRydWUobDIucHJldl9zaWJsaW5nIGlzIGwxKQorICAgICAgICBzZWxmLmFzc2VydElzKGwyLnByZXZfc2libGluZywgbDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDEucHJldl9zaWJsaW5nLCBOb25lKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAxLnByZXZfc2libGluZywgTm9uZSkKIApAQCAtNDQ3LDcgKzQ0Nyw3IEBACiAgICAgICAgIHIgPSB7fQogICAgICAgICBzZWxmLmFzc2VydFRydWUocHcubWF0Y2hfc2VxKFtsMSwgbDNdLCByKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLCB7InBsIjogbDMsICJwdyI6IFtsMSwgbDNdfSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJbInBsIl0gaXMgbDMpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoclsicGwiXSwgbDMpCiAgICAgICAgIHIgPSB7fQogCiAgICAgZGVmIHRlc3RfZ2VuZXJhdGVfbWF0Y2hlcyhzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfcmVmYWN0b3IucHkgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3JlZmFjdG9yLnB5CmluZGV4IDk3NzNmYzkuLjdmYzg0ZTIgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfcmVmYWN0b3IucHkKKysrIGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9yZWZhY3Rvci5weQpAQCAtNDksOSArNDksMTUgQEAKIAogICAgIGRlZiB0ZXN0X3ByaW50X2Z1bmN0aW9uX29wdGlvbihzZWxmKToKICAgICAgICAgcnQgPSBzZWxmLnJ0KHsicHJpbnRfZnVuY3Rpb24iIDogVHJ1ZX0pCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShydC5ncmFtbWFyIGlzIHB5Z3JhbS5weXRob25fZ3JhbW1hcl9ub19wcmludF9zdGF0ZW1lbnQpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShydC5kcml2ZXIuZ3JhbW1hciBpcwotICAgICAgICAgICAgICAgICAgICAgICAgcHlncmFtLnB5dGhvbl9ncmFtbWFyX25vX3ByaW50X3N0YXRlbWVudCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhydC5ncmFtbWFyLCBweWdyYW0ucHl0aG9uX2dyYW1tYXJfbm9fcHJpbnRfc3RhdGVtZW50KQorICAgICAgICBzZWxmLmFzc2VydElzKHJ0LmRyaXZlci5ncmFtbWFyLAorICAgICAgICAgICAgICAgICAgICAgIHB5Z3JhbS5weXRob25fZ3JhbW1hcl9ub19wcmludF9zdGF0ZW1lbnQpCisKKyAgICBkZWYgdGVzdF93cml0ZV91bmNoYW5nZWRfZmlsZXNfb3B0aW9uKHNlbGYpOgorICAgICAgICBydCA9IHNlbGYucnQoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJ0LndyaXRlX3VuY2hhbmdlZF9maWxlcykKKyAgICAgICAgcnQgPSBzZWxmLnJ0KHsid3JpdGVfdW5jaGFuZ2VkX2ZpbGVzIiA6IFRydWV9KQorICAgICAgICBzZWxmLmFzc2VydFRydWUocnQud3JpdGVfdW5jaGFuZ2VkX2ZpbGVzKQogCiAgICAgZGVmIHRlc3RfZml4ZXJfbG9hZGluZ19oZWxwZXJzKHNlbGYpOgogICAgICAgICBjb250ZW50cyA9IFsiZXhwbGljaXQiLCAiZmlyc3QiLCAibGFzdCIsICJwYXJyb3QiLCAicHJlb3JkZXIiXQpAQCAtMTc2LDcgKzE4Miw5IEBACiAgICAgICAgICAgICAgICAgICAgICI8c3RkaW4+IiwgRmFsc2VdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0cywgZXhwZWN0ZWQpCiAKLSAgICBkZWYgY2hlY2tfZmlsZV9yZWZhY3RvcmluZyhzZWxmLCB0ZXN0X2ZpbGUsIGZpeGVycz1fMlRPM19GSVhFUlMpOgorICAgIGRlZiBjaGVja19maWxlX3JlZmFjdG9yaW5nKHNlbGYsIHRlc3RfZmlsZSwgZml4ZXJzPV8yVE8zX0ZJWEVSUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPU5vbmUsIG1vY2tfbG9nX2RlYnVnPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsbHlfd3JpdGU9VHJ1ZSk6CiAgICAgICAgIHRtcGRpciA9IHRlbXBmaWxlLm1rZHRlbXAocHJlZml4PSIydG8zLXRlc3RfcmVmYWN0b3IiKQogICAgICAgICBzZWxmLmFkZENsZWFudXAoc2h1dGlsLnJtdHJlZSwgdG1wZGlyKQogICAgICAgICAjIG1ha2UgYSBjb3B5IG9mIHRoZSB0ZXN0ZWQgZmlsZSB0aGF0IHdlIGNhbiB3cml0ZSB0bwpAQCAtMTg5LDExICsxOTcsMTUgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gZnAucmVhZCgpCiAKICAgICAgICAgb2xkX2NvbnRlbnRzID0gcmVhZF9maWxlKCkKLSAgICAgICAgcnQgPSBzZWxmLnJ0KGZpeGVycz1maXhlcnMpCisgICAgICAgIHJ0ID0gc2VsZi5ydChmaXhlcnM9Zml4ZXJzLCBvcHRpb25zPW9wdGlvbnMpCisgICAgICAgIGlmIG1vY2tfbG9nX2RlYnVnOgorICAgICAgICAgICAgcnQubG9nX2RlYnVnID0gbW9ja19sb2dfZGVidWcKIAogICAgICAgICBydC5yZWZhY3Rvcl9maWxlKHRlc3RfZmlsZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvbGRfY29udGVudHMsIHJlYWRfZmlsZSgpKQogCisgICAgICAgIGlmIG5vdCBhY3R1YWxseV93cml0ZToKKyAgICAgICAgICAgIHJldHVybgogICAgICAgICBydC5yZWZhY3Rvcl9maWxlKHRlc3RfZmlsZSwgVHJ1ZSkKICAgICAgICAgbmV3X2NvbnRlbnRzID0gcmVhZF9maWxlKCkKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChvbGRfY29udGVudHMsIG5ld19jb250ZW50cykKQEAgLTIwMyw2ICsyMTUsMjYgQEAKICAgICAgICAgdGVzdF9maWxlID0gb3MucGF0aC5qb2luKEZJWEVSX0RJUiwgInBhcnJvdF9leGFtcGxlLnB5IikKICAgICAgICAgc2VsZi5jaGVja19maWxlX3JlZmFjdG9yaW5nKHRlc3RfZmlsZSwgX0RFRkFVTFRfRklYRVJTKQogCisgICAgZGVmIHRlc3RfcmVmYWN0b3JfZmlsZV93cml0ZV91bmNoYW5nZWRfZmlsZShzZWxmKToKKyAgICAgICAgdGVzdF9maWxlID0gb3MucGF0aC5qb2luKEZJWEVSX0RJUiwgInBhcnJvdF9leGFtcGxlLnB5IikKKyAgICAgICAgZGVidWdfbWVzc2FnZXMgPSBbXQorICAgICAgICBkZWYgcmVjb3JkaW5nX2xvZ19kZWJ1Zyhtc2csICphcmdzKToKKyAgICAgICAgICAgIGRlYnVnX21lc3NhZ2VzLmFwcGVuZChtc2cgJSBhcmdzKQorICAgICAgICBzZWxmLmNoZWNrX2ZpbGVfcmVmYWN0b3JpbmcodGVzdF9maWxlLCBmaXhlcnM9KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXsid3JpdGVfdW5jaGFuZ2VkX2ZpbGVzIjogVHJ1ZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2NrX2xvZ19kZWJ1Zz1yZWNvcmRpbmdfbG9nX2RlYnVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsbHlfd3JpdGU9RmFsc2UpCisgICAgICAgICMgVGVzdGluZyB0aGF0IGl0IGxvZ2dlZCB0aGlzIG1lc3NhZ2Ugd2hlbiB3cml0ZT1GYWxzZSB3YXMgcGFzc2VkIGlzCisgICAgICAgICMgc3VmZmljaWVudCB0byBzZWUgdGhhdCBpdCBkaWQgbm90IGJhaWwgZWFybHkgYWZ0ZXIgIk5vIGNoYW5nZXMiLgorICAgICAgICBtZXNzYWdlX3JlZ2V4ID0gciJOb3Qgd3JpdGluZyBjaGFuZ2VzIHRvIC4qJXMlcyIgJSAoCisgICAgICAgICAgICAgICAgb3Muc2VwLCBvcy5wYXRoLmJhc2VuYW1lKHRlc3RfZmlsZSkpCisgICAgICAgIGZvciBtZXNzYWdlIGluIGRlYnVnX21lc3NhZ2VzOgorICAgICAgICAgICAgaWYgIk5vdCB3cml0aW5nIGNoYW5nZXMiIGluIG1lc3NhZ2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSZWdleHBNYXRjaGVzKG1lc3NhZ2UsIG1lc3NhZ2VfcmVnZXgpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiJXIgbm90IG1hdGNoZWQgaW4gJXIiICUgKG1lc3NhZ2VfcmVnZXgsIGRlYnVnX21lc3NhZ2VzKSkKKwogICAgIGRlZiB0ZXN0X3JlZmFjdG9yX2RpcihzZWxmKToKICAgICAgICAgZGVmIGNoZWNrKHN0cnVjdHVyZSwgZXhwZWN0ZWQpOgogICAgICAgICAgICAgZGVmIG1vY2tfcmVmYWN0b3JfZmlsZShzZWxmLCBmLCAqYXJncyk6CkBAIC0yMzksNiArMjcxLDEwIEBACiAgICAgICAgIGZuID0gb3MucGF0aC5qb2luKFRFU1RfREFUQV9ESVIsICJkaWZmZXJlbnRfZW5jb2RpbmcucHkiKQogICAgICAgICBzZWxmLmNoZWNrX2ZpbGVfcmVmYWN0b3JpbmcoZm4pCiAKKyAgICBkZWYgdGVzdF9mYWxzZV9maWxlX2VuY29kaW5nKHNlbGYpOgorICAgICAgICBmbiA9IG9zLnBhdGguam9pbihURVNUX0RBVEFfRElSLCAiZmFsc2VfZW5jb2RpbmcucHkiKQorICAgICAgICBkYXRhID0gc2VsZi5jaGVja19maWxlX3JlZmFjdG9yaW5nKGZuKQorCiAgICAgZGVmIHRlc3RfYm9tKHNlbGYpOgogICAgICAgICBmbiA9IG9zLnBhdGguam9pbihURVNUX0RBVEFfRElSLCAiYm9tLnB5IikKICAgICAgICAgZGF0YSA9IHNlbGYuY2hlY2tfZmlsZV9yZWZhY3RvcmluZyhmbikKZGlmZiAtLWdpdCBhL0xpYi9sb2NhbGUucHkgYi9MaWIvbG9jYWxlLnB5CmluZGV4IDU2MWU5ZTQuLjI1ZGNjYWYgMTAwNjQ0Ci0tLSBhL0xpYi9sb2NhbGUucHkKKysrIGIvTGliL2xvY2FsZS5weQpAQCAtMTgsNiArMTgsMTQgQEAKIGltcG9ydCBvcGVyYXRvcgogaW1wb3J0IGZ1bmN0b29scwogCit0cnk6CisgICAgX3VuaWNvZGUgPSB1bmljb2RlCitleGNlcHQgTmFtZUVycm9yOgorICAgICMgSWYgUHl0aG9uIGlzIGJ1aWx0IHdpdGhvdXQgVW5pY29kZSBzdXBwb3J0LCB0aGUgdW5pY29kZSB0eXBlCisgICAgIyB3aWxsIG5vdCBleGlzdC4gRmFrZSBvbmUuCisgICAgY2xhc3MgX3VuaWNvZGUob2JqZWN0KToKKyAgICAgICAgcGFzcworCiAjIFRyeSBpbXBvcnRpbmcgdGhlIF9sb2NhbGUgbW9kdWxlLgogIwogIyBJZiB0aGlzIGZhaWxzLCBmYWxsIGJhY2sgb24gYSBiYXNpYyAnQycgbG9jYWxlIGVtdWxhdGlvbi4KQEAgLTMzNiw2ICszNDQsMjIgQEAKICAgICBmb3IgeCBpbiByYW5nZSgyNTYpCiApCiAKK2RlZiBfcmVwbGFjZV9lbmNvZGluZyhjb2RlLCBlbmNvZGluZyk6CisgICAgaWYgJy4nIGluIGNvZGU6CisgICAgICAgIGxhbmduYW1lID0gY29kZVs6Y29kZS5pbmRleCgnLicpXQorICAgIGVsc2U6CisgICAgICAgIGxhbmduYW1lID0gY29kZQorICAgICMgQ29udmVydCB0aGUgZW5jb2RpbmcgdG8gYSBDIGxpYiBjb21wYXRpYmxlIGVuY29kaW5nIHN0cmluZworICAgIG5vcm1fZW5jb2RpbmcgPSBlbmNvZGluZ3Mubm9ybWFsaXplX2VuY29kaW5nKGVuY29kaW5nKQorICAgICNwcmludCgnbm9ybSBlbmNvZGluZzogJXInICUgbm9ybV9lbmNvZGluZykKKyAgICBub3JtX2VuY29kaW5nID0gZW5jb2RpbmdzLmFsaWFzZXMuYWxpYXNlcy5nZXQobm9ybV9lbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybV9lbmNvZGluZykKKyAgICAjcHJpbnQoJ2FsaWFzZWQgZW5jb2Rpbmc6ICVyJyAlIG5vcm1fZW5jb2RpbmcpCisgICAgZW5jb2RpbmcgPSBsb2NhbGVfZW5jb2RpbmdfYWxpYXMuZ2V0KG5vcm1fZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1fZW5jb2RpbmcpCisgICAgI3ByaW50KCdmb3VuZCBlbmNvZGluZyAlcicgJSBlbmNvZGluZykKKyAgICByZXR1cm4gbGFuZ25hbWUgKyAnLicgKyBlbmNvZGluZworCiBkZWYgbm9ybWFsaXplKGxvY2FsZW5hbWUpOgogCiAgICAgIiIiIFJldHVybnMgYSBub3JtYWxpemVkIGxvY2FsZSBjb2RlIGZvciB0aGUgZ2l2ZW4gbG9jYWxlCkBAIC0zNTIsNTcgKzM3Niw3MyBAQAogICAgICAgICBkb2VzLgogCiAgICAgIiIiCi0gICAgIyBOb3JtYWxpemUgdGhlIGxvY2FsZSBuYW1lIGFuZCBleHRyYWN0IHRoZSBlbmNvZGluZwotICAgIGlmIGlzaW5zdGFuY2UobG9jYWxlbmFtZSwgdW5pY29kZSk6CisgICAgIyBOb3JtYWxpemUgdGhlIGxvY2FsZSBuYW1lIGFuZCBleHRyYWN0IHRoZSBlbmNvZGluZyBhbmQgbW9kaWZpZXIKKyAgICBpZiBpc2luc3RhbmNlKGxvY2FsZW5hbWUsIF91bmljb2RlKToKICAgICAgICAgbG9jYWxlbmFtZSA9IGxvY2FsZW5hbWUuZW5jb2RlKCdhc2NpaScpCi0gICAgZnVsbG5hbWUgPSBsb2NhbGVuYW1lLnRyYW5zbGF0ZShfYXNjaWlfbG93ZXJfbWFwKQotICAgIGlmICc6JyBpbiBmdWxsbmFtZToKKyAgICBjb2RlID0gbG9jYWxlbmFtZS50cmFuc2xhdGUoX2FzY2lpX2xvd2VyX21hcCkKKyAgICBpZiAnOicgaW4gY29kZToKICAgICAgICAgIyAnOicgaXMgc29tZXRpbWVzIHVzZWQgYXMgZW5jb2RpbmcgZGVsaW1pdGVyLgotICAgICAgICBmdWxsbmFtZSA9IGZ1bGxuYW1lLnJlcGxhY2UoJzonLCAnLicpCi0gICAgaWYgJy4nIGluIGZ1bGxuYW1lOgotICAgICAgICBsYW5nbmFtZSwgZW5jb2RpbmcgPSBmdWxsbmFtZS5zcGxpdCgnLicpWzoyXQotICAgICAgICBmdWxsbmFtZSA9IGxhbmduYW1lICsgJy4nICsgZW5jb2RpbmcKKyAgICAgICAgY29kZSA9IGNvZGUucmVwbGFjZSgnOicsICcuJykKKyAgICBpZiAnQCcgaW4gY29kZToKKyAgICAgICAgY29kZSwgbW9kaWZpZXIgPSBjb2RlLnNwbGl0KCdAJywgMSkKICAgICBlbHNlOgotICAgICAgICBsYW5nbmFtZSA9IGZ1bGxuYW1lCisgICAgICAgIG1vZGlmaWVyID0gJycKKyAgICBpZiAnLicgaW4gY29kZToKKyAgICAgICAgbGFuZ25hbWUsIGVuY29kaW5nID0gY29kZS5zcGxpdCgnLicpWzoyXQorICAgIGVsc2U6CisgICAgICAgIGxhbmduYW1lID0gY29kZQogICAgICAgICBlbmNvZGluZyA9ICcnCiAKLSAgICAjIEZpcnN0IGxvb2t1cDogZnVsbG5hbWUgKHBvc3NpYmx5IHdpdGggZW5jb2RpbmcpCi0gICAgbm9ybV9lbmNvZGluZyA9IGVuY29kaW5nLnJlcGxhY2UoJy0nLCAnJykKLSAgICBub3JtX2VuY29kaW5nID0gbm9ybV9lbmNvZGluZy5yZXBsYWNlKCdfJywgJycpCi0gICAgbG9va3VwX25hbWUgPSBsYW5nbmFtZSArICcuJyArIGVuY29kaW5nCisgICAgIyBGaXJzdCBsb29rdXA6IGZ1bGxuYW1lIChwb3NzaWJseSB3aXRoIGVuY29kaW5nIGFuZCBtb2RpZmllcikKKyAgICBsYW5nX2VuYyA9IGxhbmduYW1lCisgICAgaWYgZW5jb2Rpbmc6CisgICAgICAgIG5vcm1fZW5jb2RpbmcgPSBlbmNvZGluZy5yZXBsYWNlKCctJywgJycpCisgICAgICAgIG5vcm1fZW5jb2RpbmcgPSBub3JtX2VuY29kaW5nLnJlcGxhY2UoJ18nLCAnJykKKyAgICAgICAgbGFuZ19lbmMgKz0gJy4nICsgbm9ybV9lbmNvZGluZworICAgIGxvb2t1cF9uYW1lID0gbGFuZ19lbmMKKyAgICBpZiBtb2RpZmllcjoKKyAgICAgICAgbG9va3VwX25hbWUgKz0gJ0AnICsgbW9kaWZpZXIKICAgICBjb2RlID0gbG9jYWxlX2FsaWFzLmdldChsb29rdXBfbmFtZSwgTm9uZSkKICAgICBpZiBjb2RlIGlzIG5vdCBOb25lOgogICAgICAgICByZXR1cm4gY29kZQotICAgICNwcmludCAnZmlyc3QgbG9va3VwIGZhaWxlZCcKKyAgICAjcHJpbnQoJ2ZpcnN0IGxvb2t1cCBmYWlsZWQnKQogCi0gICAgIyBTZWNvbmQgdHJ5OiBsYW5nbmFtZSAod2l0aG91dCBlbmNvZGluZykKLSAgICBjb2RlID0gbG9jYWxlX2FsaWFzLmdldChsYW5nbmFtZSwgTm9uZSkKLSAgICBpZiBjb2RlIGlzIG5vdCBOb25lOgotICAgICAgICAjcHJpbnQgJ2xhbmduYW1lIGxvb2t1cCBzdWNjZWVkZWQnCi0gICAgICAgIGlmICcuJyBpbiBjb2RlOgotICAgICAgICAgICAgbGFuZ25hbWUsIGRlZmVuYyA9IGNvZGUuc3BsaXQoJy4nKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgbGFuZ25hbWUgPSBjb2RlCi0gICAgICAgICAgICBkZWZlbmMgPSAnJwotICAgICAgICBpZiBlbmNvZGluZzoKLSAgICAgICAgICAgICMgQ29udmVydCB0aGUgZW5jb2RpbmcgdG8gYSBDIGxpYiBjb21wYXRpYmxlIGVuY29kaW5nIHN0cmluZwotICAgICAgICAgICAgbm9ybV9lbmNvZGluZyA9IGVuY29kaW5ncy5ub3JtYWxpemVfZW5jb2RpbmcoZW5jb2RpbmcpCi0gICAgICAgICAgICAjcHJpbnQgJ25vcm0gZW5jb2Rpbmc6ICVyJyAlIG5vcm1fZW5jb2RpbmcKLSAgICAgICAgICAgIG5vcm1fZW5jb2RpbmcgPSBlbmNvZGluZ3MuYWxpYXNlcy5hbGlhc2VzLmdldChub3JtX2VuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1fZW5jb2RpbmcpCi0gICAgICAgICAgICAjcHJpbnQgJ2FsaWFzZWQgZW5jb2Rpbmc6ICVyJyAlIG5vcm1fZW5jb2RpbmcKLSAgICAgICAgICAgIGVuY29kaW5nID0gbG9jYWxlX2VuY29kaW5nX2FsaWFzLmdldChub3JtX2VuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1fZW5jb2RpbmcpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBlbmNvZGluZyA9IGRlZmVuYwotICAgICAgICAjcHJpbnQgJ2ZvdW5kIGVuY29kaW5nICVyJyAlIGVuY29kaW5nCi0gICAgICAgIGlmIGVuY29kaW5nOgotICAgICAgICAgICAgcmV0dXJuIGxhbmduYW1lICsgJy4nICsgZW5jb2RpbmcKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBsYW5nbmFtZQorICAgIGlmIG1vZGlmaWVyOgorICAgICAgICAjIFNlY29uZCB0cnk6IGZ1bGxuYW1lIHdpdGhvdXQgbW9kaWZpZXIgKHBvc3NpYmx5IHdpdGggZW5jb2RpbmcpCisgICAgICAgIGNvZGUgPSBsb2NhbGVfYWxpYXMuZ2V0KGxhbmdfZW5jLCBOb25lKQorICAgICAgICBpZiBjb2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgI3ByaW50KCdsb29rdXAgd2l0aG91dCBtb2RpZmllciBzdWNjZWVkZWQnKQorICAgICAgICAgICAgaWYgJ0AnIG5vdCBpbiBjb2RlOgorICAgICAgICAgICAgICAgIHJldHVybiBjb2RlICsgJ0AnICsgbW9kaWZpZXIKKyAgICAgICAgICAgIGlmIGNvZGUuc3BsaXQoJ0AnLCAxKVsxXS50cmFuc2xhdGUoX2FzY2lpX2xvd2VyX21hcCkgPT0gbW9kaWZpZXI6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUKKyAgICAgICAgI3ByaW50KCdzZWNvbmQgbG9va3VwIGZhaWxlZCcpCiAKLSAgICBlbHNlOgotICAgICAgICByZXR1cm4gbG9jYWxlbmFtZQorICAgIGlmIGVuY29kaW5nOgorICAgICAgICAjIFRoaXJkIHRyeTogbGFuZ25hbWUgKHdpdGhvdXQgZW5jb2RpbmcsIHBvc3NpYmx5IHdpdGggbW9kaWZpZXIpCisgICAgICAgIGxvb2t1cF9uYW1lID0gbGFuZ25hbWUKKyAgICAgICAgaWYgbW9kaWZpZXI6CisgICAgICAgICAgICBsb29rdXBfbmFtZSArPSAnQCcgKyBtb2RpZmllcgorICAgICAgICBjb2RlID0gbG9jYWxlX2FsaWFzLmdldChsb29rdXBfbmFtZSwgTm9uZSkKKyAgICAgICAgaWYgY29kZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICNwcmludCgnbG9va3VwIHdpdGhvdXQgZW5jb2Rpbmcgc3VjY2VlZGVkJykKKyAgICAgICAgICAgIGlmICdAJyBub3QgaW4gY29kZToKKyAgICAgICAgICAgICAgICByZXR1cm4gX3JlcGxhY2VfZW5jb2RpbmcoY29kZSwgZW5jb2RpbmcpCisgICAgICAgICAgICBjb2RlLCBtb2RpZmllciA9IGNvZGUuc3BsaXQoJ0AnLCAxKQorICAgICAgICAgICAgcmV0dXJuIF9yZXBsYWNlX2VuY29kaW5nKGNvZGUsIGVuY29kaW5nKSArICdAJyArIG1vZGlmaWVyCisKKyAgICAgICAgaWYgbW9kaWZpZXI6CisgICAgICAgICAgICAjIEZvdXJ0aCB0cnk6IGxhbmduYW1lICh3aXRob3V0IGVuY29kaW5nIGFuZCBtb2RpZmllcikKKyAgICAgICAgICAgIGNvZGUgPSBsb2NhbGVfYWxpYXMuZ2V0KGxhbmduYW1lLCBOb25lKQorICAgICAgICAgICAgaWYgY29kZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAjcHJpbnQoJ2xvb2t1cCB3aXRob3V0IG1vZGlmaWVyIGFuZCBlbmNvZGluZyBzdWNjZWVkZWQnKQorICAgICAgICAgICAgICAgIGlmICdAJyBub3QgaW4gY29kZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZXBsYWNlX2VuY29kaW5nKGNvZGUsIGVuY29kaW5nKSArICdAJyArIG1vZGlmaWVyCisgICAgICAgICAgICAgICAgY29kZSwgZGVmbW9kID0gY29kZS5zcGxpdCgnQCcsIDEpCisgICAgICAgICAgICAgICAgaWYgZGVmbW9kLnRyYW5zbGF0ZShfYXNjaWlfbG93ZXJfbWFwKSA9PSBtb2RpZmllcjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZXBsYWNlX2VuY29kaW5nKGNvZGUsIGVuY29kaW5nKSArICdAJyArIGRlZm1vZAorCisgICAgcmV0dXJuIGxvY2FsZW5hbWUKIAogZGVmIF9wYXJzZV9sb2NhbGVuYW1lKGxvY2FsZW5hbWUpOgogCkBAIC00MjEsNyArNDYxLDcgQEAKICAgICBjb2RlID0gbm9ybWFsaXplKGxvY2FsZW5hbWUpCiAgICAgaWYgJ0AnIGluIGNvZGU6CiAgICAgICAgICMgRGVhbCB3aXRoIGxvY2FsZSBtb2RpZmllcnMKLSAgICAgICAgY29kZSwgbW9kaWZpZXIgPSBjb2RlLnNwbGl0KCdAJykKKyAgICAgICAgY29kZSwgbW9kaWZpZXIgPSBjb2RlLnNwbGl0KCdAJywgMSkKICAgICAgICAgaWYgbW9kaWZpZXIgPT0gJ2V1cm8nIGFuZCAnLicgbm90IGluIGNvZGU6CiAgICAgICAgICAgICAjIEFzc3VtZSBMYXRpbi05IGZvciBAZXVybyBsb2NhbGVzLiBUaGlzIGlzIGJvZ3VzLAogICAgICAgICAgICAgIyBzaW5jZSBzb21lIHN5c3RlbXMgbWF5IHVzZSBvdGhlciBlbmNvZGluZ3MgZm9yIHRoZXNlCkBAIC03MjYsMTEgKzc2NiwzMCBAQAogIyAgICB1cGRhdGVkICdzcl95dS51dGY4QGN5cmlsbGljJyAtPiAnc3JfQ1MuVVRGLTgnIHRvICdzcl9SUy5VVEYtOCcKICMgICAgdXBkYXRlZCAnc3JfeXVAY3lyaWxsaWMnIC0+ICdzcl9DUy5JU084ODU5LTUnIHRvICdzcl9SUy5VVEYtOCcKICMKKyMgU1MgMjAxMy0xMi0yMDoKKyMgVXBkYXRlZCBhbGlhcyBtYXBwaW5nIHRvIG1vc3QgcmVjZW50IGxvY2FsZS5hbGlhcyBmaWxlCisjIGZyb20gWC5vcmcgZGlzdHJpYnV0aW9uIHVzaW5nIG1ha2Vsb2NhbGVhbGlhcy5weS4KKyMKKyMgVGhlc2UgYXJlIHRoZSBkaWZmZXJlbmNlcyBjb21wYXJlZCB0byB0aGUgb2xkIG1hcHBpbmcgKFB5dGhvbiAyLjcuNgorIyBhbmQgb2xkZXIpOgorIworIyAgICB1cGRhdGVkICdhMycgLT4gJ2EzX0FaLktPSTgtQycgdG8gJ2F6X0FaLktPSTgtQycKKyMgICAgdXBkYXRlZCAnYTNfYXonIC0+ICdhM19BWi5LT0k4LUMnIHRvICdhel9BWi5LT0k4LUMnCisjICAgIHVwZGF0ZWQgJ2EzX2F6LmtvaThjJyAtPiAnYTNfQVouS09JOC1DJyB0byAnYXpfQVouS09JOC1DJworIyAgICB1cGRhdGVkICdjc19jcy5pc284ODU5MicgLT4gJ2NzX0NTLklTTzg4NTktMicgdG8gJ2NzX0NaLklTTzg4NTktMicKKyMgICAgdXBkYXRlZCAnaGVicmV3JyAtPiAnaXdfSUwuSVNPODg1OS04JyB0byAnaGVfSUwuSVNPODg1OS04JworIyAgICB1cGRhdGVkICdoZWJyZXcuaXNvODg1OTgnIC0+ICdpd19JTC5JU084ODU5LTgnIHRvICdoZV9JTC5JU084ODU5LTgnCisjICAgIHVwZGF0ZWQgJ3NkJyAtPiAnc2RfSU5AZGV2YW5hZ2FyaS5VVEYtOCcgdG8gJ3NkX0lOLlVURi04JworIyAgICB1cGRhdGVkICdzckBsYXRuJyAtPiAnc3JfUlMuVVRGLThAbGF0aW4nIHRvICdzcl9DUy5VVEYtOEBsYXRpbicKKyMgICAgdXBkYXRlZCAnc3JfY3MnIC0+ICdzcl9SUy5VVEYtOCcgdG8gJ3NyX0NTLlVURi04JworIyAgICB1cGRhdGVkICdzcl9jcy51dGY4QGxhdG4nIC0+ICdzcl9SUy5VVEYtOEBsYXRpbicgdG8gJ3NyX0NTLlVURi04QGxhdGluJworIyAgICB1cGRhdGVkICdzcl9jc0BsYXRuJyAtPiAnc3JfUlMuVVRGLThAbGF0aW4nIHRvICdzcl9DUy5VVEYtOEBsYXRpbicKIAogbG9jYWxlX2FsaWFzID0gewotICAgICdhMyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYTNfQVouS09JOC1DJywKLSAgICAnYTNfYXonOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EzX0FaLktPSTgtQycsCi0gICAgJ2EzX2F6LmtvaThjJzogICAgICAgICAgICAgICAgICAgICAgICAgICdhM19BWi5LT0k4LUMnLAorICAgICdhMyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXpfQVouS09JOC1DJywKKyAgICAnYTNfYXonOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2F6X0FaLktPSTgtQycsCisgICAgJ2EzX2F6LmtvaThjJzogICAgICAgICAgICAgICAgICAgICAgICAgICdhel9BWi5LT0k4LUMnLAorICAgICdhM19hei5rb2ljJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnYXpfQVouS09JOC1DJywKICAgICAnYWYnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FmX1pBLklTTzg4NTktMScsCiAgICAgJ2FmX3phJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZl9aQS5JU084ODU5LTEnLAogICAgICdhZl96YS5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnYWZfWkEuSVNPODg1OS0xJywKQEAgLTc0OSw2ICs4MDgsNyBAQAogICAgICdhcl9kei5pc284ODU5Nic6ICAgICAgICAgICAgICAgICAgICAgICAnYXJfRFouSVNPODg1OS02JywKICAgICAnYXJfZWcnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyX0VHLklTTzg4NTktNicsCiAgICAgJ2FyX2VnLmlzbzg4NTk2JzogICAgICAgICAgICAgICAgICAgICAgICdhcl9FRy5JU084ODU5LTYnLAorICAgICdhcl9pbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJfSU4uVVRGLTgnLAogICAgICdhcl9pcSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJfSVEuSVNPODg1OS02JywKICAgICAnYXJfaXEuaXNvODg1OTYnOiAgICAgICAgICAgICAgICAgICAgICAgJ2FyX0lRLklTTzg4NTktNicsCiAgICAgJ2FyX2pvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcl9KTy5JU084ODU5LTYnLApAQCAtNzc4LDYgKzgzOCw3IEBACiAgICAgJ2FyYWJpYyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcl9BQS5JU084ODU5LTYnLAogICAgICdhcmFiaWMuaXNvODg1OTYnOiAgICAgICAgICAgICAgICAgICAgICAnYXJfQUEuSVNPODg1OS02JywKICAgICAnYXMnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FzX0lOLlVURi04JywKKyAgICAnYXNfaW4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FzX0lOLlVURi04JywKICAgICAnYXonOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2F6X0FaLklTTzg4NTktOUUnLAogICAgICdhel9heic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXpfQVouSVNPODg1OS05RScsCiAgICAgJ2F6X2F6Lmlzbzg4NTk5ZSc6ICAgICAgICAgICAgICAgICAgICAgICdhel9BWi5JU084ODU5LTlFJywKQEAgLTc5NSw2ICs4NTYsNyBAQAogICAgICdiZ19iZy5rb2k4cic6ICAgICAgICAgICAgICAgICAgICAgICAgICAnYmdfQkcuS09JOC1SJywKICAgICAnYmdfYmcubWljcm9zb2Z0Y3AxMjUxJzogICAgICAgICAgICAgICAgJ2JnX0JHLkNQMTI1MScsCiAgICAgJ2JuX2luJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdibl9JTi5VVEYtOCcsCisgICAgJ2JvX2luJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdib19JTi5VVEYtOCcsCiAgICAgJ2Jva21hbCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYl9OTy5JU084ODU5LTEnLAogICAgICdib2ttXHhlNWwnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmJfTk8uSVNPODg1OS0xJywKICAgICAnYnInOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JyX0ZSLklTTzg4NTktMScsCkBAIC04MTIsNiArODc0LDcgQEAKICAgICAnYyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnLAogICAgICdjLWZyZW5jaCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJfQ0EuSVNPODg1OS0xJywKICAgICAnYy1mcmVuY2guaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgJ2ZyX0NBLklTTzg4NTktMScsCisgICAgJ2MuYXNjaWknOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJywKICAgICAnYy5lbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnLAogICAgICdjLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fVVMuSVNPODg1OS0xJywKICAgICAnY19jJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnLApAQCAtODQ5LDcgKzkxMiw3IEBACiAgICAgJ2Nyb2F0aWFuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdocl9IUi5JU084ODU5LTInLAogICAgICdjcyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3NfQ1ouSVNPODg1OS0yJywKICAgICAnY3NfY3MnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NzX0NaLklTTzg4NTktMicsCi0gICAgJ2NzX2NzLmlzbzg4NTkyJzogICAgICAgICAgICAgICAgICAgICAgICdjc19DUy5JU084ODU5LTInLAorICAgICdjc19jcy5pc284ODU5Mic6ICAgICAgICAgICAgICAgICAgICAgICAnY3NfQ1ouSVNPODg1OS0yJywKICAgICAnY3NfY3onOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NzX0NaLklTTzg4NTktMicsCiAgICAgJ2NzX2N6Lmlzbzg4NTkyJzogICAgICAgICAgICAgICAgICAgICAgICdjc19DWi5JU084ODU5LTInLAogICAgICdjeSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3lfR0IuSVNPODg1OS0xJywKQEAgLTExNTMsMTIgKzEyMTYsMTMgQEAKICAgICAnaGVfaWwuY3AxMjU1JzogICAgICAgICAgICAgICAgICAgICAgICAgJ2hlX0lMLkNQMTI1NScsCiAgICAgJ2hlX2lsLmlzbzg4NTk4JzogICAgICAgICAgICAgICAgICAgICAgICdoZV9JTC5JU084ODU5LTgnLAogICAgICdoZV9pbC5taWNyb3NvZnRjcDEyNTUnOiAgICAgICAgICAgICAgICAnaGVfSUwuQ1AxMjU1JywKLSAgICAnaGVicmV3JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2l3X0lMLklTTzg4NTktOCcsCi0gICAgJ2hlYnJldy5pc284ODU5OCc6ICAgICAgICAgICAgICAgICAgICAgICdpd19JTC5JU084ODU5LTgnLAorICAgICdoZWJyZXcnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGVfSUwuSVNPODg1OS04JywKKyAgICAnaGVicmV3Lmlzbzg4NTk4JzogICAgICAgICAgICAgICAgICAgICAgJ2hlX0lMLklTTzg4NTktOCcsCiAgICAgJ2hpJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoaV9JTi5JU0NJSS1ERVYnLAogICAgICdoaV9pbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGlfSU4uSVNDSUktREVWJywKICAgICAnaGlfaW4uaXNjaWlkZXYnOiAgICAgICAgICAgICAgICAgICAgICAgJ2hpX0lOLklTQ0lJLURFVicsCiAgICAgJ2huZSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdobmVfSU4uVVRGLTgnLAorICAgICdobmVfaW4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG5lX0lOLlVURi04JywKICAgICAnaHInOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hyX0hSLklTTzg4NTktMicsCiAgICAgJ2hyX2hyJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdocl9IUi5JU084ODU5LTInLAogICAgICdocl9oci5pc284ODU5Mic6ICAgICAgICAgICAgICAgICAgICAgICAnaHJfSFIuSVNPODg1OS0yJywKQEAgLTEyNDYsNyArMTMxMCw4IEBACiAgICAgJ2tvcmVhbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrb19LUi5ldWNLUicsCiAgICAgJ2tvcmVhbi5ldWMnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdrb19LUi5ldWNLUicsCiAgICAgJ2tzJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrc19JTi5VVEYtOCcsCi0gICAgJ2tzX2luQGRldmFuYWdhcmknOiAgICAgICAgICAgICAgICAgICAgICdrc19JTkBkZXZhbmFnYXJpLlVURi04JywKKyAgICAna3NfaW4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2tzX0lOLlVURi04JywKKyAgICAna3NfaW5AZGV2YW5hZ2FyaSc6ICAgICAgICAgICAgICAgICAgICAgJ2tzX0lOLlVURi04QGRldmFuYWdhcmknLAogICAgICdrdyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAna3dfR0IuSVNPODg1OS0xJywKICAgICAna3dfZ2InOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2t3X0dCLklTTzg4NTktMScsCiAgICAgJ2t3X2diLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdrd19HQi5JU084ODU5LTEnLApAQCAtMTI3MCw2ICsxMzM1LDcgQEAKICAgICAnbHZfbHYuaXNvODg1OTEzJzogICAgICAgICAgICAgICAgICAgICAgJ2x2X0xWLklTTzg4NTktMTMnLAogICAgICdsdl9sdi5pc284ODU5NCc6ICAgICAgICAgICAgICAgICAgICAgICAnbHZfTFYuSVNPODg1OS00JywKICAgICAnbWFpJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21haV9JTi5VVEYtOCcsCisgICAgJ21haV9pbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYWlfSU4uVVRGLTgnLAogICAgICdtaSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWlfTlouSVNPODg1OS0xJywKICAgICAnbWlfbnonOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21pX05aLklTTzg4NTktMScsCiAgICAgJ21pX256Lmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdtaV9OWi5JU084ODU5LTEnLApAQCAtMTI3OSw2ICsxMzQ1LDcgQEAKICAgICAnbWtfbWsuaXNvODg1OTUnOiAgICAgICAgICAgICAgICAgICAgICAgJ21rX01LLklTTzg4NTktNScsCiAgICAgJ21rX21rLm1pY3Jvc29mdGNwMTI1MSc6ICAgICAgICAgICAgICAgICdta19NSy5DUDEyNTEnLAogICAgICdtbCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWxfSU4uVVRGLTgnLAorICAgICdtbF9pbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWxfSU4uVVRGLTgnLAogICAgICdtcic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXJfSU4uVVRGLTgnLAogICAgICdtcl9pbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXJfSU4uVVRGLTgnLAogICAgICdtcyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXNfTVkuSVNPODg1OS0xJywKQEAgLTEyOTMsNiArMTM2MCw3IEBACiAgICAgJ25iX25vLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICduYl9OTy5JU084ODU5LTEnLAogICAgICduYl9uby5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnbmJfTk8uSVNPODg1OS0xNScsCiAgICAgJ25iX25vQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICduYl9OTy5JU084ODU5LTE1JywKKyAgICAnbmVfbnAnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25lX05QLlVURi04JywKICAgICAnbmwnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25sX05MLklTTzg4NTktMScsCiAgICAgJ25sLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICAgICdubF9OTC5JU084ODU5LTE1JywKICAgICAnbmxfYmUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25sX0JFLklTTzg4NTktMScsCkBAIC0xMzQ1LDYgKzE0MTMsNyBAQAogICAgICdvY19mci5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnb2NfRlIuSVNPODg1OS0xNScsCiAgICAgJ29jX2ZyQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdvY19GUi5JU084ODU5LTE1JywKICAgICAnb3InOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29yX0lOLlVURi04JywKKyAgICAnb3JfaW4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29yX0lOLlVURi04JywKICAgICAncGEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhX0lOLlVURi04JywKICAgICAncGFfaW4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhX0lOLlVURi04JywKICAgICAncGQnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BkX1VTLklTTzg4NTktMScsCkBAIC0xNDA2LDcgKzE0NzUsMTAgQEAKICAgICAncncnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J3X1JXLklTTzg4NTktMScsCiAgICAgJ3J3X3J3JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyd19SVy5JU084ODU5LTEnLAogICAgICdyd19ydy5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAncndfUlcuSVNPODg1OS0xJywKLSAgICAnc2QnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NkX0lOQGRldmFuYWdhcmkuVVRGLTgnLAorICAgICdzZCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2RfSU4uVVRGLTgnLAorICAgICdzZEBkZXZhbmFnYXJpJzogICAgICAgICAgICAgICAgICAgICAgICAnc2RfSU4uVVRGLThAZGV2YW5hZ2FyaScsCisgICAgJ3NkX2luJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZF9JTi5VVEYtOCcsCisgICAgJ3NkX2luQGRldmFuYWdhcmknOiAgICAgICAgICAgICAgICAgICAgICdzZF9JTi5VVEYtOEBkZXZhbmFnYXJpJywKICAgICAnc2Vfbm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NlX05PLlVURi04JywKICAgICAnc2VyYm9jcm9hdGlhbic6ICAgICAgICAgICAgICAgICAgICAgICAgJ3NyX1JTLlVURi04QGxhdGluJywKICAgICAnc2gnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyX1JTLlVURi04QGxhdGluJywKQEAgLTE0NDAsMTMgKzE1MTIsMTMgQEAKICAgICAnc3InOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyX1JTLlVURi04JywKICAgICAnc3JAY3lyaWxsaWMnOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyX1JTLlVURi04JywKICAgICAnc3JAbGF0aW4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyX1JTLlVURi04QGxhdGluJywKLSAgICAnc3JAbGF0bic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyX1JTLlVURi04QGxhdGluJywKLSAgICAnc3JfY3MnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyX1JTLlVURi04JywKKyAgICAnc3JAbGF0bic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyX0NTLlVURi04QGxhdGluJywKKyAgICAnc3JfY3MnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyX0NTLlVURi04JywKICAgICAnc3JfY3MuaXNvODg1OTInOiAgICAgICAgICAgICAgICAgICAgICAgJ3NyX0NTLklTTzg4NTktMicsCiAgICAgJ3NyX2NzLmlzbzg4NTkyQGxhdG4nOiAgICAgICAgICAgICAgICAgICdzcl9DUy5JU084ODU5LTInLAogICAgICdzcl9jcy5pc284ODU5NSc6ICAgICAgICAgICAgICAgICAgICAgICAnc3JfQ1MuSVNPODg1OS01JywKLSAgICAnc3JfY3MudXRmOEBsYXRuJzogICAgICAgICAgICAgICAgICAgICAgJ3NyX1JTLlVURi04QGxhdGluJywKLSAgICAnc3JfY3NAbGF0bic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyX1JTLlVURi04QGxhdGluJywKKyAgICAnc3JfY3MudXRmOEBsYXRuJzogICAgICAgICAgICAgICAgICAgICAgJ3NyX0NTLlVURi04QGxhdGluJywKKyAgICAnc3JfY3NAbGF0bic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyX0NTLlVURi04QGxhdGluJywKICAgICAnc3JfbWUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyX01FLlVURi04JywKICAgICAnc3JfcnMnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyX1JTLlVURi04JywKICAgICAnc3JfcnMudXRmOEBsYXRuJzogICAgICAgICAgICAgICAgICAgICAgJ3NyX1JTLlVURi04QGxhdGluJywKQEAgLTE1MjQsNiArMTU5Niw3IEBACiAgICAgJ3VuaXZlcnNhbCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9VUy51dGYnLAogICAgICd1bml2ZXJzYWwudXRmOEB1Y3M0JzogICAgICAgICAgICAgICAgICAnZW5fVVMuVVRGLTgnLAogICAgICd1cic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXJfUEsuQ1AxMjU2JywKKyAgICAndXJfaW4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VyX0lOLlVURi04JywKICAgICAndXJfcGsnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VyX1BLLkNQMTI1NicsCiAgICAgJ3VyX3BrLmNwMTI1Nic6ICAgICAgICAgICAgICAgICAgICAgICAgICd1cl9QSy5DUDEyNTYnLAogICAgICd1cl9way5taWNyb3NvZnRjcDEyNTYnOiAgICAgICAgICAgICAgICAndXJfUEsuQ1AxMjU2JywKQEAgLTE1ODEsOCArMTY1NCw3IEBACiAjIHRvIGluY2x1ZGUgZXZlcnkgbG9jYWxlIHVwIHRvIFdpbmRvd3MgVmlzdGEuCiAjCiAjIE5PVEU6IHRoaXMgbWFwcGluZyBpcyBpbmNvbXBsZXRlLiAgSWYgeW91ciBsYW5ndWFnZSBpcyBtaXNzaW5nLCBwbGVhc2UKLSMgc3VibWl0IGEgYnVnIHJlcG9ydCB0byBQeXRob24gYnVnIG1hbmFnZXIsIHdoaWNoIHlvdSBjYW4gZmluZCB2aWE6Ci0jICAgICBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZGV2LworIyBzdWJtaXQgYSBidWcgcmVwb3J0IHRvIHRoZSBQeXRob24gYnVnIHRyYWNrZXIgYXQgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy8KICMgTWFrZSBzdXJlIHlvdSBpbmNsdWRlIHRoZSBtaXNzaW5nIGxhbmd1YWdlIGlkZW50aWZpZXIgYW5kIHRoZSBzdWdnZXN0ZWQKICMgbG9jYWxlIGNvZGUuCiAjCmRpZmYgLS1naXQgYS9MaWIvbG9nZ2luZy9fX2luaXRfXy5weSBiL0xpYi9sb2dnaW5nL19faW5pdF9fLnB5CmluZGV4IGRhZDY5YWUuLmIyYTc3MTEgMTAwNjQ0Ci0tLSBhL0xpYi9sb2dnaW5nL19faW5pdF9fLnB5CisrKyBiL0xpYi9sb2dnaW5nL19faW5pdF9fLnB5CkBAIC0xLDQgKzEsNCBAQAotIyBDb3B5cmlnaHQgMjAwMS0yMDEwIGJ5IFZpbmF5IFNhamlwLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBDb3B5cmlnaHQgMjAwMS0yMDE0IGJ5IFZpbmF5IFNhamlwLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogIwogIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKICMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLApAQCAtMTYsMTQgKzE2LDE0IEBACiAKICIiIgogTG9nZ2luZyBwYWNrYWdlIGZvciBQeXRob24uIEJhc2VkIG9uIFBFUCAyODIgYW5kIGNvbW1lbnRzIHRoZXJldG8gaW4KLWNvbXAubGFuZy5weXRob24sIGFuZCBpbmZsdWVuY2VkIGJ5IEFwYWNoZSdzIGxvZzRqIHN5c3RlbS4KK2NvbXAubGFuZy5weXRob24uCiAKLUNvcHlyaWdodCAoQykgMjAwMS0yMDEwIFZpbmF5IFNhamlwLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgVmluYXkgU2FqaXAuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAKIFRvIHVzZSwgc2ltcGx5ICdpbXBvcnQgbG9nZ2luZycgYW5kIGxvZyBhd2F5IQogIiIiCiAKLWltcG9ydCBzeXMsIG9zLCB0aW1lLCBjU3RyaW5nSU8sIHRyYWNlYmFjaywgd2FybmluZ3MsIHdlYWtyZWYKK2ltcG9ydCBzeXMsIG9zLCB0aW1lLCBjU3RyaW5nSU8sIHRyYWNlYmFjaywgd2FybmluZ3MsIHdlYWtyZWYsIGNvbGxlY3Rpb25zCiAKIF9fYWxsX18gPSBbJ0JBU0lDX0ZPUk1BVCcsICdCdWZmZXJpbmdGb3JtYXR0ZXInLCAnQ1JJVElDQUwnLCAnREVCVUcnLCAnRVJST1InLAogICAgICAgICAgICAnRkFUQUwnLCAnRmlsZUhhbmRsZXInLCAnRmlsdGVyJywgJ0Zvcm1hdHRlcicsICdIYW5kbGVyJywgJ0lORk8nLApAQCAtNDYsNiArNDYsNyBAQAogCiBfX2F1dGhvcl9fICA9ICJWaW5heSBTYWppcCA8dmluYXlfc2FqaXBAcmVkLWRvdmUuY29tPiIKIF9fc3RhdHVzX18gID0gInByb2R1Y3Rpb24iCisjIE5vdGU6IHRoZSBhdHRyaWJ1dGVzIGJlbG93IGFyZSBubyBsb25nZXIgbWFpbnRhaW5lZC4KIF9fdmVyc2lvbl9fID0gIjAuNS4xLjIiCiBfX2RhdGVfXyAgICA9ICIwNyBGZWJydWFyeSAyMDEwIgogCkBAIC0xODAsNyArMTgxLDcgQEAKICAgICAgICAgX3JlbGVhc2VMb2NrKCkKIAogZGVmIF9jaGVja0xldmVsKGxldmVsKToKLSAgICBpZiBpc2luc3RhbmNlKGxldmVsLCBpbnQpOgorICAgIGlmIGlzaW5zdGFuY2UobGV2ZWwsIChpbnQsIGxvbmcpKToKICAgICAgICAgcnYgPSBsZXZlbAogICAgIGVsaWYgc3RyKGxldmVsKSA9PSBsZXZlbDoKICAgICAgICAgaWYgbGV2ZWwgbm90IGluIF9sZXZlbE5hbWVzOgpAQCAtMjYwLDcgKzI2MSwxMyBAQAogICAgICAgICAjICdWYWx1ZSBpcyAlZCcgaW5zdGVhZCBvZiAnVmFsdWUgaXMgMCcuCiAgICAgICAgICMgRm9yIHRoZSB1c2UgY2FzZSBvZiBwYXNzaW5nIGEgZGljdGlvbmFyeSwgdGhpcyBzaG91bGQgbm90IGJlIGEKICAgICAgICAgIyBwcm9ibGVtLgotICAgICAgICBpZiBhcmdzIGFuZCBsZW4oYXJncykgPT0gMSBhbmQgaXNpbnN0YW5jZShhcmdzWzBdLCBkaWN0KSBhbmQgYXJnc1swXToKKyAgICAgICAgIyBJc3N1ZSAjMjExNzI6IGEgcmVxdWVzdCB3YXMgbWFkZSB0byByZWxheCB0aGUgaXNpbnN0YW5jZSBjaGVjaworICAgICAgICAjIHRvIGhhc2F0dHIoYXJnc1swXSwgJ19fZ2V0aXRlbV9fJykuIEhvd2V2ZXIsIHRoZSBkb2NzIG9uIHN0cmluZworICAgICAgICAjIGZvcm1hdHRpbmcgc3RpbGwgc2VlbSB0byBzdWdnZXN0IGEgbWFwcGluZyBvYmplY3QgaXMgcmVxdWlyZWQuCisgICAgICAgICMgVGh1cywgd2hpbGUgbm90IHJlbW92aW5nIHRoZSBpc2luc3RhbmNlIGNoZWNrLCBpdCBkb2VzIG5vdyBsb29rCisgICAgICAgICMgZm9yIGNvbGxlY3Rpb25zLk1hcHBpbmcgcmF0aGVyIHRoYW4sIGFzIGJlZm9yZSwgZGljdC4KKyAgICAgICAgaWYgKGFyZ3MgYW5kIGxlbihhcmdzKSA9PSAxIGFuZCBpc2luc3RhbmNlKGFyZ3NbMF0sIGNvbGxlY3Rpb25zLk1hcHBpbmcpCisgICAgICAgICAgICBhbmQgYXJnc1swXSk6CiAgICAgICAgICAgICBhcmdzID0gYXJnc1swXQogICAgICAgICBzZWxmLmFyZ3MgPSBhcmdzCiAgICAgICAgIHNlbGYubGV2ZWxuYW1lID0gZ2V0TGV2ZWxOYW1lKGxldmVsKQpAQCAtNjIyLDE1ICs2MjksMTcgQEAKICAgICBSZW1vdmUgYSBoYW5kbGVyIHJlZmVyZW5jZSBmcm9tIHRoZSBpbnRlcm5hbCBjbGVhbnVwIGxpc3QuCiAgICAgIiIiCiAgICAgIyBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgZHVyaW5nIG1vZHVsZSB0ZWFyZG93biwgd2hlbiBnbG9iYWxzIGFyZQotICAgICMgc2V0IHRvIE5vbmUuIElmIF9hY3F1aXJlTG9jayBpcyBOb25lLCBhc3N1bWUgdGhpcyBpcyB0aGUgY2FzZSBhbmQgZG8KLSAgICAjIG5vdGhpbmcuCi0gICAgaWYgX2FjcXVpcmVMb2NrIGlzIG5vdCBOb25lOgotICAgICAgICBfYWNxdWlyZUxvY2soKQorICAgICMgc2V0IHRvIE5vbmUuIEl0IGNhbiBhbHNvIGJlIGNhbGxlZCBmcm9tIGFub3RoZXIgdGhyZWFkLiBTbyB3ZSBuZWVkIHRvCisgICAgIyBwcmUtZW1wdGl2ZWx5IGdyYWIgdGhlIG5lY2Vzc2FyeSBnbG9iYWxzIGFuZCBjaGVjayBpZiB0aGV5J3JlIE5vbmUsCisgICAgIyB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyBhbmQgZmFpbHVyZXMgZHVyaW5nIGludGVycHJldGVyIHNodXRkb3duLgorICAgIGFjcXVpcmUsIHJlbGVhc2UsIGhhbmRsZXJzID0gX2FjcXVpcmVMb2NrLCBfcmVsZWFzZUxvY2ssIF9oYW5kbGVyTGlzdAorICAgIGlmIGFjcXVpcmUgYW5kIHJlbGVhc2UgYW5kIGhhbmRsZXJzOgorICAgICAgICBhY3F1aXJlKCkKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgaWYgd3IgaW4gX2hhbmRsZXJMaXN0OgotICAgICAgICAgICAgICAgIF9oYW5kbGVyTGlzdC5yZW1vdmUod3IpCisgICAgICAgICAgICBpZiB3ciBpbiBoYW5kbGVyczoKKyAgICAgICAgICAgICAgICBoYW5kbGVycy5yZW1vdmUod3IpCiAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBfcmVsZWFzZUxvY2soKQorICAgICAgICAgICAgcmVsZWFzZSgpCiAKIGRlZiBfYWRkSGFuZGxlclJlZihoYW5kbGVyKToKICAgICAiIiIKQEAgLTc5NCw3ICs4MDMsNyBAQAogICAgICAgICBZb3UgY291bGQsIGhvd2V2ZXIsIHJlcGxhY2UgdGhpcyB3aXRoIGEgY3VzdG9tIGhhbmRsZXIgaWYgeW91IHdpc2guCiAgICAgICAgIFRoZSByZWNvcmQgd2hpY2ggd2FzIGJlaW5nIHByb2Nlc3NlZCBpcyBwYXNzZWQgaW4gdG8gdGhpcyBtZXRob2QuCiAgICAgICAgICIiIgotICAgICAgICBpZiByYWlzZUV4Y2VwdGlvbnM6CisgICAgICAgIGlmIHJhaXNlRXhjZXB0aW9ucyBhbmQgc3lzLnN0ZGVycjogICMgc2VlIGlzc3VlIDEzODA3CiAgICAgICAgICAgICBlaSA9IHN5cy5leGNfaW5mbygpCiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4Y2VwdGlvbihlaVswXSwgZWlbMV0sIGVpWzJdLApAQCAtODI4LDggKzgzNywxMiBAQAogICAgICAgICAiIiIKICAgICAgICAgRmx1c2hlcyB0aGUgc3RyZWFtLgogICAgICAgICAiIiIKLSAgICAgICAgaWYgc2VsZi5zdHJlYW0gYW5kIGhhc2F0dHIoc2VsZi5zdHJlYW0sICJmbHVzaCIpOgotICAgICAgICAgICAgc2VsZi5zdHJlYW0uZmx1c2goKQorICAgICAgICBzZWxmLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLnN0cmVhbSBhbmQgaGFzYXR0cihzZWxmLnN0cmVhbSwgImZsdXNoIik6CisgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0uZmx1c2goKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5yZWxlYXNlKCkKIAogICAgIGRlZiBlbWl0KHNlbGYsIHJlY29yZCk6CiAgICAgICAgICIiIgpAQCAtODUyLDcgKzg2NSw3IEBACiAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICBpZiAoaXNpbnN0YW5jZShtc2csIHVuaWNvZGUpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihzdHJlYW0sICdlbmNvZGluZycsIE5vbmUpKToKLSAgICAgICAgICAgICAgICAgICAgICAgIHVmcyA9IGZzLmRlY29kZShzdHJlYW0uZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICB1ZnMgPSB1JyVzXG4nCiAgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlKHVmcyAlIG1zZykKICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CkBAIC04ODgsNiArOTAxLDcgQEAKICAgICAgICAgc2VsZi5iYXNlRmlsZW5hbWUgPSBvcy5wYXRoLmFic3BhdGgoZmlsZW5hbWUpCiAgICAgICAgIHNlbGYubW9kZSA9IG1vZGUKICAgICAgICAgc2VsZi5lbmNvZGluZyA9IGVuY29kaW5nCisgICAgICAgIHNlbGYuZGVsYXkgPSBkZWxheQogICAgICAgICBpZiBkZWxheToKICAgICAgICAgICAgICNXZSBkb24ndCBvcGVuIHRoZSBzdHJlYW0sIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIGNhbGwgdGhlCiAgICAgICAgICAgICAjSGFuZGxlciBjb25zdHJ1Y3RvciB0byBzZXQgbGV2ZWwsIGZvcm1hdHRlciwgbG9jayBldGMuCkBAIC05MDAsMTIgKzkxNCwxOCBAQAogICAgICAgICAiIiIKICAgICAgICAgQ2xvc2VzIHRoZSBzdHJlYW0uCiAgICAgICAgICIiIgotICAgICAgICBpZiBzZWxmLnN0cmVhbToKLSAgICAgICAgICAgIHNlbGYuZmx1c2goKQotICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLnN0cmVhbSwgImNsb3NlIik6Ci0gICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0uY2xvc2UoKQorICAgICAgICBzZWxmLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLnN0cmVhbToKKyAgICAgICAgICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYuc3RyZWFtLCAiY2xvc2UiKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0uY2xvc2UoKQorICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtID0gTm9uZQorICAgICAgICAgICAgIyBJc3N1ZSAjMTk1MjM6IGNhbGwgdW5jb25kaXRpb25hbGx5IHRvCisgICAgICAgICAgICAjIHByZXZlbnQgYSBoYW5kbGVyIGxlYWsgd2hlbiBkZWxheSBpcyBzZXQKICAgICAgICAgICAgIFN0cmVhbUhhbmRsZXIuY2xvc2Uoc2VsZikKLSAgICAgICAgICAgIHNlbGYuc3RyZWFtID0gTm9uZQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5yZWxlYXNlKCkKIAogICAgIGRlZiBfb3BlbihzZWxmKToKICAgICAgICAgIiIiCkBAIC0xMTY1LDExICsxMTg1LDEyIEBACiAgICAgICAgIGlmIHNlbGYuaXNFbmFibGVkRm9yKEVSUk9SKToKICAgICAgICAgICAgIHNlbGYuX2xvZyhFUlJPUiwgbXNnLCBhcmdzLCAqKmt3YXJncykKIAotICAgIGRlZiBleGNlcHRpb24oc2VsZiwgbXNnLCAqYXJncyk6CisgICAgZGVmIGV4Y2VwdGlvbihzZWxmLCBtc2csICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICIiIgogICAgICAgICBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGxvZ2dpbmcgYW4gRVJST1Igd2l0aCBleGNlcHRpb24gaW5mb3JtYXRpb24uCiAgICAgICAgICIiIgotICAgICAgICBzZWxmLmVycm9yKG1zZywgZXhjX2luZm89MSwgKmFyZ3MpCisgICAgICAgIGt3YXJnc1snZXhjX2luZm8nXSA9IDEKKyAgICAgICAgc2VsZi5lcnJvcihtc2csICphcmdzLCAqKmt3YXJncykKIAogICAgIGRlZiBjcml0aWNhbChzZWxmLCBtc2csICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICIiIgpAQCAtMTI0Miw3ICsxMjYzLDcgQEAKICAgICAgICAgYWxsIHRoZSBoYW5kbGVycyBvZiB0aGlzIGxvZ2dlciB0byBoYW5kbGUgdGhlIHJlY29yZC4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIF9zcmNmaWxlOgotICAgICAgICAgICAgI0lyb25QeXRob24gZG9lc24ndCB0cmFjayBQeXRob24gZnJhbWVzLCBzbyBmaW5kQ2FsbGVyIHRocm93cyBhbgorICAgICAgICAgICAgI0lyb25QeXRob24gZG9lc24ndCB0cmFjayBQeXRob24gZnJhbWVzLCBzbyBmaW5kQ2FsbGVyIHJhaXNlcyBhbgogICAgICAgICAgICAgI2V4Y2VwdGlvbiBvbiBzb21lIHZlcnNpb25zIG9mIElyb25QeXRob24uIFdlIHRyYXAgaXQgaGVyZSBzbyB0aGF0CiAgICAgICAgICAgICAjSXJvblB5dGhvbiBjYW4gdXNlIGxvZ2dpbmcuCiAgICAgICAgICAgICB0cnk6CkBAIC0xNTc0LDEyICsxNTk1LDEzIEBACiAgICAgICAgIGJhc2ljQ29uZmlnKCkKICAgICByb290LmVycm9yKG1zZywgKmFyZ3MsICoqa3dhcmdzKQogCi1kZWYgZXhjZXB0aW9uKG1zZywgKmFyZ3MpOgorZGVmIGV4Y2VwdGlvbihtc2csICphcmdzLCAqKmt3YXJncyk6CiAgICAgIiIiCiAgICAgTG9nIGEgbWVzc2FnZSB3aXRoIHNldmVyaXR5ICdFUlJPUicgb24gdGhlIHJvb3QgbG9nZ2VyLAogICAgIHdpdGggZXhjZXB0aW9uIGluZm9ybWF0aW9uLgogICAgICIiIgotICAgIGVycm9yKG1zZywgZXhjX2luZm89MSwgKmFyZ3MpCisgICAga3dhcmdzWydleGNfaW5mbyddID0gMQorICAgIGVycm9yKG1zZywgKmFyZ3MsICoqa3dhcmdzKQogCiBkZWYgd2FybmluZyhtc2csICphcmdzLCAqKmt3YXJncyk6CiAgICAgIiIiCmRpZmYgLS1naXQgYS9MaWIvbG9nZ2luZy9jb25maWcucHkgYi9MaWIvbG9nZ2luZy9jb25maWcucHkKaW5kZXggOGUwMWE1Ni4uOGIzNzk1NiAxMDA2NDQKLS0tIGEvTGliL2xvZ2dpbmcvY29uZmlnLnB5CisrKyBiL0xpYi9sb2dnaW5nL2NvbmZpZy5weQpAQCAtMSw0ICsxLDQgQEAKLSMgQ29weXJpZ2h0IDIwMDEtMjAxMCBieSBWaW5heSBTYWppcC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQ29weXJpZ2h0IDIwMDEtMjAxNCBieSBWaW5heSBTYWppcC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICMKICMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAjIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKQEAgLTE5LDEzICsxOSwyMyBAQAogaXMgYmFzZWQgb24gUEVQIDI4MiBhbmQgY29tbWVudHMgdGhlcmV0byBpbiBjb21wLmxhbmcucHl0aG9uLCBhbmQgaW5mbHVlbmNlZAogYnkgQXBhY2hlJ3MgbG9nNGogc3lzdGVtLgogCi1Db3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBWaW5heSBTYWppcC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK0NvcHlyaWdodCAoQykgMjAwMS0yMDE0IFZpbmF5IFNhamlwLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogCiBUbyB1c2UsIHNpbXBseSAnaW1wb3J0IGxvZ2dpbmcnIGFuZCBsb2cgYXdheSEKICIiIgogCi1pbXBvcnQgc3lzLCBsb2dnaW5nLCBsb2dnaW5nLmhhbmRsZXJzLCBzb2NrZXQsIHN0cnVjdCwgb3MsIHRyYWNlYmFjaywgcmUKLWltcG9ydCB0eXBlcywgY1N0cmluZ0lPCitpbXBvcnQgY1N0cmluZ0lPCitpbXBvcnQgZXJybm8KK2ltcG9ydCBpbworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBsb2dnaW5nLmhhbmRsZXJzCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHNvY2tldAoraW1wb3J0IHN0cnVjdAoraW1wb3J0IHN5cworaW1wb3J0IHRyYWNlYmFjaworaW1wb3J0IHR5cGVzCiAKIHRyeToKICAgICBpbXBvcnQgdGhyZWFkCkBAIC0zOCwxMCArNDgsNyBAQAogCiBERUZBVUxUX0xPR0dJTkdfQ09ORklHX1BPUlQgPSA5MDMwCiAKLWlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgotICAgIFJFU0VUX0VSUk9SID0gMTAwNTQgICAjV1NBRUNPTk5SRVNFVAotZWxzZToKLSAgICBSRVNFVF9FUlJPUiA9IDEwNCAgICAgI0VDT05OUkVTRVQKK1JFU0VUX0VSUk9SID0gZXJybm8uRUNPTk5SRVNFVAogCiAjCiAjICAgVGhlIGZvbGxvd2luZyBjb2RlIGltcGxlbWVudHMgYSBzb2NrZXQgbGlzdGVuZXIgZm9yIG9uLXRoZS1mbHkKQEAgLTI2MCw4ICsyNjcsOCBAQAogICAgICAgICAgICAgbG9nZ2VyLmxldmVsID0gbG9nZ2luZy5OT1RTRVQKICAgICAgICAgICAgIGxvZ2dlci5oYW5kbGVycyA9IFtdCiAgICAgICAgICAgICBsb2dnZXIucHJvcGFnYXRlID0gMQotICAgICAgICBlbGlmIGRpc2FibGVfZXhpc3RpbmdfbG9nZ2VyczoKLSAgICAgICAgICAgIGxvZ2dlci5kaXNhYmxlZCA9IDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxvZ2dlci5kaXNhYmxlZCA9IGRpc2FibGVfZXhpc3RpbmdfbG9nZ2VycwogCiAKIApAQCAtMjc1LDYgKzI4MiwzMCBAQAogICAgIHJldHVybiBUcnVlCiAKIAorY2xhc3MgQ29udmVydGluZ01peGluKG9iamVjdCk6CisgICAgIiIiRm9yIENvbnZlcnRpbmdYWFgncywgdGhpcyBtaXhpbiBjbGFzcyBwcm92aWRlcyBjb21tb24gZnVuY3Rpb25zIiIiCisKKyAgICBkZWYgY29udmVydF93aXRoX2tleShzZWxmLCBrZXksIHZhbHVlLCByZXBsYWNlPVRydWUpOgorICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyYXRvci5jb252ZXJ0KHZhbHVlKQorICAgICAgICAjSWYgdGhlIGNvbnZlcnRlZCB2YWx1ZSBpcyBkaWZmZXJlbnQsIHNhdmUgZm9yIG5leHQgdGltZQorICAgICAgICBpZiB2YWx1ZSBpcyBub3QgcmVzdWx0OgorICAgICAgICAgICAgaWYgcmVwbGFjZToKKyAgICAgICAgICAgICAgICBzZWxmW2tleV0gPSByZXN1bHQKKyAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRpbmdUdXBsZSk6CisgICAgICAgICAgICAgICAgcmVzdWx0LnBhcmVudCA9IHNlbGYKKyAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0ga2V5CisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBjb252ZXJ0KHNlbGYsIHZhbHVlKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmF0b3IuY29udmVydCh2YWx1ZSkKKyAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKKyAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRpbmdUdXBsZSk6CisgICAgICAgICAgICAgICAgcmVzdWx0LnBhcmVudCA9IHNlbGYKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisKICMgVGhlIENvbnZlcnRpbmdYWFggY2xhc3NlcyBhcmUgd3JhcHBlcnMgYXJvdW5kIHN0YW5kYXJkIFB5dGhvbiBjb250YWluZXJzLAogIyBhbmQgdGhleSBzZXJ2ZSB0byBjb252ZXJ0IGFueSBzdWl0YWJsZSB2YWx1ZXMgaW4gdGhlIGNvbnRhaW5lci4gVGhlCiAjIGNvbnZlcnNpb24gY29udmVydHMgYmFzZSBkaWN0cywgbGlzdHMgYW5kIHR1cGxlcyB0byB0aGVpciB3cmFwcGVkCkBAIC0yODQsNzcgKzMxNSwzNyBAQAogIyBFYWNoIHdyYXBwZXIgc2hvdWxkIGhhdmUgYSBjb25maWd1cmF0b3IgYXR0cmlidXRlIGhvbGRpbmcgdGhlIGFjdHVhbAogIyBjb25maWd1cmF0b3IgdG8gdXNlIGZvciBjb252ZXJzaW9uLgogCi1jbGFzcyBDb252ZXJ0aW5nRGljdChkaWN0KToKK2NsYXNzIENvbnZlcnRpbmdEaWN0KGRpY3QsIENvbnZlcnRpbmdNaXhpbik6CiAgICAgIiIiQSBjb252ZXJ0aW5nIGRpY3Rpb25hcnkgd3JhcHBlci4iIiIKIAogICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgICB2YWx1ZSA9IGRpY3QuX19nZXRpdGVtX18oc2VsZiwga2V5KQotICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyYXRvci5jb252ZXJ0KHZhbHVlKQotICAgICAgICAjSWYgdGhlIGNvbnZlcnRlZCB2YWx1ZSBpcyBkaWZmZXJlbnQsIHNhdmUgZm9yIG5leHQgdGltZQotICAgICAgICBpZiB2YWx1ZSBpcyBub3QgcmVzdWx0OgotICAgICAgICAgICAgc2VsZltrZXldID0gcmVzdWx0Ci0gICAgICAgICAgICBpZiB0eXBlKHJlc3VsdCkgaW4gKENvbnZlcnRpbmdEaWN0LCBDb252ZXJ0aW5nTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGluZ1R1cGxlKToKLSAgICAgICAgICAgICAgICByZXN1bHQucGFyZW50ID0gc2VsZgotICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBrZXkKLSAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICByZXR1cm4gc2VsZi5jb252ZXJ0X3dpdGhfa2V5KGtleSwgdmFsdWUpCiAKICAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKICAgICAgICAgdmFsdWUgPSBkaWN0LmdldChzZWxmLCBrZXksIGRlZmF1bHQpCi0gICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCi0gICAgICAgICNJZiB0aGUgY29udmVydGVkIHZhbHVlIGlzIGRpZmZlcmVudCwgc2F2ZSBmb3IgbmV4dCB0aW1lCi0gICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6Ci0gICAgICAgICAgICBzZWxmW2tleV0gPSByZXN1bHQKLSAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgotICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCi0gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IGtleQotICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIHJldHVybiBzZWxmLmNvbnZlcnRfd2l0aF9rZXkoa2V5LCB2YWx1ZSkKIAogICAgIGRlZiBwb3Aoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgogICAgICAgICB2YWx1ZSA9IGRpY3QucG9wKHNlbGYsIGtleSwgZGVmYXVsdCkKLSAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmF0b3IuY29udmVydCh2YWx1ZSkKLSAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKLSAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgotICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCi0gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IGtleQotICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIHJldHVybiBzZWxmLmNvbnZlcnRfd2l0aF9rZXkoa2V5LCB2YWx1ZSwgcmVwbGFjZT1GYWxzZSkKIAotY2xhc3MgQ29udmVydGluZ0xpc3QobGlzdCk6CitjbGFzcyBDb252ZXJ0aW5nTGlzdChsaXN0LCBDb252ZXJ0aW5nTWl4aW4pOgogICAgICIiIkEgY29udmVydGluZyBsaXN0IHdyYXBwZXIuIiIiCiAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgIHZhbHVlID0gbGlzdC5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpCi0gICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCi0gICAgICAgICNJZiB0aGUgY29udmVydGVkIHZhbHVlIGlzIGRpZmZlcmVudCwgc2F2ZSBmb3IgbmV4dCB0aW1lCi0gICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6Ci0gICAgICAgICAgICBzZWxmW2tleV0gPSByZXN1bHQKLSAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgotICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCi0gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IGtleQotICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIHJldHVybiBzZWxmLmNvbnZlcnRfd2l0aF9rZXkoa2V5LCB2YWx1ZSkKIAogICAgIGRlZiBwb3Aoc2VsZiwgaWR4PS0xKToKICAgICAgICAgdmFsdWUgPSBsaXN0LnBvcChzZWxmLCBpZHgpCi0gICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCi0gICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6Ci0gICAgICAgICAgICBpZiB0eXBlKHJlc3VsdCkgaW4gKENvbnZlcnRpbmdEaWN0LCBDb252ZXJ0aW5nTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGluZ1R1cGxlKToKLSAgICAgICAgICAgICAgICByZXN1bHQucGFyZW50ID0gc2VsZgotICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIHJldHVybiBzZWxmLmNvbnZlcnQodmFsdWUpCiAKLWNsYXNzIENvbnZlcnRpbmdUdXBsZSh0dXBsZSk6CitjbGFzcyBDb252ZXJ0aW5nVHVwbGUodHVwbGUsIENvbnZlcnRpbmdNaXhpbik6CiAgICAgIiIiQSBjb252ZXJ0aW5nIHR1cGxlIHdyYXBwZXIuIiIiCiAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgIHZhbHVlID0gdHVwbGUuX19nZXRpdGVtX18oc2VsZiwga2V5KQotICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyYXRvci5jb252ZXJ0KHZhbHVlKQotICAgICAgICBpZiB2YWx1ZSBpcyBub3QgcmVzdWx0OgotICAgICAgICAgICAgaWYgdHlwZShyZXN1bHQpIGluIChDb252ZXJ0aW5nRGljdCwgQ29udmVydGluZ0xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRpbmdUdXBsZSk6Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnBhcmVudCA9IHNlbGYKLSAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0ga2V5Ci0gICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgIyBDYW4ndCByZXBsYWNlIGEgdHVwbGUgZW50cnkuCisgICAgICAgIHJldHVybiBzZWxmLmNvbnZlcnRfd2l0aF9rZXkoa2V5LCB2YWx1ZSwgcmVwbGFjZT1GYWxzZSkKIAogY2xhc3MgQmFzZUNvbmZpZ3VyYXRvcihvYmplY3QpOgogICAgICIiIgpAQCAtMzc5LDYgKzM3MCwxMiBAQAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWcpOgogICAgICAgICBzZWxmLmNvbmZpZyA9IENvbnZlcnRpbmdEaWN0KGNvbmZpZykKICAgICAgICAgc2VsZi5jb25maWcuY29uZmlndXJhdG9yID0gc2VsZgorICAgICAgICAjIElzc3VlIDEyNzE4OiB3aW5wZGIgcmVwbGFjZXMgX19pbXBvcnRfXyB3aXRoIGEgUHl0aG9uIGZ1bmN0aW9uLCB3aGljaAorICAgICAgICAjIGVuZHMgdXAgYmVpbmcgdHJlYXRlZCBhcyBhIGJvdW5kIG1ldGhvZC4gVG8gYXZvaWQgcHJvYmxlbXMsIHdlCisgICAgICAgICMgc2V0IHRoZSBpbXBvcnRlciBvbiB0aGUgaW5zdGFuY2UsIGJ1dCBsZWF2ZSBpdCBkZWZpbmVkIGluIHRoZSBjbGFzcworICAgICAgICAjIHNvIGV4aXN0aW5nIGNvZGUgZG9lc24ndCBicmVhaworICAgICAgICBpZiB0eXBlKF9faW1wb3J0X18pID09IHR5cGVzLkZ1bmN0aW9uVHlwZToKKyAgICAgICAgICAgIHNlbGYuaW1wb3J0ZXIgPSBfX2ltcG9ydF9fCiAKICAgICBkZWYgcmVzb2x2ZShzZWxmLCBzKToKICAgICAgICAgIiIiCkBAIC01MjAsMjEgKzUxNywyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gaGFuZGxlcl9jb25maWcuZ2V0KCdsZXZlbCcsIE5vbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGV2ZWw6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuc2V0TGV2ZWwobG9nZ2luZy5fY2hlY2tMZXZlbChsZXZlbCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciwgZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbmZpZ3VyZSBoYW5kbGVyICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcjogJXMnICUgKG5hbWUsIGUpKQogICAgICAgICAgICAgICAgIGxvZ2dlcnMgPSBjb25maWcuZ2V0KCdsb2dnZXJzJywgRU1QVFlfRElDVCkKICAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBsb2dnZXJzOgogICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyZV9sb2dnZXIobmFtZSwgbG9nZ2Vyc1tuYW1lXSwgVHJ1ZSkKLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29uZmlndXJlIGxvZ2dlciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcjogJXMnICUgKG5hbWUsIGUpKQogICAgICAgICAgICAgICAgIHJvb3QgPSBjb25maWcuZ2V0KCdyb290JywgTm9uZSkKICAgICAgICAgICAgICAgICBpZiByb290OgogICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyZV9yb290KHJvb3QsIFRydWUpCi0gICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yLCBlOgorICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbmZpZ3VyZSByb290ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xvZ2dlcjogJXMnICUgZSkKICAgICAgICAgICAgIGVsc2U6CkBAIC01NDksNyArNTQ2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVyc1tuYW1lXSA9IHNlbGYuY29uZmlndXJlX2Zvcm1hdHRlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlcnNbbmFtZV0pCi0gICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yLCBlOgorICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbmZpZ3VyZSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb3JtYXR0ZXIgJXI6ICVzJyAlIChuYW1lLCBlKSkKICAgICAgICAgICAgICAgICAjIE5leHQsIGRvIGZpbHRlcnMgLSB0aGV5IGRvbid0IHJlZmVyIHRvIGFueXRoaW5nIGVsc2UsIGVpdGhlcgpAQCAtNTU3LDcgKzU1NCw3IEBACiAgICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gZmlsdGVyczoKICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyc1tuYW1lXSA9IHNlbGYuY29uZmlndXJlX2ZpbHRlcihmaWx0ZXJzW25hbWVdKQotICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciwgZToKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBjb25maWd1cmUgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmlsdGVyICVyOiAlcycgJSAobmFtZSwgZSkpCiAKQEAgLTU2NSwxNCArNTYyLDI5IEBACiAgICAgICAgICAgICAgICAgIyBBcyBoYW5kbGVycyBjYW4gcmVmZXIgdG8gb3RoZXIgaGFuZGxlcnMsIHNvcnQgdGhlIGtleXMKICAgICAgICAgICAgICAgICAjIHRvIGFsbG93IGEgZGV0ZXJtaW5pc3RpYyBvcmRlciBvZiBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICAgaGFuZGxlcnMgPSBjb25maWcuZ2V0KCdoYW5kbGVycycsIEVNUFRZX0RJQ1QpCisgICAgICAgICAgICAgICAgZGVmZXJyZWQgPSBbXQogICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIHNvcnRlZChoYW5kbGVycyk6CiAgICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBzZWxmLmNvbmZpZ3VyZV9oYW5kbGVyKGhhbmRsZXJzW25hbWVdKQogICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5uYW1lID0gbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnNbbmFtZV0gPSBoYW5kbGVyCi0gICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yLCBlOgorICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgJ3RhcmdldCBub3QgY29uZmlndXJlZCB5ZXQnIGluIHN0cihlKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbmZpZ3VyZSBoYW5kbGVyICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcjogJXMnICUgKG5hbWUsIGUpKQorCisgICAgICAgICAgICAgICAgIyBOb3cgZG8gYW55IHRoYXQgd2VyZSBkZWZlcnJlZAorICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIGRlZmVycmVkOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyID0gc2VsZi5jb25maWd1cmVfaGFuZGxlcihoYW5kbGVyc1tuYW1lXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIubmFtZSA9IG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzW25hbWVdID0gaGFuZGxlcgorICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbmZpZ3VyZSBoYW5kbGVyICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyOiAlcycgJSAobmFtZSwgZSkpCisKICAgICAgICAgICAgICAgICAjIE5leHQsIGRvIGxvZ2dlcnMgLSB0aGV5IHJlZmVyIHRvIGhhbmRsZXJzIGFuZCBmaWx0ZXJzCiAKICAgICAgICAgICAgICAgICAjd2UgZG9uJ3Qgd2FudCB0byBsb3NlIHRoZSBleGlzdGluZyBsb2dnZXJzLApAQCAtNjEwLDcgKzYyMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5yZW1vdmUobmFtZSkKICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb25maWd1cmVfbG9nZ2VyKG5hbWUsIGxvZ2dlcnNbbmFtZV0pCi0gICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yLCBlOgorICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbmZpZ3VyZSBsb2dnZXIgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXI6ICVzJyAlIChuYW1lLCBlKSkKIApAQCAtNjMzLDcgKzY0NSw3IEBACiAgICAgICAgICAgICAgICAgaWYgcm9vdDoKICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb25maWd1cmVfcm9vdChyb290KQotICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciwgZToKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBjb25maWd1cmUgcm9vdCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsb2dnZXI6ICVzJyAlIGUpCiAgICAgICAgIGZpbmFsbHk6CkBAIC02NDUsNyArNjU3LDcgQEAKICAgICAgICAgICAgIGZhY3RvcnkgPSBjb25maWdbJygpJ10gIyBmb3IgdXNlIGluIGV4Y2VwdGlvbiBoYW5kbGVyCiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmVfY3VzdG9tKGNvbmZpZykKLSAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IsIHRlOgorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvciBhcyB0ZToKICAgICAgICAgICAgICAgICBpZiAiJ2Zvcm1hdCciIG5vdCBpbiBzdHIodGUpOgogICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgICNOYW1lIG9mIHBhcmFtZXRlciBjaGFuZ2VkIGZyb20gZm10IHRvIGZvcm1hdC4KQEAgLTY3NSw3ICs2ODcsNyBAQAogICAgICAgICBmb3IgZiBpbiBmaWx0ZXJzOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIGZpbHRlcmVyLmFkZEZpbHRlcihzZWxmLmNvbmZpZ1snZmlsdGVycyddW2ZdKQotICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IsIGU6CisgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBhZGQgZmlsdGVyICVyOiAlcycgJSAoZiwgZSkpCiAKICAgICBkZWYgY29uZmlndXJlX2hhbmRsZXIoc2VsZiwgY29uZmlnKToKQEAgLTY4NCw3ICs2OTYsNyBAQAogICAgICAgICBpZiBmb3JtYXR0ZXI6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgZm9ybWF0dGVyID0gc2VsZi5jb25maWdbJ2Zvcm1hdHRlcnMnXVtmb3JtYXR0ZXJdCi0gICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciwgZToKKyAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIHNldCBmb3JtYXR0ZXIgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyOiAlcycgJSAoZm9ybWF0dGVyLCBlKSkKICAgICAgICAgbGV2ZWwgPSBjb25maWcucG9wKCdsZXZlbCcsIE5vbmUpCkBAIC02OTUsMTMgKzcwNywxOCBAQAogICAgICAgICAgICAgICAgIGMgPSBzZWxmLnJlc29sdmUoYykKICAgICAgICAgICAgIGZhY3RvcnkgPSBjCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBrbGFzcyA9IHNlbGYucmVzb2x2ZShjb25maWcucG9wKCdjbGFzcycpKQorICAgICAgICAgICAgY25hbWUgPSBjb25maWcucG9wKCdjbGFzcycpCisgICAgICAgICAgICBrbGFzcyA9IHNlbGYucmVzb2x2ZShjbmFtZSkKICAgICAgICAgICAgICNTcGVjaWFsIGNhc2UgZm9yIGhhbmRsZXIgd2hpY2ggcmVmZXJzIHRvIGFub3RoZXIgaGFuZGxlcgogICAgICAgICAgICAgaWYgaXNzdWJjbGFzcyhrbGFzcywgbG9nZ2luZy5oYW5kbGVycy5NZW1vcnlIYW5kbGVyKSBhbmRcCiAgICAgICAgICAgICAgICAgJ3RhcmdldCcgaW4gY29uZmlnOgogICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnWyd0YXJnZXQnXSA9IHNlbGYuY29uZmlnWydoYW5kbGVycyddW2NvbmZpZ1sndGFyZ2V0J11dCi0gICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgICAgIHRoID0gc2VsZi5jb25maWdbJ2hhbmRsZXJzJ11bY29uZmlnWyd0YXJnZXQnXV0KKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodGgsIGxvZ2dpbmcuSGFuZGxlcik6CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdbJ2NsYXNzJ10gPSBjbmFtZSAjIHJlc3RvcmUgZm9yIGRlZmVycmVkIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFN0YW5kYXJkRXJyb3IoJ3RhcmdldCBub3QgY29uZmlndXJlZCB5ZXQnKQorICAgICAgICAgICAgICAgICAgICBjb25maWdbJ3RhcmdldCddID0gdGgKKyAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gc2V0IHRhcmdldCBoYW5kbGVyICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXI6ICVzJyAlIChjb25maWdbJ3RhcmdldCddLCBlKSkKICAgICAgICAgICAgIGVsaWYgaXNzdWJjbGFzcyhrbGFzcywgbG9nZ2luZy5oYW5kbGVycy5TTVRQSGFuZGxlcikgYW5kXApAQCAtNzE0LDcgKzczMSw3IEBACiAgICAgICAgIGt3YXJncyA9IGRpY3QoWyhrLCBjb25maWdba10pIGZvciBrIGluIGNvbmZpZyBpZiB2YWxpZF9pZGVudChrKV0pCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJlc3VsdCA9IGZhY3RvcnkoKiprd2FyZ3MpCi0gICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IsIHRlOgorICAgICAgICBleGNlcHQgVHlwZUVycm9yIGFzIHRlOgogICAgICAgICAgICAgaWYgIidzdHJlYW0nIiBub3QgaW4gc3RyKHRlKToKICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgI1RoZSBhcmd1bWVudCBuYW1lIGNoYW5nZWQgZnJvbSBzdHJtIHRvIHN0cmVhbQpAQCAtNzM2LDcgKzc1Myw3IEBACiAgICAgICAgIGZvciBoIGluIGhhbmRsZXJzOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIGxvZ2dlci5hZGRIYW5kbGVyKHNlbGYuY29uZmlnWydoYW5kbGVycyddW2hdKQotICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IsIGU6CisgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBhZGQgaGFuZGxlciAlcjogJXMnICUgKGgsIGUpKQogCiAgICAgZGVmIGNvbW1vbl9sb2dnZXJfY29uZmlnKHNlbGYsIGxvZ2dlciwgY29uZmlnLCBpbmNyZW1lbnRhbD1GYWxzZSk6CkBAIC04MzEsMTMgKzg0OCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCiAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuc2VydmVyLnJlYWR5OgogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIucmVhZHkuc2V0KCkKLSAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGU6Ci0gICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZS5hcmdzLCB0dXBsZSk6CisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBSRVNFVF9FUlJPUjoKICAgICAgICAgICAgICAgICAgICAgcmFpc2UKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBlcnJjb2RlID0gZS5hcmdzWzBdCi0gICAgICAgICAgICAgICAgICAgIGlmIGVycmNvZGUgIT0gUkVTRVRfRVJST1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICByYWlzZQogCiAgICAgY2xhc3MgQ29uZmlnU29ja2V0UmVjZWl2ZXIoVGhyZWFkaW5nVENQU2VydmVyKToKICAgICAgICAgIiIiCmRpZmYgLS1naXQgYS9MaWIvbG9nZ2luZy9oYW5kbGVycy5weSBiL0xpYi9sb2dnaW5nL2hhbmRsZXJzLnB5CmluZGV4IGY4YzcxNjQuLmI3YmY5MzEgMTAwNjQ0Ci0tLSBhL0xpYi9sb2dnaW5nL2hhbmRsZXJzLnB5CisrKyBiL0xpYi9sb2dnaW5nL2hhbmRsZXJzLnB5CkBAIC0xLDQgKzEsNCBAQAotIyBDb3B5cmlnaHQgMjAwMS0yMDEwIGJ5IFZpbmF5IFNhamlwLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBDb3B5cmlnaHQgMjAwMS0yMDEzIGJ5IFZpbmF5IFNhamlwLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogIwogIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKICMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLApAQCAtMTYsMTUgKzE2LDE0IEBACiAKICIiIgogQWRkaXRpb25hbCBoYW5kbGVycyBmb3IgdGhlIGxvZ2dpbmcgcGFja2FnZSBmb3IgUHl0aG9uLiBUaGUgY29yZSBwYWNrYWdlIGlzCi1iYXNlZCBvbiBQRVAgMjgyIGFuZCBjb21tZW50cyB0aGVyZXRvIGluIGNvbXAubGFuZy5weXRob24sIGFuZCBpbmZsdWVuY2VkIGJ5Ci1BcGFjaGUncyBsb2c0aiBzeXN0ZW0uCitiYXNlZCBvbiBQRVAgMjgyIGFuZCBjb21tZW50cyB0aGVyZXRvIGluIGNvbXAubGFuZy5weXRob24uCiAKLUNvcHlyaWdodCAoQykgMjAwMS0yMDEwIFZpbmF5IFNhamlwLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgVmluYXkgU2FqaXAuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAKIFRvIHVzZSwgc2ltcGx5ICdpbXBvcnQgbG9nZ2luZy5oYW5kbGVycycgYW5kIGxvZyBhd2F5IQogIiIiCiAKLWltcG9ydCBsb2dnaW5nLCBzb2NrZXQsIG9zLCBjUGlja2xlLCBzdHJ1Y3QsIHRpbWUsIHJlCitpbXBvcnQgZXJybm8sIGxvZ2dpbmcsIHNvY2tldCwgb3MsIGNQaWNrbGUsIHN0cnVjdCwgdGltZSwgcmUKIGZyb20gc3RhdCBpbXBvcnQgU1RfREVWLCBTVF9JTk8sIFNUX01USU1FCiAKIHRyeToKQEAgLTEzOCwxMCArMTM3LDExIEBACiAgICAgICAgICAgICBkZm4gPSBzZWxmLmJhc2VGaWxlbmFtZSArICIuMSIKICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRmbik6CiAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKGRmbikKLSAgICAgICAgICAgIG9zLnJlbmFtZShzZWxmLmJhc2VGaWxlbmFtZSwgZGZuKQotICAgICAgICAgICAgI3ByaW50ICIlcyAtPiAlcyIgJSAoc2VsZi5iYXNlRmlsZW5hbWUsIGRmbikKLSAgICAgICAgc2VsZi5tb2RlID0gJ3cnCi0gICAgICAgIHNlbGYuc3RyZWFtID0gc2VsZi5fb3BlbigpCisgICAgICAgICAgICAjIElzc3VlIDE4OTQwOiBBIGZpbGUgbWF5IG5vdCBoYXZlIGJlZW4gY3JlYXRlZCBpZiBkZWxheSBpcyBUcnVlLgorICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi5iYXNlRmlsZW5hbWUpOgorICAgICAgICAgICAgICAgIG9zLnJlbmFtZShzZWxmLmJhc2VGaWxlbmFtZSwgZGZuKQorICAgICAgICBpZiBub3Qgc2VsZi5kZWxheToKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtID0gc2VsZi5fb3BlbigpCiAKICAgICBkZWYgc2hvdWxkUm9sbG92ZXIoc2VsZiwgcmVjb3JkKToKICAgICAgICAgIiIiCkBAIC0yNzMsOSArMjczLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBkc3RBdFJvbGxvdmVyID0gdGltZS5sb2NhbHRpbWUobmV3Um9sbG92ZXJBdClbLTFdCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBkc3ROb3cgIT0gZHN0QXRSb2xsb3ZlcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgZHN0Tm93OiAgIyBEU1Qga2lja3MgaW4gYmVmb3JlIG5leHQgcm9sbG92ZXIsIHNvIHdlIG5lZWQgdG8gZGVkdWN0IGFuIGhvdXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Um9sbG92ZXJBdCA9IG5ld1JvbGxvdmVyQXQgLSAzNjAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVuZCA9IC0zNjAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZTogICAgICAgICAgICMgRFNUIGJvd3Mgb3V0IGJlZm9yZSBuZXh0IHJvbGxvdmVyLCBzbyB3ZSBuZWVkIHRvIGFkZCBhbiBob3VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1JvbGxvdmVyQXQgPSBuZXdSb2xsb3ZlckF0ICsgMzYwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlbmQgPSAzNjAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Um9sbG92ZXJBdCArPSBhZGRlbmQKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3Um9sbG92ZXJBdAogICAgICAgICByZXR1cm4gcmVzdWx0CiAKQEAgLTMyNywzOSArMzI4LDQzIEBACiAgICAgICAgICAgICBzZWxmLnN0cmVhbS5jbG9zZSgpCiAgICAgICAgICAgICBzZWxmLnN0cmVhbSA9IE5vbmUKICAgICAgICAgIyBnZXQgdGhlIHRpbWUgdGhhdCB0aGlzIHNlcXVlbmNlIHN0YXJ0ZWQgYXQgYW5kIG1ha2UgaXQgYSBUaW1lVHVwbGUKKyAgICAgICAgY3VycmVudFRpbWUgPSBpbnQodGltZS50aW1lKCkpCisgICAgICAgIGRzdE5vdyA9IHRpbWUubG9jYWx0aW1lKGN1cnJlbnRUaW1lKVstMV0KICAgICAgICAgdCA9IHNlbGYucm9sbG92ZXJBdCAtIHNlbGYuaW50ZXJ2YWwKICAgICAgICAgaWYgc2VsZi51dGM6CiAgICAgICAgICAgICB0aW1lVHVwbGUgPSB0aW1lLmdtdGltZSh0KQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgdGltZVR1cGxlID0gdGltZS5sb2NhbHRpbWUodCkKKyAgICAgICAgICAgIGRzdFRoZW4gPSB0aW1lVHVwbGVbLTFdCisgICAgICAgICAgICBpZiBkc3ROb3cgIT0gZHN0VGhlbjoKKyAgICAgICAgICAgICAgICBpZiBkc3ROb3c6CisgICAgICAgICAgICAgICAgICAgIGFkZGVuZCA9IDM2MDAKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBhZGRlbmQgPSAtMzYwMAorICAgICAgICAgICAgICAgIHRpbWVUdXBsZSA9IHRpbWUubG9jYWx0aW1lKHQgKyBhZGRlbmQpCiAgICAgICAgIGRmbiA9IHNlbGYuYmFzZUZpbGVuYW1lICsgIi4iICsgdGltZS5zdHJmdGltZShzZWxmLnN1ZmZpeCwgdGltZVR1cGxlKQogICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkZm4pOgogICAgICAgICAgICAgb3MucmVtb3ZlKGRmbikKLSAgICAgICAgb3MucmVuYW1lKHNlbGYuYmFzZUZpbGVuYW1lLCBkZm4pCisgICAgICAgICMgSXNzdWUgMTg5NDA6IEEgZmlsZSBtYXkgbm90IGhhdmUgYmVlbiBjcmVhdGVkIGlmIGRlbGF5IGlzIFRydWUuCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYuYmFzZUZpbGVuYW1lKToKKyAgICAgICAgICAgIG9zLnJlbmFtZShzZWxmLmJhc2VGaWxlbmFtZSwgZGZuKQogICAgICAgICBpZiBzZWxmLmJhY2t1cENvdW50ID4gMDoKLSAgICAgICAgICAgICMgZmluZCB0aGUgb2xkZXN0IGxvZyBmaWxlIGFuZCBkZWxldGUgaXQKLSAgICAgICAgICAgICNzID0gZ2xvYi5nbG9iKHNlbGYuYmFzZUZpbGVuYW1lICsgIi4yMCoiKQotICAgICAgICAgICAgI2lmIGxlbihzKSA+IHNlbGYuYmFja3VwQ291bnQ6Ci0gICAgICAgICAgICAjICAgIHMuc29ydCgpCi0gICAgICAgICAgICAjICAgIG9zLnJlbW92ZShzWzBdKQogICAgICAgICAgICAgZm9yIHMgaW4gc2VsZi5nZXRGaWxlc1RvRGVsZXRlKCk6CiAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHMpCi0gICAgICAgICNwcmludCAiJXMgLT4gJXMiICUgKHNlbGYuYmFzZUZpbGVuYW1lLCBkZm4pCi0gICAgICAgIHNlbGYubW9kZSA9ICd3JwotICAgICAgICBzZWxmLnN0cmVhbSA9IHNlbGYuX29wZW4oKQotICAgICAgICBjdXJyZW50VGltZSA9IGludCh0aW1lLnRpbWUoKSkKKyAgICAgICAgaWYgbm90IHNlbGYuZGVsYXk6CisgICAgICAgICAgICBzZWxmLnN0cmVhbSA9IHNlbGYuX29wZW4oKQogICAgICAgICBuZXdSb2xsb3ZlckF0ID0gc2VsZi5jb21wdXRlUm9sbG92ZXIoY3VycmVudFRpbWUpCiAgICAgICAgIHdoaWxlIG5ld1JvbGxvdmVyQXQgPD0gY3VycmVudFRpbWU6CiAgICAgICAgICAgICBuZXdSb2xsb3ZlckF0ID0gbmV3Um9sbG92ZXJBdCArIHNlbGYuaW50ZXJ2YWwKICAgICAgICAgI0lmIERTVCBjaGFuZ2VzIGFuZCBtaWRuaWdodCBvciB3ZWVrbHkgcm9sbG92ZXIsIGFkanVzdCBmb3IgdGhpcy4KICAgICAgICAgaWYgKHNlbGYud2hlbiA9PSAnTUlETklHSFQnIG9yIHNlbGYud2hlbi5zdGFydHN3aXRoKCdXJykpIGFuZCBub3Qgc2VsZi51dGM6Ci0gICAgICAgICAgICBkc3ROb3cgPSB0aW1lLmxvY2FsdGltZShjdXJyZW50VGltZSlbLTFdCiAgICAgICAgICAgICBkc3RBdFJvbGxvdmVyID0gdGltZS5sb2NhbHRpbWUobmV3Um9sbG92ZXJBdClbLTFdCiAgICAgICAgICAgICBpZiBkc3ROb3cgIT0gZHN0QXRSb2xsb3ZlcjoKICAgICAgICAgICAgICAgICBpZiBub3QgZHN0Tm93OiAgIyBEU1Qga2lja3MgaW4gYmVmb3JlIG5leHQgcm9sbG92ZXIsIHNvIHdlIG5lZWQgdG8gZGVkdWN0IGFuIGhvdXIKLSAgICAgICAgICAgICAgICAgICAgbmV3Um9sbG92ZXJBdCA9IG5ld1JvbGxvdmVyQXQgLSAzNjAwCisgICAgICAgICAgICAgICAgICAgIGFkZGVuZCA9IC0zNjAwCiAgICAgICAgICAgICAgICAgZWxzZTogICAgICAgICAgICMgRFNUIGJvd3Mgb3V0IGJlZm9yZSBuZXh0IHJvbGxvdmVyLCBzbyB3ZSBuZWVkIHRvIGFkZCBhbiBob3VyCi0gICAgICAgICAgICAgICAgICAgIG5ld1JvbGxvdmVyQXQgPSBuZXdSb2xsb3ZlckF0ICsgMzYwMAorICAgICAgICAgICAgICAgICAgICBhZGRlbmQgPSAzNjAwCisgICAgICAgICAgICAgICAgbmV3Um9sbG92ZXJBdCArPSBhZGRlbmQKICAgICAgICAgc2VsZi5yb2xsb3ZlckF0ID0gbmV3Um9sbG92ZXJBdAogCiBjbGFzcyBXYXRjaGVkRmlsZUhhbmRsZXIobG9nZ2luZy5GaWxlSGFuZGxlcik6CkBAIC0zODQsMTEgKzM4OSwxMyBAQAogICAgICIiIgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgbW9kZT0nYScsIGVuY29kaW5nPU5vbmUsIGRlbGF5PTApOgogICAgICAgICBsb2dnaW5nLkZpbGVIYW5kbGVyLl9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBtb2RlLCBlbmNvZGluZywgZGVsYXkpCi0gICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLmJhc2VGaWxlbmFtZSk6Ci0gICAgICAgICAgICBzZWxmLmRldiwgc2VsZi5pbm8gPSAtMSwgLTEKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHN0YXQgPSBvcy5zdGF0KHNlbGYuYmFzZUZpbGVuYW1lKQotICAgICAgICAgICAgc2VsZi5kZXYsIHNlbGYuaW5vID0gc3RhdFtTVF9ERVZdLCBzdGF0W1NUX0lOT10KKyAgICAgICAgc2VsZi5kZXYsIHNlbGYuaW5vID0gLTEsIC0xCisgICAgICAgIHNlbGYuX3N0YXRzdHJlYW0oKQorCisgICAgZGVmIF9zdGF0c3RyZWFtKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnN0cmVhbToKKyAgICAgICAgICAgIHNyZXMgPSBvcy5mc3RhdChzZWxmLnN0cmVhbS5maWxlbm8oKSkKKyAgICAgICAgICAgIHNlbGYuZGV2LCBzZWxmLmlubyA9IHNyZXNbU1RfREVWXSwgc3Jlc1tTVF9JTk9dCiAKICAgICBkZWYgZW1pdChzZWxmLCByZWNvcmQpOgogICAgICAgICAiIiIKQEAgLTM5OCwxOSArNDA1LDI4IEBACiAgICAgICAgIGhhcywgY2xvc2UgdGhlIG9sZCBzdHJlYW0gYW5kIHJlb3BlbiB0aGUgZmlsZSB0byBnZXQgdGhlCiAgICAgICAgIGN1cnJlbnQgc3RyZWFtLgogICAgICAgICAiIiIKLSAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYuYmFzZUZpbGVuYW1lKToKLSAgICAgICAgICAgIHN0YXQgPSBOb25lCi0gICAgICAgICAgICBjaGFuZ2VkID0gMQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc3RhdCA9IG9zLnN0YXQoc2VsZi5iYXNlRmlsZW5hbWUpCi0gICAgICAgICAgICBjaGFuZ2VkID0gKHN0YXRbU1RfREVWXSAhPSBzZWxmLmRldikgb3IgKHN0YXRbU1RfSU5PXSAhPSBzZWxmLmlubykKLSAgICAgICAgaWYgY2hhbmdlZCBhbmQgc2VsZi5zdHJlYW0gaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBzZWxmLnN0cmVhbS5mbHVzaCgpCi0gICAgICAgICAgICBzZWxmLnN0cmVhbS5jbG9zZSgpCi0gICAgICAgICAgICBzZWxmLnN0cmVhbSA9IHNlbGYuX29wZW4oKQotICAgICAgICAgICAgaWYgc3RhdCBpcyBOb25lOgotICAgICAgICAgICAgICAgIHN0YXQgPSBvcy5zdGF0KHNlbGYuYmFzZUZpbGVuYW1lKQotICAgICAgICAgICAgc2VsZi5kZXYsIHNlbGYuaW5vID0gc3RhdFtTVF9ERVZdLCBzdGF0W1NUX0lOT10KKyAgICAgICAgIyBSZWR1Y2UgdGhlIGNoYW5jZSBvZiByYWNlIGNvbmRpdGlvbnMgYnkgc3RhdCdpbmcgYnkgcGF0aCBvbmx5CisgICAgICAgICMgb25jZSBhbmQgdGhlbiBmc3RhdCdpbmcgb3VyIG5ldyBmZCBpZiB3ZSBvcGVuZWQgYSBuZXcgbG9nIHN0cmVhbS4KKyAgICAgICAgIyBTZWUgaXNzdWUgIzE0NjMyOiBUaGFua3MgdG8gSm9obiBNdWxsaWdhbiBmb3IgdGhlIHByb2JsZW0gcmVwb3J0CisgICAgICAgICMgYW5kIHBhdGNoLgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIHN0YXQgdGhlIGZpbGUgYnkgcGF0aCwgY2hlY2tpbmcgZm9yIGV4aXN0ZW5jZQorICAgICAgICAgICAgc3JlcyA9IG9zLnN0YXQoc2VsZi5iYXNlRmlsZW5hbWUpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGVycjoKKyAgICAgICAgICAgIGlmIGVyci5lcnJubyA9PSBlcnJuby5FTk9FTlQ6CisgICAgICAgICAgICAgICAgc3JlcyA9IE5vbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgIyBjb21wYXJlIGZpbGUgc3lzdGVtIHN0YXQgd2l0aCB0aGF0IG9mIG91ciBzdHJlYW0gZmlsZSBoYW5kbGUKKyAgICAgICAgaWYgbm90IHNyZXMgb3Igc3Jlc1tTVF9ERVZdICE9IHNlbGYuZGV2IG9yIHNyZXNbU1RfSU5PXSAhPSBzZWxmLmlubzoKKyAgICAgICAgICAgIGlmIHNlbGYuc3RyZWFtIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICMgd2UgaGF2ZSBhbiBvcGVuIGZpbGUgaGFuZGxlLCBjbGVhbiBpdCB1cAorICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLmZsdXNoKCkKKyAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS5jbG9zZSgpCisgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0gPSBOb25lICAjIFNlZSBJc3N1ZSAjMjE3NDI6IF9vcGVuICgpIG1pZ2h0IGZhaWwuCisgICAgICAgICAgICAgICAgIyBvcGVuIGEgbmV3IGZpbGUgaGFuZGxlIGFuZCBnZXQgbmV3IHN0YXQgaW5mbyBmcm9tIHRoYXQgZmQKKyAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbSA9IHNlbGYuX29wZW4oKQorICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRzdHJlYW0oKQogICAgICAgICBsb2dnaW5nLkZpbGVIYW5kbGVyLmVtaXQoc2VsZiwgcmVjb3JkKQogCiBjbGFzcyBTb2NrZXRIYW5kbGVyKGxvZ2dpbmcuSGFuZGxlcik6CkBAIC01MjAsOSArNTM2LDE2IEBACiAgICAgICAgICIiIgogICAgICAgICBlaSA9IHJlY29yZC5leGNfaW5mbwogICAgICAgICBpZiBlaToKLSAgICAgICAgICAgIGR1bW15ID0gc2VsZi5mb3JtYXQocmVjb3JkKSAjIGp1c3QgdG8gZ2V0IHRyYWNlYmFjayB0ZXh0IGludG8gcmVjb3JkLmV4Y190ZXh0CisgICAgICAgICAgICAjIGp1c3QgdG8gZ2V0IHRyYWNlYmFjayB0ZXh0IGludG8gcmVjb3JkLmV4Y190ZXh0IC4uLgorICAgICAgICAgICAgZHVtbXkgPSBzZWxmLmZvcm1hdChyZWNvcmQpCiAgICAgICAgICAgICByZWNvcmQuZXhjX2luZm8gPSBOb25lICAjIHRvIGF2b2lkIFVucGlja2xlYWJsZSBlcnJvcgotICAgICAgICBzID0gY1BpY2tsZS5kdW1wcyhyZWNvcmQuX19kaWN0X18sIDEpCisgICAgICAgICMgU2VlIGlzc3VlICMxNDQzNjogSWYgbXNnIG9yIGFyZ3MgYXJlIG9iamVjdHMsIHRoZXkgbWF5IG5vdCBiZQorICAgICAgICAjIGF2YWlsYWJsZSBvbiB0aGUgcmVjZWl2aW5nIGVuZC4gU28gd2UgY29udmVydCB0aGUgbXNnICUgYXJncworICAgICAgICAjIHRvIGEgc3RyaW5nLCBzYXZlIGl0IGFzIG1zZyBhbmQgemFwIHRoZSBhcmdzLgorICAgICAgICBkID0gZGljdChyZWNvcmQuX19kaWN0X18pCisgICAgICAgIGRbJ21zZyddID0gcmVjb3JkLmdldE1lc3NhZ2UoKQorICAgICAgICBkWydhcmdzJ10gPSBOb25lCisgICAgICAgIHMgPSBjUGlja2xlLmR1bXBzKGQsIDEpCiAgICAgICAgIGlmIGVpOgogICAgICAgICAgICAgcmVjb3JkLmV4Y19pbmZvID0gZWkgICMgZm9yIG5leHQgaGFuZGxlcgogICAgICAgICBzbGVuID0gc3RydWN0LnBhY2soIj5MIiwgbGVuKHMpKQpAQCAtNTYzLDkgKzU4NiwxMyBAQAogICAgICAgICAiIiIKICAgICAgICAgQ2xvc2VzIHRoZSBzb2NrZXQuCiAgICAgICAgICIiIgotICAgICAgICBpZiBzZWxmLnNvY2s6Ci0gICAgICAgICAgICBzZWxmLnNvY2suY2xvc2UoKQotICAgICAgICAgICAgc2VsZi5zb2NrID0gTm9uZQorICAgICAgICBzZWxmLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLnNvY2s6CisgICAgICAgICAgICAgICAgc2VsZi5zb2NrLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBzZWxmLnNvY2sgPSBOb25lCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnJlbGVhc2UoKQogICAgICAgICBsb2dnaW5nLkhhbmRsZXIuY2xvc2Uoc2VsZikKIAogY2xhc3MgRGF0YWdyYW1IYW5kbGVyKFNvY2tldEhhbmRsZXIpOgpAQCAtNzEwLDEzICs3MzcsMTcgQEAKICAgICB9CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgYWRkcmVzcz0oJ2xvY2FsaG9zdCcsIFNZU0xPR19VRFBfUE9SVCksCi0gICAgICAgICAgICAgICAgIGZhY2lsaXR5PUxPR19VU0VSLCBzb2NrdHlwZT1zb2NrZXQuU09DS19ER1JBTSk6CisgICAgICAgICAgICAgICAgIGZhY2lsaXR5PUxPR19VU0VSLCBzb2NrdHlwZT1Ob25lKToKICAgICAgICAgIiIiCiAgICAgICAgIEluaXRpYWxpemUgYSBoYW5kbGVyLgogCiAgICAgICAgIElmIGFkZHJlc3MgaXMgc3BlY2lmaWVkIGFzIGEgc3RyaW5nLCBhIFVOSVggc29ja2V0IGlzIHVzZWQuIFRvIGxvZyB0byBhCiAgICAgICAgIGxvY2FsIHN5c2xvZ2QsICJTeXNMb2dIYW5kbGVyKGFkZHJlc3M9Ii9kZXYvbG9nIikiIGNhbiBiZSB1c2VkLgotICAgICAgICBJZiBmYWNpbGl0eSBpcyBub3Qgc3BlY2lmaWVkLCBMT0dfVVNFUiBpcyB1c2VkLgorICAgICAgICBJZiBmYWNpbGl0eSBpcyBub3Qgc3BlY2lmaWVkLCBMT0dfVVNFUiBpcyB1c2VkLiBJZiBzb2NrdHlwZSBpcworICAgICAgICBzcGVjaWZpZWQgYXMgc29ja2V0LlNPQ0tfREdSQU0gb3Igc29ja2V0LlNPQ0tfU1RSRUFNLCB0aGF0IHNwZWNpZmljCisgICAgICAgIHNvY2tldCB0eXBlIHdpbGwgYmUgdXNlZC4gRm9yIFVuaXggc29ja2V0cywgeW91IGNhbiBhbHNvIHNwZWNpZnkgYQorICAgICAgICBzb2NrdHlwZSBvZiBOb25lLCBpbiB3aGljaCBjYXNlIHNvY2tldC5TT0NLX0RHUkFNIHdpbGwgYmUgdXNlZCwgZmFsbGluZworICAgICAgICBiYWNrIHRvIHNvY2tldC5TT0NLX1NUUkVBTS4KICAgICAgICAgIiIiCiAgICAgICAgIGxvZ2dpbmcuSGFuZGxlci5fX2luaXRfXyhzZWxmKQogCkBAIC03MjksMjAgKzc2MCwzNyBAQAogICAgICAgICAgICAgc2VsZi5fY29ubmVjdF91bml4c29ja2V0KGFkZHJlc3MpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLnVuaXhzb2NrZXQgPSAwCisgICAgICAgICAgICBpZiBzb2NrdHlwZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNvY2t0eXBlID0gc29ja2V0LlNPQ0tfREdSQU0KICAgICAgICAgICAgIHNlbGYuc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja3R5cGUpCiAgICAgICAgICAgICBpZiBzb2NrdHlwZSA9PSBzb2NrZXQuU09DS19TVFJFQU06CiAgICAgICAgICAgICAgICAgc2VsZi5zb2NrZXQuY29ubmVjdChhZGRyZXNzKQorICAgICAgICAgICAgc2VsZi5zb2NrdHlwZSA9IHNvY2t0eXBlCiAgICAgICAgIHNlbGYuZm9ybWF0dGVyID0gTm9uZQogCiAgICAgZGVmIF9jb25uZWN0X3VuaXhzb2NrZXQoc2VsZiwgYWRkcmVzcyk6Ci0gICAgICAgIHNlbGYuc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfVU5JWCwgc29ja2V0LlNPQ0tfREdSQU0pCi0gICAgICAgICMgc3lzbG9nIG1heSByZXF1aXJlIGVpdGhlciBER1JBTSBvciBTVFJFQU0gc29ja2V0cworICAgICAgICB1c2Vfc29ja3R5cGUgPSBzZWxmLnNvY2t0eXBlCisgICAgICAgIGlmIHVzZV9zb2NrdHlwZSBpcyBOb25lOgorICAgICAgICAgICAgdXNlX3NvY2t0eXBlID0gc29ja2V0LlNPQ0tfREdSQU0KKyAgICAgICAgc2VsZi5zb2NrZXQgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9VTklYLCB1c2Vfc29ja3R5cGUpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHNlbGYuc29ja2V0LmNvbm5lY3QoYWRkcmVzcykKKyAgICAgICAgICAgICMgaXQgd29ya2VkLCBzbyBzZXQgc2VsZi5zb2NrdHlwZSB0byB0aGUgdXNlZCB0eXBlCisgICAgICAgICAgICBzZWxmLnNvY2t0eXBlID0gdXNlX3NvY2t0eXBlCiAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CiAgICAgICAgICAgICBzZWxmLnNvY2tldC5jbG9zZSgpCi0gICAgICAgICAgICBzZWxmLnNvY2tldCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1VOSVgsIHNvY2tldC5TT0NLX1NUUkVBTSkKLSAgICAgICAgICAgIHNlbGYuc29ja2V0LmNvbm5lY3QoYWRkcmVzcykKKyAgICAgICAgICAgIGlmIHNlbGYuc29ja3R5cGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgIyB1c2VyIGRpZG4ndCBzcGVjaWZ5IGZhbGxpbmcgYmFjaywgc28gZmFpbAorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICB1c2Vfc29ja3R5cGUgPSBzb2NrZXQuU09DS19TVFJFQU0KKyAgICAgICAgICAgIHNlbGYuc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfVU5JWCwgdXNlX3NvY2t0eXBlKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuc29ja2V0LmNvbm5lY3QoYWRkcmVzcykKKyAgICAgICAgICAgICAgICAjIGl0IHdvcmtlZCwgc28gc2V0IHNlbGYuc29ja3R5cGUgdG8gdGhlIHVzZWQgdHlwZQorICAgICAgICAgICAgICAgIHNlbGYuc29ja3R5cGUgPSB1c2Vfc29ja3R5cGUKKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5zb2NrZXQuY2xvc2UoKQorICAgICAgICAgICAgICAgIHJhaXNlCiAKICAgICAjIGN1cmlvdXM6IHdoZW4gdGFsa2luZyB0byB0aGUgdW5peC1kb21haW4gJy9kZXYvbG9nJyBzb2NrZXQsIGEKICAgICAjICAgemVyby10ZXJtaW5hdG9yIHNlZW1zIHRvIGJlIHJlcXVpcmVkLiAgdGhpcyBzdHJpbmcgaXMgcGxhY2VkCkBAIC03NjcsOCArODE1LDEyIEBACiAgICAgICAgICIiIgogICAgICAgICBDbG9zZXMgdGhlIHNvY2tldC4KICAgICAgICAgIiIiCi0gICAgICAgIGlmIHNlbGYudW5peHNvY2tldDoKLSAgICAgICAgICAgIHNlbGYuc29ja2V0LmNsb3NlKCkKKyAgICAgICAgc2VsZi5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi51bml4c29ja2V0OgorICAgICAgICAgICAgICAgIHNlbGYuc29ja2V0LmNsb3NlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYucmVsZWFzZSgpCiAgICAgICAgIGxvZ2dpbmcuSGFuZGxlci5jbG9zZShzZWxmKQogCiAgICAgZGVmIG1hcFByaW9yaXR5KHNlbGYsIGxldmVsTmFtZSk6CkBAIC03OTgsMTQgKzg1MCwxMyBAQAogICAgICAgICAjIE1lc3NhZ2UgaXMgYSBzdHJpbmcuIENvbnZlcnQgdG8gYnl0ZXMgYXMgcmVxdWlyZWQgYnkgUkZDIDU0MjQKICAgICAgICAgaWYgdHlwZShtc2cpIGlzIHVuaWNvZGU6CiAgICAgICAgICAgICBtc2cgPSBtc2cuZW5jb2RlKCd1dGYtOCcpCi0gICAgICAgICAgICBpZiBjb2RlY3M6Ci0gICAgICAgICAgICAgICAgbXNnID0gY29kZWNzLkJPTV9VVEY4ICsgbXNnCiAgICAgICAgIG1zZyA9IHByaW8gKyBtc2cKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaWYgc2VsZi51bml4c29ja2V0OgogICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgc2VsZi5zb2NrZXQuc2VuZChtc2cpCiAgICAgICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zb2NrZXQuY2xvc2UoKSAjIFNlZSBpc3N1ZSAxNzk4MQogICAgICAgICAgICAgICAgICAgICBzZWxmLl9jb25uZWN0X3VuaXhzb2NrZXQoc2VsZi5hZGRyZXNzKQogICAgICAgICAgICAgICAgICAgICBzZWxmLnNvY2tldC5zZW5kKG1zZykKICAgICAgICAgICAgIGVsaWYgc2VsZi5zb2NrdHlwZSA9PSBzb2NrZXQuU09DS19ER1JBTToKQEAgLTg1Miw2ICs5MDMsNyBAQAogICAgICAgICBzZWxmLnRvYWRkcnMgPSB0b2FkZHJzCiAgICAgICAgIHNlbGYuc3ViamVjdCA9IHN1YmplY3QKICAgICAgICAgc2VsZi5zZWN1cmUgPSBzZWN1cmUKKyAgICAgICAgc2VsZi5fdGltZW91dCA9IDUuMAogCiAgICAgZGVmIGdldFN1YmplY3Qoc2VsZiwgcmVjb3JkKToKICAgICAgICAgIiIiCkBAIC04NzQsNyArOTI2LDcgQEAKICAgICAgICAgICAgIHBvcnQgPSBzZWxmLm1haWxwb3J0CiAgICAgICAgICAgICBpZiBub3QgcG9ydDoKICAgICAgICAgICAgICAgICBwb3J0ID0gc210cGxpYi5TTVRQX1BPUlQKLSAgICAgICAgICAgIHNtdHAgPSBzbXRwbGliLlNNVFAoc2VsZi5tYWlsaG9zdCwgcG9ydCkKKyAgICAgICAgICAgIHNtdHAgPSBzbXRwbGliLlNNVFAoc2VsZi5tYWlsaG9zdCwgcG9ydCwgdGltZW91dD1zZWxmLl90aW1lb3V0KQogICAgICAgICAgICAgbXNnID0gc2VsZi5mb3JtYXQocmVjb3JkKQogICAgICAgICAgICAgbXNnID0gIkZyb206ICVzXHJcblRvOiAlc1xyXG5TdWJqZWN0OiAlc1xyXG5EYXRlOiAlc1xyXG5cclxuJXMiICUgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZnJvbWFkZHIsCkBAIC0xMDE2LDcgKzEwNjgsNyBAQAogICAgICAgICAiIiIKICAgICAgICAgRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBtYXBwaW5nIHRoZSBsb2cgcmVjb3JkIGludG8gYSBkaWN0CiAgICAgICAgIHRoYXQgaXMgc2VudCBhcyB0aGUgQ0dJIGRhdGEuIE92ZXJ3cml0ZSBpbiB5b3VyIGNsYXNzLgotICAgICAgICBDb250cmlidXRlZCBieSBGcmFueiAgR2xhc25lci4KKyAgICAgICAgQ29udHJpYnV0ZWQgYnkgRnJhbnogR2xhc25lci4KICAgICAgICAgIiIiCiAgICAgICAgIHJldHVybiByZWNvcmQuX19kaWN0X18KIApAQCAtMTA5Niw3ICsxMTQ4LDExIEBACiAKICAgICAgICAgVGhpcyB2ZXJzaW9uIGp1c3QgemFwcyB0aGUgYnVmZmVyIHRvIGVtcHR5LgogICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5idWZmZXIgPSBbXQorICAgICAgICBzZWxmLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmJ1ZmZlciA9IFtdCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnJlbGVhc2UoKQogCiAgICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICAiIiIKQEAgLTExNDQsMTUgKzEyMDAsMjMgQEAKICAgICAgICAgcmVjb3JkcyB0byB0aGUgdGFyZ2V0LCBpZiB0aGVyZSBpcyBvbmUuIE92ZXJyaWRlIGlmIHlvdSB3YW50CiAgICAgICAgIGRpZmZlcmVudCBiZWhhdmlvdXIuCiAgICAgICAgICIiIgotICAgICAgICBpZiBzZWxmLnRhcmdldDoKLSAgICAgICAgICAgIGZvciByZWNvcmQgaW4gc2VsZi5idWZmZXI6Ci0gICAgICAgICAgICAgICAgc2VsZi50YXJnZXQuaGFuZGxlKHJlY29yZCkKLSAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gW10KKyAgICAgICAgc2VsZi5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi50YXJnZXQ6CisgICAgICAgICAgICAgICAgZm9yIHJlY29yZCBpbiBzZWxmLmJ1ZmZlcjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50YXJnZXQuaGFuZGxlKHJlY29yZCkKKyAgICAgICAgICAgICAgICBzZWxmLmJ1ZmZlciA9IFtdCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnJlbGVhc2UoKQogCiAgICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICAiIiIKICAgICAgICAgRmx1c2gsIHNldCB0aGUgdGFyZ2V0IHRvIE5vbmUgYW5kIGxvc2UgdGhlIGJ1ZmZlci4KICAgICAgICAgIiIiCiAgICAgICAgIHNlbGYuZmx1c2goKQotICAgICAgICBzZWxmLnRhcmdldCA9IE5vbmUKLSAgICAgICAgQnVmZmVyaW5nSGFuZGxlci5jbG9zZShzZWxmKQorICAgICAgICBzZWxmLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnRhcmdldCA9IE5vbmUKKyAgICAgICAgICAgIEJ1ZmZlcmluZ0hhbmRsZXIuY2xvc2Uoc2VsZikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYucmVsZWFzZSgpCmRpZmYgLS1naXQgYS9MaWIvbWFjdXJsMnBhdGgucHkgYi9MaWIvbWFjdXJsMnBhdGgucHkKaW5kZXggNGM1YWU2NC4uNmY4MjYwZiAxMDA2NDQKLS0tIGEvTGliL21hY3VybDJwYXRoLnB5CisrKyBiL0xpYi9tYWN1cmwycGF0aC5weQpAQCAtNzUsMjMgKzc1LDMgQEAKIGRlZiBfcG5jb21wMnVybChjb21wb25lbnQpOgogICAgIGNvbXBvbmVudCA9IHVybGxpYi5xdW90ZShjb21wb25lbnRbOjMxXSwgc2FmZT0nJykgICMgV2Ugd2FudCB0byBxdW90ZSBzbGFzaGVzCiAgICAgcmV0dXJuIGNvbXBvbmVudAotCi1kZWYgdGVzdCgpOgotICAgIGZvciB1cmwgaW4gWyJpbmRleC5odG1sIiwKLSAgICAgICAgICAgICAgICAiYmFyL2luZGV4Lmh0bWwiLAotICAgICAgICAgICAgICAgICIvZm9vL2Jhci9pbmRleC5odG1sIiwKLSAgICAgICAgICAgICAgICAiL2Zvby9iYXIvIiwKLSAgICAgICAgICAgICAgICAiLyJdOgotICAgICAgICBwcmludCAnJXIgLT4gJXInICUgKHVybCwgdXJsMnBhdGhuYW1lKHVybCkpCi0gICAgZm9yIHBhdGggaW4gWyJkcml2ZToiLAotICAgICAgICAgICAgICAgICAiZHJpdmU6ZGlyOiIsCi0gICAgICAgICAgICAgICAgICJkcml2ZTpkaXI6ZmlsZSIsCi0gICAgICAgICAgICAgICAgICJkcml2ZTpmaWxlIiwKLSAgICAgICAgICAgICAgICAgImZpbGUiLAotICAgICAgICAgICAgICAgICAiOmZpbGUiLAotICAgICAgICAgICAgICAgICAiOmRpcjoiLAotICAgICAgICAgICAgICAgICAiOmRpcjpmaWxlIl06Ci0gICAgICAgIHByaW50ICclciAtPiAlcicgJSAocGF0aCwgcGF0aG5hbWUydXJsKHBhdGgpKQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvTGliL21haWxib3gucHkgYi9MaWIvbWFpbGJveC5weQppbmRleCAwZWZkNzQzLi5iYTQ5NzUzIDEwMDY0NAotLS0gYS9MaWIvbWFpbGJveC5weQorKysgYi9MaWIvbWFpbGJveC5weQpAQCAtMSw1ICsxLDMgQEAKLSMhIC91c3IvYmluL2VudiBweXRob24KLQogIiIiUmVhZC93cml0ZSBzdXBwb3J0IGZvciBNYWlsZGlyLCBtYm94LCBNSCwgQmFieWwsIGFuZCBNTURGIG1haWxib3hlcy4iIiIKIAogIyBOb3RlcyBmb3IgYXV0aG9ycyBvZiBuZXcgbWFpbGJveCBzdWJjbGFzc2VzOgpAQCAtMTk3LDYgKzE5NSw5IEBACiAgICAgICAgICIiIkZsdXNoIGFuZCBjbG9zZSB0aGUgbWFpbGJveC4iIiIKICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignTWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MnKQogCisgICAgIyBXaGV0aGVyIGVhY2ggbWVzc2FnZSBtdXN0IGVuZCBpbiBhIG5ld2xpbmUKKyAgICBfYXBwZW5kX25ld2xpbmUgPSBGYWxzZQorCiAgICAgZGVmIF9kdW1wX21lc3NhZ2Uoc2VsZiwgbWVzc2FnZSwgdGFyZ2V0LCBtYW5nbGVfZnJvbV89RmFsc2UpOgogICAgICAgICAjIE1vc3QgZmlsZXMgYXJlIG9wZW5lZCBpbiBiaW5hcnkgbW9kZSB0byBhbGxvdyBwcmVkaWN0YWJsZSBzZWVraW5nLgogICAgICAgICAjIFRvIGdldCBuYXRpdmUgbGluZSBlbmRpbmdzIG9uIGRpc2ssIHRoZSB1c2VyLWZyaWVuZGx5IFxuIGxpbmUgZW5kaW5ncwpAQCAtMjA3LDEzICsyMDgsMjEgQEAKICAgICAgICAgICAgIGdlbiA9IGVtYWlsLmdlbmVyYXRvci5HZW5lcmF0b3IoYnVmZmVyLCBtYW5nbGVfZnJvbV8sIDApCiAgICAgICAgICAgICBnZW4uZmxhdHRlbihtZXNzYWdlKQogICAgICAgICAgICAgYnVmZmVyLnNlZWsoMCkKLSAgICAgICAgICAgIHRhcmdldC53cml0ZShidWZmZXIucmVhZCgpLnJlcGxhY2UoJ1xuJywgb3MubGluZXNlcCkpCisgICAgICAgICAgICBkYXRhID0gYnVmZmVyLnJlYWQoKS5yZXBsYWNlKCdcbicsIG9zLmxpbmVzZXApCisgICAgICAgICAgICB0YXJnZXQud3JpdGUoZGF0YSkKKyAgICAgICAgICAgIGlmIHNlbGYuX2FwcGVuZF9uZXdsaW5lIGFuZCBub3QgZGF0YS5lbmRzd2l0aChvcy5saW5lc2VwKToKKyAgICAgICAgICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgbWVzc2FnZSBlbmRzIHdpdGggYSBuZXdsaW5lCisgICAgICAgICAgICAgICAgdGFyZ2V0LndyaXRlKG9zLmxpbmVzZXApCiAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBzdHIpOgogICAgICAgICAgICAgaWYgbWFuZ2xlX2Zyb21fOgogICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoJ1xuRnJvbSAnLCAnXG4+RnJvbSAnKQogICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgnXG4nLCBvcy5saW5lc2VwKQogICAgICAgICAgICAgdGFyZ2V0LndyaXRlKG1lc3NhZ2UpCisgICAgICAgICAgICBpZiBzZWxmLl9hcHBlbmRfbmV3bGluZSBhbmQgbm90IG1lc3NhZ2UuZW5kc3dpdGgob3MubGluZXNlcCk6CisgICAgICAgICAgICAgICAgIyBNYWtlIHN1cmUgdGhlIG1lc3NhZ2UgZW5kcyB3aXRoIGEgbmV3bGluZQorICAgICAgICAgICAgICAgIHRhcmdldC53cml0ZShvcy5saW5lc2VwKQogICAgICAgICBlbGlmIGhhc2F0dHIobWVzc2FnZSwgJ3JlYWQnKToKKyAgICAgICAgICAgIGxhc3RsaW5lID0gTm9uZQogICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgICBsaW5lID0gbWVzc2FnZS5yZWFkbGluZSgpCiAgICAgICAgICAgICAgICAgaWYgbGluZSA9PSAnJzoKQEAgLTIyMiw2ICsyMzEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgbGluZSA9ICc+RnJvbSAnICsgbGluZVs1Ol0KICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKCdcbicsIG9zLmxpbmVzZXApCiAgICAgICAgICAgICAgICAgdGFyZ2V0LndyaXRlKGxpbmUpCisgICAgICAgICAgICAgICAgbGFzdGxpbmUgPSBsaW5lCisgICAgICAgICAgICBpZiBzZWxmLl9hcHBlbmRfbmV3bGluZSBhbmQgbGFzdGxpbmUgYW5kIG5vdCBsYXN0bGluZS5lbmRzd2l0aChvcy5saW5lc2VwKToKKyAgICAgICAgICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgbWVzc2FnZSBlbmRzIHdpdGggYSBuZXdsaW5lCisgICAgICAgICAgICAgICAgdGFyZ2V0LndyaXRlKG9zLmxpbmVzZXApCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0ludmFsaWQgbWVzc2FnZSB0eXBlOiAlcycgJSB0eXBlKG1lc3NhZ2UpKQogCkBAIC0yNzEsNiArMjg0LDEyIEBACiAgICAgICAgICAgICBzdWZmaXggPSAnJwogICAgICAgICB1bmlxID0gb3MucGF0aC5iYXNlbmFtZSh0bXBfZmlsZS5uYW1lKS5zcGxpdChzZWxmLmNvbG9uKVswXQogICAgICAgICBkZXN0ID0gb3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN1YmRpciwgdW5pcSArIHN1ZmZpeCkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBNYWlsZGlyTWVzc2FnZSk6CisgICAgICAgICAgICBvcy51dGltZSh0bXBfZmlsZS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgKG9zLnBhdGguZ2V0YXRpbWUodG1wX2ZpbGUubmFtZSksIG1lc3NhZ2UuZ2V0X2RhdGUoKSkpCisgICAgICAgICMgTm8gZmlsZSBtb2RpZmljYXRpb24gc2hvdWxkIGJlIGRvbmUgYWZ0ZXIgdGhlIGZpbGUgaXMgbW92ZWQgdG8gaXRzCisgICAgICAgICMgZmluYWwgcG9zaXRpb24gaW4gb3JkZXIgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgd2l0aCBjaGFuZ2VzCisgICAgICAgICMgZnJvbSBvdGhlciBwcm9ncmFtcwogICAgICAgICB0cnk6CiAgICAgICAgICAgICBpZiBoYXNhdHRyKG9zLCAnbGluaycpOgogICAgICAgICAgICAgICAgIG9zLmxpbmsodG1wX2ZpbGUubmFtZSwgZGVzdCkKQEAgLTI4NCw4ICszMDMsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIGRlc3QpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHJhaXNlCi0gICAgICAgIGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgTWFpbGRpck1lc3NhZ2UpOgotICAgICAgICAgICAgb3MudXRpbWUoZGVzdCwgKG9zLnBhdGguZ2V0YXRpbWUoZGVzdCksIG1lc3NhZ2UuZ2V0X2RhdGUoKSkpCiAgICAgICAgIHJldHVybiB1bmlxCiAKICAgICBkZWYgcmVtb3ZlKHNlbGYsIGtleSk6CkBAIC0zMjAsMTEgKzMzNywxNSBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc3VmZml4ID0gJycKICAgICAgICAgc2VsZi5kaXNjYXJkKGtleSkKKyAgICAgICAgdG1wX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgdGVtcF9zdWJwYXRoKQogICAgICAgICBuZXdfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdWJkaXIsIGtleSArIHN1ZmZpeCkKLSAgICAgICAgb3MucmVuYW1lKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCB0ZW1wX3N1YnBhdGgpLCBuZXdfcGF0aCkKICAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBNYWlsZGlyTWVzc2FnZSk6Ci0gICAgICAgICAgICBvcy51dGltZShuZXdfcGF0aCwgKG9zLnBhdGguZ2V0YXRpbWUobmV3X3BhdGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldF9kYXRlKCkpKQorICAgICAgICAgICAgb3MudXRpbWUodG1wX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAob3MucGF0aC5nZXRhdGltZSh0bXBfcGF0aCksIG1lc3NhZ2UuZ2V0X2RhdGUoKSkpCisgICAgICAgICMgTm8gZmlsZSBtb2RpZmljYXRpb24gc2hvdWxkIGJlIGRvbmUgYWZ0ZXIgdGhlIGZpbGUgaXMgbW92ZWQgdG8gaXRzCisgICAgICAgICMgZmluYWwgcG9zaXRpb24gaW4gb3JkZXIgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgd2l0aCBjaGFuZ2VzCisgICAgICAgICMgZnJvbSBvdGhlciBwcm9ncmFtcworICAgICAgICBvcy5yZW5hbWUodG1wX3BhdGgsIG5ld19wYXRoKQogCiAgICAgZGVmIGdldF9tZXNzYWdlKHNlbGYsIGtleSk6CiAgICAgICAgICIiIlJldHVybiBhIE1lc3NhZ2UgcmVwcmVzZW50YXRpb24gb3IgcmFpc2UgYSBLZXlFcnJvci4iIiIKQEAgLTU2MSwxNiArNTgyLDE5IEBACiAgICAgICAgIHNlbGYuX2ZpbGUgPSBmCiAgICAgICAgIHNlbGYuX3RvYyA9IE5vbmUKICAgICAgICAgc2VsZi5fbmV4dF9rZXkgPSAwCi0gICAgICAgIHNlbGYuX3BlbmRpbmcgPSBGYWxzZSAgICMgTm8gY2hhbmdlcyByZXF1aXJlIHJld3JpdGluZyB0aGUgZmlsZS4KKyAgICAgICAgc2VsZi5fcGVuZGluZyA9IEZhbHNlICAgICAgICMgTm8gY2hhbmdlcyByZXF1aXJlIHJld3JpdGluZyB0aGUgZmlsZS4KKyAgICAgICAgc2VsZi5fcGVuZGluZ19zeW5jID0gRmFsc2UgICMgTm8gbmVlZCB0byBzeW5jIHRoZSBmaWxlCiAgICAgICAgIHNlbGYuX2xvY2tlZCA9IEZhbHNlCi0gICAgICAgIHNlbGYuX2ZpbGVfbGVuZ3RoID0gTm9uZSAgICAgICAgIyBVc2VkIHRvIHJlY29yZCBtYWlsYm94IHNpemUKKyAgICAgICAgc2VsZi5fZmlsZV9sZW5ndGggPSBOb25lICAgICMgVXNlZCB0byByZWNvcmQgbWFpbGJveCBzaXplCiAKICAgICBkZWYgYWRkKHNlbGYsIG1lc3NhZ2UpOgogICAgICAgICAiIiJBZGQgbWVzc2FnZSBhbmQgcmV0dXJuIGFzc2lnbmVkIGtleS4iIiIKICAgICAgICAgc2VsZi5fbG9va3VwKCkKICAgICAgICAgc2VsZi5fdG9jW3NlbGYuX25leHRfa2V5XSA9IHNlbGYuX2FwcGVuZF9tZXNzYWdlKG1lc3NhZ2UpCiAgICAgICAgIHNlbGYuX25leHRfa2V5ICs9IDEKLSAgICAgICAgc2VsZi5fcGVuZGluZyA9IFRydWUKKyAgICAgICAgIyBfYXBwZW5kX21lc3NhZ2UgYXBwZW5kcyB0aGUgbWVzc2FnZSB0byB0aGUgbWFpbGJveCBmaWxlLiBXZQorICAgICAgICAjIGRvbid0IG5lZWQgYSBmdWxsIHJld3JpdGUgKyByZW5hbWUsIHN5bmMgaXMgZW5vdWdoLgorICAgICAgICBzZWxmLl9wZW5kaW5nX3N5bmMgPSBUcnVlCiAgICAgICAgIHJldHVybiBzZWxmLl9uZXh0X2tleSAtIDEKIAogICAgIGRlZiByZW1vdmUoc2VsZiwga2V5KToKQEAgLTYxNiw2ICs2NDAsMTEgQEAKICAgICBkZWYgZmx1c2goc2VsZik6CiAgICAgICAgICIiIldyaXRlIGFueSBwZW5kaW5nIGNoYW5nZXMgdG8gZGlzay4iIiIKICAgICAgICAgaWYgbm90IHNlbGYuX3BlbmRpbmc6CisgICAgICAgICAgICBpZiBzZWxmLl9wZW5kaW5nX3N5bmM6CisgICAgICAgICAgICAgICAgIyBNZXNzYWdlcyBoYXZlIG9ubHkgYmVlbiBhZGRlZCwgc28gc3luY2luZyB0aGUgZmlsZQorICAgICAgICAgICAgICAgICMgaXMgZW5vdWdoLgorICAgICAgICAgICAgICAgIF9zeW5jX2ZsdXNoKHNlbGYuX2ZpbGUpCisgICAgICAgICAgICAgICAgc2VsZi5fcGVuZGluZ19zeW5jID0gRmFsc2UKICAgICAgICAgICAgIHJldHVybgogCiAgICAgICAgICMgSW4gb3JkZXIgdG8gYmUgd3JpdGluZyBhbnl0aGluZyBvdXQgYXQgYWxsLCBzZWxmLl90b2MgbXVzdApAQCAtNjQ5LDYgKzY3OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIG5ld19maWxlLndyaXRlKGJ1ZmZlcikKICAgICAgICAgICAgICAgICBuZXdfdG9jW2tleV0gPSAobmV3X3N0YXJ0LCBuZXdfZmlsZS50ZWxsKCkpCiAgICAgICAgICAgICAgICAgc2VsZi5fcG9zdF9tZXNzYWdlX2hvb2sobmV3X2ZpbGUpCisgICAgICAgICAgICBzZWxmLl9maWxlX2xlbmd0aCA9IG5ld19maWxlLnRlbGwoKQogICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICBuZXdfZmlsZS5jbG9zZSgpCiAgICAgICAgICAgICBvcy5yZW1vdmUobmV3X2ZpbGUubmFtZSkKQEAgLTY1Niw2ICs2ODYsOSBAQAogICAgICAgICBfc3luY19jbG9zZShuZXdfZmlsZSkKICAgICAgICAgIyBzZWxmLl9maWxlIGlzIGFib3V0IHRvIGdldCByZXBsYWNlZCwgc28gbm8gbmVlZCB0byBzeW5jLgogICAgICAgICBzZWxmLl9maWxlLmNsb3NlKCkKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlIG5ldyBmaWxlJ3MgbW9kZSBpcyB0aGUgc2FtZSBhcyB0aGUgb2xkIGZpbGUncworICAgICAgICBtb2RlID0gb3Muc3RhdChzZWxmLl9wYXRoKS5zdF9tb2RlCisgICAgICAgIG9zLmNobW9kKG5ld19maWxlLm5hbWUsIG1vZGUpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG9zLnJlbmFtZShuZXdfZmlsZS5uYW1lLCBzZWxmLl9wYXRoKQogICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKQEAgLTY2OCw2ICs3MDEsNyBAQAogICAgICAgICBzZWxmLl9maWxlID0gb3BlbihzZWxmLl9wYXRoLCAncmIrJykKICAgICAgICAgc2VsZi5fdG9jID0gbmV3X3RvYwogICAgICAgICBzZWxmLl9wZW5kaW5nID0gRmFsc2UKKyAgICAgICAgc2VsZi5fcGVuZGluZ19zeW5jID0gRmFsc2UKICAgICAgICAgaWYgc2VsZi5fbG9ja2VkOgogICAgICAgICAgICAgX2xvY2tfZmlsZShzZWxmLl9maWxlLCBkb3Rsb2NrPUZhbHNlKQogCkBAIC03MDQsNiArNzM4LDEyIEBACiAgICAgICAgICIiIkFwcGVuZCBtZXNzYWdlIHRvIG1haWxib3ggYW5kIHJldHVybiAoc3RhcnQsIHN0b3ApIG9mZnNldHMuIiIiCiAgICAgICAgIHNlbGYuX2ZpbGUuc2VlaygwLCAyKQogICAgICAgICBiZWZvcmUgPSBzZWxmLl9maWxlLnRlbGwoKQorICAgICAgICBpZiBsZW4oc2VsZi5fdG9jKSA9PSAwIGFuZCBub3Qgc2VsZi5fcGVuZGluZzoKKyAgICAgICAgICAgICMgVGhpcyBpcyB0aGUgZmlyc3QgbWVzc2FnZSwgYW5kIHRoZSBfcHJlX21haWxib3hfaG9vaworICAgICAgICAgICAgIyBoYXNuJ3QgeWV0IGJlZW4gY2FsbGVkLiBJZiBzZWxmLl9wZW5kaW5nIGlzIFRydWUsCisgICAgICAgICAgICAjIG1lc3NhZ2VzIGhhdmUgYmVlbiByZW1vdmVkLCBzbyBfcHJlX21haWxib3hfaG9vayBtdXN0CisgICAgICAgICAgICAjIGhhdmUgYmVlbiBjYWxsZWQgYWxyZWFkeS4KKyAgICAgICAgICAgIHNlbGYuX3ByZV9tYWlsYm94X2hvb2soc2VsZi5fZmlsZSkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc2VsZi5fcHJlX21lc3NhZ2VfaG9vayhzZWxmLl9maWxlKQogICAgICAgICAgICAgb2Zmc2V0cyA9IHNlbGYuX2luc3RhbGxfbWVzc2FnZShtZXNzYWdlKQpAQCAtNzc4LDMwICs4MTgsNDggQEAKIAogICAgIF9tYW5nbGVfZnJvbV8gPSBUcnVlCiAKKyAgICAjIEFsbCBtZXNzYWdlcyBtdXN0IGVuZCBpbiBhIG5ld2xpbmUgY2hhcmFjdGVyLCBhbmQKKyAgICAjIF9wb3N0X21lc3NhZ2VfaG9va3Mgb3V0cHV0cyBhbiBlbXB0eSBsaW5lIGJldHdlZW4gbWVzc2FnZXMuCisgICAgX2FwcGVuZF9uZXdsaW5lID0gVHJ1ZQorCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgsIGZhY3Rvcnk9Tm9uZSwgY3JlYXRlPVRydWUpOgogICAgICAgICAiIiJJbml0aWFsaXplIGFuIG1ib3ggbWFpbGJveC4iIiIKICAgICAgICAgc2VsZi5fbWVzc2FnZV9mYWN0b3J5ID0gbWJveE1lc3NhZ2UKICAgICAgICAgX21ib3hNTURGLl9faW5pdF9fKHNlbGYsIHBhdGgsIGZhY3RvcnksIGNyZWF0ZSkKIAotICAgIGRlZiBfcHJlX21lc3NhZ2VfaG9vayhzZWxmLCBmKToKLSAgICAgICAgIiIiQ2FsbGVkIGJlZm9yZSB3cml0aW5nIGVhY2ggbWVzc2FnZSB0byBmaWxlIGYuIiIiCi0gICAgICAgIGlmIGYudGVsbCgpICE9IDA6Ci0gICAgICAgICAgICBmLndyaXRlKG9zLmxpbmVzZXApCisgICAgZGVmIF9wb3N0X21lc3NhZ2VfaG9vayhzZWxmLCBmKToKKyAgICAgICAgIiIiQ2FsbGVkIGFmdGVyIHdyaXRpbmcgZWFjaCBtZXNzYWdlIHRvIGZpbGUgZi4iIiIKKyAgICAgICAgZi53cml0ZShvcy5saW5lc2VwKQogCiAgICAgZGVmIF9nZW5lcmF0ZV90b2Moc2VsZik6CiAgICAgICAgICIiIkdlbmVyYXRlIGtleS10by0oc3RhcnQsIHN0b3ApIHRhYmxlIG9mIGNvbnRlbnRzLiIiIgogICAgICAgICBzdGFydHMsIHN0b3BzID0gW10sIFtdCisgICAgICAgIGxhc3Rfd2FzX2VtcHR5ID0gRmFsc2UKICAgICAgICAgc2VsZi5fZmlsZS5zZWVrKDApCiAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICBsaW5lX3BvcyA9IHNlbGYuX2ZpbGUudGVsbCgpCiAgICAgICAgICAgICBsaW5lID0gc2VsZi5fZmlsZS5yZWFkbGluZSgpCiAgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJ0Zyb20gJyk6CiAgICAgICAgICAgICAgICAgaWYgbGVuKHN0b3BzKSA8IGxlbihzdGFydHMpOgotICAgICAgICAgICAgICAgICAgICBzdG9wcy5hcHBlbmQobGluZV9wb3MgLSBsZW4ob3MubGluZXNlcCkpCisgICAgICAgICAgICAgICAgICAgIGlmIGxhc3Rfd2FzX2VtcHR5OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHMuYXBwZW5kKGxpbmVfcG9zIC0gbGVuKG9zLmxpbmVzZXApKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgbGFzdCBsaW5lIGJlZm9yZSB0aGUgIkZyb20gIiBsaW5lIHdhc24ndAorICAgICAgICAgICAgICAgICAgICAgICAgIyBibGFuaywgYnV0IHdlIGNvbnNpZGVyIGl0IGEgc3RhcnQgb2YgYQorICAgICAgICAgICAgICAgICAgICAgICAgIyBtZXNzYWdlIGFueXdheS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BzLmFwcGVuZChsaW5lX3BvcykKICAgICAgICAgICAgICAgICBzdGFydHMuYXBwZW5kKGxpbmVfcG9zKQotICAgICAgICAgICAgZWxpZiBsaW5lID09ICcnOgotICAgICAgICAgICAgICAgIHN0b3BzLmFwcGVuZChsaW5lX3BvcykKKyAgICAgICAgICAgICAgICBsYXN0X3dhc19lbXB0eSA9IEZhbHNlCisgICAgICAgICAgICBlbGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIGlmIGxhc3Rfd2FzX2VtcHR5OgorICAgICAgICAgICAgICAgICAgICBzdG9wcy5hcHBlbmQobGluZV9wb3MgLSBsZW4ob3MubGluZXNlcCkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc3RvcHMuYXBwZW5kKGxpbmVfcG9zKQogICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbGlmIGxpbmUgPT0gb3MubGluZXNlcDoKKyAgICAgICAgICAgICAgICBsYXN0X3dhc19lbXB0eSA9IFRydWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbGFzdF93YXNfZW1wdHkgPSBGYWxzZQogICAgICAgICBzZWxmLl90b2MgPSBkaWN0KGVudW1lcmF0ZSh6aXAoc3RhcnRzLCBzdG9wcykpKQogICAgICAgICBzZWxmLl9uZXh0X2tleSA9IGxlbihzZWxmLl90b2MpCiAgICAgICAgIHNlbGYuX2ZpbGVfbGVuZ3RoID0gc2VsZi5fZmlsZS50ZWxsKCkKQEAgLTEzNjcsOSArMTQyNSw5IEBACiAgICAgICAgICAgICAgICAgbGluZSA9IG1lc3NhZ2UucmVhZGxpbmUoKQogICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUobGluZS5yZXBsYWNlKCdcbicsIG9zLmxpbmVzZXApKQogICAgICAgICAgICAgICAgIGlmIGxpbmUgPT0gJ1xuJyBvciBsaW5lID09ICcnOgotICAgICAgICAgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKCcqKiogRU9PSCAqKionICsgb3MubGluZXNlcCkKICAgICAgICAgICAgICAgICAgICAgaWYgZmlyc3RfcGFzczoKICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3Bhc3MgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnKioqIEVPT0ggKioqJyArIG9zLmxpbmVzZXApCiAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlZWsob3JpZ2luYWxfcG9zKQogICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKZGlmZiAtLWdpdCBhL0xpYi9tYWlsY2FwLnB5IGIvTGliL21haWxjYXAucHkKaW5kZXggYjJkZGFjZC4uMDQwNzdiYSAxMDA2NDQKLS0tIGEvTGliL21haWxjYXAucHkKKysrIGIvTGliL21haWxjYXAucHkKQEAgLTIyLDggKzIyLDggQEAKICAgICAgICAgICAgIGZwID0gb3BlbihtYWlsY2FwLCAncicpCiAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgbW9yZWNhcHMgPSByZWFkbWFpbGNhcGZpbGUoZnApCi0gICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgd2l0aCBmcDoKKyAgICAgICAgICAgIG1vcmVjYXBzID0gcmVhZG1haWxjYXBmaWxlKGZwKQogICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBtb3JlY2Fwcy5pdGVyaXRlbXMoKToKICAgICAgICAgICAgIGlmIG5vdCBrZXkgaW4gY2FwczoKICAgICAgICAgICAgICAgICBjYXBzW2tleV0gPSB2YWx1ZQpkaWZmIC0tZ2l0IGEvTGliL21hcmt1cGJhc2UucHkgYi9MaWIvbWFya3VwYmFzZS5weQppbmRleCAyNDgwOGQxLi5kZGViOTgzIDEwMDY0NAotLS0gYS9MaWIvbWFya3VwYmFzZS5weQorKysgYi9MaWIvbWFya3VwYmFzZS5weQpAQCAtMTA4LDYgKzEwOCwxMCBAQAogICAgICAgICAgICAgICAgIGlmIGRlY2x0eXBlID09ICJkb2N0eXBlIjoKICAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGVjbChkYXRhKQogICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgQWNjb3JkaW5nIHRvIHRoZSBIVE1MNSBzcGVjcyBzZWN0aW9ucyAiOC4yLjQuNDQgQm9ndXMKKyAgICAgICAgICAgICAgICAgICAgIyBjb21tZW50IHN0YXRlIiBhbmQgIjguMi40LjQ1IE1hcmt1cCBkZWNsYXJhdGlvbiBvcGVuCisgICAgICAgICAgICAgICAgICAgICMgc3RhdGUiLCBhIGNvbW1lbnQgdG9rZW4gc2hvdWxkIGJlIGVtaXR0ZWQuCisgICAgICAgICAgICAgICAgICAgICMgQ2FsbGluZyB1bmtub3duX2RlY2wgcHJvdmlkZXMgbW9yZSBmbGV4aWJpbGl0eSB0aG91Z2guCiAgICAgICAgICAgICAgICAgICAgIHNlbGYudW5rbm93bl9kZWNsKGRhdGEpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGogKyAxCiAgICAgICAgICAgICBpZiBjIGluICJcIiciOgpkaWZmIC0tZ2l0IGEvTGliL21pbWV0eXBlcy5weSBiL0xpYi9taW1ldHlwZXMucHkKaW5kZXggNGMwNTRjOS4uZWM4ZmQ5OSAxMDA2NDQKLS0tIGEvTGliL21pbWV0eXBlcy5weQorKysgYi9MaWIvbWltZXR5cGVzLnB5CkBAIC0yNDIsMzUgKzI0MiwzMSBAQAogICAgICAgICAgICAgaSA9IDAKICAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBjdHlwZSA9IF93aW5yZWcuRW51bUtleShtaW1lZGIsIGkpCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIF93aW5yZWcuRW51bUtleShtaW1lZGIsIGkpCiAgICAgICAgICAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3I6CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBjdHlwZSA9IGN0eXBlLmVuY29kZShkZWZhdWx0X2VuY29kaW5nKSAjIG9taXQgaW4gMy54IQotICAgICAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICB5aWVsZCBjdHlwZQogICAgICAgICAgICAgICAgIGkgKz0gMQogCiAgICAgICAgIGRlZmF1bHRfZW5jb2RpbmcgPSBzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCkKLSAgICAgICAgd2l0aCBfd2lucmVnLk9wZW5LZXkoX3dpbnJlZy5IS0VZX0NMQVNTRVNfUk9PVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidNSU1FXERhdGFiYXNlXENvbnRlbnQgVHlwZScpIGFzIG1pbWVkYjoKLSAgICAgICAgICAgIGZvciBjdHlwZSBpbiBlbnVtX3R5cGVzKG1pbWVkYik6CisgICAgICAgIHdpdGggX3dpbnJlZy5PcGVuS2V5KF93aW5yZWcuSEtFWV9DTEFTU0VTX1JPT1QsICcnKSBhcyBoa2NyOgorICAgICAgICAgICAgZm9yIHN1YmtleW5hbWUgaW4gZW51bV90eXBlcyhoa2NyKToKICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIHdpdGggX3dpbnJlZy5PcGVuS2V5KG1pbWVkYiwgY3R5cGUpIGFzIGtleToKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCwgZGF0YXR5cGUgPSBfd2lucmVnLlF1ZXJ5VmFsdWVFeChrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0V4dGVuc2lvbicpCisgICAgICAgICAgICAgICAgICAgIHdpdGggX3dpbnJlZy5PcGVuS2V5KGhrY3IsIHN1YmtleW5hbWUpIGFzIHN1YmtleToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgT25seSBjaGVjayBmaWxlIGV4dGVuc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzdWJrZXluYW1lLnN0YXJ0c3dpdGgoIi4iKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgIyByYWlzZXMgRW52aXJvbm1lbnRFcnJvciBpZiBubyAnQ29udGVudCBUeXBlJyB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgbWltZXR5cGUsIGRhdGF0eXBlID0gX3dpbnJlZy5RdWVyeVZhbHVlRXgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Via2V5LCAnQ29udGVudCBUeXBlJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRhdGF0eXBlICE9IF93aW5yZWcuUkVHX1NaOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWltZXR5cGUgPSBtaW1ldHlwZS5lbmNvZGUoZGVmYXVsdF9lbmNvZGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX3R5cGUobWltZXR5cGUsIHN1YmtleW5hbWUsIHN0cmljdCkKICAgICAgICAgICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgICAgICBpZiBkYXRhdHlwZSAhPSBfd2lucmVnLlJFR19TWjoKLSAgICAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9IHN1ZmZpeC5lbmNvZGUoZGVmYXVsdF9lbmNvZGluZykgIyBvbWl0IGluIDMueCEKLSAgICAgICAgICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgotICAgICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgICAgIHNlbGYuYWRkX3R5cGUoY3R5cGUsIHN1ZmZpeCwgc3RyaWN0KQotCiAKIGRlZiBndWVzc190eXBlKHVybCwgc3RyaWN0PVRydWUpOgogICAgICIiIkd1ZXNzIHRoZSB0eXBlIG9mIGEgZmlsZSBiYXNlZCBvbiBpdHMgVVJMLgpAQCAtMzcwLDkgKzM2NiwxMCBAQAogICAgICAgICBmID0gb3BlbihmaWxlKQogICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgICByZXR1cm4gTm9uZQotICAgIGRiID0gTWltZVR5cGVzKCkKLSAgICBkYi5yZWFkZnAoZiwgVHJ1ZSkKLSAgICByZXR1cm4gZGIudHlwZXNfbWFwW1RydWVdCisgICAgd2l0aCBmOgorICAgICAgICBkYiA9IE1pbWVUeXBlcygpCisgICAgICAgIGRiLnJlYWRmcChmLCBUcnVlKQorICAgICAgICByZXR1cm4gZGIudHlwZXNfbWFwW1RydWVdCiAKIAogZGVmIF9kZWZhdWx0X21pbWVfdHlwZXMoKToKQEAgLTM4NiwxMiArMzgzLDE0IEBACiAgICAgICAgICcudGF6JzogJy50YXIuZ3onLAogICAgICAgICAnLnR6JzogJy50YXIuZ3onLAogICAgICAgICAnLnRiejInOiAnLnRhci5iejInLAorICAgICAgICAnLnR4eic6ICcudGFyLnh6JywKICAgICAgICAgfQogCiAgICAgZW5jb2RpbmdzX21hcCA9IHsKICAgICAgICAgJy5neic6ICdnemlwJywKICAgICAgICAgJy5aJzogJ2NvbXByZXNzJywKICAgICAgICAgJy5iejInOiAnYnppcDInLAorICAgICAgICAnLnh6JzogJ3h6JywKICAgICAgICAgfQogCiAgICAgIyBCZWZvcmUgYWRkaW5nIG5ldyB0eXBlcywgbWFrZSBzdXJlIHRoZXkgYXJlIGVpdGhlciByZWdpc3RlcmVkIHdpdGggSUFOQSwKQEAgLTQzMiwxMSArNDMxLDEyIEBACiAgICAgICAgICcuaGRmJyAgICA6ICdhcHBsaWNhdGlvbi94LWhkZicsCiAgICAgICAgICcuaHRtJyAgICA6ICd0ZXh0L2h0bWwnLAogICAgICAgICAnLmh0bWwnICAgOiAndGV4dC9odG1sJywKKyAgICAgICAgJy5pY28nICAgIDogJ2ltYWdlL3ZuZC5taWNyb3NvZnQuaWNvbicsCiAgICAgICAgICcuaWVmJyAgICA6ICdpbWFnZS9pZWYnLAogICAgICAgICAnLmpwZScgICAgOiAnaW1hZ2UvanBlZycsCiAgICAgICAgICcuanBlZycgICA6ICdpbWFnZS9qcGVnJywKICAgICAgICAgJy5qcGcnICAgIDogJ2ltYWdlL2pwZWcnLAotICAgICAgICAnLmpzJyAgICAgOiAnYXBwbGljYXRpb24veC1qYXZhc2NyaXB0JywKKyAgICAgICAgJy5qcycgICAgIDogJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnLAogICAgICAgICAnLmtzaCcgICAgOiAndGV4dC9wbGFpbicsCiAgICAgICAgICcubGF0ZXgnICA6ICdhcHBsaWNhdGlvbi94LWxhdGV4JywKICAgICAgICAgJy5tMXYnICAgIDogJ3ZpZGVvL21wZWcnLApkaWZmIC0tZ2l0IGEvTGliL21vZHVsZWZpbmRlci5weSBiL0xpYi9tb2R1bGVmaW5kZXIucHkKaW5kZXggN2YyYmY4Yi4uZjZmODRmMyAxMDA2NDQKLS0tIGEvTGliL21vZHVsZWZpbmRlci5weQorKysgYi9MaWIvbW9kdWxlZmluZGVyLnB5CkBAIC01MTYsNyArNTE2LDcgQEAKICAgICAgICAgIyBQcmludCBtb2R1bGVzIHRoYXQgbWF5IGJlIG1pc3NpbmcsIGJ1dCB0aGVuIGFnYWluLCBtYXliZSBub3QuLi4KICAgICAgICAgaWYgbWF5YmU6CiAgICAgICAgICAgICBwcmludAotICAgICAgICAgICAgcHJpbnQgIlN1Ym1vZHVsZXMgdGhheSBhcHBlYXIgdG8gYmUgbWlzc2luZywgYnV0IGNvdWxkIGFsc28gYmUiLAorICAgICAgICAgICAgcHJpbnQgIlN1Ym1vZHVsZXMgdGhhdCBhcHBlYXIgdG8gYmUgbWlzc2luZywgYnV0IGNvdWxkIGFsc28gYmUiLAogICAgICAgICAgICAgcHJpbnQgImdsb2JhbCBuYW1lcyBpbiB0aGUgcGFyZW50IHBhY2thZ2U6IgogICAgICAgICAgICAgZm9yIG5hbWUgaW4gbWF5YmU6CiAgICAgICAgICAgICAgICAgbW9kcyA9IHNlbGYuYmFkbW9kdWxlc1tuYW1lXS5rZXlzKCkKZGlmZiAtLWdpdCBhL0xpYi9tc2lsaWIvX19pbml0X18ucHkgYi9MaWIvbXNpbGliL19faW5pdF9fLnB5CmluZGV4IDYzZjM5MjMuLjkwN2E3MzkgMTAwNjQ0Ci0tLSBhL0xpYi9tc2lsaWIvX19pbml0X18ucHkKKysrIGIvTGliL21zaWxpYi9fX2luaXRfXy5weQpAQCAtMzI2LDcgKzMyNiw3IEBACiAKICAgICBkZWYgYWRkX2ZpbGUoc2VsZiwgZmlsZSwgc3JjPU5vbmUsIHZlcnNpb249Tm9uZSwgbGFuZ3VhZ2U9Tm9uZSk6CiAgICAgICAgICIiIkFkZCBhIGZpbGUgdG8gdGhlIGN1cnJlbnQgY29tcG9uZW50IG9mIHRoZSBkaXJlY3RvcnksIHN0YXJ0aW5nIGEgbmV3IG9uZQotICAgICAgICBvbmUgaWYgdGhlcmUgaXMgbm8gY3VycmVudCBjb21wb25lbnQuIEJ5IGRlZmF1bHQsIHRoZSBmaWxlIG5hbWUgaW4gdGhlIHNvdXJjZQorICAgICAgICBpZiB0aGVyZSBpcyBubyBjdXJyZW50IGNvbXBvbmVudC4gQnkgZGVmYXVsdCwgdGhlIGZpbGUgbmFtZSBpbiB0aGUgc291cmNlCiAgICAgICAgIGFuZCB0aGUgZmlsZSB0YWJsZSB3aWxsIGJlIGlkZW50aWNhbC4gSWYgdGhlIHNyYyBmaWxlIGlzIHNwZWNpZmllZCwgaXQgaXMKICAgICAgICAgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiBPcHRpb25hbGx5LCBhIHZlcnNpb24gYW5kIGEKICAgICAgICAgbGFuZ3VhZ2UgY2FuIGJlIHNwZWNpZmllZCBmb3IgdGhlIGVudHJ5IGluIHRoZSBGaWxlIHRhYmxlLiIiIgpkaWZmIC0tZ2l0IGEvTGliL211bHRpcHJvY2Vzc2luZy9jb25uZWN0aW9uLnB5IGIvTGliL211bHRpcHJvY2Vzc2luZy9jb25uZWN0aW9uLnB5CmluZGV4IDA5MDc5NmUuLmU0ZDUyMGYgMTAwNjQ0Ci0tLSBhL0xpYi9tdWx0aXByb2Nlc3NpbmcvY29ubmVjdGlvbi5weQorKysgYi9MaWIvbXVsdGlwcm9jZXNzaW5nL2Nvbm5lY3Rpb24ucHkKQEAgLTkwLDcgKzkwLDcgQEAKICAgICAgICAgcmV0dXJuIHRlbXBmaWxlLm1rdGVtcChwcmVmaXg9J2xpc3RlbmVyLScsIGRpcj1nZXRfdGVtcF9kaXIoKSkKICAgICBlbGlmIGZhbWlseSA9PSAnQUZfUElQRSc6CiAgICAgICAgIHJldHVybiB0ZW1wZmlsZS5ta3RlbXAocHJlZml4PXInXFwuXHBpcGVccHljLSVkLSVkLScgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcy5nZXRwaWQoKSwgX21tYXBfY291bnRlci5uZXh0KCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcy5nZXRwaWQoKSwgX21tYXBfY291bnRlci5uZXh0KCkpLCBkaXI9IiIpCiAgICAgZWxzZToKICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigndW5yZWNvZ25pemVkIGZhbWlseScpCiAKQEAgLTE4Niw2ICsxODYsOCBAQAogICAgICAgICAnJycKICAgICAgICAgaWYgZHVwbGV4OgogICAgICAgICAgICAgczEsIHMyID0gc29ja2V0LnNvY2tldHBhaXIoKQorICAgICAgICAgICAgczEuc2V0YmxvY2tpbmcoVHJ1ZSkKKyAgICAgICAgICAgIHMyLnNldGJsb2NraW5nKFRydWUpCiAgICAgICAgICAgICBjMSA9IF9tdWx0aXByb2Nlc3NpbmcuQ29ubmVjdGlvbihvcy5kdXAoczEuZmlsZW5vKCkpKQogICAgICAgICAgICAgYzIgPSBfbXVsdGlwcm9jZXNzaW5nLkNvbm5lY3Rpb24ob3MuZHVwKHMyLmZpbGVubygpKSkKICAgICAgICAgICAgIHMxLmNsb3NlKCkKQEAgLTE5OCw3ICsyMDAsNiBAQAogICAgICAgICByZXR1cm4gYzEsIGMyCiAKIGVsc2U6Ci0KICAgICBmcm9tIF9tdWx0aXByb2Nlc3NpbmcgaW1wb3J0IHdpbjMyCiAKICAgICBkZWYgUGlwZShkdXBsZXg9VHJ1ZSk6CkBAIC0yNDksMTAgKzI1MCwxNSBAQAogICAgICcnJwogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhZGRyZXNzLCBmYW1pbHksIGJhY2tsb2c9MSk6CiAgICAgICAgIHNlbGYuX3NvY2tldCA9IHNvY2tldC5zb2NrZXQoZ2V0YXR0cihzb2NrZXQsIGZhbWlseSkpCi0gICAgICAgIHNlbGYuX3NvY2tldC5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fUkVVU0VBRERSLCAxKQotICAgICAgICBzZWxmLl9zb2NrZXQuYmluZChhZGRyZXNzKQotICAgICAgICBzZWxmLl9zb2NrZXQubGlzdGVuKGJhY2tsb2cpCi0gICAgICAgIHNlbGYuX2FkZHJlc3MgPSBzZWxmLl9zb2NrZXQuZ2V0c29ja25hbWUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9zb2NrZXQuc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1JFVVNFQUREUiwgMSkKKyAgICAgICAgICAgIHNlbGYuX3NvY2tldC5zZXRibG9ja2luZyhUcnVlKQorICAgICAgICAgICAgc2VsZi5fc29ja2V0LmJpbmQoYWRkcmVzcykKKyAgICAgICAgICAgIHNlbGYuX3NvY2tldC5saXN0ZW4oYmFja2xvZykKKyAgICAgICAgICAgIHNlbGYuX2FkZHJlc3MgPSBzZWxmLl9zb2NrZXQuZ2V0c29ja25hbWUoKQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgc2VsZi5fc29ja2V0LmNsb3NlKCkKKyAgICAgICAgICAgIHJhaXNlCiAgICAgICAgIHNlbGYuX2ZhbWlseSA9IGZhbWlseQogICAgICAgICBzZWxmLl9sYXN0X2FjY2VwdGVkID0gTm9uZQogCkBAIC0yNjQsNyArMjcwLDE1IEBACiAgICAgICAgICAgICBzZWxmLl91bmxpbmsgPSBOb25lCiAKICAgICBkZWYgYWNjZXB0KHNlbGYpOgotICAgICAgICBzLCBzZWxmLl9sYXN0X2FjY2VwdGVkID0gc2VsZi5fc29ja2V0LmFjY2VwdCgpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcywgc2VsZi5fbGFzdF9hY2NlcHRlZCA9IHNlbGYuX3NvY2tldC5hY2NlcHQoKQorICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciBhcyBlOgorICAgICAgICAgICAgICAgIGlmIGUuYXJnc1swXSAhPSBlcnJuby5FSU5UUjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcy5zZXRibG9ja2luZyhUcnVlKQogICAgICAgICBmZCA9IGR1cGxpY2F0ZShzLmZpbGVubygpKQogICAgICAgICBjb25uID0gX211bHRpcHJvY2Vzc2luZy5Db25uZWN0aW9uKGZkKQogICAgICAgICBzLmNsb3NlKCkKQEAgLTI4MCwxNCArMjk0LDE2IEBACiAgICAgJycnCiAgICAgUmV0dXJuIGEgY29ubmVjdGlvbiBvYmplY3QgY29ubmVjdGVkIHRvIHRoZSBzb2NrZXQgZ2l2ZW4gYnkgYGFkZHJlc3NgCiAgICAgJycnCi0gICAgZmFtaWx5ID0gYWRkcmVzc190eXBlKGFkZHJlc3MpCi0gICAgcyA9IHNvY2tldC5zb2NrZXQoIGdldGF0dHIoc29ja2V0LCBmYW1pbHkpICkKKyAgICBmYW1pbHkgPSBnZXRhdHRyKHNvY2tldCwgYWRkcmVzc190eXBlKGFkZHJlc3MpKQogICAgIHQgPSBfaW5pdF90aW1lb3V0KCkKIAogICAgIHdoaWxlIDE6CisgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KGZhbWlseSkKKyAgICAgICAgcy5zZXRibG9ja2luZyhUcnVlKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzLmNvbm5lY3QoYWRkcmVzcykKICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZToKKyAgICAgICAgICAgIHMuY2xvc2UoKQogICAgICAgICAgICAgaWYgZS5hcmdzWzBdICE9IGVycm5vLkVDT05OUkVGVVNFRCBvciBfY2hlY2tfdGltZW91dCh0KToKICAgICAgICAgICAgICAgICBkZWJ1ZygnZmFpbGVkIHRvIGNvbm5lY3QgdG8gYWRkcmVzcyAlcycsIGFkZHJlc3MpCiAgICAgICAgICAgICAgICAgcmFpc2UKQEAgLTM0NCw3ICszNjAsMTAgQEAKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICB3aW4zMi5Db25uZWN0TmFtZWRQaXBlKGhhbmRsZSwgd2luMzIuTlVMTCkKICAgICAgICAgICAgIGV4Y2VwdCBXaW5kb3dzRXJyb3IsIGU6Ci0gICAgICAgICAgICAgICAgaWYgZS5hcmdzWzBdICE9IHdpbjMyLkVSUk9SX1BJUEVfQ09OTkVDVEVEOgorICAgICAgICAgICAgICAgICMgRVJST1JfTk9fREFUQSBjYW4gb2NjdXIgaWYgYSBjbGllbnQgaGFzIGFscmVhZHkgY29ubmVjdGVkLAorICAgICAgICAgICAgICAgICMgd3JpdHRlbiBkYXRhIGFuZCB0aGVuIGRpc2Nvbm5lY3RlZCAtLSBzZWUgSXNzdWUgMTQ3MjUuCisgICAgICAgICAgICAgICAgaWYgZS5hcmdzWzBdIG5vdCBpbiAod2luMzIuRVJST1JfUElQRV9DT05ORUNURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luMzIuRVJST1JfTk9fREFUQSk6CiAgICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICByZXR1cm4gX211bHRpcHJvY2Vzc2luZy5QaXBlQ29ubmVjdGlvbihoYW5kbGUpCiAKZGlmZiAtLWdpdCBhL0xpYi9tdWx0aXByb2Nlc3NpbmcvZHVtbXkvX19pbml0X18ucHkgYi9MaWIvbXVsdGlwcm9jZXNzaW5nL2R1bW15L19faW5pdF9fLnB5CmluZGV4IDE5YTNiNjkuLmI3YWJkZTggMTAwNjQ0Ci0tLSBhL0xpYi9tdWx0aXByb2Nlc3NpbmcvZHVtbXkvX19pbml0X18ucHkKKysrIGIvTGliL211bHRpcHJvY2Vzc2luZy9kdW1teS9fX2luaXRfXy5weQpAQCAtNzAsNyArNzAsOCBAQAogICAgIGRlZiBzdGFydChzZWxmKToKICAgICAgICAgYXNzZXJ0IHNlbGYuX3BhcmVudCBpcyBjdXJyZW50X3Byb2Nlc3MoKQogICAgICAgICBzZWxmLl9zdGFydF9jYWxsZWQgPSBUcnVlCi0gICAgICAgIHNlbGYuX3BhcmVudC5fY2hpbGRyZW5bc2VsZl0gPSBOb25lCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5fcGFyZW50LCAnX2NoaWxkcmVuJyk6CisgICAgICAgICAgICBzZWxmLl9wYXJlbnQuX2NoaWxkcmVuW3NlbGZdID0gTm9uZQogICAgICAgICB0aHJlYWRpbmcuVGhyZWFkLnN0YXJ0KHNlbGYpCiAKICAgICBAcHJvcGVydHkKQEAgLTEzNyw3ICsxMzgsNyBAQAogICAgICAgICBzZWxmLl92YWx1ZSA9IHZhbHVlCiAgICAgdmFsdWUgPSBwcm9wZXJ0eShfZ2V0LCBfc2V0KQogICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuICc8JXIoJXIsICVyKT4nJSh0eXBlKHNlbGYpLl9fbmFtZV9fLHNlbGYuX3R5cGVjb2RlLHNlbGYuX3ZhbHVlKQorICAgICAgICByZXR1cm4gJzwlcyglciwgJXIpPiclKHR5cGUoc2VsZikuX19uYW1lX18sc2VsZi5fdHlwZWNvZGUsc2VsZi5fdmFsdWUpCiAKIGRlZiBNYW5hZ2VyKCk6CiAgICAgcmV0dXJuIHN5cy5tb2R1bGVzW19fbmFtZV9fXQpkaWZmIC0tZ2l0IGEvTGliL211bHRpcHJvY2Vzc2luZy9mb3JraW5nLnB5IGIvTGliL211bHRpcHJvY2Vzc2luZy9mb3JraW5nLnB5CmluZGV4IDNmY2E4YjEuLjZiZGRmYjcgMTAwNjQ0Ci0tLSBhL0xpYi9tdWx0aXByb2Nlc3NpbmcvZm9ya2luZy5weQorKysgYi9MaWIvbXVsdGlwcm9jZXNzaW5nL2ZvcmtpbmcucHkKQEAgLTM1LDYgKzM1LDcgQEAKIGltcG9ydCBvcwogaW1wb3J0IHN5cwogaW1wb3J0IHNpZ25hbAoraW1wb3J0IGVycm5vCiAKIGZyb20gbXVsdGlwcm9jZXNzaW5nIGltcG9ydCB1dGlsLCBwcm9jZXNzCiAKQEAgLTEyOSwxMiArMTMwLDE3IEBACiAKICAgICAgICAgZGVmIHBvbGwoc2VsZiwgZmxhZz1vcy5XTk9IQU5HKToKICAgICAgICAgICAgIGlmIHNlbGYucmV0dXJuY29kZSBpcyBOb25lOgotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgcGlkLCBzdHMgPSBvcy53YWl0cGlkKHNlbGYucGlkLCBmbGFnKQotICAgICAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgIyBDaGlsZCBwcm9jZXNzIG5vdCB5ZXQgY3JlYXRlZC4gU2VlICMxNzMxNzE3Ci0gICAgICAgICAgICAgICAgICAgICMgZS5lcnJubyA9PSBlcnJuby5FQ0hJTEQgPT0gMTAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBwaWQsIHN0cyA9IG9zLndhaXRwaWQoc2VsZi5waWQsIGZsYWcpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FSU5UUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBDaGlsZCBwcm9jZXNzIG5vdCB5ZXQgY3JlYXRlZC4gU2VlICMxNzMxNzE3CisgICAgICAgICAgICAgICAgICAgICAgICAjIGUuZXJybm8gPT0gZXJybm8uRUNISUxEID09IDEwCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICBpZiBwaWQgPT0gc2VsZi5waWQ6CiAgICAgICAgICAgICAgICAgICAgIGlmIG9zLldJRlNJR05BTEVEKHN0cyk6CiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJldHVybmNvZGUgPSAtb3MuV1RFUk1TSUcoc3RzKQpAQCAtMzM2LDcgKzM0Miw3IEBACiAgICAgICAgICcnJwogICAgICAgICBSZXR1cm5zIHByZWZpeCBvZiBjb21tYW5kIGxpbmUgdXNlZCBmb3Igc3Bhd25pbmcgYSBjaGlsZCBwcm9jZXNzCiAgICAgICAgICcnJwotICAgICAgICBpZiBwcm9jZXNzLmN1cnJlbnRfcHJvY2VzcygpLl9pZGVudGl0eT09KCkgYW5kIGlzX2Zvcmtpbmcoc3lzLmFyZ3YpOgorICAgICAgICBpZiBnZXRhdHRyKHByb2Nlc3MuY3VycmVudF9wcm9jZXNzKCksICdfaW5oZXJpdGluZycsIEZhbHNlKToKICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignJycKICAgICAgICAgICAgIEF0dGVtcHQgdG8gc3RhcnQgYSBuZXcgcHJvY2VzcyBiZWZvcmUgdGhlIGN1cnJlbnQgcHJvY2VzcwogICAgICAgICAgICAgaGFzIGZpbmlzaGVkIGl0cyBib290c3RyYXBwaW5nIHBoYXNlLgpAQCAtMzU1LDEyICszNjEsMTMgQEAKICAgICAgICAgICAgIHJldHVybiBbc3lzLmV4ZWN1dGFibGUsICctLW11bHRpcHJvY2Vzc2luZy1mb3JrJ10KICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHByb2cgPSAnZnJvbSBtdWx0aXByb2Nlc3NpbmcuZm9ya2luZyBpbXBvcnQgbWFpbjsgbWFpbigpJwotICAgICAgICAgICAgcmV0dXJuIFtfcHl0aG9uX2V4ZSwgJy1jJywgcHJvZywgJy0tbXVsdGlwcm9jZXNzaW5nLWZvcmsnXQorICAgICAgICAgICAgb3B0cyA9IHV0aWwuX2FyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpCisgICAgICAgICAgICByZXR1cm4gW19weXRob25fZXhlXSArIG9wdHMgKyBbJy1jJywgcHJvZywgJy0tbXVsdGlwcm9jZXNzaW5nLWZvcmsnXQogCiAKICAgICBkZWYgbWFpbigpOgogICAgICAgICAnJycKLSAgICAgICAgUnVuIGNvZGUgc3BlY2lmZWQgYnkgZGF0YSByZWNlaXZlZCBvdmVyIHBpcGUKKyAgICAgICAgUnVuIGNvZGUgc3BlY2lmaWVkIGJ5IGRhdGEgcmVjZWl2ZWQgb3ZlciBwaXBlCiAgICAgICAgICcnJwogICAgICAgICBhc3NlcnQgaXNfZm9ya2luZyhzeXMuYXJndikKIApkaWZmIC0tZ2l0IGEvTGliL211bHRpcHJvY2Vzc2luZy9tYW5hZ2Vycy5weSBiL0xpYi9tdWx0aXByb2Nlc3NpbmcvbWFuYWdlcnMucHkKaW5kZXggNzg1MThmZC4uMDhkMzVkOCAxMDA2NDQKLS0tIGEvTGliL211bHRpcHJvY2Vzc2luZy9tYW5hZ2Vycy5weQorKysgYi9MaWIvbXVsdGlwcm9jZXNzaW5nL21hbmFnZXJzLnB5CkBAIC0xNTksNyArMTU5LDcgQEAKICAgICAgICAgTGlzdGVuZXIsIENsaWVudCA9IGxpc3RlbmVyX2NsaWVudFtzZXJpYWxpemVyXQogCiAgICAgICAgICMgZG8gYXV0aGVudGljYXRpb24gbGF0ZXIKLSAgICAgICAgc2VsZi5saXN0ZW5lciA9IExpc3RlbmVyKGFkZHJlc3M9YWRkcmVzcywgYmFja2xvZz01KQorICAgICAgICBzZWxmLmxpc3RlbmVyID0gTGlzdGVuZXIoYWRkcmVzcz1hZGRyZXNzLCBiYWNrbG9nPTE2KQogICAgICAgICBzZWxmLmFkZHJlc3MgPSBzZWxmLmxpc3RlbmVyLmFkZHJlc3MKIAogICAgICAgICBzZWxmLmlkX3RvX29iaiA9IHsnMCc6IChOb25lLCAoKSl9CkBAIC03NjMsNiArNzYzLDcgQEAKICAgICAgICAgZWxpZiBraW5kID09ICcjUFJPWFknOgogICAgICAgICAgICAgZXhwb3NlZCwgdG9rZW4gPSByZXN1bHQKICAgICAgICAgICAgIHByb3h5dHlwZSA9IHNlbGYuX21hbmFnZXIuX3JlZ2lzdHJ5W3Rva2VuLnR5cGVpZF1bLTFdCisgICAgICAgICAgICB0b2tlbi5hZGRyZXNzID0gc2VsZi5fdG9rZW4uYWRkcmVzcwogICAgICAgICAgICAgcHJveHkgPSBwcm94eXR5cGUoCiAgICAgICAgICAgICAgICAgdG9rZW4sIHNlbGYuX3NlcmlhbGl6ZXIsIG1hbmFnZXI9c2VsZi5fbWFuYWdlciwKICAgICAgICAgICAgICAgICBhdXRoa2V5PXNlbGYuX2F1dGhrZXksIGV4cG9zZWQ9ZXhwb3NlZApkaWZmIC0tZ2l0IGEvTGliL211bHRpcHJvY2Vzc2luZy9wb29sLnB5IGIvTGliL211bHRpcHJvY2Vzc2luZy9wb29sLnB5CmluZGV4IGJjYmY3ZTMuLjA0NTMxYjkgMTAwNjQ0Ci0tLSBhL0xpYi9tdWx0aXByb2Nlc3NpbmcvcG9vbC5weQorKysgYi9MaWIvbXVsdGlwcm9jZXNzaW5nL3Bvb2wucHkKQEAgLTY4LDYgKzY4LDIzIEBACiAjIENvZGUgcnVuIGJ5IHdvcmtlciBwcm9jZXNzZXMKICMKIAorY2xhc3MgTWF5YmVFbmNvZGluZ0Vycm9yKEV4Y2VwdGlvbik6CisgICAgIiIiV3JhcHMgcG9zc2libGUgdW5waWNrbGVhYmxlIGVycm9ycywgc28gdGhleSBjYW4gYmUKKyAgICBzYWZlbHkgc2VudCB0aHJvdWdoIHRoZSBzb2NrZXQuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhjLCB2YWx1ZSk6CisgICAgICAgIHNlbGYuZXhjID0gcmVwcihleGMpCisgICAgICAgIHNlbGYudmFsdWUgPSByZXByKHZhbHVlKQorICAgICAgICBzdXBlcihNYXliZUVuY29kaW5nRXJyb3IsIHNlbGYpLl9faW5pdF9fKHNlbGYuZXhjLCBzZWxmLnZhbHVlKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAiRXJyb3Igc2VuZGluZyByZXN1bHQ6ICclcycuIFJlYXNvbjogJyVzJyIgJSAoc2VsZi52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmV4YykKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICI8TWF5YmVFbmNvZGluZ0Vycm9yOiAlcz4iICUgc3RyKHNlbGYpCisKKwogZGVmIHdvcmtlcihpbnF1ZXVlLCBvdXRxdWV1ZSwgaW5pdGlhbGl6ZXI9Tm9uZSwgaW5pdGFyZ3M9KCksIG1heHRhc2tzPU5vbmUpOgogICAgIGFzc2VydCBtYXh0YXNrcyBpcyBOb25lIG9yICh0eXBlKG1heHRhc2tzKSA9PSBpbnQgYW5kIG1heHRhc2tzID4gMCkKICAgICBwdXQgPSBvdXRxdWV1ZS5wdXQKQEAgLTk2LDcgKzExMywxMyBAQAogICAgICAgICAgICAgcmVzdWx0ID0gKFRydWUsIGZ1bmMoKmFyZ3MsICoqa3dkcykpCiAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CiAgICAgICAgICAgICByZXN1bHQgPSAoRmFsc2UsIGUpCi0gICAgICAgIHB1dCgoam9iLCBpLCByZXN1bHQpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwdXQoKGpvYiwgaSwgcmVzdWx0KSkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgd3JhcHBlZCA9IE1heWJlRW5jb2RpbmdFcnJvcihlLCByZXN1bHRbMV0pCisgICAgICAgICAgICBkZWJ1ZygiUG9zc2libGUgZW5jb2RpbmcgZXJyb3Igd2hpbGUgc2VuZGluZyByZXN1bHQ6ICVzIiAlICgKKyAgICAgICAgICAgICAgICB3cmFwcGVkKSkKKyAgICAgICAgICAgIHB1dCgoam9iLCBpLCAoRmFsc2UsIHdyYXBwZWQpKSkKICAgICAgICAgY29tcGxldGVkICs9IDEKICAgICBkZWJ1Zygnd29ya2VyIGV4aXRpbmcgYWZ0ZXIgJWQgdGFza3MnICUgY29tcGxldGVkKQogCkBAIC0xNDYsNyArMTY5LDggQEAKIAogICAgICAgICBzZWxmLl90YXNrX2hhbmRsZXIgPSB0aHJlYWRpbmcuVGhyZWFkKAogICAgICAgICAgICAgdGFyZ2V0PVBvb2wuX2hhbmRsZV90YXNrcywKLSAgICAgICAgICAgIGFyZ3M9KHNlbGYuX3Rhc2txdWV1ZSwgc2VsZi5fcXVpY2tfcHV0LCBzZWxmLl9vdXRxdWV1ZSwgc2VsZi5fcG9vbCkKKyAgICAgICAgICAgIGFyZ3M9KHNlbGYuX3Rhc2txdWV1ZSwgc2VsZi5fcXVpY2tfcHV0LCBzZWxmLl9vdXRxdWV1ZSwKKyAgICAgICAgICAgICAgICAgIHNlbGYuX3Bvb2wsIHNlbGYuX2NhY2hlKQogICAgICAgICAgICAgKQogICAgICAgICBzZWxmLl90YXNrX2hhbmRsZXIuZGFlbW9uID0gVHJ1ZQogICAgICAgICBzZWxmLl90YXNrX2hhbmRsZXIuX3N0YXRlID0gUlVOCkBAIC0zMDYsNyArMzMwLDcgQEAKICAgICAgICAgZGVidWcoJ3dvcmtlciBoYW5kbGVyIGV4aXRpbmcnKQogCiAgICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBfaGFuZGxlX3Rhc2tzKHRhc2txdWV1ZSwgcHV0LCBvdXRxdWV1ZSwgcG9vbCk6CisgICAgZGVmIF9oYW5kbGVfdGFza3ModGFza3F1ZXVlLCBwdXQsIG91dHF1ZXVlLCBwb29sLCBjYWNoZSk6CiAgICAgICAgIHRocmVhZCA9IHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpCiAKICAgICAgICAgZm9yIHRhc2tzZXEsIHNldF9sZW5ndGggaW4gaXRlcih0YXNrcXVldWUuZ2V0LCBOb25lKToKQEAgLTMxNyw5ICszNDEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgIHB1dCh0YXNrKQotICAgICAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgotICAgICAgICAgICAgICAgICAgICBkZWJ1ZygnY291bGQgbm90IHB1dCB0YXNrIG9uIHF1ZXVlJykKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgICAgIGpvYiwgaW5kID0gdGFza1s6Ml0KKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVbam9iXS5fc2V0KGluZCwgKEZhbHNlLCBlKSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBpZiBzZXRfbGVuZ3RoOgogICAgICAgICAgICAgICAgICAgICBkZWJ1ZygnZG9pbmcgc2V0X2xlbmd0aCgpJykKQEAgLTQ2Niw3ICs0OTMsOCBAQAogICAgICAgICAjIFdlIG11c3Qgd2FpdCBmb3IgdGhlIHdvcmtlciBoYW5kbGVyIHRvIGV4aXQgYmVmb3JlIHRlcm1pbmF0aW5nCiAgICAgICAgICMgd29ya2VycyBiZWNhdXNlIHdlIGRvbid0IHdhbnQgd29ya2VycyB0byBiZSByZXN0YXJ0ZWQgYmVoaW5kIG91ciBiYWNrLgogICAgICAgICBkZWJ1Zygnam9pbmluZyB3b3JrZXIgaGFuZGxlcicpCi0gICAgICAgIHdvcmtlcl9oYW5kbGVyLmpvaW4oKQorICAgICAgICBpZiB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKSBpcyBub3Qgd29ya2VyX2hhbmRsZXI6CisgICAgICAgICAgICB3b3JrZXJfaGFuZGxlci5qb2luKDFlMTAwKQogCiAgICAgICAgICMgVGVybWluYXRlIHdvcmtlcnMgd2hpY2ggaGF2ZW4ndCBhbHJlYWR5IGZpbmlzaGVkLgogICAgICAgICBpZiBwb29sIGFuZCBoYXNhdHRyKHBvb2xbMF0sICd0ZXJtaW5hdGUnKToKQEAgLTQ3NiwxMCArNTA0LDEyIEBACiAgICAgICAgICAgICAgICAgICAgIHAudGVybWluYXRlKCkKIAogICAgICAgICBkZWJ1Zygnam9pbmluZyB0YXNrIGhhbmRsZXInKQotICAgICAgICB0YXNrX2hhbmRsZXIuam9pbigxZTEwMCkKKyAgICAgICAgaWYgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkgaXMgbm90IHRhc2tfaGFuZGxlcjoKKyAgICAgICAgICAgIHRhc2tfaGFuZGxlci5qb2luKDFlMTAwKQogCiAgICAgICAgIGRlYnVnKCdqb2luaW5nIHJlc3VsdCBoYW5kbGVyJykKLSAgICAgICAgcmVzdWx0X2hhbmRsZXIuam9pbigxZTEwMCkKKyAgICAgICAgaWYgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkgaXMgbm90IHJlc3VsdF9oYW5kbGVyOgorICAgICAgICAgICAgcmVzdWx0X2hhbmRsZXIuam9pbigxZTEwMCkKIAogICAgICAgICBpZiBwb29sIGFuZCBoYXNhdHRyKHBvb2xbMF0sICd0ZXJtaW5hdGUnKToKICAgICAgICAgICAgIGRlYnVnKCdqb2luaW5nIHBvb2wgd29ya2VycycpCkBAIC01MzksNiArNTY5LDggQEAKICAgICAgICAgICAgIHNlbGYuX2NvbmQucmVsZWFzZSgpCiAgICAgICAgIGRlbCBzZWxmLl9jYWNoZVtzZWxmLl9qb2JdCiAKK0FzeW5jUmVzdWx0ID0gQXBwbHlSZXN1bHQgICAgICAgIyBjcmVhdGUgYWxpYXMgLS0gc2VlICMxNzgwNQorCiAjCiAjIENsYXNzIHdob3NlIGluc3RhbmNlcyBhcmUgcmV0dXJuZWQgYnkgYFBvb2wubWFwX2FzeW5jKClgCiAjCkBAIC01NTMsNiArNTg1LDcgQEAKICAgICAgICAgaWYgY2h1bmtzaXplIDw9IDA6CiAgICAgICAgICAgICBzZWxmLl9udW1iZXJfbGVmdCA9IDAKICAgICAgICAgICAgIHNlbGYuX3JlYWR5ID0gVHJ1ZQorICAgICAgICAgICAgZGVsIGNhY2hlW3NlbGYuX2pvYl0KICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuX251bWJlcl9sZWZ0ID0gbGVuZ3RoLy9jaHVua3NpemUgKyBib29sKGxlbmd0aCAlIGNodW5rc2l6ZSkKIApkaWZmIC0tZ2l0IGEvTGliL211bHRpcHJvY2Vzc2luZy9wcm9jZXNzLnB5IGIvTGliL211bHRpcHJvY2Vzc2luZy9wcm9jZXNzLnB5CmluZGV4IDA2OTdlNzQuLjQ0YzFlNDQgMTAwNjQ0Ci0tLSBhL0xpYi9tdWx0aXByb2Nlc3NpbmcvcHJvY2Vzcy5weQorKysgYi9MaWIvbXVsdGlwcm9jZXNzaW5nL3Byb2Nlc3MucHkKQEAgLTI2MiwxMCArMjYyLDEwIEBACiAgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0LCBlOgogICAgICAgICAgICAgaWYgbm90IGUuYXJnczoKICAgICAgICAgICAgICAgICBleGl0Y29kZSA9IDEKLSAgICAgICAgICAgIGVsaWYgdHlwZShlLmFyZ3NbMF0pIGlzIGludDoKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShlLmFyZ3NbMF0sIGludCk6CiAgICAgICAgICAgICAgICAgZXhpdGNvZGUgPSBlLmFyZ3NbMF0KICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZShlLmFyZ3NbMF0gKyAnXG4nKQorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoc3RyKGUuYXJnc1swXSkgKyAnXG4nKQogICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQogICAgICAgICAgICAgICAgIGV4aXRjb2RlID0gMQogICAgICAgICBleGNlcHQ6CmRpZmYgLS1naXQgYS9MaWIvbXVsdGlwcm9jZXNzaW5nL3N5bmNocm9uaXplLnB5IGIvTGliL211bHRpcHJvY2Vzc2luZy9zeW5jaHJvbml6ZS5weQppbmRleCA0YjA3N2U1Li5kODQ1ZjcyIDEwMDY0NAotLS0gYS9MaWIvbXVsdGlwcm9jZXNzaW5nL3N5bmNocm9uaXplLnB5CisrKyBiL0xpYi9tdWx0aXByb2Nlc3Npbmcvc3luY2hyb25pemUucHkKQEAgLTIyNiw3ICsyMjYsNyBAQAogICAgICAgICAgICAgbnVtX3dhaXRlcnMgPSAoc2VsZi5fc2xlZXBpbmdfY291bnQuX3NlbWxvY2suX2dldF92YWx1ZSgpIC0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3dva2VuX2NvdW50Ll9zZW1sb2NrLl9nZXRfdmFsdWUoKSkKICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKLSAgICAgICAgICAgIG51bV93YWl0ZXJzID0gJ3Vua293bicKKyAgICAgICAgICAgIG51bV93YWl0ZXJzID0gJ3Vua25vd24nCiAgICAgICAgIHJldHVybiAnPENvbmRpdGlvbiglcywgJXMpPicgJSAoc2VsZi5fbG9jaywgbnVtX3dhaXRlcnMpCiAKICAgICBkZWYgd2FpdChzZWxmLCB0aW1lb3V0PU5vbmUpOgpkaWZmIC0tZ2l0IGEvTGliL211bHRpcHJvY2Vzc2luZy91dGlsLnB5IGIvTGliL211bHRpcHJvY2Vzc2luZy91dGlsLnB5CmluZGV4IGM2NWRkOTkuLjA5MmI2MWMgMTAwNjQ0Ci0tLSBhL0xpYi9tdWx0aXByb2Nlc3NpbmcvdXRpbC5weQorKysgYi9MaWIvbXVsdGlwcm9jZXNzaW5nL3V0aWwucHkKQEAgLTMyLDExICszMiwxMyBAQAogIyBTVUNIIERBTUFHRS4KICMKIAoraW1wb3J0IG9zCiBpbXBvcnQgaXRlcnRvb2xzCiBpbXBvcnQgd2Vha3JlZgogaW1wb3J0IGF0ZXhpdAogaW1wb3J0IHRocmVhZGluZyAgICAgICAgIyB3ZSB3YW50IHRocmVhZGluZyB0byBpbnN0YWxsIGl0J3MKICAgICAgICAgICAgICAgICAgICAgICAgICMgY2xlYW51cCBmdW5jdGlvbiBiZWZvcmUgbXVsdGlwcm9jZXNzaW5nIGRvZXMKK2Zyb20gc3VicHJvY2VzcyBpbXBvcnQgX2FyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncwogCiBmcm9tIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzIGltcG9ydCBjdXJyZW50X3Byb2Nlc3MsIGFjdGl2ZV9jaGlsZHJlbgogCkBAIC0xODMsNiArMTg1LDcgQEAKICAgICAgICAgc2VsZi5fYXJncyA9IGFyZ3MKICAgICAgICAgc2VsZi5fa3dhcmdzID0ga3dhcmdzIG9yIHt9CiAgICAgICAgIHNlbGYuX2tleSA9IChleGl0cHJpb3JpdHksIF9maW5hbGl6ZXJfY291bnRlci5uZXh0KCkpCisgICAgICAgIHNlbGYuX3BpZCA9IG9zLmdldHBpZCgpCiAKICAgICAgICAgX2ZpbmFsaXplcl9yZWdpc3RyeVtzZWxmLl9rZXldID0gc2VsZgogCkBAIC0xOTUsOSArMTk4LDEzIEBACiAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgIHN1Yl9kZWJ1ZygnZmluYWxpemVyIG5vIGxvbmdlciByZWdpc3RlcmVkJykKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHN1Yl9kZWJ1ZygnZmluYWxpemVyIGNhbGxpbmcgJXMgd2l0aCBhcmdzICVzIGFuZCBrd2FyZ3MgJXMnLAotICAgICAgICAgICAgICAgICAgICAgc2VsZi5fY2FsbGJhY2ssIHNlbGYuX2FyZ3MsIHNlbGYuX2t3YXJncykKLSAgICAgICAgICAgIHJlcyA9IHNlbGYuX2NhbGxiYWNrKCpzZWxmLl9hcmdzLCAqKnNlbGYuX2t3YXJncykKKyAgICAgICAgICAgIGlmIHNlbGYuX3BpZCAhPSBvcy5nZXRwaWQoKToKKyAgICAgICAgICAgICAgICBzdWJfZGVidWcoJ2ZpbmFsaXplciBpZ25vcmVkIGJlY2F1c2UgZGlmZmVyZW50IHByb2Nlc3MnKQorICAgICAgICAgICAgICAgIHJlcyA9IE5vbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3ViX2RlYnVnKCdmaW5hbGl6ZXIgY2FsbGluZyAlcyB3aXRoIGFyZ3MgJXMgYW5kIGt3YXJncyAlcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NhbGxiYWNrLCBzZWxmLl9hcmdzLCBzZWxmLl9rd2FyZ3MpCisgICAgICAgICAgICAgICAgcmVzID0gc2VsZi5fY2FsbGJhY2soKnNlbGYuX2FyZ3MsICoqc2VsZi5fa3dhcmdzKQogICAgICAgICAgICAgc2VsZi5fd2Vha3JlZiA9IHNlbGYuX2NhbGxiYWNrID0gc2VsZi5fYXJncyA9IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9rd2FyZ3MgPSBzZWxmLl9rZXkgPSBOb25lCiAgICAgICAgICAgICByZXR1cm4gcmVzCkBAIC0yNDcsNiArMjU0LDEyIEBACiAgICAgRmluYWxpemVycyB3aXRoIGhpZ2hlc3QgcHJpb3JpdHkgYXJlIGNhbGxlZCBmaXJzdDsgZmluYWxpemVycyB3aXRoCiAgICAgdGhlIHNhbWUgcHJpb3JpdHkgd2lsbCBiZSBjYWxsZWQgaW4gcmV2ZXJzZSBvcmRlciBvZiBjcmVhdGlvbi4KICAgICAnJycKKyAgICBpZiBfZmluYWxpemVyX3JlZ2lzdHJ5IGlzIE5vbmU6CisgICAgICAgICMgVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGFmdGVyIHRoaXMgbW9kdWxlJ3MgZ2xvYmFscyBhcmUKKyAgICAgICAgIyBkZXN0cm95ZWQuICBTZWUgdGhlIF9leGl0X2Z1bmN0aW9uIGZ1bmN0aW9uIGluIHRoaXMgbW9kdWxlIGZvciBtb3JlCisgICAgICAgICMgbm90ZXMuCisgICAgICAgIHJldHVybgorCiAgICAgaWYgbWlucHJpb3JpdHkgaXMgTm9uZToKICAgICAgICAgZiA9IGxhbWJkYSBwIDogcFswXVswXSBpcyBub3QgTm9uZQogICAgIGVsc2U6CkBAIC0yNzgsMjEgKzI5MSwzOCBAQAogCiBfZXhpdGluZyA9IEZhbHNlCiAKLWRlZiBfZXhpdF9mdW5jdGlvbigpOgorZGVmIF9leGl0X2Z1bmN0aW9uKGluZm89aW5mbywgZGVidWc9ZGVidWcsIF9ydW5fZmluYWxpemVycz1fcnVuX2ZpbmFsaXplcnMsCisgICAgICAgICAgICAgICAgICAgYWN0aXZlX2NoaWxkcmVuPWFjdGl2ZV9jaGlsZHJlbiwKKyAgICAgICAgICAgICAgICAgICBjdXJyZW50X3Byb2Nlc3M9Y3VycmVudF9wcm9jZXNzKToKKyAgICAjIE5COiB3ZSBob2xkIG9uIHRvIHJlZmVyZW5jZXMgdG8gZnVuY3Rpb25zIGluIHRoZSBhcmdsaXN0IGR1ZSB0byB0aGUKKyAgICAjIHNpdHVhdGlvbiBkZXNjcmliZWQgYmVsb3csIHdoZXJlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoaXMKKyAgICAjIG1vZHVsZSdzIGdsb2JhbHMgYXJlIGRlc3Ryb3llZC4KKwogICAgIGdsb2JhbCBfZXhpdGluZwogCiAgICAgaW5mbygncHJvY2VzcyBzaHV0dGluZyBkb3duJykKICAgICBkZWJ1ZygncnVubmluZyBhbGwgImF0ZXhpdCIgZmluYWxpemVycyB3aXRoIHByaW9yaXR5ID49IDAnKQogICAgIF9ydW5fZmluYWxpemVycygwKQogCi0gICAgZm9yIHAgaW4gYWN0aXZlX2NoaWxkcmVuKCk6Ci0gICAgICAgIGlmIHAuX2RhZW1vbmljOgotICAgICAgICAgICAgaW5mbygnY2FsbGluZyB0ZXJtaW5hdGUoKSBmb3IgZGFlbW9uICVzJywgcC5uYW1lKQotICAgICAgICAgICAgcC5fcG9wZW4udGVybWluYXRlKCkKKyAgICBpZiBjdXJyZW50X3Byb2Nlc3MoKSBpcyBub3QgTm9uZToKKyAgICAgICAgIyBOQjogd2UgY2hlY2sgaWYgdGhlIGN1cnJlbnQgcHJvY2VzcyBpcyBOb25lIGhlcmUgYmVjYXVzZSBpZgorICAgICAgICAjIGl0J3MgTm9uZSwgYW55IGNhbGwgdG8gYGBhY3RpdmVfY2hpbGRyZW4oKWBgIHdpbGwgdGhyb3cgYW4KKyAgICAgICAgIyBBdHRyaWJ1dGVFcnJvciAoYWN0aXZlX2NoaWxkcmVuIHdpbmRzIHVwIHRyeWluZyB0byBnZXQKKyAgICAgICAgIyBhdHRyaWJ1dGVzIGZyb20gdXRpbC5fY3VycmVudF9wcm9jZXNzKS4gIFRoaXMgaGFwcGVucyBpbiBhCisgICAgICAgICMgdmFyaWV0eSBvZiBzaHV0ZG93biBjaXJjdW1zdGFuY2VzIHRoYXQgYXJlIG5vdCB3ZWxsLXVuZGVyc3Rvb2QKKyAgICAgICAgIyBiZWNhdXNlIG1vZHVsZS1zY29wZSB2YXJpYWJsZXMgYXJlIG5vdCBhcHBhcmVudGx5IHN1cHBvc2VkIHRvCisgICAgICAgICMgYmUgZGVzdHJveWVkIHVudGlsIGFmdGVyIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiAgSG93ZXZlciwKKyAgICAgICAgIyB0aGV5IGFyZSBpbmRlZWQgZGVzdHJveWVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4gIFNlZQorICAgICAgICAjIGlzc3VlcyA5Nzc1IGFuZCAxNTg4MS4gIEFsc28gcmVsYXRlZDogNDEwNiwgOTIwNSwgYW5kIDkyMDcuCiAKLSAgICBmb3IgcCBpbiBhY3RpdmVfY2hpbGRyZW4oKToKLSAgICAgICAgaW5mbygnY2FsbGluZyBqb2luKCkgZm9yIHByb2Nlc3MgJXMnLCBwLm5hbWUpCi0gICAgICAgIHAuam9pbigpCisgICAgICAgIGZvciBwIGluIGFjdGl2ZV9jaGlsZHJlbigpOgorICAgICAgICAgICAgaWYgcC5fZGFlbW9uaWM6CisgICAgICAgICAgICAgICAgaW5mbygnY2FsbGluZyB0ZXJtaW5hdGUoKSBmb3IgZGFlbW9uICVzJywgcC5uYW1lKQorICAgICAgICAgICAgICAgIHAuX3BvcGVuLnRlcm1pbmF0ZSgpCisKKyAgICAgICAgZm9yIHAgaW4gYWN0aXZlX2NoaWxkcmVuKCk6CisgICAgICAgICAgICBpbmZvKCdjYWxsaW5nIGpvaW4oKSBmb3IgcHJvY2VzcyAlcycsIHAubmFtZSkKKyAgICAgICAgICAgIHAuam9pbigpCiAKICAgICBkZWJ1ZygncnVubmluZyB0aGUgcmVtYWluaW5nICJhdGV4aXQiIGZpbmFsaXplcnMnKQogICAgIF9ydW5fZmluYWxpemVycygpCkBAIC0zMDUsMTAgKzMzNSwxMyBAQAogCiBjbGFzcyBGb3JrQXdhcmVUaHJlYWRMb2NrKG9iamVjdCk6CiAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9yZXNldCgpCisgICAgICAgIHJlZ2lzdGVyX2FmdGVyX2Zvcmsoc2VsZiwgRm9ya0F3YXJlVGhyZWFkTG9jay5fcmVzZXQpCisKKyAgICBkZWYgX3Jlc2V0KHNlbGYpOgogICAgICAgICBzZWxmLl9sb2NrID0gdGhyZWFkaW5nLkxvY2soKQogICAgICAgICBzZWxmLmFjcXVpcmUgPSBzZWxmLl9sb2NrLmFjcXVpcmUKICAgICAgICAgc2VsZi5yZWxlYXNlID0gc2VsZi5fbG9jay5yZWxlYXNlCi0gICAgICAgIHJlZ2lzdGVyX2FmdGVyX2Zvcmsoc2VsZiwgRm9ya0F3YXJlVGhyZWFkTG9jay5fX2luaXRfXykKIAogY2xhc3MgRm9ya0F3YXJlTG9jYWwodGhyZWFkaW5nLmxvY2FsKToKICAgICBkZWYgX19pbml0X18oc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvbmV0cmMucHkgYi9MaWIvbmV0cmMucHkKaW5kZXggMGZkMzdlMy4uNGIxODk3MyAxMDA2NDQKLS0tIGEvTGliL25ldHJjLnB5CisrKyBiL0xpYi9uZXRyYy5weQpAQCAtMiw3ICsyLDkgQEAKIAogIyBNb2R1bGUgYW5kIGRvY3VtZW50YXRpb24gYnkgRXJpYyBTLiBSYXltb25kLCAyMSBEZWMgMTk5OAogCi1pbXBvcnQgb3MsIHNobGV4CitpbXBvcnQgb3MsIHN0YXQsIHNobGV4CitpZiBvcy5uYW1lID09ICdwb3NpeCc6CisgICAgaW1wb3J0IHB3ZAogCiBfX2FsbF9fID0gWyJuZXRyYyIsICJOZXRyY1BhcnNlRXJyb3IiXQogCkBAIC0yMSw2ICsyMyw3IEBACiAKIGNsYXNzIG5ldHJjOgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlPU5vbmUpOgorICAgICAgICBkZWZhdWx0X25ldHJjID0gZmlsZSBpcyBOb25lCiAgICAgICAgIGlmIGZpbGUgaXMgTm9uZToKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBmaWxlID0gb3MucGF0aC5qb2luKG9zLmVudmlyb25bJ0hPTUUnXSwgIi5uZXRyYyIpCkBAIC0yOSw5ICszMiw5IEBACiAgICAgICAgIHNlbGYuaG9zdHMgPSB7fQogICAgICAgICBzZWxmLm1hY3JvcyA9IHt9CiAgICAgICAgIHdpdGggb3BlbihmaWxlKSBhcyBmcDoKLSAgICAgICAgICAgIHNlbGYuX3BhcnNlKGZpbGUsIGZwKQorICAgICAgICAgICAgc2VsZi5fcGFyc2UoZmlsZSwgZnAsIGRlZmF1bHRfbmV0cmMpCiAKLSAgICBkZWYgX3BhcnNlKHNlbGYsIGZpbGUsIGZwKToKKyAgICBkZWYgX3BhcnNlKHNlbGYsIGZpbGUsIGZwLCBkZWZhdWx0X25ldHJjKToKICAgICAgICAgbGV4ZXIgPSBzaGxleC5zaGxleChmcCkKICAgICAgICAgbGV4ZXIud29yZGNoYXJzICs9IHIiIiIhIiMkJSYnKCkqKywtLi86Ozw9Pj9AW1xdXl9ge3x9fiIiIgogICAgICAgICBsZXhlci5jb21tZW50ZXJzID0gbGV4ZXIuY29tbWVudGVycy5yZXBsYWNlKCcjJywgJycpCkBAIC04OCw2ICs5MSwyNiBAQAogICAgICAgICAgICAgICAgIGVsaWYgdHQgPT0gJ2FjY291bnQnOgogICAgICAgICAgICAgICAgICAgICBhY2NvdW50ID0gbGV4ZXIuZ2V0X3Rva2VuKCkKICAgICAgICAgICAgICAgICBlbGlmIHR0ID09ICdwYXNzd29yZCc6CisgICAgICAgICAgICAgICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JyBhbmQgZGVmYXVsdF9uZXRyYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3AgPSBvcy5mc3RhdChmcC5maWxlbm8oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHByb3Auc3RfdWlkICE9IG9zLmdldHVpZCgpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm93bmVyID0gcHdkLmdldHB3dWlkKHByb3Auc3RfdWlkKVswXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm93bmVyID0gJ3VpZCAlcycgJSBwcm9wLnN0X3VpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlciA9IHB3ZC5nZXRwd3VpZChvcy5nZXR1aWQoKSlbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgPSAndWlkICVzJyAlIG9zLmdldHVpZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgTmV0cmNQYXJzZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIn4vLm5ldHJjIGZpbGUgb3duZXIgKCVzKSBkb2VzIG5vdCBtYXRjaCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgY3VycmVudCB1c2VyICglcykiKSAlIChmb3duZXIsIHVzZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLCBsZXhlci5saW5lbm8pCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcC5zdF9tb2RlICYgKHN0YXQuU19JUldYRyB8IHN0YXQuU19JUldYTykpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIE5ldHJjUGFyc2VFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifi8ubmV0cmMgYWNjZXNzIHRvbyBwZXJtaXNzaXZlOiBhY2Nlc3MiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBwZXJtaXNzaW9ucyBtdXN0IHJlc3RyaWN0IGFjY2VzcyB0byBvbmx5IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdGhlIG93bmVyIiwgZmlsZSwgbGV4ZXIubGluZW5vKQogICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCA9IGxleGVyLmdldF90b2tlbigpCiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgcmFpc2UgTmV0cmNQYXJzZUVycm9yKCJiYWQgZm9sbG93ZXIgdG9rZW4gJXIiICUgdHQsCmRpZmYgLS1naXQgYS9MaWIvbm50cGxpYi5weSBiL0xpYi9ubnRwbGliLnB5CmluZGV4IDJkYzgyYTkuLjgxZWJlNGIgMTAwNjQ0Ci0tLSBhL0xpYi9ubnRwbGliLnB5CisrKyBiL0xpYi9ubnRwbGliLnB5CkBAIC0zNyw2ICszNywxMyBAQAogICAgICAgICAgICAiZXJyb3JfcmVwbHkiLCJlcnJvcl90ZW1wIiwiZXJyb3JfcGVybSIsImVycm9yX3Byb3RvIiwKICAgICAgICAgICAgImVycm9yX2RhdGEiLF0KIAorIyBtYXhpbWFsIGxpbmUgbGVuZ3RoIHdoZW4gY2FsbGluZyByZWFkbGluZSgpLiBUaGlzIGlzIHRvIHByZXZlbnQKKyMgcmVhZGluZyBhcmJpdHJhcnkgbGVuZ3RoIGxpbmVzLiBSRkMgMzk3NyBsaW1pdHMgTk5UUCBsaW5lIGxlbmd0aCB0bworIyA1MTIgY2hhcmFjdGVycywgaW5jbHVkaW5nIENSTEYuIFdlIGhhdmUgc2VsZWN0ZWQgMjA0OCBqdXN0IHRvIGJlIG9uCisjIHRoZSBzYWZlIHNpZGUuCitfTUFYTElORSA9IDIwNDgKKworCiAjIEV4Y2VwdGlvbnMgcmFpc2VkIHdoZW4gYW4gZXJyb3Igb3IgaW52YWxpZCByZXNwb25zZSBpcyByZWNlaXZlZAogY2xhc3MgTk5UUEVycm9yKEV4Y2VwdGlvbik6CiAgICAgIiIiQmFzZSBjbGFzcyBmb3IgYWxsIG5udHBsaWIgZXhjZXB0aW9ucyIiIgpAQCAtMjAwLDcgKzIwNyw5IEBACiAgICAgZGVmIGdldGxpbmUoc2VsZik6CiAgICAgICAgICIiIkludGVybmFsOiByZXR1cm4gb25lIGxpbmUgZnJvbSB0aGUgc2VydmVyLCBzdHJpcHBpbmcgQ1JMRi4KICAgICAgICAgUmFpc2UgRU9GRXJyb3IgaWYgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLiIiIgotICAgICAgICBsaW5lID0gc2VsZi5maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgbGluZSA9IHNlbGYuZmlsZS5yZWFkbGluZShfTUFYTElORSArIDEpCisgICAgICAgIGlmIGxlbihsaW5lKSA+IF9NQVhMSU5FOgorICAgICAgICAgICAgcmFpc2UgTk5UUERhdGFFcnJvcignbGluZSB0b28gbG9uZycpCiAgICAgICAgIGlmIHNlbGYuZGVidWdnaW5nID4gMToKICAgICAgICAgICAgIHByaW50ICcqZ2V0KicsIHJlcHIobGluZSkKICAgICAgICAgaWYgbm90IGxpbmU6IHJhaXNlIEVPRkVycm9yCmRpZmYgLS1naXQgYS9MaWIvbnRwYXRoLnB5IGIvTGliL250cGF0aC5weQppbmRleCA0ZjhmNDIzLi4yMjhiYmIzIDEwMDY0NAotLS0gYS9MaWIvbnRwYXRoLnB5CisrKyBiL0xpYi9udHBhdGgucHkKQEAgLTU5LDczICs1OSw3OSBAQAogCiAKICMgSm9pbiB0d28gKG9yIG1vcmUpIHBhdGhzLgotCi1kZWYgam9pbihhLCAqcCk6Ci0gICAgIiIiSm9pbiB0d28gb3IgbW9yZSBwYXRobmFtZSBjb21wb25lbnRzLCBpbnNlcnRpbmcgIlxcIiBhcyBuZWVkZWQuCi0gICAgSWYgYW55IGNvbXBvbmVudCBpcyBhbiBhYnNvbHV0ZSBwYXRoLCBhbGwgcHJldmlvdXMgcGF0aCBjb21wb25lbnRzCi0gICAgd2lsbCBiZSBkaXNjYXJkZWQuIiIiCi0gICAgcGF0aCA9IGEKLSAgICBmb3IgYiBpbiBwOgotICAgICAgICBiX3dpbnMgPSAwICAjIHNldCB0byAxIGlmZiBiIG1ha2VzIHBhdGggaXJyZWxldmFudAotICAgICAgICBpZiBwYXRoID09ICIiOgotICAgICAgICAgICAgYl93aW5zID0gMQotCi0gICAgICAgIGVsaWYgaXNhYnMoYik6Ci0gICAgICAgICAgICAjIFRoaXMgcHJvYmFibHkgd2lwZXMgb3V0IHBhdGggc28gZmFyLiAgSG93ZXZlciwgaXQncyBtb3JlCi0gICAgICAgICAgICAjIGNvbXBsaWNhdGVkIGlmIHBhdGggYmVnaW5zIHdpdGggYSBkcml2ZSBsZXR0ZXI6Ci0gICAgICAgICAgICAjICAgICAxLiBqb2luKCdjOicsICcvYScpID09ICdjOi9hJwotICAgICAgICAgICAgIyAgICAgMi4gam9pbignYzovJywgJy9hJykgPT0gJ2M6L2EnCi0gICAgICAgICAgICAjIEJ1dAotICAgICAgICAgICAgIyAgICAgMy4gam9pbignYzovYScsICcvYicpID09ICcvYicKLSAgICAgICAgICAgICMgICAgIDQuIGpvaW4oJ2M6JywgJ2Q6LycpID0gJ2Q6LycKLSAgICAgICAgICAgICMgICAgIDUuIGpvaW4oJ2M6LycsICdkOi8nKSA9ICdkOi8nCi0gICAgICAgICAgICBpZiBwYXRoWzE6Ml0gIT0gIjoiIG9yIGJbMToyXSA9PSAiOiI6Ci0gICAgICAgICAgICAgICAgIyBQYXRoIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhIGRyaXZlIGxldHRlciwgb3IgY2FzZXMgNCBhbmQgNS4KLSAgICAgICAgICAgICAgICBiX3dpbnMgPSAxCi0KLSAgICAgICAgICAgICMgRWxzZSBwYXRoIGhhcyBhIGRyaXZlIGxldHRlciwgYW5kIGIgZG9lc24ndCBidXQgaXMgYWJzb2x1dGUuCi0gICAgICAgICAgICBlbGlmIGxlbihwYXRoKSA+IDMgb3IgKGxlbihwYXRoKSA9PSAzIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoWy0xXSBub3QgaW4gIi9cXCIpOgotICAgICAgICAgICAgICAgICMgY2FzZSAzCi0gICAgICAgICAgICAgICAgYl93aW5zID0gMQotCi0gICAgICAgIGlmIGJfd2luczoKLSAgICAgICAgICAgIHBhdGggPSBiCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAjIEpvaW4sIGFuZCBlbnN1cmUgdGhlcmUncyBhIHNlcGFyYXRvci4KLSAgICAgICAgICAgIGFzc2VydCBsZW4ocGF0aCkgPiAwCi0gICAgICAgICAgICBpZiBwYXRoWy0xXSBpbiAiL1xcIjoKLSAgICAgICAgICAgICAgICBpZiBiIGFuZCBiWzBdIGluICIvXFwiOgotICAgICAgICAgICAgICAgICAgICBwYXRoICs9IGJbMTpdCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgcGF0aCArPSBiCi0gICAgICAgICAgICBlbGlmIHBhdGhbLTFdID09ICI6IjoKLSAgICAgICAgICAgICAgICBwYXRoICs9IGIKLSAgICAgICAgICAgIGVsaWYgYjoKLSAgICAgICAgICAgICAgICBpZiBiWzBdIGluICIvXFwiOgotICAgICAgICAgICAgICAgICAgICBwYXRoICs9IGIKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBwYXRoICs9ICJcXCIgKyBiCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICMgcGF0aCBpcyBub3QgZW1wdHkgYW5kIGRvZXMgbm90IGVuZCB3aXRoIGEgYmFja3NsYXNoLAotICAgICAgICAgICAgICAgICMgYnV0IGIgaXMgZW1wdHk7IHNpbmNlLCBlLmcuLCBzcGxpdCgnYS8nKSBwcm9kdWNlcwotICAgICAgICAgICAgICAgICMgKCdhJywgJycpLCBpdCdzIGJlc3QgaWYgam9pbigpIGFkZHMgYSBiYWNrc2xhc2ggaW4KLSAgICAgICAgICAgICAgICAjIHRoaXMgY2FzZS4KLSAgICAgICAgICAgICAgICBwYXRoICs9ICdcXCcKLQotICAgIHJldHVybiBwYXRoCitkZWYgam9pbihwYXRoLCAqcGF0aHMpOgorICAgICIiIkpvaW4gdHdvIG9yIG1vcmUgcGF0aG5hbWUgY29tcG9uZW50cywgaW5zZXJ0aW5nICJcXCIgYXMgbmVlZGVkLiIiIgorICAgIHJlc3VsdF9kcml2ZSwgcmVzdWx0X3BhdGggPSBzcGxpdGRyaXZlKHBhdGgpCisgICAgZm9yIHAgaW4gcGF0aHM6CisgICAgICAgIHBfZHJpdmUsIHBfcGF0aCA9IHNwbGl0ZHJpdmUocCkKKyAgICAgICAgaWYgcF9wYXRoIGFuZCBwX3BhdGhbMF0gaW4gJ1xcLyc6CisgICAgICAgICAgICAjIFNlY29uZCBwYXRoIGlzIGFic29sdXRlCisgICAgICAgICAgICBpZiBwX2RyaXZlIG9yIG5vdCByZXN1bHRfZHJpdmU6CisgICAgICAgICAgICAgICAgcmVzdWx0X2RyaXZlID0gcF9kcml2ZQorICAgICAgICAgICAgcmVzdWx0X3BhdGggPSBwX3BhdGgKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGVsaWYgcF9kcml2ZSBhbmQgcF9kcml2ZSAhPSByZXN1bHRfZHJpdmU6CisgICAgICAgICAgICBpZiBwX2RyaXZlLmxvd2VyKCkgIT0gcmVzdWx0X2RyaXZlLmxvd2VyKCk6CisgICAgICAgICAgICAgICAgIyBEaWZmZXJlbnQgZHJpdmVzID0+IGlnbm9yZSB0aGUgZmlyc3QgcGF0aCBlbnRpcmVseQorICAgICAgICAgICAgICAgIHJlc3VsdF9kcml2ZSA9IHBfZHJpdmUKKyAgICAgICAgICAgICAgICByZXN1bHRfcGF0aCA9IHBfcGF0aAorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAjIFNhbWUgZHJpdmUgaW4gZGlmZmVyZW50IGNhc2UKKyAgICAgICAgICAgIHJlc3VsdF9kcml2ZSA9IHBfZHJpdmUKKyAgICAgICAgIyBTZWNvbmQgcGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgZmlyc3QKKyAgICAgICAgaWYgcmVzdWx0X3BhdGggYW5kIHJlc3VsdF9wYXRoWy0xXSBub3QgaW4gJ1xcLyc6CisgICAgICAgICAgICByZXN1bHRfcGF0aCA9IHJlc3VsdF9wYXRoICsgJ1xcJworICAgICAgICByZXN1bHRfcGF0aCA9IHJlc3VsdF9wYXRoICsgcF9wYXRoCisgICAgIyMgYWRkIHNlcGFyYXRvciBiZXR3ZWVuIFVOQyBhbmQgbm9uLWFic29sdXRlIHBhdGgKKyAgICBpZiAocmVzdWx0X3BhdGggYW5kIHJlc3VsdF9wYXRoWzBdIG5vdCBpbiAnXFwvJyBhbmQKKyAgICAgICAgcmVzdWx0X2RyaXZlIGFuZCByZXN1bHRfZHJpdmVbLTE6XSAhPSAnOicpOgorICAgICAgICByZXR1cm4gcmVzdWx0X2RyaXZlICsgc2VwICsgcmVzdWx0X3BhdGgKKyAgICByZXR1cm4gcmVzdWx0X2RyaXZlICsgcmVzdWx0X3BhdGgKIAogCiAjIFNwbGl0IGEgcGF0aCBpbiBhIGRyaXZlIHNwZWNpZmljYXRpb24gKGEgZHJpdmUgbGV0dGVyIGZvbGxvd2VkIGJ5IGEKICMgY29sb24pIGFuZCB0aGUgcGF0aCBzcGVjaWZpY2F0aW9uLgogIyBJdCBpcyBhbHdheXMgdHJ1ZSB0aGF0IGRyaXZlc3BlYyArIHBhdGhzcGVjID09IHAKIGRlZiBzcGxpdGRyaXZlKHApOgotICAgICIiIlNwbGl0IGEgcGF0aG5hbWUgaW50byBkcml2ZSBhbmQgcGF0aCBzcGVjaWZpZXJzLiBSZXR1cm5zIGEgMi10dXBsZQotIihkcml2ZSxwYXRoKSI7ICBlaXRoZXIgcGFydCBtYXkgYmUgZW1wdHkiIiIKLSAgICBpZiBwWzE6Ml0gPT0gJzonOgotICAgICAgICByZXR1cm4gcFswOjJdLCBwWzI6XQotICAgIHJldHVybiAnJywgcAorICAgICIiIlNwbGl0IGEgcGF0aG5hbWUgaW50byBkcml2ZS9VTkMgc2hhcmVwb2ludCBhbmQgcmVsYXRpdmUgcGF0aCBzcGVjaWZpZXJzLgorICAgIFJldHVybnMgYSAyLXR1cGxlIChkcml2ZV9vcl91bmMsIHBhdGgpOyBlaXRoZXIgcGFydCBtYXkgYmUgZW1wdHkuCiAKKyAgICBJZiB5b3UgYXNzaWduCisgICAgICAgIHJlc3VsdCA9IHNwbGl0ZHJpdmUocCkKKyAgICBJdCBpcyBhbHdheXMgdHJ1ZSB0aGF0OgorICAgICAgICByZXN1bHRbMF0gKyByZXN1bHRbMV0gPT0gcAorCisgICAgSWYgdGhlIHBhdGggY29udGFpbmVkIGEgZHJpdmUgbGV0dGVyLCBkcml2ZV9vcl91bmMgd2lsbCBjb250YWluIGV2ZXJ5dGhpbmcKKyAgICB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBjb2xvbi4gIGUuZy4gc3BsaXRkcml2ZSgiYzovZGlyIikgcmV0dXJucyAoImM6IiwgIi9kaXIiKQorCisgICAgSWYgdGhlIHBhdGggY29udGFpbmVkIGEgVU5DIHBhdGgsIHRoZSBkcml2ZV9vcl91bmMgd2lsbCBjb250YWluIHRoZSBob3N0IG5hbWUKKyAgICBhbmQgc2hhcmUgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgdGhlIGZvdXJ0aCBkaXJlY3Rvcnkgc2VwYXJhdG9yIGNoYXJhY3Rlci4KKyAgICBlLmcuIHNwbGl0ZHJpdmUoIi8vaG9zdC9jb21wdXRlci9kaXIiKSByZXR1cm5zICgiLy9ob3N0L2NvbXB1dGVyIiwgIi9kaXIiKQorCisgICAgUGF0aHMgY2Fubm90IGNvbnRhaW4gYm90aCBhIGRyaXZlIGxldHRlciBhbmQgYSBVTkMgcGF0aC4KKworICAgICIiIgorICAgIGlmIGxlbihwKSA+IDE6CisgICAgICAgIG5vcm1wID0gcC5yZXBsYWNlKGFsdHNlcCwgc2VwKQorICAgICAgICBpZiAobm9ybXBbMDoyXSA9PSBzZXAqMikgYW5kIChub3JtcFsyXSAhPSBzZXApOgorICAgICAgICAgICAgIyBpcyBhIFVOQyBwYXRoOgorICAgICAgICAgICAgIyB2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diBkcml2ZSBsZXR0ZXIgb3IgVU5DIHBhdGgKKyAgICAgICAgICAgICMgXFxtYWNoaW5lXG1vdW50cG9pbnRcZGlyZWN0b3J5XGV0Y1wuLi4KKyAgICAgICAgICAgICMgICAgICAgICAgIGRpcmVjdG9yeSBeXl5eXl5eXl5eXl5eXl4KKyAgICAgICAgICAgIGluZGV4ID0gbm9ybXAuZmluZChzZXAsIDIpCisgICAgICAgICAgICBpZiBpbmRleCA9PSAtMToKKyAgICAgICAgICAgICAgICByZXR1cm4gJycsIHAKKyAgICAgICAgICAgIGluZGV4MiA9IG5vcm1wLmZpbmQoc2VwLCBpbmRleCArIDEpCisgICAgICAgICAgICAjIGEgVU5DIHBhdGggY2FuJ3QgaGF2ZSB0d28gc2xhc2hlcyBpbiBhIHJvdworICAgICAgICAgICAgIyAoYWZ0ZXIgdGhlIGluaXRpYWwgdHdvKQorICAgICAgICAgICAgaWYgaW5kZXgyID09IGluZGV4ICsgMToKKyAgICAgICAgICAgICAgICByZXR1cm4gJycsIHAKKyAgICAgICAgICAgIGlmIGluZGV4MiA9PSAtMToKKyAgICAgICAgICAgICAgICBpbmRleDIgPSBsZW4ocCkKKyAgICAgICAgICAgIHJldHVybiBwWzppbmRleDJdLCBwW2luZGV4MjpdCisgICAgICAgIGlmIG5vcm1wWzFdID09ICc6JzoKKyAgICAgICAgICAgIHJldHVybiBwWzoyXSwgcFsyOl0KKyAgICByZXR1cm4gJycsIHAKIAogIyBQYXJzZSBVTkMgcGF0aHMKIGRlZiBzcGxpdHVuYyhwKToKQEAgLTE0NCwxNSArMTUwLDE4IEBACiAgICAgICAgICMgdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYgZXF1aXZhbGVudCB0byBkcml2ZSBsZXR0ZXIKICAgICAgICAgIyBcXG1hY2hpbmVcbW91bnRwb2ludFxkaXJlY3Rvcmllcy4uLgogICAgICAgICAjICAgICAgICAgICBkaXJlY3RvcnkgXl5eXl5eXl5eXl5eXl5eCi0gICAgICAgIG5vcm1wID0gbm9ybWNhc2UocCkKLSAgICAgICAgaW5kZXggPSBub3JtcC5maW5kKCdcXCcsIDIpCi0gICAgICAgIGlmIGluZGV4ID09IC0xOgotICAgICAgICAgICAgIyNyYWlzZSBSdW50aW1lRXJyb3IsICdpbGxlZ2FsIFVOQyBwYXRoOiAiJyArIHAgKyAnIicKLSAgICAgICAgICAgIHJldHVybiAoIiIsIHApCi0gICAgICAgIGluZGV4ID0gbm9ybXAuZmluZCgnXFwnLCBpbmRleCArIDEpCi0gICAgICAgIGlmIGluZGV4ID09IC0xOgotICAgICAgICAgICAgaW5kZXggPSBsZW4ocCkKLSAgICAgICAgcmV0dXJuIHBbOmluZGV4XSwgcFtpbmRleDpdCisgICAgICAgIG5vcm1wID0gcC5yZXBsYWNlKCdcXCcsICcvJykKKyAgICAgICAgaW5kZXggPSBub3JtcC5maW5kKCcvJywgMikKKyAgICAgICAgaWYgaW5kZXggPD0gMjoKKyAgICAgICAgICAgIHJldHVybiAnJywgcAorICAgICAgICBpbmRleDIgPSBub3JtcC5maW5kKCcvJywgaW5kZXggKyAxKQorICAgICAgICAjIGEgVU5DIHBhdGggY2FuJ3QgaGF2ZSB0d28gc2xhc2hlcyBpbiBhIHJvdworICAgICAgICAjIChhZnRlciB0aGUgaW5pdGlhbCB0d28pCisgICAgICAgIGlmIGluZGV4MiA9PSBpbmRleCArIDE6CisgICAgICAgICAgICByZXR1cm4gJycsIHAKKyAgICAgICAgaWYgaW5kZXgyID09IC0xOgorICAgICAgICAgICAgaW5kZXgyID0gbGVuKHApCisgICAgICAgIHJldHVybiBwWzppbmRleDJdLCBwW2luZGV4MjpdCiAgICAgcmV0dXJuICcnLCBwCiAKIApAQCAtMzIyLDYgKzMzMSwxMyBAQAogICAgICAgICByZXR1cm4gcGF0aAogICAgIGltcG9ydCBzdHJpbmcKICAgICB2YXJjaGFycyA9IHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cyArICdfLScKKyAgICBpZiBpc2luc3RhbmNlKHBhdGgsIHVuaWNvZGUpOgorICAgICAgICBlbmNvZGluZyA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKQorICAgICAgICBkZWYgZ2V0ZW52KHZhcik6CisgICAgICAgICAgICByZXR1cm4gb3MuZW52aXJvblt2YXIuZW5jb2RlKGVuY29kaW5nKV0uZGVjb2RlKGVuY29kaW5nKQorICAgIGVsc2U6CisgICAgICAgIGRlZiBnZXRlbnYodmFyKToKKyAgICAgICAgICAgIHJldHVybiBvcy5lbnZpcm9uW3Zhcl0KICAgICByZXMgPSAnJwogICAgIGluZGV4ID0gMAogICAgIHBhdGhsZW4gPSBsZW4ocGF0aCkKQEAgLTM1MCw5ICszNjYsOSBAQAogICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHBhdGhsZW4gLSAxCiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgdmFyID0gcGF0aFs6aW5kZXhdCi0gICAgICAgICAgICAgICAgICAgIGlmIHZhciBpbiBvcy5lbnZpcm9uOgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gcmVzICsgb3MuZW52aXJvblt2YXJdCi0gICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHJlcyArIGdldGVudih2YXIpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHJlcyArICclJyArIHZhciArICclJwogICAgICAgICBlbGlmIGMgPT0gJyQnOiAgIyB2YXJpYWJsZSBvciAnJCQnCiAgICAgICAgICAgICBpZiBwYXRoW2luZGV4ICsgMTppbmRleCArIDJdID09ICckJzoKQEAgLTM2NCw5ICszODAsOSBAQAogICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBwYXRoLmluZGV4KCd9JykKICAgICAgICAgICAgICAgICAgICAgdmFyID0gcGF0aFs6aW5kZXhdCi0gICAgICAgICAgICAgICAgICAgIGlmIHZhciBpbiBvcy5lbnZpcm9uOgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gcmVzICsgb3MuZW52aXJvblt2YXJdCi0gICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHJlcyArIGdldGVudih2YXIpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHJlcyArICckeycgKyB2YXIgKyAnfScKICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgcmVzID0gcmVzICsgJyR7JyArIHBhdGgKQEAgLTM3OSw5ICszOTUsOSBAQAogICAgICAgICAgICAgICAgICAgICB2YXIgPSB2YXIgKyBjCiAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kZXggKyAxCiAgICAgICAgICAgICAgICAgICAgIGMgPSBwYXRoW2luZGV4OmluZGV4ICsgMV0KLSAgICAgICAgICAgICAgICBpZiB2YXIgaW4gb3MuZW52aXJvbjoKLSAgICAgICAgICAgICAgICAgICAgcmVzID0gcmVzICsgb3MuZW52aXJvblt2YXJdCi0gICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IHJlcyArIGdldGVudih2YXIpCisgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgICAgICByZXMgPSByZXMgKyAnJCcgKyB2YXIKICAgICAgICAgICAgICAgICBpZiBjICE9ICcnOgogICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4IC0gMQpkaWZmIC0tZ2l0IGEvTGliL251bWJlcnMucHkgYi9MaWIvbnVtYmVycy5weQppbmRleCAyNTkyNjQzLi5iZGM2ZGQ2IDEwMDY0NAotLS0gYS9MaWIvbnVtYmVycy5weQorKysgYi9MaWIvbnVtYmVycy5weQpAQCAtMzAzLDcgKzMwMyw3IEBACiAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKIAogICAgIGRlZiBfX2luZGV4X18oc2VsZik6Ci0gICAgICAgICIiImluZGV4KHNlbGYpIiIiCisgICAgICAgICIiIkNhbGxlZCB3aGVuZXZlciBhbiBpbmRleCBpcyBuZWVkZWQsIHN1Y2ggYXMgaW4gc2xpY2luZyIiIgogICAgICAgICByZXR1cm4gbG9uZyhzZWxmKQogCiAgICAgQGFic3RyYWN0bWV0aG9kCmRpZmYgLS1naXQgYS9MaWIvb3B0cGFyc2UucHkgYi9MaWIvb3B0cGFyc2UucHkKaW5kZXggNzMxYTJiYi4uNDMzMjc2ZCAxMDA2NDQKLS0tIGEvTGliL29wdHBhcnNlLnB5CisrKyBiL0xpYi9vcHRwYXJzZS5weQpAQCAtMjA0LDcgKzIwNCw2IEBACiAgICAgICAgICAgICAgICAgIHNob3J0X2ZpcnN0KToKICAgICAgICAgc2VsZi5wYXJzZXIgPSBOb25lCiAgICAgICAgIHNlbGYuaW5kZW50X2luY3JlbWVudCA9IGluZGVudF9pbmNyZW1lbnQKLSAgICAgICAgc2VsZi5oZWxwX3Bvc2l0aW9uID0gc2VsZi5tYXhfaGVscF9wb3NpdGlvbiA9IG1heF9oZWxwX3Bvc2l0aW9uCiAgICAgICAgIGlmIHdpZHRoIGlzIE5vbmU6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgd2lkdGggPSBpbnQob3MuZW52aXJvblsnQ09MVU1OUyddKQpAQCAtMjEyLDYgKzIxMSw4IEBACiAgICAgICAgICAgICAgICAgd2lkdGggPSA4MAogICAgICAgICAgICAgd2lkdGggLT0gMgogICAgICAgICBzZWxmLndpZHRoID0gd2lkdGgKKyAgICAgICAgc2VsZi5oZWxwX3Bvc2l0aW9uID0gc2VsZi5tYXhfaGVscF9wb3NpdGlvbiA9IFwKKyAgICAgICAgICAgICAgICBtaW4obWF4X2hlbHBfcG9zaXRpb24sIG1heCh3aWR0aCAtIDIwLCBpbmRlbnRfaW5jcmVtZW50ICogMikpCiAgICAgICAgIHNlbGYuY3VycmVudF9pbmRlbnQgPSAwCiAgICAgICAgIHNlbGYubGV2ZWwgPSAwCiAgICAgICAgIHNlbGYuaGVscF93aWR0aCA9IE5vbmUgICAgICAgICAgIyBjb21wdXRlZCBsYXRlcgpAQCAtMjU2LDcgKzI1Nyw3IEBACiAgICAgICAgIEZvcm1hdCBhIHBhcmFncmFwaCBvZiBmcmVlLWZvcm0gdGV4dCBmb3IgaW5jbHVzaW9uIGluIHRoZQogICAgICAgICBoZWxwIG91dHB1dCBhdCB0aGUgY3VycmVudCBpbmRlbnRhdGlvbiBsZXZlbC4KICAgICAgICAgIiIiCi0gICAgICAgIHRleHRfd2lkdGggPSBzZWxmLndpZHRoIC0gc2VsZi5jdXJyZW50X2luZGVudAorICAgICAgICB0ZXh0X3dpZHRoID0gbWF4KHNlbGYud2lkdGggLSBzZWxmLmN1cnJlbnRfaW5kZW50LCAxMSkKICAgICAgICAgaW5kZW50ID0gIiAiKnNlbGYuY3VycmVudF9pbmRlbnQKICAgICAgICAgcmV0dXJuIHRleHR3cmFwLmZpbGwodGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF93aWR0aCwKQEAgLTMzNyw3ICszMzgsNyBAQAogICAgICAgICBzZWxmLmRlZGVudCgpCiAgICAgICAgIHNlbGYuZGVkZW50KCkKICAgICAgICAgc2VsZi5oZWxwX3Bvc2l0aW9uID0gbWluKG1heF9sZW4gKyAyLCBzZWxmLm1heF9oZWxwX3Bvc2l0aW9uKQotICAgICAgICBzZWxmLmhlbHBfd2lkdGggPSBzZWxmLndpZHRoIC0gc2VsZi5oZWxwX3Bvc2l0aW9uCisgICAgICAgIHNlbGYuaGVscF93aWR0aCA9IG1heChzZWxmLndpZHRoIC0gc2VsZi5oZWxwX3Bvc2l0aW9uLCAxMSkKIAogICAgIGRlZiBmb3JtYXRfb3B0aW9uX3N0cmluZ3Moc2VsZiwgb3B0aW9uKToKICAgICAgICAgIiIiUmV0dXJuIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygb3B0aW9uIHN0cmluZ3MgJiBtZXRhdmFyaWFibGVzLiIiIgpAQCAtMTQ3MSw3ICsxNDcyLDcgQEAKICAgICAgICAgIiIiX21hdGNoX2xvbmdfb3B0KG9wdCA6IHN0cmluZykgLT4gc3RyaW5nCiAKICAgICAgICAgRGV0ZXJtaW5lIHdoaWNoIGxvbmcgb3B0aW9uIHN0cmluZyAnb3B0JyBtYXRjaGVzLCBpZS4gd2hpY2ggb25lCi0gICAgICAgIGl0IGlzIGFuIHVuYW1iaWd1b3VzIGFiYnJldmF0aW9uIGZvci4gIFJhaXNlcyBCYWRPcHRpb25FcnJvciBpZgorICAgICAgICBpdCBpcyBhbiB1bmFtYmlndW91cyBhYmJyZXZpYXRpb24gZm9yLiAgUmFpc2VzIEJhZE9wdGlvbkVycm9yIGlmCiAgICAgICAgICdvcHQnIGRvZXNuJ3QgdW5hbWJpZ3VvdXNseSBtYXRjaCBhbnkgbG9uZyBvcHRpb24gc3RyaW5nLgogICAgICAgICAiIiIKICAgICAgICAgcmV0dXJuIF9tYXRjaF9hYmJyZXYob3B0LCBzZWxmLl9sb25nX29wdCkKZGlmZiAtLWdpdCBhL0xpYi9vcy5weSBiL0xpYi9vcy5weQppbmRleCBjNjEyZTE3Li41M2ZhZDZiIDEwMDY0NAotLS0gYS9MaWIvb3MucHkKKysrIGIvTGliL29zLnB5CkBAIC0xLDQgKzEsNCBAQAotciIiIk9TIHJvdXRpbmVzIGZvciBNYWMsIE5ULCBvciBQb3NpeCBkZXBlbmRpbmcgb24gd2hhdCBzeXN0ZW0gd2UncmUgb24uCityIiIiT1Mgcm91dGluZXMgZm9yIE5UIG9yIFBvc2l4IGRlcGVuZGluZyBvbiB3aGF0IHN5c3RlbSB3ZSdyZSBvbi4KIAogVGhpcyBleHBvcnRzOgogICAtIGFsbCBmdW5jdGlvbnMgZnJvbSBwb3NpeCwgbnQsIG9zMiwgb3IgY2UsIGUuZy4gdW5saW5rLCBzdGF0LCBldGMuCkBAIC0yMjksMTEgKzIyOSwxMiBAQAogCiAgICAgV2hlbiB0b3Bkb3duIGlzIHRydWUsIHRoZSBjYWxsZXIgY2FuIG1vZGlmeSB0aGUgZGlybmFtZXMgbGlzdCBpbi1wbGFjZQogICAgIChlLmcuLCB2aWEgZGVsIG9yIHNsaWNlIGFzc2lnbm1lbnQpLCBhbmQgd2FsayB3aWxsIG9ubHkgcmVjdXJzZSBpbnRvIHRoZQotICAgIHN1YmRpcmVjdG9yaWVzIHdob3NlIG5hbWVzIHJlbWFpbiBpbiBkaXJuYW1lczsgdGhpcyBjYW4gYmUgdXNlZCB0byBwcnVuZQotICAgIHRoZSBzZWFyY2gsIG9yIHRvIGltcG9zZSBhIHNwZWNpZmljIG9yZGVyIG9mIHZpc2l0aW5nLiAgTW9kaWZ5aW5nCi0gICAgZGlybmFtZXMgd2hlbiB0b3Bkb3duIGlzIGZhbHNlIGlzIGluZWZmZWN0aXZlLCBzaW5jZSB0aGUgZGlyZWN0b3JpZXMgaW4KLSAgICBkaXJuYW1lcyBoYXZlIGFscmVhZHkgYmVlbiBnZW5lcmF0ZWQgYnkgdGhlIHRpbWUgZGlybmFtZXMgaXRzZWxmIGlzCi0gICAgZ2VuZXJhdGVkLgorICAgIHN1YmRpcmVjdG9yaWVzIHdob3NlIG5hbWVzIHJlbWFpbiBpbiBkaXJuYW1lczsgdGhpcyBjYW4gYmUgdXNlZCB0byBwcnVuZSB0aGUKKyAgICBzZWFyY2gsIG9yIHRvIGltcG9zZSBhIHNwZWNpZmljIG9yZGVyIG9mIHZpc2l0aW5nLiAgTW9kaWZ5aW5nIGRpcm5hbWVzIHdoZW4KKyAgICB0b3Bkb3duIGlzIGZhbHNlIGlzIGluZWZmZWN0aXZlLCBzaW5jZSB0aGUgZGlyZWN0b3JpZXMgaW4gZGlybmFtZXMgaGF2ZQorICAgIGFscmVhZHkgYmVlbiBnZW5lcmF0ZWQgYnkgdGhlIHRpbWUgZGlybmFtZXMgaXRzZWxmIGlzIGdlbmVyYXRlZC4gTm8gbWF0dGVyCisgICAgdGhlIHZhbHVlIG9mIHRvcGRvd24sIHRoZSBsaXN0IG9mIHN1YmRpcmVjdG9yaWVzIGlzIHJldHJpZXZlZCBiZWZvcmUgdGhlCisgICAgdHVwbGVzIGZvciB0aGUgZGlyZWN0b3J5IGFuZCBpdHMgc3ViZGlyZWN0b3JpZXMgYXJlIGdlbmVyYXRlZC4KIAogICAgIEJ5IGRlZmF1bHQgZXJyb3JzIGZyb20gdGhlIG9zLmxpc3RkaXIoKSBjYWxsIGFyZSBpZ25vcmVkLiAgSWYKICAgICBvcHRpb25hbCBhcmcgJ29uZXJyb3InIGlzIHNwZWNpZmllZCwgaXQgc2hvdWxkIGJlIGEgZnVuY3Rpb247IGl0CkBAIC0yNjEsNiArMjYyLDcgQEAKICAgICAgICAgcHJpbnQgImJ5dGVzIGluIiwgbGVuKGZpbGVzKSwgIm5vbi1kaXJlY3RvcnkgZmlsZXMiCiAgICAgICAgIGlmICdDVlMnIGluIGRpcnM6CiAgICAgICAgICAgICBkaXJzLnJlbW92ZSgnQ1ZTJykgICMgZG9uJ3QgdmlzaXQgQ1ZTIGRpcmVjdG9yaWVzCisKICAgICAiIiIKIAogICAgIGlzbGluaywgam9pbiwgaXNkaXIgPSBwYXRoLmlzbGluaywgcGF0aC5qb2luLCBwYXRoLmlzZGlyCkBAIC03MzgsMjIgKzc0MCwzIEBACiAgICAgICAgICAgICAgICAgICAgICBfbWFrZV9zdGF0dmZzX3Jlc3VsdCkKIGV4Y2VwdCBOYW1lRXJyb3I6ICMgc3RhdHZmc19yZXN1bHQgbWF5IG5vdCBleGlzdAogICAgIHBhc3MKLQotaWYgbm90IF9leGlzdHMoInVyYW5kb20iKToKLSAgICBkZWYgdXJhbmRvbShuKToKLSAgICAgICAgIiIidXJhbmRvbShuKSAtPiBzdHIKLQotICAgICAgICBSZXR1cm4gYSBzdHJpbmcgb2YgbiByYW5kb20gYnl0ZXMgc3VpdGFibGUgZm9yIGNyeXB0b2dyYXBoaWMgdXNlLgotCi0gICAgICAgICIiIgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBfdXJhbmRvbWZkID0gb3BlbigiL2Rldi91cmFuZG9tIiwgT19SRE9OTFkpCi0gICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6Ci0gICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCIvZGV2L3VyYW5kb20gKG9yIGVxdWl2YWxlbnQpIG5vdCBmb3VuZCIpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGJzID0gYiIiCi0gICAgICAgICAgICB3aGlsZSBuID4gbGVuKGJzKToKLSAgICAgICAgICAgICAgICBicyArPSByZWFkKF91cmFuZG9tZmQsIG4gLSBsZW4oYnMpKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgY2xvc2UoX3VyYW5kb21mZCkKLSAgICAgICAgcmV0dXJuIGJzCmRpZmYgLS1naXQgYS9MaWIvcGRiLnB5IGIvTGliL3BkYi5weQppbmRleCA1NDY4ZDNmLi4xMTNiNGUwIDEwMDc1NQotLS0gYS9MaWIvcGRiLnB5CisrKyBiL0xpYi9wZGIucHkKQEAgLTEwOTUsNyArMTA5NSw3IEBACiAgICAgZGVmIGhlbHBfcnVuKHNlbGYpOgogICAgICAgICBwcmludCAiIiJydW4gW2FyZ3MuLi5dCiBSZXN0YXJ0IHRoZSBkZWJ1Z2dlZCBweXRob24gcHJvZ3JhbS4gSWYgYSBzdHJpbmcgaXMgc3VwcGxpZWQsIGl0IGlzCi1zcGxpdHRlZCB3aXRoICJzaGxleCIgYW5kIHRoZSByZXN1bHQgaXMgdXNlZCBhcyB0aGUgbmV3IHN5cy5hcmd2Lgorc3BsaXQgd2l0aCAic2hsZXgiIGFuZCB0aGUgcmVzdWx0IGlzIHVzZWQgYXMgdGhlIG5ldyBzeXMuYXJndi4KIEhpc3RvcnksIGJyZWFrcG9pbnRzLCBhY3Rpb25zIGFuZCBkZWJ1Z2dlciBvcHRpb25zIGFyZSBwcmVzZXJ2ZWQuCiAicmVzdGFydCIgaXMgYW4gYWxpYXMgZm9yICJydW4iLiIiIgogCmRpZmYgLS1naXQgYS9MaWIvcGlja2xlLnB5IGIvTGliL3BpY2tsZS5weQppbmRleCA1Yjk1Y2JhLi4yOTlkZTE2IDEwMDY0NAotLS0gYS9MaWIvcGlja2xlLnB5CisrKyBiL0xpYi9waWNrbGUucHkKQEAgLTI2OSw3ICsyNjksNyBAQAogICAgIGRlZiBzYXZlKHNlbGYsIG9iaik6CiAgICAgICAgICMgQ2hlY2sgZm9yIHBlcnNpc3RlbnQgaWQgKGRlZmluZWQgYnkgYSBzdWJjbGFzcykKICAgICAgICAgcGlkID0gc2VsZi5wZXJzaXN0ZW50X2lkKG9iaikKLSAgICAgICAgaWYgcGlkOgorICAgICAgICBpZiBwaWQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICBzZWxmLnNhdmVfcGVycyhwaWQpCiAgICAgICAgICAgICByZXR1cm4KIApAQCAtOTYyLDcgKzk2Miw3IEBACiAgICAgICAgIHJlcCA9IHNlbGYucmVhZGxpbmUoKVs6LTFdCiAgICAgICAgIGZvciBxIGluICJcIiciOiAjIGRvdWJsZSBvciBzaW5nbGUgcXVvdGUKICAgICAgICAgICAgIGlmIHJlcC5zdGFydHN3aXRoKHEpOgotICAgICAgICAgICAgICAgIGlmIG5vdCByZXAuZW5kc3dpdGgocSk6CisgICAgICAgICAgICAgICAgaWYgbGVuKHJlcCkgPCAyIG9yIG5vdCByZXAuZW5kc3dpdGgocSk6CiAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJpbnNlY3VyZSBzdHJpbmcgcGlja2xlIgogICAgICAgICAgICAgICAgIHJlcCA9IHJlcFtsZW4ocSk6LWxlbihxKV0KICAgICAgICAgICAgICAgICBicmVhawpkaWZmIC0tZ2l0IGEvTGliL3BpY2tsZXRvb2xzLnB5IGIvTGliL3BpY2tsZXRvb2xzLnB5CmluZGV4IGQ3MTc3MjguLjhkZTUzZGQgMTAwNjQ0Ci0tLSBhL0xpYi9waWNrbGV0b29scy5weQorKysgYi9MaWIvcGlja2xldG9vbHMucHkKQEAgLTgwNCw3ICs4MDQsNyBAQAogICAgICAgICAgICAgICAgICBvYnR5cGU9U3RhY2tPYmplY3QsCiAgICAgICAgICAgICAgICAgIGRvYz0iIiJBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgY29udGlndW91cyBzbGljZSBvZiB0aGUgc3RhY2suCiAKLSAgICAgICAgICAgICAgICAgVGhpcyBpcyB1c2VkIGluIGNvbmp1Y3Rpb24gd2l0aCBtYXJrb2JqZWN0LCB0byByZXByZXNlbnQgYWxsCisgICAgICAgICAgICAgICAgIFRoaXMgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIG1hcmtvYmplY3QsIHRvIHJlcHJlc2VudCBhbGwKICAgICAgICAgICAgICAgICAgb2YgdGhlIHN0YWNrIGZvbGxvd2luZyB0aGUgdG9wbW9zdCBtYXJrb2JqZWN0LiAgRm9yIGV4YW1wbGUsCiAgICAgICAgICAgICAgICAgIHRoZSBQT1BfTUFSSyBvcGNvZGUgY2hhbmdlcyB0aGUgc3RhY2sgZnJvbQogCkBAIC0xOTI5LDcgKzE5MjksNyBAQAogCiAgICAgc3RhY2sgPSBbXSAgICAgICAgICAjIGNydWRlIGVtdWxhdGlvbiBvZiB1bnBpY2tsZXIgc3RhY2sKICAgICBpZiBtZW1vIGlzIE5vbmU6Ci0gICAgICAgIG1lbW8gPSB7fSAgICAgICAjIGNydWRlIGVtdWxhdGlvbiBvZiB1bnBpY2tlciBtZW1vCisgICAgICAgIG1lbW8gPSB7fSAgICAgICAjIGNydWRlIGVtdWxhdGlvbiBvZiB1bnBpY2tsZXIgbWVtbwogICAgIG1heHByb3RvID0gLTEgICAgICAgIyBtYXggcHJvdG9jb2wgbnVtYmVyIHNlZW4KICAgICBtYXJrc3RhY2sgPSBbXSAgICAgICMgYnl0ZWNvZGUgcG9zaXRpb25zIG9mIE1BUksgb3Bjb2RlcwogICAgIGluZGVudGNodW5rID0gJyAnICogaW5kZW50bGV2ZWwKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LWdlbmVyaWMvcmVnZW4gYi9MaWIvcGxhdC1nZW5lcmljL3JlZ2VuCmluZGV4IGEyMGNkYzEuLmM5NjE2N2QgMTAwNzU1Ci0tLSBhL0xpYi9wbGF0LWdlbmVyaWMvcmVnZW4KKysrIGIvTGliL3BsYXQtZ2VuZXJpYy9yZWdlbgpAQCAtMSwzICsxLDMgQEAKICMhIC9iaW4vc2gKIHNldCAtdgotcHl0aG9uJEVYRSAuLi8uLi9Ub29scy9zY3JpcHRzL2gycHkucHkgLWkgJyh1X2xvbmcpJyAvdXNyL2luY2x1ZGUvbmV0aW5ldC9pbi5oCitldmFsICRQWVRIT05fRk9SX0JVSUxEIC4uLy4uL1Rvb2xzL3NjcmlwdHMvaDJweS5weSAtaSAiJyh1X2xvbmcpJyIgL3Vzci9pbmNsdWRlL25ldGluZXQvaW4uaApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL0Vhc3lEaWFsb2dzLnB5IGIvTGliL3BsYXQtbWFjL0Vhc3lEaWFsb2dzLnB5CmluZGV4IDEyOWNmMmMuLjFkM2VkYjMgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9FYXN5RGlhbG9ncy5weQorKysgYi9MaWIvcGxhdC1tYWMvRWFzeURpYWxvZ3MucHkKQEAgLTI0Myw4ICsyNDMsMTUgQEAKIAogCiAKKyMgVGhlIGRlcHJlY2F0ZWQgQ2FyYm9uIFF1aWNrRHJhdyBBUElzIGFyZSBubyBsb25nZXIgYXZhaWxhYmxlIGFzIG9mCisjIE9TIFggMTAuOC4gIFJhaXNlIGFuIEltcG9ydEVycm9yIGhlcmUgaW4gdGhhdCBjYXNlIHNvIHRoYXQgY2FsbGVycworIyBvZiBFYXN5RGlhbG9ncywgbGlrZSBCdWlsZEFwcGxldCwgd2lsbCBkbyB0aGUgcmlnaHQgdGhpbmcuCiAKLXNjcmVlbmJvdW5kcyA9IFFkLkdldFFER2xvYmFsc1NjcmVlbkJpdHMoKS5ib3VuZHMKK3RyeToKKyAgICBzY3JlZW5ib3VuZHMgPSBRZC5HZXRRREdsb2JhbHNTY3JlZW5CaXRzKCkuYm91bmRzCitleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgcmFpc2UgSW1wb3J0RXJyb3IoIlF1aWNrRHJhdyBBUElzIG5vdCBhdmFpbGFibGUiKQorCiBzY3JlZW5ib3VuZHMgPSBzY3JlZW5ib3VuZHNbMF0rNCwgc2NyZWVuYm91bmRzWzFdKzQsIFwKICAgICBzY3JlZW5ib3VuZHNbMl0tNCwgc2NyZWVuYm91bmRzWzNdLTQKIApkaWZmIC0tZ2l0IGEvTGliL3BsYXRmb3JtLnB5IGIvTGliL3BsYXRmb3JtLnB5CmluZGV4IDcxMGYyMWUuLmRmMmFmODMgMTAwNzU1Ci0tLSBhL0xpYi9wbGF0Zm9ybS5weQorKysgYi9MaWIvcGxhdGZvcm0ucHkKQEAgLTE4Myw3ICsxODMsNyBAQAogICAgICAgICBlbGlmIHNvOgogICAgICAgICAgICAgaWYgbGliICE9ICdnbGliYyc6CiAgICAgICAgICAgICAgICAgbGliID0gJ2xpYmMnCi0gICAgICAgICAgICAgICAgaWYgc292ZXJzaW9uID4gdmVyc2lvbjoKKyAgICAgICAgICAgICAgICBpZiBzb3ZlcnNpb24gYW5kIHNvdmVyc2lvbiA+IHZlcnNpb246CiAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSBzb3ZlcnNpb24KICAgICAgICAgICAgICAgICBpZiB0aHJlYWRzIGFuZCB2ZXJzaW9uWy1sZW4odGhyZWFkcyk6XSAhPSB0aHJlYWRzOgogICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbiArIHRocmVhZHMKQEAgLTIyOCw3ICsyMjgsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiAnT3BlbkxpbnV4Jyxwa2dbMV0saWQKIAogICAgIGlmIG9zLnBhdGguaXNkaXIoJy91c3IvbGliL3NldHVwJyk6Ci0gICAgICAgICMgQ2hlY2sgZm9yIHNsYWNrd2FyZSB2ZXJzb24gdGFnIGZpbGUgKHRoYW5rcyB0byBHcmVnIEFuZHJ1aykKKyAgICAgICAgIyBDaGVjayBmb3Igc2xhY2t3YXJlIHZlcnNpb24gdGFnIGZpbGUgKHRoYW5rcyB0byBHcmVnIEFuZHJ1aykKICAgICAgICAgdmVyZmlsZXMgPSBvcy5saXN0ZGlyKCcvdXNyL2xpYi9zZXR1cCcpCiAgICAgICAgIGZvciBuIGluIHJhbmdlKGxlbih2ZXJmaWxlcyktMSwgLTEsIC0xKToKICAgICAgICAgICAgIGlmIHZlcmZpbGVzW25dWzoxNF0gIT0gJ3NsYWNrLXZlcnNpb24tJzoKQEAgLTI4MCw3ICsyODAsNyBAQAogICAgIGlmIG0gaXMgbm90IE5vbmU6CiAgICAgICAgIHJldHVybiB0dXBsZShtLmdyb3VwcygpKQogCi0gICAgIyBVbmtvd24gZm9ybWF0Li4uIHRha2UgdGhlIGZpcnN0IHR3byB3b3JkcworICAgICMgVW5rbm93biBmb3JtYXQuLi4gdGFrZSB0aGUgZmlyc3QgdHdvIHdvcmRzCiAgICAgbCA9IHN0cmluZy5zcGxpdChzdHJpbmcuc3RyaXAoZmlyc3RsaW5lKSkKICAgICBpZiBsOgogICAgICAgICB2ZXJzaW9uID0gbFswXQpAQCAtNTU0LDcgKzU1NCw3IEBACiAKICAgICAiIiIgR2V0IGFkZGl0aW9uYWwgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBXaW5kb3dzIFJlZ2lzdHJ5CiAgICAgICAgIGFuZCByZXR1cm4gYSB0dXBsZSAodmVyc2lvbixjc2QscHR5cGUpIHJlZmVycmluZyB0byB2ZXJzaW9uCi0gICAgICAgIG51bWJlciwgQ1NEIGxldmVsIGFuZCBPUyB0eXBlIChtdWx0aS9zaW5nbGUKKyAgICAgICAgbnVtYmVyLCBDU0QgbGV2ZWwgKHNlcnZpY2UgcGFjayksIGFuZCBPUyB0eXBlIChtdWx0aS9zaW5nbGUKICAgICAgICAgcHJvY2Vzc29yKS4KIAogICAgICAgICBBcyBhIGhpbnQ6IHB0eXBlIHJldHVybnMgJ1VuaXByb2Nlc3NvciBGcmVlJyBvbiBzaW5nbGUKQEAgLTY3Myw4ICs2NzMsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZSA9ICc3JwogICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2UgPSAnMjAwOFNlcnZlclIyJworICAgICAgICAgICAgZWxpZiBtaW4gPT0gMjoKKyAgICAgICAgICAgICAgICBpZiBwcm9kdWN0X3R5cGUgPT0gVkVSX05UX1dPUktTVEFUSU9OOgorICAgICAgICAgICAgICAgICAgICByZWxlYXNlID0gJzgnCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZSA9ICcyMDEyU2VydmVyJwogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICByZWxlYXNlID0gJ3Bvc3QyMDA4U2VydmVyJworICAgICAgICAgICAgICAgIHJlbGVhc2UgPSAncG9zdDIwMTJTZXJ2ZXInCiAKICAgICBlbHNlOgogICAgICAgICBpZiBub3QgcmVsZWFzZToKQEAgLTc5NSw3ICs4MDAsNyBAQAogICAgICAgICB2ZXJzaW9uaW5mbywgbWFjaGluZSkgd2l0aCB2ZXJzaW9uaW5mbyBiZWluZyBhIHR1cGxlICh2ZXJzaW9uLAogICAgICAgICBkZXZfc3RhZ2UsIG5vbl9yZWxlYXNlX3ZlcnNpb24pLgogCi0gICAgICAgIEVudHJpZXMgd2hpY2ggY2Fubm90IGJlIGRldGVybWluZWQgYXJlIHNldCB0byB0aGUgcGFyYW10ZXIgdmFsdWVzCisgICAgICAgIEVudHJpZXMgd2hpY2ggY2Fubm90IGJlIGRldGVybWluZWQgYXJlIHNldCB0byB0aGUgcGFyYW1ldGVyIHZhbHVlcwogICAgICAgICB3aGljaCBkZWZhdWx0IHRvICcnLiBBbGwgdHVwbGUgZW50cmllcyBhcmUgc3RyaW5ncy4KICAgICAiIiIKIApAQCAtMTAyMCwxNiArMTAyNSwzOCBAQAogICAgICAgICBjYXNlIHRoZSBjb21tYW5kIHNob3VsZCBmYWlsLgogCiAgICAgIiIiCisKKyAgICAjIFdlIGRvIHRoZSBpbXBvcnQgaGVyZSB0byBhdm9pZCBhIGJvb3RzdHJhcCBpc3N1ZS4KKyAgICAjIFNlZSBjNzNiOTBiNmRhZGQgY2hhbmdlc2V0LgorICAgICMKKyAgICAjIFsuLl0KKyAgICAjIHJhbmxpYiBsaWJweXRob24yLjcuYQorICAgICMgZ2NjICAgLW8gcHl0aG9uIFwKKyAgICAjICAgICAgICBNb2R1bGVzL3B5dGhvbi5vIFwKKyAgICAjICAgICAgICBsaWJweXRob24yLjcuYSAtbHNvY2tldCAtbG5zbCAtbGRsICAgIC1sbQorICAgICMgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICMgIEZpbGUgIi4vc2V0dXAucHkiLCBsaW5lIDgsIGluIDxtb2R1bGU+CisgICAgIyAgICBmcm9tIHBsYXRmb3JtIGltcG9ydCBtYWNoaW5lIGFzIHBsYXRmb3JtX21hY2hpbmUKKyAgICAjICBGaWxlICJbLi5dL2J1aWxkL0xpYi9wbGF0Zm9ybS5weSIsIGxpbmUgMTE2LCBpbiA8bW9kdWxlPgorICAgICMgICAgaW1wb3J0IHN5cyxzdHJpbmcsb3MscmUsc3VicHJvY2VzcworICAgICMgIEZpbGUgIlsuLl0vYnVpbGQvTGliL3N1YnByb2Nlc3MucHkiLCBsaW5lIDQyOSwgaW4gPG1vZHVsZT4KKyAgICAjICAgIGltcG9ydCBzZWxlY3QKKyAgICAjIEltcG9ydEVycm9yOiBObyBtb2R1bGUgbmFtZWQgc2VsZWN0CisKKyAgICBpbXBvcnQgc3VicHJvY2VzcworCiAgICAgaWYgc3lzLnBsYXRmb3JtIGluICgnZG9zJywnd2luMzInLCd3aW4xNicsJ29zMicpOgogICAgICAgICAjIFhYWCBPdGhlcnMgdG9vID8KICAgICAgICAgcmV0dXJuIGRlZmF1bHQKLSAgICB0YXJnZXQgPSBfZm9sbG93X3N5bWxpbmtzKHRhcmdldCkucmVwbGFjZSgnIicsICdcXCInKQorICAgIHRhcmdldCA9IF9mb2xsb3dfc3ltbGlua3ModGFyZ2V0KQogICAgIHRyeToKLSAgICAgICAgZiA9IG9zLnBvcGVuKCdmaWxlICIlcyIgMj4gJXMnICUgKHRhcmdldCwgREVWX05VTEwpKQorICAgICAgICBwcm9jID0gc3VicHJvY2Vzcy5Qb3BlbihbJ2ZpbGUnLCB0YXJnZXRdLAorICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKKwogICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3Isb3MuZXJyb3IpOgogICAgICAgICByZXR1cm4gZGVmYXVsdAotICAgIG91dHB1dCA9IHN0cmluZy5zdHJpcChmLnJlYWQoKSkKLSAgICByYyA9IGYuY2xvc2UoKQorICAgIG91dHB1dCA9IHByb2MuY29tbXVuaWNhdGUoKVswXQorICAgIHJjID0gcHJvYy53YWl0KCkKICAgICBpZiBub3Qgb3V0cHV0IG9yIHJjOgogICAgICAgICByZXR1cm4gZGVmYXVsdAogICAgIGVsc2U6CkBAIC0xMzQ0LDYgKzEzNzEsMTQgQEAKICAgICAnKD86IFwoKFtcZFwuXSspXCkpPycKICAgICAnIG9uICguTkVUIFtcZFwuXSspJykKIAorIyBJcm9uUHl0aG9uIGNvdmVyaW5nIDIuNiBhbmQgMi43CitfaXJvbnB5dGhvbjI2X3N5c192ZXJzaW9uX3BhcnNlciA9IHJlLmNvbXBpbGUoCisgICAgcicoW1xkLl0rKVxzKicKKyAgICAnXChJcm9uUHl0aG9uXHMqJworICAgICdbXGQuXStccyonCisgICAgJ1woKFtcZC5dKylcKSBvbiAoW1x3Ll0rIFtcZC5dKyg/OiBcKFxkKy1iaXRcKSk/KVwpJworKQorCiBfcHlweV9zeXNfdmVyc2lvbl9wYXJzZXIgPSByZS5jb21waWxlKAogICAgIHInKFtcdy4rXSspXHMqJwogICAgICdcKCM/KFteLF0rKSxccyooW1x3IF0rKSxccyooW1x3IDpdKylcKVxzKicKQEAgLTEzODEsMTkgKzE0MTYsMjQgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdAogCiAgICAgIyBQYXJzZSBpdAotICAgIGlmIHN5c192ZXJzaW9uWzoxMF0gPT0gJ0lyb25QeXRob24nOgorICAgIGlmICdJcm9uUHl0aG9uJyBpbiBzeXNfdmVyc2lvbjoKICAgICAgICAgIyBJcm9uUHl0aG9uCiAgICAgICAgIG5hbWUgPSAnSXJvblB5dGhvbicKLSAgICAgICAgbWF0Y2ggPSBfaXJvbnB5dGhvbl9zeXNfdmVyc2lvbl9wYXJzZXIubWF0Y2goc3lzX3ZlcnNpb24pCisgICAgICAgIGlmIHN5c192ZXJzaW9uLnN0YXJ0c3dpdGgoJ0lyb25QeXRob24nKToKKyAgICAgICAgICAgIG1hdGNoID0gX2lyb25weXRob25fc3lzX3ZlcnNpb25fcGFyc2VyLm1hdGNoKHN5c192ZXJzaW9uKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbWF0Y2ggPSBfaXJvbnB5dGhvbjI2X3N5c192ZXJzaW9uX3BhcnNlci5tYXRjaChzeXNfdmVyc2lvbikKKwogICAgICAgICBpZiBtYXRjaCBpcyBOb25lOgogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICAnZmFpbGVkIHRvIHBhcnNlIElyb25QeXRob24gc3lzLnZlcnNpb246ICVzJyAlCiAgICAgICAgICAgICAgICAgcmVwcihzeXNfdmVyc2lvbikpCisKICAgICAgICAgdmVyc2lvbiwgYWx0X3ZlcnNpb24sIGNvbXBpbGVyID0gbWF0Y2guZ3JvdXBzKCkKICAgICAgICAgYnVpbGRubyA9ICcnCiAgICAgICAgIGJ1aWxkZGF0ZSA9ICcnCiAKLSAgICBlbGlmIHN5cy5wbGF0Zm9ybVs6NF0gPT0gJ2phdmEnOgorICAgIGVsaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKICAgICAgICAgIyBKeXRob24KICAgICAgICAgbmFtZSA9ICdKeXRob24nCiAgICAgICAgIG1hdGNoID0gX3N5c192ZXJzaW9uX3BhcnNlci5tYXRjaChzeXNfdmVyc2lvbikKZGlmZiAtLWdpdCBhL0xpYi9wbGlzdGxpYi5weSBiL0xpYi9wbGlzdGxpYi5weQppbmRleCA1MTk0NGVlLi40Mjg5N2I4IDEwMDY0NAotLS0gYS9MaWIvcGxpc3RsaWIucHkKKysrIGIvTGliL3BsaXN0bGliLnB5CkBAIC0yNjIsOCArMjYyLDggQEAKICAgICBkZWYgd3JpdGVEYXRhKHNlbGYsIGRhdGEpOgogICAgICAgICBzZWxmLmJlZ2luRWxlbWVudCgiZGF0YSIpCiAgICAgICAgIHNlbGYuaW5kZW50TGV2ZWwgLT0gMQotICAgICAgICBtYXhsaW5lbGVuZ3RoID0gNzYgLSBsZW4oc2VsZi5pbmRlbnQucmVwbGFjZSgiXHQiLCAiICIgKiA4KSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmluZGVudExldmVsKQorICAgICAgICBtYXhsaW5lbGVuZ3RoID0gbWF4KDE2LCA3NiAtIGxlbihzZWxmLmluZGVudC5yZXBsYWNlKCJcdCIsICIgIiAqIDgpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5kZW50TGV2ZWwpKQogICAgICAgICBmb3IgbGluZSBpbiBkYXRhLmFzQmFzZTY0KG1heGxpbmVsZW5ndGgpLnNwbGl0KCJcbiIpOgogICAgICAgICAgICAgaWYgbGluZToKICAgICAgICAgICAgICAgICBzZWxmLndyaXRlbG4obGluZSkKZGlmZiAtLWdpdCBhL0xpYi9wb3BsaWIucHkgYi9MaWIvcG9wbGliLnB5CmluZGV4IGUyYjMzZWYuLmRjN2NiZGYgMTAwNjQ0Ci0tLSBhL0xpYi9wb3BsaWIucHkKKysrIGIvTGliL3BvcGxpYi5weQpAQCAtMzIxLDcgKzMyMSw3IEBACiAKICAgICAgICAgICAgICAgIGhvc3RuYW1lIC0gdGhlIGhvc3RuYW1lIG9mIHRoZSBwb3AzIG92ZXIgc3NsIHNlcnZlcgogICAgICAgICAgICAgICAgcG9ydCAtIHBvcnQgbnVtYmVyCi0gICAgICAgICAgICAgICBrZXlmaWxlIC0gUEVNIGZvcm1hdHRlZCBmaWxlIHRoYXQgY291bnRhaW5zIHlvdXIgcHJpdmF0ZSBrZXkKKyAgICAgICAgICAgICAgIGtleWZpbGUgLSBQRU0gZm9ybWF0dGVkIGZpbGUgdGhhdCBjb250YWlucyB5b3VyIHByaXZhdGUga2V5CiAgICAgICAgICAgICAgICBjZXJ0ZmlsZSAtIFBFTSBmb3JtYXR0ZWQgY2VydGlmaWNhdGUgY2hhaW4gZmlsZQogCiAgICAgICAgICAgICBTZWUgdGhlIG1ldGhvZHMgb2YgdGhlIHBhcmVudCBjbGFzcyBQT1AzIGZvciBtb3JlIGRvY3VtZW50YXRpb24uCmRpZmYgLS1naXQgYS9MaWIvcG9zaXhwYXRoLnB5IGIvTGliL3Bvc2l4cGF0aC5weQppbmRleCBhYWUzOGQ1Li4wMzc4MDA0IDEwMDY0NAotLS0gYS9MaWIvcG9zaXhwYXRoLnB5CisrKyBiL0xpYi9wb3NpeHBhdGgucHkKQEAgLTE3LDYgKzE3LDE0IEBACiBpbXBvcnQgd2FybmluZ3MKIGZyb20gZ2VuZXJpY3BhdGggaW1wb3J0ICoKIAordHJ5OgorICAgIF91bmljb2RlID0gdW5pY29kZQorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAjIElmIFB5dGhvbiBpcyBidWlsdCB3aXRob3V0IFVuaWNvZGUgc3VwcG9ydCwgdGhlIHVuaWNvZGUgdHlwZQorICAgICMgd2lsbCBub3QgZXhpc3QuIEZha2Ugb25lLgorICAgIGNsYXNzIF91bmljb2RlKG9iamVjdCk6CisgICAgICAgIHBhc3MKKwogX19hbGxfXyA9IFsibm9ybWNhc2UiLCJpc2FicyIsImpvaW4iLCJzcGxpdGRyaXZlIiwic3BsaXQiLCJzcGxpdGV4dCIsCiAgICAgICAgICAgICJiYXNlbmFtZSIsImRpcm5hbWUiLCJjb21tb25wcmVmaXgiLCJnZXRzaXplIiwiZ2V0bXRpbWUiLAogICAgICAgICAgICAiZ2V0YXRpbWUiLCJnZXRjdGltZSIsImlzbGluayIsImV4aXN0cyIsImxleGlzdHMiLCJpc2RpciIsImlzZmlsZSIsCkBAIC02MCw3ICs2OCw4IEBACiBkZWYgam9pbihhLCAqcCk6CiAgICAgIiIiSm9pbiB0d28gb3IgbW9yZSBwYXRobmFtZSBjb21wb25lbnRzLCBpbnNlcnRpbmcgJy8nIGFzIG5lZWRlZC4KICAgICBJZiBhbnkgY29tcG9uZW50IGlzIGFuIGFic29sdXRlIHBhdGgsIGFsbCBwcmV2aW91cyBwYXRoIGNvbXBvbmVudHMKLSAgICB3aWxsIGJlIGRpc2NhcmRlZC4iIiIKKyAgICB3aWxsIGJlIGRpc2NhcmRlZC4gIEFuIGVtcHR5IGxhc3QgcGFydCB3aWxsIHJlc3VsdCBpbiBhIHBhdGggdGhhdAorICAgIGVuZHMgd2l0aCBhIHNlcGFyYXRvci4iIiIKICAgICBwYXRoID0gYQogICAgIGZvciBiIGluIHA6CiAgICAgICAgIGlmIGIuc3RhcnRzd2l0aCgnLycpOgpAQCAtMjY3LDggKzI3Niw4IEBACiAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgIHJldHVybiBwYXRoCiAgICAgICAgIHVzZXJob21lID0gcHdlbnQucHdfZGlyCi0gICAgdXNlcmhvbWUgPSB1c2VyaG9tZS5yc3RyaXAoJy8nKSBvciB1c2VyaG9tZQotICAgIHJldHVybiB1c2VyaG9tZSArIHBhdGhbaTpdCisgICAgdXNlcmhvbWUgPSB1c2VyaG9tZS5yc3RyaXAoJy8nKQorICAgIHJldHVybiAodXNlcmhvbWUgKyBwYXRoW2k6XSkgb3IgJy8nCiAKIAogIyBFeHBhbmQgcGF0aHMgY29udGFpbmluZyBzaGVsbCB2YXJpYWJsZSBzdWJzdGl0dXRpb25zLgpAQCAtMjc2LDI4ICsyODUsNDMgQEAKICMgTm9uLWV4aXN0ZW50IHZhcmlhYmxlcyBhcmUgbGVmdCB1bmNoYW5nZWQuCiAKIF92YXJwcm9nID0gTm9uZQorX3V2YXJwcm9nID0gTm9uZQogCiBkZWYgZXhwYW5kdmFycyhwYXRoKToKICAgICAiIiJFeHBhbmQgc2hlbGwgdmFyaWFibGVzIG9mIGZvcm0gJHZhciBhbmQgJHt2YXJ9LiAgVW5rbm93biB2YXJpYWJsZXMKICAgICBhcmUgbGVmdCB1bmNoYW5nZWQuIiIiCi0gICAgZ2xvYmFsIF92YXJwcm9nCisgICAgZ2xvYmFsIF92YXJwcm9nLCBfdXZhcnByb2cKICAgICBpZiAnJCcgbm90IGluIHBhdGg6CiAgICAgICAgIHJldHVybiBwYXRoCi0gICAgaWYgbm90IF92YXJwcm9nOgotICAgICAgICBpbXBvcnQgcmUKLSAgICAgICAgX3ZhcnByb2cgPSByZS5jb21waWxlKHInXCQoXHcrfFx7W159XSpcfSknKQorICAgIGlmIGlzaW5zdGFuY2UocGF0aCwgX3VuaWNvZGUpOgorICAgICAgICBpZiBub3QgX3ZhcnByb2c6CisgICAgICAgICAgICBpbXBvcnQgcmUKKyAgICAgICAgICAgIF92YXJwcm9nID0gcmUuY29tcGlsZShyJ1wkKFx3K3xce1tefV0qXH0pJykKKyAgICAgICAgdmFycHJvZyA9IF92YXJwcm9nCisgICAgICAgIGVuY29kaW5nID0gc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpCisgICAgZWxzZToKKyAgICAgICAgaWYgbm90IF91dmFycHJvZzoKKyAgICAgICAgICAgIGltcG9ydCByZQorICAgICAgICAgICAgX3V2YXJwcm9nID0gcmUuY29tcGlsZShfdW5pY29kZShyJ1wkKFx3K3xce1tefV0qXH0pJyksIHJlLlVOSUNPREUpCisgICAgICAgIHZhcnByb2cgPSBfdXZhcnByb2cKKyAgICAgICAgZW5jb2RpbmcgPSBOb25lCiAgICAgaSA9IDAKICAgICB3aGlsZSBUcnVlOgotICAgICAgICBtID0gX3ZhcnByb2cuc2VhcmNoKHBhdGgsIGkpCisgICAgICAgIG0gPSB2YXJwcm9nLnNlYXJjaChwYXRoLCBpKQogICAgICAgICBpZiBub3QgbToKICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgIGksIGogPSBtLnNwYW4oMCkKICAgICAgICAgbmFtZSA9IG0uZ3JvdXAoMSkKICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCd7JykgYW5kIG5hbWUuZW5kc3dpdGgoJ30nKToKICAgICAgICAgICAgIG5hbWUgPSBuYW1lWzE6LTFdCisgICAgICAgIGlmIGVuY29kaW5nOgorICAgICAgICAgICAgbmFtZSA9IG5hbWUuZW5jb2RlKGVuY29kaW5nKQogICAgICAgICBpZiBuYW1lIGluIG9zLmVudmlyb246CiAgICAgICAgICAgICB0YWlsID0gcGF0aFtqOl0KLSAgICAgICAgICAgIHBhdGggPSBwYXRoWzppXSArIG9zLmVudmlyb25bbmFtZV0KKyAgICAgICAgICAgIHZhbHVlID0gb3MuZW52aXJvbltuYW1lXQorICAgICAgICAgICAgaWYgZW5jb2Rpbmc6CisgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5kZWNvZGUoZW5jb2RpbmcpCisgICAgICAgICAgICBwYXRoID0gcGF0aFs6aV0gKyB2YWx1ZQogICAgICAgICAgICAgaSA9IGxlbihwYXRoKQogICAgICAgICAgICAgcGF0aCArPSB0YWlsCiAgICAgICAgIGVsc2U6CkBAIC0zMTIsNyArMzM2LDcgQEAKIGRlZiBub3JtcGF0aChwYXRoKToKICAgICAiIiJOb3JtYWxpemUgcGF0aCwgZWxpbWluYXRpbmcgZG91YmxlIHNsYXNoZXMsIGV0Yy4iIiIKICAgICAjIFByZXNlcnZlIHVuaWNvZGUgKGlmIHBhdGggaXMgdW5pY29kZSkKLSAgICBzbGFzaCwgZG90ID0gKHUnLycsIHUnLicpIGlmIGlzaW5zdGFuY2UocGF0aCwgdW5pY29kZSkgZWxzZSAoJy8nLCAnLicpCisgICAgc2xhc2gsIGRvdCA9ICh1Jy8nLCB1Jy4nKSBpZiBpc2luc3RhbmNlKHBhdGgsIF91bmljb2RlKSBlbHNlICgnLycsICcuJykKICAgICBpZiBwYXRoID09ICcnOgogICAgICAgICByZXR1cm4gZG90CiAgICAgaW5pdGlhbF9zbGFzaGVzID0gcGF0aC5zdGFydHN3aXRoKCcvJykKQEAgLTM0MSw3ICszNjUsNyBAQAogZGVmIGFic3BhdGgocGF0aCk6CiAgICAgIiIiUmV0dXJuIGFuIGFic29sdXRlIHBhdGguIiIiCiAgICAgaWYgbm90IGlzYWJzKHBhdGgpOgotICAgICAgICBpZiBpc2luc3RhbmNlKHBhdGgsIHVuaWNvZGUpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHBhdGgsIF91bmljb2RlKToKICAgICAgICAgICAgIGN3ZCA9IG9zLmdldGN3ZHUoKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgY3dkID0gb3MuZ2V0Y3dkKCkKQEAgLTM1NSw0NiArMzc5LDUzIEBACiBkZWYgcmVhbHBhdGgoZmlsZW5hbWUpOgogICAgICIiIlJldHVybiB0aGUgY2Fub25pY2FsIHBhdGggb2YgdGhlIHNwZWNpZmllZCBmaWxlbmFtZSwgZWxpbWluYXRpbmcgYW55CiBzeW1ib2xpYyBsaW5rcyBlbmNvdW50ZXJlZCBpbiB0aGUgcGF0aC4iIiIKLSAgICBpZiBpc2FicyhmaWxlbmFtZSk6Ci0gICAgICAgIGJpdHMgPSBbJy8nXSArIGZpbGVuYW1lLnNwbGl0KCcvJylbMTpdCi0gICAgZWxzZToKLSAgICAgICAgYml0cyA9IFsnJ10gKyBmaWxlbmFtZS5zcGxpdCgnLycpCisgICAgcGF0aCwgb2sgPSBfam9pbnJlYWxwYXRoKCcnLCBmaWxlbmFtZSwge30pCisgICAgcmV0dXJuIGFic3BhdGgocGF0aCkKIAotICAgIGZvciBpIGluIHJhbmdlKDIsIGxlbihiaXRzKSsxKToKLSAgICAgICAgY29tcG9uZW50ID0gam9pbigqYml0c1swOmldKQotICAgICAgICAjIFJlc29sdmUgc3ltYm9saWMgbGlua3MuCi0gICAgICAgIGlmIGlzbGluayhjb21wb25lbnQpOgotICAgICAgICAgICAgcmVzb2x2ZWQgPSBfcmVzb2x2ZV9saW5rKGNvbXBvbmVudCkKLSAgICAgICAgICAgIGlmIHJlc29sdmVkIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgIyBJbmZpbml0ZSBsb29wIC0tIHJldHVybiBvcmlnaW5hbCBjb21wb25lbnQgKyByZXN0IG9mIHRoZSBwYXRoCi0gICAgICAgICAgICAgICAgcmV0dXJuIGFic3BhdGgoam9pbigqKFtjb21wb25lbnRdICsgYml0c1tpOl0pKSkKKyMgSm9pbiB0d28gcGF0aHMsIG5vcm1hbGl6aW5nIGFuZyBlbGltaW5hdGluZyBhbnkgc3ltYm9saWMgbGlua3MKKyMgZW5jb3VudGVyZWQgaW4gdGhlIHNlY29uZCBwYXRoLgorZGVmIF9qb2lucmVhbHBhdGgocGF0aCwgcmVzdCwgc2Vlbik6CisgICAgaWYgaXNhYnMocmVzdCk6CisgICAgICAgIHJlc3QgPSByZXN0WzE6XQorICAgICAgICBwYXRoID0gc2VwCisKKyAgICB3aGlsZSByZXN0OgorICAgICAgICBuYW1lLCBfLCByZXN0ID0gcmVzdC5wYXJ0aXRpb24oc2VwKQorICAgICAgICBpZiBub3QgbmFtZSBvciBuYW1lID09IGN1cmRpcjoKKyAgICAgICAgICAgICMgY3VycmVudCBkaXIKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIG5hbWUgPT0gcGFyZGlyOgorICAgICAgICAgICAgIyBwYXJlbnQgZGlyCisgICAgICAgICAgICBpZiBwYXRoOgorICAgICAgICAgICAgICAgIHBhdGgsIG5hbWUgPSBzcGxpdChwYXRoKQorICAgICAgICAgICAgICAgIGlmIG5hbWUgPT0gcGFyZGlyOgorICAgICAgICAgICAgICAgICAgICBwYXRoID0gam9pbihwYXRoLCBwYXJkaXIsIHBhcmRpcikKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgbmV3cGF0aCA9IGpvaW4oKihbcmVzb2x2ZWRdICsgYml0c1tpOl0pKQotICAgICAgICAgICAgICAgIHJldHVybiByZWFscGF0aChuZXdwYXRoKQorICAgICAgICAgICAgICAgIHBhdGggPSBwYXJkaXIKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIG5ld3BhdGggPSBqb2luKHBhdGgsIG5hbWUpCisgICAgICAgIGlmIG5vdCBpc2xpbmsobmV3cGF0aCk6CisgICAgICAgICAgICBwYXRoID0gbmV3cGF0aAorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgIyBSZXNvbHZlIHRoZSBzeW1ib2xpYyBsaW5rCisgICAgICAgIGlmIG5ld3BhdGggaW4gc2VlbjoKKyAgICAgICAgICAgICMgQWxyZWFkeSBzZWVuIHRoaXMgcGF0aAorICAgICAgICAgICAgcGF0aCA9IHNlZW5bbmV3cGF0aF0KKyAgICAgICAgICAgIGlmIHBhdGggaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgIyB1c2UgY2FjaGVkIHZhbHVlCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICMgVGhlIHN5bWxpbmsgaXMgbm90IHJlc29sdmVkLCBzbyB3ZSBtdXN0IGhhdmUgYSBzeW1saW5rIGxvb3AuCisgICAgICAgICAgICAjIFJldHVybiBhbHJlYWR5IHJlc29sdmVkIHBhcnQgKyByZXN0IG9mIHRoZSBwYXRoIHVuY2hhbmdlZC4KKyAgICAgICAgICAgIHJldHVybiBqb2luKG5ld3BhdGgsIHJlc3QpLCBGYWxzZQorICAgICAgICBzZWVuW25ld3BhdGhdID0gTm9uZSAjIG5vdCByZXNvbHZlZCBzeW1saW5rCisgICAgICAgIHBhdGgsIG9rID0gX2pvaW5yZWFscGF0aChwYXRoLCBvcy5yZWFkbGluayhuZXdwYXRoKSwgc2VlbikKKyAgICAgICAgaWYgbm90IG9rOgorICAgICAgICAgICAgcmV0dXJuIGpvaW4ocGF0aCwgcmVzdCksIEZhbHNlCisgICAgICAgIHNlZW5bbmV3cGF0aF0gPSBwYXRoICMgcmVzb2x2ZWQgc3ltbGluawogCi0gICAgcmV0dXJuIGFic3BhdGgoZmlsZW5hbWUpCisgICAgcmV0dXJuIHBhdGgsIFRydWUKIAogCi1kZWYgX3Jlc29sdmVfbGluayhwYXRoKToKLSAgICAiIiJJbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb24uICBUYWtlcyBhIHBhdGggYW5kIGZvbGxvd3Mgc3ltbGlua3MKLSAgICB1bnRpbCB3ZSBlaXRoZXIgYXJyaXZlIGF0IHNvbWV0aGluZyB0aGF0IGlzbid0IGEgc3ltbGluaywgb3IKLSAgICBlbmNvdW50ZXIgYSBwYXRoIHdlJ3ZlIHNlZW4gYmVmb3JlIChtZWFuaW5nIHRoYXQgdGhlcmUncyBhIGxvb3ApLgotICAgICIiIgotICAgIHBhdGhzX3NlZW4gPSBzZXQoKQotICAgIHdoaWxlIGlzbGluayhwYXRoKToKLSAgICAgICAgaWYgcGF0aCBpbiBwYXRoc19zZWVuOgotICAgICAgICAgICAgIyBBbHJlYWR5IHNlZW4gdGhpcyBwYXRoLCBzbyB3ZSBtdXN0IGhhdmUgYSBzeW1saW5rIGxvb3AKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgIHBhdGhzX3NlZW4uYWRkKHBhdGgpCi0gICAgICAgICMgUmVzb2x2ZSB3aGVyZSB0aGUgbGluayBwb2ludHMgdG8KLSAgICAgICAgcmVzb2x2ZWQgPSBvcy5yZWFkbGluayhwYXRoKQotICAgICAgICBpZiBub3QgaXNhYnMocmVzb2x2ZWQpOgotICAgICAgICAgICAgZGlyID0gZGlybmFtZShwYXRoKQotICAgICAgICAgICAgcGF0aCA9IG5vcm1wYXRoKGpvaW4oZGlyLCByZXNvbHZlZCkpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwYXRoID0gbm9ybXBhdGgocmVzb2x2ZWQpCi0gICAgcmV0dXJuIHBhdGgKLQogc3VwcG9ydHNfdW5pY29kZV9maWxlbmFtZXMgPSAoc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQogCiBkZWYgcmVscGF0aChwYXRoLCBzdGFydD1jdXJkaXIpOgpkaWZmIC0tZ2l0IGEvTGliL3BwcmludC5weSBiL0xpYi9wcHJpbnQucHkKaW5kZXggOTEwMjgzZS4uNzdmMmE1NiAxMDA2NDQKLS0tIGEvTGliL3BwcmludC5weQorKysgYi9MaWIvcHByaW50LnB5CkBAIC0zNyw3ICszNywxMCBAQAogaW1wb3J0IHN5cyBhcyBfc3lzCiBpbXBvcnQgd2FybmluZ3MKIAotZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPIGFzIF9TdHJpbmdJTwordHJ5OgorICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTyBhcyBfU3RyaW5nSU8KK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTyBhcyBfU3RyaW5nSU8KIAogX19hbGxfXyA9IFsicHByaW50IiwicGZvcm1hdCIsImlzcmVhZGFibGUiLCJpc3JlY3Vyc2l2ZSIsInNhZmVyZXByIiwKICAgICAgICAgICAgIlByZXR0eVByaW50ZXIiXQpAQCAtMTgyLDI1ICsxODUsMTggQEAKICAgICAgICAgICAgIGlmIGlzc3ViY2xhc3ModHlwLCBsaXN0KToKICAgICAgICAgICAgICAgICB3cml0ZSgnWycpCiAgICAgICAgICAgICAgICAgZW5kY2hhciA9ICddJwotICAgICAgICAgICAgZWxpZiBpc3N1YmNsYXNzKHR5cCwgc2V0KToKLSAgICAgICAgICAgICAgICBpZiBub3QgbGVuZ3RoOgotICAgICAgICAgICAgICAgICAgICB3cml0ZSgnc2V0KCknKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICB3cml0ZSgnc2V0KFsnKQotICAgICAgICAgICAgICAgIGVuZGNoYXIgPSAnXSknCi0gICAgICAgICAgICAgICAgb2JqZWN0ID0gX3NvcnRlZChvYmplY3QpCi0gICAgICAgICAgICAgICAgaW5kZW50ICs9IDQKLSAgICAgICAgICAgIGVsaWYgaXNzdWJjbGFzcyh0eXAsIGZyb3plbnNldCk6Ci0gICAgICAgICAgICAgICAgaWYgbm90IGxlbmd0aDoKLSAgICAgICAgICAgICAgICAgICAgd3JpdGUoJ2Zyb3plbnNldCgpJykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgd3JpdGUoJ2Zyb3plbnNldChbJykKLSAgICAgICAgICAgICAgICBlbmRjaGFyID0gJ10pJwotICAgICAgICAgICAgICAgIG9iamVjdCA9IF9zb3J0ZWQob2JqZWN0KQotICAgICAgICAgICAgICAgIGluZGVudCArPSAxMAotICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVsaWYgaXNzdWJjbGFzcyh0eXAsIHR1cGxlKToKICAgICAgICAgICAgICAgICB3cml0ZSgnKCcpCiAgICAgICAgICAgICAgICAgZW5kY2hhciA9ICcpJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBub3QgbGVuZ3RoOgorICAgICAgICAgICAgICAgICAgICB3cml0ZShyZXApCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIHdyaXRlKHR5cC5fX25hbWVfXykKKyAgICAgICAgICAgICAgICB3cml0ZSgnKFsnKQorICAgICAgICAgICAgICAgIGVuZGNoYXIgPSAnXSknCisgICAgICAgICAgICAgICAgaW5kZW50ICs9IGxlbih0eXAuX19uYW1lX18pICsgMQorICAgICAgICAgICAgICAgIG9iamVjdCA9IF9zb3J0ZWQob2JqZWN0KQogICAgICAgICAgICAgaWYgc2VsZi5faW5kZW50X3Blcl9sZXZlbCA+IDEgYW5kIHNlcExpbmVzOgogICAgICAgICAgICAgICAgIHdyaXRlKChzZWxmLl9pbmRlbnRfcGVyX2xldmVsIC0gMSkgKiAnICcpCiAgICAgICAgICAgICBpZiBsZW5ndGg6CmRpZmYgLS1naXQgYS9MaWIvcHN0YXRzLnB5IGIvTGliL3BzdGF0cy5weQppbmRleCAzZGM2MWQ2Li40MzM4OTk0IDEwMDY0NAotLS0gYS9MaWIvcHN0YXRzLnB5CisrKyBiL0xpYi9wc3RhdHMucHkKQEAgLTEyMCw4ICsxMjAsOCBAQAogICAgICAgICAgICAgc2VsZi5zdGF0cyA9IGFyZy5zdGF0cwogICAgICAgICAgICAgYXJnLnN0YXRzID0ge30KICAgICAgICAgaWYgbm90IHNlbGYuc3RhdHM6Ci0gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICAiQ2Fubm90IGNyZWF0ZSBvciBjb25zdHJ1Y3QgYSAlciBvYmplY3QgZnJvbSAnJXInJyIgJSAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXywgYXJnKQorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJDYW5ub3QgY3JlYXRlIG9yIGNvbnN0cnVjdCBhICVyIG9iamVjdCBmcm9tICVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHNlbGYuX19jbGFzc19fLCBhcmcpKQogICAgICAgICByZXR1cm4KIAogICAgIGRlZiBnZXRfdG9wX2xldmVsX3N0YXRzKHNlbGYpOgpAQCAtMTcyLDE1ICsxNzIsMTkgQEAKICAgICAjIGFsb25nIHdpdGggc29tZSBwcmludGFibGUgZGVzY3JpcHRpb24KICAgICBzb3J0X2FyZ19kaWN0X2RlZmF1bHQgPSB7CiAgICAgICAgICAgICAgICJjYWxscyIgICAgIDogKCgoMSwtMSksICAgICAgICAgICAgICApLCAiY2FsbCBjb3VudCIpLAorICAgICAgICAgICAgICAibmNhbGxzIiAgICA6ICgoKDEsLTEpLCAgICAgICAgICAgICAgKSwgImNhbGwgY291bnQiKSwKKyAgICAgICAgICAgICAgImN1bXRpbWUiICAgOiAoKCgzLC0xKSwgICAgICAgICAgICAgICksICJjdW11bGF0aXZlIHRpbWUiKSwKICAgICAgICAgICAgICAgImN1bXVsYXRpdmUiOiAoKCgzLC0xKSwgICAgICAgICAgICAgICksICJjdW11bGF0aXZlIHRpbWUiKSwKICAgICAgICAgICAgICAgImZpbGUiICAgICAgOiAoKCg0LCAxKSwgICAgICAgICAgICAgICksICJmaWxlIG5hbWUiKSwKKyAgICAgICAgICAgICAgImZpbGVuYW1lIiAgOiAoKCg0LCAxKSwgICAgICAgICAgICAgICksICJmaWxlIG5hbWUiKSwKICAgICAgICAgICAgICAgImxpbmUiICAgICAgOiAoKCg1LCAxKSwgICAgICAgICAgICAgICksICJsaW5lIG51bWJlciIpLAogICAgICAgICAgICAgICAibW9kdWxlIiAgICA6ICgoKDQsIDEpLCAgICAgICAgICAgICAgKSwgImZpbGUgbmFtZSIpLAogICAgICAgICAgICAgICAibmFtZSIgICAgICA6ICgoKDYsIDEpLCAgICAgICAgICAgICAgKSwgImZ1bmN0aW9uIG5hbWUiKSwKICAgICAgICAgICAgICAgIm5mbCIgICAgICAgOiAoKCg2LCAxKSwoNCwgMSksKDUsIDEpLCksICJuYW1lL2ZpbGUvbGluZSIpLAotICAgICAgICAgICAgICAicGNhbGxzIiAgICA6ICgoKDAsLTEpLCAgICAgICAgICAgICAgKSwgImNhbGwgY291bnQiKSwKKyAgICAgICAgICAgICAgInBjYWxscyIgICAgOiAoKCgwLC0xKSwgICAgICAgICAgICAgICksICJwcmltaXRpdmUgY2FsbCBjb3VudCIpLAogICAgICAgICAgICAgICAic3RkbmFtZSIgICA6ICgoKDcsIDEpLCAgICAgICAgICAgICAgKSwgInN0YW5kYXJkIG5hbWUiKSwKICAgICAgICAgICAgICAgInRpbWUiICAgICAgOiAoKCgyLC0xKSwgICAgICAgICAgICAgICksICJpbnRlcm5hbCB0aW1lIiksCisgICAgICAgICAgICAgICJ0b3R0aW1lIiAgIDogKCgoMiwtMSksICAgICAgICAgICAgICApLCAiaW50ZXJuYWwgdGltZSIpLAogICAgICAgICAgICAgICB9CiAKICAgICBkZWYgZ2V0X3NvcnRfYXJnX2RlZnMoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvcHR5LnB5IGIvTGliL3B0eS5weQppbmRleCA5ZmQ0NzA5Li4wNWZmNjg2IDEwMDY0NAotLS0gYS9MaWIvcHR5LnB5CisrKyBiL0xpYi9wdHkucHkKQEAgLTE0MiwxNSArMTQyLDIxIEBACiAgICAgQ29waWVzCiAgICAgICAgICAgICBwdHkgbWFzdGVyIC0+IHN0YW5kYXJkIG91dHB1dCAgIChtYXN0ZXJfcmVhZCkKICAgICAgICAgICAgIHN0YW5kYXJkIGlucHV0IC0+IHB0eSBtYXN0ZXIgICAgKHN0ZGluX3JlYWQpIiIiCi0gICAgd2hpbGUgMToKLSAgICAgICAgcmZkcywgd2ZkcywgeGZkcyA9IHNlbGVjdCgKLSAgICAgICAgICAgICAgICBbbWFzdGVyX2ZkLCBTVERJTl9GSUxFTk9dLCBbXSwgW10pCisgICAgZmRzID0gW21hc3Rlcl9mZCwgU1RESU5fRklMRU5PXQorICAgIHdoaWxlIFRydWU6CisgICAgICAgIHJmZHMsIHdmZHMsIHhmZHMgPSBzZWxlY3QoZmRzLCBbXSwgW10pCiAgICAgICAgIGlmIG1hc3Rlcl9mZCBpbiByZmRzOgogICAgICAgICAgICAgZGF0YSA9IG1hc3Rlcl9yZWFkKG1hc3Rlcl9mZCkKLSAgICAgICAgICAgIG9zLndyaXRlKFNURE9VVF9GSUxFTk8sIGRhdGEpCisgICAgICAgICAgICBpZiBub3QgZGF0YTogICMgUmVhY2hlZCBFT0YuCisgICAgICAgICAgICAgICAgZmRzLnJlbW92ZShtYXN0ZXJfZmQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9zLndyaXRlKFNURE9VVF9GSUxFTk8sIGRhdGEpCiAgICAgICAgIGlmIFNURElOX0ZJTEVOTyBpbiByZmRzOgogICAgICAgICAgICAgZGF0YSA9IHN0ZGluX3JlYWQoU1RESU5fRklMRU5PKQotICAgICAgICAgICAgX3dyaXRlbihtYXN0ZXJfZmQsIGRhdGEpCisgICAgICAgICAgICBpZiBub3QgZGF0YToKKyAgICAgICAgICAgICAgICBmZHMucmVtb3ZlKFNURElOX0ZJTEVOTykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgX3dyaXRlbihtYXN0ZXJfZmQsIGRhdGEpCiAKIGRlZiBzcGF3bihhcmd2LCBtYXN0ZXJfcmVhZD1fcmVhZCwgc3RkaW5fcmVhZD1fcmVhZCk6CiAgICAgIiIiQ3JlYXRlIGEgc3Bhd25lZCBwcm9jZXNzLiIiIgpkaWZmIC0tZ2l0IGEvTGliL3B5X2NvbXBpbGUucHkgYi9MaWIvcHlfY29tcGlsZS5weQppbmRleCBkYzFjYWU5Li5jMGJjMWU0IDEwMDY0NAotLS0gYS9MaWIvcHlfY29tcGlsZS5weQorKysgYi9MaWIvcHlfY29tcGlsZS5weQpAQCAtMTEyLDcgKzExMiw3IEBACiAgICAgdHJ5OgogICAgICAgICBjb2Rlb2JqZWN0ID0gX19idWlsdGluX18uY29tcGlsZShjb2Rlc3RyaW5nLCBkZmlsZSBvciBmaWxlLCdleGVjJykKICAgICBleGNlcHQgRXhjZXB0aW9uLGVycjoKLSAgICAgICAgcHlfZXhjID0gUHlDb21waWxlRXJyb3IoZXJyLl9fY2xhc3NfXyxlcnIuYXJncyxkZmlsZSBvciBmaWxlKQorICAgICAgICBweV9leGMgPSBQeUNvbXBpbGVFcnJvcihlcnIuX19jbGFzc19fLCBlcnIsIGRmaWxlIG9yIGZpbGUpCiAgICAgICAgIGlmIGRvcmFpc2U6CiAgICAgICAgICAgICByYWlzZSBweV9leGMKICAgICAgICAgZWxzZToKZGlmZiAtLWdpdCBhL0xpYi9weWNsYnIucHkgYi9MaWIvcHljbGJyLnB5CmluZGV4IDk3Zjc0ZjEuLmI4ZjcxYWUgMTAwNjQ0Ci0tLSBhL0xpYi9weWNsYnIucHkKKysrIGIvTGliL3B5Y2xici5weQpAQCAtMTI4LDYgKzEyOCw4IEBACiAgICAgICAgIHBhcmVudCA9IF9yZWFkbW9kdWxlKHBhY2thZ2UsIHBhdGgsIGlucGFja2FnZSkKICAgICAgICAgaWYgaW5wYWNrYWdlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgcGFja2FnZSA9ICIlcy4lcyIgJSAoaW5wYWNrYWdlLCBwYWNrYWdlKQorICAgICAgICBpZiBub3QgJ19fcGF0aF9fJyBpbiBwYXJlbnQ6CisgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcignTm8gcGFja2FnZSBuYW1lZCB7fScuZm9ybWF0KHBhY2thZ2UpKQogICAgICAgICByZXR1cm4gX3JlYWRtb2R1bGUoc3VibW9kdWxlLCBwYXJlbnRbJ19fcGF0aF9fJ10sIHBhY2thZ2UpCiAKICAgICAjIFNlYXJjaCB0aGUgcGF0aCBmb3IgdGhlIG1vZHVsZQpkaWZmIC0tZ2l0IGEvTGliL3B5ZG9jLnB5IGIvTGliL3B5ZG9jLnB5CmluZGV4IGQ1NTc3OTAuLjIxOGZkMzAgMTAwNzU1Ci0tLSBhL0xpYi9weWRvYy5weQorKysgYi9MaWIvcHlkb2MucHkKQEAgLTgxLDYgKzgxLDcgQEAKIGRlZiBnZXRkb2Mob2JqZWN0KToKICAgICAiIiJHZXQgdGhlIGRvYyBzdHJpbmcgb3IgY29tbWVudHMgZm9yIGFuIG9iamVjdC4iIiIKICAgICByZXN1bHQgPSBpbnNwZWN0LmdldGRvYyhvYmplY3QpIG9yIGluc3BlY3QuZ2V0Y29tbWVudHMob2JqZWN0KQorICAgIHJlc3VsdCA9IF9lbmNvZGUocmVzdWx0KQogICAgIHJldHVybiByZXN1bHQgYW5kIHJlLnN1YignXiAqXG4nLCAnJywgcnN0cmlwKHJlc3VsdCkpIG9yICcnCiAKIGRlZiBzcGxpdGRvYyhkb2MpOgpAQCAtMTgyLDYgKzE4MywzNiBAQAogICAgICAgICByZXR1cm4gbmFtZSwga2luZCwgY2xzLCB2YWx1ZQogICAgIHJldHVybiBtYXAoZml4dXAsIGluc3BlY3QuY2xhc3NpZnlfY2xhc3NfYXR0cnMob2JqZWN0KSkKIAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVbmljb2RlIHN1cHBvcnQgaGVscGVycworCit0cnk6CisgICAgX3VuaWNvZGUgPSB1bmljb2RlCitleGNlcHQgTmFtZUVycm9yOgorICAgICMgSWYgUHl0aG9uIGlzIGJ1aWx0IHdpdGhvdXQgVW5pY29kZSBzdXBwb3J0LCB0aGUgdW5pY29kZSB0eXBlCisgICAgIyB3aWxsIG5vdCBleGlzdC4gRmFrZSBvbmUgdGhhdCBub3RoaW5nIHdpbGwgbWF0Y2gsIGFuZCBtYWtlCisgICAgIyB0aGUgX2VuY29kZSBmdW5jdGlvbiB0aGF0IGRvIG5vdGhpbmcuCisgICAgY2xhc3MgX3VuaWNvZGUob2JqZWN0KToKKyAgICAgICAgcGFzcworICAgIF9lbmNvZGluZyA9ICdhc2NpaScKKyAgICBkZWYgX2VuY29kZSh0ZXh0LCBlbmNvZGluZz0nYXNjaWknKToKKyAgICAgICAgcmV0dXJuIHRleHQKK2Vsc2U6CisgICAgaW1wb3J0IGxvY2FsZQorICAgIF9lbmNvZGluZyA9IGxvY2FsZS5nZXRwcmVmZXJyZWRlbmNvZGluZygpCisKKyAgICBkZWYgX2VuY29kZSh0ZXh0LCBlbmNvZGluZz1Ob25lKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh0ZXh0LCB1bmljb2RlKToKKyAgICAgICAgICAgIHJldHVybiB0ZXh0LmVuY29kZShlbmNvZGluZyBvciBfZW5jb2RpbmcsICd4bWxjaGFycmVmcmVwbGFjZScpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gdGV4dAorCitkZWYgX2JpbnN0cihvYmopOgorICAgICMgRW5zdXJlIHRoYXQgd2UgaGF2ZSBhbiBlbmNvZGVkIChiaW5hcnkpIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvYmosCisgICAgIyBldmVuIGlmIGl0IGlzIGEgdW5pY29kZSBzdHJpbmcuCisgICAgaWYgaXNpbnN0YW5jZShvYmosIF91bmljb2RlKToKKyAgICAgICAgcmV0dXJuIG9iai5lbmNvZGUoX2VuY29kaW5nLCAneG1sY2hhcnJlZnJlcGxhY2UnKQorICAgIHJldHVybiBzdHIob2JqKQorCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1vZHVsZSBtYW5pcHVsYXRpb24KIAogZGVmIGlzcGFja2FnZShwYXRoKToKQEAgLTQyNCwxMiArNDU1LDEzIEBACiAKICAgICBkZWYgcGFnZShzZWxmLCB0aXRsZSwgY29udGVudHMpOgogICAgICAgICAiIiJGb3JtYXQgYW4gSFRNTCBwYWdlLiIiIgotICAgICAgICByZXR1cm4gJycnCisgICAgICAgIHJldHVybiBfZW5jb2RlKCcnJwogPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KIDxodG1sPjxoZWFkPjx0aXRsZT5QeXRob246ICVzPC90aXRsZT4KKzxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KIDwvaGVhZD48Ym9keSBiZ2NvbG9yPSIjZjBmMGY4Ij4KICVzCi08L2JvZHk+PC9odG1sPicnJyAlICh0aXRsZSwgY29udGVudHMpCis8L2JvZHk+PC9odG1sPicnJyAlICh0aXRsZSwgY29udGVudHMpLCAnYXNjaWknKQogCiAgICAgZGVmIGhlYWRpbmcoc2VsZiwgdGl0bGUsIGZnY29sLCBiZ2NvbCwgZXh0cmFzPScnKToKICAgICAgICAgIiIiRm9ybWF0IGEgcGFnZSBoZWFkaW5nLiIiIgpAQCAtNTQ5LDEwICs1ODEsMTUgQEAKICAgICAgICAgICAgIGVsaWYgcGVwOgogICAgICAgICAgICAgICAgIHVybCA9ICdodHRwOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLSUwNGQvJyAlIGludChwZXApCiAgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoJzxhIGhyZWY9IiVzIj4lczwvYT4nICUgKHVybCwgZXNjYXBlKGFsbCkpKQorICAgICAgICAgICAgZWxpZiBzZWxmZG90OgorICAgICAgICAgICAgICAgICMgQ3JlYXRlIGEgbGluayBmb3IgbWV0aG9kcyBsaWtlICdzZWxmLm1ldGhvZCguLi4pJworICAgICAgICAgICAgICAgICMgYW5kIHVzZSA8c3Ryb25nPiBmb3IgYXR0cmlidXRlcyBsaWtlICdzZWxmLmF0dHInCisgICAgICAgICAgICAgICAgaWYgdGV4dFtlbmQ6ZW5kKzFdID09ICcoJzoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoJ3NlbGYuJyArIHNlbGYubmFtZWxpbmsobmFtZSwgbWV0aG9kcykpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoJ3NlbGYuPHN0cm9uZz4lczwvc3Ryb25nPicgJSBuYW1lKQogICAgICAgICAgICAgZWxpZiB0ZXh0W2VuZDplbmQrMV0gPT0gJygnOgogICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKHNlbGYubmFtZWxpbmsobmFtZSwgbWV0aG9kcywgZnVuY3MsIGNsYXNzZXMpKQotICAgICAgICAgICAgZWxpZiBzZWxmZG90OgotICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCdzZWxmLjxzdHJvbmc+JXM8L3N0cm9uZz4nICUgbmFtZSkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoc2VsZi5uYW1lbGluayhuYW1lLCBjbGFzc2VzKSkKICAgICAgICAgICAgIGhlcmUgPSBlbmQKQEAgLTYwNiwxMiArNjQzLDEyIEBACiAgICAgICAgICAgICBmaWxlbGluayA9ICcoYnVpbHQtaW4pJwogICAgICAgICBpbmZvID0gW10KICAgICAgICAgaWYgaGFzYXR0cihvYmplY3QsICdfX3ZlcnNpb25fXycpOgotICAgICAgICAgICAgdmVyc2lvbiA9IHN0cihvYmplY3QuX192ZXJzaW9uX18pCisgICAgICAgICAgICB2ZXJzaW9uID0gX2JpbnN0cihvYmplY3QuX192ZXJzaW9uX18pCiAgICAgICAgICAgICBpZiB2ZXJzaW9uWzoxMV0gPT0gJyQnICsgJ1JldmlzaW9uOiAnIGFuZCB2ZXJzaW9uWy0xOl0gPT0gJyQnOgogICAgICAgICAgICAgICAgIHZlcnNpb24gPSBzdHJpcCh2ZXJzaW9uWzExOi0xXSkKICAgICAgICAgICAgIGluZm8uYXBwZW5kKCd2ZXJzaW9uICVzJyAlIHNlbGYuZXNjYXBlKHZlcnNpb24pKQogICAgICAgICBpZiBoYXNhdHRyKG9iamVjdCwgJ19fZGF0ZV9fJyk6Ci0gICAgICAgICAgICBpbmZvLmFwcGVuZChzZWxmLmVzY2FwZShzdHIob2JqZWN0Ll9fZGF0ZV9fKSkpCisgICAgICAgICAgICBpbmZvLmFwcGVuZChzZWxmLmVzY2FwZShfYmluc3RyKG9iamVjdC5fX2RhdGVfXykpKQogICAgICAgICBpZiBpbmZvOgogICAgICAgICAgICAgaGVhZCA9IGhlYWQgKyAnICglcyknICUgam9pbihpbmZvLCAnLCAnKQogICAgICAgICBkb2Nsb2MgPSBzZWxmLmdldGRvY2xvYyhvYmplY3QpCkBAIC02OTQsMTEgKzczMSwxMSBAQAogICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc2VsZi5iaWdzZWN0aW9uKAogICAgICAgICAgICAgICAgICdEYXRhJywgJyNmZmZmZmYnLCAnIzU1YWE1NScsIGpvaW4oY29udGVudHMsICc8YnI+XG4nKSkKICAgICAgICAgaWYgaGFzYXR0cihvYmplY3QsICdfX2F1dGhvcl9fJyk6Ci0gICAgICAgICAgICBjb250ZW50cyA9IHNlbGYubWFya3VwKHN0cihvYmplY3QuX19hdXRob3JfXyksIHNlbGYucHJlZm9ybWF0KQorICAgICAgICAgICAgY29udGVudHMgPSBzZWxmLm1hcmt1cChfYmluc3RyKG9iamVjdC5fX2F1dGhvcl9fKSwgc2VsZi5wcmVmb3JtYXQpCiAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBzZWxmLmJpZ3NlY3Rpb24oCiAgICAgICAgICAgICAgICAgJ0F1dGhvcicsICcjZmZmZmZmJywgJyM3Nzk5ZWUnLCBjb250ZW50cykKICAgICAgICAgaWYgaGFzYXR0cihvYmplY3QsICdfX2NyZWRpdHNfXycpOgotICAgICAgICAgICAgY29udGVudHMgPSBzZWxmLm1hcmt1cChzdHIob2JqZWN0Ll9fY3JlZGl0c19fKSwgc2VsZi5wcmVmb3JtYXQpCisgICAgICAgICAgICBjb250ZW50cyA9IHNlbGYubWFya3VwKF9iaW5zdHIob2JqZWN0Ll9fY3JlZGl0c19fKSwgc2VsZi5wcmVmb3JtYXQpCiAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBzZWxmLmJpZ3NlY3Rpb24oCiAgICAgICAgICAgICAgICAgJ0NyZWRpdHMnLCAnI2ZmZmZmZicsICcjNzc5OWVlJywgY29udGVudHMpCiAKQEAgLTc0MCw4ICs3NzcsMTUgQEAKICAgICAgICAgICAgICAgICBoci5tYXliZSgpCiAgICAgICAgICAgICAgICAgcHVzaChtc2cpCiAgICAgICAgICAgICAgICAgZm9yIG5hbWUsIGtpbmQsIGhvbWVjbHMsIHZhbHVlIGluIG9rOgotICAgICAgICAgICAgICAgICAgICBwdXNoKHNlbGYuZG9jdW1lbnQoZ2V0YXR0cihvYmplY3QsIG5hbWUpLCBuYW1lLCBtb2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcywgY2xhc3NlcywgbWRpY3QsIG9iamVjdCkpCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0YXR0cihvYmplY3QsIG5hbWUpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICAjIFNvbWUgZGVzY3JpcHRvcnMgbWF5IG1lZXQgYSBmYWlsdXJlIGluIHRoZWlyIF9fZ2V0X18uCisgICAgICAgICAgICAgICAgICAgICAgICAjIChidWcgIzE3ODUpCisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKHNlbGYuX2RvY2Rlc2NyaXB0b3IobmFtZSwgdmFsdWUsIG1vZCkpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKHNlbGYuZG9jdW1lbnQodmFsdWUsIG5hbWUsIG1vZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcywgY2xhc3NlcywgbWRpY3QsIG9iamVjdCkpCiAgICAgICAgICAgICAgICAgICAgIHB1c2goJ1xuJykKICAgICAgICAgICAgIHJldHVybiBhdHRycwogCkBAIC03ODEsNyArODI1LDEyIEBACiAgICAgICAgIG1kaWN0ID0ge30KICAgICAgICAgZm9yIGtleSwga2luZCwgaG9tZWNscywgdmFsdWUgaW4gYXR0cnM6CiAgICAgICAgICAgICBtZGljdFtrZXldID0gYW5jaG9yID0gJyMnICsgbmFtZSArICctJyArIGtleQotICAgICAgICAgICAgdmFsdWUgPSBnZXRhdHRyKG9iamVjdCwga2V5KQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0YXR0cihvYmplY3QsIG5hbWUpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICMgU29tZSBkZXNjcmlwdG9ycyBtYXkgbWVldCBhIGZhaWx1cmUgaW4gdGhlaXIgX19nZXRfXy4KKyAgICAgICAgICAgICAgICAjIChidWcgIzE3ODUpCisgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICMgVGhlIHZhbHVlIG1heSBub3QgYmUgaGFzaGFibGUgKGUuZy4sIGEgZGF0YSBhdHRyIHdpdGgKICAgICAgICAgICAgICAgICAjIGEgZGljdCBvciBsaXN0IHZhbHVlKS4KQEAgLTExMDQsMTYgKzExNTMsMTYgQEAKICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHNlbGYuc2VjdGlvbignREFUQScsIGpvaW4oY29udGVudHMsICdcbicpKQogCiAgICAgICAgIGlmIGhhc2F0dHIob2JqZWN0LCAnX192ZXJzaW9uX18nKToKLSAgICAgICAgICAgIHZlcnNpb24gPSBzdHIob2JqZWN0Ll9fdmVyc2lvbl9fKQorICAgICAgICAgICAgdmVyc2lvbiA9IF9iaW5zdHIob2JqZWN0Ll9fdmVyc2lvbl9fKQogICAgICAgICAgICAgaWYgdmVyc2lvbls6MTFdID09ICckJyArICdSZXZpc2lvbjogJyBhbmQgdmVyc2lvblstMTpdID09ICckJzoKICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gc3RyaXAodmVyc2lvblsxMTotMV0pCiAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBzZWxmLnNlY3Rpb24oJ1ZFUlNJT04nLCB2ZXJzaW9uKQogICAgICAgICBpZiBoYXNhdHRyKG9iamVjdCwgJ19fZGF0ZV9fJyk6Ci0gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBzZWxmLnNlY3Rpb24oJ0RBVEUnLCBzdHIob2JqZWN0Ll9fZGF0ZV9fKSkKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHNlbGYuc2VjdGlvbignREFURScsIF9iaW5zdHIob2JqZWN0Ll9fZGF0ZV9fKSkKICAgICAgICAgaWYgaGFzYXR0cihvYmplY3QsICdfX2F1dGhvcl9fJyk6Ci0gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBzZWxmLnNlY3Rpb24oJ0FVVEhPUicsIHN0cihvYmplY3QuX19hdXRob3JfXykpCisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBzZWxmLnNlY3Rpb24oJ0FVVEhPUicsIF9iaW5zdHIob2JqZWN0Ll9fYXV0aG9yX18pKQogICAgICAgICBpZiBoYXNhdHRyKG9iamVjdCwgJ19fY3JlZGl0c19fJyk6Ci0gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBzZWxmLnNlY3Rpb24oJ0NSRURJVFMnLCBzdHIob2JqZWN0Ll9fY3JlZGl0c19fKSkKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHNlbGYuc2VjdGlvbignQ1JFRElUUycsIF9iaW5zdHIob2JqZWN0Ll9fY3JlZGl0c19fKSkKICAgICAgICAgcmV0dXJuIHJlc3VsdAogCiAgICAgZGVmIGRvY2NsYXNzKHNlbGYsIG9iamVjdCwgbmFtZT1Ob25lLCBtb2Q9Tm9uZSwgKmlnbm9yZWQpOgpAQCAtMTE2MSw4ICsxMjEwLDE1IEBACiAgICAgICAgICAgICAgICAgaHIubWF5YmUoKQogICAgICAgICAgICAgICAgIHB1c2gobXNnKQogICAgICAgICAgICAgICAgIGZvciBuYW1lLCBraW5kLCBob21lY2xzLCB2YWx1ZSBpbiBvazoKLSAgICAgICAgICAgICAgICAgICAgcHVzaChzZWxmLmRvY3VtZW50KGdldGF0dHIob2JqZWN0LCBuYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIG1vZCwgb2JqZWN0KSkKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRhdHRyKG9iamVjdCwgbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgU29tZSBkZXNjcmlwdG9ycyBtYXkgbWVldCBhIGZhaWx1cmUgaW4gdGhlaXIgX19nZXRfXy4KKyAgICAgICAgICAgICAgICAgICAgICAgICMgKGJ1ZyAjMTc4NSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goc2VsZi5fZG9jZGVzY3JpcHRvcihuYW1lLCB2YWx1ZSwgbW9kKSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goc2VsZi5kb2N1bWVudCh2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBtb2QsIG9iamVjdCkpCiAgICAgICAgICAgICByZXR1cm4gYXR0cnMKIAogICAgICAgICBkZWYgc3BpbGxkZXNjcmlwdG9ycyhtc2csIGF0dHJzLCBwcmVkaWNhdGUpOgpAQCAtMTMyMSw2ICsxMzc3LDggQEAKICAgICAiIiJEZWNpZGUgd2hhdCBtZXRob2QgdG8gdXNlIGZvciBwYWdpbmcgdGhyb3VnaCB0ZXh0LiIiIgogICAgIGlmIHR5cGUoc3lzLnN0ZG91dCkgaXMgbm90IHR5cGVzLkZpbGVUeXBlOgogICAgICAgICByZXR1cm4gcGxhaW5wYWdlcgorICAgIGlmIG5vdCBoYXNhdHRyKHN5cy5zdGRpbiwgImlzYXR0eSIpOgorICAgICAgICByZXR1cm4gcGxhaW5wYWdlcgogICAgIGlmIG5vdCBzeXMuc3RkaW4uaXNhdHR5KCkgb3Igbm90IHN5cy5zdGRvdXQuaXNhdHR5KCk6CiAgICAgICAgIHJldHVybiBwbGFpbnBhZ2VyCiAgICAgaWYgJ1BBR0VSJyBpbiBvcy5lbnZpcm9uOgpAQCAtMTM1Niw3ICsxNDE0LDcgQEAKICAgICAiIiJQYWdlIHRocm91Z2ggdGV4dCBieSBmZWVkaW5nIGl0IHRvIGFub3RoZXIgcHJvZ3JhbS4iIiIKICAgICBwaXBlID0gb3MucG9wZW4oY21kLCAndycpCiAgICAgdHJ5OgotICAgICAgICBwaXBlLndyaXRlKHRleHQpCisgICAgICAgIHBpcGUud3JpdGUoX2VuY29kZSh0ZXh0KSkKICAgICAgICAgcGlwZS5jbG9zZSgpCiAgICAgZXhjZXB0IElPRXJyb3I6CiAgICAgICAgIHBhc3MgIyBJZ25vcmUgYnJva2VuIHBpcGVzIGNhdXNlZCBieSBxdWl0dGluZyB0aGUgcGFnZXIgcHJvZ3JhbS4KQEAgLTEzNjYsNyArMTQyNCw3IEBACiAgICAgaW1wb3J0IHRlbXBmaWxlCiAgICAgZmlsZW5hbWUgPSB0ZW1wZmlsZS5ta3RlbXAoKQogICAgIGZpbGUgPSBvcGVuKGZpbGVuYW1lLCAndycpCi0gICAgZmlsZS53cml0ZSh0ZXh0KQorICAgIGZpbGUud3JpdGUoX2VuY29kZSh0ZXh0KSkKICAgICBmaWxlLmNsb3NlKCkKICAgICB0cnk6CiAgICAgICAgIG9zLnN5c3RlbShjbWQgKyAnICInICsgZmlsZW5hbWUgKyAnIicpCkBAIC0xMzc1LDcgKzE0MzMsNyBAQAogCiBkZWYgdHR5cGFnZXIodGV4dCk6CiAgICAgIiIiUGFnZSB0aHJvdWdoIHRleHQgb24gYSB0ZXh0IHRlcm1pbmFsLiIiIgotICAgIGxpbmVzID0gc3BsaXQocGxhaW4odGV4dCksICdcbicpCisgICAgbGluZXMgPSBwbGFpbihfZW5jb2RlKHBsYWluKHRleHQpLCBnZXRhdHRyKHN5cy5zdGRvdXQsICdlbmNvZGluZycsIF9lbmNvZGluZykpKS5zcGxpdCgnXG4nKQogICAgIHRyeToKICAgICAgICAgaW1wb3J0IHR0eQogICAgICAgICBmZCA9IHN5cy5zdGRpbi5maWxlbm8oKQpAQCAtMTQxMyw3ICsxNDcxLDcgQEAKIAogZGVmIHBsYWlucGFnZXIodGV4dCk6CiAgICAgIiIiU2ltcGx5IHByaW50IHVuZm9ybWF0dGVkIHRleHQuICBUaGlzIGlzIHRoZSB1bHRpbWF0ZSBmYWxsYmFjay4iIiIKLSAgICBzeXMuc3Rkb3V0LndyaXRlKHBsYWluKHRleHQpKQorICAgIHN5cy5zdGRvdXQud3JpdGUoX2VuY29kZShwbGFpbih0ZXh0KSwgZ2V0YXR0cihzeXMuc3Rkb3V0LCAnZW5jb2RpbmcnLCBfZW5jb2RpbmcpKSkKIAogZGVmIGRlc2NyaWJlKHRoaW5nKToKICAgICAiIiJQcm9kdWNlIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIGdpdmVuIHRoaW5nLiIiIgpAQCAtMTQ3OSw3ICsxNTM3LDggQEAKICAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yLCAnbm8gUHl0aG9uIGRvY3VtZW50YXRpb24gZm91bmQgZm9yICVyJyAlIHRoaW5nCiAgICAgICAgIHJldHVybiBvYmplY3QsIHRoaW5nCiAgICAgZWxzZToKLSAgICAgICAgcmV0dXJuIHRoaW5nLCBnZXRhdHRyKHRoaW5nLCAnX19uYW1lX18nLCBOb25lKQorICAgICAgICBuYW1lID0gZ2V0YXR0cih0aGluZywgJ19fbmFtZV9fJywgTm9uZSkKKyAgICAgICAgcmV0dXJuIHRoaW5nLCBuYW1lIGlmIGlzaW5zdGFuY2UobmFtZSwgc3RyKSBlbHNlIE5vbmUKIAogZGVmIHJlbmRlcl9kb2ModGhpbmcsIHRpdGxlPSdQeXRob24gTGlicmFyeSBEb2N1bWVudGF0aW9uOiAlcycsIGZvcmNlbG9hZD0wKToKICAgICAiIiJSZW5kZXIgdGV4dCBkb2N1bWVudGF0aW9uLCBnaXZlbiBhbiBvYmplY3Qgb3IgYSBwYXRoIHRvIGFuIG9iamVjdC4iIiIKQEAgLTE3ODAsNyArMTgzOSw3IEBACiBXZWxjb21lIHRvIFB5dGhvbiAlcyEgIFRoaXMgaXMgdGhlIG9ubGluZSBoZWxwIHV0aWxpdHkuCiAKIElmIHRoaXMgaXMgeW91ciBmaXJzdCB0aW1lIHVzaW5nIFB5dGhvbiwgeW91IHNob3VsZCBkZWZpbml0ZWx5IGNoZWNrIG91dAotdGhlIHR1dG9yaWFsIG9uIHRoZSBJbnRlcm5ldCBhdCBodHRwOi8vZG9jcy5weXRob24ub3JnL3R1dG9yaWFsLy4KK3RoZSB0dXRvcmlhbCBvbiB0aGUgSW50ZXJuZXQgYXQgaHR0cDovL2RvY3MucHl0aG9uLm9yZy8lcy90dXRvcmlhbC8uCiAKIEVudGVyIHRoZSBuYW1lIG9mIGFueSBtb2R1bGUsIGtleXdvcmQsIG9yIHRvcGljIHRvIGdldCBoZWxwIG9uIHdyaXRpbmcKIFB5dGhvbiBwcm9ncmFtcyBhbmQgdXNpbmcgUHl0aG9uIG1vZHVsZXMuICBUbyBxdWl0IHRoaXMgaGVscCB1dGlsaXR5IGFuZApAQCAtMTc5MCw3ICsxODQ5LDcgQEAKICJrZXl3b3JkcyIsIG9yICJ0b3BpY3MiLiAgRWFjaCBtb2R1bGUgYWxzbyBjb21lcyB3aXRoIGEgb25lLWxpbmUgc3VtbWFyeQogb2Ygd2hhdCBpdCBkb2VzOyB0byBsaXN0IHRoZSBtb2R1bGVzIHdob3NlIHN1bW1hcmllcyBjb250YWluIGEgZ2l2ZW4gd29yZAogc3VjaCBhcyAic3BhbSIsIHR5cGUgIm1vZHVsZXMgc3BhbSIuCi0nJycgJSBzeXMudmVyc2lvbls6M10pCisnJycgJSB0dXBsZShbc3lzLnZlcnNpb25bOjNdXSoyKSkKIAogICAgIGRlZiBsaXN0KHNlbGYsIGl0ZW1zLCBjb2x1bW5zPTQsIHdpZHRoPTgwKToKICAgICAgICAgaXRlbXMgPSBpdGVtc1s6XQpkaWZmIC0tZ2l0IGEvTGliL3B5ZG9jX2RhdGEvdG9waWNzLnB5IGIvTGliL3B5ZG9jX2RhdGEvdG9waWNzLnB5CmluZGV4IGIxNTg5YmEuLmJmODQ3MzEgMTAwNjQ0Ci0tLSBhL0xpYi9weWRvY19kYXRhL3RvcGljcy5weQorKysgYi9MaWIvcHlkb2NfZGF0YS90b3BpY3MucHkKQEAgLTEsODMgKzEsNzkgQEAKLSMgQXV0b2dlbmVyYXRlZCBieSBTcGhpbnggb24gU2F0IEp1biAxMSAwOTo0OTozMCAyMDExCi10b3BpY3MgPSB7J2Fzc2VydCc6IHUnXG5UaGUgYGBhc3NlcnRgYCBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5Bc3NlcnQgc3RhdGVtZW50cyBhcmUgYSBjb252ZW5pZW50IHdheSB0byBpbnNlcnQgZGVidWdnaW5nIGFzc2VydGlvbnNcbmludG8gYSBwcm9ncmFtOlxuXG4gICBhc3NlcnRfc3RtdCA6Oj0gImFzc2VydCIgZXhwcmVzc2lvbiBbIiwiIGV4cHJlc3Npb25dXG5cblRoZSBzaW1wbGUgZm9ybSwgYGBhc3NlcnQgZXhwcmVzc2lvbmBgLCBpcyBlcXVpdmFsZW50IHRvXG5cbiAgIGlmIF9fZGVidWdfXzpcbiAgICAgIGlmIG5vdCBleHByZXNzaW9uOiByYWlzZSBBc3NlcnRpb25FcnJvclxuXG5UaGUgZXh0ZW5kZWQgZm9ybSwgYGBhc3NlcnQgZXhwcmVzc2lvbjEsIGV4cHJlc3Npb24yYGAsIGlzIGVxdWl2YWxlbnRcbnRvXG5cbiAgIGlmIF9fZGVidWdfXzpcbiAgICAgIGlmIG5vdCBleHByZXNzaW9uMTogcmFpc2UgQXNzZXJ0aW9uRXJyb3IoZXhwcmVzc2lvbjIpXG5cblRoZXNlIGVxdWl2YWxlbmNlcyBhc3N1bWUgdGhhdCBgYF9fZGVidWdfX2BgIGFuZCBgYEFzc2VydGlvbkVycm9yYGBcbnJlZmVyIHRvIHRoZSBidWlsdC1pbiB2YXJpYWJsZXMgd2l0aCB0aG9zZSBuYW1lcy4gIEluIHRoZSBjdXJyZW50XG5pbXBsZW1lbnRhdGlvbiwgdGhlIGJ1aWx0LWluIHZhcmlhYmxlIGBgX19kZWJ1Z19fYGAgaXMgYGBUcnVlYGAgdW5kZXJcbm5vcm1hbCBjaXJjdW1zdGFuY2VzLCBgYEZhbHNlYGAgd2hlbiBvcHRpbWl6YXRpb24gaXMgcmVxdWVzdGVkXG4oY29tbWFuZCBsaW5lIG9wdGlvbiAtTykuICBUaGUgY3VycmVudCBjb2RlIGdlbmVyYXRvciBlbWl0cyBubyBjb2RlXG5mb3IgYW4gYXNzZXJ0IHN0YXRlbWVudCB3aGVuIG9wdGltaXphdGlvbiBpcyByZXF1ZXN0ZWQgYXQgY29tcGlsZVxudGltZS4gIE5vdGUgdGhhdCBpdCBpcyB1bm5lY2Vzc2FyeSB0byBpbmNsdWRlIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlXG5leHByZXNzaW9uIHRoYXQgZmFpbGVkIGluIHRoZSBlcnJvciBtZXNzYWdlOyBpdCB3aWxsIGJlIGRpc3BsYXllZCBhc1xucGFydCBvZiB0aGUgc3RhY2sgdHJhY2UuXG5cbkFzc2lnbm1lbnRzIHRvIGBgX19kZWJ1Z19fYGAgYXJlIGlsbGVnYWwuICBUaGUgdmFsdWUgZm9yIHRoZSBidWlsdC1pblxudmFyaWFibGUgaXMgZGV0ZXJtaW5lZCB3aGVuIHRoZSBpbnRlcnByZXRlciBzdGFydHMuXG4nLAotICdhc3NpZ25tZW50JzogdSdcbkFzc2lnbm1lbnQgc3RhdGVtZW50c1xuKioqKioqKioqKioqKioqKioqKioqXG5cbkFzc2lnbm1lbnQgc3RhdGVtZW50cyBhcmUgdXNlZCB0byAocmUpYmluZCBuYW1lcyB0byB2YWx1ZXMgYW5kIHRvXG5tb2RpZnkgYXR0cmlidXRlcyBvciBpdGVtcyBvZiBtdXRhYmxlIG9iamVjdHM6XG5cbiAgIGFzc2lnbm1lbnRfc3RtdCA6Oj0gKHRhcmdldF9saXN0ICI9IikrIChleHByZXNzaW9uX2xpc3QgfCB5aWVsZF9leHByZXNzaW9uKVxuICAgdGFyZ2V0X2xpc3QgICAgIDo6PSB0YXJnZXQgKCIsIiB0YXJnZXQpKiBbIiwiXVxuICAgdGFyZ2V0ICAgICAgICAgIDo6PSBpZGVudGlmaWVyXG4gICAgICAgICAgICAgIHwgIigiIHRhcmdldF9saXN0ICIpIlxuICAgICAgICAgICAgICB8ICJbIiB0YXJnZXRfbGlzdCAiXSJcbiAgICAgICAgICAgICAgfCBhdHRyaWJ1dGVyZWZcbiAgICAgICAgICAgICAgfCBzdWJzY3JpcHRpb25cbiAgICAgICAgICAgICAgfCBzbGljaW5nXG5cbihTZWUgc2VjdGlvbiAqUHJpbWFyaWVzKiBmb3IgdGhlIHN5bnRheCBkZWZpbml0aW9ucyBmb3IgdGhlIGxhc3QgdGhyZWVcbnN5bWJvbHMuKVxuXG5BbiBhc3NpZ25tZW50IHN0YXRlbWVudCBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gbGlzdCAocmVtZW1iZXIgdGhhdFxudGhpcyBjYW4gYmUgYSBzaW5nbGUgZXhwcmVzc2lvbiBvciBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0LCB0aGUgbGF0dGVyXG55aWVsZGluZyBhIHR1cGxlKSBhbmQgYXNzaWducyB0aGUgc2luZ2xlIHJlc3VsdGluZyBvYmplY3QgdG8gZWFjaCBvZlxudGhlIHRhcmdldCBsaXN0cywgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuXG5Bc3NpZ25tZW50IGlzIGRlZmluZWQgcmVjdXJzaXZlbHkgZGVwZW5kaW5nIG9uIHRoZSBmb3JtIG9mIHRoZSB0YXJnZXRcbihsaXN0KS4gV2hlbiBhIHRhcmdldCBpcyBwYXJ0IG9mIGEgbXV0YWJsZSBvYmplY3QgKGFuIGF0dHJpYnV0ZVxucmVmZXJlbmNlLCBzdWJzY3JpcHRpb24gb3Igc2xpY2luZyksIHRoZSBtdXRhYmxlIG9iamVjdCBtdXN0XG51bHRpbWF0ZWx5IHBlcmZvcm0gdGhlIGFzc2lnbm1lbnQgYW5kIGRlY2lkZSBhYm91dCBpdHMgdmFsaWRpdHksIGFuZFxubWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgYXNzaWdubWVudCBpcyB1bmFjY2VwdGFibGUuICBUaGUgcnVsZXNcbm9ic2VydmVkIGJ5IHZhcmlvdXMgdHlwZXMgYW5kIHRoZSBleGNlcHRpb25zIHJhaXNlZCBhcmUgZ2l2ZW4gd2l0aCB0aGVcbmRlZmluaXRpb24gb2YgdGhlIG9iamVjdCB0eXBlcyAoc2VlIHNlY3Rpb24gKlRoZSBzdGFuZGFyZCB0eXBlXG5oaWVyYXJjaHkqKS5cblxuQXNzaWdubWVudCBvZiBhbiBvYmplY3QgdG8gYSB0YXJnZXQgbGlzdCBpcyByZWN1cnNpdmVseSBkZWZpbmVkIGFzXG5mb2xsb3dzLlxuXG4qIElmIHRoZSB0YXJnZXQgbGlzdCBpcyBhIHNpbmdsZSB0YXJnZXQ6IFRoZSBvYmplY3QgaXMgYXNzaWduZWQgdG9cbiAgdGhhdCB0YXJnZXQuXG5cbiogSWYgdGhlIHRhcmdldCBsaXN0IGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGFyZ2V0czogVGhlIG9iamVjdFxuICBtdXN0IGJlIGFuIGl0ZXJhYmxlIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGl0ZW1zIGFzIHRoZXJlIGFyZVxuICB0YXJnZXRzIGluIHRoZSB0YXJnZXQgbGlzdCwgYW5kIHRoZSBpdGVtcyBhcmUgYXNzaWduZWQsIGZyb20gbGVmdCB0b1xuICByaWdodCwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdGFyZ2V0cy5cblxuQXNzaWdubWVudCBvZiBhbiBvYmplY3QgdG8gYSBzaW5nbGUgdGFyZ2V0IGlzIHJlY3Vyc2l2ZWx5IGRlZmluZWQgYXNcbmZvbGxvd3MuXG5cbiogSWYgdGhlIHRhcmdldCBpcyBhbiBpZGVudGlmaWVyIChuYW1lKTpcblxuICAqIElmIHRoZSBuYW1lIGRvZXMgbm90IG9jY3VyIGluIGEgYGBnbG9iYWxgYCBzdGF0ZW1lbnQgaW4gdGhlXG4gICAgY3VycmVudCBjb2RlIGJsb2NrOiB0aGUgbmFtZSBpcyBib3VuZCB0byB0aGUgb2JqZWN0IGluIHRoZSBjdXJyZW50XG4gICAgbG9jYWwgbmFtZXNwYWNlLlxuXG4gICogT3RoZXJ3aXNlOiB0aGUgbmFtZSBpcyBib3VuZCB0byB0aGUgb2JqZWN0IGluIHRoZSBjdXJyZW50IGdsb2JhbFxuICAgIG5hbWVzcGFjZS5cblxuICBUaGUgbmFtZSBpcyByZWJvdW5kIGlmIGl0IHdhcyBhbHJlYWR5IGJvdW5kLiAgVGhpcyBtYXkgY2F1c2UgdGhlXG4gIHJlZmVyZW5jZSBjb3VudCBmb3IgdGhlIG9iamVjdCBwcmV2aW91c2x5IGJvdW5kIHRvIHRoZSBuYW1lIHRvIHJlYWNoXG4gIHplcm8sIGNhdXNpbmcgdGhlIG9iamVjdCB0byBiZSBkZWFsbG9jYXRlZCBhbmQgaXRzIGRlc3RydWN0b3IgKGlmIGl0XG4gIGhhcyBvbmUpIHRvIGJlIGNhbGxlZC5cblxuKiBJZiB0aGUgdGFyZ2V0IGlzIGEgdGFyZ2V0IGxpc3QgZW5jbG9zZWQgaW4gcGFyZW50aGVzZXMgb3IgaW4gc3F1YXJlXG4gIGJyYWNrZXRzOiBUaGUgb2JqZWN0IG11c3QgYmUgYW4gaXRlcmFibGUgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2ZcbiAgaXRlbXMgYXMgdGhlcmUgYXJlIHRhcmdldHMgaW4gdGhlIHRhcmdldCBsaXN0LCBhbmQgaXRzIGl0ZW1zIGFyZVxuICBhc3NpZ25lZCwgZnJvbSBsZWZ0IHRvIHJpZ2h0LCB0byB0aGUgY29ycmVzcG9uZGluZyB0YXJnZXRzLlxuXG4qIElmIHRoZSB0YXJnZXQgaXMgYW4gYXR0cmlidXRlIHJlZmVyZW5jZTogVGhlIHByaW1hcnkgZXhwcmVzc2lvbiBpblxuICB0aGUgcmVmZXJlbmNlIGlzIGV2YWx1YXRlZC4gIEl0IHNob3VsZCB5aWVsZCBhbiBvYmplY3Qgd2l0aFxuICBhc3NpZ25hYmxlIGF0dHJpYnV0ZXM7IGlmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBgYFR5cGVFcnJvcmBgIGlzXG4gIHJhaXNlZC4gIFRoYXQgb2JqZWN0IGlzIHRoZW4gYXNrZWQgdG8gYXNzaWduIHRoZSBhc3NpZ25lZCBvYmplY3QgdG9cbiAgdGhlIGdpdmVuIGF0dHJpYnV0ZTsgaWYgaXQgY2Fubm90IHBlcmZvcm0gdGhlIGFzc2lnbm1lbnQsIGl0IHJhaXNlc1xuICBhbiBleGNlcHRpb24gKHVzdWFsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSBgYEF0dHJpYnV0ZUVycm9yYGApLlxuXG4gIE5vdGU6IElmIHRoZSBvYmplY3QgaXMgYSBjbGFzcyBpbnN0YW5jZSBhbmQgdGhlIGF0dHJpYnV0ZSByZWZlcmVuY2VcbiAgb2NjdXJzIG9uIGJvdGggc2lkZXMgb2YgdGhlIGFzc2lnbm1lbnQgb3BlcmF0b3IsIHRoZSBSSFMgZXhwcmVzc2lvbixcbiAgYGBhLnhgYCBjYW4gYWNjZXNzIGVpdGhlciBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgb3IgKGlmIG5vIGluc3RhbmNlXG4gIGF0dHJpYnV0ZSBleGlzdHMpIGEgY2xhc3MgYXR0cmlidXRlLiAgVGhlIExIUyB0YXJnZXQgYGBhLnhgYCBpc1xuICBhbHdheXMgc2V0IGFzIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSwgY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LlxuICBUaHVzLCB0aGUgdHdvIG9jY3VycmVuY2VzIG9mIGBgYS54YGAgZG8gbm90IG5lY2Vzc2FyaWx5IHJlZmVyIHRvIHRoZVxuICBzYW1lIGF0dHJpYnV0ZTogaWYgdGhlIFJIUyBleHByZXNzaW9uIHJlZmVycyB0byBhIGNsYXNzIGF0dHJpYnV0ZSxcbiAgdGhlIExIUyBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIGF0dHJpYnV0ZSBhcyB0aGUgdGFyZ2V0IG9mIHRoZVxuICBhc3NpZ25tZW50OlxuXG4gICAgIGNsYXNzIENsczpcbiAgICAgICAgIHggPSAzICAgICAgICAgICAgICMgY2xhc3MgdmFyaWFibGVcbiAgICAgaW5zdCA9IENscygpXG4gICAgIGluc3QueCA9IGluc3QueCArIDEgICAjIHdyaXRlcyBpbnN0LnggYXMgNCBsZWF2aW5nIENscy54IGFzIDNcblxuICBUaGlzIGRlc2NyaXB0aW9uIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGFwcGx5IHRvIGRlc2NyaXB0b3JcbiAgYXR0cmlidXRlcywgc3VjaCBhcyBwcm9wZXJ0aWVzIGNyZWF0ZWQgd2l0aCBgYHByb3BlcnR5KClgYC5cblxuKiBJZiB0aGUgdGFyZ2V0IGlzIGEgc3Vic2NyaXB0aW9uOiBUaGUgcHJpbWFyeSBleHByZXNzaW9uIGluIHRoZVxuICByZWZlcmVuY2UgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGVpdGhlciBhIG11dGFibGUgc2VxdWVuY2VcbiAgb2JqZWN0IChzdWNoIGFzIGEgbGlzdCkgb3IgYSBtYXBwaW5nIG9iamVjdCAoc3VjaCBhcyBhIGRpY3Rpb25hcnkpLlxuICBOZXh0LCB0aGUgc3Vic2NyaXB0IGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkLlxuXG4gIElmIHRoZSBwcmltYXJ5IGlzIGEgbXV0YWJsZSBzZXF1ZW5jZSBvYmplY3QgKHN1Y2ggYXMgYSBsaXN0KSwgdGhlXG4gIHN1YnNjcmlwdCBtdXN0IHlpZWxkIGEgcGxhaW4gaW50ZWdlci4gIElmIGl0IGlzIG5lZ2F0aXZlLCB0aGVcbiAgc2VxdWVuY2VcJ3MgbGVuZ3RoIGlzIGFkZGVkIHRvIGl0LiBUaGUgcmVzdWx0aW5nIHZhbHVlIG11c3QgYmUgYVxuICBub25uZWdhdGl2ZSBpbnRlZ2VyIGxlc3MgdGhhbiB0aGUgc2VxdWVuY2VcJ3MgbGVuZ3RoLCBhbmQgdGhlXG4gIHNlcXVlbmNlIGlzIGFza2VkIHRvIGFzc2lnbiB0aGUgYXNzaWduZWQgb2JqZWN0IHRvIGl0cyBpdGVtIHdpdGhcbiAgdGhhdCBpbmRleC4gIElmIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UsIGBgSW5kZXhFcnJvcmBgIGlzIHJhaXNlZFxuICAoYXNzaWdubWVudCB0byBhIHN1YnNjcmlwdGVkIHNlcXVlbmNlIGNhbm5vdCBhZGQgbmV3IGl0ZW1zIHRvIGFcbiAgbGlzdCkuXG5cbiAgSWYgdGhlIHByaW1hcnkgaXMgYSBtYXBwaW5nIG9iamVjdCAoc3VjaCBhcyBhIGRpY3Rpb25hcnkpLCB0aGVcbiAgc3Vic2NyaXB0IG11c3QgaGF2ZSBhIHR5cGUgY29tcGF0aWJsZSB3aXRoIHRoZSBtYXBwaW5nXCdzIGtleSB0eXBlLFxuICBhbmQgdGhlIG1hcHBpbmcgaXMgdGhlbiBhc2tlZCB0byBjcmVhdGUgYSBrZXkvZGF0dW0gcGFpciB3aGljaCBtYXBzXG4gIHRoZSBzdWJzY3JpcHQgdG8gdGhlIGFzc2lnbmVkIG9iamVjdC4gIFRoaXMgY2FuIGVpdGhlciByZXBsYWNlIGFuXG4gIGV4aXN0aW5nIGtleS92YWx1ZSBwYWlyIHdpdGggdGhlIHNhbWUga2V5IHZhbHVlLCBvciBpbnNlcnQgYSBuZXdcbiAga2V5L3ZhbHVlIHBhaXIgKGlmIG5vIGtleSB3aXRoIHRoZSBzYW1lIHZhbHVlIGV4aXN0ZWQpLlxuXG4qIElmIHRoZSB0YXJnZXQgaXMgYSBzbGljaW5nOiBUaGUgcHJpbWFyeSBleHByZXNzaW9uIGluIHRoZSByZWZlcmVuY2VcbiAgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGEgbXV0YWJsZSBzZXF1ZW5jZSBvYmplY3QgKHN1Y2ggYXMgYVxuICBsaXN0KS4gIFRoZSBhc3NpZ25lZCBvYmplY3Qgc2hvdWxkIGJlIGEgc2VxdWVuY2Ugb2JqZWN0IG9mIHRoZSBzYW1lXG4gIHR5cGUuICBOZXh0LCB0aGUgbG93ZXIgYW5kIHVwcGVyIGJvdW5kIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQsXG4gIGluc29mYXIgdGhleSBhcmUgcHJlc2VudDsgZGVmYXVsdHMgYXJlIHplcm8gYW5kIHRoZSBzZXF1ZW5jZVwnc1xuICBsZW5ndGguICBUaGUgYm91bmRzIHNob3VsZCBldmFsdWF0ZSB0byAoc21hbGwpIGludGVnZXJzLiAgSWYgZWl0aGVyXG4gIGJvdW5kIGlzIG5lZ2F0aXZlLCB0aGUgc2VxdWVuY2VcJ3MgbGVuZ3RoIGlzIGFkZGVkIHRvIGl0LiBUaGVcbiAgcmVzdWx0aW5nIGJvdW5kcyBhcmUgY2xpcHBlZCB0byBsaWUgYmV0d2VlbiB6ZXJvIGFuZCB0aGUgc2VxdWVuY2VcJ3NcbiAgbGVuZ3RoLCBpbmNsdXNpdmUuICBGaW5hbGx5LCB0aGUgc2VxdWVuY2Ugb2JqZWN0IGlzIGFza2VkIHRvIHJlcGxhY2VcbiAgdGhlIHNsaWNlIHdpdGggdGhlIGl0ZW1zIG9mIHRoZSBhc3NpZ25lZCBzZXF1ZW5jZS4gIFRoZSBsZW5ndGggb2ZcbiAgdGhlIHNsaWNlIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgbGVuZ3RoIG9mIHRoZSBhc3NpZ25lZCBzZXF1ZW5jZSxcbiAgdGh1cyBjaGFuZ2luZyB0aGUgbGVuZ3RoIG9mIHRoZSB0YXJnZXQgc2VxdWVuY2UsIGlmIHRoZSBvYmplY3RcbiAgYWxsb3dzIGl0LlxuXG4qKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCB0aGVcbnN5bnRheCBmb3IgdGFyZ2V0cyBpcyB0YWtlbiB0byBiZSB0aGUgc2FtZSBhcyBmb3IgZXhwcmVzc2lvbnMsIGFuZFxuaW52YWxpZCBzeW50YXggaXMgcmVqZWN0ZWQgZHVyaW5nIHRoZSBjb2RlIGdlbmVyYXRpb24gcGhhc2UsIGNhdXNpbmdcbmxlc3MgZGV0YWlsZWQgZXJyb3IgbWVzc2FnZXMuXG5cbldBUk5JTkc6IEFsdGhvdWdoIHRoZSBkZWZpbml0aW9uIG9mIGFzc2lnbm1lbnQgaW1wbGllcyB0aGF0IG92ZXJsYXBzXG5iZXR3ZWVuIHRoZSBsZWZ0LWhhbmQgc2lkZSBhbmQgdGhlIHJpZ2h0LWhhbmQgc2lkZSBhcmUgXCdzYWZlXCcgKGZvclxuZXhhbXBsZSBgYGEsIGIgPSBiLCBhYGAgc3dhcHMgdHdvIHZhcmlhYmxlcyksIG92ZXJsYXBzICp3aXRoaW4qIHRoZVxuY29sbGVjdGlvbiBvZiBhc3NpZ25lZC10byB2YXJpYWJsZXMgYXJlIG5vdCBzYWZlISAgRm9yIGluc3RhbmNlLCB0aGVcbmZvbGxvd2luZyBwcm9ncmFtIHByaW50cyBgYFswLCAyXWBgOlxuXG4gICB4ID0gWzAsIDFdXG4gICBpID0gMFxuICAgaSwgeFtpXSA9IDEsIDJcbiAgIHByaW50IHhcblxuXG5BdWdtZW50ZWQgYXNzaWdubWVudCBzdGF0ZW1lbnRzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbkF1Z21lbnRlZCBhc3NpZ25tZW50IGlzIHRoZSBjb21iaW5hdGlvbiwgaW4gYSBzaW5nbGUgc3RhdGVtZW50LCBvZiBhXG5iaW5hcnkgb3BlcmF0aW9uIGFuZCBhbiBhc3NpZ25tZW50IHN0YXRlbWVudDpcblxuICAgYXVnbWVudGVkX2Fzc2lnbm1lbnRfc3RtdCA6Oj0gYXVndGFyZ2V0IGF1Z29wIChleHByZXNzaW9uX2xpc3QgfCB5aWVsZF9leHByZXNzaW9uKVxuICAgYXVndGFyZ2V0ICAgICAgICAgICAgICAgICA6Oj0gaWRlbnRpZmllciB8IGF0dHJpYnV0ZXJlZiB8IHN1YnNjcmlwdGlvbiB8IHNsaWNpbmdcbiAgIGF1Z29wICAgICAgICAgICAgICAgICAgICAgOjo9ICIrPSIgfCAiLT0iIHwgIio9IiB8ICIvPSIgfCAiLy89IiB8ICIlPSIgfCAiKio9IlxuICAgICAgICAgICAgIHwgIj4+PSIgfCAiPDw9IiB8ICImPSIgfCAiXj0iIHwgInw9IlxuXG4oU2VlIHNlY3Rpb24gKlByaW1hcmllcyogZm9yIHRoZSBzeW50YXggZGVmaW5pdGlvbnMgZm9yIHRoZSBsYXN0IHRocmVlXG5zeW1ib2xzLilcblxuQW4gYXVnbWVudGVkIGFzc2lnbm1lbnQgZXZhbHVhdGVzIHRoZSB0YXJnZXQgKHdoaWNoLCB1bmxpa2Ugbm9ybWFsXG5hc3NpZ25tZW50IHN0YXRlbWVudHMsIGNhbm5vdCBiZSBhbiB1bnBhY2tpbmcpIGFuZCB0aGUgZXhwcmVzc2lvblxubGlzdCwgcGVyZm9ybXMgdGhlIGJpbmFyeSBvcGVyYXRpb24gc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgYXNzaWdubWVudFxub24gdGhlIHR3byBvcGVyYW5kcywgYW5kIGFzc2lnbnMgdGhlIHJlc3VsdCB0byB0aGUgb3JpZ2luYWwgdGFyZ2V0LlxuVGhlIHRhcmdldCBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLlxuXG5BbiBhdWdtZW50ZWQgYXNzaWdubWVudCBleHByZXNzaW9uIGxpa2UgYGB4ICs9IDFgYCBjYW4gYmUgcmV3cml0dGVuIGFzXG5gYHggPSB4ICsgMWBgIHRvIGFjaGlldmUgYSBzaW1pbGFyLCBidXQgbm90IGV4YWN0bHkgZXF1YWwgZWZmZWN0LiBJblxudGhlIGF1Z21lbnRlZCB2ZXJzaW9uLCBgYHhgYCBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLiBBbHNvLCB3aGVuXG5wb3NzaWJsZSwgdGhlIGFjdHVhbCBvcGVyYXRpb24gaXMgcGVyZm9ybWVkICppbi1wbGFjZSosIG1lYW5pbmcgdGhhdFxucmF0aGVyIHRoYW4gY3JlYXRpbmcgYSBuZXcgb2JqZWN0IGFuZCBhc3NpZ25pbmcgdGhhdCB0byB0aGUgdGFyZ2V0LFxudGhlIG9sZCBvYmplY3QgaXMgbW9kaWZpZWQgaW5zdGVhZC5cblxuV2l0aCB0aGUgZXhjZXB0aW9uIG9mIGFzc2lnbmluZyB0byB0dXBsZXMgYW5kIG11bHRpcGxlIHRhcmdldHMgaW4gYVxuc2luZ2xlIHN0YXRlbWVudCwgdGhlIGFzc2lnbm1lbnQgZG9uZSBieSBhdWdtZW50ZWQgYXNzaWdubWVudFxuc3RhdGVtZW50cyBpcyBoYW5kbGVkIHRoZSBzYW1lIHdheSBhcyBub3JtYWwgYXNzaWdubWVudHMuIFNpbWlsYXJseSxcbndpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgcG9zc2libGUgKmluLXBsYWNlKiBiZWhhdmlvciwgdGhlIGJpbmFyeVxub3BlcmF0aW9uIHBlcmZvcm1lZCBieSBhdWdtZW50ZWQgYXNzaWdubWVudCBpcyB0aGUgc2FtZSBhcyB0aGUgbm9ybWFsXG5iaW5hcnkgb3BlcmF0aW9ucy5cblxuRm9yIHRhcmdldHMgd2hpY2ggYXJlIGF0dHJpYnV0ZSByZWZlcmVuY2VzLCB0aGUgc2FtZSAqY2F2ZWF0IGFib3V0XG5jbGFzcyBhbmQgaW5zdGFuY2UgYXR0cmlidXRlcyogYXBwbGllcyBhcyBmb3IgcmVndWxhciBhc3NpZ25tZW50cy5cbicsCi0gJ2F0b20taWRlbnRpZmllcnMnOiB1J1xuSWRlbnRpZmllcnMgKE5hbWVzKVxuKioqKioqKioqKioqKioqKioqKlxuXG5BbiBpZGVudGlmaWVyIG9jY3VycmluZyBhcyBhbiBhdG9tIGlzIGEgbmFtZS4gIFNlZSBzZWN0aW9uXG4qSWRlbnRpZmllcnMgYW5kIGtleXdvcmRzKiBmb3IgbGV4aWNhbCBkZWZpbml0aW9uIGFuZCBzZWN0aW9uICpOYW1pbmdcbmFuZCBiaW5kaW5nKiBmb3IgZG9jdW1lbnRhdGlvbiBvZiBuYW1pbmcgYW5kIGJpbmRpbmcuXG5cbldoZW4gdGhlIG5hbWUgaXMgYm91bmQgdG8gYW4gb2JqZWN0LCBldmFsdWF0aW9uIG9mIHRoZSBhdG9tIHlpZWxkc1xudGhhdCBvYmplY3QuIFdoZW4gYSBuYW1lIGlzIG5vdCBib3VuZCwgYW4gYXR0ZW1wdCB0byBldmFsdWF0ZSBpdFxucmFpc2VzIGEgYGBOYW1lRXJyb3JgYCBleGNlcHRpb24uXG5cbioqUHJpdmF0ZSBuYW1lIG1hbmdsaW5nOioqIFdoZW4gYW4gaWRlbnRpZmllciB0aGF0IHRleHR1YWxseSBvY2N1cnMgaW5cbmEgY2xhc3MgZGVmaW5pdGlvbiBiZWdpbnMgd2l0aCB0d28gb3IgbW9yZSB1bmRlcnNjb3JlIGNoYXJhY3RlcnMgYW5kXG5kb2VzIG5vdCBlbmQgaW4gdHdvIG9yIG1vcmUgdW5kZXJzY29yZXMsIGl0IGlzIGNvbnNpZGVyZWQgYSAqcHJpdmF0ZVxubmFtZSogb2YgdGhhdCBjbGFzcy4gUHJpdmF0ZSBuYW1lcyBhcmUgdHJhbnNmb3JtZWQgdG8gYSBsb25nZXIgZm9ybVxuYmVmb3JlIGNvZGUgaXMgZ2VuZXJhdGVkIGZvciB0aGVtLiAgVGhlIHRyYW5zZm9ybWF0aW9uIGluc2VydHMgdGhlXG5jbGFzcyBuYW1lIGluIGZyb250IG9mIHRoZSBuYW1lLCB3aXRoIGxlYWRpbmcgdW5kZXJzY29yZXMgcmVtb3ZlZCwgYW5kXG5hIHNpbmdsZSB1bmRlcnNjb3JlIGluc2VydGVkIGluIGZyb250IG9mIHRoZSBjbGFzcyBuYW1lLiAgRm9yIGV4YW1wbGUsXG50aGUgaWRlbnRpZmllciBgYF9fc3BhbWBgIG9jY3VycmluZyBpbiBhIGNsYXNzIG5hbWVkIGBgSGFtYGAgd2lsbCBiZVxudHJhbnNmb3JtZWQgdG8gYGBfSGFtX19zcGFtYGAuICBUaGlzIHRyYW5zZm9ybWF0aW9uIGlzIGluZGVwZW5kZW50IG9mXG50aGUgc3ludGFjdGljYWwgY29udGV4dCBpbiB3aGljaCB0aGUgaWRlbnRpZmllciBpcyB1c2VkLiAgSWYgdGhlXG50cmFuc2Zvcm1lZCBuYW1lIGlzIGV4dHJlbWVseSBsb25nIChsb25nZXIgdGhhbiAyNTUgY2hhcmFjdGVycyksXG5pbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHRydW5jYXRpb24gbWF5IGhhcHBlbi4gIElmIHRoZSBjbGFzcyBuYW1lXG5jb25zaXN0cyBvbmx5IG9mIHVuZGVyc2NvcmVzLCBubyB0cmFuc2Zvcm1hdGlvbiBpcyBkb25lLlxuJywKLSAnYXRvbS1saXRlcmFscyc6IHUiXG5MaXRlcmFsc1xuKioqKioqKipcblxuUHl0aG9uIHN1cHBvcnRzIHN0cmluZyBsaXRlcmFscyBhbmQgdmFyaW91cyBudW1lcmljIGxpdGVyYWxzOlxuXG4gICBsaXRlcmFsIDo6PSBzdHJpbmdsaXRlcmFsIHwgaW50ZWdlciB8IGxvbmdpbnRlZ2VyXG4gICAgICAgICAgICAgICB8IGZsb2F0bnVtYmVyIHwgaW1hZ251bWJlclxuXG5FdmFsdWF0aW9uIG9mIGEgbGl0ZXJhbCB5aWVsZHMgYW4gb2JqZWN0IG9mIHRoZSBnaXZlbiB0eXBlIChzdHJpbmcsXG5pbnRlZ2VyLCBsb25nIGludGVnZXIsIGZsb2F0aW5nIHBvaW50IG51bWJlciwgY29tcGxleCBudW1iZXIpIHdpdGggdGhlXG5naXZlbiB2YWx1ZS4gIFRoZSB2YWx1ZSBtYXkgYmUgYXBwcm94aW1hdGVkIGluIHRoZSBjYXNlIG9mIGZsb2F0aW5nXG5wb2ludCBhbmQgaW1hZ2luYXJ5IChjb21wbGV4KSBsaXRlcmFscy4gIFNlZSBzZWN0aW9uICpMaXRlcmFscyogZm9yXG5kZXRhaWxzLlxuXG5BbGwgbGl0ZXJhbHMgY29ycmVzcG9uZCB0byBpbW11dGFibGUgZGF0YSB0eXBlcywgYW5kIGhlbmNlIHRoZVxub2JqZWN0J3MgaWRlbnRpdHkgaXMgbGVzcyBpbXBvcnRhbnQgdGhhbiBpdHMgdmFsdWUuICBNdWx0aXBsZVxuZXZhbHVhdGlvbnMgb2YgbGl0ZXJhbHMgd2l0aCB0aGUgc2FtZSB2YWx1ZSAoZWl0aGVyIHRoZSBzYW1lXG5vY2N1cnJlbmNlIGluIHRoZSBwcm9ncmFtIHRleHQgb3IgYSBkaWZmZXJlbnQgb2NjdXJyZW5jZSkgbWF5IG9idGFpblxudGhlIHNhbWUgb2JqZWN0IG9yIGEgZGlmZmVyZW50IG9iamVjdCB3aXRoIHRoZSBzYW1lIHZhbHVlLlxuIiwKLSAnYXR0cmlidXRlLWFjY2Vzcyc6IHUnXG5DdXN0b21pemluZyBhdHRyaWJ1dGUgYWNjZXNzXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBjdXN0b21pemUgdGhlIG1lYW5pbmcgb2ZcbmF0dHJpYnV0ZSBhY2Nlc3MgKHVzZSBvZiwgYXNzaWdubWVudCB0bywgb3IgZGVsZXRpb24gb2YgYGB4Lm5hbWVgYClcbmZvciBjbGFzcyBpbnN0YW5jZXMuXG5cbm9iamVjdC5fX2dldGF0dHJfXyhzZWxmLCBuYW1lKVxuXG4gICBDYWxsZWQgd2hlbiBhbiBhdHRyaWJ1dGUgbG9va3VwIGhhcyBub3QgZm91bmQgdGhlIGF0dHJpYnV0ZSBpbiB0aGVcbiAgIHVzdWFsIHBsYWNlcyAoaS5lLiBpdCBpcyBub3QgYW4gaW5zdGFuY2UgYXR0cmlidXRlIG5vciBpcyBpdCBmb3VuZFxuICAgaW4gdGhlIGNsYXNzIHRyZWUgZm9yIGBgc2VsZmBgKS4gIGBgbmFtZWBgIGlzIHRoZSBhdHRyaWJ1dGUgbmFtZS5cbiAgIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlXG4gICBhbiBgYEF0dHJpYnV0ZUVycm9yYGAgZXhjZXB0aW9uLlxuXG4gICBOb3RlIHRoYXQgaWYgdGhlIGF0dHJpYnV0ZSBpcyBmb3VuZCB0aHJvdWdoIHRoZSBub3JtYWwgbWVjaGFuaXNtLFxuICAgYGBfX2dldGF0dHJfXygpYGAgaXMgbm90IGNhbGxlZC4gIChUaGlzIGlzIGFuIGludGVudGlvbmFsIGFzeW1tZXRyeVxuICAgYmV0d2VlbiBgYF9fZ2V0YXR0cl9fKClgYCBhbmQgYGBfX3NldGF0dHJfXygpYGAuKSBUaGlzIGlzIGRvbmUgYm90aFxuICAgZm9yIGVmZmljaWVuY3kgcmVhc29ucyBhbmQgYmVjYXVzZSBvdGhlcndpc2UgYGBfX2dldGF0dHJfXygpYGBcbiAgIHdvdWxkIGhhdmUgbm8gd2F5IHRvIGFjY2VzcyBvdGhlciBhdHRyaWJ1dGVzIG9mIHRoZSBpbnN0YW5jZS4gIE5vdGVcbiAgIHRoYXQgYXQgbGVhc3QgZm9yIGluc3RhbmNlIHZhcmlhYmxlcywgeW91IGNhbiBmYWtlIHRvdGFsIGNvbnRyb2wgYnlcbiAgIG5vdCBpbnNlcnRpbmcgYW55IHZhbHVlcyBpbiB0aGUgaW5zdGFuY2UgYXR0cmlidXRlIGRpY3Rpb25hcnkgKGJ1dFxuICAgaW5zdGVhZCBpbnNlcnRpbmcgdGhlbSBpbiBhbm90aGVyIG9iamVjdCkuICBTZWUgdGhlXG4gICBgYF9fZ2V0YXR0cmlidXRlX18oKWBgIG1ldGhvZCBiZWxvdyBmb3IgYSB3YXkgdG8gYWN0dWFsbHkgZ2V0IHRvdGFsXG4gICBjb250cm9sIGluIG5ldy1zdHlsZSBjbGFzc2VzLlxuXG5vYmplY3QuX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpXG5cbiAgIENhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSBhc3NpZ25tZW50IGlzIGF0dGVtcHRlZC4gIFRoaXMgaXMgY2FsbGVkXG4gICBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgbWVjaGFuaXNtIChpLmUuIHN0b3JlIHRoZSB2YWx1ZSBpbiB0aGVcbiAgIGluc3RhbmNlIGRpY3Rpb25hcnkpLiAgKm5hbWUqIGlzIHRoZSBhdHRyaWJ1dGUgbmFtZSwgKnZhbHVlKiBpcyB0aGVcbiAgIHZhbHVlIHRvIGJlIGFzc2lnbmVkIHRvIGl0LlxuXG4gICBJZiBgYF9fc2V0YXR0cl9fKClgYCB3YW50cyB0byBhc3NpZ24gdG8gYW4gaW5zdGFuY2UgYXR0cmlidXRlLCBpdFxuICAgc2hvdWxkIG5vdCBzaW1wbHkgZXhlY3V0ZSBgYHNlbGYubmFtZSA9IHZhbHVlYGAgLS0tIHRoaXMgd291bGRcbiAgIGNhdXNlIGEgcmVjdXJzaXZlIGNhbGwgdG8gaXRzZWxmLiAgSW5zdGVhZCwgaXQgc2hvdWxkIGluc2VydCB0aGVcbiAgIHZhbHVlIGluIHRoZSBkaWN0aW9uYXJ5IG9mIGluc3RhbmNlIGF0dHJpYnV0ZXMsIGUuZy4sXG4gICBgYHNlbGYuX19kaWN0X19bbmFtZV0gPSB2YWx1ZWBgLiAgRm9yIG5ldy1zdHlsZSBjbGFzc2VzLCByYXRoZXJcbiAgIHRoYW4gYWNjZXNzaW5nIHRoZSBpbnN0YW5jZSBkaWN0aW9uYXJ5LCBpdCBzaG91bGQgY2FsbCB0aGUgYmFzZVxuICAgY2xhc3MgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSwgZm9yIGV4YW1wbGUsXG4gICBgYG9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSlgYC5cblxub2JqZWN0Ll9fZGVsYXR0cl9fKHNlbGYsIG5hbWUpXG5cbiAgIExpa2UgYGBfX3NldGF0dHJfXygpYGAgYnV0IGZvciBhdHRyaWJ1dGUgZGVsZXRpb24gaW5zdGVhZCBvZlxuICAgYXNzaWdubWVudC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgaWYgYGBkZWwgb2JqLm5hbWVgYCBpc1xuICAgbWVhbmluZ2Z1bCBmb3IgdGhlIG9iamVjdC5cblxuXG5Nb3JlIGF0dHJpYnV0ZSBhY2Nlc3MgZm9yIG5ldy1zdHlsZSBjbGFzc2VzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvbmx5IGFwcGx5IHRvIG5ldy1zdHlsZSBjbGFzc2VzLlxuXG5vYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKVxuXG4gICBDYWxsZWQgdW5jb25kaXRpb25hbGx5IHRvIGltcGxlbWVudCBhdHRyaWJ1dGUgYWNjZXNzZXMgZm9yXG4gICBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzLiBJZiB0aGUgY2xhc3MgYWxzbyBkZWZpbmVzXG4gICBgYF9fZ2V0YXR0cl9fKClgYCwgdGhlIGxhdHRlciB3aWxsIG5vdCBiZSBjYWxsZWQgdW5sZXNzXG4gICBgYF9fZ2V0YXR0cmlidXRlX18oKWBgIGVpdGhlciBjYWxscyBpdCBleHBsaWNpdGx5IG9yIHJhaXNlcyBhblxuICAgYGBBdHRyaWJ1dGVFcnJvcmBgLiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSAoY29tcHV0ZWQpXG4gICBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2UgYW4gYGBBdHRyaWJ1dGVFcnJvcmBgIGV4Y2VwdGlvbi4gSW4gb3JkZXJcbiAgIHRvIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbiBpbiB0aGlzIG1ldGhvZCwgaXRzIGltcGxlbWVudGF0aW9uXG4gICBzaG91bGQgYWx3YXlzIGNhbGwgdGhlIGJhc2UgY2xhc3MgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSB0b1xuICAgYWNjZXNzIGFueSBhdHRyaWJ1dGVzIGl0IG5lZWRzLCBmb3IgZXhhbXBsZSxcbiAgIGBgb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSlgYC5cblxuICAgTm90ZTogVGhpcyBtZXRob2QgbWF5IHN0aWxsIGJlIGJ5cGFzc2VkIHdoZW4gbG9va2luZyB1cCBzcGVjaWFsIG1ldGhvZHNcbiAgICAgYXMgdGhlIHJlc3VsdCBvZiBpbXBsaWNpdCBpbnZvY2F0aW9uIHZpYSBsYW5ndWFnZSBzeW50YXggb3JcbiAgICAgYnVpbHQtaW4gZnVuY3Rpb25zLiBTZWUgKlNwZWNpYWwgbWV0aG9kIGxvb2t1cCBmb3IgbmV3LXN0eWxlXG4gICAgIGNsYXNzZXMqLlxuXG5cbkltcGxlbWVudGluZyBEZXNjcmlwdG9yc1xuPT09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvbmx5IGFwcGx5IHdoZW4gYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzXG5jb250YWluaW5nIHRoZSBtZXRob2QgKGEgc28tY2FsbGVkICpkZXNjcmlwdG9yKiBjbGFzcykgYXBwZWFycyBpbiBhblxuKm93bmVyKiBjbGFzcyAodGhlIGRlc2NyaXB0b3IgbXVzdCBiZSBpbiBlaXRoZXIgdGhlIG93bmVyXCdzIGNsYXNzXG5kaWN0aW9uYXJ5IG9yIGluIHRoZSBjbGFzcyBkaWN0aW9uYXJ5IGZvciBvbmUgb2YgaXRzIHBhcmVudHMpLiAgSW4gdGhlXG5leGFtcGxlcyBiZWxvdywgInRoZSBhdHRyaWJ1dGUiIHJlZmVycyB0byB0aGUgYXR0cmlidXRlIHdob3NlIG5hbWUgaXNcbnRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IGluIHRoZSBvd25lciBjbGFzc1wnIGBgX19kaWN0X19gYC5cblxub2JqZWN0Ll9fZ2V0X18oc2VsZiwgaW5zdGFuY2UsIG93bmVyKVxuXG4gICBDYWxsZWQgdG8gZ2V0IHRoZSBhdHRyaWJ1dGUgb2YgdGhlIG93bmVyIGNsYXNzIChjbGFzcyBhdHRyaWJ1dGVcbiAgIGFjY2Vzcykgb3Igb2YgYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcyAoaW5zdGFuY2UgYXR0cmlidXRlXG4gICBhY2Nlc3MpLiAqb3duZXIqIGlzIGFsd2F5cyB0aGUgb3duZXIgY2xhc3MsIHdoaWxlICppbnN0YW5jZSogaXMgdGhlXG4gICBpbnN0YW5jZSB0aGF0IHRoZSBhdHRyaWJ1dGUgd2FzIGFjY2Vzc2VkIHRocm91Z2gsIG9yIGBgTm9uZWBgIHdoZW5cbiAgIHRoZSBhdHRyaWJ1dGUgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgKm93bmVyKi4gIFRoaXMgbWV0aG9kIHNob3VsZFxuICAgcmV0dXJuIHRoZSAoY29tcHV0ZWQpIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZSBhblxuICAgYGBBdHRyaWJ1dGVFcnJvcmBgIGV4Y2VwdGlvbi5cblxub2JqZWN0Ll9fc2V0X18oc2VsZiwgaW5zdGFuY2UsIHZhbHVlKVxuXG4gICBDYWxsZWQgdG8gc2V0IHRoZSBhdHRyaWJ1dGUgb24gYW4gaW5zdGFuY2UgKmluc3RhbmNlKiBvZiB0aGUgb3duZXJcbiAgIGNsYXNzIHRvIGEgbmV3IHZhbHVlLCAqdmFsdWUqLlxuXG5vYmplY3QuX19kZWxldGVfXyhzZWxmLCBpbnN0YW5jZSlcblxuICAgQ2FsbGVkIHRvIGRlbGV0ZSB0aGUgYXR0cmlidXRlIG9uIGFuIGluc3RhbmNlICppbnN0YW5jZSogb2YgdGhlXG4gICBvd25lciBjbGFzcy5cblxuXG5JbnZva2luZyBEZXNjcmlwdG9yc1xuPT09PT09PT09PT09PT09PT09PT1cblxuSW4gZ2VuZXJhbCwgYSBkZXNjcmlwdG9yIGlzIGFuIG9iamVjdCBhdHRyaWJ1dGUgd2l0aCAiYmluZGluZ1xuYmVoYXZpb3IiLCBvbmUgd2hvc2UgYXR0cmlidXRlIGFjY2VzcyBoYXMgYmVlbiBvdmVycmlkZGVuIGJ5IG1ldGhvZHNcbmluIHRoZSBkZXNjcmlwdG9yIHByb3RvY29sOiAgYGBfX2dldF9fKClgYCwgYGBfX3NldF9fKClgYCwgYW5kXG5gYF9fZGVsZXRlX18oKWBgLiBJZiBhbnkgb2YgdGhvc2UgbWV0aG9kcyBhcmUgZGVmaW5lZCBmb3IgYW4gb2JqZWN0LFxuaXQgaXMgc2FpZCB0byBiZSBhIGRlc2NyaXB0b3IuXG5cblRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBhdHRyaWJ1dGUgYWNjZXNzIGlzIHRvIGdldCwgc2V0LCBvciBkZWxldGVcbnRoZSBhdHRyaWJ1dGUgZnJvbSBhbiBvYmplY3RcJ3MgZGljdGlvbmFyeS4gRm9yIGluc3RhbmNlLCBgYGEueGBgIGhhcyBhXG5sb29rdXAgY2hhaW4gc3RhcnRpbmcgd2l0aCBgYGEuX19kaWN0X19bXCd4XCddYGAsIHRoZW5cbmBgdHlwZShhKS5fX2RpY3RfX1tcJ3hcJ11gYCwgYW5kIGNvbnRpbnVpbmcgdGhyb3VnaCB0aGUgYmFzZSBjbGFzc2VzIG9mXG5gYHR5cGUoYSlgYCBleGNsdWRpbmcgbWV0YWNsYXNzZXMuXG5cbkhvd2V2ZXIsIGlmIHRoZSBsb29rZWQtdXAgdmFsdWUgaXMgYW4gb2JqZWN0IGRlZmluaW5nIG9uZSBvZiB0aGVcbmRlc2NyaXB0b3IgbWV0aG9kcywgdGhlbiBQeXRob24gbWF5IG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGFuZFxuaW52b2tlIHRoZSBkZXNjcmlwdG9yIG1ldGhvZCBpbnN0ZWFkLiAgV2hlcmUgdGhpcyBvY2N1cnMgaW4gdGhlXG5wcmVjZWRlbmNlIGNoYWluIGRlcGVuZHMgb24gd2hpY2ggZGVzY3JpcHRvciBtZXRob2RzIHdlcmUgZGVmaW5lZCBhbmRcbmhvdyB0aGV5IHdlcmUgY2FsbGVkLiAgTm90ZSB0aGF0IGRlc2NyaXB0b3JzIGFyZSBvbmx5IGludm9rZWQgZm9yIG5ld1xuc3R5bGUgb2JqZWN0cyBvciBjbGFzc2VzIChvbmVzIHRoYXQgc3ViY2xhc3MgYGBvYmplY3QoKWBgIG9yXG5gYHR5cGUoKWBgKS5cblxuVGhlIHN0YXJ0aW5nIHBvaW50IGZvciBkZXNjcmlwdG9yIGludm9jYXRpb24gaXMgYSBiaW5kaW5nLCBgYGEueGBgLlxuSG93IHRoZSBhcmd1bWVudHMgYXJlIGFzc2VtYmxlZCBkZXBlbmRzIG9uIGBgYWBgOlxuXG5EaXJlY3QgQ2FsbFxuICAgVGhlIHNpbXBsZXN0IGFuZCBsZWFzdCBjb21tb24gY2FsbCBpcyB3aGVuIHVzZXIgY29kZSBkaXJlY3RseVxuICAgaW52b2tlcyBhIGRlc2NyaXB0b3IgbWV0aG9kOiAgICBgYHguX19nZXRfXyhhKWBgLlxuXG5JbnN0YW5jZSBCaW5kaW5nXG4gICBJZiBiaW5kaW5nIHRvIGEgbmV3LXN0eWxlIG9iamVjdCBpbnN0YW5jZSwgYGBhLnhgYCBpcyB0cmFuc2Zvcm1lZFxuICAgaW50byB0aGUgY2FsbDogYGB0eXBlKGEpLl9fZGljdF9fW1wneFwnXS5fX2dldF9fKGEsIHR5cGUoYSkpYGAuXG5cbkNsYXNzIEJpbmRpbmdcbiAgIElmIGJpbmRpbmcgdG8gYSBuZXctc3R5bGUgY2xhc3MsIGBgQS54YGAgaXMgdHJhbnNmb3JtZWQgaW50byB0aGVcbiAgIGNhbGw6IGBgQS5fX2RpY3RfX1tcJ3hcJ10uX19nZXRfXyhOb25lLCBBKWBgLlxuXG5TdXBlciBCaW5kaW5nXG4gICBJZiBgYGFgYCBpcyBhbiBpbnN0YW5jZSBvZiBgYHN1cGVyYGAsIHRoZW4gdGhlIGJpbmRpbmcgYGBzdXBlcihCLFxuICAgb2JqKS5tKClgYCBzZWFyY2hlcyBgYG9iai5fX2NsYXNzX18uX19tcm9fX2BgIGZvciB0aGUgYmFzZSBjbGFzc1xuICAgYGBBYGAgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIGBgQmBgIGFuZCB0aGVuIGludm9rZXMgdGhlIGRlc2NyaXB0b3JcbiAgIHdpdGggdGhlIGNhbGw6IGBgQS5fX2RpY3RfX1tcJ21cJ10uX19nZXRfXyhvYmosIG9iai5fX2NsYXNzX18pYGAuXG5cbkZvciBpbnN0YW5jZSBiaW5kaW5ncywgdGhlIHByZWNlZGVuY2Ugb2YgZGVzY3JpcHRvciBpbnZvY2F0aW9uIGRlcGVuZHNcbm9uIHRoZSB3aGljaCBkZXNjcmlwdG9yIG1ldGhvZHMgYXJlIGRlZmluZWQuICBBIGRlc2NyaXB0b3IgY2FuIGRlZmluZVxuYW55IGNvbWJpbmF0aW9uIG9mIGBgX19nZXRfXygpYGAsIGBgX19zZXRfXygpYGAgYW5kIGBgX19kZWxldGVfXygpYGAuXG5JZiBpdCBkb2VzIG5vdCBkZWZpbmUgYGBfX2dldF9fKClgYCwgdGhlbiBhY2Nlc3NpbmcgdGhlIGF0dHJpYnV0ZSB3aWxsXG5yZXR1cm4gdGhlIGRlc2NyaXB0b3Igb2JqZWN0IGl0c2VsZiB1bmxlc3MgdGhlcmUgaXMgYSB2YWx1ZSBpbiB0aGVcbm9iamVjdFwncyBpbnN0YW5jZSBkaWN0aW9uYXJ5LiAgSWYgdGhlIGRlc2NyaXB0b3IgZGVmaW5lcyBgYF9fc2V0X18oKWBgXG5hbmQvb3IgYGBfX2RlbGV0ZV9fKClgYCwgaXQgaXMgYSBkYXRhIGRlc2NyaXB0b3I7IGlmIGl0IGRlZmluZXNcbm5laXRoZXIsIGl0IGlzIGEgbm9uLWRhdGEgZGVzY3JpcHRvci4gIE5vcm1hbGx5LCBkYXRhIGRlc2NyaXB0b3JzXG5kZWZpbmUgYm90aCBgYF9fZ2V0X18oKWBgIGFuZCBgYF9fc2V0X18oKWBgLCB3aGlsZSBub24tZGF0YVxuZGVzY3JpcHRvcnMgaGF2ZSBqdXN0IHRoZSBgYF9fZ2V0X18oKWBgIG1ldGhvZC4gIERhdGEgZGVzY3JpcHRvcnMgd2l0aFxuYGBfX3NldF9fKClgYCBhbmQgYGBfX2dldF9fKClgYCBkZWZpbmVkIGFsd2F5cyBvdmVycmlkZSBhIHJlZGVmaW5pdGlvblxuaW4gYW4gaW5zdGFuY2UgZGljdGlvbmFyeS4gIEluIGNvbnRyYXN0LCBub24tZGF0YSBkZXNjcmlwdG9ycyBjYW4gYmVcbm92ZXJyaWRkZW4gYnkgaW5zdGFuY2VzLlxuXG5QeXRob24gbWV0aG9kcyAoaW5jbHVkaW5nIGBgc3RhdGljbWV0aG9kKClgYCBhbmQgYGBjbGFzc21ldGhvZCgpYGApXG5hcmUgaW1wbGVtZW50ZWQgYXMgbm9uLWRhdGEgZGVzY3JpcHRvcnMuICBBY2NvcmRpbmdseSwgaW5zdGFuY2VzIGNhblxucmVkZWZpbmUgYW5kIG92ZXJyaWRlIG1ldGhvZHMuICBUaGlzIGFsbG93cyBpbmRpdmlkdWFsIGluc3RhbmNlcyB0b1xuYWNxdWlyZSBiZWhhdmlvcnMgdGhhdCBkaWZmZXIgZnJvbSBvdGhlciBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgY2xhc3MuXG5cblRoZSBgYHByb3BlcnR5KClgYCBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBhcyBhIGRhdGEgZGVzY3JpcHRvci5cbkFjY29yZGluZ2x5LCBpbnN0YW5jZXMgY2Fubm90IG92ZXJyaWRlIHRoZSBiZWhhdmlvciBvZiBhIHByb3BlcnR5LlxuXG5cbl9fc2xvdHNfX1xuPT09PT09PT09XG5cbkJ5IGRlZmF1bHQsIGluc3RhbmNlcyBvZiBib3RoIG9sZCBhbmQgbmV3LXN0eWxlIGNsYXNzZXMgaGF2ZSBhXG5kaWN0aW9uYXJ5IGZvciBhdHRyaWJ1dGUgc3RvcmFnZS4gIFRoaXMgd2FzdGVzIHNwYWNlIGZvciBvYmplY3RzXG5oYXZpbmcgdmVyeSBmZXcgaW5zdGFuY2UgdmFyaWFibGVzLiAgVGhlIHNwYWNlIGNvbnN1bXB0aW9uIGNhbiBiZWNvbWVcbmFjdXRlIHdoZW4gY3JlYXRpbmcgbGFyZ2UgbnVtYmVycyBvZiBpbnN0YW5jZXMuXG5cblRoZSBkZWZhdWx0IGNhbiBiZSBvdmVycmlkZGVuIGJ5IGRlZmluaW5nICpfX3Nsb3RzX18qIGluIGEgbmV3LXN0eWxlXG5jbGFzcyBkZWZpbml0aW9uLiAgVGhlICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIHRha2VzIGEgc2VxdWVuY2Ugb2Zcbmluc3RhbmNlIHZhcmlhYmxlcyBhbmQgcmVzZXJ2ZXMganVzdCBlbm91Z2ggc3BhY2UgaW4gZWFjaCBpbnN0YW5jZSB0b1xuaG9sZCBhIHZhbHVlIGZvciBlYWNoIHZhcmlhYmxlLiAgU3BhY2UgaXMgc2F2ZWQgYmVjYXVzZSAqX19kaWN0X18qIGlzXG5ub3QgY3JlYXRlZCBmb3IgZWFjaCBpbnN0YW5jZS5cblxuX19zbG90c19fXG5cbiAgIFRoaXMgY2xhc3MgdmFyaWFibGUgY2FuIGJlIGFzc2lnbmVkIGEgc3RyaW5nLCBpdGVyYWJsZSwgb3Igc2VxdWVuY2VcbiAgIG9mIHN0cmluZ3Mgd2l0aCB2YXJpYWJsZSBuYW1lcyB1c2VkIGJ5IGluc3RhbmNlcy4gIElmIGRlZmluZWQgaW4gYVxuICAgbmV3LXN0eWxlIGNsYXNzLCAqX19zbG90c19fKiByZXNlcnZlcyBzcGFjZSBmb3IgdGhlIGRlY2xhcmVkXG4gICB2YXJpYWJsZXMgYW5kIHByZXZlbnRzIHRoZSBhdXRvbWF0aWMgY3JlYXRpb24gb2YgKl9fZGljdF9fKiBhbmRcbiAgICpfX3dlYWtyZWZfXyogZm9yIGVhY2ggaW5zdGFuY2UuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDIuMi5cblxuTm90ZXMgb24gdXNpbmcgKl9fc2xvdHNfXypcblxuKiBXaGVuIGluaGVyaXRpbmcgZnJvbSBhIGNsYXNzIHdpdGhvdXQgKl9fc2xvdHNfXyosIHRoZSAqX19kaWN0X18qXG4gIGF0dHJpYnV0ZSBvZiB0aGF0IGNsYXNzIHdpbGwgYWx3YXlzIGJlIGFjY2Vzc2libGUsIHNvIGEgKl9fc2xvdHNfXypcbiAgZGVmaW5pdGlvbiBpbiB0aGUgc3ViY2xhc3MgaXMgbWVhbmluZ2xlc3MuXG5cbiogV2l0aG91dCBhICpfX2RpY3RfXyogdmFyaWFibGUsIGluc3RhbmNlcyBjYW5ub3QgYmUgYXNzaWduZWQgbmV3XG4gIHZhcmlhYmxlcyBub3QgbGlzdGVkIGluIHRoZSAqX19zbG90c19fKiBkZWZpbml0aW9uLiAgQXR0ZW1wdHMgdG9cbiAgYXNzaWduIHRvIGFuIHVubGlzdGVkIHZhcmlhYmxlIG5hbWUgcmFpc2VzIGBgQXR0cmlidXRlRXJyb3JgYC4gSWZcbiAgZHluYW1pYyBhc3NpZ25tZW50IG9mIG5ldyB2YXJpYWJsZXMgaXMgZGVzaXJlZCwgdGhlbiBhZGRcbiAgYGBcJ19fZGljdF9fXCdgYCB0byB0aGUgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBpbiB0aGUgKl9fc2xvdHNfXypcbiAgZGVjbGFyYXRpb24uXG5cbiAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMzogUHJldmlvdXNseSwgYWRkaW5nIGBgXCdfX2RpY3RfX1wnYGAgdG8gdGhlXG4gICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIHdvdWxkIG5vdCBlbmFibGUgdGhlIGFzc2lnbm1lbnQgb2YgbmV3XG4gIGF0dHJpYnV0ZXMgbm90IHNwZWNpZmljYWxseSBsaXN0ZWQgaW4gdGhlIHNlcXVlbmNlIG9mIGluc3RhbmNlXG4gIHZhcmlhYmxlIG5hbWVzLlxuXG4qIFdpdGhvdXQgYSAqX193ZWFrcmVmX18qIHZhcmlhYmxlIGZvciBlYWNoIGluc3RhbmNlLCBjbGFzc2VzIGRlZmluaW5nXG4gICpfX3Nsb3RzX18qIGRvIG5vdCBzdXBwb3J0IHdlYWsgcmVmZXJlbmNlcyB0byBpdHMgaW5zdGFuY2VzLiBJZiB3ZWFrXG4gIHJlZmVyZW5jZSBzdXBwb3J0IGlzIG5lZWRlZCwgdGhlbiBhZGQgYGBcJ19fd2Vha3JlZl9fXCdgYCB0byB0aGVcbiAgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBpbiB0aGUgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24uXG5cbiAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMzogUHJldmlvdXNseSwgYWRkaW5nIGBgXCdfX3dlYWtyZWZfX1wnYGAgdG8gdGhlXG4gICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIHdvdWxkIG5vdCBlbmFibGUgc3VwcG9ydCBmb3Igd2Vha1xuICByZWZlcmVuY2VzLlxuXG4qICpfX3Nsb3RzX18qIGFyZSBpbXBsZW1lbnRlZCBhdCB0aGUgY2xhc3MgbGV2ZWwgYnkgY3JlYXRpbmdcbiAgZGVzY3JpcHRvcnMgKCpJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnMqKSBmb3IgZWFjaCB2YXJpYWJsZSBuYW1lLiAgQXNcbiAgYSByZXN1bHQsIGNsYXNzIGF0dHJpYnV0ZXMgY2Fubm90IGJlIHVzZWQgdG8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvclxuICBpbnN0YW5jZSB2YXJpYWJsZXMgZGVmaW5lZCBieSAqX19zbG90c19fKjsgb3RoZXJ3aXNlLCB0aGUgY2xhc3NcbiAgYXR0cmlidXRlIHdvdWxkIG92ZXJ3cml0ZSB0aGUgZGVzY3JpcHRvciBhc3NpZ25tZW50LlxuXG4qIFRoZSBhY3Rpb24gb2YgYSAqX19zbG90c19fKiBkZWNsYXJhdGlvbiBpcyBsaW1pdGVkIHRvIHRoZSBjbGFzc1xuICB3aGVyZSBpdCBpcyBkZWZpbmVkLiAgQXMgYSByZXN1bHQsIHN1YmNsYXNzZXMgd2lsbCBoYXZlIGEgKl9fZGljdF9fKlxuICB1bmxlc3MgdGhleSBhbHNvIGRlZmluZSAqX19zbG90c19fKiAod2hpY2ggbXVzdCBvbmx5IGNvbnRhaW4gbmFtZXNcbiAgb2YgYW55ICphZGRpdGlvbmFsKiBzbG90cykuXG5cbiogSWYgYSBjbGFzcyBkZWZpbmVzIGEgc2xvdCBhbHNvIGRlZmluZWQgaW4gYSBiYXNlIGNsYXNzLCB0aGUgaW5zdGFuY2VcbiAgdmFyaWFibGUgZGVmaW5lZCBieSB0aGUgYmFzZSBjbGFzcyBzbG90IGlzIGluYWNjZXNzaWJsZSAoZXhjZXB0IGJ5XG4gIHJldHJpZXZpbmcgaXRzIGRlc2NyaXB0b3IgZGlyZWN0bHkgZnJvbSB0aGUgYmFzZSBjbGFzcykuIFRoaXNcbiAgcmVuZGVycyB0aGUgbWVhbmluZyBvZiB0aGUgcHJvZ3JhbSB1bmRlZmluZWQuICBJbiB0aGUgZnV0dXJlLCBhXG4gIGNoZWNrIG1heSBiZSBhZGRlZCB0byBwcmV2ZW50IHRoaXMuXG5cbiogTm9uZW1wdHkgKl9fc2xvdHNfXyogZG9lcyBub3Qgd29yayBmb3IgY2xhc3NlcyBkZXJpdmVkIGZyb21cbiAgInZhcmlhYmxlLWxlbmd0aCIgYnVpbHQtaW4gdHlwZXMgc3VjaCBhcyBgYGxvbmdgYCwgYGBzdHJgYCBhbmRcbiAgYGB0dXBsZWBgLlxuXG4qIEFueSBub24tc3RyaW5nIGl0ZXJhYmxlIG1heSBiZSBhc3NpZ25lZCB0byAqX19zbG90c19fKi4gTWFwcGluZ3MgbWF5XG4gIGFsc28gYmUgdXNlZDsgaG93ZXZlciwgaW4gdGhlIGZ1dHVyZSwgc3BlY2lhbCBtZWFuaW5nIG1heSBiZVxuICBhc3NpZ25lZCB0byB0aGUgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBrZXkuXG5cbiogKl9fY2xhc3NfXyogYXNzaWdubWVudCB3b3JrcyBvbmx5IGlmIGJvdGggY2xhc3NlcyBoYXZlIHRoZSBzYW1lXG4gICpfX3Nsb3RzX18qLlxuXG4gIENoYW5nZWQgaW4gdmVyc2lvbiAyLjY6IFByZXZpb3VzbHksICpfX2NsYXNzX18qIGFzc2lnbm1lbnQgcmFpc2VkIGFuXG4gIGVycm9yIGlmIGVpdGhlciBuZXcgb3Igb2xkIGNsYXNzIGhhZCAqX19zbG90c19fKi5cbicsCi0gJ2F0dHJpYnV0ZS1yZWZlcmVuY2VzJzogdSdcbkF0dHJpYnV0ZSByZWZlcmVuY2VzXG4qKioqKioqKioqKioqKioqKioqKlxuXG5BbiBhdHRyaWJ1dGUgcmVmZXJlbmNlIGlzIGEgcHJpbWFyeSBmb2xsb3dlZCBieSBhIHBlcmlvZCBhbmQgYSBuYW1lOlxuXG4gICBhdHRyaWJ1dGVyZWYgOjo9IHByaW1hcnkgIi4iIGlkZW50aWZpZXJcblxuVGhlIHByaW1hcnkgbXVzdCBldmFsdWF0ZSB0byBhbiBvYmplY3Qgb2YgYSB0eXBlIHRoYXQgc3VwcG9ydHNcbmF0dHJpYnV0ZSByZWZlcmVuY2VzLCBlLmcuLCBhIG1vZHVsZSwgbGlzdCwgb3IgYW4gaW5zdGFuY2UuICBUaGlzXG5vYmplY3QgaXMgdGhlbiBhc2tlZCB0byBwcm9kdWNlIHRoZSBhdHRyaWJ1dGUgd2hvc2UgbmFtZSBpcyB0aGVcbmlkZW50aWZpZXIuICBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgZXhjZXB0aW9uXG5gYEF0dHJpYnV0ZUVycm9yYGAgaXMgcmFpc2VkLiBPdGhlcndpc2UsIHRoZSB0eXBlIGFuZCB2YWx1ZSBvZiB0aGVcbm9iamVjdCBwcm9kdWNlZCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvYmplY3QuICBNdWx0aXBsZSBldmFsdWF0aW9ucyBvZlxudGhlIHNhbWUgYXR0cmlidXRlIHJlZmVyZW5jZSBtYXkgeWllbGQgZGlmZmVyZW50IG9iamVjdHMuXG4nLAotICdhdWdhc3NpZ24nOiB1J1xuQXVnbWVudGVkIGFzc2lnbm1lbnQgc3RhdGVtZW50c1xuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5BdWdtZW50ZWQgYXNzaWdubWVudCBpcyB0aGUgY29tYmluYXRpb24sIGluIGEgc2luZ2xlIHN0YXRlbWVudCwgb2YgYVxuYmluYXJ5IG9wZXJhdGlvbiBhbmQgYW4gYXNzaWdubWVudCBzdGF0ZW1lbnQ6XG5cbiAgIGF1Z21lbnRlZF9hc3NpZ25tZW50X3N0bXQgOjo9IGF1Z3RhcmdldCBhdWdvcCAoZXhwcmVzc2lvbl9saXN0IHwgeWllbGRfZXhwcmVzc2lvbilcbiAgIGF1Z3RhcmdldCAgICAgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXIgfCBhdHRyaWJ1dGVyZWYgfCBzdWJzY3JpcHRpb24gfCBzbGljaW5nXG4gICBhdWdvcCAgICAgICAgICAgICAgICAgICAgIDo6PSAiKz0iIHwgIi09IiB8ICIqPSIgfCAiLz0iIHwgIi8vPSIgfCAiJT0iIHwgIioqPSJcbiAgICAgICAgICAgICB8ICI+Pj0iIHwgIjw8PSIgfCAiJj0iIHwgIl49IiB8ICJ8PSJcblxuKFNlZSBzZWN0aW9uICpQcmltYXJpZXMqIGZvciB0aGUgc3ludGF4IGRlZmluaXRpb25zIGZvciB0aGUgbGFzdCB0aHJlZVxuc3ltYm9scy4pXG5cbkFuIGF1Z21lbnRlZCBhc3NpZ25tZW50IGV2YWx1YXRlcyB0aGUgdGFyZ2V0ICh3aGljaCwgdW5saWtlIG5vcm1hbFxuYXNzaWdubWVudCBzdGF0ZW1lbnRzLCBjYW5ub3QgYmUgYW4gdW5wYWNraW5nKSBhbmQgdGhlIGV4cHJlc3Npb25cbmxpc3QsIHBlcmZvcm1zIHRoZSBiaW5hcnkgb3BlcmF0aW9uIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIGFzc2lnbm1lbnRcbm9uIHRoZSB0d28gb3BlcmFuZHMsIGFuZCBhc3NpZ25zIHRoZSByZXN1bHQgdG8gdGhlIG9yaWdpbmFsIHRhcmdldC5cblRoZSB0YXJnZXQgaXMgb25seSBldmFsdWF0ZWQgb25jZS5cblxuQW4gYXVnbWVudGVkIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiBsaWtlIGBgeCArPSAxYGAgY2FuIGJlIHJld3JpdHRlbiBhc1xuYGB4ID0geCArIDFgYCB0byBhY2hpZXZlIGEgc2ltaWxhciwgYnV0IG5vdCBleGFjdGx5IGVxdWFsIGVmZmVjdC4gSW5cbnRoZSBhdWdtZW50ZWQgdmVyc2lvbiwgYGB4YGAgaXMgb25seSBldmFsdWF0ZWQgb25jZS4gQWxzbywgd2hlblxucG9zc2libGUsIHRoZSBhY3R1YWwgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCAqaW4tcGxhY2UqLCBtZWFuaW5nIHRoYXRcbnJhdGhlciB0aGFuIGNyZWF0aW5nIGEgbmV3IG9iamVjdCBhbmQgYXNzaWduaW5nIHRoYXQgdG8gdGhlIHRhcmdldCxcbnRoZSBvbGQgb2JqZWN0IGlzIG1vZGlmaWVkIGluc3RlYWQuXG5cbldpdGggdGhlIGV4Y2VwdGlvbiBvZiBhc3NpZ25pbmcgdG8gdHVwbGVzIGFuZCBtdWx0aXBsZSB0YXJnZXRzIGluIGFcbnNpbmdsZSBzdGF0ZW1lbnQsIHRoZSBhc3NpZ25tZW50IGRvbmUgYnkgYXVnbWVudGVkIGFzc2lnbm1lbnRcbnN0YXRlbWVudHMgaXMgaGFuZGxlZCB0aGUgc2FtZSB3YXkgYXMgbm9ybWFsIGFzc2lnbm1lbnRzLiBTaW1pbGFybHksXG53aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIHBvc3NpYmxlICppbi1wbGFjZSogYmVoYXZpb3IsIHRoZSBiaW5hcnlcbm9wZXJhdGlvbiBwZXJmb3JtZWQgYnkgYXVnbWVudGVkIGFzc2lnbm1lbnQgaXMgdGhlIHNhbWUgYXMgdGhlIG5vcm1hbFxuYmluYXJ5IG9wZXJhdGlvbnMuXG5cbkZvciB0YXJnZXRzIHdoaWNoIGFyZSBhdHRyaWJ1dGUgcmVmZXJlbmNlcywgdGhlIHNhbWUgKmNhdmVhdCBhYm91dFxuY2xhc3MgYW5kIGluc3RhbmNlIGF0dHJpYnV0ZXMqIGFwcGxpZXMgYXMgZm9yIHJlZ3VsYXIgYXNzaWdubWVudHMuXG4nLAotICdiaW5hcnknOiB1J1xuQmluYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9uc1xuKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgYmluYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9ucyBoYXZlIHRoZSBjb252ZW50aW9uYWwgcHJpb3JpdHlcbmxldmVscy4gIE5vdGUgdGhhdCBzb21lIG9mIHRoZXNlIG9wZXJhdGlvbnMgYWxzbyBhcHBseSB0byBjZXJ0YWluIG5vbi1cbm51bWVyaWMgdHlwZXMuICBBcGFydCBmcm9tIHRoZSBwb3dlciBvcGVyYXRvciwgdGhlcmUgYXJlIG9ubHkgdHdvXG5sZXZlbHMsIG9uZSBmb3IgbXVsdGlwbGljYXRpdmUgb3BlcmF0b3JzIGFuZCBvbmUgZm9yIGFkZGl0aXZlXG5vcGVyYXRvcnM6XG5cbiAgIG1fZXhwciA6Oj0gdV9leHByIHwgbV9leHByICIqIiB1X2V4cHIgfCBtX2V4cHIgIi8vIiB1X2V4cHIgfCBtX2V4cHIgIi8iIHVfZXhwclxuICAgICAgICAgICAgICB8IG1fZXhwciAiJSIgdV9leHByXG4gICBhX2V4cHIgOjo9IG1fZXhwciB8IGFfZXhwciAiKyIgbV9leHByIHwgYV9leHByICItIiBtX2V4cHJcblxuVGhlIGBgKmBgIChtdWx0aXBsaWNhdGlvbikgb3BlcmF0b3IgeWllbGRzIHRoZSBwcm9kdWN0IG9mIGl0c1xuYXJndW1lbnRzLiAgVGhlIGFyZ3VtZW50cyBtdXN0IGVpdGhlciBib3RoIGJlIG51bWJlcnMsIG9yIG9uZSBhcmd1bWVudFxubXVzdCBiZSBhbiBpbnRlZ2VyIChwbGFpbiBvciBsb25nKSBhbmQgdGhlIG90aGVyIG11c3QgYmUgYSBzZXF1ZW5jZS5cbkluIHRoZSBmb3JtZXIgY2FzZSwgdGhlIG51bWJlcnMgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlIGFuZFxudGhlbiBtdWx0aXBsaWVkIHRvZ2V0aGVyLiAgSW4gdGhlIGxhdHRlciBjYXNlLCBzZXF1ZW5jZSByZXBldGl0aW9uIGlzXG5wZXJmb3JtZWQ7IGEgbmVnYXRpdmUgcmVwZXRpdGlvbiBmYWN0b3IgeWllbGRzIGFuIGVtcHR5IHNlcXVlbmNlLlxuXG5UaGUgYGAvYGAgKGRpdmlzaW9uKSBhbmQgYGAvL2BgIChmbG9vciBkaXZpc2lvbikgb3BlcmF0b3JzIHlpZWxkIHRoZVxucXVvdGllbnQgb2YgdGhlaXIgYXJndW1lbnRzLiAgVGhlIG51bWVyaWMgYXJndW1lbnRzIGFyZSBmaXJzdFxuY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUuIFBsYWluIG9yIGxvbmcgaW50ZWdlciBkaXZpc2lvbiB5aWVsZHMgYW5cbmludGVnZXIgb2YgdGhlIHNhbWUgdHlwZTsgdGhlIHJlc3VsdCBpcyB0aGF0IG9mIG1hdGhlbWF0aWNhbCBkaXZpc2lvblxud2l0aCB0aGUgXCdmbG9vclwnIGZ1bmN0aW9uIGFwcGxpZWQgdG8gdGhlIHJlc3VsdC4gRGl2aXNpb24gYnkgemVyb1xucmFpc2VzIHRoZSBgYFplcm9EaXZpc2lvbkVycm9yYGAgZXhjZXB0aW9uLlxuXG5UaGUgYGAlYGAgKG1vZHVsbykgb3BlcmF0b3IgeWllbGRzIHRoZSByZW1haW5kZXIgZnJvbSB0aGUgZGl2aXNpb24gb2ZcbnRoZSBmaXJzdCBhcmd1bWVudCBieSB0aGUgc2Vjb25kLiAgVGhlIG51bWVyaWMgYXJndW1lbnRzIGFyZSBmaXJzdFxuY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUuICBBIHplcm8gcmlnaHQgYXJndW1lbnQgcmFpc2VzIHRoZVxuYGBaZXJvRGl2aXNpb25FcnJvcmBgIGV4Y2VwdGlvbi4gIFRoZSBhcmd1bWVudHMgbWF5IGJlIGZsb2F0aW5nIHBvaW50XG5udW1iZXJzLCBlLmcuLCBgYDMuMTQlMC43YGAgZXF1YWxzIGBgMC4zNGBgIChzaW5jZSBgYDMuMTRgYCBlcXVhbHNcbmBgNCowLjcgKyAwLjM0YGAuKSAgVGhlIG1vZHVsbyBvcGVyYXRvciBhbHdheXMgeWllbGRzIGEgcmVzdWx0IHdpdGhcbnRoZSBzYW1lIHNpZ24gYXMgaXRzIHNlY29uZCBvcGVyYW5kIChvciB6ZXJvKTsgdGhlIGFic29sdXRlIHZhbHVlIG9mXG50aGUgcmVzdWx0IGlzIHN0cmljdGx5IHNtYWxsZXIgdGhhbiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHNlY29uZFxub3BlcmFuZCBbMl0uXG5cblRoZSBpbnRlZ2VyIGRpdmlzaW9uIGFuZCBtb2R1bG8gb3BlcmF0b3JzIGFyZSBjb25uZWN0ZWQgYnkgdGhlXG5mb2xsb3dpbmcgaWRlbnRpdHk6IGBgeCA9PSAoeC95KSp5ICsgKHgleSlgYC4gIEludGVnZXIgZGl2aXNpb24gYW5kXG5tb2R1bG8gYXJlIGFsc28gY29ubmVjdGVkIHdpdGggdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGBgZGl2bW9kKClgYDpcbmBgZGl2bW9kKHgsIHkpID09ICh4L3ksIHgleSlgYC4gIFRoZXNlIGlkZW50aXRpZXMgZG9uXCd0IGhvbGQgZm9yXG5mbG9hdGluZyBwb2ludCBudW1iZXJzOyB0aGVyZSBzaW1pbGFyIGlkZW50aXRpZXMgaG9sZCBhcHByb3hpbWF0ZWx5XG53aGVyZSBgYHgveWBgIGlzIHJlcGxhY2VkIGJ5IGBgZmxvb3IoeC95KWBgIG9yIGBgZmxvb3IoeC95KSAtIDFgYCBbM10uXG5cbkluIGFkZGl0aW9uIHRvIHBlcmZvcm1pbmcgdGhlIG1vZHVsbyBvcGVyYXRpb24gb24gbnVtYmVycywgdGhlIGBgJWBgXG5vcGVyYXRvciBpcyBhbHNvIG92ZXJsb2FkZWQgYnkgc3RyaW5nIGFuZCB1bmljb2RlIG9iamVjdHMgdG8gcGVyZm9ybVxuc3RyaW5nIGZvcm1hdHRpbmcgKGFsc28ga25vd24gYXMgaW50ZXJwb2xhdGlvbikuIFRoZSBzeW50YXggZm9yIHN0cmluZ1xuZm9ybWF0dGluZyBpcyBkZXNjcmliZWQgaW4gdGhlIFB5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZSwgc2VjdGlvblxuKlN0cmluZyBGb3JtYXR0aW5nIE9wZXJhdGlvbnMqLlxuXG5EZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi4zOiBUaGUgZmxvb3IgZGl2aXNpb24gb3BlcmF0b3IsIHRoZSBtb2R1bG9cbm9wZXJhdG9yLCBhbmQgdGhlIGBgZGl2bW9kKClgYCBmdW5jdGlvbiBhcmUgbm8gbG9uZ2VyIGRlZmluZWQgZm9yXG5jb21wbGV4IG51bWJlcnMuICBJbnN0ZWFkLCBjb252ZXJ0IHRvIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHVzaW5nXG50aGUgYGBhYnMoKWBgIGZ1bmN0aW9uIGlmIGFwcHJvcHJpYXRlLlxuXG5UaGUgYGArYGAgKGFkZGl0aW9uKSBvcGVyYXRvciB5aWVsZHMgdGhlIHN1bSBvZiBpdHMgYXJndW1lbnRzLiBUaGVcbmFyZ3VtZW50cyBtdXN0IGVpdGhlciBib3RoIGJlIG51bWJlcnMgb3IgYm90aCBzZXF1ZW5jZXMgb2YgdGhlIHNhbWVcbnR5cGUuICBJbiB0aGUgZm9ybWVyIGNhc2UsIHRoZSBudW1iZXJzIGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZVxuYW5kIHRoZW4gYWRkZWQgdG9nZXRoZXIuICBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBzZXF1ZW5jZXMgYXJlXG5jb25jYXRlbmF0ZWQuXG5cblRoZSBgYC1gYCAoc3VidHJhY3Rpb24pIG9wZXJhdG9yIHlpZWxkcyB0aGUgZGlmZmVyZW5jZSBvZiBpdHNcbmFyZ3VtZW50cy4gIFRoZSBudW1lcmljIGFyZ3VtZW50cyBhcmUgZmlyc3QgY29udmVydGVkIHRvIGEgY29tbW9uXG50eXBlLlxuJywKLSAnYml0d2lzZSc6IHUnXG5CaW5hcnkgYml0d2lzZSBvcGVyYXRpb25zXG4qKioqKioqKioqKioqKioqKioqKioqKioqXG5cbkVhY2ggb2YgdGhlIHRocmVlIGJpdHdpc2Ugb3BlcmF0aW9ucyBoYXMgYSBkaWZmZXJlbnQgcHJpb3JpdHkgbGV2ZWw6XG5cbiAgIGFuZF9leHByIDo6PSBzaGlmdF9leHByIHwgYW5kX2V4cHIgIiYiIHNoaWZ0X2V4cHJcbiAgIHhvcl9leHByIDo6PSBhbmRfZXhwciB8IHhvcl9leHByICJeIiBhbmRfZXhwclxuICAgb3JfZXhwciAgOjo9IHhvcl9leHByIHwgb3JfZXhwciAifCIgeG9yX2V4cHJcblxuVGhlIGBgJmBgIG9wZXJhdG9yIHlpZWxkcyB0aGUgYml0d2lzZSBBTkQgb2YgaXRzIGFyZ3VtZW50cywgd2hpY2ggbXVzdFxuYmUgcGxhaW4gb3IgbG9uZyBpbnRlZ2Vycy4gIFRoZSBhcmd1bWVudHMgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vblxudHlwZS5cblxuVGhlIGBgXmBgIG9wZXJhdG9yIHlpZWxkcyB0aGUgYml0d2lzZSBYT1IgKGV4Y2x1c2l2ZSBPUikgb2YgaXRzXG5hcmd1bWVudHMsIHdoaWNoIG11c3QgYmUgcGxhaW4gb3IgbG9uZyBpbnRlZ2Vycy4gIFRoZSBhcmd1bWVudHMgYXJlXG5jb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS5cblxuVGhlIGBgfGBgIG9wZXJhdG9yIHlpZWxkcyB0aGUgYml0d2lzZSAoaW5jbHVzaXZlKSBPUiBvZiBpdHMgYXJndW1lbnRzLFxud2hpY2ggbXVzdCBiZSBwbGFpbiBvciBsb25nIGludGVnZXJzLiAgVGhlIGFyZ3VtZW50cyBhcmUgY29udmVydGVkIHRvXG5hIGNvbW1vbiB0eXBlLlxuJywKLSAnYmx0aW4tY29kZS1vYmplY3RzJzogdSdcbkNvZGUgT2JqZWN0c1xuKioqKioqKioqKioqXG5cbkNvZGUgb2JqZWN0cyBhcmUgdXNlZCBieSB0aGUgaW1wbGVtZW50YXRpb24gdG8gcmVwcmVzZW50ICJwc2V1ZG8tXG5jb21waWxlZCIgZXhlY3V0YWJsZSBQeXRob24gY29kZSBzdWNoIGFzIGEgZnVuY3Rpb24gYm9keS4gVGhleSBkaWZmZXJcbmZyb20gZnVuY3Rpb24gb2JqZWN0cyBiZWNhdXNlIHRoZXkgZG9uXCd0IGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlaXJcbmdsb2JhbCBleGVjdXRpb24gZW52aXJvbm1lbnQuICBDb2RlIG9iamVjdHMgYXJlIHJldHVybmVkIGJ5IHRoZSBidWlsdC1cbmluIGBgY29tcGlsZSgpYGAgZnVuY3Rpb24gYW5kIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBmdW5jdGlvbiBvYmplY3RzXG50aHJvdWdoIHRoZWlyIGBgZnVuY19jb2RlYGAgYXR0cmlidXRlLiBTZWUgYWxzbyB0aGUgYGBjb2RlYGAgbW9kdWxlLlxuXG5BIGNvZGUgb2JqZWN0IGNhbiBiZSBleGVjdXRlZCBvciBldmFsdWF0ZWQgYnkgcGFzc2luZyBpdCAoaW5zdGVhZCBvZiBhXG5zb3VyY2Ugc3RyaW5nKSB0byB0aGUgYGBleGVjYGAgc3RhdGVtZW50IG9yIHRoZSBidWlsdC1pbiBgYGV2YWwoKWBgXG5mdW5jdGlvbi5cblxuU2VlICpUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuJywKLSAnYmx0aW4tZWxsaXBzaXMtb2JqZWN0JzogdSdcblRoZSBFbGxpcHNpcyBPYmplY3RcbioqKioqKioqKioqKioqKioqKipcblxuVGhpcyBvYmplY3QgaXMgdXNlZCBieSBleHRlbmRlZCBzbGljZSBub3RhdGlvbiAoc2VlICpTbGljaW5ncyopLiAgSXRcbnN1cHBvcnRzIG5vIHNwZWNpYWwgb3BlcmF0aW9ucy4gIFRoZXJlIGlzIGV4YWN0bHkgb25lIGVsbGlwc2lzIG9iamVjdCxcbm5hbWVkIGBgRWxsaXBzaXNgYCAoYSBidWlsdC1pbiBuYW1lKS5cblxuSXQgaXMgd3JpdHRlbiBhcyBgYEVsbGlwc2lzYGAuXG4nLAotICdibHRpbi1maWxlLW9iamVjdHMnOiB1J1xuRmlsZSBPYmplY3RzXG4qKioqKioqKioqKipcblxuRmlsZSBvYmplY3RzIGFyZSBpbXBsZW1lbnRlZCB1c2luZyBDXCdzIGBgc3RkaW9gYCBwYWNrYWdlIGFuZCBjYW4gYmVcbmNyZWF0ZWQgd2l0aCB0aGUgYnVpbHQtaW4gYGBvcGVuKClgYCBmdW5jdGlvbi4gIEZpbGUgb2JqZWN0cyBhcmUgYWxzb1xucmV0dXJuZWQgYnkgc29tZSBvdGhlciBidWlsdC1pbiBmdW5jdGlvbnMgYW5kIG1ldGhvZHMsIHN1Y2ggYXNcbmBgb3MucG9wZW4oKWBgIGFuZCBgYG9zLmZkb3BlbigpYGAgYW5kIHRoZSBgYG1ha2VmaWxlKClgYCBtZXRob2Qgb2ZcbnNvY2tldCBvYmplY3RzLiBUZW1wb3JhcnkgZmlsZXMgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIGBgdGVtcGZpbGVgYFxubW9kdWxlLCBhbmQgaGlnaC1sZXZlbCBmaWxlIG9wZXJhdGlvbnMgc3VjaCBhcyBjb3B5aW5nLCBtb3ZpbmcsIGFuZFxuZGVsZXRpbmcgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGNhbiBiZSBhY2hpZXZlZCB3aXRoIHRoZSBgYHNodXRpbGBgXG5tb2R1bGUuXG5cbldoZW4gYSBmaWxlIG9wZXJhdGlvbiBmYWlscyBmb3IgYW4gSS9PLXJlbGF0ZWQgcmVhc29uLCB0aGUgZXhjZXB0aW9uXG5gYElPRXJyb3JgYCBpcyByYWlzZWQuICBUaGlzIGluY2x1ZGVzIHNpdHVhdGlvbnMgd2hlcmUgdGhlIG9wZXJhdGlvblxuaXMgbm90IGRlZmluZWQgZm9yIHNvbWUgcmVhc29uLCBsaWtlIGBgc2VlaygpYGAgb24gYSB0dHkgZGV2aWNlIG9yXG53cml0aW5nIGEgZmlsZSBvcGVuZWQgZm9yIHJlYWRpbmcuXG5cbkZpbGVzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOlxuXG5maWxlLmNsb3NlKClcblxuICAgQ2xvc2UgdGhlIGZpbGUuICBBIGNsb3NlZCBmaWxlIGNhbm5vdCBiZSByZWFkIG9yIHdyaXR0ZW4gYW55IG1vcmUuXG4gICBBbnkgb3BlcmF0aW9uIHdoaWNoIHJlcXVpcmVzIHRoYXQgdGhlIGZpbGUgYmUgb3BlbiB3aWxsIHJhaXNlIGFcbiAgIGBgVmFsdWVFcnJvcmBgIGFmdGVyIHRoZSBmaWxlIGhhcyBiZWVuIGNsb3NlZC4gIENhbGxpbmcgYGBjbG9zZSgpYGBcbiAgIG1vcmUgdGhhbiBvbmNlIGlzIGFsbG93ZWQuXG5cbiAgIEFzIG9mIFB5dGhvbiAyLjUsIHlvdSBjYW4gYXZvaWQgaGF2aW5nIHRvIGNhbGwgdGhpcyBtZXRob2RcbiAgIGV4cGxpY2l0bHkgaWYgeW91IHVzZSB0aGUgYGB3aXRoYGAgc3RhdGVtZW50LiAgRm9yIGV4YW1wbGUsIHRoZVxuICAgZm9sbG93aW5nIGNvZGUgd2lsbCBhdXRvbWF0aWNhbGx5IGNsb3NlICpmKiB3aGVuIHRoZSBgYHdpdGhgYCBibG9ja1xuICAgaXMgZXhpdGVkOlxuXG4gICAgICBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50ICMgVGhpcyBpc25cJ3QgcmVxdWlyZWQgaW4gUHl0aG9uIDIuNlxuXG4gICAgICB3aXRoIG9wZW4oImhlbGxvLnR4dCIpIGFzIGY6XG4gICAgICAgICAgZm9yIGxpbmUgaW4gZjpcbiAgICAgICAgICAgICAgcHJpbnQgbGluZVxuXG4gICBJbiBvbGRlciB2ZXJzaW9ucyBvZiBQeXRob24sIHlvdSB3b3VsZCBoYXZlIG5lZWRlZCB0byBkbyB0aGlzIHRvXG4gICBnZXQgdGhlIHNhbWUgZWZmZWN0OlxuXG4gICAgICBmID0gb3BlbigiaGVsbG8udHh0IilcbiAgICAgIHRyeTpcbiAgICAgICAgICBmb3IgbGluZSBpbiBmOlxuICAgICAgICAgICAgICBwcmludCBsaW5lXG4gICAgICBmaW5hbGx5OlxuICAgICAgICAgIGYuY2xvc2UoKVxuXG4gICBOb3RlOiBOb3QgYWxsICJmaWxlLWxpa2UiIHR5cGVzIGluIFB5dGhvbiBzdXBwb3J0IHVzZSBhcyBhIGNvbnRleHRcbiAgICAgbWFuYWdlciBmb3IgdGhlIGBgd2l0aGBgIHN0YXRlbWVudC4gIElmIHlvdXIgY29kZSBpcyBpbnRlbmRlZCB0b1xuICAgICB3b3JrIHdpdGggYW55IGZpbGUtbGlrZSBvYmplY3QsIHlvdSBjYW4gdXNlIHRoZSBmdW5jdGlvblxuICAgICBgYGNvbnRleHRsaWIuY2xvc2luZygpYGAgaW5zdGVhZCBvZiB1c2luZyB0aGUgb2JqZWN0IGRpcmVjdGx5LlxuXG5maWxlLmZsdXNoKClcblxuICAgRmx1c2ggdGhlIGludGVybmFsIGJ1ZmZlciwgbGlrZSBgYHN0ZGlvYGBcJ3MgYGBmZmx1c2goKWBgLiAgVGhpcyBtYXlcbiAgIGJlIGEgbm8tb3Agb24gc29tZSBmaWxlLWxpa2Ugb2JqZWN0cy5cblxuICAgTm90ZTogYGBmbHVzaCgpYGAgZG9lcyBub3QgbmVjZXNzYXJpbHkgd3JpdGUgdGhlIGZpbGVcJ3MgZGF0YSB0byBkaXNrLlxuICAgICBVc2UgYGBmbHVzaCgpYGAgZm9sbG93ZWQgYnkgYGBvcy5mc3luYygpYGAgdG8gZW5zdXJlIHRoaXNcbiAgICAgYmVoYXZpb3IuXG5cbmZpbGUuZmlsZW5vKClcblxuICAgUmV0dXJuIHRoZSBpbnRlZ2VyICJmaWxlIGRlc2NyaXB0b3IiIHRoYXQgaXMgdXNlZCBieSB0aGUgdW5kZXJseWluZ1xuICAgaW1wbGVtZW50YXRpb24gdG8gcmVxdWVzdCBJL08gb3BlcmF0aW9ucyBmcm9tIHRoZSBvcGVyYXRpbmcgc3lzdGVtLlxuICAgVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBvdGhlciwgbG93ZXIgbGV2ZWwgaW50ZXJmYWNlcyB0aGF0IHVzZSBmaWxlXG4gICBkZXNjcmlwdG9ycywgc3VjaCBhcyB0aGUgYGBmY250bGBgIG1vZHVsZSBvciBgYG9zLnJlYWQoKWBgIGFuZFxuICAgZnJpZW5kcy5cblxuICAgTm90ZTogRmlsZS1saWtlIG9iamVjdHMgd2hpY2ggZG8gbm90IGhhdmUgYSByZWFsIGZpbGUgZGVzY3JpcHRvciBzaG91bGRcbiAgICAgKm5vdCogcHJvdmlkZSB0aGlzIG1ldGhvZCFcblxuZmlsZS5pc2F0dHkoKVxuXG4gICBSZXR1cm4gYGBUcnVlYGAgaWYgdGhlIGZpbGUgaXMgY29ubmVjdGVkIHRvIGEgdHR5KC1saWtlKSBkZXZpY2UsXG4gICBlbHNlIGBgRmFsc2VgYC5cblxuICAgTm90ZTogSWYgYSBmaWxlLWxpa2Ugb2JqZWN0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSByZWFsIGZpbGUsIHRoaXNcbiAgICAgbWV0aG9kIHNob3VsZCAqbm90KiBiZSBpbXBsZW1lbnRlZC5cblxuZmlsZS5uZXh0KClcblxuICAgQSBmaWxlIG9iamVjdCBpcyBpdHMgb3duIGl0ZXJhdG9yLCBmb3IgZXhhbXBsZSBgYGl0ZXIoZilgYCByZXR1cm5zXG4gICAqZiogKHVubGVzcyAqZiogaXMgY2xvc2VkKS4gIFdoZW4gYSBmaWxlIGlzIHVzZWQgYXMgYW4gaXRlcmF0b3IsXG4gICB0eXBpY2FsbHkgaW4gYSBgYGZvcmBgIGxvb3AgKGZvciBleGFtcGxlLCBgYGZvciBsaW5lIGluIGY6IHByaW50XG4gICBsaW5lYGApLCB0aGUgYGBuZXh0KClgYCBtZXRob2QgaXMgY2FsbGVkIHJlcGVhdGVkbHkuICBUaGlzIG1ldGhvZFxuICAgcmV0dXJucyB0aGUgbmV4dCBpbnB1dCBsaW5lLCBvciByYWlzZXMgYGBTdG9wSXRlcmF0aW9uYGAgd2hlbiBFT0ZcbiAgIGlzIGhpdCB3aGVuIHRoZSBmaWxlIGlzIG9wZW4gZm9yIHJlYWRpbmcgKGJlaGF2aW9yIGlzIHVuZGVmaW5lZFxuICAgd2hlbiB0aGUgZmlsZSBpcyBvcGVuIGZvciB3cml0aW5nKS4gIEluIG9yZGVyIHRvIG1ha2UgYSBgYGZvcmBgXG4gICBsb29wIHRoZSBtb3N0IGVmZmljaWVudCB3YXkgb2YgbG9vcGluZyBvdmVyIHRoZSBsaW5lcyBvZiBhIGZpbGUgKGFcbiAgIHZlcnkgY29tbW9uIG9wZXJhdGlvbiksIHRoZSBgYG5leHQoKWBgIG1ldGhvZCB1c2VzIGEgaGlkZGVuIHJlYWQtXG4gICBhaGVhZCBidWZmZXIuICBBcyBhIGNvbnNlcXVlbmNlIG9mIHVzaW5nIGEgcmVhZC1haGVhZCBidWZmZXIsXG4gICBjb21iaW5pbmcgYGBuZXh0KClgYCB3aXRoIG90aGVyIGZpbGUgbWV0aG9kcyAobGlrZSBgYHJlYWRsaW5lKClgYClcbiAgIGRvZXMgbm90IHdvcmsgcmlnaHQuICBIb3dldmVyLCB1c2luZyBgYHNlZWsoKWBgIHRvIHJlcG9zaXRpb24gdGhlXG4gICBmaWxlIHRvIGFuIGFic29sdXRlIHBvc2l0aW9uIHdpbGwgZmx1c2ggdGhlIHJlYWQtYWhlYWQgYnVmZmVyLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjMuXG5cbmZpbGUucmVhZChbc2l6ZV0pXG5cbiAgIFJlYWQgYXQgbW9zdCAqc2l6ZSogYnl0ZXMgZnJvbSB0aGUgZmlsZSAobGVzcyBpZiB0aGUgcmVhZCBoaXRzIEVPRlxuICAgYmVmb3JlIG9idGFpbmluZyAqc2l6ZSogYnl0ZXMpLiAgSWYgdGhlICpzaXplKiBhcmd1bWVudCBpcyBuZWdhdGl2ZVxuICAgb3Igb21pdHRlZCwgcmVhZCBhbGwgZGF0YSB1bnRpbCBFT0YgaXMgcmVhY2hlZC4gIFRoZSBieXRlcyBhcmVcbiAgIHJldHVybmVkIGFzIGEgc3RyaW5nIG9iamVjdC4gIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCB3aGVuIEVPRlxuICAgaXMgZW5jb3VudGVyZWQgaW1tZWRpYXRlbHkuICAoRm9yIGNlcnRhaW4gZmlsZXMsIGxpa2UgdHR5cywgaXRcbiAgIG1ha2VzIHNlbnNlIHRvIGNvbnRpbnVlIHJlYWRpbmcgYWZ0ZXIgYW4gRU9GIGlzIGhpdC4pICBOb3RlIHRoYXRcbiAgIHRoaXMgbWV0aG9kIG1heSBjYWxsIHRoZSB1bmRlcmx5aW5nIEMgZnVuY3Rpb24gYGBmcmVhZCgpYGAgbW9yZVxuICAgdGhhbiBvbmNlIGluIGFuIGVmZm9ydCB0byBhY3F1aXJlIGFzIGNsb3NlIHRvICpzaXplKiBieXRlcyBhc1xuICAgcG9zc2libGUuIEFsc28gbm90ZSB0aGF0IHdoZW4gaW4gbm9uLWJsb2NraW5nIG1vZGUsIGxlc3MgZGF0YSB0aGFuXG4gICB3YXMgcmVxdWVzdGVkIG1heSBiZSByZXR1cm5lZCwgZXZlbiBpZiBubyAqc2l6ZSogcGFyYW1ldGVyIHdhc1xuICAgZ2l2ZW4uXG5cbiAgIE5vdGU6IFRoaXMgZnVuY3Rpb24gaXMgc2ltcGx5IGEgd3JhcHBlciBmb3IgdGhlIHVuZGVybHlpbmcgYGBmcmVhZCgpYGBcbiAgICAgQyBmdW5jdGlvbiwgYW5kIHdpbGwgYmVoYXZlIHRoZSBzYW1lIGluIGNvcm5lciBjYXNlcywgc3VjaCBhc1xuICAgICB3aGV0aGVyIHRoZSBFT0YgdmFsdWUgaXMgY2FjaGVkLlxuXG5maWxlLnJlYWRsaW5lKFtzaXplXSlcblxuICAgUmVhZCBvbmUgZW50aXJlIGxpbmUgZnJvbSB0aGUgZmlsZS4gIEEgdHJhaWxpbmcgbmV3bGluZSBjaGFyYWN0ZXJcbiAgIGlzIGtlcHQgaW4gdGhlIHN0cmluZyAoYnV0IG1heSBiZSBhYnNlbnQgd2hlbiBhIGZpbGUgZW5kcyB3aXRoIGFuXG4gICBpbmNvbXBsZXRlIGxpbmUpLiBbNV0gSWYgdGhlICpzaXplKiBhcmd1bWVudCBpcyBwcmVzZW50IGFuZCBub24tXG4gICBuZWdhdGl2ZSwgaXQgaXMgYSBtYXhpbXVtIGJ5dGUgY291bnQgKGluY2x1ZGluZyB0aGUgdHJhaWxpbmdcbiAgIG5ld2xpbmUpIGFuZCBhbiBpbmNvbXBsZXRlIGxpbmUgbWF5IGJlIHJldHVybmVkLiBXaGVuICpzaXplKiBpcyBub3RcbiAgIDAsIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCAqb25seSogd2hlbiBFT0YgaXMgZW5jb3VudGVyZWRcbiAgIGltbWVkaWF0ZWx5LlxuXG4gICBOb3RlOiBVbmxpa2UgYGBzdGRpb2BgXCdzIGBgZmdldHMoKWBgLCB0aGUgcmV0dXJuZWQgc3RyaW5nIGNvbnRhaW5zIG51bGxcbiAgICAgY2hhcmFjdGVycyAoYGBcJ1xcMFwnYGApIGlmIHRoZXkgb2NjdXJyZWQgaW4gdGhlIGlucHV0LlxuXG5maWxlLnJlYWRsaW5lcyhbc2l6ZWhpbnRdKVxuXG4gICBSZWFkIHVudGlsIEVPRiB1c2luZyBgYHJlYWRsaW5lKClgYCBhbmQgcmV0dXJuIGEgbGlzdCBjb250YWluaW5nXG4gICB0aGUgbGluZXMgdGh1cyByZWFkLiAgSWYgdGhlIG9wdGlvbmFsICpzaXplaGludCogYXJndW1lbnQgaXNcbiAgIHByZXNlbnQsIGluc3RlYWQgb2YgcmVhZGluZyB1cCB0byBFT0YsIHdob2xlIGxpbmVzIHRvdGFsbGluZ1xuICAgYXBwcm94aW1hdGVseSAqc2l6ZWhpbnQqIGJ5dGVzIChwb3NzaWJseSBhZnRlciByb3VuZGluZyB1cCB0byBhblxuICAgaW50ZXJuYWwgYnVmZmVyIHNpemUpIGFyZSByZWFkLiAgT2JqZWN0cyBpbXBsZW1lbnRpbmcgYSBmaWxlLWxpa2VcbiAgIGludGVyZmFjZSBtYXkgY2hvb3NlIHRvIGlnbm9yZSAqc2l6ZWhpbnQqIGlmIGl0IGNhbm5vdCBiZVxuICAgaW1wbGVtZW50ZWQsIG9yIGNhbm5vdCBiZSBpbXBsZW1lbnRlZCBlZmZpY2llbnRseS5cblxuZmlsZS54cmVhZGxpbmVzKClcblxuICAgVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgc2FtZSB0aGluZyBhcyBgYGl0ZXIoZilgYC5cblxuICAgTmV3IGluIHZlcnNpb24gMi4xLlxuXG4gICBEZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi4zOiBVc2UgYGBmb3IgbGluZSBpbiBmaWxlYGAgaW5zdGVhZC5cblxuZmlsZS5zZWVrKG9mZnNldFssIHdoZW5jZV0pXG5cbiAgIFNldCB0aGUgZmlsZVwncyBjdXJyZW50IHBvc2l0aW9uLCBsaWtlIGBgc3RkaW9gYFwncyBgYGZzZWVrKClgYC4gVGhlXG4gICAqd2hlbmNlKiBhcmd1bWVudCBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gIGBgb3MuU0VFS19TRVRgYCBvclxuICAgYGAwYGAgKGFic29sdXRlIGZpbGUgcG9zaXRpb25pbmcpOyBvdGhlciB2YWx1ZXMgYXJlIGBgb3MuU0VFS19DVVJgYFxuICAgb3IgYGAxYGAgKHNlZWsgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24pIGFuZFxuICAgYGBvcy5TRUVLX0VORGBgIG9yIGBgMmBgICAoc2VlayByZWxhdGl2ZSB0byB0aGUgZmlsZVwncyBlbmQpLiAgVGhlcmVcbiAgIGlzIG5vIHJldHVybiB2YWx1ZS5cblxuICAgRm9yIGV4YW1wbGUsIGBgZi5zZWVrKDIsIG9zLlNFRUtfQ1VSKWBgIGFkdmFuY2VzIHRoZSBwb3NpdGlvbiBieVxuICAgdHdvIGFuZCBgYGYuc2VlaygtMywgb3MuU0VFS19FTkQpYGAgc2V0cyB0aGUgcG9zaXRpb24gdG8gdGhlIHRoaXJkXG4gICB0byBsYXN0LlxuXG4gICBOb3RlIHRoYXQgaWYgdGhlIGZpbGUgaXMgb3BlbmVkIGZvciBhcHBlbmRpbmcgKG1vZGUgYGBcJ2FcJ2BgIG9yXG4gICBgYFwnYStcJ2BgKSwgYW55IGBgc2VlaygpYGAgb3BlcmF0aW9ucyB3aWxsIGJlIHVuZG9uZSBhdCB0aGUgbmV4dFxuICAgd3JpdGUuICBJZiB0aGUgZmlsZSBpcyBvbmx5IG9wZW5lZCBmb3Igd3JpdGluZyBpbiBhcHBlbmQgbW9kZSAobW9kZVxuICAgYGBcJ2FcJ2BgKSwgdGhpcyBtZXRob2QgaXMgZXNzZW50aWFsbHkgYSBuby1vcCwgYnV0IGl0IHJlbWFpbnMgdXNlZnVsXG4gICBmb3IgZmlsZXMgb3BlbmVkIGluIGFwcGVuZCBtb2RlIHdpdGggcmVhZGluZyBlbmFibGVkIChtb2RlXG4gICBgYFwnYStcJ2BgKS4gIElmIHRoZSBmaWxlIGlzIG9wZW5lZCBpbiB0ZXh0IG1vZGUgKHdpdGhvdXQgYGBcJ2JcJ2BgKSxcbiAgIG9ubHkgb2Zmc2V0cyByZXR1cm5lZCBieSBgYHRlbGwoKWBgIGFyZSBsZWdhbC4gIFVzZSBvZiBvdGhlclxuICAgb2Zmc2V0cyBjYXVzZXMgdW5kZWZpbmVkIGJlaGF2aW9yLlxuXG4gICBOb3RlIHRoYXQgbm90IGFsbCBmaWxlIG9iamVjdHMgYXJlIHNlZWthYmxlLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi42OiBQYXNzaW5nIGZsb2F0IHZhbHVlcyBhcyBvZmZzZXQgaGFzIGJlZW5cbiAgIGRlcHJlY2F0ZWQuXG5cbmZpbGUudGVsbCgpXG5cbiAgIFJldHVybiB0aGUgZmlsZVwncyBjdXJyZW50IHBvc2l0aW9uLCBsaWtlIGBgc3RkaW9gYFwncyBgYGZ0ZWxsKClgYC5cblxuICAgTm90ZTogT24gV2luZG93cywgYGB0ZWxsKClgYCBjYW4gcmV0dXJuIGlsbGVnYWwgdmFsdWVzIChhZnRlciBhblxuICAgICBgYGZnZXRzKClgYCkgd2hlbiByZWFkaW5nIGZpbGVzIHdpdGggVW5peC1zdHlsZSBsaW5lLWVuZGluZ3MuIFVzZVxuICAgICBiaW5hcnkgbW9kZSAoYGBcJ3JiXCdgYCkgdG8gY2lyY3VtdmVudCB0aGlzIHByb2JsZW0uXG5cbmZpbGUudHJ1bmNhdGUoW3NpemVdKVxuXG4gICBUcnVuY2F0ZSB0aGUgZmlsZVwncyBzaXplLiAgSWYgdGhlIG9wdGlvbmFsICpzaXplKiBhcmd1bWVudCBpc1xuICAgcHJlc2VudCwgdGhlIGZpbGUgaXMgdHJ1bmNhdGVkIHRvIChhdCBtb3N0KSB0aGF0IHNpemUuICBUaGUgc2l6ZVxuICAgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24uIFRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24gaXMgbm90XG4gICBjaGFuZ2VkLiAgTm90ZSB0aGF0IGlmIGEgc3BlY2lmaWVkIHNpemUgZXhjZWVkcyB0aGUgZmlsZVwncyBjdXJyZW50XG4gICBzaXplLCB0aGUgcmVzdWx0IGlzIHBsYXRmb3JtLWRlcGVuZGVudDogIHBvc3NpYmlsaXRpZXMgaW5jbHVkZSB0aGF0XG4gICB0aGUgZmlsZSBtYXkgcmVtYWluIHVuY2hhbmdlZCwgaW5jcmVhc2UgdG8gdGhlIHNwZWNpZmllZCBzaXplIGFzIGlmXG4gICB6ZXJvLWZpbGxlZCwgb3IgaW5jcmVhc2UgdG8gdGhlIHNwZWNpZmllZCBzaXplIHdpdGggdW5kZWZpbmVkIG5ld1xuICAgY29udGVudC4gQXZhaWxhYmlsaXR5OiAgV2luZG93cywgbWFueSBVbml4IHZhcmlhbnRzLlxuXG5maWxlLndyaXRlKHN0cilcblxuICAgV3JpdGUgYSBzdHJpbmcgdG8gdGhlIGZpbGUuICBUaGVyZSBpcyBubyByZXR1cm4gdmFsdWUuICBEdWUgdG9cbiAgIGJ1ZmZlcmluZywgdGhlIHN0cmluZyBtYXkgbm90IGFjdHVhbGx5IHNob3cgdXAgaW4gdGhlIGZpbGUgdW50aWxcbiAgIHRoZSBgYGZsdXNoKClgYCBvciBgYGNsb3NlKClgYCBtZXRob2QgaXMgY2FsbGVkLlxuXG5maWxlLndyaXRlbGluZXMoc2VxdWVuY2UpXG5cbiAgIFdyaXRlIGEgc2VxdWVuY2Ugb2Ygc3RyaW5ncyB0byB0aGUgZmlsZS4gIFRoZSBzZXF1ZW5jZSBjYW4gYmUgYW55XG4gICBpdGVyYWJsZSBvYmplY3QgcHJvZHVjaW5nIHN0cmluZ3MsIHR5cGljYWxseSBhIGxpc3Qgb2Ygc3RyaW5ncy5cbiAgIFRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZS4gKFRoZSBuYW1lIGlzIGludGVuZGVkIHRvIG1hdGNoXG4gICBgYHJlYWRsaW5lcygpYGA7IGBgd3JpdGVsaW5lcygpYGAgZG9lcyBub3QgYWRkIGxpbmUgc2VwYXJhdG9ycy4pXG5cbkZpbGVzIHN1cHBvcnQgdGhlIGl0ZXJhdG9yIHByb3RvY29sLiAgRWFjaCBpdGVyYXRpb24gcmV0dXJucyB0aGUgc2FtZVxucmVzdWx0IGFzIGBgZmlsZS5yZWFkbGluZSgpYGAsIGFuZCBpdGVyYXRpb24gZW5kcyB3aGVuIHRoZVxuYGByZWFkbGluZSgpYGAgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLlxuXG5GaWxlIG9iamVjdHMgYWxzbyBvZmZlciBhIG51bWJlciBvZiBvdGhlciBpbnRlcmVzdGluZyBhdHRyaWJ1dGVzLlxuVGhlc2UgYXJlIG5vdCByZXF1aXJlZCBmb3IgZmlsZS1saWtlIG9iamVjdHMsIGJ1dCBzaG91bGQgYmVcbmltcGxlbWVudGVkIGlmIHRoZXkgbWFrZSBzZW5zZSBmb3IgdGhlIHBhcnRpY3VsYXIgb2JqZWN0LlxuXG5maWxlLmNsb3NlZFxuXG4gICBib29sIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGZpbGUgb2JqZWN0LiAgVGhpcyBpcyBhXG4gICByZWFkLW9ubHkgYXR0cmlidXRlOyB0aGUgYGBjbG9zZSgpYGAgbWV0aG9kIGNoYW5nZXMgdGhlIHZhbHVlLiBJdFxuICAgbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gYWxsIGZpbGUtbGlrZSBvYmplY3RzLlxuXG5maWxlLmVuY29kaW5nXG5cbiAgIFRoZSBlbmNvZGluZyB0aGF0IHRoaXMgZmlsZSB1c2VzLiBXaGVuIFVuaWNvZGUgc3RyaW5ncyBhcmUgd3JpdHRlblxuICAgdG8gYSBmaWxlLCB0aGV5IHdpbGwgYmUgY29udmVydGVkIHRvIGJ5dGUgc3RyaW5ncyB1c2luZyB0aGlzXG4gICBlbmNvZGluZy4gSW4gYWRkaXRpb24sIHdoZW4gdGhlIGZpbGUgaXMgY29ubmVjdGVkIHRvIGEgdGVybWluYWwsXG4gICB0aGUgYXR0cmlidXRlIGdpdmVzIHRoZSBlbmNvZGluZyB0aGF0IHRoZSB0ZXJtaW5hbCBpcyBsaWtlbHkgdG8gdXNlXG4gICAodGhhdCAgaW5mb3JtYXRpb24gbWlnaHQgYmUgaW5jb3JyZWN0IGlmIHRoZSB1c2VyIGhhcyBtaXNjb25maWd1cmVkXG4gICB0aGUgIHRlcm1pbmFsKS4gVGhlIGF0dHJpYnV0ZSBpcyByZWFkLW9ubHkgYW5kIG1heSBub3QgYmUgcHJlc2VudFxuICAgb24gYWxsIGZpbGUtbGlrZSBvYmplY3RzLiBJdCBtYXkgYWxzbyBiZSBgYE5vbmVgYCwgaW4gd2hpY2ggY2FzZVxuICAgdGhlIGZpbGUgdXNlcyB0aGUgc3lzdGVtIGRlZmF1bHQgZW5jb2RpbmcgZm9yIGNvbnZlcnRpbmcgVW5pY29kZVxuICAgc3RyaW5ncy5cblxuICAgTmV3IGluIHZlcnNpb24gMi4zLlxuXG5maWxlLmVycm9yc1xuXG4gICBUaGUgVW5pY29kZSBlcnJvciBoYW5kbGVyIHVzZWQgYWxvbmcgd2l0aCB0aGUgZW5jb2RpbmcuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDIuNi5cblxuZmlsZS5tb2RlXG5cbiAgIFRoZSBJL08gbW9kZSBmb3IgdGhlIGZpbGUuICBJZiB0aGUgZmlsZSB3YXMgY3JlYXRlZCB1c2luZyB0aGVcbiAgIGBgb3BlbigpYGAgYnVpbHQtaW4gZnVuY3Rpb24sIHRoaXMgd2lsbCBiZSB0aGUgdmFsdWUgb2YgdGhlICptb2RlKlxuICAgcGFyYW1ldGVyLiAgVGhpcyBpcyBhIHJlYWQtb25seSBhdHRyaWJ1dGUgYW5kIG1heSBub3QgYmUgcHJlc2VudCBvblxuICAgYWxsIGZpbGUtbGlrZSBvYmplY3RzLlxuXG5maWxlLm5hbWVcblxuICAgSWYgdGhlIGZpbGUgb2JqZWN0IHdhcyBjcmVhdGVkIHVzaW5nIGBgb3BlbigpYGAsIHRoZSBuYW1lIG9mIHRoZVxuICAgZmlsZS4gT3RoZXJ3aXNlLCBzb21lIHN0cmluZyB0aGF0IGluZGljYXRlcyB0aGUgc291cmNlIG9mIHRoZSBmaWxlXG4gICBvYmplY3QsIG9mIHRoZSBmb3JtIGBgPC4uLj5gYC4gIFRoaXMgaXMgYSByZWFkLW9ubHkgYXR0cmlidXRlIGFuZFxuICAgbWF5IG5vdCBiZSBwcmVzZW50IG9uIGFsbCBmaWxlLWxpa2Ugb2JqZWN0cy5cblxuZmlsZS5uZXdsaW5lc1xuXG4gICBJZiBQeXRob24gd2FzIGJ1aWx0IHdpdGggdW5pdmVyc2FsIG5ld2xpbmVzIGVuYWJsZWQgKHRoZSBkZWZhdWx0KVxuICAgdGhpcyByZWFkLW9ubHkgYXR0cmlidXRlIGV4aXN0cywgYW5kIGZvciBmaWxlcyBvcGVuZWQgaW4gdW5pdmVyc2FsXG4gICBuZXdsaW5lIHJlYWQgbW9kZSBpdCBrZWVwcyB0cmFjayBvZiB0aGUgdHlwZXMgb2YgbmV3bGluZXNcbiAgIGVuY291bnRlcmVkIHdoaWxlIHJlYWRpbmcgdGhlIGZpbGUuIFRoZSB2YWx1ZXMgaXQgY2FuIHRha2UgYXJlXG4gICBgYFwnXFxyXCdgYCwgYGBcJ1xcblwnYGAsIGBgXCdcXHJcXG5cJ2BgLCBgYE5vbmVgYCAodW5rbm93biwgbm8gbmV3bGluZXMgcmVhZFxuICAgeWV0KSBvciBhIHR1cGxlIGNvbnRhaW5pbmcgYWxsIHRoZSBuZXdsaW5lIHR5cGVzIHNlZW4sIHRvIGluZGljYXRlXG4gICB0aGF0IG11bHRpcGxlIG5ld2xpbmUgY29udmVudGlvbnMgd2VyZSBlbmNvdW50ZXJlZC4gRm9yIGZpbGVzIG5vdFxuICAgb3BlbmVkIGluIHVuaXZlcnNhbCBuZXdsaW5lIHJlYWQgbW9kZSB0aGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGVcbiAgIHdpbGwgYmUgYGBOb25lYGAuXG5cbmZpbGUuc29mdHNwYWNlXG5cbiAgIEJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBhIHNwYWNlIGNoYXJhY3RlciBuZWVkcyB0byBiZVxuICAgcHJpbnRlZCBiZWZvcmUgYW5vdGhlciB2YWx1ZSB3aGVuIHVzaW5nIHRoZSBgYHByaW50YGAgc3RhdGVtZW50LlxuICAgQ2xhc3NlcyB0aGF0IGFyZSB0cnlpbmcgdG8gc2ltdWxhdGUgYSBmaWxlIG9iamVjdCBzaG91bGQgYWxzbyBoYXZlXG4gICBhIHdyaXRhYmxlIGBgc29mdHNwYWNlYGAgYXR0cmlidXRlLCB3aGljaCBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgdG9cbiAgIHplcm8uICBUaGlzIHdpbGwgYmUgYXV0b21hdGljIGZvciBtb3N0IGNsYXNzZXMgaW1wbGVtZW50ZWQgaW5cbiAgIFB5dGhvbiAoY2FyZSBtYXkgYmUgbmVlZGVkIGZvciBvYmplY3RzIHRoYXQgb3ZlcnJpZGUgYXR0cmlidXRlXG4gICBhY2Nlc3MpOyB0eXBlcyBpbXBsZW1lbnRlZCBpbiBDIHdpbGwgaGF2ZSB0byBwcm92aWRlIGEgd3JpdGFibGVcbiAgIGBgc29mdHNwYWNlYGAgYXR0cmlidXRlLlxuXG4gICBOb3RlOiBUaGlzIGF0dHJpYnV0ZSBpcyBub3QgdXNlZCB0byBjb250cm9sIHRoZSBgYHByaW50YGAgc3RhdGVtZW50LFxuICAgICBidXQgdG8gYWxsb3cgdGhlIGltcGxlbWVudGF0aW9uIG9mIGBgcHJpbnRgYCB0byBrZWVwIHRyYWNrIG9mIGl0c1xuICAgICBpbnRlcm5hbCBzdGF0ZS5cbicsCi0gJ2JsdGluLW51bGwtb2JqZWN0JzogdSJcblRoZSBOdWxsIE9iamVjdFxuKioqKioqKioqKioqKioqXG5cblRoaXMgb2JqZWN0IGlzIHJldHVybmVkIGJ5IGZ1bmN0aW9ucyB0aGF0IGRvbid0IGV4cGxpY2l0bHkgcmV0dXJuIGFcbnZhbHVlLiAgSXQgc3VwcG9ydHMgbm8gc3BlY2lhbCBvcGVyYXRpb25zLiAgVGhlcmUgaXMgZXhhY3RseSBvbmUgbnVsbFxub2JqZWN0LCBuYW1lZCBgYE5vbmVgYCAoYSBidWlsdC1pbiBuYW1lKS5cblxuSXQgaXMgd3JpdHRlbiBhcyBgYE5vbmVgYC5cbiIsCi0gJ2JsdGluLXR5cGUtb2JqZWN0cyc6IHUiXG5UeXBlIE9iamVjdHNcbioqKioqKioqKioqKlxuXG5UeXBlIG9iamVjdHMgcmVwcmVzZW50IHRoZSB2YXJpb3VzIG9iamVjdCB0eXBlcy4gIEFuIG9iamVjdCdzIHR5cGUgaXNcbmFjY2Vzc2VkIGJ5IHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYHR5cGUoKWBgLiAgVGhlcmUgYXJlIG5vIHNwZWNpYWxcbm9wZXJhdGlvbnMgb24gdHlwZXMuICBUaGUgc3RhbmRhcmQgbW9kdWxlIGBgdHlwZXNgYCBkZWZpbmVzIG5hbWVzIGZvclxuYWxsIHN0YW5kYXJkIGJ1aWx0LWluIHR5cGVzLlxuXG5UeXBlcyBhcmUgd3JpdHRlbiBsaWtlIHRoaXM6IGBgPHR5cGUgJ2ludCc+YGAuXG4iLAotICdib29sZWFucyc6IHUnXG5Cb29sZWFuIG9wZXJhdGlvbnNcbioqKioqKioqKioqKioqKioqKlxuXG4gICBvcl90ZXN0ICA6Oj0gYW5kX3Rlc3QgfCBvcl90ZXN0ICJvciIgYW5kX3Rlc3RcbiAgIGFuZF90ZXN0IDo6PSBub3RfdGVzdCB8IGFuZF90ZXN0ICJhbmQiIG5vdF90ZXN0XG4gICBub3RfdGVzdCA6Oj0gY29tcGFyaXNvbiB8ICJub3QiIG5vdF90ZXN0XG5cbkluIHRoZSBjb250ZXh0IG9mIEJvb2xlYW4gb3BlcmF0aW9ucywgYW5kIGFsc28gd2hlbiBleHByZXNzaW9ucyBhcmVcbnVzZWQgYnkgY29udHJvbCBmbG93IHN0YXRlbWVudHMsIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBpbnRlcnByZXRlZFxuYXMgZmFsc2U6IGBgRmFsc2VgYCwgYGBOb25lYGAsIG51bWVyaWMgemVybyBvZiBhbGwgdHlwZXMsIGFuZCBlbXB0eVxuc3RyaW5ncyBhbmQgY29udGFpbmVycyAoaW5jbHVkaW5nIHN0cmluZ3MsIHR1cGxlcywgbGlzdHMsXG5kaWN0aW9uYXJpZXMsIHNldHMgYW5kIGZyb3plbnNldHMpLiAgQWxsIG90aGVyIHZhbHVlcyBhcmUgaW50ZXJwcmV0ZWRcbmFzIHRydWUuICAoU2VlIHRoZSBgYF9fbm9uemVyb19fKClgYCBzcGVjaWFsIG1ldGhvZCBmb3IgYSB3YXkgdG9cbmNoYW5nZSB0aGlzLilcblxuVGhlIG9wZXJhdG9yIGBgbm90YGAgeWllbGRzIGBgVHJ1ZWBgIGlmIGl0cyBhcmd1bWVudCBpcyBmYWxzZSxcbmBgRmFsc2VgYCBvdGhlcndpc2UuXG5cblRoZSBleHByZXNzaW9uIGBgeCBhbmQgeWBgIGZpcnN0IGV2YWx1YXRlcyAqeCo7IGlmICp4KiBpcyBmYWxzZSwgaXRzXG52YWx1ZSBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlLCAqeSogaXMgZXZhbHVhdGVkIGFuZCB0aGUgcmVzdWx0aW5nIHZhbHVlXG5pcyByZXR1cm5lZC5cblxuVGhlIGV4cHJlc3Npb24gYGB4IG9yIHlgYCBmaXJzdCBldmFsdWF0ZXMgKngqOyBpZiAqeCogaXMgdHJ1ZSwgaXRzXG52YWx1ZSBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlLCAqeSogaXMgZXZhbHVhdGVkIGFuZCB0aGUgcmVzdWx0aW5nIHZhbHVlXG5pcyByZXR1cm5lZC5cblxuKE5vdGUgdGhhdCBuZWl0aGVyIGBgYW5kYGAgbm9yIGBgb3JgYCByZXN0cmljdCB0aGUgdmFsdWUgYW5kIHR5cGUgdGhleVxucmV0dXJuIHRvIGBgRmFsc2VgYCBhbmQgYGBUcnVlYGAsIGJ1dCByYXRoZXIgcmV0dXJuIHRoZSBsYXN0IGV2YWx1YXRlZFxuYXJndW1lbnQuIFRoaXMgaXMgc29tZXRpbWVzIHVzZWZ1bCwgZS5nLiwgaWYgYGBzYGAgaXMgYSBzdHJpbmcgdGhhdFxuc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IGEgZGVmYXVsdCB2YWx1ZSBpZiBpdCBpcyBlbXB0eSwgdGhlIGV4cHJlc3Npb25cbmBgcyBvciBcJ2Zvb1wnYGAgeWllbGRzIHRoZSBkZXNpcmVkIHZhbHVlLiAgQmVjYXVzZSBgYG5vdGBgIGhhcyB0b1xuaW52ZW50IGEgdmFsdWUgYW55d2F5LCBpdCBkb2VzIG5vdCBib3RoZXIgdG8gcmV0dXJuIGEgdmFsdWUgb2YgdGhlXG5zYW1lIHR5cGUgYXMgaXRzIGFyZ3VtZW50LCBzbyBlLmcuLCBgYG5vdCBcJ2Zvb1wnYGAgeWllbGRzIGBgRmFsc2VgYCxcbm5vdCBgYFwnXCdgYC4pXG4nLAotICdicmVhayc6IHUnXG5UaGUgYGBicmVha2BgIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKipcblxuICAgYnJlYWtfc3RtdCA6Oj0gImJyZWFrIlxuXG5gYGJyZWFrYGAgbWF5IG9ubHkgb2NjdXIgc3ludGFjdGljYWxseSBuZXN0ZWQgaW4gYSBgYGZvcmBgIG9yXG5gYHdoaWxlYGAgbG9vcCwgYnV0IG5vdCBuZXN0ZWQgaW4gYSBmdW5jdGlvbiBvciBjbGFzcyBkZWZpbml0aW9uXG53aXRoaW4gdGhhdCBsb29wLlxuXG5JdCB0ZXJtaW5hdGVzIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBsb29wLCBza2lwcGluZyB0aGUgb3B0aW9uYWxcbmBgZWxzZWBgIGNsYXVzZSBpZiB0aGUgbG9vcCBoYXMgb25lLlxuXG5JZiBhIGBgZm9yYGAgbG9vcCBpcyB0ZXJtaW5hdGVkIGJ5IGBgYnJlYWtgYCwgdGhlIGxvb3AgY29udHJvbCB0YXJnZXRcbmtlZXBzIGl0cyBjdXJyZW50IHZhbHVlLlxuXG5XaGVuIGBgYnJlYWtgYCBwYXNzZXMgY29udHJvbCBvdXQgb2YgYSBgYHRyeWBgIHN0YXRlbWVudCB3aXRoIGFcbmBgZmluYWxseWBgIGNsYXVzZSwgdGhhdCBgYGZpbmFsbHlgYCBjbGF1c2UgaXMgZXhlY3V0ZWQgYmVmb3JlIHJlYWxseVxubGVhdmluZyB0aGUgbG9vcC5cbicsCi0gJ2NhbGxhYmxlLXR5cGVzJzogdSdcbkVtdWxhdGluZyBjYWxsYWJsZSBvYmplY3RzXG4qKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5vYmplY3QuX19jYWxsX18oc2VsZlssIGFyZ3MuLi5dKVxuXG4gICBDYWxsZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgImNhbGxlZCIgYXMgYSBmdW5jdGlvbjsgaWYgdGhpcyBtZXRob2RcbiAgIGlzIGRlZmluZWQsIGBgeChhcmcxLCBhcmcyLCAuLi4pYGAgaXMgYSBzaG9ydGhhbmQgZm9yXG4gICBgYHguX19jYWxsX18oYXJnMSwgYXJnMiwgLi4uKWBgLlxuJywKLSAnY2FsbHMnOiB1J1xuQ2FsbHNcbioqKioqXG5cbkEgY2FsbCBjYWxscyBhIGNhbGxhYmxlIG9iamVjdCAoZS5nLiwgYSBmdW5jdGlvbikgd2l0aCBhIHBvc3NpYmx5XG5lbXB0eSBzZXJpZXMgb2YgYXJndW1lbnRzOlxuXG4gICBjYWxsICAgICAgICAgICAgICAgICA6Oj0gcHJpbWFyeSAiKCIgW2FyZ3VtZW50X2xpc3QgWyIsIl1cbiAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBnZW5leHByX2Zvcl0gIikiXG4gICBhcmd1bWVudF9saXN0ICAgICAgICA6Oj0gcG9zaXRpb25hbF9hcmd1bWVudHMgWyIsIiBrZXl3b3JkX2FyZ3VtZW50c11cbiAgICAgICAgICAgICAgICAgICAgICAgWyIsIiAiKiIgZXhwcmVzc2lvbl0gWyIsIiBrZXl3b3JkX2FyZ3VtZW50c11cbiAgICAgICAgICAgICAgICAgICAgICAgWyIsIiAiKioiIGV4cHJlc3Npb25dXG4gICAgICAgICAgICAgICAgICAgICB8IGtleXdvcmRfYXJndW1lbnRzIFsiLCIgIioiIGV4cHJlc3Npb25dXG4gICAgICAgICAgICAgICAgICAgICAgIFsiLCIgIioqIiBleHByZXNzaW9uXVxuICAgICAgICAgICAgICAgICAgICAgfCAiKiIgZXhwcmVzc2lvbiBbIiwiICIqIiBleHByZXNzaW9uXSBbIiwiICIqKiIgZXhwcmVzc2lvbl1cbiAgICAgICAgICAgICAgICAgICAgIHwgIioqIiBleHByZXNzaW9uXG4gICBwb3NpdGlvbmFsX2FyZ3VtZW50cyA6Oj0gZXhwcmVzc2lvbiAoIiwiIGV4cHJlc3Npb24pKlxuICAga2V5d29yZF9hcmd1bWVudHMgICAgOjo9IGtleXdvcmRfaXRlbSAoIiwiIGtleXdvcmRfaXRlbSkqXG4gICBrZXl3b3JkX2l0ZW0gICAgICAgICA6Oj0gaWRlbnRpZmllciAiPSIgZXhwcmVzc2lvblxuXG5BIHRyYWlsaW5nIGNvbW1hIG1heSBiZSBwcmVzZW50IGFmdGVyIHRoZSBwb3NpdGlvbmFsIGFuZCBrZXl3b3JkXG5hcmd1bWVudHMgYnV0IGRvZXMgbm90IGFmZmVjdCB0aGUgc2VtYW50aWNzLlxuXG5UaGUgcHJpbWFyeSBtdXN0IGV2YWx1YXRlIHRvIGEgY2FsbGFibGUgb2JqZWN0ICh1c2VyLWRlZmluZWRcbmZ1bmN0aW9ucywgYnVpbHQtaW4gZnVuY3Rpb25zLCBtZXRob2RzIG9mIGJ1aWx0LWluIG9iamVjdHMsIGNsYXNzXG5vYmplY3RzLCBtZXRob2RzIG9mIGNsYXNzIGluc3RhbmNlcywgYW5kIGNlcnRhaW4gY2xhc3MgaW5zdGFuY2VzXG50aGVtc2VsdmVzIGFyZSBjYWxsYWJsZTsgZXh0ZW5zaW9ucyBtYXkgZGVmaW5lIGFkZGl0aW9uYWwgY2FsbGFibGVcbm9iamVjdCB0eXBlcykuICBBbGwgYXJndW1lbnQgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCBiZWZvcmUgdGhlIGNhbGxcbmlzIGF0dGVtcHRlZC4gIFBsZWFzZSByZWZlciB0byBzZWN0aW9uICpGdW5jdGlvbiBkZWZpbml0aW9ucyogZm9yIHRoZVxuc3ludGF4IG9mIGZvcm1hbCBwYXJhbWV0ZXIgbGlzdHMuXG5cbklmIGtleXdvcmQgYXJndW1lbnRzIGFyZSBwcmVzZW50LCB0aGV5IGFyZSBmaXJzdCBjb252ZXJ0ZWQgdG9cbnBvc2l0aW9uYWwgYXJndW1lbnRzLCBhcyBmb2xsb3dzLiAgRmlyc3QsIGEgbGlzdCBvZiB1bmZpbGxlZCBzbG90cyBpc1xuY3JlYXRlZCBmb3IgdGhlIGZvcm1hbCBwYXJhbWV0ZXJzLiAgSWYgdGhlcmUgYXJlIE4gcG9zaXRpb25hbFxuYXJndW1lbnRzLCB0aGV5IGFyZSBwbGFjZWQgaW4gdGhlIGZpcnN0IE4gc2xvdHMuICBOZXh0LCBmb3IgZWFjaFxua2V5d29yZCBhcmd1bWVudCwgdGhlIGlkZW50aWZpZXIgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlXG5jb3JyZXNwb25kaW5nIHNsb3QgKGlmIHRoZSBpZGVudGlmaWVyIGlzIHRoZSBzYW1lIGFzIHRoZSBmaXJzdCBmb3JtYWxcbnBhcmFtZXRlciBuYW1lLCB0aGUgZmlyc3Qgc2xvdCBpcyB1c2VkLCBhbmQgc28gb24pLiAgSWYgdGhlIHNsb3QgaXNcbmFscmVhZHkgZmlsbGVkLCBhIGBgVHlwZUVycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZC4gT3RoZXJ3aXNlLCB0aGVcbnZhbHVlIG9mIHRoZSBhcmd1bWVudCBpcyBwbGFjZWQgaW4gdGhlIHNsb3QsIGZpbGxpbmcgaXQgKGV2ZW4gaWYgdGhlXG5leHByZXNzaW9uIGlzIGBgTm9uZWBgLCBpdCBmaWxscyB0aGUgc2xvdCkuICBXaGVuIGFsbCBhcmd1bWVudHMgaGF2ZVxuYmVlbiBwcm9jZXNzZWQsIHRoZSBzbG90cyB0aGF0IGFyZSBzdGlsbCB1bmZpbGxlZCBhcmUgZmlsbGVkIHdpdGggdGhlXG5jb3JyZXNwb25kaW5nIGRlZmF1bHQgdmFsdWUgZnJvbSB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIChEZWZhdWx0XG52YWx1ZXMgYXJlIGNhbGN1bGF0ZWQsIG9uY2UsIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQ7IHRodXMsIGFcbm11dGFibGUgb2JqZWN0IHN1Y2ggYXMgYSBsaXN0IG9yIGRpY3Rpb25hcnkgdXNlZCBhcyBkZWZhdWx0IHZhbHVlIHdpbGxcbmJlIHNoYXJlZCBieSBhbGwgY2FsbHMgdGhhdCBkb25cJ3Qgc3BlY2lmeSBhbiBhcmd1bWVudCB2YWx1ZSBmb3IgdGhlXG5jb3JyZXNwb25kaW5nIHNsb3Q7IHRoaXMgc2hvdWxkIHVzdWFsbHkgYmUgYXZvaWRlZC4pICBJZiB0aGVyZSBhcmUgYW55XG51bmZpbGxlZCBzbG90cyBmb3Igd2hpY2ggbm8gZGVmYXVsdCB2YWx1ZSBpcyBzcGVjaWZpZWQsIGFcbmBgVHlwZUVycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZC4gIE90aGVyd2lzZSwgdGhlIGxpc3Qgb2YgZmlsbGVkXG5zbG90cyBpcyB1c2VkIGFzIHRoZSBhcmd1bWVudCBsaXN0IGZvciB0aGUgY2FsbC5cblxuKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBBbiBpbXBsZW1lbnRhdGlvbiBtYXkgcHJvdmlkZVxuYnVpbHQtaW4gZnVuY3Rpb25zIHdob3NlIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBkbyBub3QgaGF2ZSBuYW1lcywgZXZlblxuaWYgdGhleSBhcmUgXCduYW1lZFwnIGZvciB0aGUgcHVycG9zZSBvZiBkb2N1bWVudGF0aW9uLCBhbmQgd2hpY2hcbnRoZXJlZm9yZSBjYW5ub3QgYmUgc3VwcGxpZWQgYnkga2V5d29yZC4gIEluIENQeXRob24sIHRoaXMgaXMgdGhlIGNhc2VcbmZvciBmdW5jdGlvbnMgaW1wbGVtZW50ZWQgaW4gQyB0aGF0IHVzZSBgYFB5QXJnX1BhcnNlVHVwbGUoKWBgIHRvXG5wYXJzZSB0aGVpciBhcmd1bWVudHMuXG5cbklmIHRoZXJlIGFyZSBtb3JlIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRoYW4gdGhlcmUgYXJlIGZvcm1hbCBwYXJhbWV0ZXJcbnNsb3RzLCBhIGBgVHlwZUVycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZCwgdW5sZXNzIGEgZm9ybWFsIHBhcmFtZXRlclxudXNpbmcgdGhlIHN5bnRheCBgYCppZGVudGlmaWVyYGAgaXMgcHJlc2VudDsgaW4gdGhpcyBjYXNlLCB0aGF0IGZvcm1hbFxucGFyYW1ldGVyIHJlY2VpdmVzIGEgdHVwbGUgY29udGFpbmluZyB0aGUgZXhjZXNzIHBvc2l0aW9uYWwgYXJndW1lbnRzXG4ob3IgYW4gZW1wdHkgdHVwbGUgaWYgdGhlcmUgd2VyZSBubyBleGNlc3MgcG9zaXRpb25hbCBhcmd1bWVudHMpLlxuXG5JZiBhbnkga2V5d29yZCBhcmd1bWVudCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgZm9ybWFsIHBhcmFtZXRlclxubmFtZSwgYSBgYFR5cGVFcnJvcmBgIGV4Y2VwdGlvbiBpcyByYWlzZWQsIHVubGVzcyBhIGZvcm1hbCBwYXJhbWV0ZXJcbnVzaW5nIHRoZSBzeW50YXggYGAqKmlkZW50aWZpZXJgYCBpcyBwcmVzZW50OyBpbiB0aGlzIGNhc2UsIHRoYXRcbmZvcm1hbCBwYXJhbWV0ZXIgcmVjZWl2ZXMgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIGV4Y2VzcyBrZXl3b3JkXG5hcmd1bWVudHMgKHVzaW5nIHRoZSBrZXl3b3JkcyBhcyBrZXlzIGFuZCB0aGUgYXJndW1lbnQgdmFsdWVzIGFzXG5jb3JyZXNwb25kaW5nIHZhbHVlcyksIG9yIGEgKG5ldykgZW1wdHkgZGljdGlvbmFyeSBpZiB0aGVyZSB3ZXJlIG5vXG5leGNlc3Mga2V5d29yZCBhcmd1bWVudHMuXG5cbklmIHRoZSBzeW50YXggYGAqZXhwcmVzc2lvbmBgIGFwcGVhcnMgaW4gdGhlIGZ1bmN0aW9uIGNhbGwsXG5gYGV4cHJlc3Npb25gYCBtdXN0IGV2YWx1YXRlIHRvIGEgc2VxdWVuY2UuICBFbGVtZW50cyBmcm9tIHRoaXNcbnNlcXVlbmNlIGFyZSB0cmVhdGVkIGFzIGlmIHRoZXkgd2VyZSBhZGRpdGlvbmFsIHBvc2l0aW9uYWwgYXJndW1lbnRzO1xuaWYgdGhlcmUgYXJlIHBvc2l0aW9uYWwgYXJndW1lbnRzICp4MSosLi4uLCAqeE4qLCBhbmQgYGBleHByZXNzaW9uYGBcbmV2YWx1YXRlcyB0byBhIHNlcXVlbmNlICp5MSosIC4uLiwgKnlNKiwgdGhpcyBpcyBlcXVpdmFsZW50IHRvIGEgY2FsbFxud2l0aCBNK04gcG9zaXRpb25hbCBhcmd1bWVudHMgKngxKiwgLi4uLCAqeE4qLCAqeTEqLCAuLi4sICp5TSouXG5cbkEgY29uc2VxdWVuY2Ugb2YgdGhpcyBpcyB0aGF0IGFsdGhvdWdoIHRoZSBgYCpleHByZXNzaW9uYGAgc3ludGF4IG1heVxuYXBwZWFyICphZnRlciogc29tZSBrZXl3b3JkIGFyZ3VtZW50cywgaXQgaXMgcHJvY2Vzc2VkICpiZWZvcmUqIHRoZVxua2V5d29yZCBhcmd1bWVudHMgKGFuZCB0aGUgYGAqKmV4cHJlc3Npb25gYCBhcmd1bWVudCwgaWYgYW55IC0tIHNlZVxuYmVsb3cpLiAgU286XG5cbiAgID4+PiBkZWYgZihhLCBiKTpcbiAgIC4uLiAgcHJpbnQgYSwgYlxuICAgLi4uXG4gICA+Pj4gZihiPTEsICooMiwpKVxuICAgMiAxXG4gICA+Pj4gZihhPTEsICooMiwpKVxuICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/XG4gICBUeXBlRXJyb3I6IGYoKSBnb3QgbXVsdGlwbGUgdmFsdWVzIGZvciBrZXl3b3JkIGFyZ3VtZW50IFwnYVwnXG4gICA+Pj4gZigxLCAqKDIsKSlcbiAgIDEgMlxuXG5JdCBpcyB1bnVzdWFsIGZvciBib3RoIGtleXdvcmQgYXJndW1lbnRzIGFuZCB0aGUgYGAqZXhwcmVzc2lvbmBgXG5zeW50YXggdG8gYmUgdXNlZCBpbiB0aGUgc2FtZSBjYWxsLCBzbyBpbiBwcmFjdGljZSB0aGlzIGNvbmZ1c2lvbiBkb2VzXG5ub3QgYXJpc2UuXG5cbklmIHRoZSBzeW50YXggYGAqKmV4cHJlc3Npb25gYCBhcHBlYXJzIGluIHRoZSBmdW5jdGlvbiBjYWxsLFxuYGBleHByZXNzaW9uYGAgbXVzdCBldmFsdWF0ZSB0byBhIG1hcHBpbmcsIHRoZSBjb250ZW50cyBvZiB3aGljaCBhcmVcbnRyZWF0ZWQgYXMgYWRkaXRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cy4gIEluIHRoZSBjYXNlIG9mIGEga2V5d29yZFxuYXBwZWFyaW5nIGluIGJvdGggYGBleHByZXNzaW9uYGAgYW5kIGFzIGFuIGV4cGxpY2l0IGtleXdvcmQgYXJndW1lbnQsXG5hIGBgVHlwZUVycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZC5cblxuRm9ybWFsIHBhcmFtZXRlcnMgdXNpbmcgdGhlIHN5bnRheCBgYCppZGVudGlmaWVyYGAgb3IgYGAqKmlkZW50aWZpZXJgYFxuY2Fubm90IGJlIHVzZWQgYXMgcG9zaXRpb25hbCBhcmd1bWVudCBzbG90cyBvciBhcyBrZXl3b3JkIGFyZ3VtZW50XG5uYW1lcy4gIEZvcm1hbCBwYXJhbWV0ZXJzIHVzaW5nIHRoZSBzeW50YXggYGAoc3VibGlzdClgYCBjYW5ub3QgYmVcbnVzZWQgYXMga2V5d29yZCBhcmd1bWVudCBuYW1lczsgdGhlIG91dGVybW9zdCBzdWJsaXN0IGNvcnJlc3BvbmRzIHRvIGFcbnNpbmdsZSB1bm5hbWVkIGFyZ3VtZW50IHNsb3QsIGFuZCB0aGUgYXJndW1lbnQgdmFsdWUgaXMgYXNzaWduZWQgdG9cbnRoZSBzdWJsaXN0IHVzaW5nIHRoZSB1c3VhbCB0dXBsZSBhc3NpZ25tZW50IHJ1bGVzIGFmdGVyIGFsbCBvdGhlclxucGFyYW1ldGVyIHByb2Nlc3NpbmcgaXMgZG9uZS5cblxuQSBjYWxsIGFsd2F5cyByZXR1cm5zIHNvbWUgdmFsdWUsIHBvc3NpYmx5IGBgTm9uZWBgLCB1bmxlc3MgaXQgcmFpc2VzXG5hbiBleGNlcHRpb24uICBIb3cgdGhpcyB2YWx1ZSBpcyBjb21wdXRlZCBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIHRoZVxuY2FsbGFibGUgb2JqZWN0LlxuXG5JZiBpdCBpcy0tLVxuXG5hIHVzZXItZGVmaW5lZCBmdW5jdGlvbjpcbiAgIFRoZSBjb2RlIGJsb2NrIGZvciB0aGUgZnVuY3Rpb24gaXMgZXhlY3V0ZWQsIHBhc3NpbmcgaXQgdGhlXG4gICBhcmd1bWVudCBsaXN0LiAgVGhlIGZpcnN0IHRoaW5nIHRoZSBjb2RlIGJsb2NrIHdpbGwgZG8gaXMgYmluZCB0aGVcbiAgIGZvcm1hbCBwYXJhbWV0ZXJzIHRvIHRoZSBhcmd1bWVudHM7IHRoaXMgaXMgZGVzY3JpYmVkIGluIHNlY3Rpb25cbiAgICpGdW5jdGlvbiBkZWZpbml0aW9ucyouICBXaGVuIHRoZSBjb2RlIGJsb2NrIGV4ZWN1dGVzIGEgYGByZXR1cm5gYFxuICAgc3RhdGVtZW50LCB0aGlzIHNwZWNpZmllcyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiBjYWxsLlxuXG5hIGJ1aWx0LWluIGZ1bmN0aW9uIG9yIG1ldGhvZDpcbiAgIFRoZSByZXN1bHQgaXMgdXAgdG8gdGhlIGludGVycHJldGVyOyBzZWUgKkJ1aWx0LWluIEZ1bmN0aW9ucyogZm9yXG4gICB0aGUgZGVzY3JpcHRpb25zIG9mIGJ1aWx0LWluIGZ1bmN0aW9ucyBhbmQgbWV0aG9kcy5cblxuYSBjbGFzcyBvYmplY3Q6XG4gICBBIG5ldyBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzIGlzIHJldHVybmVkLlxuXG5hIGNsYXNzIGluc3RhbmNlIG1ldGhvZDpcbiAgIFRoZSBjb3JyZXNwb25kaW5nIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBpcyBjYWxsZWQsIHdpdGggYW4gYXJndW1lbnRcbiAgIGxpc3QgdGhhdCBpcyBvbmUgbG9uZ2VyIHRoYW4gdGhlIGFyZ3VtZW50IGxpc3Qgb2YgdGhlIGNhbGw6IHRoZVxuICAgaW5zdGFuY2UgYmVjb21lcyB0aGUgZmlyc3QgYXJndW1lbnQuXG5cbmEgY2xhc3MgaW5zdGFuY2U6XG4gICBUaGUgY2xhc3MgbXVzdCBkZWZpbmUgYSBgYF9fY2FsbF9fKClgYCBtZXRob2Q7IHRoZSBlZmZlY3QgaXMgdGhlblxuICAgdGhlIHNhbWUgYXMgaWYgdGhhdCBtZXRob2Qgd2FzIGNhbGxlZC5cbicsCi0gJ2NsYXNzJzogdSdcbkNsYXNzIGRlZmluaXRpb25zXG4qKioqKioqKioqKioqKioqKlxuXG5BIGNsYXNzIGRlZmluaXRpb24gZGVmaW5lcyBhIGNsYXNzIG9iamVjdCAoc2VlIHNlY3Rpb24gKlRoZSBzdGFuZGFyZFxudHlwZSBoaWVyYXJjaHkqKTpcblxuICAgY2xhc3NkZWYgICAgOjo9ICJjbGFzcyIgY2xhc3NuYW1lIFtpbmhlcml0YW5jZV0gIjoiIHN1aXRlXG4gICBpbmhlcml0YW5jZSA6Oj0gIigiIFtleHByZXNzaW9uX2xpc3RdICIpIlxuICAgY2xhc3NuYW1lICAgOjo9IGlkZW50aWZpZXJcblxuQSBjbGFzcyBkZWZpbml0aW9uIGlzIGFuIGV4ZWN1dGFibGUgc3RhdGVtZW50LiAgSXQgZmlyc3QgZXZhbHVhdGVzIHRoZVxuaW5oZXJpdGFuY2UgbGlzdCwgaWYgcHJlc2VudC4gIEVhY2ggaXRlbSBpbiB0aGUgaW5oZXJpdGFuY2UgbGlzdFxuc2hvdWxkIGV2YWx1YXRlIHRvIGEgY2xhc3Mgb2JqZWN0IG9yIGNsYXNzIHR5cGUgd2hpY2ggYWxsb3dzXG5zdWJjbGFzc2luZy4gIFRoZSBjbGFzc1wncyBzdWl0ZSBpcyB0aGVuIGV4ZWN1dGVkIGluIGEgbmV3IGV4ZWN1dGlvblxuZnJhbWUgKHNlZSBzZWN0aW9uICpOYW1pbmcgYW5kIGJpbmRpbmcqKSwgdXNpbmcgYSBuZXdseSBjcmVhdGVkIGxvY2FsXG5uYW1lc3BhY2UgYW5kIHRoZSBvcmlnaW5hbCBnbG9iYWwgbmFtZXNwYWNlLiAoVXN1YWxseSwgdGhlIHN1aXRlXG5jb250YWlucyBvbmx5IGZ1bmN0aW9uIGRlZmluaXRpb25zLikgIFdoZW4gdGhlIGNsYXNzXCdzIHN1aXRlIGZpbmlzaGVzXG5leGVjdXRpb24sIGl0cyBleGVjdXRpb24gZnJhbWUgaXMgZGlzY2FyZGVkIGJ1dCBpdHMgbG9jYWwgbmFtZXNwYWNlIGlzXG5zYXZlZC4gWzRdIEEgY2xhc3Mgb2JqZWN0IGlzIHRoZW4gY3JlYXRlZCB1c2luZyB0aGUgaW5oZXJpdGFuY2UgbGlzdFxuZm9yIHRoZSBiYXNlIGNsYXNzZXMgYW5kIHRoZSBzYXZlZCBsb2NhbCBuYW1lc3BhY2UgZm9yIHRoZSBhdHRyaWJ1dGVcbmRpY3Rpb25hcnkuICBUaGUgY2xhc3MgbmFtZSBpcyBib3VuZCB0byB0aGlzIGNsYXNzIG9iamVjdCBpbiB0aGVcbm9yaWdpbmFsIGxvY2FsIG5hbWVzcGFjZS5cblxuKipQcm9ncmFtbWVyXCdzIG5vdGU6KiogVmFyaWFibGVzIGRlZmluZWQgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24gYXJlXG5jbGFzcyB2YXJpYWJsZXM7IHRoZXkgYXJlIHNoYXJlZCBieSBhbGwgaW5zdGFuY2VzLiAgVG8gY3JlYXRlIGluc3RhbmNlXG52YXJpYWJsZXMsIHRoZXkgY2FuIGJlIHNldCBpbiBhIG1ldGhvZCB3aXRoIGBgc2VsZi5uYW1lID0gdmFsdWVgYC5cbkJvdGggY2xhc3MgYW5kIGluc3RhbmNlIHZhcmlhYmxlcyBhcmUgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSBub3RhdGlvblxuImBgc2VsZi5uYW1lYGAiLCBhbmQgYW4gaW5zdGFuY2UgdmFyaWFibGUgaGlkZXMgYSBjbGFzcyB2YXJpYWJsZSB3aXRoXG50aGUgc2FtZSBuYW1lIHdoZW4gYWNjZXNzZWQgaW4gdGhpcyB3YXkuIENsYXNzIHZhcmlhYmxlcyBjYW4gYmUgdXNlZFxuYXMgZGVmYXVsdHMgZm9yIGluc3RhbmNlIHZhcmlhYmxlcywgYnV0IHVzaW5nIG11dGFibGUgdmFsdWVzIHRoZXJlIGNhblxubGVhZCB0byB1bmV4cGVjdGVkIHJlc3VsdHMuICBGb3IgKm5ldy1zdHlsZSBjbGFzcyplcywgZGVzY3JpcHRvcnMgY2FuXG5iZSB1c2VkIHRvIGNyZWF0ZSBpbnN0YW5jZSB2YXJpYWJsZXMgd2l0aCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25cbmRldGFpbHMuXG5cbkNsYXNzIGRlZmluaXRpb25zLCBsaWtlIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBtYXkgYmUgd3JhcHBlZCBieSBvbmUgb3Jcbm1vcmUgKmRlY29yYXRvciogZXhwcmVzc2lvbnMuICBUaGUgZXZhbHVhdGlvbiBydWxlcyBmb3IgdGhlIGRlY29yYXRvclxuZXhwcmVzc2lvbnMgYXJlIHRoZSBzYW1lIGFzIGZvciBmdW5jdGlvbnMuICBUaGUgcmVzdWx0IG11c3QgYmUgYSBjbGFzc1xub2JqZWN0LCB3aGljaCBpcyB0aGVuIGJvdW5kIHRvIHRoZSBjbGFzcyBuYW1lLlxuXG4tWyBGb290bm90ZXMgXS1cblxuWzFdIFRoZSBleGNlcHRpb24gaXMgcHJvcGFnYXRlZCB0byB0aGUgaW52b2NhdGlvbiBzdGFjayBvbmx5IGlmIHRoZXJlXG4gICAgaXMgbm8gYGBmaW5hbGx5YGAgY2xhdXNlIHRoYXQgbmVnYXRlcyB0aGUgZXhjZXB0aW9uLlxuXG5bMl0gQ3VycmVudGx5LCBjb250cm9sICJmbG93cyBvZmYgdGhlIGVuZCIgZXhjZXB0IGluIHRoZSBjYXNlIG9mIGFuXG4gICAgZXhjZXB0aW9uIG9yIHRoZSBleGVjdXRpb24gb2YgYSBgYHJldHVybmBgLCBgYGNvbnRpbnVlYGAsIG9yXG4gICAgYGBicmVha2BgIHN0YXRlbWVudC5cblxuWzNdIEEgc3RyaW5nIGxpdGVyYWwgYXBwZWFyaW5nIGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4gdGhlIGZ1bmN0aW9uXG4gICAgYm9keSBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBmdW5jdGlvblwncyBgYF9fZG9jX19gYCBhdHRyaWJ1dGUgYW5kXG4gICAgdGhlcmVmb3JlIHRoZSBmdW5jdGlvblwncyAqZG9jc3RyaW5nKi5cblxuWzRdIEEgc3RyaW5nIGxpdGVyYWwgYXBwZWFyaW5nIGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4gdGhlIGNsYXNzXG4gICAgYm9keSBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBuYW1lc3BhY2VcJ3MgYGBfX2RvY19fYGAgaXRlbSBhbmRcbiAgICB0aGVyZWZvcmUgdGhlIGNsYXNzXCdzICpkb2NzdHJpbmcqLlxuJywKLSAnY29lcmNpb24tcnVsZXMnOiB1IlxuQ29lcmNpb24gcnVsZXNcbioqKioqKioqKioqKioqXG5cblRoaXMgc2VjdGlvbiB1c2VkIHRvIGRvY3VtZW50IHRoZSBydWxlcyBmb3IgY29lcmNpb24uICBBcyB0aGUgbGFuZ3VhZ2VcbmhhcyBldm9sdmVkLCB0aGUgY29lcmNpb24gcnVsZXMgaGF2ZSBiZWNvbWUgaGFyZCB0byBkb2N1bWVudFxucHJlY2lzZWx5OyBkb2N1bWVudGluZyB3aGF0IG9uZSB2ZXJzaW9uIG9mIG9uZSBwYXJ0aWN1bGFyXG5pbXBsZW1lbnRhdGlvbiBkb2VzIGlzIHVuZGVzaXJhYmxlLiAgSW5zdGVhZCwgaGVyZSBhcmUgc29tZSBpbmZvcm1hbFxuZ3VpZGVsaW5lcyByZWdhcmRpbmcgY29lcmNpb24uICBJbiBQeXRob24gMy4wLCBjb2VyY2lvbiB3aWxsIG5vdCBiZVxuc3VwcG9ydGVkLlxuXG4qIElmIHRoZSBsZWZ0IG9wZXJhbmQgb2YgYSAlIG9wZXJhdG9yIGlzIGEgc3RyaW5nIG9yIFVuaWNvZGUgb2JqZWN0LFxuICBubyBjb2VyY2lvbiB0YWtlcyBwbGFjZSBhbmQgdGhlIHN0cmluZyBmb3JtYXR0aW5nIG9wZXJhdGlvbiBpc1xuICBpbnZva2VkIGluc3RlYWQuXG5cbiogSXQgaXMgbm8gbG9uZ2VyIHJlY29tbWVuZGVkIHRvIGRlZmluZSBhIGNvZXJjaW9uIG9wZXJhdGlvbi4gTWl4ZWQtXG4gIG1vZGUgb3BlcmF0aW9ucyBvbiB0eXBlcyB0aGF0IGRvbid0IGRlZmluZSBjb2VyY2lvbiBwYXNzIHRoZVxuICBvcmlnaW5hbCBhcmd1bWVudHMgdG8gdGhlIG9wZXJhdGlvbi5cblxuKiBOZXctc3R5bGUgY2xhc3NlcyAodGhvc2UgZGVyaXZlZCBmcm9tIGBgb2JqZWN0YGApIG5ldmVyIGludm9rZSB0aGVcbiAgYGBfX2NvZXJjZV9fKClgYCBtZXRob2QgaW4gcmVzcG9uc2UgdG8gYSBiaW5hcnkgb3BlcmF0b3I7IHRoZSBvbmx5XG4gIHRpbWUgYGBfX2NvZXJjZV9fKClgYCBpcyBpbnZva2VkIGlzIHdoZW4gdGhlIGJ1aWx0LWluIGZ1bmN0aW9uXG4gIGBgY29lcmNlKClgYCBpcyBjYWxsZWQuXG5cbiogRm9yIG1vc3QgaW50ZW50cyBhbmQgcHVycG9zZXMsIGFuIG9wZXJhdG9yIHRoYXQgcmV0dXJuc1xuICBgYE5vdEltcGxlbWVudGVkYGAgaXMgdHJlYXRlZCB0aGUgc2FtZSBhcyBvbmUgdGhhdCBpcyBub3RcbiAgaW1wbGVtZW50ZWQgYXQgYWxsLlxuXG4qIEJlbG93LCBgYF9fb3BfXygpYGAgYW5kIGBgX19yb3BfXygpYGAgYXJlIHVzZWQgdG8gc2lnbmlmeSB0aGVcbiAgZ2VuZXJpYyBtZXRob2QgbmFtZXMgY29ycmVzcG9uZGluZyB0byBhbiBvcGVyYXRvcjsgYGBfX2lvcF9fKClgYCBpc1xuICB1c2VkIGZvciB0aGUgY29ycmVzcG9uZGluZyBpbi1wbGFjZSBvcGVyYXRvci4gIEZvciBleGFtcGxlLCBmb3IgdGhlXG4gIG9wZXJhdG9yICdgYCtgYCcsIGBgX19hZGRfXygpYGAgYW5kIGBgX19yYWRkX18oKWBgIGFyZSB1c2VkIGZvciB0aGVcbiAgbGVmdCBhbmQgcmlnaHQgdmFyaWFudCBvZiB0aGUgYmluYXJ5IG9wZXJhdG9yLCBhbmQgYGBfX2lhZGRfXygpYGBcbiAgZm9yIHRoZSBpbi1wbGFjZSB2YXJpYW50LlxuXG4qIEZvciBvYmplY3RzICp4KiBhbmQgKnkqLCBmaXJzdCBgYHguX19vcF9fKHkpYGAgaXMgdHJpZWQuICBJZiB0aGlzIGlzXG4gIG5vdCBpbXBsZW1lbnRlZCBvciByZXR1cm5zIGBgTm90SW1wbGVtZW50ZWRgYCwgYGB5Ll9fcm9wX18oeClgYCBpc1xuICB0cmllZC4gIElmIHRoaXMgaXMgYWxzbyBub3QgaW1wbGVtZW50ZWQgb3IgcmV0dXJuc1xuICBgYE5vdEltcGxlbWVudGVkYGAsIGEgYGBUeXBlRXJyb3JgYCBleGNlcHRpb24gaXMgcmFpc2VkLiAgQnV0IHNlZVxuICB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbjpcblxuKiBFeGNlcHRpb24gdG8gdGhlIHByZXZpb3VzIGl0ZW06IGlmIHRoZSBsZWZ0IG9wZXJhbmQgaXMgYW4gaW5zdGFuY2VcbiAgb2YgYSBidWlsdC1pbiB0eXBlIG9yIGEgbmV3LXN0eWxlIGNsYXNzLCBhbmQgdGhlIHJpZ2h0IG9wZXJhbmQgaXMgYW5cbiAgaW5zdGFuY2Ugb2YgYSBwcm9wZXIgc3ViY2xhc3Mgb2YgdGhhdCB0eXBlIG9yIGNsYXNzIGFuZCBvdmVycmlkZXNcbiAgdGhlIGJhc2UncyBgYF9fcm9wX18oKWBgIG1ldGhvZCwgdGhlIHJpZ2h0IG9wZXJhbmQncyBgYF9fcm9wX18oKWBgXG4gIG1ldGhvZCBpcyB0cmllZCAqYmVmb3JlKiB0aGUgbGVmdCBvcGVyYW5kJ3MgYGBfX29wX18oKWBgIG1ldGhvZC5cblxuICBUaGlzIGlzIGRvbmUgc28gdGhhdCBhIHN1YmNsYXNzIGNhbiBjb21wbGV0ZWx5IG92ZXJyaWRlIGJpbmFyeVxuICBvcGVyYXRvcnMuIE90aGVyd2lzZSwgdGhlIGxlZnQgb3BlcmFuZCdzIGBgX19vcF9fKClgYCBtZXRob2Qgd291bGRcbiAgYWx3YXlzIGFjY2VwdCB0aGUgcmlnaHQgb3BlcmFuZDogd2hlbiBhbiBpbnN0YW5jZSBvZiBhIGdpdmVuIGNsYXNzXG4gIGlzIGV4cGVjdGVkLCBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIG9mIHRoYXQgY2xhc3MgaXMgYWx3YXlzXG4gIGFjY2VwdGFibGUuXG5cbiogV2hlbiBlaXRoZXIgb3BlcmFuZCB0eXBlIGRlZmluZXMgYSBjb2VyY2lvbiwgdGhpcyBjb2VyY2lvbiBpcyBjYWxsZWRcbiAgYmVmb3JlIHRoYXQgdHlwZSdzIGBgX19vcF9fKClgYCBvciBgYF9fcm9wX18oKWBgIG1ldGhvZCBpcyBjYWxsZWQsXG4gIGJ1dCBubyBzb29uZXIuICBJZiB0aGUgY29lcmNpb24gcmV0dXJucyBhbiBvYmplY3Qgb2YgYSBkaWZmZXJlbnRcbiAgdHlwZSBmb3IgdGhlIG9wZXJhbmQgd2hvc2UgY29lcmNpb24gaXMgaW52b2tlZCwgcGFydCBvZiB0aGUgcHJvY2Vzc1xuICBpcyByZWRvbmUgdXNpbmcgdGhlIG5ldyBvYmplY3QuXG5cbiogV2hlbiBhbiBpbi1wbGFjZSBvcGVyYXRvciAobGlrZSAnYGArPWBgJykgaXMgdXNlZCwgaWYgdGhlIGxlZnRcbiAgb3BlcmFuZCBpbXBsZW1lbnRzIGBgX19pb3BfXygpYGAsIGl0IGlzIGludm9rZWQgd2l0aG91dCBhbnlcbiAgY29lcmNpb24uICBXaGVuIHRoZSBvcGVyYXRpb24gZmFsbHMgYmFjayB0byBgYF9fb3BfXygpYGAgYW5kL29yXG4gIGBgX19yb3BfXygpYGAsIHRoZSBub3JtYWwgY29lcmNpb24gcnVsZXMgYXBwbHkuXG5cbiogSW4gYGB4ICsgeWBgLCBpZiAqeCogaXMgYSBzZXF1ZW5jZSB0aGF0IGltcGxlbWVudHMgc2VxdWVuY2VcbiAgY29uY2F0ZW5hdGlvbiwgc2VxdWVuY2UgY29uY2F0ZW5hdGlvbiBpcyBpbnZva2VkLlxuXG4qIEluIGBgeCAqIHlgYCwgaWYgb25lIG9wZXJhdG9yIGlzIGEgc2VxdWVuY2UgdGhhdCBpbXBsZW1lbnRzIHNlcXVlbmNlXG4gIHJlcGV0aXRpb24sIGFuZCB0aGUgb3RoZXIgaXMgYW4gaW50ZWdlciAoYGBpbnRgYCBvciBgYGxvbmdgYCksXG4gIHNlcXVlbmNlIHJlcGV0aXRpb24gaXMgaW52b2tlZC5cblxuKiBSaWNoIGNvbXBhcmlzb25zIChpbXBsZW1lbnRlZCBieSBtZXRob2RzIGBgX19lcV9fKClgYCBhbmQgc28gb24pXG4gIG5ldmVyIHVzZSBjb2VyY2lvbi4gIFRocmVlLXdheSBjb21wYXJpc29uIChpbXBsZW1lbnRlZCBieVxuICBgYF9fY21wX18oKWBgKSBkb2VzIHVzZSBjb2VyY2lvbiB1bmRlciB0aGUgc2FtZSBjb25kaXRpb25zIGFzIG90aGVyXG4gIGJpbmFyeSBvcGVyYXRpb25zIHVzZSBpdC5cblxuKiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhlIGJ1aWx0LWluIG51bWVyaWMgdHlwZXMgYGBpbnRgYCxcbiAgYGBsb25nYGAsIGBgZmxvYXRgYCwgYW5kIGBgY29tcGxleGBgIGRvIG5vdCB1c2UgY29lcmNpb24uIEFsbCB0aGVzZVxuICB0eXBlcyBpbXBsZW1lbnQgYSBgYF9fY29lcmNlX18oKWBgIG1ldGhvZCwgZm9yIHVzZSBieSB0aGUgYnVpbHQtaW5cbiAgYGBjb2VyY2UoKWBgIGZ1bmN0aW9uLlxuXG4gIENoYW5nZWQgaW4gdmVyc2lvbiAyLjcuXG4iLAotICdjb21wYXJpc29ucyc6IHUnXG5Db21wYXJpc29uc1xuKioqKioqKioqKipcblxuVW5saWtlIEMsIGFsbCBjb21wYXJpc29uIG9wZXJhdGlvbnMgaW4gUHl0aG9uIGhhdmUgdGhlIHNhbWUgcHJpb3JpdHksXG53aGljaCBpcyBsb3dlciB0aGFuIHRoYXQgb2YgYW55IGFyaXRobWV0aWMsIHNoaWZ0aW5nIG9yIGJpdHdpc2Vcbm9wZXJhdGlvbi4gIEFsc28gdW5saWtlIEMsIGV4cHJlc3Npb25zIGxpa2UgYGBhIDwgYiA8IGNgYCBoYXZlIHRoZVxuaW50ZXJwcmV0YXRpb24gdGhhdCBpcyBjb252ZW50aW9uYWwgaW4gbWF0aGVtYXRpY3M6XG5cbiAgIGNvbXBhcmlzb24gICAgOjo9IG9yX2V4cHIgKCBjb21wX29wZXJhdG9yIG9yX2V4cHIgKSpcbiAgIGNvbXBfb3BlcmF0b3IgOjo9ICI8IiB8ICI+IiB8ICI9PSIgfCAiPj0iIHwgIjw9IiB8ICI8PiIgfCAiIT0iXG4gICAgICAgICAgICAgICAgICAgICB8ICJpcyIgWyJub3QiXSB8IFsibm90Il0gImluIlxuXG5Db21wYXJpc29ucyB5aWVsZCBib29sZWFuIHZhbHVlczogYGBUcnVlYGAgb3IgYGBGYWxzZWBgLlxuXG5Db21wYXJpc29ucyBjYW4gYmUgY2hhaW5lZCBhcmJpdHJhcmlseSwgZS5nLiwgYGB4IDwgeSA8PSB6YGAgaXNcbmVxdWl2YWxlbnQgdG8gYGB4IDwgeSBhbmQgeSA8PSB6YGAsIGV4Y2VwdCB0aGF0IGBgeWBgIGlzIGV2YWx1YXRlZFxub25seSBvbmNlIChidXQgaW4gYm90aCBjYXNlcyBgYHpgYCBpcyBub3QgZXZhbHVhdGVkIGF0IGFsbCB3aGVuIGBgeCA8XG55YGAgaXMgZm91bmQgdG8gYmUgZmFsc2UpLlxuXG5Gb3JtYWxseSwgaWYgKmEqLCAqYiosICpjKiwgLi4uLCAqeSosICp6KiBhcmUgZXhwcmVzc2lvbnMgYW5kICpvcDEqLFxuKm9wMiosIC4uLiwgKm9wTiogYXJlIGNvbXBhcmlzb24gb3BlcmF0b3JzLCB0aGVuIGBgYSBvcDEgYiBvcDIgYyAuLi4geVxub3BOIHpgYCBpcyBlcXVpdmFsZW50IHRvIGBgYSBvcDEgYiBhbmQgYiBvcDIgYyBhbmQgLi4uIHkgb3BOIHpgYCxcbmV4Y2VwdCB0aGF0IGVhY2ggZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgYXQgbW9zdCBvbmNlLlxuXG5Ob3RlIHRoYXQgYGBhIG9wMSBiIG9wMiBjYGAgZG9lc25cJ3QgaW1wbHkgYW55IGtpbmQgb2YgY29tcGFyaXNvblxuYmV0d2VlbiAqYSogYW5kICpjKiwgc28gdGhhdCwgZS5nLiwgYGB4IDwgeSA+IHpgYCBpcyBwZXJmZWN0bHkgbGVnYWxcbih0aG91Z2ggcGVyaGFwcyBub3QgcHJldHR5KS5cblxuVGhlIGZvcm1zIGBgPD5gYCBhbmQgYGAhPWBgIGFyZSBlcXVpdmFsZW50OyBmb3IgY29uc2lzdGVuY3kgd2l0aCBDLFxuYGAhPWBgIGlzIHByZWZlcnJlZDsgd2hlcmUgYGAhPWBgIGlzIG1lbnRpb25lZCBiZWxvdyBgYDw+YGAgaXMgYWxzb1xuYWNjZXB0ZWQuICBUaGUgYGA8PmBgIHNwZWxsaW5nIGlzIGNvbnNpZGVyZWQgb2Jzb2xlc2NlbnQuXG5cblRoZSBvcGVyYXRvcnMgYGA8YGAsIGBgPmBgLCBgYD09YGAsIGBgPj1gYCwgYGA8PWBgLCBhbmQgYGAhPWBgIGNvbXBhcmVcbnRoZSB2YWx1ZXMgb2YgdHdvIG9iamVjdHMuICBUaGUgb2JqZWN0cyBuZWVkIG5vdCBoYXZlIHRoZSBzYW1lIHR5cGUuXG5JZiBib3RoIGFyZSBudW1iZXJzLCB0aGV5IGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS4gIE90aGVyd2lzZSxcbm9iamVjdHMgb2YgZGlmZmVyZW50IHR5cGVzICphbHdheXMqIGNvbXBhcmUgdW5lcXVhbCwgYW5kIGFyZSBvcmRlcmVkXG5jb25zaXN0ZW50bHkgYnV0IGFyYml0cmFyaWx5LiBZb3UgY2FuIGNvbnRyb2wgY29tcGFyaXNvbiBiZWhhdmlvciBvZlxub2JqZWN0cyBvZiBub24tYnVpbHQtaW4gdHlwZXMgYnkgZGVmaW5pbmcgYSBgYF9fY21wX19gYCBtZXRob2Qgb3IgcmljaFxuY29tcGFyaXNvbiBtZXRob2RzIGxpa2UgYGBfX2d0X19gYCwgZGVzY3JpYmVkIGluIHNlY3Rpb24gKlNwZWNpYWxcbm1ldGhvZCBuYW1lcyouXG5cbihUaGlzIHVudXN1YWwgZGVmaW5pdGlvbiBvZiBjb21wYXJpc29uIHdhcyB1c2VkIHRvIHNpbXBsaWZ5IHRoZVxuZGVmaW5pdGlvbiBvZiBvcGVyYXRpb25zIGxpa2Ugc29ydGluZyBhbmQgdGhlIGBgaW5gYCBhbmQgYGBub3QgaW5gYFxub3BlcmF0b3JzLiBJbiB0aGUgZnV0dXJlLCB0aGUgY29tcGFyaXNvbiBydWxlcyBmb3Igb2JqZWN0cyBvZlxuZGlmZmVyZW50IHR5cGVzIGFyZSBsaWtlbHkgdG8gY2hhbmdlLilcblxuQ29tcGFyaXNvbiBvZiBvYmplY3RzIG9mIHRoZSBzYW1lIHR5cGUgZGVwZW5kcyBvbiB0aGUgdHlwZTpcblxuKiBOdW1iZXJzIGFyZSBjb21wYXJlZCBhcml0aG1ldGljYWxseS5cblxuKiBTdHJpbmdzIGFyZSBjb21wYXJlZCBsZXhpY29ncmFwaGljYWxseSB1c2luZyB0aGUgbnVtZXJpYyBlcXVpdmFsZW50c1xuICAodGhlIHJlc3VsdCBvZiB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gYGBvcmQoKWBgKSBvZiB0aGVpciBjaGFyYWN0ZXJzLlxuICBVbmljb2RlIGFuZCA4LWJpdCBzdHJpbmdzIGFyZSBmdWxseSBpbnRlcm9wZXJhYmxlIGluIHRoaXMgYmVoYXZpb3IuXG4gIFs0XVxuXG4qIFR1cGxlcyBhbmQgbGlzdHMgYXJlIGNvbXBhcmVkIGxleGljb2dyYXBoaWNhbGx5IHVzaW5nIGNvbXBhcmlzb24gb2ZcbiAgY29ycmVzcG9uZGluZyBlbGVtZW50cy4gIFRoaXMgbWVhbnMgdGhhdCB0byBjb21wYXJlIGVxdWFsLCBlYWNoXG4gIGVsZW1lbnQgbXVzdCBjb21wYXJlIGVxdWFsIGFuZCB0aGUgdHdvIHNlcXVlbmNlcyBtdXN0IGJlIG9mIHRoZSBzYW1lXG4gIHR5cGUgYW5kIGhhdmUgdGhlIHNhbWUgbGVuZ3RoLlxuXG4gIElmIG5vdCBlcXVhbCwgdGhlIHNlcXVlbmNlcyBhcmUgb3JkZXJlZCB0aGUgc2FtZSBhcyB0aGVpciBmaXJzdFxuICBkaWZmZXJpbmcgZWxlbWVudHMuICBGb3IgZXhhbXBsZSwgYGBjbXAoWzEsMix4XSwgWzEsMix5XSlgYCByZXR1cm5zXG4gIHRoZSBzYW1lIGFzIGBgY21wKHgseSlgYC4gIElmIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgZG9lcyBub3RcbiAgZXhpc3QsIHRoZSBzaG9ydGVyIHNlcXVlbmNlIGlzIG9yZGVyZWQgZmlyc3QgKGZvciBleGFtcGxlLCBgYFsxLDJdIDxcbiAgWzEsMiwzXWBgKS5cblxuKiBNYXBwaW5ncyAoZGljdGlvbmFyaWVzKSBjb21wYXJlIGVxdWFsIGlmIGFuZCBvbmx5IGlmIHRoZWlyIHNvcnRlZFxuICAoa2V5LCB2YWx1ZSkgbGlzdHMgY29tcGFyZSBlcXVhbC4gWzVdIE91dGNvbWVzIG90aGVyIHRoYW4gZXF1YWxpdHlcbiAgYXJlIHJlc29sdmVkIGNvbnNpc3RlbnRseSwgYnV0IGFyZSBub3Qgb3RoZXJ3aXNlIGRlZmluZWQuIFs2XVxuXG4qIE1vc3Qgb3RoZXIgb2JqZWN0cyBvZiBidWlsdC1pbiB0eXBlcyBjb21wYXJlIHVuZXF1YWwgdW5sZXNzIHRoZXkgYXJlXG4gIHRoZSBzYW1lIG9iamVjdDsgdGhlIGNob2ljZSB3aGV0aGVyIG9uZSBvYmplY3QgaXMgY29uc2lkZXJlZCBzbWFsbGVyXG4gIG9yIGxhcmdlciB0aGFuIGFub3RoZXIgb25lIGlzIG1hZGUgYXJiaXRyYXJpbHkgYnV0IGNvbnNpc3RlbnRseVxuICB3aXRoaW4gb25lIGV4ZWN1dGlvbiBvZiBhIHByb2dyYW0uXG5cblRoZSBvcGVyYXRvcnMgYGBpbmBgIGFuZCBgYG5vdCBpbmBgIHRlc3QgZm9yIGNvbGxlY3Rpb24gbWVtYmVyc2hpcC5cbmBgeCBpbiBzYGAgZXZhbHVhdGVzIHRvIHRydWUgaWYgKngqIGlzIGEgbWVtYmVyIG9mIHRoZSBjb2xsZWN0aW9uICpzKixcbmFuZCBmYWxzZSBvdGhlcndpc2UuICBgYHggbm90IGluIHNgYCByZXR1cm5zIHRoZSBuZWdhdGlvbiBvZiBgYHggaW5cbnNgYC4gVGhlIGNvbGxlY3Rpb24gbWVtYmVyc2hpcCB0ZXN0IGhhcyB0cmFkaXRpb25hbGx5IGJlZW4gYm91bmQgdG9cbnNlcXVlbmNlczsgYW4gb2JqZWN0IGlzIGEgbWVtYmVyIG9mIGEgY29sbGVjdGlvbiBpZiB0aGUgY29sbGVjdGlvbiBpc1xuYSBzZXF1ZW5jZSBhbmQgY29udGFpbnMgYW4gZWxlbWVudCBlcXVhbCB0byB0aGF0IG9iamVjdC4gIEhvd2V2ZXIsIGl0XG5tYWtlIHNlbnNlIGZvciBtYW55IG90aGVyIG9iamVjdCB0eXBlcyB0byBzdXBwb3J0IG1lbWJlcnNoaXAgdGVzdHNcbndpdGhvdXQgYmVpbmcgYSBzZXF1ZW5jZS4gIEluIHBhcnRpY3VsYXIsIGRpY3Rpb25hcmllcyAoZm9yIGtleXMpIGFuZFxuc2V0cyBzdXBwb3J0IG1lbWJlcnNoaXAgdGVzdGluZy5cblxuRm9yIHRoZSBsaXN0IGFuZCB0dXBsZSB0eXBlcywgYGB4IGluIHlgYCBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZXJlXG5leGlzdHMgYW4gaW5kZXggKmkqIHN1Y2ggdGhhdCBgYHggPT0geVtpXWBgIGlzIHRydWUuXG5cbkZvciB0aGUgVW5pY29kZSBhbmQgc3RyaW5nIHR5cGVzLCBgYHggaW4geWBgIGlzIHRydWUgaWYgYW5kIG9ubHkgaWZcbip4KiBpcyBhIHN1YnN0cmluZyBvZiAqeSouICBBbiBlcXVpdmFsZW50IHRlc3QgaXMgYGB5LmZpbmQoeCkgIT0gLTFgYC5cbk5vdGUsICp4KiBhbmQgKnkqIG5lZWQgbm90IGJlIHRoZSBzYW1lIHR5cGU7IGNvbnNlcXVlbnRseSwgYGB1XCdhYlwnIGluXG5cJ2FiY1wnYGAgd2lsbCByZXR1cm4gYGBUcnVlYGAuIEVtcHR5IHN0cmluZ3MgYXJlIGFsd2F5cyBjb25zaWRlcmVkIHRvXG5iZSBhIHN1YnN0cmluZyBvZiBhbnkgb3RoZXIgc3RyaW5nLCBzbyBgYCIiIGluICJhYmMiYGAgd2lsbCByZXR1cm5cbmBgVHJ1ZWBgLlxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBQcmV2aW91c2x5LCAqeCogd2FzIHJlcXVpcmVkIHRvIGJlIGEgc3RyaW5nIG9mXG5sZW5ndGggYGAxYGAuXG5cbkZvciB1c2VyLWRlZmluZWQgY2xhc3NlcyB3aGljaCBkZWZpbmUgdGhlIGBgX19jb250YWluc19fKClgYCBtZXRob2QsXG5gYHggaW4geWBgIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgYGB5Ll9fY29udGFpbnNfXyh4KWBgIGlzIHRydWUuXG5cbkZvciB1c2VyLWRlZmluZWQgY2xhc3NlcyB3aGljaCBkbyBub3QgZGVmaW5lIGBgX19jb250YWluc19fKClgYCBidXQgZG9cbmRlZmluZSBgYF9faXRlcl9fKClgYCwgYGB4IGluIHlgYCBpcyB0cnVlIGlmIHNvbWUgdmFsdWUgYGB6YGAgd2l0aCBgYHhcbj09IHpgYCBpcyBwcm9kdWNlZCB3aGlsZSBpdGVyYXRpbmcgb3ZlciBgYHlgYC4gIElmIGFuIGV4Y2VwdGlvbiBpc1xucmFpc2VkIGR1cmluZyB0aGUgaXRlcmF0aW9uLCBpdCBpcyBhcyBpZiBgYGluYGAgcmFpc2VkIHRoYXQgZXhjZXB0aW9uLlxuXG5MYXN0bHksIHRoZSBvbGQtc3R5bGUgaXRlcmF0aW9uIHByb3RvY29sIGlzIHRyaWVkOiBpZiBhIGNsYXNzIGRlZmluZXNcbmBgX19nZXRpdGVtX18oKWBgLCBgYHggaW4geWBgIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlcmUgaXMgYSBub24tXG5uZWdhdGl2ZSBpbnRlZ2VyIGluZGV4ICppKiBzdWNoIHRoYXQgYGB4ID09IHlbaV1gYCwgYW5kIGFsbCBsb3dlclxuaW50ZWdlciBpbmRpY2VzIGRvIG5vdCByYWlzZSBgYEluZGV4RXJyb3JgYCBleGNlcHRpb24uIChJZiBhbnkgb3RoZXJcbmV4Y2VwdGlvbiBpcyByYWlzZWQsIGl0IGlzIGFzIGlmIGBgaW5gYCByYWlzZWQgdGhhdCBleGNlcHRpb24pLlxuXG5UaGUgb3BlcmF0b3IgYGBub3QgaW5gYCBpcyBkZWZpbmVkIHRvIGhhdmUgdGhlIGludmVyc2UgdHJ1ZSB2YWx1ZSBvZlxuYGBpbmBgLlxuXG5UaGUgb3BlcmF0b3JzIGBgaXNgYCBhbmQgYGBpcyBub3RgYCB0ZXN0IGZvciBvYmplY3QgaWRlbnRpdHk6IGBgeCBpc1xueWBgIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgKngqIGFuZCAqeSogYXJlIHRoZSBzYW1lIG9iamVjdC4gIGBgeCBpc1xubm90IHlgYCB5aWVsZHMgdGhlIGludmVyc2UgdHJ1dGggdmFsdWUuIFs3XVxuJywKLSAnY29tcG91bmQnOiB1J1xuQ29tcG91bmQgc3RhdGVtZW50c1xuKioqKioqKioqKioqKioqKioqKlxuXG5Db21wb3VuZCBzdGF0ZW1lbnRzIGNvbnRhaW4gKGdyb3VwcyBvZikgb3RoZXIgc3RhdGVtZW50czsgdGhleSBhZmZlY3Rcbm9yIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aG9zZSBvdGhlciBzdGF0ZW1lbnRzIGluIHNvbWUgd2F5LiAgSW5cbmdlbmVyYWwsIGNvbXBvdW5kIHN0YXRlbWVudHMgc3BhbiBtdWx0aXBsZSBsaW5lcywgYWx0aG91Z2ggaW4gc2ltcGxlXG5pbmNhcm5hdGlvbnMgYSB3aG9sZSBjb21wb3VuZCBzdGF0ZW1lbnQgbWF5IGJlIGNvbnRhaW5lZCBpbiBvbmUgbGluZS5cblxuVGhlIGBgaWZgYCwgYGB3aGlsZWBgIGFuZCBgYGZvcmBgIHN0YXRlbWVudHMgaW1wbGVtZW50IHRyYWRpdGlvbmFsXG5jb250cm9sIGZsb3cgY29uc3RydWN0cy4gIGBgdHJ5YGAgc3BlY2lmaWVzIGV4Y2VwdGlvbiBoYW5kbGVycyBhbmQvb3JcbmNsZWFudXAgY29kZSBmb3IgYSBncm91cCBvZiBzdGF0ZW1lbnRzLiAgRnVuY3Rpb24gYW5kIGNsYXNzXG5kZWZpbml0aW9ucyBhcmUgYWxzbyBzeW50YWN0aWNhbGx5IGNvbXBvdW5kIHN0YXRlbWVudHMuXG5cbkNvbXBvdW5kIHN0YXRlbWVudHMgY29uc2lzdCBvZiBvbmUgb3IgbW9yZSBcJ2NsYXVzZXMuXCcgIEEgY2xhdXNlXG5jb25zaXN0cyBvZiBhIGhlYWRlciBhbmQgYSBcJ3N1aXRlLlwnICBUaGUgY2xhdXNlIGhlYWRlcnMgb2YgYVxucGFydGljdWxhciBjb21wb3VuZCBzdGF0ZW1lbnQgYXJlIGFsbCBhdCB0aGUgc2FtZSBpbmRlbnRhdGlvbiBsZXZlbC5cbkVhY2ggY2xhdXNlIGhlYWRlciBiZWdpbnMgd2l0aCBhIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIGtleXdvcmQgYW5kIGVuZHNcbndpdGggYSBjb2xvbi4gIEEgc3VpdGUgaXMgYSBncm91cCBvZiBzdGF0ZW1lbnRzIGNvbnRyb2xsZWQgYnkgYVxuY2xhdXNlLiAgQSBzdWl0ZSBjYW4gYmUgb25lIG9yIG1vcmUgc2VtaWNvbG9uLXNlcGFyYXRlZCBzaW1wbGVcbnN0YXRlbWVudHMgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgaGVhZGVyLCBmb2xsb3dpbmcgdGhlIGhlYWRlclwnc1xuY29sb24sIG9yIGl0IGNhbiBiZSBvbmUgb3IgbW9yZSBpbmRlbnRlZCBzdGF0ZW1lbnRzIG9uIHN1YnNlcXVlbnRcbmxpbmVzLiAgT25seSB0aGUgbGF0dGVyIGZvcm0gb2Ygc3VpdGUgY2FuIGNvbnRhaW4gbmVzdGVkIGNvbXBvdW5kXG5zdGF0ZW1lbnRzOyB0aGUgZm9sbG93aW5nIGlzIGlsbGVnYWwsIG1vc3RseSBiZWNhdXNlIGl0IHdvdWxkblwndCBiZVxuY2xlYXIgdG8gd2hpY2ggYGBpZmBgIGNsYXVzZSBhIGZvbGxvd2luZyBgYGVsc2VgYCBjbGF1c2Ugd291bGQgYmVsb25nOlxuXG4gICBpZiB0ZXN0MTogaWYgdGVzdDI6IHByaW50IHhcblxuQWxzbyBub3RlIHRoYXQgdGhlIHNlbWljb2xvbiBiaW5kcyB0aWdodGVyIHRoYW4gdGhlIGNvbG9uIGluIHRoaXNcbmNvbnRleHQsIHNvIHRoYXQgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCBlaXRoZXIgYWxsIG9yIG5vbmUgb2YgdGhlXG5gYHByaW50YGAgc3RhdGVtZW50cyBhcmUgZXhlY3V0ZWQ6XG5cbiAgIGlmIHggPCB5IDwgejogcHJpbnQgeDsgcHJpbnQgeTsgcHJpbnQgelxuXG5TdW1tYXJpemluZzpcblxuICAgY29tcG91bmRfc3RtdCA6Oj0gaWZfc3RtdFxuICAgICAgICAgICAgICAgICAgICAgfCB3aGlsZV9zdG10XG4gICAgICAgICAgICAgICAgICAgICB8IGZvcl9zdG10XG4gICAgICAgICAgICAgICAgICAgICB8IHRyeV9zdG10XG4gICAgICAgICAgICAgICAgICAgICB8IHdpdGhfc3RtdFxuICAgICAgICAgICAgICAgICAgICAgfCBmdW5jZGVmXG4gICAgICAgICAgICAgICAgICAgICB8IGNsYXNzZGVmXG4gICAgICAgICAgICAgICAgICAgICB8IGRlY29yYXRlZFxuICAgc3VpdGUgICAgICAgICA6Oj0gc3RtdF9saXN0IE5FV0xJTkUgfCBORVdMSU5FIElOREVOVCBzdGF0ZW1lbnQrIERFREVOVFxuICAgc3RhdGVtZW50ICAgICA6Oj0gc3RtdF9saXN0IE5FV0xJTkUgfCBjb21wb3VuZF9zdG10XG4gICBzdG10X2xpc3QgICAgIDo6PSBzaW1wbGVfc3RtdCAoIjsiIHNpbXBsZV9zdG10KSogWyI7Il1cblxuTm90ZSB0aGF0IHN0YXRlbWVudHMgYWx3YXlzIGVuZCBpbiBhIGBgTkVXTElORWBgIHBvc3NpYmx5IGZvbGxvd2VkIGJ5XG5hIGBgREVERU5UYGAuIEFsc28gbm90ZSB0aGF0IG9wdGlvbmFsIGNvbnRpbnVhdGlvbiBjbGF1c2VzIGFsd2F5c1xuYmVnaW4gd2l0aCBhIGtleXdvcmQgdGhhdCBjYW5ub3Qgc3RhcnQgYSBzdGF0ZW1lbnQsIHRodXMgdGhlcmUgYXJlIG5vXG5hbWJpZ3VpdGllcyAodGhlIFwnZGFuZ2xpbmcgYGBlbHNlYGBcJyBwcm9ibGVtIGlzIHNvbHZlZCBpbiBQeXRob24gYnlcbnJlcXVpcmluZyBuZXN0ZWQgYGBpZmBgIHN0YXRlbWVudHMgdG8gYmUgaW5kZW50ZWQpLlxuXG5UaGUgZm9ybWF0dGluZyBvZiB0aGUgZ3JhbW1hciBydWxlcyBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zIHBsYWNlc1xuZWFjaCBjbGF1c2Ugb24gYSBzZXBhcmF0ZSBsaW5lIGZvciBjbGFyaXR5LlxuXG5cblRoZSBgYGlmYGAgc3RhdGVtZW50XG49PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgYGBpZmBgIHN0YXRlbWVudCBpcyB1c2VkIGZvciBjb25kaXRpb25hbCBleGVjdXRpb246XG5cbiAgIGlmX3N0bXQgOjo9ICJpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICggImVsaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlICkqXG4gICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cblxuSXQgc2VsZWN0cyBleGFjdGx5IG9uZSBvZiB0aGUgc3VpdGVzIGJ5IGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb25zIG9uZVxuYnkgb25lIHVudGlsIG9uZSBpcyBmb3VuZCB0byBiZSB0cnVlIChzZWUgc2VjdGlvbiAqQm9vbGVhbiBvcGVyYXRpb25zKlxuZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRydWUgYW5kIGZhbHNlKTsgdGhlbiB0aGF0IHN1aXRlIGlzIGV4ZWN1dGVkXG4oYW5kIG5vIG90aGVyIHBhcnQgb2YgdGhlIGBgaWZgYCBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgb3IgZXZhbHVhdGVkKS5cbklmIGFsbCBleHByZXNzaW9ucyBhcmUgZmFsc2UsIHRoZSBzdWl0ZSBvZiB0aGUgYGBlbHNlYGAgY2xhdXNlLCBpZlxucHJlc2VudCwgaXMgZXhlY3V0ZWQuXG5cblxuVGhlIGBgd2hpbGVgYCBzdGF0ZW1lbnRcbj09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBgYHdoaWxlYGAgc3RhdGVtZW50IGlzIHVzZWQgZm9yIHJlcGVhdGVkIGV4ZWN1dGlvbiBhcyBsb25nIGFzIGFuXG5leHByZXNzaW9uIGlzIHRydWU6XG5cbiAgIHdoaWxlX3N0bXQgOjo9ICJ3aGlsZSIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuXG5UaGlzIHJlcGVhdGVkbHkgdGVzdHMgdGhlIGV4cHJlc3Npb24gYW5kLCBpZiBpdCBpcyB0cnVlLCBleGVjdXRlcyB0aGVcbmZpcnN0IHN1aXRlOyBpZiB0aGUgZXhwcmVzc2lvbiBpcyBmYWxzZSAod2hpY2ggbWF5IGJlIHRoZSBmaXJzdCB0aW1lXG5pdCBpcyB0ZXN0ZWQpIHRoZSBzdWl0ZSBvZiB0aGUgYGBlbHNlYGAgY2xhdXNlLCBpZiBwcmVzZW50LCBpc1xuZXhlY3V0ZWQgYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMuXG5cbkEgYGBicmVha2BgIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgdGVybWluYXRlcyB0aGUgbG9vcFxud2l0aG91dCBleGVjdXRpbmcgdGhlIGBgZWxzZWBgIGNsYXVzZVwncyBzdWl0ZS4gIEEgYGBjb250aW51ZWBgXG5zdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHNraXBzIHRoZSByZXN0IG9mIHRoZSBzdWl0ZSBhbmRcbmdvZXMgYmFjayB0byB0ZXN0aW5nIHRoZSBleHByZXNzaW9uLlxuXG5cblRoZSBgYGZvcmBgIHN0YXRlbWVudFxuPT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBgYGZvcmBgIHN0YXRlbWVudCBpcyB1c2VkIHRvIGl0ZXJhdGUgb3ZlciB0aGUgZWxlbWVudHMgb2YgYVxuc2VxdWVuY2UgKHN1Y2ggYXMgYSBzdHJpbmcsIHR1cGxlIG9yIGxpc3QpIG9yIG90aGVyIGl0ZXJhYmxlIG9iamVjdDpcblxuICAgZm9yX3N0bXQgOjo9ICJmb3IiIHRhcmdldF9saXN0ICJpbiIgZXhwcmVzc2lvbl9saXN0ICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuXG5UaGUgZXhwcmVzc2lvbiBsaXN0IGlzIGV2YWx1YXRlZCBvbmNlOyBpdCBzaG91bGQgeWllbGQgYW4gaXRlcmFibGVcbm9iamVjdC4gIEFuIGl0ZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIHRoZSByZXN1bHQgb2YgdGhlXG5gYGV4cHJlc3Npb25fbGlzdGBgLiAgVGhlIHN1aXRlIGlzIHRoZW4gZXhlY3V0ZWQgb25jZSBmb3IgZWFjaCBpdGVtXG5wcm92aWRlZCBieSB0aGUgaXRlcmF0b3IsIGluIHRoZSBvcmRlciBvZiBhc2NlbmRpbmcgaW5kaWNlcy4gIEVhY2hcbml0ZW0gaW4gdHVybiBpcyBhc3NpZ25lZCB0byB0aGUgdGFyZ2V0IGxpc3QgdXNpbmcgdGhlIHN0YW5kYXJkIHJ1bGVzXG5mb3IgYXNzaWdubWVudHMsIGFuZCB0aGVuIHRoZSBzdWl0ZSBpcyBleGVjdXRlZC4gIFdoZW4gdGhlIGl0ZW1zIGFyZVxuZXhoYXVzdGVkICh3aGljaCBpcyBpbW1lZGlhdGVseSB3aGVuIHRoZSBzZXF1ZW5jZSBpcyBlbXB0eSksIHRoZSBzdWl0ZVxuaW4gdGhlIGBgZWxzZWBgIGNsYXVzZSwgaWYgcHJlc2VudCwgaXMgZXhlY3V0ZWQsIGFuZCB0aGUgbG9vcFxudGVybWluYXRlcy5cblxuQSBgYGJyZWFrYGAgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSB0ZXJtaW5hdGVzIHRoZSBsb29wXG53aXRob3V0IGV4ZWN1dGluZyB0aGUgYGBlbHNlYGAgY2xhdXNlXCdzIHN1aXRlLiAgQSBgYGNvbnRpbnVlYGBcbnN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgc2tpcHMgdGhlIHJlc3Qgb2YgdGhlIHN1aXRlIGFuZFxuY29udGludWVzIHdpdGggdGhlIG5leHQgaXRlbSwgb3Igd2l0aCB0aGUgYGBlbHNlYGAgY2xhdXNlIGlmIHRoZXJlIHdhc1xubm8gbmV4dCBpdGVtLlxuXG5UaGUgc3VpdGUgbWF5IGFzc2lnbiB0byB0aGUgdmFyaWFibGUocykgaW4gdGhlIHRhcmdldCBsaXN0OyB0aGlzIGRvZXNcbm5vdCBhZmZlY3QgdGhlIG5leHQgaXRlbSBhc3NpZ25lZCB0byBpdC5cblxuVGhlIHRhcmdldCBsaXN0IGlzIG5vdCBkZWxldGVkIHdoZW4gdGhlIGxvb3AgaXMgZmluaXNoZWQsIGJ1dCBpZiB0aGVcbnNlcXVlbmNlIGlzIGVtcHR5LCBpdCB3aWxsIG5vdCBoYXZlIGJlZW4gYXNzaWduZWQgdG8gYXQgYWxsIGJ5IHRoZVxubG9vcC4gIEhpbnQ6IHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYHJhbmdlKClgYCByZXR1cm5zIGEgc2VxdWVuY2Ugb2ZcbmludGVnZXJzIHN1aXRhYmxlIHRvIGVtdWxhdGUgdGhlIGVmZmVjdCBvZiBQYXNjYWxcJ3MgYGBmb3IgaSA6PSBhIHRvIGJcbmRvYGA7IGUuZy4sIGBgcmFuZ2UoMylgYCByZXR1cm5zIHRoZSBsaXN0IGBgWzAsIDEsIDJdYGAuXG5cbk5vdGU6IFRoZXJlIGlzIGEgc3VidGxldHkgd2hlbiB0aGUgc2VxdWVuY2UgaXMgYmVpbmcgbW9kaWZpZWQgYnkgdGhlIGxvb3BcbiAgKHRoaXMgY2FuIG9ubHkgb2NjdXIgZm9yIG11dGFibGUgc2VxdWVuY2VzLCBpLmUuIGxpc3RzKS4gQW4gaW50ZXJuYWxcbiAgY291bnRlciBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggaXRlbSBpcyB1c2VkIG5leHQsIGFuZCB0aGlzXG4gIGlzIGluY3JlbWVudGVkIG9uIGVhY2ggaXRlcmF0aW9uLiAgV2hlbiB0aGlzIGNvdW50ZXIgaGFzIHJlYWNoZWQgdGhlXG4gIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UgdGhlIGxvb3AgdGVybWluYXRlcy4gIFRoaXMgbWVhbnMgdGhhdCBpZiB0aGVcbiAgc3VpdGUgZGVsZXRlcyB0aGUgY3VycmVudCAob3IgYSBwcmV2aW91cykgaXRlbSBmcm9tIHRoZSBzZXF1ZW5jZSxcbiAgdGhlIG5leHQgaXRlbSB3aWxsIGJlIHNraXBwZWQgKHNpbmNlIGl0IGdldHMgdGhlIGluZGV4IG9mIHRoZVxuICBjdXJyZW50IGl0ZW0gd2hpY2ggaGFzIGFscmVhZHkgYmVlbiB0cmVhdGVkKS4gIExpa2V3aXNlLCBpZiB0aGVcbiAgc3VpdGUgaW5zZXJ0cyBhbiBpdGVtIGluIHRoZSBzZXF1ZW5jZSBiZWZvcmUgdGhlIGN1cnJlbnQgaXRlbSwgdGhlXG4gIGN1cnJlbnQgaXRlbSB3aWxsIGJlIHRyZWF0ZWQgYWdhaW4gdGhlIG5leHQgdGltZSB0aHJvdWdoIHRoZSBsb29wLlxuICBUaGlzIGNhbiBsZWFkIHRvIG5hc3R5IGJ1Z3MgdGhhdCBjYW4gYmUgYXZvaWRlZCBieSBtYWtpbmcgYVxuICB0ZW1wb3JhcnkgY29weSB1c2luZyBhIHNsaWNlIG9mIHRoZSB3aG9sZSBzZXF1ZW5jZSwgZS5nLixcblxuICAgICBmb3IgeCBpbiBhWzpdOlxuICAgICAgICAgaWYgeCA8IDA6IGEucmVtb3ZlKHgpXG5cblxuVGhlIGBgdHJ5YGAgc3RhdGVtZW50XG49PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIGBgdHJ5YGAgc3RhdGVtZW50IHNwZWNpZmllcyBleGNlcHRpb24gaGFuZGxlcnMgYW5kL29yIGNsZWFudXAgY29kZVxuZm9yIGEgZ3JvdXAgb2Ygc3RhdGVtZW50czpcblxuICAgdHJ5X3N0bXQgIDo6PSB0cnkxX3N0bXQgfCB0cnkyX3N0bXRcbiAgIHRyeTFfc3RtdCA6Oj0gInRyeSIgIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAgICgiZXhjZXB0IiBbZXhwcmVzc2lvbiBbKCJhcyIgfCAiLCIpIHRhcmdldF1dICI6IiBzdWl0ZSkrXG4gICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuICAgICAgICAgICAgICAgICBbImZpbmFsbHkiICI6IiBzdWl0ZV1cbiAgIHRyeTJfc3RtdCA6Oj0gInRyeSIgIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAgICJmaW5hbGx5IiAiOiIgc3VpdGVcblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNTogSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgUHl0aG9uLFxuYGB0cnlgYC4uLmBgZXhjZXB0YGAuLi5gYGZpbmFsbHlgYCBkaWQgbm90IHdvcmsuIGBgdHJ5YGAuLi5gYGV4Y2VwdGBgXG5oYWQgdG8gYmUgbmVzdGVkIGluIGBgdHJ5YGAuLi5gYGZpbmFsbHlgYC5cblxuVGhlIGBgZXhjZXB0YGAgY2xhdXNlKHMpIHNwZWNpZnkgb25lIG9yIG1vcmUgZXhjZXB0aW9uIGhhbmRsZXJzLiBXaGVuXG5ubyBleGNlcHRpb24gb2NjdXJzIGluIHRoZSBgYHRyeWBgIGNsYXVzZSwgbm8gZXhjZXB0aW9uIGhhbmRsZXIgaXNcbmV4ZWN1dGVkLiBXaGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlIGBgdHJ5YGAgc3VpdGUsIGEgc2VhcmNoIGZvclxuYW4gZXhjZXB0aW9uIGhhbmRsZXIgaXMgc3RhcnRlZC4gIFRoaXMgc2VhcmNoIGluc3BlY3RzIHRoZSBleGNlcHRcbmNsYXVzZXMgaW4gdHVybiB1bnRpbCBvbmUgaXMgZm91bmQgdGhhdCBtYXRjaGVzIHRoZSBleGNlcHRpb24uICBBblxuZXhwcmVzc2lvbi1sZXNzIGV4Y2VwdCBjbGF1c2UsIGlmIHByZXNlbnQsIG11c3QgYmUgbGFzdDsgaXQgbWF0Y2hlc1xuYW55IGV4Y2VwdGlvbi4gIEZvciBhbiBleGNlcHQgY2xhdXNlIHdpdGggYW4gZXhwcmVzc2lvbiwgdGhhdFxuZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQsIGFuZCB0aGUgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiBpZiB0aGVcbnJlc3VsdGluZyBvYmplY3QgaXMgImNvbXBhdGlibGUiIHdpdGggdGhlIGV4Y2VwdGlvbi4gIEFuIG9iamVjdCBpc1xuY29tcGF0aWJsZSB3aXRoIGFuIGV4Y2VwdGlvbiBpZiBpdCBpcyB0aGUgY2xhc3Mgb3IgYSBiYXNlIGNsYXNzIG9mIHRoZVxuZXhjZXB0aW9uIG9iamVjdCwgYSB0dXBsZSBjb250YWluaW5nIGFuIGl0ZW0gY29tcGF0aWJsZSB3aXRoIHRoZVxuZXhjZXB0aW9uLCBvciwgaW4gdGhlIChkZXByZWNhdGVkKSBjYXNlIG9mIHN0cmluZyBleGNlcHRpb25zLCBpcyB0aGVcbnJhaXNlZCBzdHJpbmcgaXRzZWxmIChub3RlIHRoYXQgdGhlIG9iamVjdCBpZGVudGl0aWVzIG11c3QgbWF0Y2gsIGkuZS5cbml0IG11c3QgYmUgdGhlIHNhbWUgc3RyaW5nIG9iamVjdCwgbm90IGp1c3QgYSBzdHJpbmcgd2l0aCB0aGUgc2FtZVxudmFsdWUpLlxuXG5JZiBubyBleGNlcHQgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiwgdGhlIHNlYXJjaCBmb3IgYW4gZXhjZXB0aW9uXG5oYW5kbGVyIGNvbnRpbnVlcyBpbiB0aGUgc3Vycm91bmRpbmcgY29kZSBhbmQgb24gdGhlIGludm9jYXRpb24gc3RhY2suXG5bMV1cblxuSWYgdGhlIGV2YWx1YXRpb24gb2YgYW4gZXhwcmVzc2lvbiBpbiB0aGUgaGVhZGVyIG9mIGFuIGV4Y2VwdCBjbGF1c2VcbnJhaXNlcyBhbiBleGNlcHRpb24sIHRoZSBvcmlnaW5hbCBzZWFyY2ggZm9yIGEgaGFuZGxlciBpcyBjYW5jZWxlZCBhbmRcbmEgc2VhcmNoIHN0YXJ0cyBmb3IgdGhlIG5ldyBleGNlcHRpb24gaW4gdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIG9uXG50aGUgY2FsbCBzdGFjayAoaXQgaXMgdHJlYXRlZCBhcyBpZiB0aGUgZW50aXJlIGBgdHJ5YGAgc3RhdGVtZW50XG5yYWlzZWQgdGhlIGV4Y2VwdGlvbikuXG5cbldoZW4gYSBtYXRjaGluZyBleGNlcHQgY2xhdXNlIGlzIGZvdW5kLCB0aGUgZXhjZXB0aW9uIGlzIGFzc2lnbmVkIHRvXG50aGUgdGFyZ2V0IHNwZWNpZmllZCBpbiB0aGF0IGV4Y2VwdCBjbGF1c2UsIGlmIHByZXNlbnQsIGFuZCB0aGUgZXhjZXB0XG5jbGF1c2VcJ3Mgc3VpdGUgaXMgZXhlY3V0ZWQuICBBbGwgZXhjZXB0IGNsYXVzZXMgbXVzdCBoYXZlIGFuXG5leGVjdXRhYmxlIGJsb2NrLiAgV2hlbiB0aGUgZW5kIG9mIHRoaXMgYmxvY2sgaXMgcmVhY2hlZCwgZXhlY3V0aW9uXG5jb250aW51ZXMgbm9ybWFsbHkgYWZ0ZXIgdGhlIGVudGlyZSB0cnkgc3RhdGVtZW50LiAgKFRoaXMgbWVhbnMgdGhhdFxuaWYgdHdvIG5lc3RlZCBoYW5kbGVycyBleGlzdCBmb3IgdGhlIHNhbWUgZXhjZXB0aW9uLCBhbmQgdGhlIGV4Y2VwdGlvblxub2NjdXJzIGluIHRoZSB0cnkgY2xhdXNlIG9mIHRoZSBpbm5lciBoYW5kbGVyLCB0aGUgb3V0ZXIgaGFuZGxlciB3aWxsXG5ub3QgaGFuZGxlIHRoZSBleGNlcHRpb24uKVxuXG5CZWZvcmUgYW4gZXhjZXB0IGNsYXVzZVwncyBzdWl0ZSBpcyBleGVjdXRlZCwgZGV0YWlscyBhYm91dCB0aGVcbmV4Y2VwdGlvbiBhcmUgYXNzaWduZWQgdG8gdGhyZWUgdmFyaWFibGVzIGluIHRoZSBgYHN5c2BgIG1vZHVsZTpcbmBgc3lzLmV4Y190eXBlYGAgcmVjZWl2ZXMgdGhlIG9iamVjdCBpZGVudGlmeWluZyB0aGUgZXhjZXB0aW9uO1xuYGBzeXMuZXhjX3ZhbHVlYGAgcmVjZWl2ZXMgdGhlIGV4Y2VwdGlvblwncyBwYXJhbWV0ZXI7XG5gYHN5cy5leGNfdHJhY2ViYWNrYGAgcmVjZWl2ZXMgYSB0cmFjZWJhY2sgb2JqZWN0IChzZWUgc2VjdGlvbiAqVGhlXG5zdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSopIGlkZW50aWZ5aW5nIHRoZSBwb2ludCBpbiB0aGUgcHJvZ3JhbSB3aGVyZVxudGhlIGV4Y2VwdGlvbiBvY2N1cnJlZC4gVGhlc2UgZGV0YWlscyBhcmUgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGVcbmBgc3lzLmV4Y19pbmZvKClgYCBmdW5jdGlvbiwgd2hpY2ggcmV0dXJucyBhIHR1cGxlIGBgKGV4Y190eXBlLFxuZXhjX3ZhbHVlLCBleGNfdHJhY2ViYWNrKWBgLiAgVXNlIG9mIHRoZSBjb3JyZXNwb25kaW5nIHZhcmlhYmxlcyBpc1xuZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB0aGlzIGZ1bmN0aW9uLCBzaW5jZSB0aGVpciB1c2UgaXMgdW5zYWZlIGluIGFcbnRocmVhZGVkIHByb2dyYW0uICBBcyBvZiBQeXRob24gMS41LCB0aGUgdmFyaWFibGVzIGFyZSByZXN0b3JlZCB0b1xudGhlaXIgcHJldmlvdXMgdmFsdWVzIChiZWZvcmUgdGhlIGNhbGwpIHdoZW4gcmV0dXJuaW5nIGZyb20gYSBmdW5jdGlvblxudGhhdCBoYW5kbGVkIGFuIGV4Y2VwdGlvbi5cblxuVGhlIG9wdGlvbmFsIGBgZWxzZWBgIGNsYXVzZSBpcyBleGVjdXRlZCBpZiBhbmQgd2hlbiBjb250cm9sIGZsb3dzIG9mZlxudGhlIGVuZCBvZiB0aGUgYGB0cnlgYCBjbGF1c2UuIFsyXSBFeGNlcHRpb25zIGluIHRoZSBgYGVsc2VgYCBjbGF1c2VcbmFyZSBub3QgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nIGBgZXhjZXB0YGAgY2xhdXNlcy5cblxuSWYgYGBmaW5hbGx5YGAgaXMgcHJlc2VudCwgaXQgc3BlY2lmaWVzIGEgXCdjbGVhbnVwXCcgaGFuZGxlci4gIFRoZVxuYGB0cnlgYCBjbGF1c2UgaXMgZXhlY3V0ZWQsIGluY2x1ZGluZyBhbnkgYGBleGNlcHRgYCBhbmQgYGBlbHNlYGBcbmNsYXVzZXMuICBJZiBhbiBleGNlcHRpb24gb2NjdXJzIGluIGFueSBvZiB0aGUgY2xhdXNlcyBhbmQgaXMgbm90XG5oYW5kbGVkLCB0aGUgZXhjZXB0aW9uIGlzIHRlbXBvcmFyaWx5IHNhdmVkLiBUaGUgYGBmaW5hbGx5YGAgY2xhdXNlIGlzXG5leGVjdXRlZC4gIElmIHRoZXJlIGlzIGEgc2F2ZWQgZXhjZXB0aW9uLCBpdCBpcyByZS1yYWlzZWQgYXQgdGhlIGVuZFxub2YgdGhlIGBgZmluYWxseWBgIGNsYXVzZS4gSWYgdGhlIGBgZmluYWxseWBgIGNsYXVzZSByYWlzZXMgYW5vdGhlclxuZXhjZXB0aW9uIG9yIGV4ZWN1dGVzIGEgYGByZXR1cm5gYCBvciBgYGJyZWFrYGAgc3RhdGVtZW50LCB0aGUgc2F2ZWRcbmV4Y2VwdGlvbiBpcyBsb3N0LiAgVGhlIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIHRvIHRoZVxucHJvZ3JhbSBkdXJpbmcgZXhlY3V0aW9uIG9mIHRoZSBgYGZpbmFsbHlgYCBjbGF1c2UuXG5cbldoZW4gYSBgYHJldHVybmBgLCBgYGJyZWFrYGAgb3IgYGBjb250aW51ZWBgIHN0YXRlbWVudCBpcyBleGVjdXRlZCBpblxudGhlIGBgdHJ5YGAgc3VpdGUgb2YgYSBgYHRyeWBgLi4uYGBmaW5hbGx5YGAgc3RhdGVtZW50LCB0aGVcbmBgZmluYWxseWBgIGNsYXVzZSBpcyBhbHNvIGV4ZWN1dGVkIFwnb24gdGhlIHdheSBvdXQuXCcgQSBgYGNvbnRpbnVlYGBcbnN0YXRlbWVudCBpcyBpbGxlZ2FsIGluIHRoZSBgYGZpbmFsbHlgYCBjbGF1c2UuIChUaGUgcmVhc29uIGlzIGFcbnByb2JsZW0gd2l0aCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiAtLS0gdGhpcyByZXN0cmljdGlvbiBtYXkgYmVcbmxpZnRlZCBpbiB0aGUgZnV0dXJlKS5cblxuQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBleGNlcHRpb25zIGNhbiBiZSBmb3VuZCBpbiBzZWN0aW9uXG4qRXhjZXB0aW9ucyosIGFuZCBpbmZvcm1hdGlvbiBvbiB1c2luZyB0aGUgYGByYWlzZWBgIHN0YXRlbWVudCB0b1xuZ2VuZXJhdGUgZXhjZXB0aW9ucyBtYXkgYmUgZm91bmQgaW4gc2VjdGlvbiAqVGhlIHJhaXNlIHN0YXRlbWVudCouXG5cblxuVGhlIGBgd2l0aGBgIHN0YXRlbWVudFxuPT09PT09PT09PT09PT09PT09PT09PVxuXG5OZXcgaW4gdmVyc2lvbiAyLjUuXG5cblRoZSBgYHdpdGhgYCBzdGF0ZW1lbnQgaXMgdXNlZCB0byB3cmFwIHRoZSBleGVjdXRpb24gb2YgYSBibG9jayB3aXRoXG5tZXRob2RzIGRlZmluZWQgYnkgYSBjb250ZXh0IG1hbmFnZXIgKHNlZSBzZWN0aW9uICpXaXRoIFN0YXRlbWVudFxuQ29udGV4dCBNYW5hZ2VycyopLiBUaGlzIGFsbG93cyBjb21tb25cbmBgdHJ5YGAuLi5gYGV4Y2VwdGBgLi4uYGBmaW5hbGx5YGAgdXNhZ2UgcGF0dGVybnMgdG8gYmUgZW5jYXBzdWxhdGVkXG5mb3IgY29udmVuaWVudCByZXVzZS5cblxuICAgd2l0aF9zdG10IDo6PSAid2l0aCIgd2l0aF9pdGVtICgiLCIgd2l0aF9pdGVtKSogIjoiIHN1aXRlXG4gICB3aXRoX2l0ZW0gOjo9IGV4cHJlc3Npb24gWyJhcyIgdGFyZ2V0XVxuXG5UaGUgZXhlY3V0aW9uIG9mIHRoZSBgYHdpdGhgYCBzdGF0ZW1lbnQgd2l0aCBvbmUgIml0ZW0iIHByb2NlZWRzIGFzXG5mb2xsb3dzOlxuXG4xLiBUaGUgY29udGV4dCBleHByZXNzaW9uICh0aGUgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGUgKip3aXRoX2l0ZW0qKilcbiAgIGlzIGV2YWx1YXRlZCB0byBvYnRhaW4gYSBjb250ZXh0IG1hbmFnZXIuXG5cbjIuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgYGBfX2V4aXRfXygpYGAgaXMgbG9hZGVkIGZvciBsYXRlciB1c2UuXG5cbjMuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgYGBfX2VudGVyX18oKWBgIG1ldGhvZCBpcyBpbnZva2VkLlxuXG40LiBJZiBhIHRhcmdldCB3YXMgaW5jbHVkZWQgaW4gdGhlIGBgd2l0aGBgIHN0YXRlbWVudCwgdGhlIHJldHVyblxuICAgdmFsdWUgZnJvbSBgYF9fZW50ZXJfXygpYGAgaXMgYXNzaWduZWQgdG8gaXQuXG5cbiAgIE5vdGU6IFRoZSBgYHdpdGhgYCBzdGF0ZW1lbnQgZ3VhcmFudGVlcyB0aGF0IGlmIHRoZSBgYF9fZW50ZXJfXygpYGBcbiAgICAgbWV0aG9kIHJldHVybnMgd2l0aG91dCBhbiBlcnJvciwgdGhlbiBgYF9fZXhpdF9fKClgYCB3aWxsIGFsd2F5c1xuICAgICBiZSBjYWxsZWQuIFRodXMsIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGFzc2lnbm1lbnQgdG8gdGhlXG4gICAgIHRhcmdldCBsaXN0LCBpdCB3aWxsIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgYW4gZXJyb3Igb2NjdXJyaW5nXG4gICAgIHdpdGhpbiB0aGUgc3VpdGUgd291bGQgYmUuIFNlZSBzdGVwIDYgYmVsb3cuXG5cbjUuIFRoZSBzdWl0ZSBpcyBleGVjdXRlZC5cblxuNi4gVGhlIGNvbnRleHQgbWFuYWdlclwncyBgYF9fZXhpdF9fKClgYCBtZXRob2QgaXMgaW52b2tlZC4gSWYgYW5cbiAgIGV4Y2VwdGlvbiBjYXVzZWQgdGhlIHN1aXRlIHRvIGJlIGV4aXRlZCwgaXRzIHR5cGUsIHZhbHVlLCBhbmRcbiAgIHRyYWNlYmFjayBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byBgYF9fZXhpdF9fKClgYC4gT3RoZXJ3aXNlLFxuICAgdGhyZWUgYGBOb25lYGAgYXJndW1lbnRzIGFyZSBzdXBwbGllZC5cblxuICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbiwgYW5kIHRoZSByZXR1cm4gdmFsdWVcbiAgIGZyb20gdGhlIGBgX19leGl0X18oKWBgIG1ldGhvZCB3YXMgZmFsc2UsIHRoZSBleGNlcHRpb24gaXNcbiAgIHJlcmFpc2VkLiBJZiB0aGUgcmV0dXJuIHZhbHVlIHdhcyB0cnVlLCB0aGUgZXhjZXB0aW9uIGlzXG4gICBzdXBwcmVzc2VkLCBhbmQgZXhlY3V0aW9uIGNvbnRpbnVlcyB3aXRoIHRoZSBzdGF0ZW1lbnQgZm9sbG93aW5nXG4gICB0aGUgYGB3aXRoYGAgc3RhdGVtZW50LlxuXG4gICBJZiB0aGUgc3VpdGUgd2FzIGV4aXRlZCBmb3IgYW55IHJlYXNvbiBvdGhlciB0aGFuIGFuIGV4Y2VwdGlvbiwgdGhlXG4gICByZXR1cm4gdmFsdWUgZnJvbSBgYF9fZXhpdF9fKClgYCBpcyBpZ25vcmVkLCBhbmQgZXhlY3V0aW9uIHByb2NlZWRzXG4gICBhdCB0aGUgbm9ybWFsIGxvY2F0aW9uIGZvciB0aGUga2luZCBvZiBleGl0IHRoYXQgd2FzIHRha2VuLlxuXG5XaXRoIG1vcmUgdGhhbiBvbmUgaXRlbSwgdGhlIGNvbnRleHQgbWFuYWdlcnMgYXJlIHByb2Nlc3NlZCBhcyBpZlxubXVsdGlwbGUgYGB3aXRoYGAgc3RhdGVtZW50cyB3ZXJlIG5lc3RlZDpcblxuICAgd2l0aCBBKCkgYXMgYSwgQigpIGFzIGI6XG4gICAgICAgc3VpdGVcblxuaXMgZXF1aXZhbGVudCB0b1xuXG4gICB3aXRoIEEoKSBhcyBhOlxuICAgICAgIHdpdGggQigpIGFzIGI6XG4gICAgICAgICAgIHN1aXRlXG5cbk5vdGU6IEluIFB5dGhvbiAyLjUsIHRoZSBgYHdpdGhgYCBzdGF0ZW1lbnQgaXMgb25seSBhbGxvd2VkIHdoZW4gdGhlXG4gIGBgd2l0aF9zdGF0ZW1lbnRgYCBmZWF0dXJlIGhhcyBiZWVuIGVuYWJsZWQuICBJdCBpcyBhbHdheXMgZW5hYmxlZFxuICBpbiBQeXRob24gMi42LlxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMi43OiBTdXBwb3J0IGZvciBtdWx0aXBsZSBjb250ZXh0IGV4cHJlc3Npb25zLlxuXG5TZWUgYWxzbzpcblxuICAgKipQRVAgMDM0MyoqIC0gVGhlICJ3aXRoIiBzdGF0ZW1lbnRcbiAgICAgIFRoZSBzcGVjaWZpY2F0aW9uLCBiYWNrZ3JvdW5kLCBhbmQgZXhhbXBsZXMgZm9yIHRoZSBQeXRob25cbiAgICAgIGBgd2l0aGBgIHN0YXRlbWVudC5cblxuXG5GdW5jdGlvbiBkZWZpbml0aW9uc1xuPT09PT09PT09PT09PT09PT09PT1cblxuQSBmdW5jdGlvbiBkZWZpbml0aW9uIGRlZmluZXMgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IChzZWVcbnNlY3Rpb24gKlRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSopOlxuXG4gICBkZWNvcmF0ZWQgICAgICA6Oj0gZGVjb3JhdG9ycyAoY2xhc3NkZWYgfCBmdW5jZGVmKVxuICAgZGVjb3JhdG9ycyAgICAgOjo9IGRlY29yYXRvcitcbiAgIGRlY29yYXRvciAgICAgIDo6PSAiQCIgZG90dGVkX25hbWUgWyIoIiBbYXJndW1lbnRfbGlzdCBbIiwiXV0gIikiXSBORVdMSU5FXG4gICBmdW5jZGVmICAgICAgICA6Oj0gImRlZiIgZnVuY25hbWUgIigiIFtwYXJhbWV0ZXJfbGlzdF0gIikiICI6IiBzdWl0ZVxuICAgZG90dGVkX25hbWUgICAgOjo9IGlkZW50aWZpZXIgKCIuIiBpZGVudGlmaWVyKSpcbiAgIHBhcmFtZXRlcl9saXN0IDo6PSAoZGVmcGFyYW1ldGVyICIsIikqXG4gICAgICAgICAgICAgICAgICAgICAgKCAgIioiIGlkZW50aWZpZXIgWywgIioqIiBpZGVudGlmaWVyXVxuICAgICAgICAgICAgICAgICAgICAgIHwgIioqIiBpZGVudGlmaWVyXG4gICAgICAgICAgICAgICAgICAgICAgfCBkZWZwYXJhbWV0ZXIgWyIsIl0gKVxuICAgZGVmcGFyYW1ldGVyICAgOjo9IHBhcmFtZXRlciBbIj0iIGV4cHJlc3Npb25dXG4gICBzdWJsaXN0ICAgICAgICA6Oj0gcGFyYW1ldGVyICgiLCIgcGFyYW1ldGVyKSogWyIsIl1cbiAgIHBhcmFtZXRlciAgICAgIDo6PSBpZGVudGlmaWVyIHwgIigiIHN1Ymxpc3QgIikiXG4gICBmdW5jbmFtZSAgICAgICA6Oj0gaWRlbnRpZmllclxuXG5BIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBJdHMgZXhlY3V0aW9uIGJpbmRzXG50aGUgZnVuY3Rpb24gbmFtZSBpbiB0aGUgY3VycmVudCBsb2NhbCBuYW1lc3BhY2UgdG8gYSBmdW5jdGlvbiBvYmplY3RcbihhIHdyYXBwZXIgYXJvdW5kIHRoZSBleGVjdXRhYmxlIGNvZGUgZm9yIHRoZSBmdW5jdGlvbikuICBUaGlzXG5mdW5jdGlvbiBvYmplY3QgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIG5hbWVzcGFjZVxuYXMgdGhlIGdsb2JhbCBuYW1lc3BhY2UgdG8gYmUgdXNlZCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuXG5cblRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGRvZXMgbm90IGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIGJvZHk7IHRoaXMgZ2V0c1xuZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuIFszXVxuXG5BIGZ1bmN0aW9uIGRlZmluaXRpb24gbWF5IGJlIHdyYXBwZWQgYnkgb25lIG9yIG1vcmUgKmRlY29yYXRvcipcbmV4cHJlc3Npb25zLiBEZWNvcmF0b3IgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCB3aGVuIHRoZSBmdW5jdGlvbiBpc1xuZGVmaW5lZCwgaW4gdGhlIHNjb3BlIHRoYXQgY29udGFpbnMgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24uICBUaGVcbnJlc3VsdCBtdXN0IGJlIGEgY2FsbGFibGUsIHdoaWNoIGlzIGludm9rZWQgd2l0aCB0aGUgZnVuY3Rpb24gb2JqZWN0XG5hcyB0aGUgb25seSBhcmd1bWVudC4gVGhlIHJldHVybmVkIHZhbHVlIGlzIGJvdW5kIHRvIHRoZSBmdW5jdGlvbiBuYW1lXG5pbnN0ZWFkIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QuICBNdWx0aXBsZSBkZWNvcmF0b3JzIGFyZSBhcHBsaWVkIGluXG5uZXN0ZWQgZmFzaGlvbi4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZTpcblxuICAgQGYxKGFyZylcbiAgIEBmMlxuICAgZGVmIGZ1bmMoKTogcGFzc1xuXG5pcyBlcXVpdmFsZW50IHRvOlxuXG4gICBkZWYgZnVuYygpOiBwYXNzXG4gICBmdW5jID0gZjEoYXJnKShmMihmdW5jKSlcblxuV2hlbiBvbmUgb3IgbW9yZSB0b3AtbGV2ZWwgcGFyYW1ldGVycyBoYXZlIHRoZSBmb3JtICpwYXJhbWV0ZXIqIGBgPWBgXG4qZXhwcmVzc2lvbiosIHRoZSBmdW5jdGlvbiBpcyBzYWlkIHRvIGhhdmUgImRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlcy4iXG5Gb3IgYSBwYXJhbWV0ZXIgd2l0aCBhIGRlZmF1bHQgdmFsdWUsIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50IG1heVxuYmUgb21pdHRlZCBmcm9tIGEgY2FsbCwgaW4gd2hpY2ggY2FzZSB0aGUgcGFyYW1ldGVyXCdzIGRlZmF1bHQgdmFsdWUgaXNcbnN1YnN0aXR1dGVkLiAgSWYgYSBwYXJhbWV0ZXIgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgYWxsIGZvbGxvd2luZ1xucGFyYW1ldGVycyBtdXN0IGFsc28gaGF2ZSBhIGRlZmF1bHQgdmFsdWUgLS0tIHRoaXMgaXMgYSBzeW50YWN0aWNcbnJlc3RyaWN0aW9uIHRoYXQgaXMgbm90IGV4cHJlc3NlZCBieSB0aGUgZ3JhbW1hci5cblxuKipEZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMgYXJlIGV2YWx1YXRlZCB3aGVuIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uXG5pcyBleGVjdXRlZC4qKiAgVGhpcyBtZWFucyB0aGF0IHRoZSBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBvbmNlLCB3aGVuXG50aGUgZnVuY3Rpb24gaXMgZGVmaW5lZCwgYW5kIHRoYXQgdGhhdCBzYW1lICJwcmUtY29tcHV0ZWQiIHZhbHVlIGlzXG51c2VkIGZvciBlYWNoIGNhbGwuICBUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgd2hlbiBhXG5kZWZhdWx0IHBhcmFtZXRlciBpcyBhIG11dGFibGUgb2JqZWN0LCBzdWNoIGFzIGEgbGlzdCBvciBhIGRpY3Rpb25hcnk6XG5pZiB0aGUgZnVuY3Rpb24gbW9kaWZpZXMgdGhlIG9iamVjdCAoZS5nLiBieSBhcHBlbmRpbmcgYW4gaXRlbSB0byBhXG5saXN0KSwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgaW4gZWZmZWN0IG1vZGlmaWVkLiBUaGlzIGlzIGdlbmVyYWxseSBub3RcbndoYXQgd2FzIGludGVuZGVkLiAgQSB3YXkgYXJvdW5kIHRoaXMgIGlzIHRvIHVzZSBgYE5vbmVgYCBhcyB0aGVcbmRlZmF1bHQsIGFuZCBleHBsaWNpdGx5IHRlc3QgZm9yIGl0IGluIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbiwgZS5nLjpcblxuICAgZGVmIHdoYXRzX29uX3RoZV90ZWxseShwZW5ndWluPU5vbmUpOlxuICAgICAgIGlmIHBlbmd1aW4gaXMgTm9uZTpcbiAgICAgICAgICAgcGVuZ3VpbiA9IFtdXG4gICAgICAgcGVuZ3Vpbi5hcHBlbmQoInByb3BlcnR5IG9mIHRoZSB6b28iKVxuICAgICAgIHJldHVybiBwZW5ndWluXG5cbkZ1bmN0aW9uIGNhbGwgc2VtYW50aWNzIGFyZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gc2VjdGlvblxuKkNhbGxzKi4gQSBmdW5jdGlvbiBjYWxsIGFsd2F5cyBhc3NpZ25zIHZhbHVlcyB0byBhbGwgcGFyYW1ldGVyc1xubWVudGlvbmVkIGluIHRoZSBwYXJhbWV0ZXIgbGlzdCwgZWl0aGVyIGZyb20gcG9zaXRpb24gYXJndW1lbnRzLCBmcm9tXG5rZXl3b3JkIGFyZ3VtZW50cywgb3IgZnJvbSBkZWZhdWx0IHZhbHVlcy4gIElmIHRoZSBmb3JtXG4iYGAqaWRlbnRpZmllcmBgIiBpcyBwcmVzZW50LCBpdCBpcyBpbml0aWFsaXplZCB0byBhIHR1cGxlIHJlY2VpdmluZ1xuYW55IGV4Y2VzcyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHR1cGxlLiAgSWZcbnRoZSBmb3JtICJgYCoqaWRlbnRpZmllcmBgIiBpcyBwcmVzZW50LCBpdCBpcyBpbml0aWFsaXplZCB0byBhIG5ld1xuZGljdGlvbmFyeSByZWNlaXZpbmcgYW55IGV4Y2VzcyBrZXl3b3JkIGFyZ3VtZW50cywgZGVmYXVsdGluZyB0byBhIG5ld1xuZW1wdHkgZGljdGlvbmFyeS5cblxuSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBjcmVhdGUgYW5vbnltb3VzIGZ1bmN0aW9ucyAoZnVuY3Rpb25zIG5vdCBib3VuZFxudG8gYSBuYW1lKSwgZm9yIGltbWVkaWF0ZSB1c2UgaW4gZXhwcmVzc2lvbnMuICBUaGlzIHVzZXMgbGFtYmRhIGZvcm1zLFxuZGVzY3JpYmVkIGluIHNlY3Rpb24gKkxhbWJkYXMqLiAgTm90ZSB0aGF0IHRoZSBsYW1iZGEgZm9ybSBpcyBtZXJlbHkgYVxuc2hvcnRoYW5kIGZvciBhIHNpbXBsaWZpZWQgZnVuY3Rpb24gZGVmaW5pdGlvbjsgYSBmdW5jdGlvbiBkZWZpbmVkIGluXG5hICJgYGRlZmBgIiBzdGF0ZW1lbnQgY2FuIGJlIHBhc3NlZCBhcm91bmQgb3IgYXNzaWduZWQgdG8gYW5vdGhlciBuYW1lXG5qdXN0IGxpa2UgYSBmdW5jdGlvbiBkZWZpbmVkIGJ5IGEgbGFtYmRhIGZvcm0uICBUaGUgImBgZGVmYGAiIGZvcm0gaXNcbmFjdHVhbGx5IG1vcmUgcG93ZXJmdWwgc2luY2UgaXQgYWxsb3dzIHRoZSBleGVjdXRpb24gb2YgbXVsdGlwbGVcbnN0YXRlbWVudHMuXG5cbioqUHJvZ3JhbW1lclwncyBub3RlOioqIEZ1bmN0aW9ucyBhcmUgZmlyc3QtY2xhc3Mgb2JqZWN0cy4gIEEgImBgZGVmYGAiXG5mb3JtIGV4ZWN1dGVkIGluc2lkZSBhIGZ1bmN0aW9uIGRlZmluaXRpb24gZGVmaW5lcyBhIGxvY2FsIGZ1bmN0aW9uXG50aGF0IGNhbiBiZSByZXR1cm5lZCBvciBwYXNzZWQgYXJvdW5kLiAgRnJlZSB2YXJpYWJsZXMgdXNlZCBpbiB0aGVcbm5lc3RlZCBmdW5jdGlvbiBjYW4gYWNjZXNzIHRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgdGhlIGZ1bmN0aW9uXG5jb250YWluaW5nIHRoZSBkZWYuICBTZWUgc2VjdGlvbiAqTmFtaW5nIGFuZCBiaW5kaW5nKiBmb3IgZGV0YWlscy5cblxuXG5DbGFzcyBkZWZpbml0aW9uc1xuPT09PT09PT09PT09PT09PT1cblxuQSBjbGFzcyBkZWZpbml0aW9uIGRlZmluZXMgYSBjbGFzcyBvYmplY3QgKHNlZSBzZWN0aW9uICpUaGUgc3RhbmRhcmRcbnR5cGUgaGllcmFyY2h5Kik6XG5cbiAgIGNsYXNzZGVmICAgIDo6PSAiY2xhc3MiIGNsYXNzbmFtZSBbaW5oZXJpdGFuY2VdICI6IiBzdWl0ZVxuICAgaW5oZXJpdGFuY2UgOjo9ICIoIiBbZXhwcmVzc2lvbl9saXN0XSAiKSJcbiAgIGNsYXNzbmFtZSAgIDo6PSBpZGVudGlmaWVyXG5cbkEgY2xhc3MgZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudC4gIEl0IGZpcnN0IGV2YWx1YXRlcyB0aGVcbmluaGVyaXRhbmNlIGxpc3QsIGlmIHByZXNlbnQuICBFYWNoIGl0ZW0gaW4gdGhlIGluaGVyaXRhbmNlIGxpc3RcbnNob3VsZCBldmFsdWF0ZSB0byBhIGNsYXNzIG9iamVjdCBvciBjbGFzcyB0eXBlIHdoaWNoIGFsbG93c1xuc3ViY2xhc3NpbmcuICBUaGUgY2xhc3NcJ3Mgc3VpdGUgaXMgdGhlbiBleGVjdXRlZCBpbiBhIG5ldyBleGVjdXRpb25cbmZyYW1lIChzZWUgc2VjdGlvbiAqTmFtaW5nIGFuZCBiaW5kaW5nKiksIHVzaW5nIGEgbmV3bHkgY3JlYXRlZCBsb2NhbFxubmFtZXNwYWNlIGFuZCB0aGUgb3JpZ2luYWwgZ2xvYmFsIG5hbWVzcGFjZS4gKFVzdWFsbHksIHRoZSBzdWl0ZVxuY29udGFpbnMgb25seSBmdW5jdGlvbiBkZWZpbml0aW9ucy4pICBXaGVuIHRoZSBjbGFzc1wncyBzdWl0ZSBmaW5pc2hlc1xuZXhlY3V0aW9uLCBpdHMgZXhlY3V0aW9uIGZyYW1lIGlzIGRpc2NhcmRlZCBidXQgaXRzIGxvY2FsIG5hbWVzcGFjZSBpc1xuc2F2ZWQuIFs0XSBBIGNsYXNzIG9iamVjdCBpcyB0aGVuIGNyZWF0ZWQgdXNpbmcgdGhlIGluaGVyaXRhbmNlIGxpc3RcbmZvciB0aGUgYmFzZSBjbGFzc2VzIGFuZCB0aGUgc2F2ZWQgbG9jYWwgbmFtZXNwYWNlIGZvciB0aGUgYXR0cmlidXRlXG5kaWN0aW9uYXJ5LiAgVGhlIGNsYXNzIG5hbWUgaXMgYm91bmQgdG8gdGhpcyBjbGFzcyBvYmplY3QgaW4gdGhlXG5vcmlnaW5hbCBsb2NhbCBuYW1lc3BhY2UuXG5cbioqUHJvZ3JhbW1lclwncyBub3RlOioqIFZhcmlhYmxlcyBkZWZpbmVkIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uIGFyZVxuY2xhc3MgdmFyaWFibGVzOyB0aGV5IGFyZSBzaGFyZWQgYnkgYWxsIGluc3RhbmNlcy4gIFRvIGNyZWF0ZSBpbnN0YW5jZVxudmFyaWFibGVzLCB0aGV5IGNhbiBiZSBzZXQgaW4gYSBtZXRob2Qgd2l0aCBgYHNlbGYubmFtZSA9IHZhbHVlYGAuXG5Cb3RoIGNsYXNzIGFuZCBpbnN0YW5jZSB2YXJpYWJsZXMgYXJlIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUgbm90YXRpb25cbiJgYHNlbGYubmFtZWBgIiwgYW5kIGFuIGluc3RhbmNlIHZhcmlhYmxlIGhpZGVzIGEgY2xhc3MgdmFyaWFibGUgd2l0aFxudGhlIHNhbWUgbmFtZSB3aGVuIGFjY2Vzc2VkIGluIHRoaXMgd2F5LiBDbGFzcyB2YXJpYWJsZXMgY2FuIGJlIHVzZWRcbmFzIGRlZmF1bHRzIGZvciBpbnN0YW5jZSB2YXJpYWJsZXMsIGJ1dCB1c2luZyBtdXRhYmxlIHZhbHVlcyB0aGVyZSBjYW5cbmxlYWQgdG8gdW5leHBlY3RlZCByZXN1bHRzLiAgRm9yICpuZXctc3R5bGUgY2xhc3MqZXMsIGRlc2NyaXB0b3JzIGNhblxuYmUgdXNlZCB0byBjcmVhdGUgaW5zdGFuY2UgdmFyaWFibGVzIHdpdGggZGlmZmVyZW50IGltcGxlbWVudGF0aW9uXG5kZXRhaWxzLlxuXG5DbGFzcyBkZWZpbml0aW9ucywgbGlrZSBmdW5jdGlvbiBkZWZpbml0aW9ucywgbWF5IGJlIHdyYXBwZWQgYnkgb25lIG9yXG5tb3JlICpkZWNvcmF0b3IqIGV4cHJlc3Npb25zLiAgVGhlIGV2YWx1YXRpb24gcnVsZXMgZm9yIHRoZSBkZWNvcmF0b3JcbmV4cHJlc3Npb25zIGFyZSB0aGUgc2FtZSBhcyBmb3IgZnVuY3Rpb25zLiAgVGhlIHJlc3VsdCBtdXN0IGJlIGEgY2xhc3Ncbm9iamVjdCwgd2hpY2ggaXMgdGhlbiBib3VuZCB0byB0aGUgY2xhc3MgbmFtZS5cblxuLVsgRm9vdG5vdGVzIF0tXG5cblsxXSBUaGUgZXhjZXB0aW9uIGlzIHByb3BhZ2F0ZWQgdG8gdGhlIGludm9jYXRpb24gc3RhY2sgb25seSBpZiB0aGVyZVxuICAgIGlzIG5vIGBgZmluYWxseWBgIGNsYXVzZSB0aGF0IG5lZ2F0ZXMgdGhlIGV4Y2VwdGlvbi5cblxuWzJdIEN1cnJlbnRseSwgY29udHJvbCAiZmxvd3Mgb2ZmIHRoZSBlbmQiIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBhblxuICAgIGV4Y2VwdGlvbiBvciB0aGUgZXhlY3V0aW9uIG9mIGEgYGByZXR1cm5gYCwgYGBjb250aW51ZWBgLCBvclxuICAgIGBgYnJlYWtgYCBzdGF0ZW1lbnQuXG5cblszXSBBIHN0cmluZyBsaXRlcmFsIGFwcGVhcmluZyBhcyB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHRoZSBmdW5jdGlvblxuICAgIGJvZHkgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgZnVuY3Rpb25cJ3MgYGBfX2RvY19fYGAgYXR0cmlidXRlIGFuZFxuICAgIHRoZXJlZm9yZSB0aGUgZnVuY3Rpb25cJ3MgKmRvY3N0cmluZyouXG5cbls0XSBBIHN0cmluZyBsaXRlcmFsIGFwcGVhcmluZyBhcyB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHRoZSBjbGFzc1xuICAgIGJvZHkgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgbmFtZXNwYWNlXCdzIGBgX19kb2NfX2BgIGl0ZW0gYW5kXG4gICAgdGhlcmVmb3JlIHRoZSBjbGFzc1wncyAqZG9jc3RyaW5nKi5cbicsCi0gJ2NvbnRleHQtbWFuYWdlcnMnOiB1J1xuV2l0aCBTdGF0ZW1lbnQgQ29udGV4dCBNYW5hZ2Vyc1xuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5OZXcgaW4gdmVyc2lvbiAyLjUuXG5cbkEgKmNvbnRleHQgbWFuYWdlciogaXMgYW4gb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgcnVudGltZSBjb250ZXh0IHRvXG5iZSBlc3RhYmxpc2hlZCB3aGVuIGV4ZWN1dGluZyBhIGBgd2l0aGBgIHN0YXRlbWVudC4gVGhlIGNvbnRleHRcbm1hbmFnZXIgaGFuZGxlcyB0aGUgZW50cnkgaW50bywgYW5kIHRoZSBleGl0IGZyb20sIHRoZSBkZXNpcmVkIHJ1bnRpbWVcbmNvbnRleHQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJsb2NrIG9mIGNvZGUuICBDb250ZXh0IG1hbmFnZXJzIGFyZVxubm9ybWFsbHkgaW52b2tlZCB1c2luZyB0aGUgYGB3aXRoYGAgc3RhdGVtZW50IChkZXNjcmliZWQgaW4gc2VjdGlvblxuKlRoZSB3aXRoIHN0YXRlbWVudCopLCBidXQgY2FuIGFsc28gYmUgdXNlZCBieSBkaXJlY3RseSBpbnZva2luZyB0aGVpclxubWV0aG9kcy5cblxuVHlwaWNhbCB1c2VzIG9mIGNvbnRleHQgbWFuYWdlcnMgaW5jbHVkZSBzYXZpbmcgYW5kIHJlc3RvcmluZyB2YXJpb3VzXG5raW5kcyBvZiBnbG9iYWwgc3RhdGUsIGxvY2tpbmcgYW5kIHVubG9ja2luZyByZXNvdXJjZXMsIGNsb3Npbmcgb3BlbmVkXG5maWxlcywgZXRjLlxuXG5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBjb250ZXh0IG1hbmFnZXJzLCBzZWUgKkNvbnRleHQgTWFuYWdlciBUeXBlcyouXG5cbm9iamVjdC5fX2VudGVyX18oc2VsZilcblxuICAgRW50ZXIgdGhlIHJ1bnRpbWUgY29udGV4dCByZWxhdGVkIHRvIHRoaXMgb2JqZWN0LiBUaGUgYGB3aXRoYGBcbiAgIHN0YXRlbWVudCB3aWxsIGJpbmQgdGhpcyBtZXRob2RcJ3MgcmV0dXJuIHZhbHVlIHRvIHRoZSB0YXJnZXQocylcbiAgIHNwZWNpZmllZCBpbiB0aGUgYGBhc2BgIGNsYXVzZSBvZiB0aGUgc3RhdGVtZW50LCBpZiBhbnkuXG5cbm9iamVjdC5fX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2spXG5cbiAgIEV4aXQgdGhlIHJ1bnRpbWUgY29udGV4dCByZWxhdGVkIHRvIHRoaXMgb2JqZWN0LiBUaGUgcGFyYW1ldGVyc1xuICAgZGVzY3JpYmUgdGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGUgY29udGV4dCB0byBiZSBleGl0ZWQuIElmIHRoZVxuICAgY29udGV4dCB3YXMgZXhpdGVkIHdpdGhvdXQgYW4gZXhjZXB0aW9uLCBhbGwgdGhyZWUgYXJndW1lbnRzIHdpbGxcbiAgIGJlIGBgTm9uZWBgLlxuXG4gICBJZiBhbiBleGNlcHRpb24gaXMgc3VwcGxpZWQsIGFuZCB0aGUgbWV0aG9kIHdpc2hlcyB0byBzdXBwcmVzcyB0aGVcbiAgIGV4Y2VwdGlvbiAoaS5lLiwgcHJldmVudCBpdCBmcm9tIGJlaW5nIHByb3BhZ2F0ZWQpLCBpdCBzaG91bGRcbiAgIHJldHVybiBhIHRydWUgdmFsdWUuIE90aGVyd2lzZSwgdGhlIGV4Y2VwdGlvbiB3aWxsIGJlIHByb2Nlc3NlZFxuICAgbm9ybWFsbHkgdXBvbiBleGl0IGZyb20gdGhpcyBtZXRob2QuXG5cbiAgIE5vdGUgdGhhdCBgYF9fZXhpdF9fKClgYCBtZXRob2RzIHNob3VsZCBub3QgcmVyYWlzZSB0aGUgcGFzc2VkLWluXG4gICBleGNlcHRpb247IHRoaXMgaXMgdGhlIGNhbGxlclwncyByZXNwb25zaWJpbGl0eS5cblxuU2VlIGFsc286XG5cbiAgICoqUEVQIDAzNDMqKiAtIFRoZSAid2l0aCIgc3RhdGVtZW50XG4gICAgICBUaGUgc3BlY2lmaWNhdGlvbiwgYmFja2dyb3VuZCwgYW5kIGV4YW1wbGVzIGZvciB0aGUgUHl0aG9uXG4gICAgICBgYHdpdGhgYCBzdGF0ZW1lbnQuXG4nLAotICdjb250aW51ZSc6IHUnXG5UaGUgYGBjb250aW51ZWBgIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuICAgY29udGludWVfc3RtdCA6Oj0gImNvbnRpbnVlIlxuXG5gYGNvbnRpbnVlYGAgbWF5IG9ubHkgb2NjdXIgc3ludGFjdGljYWxseSBuZXN0ZWQgaW4gYSBgYGZvcmBgIG9yXG5gYHdoaWxlYGAgbG9vcCwgYnV0IG5vdCBuZXN0ZWQgaW4gYSBmdW5jdGlvbiBvciBjbGFzcyBkZWZpbml0aW9uIG9yXG5gYGZpbmFsbHlgYCBjbGF1c2Ugd2l0aGluIHRoYXQgbG9vcC4gIEl0IGNvbnRpbnVlcyB3aXRoIHRoZSBuZXh0IGN5Y2xlXG5vZiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbG9vcC5cblxuV2hlbiBgYGNvbnRpbnVlYGAgcGFzc2VzIGNvbnRyb2wgb3V0IG9mIGEgYGB0cnlgYCBzdGF0ZW1lbnQgd2l0aCBhXG5gYGZpbmFsbHlgYCBjbGF1c2UsIHRoYXQgYGBmaW5hbGx5YGAgY2xhdXNlIGlzIGV4ZWN1dGVkIGJlZm9yZSByZWFsbHlcbnN0YXJ0aW5nIHRoZSBuZXh0IGxvb3AgY3ljbGUuXG4nLAotICdjb252ZXJzaW9ucyc6IHUnXG5Bcml0aG1ldGljIGNvbnZlcnNpb25zXG4qKioqKioqKioqKioqKioqKioqKioqXG5cbldoZW4gYSBkZXNjcmlwdGlvbiBvZiBhbiBhcml0aG1ldGljIG9wZXJhdG9yIGJlbG93IHVzZXMgdGhlIHBocmFzZVxuInRoZSBudW1lcmljIGFyZ3VtZW50cyBhcmUgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUsIiB0aGUgYXJndW1lbnRzXG5hcmUgY29lcmNlZCB1c2luZyB0aGUgY29lcmNpb24gcnVsZXMgbGlzdGVkIGF0ICAqQ29lcmNpb24gcnVsZXMqLiAgSWZcbmJvdGggYXJndW1lbnRzIGFyZSBzdGFuZGFyZCBudW1lcmljIHR5cGVzLCB0aGUgZm9sbG93aW5nIGNvZXJjaW9ucyBhcmVcbmFwcGxpZWQ6XG5cbiogSWYgZWl0aGVyIGFyZ3VtZW50IGlzIGEgY29tcGxleCBudW1iZXIsIHRoZSBvdGhlciBpcyBjb252ZXJ0ZWQgdG9cbiAgY29tcGxleDtcblxuKiBvdGhlcndpc2UsIGlmIGVpdGhlciBhcmd1bWVudCBpcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciwgdGhlIG90aGVyXG4gIGlzIGNvbnZlcnRlZCB0byBmbG9hdGluZyBwb2ludDtcblxuKiBvdGhlcndpc2UsIGlmIGVpdGhlciBhcmd1bWVudCBpcyBhIGxvbmcgaW50ZWdlciwgdGhlIG90aGVyIGlzXG4gIGNvbnZlcnRlZCB0byBsb25nIGludGVnZXI7XG5cbiogb3RoZXJ3aXNlLCBib3RoIG11c3QgYmUgcGxhaW4gaW50ZWdlcnMgYW5kIG5vIGNvbnZlcnNpb24gaXNcbiAgbmVjZXNzYXJ5LlxuXG5Tb21lIGFkZGl0aW9uYWwgcnVsZXMgYXBwbHkgZm9yIGNlcnRhaW4gb3BlcmF0b3JzIChlLmcuLCBhIHN0cmluZyBsZWZ0XG5hcmd1bWVudCB0byB0aGUgXCclXCcgb3BlcmF0b3IpLiBFeHRlbnNpb25zIGNhbiBkZWZpbmUgdGhlaXIgb3duXG5jb2VyY2lvbnMuXG4nLAotICdjdXN0b21pemF0aW9uJzogdSdcbkJhc2ljIGN1c3RvbWl6YXRpb25cbioqKioqKioqKioqKioqKioqKipcblxub2JqZWN0Ll9fbmV3X18oY2xzWywgLi4uXSlcblxuICAgQ2FsbGVkIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBjbGFzcyAqY2xzKi4gIGBgX19uZXdfXygpYGAgaXMgYVxuICAgc3RhdGljIG1ldGhvZCAoc3BlY2lhbC1jYXNlZCBzbyB5b3UgbmVlZCBub3QgZGVjbGFyZSBpdCBhcyBzdWNoKVxuICAgdGhhdCB0YWtlcyB0aGUgY2xhc3Mgb2Ygd2hpY2ggYW4gaW5zdGFuY2Ugd2FzIHJlcXVlc3RlZCBhcyBpdHNcbiAgIGZpcnN0IGFyZ3VtZW50LiAgVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRob3NlIHBhc3NlZCB0byB0aGVcbiAgIG9iamVjdCBjb25zdHJ1Y3RvciBleHByZXNzaW9uICh0aGUgY2FsbCB0byB0aGUgY2xhc3MpLiAgVGhlIHJldHVyblxuICAgdmFsdWUgb2YgYGBfX25ld19fKClgYCBzaG91bGQgYmUgdGhlIG5ldyBvYmplY3QgaW5zdGFuY2UgKHVzdWFsbHlcbiAgIGFuIGluc3RhbmNlIG9mICpjbHMqKS5cblxuICAgVHlwaWNhbCBpbXBsZW1lbnRhdGlvbnMgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcyBieVxuICAgaW52b2tpbmcgdGhlIHN1cGVyY2xhc3NcJ3MgYGBfX25ld19fKClgYCBtZXRob2QgdXNpbmdcbiAgIGBgc3VwZXIoY3VycmVudGNsYXNzLCBjbHMpLl9fbmV3X18oY2xzWywgLi4uXSlgYCB3aXRoIGFwcHJvcHJpYXRlXG4gICBhcmd1bWVudHMgYW5kIHRoZW4gbW9kaWZ5aW5nIHRoZSBuZXdseS1jcmVhdGVkIGluc3RhbmNlIGFzXG4gICBuZWNlc3NhcnkgYmVmb3JlIHJldHVybmluZyBpdC5cblxuICAgSWYgYGBfX25ld19fKClgYCByZXR1cm5zIGFuIGluc3RhbmNlIG9mICpjbHMqLCB0aGVuIHRoZSBuZXdcbiAgIGluc3RhbmNlXCdzIGBgX19pbml0X18oKWBgIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgbGlrZVxuICAgYGBfX2luaXRfXyhzZWxmWywgLi4uXSlgYCwgd2hlcmUgKnNlbGYqIGlzIHRoZSBuZXcgaW5zdGFuY2UgYW5kIHRoZVxuICAgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgd2VyZSBwYXNzZWQgdG8gYGBfX25ld19fKClgYC5cblxuICAgSWYgYGBfX25ld19fKClgYCBkb2VzIG5vdCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgKmNscyosIHRoZW4gdGhlIG5ld1xuICAgaW5zdGFuY2VcJ3MgYGBfX2luaXRfXygpYGAgbWV0aG9kIHdpbGwgbm90IGJlIGludm9rZWQuXG5cbiAgIGBgX19uZXdfXygpYGAgaXMgaW50ZW5kZWQgbWFpbmx5IHRvIGFsbG93IHN1YmNsYXNzZXMgb2YgaW1tdXRhYmxlXG4gICB0eXBlcyAobGlrZSBpbnQsIHN0ciwgb3IgdHVwbGUpIHRvIGN1c3RvbWl6ZSBpbnN0YW5jZSBjcmVhdGlvbi4gIEl0XG4gICBpcyBhbHNvIGNvbW1vbmx5IG92ZXJyaWRkZW4gaW4gY3VzdG9tIG1ldGFjbGFzc2VzIGluIG9yZGVyIHRvXG4gICBjdXN0b21pemUgY2xhc3MgY3JlYXRpb24uXG5cbm9iamVjdC5fX2luaXRfXyhzZWxmWywgLi4uXSlcblxuICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzIGNyZWF0ZWQuICBUaGUgYXJndW1lbnRzIGFyZSB0aG9zZVxuICAgcGFzc2VkIHRvIHRoZSBjbGFzcyBjb25zdHJ1Y3RvciBleHByZXNzaW9uLiAgSWYgYSBiYXNlIGNsYXNzIGhhcyBhblxuICAgYGBfX2luaXRfXygpYGAgbWV0aG9kLCB0aGUgZGVyaXZlZCBjbGFzc1wncyBgYF9faW5pdF9fKClgYCBtZXRob2QsXG4gICBpZiBhbnksIG11c3QgZXhwbGljaXRseSBjYWxsIGl0IHRvIGVuc3VyZSBwcm9wZXIgaW5pdGlhbGl6YXRpb24gb2ZcbiAgIHRoZSBiYXNlIGNsYXNzIHBhcnQgb2YgdGhlIGluc3RhbmNlOyBmb3IgZXhhbXBsZTpcbiAgIGBgQmFzZUNsYXNzLl9faW5pdF9fKHNlbGYsIFthcmdzLi4uXSlgYC4gIEFzIGEgc3BlY2lhbCBjb25zdHJhaW50XG4gICBvbiBjb25zdHJ1Y3RvcnMsIG5vIHZhbHVlIG1heSBiZSByZXR1cm5lZDsgZG9pbmcgc28gd2lsbCBjYXVzZSBhXG4gICBgYFR5cGVFcnJvcmBgIHRvIGJlIHJhaXNlZCBhdCBydW50aW1lLlxuXG5vYmplY3QuX19kZWxfXyhzZWxmKVxuXG4gICBDYWxsZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgYWJvdXQgdG8gYmUgZGVzdHJveWVkLiAgVGhpcyBpcyBhbHNvXG4gICBjYWxsZWQgYSBkZXN0cnVjdG9yLiAgSWYgYSBiYXNlIGNsYXNzIGhhcyBhIGBgX19kZWxfXygpYGAgbWV0aG9kLFxuICAgdGhlIGRlcml2ZWQgY2xhc3NcJ3MgYGBfX2RlbF9fKClgYCBtZXRob2QsIGlmIGFueSwgbXVzdCBleHBsaWNpdGx5XG4gICBjYWxsIGl0IHRvIGVuc3VyZSBwcm9wZXIgZGVsZXRpb24gb2YgdGhlIGJhc2UgY2xhc3MgcGFydCBvZiB0aGVcbiAgIGluc3RhbmNlLiAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlICh0aG91Z2ggbm90IHJlY29tbWVuZGVkISkgZm9yXG4gICB0aGUgYGBfX2RlbF9fKClgYCBtZXRob2QgdG8gcG9zdHBvbmUgZGVzdHJ1Y3Rpb24gb2YgdGhlIGluc3RhbmNlIGJ5XG4gICBjcmVhdGluZyBhIG5ldyByZWZlcmVuY2UgdG8gaXQuICBJdCBtYXkgdGhlbiBiZSBjYWxsZWQgYXQgYSBsYXRlclxuICAgdGltZSB3aGVuIHRoaXMgbmV3IHJlZmVyZW5jZSBpcyBkZWxldGVkLiAgSXQgaXMgbm90IGd1YXJhbnRlZWQgdGhhdFxuICAgYGBfX2RlbF9fKClgYCBtZXRob2RzIGFyZSBjYWxsZWQgZm9yIG9iamVjdHMgdGhhdCBzdGlsbCBleGlzdCB3aGVuXG4gICB0aGUgaW50ZXJwcmV0ZXIgZXhpdHMuXG5cbiAgIE5vdGU6IGBgZGVsIHhgYCBkb2VzblwndCBkaXJlY3RseSBjYWxsIGBgeC5fX2RlbF9fKClgYCAtLS0gdGhlIGZvcm1lclxuICAgICBkZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgZm9yIGBgeGBgIGJ5IG9uZSwgYW5kIHRoZSBsYXR0ZXJcbiAgICAgaXMgb25seSBjYWxsZWQgd2hlbiBgYHhgYFwncyByZWZlcmVuY2UgY291bnQgcmVhY2hlcyB6ZXJvLiAgU29tZVxuICAgICBjb21tb24gc2l0dWF0aW9ucyB0aGF0IG1heSBwcmV2ZW50IHRoZSByZWZlcmVuY2UgY291bnQgb2YgYW5cbiAgICAgb2JqZWN0IGZyb20gZ29pbmcgdG8gemVybyBpbmNsdWRlOiBjaXJjdWxhciByZWZlcmVuY2VzIGJldHdlZW5cbiAgICAgb2JqZWN0cyAoZS5nLiwgYSBkb3VibHktbGlua2VkIGxpc3Qgb3IgYSB0cmVlIGRhdGEgc3RydWN0dXJlIHdpdGhcbiAgICAgcGFyZW50IGFuZCBjaGlsZCBwb2ludGVycyk7IGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3Qgb24gdGhlXG4gICAgIHN0YWNrIGZyYW1lIG9mIGEgZnVuY3Rpb24gdGhhdCBjYXVnaHQgYW4gZXhjZXB0aW9uICh0aGUgdHJhY2ViYWNrXG4gICAgIHN0b3JlZCBpbiBgYHN5cy5leGNfdHJhY2ViYWNrYGAga2VlcHMgdGhlIHN0YWNrIGZyYW1lIGFsaXZlKTsgb3JcbiAgICAgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBvbiB0aGUgc3RhY2sgZnJhbWUgdGhhdCByYWlzZWQgYW5cbiAgICAgdW5oYW5kbGVkIGV4Y2VwdGlvbiBpbiBpbnRlcmFjdGl2ZSBtb2RlICh0aGUgdHJhY2ViYWNrIHN0b3JlZCBpblxuICAgICBgYHN5cy5sYXN0X3RyYWNlYmFja2BgIGtlZXBzIHRoZSBzdGFjayBmcmFtZSBhbGl2ZSkuICBUaGUgZmlyc3RcbiAgICAgc2l0dWF0aW9uIGNhbiBvbmx5IGJlIHJlbWVkaWVkIGJ5IGV4cGxpY2l0bHkgYnJlYWtpbmcgdGhlIGN5Y2xlcztcbiAgICAgdGhlIGxhdHRlciB0d28gc2l0dWF0aW9ucyBjYW4gYmUgcmVzb2x2ZWQgYnkgc3RvcmluZyBgYE5vbmVgYCBpblxuICAgICBgYHN5cy5leGNfdHJhY2ViYWNrYGAgb3IgYGBzeXMubGFzdF90cmFjZWJhY2tgYC4gIENpcmN1bGFyXG4gICAgIHJlZmVyZW5jZXMgd2hpY2ggYXJlIGdhcmJhZ2UgYXJlIGRldGVjdGVkIHdoZW4gdGhlIG9wdGlvbiBjeWNsZVxuICAgICBkZXRlY3RvciBpcyBlbmFibGVkIChpdFwncyBvbiBieSBkZWZhdWx0KSwgYnV0IGNhbiBvbmx5IGJlIGNsZWFuZWRcbiAgICAgdXAgaWYgdGhlcmUgYXJlIG5vIFB5dGhvbi1sZXZlbCBgYF9fZGVsX18oKWBgIG1ldGhvZHMgaW52b2x2ZWQuXG4gICAgIFJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgYGBnY2BgIG1vZHVsZSBmb3IgbW9yZVxuICAgICBpbmZvcm1hdGlvbiBhYm91dCBob3cgYGBfX2RlbF9fKClgYCBtZXRob2RzIGFyZSBoYW5kbGVkIGJ5IHRoZVxuICAgICBjeWNsZSBkZXRlY3RvciwgcGFydGljdWxhcmx5IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYGBnYXJiYWdlYGBcbiAgICAgdmFsdWUuXG5cbiAgIFdhcm5pbmc6IER1ZSB0byB0aGUgcHJlY2FyaW91cyBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoIGBgX19kZWxfXygpYGBcbiAgICAgbWV0aG9kcyBhcmUgaW52b2tlZCwgZXhjZXB0aW9ucyB0aGF0IG9jY3VyIGR1cmluZyB0aGVpciBleGVjdXRpb25cbiAgICAgYXJlIGlnbm9yZWQsIGFuZCBhIHdhcm5pbmcgaXMgcHJpbnRlZCB0byBgYHN5cy5zdGRlcnJgYCBpbnN0ZWFkLlxuICAgICBBbHNvLCB3aGVuIGBgX19kZWxfXygpYGAgaXMgaW52b2tlZCBpbiByZXNwb25zZSB0byBhIG1vZHVsZSBiZWluZ1xuICAgICBkZWxldGVkIChlLmcuLCB3aGVuIGV4ZWN1dGlvbiBvZiB0aGUgcHJvZ3JhbSBpcyBkb25lKSwgb3RoZXJcbiAgICAgZ2xvYmFscyByZWZlcmVuY2VkIGJ5IHRoZSBgYF9fZGVsX18oKWBgIG1ldGhvZCBtYXkgYWxyZWFkeSBoYXZlXG4gICAgIGJlZW4gZGVsZXRlZCBvciBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyB0b3JuIGRvd24gKGUuZy4gdGhlXG4gICAgIGltcG9ydCBtYWNoaW5lcnkgc2h1dHRpbmcgZG93bikuICBGb3IgdGhpcyByZWFzb24sIGBgX19kZWxfXygpYGBcbiAgICAgbWV0aG9kcyBzaG91bGQgZG8gdGhlIGFic29sdXRlIG1pbmltdW0gbmVlZGVkIHRvIG1haW50YWluXG4gICAgIGV4dGVybmFsIGludmFyaWFudHMuICBTdGFydGluZyB3aXRoIHZlcnNpb24gMS41LCBQeXRob25cbiAgICAgZ3VhcmFudGVlcyB0aGF0IGdsb2JhbHMgd2hvc2UgbmFtZSBiZWdpbnMgd2l0aCBhIHNpbmdsZVxuICAgICB1bmRlcnNjb3JlIGFyZSBkZWxldGVkIGZyb20gdGhlaXIgbW9kdWxlIGJlZm9yZSBvdGhlciBnbG9iYWxzIGFyZVxuICAgICBkZWxldGVkOyBpZiBubyBvdGhlciByZWZlcmVuY2VzIHRvIHN1Y2ggZ2xvYmFscyBleGlzdCwgdGhpcyBtYXlcbiAgICAgaGVscCBpbiBhc3N1cmluZyB0aGF0IGltcG9ydGVkIG1vZHVsZXMgYXJlIHN0aWxsIGF2YWlsYWJsZSBhdCB0aGVcbiAgICAgdGltZSB3aGVuIHRoZSBgYF9fZGVsX18oKWBgIG1ldGhvZCBpcyBjYWxsZWQuXG5cbm9iamVjdC5fX3JlcHJfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgdGhlIGBgcmVwcigpYGAgYnVpbHQtaW4gZnVuY3Rpb24gYW5kIGJ5IHN0cmluZ1xuICAgY29udmVyc2lvbnMgKHJldmVyc2UgcXVvdGVzKSB0byBjb21wdXRlIHRoZSAib2ZmaWNpYWwiIHN0cmluZ1xuICAgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiAgSWYgYXQgYWxsIHBvc3NpYmxlLCB0aGlzIHNob3VsZCBsb29rXG4gICBsaWtlIGEgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb24gdGhhdCBjb3VsZCBiZSB1c2VkIHRvIHJlY3JlYXRlIGFuXG4gICBvYmplY3Qgd2l0aCB0aGUgc2FtZSB2YWx1ZSAoZ2l2ZW4gYW4gYXBwcm9wcmlhdGUgZW52aXJvbm1lbnQpLiAgSWZcbiAgIHRoaXMgaXMgbm90IHBvc3NpYmxlLCBhIHN0cmluZyBvZiB0aGUgZm9ybSBgYDwuLi5zb21lIHVzZWZ1bFxuICAgZGVzY3JpcHRpb24uLi4+YGAgc2hvdWxkIGJlIHJldHVybmVkLiAgVGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIGFcbiAgIHN0cmluZyBvYmplY3QuIElmIGEgY2xhc3MgZGVmaW5lcyBgYF9fcmVwcl9fKClgYCBidXQgbm90XG4gICBgYF9fc3RyX18oKWBgLCB0aGVuIGBgX19yZXByX18oKWBgIGlzIGFsc28gdXNlZCB3aGVuIGFuICJpbmZvcm1hbCJcbiAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBpbnN0YW5jZXMgb2YgdGhhdCBjbGFzcyBpcyByZXF1aXJlZC5cblxuICAgVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgZGVidWdnaW5nLCBzbyBpdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGVcbiAgIHJlcHJlc2VudGF0aW9uIGlzIGluZm9ybWF0aW9uLXJpY2ggYW5kIHVuYW1iaWd1b3VzLlxuXG5vYmplY3QuX19zdHJfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgdGhlIGBgc3RyKClgYCBidWlsdC1pbiBmdW5jdGlvbiBhbmQgYnkgdGhlIGBgcHJpbnRgYFxuICAgc3RhdGVtZW50IHRvIGNvbXB1dGUgdGhlICJpbmZvcm1hbCIgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuXG4gICBvYmplY3QuICBUaGlzIGRpZmZlcnMgZnJvbSBgYF9fcmVwcl9fKClgYCBpbiB0aGF0IGl0IGRvZXMgbm90IGhhdmVcbiAgIHRvIGJlIGEgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb246IGEgbW9yZSBjb252ZW5pZW50IG9yIGNvbmNpc2VcbiAgIHJlcHJlc2VudGF0aW9uIG1heSBiZSB1c2VkIGluc3RlYWQuIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBhXG4gICBzdHJpbmcgb2JqZWN0LlxuXG5vYmplY3QuX19sdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fbGVfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2VxX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19uZV9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZ3RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2dlX18oc2VsZiwgb3RoZXIpXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDIuMS5cblxuICAgVGhlc2UgYXJlIHRoZSBzby1jYWxsZWQgInJpY2ggY29tcGFyaXNvbiIgbWV0aG9kcywgYW5kIGFyZSBjYWxsZWRcbiAgIGZvciBjb21wYXJpc29uIG9wZXJhdG9ycyBpbiBwcmVmZXJlbmNlIHRvIGBgX19jbXBfXygpYGAgYmVsb3cuIFRoZVxuICAgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBvcGVyYXRvciBzeW1ib2xzIGFuZCBtZXRob2QgbmFtZXMgaXMgYXNcbiAgIGZvbGxvd3M6IGBgeDx5YGAgY2FsbHMgYGB4Ll9fbHRfXyh5KWBgLCBgYHg8PXlgYCBjYWxsc1xuICAgYGB4Ll9fbGVfXyh5KWBgLCBgYHg9PXlgYCBjYWxscyBgYHguX19lcV9fKHkpYGAsIGBgeCE9eWBgIGFuZFxuICAgYGB4PD55YGAgY2FsbCBgYHguX19uZV9fKHkpYGAsIGBgeD55YGAgY2FsbHMgYGB4Ll9fZ3RfXyh5KWBgLCBhbmRcbiAgIGBgeD49eWBgIGNhbGxzIGBgeC5fX2dlX18oeSlgYC5cblxuICAgQSByaWNoIGNvbXBhcmlzb24gbWV0aG9kIG1heSByZXR1cm4gdGhlIHNpbmdsZXRvblxuICAgYGBOb3RJbXBsZW1lbnRlZGBgIGlmIGl0IGRvZXMgbm90IGltcGxlbWVudCB0aGUgb3BlcmF0aW9uIGZvciBhXG4gICBnaXZlbiBwYWlyIG9mIGFyZ3VtZW50cy4gQnkgY29udmVudGlvbiwgYGBGYWxzZWBgIGFuZCBgYFRydWVgYCBhcmVcbiAgIHJldHVybmVkIGZvciBhIHN1Y2Nlc3NmdWwgY29tcGFyaXNvbi4gSG93ZXZlciwgdGhlc2UgbWV0aG9kcyBjYW5cbiAgIHJldHVybiBhbnkgdmFsdWUsIHNvIGlmIHRoZSBjb21wYXJpc29uIG9wZXJhdG9yIGlzIHVzZWQgaW4gYVxuICAgQm9vbGVhbiBjb250ZXh0IChlLmcuLCBpbiB0aGUgY29uZGl0aW9uIG9mIGFuIGBgaWZgYCBzdGF0ZW1lbnQpLFxuICAgUHl0aG9uIHdpbGwgY2FsbCBgYGJvb2woKWBgIG9uIHRoZSB2YWx1ZSB0byBkZXRlcm1pbmUgaWYgdGhlIHJlc3VsdFxuICAgaXMgdHJ1ZSBvciBmYWxzZS5cblxuICAgVGhlcmUgYXJlIG5vIGltcGxpZWQgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGUgY29tcGFyaXNvbiBvcGVyYXRvcnMuXG4gICBUaGUgdHJ1dGggb2YgYGB4PT15YGAgZG9lcyBub3QgaW1wbHkgdGhhdCBgYHghPXlgYCBpcyBmYWxzZS5cbiAgIEFjY29yZGluZ2x5LCB3aGVuIGRlZmluaW5nIGBgX19lcV9fKClgYCwgb25lIHNob3VsZCBhbHNvIGRlZmluZVxuICAgYGBfX25lX18oKWBgIHNvIHRoYXQgdGhlIG9wZXJhdG9ycyB3aWxsIGJlaGF2ZSBhcyBleHBlY3RlZC4gIFNlZVxuICAgdGhlIHBhcmFncmFwaCBvbiBgYF9faGFzaF9fKClgYCBmb3Igc29tZSBpbXBvcnRhbnQgbm90ZXMgb25cbiAgIGNyZWF0aW5nICpoYXNoYWJsZSogb2JqZWN0cyB3aGljaCBzdXBwb3J0IGN1c3RvbSBjb21wYXJpc29uXG4gICBvcGVyYXRpb25zIGFuZCBhcmUgdXNhYmxlIGFzIGRpY3Rpb25hcnkga2V5cy5cblxuICAgVGhlcmUgYXJlIG5vIHN3YXBwZWQtYXJndW1lbnQgdmVyc2lvbnMgb2YgdGhlc2UgbWV0aG9kcyAodG8gYmUgdXNlZFxuICAgd2hlbiB0aGUgbGVmdCBhcmd1bWVudCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gYnV0IHRoZSByaWdodFxuICAgYXJndW1lbnQgZG9lcyk7IHJhdGhlciwgYGBfX2x0X18oKWBgIGFuZCBgYF9fZ3RfXygpYGAgYXJlIGVhY2hcbiAgIG90aGVyXCdzIHJlZmxlY3Rpb24sIGBgX19sZV9fKClgYCBhbmQgYGBfX2dlX18oKWBgIGFyZSBlYWNoIG90aGVyXCdzXG4gICByZWZsZWN0aW9uLCBhbmQgYGBfX2VxX18oKWBgIGFuZCBgYF9fbmVfXygpYGAgYXJlIHRoZWlyIG93blxuICAgcmVmbGVjdGlvbi5cblxuICAgQXJndW1lbnRzIHRvIHJpY2ggY29tcGFyaXNvbiBtZXRob2RzIGFyZSBuZXZlciBjb2VyY2VkLlxuXG4gICBUbyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIG9yZGVyaW5nIG9wZXJhdGlvbnMgZnJvbSBhIHNpbmdsZSByb290XG4gICBvcGVyYXRpb24sIHNlZSBgYGZ1bmN0b29scy50b3RhbF9vcmRlcmluZygpYGAuXG5cbm9iamVjdC5fX2NtcF9fKHNlbGYsIG90aGVyKVxuXG4gICBDYWxsZWQgYnkgY29tcGFyaXNvbiBvcGVyYXRpb25zIGlmIHJpY2ggY29tcGFyaXNvbiAoc2VlIGFib3ZlKSBpc1xuICAgbm90IGRlZmluZWQuICBTaG91bGQgcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciBpZiBgYHNlbGYgPCBvdGhlcmBgLFxuICAgemVybyBpZiBgYHNlbGYgPT0gb3RoZXJgYCwgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIGBgc2VsZiA+IG90aGVyYGAuXG4gICBJZiBubyBgYF9fY21wX18oKWBgLCBgYF9fZXFfXygpYGAgb3IgYGBfX25lX18oKWBgIG9wZXJhdGlvbiBpc1xuICAgZGVmaW5lZCwgY2xhc3MgaW5zdGFuY2VzIGFyZSBjb21wYXJlZCBieSBvYmplY3QgaWRlbnRpdHlcbiAgICgiYWRkcmVzcyIpLiAgU2VlIGFsc28gdGhlIGRlc2NyaXB0aW9uIG9mIGBgX19oYXNoX18oKWBgIGZvciBzb21lXG4gICBpbXBvcnRhbnQgbm90ZXMgb24gY3JlYXRpbmcgKmhhc2hhYmxlKiBvYmplY3RzIHdoaWNoIHN1cHBvcnQgY3VzdG9tXG4gICBjb21wYXJpc29uIG9wZXJhdGlvbnMgYW5kIGFyZSB1c2FibGUgYXMgZGljdGlvbmFyeSBrZXlzLiAoTm90ZTogdGhlXG4gICByZXN0cmljdGlvbiB0aGF0IGV4Y2VwdGlvbnMgYXJlIG5vdCBwcm9wYWdhdGVkIGJ5IGBgX19jbXBfXygpYGAgaGFzXG4gICBiZWVuIHJlbW92ZWQgc2luY2UgUHl0aG9uIDEuNS4pXG5cbm9iamVjdC5fX3JjbXBfXyhzZWxmLCBvdGhlcilcblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMTogTm8gbG9uZ2VyIHN1cHBvcnRlZC5cblxub2JqZWN0Ll9faGFzaF9fKHNlbGYpXG5cbiAgIENhbGxlZCBieSBidWlsdC1pbiBmdW5jdGlvbiBgYGhhc2goKWBgIGFuZCBmb3Igb3BlcmF0aW9ucyBvblxuICAgbWVtYmVycyBvZiBoYXNoZWQgY29sbGVjdGlvbnMgaW5jbHVkaW5nIGBgc2V0YGAsIGBgZnJvemVuc2V0YGAsIGFuZFxuICAgYGBkaWN0YGAuICBgYF9faGFzaF9fKClgYCBzaG91bGQgcmV0dXJuIGFuIGludGVnZXIuICBUaGUgb25seVxuICAgcmVxdWlyZWQgcHJvcGVydHkgaXMgdGhhdCBvYmplY3RzIHdoaWNoIGNvbXBhcmUgZXF1YWwgaGF2ZSB0aGUgc2FtZVxuICAgaGFzaCB2YWx1ZTsgaXQgaXMgYWR2aXNlZCB0byBzb21laG93IG1peCB0b2dldGhlciAoZS5nLiB1c2luZ1xuICAgZXhjbHVzaXZlIG9yKSB0aGUgaGFzaCB2YWx1ZXMgZm9yIHRoZSBjb21wb25lbnRzIG9mIHRoZSBvYmplY3QgdGhhdFxuICAgYWxzbyBwbGF5IGEgcGFydCBpbiBjb21wYXJpc29uIG9mIG9iamVjdHMuXG5cbiAgIElmIGEgY2xhc3MgZG9lcyBub3QgZGVmaW5lIGEgYGBfX2NtcF9fKClgYCBvciBgYF9fZXFfXygpYGAgbWV0aG9kXG4gICBpdCBzaG91bGQgbm90IGRlZmluZSBhIGBgX19oYXNoX18oKWBgIG9wZXJhdGlvbiBlaXRoZXI7IGlmIGl0XG4gICBkZWZpbmVzIGBgX19jbXBfXygpYGAgb3IgYGBfX2VxX18oKWBgIGJ1dCBub3QgYGBfX2hhc2hfXygpYGAsIGl0c1xuICAgaW5zdGFuY2VzIHdpbGwgbm90IGJlIHVzYWJsZSBpbiBoYXNoZWQgY29sbGVjdGlvbnMuICBJZiBhIGNsYXNzXG4gICBkZWZpbmVzIG11dGFibGUgb2JqZWN0cyBhbmQgaW1wbGVtZW50cyBhIGBgX19jbXBfXygpYGAgb3JcbiAgIGBgX19lcV9fKClgYCBtZXRob2QsIGl0IHNob3VsZCBub3QgaW1wbGVtZW50IGBgX19oYXNoX18oKWBgLCBzaW5jZVxuICAgaGFzaGFibGUgY29sbGVjdGlvbiBpbXBsZW1lbnRhdGlvbnMgcmVxdWlyZSB0aGF0IGEgb2JqZWN0XCdzIGhhc2hcbiAgIHZhbHVlIGlzIGltbXV0YWJsZSAoaWYgdGhlIG9iamVjdFwncyBoYXNoIHZhbHVlIGNoYW5nZXMsIGl0IHdpbGwgYmVcbiAgIGluIHRoZSB3cm9uZyBoYXNoIGJ1Y2tldCkuXG5cbiAgIFVzZXItZGVmaW5lZCBjbGFzc2VzIGhhdmUgYGBfX2NtcF9fKClgYCBhbmQgYGBfX2hhc2hfXygpYGAgbWV0aG9kc1xuICAgYnkgZGVmYXVsdDsgd2l0aCB0aGVtLCBhbGwgb2JqZWN0cyBjb21wYXJlIHVuZXF1YWwgKGV4Y2VwdCB3aXRoXG4gICB0aGVtc2VsdmVzKSBhbmQgYGB4Ll9faGFzaF9fKClgYCByZXR1cm5zIGBgaWQoeClgYC5cblxuICAgQ2xhc3NlcyB3aGljaCBpbmhlcml0IGEgYGBfX2hhc2hfXygpYGAgbWV0aG9kIGZyb20gYSBwYXJlbnQgY2xhc3NcbiAgIGJ1dCBjaGFuZ2UgdGhlIG1lYW5pbmcgb2YgYGBfX2NtcF9fKClgYCBvciBgYF9fZXFfXygpYGAgc3VjaCB0aGF0XG4gICB0aGUgaGFzaCB2YWx1ZSByZXR1cm5lZCBpcyBubyBsb25nZXIgYXBwcm9wcmlhdGUgKGUuZy4gYnkgc3dpdGNoaW5nXG4gICB0byBhIHZhbHVlLWJhc2VkIGNvbmNlcHQgb2YgZXF1YWxpdHkgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdFxuICAgaWRlbnRpdHkgYmFzZWQgZXF1YWxpdHkpIGNhbiBleHBsaWNpdGx5IGZsYWcgdGhlbXNlbHZlcyBhcyBiZWluZ1xuICAgdW5oYXNoYWJsZSBieSBzZXR0aW5nIGBgX19oYXNoX18gPSBOb25lYGAgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24uXG4gICBEb2luZyBzbyBtZWFucyB0aGF0IG5vdCBvbmx5IHdpbGwgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcyByYWlzZSBhblxuICAgYXBwcm9wcmlhdGUgYGBUeXBlRXJyb3JgYCB3aGVuIGEgcHJvZ3JhbSBhdHRlbXB0cyB0byByZXRyaWV2ZSB0aGVpclxuICAgaGFzaCB2YWx1ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIGJlIGNvcnJlY3RseSBpZGVudGlmaWVkIGFzXG4gICB1bmhhc2hhYmxlIHdoZW4gY2hlY2tpbmcgYGBpc2luc3RhbmNlKG9iaiwgY29sbGVjdGlvbnMuSGFzaGFibGUpYGBcbiAgICh1bmxpa2UgY2xhc3NlcyB3aGljaCBkZWZpbmUgdGhlaXIgb3duIGBgX19oYXNoX18oKWBgIHRvIGV4cGxpY2l0bHlcbiAgIHJhaXNlIGBgVHlwZUVycm9yYGApLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi41OiBgYF9faGFzaF9fKClgYCBtYXkgbm93IGFsc28gcmV0dXJuIGEgbG9uZ1xuICAgaW50ZWdlciBvYmplY3Q7IHRoZSAzMi1iaXQgaW50ZWdlciBpcyB0aGVuIGRlcml2ZWQgZnJvbSB0aGUgaGFzaCBvZlxuICAgdGhhdCBvYmplY3QuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjY6IGBgX19oYXNoX19gYCBtYXkgbm93IGJlIHNldCB0byBgYE5vbmVgYCB0b1xuICAgZXhwbGljaXRseSBmbGFnIGluc3RhbmNlcyBvZiBhIGNsYXNzIGFzIHVuaGFzaGFibGUuXG5cbm9iamVjdC5fX25vbnplcm9fXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IHRydXRoIHZhbHVlIHRlc3RpbmcgYW5kIHRoZSBidWlsdC1pbiBvcGVyYXRpb25cbiAgIGBgYm9vbCgpYGA7IHNob3VsZCByZXR1cm4gYGBGYWxzZWBgIG9yIGBgVHJ1ZWBgLCBvciB0aGVpciBpbnRlZ2VyXG4gICBlcXVpdmFsZW50cyBgYDBgYCBvciBgYDFgYC4gIFdoZW4gdGhpcyBtZXRob2QgaXMgbm90IGRlZmluZWQsXG4gICBgYF9fbGVuX18oKWBgIGlzIGNhbGxlZCwgaWYgaXQgaXMgZGVmaW5lZCwgYW5kIHRoZSBvYmplY3QgaXNcbiAgIGNvbnNpZGVyZWQgdHJ1ZSBpZiBpdHMgcmVzdWx0IGlzIG5vbnplcm8uIElmIGEgY2xhc3MgZGVmaW5lc1xuICAgbmVpdGhlciBgYF9fbGVuX18oKWBgIG5vciBgYF9fbm9uemVyb19fKClgYCwgYWxsIGl0cyBpbnN0YW5jZXMgYXJlXG4gICBjb25zaWRlcmVkIHRydWUuXG5cbm9iamVjdC5fX3VuaWNvZGVfXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IGBgdW5pY29kZSgpYGAgYnVpbHQtaW47IHNob3VsZCByZXR1cm4gYSBVbmljb2RlXG4gICBvYmplY3QuIFdoZW4gdGhpcyBtZXRob2QgaXMgbm90IGRlZmluZWQsIHN0cmluZyBjb252ZXJzaW9uIGlzXG4gICBhdHRlbXB0ZWQsIGFuZCB0aGUgcmVzdWx0IG9mIHN0cmluZyBjb252ZXJzaW9uIGlzIGNvbnZlcnRlZCB0b1xuICAgVW5pY29kZSB1c2luZyB0aGUgc3lzdGVtIGRlZmF1bHQgZW5jb2RpbmcuXG4nLAotICdkZWJ1Z2dlcic6IHUnXG5gYHBkYmBgIC0tLSBUaGUgUHl0aG9uIERlYnVnZ2VyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cblRoZSBtb2R1bGUgYGBwZGJgYCBkZWZpbmVzIGFuIGludGVyYWN0aXZlIHNvdXJjZSBjb2RlIGRlYnVnZ2VyIGZvclxuUHl0aG9uIHByb2dyYW1zLiAgSXQgc3VwcG9ydHMgc2V0dGluZyAoY29uZGl0aW9uYWwpIGJyZWFrcG9pbnRzIGFuZFxuc2luZ2xlIHN0ZXBwaW5nIGF0IHRoZSBzb3VyY2UgbGluZSBsZXZlbCwgaW5zcGVjdGlvbiBvZiBzdGFjayBmcmFtZXMsXG5zb3VyY2UgY29kZSBsaXN0aW5nLCBhbmQgZXZhbHVhdGlvbiBvZiBhcmJpdHJhcnkgUHl0aG9uIGNvZGUgaW4gdGhlXG5jb250ZXh0IG9mIGFueSBzdGFjayBmcmFtZS4gIEl0IGFsc28gc3VwcG9ydHMgcG9zdC1tb3J0ZW0gZGVidWdnaW5nXG5hbmQgY2FuIGJlIGNhbGxlZCB1bmRlciBwcm9ncmFtIGNvbnRyb2wuXG5cblRoZSBkZWJ1Z2dlciBpcyBleHRlbnNpYmxlIC0tLSBpdCBpcyBhY3R1YWxseSBkZWZpbmVkIGFzIHRoZSBjbGFzc1xuYGBQZGJgYC4gVGhpcyBpcyBjdXJyZW50bHkgdW5kb2N1bWVudGVkIGJ1dCBlYXNpbHkgdW5kZXJzdG9vZCBieVxucmVhZGluZyB0aGUgc291cmNlLiAgVGhlIGV4dGVuc2lvbiBpbnRlcmZhY2UgdXNlcyB0aGUgbW9kdWxlcyBgYGJkYmBgXG5hbmQgYGBjbWRgYC5cblxuVGhlIGRlYnVnZ2VyXCdzIHByb21wdCBpcyBgYChQZGIpYGAuIFR5cGljYWwgdXNhZ2UgdG8gcnVuIGEgcHJvZ3JhbVxudW5kZXIgY29udHJvbCBvZiB0aGUgZGVidWdnZXIgaXM6XG5cbiAgID4+PiBpbXBvcnQgcGRiXG4gICA+Pj4gaW1wb3J0IG15bW9kdWxlXG4gICA+Pj4gcGRiLnJ1bihcJ215bW9kdWxlLnRlc3QoKVwnKVxuICAgPiA8c3RyaW5nPigwKT8oKVxuICAgKFBkYikgY29udGludWVcbiAgID4gPHN0cmluZz4oMSk/KClcbiAgIChQZGIpIGNvbnRpbnVlXG4gICBOYW1lRXJyb3I6IFwnc3BhbVwnXG4gICA+IDxzdHJpbmc+KDEpPygpXG4gICAoUGRiKVxuXG5gYHBkYi5weWBgIGNhbiBhbHNvIGJlIGludm9rZWQgYXMgYSBzY3JpcHQgdG8gZGVidWcgb3RoZXIgc2NyaXB0cy5cbkZvciBleGFtcGxlOlxuXG4gICBweXRob24gLW0gcGRiIG15c2NyaXB0LnB5XG5cbldoZW4gaW52b2tlZCBhcyBhIHNjcmlwdCwgcGRiIHdpbGwgYXV0b21hdGljYWxseSBlbnRlciBwb3N0LW1vcnRlbVxuZGVidWdnaW5nIGlmIHRoZSBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkIGV4aXRzIGFibm9ybWFsbHkuIEFmdGVyIHBvc3QtXG5tb3J0ZW0gZGVidWdnaW5nIChvciBhZnRlciBub3JtYWwgZXhpdCBvZiB0aGUgcHJvZ3JhbSksIHBkYiB3aWxsXG5yZXN0YXJ0IHRoZSBwcm9ncmFtLiBBdXRvbWF0aWMgcmVzdGFydGluZyBwcmVzZXJ2ZXMgcGRiXCdzIHN0YXRlIChzdWNoXG5hcyBicmVha3BvaW50cykgYW5kIGluIG1vc3QgY2FzZXMgaXMgbW9yZSB1c2VmdWwgdGhhbiBxdWl0dGluZyB0aGVcbmRlYnVnZ2VyIHVwb24gcHJvZ3JhbVwncyBleGl0LlxuXG5OZXcgaW4gdmVyc2lvbiAyLjQ6IFJlc3RhcnRpbmcgcG9zdC1tb3J0ZW0gYmVoYXZpb3IgYWRkZWQuXG5cblRoZSB0eXBpY2FsIHVzYWdlIHRvIGJyZWFrIGludG8gdGhlIGRlYnVnZ2VyIGZyb20gYSBydW5uaW5nIHByb2dyYW0gaXNcbnRvIGluc2VydFxuXG4gICBpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlKClcblxuYXQgdGhlIGxvY2F0aW9uIHlvdSB3YW50IHRvIGJyZWFrIGludG8gdGhlIGRlYnVnZ2VyLiAgWW91IGNhbiB0aGVuXG5zdGVwIHRocm91Z2ggdGhlIGNvZGUgZm9sbG93aW5nIHRoaXMgc3RhdGVtZW50LCBhbmQgY29udGludWUgcnVubmluZ1xud2l0aG91dCB0aGUgZGVidWdnZXIgdXNpbmcgdGhlIGBgY2BgIGNvbW1hbmQuXG5cblRoZSB0eXBpY2FsIHVzYWdlIHRvIGluc3BlY3QgYSBjcmFzaGVkIHByb2dyYW0gaXM6XG5cbiAgID4+PiBpbXBvcnQgcGRiXG4gICA+Pj4gaW1wb3J0IG15bW9kdWxlXG4gICA+Pj4gbXltb2R1bGUudGVzdCgpXG4gICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4gICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID9cbiAgICAgRmlsZSAiLi9teW1vZHVsZS5weSIsIGxpbmUgNCwgaW4gdGVzdFxuICAgICAgIHRlc3QyKClcbiAgICAgRmlsZSAiLi9teW1vZHVsZS5weSIsIGxpbmUgMywgaW4gdGVzdDJcbiAgICAgICBwcmludCBzcGFtXG4gICBOYW1lRXJyb3I6IHNwYW1cbiAgID4+PiBwZGIucG0oKVxuICAgPiAuL215bW9kdWxlLnB5KDMpdGVzdDIoKVxuICAgLT4gcHJpbnQgc3BhbVxuICAgKFBkYilcblxuVGhlIG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOyBlYWNoIGVudGVycyB0aGUgZGVidWdnZXJcbmluIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHdheTpcblxucGRiLnJ1bihzdGF0ZW1lbnRbLCBnbG9iYWxzWywgbG9jYWxzXV0pXG5cbiAgIEV4ZWN1dGUgdGhlICpzdGF0ZW1lbnQqIChnaXZlbiBhcyBhIHN0cmluZykgdW5kZXIgZGVidWdnZXIgY29udHJvbC5cbiAgIFRoZSBkZWJ1Z2dlciBwcm9tcHQgYXBwZWFycyBiZWZvcmUgYW55IGNvZGUgaXMgZXhlY3V0ZWQ7IHlvdSBjYW5cbiAgIHNldCBicmVha3BvaW50cyBhbmQgdHlwZSBgYGNvbnRpbnVlYGAsIG9yIHlvdSBjYW4gc3RlcCB0aHJvdWdoIHRoZVxuICAgc3RhdGVtZW50IHVzaW5nIGBgc3RlcGBgIG9yIGBgbmV4dGBgIChhbGwgdGhlc2UgY29tbWFuZHMgYXJlXG4gICBleHBsYWluZWQgYmVsb3cpLiAgVGhlIG9wdGlvbmFsICpnbG9iYWxzKiBhbmQgKmxvY2FscyogYXJndW1lbnRzXG4gICBzcGVjaWZ5IHRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCB0aGUgY29kZSBpcyBleGVjdXRlZDsgYnkgZGVmYXVsdFxuICAgdGhlIGRpY3Rpb25hcnkgb2YgdGhlIG1vZHVsZSBgYF9fbWFpbl9fYGAgaXMgdXNlZC4gIChTZWUgdGhlXG4gICBleHBsYW5hdGlvbiBvZiB0aGUgYGBleGVjYGAgc3RhdGVtZW50IG9yIHRoZSBgYGV2YWwoKWBgIGJ1aWx0LWluXG4gICBmdW5jdGlvbi4pXG5cbnBkYi5ydW5ldmFsKGV4cHJlc3Npb25bLCBnbG9iYWxzWywgbG9jYWxzXV0pXG5cbiAgIEV2YWx1YXRlIHRoZSAqZXhwcmVzc2lvbiogKGdpdmVuIGFzIGEgc3RyaW5nKSB1bmRlciBkZWJ1Z2dlclxuICAgY29udHJvbC4gIFdoZW4gYGBydW5ldmFsKClgYCByZXR1cm5zLCBpdCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGVcbiAgIGV4cHJlc3Npb24uICBPdGhlcndpc2UgdGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIGBgcnVuKClgYC5cblxucGRiLnJ1bmNhbGwoZnVuY3Rpb25bLCBhcmd1bWVudCwgLi4uXSlcblxuICAgQ2FsbCB0aGUgKmZ1bmN0aW9uKiAoYSBmdW5jdGlvbiBvciBtZXRob2Qgb2JqZWN0LCBub3QgYSBzdHJpbmcpXG4gICB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuICBXaGVuIGBgcnVuY2FsbCgpYGAgcmV0dXJucywgaXQgcmV0dXJuc1xuICAgd2hhdGV2ZXIgdGhlIGZ1bmN0aW9uIGNhbGwgcmV0dXJuZWQuICBUaGUgZGVidWdnZXIgcHJvbXB0IGFwcGVhcnNcbiAgIGFzIHNvb24gYXMgdGhlIGZ1bmN0aW9uIGlzIGVudGVyZWQuXG5cbnBkYi5zZXRfdHJhY2UoKVxuXG4gICBFbnRlciB0aGUgZGVidWdnZXIgYXQgdGhlIGNhbGxpbmcgc3RhY2sgZnJhbWUuICBUaGlzIGlzIHVzZWZ1bCB0b1xuICAgaGFyZC1jb2RlIGEgYnJlYWtwb2ludCBhdCBhIGdpdmVuIHBvaW50IGluIGEgcHJvZ3JhbSwgZXZlbiBpZiB0aGVcbiAgIGNvZGUgaXMgbm90IG90aGVyd2lzZSBiZWluZyBkZWJ1Z2dlZCAoZS5nLiB3aGVuIGFuIGFzc2VydGlvblxuICAgZmFpbHMpLlxuXG5wZGIucG9zdF9tb3J0ZW0oW3RyYWNlYmFja10pXG5cbiAgIEVudGVyIHBvc3QtbW9ydGVtIGRlYnVnZ2luZyBvZiB0aGUgZ2l2ZW4gKnRyYWNlYmFjayogb2JqZWN0LiAgSWYgbm9cbiAgICp0cmFjZWJhY2sqIGlzIGdpdmVuLCBpdCB1c2VzIHRoZSBvbmUgb2YgdGhlIGV4Y2VwdGlvbiB0aGF0IGlzXG4gICBjdXJyZW50bHkgYmVpbmcgaGFuZGxlZCAoYW4gZXhjZXB0aW9uIG11c3QgYmUgYmVpbmcgaGFuZGxlZCBpZiB0aGVcbiAgIGRlZmF1bHQgaXMgdG8gYmUgdXNlZCkuXG5cbnBkYi5wbSgpXG5cbiAgIEVudGVyIHBvc3QtbW9ydGVtIGRlYnVnZ2luZyBvZiB0aGUgdHJhY2ViYWNrIGZvdW5kIGluXG4gICBgYHN5cy5sYXN0X3RyYWNlYmFja2BgLlxuXG5UaGUgYGBydW4qYGAgZnVuY3Rpb25zIGFuZCBgYHNldF90cmFjZSgpYGAgYXJlIGFsaWFzZXMgZm9yXG5pbnN0YW50aWF0aW5nIHRoZSBgYFBkYmBgIGNsYXNzIGFuZCBjYWxsaW5nIHRoZSBtZXRob2Qgb2YgdGhlIHNhbWVcbm5hbWUuICBJZiB5b3Ugd2FudCB0byBhY2Nlc3MgZnVydGhlciBmZWF0dXJlcywgeW91IGhhdmUgdG8gZG8gdGhpc1xueW91cnNlbGY6XG5cbmNsYXNzIGNsYXNzIHBkYi5QZGIoY29tcGxldGVrZXk9XCd0YWJcJywgc3RkaW49Tm9uZSwgc3Rkb3V0PU5vbmUsIHNraXA9Tm9uZSlcblxuICAgYGBQZGJgYCBpcyB0aGUgZGVidWdnZXIgY2xhc3MuXG5cbiAgIFRoZSAqY29tcGxldGVrZXkqLCAqc3RkaW4qIGFuZCAqc3Rkb3V0KiBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byB0aGVcbiAgIHVuZGVybHlpbmcgYGBjbWQuQ21kYGAgY2xhc3M7IHNlZSB0aGUgZGVzY3JpcHRpb24gdGhlcmUuXG5cbiAgIFRoZSAqc2tpcCogYXJndW1lbnQsIGlmIGdpdmVuLCBtdXN0IGJlIGFuIGl0ZXJhYmxlIG9mIGdsb2Itc3R5bGVcbiAgIG1vZHVsZSBuYW1lIHBhdHRlcm5zLiAgVGhlIGRlYnVnZ2VyIHdpbGwgbm90IHN0ZXAgaW50byBmcmFtZXMgdGhhdFxuICAgb3JpZ2luYXRlIGluIGEgbW9kdWxlIHRoYXQgbWF0Y2hlcyBvbmUgb2YgdGhlc2UgcGF0dGVybnMuIFsxXVxuXG4gICBFeGFtcGxlIGNhbGwgdG8gZW5hYmxlIHRyYWNpbmcgd2l0aCAqc2tpcCo6XG5cbiAgICAgIGltcG9ydCBwZGI7IHBkYi5QZGIoc2tpcD1bXCdkamFuZ28uKlwnXSkuc2V0X3RyYWNlKClcblxuICAgTmV3IGluIHZlcnNpb24gMi43OiBUaGUgKnNraXAqIGFyZ3VtZW50LlxuXG4gICBydW4oc3RhdGVtZW50WywgZ2xvYmFsc1ssIGxvY2Fsc11dKVxuICAgcnVuZXZhbChleHByZXNzaW9uWywgZ2xvYmFsc1ssIGxvY2Fsc11dKVxuICAgcnVuY2FsbChmdW5jdGlvblssIGFyZ3VtZW50LCAuLi5dKVxuICAgc2V0X3RyYWNlKClcblxuICAgICAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgZnVuY3Rpb25zIGV4cGxhaW5lZCBhYm92ZS5cbicsCi0gJ2RlbCc6IHUnXG5UaGUgYGBkZWxgYCBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKlxuXG4gICBkZWxfc3RtdCA6Oj0gImRlbCIgdGFyZ2V0X2xpc3RcblxuRGVsZXRpb24gaXMgcmVjdXJzaXZlbHkgZGVmaW5lZCB2ZXJ5IHNpbWlsYXIgdG8gdGhlIHdheSBhc3NpZ25tZW50IGlzXG5kZWZpbmVkLiBSYXRoZXIgdGhhdCBzcGVsbGluZyBpdCBvdXQgaW4gZnVsbCBkZXRhaWxzLCBoZXJlIGFyZSBzb21lXG5oaW50cy5cblxuRGVsZXRpb24gb2YgYSB0YXJnZXQgbGlzdCByZWN1cnNpdmVseSBkZWxldGVzIGVhY2ggdGFyZ2V0LCBmcm9tIGxlZnRcbnRvIHJpZ2h0LlxuXG5EZWxldGlvbiBvZiBhIG5hbWUgcmVtb3ZlcyB0aGUgYmluZGluZyBvZiB0aGF0IG5hbWUgIGZyb20gdGhlIGxvY2FsIG9yXG5nbG9iYWwgbmFtZXNwYWNlLCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgbmFtZSBvY2N1cnMgaW4gYSBgYGdsb2JhbGBgXG5zdGF0ZW1lbnQgaW4gdGhlIHNhbWUgY29kZSBibG9jay4gIElmIHRoZSBuYW1lIGlzIHVuYm91bmQsIGFcbmBgTmFtZUVycm9yYGAgZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkLlxuXG5JdCBpcyBpbGxlZ2FsIHRvIGRlbGV0ZSBhIG5hbWUgZnJvbSB0aGUgbG9jYWwgbmFtZXNwYWNlIGlmIGl0IG9jY3Vyc1xuYXMgYSBmcmVlIHZhcmlhYmxlIGluIGEgbmVzdGVkIGJsb2NrLlxuXG5EZWxldGlvbiBvZiBhdHRyaWJ1dGUgcmVmZXJlbmNlcywgc3Vic2NyaXB0aW9ucyBhbmQgc2xpY2luZ3MgaXMgcGFzc2VkXG50byB0aGUgcHJpbWFyeSBvYmplY3QgaW52b2x2ZWQ7IGRlbGV0aW9uIG9mIGEgc2xpY2luZyBpcyBpbiBnZW5lcmFsXG5lcXVpdmFsZW50IHRvIGFzc2lnbm1lbnQgb2YgYW4gZW1wdHkgc2xpY2Ugb2YgdGhlIHJpZ2h0IHR5cGUgKGJ1dCBldmVuXG50aGlzIGlzIGRldGVybWluZWQgYnkgdGhlIHNsaWNlZCBvYmplY3QpLlxuJywKLSAnZGljdCc6IHUnXG5EaWN0aW9uYXJ5IGRpc3BsYXlzXG4qKioqKioqKioqKioqKioqKioqXG5cbkEgZGljdGlvbmFyeSBkaXNwbGF5IGlzIGEgcG9zc2libHkgZW1wdHkgc2VyaWVzIG9mIGtleS9kYXR1bSBwYWlyc1xuZW5jbG9zZWQgaW4gY3VybHkgYnJhY2VzOlxuXG4gICBkaWN0X2Rpc3BsYXkgICAgICAgOjo9ICJ7IiBba2V5X2RhdHVtX2xpc3QgfCBkaWN0X2NvbXByZWhlbnNpb25dICJ9IlxuICAga2V5X2RhdHVtX2xpc3QgICAgIDo6PSBrZXlfZGF0dW0gKCIsIiBrZXlfZGF0dW0pKiBbIiwiXVxuICAga2V5X2RhdHVtICAgICAgICAgIDo6PSBleHByZXNzaW9uICI6IiBleHByZXNzaW9uXG4gICBkaWN0X2NvbXByZWhlbnNpb24gOjo9IGV4cHJlc3Npb24gIjoiIGV4cHJlc3Npb24gY29tcF9mb3JcblxuQSBkaWN0aW9uYXJ5IGRpc3BsYXkgeWllbGRzIGEgbmV3IGRpY3Rpb25hcnkgb2JqZWN0LlxuXG5JZiBhIGNvbW1hLXNlcGFyYXRlZCBzZXF1ZW5jZSBvZiBrZXkvZGF0dW0gcGFpcnMgaXMgZ2l2ZW4sIHRoZXkgYXJlXG5ldmFsdWF0ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0IHRvIGRlZmluZSB0aGUgZW50cmllcyBvZiB0aGUgZGljdGlvbmFyeTpcbmVhY2gga2V5IG9iamVjdCBpcyB1c2VkIGFzIGEga2V5IGludG8gdGhlIGRpY3Rpb25hcnkgdG8gc3RvcmUgdGhlXG5jb3JyZXNwb25kaW5nIGRhdHVtLiAgVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gc3BlY2lmeSB0aGUgc2FtZSBrZXlcbm11bHRpcGxlIHRpbWVzIGluIHRoZSBrZXkvZGF0dW0gbGlzdCwgYW5kIHRoZSBmaW5hbCBkaWN0aW9uYXJ5XCdzIHZhbHVlXG5mb3IgdGhhdCBrZXkgd2lsbCBiZSB0aGUgbGFzdCBvbmUgZ2l2ZW4uXG5cbkEgZGljdCBjb21wcmVoZW5zaW9uLCBpbiBjb250cmFzdCB0byBsaXN0IGFuZCBzZXQgY29tcHJlaGVuc2lvbnMsXG5uZWVkcyB0d28gZXhwcmVzc2lvbnMgc2VwYXJhdGVkIHdpdGggYSBjb2xvbiBmb2xsb3dlZCBieSB0aGUgdXN1YWxcbiJmb3IiIGFuZCAiaWYiIGNsYXVzZXMuIFdoZW4gdGhlIGNvbXByZWhlbnNpb24gaXMgcnVuLCB0aGUgcmVzdWx0aW5nXG5rZXkgYW5kIHZhbHVlIGVsZW1lbnRzIGFyZSBpbnNlcnRlZCBpbiB0aGUgbmV3IGRpY3Rpb25hcnkgaW4gdGhlIG9yZGVyXG50aGV5IGFyZSBwcm9kdWNlZC5cblxuUmVzdHJpY3Rpb25zIG9uIHRoZSB0eXBlcyBvZiB0aGUga2V5IHZhbHVlcyBhcmUgbGlzdGVkIGVhcmxpZXIgaW5cbnNlY3Rpb24gKlRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSouICAoVG8gc3VtbWFyaXplLCB0aGUga2V5IHR5cGVcbnNob3VsZCBiZSAqaGFzaGFibGUqLCB3aGljaCBleGNsdWRlcyBhbGwgbXV0YWJsZSBvYmplY3RzLikgIENsYXNoZXNcbmJldHdlZW4gZHVwbGljYXRlIGtleXMgYXJlIG5vdCBkZXRlY3RlZDsgdGhlIGxhc3QgZGF0dW0gKHRleHR1YWxseVxucmlnaHRtb3N0IGluIHRoZSBkaXNwbGF5KSBzdG9yZWQgZm9yIGEgZ2l2ZW4ga2V5IHZhbHVlIHByZXZhaWxzLlxuJywKLSAnZHluYW1pYy1mZWF0dXJlcyc6IHUnXG5JbnRlcmFjdGlvbiB3aXRoIGR5bmFtaWMgZmVhdHVyZXNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5UaGVyZSBhcmUgc2V2ZXJhbCBjYXNlcyB3aGVyZSBQeXRob24gc3RhdGVtZW50cyBhcmUgaWxsZWdhbCB3aGVuIHVzZWRcbmluIGNvbmp1bmN0aW9uIHdpdGggbmVzdGVkIHNjb3BlcyB0aGF0IGNvbnRhaW4gZnJlZSB2YXJpYWJsZXMuXG5cbklmIGEgdmFyaWFibGUgaXMgcmVmZXJlbmNlZCBpbiBhbiBlbmNsb3Npbmcgc2NvcGUsIGl0IGlzIGlsbGVnYWwgdG9cbmRlbGV0ZSB0aGUgbmFtZS4gIEFuIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgYXQgY29tcGlsZSB0aW1lLlxuXG5JZiB0aGUgd2lsZCBjYXJkIGZvcm0gb2YgaW1wb3J0IC0tLSBgYGltcG9ydCAqYGAgLS0tIGlzIHVzZWQgaW4gYVxuZnVuY3Rpb24gYW5kIHRoZSBmdW5jdGlvbiBjb250YWlucyBvciBpcyBhIG5lc3RlZCBibG9jayB3aXRoIGZyZWVcbnZhcmlhYmxlcywgdGhlIGNvbXBpbGVyIHdpbGwgcmFpc2UgYSBgYFN5bnRheEVycm9yYGAuXG5cbklmIGBgZXhlY2BgIGlzIHVzZWQgaW4gYSBmdW5jdGlvbiBhbmQgdGhlIGZ1bmN0aW9uIGNvbnRhaW5zIG9yIGlzIGFcbm5lc3RlZCBibG9jayB3aXRoIGZyZWUgdmFyaWFibGVzLCB0aGUgY29tcGlsZXIgd2lsbCByYWlzZSBhXG5gYFN5bnRheEVycm9yYGAgdW5sZXNzIHRoZSBleGVjIGV4cGxpY2l0bHkgc3BlY2lmaWVzIHRoZSBsb2NhbFxubmFtZXNwYWNlIGZvciB0aGUgYGBleGVjYGAuICAoSW4gb3RoZXIgd29yZHMsIGBgZXhlYyBvYmpgYCB3b3VsZCBiZVxuaWxsZWdhbCwgYnV0IGBgZXhlYyBvYmogaW4gbnNgYCB3b3VsZCBiZSBsZWdhbC4pXG5cblRoZSBgYGV2YWwoKWBgLCBgYGV4ZWNmaWxlKClgYCwgYW5kIGBgaW5wdXQoKWBgIGZ1bmN0aW9ucyBhbmQgdGhlXG5gYGV4ZWNgYCBzdGF0ZW1lbnQgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBmdWxsIGVudmlyb25tZW50IGZvclxucmVzb2x2aW5nIG5hbWVzLiAgTmFtZXMgbWF5IGJlIHJlc29sdmVkIGluIHRoZSBsb2NhbCBhbmQgZ2xvYmFsXG5uYW1lc3BhY2VzIG9mIHRoZSBjYWxsZXIuICBGcmVlIHZhcmlhYmxlcyBhcmUgbm90IHJlc29sdmVkIGluIHRoZVxubmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlLCBidXQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuIFsxXSBUaGVcbmBgZXhlY2BgIHN0YXRlbWVudCBhbmQgdGhlIGBgZXZhbCgpYGAgYW5kIGBgZXhlY2ZpbGUoKWBgIGZ1bmN0aW9uc1xuaGF2ZSBvcHRpb25hbCBhcmd1bWVudHMgdG8gb3ZlcnJpZGUgdGhlIGdsb2JhbCBhbmQgbG9jYWwgbmFtZXNwYWNlLlxuSWYgb25seSBvbmUgbmFtZXNwYWNlIGlzIHNwZWNpZmllZCwgaXQgaXMgdXNlZCBmb3IgYm90aC5cbicsCi0gJ2Vsc2UnOiB1J1xuVGhlIGBgaWZgYCBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqXG5cblRoZSBgYGlmYGAgc3RhdGVtZW50IGlzIHVzZWQgZm9yIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbjpcblxuICAgaWZfc3RtdCA6Oj0gImlmIiBleHByZXNzaW9uICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgKCAiZWxpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGUgKSpcbiAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuXG5JdCBzZWxlY3RzIGV4YWN0bHkgb25lIG9mIHRoZSBzdWl0ZXMgYnkgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbnMgb25lXG5ieSBvbmUgdW50aWwgb25lIGlzIGZvdW5kIHRvIGJlIHRydWUgKHNlZSBzZWN0aW9uICpCb29sZWFuIG9wZXJhdGlvbnMqXG5mb3IgdGhlIGRlZmluaXRpb24gb2YgdHJ1ZSBhbmQgZmFsc2UpOyB0aGVuIHRoYXQgc3VpdGUgaXMgZXhlY3V0ZWRcbihhbmQgbm8gb3RoZXIgcGFydCBvZiB0aGUgYGBpZmBgIHN0YXRlbWVudCBpcyBleGVjdXRlZCBvciBldmFsdWF0ZWQpLlxuSWYgYWxsIGV4cHJlc3Npb25zIGFyZSBmYWxzZSwgdGhlIHN1aXRlIG9mIHRoZSBgYGVsc2VgYCBjbGF1c2UsIGlmXG5wcmVzZW50LCBpcyBleGVjdXRlZC5cbicsCi0gJ2V4Y2VwdGlvbnMnOiB1J1xuRXhjZXB0aW9uc1xuKioqKioqKioqKlxuXG5FeGNlcHRpb25zIGFyZSBhIG1lYW5zIG9mIGJyZWFraW5nIG91dCBvZiB0aGUgbm9ybWFsIGZsb3cgb2YgY29udHJvbFxub2YgYSBjb2RlIGJsb2NrIGluIG9yZGVyIHRvIGhhbmRsZSBlcnJvcnMgb3Igb3RoZXIgZXhjZXB0aW9uYWxcbmNvbmRpdGlvbnMuICBBbiBleGNlcHRpb24gaXMgKnJhaXNlZCogYXQgdGhlIHBvaW50IHdoZXJlIHRoZSBlcnJvciBpc1xuZGV0ZWN0ZWQ7IGl0IG1heSBiZSAqaGFuZGxlZCogYnkgdGhlIHN1cnJvdW5kaW5nIGNvZGUgYmxvY2sgb3IgYnkgYW55XG5jb2RlIGJsb2NrIHRoYXQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbnZva2VkIHRoZSBjb2RlIGJsb2NrIHdoZXJlXG50aGUgZXJyb3Igb2NjdXJyZWQuXG5cblRoZSBQeXRob24gaW50ZXJwcmV0ZXIgcmFpc2VzIGFuIGV4Y2VwdGlvbiB3aGVuIGl0IGRldGVjdHMgYSBydW4tdGltZVxuZXJyb3IgKHN1Y2ggYXMgZGl2aXNpb24gYnkgemVybykuICBBIFB5dGhvbiBwcm9ncmFtIGNhbiBhbHNvXG5leHBsaWNpdGx5IHJhaXNlIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBgYHJhaXNlYGAgc3RhdGVtZW50LiBFeGNlcHRpb25cbmhhbmRsZXJzIGFyZSBzcGVjaWZpZWQgd2l0aCB0aGUgYGB0cnlgYCAuLi4gYGBleGNlcHRgYCBzdGF0ZW1lbnQuICBUaGVcbmBgZmluYWxseWBgIGNsYXVzZSBvZiBzdWNoIGEgc3RhdGVtZW50IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgY2xlYW51cFxuY29kZSB3aGljaCBkb2VzIG5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbiwgYnV0IGlzIGV4ZWN1dGVkIHdoZXRoZXIgYW5cbmV4Y2VwdGlvbiBvY2N1cnJlZCBvciBub3QgaW4gdGhlIHByZWNlZGluZyBjb2RlLlxuXG5QeXRob24gdXNlcyB0aGUgInRlcm1pbmF0aW9uIiBtb2RlbCBvZiBlcnJvciBoYW5kbGluZzogYW4gZXhjZXB0aW9uXG5oYW5kbGVyIGNhbiBmaW5kIG91dCB3aGF0IGhhcHBlbmVkIGFuZCBjb250aW51ZSBleGVjdXRpb24gYXQgYW4gb3V0ZXJcbmxldmVsLCBidXQgaXQgY2Fubm90IHJlcGFpciB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yIGFuZCByZXRyeSB0aGVcbmZhaWxpbmcgb3BlcmF0aW9uIChleGNlcHQgYnkgcmUtZW50ZXJpbmcgdGhlIG9mZmVuZGluZyBwaWVjZSBvZiBjb2RlXG5mcm9tIHRoZSB0b3ApLlxuXG5XaGVuIGFuIGV4Y2VwdGlvbiBpcyBub3QgaGFuZGxlZCBhdCBhbGwsIHRoZSBpbnRlcnByZXRlciB0ZXJtaW5hdGVzXG5leGVjdXRpb24gb2YgdGhlIHByb2dyYW0sIG9yIHJldHVybnMgdG8gaXRzIGludGVyYWN0aXZlIG1haW4gbG9vcC4gIEluXG5laXRoZXIgY2FzZSwgaXQgcHJpbnRzIGEgc3RhY2sgYmFja3RyYWNlLCBleGNlcHQgd2hlbiB0aGUgZXhjZXB0aW9uIGlzXG5gYFN5c3RlbUV4aXRgYC5cblxuRXhjZXB0aW9ucyBhcmUgaWRlbnRpZmllZCBieSBjbGFzcyBpbnN0YW5jZXMuICBUaGUgYGBleGNlcHRgYCBjbGF1c2VcbmlzIHNlbGVjdGVkIGRlcGVuZGluZyBvbiB0aGUgY2xhc3Mgb2YgdGhlIGluc3RhbmNlOiBpdCBtdXN0IHJlZmVyZW5jZVxudGhlIGNsYXNzIG9mIHRoZSBpbnN0YW5jZSBvciBhIGJhc2UgY2xhc3MgdGhlcmVvZi4gIFRoZSBpbnN0YW5jZSBjYW5cbmJlIHJlY2VpdmVkIGJ5IHRoZSBoYW5kbGVyIGFuZCBjYW4gY2FycnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dFxudGhlIGV4Y2VwdGlvbmFsIGNvbmRpdGlvbi5cblxuRXhjZXB0aW9ucyBjYW4gYWxzbyBiZSBpZGVudGlmaWVkIGJ5IHN0cmluZ3MsIGluIHdoaWNoIGNhc2UgdGhlXG5gYGV4Y2VwdGBgIGNsYXVzZSBpcyBzZWxlY3RlZCBieSBvYmplY3QgaWRlbnRpdHkuICBBbiBhcmJpdHJhcnkgdmFsdWVcbmNhbiBiZSByYWlzZWQgYWxvbmcgd2l0aCB0aGUgaWRlbnRpZnlpbmcgc3RyaW5nIHdoaWNoIGNhbiBiZSBwYXNzZWQgdG9cbnRoZSBoYW5kbGVyLlxuXG5Ob3RlOiBNZXNzYWdlcyB0byBleGNlcHRpb25zIGFyZSBub3QgcGFydCBvZiB0aGUgUHl0aG9uIEFQSS4gIFRoZWlyXG4gIGNvbnRlbnRzIG1heSBjaGFuZ2UgZnJvbSBvbmUgdmVyc2lvbiBvZiBQeXRob24gdG8gdGhlIG5leHQgd2l0aG91dFxuICB3YXJuaW5nIGFuZCBzaG91bGQgbm90IGJlIHJlbGllZCBvbiBieSBjb2RlIHdoaWNoIHdpbGwgcnVuIHVuZGVyXG4gIG11bHRpcGxlIHZlcnNpb25zIG9mIHRoZSBpbnRlcnByZXRlci5cblxuU2VlIGFsc28gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBgYHRyeWBgIHN0YXRlbWVudCBpbiBzZWN0aW9uICpUaGUgdHJ5XG5zdGF0ZW1lbnQqIGFuZCBgYHJhaXNlYGAgc3RhdGVtZW50IGluIHNlY3Rpb24gKlRoZSByYWlzZSBzdGF0ZW1lbnQqLlxuXG4tWyBGb290bm90ZXMgXS1cblxuWzFdIFRoaXMgbGltaXRhdGlvbiBvY2N1cnMgYmVjYXVzZSB0aGUgY29kZSB0aGF0IGlzIGV4ZWN1dGVkIGJ5IHRoZXNlXG4gICAgb3BlcmF0aW9ucyBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSB0aW1lIHRoZSBtb2R1bGUgaXMgY29tcGlsZWQuXG4nLAotICdleGVjJzogdSdcblRoZSBgYGV4ZWNgYCBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKipcblxuICAgZXhlY19zdG10IDo6PSAiZXhlYyIgb3JfZXhwciBbImluIiBleHByZXNzaW9uIFsiLCIgZXhwcmVzc2lvbl1dXG5cblRoaXMgc3RhdGVtZW50IHN1cHBvcnRzIGR5bmFtaWMgZXhlY3V0aW9uIG9mIFB5dGhvbiBjb2RlLiAgVGhlIGZpcnN0XG5leHByZXNzaW9uIHNob3VsZCBldmFsdWF0ZSB0byBlaXRoZXIgYSBzdHJpbmcsIGFuIG9wZW4gZmlsZSBvYmplY3QsIG9yXG5hIGNvZGUgb2JqZWN0LiAgSWYgaXQgaXMgYSBzdHJpbmcsIHRoZSBzdHJpbmcgaXMgcGFyc2VkIGFzIGEgc3VpdGUgb2ZcblB5dGhvbiBzdGF0ZW1lbnRzIHdoaWNoIGlzIHRoZW4gZXhlY3V0ZWQgKHVubGVzcyBhIHN5bnRheCBlcnJvclxub2NjdXJzKS4gWzFdICBJZiBpdCBpcyBhbiBvcGVuIGZpbGUsIHRoZSBmaWxlIGlzIHBhcnNlZCB1bnRpbCBFT0YgYW5kXG5leGVjdXRlZC4gIElmIGl0IGlzIGEgY29kZSBvYmplY3QsIGl0IGlzIHNpbXBseSBleGVjdXRlZC4gIEluIGFsbFxuY2FzZXMsIHRoZSBjb2RlIHRoYXRcJ3MgZXhlY3V0ZWQgaXMgZXhwZWN0ZWQgdG8gYmUgdmFsaWQgYXMgZmlsZSBpbnB1dFxuKHNlZSBzZWN0aW9uICpGaWxlIGlucHV0KikuICBCZSBhd2FyZSB0aGF0IHRoZSBgYHJldHVybmBgIGFuZFxuYGB5aWVsZGBgIHN0YXRlbWVudHMgbWF5IG5vdCBiZSB1c2VkIG91dHNpZGUgb2YgZnVuY3Rpb24gZGVmaW5pdGlvbnNcbmV2ZW4gd2l0aGluIHRoZSBjb250ZXh0IG9mIGNvZGUgcGFzc2VkIHRvIHRoZSBgYGV4ZWNgYCBzdGF0ZW1lbnQuXG5cbkluIGFsbCBjYXNlcywgaWYgdGhlIG9wdGlvbmFsIHBhcnRzIGFyZSBvbWl0dGVkLCB0aGUgY29kZSBpcyBleGVjdXRlZFxuaW4gdGhlIGN1cnJlbnQgc2NvcGUuICBJZiBvbmx5IHRoZSBmaXJzdCBleHByZXNzaW9uIGFmdGVyIGBgaW5gYCBpc1xuc3BlY2lmaWVkLCBpdCBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5LCB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIGJvdGggdGhlXG5nbG9iYWwgYW5kIHRoZSBsb2NhbCB2YXJpYWJsZXMuICBJZiB0d28gZXhwcmVzc2lvbnMgYXJlIGdpdmVuLCB0aGV5XG5hcmUgdXNlZCBmb3IgdGhlIGdsb2JhbCBhbmQgbG9jYWwgdmFyaWFibGVzLCByZXNwZWN0aXZlbHkuIElmXG5wcm92aWRlZCwgKmxvY2FscyogY2FuIGJlIGFueSBtYXBwaW5nIG9iamVjdC5cblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNDogRm9ybWVybHksICpsb2NhbHMqIHdhcyByZXF1aXJlZCB0byBiZSBhXG5kaWN0aW9uYXJ5LlxuXG5BcyBhIHNpZGUgZWZmZWN0LCBhbiBpbXBsZW1lbnRhdGlvbiBtYXkgaW5zZXJ0IGFkZGl0aW9uYWwga2V5cyBpbnRvXG50aGUgZGljdGlvbmFyaWVzIGdpdmVuIGJlc2lkZXMgdGhvc2UgY29ycmVzcG9uZGluZyB0byB2YXJpYWJsZSBuYW1lc1xuc2V0IGJ5IHRoZSBleGVjdXRlZCBjb2RlLiAgRm9yIGV4YW1wbGUsIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG1heVxuYWRkIGEgcmVmZXJlbmNlIHRvIHRoZSBkaWN0aW9uYXJ5IG9mIHRoZSBidWlsdC1pbiBtb2R1bGVcbmBgX19idWlsdGluX19gYCB1bmRlciB0aGUga2V5IGBgX19idWlsdGluc19fYGAgKCEpLlxuXG4qKlByb2dyYW1tZXJcJ3MgaGludHM6KiogZHluYW1pYyBldmFsdWF0aW9uIG9mIGV4cHJlc3Npb25zIGlzIHN1cHBvcnRlZFxuYnkgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGBgZXZhbCgpYGAuICBUaGUgYnVpbHQtaW4gZnVuY3Rpb25zXG5gYGdsb2JhbHMoKWBgIGFuZCBgYGxvY2FscygpYGAgcmV0dXJuIHRoZSBjdXJyZW50IGdsb2JhbCBhbmQgbG9jYWxcbmRpY3Rpb25hcnksIHJlc3BlY3RpdmVseSwgd2hpY2ggbWF5IGJlIHVzZWZ1bCB0byBwYXNzIGFyb3VuZCBmb3IgdXNlXG5ieSBgYGV4ZWNgYC5cblxuLVsgRm9vdG5vdGVzIF0tXG5cblsxXSBOb3RlIHRoYXQgdGhlIHBhcnNlciBvbmx5IGFjY2VwdHMgdGhlIFVuaXgtc3R5bGUgZW5kIG9mIGxpbmVcbiAgICBjb252ZW50aW9uLiBJZiB5b3UgYXJlIHJlYWRpbmcgdGhlIGNvZGUgZnJvbSBhIGZpbGUsIG1ha2Ugc3VyZSB0b1xuICAgIHVzZSB1bml2ZXJzYWwgbmV3bGluZSBtb2RlIHRvIGNvbnZlcnQgV2luZG93cyBvciBNYWMtc3R5bGVcbiAgICBuZXdsaW5lcy5cbicsCi0gJ2V4ZWNtb2RlbCc6IHUnXG5FeGVjdXRpb24gbW9kZWxcbioqKioqKioqKioqKioqKlxuXG5cbk5hbWluZyBhbmQgYmluZGluZ1xuPT09PT09PT09PT09PT09PT09XG5cbipOYW1lcyogcmVmZXIgdG8gb2JqZWN0cy4gIE5hbWVzIGFyZSBpbnRyb2R1Y2VkIGJ5IG5hbWUgYmluZGluZ1xub3BlcmF0aW9ucy4gRWFjaCBvY2N1cnJlbmNlIG9mIGEgbmFtZSBpbiB0aGUgcHJvZ3JhbSB0ZXh0IHJlZmVycyB0b1xudGhlICpiaW5kaW5nKiBvZiB0aGF0IG5hbWUgZXN0YWJsaXNoZWQgaW4gdGhlIGlubmVybW9zdCBmdW5jdGlvbiBibG9ja1xuY29udGFpbmluZyB0aGUgdXNlLlxuXG5BICpibG9jayogaXMgYSBwaWVjZSBvZiBQeXRob24gcHJvZ3JhbSB0ZXh0IHRoYXQgaXMgZXhlY3V0ZWQgYXMgYVxudW5pdC4gVGhlIGZvbGxvd2luZyBhcmUgYmxvY2tzOiBhIG1vZHVsZSwgYSBmdW5jdGlvbiBib2R5LCBhbmQgYSBjbGFzc1xuZGVmaW5pdGlvbi4gRWFjaCBjb21tYW5kIHR5cGVkIGludGVyYWN0aXZlbHkgaXMgYSBibG9jay4gIEEgc2NyaXB0XG5maWxlIChhIGZpbGUgZ2l2ZW4gYXMgc3RhbmRhcmQgaW5wdXQgdG8gdGhlIGludGVycHJldGVyIG9yIHNwZWNpZmllZFxub24gdGhlIGludGVycHJldGVyIGNvbW1hbmQgbGluZSB0aGUgZmlyc3QgYXJndW1lbnQpIGlzIGEgY29kZSBibG9jay5cbkEgc2NyaXB0IGNvbW1hbmQgKGEgY29tbWFuZCBzcGVjaWZpZWQgb24gdGhlIGludGVycHJldGVyIGNvbW1hbmQgbGluZVxud2l0aCB0aGUgXCcqKi1jKipcJyBvcHRpb24pIGlzIGEgY29kZSBibG9jay4gIFRoZSBmaWxlIHJlYWQgYnkgdGhlXG5idWlsdC1pbiBmdW5jdGlvbiBgYGV4ZWNmaWxlKClgYCBpcyBhIGNvZGUgYmxvY2suICBUaGUgc3RyaW5nIGFyZ3VtZW50XG5wYXNzZWQgdG8gdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGBgZXZhbCgpYGAgYW5kIHRvIHRoZSBgYGV4ZWNgYFxuc3RhdGVtZW50IGlzIGEgY29kZSBibG9jay4gVGhlIGV4cHJlc3Npb24gcmVhZCBhbmQgZXZhbHVhdGVkIGJ5IHRoZVxuYnVpbHQtaW4gZnVuY3Rpb24gYGBpbnB1dCgpYGAgaXMgYSBjb2RlIGJsb2NrLlxuXG5BIGNvZGUgYmxvY2sgaXMgZXhlY3V0ZWQgaW4gYW4gKmV4ZWN1dGlvbiBmcmFtZSouICBBIGZyYW1lIGNvbnRhaW5zXG5zb21lIGFkbWluaXN0cmF0aXZlIGluZm9ybWF0aW9uICh1c2VkIGZvciBkZWJ1Z2dpbmcpIGFuZCBkZXRlcm1pbmVzXG53aGVyZSBhbmQgaG93IGV4ZWN1dGlvbiBjb250aW51ZXMgYWZ0ZXIgdGhlIGNvZGUgYmxvY2tcJ3MgZXhlY3V0aW9uIGhhc1xuY29tcGxldGVkLlxuXG5BICpzY29wZSogZGVmaW5lcyB0aGUgdmlzaWJpbGl0eSBvZiBhIG5hbWUgd2l0aGluIGEgYmxvY2suICBJZiBhIGxvY2FsXG52YXJpYWJsZSBpcyBkZWZpbmVkIGluIGEgYmxvY2ssIGl0cyBzY29wZSBpbmNsdWRlcyB0aGF0IGJsb2NrLiAgSWYgdGhlXG5kZWZpbml0aW9uIG9jY3VycyBpbiBhIGZ1bmN0aW9uIGJsb2NrLCB0aGUgc2NvcGUgZXh0ZW5kcyB0byBhbnkgYmxvY2tzXG5jb250YWluZWQgd2l0aGluIHRoZSBkZWZpbmluZyBvbmUsIHVubGVzcyBhIGNvbnRhaW5lZCBibG9jayBpbnRyb2R1Y2VzXG5hIGRpZmZlcmVudCBiaW5kaW5nIGZvciB0aGUgbmFtZS4gIFRoZSBzY29wZSBvZiBuYW1lcyBkZWZpbmVkIGluIGFcbmNsYXNzIGJsb2NrIGlzIGxpbWl0ZWQgdG8gdGhlIGNsYXNzIGJsb2NrOyBpdCBkb2VzIG5vdCBleHRlbmQgdG8gdGhlXG5jb2RlIGJsb2NrcyBvZiBtZXRob2RzIC0tIHRoaXMgaW5jbHVkZXMgZ2VuZXJhdG9yIGV4cHJlc3Npb25zIHNpbmNlXG50aGV5IGFyZSBpbXBsZW1lbnRlZCB1c2luZyBhIGZ1bmN0aW9uIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IHRoZVxuZm9sbG93aW5nIHdpbGwgZmFpbDpcblxuICAgY2xhc3MgQTpcbiAgICAgICBhID0gNDJcbiAgICAgICBiID0gbGlzdChhICsgaSBmb3IgaSBpbiByYW5nZSgxMCkpXG5cbldoZW4gYSBuYW1lIGlzIHVzZWQgaW4gYSBjb2RlIGJsb2NrLCBpdCBpcyByZXNvbHZlZCB1c2luZyB0aGUgbmVhcmVzdFxuZW5jbG9zaW5nIHNjb3BlLiAgVGhlIHNldCBvZiBhbGwgc3VjaCBzY29wZXMgdmlzaWJsZSB0byBhIGNvZGUgYmxvY2tcbmlzIGNhbGxlZCB0aGUgYmxvY2tcJ3MgKmVudmlyb25tZW50Ki5cblxuSWYgYSBuYW1lIGlzIGJvdW5kIGluIGEgYmxvY2ssIGl0IGlzIGEgbG9jYWwgdmFyaWFibGUgb2YgdGhhdCBibG9jay5cbklmIGEgbmFtZSBpcyBib3VuZCBhdCB0aGUgbW9kdWxlIGxldmVsLCBpdCBpcyBhIGdsb2JhbCB2YXJpYWJsZS4gIChUaGVcbnZhcmlhYmxlcyBvZiB0aGUgbW9kdWxlIGNvZGUgYmxvY2sgYXJlIGxvY2FsIGFuZCBnbG9iYWwuKSAgSWYgYVxudmFyaWFibGUgaXMgdXNlZCBpbiBhIGNvZGUgYmxvY2sgYnV0IG5vdCBkZWZpbmVkIHRoZXJlLCBpdCBpcyBhICpmcmVlXG52YXJpYWJsZSouXG5cbldoZW4gYSBuYW1lIGlzIG5vdCBmb3VuZCBhdCBhbGwsIGEgYGBOYW1lRXJyb3JgYCBleGNlcHRpb24gaXMgcmFpc2VkLlxuSWYgdGhlIG5hbWUgcmVmZXJzIHRvIGEgbG9jYWwgdmFyaWFibGUgdGhhdCBoYXMgbm90IGJlZW4gYm91bmQsIGFcbmBgVW5ib3VuZExvY2FsRXJyb3JgYCBleGNlcHRpb24gaXMgcmFpc2VkLiAgYGBVbmJvdW5kTG9jYWxFcnJvcmBgIGlzIGFcbnN1YmNsYXNzIG9mIGBgTmFtZUVycm9yYGAuXG5cblRoZSBmb2xsb3dpbmcgY29uc3RydWN0cyBiaW5kIG5hbWVzOiBmb3JtYWwgcGFyYW1ldGVycyB0byBmdW5jdGlvbnMsXG5gYGltcG9ydGBgIHN0YXRlbWVudHMsIGNsYXNzIGFuZCBmdW5jdGlvbiBkZWZpbml0aW9ucyAodGhlc2UgYmluZCB0aGVcbmNsYXNzIG9yIGZ1bmN0aW9uIG5hbWUgaW4gdGhlIGRlZmluaW5nIGJsb2NrKSwgYW5kIHRhcmdldHMgdGhhdCBhcmVcbmlkZW50aWZpZXJzIGlmIG9jY3VycmluZyBpbiBhbiBhc3NpZ25tZW50LCBgYGZvcmBgIGxvb3AgaGVhZGVyLCBpbiB0aGVcbnNlY29uZCBwb3NpdGlvbiBvZiBhbiBgYGV4Y2VwdGBgIGNsYXVzZSBoZWFkZXIgb3IgYWZ0ZXIgYGBhc2BgIGluIGFcbmBgd2l0aGBgIHN0YXRlbWVudC4gIFRoZSBgYGltcG9ydGBgIHN0YXRlbWVudCBvZiB0aGUgZm9ybSBgYGZyb20gLi4uXG5pbXBvcnQgKmBgIGJpbmRzIGFsbCBuYW1lcyBkZWZpbmVkIGluIHRoZSBpbXBvcnRlZCBtb2R1bGUsIGV4Y2VwdFxudGhvc2UgYmVnaW5uaW5nIHdpdGggYW4gdW5kZXJzY29yZS4gIFRoaXMgZm9ybSBtYXkgb25seSBiZSB1c2VkIGF0IHRoZVxubW9kdWxlIGxldmVsLlxuXG5BIHRhcmdldCBvY2N1cnJpbmcgaW4gYSBgYGRlbGBgIHN0YXRlbWVudCBpcyBhbHNvIGNvbnNpZGVyZWQgYm91bmQgZm9yXG50aGlzIHB1cnBvc2UgKHRob3VnaCB0aGUgYWN0dWFsIHNlbWFudGljcyBhcmUgdG8gdW5iaW5kIHRoZSBuYW1lKS4gIEl0XG5pcyBpbGxlZ2FsIHRvIHVuYmluZCBhIG5hbWUgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IGFuIGVuY2xvc2luZyBzY29wZTtcbnRoZSBjb21waWxlciB3aWxsIHJlcG9ydCBhIGBgU3ludGF4RXJyb3JgYC5cblxuRWFjaCBhc3NpZ25tZW50IG9yIGltcG9ydCBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrIGRlZmluZWQgYnkgYVxuY2xhc3Mgb3IgZnVuY3Rpb24gZGVmaW5pdGlvbiBvciBhdCB0aGUgbW9kdWxlIGxldmVsICh0aGUgdG9wLWxldmVsXG5jb2RlIGJsb2NrKS5cblxuSWYgYSBuYW1lIGJpbmRpbmcgb3BlcmF0aW9uIG9jY3VycyBhbnl3aGVyZSB3aXRoaW4gYSBjb2RlIGJsb2NrLCBhbGxcbnVzZXMgb2YgdGhlIG5hbWUgd2l0aGluIHRoZSBibG9jayBhcmUgdHJlYXRlZCBhcyByZWZlcmVuY2VzIHRvIHRoZVxuY3VycmVudCBibG9jay4gIFRoaXMgY2FuIGxlYWQgdG8gZXJyb3JzIHdoZW4gYSBuYW1lIGlzIHVzZWQgd2l0aGluIGFcbmJsb2NrIGJlZm9yZSBpdCBpcyBib3VuZC4gVGhpcyBydWxlIGlzIHN1YnRsZS4gIFB5dGhvbiBsYWNrc1xuZGVjbGFyYXRpb25zIGFuZCBhbGxvd3MgbmFtZSBiaW5kaW5nIG9wZXJhdGlvbnMgdG8gb2NjdXIgYW55d2hlcmVcbndpdGhpbiBhIGNvZGUgYmxvY2suICBUaGUgbG9jYWwgdmFyaWFibGVzIG9mIGEgY29kZSBibG9jayBjYW4gYmVcbmRldGVybWluZWQgYnkgc2Nhbm5pbmcgdGhlIGVudGlyZSB0ZXh0IG9mIHRoZSBibG9jayBmb3IgbmFtZSBiaW5kaW5nXG5vcGVyYXRpb25zLlxuXG5JZiB0aGUgZ2xvYmFsIHN0YXRlbWVudCBvY2N1cnMgd2l0aGluIGEgYmxvY2ssIGFsbCB1c2VzIG9mIHRoZSBuYW1lXG5zcGVjaWZpZWQgaW4gdGhlIHN0YXRlbWVudCByZWZlciB0byB0aGUgYmluZGluZyBvZiB0aGF0IG5hbWUgaW4gdGhlXG50b3AtbGV2ZWwgbmFtZXNwYWNlLiBOYW1lcyBhcmUgcmVzb2x2ZWQgaW4gdGhlIHRvcC1sZXZlbCBuYW1lc3BhY2UgYnlcbnNlYXJjaGluZyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSwgaS5lLiB0aGUgbmFtZXNwYWNlIG9mIHRoZSBtb2R1bGVcbmNvbnRhaW5pbmcgdGhlIGNvZGUgYmxvY2ssIGFuZCB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlLCB0aGUgbmFtZXNwYWNlXG5vZiB0aGUgbW9kdWxlIGBgX19idWlsdGluX19gYC4gIFRoZSBnbG9iYWwgbmFtZXNwYWNlIGlzIHNlYXJjaGVkXG5maXJzdC4gIElmIHRoZSBuYW1lIGlzIG5vdCBmb3VuZCB0aGVyZSwgdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBpc1xuc2VhcmNoZWQuICBUaGUgZ2xvYmFsIHN0YXRlbWVudCBtdXN0IHByZWNlZGUgYWxsIHVzZXMgb2YgdGhlIG5hbWUuXG5cblRoZSBidWlsdGlucyBuYW1lc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGVjdXRpb24gb2YgYSBjb2RlIGJsb2NrXG5pcyBhY3R1YWxseSBmb3VuZCBieSBsb29raW5nIHVwIHRoZSBuYW1lIGBgX19idWlsdGluc19fYGAgaW4gaXRzXG5nbG9iYWwgbmFtZXNwYWNlOyB0aGlzIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkgb3IgYSBtb2R1bGUgKGluIHRoZVxubGF0dGVyIGNhc2UgdGhlIG1vZHVsZVwncyBkaWN0aW9uYXJ5IGlzIHVzZWQpLiAgQnkgZGVmYXVsdCwgd2hlbiBpbiB0aGVcbmBgX19tYWluX19gYCBtb2R1bGUsIGBgX19idWlsdGluc19fYGAgaXMgdGhlIGJ1aWx0LWluIG1vZHVsZVxuYGBfX2J1aWx0aW5fX2BgIChub3RlOiBubyBcJ3NcJyk7IHdoZW4gaW4gYW55IG90aGVyIG1vZHVsZSxcbmBgX19idWlsdGluc19fYGAgaXMgYW4gYWxpYXMgZm9yIHRoZSBkaWN0aW9uYXJ5IG9mIHRoZSBgYF9fYnVpbHRpbl9fYGBcbm1vZHVsZSBpdHNlbGYuICBgYF9fYnVpbHRpbnNfX2BgIGNhbiBiZSBzZXQgdG8gYSB1c2VyLWNyZWF0ZWRcbmRpY3Rpb25hcnkgdG8gY3JlYXRlIGEgd2VhayBmb3JtIG9mIHJlc3RyaWN0ZWQgZXhlY3V0aW9uLlxuXG4qKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIFVzZXJzIHNob3VsZCBub3QgdG91Y2hcbmBgX19idWlsdGluc19fYGA7IGl0IGlzIHN0cmljdGx5IGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4gIFVzZXJzXG53YW50aW5nIHRvIG92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlIHNob3VsZCBgYGltcG9ydGBgXG50aGUgYGBfX2J1aWx0aW5fX2BgIChubyBcJ3NcJykgbW9kdWxlIGFuZCBtb2RpZnkgaXRzIGF0dHJpYnV0ZXNcbmFwcHJvcHJpYXRlbHkuXG5cblRoZSBuYW1lc3BhY2UgZm9yIGEgbW9kdWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB0aGUgZmlyc3QgdGltZSBhXG5tb2R1bGUgaXMgaW1wb3J0ZWQuICBUaGUgbWFpbiBtb2R1bGUgZm9yIGEgc2NyaXB0IGlzIGFsd2F5cyBjYWxsZWRcbmBgX19tYWluX19gYC5cblxuVGhlIGBgZ2xvYmFsYGAgc3RhdGVtZW50IGhhcyB0aGUgc2FtZSBzY29wZSBhcyBhIG5hbWUgYmluZGluZ1xub3BlcmF0aW9uIGluIHRoZSBzYW1lIGJsb2NrLiAgSWYgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIHNjb3BlIGZvciBhXG5mcmVlIHZhcmlhYmxlIGNvbnRhaW5zIGEgZ2xvYmFsIHN0YXRlbWVudCwgdGhlIGZyZWUgdmFyaWFibGUgaXNcbnRyZWF0ZWQgYXMgYSBnbG9iYWwuXG5cbkEgY2xhc3MgZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudCB0aGF0IG1heSB1c2UgYW5kIGRlZmluZVxubmFtZXMuIFRoZXNlIHJlZmVyZW5jZXMgZm9sbG93IHRoZSBub3JtYWwgcnVsZXMgZm9yIG5hbWUgcmVzb2x1dGlvbi5cblRoZSBuYW1lc3BhY2Ugb2YgdGhlIGNsYXNzIGRlZmluaXRpb24gYmVjb21lcyB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnlcbm9mIHRoZSBjbGFzcy4gIE5hbWVzIGRlZmluZWQgYXQgdGhlIGNsYXNzIHNjb3BlIGFyZSBub3QgdmlzaWJsZSBpblxubWV0aG9kcy5cblxuXG5JbnRlcmFjdGlvbiB3aXRoIGR5bmFtaWMgZmVhdHVyZXNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5UaGVyZSBhcmUgc2V2ZXJhbCBjYXNlcyB3aGVyZSBQeXRob24gc3RhdGVtZW50cyBhcmUgaWxsZWdhbCB3aGVuIHVzZWRcbmluIGNvbmp1bmN0aW9uIHdpdGggbmVzdGVkIHNjb3BlcyB0aGF0IGNvbnRhaW4gZnJlZSB2YXJpYWJsZXMuXG5cbklmIGEgdmFyaWFibGUgaXMgcmVmZXJlbmNlZCBpbiBhbiBlbmNsb3Npbmcgc2NvcGUsIGl0IGlzIGlsbGVnYWwgdG9cbmRlbGV0ZSB0aGUgbmFtZS4gIEFuIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgYXQgY29tcGlsZSB0aW1lLlxuXG5JZiB0aGUgd2lsZCBjYXJkIGZvcm0gb2YgaW1wb3J0IC0tLSBgYGltcG9ydCAqYGAgLS0tIGlzIHVzZWQgaW4gYVxuZnVuY3Rpb24gYW5kIHRoZSBmdW5jdGlvbiBjb250YWlucyBvciBpcyBhIG5lc3RlZCBibG9jayB3aXRoIGZyZWVcbnZhcmlhYmxlcywgdGhlIGNvbXBpbGVyIHdpbGwgcmFpc2UgYSBgYFN5bnRheEVycm9yYGAuXG5cbklmIGBgZXhlY2BgIGlzIHVzZWQgaW4gYSBmdW5jdGlvbiBhbmQgdGhlIGZ1bmN0aW9uIGNvbnRhaW5zIG9yIGlzIGFcbm5lc3RlZCBibG9jayB3aXRoIGZyZWUgdmFyaWFibGVzLCB0aGUgY29tcGlsZXIgd2lsbCByYWlzZSBhXG5gYFN5bnRheEVycm9yYGAgdW5sZXNzIHRoZSBleGVjIGV4cGxpY2l0bHkgc3BlY2lmaWVzIHRoZSBsb2NhbFxubmFtZXNwYWNlIGZvciB0aGUgYGBleGVjYGAuICAoSW4gb3RoZXIgd29yZHMsIGBgZXhlYyBvYmpgYCB3b3VsZCBiZVxuaWxsZWdhbCwgYnV0IGBgZXhlYyBvYmogaW4gbnNgYCB3b3VsZCBiZSBsZWdhbC4pXG5cblRoZSBgYGV2YWwoKWBgLCBgYGV4ZWNmaWxlKClgYCwgYW5kIGBgaW5wdXQoKWBgIGZ1bmN0aW9ucyBhbmQgdGhlXG5gYGV4ZWNgYCBzdGF0ZW1lbnQgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBmdWxsIGVudmlyb25tZW50IGZvclxucmVzb2x2aW5nIG5hbWVzLiAgTmFtZXMgbWF5IGJlIHJlc29sdmVkIGluIHRoZSBsb2NhbCBhbmQgZ2xvYmFsXG5uYW1lc3BhY2VzIG9mIHRoZSBjYWxsZXIuICBGcmVlIHZhcmlhYmxlcyBhcmUgbm90IHJlc29sdmVkIGluIHRoZVxubmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlLCBidXQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuIFsxXSBUaGVcbmBgZXhlY2BgIHN0YXRlbWVudCBhbmQgdGhlIGBgZXZhbCgpYGAgYW5kIGBgZXhlY2ZpbGUoKWBgIGZ1bmN0aW9uc1xuaGF2ZSBvcHRpb25hbCBhcmd1bWVudHMgdG8gb3ZlcnJpZGUgdGhlIGdsb2JhbCBhbmQgbG9jYWwgbmFtZXNwYWNlLlxuSWYgb25seSBvbmUgbmFtZXNwYWNlIGlzIHNwZWNpZmllZCwgaXQgaXMgdXNlZCBmb3IgYm90aC5cblxuXG5FeGNlcHRpb25zXG49PT09PT09PT09XG5cbkV4Y2VwdGlvbnMgYXJlIGEgbWVhbnMgb2YgYnJlYWtpbmcgb3V0IG9mIHRoZSBub3JtYWwgZmxvdyBvZiBjb250cm9sXG5vZiBhIGNvZGUgYmxvY2sgaW4gb3JkZXIgdG8gaGFuZGxlIGVycm9ycyBvciBvdGhlciBleGNlcHRpb25hbFxuY29uZGl0aW9ucy4gIEFuIGV4Y2VwdGlvbiBpcyAqcmFpc2VkKiBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlIGVycm9yIGlzXG5kZXRlY3RlZDsgaXQgbWF5IGJlICpoYW5kbGVkKiBieSB0aGUgc3Vycm91bmRpbmcgY29kZSBibG9jayBvciBieSBhbnlcbmNvZGUgYmxvY2sgdGhhdCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGludm9rZWQgdGhlIGNvZGUgYmxvY2sgd2hlcmVcbnRoZSBlcnJvciBvY2N1cnJlZC5cblxuVGhlIFB5dGhvbiBpbnRlcnByZXRlciByYWlzZXMgYW4gZXhjZXB0aW9uIHdoZW4gaXQgZGV0ZWN0cyBhIHJ1bi10aW1lXG5lcnJvciAoc3VjaCBhcyBkaXZpc2lvbiBieSB6ZXJvKS4gIEEgUHl0aG9uIHByb2dyYW0gY2FuIGFsc29cbmV4cGxpY2l0bHkgcmFpc2UgYW4gZXhjZXB0aW9uIHdpdGggdGhlIGBgcmFpc2VgYCBzdGF0ZW1lbnQuIEV4Y2VwdGlvblxuaGFuZGxlcnMgYXJlIHNwZWNpZmllZCB3aXRoIHRoZSBgYHRyeWBgIC4uLiBgYGV4Y2VwdGBgIHN0YXRlbWVudC4gIFRoZVxuYGBmaW5hbGx5YGAgY2xhdXNlIG9mIHN1Y2ggYSBzdGF0ZW1lbnQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBjbGVhbnVwXG5jb2RlIHdoaWNoIGRvZXMgbm90IGhhbmRsZSB0aGUgZXhjZXB0aW9uLCBidXQgaXMgZXhlY3V0ZWQgd2hldGhlciBhblxuZXhjZXB0aW9uIG9jY3VycmVkIG9yIG5vdCBpbiB0aGUgcHJlY2VkaW5nIGNvZGUuXG5cblB5dGhvbiB1c2VzIHRoZSAidGVybWluYXRpb24iIG1vZGVsIG9mIGVycm9yIGhhbmRsaW5nOiBhbiBleGNlcHRpb25cbmhhbmRsZXIgY2FuIGZpbmQgb3V0IHdoYXQgaGFwcGVuZWQgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbiBhdCBhbiBvdXRlclxubGV2ZWwsIGJ1dCBpdCBjYW5ub3QgcmVwYWlyIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgYW5kIHJldHJ5IHRoZVxuZmFpbGluZyBvcGVyYXRpb24gKGV4Y2VwdCBieSByZS1lbnRlcmluZyB0aGUgb2ZmZW5kaW5nIHBpZWNlIG9mIGNvZGVcbmZyb20gdGhlIHRvcCkuXG5cbldoZW4gYW4gZXhjZXB0aW9uIGlzIG5vdCBoYW5kbGVkIGF0IGFsbCwgdGhlIGludGVycHJldGVyIHRlcm1pbmF0ZXNcbmV4ZWN1dGlvbiBvZiB0aGUgcHJvZ3JhbSwgb3IgcmV0dXJucyB0byBpdHMgaW50ZXJhY3RpdmUgbWFpbiBsb29wLiAgSW5cbmVpdGhlciBjYXNlLCBpdCBwcmludHMgYSBzdGFjayBiYWNrdHJhY2UsIGV4Y2VwdCB3aGVuIHRoZSBleGNlcHRpb24gaXNcbmBgU3lzdGVtRXhpdGBgLlxuXG5FeGNlcHRpb25zIGFyZSBpZGVudGlmaWVkIGJ5IGNsYXNzIGluc3RhbmNlcy4gIFRoZSBgYGV4Y2VwdGBgIGNsYXVzZVxuaXMgc2VsZWN0ZWQgZGVwZW5kaW5nIG9uIHRoZSBjbGFzcyBvZiB0aGUgaW5zdGFuY2U6IGl0IG11c3QgcmVmZXJlbmNlXG50aGUgY2xhc3Mgb2YgdGhlIGluc3RhbmNlIG9yIGEgYmFzZSBjbGFzcyB0aGVyZW9mLiAgVGhlIGluc3RhbmNlIGNhblxuYmUgcmVjZWl2ZWQgYnkgdGhlIGhhbmRsZXIgYW5kIGNhbiBjYXJyeSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0XG50aGUgZXhjZXB0aW9uYWwgY29uZGl0aW9uLlxuXG5FeGNlcHRpb25zIGNhbiBhbHNvIGJlIGlkZW50aWZpZWQgYnkgc3RyaW5ncywgaW4gd2hpY2ggY2FzZSB0aGVcbmBgZXhjZXB0YGAgY2xhdXNlIGlzIHNlbGVjdGVkIGJ5IG9iamVjdCBpZGVudGl0eS4gIEFuIGFyYml0cmFyeSB2YWx1ZVxuY2FuIGJlIHJhaXNlZCBhbG9uZyB3aXRoIHRoZSBpZGVudGlmeWluZyBzdHJpbmcgd2hpY2ggY2FuIGJlIHBhc3NlZCB0b1xudGhlIGhhbmRsZXIuXG5cbk5vdGU6IE1lc3NhZ2VzIHRvIGV4Y2VwdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBQeXRob24gQVBJLiAgVGhlaXJcbiAgY29udGVudHMgbWF5IGNoYW5nZSBmcm9tIG9uZSB2ZXJzaW9uIG9mIFB5dGhvbiB0byB0aGUgbmV4dCB3aXRob3V0XG4gIHdhcm5pbmcgYW5kIHNob3VsZCBub3QgYmUgcmVsaWVkIG9uIGJ5IGNvZGUgd2hpY2ggd2lsbCBydW4gdW5kZXJcbiAgbXVsdGlwbGUgdmVyc2lvbnMgb2YgdGhlIGludGVycHJldGVyLlxuXG5TZWUgYWxzbyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGBgdHJ5YGAgc3RhdGVtZW50IGluIHNlY3Rpb24gKlRoZSB0cnlcbnN0YXRlbWVudCogYW5kIGBgcmFpc2VgYCBzdGF0ZW1lbnQgaW4gc2VjdGlvbiAqVGhlIHJhaXNlIHN0YXRlbWVudCouXG5cbi1bIEZvb3Rub3RlcyBdLVxuXG5bMV0gVGhpcyBsaW1pdGF0aW9uIG9jY3VycyBiZWNhdXNlIHRoZSBjb2RlIHRoYXQgaXMgZXhlY3V0ZWQgYnkgdGhlc2VcbiAgICBvcGVyYXRpb25zIGlzIG5vdCBhdmFpbGFibGUgYXQgdGhlIHRpbWUgdGhlIG1vZHVsZSBpcyBjb21waWxlZC5cbicsCi0gJ2V4cHJsaXN0cyc6IHUnXG5FeHByZXNzaW9uIGxpc3RzXG4qKioqKioqKioqKioqKioqXG5cbiAgIGV4cHJlc3Npb25fbGlzdCA6Oj0gZXhwcmVzc2lvbiAoICIsIiBleHByZXNzaW9uICkqIFsiLCJdXG5cbkFuIGV4cHJlc3Npb24gbGlzdCBjb250YWluaW5nIGF0IGxlYXN0IG9uZSBjb21tYSB5aWVsZHMgYSB0dXBsZS4gIFRoZVxubGVuZ3RoIG9mIHRoZSB0dXBsZSBpcyB0aGUgbnVtYmVyIG9mIGV4cHJlc3Npb25zIGluIHRoZSBsaXN0LiAgVGhlXG5leHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodC5cblxuVGhlIHRyYWlsaW5nIGNvbW1hIGlzIHJlcXVpcmVkIG9ubHkgdG8gY3JlYXRlIGEgc2luZ2xlIHR1cGxlIChhLmsuYS4gYVxuKnNpbmdsZXRvbiopOyBpdCBpcyBvcHRpb25hbCBpbiBhbGwgb3RoZXIgY2FzZXMuICBBIHNpbmdsZSBleHByZXNzaW9uXG53aXRob3V0IGEgdHJhaWxpbmcgY29tbWEgZG9lc25cJ3QgY3JlYXRlIGEgdHVwbGUsIGJ1dCByYXRoZXIgeWllbGRzIHRoZVxudmFsdWUgb2YgdGhhdCBleHByZXNzaW9uLiAoVG8gY3JlYXRlIGFuIGVtcHR5IHR1cGxlLCB1c2UgYW4gZW1wdHkgcGFpclxub2YgcGFyZW50aGVzZXM6IGBgKClgYC4pXG4nLAotICdmbG9hdGluZyc6IHUnXG5GbG9hdGluZyBwb2ludCBsaXRlcmFsc1xuKioqKioqKioqKioqKioqKioqKioqKipcblxuRmxvYXRpbmcgcG9pbnQgbGl0ZXJhbHMgYXJlIGRlc2NyaWJlZCBieSB0aGUgZm9sbG93aW5nIGxleGljYWxcbmRlZmluaXRpb25zOlxuXG4gICBmbG9hdG51bWJlciAgIDo6PSBwb2ludGZsb2F0IHwgZXhwb25lbnRmbG9hdFxuICAgcG9pbnRmbG9hdCAgICA6Oj0gW2ludHBhcnRdIGZyYWN0aW9uIHwgaW50cGFydCAiLiJcbiAgIGV4cG9uZW50ZmxvYXQgOjo9IChpbnRwYXJ0IHwgcG9pbnRmbG9hdCkgZXhwb25lbnRcbiAgIGludHBhcnQgICAgICAgOjo9IGRpZ2l0K1xuICAgZnJhY3Rpb24gICAgICA6Oj0gIi4iIGRpZ2l0K1xuICAgZXhwb25lbnQgICAgICA6Oj0gKCJlIiB8ICJFIikgWyIrIiB8ICItIl0gZGlnaXQrXG5cbk5vdGUgdGhhdCB0aGUgaW50ZWdlciBhbmQgZXhwb25lbnQgcGFydHMgb2YgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBjYW5cbmxvb2sgbGlrZSBvY3RhbCBpbnRlZ2VycywgYnV0IGFyZSBpbnRlcnByZXRlZCB1c2luZyByYWRpeCAxMC4gIEZvclxuZXhhbXBsZSwgYGAwNzdlMDEwYGAgaXMgbGVnYWwsIGFuZCBkZW5vdGVzIHRoZSBzYW1lIG51bWJlciBhc1xuYGA3N2UxMGBgLiBUaGUgYWxsb3dlZCByYW5nZSBvZiBmbG9hdGluZyBwb2ludCBsaXRlcmFscyBpc1xuaW1wbGVtZW50YXRpb24tZGVwZW5kZW50LiBTb21lIGV4YW1wbGVzIG9mIGZsb2F0aW5nIHBvaW50IGxpdGVyYWxzOlxuXG4gICAzLjE0ICAgIDEwLiAgICAuMDAxICAgIDFlMTAwICAgIDMuMTRlLTEwICAgIDBlMFxuXG5Ob3RlIHRoYXQgbnVtZXJpYyBsaXRlcmFscyBkbyBub3QgaW5jbHVkZSBhIHNpZ247IGEgcGhyYXNlIGxpa2UgYGAtMWBgXG5pcyBhY3R1YWxseSBhbiBleHByZXNzaW9uIGNvbXBvc2VkIG9mIHRoZSB1bmFyeSBvcGVyYXRvciBgYC1gYCBhbmQgdGhlXG5saXRlcmFsIGBgMWBgLlxuJywKLSAnZm9yJzogdSdcblRoZSBgYGZvcmBgIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqXG5cblRoZSBgYGZvcmBgIHN0YXRlbWVudCBpcyB1c2VkIHRvIGl0ZXJhdGUgb3ZlciB0aGUgZWxlbWVudHMgb2YgYVxuc2VxdWVuY2UgKHN1Y2ggYXMgYSBzdHJpbmcsIHR1cGxlIG9yIGxpc3QpIG9yIG90aGVyIGl0ZXJhYmxlIG9iamVjdDpcblxuICAgZm9yX3N0bXQgOjo9ICJmb3IiIHRhcmdldF9saXN0ICJpbiIgZXhwcmVzc2lvbl9saXN0ICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuXG5UaGUgZXhwcmVzc2lvbiBsaXN0IGlzIGV2YWx1YXRlZCBvbmNlOyBpdCBzaG91bGQgeWllbGQgYW4gaXRlcmFibGVcbm9iamVjdC4gIEFuIGl0ZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIHRoZSByZXN1bHQgb2YgdGhlXG5gYGV4cHJlc3Npb25fbGlzdGBgLiAgVGhlIHN1aXRlIGlzIHRoZW4gZXhlY3V0ZWQgb25jZSBmb3IgZWFjaCBpdGVtXG5wcm92aWRlZCBieSB0aGUgaXRlcmF0b3IsIGluIHRoZSBvcmRlciBvZiBhc2NlbmRpbmcgaW5kaWNlcy4gIEVhY2hcbml0ZW0gaW4gdHVybiBpcyBhc3NpZ25lZCB0byB0aGUgdGFyZ2V0IGxpc3QgdXNpbmcgdGhlIHN0YW5kYXJkIHJ1bGVzXG5mb3IgYXNzaWdubWVudHMsIGFuZCB0aGVuIHRoZSBzdWl0ZSBpcyBleGVjdXRlZC4gIFdoZW4gdGhlIGl0ZW1zIGFyZVxuZXhoYXVzdGVkICh3aGljaCBpcyBpbW1lZGlhdGVseSB3aGVuIHRoZSBzZXF1ZW5jZSBpcyBlbXB0eSksIHRoZSBzdWl0ZVxuaW4gdGhlIGBgZWxzZWBgIGNsYXVzZSwgaWYgcHJlc2VudCwgaXMgZXhlY3V0ZWQsIGFuZCB0aGUgbG9vcFxudGVybWluYXRlcy5cblxuQSBgYGJyZWFrYGAgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSB0ZXJtaW5hdGVzIHRoZSBsb29wXG53aXRob3V0IGV4ZWN1dGluZyB0aGUgYGBlbHNlYGAgY2xhdXNlXCdzIHN1aXRlLiAgQSBgYGNvbnRpbnVlYGBcbnN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgc2tpcHMgdGhlIHJlc3Qgb2YgdGhlIHN1aXRlIGFuZFxuY29udGludWVzIHdpdGggdGhlIG5leHQgaXRlbSwgb3Igd2l0aCB0aGUgYGBlbHNlYGAgY2xhdXNlIGlmIHRoZXJlIHdhc1xubm8gbmV4dCBpdGVtLlxuXG5UaGUgc3VpdGUgbWF5IGFzc2lnbiB0byB0aGUgdmFyaWFibGUocykgaW4gdGhlIHRhcmdldCBsaXN0OyB0aGlzIGRvZXNcbm5vdCBhZmZlY3QgdGhlIG5leHQgaXRlbSBhc3NpZ25lZCB0byBpdC5cblxuVGhlIHRhcmdldCBsaXN0IGlzIG5vdCBkZWxldGVkIHdoZW4gdGhlIGxvb3AgaXMgZmluaXNoZWQsIGJ1dCBpZiB0aGVcbnNlcXVlbmNlIGlzIGVtcHR5LCBpdCB3aWxsIG5vdCBoYXZlIGJlZW4gYXNzaWduZWQgdG8gYXQgYWxsIGJ5IHRoZVxubG9vcC4gIEhpbnQ6IHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYHJhbmdlKClgYCByZXR1cm5zIGEgc2VxdWVuY2Ugb2ZcbmludGVnZXJzIHN1aXRhYmxlIHRvIGVtdWxhdGUgdGhlIGVmZmVjdCBvZiBQYXNjYWxcJ3MgYGBmb3IgaSA6PSBhIHRvIGJcbmRvYGA7IGUuZy4sIGBgcmFuZ2UoMylgYCByZXR1cm5zIHRoZSBsaXN0IGBgWzAsIDEsIDJdYGAuXG5cbk5vdGU6IFRoZXJlIGlzIGEgc3VidGxldHkgd2hlbiB0aGUgc2VxdWVuY2UgaXMgYmVpbmcgbW9kaWZpZWQgYnkgdGhlIGxvb3BcbiAgKHRoaXMgY2FuIG9ubHkgb2NjdXIgZm9yIG11dGFibGUgc2VxdWVuY2VzLCBpLmUuIGxpc3RzKS4gQW4gaW50ZXJuYWxcbiAgY291bnRlciBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggaXRlbSBpcyB1c2VkIG5leHQsIGFuZCB0aGlzXG4gIGlzIGluY3JlbWVudGVkIG9uIGVhY2ggaXRlcmF0aW9uLiAgV2hlbiB0aGlzIGNvdW50ZXIgaGFzIHJlYWNoZWQgdGhlXG4gIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UgdGhlIGxvb3AgdGVybWluYXRlcy4gIFRoaXMgbWVhbnMgdGhhdCBpZiB0aGVcbiAgc3VpdGUgZGVsZXRlcyB0aGUgY3VycmVudCAob3IgYSBwcmV2aW91cykgaXRlbSBmcm9tIHRoZSBzZXF1ZW5jZSxcbiAgdGhlIG5leHQgaXRlbSB3aWxsIGJlIHNraXBwZWQgKHNpbmNlIGl0IGdldHMgdGhlIGluZGV4IG9mIHRoZVxuICBjdXJyZW50IGl0ZW0gd2hpY2ggaGFzIGFscmVhZHkgYmVlbiB0cmVhdGVkKS4gIExpa2V3aXNlLCBpZiB0aGVcbiAgc3VpdGUgaW5zZXJ0cyBhbiBpdGVtIGluIHRoZSBzZXF1ZW5jZSBiZWZvcmUgdGhlIGN1cnJlbnQgaXRlbSwgdGhlXG4gIGN1cnJlbnQgaXRlbSB3aWxsIGJlIHRyZWF0ZWQgYWdhaW4gdGhlIG5leHQgdGltZSB0aHJvdWdoIHRoZSBsb29wLlxuICBUaGlzIGNhbiBsZWFkIHRvIG5hc3R5IGJ1Z3MgdGhhdCBjYW4gYmUgYXZvaWRlZCBieSBtYWtpbmcgYVxuICB0ZW1wb3JhcnkgY29weSB1c2luZyBhIHNsaWNlIG9mIHRoZSB3aG9sZSBzZXF1ZW5jZSwgZS5nLixcblxuICAgICBmb3IgeCBpbiBhWzpdOlxuICAgICAgICAgaWYgeCA8IDA6IGEucmVtb3ZlKHgpXG4nLAotICdmb3JtYXRzdHJpbmdzJzogdSdcbkZvcm1hdCBTdHJpbmcgU3ludGF4XG4qKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgYGBzdHIuZm9ybWF0KClgYCBtZXRob2QgYW5kIHRoZSBgYEZvcm1hdHRlcmBgIGNsYXNzIHNoYXJlIHRoZSBzYW1lXG5zeW50YXggZm9yIGZvcm1hdCBzdHJpbmdzIChhbHRob3VnaCBpbiB0aGUgY2FzZSBvZiBgYEZvcm1hdHRlcmBgLFxuc3ViY2xhc3NlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBmb3JtYXQgc3RyaW5nIHN5bnRheCkuXG5cbkZvcm1hdCBzdHJpbmdzIGNvbnRhaW4gInJlcGxhY2VtZW50IGZpZWxkcyIgc3Vycm91bmRlZCBieSBjdXJseSBicmFjZXNcbmBge31gYC4gQW55dGhpbmcgdGhhdCBpcyBub3QgY29udGFpbmVkIGluIGJyYWNlcyBpcyBjb25zaWRlcmVkIGxpdGVyYWxcbnRleHQsIHdoaWNoIGlzIGNvcGllZCB1bmNoYW5nZWQgdG8gdGhlIG91dHB1dC4gIElmIHlvdSBuZWVkIHRvIGluY2x1ZGVcbmEgYnJhY2UgY2hhcmFjdGVyIGluIHRoZSBsaXRlcmFsIHRleHQsIGl0IGNhbiBiZSBlc2NhcGVkIGJ5IGRvdWJsaW5nOlxuYGB7e2BgIGFuZCBgYH19YGAuXG5cblRoZSBncmFtbWFyIGZvciBhIHJlcGxhY2VtZW50IGZpZWxkIGlzIGFzIGZvbGxvd3M6XG5cbiAgICAgIHJlcGxhY2VtZW50X2ZpZWxkIDo6PSAieyIgW2ZpZWxkX25hbWVdIFsiISIgY29udmVyc2lvbl0gWyI6IiBmb3JtYXRfc3BlY10gIn0iXG4gICAgICBmaWVsZF9uYW1lICAgICAgICA6Oj0gYXJnX25hbWUgKCIuIiBhdHRyaWJ1dGVfbmFtZSB8ICJbIiBlbGVtZW50X2luZGV4ICJdIikqXG4gICAgICBhcmdfbmFtZSAgICAgICAgICA6Oj0gW2lkZW50aWZpZXIgfCBpbnRlZ2VyXVxuICAgICAgYXR0cmlidXRlX25hbWUgICAgOjo9IGlkZW50aWZpZXJcbiAgICAgIGVsZW1lbnRfaW5kZXggICAgIDo6PSBpbnRlZ2VyIHwgaW5kZXhfc3RyaW5nXG4gICAgICBpbmRleF9zdHJpbmcgICAgICA6Oj0gPGFueSBzb3VyY2UgY2hhcmFjdGVyIGV4Y2VwdCAiXSI+ICtcbiAgICAgIGNvbnZlcnNpb24gICAgICAgIDo6PSAiciIgfCAicyJcbiAgICAgIGZvcm1hdF9zcGVjICAgICAgIDo6PSA8ZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24+XG5cbkluIGxlc3MgZm9ybWFsIHRlcm1zLCB0aGUgcmVwbGFjZW1lbnQgZmllbGQgY2FuIHN0YXJ0IHdpdGggYVxuKmZpZWxkX25hbWUqIHRoYXQgc3BlY2lmaWVzIHRoZSBvYmplY3Qgd2hvc2UgdmFsdWUgaXMgdG8gYmUgZm9ybWF0dGVkXG5hbmQgaW5zZXJ0ZWQgaW50byB0aGUgb3V0cHV0IGluc3RlYWQgb2YgdGhlIHJlcGxhY2VtZW50IGZpZWxkLiBUaGVcbipmaWVsZF9uYW1lKiBpcyBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgICpjb252ZXJzaW9uKiBmaWVsZCwgd2hpY2ggaXNcbnByZWNlZGVkIGJ5IGFuIGV4Y2xhbWF0aW9uIHBvaW50IGBgXCchXCdgYCwgYW5kIGEgKmZvcm1hdF9zcGVjKiwgd2hpY2hcbmlzIHByZWNlZGVkIGJ5IGEgY29sb24gYGBcJzpcJ2BgLiAgVGhlc2Ugc3BlY2lmeSBhIG5vbi1kZWZhdWx0IGZvcm1hdFxuZm9yIHRoZSByZXBsYWNlbWVudCB2YWx1ZS5cblxuU2VlIGFsc28gdGhlICpGb3JtYXQgU3BlY2lmaWNhdGlvbiBNaW5pLUxhbmd1YWdlKiBzZWN0aW9uLlxuXG5UaGUgKmZpZWxkX25hbWUqIGl0c2VsZiBiZWdpbnMgd2l0aCBhbiAqYXJnX25hbWUqIHRoYXQgaXMgZWl0aGVyXG5laXRoZXIgYSBudW1iZXIgb3IgYSBrZXl3b3JkLiAgSWYgaXRcJ3MgYSBudW1iZXIsIGl0IHJlZmVycyB0byBhXG5wb3NpdGlvbmFsIGFyZ3VtZW50LCBhbmQgaWYgaXRcJ3MgYSBrZXl3b3JkLCBpdCByZWZlcnMgdG8gYSBuYW1lZFxua2V5d29yZCBhcmd1bWVudC4gIElmIHRoZSBudW1lcmljYWwgYXJnX25hbWVzIGluIGEgZm9ybWF0IHN0cmluZyBhcmVcbjAsIDEsIDIsIC4uLiBpbiBzZXF1ZW5jZSwgdGhleSBjYW4gYWxsIGJlIG9taXR0ZWQgKG5vdCBqdXN0IHNvbWUpIGFuZFxudGhlIG51bWJlcnMgMCwgMSwgMiwgLi4uIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbnNlcnRlZCBpbiB0aGF0IG9yZGVyLlxuVGhlICphcmdfbmFtZSogY2FuIGJlIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIgb2YgaW5kZXggb3IgYXR0cmlidXRlXG5leHByZXNzaW9ucy4gQW4gZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSBgYFwnLm5hbWVcJ2BgIHNlbGVjdHMgdGhlIG5hbWVkXG5hdHRyaWJ1dGUgdXNpbmcgYGBnZXRhdHRyKClgYCwgd2hpbGUgYW4gZXhwcmVzc2lvbiBvZiB0aGUgZm9ybVxuYGBcJ1tpbmRleF1cJ2BgIGRvZXMgYW4gaW5kZXggbG9va3VwIHVzaW5nIGBgX19nZXRpdGVtX18oKWBgLlxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMi43OiBUaGUgcG9zaXRpb25hbCBhcmd1bWVudCBzcGVjaWZpZXJzIGNhbiBiZVxub21pdHRlZCwgc28gYGBcJ3t9IHt9XCdgYCBpcyBlcXVpdmFsZW50IHRvIGBgXCd7MH0gezF9XCdgYC5cblxuU29tZSBzaW1wbGUgZm9ybWF0IHN0cmluZyBleGFtcGxlczpcblxuICAgIkZpcnN0LCB0aG91IHNoYWx0IGNvdW50IHRvIHswfSIgIyBSZWZlcmVuY2VzIGZpcnN0IHBvc2l0aW9uYWwgYXJndW1lbnRcbiAgICJCcmluZyBtZSBhIHt9IiAgICAgICAgICAgICAgICAgICMgSW1wbGljaXRseSByZWZlcmVuY2VzIHRoZSBmaXJzdCBwb3NpdGlvbmFsIGFyZ3VtZW50XG4gICAiRnJvbSB7fSB0byB7fSIgICAgICAgICAgICAgICAgICAjIFNhbWUgYXMgIkZyb20gezB9IHRvIHsxfSJcbiAgICJNeSBxdWVzdCBpcyB7bmFtZX0iICAgICAgICAgICAgICMgUmVmZXJlbmNlcyBrZXl3b3JkIGFyZ3VtZW50IFwnbmFtZVwnXG4gICAiV2VpZ2h0IGluIHRvbnMgezAud2VpZ2h0fSIgICAgICAjIFwnd2VpZ2h0XCcgYXR0cmlidXRlIG9mIGZpcnN0IHBvc2l0aW9uYWwgYXJnXG4gICAiVW5pdHMgZGVzdHJveWVkOiB7cGxheWVyc1swXX0iICAjIEZpcnN0IGVsZW1lbnQgb2Yga2V5d29yZCBhcmd1bWVudCBcJ3BsYXllcnNcJy5cblxuVGhlICpjb252ZXJzaW9uKiBmaWVsZCBjYXVzZXMgYSB0eXBlIGNvZXJjaW9uIGJlZm9yZSBmb3JtYXR0aW5nLlxuTm9ybWFsbHksIHRoZSBqb2Igb2YgZm9ybWF0dGluZyBhIHZhbHVlIGlzIGRvbmUgYnkgdGhlXG5gYF9fZm9ybWF0X18oKWBgIG1ldGhvZCBvZiB0aGUgdmFsdWUgaXRzZWxmLiAgSG93ZXZlciwgaW4gc29tZSBjYXNlc1xuaXQgaXMgZGVzaXJhYmxlIHRvIGZvcmNlIGEgdHlwZSB0byBiZSBmb3JtYXR0ZWQgYXMgYSBzdHJpbmcsXG5vdmVycmlkaW5nIGl0cyBvd24gZGVmaW5pdGlvbiBvZiBmb3JtYXR0aW5nLiAgQnkgY29udmVydGluZyB0aGUgdmFsdWVcbnRvIGEgc3RyaW5nIGJlZm9yZSBjYWxsaW5nIGBgX19mb3JtYXRfXygpYGAsIHRoZSBub3JtYWwgZm9ybWF0dGluZ1xubG9naWMgaXMgYnlwYXNzZWQuXG5cblR3byBjb252ZXJzaW9uIGZsYWdzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkOiBgYFwnIXNcJ2BgIHdoaWNoIGNhbGxzXG5gYHN0cigpYGAgb24gdGhlIHZhbHVlLCBhbmQgYGBcJyFyXCdgYCB3aGljaCBjYWxscyBgYHJlcHIoKWBgLlxuXG5Tb21lIGV4YW1wbGVzOlxuXG4gICAiSGFyb2xkXCdzIGEgY2xldmVyIHswIXN9IiAgICAgICAgIyBDYWxscyBzdHIoKSBvbiB0aGUgYXJndW1lbnQgZmlyc3RcbiAgICJCcmluZyBvdXQgdGhlIGhvbHkge25hbWUhcn0iICAgICMgQ2FsbHMgcmVwcigpIG9uIHRoZSBhcmd1bWVudCBmaXJzdFxuXG5UaGUgKmZvcm1hdF9zcGVjKiBmaWVsZCBjb250YWlucyBhIHNwZWNpZmljYXRpb24gb2YgaG93IHRoZSB2YWx1ZVxuc2hvdWxkIGJlIHByZXNlbnRlZCwgaW5jbHVkaW5nIHN1Y2ggZGV0YWlscyBhcyBmaWVsZCB3aWR0aCwgYWxpZ25tZW50LFxucGFkZGluZywgZGVjaW1hbCBwcmVjaXNpb24gYW5kIHNvIG9uLiAgRWFjaCB2YWx1ZSB0eXBlIGNhbiBkZWZpbmUgaXRzXG5vd24gImZvcm1hdHRpbmcgbWluaS1sYW5ndWFnZSIgb3IgaW50ZXJwcmV0YXRpb24gb2YgdGhlICpmb3JtYXRfc3BlYyouXG5cbk1vc3QgYnVpbHQtaW4gdHlwZXMgc3VwcG9ydCBhIGNvbW1vbiBmb3JtYXR0aW5nIG1pbmktbGFuZ3VhZ2UsIHdoaWNoXG5pcyBkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbi5cblxuQSAqZm9ybWF0X3NwZWMqIGZpZWxkIGNhbiBhbHNvIGluY2x1ZGUgbmVzdGVkIHJlcGxhY2VtZW50IGZpZWxkc1xud2l0aGluIGl0LiBUaGVzZSBuZXN0ZWQgcmVwbGFjZW1lbnQgZmllbGRzIGNhbiBjb250YWluIG9ubHkgYSBmaWVsZFxubmFtZTsgY29udmVyc2lvbiBmbGFncyBhbmQgZm9ybWF0IHNwZWNpZmljYXRpb25zIGFyZSBub3QgYWxsb3dlZC4gIFRoZVxucmVwbGFjZW1lbnQgZmllbGRzIHdpdGhpbiB0aGUgZm9ybWF0X3NwZWMgYXJlIHN1YnN0aXR1dGVkIGJlZm9yZSB0aGVcbipmb3JtYXRfc3BlYyogc3RyaW5nIGlzIGludGVycHJldGVkLiBUaGlzIGFsbG93cyB0aGUgZm9ybWF0dGluZyBvZiBhXG52YWx1ZSB0byBiZSBkeW5hbWljYWxseSBzcGVjaWZpZWQuXG5cblNlZSB0aGUgKkZvcm1hdCBleGFtcGxlcyogc2VjdGlvbiBmb3Igc29tZSBleGFtcGxlcy5cblxuXG5Gb3JtYXQgU3BlY2lmaWNhdGlvbiBNaW5pLUxhbmd1YWdlXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiJGb3JtYXQgc3BlY2lmaWNhdGlvbnMiIGFyZSB1c2VkIHdpdGhpbiByZXBsYWNlbWVudCBmaWVsZHMgY29udGFpbmVkXG53aXRoaW4gYSBmb3JtYXQgc3RyaW5nIHRvIGRlZmluZSBob3cgaW5kaXZpZHVhbCB2YWx1ZXMgYXJlIHByZXNlbnRlZFxuKHNlZSAqRm9ybWF0IFN0cmluZyBTeW50YXgqKS4gIFRoZXkgY2FuIGFsc28gYmUgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZVxuYnVpbHQtaW4gYGBmb3JtYXQoKWBgIGZ1bmN0aW9uLiAgRWFjaCBmb3JtYXR0YWJsZSB0eXBlIG1heSBkZWZpbmUgaG93XG50aGUgZm9ybWF0IHNwZWNpZmljYXRpb24gaXMgdG8gYmUgaW50ZXJwcmV0ZWQuXG5cbk1vc3QgYnVpbHQtaW4gdHlwZXMgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBmb3IgZm9ybWF0XG5zcGVjaWZpY2F0aW9ucywgYWx0aG91Z2ggc29tZSBvZiB0aGUgZm9ybWF0dGluZyBvcHRpb25zIGFyZSBvbmx5XG5zdXBwb3J0ZWQgYnkgdGhlIG51bWVyaWMgdHlwZXMuXG5cbkEgZ2VuZXJhbCBjb252ZW50aW9uIGlzIHRoYXQgYW4gZW1wdHkgZm9ybWF0IHN0cmluZyAoYGAiImBgKSBwcm9kdWNlc1xudGhlIHNhbWUgcmVzdWx0IGFzIGlmIHlvdSBoYWQgY2FsbGVkIGBgc3RyKClgYCBvbiB0aGUgdmFsdWUuIEEgbm9uLVxuZW1wdHkgZm9ybWF0IHN0cmluZyB0eXBpY2FsbHkgbW9kaWZpZXMgdGhlIHJlc3VsdC5cblxuVGhlIGdlbmVyYWwgZm9ybSBvZiBhICpzdGFuZGFyZCBmb3JtYXQgc3BlY2lmaWVyKiBpczpcblxuICAgZm9ybWF0X3NwZWMgOjo9IFtbZmlsbF1hbGlnbl1bc2lnbl1bI11bMF1bd2lkdGhdWyxdWy5wcmVjaXNpb25dW3R5cGVdXG4gICBmaWxsICAgICAgICA6Oj0gPGEgY2hhcmFjdGVyIG90aGVyIHRoYW4gXCd9XCc+XG4gICBhbGlnbiAgICAgICA6Oj0gIjwiIHwgIj4iIHwgIj0iIHwgIl4iXG4gICBzaWduICAgICAgICA6Oj0gIisiIHwgIi0iIHwgIiAiXG4gICB3aWR0aCAgICAgICA6Oj0gaW50ZWdlclxuICAgcHJlY2lzaW9uICAgOjo9IGludGVnZXJcbiAgIHR5cGUgICAgICAgIDo6PSAiYiIgfCAiYyIgfCAiZCIgfCAiZSIgfCAiRSIgfCAiZiIgfCAiRiIgfCAiZyIgfCAiRyIgfCAibiIgfCAibyIgfCAicyIgfCAieCIgfCAiWCIgfCAiJSJcblxuVGhlICpmaWxsKiBjaGFyYWN0ZXIgY2FuIGJlIGFueSBjaGFyYWN0ZXIgb3RoZXIgdGhhbiBcJ3tcJyBvciBcJ31cJy4gIFRoZVxucHJlc2VuY2Ugb2YgYSBmaWxsIGNoYXJhY3RlciBpcyBzaWduYWxlZCBieSB0aGUgY2hhcmFjdGVyIGZvbGxvd2luZ1xuaXQsIHdoaWNoIG11c3QgYmUgb25lIG9mIHRoZSBhbGlnbm1lbnQgb3B0aW9ucy4gIElmIHRoZSBzZWNvbmRcbmNoYXJhY3RlciBvZiAqZm9ybWF0X3NwZWMqIGlzIG5vdCBhIHZhbGlkIGFsaWdubWVudCBvcHRpb24sIHRoZW4gaXQgaXNcbmFzc3VtZWQgdGhhdCBib3RoIHRoZSBmaWxsIGNoYXJhY3RlciBhbmQgdGhlIGFsaWdubWVudCBvcHRpb24gYXJlXG5hYnNlbnQuXG5cblRoZSBtZWFuaW5nIG9mIHRoZSB2YXJpb3VzIGFsaWdubWVudCBvcHRpb25zIGlzIGFzIGZvbGxvd3M6XG5cbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IE9wdGlvbiAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKz09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbiAgIHwgYGBcJzxcJ2BgICAgfCBGb3JjZXMgdGhlIGZpZWxkIHRvIGJlIGxlZnQtYWxpZ25lZCB3aXRoaW4gdGhlIGF2YWlsYWJsZSAgIHxcbiAgIHwgICAgICAgICAgIHwgc3BhY2UgKHRoaXMgaXMgdGhlIGRlZmF1bHQgZm9yIG1vc3Qgb2JqZWN0cykuICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBgYFwnPlwnYGAgICB8IEZvcmNlcyB0aGUgZmllbGQgdG8gYmUgcmlnaHQtYWxpZ25lZCB3aXRoaW4gdGhlIGF2YWlsYWJsZSAgfFxuICAgfCAgICAgICAgICAgfCBzcGFjZSAodGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgbnVtYmVycykuICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IGBgXCc9XCdgYCAgIHwgRm9yY2VzIHRoZSBwYWRkaW5nIHRvIGJlIHBsYWNlZCBhZnRlciB0aGUgc2lnbiAoaWYgYW55KSAgICB8XG4gICB8ICAgICAgICAgICB8IGJ1dCBiZWZvcmUgdGhlIGRpZ2l0cy4gIFRoaXMgaXMgdXNlZCBmb3IgcHJpbnRpbmcgZmllbGRzICAgfFxuICAgfCAgICAgICAgICAgfCBpbiB0aGUgZm9ybSBcJyswMDAwMDAxMjBcJy4gVGhpcyBhbGlnbm1lbnQgb3B0aW9uIGlzIG9ubHkgICAgfFxuICAgfCAgICAgICAgICAgfCB2YWxpZCBmb3IgbnVtZXJpYyB0eXBlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IGBgXCdeXCdgYCAgIHwgRm9yY2VzIHRoZSBmaWVsZCB0byBiZSBjZW50ZXJlZCB3aXRoaW4gdGhlIGF2YWlsYWJsZSAgICAgICB8XG4gICB8ICAgICAgICAgICB8IHNwYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuTm90ZSB0aGF0IHVubGVzcyBhIG1pbmltdW0gZmllbGQgd2lkdGggaXMgZGVmaW5lZCwgdGhlIGZpZWxkIHdpZHRoXG53aWxsIGFsd2F5cyBiZSB0aGUgc2FtZSBzaXplIGFzIHRoZSBkYXRhIHRvIGZpbGwgaXQsIHNvIHRoYXQgdGhlXG5hbGlnbm1lbnQgb3B0aW9uIGhhcyBubyBtZWFuaW5nIGluIHRoaXMgY2FzZS5cblxuVGhlICpzaWduKiBvcHRpb24gaXMgb25seSB2YWxpZCBmb3IgbnVtYmVyIHR5cGVzLCBhbmQgY2FuIGJlIG9uZSBvZlxudGhlIGZvbGxvd2luZzpcblxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgT3B0aW9uICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuICAgfCBgYFwnK1wnYGAgICB8IGluZGljYXRlcyB0aGF0IGEgc2lnbiBzaG91bGQgYmUgdXNlZCBmb3IgYm90aCBwb3NpdGl2ZSBhcyAgfFxuICAgfCAgICAgICAgICAgfCB3ZWxsIGFzIG5lZ2F0aXZlIG51bWJlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IGBgXCctXCdgYCAgIHwgaW5kaWNhdGVzIHRoYXQgYSBzaWduIHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIG5lZ2F0aXZlICAgICB8XG4gICB8ICAgICAgICAgICB8IG51bWJlcnMgKHRoaXMgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IpLiAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgc3BhY2UgICAgIHwgaW5kaWNhdGVzIHRoYXQgYSBsZWFkaW5nIHNwYWNlIHNob3VsZCBiZSB1c2VkIG9uIHBvc2l0aXZlICB8XG4gICB8ICAgICAgICAgICB8IG51bWJlcnMsIGFuZCBhIG1pbnVzIHNpZ24gb24gbmVnYXRpdmUgbnVtYmVycy4gICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuVGhlIGBgXCcjXCdgYCBvcHRpb24gaXMgb25seSB2YWxpZCBmb3IgaW50ZWdlcnMsIGFuZCBvbmx5IGZvciBiaW5hcnksXG5vY3RhbCwgb3IgaGV4YWRlY2ltYWwgb3V0cHV0LiAgSWYgcHJlc2VudCwgaXQgc3BlY2lmaWVzIHRoYXQgdGhlXG5vdXRwdXQgd2lsbCBiZSBwcmVmaXhlZCBieSBgYFwnMGJcJ2BgLCBgYFwnMG9cJ2BgLCBvciBgYFwnMHhcJ2BgLFxucmVzcGVjdGl2ZWx5LlxuXG5UaGUgYGBcJyxcJ2BgIG9wdGlvbiBzaWduYWxzIHRoZSB1c2Ugb2YgYSBjb21tYSBmb3IgYSB0aG91c2FuZHNcbnNlcGFyYXRvci4gRm9yIGEgbG9jYWxlIGF3YXJlIHNlcGFyYXRvciwgdXNlIHRoZSBgYFwnblwnYGAgaW50ZWdlclxucHJlc2VudGF0aW9uIHR5cGUgaW5zdGVhZC5cblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNzogQWRkZWQgdGhlIGBgXCcsXCdgYCBvcHRpb24gKHNlZSBhbHNvICoqUEVQXG4zNzgqKikuXG5cbip3aWR0aCogaXMgYSBkZWNpbWFsIGludGVnZXIgZGVmaW5pbmcgdGhlIG1pbmltdW0gZmllbGQgd2lkdGguICBJZiBub3RcbnNwZWNpZmllZCwgdGhlbiB0aGUgZmllbGQgd2lkdGggd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBjb250ZW50LlxuXG5JZiB0aGUgKndpZHRoKiBmaWVsZCBpcyBwcmVjZWRlZCBieSBhIHplcm8gKGBgXCcwXCdgYCkgY2hhcmFjdGVyLCB0aGlzXG5lbmFibGVzIHplcm8tcGFkZGluZy4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byBhbiAqYWxpZ25tZW50KiB0eXBlIG9mXG5gYFwnPVwnYGAgYW5kIGEgKmZpbGwqIGNoYXJhY3RlciBvZiBgYFwnMFwnYGAuXG5cblRoZSAqcHJlY2lzaW9uKiBpcyBhIGRlY2ltYWwgbnVtYmVyIGluZGljYXRpbmcgaG93IG1hbnkgZGlnaXRzIHNob3VsZFxuYmUgZGlzcGxheWVkIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50IGZvciBhIGZsb2F0aW5nIHBvaW50IHZhbHVlXG5mb3JtYXR0ZWQgd2l0aCBgYFwnZlwnYGAgYW5kIGBgXCdGXCdgYCwgb3IgYmVmb3JlIGFuZCBhZnRlciB0aGUgZGVjaW1hbFxucG9pbnQgZm9yIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgZm9ybWF0dGVkIHdpdGggYGBcJ2dcJ2BgIG9yIGBgXCdHXCdgYC5cbkZvciBub24tbnVtYmVyIHR5cGVzIHRoZSBmaWVsZCBpbmRpY2F0ZXMgdGhlIG1heGltdW0gZmllbGQgc2l6ZSAtIGluXG5vdGhlciB3b3JkcywgaG93IG1hbnkgY2hhcmFjdGVycyB3aWxsIGJlIHVzZWQgZnJvbSB0aGUgZmllbGQgY29udGVudC5cblRoZSAqcHJlY2lzaW9uKiBpcyBub3QgYWxsb3dlZCBmb3IgaW50ZWdlciB2YWx1ZXMuXG5cbkZpbmFsbHksIHRoZSAqdHlwZSogZGV0ZXJtaW5lcyBob3cgdGhlIGRhdGEgc2hvdWxkIGJlIHByZXNlbnRlZC5cblxuVGhlIGF2YWlsYWJsZSBzdHJpbmcgcHJlc2VudGF0aW9uIHR5cGVzIGFyZTpcblxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgVHlwZSAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuICAgfCBgYFwnc1wnYGAgICB8IFN0cmluZyBmb3JtYXQuIFRoaXMgaXMgdGhlIGRlZmF1bHQgdHlwZSBmb3Igc3RyaW5ncyBhbmQgICAgfFxuICAgfCAgICAgICAgICAgfCBtYXkgYmUgb21pdHRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IE5vbmUgICAgICB8IFRoZSBzYW1lIGFzIGBgXCdzXCdgYC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuXG5UaGUgYXZhaWxhYmxlIGludGVnZXIgcHJlc2VudGF0aW9uIHR5cGVzIGFyZTpcblxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgVHlwZSAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuICAgfCBgYFwnYlwnYGAgICB8IEJpbmFyeSBmb3JtYXQuIE91dHB1dHMgdGhlIG51bWJlciBpbiBiYXNlIDIuICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgYGBcJ2NcJ2BgICAgfCBDaGFyYWN0ZXIuIENvbnZlcnRzIHRoZSBpbnRlZ2VyIHRvIHRoZSBjb3JyZXNwb25kaW5nICAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgdW5pY29kZSBjaGFyYWN0ZXIgYmVmb3JlIHByaW50aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBgYFwnZFwnYGAgICB8IERlY2ltYWwgSW50ZWdlci4gT3V0cHV0cyB0aGUgbnVtYmVyIGluIGJhc2UgMTAuICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgYGBcJ29cJ2BgICAgfCBPY3RhbCBmb3JtYXQuIE91dHB1dHMgdGhlIG51bWJlciBpbiBiYXNlIDguICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IGBgXCd4XCdgYCAgIHwgSGV4IGZvcm1hdC4gT3V0cHV0cyB0aGUgbnVtYmVyIGluIGJhc2UgMTYsIHVzaW5nIGxvd2VyLSAgICB8XG4gICB8ICAgICAgICAgICB8IGNhc2UgbGV0dGVycyBmb3IgdGhlIGRpZ2l0cyBhYm92ZSA5LiAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgYGBcJ1hcJ2BgICAgfCBIZXggZm9ybWF0LiBPdXRwdXRzIHRoZSBudW1iZXIgaW4gYmFzZSAxNiwgdXNpbmcgdXBwZXItICAgIHxcbiAgIHwgICAgICAgICAgIHwgY2FzZSBsZXR0ZXJzIGZvciB0aGUgZGlnaXRzIGFib3ZlIDkuICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBgYFwnblwnYGAgICB8IE51bWJlci4gVGhpcyBpcyB0aGUgc2FtZSBhcyBgYFwnZFwnYGAsIGV4Y2VwdCB0aGF0IGl0IHVzZXMgICB8XG4gICB8ICAgICAgICAgICB8IHRoZSBjdXJyZW50IGxvY2FsZSBzZXR0aW5nIHRvIGluc2VydCB0aGUgYXBwcm9wcmlhdGUgICAgICAgfFxuICAgfCAgICAgICAgICAgfCBudW1iZXIgc2VwYXJhdG9yIGNoYXJhY3RlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IE5vbmUgICAgICB8IFRoZSBzYW1lIGFzIGBgXCdkXCdgYC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuXG5JbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUgcHJlc2VudGF0aW9uIHR5cGVzLCBpbnRlZ2VycyBjYW4gYmUgZm9ybWF0dGVkXG53aXRoIHRoZSBmbG9hdGluZyBwb2ludCBwcmVzZW50YXRpb24gdHlwZXMgbGlzdGVkIGJlbG93IChleGNlcHRcbmBgXCduXCdgYCBhbmQgTm9uZSkuIFdoZW4gZG9pbmcgc28sIGBgZmxvYXQoKWBgIGlzIHVzZWQgdG8gY29udmVydCB0aGVcbmludGVnZXIgdG8gYSBmbG9hdGluZyBwb2ludCBudW1iZXIgYmVmb3JlIGZvcm1hdHRpbmcuXG5cblRoZSBhdmFpbGFibGUgcHJlc2VudGF0aW9uIHR5cGVzIGZvciBmbG9hdGluZyBwb2ludCBhbmQgZGVjaW1hbCB2YWx1ZXNcbmFyZTpcblxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgVHlwZSAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuICAgfCBgYFwnZVwnYGAgICB8IEV4cG9uZW50IG5vdGF0aW9uLiBQcmludHMgdGhlIG51bWJlciBpbiBzY2llbnRpZmljICAgICAgICAgfFxuICAgfCAgICAgICAgICAgfCBub3RhdGlvbiB1c2luZyB0aGUgbGV0dGVyIFwnZVwnIHRvIGluZGljYXRlIHRoZSBleHBvbmVudC4gICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgYGBcJ0VcJ2BgICAgfCBFeHBvbmVudCBub3RhdGlvbi4gU2FtZSBhcyBgYFwnZVwnYGAgZXhjZXB0IGl0IHVzZXMgYW4gdXBwZXIgfFxuICAgfCAgICAgICAgICAgfCBjYXNlIFwnRVwnIGFzIHRoZSBzZXBhcmF0b3IgY2hhcmFjdGVyLiAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgYGBcJ2ZcJ2BgICAgfCBGaXhlZCBwb2ludC4gRGlzcGxheXMgdGhlIG51bWJlciBhcyBhIGZpeGVkLXBvaW50IG51bWJlci4gIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IGBgXCdGXCdgYCAgIHwgRml4ZWQgcG9pbnQuIFNhbWUgYXMgYGBcJ2ZcJ2BgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IGBgXCdnXCdgYCAgIHwgR2VuZXJhbCBmb3JtYXQuICBGb3IgYSBnaXZlbiBwcmVjaXNpb24gYGBwID49IDFgYCwgdGhpcyAgICB8XG4gICB8ICAgICAgICAgICB8IHJvdW5kcyB0aGUgbnVtYmVyIHRvIGBgcGBgIHNpZ25pZmljYW50IGRpZ2l0cyBhbmQgdGhlbiAgICAgfFxuICAgfCAgICAgICAgICAgfCBmb3JtYXRzIHRoZSByZXN1bHQgaW4gZWl0aGVyIGZpeGVkLXBvaW50IGZvcm1hdCBvciBpbiAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgc2NpZW50aWZpYyBub3RhdGlvbiwgZGVwZW5kaW5nIG9uIGl0cyBtYWduaXR1ZGUuICBUaGUgICAgICB8XG4gICB8ICAgICAgICAgICB8IHByZWNpc2UgcnVsZXMgYXJlIGFzIGZvbGxvd3M6IHN1cHBvc2UgdGhhdCB0aGUgcmVzdWx0ICAgICAgfFxuICAgfCAgICAgICAgICAgfCBmb3JtYXR0ZWQgd2l0aCBwcmVzZW50YXRpb24gdHlwZSBgYFwnZVwnYGAgYW5kIHByZWNpc2lvbiAgICAgfFxuICAgfCAgICAgICAgICAgfCBgYHAtMWBgIHdvdWxkIGhhdmUgZXhwb25lbnQgYGBleHBgYC4gIFRoZW4gaWYgYGAtNCA8PSBleHAgIHxcbiAgIHwgICAgICAgICAgIHwgPCBwYGAsIHRoZSBudW1iZXIgaXMgZm9ybWF0dGVkIHdpdGggcHJlc2VudGF0aW9uIHR5cGUgICAgICB8XG4gICB8ICAgICAgICAgICB8IGBgXCdmXCdgYCBhbmQgcHJlY2lzaW9uIGBgcC0xLWV4cGBgLiBPdGhlcndpc2UsIHRoZSBudW1iZXIgICB8XG4gICB8ICAgICAgICAgICB8IGlzIGZvcm1hdHRlZCB3aXRoIHByZXNlbnRhdGlvbiB0eXBlIGBgXCdlXCdgYCBhbmQgcHJlY2lzaW9uICB8XG4gICB8ICAgICAgICAgICB8IGBgcC0xYGAuIEluIGJvdGggY2FzZXMgaW5zaWduaWZpY2FudCB0cmFpbGluZyB6ZXJvcyBhcmUgICAgfFxuICAgfCAgICAgICAgICAgfCByZW1vdmVkIGZyb20gdGhlIHNpZ25pZmljYW5kLCBhbmQgdGhlIGRlY2ltYWwgcG9pbnQgaXMgICAgIHxcbiAgIHwgICAgICAgICAgIHwgYWxzbyByZW1vdmVkIGlmIHRoZXJlIGFyZSBubyByZW1haW5pbmcgZGlnaXRzIGZvbGxvd2luZyAgICB8XG4gICB8ICAgICAgICAgICB8IGl0LiAgUG9zaXRpdmUgYW5kIG5lZ2F0aXZlIGluZmluaXR5LCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgfFxuICAgfCAgICAgICAgICAgfCB6ZXJvLCBhbmQgbmFucywgYXJlIGZvcm1hdHRlZCBhcyBgYGluZmBgLCBgYC1pbmZgYCwgYGAwYGAsIHxcbiAgIHwgICAgICAgICAgIHwgYGAtMGBgIGFuZCBgYG5hbmBgIHJlc3BlY3RpdmVseSwgcmVnYXJkbGVzcyBvZiB0aGUgICAgICAgICB8XG4gICB8ICAgICAgICAgICB8IHByZWNpc2lvbi4gIEEgcHJlY2lzaW9uIG9mIGBgMGBgIGlzIHRyZWF0ZWQgYXMgZXF1aXZhbGVudCAgfFxuICAgfCAgICAgICAgICAgfCB0byBhIHByZWNpc2lvbiBvZiBgYDFgYC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IGBgXCdHXCdgYCAgIHwgR2VuZXJhbCBmb3JtYXQuIFNhbWUgYXMgYGBcJ2dcJ2BgIGV4Y2VwdCBzd2l0Y2hlcyB0byBgYFwnRVwnYGAgfFxuICAgfCAgICAgICAgICAgfCBpZiB0aGUgbnVtYmVyIGdldHMgdG9vIGxhcmdlLiBUaGUgcmVwcmVzZW50YXRpb25zIG9mICAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgaW5maW5pdHkgYW5kIE5hTiBhcmUgdXBwZXJjYXNlZCwgdG9vLiAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBgYFwnblwnYGAgICB8IE51bWJlci4gVGhpcyBpcyB0aGUgc2FtZSBhcyBgYFwnZ1wnYGAsIGV4Y2VwdCB0aGF0IGl0IHVzZXMgICB8XG4gICB8ICAgICAgICAgICB8IHRoZSBjdXJyZW50IGxvY2FsZSBzZXR0aW5nIHRvIGluc2VydCB0aGUgYXBwcm9wcmlhdGUgICAgICAgfFxuICAgfCAgICAgICAgICAgfCBudW1iZXIgc2VwYXJhdG9yIGNoYXJhY3RlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IGBgXCclXCdgYCAgIHwgUGVyY2VudGFnZS4gTXVsdGlwbGllcyB0aGUgbnVtYmVyIGJ5IDEwMCBhbmQgZGlzcGxheXMgaW4gICB8XG4gICB8ICAgICAgICAgICB8IGZpeGVkIChgYFwnZlwnYGApIGZvcm1hdCwgZm9sbG93ZWQgYnkgYSBwZXJjZW50IHNpZ24uICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBOb25lICAgICAgfCBUaGUgc2FtZSBhcyBgYFwnZ1wnYGAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuXG5Gb3JtYXQgZXhhbXBsZXNcbj09PT09PT09PT09PT09PVxuXG5UaGlzIHNlY3Rpb24gY29udGFpbnMgZXhhbXBsZXMgb2YgdGhlIG5ldyBmb3JtYXQgc3ludGF4IGFuZCBjb21wYXJpc29uXG53aXRoIHRoZSBvbGQgYGAlYGAtZm9ybWF0dGluZy5cblxuSW4gbW9zdCBvZiB0aGUgY2FzZXMgdGhlIHN5bnRheCBpcyBzaW1pbGFyIHRvIHRoZSBvbGRcbmBgJWBgLWZvcm1hdHRpbmcsIHdpdGggdGhlIGFkZGl0aW9uIG9mIHRoZSBgYHt9YGAgYW5kIHdpdGggYGA6YGAgdXNlZFxuaW5zdGVhZCBvZiBgYCVgYC4gRm9yIGV4YW1wbGUsIGBgXCclMDMuMmZcJ2BgIGNhbiBiZSB0cmFuc2xhdGVkIHRvXG5gYFwnezowMy4yZn1cJ2BgLlxuXG5UaGUgbmV3IGZvcm1hdCBzeW50YXggYWxzbyBzdXBwb3J0cyBuZXcgYW5kIGRpZmZlcmVudCBvcHRpb25zLCBzaG93blxuaW4gdGhlIGZvbGxvdyBleGFtcGxlcy5cblxuQWNjZXNzaW5nIGFyZ3VtZW50cyBieSBwb3NpdGlvbjpcblxuICAgPj4+IFwnezB9LCB7MX0sIHsyfVwnLmZvcm1hdChcJ2FcJywgXCdiXCcsIFwnY1wnKVxuICAgXCdhLCBiLCBjXCdcbiAgID4+PiBcJ3t9LCB7fSwge31cJy5mb3JtYXQoXCdhXCcsIFwnYlwnLCBcJ2NcJykgICMgMi43KyBvbmx5XG4gICBcJ2EsIGIsIGNcJ1xuICAgPj4+IFwnezJ9LCB7MX0sIHswfVwnLmZvcm1hdChcJ2FcJywgXCdiXCcsIFwnY1wnKVxuICAgXCdjLCBiLCBhXCdcbiAgID4+PiBcJ3syfSwgezF9LCB7MH1cJy5mb3JtYXQoKlwnYWJjXCcpICAgICAgIyB1bnBhY2tpbmcgYXJndW1lbnQgc2VxdWVuY2VcbiAgIFwnYywgYiwgYVwnXG4gICA+Pj4gXCd7MH17MX17MH1cJy5mb3JtYXQoXCdhYnJhXCcsIFwnY2FkXCcpICAgIyBhcmd1bWVudHNcJyBpbmRpY2VzIGNhbiBiZSByZXBlYXRlZFxuICAgXCdhYnJhY2FkYWJyYVwnXG5cbkFjY2Vzc2luZyBhcmd1bWVudHMgYnkgbmFtZTpcblxuICAgPj4+IFwnQ29vcmRpbmF0ZXM6IHtsYXRpdHVkZX0sIHtsb25naXR1ZGV9XCcuZm9ybWF0KGxhdGl0dWRlPVwnMzcuMjROXCcsIGxvbmdpdHVkZT1cJy0xMTUuODFXXCcpXG4gICBcJ0Nvb3JkaW5hdGVzOiAzNy4yNE4sIC0xMTUuODFXXCdcbiAgID4+PiBjb29yZCA9IHtcJ2xhdGl0dWRlXCc6IFwnMzcuMjROXCcsIFwnbG9uZ2l0dWRlXCc6IFwnLTExNS44MVdcJ31cbiAgID4+PiBcJ0Nvb3JkaW5hdGVzOiB7bGF0aXR1ZGV9LCB7bG9uZ2l0dWRlfVwnLmZvcm1hdCgqKmNvb3JkKVxuICAgXCdDb29yZGluYXRlczogMzcuMjROLCAtMTE1LjgxV1wnXG5cbkFjY2Vzc2luZyBhcmd1bWVudHNcJyBhdHRyaWJ1dGVzOlxuXG4gICA+Pj4gYyA9IDMtNWpcbiAgID4+PiAoXCdUaGUgY29tcGxleCBudW1iZXIgezB9IGlzIGZvcm1lZCBmcm9tIHRoZSByZWFsIHBhcnQgezAucmVhbH0gXCdcbiAgIC4uLiAgXCdhbmQgdGhlIGltYWdpbmFyeSBwYXJ0IHswLmltYWd9LlwnKS5mb3JtYXQoYylcbiAgIFwnVGhlIGNvbXBsZXggbnVtYmVyICgzLTVqKSBpcyBmb3JtZWQgZnJvbSB0aGUgcmVhbCBwYXJ0IDMuMCBhbmQgdGhlIGltYWdpbmFyeSBwYXJ0IC01LjAuXCdcbiAgID4+PiBjbGFzcyBQb2ludChvYmplY3QpOlxuICAgLi4uICAgICBkZWYgX19pbml0X18oc2VsZiwgeCwgeSk6XG4gICAuLi4gICAgICAgICBzZWxmLngsIHNlbGYueSA9IHgsIHlcbiAgIC4uLiAgICAgZGVmIF9fc3RyX18oc2VsZik6XG4gICAuLi4gICAgICAgICByZXR1cm4gXCdQb2ludCh7c2VsZi54fSwge3NlbGYueX0pXCcuZm9ybWF0KHNlbGY9c2VsZilcbiAgIC4uLlxuICAgPj4+IHN0cihQb2ludCg0LCAyKSlcbiAgIFwnUG9pbnQoNCwgMilcJ1xuXG5BY2Nlc3NpbmcgYXJndW1lbnRzXCcgaXRlbXM6XG5cbiAgID4+PiBjb29yZCA9ICgzLCA1KVxuICAgPj4+IFwnWDogezBbMF19OyAgWTogezBbMV19XCcuZm9ybWF0KGNvb3JkKVxuICAgXCdYOiAzOyAgWTogNVwnXG5cblJlcGxhY2luZyBgYCVzYGAgYW5kIGBgJXJgYDpcblxuICAgPj4+ICJyZXByKCkgc2hvd3MgcXVvdGVzOiB7IXJ9OyBzdHIoKSBkb2VzblwndDogeyFzfSIuZm9ybWF0KFwndGVzdDFcJywgXCd0ZXN0MlwnKVxuICAgInJlcHIoKSBzaG93cyBxdW90ZXM6IFwndGVzdDFcJzsgc3RyKCkgZG9lc25cJ3Q6IHRlc3QyIlxuXG5BbGlnbmluZyB0aGUgdGV4dCBhbmQgc3BlY2lmeWluZyBhIHdpZHRoOlxuXG4gICA+Pj4gXCd7OjwzMH1cJy5mb3JtYXQoXCdsZWZ0IGFsaWduZWRcJylcbiAgIFwnbGVmdCBhbGlnbmVkICAgICAgICAgICAgICAgICAgXCdcbiAgID4+PiBcJ3s6PjMwfVwnLmZvcm1hdChcJ3JpZ2h0IGFsaWduZWRcJylcbiAgIFwnICAgICAgICAgICAgICAgICByaWdodCBhbGlnbmVkXCdcbiAgID4+PiBcJ3s6XjMwfVwnLmZvcm1hdChcJ2NlbnRlcmVkXCcpXG4gICBcJyAgICAgICAgICAgY2VudGVyZWQgICAgICAgICAgIFwnXG4gICA+Pj4gXCd7OipeMzB9XCcuZm9ybWF0KFwnY2VudGVyZWRcJykgICMgdXNlIFwnKlwnIGFzIGEgZmlsbCBjaGFyXG4gICBcJyoqKioqKioqKioqY2VudGVyZWQqKioqKioqKioqKlwnXG5cblJlcGxhY2luZyBgYCUrZmBgLCBgYCUtZmBgLCBhbmQgYGAlIGZgYCBhbmQgc3BlY2lmeWluZyBhIHNpZ246XG5cbiAgID4+PiBcJ3s6K2Z9OyB7OitmfVwnLmZvcm1hdCgzLjE0LCAtMy4xNCkgICMgc2hvdyBpdCBhbHdheXNcbiAgIFwnKzMuMTQwMDAwOyAtMy4xNDAwMDBcJ1xuICAgPj4+IFwnezogZn07IHs6IGZ9XCcuZm9ybWF0KDMuMTQsIC0zLjE0KSAgIyBzaG93IGEgc3BhY2UgZm9yIHBvc2l0aXZlIG51bWJlcnNcbiAgIFwnIDMuMTQwMDAwOyAtMy4xNDAwMDBcJ1xuICAgPj4+IFwnezotZn07IHs6LWZ9XCcuZm9ybWF0KDMuMTQsIC0zLjE0KSAgIyBzaG93IG9ubHkgdGhlIG1pbnVzIC0tIHNhbWUgYXMgXCd7OmZ9OyB7OmZ9XCdcbiAgIFwnMy4xNDAwMDA7IC0zLjE0MDAwMFwnXG5cblJlcGxhY2luZyBgYCV4YGAgYW5kIGBgJW9gYCBhbmQgY29udmVydGluZyB0aGUgdmFsdWUgdG8gZGlmZmVyZW50XG5iYXNlczpcblxuICAgPj4+ICMgZm9ybWF0IGFsc28gc3VwcG9ydHMgYmluYXJ5IG51bWJlcnNcbiAgID4+PiAiaW50OiB7MDpkfTsgIGhleDogezA6eH07ICBvY3Q6IHswOm99OyAgYmluOiB7MDpifSIuZm9ybWF0KDQyKVxuICAgXCdpbnQ6IDQyOyAgaGV4OiAyYTsgIG9jdDogNTI7ICBiaW46IDEwMTAxMFwnXG4gICA+Pj4gIyB3aXRoIDB4LCAwbywgb3IgMGIgYXMgcHJlZml4OlxuICAgPj4+ICJpbnQ6IHswOmR9OyAgaGV4OiB7MDojeH07ICBvY3Q6IHswOiNvfTsgIGJpbjogezA6I2J9Ii5mb3JtYXQoNDIpXG4gICBcJ2ludDogNDI7ICBoZXg6IDB4MmE7ICBvY3Q6IDBvNTI7ICBiaW46IDBiMTAxMDEwXCdcblxuVXNpbmcgdGhlIGNvbW1hIGFzIGEgdGhvdXNhbmRzIHNlcGFyYXRvcjpcblxuICAgPj4+IFwnezosfVwnLmZvcm1hdCgxMjM0NTY3ODkwKVxuICAgXCcxLDIzNCw1NjcsODkwXCdcblxuRXhwcmVzc2luZyBhIHBlcmNlbnRhZ2U6XG5cbiAgID4+PiBwb2ludHMgPSAxOS41XG4gICA+Pj4gdG90YWwgPSAyMlxuICAgPj4+IFwnQ29ycmVjdCBhbnN3ZXJzOiB7Oi4yJX0uXCcuZm9ybWF0KHBvaW50cy90b3RhbClcbiAgIFwnQ29ycmVjdCBhbnN3ZXJzOiA4OC42NCVcJ1xuXG5Vc2luZyB0eXBlLXNwZWNpZmljIGZvcm1hdHRpbmc6XG5cbiAgID4+PiBpbXBvcnQgZGF0ZXRpbWVcbiAgID4+PiBkID0gZGF0ZXRpbWUuZGF0ZXRpbWUoMjAxMCwgNywgNCwgMTIsIDE1LCA1OClcbiAgID4+PiBcJ3s6JVktJW0tJWQgJUg6JU06JVN9XCcuZm9ybWF0KGQpXG4gICBcJzIwMTAtMDctMDQgMTI6MTU6NThcJ1xuXG5OZXN0aW5nIGFyZ3VtZW50cyBhbmQgbW9yZSBjb21wbGV4IGV4YW1wbGVzOlxuXG4gICA+Pj4gZm9yIGFsaWduLCB0ZXh0IGluIHppcChcJzxePlwnLCBbXCdsZWZ0XCcsIFwnY2VudGVyXCcsIFwncmlnaHRcJ10pOlxuICAgLi4uICAgICBcJ3swOntmaWxsfXthbGlnbn0xNn1cJy5mb3JtYXQodGV4dCwgZmlsbD1hbGlnbiwgYWxpZ249YWxpZ24pXG4gICAuLi5cbiAgIFwnbGVmdDw8PDw8PDw8PDw8PFwnXG4gICBcJ15eXl5eY2VudGVyXl5eXl5cJ1xuICAgXCc+Pj4+Pj4+Pj4+PnJpZ2h0XCdcbiAgID4+PlxuICAgPj4+IG9jdGV0cyA9IFsxOTIsIDE2OCwgMCwgMV1cbiAgID4+PiBcJ3s6MDJYfXs6MDJYfXs6MDJYfXs6MDJYfVwnLmZvcm1hdCgqb2N0ZXRzKVxuICAgXCdDMEE4MDAwMVwnXG4gICA+Pj4gaW50KF8sIDE2KVxuICAgMzIzMjIzNTUyMVxuICAgPj4+XG4gICA+Pj4gd2lkdGggPSA1XG4gICA+Pj4gZm9yIG51bSBpbiByYW5nZSg1LDEyKTpcbiAgIC4uLiAgICAgZm9yIGJhc2UgaW4gXCdkWG9iXCc6XG4gICAuLi4gICAgICAgICBwcmludCBcJ3swOnt3aWR0aH17YmFzZX19XCcuZm9ybWF0KG51bSwgYmFzZT1iYXNlLCB3aWR0aD13aWR0aCksXG4gICAuLi4gICAgIHByaW50XG4gICAuLi5cbiAgICAgICA1ICAgICA1ICAgICA1ICAgMTAxXG4gICAgICAgNiAgICAgNiAgICAgNiAgIDExMFxuICAgICAgIDcgICAgIDcgICAgIDcgICAxMTFcbiAgICAgICA4ICAgICA4ICAgIDEwICAxMDAwXG4gICAgICAgOSAgICAgOSAgICAxMSAgMTAwMVxuICAgICAgMTAgICAgIEEgICAgMTIgIDEwMTBcbiAgICAgIDExICAgICBCICAgIDEzICAxMDExXG4nLAotICdmdW5jdGlvbic6IHUnXG5GdW5jdGlvbiBkZWZpbml0aW9uc1xuKioqKioqKioqKioqKioqKioqKipcblxuQSBmdW5jdGlvbiBkZWZpbml0aW9uIGRlZmluZXMgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IChzZWVcbnNlY3Rpb24gKlRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSopOlxuXG4gICBkZWNvcmF0ZWQgICAgICA6Oj0gZGVjb3JhdG9ycyAoY2xhc3NkZWYgfCBmdW5jZGVmKVxuICAgZGVjb3JhdG9ycyAgICAgOjo9IGRlY29yYXRvcitcbiAgIGRlY29yYXRvciAgICAgIDo6PSAiQCIgZG90dGVkX25hbWUgWyIoIiBbYXJndW1lbnRfbGlzdCBbIiwiXV0gIikiXSBORVdMSU5FXG4gICBmdW5jZGVmICAgICAgICA6Oj0gImRlZiIgZnVuY25hbWUgIigiIFtwYXJhbWV0ZXJfbGlzdF0gIikiICI6IiBzdWl0ZVxuICAgZG90dGVkX25hbWUgICAgOjo9IGlkZW50aWZpZXIgKCIuIiBpZGVudGlmaWVyKSpcbiAgIHBhcmFtZXRlcl9saXN0IDo6PSAoZGVmcGFyYW1ldGVyICIsIikqXG4gICAgICAgICAgICAgICAgICAgICAgKCAgIioiIGlkZW50aWZpZXIgWywgIioqIiBpZGVudGlmaWVyXVxuICAgICAgICAgICAgICAgICAgICAgIHwgIioqIiBpZGVudGlmaWVyXG4gICAgICAgICAgICAgICAgICAgICAgfCBkZWZwYXJhbWV0ZXIgWyIsIl0gKVxuICAgZGVmcGFyYW1ldGVyICAgOjo9IHBhcmFtZXRlciBbIj0iIGV4cHJlc3Npb25dXG4gICBzdWJsaXN0ICAgICAgICA6Oj0gcGFyYW1ldGVyICgiLCIgcGFyYW1ldGVyKSogWyIsIl1cbiAgIHBhcmFtZXRlciAgICAgIDo6PSBpZGVudGlmaWVyIHwgIigiIHN1Ymxpc3QgIikiXG4gICBmdW5jbmFtZSAgICAgICA6Oj0gaWRlbnRpZmllclxuXG5BIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBJdHMgZXhlY3V0aW9uIGJpbmRzXG50aGUgZnVuY3Rpb24gbmFtZSBpbiB0aGUgY3VycmVudCBsb2NhbCBuYW1lc3BhY2UgdG8gYSBmdW5jdGlvbiBvYmplY3RcbihhIHdyYXBwZXIgYXJvdW5kIHRoZSBleGVjdXRhYmxlIGNvZGUgZm9yIHRoZSBmdW5jdGlvbikuICBUaGlzXG5mdW5jdGlvbiBvYmplY3QgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIG5hbWVzcGFjZVxuYXMgdGhlIGdsb2JhbCBuYW1lc3BhY2UgdG8gYmUgdXNlZCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuXG5cblRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGRvZXMgbm90IGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIGJvZHk7IHRoaXMgZ2V0c1xuZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuIFszXVxuXG5BIGZ1bmN0aW9uIGRlZmluaXRpb24gbWF5IGJlIHdyYXBwZWQgYnkgb25lIG9yIG1vcmUgKmRlY29yYXRvcipcbmV4cHJlc3Npb25zLiBEZWNvcmF0b3IgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCB3aGVuIHRoZSBmdW5jdGlvbiBpc1xuZGVmaW5lZCwgaW4gdGhlIHNjb3BlIHRoYXQgY29udGFpbnMgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24uICBUaGVcbnJlc3VsdCBtdXN0IGJlIGEgY2FsbGFibGUsIHdoaWNoIGlzIGludm9rZWQgd2l0aCB0aGUgZnVuY3Rpb24gb2JqZWN0XG5hcyB0aGUgb25seSBhcmd1bWVudC4gVGhlIHJldHVybmVkIHZhbHVlIGlzIGJvdW5kIHRvIHRoZSBmdW5jdGlvbiBuYW1lXG5pbnN0ZWFkIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QuICBNdWx0aXBsZSBkZWNvcmF0b3JzIGFyZSBhcHBsaWVkIGluXG5uZXN0ZWQgZmFzaGlvbi4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZTpcblxuICAgQGYxKGFyZylcbiAgIEBmMlxuICAgZGVmIGZ1bmMoKTogcGFzc1xuXG5pcyBlcXVpdmFsZW50IHRvOlxuXG4gICBkZWYgZnVuYygpOiBwYXNzXG4gICBmdW5jID0gZjEoYXJnKShmMihmdW5jKSlcblxuV2hlbiBvbmUgb3IgbW9yZSB0b3AtbGV2ZWwgcGFyYW1ldGVycyBoYXZlIHRoZSBmb3JtICpwYXJhbWV0ZXIqIGBgPWBgXG4qZXhwcmVzc2lvbiosIHRoZSBmdW5jdGlvbiBpcyBzYWlkIHRvIGhhdmUgImRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlcy4iXG5Gb3IgYSBwYXJhbWV0ZXIgd2l0aCBhIGRlZmF1bHQgdmFsdWUsIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50IG1heVxuYmUgb21pdHRlZCBmcm9tIGEgY2FsbCwgaW4gd2hpY2ggY2FzZSB0aGUgcGFyYW1ldGVyXCdzIGRlZmF1bHQgdmFsdWUgaXNcbnN1YnN0aXR1dGVkLiAgSWYgYSBwYXJhbWV0ZXIgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgYWxsIGZvbGxvd2luZ1xucGFyYW1ldGVycyBtdXN0IGFsc28gaGF2ZSBhIGRlZmF1bHQgdmFsdWUgLS0tIHRoaXMgaXMgYSBzeW50YWN0aWNcbnJlc3RyaWN0aW9uIHRoYXQgaXMgbm90IGV4cHJlc3NlZCBieSB0aGUgZ3JhbW1hci5cblxuKipEZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMgYXJlIGV2YWx1YXRlZCB3aGVuIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uXG5pcyBleGVjdXRlZC4qKiAgVGhpcyBtZWFucyB0aGF0IHRoZSBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBvbmNlLCB3aGVuXG50aGUgZnVuY3Rpb24gaXMgZGVmaW5lZCwgYW5kIHRoYXQgdGhhdCBzYW1lICJwcmUtY29tcHV0ZWQiIHZhbHVlIGlzXG51c2VkIGZvciBlYWNoIGNhbGwuICBUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgd2hlbiBhXG5kZWZhdWx0IHBhcmFtZXRlciBpcyBhIG11dGFibGUgb2JqZWN0LCBzdWNoIGFzIGEgbGlzdCBvciBhIGRpY3Rpb25hcnk6XG5pZiB0aGUgZnVuY3Rpb24gbW9kaWZpZXMgdGhlIG9iamVjdCAoZS5nLiBieSBhcHBlbmRpbmcgYW4gaXRlbSB0byBhXG5saXN0KSwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgaW4gZWZmZWN0IG1vZGlmaWVkLiBUaGlzIGlzIGdlbmVyYWxseSBub3RcbndoYXQgd2FzIGludGVuZGVkLiAgQSB3YXkgYXJvdW5kIHRoaXMgIGlzIHRvIHVzZSBgYE5vbmVgYCBhcyB0aGVcbmRlZmF1bHQsIGFuZCBleHBsaWNpdGx5IHRlc3QgZm9yIGl0IGluIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbiwgZS5nLjpcblxuICAgZGVmIHdoYXRzX29uX3RoZV90ZWxseShwZW5ndWluPU5vbmUpOlxuICAgICAgIGlmIHBlbmd1aW4gaXMgTm9uZTpcbiAgICAgICAgICAgcGVuZ3VpbiA9IFtdXG4gICAgICAgcGVuZ3Vpbi5hcHBlbmQoInByb3BlcnR5IG9mIHRoZSB6b28iKVxuICAgICAgIHJldHVybiBwZW5ndWluXG5cbkZ1bmN0aW9uIGNhbGwgc2VtYW50aWNzIGFyZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gc2VjdGlvblxuKkNhbGxzKi4gQSBmdW5jdGlvbiBjYWxsIGFsd2F5cyBhc3NpZ25zIHZhbHVlcyB0byBhbGwgcGFyYW1ldGVyc1xubWVudGlvbmVkIGluIHRoZSBwYXJhbWV0ZXIgbGlzdCwgZWl0aGVyIGZyb20gcG9zaXRpb24gYXJndW1lbnRzLCBmcm9tXG5rZXl3b3JkIGFyZ3VtZW50cywgb3IgZnJvbSBkZWZhdWx0IHZhbHVlcy4gIElmIHRoZSBmb3JtXG4iYGAqaWRlbnRpZmllcmBgIiBpcyBwcmVzZW50LCBpdCBpcyBpbml0aWFsaXplZCB0byBhIHR1cGxlIHJlY2VpdmluZ1xuYW55IGV4Y2VzcyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHR1cGxlLiAgSWZcbnRoZSBmb3JtICJgYCoqaWRlbnRpZmllcmBgIiBpcyBwcmVzZW50LCBpdCBpcyBpbml0aWFsaXplZCB0byBhIG5ld1xuZGljdGlvbmFyeSByZWNlaXZpbmcgYW55IGV4Y2VzcyBrZXl3b3JkIGFyZ3VtZW50cywgZGVmYXVsdGluZyB0byBhIG5ld1xuZW1wdHkgZGljdGlvbmFyeS5cblxuSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBjcmVhdGUgYW5vbnltb3VzIGZ1bmN0aW9ucyAoZnVuY3Rpb25zIG5vdCBib3VuZFxudG8gYSBuYW1lKSwgZm9yIGltbWVkaWF0ZSB1c2UgaW4gZXhwcmVzc2lvbnMuICBUaGlzIHVzZXMgbGFtYmRhIGZvcm1zLFxuZGVzY3JpYmVkIGluIHNlY3Rpb24gKkxhbWJkYXMqLiAgTm90ZSB0aGF0IHRoZSBsYW1iZGEgZm9ybSBpcyBtZXJlbHkgYVxuc2hvcnRoYW5kIGZvciBhIHNpbXBsaWZpZWQgZnVuY3Rpb24gZGVmaW5pdGlvbjsgYSBmdW5jdGlvbiBkZWZpbmVkIGluXG5hICJgYGRlZmBgIiBzdGF0ZW1lbnQgY2FuIGJlIHBhc3NlZCBhcm91bmQgb3IgYXNzaWduZWQgdG8gYW5vdGhlciBuYW1lXG5qdXN0IGxpa2UgYSBmdW5jdGlvbiBkZWZpbmVkIGJ5IGEgbGFtYmRhIGZvcm0uICBUaGUgImBgZGVmYGAiIGZvcm0gaXNcbmFjdHVhbGx5IG1vcmUgcG93ZXJmdWwgc2luY2UgaXQgYWxsb3dzIHRoZSBleGVjdXRpb24gb2YgbXVsdGlwbGVcbnN0YXRlbWVudHMuXG5cbioqUHJvZ3JhbW1lclwncyBub3RlOioqIEZ1bmN0aW9ucyBhcmUgZmlyc3QtY2xhc3Mgb2JqZWN0cy4gIEEgImBgZGVmYGAiXG5mb3JtIGV4ZWN1dGVkIGluc2lkZSBhIGZ1bmN0aW9uIGRlZmluaXRpb24gZGVmaW5lcyBhIGxvY2FsIGZ1bmN0aW9uXG50aGF0IGNhbiBiZSByZXR1cm5lZCBvciBwYXNzZWQgYXJvdW5kLiAgRnJlZSB2YXJpYWJsZXMgdXNlZCBpbiB0aGVcbm5lc3RlZCBmdW5jdGlvbiBjYW4gYWNjZXNzIHRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgdGhlIGZ1bmN0aW9uXG5jb250YWluaW5nIHRoZSBkZWYuICBTZWUgc2VjdGlvbiAqTmFtaW5nIGFuZCBiaW5kaW5nKiBmb3IgZGV0YWlscy5cbicsCi0gJ2dsb2JhbCc6IHUnXG5UaGUgYGBnbG9iYWxgYCBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4gICBnbG9iYWxfc3RtdCA6Oj0gImdsb2JhbCIgaWRlbnRpZmllciAoIiwiIGlkZW50aWZpZXIpKlxuXG5UaGUgYGBnbG9iYWxgYCBzdGF0ZW1lbnQgaXMgYSBkZWNsYXJhdGlvbiB3aGljaCBob2xkcyBmb3IgdGhlIGVudGlyZVxuY3VycmVudCBjb2RlIGJsb2NrLiAgSXQgbWVhbnMgdGhhdCB0aGUgbGlzdGVkIGlkZW50aWZpZXJzIGFyZSB0byBiZVxuaW50ZXJwcmV0ZWQgYXMgZ2xvYmFscy4gIEl0IHdvdWxkIGJlIGltcG9zc2libGUgdG8gYXNzaWduIHRvIGEgZ2xvYmFsXG52YXJpYWJsZSB3aXRob3V0IGBgZ2xvYmFsYGAsIGFsdGhvdWdoIGZyZWUgdmFyaWFibGVzIG1heSByZWZlciB0b1xuZ2xvYmFscyB3aXRob3V0IGJlaW5nIGRlY2xhcmVkIGdsb2JhbC5cblxuTmFtZXMgbGlzdGVkIGluIGEgYGBnbG9iYWxgYCBzdGF0ZW1lbnQgbXVzdCBub3QgYmUgdXNlZCBpbiB0aGUgc2FtZVxuY29kZSBibG9jayB0ZXh0dWFsbHkgcHJlY2VkaW5nIHRoYXQgYGBnbG9iYWxgYCBzdGF0ZW1lbnQuXG5cbk5hbWVzIGxpc3RlZCBpbiBhIGBgZ2xvYmFsYGAgc3RhdGVtZW50IG11c3Qgbm90IGJlIGRlZmluZWQgYXMgZm9ybWFsXG5wYXJhbWV0ZXJzIG9yIGluIGEgYGBmb3JgYCBsb29wIGNvbnRyb2wgdGFyZ2V0LCBgYGNsYXNzYGAgZGVmaW5pdGlvbixcbmZ1bmN0aW9uIGRlZmluaXRpb24sIG9yIGBgaW1wb3J0YGAgc3RhdGVtZW50LlxuXG4qKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGRvZXMgbm90XG5lbmZvcmNlIHRoZSBsYXR0ZXIgdHdvIHJlc3RyaWN0aW9ucywgYnV0IHByb2dyYW1zIHNob3VsZCBub3QgYWJ1c2VcbnRoaXMgZnJlZWRvbSwgYXMgZnV0dXJlIGltcGxlbWVudGF0aW9ucyBtYXkgZW5mb3JjZSB0aGVtIG9yIHNpbGVudGx5XG5jaGFuZ2UgdGhlIG1lYW5pbmcgb2YgdGhlIHByb2dyYW0uXG5cbioqUHJvZ3JhbW1lclwncyBub3RlOioqIHRoZSBgYGdsb2JhbGBgIGlzIGEgZGlyZWN0aXZlIHRvIHRoZSBwYXJzZXIuXG5JdCBhcHBsaWVzIG9ubHkgdG8gY29kZSBwYXJzZWQgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUgYGBnbG9iYWxgYFxuc3RhdGVtZW50LiBJbiBwYXJ0aWN1bGFyLCBhIGBgZ2xvYmFsYGAgc3RhdGVtZW50IGNvbnRhaW5lZCBpbiBhblxuYGBleGVjYGAgc3RhdGVtZW50IGRvZXMgbm90IGFmZmVjdCB0aGUgY29kZSBibG9jayAqY29udGFpbmluZyogdGhlXG5gYGV4ZWNgYCBzdGF0ZW1lbnQsIGFuZCBjb2RlIGNvbnRhaW5lZCBpbiBhbiBgYGV4ZWNgYCBzdGF0ZW1lbnQgaXNcbnVuYWZmZWN0ZWQgYnkgYGBnbG9iYWxgYCBzdGF0ZW1lbnRzIGluIHRoZSBjb2RlIGNvbnRhaW5pbmcgdGhlXG5gYGV4ZWNgYCBzdGF0ZW1lbnQuICBUaGUgc2FtZSBhcHBsaWVzIHRvIHRoZSBgYGV2YWwoKWBgLFxuYGBleGVjZmlsZSgpYGAgYW5kIGBgY29tcGlsZSgpYGAgZnVuY3Rpb25zLlxuJywKLSAnaWQtY2xhc3Nlcyc6IHUnXG5SZXNlcnZlZCBjbGFzc2VzIG9mIGlkZW50aWZpZXJzXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbkNlcnRhaW4gY2xhc3NlcyBvZiBpZGVudGlmaWVycyAoYmVzaWRlcyBrZXl3b3JkcykgaGF2ZSBzcGVjaWFsXG5tZWFuaW5ncy4gIFRoZXNlIGNsYXNzZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlIHBhdHRlcm5zIG9mIGxlYWRpbmcgYW5kXG50cmFpbGluZyB1bmRlcnNjb3JlIGNoYXJhY3RlcnM6XG5cbmBgXypgYFxuICAgTm90IGltcG9ydGVkIGJ5IGBgZnJvbSBtb2R1bGUgaW1wb3J0ICpgYC4gIFRoZSBzcGVjaWFsIGlkZW50aWZpZXJcbiAgIGBgX2BgIGlzIHVzZWQgaW4gdGhlIGludGVyYWN0aXZlIGludGVycHJldGVyIHRvIHN0b3JlIHRoZSByZXN1bHQgb2ZcbiAgIHRoZSBsYXN0IGV2YWx1YXRpb247IGl0IGlzIHN0b3JlZCBpbiB0aGUgYGBfX2J1aWx0aW5fX2BgIG1vZHVsZS5cbiAgIFdoZW4gbm90IGluIGludGVyYWN0aXZlIG1vZGUsIGBgX2BgIGhhcyBubyBzcGVjaWFsIG1lYW5pbmcgYW5kIGlzXG4gICBub3QgZGVmaW5lZC4gU2VlIHNlY3Rpb24gKlRoZSBpbXBvcnQgc3RhdGVtZW50Ki5cblxuICAgTm90ZTogVGhlIG5hbWUgYGBfYGAgaXMgb2Z0ZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoXG4gICAgIGludGVybmF0aW9uYWxpemF0aW9uOyByZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlXG4gICAgIGBgZ2V0dGV4dGBgIG1vZHVsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIGNvbnZlbnRpb24uXG5cbmBgX18qX19gYFxuICAgU3lzdGVtLWRlZmluZWQgbmFtZXMuIFRoZXNlIG5hbWVzIGFyZSBkZWZpbmVkIGJ5IHRoZSBpbnRlcnByZXRlclxuICAgYW5kIGl0cyBpbXBsZW1lbnRhdGlvbiAoaW5jbHVkaW5nIHRoZSBzdGFuZGFyZCBsaWJyYXJ5KS4gIEN1cnJlbnRcbiAgIHN5c3RlbSBuYW1lcyBhcmUgZGlzY3Vzc2VkIGluIHRoZSAqU3BlY2lhbCBtZXRob2QgbmFtZXMqIHNlY3Rpb25cbiAgIGFuZCBlbHNld2hlcmUuICBNb3JlIHdpbGwgbGlrZWx5IGJlIGRlZmluZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mXG4gICBQeXRob24uICAqQW55KiB1c2Ugb2YgYGBfXypfX2BgIG5hbWVzLCBpbiBhbnkgY29udGV4dCwgdGhhdCBkb2VzXG4gICBub3QgZm9sbG93IGV4cGxpY2l0bHkgZG9jdW1lbnRlZCB1c2UsIGlzIHN1YmplY3QgdG8gYnJlYWthZ2VcbiAgIHdpdGhvdXQgd2FybmluZy5cblxuYGBfXypgYFxuICAgQ2xhc3MtcHJpdmF0ZSBuYW1lcy4gIE5hbWVzIGluIHRoaXMgY2F0ZWdvcnksIHdoZW4gdXNlZCB3aXRoaW4gdGhlXG4gICBjb250ZXh0IG9mIGEgY2xhc3MgZGVmaW5pdGlvbiwgYXJlIHJlLXdyaXR0ZW4gdG8gdXNlIGEgbWFuZ2xlZCBmb3JtXG4gICB0byBoZWxwIGF2b2lkIG5hbWUgY2xhc2hlcyBiZXR3ZWVuICJwcml2YXRlIiBhdHRyaWJ1dGVzIG9mIGJhc2UgYW5kXG4gICBkZXJpdmVkIGNsYXNzZXMuIFNlZSBzZWN0aW9uICpJZGVudGlmaWVycyAoTmFtZXMpKi5cbicsCi0gJ2lkZW50aWZpZXJzJzogdSdcbklkZW50aWZpZXJzIGFuZCBrZXl3b3Jkc1xuKioqKioqKioqKioqKioqKioqKioqKioqXG5cbklkZW50aWZpZXJzIChhbHNvIHJlZmVycmVkIHRvIGFzICpuYW1lcyopIGFyZSBkZXNjcmliZWQgYnkgdGhlXG5mb2xsb3dpbmcgbGV4aWNhbCBkZWZpbml0aW9uczpcblxuICAgaWRlbnRpZmllciA6Oj0gKGxldHRlcnwiXyIpIChsZXR0ZXIgfCBkaWdpdCB8ICJfIikqXG4gICBsZXR0ZXIgICAgIDo6PSBsb3dlcmNhc2UgfCB1cHBlcmNhc2VcbiAgIGxvd2VyY2FzZSAgOjo9ICJhIi4uLiJ6IlxuICAgdXBwZXJjYXNlICA6Oj0gIkEiLi4uIloiXG4gICBkaWdpdCAgICAgIDo6PSAiMCIuLi4iOSJcblxuSWRlbnRpZmllcnMgYXJlIHVubGltaXRlZCBpbiBsZW5ndGguICBDYXNlIGlzIHNpZ25pZmljYW50LlxuXG5cbktleXdvcmRzXG49PT09PT09PVxuXG5UaGUgZm9sbG93aW5nIGlkZW50aWZpZXJzIGFyZSB1c2VkIGFzIHJlc2VydmVkIHdvcmRzLCBvciAqa2V5d29yZHMqIG9mXG50aGUgbGFuZ3VhZ2UsIGFuZCBjYW5ub3QgYmUgdXNlZCBhcyBvcmRpbmFyeSBpZGVudGlmaWVycy4gIFRoZXkgbXVzdFxuYmUgc3BlbGxlZCBleGFjdGx5IGFzIHdyaXR0ZW4gaGVyZTpcblxuICAgYW5kICAgICAgIGRlbCAgICAgICBmcm9tICAgICAgbm90ICAgICAgIHdoaWxlXG4gICBhcyAgICAgICAgZWxpZiAgICAgIGdsb2JhbCAgICBvciAgICAgICAgd2l0aFxuICAgYXNzZXJ0ICAgIGVsc2UgICAgICBpZiAgICAgICAgcGFzcyAgICAgIHlpZWxkXG4gICBicmVhayAgICAgZXhjZXB0ICAgIGltcG9ydCAgICBwcmludFxuICAgY2xhc3MgICAgIGV4ZWMgICAgICBpbiAgICAgICAgcmFpc2VcbiAgIGNvbnRpbnVlICBmaW5hbGx5ICAgaXMgICAgICAgIHJldHVyblxuICAgZGVmICAgICAgIGZvciAgICAgICBsYW1iZGEgICAgdHJ5XG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAyLjQ6IGBgTm9uZWBgIGJlY2FtZSBhIGNvbnN0YW50IGFuZCBpcyBub3dcbnJlY29nbml6ZWQgYnkgdGhlIGNvbXBpbGVyIGFzIGEgbmFtZSBmb3IgdGhlIGJ1aWx0LWluIG9iamVjdCBgYE5vbmVgYC5cbkFsdGhvdWdoIGl0IGlzIG5vdCBhIGtleXdvcmQsIHlvdSBjYW5ub3QgYXNzaWduIGEgZGlmZmVyZW50IG9iamVjdCB0b1xuaXQuXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAyLjU6IEJvdGggYGBhc2BgIGFuZCBgYHdpdGhgYCBhcmUgb25seSByZWNvZ25pemVkXG53aGVuIHRoZSBgYHdpdGhfc3RhdGVtZW50YGAgZnV0dXJlIGZlYXR1cmUgaGFzIGJlZW4gZW5hYmxlZC4gSXQgd2lsbFxuYWx3YXlzIGJlIGVuYWJsZWQgaW4gUHl0aG9uIDIuNi4gIFNlZSBzZWN0aW9uICpUaGUgd2l0aCBzdGF0ZW1lbnQqIGZvclxuZGV0YWlscy4gIE5vdGUgdGhhdCB1c2luZyBgYGFzYGAgYW5kIGBgd2l0aGBgIGFzIGlkZW50aWZpZXJzIHdpbGxcbmFsd2F5cyBpc3N1ZSBhIHdhcm5pbmcsIGV2ZW4gd2hlbiB0aGUgYGB3aXRoX3N0YXRlbWVudGBgIGZ1dHVyZVxuZGlyZWN0aXZlIGlzIG5vdCBpbiBlZmZlY3QuXG5cblxuUmVzZXJ2ZWQgY2xhc3NlcyBvZiBpZGVudGlmaWVyc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5DZXJ0YWluIGNsYXNzZXMgb2YgaWRlbnRpZmllcnMgKGJlc2lkZXMga2V5d29yZHMpIGhhdmUgc3BlY2lhbFxubWVhbmluZ3MuICBUaGVzZSBjbGFzc2VzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZSBwYXR0ZXJucyBvZiBsZWFkaW5nIGFuZFxudHJhaWxpbmcgdW5kZXJzY29yZSBjaGFyYWN0ZXJzOlxuXG5gYF8qYGBcbiAgIE5vdCBpbXBvcnRlZCBieSBgYGZyb20gbW9kdWxlIGltcG9ydCAqYGAuICBUaGUgc3BlY2lhbCBpZGVudGlmaWVyXG4gICBgYF9gYCBpcyB1c2VkIGluIHRoZSBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlciB0byBzdG9yZSB0aGUgcmVzdWx0IG9mXG4gICB0aGUgbGFzdCBldmFsdWF0aW9uOyBpdCBpcyBzdG9yZWQgaW4gdGhlIGBgX19idWlsdGluX19gYCBtb2R1bGUuXG4gICBXaGVuIG5vdCBpbiBpbnRlcmFjdGl2ZSBtb2RlLCBgYF9gYCBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nIGFuZCBpc1xuICAgbm90IGRlZmluZWQuIFNlZSBzZWN0aW9uICpUaGUgaW1wb3J0IHN0YXRlbWVudCouXG5cbiAgIE5vdGU6IFRoZSBuYW1lIGBgX2BgIGlzIG9mdGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aFxuICAgICBpbnRlcm5hdGlvbmFsaXphdGlvbjsgcmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZVxuICAgICBgYGdldHRleHRgYCBtb2R1bGUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBjb252ZW50aW9uLlxuXG5gYF9fKl9fYGBcbiAgIFN5c3RlbS1kZWZpbmVkIG5hbWVzLiBUaGVzZSBuYW1lcyBhcmUgZGVmaW5lZCBieSB0aGUgaW50ZXJwcmV0ZXJcbiAgIGFuZCBpdHMgaW1wbGVtZW50YXRpb24gKGluY2x1ZGluZyB0aGUgc3RhbmRhcmQgbGlicmFyeSkuICBDdXJyZW50XG4gICBzeXN0ZW0gbmFtZXMgYXJlIGRpc2N1c3NlZCBpbiB0aGUgKlNwZWNpYWwgbWV0aG9kIG5hbWVzKiBzZWN0aW9uXG4gICBhbmQgZWxzZXdoZXJlLiAgTW9yZSB3aWxsIGxpa2VseSBiZSBkZWZpbmVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZlxuICAgUHl0aG9uLiAgKkFueSogdXNlIG9mIGBgX18qX19gYCBuYW1lcywgaW4gYW55IGNvbnRleHQsIHRoYXQgZG9lc1xuICAgbm90IGZvbGxvdyBleHBsaWNpdGx5IGRvY3VtZW50ZWQgdXNlLCBpcyBzdWJqZWN0IHRvIGJyZWFrYWdlXG4gICB3aXRob3V0IHdhcm5pbmcuXG5cbmBgX18qYGBcbiAgIENsYXNzLXByaXZhdGUgbmFtZXMuICBOYW1lcyBpbiB0aGlzIGNhdGVnb3J5LCB3aGVuIHVzZWQgd2l0aGluIHRoZVxuICAgY29udGV4dCBvZiBhIGNsYXNzIGRlZmluaXRpb24sIGFyZSByZS13cml0dGVuIHRvIHVzZSBhIG1hbmdsZWQgZm9ybVxuICAgdG8gaGVscCBhdm9pZCBuYW1lIGNsYXNoZXMgYmV0d2VlbiAicHJpdmF0ZSIgYXR0cmlidXRlcyBvZiBiYXNlIGFuZFxuICAgZGVyaXZlZCBjbGFzc2VzLiBTZWUgc2VjdGlvbiAqSWRlbnRpZmllcnMgKE5hbWVzKSouXG4nLAotICdpZic6IHUnXG5UaGUgYGBpZmBgIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKipcblxuVGhlIGBgaWZgYCBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgY29uZGl0aW9uYWwgZXhlY3V0aW9uOlxuXG4gICBpZl9zdG10IDo6PSAiaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAoICJlbGlmIiBleHByZXNzaW9uICI6IiBzdWl0ZSApKlxuICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG5cbkl0IHNlbGVjdHMgZXhhY3RseSBvbmUgb2YgdGhlIHN1aXRlcyBieSBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9ucyBvbmVcbmJ5IG9uZSB1bnRpbCBvbmUgaXMgZm91bmQgdG8gYmUgdHJ1ZSAoc2VlIHNlY3Rpb24gKkJvb2xlYW4gb3BlcmF0aW9ucypcbmZvciB0aGUgZGVmaW5pdGlvbiBvZiB0cnVlIGFuZCBmYWxzZSk7IHRoZW4gdGhhdCBzdWl0ZSBpcyBleGVjdXRlZFxuKGFuZCBubyBvdGhlciBwYXJ0IG9mIHRoZSBgYGlmYGAgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIG9yIGV2YWx1YXRlZCkuXG5JZiBhbGwgZXhwcmVzc2lvbnMgYXJlIGZhbHNlLCB0aGUgc3VpdGUgb2YgdGhlIGBgZWxzZWBgIGNsYXVzZSwgaWZcbnByZXNlbnQsIGlzIGV4ZWN1dGVkLlxuJywKLSAnaW1hZ2luYXJ5JzogdSdcbkltYWdpbmFyeSBsaXRlcmFsc1xuKioqKioqKioqKioqKioqKioqXG5cbkltYWdpbmFyeSBsaXRlcmFscyBhcmUgZGVzY3JpYmVkIGJ5IHRoZSBmb2xsb3dpbmcgbGV4aWNhbCBkZWZpbml0aW9uczpcblxuICAgaW1hZ251bWJlciA6Oj0gKGZsb2F0bnVtYmVyIHwgaW50cGFydCkgKCJqIiB8ICJKIilcblxuQW4gaW1hZ2luYXJ5IGxpdGVyYWwgeWllbGRzIGEgY29tcGxleCBudW1iZXIgd2l0aCBhIHJlYWwgcGFydCBvZiAwLjAuXG5Db21wbGV4IG51bWJlcnMgYXJlIHJlcHJlc2VudGVkIGFzIGEgcGFpciBvZiBmbG9hdGluZyBwb2ludCBudW1iZXJzXG5hbmQgaGF2ZSB0aGUgc2FtZSByZXN0cmljdGlvbnMgb24gdGhlaXIgcmFuZ2UuICBUbyBjcmVhdGUgYSBjb21wbGV4XG5udW1iZXIgd2l0aCBhIG5vbnplcm8gcmVhbCBwYXJ0LCBhZGQgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgdG8gaXQsXG5lLmcuLCBgYCgzKzRqKWBgLiAgU29tZSBleGFtcGxlcyBvZiBpbWFnaW5hcnkgbGl0ZXJhbHM6XG5cbiAgIDMuMTRqICAgMTAuaiAgICAxMGogICAgIC4wMDFqICAgMWUxMDBqICAzLjE0ZS0xMGpcbicsCi0gJ2ltcG9ydCc6IHUnXG5UaGUgYGBpbXBvcnRgYCBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4gICBpbXBvcnRfc3RtdCAgICAgOjo9ICJpbXBvcnQiIG1vZHVsZSBbImFzIiBuYW1lXSAoICIsIiBtb2R1bGUgWyJhcyIgbmFtZV0gKSpcbiAgICAgICAgICAgICAgICAgICB8ICJmcm9tIiByZWxhdGl2ZV9tb2R1bGUgImltcG9ydCIgaWRlbnRpZmllciBbImFzIiBuYW1lXVxuICAgICAgICAgICAgICAgICAgICggIiwiIGlkZW50aWZpZXIgWyJhcyIgbmFtZV0gKSpcbiAgICAgICAgICAgICAgICAgICB8ICJmcm9tIiByZWxhdGl2ZV9tb2R1bGUgImltcG9ydCIgIigiIGlkZW50aWZpZXIgWyJhcyIgbmFtZV1cbiAgICAgICAgICAgICAgICAgICAoICIsIiBpZGVudGlmaWVyIFsiYXMiIG5hbWVdICkqIFsiLCJdICIpIlxuICAgICAgICAgICAgICAgICAgIHwgImZyb20iIG1vZHVsZSAiaW1wb3J0IiAiKiJcbiAgIG1vZHVsZSAgICAgICAgICA6Oj0gKGlkZW50aWZpZXIgIi4iKSogaWRlbnRpZmllclxuICAgcmVsYXRpdmVfbW9kdWxlIDo6PSAiLiIqIG1vZHVsZSB8ICIuIitcbiAgIG5hbWUgICAgICAgICAgICA6Oj0gaWRlbnRpZmllclxuXG5JbXBvcnQgc3RhdGVtZW50cyBhcmUgZXhlY3V0ZWQgaW4gdHdvIHN0ZXBzOiAoMSkgZmluZCBhIG1vZHVsZSwgYW5kXG5pbml0aWFsaXplIGl0IGlmIG5lY2Vzc2FyeTsgKDIpIGRlZmluZSBhIG5hbWUgb3IgbmFtZXMgaW4gdGhlIGxvY2FsXG5uYW1lc3BhY2UgKG9mIHRoZSBzY29wZSB3aGVyZSB0aGUgYGBpbXBvcnRgYCBzdGF0ZW1lbnQgb2NjdXJzKS4gVGhlXG5zdGF0ZW1lbnQgY29tZXMgaW4gdHdvIGZvcm1zIGRpZmZlcmluZyBvbiB3aGV0aGVyIGl0IHVzZXMgdGhlIGBgZnJvbWBgXG5rZXl3b3JkLiBUaGUgZmlyc3QgZm9ybSAod2l0aG91dCBgYGZyb21gYCkgcmVwZWF0cyB0aGVzZSBzdGVwcyBmb3JcbmVhY2ggaWRlbnRpZmllciBpbiB0aGUgbGlzdC4gVGhlIGZvcm0gd2l0aCBgYGZyb21gYCBwZXJmb3JtcyBzdGVwICgxKVxub25jZSwgYW5kIHRoZW4gcGVyZm9ybXMgc3RlcCAoMikgcmVwZWF0ZWRseS5cblxuVG8gdW5kZXJzdGFuZCBob3cgc3RlcCAoMSkgb2NjdXJzLCBvbmUgbXVzdCBmaXJzdCB1bmRlcnN0YW5kIGhvd1xuUHl0aG9uIGhhbmRsZXMgaGllcmFyY2hpY2FsIG5hbWluZyBvZiBtb2R1bGVzLiBUbyBoZWxwIG9yZ2FuaXplXG5tb2R1bGVzIGFuZCBwcm92aWRlIGEgaGllcmFyY2h5IGluIG5hbWluZywgUHl0aG9uIGhhcyBhIGNvbmNlcHQgb2ZcbnBhY2thZ2VzLiBBIHBhY2thZ2UgY2FuIGNvbnRhaW4gb3RoZXIgcGFja2FnZXMgYW5kIG1vZHVsZXMgd2hpbGVcbm1vZHVsZXMgY2Fubm90IGNvbnRhaW4gb3RoZXIgbW9kdWxlcyBvciBwYWNrYWdlcy4gRnJvbSBhIGZpbGUgc3lzdGVtXG5wZXJzcGVjdGl2ZSwgcGFja2FnZXMgYXJlIGRpcmVjdG9yaWVzIGFuZCBtb2R1bGVzIGFyZSBmaWxlcy4gVGhlXG5vcmlnaW5hbCBzcGVjaWZpY2F0aW9uIGZvciBwYWNrYWdlcyBpcyBzdGlsbCBhdmFpbGFibGUgdG8gcmVhZCxcbmFsdGhvdWdoIG1pbm9yIGRldGFpbHMgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSB3cml0aW5nIG9mIHRoYXRcbmRvY3VtZW50LlxuXG5PbmNlIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgaXMga25vd24gKHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLCB0aGVcbnRlcm0gIm1vZHVsZSIgd2lsbCByZWZlciB0byBib3RoIHBhY2thZ2VzIGFuZCBtb2R1bGVzKSwgc2VhcmNoaW5nIGZvclxudGhlIG1vZHVsZSBvciBwYWNrYWdlIGNhbiBiZWdpbi4gVGhlIGZpcnN0IHBsYWNlIGNoZWNrZWQgaXNcbmBgc3lzLm1vZHVsZXNgYCwgdGhlIGNhY2hlIG9mIGFsbCBtb2R1bGVzIHRoYXQgaGF2ZSBiZWVuIGltcG9ydGVkXG5wcmV2aW91c2x5LiBJZiB0aGUgbW9kdWxlIGlzIGZvdW5kIHRoZXJlIHRoZW4gaXQgaXMgdXNlZCBpbiBzdGVwICgyKVxub2YgaW1wb3J0LlxuXG5JZiB0aGUgbW9kdWxlIGlzIG5vdCBmb3VuZCBpbiB0aGUgY2FjaGUsIHRoZW4gYGBzeXMubWV0YV9wYXRoYGAgaXNcbnNlYXJjaGVkICh0aGUgc3BlY2lmaWNhdGlvbiBmb3IgYGBzeXMubWV0YV9wYXRoYGAgY2FuIGJlIGZvdW5kIGluXG4qKlBFUCAzMDIqKikuIFRoZSBvYmplY3QgaXMgYSBsaXN0IG9mICpmaW5kZXIqIG9iamVjdHMgd2hpY2ggYXJlXG5xdWVyaWVkIGluIG9yZGVyIGFzIHRvIHdoZXRoZXIgdGhleSBrbm93IGhvdyB0byBsb2FkIHRoZSBtb2R1bGUgYnlcbmNhbGxpbmcgdGhlaXIgYGBmaW5kX21vZHVsZSgpYGAgbWV0aG9kIHdpdGggdGhlIG5hbWUgb2YgdGhlIG1vZHVsZS4gSWZcbnRoZSBtb2R1bGUgaGFwcGVucyB0byBiZSBjb250YWluZWQgd2l0aGluIGEgcGFja2FnZSAoYXMgZGVub3RlZCBieSB0aGVcbmV4aXN0ZW5jZSBvZiBhIGRvdCBpbiB0aGUgbmFtZSksIHRoZW4gYSBzZWNvbmQgYXJndW1lbnQgdG9cbmBgZmluZF9tb2R1bGUoKWBgIGlzIGdpdmVuIGFzIHRoZSB2YWx1ZSBvZiB0aGUgYGBfX3BhdGhfX2BgIGF0dHJpYnV0ZVxuZnJvbSB0aGUgcGFyZW50IHBhY2thZ2UgKGV2ZXJ5dGhpbmcgdXAgdG8gdGhlIGxhc3QgZG90IGluIHRoZSBuYW1lIG9mXG50aGUgbW9kdWxlIGJlaW5nIGltcG9ydGVkKS4gSWYgYSBmaW5kZXIgY2FuIGZpbmQgdGhlIG1vZHVsZSBpdCByZXR1cm5zXG5hICpsb2FkZXIqIChkaXNjdXNzZWQgbGF0ZXIpIG9yIHJldHVybnMgYGBOb25lYGAuXG5cbklmIG5vbmUgb2YgdGhlIGZpbmRlcnMgb24gYGBzeXMubWV0YV9wYXRoYGAgYXJlIGFibGUgdG8gZmluZCB0aGVcbm1vZHVsZSB0aGVuIHNvbWUgaW1wbGljaXRseSBkZWZpbmVkIGZpbmRlcnMgYXJlIHF1ZXJpZWQuXG5JbXBsZW1lbnRhdGlvbnMgb2YgUHl0aG9uIHZhcnkgaW4gd2hhdCBpbXBsaWNpdCBtZXRhIHBhdGggZmluZGVycyBhcmVcbmRlZmluZWQuIFRoZSBvbmUgdGhleSBhbGwgZG8gZGVmaW5lLCB0aG91Z2gsIGlzIG9uZSB0aGF0IGhhbmRsZXNcbmBgc3lzLnBhdGhfaG9va3NgYCwgYGBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZWBgLCBhbmQgYGBzeXMucGF0aGBgLlxuXG5UaGUgaW1wbGljaXQgZmluZGVyIHNlYXJjaGVzIGZvciB0aGUgcmVxdWVzdGVkIG1vZHVsZSBpbiB0aGUgInBhdGhzIlxuc3BlY2lmaWVkIGluIG9uZSBvZiB0d28gcGxhY2VzICgicGF0aHMiIGRvIG5vdCBoYXZlIHRvIGJlIGZpbGUgc3lzdGVtXG5wYXRocykuIElmIHRoZSBtb2R1bGUgYmVpbmcgaW1wb3J0ZWQgaXMgc3VwcG9zZWQgdG8gYmUgY29udGFpbmVkXG53aXRoaW4gYSBwYWNrYWdlIHRoZW4gdGhlIHNlY29uZCBhcmd1bWVudCBwYXNzZWQgdG8gYGBmaW5kX21vZHVsZSgpYGAsXG5gYF9fcGF0aF9fYGAgb24gdGhlIHBhcmVudCBwYWNrYWdlLCBpcyB1c2VkIGFzIHRoZSBzb3VyY2Ugb2YgcGF0aHMuIElmXG50aGUgbW9kdWxlIGlzIG5vdCBjb250YWluZWQgaW4gYSBwYWNrYWdlIHRoZW4gYGBzeXMucGF0aGBgIGlzIHVzZWQgYXNcbnRoZSBzb3VyY2Ugb2YgcGF0aHMuXG5cbk9uY2UgdGhlIHNvdXJjZSBvZiBwYXRocyBpcyBjaG9zZW4gaXQgaXMgaXRlcmF0ZWQgb3ZlciB0byBmaW5kIGFcbmZpbmRlciB0aGF0IGNhbiBoYW5kbGUgdGhhdCBwYXRoLiBUaGUgZGljdCBhdFxuYGBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZWBgIGNhY2hlcyBmaW5kZXJzIGZvciBwYXRocyBhbmQgaXMgY2hlY2tlZFxuZm9yIGEgZmluZGVyLiBJZiB0aGUgcGF0aCBkb2VzIG5vdCBoYXZlIGEgZmluZGVyIGNhY2hlZCB0aGVuXG5gYHN5cy5wYXRoX2hvb2tzYGAgaXMgc2VhcmNoZWQgYnkgY2FsbGluZyBlYWNoIG9iamVjdCBpbiB0aGUgbGlzdCB3aXRoXG5hIHNpbmdsZSBhcmd1bWVudCBvZiB0aGUgcGF0aCwgcmV0dXJuaW5nIGEgZmluZGVyIG9yIHJhaXNlc1xuYGBJbXBvcnRFcnJvcmBgLiBJZiBhIGZpbmRlciBpcyByZXR1cm5lZCB0aGVuIGl0IGlzIGNhY2hlZCBpblxuYGBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZWBgIGFuZCB0aGVuIHVzZWQgZm9yIHRoYXQgcGF0aCBlbnRyeS4gSWYgbm9cbmZpbmRlciBjYW4gYmUgZm91bmQgYnV0IHRoZSBwYXRoIGV4aXN0cyB0aGVuIGEgdmFsdWUgb2YgYGBOb25lYGAgaXNcbnN0b3JlZCBpbiBgYHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlYGAgdG8gc2lnbmlmeSB0aGF0IGFuIGltcGxpY2l0LFxuZmlsZS1iYXNlZCBmaW5kZXIgdGhhdCBoYW5kbGVzIG1vZHVsZXMgc3RvcmVkIGFzIGluZGl2aWR1YWwgZmlsZXNcbnNob3VsZCBiZSB1c2VkIGZvciB0aGF0IHBhdGguIElmIHRoZSBwYXRoIGRvZXMgbm90IGV4aXN0IHRoZW4gYSBmaW5kZXJcbndoaWNoIGFsd2F5cyByZXR1cm5zIGBgTm9uZWBgIGlzIHBsYWNlZCBpbiB0aGUgY2FjaGUgZm9yIHRoZSBwYXRoLlxuXG5JZiBubyBmaW5kZXIgY2FuIGZpbmQgdGhlIG1vZHVsZSB0aGVuIGBgSW1wb3J0RXJyb3JgYCBpcyByYWlzZWQuXG5PdGhlcndpc2Ugc29tZSBmaW5kZXIgcmV0dXJuZWQgYSBsb2FkZXIgd2hvc2UgYGBsb2FkX21vZHVsZSgpYGAgbWV0aG9kXG5pcyBjYWxsZWQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIGxvYWQgKHNlZSAqKlBFUCAzMDIqKiBmb3IgdGhlXG5vcmlnaW5hbCBkZWZpbml0aW9uIG9mIGxvYWRlcnMpLiBBIGxvYWRlciBoYXMgc2V2ZXJhbCByZXNwb25zaWJpbGl0aWVzXG50byBwZXJmb3JtIG9uIGEgbW9kdWxlIGl0IGxvYWRzLiBGaXJzdCwgaWYgdGhlIG1vZHVsZSBhbHJlYWR5IGV4aXN0c1xuaW4gYGBzeXMubW9kdWxlc2BgIChhIHBvc3NpYmlsaXR5IGlmIHRoZSBsb2FkZXIgaXMgY2FsbGVkIG91dHNpZGUgb2ZcbnRoZSBpbXBvcnQgbWFjaGluZXJ5KSB0aGVuIGl0IGlzIHRvIHVzZSB0aGF0IG1vZHVsZSBmb3IgaW5pdGlhbGl6YXRpb25cbmFuZCBub3QgYSBuZXcgbW9kdWxlLiBCdXQgaWYgdGhlIG1vZHVsZSBkb2VzIG5vdCBleGlzdCBpblxuYGBzeXMubW9kdWxlc2BgIHRoZW4gaXQgaXMgdG8gYmUgYWRkZWQgdG8gdGhhdCBkaWN0IGJlZm9yZVxuaW5pdGlhbGl6YXRpb24gYmVnaW5zLiBJZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGxvYWRpbmcgb2YgdGhlIG1vZHVsZVxuYW5kIGl0IHdhcyBhZGRlZCB0byBgYHN5cy5tb2R1bGVzYGAgaXQgaXMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBkaWN0LlxuSWYgYW4gZXJyb3Igb2NjdXJzIGJ1dCB0aGUgbW9kdWxlIHdhcyBhbHJlYWR5IGluIGBgc3lzLm1vZHVsZXNgYCBpdCBpc1xubGVmdCBpbiB0aGUgZGljdC5cblxuVGhlIGxvYWRlciBtdXN0IHNldCBzZXZlcmFsIGF0dHJpYnV0ZXMgb24gdGhlIG1vZHVsZS4gYGBfX25hbWVfX2BgIGlzXG50byBiZSBzZXQgdG8gdGhlIG5hbWUgb2YgdGhlIG1vZHVsZS4gYGBfX2ZpbGVfX2BgIGlzIHRvIGJlIHRoZSAicGF0aCJcbnRvIHRoZSBmaWxlIHVubGVzcyB0aGUgbW9kdWxlIGlzIGJ1aWx0LWluIChhbmQgdGh1cyBsaXN0ZWQgaW5cbmBgc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzYGApIGluIHdoaWNoIGNhc2UgdGhlIGF0dHJpYnV0ZSBpcyBub3Qgc2V0LlxuSWYgd2hhdCBpcyBiZWluZyBpbXBvcnRlZCBpcyBhIHBhY2thZ2UgdGhlbiBgYF9fcGF0aF9fYGAgaXMgdG8gYmUgc2V0XG50byBhIGxpc3Qgb2YgcGF0aHMgdG8gYmUgc2VhcmNoZWQgd2hlbiBsb29raW5nIGZvciBtb2R1bGVzIGFuZFxucGFja2FnZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgcGFja2FnZSBiZWluZyBpbXBvcnRlZC4gYGBfX3BhY2thZ2VfX2BgXG5pcyBvcHRpb25hbCBidXQgc2hvdWxkIGJlIHNldCB0byB0aGUgbmFtZSBvZiBwYWNrYWdlIHRoYXQgY29udGFpbnMgdGhlXG5tb2R1bGUgb3IgcGFja2FnZSAodGhlIGVtcHR5IHN0cmluZyBpcyB1c2VkIGZvciBtb2R1bGUgbm90IGNvbnRhaW5lZFxuaW4gYSBwYWNrYWdlKS4gYGBfX2xvYWRlcl9fYGAgaXMgYWxzbyBvcHRpb25hbCBidXQgc2hvdWxkIGJlIHNldCB0b1xudGhlIGxvYWRlciBvYmplY3QgdGhhdCBpcyBsb2FkaW5nIHRoZSBtb2R1bGUuXG5cbklmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgbG9hZGluZyB0aGVuIHRoZSBsb2FkZXIgcmFpc2VzXG5gYEltcG9ydEVycm9yYGAgaWYgc29tZSBvdGhlciBleGNlcHRpb24gaXMgbm90IGFscmVhZHkgYmVpbmdcbnByb3BhZ2F0ZWQuIE90aGVyd2lzZSB0aGUgbG9hZGVyIHJldHVybnMgdGhlIG1vZHVsZSB0aGF0IHdhcyBsb2FkZWRcbmFuZCBpbml0aWFsaXplZC5cblxuV2hlbiBzdGVwICgxKSBmaW5pc2hlcyB3aXRob3V0IHJhaXNpbmcgYW4gZXhjZXB0aW9uLCBzdGVwICgyKSBjYW5cbmJlZ2luLlxuXG5UaGUgZmlyc3QgZm9ybSBvZiBgYGltcG9ydGBgIHN0YXRlbWVudCBiaW5kcyB0aGUgbW9kdWxlIG5hbWUgaW4gdGhlXG5sb2NhbCBuYW1lc3BhY2UgdG8gdGhlIG1vZHVsZSBvYmplY3QsIGFuZCB0aGVuIGdvZXMgb24gdG8gaW1wb3J0IHRoZVxubmV4dCBpZGVudGlmaWVyLCBpZiBhbnkuICBJZiB0aGUgbW9kdWxlIG5hbWUgaXMgZm9sbG93ZWQgYnkgYGBhc2BgLFxudGhlIG5hbWUgZm9sbG93aW5nIGBgYXNgYCBpcyB1c2VkIGFzIHRoZSBsb2NhbCBuYW1lIGZvciB0aGUgbW9kdWxlLlxuXG5UaGUgYGBmcm9tYGAgZm9ybSBkb2VzIG5vdCBiaW5kIHRoZSBtb2R1bGUgbmFtZTogaXQgZ29lcyB0aHJvdWdoIHRoZVxubGlzdCBvZiBpZGVudGlmaWVycywgbG9va3MgZWFjaCBvbmUgb2YgdGhlbSB1cCBpbiB0aGUgbW9kdWxlIGZvdW5kIGluXG5zdGVwICgxKSwgYW5kIGJpbmRzIHRoZSBuYW1lIGluIHRoZSBsb2NhbCBuYW1lc3BhY2UgdG8gdGhlIG9iamVjdCB0aHVzXG5mb3VuZC4gIEFzIHdpdGggdGhlIGZpcnN0IGZvcm0gb2YgYGBpbXBvcnRgYCwgYW4gYWx0ZXJuYXRlIGxvY2FsIG5hbWVcbmNhbiBiZSBzdXBwbGllZCBieSBzcGVjaWZ5aW5nICJgYGFzYGAgbG9jYWxuYW1lIi4gIElmIGEgbmFtZSBpcyBub3RcbmZvdW5kLCBgYEltcG9ydEVycm9yYGAgaXMgcmFpc2VkLiAgSWYgdGhlIGxpc3Qgb2YgaWRlbnRpZmllcnMgaXNcbnJlcGxhY2VkIGJ5IGEgc3RhciAoYGBcJypcJ2BgKSwgYWxsIHB1YmxpYyBuYW1lcyBkZWZpbmVkIGluIHRoZSBtb2R1bGVcbmFyZSBib3VuZCBpbiB0aGUgbG9jYWwgbmFtZXNwYWNlIG9mIHRoZSBgYGltcG9ydGBgIHN0YXRlbWVudC4uXG5cblRoZSAqcHVibGljIG5hbWVzKiBkZWZpbmVkIGJ5IGEgbW9kdWxlIGFyZSBkZXRlcm1pbmVkIGJ5IGNoZWNraW5nIHRoZVxubW9kdWxlXCdzIG5hbWVzcGFjZSBmb3IgYSB2YXJpYWJsZSBuYW1lZCBgYF9fYWxsX19gYDsgaWYgZGVmaW5lZCwgaXRcbm11c3QgYmUgYSBzZXF1ZW5jZSBvZiBzdHJpbmdzIHdoaWNoIGFyZSBuYW1lcyBkZWZpbmVkIG9yIGltcG9ydGVkIGJ5XG50aGF0IG1vZHVsZS4gIFRoZSBuYW1lcyBnaXZlbiBpbiBgYF9fYWxsX19gYCBhcmUgYWxsIGNvbnNpZGVyZWQgcHVibGljXG5hbmQgYXJlIHJlcXVpcmVkIHRvIGV4aXN0LiAgSWYgYGBfX2FsbF9fYGAgaXMgbm90IGRlZmluZWQsIHRoZSBzZXQgb2ZcbnB1YmxpYyBuYW1lcyBpbmNsdWRlcyBhbGwgbmFtZXMgZm91bmQgaW4gdGhlIG1vZHVsZVwncyBuYW1lc3BhY2Ugd2hpY2hcbmRvIG5vdCBiZWdpbiB3aXRoIGFuIHVuZGVyc2NvcmUgY2hhcmFjdGVyIChgYFwnX1wnYGApLiBgYF9fYWxsX19gYFxuc2hvdWxkIGNvbnRhaW4gdGhlIGVudGlyZSBwdWJsaWMgQVBJLiBJdCBpcyBpbnRlbmRlZCB0byBhdm9pZFxuYWNjaWRlbnRhbGx5IGV4cG9ydGluZyBpdGVtcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgQVBJIChzdWNoIGFzXG5saWJyYXJ5IG1vZHVsZXMgd2hpY2ggd2VyZSBpbXBvcnRlZCBhbmQgdXNlZCB3aXRoaW4gdGhlIG1vZHVsZSkuXG5cblRoZSBgYGZyb21gYCBmb3JtIHdpdGggYGAqYGAgbWF5IG9ubHkgb2NjdXIgaW4gYSBtb2R1bGUgc2NvcGUuICBJZiB0aGVcbndpbGQgY2FyZCBmb3JtIG9mIGltcG9ydCAtLS0gYGBpbXBvcnQgKmBgIC0tLSBpcyB1c2VkIGluIGEgZnVuY3Rpb25cbmFuZCB0aGUgZnVuY3Rpb24gY29udGFpbnMgb3IgaXMgYSBuZXN0ZWQgYmxvY2sgd2l0aCBmcmVlIHZhcmlhYmxlcyxcbnRoZSBjb21waWxlciB3aWxsIHJhaXNlIGEgYGBTeW50YXhFcnJvcmBgLlxuXG5XaGVuIHNwZWNpZnlpbmcgd2hhdCBtb2R1bGUgdG8gaW1wb3J0IHlvdSBkbyBub3QgaGF2ZSB0byBzcGVjaWZ5IHRoZVxuYWJzb2x1dGUgbmFtZSBvZiB0aGUgbW9kdWxlLiBXaGVuIGEgbW9kdWxlIG9yIHBhY2thZ2UgaXMgY29udGFpbmVkXG53aXRoaW4gYW5vdGhlciBwYWNrYWdlIGl0IGlzIHBvc3NpYmxlIHRvIG1ha2UgYSByZWxhdGl2ZSBpbXBvcnQgd2l0aGluXG50aGUgc2FtZSB0b3AgcGFja2FnZSB3aXRob3V0IGhhdmluZyB0byBtZW50aW9uIHRoZSBwYWNrYWdlIG5hbWUuIEJ5XG51c2luZyBsZWFkaW5nIGRvdHMgaW4gdGhlIHNwZWNpZmllZCBtb2R1bGUgb3IgcGFja2FnZSBhZnRlciBgYGZyb21gYFxueW91IGNhbiBzcGVjaWZ5IGhvdyBoaWdoIHRvIHRyYXZlcnNlIHVwIHRoZSBjdXJyZW50IHBhY2thZ2UgaGllcmFyY2h5XG53aXRob3V0IHNwZWNpZnlpbmcgZXhhY3QgbmFtZXMuIE9uZSBsZWFkaW5nIGRvdCBtZWFucyB0aGUgY3VycmVudFxucGFja2FnZSB3aGVyZSB0aGUgbW9kdWxlIG1ha2luZyB0aGUgaW1wb3J0IGV4aXN0cy4gVHdvIGRvdHMgbWVhbnMgdXBcbm9uZSBwYWNrYWdlIGxldmVsLiBUaHJlZSBkb3RzIGlzIHVwIHR3byBsZXZlbHMsIGV0Yy4gU28gaWYgeW91IGV4ZWN1dGVcbmBgZnJvbSAuIGltcG9ydCBtb2RgYCBmcm9tIGEgbW9kdWxlIGluIHRoZSBgYHBrZ2BgIHBhY2thZ2UgdGhlbiB5b3VcbndpbGwgZW5kIHVwIGltcG9ydGluZyBgYHBrZy5tb2RgYC4gSWYgeW91IGV4ZWN1dGUgYGBmcm9tIC4uc3VicGtnMlxuaW1wb3J0IG1vZGBgIGZyb20gd2l0aGluIGBgcGtnLnN1YnBrZzFgYCB5b3Ugd2lsbCBpbXBvcnRcbmBgcGtnLnN1YnBrZzIubW9kYGAuIFRoZSBzcGVjaWZpY2F0aW9uIGZvciByZWxhdGl2ZSBpbXBvcnRzIGlzXG5jb250YWluZWQgd2l0aGluICoqUEVQIDMyOCoqLlxuXG5gYGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKClgYCBpcyBwcm92aWRlZCB0byBzdXBwb3J0IGFwcGxpY2F0aW9ucyB0aGF0XG5kZXRlcm1pbmUgd2hpY2ggbW9kdWxlcyBuZWVkIHRvIGJlIGxvYWRlZCBkeW5hbWljYWxseS5cblxuXG5GdXR1cmUgc3RhdGVtZW50c1xuPT09PT09PT09PT09PT09PT1cblxuQSAqZnV0dXJlIHN0YXRlbWVudCogaXMgYSBkaXJlY3RpdmUgdG8gdGhlIGNvbXBpbGVyIHRoYXQgYSBwYXJ0aWN1bGFyXG5tb2R1bGUgc2hvdWxkIGJlIGNvbXBpbGVkIHVzaW5nIHN5bnRheCBvciBzZW1hbnRpY3MgdGhhdCB3aWxsIGJlXG5hdmFpbGFibGUgaW4gYSBzcGVjaWZpZWQgZnV0dXJlIHJlbGVhc2Ugb2YgUHl0aG9uLiAgVGhlIGZ1dHVyZVxuc3RhdGVtZW50IGlzIGludGVuZGVkIHRvIGVhc2UgbWlncmF0aW9uIHRvIGZ1dHVyZSB2ZXJzaW9ucyBvZiBQeXRob25cbnRoYXQgaW50cm9kdWNlIGluY29tcGF0aWJsZSBjaGFuZ2VzIHRvIHRoZSBsYW5ndWFnZS4gIEl0IGFsbG93cyB1c2Ugb2ZcbnRoZSBuZXcgZmVhdHVyZXMgb24gYSBwZXItbW9kdWxlIGJhc2lzIGJlZm9yZSB0aGUgcmVsZWFzZSBpbiB3aGljaCB0aGVcbmZlYXR1cmUgYmVjb21lcyBzdGFuZGFyZC5cblxuICAgZnV0dXJlX3N0YXRlbWVudCA6Oj0gImZyb20iICJfX2Z1dHVyZV9fIiAiaW1wb3J0IiBmZWF0dXJlIFsiYXMiIG5hbWVdXG4gICAgICAgICAgICAgICAgICAgICAgICAoIiwiIGZlYXR1cmUgWyJhcyIgbmFtZV0pKlxuICAgICAgICAgICAgICAgICAgICAgICAgfCAiZnJvbSIgIl9fZnV0dXJlX18iICJpbXBvcnQiICIoIiBmZWF0dXJlIFsiYXMiIG5hbWVdXG4gICAgICAgICAgICAgICAgICAgICAgICAoIiwiIGZlYXR1cmUgWyJhcyIgbmFtZV0pKiBbIiwiXSAiKSJcbiAgIGZlYXR1cmUgICAgICAgICAgOjo9IGlkZW50aWZpZXJcbiAgIG5hbWUgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXJcblxuQSBmdXR1cmUgc3RhdGVtZW50IG11c3QgYXBwZWFyIG5lYXIgdGhlIHRvcCBvZiB0aGUgbW9kdWxlLiAgVGhlIG9ubHlcbmxpbmVzIHRoYXQgY2FuIGFwcGVhciBiZWZvcmUgYSBmdXR1cmUgc3RhdGVtZW50IGFyZTpcblxuKiB0aGUgbW9kdWxlIGRvY3N0cmluZyAoaWYgYW55KSxcblxuKiBjb21tZW50cyxcblxuKiBibGFuayBsaW5lcywgYW5kXG5cbiogb3RoZXIgZnV0dXJlIHN0YXRlbWVudHMuXG5cblRoZSBmZWF0dXJlcyByZWNvZ25pemVkIGJ5IFB5dGhvbiAyLjYgYXJlIGBgdW5pY29kZV9saXRlcmFsc2BgLFxuYGBwcmludF9mdW5jdGlvbmBgLCBgYGFic29sdXRlX2ltcG9ydGBgLCBgYGRpdmlzaW9uYGAsIGBgZ2VuZXJhdG9yc2BgLFxuYGBuZXN0ZWRfc2NvcGVzYGAgYW5kIGBgd2l0aF9zdGF0ZW1lbnRgYC4gIGBgZ2VuZXJhdG9yc2BgLFxuYGB3aXRoX3N0YXRlbWVudGBgLCBgYG5lc3RlZF9zY29wZXNgYCBhcmUgcmVkdW5kYW50IGluIFB5dGhvbiB2ZXJzaW9uXG4yLjYgYW5kIGFib3ZlIGJlY2F1c2UgdGhleSBhcmUgYWx3YXlzIGVuYWJsZWQuXG5cbkEgZnV0dXJlIHN0YXRlbWVudCBpcyByZWNvZ25pemVkIGFuZCB0cmVhdGVkIHNwZWNpYWxseSBhdCBjb21waWxlXG50aW1lOiBDaGFuZ2VzIHRvIHRoZSBzZW1hbnRpY3Mgb2YgY29yZSBjb25zdHJ1Y3RzIGFyZSBvZnRlblxuaW1wbGVtZW50ZWQgYnkgZ2VuZXJhdGluZyBkaWZmZXJlbnQgY29kZS4gIEl0IG1heSBldmVuIGJlIHRoZSBjYXNlXG50aGF0IGEgbmV3IGZlYXR1cmUgaW50cm9kdWNlcyBuZXcgaW5jb21wYXRpYmxlIHN5bnRheCAoc3VjaCBhcyBhIG5ld1xucmVzZXJ2ZWQgd29yZCksIGluIHdoaWNoIGNhc2UgdGhlIGNvbXBpbGVyIG1heSBuZWVkIHRvIHBhcnNlIHRoZVxubW9kdWxlIGRpZmZlcmVudGx5LiAgU3VjaCBkZWNpc2lvbnMgY2Fubm90IGJlIHB1c2hlZCBvZmYgdW50aWxcbnJ1bnRpbWUuXG5cbkZvciBhbnkgZ2l2ZW4gcmVsZWFzZSwgdGhlIGNvbXBpbGVyIGtub3dzIHdoaWNoIGZlYXR1cmUgbmFtZXMgaGF2ZVxuYmVlbiBkZWZpbmVkLCBhbmQgcmFpc2VzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGEgZnV0dXJlIHN0YXRlbWVudFxuY29udGFpbnMgYSBmZWF0dXJlIG5vdCBrbm93biB0byBpdC5cblxuVGhlIGRpcmVjdCBydW50aW1lIHNlbWFudGljcyBhcmUgdGhlIHNhbWUgYXMgZm9yIGFueSBpbXBvcnQgc3RhdGVtZW50OlxudGhlcmUgaXMgYSBzdGFuZGFyZCBtb2R1bGUgYGBfX2Z1dHVyZV9fYGAsIGRlc2NyaWJlZCBsYXRlciwgYW5kIGl0XG53aWxsIGJlIGltcG9ydGVkIGluIHRoZSB1c3VhbCB3YXkgYXQgdGhlIHRpbWUgdGhlIGZ1dHVyZSBzdGF0ZW1lbnQgaXNcbmV4ZWN1dGVkLlxuXG5UaGUgaW50ZXJlc3RpbmcgcnVudGltZSBzZW1hbnRpY3MgZGVwZW5kIG9uIHRoZSBzcGVjaWZpYyBmZWF0dXJlXG5lbmFibGVkIGJ5IHRoZSBmdXR1cmUgc3RhdGVtZW50LlxuXG5Ob3RlIHRoYXQgdGhlcmUgaXMgbm90aGluZyBzcGVjaWFsIGFib3V0IHRoZSBzdGF0ZW1lbnQ6XG5cbiAgIGltcG9ydCBfX2Z1dHVyZV9fIFthcyBuYW1lXVxuXG5UaGF0IGlzIG5vdCBhIGZ1dHVyZSBzdGF0ZW1lbnQ7IGl0XCdzIGFuIG9yZGluYXJ5IGltcG9ydCBzdGF0ZW1lbnQgd2l0aFxubm8gc3BlY2lhbCBzZW1hbnRpY3Mgb3Igc3ludGF4IHJlc3RyaWN0aW9ucy5cblxuQ29kZSBjb21waWxlZCBieSBhbiBgYGV4ZWNgYCBzdGF0ZW1lbnQgb3IgY2FsbHMgdG8gdGhlIGJ1aWx0LWluXG5mdW5jdGlvbnMgYGBjb21waWxlKClgYCBhbmQgYGBleGVjZmlsZSgpYGAgdGhhdCBvY2N1ciBpbiBhIG1vZHVsZVxuYGBNYGAgY29udGFpbmluZyBhIGZ1dHVyZSBzdGF0ZW1lbnQgd2lsbCwgYnkgZGVmYXVsdCwgdXNlIHRoZSBuZXdcbnN5bnRheCBvciBzZW1hbnRpY3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBmdXR1cmUgc3RhdGVtZW50LiAgVGhpcyBjYW4sXG5zdGFydGluZyB3aXRoIFB5dGhvbiAyLjIgYmUgY29udHJvbGxlZCBieSBvcHRpb25hbCBhcmd1bWVudHMgdG9cbmBgY29tcGlsZSgpYGAgLS0tIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGF0IGZ1bmN0aW9uIGZvciBkZXRhaWxzLlxuXG5BIGZ1dHVyZSBzdGF0ZW1lbnQgdHlwZWQgYXQgYW4gaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgcHJvbXB0IHdpbGxcbnRha2UgZWZmZWN0IGZvciB0aGUgcmVzdCBvZiB0aGUgaW50ZXJwcmV0ZXIgc2Vzc2lvbi4gIElmIGFuXG5pbnRlcnByZXRlciBpcyBzdGFydGVkIHdpdGggdGhlICotaSogb3B0aW9uLCBpcyBwYXNzZWQgYSBzY3JpcHQgbmFtZVxudG8gZXhlY3V0ZSwgYW5kIHRoZSBzY3JpcHQgaW5jbHVkZXMgYSBmdXR1cmUgc3RhdGVtZW50LCBpdCB3aWxsIGJlIGluXG5lZmZlY3QgaW4gdGhlIGludGVyYWN0aXZlIHNlc3Npb24gc3RhcnRlZCBhZnRlciB0aGUgc2NyaXB0IGlzXG5leGVjdXRlZC5cblxuU2VlIGFsc286XG5cbiAgICoqUEVQIDIzNioqIC0gQmFjayB0byB0aGUgX19mdXR1cmVfX1xuICAgICAgVGhlIG9yaWdpbmFsIHByb3Bvc2FsIGZvciB0aGUgX19mdXR1cmVfXyBtZWNoYW5pc20uXG4nLAotICdpbic6IHUnXG5Db21wYXJpc29uc1xuKioqKioqKioqKipcblxuVW5saWtlIEMsIGFsbCBjb21wYXJpc29uIG9wZXJhdGlvbnMgaW4gUHl0aG9uIGhhdmUgdGhlIHNhbWUgcHJpb3JpdHksXG53aGljaCBpcyBsb3dlciB0aGFuIHRoYXQgb2YgYW55IGFyaXRobWV0aWMsIHNoaWZ0aW5nIG9yIGJpdHdpc2Vcbm9wZXJhdGlvbi4gIEFsc28gdW5saWtlIEMsIGV4cHJlc3Npb25zIGxpa2UgYGBhIDwgYiA8IGNgYCBoYXZlIHRoZVxuaW50ZXJwcmV0YXRpb24gdGhhdCBpcyBjb252ZW50aW9uYWwgaW4gbWF0aGVtYXRpY3M6XG5cbiAgIGNvbXBhcmlzb24gICAgOjo9IG9yX2V4cHIgKCBjb21wX29wZXJhdG9yIG9yX2V4cHIgKSpcbiAgIGNvbXBfb3BlcmF0b3IgOjo9ICI8IiB8ICI+IiB8ICI9PSIgfCAiPj0iIHwgIjw9IiB8ICI8PiIgfCAiIT0iXG4gICAgICAgICAgICAgICAgICAgICB8ICJpcyIgWyJub3QiXSB8IFsibm90Il0gImluIlxuXG5Db21wYXJpc29ucyB5aWVsZCBib29sZWFuIHZhbHVlczogYGBUcnVlYGAgb3IgYGBGYWxzZWBgLlxuXG5Db21wYXJpc29ucyBjYW4gYmUgY2hhaW5lZCBhcmJpdHJhcmlseSwgZS5nLiwgYGB4IDwgeSA8PSB6YGAgaXNcbmVxdWl2YWxlbnQgdG8gYGB4IDwgeSBhbmQgeSA8PSB6YGAsIGV4Y2VwdCB0aGF0IGBgeWBgIGlzIGV2YWx1YXRlZFxub25seSBvbmNlIChidXQgaW4gYm90aCBjYXNlcyBgYHpgYCBpcyBub3QgZXZhbHVhdGVkIGF0IGFsbCB3aGVuIGBgeCA8XG55YGAgaXMgZm91bmQgdG8gYmUgZmFsc2UpLlxuXG5Gb3JtYWxseSwgaWYgKmEqLCAqYiosICpjKiwgLi4uLCAqeSosICp6KiBhcmUgZXhwcmVzc2lvbnMgYW5kICpvcDEqLFxuKm9wMiosIC4uLiwgKm9wTiogYXJlIGNvbXBhcmlzb24gb3BlcmF0b3JzLCB0aGVuIGBgYSBvcDEgYiBvcDIgYyAuLi4geVxub3BOIHpgYCBpcyBlcXVpdmFsZW50IHRvIGBgYSBvcDEgYiBhbmQgYiBvcDIgYyBhbmQgLi4uIHkgb3BOIHpgYCxcbmV4Y2VwdCB0aGF0IGVhY2ggZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgYXQgbW9zdCBvbmNlLlxuXG5Ob3RlIHRoYXQgYGBhIG9wMSBiIG9wMiBjYGAgZG9lc25cJ3QgaW1wbHkgYW55IGtpbmQgb2YgY29tcGFyaXNvblxuYmV0d2VlbiAqYSogYW5kICpjKiwgc28gdGhhdCwgZS5nLiwgYGB4IDwgeSA+IHpgYCBpcyBwZXJmZWN0bHkgbGVnYWxcbih0aG91Z2ggcGVyaGFwcyBub3QgcHJldHR5KS5cblxuVGhlIGZvcm1zIGBgPD5gYCBhbmQgYGAhPWBgIGFyZSBlcXVpdmFsZW50OyBmb3IgY29uc2lzdGVuY3kgd2l0aCBDLFxuYGAhPWBgIGlzIHByZWZlcnJlZDsgd2hlcmUgYGAhPWBgIGlzIG1lbnRpb25lZCBiZWxvdyBgYDw+YGAgaXMgYWxzb1xuYWNjZXB0ZWQuICBUaGUgYGA8PmBgIHNwZWxsaW5nIGlzIGNvbnNpZGVyZWQgb2Jzb2xlc2NlbnQuXG5cblRoZSBvcGVyYXRvcnMgYGA8YGAsIGBgPmBgLCBgYD09YGAsIGBgPj1gYCwgYGA8PWBgLCBhbmQgYGAhPWBgIGNvbXBhcmVcbnRoZSB2YWx1ZXMgb2YgdHdvIG9iamVjdHMuICBUaGUgb2JqZWN0cyBuZWVkIG5vdCBoYXZlIHRoZSBzYW1lIHR5cGUuXG5JZiBib3RoIGFyZSBudW1iZXJzLCB0aGV5IGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS4gIE90aGVyd2lzZSxcbm9iamVjdHMgb2YgZGlmZmVyZW50IHR5cGVzICphbHdheXMqIGNvbXBhcmUgdW5lcXVhbCwgYW5kIGFyZSBvcmRlcmVkXG5jb25zaXN0ZW50bHkgYnV0IGFyYml0cmFyaWx5LiBZb3UgY2FuIGNvbnRyb2wgY29tcGFyaXNvbiBiZWhhdmlvciBvZlxub2JqZWN0cyBvZiBub24tYnVpbHQtaW4gdHlwZXMgYnkgZGVmaW5pbmcgYSBgYF9fY21wX19gYCBtZXRob2Qgb3IgcmljaFxuY29tcGFyaXNvbiBtZXRob2RzIGxpa2UgYGBfX2d0X19gYCwgZGVzY3JpYmVkIGluIHNlY3Rpb24gKlNwZWNpYWxcbm1ldGhvZCBuYW1lcyouXG5cbihUaGlzIHVudXN1YWwgZGVmaW5pdGlvbiBvZiBjb21wYXJpc29uIHdhcyB1c2VkIHRvIHNpbXBsaWZ5IHRoZVxuZGVmaW5pdGlvbiBvZiBvcGVyYXRpb25zIGxpa2Ugc29ydGluZyBhbmQgdGhlIGBgaW5gYCBhbmQgYGBub3QgaW5gYFxub3BlcmF0b3JzLiBJbiB0aGUgZnV0dXJlLCB0aGUgY29tcGFyaXNvbiBydWxlcyBmb3Igb2JqZWN0cyBvZlxuZGlmZmVyZW50IHR5cGVzIGFyZSBsaWtlbHkgdG8gY2hhbmdlLilcblxuQ29tcGFyaXNvbiBvZiBvYmplY3RzIG9mIHRoZSBzYW1lIHR5cGUgZGVwZW5kcyBvbiB0aGUgdHlwZTpcblxuKiBOdW1iZXJzIGFyZSBjb21wYXJlZCBhcml0aG1ldGljYWxseS5cblxuKiBTdHJpbmdzIGFyZSBjb21wYXJlZCBsZXhpY29ncmFwaGljYWxseSB1c2luZyB0aGUgbnVtZXJpYyBlcXVpdmFsZW50c1xuICAodGhlIHJlc3VsdCBvZiB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gYGBvcmQoKWBgKSBvZiB0aGVpciBjaGFyYWN0ZXJzLlxuICBVbmljb2RlIGFuZCA4LWJpdCBzdHJpbmdzIGFyZSBmdWxseSBpbnRlcm9wZXJhYmxlIGluIHRoaXMgYmVoYXZpb3IuXG4gIFs0XVxuXG4qIFR1cGxlcyBhbmQgbGlzdHMgYXJlIGNvbXBhcmVkIGxleGljb2dyYXBoaWNhbGx5IHVzaW5nIGNvbXBhcmlzb24gb2ZcbiAgY29ycmVzcG9uZGluZyBlbGVtZW50cy4gIFRoaXMgbWVhbnMgdGhhdCB0byBjb21wYXJlIGVxdWFsLCBlYWNoXG4gIGVsZW1lbnQgbXVzdCBjb21wYXJlIGVxdWFsIGFuZCB0aGUgdHdvIHNlcXVlbmNlcyBtdXN0IGJlIG9mIHRoZSBzYW1lXG4gIHR5cGUgYW5kIGhhdmUgdGhlIHNhbWUgbGVuZ3RoLlxuXG4gIElmIG5vdCBlcXVhbCwgdGhlIHNlcXVlbmNlcyBhcmUgb3JkZXJlZCB0aGUgc2FtZSBhcyB0aGVpciBmaXJzdFxuICBkaWZmZXJpbmcgZWxlbWVudHMuICBGb3IgZXhhbXBsZSwgYGBjbXAoWzEsMix4XSwgWzEsMix5XSlgYCByZXR1cm5zXG4gIHRoZSBzYW1lIGFzIGBgY21wKHgseSlgYC4gIElmIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgZG9lcyBub3RcbiAgZXhpc3QsIHRoZSBzaG9ydGVyIHNlcXVlbmNlIGlzIG9yZGVyZWQgZmlyc3QgKGZvciBleGFtcGxlLCBgYFsxLDJdIDxcbiAgWzEsMiwzXWBgKS5cblxuKiBNYXBwaW5ncyAoZGljdGlvbmFyaWVzKSBjb21wYXJlIGVxdWFsIGlmIGFuZCBvbmx5IGlmIHRoZWlyIHNvcnRlZFxuICAoa2V5LCB2YWx1ZSkgbGlzdHMgY29tcGFyZSBlcXVhbC4gWzVdIE91dGNvbWVzIG90aGVyIHRoYW4gZXF1YWxpdHlcbiAgYXJlIHJlc29sdmVkIGNvbnNpc3RlbnRseSwgYnV0IGFyZSBub3Qgb3RoZXJ3aXNlIGRlZmluZWQuIFs2XVxuXG4qIE1vc3Qgb3RoZXIgb2JqZWN0cyBvZiBidWlsdC1pbiB0eXBlcyBjb21wYXJlIHVuZXF1YWwgdW5sZXNzIHRoZXkgYXJlXG4gIHRoZSBzYW1lIG9iamVjdDsgdGhlIGNob2ljZSB3aGV0aGVyIG9uZSBvYmplY3QgaXMgY29uc2lkZXJlZCBzbWFsbGVyXG4gIG9yIGxhcmdlciB0aGFuIGFub3RoZXIgb25lIGlzIG1hZGUgYXJiaXRyYXJpbHkgYnV0IGNvbnNpc3RlbnRseVxuICB3aXRoaW4gb25lIGV4ZWN1dGlvbiBvZiBhIHByb2dyYW0uXG5cblRoZSBvcGVyYXRvcnMgYGBpbmBgIGFuZCBgYG5vdCBpbmBgIHRlc3QgZm9yIGNvbGxlY3Rpb24gbWVtYmVyc2hpcC5cbmBgeCBpbiBzYGAgZXZhbHVhdGVzIHRvIHRydWUgaWYgKngqIGlzIGEgbWVtYmVyIG9mIHRoZSBjb2xsZWN0aW9uICpzKixcbmFuZCBmYWxzZSBvdGhlcndpc2UuICBgYHggbm90IGluIHNgYCByZXR1cm5zIHRoZSBuZWdhdGlvbiBvZiBgYHggaW5cbnNgYC4gVGhlIGNvbGxlY3Rpb24gbWVtYmVyc2hpcCB0ZXN0IGhhcyB0cmFkaXRpb25hbGx5IGJlZW4gYm91bmQgdG9cbnNlcXVlbmNlczsgYW4gb2JqZWN0IGlzIGEgbWVtYmVyIG9mIGEgY29sbGVjdGlvbiBpZiB0aGUgY29sbGVjdGlvbiBpc1xuYSBzZXF1ZW5jZSBhbmQgY29udGFpbnMgYW4gZWxlbWVudCBlcXVhbCB0byB0aGF0IG9iamVjdC4gIEhvd2V2ZXIsIGl0XG5tYWtlIHNlbnNlIGZvciBtYW55IG90aGVyIG9iamVjdCB0eXBlcyB0byBzdXBwb3J0IG1lbWJlcnNoaXAgdGVzdHNcbndpdGhvdXQgYmVpbmcgYSBzZXF1ZW5jZS4gIEluIHBhcnRpY3VsYXIsIGRpY3Rpb25hcmllcyAoZm9yIGtleXMpIGFuZFxuc2V0cyBzdXBwb3J0IG1lbWJlcnNoaXAgdGVzdGluZy5cblxuRm9yIHRoZSBsaXN0IGFuZCB0dXBsZSB0eXBlcywgYGB4IGluIHlgYCBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZXJlXG5leGlzdHMgYW4gaW5kZXggKmkqIHN1Y2ggdGhhdCBgYHggPT0geVtpXWBgIGlzIHRydWUuXG5cbkZvciB0aGUgVW5pY29kZSBhbmQgc3RyaW5nIHR5cGVzLCBgYHggaW4geWBgIGlzIHRydWUgaWYgYW5kIG9ubHkgaWZcbip4KiBpcyBhIHN1YnN0cmluZyBvZiAqeSouICBBbiBlcXVpdmFsZW50IHRlc3QgaXMgYGB5LmZpbmQoeCkgIT0gLTFgYC5cbk5vdGUsICp4KiBhbmQgKnkqIG5lZWQgbm90IGJlIHRoZSBzYW1lIHR5cGU7IGNvbnNlcXVlbnRseSwgYGB1XCdhYlwnIGluXG5cJ2FiY1wnYGAgd2lsbCByZXR1cm4gYGBUcnVlYGAuIEVtcHR5IHN0cmluZ3MgYXJlIGFsd2F5cyBjb25zaWRlcmVkIHRvXG5iZSBhIHN1YnN0cmluZyBvZiBhbnkgb3RoZXIgc3RyaW5nLCBzbyBgYCIiIGluICJhYmMiYGAgd2lsbCByZXR1cm5cbmBgVHJ1ZWBgLlxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBQcmV2aW91c2x5LCAqeCogd2FzIHJlcXVpcmVkIHRvIGJlIGEgc3RyaW5nIG9mXG5sZW5ndGggYGAxYGAuXG5cbkZvciB1c2VyLWRlZmluZWQgY2xhc3NlcyB3aGljaCBkZWZpbmUgdGhlIGBgX19jb250YWluc19fKClgYCBtZXRob2QsXG5gYHggaW4geWBgIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgYGB5Ll9fY29udGFpbnNfXyh4KWBgIGlzIHRydWUuXG5cbkZvciB1c2VyLWRlZmluZWQgY2xhc3NlcyB3aGljaCBkbyBub3QgZGVmaW5lIGBgX19jb250YWluc19fKClgYCBidXQgZG9cbmRlZmluZSBgYF9faXRlcl9fKClgYCwgYGB4IGluIHlgYCBpcyB0cnVlIGlmIHNvbWUgdmFsdWUgYGB6YGAgd2l0aCBgYHhcbj09IHpgYCBpcyBwcm9kdWNlZCB3aGlsZSBpdGVyYXRpbmcgb3ZlciBgYHlgYC4gIElmIGFuIGV4Y2VwdGlvbiBpc1xucmFpc2VkIGR1cmluZyB0aGUgaXRlcmF0aW9uLCBpdCBpcyBhcyBpZiBgYGluYGAgcmFpc2VkIHRoYXQgZXhjZXB0aW9uLlxuXG5MYXN0bHksIHRoZSBvbGQtc3R5bGUgaXRlcmF0aW9uIHByb3RvY29sIGlzIHRyaWVkOiBpZiBhIGNsYXNzIGRlZmluZXNcbmBgX19nZXRpdGVtX18oKWBgLCBgYHggaW4geWBgIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlcmUgaXMgYSBub24tXG5uZWdhdGl2ZSBpbnRlZ2VyIGluZGV4ICppKiBzdWNoIHRoYXQgYGB4ID09IHlbaV1gYCwgYW5kIGFsbCBsb3dlclxuaW50ZWdlciBpbmRpY2VzIGRvIG5vdCByYWlzZSBgYEluZGV4RXJyb3JgYCBleGNlcHRpb24uIChJZiBhbnkgb3RoZXJcbmV4Y2VwdGlvbiBpcyByYWlzZWQsIGl0IGlzIGFzIGlmIGBgaW5gYCByYWlzZWQgdGhhdCBleGNlcHRpb24pLlxuXG5UaGUgb3BlcmF0b3IgYGBub3QgaW5gYCBpcyBkZWZpbmVkIHRvIGhhdmUgdGhlIGludmVyc2UgdHJ1ZSB2YWx1ZSBvZlxuYGBpbmBgLlxuXG5UaGUgb3BlcmF0b3JzIGBgaXNgYCBhbmQgYGBpcyBub3RgYCB0ZXN0IGZvciBvYmplY3QgaWRlbnRpdHk6IGBgeCBpc1xueWBgIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgKngqIGFuZCAqeSogYXJlIHRoZSBzYW1lIG9iamVjdC4gIGBgeCBpc1xubm90IHlgYCB5aWVsZHMgdGhlIGludmVyc2UgdHJ1dGggdmFsdWUuIFs3XVxuJywKLSAnaW50ZWdlcnMnOiB1J1xuSW50ZWdlciBhbmQgbG9uZyBpbnRlZ2VyIGxpdGVyYWxzXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuSW50ZWdlciBhbmQgbG9uZyBpbnRlZ2VyIGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZ1xubGV4aWNhbCBkZWZpbml0aW9uczpcblxuICAgbG9uZ2ludGVnZXIgICAgOjo9IGludGVnZXIgKCJsIiB8ICJMIilcbiAgIGludGVnZXIgICAgICAgIDo6PSBkZWNpbWFsaW50ZWdlciB8IG9jdGludGVnZXIgfCBoZXhpbnRlZ2VyIHwgYmluaW50ZWdlclxuICAgZGVjaW1hbGludGVnZXIgOjo9IG5vbnplcm9kaWdpdCBkaWdpdCogfCAiMCJcbiAgIG9jdGludGVnZXIgICAgIDo6PSAiMCIgKCJvIiB8ICJPIikgb2N0ZGlnaXQrIHwgIjAiIG9jdGRpZ2l0K1xuICAgaGV4aW50ZWdlciAgICAgOjo9ICIwIiAoIngiIHwgIlgiKSBoZXhkaWdpdCtcbiAgIGJpbmludGVnZXIgICAgIDo6PSAiMCIgKCJiIiB8ICJCIikgYmluZGlnaXQrXG4gICBub256ZXJvZGlnaXQgICA6Oj0gIjEiLi4uIjkiXG4gICBvY3RkaWdpdCAgICAgICA6Oj0gIjAiLi4uIjciXG4gICBiaW5kaWdpdCAgICAgICA6Oj0gIjAiIHwgIjEiXG4gICBoZXhkaWdpdCAgICAgICA6Oj0gZGlnaXQgfCAiYSIuLi4iZiIgfCAiQSIuLi4iRiJcblxuQWx0aG91Z2ggYm90aCBsb3dlciBjYXNlIGBgXCdsXCdgYCBhbmQgdXBwZXIgY2FzZSBgYFwnTFwnYGAgYXJlIGFsbG93ZWQgYXNcbnN1ZmZpeCBmb3IgbG9uZyBpbnRlZ2VycywgaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gYWx3YXlzIHVzZVxuYGBcJ0xcJ2BgLCBzaW5jZSB0aGUgbGV0dGVyIGBgXCdsXCdgYCBsb29rcyB0b28gbXVjaCBsaWtlIHRoZSBkaWdpdFxuYGBcJzFcJ2BgLlxuXG5QbGFpbiBpbnRlZ2VyIGxpdGVyYWxzIHRoYXQgYXJlIGFib3ZlIHRoZSBsYXJnZXN0IHJlcHJlc2VudGFibGUgcGxhaW5cbmludGVnZXIgKGUuZy4sIDIxNDc0ODM2NDcgd2hlbiB1c2luZyAzMi1iaXQgYXJpdGhtZXRpYykgYXJlIGFjY2VwdGVkXG5hcyBpZiB0aGV5IHdlcmUgbG9uZyBpbnRlZ2VycyBpbnN0ZWFkLiBbMV0gIFRoZXJlIGlzIG5vIGxpbWl0IGZvciBsb25nXG5pbnRlZ2VyIGxpdGVyYWxzIGFwYXJ0IGZyb20gd2hhdCBjYW4gYmUgc3RvcmVkIGluIGF2YWlsYWJsZSBtZW1vcnkuXG5cblNvbWUgZXhhbXBsZXMgb2YgcGxhaW4gaW50ZWdlciBsaXRlcmFscyAoZmlyc3Qgcm93KSBhbmQgbG9uZyBpbnRlZ2VyXG5saXRlcmFscyAoc2Vjb25kIGFuZCB0aGlyZCByb3dzKTpcblxuICAgNyAgICAgMjE0NzQ4MzY0NyAgICAgICAgICAgICAgICAgICAgICAgIDAxNzdcbiAgIDNMICAgIDc5MjI4MTYyNTE0MjY0MzM3NTkzNTQzOTUwMzM2TCAgICAwMzc3TCAgIDB4MTAwMDAwMDAwTFxuICAgICAgICAgNzkyMjgxNjI1MTQyNjQzMzc1OTM1NDM5NTAzMzYgICAgICAgICAgICAgMHhkZWFkYmVlZlxuJywKLSAnbGFtYmRhJzogdSdcbkxhbWJkYXNcbioqKioqKipcblxuICAgbGFtYmRhX2Zvcm0gICAgIDo6PSAibGFtYmRhIiBbcGFyYW1ldGVyX2xpc3RdOiBleHByZXNzaW9uXG4gICBvbGRfbGFtYmRhX2Zvcm0gOjo9ICJsYW1iZGEiIFtwYXJhbWV0ZXJfbGlzdF06IG9sZF9leHByZXNzaW9uXG5cbkxhbWJkYSBmb3JtcyAobGFtYmRhIGV4cHJlc3Npb25zKSBoYXZlIHRoZSBzYW1lIHN5bnRhY3RpYyBwb3NpdGlvbiBhc1xuZXhwcmVzc2lvbnMuICBUaGV5IGFyZSBhIHNob3J0aGFuZCB0byBjcmVhdGUgYW5vbnltb3VzIGZ1bmN0aW9uczsgdGhlXG5leHByZXNzaW9uIGBgbGFtYmRhIGFyZ3VtZW50czogZXhwcmVzc2lvbmBgIHlpZWxkcyBhIGZ1bmN0aW9uIG9iamVjdC5cblRoZSB1bm5hbWVkIG9iamVjdCBiZWhhdmVzIGxpa2UgYSBmdW5jdGlvbiBvYmplY3QgZGVmaW5lZCB3aXRoXG5cbiAgIGRlZiBuYW1lKGFyZ3VtZW50cyk6XG4gICAgICAgcmV0dXJuIGV4cHJlc3Npb25cblxuU2VlIHNlY3Rpb24gKkZ1bmN0aW9uIGRlZmluaXRpb25zKiBmb3IgdGhlIHN5bnRheCBvZiBwYXJhbWV0ZXIgbGlzdHMuXG5Ob3RlIHRoYXQgZnVuY3Rpb25zIGNyZWF0ZWQgd2l0aCBsYW1iZGEgZm9ybXMgY2Fubm90IGNvbnRhaW5cbnN0YXRlbWVudHMuXG4nLAotICdsaXN0cyc6IHUnXG5MaXN0IGRpc3BsYXlzXG4qKioqKioqKioqKioqXG5cbkEgbGlzdCBkaXNwbGF5IGlzIGEgcG9zc2libHkgZW1wdHkgc2VyaWVzIG9mIGV4cHJlc3Npb25zIGVuY2xvc2VkIGluXG5zcXVhcmUgYnJhY2tldHM6XG5cbiAgIGxpc3RfZGlzcGxheSAgICAgICAgOjo9ICJbIiBbZXhwcmVzc2lvbl9saXN0IHwgbGlzdF9jb21wcmVoZW5zaW9uXSAiXSJcbiAgIGxpc3RfY29tcHJlaGVuc2lvbiAgOjo9IGV4cHJlc3Npb24gbGlzdF9mb3JcbiAgIGxpc3RfZm9yICAgICAgICAgICAgOjo9ICJmb3IiIHRhcmdldF9saXN0ICJpbiIgb2xkX2V4cHJlc3Npb25fbGlzdCBbbGlzdF9pdGVyXVxuICAgb2xkX2V4cHJlc3Npb25fbGlzdCA6Oj0gb2xkX2V4cHJlc3Npb24gWygiLCIgb2xkX2V4cHJlc3Npb24pKyBbIiwiXV1cbiAgIG9sZF9leHByZXNzaW9uICAgICAgOjo9IG9yX3Rlc3QgfCBvbGRfbGFtYmRhX2Zvcm1cbiAgIGxpc3RfaXRlciAgICAgICAgICAgOjo9IGxpc3RfZm9yIHwgbGlzdF9pZlxuICAgbGlzdF9pZiAgICAgICAgICAgICA6Oj0gImlmIiBvbGRfZXhwcmVzc2lvbiBbbGlzdF9pdGVyXVxuXG5BIGxpc3QgZGlzcGxheSB5aWVsZHMgYSBuZXcgbGlzdCBvYmplY3QuICBJdHMgY29udGVudHMgYXJlIHNwZWNpZmllZFxuYnkgcHJvdmlkaW5nIGVpdGhlciBhIGxpc3Qgb2YgZXhwcmVzc2lvbnMgb3IgYSBsaXN0IGNvbXByZWhlbnNpb24uXG5XaGVuIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZXhwcmVzc2lvbnMgaXMgc3VwcGxpZWQsIGl0cyBlbGVtZW50c1xuYXJlIGV2YWx1YXRlZCBmcm9tIGxlZnQgdG8gcmlnaHQgYW5kIHBsYWNlZCBpbnRvIHRoZSBsaXN0IG9iamVjdCBpblxudGhhdCBvcmRlci4gIFdoZW4gYSBsaXN0IGNvbXByZWhlbnNpb24gaXMgc3VwcGxpZWQsIGl0IGNvbnNpc3RzIG9mIGFcbnNpbmdsZSBleHByZXNzaW9uIGZvbGxvd2VkIGJ5IGF0IGxlYXN0IG9uZSBgYGZvcmBgIGNsYXVzZSBhbmQgemVybyBvclxubW9yZSBgYGZvcmBgIG9yIGBgaWZgYCBjbGF1c2VzLiAgSW4gdGhpcyBjYXNlLCB0aGUgZWxlbWVudHMgb2YgdGhlIG5ld1xubGlzdCBhcmUgdGhvc2UgdGhhdCB3b3VsZCBiZSBwcm9kdWNlZCBieSBjb25zaWRlcmluZyBlYWNoIG9mIHRoZVxuYGBmb3JgYCBvciBgYGlmYGAgY2xhdXNlcyBhIGJsb2NrLCBuZXN0aW5nIGZyb20gbGVmdCB0byByaWdodCwgYW5kXG5ldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uIHRvIHByb2R1Y2UgYSBsaXN0IGVsZW1lbnQgZWFjaCB0aW1lIHRoZVxuaW5uZXJtb3N0IGJsb2NrIGlzIHJlYWNoZWQgWzFdLlxuJywKLSAnbmFtaW5nJzogdSJcbk5hbWluZyBhbmQgYmluZGluZ1xuKioqKioqKioqKioqKioqKioqXG5cbipOYW1lcyogcmVmZXIgdG8gb2JqZWN0cy4gIE5hbWVzIGFyZSBpbnRyb2R1Y2VkIGJ5IG5hbWUgYmluZGluZ1xub3BlcmF0aW9ucy4gRWFjaCBvY2N1cnJlbmNlIG9mIGEgbmFtZSBpbiB0aGUgcHJvZ3JhbSB0ZXh0IHJlZmVycyB0b1xudGhlICpiaW5kaW5nKiBvZiB0aGF0IG5hbWUgZXN0YWJsaXNoZWQgaW4gdGhlIGlubmVybW9zdCBmdW5jdGlvbiBibG9ja1xuY29udGFpbmluZyB0aGUgdXNlLlxuXG5BICpibG9jayogaXMgYSBwaWVjZSBvZiBQeXRob24gcHJvZ3JhbSB0ZXh0IHRoYXQgaXMgZXhlY3V0ZWQgYXMgYVxudW5pdC4gVGhlIGZvbGxvd2luZyBhcmUgYmxvY2tzOiBhIG1vZHVsZSwgYSBmdW5jdGlvbiBib2R5LCBhbmQgYSBjbGFzc1xuZGVmaW5pdGlvbi4gRWFjaCBjb21tYW5kIHR5cGVkIGludGVyYWN0aXZlbHkgaXMgYSBibG9jay4gIEEgc2NyaXB0XG5maWxlIChhIGZpbGUgZ2l2ZW4gYXMgc3RhbmRhcmQgaW5wdXQgdG8gdGhlIGludGVycHJldGVyIG9yIHNwZWNpZmllZFxub24gdGhlIGludGVycHJldGVyIGNvbW1hbmQgbGluZSB0aGUgZmlyc3QgYXJndW1lbnQpIGlzIGEgY29kZSBibG9jay5cbkEgc2NyaXB0IGNvbW1hbmQgKGEgY29tbWFuZCBzcGVjaWZpZWQgb24gdGhlIGludGVycHJldGVyIGNvbW1hbmQgbGluZVxud2l0aCB0aGUgJyoqLWMqKicgb3B0aW9uKSBpcyBhIGNvZGUgYmxvY2suICBUaGUgZmlsZSByZWFkIGJ5IHRoZVxuYnVpbHQtaW4gZnVuY3Rpb24gYGBleGVjZmlsZSgpYGAgaXMgYSBjb2RlIGJsb2NrLiAgVGhlIHN0cmluZyBhcmd1bWVudFxucGFzc2VkIHRvIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYGV2YWwoKWBgIGFuZCB0byB0aGUgYGBleGVjYGBcbnN0YXRlbWVudCBpcyBhIGNvZGUgYmxvY2suIFRoZSBleHByZXNzaW9uIHJlYWQgYW5kIGV2YWx1YXRlZCBieSB0aGVcbmJ1aWx0LWluIGZ1bmN0aW9uIGBgaW5wdXQoKWBgIGlzIGEgY29kZSBibG9jay5cblxuQSBjb2RlIGJsb2NrIGlzIGV4ZWN1dGVkIGluIGFuICpleGVjdXRpb24gZnJhbWUqLiAgQSBmcmFtZSBjb250YWluc1xuc29tZSBhZG1pbmlzdHJhdGl2ZSBpbmZvcm1hdGlvbiAodXNlZCBmb3IgZGVidWdnaW5nKSBhbmQgZGV0ZXJtaW5lc1xud2hlcmUgYW5kIGhvdyBleGVjdXRpb24gY29udGludWVzIGFmdGVyIHRoZSBjb2RlIGJsb2NrJ3MgZXhlY3V0aW9uIGhhc1xuY29tcGxldGVkLlxuXG5BICpzY29wZSogZGVmaW5lcyB0aGUgdmlzaWJpbGl0eSBvZiBhIG5hbWUgd2l0aGluIGEgYmxvY2suICBJZiBhIGxvY2FsXG52YXJpYWJsZSBpcyBkZWZpbmVkIGluIGEgYmxvY2ssIGl0cyBzY29wZSBpbmNsdWRlcyB0aGF0IGJsb2NrLiAgSWYgdGhlXG5kZWZpbml0aW9uIG9jY3VycyBpbiBhIGZ1bmN0aW9uIGJsb2NrLCB0aGUgc2NvcGUgZXh0ZW5kcyB0byBhbnkgYmxvY2tzXG5jb250YWluZWQgd2l0aGluIHRoZSBkZWZpbmluZyBvbmUsIHVubGVzcyBhIGNvbnRhaW5lZCBibG9jayBpbnRyb2R1Y2VzXG5hIGRpZmZlcmVudCBiaW5kaW5nIGZvciB0aGUgbmFtZS4gIFRoZSBzY29wZSBvZiBuYW1lcyBkZWZpbmVkIGluIGFcbmNsYXNzIGJsb2NrIGlzIGxpbWl0ZWQgdG8gdGhlIGNsYXNzIGJsb2NrOyBpdCBkb2VzIG5vdCBleHRlbmQgdG8gdGhlXG5jb2RlIGJsb2NrcyBvZiBtZXRob2RzIC0tIHRoaXMgaW5jbHVkZXMgZ2VuZXJhdG9yIGV4cHJlc3Npb25zIHNpbmNlXG50aGV5IGFyZSBpbXBsZW1lbnRlZCB1c2luZyBhIGZ1bmN0aW9uIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IHRoZVxuZm9sbG93aW5nIHdpbGwgZmFpbDpcblxuICAgY2xhc3MgQTpcbiAgICAgICBhID0gNDJcbiAgICAgICBiID0gbGlzdChhICsgaSBmb3IgaSBpbiByYW5nZSgxMCkpXG5cbldoZW4gYSBuYW1lIGlzIHVzZWQgaW4gYSBjb2RlIGJsb2NrLCBpdCBpcyByZXNvbHZlZCB1c2luZyB0aGUgbmVhcmVzdFxuZW5jbG9zaW5nIHNjb3BlLiAgVGhlIHNldCBvZiBhbGwgc3VjaCBzY29wZXMgdmlzaWJsZSB0byBhIGNvZGUgYmxvY2tcbmlzIGNhbGxlZCB0aGUgYmxvY2sncyAqZW52aXJvbm1lbnQqLlxuXG5JZiBhIG5hbWUgaXMgYm91bmQgaW4gYSBibG9jaywgaXQgaXMgYSBsb2NhbCB2YXJpYWJsZSBvZiB0aGF0IGJsb2NrLlxuSWYgYSBuYW1lIGlzIGJvdW5kIGF0IHRoZSBtb2R1bGUgbGV2ZWwsIGl0IGlzIGEgZ2xvYmFsIHZhcmlhYmxlLiAgKFRoZVxudmFyaWFibGVzIG9mIHRoZSBtb2R1bGUgY29kZSBibG9jayBhcmUgbG9jYWwgYW5kIGdsb2JhbC4pICBJZiBhXG52YXJpYWJsZSBpcyB1c2VkIGluIGEgY29kZSBibG9jayBidXQgbm90IGRlZmluZWQgdGhlcmUsIGl0IGlzIGEgKmZyZWVcbnZhcmlhYmxlKi5cblxuV2hlbiBhIG5hbWUgaXMgbm90IGZvdW5kIGF0IGFsbCwgYSBgYE5hbWVFcnJvcmBgIGV4Y2VwdGlvbiBpcyByYWlzZWQuXG5JZiB0aGUgbmFtZSByZWZlcnMgdG8gYSBsb2NhbCB2YXJpYWJsZSB0aGF0IGhhcyBub3QgYmVlbiBib3VuZCwgYVxuYGBVbmJvdW5kTG9jYWxFcnJvcmBgIGV4Y2VwdGlvbiBpcyByYWlzZWQuICBgYFVuYm91bmRMb2NhbEVycm9yYGAgaXMgYVxuc3ViY2xhc3Mgb2YgYGBOYW1lRXJyb3JgYC5cblxuVGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RzIGJpbmQgbmFtZXM6IGZvcm1hbCBwYXJhbWV0ZXJzIHRvIGZ1bmN0aW9ucyxcbmBgaW1wb3J0YGAgc3RhdGVtZW50cywgY2xhc3MgYW5kIGZ1bmN0aW9uIGRlZmluaXRpb25zICh0aGVzZSBiaW5kIHRoZVxuY2xhc3Mgb3IgZnVuY3Rpb24gbmFtZSBpbiB0aGUgZGVmaW5pbmcgYmxvY2spLCBhbmQgdGFyZ2V0cyB0aGF0IGFyZVxuaWRlbnRpZmllcnMgaWYgb2NjdXJyaW5nIGluIGFuIGFzc2lnbm1lbnQsIGBgZm9yYGAgbG9vcCBoZWFkZXIsIGluIHRoZVxuc2Vjb25kIHBvc2l0aW9uIG9mIGFuIGBgZXhjZXB0YGAgY2xhdXNlIGhlYWRlciBvciBhZnRlciBgYGFzYGAgaW4gYVxuYGB3aXRoYGAgc3RhdGVtZW50LiAgVGhlIGBgaW1wb3J0YGAgc3RhdGVtZW50IG9mIHRoZSBmb3JtIGBgZnJvbSAuLi5cbmltcG9ydCAqYGAgYmluZHMgYWxsIG5hbWVzIGRlZmluZWQgaW4gdGhlIGltcG9ydGVkIG1vZHVsZSwgZXhjZXB0XG50aG9zZSBiZWdpbm5pbmcgd2l0aCBhbiB1bmRlcnNjb3JlLiAgVGhpcyBmb3JtIG1heSBvbmx5IGJlIHVzZWQgYXQgdGhlXG5tb2R1bGUgbGV2ZWwuXG5cbkEgdGFyZ2V0IG9jY3VycmluZyBpbiBhIGBgZGVsYGAgc3RhdGVtZW50IGlzIGFsc28gY29uc2lkZXJlZCBib3VuZCBmb3JcbnRoaXMgcHVycG9zZSAodGhvdWdoIHRoZSBhY3R1YWwgc2VtYW50aWNzIGFyZSB0byB1bmJpbmQgdGhlIG5hbWUpLiAgSXRcbmlzIGlsbGVnYWwgdG8gdW5iaW5kIGEgbmFtZSB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgYW4gZW5jbG9zaW5nIHNjb3BlO1xudGhlIGNvbXBpbGVyIHdpbGwgcmVwb3J0IGEgYGBTeW50YXhFcnJvcmBgLlxuXG5FYWNoIGFzc2lnbm1lbnQgb3IgaW1wb3J0IHN0YXRlbWVudCBvY2N1cnMgd2l0aGluIGEgYmxvY2sgZGVmaW5lZCBieSBhXG5jbGFzcyBvciBmdW5jdGlvbiBkZWZpbml0aW9uIG9yIGF0IHRoZSBtb2R1bGUgbGV2ZWwgKHRoZSB0b3AtbGV2ZWxcbmNvZGUgYmxvY2spLlxuXG5JZiBhIG5hbWUgYmluZGluZyBvcGVyYXRpb24gb2NjdXJzIGFueXdoZXJlIHdpdGhpbiBhIGNvZGUgYmxvY2ssIGFsbFxudXNlcyBvZiB0aGUgbmFtZSB3aXRoaW4gdGhlIGJsb2NrIGFyZSB0cmVhdGVkIGFzIHJlZmVyZW5jZXMgdG8gdGhlXG5jdXJyZW50IGJsb2NrLiAgVGhpcyBjYW4gbGVhZCB0byBlcnJvcnMgd2hlbiBhIG5hbWUgaXMgdXNlZCB3aXRoaW4gYVxuYmxvY2sgYmVmb3JlIGl0IGlzIGJvdW5kLiBUaGlzIHJ1bGUgaXMgc3VidGxlLiAgUHl0aG9uIGxhY2tzXG5kZWNsYXJhdGlvbnMgYW5kIGFsbG93cyBuYW1lIGJpbmRpbmcgb3BlcmF0aW9ucyB0byBvY2N1ciBhbnl3aGVyZVxud2l0aGluIGEgY29kZSBibG9jay4gIFRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgYSBjb2RlIGJsb2NrIGNhbiBiZVxuZGV0ZXJtaW5lZCBieSBzY2FubmluZyB0aGUgZW50aXJlIHRleHQgb2YgdGhlIGJsb2NrIGZvciBuYW1lIGJpbmRpbmdcbm9wZXJhdGlvbnMuXG5cbklmIHRoZSBnbG9iYWwgc3RhdGVtZW50IG9jY3VycyB3aXRoaW4gYSBibG9jaywgYWxsIHVzZXMgb2YgdGhlIG5hbWVcbnNwZWNpZmllZCBpbiB0aGUgc3RhdGVtZW50IHJlZmVyIHRvIHRoZSBiaW5kaW5nIG9mIHRoYXQgbmFtZSBpbiB0aGVcbnRvcC1sZXZlbCBuYW1lc3BhY2UuIE5hbWVzIGFyZSByZXNvbHZlZCBpbiB0aGUgdG9wLWxldmVsIG5hbWVzcGFjZSBieVxuc2VhcmNoaW5nIHRoZSBnbG9iYWwgbmFtZXNwYWNlLCBpLmUuIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIG1vZHVsZVxuY29udGFpbmluZyB0aGUgY29kZSBibG9jaywgYW5kIHRoZSBidWlsdGlucyBuYW1lc3BhY2UsIHRoZSBuYW1lc3BhY2Vcbm9mIHRoZSBtb2R1bGUgYGBfX2J1aWx0aW5fX2BgLiAgVGhlIGdsb2JhbCBuYW1lc3BhY2UgaXMgc2VhcmNoZWRcbmZpcnN0LiAgSWYgdGhlIG5hbWUgaXMgbm90IGZvdW5kIHRoZXJlLCB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlIGlzXG5zZWFyY2hlZC4gIFRoZSBnbG9iYWwgc3RhdGVtZW50IG11c3QgcHJlY2VkZSBhbGwgdXNlcyBvZiB0aGUgbmFtZS5cblxuVGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4ZWN1dGlvbiBvZiBhIGNvZGUgYmxvY2tcbmlzIGFjdHVhbGx5IGZvdW5kIGJ5IGxvb2tpbmcgdXAgdGhlIG5hbWUgYGBfX2J1aWx0aW5zX19gYCBpbiBpdHNcbmdsb2JhbCBuYW1lc3BhY2U7IHRoaXMgc2hvdWxkIGJlIGEgZGljdGlvbmFyeSBvciBhIG1vZHVsZSAoaW4gdGhlXG5sYXR0ZXIgY2FzZSB0aGUgbW9kdWxlJ3MgZGljdGlvbmFyeSBpcyB1c2VkKS4gIEJ5IGRlZmF1bHQsIHdoZW4gaW4gdGhlXG5gYF9fbWFpbl9fYGAgbW9kdWxlLCBgYF9fYnVpbHRpbnNfX2BgIGlzIHRoZSBidWlsdC1pbiBtb2R1bGVcbmBgX19idWlsdGluX19gYCAobm90ZTogbm8gJ3MnKTsgd2hlbiBpbiBhbnkgb3RoZXIgbW9kdWxlLFxuYGBfX2J1aWx0aW5zX19gYCBpcyBhbiBhbGlhcyBmb3IgdGhlIGRpY3Rpb25hcnkgb2YgdGhlIGBgX19idWlsdGluX19gYFxubW9kdWxlIGl0c2VsZi4gIGBgX19idWlsdGluc19fYGAgY2FuIGJlIHNldCB0byBhIHVzZXItY3JlYXRlZFxuZGljdGlvbmFyeSB0byBjcmVhdGUgYSB3ZWFrIGZvcm0gb2YgcmVzdHJpY3RlZCBleGVjdXRpb24uXG5cbioqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogVXNlcnMgc2hvdWxkIG5vdCB0b3VjaFxuYGBfX2J1aWx0aW5zX19gYDsgaXQgaXMgc3RyaWN0bHkgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLiAgVXNlcnNcbndhbnRpbmcgdG8gb3ZlcnJpZGUgdmFsdWVzIGluIHRoZSBidWlsdGlucyBuYW1lc3BhY2Ugc2hvdWxkIGBgaW1wb3J0YGBcbnRoZSBgYF9fYnVpbHRpbl9fYGAgKG5vICdzJykgbW9kdWxlIGFuZCBtb2RpZnkgaXRzIGF0dHJpYnV0ZXNcbmFwcHJvcHJpYXRlbHkuXG5cblRoZSBuYW1lc3BhY2UgZm9yIGEgbW9kdWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB0aGUgZmlyc3QgdGltZSBhXG5tb2R1bGUgaXMgaW1wb3J0ZWQuICBUaGUgbWFpbiBtb2R1bGUgZm9yIGEgc2NyaXB0IGlzIGFsd2F5cyBjYWxsZWRcbmBgX19tYWluX19gYC5cblxuVGhlIGBgZ2xvYmFsYGAgc3RhdGVtZW50IGhhcyB0aGUgc2FtZSBzY29wZSBhcyBhIG5hbWUgYmluZGluZ1xub3BlcmF0aW9uIGluIHRoZSBzYW1lIGJsb2NrLiAgSWYgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIHNjb3BlIGZvciBhXG5mcmVlIHZhcmlhYmxlIGNvbnRhaW5zIGEgZ2xvYmFsIHN0YXRlbWVudCwgdGhlIGZyZWUgdmFyaWFibGUgaXNcbnRyZWF0ZWQgYXMgYSBnbG9iYWwuXG5cbkEgY2xhc3MgZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudCB0aGF0IG1heSB1c2UgYW5kIGRlZmluZVxubmFtZXMuIFRoZXNlIHJlZmVyZW5jZXMgZm9sbG93IHRoZSBub3JtYWwgcnVsZXMgZm9yIG5hbWUgcmVzb2x1dGlvbi5cblRoZSBuYW1lc3BhY2Ugb2YgdGhlIGNsYXNzIGRlZmluaXRpb24gYmVjb21lcyB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnlcbm9mIHRoZSBjbGFzcy4gIE5hbWVzIGRlZmluZWQgYXQgdGhlIGNsYXNzIHNjb3BlIGFyZSBub3QgdmlzaWJsZSBpblxubWV0aG9kcy5cblxuXG5JbnRlcmFjdGlvbiB3aXRoIGR5bmFtaWMgZmVhdHVyZXNcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGVyZSBhcmUgc2V2ZXJhbCBjYXNlcyB3aGVyZSBQeXRob24gc3RhdGVtZW50cyBhcmUgaWxsZWdhbCB3aGVuIHVzZWRcbmluIGNvbmp1bmN0aW9uIHdpdGggbmVzdGVkIHNjb3BlcyB0aGF0IGNvbnRhaW4gZnJlZSB2YXJpYWJsZXMuXG5cbklmIGEgdmFyaWFibGUgaXMgcmVmZXJlbmNlZCBpbiBhbiBlbmNsb3Npbmcgc2NvcGUsIGl0IGlzIGlsbGVnYWwgdG9cbmRlbGV0ZSB0aGUgbmFtZS4gIEFuIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgYXQgY29tcGlsZSB0aW1lLlxuXG5JZiB0aGUgd2lsZCBjYXJkIGZvcm0gb2YgaW1wb3J0IC0tLSBgYGltcG9ydCAqYGAgLS0tIGlzIHVzZWQgaW4gYVxuZnVuY3Rpb24gYW5kIHRoZSBmdW5jdGlvbiBjb250YWlucyBvciBpcyBhIG5lc3RlZCBibG9jayB3aXRoIGZyZWVcbnZhcmlhYmxlcywgdGhlIGNvbXBpbGVyIHdpbGwgcmFpc2UgYSBgYFN5bnRheEVycm9yYGAuXG5cbklmIGBgZXhlY2BgIGlzIHVzZWQgaW4gYSBmdW5jdGlvbiBhbmQgdGhlIGZ1bmN0aW9uIGNvbnRhaW5zIG9yIGlzIGFcbm5lc3RlZCBibG9jayB3aXRoIGZyZWUgdmFyaWFibGVzLCB0aGUgY29tcGlsZXIgd2lsbCByYWlzZSBhXG5gYFN5bnRheEVycm9yYGAgdW5sZXNzIHRoZSBleGVjIGV4cGxpY2l0bHkgc3BlY2lmaWVzIHRoZSBsb2NhbFxubmFtZXNwYWNlIGZvciB0aGUgYGBleGVjYGAuICAoSW4gb3RoZXIgd29yZHMsIGBgZXhlYyBvYmpgYCB3b3VsZCBiZVxuaWxsZWdhbCwgYnV0IGBgZXhlYyBvYmogaW4gbnNgYCB3b3VsZCBiZSBsZWdhbC4pXG5cblRoZSBgYGV2YWwoKWBgLCBgYGV4ZWNmaWxlKClgYCwgYW5kIGBgaW5wdXQoKWBgIGZ1bmN0aW9ucyBhbmQgdGhlXG5gYGV4ZWNgYCBzdGF0ZW1lbnQgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBmdWxsIGVudmlyb25tZW50IGZvclxucmVzb2x2aW5nIG5hbWVzLiAgTmFtZXMgbWF5IGJlIHJlc29sdmVkIGluIHRoZSBsb2NhbCBhbmQgZ2xvYmFsXG5uYW1lc3BhY2VzIG9mIHRoZSBjYWxsZXIuICBGcmVlIHZhcmlhYmxlcyBhcmUgbm90IHJlc29sdmVkIGluIHRoZVxubmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlLCBidXQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuIFsxXSBUaGVcbmBgZXhlY2BgIHN0YXRlbWVudCBhbmQgdGhlIGBgZXZhbCgpYGAgYW5kIGBgZXhlY2ZpbGUoKWBgIGZ1bmN0aW9uc1xuaGF2ZSBvcHRpb25hbCBhcmd1bWVudHMgdG8gb3ZlcnJpZGUgdGhlIGdsb2JhbCBhbmQgbG9jYWwgbmFtZXNwYWNlLlxuSWYgb25seSBvbmUgbmFtZXNwYWNlIGlzIHNwZWNpZmllZCwgaXQgaXMgdXNlZCBmb3IgYm90aC5cbiIsCi0gJ251bWJlcnMnOiB1IlxuTnVtZXJpYyBsaXRlcmFsc1xuKioqKioqKioqKioqKioqKlxuXG5UaGVyZSBhcmUgZm91ciB0eXBlcyBvZiBudW1lcmljIGxpdGVyYWxzOiBwbGFpbiBpbnRlZ2VycywgbG9uZ1xuaW50ZWdlcnMsIGZsb2F0aW5nIHBvaW50IG51bWJlcnMsIGFuZCBpbWFnaW5hcnkgbnVtYmVycy4gIFRoZXJlIGFyZSBub1xuY29tcGxleCBsaXRlcmFscyAoY29tcGxleCBudW1iZXJzIGNhbiBiZSBmb3JtZWQgYnkgYWRkaW5nIGEgcmVhbFxubnVtYmVyIGFuZCBhbiBpbWFnaW5hcnkgbnVtYmVyKS5cblxuTm90ZSB0aGF0IG51bWVyaWMgbGl0ZXJhbHMgZG8gbm90IGluY2x1ZGUgYSBzaWduOyBhIHBocmFzZSBsaWtlIGBgLTFgYFxuaXMgYWN0dWFsbHkgYW4gZXhwcmVzc2lvbiBjb21wb3NlZCBvZiB0aGUgdW5hcnkgb3BlcmF0b3IgJ2BgLWBgJyBhbmRcbnRoZSBsaXRlcmFsIGBgMWBgLlxuIiwKLSAnbnVtZXJpYy10eXBlcyc6IHUnXG5FbXVsYXRpbmcgbnVtZXJpYyB0eXBlc1xuKioqKioqKioqKioqKioqKioqKioqKipcblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGVtdWxhdGUgbnVtZXJpYyBvYmplY3RzLlxuTWV0aG9kcyBjb3JyZXNwb25kaW5nIHRvIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGVcbnBhcnRpY3VsYXIga2luZCBvZiBudW1iZXIgaW1wbGVtZW50ZWQgKGUuZy4sIGJpdHdpc2Ugb3BlcmF0aW9ucyBmb3Jcbm5vbi1pbnRlZ3JhbCBudW1iZXJzKSBzaG91bGQgYmUgbGVmdCB1bmRlZmluZWQuXG5cbm9iamVjdC5fX2FkZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fc3ViX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19tdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2Zsb29yZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19tb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2Rpdm1vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcG93X18oc2VsZiwgb3RoZXJbLCBtb2R1bG9dKVxub2JqZWN0Ll9fbHNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2FuZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9feG9yX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19vcl9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnkgYXJpdGhtZXRpY1xuICAgb3BlcmF0aW9ucyAoYGArYGAsIGBgLWBgLCBgYCpgYCwgYGAvL2BgLCBgYCVgYCwgYGBkaXZtb2QoKWBgLFxuICAgYGBwb3coKWBgLCBgYCoqYGAsIGBgPDxgYCwgYGA+PmBgLCBgYCZgYCwgYGBeYGAsIGBgfGBgKS4gIEZvclxuICAgaW5zdGFuY2UsIHRvIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uIGBgeCArIHlgYCwgd2hlcmUgKngqIGlzIGFuXG4gICBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQgaGFzIGFuIGBgX19hZGRfXygpYGAgbWV0aG9kLFxuICAgYGB4Ll9fYWRkX18oeSlgYCBpcyBjYWxsZWQuICBUaGUgYGBfX2Rpdm1vZF9fKClgYCBtZXRob2Qgc2hvdWxkIGJlXG4gICB0aGUgZXF1aXZhbGVudCB0byB1c2luZyBgYF9fZmxvb3JkaXZfXygpYGAgYW5kIGBgX19tb2RfXygpYGA7IGl0XG4gICBzaG91bGQgbm90IGJlIHJlbGF0ZWQgdG8gYGBfX3RydWVkaXZfXygpYGAgKGRlc2NyaWJlZCBiZWxvdykuICBOb3RlXG4gICB0aGF0IGBgX19wb3dfXygpYGAgc2hvdWxkIGJlIGRlZmluZWQgdG8gYWNjZXB0IGFuIG9wdGlvbmFsIHRoaXJkXG4gICBhcmd1bWVudCBpZiB0aGUgdGVybmFyeSB2ZXJzaW9uIG9mIHRoZSBidWlsdC1pbiBgYHBvdygpYGAgZnVuY3Rpb25cbiAgIGlzIHRvIGJlIHN1cHBvcnRlZC5cblxuICAgSWYgb25lIG9mIHRob3NlIG1ldGhvZHMgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uIHdpdGggdGhlXG4gICBzdXBwbGllZCBhcmd1bWVudHMsIGl0IHNob3VsZCByZXR1cm4gYGBOb3RJbXBsZW1lbnRlZGBgLlxuXG5vYmplY3QuX19kaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3RydWVkaXZfXyhzZWxmLCBvdGhlcilcblxuICAgVGhlIGRpdmlzaW9uIG9wZXJhdG9yIChgYC9gYCkgaXMgaW1wbGVtZW50ZWQgYnkgdGhlc2UgbWV0aG9kcy4gIFRoZVxuICAgYGBfX3RydWVkaXZfXygpYGAgbWV0aG9kIGlzIHVzZWQgd2hlbiBgYF9fZnV0dXJlX18uZGl2aXNpb25gYCBpcyBpblxuICAgZWZmZWN0LCBvdGhlcndpc2UgYGBfX2Rpdl9fKClgYCBpcyB1c2VkLiAgSWYgb25seSBvbmUgb2YgdGhlc2UgdHdvXG4gICBtZXRob2RzIGlzIGRlZmluZWQsIHRoZSBvYmplY3Qgd2lsbCBub3Qgc3VwcG9ydCBkaXZpc2lvbiBpbiB0aGVcbiAgIGFsdGVybmF0ZSBjb250ZXh0OyBgYFR5cGVFcnJvcmBgIHdpbGwgYmUgcmFpc2VkIGluc3RlYWQuXG5cbm9iamVjdC5fX3JhZGRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JzdWJfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JtdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3J0cnVlZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jtb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JkaXZtb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jwb3dfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jsc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jyc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JhbmRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3J4b3JfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jvcl9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnkgYXJpdGhtZXRpY1xuICAgb3BlcmF0aW9ucyAoYGArYGAsIGBgLWBgLCBgYCpgYCwgYGAvYGAsIGBgJWBgLCBgYGRpdm1vZCgpYGAsXG4gICBgYHBvdygpYGAsIGBgKipgYCwgYGA8PGBgLCBgYD4+YGAsIGBgJmBgLCBgYF5gYCwgYGB8YGApIHdpdGhcbiAgIHJlZmxlY3RlZCAoc3dhcHBlZCkgb3BlcmFuZHMuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgY2FsbGVkIGlmXG4gICB0aGUgbGVmdCBvcGVyYW5kIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uIGFuZFxuICAgdGhlIG9wZXJhbmRzIGFyZSBvZiBkaWZmZXJlbnQgdHlwZXMuIFsyXSBGb3IgaW5zdGFuY2UsIHRvIGV2YWx1YXRlXG4gICB0aGUgZXhwcmVzc2lvbiBgYHggLSB5YGAsIHdoZXJlICp5KiBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXRcbiAgIGhhcyBhbiBgYF9fcnN1Yl9fKClgYCBtZXRob2QsIGBgeS5fX3JzdWJfXyh4KWBgIGlzIGNhbGxlZCBpZlxuICAgYGB4Ll9fc3ViX18oeSlgYCByZXR1cm5zICpOb3RJbXBsZW1lbnRlZCouXG5cbiAgIE5vdGUgdGhhdCB0ZXJuYXJ5IGBgcG93KClgYCB3aWxsIG5vdCB0cnkgY2FsbGluZyBgYF9fcnBvd19fKClgYFxuICAgKHRoZSBjb2VyY2lvbiBydWxlcyB3b3VsZCBiZWNvbWUgdG9vIGNvbXBsaWNhdGVkKS5cblxuICAgTm90ZTogSWYgdGhlIHJpZ2h0IG9wZXJhbmRcJ3MgdHlwZSBpcyBhIHN1YmNsYXNzIG9mIHRoZSBsZWZ0IG9wZXJhbmRcJ3NcbiAgICAgdHlwZSBhbmQgdGhhdCBzdWJjbGFzcyBwcm92aWRlcyB0aGUgcmVmbGVjdGVkIG1ldGhvZCBmb3IgdGhlXG4gICAgIG9wZXJhdGlvbiwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBsZWZ0IG9wZXJhbmRcJ3NcbiAgICAgbm9uLXJlZmxlY3RlZCBtZXRob2QuICBUaGlzIGJlaGF2aW9yIGFsbG93cyBzdWJjbGFzc2VzIHRvXG4gICAgIG92ZXJyaWRlIHRoZWlyIGFuY2VzdG9yc1wnIG9wZXJhdGlvbnMuXG5cbm9iamVjdC5fX2lhZGRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lzdWJfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2ltdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2l0cnVlZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2ltb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lwb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pXG5vYmplY3QuX19pbHNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pcnNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pYW5kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19peG9yX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pb3JfXyhzZWxmLCBvdGhlcilcblxuICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYXVnbWVudGVkIGFyaXRobWV0aWNcbiAgIGFzc2lnbm1lbnRzIChgYCs9YGAsIGBgLT1gYCwgYGAqPWBgLCBgYC89YGAsIGBgLy89YGAsIGBgJT1gYCxcbiAgIGBgKio9YGAsIGBgPDw9YGAsIGBgPj49YGAsIGBgJj1gYCwgYGBePWBgLCBgYHw9YGApLiAgVGhlc2UgbWV0aG9kc1xuICAgc2hvdWxkIGF0dGVtcHQgdG8gZG8gdGhlIG9wZXJhdGlvbiBpbi1wbGFjZSAobW9kaWZ5aW5nICpzZWxmKikgYW5kXG4gICByZXR1cm4gdGhlIHJlc3VsdCAod2hpY2ggY291bGQgYmUsIGJ1dCBkb2VzIG5vdCBoYXZlIHRvIGJlLFxuICAgKnNlbGYqKS4gIElmIGEgc3BlY2lmaWMgbWV0aG9kIGlzIG5vdCBkZWZpbmVkLCB0aGUgYXVnbWVudGVkXG4gICBhc3NpZ25tZW50IGZhbGxzIGJhY2sgdG8gdGhlIG5vcm1hbCBtZXRob2RzLiAgRm9yIGluc3RhbmNlLCB0b1xuICAgZXhlY3V0ZSB0aGUgc3RhdGVtZW50IGBgeCArPSB5YGAsIHdoZXJlICp4KiBpcyBhbiBpbnN0YW5jZSBvZiBhXG4gICBjbGFzcyB0aGF0IGhhcyBhbiBgYF9faWFkZF9fKClgYCBtZXRob2QsIGBgeC5fX2lhZGRfXyh5KWBgIGlzXG4gICBjYWxsZWQuICBJZiAqeCogaXMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGRvZXMgbm90IGRlZmluZSBhXG4gICBgYF9faWFkZF9fKClgYCBtZXRob2QsIGBgeC5fX2FkZF9fKHkpYGAgYW5kIGBgeS5fX3JhZGRfXyh4KWBgIGFyZVxuICAgY29uc2lkZXJlZCwgYXMgd2l0aCB0aGUgZXZhbHVhdGlvbiBvZiBgYHggKyB5YGAuXG5cbm9iamVjdC5fX25lZ19fKHNlbGYpXG5vYmplY3QuX19wb3NfXyhzZWxmKVxub2JqZWN0Ll9fYWJzX18oc2VsZilcbm9iamVjdC5fX2ludmVydF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIHVuYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9ucyAoYGAtYGAsIGBgK2BgLFxuICAgYGBhYnMoKWBgIGFuZCBgYH5gYCkuXG5cbm9iamVjdC5fX2NvbXBsZXhfXyhzZWxmKVxub2JqZWN0Ll9faW50X18oc2VsZilcbm9iamVjdC5fX2xvbmdfXyhzZWxmKVxub2JqZWN0Ll9fZmxvYXRfXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgYGBjb21wbGV4KClgYCxcbiAgIGBgaW50KClgYCwgYGBsb25nKClgYCwgYW5kIGBgZmxvYXQoKWBgLiAgU2hvdWxkIHJldHVybiBhIHZhbHVlIG9mXG4gICB0aGUgYXBwcm9wcmlhdGUgdHlwZS5cblxub2JqZWN0Ll9fb2N0X18oc2VsZilcbm9iamVjdC5fX2hleF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyBgYG9jdCgpYGAgYW5kIGBgaGV4KClgYC5cbiAgIFNob3VsZCByZXR1cm4gYSBzdHJpbmcgdmFsdWUuXG5cbm9iamVjdC5fX2luZGV4X18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBgYG9wZXJhdG9yLmluZGV4KClgYC4gIEFsc28gY2FsbGVkIHdoZW5ldmVyXG4gICBQeXRob24gbmVlZHMgYW4gaW50ZWdlciBvYmplY3QgKHN1Y2ggYXMgaW4gc2xpY2luZykuICBNdXN0IHJldHVyblxuICAgYW4gaW50ZWdlciAoaW50IG9yIGxvbmcpLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjUuXG5cbm9iamVjdC5fX2NvZXJjZV9fKHNlbGYsIG90aGVyKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50ICJtaXhlZC1tb2RlIiBudW1lcmljIGFyaXRobWV0aWMuICBTaG91bGQgZWl0aGVyXG4gICByZXR1cm4gYSAyLXR1cGxlIGNvbnRhaW5pbmcgKnNlbGYqIGFuZCAqb3RoZXIqIGNvbnZlcnRlZCB0byBhXG4gICBjb21tb24gbnVtZXJpYyB0eXBlLCBvciBgYE5vbmVgYCBpZiBjb252ZXJzaW9uIGlzIGltcG9zc2libGUuICBXaGVuXG4gICB0aGUgY29tbW9uIHR5cGUgd291bGQgYmUgdGhlIHR5cGUgb2YgYGBvdGhlcmBgLCBpdCBpcyBzdWZmaWNpZW50IHRvXG4gICByZXR1cm4gYGBOb25lYGAsIHNpbmNlIHRoZSBpbnRlcnByZXRlciB3aWxsIGFsc28gYXNrIHRoZSBvdGhlclxuICAgb2JqZWN0IHRvIGF0dGVtcHQgYSBjb2VyY2lvbiAoYnV0IHNvbWV0aW1lcywgaWYgdGhlIGltcGxlbWVudGF0aW9uXG4gICBvZiB0aGUgb3RoZXIgdHlwZSBjYW5ub3QgYmUgY2hhbmdlZCwgaXQgaXMgdXNlZnVsIHRvIGRvIHRoZVxuICAgY29udmVyc2lvbiB0byB0aGUgb3RoZXIgdHlwZSBoZXJlKS4gIEEgcmV0dXJuIHZhbHVlIG9mXG4gICBgYE5vdEltcGxlbWVudGVkYGAgaXMgZXF1aXZhbGVudCB0byByZXR1cm5pbmcgYGBOb25lYGAuXG4nLAotICdvYmplY3RzJzogdSdcbk9iamVjdHMsIHZhbHVlcyBhbmQgdHlwZXNcbioqKioqKioqKioqKioqKioqKioqKioqKipcblxuKk9iamVjdHMqIGFyZSBQeXRob25cJ3MgYWJzdHJhY3Rpb24gZm9yIGRhdGEuICBBbGwgZGF0YSBpbiBhIFB5dGhvblxucHJvZ3JhbSBpcyByZXByZXNlbnRlZCBieSBvYmplY3RzIG9yIGJ5IHJlbGF0aW9ucyBiZXR3ZWVuIG9iamVjdHMuIChJblxuYSBzZW5zZSwgYW5kIGluIGNvbmZvcm1hbmNlIHRvIFZvbiBOZXVtYW5uXCdzIG1vZGVsIG9mIGEgInN0b3JlZFxucHJvZ3JhbSBjb21wdXRlciwiIGNvZGUgaXMgYWxzbyByZXByZXNlbnRlZCBieSBvYmplY3RzLilcblxuRXZlcnkgb2JqZWN0IGhhcyBhbiBpZGVudGl0eSwgYSB0eXBlIGFuZCBhIHZhbHVlLiAgQW4gb2JqZWN0XCdzXG4qaWRlbnRpdHkqIG5ldmVyIGNoYW5nZXMgb25jZSBpdCBoYXMgYmVlbiBjcmVhdGVkOyB5b3UgbWF5IHRoaW5rIG9mIGl0XG5hcyB0aGUgb2JqZWN0XCdzIGFkZHJlc3MgaW4gbWVtb3J5LiAgVGhlIFwnYGBpc2BgXCcgb3BlcmF0b3IgY29tcGFyZXMgdGhlXG5pZGVudGl0eSBvZiB0d28gb2JqZWN0czsgdGhlIGBgaWQoKWBgIGZ1bmN0aW9uIHJldHVybnMgYW4gaW50ZWdlclxucmVwcmVzZW50aW5nIGl0cyBpZGVudGl0eSAoY3VycmVudGx5IGltcGxlbWVudGVkIGFzIGl0cyBhZGRyZXNzKS4gQW5cbm9iamVjdFwncyAqdHlwZSogaXMgYWxzbyB1bmNoYW5nZWFibGUuIFsxXSBBbiBvYmplY3RcJ3MgdHlwZSBkZXRlcm1pbmVzXG50aGUgb3BlcmF0aW9ucyB0aGF0IHRoZSBvYmplY3Qgc3VwcG9ydHMgKGUuZy4sICJkb2VzIGl0IGhhdmUgYVxubGVuZ3RoPyIpIGFuZCBhbHNvIGRlZmluZXMgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3Igb2JqZWN0cyBvZiB0aGF0XG50eXBlLiAgVGhlIGBgdHlwZSgpYGAgZnVuY3Rpb24gcmV0dXJucyBhbiBvYmplY3RcJ3MgdHlwZSAod2hpY2ggaXMgYW5cbm9iamVjdCBpdHNlbGYpLiAgVGhlICp2YWx1ZSogb2Ygc29tZSBvYmplY3RzIGNhbiBjaGFuZ2UuICBPYmplY3RzXG53aG9zZSB2YWx1ZSBjYW4gY2hhbmdlIGFyZSBzYWlkIHRvIGJlICptdXRhYmxlKjsgb2JqZWN0cyB3aG9zZSB2YWx1ZVxuaXMgdW5jaGFuZ2VhYmxlIG9uY2UgdGhleSBhcmUgY3JlYXRlZCBhcmUgY2FsbGVkICppbW11dGFibGUqLiAoVGhlXG52YWx1ZSBvZiBhbiBpbW11dGFibGUgY29udGFpbmVyIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIGFcbm11dGFibGUgb2JqZWN0IGNhbiBjaGFuZ2Ugd2hlbiB0aGUgbGF0dGVyXCdzIHZhbHVlIGlzIGNoYW5nZWQ7IGhvd2V2ZXJcbnRoZSBjb250YWluZXIgaXMgc3RpbGwgY29uc2lkZXJlZCBpbW11dGFibGUsIGJlY2F1c2UgdGhlIGNvbGxlY3Rpb24gb2Zcbm9iamVjdHMgaXQgY29udGFpbnMgY2Fubm90IGJlIGNoYW5nZWQuICBTbywgaW1tdXRhYmlsaXR5IGlzIG5vdFxuc3RyaWN0bHkgdGhlIHNhbWUgYXMgaGF2aW5nIGFuIHVuY2hhbmdlYWJsZSB2YWx1ZSwgaXQgaXMgbW9yZSBzdWJ0bGUuKVxuQW4gb2JqZWN0XCdzIG11dGFiaWxpdHkgaXMgZGV0ZXJtaW5lZCBieSBpdHMgdHlwZTsgZm9yIGluc3RhbmNlLFxubnVtYmVycywgc3RyaW5ncyBhbmQgdHVwbGVzIGFyZSBpbW11dGFibGUsIHdoaWxlIGRpY3Rpb25hcmllcyBhbmRcbmxpc3RzIGFyZSBtdXRhYmxlLlxuXG5PYmplY3RzIGFyZSBuZXZlciBleHBsaWNpdGx5IGRlc3Ryb3llZDsgaG93ZXZlciwgd2hlbiB0aGV5IGJlY29tZVxudW5yZWFjaGFibGUgdGhleSBtYXkgYmUgZ2FyYmFnZS1jb2xsZWN0ZWQuICBBbiBpbXBsZW1lbnRhdGlvbiBpc1xuYWxsb3dlZCB0byBwb3N0cG9uZSBnYXJiYWdlIGNvbGxlY3Rpb24gb3Igb21pdCBpdCBhbHRvZ2V0aGVyIC0tLSBpdCBpc1xuYSBtYXR0ZXIgb2YgaW1wbGVtZW50YXRpb24gcXVhbGl0eSBob3cgZ2FyYmFnZSBjb2xsZWN0aW9uIGlzXG5pbXBsZW1lbnRlZCwgYXMgbG9uZyBhcyBubyBvYmplY3RzIGFyZSBjb2xsZWN0ZWQgdGhhdCBhcmUgc3RpbGxcbnJlYWNoYWJsZS5cblxuKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBDUHl0aG9uIGN1cnJlbnRseSB1c2VzIGEgcmVmZXJlbmNlLVxuY291bnRpbmcgc2NoZW1lIHdpdGggKG9wdGlvbmFsKSBkZWxheWVkIGRldGVjdGlvbiBvZiBjeWNsaWNhbGx5IGxpbmtlZFxuZ2FyYmFnZSwgd2hpY2ggY29sbGVjdHMgbW9zdCBvYmplY3RzIGFzIHNvb24gYXMgdGhleSBiZWNvbWVcbnVucmVhY2hhYmxlLCBidXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gY29sbGVjdCBnYXJiYWdlIGNvbnRhaW5pbmdcbmNpcmN1bGFyIHJlZmVyZW5jZXMuICBTZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGBgZ2NgYCBtb2R1bGUgZm9yXG5pbmZvcm1hdGlvbiBvbiBjb250cm9sbGluZyB0aGUgY29sbGVjdGlvbiBvZiBjeWNsaWMgZ2FyYmFnZS4gT3RoZXJcbmltcGxlbWVudGF0aW9ucyBhY3QgZGlmZmVyZW50bHkgYW5kIENQeXRob24gbWF5IGNoYW5nZS4gRG8gbm90IGRlcGVuZFxub24gaW1tZWRpYXRlIGZpbmFsaXphdGlvbiBvZiBvYmplY3RzIHdoZW4gdGhleSBiZWNvbWUgdW5yZWFjaGFibGUgKGV4OlxuYWx3YXlzIGNsb3NlIGZpbGVzKS5cblxuTm90ZSB0aGF0IHRoZSB1c2Ugb2YgdGhlIGltcGxlbWVudGF0aW9uXCdzIHRyYWNpbmcgb3IgZGVidWdnaW5nXG5mYWNpbGl0aWVzIG1heSBrZWVwIG9iamVjdHMgYWxpdmUgdGhhdCB3b3VsZCBub3JtYWxseSBiZSBjb2xsZWN0YWJsZS5cbkFsc28gbm90ZSB0aGF0IGNhdGNoaW5nIGFuIGV4Y2VwdGlvbiB3aXRoIGEgXCdgYHRyeWBgLi4uYGBleGNlcHRgYFwnXG5zdGF0ZW1lbnQgbWF5IGtlZXAgb2JqZWN0cyBhbGl2ZS5cblxuU29tZSBvYmplY3RzIGNvbnRhaW4gcmVmZXJlbmNlcyB0byAiZXh0ZXJuYWwiIHJlc291cmNlcyBzdWNoIGFzIG9wZW5cbmZpbGVzIG9yIHdpbmRvd3MuICBJdCBpcyB1bmRlcnN0b29kIHRoYXQgdGhlc2UgcmVzb3VyY2VzIGFyZSBmcmVlZFxud2hlbiB0aGUgb2JqZWN0IGlzIGdhcmJhZ2UtY29sbGVjdGVkLCBidXQgc2luY2UgZ2FyYmFnZSBjb2xsZWN0aW9uIGlzXG5ub3QgZ3VhcmFudGVlZCB0byBoYXBwZW4sIHN1Y2ggb2JqZWN0cyBhbHNvIHByb3ZpZGUgYW4gZXhwbGljaXQgd2F5IHRvXG5yZWxlYXNlIHRoZSBleHRlcm5hbCByZXNvdXJjZSwgdXN1YWxseSBhIGBgY2xvc2UoKWBgIG1ldGhvZC4gUHJvZ3JhbXNcbmFyZSBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBleHBsaWNpdGx5IGNsb3NlIHN1Y2ggb2JqZWN0cy4gIFRoZVxuXCdgYHRyeWBgLi4uYGBmaW5hbGx5YGBcJyBzdGF0ZW1lbnQgcHJvdmlkZXMgYSBjb252ZW5pZW50IHdheSB0byBkb1xudGhpcy5cblxuU29tZSBvYmplY3RzIGNvbnRhaW4gcmVmZXJlbmNlcyB0byBvdGhlciBvYmplY3RzOyB0aGVzZSBhcmUgY2FsbGVkXG4qY29udGFpbmVycyouIEV4YW1wbGVzIG9mIGNvbnRhaW5lcnMgYXJlIHR1cGxlcywgbGlzdHMgYW5kXG5kaWN0aW9uYXJpZXMuICBUaGUgcmVmZXJlbmNlcyBhcmUgcGFydCBvZiBhIGNvbnRhaW5lclwncyB2YWx1ZS4gIEluXG5tb3N0IGNhc2VzLCB3aGVuIHdlIHRhbGsgYWJvdXQgdGhlIHZhbHVlIG9mIGEgY29udGFpbmVyLCB3ZSBpbXBseSB0aGVcbnZhbHVlcywgbm90IHRoZSBpZGVudGl0aWVzIG9mIHRoZSBjb250YWluZWQgb2JqZWN0czsgaG93ZXZlciwgd2hlbiB3ZVxudGFsayBhYm91dCB0aGUgbXV0YWJpbGl0eSBvZiBhIGNvbnRhaW5lciwgb25seSB0aGUgaWRlbnRpdGllcyBvZiB0aGVcbmltbWVkaWF0ZWx5IGNvbnRhaW5lZCBvYmplY3RzIGFyZSBpbXBsaWVkLiAgU28sIGlmIGFuIGltbXV0YWJsZVxuY29udGFpbmVyIChsaWtlIGEgdHVwbGUpIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIGEgbXV0YWJsZSBvYmplY3QsIGl0c1xudmFsdWUgY2hhbmdlcyBpZiB0aGF0IG11dGFibGUgb2JqZWN0IGlzIGNoYW5nZWQuXG5cblR5cGVzIGFmZmVjdCBhbG1vc3QgYWxsIGFzcGVjdHMgb2Ygb2JqZWN0IGJlaGF2aW9yLiAgRXZlbiB0aGVcbmltcG9ydGFuY2Ugb2Ygb2JqZWN0IGlkZW50aXR5IGlzIGFmZmVjdGVkIGluIHNvbWUgc2Vuc2U6IGZvciBpbW11dGFibGVcbnR5cGVzLCBvcGVyYXRpb25zIHRoYXQgY29tcHV0ZSBuZXcgdmFsdWVzIG1heSBhY3R1YWxseSByZXR1cm4gYVxucmVmZXJlbmNlIHRvIGFueSBleGlzdGluZyBvYmplY3Qgd2l0aCB0aGUgc2FtZSB0eXBlIGFuZCB2YWx1ZSwgd2hpbGVcbmZvciBtdXRhYmxlIG9iamVjdHMgdGhpcyBpcyBub3QgYWxsb3dlZC4gIEUuZy4sIGFmdGVyIGBgYSA9IDE7IGIgPVxuMWBgLCBgYGFgYCBhbmQgYGBiYGAgbWF5IG9yIG1heSBub3QgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0IHdpdGggdGhlXG52YWx1ZSBvbmUsIGRlcGVuZGluZyBvbiB0aGUgaW1wbGVtZW50YXRpb24sIGJ1dCBhZnRlciBgYGMgPSBbXTsgZCA9XG5bXWBgLCBgYGNgYCBhbmQgYGBkYGAgYXJlIGd1YXJhbnRlZWQgdG8gcmVmZXIgdG8gdHdvIGRpZmZlcmVudCxcbnVuaXF1ZSwgbmV3bHkgY3JlYXRlZCBlbXB0eSBsaXN0cy4gKE5vdGUgdGhhdCBgYGMgPSBkID0gW11gYCBhc3NpZ25zXG50aGUgc2FtZSBvYmplY3QgdG8gYm90aCBgYGNgYCBhbmQgYGBkYGAuKVxuJywKLSAnb3BlcmF0b3Itc3VtbWFyeSc6IHUnXG5TdW1tYXJ5XG4qKioqKioqXG5cblRoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyB0aGUgb3BlcmF0b3IgcHJlY2VkZW5jZXMgaW4gUHl0aG9uLFxuZnJvbSBsb3dlc3QgcHJlY2VkZW5jZSAobGVhc3QgYmluZGluZykgdG8gaGlnaGVzdCBwcmVjZWRlbmNlIChtb3N0XG5iaW5kaW5nKS4gT3BlcmF0b3JzIGluIHRoZSBzYW1lIGJveCBoYXZlIHRoZSBzYW1lIHByZWNlZGVuY2UuICBVbmxlc3NcbnRoZSBzeW50YXggaXMgZXhwbGljaXRseSBnaXZlbiwgb3BlcmF0b3JzIGFyZSBiaW5hcnkuICBPcGVyYXRvcnMgaW5cbnRoZSBzYW1lIGJveCBncm91cCBsZWZ0IHRvIHJpZ2h0IChleGNlcHQgZm9yIGNvbXBhcmlzb25zLCBpbmNsdWRpbmdcbnRlc3RzLCB3aGljaCBhbGwgaGF2ZSB0aGUgc2FtZSBwcmVjZWRlbmNlIGFuZCBjaGFpbiBmcm9tIGxlZnQgdG8gcmlnaHRcbi0tLSBzZWUgc2VjdGlvbiAqQ29tcGFyaXNvbnMqIC0tLSBhbmQgZXhwb25lbnRpYXRpb24sIHdoaWNoIGdyb3Vwc1xuZnJvbSByaWdodCB0byBsZWZ0KS5cblxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBPcGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xufCBgYGxhbWJkYWBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExhbWJkYSBleHByZXNzaW9uICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYGlmYGAgLS0gYGBlbHNlYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENvbmRpdGlvbmFsIGV4cHJlc3Npb24gICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYG9yYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJvb2xlYW4gT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYGFuZGBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJvb2xlYW4gQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYG5vdGBgICp4KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJvb2xlYW4gTk9UICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYGluYGAsIGBgbm90YGAgYGBpbmBgLCBgYGlzYGAsIGBgaXMgbm90YGAsICAgICB8IENvbXBhcmlzb25zLCBpbmNsdWRpbmcgbWVtYmVyc2hpcCAgICAgfFxufCBgYDxgYCwgYGA8PWBgLCBgYD5gYCwgYGA+PWBgLCBgYDw+YGAsIGBgIT1gYCwgICB8IHRlc3RzIGFuZCBpZGVudGl0eSB0ZXN0cywgICAgICAgICAgICAgfFxufCBgYD09YGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHxgYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJpdHdpc2UgT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYF5gYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJpdHdpc2UgWE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYCZgYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJpdHdpc2UgQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYDw8YGAsIGBgPj5gYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNoaWZ0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYCtgYCwgYGAtYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbiAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYCpgYCwgYGAvYGAsIGBgLy9gYCwgYGAlYGAgICAgICAgICAgICAgICAgICAgICB8IE11bHRpcGxpY2F0aW9uLCBkaXZpc2lvbiwgcmVtYWluZGVyICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFs4XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYCt4YGAsIGBgLXhgYCwgYGB+eGBgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBvc2l0aXZlLCBuZWdhdGl2ZSwgYml0d2lzZSBOT1QgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYCoqYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEV4cG9uZW50aWF0aW9uIFs5XSAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHhbaW5kZXhdYGAsIGBgeFtpbmRleDppbmRleF1gYCwgICAgICAgICAgICAgICB8IFN1YnNjcmlwdGlvbiwgc2xpY2luZywgY2FsbCwgICAgICAgICAgfFxufCBgYHgoYXJndW1lbnRzLi4uKWBgLCBgYHguYXR0cmlidXRlYGAgICAgICAgICAgICB8IGF0dHJpYnV0ZSByZWZlcmVuY2UgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYChleHByZXNzaW9ucy4uLilgYCwgYGBbZXhwcmVzc2lvbnMuLi5dYGAsICAgICB8IEJpbmRpbmcgb3IgdHVwbGUgZGlzcGxheSwgbGlzdCAgICAgICAgfFxufCBgYHtrZXk6ZGF0dW0uLi59YGAsIGBgYGV4cHJlc3Npb25zLi4uYGBgICAgICAgICB8IGRpc3BsYXksIGRpY3Rpb25hcnkgZGlzcGxheSwgc3RyaW5nICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNvbnZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuXG4tWyBGb290bm90ZXMgXS1cblxuWzFdIEluIFB5dGhvbiAyLjMgYW5kIGxhdGVyIHJlbGVhc2VzLCBhIGxpc3QgY29tcHJlaGVuc2lvbiAibGVha3MiIHRoZVxuICAgIGNvbnRyb2wgdmFyaWFibGVzIG9mIGVhY2ggYGBmb3JgYCBpdCBjb250YWlucyBpbnRvIHRoZSBjb250YWluaW5nXG4gICAgc2NvcGUuICBIb3dldmVyLCB0aGlzIGJlaGF2aW9yIGlzIGRlcHJlY2F0ZWQsIGFuZCByZWx5aW5nIG9uIGl0XG4gICAgd2lsbCBub3Qgd29yayBpbiBQeXRob24gMy4wXG5cblsyXSBXaGlsZSBgYGFicyh4JXkpIDwgYWJzKHkpYGAgaXMgdHJ1ZSBtYXRoZW1hdGljYWxseSwgZm9yIGZsb2F0cyBpdFxuICAgIG1heSBub3QgYmUgdHJ1ZSBudW1lcmljYWxseSBkdWUgdG8gcm91bmRvZmYuICBGb3IgZXhhbXBsZSwgYW5kXG4gICAgYXNzdW1pbmcgYSBwbGF0Zm9ybSBvbiB3aGljaCBhIFB5dGhvbiBmbG9hdCBpcyBhbiBJRUVFIDc1NCBkb3VibGUtXG4gICAgcHJlY2lzaW9uIG51bWJlciwgaW4gb3JkZXIgdGhhdCBgYC0xZS0xMDAgJSAxZTEwMGBgIGhhdmUgdGhlIHNhbWVcbiAgICBzaWduIGFzIGBgMWUxMDBgYCwgdGhlIGNvbXB1dGVkIHJlc3VsdCBpcyBgYC0xZS0xMDAgKyAxZTEwMGBgLFxuICAgIHdoaWNoIGlzIG51bWVyaWNhbGx5IGV4YWN0bHkgZXF1YWwgdG8gYGAxZTEwMGBgLiAgVGhlIGZ1bmN0aW9uXG4gICAgYGBtYXRoLmZtb2QoKWBgIHJldHVybnMgYSByZXN1bHQgd2hvc2Ugc2lnbiBtYXRjaGVzIHRoZSBzaWduIG9mXG4gICAgdGhlIGZpcnN0IGFyZ3VtZW50IGluc3RlYWQsIGFuZCBzbyByZXR1cm5zIGBgLTFlLTEwMGBgIGluIHRoaXNcbiAgICBjYXNlLiBXaGljaCBhcHByb2FjaCBpcyBtb3JlIGFwcHJvcHJpYXRlIGRlcGVuZHMgb24gdGhlXG4gICAgYXBwbGljYXRpb24uXG5cblszXSBJZiB4IGlzIHZlcnkgY2xvc2UgdG8gYW4gZXhhY3QgaW50ZWdlciBtdWx0aXBsZSBvZiB5LCBpdFwnc1xuICAgIHBvc3NpYmxlIGZvciBgYGZsb29yKHgveSlgYCB0byBiZSBvbmUgbGFyZ2VyIHRoYW4gYGAoeC14JXkpL3lgYFxuICAgIGR1ZSB0byByb3VuZGluZy4gIEluIHN1Y2ggY2FzZXMsIFB5dGhvbiByZXR1cm5zIHRoZSBsYXR0ZXIgcmVzdWx0LFxuICAgIGluIG9yZGVyIHRvIHByZXNlcnZlIHRoYXQgYGBkaXZtb2QoeCx5KVswXSAqIHkgKyB4ICUgeWBgIGJlIHZlcnlcbiAgICBjbG9zZSB0byBgYHhgYC5cblxuWzRdIFdoaWxlIGNvbXBhcmlzb25zIGJldHdlZW4gdW5pY29kZSBzdHJpbmdzIG1ha2Ugc2Vuc2UgYXQgdGhlIGJ5dGVcbiAgICBsZXZlbCwgdGhleSBtYXkgYmUgY291bnRlci1pbnR1aXRpdmUgdG8gdXNlcnMuIEZvciBleGFtcGxlLCB0aGVcbiAgICBzdHJpbmdzIGBgdSJcXHUwMEM3ImBgIGFuZCBgYHUiXFx1MDA0M1xcdTAzMjciYGAgY29tcGFyZSBkaWZmZXJlbnRseSxcbiAgICBldmVuIHRob3VnaCB0aGV5IGJvdGggcmVwcmVzZW50IHRoZSBzYW1lIHVuaWNvZGUgY2hhcmFjdGVyIChMQVRJTlxuICAgIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBKS4gVG8gY29tcGFyZSBzdHJpbmdzIGluIGEgaHVtYW5cbiAgICByZWNvZ25pemFibGUgd2F5LCBjb21wYXJlIHVzaW5nIGBgdW5pY29kZWRhdGEubm9ybWFsaXplKClgYC5cblxuWzVdIFRoZSBpbXBsZW1lbnRhdGlvbiBjb21wdXRlcyB0aGlzIGVmZmljaWVudGx5LCB3aXRob3V0IGNvbnN0cnVjdGluZ1xuICAgIGxpc3RzIG9yIHNvcnRpbmcuXG5cbls2XSBFYXJsaWVyIHZlcnNpb25zIG9mIFB5dGhvbiB1c2VkIGxleGljb2dyYXBoaWMgY29tcGFyaXNvbiBvZiB0aGVcbiAgICBzb3J0ZWQgKGtleSwgdmFsdWUpIGxpc3RzLCBidXQgdGhpcyB3YXMgdmVyeSBleHBlbnNpdmUgZm9yIHRoZVxuICAgIGNvbW1vbiBjYXNlIG9mIGNvbXBhcmluZyBmb3IgZXF1YWxpdHkuICBBbiBldmVuIGVhcmxpZXIgdmVyc2lvbiBvZlxuICAgIFB5dGhvbiBjb21wYXJlZCBkaWN0aW9uYXJpZXMgYnkgaWRlbnRpdHkgb25seSwgYnV0IHRoaXMgY2F1c2VkXG4gICAgc3VycHJpc2VzIGJlY2F1c2UgcGVvcGxlIGV4cGVjdGVkIHRvIGJlIGFibGUgdG8gdGVzdCBhIGRpY3Rpb25hcnlcbiAgICBmb3IgZW1wdGluZXNzIGJ5IGNvbXBhcmluZyBpdCB0byBgYHt9YGAuXG5cbls3XSBEdWUgdG8gYXV0b21hdGljIGdhcmJhZ2UtY29sbGVjdGlvbiwgZnJlZSBsaXN0cywgYW5kIHRoZSBkeW5hbWljXG4gICAgbmF0dXJlIG9mIGRlc2NyaXB0b3JzLCB5b3UgbWF5IG5vdGljZSBzZWVtaW5nbHkgdW51c3VhbCBiZWhhdmlvdXJcbiAgICBpbiBjZXJ0YWluIHVzZXMgb2YgdGhlIGBgaXNgYCBvcGVyYXRvciwgbGlrZSB0aG9zZSBpbnZvbHZpbmdcbiAgICBjb21wYXJpc29ucyBiZXR3ZWVuIGluc3RhbmNlIG1ldGhvZHMsIG9yIGNvbnN0YW50cy4gIENoZWNrIHRoZWlyXG4gICAgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvLlxuXG5bOF0gVGhlIGBgJWBgIG9wZXJhdG9yIGlzIGFsc28gdXNlZCBmb3Igc3RyaW5nIGZvcm1hdHRpbmc7IHRoZSBzYW1lXG4gICAgcHJlY2VkZW5jZSBhcHBsaWVzLlxuXG5bOV0gVGhlIHBvd2VyIG9wZXJhdG9yIGBgKipgYCBiaW5kcyBsZXNzIHRpZ2h0bHkgdGhhbiBhbiBhcml0aG1ldGljIG9yXG4gICAgYml0d2lzZSB1bmFyeSBvcGVyYXRvciBvbiBpdHMgcmlnaHQsIHRoYXQgaXMsIGBgMioqLTFgYCBpc1xuICAgIGBgMC41YGAuXG4nLAotICdwYXNzJzogdSdcblRoZSBgYHBhc3NgYCBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKipcblxuICAgcGFzc19zdG10IDo6PSAicGFzcyJcblxuYGBwYXNzYGAgaXMgYSBudWxsIG9wZXJhdGlvbiAtLS0gd2hlbiBpdCBpcyBleGVjdXRlZCwgbm90aGluZyBoYXBwZW5zLlxuSXQgaXMgdXNlZnVsIGFzIGEgcGxhY2Vob2xkZXIgd2hlbiBhIHN0YXRlbWVudCBpcyByZXF1aXJlZFxuc3ludGFjdGljYWxseSwgYnV0IG5vIGNvZGUgbmVlZHMgdG8gYmUgZXhlY3V0ZWQsIGZvciBleGFtcGxlOlxuXG4gICBkZWYgZihhcmcpOiBwYXNzICAgICMgYSBmdW5jdGlvbiB0aGF0IGRvZXMgbm90aGluZyAoeWV0KVxuXG4gICBjbGFzcyBDOiBwYXNzICAgICAgICMgYSBjbGFzcyB3aXRoIG5vIG1ldGhvZHMgKHlldClcbicsCi0gJ3Bvd2VyJzogdSdcblRoZSBwb3dlciBvcGVyYXRvclxuKioqKioqKioqKioqKioqKioqXG5cblRoZSBwb3dlciBvcGVyYXRvciBiaW5kcyBtb3JlIHRpZ2h0bHkgdGhhbiB1bmFyeSBvcGVyYXRvcnMgb24gaXRzXG5sZWZ0OyBpdCBiaW5kcyBsZXNzIHRpZ2h0bHkgdGhhbiB1bmFyeSBvcGVyYXRvcnMgb24gaXRzIHJpZ2h0LiAgVGhlXG5zeW50YXggaXM6XG5cbiAgIHBvd2VyIDo6PSBwcmltYXJ5IFsiKioiIHVfZXhwcl1cblxuVGh1cywgaW4gYW4gdW5wYXJlbnRoZXNpemVkIHNlcXVlbmNlIG9mIHBvd2VyIGFuZCB1bmFyeSBvcGVyYXRvcnMsIHRoZVxub3BlcmF0b3JzIGFyZSBldmFsdWF0ZWQgZnJvbSByaWdodCB0byBsZWZ0ICh0aGlzIGRvZXMgbm90IGNvbnN0cmFpblxudGhlIGV2YWx1YXRpb24gb3JkZXIgZm9yIHRoZSBvcGVyYW5kcyk6IGBgLTEqKjJgYCByZXN1bHRzIGluIGBgLTFgYC5cblxuVGhlIHBvd2VyIG9wZXJhdG9yIGhhcyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlIGJ1aWx0LWluIGBgcG93KClgYFxuZnVuY3Rpb24sIHdoZW4gY2FsbGVkIHdpdGggdHdvIGFyZ3VtZW50czogaXQgeWllbGRzIGl0cyBsZWZ0IGFyZ3VtZW50XG5yYWlzZWQgdG8gdGhlIHBvd2VyIG9mIGl0cyByaWdodCBhcmd1bWVudC4gIFRoZSBudW1lcmljIGFyZ3VtZW50cyBhcmVcbmZpcnN0IGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLiAgVGhlIHJlc3VsdCB0eXBlIGlzIHRoYXQgb2YgdGhlXG5hcmd1bWVudHMgYWZ0ZXIgY29lcmNpb24uXG5cbldpdGggbWl4ZWQgb3BlcmFuZCB0eXBlcywgdGhlIGNvZXJjaW9uIHJ1bGVzIGZvciBiaW5hcnkgYXJpdGhtZXRpY1xub3BlcmF0b3JzIGFwcGx5LiBGb3IgaW50IGFuZCBsb25nIGludCBvcGVyYW5kcywgdGhlIHJlc3VsdCBoYXMgdGhlXG5zYW1lIHR5cGUgYXMgdGhlIG9wZXJhbmRzIChhZnRlciBjb2VyY2lvbikgdW5sZXNzIHRoZSBzZWNvbmQgYXJndW1lbnRcbmlzIG5lZ2F0aXZlOyBpbiB0aGF0IGNhc2UsIGFsbCBhcmd1bWVudHMgYXJlIGNvbnZlcnRlZCB0byBmbG9hdCBhbmQgYVxuZmxvYXQgcmVzdWx0IGlzIGRlbGl2ZXJlZC4gRm9yIGV4YW1wbGUsIGBgMTAqKjJgYCByZXR1cm5zIGBgMTAwYGAsIGJ1dFxuYGAxMCoqLTJgYCByZXR1cm5zIGBgMC4wMWBgLiAoVGhpcyBsYXN0IGZlYXR1cmUgd2FzIGFkZGVkIGluIFB5dGhvblxuMi4yLiBJbiBQeXRob24gMi4xIGFuZCBiZWZvcmUsIGlmIGJvdGggYXJndW1lbnRzIHdlcmUgb2YgaW50ZWdlciB0eXBlc1xuYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgd2FzIG5lZ2F0aXZlLCBhbiBleGNlcHRpb24gd2FzIHJhaXNlZCkuXG5cblJhaXNpbmcgYGAwLjBgYCB0byBhIG5lZ2F0aXZlIHBvd2VyIHJlc3VsdHMgaW4gYVxuYGBaZXJvRGl2aXNpb25FcnJvcmBgLiBSYWlzaW5nIGEgbmVnYXRpdmUgbnVtYmVyIHRvIGEgZnJhY3Rpb25hbCBwb3dlclxucmVzdWx0cyBpbiBhIGBgVmFsdWVFcnJvcmBgLlxuJywKLSAncHJpbnQnOiB1J1xuVGhlIGBgcHJpbnRgYCBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKioqXG5cbiAgIHByaW50X3N0bXQgOjo9ICJwcmludCIgKFtleHByZXNzaW9uICgiLCIgZXhwcmVzc2lvbikqIFsiLCJdXVxuICAgICAgICAgICAgICAgICAgfCAiPj4iIGV4cHJlc3Npb24gWygiLCIgZXhwcmVzc2lvbikrIFsiLCJdXSlcblxuYGBwcmludGBgIGV2YWx1YXRlcyBlYWNoIGV4cHJlc3Npb24gaW4gdHVybiBhbmQgd3JpdGVzIHRoZSByZXN1bHRpbmdcbm9iamVjdCB0byBzdGFuZGFyZCBvdXRwdXQgKHNlZSBiZWxvdykuICBJZiBhbiBvYmplY3QgaXMgbm90IGEgc3RyaW5nLFxuaXQgaXMgZmlyc3QgY29udmVydGVkIHRvIGEgc3RyaW5nIHVzaW5nIHRoZSBydWxlcyBmb3Igc3RyaW5nXG5jb252ZXJzaW9ucy4gIFRoZSAocmVzdWx0aW5nIG9yIG9yaWdpbmFsKSBzdHJpbmcgaXMgdGhlbiB3cml0dGVuLiAgQVxuc3BhY2UgaXMgd3JpdHRlbiBiZWZvcmUgZWFjaCBvYmplY3QgaXMgKGNvbnZlcnRlZCBhbmQpIHdyaXR0ZW4sIHVubGVzc1xudGhlIG91dHB1dCBzeXN0ZW0gYmVsaWV2ZXMgaXQgaXMgcG9zaXRpb25lZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGFcbmxpbmUuICBUaGlzIGlzIHRoZSBjYXNlICgxKSB3aGVuIG5vIGNoYXJhY3RlcnMgaGF2ZSB5ZXQgYmVlbiB3cml0dGVuXG50byBzdGFuZGFyZCBvdXRwdXQsICgyKSB3aGVuIHRoZSBsYXN0IGNoYXJhY3RlciB3cml0dGVuIHRvIHN0YW5kYXJkXG5vdXRwdXQgaXMgYSB3aGl0ZXNwYWNlIGNoYXJhY3RlciBleGNlcHQgYGBcJyBcJ2BgLCBvciAoMykgd2hlbiB0aGUgbGFzdFxud3JpdGUgb3BlcmF0aW9uIG9uIHN0YW5kYXJkIG91dHB1dCB3YXMgbm90IGEgYGBwcmludGBgIHN0YXRlbWVudC4gKEluXG5zb21lIGNhc2VzIGl0IG1heSBiZSBmdW5jdGlvbmFsIHRvIHdyaXRlIGFuIGVtcHR5IHN0cmluZyB0byBzdGFuZGFyZFxub3V0cHV0IGZvciB0aGlzIHJlYXNvbi4pXG5cbk5vdGU6IE9iamVjdHMgd2hpY2ggYWN0IGxpa2UgZmlsZSBvYmplY3RzIGJ1dCB3aGljaCBhcmUgbm90IHRoZSBidWlsdC1pblxuICBmaWxlIG9iamVjdHMgb2Z0ZW4gZG8gbm90IHByb3Blcmx5IGVtdWxhdGUgdGhpcyBhc3BlY3Qgb2YgdGhlIGZpbGVcbiAgb2JqZWN0XCdzIGJlaGF2aW9yLCBzbyBpdCBpcyBiZXN0IG5vdCB0byByZWx5IG9uIHRoaXMuXG5cbkEgYGBcJ1xcblwnYGAgY2hhcmFjdGVyIGlzIHdyaXR0ZW4gYXQgdGhlIGVuZCwgdW5sZXNzIHRoZSBgYHByaW50YGBcbnN0YXRlbWVudCBlbmRzIHdpdGggYSBjb21tYS4gIFRoaXMgaXMgdGhlIG9ubHkgYWN0aW9uIGlmIHRoZSBzdGF0ZW1lbnRcbmNvbnRhaW5zIGp1c3QgdGhlIGtleXdvcmQgYGBwcmludGBgLlxuXG5TdGFuZGFyZCBvdXRwdXQgaXMgZGVmaW5lZCBhcyB0aGUgZmlsZSBvYmplY3QgbmFtZWQgYGBzdGRvdXRgYCBpbiB0aGVcbmJ1aWx0LWluIG1vZHVsZSBgYHN5c2BgLiAgSWYgbm8gc3VjaCBvYmplY3QgZXhpc3RzLCBvciBpZiBpdCBkb2VzIG5vdFxuaGF2ZSBhIGBgd3JpdGUoKWBgIG1ldGhvZCwgYSBgYFJ1bnRpbWVFcnJvcmBgIGV4Y2VwdGlvbiBpcyByYWlzZWQuXG5cbmBgcHJpbnRgYCBhbHNvIGhhcyBhbiBleHRlbmRlZCBmb3JtLCBkZWZpbmVkIGJ5IHRoZSBzZWNvbmQgcG9ydGlvbiBvZlxudGhlIHN5bnRheCBkZXNjcmliZWQgYWJvdmUuIFRoaXMgZm9ybSBpcyBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXNcbiJgYHByaW50YGAgY2hldnJvbi4iIEluIHRoaXMgZm9ybSwgdGhlIGZpcnN0IGV4cHJlc3Npb24gYWZ0ZXIgdGhlXG5gYD4+YGAgbXVzdCBldmFsdWF0ZSB0byBhICJmaWxlLWxpa2UiIG9iamVjdCwgc3BlY2lmaWNhbGx5IGFuIG9iamVjdFxudGhhdCBoYXMgYSBgYHdyaXRlKClgYCBtZXRob2QgYXMgZGVzY3JpYmVkIGFib3ZlLiAgV2l0aCB0aGlzIGV4dGVuZGVkXG5mb3JtLCB0aGUgc3Vic2VxdWVudCBleHByZXNzaW9ucyBhcmUgcHJpbnRlZCB0byB0aGlzIGZpbGUgb2JqZWN0LiAgSWZcbnRoZSBmaXJzdCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBgYE5vbmVgYCwgdGhlbiBgYHN5cy5zdGRvdXRgYCBpc1xudXNlZCBhcyB0aGUgZmlsZSBmb3Igb3V0cHV0LlxuJywKLSAncmFpc2UnOiB1J1xuVGhlIGBgcmFpc2VgYCBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKioqXG5cbiAgIHJhaXNlX3N0bXQgOjo9ICJyYWlzZSIgW2V4cHJlc3Npb24gWyIsIiBleHByZXNzaW9uIFsiLCIgZXhwcmVzc2lvbl1dXVxuXG5JZiBubyBleHByZXNzaW9ucyBhcmUgcHJlc2VudCwgYGByYWlzZWBgIHJlLXJhaXNlcyB0aGUgbGFzdCBleGNlcHRpb25cbnRoYXQgd2FzIGFjdGl2ZSBpbiB0aGUgY3VycmVudCBzY29wZS4gIElmIG5vIGV4Y2VwdGlvbiBpcyBhY3RpdmUgaW5cbnRoZSBjdXJyZW50IHNjb3BlLCBhIGBgVHlwZUVycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZCBpbmRpY2F0aW5nIHRoYXRcbnRoaXMgaXMgYW4gZXJyb3IgKGlmIHJ1bm5pbmcgdW5kZXIgSURMRSwgYSBgYFF1ZXVlLkVtcHR5YGAgZXhjZXB0aW9uXG5pcyByYWlzZWQgaW5zdGVhZCkuXG5cbk90aGVyd2lzZSwgYGByYWlzZWBgIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbnMgdG8gZ2V0IHRocmVlIG9iamVjdHMsXG51c2luZyBgYE5vbmVgYCBhcyB0aGUgdmFsdWUgb2Ygb21pdHRlZCBleHByZXNzaW9ucy4gIFRoZSBmaXJzdCB0d29cbm9iamVjdHMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSAqdHlwZSogYW5kICp2YWx1ZSogb2YgdGhlIGV4Y2VwdGlvbi5cblxuSWYgdGhlIGZpcnN0IG9iamVjdCBpcyBhbiBpbnN0YW5jZSwgdGhlIHR5cGUgb2YgdGhlIGV4Y2VwdGlvbiBpcyB0aGVcbmNsYXNzIG9mIHRoZSBpbnN0YW5jZSwgdGhlIGluc3RhbmNlIGl0c2VsZiBpcyB0aGUgdmFsdWUsIGFuZCB0aGVcbnNlY29uZCBvYmplY3QgbXVzdCBiZSBgYE5vbmVgYC5cblxuSWYgdGhlIGZpcnN0IG9iamVjdCBpcyBhIGNsYXNzLCBpdCBiZWNvbWVzIHRoZSB0eXBlIG9mIHRoZSBleGNlcHRpb24uXG5UaGUgc2Vjb25kIG9iamVjdCBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgZXhjZXB0aW9uIHZhbHVlOiBJZiBpdCBpc1xuYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzLCB0aGUgaW5zdGFuY2UgYmVjb21lcyB0aGUgZXhjZXB0aW9uIHZhbHVlLiBJZlxudGhlIHNlY29uZCBvYmplY3QgaXMgYSB0dXBsZSwgaXQgaXMgdXNlZCBhcyB0aGUgYXJndW1lbnQgbGlzdCBmb3IgdGhlXG5jbGFzcyBjb25zdHJ1Y3RvcjsgaWYgaXQgaXMgYGBOb25lYGAsIGFuIGVtcHR5IGFyZ3VtZW50IGxpc3QgaXMgdXNlZCxcbmFuZCBhbnkgb3RoZXIgb2JqZWN0IGlzIHRyZWF0ZWQgYXMgYSBzaW5nbGUgYXJndW1lbnQgdG8gdGhlXG5jb25zdHJ1Y3Rvci4gIFRoZSBpbnN0YW5jZSBzbyBjcmVhdGVkIGJ5IGNhbGxpbmcgdGhlIGNvbnN0cnVjdG9yIGlzXG51c2VkIGFzIHRoZSBleGNlcHRpb24gdmFsdWUuXG5cbklmIGEgdGhpcmQgb2JqZWN0IGlzIHByZXNlbnQgYW5kIG5vdCBgYE5vbmVgYCwgaXQgbXVzdCBiZSBhIHRyYWNlYmFja1xub2JqZWN0IChzZWUgc2VjdGlvbiAqVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5KiksIGFuZCBpdCBpc1xuc3Vic3RpdHV0ZWQgaW5zdGVhZCBvZiB0aGUgY3VycmVudCBsb2NhdGlvbiBhcyB0aGUgcGxhY2Ugd2hlcmUgdGhlXG5leGNlcHRpb24gb2NjdXJyZWQuICBJZiB0aGUgdGhpcmQgb2JqZWN0IGlzIHByZXNlbnQgYW5kIG5vdCBhXG50cmFjZWJhY2sgb2JqZWN0IG9yIGBgTm9uZWBgLCBhIGBgVHlwZUVycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZC5cblRoZSB0aHJlZS1leHByZXNzaW9uIGZvcm0gb2YgYGByYWlzZWBgIGlzIHVzZWZ1bCB0byByZS1yYWlzZSBhblxuZXhjZXB0aW9uIHRyYW5zcGFyZW50bHkgaW4gYW4gZXhjZXB0IGNsYXVzZSwgYnV0IGBgcmFpc2VgYCB3aXRoIG5vXG5leHByZXNzaW9ucyBzaG91bGQgYmUgcHJlZmVycmVkIGlmIHRoZSBleGNlcHRpb24gdG8gYmUgcmUtcmFpc2VkIHdhc1xudGhlIG1vc3QgcmVjZW50bHkgYWN0aXZlIGV4Y2VwdGlvbiBpbiB0aGUgY3VycmVudCBzY29wZS5cblxuQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBleGNlcHRpb25zIGNhbiBiZSBmb3VuZCBpbiBzZWN0aW9uXG4qRXhjZXB0aW9ucyosIGFuZCBpbmZvcm1hdGlvbiBhYm91dCBoYW5kbGluZyBleGNlcHRpb25zIGlzIGluIHNlY3Rpb25cbipUaGUgdHJ5IHN0YXRlbWVudCouXG4nLAotICdyZXR1cm4nOiB1J1xuVGhlIGBgcmV0dXJuYGAgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKioqKipcblxuICAgcmV0dXJuX3N0bXQgOjo9ICJyZXR1cm4iIFtleHByZXNzaW9uX2xpc3RdXG5cbmBgcmV0dXJuYGAgbWF5IG9ubHkgb2NjdXIgc3ludGFjdGljYWxseSBuZXN0ZWQgaW4gYSBmdW5jdGlvblxuZGVmaW5pdGlvbiwgbm90IHdpdGhpbiBhIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9uLlxuXG5JZiBhbiBleHByZXNzaW9uIGxpc3QgaXMgcHJlc2VudCwgaXQgaXMgZXZhbHVhdGVkLCBlbHNlIGBgTm9uZWBgIGlzXG5zdWJzdGl0dXRlZC5cblxuYGByZXR1cm5gYCBsZWF2ZXMgdGhlIGN1cnJlbnQgZnVuY3Rpb24gY2FsbCB3aXRoIHRoZSBleHByZXNzaW9uIGxpc3RcbihvciBgYE5vbmVgYCkgYXMgcmV0dXJuIHZhbHVlLlxuXG5XaGVuIGBgcmV0dXJuYGAgcGFzc2VzIGNvbnRyb2wgb3V0IG9mIGEgYGB0cnlgYCBzdGF0ZW1lbnQgd2l0aCBhXG5gYGZpbmFsbHlgYCBjbGF1c2UsIHRoYXQgYGBmaW5hbGx5YGAgY2xhdXNlIGlzIGV4ZWN1dGVkIGJlZm9yZSByZWFsbHlcbmxlYXZpbmcgdGhlIGZ1bmN0aW9uLlxuXG5JbiBhIGdlbmVyYXRvciBmdW5jdGlvbiwgdGhlIGBgcmV0dXJuYGAgc3RhdGVtZW50IGlzIG5vdCBhbGxvd2VkIHRvXG5pbmNsdWRlIGFuICoqZXhwcmVzc2lvbl9saXN0KiouICBJbiB0aGF0IGNvbnRleHQsIGEgYmFyZSBgYHJldHVybmBgXG5pbmRpY2F0ZXMgdGhhdCB0aGUgZ2VuZXJhdG9yIGlzIGRvbmUgYW5kIHdpbGwgY2F1c2UgYGBTdG9wSXRlcmF0aW9uYGBcbnRvIGJlIHJhaXNlZC5cbicsCi0gJ3NlcXVlbmNlLW1ldGhvZHMnOiB1J1xuQWRkaXRpb25hbCBtZXRob2RzIGZvciBlbXVsYXRpb24gb2Ygc2VxdWVuY2UgdHlwZXNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cblRoZSBmb2xsb3dpbmcgb3B0aW9uYWwgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBmdXJ0aGVyIGVtdWxhdGVcbnNlcXVlbmNlIG9iamVjdHMuICBJbW11dGFibGUgc2VxdWVuY2VzIG1ldGhvZHMgc2hvdWxkIGF0IG1vc3Qgb25seVxuZGVmaW5lIGBgX19nZXRzbGljZV9fKClgYDsgbXV0YWJsZSBzZXF1ZW5jZXMgbWlnaHQgZGVmaW5lIGFsbCB0aHJlZVxubWV0aG9kcy5cblxub2JqZWN0Ll9fZ2V0c2xpY2VfXyhzZWxmLCBpLCBqKVxuXG4gICBEZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi4wOiBTdXBwb3J0IHNsaWNlIG9iamVjdHMgYXMgcGFyYW1ldGVyc1xuICAgdG8gdGhlIGBgX19nZXRpdGVtX18oKWBgIG1ldGhvZC4gKEhvd2V2ZXIsIGJ1aWx0LWluIHR5cGVzIGluXG4gICBDUHl0aG9uIGN1cnJlbnRseSBzdGlsbCBpbXBsZW1lbnQgYGBfX2dldHNsaWNlX18oKWBgLiAgVGhlcmVmb3JlLFxuICAgeW91IGhhdmUgdG8gb3ZlcnJpZGUgaXQgaW4gZGVyaXZlZCBjbGFzc2VzIHdoZW4gaW1wbGVtZW50aW5nXG4gICBzbGljaW5nLilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBldmFsdWF0aW9uIG9mIGBgc2VsZltpOmpdYGAuIFRoZSByZXR1cm5lZFxuICAgb2JqZWN0IHNob3VsZCBiZSBvZiB0aGUgc2FtZSB0eXBlIGFzICpzZWxmKi4gIE5vdGUgdGhhdCBtaXNzaW5nICppKlxuICAgb3IgKmoqIGluIHRoZSBzbGljZSBleHByZXNzaW9uIGFyZSByZXBsYWNlZCBieSB6ZXJvIG9yXG4gICBgYHN5cy5tYXhpbnRgYCwgcmVzcGVjdGl2ZWx5LiAgSWYgbmVnYXRpdmUgaW5kZXhlcyBhcmUgdXNlZCBpbiB0aGVcbiAgIHNsaWNlLCB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSBpcyBhZGRlZCB0byB0aGF0IGluZGV4LiBJZiB0aGVcbiAgIGluc3RhbmNlIGRvZXMgbm90IGltcGxlbWVudCB0aGUgYGBfX2xlbl9fKClgYCBtZXRob2QsIGFuXG4gICBgYEF0dHJpYnV0ZUVycm9yYGAgaXMgcmFpc2VkLiBObyBndWFyYW50ZWUgaXMgbWFkZSB0aGF0IGluZGV4ZXNcbiAgIGFkanVzdGVkIHRoaXMgd2F5IGFyZSBub3Qgc3RpbGwgbmVnYXRpdmUuICBJbmRleGVzIHdoaWNoIGFyZVxuICAgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlIGFyZSBub3QgbW9kaWZpZWQuIElmIG5vXG4gICBgYF9fZ2V0c2xpY2VfXygpYGAgaXMgZm91bmQsIGEgc2xpY2Ugb2JqZWN0IGlzIGNyZWF0ZWQgaW5zdGVhZCwgYW5kXG4gICBwYXNzZWQgdG8gYGBfX2dldGl0ZW1fXygpYGAgaW5zdGVhZC5cblxub2JqZWN0Ll9fc2V0c2xpY2VfXyhzZWxmLCBpLCBqLCBzZXF1ZW5jZSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBhc3NpZ25tZW50IHRvIGBgc2VsZltpOmpdYGAuIFNhbWUgbm90ZXMgZm9yICppKlxuICAgYW5kICpqKiBhcyBmb3IgYGBfX2dldHNsaWNlX18oKWBgLlxuXG4gICBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBJZiBubyBgYF9fc2V0c2xpY2VfXygpYGAgaXMgZm91bmQsIG9yXG4gICBmb3IgZXh0ZW5kZWQgc2xpY2luZyBvZiB0aGUgZm9ybSBgYHNlbGZbaTpqOmtdYGAsIGEgc2xpY2Ugb2JqZWN0IGlzXG4gICBjcmVhdGVkLCBhbmQgcGFzc2VkIHRvIGBgX19zZXRpdGVtX18oKWBgLCBpbnN0ZWFkIG9mXG4gICBgYF9fc2V0c2xpY2VfXygpYGAgYmVpbmcgY2FsbGVkLlxuXG5vYmplY3QuX19kZWxzbGljZV9fKHNlbGYsIGksIGopXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgZGVsZXRpb24gb2YgYGBzZWxmW2k6al1gYC4gU2FtZSBub3RlcyBmb3IgKmkqXG4gICBhbmQgKmoqIGFzIGZvciBgYF9fZ2V0c2xpY2VfXygpYGAuIFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIElmIG5vXG4gICBgYF9fZGVsc2xpY2VfXygpYGAgaXMgZm91bmQsIG9yIGZvciBleHRlbmRlZCBzbGljaW5nIG9mIHRoZSBmb3JtXG4gICBgYHNlbGZbaTpqOmtdYGAsIGEgc2xpY2Ugb2JqZWN0IGlzIGNyZWF0ZWQsIGFuZCBwYXNzZWQgdG9cbiAgIGBgX19kZWxpdGVtX18oKWBgLCBpbnN0ZWFkIG9mIGBgX19kZWxzbGljZV9fKClgYCBiZWluZyBjYWxsZWQuXG5cbk5vdGljZSB0aGF0IHRoZXNlIG1ldGhvZHMgYXJlIG9ubHkgaW52b2tlZCB3aGVuIGEgc2luZ2xlIHNsaWNlIHdpdGggYVxuc2luZ2xlIGNvbG9uIGlzIHVzZWQsIGFuZCB0aGUgc2xpY2UgbWV0aG9kIGlzIGF2YWlsYWJsZS4gIEZvciBzbGljZVxub3BlcmF0aW9ucyBpbnZvbHZpbmcgZXh0ZW5kZWQgc2xpY2Ugbm90YXRpb24sIG9yIGluIGFic2VuY2Ugb2YgdGhlXG5zbGljZSBtZXRob2RzLCBgYF9fZ2V0aXRlbV9fKClgYCwgYGBfX3NldGl0ZW1fXygpYGAgb3JcbmBgX19kZWxpdGVtX18oKWBgIGlzIGNhbGxlZCB3aXRoIGEgc2xpY2Ugb2JqZWN0IGFzIGFyZ3VtZW50LlxuXG5UaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVtb25zdHJhdGUgaG93IHRvIG1ha2UgeW91ciBwcm9ncmFtIG9yIG1vZHVsZVxuY29tcGF0aWJsZSB3aXRoIGVhcmxpZXIgdmVyc2lvbnMgb2YgUHl0aG9uIChhc3N1bWluZyB0aGF0IG1ldGhvZHNcbmBgX19nZXRpdGVtX18oKWBgLCBgYF9fc2V0aXRlbV9fKClgYCBhbmQgYGBfX2RlbGl0ZW1fXygpYGAgc3VwcG9ydFxuc2xpY2Ugb2JqZWN0cyBhcyBhcmd1bWVudHMpOlxuXG4gICBjbGFzcyBNeUNsYXNzOlxuICAgICAgIC4uLlxuICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6XG4gICAgICAgICAgIC4uLlxuICAgICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBpbmRleCwgdmFsdWUpOlxuICAgICAgICAgICAuLi5cbiAgICAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgaW5kZXgpOlxuICAgICAgICAgICAuLi5cblxuICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgMCk6XG4gICAgICAgICAgICMgVGhleSB3b25cJ3QgYmUgZGVmaW5lZCBpZiB2ZXJzaW9uIGlzIGF0IGxlYXN0IDIuMCBmaW5hbFxuXG4gICAgICAgICAgIGRlZiBfX2dldHNsaWNlX18oc2VsZiwgaSwgaik6XG4gICAgICAgICAgICAgICByZXR1cm4gc2VsZlttYXgoMCwgaSk6bWF4KDAsIGopOl1cbiAgICAgICAgICAgZGVmIF9fc2V0c2xpY2VfXyhzZWxmLCBpLCBqLCBzZXEpOlxuICAgICAgICAgICAgICAgc2VsZlttYXgoMCwgaSk6bWF4KDAsIGopOl0gPSBzZXFcbiAgICAgICAgICAgZGVmIF9fZGVsc2xpY2VfXyhzZWxmLCBpLCBqKTpcbiAgICAgICAgICAgICAgIGRlbCBzZWxmW21heCgwLCBpKTptYXgoMCwgaik6XVxuICAgICAgIC4uLlxuXG5Ob3RlIHRoZSBjYWxscyB0byBgYG1heCgpYGA7IHRoZXNlIGFyZSBuZWNlc3NhcnkgYmVjYXVzZSBvZiB0aGVcbmhhbmRsaW5nIG9mIG5lZ2F0aXZlIGluZGljZXMgYmVmb3JlIHRoZSBgYF9fKnNsaWNlX18oKWBgIG1ldGhvZHMgYXJlXG5jYWxsZWQuICBXaGVuIG5lZ2F0aXZlIGluZGV4ZXMgYXJlIHVzZWQsIHRoZSBgYF9fKml0ZW1fXygpYGAgbWV0aG9kc1xucmVjZWl2ZSB0aGVtIGFzIHByb3ZpZGVkLCBidXQgdGhlIGBgX18qc2xpY2VfXygpYGAgbWV0aG9kcyBnZXQgYVxuImNvb2tlZCIgZm9ybSBvZiB0aGUgaW5kZXggdmFsdWVzLiAgRm9yIGVhY2ggbmVnYXRpdmUgaW5kZXggdmFsdWUsIHRoZVxubGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSBpcyBhZGRlZCB0byB0aGUgaW5kZXggYmVmb3JlIGNhbGxpbmcgdGhlIG1ldGhvZFxuKHdoaWNoIG1heSBzdGlsbCByZXN1bHQgaW4gYSBuZWdhdGl2ZSBpbmRleCk7IHRoaXMgaXMgdGhlIGN1c3RvbWFyeVxuaGFuZGxpbmcgb2YgbmVnYXRpdmUgaW5kZXhlcyBieSB0aGUgYnVpbHQtaW4gc2VxdWVuY2UgdHlwZXMsIGFuZCB0aGVcbmBgX18qaXRlbV9fKClgYCBtZXRob2RzIGFyZSBleHBlY3RlZCB0byBkbyB0aGlzIGFzIHdlbGwuICBIb3dldmVyLFxuc2luY2UgdGhleSBzaG91bGQgYWxyZWFkeSBiZSBkb2luZyB0aGF0LCBuZWdhdGl2ZSBpbmRleGVzIGNhbm5vdCBiZVxucGFzc2VkIGluOyB0aGV5IG11c3QgYmUgY29uc3RyYWluZWQgdG8gdGhlIGJvdW5kcyBvZiB0aGUgc2VxdWVuY2VcbmJlZm9yZSBiZWluZyBwYXNzZWQgdG8gdGhlIGBgX18qaXRlbV9fKClgYCBtZXRob2RzLiBDYWxsaW5nIGBgbWF4KDAsXG5pKWBgIGNvbnZlbmllbnRseSByZXR1cm5zIHRoZSBwcm9wZXIgdmFsdWUuXG4nLAotICdzZXF1ZW5jZS10eXBlcyc6IHUiXG5FbXVsYXRpbmcgY29udGFpbmVyIHR5cGVzXG4qKioqKioqKioqKioqKioqKioqKioqKioqXG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBpbXBsZW1lbnQgY29udGFpbmVyIG9iamVjdHMuXG5Db250YWluZXJzIHVzdWFsbHkgYXJlIHNlcXVlbmNlcyAoc3VjaCBhcyBsaXN0cyBvciB0dXBsZXMpIG9yIG1hcHBpbmdzXG4obGlrZSBkaWN0aW9uYXJpZXMpLCBidXQgY2FuIHJlcHJlc2VudCBvdGhlciBjb250YWluZXJzIGFzIHdlbGwuICBUaGVcbmZpcnN0IHNldCBvZiBtZXRob2RzIGlzIHVzZWQgZWl0aGVyIHRvIGVtdWxhdGUgYSBzZXF1ZW5jZSBvciB0b1xuZW11bGF0ZSBhIG1hcHBpbmc7IHRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgZm9yIGEgc2VxdWVuY2UsIHRoZVxuYWxsb3dhYmxlIGtleXMgc2hvdWxkIGJlIHRoZSBpbnRlZ2VycyAqayogZm9yIHdoaWNoIGBgMCA8PSBrIDwgTmBgXG53aGVyZSAqTiogaXMgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UsIG9yIHNsaWNlIG9iamVjdHMsIHdoaWNoXG5kZWZpbmUgYSByYW5nZSBvZiBpdGVtcy4gKEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdGhlIG1ldGhvZFxuYGBfX2dldHNsaWNlX18oKWBgIChzZWUgYmVsb3cpIGNhbiBhbHNvIGJlIGRlZmluZWQgdG8gaGFuZGxlIHNpbXBsZSxcbmJ1dCBub3QgZXh0ZW5kZWQgc2xpY2VzLikgSXQgaXMgYWxzbyByZWNvbW1lbmRlZCB0aGF0IG1hcHBpbmdzIHByb3ZpZGVcbnRoZSBtZXRob2RzIGBga2V5cygpYGAsIGBgdmFsdWVzKClgYCwgYGBpdGVtcygpYGAsIGBgaGFzX2tleSgpYGAsXG5gYGdldCgpYGAsIGBgY2xlYXIoKWBgLCBgYHNldGRlZmF1bHQoKWBgLCBgYGl0ZXJrZXlzKClgYCxcbmBgaXRlcnZhbHVlcygpYGAsIGBgaXRlcml0ZW1zKClgYCwgYGBwb3AoKWBgLCBgYHBvcGl0ZW0oKWBgLFxuYGBjb3B5KClgYCwgYW5kIGBgdXBkYXRlKClgYCBiZWhhdmluZyBzaW1pbGFyIHRvIHRob3NlIGZvciBQeXRob24nc1xuc3RhbmRhcmQgZGljdGlvbmFyeSBvYmplY3RzLiAgVGhlIGBgVXNlckRpY3RgYCBtb2R1bGUgcHJvdmlkZXMgYVxuYGBEaWN0TWl4aW5gYCBjbGFzcyB0byBoZWxwIGNyZWF0ZSB0aG9zZSBtZXRob2RzIGZyb20gYSBiYXNlIHNldCBvZlxuYGBfX2dldGl0ZW1fXygpYGAsIGBgX19zZXRpdGVtX18oKWBgLCBgYF9fZGVsaXRlbV9fKClgYCwgYW5kXG5gYGtleXMoKWBgLiBNdXRhYmxlIHNlcXVlbmNlcyBzaG91bGQgcHJvdmlkZSBtZXRob2RzIGBgYXBwZW5kKClgYCxcbmBgY291bnQoKWBgLCBgYGluZGV4KClgYCwgYGBleHRlbmQoKWBgLCBgYGluc2VydCgpYGAsIGBgcG9wKClgYCxcbmBgcmVtb3ZlKClgYCwgYGByZXZlcnNlKClgYCBhbmQgYGBzb3J0KClgYCwgbGlrZSBQeXRob24gc3RhbmRhcmQgbGlzdFxub2JqZWN0cy4gIEZpbmFsbHksIHNlcXVlbmNlIHR5cGVzIHNob3VsZCBpbXBsZW1lbnQgYWRkaXRpb24gKG1lYW5pbmdcbmNvbmNhdGVuYXRpb24pIGFuZCBtdWx0aXBsaWNhdGlvbiAobWVhbmluZyByZXBldGl0aW9uKSBieSBkZWZpbmluZyB0aGVcbm1ldGhvZHMgYGBfX2FkZF9fKClgYCwgYGBfX3JhZGRfXygpYGAsIGBgX19pYWRkX18oKWBgLCBgYF9fbXVsX18oKWBgLFxuYGBfX3JtdWxfXygpYGAgYW5kIGBgX19pbXVsX18oKWBgIGRlc2NyaWJlZCBiZWxvdzsgdGhleSBzaG91bGQgbm90XG5kZWZpbmUgYGBfX2NvZXJjZV9fKClgYCBvciBvdGhlciBudW1lcmljYWwgb3BlcmF0b3JzLiAgSXQgaXNcbnJlY29tbWVuZGVkIHRoYXQgYm90aCBtYXBwaW5ncyBhbmQgc2VxdWVuY2VzIGltcGxlbWVudCB0aGVcbmBgX19jb250YWluc19fKClgYCBtZXRob2QgdG8gYWxsb3cgZWZmaWNpZW50IHVzZSBvZiB0aGUgYGBpbmBgXG5vcGVyYXRvcjsgZm9yIG1hcHBpbmdzLCBgYGluYGAgc2hvdWxkIGJlIGVxdWl2YWxlbnQgb2YgYGBoYXNfa2V5KClgYDtcbmZvciBzZXF1ZW5jZXMsIGl0IHNob3VsZCBzZWFyY2ggdGhyb3VnaCB0aGUgdmFsdWVzLiAgSXQgaXMgZnVydGhlclxucmVjb21tZW5kZWQgdGhhdCBib3RoIG1hcHBpbmdzIGFuZCBzZXF1ZW5jZXMgaW1wbGVtZW50IHRoZVxuYGBfX2l0ZXJfXygpYGAgbWV0aG9kIHRvIGFsbG93IGVmZmljaWVudCBpdGVyYXRpb24gdGhyb3VnaCB0aGVcbmNvbnRhaW5lcjsgZm9yIG1hcHBpbmdzLCBgYF9faXRlcl9fKClgYCBzaG91bGQgYmUgdGhlIHNhbWUgYXNcbmBgaXRlcmtleXMoKWBgOyBmb3Igc2VxdWVuY2VzLCBpdCBzaG91bGQgaXRlcmF0ZSB0aHJvdWdoIHRoZSB2YWx1ZXMuXG5cbm9iamVjdC5fX2xlbl9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGBgbGVuKClgYC4gIFNob3VsZCByZXR1cm5cbiAgIHRoZSBsZW5ndGggb2YgdGhlIG9iamVjdCwgYW4gaW50ZWdlciBgYD49YGAgMC4gIEFsc28sIGFuIG9iamVjdFxuICAgdGhhdCBkb2Vzbid0IGRlZmluZSBhIGBgX19ub256ZXJvX18oKWBgIG1ldGhvZCBhbmQgd2hvc2VcbiAgIGBgX19sZW5fXygpYGAgbWV0aG9kIHJldHVybnMgemVybyBpcyBjb25zaWRlcmVkIHRvIGJlIGZhbHNlIGluIGFcbiAgIEJvb2xlYW4gY29udGV4dC5cblxub2JqZWN0Ll9fZ2V0aXRlbV9fKHNlbGYsIGtleSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBldmFsdWF0aW9uIG9mIGBgc2VsZltrZXldYGAuIEZvciBzZXF1ZW5jZVxuICAgdHlwZXMsIHRoZSBhY2NlcHRlZCBrZXlzIHNob3VsZCBiZSBpbnRlZ2VycyBhbmQgc2xpY2Ugb2JqZWN0cy5cbiAgIE5vdGUgdGhhdCB0aGUgc3BlY2lhbCBpbnRlcnByZXRhdGlvbiBvZiBuZWdhdGl2ZSBpbmRleGVzIChpZiB0aGVcbiAgIGNsYXNzIHdpc2hlcyB0byBlbXVsYXRlIGEgc2VxdWVuY2UgdHlwZSkgaXMgdXAgdG8gdGhlXG4gICBgYF9fZ2V0aXRlbV9fKClgYCBtZXRob2QuIElmICprZXkqIGlzIG9mIGFuIGluYXBwcm9wcmlhdGUgdHlwZSxcbiAgIGBgVHlwZUVycm9yYGAgbWF5IGJlIHJhaXNlZDsgaWYgb2YgYSB2YWx1ZSBvdXRzaWRlIHRoZSBzZXQgb2ZcbiAgIGluZGV4ZXMgZm9yIHRoZSBzZXF1ZW5jZSAoYWZ0ZXIgYW55IHNwZWNpYWwgaW50ZXJwcmV0YXRpb24gb2ZcbiAgIG5lZ2F0aXZlIHZhbHVlcyksIGBgSW5kZXhFcnJvcmBgIHNob3VsZCBiZSByYWlzZWQuIEZvciBtYXBwaW5nXG4gICB0eXBlcywgaWYgKmtleSogaXMgbWlzc2luZyAobm90IGluIHRoZSBjb250YWluZXIpLCBgYEtleUVycm9yYGBcbiAgIHNob3VsZCBiZSByYWlzZWQuXG5cbiAgIE5vdGU6IGBgZm9yYGAgbG9vcHMgZXhwZWN0IHRoYXQgYW4gYGBJbmRleEVycm9yYGAgd2lsbCBiZSByYWlzZWQgZm9yXG4gICAgIGlsbGVnYWwgaW5kZXhlcyB0byBhbGxvdyBwcm9wZXIgZGV0ZWN0aW9uIG9mIHRoZSBlbmQgb2YgdGhlXG4gICAgIHNlcXVlbmNlLlxuXG5vYmplY3QuX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBhc3NpZ25tZW50IHRvIGBgc2VsZltrZXldYGAuICBTYW1lIG5vdGUgYXMgZm9yXG4gICBgYF9fZ2V0aXRlbV9fKClgYC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgZm9yIG1hcHBpbmdzIGlmXG4gICB0aGUgb2JqZWN0cyBzdXBwb3J0IGNoYW5nZXMgdG8gdGhlIHZhbHVlcyBmb3Iga2V5cywgb3IgaWYgbmV3IGtleXNcbiAgIGNhbiBiZSBhZGRlZCwgb3IgZm9yIHNlcXVlbmNlcyBpZiBlbGVtZW50cyBjYW4gYmUgcmVwbGFjZWQuICBUaGVcbiAgIHNhbWUgZXhjZXB0aW9ucyBzaG91bGQgYmUgcmFpc2VkIGZvciBpbXByb3BlciAqa2V5KiB2YWx1ZXMgYXMgZm9yXG4gICB0aGUgYGBfX2dldGl0ZW1fXygpYGAgbWV0aG9kLlxuXG5vYmplY3QuX19kZWxpdGVtX18oc2VsZiwga2V5KVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IGRlbGV0aW9uIG9mIGBgc2VsZltrZXldYGAuICBTYW1lIG5vdGUgYXMgZm9yXG4gICBgYF9fZ2V0aXRlbV9fKClgYC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgZm9yIG1hcHBpbmdzIGlmXG4gICB0aGUgb2JqZWN0cyBzdXBwb3J0IHJlbW92YWwgb2Yga2V5cywgb3IgZm9yIHNlcXVlbmNlcyBpZiBlbGVtZW50c1xuICAgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2VxdWVuY2UuICBUaGUgc2FtZSBleGNlcHRpb25zIHNob3VsZCBiZVxuICAgcmFpc2VkIGZvciBpbXByb3BlciAqa2V5KiB2YWx1ZXMgYXMgZm9yIHRoZSBgYF9fZ2V0aXRlbV9fKClgYFxuICAgbWV0aG9kLlxuXG5vYmplY3QuX19pdGVyX18oc2VsZilcblxuICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYW4gaXRlcmF0b3IgaXMgcmVxdWlyZWQgZm9yIGEgY29udGFpbmVyLlxuICAgVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBhIG5ldyBpdGVyYXRvciBvYmplY3QgdGhhdCBjYW4gaXRlcmF0ZVxuICAgb3ZlciBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIGNvbnRhaW5lci4gIEZvciBtYXBwaW5ncywgaXQgc2hvdWxkXG4gICBpdGVyYXRlIG92ZXIgdGhlIGtleXMgb2YgdGhlIGNvbnRhaW5lciwgYW5kIHNob3VsZCBhbHNvIGJlIG1hZGVcbiAgIGF2YWlsYWJsZSBhcyB0aGUgbWV0aG9kIGBgaXRlcmtleXMoKWBgLlxuXG4gICBJdGVyYXRvciBvYmplY3RzIGFsc28gbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2Q7IHRoZXkgYXJlXG4gICByZXF1aXJlZCB0byByZXR1cm4gdGhlbXNlbHZlcy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGl0ZXJhdG9yXG4gICBvYmplY3RzLCBzZWUgKkl0ZXJhdG9yIFR5cGVzKi5cblxub2JqZWN0Ll9fcmV2ZXJzZWRfXyhzZWxmKVxuXG4gICBDYWxsZWQgKGlmIHByZXNlbnQpIGJ5IHRoZSBgYHJldmVyc2VkKClgYCBidWlsdC1pbiB0byBpbXBsZW1lbnRcbiAgIHJldmVyc2UgaXRlcmF0aW9uLiAgSXQgc2hvdWxkIHJldHVybiBhIG5ldyBpdGVyYXRvciBvYmplY3QgdGhhdFxuICAgaXRlcmF0ZXMgb3ZlciBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIGNvbnRhaW5lciBpbiByZXZlcnNlIG9yZGVyLlxuXG4gICBJZiB0aGUgYGBfX3JldmVyc2VkX18oKWBgIG1ldGhvZCBpcyBub3QgcHJvdmlkZWQsIHRoZVxuICAgYGByZXZlcnNlZCgpYGAgYnVpbHQtaW4gd2lsbCBmYWxsIGJhY2sgdG8gdXNpbmcgdGhlIHNlcXVlbmNlXG4gICBwcm90b2NvbCAoYGBfX2xlbl9fKClgYCBhbmQgYGBfX2dldGl0ZW1fXygpYGApLiAgT2JqZWN0cyB0aGF0XG4gICBzdXBwb3J0IHRoZSBzZXF1ZW5jZSBwcm90b2NvbCBzaG91bGQgb25seSBwcm92aWRlXG4gICBgYF9fcmV2ZXJzZWRfXygpYGAgaWYgdGhleSBjYW4gcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzXG4gICBtb3JlIGVmZmljaWVudCB0aGFuIHRoZSBvbmUgcHJvdmlkZWQgYnkgYGByZXZlcnNlZCgpYGAuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDIuNi5cblxuVGhlIG1lbWJlcnNoaXAgdGVzdCBvcGVyYXRvcnMgKGBgaW5gYCBhbmQgYGBub3QgaW5gYCkgYXJlIG5vcm1hbGx5XG5pbXBsZW1lbnRlZCBhcyBhbiBpdGVyYXRpb24gdGhyb3VnaCBhIHNlcXVlbmNlLiAgSG93ZXZlciwgY29udGFpbmVyXG5vYmplY3RzIGNhbiBzdXBwbHkgdGhlIGZvbGxvd2luZyBzcGVjaWFsIG1ldGhvZCB3aXRoIGEgbW9yZSBlZmZpY2llbnRcbmltcGxlbWVudGF0aW9uLCB3aGljaCBhbHNvIGRvZXMgbm90IHJlcXVpcmUgdGhlIG9iamVjdCBiZSBhIHNlcXVlbmNlLlxuXG5vYmplY3QuX19jb250YWluc19fKHNlbGYsIGl0ZW0pXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgbWVtYmVyc2hpcCB0ZXN0IG9wZXJhdG9ycy4gIFNob3VsZCByZXR1cm4gdHJ1ZVxuICAgaWYgKml0ZW0qIGlzIGluICpzZWxmKiwgZmFsc2Ugb3RoZXJ3aXNlLiAgRm9yIG1hcHBpbmcgb2JqZWN0cywgdGhpc1xuICAgc2hvdWxkIGNvbnNpZGVyIHRoZSBrZXlzIG9mIHRoZSBtYXBwaW5nIHJhdGhlciB0aGFuIHRoZSB2YWx1ZXMgb3JcbiAgIHRoZSBrZXktaXRlbSBwYWlycy5cblxuICAgRm9yIG9iamVjdHMgdGhhdCBkb24ndCBkZWZpbmUgYGBfX2NvbnRhaW5zX18oKWBgLCB0aGUgbWVtYmVyc2hpcFxuICAgdGVzdCBmaXJzdCB0cmllcyBpdGVyYXRpb24gdmlhIGBgX19pdGVyX18oKWBgLCB0aGVuIHRoZSBvbGRcbiAgIHNlcXVlbmNlIGl0ZXJhdGlvbiBwcm90b2NvbCB2aWEgYGBfX2dldGl0ZW1fXygpYGAsIHNlZSAqdGhpc1xuICAgc2VjdGlvbiBpbiB0aGUgbGFuZ3VhZ2UgcmVmZXJlbmNlKi5cbiIsCi0gJ3NoaWZ0aW5nJzogdSdcblNoaWZ0aW5nIG9wZXJhdGlvbnNcbioqKioqKioqKioqKioqKioqKipcblxuVGhlIHNoaWZ0aW5nIG9wZXJhdGlvbnMgaGF2ZSBsb3dlciBwcmlvcml0eSB0aGFuIHRoZSBhcml0aG1ldGljXG5vcGVyYXRpb25zOlxuXG4gICBzaGlmdF9leHByIDo6PSBhX2V4cHIgfCBzaGlmdF9leHByICggIjw8IiB8ICI+PiIgKSBhX2V4cHJcblxuVGhlc2Ugb3BlcmF0b3JzIGFjY2VwdCBwbGFpbiBvciBsb25nIGludGVnZXJzIGFzIGFyZ3VtZW50cy4gIFRoZVxuYXJndW1lbnRzIGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS4gIFRoZXkgc2hpZnQgdGhlIGZpcnN0XG5hcmd1bWVudCB0byB0aGUgbGVmdCBvciByaWdodCBieSB0aGUgbnVtYmVyIG9mIGJpdHMgZ2l2ZW4gYnkgdGhlXG5zZWNvbmQgYXJndW1lbnQuXG5cbkEgcmlnaHQgc2hpZnQgYnkgKm4qIGJpdHMgaXMgZGVmaW5lZCBhcyBkaXZpc2lvbiBieSBgYHBvdygyLCBuKWBgLiAgQVxubGVmdCBzaGlmdCBieSAqbiogYml0cyBpcyBkZWZpbmVkIGFzIG11bHRpcGxpY2F0aW9uIHdpdGggYGBwb3coMixcbm4pYGAuICBOZWdhdGl2ZSBzaGlmdCBjb3VudHMgcmFpc2UgYSBgYFZhbHVlRXJyb3JgYCBleGNlcHRpb24uXG5cbk5vdGU6IEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCB0aGUgcmlnaHQtaGFuZCBvcGVyYW5kIGlzIHJlcXVpcmVkIHRvXG4gIGJlIGF0IG1vc3QgYGBzeXMubWF4c2l6ZWBgLiAgSWYgdGhlIHJpZ2h0LWhhbmQgb3BlcmFuZCBpcyBsYXJnZXJcbiAgdGhhbiBgYHN5cy5tYXhzaXplYGAgYW4gYGBPdmVyZmxvd0Vycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZC5cbicsCi0gJ3NsaWNpbmdzJzogdSdcblNsaWNpbmdzXG4qKioqKioqKlxuXG5BIHNsaWNpbmcgc2VsZWN0cyBhIHJhbmdlIG9mIGl0ZW1zIGluIGEgc2VxdWVuY2Ugb2JqZWN0IChlLmcuLCBhXG5zdHJpbmcsIHR1cGxlIG9yIGxpc3QpLiAgU2xpY2luZ3MgbWF5IGJlIHVzZWQgYXMgZXhwcmVzc2lvbnMgb3IgYXNcbnRhcmdldHMgaW4gYXNzaWdubWVudCBvciBgYGRlbGBgIHN0YXRlbWVudHMuICBUaGUgc3ludGF4IGZvciBhXG5zbGljaW5nOlxuXG4gICBzbGljaW5nICAgICAgICAgIDo6PSBzaW1wbGVfc2xpY2luZyB8IGV4dGVuZGVkX3NsaWNpbmdcbiAgIHNpbXBsZV9zbGljaW5nICAgOjo9IHByaW1hcnkgIlsiIHNob3J0X3NsaWNlICJdIlxuICAgZXh0ZW5kZWRfc2xpY2luZyA6Oj0gcHJpbWFyeSAiWyIgc2xpY2VfbGlzdCAiXSJcbiAgIHNsaWNlX2xpc3QgICAgICAgOjo9IHNsaWNlX2l0ZW0gKCIsIiBzbGljZV9pdGVtKSogWyIsIl1cbiAgIHNsaWNlX2l0ZW0gICAgICAgOjo9IGV4cHJlc3Npb24gfCBwcm9wZXJfc2xpY2UgfCBlbGxpcHNpc1xuICAgcHJvcGVyX3NsaWNlICAgICA6Oj0gc2hvcnRfc2xpY2UgfCBsb25nX3NsaWNlXG4gICBzaG9ydF9zbGljZSAgICAgIDo6PSBbbG93ZXJfYm91bmRdICI6IiBbdXBwZXJfYm91bmRdXG4gICBsb25nX3NsaWNlICAgICAgIDo6PSBzaG9ydF9zbGljZSAiOiIgW3N0cmlkZV1cbiAgIGxvd2VyX2JvdW5kICAgICAgOjo9IGV4cHJlc3Npb25cbiAgIHVwcGVyX2JvdW5kICAgICAgOjo9IGV4cHJlc3Npb25cbiAgIHN0cmlkZSAgICAgICAgICAgOjo9IGV4cHJlc3Npb25cbiAgIGVsbGlwc2lzICAgICAgICAgOjo9ICIuLi4iXG5cblRoZXJlIGlzIGFtYmlndWl0eSBpbiB0aGUgZm9ybWFsIHN5bnRheCBoZXJlOiBhbnl0aGluZyB0aGF0IGxvb2tzIGxpa2VcbmFuIGV4cHJlc3Npb24gbGlzdCBhbHNvIGxvb2tzIGxpa2UgYSBzbGljZSBsaXN0LCBzbyBhbnkgc3Vic2NyaXB0aW9uXG5jYW4gYmUgaW50ZXJwcmV0ZWQgYXMgYSBzbGljaW5nLiAgUmF0aGVyIHRoYW4gZnVydGhlciBjb21wbGljYXRpbmcgdGhlXG5zeW50YXgsIHRoaXMgaXMgZGlzYW1iaWd1YXRlZCBieSBkZWZpbmluZyB0aGF0IGluIHRoaXMgY2FzZSB0aGVcbmludGVycHJldGF0aW9uIGFzIGEgc3Vic2NyaXB0aW9uIHRha2VzIHByaW9yaXR5IG92ZXIgdGhlXG5pbnRlcnByZXRhdGlvbiBhcyBhIHNsaWNpbmcgKHRoaXMgaXMgdGhlIGNhc2UgaWYgdGhlIHNsaWNlIGxpc3RcbmNvbnRhaW5zIG5vIHByb3BlciBzbGljZSBub3IgZWxsaXBzZXMpLiAgU2ltaWxhcmx5LCB3aGVuIHRoZSBzbGljZVxubGlzdCBoYXMgZXhhY3RseSBvbmUgc2hvcnQgc2xpY2UgYW5kIG5vIHRyYWlsaW5nIGNvbW1hLCB0aGVcbmludGVycHJldGF0aW9uIGFzIGEgc2ltcGxlIHNsaWNpbmcgdGFrZXMgcHJpb3JpdHkgb3ZlciB0aGF0IGFzIGFuXG5leHRlbmRlZCBzbGljaW5nLlxuXG5UaGUgc2VtYW50aWNzIGZvciBhIHNpbXBsZSBzbGljaW5nIGFyZSBhcyBmb2xsb3dzLiAgVGhlIHByaW1hcnkgbXVzdFxuZXZhbHVhdGUgdG8gYSBzZXF1ZW5jZSBvYmplY3QuICBUaGUgbG93ZXIgYW5kIHVwcGVyIGJvdW5kIGV4cHJlc3Npb25zLFxuaWYgcHJlc2VudCwgbXVzdCBldmFsdWF0ZSB0byBwbGFpbiBpbnRlZ2VyczsgZGVmYXVsdHMgYXJlIHplcm8gYW5kIHRoZVxuYGBzeXMubWF4aW50YGAsIHJlc3BlY3RpdmVseS4gIElmIGVpdGhlciBib3VuZCBpcyBuZWdhdGl2ZSwgdGhlXG5zZXF1ZW5jZVwncyBsZW5ndGggaXMgYWRkZWQgdG8gaXQuICBUaGUgc2xpY2luZyBub3cgc2VsZWN0cyBhbGwgaXRlbXNcbndpdGggaW5kZXggKmsqIHN1Y2ggdGhhdCBgYGkgPD0gayA8IGpgYCB3aGVyZSAqaSogYW5kICpqKiBhcmUgdGhlXG5zcGVjaWZpZWQgbG93ZXIgYW5kIHVwcGVyIGJvdW5kcy4gIFRoaXMgbWF5IGJlIGFuIGVtcHR5IHNlcXVlbmNlLiAgSXRcbmlzIG5vdCBhbiBlcnJvciBpZiAqaSogb3IgKmoqIGxpZSBvdXRzaWRlIHRoZSByYW5nZSBvZiB2YWxpZCBpbmRleGVzXG4oc3VjaCBpdGVtcyBkb25cJ3QgZXhpc3Qgc28gdGhleSBhcmVuXCd0IHNlbGVjdGVkKS5cblxuVGhlIHNlbWFudGljcyBmb3IgYW4gZXh0ZW5kZWQgc2xpY2luZyBhcmUgYXMgZm9sbG93cy4gIFRoZSBwcmltYXJ5XG5tdXN0IGV2YWx1YXRlIHRvIGEgbWFwcGluZyBvYmplY3QsIGFuZCBpdCBpcyBpbmRleGVkIHdpdGggYSBrZXkgdGhhdFxuaXMgY29uc3RydWN0ZWQgZnJvbSB0aGUgc2xpY2UgbGlzdCwgYXMgZm9sbG93cy4gIElmIHRoZSBzbGljZSBsaXN0XG5jb250YWlucyBhdCBsZWFzdCBvbmUgY29tbWEsIHRoZSBrZXkgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZVxuY29udmVyc2lvbiBvZiB0aGUgc2xpY2UgaXRlbXM7IG90aGVyd2lzZSwgdGhlIGNvbnZlcnNpb24gb2YgdGhlIGxvbmVcbnNsaWNlIGl0ZW0gaXMgdGhlIGtleS4gIFRoZSBjb252ZXJzaW9uIG9mIGEgc2xpY2UgaXRlbSB0aGF0IGlzIGFuXG5leHByZXNzaW9uIGlzIHRoYXQgZXhwcmVzc2lvbi4gIFRoZSBjb252ZXJzaW9uIG9mIGFuIGVsbGlwc2lzIHNsaWNlXG5pdGVtIGlzIHRoZSBidWlsdC1pbiBgYEVsbGlwc2lzYGAgb2JqZWN0LiAgVGhlIGNvbnZlcnNpb24gb2YgYSBwcm9wZXJcbnNsaWNlIGlzIGEgc2xpY2Ugb2JqZWN0IChzZWUgc2VjdGlvbiAqVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5Kilcbndob3NlIGBgc3RhcnRgYCwgYGBzdG9wYGAgYW5kIGBgc3RlcGBgIGF0dHJpYnV0ZXMgYXJlIHRoZSB2YWx1ZXMgb2ZcbnRoZSBleHByZXNzaW9ucyBnaXZlbiBhcyBsb3dlciBib3VuZCwgdXBwZXIgYm91bmQgYW5kIHN0cmlkZSxcbnJlc3BlY3RpdmVseSwgc3Vic3RpdHV0aW5nIGBgTm9uZWBgIGZvciBtaXNzaW5nIGV4cHJlc3Npb25zLlxuJywKLSAnc3BlY2lhbGF0dHJzJzogdSJcblNwZWNpYWwgQXR0cmlidXRlc1xuKioqKioqKioqKioqKioqKioqXG5cblRoZSBpbXBsZW1lbnRhdGlvbiBhZGRzIGEgZmV3IHNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXMgdG8gc2V2ZXJhbFxub2JqZWN0IHR5cGVzLCB3aGVyZSB0aGV5IGFyZSByZWxldmFudC4gIFNvbWUgb2YgdGhlc2UgYXJlIG5vdCByZXBvcnRlZFxuYnkgdGhlIGBgZGlyKClgYCBidWlsdC1pbiBmdW5jdGlvbi5cblxub2JqZWN0Ll9fZGljdF9fXG5cbiAgIEEgZGljdGlvbmFyeSBvciBvdGhlciBtYXBwaW5nIG9iamVjdCB1c2VkIHRvIHN0b3JlIGFuIG9iamVjdCdzXG4gICAod3JpdGFibGUpIGF0dHJpYnV0ZXMuXG5cbm9iamVjdC5fX21ldGhvZHNfX1xuXG4gICBEZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi4yOiBVc2UgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGBgZGlyKClgYFxuICAgdG8gZ2V0IGEgbGlzdCBvZiBhbiBvYmplY3QncyBhdHRyaWJ1dGVzLiBUaGlzIGF0dHJpYnV0ZSBpcyBub1xuICAgbG9uZ2VyIGF2YWlsYWJsZS5cblxub2JqZWN0Ll9fbWVtYmVyc19fXG5cbiAgIERlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjI6IFVzZSB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gYGBkaXIoKWBgXG4gICB0byBnZXQgYSBsaXN0IG9mIGFuIG9iamVjdCdzIGF0dHJpYnV0ZXMuIFRoaXMgYXR0cmlidXRlIGlzIG5vXG4gICBsb25nZXIgYXZhaWxhYmxlLlxuXG5pbnN0YW5jZS5fX2NsYXNzX19cblxuICAgVGhlIGNsYXNzIHRvIHdoaWNoIGEgY2xhc3MgaW5zdGFuY2UgYmVsb25ncy5cblxuY2xhc3MuX19iYXNlc19fXG5cbiAgIFRoZSB0dXBsZSBvZiBiYXNlIGNsYXNzZXMgb2YgYSBjbGFzcyBvYmplY3QuXG5cbmNsYXNzLl9fbmFtZV9fXG5cbiAgIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyBvciB0eXBlLlxuXG5UaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIG9ubHkgc3VwcG9ydGVkIGJ5ICpuZXctc3R5bGUgY2xhc3MqZXMuXG5cbmNsYXNzLl9fbXJvX19cblxuICAgVGhpcyBhdHRyaWJ1dGUgaXMgYSB0dXBsZSBvZiBjbGFzc2VzIHRoYXQgYXJlIGNvbnNpZGVyZWQgd2hlblxuICAgbG9va2luZyBmb3IgYmFzZSBjbGFzc2VzIGR1cmluZyBtZXRob2QgcmVzb2x1dGlvbi5cblxuY2xhc3MubXJvKClcblxuICAgVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBtZXRhY2xhc3MgdG8gY3VzdG9taXplIHRoZVxuICAgbWV0aG9kIHJlc29sdXRpb24gb3JkZXIgZm9yIGl0cyBpbnN0YW5jZXMuICBJdCBpcyBjYWxsZWQgYXQgY2xhc3NcbiAgIGluc3RhbnRpYXRpb24sIGFuZCBpdHMgcmVzdWx0IGlzIHN0b3JlZCBpbiBgYF9fbXJvX19gYC5cblxuY2xhc3MuX19zdWJjbGFzc2VzX18oKVxuXG4gICBFYWNoIG5ldy1zdHlsZSBjbGFzcyBrZWVwcyBhIGxpc3Qgb2Ygd2VhayByZWZlcmVuY2VzIHRvIGl0c1xuICAgaW1tZWRpYXRlIHN1YmNsYXNzZXMuICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhvc2VcbiAgIHJlZmVyZW5jZXMgc3RpbGwgYWxpdmUuIEV4YW1wbGU6XG5cbiAgICAgID4+PiBpbnQuX19zdWJjbGFzc2VzX18oKVxuICAgICAgWzx0eXBlICdib29sJz5dXG5cbi1bIEZvb3Rub3RlcyBdLVxuXG5bMV0gQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGVzZSBzcGVjaWFsIG1ldGhvZHMgbWF5IGJlIGZvdW5kIGluXG4gICAgdGhlIFB5dGhvbiBSZWZlcmVuY2UgTWFudWFsICgqQmFzaWMgY3VzdG9taXphdGlvbiopLlxuXG5bMl0gQXMgYSBjb25zZXF1ZW5jZSwgdGhlIGxpc3QgYGBbMSwgMl1gYCBpcyBjb25zaWRlcmVkIGVxdWFsIHRvXG4gICAgYGBbMS4wLCAyLjBdYGAsIGFuZCBzaW1pbGFybHkgZm9yIHR1cGxlcy5cblxuWzNdIFRoZXkgbXVzdCBoYXZlIHNpbmNlIHRoZSBwYXJzZXIgY2FuJ3QgdGVsbCB0aGUgdHlwZSBvZiB0aGVcbiAgICBvcGVyYW5kcy5cblxuWzRdIFRvIGZvcm1hdCBvbmx5IGEgdHVwbGUgeW91IHNob3VsZCB0aGVyZWZvcmUgcHJvdmlkZSBhIHNpbmdsZXRvblxuICAgIHR1cGxlIHdob3NlIG9ubHkgZWxlbWVudCBpcyB0aGUgdHVwbGUgdG8gYmUgZm9ybWF0dGVkLlxuXG5bNV0gVGhlIGFkdmFudGFnZSBvZiBsZWF2aW5nIHRoZSBuZXdsaW5lIG9uIGlzIHRoYXQgcmV0dXJuaW5nIGFuIGVtcHR5XG4gICAgc3RyaW5nIGlzIHRoZW4gYW4gdW5hbWJpZ3VvdXMgRU9GIGluZGljYXRpb24uICBJdCBpcyBhbHNvIHBvc3NpYmxlXG4gICAgKGluIGNhc2VzIHdoZXJlIGl0IG1pZ2h0IG1hdHRlciwgZm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIG1ha2VcbiAgICBhbiBleGFjdCBjb3B5IG9mIGEgZmlsZSB3aGlsZSBzY2FubmluZyBpdHMgbGluZXMpIHRvIHRlbGwgd2hldGhlclxuICAgIHRoZSBsYXN0IGxpbmUgb2YgYSBmaWxlIGVuZGVkIGluIGEgbmV3bGluZSBvciBub3QgKHllcyB0aGlzXG4gICAgaGFwcGVucyEpLlxuIiwKLSAnc3BlY2lhbG5hbWVzJzogdSdcblNwZWNpYWwgbWV0aG9kIG5hbWVzXG4qKioqKioqKioqKioqKioqKioqKlxuXG5BIGNsYXNzIGNhbiBpbXBsZW1lbnQgY2VydGFpbiBvcGVyYXRpb25zIHRoYXQgYXJlIGludm9rZWQgYnkgc3BlY2lhbFxuc3ludGF4IChzdWNoIGFzIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBvciBzdWJzY3JpcHRpbmcgYW5kIHNsaWNpbmcpIGJ5XG5kZWZpbmluZyBtZXRob2RzIHdpdGggc3BlY2lhbCBuYW1lcy4gVGhpcyBpcyBQeXRob25cJ3MgYXBwcm9hY2ggdG9cbipvcGVyYXRvciBvdmVybG9hZGluZyosIGFsbG93aW5nIGNsYXNzZXMgdG8gZGVmaW5lIHRoZWlyIG93biBiZWhhdmlvclxud2l0aCByZXNwZWN0IHRvIGxhbmd1YWdlIG9wZXJhdG9ycy4gIEZvciBpbnN0YW5jZSwgaWYgYSBjbGFzcyBkZWZpbmVzXG5hIG1ldGhvZCBuYW1lZCBgYF9fZ2V0aXRlbV9fKClgYCwgYW5kIGBgeGBgIGlzIGFuIGluc3RhbmNlIG9mIHRoaXNcbmNsYXNzLCB0aGVuIGBgeFtpXWBgIGlzIHJvdWdobHkgZXF1aXZhbGVudCB0byBgYHguX19nZXRpdGVtX18oaSlgYCBmb3Jcbm9sZC1zdHlsZSBjbGFzc2VzIGFuZCBgYHR5cGUoeCkuX19nZXRpdGVtX18oeCwgaSlgYCBmb3IgbmV3LXN0eWxlXG5jbGFzc2VzLiAgRXhjZXB0IHdoZXJlIG1lbnRpb25lZCwgYXR0ZW1wdHMgdG8gZXhlY3V0ZSBhbiBvcGVyYXRpb25cbnJhaXNlIGFuIGV4Y2VwdGlvbiB3aGVuIG5vIGFwcHJvcHJpYXRlIG1ldGhvZCBpcyBkZWZpbmVkICh0eXBpY2FsbHlcbmBgQXR0cmlidXRlRXJyb3JgYCBvciBgYFR5cGVFcnJvcmBgKS5cblxuV2hlbiBpbXBsZW1lbnRpbmcgYSBjbGFzcyB0aGF0IGVtdWxhdGVzIGFueSBidWlsdC1pbiB0eXBlLCBpdCBpc1xuaW1wb3J0YW50IHRoYXQgdGhlIGVtdWxhdGlvbiBvbmx5IGJlIGltcGxlbWVudGVkIHRvIHRoZSBkZWdyZWUgdGhhdCBpdFxubWFrZXMgc2Vuc2UgZm9yIHRoZSBvYmplY3QgYmVpbmcgbW9kZWxsZWQuICBGb3IgZXhhbXBsZSwgc29tZVxuc2VxdWVuY2VzIG1heSB3b3JrIHdlbGwgd2l0aCByZXRyaWV2YWwgb2YgaW5kaXZpZHVhbCBlbGVtZW50cywgYnV0XG5leHRyYWN0aW5nIGEgc2xpY2UgbWF5IG5vdCBtYWtlIHNlbnNlLiAgKE9uZSBleGFtcGxlIG9mIHRoaXMgaXMgdGhlXG5gYE5vZGVMaXN0YGAgaW50ZXJmYWNlIGluIHRoZSBXM0NcJ3MgRG9jdW1lbnQgT2JqZWN0IE1vZGVsLilcblxuXG5CYXNpYyBjdXN0b21pemF0aW9uXG49PT09PT09PT09PT09PT09PT09XG5cbm9iamVjdC5fX25ld19fKGNsc1ssIC4uLl0pXG5cbiAgIENhbGxlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgY2xhc3MgKmNscyouICBgYF9fbmV3X18oKWBgIGlzIGFcbiAgIHN0YXRpYyBtZXRob2QgKHNwZWNpYWwtY2FzZWQgc28geW91IG5lZWQgbm90IGRlY2xhcmUgaXQgYXMgc3VjaClcbiAgIHRoYXQgdGFrZXMgdGhlIGNsYXNzIG9mIHdoaWNoIGFuIGluc3RhbmNlIHdhcyByZXF1ZXN0ZWQgYXMgaXRzXG4gICBmaXJzdCBhcmd1bWVudC4gIFRoZSByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aG9zZSBwYXNzZWQgdG8gdGhlXG4gICBvYmplY3QgY29uc3RydWN0b3IgZXhwcmVzc2lvbiAodGhlIGNhbGwgdG8gdGhlIGNsYXNzKS4gIFRoZSByZXR1cm5cbiAgIHZhbHVlIG9mIGBgX19uZXdfXygpYGAgc2hvdWxkIGJlIHRoZSBuZXcgb2JqZWN0IGluc3RhbmNlICh1c3VhbGx5XG4gICBhbiBpbnN0YW5jZSBvZiAqY2xzKikuXG5cbiAgIFR5cGljYWwgaW1wbGVtZW50YXRpb25zIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgYnlcbiAgIGludm9raW5nIHRoZSBzdXBlcmNsYXNzXCdzIGBgX19uZXdfXygpYGAgbWV0aG9kIHVzaW5nXG4gICBgYHN1cGVyKGN1cnJlbnRjbGFzcywgY2xzKS5fX25ld19fKGNsc1ssIC4uLl0pYGAgd2l0aCBhcHByb3ByaWF0ZVxuICAgYXJndW1lbnRzIGFuZCB0aGVuIG1vZGlmeWluZyB0aGUgbmV3bHktY3JlYXRlZCBpbnN0YW5jZSBhc1xuICAgbmVjZXNzYXJ5IGJlZm9yZSByZXR1cm5pbmcgaXQuXG5cbiAgIElmIGBgX19uZXdfXygpYGAgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiAqY2xzKiwgdGhlbiB0aGUgbmV3XG4gICBpbnN0YW5jZVwncyBgYF9faW5pdF9fKClgYCBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIGxpa2VcbiAgIGBgX19pbml0X18oc2VsZlssIC4uLl0pYGAsIHdoZXJlICpzZWxmKiBpcyB0aGUgbmV3IGluc3RhbmNlIGFuZCB0aGVcbiAgIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIHdlcmUgcGFzc2VkIHRvIGBgX19uZXdfXygpYGAuXG5cbiAgIElmIGBgX19uZXdfXygpYGAgZG9lcyBub3QgcmV0dXJuIGFuIGluc3RhbmNlIG9mICpjbHMqLCB0aGVuIHRoZSBuZXdcbiAgIGluc3RhbmNlXCdzIGBgX19pbml0X18oKWBgIG1ldGhvZCB3aWxsIG5vdCBiZSBpbnZva2VkLlxuXG4gICBgYF9fbmV3X18oKWBgIGlzIGludGVuZGVkIG1haW5seSB0byBhbGxvdyBzdWJjbGFzc2VzIG9mIGltbXV0YWJsZVxuICAgdHlwZXMgKGxpa2UgaW50LCBzdHIsIG9yIHR1cGxlKSB0byBjdXN0b21pemUgaW5zdGFuY2UgY3JlYXRpb24uICBJdFxuICAgaXMgYWxzbyBjb21tb25seSBvdmVycmlkZGVuIGluIGN1c3RvbSBtZXRhY2xhc3NlcyBpbiBvcmRlciB0b1xuICAgY3VzdG9taXplIGNsYXNzIGNyZWF0aW9uLlxuXG5vYmplY3QuX19pbml0X18oc2VsZlssIC4uLl0pXG5cbiAgIENhbGxlZCB3aGVuIHRoZSBpbnN0YW5jZSBpcyBjcmVhdGVkLiAgVGhlIGFyZ3VtZW50cyBhcmUgdGhvc2VcbiAgIHBhc3NlZCB0byB0aGUgY2xhc3MgY29uc3RydWN0b3IgZXhwcmVzc2lvbi4gIElmIGEgYmFzZSBjbGFzcyBoYXMgYW5cbiAgIGBgX19pbml0X18oKWBgIG1ldGhvZCwgdGhlIGRlcml2ZWQgY2xhc3NcJ3MgYGBfX2luaXRfXygpYGAgbWV0aG9kLFxuICAgaWYgYW55LCBtdXN0IGV4cGxpY2l0bHkgY2FsbCBpdCB0byBlbnN1cmUgcHJvcGVyIGluaXRpYWxpemF0aW9uIG9mXG4gICB0aGUgYmFzZSBjbGFzcyBwYXJ0IG9mIHRoZSBpbnN0YW5jZTsgZm9yIGV4YW1wbGU6XG4gICBgYEJhc2VDbGFzcy5fX2luaXRfXyhzZWxmLCBbYXJncy4uLl0pYGAuICBBcyBhIHNwZWNpYWwgY29uc3RyYWludFxuICAgb24gY29uc3RydWN0b3JzLCBubyB2YWx1ZSBtYXkgYmUgcmV0dXJuZWQ7IGRvaW5nIHNvIHdpbGwgY2F1c2UgYVxuICAgYGBUeXBlRXJyb3JgYCB0byBiZSByYWlzZWQgYXQgcnVudGltZS5cblxub2JqZWN0Ll9fZGVsX18oc2VsZilcblxuICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZC4gIFRoaXMgaXMgYWxzb1xuICAgY2FsbGVkIGEgZGVzdHJ1Y3Rvci4gIElmIGEgYmFzZSBjbGFzcyBoYXMgYSBgYF9fZGVsX18oKWBgIG1ldGhvZCxcbiAgIHRoZSBkZXJpdmVkIGNsYXNzXCdzIGBgX19kZWxfXygpYGAgbWV0aG9kLCBpZiBhbnksIG11c3QgZXhwbGljaXRseVxuICAgY2FsbCBpdCB0byBlbnN1cmUgcHJvcGVyIGRlbGV0aW9uIG9mIHRoZSBiYXNlIGNsYXNzIHBhcnQgb2YgdGhlXG4gICBpbnN0YW5jZS4gIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSAodGhvdWdoIG5vdCByZWNvbW1lbmRlZCEpIGZvclxuICAgdGhlIGBgX19kZWxfXygpYGAgbWV0aG9kIHRvIHBvc3Rwb25lIGRlc3RydWN0aW9uIG9mIHRoZSBpbnN0YW5jZSBieVxuICAgY3JlYXRpbmcgYSBuZXcgcmVmZXJlbmNlIHRvIGl0LiAgSXQgbWF5IHRoZW4gYmUgY2FsbGVkIGF0IGEgbGF0ZXJcbiAgIHRpbWUgd2hlbiB0aGlzIG5ldyByZWZlcmVuY2UgaXMgZGVsZXRlZC4gIEl0IGlzIG5vdCBndWFyYW50ZWVkIHRoYXRcbiAgIGBgX19kZWxfXygpYGAgbWV0aG9kcyBhcmUgY2FsbGVkIGZvciBvYmplY3RzIHRoYXQgc3RpbGwgZXhpc3Qgd2hlblxuICAgdGhlIGludGVycHJldGVyIGV4aXRzLlxuXG4gICBOb3RlOiBgYGRlbCB4YGAgZG9lc25cJ3QgZGlyZWN0bHkgY2FsbCBgYHguX19kZWxfXygpYGAgLS0tIHRoZSBmb3JtZXJcbiAgICAgZGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IGZvciBgYHhgYCBieSBvbmUsIGFuZCB0aGUgbGF0dGVyXG4gICAgIGlzIG9ubHkgY2FsbGVkIHdoZW4gYGB4YGBcJ3MgcmVmZXJlbmNlIGNvdW50IHJlYWNoZXMgemVyby4gIFNvbWVcbiAgICAgY29tbW9uIHNpdHVhdGlvbnMgdGhhdCBtYXkgcHJldmVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGFuXG4gICAgIG9iamVjdCBmcm9tIGdvaW5nIHRvIHplcm8gaW5jbHVkZTogY2lyY3VsYXIgcmVmZXJlbmNlcyBiZXR3ZWVuXG4gICAgIG9iamVjdHMgKGUuZy4sIGEgZG91Ymx5LWxpbmtlZCBsaXN0IG9yIGEgdHJlZSBkYXRhIHN0cnVjdHVyZSB3aXRoXG4gICAgIHBhcmVudCBhbmQgY2hpbGQgcG9pbnRlcnMpOyBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IG9uIHRoZVxuICAgICBzdGFjayBmcmFtZSBvZiBhIGZ1bmN0aW9uIHRoYXQgY2F1Z2h0IGFuIGV4Y2VwdGlvbiAodGhlIHRyYWNlYmFja1xuICAgICBzdG9yZWQgaW4gYGBzeXMuZXhjX3RyYWNlYmFja2BgIGtlZXBzIHRoZSBzdGFjayBmcmFtZSBhbGl2ZSk7IG9yXG4gICAgIGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3Qgb24gdGhlIHN0YWNrIGZyYW1lIHRoYXQgcmFpc2VkIGFuXG4gICAgIHVuaGFuZGxlZCBleGNlcHRpb24gaW4gaW50ZXJhY3RpdmUgbW9kZSAodGhlIHRyYWNlYmFjayBzdG9yZWQgaW5cbiAgICAgYGBzeXMubGFzdF90cmFjZWJhY2tgYCBrZWVwcyB0aGUgc3RhY2sgZnJhbWUgYWxpdmUpLiAgVGhlIGZpcnN0XG4gICAgIHNpdHVhdGlvbiBjYW4gb25seSBiZSByZW1lZGllZCBieSBleHBsaWNpdGx5IGJyZWFraW5nIHRoZSBjeWNsZXM7XG4gICAgIHRoZSBsYXR0ZXIgdHdvIHNpdHVhdGlvbnMgY2FuIGJlIHJlc29sdmVkIGJ5IHN0b3JpbmcgYGBOb25lYGAgaW5cbiAgICAgYGBzeXMuZXhjX3RyYWNlYmFja2BgIG9yIGBgc3lzLmxhc3RfdHJhY2ViYWNrYGAuICBDaXJjdWxhclxuICAgICByZWZlcmVuY2VzIHdoaWNoIGFyZSBnYXJiYWdlIGFyZSBkZXRlY3RlZCB3aGVuIHRoZSBvcHRpb24gY3ljbGVcbiAgICAgZGV0ZWN0b3IgaXMgZW5hYmxlZCAoaXRcJ3Mgb24gYnkgZGVmYXVsdCksIGJ1dCBjYW4gb25seSBiZSBjbGVhbmVkXG4gICAgIHVwIGlmIHRoZXJlIGFyZSBubyBQeXRob24tbGV2ZWwgYGBfX2RlbF9fKClgYCBtZXRob2RzIGludm9sdmVkLlxuICAgICBSZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGBgZ2NgYCBtb2R1bGUgZm9yIG1vcmVcbiAgICAgaW5mb3JtYXRpb24gYWJvdXQgaG93IGBgX19kZWxfXygpYGAgbWV0aG9kcyBhcmUgaGFuZGxlZCBieSB0aGVcbiAgICAgY3ljbGUgZGV0ZWN0b3IsIHBhcnRpY3VsYXJseSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGBgZ2FyYmFnZWBgXG4gICAgIHZhbHVlLlxuXG4gICBXYXJuaW5nOiBEdWUgdG8gdGhlIHByZWNhcmlvdXMgY2lyY3Vtc3RhbmNlcyB1bmRlciB3aGljaCBgYF9fZGVsX18oKWBgXG4gICAgIG1ldGhvZHMgYXJlIGludm9rZWQsIGV4Y2VwdGlvbnMgdGhhdCBvY2N1ciBkdXJpbmcgdGhlaXIgZXhlY3V0aW9uXG4gICAgIGFyZSBpZ25vcmVkLCBhbmQgYSB3YXJuaW5nIGlzIHByaW50ZWQgdG8gYGBzeXMuc3RkZXJyYGAgaW5zdGVhZC5cbiAgICAgQWxzbywgd2hlbiBgYF9fZGVsX18oKWBgIGlzIGludm9rZWQgaW4gcmVzcG9uc2UgdG8gYSBtb2R1bGUgYmVpbmdcbiAgICAgZGVsZXRlZCAoZS5nLiwgd2hlbiBleGVjdXRpb24gb2YgdGhlIHByb2dyYW0gaXMgZG9uZSksIG90aGVyXG4gICAgIGdsb2JhbHMgcmVmZXJlbmNlZCBieSB0aGUgYGBfX2RlbF9fKClgYCBtZXRob2QgbWF5IGFscmVhZHkgaGF2ZVxuICAgICBiZWVuIGRlbGV0ZWQgb3IgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgdG9ybiBkb3duIChlLmcuIHRoZVxuICAgICBpbXBvcnQgbWFjaGluZXJ5IHNodXR0aW5nIGRvd24pLiAgRm9yIHRoaXMgcmVhc29uLCBgYF9fZGVsX18oKWBgXG4gICAgIG1ldGhvZHMgc2hvdWxkIGRvIHRoZSBhYnNvbHV0ZSBtaW5pbXVtIG5lZWRlZCB0byBtYWludGFpblxuICAgICBleHRlcm5hbCBpbnZhcmlhbnRzLiAgU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDEuNSwgUHl0aG9uXG4gICAgIGd1YXJhbnRlZXMgdGhhdCBnbG9iYWxzIHdob3NlIG5hbWUgYmVnaW5zIHdpdGggYSBzaW5nbGVcbiAgICAgdW5kZXJzY29yZSBhcmUgZGVsZXRlZCBmcm9tIHRoZWlyIG1vZHVsZSBiZWZvcmUgb3RoZXIgZ2xvYmFscyBhcmVcbiAgICAgZGVsZXRlZDsgaWYgbm8gb3RoZXIgcmVmZXJlbmNlcyB0byBzdWNoIGdsb2JhbHMgZXhpc3QsIHRoaXMgbWF5XG4gICAgIGhlbHAgaW4gYXNzdXJpbmcgdGhhdCBpbXBvcnRlZCBtb2R1bGVzIGFyZSBzdGlsbCBhdmFpbGFibGUgYXQgdGhlXG4gICAgIHRpbWUgd2hlbiB0aGUgYGBfX2RlbF9fKClgYCBtZXRob2QgaXMgY2FsbGVkLlxuXG5vYmplY3QuX19yZXByX18oc2VsZilcblxuICAgQ2FsbGVkIGJ5IHRoZSBgYHJlcHIoKWBgIGJ1aWx0LWluIGZ1bmN0aW9uIGFuZCBieSBzdHJpbmdcbiAgIGNvbnZlcnNpb25zIChyZXZlcnNlIHF1b3RlcykgdG8gY29tcHV0ZSB0aGUgIm9mZmljaWFsIiBzdHJpbmdcbiAgIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gIElmIGF0IGFsbCBwb3NzaWJsZSwgdGhpcyBzaG91bGQgbG9va1xuICAgbGlrZSBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uIHRoYXQgY291bGQgYmUgdXNlZCB0byByZWNyZWF0ZSBhblxuICAgb2JqZWN0IHdpdGggdGhlIHNhbWUgdmFsdWUgKGdpdmVuIGFuIGFwcHJvcHJpYXRlIGVudmlyb25tZW50KS4gIElmXG4gICB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgYSBzdHJpbmcgb2YgdGhlIGZvcm0gYGA8Li4uc29tZSB1c2VmdWxcbiAgIGRlc2NyaXB0aW9uLi4uPmBgIHNob3VsZCBiZSByZXR1cm5lZC4gIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBhXG4gICBzdHJpbmcgb2JqZWN0LiBJZiBhIGNsYXNzIGRlZmluZXMgYGBfX3JlcHJfXygpYGAgYnV0IG5vdFxuICAgYGBfX3N0cl9fKClgYCwgdGhlbiBgYF9fcmVwcl9fKClgYCBpcyBhbHNvIHVzZWQgd2hlbiBhbiAiaW5mb3JtYWwiXG4gICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgaW5zdGFuY2VzIG9mIHRoYXQgY2xhc3MgaXMgcmVxdWlyZWQuXG5cbiAgIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGRlYnVnZ2luZywgc28gaXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlXG4gICByZXByZXNlbnRhdGlvbiBpcyBpbmZvcm1hdGlvbi1yaWNoIGFuZCB1bmFtYmlndW91cy5cblxub2JqZWN0Ll9fc3RyX18oc2VsZilcblxuICAgQ2FsbGVkIGJ5IHRoZSBgYHN0cigpYGAgYnVpbHQtaW4gZnVuY3Rpb24gYW5kIGJ5IHRoZSBgYHByaW50YGBcbiAgIHN0YXRlbWVudCB0byBjb21wdXRlIHRoZSAiaW5mb3JtYWwiIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhblxuICAgb2JqZWN0LiAgVGhpcyBkaWZmZXJzIGZyb20gYGBfX3JlcHJfXygpYGAgaW4gdGhhdCBpdCBkb2VzIG5vdCBoYXZlXG4gICB0byBiZSBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uOiBhIG1vcmUgY29udmVuaWVudCBvciBjb25jaXNlXG4gICByZXByZXNlbnRhdGlvbiBtYXkgYmUgdXNlZCBpbnN0ZWFkLiBUaGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgYVxuICAgc3RyaW5nIG9iamVjdC5cblxub2JqZWN0Ll9fbHRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2xlX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19lcV9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fbmVfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2d0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19nZV9fKHNlbGYsIG90aGVyKVxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjEuXG5cbiAgIFRoZXNlIGFyZSB0aGUgc28tY2FsbGVkICJyaWNoIGNvbXBhcmlzb24iIG1ldGhvZHMsIGFuZCBhcmUgY2FsbGVkXG4gICBmb3IgY29tcGFyaXNvbiBvcGVyYXRvcnMgaW4gcHJlZmVyZW5jZSB0byBgYF9fY21wX18oKWBgIGJlbG93LiBUaGVcbiAgIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gb3BlcmF0b3Igc3ltYm9scyBhbmQgbWV0aG9kIG5hbWVzIGlzIGFzXG4gICBmb2xsb3dzOiBgYHg8eWBgIGNhbGxzIGBgeC5fX2x0X18oeSlgYCwgYGB4PD15YGAgY2FsbHNcbiAgIGBgeC5fX2xlX18oeSlgYCwgYGB4PT15YGAgY2FsbHMgYGB4Ll9fZXFfXyh5KWBgLCBgYHghPXlgYCBhbmRcbiAgIGBgeDw+eWBgIGNhbGwgYGB4Ll9fbmVfXyh5KWBgLCBgYHg+eWBgIGNhbGxzIGBgeC5fX2d0X18oeSlgYCwgYW5kXG4gICBgYHg+PXlgYCBjYWxscyBgYHguX19nZV9fKHkpYGAuXG5cbiAgIEEgcmljaCBjb21wYXJpc29uIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBzaW5nbGV0b25cbiAgIGBgTm90SW1wbGVtZW50ZWRgYCBpZiBpdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG9wZXJhdGlvbiBmb3IgYVxuICAgZ2l2ZW4gcGFpciBvZiBhcmd1bWVudHMuIEJ5IGNvbnZlbnRpb24sIGBgRmFsc2VgYCBhbmQgYGBUcnVlYGAgYXJlXG4gICByZXR1cm5lZCBmb3IgYSBzdWNjZXNzZnVsIGNvbXBhcmlzb24uIEhvd2V2ZXIsIHRoZXNlIG1ldGhvZHMgY2FuXG4gICByZXR1cm4gYW55IHZhbHVlLCBzbyBpZiB0aGUgY29tcGFyaXNvbiBvcGVyYXRvciBpcyB1c2VkIGluIGFcbiAgIEJvb2xlYW4gY29udGV4dCAoZS5nLiwgaW4gdGhlIGNvbmRpdGlvbiBvZiBhbiBgYGlmYGAgc3RhdGVtZW50KSxcbiAgIFB5dGhvbiB3aWxsIGNhbGwgYGBib29sKClgYCBvbiB0aGUgdmFsdWUgdG8gZGV0ZXJtaW5lIGlmIHRoZSByZXN1bHRcbiAgIGlzIHRydWUgb3IgZmFsc2UuXG5cbiAgIFRoZXJlIGFyZSBubyBpbXBsaWVkIHJlbGF0aW9uc2hpcHMgYW1vbmcgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzLlxuICAgVGhlIHRydXRoIG9mIGBgeD09eWBgIGRvZXMgbm90IGltcGx5IHRoYXQgYGB4IT15YGAgaXMgZmFsc2UuXG4gICBBY2NvcmRpbmdseSwgd2hlbiBkZWZpbmluZyBgYF9fZXFfXygpYGAsIG9uZSBzaG91bGQgYWxzbyBkZWZpbmVcbiAgIGBgX19uZV9fKClgYCBzbyB0aGF0IHRoZSBvcGVyYXRvcnMgd2lsbCBiZWhhdmUgYXMgZXhwZWN0ZWQuICBTZWVcbiAgIHRoZSBwYXJhZ3JhcGggb24gYGBfX2hhc2hfXygpYGAgZm9yIHNvbWUgaW1wb3J0YW50IG5vdGVzIG9uXG4gICBjcmVhdGluZyAqaGFzaGFibGUqIG9iamVjdHMgd2hpY2ggc3VwcG9ydCBjdXN0b20gY29tcGFyaXNvblxuICAgb3BlcmF0aW9ucyBhbmQgYXJlIHVzYWJsZSBhcyBkaWN0aW9uYXJ5IGtleXMuXG5cbiAgIFRoZXJlIGFyZSBubyBzd2FwcGVkLWFyZ3VtZW50IHZlcnNpb25zIG9mIHRoZXNlIG1ldGhvZHMgKHRvIGJlIHVzZWRcbiAgIHdoZW4gdGhlIGxlZnQgYXJndW1lbnQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uIGJ1dCB0aGUgcmlnaHRcbiAgIGFyZ3VtZW50IGRvZXMpOyByYXRoZXIsIGBgX19sdF9fKClgYCBhbmQgYGBfX2d0X18oKWBgIGFyZSBlYWNoXG4gICBvdGhlclwncyByZWZsZWN0aW9uLCBgYF9fbGVfXygpYGAgYW5kIGBgX19nZV9fKClgYCBhcmUgZWFjaCBvdGhlclwnc1xuICAgcmVmbGVjdGlvbiwgYW5kIGBgX19lcV9fKClgYCBhbmQgYGBfX25lX18oKWBgIGFyZSB0aGVpciBvd25cbiAgIHJlZmxlY3Rpb24uXG5cbiAgIEFyZ3VtZW50cyB0byByaWNoIGNvbXBhcmlzb24gbWV0aG9kcyBhcmUgbmV2ZXIgY29lcmNlZC5cblxuICAgVG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZSBvcmRlcmluZyBvcGVyYXRpb25zIGZyb20gYSBzaW5nbGUgcm9vdFxuICAgb3BlcmF0aW9uLCBzZWUgYGBmdW5jdG9vbHMudG90YWxfb3JkZXJpbmcoKWBgLlxuXG5vYmplY3QuX19jbXBfXyhzZWxmLCBvdGhlcilcblxuICAgQ2FsbGVkIGJ5IGNvbXBhcmlzb24gb3BlcmF0aW9ucyBpZiByaWNoIGNvbXBhcmlzb24gKHNlZSBhYm92ZSkgaXNcbiAgIG5vdCBkZWZpbmVkLiAgU2hvdWxkIHJldHVybiBhIG5lZ2F0aXZlIGludGVnZXIgaWYgYGBzZWxmIDwgb3RoZXJgYCxcbiAgIHplcm8gaWYgYGBzZWxmID09IG90aGVyYGAsIGEgcG9zaXRpdmUgaW50ZWdlciBpZiBgYHNlbGYgPiBvdGhlcmBgLlxuICAgSWYgbm8gYGBfX2NtcF9fKClgYCwgYGBfX2VxX18oKWBgIG9yIGBgX19uZV9fKClgYCBvcGVyYXRpb24gaXNcbiAgIGRlZmluZWQsIGNsYXNzIGluc3RhbmNlcyBhcmUgY29tcGFyZWQgYnkgb2JqZWN0IGlkZW50aXR5XG4gICAoImFkZHJlc3MiKS4gIFNlZSBhbHNvIHRoZSBkZXNjcmlwdGlvbiBvZiBgYF9faGFzaF9fKClgYCBmb3Igc29tZVxuICAgaW1wb3J0YW50IG5vdGVzIG9uIGNyZWF0aW5nICpoYXNoYWJsZSogb2JqZWN0cyB3aGljaCBzdXBwb3J0IGN1c3RvbVxuICAgY29tcGFyaXNvbiBvcGVyYXRpb25zIGFuZCBhcmUgdXNhYmxlIGFzIGRpY3Rpb25hcnkga2V5cy4gKE5vdGU6IHRoZVxuICAgcmVzdHJpY3Rpb24gdGhhdCBleGNlcHRpb25zIGFyZSBub3QgcHJvcGFnYXRlZCBieSBgYF9fY21wX18oKWBgIGhhc1xuICAgYmVlbiByZW1vdmVkIHNpbmNlIFB5dGhvbiAxLjUuKVxuXG5vYmplY3QuX19yY21wX18oc2VsZiwgb3RoZXIpXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjE6IE5vIGxvbmdlciBzdXBwb3J0ZWQuXG5cbm9iamVjdC5fX2hhc2hfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgYnVpbHQtaW4gZnVuY3Rpb24gYGBoYXNoKClgYCBhbmQgZm9yIG9wZXJhdGlvbnMgb25cbiAgIG1lbWJlcnMgb2YgaGFzaGVkIGNvbGxlY3Rpb25zIGluY2x1ZGluZyBgYHNldGBgLCBgYGZyb3plbnNldGBgLCBhbmRcbiAgIGBgZGljdGBgLiAgYGBfX2hhc2hfXygpYGAgc2hvdWxkIHJldHVybiBhbiBpbnRlZ2VyLiAgVGhlIG9ubHlcbiAgIHJlcXVpcmVkIHByb3BlcnR5IGlzIHRoYXQgb2JqZWN0cyB3aGljaCBjb21wYXJlIGVxdWFsIGhhdmUgdGhlIHNhbWVcbiAgIGhhc2ggdmFsdWU7IGl0IGlzIGFkdmlzZWQgdG8gc29tZWhvdyBtaXggdG9nZXRoZXIgKGUuZy4gdXNpbmdcbiAgIGV4Y2x1c2l2ZSBvcikgdGhlIGhhc2ggdmFsdWVzIGZvciB0aGUgY29tcG9uZW50cyBvZiB0aGUgb2JqZWN0IHRoYXRcbiAgIGFsc28gcGxheSBhIHBhcnQgaW4gY29tcGFyaXNvbiBvZiBvYmplY3RzLlxuXG4gICBJZiBhIGNsYXNzIGRvZXMgbm90IGRlZmluZSBhIGBgX19jbXBfXygpYGAgb3IgYGBfX2VxX18oKWBgIG1ldGhvZFxuICAgaXQgc2hvdWxkIG5vdCBkZWZpbmUgYSBgYF9faGFzaF9fKClgYCBvcGVyYXRpb24gZWl0aGVyOyBpZiBpdFxuICAgZGVmaW5lcyBgYF9fY21wX18oKWBgIG9yIGBgX19lcV9fKClgYCBidXQgbm90IGBgX19oYXNoX18oKWBgLCBpdHNcbiAgIGluc3RhbmNlcyB3aWxsIG5vdCBiZSB1c2FibGUgaW4gaGFzaGVkIGNvbGxlY3Rpb25zLiAgSWYgYSBjbGFzc1xuICAgZGVmaW5lcyBtdXRhYmxlIG9iamVjdHMgYW5kIGltcGxlbWVudHMgYSBgYF9fY21wX18oKWBgIG9yXG4gICBgYF9fZXFfXygpYGAgbWV0aG9kLCBpdCBzaG91bGQgbm90IGltcGxlbWVudCBgYF9faGFzaF9fKClgYCwgc2luY2VcbiAgIGhhc2hhYmxlIGNvbGxlY3Rpb24gaW1wbGVtZW50YXRpb25zIHJlcXVpcmUgdGhhdCBhIG9iamVjdFwncyBoYXNoXG4gICB2YWx1ZSBpcyBpbW11dGFibGUgKGlmIHRoZSBvYmplY3RcJ3MgaGFzaCB2YWx1ZSBjaGFuZ2VzLCBpdCB3aWxsIGJlXG4gICBpbiB0aGUgd3JvbmcgaGFzaCBidWNrZXQpLlxuXG4gICBVc2VyLWRlZmluZWQgY2xhc3NlcyBoYXZlIGBgX19jbXBfXygpYGAgYW5kIGBgX19oYXNoX18oKWBgIG1ldGhvZHNcbiAgIGJ5IGRlZmF1bHQ7IHdpdGggdGhlbSwgYWxsIG9iamVjdHMgY29tcGFyZSB1bmVxdWFsIChleGNlcHQgd2l0aFxuICAgdGhlbXNlbHZlcykgYW5kIGBgeC5fX2hhc2hfXygpYGAgcmV0dXJucyBgYGlkKHgpYGAuXG5cbiAgIENsYXNzZXMgd2hpY2ggaW5oZXJpdCBhIGBgX19oYXNoX18oKWBgIG1ldGhvZCBmcm9tIGEgcGFyZW50IGNsYXNzXG4gICBidXQgY2hhbmdlIHRoZSBtZWFuaW5nIG9mIGBgX19jbXBfXygpYGAgb3IgYGBfX2VxX18oKWBgIHN1Y2ggdGhhdFxuICAgdGhlIGhhc2ggdmFsdWUgcmV0dXJuZWQgaXMgbm8gbG9uZ2VyIGFwcHJvcHJpYXRlIChlLmcuIGJ5IHN3aXRjaGluZ1xuICAgdG8gYSB2YWx1ZS1iYXNlZCBjb25jZXB0IG9mIGVxdWFsaXR5IGluc3RlYWQgb2YgdGhlIGRlZmF1bHRcbiAgIGlkZW50aXR5IGJhc2VkIGVxdWFsaXR5KSBjYW4gZXhwbGljaXRseSBmbGFnIHRoZW1zZWx2ZXMgYXMgYmVpbmdcbiAgIHVuaGFzaGFibGUgYnkgc2V0dGluZyBgYF9faGFzaF9fID0gTm9uZWBgIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uLlxuICAgRG9pbmcgc28gbWVhbnMgdGhhdCBub3Qgb25seSB3aWxsIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MgcmFpc2UgYW5cbiAgIGFwcHJvcHJpYXRlIGBgVHlwZUVycm9yYGAgd2hlbiBhIHByb2dyYW0gYXR0ZW1wdHMgdG8gcmV0cmlldmUgdGhlaXJcbiAgIGhhc2ggdmFsdWUsIGJ1dCB0aGV5IHdpbGwgYWxzbyBiZSBjb3JyZWN0bHkgaWRlbnRpZmllZCBhc1xuICAgdW5oYXNoYWJsZSB3aGVuIGNoZWNraW5nIGBgaXNpbnN0YW5jZShvYmosIGNvbGxlY3Rpb25zLkhhc2hhYmxlKWBgXG4gICAodW5saWtlIGNsYXNzZXMgd2hpY2ggZGVmaW5lIHRoZWlyIG93biBgYF9faGFzaF9fKClgYCB0byBleHBsaWNpdGx5XG4gICByYWlzZSBgYFR5cGVFcnJvcmBgKS5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNTogYGBfX2hhc2hfXygpYGAgbWF5IG5vdyBhbHNvIHJldHVybiBhIGxvbmdcbiAgIGludGVnZXIgb2JqZWN0OyB0aGUgMzItYml0IGludGVnZXIgaXMgdGhlbiBkZXJpdmVkIGZyb20gdGhlIGhhc2ggb2ZcbiAgIHRoYXQgb2JqZWN0LlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi42OiBgYF9faGFzaF9fYGAgbWF5IG5vdyBiZSBzZXQgdG8gYGBOb25lYGAgdG9cbiAgIGV4cGxpY2l0bHkgZmxhZyBpbnN0YW5jZXMgb2YgYSBjbGFzcyBhcyB1bmhhc2hhYmxlLlxuXG5vYmplY3QuX19ub256ZXJvX18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0cnV0aCB2YWx1ZSB0ZXN0aW5nIGFuZCB0aGUgYnVpbHQtaW4gb3BlcmF0aW9uXG4gICBgYGJvb2woKWBgOyBzaG91bGQgcmV0dXJuIGBgRmFsc2VgYCBvciBgYFRydWVgYCwgb3IgdGhlaXIgaW50ZWdlclxuICAgZXF1aXZhbGVudHMgYGAwYGAgb3IgYGAxYGAuICBXaGVuIHRoaXMgbWV0aG9kIGlzIG5vdCBkZWZpbmVkLFxuICAgYGBfX2xlbl9fKClgYCBpcyBjYWxsZWQsIGlmIGl0IGlzIGRlZmluZWQsIGFuZCB0aGUgb2JqZWN0IGlzXG4gICBjb25zaWRlcmVkIHRydWUgaWYgaXRzIHJlc3VsdCBpcyBub256ZXJvLiBJZiBhIGNsYXNzIGRlZmluZXNcbiAgIG5laXRoZXIgYGBfX2xlbl9fKClgYCBub3IgYGBfX25vbnplcm9fXygpYGAsIGFsbCBpdHMgaW5zdGFuY2VzIGFyZVxuICAgY29uc2lkZXJlZCB0cnVlLlxuXG5vYmplY3QuX191bmljb2RlX18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBgYHVuaWNvZGUoKWBgIGJ1aWx0LWluOyBzaG91bGQgcmV0dXJuIGEgVW5pY29kZVxuICAgb2JqZWN0LiBXaGVuIHRoaXMgbWV0aG9kIGlzIG5vdCBkZWZpbmVkLCBzdHJpbmcgY29udmVyc2lvbiBpc1xuICAgYXR0ZW1wdGVkLCBhbmQgdGhlIHJlc3VsdCBvZiBzdHJpbmcgY29udmVyc2lvbiBpcyBjb252ZXJ0ZWQgdG9cbiAgIFVuaWNvZGUgdXNpbmcgdGhlIHN5c3RlbSBkZWZhdWx0IGVuY29kaW5nLlxuXG5cbkN1c3RvbWl6aW5nIGF0dHJpYnV0ZSBhY2Nlc3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGN1c3RvbWl6ZSB0aGUgbWVhbmluZyBvZlxuYXR0cmlidXRlIGFjY2VzcyAodXNlIG9mLCBhc3NpZ25tZW50IHRvLCBvciBkZWxldGlvbiBvZiBgYHgubmFtZWBgKVxuZm9yIGNsYXNzIGluc3RhbmNlcy5cblxub2JqZWN0Ll9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpXG5cbiAgIENhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSBsb29rdXAgaGFzIG5vdCBmb3VuZCB0aGUgYXR0cmlidXRlIGluIHRoZVxuICAgdXN1YWwgcGxhY2VzIChpLmUuIGl0IGlzIG5vdCBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgbm9yIGlzIGl0IGZvdW5kXG4gICBpbiB0aGUgY2xhc3MgdHJlZSBmb3IgYGBzZWxmYGApLiAgYGBuYW1lYGAgaXMgdGhlIGF0dHJpYnV0ZSBuYW1lLlxuICAgVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2VcbiAgIGFuIGBgQXR0cmlidXRlRXJyb3JgYCBleGNlcHRpb24uXG5cbiAgIE5vdGUgdGhhdCBpZiB0aGUgYXR0cmlidXRlIGlzIGZvdW5kIHRocm91Z2ggdGhlIG5vcm1hbCBtZWNoYW5pc20sXG4gICBgYF9fZ2V0YXR0cl9fKClgYCBpcyBub3QgY2FsbGVkLiAgKFRoaXMgaXMgYW4gaW50ZW50aW9uYWwgYXN5bW1ldHJ5XG4gICBiZXR3ZWVuIGBgX19nZXRhdHRyX18oKWBgIGFuZCBgYF9fc2V0YXR0cl9fKClgYC4pIFRoaXMgaXMgZG9uZSBib3RoXG4gICBmb3IgZWZmaWNpZW5jeSByZWFzb25zIGFuZCBiZWNhdXNlIG90aGVyd2lzZSBgYF9fZ2V0YXR0cl9fKClgYFxuICAgd291bGQgaGF2ZSBubyB3YXkgdG8gYWNjZXNzIG90aGVyIGF0dHJpYnV0ZXMgb2YgdGhlIGluc3RhbmNlLiAgTm90ZVxuICAgdGhhdCBhdCBsZWFzdCBmb3IgaW5zdGFuY2UgdmFyaWFibGVzLCB5b3UgY2FuIGZha2UgdG90YWwgY29udHJvbCBieVxuICAgbm90IGluc2VydGluZyBhbnkgdmFsdWVzIGluIHRoZSBpbnN0YW5jZSBhdHRyaWJ1dGUgZGljdGlvbmFyeSAoYnV0XG4gICBpbnN0ZWFkIGluc2VydGluZyB0aGVtIGluIGFub3RoZXIgb2JqZWN0KS4gIFNlZSB0aGVcbiAgIGBgX19nZXRhdHRyaWJ1dGVfXygpYGAgbWV0aG9kIGJlbG93IGZvciBhIHdheSB0byBhY3R1YWxseSBnZXQgdG90YWxcbiAgIGNvbnRyb2wgaW4gbmV3LXN0eWxlIGNsYXNzZXMuXG5cbm9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSlcblxuICAgQ2FsbGVkIHdoZW4gYW4gYXR0cmlidXRlIGFzc2lnbm1lbnQgaXMgYXR0ZW1wdGVkLiAgVGhpcyBpcyBjYWxsZWRcbiAgIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBtZWNoYW5pc20gKGkuZS4gc3RvcmUgdGhlIHZhbHVlIGluIHRoZVxuICAgaW5zdGFuY2UgZGljdGlvbmFyeSkuICAqbmFtZSogaXMgdGhlIGF0dHJpYnV0ZSBuYW1lLCAqdmFsdWUqIGlzIHRoZVxuICAgdmFsdWUgdG8gYmUgYXNzaWduZWQgdG8gaXQuXG5cbiAgIElmIGBgX19zZXRhdHRyX18oKWBgIHdhbnRzIHRvIGFzc2lnbiB0byBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUsIGl0XG4gICBzaG91bGQgbm90IHNpbXBseSBleGVjdXRlIGBgc2VsZi5uYW1lID0gdmFsdWVgYCAtLS0gdGhpcyB3b3VsZFxuICAgY2F1c2UgYSByZWN1cnNpdmUgY2FsbCB0byBpdHNlbGYuICBJbnN0ZWFkLCBpdCBzaG91bGQgaW5zZXJ0IHRoZVxuICAgdmFsdWUgaW4gdGhlIGRpY3Rpb25hcnkgb2YgaW5zdGFuY2UgYXR0cmlidXRlcywgZS5nLixcbiAgIGBgc2VsZi5fX2RpY3RfX1tuYW1lXSA9IHZhbHVlYGAuICBGb3IgbmV3LXN0eWxlIGNsYXNzZXMsIHJhdGhlclxuICAgdGhhbiBhY2Nlc3NpbmcgdGhlIGluc3RhbmNlIGRpY3Rpb25hcnksIGl0IHNob3VsZCBjYWxsIHRoZSBiYXNlXG4gICBjbGFzcyBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lLCBmb3IgZXhhbXBsZSxcbiAgIGBgb2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKWBgLlxuXG5vYmplY3QuX19kZWxhdHRyX18oc2VsZiwgbmFtZSlcblxuICAgTGlrZSBgYF9fc2V0YXR0cl9fKClgYCBidXQgZm9yIGF0dHJpYnV0ZSBkZWxldGlvbiBpbnN0ZWFkIG9mXG4gICBhc3NpZ25tZW50LiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBpZiBgYGRlbCBvYmoubmFtZWBgIGlzXG4gICBtZWFuaW5nZnVsIGZvciB0aGUgb2JqZWN0LlxuXG5cbk1vcmUgYXR0cmlidXRlIGFjY2VzcyBmb3IgbmV3LXN0eWxlIGNsYXNzZXNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIG9ubHkgYXBwbHkgdG8gbmV3LXN0eWxlIGNsYXNzZXMuXG5cbm9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpXG5cbiAgIENhbGxlZCB1bmNvbmRpdGlvbmFsbHkgdG8gaW1wbGVtZW50IGF0dHJpYnV0ZSBhY2Nlc3NlcyBmb3JcbiAgIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MuIElmIHRoZSBjbGFzcyBhbHNvIGRlZmluZXNcbiAgIGBgX19nZXRhdHRyX18oKWBgLCB0aGUgbGF0dGVyIHdpbGwgbm90IGJlIGNhbGxlZCB1bmxlc3NcbiAgIGBgX19nZXRhdHRyaWJ1dGVfXygpYGAgZWl0aGVyIGNhbGxzIGl0IGV4cGxpY2l0bHkgb3IgcmFpc2VzIGFuXG4gICBgYEF0dHJpYnV0ZUVycm9yYGAuIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIChjb21wdXRlZClcbiAgIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZSBhbiBgYEF0dHJpYnV0ZUVycm9yYGAgZXhjZXB0aW9uLiBJbiBvcmRlclxuICAgdG8gYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uIGluIHRoaXMgbWV0aG9kLCBpdHMgaW1wbGVtZW50YXRpb25cbiAgIHNob3VsZCBhbHdheXMgY2FsbCB0aGUgYmFzZSBjbGFzcyBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lIHRvXG4gICBhY2Nlc3MgYW55IGF0dHJpYnV0ZXMgaXQgbmVlZHMsIGZvciBleGFtcGxlLFxuICAgYGBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKWBgLlxuXG4gICBOb3RlOiBUaGlzIG1ldGhvZCBtYXkgc3RpbGwgYmUgYnlwYXNzZWQgd2hlbiBsb29raW5nIHVwIHNwZWNpYWwgbWV0aG9kc1xuICAgICBhcyB0aGUgcmVzdWx0IG9mIGltcGxpY2l0IGludm9jYXRpb24gdmlhIGxhbmd1YWdlIHN5bnRheCBvclxuICAgICBidWlsdC1pbiBmdW5jdGlvbnMuIFNlZSAqU3BlY2lhbCBtZXRob2QgbG9va3VwIGZvciBuZXctc3R5bGVcbiAgICAgY2xhc3NlcyouXG5cblxuSW1wbGVtZW50aW5nIERlc2NyaXB0b3JzXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIG9ubHkgYXBwbHkgd2hlbiBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3NcbmNvbnRhaW5pbmcgdGhlIG1ldGhvZCAoYSBzby1jYWxsZWQgKmRlc2NyaXB0b3IqIGNsYXNzKSBhcHBlYXJzIGluIGFuXG4qb3duZXIqIGNsYXNzICh0aGUgZGVzY3JpcHRvciBtdXN0IGJlIGluIGVpdGhlciB0aGUgb3duZXJcJ3MgY2xhc3NcbmRpY3Rpb25hcnkgb3IgaW4gdGhlIGNsYXNzIGRpY3Rpb25hcnkgZm9yIG9uZSBvZiBpdHMgcGFyZW50cykuICBJbiB0aGVcbmV4YW1wbGVzIGJlbG93LCAidGhlIGF0dHJpYnV0ZSIgcmVmZXJzIHRvIHRoZSBhdHRyaWJ1dGUgd2hvc2UgbmFtZSBpc1xudGhlIGtleSBvZiB0aGUgcHJvcGVydHkgaW4gdGhlIG93bmVyIGNsYXNzXCcgYGBfX2RpY3RfX2BgLlxuXG5vYmplY3QuX19nZXRfXyhzZWxmLCBpbnN0YW5jZSwgb3duZXIpXG5cbiAgIENhbGxlZCB0byBnZXQgdGhlIGF0dHJpYnV0ZSBvZiB0aGUgb3duZXIgY2xhc3MgKGNsYXNzIGF0dHJpYnV0ZVxuICAgYWNjZXNzKSBvciBvZiBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzIChpbnN0YW5jZSBhdHRyaWJ1dGVcbiAgIGFjY2VzcykuICpvd25lciogaXMgYWx3YXlzIHRoZSBvd25lciBjbGFzcywgd2hpbGUgKmluc3RhbmNlKiBpcyB0aGVcbiAgIGluc3RhbmNlIHRoYXQgdGhlIGF0dHJpYnV0ZSB3YXMgYWNjZXNzZWQgdGhyb3VnaCwgb3IgYGBOb25lYGAgd2hlblxuICAgdGhlIGF0dHJpYnV0ZSBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSAqb3duZXIqLiAgVGhpcyBtZXRob2Qgc2hvdWxkXG4gICByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuXG4gICBgYEF0dHJpYnV0ZUVycm9yYGAgZXhjZXB0aW9uLlxuXG5vYmplY3QuX19zZXRfXyhzZWxmLCBpbnN0YW5jZSwgdmFsdWUpXG5cbiAgIENhbGxlZCB0byBzZXQgdGhlIGF0dHJpYnV0ZSBvbiBhbiBpbnN0YW5jZSAqaW5zdGFuY2UqIG9mIHRoZSBvd25lclxuICAgY2xhc3MgdG8gYSBuZXcgdmFsdWUsICp2YWx1ZSouXG5cbm9iamVjdC5fX2RlbGV0ZV9fKHNlbGYsIGluc3RhbmNlKVxuXG4gICBDYWxsZWQgdG8gZGVsZXRlIHRoZSBhdHRyaWJ1dGUgb24gYW4gaW5zdGFuY2UgKmluc3RhbmNlKiBvZiB0aGVcbiAgIG93bmVyIGNsYXNzLlxuXG5cbkludm9raW5nIERlc2NyaXB0b3JzXG4tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5JbiBnZW5lcmFsLCBhIGRlc2NyaXB0b3IgaXMgYW4gb2JqZWN0IGF0dHJpYnV0ZSB3aXRoICJiaW5kaW5nXG5iZWhhdmlvciIsIG9uZSB3aG9zZSBhdHRyaWJ1dGUgYWNjZXNzIGhhcyBiZWVuIG92ZXJyaWRkZW4gYnkgbWV0aG9kc1xuaW4gdGhlIGRlc2NyaXB0b3IgcHJvdG9jb2w6ICBgYF9fZ2V0X18oKWBgLCBgYF9fc2V0X18oKWBgLCBhbmRcbmBgX19kZWxldGVfXygpYGAuIElmIGFueSBvZiB0aG9zZSBtZXRob2RzIGFyZSBkZWZpbmVkIGZvciBhbiBvYmplY3QsXG5pdCBpcyBzYWlkIHRvIGJlIGEgZGVzY3JpcHRvci5cblxuVGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGF0dHJpYnV0ZSBhY2Nlc3MgaXMgdG8gZ2V0LCBzZXQsIG9yIGRlbGV0ZVxudGhlIGF0dHJpYnV0ZSBmcm9tIGFuIG9iamVjdFwncyBkaWN0aW9uYXJ5LiBGb3IgaW5zdGFuY2UsIGBgYS54YGAgaGFzIGFcbmxvb2t1cCBjaGFpbiBzdGFydGluZyB3aXRoIGBgYS5fX2RpY3RfX1tcJ3hcJ11gYCwgdGhlblxuYGB0eXBlKGEpLl9fZGljdF9fW1wneFwnXWBgLCBhbmQgY29udGludWluZyB0aHJvdWdoIHRoZSBiYXNlIGNsYXNzZXMgb2ZcbmBgdHlwZShhKWBgIGV4Y2x1ZGluZyBtZXRhY2xhc3Nlcy5cblxuSG93ZXZlciwgaWYgdGhlIGxvb2tlZC11cCB2YWx1ZSBpcyBhbiBvYmplY3QgZGVmaW5pbmcgb25lIG9mIHRoZVxuZGVzY3JpcHRvciBtZXRob2RzLCB0aGVuIFB5dGhvbiBtYXkgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3IgYW5kXG5pbnZva2UgdGhlIGRlc2NyaXB0b3IgbWV0aG9kIGluc3RlYWQuICBXaGVyZSB0aGlzIG9jY3VycyBpbiB0aGVcbnByZWNlZGVuY2UgY2hhaW4gZGVwZW5kcyBvbiB3aGljaCBkZXNjcmlwdG9yIG1ldGhvZHMgd2VyZSBkZWZpbmVkIGFuZFxuaG93IHRoZXkgd2VyZSBjYWxsZWQuICBOb3RlIHRoYXQgZGVzY3JpcHRvcnMgYXJlIG9ubHkgaW52b2tlZCBmb3IgbmV3XG5zdHlsZSBvYmplY3RzIG9yIGNsYXNzZXMgKG9uZXMgdGhhdCBzdWJjbGFzcyBgYG9iamVjdCgpYGAgb3JcbmBgdHlwZSgpYGApLlxuXG5UaGUgc3RhcnRpbmcgcG9pbnQgZm9yIGRlc2NyaXB0b3IgaW52b2NhdGlvbiBpcyBhIGJpbmRpbmcsIGBgYS54YGAuXG5Ib3cgdGhlIGFyZ3VtZW50cyBhcmUgYXNzZW1ibGVkIGRlcGVuZHMgb24gYGBhYGA6XG5cbkRpcmVjdCBDYWxsXG4gICBUaGUgc2ltcGxlc3QgYW5kIGxlYXN0IGNvbW1vbiBjYWxsIGlzIHdoZW4gdXNlciBjb2RlIGRpcmVjdGx5XG4gICBpbnZva2VzIGEgZGVzY3JpcHRvciBtZXRob2Q6ICAgIGBgeC5fX2dldF9fKGEpYGAuXG5cbkluc3RhbmNlIEJpbmRpbmdcbiAgIElmIGJpbmRpbmcgdG8gYSBuZXctc3R5bGUgb2JqZWN0IGluc3RhbmNlLCBgYGEueGBgIGlzIHRyYW5zZm9ybWVkXG4gICBpbnRvIHRoZSBjYWxsOiBgYHR5cGUoYSkuX19kaWN0X19bXCd4XCddLl9fZ2V0X18oYSwgdHlwZShhKSlgYC5cblxuQ2xhc3MgQmluZGluZ1xuICAgSWYgYmluZGluZyB0byBhIG5ldy1zdHlsZSBjbGFzcywgYGBBLnhgYCBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZVxuICAgY2FsbDogYGBBLl9fZGljdF9fW1wneFwnXS5fX2dldF9fKE5vbmUsIEEpYGAuXG5cblN1cGVyIEJpbmRpbmdcbiAgIElmIGBgYWBgIGlzIGFuIGluc3RhbmNlIG9mIGBgc3VwZXJgYCwgdGhlbiB0aGUgYmluZGluZyBgYHN1cGVyKEIsXG4gICBvYmopLm0oKWBgIHNlYXJjaGVzIGBgb2JqLl9fY2xhc3NfXy5fX21yb19fYGAgZm9yIHRoZSBiYXNlIGNsYXNzXG4gICBgYEFgYCBpbW1lZGlhdGVseSBwcmVjZWRpbmcgYGBCYGAgYW5kIHRoZW4gaW52b2tlcyB0aGUgZGVzY3JpcHRvclxuICAgd2l0aCB0aGUgY2FsbDogYGBBLl9fZGljdF9fW1wnbVwnXS5fX2dldF9fKG9iaiwgb2JqLl9fY2xhc3NfXylgYC5cblxuRm9yIGluc3RhbmNlIGJpbmRpbmdzLCB0aGUgcHJlY2VkZW5jZSBvZiBkZXNjcmlwdG9yIGludm9jYXRpb24gZGVwZW5kc1xub24gdGhlIHdoaWNoIGRlc2NyaXB0b3IgbWV0aG9kcyBhcmUgZGVmaW5lZC4gIEEgZGVzY3JpcHRvciBjYW4gZGVmaW5lXG5hbnkgY29tYmluYXRpb24gb2YgYGBfX2dldF9fKClgYCwgYGBfX3NldF9fKClgYCBhbmQgYGBfX2RlbGV0ZV9fKClgYC5cbklmIGl0IGRvZXMgbm90IGRlZmluZSBgYF9fZ2V0X18oKWBgLCB0aGVuIGFjY2Vzc2luZyB0aGUgYXR0cmlidXRlIHdpbGxcbnJldHVybiB0aGUgZGVzY3JpcHRvciBvYmplY3QgaXRzZWxmIHVubGVzcyB0aGVyZSBpcyBhIHZhbHVlIGluIHRoZVxub2JqZWN0XCdzIGluc3RhbmNlIGRpY3Rpb25hcnkuICBJZiB0aGUgZGVzY3JpcHRvciBkZWZpbmVzIGBgX19zZXRfXygpYGBcbmFuZC9vciBgYF9fZGVsZXRlX18oKWBgLCBpdCBpcyBhIGRhdGEgZGVzY3JpcHRvcjsgaWYgaXQgZGVmaW5lc1xubmVpdGhlciwgaXQgaXMgYSBub24tZGF0YSBkZXNjcmlwdG9yLiAgTm9ybWFsbHksIGRhdGEgZGVzY3JpcHRvcnNcbmRlZmluZSBib3RoIGBgX19nZXRfXygpYGAgYW5kIGBgX19zZXRfXygpYGAsIHdoaWxlIG5vbi1kYXRhXG5kZXNjcmlwdG9ycyBoYXZlIGp1c3QgdGhlIGBgX19nZXRfXygpYGAgbWV0aG9kLiAgRGF0YSBkZXNjcmlwdG9ycyB3aXRoXG5gYF9fc2V0X18oKWBgIGFuZCBgYF9fZ2V0X18oKWBgIGRlZmluZWQgYWx3YXlzIG92ZXJyaWRlIGEgcmVkZWZpbml0aW9uXG5pbiBhbiBpbnN0YW5jZSBkaWN0aW9uYXJ5LiAgSW4gY29udHJhc3QsIG5vbi1kYXRhIGRlc2NyaXB0b3JzIGNhbiBiZVxub3ZlcnJpZGRlbiBieSBpbnN0YW5jZXMuXG5cblB5dGhvbiBtZXRob2RzIChpbmNsdWRpbmcgYGBzdGF0aWNtZXRob2QoKWBgIGFuZCBgYGNsYXNzbWV0aG9kKClgYClcbmFyZSBpbXBsZW1lbnRlZCBhcyBub24tZGF0YSBkZXNjcmlwdG9ycy4gIEFjY29yZGluZ2x5LCBpbnN0YW5jZXMgY2FuXG5yZWRlZmluZSBhbmQgb3ZlcnJpZGUgbWV0aG9kcy4gIFRoaXMgYWxsb3dzIGluZGl2aWR1YWwgaW5zdGFuY2VzIHRvXG5hY3F1aXJlIGJlaGF2aW9ycyB0aGF0IGRpZmZlciBmcm9tIG90aGVyIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBjbGFzcy5cblxuVGhlIGBgcHJvcGVydHkoKWBgIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGFzIGEgZGF0YSBkZXNjcmlwdG9yLlxuQWNjb3JkaW5nbHksIGluc3RhbmNlcyBjYW5ub3Qgb3ZlcnJpZGUgdGhlIGJlaGF2aW9yIG9mIGEgcHJvcGVydHkuXG5cblxuX19zbG90c19fXG4tLS0tLS0tLS1cblxuQnkgZGVmYXVsdCwgaW5zdGFuY2VzIG9mIGJvdGggb2xkIGFuZCBuZXctc3R5bGUgY2xhc3NlcyBoYXZlIGFcbmRpY3Rpb25hcnkgZm9yIGF0dHJpYnV0ZSBzdG9yYWdlLiAgVGhpcyB3YXN0ZXMgc3BhY2UgZm9yIG9iamVjdHNcbmhhdmluZyB2ZXJ5IGZldyBpbnN0YW5jZSB2YXJpYWJsZXMuICBUaGUgc3BhY2UgY29uc3VtcHRpb24gY2FuIGJlY29tZVxuYWN1dGUgd2hlbiBjcmVhdGluZyBsYXJnZSBudW1iZXJzIG9mIGluc3RhbmNlcy5cblxuVGhlIGRlZmF1bHQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgZGVmaW5pbmcgKl9fc2xvdHNfXyogaW4gYSBuZXctc3R5bGVcbmNsYXNzIGRlZmluaXRpb24uICBUaGUgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gdGFrZXMgYSBzZXF1ZW5jZSBvZlxuaW5zdGFuY2UgdmFyaWFibGVzIGFuZCByZXNlcnZlcyBqdXN0IGVub3VnaCBzcGFjZSBpbiBlYWNoIGluc3RhbmNlIHRvXG5ob2xkIGEgdmFsdWUgZm9yIGVhY2ggdmFyaWFibGUuICBTcGFjZSBpcyBzYXZlZCBiZWNhdXNlICpfX2RpY3RfXyogaXNcbm5vdCBjcmVhdGVkIGZvciBlYWNoIGluc3RhbmNlLlxuXG5fX3Nsb3RzX19cblxuICAgVGhpcyBjbGFzcyB2YXJpYWJsZSBjYW4gYmUgYXNzaWduZWQgYSBzdHJpbmcsIGl0ZXJhYmxlLCBvciBzZXF1ZW5jZVxuICAgb2Ygc3RyaW5ncyB3aXRoIHZhcmlhYmxlIG5hbWVzIHVzZWQgYnkgaW5zdGFuY2VzLiAgSWYgZGVmaW5lZCBpbiBhXG4gICBuZXctc3R5bGUgY2xhc3MsICpfX3Nsb3RzX18qIHJlc2VydmVzIHNwYWNlIGZvciB0aGUgZGVjbGFyZWRcbiAgIHZhcmlhYmxlcyBhbmQgcHJldmVudHMgdGhlIGF1dG9tYXRpYyBjcmVhdGlvbiBvZiAqX19kaWN0X18qIGFuZFxuICAgKl9fd2Vha3JlZl9fKiBmb3IgZWFjaCBpbnN0YW5jZS5cblxuICAgTmV3IGluIHZlcnNpb24gMi4yLlxuXG5Ob3RlcyBvbiB1c2luZyAqX19zbG90c19fKlxuXG4qIFdoZW4gaW5oZXJpdGluZyBmcm9tIGEgY2xhc3Mgd2l0aG91dCAqX19zbG90c19fKiwgdGhlICpfX2RpY3RfXypcbiAgYXR0cmlidXRlIG9mIHRoYXQgY2xhc3Mgd2lsbCBhbHdheXMgYmUgYWNjZXNzaWJsZSwgc28gYSAqX19zbG90c19fKlxuICBkZWZpbml0aW9uIGluIHRoZSBzdWJjbGFzcyBpcyBtZWFuaW5nbGVzcy5cblxuKiBXaXRob3V0IGEgKl9fZGljdF9fKiB2YXJpYWJsZSwgaW5zdGFuY2VzIGNhbm5vdCBiZSBhc3NpZ25lZCBuZXdcbiAgdmFyaWFibGVzIG5vdCBsaXN0ZWQgaW4gdGhlICpfX3Nsb3RzX18qIGRlZmluaXRpb24uICBBdHRlbXB0cyB0b1xuICBhc3NpZ24gdG8gYW4gdW5saXN0ZWQgdmFyaWFibGUgbmFtZSByYWlzZXMgYGBBdHRyaWJ1dGVFcnJvcmBgLiBJZlxuICBkeW5hbWljIGFzc2lnbm1lbnQgb2YgbmV3IHZhcmlhYmxlcyBpcyBkZXNpcmVkLCB0aGVuIGFkZFxuICBgYFwnX19kaWN0X19cJ2BgIHRvIHRoZSBzZXF1ZW5jZSBvZiBzdHJpbmdzIGluIHRoZSAqX19zbG90c19fKlxuICBkZWNsYXJhdGlvbi5cblxuICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBQcmV2aW91c2x5LCBhZGRpbmcgYGBcJ19fZGljdF9fXCdgYCB0byB0aGVcbiAgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gd291bGQgbm90IGVuYWJsZSB0aGUgYXNzaWdubWVudCBvZiBuZXdcbiAgYXR0cmlidXRlcyBub3Qgc3BlY2lmaWNhbGx5IGxpc3RlZCBpbiB0aGUgc2VxdWVuY2Ugb2YgaW5zdGFuY2VcbiAgdmFyaWFibGUgbmFtZXMuXG5cbiogV2l0aG91dCBhICpfX3dlYWtyZWZfXyogdmFyaWFibGUgZm9yIGVhY2ggaW5zdGFuY2UsIGNsYXNzZXMgZGVmaW5pbmdcbiAgKl9fc2xvdHNfXyogZG8gbm90IHN1cHBvcnQgd2VhayByZWZlcmVuY2VzIHRvIGl0cyBpbnN0YW5jZXMuIElmIHdlYWtcbiAgcmVmZXJlbmNlIHN1cHBvcnQgaXMgbmVlZGVkLCB0aGVuIGFkZCBgYFwnX193ZWFrcmVmX19cJ2BgIHRvIHRoZVxuICBzZXF1ZW5jZSBvZiBzdHJpbmdzIGluIHRoZSAqX19zbG90c19fKiBkZWNsYXJhdGlvbi5cblxuICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBQcmV2aW91c2x5LCBhZGRpbmcgYGBcJ19fd2Vha3JlZl9fXCdgYCB0byB0aGVcbiAgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gd291bGQgbm90IGVuYWJsZSBzdXBwb3J0IGZvciB3ZWFrXG4gIHJlZmVyZW5jZXMuXG5cbiogKl9fc2xvdHNfXyogYXJlIGltcGxlbWVudGVkIGF0IHRoZSBjbGFzcyBsZXZlbCBieSBjcmVhdGluZ1xuICBkZXNjcmlwdG9ycyAoKkltcGxlbWVudGluZyBEZXNjcmlwdG9ycyopIGZvciBlYWNoIHZhcmlhYmxlIG5hbWUuICBBc1xuICBhIHJlc3VsdCwgY2xhc3MgYXR0cmlidXRlcyBjYW5ub3QgYmUgdXNlZCB0byBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yXG4gIGluc3RhbmNlIHZhcmlhYmxlcyBkZWZpbmVkIGJ5ICpfX3Nsb3RzX18qOyBvdGhlcndpc2UsIHRoZSBjbGFzc1xuICBhdHRyaWJ1dGUgd291bGQgb3ZlcndyaXRlIHRoZSBkZXNjcmlwdG9yIGFzc2lnbm1lbnQuXG5cbiogVGhlIGFjdGlvbiBvZiBhICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIGlzIGxpbWl0ZWQgdG8gdGhlIGNsYXNzXG4gIHdoZXJlIGl0IGlzIGRlZmluZWQuICBBcyBhIHJlc3VsdCwgc3ViY2xhc3NlcyB3aWxsIGhhdmUgYSAqX19kaWN0X18qXG4gIHVubGVzcyB0aGV5IGFsc28gZGVmaW5lICpfX3Nsb3RzX18qICh3aGljaCBtdXN0IG9ubHkgY29udGFpbiBuYW1lc1xuICBvZiBhbnkgKmFkZGl0aW9uYWwqIHNsb3RzKS5cblxuKiBJZiBhIGNsYXNzIGRlZmluZXMgYSBzbG90IGFsc28gZGVmaW5lZCBpbiBhIGJhc2UgY2xhc3MsIHRoZSBpbnN0YW5jZVxuICB2YXJpYWJsZSBkZWZpbmVkIGJ5IHRoZSBiYXNlIGNsYXNzIHNsb3QgaXMgaW5hY2Nlc3NpYmxlIChleGNlcHQgYnlcbiAgcmV0cmlldmluZyBpdHMgZGVzY3JpcHRvciBkaXJlY3RseSBmcm9tIHRoZSBiYXNlIGNsYXNzKS4gVGhpc1xuICByZW5kZXJzIHRoZSBtZWFuaW5nIG9mIHRoZSBwcm9ncmFtIHVuZGVmaW5lZC4gIEluIHRoZSBmdXR1cmUsIGFcbiAgY2hlY2sgbWF5IGJlIGFkZGVkIHRvIHByZXZlbnQgdGhpcy5cblxuKiBOb25lbXB0eSAqX19zbG90c19fKiBkb2VzIG5vdCB3b3JrIGZvciBjbGFzc2VzIGRlcml2ZWQgZnJvbVxuICAidmFyaWFibGUtbGVuZ3RoIiBidWlsdC1pbiB0eXBlcyBzdWNoIGFzIGBgbG9uZ2BgLCBgYHN0cmBgIGFuZFxuICBgYHR1cGxlYGAuXG5cbiogQW55IG5vbi1zdHJpbmcgaXRlcmFibGUgbWF5IGJlIGFzc2lnbmVkIHRvICpfX3Nsb3RzX18qLiBNYXBwaW5ncyBtYXlcbiAgYWxzbyBiZSB1c2VkOyBob3dldmVyLCBpbiB0aGUgZnV0dXJlLCBzcGVjaWFsIG1lYW5pbmcgbWF5IGJlXG4gIGFzc2lnbmVkIHRvIHRoZSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBlYWNoIGtleS5cblxuKiAqX19jbGFzc19fKiBhc3NpZ25tZW50IHdvcmtzIG9ubHkgaWYgYm90aCBjbGFzc2VzIGhhdmUgdGhlIHNhbWVcbiAgKl9fc2xvdHNfXyouXG5cbiAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNjogUHJldmlvdXNseSwgKl9fY2xhc3NfXyogYXNzaWdubWVudCByYWlzZWQgYW5cbiAgZXJyb3IgaWYgZWl0aGVyIG5ldyBvciBvbGQgY2xhc3MgaGFkICpfX3Nsb3RzX18qLlxuXG5cbkN1c3RvbWl6aW5nIGNsYXNzIGNyZWF0aW9uXG49PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5CeSBkZWZhdWx0LCBuZXctc3R5bGUgY2xhc3NlcyBhcmUgY29uc3RydWN0ZWQgdXNpbmcgYGB0eXBlKClgYC4gQVxuY2xhc3MgZGVmaW5pdGlvbiBpcyByZWFkIGludG8gYSBzZXBhcmF0ZSBuYW1lc3BhY2UgYW5kIHRoZSB2YWx1ZSBvZlxuY2xhc3MgbmFtZSBpcyBib3VuZCB0byB0aGUgcmVzdWx0IG9mIGBgdHlwZShuYW1lLCBiYXNlcywgZGljdClgYC5cblxuV2hlbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBpcyByZWFkLCBpZiAqX19tZXRhY2xhc3NfXyogaXMgZGVmaW5lZCB0aGVuXG50aGUgY2FsbGFibGUgYXNzaWduZWQgdG8gaXQgd2lsbCBiZSBjYWxsZWQgaW5zdGVhZCBvZiBgYHR5cGUoKWBgLiBUaGlzXG5hbGxvd3MgY2xhc3NlcyBvciBmdW5jdGlvbnMgdG8gYmUgd3JpdHRlbiB3aGljaCBtb25pdG9yIG9yIGFsdGVyIHRoZVxuY2xhc3MgY3JlYXRpb24gcHJvY2VzczpcblxuKiBNb2RpZnlpbmcgdGhlIGNsYXNzIGRpY3Rpb25hcnkgcHJpb3IgdG8gdGhlIGNsYXNzIGJlaW5nIGNyZWF0ZWQuXG5cbiogUmV0dXJuaW5nIGFuIGluc3RhbmNlIG9mIGFub3RoZXIgY2xhc3MgLS0gZXNzZW50aWFsbHkgcGVyZm9ybWluZyB0aGVcbiAgcm9sZSBvZiBhIGZhY3RvcnkgZnVuY3Rpb24uXG5cblRoZXNlIHN0ZXBzIHdpbGwgaGF2ZSB0byBiZSBwZXJmb3JtZWQgaW4gdGhlIG1ldGFjbGFzc1wncyBgYF9fbmV3X18oKWBgXG5tZXRob2QgLS0gYGB0eXBlLl9fbmV3X18oKWBgIGNhbiB0aGVuIGJlIGNhbGxlZCBmcm9tIHRoaXMgbWV0aG9kIHRvXG5jcmVhdGUgYSBjbGFzcyB3aXRoIGRpZmZlcmVudCBwcm9wZXJ0aWVzLiAgVGhpcyBleGFtcGxlIGFkZHMgYSBuZXdcbmVsZW1lbnQgdG8gdGhlIGNsYXNzIGRpY3Rpb25hcnkgYmVmb3JlIGNyZWF0aW5nIHRoZSBjbGFzczpcblxuICAgY2xhc3MgbWV0YWNscyh0eXBlKTpcbiAgICAgICBkZWYgX19uZXdfXyhtY3MsIG5hbWUsIGJhc2VzLCBkaWN0KTpcbiAgICAgICAgICAgZGljdFtcJ2Zvb1wnXSA9IFwnbWV0YWNscyB3YXMgaGVyZVwnXG4gICAgICAgICAgIHJldHVybiB0eXBlLl9fbmV3X18obWNzLCBuYW1lLCBiYXNlcywgZGljdClcblxuWW91IGNhbiBvZiBjb3Vyc2UgYWxzbyBvdmVycmlkZSBvdGhlciBjbGFzcyBtZXRob2RzIChvciBhZGQgbmV3XG5tZXRob2RzKTsgZm9yIGV4YW1wbGUgZGVmaW5pbmcgYSBjdXN0b20gYGBfX2NhbGxfXygpYGAgbWV0aG9kIGluIHRoZVxubWV0YWNsYXNzIGFsbG93cyBjdXN0b20gYmVoYXZpb3Igd2hlbiB0aGUgY2xhc3MgaXMgY2FsbGVkLCBlLmcuIG5vdFxuYWx3YXlzIGNyZWF0aW5nIGEgbmV3IGluc3RhbmNlLlxuXG5fX21ldGFjbGFzc19fXG5cbiAgIFRoaXMgdmFyaWFibGUgY2FuIGJlIGFueSBjYWxsYWJsZSBhY2NlcHRpbmcgYXJndW1lbnRzIGZvciBgYG5hbWVgYCxcbiAgIGBgYmFzZXNgYCwgYW5kIGBgZGljdGBgLiAgVXBvbiBjbGFzcyBjcmVhdGlvbiwgdGhlIGNhbGxhYmxlIGlzIHVzZWRcbiAgIGluc3RlYWQgb2YgdGhlIGJ1aWx0LWluIGBgdHlwZSgpYGAuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDIuMi5cblxuVGhlIGFwcHJvcHJpYXRlIG1ldGFjbGFzcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBmb2xsb3dpbmcgcHJlY2VkZW5jZVxucnVsZXM6XG5cbiogSWYgYGBkaWN0W1wnX19tZXRhY2xhc3NfX1wnXWBgIGV4aXN0cywgaXQgaXMgdXNlZC5cblxuKiBPdGhlcndpc2UsIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBiYXNlIGNsYXNzLCBpdHMgbWV0YWNsYXNzIGlzXG4gIHVzZWQgKHRoaXMgbG9va3MgZm9yIGEgKl9fY2xhc3NfXyogYXR0cmlidXRlIGZpcnN0IGFuZCBpZiBub3QgZm91bmQsXG4gIHVzZXMgaXRzIHR5cGUpLlxuXG4qIE90aGVyd2lzZSwgaWYgYSBnbG9iYWwgdmFyaWFibGUgbmFtZWQgX19tZXRhY2xhc3NfXyBleGlzdHMsIGl0IGlzXG4gIHVzZWQuXG5cbiogT3RoZXJ3aXNlLCB0aGUgb2xkLXN0eWxlLCBjbGFzc2ljIG1ldGFjbGFzcyAodHlwZXMuQ2xhc3NUeXBlKSBpc1xuICB1c2VkLlxuXG5UaGUgcG90ZW50aWFsIHVzZXMgZm9yIG1ldGFjbGFzc2VzIGFyZSBib3VuZGxlc3MuIFNvbWUgaWRlYXMgdGhhdCBoYXZlXG5iZWVuIGV4cGxvcmVkIGluY2x1ZGluZyBsb2dnaW5nLCBpbnRlcmZhY2UgY2hlY2tpbmcsIGF1dG9tYXRpY1xuZGVsZWdhdGlvbiwgYXV0b21hdGljIHByb3BlcnR5IGNyZWF0aW9uLCBwcm94aWVzLCBmcmFtZXdvcmtzLCBhbmRcbmF1dG9tYXRpYyByZXNvdXJjZSBsb2NraW5nL3N5bmNocm9uaXphdGlvbi5cblxuXG5DdXN0b21pemluZyBpbnN0YW5jZSBhbmQgc3ViY2xhc3MgY2hlY2tzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbk5ldyBpbiB2ZXJzaW9uIDIuNi5cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoZVxuYGBpc2luc3RhbmNlKClgYCBhbmQgYGBpc3N1YmNsYXNzKClgYCBidWlsdC1pbiBmdW5jdGlvbnMuXG5cbkluIHBhcnRpY3VsYXIsIHRoZSBtZXRhY2xhc3MgYGBhYmMuQUJDTWV0YWBgIGltcGxlbWVudHMgdGhlc2UgbWV0aG9kc1xuaW4gb3JkZXIgdG8gYWxsb3cgdGhlIGFkZGl0aW9uIG9mIEFic3RyYWN0IEJhc2UgQ2xhc3NlcyAoQUJDcykgYXNcbiJ2aXJ0dWFsIGJhc2UgY2xhc3NlcyIgdG8gYW55IGNsYXNzIG9yIHR5cGUgKGluY2x1ZGluZyBidWlsdC1pblxudHlwZXMpLCBpbmNsdWRpbmcgb3RoZXIgQUJDcy5cblxuY2xhc3MuX19pbnN0YW5jZWNoZWNrX18oc2VsZiwgaW5zdGFuY2UpXG5cbiAgIFJldHVybiB0cnVlIGlmICppbnN0YW5jZSogc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSAoZGlyZWN0IG9yXG4gICBpbmRpcmVjdCkgaW5zdGFuY2Ugb2YgKmNsYXNzKi4gSWYgZGVmaW5lZCwgY2FsbGVkIHRvIGltcGxlbWVudFxuICAgYGBpc2luc3RhbmNlKGluc3RhbmNlLCBjbGFzcylgYC5cblxuY2xhc3MuX19zdWJjbGFzc2NoZWNrX18oc2VsZiwgc3ViY2xhc3MpXG5cbiAgIFJldHVybiB0cnVlIGlmICpzdWJjbGFzcyogc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSAoZGlyZWN0IG9yXG4gICBpbmRpcmVjdCkgc3ViY2xhc3Mgb2YgKmNsYXNzKi4gIElmIGRlZmluZWQsIGNhbGxlZCB0byBpbXBsZW1lbnRcbiAgIGBgaXNzdWJjbGFzcyhzdWJjbGFzcywgY2xhc3MpYGAuXG5cbk5vdGUgdGhhdCB0aGVzZSBtZXRob2RzIGFyZSBsb29rZWQgdXAgb24gdGhlIHR5cGUgKG1ldGFjbGFzcykgb2YgYVxuY2xhc3MuICBUaGV5IGNhbm5vdCBiZSBkZWZpbmVkIGFzIGNsYXNzIG1ldGhvZHMgaW4gdGhlIGFjdHVhbCBjbGFzcy5cblRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBsb29rdXAgb2Ygc3BlY2lhbCBtZXRob2RzIHRoYXQgYXJlIGNhbGxlZFxub24gaW5zdGFuY2VzLCBvbmx5IGluIHRoaXMgY2FzZSB0aGUgaW5zdGFuY2UgaXMgaXRzZWxmIGEgY2xhc3MuXG5cblNlZSBhbHNvOlxuXG4gICAqKlBFUCAzMTE5KiogLSBJbnRyb2R1Y2luZyBBYnN0cmFjdCBCYXNlIENsYXNzZXNcbiAgICAgIEluY2x1ZGVzIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBjdXN0b21pemluZyBgYGlzaW5zdGFuY2UoKWBgIGFuZFxuICAgICAgYGBpc3N1YmNsYXNzKClgYCBiZWhhdmlvciB0aHJvdWdoIGBgX19pbnN0YW5jZWNoZWNrX18oKWBgIGFuZFxuICAgICAgYGBfX3N1YmNsYXNzY2hlY2tfXygpYGAsIHdpdGggbW90aXZhdGlvbiBmb3IgdGhpcyBmdW5jdGlvbmFsaXR5XG4gICAgICBpbiB0aGUgY29udGV4dCBvZiBhZGRpbmcgQWJzdHJhY3QgQmFzZSBDbGFzc2VzIChzZWUgdGhlIGBgYWJjYGBcbiAgICAgIG1vZHVsZSkgdG8gdGhlIGxhbmd1YWdlLlxuXG5cbkVtdWxhdGluZyBjYWxsYWJsZSBvYmplY3RzXG49PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5vYmplY3QuX19jYWxsX18oc2VsZlssIGFyZ3MuLi5dKVxuXG4gICBDYWxsZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgImNhbGxlZCIgYXMgYSBmdW5jdGlvbjsgaWYgdGhpcyBtZXRob2RcbiAgIGlzIGRlZmluZWQsIGBgeChhcmcxLCBhcmcyLCAuLi4pYGAgaXMgYSBzaG9ydGhhbmQgZm9yXG4gICBgYHguX19jYWxsX18oYXJnMSwgYXJnMiwgLi4uKWBgLlxuXG5cbkVtdWxhdGluZyBjb250YWluZXIgdHlwZXNcbj09PT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGltcGxlbWVudCBjb250YWluZXIgb2JqZWN0cy5cbkNvbnRhaW5lcnMgdXN1YWxseSBhcmUgc2VxdWVuY2VzIChzdWNoIGFzIGxpc3RzIG9yIHR1cGxlcykgb3IgbWFwcGluZ3NcbihsaWtlIGRpY3Rpb25hcmllcyksIGJ1dCBjYW4gcmVwcmVzZW50IG90aGVyIGNvbnRhaW5lcnMgYXMgd2VsbC4gIFRoZVxuZmlyc3Qgc2V0IG9mIG1ldGhvZHMgaXMgdXNlZCBlaXRoZXIgdG8gZW11bGF0ZSBhIHNlcXVlbmNlIG9yIHRvXG5lbXVsYXRlIGEgbWFwcGluZzsgdGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBmb3IgYSBzZXF1ZW5jZSwgdGhlXG5hbGxvd2FibGUga2V5cyBzaG91bGQgYmUgdGhlIGludGVnZXJzICprKiBmb3Igd2hpY2ggYGAwIDw9IGsgPCBOYGBcbndoZXJlICpOKiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSwgb3Igc2xpY2Ugb2JqZWN0cywgd2hpY2hcbmRlZmluZSBhIHJhbmdlIG9mIGl0ZW1zLiAoRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB0aGUgbWV0aG9kXG5gYF9fZ2V0c2xpY2VfXygpYGAgKHNlZSBiZWxvdykgY2FuIGFsc28gYmUgZGVmaW5lZCB0byBoYW5kbGUgc2ltcGxlLFxuYnV0IG5vdCBleHRlbmRlZCBzbGljZXMuKSBJdCBpcyBhbHNvIHJlY29tbWVuZGVkIHRoYXQgbWFwcGluZ3MgcHJvdmlkZVxudGhlIG1ldGhvZHMgYGBrZXlzKClgYCwgYGB2YWx1ZXMoKWBgLCBgYGl0ZW1zKClgYCwgYGBoYXNfa2V5KClgYCxcbmBgZ2V0KClgYCwgYGBjbGVhcigpYGAsIGBgc2V0ZGVmYXVsdCgpYGAsIGBgaXRlcmtleXMoKWBgLFxuYGBpdGVydmFsdWVzKClgYCwgYGBpdGVyaXRlbXMoKWBgLCBgYHBvcCgpYGAsIGBgcG9waXRlbSgpYGAsXG5gYGNvcHkoKWBgLCBhbmQgYGB1cGRhdGUoKWBgIGJlaGF2aW5nIHNpbWlsYXIgdG8gdGhvc2UgZm9yIFB5dGhvblwnc1xuc3RhbmRhcmQgZGljdGlvbmFyeSBvYmplY3RzLiAgVGhlIGBgVXNlckRpY3RgYCBtb2R1bGUgcHJvdmlkZXMgYVxuYGBEaWN0TWl4aW5gYCBjbGFzcyB0byBoZWxwIGNyZWF0ZSB0aG9zZSBtZXRob2RzIGZyb20gYSBiYXNlIHNldCBvZlxuYGBfX2dldGl0ZW1fXygpYGAsIGBgX19zZXRpdGVtX18oKWBgLCBgYF9fZGVsaXRlbV9fKClgYCwgYW5kXG5gYGtleXMoKWBgLiBNdXRhYmxlIHNlcXVlbmNlcyBzaG91bGQgcHJvdmlkZSBtZXRob2RzIGBgYXBwZW5kKClgYCxcbmBgY291bnQoKWBgLCBgYGluZGV4KClgYCwgYGBleHRlbmQoKWBgLCBgYGluc2VydCgpYGAsIGBgcG9wKClgYCxcbmBgcmVtb3ZlKClgYCwgYGByZXZlcnNlKClgYCBhbmQgYGBzb3J0KClgYCwgbGlrZSBQeXRob24gc3RhbmRhcmQgbGlzdFxub2JqZWN0cy4gIEZpbmFsbHksIHNlcXVlbmNlIHR5cGVzIHNob3VsZCBpbXBsZW1lbnQgYWRkaXRpb24gKG1lYW5pbmdcbmNvbmNhdGVuYXRpb24pIGFuZCBtdWx0aXBsaWNhdGlvbiAobWVhbmluZyByZXBldGl0aW9uKSBieSBkZWZpbmluZyB0aGVcbm1ldGhvZHMgYGBfX2FkZF9fKClgYCwgYGBfX3JhZGRfXygpYGAsIGBgX19pYWRkX18oKWBgLCBgYF9fbXVsX18oKWBgLFxuYGBfX3JtdWxfXygpYGAgYW5kIGBgX19pbXVsX18oKWBgIGRlc2NyaWJlZCBiZWxvdzsgdGhleSBzaG91bGQgbm90XG5kZWZpbmUgYGBfX2NvZXJjZV9fKClgYCBvciBvdGhlciBudW1lcmljYWwgb3BlcmF0b3JzLiAgSXQgaXNcbnJlY29tbWVuZGVkIHRoYXQgYm90aCBtYXBwaW5ncyBhbmQgc2VxdWVuY2VzIGltcGxlbWVudCB0aGVcbmBgX19jb250YWluc19fKClgYCBtZXRob2QgdG8gYWxsb3cgZWZmaWNpZW50IHVzZSBvZiB0aGUgYGBpbmBgXG5vcGVyYXRvcjsgZm9yIG1hcHBpbmdzLCBgYGluYGAgc2hvdWxkIGJlIGVxdWl2YWxlbnQgb2YgYGBoYXNfa2V5KClgYDtcbmZvciBzZXF1ZW5jZXMsIGl0IHNob3VsZCBzZWFyY2ggdGhyb3VnaCB0aGUgdmFsdWVzLiAgSXQgaXMgZnVydGhlclxucmVjb21tZW5kZWQgdGhhdCBib3RoIG1hcHBpbmdzIGFuZCBzZXF1ZW5jZXMgaW1wbGVtZW50IHRoZVxuYGBfX2l0ZXJfXygpYGAgbWV0aG9kIHRvIGFsbG93IGVmZmljaWVudCBpdGVyYXRpb24gdGhyb3VnaCB0aGVcbmNvbnRhaW5lcjsgZm9yIG1hcHBpbmdzLCBgYF9faXRlcl9fKClgYCBzaG91bGQgYmUgdGhlIHNhbWUgYXNcbmBgaXRlcmtleXMoKWBgOyBmb3Igc2VxdWVuY2VzLCBpdCBzaG91bGQgaXRlcmF0ZSB0aHJvdWdoIHRoZSB2YWx1ZXMuXG5cbm9iamVjdC5fX2xlbl9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGBgbGVuKClgYC4gIFNob3VsZCByZXR1cm5cbiAgIHRoZSBsZW5ndGggb2YgdGhlIG9iamVjdCwgYW4gaW50ZWdlciBgYD49YGAgMC4gIEFsc28sIGFuIG9iamVjdFxuICAgdGhhdCBkb2VzblwndCBkZWZpbmUgYSBgYF9fbm9uemVyb19fKClgYCBtZXRob2QgYW5kIHdob3NlXG4gICBgYF9fbGVuX18oKWBgIG1ldGhvZCByZXR1cm5zIHplcm8gaXMgY29uc2lkZXJlZCB0byBiZSBmYWxzZSBpbiBhXG4gICBCb29sZWFuIGNvbnRleHQuXG5cbm9iamVjdC5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgZXZhbHVhdGlvbiBvZiBgYHNlbGZba2V5XWBgLiBGb3Igc2VxdWVuY2VcbiAgIHR5cGVzLCB0aGUgYWNjZXB0ZWQga2V5cyBzaG91bGQgYmUgaW50ZWdlcnMgYW5kIHNsaWNlIG9iamVjdHMuXG4gICBOb3RlIHRoYXQgdGhlIHNwZWNpYWwgaW50ZXJwcmV0YXRpb24gb2YgbmVnYXRpdmUgaW5kZXhlcyAoaWYgdGhlXG4gICBjbGFzcyB3aXNoZXMgdG8gZW11bGF0ZSBhIHNlcXVlbmNlIHR5cGUpIGlzIHVwIHRvIHRoZVxuICAgYGBfX2dldGl0ZW1fXygpYGAgbWV0aG9kLiBJZiAqa2V5KiBpcyBvZiBhbiBpbmFwcHJvcHJpYXRlIHR5cGUsXG4gICBgYFR5cGVFcnJvcmBgIG1heSBiZSByYWlzZWQ7IGlmIG9mIGEgdmFsdWUgb3V0c2lkZSB0aGUgc2V0IG9mXG4gICBpbmRleGVzIGZvciB0aGUgc2VxdWVuY2UgKGFmdGVyIGFueSBzcGVjaWFsIGludGVycHJldGF0aW9uIG9mXG4gICBuZWdhdGl2ZSB2YWx1ZXMpLCBgYEluZGV4RXJyb3JgYCBzaG91bGQgYmUgcmFpc2VkLiBGb3IgbWFwcGluZ1xuICAgdHlwZXMsIGlmICprZXkqIGlzIG1pc3NpbmcgKG5vdCBpbiB0aGUgY29udGFpbmVyKSwgYGBLZXlFcnJvcmBgXG4gICBzaG91bGQgYmUgcmFpc2VkLlxuXG4gICBOb3RlOiBgYGZvcmBgIGxvb3BzIGV4cGVjdCB0aGF0IGFuIGBgSW5kZXhFcnJvcmBgIHdpbGwgYmUgcmFpc2VkIGZvclxuICAgICBpbGxlZ2FsIGluZGV4ZXMgdG8gYWxsb3cgcHJvcGVyIGRldGVjdGlvbiBvZiB0aGUgZW5kIG9mIHRoZVxuICAgICBzZXF1ZW5jZS5cblxub2JqZWN0Ll9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgYXNzaWdubWVudCB0byBgYHNlbGZba2V5XWBgLiAgU2FtZSBub3RlIGFzIGZvclxuICAgYGBfX2dldGl0ZW1fXygpYGAuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGZvciBtYXBwaW5ncyBpZlxuICAgdGhlIG9iamVjdHMgc3VwcG9ydCBjaGFuZ2VzIHRvIHRoZSB2YWx1ZXMgZm9yIGtleXMsIG9yIGlmIG5ldyBrZXlzXG4gICBjYW4gYmUgYWRkZWQsIG9yIGZvciBzZXF1ZW5jZXMgaWYgZWxlbWVudHMgY2FuIGJlIHJlcGxhY2VkLiAgVGhlXG4gICBzYW1lIGV4Y2VwdGlvbnMgc2hvdWxkIGJlIHJhaXNlZCBmb3IgaW1wcm9wZXIgKmtleSogdmFsdWVzIGFzIGZvclxuICAgdGhlIGBgX19nZXRpdGVtX18oKWBgIG1ldGhvZC5cblxub2JqZWN0Ll9fZGVsaXRlbV9fKHNlbGYsIGtleSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBkZWxldGlvbiBvZiBgYHNlbGZba2V5XWBgLiAgU2FtZSBub3RlIGFzIGZvclxuICAgYGBfX2dldGl0ZW1fXygpYGAuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGZvciBtYXBwaW5ncyBpZlxuICAgdGhlIG9iamVjdHMgc3VwcG9ydCByZW1vdmFsIG9mIGtleXMsIG9yIGZvciBzZXF1ZW5jZXMgaWYgZWxlbWVudHNcbiAgIGNhbiBiZSByZW1vdmVkIGZyb20gdGhlIHNlcXVlbmNlLiAgVGhlIHNhbWUgZXhjZXB0aW9ucyBzaG91bGQgYmVcbiAgIHJhaXNlZCBmb3IgaW1wcm9wZXIgKmtleSogdmFsdWVzIGFzIGZvciB0aGUgYGBfX2dldGl0ZW1fXygpYGBcbiAgIG1ldGhvZC5cblxub2JqZWN0Ll9faXRlcl9fKHNlbGYpXG5cbiAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIGl0ZXJhdG9yIGlzIHJlcXVpcmVkIGZvciBhIGNvbnRhaW5lci5cbiAgIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gYSBuZXcgaXRlcmF0b3Igb2JqZWN0IHRoYXQgY2FuIGl0ZXJhdGVcbiAgIG92ZXIgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjb250YWluZXIuICBGb3IgbWFwcGluZ3MsIGl0IHNob3VsZFxuICAgaXRlcmF0ZSBvdmVyIHRoZSBrZXlzIG9mIHRoZSBjb250YWluZXIsIGFuZCBzaG91bGQgYWxzbyBiZSBtYWRlXG4gICBhdmFpbGFibGUgYXMgdGhlIG1ldGhvZCBgYGl0ZXJrZXlzKClgYC5cblxuICAgSXRlcmF0b3Igb2JqZWN0cyBhbHNvIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kOyB0aGV5IGFyZVxuICAgcmVxdWlyZWQgdG8gcmV0dXJuIHRoZW1zZWx2ZXMuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBpdGVyYXRvclxuICAgb2JqZWN0cywgc2VlICpJdGVyYXRvciBUeXBlcyouXG5cbm9iamVjdC5fX3JldmVyc2VkX18oc2VsZilcblxuICAgQ2FsbGVkIChpZiBwcmVzZW50KSBieSB0aGUgYGByZXZlcnNlZCgpYGAgYnVpbHQtaW4gdG8gaW1wbGVtZW50XG4gICByZXZlcnNlIGl0ZXJhdGlvbi4gIEl0IHNob3VsZCByZXR1cm4gYSBuZXcgaXRlcmF0b3Igb2JqZWN0IHRoYXRcbiAgIGl0ZXJhdGVzIG92ZXIgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjb250YWluZXIgaW4gcmV2ZXJzZSBvcmRlci5cblxuICAgSWYgdGhlIGBgX19yZXZlcnNlZF9fKClgYCBtZXRob2QgaXMgbm90IHByb3ZpZGVkLCB0aGVcbiAgIGBgcmV2ZXJzZWQoKWBgIGJ1aWx0LWluIHdpbGwgZmFsbCBiYWNrIHRvIHVzaW5nIHRoZSBzZXF1ZW5jZVxuICAgcHJvdG9jb2wgKGBgX19sZW5fXygpYGAgYW5kIGBgX19nZXRpdGVtX18oKWBgKS4gIE9iamVjdHMgdGhhdFxuICAgc3VwcG9ydCB0aGUgc2VxdWVuY2UgcHJvdG9jb2wgc2hvdWxkIG9ubHkgcHJvdmlkZVxuICAgYGBfX3JldmVyc2VkX18oKWBgIGlmIHRoZXkgY2FuIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gdGhhdCBpc1xuICAgbW9yZSBlZmZpY2llbnQgdGhhbiB0aGUgb25lIHByb3ZpZGVkIGJ5IGBgcmV2ZXJzZWQoKWBgLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjYuXG5cblRoZSBtZW1iZXJzaGlwIHRlc3Qgb3BlcmF0b3JzIChgYGluYGAgYW5kIGBgbm90IGluYGApIGFyZSBub3JtYWxseVxuaW1wbGVtZW50ZWQgYXMgYW4gaXRlcmF0aW9uIHRocm91Z2ggYSBzZXF1ZW5jZS4gIEhvd2V2ZXIsIGNvbnRhaW5lclxub2JqZWN0cyBjYW4gc3VwcGx5IHRoZSBmb2xsb3dpbmcgc3BlY2lhbCBtZXRob2Qgd2l0aCBhIG1vcmUgZWZmaWNpZW50XG5pbXBsZW1lbnRhdGlvbiwgd2hpY2ggYWxzbyBkb2VzIG5vdCByZXF1aXJlIHRoZSBvYmplY3QgYmUgYSBzZXF1ZW5jZS5cblxub2JqZWN0Ll9fY29udGFpbnNfXyhzZWxmLCBpdGVtKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IG1lbWJlcnNoaXAgdGVzdCBvcGVyYXRvcnMuICBTaG91bGQgcmV0dXJuIHRydWVcbiAgIGlmICppdGVtKiBpcyBpbiAqc2VsZiosIGZhbHNlIG90aGVyd2lzZS4gIEZvciBtYXBwaW5nIG9iamVjdHMsIHRoaXNcbiAgIHNob3VsZCBjb25zaWRlciB0aGUga2V5cyBvZiB0aGUgbWFwcGluZyByYXRoZXIgdGhhbiB0aGUgdmFsdWVzIG9yXG4gICB0aGUga2V5LWl0ZW0gcGFpcnMuXG5cbiAgIEZvciBvYmplY3RzIHRoYXQgZG9uXCd0IGRlZmluZSBgYF9fY29udGFpbnNfXygpYGAsIHRoZSBtZW1iZXJzaGlwXG4gICB0ZXN0IGZpcnN0IHRyaWVzIGl0ZXJhdGlvbiB2aWEgYGBfX2l0ZXJfXygpYGAsIHRoZW4gdGhlIG9sZFxuICAgc2VxdWVuY2UgaXRlcmF0aW9uIHByb3RvY29sIHZpYSBgYF9fZ2V0aXRlbV9fKClgYCwgc2VlICp0aGlzXG4gICBzZWN0aW9uIGluIHRoZSBsYW5ndWFnZSByZWZlcmVuY2UqLlxuXG5cbkFkZGl0aW9uYWwgbWV0aG9kcyBmb3IgZW11bGF0aW9uIG9mIHNlcXVlbmNlIHR5cGVzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgZm9sbG93aW5nIG9wdGlvbmFsIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gZnVydGhlciBlbXVsYXRlXG5zZXF1ZW5jZSBvYmplY3RzLiAgSW1tdXRhYmxlIHNlcXVlbmNlcyBtZXRob2RzIHNob3VsZCBhdCBtb3N0IG9ubHlcbmRlZmluZSBgYF9fZ2V0c2xpY2VfXygpYGA7IG11dGFibGUgc2VxdWVuY2VzIG1pZ2h0IGRlZmluZSBhbGwgdGhyZWVcbm1ldGhvZHMuXG5cbm9iamVjdC5fX2dldHNsaWNlX18oc2VsZiwgaSwgailcblxuICAgRGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuMDogU3VwcG9ydCBzbGljZSBvYmplY3RzIGFzIHBhcmFtZXRlcnNcbiAgIHRvIHRoZSBgYF9fZ2V0aXRlbV9fKClgYCBtZXRob2QuIChIb3dldmVyLCBidWlsdC1pbiB0eXBlcyBpblxuICAgQ1B5dGhvbiBjdXJyZW50bHkgc3RpbGwgaW1wbGVtZW50IGBgX19nZXRzbGljZV9fKClgYC4gIFRoZXJlZm9yZSxcbiAgIHlvdSBoYXZlIHRvIG92ZXJyaWRlIGl0IGluIGRlcml2ZWQgY2xhc3NlcyB3aGVuIGltcGxlbWVudGluZ1xuICAgc2xpY2luZy4pXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgZXZhbHVhdGlvbiBvZiBgYHNlbGZbaTpqXWBgLiBUaGUgcmV0dXJuZWRcbiAgIG9iamVjdCBzaG91bGQgYmUgb2YgdGhlIHNhbWUgdHlwZSBhcyAqc2VsZiouICBOb3RlIHRoYXQgbWlzc2luZyAqaSpcbiAgIG9yICpqKiBpbiB0aGUgc2xpY2UgZXhwcmVzc2lvbiBhcmUgcmVwbGFjZWQgYnkgemVybyBvclxuICAgYGBzeXMubWF4aW50YGAsIHJlc3BlY3RpdmVseS4gIElmIG5lZ2F0aXZlIGluZGV4ZXMgYXJlIHVzZWQgaW4gdGhlXG4gICBzbGljZSwgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UgaXMgYWRkZWQgdG8gdGhhdCBpbmRleC4gSWYgdGhlXG4gICBpbnN0YW5jZSBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGBgX19sZW5fXygpYGAgbWV0aG9kLCBhblxuICAgYGBBdHRyaWJ1dGVFcnJvcmBgIGlzIHJhaXNlZC4gTm8gZ3VhcmFudGVlIGlzIG1hZGUgdGhhdCBpbmRleGVzXG4gICBhZGp1c3RlZCB0aGlzIHdheSBhcmUgbm90IHN0aWxsIG5lZ2F0aXZlLiAgSW5kZXhlcyB3aGljaCBhcmVcbiAgIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSBhcmUgbm90IG1vZGlmaWVkLiBJZiBub1xuICAgYGBfX2dldHNsaWNlX18oKWBgIGlzIGZvdW5kLCBhIHNsaWNlIG9iamVjdCBpcyBjcmVhdGVkIGluc3RlYWQsIGFuZFxuICAgcGFzc2VkIHRvIGBgX19nZXRpdGVtX18oKWBgIGluc3RlYWQuXG5cbm9iamVjdC5fX3NldHNsaWNlX18oc2VsZiwgaSwgaiwgc2VxdWVuY2UpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgYXNzaWdubWVudCB0byBgYHNlbGZbaTpqXWBgLiBTYW1lIG5vdGVzIGZvciAqaSpcbiAgIGFuZCAqaiogYXMgZm9yIGBgX19nZXRzbGljZV9fKClgYC5cblxuICAgVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gSWYgbm8gYGBfX3NldHNsaWNlX18oKWBgIGlzIGZvdW5kLCBvclxuICAgZm9yIGV4dGVuZGVkIHNsaWNpbmcgb2YgdGhlIGZvcm0gYGBzZWxmW2k6ajprXWBgLCBhIHNsaWNlIG9iamVjdCBpc1xuICAgY3JlYXRlZCwgYW5kIHBhc3NlZCB0byBgYF9fc2V0aXRlbV9fKClgYCwgaW5zdGVhZCBvZlxuICAgYGBfX3NldHNsaWNlX18oKWBgIGJlaW5nIGNhbGxlZC5cblxub2JqZWN0Ll9fZGVsc2xpY2VfXyhzZWxmLCBpLCBqKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IGRlbGV0aW9uIG9mIGBgc2VsZltpOmpdYGAuIFNhbWUgbm90ZXMgZm9yICppKlxuICAgYW5kICpqKiBhcyBmb3IgYGBfX2dldHNsaWNlX18oKWBgLiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBJZiBub1xuICAgYGBfX2RlbHNsaWNlX18oKWBgIGlzIGZvdW5kLCBvciBmb3IgZXh0ZW5kZWQgc2xpY2luZyBvZiB0aGUgZm9ybVxuICAgYGBzZWxmW2k6ajprXWBgLCBhIHNsaWNlIG9iamVjdCBpcyBjcmVhdGVkLCBhbmQgcGFzc2VkIHRvXG4gICBgYF9fZGVsaXRlbV9fKClgYCwgaW5zdGVhZCBvZiBgYF9fZGVsc2xpY2VfXygpYGAgYmVpbmcgY2FsbGVkLlxuXG5Ob3RpY2UgdGhhdCB0aGVzZSBtZXRob2RzIGFyZSBvbmx5IGludm9rZWQgd2hlbiBhIHNpbmdsZSBzbGljZSB3aXRoIGFcbnNpbmdsZSBjb2xvbiBpcyB1c2VkLCBhbmQgdGhlIHNsaWNlIG1ldGhvZCBpcyBhdmFpbGFibGUuICBGb3Igc2xpY2Vcbm9wZXJhdGlvbnMgaW52b2x2aW5nIGV4dGVuZGVkIHNsaWNlIG5vdGF0aW9uLCBvciBpbiBhYnNlbmNlIG9mIHRoZVxuc2xpY2UgbWV0aG9kcywgYGBfX2dldGl0ZW1fXygpYGAsIGBgX19zZXRpdGVtX18oKWBgIG9yXG5gYF9fZGVsaXRlbV9fKClgYCBpcyBjYWxsZWQgd2l0aCBhIHNsaWNlIG9iamVjdCBhcyBhcmd1bWVudC5cblxuVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlbW9uc3RyYXRlIGhvdyB0byBtYWtlIHlvdXIgcHJvZ3JhbSBvciBtb2R1bGVcbmNvbXBhdGlibGUgd2l0aCBlYXJsaWVyIHZlcnNpb25zIG9mIFB5dGhvbiAoYXNzdW1pbmcgdGhhdCBtZXRob2RzXG5gYF9fZ2V0aXRlbV9fKClgYCwgYGBfX3NldGl0ZW1fXygpYGAgYW5kIGBgX19kZWxpdGVtX18oKWBgIHN1cHBvcnRcbnNsaWNlIG9iamVjdHMgYXMgYXJndW1lbnRzKTpcblxuICAgY2xhc3MgTXlDbGFzczpcbiAgICAgICAuLi5cbiAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOlxuICAgICAgICAgICAuLi5cbiAgICAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgaW5kZXgsIHZhbHVlKTpcbiAgICAgICAgICAgLi4uXG4gICAgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGluZGV4KTpcbiAgICAgICAgICAgLi4uXG5cbiAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDApOlxuICAgICAgICAgICAjIFRoZXkgd29uXCd0IGJlIGRlZmluZWQgaWYgdmVyc2lvbiBpcyBhdCBsZWFzdCAyLjAgZmluYWxcblxuICAgICAgICAgICBkZWYgX19nZXRzbGljZV9fKHNlbGYsIGksIGopOlxuICAgICAgICAgICAgICAgcmV0dXJuIHNlbGZbbWF4KDAsIGkpOm1heCgwLCBqKTpdXG4gICAgICAgICAgIGRlZiBfX3NldHNsaWNlX18oc2VsZiwgaSwgaiwgc2VxKTpcbiAgICAgICAgICAgICAgIHNlbGZbbWF4KDAsIGkpOm1heCgwLCBqKTpdID0gc2VxXG4gICAgICAgICAgIGRlZiBfX2RlbHNsaWNlX18oc2VsZiwgaSwgaik6XG4gICAgICAgICAgICAgICBkZWwgc2VsZlttYXgoMCwgaSk6bWF4KDAsIGopOl1cbiAgICAgICAuLi5cblxuTm90ZSB0aGUgY2FsbHMgdG8gYGBtYXgoKWBgOyB0aGVzZSBhcmUgbmVjZXNzYXJ5IGJlY2F1c2Ugb2YgdGhlXG5oYW5kbGluZyBvZiBuZWdhdGl2ZSBpbmRpY2VzIGJlZm9yZSB0aGUgYGBfXypzbGljZV9fKClgYCBtZXRob2RzIGFyZVxuY2FsbGVkLiAgV2hlbiBuZWdhdGl2ZSBpbmRleGVzIGFyZSB1c2VkLCB0aGUgYGBfXyppdGVtX18oKWBgIG1ldGhvZHNcbnJlY2VpdmUgdGhlbSBhcyBwcm92aWRlZCwgYnV0IHRoZSBgYF9fKnNsaWNlX18oKWBgIG1ldGhvZHMgZ2V0IGFcbiJjb29rZWQiIGZvcm0gb2YgdGhlIGluZGV4IHZhbHVlcy4gIEZvciBlYWNoIG5lZ2F0aXZlIGluZGV4IHZhbHVlLCB0aGVcbmxlbmd0aCBvZiB0aGUgc2VxdWVuY2UgaXMgYWRkZWQgdG8gdGhlIGluZGV4IGJlZm9yZSBjYWxsaW5nIHRoZSBtZXRob2Rcbih3aGljaCBtYXkgc3RpbGwgcmVzdWx0IGluIGEgbmVnYXRpdmUgaW5kZXgpOyB0aGlzIGlzIHRoZSBjdXN0b21hcnlcbmhhbmRsaW5nIG9mIG5lZ2F0aXZlIGluZGV4ZXMgYnkgdGhlIGJ1aWx0LWluIHNlcXVlbmNlIHR5cGVzLCBhbmQgdGhlXG5gYF9fKml0ZW1fXygpYGAgbWV0aG9kcyBhcmUgZXhwZWN0ZWQgdG8gZG8gdGhpcyBhcyB3ZWxsLiAgSG93ZXZlcixcbnNpbmNlIHRoZXkgc2hvdWxkIGFscmVhZHkgYmUgZG9pbmcgdGhhdCwgbmVnYXRpdmUgaW5kZXhlcyBjYW5ub3QgYmVcbnBhc3NlZCBpbjsgdGhleSBtdXN0IGJlIGNvbnN0cmFpbmVkIHRvIHRoZSBib3VuZHMgb2YgdGhlIHNlcXVlbmNlXG5iZWZvcmUgYmVpbmcgcGFzc2VkIHRvIHRoZSBgYF9fKml0ZW1fXygpYGAgbWV0aG9kcy4gQ2FsbGluZyBgYG1heCgwLFxuaSlgYCBjb252ZW5pZW50bHkgcmV0dXJucyB0aGUgcHJvcGVyIHZhbHVlLlxuXG5cbkVtdWxhdGluZyBudW1lcmljIHR5cGVzXG49PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gZW11bGF0ZSBudW1lcmljIG9iamVjdHMuXG5NZXRob2RzIGNvcnJlc3BvbmRpbmcgdG8gb3BlcmF0aW9ucyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZVxucGFydGljdWxhciBraW5kIG9mIG51bWJlciBpbXBsZW1lbnRlZCAoZS5nLiwgYml0d2lzZSBvcGVyYXRpb25zIGZvclxubm9uLWludGVncmFsIG51bWJlcnMpIHNob3VsZCBiZSBsZWZ0IHVuZGVmaW5lZC5cblxub2JqZWN0Ll9fYWRkX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19zdWJfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX211bF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX21vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZGl2bW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19wb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pXG5vYmplY3QuX19sc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fYW5kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX194b3JfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX29yX18oc2VsZiwgb3RoZXIpXG5cbiAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeSBhcml0aG1ldGljXG4gICBvcGVyYXRpb25zIChgYCtgYCwgYGAtYGAsIGBgKmBgLCBgYC8vYGAsIGBgJWBgLCBgYGRpdm1vZCgpYGAsXG4gICBgYHBvdygpYGAsIGBgKipgYCwgYGA8PGBgLCBgYD4+YGAsIGBgJmBgLCBgYF5gYCwgYGB8YGApLiAgRm9yXG4gICBpbnN0YW5jZSwgdG8gZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gYGB4ICsgeWBgLCB3aGVyZSAqeCogaXMgYW5cbiAgIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdCBoYXMgYW4gYGBfX2FkZF9fKClgYCBtZXRob2QsXG4gICBgYHguX19hZGRfXyh5KWBgIGlzIGNhbGxlZC4gIFRoZSBgYF9fZGl2bW9kX18oKWBgIG1ldGhvZCBzaG91bGQgYmVcbiAgIHRoZSBlcXVpdmFsZW50IHRvIHVzaW5nIGBgX19mbG9vcmRpdl9fKClgYCBhbmQgYGBfX21vZF9fKClgYDsgaXRcbiAgIHNob3VsZCBub3QgYmUgcmVsYXRlZCB0byBgYF9fdHJ1ZWRpdl9fKClgYCAoZGVzY3JpYmVkIGJlbG93KS4gIE5vdGVcbiAgIHRoYXQgYGBfX3Bvd19fKClgYCBzaG91bGQgYmUgZGVmaW5lZCB0byBhY2NlcHQgYW4gb3B0aW9uYWwgdGhpcmRcbiAgIGFyZ3VtZW50IGlmIHRoZSB0ZXJuYXJ5IHZlcnNpb24gb2YgdGhlIGJ1aWx0LWluIGBgcG93KClgYCBmdW5jdGlvblxuICAgaXMgdG8gYmUgc3VwcG9ydGVkLlxuXG4gICBJZiBvbmUgb2YgdGhvc2UgbWV0aG9kcyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gd2l0aCB0aGVcbiAgIHN1cHBsaWVkIGFyZ3VtZW50cywgaXQgc2hvdWxkIHJldHVybiBgYE5vdEltcGxlbWVudGVkYGAuXG5cbm9iamVjdC5fX2Rpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fdHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGUgZGl2aXNpb24gb3BlcmF0b3IgKGBgL2BgKSBpcyBpbXBsZW1lbnRlZCBieSB0aGVzZSBtZXRob2RzLiAgVGhlXG4gICBgYF9fdHJ1ZWRpdl9fKClgYCBtZXRob2QgaXMgdXNlZCB3aGVuIGBgX19mdXR1cmVfXy5kaXZpc2lvbmBgIGlzIGluXG4gICBlZmZlY3QsIG90aGVyd2lzZSBgYF9fZGl2X18oKWBgIGlzIHVzZWQuICBJZiBvbmx5IG9uZSBvZiB0aGVzZSB0d29cbiAgIG1ldGhvZHMgaXMgZGVmaW5lZCwgdGhlIG9iamVjdCB3aWxsIG5vdCBzdXBwb3J0IGRpdmlzaW9uIGluIHRoZVxuICAgYWx0ZXJuYXRlIGNvbnRleHQ7IGBgVHlwZUVycm9yYGAgd2lsbCBiZSByYWlzZWQgaW5zdGVhZC5cblxub2JqZWN0Ll9fcmFkZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnN1Yl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcm11bF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcmRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnRydWVkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JmbG9vcmRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcm1vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcmRpdm1vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnBvd19fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcmxzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnJzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcmFuZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnhvcl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcm9yX18oc2VsZiwgb3RoZXIpXG5cbiAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeSBhcml0aG1ldGljXG4gICBvcGVyYXRpb25zIChgYCtgYCwgYGAtYGAsIGBgKmBgLCBgYC9gYCwgYGAlYGAsIGBgZGl2bW9kKClgYCxcbiAgIGBgcG93KClgYCwgYGAqKmBgLCBgYDw8YGAsIGBgPj5gYCwgYGAmYGAsIGBgXmBgLCBgYHxgYCkgd2l0aFxuICAgcmVmbGVjdGVkIChzd2FwcGVkKSBvcGVyYW5kcy4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgb25seSBjYWxsZWQgaWZcbiAgIHRoZSBsZWZ0IG9wZXJhbmQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgY29ycmVzcG9uZGluZyBvcGVyYXRpb24gYW5kXG4gICB0aGUgb3BlcmFuZHMgYXJlIG9mIGRpZmZlcmVudCB0eXBlcy4gWzJdIEZvciBpbnN0YW5jZSwgdG8gZXZhbHVhdGVcbiAgIHRoZSBleHByZXNzaW9uIGBgeCAtIHlgYCwgd2hlcmUgKnkqIGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdFxuICAgaGFzIGFuIGBgX19yc3ViX18oKWBgIG1ldGhvZCwgYGB5Ll9fcnN1Yl9fKHgpYGAgaXMgY2FsbGVkIGlmXG4gICBgYHguX19zdWJfXyh5KWBgIHJldHVybnMgKk5vdEltcGxlbWVudGVkKi5cblxuICAgTm90ZSB0aGF0IHRlcm5hcnkgYGBwb3coKWBgIHdpbGwgbm90IHRyeSBjYWxsaW5nIGBgX19ycG93X18oKWBgXG4gICAodGhlIGNvZXJjaW9uIHJ1bGVzIHdvdWxkIGJlY29tZSB0b28gY29tcGxpY2F0ZWQpLlxuXG4gICBOb3RlOiBJZiB0aGUgcmlnaHQgb3BlcmFuZFwncyB0eXBlIGlzIGEgc3ViY2xhc3Mgb2YgdGhlIGxlZnQgb3BlcmFuZFwnc1xuICAgICB0eXBlIGFuZCB0aGF0IHN1YmNsYXNzIHByb3ZpZGVzIHRoZSByZWZsZWN0ZWQgbWV0aG9kIGZvciB0aGVcbiAgICAgb3BlcmF0aW9uLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGxlZnQgb3BlcmFuZFwnc1xuICAgICBub24tcmVmbGVjdGVkIG1ldGhvZC4gIFRoaXMgYmVoYXZpb3IgYWxsb3dzIHN1YmNsYXNzZXMgdG9cbiAgICAgb3ZlcnJpZGUgdGhlaXIgYW5jZXN0b3JzXCcgb3BlcmF0aW9ucy5cblxub2JqZWN0Ll9faWFkZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXN1Yl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faW11bF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faWRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXRydWVkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lmbG9vcmRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faW1vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXBvd19fKHNlbGYsIG90aGVyWywgbW9kdWxvXSlcbm9iamVjdC5fX2lsc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lyc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lhbmRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2l4b3JfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lvcl9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBhdWdtZW50ZWQgYXJpdGhtZXRpY1xuICAgYXNzaWdubWVudHMgKGBgKz1gYCwgYGAtPWBgLCBgYCo9YGAsIGBgLz1gYCwgYGAvLz1gYCwgYGAlPWBgLFxuICAgYGAqKj1gYCwgYGA8PD1gYCwgYGA+Pj1gYCwgYGAmPWBgLCBgYF49YGAsIGBgfD1gYCkuICBUaGVzZSBtZXRob2RzXG4gICBzaG91bGQgYXR0ZW1wdCB0byBkbyB0aGUgb3BlcmF0aW9uIGluLXBsYWNlIChtb2RpZnlpbmcgKnNlbGYqKSBhbmRcbiAgIHJldHVybiB0aGUgcmVzdWx0ICh3aGljaCBjb3VsZCBiZSwgYnV0IGRvZXMgbm90IGhhdmUgdG8gYmUsXG4gICAqc2VsZiopLiAgSWYgYSBzcGVjaWZpYyBtZXRob2QgaXMgbm90IGRlZmluZWQsIHRoZSBhdWdtZW50ZWRcbiAgIGFzc2lnbm1lbnQgZmFsbHMgYmFjayB0byB0aGUgbm9ybWFsIG1ldGhvZHMuICBGb3IgaW5zdGFuY2UsIHRvXG4gICBleGVjdXRlIHRoZSBzdGF0ZW1lbnQgYGB4ICs9IHlgYCwgd2hlcmUgKngqIGlzIGFuIGluc3RhbmNlIG9mIGFcbiAgIGNsYXNzIHRoYXQgaGFzIGFuIGBgX19pYWRkX18oKWBgIG1ldGhvZCwgYGB4Ll9faWFkZF9fKHkpYGAgaXNcbiAgIGNhbGxlZC4gIElmICp4KiBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQgZG9lcyBub3QgZGVmaW5lIGFcbiAgIGBgX19pYWRkX18oKWBgIG1ldGhvZCwgYGB4Ll9fYWRkX18oeSlgYCBhbmQgYGB5Ll9fcmFkZF9fKHgpYGAgYXJlXG4gICBjb25zaWRlcmVkLCBhcyB3aXRoIHRoZSBldmFsdWF0aW9uIG9mIGBgeCArIHlgYC5cblxub2JqZWN0Ll9fbmVnX18oc2VsZilcbm9iamVjdC5fX3Bvc19fKHNlbGYpXG5vYmplY3QuX19hYnNfXyhzZWxmKVxub2JqZWN0Ll9faW52ZXJ0X18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgdW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRpb25zIChgYC1gYCwgYGArYGAsXG4gICBgYGFicygpYGAgYW5kIGBgfmBgKS5cblxub2JqZWN0Ll9fY29tcGxleF9fKHNlbGYpXG5vYmplY3QuX19pbnRfXyhzZWxmKVxub2JqZWN0Ll9fbG9uZ19fKHNlbGYpXG5vYmplY3QuX19mbG9hdF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyBgYGNvbXBsZXgoKWBgLFxuICAgYGBpbnQoKWBgLCBgYGxvbmcoKWBgLCBhbmQgYGBmbG9hdCgpYGAuICBTaG91bGQgcmV0dXJuIGEgdmFsdWUgb2ZcbiAgIHRoZSBhcHByb3ByaWF0ZSB0eXBlLlxuXG5vYmplY3QuX19vY3RfXyhzZWxmKVxub2JqZWN0Ll9faGV4X18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zIGBgb2N0KClgYCBhbmQgYGBoZXgoKWBgLlxuICAgU2hvdWxkIHJldHVybiBhIHN0cmluZyB2YWx1ZS5cblxub2JqZWN0Ll9faW5kZXhfXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IGBgb3BlcmF0b3IuaW5kZXgoKWBgLiAgQWxzbyBjYWxsZWQgd2hlbmV2ZXJcbiAgIFB5dGhvbiBuZWVkcyBhbiBpbnRlZ2VyIG9iamVjdCAoc3VjaCBhcyBpbiBzbGljaW5nKS4gIE11c3QgcmV0dXJuXG4gICBhbiBpbnRlZ2VyIChpbnQgb3IgbG9uZykuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDIuNS5cblxub2JqZWN0Ll9fY29lcmNlX18oc2VsZiwgb3RoZXIpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgIm1peGVkLW1vZGUiIG51bWVyaWMgYXJpdGhtZXRpYy4gIFNob3VsZCBlaXRoZXJcbiAgIHJldHVybiBhIDItdHVwbGUgY29udGFpbmluZyAqc2VsZiogYW5kICpvdGhlciogY29udmVydGVkIHRvIGFcbiAgIGNvbW1vbiBudW1lcmljIHR5cGUsIG9yIGBgTm9uZWBgIGlmIGNvbnZlcnNpb24gaXMgaW1wb3NzaWJsZS4gIFdoZW5cbiAgIHRoZSBjb21tb24gdHlwZSB3b3VsZCBiZSB0aGUgdHlwZSBvZiBgYG90aGVyYGAsIGl0IGlzIHN1ZmZpY2llbnQgdG9cbiAgIHJldHVybiBgYE5vbmVgYCwgc2luY2UgdGhlIGludGVycHJldGVyIHdpbGwgYWxzbyBhc2sgdGhlIG90aGVyXG4gICBvYmplY3QgdG8gYXR0ZW1wdCBhIGNvZXJjaW9uIChidXQgc29tZXRpbWVzLCBpZiB0aGUgaW1wbGVtZW50YXRpb25cbiAgIG9mIHRoZSBvdGhlciB0eXBlIGNhbm5vdCBiZSBjaGFuZ2VkLCBpdCBpcyB1c2VmdWwgdG8gZG8gdGhlXG4gICBjb252ZXJzaW9uIHRvIHRoZSBvdGhlciB0eXBlIGhlcmUpLiAgQSByZXR1cm4gdmFsdWUgb2ZcbiAgIGBgTm90SW1wbGVtZW50ZWRgYCBpcyBlcXVpdmFsZW50IHRvIHJldHVybmluZyBgYE5vbmVgYC5cblxuXG5Db2VyY2lvbiBydWxlc1xuPT09PT09PT09PT09PT1cblxuVGhpcyBzZWN0aW9uIHVzZWQgdG8gZG9jdW1lbnQgdGhlIHJ1bGVzIGZvciBjb2VyY2lvbi4gIEFzIHRoZSBsYW5ndWFnZVxuaGFzIGV2b2x2ZWQsIHRoZSBjb2VyY2lvbiBydWxlcyBoYXZlIGJlY29tZSBoYXJkIHRvIGRvY3VtZW50XG5wcmVjaXNlbHk7IGRvY3VtZW50aW5nIHdoYXQgb25lIHZlcnNpb24gb2Ygb25lIHBhcnRpY3VsYXJcbmltcGxlbWVudGF0aW9uIGRvZXMgaXMgdW5kZXNpcmFibGUuICBJbnN0ZWFkLCBoZXJlIGFyZSBzb21lIGluZm9ybWFsXG5ndWlkZWxpbmVzIHJlZ2FyZGluZyBjb2VyY2lvbi4gIEluIFB5dGhvbiAzLjAsIGNvZXJjaW9uIHdpbGwgbm90IGJlXG5zdXBwb3J0ZWQuXG5cbiogSWYgdGhlIGxlZnQgb3BlcmFuZCBvZiBhICUgb3BlcmF0b3IgaXMgYSBzdHJpbmcgb3IgVW5pY29kZSBvYmplY3QsXG4gIG5vIGNvZXJjaW9uIHRha2VzIHBsYWNlIGFuZCB0aGUgc3RyaW5nIGZvcm1hdHRpbmcgb3BlcmF0aW9uIGlzXG4gIGludm9rZWQgaW5zdGVhZC5cblxuKiBJdCBpcyBubyBsb25nZXIgcmVjb21tZW5kZWQgdG8gZGVmaW5lIGEgY29lcmNpb24gb3BlcmF0aW9uLiBNaXhlZC1cbiAgbW9kZSBvcGVyYXRpb25zIG9uIHR5cGVzIHRoYXQgZG9uXCd0IGRlZmluZSBjb2VyY2lvbiBwYXNzIHRoZVxuICBvcmlnaW5hbCBhcmd1bWVudHMgdG8gdGhlIG9wZXJhdGlvbi5cblxuKiBOZXctc3R5bGUgY2xhc3NlcyAodGhvc2UgZGVyaXZlZCBmcm9tIGBgb2JqZWN0YGApIG5ldmVyIGludm9rZSB0aGVcbiAgYGBfX2NvZXJjZV9fKClgYCBtZXRob2QgaW4gcmVzcG9uc2UgdG8gYSBiaW5hcnkgb3BlcmF0b3I7IHRoZSBvbmx5XG4gIHRpbWUgYGBfX2NvZXJjZV9fKClgYCBpcyBpbnZva2VkIGlzIHdoZW4gdGhlIGJ1aWx0LWluIGZ1bmN0aW9uXG4gIGBgY29lcmNlKClgYCBpcyBjYWxsZWQuXG5cbiogRm9yIG1vc3QgaW50ZW50cyBhbmQgcHVycG9zZXMsIGFuIG9wZXJhdG9yIHRoYXQgcmV0dXJuc1xuICBgYE5vdEltcGxlbWVudGVkYGAgaXMgdHJlYXRlZCB0aGUgc2FtZSBhcyBvbmUgdGhhdCBpcyBub3RcbiAgaW1wbGVtZW50ZWQgYXQgYWxsLlxuXG4qIEJlbG93LCBgYF9fb3BfXygpYGAgYW5kIGBgX19yb3BfXygpYGAgYXJlIHVzZWQgdG8gc2lnbmlmeSB0aGVcbiAgZ2VuZXJpYyBtZXRob2QgbmFtZXMgY29ycmVzcG9uZGluZyB0byBhbiBvcGVyYXRvcjsgYGBfX2lvcF9fKClgYCBpc1xuICB1c2VkIGZvciB0aGUgY29ycmVzcG9uZGluZyBpbi1wbGFjZSBvcGVyYXRvci4gIEZvciBleGFtcGxlLCBmb3IgdGhlXG4gIG9wZXJhdG9yIFwnYGArYGBcJywgYGBfX2FkZF9fKClgYCBhbmQgYGBfX3JhZGRfXygpYGAgYXJlIHVzZWQgZm9yIHRoZVxuICBsZWZ0IGFuZCByaWdodCB2YXJpYW50IG9mIHRoZSBiaW5hcnkgb3BlcmF0b3IsIGFuZCBgYF9faWFkZF9fKClgYFxuICBmb3IgdGhlIGluLXBsYWNlIHZhcmlhbnQuXG5cbiogRm9yIG9iamVjdHMgKngqIGFuZCAqeSosIGZpcnN0IGBgeC5fX29wX18oeSlgYCBpcyB0cmllZC4gIElmIHRoaXMgaXNcbiAgbm90IGltcGxlbWVudGVkIG9yIHJldHVybnMgYGBOb3RJbXBsZW1lbnRlZGBgLCBgYHkuX19yb3BfXyh4KWBgIGlzXG4gIHRyaWVkLiAgSWYgdGhpcyBpcyBhbHNvIG5vdCBpbXBsZW1lbnRlZCBvciByZXR1cm5zXG4gIGBgTm90SW1wbGVtZW50ZWRgYCwgYSBgYFR5cGVFcnJvcmBgIGV4Y2VwdGlvbiBpcyByYWlzZWQuICBCdXQgc2VlXG4gIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uOlxuXG4qIEV4Y2VwdGlvbiB0byB0aGUgcHJldmlvdXMgaXRlbTogaWYgdGhlIGxlZnQgb3BlcmFuZCBpcyBhbiBpbnN0YW5jZVxuICBvZiBhIGJ1aWx0LWluIHR5cGUgb3IgYSBuZXctc3R5bGUgY2xhc3MsIGFuZCB0aGUgcmlnaHQgb3BlcmFuZCBpcyBhblxuICBpbnN0YW5jZSBvZiBhIHByb3BlciBzdWJjbGFzcyBvZiB0aGF0IHR5cGUgb3IgY2xhc3MgYW5kIG92ZXJyaWRlc1xuICB0aGUgYmFzZVwncyBgYF9fcm9wX18oKWBgIG1ldGhvZCwgdGhlIHJpZ2h0IG9wZXJhbmRcJ3MgYGBfX3JvcF9fKClgYFxuICBtZXRob2QgaXMgdHJpZWQgKmJlZm9yZSogdGhlIGxlZnQgb3BlcmFuZFwncyBgYF9fb3BfXygpYGAgbWV0aG9kLlxuXG4gIFRoaXMgaXMgZG9uZSBzbyB0aGF0IGEgc3ViY2xhc3MgY2FuIGNvbXBsZXRlbHkgb3ZlcnJpZGUgYmluYXJ5XG4gIG9wZXJhdG9ycy4gT3RoZXJ3aXNlLCB0aGUgbGVmdCBvcGVyYW5kXCdzIGBgX19vcF9fKClgYCBtZXRob2Qgd291bGRcbiAgYWx3YXlzIGFjY2VwdCB0aGUgcmlnaHQgb3BlcmFuZDogd2hlbiBhbiBpbnN0YW5jZSBvZiBhIGdpdmVuIGNsYXNzXG4gIGlzIGV4cGVjdGVkLCBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIG9mIHRoYXQgY2xhc3MgaXMgYWx3YXlzXG4gIGFjY2VwdGFibGUuXG5cbiogV2hlbiBlaXRoZXIgb3BlcmFuZCB0eXBlIGRlZmluZXMgYSBjb2VyY2lvbiwgdGhpcyBjb2VyY2lvbiBpcyBjYWxsZWRcbiAgYmVmb3JlIHRoYXQgdHlwZVwncyBgYF9fb3BfXygpYGAgb3IgYGBfX3JvcF9fKClgYCBtZXRob2QgaXMgY2FsbGVkLFxuICBidXQgbm8gc29vbmVyLiAgSWYgdGhlIGNvZXJjaW9uIHJldHVybnMgYW4gb2JqZWN0IG9mIGEgZGlmZmVyZW50XG4gIHR5cGUgZm9yIHRoZSBvcGVyYW5kIHdob3NlIGNvZXJjaW9uIGlzIGludm9rZWQsIHBhcnQgb2YgdGhlIHByb2Nlc3NcbiAgaXMgcmVkb25lIHVzaW5nIHRoZSBuZXcgb2JqZWN0LlxuXG4qIFdoZW4gYW4gaW4tcGxhY2Ugb3BlcmF0b3IgKGxpa2UgXCdgYCs9YGBcJykgaXMgdXNlZCwgaWYgdGhlIGxlZnRcbiAgb3BlcmFuZCBpbXBsZW1lbnRzIGBgX19pb3BfXygpYGAsIGl0IGlzIGludm9rZWQgd2l0aG91dCBhbnlcbiAgY29lcmNpb24uICBXaGVuIHRoZSBvcGVyYXRpb24gZmFsbHMgYmFjayB0byBgYF9fb3BfXygpYGAgYW5kL29yXG4gIGBgX19yb3BfXygpYGAsIHRoZSBub3JtYWwgY29lcmNpb24gcnVsZXMgYXBwbHkuXG5cbiogSW4gYGB4ICsgeWBgLCBpZiAqeCogaXMgYSBzZXF1ZW5jZSB0aGF0IGltcGxlbWVudHMgc2VxdWVuY2VcbiAgY29uY2F0ZW5hdGlvbiwgc2VxdWVuY2UgY29uY2F0ZW5hdGlvbiBpcyBpbnZva2VkLlxuXG4qIEluIGBgeCAqIHlgYCwgaWYgb25lIG9wZXJhdG9yIGlzIGEgc2VxdWVuY2UgdGhhdCBpbXBsZW1lbnRzIHNlcXVlbmNlXG4gIHJlcGV0aXRpb24sIGFuZCB0aGUgb3RoZXIgaXMgYW4gaW50ZWdlciAoYGBpbnRgYCBvciBgYGxvbmdgYCksXG4gIHNlcXVlbmNlIHJlcGV0aXRpb24gaXMgaW52b2tlZC5cblxuKiBSaWNoIGNvbXBhcmlzb25zIChpbXBsZW1lbnRlZCBieSBtZXRob2RzIGBgX19lcV9fKClgYCBhbmQgc28gb24pXG4gIG5ldmVyIHVzZSBjb2VyY2lvbi4gIFRocmVlLXdheSBjb21wYXJpc29uIChpbXBsZW1lbnRlZCBieVxuICBgYF9fY21wX18oKWBgKSBkb2VzIHVzZSBjb2VyY2lvbiB1bmRlciB0aGUgc2FtZSBjb25kaXRpb25zIGFzIG90aGVyXG4gIGJpbmFyeSBvcGVyYXRpb25zIHVzZSBpdC5cblxuKiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhlIGJ1aWx0LWluIG51bWVyaWMgdHlwZXMgYGBpbnRgYCxcbiAgYGBsb25nYGAsIGBgZmxvYXRgYCwgYW5kIGBgY29tcGxleGBgIGRvIG5vdCB1c2UgY29lcmNpb24uIEFsbCB0aGVzZVxuICB0eXBlcyBpbXBsZW1lbnQgYSBgYF9fY29lcmNlX18oKWBgIG1ldGhvZCwgZm9yIHVzZSBieSB0aGUgYnVpbHQtaW5cbiAgYGBjb2VyY2UoKWBgIGZ1bmN0aW9uLlxuXG4gIENoYW5nZWQgaW4gdmVyc2lvbiAyLjcuXG5cblxuV2l0aCBTdGF0ZW1lbnQgQ29udGV4dCBNYW5hZ2Vyc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5OZXcgaW4gdmVyc2lvbiAyLjUuXG5cbkEgKmNvbnRleHQgbWFuYWdlciogaXMgYW4gb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgcnVudGltZSBjb250ZXh0IHRvXG5iZSBlc3RhYmxpc2hlZCB3aGVuIGV4ZWN1dGluZyBhIGBgd2l0aGBgIHN0YXRlbWVudC4gVGhlIGNvbnRleHRcbm1hbmFnZXIgaGFuZGxlcyB0aGUgZW50cnkgaW50bywgYW5kIHRoZSBleGl0IGZyb20sIHRoZSBkZXNpcmVkIHJ1bnRpbWVcbmNvbnRleHQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJsb2NrIG9mIGNvZGUuICBDb250ZXh0IG1hbmFnZXJzIGFyZVxubm9ybWFsbHkgaW52b2tlZCB1c2luZyB0aGUgYGB3aXRoYGAgc3RhdGVtZW50IChkZXNjcmliZWQgaW4gc2VjdGlvblxuKlRoZSB3aXRoIHN0YXRlbWVudCopLCBidXQgY2FuIGFsc28gYmUgdXNlZCBieSBkaXJlY3RseSBpbnZva2luZyB0aGVpclxubWV0aG9kcy5cblxuVHlwaWNhbCB1c2VzIG9mIGNvbnRleHQgbWFuYWdlcnMgaW5jbHVkZSBzYXZpbmcgYW5kIHJlc3RvcmluZyB2YXJpb3VzXG5raW5kcyBvZiBnbG9iYWwgc3RhdGUsIGxvY2tpbmcgYW5kIHVubG9ja2luZyByZXNvdXJjZXMsIGNsb3Npbmcgb3BlbmVkXG5maWxlcywgZXRjLlxuXG5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBjb250ZXh0IG1hbmFnZXJzLCBzZWUgKkNvbnRleHQgTWFuYWdlciBUeXBlcyouXG5cbm9iamVjdC5fX2VudGVyX18oc2VsZilcblxuICAgRW50ZXIgdGhlIHJ1bnRpbWUgY29udGV4dCByZWxhdGVkIHRvIHRoaXMgb2JqZWN0LiBUaGUgYGB3aXRoYGBcbiAgIHN0YXRlbWVudCB3aWxsIGJpbmQgdGhpcyBtZXRob2RcJ3MgcmV0dXJuIHZhbHVlIHRvIHRoZSB0YXJnZXQocylcbiAgIHNwZWNpZmllZCBpbiB0aGUgYGBhc2BgIGNsYXVzZSBvZiB0aGUgc3RhdGVtZW50LCBpZiBhbnkuXG5cbm9iamVjdC5fX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2spXG5cbiAgIEV4aXQgdGhlIHJ1bnRpbWUgY29udGV4dCByZWxhdGVkIHRvIHRoaXMgb2JqZWN0LiBUaGUgcGFyYW1ldGVyc1xuICAgZGVzY3JpYmUgdGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGUgY29udGV4dCB0byBiZSBleGl0ZWQuIElmIHRoZVxuICAgY29udGV4dCB3YXMgZXhpdGVkIHdpdGhvdXQgYW4gZXhjZXB0aW9uLCBhbGwgdGhyZWUgYXJndW1lbnRzIHdpbGxcbiAgIGJlIGBgTm9uZWBgLlxuXG4gICBJZiBhbiBleGNlcHRpb24gaXMgc3VwcGxpZWQsIGFuZCB0aGUgbWV0aG9kIHdpc2hlcyB0byBzdXBwcmVzcyB0aGVcbiAgIGV4Y2VwdGlvbiAoaS5lLiwgcHJldmVudCBpdCBmcm9tIGJlaW5nIHByb3BhZ2F0ZWQpLCBpdCBzaG91bGRcbiAgIHJldHVybiBhIHRydWUgdmFsdWUuIE90aGVyd2lzZSwgdGhlIGV4Y2VwdGlvbiB3aWxsIGJlIHByb2Nlc3NlZFxuICAgbm9ybWFsbHkgdXBvbiBleGl0IGZyb20gdGhpcyBtZXRob2QuXG5cbiAgIE5vdGUgdGhhdCBgYF9fZXhpdF9fKClgYCBtZXRob2RzIHNob3VsZCBub3QgcmVyYWlzZSB0aGUgcGFzc2VkLWluXG4gICBleGNlcHRpb247IHRoaXMgaXMgdGhlIGNhbGxlclwncyByZXNwb25zaWJpbGl0eS5cblxuU2VlIGFsc286XG5cbiAgICoqUEVQIDAzNDMqKiAtIFRoZSAid2l0aCIgc3RhdGVtZW50XG4gICAgICBUaGUgc3BlY2lmaWNhdGlvbiwgYmFja2dyb3VuZCwgYW5kIGV4YW1wbGVzIGZvciB0aGUgUHl0aG9uXG4gICAgICBgYHdpdGhgYCBzdGF0ZW1lbnQuXG5cblxuU3BlY2lhbCBtZXRob2QgbG9va3VwIGZvciBvbGQtc3R5bGUgY2xhc3Nlc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5Gb3Igb2xkLXN0eWxlIGNsYXNzZXMsIHNwZWNpYWwgbWV0aG9kcyBhcmUgYWx3YXlzIGxvb2tlZCB1cCBpbiBleGFjdGx5XG50aGUgc2FtZSB3YXkgYXMgYW55IG90aGVyIG1ldGhvZCBvciBhdHRyaWJ1dGUuIFRoaXMgaXMgdGhlIGNhc2VcbnJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgbWV0aG9kIGlzIGJlaW5nIGxvb2tlZCB1cCBleHBsaWNpdGx5IGFzIGluXG5gYHguX19nZXRpdGVtX18oaSlgYCBvciBpbXBsaWNpdGx5IGFzIGluIGBgeFtpXWBgLlxuXG5UaGlzIGJlaGF2aW91ciBtZWFucyB0aGF0IHNwZWNpYWwgbWV0aG9kcyBtYXkgZXhoaWJpdCBkaWZmZXJlbnRcbmJlaGF2aW91ciBmb3IgZGlmZmVyZW50IGluc3RhbmNlcyBvZiBhIHNpbmdsZSBvbGQtc3R5bGUgY2xhc3MgaWYgdGhlXG5hcHByb3ByaWF0ZSBzcGVjaWFsIGF0dHJpYnV0ZXMgYXJlIHNldCBkaWZmZXJlbnRseTpcblxuICAgPj4+IGNsYXNzIEM6XG4gICAuLi4gICAgIHBhc3NcbiAgIC4uLlxuICAgPj4+IGMxID0gQygpXG4gICA+Pj4gYzIgPSBDKClcbiAgID4+PiBjMS5fX2xlbl9fID0gbGFtYmRhOiA1XG4gICA+Pj4gYzIuX19sZW5fXyA9IGxhbWJkYTogOVxuICAgPj4+IGxlbihjMSlcbiAgIDVcbiAgID4+PiBsZW4oYzIpXG4gICA5XG5cblxuU3BlY2lhbCBtZXRob2QgbG9va3VwIGZvciBuZXctc3R5bGUgY2xhc3Nlc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5Gb3IgbmV3LXN0eWxlIGNsYXNzZXMsIGltcGxpY2l0IGludm9jYXRpb25zIG9mIHNwZWNpYWwgbWV0aG9kcyBhcmVcbm9ubHkgZ3VhcmFudGVlZCB0byB3b3JrIGNvcnJlY3RseSBpZiBkZWZpbmVkIG9uIGFuIG9iamVjdFwncyB0eXBlLCBub3RcbmluIHRoZSBvYmplY3RcJ3MgaW5zdGFuY2UgZGljdGlvbmFyeS4gIFRoYXQgYmVoYXZpb3VyIGlzIHRoZSByZWFzb24gd2h5XG50aGUgZm9sbG93aW5nIGNvZGUgcmFpc2VzIGFuIGV4Y2VwdGlvbiAodW5saWtlIHRoZSBlcXVpdmFsZW50IGV4YW1wbGVcbndpdGggb2xkLXN0eWxlIGNsYXNzZXMpOlxuXG4gICA+Pj4gY2xhc3MgQyhvYmplY3QpOlxuICAgLi4uICAgICBwYXNzXG4gICAuLi5cbiAgID4+PiBjID0gQygpXG4gICA+Pj4gYy5fX2xlbl9fID0gbGFtYmRhOiA1XG4gICA+Pj4gbGVuKGMpXG4gICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4gICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+XG4gICBUeXBlRXJyb3I6IG9iamVjdCBvZiB0eXBlIFwnQ1wnIGhhcyBubyBsZW4oKVxuXG5UaGUgcmF0aW9uYWxlIGJlaGluZCB0aGlzIGJlaGF2aW91ciBsaWVzIHdpdGggYSBudW1iZXIgb2Ygc3BlY2lhbFxubWV0aG9kcyBzdWNoIGFzIGBgX19oYXNoX18oKWBgIGFuZCBgYF9fcmVwcl9fKClgYCB0aGF0IGFyZSBpbXBsZW1lbnRlZFxuYnkgYWxsIG9iamVjdHMsIGluY2x1ZGluZyB0eXBlIG9iamVjdHMuIElmIHRoZSBpbXBsaWNpdCBsb29rdXAgb2ZcbnRoZXNlIG1ldGhvZHMgdXNlZCB0aGUgY29udmVudGlvbmFsIGxvb2t1cCBwcm9jZXNzLCB0aGV5IHdvdWxkIGZhaWxcbndoZW4gaW52b2tlZCBvbiB0aGUgdHlwZSBvYmplY3QgaXRzZWxmOlxuXG4gICA+Pj4gMSAuX19oYXNoX18oKSA9PSBoYXNoKDEpXG4gICBUcnVlXG4gICA+Pj4gaW50Ll9faGFzaF9fKCkgPT0gaGFzaChpbnQpXG4gICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4gICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+XG4gICBUeXBlRXJyb3I6IGRlc2NyaXB0b3IgXCdfX2hhc2hfX1wnIG9mIFwnaW50XCcgb2JqZWN0IG5lZWRzIGFuIGFyZ3VtZW50XG5cbkluY29ycmVjdGx5IGF0dGVtcHRpbmcgdG8gaW52b2tlIGFuIHVuYm91bmQgbWV0aG9kIG9mIGEgY2xhc3MgaW4gdGhpc1xud2F5IGlzIHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBcJ21ldGFjbGFzcyBjb25mdXNpb25cJywgYW5kIGlzIGF2b2lkZWRcbmJ5IGJ5cGFzc2luZyB0aGUgaW5zdGFuY2Ugd2hlbiBsb29raW5nIHVwIHNwZWNpYWwgbWV0aG9kczpcblxuICAgPj4+IHR5cGUoMSkuX19oYXNoX18oMSkgPT0gaGFzaCgxKVxuICAgVHJ1ZVxuICAgPj4+IHR5cGUoaW50KS5fX2hhc2hfXyhpbnQpID09IGhhc2goaW50KVxuICAgVHJ1ZVxuXG5JbiBhZGRpdGlvbiB0byBieXBhc3NpbmcgYW55IGluc3RhbmNlIGF0dHJpYnV0ZXMgaW4gdGhlIGludGVyZXN0IG9mXG5jb3JyZWN0bmVzcywgaW1wbGljaXQgc3BlY2lhbCBtZXRob2QgbG9va3VwIGdlbmVyYWxseSBhbHNvIGJ5cGFzc2VzXG50aGUgYGBfX2dldGF0dHJpYnV0ZV9fKClgYCBtZXRob2QgZXZlbiBvZiB0aGUgb2JqZWN0XCdzIG1ldGFjbGFzczpcblxuICAgPj4+IGNsYXNzIE1ldGEodHlwZSk6XG4gICAuLi4gICAgZGVmIF9fZ2V0YXR0cmlidXRlX18oKmFyZ3MpOlxuICAgLi4uICAgICAgIHByaW50ICJNZXRhY2xhc3MgZ2V0YXR0cmlidXRlIGludm9rZWQiXG4gICAuLi4gICAgICAgcmV0dXJuIHR5cGUuX19nZXRhdHRyaWJ1dGVfXygqYXJncylcbiAgIC4uLlxuICAgPj4+IGNsYXNzIEMob2JqZWN0KTpcbiAgIC4uLiAgICAgX19tZXRhY2xhc3NfXyA9IE1ldGFcbiAgIC4uLiAgICAgZGVmIF9fbGVuX18oc2VsZik6XG4gICAuLi4gICAgICAgICByZXR1cm4gMTBcbiAgIC4uLiAgICAgZGVmIF9fZ2V0YXR0cmlidXRlX18oKmFyZ3MpOlxuICAgLi4uICAgICAgICAgcHJpbnQgIkNsYXNzIGdldGF0dHJpYnV0ZSBpbnZva2VkIlxuICAgLi4uICAgICAgICAgcmV0dXJuIG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKCphcmdzKVxuICAgLi4uXG4gICA+Pj4gYyA9IEMoKVxuICAgPj4+IGMuX19sZW5fXygpICAgICAgICAgICAgICAgICAjIEV4cGxpY2l0IGxvb2t1cCB2aWEgaW5zdGFuY2VcbiAgIENsYXNzIGdldGF0dHJpYnV0ZSBpbnZva2VkXG4gICAxMFxuICAgPj4+IHR5cGUoYykuX19sZW5fXyhjKSAgICAgICAgICAjIEV4cGxpY2l0IGxvb2t1cCB2aWEgdHlwZVxuICAgTWV0YWNsYXNzIGdldGF0dHJpYnV0ZSBpbnZva2VkXG4gICAxMFxuICAgPj4+IGxlbihjKSAgICAgICAgICAgICAgICAgICAgICAjIEltcGxpY2l0IGxvb2t1cFxuICAgMTBcblxuQnlwYXNzaW5nIHRoZSBgYF9fZ2V0YXR0cmlidXRlX18oKWBgIG1hY2hpbmVyeSBpbiB0aGlzIGZhc2hpb25cbnByb3ZpZGVzIHNpZ25pZmljYW50IHNjb3BlIGZvciBzcGVlZCBvcHRpbWlzYXRpb25zIHdpdGhpbiB0aGVcbmludGVycHJldGVyLCBhdCB0aGUgY29zdCBvZiBzb21lIGZsZXhpYmlsaXR5IGluIHRoZSBoYW5kbGluZyBvZlxuc3BlY2lhbCBtZXRob2RzICh0aGUgc3BlY2lhbCBtZXRob2QgKm11c3QqIGJlIHNldCBvbiB0aGUgY2xhc3Mgb2JqZWN0XG5pdHNlbGYgaW4gb3JkZXIgdG8gYmUgY29uc2lzdGVudGx5IGludm9rZWQgYnkgdGhlIGludGVycHJldGVyKS5cblxuLVsgRm9vdG5vdGVzIF0tXG5cblsxXSBJdCAqaXMqIHBvc3NpYmxlIGluIHNvbWUgY2FzZXMgdG8gY2hhbmdlIGFuIG9iamVjdFwncyB0eXBlLCB1bmRlclxuICAgIGNlcnRhaW4gY29udHJvbGxlZCBjb25kaXRpb25zLiBJdCBnZW5lcmFsbHkgaXNuXCd0IGEgZ29vZCBpZGVhXG4gICAgdGhvdWdoLCBzaW5jZSBpdCBjYW4gbGVhZCB0byBzb21lIHZlcnkgc3RyYW5nZSBiZWhhdmlvdXIgaWYgaXQgaXNcbiAgICBoYW5kbGVkIGluY29ycmVjdGx5LlxuXG5bMl0gRm9yIG9wZXJhbmRzIG9mIHRoZSBzYW1lIHR5cGUsIGl0IGlzIGFzc3VtZWQgdGhhdCBpZiB0aGUgbm9uLVxuICAgIHJlZmxlY3RlZCBtZXRob2QgKHN1Y2ggYXMgYGBfX2FkZF9fKClgYCkgZmFpbHMgdGhlIG9wZXJhdGlvbiBpc1xuICAgIG5vdCBzdXBwb3J0ZWQsIHdoaWNoIGlzIHdoeSB0aGUgcmVmbGVjdGVkIG1ldGhvZCBpcyBub3QgY2FsbGVkLlxuJywKLSAnc3RyaW5nLWNvbnZlcnNpb25zJzogdSdcblN0cmluZyBjb252ZXJzaW9uc1xuKioqKioqKioqKioqKioqKioqXG5cbkEgc3RyaW5nIGNvbnZlcnNpb24gaXMgYW4gZXhwcmVzc2lvbiBsaXN0IGVuY2xvc2VkIGluIHJldmVyc2UgKGEuay5hLlxuYmFja3dhcmQpIHF1b3RlczpcblxuICAgc3RyaW5nX2NvbnZlcnNpb24gOjo9ICJcJyIgZXhwcmVzc2lvbl9saXN0ICJcJyJcblxuQSBzdHJpbmcgY29udmVyc2lvbiBldmFsdWF0ZXMgdGhlIGNvbnRhaW5lZCBleHByZXNzaW9uIGxpc3QgYW5kXG5jb252ZXJ0cyB0aGUgcmVzdWx0aW5nIG9iamVjdCBpbnRvIGEgc3RyaW5nIGFjY29yZGluZyB0byBydWxlc1xuc3BlY2lmaWMgdG8gaXRzIHR5cGUuXG5cbklmIHRoZSBvYmplY3QgaXMgYSBzdHJpbmcsIGEgbnVtYmVyLCBgYE5vbmVgYCwgb3IgYSB0dXBsZSwgbGlzdCBvclxuZGljdGlvbmFyeSBjb250YWluaW5nIG9ubHkgb2JqZWN0cyB3aG9zZSB0eXBlIGlzIG9uZSBvZiB0aGVzZSwgdGhlXG5yZXN1bHRpbmcgc3RyaW5nIGlzIGEgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb24gd2hpY2ggY2FuIGJlIHBhc3NlZCB0b1xudGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGBgZXZhbCgpYGAgdG8geWllbGQgYW4gZXhwcmVzc2lvbiB3aXRoIHRoZSBzYW1lXG52YWx1ZSAob3IgYW4gYXBwcm94aW1hdGlvbiwgaWYgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBhcmUgaW52b2x2ZWQpLlxuXG4oSW4gcGFydGljdWxhciwgY29udmVydGluZyBhIHN0cmluZyBhZGRzIHF1b3RlcyBhcm91bmQgaXQgYW5kIGNvbnZlcnRzXG4iZnVubnkiIGNoYXJhY3RlcnMgdG8gZXNjYXBlIHNlcXVlbmNlcyB0aGF0IGFyZSBzYWZlIHRvIHByaW50LilcblxuUmVjdXJzaXZlIG9iamVjdHMgKGZvciBleGFtcGxlLCBsaXN0cyBvciBkaWN0aW9uYXJpZXMgdGhhdCBjb250YWluIGFcbnJlZmVyZW5jZSB0byB0aGVtc2VsdmVzLCBkaXJlY3RseSBvciBpbmRpcmVjdGx5KSB1c2UgYGAuLi5gYCB0b1xuaW5kaWNhdGUgYSByZWN1cnNpdmUgcmVmZXJlbmNlLCBhbmQgdGhlIHJlc3VsdCBjYW5ub3QgYmUgcGFzc2VkIHRvXG5gYGV2YWwoKWBgIHRvIGdldCBhbiBlcXVhbCB2YWx1ZSAoYGBTeW50YXhFcnJvcmBgIHdpbGwgYmUgcmFpc2VkXG5pbnN0ZWFkKS5cblxuVGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGBgcmVwcigpYGAgcGVyZm9ybXMgZXhhY3RseSB0aGUgc2FtZSBjb252ZXJzaW9uXG5pbiBpdHMgYXJndW1lbnQgYXMgZW5jbG9zaW5nIGl0IGluIHBhcmVudGhlc2VzIGFuZCByZXZlcnNlIHF1b3Rlc1xuZG9lcy4gIFRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYHN0cigpYGAgcGVyZm9ybXMgYSBzaW1pbGFyIGJ1dCBtb3JlXG51c2VyLWZyaWVuZGx5IGNvbnZlcnNpb24uXG4nLAotICdzdHJpbmctbWV0aG9kcyc6IHUnXG5TdHJpbmcgTWV0aG9kc1xuKioqKioqKioqKioqKipcblxuQmVsb3cgYXJlIGxpc3RlZCB0aGUgc3RyaW5nIG1ldGhvZHMgd2hpY2ggYm90aCA4LWJpdCBzdHJpbmdzIGFuZFxuVW5pY29kZSBvYmplY3RzIHN1cHBvcnQuICBTb21lIG9mIHRoZW0gYXJlIGFsc28gYXZhaWxhYmxlIG9uXG5gYGJ5dGVhcnJheWBgIG9iamVjdHMuXG5cbkluIGFkZGl0aW9uLCBQeXRob25cJ3Mgc3RyaW5ncyBzdXBwb3J0IHRoZSBzZXF1ZW5jZSB0eXBlIG1ldGhvZHNcbmRlc2NyaWJlZCBpbiB0aGUgKlNlcXVlbmNlIFR5cGVzIC0tLSBzdHIsIHVuaWNvZGUsIGxpc3QsIHR1cGxlLFxuYnl0ZWFycmF5LCBidWZmZXIsIHhyYW5nZSogc2VjdGlvbi4gVG8gb3V0cHV0IGZvcm1hdHRlZCBzdHJpbmdzIHVzZVxudGVtcGxhdGUgc3RyaW5ncyBvciB0aGUgYGAlYGAgb3BlcmF0b3IgZGVzY3JpYmVkIGluIHRoZSAqU3RyaW5nXG5Gb3JtYXR0aW5nIE9wZXJhdGlvbnMqIHNlY3Rpb24uIEFsc28sIHNlZSB0aGUgYGByZWBgIG1vZHVsZSBmb3Igc3RyaW5nXG5mdW5jdGlvbnMgYmFzZWQgb24gcmVndWxhciBleHByZXNzaW9ucy5cblxuc3RyLmNhcGl0YWxpemUoKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBpdHMgZmlyc3QgY2hhcmFjdGVyIGNhcGl0YWxpemVkXG4gICBhbmQgdGhlIHJlc3QgbG93ZXJjYXNlZC5cblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci5jZW50ZXIod2lkdGhbLCBmaWxsY2hhcl0pXG5cbiAgIFJldHVybiBjZW50ZXJlZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi4gUGFkZGluZyBpcyBkb25lXG4gICB1c2luZyB0aGUgc3BlY2lmaWVkICpmaWxsY2hhciogKGRlZmF1bHQgaXMgYSBzcGFjZSkuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjQ6IFN1cHBvcnQgZm9yIHRoZSAqZmlsbGNoYXIqIGFyZ3VtZW50LlxuXG5zdHIuY291bnQoc3ViWywgc3RhcnRbLCBlbmRdXSlcblxuICAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2VzIG9mIHN1YnN0cmluZyAqc3ViKlxuICAgaW4gdGhlIHJhbmdlIFsqc3RhcnQqLCAqZW5kKl0uICBPcHRpb25hbCBhcmd1bWVudHMgKnN0YXJ0KiBhbmRcbiAgICplbmQqIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cblxuc3RyLmRlY29kZShbZW5jb2RpbmdbLCBlcnJvcnNdXSlcblxuICAgRGVjb2RlcyB0aGUgc3RyaW5nIHVzaW5nIHRoZSBjb2RlYyByZWdpc3RlcmVkIGZvciAqZW5jb2RpbmcqLlxuICAgKmVuY29kaW5nKiBkZWZhdWx0cyB0byB0aGUgZGVmYXVsdCBzdHJpbmcgZW5jb2RpbmcuICAqZXJyb3JzKiBtYXlcbiAgIGJlIGdpdmVuIHRvIHNldCBhIGRpZmZlcmVudCBlcnJvciBoYW5kbGluZyBzY2hlbWUuICBUaGUgZGVmYXVsdCBpc1xuICAgYGBcJ3N0cmljdFwnYGAsIG1lYW5pbmcgdGhhdCBlbmNvZGluZyBlcnJvcnMgcmFpc2UgYGBVbmljb2RlRXJyb3JgYC5cbiAgIE90aGVyIHBvc3NpYmxlIHZhbHVlcyBhcmUgYGBcJ2lnbm9yZVwnYGAsIGBgXCdyZXBsYWNlXCdgYCBhbmQgYW55IG90aGVyXG4gICBuYW1lIHJlZ2lzdGVyZWQgdmlhIGBgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKClgYCwgc2VlIHNlY3Rpb24gKkNvZGVjXG4gICBCYXNlIENsYXNzZXMqLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjIuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjM6IFN1cHBvcnQgZm9yIG90aGVyIGVycm9yIGhhbmRsaW5nIHNjaGVtZXNcbiAgIGFkZGVkLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi43OiBTdXBwb3J0IGZvciBrZXl3b3JkIGFyZ3VtZW50cyBhZGRlZC5cblxuc3RyLmVuY29kZShbZW5jb2RpbmdbLCBlcnJvcnNdXSlcblxuICAgUmV0dXJuIGFuIGVuY29kZWQgdmVyc2lvbiBvZiB0aGUgc3RyaW5nLiAgRGVmYXVsdCBlbmNvZGluZyBpcyB0aGVcbiAgIGN1cnJlbnQgZGVmYXVsdCBzdHJpbmcgZW5jb2RpbmcuICAqZXJyb3JzKiBtYXkgYmUgZ2l2ZW4gdG8gc2V0IGFcbiAgIGRpZmZlcmVudCBlcnJvciBoYW5kbGluZyBzY2hlbWUuICBUaGUgZGVmYXVsdCBmb3IgKmVycm9ycyogaXNcbiAgIGBgXCdzdHJpY3RcJ2BgLCBtZWFuaW5nIHRoYXQgZW5jb2RpbmcgZXJyb3JzIHJhaXNlIGFcbiAgIGBgVW5pY29kZUVycm9yYGAuICBPdGhlciBwb3NzaWJsZSB2YWx1ZXMgYXJlIGBgXCdpZ25vcmVcJ2BgLFxuICAgYGBcJ3JlcGxhY2VcJ2BgLCBgYFwneG1sY2hhcnJlZnJlcGxhY2VcJ2BgLCBgYFwnYmFja3NsYXNocmVwbGFjZVwnYGAgYW5kXG4gICBhbnkgb3RoZXIgbmFtZSByZWdpc3RlcmVkIHZpYSBgYGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigpYGAsIHNlZVxuICAgc2VjdGlvbiAqQ29kZWMgQmFzZSBDbGFzc2VzKi4gRm9yIGEgbGlzdCBvZiBwb3NzaWJsZSBlbmNvZGluZ3MsIHNlZVxuICAgc2VjdGlvbiAqU3RhbmRhcmQgRW5jb2RpbmdzKi5cblxuICAgTmV3IGluIHZlcnNpb24gMi4wLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBTdXBwb3J0IGZvciBgYFwneG1sY2hhcnJlZnJlcGxhY2VcJ2BgIGFuZFxuICAgYGBcJ2JhY2tzbGFzaHJlcGxhY2VcJ2BgIGFuZCBvdGhlciBlcnJvciBoYW5kbGluZyBzY2hlbWVzIGFkZGVkLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi43OiBTdXBwb3J0IGZvciBrZXl3b3JkIGFyZ3VtZW50cyBhZGRlZC5cblxuc3RyLmVuZHN3aXRoKHN1ZmZpeFssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiBgYFRydWVgYCBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCB0aGUgc3BlY2lmaWVkICpzdWZmaXgqLFxuICAgb3RoZXJ3aXNlIHJldHVybiBgYEZhbHNlYGAuICAqc3VmZml4KiBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mXG4gICBzdWZmaXhlcyB0byBsb29rIGZvci4gIFdpdGggb3B0aW9uYWwgKnN0YXJ0KiwgdGVzdCBiZWdpbm5pbmcgYXRcbiAgIHRoYXQgcG9zaXRpb24uICBXaXRoIG9wdGlvbmFsICplbmQqLCBzdG9wIGNvbXBhcmluZyBhdCB0aGF0XG4gICBwb3NpdGlvbi5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNTogQWNjZXB0IHR1cGxlcyBhcyAqc3VmZml4Ki5cblxuc3RyLmV4cGFuZHRhYnMoW3RhYnNpemVdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2hlcmUgYWxsIHRhYiBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZFxuICAgYnkgb25lIG9yIG1vcmUgc3BhY2VzLCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgY29sdW1uIGFuZCB0aGVcbiAgIGdpdmVuIHRhYiBzaXplLiAgVGhlIGNvbHVtbiBudW1iZXIgaXMgcmVzZXQgdG8gemVybyBhZnRlciBlYWNoXG4gICBuZXdsaW5lIG9jY3VycmluZyBpbiB0aGUgc3RyaW5nLiBJZiAqdGFic2l6ZSogaXMgbm90IGdpdmVuLCBhIHRhYlxuICAgc2l6ZSBvZiBgYDhgYCBjaGFyYWN0ZXJzIGlzIGFzc3VtZWQuICBUaGlzIGRvZXNuXCd0IHVuZGVyc3RhbmQgb3RoZXJcbiAgIG5vbi1wcmludGluZyBjaGFyYWN0ZXJzIG9yIGVzY2FwZSBzZXF1ZW5jZXMuXG5cbnN0ci5maW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIHRoZSBzdHJpbmcgd2hlcmUgc3Vic3RyaW5nICpzdWIqIGlzXG4gICBmb3VuZCwgc3VjaCB0aGF0ICpzdWIqIGlzIGNvbnRhaW5lZCBpbiB0aGUgc2xpY2UgYGBzW3N0YXJ0OmVuZF1gYC5cbiAgIE9wdGlvbmFsIGFyZ3VtZW50cyAqc3RhcnQqIGFuZCAqZW5kKiBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2VcbiAgIG5vdGF0aW9uLiAgUmV0dXJuIGBgLTFgYCBpZiAqc3ViKiBpcyBub3QgZm91bmQuXG5cbiAgIE5vdGU6IFRoZSBgYGZpbmQoKWBgIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBvbmx5IGlmIHlvdSBuZWVkIHRvIGtub3cgdGhlXG4gICAgIHBvc2l0aW9uIG9mICpzdWIqLiAgVG8gY2hlY2sgaWYgKnN1YiogaXMgYSBzdWJzdHJpbmcgb3Igbm90LCB1c2VcbiAgICAgdGhlIGBgaW5gYCBvcGVyYXRvcjpcblxuICAgICAgICA+Pj4gXCdQeVwnIGluIFwnUHl0aG9uXCdcbiAgICAgICAgVHJ1ZVxuXG5zdHIuZm9ybWF0KCphcmdzLCAqKmt3YXJncylcblxuICAgUGVyZm9ybSBhIHN0cmluZyBmb3JtYXR0aW5nIG9wZXJhdGlvbi4gIFRoZSBzdHJpbmcgb24gd2hpY2ggdGhpc1xuICAgbWV0aG9kIGlzIGNhbGxlZCBjYW4gY29udGFpbiBsaXRlcmFsIHRleHQgb3IgcmVwbGFjZW1lbnQgZmllbGRzXG4gICBkZWxpbWl0ZWQgYnkgYnJhY2VzIGBge31gYC4gIEVhY2ggcmVwbGFjZW1lbnQgZmllbGQgY29udGFpbnMgZWl0aGVyXG4gICB0aGUgbnVtZXJpYyBpbmRleCBvZiBhIHBvc2l0aW9uYWwgYXJndW1lbnQsIG9yIHRoZSBuYW1lIG9mIGFcbiAgIGtleXdvcmQgYXJndW1lbnQuICBSZXR1cm5zIGEgY29weSBvZiB0aGUgc3RyaW5nIHdoZXJlIGVhY2hcbiAgIHJlcGxhY2VtZW50IGZpZWxkIGlzIHJlcGxhY2VkIHdpdGggdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGVcbiAgIGNvcnJlc3BvbmRpbmcgYXJndW1lbnQuXG5cbiAgID4+PiAiVGhlIHN1bSBvZiAxICsgMiBpcyB7MH0iLmZvcm1hdCgxKzIpXG4gICBcJ1RoZSBzdW0gb2YgMSArIDIgaXMgM1wnXG5cbiAgIFNlZSAqRm9ybWF0IFN0cmluZyBTeW50YXgqIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSB2YXJpb3VzXG4gICBmb3JtYXR0aW5nIG9wdGlvbnMgdGhhdCBjYW4gYmUgc3BlY2lmaWVkIGluIGZvcm1hdCBzdHJpbmdzLlxuXG4gICBUaGlzIG1ldGhvZCBvZiBzdHJpbmcgZm9ybWF0dGluZyBpcyB0aGUgbmV3IHN0YW5kYXJkIGluIFB5dGhvbiAzLjAsXG4gICBhbmQgc2hvdWxkIGJlIHByZWZlcnJlZCB0byB0aGUgYGAlYGAgZm9ybWF0dGluZyBkZXNjcmliZWQgaW5cbiAgICpTdHJpbmcgRm9ybWF0dGluZyBPcGVyYXRpb25zKiBpbiBuZXcgY29kZS5cblxuICAgTmV3IGluIHZlcnNpb24gMi42LlxuXG5zdHIuaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSlcblxuICAgTGlrZSBgYGZpbmQoKWBgLCBidXQgcmFpc2UgYGBWYWx1ZUVycm9yYGAgd2hlbiB0aGUgc3Vic3RyaW5nIGlzIG5vdFxuICAgZm91bmQuXG5cbnN0ci5pc2FsbnVtKClcblxuICAgUmV0dXJuIHRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgYWxwaGFudW1lcmljIGFuZFxuICAgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLmlzYWxwaGEoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBhbHBoYWJldGljIGFuZFxuICAgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLmlzZGlnaXQoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBkaWdpdHMgYW5kIHRoZXJlIGlzXG4gICBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuaXNsb3dlcigpXG5cbiAgIFJldHVybiB0cnVlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGxvd2VyY2FzZSBhbmRcbiAgIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS5cblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci5pc3NwYWNlKClcblxuICAgUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmdcbiAgIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuaXN0aXRsZSgpXG5cbiAgIFJldHVybiB0cnVlIGlmIHRoZSBzdHJpbmcgaXMgYSB0aXRsZWNhc2VkIHN0cmluZyBhbmQgdGhlcmUgaXMgYXRcbiAgIGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZvciBleGFtcGxlIHVwcGVyY2FzZSBjaGFyYWN0ZXJzIG1heSBvbmx5XG4gICBmb2xsb3cgdW5jYXNlZCBjaGFyYWN0ZXJzIGFuZCBsb3dlcmNhc2UgY2hhcmFjdGVycyBvbmx5IGNhc2VkIG9uZXMuXG4gICBSZXR1cm4gZmFsc2Ugb3RoZXJ3aXNlLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLmlzdXBwZXIoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2FzZWQgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSB1cHBlcmNhc2UgYW5kXG4gICB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuam9pbihpdGVyYWJsZSlcblxuICAgUmV0dXJuIGEgc3RyaW5nIHdoaWNoIGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBzdHJpbmdzIGluIHRoZVxuICAgKml0ZXJhYmxlKiAqaXRlcmFibGUqLiAgVGhlIHNlcGFyYXRvciBiZXR3ZWVuIGVsZW1lbnRzIGlzIHRoZVxuICAgc3RyaW5nIHByb3ZpZGluZyB0aGlzIG1ldGhvZC5cblxuc3RyLmxqdXN0KHdpZHRoWywgZmlsbGNoYXJdKVxuXG4gICBSZXR1cm4gdGhlIHN0cmluZyBsZWZ0IGp1c3RpZmllZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi5cbiAgIFBhZGRpbmcgaXMgZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkICpmaWxsY2hhciogKGRlZmF1bHQgaXMgYVxuICAgc3BhY2UpLiAgVGhlIG9yaWdpbmFsIHN0cmluZyBpcyByZXR1cm5lZCBpZiAqd2lkdGgqIGlzIGxlc3MgdGhhblxuICAgYGBsZW4ocylgYC5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNDogU3VwcG9ydCBmb3IgdGhlICpmaWxsY2hhciogYXJndW1lbnQuXG5cbnN0ci5sb3dlcigpXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLmxzdHJpcChbY2hhcnNdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBsZWFkaW5nIGNoYXJhY3RlcnMgcmVtb3ZlZC4gIFRoZVxuICAgKmNoYXJzKiBhcmd1bWVudCBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBzZXQgb2YgY2hhcmFjdGVycyB0byBiZVxuICAgcmVtb3ZlZC4gIElmIG9taXR0ZWQgb3IgYGBOb25lYGAsIHRoZSAqY2hhcnMqIGFyZ3VtZW50IGRlZmF1bHRzIHRvXG4gICByZW1vdmluZyB3aGl0ZXNwYWNlLiAgVGhlICpjaGFycyogYXJndW1lbnQgaXMgbm90IGEgcHJlZml4OyByYXRoZXIsXG4gICBhbGwgY29tYmluYXRpb25zIG9mIGl0cyB2YWx1ZXMgYXJlIHN0cmlwcGVkOlxuXG4gICA+Pj4gXCcgICBzcGFjaW91cyAgIFwnLmxzdHJpcCgpXG4gICBcJ3NwYWNpb3VzICAgXCdcbiAgID4+PiBcJ3d3dy5leGFtcGxlLmNvbVwnLmxzdHJpcChcJ2Ntb3d6LlwnKVxuICAgXCdleGFtcGxlLmNvbVwnXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjIuMjogU3VwcG9ydCBmb3IgdGhlICpjaGFycyogYXJndW1lbnQuXG5cbnN0ci5wYXJ0aXRpb24oc2VwKVxuXG4gICBTcGxpdCB0aGUgc3RyaW5nIGF0IHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mICpzZXAqLCBhbmQgcmV0dXJuIGFcbiAgIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlIHNlcGFyYXRvclxuICAgaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgdGhlIHNlcGFyYXRvci4gIElmIHRoZSBzZXBhcmF0b3IgaXMgbm90XG4gICBmb3VuZCwgcmV0dXJuIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBzdHJpbmcgaXRzZWxmLCBmb2xsb3dlZCBieVxuICAgdHdvIGVtcHR5IHN0cmluZ3MuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDIuNS5cblxuc3RyLnJlcGxhY2Uob2xkLCBuZXdbLCBjb3VudF0pXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGFsbCBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgKm9sZCpcbiAgIHJlcGxhY2VkIGJ5ICpuZXcqLiAgSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50ICpjb3VudCogaXMgZ2l2ZW4sIG9ubHlcbiAgIHRoZSBmaXJzdCAqY291bnQqIG9jY3VycmVuY2VzIGFyZSByZXBsYWNlZC5cblxuc3RyLnJmaW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiB0aGUgaGlnaGVzdCBpbmRleCBpbiB0aGUgc3RyaW5nIHdoZXJlIHN1YnN0cmluZyAqc3ViKiBpc1xuICAgZm91bmQsIHN1Y2ggdGhhdCAqc3ViKiBpcyBjb250YWluZWQgd2l0aGluIGBgc1tzdGFydDplbmRdYGAuXG4gICBPcHRpb25hbCBhcmd1bWVudHMgKnN0YXJ0KiBhbmQgKmVuZCogYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlXG4gICBub3RhdGlvbi4gIFJldHVybiBgYC0xYGAgb24gZmFpbHVyZS5cblxuc3RyLnJpbmRleChzdWJbLCBzdGFydFssIGVuZF1dKVxuXG4gICBMaWtlIGBgcmZpbmQoKWBgIGJ1dCByYWlzZXMgYGBWYWx1ZUVycm9yYGAgd2hlbiB0aGUgc3Vic3RyaW5nICpzdWIqXG4gICBpcyBub3QgZm91bmQuXG5cbnN0ci5yanVzdCh3aWR0aFssIGZpbGxjaGFyXSlcblxuICAgUmV0dXJuIHRoZSBzdHJpbmcgcmlnaHQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCAqd2lkdGgqLlxuICAgUGFkZGluZyBpcyBkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgKmZpbGxjaGFyKiAoZGVmYXVsdCBpcyBhXG4gICBzcGFjZSkuIFRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW5cbiAgIGBgbGVuKHMpYGAuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjQ6IFN1cHBvcnQgZm9yIHRoZSAqZmlsbGNoYXIqIGFyZ3VtZW50LlxuXG5zdHIucnBhcnRpdGlvbihzZXApXG5cbiAgIFNwbGl0IHRoZSBzdHJpbmcgYXQgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiAqc2VwKiwgYW5kIHJldHVybiBhXG4gICAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHBhcnQgYmVmb3JlIHRoZSBzZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3JcbiAgIGl0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIHRoZSBzZXBhcmF0b3IuICBJZiB0aGUgc2VwYXJhdG9yIGlzIG5vdFxuICAgZm91bmQsIHJldHVybiBhIDMtdHVwbGUgY29udGFpbmluZyB0d28gZW1wdHkgc3RyaW5ncywgZm9sbG93ZWQgYnlcbiAgIHRoZSBzdHJpbmcgaXRzZWxmLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjUuXG5cbnN0ci5yc3BsaXQoW3NlcFssIG1heHNwbGl0XV0pXG5cbiAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcsIHVzaW5nICpzZXAqIGFzIHRoZVxuICAgZGVsaW1pdGVyIHN0cmluZy4gSWYgKm1heHNwbGl0KiBpcyBnaXZlbiwgYXQgbW9zdCAqbWF4c3BsaXQqIHNwbGl0c1xuICAgYXJlIGRvbmUsIHRoZSAqcmlnaHRtb3N0KiBvbmVzLiAgSWYgKnNlcCogaXMgbm90IHNwZWNpZmllZCBvclxuICAgYGBOb25lYGAsIGFueSB3aGl0ZXNwYWNlIHN0cmluZyBpcyBhIHNlcGFyYXRvci4gIEV4Y2VwdCBmb3JcbiAgIHNwbGl0dGluZyBmcm9tIHRoZSByaWdodCwgYGByc3BsaXQoKWBgIGJlaGF2ZXMgbGlrZSBgYHNwbGl0KClgYFxuICAgd2hpY2ggaXMgZGVzY3JpYmVkIGluIGRldGFpbCBiZWxvdy5cblxuICAgTmV3IGluIHZlcnNpb24gMi40LlxuXG5zdHIucnN0cmlwKFtjaGFyc10pXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHRyYWlsaW5nIGNoYXJhY3RlcnMgcmVtb3ZlZC4gIFRoZVxuICAgKmNoYXJzKiBhcmd1bWVudCBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBzZXQgb2YgY2hhcmFjdGVycyB0byBiZVxuICAgcmVtb3ZlZC4gIElmIG9taXR0ZWQgb3IgYGBOb25lYGAsIHRoZSAqY2hhcnMqIGFyZ3VtZW50IGRlZmF1bHRzIHRvXG4gICByZW1vdmluZyB3aGl0ZXNwYWNlLiAgVGhlICpjaGFycyogYXJndW1lbnQgaXMgbm90IGEgc3VmZml4OyByYXRoZXIsXG4gICBhbGwgY29tYmluYXRpb25zIG9mIGl0cyB2YWx1ZXMgYXJlIHN0cmlwcGVkOlxuXG4gICA+Pj4gXCcgICBzcGFjaW91cyAgIFwnLnJzdHJpcCgpXG4gICBcJyAgIHNwYWNpb3VzXCdcbiAgID4+PiBcJ21pc3Npc3NpcHBpXCcucnN0cmlwKFwnaXB6XCcpXG4gICBcJ21pc3Npc3NcJ1xuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4yLjI6IFN1cHBvcnQgZm9yIHRoZSAqY2hhcnMqIGFyZ3VtZW50LlxuXG5zdHIuc3BsaXQoW3NlcFssIG1heHNwbGl0XV0pXG5cbiAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcsIHVzaW5nICpzZXAqIGFzIHRoZVxuICAgZGVsaW1pdGVyIHN0cmluZy4gIElmICptYXhzcGxpdCogaXMgZ2l2ZW4sIGF0IG1vc3QgKm1heHNwbGl0KlxuICAgc3BsaXRzIGFyZSBkb25lICh0aHVzLCB0aGUgbGlzdCB3aWxsIGhhdmUgYXQgbW9zdCBgYG1heHNwbGl0KzFgYFxuICAgZWxlbWVudHMpLiAgSWYgKm1heHNwbGl0KiBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRoZXJlIGlzIG5vIGxpbWl0XG4gICBvbiB0aGUgbnVtYmVyIG9mIHNwbGl0cyAoYWxsIHBvc3NpYmxlIHNwbGl0cyBhcmUgbWFkZSkuXG5cbiAgIElmICpzZXAqIGlzIGdpdmVuLCBjb25zZWN1dGl2ZSBkZWxpbWl0ZXJzIGFyZSBub3QgZ3JvdXBlZCB0b2dldGhlclxuICAgYW5kIGFyZSBkZWVtZWQgdG8gZGVsaW1pdCBlbXB0eSBzdHJpbmdzIChmb3IgZXhhbXBsZSxcbiAgIGBgXCcxLCwyXCcuc3BsaXQoXCcsXCcpYGAgcmV0dXJucyBgYFtcJzFcJywgXCdcJywgXCcyXCddYGApLiAgVGhlICpzZXAqXG4gICBhcmd1bWVudCBtYXkgY29uc2lzdCBvZiBtdWx0aXBsZSBjaGFyYWN0ZXJzIChmb3IgZXhhbXBsZSxcbiAgIGBgXCcxPD4yPD4zXCcuc3BsaXQoXCc8PlwnKWBgIHJldHVybnMgYGBbXCcxXCcsIFwnMlwnLCBcJzNcJ11gYCkuIFNwbGl0dGluZ1xuICAgYW4gZW1wdHkgc3RyaW5nIHdpdGggYSBzcGVjaWZpZWQgc2VwYXJhdG9yIHJldHVybnMgYGBbXCdcJ11gYC5cblxuICAgSWYgKnNlcCogaXMgbm90IHNwZWNpZmllZCBvciBpcyBgYE5vbmVgYCwgYSBkaWZmZXJlbnQgc3BsaXR0aW5nXG4gICBhbGdvcml0aG0gaXMgYXBwbGllZDogcnVucyBvZiBjb25zZWN1dGl2ZSB3aGl0ZXNwYWNlIGFyZSByZWdhcmRlZFxuICAgYXMgYSBzaW5nbGUgc2VwYXJhdG9yLCBhbmQgdGhlIHJlc3VsdCB3aWxsIGNvbnRhaW4gbm8gZW1wdHkgc3RyaW5nc1xuICAgYXQgdGhlIHN0YXJ0IG9yIGVuZCBpZiB0aGUgc3RyaW5nIGhhcyBsZWFkaW5nIG9yIHRyYWlsaW5nXG4gICB3aGl0ZXNwYWNlLiAgQ29uc2VxdWVudGx5LCBzcGxpdHRpbmcgYW4gZW1wdHkgc3RyaW5nIG9yIGEgc3RyaW5nXG4gICBjb25zaXN0aW5nIG9mIGp1c3Qgd2hpdGVzcGFjZSB3aXRoIGEgYGBOb25lYGAgc2VwYXJhdG9yIHJldHVybnNcbiAgIGBgW11gYC5cblxuICAgRm9yIGV4YW1wbGUsIGBgXCcgMSAgMiAgIDMgIFwnLnNwbGl0KClgYCByZXR1cm5zIGBgW1wnMVwnLCBcJzJcJywgXCczXCddYGAsXG4gICBhbmQgYGBcJyAgMSAgMiAgIDMgIFwnLnNwbGl0KE5vbmUsIDEpYGAgcmV0dXJucyBgYFtcJzFcJywgXCcyICAgMyAgXCddYGAuXG5cbnN0ci5zcGxpdGxpbmVzKFtrZWVwZW5kc10pXG5cbiAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIGxpbmVzIGluIHRoZSBzdHJpbmcsIGJyZWFraW5nIGF0IGxpbmVcbiAgIGJvdW5kYXJpZXMuICBMaW5lIGJyZWFrcyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgbGlzdFxuICAgdW5sZXNzICprZWVwZW5kcyogaXMgZ2l2ZW4gYW5kIHRydWUuXG5cbnN0ci5zdGFydHN3aXRoKHByZWZpeFssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiBgYFRydWVgYCBpZiBzdHJpbmcgc3RhcnRzIHdpdGggdGhlICpwcmVmaXgqLCBvdGhlcndpc2VcbiAgIHJldHVybiBgYEZhbHNlYGAuICpwcmVmaXgqIGNhbiBhbHNvIGJlIGEgdHVwbGUgb2YgcHJlZml4ZXMgdG8gbG9va1xuICAgZm9yLiAgV2l0aCBvcHRpb25hbCAqc3RhcnQqLCB0ZXN0IHN0cmluZyBiZWdpbm5pbmcgYXQgdGhhdFxuICAgcG9zaXRpb24uICBXaXRoIG9wdGlvbmFsICplbmQqLCBzdG9wIGNvbXBhcmluZyBzdHJpbmcgYXQgdGhhdFxuICAgcG9zaXRpb24uXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjU6IEFjY2VwdCB0dXBsZXMgYXMgKnByZWZpeCouXG5cbnN0ci5zdHJpcChbY2hhcnNdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCB0aGUgbGVhZGluZyBhbmQgdHJhaWxpbmdcbiAgIGNoYXJhY3RlcnMgcmVtb3ZlZC4gVGhlICpjaGFycyogYXJndW1lbnQgaXMgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGVcbiAgIHNldCBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlbW92ZWQuIElmIG9taXR0ZWQgb3IgYGBOb25lYGAsIHRoZVxuICAgKmNoYXJzKiBhcmd1bWVudCBkZWZhdWx0cyB0byByZW1vdmluZyB3aGl0ZXNwYWNlLiBUaGUgKmNoYXJzKlxuICAgYXJndW1lbnQgaXMgbm90IGEgcHJlZml4IG9yIHN1ZmZpeDsgcmF0aGVyLCBhbGwgY29tYmluYXRpb25zIG9mIGl0c1xuICAgdmFsdWVzIGFyZSBzdHJpcHBlZDpcblxuICAgPj4+IFwnICAgc3BhY2lvdXMgICBcJy5zdHJpcCgpXG4gICBcJ3NwYWNpb3VzXCdcbiAgID4+PiBcJ3d3dy5leGFtcGxlLmNvbVwnLnN0cmlwKFwnY21vd3ouXCcpXG4gICBcJ2V4YW1wbGVcJ1xuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4yLjI6IFN1cHBvcnQgZm9yIHRoZSAqY2hhcnMqIGFyZ3VtZW50LlxuXG5zdHIuc3dhcGNhc2UoKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCB1cHBlcmNhc2UgY2hhcmFjdGVycyBjb252ZXJ0ZWQgdG9cbiAgIGxvd2VyY2FzZSBhbmQgdmljZSB2ZXJzYS5cblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci50aXRsZSgpXG5cbiAgIFJldHVybiBhIHRpdGxlY2FzZWQgdmVyc2lvbiBvZiB0aGUgc3RyaW5nIHdoZXJlIHdvcmRzIHN0YXJ0IHdpdGggYW5cbiAgIHVwcGVyY2FzZSBjaGFyYWN0ZXIgYW5kIHRoZSByZW1haW5pbmcgY2hhcmFjdGVycyBhcmUgbG93ZXJjYXNlLlxuXG4gICBUaGUgYWxnb3JpdGhtIHVzZXMgYSBzaW1wbGUgbGFuZ3VhZ2UtaW5kZXBlbmRlbnQgZGVmaW5pdGlvbiBvZiBhXG4gICB3b3JkIGFzIGdyb3VwcyBvZiBjb25zZWN1dGl2ZSBsZXR0ZXJzLiAgVGhlIGRlZmluaXRpb24gd29ya3MgaW5cbiAgIG1hbnkgY29udGV4dHMgYnV0IGl0IG1lYW5zIHRoYXQgYXBvc3Ryb3BoZXMgaW4gY29udHJhY3Rpb25zIGFuZFxuICAgcG9zc2Vzc2l2ZXMgZm9ybSB3b3JkIGJvdW5kYXJpZXMsIHdoaWNoIG1heSBub3QgYmUgdGhlIGRlc2lyZWRcbiAgIHJlc3VsdDpcblxuICAgICAgPj4+ICJ0aGV5XCdyZSBiaWxsXCdzIGZyaWVuZHMgZnJvbSB0aGUgVUsiLnRpdGxlKClcbiAgICAgICJUaGV5XCdSZSBCaWxsXCdTIEZyaWVuZHMgRnJvbSBUaGUgVWsiXG5cbiAgIEEgd29ya2Fyb3VuZCBmb3IgYXBvc3Ryb3BoZXMgY2FuIGJlIGNvbnN0cnVjdGVkIHVzaW5nIHJlZ3VsYXJcbiAgIGV4cHJlc3Npb25zOlxuXG4gICAgICA+Pj4gaW1wb3J0IHJlXG4gICAgICA+Pj4gZGVmIHRpdGxlY2FzZShzKTpcbiAgICAgICAgICAgICAgcmV0dXJuIHJlLnN1YihyIltBLVphLXpdKyhcJ1tBLVphLXpdKyk/IixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEgbW86IG1vLmdyb3VwKDApWzBdLnVwcGVyKCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8uZ3JvdXAoMClbMTpdLmxvd2VyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcylcblxuICAgICAgPj4+IHRpdGxlY2FzZSgidGhleVwncmUgYmlsbFwncyBmcmllbmRzLiIpXG4gICAgICAiVGhleVwncmUgQmlsbFwncyBGcmllbmRzLiJcblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci50cmFuc2xhdGUodGFibGVbLCBkZWxldGVjaGFyc10pXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aGVyZSBhbGwgY2hhcmFjdGVycyBvY2N1cnJpbmcgaW4gdGhlXG4gICBvcHRpb25hbCBhcmd1bWVudCAqZGVsZXRlY2hhcnMqIGFyZSByZW1vdmVkLCBhbmQgdGhlIHJlbWFpbmluZ1xuICAgY2hhcmFjdGVycyBoYXZlIGJlZW4gbWFwcGVkIHRocm91Z2ggdGhlIGdpdmVuIHRyYW5zbGF0aW9uIHRhYmxlLFxuICAgd2hpY2ggbXVzdCBiZSBhIHN0cmluZyBvZiBsZW5ndGggMjU2LlxuXG4gICBZb3UgY2FuIHVzZSB0aGUgYGBtYWtldHJhbnMoKWBgIGhlbHBlciBmdW5jdGlvbiBpbiB0aGUgYGBzdHJpbmdgYFxuICAgbW9kdWxlIHRvIGNyZWF0ZSBhIHRyYW5zbGF0aW9uIHRhYmxlLiBGb3Igc3RyaW5nIG9iamVjdHMsIHNldCB0aGVcbiAgICp0YWJsZSogYXJndW1lbnQgdG8gYGBOb25lYGAgZm9yIHRyYW5zbGF0aW9ucyB0aGF0IG9ubHkgZGVsZXRlXG4gICBjaGFyYWN0ZXJzOlxuXG4gICA+Pj4gXCdyZWFkIHRoaXMgc2hvcnQgdGV4dFwnLnRyYW5zbGF0ZShOb25lLCBcJ2FlaW91XCcpXG4gICBcJ3JkIHRocyBzaHJ0IHR4dFwnXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDIuNjogU3VwcG9ydCBmb3IgYSBgYE5vbmVgYCAqdGFibGUqIGFyZ3VtZW50LlxuXG4gICBGb3IgVW5pY29kZSBvYmplY3RzLCB0aGUgYGB0cmFuc2xhdGUoKWBgIG1ldGhvZCBkb2VzIG5vdCBhY2NlcHQgdGhlXG4gICBvcHRpb25hbCAqZGVsZXRlY2hhcnMqIGFyZ3VtZW50LiAgSW5zdGVhZCwgaXQgcmV0dXJucyBhIGNvcHkgb2YgdGhlXG4gICAqcyogd2hlcmUgYWxsIGNoYXJhY3RlcnMgaGF2ZSBiZWVuIG1hcHBlZCB0aHJvdWdoIHRoZSBnaXZlblxuICAgdHJhbnNsYXRpb24gdGFibGUgd2hpY2ggbXVzdCBiZSBhIG1hcHBpbmcgb2YgVW5pY29kZSBvcmRpbmFscyB0b1xuICAgVW5pY29kZSBvcmRpbmFscywgVW5pY29kZSBzdHJpbmdzIG9yIGBgTm9uZWBgLiBVbm1hcHBlZCBjaGFyYWN0ZXJzXG4gICBhcmUgbGVmdCB1bnRvdWNoZWQuIENoYXJhY3RlcnMgbWFwcGVkIHRvIGBgTm9uZWBgIGFyZSBkZWxldGVkLlxuICAgTm90ZSwgYSBtb3JlIGZsZXhpYmxlIGFwcHJvYWNoIGlzIHRvIGNyZWF0ZSBhIGN1c3RvbSBjaGFyYWN0ZXJcbiAgIG1hcHBpbmcgY29kZWMgdXNpbmcgdGhlIGBgY29kZWNzYGAgbW9kdWxlIChzZWUgYGBlbmNvZGluZ3MuY3AxMjUxYGBcbiAgIGZvciBhbiBleGFtcGxlKS5cblxuc3RyLnVwcGVyKClcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuemZpbGwod2lkdGgpXG5cbiAgIFJldHVybiB0aGUgbnVtZXJpYyBzdHJpbmcgbGVmdCBmaWxsZWQgd2l0aCB6ZXJvcyBpbiBhIHN0cmluZyBvZlxuICAgbGVuZ3RoICp3aWR0aCouICBBIHNpZ24gcHJlZml4IGlzIGhhbmRsZWQgY29ycmVjdGx5LiAgVGhlIG9yaWdpbmFsXG4gICBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW4gYGBsZW4ocylgYC5cblxuICAgTmV3IGluIHZlcnNpb24gMi4yLjIuXG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgcHJlc2VudCBvbmx5IG9uIHVuaWNvZGUgb2JqZWN0czpcblxudW5pY29kZS5pc251bWVyaWMoKVxuXG4gICBSZXR1cm4gYGBUcnVlYGAgaWYgdGhlcmUgYXJlIG9ubHkgbnVtZXJpYyBjaGFyYWN0ZXJzIGluIFMsXG4gICBgYEZhbHNlYGAgb3RoZXJ3aXNlLiBOdW1lcmljIGNoYXJhY3RlcnMgaW5jbHVkZSBkaWdpdCBjaGFyYWN0ZXJzLFxuICAgYW5kIGFsbCBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSB0aGUgVW5pY29kZSBudW1lcmljIHZhbHVlIHByb3BlcnR5LFxuICAgZS5nLiBVKzIxNTUsIFZVTEdBUiBGUkFDVElPTiBPTkUgRklGVEguXG5cbnVuaWNvZGUuaXNkZWNpbWFsKClcblxuICAgUmV0dXJuIGBgVHJ1ZWBgIGlmIHRoZXJlIGFyZSBvbmx5IGRlY2ltYWwgY2hhcmFjdGVycyBpbiBTLFxuICAgYGBGYWxzZWBgIG90aGVyd2lzZS4gRGVjaW1hbCBjaGFyYWN0ZXJzIGluY2x1ZGUgZGlnaXQgY2hhcmFjdGVycyxcbiAgIGFuZCBhbGwgY2hhcmFjdGVycyB0aGF0IHRoYXQgY2FuIGJlIHVzZWQgdG8gZm9ybSBkZWNpbWFsLXJhZGl4XG4gICBudW1iZXJzLCBlLmcuIFUrMDY2MCwgQVJBQklDLUlORElDIERJR0lUIFpFUk8uXG4nLAotICdzdHJpbmdzJzogdSdcblN0cmluZyBsaXRlcmFsc1xuKioqKioqKioqKioqKioqXG5cblN0cmluZyBsaXRlcmFscyBhcmUgZGVzY3JpYmVkIGJ5IHRoZSBmb2xsb3dpbmcgbGV4aWNhbCBkZWZpbml0aW9uczpcblxuICAgc3RyaW5nbGl0ZXJhbCAgIDo6PSBbc3RyaW5ncHJlZml4XShzaG9ydHN0cmluZyB8IGxvbmdzdHJpbmcpXG4gICBzdHJpbmdwcmVmaXggICAgOjo9ICJyIiB8ICJ1IiB8ICJ1ciIgfCAiUiIgfCAiVSIgfCAiVVIiIHwgIlVyIiB8ICJ1UiJcbiAgICAgICAgICAgICAgICAgICAgfCAiYiIgfCAiQiIgfCAiYnIiIHwgIkJyIiB8ICJiUiIgfCAiQlIiXG4gICBzaG9ydHN0cmluZyAgICAgOjo9ICJcJyIgc2hvcnRzdHJpbmdpdGVtKiAiXCciIHwgXCciXCcgc2hvcnRzdHJpbmdpdGVtKiBcJyJcJ1xuICAgbG9uZ3N0cmluZyAgICAgIDo6PSAiXCdcJ1wnIiBsb25nc3RyaW5naXRlbSogIlwnXCdcJyJcbiAgICAgICAgICAgICAgICAgIHwgXCciIiJcJyBsb25nc3RyaW5naXRlbSogXCciIiJcJ1xuICAgc2hvcnRzdHJpbmdpdGVtIDo6PSBzaG9ydHN0cmluZ2NoYXIgfCBlc2NhcGVzZXFcbiAgIGxvbmdzdHJpbmdpdGVtICA6Oj0gbG9uZ3N0cmluZ2NoYXIgfCBlc2NhcGVzZXFcbiAgIHNob3J0c3RyaW5nY2hhciA6Oj0gPGFueSBzb3VyY2UgY2hhcmFjdGVyIGV4Y2VwdCAiXFwiIG9yIG5ld2xpbmUgb3IgdGhlIHF1b3RlPlxuICAgbG9uZ3N0cmluZ2NoYXIgIDo6PSA8YW55IHNvdXJjZSBjaGFyYWN0ZXIgZXhjZXB0ICJcXCI+XG4gICBlc2NhcGVzZXEgICAgICAgOjo9ICJcXCIgPGFueSBBU0NJSSBjaGFyYWN0ZXI+XG5cbk9uZSBzeW50YWN0aWMgcmVzdHJpY3Rpb24gbm90IGluZGljYXRlZCBieSB0aGVzZSBwcm9kdWN0aW9ucyBpcyB0aGF0XG53aGl0ZXNwYWNlIGlzIG5vdCBhbGxvd2VkIGJldHdlZW4gdGhlICoqc3RyaW5ncHJlZml4KiogYW5kIHRoZSByZXN0IG9mXG50aGUgc3RyaW5nIGxpdGVyYWwuIFRoZSBzb3VyY2UgY2hhcmFjdGVyIHNldCBpcyBkZWZpbmVkIGJ5IHRoZVxuZW5jb2RpbmcgZGVjbGFyYXRpb247IGl0IGlzIEFTQ0lJIGlmIG5vIGVuY29kaW5nIGRlY2xhcmF0aW9uIGlzIGdpdmVuXG5pbiB0aGUgc291cmNlIGZpbGU7IHNlZSBzZWN0aW9uICpFbmNvZGluZyBkZWNsYXJhdGlvbnMqLlxuXG5JbiBwbGFpbiBFbmdsaXNoOiBTdHJpbmcgbGl0ZXJhbHMgY2FuIGJlIGVuY2xvc2VkIGluIG1hdGNoaW5nIHNpbmdsZVxucXVvdGVzIChgYFwnYGApIG9yIGRvdWJsZSBxdW90ZXMgKGBgImBgKS4gIFRoZXkgY2FuIGFsc28gYmUgZW5jbG9zZWQgaW5cbm1hdGNoaW5nIGdyb3VwcyBvZiB0aHJlZSBzaW5nbGUgb3IgZG91YmxlIHF1b3RlcyAodGhlc2UgYXJlIGdlbmVyYWxseVxucmVmZXJyZWQgdG8gYXMgKnRyaXBsZS1xdW90ZWQgc3RyaW5ncyopLiAgVGhlIGJhY2tzbGFzaCAoYGBcXGBgKVxuY2hhcmFjdGVyIGlzIHVzZWQgdG8gZXNjYXBlIGNoYXJhY3RlcnMgdGhhdCBvdGhlcndpc2UgaGF2ZSBhIHNwZWNpYWxcbm1lYW5pbmcsIHN1Y2ggYXMgbmV3bGluZSwgYmFja3NsYXNoIGl0c2VsZiwgb3IgdGhlIHF1b3RlIGNoYXJhY3Rlci5cblN0cmluZyBsaXRlcmFscyBtYXkgb3B0aW9uYWxseSBiZSBwcmVmaXhlZCB3aXRoIGEgbGV0dGVyIGBgXCdyXCdgYCBvclxuYGBcJ1JcJ2BgOyBzdWNoIHN0cmluZ3MgYXJlIGNhbGxlZCAqcmF3IHN0cmluZ3MqIGFuZCB1c2UgZGlmZmVyZW50IHJ1bGVzXG5mb3IgaW50ZXJwcmV0aW5nIGJhY2tzbGFzaCBlc2NhcGUgc2VxdWVuY2VzLiAgQSBwcmVmaXggb2YgYGBcJ3VcJ2BgIG9yXG5gYFwnVVwnYGAgbWFrZXMgdGhlIHN0cmluZyBhIFVuaWNvZGUgc3RyaW5nLiAgVW5pY29kZSBzdHJpbmdzIHVzZSB0aGVcblVuaWNvZGUgY2hhcmFjdGVyIHNldCBhcyBkZWZpbmVkIGJ5IHRoZSBVbmljb2RlIENvbnNvcnRpdW0gYW5kIElTT1xuMTA2NDYuICBTb21lIGFkZGl0aW9uYWwgZXNjYXBlIHNlcXVlbmNlcywgZGVzY3JpYmVkIGJlbG93LCBhcmVcbmF2YWlsYWJsZSBpbiBVbmljb2RlIHN0cmluZ3MuIEEgcHJlZml4IG9mIGBgXCdiXCdgYCBvciBgYFwnQlwnYGAgaXNcbmlnbm9yZWQgaW4gUHl0aG9uIDI7IGl0IGluZGljYXRlcyB0aGF0IHRoZSBsaXRlcmFsIHNob3VsZCBiZWNvbWUgYVxuYnl0ZXMgbGl0ZXJhbCBpbiBQeXRob24gMyAoZS5nLiB3aGVuIGNvZGUgaXMgYXV0b21hdGljYWxseSBjb252ZXJ0ZWRcbndpdGggMnRvMykuICBBIGBgXCd1XCdgYCBvciBgYFwnYlwnYGAgcHJlZml4IG1heSBiZSBmb2xsb3dlZCBieSBhbiBgYFwnclwnYGBcbnByZWZpeC5cblxuSW4gdHJpcGxlLXF1b3RlZCBzdHJpbmdzLCB1bmVzY2FwZWQgbmV3bGluZXMgYW5kIHF1b3RlcyBhcmUgYWxsb3dlZFxuKGFuZCBhcmUgcmV0YWluZWQpLCBleGNlcHQgdGhhdCB0aHJlZSB1bmVzY2FwZWQgcXVvdGVzIGluIGEgcm93XG50ZXJtaW5hdGUgdGhlIHN0cmluZy4gIChBICJxdW90ZSIgaXMgdGhlIGNoYXJhY3RlciB1c2VkIHRvIG9wZW4gdGhlXG5zdHJpbmcsIGkuZS4gZWl0aGVyIGBgXCdgYCBvciBgYCJgYC4pXG5cblVubGVzcyBhbiBgYFwnclwnYGAgb3IgYGBcJ1JcJ2BgIHByZWZpeCBpcyBwcmVzZW50LCBlc2NhcGUgc2VxdWVuY2VzIGluXG5zdHJpbmdzIGFyZSBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gcnVsZXMgc2ltaWxhciB0byB0aG9zZSB1c2VkIGJ5XG5TdGFuZGFyZCBDLiAgVGhlIHJlY29nbml6ZWQgZXNjYXBlIHNlcXVlbmNlcyBhcmU6XG5cbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgRXNjYXBlIFNlcXVlbmNlICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgIHxcbis9PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PStcbnwgYGBcXG5ld2xpbmVgYCAgICAgIHwgSWdub3JlZCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXFxcXGBgICAgICAgICAgICAgfCBCYWNrc2xhc2ggKGBgXFxgYCkgICAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXFxcJ2BgICAgICAgICAgICAgfCBTaW5nbGUgcXVvdGUgKGBgXCdgYCkgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXFwiYGAgICAgICAgICAgICB8IERvdWJsZSBxdW90ZSAoYGAiYGApICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFxcYWBgICAgICAgICAgICAgfCBBU0NJSSBCZWxsIChCRUwpICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcXGJgYCAgICAgICAgICAgIHwgQVNDSUkgQmFja3NwYWNlIChCUykgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXFxmYGAgICAgICAgICAgICB8IEFTQ0lJIEZvcm1mZWVkIChGRikgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFxcbmBgICAgICAgICAgICAgfCBBU0NJSSBMaW5lZmVlZCAoTEYpICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcXE57bmFtZX1gYCAgICAgIHwgQ2hhcmFjdGVyIG5hbWVkICpuYW1lKiBpbiB0aGUgICAgIHwgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgIHwgVW5pY29kZSBkYXRhYmFzZSAoVW5pY29kZSBvbmx5KSAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXFxyYGAgICAgICAgICAgICB8IEFTQ0lJIENhcnJpYWdlIFJldHVybiAoQ1IpICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFxcdGBgICAgICAgICAgICAgfCBBU0NJSSBIb3Jpem9udGFsIFRhYiAoVEFCKSAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcXHV4eHh4YGAgICAgICAgIHwgQ2hhcmFjdGVyIHdpdGggMTYtYml0IGhleCB2YWx1ZSAgIHwgKDEpICAgICB8XG58ICAgICAgICAgICAgICAgICAgIHwgKnh4eHgqIChVbmljb2RlIG9ubHkpICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXFxVeHh4eHh4eHhgYCAgICB8IENoYXJhY3RlciB3aXRoIDMyLWJpdCBoZXggdmFsdWUgICB8ICgyKSAgICAgfFxufCAgICAgICAgICAgICAgICAgICB8ICp4eHh4eHh4eCogKFVuaWNvZGUgb25seSkgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFxcdmBgICAgICAgICAgICAgfCBBU0NJSSBWZXJ0aWNhbCBUYWIgKFZUKSAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcXG9vb2BgICAgICAgICAgIHwgQ2hhcmFjdGVyIHdpdGggb2N0YWwgdmFsdWUgKm9vbyogIHwgKDMsNSkgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXFx4aGhgYCAgICAgICAgICB8IENoYXJhY3RlciB3aXRoIGhleCB2YWx1ZSAqaGgqICAgICB8ICg0LDUpICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuXG5Ob3RlczpcblxuMS4gSW5kaXZpZHVhbCBjb2RlIHVuaXRzIHdoaWNoIGZvcm0gcGFydHMgb2YgYSBzdXJyb2dhdGUgcGFpciBjYW4gYmVcbiAgIGVuY29kZWQgdXNpbmcgdGhpcyBlc2NhcGUgc2VxdWVuY2UuXG5cbjIuIEFueSBVbmljb2RlIGNoYXJhY3RlciBjYW4gYmUgZW5jb2RlZCB0aGlzIHdheSwgYnV0IGNoYXJhY3RlcnNcbiAgIG91dHNpZGUgdGhlIEJhc2ljIE11bHRpbGluZ3VhbCBQbGFuZSAoQk1QKSB3aWxsIGJlIGVuY29kZWQgdXNpbmcgYVxuICAgc3Vycm9nYXRlIHBhaXIgaWYgUHl0aG9uIGlzIGNvbXBpbGVkIHRvIHVzZSAxNi1iaXQgY29kZSB1bml0cyAodGhlXG4gICBkZWZhdWx0KS4gIEluZGl2aWR1YWwgY29kZSB1bml0cyB3aGljaCBmb3JtIHBhcnRzIG9mIGEgc3Vycm9nYXRlXG4gICBwYWlyIGNhbiBiZSBlbmNvZGVkIHVzaW5nIHRoaXMgZXNjYXBlIHNlcXVlbmNlLlxuXG4zLiBBcyBpbiBTdGFuZGFyZCBDLCB1cCB0byB0aHJlZSBvY3RhbCBkaWdpdHMgYXJlIGFjY2VwdGVkLlxuXG40LiBVbmxpa2UgaW4gU3RhbmRhcmQgQywgZXhhY3RseSB0d28gaGV4IGRpZ2l0cyBhcmUgcmVxdWlyZWQuXG5cbjUuIEluIGEgc3RyaW5nIGxpdGVyYWwsIGhleGFkZWNpbWFsIGFuZCBvY3RhbCBlc2NhcGVzIGRlbm90ZSB0aGUgYnl0ZVxuICAgd2l0aCB0aGUgZ2l2ZW4gdmFsdWU7IGl0IGlzIG5vdCBuZWNlc3NhcnkgdGhhdCB0aGUgYnl0ZSBlbmNvZGVzIGFcbiAgIGNoYXJhY3RlciBpbiB0aGUgc291cmNlIGNoYXJhY3RlciBzZXQuIEluIGEgVW5pY29kZSBsaXRlcmFsLCB0aGVzZVxuICAgZXNjYXBlcyBkZW5vdGUgYSBVbmljb2RlIGNoYXJhY3RlciB3aXRoIHRoZSBnaXZlbiB2YWx1ZS5cblxuVW5saWtlIFN0YW5kYXJkIEMsIGFsbCB1bnJlY29nbml6ZWQgZXNjYXBlIHNlcXVlbmNlcyBhcmUgbGVmdCBpbiB0aGVcbnN0cmluZyB1bmNoYW5nZWQsIGkuZS4sICp0aGUgYmFja3NsYXNoIGlzIGxlZnQgaW4gdGhlIHN0cmluZyouICAoVGhpc1xuYmVoYXZpb3IgaXMgdXNlZnVsIHdoZW4gZGVidWdnaW5nOiBpZiBhbiBlc2NhcGUgc2VxdWVuY2UgaXMgbWlzdHlwZWQsXG50aGUgcmVzdWx0aW5nIG91dHB1dCBpcyBtb3JlIGVhc2lseSByZWNvZ25pemVkIGFzIGJyb2tlbi4pICBJdCBpcyBhbHNvXG5pbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoZSBlc2NhcGUgc2VxdWVuY2VzIG1hcmtlZCBhcyAiKFVuaWNvZGUgb25seSkiXG5pbiB0aGUgdGFibGUgYWJvdmUgZmFsbCBpbnRvIHRoZSBjYXRlZ29yeSBvZiB1bnJlY29nbml6ZWQgZXNjYXBlcyBmb3Jcbm5vbi1Vbmljb2RlIHN0cmluZyBsaXRlcmFscy5cblxuV2hlbiBhbiBgYFwnclwnYGAgb3IgYGBcJ1JcJ2BgIHByZWZpeCBpcyBwcmVzZW50LCBhIGNoYXJhY3RlciBmb2xsb3dpbmcgYVxuYmFja3NsYXNoIGlzIGluY2x1ZGVkIGluIHRoZSBzdHJpbmcgd2l0aG91dCBjaGFuZ2UsIGFuZCAqYWxsXG5iYWNrc2xhc2hlcyBhcmUgbGVmdCBpbiB0aGUgc3RyaW5nKi4gIEZvciBleGFtcGxlLCB0aGUgc3RyaW5nIGxpdGVyYWxcbmBgciJcXG4iYGAgY29uc2lzdHMgb2YgdHdvIGNoYXJhY3RlcnM6IGEgYmFja3NsYXNoIGFuZCBhIGxvd2VyY2FzZVxuYGBcJ25cJ2BgLiAgU3RyaW5nIHF1b3RlcyBjYW4gYmUgZXNjYXBlZCB3aXRoIGEgYmFja3NsYXNoLCBidXQgdGhlXG5iYWNrc2xhc2ggcmVtYWlucyBpbiB0aGUgc3RyaW5nOyBmb3IgZXhhbXBsZSwgYGByIlxcIiJgYCBpcyBhIHZhbGlkXG5zdHJpbmcgbGl0ZXJhbCBjb25zaXN0aW5nIG9mIHR3byBjaGFyYWN0ZXJzOiBhIGJhY2tzbGFzaCBhbmQgYSBkb3VibGVcbnF1b3RlOyBgYHIiXFwiYGAgaXMgbm90IGEgdmFsaWQgc3RyaW5nIGxpdGVyYWwgKGV2ZW4gYSByYXcgc3RyaW5nXG5jYW5ub3QgZW5kIGluIGFuIG9kZCBudW1iZXIgb2YgYmFja3NsYXNoZXMpLiAgU3BlY2lmaWNhbGx5LCAqYSByYXdcbnN0cmluZyBjYW5ub3QgZW5kIGluIGEgc2luZ2xlIGJhY2tzbGFzaCogKHNpbmNlIHRoZSBiYWNrc2xhc2ggd291bGRcbmVzY2FwZSB0aGUgZm9sbG93aW5nIHF1b3RlIGNoYXJhY3RlcikuICBOb3RlIGFsc28gdGhhdCBhIHNpbmdsZVxuYmFja3NsYXNoIGZvbGxvd2VkIGJ5IGEgbmV3bGluZSBpcyBpbnRlcnByZXRlZCBhcyB0aG9zZSB0d28gY2hhcmFjdGVyc1xuYXMgcGFydCBvZiB0aGUgc3RyaW5nLCAqbm90KiBhcyBhIGxpbmUgY29udGludWF0aW9uLlxuXG5XaGVuIGFuIGBgXCdyXCdgYCBvciBgYFwnUlwnYGAgcHJlZml4IGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhXG5gYFwndVwnYGAgb3IgYGBcJ1VcJ2BgIHByZWZpeCwgdGhlbiB0aGUgYGBcXHVYWFhYYGAgYW5kIGBgXFxVWFhYWFhYWFhgYFxuZXNjYXBlIHNlcXVlbmNlcyBhcmUgcHJvY2Vzc2VkIHdoaWxlICAqYWxsIG90aGVyIGJhY2tzbGFzaGVzIGFyZSBsZWZ0XG5pbiB0aGUgc3RyaW5nKi4gRm9yIGV4YW1wbGUsIHRoZSBzdHJpbmcgbGl0ZXJhbCBgYHVyIlxcdTAwNjJcXG4iYGBcbmNvbnNpc3RzIG9mIHRocmVlIFVuaWNvZGUgY2hhcmFjdGVyczogXCdMQVRJTiBTTUFMTCBMRVRURVIgQlwnLCBcJ1JFVkVSU0VcblNPTElEVVNcJywgYW5kIFwnTEFUSU4gU01BTEwgTEVUVEVSIE5cJy4gQmFja3NsYXNoZXMgY2FuIGJlIGVzY2FwZWQgd2l0aFxuYSBwcmVjZWRpbmcgYmFja3NsYXNoOyBob3dldmVyLCBib3RoIHJlbWFpbiBpbiB0aGUgc3RyaW5nLiAgQXMgYVxucmVzdWx0LCBgYFxcdVhYWFhgYCBlc2NhcGUgc2VxdWVuY2VzIGFyZSBvbmx5IHJlY29nbml6ZWQgd2hlbiB0aGVyZSBhcmVcbmFuIG9kZCBudW1iZXIgb2YgYmFja3NsYXNoZXMuXG4nLAotICdzdWJzY3JpcHRpb25zJzogdSdcblN1YnNjcmlwdGlvbnNcbioqKioqKioqKioqKipcblxuQSBzdWJzY3JpcHRpb24gc2VsZWN0cyBhbiBpdGVtIG9mIGEgc2VxdWVuY2UgKHN0cmluZywgdHVwbGUgb3IgbGlzdClcbm9yIG1hcHBpbmcgKGRpY3Rpb25hcnkpIG9iamVjdDpcblxuICAgc3Vic2NyaXB0aW9uIDo6PSBwcmltYXJ5ICJbIiBleHByZXNzaW9uX2xpc3QgIl0iXG5cblRoZSBwcmltYXJ5IG11c3QgZXZhbHVhdGUgdG8gYW4gb2JqZWN0IG9mIGEgc2VxdWVuY2Ugb3IgbWFwcGluZyB0eXBlLlxuXG5JZiB0aGUgcHJpbWFyeSBpcyBhIG1hcHBpbmcsIHRoZSBleHByZXNzaW9uIGxpc3QgbXVzdCBldmFsdWF0ZSB0byBhblxub2JqZWN0IHdob3NlIHZhbHVlIGlzIG9uZSBvZiB0aGUga2V5cyBvZiB0aGUgbWFwcGluZywgYW5kIHRoZVxuc3Vic2NyaXB0aW9uIHNlbGVjdHMgdGhlIHZhbHVlIGluIHRoZSBtYXBwaW5nIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhhdFxua2V5LiAgKFRoZSBleHByZXNzaW9uIGxpc3QgaXMgYSB0dXBsZSBleGNlcHQgaWYgaXQgaGFzIGV4YWN0bHkgb25lXG5pdGVtLilcblxuSWYgdGhlIHByaW1hcnkgaXMgYSBzZXF1ZW5jZSwgdGhlIGV4cHJlc3Npb24gKGxpc3QpIG11c3QgZXZhbHVhdGUgdG8gYVxucGxhaW4gaW50ZWdlci4gIElmIHRoaXMgdmFsdWUgaXMgbmVnYXRpdmUsIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlXG5pcyBhZGRlZCB0byBpdCAoc28gdGhhdCwgZS5nLiwgYGB4Wy0xXWBgIHNlbGVjdHMgdGhlIGxhc3QgaXRlbSBvZlxuYGB4YGAuKSAgVGhlIHJlc3VsdGluZyB2YWx1ZSBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciBsZXNzIHRoYW5cbnRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHNlcXVlbmNlLCBhbmQgdGhlIHN1YnNjcmlwdGlvbiBzZWxlY3RzIHRoZVxuaXRlbSB3aG9zZSBpbmRleCBpcyB0aGF0IHZhbHVlIChjb3VudGluZyBmcm9tIHplcm8pLlxuXG5BIHN0cmluZ1wncyBpdGVtcyBhcmUgY2hhcmFjdGVycy4gIEEgY2hhcmFjdGVyIGlzIG5vdCBhIHNlcGFyYXRlIGRhdGFcbnR5cGUgYnV0IGEgc3RyaW5nIG9mIGV4YWN0bHkgb25lIGNoYXJhY3Rlci5cbicsCi0gJ3RydXRoJzogdSJcblRydXRoIFZhbHVlIFRlc3RpbmdcbioqKioqKioqKioqKioqKioqKipcblxuQW55IG9iamVjdCBjYW4gYmUgdGVzdGVkIGZvciB0cnV0aCB2YWx1ZSwgZm9yIHVzZSBpbiBhbiBgYGlmYGAgb3JcbmBgd2hpbGVgYCBjb25kaXRpb24gb3IgYXMgb3BlcmFuZCBvZiB0aGUgQm9vbGVhbiBvcGVyYXRpb25zIGJlbG93LiBUaGVcbmZvbGxvd2luZyB2YWx1ZXMgYXJlIGNvbnNpZGVyZWQgZmFsc2U6XG5cbiogYGBOb25lYGBcblxuKiBgYEZhbHNlYGBcblxuKiB6ZXJvIG9mIGFueSBudW1lcmljIHR5cGUsIGZvciBleGFtcGxlLCBgYDBgYCwgYGAwTGBgLCBgYDAuMGBgLFxuICBgYDBqYGAuXG5cbiogYW55IGVtcHR5IHNlcXVlbmNlLCBmb3IgZXhhbXBsZSwgYGAnJ2BgLCBgYCgpYGAsIGBgW11gYC5cblxuKiBhbnkgZW1wdHkgbWFwcGluZywgZm9yIGV4YW1wbGUsIGBge31gYC5cblxuKiBpbnN0YW5jZXMgb2YgdXNlci1kZWZpbmVkIGNsYXNzZXMsIGlmIHRoZSBjbGFzcyBkZWZpbmVzIGFcbiAgYGBfX25vbnplcm9fXygpYGAgb3IgYGBfX2xlbl9fKClgYCBtZXRob2QsIHdoZW4gdGhhdCBtZXRob2QgcmV0dXJuc1xuICB0aGUgaW50ZWdlciB6ZXJvIG9yIGBgYm9vbGBgIHZhbHVlIGBgRmFsc2VgYC4gWzFdXG5cbkFsbCBvdGhlciB2YWx1ZXMgYXJlIGNvbnNpZGVyZWQgdHJ1ZSAtLS0gc28gb2JqZWN0cyBvZiBtYW55IHR5cGVzIGFyZVxuYWx3YXlzIHRydWUuXG5cbk9wZXJhdGlvbnMgYW5kIGJ1aWx0LWluIGZ1bmN0aW9ucyB0aGF0IGhhdmUgYSBCb29sZWFuIHJlc3VsdCBhbHdheXNcbnJldHVybiBgYDBgYCBvciBgYEZhbHNlYGAgZm9yIGZhbHNlIGFuZCBgYDFgYCBvciBgYFRydWVgYCBmb3IgdHJ1ZSxcbnVubGVzcyBvdGhlcndpc2Ugc3RhdGVkLiAoSW1wb3J0YW50IGV4Y2VwdGlvbjogdGhlIEJvb2xlYW4gb3BlcmF0aW9uc1xuYGBvcmBgIGFuZCBgYGFuZGBgIGFsd2F5cyByZXR1cm4gb25lIG9mIHRoZWlyIG9wZXJhbmRzLilcbiIsCi0gJ3RyeSc6IHUnXG5UaGUgYGB0cnlgYCBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgYGB0cnlgYCBzdGF0ZW1lbnQgc3BlY2lmaWVzIGV4Y2VwdGlvbiBoYW5kbGVycyBhbmQvb3IgY2xlYW51cCBjb2RlXG5mb3IgYSBncm91cCBvZiBzdGF0ZW1lbnRzOlxuXG4gICB0cnlfc3RtdCAgOjo9IHRyeTFfc3RtdCB8IHRyeTJfc3RtdFxuICAgdHJ5MV9zdG10IDo6PSAidHJ5IiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICAgKCJleGNlcHQiIFtleHByZXNzaW9uIFsoImFzIiB8ICIsIikgdGFyZ2V0XV0gIjoiIHN1aXRlKStcbiAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG4gICAgICAgICAgICAgICAgIFsiZmluYWxseSIgIjoiIHN1aXRlXVxuICAgdHJ5Ml9zdG10IDo6PSAidHJ5IiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICAgImZpbmFsbHkiICI6IiBzdWl0ZVxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMi41OiBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBQeXRob24sXG5gYHRyeWBgLi4uYGBleGNlcHRgYC4uLmBgZmluYWxseWBgIGRpZCBub3Qgd29yay4gYGB0cnlgYC4uLmBgZXhjZXB0YGBcbmhhZCB0byBiZSBuZXN0ZWQgaW4gYGB0cnlgYC4uLmBgZmluYWxseWBgLlxuXG5UaGUgYGBleGNlcHRgYCBjbGF1c2Uocykgc3BlY2lmeSBvbmUgb3IgbW9yZSBleGNlcHRpb24gaGFuZGxlcnMuIFdoZW5cbm5vIGV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlIGBgdHJ5YGAgY2xhdXNlLCBubyBleGNlcHRpb24gaGFuZGxlciBpc1xuZXhlY3V0ZWQuIFdoZW4gYW4gZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgYGB0cnlgYCBzdWl0ZSwgYSBzZWFyY2ggZm9yXG5hbiBleGNlcHRpb24gaGFuZGxlciBpcyBzdGFydGVkLiAgVGhpcyBzZWFyY2ggaW5zcGVjdHMgdGhlIGV4Y2VwdFxuY2xhdXNlcyBpbiB0dXJuIHVudGlsIG9uZSBpcyBmb3VuZCB0aGF0IG1hdGNoZXMgdGhlIGV4Y2VwdGlvbi4gIEFuXG5leHByZXNzaW9uLWxlc3MgZXhjZXB0IGNsYXVzZSwgaWYgcHJlc2VudCwgbXVzdCBiZSBsYXN0OyBpdCBtYXRjaGVzXG5hbnkgZXhjZXB0aW9uLiAgRm9yIGFuIGV4Y2VwdCBjbGF1c2Ugd2l0aCBhbiBleHByZXNzaW9uLCB0aGF0XG5leHByZXNzaW9uIGlzIGV2YWx1YXRlZCwgYW5kIHRoZSBjbGF1c2UgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uIGlmIHRoZVxucmVzdWx0aW5nIG9iamVjdCBpcyAiY29tcGF0aWJsZSIgd2l0aCB0aGUgZXhjZXB0aW9uLiAgQW4gb2JqZWN0IGlzXG5jb21wYXRpYmxlIHdpdGggYW4gZXhjZXB0aW9uIGlmIGl0IGlzIHRoZSBjbGFzcyBvciBhIGJhc2UgY2xhc3Mgb2YgdGhlXG5leGNlcHRpb24gb2JqZWN0LCBhIHR1cGxlIGNvbnRhaW5pbmcgYW4gaXRlbSBjb21wYXRpYmxlIHdpdGggdGhlXG5leGNlcHRpb24sIG9yLCBpbiB0aGUgKGRlcHJlY2F0ZWQpIGNhc2Ugb2Ygc3RyaW5nIGV4Y2VwdGlvbnMsIGlzIHRoZVxucmFpc2VkIHN0cmluZyBpdHNlbGYgKG5vdGUgdGhhdCB0aGUgb2JqZWN0IGlkZW50aXRpZXMgbXVzdCBtYXRjaCwgaS5lLlxuaXQgbXVzdCBiZSB0aGUgc2FtZSBzdHJpbmcgb2JqZWN0LCBub3QganVzdCBhIHN0cmluZyB3aXRoIHRoZSBzYW1lXG52YWx1ZSkuXG5cbklmIG5vIGV4Y2VwdCBjbGF1c2UgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uLCB0aGUgc2VhcmNoIGZvciBhbiBleGNlcHRpb25cbmhhbmRsZXIgY29udGludWVzIGluIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBvbiB0aGUgaW52b2NhdGlvbiBzdGFjay5cblsxXVxuXG5JZiB0aGUgZXZhbHVhdGlvbiBvZiBhbiBleHByZXNzaW9uIGluIHRoZSBoZWFkZXIgb2YgYW4gZXhjZXB0IGNsYXVzZVxucmFpc2VzIGFuIGV4Y2VwdGlvbiwgdGhlIG9yaWdpbmFsIHNlYXJjaCBmb3IgYSBoYW5kbGVyIGlzIGNhbmNlbGVkIGFuZFxuYSBzZWFyY2ggc3RhcnRzIGZvciB0aGUgbmV3IGV4Y2VwdGlvbiBpbiB0aGUgc3Vycm91bmRpbmcgY29kZSBhbmQgb25cbnRoZSBjYWxsIHN0YWNrIChpdCBpcyB0cmVhdGVkIGFzIGlmIHRoZSBlbnRpcmUgYGB0cnlgYCBzdGF0ZW1lbnRcbnJhaXNlZCB0aGUgZXhjZXB0aW9uKS5cblxuV2hlbiBhIG1hdGNoaW5nIGV4Y2VwdCBjbGF1c2UgaXMgZm91bmQsIHRoZSBleGNlcHRpb24gaXMgYXNzaWduZWQgdG9cbnRoZSB0YXJnZXQgc3BlY2lmaWVkIGluIHRoYXQgZXhjZXB0IGNsYXVzZSwgaWYgcHJlc2VudCwgYW5kIHRoZSBleGNlcHRcbmNsYXVzZVwncyBzdWl0ZSBpcyBleGVjdXRlZC4gIEFsbCBleGNlcHQgY2xhdXNlcyBtdXN0IGhhdmUgYW5cbmV4ZWN1dGFibGUgYmxvY2suICBXaGVuIHRoZSBlbmQgb2YgdGhpcyBibG9jayBpcyByZWFjaGVkLCBleGVjdXRpb25cbmNvbnRpbnVlcyBub3JtYWxseSBhZnRlciB0aGUgZW50aXJlIHRyeSBzdGF0ZW1lbnQuICAoVGhpcyBtZWFucyB0aGF0XG5pZiB0d28gbmVzdGVkIGhhbmRsZXJzIGV4aXN0IGZvciB0aGUgc2FtZSBleGNlcHRpb24sIGFuZCB0aGUgZXhjZXB0aW9uXG5vY2N1cnMgaW4gdGhlIHRyeSBjbGF1c2Ugb2YgdGhlIGlubmVyIGhhbmRsZXIsIHRoZSBvdXRlciBoYW5kbGVyIHdpbGxcbm5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbi4pXG5cbkJlZm9yZSBhbiBleGNlcHQgY2xhdXNlXCdzIHN1aXRlIGlzIGV4ZWN1dGVkLCBkZXRhaWxzIGFib3V0IHRoZVxuZXhjZXB0aW9uIGFyZSBhc3NpZ25lZCB0byB0aHJlZSB2YXJpYWJsZXMgaW4gdGhlIGBgc3lzYGAgbW9kdWxlOlxuYGBzeXMuZXhjX3R5cGVgYCByZWNlaXZlcyB0aGUgb2JqZWN0IGlkZW50aWZ5aW5nIHRoZSBleGNlcHRpb247XG5gYHN5cy5leGNfdmFsdWVgYCByZWNlaXZlcyB0aGUgZXhjZXB0aW9uXCdzIHBhcmFtZXRlcjtcbmBgc3lzLmV4Y190cmFjZWJhY2tgYCByZWNlaXZlcyBhIHRyYWNlYmFjayBvYmplY3QgKHNlZSBzZWN0aW9uICpUaGVcbnN0YW5kYXJkIHR5cGUgaGllcmFyY2h5KikgaWRlbnRpZnlpbmcgdGhlIHBvaW50IGluIHRoZSBwcm9ncmFtIHdoZXJlXG50aGUgZXhjZXB0aW9uIG9jY3VycmVkLiBUaGVzZSBkZXRhaWxzIGFyZSBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZVxuYGBzeXMuZXhjX2luZm8oKWBgIGZ1bmN0aW9uLCB3aGljaCByZXR1cm5zIGEgdHVwbGUgYGAoZXhjX3R5cGUsXG5leGNfdmFsdWUsIGV4Y190cmFjZWJhY2spYGAuICBVc2Ugb2YgdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGVzIGlzXG5kZXByZWNhdGVkIGluIGZhdm9yIG9mIHRoaXMgZnVuY3Rpb24sIHNpbmNlIHRoZWlyIHVzZSBpcyB1bnNhZmUgaW4gYVxudGhyZWFkZWQgcHJvZ3JhbS4gIEFzIG9mIFB5dGhvbiAxLjUsIHRoZSB2YXJpYWJsZXMgYXJlIHJlc3RvcmVkIHRvXG50aGVpciBwcmV2aW91cyB2YWx1ZXMgKGJlZm9yZSB0aGUgY2FsbCkgd2hlbiByZXR1cm5pbmcgZnJvbSBhIGZ1bmN0aW9uXG50aGF0IGhhbmRsZWQgYW4gZXhjZXB0aW9uLlxuXG5UaGUgb3B0aW9uYWwgYGBlbHNlYGAgY2xhdXNlIGlzIGV4ZWN1dGVkIGlmIGFuZCB3aGVuIGNvbnRyb2wgZmxvd3Mgb2ZmXG50aGUgZW5kIG9mIHRoZSBgYHRyeWBgIGNsYXVzZS4gWzJdIEV4Y2VwdGlvbnMgaW4gdGhlIGBgZWxzZWBgIGNsYXVzZVxuYXJlIG5vdCBoYW5kbGVkIGJ5IHRoZSBwcmVjZWRpbmcgYGBleGNlcHRgYCBjbGF1c2VzLlxuXG5JZiBgYGZpbmFsbHlgYCBpcyBwcmVzZW50LCBpdCBzcGVjaWZpZXMgYSBcJ2NsZWFudXBcJyBoYW5kbGVyLiAgVGhlXG5gYHRyeWBgIGNsYXVzZSBpcyBleGVjdXRlZCwgaW5jbHVkaW5nIGFueSBgYGV4Y2VwdGBgIGFuZCBgYGVsc2VgYFxuY2xhdXNlcy4gIElmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgaW4gYW55IG9mIHRoZSBjbGF1c2VzIGFuZCBpcyBub3RcbmhhbmRsZWQsIHRoZSBleGNlcHRpb24gaXMgdGVtcG9yYXJpbHkgc2F2ZWQuIFRoZSBgYGZpbmFsbHlgYCBjbGF1c2UgaXNcbmV4ZWN1dGVkLiAgSWYgdGhlcmUgaXMgYSBzYXZlZCBleGNlcHRpb24sIGl0IGlzIHJlLXJhaXNlZCBhdCB0aGUgZW5kXG5vZiB0aGUgYGBmaW5hbGx5YGAgY2xhdXNlLiBJZiB0aGUgYGBmaW5hbGx5YGAgY2xhdXNlIHJhaXNlcyBhbm90aGVyXG5leGNlcHRpb24gb3IgZXhlY3V0ZXMgYSBgYHJldHVybmBgIG9yIGBgYnJlYWtgYCBzdGF0ZW1lbnQsIHRoZSBzYXZlZFxuZXhjZXB0aW9uIGlzIGxvc3QuICBUaGUgZXhjZXB0aW9uIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgdG8gdGhlXG5wcm9ncmFtIGR1cmluZyBleGVjdXRpb24gb2YgdGhlIGBgZmluYWxseWBgIGNsYXVzZS5cblxuV2hlbiBhIGBgcmV0dXJuYGAsIGBgYnJlYWtgYCBvciBgYGNvbnRpbnVlYGAgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIGluXG50aGUgYGB0cnlgYCBzdWl0ZSBvZiBhIGBgdHJ5YGAuLi5gYGZpbmFsbHlgYCBzdGF0ZW1lbnQsIHRoZVxuYGBmaW5hbGx5YGAgY2xhdXNlIGlzIGFsc28gZXhlY3V0ZWQgXCdvbiB0aGUgd2F5IG91dC5cJyBBIGBgY29udGludWVgYFxuc3RhdGVtZW50IGlzIGlsbGVnYWwgaW4gdGhlIGBgZmluYWxseWBgIGNsYXVzZS4gKFRoZSByZWFzb24gaXMgYVxucHJvYmxlbSB3aXRoIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIC0tLSB0aGlzIHJlc3RyaWN0aW9uIG1heSBiZVxubGlmdGVkIGluIHRoZSBmdXR1cmUpLlxuXG5BZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGV4Y2VwdGlvbnMgY2FuIGJlIGZvdW5kIGluIHNlY3Rpb25cbipFeGNlcHRpb25zKiwgYW5kIGluZm9ybWF0aW9uIG9uIHVzaW5nIHRoZSBgYHJhaXNlYGAgc3RhdGVtZW50IHRvXG5nZW5lcmF0ZSBleGNlcHRpb25zIG1heSBiZSBmb3VuZCBpbiBzZWN0aW9uICpUaGUgcmFpc2Ugc3RhdGVtZW50Ki5cbicsCi0gJ3R5cGVzJzogdSdcblRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeVxuKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbkJlbG93IGlzIGEgbGlzdCBvZiB0aGUgdHlwZXMgdGhhdCBhcmUgYnVpbHQgaW50byBQeXRob24uICBFeHRlbnNpb25cbm1vZHVsZXMgKHdyaXR0ZW4gaW4gQywgSmF2YSwgb3Igb3RoZXIgbGFuZ3VhZ2VzLCBkZXBlbmRpbmcgb24gdGhlXG5pbXBsZW1lbnRhdGlvbikgY2FuIGRlZmluZSBhZGRpdGlvbmFsIHR5cGVzLiAgRnV0dXJlIHZlcnNpb25zIG9mXG5QeXRob24gbWF5IGFkZCB0eXBlcyB0byB0aGUgdHlwZSBoaWVyYXJjaHkgKGUuZy4sIHJhdGlvbmFsIG51bWJlcnMsXG5lZmZpY2llbnRseSBzdG9yZWQgYXJyYXlzIG9mIGludGVnZXJzLCBldGMuKS5cblxuU29tZSBvZiB0aGUgdHlwZSBkZXNjcmlwdGlvbnMgYmVsb3cgY29udGFpbiBhIHBhcmFncmFwaCBsaXN0aW5nXG5cJ3NwZWNpYWwgYXR0cmlidXRlcy5cJyAgVGhlc2UgYXJlIGF0dHJpYnV0ZXMgdGhhdCBwcm92aWRlIGFjY2VzcyB0byB0aGVcbmltcGxlbWVudGF0aW9uIGFuZCBhcmUgbm90IGludGVuZGVkIGZvciBnZW5lcmFsIHVzZS4gIFRoZWlyIGRlZmluaXRpb25cbm1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS5cblxuTm9uZVxuICAgVGhpcyB0eXBlIGhhcyBhIHNpbmdsZSB2YWx1ZS4gIFRoZXJlIGlzIGEgc2luZ2xlIG9iamVjdCB3aXRoIHRoaXNcbiAgIHZhbHVlLiBUaGlzIG9iamVjdCBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBidWlsdC1pbiBuYW1lIGBgTm9uZWBgLlxuICAgSXQgaXMgdXNlZCB0byBzaWduaWZ5IHRoZSBhYnNlbmNlIG9mIGEgdmFsdWUgaW4gbWFueSBzaXR1YXRpb25zLFxuICAgZS5nLiwgaXQgaXMgcmV0dXJuZWQgZnJvbSBmdW5jdGlvbnMgdGhhdCBkb25cJ3QgZXhwbGljaXRseSByZXR1cm5cbiAgIGFueXRoaW5nLiBJdHMgdHJ1dGggdmFsdWUgaXMgZmFsc2UuXG5cbk5vdEltcGxlbWVudGVkXG4gICBUaGlzIHR5cGUgaGFzIGEgc2luZ2xlIHZhbHVlLiAgVGhlcmUgaXMgYSBzaW5nbGUgb2JqZWN0IHdpdGggdGhpc1xuICAgdmFsdWUuIFRoaXMgb2JqZWN0IGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGJ1aWx0LWluIG5hbWVcbiAgIGBgTm90SW1wbGVtZW50ZWRgYC4gTnVtZXJpYyBtZXRob2RzIGFuZCByaWNoIGNvbXBhcmlzb24gbWV0aG9kcyBtYXlcbiAgIHJldHVybiB0aGlzIHZhbHVlIGlmIHRoZXkgZG8gbm90IGltcGxlbWVudCB0aGUgb3BlcmF0aW9uIGZvciB0aGVcbiAgIG9wZXJhbmRzIHByb3ZpZGVkLiAgKFRoZSBpbnRlcnByZXRlciB3aWxsIHRoZW4gdHJ5IHRoZSByZWZsZWN0ZWRcbiAgIG9wZXJhdGlvbiwgb3Igc29tZSBvdGhlciBmYWxsYmFjaywgZGVwZW5kaW5nIG9uIHRoZSBvcGVyYXRvci4pICBJdHNcbiAgIHRydXRoIHZhbHVlIGlzIHRydWUuXG5cbkVsbGlwc2lzXG4gICBUaGlzIHR5cGUgaGFzIGEgc2luZ2xlIHZhbHVlLiAgVGhlcmUgaXMgYSBzaW5nbGUgb2JqZWN0IHdpdGggdGhpc1xuICAgdmFsdWUuIFRoaXMgb2JqZWN0IGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGJ1aWx0LWluIG5hbWVcbiAgIGBgRWxsaXBzaXNgYC4gSXQgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgcHJlc2VuY2Ugb2YgdGhlIGBgLi4uYGBcbiAgIHN5bnRheCBpbiBhIHNsaWNlLiAgSXRzIHRydXRoIHZhbHVlIGlzIHRydWUuXG5cbmBgbnVtYmVycy5OdW1iZXJgYFxuICAgVGhlc2UgYXJlIGNyZWF0ZWQgYnkgbnVtZXJpYyBsaXRlcmFscyBhbmQgcmV0dXJuZWQgYXMgcmVzdWx0cyBieVxuICAgYXJpdGhtZXRpYyBvcGVyYXRvcnMgYW5kIGFyaXRobWV0aWMgYnVpbHQtaW4gZnVuY3Rpb25zLiAgTnVtZXJpY1xuICAgb2JqZWN0cyBhcmUgaW1tdXRhYmxlOyBvbmNlIGNyZWF0ZWQgdGhlaXIgdmFsdWUgbmV2ZXIgY2hhbmdlcy5cbiAgIFB5dGhvbiBudW1iZXJzIGFyZSBvZiBjb3Vyc2Ugc3Ryb25nbHkgcmVsYXRlZCB0byBtYXRoZW1hdGljYWxcbiAgIG51bWJlcnMsIGJ1dCBzdWJqZWN0IHRvIHRoZSBsaW1pdGF0aW9ucyBvZiBudW1lcmljYWwgcmVwcmVzZW50YXRpb25cbiAgIGluIGNvbXB1dGVycy5cblxuICAgUHl0aG9uIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBpbnRlZ2VycywgZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgYW5kXG4gICBjb21wbGV4IG51bWJlcnM6XG5cbiAgIGBgbnVtYmVycy5JbnRlZ3JhbGBgXG4gICAgICBUaGVzZSByZXByZXNlbnQgZWxlbWVudHMgZnJvbSB0aGUgbWF0aGVtYXRpY2FsIHNldCBvZiBpbnRlZ2Vyc1xuICAgICAgKHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSkuXG5cbiAgICAgIFRoZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiBpbnRlZ2VyczpcblxuICAgICAgUGxhaW4gaW50ZWdlcnNcbiAgICAgICAgIFRoZXNlIHJlcHJlc2VudCBudW1iZXJzIGluIHRoZSByYW5nZSAtMjE0NzQ4MzY0OCB0aHJvdWdoXG4gICAgICAgICAyMTQ3NDgzNjQ3LiAoVGhlIHJhbmdlIG1heSBiZSBsYXJnZXIgb24gbWFjaGluZXMgd2l0aCBhXG4gICAgICAgICBsYXJnZXIgbmF0dXJhbCB3b3JkIHNpemUsIGJ1dCBub3Qgc21hbGxlci4pICBXaGVuIHRoZSByZXN1bHRcbiAgICAgICAgIG9mIGFuIG9wZXJhdGlvbiB3b3VsZCBmYWxsIG91dHNpZGUgdGhpcyByYW5nZSwgdGhlIHJlc3VsdCBpc1xuICAgICAgICAgbm9ybWFsbHkgcmV0dXJuZWQgYXMgYSBsb25nIGludGVnZXIgKGluIHNvbWUgY2FzZXMsIHRoZVxuICAgICAgICAgZXhjZXB0aW9uIGBgT3ZlcmZsb3dFcnJvcmBgIGlzIHJhaXNlZCBpbnN0ZWFkKS4gIEZvciB0aGVcbiAgICAgICAgIHB1cnBvc2Ugb2Ygc2hpZnQgYW5kIG1hc2sgb3BlcmF0aW9ucywgaW50ZWdlcnMgYXJlIGFzc3VtZWQgdG9cbiAgICAgICAgIGhhdmUgYSBiaW5hcnksIDJcJ3MgY29tcGxlbWVudCBub3RhdGlvbiB1c2luZyAzMiBvciBtb3JlIGJpdHMsXG4gICAgICAgICBhbmQgaGlkaW5nIG5vIGJpdHMgZnJvbSB0aGUgdXNlciAoaS5lLiwgYWxsIDQyOTQ5NjcyOTZcbiAgICAgICAgIGRpZmZlcmVudCBiaXQgcGF0dGVybnMgY29ycmVzcG9uZCB0byBkaWZmZXJlbnQgdmFsdWVzKS5cblxuICAgICAgTG9uZyBpbnRlZ2Vyc1xuICAgICAgICAgVGhlc2UgcmVwcmVzZW50IG51bWJlcnMgaW4gYW4gdW5saW1pdGVkIHJhbmdlLCBzdWJqZWN0IHRvXG4gICAgICAgICBhdmFpbGFibGUgKHZpcnR1YWwpIG1lbW9yeSBvbmx5LiAgRm9yIHRoZSBwdXJwb3NlIG9mIHNoaWZ0XG4gICAgICAgICBhbmQgbWFzayBvcGVyYXRpb25zLCBhIGJpbmFyeSByZXByZXNlbnRhdGlvbiBpcyBhc3N1bWVkLCBhbmRcbiAgICAgICAgIG5lZ2F0aXZlIG51bWJlcnMgYXJlIHJlcHJlc2VudGVkIGluIGEgdmFyaWFudCBvZiAyXCdzXG4gICAgICAgICBjb21wbGVtZW50IHdoaWNoIGdpdmVzIHRoZSBpbGx1c2lvbiBvZiBhbiBpbmZpbml0ZSBzdHJpbmcgb2ZcbiAgICAgICAgIHNpZ24gYml0cyBleHRlbmRpbmcgdG8gdGhlIGxlZnQuXG5cbiAgICAgIEJvb2xlYW5zXG4gICAgICAgICBUaGVzZSByZXByZXNlbnQgdGhlIHRydXRoIHZhbHVlcyBGYWxzZSBhbmQgVHJ1ZS4gIFRoZSB0d29cbiAgICAgICAgIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgRmFsc2UgYW5kIFRydWUgYXJlIHRoZSBvbmx5XG4gICAgICAgICBCb29sZWFuIG9iamVjdHMuIFRoZSBCb29sZWFuIHR5cGUgaXMgYSBzdWJ0eXBlIG9mIHBsYWluXG4gICAgICAgICBpbnRlZ2VycywgYW5kIEJvb2xlYW4gdmFsdWVzIGJlaGF2ZSBsaWtlIHRoZSB2YWx1ZXMgMCBhbmQgMSxcbiAgICAgICAgIHJlc3BlY3RpdmVseSwgaW4gYWxtb3N0IGFsbCBjb250ZXh0cywgdGhlIGV4Y2VwdGlvbiBiZWluZ1xuICAgICAgICAgdGhhdCB3aGVuIGNvbnZlcnRlZCB0byBhIHN0cmluZywgdGhlIHN0cmluZ3MgYGAiRmFsc2UiYGAgb3JcbiAgICAgICAgIGBgIlRydWUiYGAgYXJlIHJldHVybmVkLCByZXNwZWN0aXZlbHkuXG5cbiAgICAgIFRoZSBydWxlcyBmb3IgaW50ZWdlciByZXByZXNlbnRhdGlvbiBhcmUgaW50ZW5kZWQgdG8gZ2l2ZSB0aGVcbiAgICAgIG1vc3QgbWVhbmluZ2Z1bCBpbnRlcnByZXRhdGlvbiBvZiBzaGlmdCBhbmQgbWFzayBvcGVyYXRpb25zXG4gICAgICBpbnZvbHZpbmcgbmVnYXRpdmUgaW50ZWdlcnMgYW5kIHRoZSBsZWFzdCBzdXJwcmlzZXMgd2hlblxuICAgICAgc3dpdGNoaW5nIGJldHdlZW4gdGhlIHBsYWluIGFuZCBsb25nIGludGVnZXIgZG9tYWlucy4gIEFueVxuICAgICAgb3BlcmF0aW9uLCBpZiBpdCB5aWVsZHMgYSByZXN1bHQgaW4gdGhlIHBsYWluIGludGVnZXIgZG9tYWluLFxuICAgICAgd2lsbCB5aWVsZCB0aGUgc2FtZSByZXN1bHQgaW4gdGhlIGxvbmcgaW50ZWdlciBkb21haW4gb3Igd2hlblxuICAgICAgdXNpbmcgbWl4ZWQgb3BlcmFuZHMuICBUaGUgc3dpdGNoIGJldHdlZW4gZG9tYWlucyBpcyB0cmFuc3BhcmVudFxuICAgICAgdG8gdGhlIHByb2dyYW1tZXIuXG5cbiAgIGBgbnVtYmVycy5SZWFsYGAgKGBgZmxvYXRgYClcbiAgICAgIFRoZXNlIHJlcHJlc2VudCBtYWNoaW5lLWxldmVsIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnRcbiAgICAgIG51bWJlcnMuIFlvdSBhcmUgYXQgdGhlIG1lcmN5IG9mIHRoZSB1bmRlcmx5aW5nIG1hY2hpbmVcbiAgICAgIGFyY2hpdGVjdHVyZSAoYW5kIEMgb3IgSmF2YSBpbXBsZW1lbnRhdGlvbikgZm9yIHRoZSBhY2NlcHRlZFxuICAgICAgcmFuZ2UgYW5kIGhhbmRsaW5nIG9mIG92ZXJmbG93LiBQeXRob24gZG9lcyBub3Qgc3VwcG9ydCBzaW5nbGUtXG4gICAgICBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgbnVtYmVyczsgdGhlIHNhdmluZ3MgaW4gcHJvY2Vzc29yIGFuZFxuICAgICAgbWVtb3J5IHVzYWdlIHRoYXQgYXJlIHVzdWFsbHkgdGhlIHJlYXNvbiBmb3IgdXNpbmcgdGhlc2UgaXNcbiAgICAgIGR3YXJmZWQgYnkgdGhlIG92ZXJoZWFkIG9mIHVzaW5nIG9iamVjdHMgaW4gUHl0aG9uLCBzbyB0aGVyZSBpc1xuICAgICAgbm8gcmVhc29uIHRvIGNvbXBsaWNhdGUgdGhlIGxhbmd1YWdlIHdpdGggdHdvIGtpbmRzIG9mIGZsb2F0aW5nXG4gICAgICBwb2ludCBudW1iZXJzLlxuXG4gICBgYG51bWJlcnMuQ29tcGxleGBgXG4gICAgICBUaGVzZSByZXByZXNlbnQgY29tcGxleCBudW1iZXJzIGFzIGEgcGFpciBvZiBtYWNoaW5lLWxldmVsXG4gICAgICBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuICBUaGUgc2FtZSBjYXZlYXRzIGFwcGx5XG4gICAgICBhcyBmb3IgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gVGhlIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cyBvZiBhXG4gICAgICBjb21wbGV4IG51bWJlciBgYHpgYCBjYW4gYmUgcmV0cmlldmVkIHRocm91Z2ggdGhlIHJlYWQtb25seVxuICAgICAgYXR0cmlidXRlcyBgYHoucmVhbGBgIGFuZCBgYHouaW1hZ2BgLlxuXG5TZXF1ZW5jZXNcbiAgIFRoZXNlIHJlcHJlc2VudCBmaW5pdGUgb3JkZXJlZCBzZXRzIGluZGV4ZWQgYnkgbm9uLW5lZ2F0aXZlXG4gICBudW1iZXJzLiBUaGUgYnVpbHQtaW4gZnVuY3Rpb24gYGBsZW4oKWBgIHJldHVybnMgdGhlIG51bWJlciBvZlxuICAgaXRlbXMgb2YgYSBzZXF1ZW5jZS4gV2hlbiB0aGUgbGVuZ3RoIG9mIGEgc2VxdWVuY2UgaXMgKm4qLCB0aGVcbiAgIGluZGV4IHNldCBjb250YWlucyB0aGUgbnVtYmVycyAwLCAxLCAuLi4sICpuKi0xLiAgSXRlbSAqaSogb2ZcbiAgIHNlcXVlbmNlICphKiBpcyBzZWxlY3RlZCBieSBgYGFbaV1gYC5cblxuICAgU2VxdWVuY2VzIGFsc28gc3VwcG9ydCBzbGljaW5nOiBgYGFbaTpqXWBgIHNlbGVjdHMgYWxsIGl0ZW1zIHdpdGhcbiAgIGluZGV4ICprKiBzdWNoIHRoYXQgKmkqIGBgPD1gYCAqayogYGA8YGAgKmoqLiAgV2hlbiB1c2VkIGFzIGFuXG4gICBleHByZXNzaW9uLCBhIHNsaWNlIGlzIGEgc2VxdWVuY2Ugb2YgdGhlIHNhbWUgdHlwZS4gIFRoaXMgaW1wbGllc1xuICAgdGhhdCB0aGUgaW5kZXggc2V0IGlzIHJlbnVtYmVyZWQgc28gdGhhdCBpdCBzdGFydHMgYXQgMC5cblxuICAgU29tZSBzZXF1ZW5jZXMgYWxzbyBzdXBwb3J0ICJleHRlbmRlZCBzbGljaW5nIiB3aXRoIGEgdGhpcmQgInN0ZXAiXG4gICBwYXJhbWV0ZXI6IGBgYVtpOmo6a11gYCBzZWxlY3RzIGFsbCBpdGVtcyBvZiAqYSogd2l0aCBpbmRleCAqeCpcbiAgIHdoZXJlIGBgeCA9IGkgKyBuKmtgYCwgKm4qIGBgPj1gYCBgYDBgYCBhbmQgKmkqIGBgPD1gYCAqeCogYGA8YGBcbiAgICpqKi5cblxuICAgU2VxdWVuY2VzIGFyZSBkaXN0aW5ndWlzaGVkIGFjY29yZGluZyB0byB0aGVpciBtdXRhYmlsaXR5OlxuXG4gICBJbW11dGFibGUgc2VxdWVuY2VzXG4gICAgICBBbiBvYmplY3Qgb2YgYW4gaW1tdXRhYmxlIHNlcXVlbmNlIHR5cGUgY2Fubm90IGNoYW5nZSBvbmNlIGl0IGlzXG4gICAgICBjcmVhdGVkLiAgKElmIHRoZSBvYmplY3QgY29udGFpbnMgcmVmZXJlbmNlcyB0byBvdGhlciBvYmplY3RzLFxuICAgICAgdGhlc2Ugb3RoZXIgb2JqZWN0cyBtYXkgYmUgbXV0YWJsZSBhbmQgbWF5IGJlIGNoYW5nZWQ7IGhvd2V2ZXIsXG4gICAgICB0aGUgY29sbGVjdGlvbiBvZiBvYmplY3RzIGRpcmVjdGx5IHJlZmVyZW5jZWQgYnkgYW4gaW1tdXRhYmxlXG4gICAgICBvYmplY3QgY2Fubm90IGNoYW5nZS4pXG5cbiAgICAgIFRoZSBmb2xsb3dpbmcgdHlwZXMgYXJlIGltbXV0YWJsZSBzZXF1ZW5jZXM6XG5cbiAgICAgIFN0cmluZ3NcbiAgICAgICAgIFRoZSBpdGVtcyBvZiBhIHN0cmluZyBhcmUgY2hhcmFjdGVycy4gIFRoZXJlIGlzIG5vIHNlcGFyYXRlXG4gICAgICAgICBjaGFyYWN0ZXIgdHlwZTsgYSBjaGFyYWN0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgYSBzdHJpbmcgb2Ygb25lXG4gICAgICAgICBpdGVtLiBDaGFyYWN0ZXJzIHJlcHJlc2VudCAoYXQgbGVhc3QpIDgtYml0IGJ5dGVzLiAgVGhlXG4gICAgICAgICBidWlsdC1pbiBmdW5jdGlvbnMgYGBjaHIoKWBgIGFuZCBgYG9yZCgpYGAgY29udmVydCBiZXR3ZWVuXG4gICAgICAgICBjaGFyYWN0ZXJzIGFuZCBub25uZWdhdGl2ZSBpbnRlZ2VycyByZXByZXNlbnRpbmcgdGhlIGJ5dGVcbiAgICAgICAgIHZhbHVlcy4gIEJ5dGVzIHdpdGggdGhlIHZhbHVlcyAwLTEyNyB1c3VhbGx5IHJlcHJlc2VudCB0aGVcbiAgICAgICAgIGNvcnJlc3BvbmRpbmcgQVNDSUkgdmFsdWVzLCBidXQgdGhlIGludGVycHJldGF0aW9uIG9mIHZhbHVlc1xuICAgICAgICAgaXMgdXAgdG8gdGhlIHByb2dyYW0uICBUaGUgc3RyaW5nIGRhdGEgdHlwZSBpcyBhbHNvIHVzZWQgdG9cbiAgICAgICAgIHJlcHJlc2VudCBhcnJheXMgb2YgYnl0ZXMsIGUuZy4sIHRvIGhvbGQgZGF0YSByZWFkIGZyb20gYVxuICAgICAgICAgZmlsZS5cblxuICAgICAgICAgKE9uIHN5c3RlbXMgd2hvc2UgbmF0aXZlIGNoYXJhY3RlciBzZXQgaXMgbm90IEFTQ0lJLCBzdHJpbmdzXG4gICAgICAgICBtYXkgdXNlIEVCQ0RJQyBpbiB0aGVpciBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiwgcHJvdmlkZWQgdGhlXG4gICAgICAgICBmdW5jdGlvbnMgYGBjaHIoKWBgIGFuZCBgYG9yZCgpYGAgaW1wbGVtZW50IGEgbWFwcGluZyBiZXR3ZWVuXG4gICAgICAgICBBU0NJSSBhbmQgRUJDRElDLCBhbmQgc3RyaW5nIGNvbXBhcmlzb24gcHJlc2VydmVzIHRoZSBBU0NJSVxuICAgICAgICAgb3JkZXIuIE9yIHBlcmhhcHMgc29tZW9uZSBjYW4gcHJvcG9zZSBhIGJldHRlciBydWxlPylcblxuICAgICAgVW5pY29kZVxuICAgICAgICAgVGhlIGl0ZW1zIG9mIGEgVW5pY29kZSBvYmplY3QgYXJlIFVuaWNvZGUgY29kZSB1bml0cy4gIEFcbiAgICAgICAgIFVuaWNvZGUgY29kZSB1bml0IGlzIHJlcHJlc2VudGVkIGJ5IGEgVW5pY29kZSBvYmplY3Qgb2Ygb25lXG4gICAgICAgICBpdGVtIGFuZCBjYW4gaG9sZCBlaXRoZXIgYSAxNi1iaXQgb3IgMzItYml0IHZhbHVlXG4gICAgICAgICByZXByZXNlbnRpbmcgYSBVbmljb2RlIG9yZGluYWwgKHRoZSBtYXhpbXVtIHZhbHVlIGZvciB0aGVcbiAgICAgICAgIG9yZGluYWwgaXMgZ2l2ZW4gaW4gYGBzeXMubWF4dW5pY29kZWBgLCBhbmQgZGVwZW5kcyBvbiBob3dcbiAgICAgICAgIFB5dGhvbiBpcyBjb25maWd1cmVkIGF0IGNvbXBpbGUgdGltZSkuICBTdXJyb2dhdGUgcGFpcnMgbWF5XG4gICAgICAgICBiZSBwcmVzZW50IGluIHRoZSBVbmljb2RlIG9iamVjdCwgYW5kIHdpbGwgYmUgcmVwb3J0ZWQgYXMgdHdvXG4gICAgICAgICBzZXBhcmF0ZSBpdGVtcy4gIFRoZSBidWlsdC1pbiBmdW5jdGlvbnMgYGB1bmljaHIoKWBgIGFuZFxuICAgICAgICAgYGBvcmQoKWBgIGNvbnZlcnQgYmV0d2VlbiBjb2RlIHVuaXRzIGFuZCBub25uZWdhdGl2ZSBpbnRlZ2Vyc1xuICAgICAgICAgcmVwcmVzZW50aW5nIHRoZSBVbmljb2RlIG9yZGluYWxzIGFzIGRlZmluZWQgaW4gdGhlIFVuaWNvZGVcbiAgICAgICAgIFN0YW5kYXJkIDMuMC4gQ29udmVyc2lvbiBmcm9tIGFuZCB0byBvdGhlciBlbmNvZGluZ3MgYXJlXG4gICAgICAgICBwb3NzaWJsZSB0aHJvdWdoIHRoZSBVbmljb2RlIG1ldGhvZCBgYGVuY29kZSgpYGAgYW5kIHRoZVxuICAgICAgICAgYnVpbHQtaW4gZnVuY3Rpb24gYGB1bmljb2RlKClgYC5cblxuICAgICAgVHVwbGVzXG4gICAgICAgICBUaGUgaXRlbXMgb2YgYSB0dXBsZSBhcmUgYXJiaXRyYXJ5IFB5dGhvbiBvYmplY3RzLiBUdXBsZXMgb2ZcbiAgICAgICAgIHR3byBvciBtb3JlIGl0ZW1zIGFyZSBmb3JtZWQgYnkgY29tbWEtc2VwYXJhdGVkIGxpc3RzIG9mXG4gICAgICAgICBleHByZXNzaW9ucy4gIEEgdHVwbGUgb2Ygb25lIGl0ZW0gKGEgXCdzaW5nbGV0b25cJykgY2FuIGJlXG4gICAgICAgICBmb3JtZWQgYnkgYWZmaXhpbmcgYSBjb21tYSB0byBhbiBleHByZXNzaW9uIChhbiBleHByZXNzaW9uIGJ5XG4gICAgICAgICBpdHNlbGYgZG9lcyBub3QgY3JlYXRlIGEgdHVwbGUsIHNpbmNlIHBhcmVudGhlc2VzIG11c3QgYmVcbiAgICAgICAgIHVzYWJsZSBmb3IgZ3JvdXBpbmcgb2YgZXhwcmVzc2lvbnMpLiAgQW4gZW1wdHkgdHVwbGUgY2FuIGJlXG4gICAgICAgICBmb3JtZWQgYnkgYW4gZW1wdHkgcGFpciBvZiBwYXJlbnRoZXNlcy5cblxuICAgTXV0YWJsZSBzZXF1ZW5jZXNcbiAgICAgIE11dGFibGUgc2VxdWVuY2VzIGNhbiBiZSBjaGFuZ2VkIGFmdGVyIHRoZXkgYXJlIGNyZWF0ZWQuICBUaGVcbiAgICAgIHN1YnNjcmlwdGlvbiBhbmQgc2xpY2luZyBub3RhdGlvbnMgY2FuIGJlIHVzZWQgYXMgdGhlIHRhcmdldCBvZlxuICAgICAgYXNzaWdubWVudCBhbmQgYGBkZWxgYCAoZGVsZXRlKSBzdGF0ZW1lbnRzLlxuXG4gICAgICBUaGVyZSBhcmUgY3VycmVudGx5IHR3byBpbnRyaW5zaWMgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlczpcblxuICAgICAgTGlzdHNcbiAgICAgICAgIFRoZSBpdGVtcyBvZiBhIGxpc3QgYXJlIGFyYml0cmFyeSBQeXRob24gb2JqZWN0cy4gIExpc3RzIGFyZVxuICAgICAgICAgZm9ybWVkIGJ5IHBsYWNpbmcgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBleHByZXNzaW9ucyBpblxuICAgICAgICAgc3F1YXJlIGJyYWNrZXRzLiAoTm90ZSB0aGF0IHRoZXJlIGFyZSBubyBzcGVjaWFsIGNhc2VzIG5lZWRlZFxuICAgICAgICAgdG8gZm9ybSBsaXN0cyBvZiBsZW5ndGggMCBvciAxLilcblxuICAgICAgQnl0ZSBBcnJheXNcbiAgICAgICAgIEEgYnl0ZWFycmF5IG9iamVjdCBpcyBhIG11dGFibGUgYXJyYXkuIFRoZXkgYXJlIGNyZWF0ZWQgYnlcbiAgICAgICAgIHRoZSBidWlsdC1pbiBgYGJ5dGVhcnJheSgpYGAgY29uc3RydWN0b3IuICBBc2lkZSBmcm9tIGJlaW5nXG4gICAgICAgICBtdXRhYmxlIChhbmQgaGVuY2UgdW5oYXNoYWJsZSksIGJ5dGUgYXJyYXlzIG90aGVyd2lzZSBwcm92aWRlXG4gICAgICAgICB0aGUgc2FtZSBpbnRlcmZhY2UgYW5kIGZ1bmN0aW9uYWxpdHkgYXMgaW1tdXRhYmxlIGJ5dGVzXG4gICAgICAgICBvYmplY3RzLlxuXG4gICAgICBUaGUgZXh0ZW5zaW9uIG1vZHVsZSBgYGFycmF5YGAgcHJvdmlkZXMgYW4gYWRkaXRpb25hbCBleGFtcGxlIG9mXG4gICAgICBhIG11dGFibGUgc2VxdWVuY2UgdHlwZS5cblxuU2V0IHR5cGVzXG4gICBUaGVzZSByZXByZXNlbnQgdW5vcmRlcmVkLCBmaW5pdGUgc2V0cyBvZiB1bmlxdWUsIGltbXV0YWJsZVxuICAgb2JqZWN0cy4gQXMgc3VjaCwgdGhleSBjYW5ub3QgYmUgaW5kZXhlZCBieSBhbnkgc3Vic2NyaXB0LiBIb3dldmVyLFxuICAgdGhleSBjYW4gYmUgaXRlcmF0ZWQgb3ZlciwgYW5kIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYGxlbigpYGBcbiAgIHJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyBpbiBhIHNldC4gQ29tbW9uIHVzZXMgZm9yIHNldHMgYXJlIGZhc3RcbiAgIG1lbWJlcnNoaXAgdGVzdGluZywgcmVtb3ZpbmcgZHVwbGljYXRlcyBmcm9tIGEgc2VxdWVuY2UsIGFuZFxuICAgY29tcHV0aW5nIG1hdGhlbWF0aWNhbCBvcGVyYXRpb25zIHN1Y2ggYXMgaW50ZXJzZWN0aW9uLCB1bmlvbixcbiAgIGRpZmZlcmVuY2UsIGFuZCBzeW1tZXRyaWMgZGlmZmVyZW5jZS5cblxuICAgRm9yIHNldCBlbGVtZW50cywgdGhlIHNhbWUgaW1tdXRhYmlsaXR5IHJ1bGVzIGFwcGx5IGFzIGZvclxuICAgZGljdGlvbmFyeSBrZXlzLiBOb3RlIHRoYXQgbnVtZXJpYyB0eXBlcyBvYmV5IHRoZSBub3JtYWwgcnVsZXMgZm9yXG4gICBudW1lcmljIGNvbXBhcmlzb246IGlmIHR3byBudW1iZXJzIGNvbXBhcmUgZXF1YWwgKGUuZy4sIGBgMWBgIGFuZFxuICAgYGAxLjBgYCksIG9ubHkgb25lIG9mIHRoZW0gY2FuIGJlIGNvbnRhaW5lZCBpbiBhIHNldC5cblxuICAgVGhlcmUgYXJlIGN1cnJlbnRseSB0d28gaW50cmluc2ljIHNldCB0eXBlczpcblxuICAgU2V0c1xuICAgICAgVGhlc2UgcmVwcmVzZW50IGEgbXV0YWJsZSBzZXQuIFRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlIGJ1aWx0LWluXG4gICAgICBgYHNldCgpYGAgY29uc3RydWN0b3IgYW5kIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIGJ5IHNldmVyYWxcbiAgICAgIG1ldGhvZHMsIHN1Y2ggYXMgYGBhZGQoKWBgLlxuXG4gICBGcm96ZW4gc2V0c1xuICAgICAgVGhlc2UgcmVwcmVzZW50IGFuIGltbXV0YWJsZSBzZXQuICBUaGV5IGFyZSBjcmVhdGVkIGJ5IHRoZVxuICAgICAgYnVpbHQtaW4gYGBmcm96ZW5zZXQoKWBgIGNvbnN0cnVjdG9yLiAgQXMgYSBmcm96ZW5zZXQgaXNcbiAgICAgIGltbXV0YWJsZSBhbmQgKmhhc2hhYmxlKiwgaXQgY2FuIGJlIHVzZWQgYWdhaW4gYXMgYW4gZWxlbWVudCBvZlxuICAgICAgYW5vdGhlciBzZXQsIG9yIGFzIGEgZGljdGlvbmFyeSBrZXkuXG5cbk1hcHBpbmdzXG4gICBUaGVzZSByZXByZXNlbnQgZmluaXRlIHNldHMgb2Ygb2JqZWN0cyBpbmRleGVkIGJ5IGFyYml0cmFyeSBpbmRleFxuICAgc2V0cy4gVGhlIHN1YnNjcmlwdCBub3RhdGlvbiBgYGFba11gYCBzZWxlY3RzIHRoZSBpdGVtIGluZGV4ZWQgYnlcbiAgIGBga2BgIGZyb20gdGhlIG1hcHBpbmcgYGBhYGA7IHRoaXMgY2FuIGJlIHVzZWQgaW4gZXhwcmVzc2lvbnMgYW5kXG4gICBhcyB0aGUgdGFyZ2V0IG9mIGFzc2lnbm1lbnRzIG9yIGBgZGVsYGAgc3RhdGVtZW50cy4gVGhlIGJ1aWx0LWluXG4gICBmdW5jdGlvbiBgYGxlbigpYGAgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIGEgbWFwcGluZy5cblxuICAgVGhlcmUgaXMgY3VycmVudGx5IGEgc2luZ2xlIGludHJpbnNpYyBtYXBwaW5nIHR5cGU6XG5cbiAgIERpY3Rpb25hcmllc1xuICAgICAgVGhlc2UgcmVwcmVzZW50IGZpbml0ZSBzZXRzIG9mIG9iamVjdHMgaW5kZXhlZCBieSBuZWFybHlcbiAgICAgIGFyYml0cmFyeSB2YWx1ZXMuICBUaGUgb25seSB0eXBlcyBvZiB2YWx1ZXMgbm90IGFjY2VwdGFibGUgYXNcbiAgICAgIGtleXMgYXJlIHZhbHVlcyBjb250YWluaW5nIGxpc3RzIG9yIGRpY3Rpb25hcmllcyBvciBvdGhlclxuICAgICAgbXV0YWJsZSB0eXBlcyB0aGF0IGFyZSBjb21wYXJlZCBieSB2YWx1ZSByYXRoZXIgdGhhbiBieSBvYmplY3RcbiAgICAgIGlkZW50aXR5LCB0aGUgcmVhc29uIGJlaW5nIHRoYXQgdGhlIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBvZlxuICAgICAgZGljdGlvbmFyaWVzIHJlcXVpcmVzIGEga2V5XCdzIGhhc2ggdmFsdWUgdG8gcmVtYWluIGNvbnN0YW50LlxuICAgICAgTnVtZXJpYyB0eXBlcyB1c2VkIGZvciBrZXlzIG9iZXkgdGhlIG5vcm1hbCBydWxlcyBmb3IgbnVtZXJpY1xuICAgICAgY29tcGFyaXNvbjogaWYgdHdvIG51bWJlcnMgY29tcGFyZSBlcXVhbCAoZS5nLiwgYGAxYGAgYW5kXG4gICAgICBgYDEuMGBgKSB0aGVuIHRoZXkgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHRvIGluZGV4IHRoZSBzYW1lXG4gICAgICBkaWN0aW9uYXJ5IGVudHJ5LlxuXG4gICAgICBEaWN0aW9uYXJpZXMgYXJlIG11dGFibGU7IHRoZXkgY2FuIGJlIGNyZWF0ZWQgYnkgdGhlIGBgey4uLn1gYFxuICAgICAgbm90YXRpb24gKHNlZSBzZWN0aW9uICpEaWN0aW9uYXJ5IGRpc3BsYXlzKikuXG5cbiAgICAgIFRoZSBleHRlbnNpb24gbW9kdWxlcyBgYGRibWBgLCBgYGdkYm1gYCwgYW5kIGBgYnNkZGJgYCBwcm92aWRlXG4gICAgICBhZGRpdGlvbmFsIGV4YW1wbGVzIG9mIG1hcHBpbmcgdHlwZXMuXG5cbkNhbGxhYmxlIHR5cGVzXG4gICBUaGVzZSBhcmUgdGhlIHR5cGVzIHRvIHdoaWNoIHRoZSBmdW5jdGlvbiBjYWxsIG9wZXJhdGlvbiAoc2VlXG4gICBzZWN0aW9uICpDYWxscyopIGNhbiBiZSBhcHBsaWVkOlxuXG4gICBVc2VyLWRlZmluZWQgZnVuY3Rpb25zXG4gICAgICBBIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBvYmplY3QgaXMgY3JlYXRlZCBieSBhIGZ1bmN0aW9uXG4gICAgICBkZWZpbml0aW9uIChzZWUgc2VjdGlvbiAqRnVuY3Rpb24gZGVmaW5pdGlvbnMqKS4gIEl0IHNob3VsZCBiZVxuICAgICAgY2FsbGVkIHdpdGggYW4gYXJndW1lbnQgbGlzdCBjb250YWluaW5nIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtc1xuICAgICAgYXMgdGhlIGZ1bmN0aW9uXCdzIGZvcm1hbCBwYXJhbWV0ZXIgbGlzdC5cblxuICAgICAgU3BlY2lhbCBhdHRyaWJ1dGVzOlxuXG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgQXR0cmlidXRlICAgICAgICAgICAgICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgKz09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT0rXG4gICAgICB8IGBgZnVuY19kb2NgYCAgICAgICAgICAgIHwgVGhlIGZ1bmN0aW9uXCdzIGRvY3VtZW50YXRpb24gICAgfCBXcml0YWJsZSAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nLCBvciBgYE5vbmVgYCBpZiAgICAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCB1bmF2YWlsYWJsZSAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8IGBgX19kb2NfX2BgICAgICAgICAgICAgIHwgQW5vdGhlciB3YXkgb2Ygc3BlbGxpbmcgICAgICAgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBgYGZ1bmNfZG9jYGAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8IGBgZnVuY19uYW1lYGAgICAgICAgICAgIHwgVGhlIGZ1bmN0aW9uXCdzIG5hbWUgICAgICAgICAgICAgfCBXcml0YWJsZSAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgYGBfX25hbWVfX2BgICAgICAgICAgICAgfCBBbm90aGVyIHdheSBvZiBzcGVsbGluZyAgICAgICAgIHwgV3JpdGFibGUgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IGBgZnVuY19uYW1lYGAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgYGBfX21vZHVsZV9fYGAgICAgICAgICAgfCBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRoZSAgICAgIHwgV3JpdGFibGUgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IGZ1bmN0aW9uIHdhcyBkZWZpbmVkIGluLCBvciAgICAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGBOb25lYGAgaWYgdW5hdmFpbGFibGUuICAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCBgYGZ1bmNfZGVmYXVsdHNgYCAgICAgICB8IEEgdHVwbGUgY29udGFpbmluZyBkZWZhdWx0ICAgICAgfCBXcml0YWJsZSAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXJndW1lbnQgdmFsdWVzIGZvciB0aG9zZSAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcmd1bWVudHMgdGhhdCBoYXZlIGRlZmF1bHRzLCAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IG9yIGBgTm9uZWBgIGlmIG5vIGFyZ3VtZW50cyAgICAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgICAgICAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCBgYGZ1bmNfY29kZWBgICAgICAgICAgICB8IFRoZSBjb2RlIG9iamVjdCByZXByZXNlbnRpbmcgICAgfCBXcml0YWJsZSAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uIGJvZHkuICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCBgYGZ1bmNfZ2xvYmFsc2BgICAgICAgICB8IEEgcmVmZXJlbmNlIHRvIHRoZSBkaWN0aW9uYXJ5ICAgfCBSZWFkLW9ubHkgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGhhdCBob2xkcyB0aGUgZnVuY3Rpb25cJ3MgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgZ2xvYmFsIHZhcmlhYmxlcyAtLS0gdGhlIGdsb2JhbCB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBuYW1lc3BhY2Ugb2YgdGhlIG1vZHVsZSBpbiAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IHdoaWNoIHRoZSBmdW5jdGlvbiB3YXMgZGVmaW5lZC4gfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgYGBmdW5jX2RpY3RgYCAgICAgICAgICAgfCBUaGUgbmFtZXNwYWNlIHN1cHBvcnRpbmcgICAgICAgIHwgV3JpdGFibGUgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IGFyYml0cmFyeSBmdW5jdGlvbiBhdHRyaWJ1dGVzLiAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgYGBmdW5jX2Nsb3N1cmVgYCAgICAgICAgfCBgYE5vbmVgYCBvciBhIHR1cGxlIG9mIGNlbGxzICAgIHwgUmVhZC1vbmx5ICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoYXQgY29udGFpbiBiaW5kaW5ncyBmb3IgdGhlICAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgZnVuY3Rpb25cJ3MgZnJlZSB2YXJpYWJsZXMuICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcblxuICAgICAgTW9zdCBvZiB0aGUgYXR0cmlidXRlcyBsYWJlbGxlZCAiV3JpdGFibGUiIGNoZWNrIHRoZSB0eXBlIG9mIHRoZVxuICAgICAgYXNzaWduZWQgdmFsdWUuXG5cbiAgICAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjQ6IGBgZnVuY19uYW1lYGAgaXMgbm93IHdyaXRhYmxlLlxuXG4gICAgICBGdW5jdGlvbiBvYmplY3RzIGFsc28gc3VwcG9ydCBnZXR0aW5nIGFuZCBzZXR0aW5nIGFyYml0cmFyeVxuICAgICAgYXR0cmlidXRlcywgd2hpY2ggY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCB0byBhdHRhY2ggbWV0YWRhdGFcbiAgICAgIHRvIGZ1bmN0aW9ucy4gIFJlZ3VsYXIgYXR0cmlidXRlIGRvdC1ub3RhdGlvbiBpcyB1c2VkIHRvIGdldCBhbmRcbiAgICAgIHNldCBzdWNoIGF0dHJpYnV0ZXMuICpOb3RlIHRoYXQgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb25seVxuICAgICAgc3VwcG9ydHMgZnVuY3Rpb24gYXR0cmlidXRlcyBvbiB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLiBGdW5jdGlvblxuICAgICAgYXR0cmlidXRlcyBvbiBidWlsdC1pbiBmdW5jdGlvbnMgbWF5IGJlIHN1cHBvcnRlZCBpbiB0aGVcbiAgICAgIGZ1dHVyZS4qXG5cbiAgICAgIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBmdW5jdGlvblwncyBkZWZpbml0aW9uIGNhbiBiZVxuICAgICAgcmV0cmlldmVkIGZyb20gaXRzIGNvZGUgb2JqZWN0OyBzZWUgdGhlIGRlc2NyaXB0aW9uIG9mIGludGVybmFsXG4gICAgICB0eXBlcyBiZWxvdy5cblxuICAgVXNlci1kZWZpbmVkIG1ldGhvZHNcbiAgICAgIEEgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3QgY29tYmluZXMgYSBjbGFzcywgYSBjbGFzcyBpbnN0YW5jZVxuICAgICAgKG9yIGBgTm9uZWBgKSBhbmQgYW55IGNhbGxhYmxlIG9iamVjdCAobm9ybWFsbHkgYSB1c2VyLWRlZmluZWRcbiAgICAgIGZ1bmN0aW9uKS5cblxuICAgICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogYGBpbV9zZWxmYGAgaXMgdGhlIGNsYXNzIGluc3RhbmNlXG4gICAgICBvYmplY3QsIGBgaW1fZnVuY2BgIGlzIHRoZSBmdW5jdGlvbiBvYmplY3Q7IGBgaW1fY2xhc3NgYCBpcyB0aGVcbiAgICAgIGNsYXNzIG9mIGBgaW1fc2VsZmBgIGZvciBib3VuZCBtZXRob2RzIG9yIHRoZSBjbGFzcyB0aGF0IGFza2VkXG4gICAgICBmb3IgdGhlIG1ldGhvZCBmb3IgdW5ib3VuZCBtZXRob2RzOyBgYF9fZG9jX19gYCBpcyB0aGUgbWV0aG9kXCdzXG4gICAgICBkb2N1bWVudGF0aW9uIChzYW1lIGFzIGBgaW1fZnVuYy5fX2RvY19fYGApOyBgYF9fbmFtZV9fYGAgaXMgdGhlXG4gICAgICBtZXRob2QgbmFtZSAoc2FtZSBhcyBgYGltX2Z1bmMuX19uYW1lX19gYCk7IGBgX19tb2R1bGVfX2BgIGlzXG4gICAgICB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRoZSBtZXRob2Qgd2FzIGRlZmluZWQgaW4sIG9yIGBgTm9uZWBgIGlmXG4gICAgICB1bmF2YWlsYWJsZS5cblxuICAgICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMjogYGBpbV9zZWxmYGAgdXNlZCB0byByZWZlciB0byB0aGUgY2xhc3NcbiAgICAgIHRoYXQgZGVmaW5lZCB0aGUgbWV0aG9kLlxuXG4gICAgICBDaGFuZ2VkIGluIHZlcnNpb24gMi42OiBGb3IgMy4wIGZvcndhcmQtY29tcGF0aWJpbGl0eSxcbiAgICAgIGBgaW1fZnVuY2BgIGlzIGFsc28gYXZhaWxhYmxlIGFzIGBgX19mdW5jX19gYCwgYW5kIGBgaW1fc2VsZmBgXG4gICAgICBhcyBgYF9fc2VsZl9fYGAuXG5cbiAgICAgIE1ldGhvZHMgYWxzbyBzdXBwb3J0IGFjY2Vzc2luZyAoYnV0IG5vdCBzZXR0aW5nKSB0aGUgYXJiaXRyYXJ5XG4gICAgICBmdW5jdGlvbiBhdHRyaWJ1dGVzIG9uIHRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uIG9iamVjdC5cblxuICAgICAgVXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3RzIG1heSBiZSBjcmVhdGVkIHdoZW4gZ2V0dGluZyBhblxuICAgICAgYXR0cmlidXRlIG9mIGEgY2xhc3MgKHBlcmhhcHMgdmlhIGFuIGluc3RhbmNlIG9mIHRoYXQgY2xhc3MpLCBpZlxuICAgICAgdGhhdCBhdHRyaWJ1dGUgaXMgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0LCBhbiB1bmJvdW5kXG4gICAgICB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCwgb3IgYSBjbGFzcyBtZXRob2Qgb2JqZWN0LiBXaGVuIHRoZVxuICAgICAgYXR0cmlidXRlIGlzIGEgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3QsIGEgbmV3IG1ldGhvZCBvYmplY3RcbiAgICAgIGlzIG9ubHkgY3JlYXRlZCBpZiB0aGUgY2xhc3MgZnJvbSB3aGljaCBpdCBpcyBiZWluZyByZXRyaWV2ZWQgaXNcbiAgICAgIHRoZSBzYW1lIGFzLCBvciBhIGRlcml2ZWQgY2xhc3Mgb2YsIHRoZSBjbGFzcyBzdG9yZWQgaW4gdGhlXG4gICAgICBvcmlnaW5hbCBtZXRob2Qgb2JqZWN0OyBvdGhlcndpc2UsIHRoZSBvcmlnaW5hbCBtZXRob2Qgb2JqZWN0IGlzXG4gICAgICB1c2VkIGFzIGl0IGlzLlxuXG4gICAgICBXaGVuIGEgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3QgaXMgY3JlYXRlZCBieSByZXRyaWV2aW5nIGFcbiAgICAgIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBvYmplY3QgZnJvbSBhIGNsYXNzLCBpdHMgYGBpbV9zZWxmYGBcbiAgICAgIGF0dHJpYnV0ZSBpcyBgYE5vbmVgYCBhbmQgdGhlIG1ldGhvZCBvYmplY3QgaXMgc2FpZCB0byBiZVxuICAgICAgdW5ib3VuZC4gV2hlbiBvbmUgaXMgY3JlYXRlZCBieSByZXRyaWV2aW5nIGEgdXNlci1kZWZpbmVkXG4gICAgICBmdW5jdGlvbiBvYmplY3QgZnJvbSBhIGNsYXNzIHZpYSBvbmUgb2YgaXRzIGluc3RhbmNlcywgaXRzXG4gICAgICBgYGltX3NlbGZgYCBhdHRyaWJ1dGUgaXMgdGhlIGluc3RhbmNlLCBhbmQgdGhlIG1ldGhvZCBvYmplY3QgaXNcbiAgICAgIHNhaWQgdG8gYmUgYm91bmQuIEluIGVpdGhlciBjYXNlLCB0aGUgbmV3IG1ldGhvZFwncyBgYGltX2NsYXNzYGBcbiAgICAgIGF0dHJpYnV0ZSBpcyB0aGUgY2xhc3MgZnJvbSB3aGljaCB0aGUgcmV0cmlldmFsIHRha2VzIHBsYWNlLCBhbmRcbiAgICAgIGl0cyBgYGltX2Z1bmNgYCBhdHRyaWJ1dGUgaXMgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIG9iamVjdC5cblxuICAgICAgV2hlbiBhIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0IGlzIGNyZWF0ZWQgYnkgcmV0cmlldmluZ1xuICAgICAgYW5vdGhlciBtZXRob2Qgb2JqZWN0IGZyb20gYSBjbGFzcyBvciBpbnN0YW5jZSwgdGhlIGJlaGF2aW91ciBpc1xuICAgICAgdGhlIHNhbWUgYXMgZm9yIGEgZnVuY3Rpb24gb2JqZWN0LCBleGNlcHQgdGhhdCB0aGUgYGBpbV9mdW5jYGBcbiAgICAgIGF0dHJpYnV0ZSBvZiB0aGUgbmV3IGluc3RhbmNlIGlzIG5vdCB0aGUgb3JpZ2luYWwgbWV0aG9kIG9iamVjdFxuICAgICAgYnV0IGl0cyBgYGltX2Z1bmNgYCBhdHRyaWJ1dGUuXG5cbiAgICAgIFdoZW4gYSB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCBpcyBjcmVhdGVkIGJ5IHJldHJpZXZpbmcgYVxuICAgICAgY2xhc3MgbWV0aG9kIG9iamVjdCBmcm9tIGEgY2xhc3Mgb3IgaW5zdGFuY2UsIGl0cyBgYGltX3NlbGZgYFxuICAgICAgYXR0cmlidXRlIGlzIHRoZSBjbGFzcyBpdHNlbGYgKHRoZSBzYW1lIGFzIHRoZSBgYGltX2NsYXNzYGBcbiAgICAgIGF0dHJpYnV0ZSksIGFuZCBpdHMgYGBpbV9mdW5jYGAgYXR0cmlidXRlIGlzIHRoZSBmdW5jdGlvbiBvYmplY3RcbiAgICAgIHVuZGVybHlpbmcgdGhlIGNsYXNzIG1ldGhvZC5cblxuICAgICAgV2hlbiBhbiB1bmJvdW5kIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0IGlzIGNhbGxlZCwgdGhlXG4gICAgICB1bmRlcmx5aW5nIGZ1bmN0aW9uIChgYGltX2Z1bmNgYCkgaXMgY2FsbGVkLCB3aXRoIHRoZVxuICAgICAgcmVzdHJpY3Rpb24gdGhhdCB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiB0aGVcbiAgICAgIHByb3BlciBjbGFzcyAoYGBpbV9jbGFzc2BgKSBvciBvZiBhIGRlcml2ZWQgY2xhc3MgdGhlcmVvZi5cblxuICAgICAgV2hlbiBhIGJvdW5kIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0IGlzIGNhbGxlZCwgdGhlXG4gICAgICB1bmRlcmx5aW5nIGZ1bmN0aW9uIChgYGltX2Z1bmNgYCkgaXMgY2FsbGVkLCBpbnNlcnRpbmcgdGhlIGNsYXNzXG4gICAgICBpbnN0YW5jZSAoYGBpbV9zZWxmYGApIGluIGZyb250IG9mIHRoZSBhcmd1bWVudCBsaXN0LiAgRm9yXG4gICAgICBpbnN0YW5jZSwgd2hlbiBgYENgYCBpcyBhIGNsYXNzIHdoaWNoIGNvbnRhaW5zIGEgZGVmaW5pdGlvbiBmb3JcbiAgICAgIGEgZnVuY3Rpb24gYGBmKClgYCwgYW5kIGBgeGBgIGlzIGFuIGluc3RhbmNlIG9mIGBgQ2BgLCBjYWxsaW5nXG4gICAgICBgYHguZigxKWBgIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBgYEMuZih4LCAxKWBgLlxuXG4gICAgICBXaGVuIGEgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3QgaXMgZGVyaXZlZCBmcm9tIGEgY2xhc3MgbWV0aG9kXG4gICAgICBvYmplY3QsIHRoZSAiY2xhc3MgaW5zdGFuY2UiIHN0b3JlZCBpbiBgYGltX3NlbGZgYCB3aWxsIGFjdHVhbGx5XG4gICAgICBiZSB0aGUgY2xhc3MgaXRzZWxmLCBzbyB0aGF0IGNhbGxpbmcgZWl0aGVyIGBgeC5mKDEpYGAgb3JcbiAgICAgIGBgQy5mKDEpYGAgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIGBgZihDLDEpYGAgd2hlcmUgYGBmYGAgaXNcbiAgICAgIHRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uLlxuXG4gICAgICBOb3RlIHRoYXQgdGhlIHRyYW5zZm9ybWF0aW9uIGZyb20gZnVuY3Rpb24gb2JqZWN0IHRvICh1bmJvdW5kIG9yXG4gICAgICBib3VuZCkgbWV0aG9kIG9iamVjdCBoYXBwZW5zIGVhY2ggdGltZSB0aGUgYXR0cmlidXRlIGlzXG4gICAgICByZXRyaWV2ZWQgZnJvbSB0aGUgY2xhc3Mgb3IgaW5zdGFuY2UuIEluIHNvbWUgY2FzZXMsIGEgZnJ1aXRmdWxcbiAgICAgIG9wdGltaXphdGlvbiBpcyB0byBhc3NpZ24gdGhlIGF0dHJpYnV0ZSB0byBhIGxvY2FsIHZhcmlhYmxlIGFuZFxuICAgICAgY2FsbCB0aGF0IGxvY2FsIHZhcmlhYmxlLiBBbHNvIG5vdGljZSB0aGF0IHRoaXMgdHJhbnNmb3JtYXRpb25cbiAgICAgIG9ubHkgaGFwcGVucyBmb3IgdXNlci1kZWZpbmVkIGZ1bmN0aW9uczsgb3RoZXIgY2FsbGFibGUgb2JqZWN0c1xuICAgICAgKGFuZCBhbGwgbm9uLWNhbGxhYmxlIG9iamVjdHMpIGFyZSByZXRyaWV2ZWQgd2l0aG91dFxuICAgICAgdHJhbnNmb3JtYXRpb24uICBJdCBpcyBhbHNvIGltcG9ydGFudCB0byBub3RlIHRoYXQgdXNlci1kZWZpbmVkXG4gICAgICBmdW5jdGlvbnMgd2hpY2ggYXJlIGF0dHJpYnV0ZXMgb2YgYSBjbGFzcyBpbnN0YW5jZSBhcmUgbm90XG4gICAgICBjb252ZXJ0ZWQgdG8gYm91bmQgbWV0aG9kczsgdGhpcyAqb25seSogaGFwcGVucyB3aGVuIHRoZVxuICAgICAgZnVuY3Rpb24gaXMgYW4gYXR0cmlidXRlIG9mIHRoZSBjbGFzcy5cblxuICAgR2VuZXJhdG9yIGZ1bmN0aW9uc1xuICAgICAgQSBmdW5jdGlvbiBvciBtZXRob2Qgd2hpY2ggdXNlcyB0aGUgYGB5aWVsZGBgIHN0YXRlbWVudCAoc2VlXG4gICAgICBzZWN0aW9uICpUaGUgeWllbGQgc3RhdGVtZW50KikgaXMgY2FsbGVkIGEgKmdlbmVyYXRvciBmdW5jdGlvbiouXG4gICAgICBTdWNoIGEgZnVuY3Rpb24sIHdoZW4gY2FsbGVkLCBhbHdheXMgcmV0dXJucyBhbiBpdGVyYXRvciBvYmplY3RcbiAgICAgIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uOiAgY2FsbGluZ1xuICAgICAgdGhlIGl0ZXJhdG9yXCdzIGBgbmV4dCgpYGAgbWV0aG9kIHdpbGwgY2F1c2UgdGhlIGZ1bmN0aW9uIHRvXG4gICAgICBleGVjdXRlIHVudGlsIGl0IHByb3ZpZGVzIGEgdmFsdWUgdXNpbmcgdGhlIGBgeWllbGRgYCBzdGF0ZW1lbnQuXG4gICAgICBXaGVuIHRoZSBmdW5jdGlvbiBleGVjdXRlcyBhIGBgcmV0dXJuYGAgc3RhdGVtZW50IG9yIGZhbGxzIG9mZlxuICAgICAgdGhlIGVuZCwgYSBgYFN0b3BJdGVyYXRpb25gYCBleGNlcHRpb24gaXMgcmFpc2VkIGFuZCB0aGVcbiAgICAgIGl0ZXJhdG9yIHdpbGwgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHNldCBvZiB2YWx1ZXMgdG8gYmVcbiAgICAgIHJldHVybmVkLlxuXG4gICBCdWlsdC1pbiBmdW5jdGlvbnNcbiAgICAgIEEgYnVpbHQtaW4gZnVuY3Rpb24gb2JqZWN0IGlzIGEgd3JhcHBlciBhcm91bmQgYSBDIGZ1bmN0aW9uLlxuICAgICAgRXhhbXBsZXMgb2YgYnVpbHQtaW4gZnVuY3Rpb25zIGFyZSBgYGxlbigpYGAgYW5kIGBgbWF0aC5zaW4oKWBgXG4gICAgICAoYGBtYXRoYGAgaXMgYSBzdGFuZGFyZCBidWlsdC1pbiBtb2R1bGUpLiBUaGUgbnVtYmVyIGFuZCB0eXBlIG9mXG4gICAgICB0aGUgYXJndW1lbnRzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBDIGZ1bmN0aW9uLiBTcGVjaWFsIHJlYWQtXG4gICAgICBvbmx5IGF0dHJpYnV0ZXM6IGBgX19kb2NfX2BgIGlzIHRoZSBmdW5jdGlvblwncyBkb2N1bWVudGF0aW9uXG4gICAgICBzdHJpbmcsIG9yIGBgTm9uZWBgIGlmIHVuYXZhaWxhYmxlOyBgYF9fbmFtZV9fYGAgaXMgdGhlXG4gICAgICBmdW5jdGlvblwncyBuYW1lOyBgYF9fc2VsZl9fYGAgaXMgc2V0IHRvIGBgTm9uZWBgIChidXQgc2VlIHRoZVxuICAgICAgbmV4dCBpdGVtKTsgYGBfX21vZHVsZV9fYGAgaXMgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0aGVcbiAgICAgIGZ1bmN0aW9uIHdhcyBkZWZpbmVkIGluIG9yIGBgTm9uZWBgIGlmIHVuYXZhaWxhYmxlLlxuXG4gICBCdWlsdC1pbiBtZXRob2RzXG4gICAgICBUaGlzIGlzIHJlYWxseSBhIGRpZmZlcmVudCBkaXNndWlzZSBvZiBhIGJ1aWx0LWluIGZ1bmN0aW9uLCB0aGlzXG4gICAgICB0aW1lIGNvbnRhaW5pbmcgYW4gb2JqZWN0IHBhc3NlZCB0byB0aGUgQyBmdW5jdGlvbiBhcyBhblxuICAgICAgaW1wbGljaXQgZXh0cmEgYXJndW1lbnQuICBBbiBleGFtcGxlIG9mIGEgYnVpbHQtaW4gbWV0aG9kIGlzXG4gICAgICBgYGFsaXN0LmFwcGVuZCgpYGAsIGFzc3VtaW5nICphbGlzdCogaXMgYSBsaXN0IG9iamVjdC4gSW4gdGhpc1xuICAgICAgY2FzZSwgdGhlIHNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZSBgYF9fc2VsZl9fYGAgaXMgc2V0IHRvIHRoZVxuICAgICAgb2JqZWN0IGRlbm90ZWQgYnkgKmFsaXN0Ki5cblxuICAgQ2xhc3MgVHlwZXNcbiAgICAgIENsYXNzIHR5cGVzLCBvciAibmV3LXN0eWxlIGNsYXNzZXMsIiBhcmUgY2FsbGFibGUuICBUaGVzZVxuICAgICAgb2JqZWN0cyBub3JtYWxseSBhY3QgYXMgZmFjdG9yaWVzIGZvciBuZXcgaW5zdGFuY2VzIG9mXG4gICAgICB0aGVtc2VsdmVzLCBidXQgdmFyaWF0aW9ucyBhcmUgcG9zc2libGUgZm9yIGNsYXNzIHR5cGVzIHRoYXRcbiAgICAgIG92ZXJyaWRlIGBgX19uZXdfXygpYGAuICBUaGUgYXJndW1lbnRzIG9mIHRoZSBjYWxsIGFyZSBwYXNzZWQgdG9cbiAgICAgIGBgX19uZXdfXygpYGAgYW5kLCBpbiB0aGUgdHlwaWNhbCBjYXNlLCB0byBgYF9faW5pdF9fKClgYCB0b1xuICAgICAgaW5pdGlhbGl6ZSB0aGUgbmV3IGluc3RhbmNlLlxuXG4gICBDbGFzc2ljIENsYXNzZXNcbiAgICAgIENsYXNzIG9iamVjdHMgYXJlIGRlc2NyaWJlZCBiZWxvdy4gIFdoZW4gYSBjbGFzcyBvYmplY3QgaXNcbiAgICAgIGNhbGxlZCwgYSBuZXcgY2xhc3MgaW5zdGFuY2UgKGFsc28gZGVzY3JpYmVkIGJlbG93KSBpcyBjcmVhdGVkXG4gICAgICBhbmQgcmV0dXJuZWQuICBUaGlzIGltcGxpZXMgYSBjYWxsIHRvIHRoZSBjbGFzc1wncyBgYF9faW5pdF9fKClgYFxuICAgICAgbWV0aG9kIGlmIGl0IGhhcyBvbmUuICBBbnkgYXJndW1lbnRzIGFyZSBwYXNzZWQgb24gdG8gdGhlXG4gICAgICBgYF9faW5pdF9fKClgYCBtZXRob2QuICBJZiB0aGVyZSBpcyBubyBgYF9faW5pdF9fKClgYCBtZXRob2QsXG4gICAgICB0aGUgY2xhc3MgbXVzdCBiZSBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMuXG5cbiAgIENsYXNzIGluc3RhbmNlc1xuICAgICAgQ2xhc3MgaW5zdGFuY2VzIGFyZSBkZXNjcmliZWQgYmVsb3cuICBDbGFzcyBpbnN0YW5jZXMgYXJlXG4gICAgICBjYWxsYWJsZSBvbmx5IHdoZW4gdGhlIGNsYXNzIGhhcyBhIGBgX19jYWxsX18oKWBgIG1ldGhvZDtcbiAgICAgIGBgeChhcmd1bWVudHMpYGAgaXMgYSBzaG9ydGhhbmQgZm9yIGBgeC5fX2NhbGxfXyhhcmd1bWVudHMpYGAuXG5cbk1vZHVsZXNcbiAgIE1vZHVsZXMgYXJlIGltcG9ydGVkIGJ5IHRoZSBgYGltcG9ydGBgIHN0YXRlbWVudCAoc2VlIHNlY3Rpb24gKlRoZVxuICAgaW1wb3J0IHN0YXRlbWVudCopLiBBIG1vZHVsZSBvYmplY3QgaGFzIGEgbmFtZXNwYWNlIGltcGxlbWVudGVkIGJ5XG4gICBhIGRpY3Rpb25hcnkgb2JqZWN0ICh0aGlzIGlzIHRoZSBkaWN0aW9uYXJ5IHJlZmVyZW5jZWQgYnkgdGhlXG4gICBmdW5jX2dsb2JhbHMgYXR0cmlidXRlIG9mIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoZSBtb2R1bGUpLlxuICAgQXR0cmlidXRlIHJlZmVyZW5jZXMgYXJlIHRyYW5zbGF0ZWQgdG8gbG9va3VwcyBpbiB0aGlzIGRpY3Rpb25hcnksXG4gICBlLmcuLCBgYG0ueGBgIGlzIGVxdWl2YWxlbnQgdG8gYGBtLl9fZGljdF9fWyJ4Il1gYC4gQSBtb2R1bGUgb2JqZWN0XG4gICBkb2VzIG5vdCBjb250YWluIHRoZSBjb2RlIG9iamVjdCB1c2VkIHRvIGluaXRpYWxpemUgdGhlIG1vZHVsZVxuICAgKHNpbmNlIGl0IGlzblwndCBuZWVkZWQgb25jZSB0aGUgaW5pdGlhbGl6YXRpb24gaXMgZG9uZSkuXG5cbiAgIEF0dHJpYnV0ZSBhc3NpZ25tZW50IHVwZGF0ZXMgdGhlIG1vZHVsZVwncyBuYW1lc3BhY2UgZGljdGlvbmFyeSxcbiAgIGUuZy4sIGBgbS54ID0gMWBgIGlzIGVxdWl2YWxlbnQgdG8gYGBtLl9fZGljdF9fWyJ4Il0gPSAxYGAuXG5cbiAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZTogYGBfX2RpY3RfX2BgIGlzIHRoZSBtb2R1bGVcJ3MgbmFtZXNwYWNlXG4gICBhcyBhIGRpY3Rpb25hcnkgb2JqZWN0LlxuXG4gICAqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIEJlY2F1c2Ugb2YgdGhlIHdheSBDUHl0aG9uXG4gICBjbGVhcnMgbW9kdWxlIGRpY3Rpb25hcmllcywgdGhlIG1vZHVsZSBkaWN0aW9uYXJ5IHdpbGwgYmUgY2xlYXJlZFxuICAgd2hlbiB0aGUgbW9kdWxlIGZhbGxzIG91dCBvZiBzY29wZSBldmVuIGlmIHRoZSBkaWN0aW9uYXJ5IHN0aWxsIGhhc1xuICAgbGl2ZSByZWZlcmVuY2VzLiAgVG8gYXZvaWQgdGhpcywgY29weSB0aGUgZGljdGlvbmFyeSBvciBrZWVwIHRoZVxuICAgbW9kdWxlIGFyb3VuZCB3aGlsZSB1c2luZyBpdHMgZGljdGlvbmFyeSBkaXJlY3RseS5cblxuICAgUHJlZGVmaW5lZCAod3JpdGFibGUpIGF0dHJpYnV0ZXM6IGBgX19uYW1lX19gYCBpcyB0aGUgbW9kdWxlXCdzXG4gICBuYW1lOyBgYF9fZG9jX19gYCBpcyB0aGUgbW9kdWxlXCdzIGRvY3VtZW50YXRpb24gc3RyaW5nLCBvciBgYE5vbmVgYFxuICAgaWYgdW5hdmFpbGFibGU7IGBgX19maWxlX19gYCBpcyB0aGUgcGF0aG5hbWUgb2YgdGhlIGZpbGUgZnJvbSB3aGljaFxuICAgdGhlIG1vZHVsZSB3YXMgbG9hZGVkLCBpZiBpdCB3YXMgbG9hZGVkIGZyb20gYSBmaWxlLiBUaGVcbiAgIGBgX19maWxlX19gYCBhdHRyaWJ1dGUgaXMgbm90IHByZXNlbnQgZm9yIEMgbW9kdWxlcyB0aGF0IGFyZVxuICAgc3RhdGljYWxseSBsaW5rZWQgaW50byB0aGUgaW50ZXJwcmV0ZXI7IGZvciBleHRlbnNpb24gbW9kdWxlc1xuICAgbG9hZGVkIGR5bmFtaWNhbGx5IGZyb20gYSBzaGFyZWQgbGlicmFyeSwgaXQgaXMgdGhlIHBhdGhuYW1lIG9mIHRoZVxuICAgc2hhcmVkIGxpYnJhcnkgZmlsZS5cblxuQ2xhc3Nlc1xuICAgQm90aCBjbGFzcyB0eXBlcyAobmV3LXN0eWxlIGNsYXNzZXMpIGFuZCBjbGFzcyBvYmplY3RzIChvbGQtXG4gICBzdHlsZS9jbGFzc2ljIGNsYXNzZXMpIGFyZSB0eXBpY2FsbHkgY3JlYXRlZCBieSBjbGFzcyBkZWZpbml0aW9uc1xuICAgKHNlZSBzZWN0aW9uICpDbGFzcyBkZWZpbml0aW9ucyopLiAgQSBjbGFzcyBoYXMgYSBuYW1lc3BhY2VcbiAgIGltcGxlbWVudGVkIGJ5IGEgZGljdGlvbmFyeSBvYmplY3QuIENsYXNzIGF0dHJpYnV0ZSByZWZlcmVuY2VzIGFyZVxuICAgdHJhbnNsYXRlZCB0byBsb29rdXBzIGluIHRoaXMgZGljdGlvbmFyeSwgZS5nLiwgYGBDLnhgYCBpc1xuICAgdHJhbnNsYXRlZCB0byBgYEMuX19kaWN0X19bIngiXWBgIChhbHRob3VnaCBmb3IgbmV3LXN0eWxlIGNsYXNzZXNcbiAgIGluIHBhcnRpY3VsYXIgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIGhvb2tzIHdoaWNoIGFsbG93IGZvciBvdGhlclxuICAgbWVhbnMgb2YgbG9jYXRpbmcgYXR0cmlidXRlcykuIFdoZW4gdGhlIGF0dHJpYnV0ZSBuYW1lIGlzIG5vdCBmb3VuZFxuICAgdGhlcmUsIHRoZSBhdHRyaWJ1dGUgc2VhcmNoIGNvbnRpbnVlcyBpbiB0aGUgYmFzZSBjbGFzc2VzLiAgRm9yXG4gICBvbGQtc3R5bGUgY2xhc3NlcywgdGhlIHNlYXJjaCBpcyBkZXB0aC1maXJzdCwgbGVmdC10by1yaWdodCBpbiB0aGVcbiAgIG9yZGVyIG9mIG9jY3VycmVuY2UgaW4gdGhlIGJhc2UgY2xhc3MgbGlzdC4gTmV3LXN0eWxlIGNsYXNzZXMgdXNlXG4gICB0aGUgbW9yZSBjb21wbGV4IEMzIG1ldGhvZCByZXNvbHV0aW9uIG9yZGVyIHdoaWNoIGJlaGF2ZXMgY29ycmVjdGx5XG4gICBldmVuIGluIHRoZSBwcmVzZW5jZSBvZiBcJ2RpYW1vbmRcJyBpbmhlcml0YW5jZSBzdHJ1Y3R1cmVzIHdoZXJlXG4gICB0aGVyZSBhcmUgbXVsdGlwbGUgaW5oZXJpdGFuY2UgcGF0aHMgbGVhZGluZyBiYWNrIHRvIGEgY29tbW9uXG4gICBhbmNlc3Rvci4gQWRkaXRpb25hbCBkZXRhaWxzIG9uIHRoZSBDMyBNUk8gdXNlZCBieSBuZXctc3R5bGVcbiAgIGNsYXNzZXMgY2FuIGJlIGZvdW5kIGluIHRoZSBkb2N1bWVudGF0aW9uIGFjY29tcGFueWluZyB0aGUgMi4zXG4gICByZWxlYXNlIGF0IGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb3dubG9hZC9yZWxlYXNlcy8yLjMvbXJvLy5cblxuICAgV2hlbiBhIGNsYXNzIGF0dHJpYnV0ZSByZWZlcmVuY2UgKGZvciBjbGFzcyBgYENgYCwgc2F5KSB3b3VsZCB5aWVsZFxuICAgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IG9yIGFuIHVuYm91bmQgdXNlci1kZWZpbmVkIG1ldGhvZFxuICAgb2JqZWN0IHdob3NlIGFzc29jaWF0ZWQgY2xhc3MgaXMgZWl0aGVyIGBgQ2BgIG9yIG9uZSBvZiBpdHMgYmFzZVxuICAgY2xhc3NlcywgaXQgaXMgdHJhbnNmb3JtZWQgaW50byBhbiB1bmJvdW5kIHVzZXItZGVmaW5lZCBtZXRob2RcbiAgIG9iamVjdCB3aG9zZSBgYGltX2NsYXNzYGAgYXR0cmlidXRlIGlzIGBgQ2BgLiBXaGVuIGl0IHdvdWxkIHlpZWxkIGFcbiAgIGNsYXNzIG1ldGhvZCBvYmplY3QsIGl0IGlzIHRyYW5zZm9ybWVkIGludG8gYSBib3VuZCB1c2VyLWRlZmluZWRcbiAgIG1ldGhvZCBvYmplY3Qgd2hvc2UgYGBpbV9jbGFzc2BgIGFuZCBgYGltX3NlbGZgYCBhdHRyaWJ1dGVzIGFyZVxuICAgYm90aCBgYENgYC4gIFdoZW4gaXQgd291bGQgeWllbGQgYSBzdGF0aWMgbWV0aG9kIG9iamVjdCwgaXQgaXNcbiAgIHRyYW5zZm9ybWVkIGludG8gdGhlIG9iamVjdCB3cmFwcGVkIGJ5IHRoZSBzdGF0aWMgbWV0aG9kIG9iamVjdC5cbiAgIFNlZSBzZWN0aW9uICpJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnMqIGZvciBhbm90aGVyIHdheSBpbiB3aGljaFxuICAgYXR0cmlidXRlcyByZXRyaWV2ZWQgZnJvbSBhIGNsYXNzIG1heSBkaWZmZXIgZnJvbSB0aG9zZSBhY3R1YWxseVxuICAgY29udGFpbmVkIGluIGl0cyBgYF9fZGljdF9fYGAgKG5vdGUgdGhhdCBvbmx5IG5ldy1zdHlsZSBjbGFzc2VzXG4gICBzdXBwb3J0IGRlc2NyaXB0b3JzKS5cblxuICAgQ2xhc3MgYXR0cmlidXRlIGFzc2lnbm1lbnRzIHVwZGF0ZSB0aGUgY2xhc3NcJ3MgZGljdGlvbmFyeSwgbmV2ZXJcbiAgIHRoZSBkaWN0aW9uYXJ5IG9mIGEgYmFzZSBjbGFzcy5cblxuICAgQSBjbGFzcyBvYmplY3QgY2FuIGJlIGNhbGxlZCAoc2VlIGFib3ZlKSB0byB5aWVsZCBhIGNsYXNzIGluc3RhbmNlXG4gICAoc2VlIGJlbG93KS5cblxuICAgU3BlY2lhbCBhdHRyaWJ1dGVzOiBgYF9fbmFtZV9fYGAgaXMgdGhlIGNsYXNzIG5hbWU7IGBgX19tb2R1bGVfX2BgXG4gICBpcyB0aGUgbW9kdWxlIG5hbWUgaW4gd2hpY2ggdGhlIGNsYXNzIHdhcyBkZWZpbmVkOyBgYF9fZGljdF9fYGAgaXNcbiAgIHRoZSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIGNsYXNzXCdzIG5hbWVzcGFjZTsgYGBfX2Jhc2VzX19gYCBpcyBhXG4gICB0dXBsZSAocG9zc2libHkgZW1wdHkgb3IgYSBzaW5nbGV0b24pIGNvbnRhaW5pbmcgdGhlIGJhc2UgY2xhc3NlcyxcbiAgIGluIHRoZSBvcmRlciBvZiB0aGVpciBvY2N1cnJlbmNlIGluIHRoZSBiYXNlIGNsYXNzIGxpc3Q7XG4gICBgYF9fZG9jX19gYCBpcyB0aGUgY2xhc3NcJ3MgZG9jdW1lbnRhdGlvbiBzdHJpbmcsIG9yIE5vbmUgaWZcbiAgIHVuZGVmaW5lZC5cblxuQ2xhc3MgaW5zdGFuY2VzXG4gICBBIGNsYXNzIGluc3RhbmNlIGlzIGNyZWF0ZWQgYnkgY2FsbGluZyBhIGNsYXNzIG9iamVjdCAoc2VlIGFib3ZlKS5cbiAgIEEgY2xhc3MgaW5zdGFuY2UgaGFzIGEgbmFtZXNwYWNlIGltcGxlbWVudGVkIGFzIGEgZGljdGlvbmFyeSB3aGljaFxuICAgaXMgdGhlIGZpcnN0IHBsYWNlIGluIHdoaWNoIGF0dHJpYnV0ZSByZWZlcmVuY2VzIGFyZSBzZWFyY2hlZC5cbiAgIFdoZW4gYW4gYXR0cmlidXRlIGlzIG5vdCBmb3VuZCB0aGVyZSwgYW5kIHRoZSBpbnN0YW5jZVwncyBjbGFzcyBoYXNcbiAgIGFuIGF0dHJpYnV0ZSBieSB0aGF0IG5hbWUsIHRoZSBzZWFyY2ggY29udGludWVzIHdpdGggdGhlIGNsYXNzXG4gICBhdHRyaWJ1dGVzLiAgSWYgYSBjbGFzcyBhdHRyaWJ1dGUgaXMgZm91bmQgdGhhdCBpcyBhIHVzZXItZGVmaW5lZFxuICAgZnVuY3Rpb24gb2JqZWN0IG9yIGFuIHVuYm91bmQgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3Qgd2hvc2VcbiAgIGFzc29jaWF0ZWQgY2xhc3MgaXMgdGhlIGNsYXNzIChjYWxsIGl0IGBgQ2BgKSBvZiB0aGUgaW5zdGFuY2UgZm9yXG4gICB3aGljaCB0aGUgYXR0cmlidXRlIHJlZmVyZW5jZSB3YXMgaW5pdGlhdGVkIG9yIG9uZSBvZiBpdHMgYmFzZXMsIGl0XG4gICBpcyB0cmFuc2Zvcm1lZCBpbnRvIGEgYm91bmQgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3Qgd2hvc2VcbiAgIGBgaW1fY2xhc3NgYCBhdHRyaWJ1dGUgaXMgYGBDYGAgYW5kIHdob3NlIGBgaW1fc2VsZmBgIGF0dHJpYnV0ZSBpc1xuICAgdGhlIGluc3RhbmNlLiBTdGF0aWMgbWV0aG9kIGFuZCBjbGFzcyBtZXRob2Qgb2JqZWN0cyBhcmUgYWxzb1xuICAgdHJhbnNmb3JtZWQsIGFzIGlmIHRoZXkgaGFkIGJlZW4gcmV0cmlldmVkIGZyb20gY2xhc3MgYGBDYGA7IHNlZVxuICAgYWJvdmUgdW5kZXIgIkNsYXNzZXMiLiBTZWUgc2VjdGlvbiAqSW1wbGVtZW50aW5nIERlc2NyaXB0b3JzKiBmb3JcbiAgIGFub3RoZXIgd2F5IGluIHdoaWNoIGF0dHJpYnV0ZXMgb2YgYSBjbGFzcyByZXRyaWV2ZWQgdmlhIGl0c1xuICAgaW5zdGFuY2VzIG1heSBkaWZmZXIgZnJvbSB0aGUgb2JqZWN0cyBhY3R1YWxseSBzdG9yZWQgaW4gdGhlXG4gICBjbGFzc1wncyBgYF9fZGljdF9fYGAuIElmIG5vIGNsYXNzIGF0dHJpYnV0ZSBpcyBmb3VuZCwgYW5kIHRoZVxuICAgb2JqZWN0XCdzIGNsYXNzIGhhcyBhIGBgX19nZXRhdHRyX18oKWBgIG1ldGhvZCwgdGhhdCBpcyBjYWxsZWQgdG9cbiAgIHNhdGlzZnkgdGhlIGxvb2t1cC5cblxuICAgQXR0cmlidXRlIGFzc2lnbm1lbnRzIGFuZCBkZWxldGlvbnMgdXBkYXRlIHRoZSBpbnN0YW5jZVwnc1xuICAgZGljdGlvbmFyeSwgbmV2ZXIgYSBjbGFzc1wncyBkaWN0aW9uYXJ5LiAgSWYgdGhlIGNsYXNzIGhhcyBhXG4gICBgYF9fc2V0YXR0cl9fKClgYCBvciBgYF9fZGVsYXR0cl9fKClgYCBtZXRob2QsIHRoaXMgaXMgY2FsbGVkXG4gICBpbnN0ZWFkIG9mIHVwZGF0aW5nIHRoZSBpbnN0YW5jZSBkaWN0aW9uYXJ5IGRpcmVjdGx5LlxuXG4gICBDbGFzcyBpbnN0YW5jZXMgY2FuIHByZXRlbmQgdG8gYmUgbnVtYmVycywgc2VxdWVuY2VzLCBvciBtYXBwaW5nc1xuICAgaWYgdGhleSBoYXZlIG1ldGhvZHMgd2l0aCBjZXJ0YWluIHNwZWNpYWwgbmFtZXMuICBTZWUgc2VjdGlvblxuICAgKlNwZWNpYWwgbWV0aG9kIG5hbWVzKi5cblxuICAgU3BlY2lhbCBhdHRyaWJ1dGVzOiBgYF9fZGljdF9fYGAgaXMgdGhlIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5O1xuICAgYGBfX2NsYXNzX19gYCBpcyB0aGUgaW5zdGFuY2VcJ3MgY2xhc3MuXG5cbkZpbGVzXG4gICBBIGZpbGUgb2JqZWN0IHJlcHJlc2VudHMgYW4gb3BlbiBmaWxlLiAgRmlsZSBvYmplY3RzIGFyZSBjcmVhdGVkIGJ5XG4gICB0aGUgYGBvcGVuKClgYCBidWlsdC1pbiBmdW5jdGlvbiwgYW5kIGFsc28gYnkgYGBvcy5wb3BlbigpYGAsXG4gICBgYG9zLmZkb3BlbigpYGAsIGFuZCB0aGUgYGBtYWtlZmlsZSgpYGAgbWV0aG9kIG9mIHNvY2tldCBvYmplY3RzXG4gICAoYW5kIHBlcmhhcHMgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIG1ldGhvZHMgcHJvdmlkZWQgYnkgZXh0ZW5zaW9uXG4gICBtb2R1bGVzKS4gIFRoZSBvYmplY3RzIGBgc3lzLnN0ZGluYGAsIGBgc3lzLnN0ZG91dGBgIGFuZFxuICAgYGBzeXMuc3RkZXJyYGAgYXJlIGluaXRpYWxpemVkIHRvIGZpbGUgb2JqZWN0cyBjb3JyZXNwb25kaW5nIHRvIHRoZVxuICAgaW50ZXJwcmV0ZXJcJ3Mgc3RhbmRhcmQgaW5wdXQsIG91dHB1dCBhbmQgZXJyb3Igc3RyZWFtcy4gIFNlZSAqRmlsZVxuICAgT2JqZWN0cyogZm9yIGNvbXBsZXRlIGRvY3VtZW50YXRpb24gb2YgZmlsZSBvYmplY3RzLlxuXG5JbnRlcm5hbCB0eXBlc1xuICAgQSBmZXcgdHlwZXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBpbnRlcnByZXRlciBhcmUgZXhwb3NlZCB0byB0aGVcbiAgIHVzZXIuIFRoZWlyIGRlZmluaXRpb25zIG1heSBjaGFuZ2Ugd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlXG4gICBpbnRlcnByZXRlciwgYnV0IHRoZXkgYXJlIG1lbnRpb25lZCBoZXJlIGZvciBjb21wbGV0ZW5lc3MuXG5cbiAgIENvZGUgb2JqZWN0c1xuICAgICAgQ29kZSBvYmplY3RzIHJlcHJlc2VudCAqYnl0ZS1jb21waWxlZCogZXhlY3V0YWJsZSBQeXRob24gY29kZSxcbiAgICAgIG9yICpieXRlY29kZSouIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBjb2RlIG9iamVjdCBhbmQgYVxuICAgICAgZnVuY3Rpb24gb2JqZWN0IGlzIHRoYXQgdGhlIGZ1bmN0aW9uIG9iamVjdCBjb250YWlucyBhbiBleHBsaWNpdFxuICAgICAgcmVmZXJlbmNlIHRvIHRoZSBmdW5jdGlvblwncyBnbG9iYWxzICh0aGUgbW9kdWxlIGluIHdoaWNoIGl0IHdhc1xuICAgICAgZGVmaW5lZCksIHdoaWxlIGEgY29kZSBvYmplY3QgY29udGFpbnMgbm8gY29udGV4dDsgYWxzbyB0aGVcbiAgICAgIGRlZmF1bHQgYXJndW1lbnQgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIGZ1bmN0aW9uIG9iamVjdCwgbm90XG4gICAgICBpbiB0aGUgY29kZSBvYmplY3QgKGJlY2F1c2UgdGhleSByZXByZXNlbnQgdmFsdWVzIGNhbGN1bGF0ZWQgYXRcbiAgICAgIHJ1bi10aW1lKS4gIFVubGlrZSBmdW5jdGlvbiBvYmplY3RzLCBjb2RlIG9iamVjdHMgYXJlIGltbXV0YWJsZVxuICAgICAgYW5kIGNvbnRhaW4gbm8gcmVmZXJlbmNlcyAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkgdG8gbXV0YWJsZVxuICAgICAgb2JqZWN0cy5cblxuICAgICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogYGBjb19uYW1lYGAgZ2l2ZXMgdGhlIGZ1bmN0aW9uXG4gICAgICBuYW1lOyBgYGNvX2FyZ2NvdW50YGAgaXMgdGhlIG51bWJlciBvZiBwb3NpdGlvbmFsIGFyZ3VtZW50c1xuICAgICAgKGluY2x1ZGluZyBhcmd1bWVudHMgd2l0aCBkZWZhdWx0IHZhbHVlcyk7IGBgY29fbmxvY2Fsc2BgIGlzIHRoZVxuICAgICAgbnVtYmVyIG9mIGxvY2FsIHZhcmlhYmxlcyB1c2VkIGJ5IHRoZSBmdW5jdGlvbiAoaW5jbHVkaW5nXG4gICAgICBhcmd1bWVudHMpOyBgYGNvX3Zhcm5hbWVzYGAgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBuYW1lcyBvZlxuICAgICAgdGhlIGxvY2FsIHZhcmlhYmxlcyAoc3RhcnRpbmcgd2l0aCB0aGUgYXJndW1lbnQgbmFtZXMpO1xuICAgICAgYGBjb19jZWxsdmFyc2BgIGlzIGEgdHVwbGUgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgbG9jYWxcbiAgICAgIHZhcmlhYmxlcyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IG5lc3RlZCBmdW5jdGlvbnM7XG4gICAgICBgYGNvX2ZyZWV2YXJzYGAgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBmcmVlXG4gICAgICB2YXJpYWJsZXM7IGBgY29fY29kZWBgIGlzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgc2VxdWVuY2Ugb2ZcbiAgICAgIGJ5dGVjb2RlIGluc3RydWN0aW9uczsgYGBjb19jb25zdHNgYCBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlXG4gICAgICBsaXRlcmFscyB1c2VkIGJ5IHRoZSBieXRlY29kZTsgYGBjb19uYW1lc2BgIGlzIGEgdHVwbGVcbiAgICAgIGNvbnRhaW5pbmcgdGhlIG5hbWVzIHVzZWQgYnkgdGhlIGJ5dGVjb2RlOyBgYGNvX2ZpbGVuYW1lYGAgaXNcbiAgICAgIHRoZSBmaWxlbmFtZSBmcm9tIHdoaWNoIHRoZSBjb2RlIHdhcyBjb21waWxlZDtcbiAgICAgIGBgY29fZmlyc3RsaW5lbm9gYCBpcyB0aGUgZmlyc3QgbGluZSBudW1iZXIgb2YgdGhlIGZ1bmN0aW9uO1xuICAgICAgYGBjb19sbm90YWJgYCBpcyBhIHN0cmluZyBlbmNvZGluZyB0aGUgbWFwcGluZyBmcm9tIGJ5dGVjb2RlXG4gICAgICBvZmZzZXRzIHRvIGxpbmUgbnVtYmVycyAoZm9yIGRldGFpbHMgc2VlIHRoZSBzb3VyY2UgY29kZSBvZiB0aGVcbiAgICAgIGludGVycHJldGVyKTsgYGBjb19zdGFja3NpemVgYCBpcyB0aGUgcmVxdWlyZWQgc3RhY2sgc2l6ZVxuICAgICAgKGluY2x1ZGluZyBsb2NhbCB2YXJpYWJsZXMpOyBgYGNvX2ZsYWdzYGAgaXMgYW4gaW50ZWdlciBlbmNvZGluZ1xuICAgICAgYSBudW1iZXIgb2YgZmxhZ3MgZm9yIHRoZSBpbnRlcnByZXRlci5cblxuICAgICAgVGhlIGZvbGxvd2luZyBmbGFnIGJpdHMgYXJlIGRlZmluZWQgZm9yIGBgY29fZmxhZ3NgYDogYml0XG4gICAgICBgYDB4MDRgYCBpcyBzZXQgaWYgdGhlIGZ1bmN0aW9uIHVzZXMgdGhlIGBgKmFyZ3VtZW50c2BgIHN5bnRheFxuICAgICAgdG8gYWNjZXB0IGFuIGFyYml0cmFyeSBudW1iZXIgb2YgcG9zaXRpb25hbCBhcmd1bWVudHM7IGJpdFxuICAgICAgYGAweDA4YGAgaXMgc2V0IGlmIHRoZSBmdW5jdGlvbiB1c2VzIHRoZSBgYCoqa2V5d29yZHNgYCBzeW50YXhcbiAgICAgIHRvIGFjY2VwdCBhcmJpdHJhcnkga2V5d29yZCBhcmd1bWVudHM7IGJpdCBgYDB4MjBgYCBpcyBzZXQgaWZcbiAgICAgIHRoZSBmdW5jdGlvbiBpcyBhIGdlbmVyYXRvci5cblxuICAgICAgRnV0dXJlIGZlYXR1cmUgZGVjbGFyYXRpb25zIChgYGZyb20gX19mdXR1cmVfXyBpbXBvcnRcbiAgICAgIGRpdmlzaW9uYGApIGFsc28gdXNlIGJpdHMgaW4gYGBjb19mbGFnc2BgIHRvIGluZGljYXRlIHdoZXRoZXIgYVxuICAgICAgY29kZSBvYmplY3Qgd2FzIGNvbXBpbGVkIHdpdGggYSBwYXJ0aWN1bGFyIGZlYXR1cmUgZW5hYmxlZDogYml0XG4gICAgICBgYDB4MjAwMGBgIGlzIHNldCBpZiB0aGUgZnVuY3Rpb24gd2FzIGNvbXBpbGVkIHdpdGggZnV0dXJlXG4gICAgICBkaXZpc2lvbiBlbmFibGVkOyBiaXRzIGBgMHgxMGBgIGFuZCBgYDB4MTAwMGBgIHdlcmUgdXNlZCBpblxuICAgICAgZWFybGllciB2ZXJzaW9ucyBvZiBQeXRob24uXG5cbiAgICAgIE90aGVyIGJpdHMgaW4gYGBjb19mbGFnc2BgIGFyZSByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlLlxuXG4gICAgICBJZiBhIGNvZGUgb2JqZWN0IHJlcHJlc2VudHMgYSBmdW5jdGlvbiwgdGhlIGZpcnN0IGl0ZW0gaW5cbiAgICAgIGBgY29fY29uc3RzYGAgaXMgdGhlIGRvY3VtZW50YXRpb24gc3RyaW5nIG9mIHRoZSBmdW5jdGlvbiwgb3JcbiAgICAgIGBgTm9uZWBgIGlmIHVuZGVmaW5lZC5cblxuICAgRnJhbWUgb2JqZWN0c1xuICAgICAgRnJhbWUgb2JqZWN0cyByZXByZXNlbnQgZXhlY3V0aW9uIGZyYW1lcy4gIFRoZXkgbWF5IG9jY3VyIGluXG4gICAgICB0cmFjZWJhY2sgb2JqZWN0cyAoc2VlIGJlbG93KS5cblxuICAgICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogYGBmX2JhY2tgYCBpcyB0byB0aGUgcHJldmlvdXNcbiAgICAgIHN0YWNrIGZyYW1lICh0b3dhcmRzIHRoZSBjYWxsZXIpLCBvciBgYE5vbmVgYCBpZiB0aGlzIGlzIHRoZVxuICAgICAgYm90dG9tIHN0YWNrIGZyYW1lOyBgYGZfY29kZWBgIGlzIHRoZSBjb2RlIG9iamVjdCBiZWluZyBleGVjdXRlZFxuICAgICAgaW4gdGhpcyBmcmFtZTsgYGBmX2xvY2Fsc2BgIGlzIHRoZSBkaWN0aW9uYXJ5IHVzZWQgdG8gbG9vayB1cFxuICAgICAgbG9jYWwgdmFyaWFibGVzOyBgYGZfZ2xvYmFsc2BgIGlzIHVzZWQgZm9yIGdsb2JhbCB2YXJpYWJsZXM7XG4gICAgICBgYGZfYnVpbHRpbnNgYCBpcyB1c2VkIGZvciBidWlsdC1pbiAoaW50cmluc2ljKSBuYW1lcztcbiAgICAgIGBgZl9yZXN0cmljdGVkYGAgaXMgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgZnVuY3Rpb24gaXNcbiAgICAgIGV4ZWN1dGluZyBpbiByZXN0cmljdGVkIGV4ZWN1dGlvbiBtb2RlOyBgYGZfbGFzdGlgYCBnaXZlcyB0aGVcbiAgICAgIHByZWNpc2UgaW5zdHJ1Y3Rpb24gKHRoaXMgaXMgYW4gaW5kZXggaW50byB0aGUgYnl0ZWNvZGUgc3RyaW5nXG4gICAgICBvZiB0aGUgY29kZSBvYmplY3QpLlxuXG4gICAgICBTcGVjaWFsIHdyaXRhYmxlIGF0dHJpYnV0ZXM6IGBgZl90cmFjZWBgLCBpZiBub3QgYGBOb25lYGAsIGlzIGFcbiAgICAgIGZ1bmN0aW9uIGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgY29kZSBsaW5lICh0aGlzIGlzXG4gICAgICB1c2VkIGJ5IHRoZSBkZWJ1Z2dlcik7IGBgZl9leGNfdHlwZWBgLCBgYGZfZXhjX3ZhbHVlYGAsXG4gICAgICBgYGZfZXhjX3RyYWNlYmFja2BgIHJlcHJlc2VudCB0aGUgbGFzdCBleGNlcHRpb24gcmFpc2VkIGluIHRoZVxuICAgICAgcGFyZW50IGZyYW1lIHByb3ZpZGVkIGFub3RoZXIgZXhjZXB0aW9uIHdhcyBldmVyIHJhaXNlZCBpbiB0aGVcbiAgICAgIGN1cnJlbnQgZnJhbWUgKGluIGFsbCBvdGhlciBjYXNlcyB0aGV5IGFyZSBOb25lKTsgYGBmX2xpbmVub2BgXG4gICAgICBpcyB0aGUgY3VycmVudCBsaW5lIG51bWJlciBvZiB0aGUgZnJhbWUgLS0tIHdyaXRpbmcgdG8gdGhpcyBmcm9tXG4gICAgICB3aXRoaW4gYSB0cmFjZSBmdW5jdGlvbiBqdW1wcyB0byB0aGUgZ2l2ZW4gbGluZSAob25seSBmb3IgdGhlXG4gICAgICBib3R0b20tbW9zdCBmcmFtZSkuICBBIGRlYnVnZ2VyIGNhbiBpbXBsZW1lbnQgYSBKdW1wIGNvbW1hbmRcbiAgICAgIChha2EgU2V0IE5leHQgU3RhdGVtZW50KSBieSB3cml0aW5nIHRvIGZfbGluZW5vLlxuXG4gICBUcmFjZWJhY2sgb2JqZWN0c1xuICAgICAgVHJhY2ViYWNrIG9iamVjdHMgcmVwcmVzZW50IGEgc3RhY2sgdHJhY2Ugb2YgYW4gZXhjZXB0aW9uLiAgQVxuICAgICAgdHJhY2ViYWNrIG9iamVjdCBpcyBjcmVhdGVkIHdoZW4gYW4gZXhjZXB0aW9uIG9jY3Vycy4gIFdoZW4gdGhlXG4gICAgICBzZWFyY2ggZm9yIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIHVud2luZHMgdGhlIGV4ZWN1dGlvbiBzdGFjaywgYXRcbiAgICAgIGVhY2ggdW53b3VuZCBsZXZlbCBhIHRyYWNlYmFjayBvYmplY3QgaXMgaW5zZXJ0ZWQgaW4gZnJvbnQgb2ZcbiAgICAgIHRoZSBjdXJyZW50IHRyYWNlYmFjay4gIFdoZW4gYW4gZXhjZXB0aW9uIGhhbmRsZXIgaXMgZW50ZXJlZCxcbiAgICAgIHRoZSBzdGFjayB0cmFjZSBpcyBtYWRlIGF2YWlsYWJsZSB0byB0aGUgcHJvZ3JhbS4gKFNlZSBzZWN0aW9uXG4gICAgICAqVGhlIHRyeSBzdGF0ZW1lbnQqLikgSXQgaXMgYWNjZXNzaWJsZSBhcyBgYHN5cy5leGNfdHJhY2ViYWNrYGAsXG4gICAgICBhbmQgYWxzbyBhcyB0aGUgdGhpcmQgaXRlbSBvZiB0aGUgdHVwbGUgcmV0dXJuZWQgYnlcbiAgICAgIGBgc3lzLmV4Y19pbmZvKClgYC4gIFRoZSBsYXR0ZXIgaXMgdGhlIHByZWZlcnJlZCBpbnRlcmZhY2UsXG4gICAgICBzaW5jZSBpdCB3b3JrcyBjb3JyZWN0bHkgd2hlbiB0aGUgcHJvZ3JhbSBpcyB1c2luZyBtdWx0aXBsZVxuICAgICAgdGhyZWFkcy4gV2hlbiB0aGUgcHJvZ3JhbSBjb250YWlucyBubyBzdWl0YWJsZSBoYW5kbGVyLCB0aGVcbiAgICAgIHN0YWNrIHRyYWNlIGlzIHdyaXR0ZW4gKG5pY2VseSBmb3JtYXR0ZWQpIHRvIHRoZSBzdGFuZGFyZCBlcnJvclxuICAgICAgc3RyZWFtOyBpZiB0aGUgaW50ZXJwcmV0ZXIgaXMgaW50ZXJhY3RpdmUsIGl0IGlzIGFsc28gbWFkZVxuICAgICAgYXZhaWxhYmxlIHRvIHRoZSB1c2VyIGFzIGBgc3lzLmxhc3RfdHJhY2ViYWNrYGAuXG5cbiAgICAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6IGBgdGJfbmV4dGBgIGlzIHRoZSBuZXh0IGxldmVsIGluXG4gICAgICB0aGUgc3RhY2sgdHJhY2UgKHRvd2FyZHMgdGhlIGZyYW1lIHdoZXJlIHRoZSBleGNlcHRpb25cbiAgICAgIG9jY3VycmVkKSwgb3IgYGBOb25lYGAgaWYgdGhlcmUgaXMgbm8gbmV4dCBsZXZlbDsgYGB0Yl9mcmFtZWBgXG4gICAgICBwb2ludHMgdG8gdGhlIGV4ZWN1dGlvbiBmcmFtZSBvZiB0aGUgY3VycmVudCBsZXZlbDtcbiAgICAgIGBgdGJfbGluZW5vYGAgZ2l2ZXMgdGhlIGxpbmUgbnVtYmVyIHdoZXJlIHRoZSBleGNlcHRpb25cbiAgICAgIG9jY3VycmVkOyBgYHRiX2xhc3RpYGAgaW5kaWNhdGVzIHRoZSBwcmVjaXNlIGluc3RydWN0aW9uLiAgVGhlXG4gICAgICBsaW5lIG51bWJlciBhbmQgbGFzdCBpbnN0cnVjdGlvbiBpbiB0aGUgdHJhY2ViYWNrIG1heSBkaWZmZXJcbiAgICAgIGZyb20gdGhlIGxpbmUgbnVtYmVyIG9mIGl0cyBmcmFtZSBvYmplY3QgaWYgdGhlIGV4Y2VwdGlvblxuICAgICAgb2NjdXJyZWQgaW4gYSBgYHRyeWBgIHN0YXRlbWVudCB3aXRoIG5vIG1hdGNoaW5nIGV4Y2VwdCBjbGF1c2VcbiAgICAgIG9yIHdpdGggYSBmaW5hbGx5IGNsYXVzZS5cblxuICAgU2xpY2Ugb2JqZWN0c1xuICAgICAgU2xpY2Ugb2JqZWN0cyBhcmUgdXNlZCB0byByZXByZXNlbnQgc2xpY2VzIHdoZW4gKmV4dGVuZGVkIHNsaWNlXG4gICAgICBzeW50YXgqIGlzIHVzZWQuIFRoaXMgaXMgYSBzbGljZSB1c2luZyB0d28gY29sb25zLCBvciBtdWx0aXBsZVxuICAgICAgc2xpY2VzIG9yIGVsbGlwc2VzIHNlcGFyYXRlZCBieSBjb21tYXMsIGUuZy4sIGBgYVtpOmo6c3RlcF1gYCxcbiAgICAgIGBgYVtpOmosIGs6bF1gYCwgb3IgYGBhWy4uLiwgaTpqXWBgLiAgVGhleSBhcmUgYWxzbyBjcmVhdGVkIGJ5XG4gICAgICB0aGUgYnVpbHQtaW4gYGBzbGljZSgpYGAgZnVuY3Rpb24uXG5cbiAgICAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6IGBgc3RhcnRgYCBpcyB0aGUgbG93ZXIgYm91bmQ7XG4gICAgICBgYHN0b3BgYCBpcyB0aGUgdXBwZXIgYm91bmQ7IGBgc3RlcGBgIGlzIHRoZSBzdGVwIHZhbHVlOyBlYWNoIGlzXG4gICAgICBgYE5vbmVgYCBpZiBvbWl0dGVkLiBUaGVzZSBhdHRyaWJ1dGVzIGNhbiBoYXZlIGFueSB0eXBlLlxuXG4gICAgICBTbGljZSBvYmplY3RzIHN1cHBvcnQgb25lIG1ldGhvZDpcblxuICAgICAgc2xpY2UuaW5kaWNlcyhzZWxmLCBsZW5ndGgpXG5cbiAgICAgICAgIFRoaXMgbWV0aG9kIHRha2VzIGEgc2luZ2xlIGludGVnZXIgYXJndW1lbnQgKmxlbmd0aCogYW5kXG4gICAgICAgICBjb21wdXRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXh0ZW5kZWQgc2xpY2UgdGhhdCB0aGUgc2xpY2VcbiAgICAgICAgIG9iamVjdCB3b3VsZCBkZXNjcmliZSBpZiBhcHBsaWVkIHRvIGEgc2VxdWVuY2Ugb2YgKmxlbmd0aCpcbiAgICAgICAgIGl0ZW1zLiAgSXQgcmV0dXJucyBhIHR1cGxlIG9mIHRocmVlIGludGVnZXJzOyByZXNwZWN0aXZlbHlcbiAgICAgICAgIHRoZXNlIGFyZSB0aGUgKnN0YXJ0KiBhbmQgKnN0b3AqIGluZGljZXMgYW5kIHRoZSAqc3RlcCogb3JcbiAgICAgICAgIHN0cmlkZSBsZW5ndGggb2YgdGhlIHNsaWNlLiBNaXNzaW5nIG9yIG91dC1vZi1ib3VuZHMgaW5kaWNlc1xuICAgICAgICAgYXJlIGhhbmRsZWQgaW4gYSBtYW5uZXIgY29uc2lzdGVudCB3aXRoIHJlZ3VsYXIgc2xpY2VzLlxuXG4gICAgICAgICBOZXcgaW4gdmVyc2lvbiAyLjMuXG5cbiAgIFN0YXRpYyBtZXRob2Qgb2JqZWN0c1xuICAgICAgU3RhdGljIG1ldGhvZCBvYmplY3RzIHByb3ZpZGUgYSB3YXkgb2YgZGVmZWF0aW5nIHRoZVxuICAgICAgdHJhbnNmb3JtYXRpb24gb2YgZnVuY3Rpb24gb2JqZWN0cyB0byBtZXRob2Qgb2JqZWN0cyBkZXNjcmliZWRcbiAgICAgIGFib3ZlLiBBIHN0YXRpYyBtZXRob2Qgb2JqZWN0IGlzIGEgd3JhcHBlciBhcm91bmQgYW55IG90aGVyXG4gICAgICBvYmplY3QsIHVzdWFsbHkgYSB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdC4gV2hlbiBhIHN0YXRpY1xuICAgICAgbWV0aG9kIG9iamVjdCBpcyByZXRyaWV2ZWQgZnJvbSBhIGNsYXNzIG9yIGEgY2xhc3MgaW5zdGFuY2UsIHRoZVxuICAgICAgb2JqZWN0IGFjdHVhbGx5IHJldHVybmVkIGlzIHRoZSB3cmFwcGVkIG9iamVjdCwgd2hpY2ggaXMgbm90XG4gICAgICBzdWJqZWN0IHRvIGFueSBmdXJ0aGVyIHRyYW5zZm9ybWF0aW9uLiBTdGF0aWMgbWV0aG9kIG9iamVjdHMgYXJlXG4gICAgICBub3QgdGhlbXNlbHZlcyBjYWxsYWJsZSwgYWx0aG91Z2ggdGhlIG9iamVjdHMgdGhleSB3cmFwIHVzdWFsbHlcbiAgICAgIGFyZS4gU3RhdGljIG1ldGhvZCBvYmplY3RzIGFyZSBjcmVhdGVkIGJ5IHRoZSBidWlsdC1pblxuICAgICAgYGBzdGF0aWNtZXRob2QoKWBgIGNvbnN0cnVjdG9yLlxuXG4gICBDbGFzcyBtZXRob2Qgb2JqZWN0c1xuICAgICAgQSBjbGFzcyBtZXRob2Qgb2JqZWN0LCBsaWtlIGEgc3RhdGljIG1ldGhvZCBvYmplY3QsIGlzIGEgd3JhcHBlclxuICAgICAgYXJvdW5kIGFub3RoZXIgb2JqZWN0IHRoYXQgYWx0ZXJzIHRoZSB3YXkgaW4gd2hpY2ggdGhhdCBvYmplY3RcbiAgICAgIGlzIHJldHJpZXZlZCBmcm9tIGNsYXNzZXMgYW5kIGNsYXNzIGluc3RhbmNlcy4gVGhlIGJlaGF2aW91ciBvZlxuICAgICAgY2xhc3MgbWV0aG9kIG9iamVjdHMgdXBvbiBzdWNoIHJldHJpZXZhbCBpcyBkZXNjcmliZWQgYWJvdmUsXG4gICAgICB1bmRlciAiVXNlci1kZWZpbmVkIG1ldGhvZHMiLiBDbGFzcyBtZXRob2Qgb2JqZWN0cyBhcmUgY3JlYXRlZFxuICAgICAgYnkgdGhlIGJ1aWx0LWluIGBgY2xhc3NtZXRob2QoKWBgIGNvbnN0cnVjdG9yLlxuJywKLSAndHlwZXNmdW5jdGlvbnMnOiB1J1xuRnVuY3Rpb25zXG4qKioqKioqKipcblxuRnVuY3Rpb24gb2JqZWN0cyBhcmUgY3JlYXRlZCBieSBmdW5jdGlvbiBkZWZpbml0aW9ucy4gIFRoZSBvbmx5XG5vcGVyYXRpb24gb24gYSBmdW5jdGlvbiBvYmplY3QgaXMgdG8gY2FsbCBpdDogYGBmdW5jKGFyZ3VtZW50LWxpc3QpYGAuXG5cblRoZXJlIGFyZSByZWFsbHkgdHdvIGZsYXZvcnMgb2YgZnVuY3Rpb24gb2JqZWN0czogYnVpbHQtaW4gZnVuY3Rpb25zXG5hbmQgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucy4gIEJvdGggc3VwcG9ydCB0aGUgc2FtZSBvcGVyYXRpb24gKHRvIGNhbGxcbnRoZSBmdW5jdGlvbiksIGJ1dCB0aGUgaW1wbGVtZW50YXRpb24gaXMgZGlmZmVyZW50LCBoZW5jZSB0aGVcbmRpZmZlcmVudCBvYmplY3QgdHlwZXMuXG5cblNlZSAqRnVuY3Rpb24gZGVmaW5pdGlvbnMqIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuJywKLSAndHlwZXNtYXBwaW5nJzogdSdcbk1hcHBpbmcgVHlwZXMgLS0tIGBgZGljdGBgXG4qKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5BICptYXBwaW5nKiBvYmplY3QgbWFwcyAqaGFzaGFibGUqIHZhbHVlcyB0byBhcmJpdHJhcnkgb2JqZWN0cy5cbk1hcHBpbmdzIGFyZSBtdXRhYmxlIG9iamVjdHMuICBUaGVyZSBpcyBjdXJyZW50bHkgb25seSBvbmUgc3RhbmRhcmRcbm1hcHBpbmcgdHlwZSwgdGhlICpkaWN0aW9uYXJ5Ki4gIChGb3Igb3RoZXIgY29udGFpbmVycyBzZWUgdGhlIGJ1aWx0XG5pbiBgYGxpc3RgYCwgYGBzZXRgYCwgYW5kIGBgdHVwbGVgYCBjbGFzc2VzLCBhbmQgdGhlIGBgY29sbGVjdGlvbnNgYFxubW9kdWxlLilcblxuQSBkaWN0aW9uYXJ5XCdzIGtleXMgYXJlICphbG1vc3QqIGFyYml0cmFyeSB2YWx1ZXMuICBWYWx1ZXMgdGhhdCBhcmVcbm5vdCAqaGFzaGFibGUqLCB0aGF0IGlzLCB2YWx1ZXMgY29udGFpbmluZyBsaXN0cywgZGljdGlvbmFyaWVzIG9yXG5vdGhlciBtdXRhYmxlIHR5cGVzICh0aGF0IGFyZSBjb21wYXJlZCBieSB2YWx1ZSByYXRoZXIgdGhhbiBieSBvYmplY3RcbmlkZW50aXR5KSBtYXkgbm90IGJlIHVzZWQgYXMga2V5cy4gIE51bWVyaWMgdHlwZXMgdXNlZCBmb3Iga2V5cyBvYmV5XG50aGUgbm9ybWFsIHJ1bGVzIGZvciBudW1lcmljIGNvbXBhcmlzb246IGlmIHR3byBudW1iZXJzIGNvbXBhcmUgZXF1YWxcbihzdWNoIGFzIGBgMWBgIGFuZCBgYDEuMGBgKSB0aGVuIHRoZXkgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHRvXG5pbmRleCB0aGUgc2FtZSBkaWN0aW9uYXJ5IGVudHJ5LiAgKE5vdGUgaG93ZXZlciwgdGhhdCBzaW5jZSBjb21wdXRlcnNcbnN0b3JlIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgYXMgYXBwcm94aW1hdGlvbnMgaXQgaXMgdXN1YWxseSB1bndpc2UgdG9cbnVzZSB0aGVtIGFzIGRpY3Rpb25hcnkga2V5cy4pXG5cbkRpY3Rpb25hcmllcyBjYW4gYmUgY3JlYXRlZCBieSBwbGFjaW5nIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2ZcbmBga2V5OiB2YWx1ZWBgIHBhaXJzIHdpdGhpbiBicmFjZXMsIGZvciBleGFtcGxlOiBgYHtcJ2phY2tcJzogNDA5OCxcblwnc2pvZXJkXCc6IDQxMjd9YGAgb3IgYGB7NDA5ODogXCdqYWNrXCcsIDQxMjc6IFwnc2pvZXJkXCd9YGAsIG9yIGJ5IHRoZVxuYGBkaWN0YGAgY29uc3RydWN0b3IuXG5cbmNsYXNzIGNsYXNzIGRpY3QoW2FyZ10pXG5cbiAgIFJldHVybiBhIG5ldyBkaWN0aW9uYXJ5IGluaXRpYWxpemVkIGZyb20gYW4gb3B0aW9uYWwgcG9zaXRpb25hbFxuICAgYXJndW1lbnQgb3IgZnJvbSBhIHNldCBvZiBrZXl3b3JkIGFyZ3VtZW50cy4gSWYgbm8gYXJndW1lbnRzIGFyZVxuICAgZ2l2ZW4sIHJldHVybiBhIG5ldyBlbXB0eSBkaWN0aW9uYXJ5LiBJZiB0aGUgcG9zaXRpb25hbCBhcmd1bWVudFxuICAgKmFyZyogaXMgYSBtYXBwaW5nIG9iamVjdCwgcmV0dXJuIGEgZGljdGlvbmFyeSBtYXBwaW5nIHRoZSBzYW1lXG4gICBrZXlzIHRvIHRoZSBzYW1lIHZhbHVlcyBhcyBkb2VzIHRoZSBtYXBwaW5nIG9iamVjdC4gT3RoZXJ3aXNlIHRoZVxuICAgcG9zaXRpb25hbCBhcmd1bWVudCBtdXN0IGJlIGEgc2VxdWVuY2UsIGEgY29udGFpbmVyIHRoYXQgc3VwcG9ydHNcbiAgIGl0ZXJhdGlvbiwgb3IgYW4gaXRlcmF0b3Igb2JqZWN0LiAgVGhlIGVsZW1lbnRzIG9mIHRoZSBhcmd1bWVudFxuICAgbXVzdCBlYWNoIGFsc28gYmUgb2Ygb25lIG9mIHRob3NlIGtpbmRzLCBhbmQgZWFjaCBtdXN0IGluIHR1cm5cbiAgIGNvbnRhaW4gZXhhY3RseSB0d28gb2JqZWN0cy4gVGhlIGZpcnN0IGlzIHVzZWQgYXMgYSBrZXkgaW4gdGhlIG5ld1xuICAgZGljdGlvbmFyeSwgYW5kIHRoZSBzZWNvbmQgYXMgdGhlIGtleVwncyB2YWx1ZS4gIElmIGEgZ2l2ZW4ga2V5IGlzXG4gICBzZWVuIG1vcmUgdGhhbiBvbmNlLCB0aGUgbGFzdCB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggaXQgaXMgcmV0YWluZWRcbiAgIGluIHRoZSBuZXcgZGljdGlvbmFyeS5cblxuICAgSWYga2V5d29yZCBhcmd1bWVudHMgYXJlIGdpdmVuLCB0aGUga2V5d29yZHMgdGhlbXNlbHZlcyB3aXRoIHRoZWlyXG4gICBhc3NvY2lhdGVkIHZhbHVlcyBhcmUgYWRkZWQgYXMgaXRlbXMgdG8gdGhlIGRpY3Rpb25hcnkuIElmIGEga2V5IGlzXG4gICBzcGVjaWZpZWQgYm90aCBpbiB0aGUgcG9zaXRpb25hbCBhcmd1bWVudCBhbmQgYXMgYSBrZXl3b3JkXG4gICBhcmd1bWVudCwgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5d29yZCBpcyByZXRhaW5lZCBpbiB0aGVcbiAgIGRpY3Rpb25hcnkuIEZvciBleGFtcGxlLCB0aGVzZSBhbGwgcmV0dXJuIGEgZGljdGlvbmFyeSBlcXVhbCB0b1xuICAgYGB7Im9uZSI6IDEsICJ0d28iOiAyfWBgOlxuXG4gICAqIGBgZGljdChvbmU9MSwgdHdvPTIpYGBcblxuICAgKiBgYGRpY3Qoe1wnb25lXCc6IDEsIFwndHdvXCc6IDJ9KWBgXG5cbiAgICogYGBkaWN0KHppcCgoXCdvbmVcJywgXCd0d29cJyksICgxLCAyKSkpYGBcblxuICAgKiBgYGRpY3QoW1tcJ3R3b1wnLCAyXSwgW1wnb25lXCcsIDFdXSlgYFxuXG4gICBUaGUgZmlyc3QgZXhhbXBsZSBvbmx5IHdvcmtzIGZvciBrZXlzIHRoYXQgYXJlIHZhbGlkIFB5dGhvblxuICAgaWRlbnRpZmllcnM7IHRoZSBvdGhlcnMgd29yayB3aXRoIGFueSB2YWxpZCBrZXlzLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjIuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjM6IFN1cHBvcnQgZm9yIGJ1aWxkaW5nIGEgZGljdGlvbmFyeSBmcm9tXG4gICBrZXl3b3JkIGFyZ3VtZW50cyBhZGRlZC5cblxuICAgVGhlc2UgYXJlIHRoZSBvcGVyYXRpb25zIHRoYXQgZGljdGlvbmFyaWVzIHN1cHBvcnQgKGFuZCB0aGVyZWZvcmUsXG4gICBjdXN0b20gbWFwcGluZyB0eXBlcyBzaG91bGQgc3VwcG9ydCB0b28pOlxuXG4gICBsZW4oZClcblxuICAgICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGRpY3Rpb25hcnkgKmQqLlxuXG4gICBkW2tleV1cblxuICAgICAgUmV0dXJuIHRoZSBpdGVtIG9mICpkKiB3aXRoIGtleSAqa2V5Ki4gIFJhaXNlcyBhIGBgS2V5RXJyb3JgYCBpZlxuICAgICAgKmtleSogaXMgbm90IGluIHRoZSBtYXAuXG5cbiAgICAgIE5ldyBpbiB2ZXJzaW9uIDIuNTogSWYgYSBzdWJjbGFzcyBvZiBkaWN0IGRlZmluZXMgYSBtZXRob2RcbiAgICAgIGBgX19taXNzaW5nX18oKWBgLCBpZiB0aGUga2V5ICprZXkqIGlzIG5vdCBwcmVzZW50LCB0aGVcbiAgICAgIGBgZFtrZXldYGAgb3BlcmF0aW9uIGNhbGxzIHRoYXQgbWV0aG9kIHdpdGggdGhlIGtleSAqa2V5KiBhc1xuICAgICAgYXJndW1lbnQuICBUaGUgYGBkW2tleV1gYCBvcGVyYXRpb24gdGhlbiByZXR1cm5zIG9yIHJhaXNlc1xuICAgICAgd2hhdGV2ZXIgaXMgcmV0dXJuZWQgb3IgcmFpc2VkIGJ5IHRoZSBgYF9fbWlzc2luZ19fKGtleSlgYCBjYWxsXG4gICAgICBpZiB0aGUga2V5IGlzIG5vdCBwcmVzZW50LiBObyBvdGhlciBvcGVyYXRpb25zIG9yIG1ldGhvZHMgaW52b2tlXG4gICAgICBgYF9fbWlzc2luZ19fKClgYC4gSWYgYGBfX21pc3NpbmdfXygpYGAgaXMgbm90IGRlZmluZWQsXG4gICAgICBgYEtleUVycm9yYGAgaXMgcmFpc2VkLiAgYGBfX21pc3NpbmdfXygpYGAgbXVzdCBiZSBhIG1ldGhvZDsgaXRcbiAgICAgIGNhbm5vdCBiZSBhbiBpbnN0YW5jZSB2YXJpYWJsZS4gRm9yIGFuIGV4YW1wbGUsIHNlZVxuICAgICAgYGBjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdGBgLlxuXG4gICBkW2tleV0gPSB2YWx1ZVxuXG4gICAgICBTZXQgYGBkW2tleV1gYCB0byAqdmFsdWUqLlxuXG4gICBkZWwgZFtrZXldXG5cbiAgICAgIFJlbW92ZSBgYGRba2V5XWBgIGZyb20gKmQqLiAgUmFpc2VzIGEgYGBLZXlFcnJvcmBgIGlmICprZXkqIGlzXG4gICAgICBub3QgaW4gdGhlIG1hcC5cblxuICAga2V5IGluIGRcblxuICAgICAgUmV0dXJuIGBgVHJ1ZWBgIGlmICpkKiBoYXMgYSBrZXkgKmtleSosIGVsc2UgYGBGYWxzZWBgLlxuXG4gICAgICBOZXcgaW4gdmVyc2lvbiAyLjIuXG5cbiAgIGtleSBub3QgaW4gZFxuXG4gICAgICBFcXVpdmFsZW50IHRvIGBgbm90IGtleSBpbiBkYGAuXG5cbiAgICAgIE5ldyBpbiB2ZXJzaW9uIDIuMi5cblxuICAgaXRlcihkKVxuXG4gICAgICBSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUga2V5cyBvZiB0aGUgZGljdGlvbmFyeS4gIFRoaXMgaXMgYVxuICAgICAgc2hvcnRjdXQgZm9yIGBgaXRlcmtleXMoKWBgLlxuXG4gICBjbGVhcigpXG5cbiAgICAgIFJlbW92ZSBhbGwgaXRlbXMgZnJvbSB0aGUgZGljdGlvbmFyeS5cblxuICAgY29weSgpXG5cbiAgICAgIFJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGUgZGljdGlvbmFyeS5cblxuICAgZnJvbWtleXMoc2VxWywgdmFsdWVdKVxuXG4gICAgICBDcmVhdGUgYSBuZXcgZGljdGlvbmFyeSB3aXRoIGtleXMgZnJvbSAqc2VxKiBhbmQgdmFsdWVzIHNldCB0b1xuICAgICAgKnZhbHVlKi5cblxuICAgICAgYGBmcm9ta2V5cygpYGAgaXMgYSBjbGFzcyBtZXRob2QgdGhhdCByZXR1cm5zIGEgbmV3IGRpY3Rpb25hcnkuXG4gICAgICAqdmFsdWUqIGRlZmF1bHRzIHRvIGBgTm9uZWBgLlxuXG4gICAgICBOZXcgaW4gdmVyc2lvbiAyLjMuXG5cbiAgIGdldChrZXlbLCBkZWZhdWx0XSlcblxuICAgICAgUmV0dXJuIHRoZSB2YWx1ZSBmb3IgKmtleSogaWYgKmtleSogaXMgaW4gdGhlIGRpY3Rpb25hcnksIGVsc2VcbiAgICAgICpkZWZhdWx0Ki4gSWYgKmRlZmF1bHQqIGlzIG5vdCBnaXZlbiwgaXQgZGVmYXVsdHMgdG8gYGBOb25lYGAsXG4gICAgICBzbyB0aGF0IHRoaXMgbWV0aG9kIG5ldmVyIHJhaXNlcyBhIGBgS2V5RXJyb3JgYC5cblxuICAgaGFzX2tleShrZXkpXG5cbiAgICAgIFRlc3QgZm9yIHRoZSBwcmVzZW5jZSBvZiAqa2V5KiBpbiB0aGUgZGljdGlvbmFyeS4gIGBgaGFzX2tleSgpYGBcbiAgICAgIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgYGBrZXkgaW4gZGBgLlxuXG4gICBpdGVtcygpXG5cbiAgICAgIFJldHVybiBhIGNvcHkgb2YgdGhlIGRpY3Rpb25hcnlcJ3MgbGlzdCBvZiBgYChrZXksIHZhbHVlKWBgXG4gICAgICBwYWlycy5cblxuICAgICAgKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBLZXlzIGFuZCB2YWx1ZXMgYXJlIGxpc3RlZCBpblxuICAgICAgYW4gYXJiaXRyYXJ5IG9yZGVyIHdoaWNoIGlzIG5vbi1yYW5kb20sIHZhcmllcyBhY3Jvc3MgUHl0aG9uXG4gICAgICBpbXBsZW1lbnRhdGlvbnMsIGFuZCBkZXBlbmRzIG9uIHRoZSBkaWN0aW9uYXJ5XCdzIGhpc3Rvcnkgb2ZcbiAgICAgIGluc2VydGlvbnMgYW5kIGRlbGV0aW9ucy5cblxuICAgICAgSWYgYGBpdGVtcygpYGAsIGBga2V5cygpYGAsIGBgdmFsdWVzKClgYCwgYGBpdGVyaXRlbXMoKWBgLFxuICAgICAgYGBpdGVya2V5cygpYGAsIGFuZCBgYGl0ZXJ2YWx1ZXMoKWBgIGFyZSBjYWxsZWQgd2l0aCBub1xuICAgICAgaW50ZXJ2ZW5pbmcgbW9kaWZpY2F0aW9ucyB0byB0aGUgZGljdGlvbmFyeSwgdGhlIGxpc3RzIHdpbGxcbiAgICAgIGRpcmVjdGx5IGNvcnJlc3BvbmQuICBUaGlzIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgYGAodmFsdWUsXG4gICAgICBrZXkpYGAgcGFpcnMgdXNpbmcgYGB6aXAoKWBgOiBgYHBhaXJzID0gemlwKGQudmFsdWVzKCksXG4gICAgICBkLmtleXMoKSlgYC4gIFRoZSBzYW1lIHJlbGF0aW9uc2hpcCBob2xkcyBmb3IgdGhlIGBgaXRlcmtleXMoKWBgXG4gICAgICBhbmQgYGBpdGVydmFsdWVzKClgYCBtZXRob2RzOiBgYHBhaXJzID0gemlwKGQuaXRlcnZhbHVlcygpLFxuICAgICAgZC5pdGVya2V5cygpKWBgIHByb3ZpZGVzIHRoZSBzYW1lIHZhbHVlIGZvciBgYHBhaXJzYGAuIEFub3RoZXJcbiAgICAgIHdheSB0byBjcmVhdGUgdGhlIHNhbWUgbGlzdCBpcyBgYHBhaXJzID0gWyh2LCBrKSBmb3IgKGssIHYpIGluXG4gICAgICBkLml0ZXJpdGVtcygpXWBgLlxuXG4gICBpdGVyaXRlbXMoKVxuXG4gICAgICBSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgZGljdGlvbmFyeVwncyBgYChrZXksIHZhbHVlKWBgIHBhaXJzLlxuICAgICAgU2VlIHRoZSBub3RlIGZvciBgYGRpY3QuaXRlbXMoKWBgLlxuXG4gICAgICBVc2luZyBgYGl0ZXJpdGVtcygpYGAgd2hpbGUgYWRkaW5nIG9yIGRlbGV0aW5nIGVudHJpZXMgaW4gdGhlXG4gICAgICBkaWN0aW9uYXJ5IG1heSByYWlzZSBhIGBgUnVudGltZUVycm9yYGAgb3IgZmFpbCB0byBpdGVyYXRlIG92ZXJcbiAgICAgIGFsbCBlbnRyaWVzLlxuXG4gICAgICBOZXcgaW4gdmVyc2lvbiAyLjIuXG5cbiAgIGl0ZXJrZXlzKClcblxuICAgICAgUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGRpY3Rpb25hcnlcJ3Mga2V5cy4gIFNlZSB0aGUgbm90ZSBmb3JcbiAgICAgIGBgZGljdC5pdGVtcygpYGAuXG5cbiAgICAgIFVzaW5nIGBgaXRlcmtleXMoKWBgIHdoaWxlIGFkZGluZyBvciBkZWxldGluZyBlbnRyaWVzIGluIHRoZVxuICAgICAgZGljdGlvbmFyeSBtYXkgcmFpc2UgYSBgYFJ1bnRpbWVFcnJvcmBgIG9yIGZhaWwgdG8gaXRlcmF0ZSBvdmVyXG4gICAgICBhbGwgZW50cmllcy5cblxuICAgICAgTmV3IGluIHZlcnNpb24gMi4yLlxuXG4gICBpdGVydmFsdWVzKClcblxuICAgICAgUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGRpY3Rpb25hcnlcJ3MgdmFsdWVzLiAgU2VlIHRoZSBub3RlXG4gICAgICBmb3IgYGBkaWN0Lml0ZW1zKClgYC5cblxuICAgICAgVXNpbmcgYGBpdGVydmFsdWVzKClgYCB3aGlsZSBhZGRpbmcgb3IgZGVsZXRpbmcgZW50cmllcyBpbiB0aGVcbiAgICAgIGRpY3Rpb25hcnkgbWF5IHJhaXNlIGEgYGBSdW50aW1lRXJyb3JgYCBvciBmYWlsIHRvIGl0ZXJhdGUgb3ZlclxuICAgICAgYWxsIGVudHJpZXMuXG5cbiAgICAgIE5ldyBpbiB2ZXJzaW9uIDIuMi5cblxuICAga2V5cygpXG5cbiAgICAgIFJldHVybiBhIGNvcHkgb2YgdGhlIGRpY3Rpb25hcnlcJ3MgbGlzdCBvZiBrZXlzLiAgU2VlIHRoZSBub3RlXG4gICAgICBmb3IgYGBkaWN0Lml0ZW1zKClgYC5cblxuICAgcG9wKGtleVssIGRlZmF1bHRdKVxuXG4gICAgICBJZiAqa2V5KiBpcyBpbiB0aGUgZGljdGlvbmFyeSwgcmVtb3ZlIGl0IGFuZCByZXR1cm4gaXRzIHZhbHVlLFxuICAgICAgZWxzZSByZXR1cm4gKmRlZmF1bHQqLiAgSWYgKmRlZmF1bHQqIGlzIG5vdCBnaXZlbiBhbmQgKmtleSogaXNcbiAgICAgIG5vdCBpbiB0aGUgZGljdGlvbmFyeSwgYSBgYEtleUVycm9yYGAgaXMgcmFpc2VkLlxuXG4gICAgICBOZXcgaW4gdmVyc2lvbiAyLjMuXG5cbiAgIHBvcGl0ZW0oKVxuXG4gICAgICBSZW1vdmUgYW5kIHJldHVybiBhbiBhcmJpdHJhcnkgYGAoa2V5LCB2YWx1ZSlgYCBwYWlyIGZyb20gdGhlXG4gICAgICBkaWN0aW9uYXJ5LlxuXG4gICAgICBgYHBvcGl0ZW0oKWBgIGlzIHVzZWZ1bCB0byBkZXN0cnVjdGl2ZWx5IGl0ZXJhdGUgb3ZlciBhXG4gICAgICBkaWN0aW9uYXJ5LCBhcyBvZnRlbiB1c2VkIGluIHNldCBhbGdvcml0aG1zLiAgSWYgdGhlIGRpY3Rpb25hcnlcbiAgICAgIGlzIGVtcHR5LCBjYWxsaW5nIGBgcG9waXRlbSgpYGAgcmFpc2VzIGEgYGBLZXlFcnJvcmBgLlxuXG4gICBzZXRkZWZhdWx0KGtleVssIGRlZmF1bHRdKVxuXG4gICAgICBJZiAqa2V5KiBpcyBpbiB0aGUgZGljdGlvbmFyeSwgcmV0dXJuIGl0cyB2YWx1ZS4gIElmIG5vdCwgaW5zZXJ0XG4gICAgICAqa2V5KiB3aXRoIGEgdmFsdWUgb2YgKmRlZmF1bHQqIGFuZCByZXR1cm4gKmRlZmF1bHQqLiAgKmRlZmF1bHQqXG4gICAgICBkZWZhdWx0cyB0byBgYE5vbmVgYC5cblxuICAgdXBkYXRlKFtvdGhlcl0pXG5cbiAgICAgIFVwZGF0ZSB0aGUgZGljdGlvbmFyeSB3aXRoIHRoZSBrZXkvdmFsdWUgcGFpcnMgZnJvbSAqb3RoZXIqLFxuICAgICAgb3ZlcndyaXRpbmcgZXhpc3Rpbmcga2V5cy4gIFJldHVybiBgYE5vbmVgYC5cblxuICAgICAgYGB1cGRhdGUoKWBgIGFjY2VwdHMgZWl0aGVyIGFub3RoZXIgZGljdGlvbmFyeSBvYmplY3Qgb3IgYW5cbiAgICAgIGl0ZXJhYmxlIG9mIGtleS92YWx1ZSBwYWlycyAoYXMgdHVwbGVzIG9yIG90aGVyIGl0ZXJhYmxlcyBvZlxuICAgICAgbGVuZ3RoIHR3bykuICBJZiBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkLCB0aGUgZGljdGlvbmFyeVxuICAgICAgaXMgdGhlbiB1cGRhdGVkIHdpdGggdGhvc2Uga2V5L3ZhbHVlIHBhaXJzOiBgYGQudXBkYXRlKHJlZD0xLFxuICAgICAgYmx1ZT0yKWBgLlxuXG4gICAgICBDaGFuZ2VkIGluIHZlcnNpb24gMi40OiBBbGxvd2VkIHRoZSBhcmd1bWVudCB0byBiZSBhbiBpdGVyYWJsZVxuICAgICAgb2Yga2V5L3ZhbHVlIHBhaXJzIGFuZCBhbGxvd2VkIGtleXdvcmQgYXJndW1lbnRzLlxuXG4gICB2YWx1ZXMoKVxuXG4gICAgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBkaWN0aW9uYXJ5XCdzIGxpc3Qgb2YgdmFsdWVzLiAgU2VlIHRoZSBub3RlXG4gICAgICBmb3IgYGBkaWN0Lml0ZW1zKClgYC5cblxuICAgdmlld2l0ZW1zKClcblxuICAgICAgUmV0dXJuIGEgbmV3IHZpZXcgb2YgdGhlIGRpY3Rpb25hcnlcJ3MgaXRlbXMgKGBgKGtleSwgdmFsdWUpYGBcbiAgICAgIHBhaXJzKS4gIFNlZSBiZWxvdyBmb3IgZG9jdW1lbnRhdGlvbiBvZiB2aWV3IG9iamVjdHMuXG5cbiAgICAgIE5ldyBpbiB2ZXJzaW9uIDIuNy5cblxuICAgdmlld2tleXMoKVxuXG4gICAgICBSZXR1cm4gYSBuZXcgdmlldyBvZiB0aGUgZGljdGlvbmFyeVwncyBrZXlzLiAgU2VlIGJlbG93IGZvclxuICAgICAgZG9jdW1lbnRhdGlvbiBvZiB2aWV3IG9iamVjdHMuXG5cbiAgICAgIE5ldyBpbiB2ZXJzaW9uIDIuNy5cblxuICAgdmlld3ZhbHVlcygpXG5cbiAgICAgIFJldHVybiBhIG5ldyB2aWV3IG9mIHRoZSBkaWN0aW9uYXJ5XCdzIHZhbHVlcy4gIFNlZSBiZWxvdyBmb3JcbiAgICAgIGRvY3VtZW50YXRpb24gb2YgdmlldyBvYmplY3RzLlxuXG4gICAgICBOZXcgaW4gdmVyc2lvbiAyLjcuXG5cblxuRGljdGlvbmFyeSB2aWV3IG9iamVjdHNcbj09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBvYmplY3RzIHJldHVybmVkIGJ5IGBgZGljdC52aWV3a2V5cygpYGAsIGBgZGljdC52aWV3dmFsdWVzKClgYCBhbmRcbmBgZGljdC52aWV3aXRlbXMoKWBgIGFyZSAqdmlldyBvYmplY3RzKi4gIFRoZXkgcHJvdmlkZSBhIGR5bmFtaWMgdmlld1xub24gdGhlIGRpY3Rpb25hcnlcJ3MgZW50cmllcywgd2hpY2ggbWVhbnMgdGhhdCB3aGVuIHRoZSBkaWN0aW9uYXJ5XG5jaGFuZ2VzLCB0aGUgdmlldyByZWZsZWN0cyB0aGVzZSBjaGFuZ2VzLlxuXG5EaWN0aW9uYXJ5IHZpZXdzIGNhbiBiZSBpdGVyYXRlZCBvdmVyIHRvIHlpZWxkIHRoZWlyIHJlc3BlY3RpdmUgZGF0YSxcbmFuZCBzdXBwb3J0IG1lbWJlcnNoaXAgdGVzdHM6XG5cbmxlbihkaWN0dmlldylcblxuICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgZGljdGlvbmFyeS5cblxuaXRlcihkaWN0dmlldylcblxuICAgUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMsIHZhbHVlcyBvciBpdGVtcyAocmVwcmVzZW50ZWQgYXNcbiAgIHR1cGxlcyBvZiBgYChrZXksIHZhbHVlKWBgKSBpbiB0aGUgZGljdGlvbmFyeS5cblxuICAgS2V5cyBhbmQgdmFsdWVzIGFyZSBpdGVyYXRlZCBvdmVyIGluIGFuIGFyYml0cmFyeSBvcmRlciB3aGljaCBpc1xuICAgbm9uLXJhbmRvbSwgdmFyaWVzIGFjcm9zcyBQeXRob24gaW1wbGVtZW50YXRpb25zLCBhbmQgZGVwZW5kcyBvblxuICAgdGhlIGRpY3Rpb25hcnlcJ3MgaGlzdG9yeSBvZiBpbnNlcnRpb25zIGFuZCBkZWxldGlvbnMuIElmIGtleXMsXG4gICB2YWx1ZXMgYW5kIGl0ZW1zIHZpZXdzIGFyZSBpdGVyYXRlZCBvdmVyIHdpdGggbm8gaW50ZXJ2ZW5pbmdcbiAgIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGRpY3Rpb25hcnksIHRoZSBvcmRlciBvZiBpdGVtcyB3aWxsIGRpcmVjdGx5XG4gICBjb3JyZXNwb25kLiAgVGhpcyBhbGxvd3MgdGhlIGNyZWF0aW9uIG9mIGBgKHZhbHVlLCBrZXkpYGAgcGFpcnNcbiAgIHVzaW5nIGBgemlwKClgYDogYGBwYWlycyA9IHppcChkLnZhbHVlcygpLCBkLmtleXMoKSlgYC4gIEFub3RoZXJcbiAgIHdheSB0byBjcmVhdGUgdGhlIHNhbWUgbGlzdCBpcyBgYHBhaXJzID0gWyh2LCBrKSBmb3IgKGssIHYpIGluXG4gICBkLml0ZW1zKCldYGAuXG5cbiAgIEl0ZXJhdGluZyB2aWV3cyB3aGlsZSBhZGRpbmcgb3IgZGVsZXRpbmcgZW50cmllcyBpbiB0aGUgZGljdGlvbmFyeVxuICAgbWF5IHJhaXNlIGEgYGBSdW50aW1lRXJyb3JgYCBvciBmYWlsIHRvIGl0ZXJhdGUgb3ZlciBhbGwgZW50cmllcy5cblxueCBpbiBkaWN0dmlld1xuXG4gICBSZXR1cm4gYGBUcnVlYGAgaWYgKngqIGlzIGluIHRoZSB1bmRlcmx5aW5nIGRpY3Rpb25hcnlcJ3Mga2V5cyxcbiAgIHZhbHVlcyBvciBpdGVtcyAoaW4gdGhlIGxhdHRlciBjYXNlLCAqeCogc2hvdWxkIGJlIGEgYGAoa2V5LFxuICAgdmFsdWUpYGAgdHVwbGUpLlxuXG5LZXlzIHZpZXdzIGFyZSBzZXQtbGlrZSBzaW5jZSB0aGVpciBlbnRyaWVzIGFyZSB1bmlxdWUgYW5kIGhhc2hhYmxlLlxuSWYgYWxsIHZhbHVlcyBhcmUgaGFzaGFibGUsIHNvIHRoYXQgKGtleSwgdmFsdWUpIHBhaXJzIGFyZSB1bmlxdWUgYW5kXG5oYXNoYWJsZSwgdGhlbiB0aGUgaXRlbXMgdmlldyBpcyBhbHNvIHNldC1saWtlLiAgKFZhbHVlcyB2aWV3cyBhcmUgbm90XG50cmVhdGVkIGFzIHNldC1saWtlIHNpbmNlIHRoZSBlbnRyaWVzIGFyZSBnZW5lcmFsbHkgbm90IHVuaXF1ZS4pICBUaGVuXG50aGVzZSBzZXQgb3BlcmF0aW9ucyBhcmUgYXZhaWxhYmxlICgib3RoZXIiIHJlZmVycyBlaXRoZXIgdG8gYW5vdGhlclxudmlldyBvciBhIHNldCk6XG5cbmRpY3R2aWV3ICYgb3RoZXJcblxuICAgUmV0dXJuIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIGRpY3R2aWV3IGFuZCB0aGUgb3RoZXIgb2JqZWN0IGFzIGFcbiAgIG5ldyBzZXQuXG5cbmRpY3R2aWV3IHwgb3RoZXJcblxuICAgUmV0dXJuIHRoZSB1bmlvbiBvZiB0aGUgZGljdHZpZXcgYW5kIHRoZSBvdGhlciBvYmplY3QgYXMgYSBuZXcgc2V0LlxuXG5kaWN0dmlldyAtIG90aGVyXG5cbiAgIFJldHVybiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBkaWN0dmlldyBhbmQgdGhlIG90aGVyIG9iamVjdFxuICAgKGFsbCBlbGVtZW50cyBpbiAqZGljdHZpZXcqIHRoYXQgYXJlblwndCBpbiAqb3RoZXIqKSBhcyBhIG5ldyBzZXQuXG5cbmRpY3R2aWV3IF4gb3RoZXJcblxuICAgUmV0dXJuIHRoZSBzeW1tZXRyaWMgZGlmZmVyZW5jZSAoYWxsIGVsZW1lbnRzIGVpdGhlciBpbiAqZGljdHZpZXcqXG4gICBvciAqb3RoZXIqLCBidXQgbm90IGluIGJvdGgpIG9mIHRoZSBkaWN0dmlldyBhbmQgdGhlIG90aGVyIG9iamVjdFxuICAgYXMgYSBuZXcgc2V0LlxuXG5BbiBleGFtcGxlIG9mIGRpY3Rpb25hcnkgdmlldyB1c2FnZTpcblxuICAgPj4+IGRpc2hlcyA9IHtcJ2VnZ3NcJzogMiwgXCdzYXVzYWdlXCc6IDEsIFwnYmFjb25cJzogMSwgXCdzcGFtXCc6IDUwMH1cbiAgID4+PiBrZXlzID0gZGlzaGVzLnZpZXdrZXlzKClcbiAgID4+PiB2YWx1ZXMgPSBkaXNoZXMudmlld3ZhbHVlcygpXG5cbiAgID4+PiAjIGl0ZXJhdGlvblxuICAgPj4+IG4gPSAwXG4gICA+Pj4gZm9yIHZhbCBpbiB2YWx1ZXM6XG4gICAuLi4gICAgIG4gKz0gdmFsXG4gICA+Pj4gcHJpbnQobilcbiAgIDUwNFxuXG4gICA+Pj4gIyBrZXlzIGFuZCB2YWx1ZXMgYXJlIGl0ZXJhdGVkIG92ZXIgaW4gdGhlIHNhbWUgb3JkZXJcbiAgID4+PiBsaXN0KGtleXMpXG4gICBbXCdlZ2dzXCcsIFwnYmFjb25cJywgXCdzYXVzYWdlXCcsIFwnc3BhbVwnXVxuICAgPj4+IGxpc3QodmFsdWVzKVxuICAgWzIsIDEsIDEsIDUwMF1cblxuICAgPj4+ICMgdmlldyBvYmplY3RzIGFyZSBkeW5hbWljIGFuZCByZWZsZWN0IGRpY3QgY2hhbmdlc1xuICAgPj4+IGRlbCBkaXNoZXNbXCdlZ2dzXCddXG4gICA+Pj4gZGVsIGRpc2hlc1tcJ3NhdXNhZ2VcJ11cbiAgID4+PiBsaXN0KGtleXMpXG4gICBbXCdzcGFtXCcsIFwnYmFjb25cJ11cblxuICAgPj4+ICMgc2V0IG9wZXJhdGlvbnNcbiAgID4+PiBrZXlzICYge1wnZWdnc1wnLCBcJ2JhY29uXCcsIFwnc2FsYWRcJ31cbiAgIHtcJ2JhY29uXCd9XG4nLAotICd0eXBlc21ldGhvZHMnOiB1IlxuTWV0aG9kc1xuKioqKioqKlxuXG5NZXRob2RzIGFyZSBmdW5jdGlvbnMgdGhhdCBhcmUgY2FsbGVkIHVzaW5nIHRoZSBhdHRyaWJ1dGUgbm90YXRpb24uXG5UaGVyZSBhcmUgdHdvIGZsYXZvcnM6IGJ1aWx0LWluIG1ldGhvZHMgKHN1Y2ggYXMgYGBhcHBlbmQoKWBgIG9uXG5saXN0cykgYW5kIGNsYXNzIGluc3RhbmNlIG1ldGhvZHMuICBCdWlsdC1pbiBtZXRob2RzIGFyZSBkZXNjcmliZWRcbndpdGggdGhlIHR5cGVzIHRoYXQgc3VwcG9ydCB0aGVtLlxuXG5UaGUgaW1wbGVtZW50YXRpb24gYWRkcyB0d28gc3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlcyB0byBjbGFzc1xuaW5zdGFuY2UgbWV0aG9kczogYGBtLmltX3NlbGZgYCBpcyB0aGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRob2Rcbm9wZXJhdGVzLCBhbmQgYGBtLmltX2Z1bmNgYCBpcyB0aGUgZnVuY3Rpb24gaW1wbGVtZW50aW5nIHRoZSBtZXRob2QuXG5DYWxsaW5nIGBgbShhcmctMSwgYXJnLTIsIC4uLiwgYXJnLW4pYGAgaXMgY29tcGxldGVseSBlcXVpdmFsZW50IHRvXG5jYWxsaW5nIGBgbS5pbV9mdW5jKG0uaW1fc2VsZiwgYXJnLTEsIGFyZy0yLCAuLi4sIGFyZy1uKWBgLlxuXG5DbGFzcyBpbnN0YW5jZSBtZXRob2RzIGFyZSBlaXRoZXIgKmJvdW5kKiBvciAqdW5ib3VuZCosIHJlZmVycmluZyB0b1xud2hldGhlciB0aGUgbWV0aG9kIHdhcyBhY2Nlc3NlZCB0aHJvdWdoIGFuIGluc3RhbmNlIG9yIGEgY2xhc3MsXG5yZXNwZWN0aXZlbHkuICBXaGVuIGEgbWV0aG9kIGlzIHVuYm91bmQsIGl0cyBgYGltX3NlbGZgYCBhdHRyaWJ1dGVcbndpbGwgYmUgYGBOb25lYGAgYW5kIGlmIGNhbGxlZCwgYW4gZXhwbGljaXQgYGBzZWxmYGAgb2JqZWN0IG11c3QgYmVcbnBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQuICBJbiB0aGlzIGNhc2UsIGBgc2VsZmBgIG11c3QgYmUgYW5cbmluc3RhbmNlIG9mIHRoZSB1bmJvdW5kIG1ldGhvZCdzIGNsYXNzIChvciBhIHN1YmNsYXNzIG9mIHRoYXQgY2xhc3MpLFxub3RoZXJ3aXNlIGEgYGBUeXBlRXJyb3JgYCBpcyByYWlzZWQuXG5cbkxpa2UgZnVuY3Rpb24gb2JqZWN0cywgbWV0aG9kcyBvYmplY3RzIHN1cHBvcnQgZ2V0dGluZyBhcmJpdHJhcnlcbmF0dHJpYnV0ZXMuIEhvd2V2ZXIsIHNpbmNlIG1ldGhvZCBhdHRyaWJ1dGVzIGFyZSBhY3R1YWxseSBzdG9yZWQgb25cbnRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uIG9iamVjdCAoYGBtZXRoLmltX2Z1bmNgYCksIHNldHRpbmcgbWV0aG9kXG5hdHRyaWJ1dGVzIG9uIGVpdGhlciBib3VuZCBvciB1bmJvdW5kIG1ldGhvZHMgaXMgZGlzYWxsb3dlZC5cbkF0dGVtcHRpbmcgdG8gc2V0IGEgbWV0aG9kIGF0dHJpYnV0ZSByZXN1bHRzIGluIGEgYGBUeXBlRXJyb3JgYCBiZWluZ1xucmFpc2VkLiAgSW4gb3JkZXIgdG8gc2V0IGEgbWV0aG9kIGF0dHJpYnV0ZSwgeW91IG5lZWQgdG8gZXhwbGljaXRseVxuc2V0IGl0IG9uIHRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uIG9iamVjdDpcblxuICAgY2xhc3MgQzpcbiAgICAgICBkZWYgbWV0aG9kKHNlbGYpOlxuICAgICAgICAgICBwYXNzXG5cbiAgIGMgPSBDKClcbiAgIGMubWV0aG9kLmltX2Z1bmMud2hvYW1pID0gJ215IG5hbWUgaXMgYydcblxuU2VlICpUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuIiwKLSAndHlwZXNtb2R1bGVzJzogdSJcbk1vZHVsZXNcbioqKioqKipcblxuVGhlIG9ubHkgc3BlY2lhbCBvcGVyYXRpb24gb24gYSBtb2R1bGUgaXMgYXR0cmlidXRlIGFjY2VzczpcbmBgbS5uYW1lYGAsIHdoZXJlICptKiBpcyBhIG1vZHVsZSBhbmQgKm5hbWUqIGFjY2Vzc2VzIGEgbmFtZSBkZWZpbmVkXG5pbiAqbSoncyBzeW1ib2wgdGFibGUuIE1vZHVsZSBhdHRyaWJ1dGVzIGNhbiBiZSBhc3NpZ25lZCB0by4gIChOb3RlXG50aGF0IHRoZSBgYGltcG9ydGBgIHN0YXRlbWVudCBpcyBub3QsIHN0cmljdGx5IHNwZWFraW5nLCBhbiBvcGVyYXRpb25cbm9uIGEgbW9kdWxlIG9iamVjdDsgYGBpbXBvcnQgZm9vYGAgZG9lcyBub3QgcmVxdWlyZSBhIG1vZHVsZSBvYmplY3Rcbm5hbWVkICpmb28qIHRvIGV4aXN0LCByYXRoZXIgaXQgcmVxdWlyZXMgYW4gKGV4dGVybmFsKSAqZGVmaW5pdGlvbipcbmZvciBhIG1vZHVsZSBuYW1lZCAqZm9vKiBzb21ld2hlcmUuKVxuXG5BIHNwZWNpYWwgbWVtYmVyIG9mIGV2ZXJ5IG1vZHVsZSBpcyBgYF9fZGljdF9fYGAuIFRoaXMgaXMgdGhlXG5kaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIG1vZHVsZSdzIHN5bWJvbCB0YWJsZS4gTW9kaWZ5aW5nIHRoaXNcbmRpY3Rpb25hcnkgd2lsbCBhY3R1YWxseSBjaGFuZ2UgdGhlIG1vZHVsZSdzIHN5bWJvbCB0YWJsZSwgYnV0IGRpcmVjdFxuYXNzaWdubWVudCB0byB0aGUgYGBfX2RpY3RfX2BgIGF0dHJpYnV0ZSBpcyBub3QgcG9zc2libGUgKHlvdSBjYW5cbndyaXRlIGBgbS5fX2RpY3RfX1snYSddID0gMWBgLCB3aGljaCBkZWZpbmVzIGBgbS5hYGAgdG8gYmUgYGAxYGAsIGJ1dFxueW91IGNhbid0IHdyaXRlIGBgbS5fX2RpY3RfXyA9IHt9YGApLiAgTW9kaWZ5aW5nIGBgX19kaWN0X19gYCBkaXJlY3RseVxuaXMgbm90IHJlY29tbWVuZGVkLlxuXG5Nb2R1bGVzIGJ1aWx0IGludG8gdGhlIGludGVycHJldGVyIGFyZSB3cml0dGVuIGxpa2UgdGhpczogYGA8bW9kdWxlXG4nc3lzJyAoYnVpbHQtaW4pPmBgLiAgSWYgbG9hZGVkIGZyb20gYSBmaWxlLCB0aGV5IGFyZSB3cml0dGVuIGFzXG5gYDxtb2R1bGUgJ29zJyBmcm9tICcvdXNyL2xvY2FsL2xpYi9weXRob25YLlkvb3MucHljJz5gYC5cbiIsCi0gJ3R5cGVzc2VxJzogdSdcblNlcXVlbmNlIFR5cGVzIC0tLSBgYHN0cmBgLCBgYHVuaWNvZGVgYCwgYGBsaXN0YGAsIGBgdHVwbGVgYCwgYGBieXRlYXJyYXlgYCwgYGBidWZmZXJgYCwgYGB4cmFuZ2VgYFxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cblRoZXJlIGFyZSBzZXZlbiBzZXF1ZW5jZSB0eXBlczogc3RyaW5ncywgVW5pY29kZSBzdHJpbmdzLCBsaXN0cyxcbnR1cGxlcywgYnl0ZWFycmF5cywgYnVmZmVycywgYW5kIHhyYW5nZSBvYmplY3RzLlxuXG5Gb3Igb3RoZXIgY29udGFpbmVycyBzZWUgdGhlIGJ1aWx0IGluIGBgZGljdGBgIGFuZCBgYHNldGBgIGNsYXNzZXMsXG5hbmQgdGhlIGBgY29sbGVjdGlvbnNgYCBtb2R1bGUuXG5cblN0cmluZyBsaXRlcmFscyBhcmUgd3JpdHRlbiBpbiBzaW5nbGUgb3IgZG91YmxlIHF1b3RlczogYGBcJ3h5enp5XCdgYCxcbmBgImZyb2JvenoiYGAuICBTZWUgKlN0cmluZyBsaXRlcmFscyogZm9yIG1vcmUgYWJvdXQgc3RyaW5nIGxpdGVyYWxzLlxuVW5pY29kZSBzdHJpbmdzIGFyZSBtdWNoIGxpa2Ugc3RyaW5ncywgYnV0IGFyZSBzcGVjaWZpZWQgaW4gdGhlIHN5bnRheFxudXNpbmcgYSBwcmVjZWRpbmcgYGBcJ3VcJ2BgIGNoYXJhY3RlcjogYGB1XCdhYmNcJ2BgLCBgYHUiZGVmImBgLiBJblxuYWRkaXRpb24gdG8gdGhlIGZ1bmN0aW9uYWxpdHkgZGVzY3JpYmVkIGhlcmUsIHRoZXJlIGFyZSBhbHNvIHN0cmluZy1cbnNwZWNpZmljIG1ldGhvZHMgZGVzY3JpYmVkIGluIHRoZSAqU3RyaW5nIE1ldGhvZHMqIHNlY3Rpb24uIExpc3RzIGFyZVxuY29uc3RydWN0ZWQgd2l0aCBzcXVhcmUgYnJhY2tldHMsIHNlcGFyYXRpbmcgaXRlbXMgd2l0aCBjb21tYXM6IGBgW2EsXG5iLCBjXWBgLiBUdXBsZXMgYXJlIGNvbnN0cnVjdGVkIGJ5IHRoZSBjb21tYSBvcGVyYXRvciAobm90IHdpdGhpblxuc3F1YXJlIGJyYWNrZXRzKSwgd2l0aCBvciB3aXRob3V0IGVuY2xvc2luZyBwYXJlbnRoZXNlcywgYnV0IGFuIGVtcHR5XG50dXBsZSBtdXN0IGhhdmUgdGhlIGVuY2xvc2luZyBwYXJlbnRoZXNlcywgc3VjaCBhcyBgYGEsIGIsIGNgYCBvclxuYGAoKWBgLiAgQSBzaW5nbGUgaXRlbSB0dXBsZSBtdXN0IGhhdmUgYSB0cmFpbGluZyBjb21tYSwgc3VjaCBhc1xuYGAoZCwpYGAuXG5cbkJ5dGVhcnJheSBvYmplY3RzIGFyZSBjcmVhdGVkIHdpdGggdGhlIGJ1aWx0LWluIGZ1bmN0aW9uXG5gYGJ5dGVhcnJheSgpYGAuXG5cbkJ1ZmZlciBvYmplY3RzIGFyZSBub3QgZGlyZWN0bHkgc3VwcG9ydGVkIGJ5IFB5dGhvbiBzeW50YXgsIGJ1dCBjYW4gYmVcbmNyZWF0ZWQgYnkgY2FsbGluZyB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gYGBidWZmZXIoKWBgLiAgVGhleSBkb25cJ3RcbnN1cHBvcnQgY29uY2F0ZW5hdGlvbiBvciByZXBldGl0aW9uLlxuXG5PYmplY3RzIG9mIHR5cGUgeHJhbmdlIGFyZSBzaW1pbGFyIHRvIGJ1ZmZlcnMgaW4gdGhhdCB0aGVyZSBpcyBub1xuc3BlY2lmaWMgc3ludGF4IHRvIGNyZWF0ZSB0aGVtLCBidXQgdGhleSBhcmUgY3JlYXRlZCB1c2luZyB0aGVcbmBgeHJhbmdlKClgYCBmdW5jdGlvbi4gIFRoZXkgZG9uXCd0IHN1cHBvcnQgc2xpY2luZywgY29uY2F0ZW5hdGlvbiBvclxucmVwZXRpdGlvbiwgYW5kIHVzaW5nIGBgaW5gYCwgYGBub3QgaW5gYCwgYGBtaW4oKWBgIG9yIGBgbWF4KClgYCBvblxudGhlbSBpcyBpbmVmZmljaWVudC5cblxuTW9zdCBzZXF1ZW5jZSB0eXBlcyBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucy4gIFRoZSBgYGluYGAgYW5kXG5gYG5vdCBpbmBgIG9wZXJhdGlvbnMgaGF2ZSB0aGUgc2FtZSBwcmlvcml0aWVzIGFzIHRoZSBjb21wYXJpc29uXG5vcGVyYXRpb25zLiAgVGhlIGBgK2BgIGFuZCBgYCpgYCBvcGVyYXRpb25zIGhhdmUgdGhlIHNhbWUgcHJpb3JpdHkgYXNcbnRoZSBjb3JyZXNwb25kaW5nIG51bWVyaWMgb3BlcmF0aW9ucy4gWzNdIEFkZGl0aW9uYWwgbWV0aG9kcyBhcmVcbnByb3ZpZGVkIGZvciAqTXV0YWJsZSBTZXF1ZW5jZSBUeXBlcyouXG5cblRoaXMgdGFibGUgbGlzdHMgdGhlIHNlcXVlbmNlIG9wZXJhdGlvbnMgc29ydGVkIGluIGFzY2VuZGluZyBwcmlvcml0eVxuKG9wZXJhdGlvbnMgaW4gdGhlIHNhbWUgYm94IGhhdmUgdGhlIHNhbWUgcHJpb3JpdHkpLiAgSW4gdGhlIHRhYmxlLFxuKnMqIGFuZCAqdCogYXJlIHNlcXVlbmNlcyBvZiB0aGUgc2FtZSB0eXBlOyAqbiosICppKiBhbmQgKmoqIGFyZVxuaW50ZWdlcnM6XG5cbistLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgT3BlcmF0aW9uICAgICAgICAgIHwgUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgICAgIHxcbis9PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PStcbnwgYGB4IGluIHNgYCAgICAgICAgIHwgYGBUcnVlYGAgaWYgYW4gaXRlbSBvZiAqcyogaXMgICAgfCAoMSkgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgIHwgZXF1YWwgdG8gKngqLCBlbHNlIGBgRmFsc2VgYCAgICAgfCAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgYGB4IG5vdCBpbiBzYGAgICAgIHwgYGBGYWxzZWBgIGlmIGFuIGl0ZW0gb2YgKnMqIGlzICAgfCAoMSkgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgIHwgZXF1YWwgdG8gKngqLCBlbHNlIGBgVHJ1ZWBgICAgICAgfCAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgYGBzICsgdGBgICAgICAgICAgIHwgdGhlIGNvbmNhdGVuYXRpb24gb2YgKnMqIGFuZCAqdCogfCAoNikgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgYGBzICogbiwgbiAqIHNgYCAgIHwgKm4qIHNoYWxsb3cgY29waWVzIG9mICpzKiAgICAgICAgfCAoMikgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgIHwgY29uY2F0ZW5hdGVkICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgYGBzW2ldYGAgICAgICAgICAgIHwgKmkqXCd0aCBpdGVtIG9mICpzKiwgb3JpZ2luIDAgICAgIHwgKDMpICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgc1tpOmpdYGAgICAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogICAgIHwgKDMpKDQpICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgc1tpOmo6a11gYCAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogICAgIHwgKDMpKDUpICAgICB8XG58ICAgICAgICAgICAgICAgICAgICB8IHdpdGggc3RlcCAqayogICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgbGVuKHMpYGAgICAgICAgICB8IGxlbmd0aCBvZiAqcyogICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgbWluKHMpYGAgICAgICAgICB8IHNtYWxsZXN0IGl0ZW0gb2YgKnMqICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgbWF4KHMpYGAgICAgICAgICB8IGxhcmdlc3QgaXRlbSBvZiAqcyogICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgcy5pbmRleChpKWBgICAgICB8IGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cmVuY2Ugb2YgIHwgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICB8ICppKiBpbiAqcyogICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgcy5jb3VudChpKWBgICAgICB8IHRvdGFsIG51bWJlciBvZiBvY2N1cmVuY2VzIG9mICAgIHwgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICB8ICppKiBpbiAqcyogICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG5cblNlcXVlbmNlIHR5cGVzIGFsc28gc3VwcG9ydCBjb21wYXJpc29ucy4gSW4gcGFydGljdWxhciwgdHVwbGVzIGFuZFxubGlzdHMgYXJlIGNvbXBhcmVkIGxleGljb2dyYXBoaWNhbGx5IGJ5IGNvbXBhcmluZyBjb3JyZXNwb25kaW5nXG5lbGVtZW50cy4gVGhpcyBtZWFucyB0aGF0IHRvIGNvbXBhcmUgZXF1YWwsIGV2ZXJ5IGVsZW1lbnQgbXVzdCBjb21wYXJlXG5lcXVhbCBhbmQgdGhlIHR3byBzZXF1ZW5jZXMgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlIGFuZCBoYXZlIHRoZSBzYW1lXG5sZW5ndGguIChGb3IgZnVsbCBkZXRhaWxzIHNlZSAqQ29tcGFyaXNvbnMqIGluIHRoZSBsYW5ndWFnZVxucmVmZXJlbmNlLilcblxuTm90ZXM6XG5cbjEuIFdoZW4gKnMqIGlzIGEgc3RyaW5nIG9yIFVuaWNvZGUgc3RyaW5nIG9iamVjdCB0aGUgYGBpbmBgIGFuZCBgYG5vdFxuICAgaW5gYCBvcGVyYXRpb25zIGFjdCBsaWtlIGEgc3Vic3RyaW5nIHRlc3QuICBJbiBQeXRob24gdmVyc2lvbnNcbiAgIGJlZm9yZSAyLjMsICp4KiBoYWQgdG8gYmUgYSBzdHJpbmcgb2YgbGVuZ3RoIDEuIEluIFB5dGhvbiAyLjMgYW5kXG4gICBiZXlvbmQsICp4KiBtYXkgYmUgYSBzdHJpbmcgb2YgYW55IGxlbmd0aC5cblxuMi4gVmFsdWVzIG9mICpuKiBsZXNzIHRoYW4gYGAwYGAgYXJlIHRyZWF0ZWQgYXMgYGAwYGAgKHdoaWNoIHlpZWxkcyBhblxuICAgZW1wdHkgc2VxdWVuY2Ugb2YgdGhlIHNhbWUgdHlwZSBhcyAqcyopLiAgTm90ZSBhbHNvIHRoYXQgdGhlIGNvcGllc1xuICAgYXJlIHNoYWxsb3c7IG5lc3RlZCBzdHJ1Y3R1cmVzIGFyZSBub3QgY29waWVkLiAgVGhpcyBvZnRlbiBoYXVudHNcbiAgIG5ldyBQeXRob24gcHJvZ3JhbW1lcnM7IGNvbnNpZGVyOlxuXG4gICA+Pj4gbGlzdHMgPSBbW11dICogM1xuICAgPj4+IGxpc3RzXG4gICBbW10sIFtdLCBbXV1cbiAgID4+PiBsaXN0c1swXS5hcHBlbmQoMylcbiAgID4+PiBsaXN0c1xuICAgW1szXSwgWzNdLCBbM11dXG5cbiAgIFdoYXQgaGFzIGhhcHBlbmVkIGlzIHRoYXQgYGBbW11dYGAgaXMgYSBvbmUtZWxlbWVudCBsaXN0IGNvbnRhaW5pbmdcbiAgIGFuIGVtcHR5IGxpc3QsIHNvIGFsbCB0aHJlZSBlbGVtZW50cyBvZiBgYFtbXV0gKiAzYGAgYXJlIChwb2ludGVyc1xuICAgdG8pIHRoaXMgc2luZ2xlIGVtcHR5IGxpc3QuICBNb2RpZnlpbmcgYW55IG9mIHRoZSBlbGVtZW50cyBvZlxuICAgYGBsaXN0c2BgIG1vZGlmaWVzIHRoaXMgc2luZ2xlIGxpc3QuIFlvdSBjYW4gY3JlYXRlIGEgbGlzdCBvZlxuICAgZGlmZmVyZW50IGxpc3RzIHRoaXMgd2F5OlxuXG4gICA+Pj4gbGlzdHMgPSBbW10gZm9yIGkgaW4gcmFuZ2UoMyldXG4gICA+Pj4gbGlzdHNbMF0uYXBwZW5kKDMpXG4gICA+Pj4gbGlzdHNbMV0uYXBwZW5kKDUpXG4gICA+Pj4gbGlzdHNbMl0uYXBwZW5kKDcpXG4gICA+Pj4gbGlzdHNcbiAgIFtbM10sIFs1XSwgWzddXVxuXG4zLiBJZiAqaSogb3IgKmoqIGlzIG5lZ2F0aXZlLCB0aGUgaW5kZXggaXMgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGVcbiAgIHN0cmluZzogYGBsZW4ocykgKyBpYGAgb3IgYGBsZW4ocykgKyBqYGAgaXMgc3Vic3RpdHV0ZWQuICBCdXQgbm90ZVxuICAgdGhhdCBgYC0wYGAgaXMgc3RpbGwgYGAwYGAuXG5cbjQuIFRoZSBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqIGlzIGRlZmluZWQgYXMgdGhlIHNlcXVlbmNlIG9mXG4gICBpdGVtcyB3aXRoIGluZGV4ICprKiBzdWNoIHRoYXQgYGBpIDw9IGsgPCBqYGAuICBJZiAqaSogb3IgKmoqIGlzXG4gICBncmVhdGVyIHRoYW4gYGBsZW4ocylgYCwgdXNlIGBgbGVuKHMpYGAuICBJZiAqaSogaXMgb21pdHRlZCBvclxuICAgYGBOb25lYGAsIHVzZSBgYDBgYC4gIElmICpqKiBpcyBvbWl0dGVkIG9yIGBgTm9uZWBgLCB1c2VcbiAgIGBgbGVuKHMpYGAuICBJZiAqaSogaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICpqKiwgdGhlIHNsaWNlIGlzXG4gICBlbXB0eS5cblxuNS4gVGhlIHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogd2l0aCBzdGVwICprKiBpcyBkZWZpbmVkIGFzIHRoZVxuICAgc2VxdWVuY2Ugb2YgaXRlbXMgd2l0aCBpbmRleCAgYGB4ID0gaSArIG4qa2BgIHN1Y2ggdGhhdCBgYDAgPD0gbiA8XG4gICAoai1pKS9rYGAuICBJbiBvdGhlciB3b3JkcywgdGhlIGluZGljZXMgYXJlIGBgaWBgLCBgYGkra2BgLFxuICAgYGBpKzIqa2BgLCBgYGkrMyprYGAgYW5kIHNvIG9uLCBzdG9wcGluZyB3aGVuICpqKiBpcyByZWFjaGVkIChidXRcbiAgIG5ldmVyIGluY2x1ZGluZyAqaiopLiAgSWYgKmkqIG9yICpqKiBpcyBncmVhdGVyIHRoYW4gYGBsZW4ocylgYCxcbiAgIHVzZSBgYGxlbihzKWBgLiAgSWYgKmkqIG9yICpqKiBhcmUgb21pdHRlZCBvciBgYE5vbmVgYCwgdGhleSBiZWNvbWVcbiAgICJlbmQiIHZhbHVlcyAod2hpY2ggZW5kIGRlcGVuZHMgb24gdGhlIHNpZ24gb2YgKmsqKS4gIE5vdGUsICprKlxuICAgY2Fubm90IGJlIHplcm8uIElmICprKiBpcyBgYE5vbmVgYCwgaXQgaXMgdHJlYXRlZCBsaWtlIGBgMWBgLlxuXG42LiAqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIElmICpzKiBhbmQgKnQqIGFyZSBib3RoIHN0cmluZ3MsXG4gICBzb21lIFB5dGhvbiBpbXBsZW1lbnRhdGlvbnMgc3VjaCBhcyBDUHl0aG9uIGNhbiB1c3VhbGx5IHBlcmZvcm0gYW5cbiAgIGluLXBsYWNlIG9wdGltaXphdGlvbiBmb3IgYXNzaWdubWVudHMgb2YgdGhlIGZvcm0gYGBzID0gcyArIHRgYCBvclxuICAgYGBzICs9IHRgYC4gIFdoZW4gYXBwbGljYWJsZSwgdGhpcyBvcHRpbWl6YXRpb24gbWFrZXMgcXVhZHJhdGljXG4gICBydW4tdGltZSBtdWNoIGxlc3MgbGlrZWx5LiAgVGhpcyBvcHRpbWl6YXRpb24gaXMgYm90aCB2ZXJzaW9uIGFuZFxuICAgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LiAgRm9yIHBlcmZvcm1hbmNlIHNlbnNpdGl2ZSBjb2RlLCBpdCBpc1xuICAgcHJlZmVyYWJsZSB0byB1c2UgdGhlIGBgc3RyLmpvaW4oKWBgIG1ldGhvZCB3aGljaCBhc3N1cmVzXG4gICBjb25zaXN0ZW50IGxpbmVhciBjb25jYXRlbmF0aW9uIHBlcmZvcm1hbmNlIGFjcm9zcyB2ZXJzaW9ucyBhbmRcbiAgIGltcGxlbWVudGF0aW9ucy5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNDogRm9ybWVybHksIHN0cmluZyBjb25jYXRlbmF0aW9uIG5ldmVyXG4gICBvY2N1cnJlZCBpbi1wbGFjZS5cblxuXG5TdHJpbmcgTWV0aG9kc1xuPT09PT09PT09PT09PT1cblxuQmVsb3cgYXJlIGxpc3RlZCB0aGUgc3RyaW5nIG1ldGhvZHMgd2hpY2ggYm90aCA4LWJpdCBzdHJpbmdzIGFuZFxuVW5pY29kZSBvYmplY3RzIHN1cHBvcnQuICBTb21lIG9mIHRoZW0gYXJlIGFsc28gYXZhaWxhYmxlIG9uXG5gYGJ5dGVhcnJheWBgIG9iamVjdHMuXG5cbkluIGFkZGl0aW9uLCBQeXRob25cJ3Mgc3RyaW5ncyBzdXBwb3J0IHRoZSBzZXF1ZW5jZSB0eXBlIG1ldGhvZHNcbmRlc2NyaWJlZCBpbiB0aGUgKlNlcXVlbmNlIFR5cGVzIC0tLSBzdHIsIHVuaWNvZGUsIGxpc3QsIHR1cGxlLFxuYnl0ZWFycmF5LCBidWZmZXIsIHhyYW5nZSogc2VjdGlvbi4gVG8gb3V0cHV0IGZvcm1hdHRlZCBzdHJpbmdzIHVzZVxudGVtcGxhdGUgc3RyaW5ncyBvciB0aGUgYGAlYGAgb3BlcmF0b3IgZGVzY3JpYmVkIGluIHRoZSAqU3RyaW5nXG5Gb3JtYXR0aW5nIE9wZXJhdGlvbnMqIHNlY3Rpb24uIEFsc28sIHNlZSB0aGUgYGByZWBgIG1vZHVsZSBmb3Igc3RyaW5nXG5mdW5jdGlvbnMgYmFzZWQgb24gcmVndWxhciBleHByZXNzaW9ucy5cblxuc3RyLmNhcGl0YWxpemUoKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBpdHMgZmlyc3QgY2hhcmFjdGVyIGNhcGl0YWxpemVkXG4gICBhbmQgdGhlIHJlc3QgbG93ZXJjYXNlZC5cblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci5jZW50ZXIod2lkdGhbLCBmaWxsY2hhcl0pXG5cbiAgIFJldHVybiBjZW50ZXJlZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi4gUGFkZGluZyBpcyBkb25lXG4gICB1c2luZyB0aGUgc3BlY2lmaWVkICpmaWxsY2hhciogKGRlZmF1bHQgaXMgYSBzcGFjZSkuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjQ6IFN1cHBvcnQgZm9yIHRoZSAqZmlsbGNoYXIqIGFyZ3VtZW50LlxuXG5zdHIuY291bnQoc3ViWywgc3RhcnRbLCBlbmRdXSlcblxuICAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2VzIG9mIHN1YnN0cmluZyAqc3ViKlxuICAgaW4gdGhlIHJhbmdlIFsqc3RhcnQqLCAqZW5kKl0uICBPcHRpb25hbCBhcmd1bWVudHMgKnN0YXJ0KiBhbmRcbiAgICplbmQqIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cblxuc3RyLmRlY29kZShbZW5jb2RpbmdbLCBlcnJvcnNdXSlcblxuICAgRGVjb2RlcyB0aGUgc3RyaW5nIHVzaW5nIHRoZSBjb2RlYyByZWdpc3RlcmVkIGZvciAqZW5jb2RpbmcqLlxuICAgKmVuY29kaW5nKiBkZWZhdWx0cyB0byB0aGUgZGVmYXVsdCBzdHJpbmcgZW5jb2RpbmcuICAqZXJyb3JzKiBtYXlcbiAgIGJlIGdpdmVuIHRvIHNldCBhIGRpZmZlcmVudCBlcnJvciBoYW5kbGluZyBzY2hlbWUuICBUaGUgZGVmYXVsdCBpc1xuICAgYGBcJ3N0cmljdFwnYGAsIG1lYW5pbmcgdGhhdCBlbmNvZGluZyBlcnJvcnMgcmFpc2UgYGBVbmljb2RlRXJyb3JgYC5cbiAgIE90aGVyIHBvc3NpYmxlIHZhbHVlcyBhcmUgYGBcJ2lnbm9yZVwnYGAsIGBgXCdyZXBsYWNlXCdgYCBhbmQgYW55IG90aGVyXG4gICBuYW1lIHJlZ2lzdGVyZWQgdmlhIGBgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKClgYCwgc2VlIHNlY3Rpb24gKkNvZGVjXG4gICBCYXNlIENsYXNzZXMqLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjIuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjM6IFN1cHBvcnQgZm9yIG90aGVyIGVycm9yIGhhbmRsaW5nIHNjaGVtZXNcbiAgIGFkZGVkLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi43OiBTdXBwb3J0IGZvciBrZXl3b3JkIGFyZ3VtZW50cyBhZGRlZC5cblxuc3RyLmVuY29kZShbZW5jb2RpbmdbLCBlcnJvcnNdXSlcblxuICAgUmV0dXJuIGFuIGVuY29kZWQgdmVyc2lvbiBvZiB0aGUgc3RyaW5nLiAgRGVmYXVsdCBlbmNvZGluZyBpcyB0aGVcbiAgIGN1cnJlbnQgZGVmYXVsdCBzdHJpbmcgZW5jb2RpbmcuICAqZXJyb3JzKiBtYXkgYmUgZ2l2ZW4gdG8gc2V0IGFcbiAgIGRpZmZlcmVudCBlcnJvciBoYW5kbGluZyBzY2hlbWUuICBUaGUgZGVmYXVsdCBmb3IgKmVycm9ycyogaXNcbiAgIGBgXCdzdHJpY3RcJ2BgLCBtZWFuaW5nIHRoYXQgZW5jb2RpbmcgZXJyb3JzIHJhaXNlIGFcbiAgIGBgVW5pY29kZUVycm9yYGAuICBPdGhlciBwb3NzaWJsZSB2YWx1ZXMgYXJlIGBgXCdpZ25vcmVcJ2BgLFxuICAgYGBcJ3JlcGxhY2VcJ2BgLCBgYFwneG1sY2hhcnJlZnJlcGxhY2VcJ2BgLCBgYFwnYmFja3NsYXNocmVwbGFjZVwnYGAgYW5kXG4gICBhbnkgb3RoZXIgbmFtZSByZWdpc3RlcmVkIHZpYSBgYGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigpYGAsIHNlZVxuICAgc2VjdGlvbiAqQ29kZWMgQmFzZSBDbGFzc2VzKi4gRm9yIGEgbGlzdCBvZiBwb3NzaWJsZSBlbmNvZGluZ3MsIHNlZVxuICAgc2VjdGlvbiAqU3RhbmRhcmQgRW5jb2RpbmdzKi5cblxuICAgTmV3IGluIHZlcnNpb24gMi4wLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBTdXBwb3J0IGZvciBgYFwneG1sY2hhcnJlZnJlcGxhY2VcJ2BgIGFuZFxuICAgYGBcJ2JhY2tzbGFzaHJlcGxhY2VcJ2BgIGFuZCBvdGhlciBlcnJvciBoYW5kbGluZyBzY2hlbWVzIGFkZGVkLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi43OiBTdXBwb3J0IGZvciBrZXl3b3JkIGFyZ3VtZW50cyBhZGRlZC5cblxuc3RyLmVuZHN3aXRoKHN1ZmZpeFssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiBgYFRydWVgYCBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCB0aGUgc3BlY2lmaWVkICpzdWZmaXgqLFxuICAgb3RoZXJ3aXNlIHJldHVybiBgYEZhbHNlYGAuICAqc3VmZml4KiBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mXG4gICBzdWZmaXhlcyB0byBsb29rIGZvci4gIFdpdGggb3B0aW9uYWwgKnN0YXJ0KiwgdGVzdCBiZWdpbm5pbmcgYXRcbiAgIHRoYXQgcG9zaXRpb24uICBXaXRoIG9wdGlvbmFsICplbmQqLCBzdG9wIGNvbXBhcmluZyBhdCB0aGF0XG4gICBwb3NpdGlvbi5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNTogQWNjZXB0IHR1cGxlcyBhcyAqc3VmZml4Ki5cblxuc3RyLmV4cGFuZHRhYnMoW3RhYnNpemVdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2hlcmUgYWxsIHRhYiBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZFxuICAgYnkgb25lIG9yIG1vcmUgc3BhY2VzLCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgY29sdW1uIGFuZCB0aGVcbiAgIGdpdmVuIHRhYiBzaXplLiAgVGhlIGNvbHVtbiBudW1iZXIgaXMgcmVzZXQgdG8gemVybyBhZnRlciBlYWNoXG4gICBuZXdsaW5lIG9jY3VycmluZyBpbiB0aGUgc3RyaW5nLiBJZiAqdGFic2l6ZSogaXMgbm90IGdpdmVuLCBhIHRhYlxuICAgc2l6ZSBvZiBgYDhgYCBjaGFyYWN0ZXJzIGlzIGFzc3VtZWQuICBUaGlzIGRvZXNuXCd0IHVuZGVyc3RhbmQgb3RoZXJcbiAgIG5vbi1wcmludGluZyBjaGFyYWN0ZXJzIG9yIGVzY2FwZSBzZXF1ZW5jZXMuXG5cbnN0ci5maW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIHRoZSBzdHJpbmcgd2hlcmUgc3Vic3RyaW5nICpzdWIqIGlzXG4gICBmb3VuZCwgc3VjaCB0aGF0ICpzdWIqIGlzIGNvbnRhaW5lZCBpbiB0aGUgc2xpY2UgYGBzW3N0YXJ0OmVuZF1gYC5cbiAgIE9wdGlvbmFsIGFyZ3VtZW50cyAqc3RhcnQqIGFuZCAqZW5kKiBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2VcbiAgIG5vdGF0aW9uLiAgUmV0dXJuIGBgLTFgYCBpZiAqc3ViKiBpcyBub3QgZm91bmQuXG5cbiAgIE5vdGU6IFRoZSBgYGZpbmQoKWBgIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBvbmx5IGlmIHlvdSBuZWVkIHRvIGtub3cgdGhlXG4gICAgIHBvc2l0aW9uIG9mICpzdWIqLiAgVG8gY2hlY2sgaWYgKnN1YiogaXMgYSBzdWJzdHJpbmcgb3Igbm90LCB1c2VcbiAgICAgdGhlIGBgaW5gYCBvcGVyYXRvcjpcblxuICAgICAgICA+Pj4gXCdQeVwnIGluIFwnUHl0aG9uXCdcbiAgICAgICAgVHJ1ZVxuXG5zdHIuZm9ybWF0KCphcmdzLCAqKmt3YXJncylcblxuICAgUGVyZm9ybSBhIHN0cmluZyBmb3JtYXR0aW5nIG9wZXJhdGlvbi4gIFRoZSBzdHJpbmcgb24gd2hpY2ggdGhpc1xuICAgbWV0aG9kIGlzIGNhbGxlZCBjYW4gY29udGFpbiBsaXRlcmFsIHRleHQgb3IgcmVwbGFjZW1lbnQgZmllbGRzXG4gICBkZWxpbWl0ZWQgYnkgYnJhY2VzIGBge31gYC4gIEVhY2ggcmVwbGFjZW1lbnQgZmllbGQgY29udGFpbnMgZWl0aGVyXG4gICB0aGUgbnVtZXJpYyBpbmRleCBvZiBhIHBvc2l0aW9uYWwgYXJndW1lbnQsIG9yIHRoZSBuYW1lIG9mIGFcbiAgIGtleXdvcmQgYXJndW1lbnQuICBSZXR1cm5zIGEgY29weSBvZiB0aGUgc3RyaW5nIHdoZXJlIGVhY2hcbiAgIHJlcGxhY2VtZW50IGZpZWxkIGlzIHJlcGxhY2VkIHdpdGggdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGVcbiAgIGNvcnJlc3BvbmRpbmcgYXJndW1lbnQuXG5cbiAgID4+PiAiVGhlIHN1bSBvZiAxICsgMiBpcyB7MH0iLmZvcm1hdCgxKzIpXG4gICBcJ1RoZSBzdW0gb2YgMSArIDIgaXMgM1wnXG5cbiAgIFNlZSAqRm9ybWF0IFN0cmluZyBTeW50YXgqIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSB2YXJpb3VzXG4gICBmb3JtYXR0aW5nIG9wdGlvbnMgdGhhdCBjYW4gYmUgc3BlY2lmaWVkIGluIGZvcm1hdCBzdHJpbmdzLlxuXG4gICBUaGlzIG1ldGhvZCBvZiBzdHJpbmcgZm9ybWF0dGluZyBpcyB0aGUgbmV3IHN0YW5kYXJkIGluIFB5dGhvbiAzLjAsXG4gICBhbmQgc2hvdWxkIGJlIHByZWZlcnJlZCB0byB0aGUgYGAlYGAgZm9ybWF0dGluZyBkZXNjcmliZWQgaW5cbiAgICpTdHJpbmcgRm9ybWF0dGluZyBPcGVyYXRpb25zKiBpbiBuZXcgY29kZS5cblxuICAgTmV3IGluIHZlcnNpb24gMi42LlxuXG5zdHIuaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSlcblxuICAgTGlrZSBgYGZpbmQoKWBgLCBidXQgcmFpc2UgYGBWYWx1ZUVycm9yYGAgd2hlbiB0aGUgc3Vic3RyaW5nIGlzIG5vdFxuICAgZm91bmQuXG5cbnN0ci5pc2FsbnVtKClcblxuICAgUmV0dXJuIHRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgYWxwaGFudW1lcmljIGFuZFxuICAgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLmlzYWxwaGEoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBhbHBoYWJldGljIGFuZFxuICAgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLmlzZGlnaXQoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBkaWdpdHMgYW5kIHRoZXJlIGlzXG4gICBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuaXNsb3dlcigpXG5cbiAgIFJldHVybiB0cnVlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGxvd2VyY2FzZSBhbmRcbiAgIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS5cblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci5pc3NwYWNlKClcblxuICAgUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmdcbiAgIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuaXN0aXRsZSgpXG5cbiAgIFJldHVybiB0cnVlIGlmIHRoZSBzdHJpbmcgaXMgYSB0aXRsZWNhc2VkIHN0cmluZyBhbmQgdGhlcmUgaXMgYXRcbiAgIGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZvciBleGFtcGxlIHVwcGVyY2FzZSBjaGFyYWN0ZXJzIG1heSBvbmx5XG4gICBmb2xsb3cgdW5jYXNlZCBjaGFyYWN0ZXJzIGFuZCBsb3dlcmNhc2UgY2hhcmFjdGVycyBvbmx5IGNhc2VkIG9uZXMuXG4gICBSZXR1cm4gZmFsc2Ugb3RoZXJ3aXNlLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLmlzdXBwZXIoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2FzZWQgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSB1cHBlcmNhc2UgYW5kXG4gICB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuam9pbihpdGVyYWJsZSlcblxuICAgUmV0dXJuIGEgc3RyaW5nIHdoaWNoIGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBzdHJpbmdzIGluIHRoZVxuICAgKml0ZXJhYmxlKiAqaXRlcmFibGUqLiAgVGhlIHNlcGFyYXRvciBiZXR3ZWVuIGVsZW1lbnRzIGlzIHRoZVxuICAgc3RyaW5nIHByb3ZpZGluZyB0aGlzIG1ldGhvZC5cblxuc3RyLmxqdXN0KHdpZHRoWywgZmlsbGNoYXJdKVxuXG4gICBSZXR1cm4gdGhlIHN0cmluZyBsZWZ0IGp1c3RpZmllZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi5cbiAgIFBhZGRpbmcgaXMgZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkICpmaWxsY2hhciogKGRlZmF1bHQgaXMgYVxuICAgc3BhY2UpLiAgVGhlIG9yaWdpbmFsIHN0cmluZyBpcyByZXR1cm5lZCBpZiAqd2lkdGgqIGlzIGxlc3MgdGhhblxuICAgYGBsZW4ocylgYC5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNDogU3VwcG9ydCBmb3IgdGhlICpmaWxsY2hhciogYXJndW1lbnQuXG5cbnN0ci5sb3dlcigpXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLmxzdHJpcChbY2hhcnNdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBsZWFkaW5nIGNoYXJhY3RlcnMgcmVtb3ZlZC4gIFRoZVxuICAgKmNoYXJzKiBhcmd1bWVudCBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBzZXQgb2YgY2hhcmFjdGVycyB0byBiZVxuICAgcmVtb3ZlZC4gIElmIG9taXR0ZWQgb3IgYGBOb25lYGAsIHRoZSAqY2hhcnMqIGFyZ3VtZW50IGRlZmF1bHRzIHRvXG4gICByZW1vdmluZyB3aGl0ZXNwYWNlLiAgVGhlICpjaGFycyogYXJndW1lbnQgaXMgbm90IGEgcHJlZml4OyByYXRoZXIsXG4gICBhbGwgY29tYmluYXRpb25zIG9mIGl0cyB2YWx1ZXMgYXJlIHN0cmlwcGVkOlxuXG4gICA+Pj4gXCcgICBzcGFjaW91cyAgIFwnLmxzdHJpcCgpXG4gICBcJ3NwYWNpb3VzICAgXCdcbiAgID4+PiBcJ3d3dy5leGFtcGxlLmNvbVwnLmxzdHJpcChcJ2Ntb3d6LlwnKVxuICAgXCdleGFtcGxlLmNvbVwnXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjIuMjogU3VwcG9ydCBmb3IgdGhlICpjaGFycyogYXJndW1lbnQuXG5cbnN0ci5wYXJ0aXRpb24oc2VwKVxuXG4gICBTcGxpdCB0aGUgc3RyaW5nIGF0IHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mICpzZXAqLCBhbmQgcmV0dXJuIGFcbiAgIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlIHNlcGFyYXRvclxuICAgaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgdGhlIHNlcGFyYXRvci4gIElmIHRoZSBzZXBhcmF0b3IgaXMgbm90XG4gICBmb3VuZCwgcmV0dXJuIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBzdHJpbmcgaXRzZWxmLCBmb2xsb3dlZCBieVxuICAgdHdvIGVtcHR5IHN0cmluZ3MuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDIuNS5cblxuc3RyLnJlcGxhY2Uob2xkLCBuZXdbLCBjb3VudF0pXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGFsbCBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgKm9sZCpcbiAgIHJlcGxhY2VkIGJ5ICpuZXcqLiAgSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50ICpjb3VudCogaXMgZ2l2ZW4sIG9ubHlcbiAgIHRoZSBmaXJzdCAqY291bnQqIG9jY3VycmVuY2VzIGFyZSByZXBsYWNlZC5cblxuc3RyLnJmaW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiB0aGUgaGlnaGVzdCBpbmRleCBpbiB0aGUgc3RyaW5nIHdoZXJlIHN1YnN0cmluZyAqc3ViKiBpc1xuICAgZm91bmQsIHN1Y2ggdGhhdCAqc3ViKiBpcyBjb250YWluZWQgd2l0aGluIGBgc1tzdGFydDplbmRdYGAuXG4gICBPcHRpb25hbCBhcmd1bWVudHMgKnN0YXJ0KiBhbmQgKmVuZCogYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlXG4gICBub3RhdGlvbi4gIFJldHVybiBgYC0xYGAgb24gZmFpbHVyZS5cblxuc3RyLnJpbmRleChzdWJbLCBzdGFydFssIGVuZF1dKVxuXG4gICBMaWtlIGBgcmZpbmQoKWBgIGJ1dCByYWlzZXMgYGBWYWx1ZUVycm9yYGAgd2hlbiB0aGUgc3Vic3RyaW5nICpzdWIqXG4gICBpcyBub3QgZm91bmQuXG5cbnN0ci5yanVzdCh3aWR0aFssIGZpbGxjaGFyXSlcblxuICAgUmV0dXJuIHRoZSBzdHJpbmcgcmlnaHQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCAqd2lkdGgqLlxuICAgUGFkZGluZyBpcyBkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgKmZpbGxjaGFyKiAoZGVmYXVsdCBpcyBhXG4gICBzcGFjZSkuIFRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW5cbiAgIGBgbGVuKHMpYGAuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjQ6IFN1cHBvcnQgZm9yIHRoZSAqZmlsbGNoYXIqIGFyZ3VtZW50LlxuXG5zdHIucnBhcnRpdGlvbihzZXApXG5cbiAgIFNwbGl0IHRoZSBzdHJpbmcgYXQgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiAqc2VwKiwgYW5kIHJldHVybiBhXG4gICAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHBhcnQgYmVmb3JlIHRoZSBzZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3JcbiAgIGl0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIHRoZSBzZXBhcmF0b3IuICBJZiB0aGUgc2VwYXJhdG9yIGlzIG5vdFxuICAgZm91bmQsIHJldHVybiBhIDMtdHVwbGUgY29udGFpbmluZyB0d28gZW1wdHkgc3RyaW5ncywgZm9sbG93ZWQgYnlcbiAgIHRoZSBzdHJpbmcgaXRzZWxmLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjUuXG5cbnN0ci5yc3BsaXQoW3NlcFssIG1heHNwbGl0XV0pXG5cbiAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcsIHVzaW5nICpzZXAqIGFzIHRoZVxuICAgZGVsaW1pdGVyIHN0cmluZy4gSWYgKm1heHNwbGl0KiBpcyBnaXZlbiwgYXQgbW9zdCAqbWF4c3BsaXQqIHNwbGl0c1xuICAgYXJlIGRvbmUsIHRoZSAqcmlnaHRtb3N0KiBvbmVzLiAgSWYgKnNlcCogaXMgbm90IHNwZWNpZmllZCBvclxuICAgYGBOb25lYGAsIGFueSB3aGl0ZXNwYWNlIHN0cmluZyBpcyBhIHNlcGFyYXRvci4gIEV4Y2VwdCBmb3JcbiAgIHNwbGl0dGluZyBmcm9tIHRoZSByaWdodCwgYGByc3BsaXQoKWBgIGJlaGF2ZXMgbGlrZSBgYHNwbGl0KClgYFxuICAgd2hpY2ggaXMgZGVzY3JpYmVkIGluIGRldGFpbCBiZWxvdy5cblxuICAgTmV3IGluIHZlcnNpb24gMi40LlxuXG5zdHIucnN0cmlwKFtjaGFyc10pXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHRyYWlsaW5nIGNoYXJhY3RlcnMgcmVtb3ZlZC4gIFRoZVxuICAgKmNoYXJzKiBhcmd1bWVudCBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBzZXQgb2YgY2hhcmFjdGVycyB0byBiZVxuICAgcmVtb3ZlZC4gIElmIG9taXR0ZWQgb3IgYGBOb25lYGAsIHRoZSAqY2hhcnMqIGFyZ3VtZW50IGRlZmF1bHRzIHRvXG4gICByZW1vdmluZyB3aGl0ZXNwYWNlLiAgVGhlICpjaGFycyogYXJndW1lbnQgaXMgbm90IGEgc3VmZml4OyByYXRoZXIsXG4gICBhbGwgY29tYmluYXRpb25zIG9mIGl0cyB2YWx1ZXMgYXJlIHN0cmlwcGVkOlxuXG4gICA+Pj4gXCcgICBzcGFjaW91cyAgIFwnLnJzdHJpcCgpXG4gICBcJyAgIHNwYWNpb3VzXCdcbiAgID4+PiBcJ21pc3Npc3NpcHBpXCcucnN0cmlwKFwnaXB6XCcpXG4gICBcJ21pc3Npc3NcJ1xuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4yLjI6IFN1cHBvcnQgZm9yIHRoZSAqY2hhcnMqIGFyZ3VtZW50LlxuXG5zdHIuc3BsaXQoW3NlcFssIG1heHNwbGl0XV0pXG5cbiAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcsIHVzaW5nICpzZXAqIGFzIHRoZVxuICAgZGVsaW1pdGVyIHN0cmluZy4gIElmICptYXhzcGxpdCogaXMgZ2l2ZW4sIGF0IG1vc3QgKm1heHNwbGl0KlxuICAgc3BsaXRzIGFyZSBkb25lICh0aHVzLCB0aGUgbGlzdCB3aWxsIGhhdmUgYXQgbW9zdCBgYG1heHNwbGl0KzFgYFxuICAgZWxlbWVudHMpLiAgSWYgKm1heHNwbGl0KiBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRoZXJlIGlzIG5vIGxpbWl0XG4gICBvbiB0aGUgbnVtYmVyIG9mIHNwbGl0cyAoYWxsIHBvc3NpYmxlIHNwbGl0cyBhcmUgbWFkZSkuXG5cbiAgIElmICpzZXAqIGlzIGdpdmVuLCBjb25zZWN1dGl2ZSBkZWxpbWl0ZXJzIGFyZSBub3QgZ3JvdXBlZCB0b2dldGhlclxuICAgYW5kIGFyZSBkZWVtZWQgdG8gZGVsaW1pdCBlbXB0eSBzdHJpbmdzIChmb3IgZXhhbXBsZSxcbiAgIGBgXCcxLCwyXCcuc3BsaXQoXCcsXCcpYGAgcmV0dXJucyBgYFtcJzFcJywgXCdcJywgXCcyXCddYGApLiAgVGhlICpzZXAqXG4gICBhcmd1bWVudCBtYXkgY29uc2lzdCBvZiBtdWx0aXBsZSBjaGFyYWN0ZXJzIChmb3IgZXhhbXBsZSxcbiAgIGBgXCcxPD4yPD4zXCcuc3BsaXQoXCc8PlwnKWBgIHJldHVybnMgYGBbXCcxXCcsIFwnMlwnLCBcJzNcJ11gYCkuIFNwbGl0dGluZ1xuICAgYW4gZW1wdHkgc3RyaW5nIHdpdGggYSBzcGVjaWZpZWQgc2VwYXJhdG9yIHJldHVybnMgYGBbXCdcJ11gYC5cblxuICAgSWYgKnNlcCogaXMgbm90IHNwZWNpZmllZCBvciBpcyBgYE5vbmVgYCwgYSBkaWZmZXJlbnQgc3BsaXR0aW5nXG4gICBhbGdvcml0aG0gaXMgYXBwbGllZDogcnVucyBvZiBjb25zZWN1dGl2ZSB3aGl0ZXNwYWNlIGFyZSByZWdhcmRlZFxuICAgYXMgYSBzaW5nbGUgc2VwYXJhdG9yLCBhbmQgdGhlIHJlc3VsdCB3aWxsIGNvbnRhaW4gbm8gZW1wdHkgc3RyaW5nc1xuICAgYXQgdGhlIHN0YXJ0IG9yIGVuZCBpZiB0aGUgc3RyaW5nIGhhcyBsZWFkaW5nIG9yIHRyYWlsaW5nXG4gICB3aGl0ZXNwYWNlLiAgQ29uc2VxdWVudGx5LCBzcGxpdHRpbmcgYW4gZW1wdHkgc3RyaW5nIG9yIGEgc3RyaW5nXG4gICBjb25zaXN0aW5nIG9mIGp1c3Qgd2hpdGVzcGFjZSB3aXRoIGEgYGBOb25lYGAgc2VwYXJhdG9yIHJldHVybnNcbiAgIGBgW11gYC5cblxuICAgRm9yIGV4YW1wbGUsIGBgXCcgMSAgMiAgIDMgIFwnLnNwbGl0KClgYCByZXR1cm5zIGBgW1wnMVwnLCBcJzJcJywgXCczXCddYGAsXG4gICBhbmQgYGBcJyAgMSAgMiAgIDMgIFwnLnNwbGl0KE5vbmUsIDEpYGAgcmV0dXJucyBgYFtcJzFcJywgXCcyICAgMyAgXCddYGAuXG5cbnN0ci5zcGxpdGxpbmVzKFtrZWVwZW5kc10pXG5cbiAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIGxpbmVzIGluIHRoZSBzdHJpbmcsIGJyZWFraW5nIGF0IGxpbmVcbiAgIGJvdW5kYXJpZXMuICBMaW5lIGJyZWFrcyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgbGlzdFxuICAgdW5sZXNzICprZWVwZW5kcyogaXMgZ2l2ZW4gYW5kIHRydWUuXG5cbnN0ci5zdGFydHN3aXRoKHByZWZpeFssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiBgYFRydWVgYCBpZiBzdHJpbmcgc3RhcnRzIHdpdGggdGhlICpwcmVmaXgqLCBvdGhlcndpc2VcbiAgIHJldHVybiBgYEZhbHNlYGAuICpwcmVmaXgqIGNhbiBhbHNvIGJlIGEgdHVwbGUgb2YgcHJlZml4ZXMgdG8gbG9va1xuICAgZm9yLiAgV2l0aCBvcHRpb25hbCAqc3RhcnQqLCB0ZXN0IHN0cmluZyBiZWdpbm5pbmcgYXQgdGhhdFxuICAgcG9zaXRpb24uICBXaXRoIG9wdGlvbmFsICplbmQqLCBzdG9wIGNvbXBhcmluZyBzdHJpbmcgYXQgdGhhdFxuICAgcG9zaXRpb24uXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjU6IEFjY2VwdCB0dXBsZXMgYXMgKnByZWZpeCouXG5cbnN0ci5zdHJpcChbY2hhcnNdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCB0aGUgbGVhZGluZyBhbmQgdHJhaWxpbmdcbiAgIGNoYXJhY3RlcnMgcmVtb3ZlZC4gVGhlICpjaGFycyogYXJndW1lbnQgaXMgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGVcbiAgIHNldCBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlbW92ZWQuIElmIG9taXR0ZWQgb3IgYGBOb25lYGAsIHRoZVxuICAgKmNoYXJzKiBhcmd1bWVudCBkZWZhdWx0cyB0byByZW1vdmluZyB3aGl0ZXNwYWNlLiBUaGUgKmNoYXJzKlxuICAgYXJndW1lbnQgaXMgbm90IGEgcHJlZml4IG9yIHN1ZmZpeDsgcmF0aGVyLCBhbGwgY29tYmluYXRpb25zIG9mIGl0c1xuICAgdmFsdWVzIGFyZSBzdHJpcHBlZDpcblxuICAgPj4+IFwnICAgc3BhY2lvdXMgICBcJy5zdHJpcCgpXG4gICBcJ3NwYWNpb3VzXCdcbiAgID4+PiBcJ3d3dy5leGFtcGxlLmNvbVwnLnN0cmlwKFwnY21vd3ouXCcpXG4gICBcJ2V4YW1wbGVcJ1xuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4yLjI6IFN1cHBvcnQgZm9yIHRoZSAqY2hhcnMqIGFyZ3VtZW50LlxuXG5zdHIuc3dhcGNhc2UoKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCB1cHBlcmNhc2UgY2hhcmFjdGVycyBjb252ZXJ0ZWQgdG9cbiAgIGxvd2VyY2FzZSBhbmQgdmljZSB2ZXJzYS5cblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci50aXRsZSgpXG5cbiAgIFJldHVybiBhIHRpdGxlY2FzZWQgdmVyc2lvbiBvZiB0aGUgc3RyaW5nIHdoZXJlIHdvcmRzIHN0YXJ0IHdpdGggYW5cbiAgIHVwcGVyY2FzZSBjaGFyYWN0ZXIgYW5kIHRoZSByZW1haW5pbmcgY2hhcmFjdGVycyBhcmUgbG93ZXJjYXNlLlxuXG4gICBUaGUgYWxnb3JpdGhtIHVzZXMgYSBzaW1wbGUgbGFuZ3VhZ2UtaW5kZXBlbmRlbnQgZGVmaW5pdGlvbiBvZiBhXG4gICB3b3JkIGFzIGdyb3VwcyBvZiBjb25zZWN1dGl2ZSBsZXR0ZXJzLiAgVGhlIGRlZmluaXRpb24gd29ya3MgaW5cbiAgIG1hbnkgY29udGV4dHMgYnV0IGl0IG1lYW5zIHRoYXQgYXBvc3Ryb3BoZXMgaW4gY29udHJhY3Rpb25zIGFuZFxuICAgcG9zc2Vzc2l2ZXMgZm9ybSB3b3JkIGJvdW5kYXJpZXMsIHdoaWNoIG1heSBub3QgYmUgdGhlIGRlc2lyZWRcbiAgIHJlc3VsdDpcblxuICAgICAgPj4+ICJ0aGV5XCdyZSBiaWxsXCdzIGZyaWVuZHMgZnJvbSB0aGUgVUsiLnRpdGxlKClcbiAgICAgICJUaGV5XCdSZSBCaWxsXCdTIEZyaWVuZHMgRnJvbSBUaGUgVWsiXG5cbiAgIEEgd29ya2Fyb3VuZCBmb3IgYXBvc3Ryb3BoZXMgY2FuIGJlIGNvbnN0cnVjdGVkIHVzaW5nIHJlZ3VsYXJcbiAgIGV4cHJlc3Npb25zOlxuXG4gICAgICA+Pj4gaW1wb3J0IHJlXG4gICAgICA+Pj4gZGVmIHRpdGxlY2FzZShzKTpcbiAgICAgICAgICAgICAgcmV0dXJuIHJlLnN1YihyIltBLVphLXpdKyhcJ1tBLVphLXpdKyk/IixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEgbW86IG1vLmdyb3VwKDApWzBdLnVwcGVyKCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8uZ3JvdXAoMClbMTpdLmxvd2VyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcylcblxuICAgICAgPj4+IHRpdGxlY2FzZSgidGhleVwncmUgYmlsbFwncyBmcmllbmRzLiIpXG4gICAgICAiVGhleVwncmUgQmlsbFwncyBGcmllbmRzLiJcblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci50cmFuc2xhdGUodGFibGVbLCBkZWxldGVjaGFyc10pXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aGVyZSBhbGwgY2hhcmFjdGVycyBvY2N1cnJpbmcgaW4gdGhlXG4gICBvcHRpb25hbCBhcmd1bWVudCAqZGVsZXRlY2hhcnMqIGFyZSByZW1vdmVkLCBhbmQgdGhlIHJlbWFpbmluZ1xuICAgY2hhcmFjdGVycyBoYXZlIGJlZW4gbWFwcGVkIHRocm91Z2ggdGhlIGdpdmVuIHRyYW5zbGF0aW9uIHRhYmxlLFxuICAgd2hpY2ggbXVzdCBiZSBhIHN0cmluZyBvZiBsZW5ndGggMjU2LlxuXG4gICBZb3UgY2FuIHVzZSB0aGUgYGBtYWtldHJhbnMoKWBgIGhlbHBlciBmdW5jdGlvbiBpbiB0aGUgYGBzdHJpbmdgYFxuICAgbW9kdWxlIHRvIGNyZWF0ZSBhIHRyYW5zbGF0aW9uIHRhYmxlLiBGb3Igc3RyaW5nIG9iamVjdHMsIHNldCB0aGVcbiAgICp0YWJsZSogYXJndW1lbnQgdG8gYGBOb25lYGAgZm9yIHRyYW5zbGF0aW9ucyB0aGF0IG9ubHkgZGVsZXRlXG4gICBjaGFyYWN0ZXJzOlxuXG4gICA+Pj4gXCdyZWFkIHRoaXMgc2hvcnQgdGV4dFwnLnRyYW5zbGF0ZShOb25lLCBcJ2FlaW91XCcpXG4gICBcJ3JkIHRocyBzaHJ0IHR4dFwnXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDIuNjogU3VwcG9ydCBmb3IgYSBgYE5vbmVgYCAqdGFibGUqIGFyZ3VtZW50LlxuXG4gICBGb3IgVW5pY29kZSBvYmplY3RzLCB0aGUgYGB0cmFuc2xhdGUoKWBgIG1ldGhvZCBkb2VzIG5vdCBhY2NlcHQgdGhlXG4gICBvcHRpb25hbCAqZGVsZXRlY2hhcnMqIGFyZ3VtZW50LiAgSW5zdGVhZCwgaXQgcmV0dXJucyBhIGNvcHkgb2YgdGhlXG4gICAqcyogd2hlcmUgYWxsIGNoYXJhY3RlcnMgaGF2ZSBiZWVuIG1hcHBlZCB0aHJvdWdoIHRoZSBnaXZlblxuICAgdHJhbnNsYXRpb24gdGFibGUgd2hpY2ggbXVzdCBiZSBhIG1hcHBpbmcgb2YgVW5pY29kZSBvcmRpbmFscyB0b1xuICAgVW5pY29kZSBvcmRpbmFscywgVW5pY29kZSBzdHJpbmdzIG9yIGBgTm9uZWBgLiBVbm1hcHBlZCBjaGFyYWN0ZXJzXG4gICBhcmUgbGVmdCB1bnRvdWNoZWQuIENoYXJhY3RlcnMgbWFwcGVkIHRvIGBgTm9uZWBgIGFyZSBkZWxldGVkLlxuICAgTm90ZSwgYSBtb3JlIGZsZXhpYmxlIGFwcHJvYWNoIGlzIHRvIGNyZWF0ZSBhIGN1c3RvbSBjaGFyYWN0ZXJcbiAgIG1hcHBpbmcgY29kZWMgdXNpbmcgdGhlIGBgY29kZWNzYGAgbW9kdWxlIChzZWUgYGBlbmNvZGluZ3MuY3AxMjUxYGBcbiAgIGZvciBhbiBleGFtcGxlKS5cblxuc3RyLnVwcGVyKClcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuemZpbGwod2lkdGgpXG5cbiAgIFJldHVybiB0aGUgbnVtZXJpYyBzdHJpbmcgbGVmdCBmaWxsZWQgd2l0aCB6ZXJvcyBpbiBhIHN0cmluZyBvZlxuICAgbGVuZ3RoICp3aWR0aCouICBBIHNpZ24gcHJlZml4IGlzIGhhbmRsZWQgY29ycmVjdGx5LiAgVGhlIG9yaWdpbmFsXG4gICBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW4gYGBsZW4ocylgYC5cblxuICAgTmV3IGluIHZlcnNpb24gMi4yLjIuXG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgcHJlc2VudCBvbmx5IG9uIHVuaWNvZGUgb2JqZWN0czpcblxudW5pY29kZS5pc251bWVyaWMoKVxuXG4gICBSZXR1cm4gYGBUcnVlYGAgaWYgdGhlcmUgYXJlIG9ubHkgbnVtZXJpYyBjaGFyYWN0ZXJzIGluIFMsXG4gICBgYEZhbHNlYGAgb3RoZXJ3aXNlLiBOdW1lcmljIGNoYXJhY3RlcnMgaW5jbHVkZSBkaWdpdCBjaGFyYWN0ZXJzLFxuICAgYW5kIGFsbCBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSB0aGUgVW5pY29kZSBudW1lcmljIHZhbHVlIHByb3BlcnR5LFxuICAgZS5nLiBVKzIxNTUsIFZVTEdBUiBGUkFDVElPTiBPTkUgRklGVEguXG5cbnVuaWNvZGUuaXNkZWNpbWFsKClcblxuICAgUmV0dXJuIGBgVHJ1ZWBgIGlmIHRoZXJlIGFyZSBvbmx5IGRlY2ltYWwgY2hhcmFjdGVycyBpbiBTLFxuICAgYGBGYWxzZWBgIG90aGVyd2lzZS4gRGVjaW1hbCBjaGFyYWN0ZXJzIGluY2x1ZGUgZGlnaXQgY2hhcmFjdGVycyxcbiAgIGFuZCBhbGwgY2hhcmFjdGVycyB0aGF0IHRoYXQgY2FuIGJlIHVzZWQgdG8gZm9ybSBkZWNpbWFsLXJhZGl4XG4gICBudW1iZXJzLCBlLmcuIFUrMDY2MCwgQVJBQklDLUlORElDIERJR0lUIFpFUk8uXG5cblxuU3RyaW5nIEZvcm1hdHRpbmcgT3BlcmF0aW9uc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5TdHJpbmcgYW5kIFVuaWNvZGUgb2JqZWN0cyBoYXZlIG9uZSB1bmlxdWUgYnVpbHQtaW4gb3BlcmF0aW9uOiB0aGVcbmBgJWBgIG9wZXJhdG9yIChtb2R1bG8pLiAgVGhpcyBpcyBhbHNvIGtub3duIGFzIHRoZSBzdHJpbmdcbipmb3JtYXR0aW5nKiBvciAqaW50ZXJwb2xhdGlvbiogb3BlcmF0b3IuICBHaXZlbiBgYGZvcm1hdCAlIHZhbHVlc2BgXG4od2hlcmUgKmZvcm1hdCogaXMgYSBzdHJpbmcgb3IgVW5pY29kZSBvYmplY3QpLCBgYCVgYCBjb252ZXJzaW9uXG5zcGVjaWZpY2F0aW9ucyBpbiAqZm9ybWF0KiBhcmUgcmVwbGFjZWQgd2l0aCB6ZXJvIG9yIG1vcmUgZWxlbWVudHMgb2Zcbip2YWx1ZXMqLiAgVGhlIGVmZmVjdCBpcyBzaW1pbGFyIHRvIHRoZSB1c2luZyBgYHNwcmludGYoKWBgIGluIHRoZSBDXG5sYW5ndWFnZS4gIElmICpmb3JtYXQqIGlzIGEgVW5pY29kZSBvYmplY3QsIG9yIGlmIGFueSBvZiB0aGUgb2JqZWN0c1xuYmVpbmcgY29udmVydGVkIHVzaW5nIHRoZSBgYCVzYGAgY29udmVyc2lvbiBhcmUgVW5pY29kZSBvYmplY3RzLCB0aGVcbnJlc3VsdCB3aWxsIGFsc28gYmUgYSBVbmljb2RlIG9iamVjdC5cblxuSWYgKmZvcm1hdCogcmVxdWlyZXMgYSBzaW5nbGUgYXJndW1lbnQsICp2YWx1ZXMqIG1heSBiZSBhIHNpbmdsZSBub24tXG50dXBsZSBvYmplY3QuIFs0XSAgT3RoZXJ3aXNlLCAqdmFsdWVzKiBtdXN0IGJlIGEgdHVwbGUgd2l0aCBleGFjdGx5XG50aGUgbnVtYmVyIG9mIGl0ZW1zIHNwZWNpZmllZCBieSB0aGUgZm9ybWF0IHN0cmluZywgb3IgYSBzaW5nbGVcbm1hcHBpbmcgb2JqZWN0IChmb3IgZXhhbXBsZSwgYSBkaWN0aW9uYXJ5KS5cblxuQSBjb252ZXJzaW9uIHNwZWNpZmllciBjb250YWlucyB0d28gb3IgbW9yZSBjaGFyYWN0ZXJzIGFuZCBoYXMgdGhlXG5mb2xsb3dpbmcgY29tcG9uZW50cywgd2hpY2ggbXVzdCBvY2N1ciBpbiB0aGlzIG9yZGVyOlxuXG4xLiBUaGUgYGBcJyVcJ2BgIGNoYXJhY3Rlciwgd2hpY2ggbWFya3MgdGhlIHN0YXJ0IG9mIHRoZSBzcGVjaWZpZXIuXG5cbjIuIE1hcHBpbmcga2V5IChvcHRpb25hbCksIGNvbnNpc3Rpbmcgb2YgYSBwYXJlbnRoZXNpc2VkIHNlcXVlbmNlIG9mXG4gICBjaGFyYWN0ZXJzIChmb3IgZXhhbXBsZSwgYGAoc29tZW5hbWUpYGApLlxuXG4zLiBDb252ZXJzaW9uIGZsYWdzIChvcHRpb25hbCksIHdoaWNoIGFmZmVjdCB0aGUgcmVzdWx0IG9mIHNvbWVcbiAgIGNvbnZlcnNpb24gdHlwZXMuXG5cbjQuIE1pbmltdW0gZmllbGQgd2lkdGggKG9wdGlvbmFsKS4gIElmIHNwZWNpZmllZCBhcyBhbiBgYFwnKlwnYGBcbiAgIChhc3RlcmlzayksIHRoZSBhY3R1YWwgd2lkdGggaXMgcmVhZCBmcm9tIHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlXG4gICB0dXBsZSBpbiAqdmFsdWVzKiwgYW5kIHRoZSBvYmplY3QgdG8gY29udmVydCBjb21lcyBhZnRlciB0aGVcbiAgIG1pbmltdW0gZmllbGQgd2lkdGggYW5kIG9wdGlvbmFsIHByZWNpc2lvbi5cblxuNS4gUHJlY2lzaW9uIChvcHRpb25hbCksIGdpdmVuIGFzIGEgYGBcJy5cJ2BgIChkb3QpIGZvbGxvd2VkIGJ5IHRoZVxuICAgcHJlY2lzaW9uLiAgSWYgc3BlY2lmaWVkIGFzIGBgXCcqXCdgYCAoYW4gYXN0ZXJpc2spLCB0aGUgYWN0dWFsIHdpZHRoXG4gICBpcyByZWFkIGZyb20gdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgdHVwbGUgaW4gKnZhbHVlcyosIGFuZCB0aGVcbiAgIHZhbHVlIHRvIGNvbnZlcnQgY29tZXMgYWZ0ZXIgdGhlIHByZWNpc2lvbi5cblxuNi4gTGVuZ3RoIG1vZGlmaWVyIChvcHRpb25hbCkuXG5cbjcuIENvbnZlcnNpb24gdHlwZS5cblxuV2hlbiB0aGUgcmlnaHQgYXJndW1lbnQgaXMgYSBkaWN0aW9uYXJ5IChvciBvdGhlciBtYXBwaW5nIHR5cGUpLCB0aGVuXG50aGUgZm9ybWF0cyBpbiB0aGUgc3RyaW5nICptdXN0KiBpbmNsdWRlIGEgcGFyZW50aGVzaXNlZCBtYXBwaW5nIGtleVxuaW50byB0aGF0IGRpY3Rpb25hcnkgaW5zZXJ0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGBgXCclXCdgYCBjaGFyYWN0ZXIuXG5UaGUgbWFwcGluZyBrZXkgc2VsZWN0cyB0aGUgdmFsdWUgdG8gYmUgZm9ybWF0dGVkIGZyb20gdGhlIG1hcHBpbmcuXG5Gb3IgZXhhbXBsZTpcblxuPj4+IHByaW50IFwnJShsYW5ndWFnZSlzIGhhcyAlKG51bWJlcikwM2QgcXVvdGUgdHlwZXMuXCcgJSBcXFxuLi4uICAgICAgIHsibGFuZ3VhZ2UiOiAiUHl0aG9uIiwgIm51bWJlciI6IDJ9XG5QeXRob24gaGFzIDAwMiBxdW90ZSB0eXBlcy5cblxuSW4gdGhpcyBjYXNlIG5vIGBgKmBgIHNwZWNpZmllcnMgbWF5IG9jY3VyIGluIGEgZm9ybWF0IChzaW5jZSB0aGV5XG5yZXF1aXJlIGEgc2VxdWVudGlhbCBwYXJhbWV0ZXIgbGlzdCkuXG5cblRoZSBjb252ZXJzaW9uIGZsYWcgY2hhcmFjdGVycyBhcmU6XG5cbistLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgRmxhZyAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbis9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbnwgYGBcJyNcJ2BgICAgfCBUaGUgdmFsdWUgY29udmVyc2lvbiB3aWxsIHVzZSB0aGUgImFsdGVybmF0ZSBmb3JtIiAod2hlcmUgZGVmaW5lZCAgICAgfFxufCAgICAgICAgICAgfCBiZWxvdykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYFwnMFwnYGAgICB8IFRoZSBjb252ZXJzaW9uIHdpbGwgYmUgemVybyBwYWRkZWQgZm9yIG51bWVyaWMgdmFsdWVzLiAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgXCctXCdgYCAgIHwgVGhlIGNvbnZlcnRlZCB2YWx1ZSBpcyBsZWZ0IGFkanVzdGVkIChvdmVycmlkZXMgdGhlIGBgXCcwXCdgYCAgICAgICAgICAgfFxufCAgICAgICAgICAgfCBjb252ZXJzaW9uIGlmIGJvdGggYXJlIGdpdmVuKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYFwnIFwnYGAgICB8IChhIHNwYWNlKSBBIGJsYW5rIHNob3VsZCBiZSBsZWZ0IGJlZm9yZSBhIHBvc2l0aXZlIG51bWJlciAob3IgZW1wdHkgICB8XG58ICAgICAgICAgICB8IHN0cmluZykgcHJvZHVjZWQgYnkgYSBzaWduZWQgY29udmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgXCcrXCdgYCAgIHwgQSBzaWduIGNoYXJhY3RlciAoYGBcJytcJ2BgIG9yIGBgXCctXCdgYCkgd2lsbCBwcmVjZWRlIHRoZSBjb252ZXJzaW9uICAgICB8XG58ICAgICAgICAgICB8IChvdmVycmlkZXMgYSAic3BhY2UiIGZsYWcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG5cbkEgbGVuZ3RoIG1vZGlmaWVyIChgYGhgYCwgYGBsYGAsIG9yIGBgTGBgKSBtYXkgYmUgcHJlc2VudCwgYnV0IGlzXG5pZ25vcmVkIGFzIGl0IGlzIG5vdCBuZWNlc3NhcnkgZm9yIFB5dGhvbiAtLSBzbyBlLmcuIGBgJWxkYGAgaXNcbmlkZW50aWNhbCB0byBgYCVkYGAuXG5cblRoZSBjb252ZXJzaW9uIHR5cGVzIGFyZTpcblxuKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBDb252ZXJzaW9uICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzICAgfFxuKz09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09K1xufCBgYFwnZFwnYGAgICAgICB8IFNpZ25lZCBpbnRlZ2VyIGRlY2ltYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXCdpXCdgYCAgICAgIHwgU2lnbmVkIGludGVnZXIgZGVjaW1hbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcJ29cJ2BgICAgICAgfCBTaWduZWQgb2N0YWwgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgxKSAgICAgfFxuKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFwndVwnYGAgICAgICB8IE9ic29sZXRlIHR5cGUgLS0gaXQgaXMgaWRlbnRpY2FsIHRvIGBgXCdkXCdgYC4gICAgICAgICAgfCAoNykgICAgIHxcbistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcJ3hcJ2BgICAgICAgfCBTaWduZWQgaGV4YWRlY2ltYWwgKGxvd2VyY2FzZSkuICAgICAgICAgICAgICAgICAgICAgICB8ICgyKSAgICAgfFxuKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFwnWFwnYGAgICAgICB8IFNpZ25lZCBoZXhhZGVjaW1hbCAodXBwZXJjYXNlKS4gICAgICAgICAgICAgICAgICAgICAgIHwgKDIpICAgICB8XG4rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXCdlXCdgYCAgICAgIHwgRmxvYXRpbmcgcG9pbnQgZXhwb25lbnRpYWwgZm9ybWF0IChsb3dlcmNhc2UpLiAgICAgICAgfCAoMykgICAgIHxcbistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcJ0VcJ2BgICAgICAgfCBGbG9hdGluZyBwb2ludCBleHBvbmVudGlhbCBmb3JtYXQgKHVwcGVyY2FzZSkuICAgICAgICB8ICgzKSAgICAgfFxuKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFwnZlwnYGAgICAgICB8IEZsb2F0aW5nIHBvaW50IGRlY2ltYWwgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgIHwgKDMpICAgICB8XG4rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXCdGXCdgYCAgICAgIHwgRmxvYXRpbmcgcG9pbnQgZGVjaW1hbCBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgfCAoMykgICAgIHxcbistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcJ2dcJ2BgICAgICAgfCBGbG9hdGluZyBwb2ludCBmb3JtYXQuIFVzZXMgbG93ZXJjYXNlIGV4cG9uZW50aWFsICAgICB8ICg0KSAgICAgfFxufCAgICAgICAgICAgICAgfCBmb3JtYXQgaWYgZXhwb25lbnQgaXMgbGVzcyB0aGFuIC00IG9yIG5vdCBsZXNzIHRoYW4gICB8ICAgICAgICAgfFxufCAgICAgICAgICAgICAgfCBwcmVjaXNpb24sIGRlY2ltYWwgZm9ybWF0IG90aGVyd2lzZS4gICAgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFwnR1wnYGAgICAgICB8IEZsb2F0aW5nIHBvaW50IGZvcm1hdC4gVXNlcyB1cHBlcmNhc2UgZXhwb25lbnRpYWwgICAgIHwgKDQpICAgICB8XG58ICAgICAgICAgICAgICB8IGZvcm1hdCBpZiBleHBvbmVudCBpcyBsZXNzIHRoYW4gLTQgb3Igbm90IGxlc3MgdGhhbiAgIHwgICAgICAgICB8XG58ICAgICAgICAgICAgICB8IHByZWNpc2lvbiwgZGVjaW1hbCBmb3JtYXQgb3RoZXJ3aXNlLiAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXCdjXCdgYCAgICAgIHwgU2luZ2xlIGNoYXJhY3RlciAoYWNjZXB0cyBpbnRlZ2VyIG9yIHNpbmdsZSBjaGFyYWN0ZXIgfCAgICAgICAgIHxcbnwgICAgICAgICAgICAgIHwgc3RyaW5nKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcJ3JcJ2BgICAgICAgfCBTdHJpbmcgKGNvbnZlcnRzIGFueSBQeXRob24gb2JqZWN0IHVzaW5nIGBgcmVwcigpYGApLiB8ICg1KSAgICAgfFxuKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFwnc1wnYGAgICAgICB8IFN0cmluZyAoY29udmVydHMgYW55IFB5dGhvbiBvYmplY3QgdXNpbmcgYGBzdHIoKWBgKS4gIHwgKDYpICAgICB8XG4rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXCclXCdgYCAgICAgIHwgTm8gYXJndW1lbnQgaXMgY29udmVydGVkLCByZXN1bHRzIGluIGEgYGBcJyVcJ2BgICAgICAgICB8ICAgICAgICAgfFxufCAgICAgICAgICAgICAgfCBjaGFyYWN0ZXIgaW4gdGhlIHJlc3VsdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuXG5Ob3RlczpcblxuMS4gVGhlIGFsdGVybmF0ZSBmb3JtIGNhdXNlcyBhIGxlYWRpbmcgemVybyAoYGBcJzBcJ2BgKSB0byBiZSBpbnNlcnRlZFxuICAgYmV0d2VlbiBsZWZ0LWhhbmQgcGFkZGluZyBhbmQgdGhlIGZvcm1hdHRpbmcgb2YgdGhlIG51bWJlciBpZiB0aGVcbiAgIGxlYWRpbmcgY2hhcmFjdGVyIG9mIHRoZSByZXN1bHQgaXMgbm90IGFscmVhZHkgYSB6ZXJvLlxuXG4yLiBUaGUgYWx0ZXJuYXRlIGZvcm0gY2F1c2VzIGEgbGVhZGluZyBgYFwnMHhcJ2BgIG9yIGBgXCcwWFwnYGAgKGRlcGVuZGluZ1xuICAgb24gd2hldGhlciB0aGUgYGBcJ3hcJ2BgIG9yIGBgXCdYXCdgYCBmb3JtYXQgd2FzIHVzZWQpIHRvIGJlIGluc2VydGVkXG4gICBiZXR3ZWVuIGxlZnQtaGFuZCBwYWRkaW5nIGFuZCB0aGUgZm9ybWF0dGluZyBvZiB0aGUgbnVtYmVyIGlmIHRoZVxuICAgbGVhZGluZyBjaGFyYWN0ZXIgb2YgdGhlIHJlc3VsdCBpcyBub3QgYWxyZWFkeSBhIHplcm8uXG5cbjMuIFRoZSBhbHRlcm5hdGUgZm9ybSBjYXVzZXMgdGhlIHJlc3VsdCB0byBhbHdheXMgY29udGFpbiBhIGRlY2ltYWxcbiAgIHBvaW50LCBldmVuIGlmIG5vIGRpZ2l0cyBmb2xsb3cgaXQuXG5cbiAgIFRoZSBwcmVjaXNpb24gZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbFxuICAgcG9pbnQgYW5kIGRlZmF1bHRzIHRvIDYuXG5cbjQuIFRoZSBhbHRlcm5hdGUgZm9ybSBjYXVzZXMgdGhlIHJlc3VsdCB0byBhbHdheXMgY29udGFpbiBhIGRlY2ltYWxcbiAgIHBvaW50LCBhbmQgdHJhaWxpbmcgemVyb2VzIGFyZSBub3QgcmVtb3ZlZCBhcyB0aGV5IHdvdWxkIG90aGVyd2lzZVxuICAgYmUuXG5cbiAgIFRoZSBwcmVjaXNpb24gZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGRpZ2l0cyBiZWZvcmVcbiAgIGFuZCBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCBhbmQgZGVmYXVsdHMgdG8gNi5cblxuNS4gVGhlIGBgJXJgYCBjb252ZXJzaW9uIHdhcyBhZGRlZCBpbiBQeXRob24gMi4wLlxuXG4gICBUaGUgcHJlY2lzaW9uIGRldGVybWluZXMgdGhlIG1heGltYWwgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXNlZC5cblxuNi4gSWYgdGhlIG9iamVjdCBvciBmb3JtYXQgcHJvdmlkZWQgaXMgYSBgYHVuaWNvZGVgYCBzdHJpbmcsIHRoZVxuICAgcmVzdWx0aW5nIHN0cmluZyB3aWxsIGFsc28gYmUgYGB1bmljb2RlYGAuXG5cbiAgIFRoZSBwcmVjaXNpb24gZGV0ZXJtaW5lcyB0aGUgbWF4aW1hbCBudW1iZXIgb2YgY2hhcmFjdGVycyB1c2VkLlxuXG43LiBTZWUgKipQRVAgMjM3KiouXG5cblNpbmNlIFB5dGhvbiBzdHJpbmdzIGhhdmUgYW4gZXhwbGljaXQgbGVuZ3RoLCBgYCVzYGAgY29udmVyc2lvbnMgZG9cbm5vdCBhc3N1bWUgdGhhdCBgYFwnXFwwXCdgYCBpcyB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAyLjc6IGBgJWZgYCBjb252ZXJzaW9ucyBmb3IgbnVtYmVycyB3aG9zZSBhYnNvbHV0ZVxudmFsdWUgaXMgb3ZlciAxZTUwIGFyZSBubyBsb25nZXIgcmVwbGFjZWQgYnkgYGAlZ2BgIGNvbnZlcnNpb25zLlxuXG5BZGRpdGlvbmFsIHN0cmluZyBvcGVyYXRpb25zIGFyZSBkZWZpbmVkIGluIHN0YW5kYXJkIG1vZHVsZXNcbmBgc3RyaW5nYGAgYW5kIGBgcmVgYC5cblxuXG5YUmFuZ2UgVHlwZVxuPT09PT09PT09PT1cblxuVGhlIGBgeHJhbmdlYGAgdHlwZSBpcyBhbiBpbW11dGFibGUgc2VxdWVuY2Ugd2hpY2ggaXMgY29tbW9ubHkgdXNlZFxuZm9yIGxvb3BpbmcuICBUaGUgYWR2YW50YWdlIG9mIHRoZSBgYHhyYW5nZWBgIHR5cGUgaXMgdGhhdCBhblxuYGB4cmFuZ2VgYCBvYmplY3Qgd2lsbCBhbHdheXMgdGFrZSB0aGUgc2FtZSBhbW91bnQgb2YgbWVtb3J5LCBub1xubWF0dGVyIHRoZSBzaXplIG9mIHRoZSByYW5nZSBpdCByZXByZXNlbnRzLiAgVGhlcmUgYXJlIG5vIGNvbnNpc3RlbnRcbnBlcmZvcm1hbmNlIGFkdmFudGFnZXMuXG5cblhSYW5nZSBvYmplY3RzIGhhdmUgdmVyeSBsaXR0bGUgYmVoYXZpb3I6IHRoZXkgb25seSBzdXBwb3J0IGluZGV4aW5nLFxuaXRlcmF0aW9uLCBhbmQgdGhlIGBgbGVuKClgYCBmdW5jdGlvbi5cblxuXG5NdXRhYmxlIFNlcXVlbmNlIFR5cGVzXG49PT09PT09PT09PT09PT09PT09PT09XG5cbkxpc3QgYW5kIGBgYnl0ZWFycmF5YGAgb2JqZWN0cyBzdXBwb3J0IGFkZGl0aW9uYWwgb3BlcmF0aW9ucyB0aGF0XG5hbGxvdyBpbi1wbGFjZSBtb2RpZmljYXRpb24gb2YgdGhlIG9iamVjdC4gT3RoZXIgbXV0YWJsZSBzZXF1ZW5jZVxudHlwZXMgKHdoZW4gYWRkZWQgdG8gdGhlIGxhbmd1YWdlKSBzaG91bGQgYWxzbyBzdXBwb3J0IHRoZXNlXG5vcGVyYXRpb25zLiBTdHJpbmdzIGFuZCB0dXBsZXMgYXJlIGltbXV0YWJsZSBzZXF1ZW5jZSB0eXBlczogc3VjaFxub2JqZWN0cyBjYW5ub3QgYmUgbW9kaWZpZWQgb25jZSBjcmVhdGVkLiBUaGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgYXJlXG5kZWZpbmVkIG9uIG11dGFibGUgc2VxdWVuY2UgdHlwZXMgKHdoZXJlICp4KiBpcyBhbiBhcmJpdHJhcnkgb2JqZWN0KTpcblxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IE9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICB8IFJlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgICAgICAgICAgICAgICAgIHxcbis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09K1xufCBgYHNbaV0gPSB4YGAgICAgICAgICAgICAgICAgICAgfCBpdGVtICppKiBvZiAqcyogaXMgcmVwbGFjZWQgYnkgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICp4KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHNbaTpqXSA9IHRgYCAgICAgICAgICAgICAgICAgfCBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqIGlzICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGxhY2VkIGJ5IHRoZSBjb250ZW50cyBvZiB0aGUgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaXRlcmFibGUgKnQqICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgZGVsIHNbaTpqXWBgICAgICAgICAgICAgICAgICB8IHNhbWUgYXMgYGBzW2k6al0gPSBbXWBgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHNbaTpqOmtdID0gdGBgICAgICAgICAgICAgICAgfCB0aGUgZWxlbWVudHMgb2YgYGBzW2k6ajprXWBgIGFyZSB8ICgxKSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGxhY2VkIGJ5IHRob3NlIG9mICp0KiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYGRlbCBzW2k6ajprXWBgICAgICAgICAgICAgICAgfCByZW1vdmVzIHRoZSBlbGVtZW50cyBvZiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBgc1tpOmo6a11gYCBmcm9tIHRoZSBsaXN0ICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHMuYXBwZW5kKHgpYGAgICAgICAgICAgICAgICAgfCBzYW1lIGFzIGBgc1tsZW4ocyk6bGVuKHMpXSA9ICAgICB8ICgyKSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFt4XWBgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHMuZXh0ZW5kKHgpYGAgICAgICAgICAgICAgICAgfCBzYW1lIGFzIGBgc1tsZW4ocyk6bGVuKHMpXSA9IHhgYCB8ICgzKSAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzLmNvdW50KHgpYGAgICAgICAgICAgICAgICAgIHwgcmV0dXJuIG51bWJlciBvZiAqaSpcJ3MgZm9yIHdoaWNoIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGBzW2ldID09IHhgYCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgcy5pbmRleCh4WywgaVssIGpdXSlgYCAgICAgICB8IHJldHVybiBzbWFsbGVzdCAqayogc3VjaCB0aGF0ICAgIHwgKDQpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGBzW2tdID09IHhgYCBhbmQgYGBpIDw9IGsgPCBqYGAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgcy5pbnNlcnQoaSwgeClgYCAgICAgICAgICAgICB8IHNhbWUgYXMgYGBzW2k6aV0gPSBbeF1gYCAgICAgICAgIHwgKDUpICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHMucG9wKFtpXSlgYCAgICAgICAgICAgICAgICAgfCBzYW1lIGFzIGBgeCA9IHNbaV07IGRlbCBzW2ldOyAgICB8ICg2KSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJldHVybiB4YGAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHMucmVtb3ZlKHgpYGAgICAgICAgICAgICAgICAgfCBzYW1lIGFzIGBgZGVsIHNbcy5pbmRleCh4KV1gYCAgICB8ICg0KSAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzLnJldmVyc2UoKWBgICAgICAgICAgICAgICAgIHwgcmV2ZXJzZXMgdGhlIGl0ZW1zIG9mICpzKiBpbiAgICAgfCAoNykgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwbGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzLnNvcnQoW2NtcFssIGtleVssICAgICAgICAgIHwgc29ydCB0aGUgaXRlbXMgb2YgKnMqIGluIHBsYWNlICAgfCAoNykoOCkoOSkoMTApICAgICAgICAgfFxufCByZXZlcnNlXV1dKWBgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuTm90ZXM6XG5cbjEuICp0KiBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzbGljZSBpdCBpcyAgcmVwbGFjaW5nLlxuXG4yLiBUaGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBQeXRob24gaGFzIGhpc3RvcmljYWxseSBhY2NlcHRlZCBtdWx0aXBsZVxuICAgcGFyYW1ldGVycyBhbmQgaW1wbGljaXRseSBqb2luZWQgdGhlbSBpbnRvIGEgdHVwbGU7IHRoaXMgbm8gbG9uZ2VyXG4gICB3b3JrcyBpbiBQeXRob24gMi4wLiAgVXNlIG9mIHRoaXMgbWlzZmVhdHVyZSBoYXMgYmVlbiBkZXByZWNhdGVkXG4gICBzaW5jZSBQeXRob24gMS40LlxuXG4zLiAqeCogY2FuIGJlIGFueSBpdGVyYWJsZSBvYmplY3QuXG5cbjQuIFJhaXNlcyBgYFZhbHVlRXJyb3JgYCB3aGVuICp4KiBpcyBub3QgZm91bmQgaW4gKnMqLiBXaGVuIGEgbmVnYXRpdmVcbiAgIGluZGV4IGlzIHBhc3NlZCBhcyB0aGUgc2Vjb25kIG9yIHRoaXJkIHBhcmFtZXRlciB0byB0aGUgYGBpbmRleCgpYGBcbiAgIG1ldGhvZCwgdGhlIGxpc3QgbGVuZ3RoIGlzIGFkZGVkLCBhcyBmb3Igc2xpY2UgaW5kaWNlcy4gIElmIGl0IGlzXG4gICBzdGlsbCBuZWdhdGl2ZSwgaXQgaXMgdHJ1bmNhdGVkIHRvIHplcm8sIGFzIGZvciBzbGljZSBpbmRpY2VzLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBQcmV2aW91c2x5LCBgYGluZGV4KClgYCBkaWRuXCd0IGhhdmVcbiAgIGFyZ3VtZW50cyBmb3Igc3BlY2lmeWluZyBzdGFydCBhbmQgc3RvcCBwb3NpdGlvbnMuXG5cbjUuIFdoZW4gYSBuZWdhdGl2ZSBpbmRleCBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciB0byB0aGVcbiAgIGBgaW5zZXJ0KClgYCBtZXRob2QsIHRoZSBsaXN0IGxlbmd0aCBpcyBhZGRlZCwgYXMgZm9yIHNsaWNlXG4gICBpbmRpY2VzLiAgSWYgaXQgaXMgc3RpbGwgbmVnYXRpdmUsIGl0IGlzIHRydW5jYXRlZCB0byB6ZXJvLCBhcyBmb3JcbiAgIHNsaWNlIGluZGljZXMuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjM6IFByZXZpb3VzbHksIGFsbCBuZWdhdGl2ZSBpbmRpY2VzIHdlcmVcbiAgIHRydW5jYXRlZCB0byB6ZXJvLlxuXG42LiBUaGUgYGBwb3AoKWBgIG1ldGhvZCBpcyBvbmx5IHN1cHBvcnRlZCBieSB0aGUgbGlzdCBhbmQgYXJyYXkgdHlwZXMuXG4gICBUaGUgb3B0aW9uYWwgYXJndW1lbnQgKmkqIGRlZmF1bHRzIHRvIGBgLTFgYCwgc28gdGhhdCBieSBkZWZhdWx0XG4gICB0aGUgbGFzdCBpdGVtIGlzIHJlbW92ZWQgYW5kIHJldHVybmVkLlxuXG43LiBUaGUgYGBzb3J0KClgYCBhbmQgYGByZXZlcnNlKClgYCBtZXRob2RzIG1vZGlmeSB0aGUgbGlzdCBpbiBwbGFjZVxuICAgZm9yIGVjb25vbXkgb2Ygc3BhY2Ugd2hlbiBzb3J0aW5nIG9yIHJldmVyc2luZyBhIGxhcmdlIGxpc3QuICBUb1xuICAgcmVtaW5kIHlvdSB0aGF0IHRoZXkgb3BlcmF0ZSBieSBzaWRlIGVmZmVjdCwgdGhleSBkb25cJ3QgcmV0dXJuIHRoZVxuICAgc29ydGVkIG9yIHJldmVyc2VkIGxpc3QuXG5cbjguIFRoZSBgYHNvcnQoKWBgIG1ldGhvZCB0YWtlcyBvcHRpb25hbCBhcmd1bWVudHMgZm9yIGNvbnRyb2xsaW5nIHRoZVxuICAgY29tcGFyaXNvbnMuXG5cbiAgICpjbXAqIHNwZWNpZmllcyBhIGN1c3RvbSBjb21wYXJpc29uIGZ1bmN0aW9uIG9mIHR3byBhcmd1bWVudHMgKGxpc3RcbiAgIGl0ZW1zKSB3aGljaCBzaG91bGQgcmV0dXJuIGEgbmVnYXRpdmUsIHplcm8gb3IgcG9zaXRpdmUgbnVtYmVyXG4gICBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgZmlyc3QgYXJndW1lbnQgaXMgY29uc2lkZXJlZCBzbWFsbGVyIHRoYW4sXG4gICBlcXVhbCB0bywgb3IgbGFyZ2VyIHRoYW4gdGhlIHNlY29uZCBhcmd1bWVudDogYGBjbXA9bGFtYmRhIHgseTpcbiAgIGNtcCh4Lmxvd2VyKCksIHkubG93ZXIoKSlgYC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBgTm9uZWBgLlxuXG4gICAqa2V5KiBzcGVjaWZpZXMgYSBmdW5jdGlvbiBvZiBvbmUgYXJndW1lbnQgdGhhdCBpcyB1c2VkIHRvIGV4dHJhY3RcbiAgIGEgY29tcGFyaXNvbiBrZXkgZnJvbSBlYWNoIGxpc3QgZWxlbWVudDogYGBrZXk9c3RyLmxvd2VyYGAuICBUaGVcbiAgIGRlZmF1bHQgdmFsdWUgaXMgYGBOb25lYGAuXG5cbiAgICpyZXZlcnNlKiBpcyBhIGJvb2xlYW4gdmFsdWUuICBJZiBzZXQgdG8gYGBUcnVlYGAsIHRoZW4gdGhlIGxpc3RcbiAgIGVsZW1lbnRzIGFyZSBzb3J0ZWQgYXMgaWYgZWFjaCBjb21wYXJpc29uIHdlcmUgcmV2ZXJzZWQuXG5cbiAgIEluIGdlbmVyYWwsIHRoZSAqa2V5KiBhbmQgKnJldmVyc2UqIGNvbnZlcnNpb24gcHJvY2Vzc2VzIGFyZSBtdWNoXG4gICBmYXN0ZXIgdGhhbiBzcGVjaWZ5aW5nIGFuIGVxdWl2YWxlbnQgKmNtcCogZnVuY3Rpb24uICBUaGlzIGlzXG4gICBiZWNhdXNlICpjbXAqIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgZWFjaCBsaXN0IGVsZW1lbnQgd2hpbGVcbiAgICprZXkqIGFuZCAqcmV2ZXJzZSogdG91Y2ggZWFjaCBlbGVtZW50IG9ubHkgb25jZS4gIFVzZVxuICAgYGBmdW5jdG9vbHMuY21wX3RvX2tleSgpYGAgdG8gY29udmVydCBhbiBvbGQtc3R5bGUgKmNtcCogZnVuY3Rpb25cbiAgIHRvIGEgKmtleSogZnVuY3Rpb24uXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjM6IFN1cHBvcnQgZm9yIGBgTm9uZWBgIGFzIGFuIGVxdWl2YWxlbnQgdG9cbiAgIG9taXR0aW5nICpjbXAqIHdhcyBhZGRlZC5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNDogU3VwcG9ydCBmb3IgKmtleSogYW5kICpyZXZlcnNlKiB3YXMgYWRkZWQuXG5cbjkuIFN0YXJ0aW5nIHdpdGggUHl0aG9uIDIuMywgdGhlIGBgc29ydCgpYGAgbWV0aG9kIGlzIGd1YXJhbnRlZWQgdG8gYmVcbiAgIHN0YWJsZS4gIEEgc29ydCBpcyBzdGFibGUgaWYgaXQgZ3VhcmFudGVlcyBub3QgdG8gY2hhbmdlIHRoZVxuICAgcmVsYXRpdmUgb3JkZXIgb2YgZWxlbWVudHMgdGhhdCBjb21wYXJlIGVxdWFsIC0tLSB0aGlzIGlzIGhlbHBmdWxcbiAgIGZvciBzb3J0aW5nIGluIG11bHRpcGxlIHBhc3NlcyAoZm9yIGV4YW1wbGUsIHNvcnQgYnkgZGVwYXJ0bWVudCxcbiAgIHRoZW4gYnkgc2FsYXJ5IGdyYWRlKS5cblxuMTAuICoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogV2hpbGUgYSBsaXN0IGlzIGJlaW5nIHNvcnRlZCxcbiAgICB0aGUgZWZmZWN0IG9mIGF0dGVtcHRpbmcgdG8gbXV0YXRlLCBvciBldmVuIGluc3BlY3QsIHRoZSBsaXN0IGlzXG4gICAgdW5kZWZpbmVkLiAgVGhlIEMgaW1wbGVtZW50YXRpb24gb2YgUHl0aG9uIDIuMyBhbmQgbmV3ZXIgbWFrZXMgdGhlXG4gICAgbGlzdCBhcHBlYXIgZW1wdHkgZm9yIHRoZSBkdXJhdGlvbiwgYW5kIHJhaXNlcyBgYFZhbHVlRXJyb3JgYCBpZlxuICAgIGl0IGNhbiBkZXRlY3QgdGhhdCB0aGUgbGlzdCBoYXMgYmVlbiBtdXRhdGVkIGR1cmluZyBhIHNvcnQuXG4nLAotICd0eXBlc3NlcS1tdXRhYmxlJzogdSJcbk11dGFibGUgU2VxdWVuY2UgVHlwZXNcbioqKioqKioqKioqKioqKioqKioqKipcblxuTGlzdCBhbmQgYGBieXRlYXJyYXlgYCBvYmplY3RzIHN1cHBvcnQgYWRkaXRpb25hbCBvcGVyYXRpb25zIHRoYXRcbmFsbG93IGluLXBsYWNlIG1vZGlmaWNhdGlvbiBvZiB0aGUgb2JqZWN0LiBPdGhlciBtdXRhYmxlIHNlcXVlbmNlXG50eXBlcyAod2hlbiBhZGRlZCB0byB0aGUgbGFuZ3VhZ2UpIHNob3VsZCBhbHNvIHN1cHBvcnQgdGhlc2Vcbm9wZXJhdGlvbnMuIFN0cmluZ3MgYW5kIHR1cGxlcyBhcmUgaW1tdXRhYmxlIHNlcXVlbmNlIHR5cGVzOiBzdWNoXG5vYmplY3RzIGNhbm5vdCBiZSBtb2RpZmllZCBvbmNlIGNyZWF0ZWQuIFRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyBhcmVcbmRlZmluZWQgb24gbXV0YWJsZSBzZXF1ZW5jZSB0eXBlcyAod2hlcmUgKngqIGlzIGFuIGFyYml0cmFyeSBvYmplY3QpOlxuXG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgT3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICAgIHwgUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgICAgICAgICAgICAgICAgfFxuKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT0rXG58IGBgc1tpXSA9IHhgYCAgICAgICAgICAgICAgICAgICB8IGl0ZW0gKmkqIG9mICpzKiBpcyByZXBsYWNlZCBieSAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKngqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgc1tpOmpdID0gdGBgICAgICAgICAgICAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogaXMgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVwbGFjZWQgYnkgdGhlIGNvbnRlbnRzIG9mIHRoZSAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpdGVyYWJsZSAqdCogICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBkZWwgc1tpOmpdYGAgICAgICAgICAgICAgICAgIHwgc2FtZSBhcyBgYHNbaTpqXSA9IFtdYGAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgc1tpOmo6a10gPSB0YGAgICAgICAgICAgICAgICB8IHRoZSBlbGVtZW50cyBvZiBgYHNbaTpqOmtdYGAgYXJlIHwgKDEpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVwbGFjZWQgYnkgdGhvc2Ugb2YgKnQqICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgZGVsIHNbaTpqOmtdYGAgICAgICAgICAgICAgICB8IHJlbW92ZXMgdGhlIGVsZW1lbnRzIG9mICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGBzW2k6ajprXWBgIGZyb20gdGhlIGxpc3QgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgcy5hcHBlbmQoeClgYCAgICAgICAgICAgICAgICB8IHNhbWUgYXMgYGBzW2xlbihzKTpsZW4ocyldID0gICAgIHwgKDIpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgW3hdYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgcy5leHRlbmQoeClgYCAgICAgICAgICAgICAgICB8IHNhbWUgYXMgYGBzW2xlbihzKTpsZW4ocyldID0geGBgIHwgKDMpICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHMuY291bnQoeClgYCAgICAgICAgICAgICAgICAgfCByZXR1cm4gbnVtYmVyIG9mICppKidzIGZvciB3aGljaCB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBgc1tpXSA9PSB4YGAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHMuaW5kZXgoeFssIGlbLCBqXV0pYGAgICAgICAgfCByZXR1cm4gc21hbGxlc3QgKmsqIHN1Y2ggdGhhdCAgICB8ICg0KSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBgc1trXSA9PSB4YGAgYW5kIGBgaSA8PSBrIDwgamBgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHMuaW5zZXJ0KGksIHgpYGAgICAgICAgICAgICAgfCBzYW1lIGFzIGBgc1tpOmldID0gW3hdYGAgICAgICAgICB8ICg1KSAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzLnBvcChbaV0pYGAgICAgICAgICAgICAgICAgIHwgc2FtZSBhcyBgYHggPSBzW2ldOyBkZWwgc1tpXTsgICAgfCAoNikgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXR1cm4geGBgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzLnJlbW92ZSh4KWBgICAgICAgICAgICAgICAgIHwgc2FtZSBhcyBgYGRlbCBzW3MuaW5kZXgoeCldYGAgICAgfCAoNCkgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgcy5yZXZlcnNlKClgYCAgICAgICAgICAgICAgICB8IHJldmVyc2VzIHRoZSBpdGVtcyBvZiAqcyogaW4gICAgIHwgKDcpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGxhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgcy5zb3J0KFtjbXBbLCBrZXlbLCAgICAgICAgICB8IHNvcnQgdGhlIGl0ZW1zIG9mICpzKiBpbiBwbGFjZSAgIHwgKDcpKDgpKDkpKDEwKSAgICAgICAgIHxcbnwgcmV2ZXJzZV1dXSlgYCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG5cbk5vdGVzOlxuXG4xLiAqdCogbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc2xpY2UgaXQgaXMgIHJlcGxhY2luZy5cblxuMi4gVGhlIEMgaW1wbGVtZW50YXRpb24gb2YgUHl0aG9uIGhhcyBoaXN0b3JpY2FsbHkgYWNjZXB0ZWQgbXVsdGlwbGVcbiAgIHBhcmFtZXRlcnMgYW5kIGltcGxpY2l0bHkgam9pbmVkIHRoZW0gaW50byBhIHR1cGxlOyB0aGlzIG5vIGxvbmdlclxuICAgd29ya3MgaW4gUHl0aG9uIDIuMC4gIFVzZSBvZiB0aGlzIG1pc2ZlYXR1cmUgaGFzIGJlZW4gZGVwcmVjYXRlZFxuICAgc2luY2UgUHl0aG9uIDEuNC5cblxuMy4gKngqIGNhbiBiZSBhbnkgaXRlcmFibGUgb2JqZWN0LlxuXG40LiBSYWlzZXMgYGBWYWx1ZUVycm9yYGAgd2hlbiAqeCogaXMgbm90IGZvdW5kIGluICpzKi4gV2hlbiBhIG5lZ2F0aXZlXG4gICBpbmRleCBpcyBwYXNzZWQgYXMgdGhlIHNlY29uZCBvciB0aGlyZCBwYXJhbWV0ZXIgdG8gdGhlIGBgaW5kZXgoKWBgXG4gICBtZXRob2QsIHRoZSBsaXN0IGxlbmd0aCBpcyBhZGRlZCwgYXMgZm9yIHNsaWNlIGluZGljZXMuICBJZiBpdCBpc1xuICAgc3RpbGwgbmVnYXRpdmUsIGl0IGlzIHRydW5jYXRlZCB0byB6ZXJvLCBhcyBmb3Igc2xpY2UgaW5kaWNlcy5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMzogUHJldmlvdXNseSwgYGBpbmRleCgpYGAgZGlkbid0IGhhdmVcbiAgIGFyZ3VtZW50cyBmb3Igc3BlY2lmeWluZyBzdGFydCBhbmQgc3RvcCBwb3NpdGlvbnMuXG5cbjUuIFdoZW4gYSBuZWdhdGl2ZSBpbmRleCBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciB0byB0aGVcbiAgIGBgaW5zZXJ0KClgYCBtZXRob2QsIHRoZSBsaXN0IGxlbmd0aCBpcyBhZGRlZCwgYXMgZm9yIHNsaWNlXG4gICBpbmRpY2VzLiAgSWYgaXQgaXMgc3RpbGwgbmVnYXRpdmUsIGl0IGlzIHRydW5jYXRlZCB0byB6ZXJvLCBhcyBmb3JcbiAgIHNsaWNlIGluZGljZXMuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjM6IFByZXZpb3VzbHksIGFsbCBuZWdhdGl2ZSBpbmRpY2VzIHdlcmVcbiAgIHRydW5jYXRlZCB0byB6ZXJvLlxuXG42LiBUaGUgYGBwb3AoKWBgIG1ldGhvZCBpcyBvbmx5IHN1cHBvcnRlZCBieSB0aGUgbGlzdCBhbmQgYXJyYXkgdHlwZXMuXG4gICBUaGUgb3B0aW9uYWwgYXJndW1lbnQgKmkqIGRlZmF1bHRzIHRvIGBgLTFgYCwgc28gdGhhdCBieSBkZWZhdWx0XG4gICB0aGUgbGFzdCBpdGVtIGlzIHJlbW92ZWQgYW5kIHJldHVybmVkLlxuXG43LiBUaGUgYGBzb3J0KClgYCBhbmQgYGByZXZlcnNlKClgYCBtZXRob2RzIG1vZGlmeSB0aGUgbGlzdCBpbiBwbGFjZVxuICAgZm9yIGVjb25vbXkgb2Ygc3BhY2Ugd2hlbiBzb3J0aW5nIG9yIHJldmVyc2luZyBhIGxhcmdlIGxpc3QuICBUb1xuICAgcmVtaW5kIHlvdSB0aGF0IHRoZXkgb3BlcmF0ZSBieSBzaWRlIGVmZmVjdCwgdGhleSBkb24ndCByZXR1cm4gdGhlXG4gICBzb3J0ZWQgb3IgcmV2ZXJzZWQgbGlzdC5cblxuOC4gVGhlIGBgc29ydCgpYGAgbWV0aG9kIHRha2VzIG9wdGlvbmFsIGFyZ3VtZW50cyBmb3IgY29udHJvbGxpbmcgdGhlXG4gICBjb21wYXJpc29ucy5cblxuICAgKmNtcCogc3BlY2lmaWVzIGEgY3VzdG9tIGNvbXBhcmlzb24gZnVuY3Rpb24gb2YgdHdvIGFyZ3VtZW50cyAobGlzdFxuICAgaXRlbXMpIHdoaWNoIHNob3VsZCByZXR1cm4gYSBuZWdhdGl2ZSwgemVybyBvciBwb3NpdGl2ZSBudW1iZXJcbiAgIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBjb25zaWRlcmVkIHNtYWxsZXIgdGhhbixcbiAgIGVxdWFsIHRvLCBvciBsYXJnZXIgdGhhbiB0aGUgc2Vjb25kIGFyZ3VtZW50OiBgYGNtcD1sYW1iZGEgeCx5OlxuICAgY21wKHgubG93ZXIoKSwgeS5sb3dlcigpKWBgLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGBOb25lYGAuXG5cbiAgICprZXkqIHNwZWNpZmllcyBhIGZ1bmN0aW9uIG9mIG9uZSBhcmd1bWVudCB0aGF0IGlzIHVzZWQgdG8gZXh0cmFjdFxuICAgYSBjb21wYXJpc29uIGtleSBmcm9tIGVhY2ggbGlzdCBlbGVtZW50OiBgYGtleT1zdHIubG93ZXJgYC4gIFRoZVxuICAgZGVmYXVsdCB2YWx1ZSBpcyBgYE5vbmVgYC5cblxuICAgKnJldmVyc2UqIGlzIGEgYm9vbGVhbiB2YWx1ZS4gIElmIHNldCB0byBgYFRydWVgYCwgdGhlbiB0aGUgbGlzdFxuICAgZWxlbWVudHMgYXJlIHNvcnRlZCBhcyBpZiBlYWNoIGNvbXBhcmlzb24gd2VyZSByZXZlcnNlZC5cblxuICAgSW4gZ2VuZXJhbCwgdGhlICprZXkqIGFuZCAqcmV2ZXJzZSogY29udmVyc2lvbiBwcm9jZXNzZXMgYXJlIG11Y2hcbiAgIGZhc3RlciB0aGFuIHNwZWNpZnlpbmcgYW4gZXF1aXZhbGVudCAqY21wKiBmdW5jdGlvbi4gIFRoaXMgaXNcbiAgIGJlY2F1c2UgKmNtcCogaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGZvciBlYWNoIGxpc3QgZWxlbWVudCB3aGlsZVxuICAgKmtleSogYW5kICpyZXZlcnNlKiB0b3VjaCBlYWNoIGVsZW1lbnQgb25seSBvbmNlLiAgVXNlXG4gICBgYGZ1bmN0b29scy5jbXBfdG9fa2V5KClgYCB0byBjb252ZXJ0IGFuIG9sZC1zdHlsZSAqY21wKiBmdW5jdGlvblxuICAgdG8gYSAqa2V5KiBmdW5jdGlvbi5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMzogU3VwcG9ydCBmb3IgYGBOb25lYGAgYXMgYW4gZXF1aXZhbGVudCB0b1xuICAgb21pdHRpbmcgKmNtcCogd2FzIGFkZGVkLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi40OiBTdXBwb3J0IGZvciAqa2V5KiBhbmQgKnJldmVyc2UqIHdhcyBhZGRlZC5cblxuOS4gU3RhcnRpbmcgd2l0aCBQeXRob24gMi4zLCB0aGUgYGBzb3J0KClgYCBtZXRob2QgaXMgZ3VhcmFudGVlZCB0byBiZVxuICAgc3RhYmxlLiAgQSBzb3J0IGlzIHN0YWJsZSBpZiBpdCBndWFyYW50ZWVzIG5vdCB0byBjaGFuZ2UgdGhlXG4gICByZWxhdGl2ZSBvcmRlciBvZiBlbGVtZW50cyB0aGF0IGNvbXBhcmUgZXF1YWwgLS0tIHRoaXMgaXMgaGVscGZ1bFxuICAgZm9yIHNvcnRpbmcgaW4gbXVsdGlwbGUgcGFzc2VzIChmb3IgZXhhbXBsZSwgc29ydCBieSBkZXBhcnRtZW50LFxuICAgdGhlbiBieSBzYWxhcnkgZ3JhZGUpLlxuXG4xMC4gKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBXaGlsZSBhIGxpc3QgaXMgYmVpbmcgc29ydGVkLFxuICAgIHRoZSBlZmZlY3Qgb2YgYXR0ZW1wdGluZyB0byBtdXRhdGUsIG9yIGV2ZW4gaW5zcGVjdCwgdGhlIGxpc3QgaXNcbiAgICB1bmRlZmluZWQuICBUaGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBQeXRob24gMi4zIGFuZCBuZXdlciBtYWtlcyB0aGVcbiAgICBsaXN0IGFwcGVhciBlbXB0eSBmb3IgdGhlIGR1cmF0aW9uLCBhbmQgcmFpc2VzIGBgVmFsdWVFcnJvcmBgIGlmXG4gICAgaXQgY2FuIGRldGVjdCB0aGF0IHRoZSBsaXN0IGhhcyBiZWVuIG11dGF0ZWQgZHVyaW5nIGEgc29ydC5cbiIsCi0gJ3VuYXJ5JzogdSdcblVuYXJ5IGFyaXRobWV0aWMgYW5kIGJpdHdpc2Ugb3BlcmF0aW9uc1xuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbkFsbCB1bmFyeSBhcml0aG1ldGljIGFuZCBiaXR3aXNlIG9wZXJhdGlvbnMgaGF2ZSB0aGUgc2FtZSBwcmlvcml0eTpcblxuICAgdV9leHByIDo6PSBwb3dlciB8ICItIiB1X2V4cHIgfCAiKyIgdV9leHByIHwgIn4iIHVfZXhwclxuXG5UaGUgdW5hcnkgYGAtYGAgKG1pbnVzKSBvcGVyYXRvciB5aWVsZHMgdGhlIG5lZ2F0aW9uIG9mIGl0cyBudW1lcmljXG5hcmd1bWVudC5cblxuVGhlIHVuYXJ5IGBgK2BgIChwbHVzKSBvcGVyYXRvciB5aWVsZHMgaXRzIG51bWVyaWMgYXJndW1lbnQgdW5jaGFuZ2VkLlxuXG5UaGUgdW5hcnkgYGB+YGAgKGludmVydCkgb3BlcmF0b3IgeWllbGRzIHRoZSBiaXR3aXNlIGludmVyc2lvbiBvZiBpdHNcbnBsYWluIG9yIGxvbmcgaW50ZWdlciBhcmd1bWVudC4gIFRoZSBiaXR3aXNlIGludmVyc2lvbiBvZiBgYHhgYCBpc1xuZGVmaW5lZCBhcyBgYC0oeCsxKWBgLiAgSXQgb25seSBhcHBsaWVzIHRvIGludGVncmFsIG51bWJlcnMuXG5cbkluIGFsbCB0aHJlZSBjYXNlcywgaWYgdGhlIGFyZ3VtZW50IGRvZXMgbm90IGhhdmUgdGhlIHByb3BlciB0eXBlLCBhXG5gYFR5cGVFcnJvcmBgIGV4Y2VwdGlvbiBpcyByYWlzZWQuXG4nLAotICd3aGlsZSc6IHUnXG5UaGUgYGB3aGlsZWBgIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKipcblxuVGhlIGBgd2hpbGVgYCBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgcmVwZWF0ZWQgZXhlY3V0aW9uIGFzIGxvbmcgYXMgYW5cbmV4cHJlc3Npb24gaXMgdHJ1ZTpcblxuICAgd2hpbGVfc3RtdCA6Oj0gIndoaWxlIiBleHByZXNzaW9uICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG5cblRoaXMgcmVwZWF0ZWRseSB0ZXN0cyB0aGUgZXhwcmVzc2lvbiBhbmQsIGlmIGl0IGlzIHRydWUsIGV4ZWN1dGVzIHRoZVxuZmlyc3Qgc3VpdGU7IGlmIHRoZSBleHByZXNzaW9uIGlzIGZhbHNlICh3aGljaCBtYXkgYmUgdGhlIGZpcnN0IHRpbWVcbml0IGlzIHRlc3RlZCkgdGhlIHN1aXRlIG9mIHRoZSBgYGVsc2VgYCBjbGF1c2UsIGlmIHByZXNlbnQsIGlzXG5leGVjdXRlZCBhbmQgdGhlIGxvb3AgdGVybWluYXRlcy5cblxuQSBgYGJyZWFrYGAgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSB0ZXJtaW5hdGVzIHRoZSBsb29wXG53aXRob3V0IGV4ZWN1dGluZyB0aGUgYGBlbHNlYGAgY2xhdXNlXCdzIHN1aXRlLiAgQSBgYGNvbnRpbnVlYGBcbnN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgc2tpcHMgdGhlIHJlc3Qgb2YgdGhlIHN1aXRlIGFuZFxuZ29lcyBiYWNrIHRvIHRlc3RpbmcgdGhlIGV4cHJlc3Npb24uXG4nLAotICd3aXRoJzogdSdcblRoZSBgYHdpdGhgYCBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKipcblxuTmV3IGluIHZlcnNpb24gMi41LlxuXG5UaGUgYGB3aXRoYGAgc3RhdGVtZW50IGlzIHVzZWQgdG8gd3JhcCB0aGUgZXhlY3V0aW9uIG9mIGEgYmxvY2sgd2l0aFxubWV0aG9kcyBkZWZpbmVkIGJ5IGEgY29udGV4dCBtYW5hZ2VyIChzZWUgc2VjdGlvbiAqV2l0aCBTdGF0ZW1lbnRcbkNvbnRleHQgTWFuYWdlcnMqKS4gVGhpcyBhbGxvd3MgY29tbW9uXG5gYHRyeWBgLi4uYGBleGNlcHRgYC4uLmBgZmluYWxseWBgIHVzYWdlIHBhdHRlcm5zIHRvIGJlIGVuY2Fwc3VsYXRlZFxuZm9yIGNvbnZlbmllbnQgcmV1c2UuXG5cbiAgIHdpdGhfc3RtdCA6Oj0gIndpdGgiIHdpdGhfaXRlbSAoIiwiIHdpdGhfaXRlbSkqICI6IiBzdWl0ZVxuICAgd2l0aF9pdGVtIDo6PSBleHByZXNzaW9uIFsiYXMiIHRhcmdldF1cblxuVGhlIGV4ZWN1dGlvbiBvZiB0aGUgYGB3aXRoYGAgc3RhdGVtZW50IHdpdGggb25lICJpdGVtIiBwcm9jZWVkcyBhc1xuZm9sbG93czpcblxuMS4gVGhlIGNvbnRleHQgZXhwcmVzc2lvbiAodGhlIGV4cHJlc3Npb24gZ2l2ZW4gaW4gdGhlICoqd2l0aF9pdGVtKiopXG4gICBpcyBldmFsdWF0ZWQgdG8gb2J0YWluIGEgY29udGV4dCBtYW5hZ2VyLlxuXG4yLiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzIGBgX19leGl0X18oKWBgIGlzIGxvYWRlZCBmb3IgbGF0ZXIgdXNlLlxuXG4zLiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzIGBgX19lbnRlcl9fKClgYCBtZXRob2QgaXMgaW52b2tlZC5cblxuNC4gSWYgYSB0YXJnZXQgd2FzIGluY2x1ZGVkIGluIHRoZSBgYHdpdGhgYCBzdGF0ZW1lbnQsIHRoZSByZXR1cm5cbiAgIHZhbHVlIGZyb20gYGBfX2VudGVyX18oKWBgIGlzIGFzc2lnbmVkIHRvIGl0LlxuXG4gICBOb3RlOiBUaGUgYGB3aXRoYGAgc3RhdGVtZW50IGd1YXJhbnRlZXMgdGhhdCBpZiB0aGUgYGBfX2VudGVyX18oKWBgXG4gICAgIG1ldGhvZCByZXR1cm5zIHdpdGhvdXQgYW4gZXJyb3IsIHRoZW4gYGBfX2V4aXRfXygpYGAgd2lsbCBhbHdheXNcbiAgICAgYmUgY2FsbGVkLiBUaHVzLCBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBhc3NpZ25tZW50IHRvIHRoZVxuICAgICB0YXJnZXQgbGlzdCwgaXQgd2lsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIGFuIGVycm9yIG9jY3VycmluZ1xuICAgICB3aXRoaW4gdGhlIHN1aXRlIHdvdWxkIGJlLiBTZWUgc3RlcCA2IGJlbG93LlxuXG41LiBUaGUgc3VpdGUgaXMgZXhlY3V0ZWQuXG5cbjYuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgYGBfX2V4aXRfXygpYGAgbWV0aG9kIGlzIGludm9rZWQuIElmIGFuXG4gICBleGNlcHRpb24gY2F1c2VkIHRoZSBzdWl0ZSB0byBiZSBleGl0ZWQsIGl0cyB0eXBlLCB2YWx1ZSwgYW5kXG4gICB0cmFjZWJhY2sgYXJlIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gYGBfX2V4aXRfXygpYGAuIE90aGVyd2lzZSxcbiAgIHRocmVlIGBgTm9uZWBgIGFyZ3VtZW50cyBhcmUgc3VwcGxpZWQuXG5cbiAgIElmIHRoZSBzdWl0ZSB3YXMgZXhpdGVkIGR1ZSB0byBhbiBleGNlcHRpb24sIGFuZCB0aGUgcmV0dXJuIHZhbHVlXG4gICBmcm9tIHRoZSBgYF9fZXhpdF9fKClgYCBtZXRob2Qgd2FzIGZhbHNlLCB0aGUgZXhjZXB0aW9uIGlzXG4gICByZXJhaXNlZC4gSWYgdGhlIHJldHVybiB2YWx1ZSB3YXMgdHJ1ZSwgdGhlIGV4Y2VwdGlvbiBpc1xuICAgc3VwcHJlc3NlZCwgYW5kIGV4ZWN1dGlvbiBjb250aW51ZXMgd2l0aCB0aGUgc3RhdGVtZW50IGZvbGxvd2luZ1xuICAgdGhlIGBgd2l0aGBgIHN0YXRlbWVudC5cblxuICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiBhbiBleGNlcHRpb24sIHRoZVxuICAgcmV0dXJuIHZhbHVlIGZyb20gYGBfX2V4aXRfXygpYGAgaXMgaWdub3JlZCwgYW5kIGV4ZWN1dGlvbiBwcm9jZWVkc1xuICAgYXQgdGhlIG5vcm1hbCBsb2NhdGlvbiBmb3IgdGhlIGtpbmQgb2YgZXhpdCB0aGF0IHdhcyB0YWtlbi5cblxuV2l0aCBtb3JlIHRoYW4gb25lIGl0ZW0sIHRoZSBjb250ZXh0IG1hbmFnZXJzIGFyZSBwcm9jZXNzZWQgYXMgaWZcbm11bHRpcGxlIGBgd2l0aGBgIHN0YXRlbWVudHMgd2VyZSBuZXN0ZWQ6XG5cbiAgIHdpdGggQSgpIGFzIGEsIEIoKSBhcyBiOlxuICAgICAgIHN1aXRlXG5cbmlzIGVxdWl2YWxlbnQgdG9cblxuICAgd2l0aCBBKCkgYXMgYTpcbiAgICAgICB3aXRoIEIoKSBhcyBiOlxuICAgICAgICAgICBzdWl0ZVxuXG5Ob3RlOiBJbiBQeXRob24gMi41LCB0aGUgYGB3aXRoYGAgc3RhdGVtZW50IGlzIG9ubHkgYWxsb3dlZCB3aGVuIHRoZVxuICBgYHdpdGhfc3RhdGVtZW50YGAgZmVhdHVyZSBoYXMgYmVlbiBlbmFibGVkLiAgSXQgaXMgYWx3YXlzIGVuYWJsZWRcbiAgaW4gUHl0aG9uIDIuNi5cblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNzogU3VwcG9ydCBmb3IgbXVsdGlwbGUgY29udGV4dCBleHByZXNzaW9ucy5cblxuU2VlIGFsc286XG5cbiAgICoqUEVQIDAzNDMqKiAtIFRoZSAid2l0aCIgc3RhdGVtZW50XG4gICAgICBUaGUgc3BlY2lmaWNhdGlvbiwgYmFja2dyb3VuZCwgYW5kIGV4YW1wbGVzIGZvciB0aGUgUHl0aG9uXG4gICAgICBgYHdpdGhgYCBzdGF0ZW1lbnQuXG4nLAotICd5aWVsZCc6IHUnXG5UaGUgYGB5aWVsZGBgIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKipcblxuICAgeWllbGRfc3RtdCA6Oj0geWllbGRfZXhwcmVzc2lvblxuXG5UaGUgYGB5aWVsZGBgIHN0YXRlbWVudCBpcyBvbmx5IHVzZWQgd2hlbiBkZWZpbmluZyBhIGdlbmVyYXRvclxuZnVuY3Rpb24sIGFuZCBpcyBvbmx5IHVzZWQgaW4gdGhlIGJvZHkgb2YgdGhlIGdlbmVyYXRvciBmdW5jdGlvbi5cblVzaW5nIGEgYGB5aWVsZGBgIHN0YXRlbWVudCBpbiBhIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgc3VmZmljaWVudCB0b1xuY2F1c2UgdGhhdCBkZWZpbml0aW9uIHRvIGNyZWF0ZSBhIGdlbmVyYXRvciBmdW5jdGlvbiBpbnN0ZWFkIG9mIGFcbm5vcm1hbCBmdW5jdGlvbi5cblxuV2hlbiBhIGdlbmVyYXRvciBmdW5jdGlvbiBpcyBjYWxsZWQsIGl0IHJldHVybnMgYW4gaXRlcmF0b3Iga25vd24gYXMgYVxuZ2VuZXJhdG9yIGl0ZXJhdG9yLCBvciBtb3JlIGNvbW1vbmx5LCBhIGdlbmVyYXRvci4gIFRoZSBib2R5IG9mIHRoZVxuZ2VuZXJhdG9yIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGJ5IGNhbGxpbmcgdGhlIGdlbmVyYXRvclwncyBgYG5leHQoKWBgXG5tZXRob2QgcmVwZWF0ZWRseSB1bnRpbCBpdCByYWlzZXMgYW4gZXhjZXB0aW9uLlxuXG5XaGVuIGEgYGB5aWVsZGBgIHN0YXRlbWVudCBpcyBleGVjdXRlZCwgdGhlIHN0YXRlIG9mIHRoZSBnZW5lcmF0b3IgaXNcbmZyb3plbiBhbmQgdGhlIHZhbHVlIG9mICoqZXhwcmVzc2lvbl9saXN0KiogaXMgcmV0dXJuZWQgdG9cbmBgbmV4dCgpYGBcJ3MgY2FsbGVyLiAgQnkgImZyb3plbiIgd2UgbWVhbiB0aGF0IGFsbCBsb2NhbCBzdGF0ZSBpc1xucmV0YWluZWQsIGluY2x1ZGluZyB0aGUgY3VycmVudCBiaW5kaW5ncyBvZiBsb2NhbCB2YXJpYWJsZXMsIHRoZVxuaW5zdHJ1Y3Rpb24gcG9pbnRlciwgYW5kIHRoZSBpbnRlcm5hbCBldmFsdWF0aW9uIHN0YWNrOiBlbm91Z2hcbmluZm9ybWF0aW9uIGlzIHNhdmVkIHNvIHRoYXQgdGhlIG5leHQgdGltZSBgYG5leHQoKWBgIGlzIGludm9rZWQsIHRoZVxuZnVuY3Rpb24gY2FuIHByb2NlZWQgZXhhY3RseSBhcyBpZiB0aGUgYGB5aWVsZGBgIHN0YXRlbWVudCB3ZXJlIGp1c3RcbmFub3RoZXIgZXh0ZXJuYWwgY2FsbC5cblxuQXMgb2YgUHl0aG9uIHZlcnNpb24gMi41LCB0aGUgYGB5aWVsZGBgIHN0YXRlbWVudCBpcyBub3cgYWxsb3dlZCBpblxudGhlIGBgdHJ5YGAgY2xhdXNlIG9mIGEgYGB0cnlgYCAuLi4gIGBgZmluYWxseWBgIGNvbnN0cnVjdC4gIElmIHRoZVxuZ2VuZXJhdG9yIGlzIG5vdCByZXN1bWVkIGJlZm9yZSBpdCBpcyBmaW5hbGl6ZWQgKGJ5IHJlYWNoaW5nIGEgemVyb1xucmVmZXJlbmNlIGNvdW50IG9yIGJ5IGJlaW5nIGdhcmJhZ2UgY29sbGVjdGVkKSwgdGhlIGdlbmVyYXRvci1cbml0ZXJhdG9yXCdzIGBgY2xvc2UoKWBgIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCwgYWxsb3dpbmcgYW55IHBlbmRpbmdcbmBgZmluYWxseWBgIGNsYXVzZXMgdG8gZXhlY3V0ZS5cblxuTm90ZTogSW4gUHl0aG9uIDIuMiwgdGhlIGBgeWllbGRgYCBzdGF0ZW1lbnQgd2FzIG9ubHkgYWxsb3dlZCB3aGVuIHRoZVxuICBgYGdlbmVyYXRvcnNgYCBmZWF0dXJlIGhhcyBiZWVuIGVuYWJsZWQuICBUaGlzIGBgX19mdXR1cmVfX2BgIGltcG9ydFxuICBzdGF0ZW1lbnQgd2FzIHVzZWQgdG8gZW5hYmxlIHRoZSBmZWF0dXJlOlxuXG4gICAgIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgZ2VuZXJhdG9yc1xuXG5TZWUgYWxzbzpcblxuICAgKipQRVAgMDI1NSoqIC0gU2ltcGxlIEdlbmVyYXRvcnNcbiAgICAgIFRoZSBwcm9wb3NhbCBmb3IgYWRkaW5nIGdlbmVyYXRvcnMgYW5kIHRoZSBgYHlpZWxkYGAgc3RhdGVtZW50XG4gICAgICB0byBQeXRob24uXG5cbiAgICoqUEVQIDAzNDIqKiAtIENvcm91dGluZXMgdmlhIEVuaGFuY2VkIEdlbmVyYXRvcnNcbiAgICAgIFRoZSBwcm9wb3NhbCB0aGF0LCBhbW9uZyBvdGhlciBnZW5lcmF0b3IgZW5oYW5jZW1lbnRzLCBwcm9wb3NlZFxuICAgICAgYWxsb3dpbmcgYGB5aWVsZGBgIHRvIGFwcGVhciBpbnNpZGUgYSBgYHRyeWBgIC4uLiBgYGZpbmFsbHlgYFxuICAgICAgYmxvY2suXG4nfQorIyBBdXRvZ2VuZXJhdGVkIGJ5IFNwaGlueCBvbiBTdW4gSnVuIDI5IDE4OjU1OjI1IDIwMTQKK3RvcGljcyA9IHsnYXNzZXJ0JzogJ1xuVGhlIGBgYXNzZXJ0YGAgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKioqKipcblxuQXNzZXJ0IHN0YXRlbWVudHMgYXJlIGEgY29udmVuaWVudCB3YXkgdG8gaW5zZXJ0IGRlYnVnZ2luZyBhc3NlcnRpb25zXG5pbnRvIGEgcHJvZ3JhbTpcblxuICAgYXNzZXJ0X3N0bXQgOjo9ICJhc3NlcnQiIGV4cHJlc3Npb24gWyIsIiBleHByZXNzaW9uXVxuXG5UaGUgc2ltcGxlIGZvcm0sIGBgYXNzZXJ0IGV4cHJlc3Npb25gYCwgaXMgZXF1aXZhbGVudCB0b1xuXG4gICBpZiBfX2RlYnVnX186XG4gICAgICBpZiBub3QgZXhwcmVzc2lvbjogcmFpc2UgQXNzZXJ0aW9uRXJyb3JcblxuVGhlIGV4dGVuZGVkIGZvcm0sIGBgYXNzZXJ0IGV4cHJlc3Npb24xLCBleHByZXNzaW9uMmBgLCBpcyBlcXVpdmFsZW50XG50b1xuXG4gICBpZiBfX2RlYnVnX186XG4gICAgICBpZiBub3QgZXhwcmVzc2lvbjE6IHJhaXNlIEFzc2VydGlvbkVycm9yKGV4cHJlc3Npb24yKVxuXG5UaGVzZSBlcXVpdmFsZW5jZXMgYXNzdW1lIHRoYXQgYGBfX2RlYnVnX19gYCBhbmQgYGBBc3NlcnRpb25FcnJvcmBgXG5yZWZlciB0byB0aGUgYnVpbHQtaW4gdmFyaWFibGVzIHdpdGggdGhvc2UgbmFtZXMuICBJbiB0aGUgY3VycmVudFxuaW1wbGVtZW50YXRpb24sIHRoZSBidWlsdC1pbiB2YXJpYWJsZSBgYF9fZGVidWdfX2BgIGlzIGBgVHJ1ZWBgIHVuZGVyXG5ub3JtYWwgY2lyY3Vtc3RhbmNlcywgYGBGYWxzZWBgIHdoZW4gb3B0aW1pemF0aW9uIGlzIHJlcXVlc3RlZFxuKGNvbW1hbmQgbGluZSBvcHRpb24gLU8pLiAgVGhlIGN1cnJlbnQgY29kZSBnZW5lcmF0b3IgZW1pdHMgbm8gY29kZVxuZm9yIGFuIGFzc2VydCBzdGF0ZW1lbnQgd2hlbiBvcHRpbWl6YXRpb24gaXMgcmVxdWVzdGVkIGF0IGNvbXBpbGVcbnRpbWUuICBOb3RlIHRoYXQgaXQgaXMgdW5uZWNlc3NhcnkgdG8gaW5jbHVkZSB0aGUgc291cmNlIGNvZGUgZm9yIHRoZVxuZXhwcmVzc2lvbiB0aGF0IGZhaWxlZCBpbiB0aGUgZXJyb3IgbWVzc2FnZTsgaXQgd2lsbCBiZSBkaXNwbGF5ZWQgYXNcbnBhcnQgb2YgdGhlIHN0YWNrIHRyYWNlLlxuXG5Bc3NpZ25tZW50cyB0byBgYF9fZGVidWdfX2BgIGFyZSBpbGxlZ2FsLiAgVGhlIHZhbHVlIGZvciB0aGUgYnVpbHQtaW5cbnZhcmlhYmxlIGlzIGRldGVybWluZWQgd2hlbiB0aGUgaW50ZXJwcmV0ZXIgc3RhcnRzLlxuJywKKyAnYXNzaWdubWVudCc6ICdcbkFzc2lnbm1lbnQgc3RhdGVtZW50c1xuKioqKioqKioqKioqKioqKioqKioqXG5cbkFzc2lnbm1lbnQgc3RhdGVtZW50cyBhcmUgdXNlZCB0byAocmUpYmluZCBuYW1lcyB0byB2YWx1ZXMgYW5kIHRvXG5tb2RpZnkgYXR0cmlidXRlcyBvciBpdGVtcyBvZiBtdXRhYmxlIG9iamVjdHM6XG5cbiAgIGFzc2lnbm1lbnRfc3RtdCA6Oj0gKHRhcmdldF9saXN0ICI9IikrIChleHByZXNzaW9uX2xpc3QgfCB5aWVsZF9leHByZXNzaW9uKVxuICAgdGFyZ2V0X2xpc3QgICAgIDo6PSB0YXJnZXQgKCIsIiB0YXJnZXQpKiBbIiwiXVxuICAgdGFyZ2V0ICAgICAgICAgIDo6PSBpZGVudGlmaWVyXG4gICAgICAgICAgICAgIHwgIigiIHRhcmdldF9saXN0ICIpIlxuICAgICAgICAgICAgICB8ICJbIiB0YXJnZXRfbGlzdCAiXSJcbiAgICAgICAgICAgICAgfCBhdHRyaWJ1dGVyZWZcbiAgICAgICAgICAgICAgfCBzdWJzY3JpcHRpb25cbiAgICAgICAgICAgICAgfCBzbGljaW5nXG5cbihTZWUgc2VjdGlvbiAqUHJpbWFyaWVzKiBmb3IgdGhlIHN5bnRheCBkZWZpbml0aW9ucyBmb3IgdGhlIGxhc3QgdGhyZWVcbnN5bWJvbHMuKVxuXG5BbiBhc3NpZ25tZW50IHN0YXRlbWVudCBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gbGlzdCAocmVtZW1iZXIgdGhhdFxudGhpcyBjYW4gYmUgYSBzaW5nbGUgZXhwcmVzc2lvbiBvciBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0LCB0aGUgbGF0dGVyXG55aWVsZGluZyBhIHR1cGxlKSBhbmQgYXNzaWducyB0aGUgc2luZ2xlIHJlc3VsdGluZyBvYmplY3QgdG8gZWFjaCBvZlxudGhlIHRhcmdldCBsaXN0cywgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuXG5Bc3NpZ25tZW50IGlzIGRlZmluZWQgcmVjdXJzaXZlbHkgZGVwZW5kaW5nIG9uIHRoZSBmb3JtIG9mIHRoZSB0YXJnZXRcbihsaXN0KS4gV2hlbiBhIHRhcmdldCBpcyBwYXJ0IG9mIGEgbXV0YWJsZSBvYmplY3QgKGFuIGF0dHJpYnV0ZVxucmVmZXJlbmNlLCBzdWJzY3JpcHRpb24gb3Igc2xpY2luZyksIHRoZSBtdXRhYmxlIG9iamVjdCBtdXN0XG51bHRpbWF0ZWx5IHBlcmZvcm0gdGhlIGFzc2lnbm1lbnQgYW5kIGRlY2lkZSBhYm91dCBpdHMgdmFsaWRpdHksIGFuZFxubWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgYXNzaWdubWVudCBpcyB1bmFjY2VwdGFibGUuICBUaGUgcnVsZXNcbm9ic2VydmVkIGJ5IHZhcmlvdXMgdHlwZXMgYW5kIHRoZSBleGNlcHRpb25zIHJhaXNlZCBhcmUgZ2l2ZW4gd2l0aCB0aGVcbmRlZmluaXRpb24gb2YgdGhlIG9iamVjdCB0eXBlcyAoc2VlIHNlY3Rpb24gKlRoZSBzdGFuZGFyZCB0eXBlXG5oaWVyYXJjaHkqKS5cblxuQXNzaWdubWVudCBvZiBhbiBvYmplY3QgdG8gYSB0YXJnZXQgbGlzdCBpcyByZWN1cnNpdmVseSBkZWZpbmVkIGFzXG5mb2xsb3dzLlxuXG4qIElmIHRoZSB0YXJnZXQgbGlzdCBpcyBhIHNpbmdsZSB0YXJnZXQ6IFRoZSBvYmplY3QgaXMgYXNzaWduZWQgdG9cbiAgdGhhdCB0YXJnZXQuXG5cbiogSWYgdGhlIHRhcmdldCBsaXN0IGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGFyZ2V0czogVGhlIG9iamVjdFxuICBtdXN0IGJlIGFuIGl0ZXJhYmxlIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGl0ZW1zIGFzIHRoZXJlIGFyZVxuICB0YXJnZXRzIGluIHRoZSB0YXJnZXQgbGlzdCwgYW5kIHRoZSBpdGVtcyBhcmUgYXNzaWduZWQsIGZyb20gbGVmdCB0b1xuICByaWdodCwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdGFyZ2V0cy5cblxuQXNzaWdubWVudCBvZiBhbiBvYmplY3QgdG8gYSBzaW5nbGUgdGFyZ2V0IGlzIHJlY3Vyc2l2ZWx5IGRlZmluZWQgYXNcbmZvbGxvd3MuXG5cbiogSWYgdGhlIHRhcmdldCBpcyBhbiBpZGVudGlmaWVyIChuYW1lKTpcblxuICAqIElmIHRoZSBuYW1lIGRvZXMgbm90IG9jY3VyIGluIGEgYGBnbG9iYWxgYCBzdGF0ZW1lbnQgaW4gdGhlXG4gICAgY3VycmVudCBjb2RlIGJsb2NrOiB0aGUgbmFtZSBpcyBib3VuZCB0byB0aGUgb2JqZWN0IGluIHRoZSBjdXJyZW50XG4gICAgbG9jYWwgbmFtZXNwYWNlLlxuXG4gICogT3RoZXJ3aXNlOiB0aGUgbmFtZSBpcyBib3VuZCB0byB0aGUgb2JqZWN0IGluIHRoZSBjdXJyZW50IGdsb2JhbFxuICAgIG5hbWVzcGFjZS5cblxuICBUaGUgbmFtZSBpcyByZWJvdW5kIGlmIGl0IHdhcyBhbHJlYWR5IGJvdW5kLiAgVGhpcyBtYXkgY2F1c2UgdGhlXG4gIHJlZmVyZW5jZSBjb3VudCBmb3IgdGhlIG9iamVjdCBwcmV2aW91c2x5IGJvdW5kIHRvIHRoZSBuYW1lIHRvIHJlYWNoXG4gIHplcm8sIGNhdXNpbmcgdGhlIG9iamVjdCB0byBiZSBkZWFsbG9jYXRlZCBhbmQgaXRzIGRlc3RydWN0b3IgKGlmIGl0XG4gIGhhcyBvbmUpIHRvIGJlIGNhbGxlZC5cblxuKiBJZiB0aGUgdGFyZ2V0IGlzIGEgdGFyZ2V0IGxpc3QgZW5jbG9zZWQgaW4gcGFyZW50aGVzZXMgb3IgaW4gc3F1YXJlXG4gIGJyYWNrZXRzOiBUaGUgb2JqZWN0IG11c3QgYmUgYW4gaXRlcmFibGUgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2ZcbiAgaXRlbXMgYXMgdGhlcmUgYXJlIHRhcmdldHMgaW4gdGhlIHRhcmdldCBsaXN0LCBhbmQgaXRzIGl0ZW1zIGFyZVxuICBhc3NpZ25lZCwgZnJvbSBsZWZ0IHRvIHJpZ2h0LCB0byB0aGUgY29ycmVzcG9uZGluZyB0YXJnZXRzLlxuXG4qIElmIHRoZSB0YXJnZXQgaXMgYW4gYXR0cmlidXRlIHJlZmVyZW5jZTogVGhlIHByaW1hcnkgZXhwcmVzc2lvbiBpblxuICB0aGUgcmVmZXJlbmNlIGlzIGV2YWx1YXRlZC4gIEl0IHNob3VsZCB5aWVsZCBhbiBvYmplY3Qgd2l0aFxuICBhc3NpZ25hYmxlIGF0dHJpYnV0ZXM7IGlmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBgYFR5cGVFcnJvcmBgIGlzXG4gIHJhaXNlZC4gIFRoYXQgb2JqZWN0IGlzIHRoZW4gYXNrZWQgdG8gYXNzaWduIHRoZSBhc3NpZ25lZCBvYmplY3QgdG9cbiAgdGhlIGdpdmVuIGF0dHJpYnV0ZTsgaWYgaXQgY2Fubm90IHBlcmZvcm0gdGhlIGFzc2lnbm1lbnQsIGl0IHJhaXNlc1xuICBhbiBleGNlcHRpb24gKHVzdWFsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSBgYEF0dHJpYnV0ZUVycm9yYGApLlxuXG4gIE5vdGU6IElmIHRoZSBvYmplY3QgaXMgYSBjbGFzcyBpbnN0YW5jZSBhbmQgdGhlIGF0dHJpYnV0ZSByZWZlcmVuY2VcbiAgb2NjdXJzIG9uIGJvdGggc2lkZXMgb2YgdGhlIGFzc2lnbm1lbnQgb3BlcmF0b3IsIHRoZSBSSFMgZXhwcmVzc2lvbixcbiAgYGBhLnhgYCBjYW4gYWNjZXNzIGVpdGhlciBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgb3IgKGlmIG5vIGluc3RhbmNlXG4gIGF0dHJpYnV0ZSBleGlzdHMpIGEgY2xhc3MgYXR0cmlidXRlLiAgVGhlIExIUyB0YXJnZXQgYGBhLnhgYCBpc1xuICBhbHdheXMgc2V0IGFzIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSwgY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LlxuICBUaHVzLCB0aGUgdHdvIG9jY3VycmVuY2VzIG9mIGBgYS54YGAgZG8gbm90IG5lY2Vzc2FyaWx5IHJlZmVyIHRvIHRoZVxuICBzYW1lIGF0dHJpYnV0ZTogaWYgdGhlIFJIUyBleHByZXNzaW9uIHJlZmVycyB0byBhIGNsYXNzIGF0dHJpYnV0ZSxcbiAgdGhlIExIUyBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIGF0dHJpYnV0ZSBhcyB0aGUgdGFyZ2V0IG9mIHRoZVxuICBhc3NpZ25tZW50OlxuXG4gICAgIGNsYXNzIENsczpcbiAgICAgICAgIHggPSAzICAgICAgICAgICAgICMgY2xhc3MgdmFyaWFibGVcbiAgICAgaW5zdCA9IENscygpXG4gICAgIGluc3QueCA9IGluc3QueCArIDEgICAjIHdyaXRlcyBpbnN0LnggYXMgNCBsZWF2aW5nIENscy54IGFzIDNcblxuICBUaGlzIGRlc2NyaXB0aW9uIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGFwcGx5IHRvIGRlc2NyaXB0b3JcbiAgYXR0cmlidXRlcywgc3VjaCBhcyBwcm9wZXJ0aWVzIGNyZWF0ZWQgd2l0aCBgYHByb3BlcnR5KClgYC5cblxuKiBJZiB0aGUgdGFyZ2V0IGlzIGEgc3Vic2NyaXB0aW9uOiBUaGUgcHJpbWFyeSBleHByZXNzaW9uIGluIHRoZVxuICByZWZlcmVuY2UgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGVpdGhlciBhIG11dGFibGUgc2VxdWVuY2VcbiAgb2JqZWN0IChzdWNoIGFzIGEgbGlzdCkgb3IgYSBtYXBwaW5nIG9iamVjdCAoc3VjaCBhcyBhIGRpY3Rpb25hcnkpLlxuICBOZXh0LCB0aGUgc3Vic2NyaXB0IGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkLlxuXG4gIElmIHRoZSBwcmltYXJ5IGlzIGEgbXV0YWJsZSBzZXF1ZW5jZSBvYmplY3QgKHN1Y2ggYXMgYSBsaXN0KSwgdGhlXG4gIHN1YnNjcmlwdCBtdXN0IHlpZWxkIGEgcGxhaW4gaW50ZWdlci4gIElmIGl0IGlzIG5lZ2F0aXZlLCB0aGVcbiAgc2VxdWVuY2VcJ3MgbGVuZ3RoIGlzIGFkZGVkIHRvIGl0LiBUaGUgcmVzdWx0aW5nIHZhbHVlIG11c3QgYmUgYVxuICBub25uZWdhdGl2ZSBpbnRlZ2VyIGxlc3MgdGhhbiB0aGUgc2VxdWVuY2VcJ3MgbGVuZ3RoLCBhbmQgdGhlXG4gIHNlcXVlbmNlIGlzIGFza2VkIHRvIGFzc2lnbiB0aGUgYXNzaWduZWQgb2JqZWN0IHRvIGl0cyBpdGVtIHdpdGhcbiAgdGhhdCBpbmRleC4gIElmIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UsIGBgSW5kZXhFcnJvcmBgIGlzIHJhaXNlZFxuICAoYXNzaWdubWVudCB0byBhIHN1YnNjcmlwdGVkIHNlcXVlbmNlIGNhbm5vdCBhZGQgbmV3IGl0ZW1zIHRvIGFcbiAgbGlzdCkuXG5cbiAgSWYgdGhlIHByaW1hcnkgaXMgYSBtYXBwaW5nIG9iamVjdCAoc3VjaCBhcyBhIGRpY3Rpb25hcnkpLCB0aGVcbiAgc3Vic2NyaXB0IG11c3QgaGF2ZSBhIHR5cGUgY29tcGF0aWJsZSB3aXRoIHRoZSBtYXBwaW5nXCdzIGtleSB0eXBlLFxuICBhbmQgdGhlIG1hcHBpbmcgaXMgdGhlbiBhc2tlZCB0byBjcmVhdGUgYSBrZXkvZGF0dW0gcGFpciB3aGljaCBtYXBzXG4gIHRoZSBzdWJzY3JpcHQgdG8gdGhlIGFzc2lnbmVkIG9iamVjdC4gIFRoaXMgY2FuIGVpdGhlciByZXBsYWNlIGFuXG4gIGV4aXN0aW5nIGtleS92YWx1ZSBwYWlyIHdpdGggdGhlIHNhbWUga2V5IHZhbHVlLCBvciBpbnNlcnQgYSBuZXdcbiAga2V5L3ZhbHVlIHBhaXIgKGlmIG5vIGtleSB3aXRoIHRoZSBzYW1lIHZhbHVlIGV4aXN0ZWQpLlxuXG4qIElmIHRoZSB0YXJnZXQgaXMgYSBzbGljaW5nOiBUaGUgcHJpbWFyeSBleHByZXNzaW9uIGluIHRoZSByZWZlcmVuY2VcbiAgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGEgbXV0YWJsZSBzZXF1ZW5jZSBvYmplY3QgKHN1Y2ggYXMgYVxuICBsaXN0KS4gIFRoZSBhc3NpZ25lZCBvYmplY3Qgc2hvdWxkIGJlIGEgc2VxdWVuY2Ugb2JqZWN0IG9mIHRoZSBzYW1lXG4gIHR5cGUuICBOZXh0LCB0aGUgbG93ZXIgYW5kIHVwcGVyIGJvdW5kIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQsXG4gIGluc29mYXIgdGhleSBhcmUgcHJlc2VudDsgZGVmYXVsdHMgYXJlIHplcm8gYW5kIHRoZSBzZXF1ZW5jZVwnc1xuICBsZW5ndGguICBUaGUgYm91bmRzIHNob3VsZCBldmFsdWF0ZSB0byAoc21hbGwpIGludGVnZXJzLiAgSWYgZWl0aGVyXG4gIGJvdW5kIGlzIG5lZ2F0aXZlLCB0aGUgc2VxdWVuY2VcJ3MgbGVuZ3RoIGlzIGFkZGVkIHRvIGl0LiBUaGVcbiAgcmVzdWx0aW5nIGJvdW5kcyBhcmUgY2xpcHBlZCB0byBsaWUgYmV0d2VlbiB6ZXJvIGFuZCB0aGUgc2VxdWVuY2VcJ3NcbiAgbGVuZ3RoLCBpbmNsdXNpdmUuICBGaW5hbGx5LCB0aGUgc2VxdWVuY2Ugb2JqZWN0IGlzIGFza2VkIHRvIHJlcGxhY2VcbiAgdGhlIHNsaWNlIHdpdGggdGhlIGl0ZW1zIG9mIHRoZSBhc3NpZ25lZCBzZXF1ZW5jZS4gIFRoZSBsZW5ndGggb2ZcbiAgdGhlIHNsaWNlIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgbGVuZ3RoIG9mIHRoZSBhc3NpZ25lZCBzZXF1ZW5jZSxcbiAgdGh1cyBjaGFuZ2luZyB0aGUgbGVuZ3RoIG9mIHRoZSB0YXJnZXQgc2VxdWVuY2UsIGlmIHRoZSBvYmplY3RcbiAgYWxsb3dzIGl0LlxuXG4qKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCB0aGVcbnN5bnRheCBmb3IgdGFyZ2V0cyBpcyB0YWtlbiB0byBiZSB0aGUgc2FtZSBhcyBmb3IgZXhwcmVzc2lvbnMsIGFuZFxuaW52YWxpZCBzeW50YXggaXMgcmVqZWN0ZWQgZHVyaW5nIHRoZSBjb2RlIGdlbmVyYXRpb24gcGhhc2UsIGNhdXNpbmdcbmxlc3MgZGV0YWlsZWQgZXJyb3IgbWVzc2FnZXMuXG5cbldBUk5JTkc6IEFsdGhvdWdoIHRoZSBkZWZpbml0aW9uIG9mIGFzc2lnbm1lbnQgaW1wbGllcyB0aGF0IG92ZXJsYXBzXG5iZXR3ZWVuIHRoZSBsZWZ0LWhhbmQgc2lkZSBhbmQgdGhlIHJpZ2h0LWhhbmQgc2lkZSBhcmUgXCdzYWZlXCcgKGZvclxuZXhhbXBsZSBgYGEsIGIgPSBiLCBhYGAgc3dhcHMgdHdvIHZhcmlhYmxlcyksIG92ZXJsYXBzICp3aXRoaW4qIHRoZVxuY29sbGVjdGlvbiBvZiBhc3NpZ25lZC10byB2YXJpYWJsZXMgYXJlIG5vdCBzYWZlISAgRm9yIGluc3RhbmNlLCB0aGVcbmZvbGxvd2luZyBwcm9ncmFtIHByaW50cyBgYFswLCAyXWBgOlxuXG4gICB4ID0gWzAsIDFdXG4gICBpID0gMFxuICAgaSwgeFtpXSA9IDEsIDJcbiAgIHByaW50IHhcblxuXG5BdWdtZW50ZWQgYXNzaWdubWVudCBzdGF0ZW1lbnRzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbkF1Z21lbnRlZCBhc3NpZ25tZW50IGlzIHRoZSBjb21iaW5hdGlvbiwgaW4gYSBzaW5nbGUgc3RhdGVtZW50LCBvZiBhXG5iaW5hcnkgb3BlcmF0aW9uIGFuZCBhbiBhc3NpZ25tZW50IHN0YXRlbWVudDpcblxuICAgYXVnbWVudGVkX2Fzc2lnbm1lbnRfc3RtdCA6Oj0gYXVndGFyZ2V0IGF1Z29wIChleHByZXNzaW9uX2xpc3QgfCB5aWVsZF9leHByZXNzaW9uKVxuICAgYXVndGFyZ2V0ICAgICAgICAgICAgICAgICA6Oj0gaWRlbnRpZmllciB8IGF0dHJpYnV0ZXJlZiB8IHN1YnNjcmlwdGlvbiB8IHNsaWNpbmdcbiAgIGF1Z29wICAgICAgICAgICAgICAgICAgICAgOjo9ICIrPSIgfCAiLT0iIHwgIio9IiB8ICIvPSIgfCAiLy89IiB8ICIlPSIgfCAiKio9IlxuICAgICAgICAgICAgIHwgIj4+PSIgfCAiPDw9IiB8ICImPSIgfCAiXj0iIHwgInw9IlxuXG4oU2VlIHNlY3Rpb24gKlByaW1hcmllcyogZm9yIHRoZSBzeW50YXggZGVmaW5pdGlvbnMgZm9yIHRoZSBsYXN0IHRocmVlXG5zeW1ib2xzLilcblxuQW4gYXVnbWVudGVkIGFzc2lnbm1lbnQgZXZhbHVhdGVzIHRoZSB0YXJnZXQgKHdoaWNoLCB1bmxpa2Ugbm9ybWFsXG5hc3NpZ25tZW50IHN0YXRlbWVudHMsIGNhbm5vdCBiZSBhbiB1bnBhY2tpbmcpIGFuZCB0aGUgZXhwcmVzc2lvblxubGlzdCwgcGVyZm9ybXMgdGhlIGJpbmFyeSBvcGVyYXRpb24gc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgYXNzaWdubWVudFxub24gdGhlIHR3byBvcGVyYW5kcywgYW5kIGFzc2lnbnMgdGhlIHJlc3VsdCB0byB0aGUgb3JpZ2luYWwgdGFyZ2V0LlxuVGhlIHRhcmdldCBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLlxuXG5BbiBhdWdtZW50ZWQgYXNzaWdubWVudCBleHByZXNzaW9uIGxpa2UgYGB4ICs9IDFgYCBjYW4gYmUgcmV3cml0dGVuIGFzXG5gYHggPSB4ICsgMWBgIHRvIGFjaGlldmUgYSBzaW1pbGFyLCBidXQgbm90IGV4YWN0bHkgZXF1YWwgZWZmZWN0LiBJblxudGhlIGF1Z21lbnRlZCB2ZXJzaW9uLCBgYHhgYCBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLiBBbHNvLCB3aGVuXG5wb3NzaWJsZSwgdGhlIGFjdHVhbCBvcGVyYXRpb24gaXMgcGVyZm9ybWVkICppbi1wbGFjZSosIG1lYW5pbmcgdGhhdFxucmF0aGVyIHRoYW4gY3JlYXRpbmcgYSBuZXcgb2JqZWN0IGFuZCBhc3NpZ25pbmcgdGhhdCB0byB0aGUgdGFyZ2V0LFxudGhlIG9sZCBvYmplY3QgaXMgbW9kaWZpZWQgaW5zdGVhZC5cblxuV2l0aCB0aGUgZXhjZXB0aW9uIG9mIGFzc2lnbmluZyB0byB0dXBsZXMgYW5kIG11bHRpcGxlIHRhcmdldHMgaW4gYVxuc2luZ2xlIHN0YXRlbWVudCwgdGhlIGFzc2lnbm1lbnQgZG9uZSBieSBhdWdtZW50ZWQgYXNzaWdubWVudFxuc3RhdGVtZW50cyBpcyBoYW5kbGVkIHRoZSBzYW1lIHdheSBhcyBub3JtYWwgYXNzaWdubWVudHMuIFNpbWlsYXJseSxcbndpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgcG9zc2libGUgKmluLXBsYWNlKiBiZWhhdmlvciwgdGhlIGJpbmFyeVxub3BlcmF0aW9uIHBlcmZvcm1lZCBieSBhdWdtZW50ZWQgYXNzaWdubWVudCBpcyB0aGUgc2FtZSBhcyB0aGUgbm9ybWFsXG5iaW5hcnkgb3BlcmF0aW9ucy5cblxuRm9yIHRhcmdldHMgd2hpY2ggYXJlIGF0dHJpYnV0ZSByZWZlcmVuY2VzLCB0aGUgc2FtZSAqY2F2ZWF0IGFib3V0XG5jbGFzcyBhbmQgaW5zdGFuY2UgYXR0cmlidXRlcyogYXBwbGllcyBhcyBmb3IgcmVndWxhciBhc3NpZ25tZW50cy5cbicsCisgJ2F0b20taWRlbnRpZmllcnMnOiAnXG5JZGVudGlmaWVycyAoTmFtZXMpXG4qKioqKioqKioqKioqKioqKioqXG5cbkFuIGlkZW50aWZpZXIgb2NjdXJyaW5nIGFzIGFuIGF0b20gaXMgYSBuYW1lLiAgU2VlIHNlY3Rpb25cbipJZGVudGlmaWVycyBhbmQga2V5d29yZHMqIGZvciBsZXhpY2FsIGRlZmluaXRpb24gYW5kIHNlY3Rpb24gKk5hbWluZ1xuYW5kIGJpbmRpbmcqIGZvciBkb2N1bWVudGF0aW9uIG9mIG5hbWluZyBhbmQgYmluZGluZy5cblxuV2hlbiB0aGUgbmFtZSBpcyBib3VuZCB0byBhbiBvYmplY3QsIGV2YWx1YXRpb24gb2YgdGhlIGF0b20geWllbGRzXG50aGF0IG9iamVjdC4gV2hlbiBhIG5hbWUgaXMgbm90IGJvdW5kLCBhbiBhdHRlbXB0IHRvIGV2YWx1YXRlIGl0XG5yYWlzZXMgYSBgYE5hbWVFcnJvcmBgIGV4Y2VwdGlvbi5cblxuKipQcml2YXRlIG5hbWUgbWFuZ2xpbmc6KiogV2hlbiBhbiBpZGVudGlmaWVyIHRoYXQgdGV4dHVhbGx5IG9jY3VycyBpblxuYSBjbGFzcyBkZWZpbml0aW9uIGJlZ2lucyB3aXRoIHR3byBvciBtb3JlIHVuZGVyc2NvcmUgY2hhcmFjdGVycyBhbmRcbmRvZXMgbm90IGVuZCBpbiB0d28gb3IgbW9yZSB1bmRlcnNjb3JlcywgaXQgaXMgY29uc2lkZXJlZCBhICpwcml2YXRlXG5uYW1lKiBvZiB0aGF0IGNsYXNzLiBQcml2YXRlIG5hbWVzIGFyZSB0cmFuc2Zvcm1lZCB0byBhIGxvbmdlciBmb3JtXG5iZWZvcmUgY29kZSBpcyBnZW5lcmF0ZWQgZm9yIHRoZW0uICBUaGUgdHJhbnNmb3JtYXRpb24gaW5zZXJ0cyB0aGVcbmNsYXNzIG5hbWUsIHdpdGggbGVhZGluZyB1bmRlcnNjb3JlcyByZW1vdmVkIGFuZCBhIHNpbmdsZSB1bmRlcnNjb3JlXG5pbnNlcnRlZCwgaW4gZnJvbnQgb2YgdGhlIG5hbWUuICBGb3IgZXhhbXBsZSwgdGhlIGlkZW50aWZpZXJcbmBgX19zcGFtYGAgb2NjdXJyaW5nIGluIGEgY2xhc3MgbmFtZWQgYGBIYW1gYCB3aWxsIGJlIHRyYW5zZm9ybWVkIHRvXG5gYF9IYW1fX3NwYW1gYC4gIFRoaXMgdHJhbnNmb3JtYXRpb24gaXMgaW5kZXBlbmRlbnQgb2YgdGhlIHN5bnRhY3RpY2FsXG5jb250ZXh0IGluIHdoaWNoIHRoZSBpZGVudGlmaWVyIGlzIHVzZWQuICBJZiB0aGUgdHJhbnNmb3JtZWQgbmFtZSBpc1xuZXh0cmVtZWx5IGxvbmcgKGxvbmdlciB0aGFuIDI1NSBjaGFyYWN0ZXJzKSwgaW1wbGVtZW50YXRpb24gZGVmaW5lZFxudHJ1bmNhdGlvbiBtYXkgaGFwcGVuLiBJZiB0aGUgY2xhc3MgbmFtZSBjb25zaXN0cyBvbmx5IG9mIHVuZGVyc2NvcmVzLFxubm8gdHJhbnNmb3JtYXRpb24gaXMgZG9uZS5cbicsCisgJ2F0b20tbGl0ZXJhbHMnOiAiXG5MaXRlcmFsc1xuKioqKioqKipcblxuUHl0aG9uIHN1cHBvcnRzIHN0cmluZyBsaXRlcmFscyBhbmQgdmFyaW91cyBudW1lcmljIGxpdGVyYWxzOlxuXG4gICBsaXRlcmFsIDo6PSBzdHJpbmdsaXRlcmFsIHwgaW50ZWdlciB8IGxvbmdpbnRlZ2VyXG4gICAgICAgICAgICAgICB8IGZsb2F0bnVtYmVyIHwgaW1hZ251bWJlclxuXG5FdmFsdWF0aW9uIG9mIGEgbGl0ZXJhbCB5aWVsZHMgYW4gb2JqZWN0IG9mIHRoZSBnaXZlbiB0eXBlIChzdHJpbmcsXG5pbnRlZ2VyLCBsb25nIGludGVnZXIsIGZsb2F0aW5nIHBvaW50IG51bWJlciwgY29tcGxleCBudW1iZXIpIHdpdGggdGhlXG5naXZlbiB2YWx1ZS4gIFRoZSB2YWx1ZSBtYXkgYmUgYXBwcm94aW1hdGVkIGluIHRoZSBjYXNlIG9mIGZsb2F0aW5nXG5wb2ludCBhbmQgaW1hZ2luYXJ5IChjb21wbGV4KSBsaXRlcmFscy4gIFNlZSBzZWN0aW9uICpMaXRlcmFscyogZm9yXG5kZXRhaWxzLlxuXG5BbGwgbGl0ZXJhbHMgY29ycmVzcG9uZCB0byBpbW11dGFibGUgZGF0YSB0eXBlcywgYW5kIGhlbmNlIHRoZVxub2JqZWN0J3MgaWRlbnRpdHkgaXMgbGVzcyBpbXBvcnRhbnQgdGhhbiBpdHMgdmFsdWUuICBNdWx0aXBsZVxuZXZhbHVhdGlvbnMgb2YgbGl0ZXJhbHMgd2l0aCB0aGUgc2FtZSB2YWx1ZSAoZWl0aGVyIHRoZSBzYW1lXG5vY2N1cnJlbmNlIGluIHRoZSBwcm9ncmFtIHRleHQgb3IgYSBkaWZmZXJlbnQgb2NjdXJyZW5jZSkgbWF5IG9idGFpblxudGhlIHNhbWUgb2JqZWN0IG9yIGEgZGlmZmVyZW50IG9iamVjdCB3aXRoIHRoZSBzYW1lIHZhbHVlLlxuIiwKKyAnYXR0cmlidXRlLWFjY2Vzcyc6ICdcbkN1c3RvbWl6aW5nIGF0dHJpYnV0ZSBhY2Nlc3NcbioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGN1c3RvbWl6ZSB0aGUgbWVhbmluZyBvZlxuYXR0cmlidXRlIGFjY2VzcyAodXNlIG9mLCBhc3NpZ25tZW50IHRvLCBvciBkZWxldGlvbiBvZiBgYHgubmFtZWBgKVxuZm9yIGNsYXNzIGluc3RhbmNlcy5cblxub2JqZWN0Ll9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpXG5cbiAgIENhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSBsb29rdXAgaGFzIG5vdCBmb3VuZCB0aGUgYXR0cmlidXRlIGluIHRoZVxuICAgdXN1YWwgcGxhY2VzIChpLmUuIGl0IGlzIG5vdCBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgbm9yIGlzIGl0IGZvdW5kXG4gICBpbiB0aGUgY2xhc3MgdHJlZSBmb3IgYGBzZWxmYGApLiAgYGBuYW1lYGAgaXMgdGhlIGF0dHJpYnV0ZSBuYW1lLlxuICAgVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2VcbiAgIGFuIGBgQXR0cmlidXRlRXJyb3JgYCBleGNlcHRpb24uXG5cbiAgIE5vdGUgdGhhdCBpZiB0aGUgYXR0cmlidXRlIGlzIGZvdW5kIHRocm91Z2ggdGhlIG5vcm1hbCBtZWNoYW5pc20sXG4gICBgYF9fZ2V0YXR0cl9fKClgYCBpcyBub3QgY2FsbGVkLiAgKFRoaXMgaXMgYW4gaW50ZW50aW9uYWwgYXN5bW1ldHJ5XG4gICBiZXR3ZWVuIGBgX19nZXRhdHRyX18oKWBgIGFuZCBgYF9fc2V0YXR0cl9fKClgYC4pIFRoaXMgaXMgZG9uZSBib3RoXG4gICBmb3IgZWZmaWNpZW5jeSByZWFzb25zIGFuZCBiZWNhdXNlIG90aGVyd2lzZSBgYF9fZ2V0YXR0cl9fKClgYFxuICAgd291bGQgaGF2ZSBubyB3YXkgdG8gYWNjZXNzIG90aGVyIGF0dHJpYnV0ZXMgb2YgdGhlIGluc3RhbmNlLiAgTm90ZVxuICAgdGhhdCBhdCBsZWFzdCBmb3IgaW5zdGFuY2UgdmFyaWFibGVzLCB5b3UgY2FuIGZha2UgdG90YWwgY29udHJvbCBieVxuICAgbm90IGluc2VydGluZyBhbnkgdmFsdWVzIGluIHRoZSBpbnN0YW5jZSBhdHRyaWJ1dGUgZGljdGlvbmFyeSAoYnV0XG4gICBpbnN0ZWFkIGluc2VydGluZyB0aGVtIGluIGFub3RoZXIgb2JqZWN0KS4gIFNlZSB0aGVcbiAgIGBgX19nZXRhdHRyaWJ1dGVfXygpYGAgbWV0aG9kIGJlbG93IGZvciBhIHdheSB0byBhY3R1YWxseSBnZXQgdG90YWxcbiAgIGNvbnRyb2wgaW4gbmV3LXN0eWxlIGNsYXNzZXMuXG5cbm9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSlcblxuICAgQ2FsbGVkIHdoZW4gYW4gYXR0cmlidXRlIGFzc2lnbm1lbnQgaXMgYXR0ZW1wdGVkLiAgVGhpcyBpcyBjYWxsZWRcbiAgIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBtZWNoYW5pc20gKGkuZS4gc3RvcmUgdGhlIHZhbHVlIGluIHRoZVxuICAgaW5zdGFuY2UgZGljdGlvbmFyeSkuICAqbmFtZSogaXMgdGhlIGF0dHJpYnV0ZSBuYW1lLCAqdmFsdWUqIGlzIHRoZVxuICAgdmFsdWUgdG8gYmUgYXNzaWduZWQgdG8gaXQuXG5cbiAgIElmIGBgX19zZXRhdHRyX18oKWBgIHdhbnRzIHRvIGFzc2lnbiB0byBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUsIGl0XG4gICBzaG91bGQgbm90IHNpbXBseSBleGVjdXRlIGBgc2VsZi5uYW1lID0gdmFsdWVgYCAtLS0gdGhpcyB3b3VsZFxuICAgY2F1c2UgYSByZWN1cnNpdmUgY2FsbCB0byBpdHNlbGYuICBJbnN0ZWFkLCBpdCBzaG91bGQgaW5zZXJ0IHRoZVxuICAgdmFsdWUgaW4gdGhlIGRpY3Rpb25hcnkgb2YgaW5zdGFuY2UgYXR0cmlidXRlcywgZS5nLixcbiAgIGBgc2VsZi5fX2RpY3RfX1tuYW1lXSA9IHZhbHVlYGAuICBGb3IgbmV3LXN0eWxlIGNsYXNzZXMsIHJhdGhlclxuICAgdGhhbiBhY2Nlc3NpbmcgdGhlIGluc3RhbmNlIGRpY3Rpb25hcnksIGl0IHNob3VsZCBjYWxsIHRoZSBiYXNlXG4gICBjbGFzcyBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lLCBmb3IgZXhhbXBsZSxcbiAgIGBgb2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKWBgLlxuXG5vYmplY3QuX19kZWxhdHRyX18oc2VsZiwgbmFtZSlcblxuICAgTGlrZSBgYF9fc2V0YXR0cl9fKClgYCBidXQgZm9yIGF0dHJpYnV0ZSBkZWxldGlvbiBpbnN0ZWFkIG9mXG4gICBhc3NpZ25tZW50LiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBpZiBgYGRlbCBvYmoubmFtZWBgIGlzXG4gICBtZWFuaW5nZnVsIGZvciB0aGUgb2JqZWN0LlxuXG5cbk1vcmUgYXR0cmlidXRlIGFjY2VzcyBmb3IgbmV3LXN0eWxlIGNsYXNzZXNcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIG9ubHkgYXBwbHkgdG8gbmV3LXN0eWxlIGNsYXNzZXMuXG5cbm9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpXG5cbiAgIENhbGxlZCB1bmNvbmRpdGlvbmFsbHkgdG8gaW1wbGVtZW50IGF0dHJpYnV0ZSBhY2Nlc3NlcyBmb3JcbiAgIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MuIElmIHRoZSBjbGFzcyBhbHNvIGRlZmluZXNcbiAgIGBgX19nZXRhdHRyX18oKWBgLCB0aGUgbGF0dGVyIHdpbGwgbm90IGJlIGNhbGxlZCB1bmxlc3NcbiAgIGBgX19nZXRhdHRyaWJ1dGVfXygpYGAgZWl0aGVyIGNhbGxzIGl0IGV4cGxpY2l0bHkgb3IgcmFpc2VzIGFuXG4gICBgYEF0dHJpYnV0ZUVycm9yYGAuIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIChjb21wdXRlZClcbiAgIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZSBhbiBgYEF0dHJpYnV0ZUVycm9yYGAgZXhjZXB0aW9uLiBJbiBvcmRlclxuICAgdG8gYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uIGluIHRoaXMgbWV0aG9kLCBpdHMgaW1wbGVtZW50YXRpb25cbiAgIHNob3VsZCBhbHdheXMgY2FsbCB0aGUgYmFzZSBjbGFzcyBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lIHRvXG4gICBhY2Nlc3MgYW55IGF0dHJpYnV0ZXMgaXQgbmVlZHMsIGZvciBleGFtcGxlLFxuICAgYGBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKWBgLlxuXG4gICBOb3RlOiBUaGlzIG1ldGhvZCBtYXkgc3RpbGwgYmUgYnlwYXNzZWQgd2hlbiBsb29raW5nIHVwIHNwZWNpYWwgbWV0aG9kc1xuICAgICBhcyB0aGUgcmVzdWx0IG9mIGltcGxpY2l0IGludm9jYXRpb24gdmlhIGxhbmd1YWdlIHN5bnRheCBvclxuICAgICBidWlsdC1pbiBmdW5jdGlvbnMuIFNlZSAqU3BlY2lhbCBtZXRob2QgbG9va3VwIGZvciBuZXctc3R5bGVcbiAgICAgY2xhc3NlcyouXG5cblxuSW1wbGVtZW50aW5nIERlc2NyaXB0b3JzXG49PT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIG9ubHkgYXBwbHkgd2hlbiBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3NcbmNvbnRhaW5pbmcgdGhlIG1ldGhvZCAoYSBzby1jYWxsZWQgKmRlc2NyaXB0b3IqIGNsYXNzKSBhcHBlYXJzIGluIGFuXG4qb3duZXIqIGNsYXNzICh0aGUgZGVzY3JpcHRvciBtdXN0IGJlIGluIGVpdGhlciB0aGUgb3duZXJcJ3MgY2xhc3NcbmRpY3Rpb25hcnkgb3IgaW4gdGhlIGNsYXNzIGRpY3Rpb25hcnkgZm9yIG9uZSBvZiBpdHMgcGFyZW50cykuICBJbiB0aGVcbmV4YW1wbGVzIGJlbG93LCAidGhlIGF0dHJpYnV0ZSIgcmVmZXJzIHRvIHRoZSBhdHRyaWJ1dGUgd2hvc2UgbmFtZSBpc1xudGhlIGtleSBvZiB0aGUgcHJvcGVydHkgaW4gdGhlIG93bmVyIGNsYXNzXCcgYGBfX2RpY3RfX2BgLlxuXG5vYmplY3QuX19nZXRfXyhzZWxmLCBpbnN0YW5jZSwgb3duZXIpXG5cbiAgIENhbGxlZCB0byBnZXQgdGhlIGF0dHJpYnV0ZSBvZiB0aGUgb3duZXIgY2xhc3MgKGNsYXNzIGF0dHJpYnV0ZVxuICAgYWNjZXNzKSBvciBvZiBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzIChpbnN0YW5jZSBhdHRyaWJ1dGVcbiAgIGFjY2VzcykuICpvd25lciogaXMgYWx3YXlzIHRoZSBvd25lciBjbGFzcywgd2hpbGUgKmluc3RhbmNlKiBpcyB0aGVcbiAgIGluc3RhbmNlIHRoYXQgdGhlIGF0dHJpYnV0ZSB3YXMgYWNjZXNzZWQgdGhyb3VnaCwgb3IgYGBOb25lYGAgd2hlblxuICAgdGhlIGF0dHJpYnV0ZSBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSAqb3duZXIqLiAgVGhpcyBtZXRob2Qgc2hvdWxkXG4gICByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuXG4gICBgYEF0dHJpYnV0ZUVycm9yYGAgZXhjZXB0aW9uLlxuXG5vYmplY3QuX19zZXRfXyhzZWxmLCBpbnN0YW5jZSwgdmFsdWUpXG5cbiAgIENhbGxlZCB0byBzZXQgdGhlIGF0dHJpYnV0ZSBvbiBhbiBpbnN0YW5jZSAqaW5zdGFuY2UqIG9mIHRoZSBvd25lclxuICAgY2xhc3MgdG8gYSBuZXcgdmFsdWUsICp2YWx1ZSouXG5cbm9iamVjdC5fX2RlbGV0ZV9fKHNlbGYsIGluc3RhbmNlKVxuXG4gICBDYWxsZWQgdG8gZGVsZXRlIHRoZSBhdHRyaWJ1dGUgb24gYW4gaW5zdGFuY2UgKmluc3RhbmNlKiBvZiB0aGVcbiAgIG93bmVyIGNsYXNzLlxuXG5cbkludm9raW5nIERlc2NyaXB0b3JzXG49PT09PT09PT09PT09PT09PT09PVxuXG5JbiBnZW5lcmFsLCBhIGRlc2NyaXB0b3IgaXMgYW4gb2JqZWN0IGF0dHJpYnV0ZSB3aXRoICJiaW5kaW5nXG5iZWhhdmlvciIsIG9uZSB3aG9zZSBhdHRyaWJ1dGUgYWNjZXNzIGhhcyBiZWVuIG92ZXJyaWRkZW4gYnkgbWV0aG9kc1xuaW4gdGhlIGRlc2NyaXB0b3IgcHJvdG9jb2w6ICBgYF9fZ2V0X18oKWBgLCBgYF9fc2V0X18oKWBgLCBhbmRcbmBgX19kZWxldGVfXygpYGAuIElmIGFueSBvZiB0aG9zZSBtZXRob2RzIGFyZSBkZWZpbmVkIGZvciBhbiBvYmplY3QsXG5pdCBpcyBzYWlkIHRvIGJlIGEgZGVzY3JpcHRvci5cblxuVGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGF0dHJpYnV0ZSBhY2Nlc3MgaXMgdG8gZ2V0LCBzZXQsIG9yIGRlbGV0ZVxudGhlIGF0dHJpYnV0ZSBmcm9tIGFuIG9iamVjdFwncyBkaWN0aW9uYXJ5LiBGb3IgaW5zdGFuY2UsIGBgYS54YGAgaGFzIGFcbmxvb2t1cCBjaGFpbiBzdGFydGluZyB3aXRoIGBgYS5fX2RpY3RfX1tcJ3hcJ11gYCwgdGhlblxuYGB0eXBlKGEpLl9fZGljdF9fW1wneFwnXWBgLCBhbmQgY29udGludWluZyB0aHJvdWdoIHRoZSBiYXNlIGNsYXNzZXMgb2ZcbmBgdHlwZShhKWBgIGV4Y2x1ZGluZyBtZXRhY2xhc3Nlcy5cblxuSG93ZXZlciwgaWYgdGhlIGxvb2tlZC11cCB2YWx1ZSBpcyBhbiBvYmplY3QgZGVmaW5pbmcgb25lIG9mIHRoZVxuZGVzY3JpcHRvciBtZXRob2RzLCB0aGVuIFB5dGhvbiBtYXkgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3IgYW5kXG5pbnZva2UgdGhlIGRlc2NyaXB0b3IgbWV0aG9kIGluc3RlYWQuICBXaGVyZSB0aGlzIG9jY3VycyBpbiB0aGVcbnByZWNlZGVuY2UgY2hhaW4gZGVwZW5kcyBvbiB3aGljaCBkZXNjcmlwdG9yIG1ldGhvZHMgd2VyZSBkZWZpbmVkIGFuZFxuaG93IHRoZXkgd2VyZSBjYWxsZWQuICBOb3RlIHRoYXQgZGVzY3JpcHRvcnMgYXJlIG9ubHkgaW52b2tlZCBmb3IgbmV3XG5zdHlsZSBvYmplY3RzIG9yIGNsYXNzZXMgKG9uZXMgdGhhdCBzdWJjbGFzcyBgYG9iamVjdCgpYGAgb3JcbmBgdHlwZSgpYGApLlxuXG5UaGUgc3RhcnRpbmcgcG9pbnQgZm9yIGRlc2NyaXB0b3IgaW52b2NhdGlvbiBpcyBhIGJpbmRpbmcsIGBgYS54YGAuXG5Ib3cgdGhlIGFyZ3VtZW50cyBhcmUgYXNzZW1ibGVkIGRlcGVuZHMgb24gYGBhYGA6XG5cbkRpcmVjdCBDYWxsXG4gICBUaGUgc2ltcGxlc3QgYW5kIGxlYXN0IGNvbW1vbiBjYWxsIGlzIHdoZW4gdXNlciBjb2RlIGRpcmVjdGx5XG4gICBpbnZva2VzIGEgZGVzY3JpcHRvciBtZXRob2Q6ICAgIGBgeC5fX2dldF9fKGEpYGAuXG5cbkluc3RhbmNlIEJpbmRpbmdcbiAgIElmIGJpbmRpbmcgdG8gYSBuZXctc3R5bGUgb2JqZWN0IGluc3RhbmNlLCBgYGEueGBgIGlzIHRyYW5zZm9ybWVkXG4gICBpbnRvIHRoZSBjYWxsOiBgYHR5cGUoYSkuX19kaWN0X19bXCd4XCddLl9fZ2V0X18oYSwgdHlwZShhKSlgYC5cblxuQ2xhc3MgQmluZGluZ1xuICAgSWYgYmluZGluZyB0byBhIG5ldy1zdHlsZSBjbGFzcywgYGBBLnhgYCBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZVxuICAgY2FsbDogYGBBLl9fZGljdF9fW1wneFwnXS5fX2dldF9fKE5vbmUsIEEpYGAuXG5cblN1cGVyIEJpbmRpbmdcbiAgIElmIGBgYWBgIGlzIGFuIGluc3RhbmNlIG9mIGBgc3VwZXJgYCwgdGhlbiB0aGUgYmluZGluZyBgYHN1cGVyKEIsXG4gICBvYmopLm0oKWBgIHNlYXJjaGVzIGBgb2JqLl9fY2xhc3NfXy5fX21yb19fYGAgZm9yIHRoZSBiYXNlIGNsYXNzXG4gICBgYEFgYCBpbW1lZGlhdGVseSBwcmVjZWRpbmcgYGBCYGAgYW5kIHRoZW4gaW52b2tlcyB0aGUgZGVzY3JpcHRvclxuICAgd2l0aCB0aGUgY2FsbDogYGBBLl9fZGljdF9fW1wnbVwnXS5fX2dldF9fKG9iaiwgb2JqLl9fY2xhc3NfXylgYC5cblxuRm9yIGluc3RhbmNlIGJpbmRpbmdzLCB0aGUgcHJlY2VkZW5jZSBvZiBkZXNjcmlwdG9yIGludm9jYXRpb24gZGVwZW5kc1xub24gdGhlIHdoaWNoIGRlc2NyaXB0b3IgbWV0aG9kcyBhcmUgZGVmaW5lZC4gIEEgZGVzY3JpcHRvciBjYW4gZGVmaW5lXG5hbnkgY29tYmluYXRpb24gb2YgYGBfX2dldF9fKClgYCwgYGBfX3NldF9fKClgYCBhbmQgYGBfX2RlbGV0ZV9fKClgYC5cbklmIGl0IGRvZXMgbm90IGRlZmluZSBgYF9fZ2V0X18oKWBgLCB0aGVuIGFjY2Vzc2luZyB0aGUgYXR0cmlidXRlIHdpbGxcbnJldHVybiB0aGUgZGVzY3JpcHRvciBvYmplY3QgaXRzZWxmIHVubGVzcyB0aGVyZSBpcyBhIHZhbHVlIGluIHRoZVxub2JqZWN0XCdzIGluc3RhbmNlIGRpY3Rpb25hcnkuICBJZiB0aGUgZGVzY3JpcHRvciBkZWZpbmVzIGBgX19zZXRfXygpYGBcbmFuZC9vciBgYF9fZGVsZXRlX18oKWBgLCBpdCBpcyBhIGRhdGEgZGVzY3JpcHRvcjsgaWYgaXQgZGVmaW5lc1xubmVpdGhlciwgaXQgaXMgYSBub24tZGF0YSBkZXNjcmlwdG9yLiAgTm9ybWFsbHksIGRhdGEgZGVzY3JpcHRvcnNcbmRlZmluZSBib3RoIGBgX19nZXRfXygpYGAgYW5kIGBgX19zZXRfXygpYGAsIHdoaWxlIG5vbi1kYXRhXG5kZXNjcmlwdG9ycyBoYXZlIGp1c3QgdGhlIGBgX19nZXRfXygpYGAgbWV0aG9kLiAgRGF0YSBkZXNjcmlwdG9ycyB3aXRoXG5gYF9fc2V0X18oKWBgIGFuZCBgYF9fZ2V0X18oKWBgIGRlZmluZWQgYWx3YXlzIG92ZXJyaWRlIGEgcmVkZWZpbml0aW9uXG5pbiBhbiBpbnN0YW5jZSBkaWN0aW9uYXJ5LiAgSW4gY29udHJhc3QsIG5vbi1kYXRhIGRlc2NyaXB0b3JzIGNhbiBiZVxub3ZlcnJpZGRlbiBieSBpbnN0YW5jZXMuXG5cblB5dGhvbiBtZXRob2RzIChpbmNsdWRpbmcgYGBzdGF0aWNtZXRob2QoKWBgIGFuZCBgYGNsYXNzbWV0aG9kKClgYClcbmFyZSBpbXBsZW1lbnRlZCBhcyBub24tZGF0YSBkZXNjcmlwdG9ycy4gIEFjY29yZGluZ2x5LCBpbnN0YW5jZXMgY2FuXG5yZWRlZmluZSBhbmQgb3ZlcnJpZGUgbWV0aG9kcy4gIFRoaXMgYWxsb3dzIGluZGl2aWR1YWwgaW5zdGFuY2VzIHRvXG5hY3F1aXJlIGJlaGF2aW9ycyB0aGF0IGRpZmZlciBmcm9tIG90aGVyIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBjbGFzcy5cblxuVGhlIGBgcHJvcGVydHkoKWBgIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGFzIGEgZGF0YSBkZXNjcmlwdG9yLlxuQWNjb3JkaW5nbHksIGluc3RhbmNlcyBjYW5ub3Qgb3ZlcnJpZGUgdGhlIGJlaGF2aW9yIG9mIGEgcHJvcGVydHkuXG5cblxuX19zbG90c19fXG49PT09PT09PT1cblxuQnkgZGVmYXVsdCwgaW5zdGFuY2VzIG9mIGJvdGggb2xkIGFuZCBuZXctc3R5bGUgY2xhc3NlcyBoYXZlIGFcbmRpY3Rpb25hcnkgZm9yIGF0dHJpYnV0ZSBzdG9yYWdlLiAgVGhpcyB3YXN0ZXMgc3BhY2UgZm9yIG9iamVjdHNcbmhhdmluZyB2ZXJ5IGZldyBpbnN0YW5jZSB2YXJpYWJsZXMuICBUaGUgc3BhY2UgY29uc3VtcHRpb24gY2FuIGJlY29tZVxuYWN1dGUgd2hlbiBjcmVhdGluZyBsYXJnZSBudW1iZXJzIG9mIGluc3RhbmNlcy5cblxuVGhlIGRlZmF1bHQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgZGVmaW5pbmcgKl9fc2xvdHNfXyogaW4gYSBuZXctc3R5bGVcbmNsYXNzIGRlZmluaXRpb24uICBUaGUgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gdGFrZXMgYSBzZXF1ZW5jZSBvZlxuaW5zdGFuY2UgdmFyaWFibGVzIGFuZCByZXNlcnZlcyBqdXN0IGVub3VnaCBzcGFjZSBpbiBlYWNoIGluc3RhbmNlIHRvXG5ob2xkIGEgdmFsdWUgZm9yIGVhY2ggdmFyaWFibGUuICBTcGFjZSBpcyBzYXZlZCBiZWNhdXNlICpfX2RpY3RfXyogaXNcbm5vdCBjcmVhdGVkIGZvciBlYWNoIGluc3RhbmNlLlxuXG5fX3Nsb3RzX19cblxuICAgVGhpcyBjbGFzcyB2YXJpYWJsZSBjYW4gYmUgYXNzaWduZWQgYSBzdHJpbmcsIGl0ZXJhYmxlLCBvciBzZXF1ZW5jZVxuICAgb2Ygc3RyaW5ncyB3aXRoIHZhcmlhYmxlIG5hbWVzIHVzZWQgYnkgaW5zdGFuY2VzLiAgSWYgZGVmaW5lZCBpbiBhXG4gICBuZXctc3R5bGUgY2xhc3MsICpfX3Nsb3RzX18qIHJlc2VydmVzIHNwYWNlIGZvciB0aGUgZGVjbGFyZWRcbiAgIHZhcmlhYmxlcyBhbmQgcHJldmVudHMgdGhlIGF1dG9tYXRpYyBjcmVhdGlvbiBvZiAqX19kaWN0X18qIGFuZFxuICAgKl9fd2Vha3JlZl9fKiBmb3IgZWFjaCBpbnN0YW5jZS5cblxuICAgTmV3IGluIHZlcnNpb24gMi4yLlxuXG5Ob3RlcyBvbiB1c2luZyAqX19zbG90c19fKlxuXG4qIFdoZW4gaW5oZXJpdGluZyBmcm9tIGEgY2xhc3Mgd2l0aG91dCAqX19zbG90c19fKiwgdGhlICpfX2RpY3RfXypcbiAgYXR0cmlidXRlIG9mIHRoYXQgY2xhc3Mgd2lsbCBhbHdheXMgYmUgYWNjZXNzaWJsZSwgc28gYSAqX19zbG90c19fKlxuICBkZWZpbml0aW9uIGluIHRoZSBzdWJjbGFzcyBpcyBtZWFuaW5nbGVzcy5cblxuKiBXaXRob3V0IGEgKl9fZGljdF9fKiB2YXJpYWJsZSwgaW5zdGFuY2VzIGNhbm5vdCBiZSBhc3NpZ25lZCBuZXdcbiAgdmFyaWFibGVzIG5vdCBsaXN0ZWQgaW4gdGhlICpfX3Nsb3RzX18qIGRlZmluaXRpb24uICBBdHRlbXB0cyB0b1xuICBhc3NpZ24gdG8gYW4gdW5saXN0ZWQgdmFyaWFibGUgbmFtZSByYWlzZXMgYGBBdHRyaWJ1dGVFcnJvcmBgLiBJZlxuICBkeW5hbWljIGFzc2lnbm1lbnQgb2YgbmV3IHZhcmlhYmxlcyBpcyBkZXNpcmVkLCB0aGVuIGFkZFxuICBgYFwnX19kaWN0X19cJ2BgIHRvIHRoZSBzZXF1ZW5jZSBvZiBzdHJpbmdzIGluIHRoZSAqX19zbG90c19fKlxuICBkZWNsYXJhdGlvbi5cblxuICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBQcmV2aW91c2x5LCBhZGRpbmcgYGBcJ19fZGljdF9fXCdgYCB0byB0aGVcbiAgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gd291bGQgbm90IGVuYWJsZSB0aGUgYXNzaWdubWVudCBvZiBuZXdcbiAgYXR0cmlidXRlcyBub3Qgc3BlY2lmaWNhbGx5IGxpc3RlZCBpbiB0aGUgc2VxdWVuY2Ugb2YgaW5zdGFuY2VcbiAgdmFyaWFibGUgbmFtZXMuXG5cbiogV2l0aG91dCBhICpfX3dlYWtyZWZfXyogdmFyaWFibGUgZm9yIGVhY2ggaW5zdGFuY2UsIGNsYXNzZXMgZGVmaW5pbmdcbiAgKl9fc2xvdHNfXyogZG8gbm90IHN1cHBvcnQgd2VhayByZWZlcmVuY2VzIHRvIGl0cyBpbnN0YW5jZXMuIElmIHdlYWtcbiAgcmVmZXJlbmNlIHN1cHBvcnQgaXMgbmVlZGVkLCB0aGVuIGFkZCBgYFwnX193ZWFrcmVmX19cJ2BgIHRvIHRoZVxuICBzZXF1ZW5jZSBvZiBzdHJpbmdzIGluIHRoZSAqX19zbG90c19fKiBkZWNsYXJhdGlvbi5cblxuICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBQcmV2aW91c2x5LCBhZGRpbmcgYGBcJ19fd2Vha3JlZl9fXCdgYCB0byB0aGVcbiAgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gd291bGQgbm90IGVuYWJsZSBzdXBwb3J0IGZvciB3ZWFrXG4gIHJlZmVyZW5jZXMuXG5cbiogKl9fc2xvdHNfXyogYXJlIGltcGxlbWVudGVkIGF0IHRoZSBjbGFzcyBsZXZlbCBieSBjcmVhdGluZ1xuICBkZXNjcmlwdG9ycyAoKkltcGxlbWVudGluZyBEZXNjcmlwdG9ycyopIGZvciBlYWNoIHZhcmlhYmxlIG5hbWUuICBBc1xuICBhIHJlc3VsdCwgY2xhc3MgYXR0cmlidXRlcyBjYW5ub3QgYmUgdXNlZCB0byBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yXG4gIGluc3RhbmNlIHZhcmlhYmxlcyBkZWZpbmVkIGJ5ICpfX3Nsb3RzX18qOyBvdGhlcndpc2UsIHRoZSBjbGFzc1xuICBhdHRyaWJ1dGUgd291bGQgb3ZlcndyaXRlIHRoZSBkZXNjcmlwdG9yIGFzc2lnbm1lbnQuXG5cbiogVGhlIGFjdGlvbiBvZiBhICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIGlzIGxpbWl0ZWQgdG8gdGhlIGNsYXNzXG4gIHdoZXJlIGl0IGlzIGRlZmluZWQuICBBcyBhIHJlc3VsdCwgc3ViY2xhc3NlcyB3aWxsIGhhdmUgYSAqX19kaWN0X18qXG4gIHVubGVzcyB0aGV5IGFsc28gZGVmaW5lICpfX3Nsb3RzX18qICh3aGljaCBtdXN0IG9ubHkgY29udGFpbiBuYW1lc1xuICBvZiBhbnkgKmFkZGl0aW9uYWwqIHNsb3RzKS5cblxuKiBJZiBhIGNsYXNzIGRlZmluZXMgYSBzbG90IGFsc28gZGVmaW5lZCBpbiBhIGJhc2UgY2xhc3MsIHRoZSBpbnN0YW5jZVxuICB2YXJpYWJsZSBkZWZpbmVkIGJ5IHRoZSBiYXNlIGNsYXNzIHNsb3QgaXMgaW5hY2Nlc3NpYmxlIChleGNlcHQgYnlcbiAgcmV0cmlldmluZyBpdHMgZGVzY3JpcHRvciBkaXJlY3RseSBmcm9tIHRoZSBiYXNlIGNsYXNzKS4gVGhpc1xuICByZW5kZXJzIHRoZSBtZWFuaW5nIG9mIHRoZSBwcm9ncmFtIHVuZGVmaW5lZC4gIEluIHRoZSBmdXR1cmUsIGFcbiAgY2hlY2sgbWF5IGJlIGFkZGVkIHRvIHByZXZlbnQgdGhpcy5cblxuKiBOb25lbXB0eSAqX19zbG90c19fKiBkb2VzIG5vdCB3b3JrIGZvciBjbGFzc2VzIGRlcml2ZWQgZnJvbVxuICAidmFyaWFibGUtbGVuZ3RoIiBidWlsdC1pbiB0eXBlcyBzdWNoIGFzIGBgbG9uZ2BgLCBgYHN0cmBgIGFuZFxuICBgYHR1cGxlYGAuXG5cbiogQW55IG5vbi1zdHJpbmcgaXRlcmFibGUgbWF5IGJlIGFzc2lnbmVkIHRvICpfX3Nsb3RzX18qLiBNYXBwaW5ncyBtYXlcbiAgYWxzbyBiZSB1c2VkOyBob3dldmVyLCBpbiB0aGUgZnV0dXJlLCBzcGVjaWFsIG1lYW5pbmcgbWF5IGJlXG4gIGFzc2lnbmVkIHRvIHRoZSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBlYWNoIGtleS5cblxuKiAqX19jbGFzc19fKiBhc3NpZ25tZW50IHdvcmtzIG9ubHkgaWYgYm90aCBjbGFzc2VzIGhhdmUgdGhlIHNhbWVcbiAgKl9fc2xvdHNfXyouXG5cbiAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNjogUHJldmlvdXNseSwgKl9fY2xhc3NfXyogYXNzaWdubWVudCByYWlzZWQgYW5cbiAgZXJyb3IgaWYgZWl0aGVyIG5ldyBvciBvbGQgY2xhc3MgaGFkICpfX3Nsb3RzX18qLlxuJywKKyAnYXR0cmlidXRlLXJlZmVyZW5jZXMnOiAnXG5BdHRyaWJ1dGUgcmVmZXJlbmNlc1xuKioqKioqKioqKioqKioqKioqKipcblxuQW4gYXR0cmlidXRlIHJlZmVyZW5jZSBpcyBhIHByaW1hcnkgZm9sbG93ZWQgYnkgYSBwZXJpb2QgYW5kIGEgbmFtZTpcblxuICAgYXR0cmlidXRlcmVmIDo6PSBwcmltYXJ5ICIuIiBpZGVudGlmaWVyXG5cblRoZSBwcmltYXJ5IG11c3QgZXZhbHVhdGUgdG8gYW4gb2JqZWN0IG9mIGEgdHlwZSB0aGF0IHN1cHBvcnRzXG5hdHRyaWJ1dGUgcmVmZXJlbmNlcywgZS5nLiwgYSBtb2R1bGUsIGxpc3QsIG9yIGFuIGluc3RhbmNlLiAgVGhpc1xub2JqZWN0IGlzIHRoZW4gYXNrZWQgdG8gcHJvZHVjZSB0aGUgYXR0cmlidXRlIHdob3NlIG5hbWUgaXMgdGhlXG5pZGVudGlmaWVyLiAgSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IGF2YWlsYWJsZSwgdGhlIGV4Y2VwdGlvblxuYGBBdHRyaWJ1dGVFcnJvcmBgIGlzIHJhaXNlZC4gT3RoZXJ3aXNlLCB0aGUgdHlwZSBhbmQgdmFsdWUgb2YgdGhlXG5vYmplY3QgcHJvZHVjZWQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgb2JqZWN0LiAgTXVsdGlwbGUgZXZhbHVhdGlvbnMgb2ZcbnRoZSBzYW1lIGF0dHJpYnV0ZSByZWZlcmVuY2UgbWF5IHlpZWxkIGRpZmZlcmVudCBvYmplY3RzLlxuJywKKyAnYXVnYXNzaWduJzogJ1xuQXVnbWVudGVkIGFzc2lnbm1lbnQgc3RhdGVtZW50c1xuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5BdWdtZW50ZWQgYXNzaWdubWVudCBpcyB0aGUgY29tYmluYXRpb24sIGluIGEgc2luZ2xlIHN0YXRlbWVudCwgb2YgYVxuYmluYXJ5IG9wZXJhdGlvbiBhbmQgYW4gYXNzaWdubWVudCBzdGF0ZW1lbnQ6XG5cbiAgIGF1Z21lbnRlZF9hc3NpZ25tZW50X3N0bXQgOjo9IGF1Z3RhcmdldCBhdWdvcCAoZXhwcmVzc2lvbl9saXN0IHwgeWllbGRfZXhwcmVzc2lvbilcbiAgIGF1Z3RhcmdldCAgICAgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXIgfCBhdHRyaWJ1dGVyZWYgfCBzdWJzY3JpcHRpb24gfCBzbGljaW5nXG4gICBhdWdvcCAgICAgICAgICAgICAgICAgICAgIDo6PSAiKz0iIHwgIi09IiB8ICIqPSIgfCAiLz0iIHwgIi8vPSIgfCAiJT0iIHwgIioqPSJcbiAgICAgICAgICAgICB8ICI+Pj0iIHwgIjw8PSIgfCAiJj0iIHwgIl49IiB8ICJ8PSJcblxuKFNlZSBzZWN0aW9uICpQcmltYXJpZXMqIGZvciB0aGUgc3ludGF4IGRlZmluaXRpb25zIGZvciB0aGUgbGFzdCB0aHJlZVxuc3ltYm9scy4pXG5cbkFuIGF1Z21lbnRlZCBhc3NpZ25tZW50IGV2YWx1YXRlcyB0aGUgdGFyZ2V0ICh3aGljaCwgdW5saWtlIG5vcm1hbFxuYXNzaWdubWVudCBzdGF0ZW1lbnRzLCBjYW5ub3QgYmUgYW4gdW5wYWNraW5nKSBhbmQgdGhlIGV4cHJlc3Npb25cbmxpc3QsIHBlcmZvcm1zIHRoZSBiaW5hcnkgb3BlcmF0aW9uIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIGFzc2lnbm1lbnRcbm9uIHRoZSB0d28gb3BlcmFuZHMsIGFuZCBhc3NpZ25zIHRoZSByZXN1bHQgdG8gdGhlIG9yaWdpbmFsIHRhcmdldC5cblRoZSB0YXJnZXQgaXMgb25seSBldmFsdWF0ZWQgb25jZS5cblxuQW4gYXVnbWVudGVkIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiBsaWtlIGBgeCArPSAxYGAgY2FuIGJlIHJld3JpdHRlbiBhc1xuYGB4ID0geCArIDFgYCB0byBhY2hpZXZlIGEgc2ltaWxhciwgYnV0IG5vdCBleGFjdGx5IGVxdWFsIGVmZmVjdC4gSW5cbnRoZSBhdWdtZW50ZWQgdmVyc2lvbiwgYGB4YGAgaXMgb25seSBldmFsdWF0ZWQgb25jZS4gQWxzbywgd2hlblxucG9zc2libGUsIHRoZSBhY3R1YWwgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCAqaW4tcGxhY2UqLCBtZWFuaW5nIHRoYXRcbnJhdGhlciB0aGFuIGNyZWF0aW5nIGEgbmV3IG9iamVjdCBhbmQgYXNzaWduaW5nIHRoYXQgdG8gdGhlIHRhcmdldCxcbnRoZSBvbGQgb2JqZWN0IGlzIG1vZGlmaWVkIGluc3RlYWQuXG5cbldpdGggdGhlIGV4Y2VwdGlvbiBvZiBhc3NpZ25pbmcgdG8gdHVwbGVzIGFuZCBtdWx0aXBsZSB0YXJnZXRzIGluIGFcbnNpbmdsZSBzdGF0ZW1lbnQsIHRoZSBhc3NpZ25tZW50IGRvbmUgYnkgYXVnbWVudGVkIGFzc2lnbm1lbnRcbnN0YXRlbWVudHMgaXMgaGFuZGxlZCB0aGUgc2FtZSB3YXkgYXMgbm9ybWFsIGFzc2lnbm1lbnRzLiBTaW1pbGFybHksXG53aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIHBvc3NpYmxlICppbi1wbGFjZSogYmVoYXZpb3IsIHRoZSBiaW5hcnlcbm9wZXJhdGlvbiBwZXJmb3JtZWQgYnkgYXVnbWVudGVkIGFzc2lnbm1lbnQgaXMgdGhlIHNhbWUgYXMgdGhlIG5vcm1hbFxuYmluYXJ5IG9wZXJhdGlvbnMuXG5cbkZvciB0YXJnZXRzIHdoaWNoIGFyZSBhdHRyaWJ1dGUgcmVmZXJlbmNlcywgdGhlIHNhbWUgKmNhdmVhdCBhYm91dFxuY2xhc3MgYW5kIGluc3RhbmNlIGF0dHJpYnV0ZXMqIGFwcGxpZXMgYXMgZm9yIHJlZ3VsYXIgYXNzaWdubWVudHMuXG4nLAorICdiaW5hcnknOiAnXG5CaW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRpb25zXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cblRoZSBiaW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRpb25zIGhhdmUgdGhlIGNvbnZlbnRpb25hbCBwcmlvcml0eVxubGV2ZWxzLiAgTm90ZSB0aGF0IHNvbWUgb2YgdGhlc2Ugb3BlcmF0aW9ucyBhbHNvIGFwcGx5IHRvIGNlcnRhaW4gbm9uLVxubnVtZXJpYyB0eXBlcy4gIEFwYXJ0IGZyb20gdGhlIHBvd2VyIG9wZXJhdG9yLCB0aGVyZSBhcmUgb25seSB0d29cbmxldmVscywgb25lIGZvciBtdWx0aXBsaWNhdGl2ZSBvcGVyYXRvcnMgYW5kIG9uZSBmb3IgYWRkaXRpdmVcbm9wZXJhdG9yczpcblxuICAgbV9leHByIDo6PSB1X2V4cHIgfCBtX2V4cHIgIioiIHVfZXhwciB8IG1fZXhwciAiLy8iIHVfZXhwciB8IG1fZXhwciAiLyIgdV9leHByXG4gICAgICAgICAgICAgIHwgbV9leHByICIlIiB1X2V4cHJcbiAgIGFfZXhwciA6Oj0gbV9leHByIHwgYV9leHByICIrIiBtX2V4cHIgfCBhX2V4cHIgIi0iIG1fZXhwclxuXG5UaGUgYGAqYGAgKG11bHRpcGxpY2F0aW9uKSBvcGVyYXRvciB5aWVsZHMgdGhlIHByb2R1Y3Qgb2YgaXRzXG5hcmd1bWVudHMuICBUaGUgYXJndW1lbnRzIG11c3QgZWl0aGVyIGJvdGggYmUgbnVtYmVycywgb3Igb25lIGFyZ3VtZW50XG5tdXN0IGJlIGFuIGludGVnZXIgKHBsYWluIG9yIGxvbmcpIGFuZCB0aGUgb3RoZXIgbXVzdCBiZSBhIHNlcXVlbmNlLlxuSW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgbnVtYmVycyBhcmUgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUgYW5kXG50aGVuIG11bHRpcGxpZWQgdG9nZXRoZXIuICBJbiB0aGUgbGF0dGVyIGNhc2UsIHNlcXVlbmNlIHJlcGV0aXRpb24gaXNcbnBlcmZvcm1lZDsgYSBuZWdhdGl2ZSByZXBldGl0aW9uIGZhY3RvciB5aWVsZHMgYW4gZW1wdHkgc2VxdWVuY2UuXG5cblRoZSBgYC9gYCAoZGl2aXNpb24pIGFuZCBgYC8vYGAgKGZsb29yIGRpdmlzaW9uKSBvcGVyYXRvcnMgeWllbGQgdGhlXG5xdW90aWVudCBvZiB0aGVpciBhcmd1bWVudHMuICBUaGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlIGZpcnN0XG5jb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS4gUGxhaW4gb3IgbG9uZyBpbnRlZ2VyIGRpdmlzaW9uIHlpZWxkcyBhblxuaW50ZWdlciBvZiB0aGUgc2FtZSB0eXBlOyB0aGUgcmVzdWx0IGlzIHRoYXQgb2YgbWF0aGVtYXRpY2FsIGRpdmlzaW9uXG53aXRoIHRoZSBcJ2Zsb29yXCcgZnVuY3Rpb24gYXBwbGllZCB0byB0aGUgcmVzdWx0LiBEaXZpc2lvbiBieSB6ZXJvXG5yYWlzZXMgdGhlIGBgWmVyb0RpdmlzaW9uRXJyb3JgYCBleGNlcHRpb24uXG5cblRoZSBgYCVgYCAobW9kdWxvKSBvcGVyYXRvciB5aWVsZHMgdGhlIHJlbWFpbmRlciBmcm9tIHRoZSBkaXZpc2lvbiBvZlxudGhlIGZpcnN0IGFyZ3VtZW50IGJ5IHRoZSBzZWNvbmQuICBUaGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlIGZpcnN0XG5jb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS4gIEEgemVybyByaWdodCBhcmd1bWVudCByYWlzZXMgdGhlXG5gYFplcm9EaXZpc2lvbkVycm9yYGAgZXhjZXB0aW9uLiAgVGhlIGFyZ3VtZW50cyBtYXkgYmUgZmxvYXRpbmcgcG9pbnRcbm51bWJlcnMsIGUuZy4sIGBgMy4xNCUwLjdgYCBlcXVhbHMgYGAwLjM0YGAgKHNpbmNlIGBgMy4xNGBgIGVxdWFsc1xuYGA0KjAuNyArIDAuMzRgYC4pICBUaGUgbW9kdWxvIG9wZXJhdG9yIGFsd2F5cyB5aWVsZHMgYSByZXN1bHQgd2l0aFxudGhlIHNhbWUgc2lnbiBhcyBpdHMgc2Vjb25kIG9wZXJhbmQgKG9yIHplcm8pOyB0aGUgYWJzb2x1dGUgdmFsdWUgb2ZcbnRoZSByZXN1bHQgaXMgc3RyaWN0bHkgc21hbGxlciB0aGFuIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgc2Vjb25kXG5vcGVyYW5kIFsyXS5cblxuVGhlIGludGVnZXIgZGl2aXNpb24gYW5kIG1vZHVsbyBvcGVyYXRvcnMgYXJlIGNvbm5lY3RlZCBieSB0aGVcbmZvbGxvd2luZyBpZGVudGl0eTogYGB4ID09ICh4L3kpKnkgKyAoeCV5KWBgLiAgSW50ZWdlciBkaXZpc2lvbiBhbmRcbm1vZHVsbyBhcmUgYWxzbyBjb25uZWN0ZWQgd2l0aCB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gYGBkaXZtb2QoKWBgOlxuYGBkaXZtb2QoeCwgeSkgPT0gKHgveSwgeCV5KWBgLiAgVGhlc2UgaWRlbnRpdGllcyBkb25cJ3QgaG9sZCBmb3JcbmZsb2F0aW5nIHBvaW50IG51bWJlcnM7IHRoZXJlIHNpbWlsYXIgaWRlbnRpdGllcyBob2xkIGFwcHJveGltYXRlbHlcbndoZXJlIGBgeC95YGAgaXMgcmVwbGFjZWQgYnkgYGBmbG9vcih4L3kpYGAgb3IgYGBmbG9vcih4L3kpIC0gMWBgIFszXS5cblxuSW4gYWRkaXRpb24gdG8gcGVyZm9ybWluZyB0aGUgbW9kdWxvIG9wZXJhdGlvbiBvbiBudW1iZXJzLCB0aGUgYGAlYGBcbm9wZXJhdG9yIGlzIGFsc28gb3ZlcmxvYWRlZCBieSBzdHJpbmcgYW5kIHVuaWNvZGUgb2JqZWN0cyB0byBwZXJmb3JtXG5zdHJpbmcgZm9ybWF0dGluZyAoYWxzbyBrbm93biBhcyBpbnRlcnBvbGF0aW9uKS4gVGhlIHN5bnRheCBmb3Igc3RyaW5nXG5mb3JtYXR0aW5nIGlzIGRlc2NyaWJlZCBpbiB0aGUgUHl0aG9uIExpYnJhcnkgUmVmZXJlbmNlLCBzZWN0aW9uXG4qU3RyaW5nIEZvcm1hdHRpbmcgT3BlcmF0aW9ucyouXG5cbkRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjM6IFRoZSBmbG9vciBkaXZpc2lvbiBvcGVyYXRvciwgdGhlIG1vZHVsb1xub3BlcmF0b3IsIGFuZCB0aGUgYGBkaXZtb2QoKWBgIGZ1bmN0aW9uIGFyZSBubyBsb25nZXIgZGVmaW5lZCBmb3JcbmNvbXBsZXggbnVtYmVycy4gIEluc3RlYWQsIGNvbnZlcnQgdG8gYSBmbG9hdGluZyBwb2ludCBudW1iZXIgdXNpbmdcbnRoZSBgYGFicygpYGAgZnVuY3Rpb24gaWYgYXBwcm9wcmlhdGUuXG5cblRoZSBgYCtgYCAoYWRkaXRpb24pIG9wZXJhdG9yIHlpZWxkcyB0aGUgc3VtIG9mIGl0cyBhcmd1bWVudHMuIFRoZVxuYXJndW1lbnRzIG11c3QgZWl0aGVyIGJvdGggYmUgbnVtYmVycyBvciBib3RoIHNlcXVlbmNlcyBvZiB0aGUgc2FtZVxudHlwZS4gIEluIHRoZSBmb3JtZXIgY2FzZSwgdGhlIG51bWJlcnMgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlXG5hbmQgdGhlbiBhZGRlZCB0b2dldGhlci4gIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIHNlcXVlbmNlcyBhcmVcbmNvbmNhdGVuYXRlZC5cblxuVGhlIGBgLWBgIChzdWJ0cmFjdGlvbikgb3BlcmF0b3IgeWllbGRzIHRoZSBkaWZmZXJlbmNlIG9mIGl0c1xuYXJndW1lbnRzLiAgVGhlIG51bWVyaWMgYXJndW1lbnRzIGFyZSBmaXJzdCBjb252ZXJ0ZWQgdG8gYSBjb21tb25cbnR5cGUuXG4nLAorICdiaXR3aXNlJzogJ1xuQmluYXJ5IGJpdHdpc2Ugb3BlcmF0aW9uc1xuKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5FYWNoIG9mIHRoZSB0aHJlZSBiaXR3aXNlIG9wZXJhdGlvbnMgaGFzIGEgZGlmZmVyZW50IHByaW9yaXR5IGxldmVsOlxuXG4gICBhbmRfZXhwciA6Oj0gc2hpZnRfZXhwciB8IGFuZF9leHByICImIiBzaGlmdF9leHByXG4gICB4b3JfZXhwciA6Oj0gYW5kX2V4cHIgfCB4b3JfZXhwciAiXiIgYW5kX2V4cHJcbiAgIG9yX2V4cHIgIDo6PSB4b3JfZXhwciB8IG9yX2V4cHIgInwiIHhvcl9leHByXG5cblRoZSBgYCZgYCBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgQU5EIG9mIGl0cyBhcmd1bWVudHMsIHdoaWNoIG11c3RcbmJlIHBsYWluIG9yIGxvbmcgaW50ZWdlcnMuICBUaGUgYXJndW1lbnRzIGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb25cbnR5cGUuXG5cblRoZSBgYF5gYCBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgWE9SIChleGNsdXNpdmUgT1IpIG9mIGl0c1xuYXJndW1lbnRzLCB3aGljaCBtdXN0IGJlIHBsYWluIG9yIGxvbmcgaW50ZWdlcnMuICBUaGUgYXJndW1lbnRzIGFyZVxuY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUuXG5cblRoZSBgYHxgYCBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgKGluY2x1c2l2ZSkgT1Igb2YgaXRzIGFyZ3VtZW50cyxcbndoaWNoIG11c3QgYmUgcGxhaW4gb3IgbG9uZyBpbnRlZ2Vycy4gIFRoZSBhcmd1bWVudHMgYXJlIGNvbnZlcnRlZCB0b1xuYSBjb21tb24gdHlwZS5cbicsCisgJ2JsdGluLWNvZGUtb2JqZWN0cyc6ICdcbkNvZGUgT2JqZWN0c1xuKioqKioqKioqKioqXG5cbkNvZGUgb2JqZWN0cyBhcmUgdXNlZCBieSB0aGUgaW1wbGVtZW50YXRpb24gdG8gcmVwcmVzZW50ICJwc2V1ZG8tXG5jb21waWxlZCIgZXhlY3V0YWJsZSBQeXRob24gY29kZSBzdWNoIGFzIGEgZnVuY3Rpb24gYm9keS4gVGhleSBkaWZmZXJcbmZyb20gZnVuY3Rpb24gb2JqZWN0cyBiZWNhdXNlIHRoZXkgZG9uXCd0IGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlaXJcbmdsb2JhbCBleGVjdXRpb24gZW52aXJvbm1lbnQuICBDb2RlIG9iamVjdHMgYXJlIHJldHVybmVkIGJ5IHRoZSBidWlsdC1cbmluIGBgY29tcGlsZSgpYGAgZnVuY3Rpb24gYW5kIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBmdW5jdGlvbiBvYmplY3RzXG50aHJvdWdoIHRoZWlyIGBgZnVuY19jb2RlYGAgYXR0cmlidXRlLiBTZWUgYWxzbyB0aGUgYGBjb2RlYGAgbW9kdWxlLlxuXG5BIGNvZGUgb2JqZWN0IGNhbiBiZSBleGVjdXRlZCBvciBldmFsdWF0ZWQgYnkgcGFzc2luZyBpdCAoaW5zdGVhZCBvZiBhXG5zb3VyY2Ugc3RyaW5nKSB0byB0aGUgYGBleGVjYGAgc3RhdGVtZW50IG9yIHRoZSBidWlsdC1pbiBgYGV2YWwoKWBgXG5mdW5jdGlvbi5cblxuU2VlICpUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuJywKKyAnYmx0aW4tZWxsaXBzaXMtb2JqZWN0JzogJ1xuVGhlIEVsbGlwc2lzIE9iamVjdFxuKioqKioqKioqKioqKioqKioqKlxuXG5UaGlzIG9iamVjdCBpcyB1c2VkIGJ5IGV4dGVuZGVkIHNsaWNlIG5vdGF0aW9uIChzZWUgKlNsaWNpbmdzKikuICBJdFxuc3VwcG9ydHMgbm8gc3BlY2lhbCBvcGVyYXRpb25zLiAgVGhlcmUgaXMgZXhhY3RseSBvbmUgZWxsaXBzaXMgb2JqZWN0LFxubmFtZWQgYGBFbGxpcHNpc2BgIChhIGJ1aWx0LWluIG5hbWUpLlxuXG5JdCBpcyB3cml0dGVuIGFzIGBgRWxsaXBzaXNgYC4gIFdoZW4gaW4gYSBzdWJzY3JpcHQsIGl0IGNhbiBhbHNvIGJlXG53cml0dGVuIGFzIGBgLi4uYGAsIGZvciBleGFtcGxlIGBgc2VxWy4uLl1gYC5cbicsCisgJ2JsdGluLW51bGwtb2JqZWN0JzogIlxuVGhlIE51bGwgT2JqZWN0XG4qKioqKioqKioqKioqKipcblxuVGhpcyBvYmplY3QgaXMgcmV0dXJuZWQgYnkgZnVuY3Rpb25zIHRoYXQgZG9uJ3QgZXhwbGljaXRseSByZXR1cm4gYVxudmFsdWUuICBJdCBzdXBwb3J0cyBubyBzcGVjaWFsIG9wZXJhdGlvbnMuICBUaGVyZSBpcyBleGFjdGx5IG9uZSBudWxsXG5vYmplY3QsIG5hbWVkIGBgTm9uZWBgIChhIGJ1aWx0LWluIG5hbWUpLlxuXG5JdCBpcyB3cml0dGVuIGFzIGBgTm9uZWBgLlxuIiwKKyAnYmx0aW4tdHlwZS1vYmplY3RzJzogIlxuVHlwZSBPYmplY3RzXG4qKioqKioqKioqKipcblxuVHlwZSBvYmplY3RzIHJlcHJlc2VudCB0aGUgdmFyaW91cyBvYmplY3QgdHlwZXMuICBBbiBvYmplY3QncyB0eXBlIGlzXG5hY2Nlc3NlZCBieSB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gYGB0eXBlKClgYC4gIFRoZXJlIGFyZSBubyBzcGVjaWFsXG5vcGVyYXRpb25zIG9uIHR5cGVzLiAgVGhlIHN0YW5kYXJkIG1vZHVsZSBgYHR5cGVzYGAgZGVmaW5lcyBuYW1lcyBmb3JcbmFsbCBzdGFuZGFyZCBidWlsdC1pbiB0eXBlcy5cblxuVHlwZXMgYXJlIHdyaXR0ZW4gbGlrZSB0aGlzOiBgYDx0eXBlICdpbnQnPmBgLlxuIiwKKyAnYm9vbGVhbnMnOiAnXG5Cb29sZWFuIG9wZXJhdGlvbnNcbioqKioqKioqKioqKioqKioqKlxuXG4gICBvcl90ZXN0ICA6Oj0gYW5kX3Rlc3QgfCBvcl90ZXN0ICJvciIgYW5kX3Rlc3RcbiAgIGFuZF90ZXN0IDo6PSBub3RfdGVzdCB8IGFuZF90ZXN0ICJhbmQiIG5vdF90ZXN0XG4gICBub3RfdGVzdCA6Oj0gY29tcGFyaXNvbiB8ICJub3QiIG5vdF90ZXN0XG5cbkluIHRoZSBjb250ZXh0IG9mIEJvb2xlYW4gb3BlcmF0aW9ucywgYW5kIGFsc28gd2hlbiBleHByZXNzaW9ucyBhcmVcbnVzZWQgYnkgY29udHJvbCBmbG93IHN0YXRlbWVudHMsIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBpbnRlcnByZXRlZFxuYXMgZmFsc2U6IGBgRmFsc2VgYCwgYGBOb25lYGAsIG51bWVyaWMgemVybyBvZiBhbGwgdHlwZXMsIGFuZCBlbXB0eVxuc3RyaW5ncyBhbmQgY29udGFpbmVycyAoaW5jbHVkaW5nIHN0cmluZ3MsIHR1cGxlcywgbGlzdHMsXG5kaWN0aW9uYXJpZXMsIHNldHMgYW5kIGZyb3plbnNldHMpLiAgQWxsIG90aGVyIHZhbHVlcyBhcmUgaW50ZXJwcmV0ZWRcbmFzIHRydWUuICAoU2VlIHRoZSBgYF9fbm9uemVyb19fKClgYCBzcGVjaWFsIG1ldGhvZCBmb3IgYSB3YXkgdG9cbmNoYW5nZSB0aGlzLilcblxuVGhlIG9wZXJhdG9yIGBgbm90YGAgeWllbGRzIGBgVHJ1ZWBgIGlmIGl0cyBhcmd1bWVudCBpcyBmYWxzZSxcbmBgRmFsc2VgYCBvdGhlcndpc2UuXG5cblRoZSBleHByZXNzaW9uIGBgeCBhbmQgeWBgIGZpcnN0IGV2YWx1YXRlcyAqeCo7IGlmICp4KiBpcyBmYWxzZSwgaXRzXG52YWx1ZSBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlLCAqeSogaXMgZXZhbHVhdGVkIGFuZCB0aGUgcmVzdWx0aW5nIHZhbHVlXG5pcyByZXR1cm5lZC5cblxuVGhlIGV4cHJlc3Npb24gYGB4IG9yIHlgYCBmaXJzdCBldmFsdWF0ZXMgKngqOyBpZiAqeCogaXMgdHJ1ZSwgaXRzXG52YWx1ZSBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlLCAqeSogaXMgZXZhbHVhdGVkIGFuZCB0aGUgcmVzdWx0aW5nIHZhbHVlXG5pcyByZXR1cm5lZC5cblxuKE5vdGUgdGhhdCBuZWl0aGVyIGBgYW5kYGAgbm9yIGBgb3JgYCByZXN0cmljdCB0aGUgdmFsdWUgYW5kIHR5cGUgdGhleVxucmV0dXJuIHRvIGBgRmFsc2VgYCBhbmQgYGBUcnVlYGAsIGJ1dCByYXRoZXIgcmV0dXJuIHRoZSBsYXN0IGV2YWx1YXRlZFxuYXJndW1lbnQuIFRoaXMgaXMgc29tZXRpbWVzIHVzZWZ1bCwgZS5nLiwgaWYgYGBzYGAgaXMgYSBzdHJpbmcgdGhhdFxuc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IGEgZGVmYXVsdCB2YWx1ZSBpZiBpdCBpcyBlbXB0eSwgdGhlIGV4cHJlc3Npb25cbmBgcyBvciBcJ2Zvb1wnYGAgeWllbGRzIHRoZSBkZXNpcmVkIHZhbHVlLiAgQmVjYXVzZSBgYG5vdGBgIGhhcyB0b1xuaW52ZW50IGEgdmFsdWUgYW55d2F5LCBpdCBkb2VzIG5vdCBib3RoZXIgdG8gcmV0dXJuIGEgdmFsdWUgb2YgdGhlXG5zYW1lIHR5cGUgYXMgaXRzIGFyZ3VtZW50LCBzbyBlLmcuLCBgYG5vdCBcJ2Zvb1wnYGAgeWllbGRzIGBgRmFsc2VgYCxcbm5vdCBgYFwnXCdgYC4pXG4nLAorICdicmVhayc6ICdcblRoZSBgYGJyZWFrYGAgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKioqKlxuXG4gICBicmVha19zdG10IDo6PSAiYnJlYWsiXG5cbmBgYnJlYWtgYCBtYXkgb25seSBvY2N1ciBzeW50YWN0aWNhbGx5IG5lc3RlZCBpbiBhIGBgZm9yYGAgb3JcbmBgd2hpbGVgYCBsb29wLCBidXQgbm90IG5lc3RlZCBpbiBhIGZ1bmN0aW9uIG9yIGNsYXNzIGRlZmluaXRpb25cbndpdGhpbiB0aGF0IGxvb3AuXG5cbkl0IHRlcm1pbmF0ZXMgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGxvb3AsIHNraXBwaW5nIHRoZSBvcHRpb25hbFxuYGBlbHNlYGAgY2xhdXNlIGlmIHRoZSBsb29wIGhhcyBvbmUuXG5cbklmIGEgYGBmb3JgYCBsb29wIGlzIHRlcm1pbmF0ZWQgYnkgYGBicmVha2BgLCB0aGUgbG9vcCBjb250cm9sIHRhcmdldFxua2VlcHMgaXRzIGN1cnJlbnQgdmFsdWUuXG5cbldoZW4gYGBicmVha2BgIHBhc3NlcyBjb250cm9sIG91dCBvZiBhIGBgdHJ5YGAgc3RhdGVtZW50IHdpdGggYVxuYGBmaW5hbGx5YGAgY2xhdXNlLCB0aGF0IGBgZmluYWxseWBgIGNsYXVzZSBpcyBleGVjdXRlZCBiZWZvcmUgcmVhbGx5XG5sZWF2aW5nIHRoZSBsb29wLlxuJywKKyAnY2FsbGFibGUtdHlwZXMnOiAnXG5FbXVsYXRpbmcgY2FsbGFibGUgb2JqZWN0c1xuKioqKioqKioqKioqKioqKioqKioqKioqKipcblxub2JqZWN0Ll9fY2FsbF9fKHNlbGZbLCBhcmdzLi4uXSlcblxuICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzICJjYWxsZWQiIGFzIGEgZnVuY3Rpb247IGlmIHRoaXMgbWV0aG9kXG4gICBpcyBkZWZpbmVkLCBgYHgoYXJnMSwgYXJnMiwgLi4uKWBgIGlzIGEgc2hvcnRoYW5kIGZvclxuICAgYGB4Ll9fY2FsbF9fKGFyZzEsIGFyZzIsIC4uLilgYC5cbicsCisgJ2NhbGxzJzogJ1xuQ2FsbHNcbioqKioqXG5cbkEgY2FsbCBjYWxscyBhIGNhbGxhYmxlIG9iamVjdCAoZS5nLiwgYSAqZnVuY3Rpb24qKSB3aXRoIGEgcG9zc2libHlcbmVtcHR5IHNlcmllcyBvZiAqYXJndW1lbnRzKjpcblxuICAgY2FsbCAgICAgICAgICAgICAgICAgOjo9IHByaW1hcnkgIigiIFthcmd1bWVudF9saXN0IFsiLCJdXG4gICAgICAgICAgICB8IGV4cHJlc3Npb24gZ2VuZXhwcl9mb3JdICIpIlxuICAgYXJndW1lbnRfbGlzdCAgICAgICAgOjo9IHBvc2l0aW9uYWxfYXJndW1lbnRzIFsiLCIga2V5d29yZF9hcmd1bWVudHNdXG4gICAgICAgICAgICAgICAgICAgICAgIFsiLCIgIioiIGV4cHJlc3Npb25dIFsiLCIga2V5d29yZF9hcmd1bWVudHNdXG4gICAgICAgICAgICAgICAgICAgICAgIFsiLCIgIioqIiBleHByZXNzaW9uXVxuICAgICAgICAgICAgICAgICAgICAgfCBrZXl3b3JkX2FyZ3VtZW50cyBbIiwiICIqIiBleHByZXNzaW9uXVxuICAgICAgICAgICAgICAgICAgICAgICBbIiwiICIqKiIgZXhwcmVzc2lvbl1cbiAgICAgICAgICAgICAgICAgICAgIHwgIioiIGV4cHJlc3Npb24gWyIsIiAiKiIgZXhwcmVzc2lvbl0gWyIsIiAiKioiIGV4cHJlc3Npb25dXG4gICAgICAgICAgICAgICAgICAgICB8ICIqKiIgZXhwcmVzc2lvblxuICAgcG9zaXRpb25hbF9hcmd1bWVudHMgOjo9IGV4cHJlc3Npb24gKCIsIiBleHByZXNzaW9uKSpcbiAgIGtleXdvcmRfYXJndW1lbnRzICAgIDo6PSBrZXl3b3JkX2l0ZW0gKCIsIiBrZXl3b3JkX2l0ZW0pKlxuICAga2V5d29yZF9pdGVtICAgICAgICAgOjo9IGlkZW50aWZpZXIgIj0iIGV4cHJlc3Npb25cblxuQSB0cmFpbGluZyBjb21tYSBtYXkgYmUgcHJlc2VudCBhZnRlciB0aGUgcG9zaXRpb25hbCBhbmQga2V5d29yZFxuYXJndW1lbnRzIGJ1dCBkb2VzIG5vdCBhZmZlY3QgdGhlIHNlbWFudGljcy5cblxuVGhlIHByaW1hcnkgbXVzdCBldmFsdWF0ZSB0byBhIGNhbGxhYmxlIG9iamVjdCAodXNlci1kZWZpbmVkXG5mdW5jdGlvbnMsIGJ1aWx0LWluIGZ1bmN0aW9ucywgbWV0aG9kcyBvZiBidWlsdC1pbiBvYmplY3RzLCBjbGFzc1xub2JqZWN0cywgbWV0aG9kcyBvZiBjbGFzcyBpbnN0YW5jZXMsIGFuZCBjZXJ0YWluIGNsYXNzIGluc3RhbmNlc1xudGhlbXNlbHZlcyBhcmUgY2FsbGFibGU7IGV4dGVuc2lvbnMgbWF5IGRlZmluZSBhZGRpdGlvbmFsIGNhbGxhYmxlXG5vYmplY3QgdHlwZXMpLiAgQWxsIGFyZ3VtZW50IGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgYmVmb3JlIHRoZSBjYWxsXG5pcyBhdHRlbXB0ZWQuICBQbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiAqRnVuY3Rpb24gZGVmaW5pdGlvbnMqIGZvciB0aGVcbnN5bnRheCBvZiBmb3JtYWwgKnBhcmFtZXRlciogbGlzdHMuXG5cbklmIGtleXdvcmQgYXJndW1lbnRzIGFyZSBwcmVzZW50LCB0aGV5IGFyZSBmaXJzdCBjb252ZXJ0ZWQgdG9cbnBvc2l0aW9uYWwgYXJndW1lbnRzLCBhcyBmb2xsb3dzLiAgRmlyc3QsIGEgbGlzdCBvZiB1bmZpbGxlZCBzbG90cyBpc1xuY3JlYXRlZCBmb3IgdGhlIGZvcm1hbCBwYXJhbWV0ZXJzLiAgSWYgdGhlcmUgYXJlIE4gcG9zaXRpb25hbFxuYXJndW1lbnRzLCB0aGV5IGFyZSBwbGFjZWQgaW4gdGhlIGZpcnN0IE4gc2xvdHMuICBOZXh0LCBmb3IgZWFjaFxua2V5d29yZCBhcmd1bWVudCwgdGhlIGlkZW50aWZpZXIgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlXG5jb3JyZXNwb25kaW5nIHNsb3QgKGlmIHRoZSBpZGVudGlmaWVyIGlzIHRoZSBzYW1lIGFzIHRoZSBmaXJzdCBmb3JtYWxcbnBhcmFtZXRlciBuYW1lLCB0aGUgZmlyc3Qgc2xvdCBpcyB1c2VkLCBhbmQgc28gb24pLiAgSWYgdGhlIHNsb3QgaXNcbmFscmVhZHkgZmlsbGVkLCBhIGBgVHlwZUVycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZC4gT3RoZXJ3aXNlLCB0aGVcbnZhbHVlIG9mIHRoZSBhcmd1bWVudCBpcyBwbGFjZWQgaW4gdGhlIHNsb3QsIGZpbGxpbmcgaXQgKGV2ZW4gaWYgdGhlXG5leHByZXNzaW9uIGlzIGBgTm9uZWBgLCBpdCBmaWxscyB0aGUgc2xvdCkuICBXaGVuIGFsbCBhcmd1bWVudHMgaGF2ZVxuYmVlbiBwcm9jZXNzZWQsIHRoZSBzbG90cyB0aGF0IGFyZSBzdGlsbCB1bmZpbGxlZCBhcmUgZmlsbGVkIHdpdGggdGhlXG5jb3JyZXNwb25kaW5nIGRlZmF1bHQgdmFsdWUgZnJvbSB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIChEZWZhdWx0XG52YWx1ZXMgYXJlIGNhbGN1bGF0ZWQsIG9uY2UsIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQ7IHRodXMsIGFcbm11dGFibGUgb2JqZWN0IHN1Y2ggYXMgYSBsaXN0IG9yIGRpY3Rpb25hcnkgdXNlZCBhcyBkZWZhdWx0IHZhbHVlIHdpbGxcbmJlIHNoYXJlZCBieSBhbGwgY2FsbHMgdGhhdCBkb25cJ3Qgc3BlY2lmeSBhbiBhcmd1bWVudCB2YWx1ZSBmb3IgdGhlXG5jb3JyZXNwb25kaW5nIHNsb3Q7IHRoaXMgc2hvdWxkIHVzdWFsbHkgYmUgYXZvaWRlZC4pICBJZiB0aGVyZSBhcmUgYW55XG51bmZpbGxlZCBzbG90cyBmb3Igd2hpY2ggbm8gZGVmYXVsdCB2YWx1ZSBpcyBzcGVjaWZpZWQsIGFcbmBgVHlwZUVycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZC4gIE90aGVyd2lzZSwgdGhlIGxpc3Qgb2YgZmlsbGVkXG5zbG90cyBpcyB1c2VkIGFzIHRoZSBhcmd1bWVudCBsaXN0IGZvciB0aGUgY2FsbC5cblxuKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBBbiBpbXBsZW1lbnRhdGlvbiBtYXkgcHJvdmlkZVxuYnVpbHQtaW4gZnVuY3Rpb25zIHdob3NlIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBkbyBub3QgaGF2ZSBuYW1lcywgZXZlblxuaWYgdGhleSBhcmUgXCduYW1lZFwnIGZvciB0aGUgcHVycG9zZSBvZiBkb2N1bWVudGF0aW9uLCBhbmQgd2hpY2hcbnRoZXJlZm9yZSBjYW5ub3QgYmUgc3VwcGxpZWQgYnkga2V5d29yZC4gIEluIENQeXRob24sIHRoaXMgaXMgdGhlIGNhc2VcbmZvciBmdW5jdGlvbnMgaW1wbGVtZW50ZWQgaW4gQyB0aGF0IHVzZSBgYFB5QXJnX1BhcnNlVHVwbGUoKWBgIHRvXG5wYXJzZSB0aGVpciBhcmd1bWVudHMuXG5cbklmIHRoZXJlIGFyZSBtb3JlIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRoYW4gdGhlcmUgYXJlIGZvcm1hbCBwYXJhbWV0ZXJcbnNsb3RzLCBhIGBgVHlwZUVycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZCwgdW5sZXNzIGEgZm9ybWFsIHBhcmFtZXRlclxudXNpbmcgdGhlIHN5bnRheCBgYCppZGVudGlmaWVyYGAgaXMgcHJlc2VudDsgaW4gdGhpcyBjYXNlLCB0aGF0IGZvcm1hbFxucGFyYW1ldGVyIHJlY2VpdmVzIGEgdHVwbGUgY29udGFpbmluZyB0aGUgZXhjZXNzIHBvc2l0aW9uYWwgYXJndW1lbnRzXG4ob3IgYW4gZW1wdHkgdHVwbGUgaWYgdGhlcmUgd2VyZSBubyBleGNlc3MgcG9zaXRpb25hbCBhcmd1bWVudHMpLlxuXG5JZiBhbnkga2V5d29yZCBhcmd1bWVudCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgZm9ybWFsIHBhcmFtZXRlclxubmFtZSwgYSBgYFR5cGVFcnJvcmBgIGV4Y2VwdGlvbiBpcyByYWlzZWQsIHVubGVzcyBhIGZvcm1hbCBwYXJhbWV0ZXJcbnVzaW5nIHRoZSBzeW50YXggYGAqKmlkZW50aWZpZXJgYCBpcyBwcmVzZW50OyBpbiB0aGlzIGNhc2UsIHRoYXRcbmZvcm1hbCBwYXJhbWV0ZXIgcmVjZWl2ZXMgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIGV4Y2VzcyBrZXl3b3JkXG5hcmd1bWVudHMgKHVzaW5nIHRoZSBrZXl3b3JkcyBhcyBrZXlzIGFuZCB0aGUgYXJndW1lbnQgdmFsdWVzIGFzXG5jb3JyZXNwb25kaW5nIHZhbHVlcyksIG9yIGEgKG5ldykgZW1wdHkgZGljdGlvbmFyeSBpZiB0aGVyZSB3ZXJlIG5vXG5leGNlc3Mga2V5d29yZCBhcmd1bWVudHMuXG5cbklmIHRoZSBzeW50YXggYGAqZXhwcmVzc2lvbmBgIGFwcGVhcnMgaW4gdGhlIGZ1bmN0aW9uIGNhbGwsXG5gYGV4cHJlc3Npb25gYCBtdXN0IGV2YWx1YXRlIHRvIGFuIGl0ZXJhYmxlLiAgRWxlbWVudHMgZnJvbSB0aGlzXG5pdGVyYWJsZSBhcmUgdHJlYXRlZCBhcyBpZiB0aGV5IHdlcmUgYWRkaXRpb25hbCBwb3NpdGlvbmFsIGFyZ3VtZW50cztcbmlmIHRoZXJlIGFyZSBwb3NpdGlvbmFsIGFyZ3VtZW50cyAqeDEqLCAuLi4sICp4TiosIGFuZCBgYGV4cHJlc3Npb25gYFxuZXZhbHVhdGVzIHRvIGEgc2VxdWVuY2UgKnkxKiwgLi4uLCAqeU0qLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gYSBjYWxsXG53aXRoIE0rTiBwb3NpdGlvbmFsIGFyZ3VtZW50cyAqeDEqLCAuLi4sICp4TiosICp5MSosIC4uLiwgKnlNKi5cblxuQSBjb25zZXF1ZW5jZSBvZiB0aGlzIGlzIHRoYXQgYWx0aG91Z2ggdGhlIGBgKmV4cHJlc3Npb25gYCBzeW50YXggbWF5XG5hcHBlYXIgKmFmdGVyKiBzb21lIGtleXdvcmQgYXJndW1lbnRzLCBpdCBpcyBwcm9jZXNzZWQgKmJlZm9yZSogdGhlXG5rZXl3b3JkIGFyZ3VtZW50cyAoYW5kIHRoZSBgYCoqZXhwcmVzc2lvbmBgIGFyZ3VtZW50LCBpZiBhbnkgLS0gc2VlXG5iZWxvdykuICBTbzpcblxuICAgPj4+IGRlZiBmKGEsIGIpOlxuICAgLi4uICBwcmludCBhLCBiXG4gICAuLi5cbiAgID4+PiBmKGI9MSwgKigyLCkpXG4gICAyIDFcbiAgID4+PiBmKGE9MSwgKigyLCkpXG4gICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4gICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID9cbiAgIFR5cGVFcnJvcjogZigpIGdvdCBtdWx0aXBsZSB2YWx1ZXMgZm9yIGtleXdvcmQgYXJndW1lbnQgXCdhXCdcbiAgID4+PiBmKDEsICooMiwpKVxuICAgMSAyXG5cbkl0IGlzIHVudXN1YWwgZm9yIGJvdGgga2V5d29yZCBhcmd1bWVudHMgYW5kIHRoZSBgYCpleHByZXNzaW9uYGBcbnN5bnRheCB0byBiZSB1c2VkIGluIHRoZSBzYW1lIGNhbGwsIHNvIGluIHByYWN0aWNlIHRoaXMgY29uZnVzaW9uIGRvZXNcbm5vdCBhcmlzZS5cblxuSWYgdGhlIHN5bnRheCBgYCoqZXhwcmVzc2lvbmBgIGFwcGVhcnMgaW4gdGhlIGZ1bmN0aW9uIGNhbGwsXG5gYGV4cHJlc3Npb25gYCBtdXN0IGV2YWx1YXRlIHRvIGEgbWFwcGluZywgdGhlIGNvbnRlbnRzIG9mIHdoaWNoIGFyZVxudHJlYXRlZCBhcyBhZGRpdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzLiAgSW4gdGhlIGNhc2Ugb2YgYSBrZXl3b3JkXG5hcHBlYXJpbmcgaW4gYm90aCBgYGV4cHJlc3Npb25gYCBhbmQgYXMgYW4gZXhwbGljaXQga2V5d29yZCBhcmd1bWVudCxcbmEgYGBUeXBlRXJyb3JgYCBleGNlcHRpb24gaXMgcmFpc2VkLlxuXG5Gb3JtYWwgcGFyYW1ldGVycyB1c2luZyB0aGUgc3ludGF4IGBgKmlkZW50aWZpZXJgYCBvciBgYCoqaWRlbnRpZmllcmBgXG5jYW5ub3QgYmUgdXNlZCBhcyBwb3NpdGlvbmFsIGFyZ3VtZW50IHNsb3RzIG9yIGFzIGtleXdvcmQgYXJndW1lbnRcbm5hbWVzLiAgRm9ybWFsIHBhcmFtZXRlcnMgdXNpbmcgdGhlIHN5bnRheCBgYChzdWJsaXN0KWBgIGNhbm5vdCBiZVxudXNlZCBhcyBrZXl3b3JkIGFyZ3VtZW50IG5hbWVzOyB0aGUgb3V0ZXJtb3N0IHN1Ymxpc3QgY29ycmVzcG9uZHMgdG8gYVxuc2luZ2xlIHVubmFtZWQgYXJndW1lbnQgc2xvdCwgYW5kIHRoZSBhcmd1bWVudCB2YWx1ZSBpcyBhc3NpZ25lZCB0b1xudGhlIHN1Ymxpc3QgdXNpbmcgdGhlIHVzdWFsIHR1cGxlIGFzc2lnbm1lbnQgcnVsZXMgYWZ0ZXIgYWxsIG90aGVyXG5wYXJhbWV0ZXIgcHJvY2Vzc2luZyBpcyBkb25lLlxuXG5BIGNhbGwgYWx3YXlzIHJldHVybnMgc29tZSB2YWx1ZSwgcG9zc2libHkgYGBOb25lYGAsIHVubGVzcyBpdCByYWlzZXNcbmFuIGV4Y2VwdGlvbi4gIEhvdyB0aGlzIHZhbHVlIGlzIGNvbXB1dGVkIGRlcGVuZHMgb24gdGhlIHR5cGUgb2YgdGhlXG5jYWxsYWJsZSBvYmplY3QuXG5cbklmIGl0IGlzLS0tXG5cbmEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uOlxuICAgVGhlIGNvZGUgYmxvY2sgZm9yIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZCwgcGFzc2luZyBpdCB0aGVcbiAgIGFyZ3VtZW50IGxpc3QuICBUaGUgZmlyc3QgdGhpbmcgdGhlIGNvZGUgYmxvY2sgd2lsbCBkbyBpcyBiaW5kIHRoZVxuICAgZm9ybWFsIHBhcmFtZXRlcnMgdG8gdGhlIGFyZ3VtZW50czsgdGhpcyBpcyBkZXNjcmliZWQgaW4gc2VjdGlvblxuICAgKkZ1bmN0aW9uIGRlZmluaXRpb25zKi4gIFdoZW4gdGhlIGNvZGUgYmxvY2sgZXhlY3V0ZXMgYSBgYHJldHVybmBgXG4gICBzdGF0ZW1lbnQsIHRoaXMgc3BlY2lmaWVzIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIGNhbGwuXG5cbmEgYnVpbHQtaW4gZnVuY3Rpb24gb3IgbWV0aG9kOlxuICAgVGhlIHJlc3VsdCBpcyB1cCB0byB0aGUgaW50ZXJwcmV0ZXI7IHNlZSAqQnVpbHQtaW4gRnVuY3Rpb25zKiBmb3JcbiAgIHRoZSBkZXNjcmlwdGlvbnMgb2YgYnVpbHQtaW4gZnVuY3Rpb25zIGFuZCBtZXRob2RzLlxuXG5hIGNsYXNzIG9iamVjdDpcbiAgIEEgbmV3IGluc3RhbmNlIG9mIHRoYXQgY2xhc3MgaXMgcmV0dXJuZWQuXG5cbmEgY2xhc3MgaW5zdGFuY2UgbWV0aG9kOlxuICAgVGhlIGNvcnJlc3BvbmRpbmcgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIGlzIGNhbGxlZCwgd2l0aCBhbiBhcmd1bWVudFxuICAgbGlzdCB0aGF0IGlzIG9uZSBsb25nZXIgdGhhbiB0aGUgYXJndW1lbnQgbGlzdCBvZiB0aGUgY2FsbDogdGhlXG4gICBpbnN0YW5jZSBiZWNvbWVzIHRoZSBmaXJzdCBhcmd1bWVudC5cblxuYSBjbGFzcyBpbnN0YW5jZTpcbiAgIFRoZSBjbGFzcyBtdXN0IGRlZmluZSBhIGBgX19jYWxsX18oKWBgIG1ldGhvZDsgdGhlIGVmZmVjdCBpcyB0aGVuXG4gICB0aGUgc2FtZSBhcyBpZiB0aGF0IG1ldGhvZCB3YXMgY2FsbGVkLlxuJywKKyAnY2xhc3MnOiAnXG5DbGFzcyBkZWZpbml0aW9uc1xuKioqKioqKioqKioqKioqKipcblxuQSBjbGFzcyBkZWZpbml0aW9uIGRlZmluZXMgYSBjbGFzcyBvYmplY3QgKHNlZSBzZWN0aW9uICpUaGUgc3RhbmRhcmRcbnR5cGUgaGllcmFyY2h5Kik6XG5cbiAgIGNsYXNzZGVmICAgIDo6PSAiY2xhc3MiIGNsYXNzbmFtZSBbaW5oZXJpdGFuY2VdICI6IiBzdWl0ZVxuICAgaW5oZXJpdGFuY2UgOjo9ICIoIiBbZXhwcmVzc2lvbl9saXN0XSAiKSJcbiAgIGNsYXNzbmFtZSAgIDo6PSBpZGVudGlmaWVyXG5cbkEgY2xhc3MgZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudC4gIEl0IGZpcnN0IGV2YWx1YXRlcyB0aGVcbmluaGVyaXRhbmNlIGxpc3QsIGlmIHByZXNlbnQuICBFYWNoIGl0ZW0gaW4gdGhlIGluaGVyaXRhbmNlIGxpc3RcbnNob3VsZCBldmFsdWF0ZSB0byBhIGNsYXNzIG9iamVjdCBvciBjbGFzcyB0eXBlIHdoaWNoIGFsbG93c1xuc3ViY2xhc3NpbmcuICBUaGUgY2xhc3NcJ3Mgc3VpdGUgaXMgdGhlbiBleGVjdXRlZCBpbiBhIG5ldyBleGVjdXRpb25cbmZyYW1lIChzZWUgc2VjdGlvbiAqTmFtaW5nIGFuZCBiaW5kaW5nKiksIHVzaW5nIGEgbmV3bHkgY3JlYXRlZCBsb2NhbFxubmFtZXNwYWNlIGFuZCB0aGUgb3JpZ2luYWwgZ2xvYmFsIG5hbWVzcGFjZS4gKFVzdWFsbHksIHRoZSBzdWl0ZVxuY29udGFpbnMgb25seSBmdW5jdGlvbiBkZWZpbml0aW9ucy4pICBXaGVuIHRoZSBjbGFzc1wncyBzdWl0ZSBmaW5pc2hlc1xuZXhlY3V0aW9uLCBpdHMgZXhlY3V0aW9uIGZyYW1lIGlzIGRpc2NhcmRlZCBidXQgaXRzIGxvY2FsIG5hbWVzcGFjZSBpc1xuc2F2ZWQuIFs0XSBBIGNsYXNzIG9iamVjdCBpcyB0aGVuIGNyZWF0ZWQgdXNpbmcgdGhlIGluaGVyaXRhbmNlIGxpc3RcbmZvciB0aGUgYmFzZSBjbGFzc2VzIGFuZCB0aGUgc2F2ZWQgbG9jYWwgbmFtZXNwYWNlIGZvciB0aGUgYXR0cmlidXRlXG5kaWN0aW9uYXJ5LiAgVGhlIGNsYXNzIG5hbWUgaXMgYm91bmQgdG8gdGhpcyBjbGFzcyBvYmplY3QgaW4gdGhlXG5vcmlnaW5hbCBsb2NhbCBuYW1lc3BhY2UuXG5cbioqUHJvZ3JhbW1lclwncyBub3RlOioqIFZhcmlhYmxlcyBkZWZpbmVkIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uIGFyZVxuY2xhc3MgdmFyaWFibGVzOyB0aGV5IGFyZSBzaGFyZWQgYnkgYWxsIGluc3RhbmNlcy4gIFRvIGNyZWF0ZSBpbnN0YW5jZVxudmFyaWFibGVzLCB0aGV5IGNhbiBiZSBzZXQgaW4gYSBtZXRob2Qgd2l0aCBgYHNlbGYubmFtZSA9IHZhbHVlYGAuXG5Cb3RoIGNsYXNzIGFuZCBpbnN0YW5jZSB2YXJpYWJsZXMgYXJlIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUgbm90YXRpb25cbiJgYHNlbGYubmFtZWBgIiwgYW5kIGFuIGluc3RhbmNlIHZhcmlhYmxlIGhpZGVzIGEgY2xhc3MgdmFyaWFibGUgd2l0aFxudGhlIHNhbWUgbmFtZSB3aGVuIGFjY2Vzc2VkIGluIHRoaXMgd2F5LiBDbGFzcyB2YXJpYWJsZXMgY2FuIGJlIHVzZWRcbmFzIGRlZmF1bHRzIGZvciBpbnN0YW5jZSB2YXJpYWJsZXMsIGJ1dCB1c2luZyBtdXRhYmxlIHZhbHVlcyB0aGVyZSBjYW5cbmxlYWQgdG8gdW5leHBlY3RlZCByZXN1bHRzLiAgRm9yICpuZXctc3R5bGUgY2xhc3MqZXMsIGRlc2NyaXB0b3JzIGNhblxuYmUgdXNlZCB0byBjcmVhdGUgaW5zdGFuY2UgdmFyaWFibGVzIHdpdGggZGlmZmVyZW50IGltcGxlbWVudGF0aW9uXG5kZXRhaWxzLlxuXG5DbGFzcyBkZWZpbml0aW9ucywgbGlrZSBmdW5jdGlvbiBkZWZpbml0aW9ucywgbWF5IGJlIHdyYXBwZWQgYnkgb25lIG9yXG5tb3JlICpkZWNvcmF0b3IqIGV4cHJlc3Npb25zLiAgVGhlIGV2YWx1YXRpb24gcnVsZXMgZm9yIHRoZSBkZWNvcmF0b3JcbmV4cHJlc3Npb25zIGFyZSB0aGUgc2FtZSBhcyBmb3IgZnVuY3Rpb25zLiAgVGhlIHJlc3VsdCBtdXN0IGJlIGEgY2xhc3Ncbm9iamVjdCwgd2hpY2ggaXMgdGhlbiBib3VuZCB0byB0aGUgY2xhc3MgbmFtZS5cblxuLVsgRm9vdG5vdGVzIF0tXG5cblsxXSBUaGUgZXhjZXB0aW9uIGlzIHByb3BhZ2F0ZWQgdG8gdGhlIGludm9jYXRpb24gc3RhY2sgdW5sZXNzIHRoZXJlXG4gICAgaXMgYSBgYGZpbmFsbHlgYCBjbGF1c2Ugd2hpY2ggaGFwcGVucyB0byByYWlzZSBhbm90aGVyIGV4Y2VwdGlvbi5cbiAgICBUaGF0IG5ldyBleGNlcHRpb24gY2F1c2VzIHRoZSBvbGQgb25lIHRvIGJlIGxvc3QuXG5cblsyXSBDdXJyZW50bHksIGNvbnRyb2wgImZsb3dzIG9mZiB0aGUgZW5kIiBleGNlcHQgaW4gdGhlIGNhc2Ugb2YgYW5cbiAgICBleGNlcHRpb24gb3IgdGhlIGV4ZWN1dGlvbiBvZiBhIGBgcmV0dXJuYGAsIGBgY29udGludWVgYCwgb3JcbiAgICBgYGJyZWFrYGAgc3RhdGVtZW50LlxuXG5bM10gQSBzdHJpbmcgbGl0ZXJhbCBhcHBlYXJpbmcgYXMgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiB0aGUgZnVuY3Rpb25cbiAgICBib2R5IGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIGZ1bmN0aW9uXCdzIGBgX19kb2NfX2BgIGF0dHJpYnV0ZSBhbmRcbiAgICB0aGVyZWZvcmUgdGhlIGZ1bmN0aW9uXCdzICpkb2NzdHJpbmcqLlxuXG5bNF0gQSBzdHJpbmcgbGl0ZXJhbCBhcHBlYXJpbmcgYXMgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiB0aGUgY2xhc3NcbiAgICBib2R5IGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIG5hbWVzcGFjZVwncyBgYF9fZG9jX19gYCBpdGVtIGFuZFxuICAgIHRoZXJlZm9yZSB0aGUgY2xhc3NcJ3MgKmRvY3N0cmluZyouXG4nLAorICdjb21wYXJpc29ucyc6ICdcbkNvbXBhcmlzb25zXG4qKioqKioqKioqKlxuXG5Vbmxpa2UgQywgYWxsIGNvbXBhcmlzb24gb3BlcmF0aW9ucyBpbiBQeXRob24gaGF2ZSB0aGUgc2FtZSBwcmlvcml0eSxcbndoaWNoIGlzIGxvd2VyIHRoYW4gdGhhdCBvZiBhbnkgYXJpdGhtZXRpYywgc2hpZnRpbmcgb3IgYml0d2lzZVxub3BlcmF0aW9uLiAgQWxzbyB1bmxpa2UgQywgZXhwcmVzc2lvbnMgbGlrZSBgYGEgPCBiIDwgY2BgIGhhdmUgdGhlXG5pbnRlcnByZXRhdGlvbiB0aGF0IGlzIGNvbnZlbnRpb25hbCBpbiBtYXRoZW1hdGljczpcblxuICAgY29tcGFyaXNvbiAgICA6Oj0gb3JfZXhwciAoIGNvbXBfb3BlcmF0b3Igb3JfZXhwciApKlxuICAgY29tcF9vcGVyYXRvciA6Oj0gIjwiIHwgIj4iIHwgIj09IiB8ICI+PSIgfCAiPD0iIHwgIjw+IiB8ICIhPSJcbiAgICAgICAgICAgICAgICAgICAgIHwgImlzIiBbIm5vdCJdIHwgWyJub3QiXSAiaW4iXG5cbkNvbXBhcmlzb25zIHlpZWxkIGJvb2xlYW4gdmFsdWVzOiBgYFRydWVgYCBvciBgYEZhbHNlYGAuXG5cbkNvbXBhcmlzb25zIGNhbiBiZSBjaGFpbmVkIGFyYml0cmFyaWx5LCBlLmcuLCBgYHggPCB5IDw9IHpgYCBpc1xuZXF1aXZhbGVudCB0byBgYHggPCB5IGFuZCB5IDw9IHpgYCwgZXhjZXB0IHRoYXQgYGB5YGAgaXMgZXZhbHVhdGVkXG5vbmx5IG9uY2UgKGJ1dCBpbiBib3RoIGNhc2VzIGBgemBgIGlzIG5vdCBldmFsdWF0ZWQgYXQgYWxsIHdoZW4gYGB4IDxcbnlgYCBpcyBmb3VuZCB0byBiZSBmYWxzZSkuXG5cbkZvcm1hbGx5LCBpZiAqYSosICpiKiwgKmMqLCAuLi4sICp5KiwgKnoqIGFyZSBleHByZXNzaW9ucyBhbmQgKm9wMSosXG4qb3AyKiwgLi4uLCAqb3BOKiBhcmUgY29tcGFyaXNvbiBvcGVyYXRvcnMsIHRoZW4gYGBhIG9wMSBiIG9wMiBjIC4uLiB5XG5vcE4gemBgIGlzIGVxdWl2YWxlbnQgdG8gYGBhIG9wMSBiIGFuZCBiIG9wMiBjIGFuZCAuLi4geSBvcE4gemBgLFxuZXhjZXB0IHRoYXQgZWFjaCBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBhdCBtb3N0IG9uY2UuXG5cbk5vdGUgdGhhdCBgYGEgb3AxIGIgb3AyIGNgYCBkb2VzblwndCBpbXBseSBhbnkga2luZCBvZiBjb21wYXJpc29uXG5iZXR3ZWVuICphKiBhbmQgKmMqLCBzbyB0aGF0LCBlLmcuLCBgYHggPCB5ID4gemBgIGlzIHBlcmZlY3RseSBsZWdhbFxuKHRob3VnaCBwZXJoYXBzIG5vdCBwcmV0dHkpLlxuXG5UaGUgZm9ybXMgYGA8PmBgIGFuZCBgYCE9YGAgYXJlIGVxdWl2YWxlbnQ7IGZvciBjb25zaXN0ZW5jeSB3aXRoIEMsXG5gYCE9YGAgaXMgcHJlZmVycmVkOyB3aGVyZSBgYCE9YGAgaXMgbWVudGlvbmVkIGJlbG93IGBgPD5gYCBpcyBhbHNvXG5hY2NlcHRlZC4gIFRoZSBgYDw+YGAgc3BlbGxpbmcgaXMgY29uc2lkZXJlZCBvYnNvbGVzY2VudC5cblxuVGhlIG9wZXJhdG9ycyBgYDxgYCwgYGA+YGAsIGBgPT1gYCwgYGA+PWBgLCBgYDw9YGAsIGFuZCBgYCE9YGAgY29tcGFyZVxudGhlIHZhbHVlcyBvZiB0d28gb2JqZWN0cy4gIFRoZSBvYmplY3RzIG5lZWQgbm90IGhhdmUgdGhlIHNhbWUgdHlwZS5cbklmIGJvdGggYXJlIG51bWJlcnMsIHRoZXkgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLiAgT3RoZXJ3aXNlLFxub2JqZWN0cyBvZiBkaWZmZXJlbnQgdHlwZXMgKmFsd2F5cyogY29tcGFyZSB1bmVxdWFsLCBhbmQgYXJlIG9yZGVyZWRcbmNvbnNpc3RlbnRseSBidXQgYXJiaXRyYXJpbHkuIFlvdSBjYW4gY29udHJvbCBjb21wYXJpc29uIGJlaGF2aW9yIG9mXG5vYmplY3RzIG9mIG5vbi1idWlsdC1pbiB0eXBlcyBieSBkZWZpbmluZyBhIGBgX19jbXBfX2BgIG1ldGhvZCBvciByaWNoXG5jb21wYXJpc29uIG1ldGhvZHMgbGlrZSBgYF9fZ3RfX2BgLCBkZXNjcmliZWQgaW4gc2VjdGlvbiAqU3BlY2lhbFxubWV0aG9kIG5hbWVzKi5cblxuKFRoaXMgdW51c3VhbCBkZWZpbml0aW9uIG9mIGNvbXBhcmlzb24gd2FzIHVzZWQgdG8gc2ltcGxpZnkgdGhlXG5kZWZpbml0aW9uIG9mIG9wZXJhdGlvbnMgbGlrZSBzb3J0aW5nIGFuZCB0aGUgYGBpbmBgIGFuZCBgYG5vdCBpbmBgXG5vcGVyYXRvcnMuIEluIHRoZSBmdXR1cmUsIHRoZSBjb21wYXJpc29uIHJ1bGVzIGZvciBvYmplY3RzIG9mXG5kaWZmZXJlbnQgdHlwZXMgYXJlIGxpa2VseSB0byBjaGFuZ2UuKVxuXG5Db21wYXJpc29uIG9mIG9iamVjdHMgb2YgdGhlIHNhbWUgdHlwZSBkZXBlbmRzIG9uIHRoZSB0eXBlOlxuXG4qIE51bWJlcnMgYXJlIGNvbXBhcmVkIGFyaXRobWV0aWNhbGx5LlxuXG4qIFN0cmluZ3MgYXJlIGNvbXBhcmVkIGxleGljb2dyYXBoaWNhbGx5IHVzaW5nIHRoZSBudW1lcmljIGVxdWl2YWxlbnRzXG4gICh0aGUgcmVzdWx0IG9mIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYG9yZCgpYGApIG9mIHRoZWlyIGNoYXJhY3RlcnMuXG4gIFVuaWNvZGUgYW5kIDgtYml0IHN0cmluZ3MgYXJlIGZ1bGx5IGludGVyb3BlcmFibGUgaW4gdGhpcyBiZWhhdmlvci5cbiAgWzRdXG5cbiogVHVwbGVzIGFuZCBsaXN0cyBhcmUgY29tcGFyZWQgbGV4aWNvZ3JhcGhpY2FsbHkgdXNpbmcgY29tcGFyaXNvbiBvZlxuICBjb3JyZXNwb25kaW5nIGVsZW1lbnRzLiAgVGhpcyBtZWFucyB0aGF0IHRvIGNvbXBhcmUgZXF1YWwsIGVhY2hcbiAgZWxlbWVudCBtdXN0IGNvbXBhcmUgZXF1YWwgYW5kIHRoZSB0d28gc2VxdWVuY2VzIG11c3QgYmUgb2YgdGhlIHNhbWVcbiAgdHlwZSBhbmQgaGF2ZSB0aGUgc2FtZSBsZW5ndGguXG5cbiAgSWYgbm90IGVxdWFsLCB0aGUgc2VxdWVuY2VzIGFyZSBvcmRlcmVkIHRoZSBzYW1lIGFzIHRoZWlyIGZpcnN0XG4gIGRpZmZlcmluZyBlbGVtZW50cy4gIEZvciBleGFtcGxlLCBgYGNtcChbMSwyLHhdLCBbMSwyLHldKWBgIHJldHVybnNcbiAgdGhlIHNhbWUgYXMgYGBjbXAoeCx5KWBgLiAgSWYgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBkb2VzIG5vdFxuICBleGlzdCwgdGhlIHNob3J0ZXIgc2VxdWVuY2UgaXMgb3JkZXJlZCBmaXJzdCAoZm9yIGV4YW1wbGUsIGBgWzEsMl0gPFxuICBbMSwyLDNdYGApLlxuXG4qIE1hcHBpbmdzIChkaWN0aW9uYXJpZXMpIGNvbXBhcmUgZXF1YWwgaWYgYW5kIG9ubHkgaWYgdGhlaXIgc29ydGVkXG4gIChrZXksIHZhbHVlKSBsaXN0cyBjb21wYXJlIGVxdWFsLiBbNV0gT3V0Y29tZXMgb3RoZXIgdGhhbiBlcXVhbGl0eVxuICBhcmUgcmVzb2x2ZWQgY29uc2lzdGVudGx5LCBidXQgYXJlIG5vdCBvdGhlcndpc2UgZGVmaW5lZC4gWzZdXG5cbiogTW9zdCBvdGhlciBvYmplY3RzIG9mIGJ1aWx0LWluIHR5cGVzIGNvbXBhcmUgdW5lcXVhbCB1bmxlc3MgdGhleSBhcmVcbiAgdGhlIHNhbWUgb2JqZWN0OyB0aGUgY2hvaWNlIHdoZXRoZXIgb25lIG9iamVjdCBpcyBjb25zaWRlcmVkIHNtYWxsZXJcbiAgb3IgbGFyZ2VyIHRoYW4gYW5vdGhlciBvbmUgaXMgbWFkZSBhcmJpdHJhcmlseSBidXQgY29uc2lzdGVudGx5XG4gIHdpdGhpbiBvbmUgZXhlY3V0aW9uIG9mIGEgcHJvZ3JhbS5cblxuVGhlIG9wZXJhdG9ycyBgYGluYGAgYW5kIGBgbm90IGluYGAgdGVzdCBmb3IgY29sbGVjdGlvbiBtZW1iZXJzaGlwLlxuYGB4IGluIHNgYCBldmFsdWF0ZXMgdG8gdHJ1ZSBpZiAqeCogaXMgYSBtZW1iZXIgb2YgdGhlIGNvbGxlY3Rpb24gKnMqLFxuYW5kIGZhbHNlIG90aGVyd2lzZS4gIGBgeCBub3QgaW4gc2BgIHJldHVybnMgdGhlIG5lZ2F0aW9uIG9mIGBgeCBpblxuc2BgLiBUaGUgY29sbGVjdGlvbiBtZW1iZXJzaGlwIHRlc3QgaGFzIHRyYWRpdGlvbmFsbHkgYmVlbiBib3VuZCB0b1xuc2VxdWVuY2VzOyBhbiBvYmplY3QgaXMgYSBtZW1iZXIgb2YgYSBjb2xsZWN0aW9uIGlmIHRoZSBjb2xsZWN0aW9uIGlzXG5hIHNlcXVlbmNlIGFuZCBjb250YWlucyBhbiBlbGVtZW50IGVxdWFsIHRvIHRoYXQgb2JqZWN0LiAgSG93ZXZlciwgaXRcbm1ha2Ugc2Vuc2UgZm9yIG1hbnkgb3RoZXIgb2JqZWN0IHR5cGVzIHRvIHN1cHBvcnQgbWVtYmVyc2hpcCB0ZXN0c1xud2l0aG91dCBiZWluZyBhIHNlcXVlbmNlLiAgSW4gcGFydGljdWxhciwgZGljdGlvbmFyaWVzIChmb3Iga2V5cykgYW5kXG5zZXRzIHN1cHBvcnQgbWVtYmVyc2hpcCB0ZXN0aW5nLlxuXG5Gb3IgdGhlIGxpc3QgYW5kIHR1cGxlIHR5cGVzLCBgYHggaW4geWBgIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlcmVcbmV4aXN0cyBhbiBpbmRleCAqaSogc3VjaCB0aGF0IGBgeCA9PSB5W2ldYGAgaXMgdHJ1ZS5cblxuRm9yIHRoZSBVbmljb2RlIGFuZCBzdHJpbmcgdHlwZXMsIGBgeCBpbiB5YGAgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZlxuKngqIGlzIGEgc3Vic3RyaW5nIG9mICp5Ki4gIEFuIGVxdWl2YWxlbnQgdGVzdCBpcyBgYHkuZmluZCh4KSAhPSAtMWBgLlxuTm90ZSwgKngqIGFuZCAqeSogbmVlZCBub3QgYmUgdGhlIHNhbWUgdHlwZTsgY29uc2VxdWVudGx5LCBgYHVcJ2FiXCcgaW5cblwnYWJjXCdgYCB3aWxsIHJldHVybiBgYFRydWVgYC4gRW1wdHkgc3RyaW5ncyBhcmUgYWx3YXlzIGNvbnNpZGVyZWQgdG9cbmJlIGEgc3Vic3RyaW5nIG9mIGFueSBvdGhlciBzdHJpbmcsIHNvIGBgIiIgaW4gImFiYyJgYCB3aWxsIHJldHVyblxuYGBUcnVlYGAuXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAyLjM6IFByZXZpb3VzbHksICp4KiB3YXMgcmVxdWlyZWQgdG8gYmUgYSBzdHJpbmcgb2Zcbmxlbmd0aCBgYDFgYC5cblxuRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRlZmluZSB0aGUgYGBfX2NvbnRhaW5zX18oKWBgIG1ldGhvZCxcbmBgeCBpbiB5YGAgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiBgYHkuX19jb250YWluc19fKHgpYGAgaXMgdHJ1ZS5cblxuRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRvIG5vdCBkZWZpbmUgYGBfX2NvbnRhaW5zX18oKWBgIGJ1dCBkb1xuZGVmaW5lIGBgX19pdGVyX18oKWBgLCBgYHggaW4geWBgIGlzIHRydWUgaWYgc29tZSB2YWx1ZSBgYHpgYCB3aXRoIGBgeFxuPT0gemBgIGlzIHByb2R1Y2VkIHdoaWxlIGl0ZXJhdGluZyBvdmVyIGBgeWBgLiAgSWYgYW4gZXhjZXB0aW9uIGlzXG5yYWlzZWQgZHVyaW5nIHRoZSBpdGVyYXRpb24sIGl0IGlzIGFzIGlmIGBgaW5gYCByYWlzZWQgdGhhdCBleGNlcHRpb24uXG5cbkxhc3RseSwgdGhlIG9sZC1zdHlsZSBpdGVyYXRpb24gcHJvdG9jb2wgaXMgdHJpZWQ6IGlmIGEgY2xhc3MgZGVmaW5lc1xuYGBfX2dldGl0ZW1fXygpYGAsIGBgeCBpbiB5YGAgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGVyZSBpcyBhIG5vbi1cbm5lZ2F0aXZlIGludGVnZXIgaW5kZXggKmkqIHN1Y2ggdGhhdCBgYHggPT0geVtpXWBgLCBhbmQgYWxsIGxvd2VyXG5pbnRlZ2VyIGluZGljZXMgZG8gbm90IHJhaXNlIGBgSW5kZXhFcnJvcmBgIGV4Y2VwdGlvbi4gKElmIGFueSBvdGhlclxuZXhjZXB0aW9uIGlzIHJhaXNlZCwgaXQgaXMgYXMgaWYgYGBpbmBgIHJhaXNlZCB0aGF0IGV4Y2VwdGlvbikuXG5cblRoZSBvcGVyYXRvciBgYG5vdCBpbmBgIGlzIGRlZmluZWQgdG8gaGF2ZSB0aGUgaW52ZXJzZSB0cnVlIHZhbHVlIG9mXG5gYGluYGAuXG5cblRoZSBvcGVyYXRvcnMgYGBpc2BgIGFuZCBgYGlzIG5vdGBgIHRlc3QgZm9yIG9iamVjdCBpZGVudGl0eTogYGB4IGlzXG55YGAgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiAqeCogYW5kICp5KiBhcmUgdGhlIHNhbWUgb2JqZWN0LiAgYGB4IGlzXG5ub3QgeWBgIHlpZWxkcyB0aGUgaW52ZXJzZSB0cnV0aCB2YWx1ZS4gWzddXG4nLAorICdjb21wb3VuZCc6ICdcbkNvbXBvdW5kIHN0YXRlbWVudHNcbioqKioqKioqKioqKioqKioqKipcblxuQ29tcG91bmQgc3RhdGVtZW50cyBjb250YWluIChncm91cHMgb2YpIG90aGVyIHN0YXRlbWVudHM7IHRoZXkgYWZmZWN0XG5vciBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhvc2Ugb3RoZXIgc3RhdGVtZW50cyBpbiBzb21lIHdheS4gIEluXG5nZW5lcmFsLCBjb21wb3VuZCBzdGF0ZW1lbnRzIHNwYW4gbXVsdGlwbGUgbGluZXMsIGFsdGhvdWdoIGluIHNpbXBsZVxuaW5jYXJuYXRpb25zIGEgd2hvbGUgY29tcG91bmQgc3RhdGVtZW50IG1heSBiZSBjb250YWluZWQgaW4gb25lIGxpbmUuXG5cblRoZSBgYGlmYGAsIGBgd2hpbGVgYCBhbmQgYGBmb3JgYCBzdGF0ZW1lbnRzIGltcGxlbWVudCB0cmFkaXRpb25hbFxuY29udHJvbCBmbG93IGNvbnN0cnVjdHMuICBgYHRyeWBgIHNwZWNpZmllcyBleGNlcHRpb24gaGFuZGxlcnMgYW5kL29yXG5jbGVhbnVwIGNvZGUgZm9yIGEgZ3JvdXAgb2Ygc3RhdGVtZW50cy4gIEZ1bmN0aW9uIGFuZCBjbGFzc1xuZGVmaW5pdGlvbnMgYXJlIGFsc28gc3ludGFjdGljYWxseSBjb21wb3VuZCBzdGF0ZW1lbnRzLlxuXG5Db21wb3VuZCBzdGF0ZW1lbnRzIGNvbnNpc3Qgb2Ygb25lIG9yIG1vcmUgXCdjbGF1c2VzLlwnICBBIGNsYXVzZVxuY29uc2lzdHMgb2YgYSBoZWFkZXIgYW5kIGEgXCdzdWl0ZS5cJyAgVGhlIGNsYXVzZSBoZWFkZXJzIG9mIGFcbnBhcnRpY3VsYXIgY29tcG91bmQgc3RhdGVtZW50IGFyZSBhbGwgYXQgdGhlIHNhbWUgaW5kZW50YXRpb24gbGV2ZWwuXG5FYWNoIGNsYXVzZSBoZWFkZXIgYmVnaW5zIHdpdGggYSB1bmlxdWVseSBpZGVudGlmeWluZyBrZXl3b3JkIGFuZCBlbmRzXG53aXRoIGEgY29sb24uICBBIHN1aXRlIGlzIGEgZ3JvdXAgb2Ygc3RhdGVtZW50cyBjb250cm9sbGVkIGJ5IGFcbmNsYXVzZS4gIEEgc3VpdGUgY2FuIGJlIG9uZSBvciBtb3JlIHNlbWljb2xvbi1zZXBhcmF0ZWQgc2ltcGxlXG5zdGF0ZW1lbnRzIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIGhlYWRlciwgZm9sbG93aW5nIHRoZSBoZWFkZXJcJ3NcbmNvbG9uLCBvciBpdCBjYW4gYmUgb25lIG9yIG1vcmUgaW5kZW50ZWQgc3RhdGVtZW50cyBvbiBzdWJzZXF1ZW50XG5saW5lcy4gIE9ubHkgdGhlIGxhdHRlciBmb3JtIG9mIHN1aXRlIGNhbiBjb250YWluIG5lc3RlZCBjb21wb3VuZFxuc3RhdGVtZW50czsgdGhlIGZvbGxvd2luZyBpcyBpbGxlZ2FsLCBtb3N0bHkgYmVjYXVzZSBpdCB3b3VsZG5cJ3QgYmVcbmNsZWFyIHRvIHdoaWNoIGBgaWZgYCBjbGF1c2UgYSBmb2xsb3dpbmcgYGBlbHNlYGAgY2xhdXNlIHdvdWxkIGJlbG9uZzpcblxuICAgaWYgdGVzdDE6IGlmIHRlc3QyOiBwcmludCB4XG5cbkFsc28gbm90ZSB0aGF0IHRoZSBzZW1pY29sb24gYmluZHMgdGlnaHRlciB0aGFuIHRoZSBjb2xvbiBpbiB0aGlzXG5jb250ZXh0LCBzbyB0aGF0IGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgZWl0aGVyIGFsbCBvciBub25lIG9mIHRoZVxuYGBwcmludGBgIHN0YXRlbWVudHMgYXJlIGV4ZWN1dGVkOlxuXG4gICBpZiB4IDwgeSA8IHo6IHByaW50IHg7IHByaW50IHk7IHByaW50IHpcblxuU3VtbWFyaXppbmc6XG5cbiAgIGNvbXBvdW5kX3N0bXQgOjo9IGlmX3N0bXRcbiAgICAgICAgICAgICAgICAgICAgIHwgd2hpbGVfc3RtdFxuICAgICAgICAgICAgICAgICAgICAgfCBmb3Jfc3RtdFxuICAgICAgICAgICAgICAgICAgICAgfCB0cnlfc3RtdFxuICAgICAgICAgICAgICAgICAgICAgfCB3aXRoX3N0bXRcbiAgICAgICAgICAgICAgICAgICAgIHwgZnVuY2RlZlxuICAgICAgICAgICAgICAgICAgICAgfCBjbGFzc2RlZlxuICAgICAgICAgICAgICAgICAgICAgfCBkZWNvcmF0ZWRcbiAgIHN1aXRlICAgICAgICAgOjo9IHN0bXRfbGlzdCBORVdMSU5FIHwgTkVXTElORSBJTkRFTlQgc3RhdGVtZW50KyBERURFTlRcbiAgIHN0YXRlbWVudCAgICAgOjo9IHN0bXRfbGlzdCBORVdMSU5FIHwgY29tcG91bmRfc3RtdFxuICAgc3RtdF9saXN0ICAgICA6Oj0gc2ltcGxlX3N0bXQgKCI7IiBzaW1wbGVfc3RtdCkqIFsiOyJdXG5cbk5vdGUgdGhhdCBzdGF0ZW1lbnRzIGFsd2F5cyBlbmQgaW4gYSBgYE5FV0xJTkVgYCBwb3NzaWJseSBmb2xsb3dlZCBieVxuYSBgYERFREVOVGBgLiBBbHNvIG5vdGUgdGhhdCBvcHRpb25hbCBjb250aW51YXRpb24gY2xhdXNlcyBhbHdheXNcbmJlZ2luIHdpdGggYSBrZXl3b3JkIHRoYXQgY2Fubm90IHN0YXJ0IGEgc3RhdGVtZW50LCB0aHVzIHRoZXJlIGFyZSBub1xuYW1iaWd1aXRpZXMgKHRoZSBcJ2RhbmdsaW5nIGBgZWxzZWBgXCcgcHJvYmxlbSBpcyBzb2x2ZWQgaW4gUHl0aG9uIGJ5XG5yZXF1aXJpbmcgbmVzdGVkIGBgaWZgYCBzdGF0ZW1lbnRzIHRvIGJlIGluZGVudGVkKS5cblxuVGhlIGZvcm1hdHRpbmcgb2YgdGhlIGdyYW1tYXIgcnVsZXMgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucyBwbGFjZXNcbmVhY2ggY2xhdXNlIG9uIGEgc2VwYXJhdGUgbGluZSBmb3IgY2xhcml0eS5cblxuXG5UaGUgYGBpZmBgIHN0YXRlbWVudFxuPT09PT09PT09PT09PT09PT09PT1cblxuVGhlIGBgaWZgYCBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgY29uZGl0aW9uYWwgZXhlY3V0aW9uOlxuXG4gICBpZl9zdG10IDo6PSAiaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAoICJlbGlmIiBleHByZXNzaW9uICI6IiBzdWl0ZSApKlxuICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG5cbkl0IHNlbGVjdHMgZXhhY3RseSBvbmUgb2YgdGhlIHN1aXRlcyBieSBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9ucyBvbmVcbmJ5IG9uZSB1bnRpbCBvbmUgaXMgZm91bmQgdG8gYmUgdHJ1ZSAoc2VlIHNlY3Rpb24gKkJvb2xlYW4gb3BlcmF0aW9ucypcbmZvciB0aGUgZGVmaW5pdGlvbiBvZiB0cnVlIGFuZCBmYWxzZSk7IHRoZW4gdGhhdCBzdWl0ZSBpcyBleGVjdXRlZFxuKGFuZCBubyBvdGhlciBwYXJ0IG9mIHRoZSBgYGlmYGAgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIG9yIGV2YWx1YXRlZCkuXG5JZiBhbGwgZXhwcmVzc2lvbnMgYXJlIGZhbHNlLCB0aGUgc3VpdGUgb2YgdGhlIGBgZWxzZWBgIGNsYXVzZSwgaWZcbnByZXNlbnQsIGlzIGV4ZWN1dGVkLlxuXG5cblRoZSBgYHdoaWxlYGAgc3RhdGVtZW50XG49PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgYGB3aGlsZWBgIHN0YXRlbWVudCBpcyB1c2VkIGZvciByZXBlYXRlZCBleGVjdXRpb24gYXMgbG9uZyBhcyBhblxuZXhwcmVzc2lvbiBpcyB0cnVlOlxuXG4gICB3aGlsZV9zdG10IDo6PSAid2hpbGUiIGV4cHJlc3Npb24gIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cblxuVGhpcyByZXBlYXRlZGx5IHRlc3RzIHRoZSBleHByZXNzaW9uIGFuZCwgaWYgaXQgaXMgdHJ1ZSwgZXhlY3V0ZXMgdGhlXG5maXJzdCBzdWl0ZTsgaWYgdGhlIGV4cHJlc3Npb24gaXMgZmFsc2UgKHdoaWNoIG1heSBiZSB0aGUgZmlyc3QgdGltZVxuaXQgaXMgdGVzdGVkKSB0aGUgc3VpdGUgb2YgdGhlIGBgZWxzZWBgIGNsYXVzZSwgaWYgcHJlc2VudCwgaXNcbmV4ZWN1dGVkIGFuZCB0aGUgbG9vcCB0ZXJtaW5hdGVzLlxuXG5BIGBgYnJlYWtgYCBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHRlcm1pbmF0ZXMgdGhlIGxvb3BcbndpdGhvdXQgZXhlY3V0aW5nIHRoZSBgYGVsc2VgYCBjbGF1c2VcJ3Mgc3VpdGUuICBBIGBgY29udGludWVgYFxuc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSBza2lwcyB0aGUgcmVzdCBvZiB0aGUgc3VpdGUgYW5kXG5nb2VzIGJhY2sgdG8gdGVzdGluZyB0aGUgZXhwcmVzc2lvbi5cblxuXG5UaGUgYGBmb3JgYCBzdGF0ZW1lbnRcbj09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgYGBmb3JgYCBzdGF0ZW1lbnQgaXMgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGVsZW1lbnRzIG9mIGFcbnNlcXVlbmNlIChzdWNoIGFzIGEgc3RyaW5nLCB0dXBsZSBvciBsaXN0KSBvciBvdGhlciBpdGVyYWJsZSBvYmplY3Q6XG5cbiAgIGZvcl9zdG10IDo6PSAiZm9yIiB0YXJnZXRfbGlzdCAiaW4iIGV4cHJlc3Npb25fbGlzdCAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cblxuVGhlIGV4cHJlc3Npb24gbGlzdCBpcyBldmFsdWF0ZWQgb25jZTsgaXQgc2hvdWxkIHlpZWxkIGFuIGl0ZXJhYmxlXG5vYmplY3QuICBBbiBpdGVyYXRvciBpcyBjcmVhdGVkIGZvciB0aGUgcmVzdWx0IG9mIHRoZVxuYGBleHByZXNzaW9uX2xpc3RgYC4gIFRoZSBzdWl0ZSBpcyB0aGVuIGV4ZWN1dGVkIG9uY2UgZm9yIGVhY2ggaXRlbVxucHJvdmlkZWQgYnkgdGhlIGl0ZXJhdG9yLCBpbiB0aGUgb3JkZXIgb2YgYXNjZW5kaW5nIGluZGljZXMuICBFYWNoXG5pdGVtIGluIHR1cm4gaXMgYXNzaWduZWQgdG8gdGhlIHRhcmdldCBsaXN0IHVzaW5nIHRoZSBzdGFuZGFyZCBydWxlc1xuZm9yIGFzc2lnbm1lbnRzLCBhbmQgdGhlbiB0aGUgc3VpdGUgaXMgZXhlY3V0ZWQuICBXaGVuIHRoZSBpdGVtcyBhcmVcbmV4aGF1c3RlZCAod2hpY2ggaXMgaW1tZWRpYXRlbHkgd2hlbiB0aGUgc2VxdWVuY2UgaXMgZW1wdHkpLCB0aGUgc3VpdGVcbmluIHRoZSBgYGVsc2VgYCBjbGF1c2UsIGlmIHByZXNlbnQsIGlzIGV4ZWN1dGVkLCBhbmQgdGhlIGxvb3BcbnRlcm1pbmF0ZXMuXG5cbkEgYGBicmVha2BgIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgdGVybWluYXRlcyB0aGUgbG9vcFxud2l0aG91dCBleGVjdXRpbmcgdGhlIGBgZWxzZWBgIGNsYXVzZVwncyBzdWl0ZS4gIEEgYGBjb250aW51ZWBgXG5zdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHNraXBzIHRoZSByZXN0IG9mIHRoZSBzdWl0ZSBhbmRcbmNvbnRpbnVlcyB3aXRoIHRoZSBuZXh0IGl0ZW0sIG9yIHdpdGggdGhlIGBgZWxzZWBgIGNsYXVzZSBpZiB0aGVyZSB3YXNcbm5vIG5leHQgaXRlbS5cblxuVGhlIHN1aXRlIG1heSBhc3NpZ24gdG8gdGhlIHZhcmlhYmxlKHMpIGluIHRoZSB0YXJnZXQgbGlzdDsgdGhpcyBkb2VzXG5ub3QgYWZmZWN0IHRoZSBuZXh0IGl0ZW0gYXNzaWduZWQgdG8gaXQuXG5cblRoZSB0YXJnZXQgbGlzdCBpcyBub3QgZGVsZXRlZCB3aGVuIHRoZSBsb29wIGlzIGZpbmlzaGVkLCBidXQgaWYgdGhlXG5zZXF1ZW5jZSBpcyBlbXB0eSwgaXQgd2lsbCBub3QgaGF2ZSBiZWVuIGFzc2lnbmVkIHRvIGF0IGFsbCBieSB0aGVcbmxvb3AuICBIaW50OiB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gYGByYW5nZSgpYGAgcmV0dXJucyBhIHNlcXVlbmNlIG9mXG5pbnRlZ2VycyBzdWl0YWJsZSB0byBlbXVsYXRlIHRoZSBlZmZlY3Qgb2YgUGFzY2FsXCdzIGBgZm9yIGkgOj0gYSB0byBiXG5kb2BgOyBlLmcuLCBgYHJhbmdlKDMpYGAgcmV0dXJucyB0aGUgbGlzdCBgYFswLCAxLCAyXWBgLlxuXG5Ob3RlOiBUaGVyZSBpcyBhIHN1YnRsZXR5IHdoZW4gdGhlIHNlcXVlbmNlIGlzIGJlaW5nIG1vZGlmaWVkIGJ5IHRoZSBsb29wXG4gICh0aGlzIGNhbiBvbmx5IG9jY3VyIGZvciBtdXRhYmxlIHNlcXVlbmNlcywgaS5lLiBsaXN0cykuIEFuIGludGVybmFsXG4gIGNvdW50ZXIgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIGl0ZW0gaXMgdXNlZCBuZXh0LCBhbmQgdGhpc1xuICBpcyBpbmNyZW1lbnRlZCBvbiBlYWNoIGl0ZXJhdGlvbi4gIFdoZW4gdGhpcyBjb3VudGVyIGhhcyByZWFjaGVkIHRoZVxuICBsZW5ndGggb2YgdGhlIHNlcXVlbmNlIHRoZSBsb29wIHRlcm1pbmF0ZXMuICBUaGlzIG1lYW5zIHRoYXQgaWYgdGhlXG4gIHN1aXRlIGRlbGV0ZXMgdGhlIGN1cnJlbnQgKG9yIGEgcHJldmlvdXMpIGl0ZW0gZnJvbSB0aGUgc2VxdWVuY2UsXG4gIHRoZSBuZXh0IGl0ZW0gd2lsbCBiZSBza2lwcGVkIChzaW5jZSBpdCBnZXRzIHRoZSBpbmRleCBvZiB0aGVcbiAgY3VycmVudCBpdGVtIHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4gdHJlYXRlZCkuICBMaWtld2lzZSwgaWYgdGhlXG4gIHN1aXRlIGluc2VydHMgYW4gaXRlbSBpbiB0aGUgc2VxdWVuY2UgYmVmb3JlIHRoZSBjdXJyZW50IGl0ZW0sIHRoZVxuICBjdXJyZW50IGl0ZW0gd2lsbCBiZSB0cmVhdGVkIGFnYWluIHRoZSBuZXh0IHRpbWUgdGhyb3VnaCB0aGUgbG9vcC5cbiAgVGhpcyBjYW4gbGVhZCB0byBuYXN0eSBidWdzIHRoYXQgY2FuIGJlIGF2b2lkZWQgYnkgbWFraW5nIGFcbiAgdGVtcG9yYXJ5IGNvcHkgdXNpbmcgYSBzbGljZSBvZiB0aGUgd2hvbGUgc2VxdWVuY2UsIGUuZy4sXG5cbiAgICAgZm9yIHggaW4gYVs6XTpcbiAgICAgICAgIGlmIHggPCAwOiBhLnJlbW92ZSh4KVxuXG5cblRoZSBgYHRyeWBgIHN0YXRlbWVudFxuPT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBgYHRyeWBgIHN0YXRlbWVudCBzcGVjaWZpZXMgZXhjZXB0aW9uIGhhbmRsZXJzIGFuZC9vciBjbGVhbnVwIGNvZGVcbmZvciBhIGdyb3VwIG9mIHN0YXRlbWVudHM6XG5cbiAgIHRyeV9zdG10ICA6Oj0gdHJ5MV9zdG10IHwgdHJ5Ml9zdG10XG4gICB0cnkxX3N0bXQgOjo9ICJ0cnkiICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgICAoImV4Y2VwdCIgW2V4cHJlc3Npb24gWygiYXMiIHwgIiwiKSB0YXJnZXRdXSAiOiIgc3VpdGUpK1xuICAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cbiAgICAgICAgICAgICAgICAgWyJmaW5hbGx5IiAiOiIgc3VpdGVdXG4gICB0cnkyX3N0bXQgOjo9ICJ0cnkiICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgICAiZmluYWxseSIgIjoiIHN1aXRlXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAyLjU6IEluIHByZXZpb3VzIHZlcnNpb25zIG9mIFB5dGhvbixcbmBgdHJ5YGAuLi5gYGV4Y2VwdGBgLi4uYGBmaW5hbGx5YGAgZGlkIG5vdCB3b3JrLiBgYHRyeWBgLi4uYGBleGNlcHRgYFxuaGFkIHRvIGJlIG5lc3RlZCBpbiBgYHRyeWBgLi4uYGBmaW5hbGx5YGAuXG5cblRoZSBgYGV4Y2VwdGBgIGNsYXVzZShzKSBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4Y2VwdGlvbiBoYW5kbGVycy4gV2hlblxubm8gZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgYGB0cnlgYCBjbGF1c2UsIG5vIGV4Y2VwdGlvbiBoYW5kbGVyIGlzXG5leGVjdXRlZC4gV2hlbiBhbiBleGNlcHRpb24gb2NjdXJzIGluIHRoZSBgYHRyeWBgIHN1aXRlLCBhIHNlYXJjaCBmb3JcbmFuIGV4Y2VwdGlvbiBoYW5kbGVyIGlzIHN0YXJ0ZWQuICBUaGlzIHNlYXJjaCBpbnNwZWN0cyB0aGUgZXhjZXB0XG5jbGF1c2VzIGluIHR1cm4gdW50aWwgb25lIGlzIGZvdW5kIHRoYXQgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uLiAgQW5cbmV4cHJlc3Npb24tbGVzcyBleGNlcHQgY2xhdXNlLCBpZiBwcmVzZW50LCBtdXN0IGJlIGxhc3Q7IGl0IG1hdGNoZXNcbmFueSBleGNlcHRpb24uICBGb3IgYW4gZXhjZXB0IGNsYXVzZSB3aXRoIGFuIGV4cHJlc3Npb24sIHRoYXRcbmV4cHJlc3Npb24gaXMgZXZhbHVhdGVkLCBhbmQgdGhlIGNsYXVzZSBtYXRjaGVzIHRoZSBleGNlcHRpb24gaWYgdGhlXG5yZXN1bHRpbmcgb2JqZWN0IGlzICJjb21wYXRpYmxlIiB3aXRoIHRoZSBleGNlcHRpb24uICBBbiBvYmplY3QgaXNcbmNvbXBhdGlibGUgd2l0aCBhbiBleGNlcHRpb24gaWYgaXQgaXMgdGhlIGNsYXNzIG9yIGEgYmFzZSBjbGFzcyBvZiB0aGVcbmV4Y2VwdGlvbiBvYmplY3QsIG9yIGEgdHVwbGUgY29udGFpbmluZyBhbiBpdGVtIGNvbXBhdGlibGUgd2l0aCB0aGVcbmV4Y2VwdGlvbi5cblxuSWYgbm8gZXhjZXB0IGNsYXVzZSBtYXRjaGVzIHRoZSBleGNlcHRpb24sIHRoZSBzZWFyY2ggZm9yIGFuIGV4Y2VwdGlvblxuaGFuZGxlciBjb250aW51ZXMgaW4gdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIG9uIHRoZSBpbnZvY2F0aW9uIHN0YWNrLlxuWzFdXG5cbklmIHRoZSBldmFsdWF0aW9uIG9mIGFuIGV4cHJlc3Npb24gaW4gdGhlIGhlYWRlciBvZiBhbiBleGNlcHQgY2xhdXNlXG5yYWlzZXMgYW4gZXhjZXB0aW9uLCB0aGUgb3JpZ2luYWwgc2VhcmNoIGZvciBhIGhhbmRsZXIgaXMgY2FuY2VsZWQgYW5kXG5hIHNlYXJjaCBzdGFydHMgZm9yIHRoZSBuZXcgZXhjZXB0aW9uIGluIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBvblxudGhlIGNhbGwgc3RhY2sgKGl0IGlzIHRyZWF0ZWQgYXMgaWYgdGhlIGVudGlyZSBgYHRyeWBgIHN0YXRlbWVudFxucmFpc2VkIHRoZSBleGNlcHRpb24pLlxuXG5XaGVuIGEgbWF0Y2hpbmcgZXhjZXB0IGNsYXVzZSBpcyBmb3VuZCwgdGhlIGV4Y2VwdGlvbiBpcyBhc3NpZ25lZCB0b1xudGhlIHRhcmdldCBzcGVjaWZpZWQgaW4gdGhhdCBleGNlcHQgY2xhdXNlLCBpZiBwcmVzZW50LCBhbmQgdGhlIGV4Y2VwdFxuY2xhdXNlXCdzIHN1aXRlIGlzIGV4ZWN1dGVkLiAgQWxsIGV4Y2VwdCBjbGF1c2VzIG11c3QgaGF2ZSBhblxuZXhlY3V0YWJsZSBibG9jay4gIFdoZW4gdGhlIGVuZCBvZiB0aGlzIGJsb2NrIGlzIHJlYWNoZWQsIGV4ZWN1dGlvblxuY29udGludWVzIG5vcm1hbGx5IGFmdGVyIHRoZSBlbnRpcmUgdHJ5IHN0YXRlbWVudC4gIChUaGlzIG1lYW5zIHRoYXRcbmlmIHR3byBuZXN0ZWQgaGFuZGxlcnMgZXhpc3QgZm9yIHRoZSBzYW1lIGV4Y2VwdGlvbiwgYW5kIHRoZSBleGNlcHRpb25cbm9jY3VycyBpbiB0aGUgdHJ5IGNsYXVzZSBvZiB0aGUgaW5uZXIgaGFuZGxlciwgdGhlIG91dGVyIGhhbmRsZXIgd2lsbFxubm90IGhhbmRsZSB0aGUgZXhjZXB0aW9uLilcblxuQmVmb3JlIGFuIGV4Y2VwdCBjbGF1c2VcJ3Mgc3VpdGUgaXMgZXhlY3V0ZWQsIGRldGFpbHMgYWJvdXQgdGhlXG5leGNlcHRpb24gYXJlIGFzc2lnbmVkIHRvIHRocmVlIHZhcmlhYmxlcyBpbiB0aGUgYGBzeXNgYCBtb2R1bGU6XG5gYHN5cy5leGNfdHlwZWBgIHJlY2VpdmVzIHRoZSBvYmplY3QgaWRlbnRpZnlpbmcgdGhlIGV4Y2VwdGlvbjtcbmBgc3lzLmV4Y192YWx1ZWBgIHJlY2VpdmVzIHRoZSBleGNlcHRpb25cJ3MgcGFyYW1ldGVyO1xuYGBzeXMuZXhjX3RyYWNlYmFja2BgIHJlY2VpdmVzIGEgdHJhY2ViYWNrIG9iamVjdCAoc2VlIHNlY3Rpb24gKlRoZVxuc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqKSBpZGVudGlmeWluZyB0aGUgcG9pbnQgaW4gdGhlIHByb2dyYW0gd2hlcmVcbnRoZSBleGNlcHRpb24gb2NjdXJyZWQuIFRoZXNlIGRldGFpbHMgYXJlIGFsc28gYXZhaWxhYmxlIHRocm91Z2ggdGhlXG5gYHN5cy5leGNfaW5mbygpYGAgZnVuY3Rpb24sIHdoaWNoIHJldHVybnMgYSB0dXBsZSBgYChleGNfdHlwZSxcbmV4Y192YWx1ZSwgZXhjX3RyYWNlYmFjaylgYC4gIFVzZSBvZiB0aGUgY29ycmVzcG9uZGluZyB2YXJpYWJsZXMgaXNcbmRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgdGhpcyBmdW5jdGlvbiwgc2luY2UgdGhlaXIgdXNlIGlzIHVuc2FmZSBpbiBhXG50aHJlYWRlZCBwcm9ncmFtLiAgQXMgb2YgUHl0aG9uIDEuNSwgdGhlIHZhcmlhYmxlcyBhcmUgcmVzdG9yZWQgdG9cbnRoZWlyIHByZXZpb3VzIHZhbHVlcyAoYmVmb3JlIHRoZSBjYWxsKSB3aGVuIHJldHVybmluZyBmcm9tIGEgZnVuY3Rpb25cbnRoYXQgaGFuZGxlZCBhbiBleGNlcHRpb24uXG5cblRoZSBvcHRpb25hbCBgYGVsc2VgYCBjbGF1c2UgaXMgZXhlY3V0ZWQgaWYgYW5kIHdoZW4gY29udHJvbCBmbG93cyBvZmZcbnRoZSBlbmQgb2YgdGhlIGBgdHJ5YGAgY2xhdXNlLiBbMl0gRXhjZXB0aW9ucyBpbiB0aGUgYGBlbHNlYGAgY2xhdXNlXG5hcmUgbm90IGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBgYGV4Y2VwdGBgIGNsYXVzZXMuXG5cbklmIGBgZmluYWxseWBgIGlzIHByZXNlbnQsIGl0IHNwZWNpZmllcyBhIFwnY2xlYW51cFwnIGhhbmRsZXIuICBUaGVcbmBgdHJ5YGAgY2xhdXNlIGlzIGV4ZWN1dGVkLCBpbmNsdWRpbmcgYW55IGBgZXhjZXB0YGAgYW5kIGBgZWxzZWBgXG5jbGF1c2VzLiAgSWYgYW4gZXhjZXB0aW9uIG9jY3VycyBpbiBhbnkgb2YgdGhlIGNsYXVzZXMgYW5kIGlzIG5vdFxuaGFuZGxlZCwgdGhlIGV4Y2VwdGlvbiBpcyB0ZW1wb3JhcmlseSBzYXZlZC4gVGhlIGBgZmluYWxseWBgIGNsYXVzZSBpc1xuZXhlY3V0ZWQuICBJZiB0aGVyZSBpcyBhIHNhdmVkIGV4Y2VwdGlvbiwgaXQgaXMgcmUtcmFpc2VkIGF0IHRoZSBlbmRcbm9mIHRoZSBgYGZpbmFsbHlgYCBjbGF1c2UuIElmIHRoZSBgYGZpbmFsbHlgYCBjbGF1c2UgcmFpc2VzIGFub3RoZXJcbmV4Y2VwdGlvbiBvciBleGVjdXRlcyBhIGBgcmV0dXJuYGAgb3IgYGBicmVha2BgIHN0YXRlbWVudCwgdGhlIHNhdmVkXG5leGNlcHRpb24gaXMgZGlzY2FyZGVkOlxuXG4gICA+Pj4gZGVmIGYoKTpcbiAgIC4uLiAgICAgdHJ5OlxuICAgLi4uICAgICAgICAgMS8wXG4gICAuLi4gICAgIGZpbmFsbHk6XG4gICAuLi4gICAgICAgICByZXR1cm4gNDJcbiAgIC4uLlxuICAgPj4+IGYoKVxuICAgNDJcblxuVGhlIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIHRvIHRoZSBwcm9ncmFtIGR1cmluZ1xuZXhlY3V0aW9uIG9mIHRoZSBgYGZpbmFsbHlgYCBjbGF1c2UuXG5cbldoZW4gYSBgYHJldHVybmBgLCBgYGJyZWFrYGAgb3IgYGBjb250aW51ZWBgIHN0YXRlbWVudCBpcyBleGVjdXRlZCBpblxudGhlIGBgdHJ5YGAgc3VpdGUgb2YgYSBgYHRyeWBgLi4uYGBmaW5hbGx5YGAgc3RhdGVtZW50LCB0aGVcbmBgZmluYWxseWBgIGNsYXVzZSBpcyBhbHNvIGV4ZWN1dGVkIFwnb24gdGhlIHdheSBvdXQuXCcgQSBgYGNvbnRpbnVlYGBcbnN0YXRlbWVudCBpcyBpbGxlZ2FsIGluIHRoZSBgYGZpbmFsbHlgYCBjbGF1c2UuIChUaGUgcmVhc29uIGlzIGFcbnByb2JsZW0gd2l0aCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiAtLS0gdGhpcyByZXN0cmljdGlvbiBtYXkgYmVcbmxpZnRlZCBpbiB0aGUgZnV0dXJlKS5cblxuVGhlIHJldHVybiB2YWx1ZSBvZiBhIGZ1bmN0aW9uIGlzIGRldGVybWluZWQgYnkgdGhlIGxhc3QgYGByZXR1cm5gYFxuc3RhdGVtZW50IGV4ZWN1dGVkLiAgU2luY2UgdGhlIGBgZmluYWxseWBgIGNsYXVzZSBhbHdheXMgZXhlY3V0ZXMsIGFcbmBgcmV0dXJuYGAgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBgYGZpbmFsbHlgYCBjbGF1c2Ugd2lsbCBhbHdheXMgYmVcbnRoZSBsYXN0IG9uZSBleGVjdXRlZDpcblxuICAgPj4+IGRlZiBmb28oKTpcbiAgIC4uLiAgICAgdHJ5OlxuICAgLi4uICAgICAgICAgcmV0dXJuIFwndHJ5XCdcbiAgIC4uLiAgICAgZmluYWxseTpcbiAgIC4uLiAgICAgICAgIHJldHVybiBcJ2ZpbmFsbHlcJ1xuICAgLi4uXG4gICA+Pj4gZm9vKClcbiAgIFwnZmluYWxseVwnXG5cbkFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gZXhjZXB0aW9ucyBjYW4gYmUgZm91bmQgaW4gc2VjdGlvblxuKkV4Y2VwdGlvbnMqLCBhbmQgaW5mb3JtYXRpb24gb24gdXNpbmcgdGhlIGBgcmFpc2VgYCBzdGF0ZW1lbnQgdG9cbmdlbmVyYXRlIGV4Y2VwdGlvbnMgbWF5IGJlIGZvdW5kIGluIHNlY3Rpb24gKlRoZSByYWlzZSBzdGF0ZW1lbnQqLlxuXG5cblRoZSBgYHdpdGhgYCBzdGF0ZW1lbnRcbj09PT09PT09PT09PT09PT09PT09PT1cblxuTmV3IGluIHZlcnNpb24gMi41LlxuXG5UaGUgYGB3aXRoYGAgc3RhdGVtZW50IGlzIHVzZWQgdG8gd3JhcCB0aGUgZXhlY3V0aW9uIG9mIGEgYmxvY2sgd2l0aFxubWV0aG9kcyBkZWZpbmVkIGJ5IGEgY29udGV4dCBtYW5hZ2VyIChzZWUgc2VjdGlvbiAqV2l0aCBTdGF0ZW1lbnRcbkNvbnRleHQgTWFuYWdlcnMqKS4gVGhpcyBhbGxvd3MgY29tbW9uXG5gYHRyeWBgLi4uYGBleGNlcHRgYC4uLmBgZmluYWxseWBgIHVzYWdlIHBhdHRlcm5zIHRvIGJlIGVuY2Fwc3VsYXRlZFxuZm9yIGNvbnZlbmllbnQgcmV1c2UuXG5cbiAgIHdpdGhfc3RtdCA6Oj0gIndpdGgiIHdpdGhfaXRlbSAoIiwiIHdpdGhfaXRlbSkqICI6IiBzdWl0ZVxuICAgd2l0aF9pdGVtIDo6PSBleHByZXNzaW9uIFsiYXMiIHRhcmdldF1cblxuVGhlIGV4ZWN1dGlvbiBvZiB0aGUgYGB3aXRoYGAgc3RhdGVtZW50IHdpdGggb25lICJpdGVtIiBwcm9jZWVkcyBhc1xuZm9sbG93czpcblxuMS4gVGhlIGNvbnRleHQgZXhwcmVzc2lvbiAodGhlIGV4cHJlc3Npb24gZ2l2ZW4gaW4gdGhlIGBgd2l0aF9pdGVtYGApXG4gICBpcyBldmFsdWF0ZWQgdG8gb2J0YWluIGEgY29udGV4dCBtYW5hZ2VyLlxuXG4yLiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzIGBgX19leGl0X18oKWBgIGlzIGxvYWRlZCBmb3IgbGF0ZXIgdXNlLlxuXG4zLiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzIGBgX19lbnRlcl9fKClgYCBtZXRob2QgaXMgaW52b2tlZC5cblxuNC4gSWYgYSB0YXJnZXQgd2FzIGluY2x1ZGVkIGluIHRoZSBgYHdpdGhgYCBzdGF0ZW1lbnQsIHRoZSByZXR1cm5cbiAgIHZhbHVlIGZyb20gYGBfX2VudGVyX18oKWBgIGlzIGFzc2lnbmVkIHRvIGl0LlxuXG4gICBOb3RlOiBUaGUgYGB3aXRoYGAgc3RhdGVtZW50IGd1YXJhbnRlZXMgdGhhdCBpZiB0aGUgYGBfX2VudGVyX18oKWBgXG4gICAgIG1ldGhvZCByZXR1cm5zIHdpdGhvdXQgYW4gZXJyb3IsIHRoZW4gYGBfX2V4aXRfXygpYGAgd2lsbCBhbHdheXNcbiAgICAgYmUgY2FsbGVkLiBUaHVzLCBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBhc3NpZ25tZW50IHRvIHRoZVxuICAgICB0YXJnZXQgbGlzdCwgaXQgd2lsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIGFuIGVycm9yIG9jY3VycmluZ1xuICAgICB3aXRoaW4gdGhlIHN1aXRlIHdvdWxkIGJlLiBTZWUgc3RlcCA2IGJlbG93LlxuXG41LiBUaGUgc3VpdGUgaXMgZXhlY3V0ZWQuXG5cbjYuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgYGBfX2V4aXRfXygpYGAgbWV0aG9kIGlzIGludm9rZWQuIElmIGFuXG4gICBleGNlcHRpb24gY2F1c2VkIHRoZSBzdWl0ZSB0byBiZSBleGl0ZWQsIGl0cyB0eXBlLCB2YWx1ZSwgYW5kXG4gICB0cmFjZWJhY2sgYXJlIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gYGBfX2V4aXRfXygpYGAuIE90aGVyd2lzZSxcbiAgIHRocmVlIGBgTm9uZWBgIGFyZ3VtZW50cyBhcmUgc3VwcGxpZWQuXG5cbiAgIElmIHRoZSBzdWl0ZSB3YXMgZXhpdGVkIGR1ZSB0byBhbiBleGNlcHRpb24sIGFuZCB0aGUgcmV0dXJuIHZhbHVlXG4gICBmcm9tIHRoZSBgYF9fZXhpdF9fKClgYCBtZXRob2Qgd2FzIGZhbHNlLCB0aGUgZXhjZXB0aW9uIGlzXG4gICByZXJhaXNlZC4gSWYgdGhlIHJldHVybiB2YWx1ZSB3YXMgdHJ1ZSwgdGhlIGV4Y2VwdGlvbiBpc1xuICAgc3VwcHJlc3NlZCwgYW5kIGV4ZWN1dGlvbiBjb250aW51ZXMgd2l0aCB0aGUgc3RhdGVtZW50IGZvbGxvd2luZ1xuICAgdGhlIGBgd2l0aGBgIHN0YXRlbWVudC5cblxuICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiBhbiBleGNlcHRpb24sIHRoZVxuICAgcmV0dXJuIHZhbHVlIGZyb20gYGBfX2V4aXRfXygpYGAgaXMgaWdub3JlZCwgYW5kIGV4ZWN1dGlvbiBwcm9jZWVkc1xuICAgYXQgdGhlIG5vcm1hbCBsb2NhdGlvbiBmb3IgdGhlIGtpbmQgb2YgZXhpdCB0aGF0IHdhcyB0YWtlbi5cblxuV2l0aCBtb3JlIHRoYW4gb25lIGl0ZW0sIHRoZSBjb250ZXh0IG1hbmFnZXJzIGFyZSBwcm9jZXNzZWQgYXMgaWZcbm11bHRpcGxlIGBgd2l0aGBgIHN0YXRlbWVudHMgd2VyZSBuZXN0ZWQ6XG5cbiAgIHdpdGggQSgpIGFzIGEsIEIoKSBhcyBiOlxuICAgICAgIHN1aXRlXG5cbmlzIGVxdWl2YWxlbnQgdG9cblxuICAgd2l0aCBBKCkgYXMgYTpcbiAgICAgICB3aXRoIEIoKSBhcyBiOlxuICAgICAgICAgICBzdWl0ZVxuXG5Ob3RlOiBJbiBQeXRob24gMi41LCB0aGUgYGB3aXRoYGAgc3RhdGVtZW50IGlzIG9ubHkgYWxsb3dlZCB3aGVuIHRoZVxuICBgYHdpdGhfc3RhdGVtZW50YGAgZmVhdHVyZSBoYXMgYmVlbiBlbmFibGVkLiAgSXQgaXMgYWx3YXlzIGVuYWJsZWRcbiAgaW4gUHl0aG9uIDIuNi5cblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNzogU3VwcG9ydCBmb3IgbXVsdGlwbGUgY29udGV4dCBleHByZXNzaW9ucy5cblxuU2VlIGFsc286XG5cbiAgICoqUEVQIDAzNDMqKiAtIFRoZSAid2l0aCIgc3RhdGVtZW50XG4gICAgICBUaGUgc3BlY2lmaWNhdGlvbiwgYmFja2dyb3VuZCwgYW5kIGV4YW1wbGVzIGZvciB0aGUgUHl0aG9uXG4gICAgICBgYHdpdGhgYCBzdGF0ZW1lbnQuXG5cblxuRnVuY3Rpb24gZGVmaW5pdGlvbnNcbj09PT09PT09PT09PT09PT09PT09XG5cbkEgZnVuY3Rpb24gZGVmaW5pdGlvbiBkZWZpbmVzIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCAoc2VlXG5zZWN0aW9uICpUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqKTpcblxuICAgZGVjb3JhdGVkICAgICAgOjo9IGRlY29yYXRvcnMgKGNsYXNzZGVmIHwgZnVuY2RlZilcbiAgIGRlY29yYXRvcnMgICAgIDo6PSBkZWNvcmF0b3IrXG4gICBkZWNvcmF0b3IgICAgICA6Oj0gIkAiIGRvdHRlZF9uYW1lIFsiKCIgW2FyZ3VtZW50X2xpc3QgWyIsIl1dICIpIl0gTkVXTElORVxuICAgZnVuY2RlZiAgICAgICAgOjo9ICJkZWYiIGZ1bmNuYW1lICIoIiBbcGFyYW1ldGVyX2xpc3RdICIpIiAiOiIgc3VpdGVcbiAgIGRvdHRlZF9uYW1lICAgIDo6PSBpZGVudGlmaWVyICgiLiIgaWRlbnRpZmllcikqXG4gICBwYXJhbWV0ZXJfbGlzdCA6Oj0gKGRlZnBhcmFtZXRlciAiLCIpKlxuICAgICAgICAgICAgICAgICAgICAgICggICIqIiBpZGVudGlmaWVyIFsiLCIgIioqIiBpZGVudGlmaWVyXVxuICAgICAgICAgICAgICAgICAgICAgIHwgIioqIiBpZGVudGlmaWVyXG4gICAgICAgICAgICAgICAgICAgICAgfCBkZWZwYXJhbWV0ZXIgWyIsIl0gKVxuICAgZGVmcGFyYW1ldGVyICAgOjo9IHBhcmFtZXRlciBbIj0iIGV4cHJlc3Npb25dXG4gICBzdWJsaXN0ICAgICAgICA6Oj0gcGFyYW1ldGVyICgiLCIgcGFyYW1ldGVyKSogWyIsIl1cbiAgIHBhcmFtZXRlciAgICAgIDo6PSBpZGVudGlmaWVyIHwgIigiIHN1Ymxpc3QgIikiXG4gICBmdW5jbmFtZSAgICAgICA6Oj0gaWRlbnRpZmllclxuXG5BIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBJdHMgZXhlY3V0aW9uIGJpbmRzXG50aGUgZnVuY3Rpb24gbmFtZSBpbiB0aGUgY3VycmVudCBsb2NhbCBuYW1lc3BhY2UgdG8gYSBmdW5jdGlvbiBvYmplY3RcbihhIHdyYXBwZXIgYXJvdW5kIHRoZSBleGVjdXRhYmxlIGNvZGUgZm9yIHRoZSBmdW5jdGlvbikuICBUaGlzXG5mdW5jdGlvbiBvYmplY3QgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIG5hbWVzcGFjZVxuYXMgdGhlIGdsb2JhbCBuYW1lc3BhY2UgdG8gYmUgdXNlZCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuXG5cblRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGRvZXMgbm90IGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIGJvZHk7IHRoaXMgZ2V0c1xuZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuIFszXVxuXG5BIGZ1bmN0aW9uIGRlZmluaXRpb24gbWF5IGJlIHdyYXBwZWQgYnkgb25lIG9yIG1vcmUgKmRlY29yYXRvcipcbmV4cHJlc3Npb25zLiBEZWNvcmF0b3IgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCB3aGVuIHRoZSBmdW5jdGlvbiBpc1xuZGVmaW5lZCwgaW4gdGhlIHNjb3BlIHRoYXQgY29udGFpbnMgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24uICBUaGVcbnJlc3VsdCBtdXN0IGJlIGEgY2FsbGFibGUsIHdoaWNoIGlzIGludm9rZWQgd2l0aCB0aGUgZnVuY3Rpb24gb2JqZWN0XG5hcyB0aGUgb25seSBhcmd1bWVudC4gVGhlIHJldHVybmVkIHZhbHVlIGlzIGJvdW5kIHRvIHRoZSBmdW5jdGlvbiBuYW1lXG5pbnN0ZWFkIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QuICBNdWx0aXBsZSBkZWNvcmF0b3JzIGFyZSBhcHBsaWVkIGluXG5uZXN0ZWQgZmFzaGlvbi4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZTpcblxuICAgQGYxKGFyZylcbiAgIEBmMlxuICAgZGVmIGZ1bmMoKTogcGFzc1xuXG5pcyBlcXVpdmFsZW50IHRvOlxuXG4gICBkZWYgZnVuYygpOiBwYXNzXG4gICBmdW5jID0gZjEoYXJnKShmMihmdW5jKSlcblxuV2hlbiBvbmUgb3IgbW9yZSB0b3AtbGV2ZWwgKnBhcmFtZXRlcnMqIGhhdmUgdGhlIGZvcm0gKnBhcmFtZXRlcipcbmBgPWBgICpleHByZXNzaW9uKiwgdGhlIGZ1bmN0aW9uIGlzIHNhaWQgdG8gaGF2ZSAiZGVmYXVsdCBwYXJhbWV0ZXJcbnZhbHVlcy4iICBGb3IgYSBwYXJhbWV0ZXIgd2l0aCBhIGRlZmF1bHQgdmFsdWUsIHRoZSBjb3JyZXNwb25kaW5nXG4qYXJndW1lbnQqIG1heSBiZSBvbWl0dGVkIGZyb20gYSBjYWxsLCBpbiB3aGljaCBjYXNlIHRoZSBwYXJhbWV0ZXJcJ3NcbmRlZmF1bHQgdmFsdWUgaXMgc3Vic3RpdHV0ZWQuICBJZiBhIHBhcmFtZXRlciBoYXMgYSBkZWZhdWx0IHZhbHVlLCBhbGxcbmZvbGxvd2luZyBwYXJhbWV0ZXJzIG11c3QgYWxzbyBoYXZlIGEgZGVmYXVsdCB2YWx1ZSAtLS0gdGhpcyBpcyBhXG5zeW50YWN0aWMgcmVzdHJpY3Rpb24gdGhhdCBpcyBub3QgZXhwcmVzc2VkIGJ5IHRoZSBncmFtbWFyLlxuXG4qKkRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlcyBhcmUgZXZhbHVhdGVkIHdoZW4gdGhlIGZ1bmN0aW9uIGRlZmluaXRpb25cbmlzIGV4ZWN1dGVkLioqICBUaGlzIG1lYW5zIHRoYXQgdGhlIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIG9uY2UsIHdoZW5cbnRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkLCBhbmQgdGhhdCB0aGUgc2FtZSAicHJlLWNvbXB1dGVkIiB2YWx1ZSBpc1xudXNlZCBmb3IgZWFjaCBjYWxsLiAgVGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCB0byB1bmRlcnN0YW5kIHdoZW4gYVxuZGVmYXVsdCBwYXJhbWV0ZXIgaXMgYSBtdXRhYmxlIG9iamVjdCwgc3VjaCBhcyBhIGxpc3Qgb3IgYSBkaWN0aW9uYXJ5OlxuaWYgdGhlIGZ1bmN0aW9uIG1vZGlmaWVzIHRoZSBvYmplY3QgKGUuZy4gYnkgYXBwZW5kaW5nIGFuIGl0ZW0gdG8gYVxubGlzdCksIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGluIGVmZmVjdCBtb2RpZmllZC4gVGhpcyBpcyBnZW5lcmFsbHkgbm90XG53aGF0IHdhcyBpbnRlbmRlZC4gIEEgd2F5IGFyb3VuZCB0aGlzICBpcyB0byB1c2UgYGBOb25lYGAgYXMgdGhlXG5kZWZhdWx0LCBhbmQgZXhwbGljaXRseSB0ZXN0IGZvciBpdCBpbiB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb24sIGUuZy46XG5cbiAgIGRlZiB3aGF0c19vbl90aGVfdGVsbHkocGVuZ3Vpbj1Ob25lKTpcbiAgICAgICBpZiBwZW5ndWluIGlzIE5vbmU6XG4gICAgICAgICAgIHBlbmd1aW4gPSBbXVxuICAgICAgIHBlbmd1aW4uYXBwZW5kKCJwcm9wZXJ0eSBvZiB0aGUgem9vIilcbiAgICAgICByZXR1cm4gcGVuZ3VpblxuXG5GdW5jdGlvbiBjYWxsIHNlbWFudGljcyBhcmUgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluIHNlY3Rpb25cbipDYWxscyouIEEgZnVuY3Rpb24gY2FsbCBhbHdheXMgYXNzaWducyB2YWx1ZXMgdG8gYWxsIHBhcmFtZXRlcnNcbm1lbnRpb25lZCBpbiB0aGUgcGFyYW1ldGVyIGxpc3QsIGVpdGhlciBmcm9tIHBvc2l0aW9uIGFyZ3VtZW50cywgZnJvbVxua2V5d29yZCBhcmd1bWVudHMsIG9yIGZyb20gZGVmYXVsdCB2YWx1ZXMuICBJZiB0aGUgZm9ybVxuImBgKmlkZW50aWZpZXJgYCIgaXMgcHJlc2VudCwgaXQgaXMgaW5pdGlhbGl6ZWQgdG8gYSB0dXBsZSByZWNlaXZpbmdcbmFueSBleGNlc3MgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLCBkZWZhdWx0aW5nIHRvIHRoZSBlbXB0eSB0dXBsZS4gIElmXG50aGUgZm9ybSAiYGAqKmlkZW50aWZpZXJgYCIgaXMgcHJlc2VudCwgaXQgaXMgaW5pdGlhbGl6ZWQgdG8gYSBuZXdcbmRpY3Rpb25hcnkgcmVjZWl2aW5nIGFueSBleGNlc3Mga2V5d29yZCBhcmd1bWVudHMsIGRlZmF1bHRpbmcgdG8gYSBuZXdcbmVtcHR5IGRpY3Rpb25hcnkuXG5cbkl0IGlzIGFsc28gcG9zc2libGUgdG8gY3JlYXRlIGFub255bW91cyBmdW5jdGlvbnMgKGZ1bmN0aW9ucyBub3QgYm91bmRcbnRvIGEgbmFtZSksIGZvciBpbW1lZGlhdGUgdXNlIGluIGV4cHJlc3Npb25zLiAgVGhpcyB1c2VzIGxhbWJkYVxuZXhwcmVzc2lvbnMsIGRlc2NyaWJlZCBpbiBzZWN0aW9uICpMYW1iZGFzKi4gIE5vdGUgdGhhdCB0aGUgbGFtYmRhXG5leHByZXNzaW9uIGlzIG1lcmVseSBhIHNob3J0aGFuZCBmb3IgYSBzaW1wbGlmaWVkIGZ1bmN0aW9uIGRlZmluaXRpb247XG5hIGZ1bmN0aW9uIGRlZmluZWQgaW4gYSAiYGBkZWZgYCIgc3RhdGVtZW50IGNhbiBiZSBwYXNzZWQgYXJvdW5kIG9yXG5hc3NpZ25lZCB0byBhbm90aGVyIG5hbWUganVzdCBsaWtlIGEgZnVuY3Rpb24gZGVmaW5lZCBieSBhIGxhbWJkYVxuZXhwcmVzc2lvbi4gIFRoZSAiYGBkZWZgYCIgZm9ybSBpcyBhY3R1YWxseSBtb3JlIHBvd2VyZnVsIHNpbmNlIGl0XG5hbGxvd3MgdGhlIGV4ZWN1dGlvbiBvZiBtdWx0aXBsZSBzdGF0ZW1lbnRzLlxuXG4qKlByb2dyYW1tZXJcJ3Mgbm90ZToqKiBGdW5jdGlvbnMgYXJlIGZpcnN0LWNsYXNzIG9iamVjdHMuICBBICJgYGRlZmBgIlxuZm9ybSBleGVjdXRlZCBpbnNpZGUgYSBmdW5jdGlvbiBkZWZpbml0aW9uIGRlZmluZXMgYSBsb2NhbCBmdW5jdGlvblxudGhhdCBjYW4gYmUgcmV0dXJuZWQgb3IgcGFzc2VkIGFyb3VuZC4gIEZyZWUgdmFyaWFibGVzIHVzZWQgaW4gdGhlXG5uZXN0ZWQgZnVuY3Rpb24gY2FuIGFjY2VzcyB0aGUgbG9jYWwgdmFyaWFibGVzIG9mIHRoZSBmdW5jdGlvblxuY29udGFpbmluZyB0aGUgZGVmLiAgU2VlIHNlY3Rpb24gKk5hbWluZyBhbmQgYmluZGluZyogZm9yIGRldGFpbHMuXG5cblxuQ2xhc3MgZGVmaW5pdGlvbnNcbj09PT09PT09PT09PT09PT09XG5cbkEgY2xhc3MgZGVmaW5pdGlvbiBkZWZpbmVzIGEgY2xhc3Mgb2JqZWN0IChzZWUgc2VjdGlvbiAqVGhlIHN0YW5kYXJkXG50eXBlIGhpZXJhcmNoeSopOlxuXG4gICBjbGFzc2RlZiAgICA6Oj0gImNsYXNzIiBjbGFzc25hbWUgW2luaGVyaXRhbmNlXSAiOiIgc3VpdGVcbiAgIGluaGVyaXRhbmNlIDo6PSAiKCIgW2V4cHJlc3Npb25fbGlzdF0gIikiXG4gICBjbGFzc25hbWUgICA6Oj0gaWRlbnRpZmllclxuXG5BIGNsYXNzIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBJdCBmaXJzdCBldmFsdWF0ZXMgdGhlXG5pbmhlcml0YW5jZSBsaXN0LCBpZiBwcmVzZW50LiAgRWFjaCBpdGVtIGluIHRoZSBpbmhlcml0YW5jZSBsaXN0XG5zaG91bGQgZXZhbHVhdGUgdG8gYSBjbGFzcyBvYmplY3Qgb3IgY2xhc3MgdHlwZSB3aGljaCBhbGxvd3NcbnN1YmNsYXNzaW5nLiAgVGhlIGNsYXNzXCdzIHN1aXRlIGlzIHRoZW4gZXhlY3V0ZWQgaW4gYSBuZXcgZXhlY3V0aW9uXG5mcmFtZSAoc2VlIHNlY3Rpb24gKk5hbWluZyBhbmQgYmluZGluZyopLCB1c2luZyBhIG5ld2x5IGNyZWF0ZWQgbG9jYWxcbm5hbWVzcGFjZSBhbmQgdGhlIG9yaWdpbmFsIGdsb2JhbCBuYW1lc3BhY2UuIChVc3VhbGx5LCB0aGUgc3VpdGVcbmNvbnRhaW5zIG9ubHkgZnVuY3Rpb24gZGVmaW5pdGlvbnMuKSAgV2hlbiB0aGUgY2xhc3NcJ3Mgc3VpdGUgZmluaXNoZXNcbmV4ZWN1dGlvbiwgaXRzIGV4ZWN1dGlvbiBmcmFtZSBpcyBkaXNjYXJkZWQgYnV0IGl0cyBsb2NhbCBuYW1lc3BhY2UgaXNcbnNhdmVkLiBbNF0gQSBjbGFzcyBvYmplY3QgaXMgdGhlbiBjcmVhdGVkIHVzaW5nIHRoZSBpbmhlcml0YW5jZSBsaXN0XG5mb3IgdGhlIGJhc2UgY2xhc3NlcyBhbmQgdGhlIHNhdmVkIGxvY2FsIG5hbWVzcGFjZSBmb3IgdGhlIGF0dHJpYnV0ZVxuZGljdGlvbmFyeS4gIFRoZSBjbGFzcyBuYW1lIGlzIGJvdW5kIHRvIHRoaXMgY2xhc3Mgb2JqZWN0IGluIHRoZVxub3JpZ2luYWwgbG9jYWwgbmFtZXNwYWNlLlxuXG4qKlByb2dyYW1tZXJcJ3Mgbm90ZToqKiBWYXJpYWJsZXMgZGVmaW5lZCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBhcmVcbmNsYXNzIHZhcmlhYmxlczsgdGhleSBhcmUgc2hhcmVkIGJ5IGFsbCBpbnN0YW5jZXMuICBUbyBjcmVhdGUgaW5zdGFuY2VcbnZhcmlhYmxlcywgdGhleSBjYW4gYmUgc2V0IGluIGEgbWV0aG9kIHdpdGggYGBzZWxmLm5hbWUgPSB2YWx1ZWBgLlxuQm90aCBjbGFzcyBhbmQgaW5zdGFuY2UgdmFyaWFibGVzIGFyZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIG5vdGF0aW9uXG4iYGBzZWxmLm5hbWVgYCIsIGFuZCBhbiBpbnN0YW5jZSB2YXJpYWJsZSBoaWRlcyBhIGNsYXNzIHZhcmlhYmxlIHdpdGhcbnRoZSBzYW1lIG5hbWUgd2hlbiBhY2Nlc3NlZCBpbiB0aGlzIHdheS4gQ2xhc3MgdmFyaWFibGVzIGNhbiBiZSB1c2VkXG5hcyBkZWZhdWx0cyBmb3IgaW5zdGFuY2UgdmFyaWFibGVzLCBidXQgdXNpbmcgbXV0YWJsZSB2YWx1ZXMgdGhlcmUgY2FuXG5sZWFkIHRvIHVuZXhwZWN0ZWQgcmVzdWx0cy4gIEZvciAqbmV3LXN0eWxlIGNsYXNzKmVzLCBkZXNjcmlwdG9ycyBjYW5cbmJlIHVzZWQgdG8gY3JlYXRlIGluc3RhbmNlIHZhcmlhYmxlcyB3aXRoIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvblxuZGV0YWlscy5cblxuQ2xhc3MgZGVmaW5pdGlvbnMsIGxpa2UgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIG1heSBiZSB3cmFwcGVkIGJ5IG9uZSBvclxubW9yZSAqZGVjb3JhdG9yKiBleHByZXNzaW9ucy4gIFRoZSBldmFsdWF0aW9uIHJ1bGVzIGZvciB0aGUgZGVjb3JhdG9yXG5leHByZXNzaW9ucyBhcmUgdGhlIHNhbWUgYXMgZm9yIGZ1bmN0aW9ucy4gIFRoZSByZXN1bHQgbXVzdCBiZSBhIGNsYXNzXG5vYmplY3QsIHdoaWNoIGlzIHRoZW4gYm91bmQgdG8gdGhlIGNsYXNzIG5hbWUuXG5cbi1bIEZvb3Rub3RlcyBdLVxuXG5bMV0gVGhlIGV4Y2VwdGlvbiBpcyBwcm9wYWdhdGVkIHRvIHRoZSBpbnZvY2F0aW9uIHN0YWNrIHVubGVzcyB0aGVyZVxuICAgIGlzIGEgYGBmaW5hbGx5YGAgY2xhdXNlIHdoaWNoIGhhcHBlbnMgdG8gcmFpc2UgYW5vdGhlciBleGNlcHRpb24uXG4gICAgVGhhdCBuZXcgZXhjZXB0aW9uIGNhdXNlcyB0aGUgb2xkIG9uZSB0byBiZSBsb3N0LlxuXG5bMl0gQ3VycmVudGx5LCBjb250cm9sICJmbG93cyBvZmYgdGhlIGVuZCIgZXhjZXB0IGluIHRoZSBjYXNlIG9mIGFuXG4gICAgZXhjZXB0aW9uIG9yIHRoZSBleGVjdXRpb24gb2YgYSBgYHJldHVybmBgLCBgYGNvbnRpbnVlYGAsIG9yXG4gICAgYGBicmVha2BgIHN0YXRlbWVudC5cblxuWzNdIEEgc3RyaW5nIGxpdGVyYWwgYXBwZWFyaW5nIGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4gdGhlIGZ1bmN0aW9uXG4gICAgYm9keSBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBmdW5jdGlvblwncyBgYF9fZG9jX19gYCBhdHRyaWJ1dGUgYW5kXG4gICAgdGhlcmVmb3JlIHRoZSBmdW5jdGlvblwncyAqZG9jc3RyaW5nKi5cblxuWzRdIEEgc3RyaW5nIGxpdGVyYWwgYXBwZWFyaW5nIGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4gdGhlIGNsYXNzXG4gICAgYm9keSBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBuYW1lc3BhY2VcJ3MgYGBfX2RvY19fYGAgaXRlbSBhbmRcbiAgICB0aGVyZWZvcmUgdGhlIGNsYXNzXCdzICpkb2NzdHJpbmcqLlxuJywKKyAnY29udGV4dC1tYW5hZ2Vycyc6ICdcbldpdGggU3RhdGVtZW50IENvbnRleHQgTWFuYWdlcnNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuTmV3IGluIHZlcnNpb24gMi41LlxuXG5BICpjb250ZXh0IG1hbmFnZXIqIGlzIGFuIG9iamVjdCB0aGF0IGRlZmluZXMgdGhlIHJ1bnRpbWUgY29udGV4dCB0b1xuYmUgZXN0YWJsaXNoZWQgd2hlbiBleGVjdXRpbmcgYSBgYHdpdGhgYCBzdGF0ZW1lbnQuIFRoZSBjb250ZXh0XG5tYW5hZ2VyIGhhbmRsZXMgdGhlIGVudHJ5IGludG8sIGFuZCB0aGUgZXhpdCBmcm9tLCB0aGUgZGVzaXJlZCBydW50aW1lXG5jb250ZXh0IGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBibG9jayBvZiBjb2RlLiAgQ29udGV4dCBtYW5hZ2VycyBhcmVcbm5vcm1hbGx5IGludm9rZWQgdXNpbmcgdGhlIGBgd2l0aGBgIHN0YXRlbWVudCAoZGVzY3JpYmVkIGluIHNlY3Rpb25cbipUaGUgd2l0aCBzdGF0ZW1lbnQqKSwgYnV0IGNhbiBhbHNvIGJlIHVzZWQgYnkgZGlyZWN0bHkgaW52b2tpbmcgdGhlaXJcbm1ldGhvZHMuXG5cblR5cGljYWwgdXNlcyBvZiBjb250ZXh0IG1hbmFnZXJzIGluY2x1ZGUgc2F2aW5nIGFuZCByZXN0b3JpbmcgdmFyaW91c1xua2luZHMgb2YgZ2xvYmFsIHN0YXRlLCBsb2NraW5nIGFuZCB1bmxvY2tpbmcgcmVzb3VyY2VzLCBjbG9zaW5nIG9wZW5lZFxuZmlsZXMsIGV0Yy5cblxuRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gY29udGV4dCBtYW5hZ2Vycywgc2VlICpDb250ZXh0IE1hbmFnZXIgVHlwZXMqLlxuXG5vYmplY3QuX19lbnRlcl9fKHNlbGYpXG5cbiAgIEVudGVyIHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlIGBgd2l0aGBgXG4gICBzdGF0ZW1lbnQgd2lsbCBiaW5kIHRoaXMgbWV0aG9kXCdzIHJldHVybiB2YWx1ZSB0byB0aGUgdGFyZ2V0KHMpXG4gICBzcGVjaWZpZWQgaW4gdGhlIGBgYXNgYCBjbGF1c2Ugb2YgdGhlIHN0YXRlbWVudCwgaWYgYW55LlxuXG5vYmplY3QuX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKVxuXG4gICBFeGl0IHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlIHBhcmFtZXRlcnNcbiAgIGRlc2NyaWJlIHRoZSBleGNlcHRpb24gdGhhdCBjYXVzZWQgdGhlIGNvbnRleHQgdG8gYmUgZXhpdGVkLiBJZiB0aGVcbiAgIGNvbnRleHQgd2FzIGV4aXRlZCB3aXRob3V0IGFuIGV4Y2VwdGlvbiwgYWxsIHRocmVlIGFyZ3VtZW50cyB3aWxsXG4gICBiZSBgYE5vbmVgYC5cblxuICAgSWYgYW4gZXhjZXB0aW9uIGlzIHN1cHBsaWVkLCBhbmQgdGhlIG1ldGhvZCB3aXNoZXMgdG8gc3VwcHJlc3MgdGhlXG4gICBleGNlcHRpb24gKGkuZS4sIHByZXZlbnQgaXQgZnJvbSBiZWluZyBwcm9wYWdhdGVkKSwgaXQgc2hvdWxkXG4gICByZXR1cm4gYSB0cnVlIHZhbHVlLiBPdGhlcndpc2UsIHRoZSBleGNlcHRpb24gd2lsbCBiZSBwcm9jZXNzZWRcbiAgIG5vcm1hbGx5IHVwb24gZXhpdCBmcm9tIHRoaXMgbWV0aG9kLlxuXG4gICBOb3RlIHRoYXQgYGBfX2V4aXRfXygpYGAgbWV0aG9kcyBzaG91bGQgbm90IHJlcmFpc2UgdGhlIHBhc3NlZC1pblxuICAgZXhjZXB0aW9uOyB0aGlzIGlzIHRoZSBjYWxsZXJcJ3MgcmVzcG9uc2liaWxpdHkuXG5cblNlZSBhbHNvOlxuXG4gICAqKlBFUCAwMzQzKiogLSBUaGUgIndpdGgiIHN0YXRlbWVudFxuICAgICAgVGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlIFB5dGhvblxuICAgICAgYGB3aXRoYGAgc3RhdGVtZW50LlxuJywKKyAnY29udGludWUnOiAnXG5UaGUgYGBjb250aW51ZWBgIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuICAgY29udGludWVfc3RtdCA6Oj0gImNvbnRpbnVlIlxuXG5gYGNvbnRpbnVlYGAgbWF5IG9ubHkgb2NjdXIgc3ludGFjdGljYWxseSBuZXN0ZWQgaW4gYSBgYGZvcmBgIG9yXG5gYHdoaWxlYGAgbG9vcCwgYnV0IG5vdCBuZXN0ZWQgaW4gYSBmdW5jdGlvbiBvciBjbGFzcyBkZWZpbml0aW9uIG9yXG5gYGZpbmFsbHlgYCBjbGF1c2Ugd2l0aGluIHRoYXQgbG9vcC4gIEl0IGNvbnRpbnVlcyB3aXRoIHRoZSBuZXh0IGN5Y2xlXG5vZiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbG9vcC5cblxuV2hlbiBgYGNvbnRpbnVlYGAgcGFzc2VzIGNvbnRyb2wgb3V0IG9mIGEgYGB0cnlgYCBzdGF0ZW1lbnQgd2l0aCBhXG5gYGZpbmFsbHlgYCBjbGF1c2UsIHRoYXQgYGBmaW5hbGx5YGAgY2xhdXNlIGlzIGV4ZWN1dGVkIGJlZm9yZSByZWFsbHlcbnN0YXJ0aW5nIHRoZSBuZXh0IGxvb3AgY3ljbGUuXG4nLAorICdjb252ZXJzaW9ucyc6ICdcbkFyaXRobWV0aWMgY29udmVyc2lvbnNcbioqKioqKioqKioqKioqKioqKioqKipcblxuV2hlbiBhIGRlc2NyaXB0aW9uIG9mIGFuIGFyaXRobWV0aWMgb3BlcmF0b3IgYmVsb3cgdXNlcyB0aGUgcGhyYXNlXG4idGhlIG51bWVyaWMgYXJndW1lbnRzIGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZSwiIHRoZSBhcmd1bWVudHNcbmFyZSBjb2VyY2VkIHVzaW5nIHRoZSBjb2VyY2lvbiBydWxlcyBsaXN0ZWQgYXQgICpDb2VyY2lvbiBydWxlcyouICBJZlxuYm90aCBhcmd1bWVudHMgYXJlIHN0YW5kYXJkIG51bWVyaWMgdHlwZXMsIHRoZSBmb2xsb3dpbmcgY29lcmNpb25zIGFyZVxuYXBwbGllZDpcblxuKiBJZiBlaXRoZXIgYXJndW1lbnQgaXMgYSBjb21wbGV4IG51bWJlciwgdGhlIG90aGVyIGlzIGNvbnZlcnRlZCB0b1xuICBjb21wbGV4O1xuXG4qIG90aGVyd2lzZSwgaWYgZWl0aGVyIGFyZ3VtZW50IGlzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCB0aGUgb3RoZXJcbiAgaXMgY29udmVydGVkIHRvIGZsb2F0aW5nIHBvaW50O1xuXG4qIG90aGVyd2lzZSwgaWYgZWl0aGVyIGFyZ3VtZW50IGlzIGEgbG9uZyBpbnRlZ2VyLCB0aGUgb3RoZXIgaXNcbiAgY29udmVydGVkIHRvIGxvbmcgaW50ZWdlcjtcblxuKiBvdGhlcndpc2UsIGJvdGggbXVzdCBiZSBwbGFpbiBpbnRlZ2VycyBhbmQgbm8gY29udmVyc2lvbiBpc1xuICBuZWNlc3NhcnkuXG5cblNvbWUgYWRkaXRpb25hbCBydWxlcyBhcHBseSBmb3IgY2VydGFpbiBvcGVyYXRvcnMgKGUuZy4sIGEgc3RyaW5nIGxlZnRcbmFyZ3VtZW50IHRvIHRoZSBcJyVcJyBvcGVyYXRvcikuIEV4dGVuc2lvbnMgY2FuIGRlZmluZSB0aGVpciBvd25cbmNvZXJjaW9ucy5cbicsCisgJ2N1c3RvbWl6YXRpb24nOiAnXG5CYXNpYyBjdXN0b21pemF0aW9uXG4qKioqKioqKioqKioqKioqKioqXG5cbm9iamVjdC5fX25ld19fKGNsc1ssIC4uLl0pXG5cbiAgIENhbGxlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgY2xhc3MgKmNscyouICBgYF9fbmV3X18oKWBgIGlzIGFcbiAgIHN0YXRpYyBtZXRob2QgKHNwZWNpYWwtY2FzZWQgc28geW91IG5lZWQgbm90IGRlY2xhcmUgaXQgYXMgc3VjaClcbiAgIHRoYXQgdGFrZXMgdGhlIGNsYXNzIG9mIHdoaWNoIGFuIGluc3RhbmNlIHdhcyByZXF1ZXN0ZWQgYXMgaXRzXG4gICBmaXJzdCBhcmd1bWVudC4gIFRoZSByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aG9zZSBwYXNzZWQgdG8gdGhlXG4gICBvYmplY3QgY29uc3RydWN0b3IgZXhwcmVzc2lvbiAodGhlIGNhbGwgdG8gdGhlIGNsYXNzKS4gIFRoZSByZXR1cm5cbiAgIHZhbHVlIG9mIGBgX19uZXdfXygpYGAgc2hvdWxkIGJlIHRoZSBuZXcgb2JqZWN0IGluc3RhbmNlICh1c3VhbGx5XG4gICBhbiBpbnN0YW5jZSBvZiAqY2xzKikuXG5cbiAgIFR5cGljYWwgaW1wbGVtZW50YXRpb25zIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgYnlcbiAgIGludm9raW5nIHRoZSBzdXBlcmNsYXNzXCdzIGBgX19uZXdfXygpYGAgbWV0aG9kIHVzaW5nXG4gICBgYHN1cGVyKGN1cnJlbnRjbGFzcywgY2xzKS5fX25ld19fKGNsc1ssIC4uLl0pYGAgd2l0aCBhcHByb3ByaWF0ZVxuICAgYXJndW1lbnRzIGFuZCB0aGVuIG1vZGlmeWluZyB0aGUgbmV3bHktY3JlYXRlZCBpbnN0YW5jZSBhc1xuICAgbmVjZXNzYXJ5IGJlZm9yZSByZXR1cm5pbmcgaXQuXG5cbiAgIElmIGBgX19uZXdfXygpYGAgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiAqY2xzKiwgdGhlbiB0aGUgbmV3XG4gICBpbnN0YW5jZVwncyBgYF9faW5pdF9fKClgYCBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIGxpa2VcbiAgIGBgX19pbml0X18oc2VsZlssIC4uLl0pYGAsIHdoZXJlICpzZWxmKiBpcyB0aGUgbmV3IGluc3RhbmNlIGFuZCB0aGVcbiAgIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIHdlcmUgcGFzc2VkIHRvIGBgX19uZXdfXygpYGAuXG5cbiAgIElmIGBgX19uZXdfXygpYGAgZG9lcyBub3QgcmV0dXJuIGFuIGluc3RhbmNlIG9mICpjbHMqLCB0aGVuIHRoZSBuZXdcbiAgIGluc3RhbmNlXCdzIGBgX19pbml0X18oKWBgIG1ldGhvZCB3aWxsIG5vdCBiZSBpbnZva2VkLlxuXG4gICBgYF9fbmV3X18oKWBgIGlzIGludGVuZGVkIG1haW5seSB0byBhbGxvdyBzdWJjbGFzc2VzIG9mIGltbXV0YWJsZVxuICAgdHlwZXMgKGxpa2UgaW50LCBzdHIsIG9yIHR1cGxlKSB0byBjdXN0b21pemUgaW5zdGFuY2UgY3JlYXRpb24uICBJdFxuICAgaXMgYWxzbyBjb21tb25seSBvdmVycmlkZGVuIGluIGN1c3RvbSBtZXRhY2xhc3NlcyBpbiBvcmRlciB0b1xuICAgY3VzdG9taXplIGNsYXNzIGNyZWF0aW9uLlxuXG5vYmplY3QuX19pbml0X18oc2VsZlssIC4uLl0pXG5cbiAgIENhbGxlZCB3aGVuIHRoZSBpbnN0YW5jZSBpcyBjcmVhdGVkLiAgVGhlIGFyZ3VtZW50cyBhcmUgdGhvc2VcbiAgIHBhc3NlZCB0byB0aGUgY2xhc3MgY29uc3RydWN0b3IgZXhwcmVzc2lvbi4gIElmIGEgYmFzZSBjbGFzcyBoYXMgYW5cbiAgIGBgX19pbml0X18oKWBgIG1ldGhvZCwgdGhlIGRlcml2ZWQgY2xhc3NcJ3MgYGBfX2luaXRfXygpYGAgbWV0aG9kLFxuICAgaWYgYW55LCBtdXN0IGV4cGxpY2l0bHkgY2FsbCBpdCB0byBlbnN1cmUgcHJvcGVyIGluaXRpYWxpemF0aW9uIG9mXG4gICB0aGUgYmFzZSBjbGFzcyBwYXJ0IG9mIHRoZSBpbnN0YW5jZTsgZm9yIGV4YW1wbGU6XG4gICBgYEJhc2VDbGFzcy5fX2luaXRfXyhzZWxmLCBbYXJncy4uLl0pYGAuICBBcyBhIHNwZWNpYWwgY29uc3RyYWludFxuICAgb24gY29uc3RydWN0b3JzLCBubyB2YWx1ZSBtYXkgYmUgcmV0dXJuZWQ7IGRvaW5nIHNvIHdpbGwgY2F1c2UgYVxuICAgYGBUeXBlRXJyb3JgYCB0byBiZSByYWlzZWQgYXQgcnVudGltZS5cblxub2JqZWN0Ll9fZGVsX18oc2VsZilcblxuICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZC4gIFRoaXMgaXMgYWxzb1xuICAgY2FsbGVkIGEgZGVzdHJ1Y3Rvci4gIElmIGEgYmFzZSBjbGFzcyBoYXMgYSBgYF9fZGVsX18oKWBgIG1ldGhvZCxcbiAgIHRoZSBkZXJpdmVkIGNsYXNzXCdzIGBgX19kZWxfXygpYGAgbWV0aG9kLCBpZiBhbnksIG11c3QgZXhwbGljaXRseVxuICAgY2FsbCBpdCB0byBlbnN1cmUgcHJvcGVyIGRlbGV0aW9uIG9mIHRoZSBiYXNlIGNsYXNzIHBhcnQgb2YgdGhlXG4gICBpbnN0YW5jZS4gIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSAodGhvdWdoIG5vdCByZWNvbW1lbmRlZCEpIGZvclxuICAgdGhlIGBgX19kZWxfXygpYGAgbWV0aG9kIHRvIHBvc3Rwb25lIGRlc3RydWN0aW9uIG9mIHRoZSBpbnN0YW5jZSBieVxuICAgY3JlYXRpbmcgYSBuZXcgcmVmZXJlbmNlIHRvIGl0LiAgSXQgbWF5IHRoZW4gYmUgY2FsbGVkIGF0IGEgbGF0ZXJcbiAgIHRpbWUgd2hlbiB0aGlzIG5ldyByZWZlcmVuY2UgaXMgZGVsZXRlZC4gIEl0IGlzIG5vdCBndWFyYW50ZWVkIHRoYXRcbiAgIGBgX19kZWxfXygpYGAgbWV0aG9kcyBhcmUgY2FsbGVkIGZvciBvYmplY3RzIHRoYXQgc3RpbGwgZXhpc3Qgd2hlblxuICAgdGhlIGludGVycHJldGVyIGV4aXRzLlxuXG4gICBOb3RlOiBgYGRlbCB4YGAgZG9lc25cJ3QgZGlyZWN0bHkgY2FsbCBgYHguX19kZWxfXygpYGAgLS0tIHRoZSBmb3JtZXJcbiAgICAgZGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IGZvciBgYHhgYCBieSBvbmUsIGFuZCB0aGUgbGF0dGVyXG4gICAgIGlzIG9ubHkgY2FsbGVkIHdoZW4gYGB4YGBcJ3MgcmVmZXJlbmNlIGNvdW50IHJlYWNoZXMgemVyby4gIFNvbWVcbiAgICAgY29tbW9uIHNpdHVhdGlvbnMgdGhhdCBtYXkgcHJldmVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGFuXG4gICAgIG9iamVjdCBmcm9tIGdvaW5nIHRvIHplcm8gaW5jbHVkZTogY2lyY3VsYXIgcmVmZXJlbmNlcyBiZXR3ZWVuXG4gICAgIG9iamVjdHMgKGUuZy4sIGEgZG91Ymx5LWxpbmtlZCBsaXN0IG9yIGEgdHJlZSBkYXRhIHN0cnVjdHVyZSB3aXRoXG4gICAgIHBhcmVudCBhbmQgY2hpbGQgcG9pbnRlcnMpOyBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IG9uIHRoZVxuICAgICBzdGFjayBmcmFtZSBvZiBhIGZ1bmN0aW9uIHRoYXQgY2F1Z2h0IGFuIGV4Y2VwdGlvbiAodGhlIHRyYWNlYmFja1xuICAgICBzdG9yZWQgaW4gYGBzeXMuZXhjX3RyYWNlYmFja2BgIGtlZXBzIHRoZSBzdGFjayBmcmFtZSBhbGl2ZSk7IG9yXG4gICAgIGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3Qgb24gdGhlIHN0YWNrIGZyYW1lIHRoYXQgcmFpc2VkIGFuXG4gICAgIHVuaGFuZGxlZCBleGNlcHRpb24gaW4gaW50ZXJhY3RpdmUgbW9kZSAodGhlIHRyYWNlYmFjayBzdG9yZWQgaW5cbiAgICAgYGBzeXMubGFzdF90cmFjZWJhY2tgYCBrZWVwcyB0aGUgc3RhY2sgZnJhbWUgYWxpdmUpLiAgVGhlIGZpcnN0XG4gICAgIHNpdHVhdGlvbiBjYW4gb25seSBiZSByZW1lZGllZCBieSBleHBsaWNpdGx5IGJyZWFraW5nIHRoZSBjeWNsZXM7XG4gICAgIHRoZSBsYXR0ZXIgdHdvIHNpdHVhdGlvbnMgY2FuIGJlIHJlc29sdmVkIGJ5IHN0b3JpbmcgYGBOb25lYGAgaW5cbiAgICAgYGBzeXMuZXhjX3RyYWNlYmFja2BgIG9yIGBgc3lzLmxhc3RfdHJhY2ViYWNrYGAuICBDaXJjdWxhclxuICAgICByZWZlcmVuY2VzIHdoaWNoIGFyZSBnYXJiYWdlIGFyZSBkZXRlY3RlZCB3aGVuIHRoZSBvcHRpb24gY3ljbGVcbiAgICAgZGV0ZWN0b3IgaXMgZW5hYmxlZCAoaXRcJ3Mgb24gYnkgZGVmYXVsdCksIGJ1dCBjYW4gb25seSBiZSBjbGVhbmVkXG4gICAgIHVwIGlmIHRoZXJlIGFyZSBubyBQeXRob24tbGV2ZWwgYGBfX2RlbF9fKClgYCBtZXRob2RzIGludm9sdmVkLlxuICAgICBSZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGBgZ2NgYCBtb2R1bGUgZm9yIG1vcmVcbiAgICAgaW5mb3JtYXRpb24gYWJvdXQgaG93IGBgX19kZWxfXygpYGAgbWV0aG9kcyBhcmUgaGFuZGxlZCBieSB0aGVcbiAgICAgY3ljbGUgZGV0ZWN0b3IsIHBhcnRpY3VsYXJseSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGBgZ2FyYmFnZWBgXG4gICAgIHZhbHVlLlxuXG4gICBXYXJuaW5nOiBEdWUgdG8gdGhlIHByZWNhcmlvdXMgY2lyY3Vtc3RhbmNlcyB1bmRlciB3aGljaCBgYF9fZGVsX18oKWBgXG4gICAgIG1ldGhvZHMgYXJlIGludm9rZWQsIGV4Y2VwdGlvbnMgdGhhdCBvY2N1ciBkdXJpbmcgdGhlaXIgZXhlY3V0aW9uXG4gICAgIGFyZSBpZ25vcmVkLCBhbmQgYSB3YXJuaW5nIGlzIHByaW50ZWQgdG8gYGBzeXMuc3RkZXJyYGAgaW5zdGVhZC5cbiAgICAgQWxzbywgd2hlbiBgYF9fZGVsX18oKWBgIGlzIGludm9rZWQgaW4gcmVzcG9uc2UgdG8gYSBtb2R1bGUgYmVpbmdcbiAgICAgZGVsZXRlZCAoZS5nLiwgd2hlbiBleGVjdXRpb24gb2YgdGhlIHByb2dyYW0gaXMgZG9uZSksIG90aGVyXG4gICAgIGdsb2JhbHMgcmVmZXJlbmNlZCBieSB0aGUgYGBfX2RlbF9fKClgYCBtZXRob2QgbWF5IGFscmVhZHkgaGF2ZVxuICAgICBiZWVuIGRlbGV0ZWQgb3IgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgdG9ybiBkb3duIChlLmcuIHRoZVxuICAgICBpbXBvcnQgbWFjaGluZXJ5IHNodXR0aW5nIGRvd24pLiAgRm9yIHRoaXMgcmVhc29uLCBgYF9fZGVsX18oKWBgXG4gICAgIG1ldGhvZHMgc2hvdWxkIGRvIHRoZSBhYnNvbHV0ZSBtaW5pbXVtIG5lZWRlZCB0byBtYWludGFpblxuICAgICBleHRlcm5hbCBpbnZhcmlhbnRzLiAgU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDEuNSwgUHl0aG9uXG4gICAgIGd1YXJhbnRlZXMgdGhhdCBnbG9iYWxzIHdob3NlIG5hbWUgYmVnaW5zIHdpdGggYSBzaW5nbGVcbiAgICAgdW5kZXJzY29yZSBhcmUgZGVsZXRlZCBmcm9tIHRoZWlyIG1vZHVsZSBiZWZvcmUgb3RoZXIgZ2xvYmFscyBhcmVcbiAgICAgZGVsZXRlZDsgaWYgbm8gb3RoZXIgcmVmZXJlbmNlcyB0byBzdWNoIGdsb2JhbHMgZXhpc3QsIHRoaXMgbWF5XG4gICAgIGhlbHAgaW4gYXNzdXJpbmcgdGhhdCBpbXBvcnRlZCBtb2R1bGVzIGFyZSBzdGlsbCBhdmFpbGFibGUgYXQgdGhlXG4gICAgIHRpbWUgd2hlbiB0aGUgYGBfX2RlbF9fKClgYCBtZXRob2QgaXMgY2FsbGVkLlxuXG4gICBTZWUgYWxzbyB0aGUgKi1SKiBjb21tYW5kLWxpbmUgb3B0aW9uLlxuXG5vYmplY3QuX19yZXByX18oc2VsZilcblxuICAgQ2FsbGVkIGJ5IHRoZSBgYHJlcHIoKWBgIGJ1aWx0LWluIGZ1bmN0aW9uIGFuZCBieSBzdHJpbmdcbiAgIGNvbnZlcnNpb25zIChyZXZlcnNlIHF1b3RlcykgdG8gY29tcHV0ZSB0aGUgIm9mZmljaWFsIiBzdHJpbmdcbiAgIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gIElmIGF0IGFsbCBwb3NzaWJsZSwgdGhpcyBzaG91bGQgbG9va1xuICAgbGlrZSBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uIHRoYXQgY291bGQgYmUgdXNlZCB0byByZWNyZWF0ZSBhblxuICAgb2JqZWN0IHdpdGggdGhlIHNhbWUgdmFsdWUgKGdpdmVuIGFuIGFwcHJvcHJpYXRlIGVudmlyb25tZW50KS4gIElmXG4gICB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgYSBzdHJpbmcgb2YgdGhlIGZvcm0gYGA8Li4uc29tZSB1c2VmdWxcbiAgIGRlc2NyaXB0aW9uLi4uPmBgIHNob3VsZCBiZSByZXR1cm5lZC4gIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBhXG4gICBzdHJpbmcgb2JqZWN0LiBJZiBhIGNsYXNzIGRlZmluZXMgYGBfX3JlcHJfXygpYGAgYnV0IG5vdFxuICAgYGBfX3N0cl9fKClgYCwgdGhlbiBgYF9fcmVwcl9fKClgYCBpcyBhbHNvIHVzZWQgd2hlbiBhbiAiaW5mb3JtYWwiXG4gICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgaW5zdGFuY2VzIG9mIHRoYXQgY2xhc3MgaXMgcmVxdWlyZWQuXG5cbiAgIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGRlYnVnZ2luZywgc28gaXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlXG4gICByZXByZXNlbnRhdGlvbiBpcyBpbmZvcm1hdGlvbi1yaWNoIGFuZCB1bmFtYmlndW91cy5cblxub2JqZWN0Ll9fc3RyX18oc2VsZilcblxuICAgQ2FsbGVkIGJ5IHRoZSBgYHN0cigpYGAgYnVpbHQtaW4gZnVuY3Rpb24gYW5kIGJ5IHRoZSBgYHByaW50YGBcbiAgIHN0YXRlbWVudCB0byBjb21wdXRlIHRoZSAiaW5mb3JtYWwiIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhblxuICAgb2JqZWN0LiAgVGhpcyBkaWZmZXJzIGZyb20gYGBfX3JlcHJfXygpYGAgaW4gdGhhdCBpdCBkb2VzIG5vdCBoYXZlXG4gICB0byBiZSBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uOiBhIG1vcmUgY29udmVuaWVudCBvciBjb25jaXNlXG4gICByZXByZXNlbnRhdGlvbiBtYXkgYmUgdXNlZCBpbnN0ZWFkLiBUaGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgYVxuICAgc3RyaW5nIG9iamVjdC5cblxub2JqZWN0Ll9fbHRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2xlX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19lcV9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fbmVfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2d0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19nZV9fKHNlbGYsIG90aGVyKVxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjEuXG5cbiAgIFRoZXNlIGFyZSB0aGUgc28tY2FsbGVkICJyaWNoIGNvbXBhcmlzb24iIG1ldGhvZHMsIGFuZCBhcmUgY2FsbGVkXG4gICBmb3IgY29tcGFyaXNvbiBvcGVyYXRvcnMgaW4gcHJlZmVyZW5jZSB0byBgYF9fY21wX18oKWBgIGJlbG93LiBUaGVcbiAgIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gb3BlcmF0b3Igc3ltYm9scyBhbmQgbWV0aG9kIG5hbWVzIGlzIGFzXG4gICBmb2xsb3dzOiBgYHg8eWBgIGNhbGxzIGBgeC5fX2x0X18oeSlgYCwgYGB4PD15YGAgY2FsbHNcbiAgIGBgeC5fX2xlX18oeSlgYCwgYGB4PT15YGAgY2FsbHMgYGB4Ll9fZXFfXyh5KWBgLCBgYHghPXlgYCBhbmRcbiAgIGBgeDw+eWBgIGNhbGwgYGB4Ll9fbmVfXyh5KWBgLCBgYHg+eWBgIGNhbGxzIGBgeC5fX2d0X18oeSlgYCwgYW5kXG4gICBgYHg+PXlgYCBjYWxscyBgYHguX19nZV9fKHkpYGAuXG5cbiAgIEEgcmljaCBjb21wYXJpc29uIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBzaW5nbGV0b25cbiAgIGBgTm90SW1wbGVtZW50ZWRgYCBpZiBpdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG9wZXJhdGlvbiBmb3IgYVxuICAgZ2l2ZW4gcGFpciBvZiBhcmd1bWVudHMuIEJ5IGNvbnZlbnRpb24sIGBgRmFsc2VgYCBhbmQgYGBUcnVlYGAgYXJlXG4gICByZXR1cm5lZCBmb3IgYSBzdWNjZXNzZnVsIGNvbXBhcmlzb24uIEhvd2V2ZXIsIHRoZXNlIG1ldGhvZHMgY2FuXG4gICByZXR1cm4gYW55IHZhbHVlLCBzbyBpZiB0aGUgY29tcGFyaXNvbiBvcGVyYXRvciBpcyB1c2VkIGluIGFcbiAgIEJvb2xlYW4gY29udGV4dCAoZS5nLiwgaW4gdGhlIGNvbmRpdGlvbiBvZiBhbiBgYGlmYGAgc3RhdGVtZW50KSxcbiAgIFB5dGhvbiB3aWxsIGNhbGwgYGBib29sKClgYCBvbiB0aGUgdmFsdWUgdG8gZGV0ZXJtaW5lIGlmIHRoZSByZXN1bHRcbiAgIGlzIHRydWUgb3IgZmFsc2UuXG5cbiAgIFRoZXJlIGFyZSBubyBpbXBsaWVkIHJlbGF0aW9uc2hpcHMgYW1vbmcgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzLlxuICAgVGhlIHRydXRoIG9mIGBgeD09eWBgIGRvZXMgbm90IGltcGx5IHRoYXQgYGB4IT15YGAgaXMgZmFsc2UuXG4gICBBY2NvcmRpbmdseSwgd2hlbiBkZWZpbmluZyBgYF9fZXFfXygpYGAsIG9uZSBzaG91bGQgYWxzbyBkZWZpbmVcbiAgIGBgX19uZV9fKClgYCBzbyB0aGF0IHRoZSBvcGVyYXRvcnMgd2lsbCBiZWhhdmUgYXMgZXhwZWN0ZWQuICBTZWVcbiAgIHRoZSBwYXJhZ3JhcGggb24gYGBfX2hhc2hfXygpYGAgZm9yIHNvbWUgaW1wb3J0YW50IG5vdGVzIG9uXG4gICBjcmVhdGluZyAqaGFzaGFibGUqIG9iamVjdHMgd2hpY2ggc3VwcG9ydCBjdXN0b20gY29tcGFyaXNvblxuICAgb3BlcmF0aW9ucyBhbmQgYXJlIHVzYWJsZSBhcyBkaWN0aW9uYXJ5IGtleXMuXG5cbiAgIFRoZXJlIGFyZSBubyBzd2FwcGVkLWFyZ3VtZW50IHZlcnNpb25zIG9mIHRoZXNlIG1ldGhvZHMgKHRvIGJlIHVzZWRcbiAgIHdoZW4gdGhlIGxlZnQgYXJndW1lbnQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uIGJ1dCB0aGUgcmlnaHRcbiAgIGFyZ3VtZW50IGRvZXMpOyByYXRoZXIsIGBgX19sdF9fKClgYCBhbmQgYGBfX2d0X18oKWBgIGFyZSBlYWNoXG4gICBvdGhlclwncyByZWZsZWN0aW9uLCBgYF9fbGVfXygpYGAgYW5kIGBgX19nZV9fKClgYCBhcmUgZWFjaCBvdGhlclwnc1xuICAgcmVmbGVjdGlvbiwgYW5kIGBgX19lcV9fKClgYCBhbmQgYGBfX25lX18oKWBgIGFyZSB0aGVpciBvd25cbiAgIHJlZmxlY3Rpb24uXG5cbiAgIEFyZ3VtZW50cyB0byByaWNoIGNvbXBhcmlzb24gbWV0aG9kcyBhcmUgbmV2ZXIgY29lcmNlZC5cblxuICAgVG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZSBvcmRlcmluZyBvcGVyYXRpb25zIGZyb20gYSBzaW5nbGUgcm9vdFxuICAgb3BlcmF0aW9uLCBzZWUgYGBmdW5jdG9vbHMudG90YWxfb3JkZXJpbmcoKWBgLlxuXG5vYmplY3QuX19jbXBfXyhzZWxmLCBvdGhlcilcblxuICAgQ2FsbGVkIGJ5IGNvbXBhcmlzb24gb3BlcmF0aW9ucyBpZiByaWNoIGNvbXBhcmlzb24gKHNlZSBhYm92ZSkgaXNcbiAgIG5vdCBkZWZpbmVkLiAgU2hvdWxkIHJldHVybiBhIG5lZ2F0aXZlIGludGVnZXIgaWYgYGBzZWxmIDwgb3RoZXJgYCxcbiAgIHplcm8gaWYgYGBzZWxmID09IG90aGVyYGAsIGEgcG9zaXRpdmUgaW50ZWdlciBpZiBgYHNlbGYgPiBvdGhlcmBgLlxuICAgSWYgbm8gYGBfX2NtcF9fKClgYCwgYGBfX2VxX18oKWBgIG9yIGBgX19uZV9fKClgYCBvcGVyYXRpb24gaXNcbiAgIGRlZmluZWQsIGNsYXNzIGluc3RhbmNlcyBhcmUgY29tcGFyZWQgYnkgb2JqZWN0IGlkZW50aXR5XG4gICAoImFkZHJlc3MiKS4gIFNlZSBhbHNvIHRoZSBkZXNjcmlwdGlvbiBvZiBgYF9faGFzaF9fKClgYCBmb3Igc29tZVxuICAgaW1wb3J0YW50IG5vdGVzIG9uIGNyZWF0aW5nICpoYXNoYWJsZSogb2JqZWN0cyB3aGljaCBzdXBwb3J0IGN1c3RvbVxuICAgY29tcGFyaXNvbiBvcGVyYXRpb25zIGFuZCBhcmUgdXNhYmxlIGFzIGRpY3Rpb25hcnkga2V5cy4gKE5vdGU6IHRoZVxuICAgcmVzdHJpY3Rpb24gdGhhdCBleGNlcHRpb25zIGFyZSBub3QgcHJvcGFnYXRlZCBieSBgYF9fY21wX18oKWBgIGhhc1xuICAgYmVlbiByZW1vdmVkIHNpbmNlIFB5dGhvbiAxLjUuKVxuXG5vYmplY3QuX19yY21wX18oc2VsZiwgb3RoZXIpXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjE6IE5vIGxvbmdlciBzdXBwb3J0ZWQuXG5cbm9iamVjdC5fX2hhc2hfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgYnVpbHQtaW4gZnVuY3Rpb24gYGBoYXNoKClgYCBhbmQgZm9yIG9wZXJhdGlvbnMgb25cbiAgIG1lbWJlcnMgb2YgaGFzaGVkIGNvbGxlY3Rpb25zIGluY2x1ZGluZyBgYHNldGBgLCBgYGZyb3plbnNldGBgLCBhbmRcbiAgIGBgZGljdGBgLiAgYGBfX2hhc2hfXygpYGAgc2hvdWxkIHJldHVybiBhbiBpbnRlZ2VyLiAgVGhlIG9ubHlcbiAgIHJlcXVpcmVkIHByb3BlcnR5IGlzIHRoYXQgb2JqZWN0cyB3aGljaCBjb21wYXJlIGVxdWFsIGhhdmUgdGhlIHNhbWVcbiAgIGhhc2ggdmFsdWU7IGl0IGlzIGFkdmlzZWQgdG8gc29tZWhvdyBtaXggdG9nZXRoZXIgKGUuZy4gdXNpbmdcbiAgIGV4Y2x1c2l2ZSBvcikgdGhlIGhhc2ggdmFsdWVzIGZvciB0aGUgY29tcG9uZW50cyBvZiB0aGUgb2JqZWN0IHRoYXRcbiAgIGFsc28gcGxheSBhIHBhcnQgaW4gY29tcGFyaXNvbiBvZiBvYmplY3RzLlxuXG4gICBJZiBhIGNsYXNzIGRvZXMgbm90IGRlZmluZSBhIGBgX19jbXBfXygpYGAgb3IgYGBfX2VxX18oKWBgIG1ldGhvZFxuICAgaXQgc2hvdWxkIG5vdCBkZWZpbmUgYSBgYF9faGFzaF9fKClgYCBvcGVyYXRpb24gZWl0aGVyOyBpZiBpdFxuICAgZGVmaW5lcyBgYF9fY21wX18oKWBgIG9yIGBgX19lcV9fKClgYCBidXQgbm90IGBgX19oYXNoX18oKWBgLCBpdHNcbiAgIGluc3RhbmNlcyB3aWxsIG5vdCBiZSB1c2FibGUgaW4gaGFzaGVkIGNvbGxlY3Rpb25zLiAgSWYgYSBjbGFzc1xuICAgZGVmaW5lcyBtdXRhYmxlIG9iamVjdHMgYW5kIGltcGxlbWVudHMgYSBgYF9fY21wX18oKWBgIG9yXG4gICBgYF9fZXFfXygpYGAgbWV0aG9kLCBpdCBzaG91bGQgbm90IGltcGxlbWVudCBgYF9faGFzaF9fKClgYCwgc2luY2VcbiAgIGhhc2hhYmxlIGNvbGxlY3Rpb24gaW1wbGVtZW50YXRpb25zIHJlcXVpcmUgdGhhdCBhIG9iamVjdFwncyBoYXNoXG4gICB2YWx1ZSBpcyBpbW11dGFibGUgKGlmIHRoZSBvYmplY3RcJ3MgaGFzaCB2YWx1ZSBjaGFuZ2VzLCBpdCB3aWxsIGJlXG4gICBpbiB0aGUgd3JvbmcgaGFzaCBidWNrZXQpLlxuXG4gICBVc2VyLWRlZmluZWQgY2xhc3NlcyBoYXZlIGBgX19jbXBfXygpYGAgYW5kIGBgX19oYXNoX18oKWBgIG1ldGhvZHNcbiAgIGJ5IGRlZmF1bHQ7IHdpdGggdGhlbSwgYWxsIG9iamVjdHMgY29tcGFyZSB1bmVxdWFsIChleGNlcHQgd2l0aFxuICAgdGhlbXNlbHZlcykgYW5kIGBgeC5fX2hhc2hfXygpYGAgcmV0dXJucyBhIHJlc3VsdCBkZXJpdmVkIGZyb21cbiAgIGBgaWQoeClgYC5cblxuICAgQ2xhc3NlcyB3aGljaCBpbmhlcml0IGEgYGBfX2hhc2hfXygpYGAgbWV0aG9kIGZyb20gYSBwYXJlbnQgY2xhc3NcbiAgIGJ1dCBjaGFuZ2UgdGhlIG1lYW5pbmcgb2YgYGBfX2NtcF9fKClgYCBvciBgYF9fZXFfXygpYGAgc3VjaCB0aGF0XG4gICB0aGUgaGFzaCB2YWx1ZSByZXR1cm5lZCBpcyBubyBsb25nZXIgYXBwcm9wcmlhdGUgKGUuZy4gYnkgc3dpdGNoaW5nXG4gICB0byBhIHZhbHVlLWJhc2VkIGNvbmNlcHQgb2YgZXF1YWxpdHkgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdFxuICAgaWRlbnRpdHkgYmFzZWQgZXF1YWxpdHkpIGNhbiBleHBsaWNpdGx5IGZsYWcgdGhlbXNlbHZlcyBhcyBiZWluZ1xuICAgdW5oYXNoYWJsZSBieSBzZXR0aW5nIGBgX19oYXNoX18gPSBOb25lYGAgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24uXG4gICBEb2luZyBzbyBtZWFucyB0aGF0IG5vdCBvbmx5IHdpbGwgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcyByYWlzZSBhblxuICAgYXBwcm9wcmlhdGUgYGBUeXBlRXJyb3JgYCB3aGVuIGEgcHJvZ3JhbSBhdHRlbXB0cyB0byByZXRyaWV2ZSB0aGVpclxuICAgaGFzaCB2YWx1ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIGJlIGNvcnJlY3RseSBpZGVudGlmaWVkIGFzXG4gICB1bmhhc2hhYmxlIHdoZW4gY2hlY2tpbmcgYGBpc2luc3RhbmNlKG9iaiwgY29sbGVjdGlvbnMuSGFzaGFibGUpYGBcbiAgICh1bmxpa2UgY2xhc3NlcyB3aGljaCBkZWZpbmUgdGhlaXIgb3duIGBgX19oYXNoX18oKWBgIHRvIGV4cGxpY2l0bHlcbiAgIHJhaXNlIGBgVHlwZUVycm9yYGApLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi41OiBgYF9faGFzaF9fKClgYCBtYXkgbm93IGFsc28gcmV0dXJuIGEgbG9uZ1xuICAgaW50ZWdlciBvYmplY3Q7IHRoZSAzMi1iaXQgaW50ZWdlciBpcyB0aGVuIGRlcml2ZWQgZnJvbSB0aGUgaGFzaCBvZlxuICAgdGhhdCBvYmplY3QuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjY6IGBgX19oYXNoX19gYCBtYXkgbm93IGJlIHNldCB0byBgYE5vbmVgYCB0b1xuICAgZXhwbGljaXRseSBmbGFnIGluc3RhbmNlcyBvZiBhIGNsYXNzIGFzIHVuaGFzaGFibGUuXG5cbm9iamVjdC5fX25vbnplcm9fXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IHRydXRoIHZhbHVlIHRlc3RpbmcgYW5kIHRoZSBidWlsdC1pbiBvcGVyYXRpb25cbiAgIGBgYm9vbCgpYGA7IHNob3VsZCByZXR1cm4gYGBGYWxzZWBgIG9yIGBgVHJ1ZWBgLCBvciB0aGVpciBpbnRlZ2VyXG4gICBlcXVpdmFsZW50cyBgYDBgYCBvciBgYDFgYC4gIFdoZW4gdGhpcyBtZXRob2QgaXMgbm90IGRlZmluZWQsXG4gICBgYF9fbGVuX18oKWBgIGlzIGNhbGxlZCwgaWYgaXQgaXMgZGVmaW5lZCwgYW5kIHRoZSBvYmplY3QgaXNcbiAgIGNvbnNpZGVyZWQgdHJ1ZSBpZiBpdHMgcmVzdWx0IGlzIG5vbnplcm8uIElmIGEgY2xhc3MgZGVmaW5lc1xuICAgbmVpdGhlciBgYF9fbGVuX18oKWBgIG5vciBgYF9fbm9uemVyb19fKClgYCwgYWxsIGl0cyBpbnN0YW5jZXMgYXJlXG4gICBjb25zaWRlcmVkIHRydWUuXG5cbm9iamVjdC5fX3VuaWNvZGVfXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IGBgdW5pY29kZSgpYGAgYnVpbHQtaW47IHNob3VsZCByZXR1cm4gYSBVbmljb2RlXG4gICBvYmplY3QuIFdoZW4gdGhpcyBtZXRob2QgaXMgbm90IGRlZmluZWQsIHN0cmluZyBjb252ZXJzaW9uIGlzXG4gICBhdHRlbXB0ZWQsIGFuZCB0aGUgcmVzdWx0IG9mIHN0cmluZyBjb252ZXJzaW9uIGlzIGNvbnZlcnRlZCB0b1xuICAgVW5pY29kZSB1c2luZyB0aGUgc3lzdGVtIGRlZmF1bHQgZW5jb2RpbmcuXG4nLAorICdkZWJ1Z2dlcic6ICdcbmBgcGRiYGAgLS0tIFRoZSBQeXRob24gRGVidWdnZXJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuVGhlIG1vZHVsZSBgYHBkYmBgIGRlZmluZXMgYW4gaW50ZXJhY3RpdmUgc291cmNlIGNvZGUgZGVidWdnZXIgZm9yXG5QeXRob24gcHJvZ3JhbXMuICBJdCBzdXBwb3J0cyBzZXR0aW5nIChjb25kaXRpb25hbCkgYnJlYWtwb2ludHMgYW5kXG5zaW5nbGUgc3RlcHBpbmcgYXQgdGhlIHNvdXJjZSBsaW5lIGxldmVsLCBpbnNwZWN0aW9uIG9mIHN0YWNrIGZyYW1lcyxcbnNvdXJjZSBjb2RlIGxpc3RpbmcsIGFuZCBldmFsdWF0aW9uIG9mIGFyYml0cmFyeSBQeXRob24gY29kZSBpbiB0aGVcbmNvbnRleHQgb2YgYW55IHN0YWNrIGZyYW1lLiAgSXQgYWxzbyBzdXBwb3J0cyBwb3N0LW1vcnRlbSBkZWJ1Z2dpbmdcbmFuZCBjYW4gYmUgY2FsbGVkIHVuZGVyIHByb2dyYW0gY29udHJvbC5cblxuVGhlIGRlYnVnZ2VyIGlzIGV4dGVuc2libGUgLS0tIGl0IGlzIGFjdHVhbGx5IGRlZmluZWQgYXMgdGhlIGNsYXNzXG5gYFBkYmBgLiBUaGlzIGlzIGN1cnJlbnRseSB1bmRvY3VtZW50ZWQgYnV0IGVhc2lseSB1bmRlcnN0b29kIGJ5XG5yZWFkaW5nIHRoZSBzb3VyY2UuICBUaGUgZXh0ZW5zaW9uIGludGVyZmFjZSB1c2VzIHRoZSBtb2R1bGVzIGBgYmRiYGBcbmFuZCBgYGNtZGBgLlxuXG5UaGUgZGVidWdnZXJcJ3MgcHJvbXB0IGlzIGBgKFBkYilgYC4gVHlwaWNhbCB1c2FnZSB0byBydW4gYSBwcm9ncmFtXG51bmRlciBjb250cm9sIG9mIHRoZSBkZWJ1Z2dlciBpczpcblxuICAgPj4+IGltcG9ydCBwZGJcbiAgID4+PiBpbXBvcnQgbXltb2R1bGVcbiAgID4+PiBwZGIucnVuKFwnbXltb2R1bGUudGVzdCgpXCcpXG4gICA+IDxzdHJpbmc+KDApPygpXG4gICAoUGRiKSBjb250aW51ZVxuICAgPiA8c3RyaW5nPigxKT8oKVxuICAgKFBkYikgY29udGludWVcbiAgIE5hbWVFcnJvcjogXCdzcGFtXCdcbiAgID4gPHN0cmluZz4oMSk/KClcbiAgIChQZGIpXG5cbmBgcGRiLnB5YGAgY2FuIGFsc28gYmUgaW52b2tlZCBhcyBhIHNjcmlwdCB0byBkZWJ1ZyBvdGhlciBzY3JpcHRzLlxuRm9yIGV4YW1wbGU6XG5cbiAgIHB5dGhvbiAtbSBwZGIgbXlzY3JpcHQucHlcblxuV2hlbiBpbnZva2VkIGFzIGEgc2NyaXB0LCBwZGIgd2lsbCBhdXRvbWF0aWNhbGx5IGVudGVyIHBvc3QtbW9ydGVtXG5kZWJ1Z2dpbmcgaWYgdGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQgZXhpdHMgYWJub3JtYWxseS4gQWZ0ZXIgcG9zdC1cbm1vcnRlbSBkZWJ1Z2dpbmcgKG9yIGFmdGVyIG5vcm1hbCBleGl0IG9mIHRoZSBwcm9ncmFtKSwgcGRiIHdpbGxcbnJlc3RhcnQgdGhlIHByb2dyYW0uIEF1dG9tYXRpYyByZXN0YXJ0aW5nIHByZXNlcnZlcyBwZGJcJ3Mgc3RhdGUgKHN1Y2hcbmFzIGJyZWFrcG9pbnRzKSBhbmQgaW4gbW9zdCBjYXNlcyBpcyBtb3JlIHVzZWZ1bCB0aGFuIHF1aXR0aW5nIHRoZVxuZGVidWdnZXIgdXBvbiBwcm9ncmFtXCdzIGV4aXQuXG5cbk5ldyBpbiB2ZXJzaW9uIDIuNDogUmVzdGFydGluZyBwb3N0LW1vcnRlbSBiZWhhdmlvciBhZGRlZC5cblxuVGhlIHR5cGljYWwgdXNhZ2UgdG8gYnJlYWsgaW50byB0aGUgZGVidWdnZXIgZnJvbSBhIHJ1bm5pbmcgcHJvZ3JhbSBpc1xudG8gaW5zZXJ0XG5cbiAgIGltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKVxuXG5hdCB0aGUgbG9jYXRpb24geW91IHdhbnQgdG8gYnJlYWsgaW50byB0aGUgZGVidWdnZXIuICBZb3UgY2FuIHRoZW5cbnN0ZXAgdGhyb3VnaCB0aGUgY29kZSBmb2xsb3dpbmcgdGhpcyBzdGF0ZW1lbnQsIGFuZCBjb250aW51ZSBydW5uaW5nXG53aXRob3V0IHRoZSBkZWJ1Z2dlciB1c2luZyB0aGUgYGBjYGAgY29tbWFuZC5cblxuVGhlIHR5cGljYWwgdXNhZ2UgdG8gaW5zcGVjdCBhIGNyYXNoZWQgcHJvZ3JhbSBpczpcblxuICAgPj4+IGltcG9ydCBwZGJcbiAgID4+PiBpbXBvcnQgbXltb2R1bGVcbiAgID4+PiBteW1vZHVsZS50ZXN0KClcbiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gP1xuICAgICBGaWxlICIuL215bW9kdWxlLnB5IiwgbGluZSA0LCBpbiB0ZXN0XG4gICAgICAgdGVzdDIoKVxuICAgICBGaWxlICIuL215bW9kdWxlLnB5IiwgbGluZSAzLCBpbiB0ZXN0MlxuICAgICAgIHByaW50IHNwYW1cbiAgIE5hbWVFcnJvcjogc3BhbVxuICAgPj4+IHBkYi5wbSgpXG4gICA+IC4vbXltb2R1bGUucHkoMyl0ZXN0MigpXG4gICAtPiBwcmludCBzcGFtXG4gICAoUGRiKVxuXG5UaGUgbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM7IGVhY2ggZW50ZXJzIHRoZSBkZWJ1Z2dlclxuaW4gYSBzbGlnaHRseSBkaWZmZXJlbnQgd2F5OlxuXG5wZGIucnVuKHN0YXRlbWVudFssIGdsb2JhbHNbLCBsb2NhbHNdXSlcblxuICAgRXhlY3V0ZSB0aGUgKnN0YXRlbWVudCogKGdpdmVuIGFzIGEgc3RyaW5nKSB1bmRlciBkZWJ1Z2dlciBjb250cm9sLlxuICAgVGhlIGRlYnVnZ2VyIHByb21wdCBhcHBlYXJzIGJlZm9yZSBhbnkgY29kZSBpcyBleGVjdXRlZDsgeW91IGNhblxuICAgc2V0IGJyZWFrcG9pbnRzIGFuZCB0eXBlIGBgY29udGludWVgYCwgb3IgeW91IGNhbiBzdGVwIHRocm91Z2ggdGhlXG4gICBzdGF0ZW1lbnQgdXNpbmcgYGBzdGVwYGAgb3IgYGBuZXh0YGAgKGFsbCB0aGVzZSBjb21tYW5kcyBhcmVcbiAgIGV4cGxhaW5lZCBiZWxvdykuICBUaGUgb3B0aW9uYWwgKmdsb2JhbHMqIGFuZCAqbG9jYWxzKiBhcmd1bWVudHNcbiAgIHNwZWNpZnkgdGhlIGVudmlyb25tZW50IGluIHdoaWNoIHRoZSBjb2RlIGlzIGV4ZWN1dGVkOyBieSBkZWZhdWx0XG4gICB0aGUgZGljdGlvbmFyeSBvZiB0aGUgbW9kdWxlIGBgX19tYWluX19gYCBpcyB1c2VkLiAgKFNlZSB0aGVcbiAgIGV4cGxhbmF0aW9uIG9mIHRoZSBgYGV4ZWNgYCBzdGF0ZW1lbnQgb3IgdGhlIGBgZXZhbCgpYGAgYnVpbHQtaW5cbiAgIGZ1bmN0aW9uLilcblxucGRiLnJ1bmV2YWwoZXhwcmVzc2lvblssIGdsb2JhbHNbLCBsb2NhbHNdXSlcblxuICAgRXZhbHVhdGUgdGhlICpleHByZXNzaW9uKiAoZ2l2ZW4gYXMgYSBzdHJpbmcpIHVuZGVyIGRlYnVnZ2VyXG4gICBjb250cm9sLiAgV2hlbiBgYHJ1bmV2YWwoKWBgIHJldHVybnMsIGl0IHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZVxuICAgZXhwcmVzc2lvbi4gIE90aGVyd2lzZSB0aGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gYGBydW4oKWBgLlxuXG5wZGIucnVuY2FsbChmdW5jdGlvblssIGFyZ3VtZW50LCAuLi5dKVxuXG4gICBDYWxsIHRoZSAqZnVuY3Rpb24qIChhIGZ1bmN0aW9uIG9yIG1ldGhvZCBvYmplY3QsIG5vdCBhIHN0cmluZylcbiAgIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gIFdoZW4gYGBydW5jYWxsKClgYCByZXR1cm5zLCBpdCByZXR1cm5zXG4gICB3aGF0ZXZlciB0aGUgZnVuY3Rpb24gY2FsbCByZXR1cm5lZC4gIFRoZSBkZWJ1Z2dlciBwcm9tcHQgYXBwZWFyc1xuICAgYXMgc29vbiBhcyB0aGUgZnVuY3Rpb24gaXMgZW50ZXJlZC5cblxucGRiLnNldF90cmFjZSgpXG5cbiAgIEVudGVyIHRoZSBkZWJ1Z2dlciBhdCB0aGUgY2FsbGluZyBzdGFjayBmcmFtZS4gIFRoaXMgaXMgdXNlZnVsIHRvXG4gICBoYXJkLWNvZGUgYSBicmVha3BvaW50IGF0IGEgZ2l2ZW4gcG9pbnQgaW4gYSBwcm9ncmFtLCBldmVuIGlmIHRoZVxuICAgY29kZSBpcyBub3Qgb3RoZXJ3aXNlIGJlaW5nIGRlYnVnZ2VkIChlLmcuIHdoZW4gYW4gYXNzZXJ0aW9uXG4gICBmYWlscykuXG5cbnBkYi5wb3N0X21vcnRlbShbdHJhY2ViYWNrXSlcblxuICAgRW50ZXIgcG9zdC1tb3J0ZW0gZGVidWdnaW5nIG9mIHRoZSBnaXZlbiAqdHJhY2ViYWNrKiBvYmplY3QuICBJZiBub1xuICAgKnRyYWNlYmFjayogaXMgZ2l2ZW4sIGl0IHVzZXMgdGhlIG9uZSBvZiB0aGUgZXhjZXB0aW9uIHRoYXQgaXNcbiAgIGN1cnJlbnRseSBiZWluZyBoYW5kbGVkIChhbiBleGNlcHRpb24gbXVzdCBiZSBiZWluZyBoYW5kbGVkIGlmIHRoZVxuICAgZGVmYXVsdCBpcyB0byBiZSB1c2VkKS5cblxucGRiLnBtKClcblxuICAgRW50ZXIgcG9zdC1tb3J0ZW0gZGVidWdnaW5nIG9mIHRoZSB0cmFjZWJhY2sgZm91bmQgaW5cbiAgIGBgc3lzLmxhc3RfdHJhY2ViYWNrYGAuXG5cblRoZSBgYHJ1bipgYCBmdW5jdGlvbnMgYW5kIGBgc2V0X3RyYWNlKClgYCBhcmUgYWxpYXNlcyBmb3Jcbmluc3RhbnRpYXRpbmcgdGhlIGBgUGRiYGAgY2xhc3MgYW5kIGNhbGxpbmcgdGhlIG1ldGhvZCBvZiB0aGUgc2FtZVxubmFtZS4gIElmIHlvdSB3YW50IHRvIGFjY2VzcyBmdXJ0aGVyIGZlYXR1cmVzLCB5b3UgaGF2ZSB0byBkbyB0aGlzXG55b3Vyc2VsZjpcblxuY2xhc3MgY2xhc3MgcGRiLlBkYihjb21wbGV0ZWtleT1cJ3RhYlwnLCBzdGRpbj1Ob25lLCBzdGRvdXQ9Tm9uZSwgc2tpcD1Ob25lKVxuXG4gICBgYFBkYmBgIGlzIHRoZSBkZWJ1Z2dlciBjbGFzcy5cblxuICAgVGhlICpjb21wbGV0ZWtleSosICpzdGRpbiogYW5kICpzdGRvdXQqIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIHRoZVxuICAgdW5kZXJseWluZyBgYGNtZC5DbWRgYCBjbGFzczsgc2VlIHRoZSBkZXNjcmlwdGlvbiB0aGVyZS5cblxuICAgVGhlICpza2lwKiBhcmd1bWVudCwgaWYgZ2l2ZW4sIG11c3QgYmUgYW4gaXRlcmFibGUgb2YgZ2xvYi1zdHlsZVxuICAgbW9kdWxlIG5hbWUgcGF0dGVybnMuICBUaGUgZGVidWdnZXIgd2lsbCBub3Qgc3RlcCBpbnRvIGZyYW1lcyB0aGF0XG4gICBvcmlnaW5hdGUgaW4gYSBtb2R1bGUgdGhhdCBtYXRjaGVzIG9uZSBvZiB0aGVzZSBwYXR0ZXJucy4gWzFdXG5cbiAgIEV4YW1wbGUgY2FsbCB0byBlbmFibGUgdHJhY2luZyB3aXRoICpza2lwKjpcblxuICAgICAgaW1wb3J0IHBkYjsgcGRiLlBkYihza2lwPVtcJ2RqYW5nby4qXCddKS5zZXRfdHJhY2UoKVxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjc6IFRoZSAqc2tpcCogYXJndW1lbnQuXG5cbiAgIHJ1bihzdGF0ZW1lbnRbLCBnbG9iYWxzWywgbG9jYWxzXV0pXG4gICBydW5ldmFsKGV4cHJlc3Npb25bLCBnbG9iYWxzWywgbG9jYWxzXV0pXG4gICBydW5jYWxsKGZ1bmN0aW9uWywgYXJndW1lbnQsIC4uLl0pXG4gICBzZXRfdHJhY2UoKVxuXG4gICAgICBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBmdW5jdGlvbnMgZXhwbGFpbmVkIGFib3ZlLlxuJywKKyAnZGVsJzogJ1xuVGhlIGBgZGVsYGAgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKipcblxuICAgZGVsX3N0bXQgOjo9ICJkZWwiIHRhcmdldF9saXN0XG5cbkRlbGV0aW9uIGlzIHJlY3Vyc2l2ZWx5IGRlZmluZWQgdmVyeSBzaW1pbGFyIHRvIHRoZSB3YXkgYXNzaWdubWVudCBpc1xuZGVmaW5lZC4gUmF0aGVyIHRoYW4gc3BlbGxpbmcgaXQgb3V0IGluIGZ1bGwgZGV0YWlscywgaGVyZSBhcmUgc29tZVxuaGludHMuXG5cbkRlbGV0aW9uIG9mIGEgdGFyZ2V0IGxpc3QgcmVjdXJzaXZlbHkgZGVsZXRlcyBlYWNoIHRhcmdldCwgZnJvbSBsZWZ0XG50byByaWdodC5cblxuRGVsZXRpb24gb2YgYSBuYW1lIHJlbW92ZXMgdGhlIGJpbmRpbmcgb2YgdGhhdCBuYW1lICBmcm9tIHRoZSBsb2NhbCBvclxuZ2xvYmFsIG5hbWVzcGFjZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIG5hbWUgb2NjdXJzIGluIGEgYGBnbG9iYWxgYFxuc3RhdGVtZW50IGluIHRoZSBzYW1lIGNvZGUgYmxvY2suICBJZiB0aGUgbmFtZSBpcyB1bmJvdW5kLCBhXG5gYE5hbWVFcnJvcmBgIGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZC5cblxuSXQgaXMgaWxsZWdhbCB0byBkZWxldGUgYSBuYW1lIGZyb20gdGhlIGxvY2FsIG5hbWVzcGFjZSBpZiBpdCBvY2N1cnNcbmFzIGEgZnJlZSB2YXJpYWJsZSBpbiBhIG5lc3RlZCBibG9jay5cblxuRGVsZXRpb24gb2YgYXR0cmlidXRlIHJlZmVyZW5jZXMsIHN1YnNjcmlwdGlvbnMgYW5kIHNsaWNpbmdzIGlzIHBhc3NlZFxudG8gdGhlIHByaW1hcnkgb2JqZWN0IGludm9sdmVkOyBkZWxldGlvbiBvZiBhIHNsaWNpbmcgaXMgaW4gZ2VuZXJhbFxuZXF1aXZhbGVudCB0byBhc3NpZ25tZW50IG9mIGFuIGVtcHR5IHNsaWNlIG9mIHRoZSByaWdodCB0eXBlIChidXQgZXZlblxudGhpcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBzbGljZWQgb2JqZWN0KS5cbicsCisgJ2RpY3QnOiAnXG5EaWN0aW9uYXJ5IGRpc3BsYXlzXG4qKioqKioqKioqKioqKioqKioqXG5cbkEgZGljdGlvbmFyeSBkaXNwbGF5IGlzIGEgcG9zc2libHkgZW1wdHkgc2VyaWVzIG9mIGtleS9kYXR1bSBwYWlyc1xuZW5jbG9zZWQgaW4gY3VybHkgYnJhY2VzOlxuXG4gICBkaWN0X2Rpc3BsYXkgICAgICAgOjo9ICJ7IiBba2V5X2RhdHVtX2xpc3QgfCBkaWN0X2NvbXByZWhlbnNpb25dICJ9IlxuICAga2V5X2RhdHVtX2xpc3QgICAgIDo6PSBrZXlfZGF0dW0gKCIsIiBrZXlfZGF0dW0pKiBbIiwiXVxuICAga2V5X2RhdHVtICAgICAgICAgIDo6PSBleHByZXNzaW9uICI6IiBleHByZXNzaW9uXG4gICBkaWN0X2NvbXByZWhlbnNpb24gOjo9IGV4cHJlc3Npb24gIjoiIGV4cHJlc3Npb24gY29tcF9mb3JcblxuQSBkaWN0aW9uYXJ5IGRpc3BsYXkgeWllbGRzIGEgbmV3IGRpY3Rpb25hcnkgb2JqZWN0LlxuXG5JZiBhIGNvbW1hLXNlcGFyYXRlZCBzZXF1ZW5jZSBvZiBrZXkvZGF0dW0gcGFpcnMgaXMgZ2l2ZW4sIHRoZXkgYXJlXG5ldmFsdWF0ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0IHRvIGRlZmluZSB0aGUgZW50cmllcyBvZiB0aGUgZGljdGlvbmFyeTpcbmVhY2gga2V5IG9iamVjdCBpcyB1c2VkIGFzIGEga2V5IGludG8gdGhlIGRpY3Rpb25hcnkgdG8gc3RvcmUgdGhlXG5jb3JyZXNwb25kaW5nIGRhdHVtLiAgVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gc3BlY2lmeSB0aGUgc2FtZSBrZXlcbm11bHRpcGxlIHRpbWVzIGluIHRoZSBrZXkvZGF0dW0gbGlzdCwgYW5kIHRoZSBmaW5hbCBkaWN0aW9uYXJ5XCdzIHZhbHVlXG5mb3IgdGhhdCBrZXkgd2lsbCBiZSB0aGUgbGFzdCBvbmUgZ2l2ZW4uXG5cbkEgZGljdCBjb21wcmVoZW5zaW9uLCBpbiBjb250cmFzdCB0byBsaXN0IGFuZCBzZXQgY29tcHJlaGVuc2lvbnMsXG5uZWVkcyB0d28gZXhwcmVzc2lvbnMgc2VwYXJhdGVkIHdpdGggYSBjb2xvbiBmb2xsb3dlZCBieSB0aGUgdXN1YWxcbiJmb3IiIGFuZCAiaWYiIGNsYXVzZXMuIFdoZW4gdGhlIGNvbXByZWhlbnNpb24gaXMgcnVuLCB0aGUgcmVzdWx0aW5nXG5rZXkgYW5kIHZhbHVlIGVsZW1lbnRzIGFyZSBpbnNlcnRlZCBpbiB0aGUgbmV3IGRpY3Rpb25hcnkgaW4gdGhlIG9yZGVyXG50aGV5IGFyZSBwcm9kdWNlZC5cblxuUmVzdHJpY3Rpb25zIG9uIHRoZSB0eXBlcyBvZiB0aGUga2V5IHZhbHVlcyBhcmUgbGlzdGVkIGVhcmxpZXIgaW5cbnNlY3Rpb24gKlRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSouICAoVG8gc3VtbWFyaXplLCB0aGUga2V5IHR5cGVcbnNob3VsZCBiZSAqaGFzaGFibGUqLCB3aGljaCBleGNsdWRlcyBhbGwgbXV0YWJsZSBvYmplY3RzLikgIENsYXNoZXNcbmJldHdlZW4gZHVwbGljYXRlIGtleXMgYXJlIG5vdCBkZXRlY3RlZDsgdGhlIGxhc3QgZGF0dW0gKHRleHR1YWxseVxucmlnaHRtb3N0IGluIHRoZSBkaXNwbGF5KSBzdG9yZWQgZm9yIGEgZ2l2ZW4ga2V5IHZhbHVlIHByZXZhaWxzLlxuJywKKyAnZHluYW1pYy1mZWF0dXJlcyc6ICdcbkludGVyYWN0aW9uIHdpdGggZHluYW1pYyBmZWF0dXJlc1xuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cblRoZXJlIGFyZSBzZXZlcmFsIGNhc2VzIHdoZXJlIFB5dGhvbiBzdGF0ZW1lbnRzIGFyZSBpbGxlZ2FsIHdoZW4gdXNlZFxuaW4gY29uanVuY3Rpb24gd2l0aCBuZXN0ZWQgc2NvcGVzIHRoYXQgY29udGFpbiBmcmVlIHZhcmlhYmxlcy5cblxuSWYgYSB2YXJpYWJsZSBpcyByZWZlcmVuY2VkIGluIGFuIGVuY2xvc2luZyBzY29wZSwgaXQgaXMgaWxsZWdhbCB0b1xuZGVsZXRlIHRoZSBuYW1lLiAgQW4gZXJyb3Igd2lsbCBiZSByZXBvcnRlZCBhdCBjb21waWxlIHRpbWUuXG5cbklmIHRoZSB3aWxkIGNhcmQgZm9ybSBvZiBpbXBvcnQgLS0tIGBgaW1wb3J0ICpgYCAtLS0gaXMgdXNlZCBpbiBhXG5mdW5jdGlvbiBhbmQgdGhlIGZ1bmN0aW9uIGNvbnRhaW5zIG9yIGlzIGEgbmVzdGVkIGJsb2NrIHdpdGggZnJlZVxudmFyaWFibGVzLCB0aGUgY29tcGlsZXIgd2lsbCByYWlzZSBhIGBgU3ludGF4RXJyb3JgYC5cblxuSWYgYGBleGVjYGAgaXMgdXNlZCBpbiBhIGZ1bmN0aW9uIGFuZCB0aGUgZnVuY3Rpb24gY29udGFpbnMgb3IgaXMgYVxubmVzdGVkIGJsb2NrIHdpdGggZnJlZSB2YXJpYWJsZXMsIHRoZSBjb21waWxlciB3aWxsIHJhaXNlIGFcbmBgU3ludGF4RXJyb3JgYCB1bmxlc3MgdGhlIGV4ZWMgZXhwbGljaXRseSBzcGVjaWZpZXMgdGhlIGxvY2FsXG5uYW1lc3BhY2UgZm9yIHRoZSBgYGV4ZWNgYC4gIChJbiBvdGhlciB3b3JkcywgYGBleGVjIG9iamBgIHdvdWxkIGJlXG5pbGxlZ2FsLCBidXQgYGBleGVjIG9iaiBpbiBuc2BgIHdvdWxkIGJlIGxlZ2FsLilcblxuVGhlIGBgZXZhbCgpYGAsIGBgZXhlY2ZpbGUoKWBgLCBhbmQgYGBpbnB1dCgpYGAgZnVuY3Rpb25zIGFuZCB0aGVcbmBgZXhlY2BgIHN0YXRlbWVudCBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGZ1bGwgZW52aXJvbm1lbnQgZm9yXG5yZXNvbHZpbmcgbmFtZXMuICBOYW1lcyBtYXkgYmUgcmVzb2x2ZWQgaW4gdGhlIGxvY2FsIGFuZCBnbG9iYWxcbm5hbWVzcGFjZXMgb2YgdGhlIGNhbGxlci4gIEZyZWUgdmFyaWFibGVzIGFyZSBub3QgcmVzb2x2ZWQgaW4gdGhlXG5uZWFyZXN0IGVuY2xvc2luZyBuYW1lc3BhY2UsIGJ1dCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gWzFdIFRoZVxuYGBleGVjYGAgc3RhdGVtZW50IGFuZCB0aGUgYGBldmFsKClgYCBhbmQgYGBleGVjZmlsZSgpYGAgZnVuY3Rpb25zXG5oYXZlIG9wdGlvbmFsIGFyZ3VtZW50cyB0byBvdmVycmlkZSB0aGUgZ2xvYmFsIGFuZCBsb2NhbCBuYW1lc3BhY2UuXG5JZiBvbmx5IG9uZSBuYW1lc3BhY2UgaXMgc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGZvciBib3RoLlxuJywKKyAnZWxzZSc6ICdcblRoZSBgYGlmYGAgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgYGBpZmBgIHN0YXRlbWVudCBpcyB1c2VkIGZvciBjb25kaXRpb25hbCBleGVjdXRpb246XG5cbiAgIGlmX3N0bXQgOjo9ICJpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICggImVsaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlICkqXG4gICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cblxuSXQgc2VsZWN0cyBleGFjdGx5IG9uZSBvZiB0aGUgc3VpdGVzIGJ5IGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb25zIG9uZVxuYnkgb25lIHVudGlsIG9uZSBpcyBmb3VuZCB0byBiZSB0cnVlIChzZWUgc2VjdGlvbiAqQm9vbGVhbiBvcGVyYXRpb25zKlxuZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRydWUgYW5kIGZhbHNlKTsgdGhlbiB0aGF0IHN1aXRlIGlzIGV4ZWN1dGVkXG4oYW5kIG5vIG90aGVyIHBhcnQgb2YgdGhlIGBgaWZgYCBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgb3IgZXZhbHVhdGVkKS5cbklmIGFsbCBleHByZXNzaW9ucyBhcmUgZmFsc2UsIHRoZSBzdWl0ZSBvZiB0aGUgYGBlbHNlYGAgY2xhdXNlLCBpZlxucHJlc2VudCwgaXMgZXhlY3V0ZWQuXG4nLAorICdleGNlcHRpb25zJzogJ1xuRXhjZXB0aW9uc1xuKioqKioqKioqKlxuXG5FeGNlcHRpb25zIGFyZSBhIG1lYW5zIG9mIGJyZWFraW5nIG91dCBvZiB0aGUgbm9ybWFsIGZsb3cgb2YgY29udHJvbFxub2YgYSBjb2RlIGJsb2NrIGluIG9yZGVyIHRvIGhhbmRsZSBlcnJvcnMgb3Igb3RoZXIgZXhjZXB0aW9uYWxcbmNvbmRpdGlvbnMuICBBbiBleGNlcHRpb24gaXMgKnJhaXNlZCogYXQgdGhlIHBvaW50IHdoZXJlIHRoZSBlcnJvciBpc1xuZGV0ZWN0ZWQ7IGl0IG1heSBiZSAqaGFuZGxlZCogYnkgdGhlIHN1cnJvdW5kaW5nIGNvZGUgYmxvY2sgb3IgYnkgYW55XG5jb2RlIGJsb2NrIHRoYXQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbnZva2VkIHRoZSBjb2RlIGJsb2NrIHdoZXJlXG50aGUgZXJyb3Igb2NjdXJyZWQuXG5cblRoZSBQeXRob24gaW50ZXJwcmV0ZXIgcmFpc2VzIGFuIGV4Y2VwdGlvbiB3aGVuIGl0IGRldGVjdHMgYSBydW4tdGltZVxuZXJyb3IgKHN1Y2ggYXMgZGl2aXNpb24gYnkgemVybykuICBBIFB5dGhvbiBwcm9ncmFtIGNhbiBhbHNvXG5leHBsaWNpdGx5IHJhaXNlIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBgYHJhaXNlYGAgc3RhdGVtZW50LiBFeGNlcHRpb25cbmhhbmRsZXJzIGFyZSBzcGVjaWZpZWQgd2l0aCB0aGUgYGB0cnlgYCAuLi4gYGBleGNlcHRgYCBzdGF0ZW1lbnQuICBUaGVcbmBgZmluYWxseWBgIGNsYXVzZSBvZiBzdWNoIGEgc3RhdGVtZW50IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgY2xlYW51cFxuY29kZSB3aGljaCBkb2VzIG5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbiwgYnV0IGlzIGV4ZWN1dGVkIHdoZXRoZXIgYW5cbmV4Y2VwdGlvbiBvY2N1cnJlZCBvciBub3QgaW4gdGhlIHByZWNlZGluZyBjb2RlLlxuXG5QeXRob24gdXNlcyB0aGUgInRlcm1pbmF0aW9uIiBtb2RlbCBvZiBlcnJvciBoYW5kbGluZzogYW4gZXhjZXB0aW9uXG5oYW5kbGVyIGNhbiBmaW5kIG91dCB3aGF0IGhhcHBlbmVkIGFuZCBjb250aW51ZSBleGVjdXRpb24gYXQgYW4gb3V0ZXJcbmxldmVsLCBidXQgaXQgY2Fubm90IHJlcGFpciB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yIGFuZCByZXRyeSB0aGVcbmZhaWxpbmcgb3BlcmF0aW9uIChleGNlcHQgYnkgcmUtZW50ZXJpbmcgdGhlIG9mZmVuZGluZyBwaWVjZSBvZiBjb2RlXG5mcm9tIHRoZSB0b3ApLlxuXG5XaGVuIGFuIGV4Y2VwdGlvbiBpcyBub3QgaGFuZGxlZCBhdCBhbGwsIHRoZSBpbnRlcnByZXRlciB0ZXJtaW5hdGVzXG5leGVjdXRpb24gb2YgdGhlIHByb2dyYW0sIG9yIHJldHVybnMgdG8gaXRzIGludGVyYWN0aXZlIG1haW4gbG9vcC4gIEluXG5laXRoZXIgY2FzZSwgaXQgcHJpbnRzIGEgc3RhY2sgYmFja3RyYWNlLCBleGNlcHQgd2hlbiB0aGUgZXhjZXB0aW9uIGlzXG5gYFN5c3RlbUV4aXRgYC5cblxuRXhjZXB0aW9ucyBhcmUgaWRlbnRpZmllZCBieSBjbGFzcyBpbnN0YW5jZXMuICBUaGUgYGBleGNlcHRgYCBjbGF1c2VcbmlzIHNlbGVjdGVkIGRlcGVuZGluZyBvbiB0aGUgY2xhc3Mgb2YgdGhlIGluc3RhbmNlOiBpdCBtdXN0IHJlZmVyZW5jZVxudGhlIGNsYXNzIG9mIHRoZSBpbnN0YW5jZSBvciBhIGJhc2UgY2xhc3MgdGhlcmVvZi4gIFRoZSBpbnN0YW5jZSBjYW5cbmJlIHJlY2VpdmVkIGJ5IHRoZSBoYW5kbGVyIGFuZCBjYW4gY2FycnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dFxudGhlIGV4Y2VwdGlvbmFsIGNvbmRpdGlvbi5cblxuRXhjZXB0aW9ucyBjYW4gYWxzbyBiZSBpZGVudGlmaWVkIGJ5IHN0cmluZ3MsIGluIHdoaWNoIGNhc2UgdGhlXG5gYGV4Y2VwdGBgIGNsYXVzZSBpcyBzZWxlY3RlZCBieSBvYmplY3QgaWRlbnRpdHkuICBBbiBhcmJpdHJhcnkgdmFsdWVcbmNhbiBiZSByYWlzZWQgYWxvbmcgd2l0aCB0aGUgaWRlbnRpZnlpbmcgc3RyaW5nIHdoaWNoIGNhbiBiZSBwYXNzZWQgdG9cbnRoZSBoYW5kbGVyLlxuXG5Ob3RlOiBNZXNzYWdlcyB0byBleGNlcHRpb25zIGFyZSBub3QgcGFydCBvZiB0aGUgUHl0aG9uIEFQSS4gIFRoZWlyXG4gIGNvbnRlbnRzIG1heSBjaGFuZ2UgZnJvbSBvbmUgdmVyc2lvbiBvZiBQeXRob24gdG8gdGhlIG5leHQgd2l0aG91dFxuICB3YXJuaW5nIGFuZCBzaG91bGQgbm90IGJlIHJlbGllZCBvbiBieSBjb2RlIHdoaWNoIHdpbGwgcnVuIHVuZGVyXG4gIG11bHRpcGxlIHZlcnNpb25zIG9mIHRoZSBpbnRlcnByZXRlci5cblxuU2VlIGFsc28gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBgYHRyeWBgIHN0YXRlbWVudCBpbiBzZWN0aW9uICpUaGUgdHJ5XG5zdGF0ZW1lbnQqIGFuZCBgYHJhaXNlYGAgc3RhdGVtZW50IGluIHNlY3Rpb24gKlRoZSByYWlzZSBzdGF0ZW1lbnQqLlxuXG4tWyBGb290bm90ZXMgXS1cblxuWzFdIFRoaXMgbGltaXRhdGlvbiBvY2N1cnMgYmVjYXVzZSB0aGUgY29kZSB0aGF0IGlzIGV4ZWN1dGVkIGJ5IHRoZXNlXG4gICAgb3BlcmF0aW9ucyBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSB0aW1lIHRoZSBtb2R1bGUgaXMgY29tcGlsZWQuXG4nLAorICdleGVjJzogJ1xuVGhlIGBgZXhlY2BgIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKlxuXG4gICBleGVjX3N0bXQgOjo9ICJleGVjIiBvcl9leHByIFsiaW4iIGV4cHJlc3Npb24gWyIsIiBleHByZXNzaW9uXV1cblxuVGhpcyBzdGF0ZW1lbnQgc3VwcG9ydHMgZHluYW1pYyBleGVjdXRpb24gb2YgUHl0aG9uIGNvZGUuICBUaGUgZmlyc3RcbmV4cHJlc3Npb24gc2hvdWxkIGV2YWx1YXRlIHRvIGVpdGhlciBhIFVuaWNvZGUgc3RyaW5nLCBhICpMYXRpbi0xKlxuZW5jb2RlZCBzdHJpbmcsIGFuIG9wZW4gZmlsZSBvYmplY3QsIGEgY29kZSBvYmplY3QsIG9yIGEgdHVwbGUuICBJZiBpdFxuaXMgYSBzdHJpbmcsIHRoZSBzdHJpbmcgaXMgcGFyc2VkIGFzIGEgc3VpdGUgb2YgUHl0aG9uIHN0YXRlbWVudHNcbndoaWNoIGlzIHRoZW4gZXhlY3V0ZWQgKHVubGVzcyBhIHN5bnRheCBlcnJvciBvY2N1cnMpLiBbMV0gSWYgaXQgaXMgYW5cbm9wZW4gZmlsZSwgdGhlIGZpbGUgaXMgcGFyc2VkIHVudGlsIEVPRiBhbmQgZXhlY3V0ZWQuIElmIGl0IGlzIGEgY29kZVxub2JqZWN0LCBpdCBpcyBzaW1wbHkgZXhlY3V0ZWQuICBGb3IgdGhlIGludGVycHJldGF0aW9uIG9mIGEgdHVwbGUsIHNlZVxuYmVsb3cuICBJbiBhbGwgY2FzZXMsIHRoZSBjb2RlIHRoYXRcJ3MgZXhlY3V0ZWQgaXMgZXhwZWN0ZWQgdG8gYmUgdmFsaWRcbmFzIGZpbGUgaW5wdXQgKHNlZSBzZWN0aW9uICpGaWxlIGlucHV0KikuICBCZSBhd2FyZSB0aGF0IHRoZVxuYGByZXR1cm5gYCBhbmQgYGB5aWVsZGBgIHN0YXRlbWVudHMgbWF5IG5vdCBiZSB1c2VkIG91dHNpZGUgb2ZcbmZ1bmN0aW9uIGRlZmluaXRpb25zIGV2ZW4gd2l0aGluIHRoZSBjb250ZXh0IG9mIGNvZGUgcGFzc2VkIHRvIHRoZVxuYGBleGVjYGAgc3RhdGVtZW50LlxuXG5JbiBhbGwgY2FzZXMsIGlmIHRoZSBvcHRpb25hbCBwYXJ0cyBhcmUgb21pdHRlZCwgdGhlIGNvZGUgaXMgZXhlY3V0ZWRcbmluIHRoZSBjdXJyZW50IHNjb3BlLiAgSWYgb25seSB0aGUgZmlyc3QgZXhwcmVzc2lvbiBhZnRlciBgYGluYGAgaXNcbnNwZWNpZmllZCwgaXQgc2hvdWxkIGJlIGEgZGljdGlvbmFyeSwgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciBib3RoIHRoZVxuZ2xvYmFsIGFuZCB0aGUgbG9jYWwgdmFyaWFibGVzLiAgSWYgdHdvIGV4cHJlc3Npb25zIGFyZSBnaXZlbiwgdGhleVxuYXJlIHVzZWQgZm9yIHRoZSBnbG9iYWwgYW5kIGxvY2FsIHZhcmlhYmxlcywgcmVzcGVjdGl2ZWx5LiBJZlxucHJvdmlkZWQsICpsb2NhbHMqIGNhbiBiZSBhbnkgbWFwcGluZyBvYmplY3QuIFJlbWVtYmVyIHRoYXQgYXQgbW9kdWxlXG5sZXZlbCwgZ2xvYmFscyBhbmQgbG9jYWxzIGFyZSB0aGUgc2FtZSBkaWN0aW9uYXJ5LiBJZiB0d28gc2VwYXJhdGVcbm9iamVjdHMgYXJlIGdpdmVuIGFzICpnbG9iYWxzKiBhbmQgKmxvY2FscyosIHRoZSBjb2RlIHdpbGwgYmUgZXhlY3V0ZWRcbmFzIGlmIGl0IHdlcmUgZW1iZWRkZWQgaW4gYSBjbGFzcyBkZWZpbml0aW9uLlxuXG5UaGUgZmlyc3QgZXhwcmVzc2lvbiBtYXkgYWxzbyBiZSBhIHR1cGxlIG9mIGxlbmd0aCAyIG9yIDMuICBJbiB0aGlzXG5jYXNlLCB0aGUgb3B0aW9uYWwgcGFydHMgbXVzdCBiZSBvbWl0dGVkLiAgVGhlIGZvcm0gYGBleGVjKGV4cHIsXG5nbG9iYWxzKWBgIGlzIGVxdWl2YWxlbnQgdG8gYGBleGVjIGV4cHIgaW4gZ2xvYmFsc2BgLCB3aGlsZSB0aGUgZm9ybVxuYGBleGVjKGV4cHIsIGdsb2JhbHMsIGxvY2FscylgYCBpcyBlcXVpdmFsZW50IHRvIGBgZXhlYyBleHByIGluXG5nbG9iYWxzLCBsb2NhbHNgYC4gIFRoZSB0dXBsZSBmb3JtIG9mIGBgZXhlY2BgIHByb3ZpZGVzIGNvbXBhdGliaWxpdHlcbndpdGggUHl0aG9uIDMsIHdoZXJlIGBgZXhlY2BgIGlzIGEgZnVuY3Rpb24gcmF0aGVyIHRoYW4gYSBzdGF0ZW1lbnQuXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAyLjQ6IEZvcm1lcmx5LCAqbG9jYWxzKiB3YXMgcmVxdWlyZWQgdG8gYmUgYVxuZGljdGlvbmFyeS5cblxuQXMgYSBzaWRlIGVmZmVjdCwgYW4gaW1wbGVtZW50YXRpb24gbWF5IGluc2VydCBhZGRpdGlvbmFsIGtleXMgaW50b1xudGhlIGRpY3Rpb25hcmllcyBnaXZlbiBiZXNpZGVzIHRob3NlIGNvcnJlc3BvbmRpbmcgdG8gdmFyaWFibGUgbmFtZXNcbnNldCBieSB0aGUgZXhlY3V0ZWQgY29kZS4gIEZvciBleGFtcGxlLCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBtYXlcbmFkZCBhIHJlZmVyZW5jZSB0byB0aGUgZGljdGlvbmFyeSBvZiB0aGUgYnVpbHQtaW4gbW9kdWxlXG5gYF9fYnVpbHRpbl9fYGAgdW5kZXIgdGhlIGtleSBgYF9fYnVpbHRpbnNfX2BgICghKS5cblxuKipQcm9ncmFtbWVyXCdzIGhpbnRzOioqIGR5bmFtaWMgZXZhbHVhdGlvbiBvZiBleHByZXNzaW9ucyBpcyBzdXBwb3J0ZWRcbmJ5IHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYGV2YWwoKWBgLiAgVGhlIGJ1aWx0LWluIGZ1bmN0aW9uc1xuYGBnbG9iYWxzKClgYCBhbmQgYGBsb2NhbHMoKWBgIHJldHVybiB0aGUgY3VycmVudCBnbG9iYWwgYW5kIGxvY2FsXG5kaWN0aW9uYXJ5LCByZXNwZWN0aXZlbHksIHdoaWNoIG1heSBiZSB1c2VmdWwgdG8gcGFzcyBhcm91bmQgZm9yIHVzZVxuYnkgYGBleGVjYGAuXG5cbi1bIEZvb3Rub3RlcyBdLVxuXG5bMV0gTm90ZSB0aGF0IHRoZSBwYXJzZXIgb25seSBhY2NlcHRzIHRoZSBVbml4LXN0eWxlIGVuZCBvZiBsaW5lXG4gICAgY29udmVudGlvbi4gSWYgeW91IGFyZSByZWFkaW5nIHRoZSBjb2RlIGZyb20gYSBmaWxlLCBtYWtlIHN1cmUgdG9cbiAgICB1c2UgKnVuaXZlcnNhbCBuZXdsaW5lcyogbW9kZSB0byBjb252ZXJ0IFdpbmRvd3Mgb3IgTWFjLXN0eWxlXG4gICAgbmV3bGluZXMuXG4nLAorICdleGVjbW9kZWwnOiAnXG5FeGVjdXRpb24gbW9kZWxcbioqKioqKioqKioqKioqKlxuXG5cbk5hbWluZyBhbmQgYmluZGluZ1xuPT09PT09PT09PT09PT09PT09XG5cbipOYW1lcyogcmVmZXIgdG8gb2JqZWN0cy4gIE5hbWVzIGFyZSBpbnRyb2R1Y2VkIGJ5IG5hbWUgYmluZGluZ1xub3BlcmF0aW9ucy4gRWFjaCBvY2N1cnJlbmNlIG9mIGEgbmFtZSBpbiB0aGUgcHJvZ3JhbSB0ZXh0IHJlZmVycyB0b1xudGhlICpiaW5kaW5nKiBvZiB0aGF0IG5hbWUgZXN0YWJsaXNoZWQgaW4gdGhlIGlubmVybW9zdCBmdW5jdGlvbiBibG9ja1xuY29udGFpbmluZyB0aGUgdXNlLlxuXG5BICpibG9jayogaXMgYSBwaWVjZSBvZiBQeXRob24gcHJvZ3JhbSB0ZXh0IHRoYXQgaXMgZXhlY3V0ZWQgYXMgYVxudW5pdC4gVGhlIGZvbGxvd2luZyBhcmUgYmxvY2tzOiBhIG1vZHVsZSwgYSBmdW5jdGlvbiBib2R5LCBhbmQgYSBjbGFzc1xuZGVmaW5pdGlvbi4gRWFjaCBjb21tYW5kIHR5cGVkIGludGVyYWN0aXZlbHkgaXMgYSBibG9jay4gIEEgc2NyaXB0XG5maWxlIChhIGZpbGUgZ2l2ZW4gYXMgc3RhbmRhcmQgaW5wdXQgdG8gdGhlIGludGVycHJldGVyIG9yIHNwZWNpZmllZFxub24gdGhlIGludGVycHJldGVyIGNvbW1hbmQgbGluZSB0aGUgZmlyc3QgYXJndW1lbnQpIGlzIGEgY29kZSBibG9jay5cbkEgc2NyaXB0IGNvbW1hbmQgKGEgY29tbWFuZCBzcGVjaWZpZWQgb24gdGhlIGludGVycHJldGVyIGNvbW1hbmQgbGluZVxud2l0aCB0aGUgXCcqKi1jKipcJyBvcHRpb24pIGlzIGEgY29kZSBibG9jay4gIFRoZSBmaWxlIHJlYWQgYnkgdGhlXG5idWlsdC1pbiBmdW5jdGlvbiBgYGV4ZWNmaWxlKClgYCBpcyBhIGNvZGUgYmxvY2suICBUaGUgc3RyaW5nIGFyZ3VtZW50XG5wYXNzZWQgdG8gdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGBgZXZhbCgpYGAgYW5kIHRvIHRoZSBgYGV4ZWNgYFxuc3RhdGVtZW50IGlzIGEgY29kZSBibG9jay4gVGhlIGV4cHJlc3Npb24gcmVhZCBhbmQgZXZhbHVhdGVkIGJ5IHRoZVxuYnVpbHQtaW4gZnVuY3Rpb24gYGBpbnB1dCgpYGAgaXMgYSBjb2RlIGJsb2NrLlxuXG5BIGNvZGUgYmxvY2sgaXMgZXhlY3V0ZWQgaW4gYW4gKmV4ZWN1dGlvbiBmcmFtZSouICBBIGZyYW1lIGNvbnRhaW5zXG5zb21lIGFkbWluaXN0cmF0aXZlIGluZm9ybWF0aW9uICh1c2VkIGZvciBkZWJ1Z2dpbmcpIGFuZCBkZXRlcm1pbmVzXG53aGVyZSBhbmQgaG93IGV4ZWN1dGlvbiBjb250aW51ZXMgYWZ0ZXIgdGhlIGNvZGUgYmxvY2tcJ3MgZXhlY3V0aW9uIGhhc1xuY29tcGxldGVkLlxuXG5BICpzY29wZSogZGVmaW5lcyB0aGUgdmlzaWJpbGl0eSBvZiBhIG5hbWUgd2l0aGluIGEgYmxvY2suICBJZiBhIGxvY2FsXG52YXJpYWJsZSBpcyBkZWZpbmVkIGluIGEgYmxvY2ssIGl0cyBzY29wZSBpbmNsdWRlcyB0aGF0IGJsb2NrLiAgSWYgdGhlXG5kZWZpbml0aW9uIG9jY3VycyBpbiBhIGZ1bmN0aW9uIGJsb2NrLCB0aGUgc2NvcGUgZXh0ZW5kcyB0byBhbnkgYmxvY2tzXG5jb250YWluZWQgd2l0aGluIHRoZSBkZWZpbmluZyBvbmUsIHVubGVzcyBhIGNvbnRhaW5lZCBibG9jayBpbnRyb2R1Y2VzXG5hIGRpZmZlcmVudCBiaW5kaW5nIGZvciB0aGUgbmFtZS4gIFRoZSBzY29wZSBvZiBuYW1lcyBkZWZpbmVkIGluIGFcbmNsYXNzIGJsb2NrIGlzIGxpbWl0ZWQgdG8gdGhlIGNsYXNzIGJsb2NrOyBpdCBkb2VzIG5vdCBleHRlbmQgdG8gdGhlXG5jb2RlIGJsb2NrcyBvZiBtZXRob2RzIC0tIHRoaXMgaW5jbHVkZXMgZ2VuZXJhdG9yIGV4cHJlc3Npb25zIHNpbmNlXG50aGV5IGFyZSBpbXBsZW1lbnRlZCB1c2luZyBhIGZ1bmN0aW9uIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IHRoZVxuZm9sbG93aW5nIHdpbGwgZmFpbDpcblxuICAgY2xhc3MgQTpcbiAgICAgICBhID0gNDJcbiAgICAgICBiID0gbGlzdChhICsgaSBmb3IgaSBpbiByYW5nZSgxMCkpXG5cbldoZW4gYSBuYW1lIGlzIHVzZWQgaW4gYSBjb2RlIGJsb2NrLCBpdCBpcyByZXNvbHZlZCB1c2luZyB0aGUgbmVhcmVzdFxuZW5jbG9zaW5nIHNjb3BlLiAgVGhlIHNldCBvZiBhbGwgc3VjaCBzY29wZXMgdmlzaWJsZSB0byBhIGNvZGUgYmxvY2tcbmlzIGNhbGxlZCB0aGUgYmxvY2tcJ3MgKmVudmlyb25tZW50Ki5cblxuSWYgYSBuYW1lIGlzIGJvdW5kIGluIGEgYmxvY2ssIGl0IGlzIGEgbG9jYWwgdmFyaWFibGUgb2YgdGhhdCBibG9jay5cbklmIGEgbmFtZSBpcyBib3VuZCBhdCB0aGUgbW9kdWxlIGxldmVsLCBpdCBpcyBhIGdsb2JhbCB2YXJpYWJsZS4gIChUaGVcbnZhcmlhYmxlcyBvZiB0aGUgbW9kdWxlIGNvZGUgYmxvY2sgYXJlIGxvY2FsIGFuZCBnbG9iYWwuKSAgSWYgYVxudmFyaWFibGUgaXMgdXNlZCBpbiBhIGNvZGUgYmxvY2sgYnV0IG5vdCBkZWZpbmVkIHRoZXJlLCBpdCBpcyBhICpmcmVlXG52YXJpYWJsZSouXG5cbldoZW4gYSBuYW1lIGlzIG5vdCBmb3VuZCBhdCBhbGwsIGEgYGBOYW1lRXJyb3JgYCBleGNlcHRpb24gaXMgcmFpc2VkLlxuSWYgdGhlIG5hbWUgcmVmZXJzIHRvIGEgbG9jYWwgdmFyaWFibGUgdGhhdCBoYXMgbm90IGJlZW4gYm91bmQsIGFcbmBgVW5ib3VuZExvY2FsRXJyb3JgYCBleGNlcHRpb24gaXMgcmFpc2VkLiAgYGBVbmJvdW5kTG9jYWxFcnJvcmBgIGlzIGFcbnN1YmNsYXNzIG9mIGBgTmFtZUVycm9yYGAuXG5cblRoZSBmb2xsb3dpbmcgY29uc3RydWN0cyBiaW5kIG5hbWVzOiBmb3JtYWwgcGFyYW1ldGVycyB0byBmdW5jdGlvbnMsXG5gYGltcG9ydGBgIHN0YXRlbWVudHMsIGNsYXNzIGFuZCBmdW5jdGlvbiBkZWZpbml0aW9ucyAodGhlc2UgYmluZCB0aGVcbmNsYXNzIG9yIGZ1bmN0aW9uIG5hbWUgaW4gdGhlIGRlZmluaW5nIGJsb2NrKSwgYW5kIHRhcmdldHMgdGhhdCBhcmVcbmlkZW50aWZpZXJzIGlmIG9jY3VycmluZyBpbiBhbiBhc3NpZ25tZW50LCBgYGZvcmBgIGxvb3AgaGVhZGVyLCBpbiB0aGVcbnNlY29uZCBwb3NpdGlvbiBvZiBhbiBgYGV4Y2VwdGBgIGNsYXVzZSBoZWFkZXIgb3IgYWZ0ZXIgYGBhc2BgIGluIGFcbmBgd2l0aGBgIHN0YXRlbWVudC4gIFRoZSBgYGltcG9ydGBgIHN0YXRlbWVudCBvZiB0aGUgZm9ybSBgYGZyb20gLi4uXG5pbXBvcnQgKmBgIGJpbmRzIGFsbCBuYW1lcyBkZWZpbmVkIGluIHRoZSBpbXBvcnRlZCBtb2R1bGUsIGV4Y2VwdFxudGhvc2UgYmVnaW5uaW5nIHdpdGggYW4gdW5kZXJzY29yZS4gIFRoaXMgZm9ybSBtYXkgb25seSBiZSB1c2VkIGF0IHRoZVxubW9kdWxlIGxldmVsLlxuXG5BIHRhcmdldCBvY2N1cnJpbmcgaW4gYSBgYGRlbGBgIHN0YXRlbWVudCBpcyBhbHNvIGNvbnNpZGVyZWQgYm91bmQgZm9yXG50aGlzIHB1cnBvc2UgKHRob3VnaCB0aGUgYWN0dWFsIHNlbWFudGljcyBhcmUgdG8gdW5iaW5kIHRoZSBuYW1lKS4gIEl0XG5pcyBpbGxlZ2FsIHRvIHVuYmluZCBhIG5hbWUgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IGFuIGVuY2xvc2luZyBzY29wZTtcbnRoZSBjb21waWxlciB3aWxsIHJlcG9ydCBhIGBgU3ludGF4RXJyb3JgYC5cblxuRWFjaCBhc3NpZ25tZW50IG9yIGltcG9ydCBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrIGRlZmluZWQgYnkgYVxuY2xhc3Mgb3IgZnVuY3Rpb24gZGVmaW5pdGlvbiBvciBhdCB0aGUgbW9kdWxlIGxldmVsICh0aGUgdG9wLWxldmVsXG5jb2RlIGJsb2NrKS5cblxuSWYgYSBuYW1lIGJpbmRpbmcgb3BlcmF0aW9uIG9jY3VycyBhbnl3aGVyZSB3aXRoaW4gYSBjb2RlIGJsb2NrLCBhbGxcbnVzZXMgb2YgdGhlIG5hbWUgd2l0aGluIHRoZSBibG9jayBhcmUgdHJlYXRlZCBhcyByZWZlcmVuY2VzIHRvIHRoZVxuY3VycmVudCBibG9jay4gIFRoaXMgY2FuIGxlYWQgdG8gZXJyb3JzIHdoZW4gYSBuYW1lIGlzIHVzZWQgd2l0aGluIGFcbmJsb2NrIGJlZm9yZSBpdCBpcyBib3VuZC4gVGhpcyBydWxlIGlzIHN1YnRsZS4gIFB5dGhvbiBsYWNrc1xuZGVjbGFyYXRpb25zIGFuZCBhbGxvd3MgbmFtZSBiaW5kaW5nIG9wZXJhdGlvbnMgdG8gb2NjdXIgYW55d2hlcmVcbndpdGhpbiBhIGNvZGUgYmxvY2suICBUaGUgbG9jYWwgdmFyaWFibGVzIG9mIGEgY29kZSBibG9jayBjYW4gYmVcbmRldGVybWluZWQgYnkgc2Nhbm5pbmcgdGhlIGVudGlyZSB0ZXh0IG9mIHRoZSBibG9jayBmb3IgbmFtZSBiaW5kaW5nXG5vcGVyYXRpb25zLlxuXG5JZiB0aGUgZ2xvYmFsIHN0YXRlbWVudCBvY2N1cnMgd2l0aGluIGEgYmxvY2ssIGFsbCB1c2VzIG9mIHRoZSBuYW1lXG5zcGVjaWZpZWQgaW4gdGhlIHN0YXRlbWVudCByZWZlciB0byB0aGUgYmluZGluZyBvZiB0aGF0IG5hbWUgaW4gdGhlXG50b3AtbGV2ZWwgbmFtZXNwYWNlLiBOYW1lcyBhcmUgcmVzb2x2ZWQgaW4gdGhlIHRvcC1sZXZlbCBuYW1lc3BhY2UgYnlcbnNlYXJjaGluZyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSwgaS5lLiB0aGUgbmFtZXNwYWNlIG9mIHRoZSBtb2R1bGVcbmNvbnRhaW5pbmcgdGhlIGNvZGUgYmxvY2ssIGFuZCB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlLCB0aGUgbmFtZXNwYWNlXG5vZiB0aGUgbW9kdWxlIGBgX19idWlsdGluX19gYC4gIFRoZSBnbG9iYWwgbmFtZXNwYWNlIGlzIHNlYXJjaGVkXG5maXJzdC4gIElmIHRoZSBuYW1lIGlzIG5vdCBmb3VuZCB0aGVyZSwgdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBpc1xuc2VhcmNoZWQuICBUaGUgZ2xvYmFsIHN0YXRlbWVudCBtdXN0IHByZWNlZGUgYWxsIHVzZXMgb2YgdGhlIG5hbWUuXG5cblRoZSBidWlsdGlucyBuYW1lc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGVjdXRpb24gb2YgYSBjb2RlIGJsb2NrXG5pcyBhY3R1YWxseSBmb3VuZCBieSBsb29raW5nIHVwIHRoZSBuYW1lIGBgX19idWlsdGluc19fYGAgaW4gaXRzXG5nbG9iYWwgbmFtZXNwYWNlOyB0aGlzIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkgb3IgYSBtb2R1bGUgKGluIHRoZVxubGF0dGVyIGNhc2UgdGhlIG1vZHVsZVwncyBkaWN0aW9uYXJ5IGlzIHVzZWQpLiAgQnkgZGVmYXVsdCwgd2hlbiBpbiB0aGVcbmBgX19tYWluX19gYCBtb2R1bGUsIGBgX19idWlsdGluc19fYGAgaXMgdGhlIGJ1aWx0LWluIG1vZHVsZVxuYGBfX2J1aWx0aW5fX2BgIChub3RlOiBubyBcJ3NcJyk7IHdoZW4gaW4gYW55IG90aGVyIG1vZHVsZSxcbmBgX19idWlsdGluc19fYGAgaXMgYW4gYWxpYXMgZm9yIHRoZSBkaWN0aW9uYXJ5IG9mIHRoZSBgYF9fYnVpbHRpbl9fYGBcbm1vZHVsZSBpdHNlbGYuICBgYF9fYnVpbHRpbnNfX2BgIGNhbiBiZSBzZXQgdG8gYSB1c2VyLWNyZWF0ZWRcbmRpY3Rpb25hcnkgdG8gY3JlYXRlIGEgd2VhayBmb3JtIG9mIHJlc3RyaWN0ZWQgZXhlY3V0aW9uLlxuXG4qKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIFVzZXJzIHNob3VsZCBub3QgdG91Y2hcbmBgX19idWlsdGluc19fYGA7IGl0IGlzIHN0cmljdGx5IGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4gIFVzZXJzXG53YW50aW5nIHRvIG92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlIHNob3VsZCBgYGltcG9ydGBgXG50aGUgYGBfX2J1aWx0aW5fX2BgIChubyBcJ3NcJykgbW9kdWxlIGFuZCBtb2RpZnkgaXRzIGF0dHJpYnV0ZXNcbmFwcHJvcHJpYXRlbHkuXG5cblRoZSBuYW1lc3BhY2UgZm9yIGEgbW9kdWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB0aGUgZmlyc3QgdGltZSBhXG5tb2R1bGUgaXMgaW1wb3J0ZWQuICBUaGUgbWFpbiBtb2R1bGUgZm9yIGEgc2NyaXB0IGlzIGFsd2F5cyBjYWxsZWRcbmBgX19tYWluX19gYC5cblxuVGhlIGBgZ2xvYmFsYGAgc3RhdGVtZW50IGhhcyB0aGUgc2FtZSBzY29wZSBhcyBhIG5hbWUgYmluZGluZ1xub3BlcmF0aW9uIGluIHRoZSBzYW1lIGJsb2NrLiAgSWYgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIHNjb3BlIGZvciBhXG5mcmVlIHZhcmlhYmxlIGNvbnRhaW5zIGEgZ2xvYmFsIHN0YXRlbWVudCwgdGhlIGZyZWUgdmFyaWFibGUgaXNcbnRyZWF0ZWQgYXMgYSBnbG9iYWwuXG5cbkEgY2xhc3MgZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudCB0aGF0IG1heSB1c2UgYW5kIGRlZmluZVxubmFtZXMuIFRoZXNlIHJlZmVyZW5jZXMgZm9sbG93IHRoZSBub3JtYWwgcnVsZXMgZm9yIG5hbWUgcmVzb2x1dGlvbi5cblRoZSBuYW1lc3BhY2Ugb2YgdGhlIGNsYXNzIGRlZmluaXRpb24gYmVjb21lcyB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnlcbm9mIHRoZSBjbGFzcy4gIE5hbWVzIGRlZmluZWQgYXQgdGhlIGNsYXNzIHNjb3BlIGFyZSBub3QgdmlzaWJsZSBpblxubWV0aG9kcy5cblxuXG5JbnRlcmFjdGlvbiB3aXRoIGR5bmFtaWMgZmVhdHVyZXNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5UaGVyZSBhcmUgc2V2ZXJhbCBjYXNlcyB3aGVyZSBQeXRob24gc3RhdGVtZW50cyBhcmUgaWxsZWdhbCB3aGVuIHVzZWRcbmluIGNvbmp1bmN0aW9uIHdpdGggbmVzdGVkIHNjb3BlcyB0aGF0IGNvbnRhaW4gZnJlZSB2YXJpYWJsZXMuXG5cbklmIGEgdmFyaWFibGUgaXMgcmVmZXJlbmNlZCBpbiBhbiBlbmNsb3Npbmcgc2NvcGUsIGl0IGlzIGlsbGVnYWwgdG9cbmRlbGV0ZSB0aGUgbmFtZS4gIEFuIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgYXQgY29tcGlsZSB0aW1lLlxuXG5JZiB0aGUgd2lsZCBjYXJkIGZvcm0gb2YgaW1wb3J0IC0tLSBgYGltcG9ydCAqYGAgLS0tIGlzIHVzZWQgaW4gYVxuZnVuY3Rpb24gYW5kIHRoZSBmdW5jdGlvbiBjb250YWlucyBvciBpcyBhIG5lc3RlZCBibG9jayB3aXRoIGZyZWVcbnZhcmlhYmxlcywgdGhlIGNvbXBpbGVyIHdpbGwgcmFpc2UgYSBgYFN5bnRheEVycm9yYGAuXG5cbklmIGBgZXhlY2BgIGlzIHVzZWQgaW4gYSBmdW5jdGlvbiBhbmQgdGhlIGZ1bmN0aW9uIGNvbnRhaW5zIG9yIGlzIGFcbm5lc3RlZCBibG9jayB3aXRoIGZyZWUgdmFyaWFibGVzLCB0aGUgY29tcGlsZXIgd2lsbCByYWlzZSBhXG5gYFN5bnRheEVycm9yYGAgdW5sZXNzIHRoZSBleGVjIGV4cGxpY2l0bHkgc3BlY2lmaWVzIHRoZSBsb2NhbFxubmFtZXNwYWNlIGZvciB0aGUgYGBleGVjYGAuICAoSW4gb3RoZXIgd29yZHMsIGBgZXhlYyBvYmpgYCB3b3VsZCBiZVxuaWxsZWdhbCwgYnV0IGBgZXhlYyBvYmogaW4gbnNgYCB3b3VsZCBiZSBsZWdhbC4pXG5cblRoZSBgYGV2YWwoKWBgLCBgYGV4ZWNmaWxlKClgYCwgYW5kIGBgaW5wdXQoKWBgIGZ1bmN0aW9ucyBhbmQgdGhlXG5gYGV4ZWNgYCBzdGF0ZW1lbnQgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBmdWxsIGVudmlyb25tZW50IGZvclxucmVzb2x2aW5nIG5hbWVzLiAgTmFtZXMgbWF5IGJlIHJlc29sdmVkIGluIHRoZSBsb2NhbCBhbmQgZ2xvYmFsXG5uYW1lc3BhY2VzIG9mIHRoZSBjYWxsZXIuICBGcmVlIHZhcmlhYmxlcyBhcmUgbm90IHJlc29sdmVkIGluIHRoZVxubmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlLCBidXQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuIFsxXSBUaGVcbmBgZXhlY2BgIHN0YXRlbWVudCBhbmQgdGhlIGBgZXZhbCgpYGAgYW5kIGBgZXhlY2ZpbGUoKWBgIGZ1bmN0aW9uc1xuaGF2ZSBvcHRpb25hbCBhcmd1bWVudHMgdG8gb3ZlcnJpZGUgdGhlIGdsb2JhbCBhbmQgbG9jYWwgbmFtZXNwYWNlLlxuSWYgb25seSBvbmUgbmFtZXNwYWNlIGlzIHNwZWNpZmllZCwgaXQgaXMgdXNlZCBmb3IgYm90aC5cblxuXG5FeGNlcHRpb25zXG49PT09PT09PT09XG5cbkV4Y2VwdGlvbnMgYXJlIGEgbWVhbnMgb2YgYnJlYWtpbmcgb3V0IG9mIHRoZSBub3JtYWwgZmxvdyBvZiBjb250cm9sXG5vZiBhIGNvZGUgYmxvY2sgaW4gb3JkZXIgdG8gaGFuZGxlIGVycm9ycyBvciBvdGhlciBleGNlcHRpb25hbFxuY29uZGl0aW9ucy4gIEFuIGV4Y2VwdGlvbiBpcyAqcmFpc2VkKiBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlIGVycm9yIGlzXG5kZXRlY3RlZDsgaXQgbWF5IGJlICpoYW5kbGVkKiBieSB0aGUgc3Vycm91bmRpbmcgY29kZSBibG9jayBvciBieSBhbnlcbmNvZGUgYmxvY2sgdGhhdCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGludm9rZWQgdGhlIGNvZGUgYmxvY2sgd2hlcmVcbnRoZSBlcnJvciBvY2N1cnJlZC5cblxuVGhlIFB5dGhvbiBpbnRlcnByZXRlciByYWlzZXMgYW4gZXhjZXB0aW9uIHdoZW4gaXQgZGV0ZWN0cyBhIHJ1bi10aW1lXG5lcnJvciAoc3VjaCBhcyBkaXZpc2lvbiBieSB6ZXJvKS4gIEEgUHl0aG9uIHByb2dyYW0gY2FuIGFsc29cbmV4cGxpY2l0bHkgcmFpc2UgYW4gZXhjZXB0aW9uIHdpdGggdGhlIGBgcmFpc2VgYCBzdGF0ZW1lbnQuIEV4Y2VwdGlvblxuaGFuZGxlcnMgYXJlIHNwZWNpZmllZCB3aXRoIHRoZSBgYHRyeWBgIC4uLiBgYGV4Y2VwdGBgIHN0YXRlbWVudC4gIFRoZVxuYGBmaW5hbGx5YGAgY2xhdXNlIG9mIHN1Y2ggYSBzdGF0ZW1lbnQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBjbGVhbnVwXG5jb2RlIHdoaWNoIGRvZXMgbm90IGhhbmRsZSB0aGUgZXhjZXB0aW9uLCBidXQgaXMgZXhlY3V0ZWQgd2hldGhlciBhblxuZXhjZXB0aW9uIG9jY3VycmVkIG9yIG5vdCBpbiB0aGUgcHJlY2VkaW5nIGNvZGUuXG5cblB5dGhvbiB1c2VzIHRoZSAidGVybWluYXRpb24iIG1vZGVsIG9mIGVycm9yIGhhbmRsaW5nOiBhbiBleGNlcHRpb25cbmhhbmRsZXIgY2FuIGZpbmQgb3V0IHdoYXQgaGFwcGVuZWQgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbiBhdCBhbiBvdXRlclxubGV2ZWwsIGJ1dCBpdCBjYW5ub3QgcmVwYWlyIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgYW5kIHJldHJ5IHRoZVxuZmFpbGluZyBvcGVyYXRpb24gKGV4Y2VwdCBieSByZS1lbnRlcmluZyB0aGUgb2ZmZW5kaW5nIHBpZWNlIG9mIGNvZGVcbmZyb20gdGhlIHRvcCkuXG5cbldoZW4gYW4gZXhjZXB0aW9uIGlzIG5vdCBoYW5kbGVkIGF0IGFsbCwgdGhlIGludGVycHJldGVyIHRlcm1pbmF0ZXNcbmV4ZWN1dGlvbiBvZiB0aGUgcHJvZ3JhbSwgb3IgcmV0dXJucyB0byBpdHMgaW50ZXJhY3RpdmUgbWFpbiBsb29wLiAgSW5cbmVpdGhlciBjYXNlLCBpdCBwcmludHMgYSBzdGFjayBiYWNrdHJhY2UsIGV4Y2VwdCB3aGVuIHRoZSBleGNlcHRpb24gaXNcbmBgU3lzdGVtRXhpdGBgLlxuXG5FeGNlcHRpb25zIGFyZSBpZGVudGlmaWVkIGJ5IGNsYXNzIGluc3RhbmNlcy4gIFRoZSBgYGV4Y2VwdGBgIGNsYXVzZVxuaXMgc2VsZWN0ZWQgZGVwZW5kaW5nIG9uIHRoZSBjbGFzcyBvZiB0aGUgaW5zdGFuY2U6IGl0IG11c3QgcmVmZXJlbmNlXG50aGUgY2xhc3Mgb2YgdGhlIGluc3RhbmNlIG9yIGEgYmFzZSBjbGFzcyB0aGVyZW9mLiAgVGhlIGluc3RhbmNlIGNhblxuYmUgcmVjZWl2ZWQgYnkgdGhlIGhhbmRsZXIgYW5kIGNhbiBjYXJyeSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0XG50aGUgZXhjZXB0aW9uYWwgY29uZGl0aW9uLlxuXG5FeGNlcHRpb25zIGNhbiBhbHNvIGJlIGlkZW50aWZpZWQgYnkgc3RyaW5ncywgaW4gd2hpY2ggY2FzZSB0aGVcbmBgZXhjZXB0YGAgY2xhdXNlIGlzIHNlbGVjdGVkIGJ5IG9iamVjdCBpZGVudGl0eS4gIEFuIGFyYml0cmFyeSB2YWx1ZVxuY2FuIGJlIHJhaXNlZCBhbG9uZyB3aXRoIHRoZSBpZGVudGlmeWluZyBzdHJpbmcgd2hpY2ggY2FuIGJlIHBhc3NlZCB0b1xudGhlIGhhbmRsZXIuXG5cbk5vdGU6IE1lc3NhZ2VzIHRvIGV4Y2VwdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBQeXRob24gQVBJLiAgVGhlaXJcbiAgY29udGVudHMgbWF5IGNoYW5nZSBmcm9tIG9uZSB2ZXJzaW9uIG9mIFB5dGhvbiB0byB0aGUgbmV4dCB3aXRob3V0XG4gIHdhcm5pbmcgYW5kIHNob3VsZCBub3QgYmUgcmVsaWVkIG9uIGJ5IGNvZGUgd2hpY2ggd2lsbCBydW4gdW5kZXJcbiAgbXVsdGlwbGUgdmVyc2lvbnMgb2YgdGhlIGludGVycHJldGVyLlxuXG5TZWUgYWxzbyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGBgdHJ5YGAgc3RhdGVtZW50IGluIHNlY3Rpb24gKlRoZSB0cnlcbnN0YXRlbWVudCogYW5kIGBgcmFpc2VgYCBzdGF0ZW1lbnQgaW4gc2VjdGlvbiAqVGhlIHJhaXNlIHN0YXRlbWVudCouXG5cbi1bIEZvb3Rub3RlcyBdLVxuXG5bMV0gVGhpcyBsaW1pdGF0aW9uIG9jY3VycyBiZWNhdXNlIHRoZSBjb2RlIHRoYXQgaXMgZXhlY3V0ZWQgYnkgdGhlc2VcbiAgICBvcGVyYXRpb25zIGlzIG5vdCBhdmFpbGFibGUgYXQgdGhlIHRpbWUgdGhlIG1vZHVsZSBpcyBjb21waWxlZC5cbicsCisgJ2V4cHJsaXN0cyc6ICdcbkV4cHJlc3Npb24gbGlzdHNcbioqKioqKioqKioqKioqKipcblxuICAgZXhwcmVzc2lvbl9saXN0IDo6PSBleHByZXNzaW9uICggIiwiIGV4cHJlc3Npb24gKSogWyIsIl1cblxuQW4gZXhwcmVzc2lvbiBsaXN0IGNvbnRhaW5pbmcgYXQgbGVhc3Qgb25lIGNvbW1hIHlpZWxkcyBhIHR1cGxlLiAgVGhlXG5sZW5ndGggb2YgdGhlIHR1cGxlIGlzIHRoZSBudW1iZXIgb2YgZXhwcmVzc2lvbnMgaW4gdGhlIGxpc3QuICBUaGVcbmV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuXG5UaGUgdHJhaWxpbmcgY29tbWEgaXMgcmVxdWlyZWQgb25seSB0byBjcmVhdGUgYSBzaW5nbGUgdHVwbGUgKGEuay5hLiBhXG4qc2luZ2xldG9uKik7IGl0IGlzIG9wdGlvbmFsIGluIGFsbCBvdGhlciBjYXNlcy4gIEEgc2luZ2xlIGV4cHJlc3Npb25cbndpdGhvdXQgYSB0cmFpbGluZyBjb21tYSBkb2VzblwndCBjcmVhdGUgYSB0dXBsZSwgYnV0IHJhdGhlciB5aWVsZHMgdGhlXG52YWx1ZSBvZiB0aGF0IGV4cHJlc3Npb24uIChUbyBjcmVhdGUgYW4gZW1wdHkgdHVwbGUsIHVzZSBhbiBlbXB0eSBwYWlyXG5vZiBwYXJlbnRoZXNlczogYGAoKWBgLilcbicsCisgJ2Zsb2F0aW5nJzogJ1xuRmxvYXRpbmcgcG9pbnQgbGl0ZXJhbHNcbioqKioqKioqKioqKioqKioqKioqKioqXG5cbkZsb2F0aW5nIHBvaW50IGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBsZXhpY2FsXG5kZWZpbml0aW9uczpcblxuICAgZmxvYXRudW1iZXIgICA6Oj0gcG9pbnRmbG9hdCB8IGV4cG9uZW50ZmxvYXRcbiAgIHBvaW50ZmxvYXQgICAgOjo9IFtpbnRwYXJ0XSBmcmFjdGlvbiB8IGludHBhcnQgIi4iXG4gICBleHBvbmVudGZsb2F0IDo6PSAoaW50cGFydCB8IHBvaW50ZmxvYXQpIGV4cG9uZW50XG4gICBpbnRwYXJ0ICAgICAgIDo6PSBkaWdpdCtcbiAgIGZyYWN0aW9uICAgICAgOjo9ICIuIiBkaWdpdCtcbiAgIGV4cG9uZW50ICAgICAgOjo9ICgiZSIgfCAiRSIpIFsiKyIgfCAiLSJdIGRpZ2l0K1xuXG5Ob3RlIHRoYXQgdGhlIGludGVnZXIgYW5kIGV4cG9uZW50IHBhcnRzIG9mIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgY2FuXG5sb29rIGxpa2Ugb2N0YWwgaW50ZWdlcnMsIGJ1dCBhcmUgaW50ZXJwcmV0ZWQgdXNpbmcgcmFkaXggMTAuICBGb3JcbmV4YW1wbGUsIGBgMDc3ZTAxMGBgIGlzIGxlZ2FsLCBhbmQgZGVub3RlcyB0aGUgc2FtZSBudW1iZXIgYXNcbmBgNzdlMTBgYC4gVGhlIGFsbG93ZWQgcmFuZ2Ugb2YgZmxvYXRpbmcgcG9pbnQgbGl0ZXJhbHMgaXNcbmltcGxlbWVudGF0aW9uLWRlcGVuZGVudC4gU29tZSBleGFtcGxlcyBvZiBmbG9hdGluZyBwb2ludCBsaXRlcmFsczpcblxuICAgMy4xNCAgICAxMC4gICAgLjAwMSAgICAxZTEwMCAgICAzLjE0ZS0xMCAgICAwZTBcblxuTm90ZSB0aGF0IG51bWVyaWMgbGl0ZXJhbHMgZG8gbm90IGluY2x1ZGUgYSBzaWduOyBhIHBocmFzZSBsaWtlIGBgLTFgYFxuaXMgYWN0dWFsbHkgYW4gZXhwcmVzc2lvbiBjb21wb3NlZCBvZiB0aGUgdW5hcnkgb3BlcmF0b3IgYGAtYGAgYW5kIHRoZVxubGl0ZXJhbCBgYDFgYC5cbicsCisgJ2Zvcic6ICdcblRoZSBgYGZvcmBgIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqXG5cblRoZSBgYGZvcmBgIHN0YXRlbWVudCBpcyB1c2VkIHRvIGl0ZXJhdGUgb3ZlciB0aGUgZWxlbWVudHMgb2YgYVxuc2VxdWVuY2UgKHN1Y2ggYXMgYSBzdHJpbmcsIHR1cGxlIG9yIGxpc3QpIG9yIG90aGVyIGl0ZXJhYmxlIG9iamVjdDpcblxuICAgZm9yX3N0bXQgOjo9ICJmb3IiIHRhcmdldF9saXN0ICJpbiIgZXhwcmVzc2lvbl9saXN0ICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuXG5UaGUgZXhwcmVzc2lvbiBsaXN0IGlzIGV2YWx1YXRlZCBvbmNlOyBpdCBzaG91bGQgeWllbGQgYW4gaXRlcmFibGVcbm9iamVjdC4gIEFuIGl0ZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIHRoZSByZXN1bHQgb2YgdGhlXG5gYGV4cHJlc3Npb25fbGlzdGBgLiAgVGhlIHN1aXRlIGlzIHRoZW4gZXhlY3V0ZWQgb25jZSBmb3IgZWFjaCBpdGVtXG5wcm92aWRlZCBieSB0aGUgaXRlcmF0b3IsIGluIHRoZSBvcmRlciBvZiBhc2NlbmRpbmcgaW5kaWNlcy4gIEVhY2hcbml0ZW0gaW4gdHVybiBpcyBhc3NpZ25lZCB0byB0aGUgdGFyZ2V0IGxpc3QgdXNpbmcgdGhlIHN0YW5kYXJkIHJ1bGVzXG5mb3IgYXNzaWdubWVudHMsIGFuZCB0aGVuIHRoZSBzdWl0ZSBpcyBleGVjdXRlZC4gIFdoZW4gdGhlIGl0ZW1zIGFyZVxuZXhoYXVzdGVkICh3aGljaCBpcyBpbW1lZGlhdGVseSB3aGVuIHRoZSBzZXF1ZW5jZSBpcyBlbXB0eSksIHRoZSBzdWl0ZVxuaW4gdGhlIGBgZWxzZWBgIGNsYXVzZSwgaWYgcHJlc2VudCwgaXMgZXhlY3V0ZWQsIGFuZCB0aGUgbG9vcFxudGVybWluYXRlcy5cblxuQSBgYGJyZWFrYGAgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSB0ZXJtaW5hdGVzIHRoZSBsb29wXG53aXRob3V0IGV4ZWN1dGluZyB0aGUgYGBlbHNlYGAgY2xhdXNlXCdzIHN1aXRlLiAgQSBgYGNvbnRpbnVlYGBcbnN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgc2tpcHMgdGhlIHJlc3Qgb2YgdGhlIHN1aXRlIGFuZFxuY29udGludWVzIHdpdGggdGhlIG5leHQgaXRlbSwgb3Igd2l0aCB0aGUgYGBlbHNlYGAgY2xhdXNlIGlmIHRoZXJlIHdhc1xubm8gbmV4dCBpdGVtLlxuXG5UaGUgc3VpdGUgbWF5IGFzc2lnbiB0byB0aGUgdmFyaWFibGUocykgaW4gdGhlIHRhcmdldCBsaXN0OyB0aGlzIGRvZXNcbm5vdCBhZmZlY3QgdGhlIG5leHQgaXRlbSBhc3NpZ25lZCB0byBpdC5cblxuVGhlIHRhcmdldCBsaXN0IGlzIG5vdCBkZWxldGVkIHdoZW4gdGhlIGxvb3AgaXMgZmluaXNoZWQsIGJ1dCBpZiB0aGVcbnNlcXVlbmNlIGlzIGVtcHR5LCBpdCB3aWxsIG5vdCBoYXZlIGJlZW4gYXNzaWduZWQgdG8gYXQgYWxsIGJ5IHRoZVxubG9vcC4gIEhpbnQ6IHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYHJhbmdlKClgYCByZXR1cm5zIGEgc2VxdWVuY2Ugb2ZcbmludGVnZXJzIHN1aXRhYmxlIHRvIGVtdWxhdGUgdGhlIGVmZmVjdCBvZiBQYXNjYWxcJ3MgYGBmb3IgaSA6PSBhIHRvIGJcbmRvYGA7IGUuZy4sIGBgcmFuZ2UoMylgYCByZXR1cm5zIHRoZSBsaXN0IGBgWzAsIDEsIDJdYGAuXG5cbk5vdGU6IFRoZXJlIGlzIGEgc3VidGxldHkgd2hlbiB0aGUgc2VxdWVuY2UgaXMgYmVpbmcgbW9kaWZpZWQgYnkgdGhlIGxvb3BcbiAgKHRoaXMgY2FuIG9ubHkgb2NjdXIgZm9yIG11dGFibGUgc2VxdWVuY2VzLCBpLmUuIGxpc3RzKS4gQW4gaW50ZXJuYWxcbiAgY291bnRlciBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggaXRlbSBpcyB1c2VkIG5leHQsIGFuZCB0aGlzXG4gIGlzIGluY3JlbWVudGVkIG9uIGVhY2ggaXRlcmF0aW9uLiAgV2hlbiB0aGlzIGNvdW50ZXIgaGFzIHJlYWNoZWQgdGhlXG4gIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UgdGhlIGxvb3AgdGVybWluYXRlcy4gIFRoaXMgbWVhbnMgdGhhdCBpZiB0aGVcbiAgc3VpdGUgZGVsZXRlcyB0aGUgY3VycmVudCAob3IgYSBwcmV2aW91cykgaXRlbSBmcm9tIHRoZSBzZXF1ZW5jZSxcbiAgdGhlIG5leHQgaXRlbSB3aWxsIGJlIHNraXBwZWQgKHNpbmNlIGl0IGdldHMgdGhlIGluZGV4IG9mIHRoZVxuICBjdXJyZW50IGl0ZW0gd2hpY2ggaGFzIGFscmVhZHkgYmVlbiB0cmVhdGVkKS4gIExpa2V3aXNlLCBpZiB0aGVcbiAgc3VpdGUgaW5zZXJ0cyBhbiBpdGVtIGluIHRoZSBzZXF1ZW5jZSBiZWZvcmUgdGhlIGN1cnJlbnQgaXRlbSwgdGhlXG4gIGN1cnJlbnQgaXRlbSB3aWxsIGJlIHRyZWF0ZWQgYWdhaW4gdGhlIG5leHQgdGltZSB0aHJvdWdoIHRoZSBsb29wLlxuICBUaGlzIGNhbiBsZWFkIHRvIG5hc3R5IGJ1Z3MgdGhhdCBjYW4gYmUgYXZvaWRlZCBieSBtYWtpbmcgYVxuICB0ZW1wb3JhcnkgY29weSB1c2luZyBhIHNsaWNlIG9mIHRoZSB3aG9sZSBzZXF1ZW5jZSwgZS5nLixcblxuICAgICBmb3IgeCBpbiBhWzpdOlxuICAgICAgICAgaWYgeCA8IDA6IGEucmVtb3ZlKHgpXG4nLAorICdmb3JtYXRzdHJpbmdzJzogJ1xuRm9ybWF0IFN0cmluZyBTeW50YXhcbioqKioqKioqKioqKioqKioqKioqXG5cblRoZSBgYHN0ci5mb3JtYXQoKWBgIG1ldGhvZCBhbmQgdGhlIGBgRm9ybWF0dGVyYGAgY2xhc3Mgc2hhcmUgdGhlIHNhbWVcbnN5bnRheCBmb3IgZm9ybWF0IHN0cmluZ3MgKGFsdGhvdWdoIGluIHRoZSBjYXNlIG9mIGBgRm9ybWF0dGVyYGAsXG5zdWJjbGFzc2VzIGNhbiBkZWZpbmUgdGhlaXIgb3duIGZvcm1hdCBzdHJpbmcgc3ludGF4KS5cblxuRm9ybWF0IHN0cmluZ3MgY29udGFpbiAicmVwbGFjZW1lbnQgZmllbGRzIiBzdXJyb3VuZGVkIGJ5IGN1cmx5IGJyYWNlc1xuYGB7fWBgLiBBbnl0aGluZyB0aGF0IGlzIG5vdCBjb250YWluZWQgaW4gYnJhY2VzIGlzIGNvbnNpZGVyZWQgbGl0ZXJhbFxudGV4dCwgd2hpY2ggaXMgY29waWVkIHVuY2hhbmdlZCB0byB0aGUgb3V0cHV0LiAgSWYgeW91IG5lZWQgdG8gaW5jbHVkZVxuYSBicmFjZSBjaGFyYWN0ZXIgaW4gdGhlIGxpdGVyYWwgdGV4dCwgaXQgY2FuIGJlIGVzY2FwZWQgYnkgZG91Ymxpbmc6XG5gYHt7YGAgYW5kIGBgfX1gYC5cblxuVGhlIGdyYW1tYXIgZm9yIGEgcmVwbGFjZW1lbnQgZmllbGQgaXMgYXMgZm9sbG93czpcblxuICAgICAgcmVwbGFjZW1lbnRfZmllbGQgOjo9ICJ7IiBbZmllbGRfbmFtZV0gWyIhIiBjb252ZXJzaW9uXSBbIjoiIGZvcm1hdF9zcGVjXSAifSJcbiAgICAgIGZpZWxkX25hbWUgICAgICAgIDo6PSBhcmdfbmFtZSAoIi4iIGF0dHJpYnV0ZV9uYW1lIHwgIlsiIGVsZW1lbnRfaW5kZXggIl0iKSpcbiAgICAgIGFyZ19uYW1lICAgICAgICAgIDo6PSBbaWRlbnRpZmllciB8IGludGVnZXJdXG4gICAgICBhdHRyaWJ1dGVfbmFtZSAgICA6Oj0gaWRlbnRpZmllclxuICAgICAgZWxlbWVudF9pbmRleCAgICAgOjo9IGludGVnZXIgfCBpbmRleF9zdHJpbmdcbiAgICAgIGluZGV4X3N0cmluZyAgICAgIDo6PSA8YW55IHNvdXJjZSBjaGFyYWN0ZXIgZXhjZXB0ICJdIj4gK1xuICAgICAgY29udmVyc2lvbiAgICAgICAgOjo9ICJyIiB8ICJzIlxuICAgICAgZm9ybWF0X3NwZWMgICAgICAgOjo9IDxkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbj5cblxuSW4gbGVzcyBmb3JtYWwgdGVybXMsIHRoZSByZXBsYWNlbWVudCBmaWVsZCBjYW4gc3RhcnQgd2l0aCBhXG4qZmllbGRfbmFtZSogdGhhdCBzcGVjaWZpZXMgdGhlIG9iamVjdCB3aG9zZSB2YWx1ZSBpcyB0byBiZSBmb3JtYXR0ZWRcbmFuZCBpbnNlcnRlZCBpbnRvIHRoZSBvdXRwdXQgaW5zdGVhZCBvZiB0aGUgcmVwbGFjZW1lbnQgZmllbGQuIFRoZVxuKmZpZWxkX25hbWUqIGlzIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSAgKmNvbnZlcnNpb24qIGZpZWxkLCB3aGljaCBpc1xucHJlY2VkZWQgYnkgYW4gZXhjbGFtYXRpb24gcG9pbnQgYGBcJyFcJ2BgLCBhbmQgYSAqZm9ybWF0X3NwZWMqLCB3aGljaFxuaXMgcHJlY2VkZWQgYnkgYSBjb2xvbiBgYFwnOlwnYGAuICBUaGVzZSBzcGVjaWZ5IGEgbm9uLWRlZmF1bHQgZm9ybWF0XG5mb3IgdGhlIHJlcGxhY2VtZW50IHZhbHVlLlxuXG5TZWUgYWxzbyB0aGUgKkZvcm1hdCBTcGVjaWZpY2F0aW9uIE1pbmktTGFuZ3VhZ2UqIHNlY3Rpb24uXG5cblRoZSAqZmllbGRfbmFtZSogaXRzZWxmIGJlZ2lucyB3aXRoIGFuICphcmdfbmFtZSogdGhhdCBpcyBlaXRoZXIgYVxubnVtYmVyIG9yIGEga2V5d29yZC4gIElmIGl0XCdzIGEgbnVtYmVyLCBpdCByZWZlcnMgdG8gYSBwb3NpdGlvbmFsXG5hcmd1bWVudCwgYW5kIGlmIGl0XCdzIGEga2V5d29yZCwgaXQgcmVmZXJzIHRvIGEgbmFtZWQga2V5d29yZFxuYXJndW1lbnQuICBJZiB0aGUgbnVtZXJpY2FsIGFyZ19uYW1lcyBpbiBhIGZvcm1hdCBzdHJpbmcgYXJlIDAsIDEsIDIsXG4uLi4gaW4gc2VxdWVuY2UsIHRoZXkgY2FuIGFsbCBiZSBvbWl0dGVkIChub3QganVzdCBzb21lKSBhbmQgdGhlXG5udW1iZXJzIDAsIDEsIDIsIC4uLiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQgaW4gdGhhdCBvcmRlci5cbkJlY2F1c2UgKmFyZ19uYW1lKiBpcyBub3QgcXVvdGUtZGVsaW1pdGVkLCBpdCBpcyBub3QgcG9zc2libGUgdG9cbnNwZWNpZnkgYXJiaXRyYXJ5IGRpY3Rpb25hcnkga2V5cyAoZS5nLiwgdGhlIHN0cmluZ3MgYGBcJzEwXCdgYCBvclxuYGBcJzotXVwnYGApIHdpdGhpbiBhIGZvcm1hdCBzdHJpbmcuIFRoZSAqYXJnX25hbWUqIGNhbiBiZSBmb2xsb3dlZCBieVxuYW55IG51bWJlciBvZiBpbmRleCBvciBhdHRyaWJ1dGUgZXhwcmVzc2lvbnMuIEFuIGV4cHJlc3Npb24gb2YgdGhlXG5mb3JtIGBgXCcubmFtZVwnYGAgc2VsZWN0cyB0aGUgbmFtZWQgYXR0cmlidXRlIHVzaW5nIGBgZ2V0YXR0cigpYGAsXG53aGlsZSBhbiBleHByZXNzaW9uIG9mIHRoZSBmb3JtIGBgXCdbaW5kZXhdXCdgYCBkb2VzIGFuIGluZGV4IGxvb2t1cFxudXNpbmcgYGBfX2dldGl0ZW1fXygpYGAuXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAyLjc6IFRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50IHNwZWNpZmllcnMgY2FuIGJlXG5vbWl0dGVkLCBzbyBgYFwne30ge31cJ2BgIGlzIGVxdWl2YWxlbnQgdG8gYGBcJ3swfSB7MX1cJ2BgLlxuXG5Tb21lIHNpbXBsZSBmb3JtYXQgc3RyaW5nIGV4YW1wbGVzOlxuXG4gICAiRmlyc3QsIHRob3Ugc2hhbHQgY291bnQgdG8gezB9IiAjIFJlZmVyZW5jZXMgZmlyc3QgcG9zaXRpb25hbCBhcmd1bWVudFxuICAgIkJyaW5nIG1lIGEge30iICAgICAgICAgICAgICAgICAgIyBJbXBsaWNpdGx5IHJlZmVyZW5jZXMgdGhlIGZpcnN0IHBvc2l0aW9uYWwgYXJndW1lbnRcbiAgICJGcm9tIHt9IHRvIHt9IiAgICAgICAgICAgICAgICAgICMgU2FtZSBhcyAiRnJvbSB7MH0gdG8gezF9IlxuICAgIk15IHF1ZXN0IGlzIHtuYW1lfSIgICAgICAgICAgICAgIyBSZWZlcmVuY2VzIGtleXdvcmQgYXJndW1lbnQgXCduYW1lXCdcbiAgICJXZWlnaHQgaW4gdG9ucyB7MC53ZWlnaHR9IiAgICAgICMgXCd3ZWlnaHRcJyBhdHRyaWJ1dGUgb2YgZmlyc3QgcG9zaXRpb25hbCBhcmdcbiAgICJVbml0cyBkZXN0cm95ZWQ6IHtwbGF5ZXJzWzBdfSIgICMgRmlyc3QgZWxlbWVudCBvZiBrZXl3b3JkIGFyZ3VtZW50IFwncGxheWVyc1wnLlxuXG5UaGUgKmNvbnZlcnNpb24qIGZpZWxkIGNhdXNlcyBhIHR5cGUgY29lcmNpb24gYmVmb3JlIGZvcm1hdHRpbmcuXG5Ob3JtYWxseSwgdGhlIGpvYiBvZiBmb3JtYXR0aW5nIGEgdmFsdWUgaXMgZG9uZSBieSB0aGVcbmBgX19mb3JtYXRfXygpYGAgbWV0aG9kIG9mIHRoZSB2YWx1ZSBpdHNlbGYuICBIb3dldmVyLCBpbiBzb21lIGNhc2VzXG5pdCBpcyBkZXNpcmFibGUgdG8gZm9yY2UgYSB0eXBlIHRvIGJlIGZvcm1hdHRlZCBhcyBhIHN0cmluZyxcbm92ZXJyaWRpbmcgaXRzIG93biBkZWZpbml0aW9uIG9mIGZvcm1hdHRpbmcuICBCeSBjb252ZXJ0aW5nIHRoZSB2YWx1ZVxudG8gYSBzdHJpbmcgYmVmb3JlIGNhbGxpbmcgYGBfX2Zvcm1hdF9fKClgYCwgdGhlIG5vcm1hbCBmb3JtYXR0aW5nXG5sb2dpYyBpcyBieXBhc3NlZC5cblxuVHdvIGNvbnZlcnNpb24gZmxhZ3MgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQ6IGBgXCchc1wnYGAgd2hpY2ggY2FsbHNcbmBgc3RyKClgYCBvbiB0aGUgdmFsdWUsIGFuZCBgYFwnIXJcJ2BgIHdoaWNoIGNhbGxzIGBgcmVwcigpYGAuXG5cblNvbWUgZXhhbXBsZXM6XG5cbiAgICJIYXJvbGRcJ3MgYSBjbGV2ZXIgezAhc30iICAgICAgICAjIENhbGxzIHN0cigpIG9uIHRoZSBhcmd1bWVudCBmaXJzdFxuICAgIkJyaW5nIG91dCB0aGUgaG9seSB7bmFtZSFyfSIgICAgIyBDYWxscyByZXByKCkgb24gdGhlIGFyZ3VtZW50IGZpcnN0XG5cblRoZSAqZm9ybWF0X3NwZWMqIGZpZWxkIGNvbnRhaW5zIGEgc3BlY2lmaWNhdGlvbiBvZiBob3cgdGhlIHZhbHVlXG5zaG91bGQgYmUgcHJlc2VudGVkLCBpbmNsdWRpbmcgc3VjaCBkZXRhaWxzIGFzIGZpZWxkIHdpZHRoLCBhbGlnbm1lbnQsXG5wYWRkaW5nLCBkZWNpbWFsIHByZWNpc2lvbiBhbmQgc28gb24uICBFYWNoIHZhbHVlIHR5cGUgY2FuIGRlZmluZSBpdHNcbm93biAiZm9ybWF0dGluZyBtaW5pLWxhbmd1YWdlIiBvciBpbnRlcnByZXRhdGlvbiBvZiB0aGUgKmZvcm1hdF9zcGVjKi5cblxuTW9zdCBidWlsdC1pbiB0eXBlcyBzdXBwb3J0IGEgY29tbW9uIGZvcm1hdHRpbmcgbWluaS1sYW5ndWFnZSwgd2hpY2hcbmlzIGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLlxuXG5BICpmb3JtYXRfc3BlYyogZmllbGQgY2FuIGFsc28gaW5jbHVkZSBuZXN0ZWQgcmVwbGFjZW1lbnQgZmllbGRzXG53aXRoaW4gaXQuIFRoZXNlIG5lc3RlZCByZXBsYWNlbWVudCBmaWVsZHMgY2FuIGNvbnRhaW4gb25seSBhIGZpZWxkXG5uYW1lOyBjb252ZXJzaW9uIGZsYWdzIGFuZCBmb3JtYXQgc3BlY2lmaWNhdGlvbnMgYXJlIG5vdCBhbGxvd2VkLiAgVGhlXG5yZXBsYWNlbWVudCBmaWVsZHMgd2l0aGluIHRoZSBmb3JtYXRfc3BlYyBhcmUgc3Vic3RpdHV0ZWQgYmVmb3JlIHRoZVxuKmZvcm1hdF9zcGVjKiBzdHJpbmcgaXMgaW50ZXJwcmV0ZWQuIFRoaXMgYWxsb3dzIHRoZSBmb3JtYXR0aW5nIG9mIGFcbnZhbHVlIHRvIGJlIGR5bmFtaWNhbGx5IHNwZWNpZmllZC5cblxuU2VlIHRoZSAqRm9ybWF0IGV4YW1wbGVzKiBzZWN0aW9uIGZvciBzb21lIGV4YW1wbGVzLlxuXG5cbkZvcm1hdCBTcGVjaWZpY2F0aW9uIE1pbmktTGFuZ3VhZ2Vcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuIkZvcm1hdCBzcGVjaWZpY2F0aW9ucyIgYXJlIHVzZWQgd2l0aGluIHJlcGxhY2VtZW50IGZpZWxkcyBjb250YWluZWRcbndpdGhpbiBhIGZvcm1hdCBzdHJpbmcgdG8gZGVmaW5lIGhvdyBpbmRpdmlkdWFsIHZhbHVlcyBhcmUgcHJlc2VudGVkXG4oc2VlICpGb3JtYXQgU3RyaW5nIFN5bnRheCopLiAgVGhleSBjYW4gYWxzbyBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlXG5idWlsdC1pbiBgYGZvcm1hdCgpYGAgZnVuY3Rpb24uICBFYWNoIGZvcm1hdHRhYmxlIHR5cGUgbWF5IGRlZmluZSBob3dcbnRoZSBmb3JtYXQgc3BlY2lmaWNhdGlvbiBpcyB0byBiZSBpbnRlcnByZXRlZC5cblxuTW9zdCBidWlsdC1pbiB0eXBlcyBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBvcHRpb25zIGZvciBmb3JtYXRcbnNwZWNpZmljYXRpb25zLCBhbHRob3VnaCBzb21lIG9mIHRoZSBmb3JtYXR0aW5nIG9wdGlvbnMgYXJlIG9ubHlcbnN1cHBvcnRlZCBieSB0aGUgbnVtZXJpYyB0eXBlcy5cblxuQSBnZW5lcmFsIGNvbnZlbnRpb24gaXMgdGhhdCBhbiBlbXB0eSBmb3JtYXQgc3RyaW5nIChgYCIiYGApIHByb2R1Y2VzXG50aGUgc2FtZSByZXN1bHQgYXMgaWYgeW91IGhhZCBjYWxsZWQgYGBzdHIoKWBgIG9uIHRoZSB2YWx1ZS4gQSBub24tXG5lbXB0eSBmb3JtYXQgc3RyaW5nIHR5cGljYWxseSBtb2RpZmllcyB0aGUgcmVzdWx0LlxuXG5UaGUgZ2VuZXJhbCBmb3JtIG9mIGEgKnN0YW5kYXJkIGZvcm1hdCBzcGVjaWZpZXIqIGlzOlxuXG4gICBmb3JtYXRfc3BlYyA6Oj0gW1tmaWxsXWFsaWduXVtzaWduXVsjXVswXVt3aWR0aF1bLF1bLnByZWNpc2lvbl1bdHlwZV1cbiAgIGZpbGwgICAgICAgIDo6PSA8YW55IGNoYXJhY3Rlcj5cbiAgIGFsaWduICAgICAgIDo6PSAiPCIgfCAiPiIgfCAiPSIgfCAiXiJcbiAgIHNpZ24gICAgICAgIDo6PSAiKyIgfCAiLSIgfCAiICJcbiAgIHdpZHRoICAgICAgIDo6PSBpbnRlZ2VyXG4gICBwcmVjaXNpb24gICA6Oj0gaW50ZWdlclxuICAgdHlwZSAgICAgICAgOjo9ICJiIiB8ICJjIiB8ICJkIiB8ICJlIiB8ICJFIiB8ICJmIiB8ICJGIiB8ICJnIiB8ICJHIiB8ICJuIiB8ICJvIiB8ICJzIiB8ICJ4IiB8ICJYIiB8ICIlIlxuXG5JZiBhIHZhbGlkICphbGlnbiogdmFsdWUgaXMgc3BlY2lmaWVkLCBpdCBjYW4gYmUgcHJlY2VkZWQgYnkgYSAqZmlsbCpcbmNoYXJhY3RlciB0aGF0IGNhbiBiZSBhbnkgY2hhcmFjdGVyIGFuZCBkZWZhdWx0cyB0byBhIHNwYWNlIGlmXG5vbWl0dGVkLiBOb3RlIHRoYXQgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHVzZSBgYHtgYCBhbmQgYGB9YGAgYXMgKmZpbGwqXG5jaGFyIHdoaWxlIHVzaW5nIHRoZSBgYHN0ci5mb3JtYXQoKWBgIG1ldGhvZDsgdGhpcyBsaW1pdGF0aW9uIGhvd2V2ZXJcbmRvZXNuXCd0IGFmZmVjdCB0aGUgYGBmb3JtYXQoKWBgIGZ1bmN0aW9uLlxuXG5UaGUgbWVhbmluZyBvZiB0aGUgdmFyaW91cyBhbGlnbm1lbnQgb3B0aW9ucyBpcyBhcyBmb2xsb3dzOlxuXG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBPcHRpb24gICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICs9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4gICB8IGBgXCc8XCdgYCAgIHwgRm9yY2VzIHRoZSBmaWVsZCB0byBiZSBsZWZ0LWFsaWduZWQgd2l0aGluIHRoZSBhdmFpbGFibGUgICB8XG4gICB8ICAgICAgICAgICB8IHNwYWNlICh0aGlzIGlzIHRoZSBkZWZhdWx0IGZvciBtb3N0IG9iamVjdHMpLiAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgYGBcJz5cJ2BgICAgfCBGb3JjZXMgdGhlIGZpZWxkIHRvIGJlIHJpZ2h0LWFsaWduZWQgd2l0aGluIHRoZSBhdmFpbGFibGUgIHxcbiAgIHwgICAgICAgICAgIHwgc3BhY2UgKHRoaXMgaXMgdGhlIGRlZmF1bHQgZm9yIG51bWJlcnMpLiAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBgYFwnPVwnYGAgICB8IEZvcmNlcyB0aGUgcGFkZGluZyB0byBiZSBwbGFjZWQgYWZ0ZXIgdGhlIHNpZ24gKGlmIGFueSkgICAgfFxuICAgfCAgICAgICAgICAgfCBidXQgYmVmb3JlIHRoZSBkaWdpdHMuICBUaGlzIGlzIHVzZWQgZm9yIHByaW50aW5nIGZpZWxkcyAgIHxcbiAgIHwgICAgICAgICAgIHwgaW4gdGhlIGZvcm0gXCcrMDAwMDAwMTIwXCcuIFRoaXMgYWxpZ25tZW50IG9wdGlvbiBpcyBvbmx5ICAgIHxcbiAgIHwgICAgICAgICAgIHwgdmFsaWQgZm9yIG51bWVyaWMgdHlwZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBgYFwnXlwnYGAgICB8IEZvcmNlcyB0aGUgZmllbGQgdG8gYmUgY2VudGVyZWQgd2l0aGluIHRoZSBhdmFpbGFibGUgICAgICAgfFxuICAgfCAgICAgICAgICAgfCBzcGFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG5cbk5vdGUgdGhhdCB1bmxlc3MgYSBtaW5pbXVtIGZpZWxkIHdpZHRoIGlzIGRlZmluZWQsIHRoZSBmaWVsZCB3aWR0aFxud2lsbCBhbHdheXMgYmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgZGF0YSB0byBmaWxsIGl0LCBzbyB0aGF0IHRoZVxuYWxpZ25tZW50IG9wdGlvbiBoYXMgbm8gbWVhbmluZyBpbiB0aGlzIGNhc2UuXG5cblRoZSAqc2lnbiogb3B0aW9uIGlzIG9ubHkgdmFsaWQgZm9yIG51bWJlciB0eXBlcywgYW5kIGNhbiBiZSBvbmUgb2ZcbnRoZSBmb2xsb3dpbmc6XG5cbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IE9wdGlvbiAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKz09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbiAgIHwgYGBcJytcJ2BgICAgfCBpbmRpY2F0ZXMgdGhhdCBhIHNpZ24gc2hvdWxkIGJlIHVzZWQgZm9yIGJvdGggcG9zaXRpdmUgYXMgIHxcbiAgIHwgICAgICAgICAgIHwgd2VsbCBhcyBuZWdhdGl2ZSBudW1iZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBgYFwnLVwnYGAgICB8IGluZGljYXRlcyB0aGF0IGEgc2lnbiBzaG91bGQgYmUgdXNlZCBvbmx5IGZvciBuZWdhdGl2ZSAgICAgfFxuICAgfCAgICAgICAgICAgfCBudW1iZXJzICh0aGlzIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yKS4gICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IHNwYWNlICAgICB8IGluZGljYXRlcyB0aGF0IGEgbGVhZGluZyBzcGFjZSBzaG91bGQgYmUgdXNlZCBvbiBwb3NpdGl2ZSAgfFxuICAgfCAgICAgICAgICAgfCBudW1iZXJzLCBhbmQgYSBtaW51cyBzaWduIG9uIG5lZ2F0aXZlIG51bWJlcnMuICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG5cblRoZSBgYFwnI1wnYGAgb3B0aW9uIGlzIG9ubHkgdmFsaWQgZm9yIGludGVnZXJzLCBhbmQgb25seSBmb3IgYmluYXJ5LFxub2N0YWwsIG9yIGhleGFkZWNpbWFsIG91dHB1dC4gIElmIHByZXNlbnQsIGl0IHNwZWNpZmllcyB0aGF0IHRoZVxub3V0cHV0IHdpbGwgYmUgcHJlZml4ZWQgYnkgYGBcJzBiXCdgYCwgYGBcJzBvXCdgYCwgb3IgYGBcJzB4XCdgYCxcbnJlc3BlY3RpdmVseS5cblxuVGhlIGBgXCcsXCdgYCBvcHRpb24gc2lnbmFscyB0aGUgdXNlIG9mIGEgY29tbWEgZm9yIGEgdGhvdXNhbmRzXG5zZXBhcmF0b3IuIEZvciBhIGxvY2FsZSBhd2FyZSBzZXBhcmF0b3IsIHVzZSB0aGUgYGBcJ25cJ2BgIGludGVnZXJcbnByZXNlbnRhdGlvbiB0eXBlIGluc3RlYWQuXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAyLjc6IEFkZGVkIHRoZSBgYFwnLFwnYGAgb3B0aW9uIChzZWUgYWxzbyAqKlBFUFxuMzc4KiopLlxuXG4qd2lkdGgqIGlzIGEgZGVjaW1hbCBpbnRlZ2VyIGRlZmluaW5nIHRoZSBtaW5pbXVtIGZpZWxkIHdpZHRoLiAgSWYgbm90XG5zcGVjaWZpZWQsIHRoZW4gdGhlIGZpZWxkIHdpZHRoIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgY29udGVudC5cblxuUHJlY2VkaW5nIHRoZSAqd2lkdGgqIGZpZWxkIGJ5IGEgemVybyAoYGBcJzBcJ2BgKSBjaGFyYWN0ZXIgZW5hYmxlc1xuc2lnbi1hd2FyZSB6ZXJvLXBhZGRpbmcgZm9yIG51bWVyaWMgdHlwZXMuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYVxuKmZpbGwqIGNoYXJhY3RlciBvZiBgYFwnMFwnYGAgd2l0aCBhbiAqYWxpZ25tZW50KiB0eXBlIG9mIGBgXCc9XCdgYC5cblxuVGhlICpwcmVjaXNpb24qIGlzIGEgZGVjaW1hbCBudW1iZXIgaW5kaWNhdGluZyBob3cgbWFueSBkaWdpdHMgc2hvdWxkXG5iZSBkaXNwbGF5ZWQgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQgZm9yIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWVcbmZvcm1hdHRlZCB3aXRoIGBgXCdmXCdgYCBhbmQgYGBcJ0ZcJ2BgLCBvciBiZWZvcmUgYW5kIGFmdGVyIHRoZSBkZWNpbWFsXG5wb2ludCBmb3IgYSBmbG9hdGluZyBwb2ludCB2YWx1ZSBmb3JtYXR0ZWQgd2l0aCBgYFwnZ1wnYGAgb3IgYGBcJ0dcJ2BgLlxuRm9yIG5vbi1udW1iZXIgdHlwZXMgdGhlIGZpZWxkIGluZGljYXRlcyB0aGUgbWF4aW11bSBmaWVsZCBzaXplIC0gaW5cbm90aGVyIHdvcmRzLCBob3cgbWFueSBjaGFyYWN0ZXJzIHdpbGwgYmUgdXNlZCBmcm9tIHRoZSBmaWVsZCBjb250ZW50LlxuVGhlICpwcmVjaXNpb24qIGlzIG5vdCBhbGxvd2VkIGZvciBpbnRlZ2VyIHZhbHVlcy5cblxuRmluYWxseSwgdGhlICp0eXBlKiBkZXRlcm1pbmVzIGhvdyB0aGUgZGF0YSBzaG91bGQgYmUgcHJlc2VudGVkLlxuXG5UaGUgYXZhaWxhYmxlIHN0cmluZyBwcmVzZW50YXRpb24gdHlwZXMgYXJlOlxuXG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBUeXBlICAgICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICs9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4gICB8IGBgXCdzXCdgYCAgIHwgU3RyaW5nIGZvcm1hdC4gVGhpcyBpcyB0aGUgZGVmYXVsdCB0eXBlIGZvciBzdHJpbmdzIGFuZCAgICB8XG4gICB8ICAgICAgICAgICB8IG1heSBiZSBvbWl0dGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgTm9uZSAgICAgIHwgVGhlIHNhbWUgYXMgYGBcJ3NcJ2BgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG5cblRoZSBhdmFpbGFibGUgaW50ZWdlciBwcmVzZW50YXRpb24gdHlwZXMgYXJlOlxuXG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBUeXBlICAgICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICs9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4gICB8IGBgXCdiXCdgYCAgIHwgQmluYXJ5IGZvcm1hdC4gT3V0cHV0cyB0aGUgbnVtYmVyIGluIGJhc2UgMi4gICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBgYFwnY1wnYGAgICB8IENoYXJhY3Rlci4gQ29udmVydHMgdGhlIGludGVnZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgICAgICAgfFxuICAgfCAgICAgICAgICAgfCB1bmljb2RlIGNoYXJhY3RlciBiZWZvcmUgcHJpbnRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IGBgXCdkXCdgYCAgIHwgRGVjaW1hbCBJbnRlZ2VyLiBPdXRwdXRzIHRoZSBudW1iZXIgaW4gYmFzZSAxMC4gICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBgYFwnb1wnYGAgICB8IE9jdGFsIGZvcm1hdC4gT3V0cHV0cyB0aGUgbnVtYmVyIGluIGJhc2UgOC4gICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgYGBcJ3hcJ2BgICAgfCBIZXggZm9ybWF0LiBPdXRwdXRzIHRoZSBudW1iZXIgaW4gYmFzZSAxNiwgdXNpbmcgbG93ZXItICAgIHxcbiAgIHwgICAgICAgICAgIHwgY2FzZSBsZXR0ZXJzIGZvciB0aGUgZGlnaXRzIGFib3ZlIDkuICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBgYFwnWFwnYGAgICB8IEhleCBmb3JtYXQuIE91dHB1dHMgdGhlIG51bWJlciBpbiBiYXNlIDE2LCB1c2luZyB1cHBlci0gICAgfFxuICAgfCAgICAgICAgICAgfCBjYXNlIGxldHRlcnMgZm9yIHRoZSBkaWdpdHMgYWJvdmUgOS4gICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IGBgXCduXCdgYCAgIHwgTnVtYmVyLiBUaGlzIGlzIHRoZSBzYW1lIGFzIGBgXCdkXCdgYCwgZXhjZXB0IHRoYXQgaXQgdXNlcyAgIHxcbiAgIHwgICAgICAgICAgIHwgdGhlIGN1cnJlbnQgbG9jYWxlIHNldHRpbmcgdG8gaW5zZXJ0IHRoZSBhcHByb3ByaWF0ZSAgICAgICB8XG4gICB8ICAgICAgICAgICB8IG51bWJlciBzZXBhcmF0b3IgY2hhcmFjdGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgTm9uZSAgICAgIHwgVGhlIHNhbWUgYXMgYGBcJ2RcJ2BgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG5cbkluIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSBwcmVzZW50YXRpb24gdHlwZXMsIGludGVnZXJzIGNhbiBiZSBmb3JtYXR0ZWRcbndpdGggdGhlIGZsb2F0aW5nIHBvaW50IHByZXNlbnRhdGlvbiB0eXBlcyBsaXN0ZWQgYmVsb3cgKGV4Y2VwdFxuYGBcJ25cJ2BgIGFuZCBOb25lKS4gV2hlbiBkb2luZyBzbywgYGBmbG9hdCgpYGAgaXMgdXNlZCB0byBjb252ZXJ0IHRoZVxuaW50ZWdlciB0byBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBiZWZvcmUgZm9ybWF0dGluZy5cblxuVGhlIGF2YWlsYWJsZSBwcmVzZW50YXRpb24gdHlwZXMgZm9yIGZsb2F0aW5nIHBvaW50IGFuZCBkZWNpbWFsIHZhbHVlc1xuYXJlOlxuXG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBUeXBlICAgICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICs9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4gICB8IGBgXCdlXCdgYCAgIHwgRXhwb25lbnQgbm90YXRpb24uIFByaW50cyB0aGUgbnVtYmVyIGluIHNjaWVudGlmaWMgICAgICAgICB8XG4gICB8ICAgICAgICAgICB8IG5vdGF0aW9uIHVzaW5nIHRoZSBsZXR0ZXIgXCdlXCcgdG8gaW5kaWNhdGUgdGhlIGV4cG9uZW50LiAgICB8XG4gICB8ICAgICAgICAgICB8IFRoZSBkZWZhdWx0IHByZWNpc2lvbiBpcyBgYDZgYC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgYGBcJ0VcJ2BgICAgfCBFeHBvbmVudCBub3RhdGlvbi4gU2FtZSBhcyBgYFwnZVwnYGAgZXhjZXB0IGl0IHVzZXMgYW4gdXBwZXIgfFxuICAgfCAgICAgICAgICAgfCBjYXNlIFwnRVwnIGFzIHRoZSBzZXBhcmF0b3IgY2hhcmFjdGVyLiAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgYGBcJ2ZcJ2BgICAgfCBGaXhlZCBwb2ludC4gRGlzcGxheXMgdGhlIG51bWJlciBhcyBhIGZpeGVkLXBvaW50IG51bWJlci4gIHxcbiAgIHwgICAgICAgICAgIHwgVGhlIGRlZmF1bHQgcHJlY2lzaW9uIGlzIGBgNmBgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBgYFwnRlwnYGAgICB8IEZpeGVkIHBvaW50LiBTYW1lIGFzIGBgXCdmXCdgYC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBgYFwnZ1wnYGAgICB8IEdlbmVyYWwgZm9ybWF0LiAgRm9yIGEgZ2l2ZW4gcHJlY2lzaW9uIGBgcCA+PSAxYGAsIHRoaXMgICAgfFxuICAgfCAgICAgICAgICAgfCByb3VuZHMgdGhlIG51bWJlciB0byBgYHBgYCBzaWduaWZpY2FudCBkaWdpdHMgYW5kIHRoZW4gICAgIHxcbiAgIHwgICAgICAgICAgIHwgZm9ybWF0cyB0aGUgcmVzdWx0IGluIGVpdGhlciBmaXhlZC1wb2ludCBmb3JtYXQgb3IgaW4gICAgICB8XG4gICB8ICAgICAgICAgICB8IHNjaWVudGlmaWMgbm90YXRpb24sIGRlcGVuZGluZyBvbiBpdHMgbWFnbml0dWRlLiAgVGhlICAgICAgfFxuICAgfCAgICAgICAgICAgfCBwcmVjaXNlIHJ1bGVzIGFyZSBhcyBmb2xsb3dzOiBzdXBwb3NlIHRoYXQgdGhlIHJlc3VsdCAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgZm9ybWF0dGVkIHdpdGggcHJlc2VudGF0aW9uIHR5cGUgYGBcJ2VcJ2BgIGFuZCBwcmVjaXNpb24gICAgIHxcbiAgIHwgICAgICAgICAgIHwgYGBwLTFgYCB3b3VsZCBoYXZlIGV4cG9uZW50IGBgZXhwYGAuICBUaGVuIGlmIGBgLTQgPD0gZXhwICB8XG4gICB8ICAgICAgICAgICB8IDwgcGBgLCB0aGUgbnVtYmVyIGlzIGZvcm1hdHRlZCB3aXRoIHByZXNlbnRhdGlvbiB0eXBlICAgICAgfFxuICAgfCAgICAgICAgICAgfCBgYFwnZlwnYGAgYW5kIHByZWNpc2lvbiBgYHAtMS1leHBgYC4gT3RoZXJ3aXNlLCB0aGUgbnVtYmVyICAgfFxuICAgfCAgICAgICAgICAgfCBpcyBmb3JtYXR0ZWQgd2l0aCBwcmVzZW50YXRpb24gdHlwZSBgYFwnZVwnYGAgYW5kIHByZWNpc2lvbiAgfFxuICAgfCAgICAgICAgICAgfCBgYHAtMWBgLiBJbiBib3RoIGNhc2VzIGluc2lnbmlmaWNhbnQgdHJhaWxpbmcgemVyb3MgYXJlICAgIHxcbiAgIHwgICAgICAgICAgIHwgcmVtb3ZlZCBmcm9tIHRoZSBzaWduaWZpY2FuZCwgYW5kIHRoZSBkZWNpbWFsIHBvaW50IGlzICAgICB8XG4gICB8ICAgICAgICAgICB8IGFsc28gcmVtb3ZlZCBpZiB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIGRpZ2l0cyBmb2xsb3dpbmcgICAgfFxuICAgfCAgICAgICAgICAgfCBpdC4gIFBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBpbmZpbml0eSwgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHxcbiAgIHwgICAgICAgICAgIHwgemVybywgYW5kIG5hbnMsIGFyZSBmb3JtYXR0ZWQgYXMgYGBpbmZgYCwgYGAtaW5mYGAsIGBgMGBgLCB8XG4gICB8ICAgICAgICAgICB8IGBgLTBgYCBhbmQgYGBuYW5gYCByZXNwZWN0aXZlbHksIHJlZ2FyZGxlc3Mgb2YgdGhlICAgICAgICAgfFxuICAgfCAgICAgICAgICAgfCBwcmVjaXNpb24uICBBIHByZWNpc2lvbiBvZiBgYDBgYCBpcyB0cmVhdGVkIGFzIGVxdWl2YWxlbnQgIHxcbiAgIHwgICAgICAgICAgIHwgdG8gYSBwcmVjaXNpb24gb2YgYGAxYGAuICBUaGUgZGVmYXVsdCBwcmVjaXNpb24gaXMgYGA2YGAuICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBgYFwnR1wnYGAgICB8IEdlbmVyYWwgZm9ybWF0LiBTYW1lIGFzIGBgXCdnXCdgYCBleGNlcHQgc3dpdGNoZXMgdG8gYGBcJ0VcJ2BgIHxcbiAgIHwgICAgICAgICAgIHwgaWYgdGhlIG51bWJlciBnZXRzIHRvbyBsYXJnZS4gVGhlIHJlcHJlc2VudGF0aW9ucyBvZiAgICAgICB8XG4gICB8ICAgICAgICAgICB8IGluZmluaXR5IGFuZCBOYU4gYXJlIHVwcGVyY2FzZWQsIHRvby4gICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgYGBcJ25cJ2BgICAgfCBOdW1iZXIuIFRoaXMgaXMgdGhlIHNhbWUgYXMgYGBcJ2dcJ2BgLCBleGNlcHQgdGhhdCBpdCB1c2VzICAgfFxuICAgfCAgICAgICAgICAgfCB0aGUgY3VycmVudCBsb2NhbGUgc2V0dGluZyB0byBpbnNlcnQgdGhlIGFwcHJvcHJpYXRlICAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgbnVtYmVyIHNlcGFyYXRvciBjaGFyYWN0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBgYFwnJVwnYGAgICB8IFBlcmNlbnRhZ2UuIE11bHRpcGxpZXMgdGhlIG51bWJlciBieSAxMDAgYW5kIGRpc3BsYXlzIGluICAgfFxuICAgfCAgICAgICAgICAgfCBmaXhlZCAoYGBcJ2ZcJ2BgKSBmb3JtYXQsIGZvbGxvd2VkIGJ5IGEgcGVyY2VudCBzaWduLiAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgTm9uZSAgICAgIHwgVGhlIHNhbWUgYXMgYGBcJ2dcJ2BgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG5cblxuRm9ybWF0IGV4YW1wbGVzXG49PT09PT09PT09PT09PT1cblxuVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGV4YW1wbGVzIG9mIHRoZSBuZXcgZm9ybWF0IHN5bnRheCBhbmQgY29tcGFyaXNvblxud2l0aCB0aGUgb2xkIGBgJWBgLWZvcm1hdHRpbmcuXG5cbkluIG1vc3Qgb2YgdGhlIGNhc2VzIHRoZSBzeW50YXggaXMgc2ltaWxhciB0byB0aGUgb2xkXG5gYCVgYC1mb3JtYXR0aW5nLCB3aXRoIHRoZSBhZGRpdGlvbiBvZiB0aGUgYGB7fWBgIGFuZCB3aXRoIGBgOmBgIHVzZWRcbmluc3RlYWQgb2YgYGAlYGAuIEZvciBleGFtcGxlLCBgYFwnJTAzLjJmXCdgYCBjYW4gYmUgdHJhbnNsYXRlZCB0b1xuYGBcJ3s6MDMuMmZ9XCdgYC5cblxuVGhlIG5ldyBmb3JtYXQgc3ludGF4IGFsc28gc3VwcG9ydHMgbmV3IGFuZCBkaWZmZXJlbnQgb3B0aW9ucywgc2hvd25cbmluIHRoZSBmb2xsb3cgZXhhbXBsZXMuXG5cbkFjY2Vzc2luZyBhcmd1bWVudHMgYnkgcG9zaXRpb246XG5cbiAgID4+PiBcJ3swfSwgezF9LCB7Mn1cJy5mb3JtYXQoXCdhXCcsIFwnYlwnLCBcJ2NcJylcbiAgIFwnYSwgYiwgY1wnXG4gICA+Pj4gXCd7fSwge30sIHt9XCcuZm9ybWF0KFwnYVwnLCBcJ2JcJywgXCdjXCcpICAjIDIuNysgb25seVxuICAgXCdhLCBiLCBjXCdcbiAgID4+PiBcJ3syfSwgezF9LCB7MH1cJy5mb3JtYXQoXCdhXCcsIFwnYlwnLCBcJ2NcJylcbiAgIFwnYywgYiwgYVwnXG4gICA+Pj4gXCd7Mn0sIHsxfSwgezB9XCcuZm9ybWF0KCpcJ2FiY1wnKSAgICAgICMgdW5wYWNraW5nIGFyZ3VtZW50IHNlcXVlbmNlXG4gICBcJ2MsIGIsIGFcJ1xuICAgPj4+IFwnezB9ezF9ezB9XCcuZm9ybWF0KFwnYWJyYVwnLCBcJ2NhZFwnKSAgICMgYXJndW1lbnRzXCcgaW5kaWNlcyBjYW4gYmUgcmVwZWF0ZWRcbiAgIFwnYWJyYWNhZGFicmFcJ1xuXG5BY2Nlc3NpbmcgYXJndW1lbnRzIGJ5IG5hbWU6XG5cbiAgID4+PiBcJ0Nvb3JkaW5hdGVzOiB7bGF0aXR1ZGV9LCB7bG9uZ2l0dWRlfVwnLmZvcm1hdChsYXRpdHVkZT1cJzM3LjI0TlwnLCBsb25naXR1ZGU9XCctMTE1LjgxV1wnKVxuICAgXCdDb29yZGluYXRlczogMzcuMjROLCAtMTE1LjgxV1wnXG4gICA+Pj4gY29vcmQgPSB7XCdsYXRpdHVkZVwnOiBcJzM3LjI0TlwnLCBcJ2xvbmdpdHVkZVwnOiBcJy0xMTUuODFXXCd9XG4gICA+Pj4gXCdDb29yZGluYXRlczoge2xhdGl0dWRlfSwge2xvbmdpdHVkZX1cJy5mb3JtYXQoKipjb29yZClcbiAgIFwnQ29vcmRpbmF0ZXM6IDM3LjI0TiwgLTExNS44MVdcJ1xuXG5BY2Nlc3NpbmcgYXJndW1lbnRzXCcgYXR0cmlidXRlczpcblxuICAgPj4+IGMgPSAzLTVqXG4gICA+Pj4gKFwnVGhlIGNvbXBsZXggbnVtYmVyIHswfSBpcyBmb3JtZWQgZnJvbSB0aGUgcmVhbCBwYXJ0IHswLnJlYWx9IFwnXG4gICAuLi4gIFwnYW5kIHRoZSBpbWFnaW5hcnkgcGFydCB7MC5pbWFnfS5cJykuZm9ybWF0KGMpXG4gICBcJ1RoZSBjb21wbGV4IG51bWJlciAoMy01aikgaXMgZm9ybWVkIGZyb20gdGhlIHJlYWwgcGFydCAzLjAgYW5kIHRoZSBpbWFnaW5hcnkgcGFydCAtNS4wLlwnXG4gICA+Pj4gY2xhc3MgUG9pbnQob2JqZWN0KTpcbiAgIC4uLiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgsIHkpOlxuICAgLi4uICAgICAgICAgc2VsZi54LCBzZWxmLnkgPSB4LCB5XG4gICAuLi4gICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxuICAgLi4uICAgICAgICAgcmV0dXJuIFwnUG9pbnQoe3NlbGYueH0sIHtzZWxmLnl9KVwnLmZvcm1hdChzZWxmPXNlbGYpXG4gICAuLi5cbiAgID4+PiBzdHIoUG9pbnQoNCwgMikpXG4gICBcJ1BvaW50KDQsIDIpXCdcblxuQWNjZXNzaW5nIGFyZ3VtZW50c1wnIGl0ZW1zOlxuXG4gICA+Pj4gY29vcmQgPSAoMywgNSlcbiAgID4+PiBcJ1g6IHswWzBdfTsgIFk6IHswWzFdfVwnLmZvcm1hdChjb29yZClcbiAgIFwnWDogMzsgIFk6IDVcJ1xuXG5SZXBsYWNpbmcgYGAlc2BgIGFuZCBgYCVyYGA6XG5cbiAgID4+PiAicmVwcigpIHNob3dzIHF1b3RlczogeyFyfTsgc3RyKCkgZG9lc25cJ3Q6IHshc30iLmZvcm1hdChcJ3Rlc3QxXCcsIFwndGVzdDJcJylcbiAgICJyZXByKCkgc2hvd3MgcXVvdGVzOiBcJ3Rlc3QxXCc7IHN0cigpIGRvZXNuXCd0OiB0ZXN0MiJcblxuQWxpZ25pbmcgdGhlIHRleHQgYW5kIHNwZWNpZnlpbmcgYSB3aWR0aDpcblxuICAgPj4+IFwnezo8MzB9XCcuZm9ybWF0KFwnbGVmdCBhbGlnbmVkXCcpXG4gICBcJ2xlZnQgYWxpZ25lZCAgICAgICAgICAgICAgICAgIFwnXG4gICA+Pj4gXCd7Oj4zMH1cJy5mb3JtYXQoXCdyaWdodCBhbGlnbmVkXCcpXG4gICBcJyAgICAgICAgICAgICAgICAgcmlnaHQgYWxpZ25lZFwnXG4gICA+Pj4gXCd7Ol4zMH1cJy5mb3JtYXQoXCdjZW50ZXJlZFwnKVxuICAgXCcgICAgICAgICAgIGNlbnRlcmVkICAgICAgICAgICBcJ1xuICAgPj4+IFwnezoqXjMwfVwnLmZvcm1hdChcJ2NlbnRlcmVkXCcpICAjIHVzZSBcJypcJyBhcyBhIGZpbGwgY2hhclxuICAgXCcqKioqKioqKioqKmNlbnRlcmVkKioqKioqKioqKipcJ1xuXG5SZXBsYWNpbmcgYGAlK2ZgYCwgYGAlLWZgYCwgYW5kIGBgJSBmYGAgYW5kIHNwZWNpZnlpbmcgYSBzaWduOlxuXG4gICA+Pj4gXCd7OitmfTsgezorZn1cJy5mb3JtYXQoMy4xNCwgLTMuMTQpICAjIHNob3cgaXQgYWx3YXlzXG4gICBcJyszLjE0MDAwMDsgLTMuMTQwMDAwXCdcbiAgID4+PiBcJ3s6IGZ9OyB7OiBmfVwnLmZvcm1hdCgzLjE0LCAtMy4xNCkgICMgc2hvdyBhIHNwYWNlIGZvciBwb3NpdGl2ZSBudW1iZXJzXG4gICBcJyAzLjE0MDAwMDsgLTMuMTQwMDAwXCdcbiAgID4+PiBcJ3s6LWZ9OyB7Oi1mfVwnLmZvcm1hdCgzLjE0LCAtMy4xNCkgICMgc2hvdyBvbmx5IHRoZSBtaW51cyAtLSBzYW1lIGFzIFwnezpmfTsgezpmfVwnXG4gICBcJzMuMTQwMDAwOyAtMy4xNDAwMDBcJ1xuXG5SZXBsYWNpbmcgYGAleGBgIGFuZCBgYCVvYGAgYW5kIGNvbnZlcnRpbmcgdGhlIHZhbHVlIHRvIGRpZmZlcmVudFxuYmFzZXM6XG5cbiAgID4+PiAjIGZvcm1hdCBhbHNvIHN1cHBvcnRzIGJpbmFyeSBudW1iZXJzXG4gICA+Pj4gImludDogezA6ZH07ICBoZXg6IHswOnh9OyAgb2N0OiB7MDpvfTsgIGJpbjogezA6Yn0iLmZvcm1hdCg0MilcbiAgIFwnaW50OiA0MjsgIGhleDogMmE7ICBvY3Q6IDUyOyAgYmluOiAxMDEwMTBcJ1xuICAgPj4+ICMgd2l0aCAweCwgMG8sIG9yIDBiIGFzIHByZWZpeDpcbiAgID4+PiAiaW50OiB7MDpkfTsgIGhleDogezA6I3h9OyAgb2N0OiB7MDojb307ICBiaW46IHswOiNifSIuZm9ybWF0KDQyKVxuICAgXCdpbnQ6IDQyOyAgaGV4OiAweDJhOyAgb2N0OiAwbzUyOyAgYmluOiAwYjEwMTAxMFwnXG5cblVzaW5nIHRoZSBjb21tYSBhcyBhIHRob3VzYW5kcyBzZXBhcmF0b3I6XG5cbiAgID4+PiBcJ3s6LH1cJy5mb3JtYXQoMTIzNDU2Nzg5MClcbiAgIFwnMSwyMzQsNTY3LDg5MFwnXG5cbkV4cHJlc3NpbmcgYSBwZXJjZW50YWdlOlxuXG4gICA+Pj4gcG9pbnRzID0gMTkuNVxuICAgPj4+IHRvdGFsID0gMjJcbiAgID4+PiBcJ0NvcnJlY3QgYW5zd2VyczogezouMiV9XCcuZm9ybWF0KHBvaW50cy90b3RhbClcbiAgIFwnQ29ycmVjdCBhbnN3ZXJzOiA4OC42NCVcJ1xuXG5Vc2luZyB0eXBlLXNwZWNpZmljIGZvcm1hdHRpbmc6XG5cbiAgID4+PiBpbXBvcnQgZGF0ZXRpbWVcbiAgID4+PiBkID0gZGF0ZXRpbWUuZGF0ZXRpbWUoMjAxMCwgNywgNCwgMTIsIDE1LCA1OClcbiAgID4+PiBcJ3s6JVktJW0tJWQgJUg6JU06JVN9XCcuZm9ybWF0KGQpXG4gICBcJzIwMTAtMDctMDQgMTI6MTU6NThcJ1xuXG5OZXN0aW5nIGFyZ3VtZW50cyBhbmQgbW9yZSBjb21wbGV4IGV4YW1wbGVzOlxuXG4gICA+Pj4gZm9yIGFsaWduLCB0ZXh0IGluIHppcChcJzxePlwnLCBbXCdsZWZ0XCcsIFwnY2VudGVyXCcsIFwncmlnaHRcJ10pOlxuICAgLi4uICAgICBcJ3swOntmaWxsfXthbGlnbn0xNn1cJy5mb3JtYXQodGV4dCwgZmlsbD1hbGlnbiwgYWxpZ249YWxpZ24pXG4gICAuLi5cbiAgIFwnbGVmdDw8PDw8PDw8PDw8PFwnXG4gICBcJ15eXl5eY2VudGVyXl5eXl5cJ1xuICAgXCc+Pj4+Pj4+Pj4+PnJpZ2h0XCdcbiAgID4+PlxuICAgPj4+IG9jdGV0cyA9IFsxOTIsIDE2OCwgMCwgMV1cbiAgID4+PiBcJ3s6MDJYfXs6MDJYfXs6MDJYfXs6MDJYfVwnLmZvcm1hdCgqb2N0ZXRzKVxuICAgXCdDMEE4MDAwMVwnXG4gICA+Pj4gaW50KF8sIDE2KVxuICAgMzIzMjIzNTUyMVxuICAgPj4+XG4gICA+Pj4gd2lkdGggPSA1XG4gICA+Pj4gZm9yIG51bSBpbiByYW5nZSg1LDEyKTpcbiAgIC4uLiAgICAgZm9yIGJhc2UgaW4gXCdkWG9iXCc6XG4gICAuLi4gICAgICAgICBwcmludCBcJ3swOnt3aWR0aH17YmFzZX19XCcuZm9ybWF0KG51bSwgYmFzZT1iYXNlLCB3aWR0aD13aWR0aCksXG4gICAuLi4gICAgIHByaW50XG4gICAuLi5cbiAgICAgICA1ICAgICA1ICAgICA1ICAgMTAxXG4gICAgICAgNiAgICAgNiAgICAgNiAgIDExMFxuICAgICAgIDcgICAgIDcgICAgIDcgICAxMTFcbiAgICAgICA4ICAgICA4ICAgIDEwICAxMDAwXG4gICAgICAgOSAgICAgOSAgICAxMSAgMTAwMVxuICAgICAgMTAgICAgIEEgICAgMTIgIDEwMTBcbiAgICAgIDExICAgICBCICAgIDEzICAxMDExXG4nLAorICdmdW5jdGlvbic6ICdcbkZ1bmN0aW9uIGRlZmluaXRpb25zXG4qKioqKioqKioqKioqKioqKioqKlxuXG5BIGZ1bmN0aW9uIGRlZmluaXRpb24gZGVmaW5lcyBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBvYmplY3QgKHNlZVxuc2VjdGlvbiAqVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5Kik6XG5cbiAgIGRlY29yYXRlZCAgICAgIDo6PSBkZWNvcmF0b3JzIChjbGFzc2RlZiB8IGZ1bmNkZWYpXG4gICBkZWNvcmF0b3JzICAgICA6Oj0gZGVjb3JhdG9yK1xuICAgZGVjb3JhdG9yICAgICAgOjo9ICJAIiBkb3R0ZWRfbmFtZSBbIigiIFthcmd1bWVudF9saXN0IFsiLCJdXSAiKSJdIE5FV0xJTkVcbiAgIGZ1bmNkZWYgICAgICAgIDo6PSAiZGVmIiBmdW5jbmFtZSAiKCIgW3BhcmFtZXRlcl9saXN0XSAiKSIgIjoiIHN1aXRlXG4gICBkb3R0ZWRfbmFtZSAgICA6Oj0gaWRlbnRpZmllciAoIi4iIGlkZW50aWZpZXIpKlxuICAgcGFyYW1ldGVyX2xpc3QgOjo9IChkZWZwYXJhbWV0ZXIgIiwiKSpcbiAgICAgICAgICAgICAgICAgICAgICAoICAiKiIgaWRlbnRpZmllciBbIiwiICIqKiIgaWRlbnRpZmllcl1cbiAgICAgICAgICAgICAgICAgICAgICB8ICIqKiIgaWRlbnRpZmllclxuICAgICAgICAgICAgICAgICAgICAgIHwgZGVmcGFyYW1ldGVyIFsiLCJdIClcbiAgIGRlZnBhcmFtZXRlciAgIDo6PSBwYXJhbWV0ZXIgWyI9IiBleHByZXNzaW9uXVxuICAgc3VibGlzdCAgICAgICAgOjo9IHBhcmFtZXRlciAoIiwiIHBhcmFtZXRlcikqIFsiLCJdXG4gICBwYXJhbWV0ZXIgICAgICA6Oj0gaWRlbnRpZmllciB8ICIoIiBzdWJsaXN0ICIpIlxuICAgZnVuY25hbWUgICAgICAgOjo9IGlkZW50aWZpZXJcblxuQSBmdW5jdGlvbiBkZWZpbml0aW9uIGlzIGFuIGV4ZWN1dGFibGUgc3RhdGVtZW50LiAgSXRzIGV4ZWN1dGlvbiBiaW5kc1xudGhlIGZ1bmN0aW9uIG5hbWUgaW4gdGhlIGN1cnJlbnQgbG9jYWwgbmFtZXNwYWNlIHRvIGEgZnVuY3Rpb24gb2JqZWN0XG4oYSB3cmFwcGVyIGFyb3VuZCB0aGUgZXhlY3V0YWJsZSBjb2RlIGZvciB0aGUgZnVuY3Rpb24pLiAgVGhpc1xuZnVuY3Rpb24gb2JqZWN0IGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGdsb2JhbCBuYW1lc3BhY2VcbmFzIHRoZSBnbG9iYWwgbmFtZXNwYWNlIHRvIGJlIHVzZWQgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLlxuXG5UaGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBkb2VzIG5vdCBleGVjdXRlIHRoZSBmdW5jdGlvbiBib2R5OyB0aGlzIGdldHNcbmV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLiBbM11cblxuQSBmdW5jdGlvbiBkZWZpbml0aW9uIG1heSBiZSB3cmFwcGVkIGJ5IG9uZSBvciBtb3JlICpkZWNvcmF0b3IqXG5leHByZXNzaW9ucy4gRGVjb3JhdG9yIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgd2hlbiB0aGUgZnVuY3Rpb24gaXNcbmRlZmluZWQsIGluIHRoZSBzY29wZSB0aGF0IGNvbnRhaW5zIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLiAgVGhlXG5yZXN1bHQgbXVzdCBiZSBhIGNhbGxhYmxlLCB3aGljaCBpcyBpbnZva2VkIHdpdGggdGhlIGZ1bmN0aW9uIG9iamVjdFxuYXMgdGhlIG9ubHkgYXJndW1lbnQuIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBib3VuZCB0byB0aGUgZnVuY3Rpb24gbmFtZVxuaW5zdGVhZCBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0LiAgTXVsdGlwbGUgZGVjb3JhdG9ycyBhcmUgYXBwbGllZCBpblxubmVzdGVkIGZhc2hpb24uIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGU6XG5cbiAgIEBmMShhcmcpXG4gICBAZjJcbiAgIGRlZiBmdW5jKCk6IHBhc3NcblxuaXMgZXF1aXZhbGVudCB0bzpcblxuICAgZGVmIGZ1bmMoKTogcGFzc1xuICAgZnVuYyA9IGYxKGFyZykoZjIoZnVuYykpXG5cbldoZW4gb25lIG9yIG1vcmUgdG9wLWxldmVsICpwYXJhbWV0ZXJzKiBoYXZlIHRoZSBmb3JtICpwYXJhbWV0ZXIqXG5gYD1gYCAqZXhwcmVzc2lvbiosIHRoZSBmdW5jdGlvbiBpcyBzYWlkIHRvIGhhdmUgImRlZmF1bHQgcGFyYW1ldGVyXG52YWx1ZXMuIiAgRm9yIGEgcGFyYW1ldGVyIHdpdGggYSBkZWZhdWx0IHZhbHVlLCB0aGUgY29ycmVzcG9uZGluZ1xuKmFyZ3VtZW50KiBtYXkgYmUgb21pdHRlZCBmcm9tIGEgY2FsbCwgaW4gd2hpY2ggY2FzZSB0aGUgcGFyYW1ldGVyXCdzXG5kZWZhdWx0IHZhbHVlIGlzIHN1YnN0aXR1dGVkLiAgSWYgYSBwYXJhbWV0ZXIgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgYWxsXG5mb2xsb3dpbmcgcGFyYW1ldGVycyBtdXN0IGFsc28gaGF2ZSBhIGRlZmF1bHQgdmFsdWUgLS0tIHRoaXMgaXMgYVxuc3ludGFjdGljIHJlc3RyaWN0aW9uIHRoYXQgaXMgbm90IGV4cHJlc3NlZCBieSB0aGUgZ3JhbW1hci5cblxuKipEZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMgYXJlIGV2YWx1YXRlZCB3aGVuIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uXG5pcyBleGVjdXRlZC4qKiAgVGhpcyBtZWFucyB0aGF0IHRoZSBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBvbmNlLCB3aGVuXG50aGUgZnVuY3Rpb24gaXMgZGVmaW5lZCwgYW5kIHRoYXQgdGhlIHNhbWUgInByZS1jb21wdXRlZCIgdmFsdWUgaXNcbnVzZWQgZm9yIGVhY2ggY2FsbC4gIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCB3aGVuIGFcbmRlZmF1bHQgcGFyYW1ldGVyIGlzIGEgbXV0YWJsZSBvYmplY3QsIHN1Y2ggYXMgYSBsaXN0IG9yIGEgZGljdGlvbmFyeTpcbmlmIHRoZSBmdW5jdGlvbiBtb2RpZmllcyB0aGUgb2JqZWN0IChlLmcuIGJ5IGFwcGVuZGluZyBhbiBpdGVtIHRvIGFcbmxpc3QpLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBpbiBlZmZlY3QgbW9kaWZpZWQuIFRoaXMgaXMgZ2VuZXJhbGx5IG5vdFxud2hhdCB3YXMgaW50ZW5kZWQuICBBIHdheSBhcm91bmQgdGhpcyAgaXMgdG8gdXNlIGBgTm9uZWBgIGFzIHRoZVxuZGVmYXVsdCwgYW5kIGV4cGxpY2l0bHkgdGVzdCBmb3IgaXQgaW4gdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uLCBlLmcuOlxuXG4gICBkZWYgd2hhdHNfb25fdGhlX3RlbGx5KHBlbmd1aW49Tm9uZSk6XG4gICAgICAgaWYgcGVuZ3VpbiBpcyBOb25lOlxuICAgICAgICAgICBwZW5ndWluID0gW11cbiAgICAgICBwZW5ndWluLmFwcGVuZCgicHJvcGVydHkgb2YgdGhlIHpvbyIpXG4gICAgICAgcmV0dXJuIHBlbmd1aW5cblxuRnVuY3Rpb24gY2FsbCBzZW1hbnRpY3MgYXJlIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBpbiBzZWN0aW9uXG4qQ2FsbHMqLiBBIGZ1bmN0aW9uIGNhbGwgYWx3YXlzIGFzc2lnbnMgdmFsdWVzIHRvIGFsbCBwYXJhbWV0ZXJzXG5tZW50aW9uZWQgaW4gdGhlIHBhcmFtZXRlciBsaXN0LCBlaXRoZXIgZnJvbSBwb3NpdGlvbiBhcmd1bWVudHMsIGZyb21cbmtleXdvcmQgYXJndW1lbnRzLCBvciBmcm9tIGRlZmF1bHQgdmFsdWVzLiAgSWYgdGhlIGZvcm1cbiJgYCppZGVudGlmaWVyYGAiIGlzIHByZXNlbnQsIGl0IGlzIGluaXRpYWxpemVkIHRvIGEgdHVwbGUgcmVjZWl2aW5nXG5hbnkgZXhjZXNzIHBvc2l0aW9uYWwgcGFyYW1ldGVycywgZGVmYXVsdGluZyB0byB0aGUgZW1wdHkgdHVwbGUuICBJZlxudGhlIGZvcm0gImBgKippZGVudGlmaWVyYGAiIGlzIHByZXNlbnQsIGl0IGlzIGluaXRpYWxpemVkIHRvIGEgbmV3XG5kaWN0aW9uYXJ5IHJlY2VpdmluZyBhbnkgZXhjZXNzIGtleXdvcmQgYXJndW1lbnRzLCBkZWZhdWx0aW5nIHRvIGEgbmV3XG5lbXB0eSBkaWN0aW9uYXJ5LlxuXG5JdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGNyZWF0ZSBhbm9ueW1vdXMgZnVuY3Rpb25zIChmdW5jdGlvbnMgbm90IGJvdW5kXG50byBhIG5hbWUpLCBmb3IgaW1tZWRpYXRlIHVzZSBpbiBleHByZXNzaW9ucy4gIFRoaXMgdXNlcyBsYW1iZGFcbmV4cHJlc3Npb25zLCBkZXNjcmliZWQgaW4gc2VjdGlvbiAqTGFtYmRhcyouICBOb3RlIHRoYXQgdGhlIGxhbWJkYVxuZXhwcmVzc2lvbiBpcyBtZXJlbHkgYSBzaG9ydGhhbmQgZm9yIGEgc2ltcGxpZmllZCBmdW5jdGlvbiBkZWZpbml0aW9uO1xuYSBmdW5jdGlvbiBkZWZpbmVkIGluIGEgImBgZGVmYGAiIHN0YXRlbWVudCBjYW4gYmUgcGFzc2VkIGFyb3VuZCBvclxuYXNzaWduZWQgdG8gYW5vdGhlciBuYW1lIGp1c3QgbGlrZSBhIGZ1bmN0aW9uIGRlZmluZWQgYnkgYSBsYW1iZGFcbmV4cHJlc3Npb24uICBUaGUgImBgZGVmYGAiIGZvcm0gaXMgYWN0dWFsbHkgbW9yZSBwb3dlcmZ1bCBzaW5jZSBpdFxuYWxsb3dzIHRoZSBleGVjdXRpb24gb2YgbXVsdGlwbGUgc3RhdGVtZW50cy5cblxuKipQcm9ncmFtbWVyXCdzIG5vdGU6KiogRnVuY3Rpb25zIGFyZSBmaXJzdC1jbGFzcyBvYmplY3RzLiAgQSAiYGBkZWZgYCJcbmZvcm0gZXhlY3V0ZWQgaW5zaWRlIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiBkZWZpbmVzIGEgbG9jYWwgZnVuY3Rpb25cbnRoYXQgY2FuIGJlIHJldHVybmVkIG9yIHBhc3NlZCBhcm91bmQuICBGcmVlIHZhcmlhYmxlcyB1c2VkIGluIHRoZVxubmVzdGVkIGZ1bmN0aW9uIGNhbiBhY2Nlc3MgdGhlIGxvY2FsIHZhcmlhYmxlcyBvZiB0aGUgZnVuY3Rpb25cbmNvbnRhaW5pbmcgdGhlIGRlZi4gIFNlZSBzZWN0aW9uICpOYW1pbmcgYW5kIGJpbmRpbmcqIGZvciBkZXRhaWxzLlxuJywKKyAnZ2xvYmFsJzogJ1xuVGhlIGBgZ2xvYmFsYGAgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKioqKipcblxuICAgZ2xvYmFsX3N0bXQgOjo9ICJnbG9iYWwiIGlkZW50aWZpZXIgKCIsIiBpZGVudGlmaWVyKSpcblxuVGhlIGBgZ2xvYmFsYGAgc3RhdGVtZW50IGlzIGEgZGVjbGFyYXRpb24gd2hpY2ggaG9sZHMgZm9yIHRoZSBlbnRpcmVcbmN1cnJlbnQgY29kZSBibG9jay4gIEl0IG1lYW5zIHRoYXQgdGhlIGxpc3RlZCBpZGVudGlmaWVycyBhcmUgdG8gYmVcbmludGVycHJldGVkIGFzIGdsb2JhbHMuICBJdCB3b3VsZCBiZSBpbXBvc3NpYmxlIHRvIGFzc2lnbiB0byBhIGdsb2JhbFxudmFyaWFibGUgd2l0aG91dCBgYGdsb2JhbGBgLCBhbHRob3VnaCBmcmVlIHZhcmlhYmxlcyBtYXkgcmVmZXIgdG9cbmdsb2JhbHMgd2l0aG91dCBiZWluZyBkZWNsYXJlZCBnbG9iYWwuXG5cbk5hbWVzIGxpc3RlZCBpbiBhIGBgZ2xvYmFsYGAgc3RhdGVtZW50IG11c3Qgbm90IGJlIHVzZWQgaW4gdGhlIHNhbWVcbmNvZGUgYmxvY2sgdGV4dHVhbGx5IHByZWNlZGluZyB0aGF0IGBgZ2xvYmFsYGAgc3RhdGVtZW50LlxuXG5OYW1lcyBsaXN0ZWQgaW4gYSBgYGdsb2JhbGBgIHN0YXRlbWVudCBtdXN0IG5vdCBiZSBkZWZpbmVkIGFzIGZvcm1hbFxucGFyYW1ldGVycyBvciBpbiBhIGBgZm9yYGAgbG9vcCBjb250cm9sIHRhcmdldCwgYGBjbGFzc2BgIGRlZmluaXRpb24sXG5mdW5jdGlvbiBkZWZpbml0aW9uLCBvciBgYGltcG9ydGBgIHN0YXRlbWVudC5cblxuKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdFxuZW5mb3JjZSB0aGUgbGF0dGVyIHR3byByZXN0cmljdGlvbnMsIGJ1dCBwcm9ncmFtcyBzaG91bGQgbm90IGFidXNlXG50aGlzIGZyZWVkb20sIGFzIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbnMgbWF5IGVuZm9yY2UgdGhlbSBvciBzaWxlbnRseVxuY2hhbmdlIHRoZSBtZWFuaW5nIG9mIHRoZSBwcm9ncmFtLlxuXG4qKlByb2dyYW1tZXJcJ3Mgbm90ZToqKiB0aGUgYGBnbG9iYWxgYCBpcyBhIGRpcmVjdGl2ZSB0byB0aGUgcGFyc2VyLlxuSXQgYXBwbGllcyBvbmx5IHRvIGNvZGUgcGFyc2VkIGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlIGBgZ2xvYmFsYGBcbnN0YXRlbWVudC4gSW4gcGFydGljdWxhciwgYSBgYGdsb2JhbGBgIHN0YXRlbWVudCBjb250YWluZWQgaW4gYW5cbmBgZXhlY2BgIHN0YXRlbWVudCBkb2VzIG5vdCBhZmZlY3QgdGhlIGNvZGUgYmxvY2sgKmNvbnRhaW5pbmcqIHRoZVxuYGBleGVjYGAgc3RhdGVtZW50LCBhbmQgY29kZSBjb250YWluZWQgaW4gYW4gYGBleGVjYGAgc3RhdGVtZW50IGlzXG51bmFmZmVjdGVkIGJ5IGBgZ2xvYmFsYGAgc3RhdGVtZW50cyBpbiB0aGUgY29kZSBjb250YWluaW5nIHRoZVxuYGBleGVjYGAgc3RhdGVtZW50LiAgVGhlIHNhbWUgYXBwbGllcyB0byB0aGUgYGBldmFsKClgYCxcbmBgZXhlY2ZpbGUoKWBgIGFuZCBgYGNvbXBpbGUoKWBgIGZ1bmN0aW9ucy5cbicsCisgJ2lkLWNsYXNzZXMnOiAnXG5SZXNlcnZlZCBjbGFzc2VzIG9mIGlkZW50aWZpZXJzXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbkNlcnRhaW4gY2xhc3NlcyBvZiBpZGVudGlmaWVycyAoYmVzaWRlcyBrZXl3b3JkcykgaGF2ZSBzcGVjaWFsXG5tZWFuaW5ncy4gIFRoZXNlIGNsYXNzZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlIHBhdHRlcm5zIG9mIGxlYWRpbmcgYW5kXG50cmFpbGluZyB1bmRlcnNjb3JlIGNoYXJhY3RlcnM6XG5cbmBgXypgYFxuICAgTm90IGltcG9ydGVkIGJ5IGBgZnJvbSBtb2R1bGUgaW1wb3J0ICpgYC4gIFRoZSBzcGVjaWFsIGlkZW50aWZpZXJcbiAgIGBgX2BgIGlzIHVzZWQgaW4gdGhlIGludGVyYWN0aXZlIGludGVycHJldGVyIHRvIHN0b3JlIHRoZSByZXN1bHQgb2ZcbiAgIHRoZSBsYXN0IGV2YWx1YXRpb247IGl0IGlzIHN0b3JlZCBpbiB0aGUgYGBfX2J1aWx0aW5fX2BgIG1vZHVsZS5cbiAgIFdoZW4gbm90IGluIGludGVyYWN0aXZlIG1vZGUsIGBgX2BgIGhhcyBubyBzcGVjaWFsIG1lYW5pbmcgYW5kIGlzXG4gICBub3QgZGVmaW5lZC4gU2VlIHNlY3Rpb24gKlRoZSBpbXBvcnQgc3RhdGVtZW50Ki5cblxuICAgTm90ZTogVGhlIG5hbWUgYGBfYGAgaXMgb2Z0ZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoXG4gICAgIGludGVybmF0aW9uYWxpemF0aW9uOyByZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlXG4gICAgIGBgZ2V0dGV4dGBgIG1vZHVsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIGNvbnZlbnRpb24uXG5cbmBgX18qX19gYFxuICAgU3lzdGVtLWRlZmluZWQgbmFtZXMuIFRoZXNlIG5hbWVzIGFyZSBkZWZpbmVkIGJ5IHRoZSBpbnRlcnByZXRlclxuICAgYW5kIGl0cyBpbXBsZW1lbnRhdGlvbiAoaW5jbHVkaW5nIHRoZSBzdGFuZGFyZCBsaWJyYXJ5KS4gIEN1cnJlbnRcbiAgIHN5c3RlbSBuYW1lcyBhcmUgZGlzY3Vzc2VkIGluIHRoZSAqU3BlY2lhbCBtZXRob2QgbmFtZXMqIHNlY3Rpb25cbiAgIGFuZCBlbHNld2hlcmUuICBNb3JlIHdpbGwgbGlrZWx5IGJlIGRlZmluZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mXG4gICBQeXRob24uICAqQW55KiB1c2Ugb2YgYGBfXypfX2BgIG5hbWVzLCBpbiBhbnkgY29udGV4dCwgdGhhdCBkb2VzXG4gICBub3QgZm9sbG93IGV4cGxpY2l0bHkgZG9jdW1lbnRlZCB1c2UsIGlzIHN1YmplY3QgdG8gYnJlYWthZ2VcbiAgIHdpdGhvdXQgd2FybmluZy5cblxuYGBfXypgYFxuICAgQ2xhc3MtcHJpdmF0ZSBuYW1lcy4gIE5hbWVzIGluIHRoaXMgY2F0ZWdvcnksIHdoZW4gdXNlZCB3aXRoaW4gdGhlXG4gICBjb250ZXh0IG9mIGEgY2xhc3MgZGVmaW5pdGlvbiwgYXJlIHJlLXdyaXR0ZW4gdG8gdXNlIGEgbWFuZ2xlZCBmb3JtXG4gICB0byBoZWxwIGF2b2lkIG5hbWUgY2xhc2hlcyBiZXR3ZWVuICJwcml2YXRlIiBhdHRyaWJ1dGVzIG9mIGJhc2UgYW5kXG4gICBkZXJpdmVkIGNsYXNzZXMuIFNlZSBzZWN0aW9uICpJZGVudGlmaWVycyAoTmFtZXMpKi5cbicsCisgJ2lkZW50aWZpZXJzJzogJ1xuSWRlbnRpZmllcnMgYW5kIGtleXdvcmRzXG4qKioqKioqKioqKioqKioqKioqKioqKipcblxuSWRlbnRpZmllcnMgKGFsc28gcmVmZXJyZWQgdG8gYXMgKm5hbWVzKikgYXJlIGRlc2NyaWJlZCBieSB0aGVcbmZvbGxvd2luZyBsZXhpY2FsIGRlZmluaXRpb25zOlxuXG4gICBpZGVudGlmaWVyIDo6PSAobGV0dGVyfCJfIikgKGxldHRlciB8IGRpZ2l0IHwgIl8iKSpcbiAgIGxldHRlciAgICAgOjo9IGxvd2VyY2FzZSB8IHVwcGVyY2FzZVxuICAgbG93ZXJjYXNlICA6Oj0gImEiLi4uInoiXG4gICB1cHBlcmNhc2UgIDo6PSAiQSIuLi4iWiJcbiAgIGRpZ2l0ICAgICAgOjo9ICIwIi4uLiI5IlxuXG5JZGVudGlmaWVycyBhcmUgdW5saW1pdGVkIGluIGxlbmd0aC4gIENhc2UgaXMgc2lnbmlmaWNhbnQuXG5cblxuS2V5d29yZHNcbj09PT09PT09XG5cblRoZSBmb2xsb3dpbmcgaWRlbnRpZmllcnMgYXJlIHVzZWQgYXMgcmVzZXJ2ZWQgd29yZHMsIG9yICprZXl3b3Jkcyogb2ZcbnRoZSBsYW5ndWFnZSwgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIG9yZGluYXJ5IGlkZW50aWZpZXJzLiAgVGhleSBtdXN0XG5iZSBzcGVsbGVkIGV4YWN0bHkgYXMgd3JpdHRlbiBoZXJlOlxuXG4gICBhbmQgICAgICAgZGVsICAgICAgIGZyb20gICAgICBub3QgICAgICAgd2hpbGVcbiAgIGFzICAgICAgICBlbGlmICAgICAgZ2xvYmFsICAgIG9yICAgICAgICB3aXRoXG4gICBhc3NlcnQgICAgZWxzZSAgICAgIGlmICAgICAgICBwYXNzICAgICAgeWllbGRcbiAgIGJyZWFrICAgICBleGNlcHQgICAgaW1wb3J0ICAgIHByaW50XG4gICBjbGFzcyAgICAgZXhlYyAgICAgIGluICAgICAgICByYWlzZVxuICAgY29udGludWUgIGZpbmFsbHkgICBpcyAgICAgICAgcmV0dXJuXG4gICBkZWYgICAgICAgZm9yICAgICAgIGxhbWJkYSAgICB0cnlcblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNDogYGBOb25lYGAgYmVjYW1lIGEgY29uc3RhbnQgYW5kIGlzIG5vd1xucmVjb2duaXplZCBieSB0aGUgY29tcGlsZXIgYXMgYSBuYW1lIGZvciB0aGUgYnVpbHQtaW4gb2JqZWN0IGBgTm9uZWBgLlxuQWx0aG91Z2ggaXQgaXMgbm90IGEga2V5d29yZCwgeW91IGNhbm5vdCBhc3NpZ24gYSBkaWZmZXJlbnQgb2JqZWN0IHRvXG5pdC5cblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNTogVXNpbmcgYGBhc2BgIGFuZCBgYHdpdGhgYCBhcyBpZGVudGlmaWVyc1xudHJpZ2dlcnMgYSB3YXJuaW5nLiAgVG8gdXNlIHRoZW0gYXMga2V5d29yZHMsIGVuYWJsZSB0aGVcbmBgd2l0aF9zdGF0ZW1lbnRgYCBmdXR1cmUgZmVhdHVyZSAuXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAyLjY6IGBgYXNgYCBhbmQgYGB3aXRoYGAgYXJlIGZ1bGwga2V5d29yZHMuXG5cblxuUmVzZXJ2ZWQgY2xhc3NlcyBvZiBpZGVudGlmaWVyc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5DZXJ0YWluIGNsYXNzZXMgb2YgaWRlbnRpZmllcnMgKGJlc2lkZXMga2V5d29yZHMpIGhhdmUgc3BlY2lhbFxubWVhbmluZ3MuICBUaGVzZSBjbGFzc2VzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZSBwYXR0ZXJucyBvZiBsZWFkaW5nIGFuZFxudHJhaWxpbmcgdW5kZXJzY29yZSBjaGFyYWN0ZXJzOlxuXG5gYF8qYGBcbiAgIE5vdCBpbXBvcnRlZCBieSBgYGZyb20gbW9kdWxlIGltcG9ydCAqYGAuICBUaGUgc3BlY2lhbCBpZGVudGlmaWVyXG4gICBgYF9gYCBpcyB1c2VkIGluIHRoZSBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlciB0byBzdG9yZSB0aGUgcmVzdWx0IG9mXG4gICB0aGUgbGFzdCBldmFsdWF0aW9uOyBpdCBpcyBzdG9yZWQgaW4gdGhlIGBgX19idWlsdGluX19gYCBtb2R1bGUuXG4gICBXaGVuIG5vdCBpbiBpbnRlcmFjdGl2ZSBtb2RlLCBgYF9gYCBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nIGFuZCBpc1xuICAgbm90IGRlZmluZWQuIFNlZSBzZWN0aW9uICpUaGUgaW1wb3J0IHN0YXRlbWVudCouXG5cbiAgIE5vdGU6IFRoZSBuYW1lIGBgX2BgIGlzIG9mdGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aFxuICAgICBpbnRlcm5hdGlvbmFsaXphdGlvbjsgcmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZVxuICAgICBgYGdldHRleHRgYCBtb2R1bGUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBjb252ZW50aW9uLlxuXG5gYF9fKl9fYGBcbiAgIFN5c3RlbS1kZWZpbmVkIG5hbWVzLiBUaGVzZSBuYW1lcyBhcmUgZGVmaW5lZCBieSB0aGUgaW50ZXJwcmV0ZXJcbiAgIGFuZCBpdHMgaW1wbGVtZW50YXRpb24gKGluY2x1ZGluZyB0aGUgc3RhbmRhcmQgbGlicmFyeSkuICBDdXJyZW50XG4gICBzeXN0ZW0gbmFtZXMgYXJlIGRpc2N1c3NlZCBpbiB0aGUgKlNwZWNpYWwgbWV0aG9kIG5hbWVzKiBzZWN0aW9uXG4gICBhbmQgZWxzZXdoZXJlLiAgTW9yZSB3aWxsIGxpa2VseSBiZSBkZWZpbmVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZlxuICAgUHl0aG9uLiAgKkFueSogdXNlIG9mIGBgX18qX19gYCBuYW1lcywgaW4gYW55IGNvbnRleHQsIHRoYXQgZG9lc1xuICAgbm90IGZvbGxvdyBleHBsaWNpdGx5IGRvY3VtZW50ZWQgdXNlLCBpcyBzdWJqZWN0IHRvIGJyZWFrYWdlXG4gICB3aXRob3V0IHdhcm5pbmcuXG5cbmBgX18qYGBcbiAgIENsYXNzLXByaXZhdGUgbmFtZXMuICBOYW1lcyBpbiB0aGlzIGNhdGVnb3J5LCB3aGVuIHVzZWQgd2l0aGluIHRoZVxuICAgY29udGV4dCBvZiBhIGNsYXNzIGRlZmluaXRpb24sIGFyZSByZS13cml0dGVuIHRvIHVzZSBhIG1hbmdsZWQgZm9ybVxuICAgdG8gaGVscCBhdm9pZCBuYW1lIGNsYXNoZXMgYmV0d2VlbiAicHJpdmF0ZSIgYXR0cmlidXRlcyBvZiBiYXNlIGFuZFxuICAgZGVyaXZlZCBjbGFzc2VzLiBTZWUgc2VjdGlvbiAqSWRlbnRpZmllcnMgKE5hbWVzKSouXG4nLAorICdpZic6ICdcblRoZSBgYGlmYGAgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgYGBpZmBgIHN0YXRlbWVudCBpcyB1c2VkIGZvciBjb25kaXRpb25hbCBleGVjdXRpb246XG5cbiAgIGlmX3N0bXQgOjo9ICJpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICggImVsaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlICkqXG4gICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cblxuSXQgc2VsZWN0cyBleGFjdGx5IG9uZSBvZiB0aGUgc3VpdGVzIGJ5IGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb25zIG9uZVxuYnkgb25lIHVudGlsIG9uZSBpcyBmb3VuZCB0byBiZSB0cnVlIChzZWUgc2VjdGlvbiAqQm9vbGVhbiBvcGVyYXRpb25zKlxuZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRydWUgYW5kIGZhbHNlKTsgdGhlbiB0aGF0IHN1aXRlIGlzIGV4ZWN1dGVkXG4oYW5kIG5vIG90aGVyIHBhcnQgb2YgdGhlIGBgaWZgYCBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgb3IgZXZhbHVhdGVkKS5cbklmIGFsbCBleHByZXNzaW9ucyBhcmUgZmFsc2UsIHRoZSBzdWl0ZSBvZiB0aGUgYGBlbHNlYGAgY2xhdXNlLCBpZlxucHJlc2VudCwgaXMgZXhlY3V0ZWQuXG4nLAorICdpbWFnaW5hcnknOiAnXG5JbWFnaW5hcnkgbGl0ZXJhbHNcbioqKioqKioqKioqKioqKioqKlxuXG5JbWFnaW5hcnkgbGl0ZXJhbHMgYXJlIGRlc2NyaWJlZCBieSB0aGUgZm9sbG93aW5nIGxleGljYWwgZGVmaW5pdGlvbnM6XG5cbiAgIGltYWdudW1iZXIgOjo9IChmbG9hdG51bWJlciB8IGludHBhcnQpICgiaiIgfCAiSiIpXG5cbkFuIGltYWdpbmFyeSBsaXRlcmFsIHlpZWxkcyBhIGNvbXBsZXggbnVtYmVyIHdpdGggYSByZWFsIHBhcnQgb2YgMC4wLlxuQ29tcGxleCBudW1iZXJzIGFyZSByZXByZXNlbnRlZCBhcyBhIHBhaXIgb2YgZmxvYXRpbmcgcG9pbnQgbnVtYmVyc1xuYW5kIGhhdmUgdGhlIHNhbWUgcmVzdHJpY3Rpb25zIG9uIHRoZWlyIHJhbmdlLiAgVG8gY3JlYXRlIGEgY29tcGxleFxubnVtYmVyIHdpdGggYSBub256ZXJvIHJlYWwgcGFydCwgYWRkIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHRvIGl0LFxuZS5nLiwgYGAoMys0ailgYC4gIFNvbWUgZXhhbXBsZXMgb2YgaW1hZ2luYXJ5IGxpdGVyYWxzOlxuXG4gICAzLjE0aiAgIDEwLmogICAgMTBqICAgICAuMDAxaiAgIDFlMTAwaiAgMy4xNGUtMTBqXG4nLAorICdpbXBvcnQnOiAnXG5UaGUgYGBpbXBvcnRgYCBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4gICBpbXBvcnRfc3RtdCAgICAgOjo9ICJpbXBvcnQiIG1vZHVsZSBbImFzIiBuYW1lXSAoICIsIiBtb2R1bGUgWyJhcyIgbmFtZV0gKSpcbiAgICAgICAgICAgICAgICAgICB8ICJmcm9tIiByZWxhdGl2ZV9tb2R1bGUgImltcG9ydCIgaWRlbnRpZmllciBbImFzIiBuYW1lXVxuICAgICAgICAgICAgICAgICAgICggIiwiIGlkZW50aWZpZXIgWyJhcyIgbmFtZV0gKSpcbiAgICAgICAgICAgICAgICAgICB8ICJmcm9tIiByZWxhdGl2ZV9tb2R1bGUgImltcG9ydCIgIigiIGlkZW50aWZpZXIgWyJhcyIgbmFtZV1cbiAgICAgICAgICAgICAgICAgICAoICIsIiBpZGVudGlmaWVyIFsiYXMiIG5hbWVdICkqIFsiLCJdICIpIlxuICAgICAgICAgICAgICAgICAgIHwgImZyb20iIG1vZHVsZSAiaW1wb3J0IiAiKiJcbiAgIG1vZHVsZSAgICAgICAgICA6Oj0gKGlkZW50aWZpZXIgIi4iKSogaWRlbnRpZmllclxuICAgcmVsYXRpdmVfbW9kdWxlIDo6PSAiLiIqIG1vZHVsZSB8ICIuIitcbiAgIG5hbWUgICAgICAgICAgICA6Oj0gaWRlbnRpZmllclxuXG5JbXBvcnQgc3RhdGVtZW50cyBhcmUgZXhlY3V0ZWQgaW4gdHdvIHN0ZXBzOiAoMSkgZmluZCBhIG1vZHVsZSwgYW5kXG5pbml0aWFsaXplIGl0IGlmIG5lY2Vzc2FyeTsgKDIpIGRlZmluZSBhIG5hbWUgb3IgbmFtZXMgaW4gdGhlIGxvY2FsXG5uYW1lc3BhY2UgKG9mIHRoZSBzY29wZSB3aGVyZSB0aGUgYGBpbXBvcnRgYCBzdGF0ZW1lbnQgb2NjdXJzKS4gVGhlXG5zdGF0ZW1lbnQgY29tZXMgaW4gdHdvIGZvcm1zIGRpZmZlcmluZyBvbiB3aGV0aGVyIGl0IHVzZXMgdGhlIGBgZnJvbWBgXG5rZXl3b3JkLiBUaGUgZmlyc3QgZm9ybSAod2l0aG91dCBgYGZyb21gYCkgcmVwZWF0cyB0aGVzZSBzdGVwcyBmb3JcbmVhY2ggaWRlbnRpZmllciBpbiB0aGUgbGlzdC4gVGhlIGZvcm0gd2l0aCBgYGZyb21gYCBwZXJmb3JtcyBzdGVwICgxKVxub25jZSwgYW5kIHRoZW4gcGVyZm9ybXMgc3RlcCAoMikgcmVwZWF0ZWRseS5cblxuVG8gdW5kZXJzdGFuZCBob3cgc3RlcCAoMSkgb2NjdXJzLCBvbmUgbXVzdCBmaXJzdCB1bmRlcnN0YW5kIGhvd1xuUHl0aG9uIGhhbmRsZXMgaGllcmFyY2hpY2FsIG5hbWluZyBvZiBtb2R1bGVzLiBUbyBoZWxwIG9yZ2FuaXplXG5tb2R1bGVzIGFuZCBwcm92aWRlIGEgaGllcmFyY2h5IGluIG5hbWluZywgUHl0aG9uIGhhcyBhIGNvbmNlcHQgb2ZcbnBhY2thZ2VzLiBBIHBhY2thZ2UgY2FuIGNvbnRhaW4gb3RoZXIgcGFja2FnZXMgYW5kIG1vZHVsZXMgd2hpbGVcbm1vZHVsZXMgY2Fubm90IGNvbnRhaW4gb3RoZXIgbW9kdWxlcyBvciBwYWNrYWdlcy4gRnJvbSBhIGZpbGUgc3lzdGVtXG5wZXJzcGVjdGl2ZSwgcGFja2FnZXMgYXJlIGRpcmVjdG9yaWVzIGFuZCBtb2R1bGVzIGFyZSBmaWxlcy4gVGhlXG5vcmlnaW5hbCBzcGVjaWZpY2F0aW9uIGZvciBwYWNrYWdlcyBpcyBzdGlsbCBhdmFpbGFibGUgdG8gcmVhZCxcbmFsdGhvdWdoIG1pbm9yIGRldGFpbHMgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSB3cml0aW5nIG9mIHRoYXRcbmRvY3VtZW50LlxuXG5PbmNlIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgaXMga25vd24gKHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLCB0aGVcbnRlcm0gIm1vZHVsZSIgd2lsbCByZWZlciB0byBib3RoIHBhY2thZ2VzIGFuZCBtb2R1bGVzKSwgc2VhcmNoaW5nIGZvclxudGhlIG1vZHVsZSBvciBwYWNrYWdlIGNhbiBiZWdpbi4gVGhlIGZpcnN0IHBsYWNlIGNoZWNrZWQgaXNcbmBgc3lzLm1vZHVsZXNgYCwgdGhlIGNhY2hlIG9mIGFsbCBtb2R1bGVzIHRoYXQgaGF2ZSBiZWVuIGltcG9ydGVkXG5wcmV2aW91c2x5LiBJZiB0aGUgbW9kdWxlIGlzIGZvdW5kIHRoZXJlIHRoZW4gaXQgaXMgdXNlZCBpbiBzdGVwICgyKVxub2YgaW1wb3J0LlxuXG5JZiB0aGUgbW9kdWxlIGlzIG5vdCBmb3VuZCBpbiB0aGUgY2FjaGUsIHRoZW4gYGBzeXMubWV0YV9wYXRoYGAgaXNcbnNlYXJjaGVkICh0aGUgc3BlY2lmaWNhdGlvbiBmb3IgYGBzeXMubWV0YV9wYXRoYGAgY2FuIGJlIGZvdW5kIGluXG4qKlBFUCAzMDIqKikuIFRoZSBvYmplY3QgaXMgYSBsaXN0IG9mICpmaW5kZXIqIG9iamVjdHMgd2hpY2ggYXJlXG5xdWVyaWVkIGluIG9yZGVyIGFzIHRvIHdoZXRoZXIgdGhleSBrbm93IGhvdyB0byBsb2FkIHRoZSBtb2R1bGUgYnlcbmNhbGxpbmcgdGhlaXIgYGBmaW5kX21vZHVsZSgpYGAgbWV0aG9kIHdpdGggdGhlIG5hbWUgb2YgdGhlIG1vZHVsZS4gSWZcbnRoZSBtb2R1bGUgaGFwcGVucyB0byBiZSBjb250YWluZWQgd2l0aGluIGEgcGFja2FnZSAoYXMgZGVub3RlZCBieSB0aGVcbmV4aXN0ZW5jZSBvZiBhIGRvdCBpbiB0aGUgbmFtZSksIHRoZW4gYSBzZWNvbmQgYXJndW1lbnQgdG9cbmBgZmluZF9tb2R1bGUoKWBgIGlzIGdpdmVuIGFzIHRoZSB2YWx1ZSBvZiB0aGUgYGBfX3BhdGhfX2BgIGF0dHJpYnV0ZVxuZnJvbSB0aGUgcGFyZW50IHBhY2thZ2UgKGV2ZXJ5dGhpbmcgdXAgdG8gdGhlIGxhc3QgZG90IGluIHRoZSBuYW1lIG9mXG50aGUgbW9kdWxlIGJlaW5nIGltcG9ydGVkKS4gSWYgYSBmaW5kZXIgY2FuIGZpbmQgdGhlIG1vZHVsZSBpdCByZXR1cm5zXG5hICpsb2FkZXIqIChkaXNjdXNzZWQgbGF0ZXIpIG9yIHJldHVybnMgYGBOb25lYGAuXG5cbklmIG5vbmUgb2YgdGhlIGZpbmRlcnMgb24gYGBzeXMubWV0YV9wYXRoYGAgYXJlIGFibGUgdG8gZmluZCB0aGVcbm1vZHVsZSB0aGVuIHNvbWUgaW1wbGljaXRseSBkZWZpbmVkIGZpbmRlcnMgYXJlIHF1ZXJpZWQuXG5JbXBsZW1lbnRhdGlvbnMgb2YgUHl0aG9uIHZhcnkgaW4gd2hhdCBpbXBsaWNpdCBtZXRhIHBhdGggZmluZGVycyBhcmVcbmRlZmluZWQuIFRoZSBvbmUgdGhleSBhbGwgZG8gZGVmaW5lLCB0aG91Z2gsIGlzIG9uZSB0aGF0IGhhbmRsZXNcbmBgc3lzLnBhdGhfaG9va3NgYCwgYGBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZWBgLCBhbmQgYGBzeXMucGF0aGBgLlxuXG5UaGUgaW1wbGljaXQgZmluZGVyIHNlYXJjaGVzIGZvciB0aGUgcmVxdWVzdGVkIG1vZHVsZSBpbiB0aGUgInBhdGhzIlxuc3BlY2lmaWVkIGluIG9uZSBvZiB0d28gcGxhY2VzICgicGF0aHMiIGRvIG5vdCBoYXZlIHRvIGJlIGZpbGUgc3lzdGVtXG5wYXRocykuIElmIHRoZSBtb2R1bGUgYmVpbmcgaW1wb3J0ZWQgaXMgc3VwcG9zZWQgdG8gYmUgY29udGFpbmVkXG53aXRoaW4gYSBwYWNrYWdlIHRoZW4gdGhlIHNlY29uZCBhcmd1bWVudCBwYXNzZWQgdG8gYGBmaW5kX21vZHVsZSgpYGAsXG5gYF9fcGF0aF9fYGAgb24gdGhlIHBhcmVudCBwYWNrYWdlLCBpcyB1c2VkIGFzIHRoZSBzb3VyY2Ugb2YgcGF0aHMuIElmXG50aGUgbW9kdWxlIGlzIG5vdCBjb250YWluZWQgaW4gYSBwYWNrYWdlIHRoZW4gYGBzeXMucGF0aGBgIGlzIHVzZWQgYXNcbnRoZSBzb3VyY2Ugb2YgcGF0aHMuXG5cbk9uY2UgdGhlIHNvdXJjZSBvZiBwYXRocyBpcyBjaG9zZW4gaXQgaXMgaXRlcmF0ZWQgb3ZlciB0byBmaW5kIGFcbmZpbmRlciB0aGF0IGNhbiBoYW5kbGUgdGhhdCBwYXRoLiBUaGUgZGljdCBhdFxuYGBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZWBgIGNhY2hlcyBmaW5kZXJzIGZvciBwYXRocyBhbmQgaXMgY2hlY2tlZFxuZm9yIGEgZmluZGVyLiBJZiB0aGUgcGF0aCBkb2VzIG5vdCBoYXZlIGEgZmluZGVyIGNhY2hlZCB0aGVuXG5gYHN5cy5wYXRoX2hvb2tzYGAgaXMgc2VhcmNoZWQgYnkgY2FsbGluZyBlYWNoIG9iamVjdCBpbiB0aGUgbGlzdCB3aXRoXG5hIHNpbmdsZSBhcmd1bWVudCBvZiB0aGUgcGF0aCwgcmV0dXJuaW5nIGEgZmluZGVyIG9yIHJhaXNlc1xuYGBJbXBvcnRFcnJvcmBgLiBJZiBhIGZpbmRlciBpcyByZXR1cm5lZCB0aGVuIGl0IGlzIGNhY2hlZCBpblxuYGBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZWBgIGFuZCB0aGVuIHVzZWQgZm9yIHRoYXQgcGF0aCBlbnRyeS4gSWYgbm9cbmZpbmRlciBjYW4gYmUgZm91bmQgYnV0IHRoZSBwYXRoIGV4aXN0cyB0aGVuIGEgdmFsdWUgb2YgYGBOb25lYGAgaXNcbnN0b3JlZCBpbiBgYHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlYGAgdG8gc2lnbmlmeSB0aGF0IGFuIGltcGxpY2l0LFxuZmlsZS1iYXNlZCBmaW5kZXIgdGhhdCBoYW5kbGVzIG1vZHVsZXMgc3RvcmVkIGFzIGluZGl2aWR1YWwgZmlsZXNcbnNob3VsZCBiZSB1c2VkIGZvciB0aGF0IHBhdGguIElmIHRoZSBwYXRoIGRvZXMgbm90IGV4aXN0IHRoZW4gYSBmaW5kZXJcbndoaWNoIGFsd2F5cyByZXR1cm5zIGBgTm9uZWBgIGlzIHBsYWNlZCBpbiB0aGUgY2FjaGUgZm9yIHRoZSBwYXRoLlxuXG5JZiBubyBmaW5kZXIgY2FuIGZpbmQgdGhlIG1vZHVsZSB0aGVuIGBgSW1wb3J0RXJyb3JgYCBpcyByYWlzZWQuXG5PdGhlcndpc2Ugc29tZSBmaW5kZXIgcmV0dXJuZWQgYSBsb2FkZXIgd2hvc2UgYGBsb2FkX21vZHVsZSgpYGAgbWV0aG9kXG5pcyBjYWxsZWQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIGxvYWQgKHNlZSAqKlBFUCAzMDIqKiBmb3IgdGhlXG5vcmlnaW5hbCBkZWZpbml0aW9uIG9mIGxvYWRlcnMpLiBBIGxvYWRlciBoYXMgc2V2ZXJhbCByZXNwb25zaWJpbGl0aWVzXG50byBwZXJmb3JtIG9uIGEgbW9kdWxlIGl0IGxvYWRzLiBGaXJzdCwgaWYgdGhlIG1vZHVsZSBhbHJlYWR5IGV4aXN0c1xuaW4gYGBzeXMubW9kdWxlc2BgIChhIHBvc3NpYmlsaXR5IGlmIHRoZSBsb2FkZXIgaXMgY2FsbGVkIG91dHNpZGUgb2ZcbnRoZSBpbXBvcnQgbWFjaGluZXJ5KSB0aGVuIGl0IGlzIHRvIHVzZSB0aGF0IG1vZHVsZSBmb3IgaW5pdGlhbGl6YXRpb25cbmFuZCBub3QgYSBuZXcgbW9kdWxlLiBCdXQgaWYgdGhlIG1vZHVsZSBkb2VzIG5vdCBleGlzdCBpblxuYGBzeXMubW9kdWxlc2BgIHRoZW4gaXQgaXMgdG8gYmUgYWRkZWQgdG8gdGhhdCBkaWN0IGJlZm9yZVxuaW5pdGlhbGl6YXRpb24gYmVnaW5zLiBJZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGxvYWRpbmcgb2YgdGhlIG1vZHVsZVxuYW5kIGl0IHdhcyBhZGRlZCB0byBgYHN5cy5tb2R1bGVzYGAgaXQgaXMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBkaWN0LlxuSWYgYW4gZXJyb3Igb2NjdXJzIGJ1dCB0aGUgbW9kdWxlIHdhcyBhbHJlYWR5IGluIGBgc3lzLm1vZHVsZXNgYCBpdCBpc1xubGVmdCBpbiB0aGUgZGljdC5cblxuVGhlIGxvYWRlciBtdXN0IHNldCBzZXZlcmFsIGF0dHJpYnV0ZXMgb24gdGhlIG1vZHVsZS4gYGBfX25hbWVfX2BgIGlzXG50byBiZSBzZXQgdG8gdGhlIG5hbWUgb2YgdGhlIG1vZHVsZS4gYGBfX2ZpbGVfX2BgIGlzIHRvIGJlIHRoZSAicGF0aCJcbnRvIHRoZSBmaWxlIHVubGVzcyB0aGUgbW9kdWxlIGlzIGJ1aWx0LWluIChhbmQgdGh1cyBsaXN0ZWQgaW5cbmBgc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzYGApIGluIHdoaWNoIGNhc2UgdGhlIGF0dHJpYnV0ZSBpcyBub3Qgc2V0LlxuSWYgd2hhdCBpcyBiZWluZyBpbXBvcnRlZCBpcyBhIHBhY2thZ2UgdGhlbiBgYF9fcGF0aF9fYGAgaXMgdG8gYmUgc2V0XG50byBhIGxpc3Qgb2YgcGF0aHMgdG8gYmUgc2VhcmNoZWQgd2hlbiBsb29raW5nIGZvciBtb2R1bGVzIGFuZFxucGFja2FnZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgcGFja2FnZSBiZWluZyBpbXBvcnRlZC4gYGBfX3BhY2thZ2VfX2BgXG5pcyBvcHRpb25hbCBidXQgc2hvdWxkIGJlIHNldCB0byB0aGUgbmFtZSBvZiBwYWNrYWdlIHRoYXQgY29udGFpbnMgdGhlXG5tb2R1bGUgb3IgcGFja2FnZSAodGhlIGVtcHR5IHN0cmluZyBpcyB1c2VkIGZvciBtb2R1bGUgbm90IGNvbnRhaW5lZFxuaW4gYSBwYWNrYWdlKS4gYGBfX2xvYWRlcl9fYGAgaXMgYWxzbyBvcHRpb25hbCBidXQgc2hvdWxkIGJlIHNldCB0b1xudGhlIGxvYWRlciBvYmplY3QgdGhhdCBpcyBsb2FkaW5nIHRoZSBtb2R1bGUuXG5cbklmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgbG9hZGluZyB0aGVuIHRoZSBsb2FkZXIgcmFpc2VzXG5gYEltcG9ydEVycm9yYGAgaWYgc29tZSBvdGhlciBleGNlcHRpb24gaXMgbm90IGFscmVhZHkgYmVpbmdcbnByb3BhZ2F0ZWQuIE90aGVyd2lzZSB0aGUgbG9hZGVyIHJldHVybnMgdGhlIG1vZHVsZSB0aGF0IHdhcyBsb2FkZWRcbmFuZCBpbml0aWFsaXplZC5cblxuV2hlbiBzdGVwICgxKSBmaW5pc2hlcyB3aXRob3V0IHJhaXNpbmcgYW4gZXhjZXB0aW9uLCBzdGVwICgyKSBjYW5cbmJlZ2luLlxuXG5UaGUgZmlyc3QgZm9ybSBvZiBgYGltcG9ydGBgIHN0YXRlbWVudCBiaW5kcyB0aGUgbW9kdWxlIG5hbWUgaW4gdGhlXG5sb2NhbCBuYW1lc3BhY2UgdG8gdGhlIG1vZHVsZSBvYmplY3QsIGFuZCB0aGVuIGdvZXMgb24gdG8gaW1wb3J0IHRoZVxubmV4dCBpZGVudGlmaWVyLCBpZiBhbnkuICBJZiB0aGUgbW9kdWxlIG5hbWUgaXMgZm9sbG93ZWQgYnkgYGBhc2BgLFxudGhlIG5hbWUgZm9sbG93aW5nIGBgYXNgYCBpcyB1c2VkIGFzIHRoZSBsb2NhbCBuYW1lIGZvciB0aGUgbW9kdWxlLlxuXG5UaGUgYGBmcm9tYGAgZm9ybSBkb2VzIG5vdCBiaW5kIHRoZSBtb2R1bGUgbmFtZTogaXQgZ29lcyB0aHJvdWdoIHRoZVxubGlzdCBvZiBpZGVudGlmaWVycywgbG9va3MgZWFjaCBvbmUgb2YgdGhlbSB1cCBpbiB0aGUgbW9kdWxlIGZvdW5kIGluXG5zdGVwICgxKSwgYW5kIGJpbmRzIHRoZSBuYW1lIGluIHRoZSBsb2NhbCBuYW1lc3BhY2UgdG8gdGhlIG9iamVjdCB0aHVzXG5mb3VuZC4gIEFzIHdpdGggdGhlIGZpcnN0IGZvcm0gb2YgYGBpbXBvcnRgYCwgYW4gYWx0ZXJuYXRlIGxvY2FsIG5hbWVcbmNhbiBiZSBzdXBwbGllZCBieSBzcGVjaWZ5aW5nICJgYGFzYGAgbG9jYWxuYW1lIi4gIElmIGEgbmFtZSBpcyBub3RcbmZvdW5kLCBgYEltcG9ydEVycm9yYGAgaXMgcmFpc2VkLiAgSWYgdGhlIGxpc3Qgb2YgaWRlbnRpZmllcnMgaXNcbnJlcGxhY2VkIGJ5IGEgc3RhciAoYGBcJypcJ2BgKSwgYWxsIHB1YmxpYyBuYW1lcyBkZWZpbmVkIGluIHRoZSBtb2R1bGVcbmFyZSBib3VuZCBpbiB0aGUgbG9jYWwgbmFtZXNwYWNlIG9mIHRoZSBgYGltcG9ydGBgIHN0YXRlbWVudC4uXG5cblRoZSAqcHVibGljIG5hbWVzKiBkZWZpbmVkIGJ5IGEgbW9kdWxlIGFyZSBkZXRlcm1pbmVkIGJ5IGNoZWNraW5nIHRoZVxubW9kdWxlXCdzIG5hbWVzcGFjZSBmb3IgYSB2YXJpYWJsZSBuYW1lZCBgYF9fYWxsX19gYDsgaWYgZGVmaW5lZCwgaXRcbm11c3QgYmUgYSBzZXF1ZW5jZSBvZiBzdHJpbmdzIHdoaWNoIGFyZSBuYW1lcyBkZWZpbmVkIG9yIGltcG9ydGVkIGJ5XG50aGF0IG1vZHVsZS4gIFRoZSBuYW1lcyBnaXZlbiBpbiBgYF9fYWxsX19gYCBhcmUgYWxsIGNvbnNpZGVyZWQgcHVibGljXG5hbmQgYXJlIHJlcXVpcmVkIHRvIGV4aXN0LiAgSWYgYGBfX2FsbF9fYGAgaXMgbm90IGRlZmluZWQsIHRoZSBzZXQgb2ZcbnB1YmxpYyBuYW1lcyBpbmNsdWRlcyBhbGwgbmFtZXMgZm91bmQgaW4gdGhlIG1vZHVsZVwncyBuYW1lc3BhY2Ugd2hpY2hcbmRvIG5vdCBiZWdpbiB3aXRoIGFuIHVuZGVyc2NvcmUgY2hhcmFjdGVyIChgYFwnX1wnYGApLiBgYF9fYWxsX19gYFxuc2hvdWxkIGNvbnRhaW4gdGhlIGVudGlyZSBwdWJsaWMgQVBJLiBJdCBpcyBpbnRlbmRlZCB0byBhdm9pZFxuYWNjaWRlbnRhbGx5IGV4cG9ydGluZyBpdGVtcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgQVBJIChzdWNoIGFzXG5saWJyYXJ5IG1vZHVsZXMgd2hpY2ggd2VyZSBpbXBvcnRlZCBhbmQgdXNlZCB3aXRoaW4gdGhlIG1vZHVsZSkuXG5cblRoZSBgYGZyb21gYCBmb3JtIHdpdGggYGAqYGAgbWF5IG9ubHkgb2NjdXIgaW4gYSBtb2R1bGUgc2NvcGUuICBJZiB0aGVcbndpbGQgY2FyZCBmb3JtIG9mIGltcG9ydCAtLS0gYGBpbXBvcnQgKmBgIC0tLSBpcyB1c2VkIGluIGEgZnVuY3Rpb25cbmFuZCB0aGUgZnVuY3Rpb24gY29udGFpbnMgb3IgaXMgYSBuZXN0ZWQgYmxvY2sgd2l0aCBmcmVlIHZhcmlhYmxlcyxcbnRoZSBjb21waWxlciB3aWxsIHJhaXNlIGEgYGBTeW50YXhFcnJvcmBgLlxuXG5XaGVuIHNwZWNpZnlpbmcgd2hhdCBtb2R1bGUgdG8gaW1wb3J0IHlvdSBkbyBub3QgaGF2ZSB0byBzcGVjaWZ5IHRoZVxuYWJzb2x1dGUgbmFtZSBvZiB0aGUgbW9kdWxlLiBXaGVuIGEgbW9kdWxlIG9yIHBhY2thZ2UgaXMgY29udGFpbmVkXG53aXRoaW4gYW5vdGhlciBwYWNrYWdlIGl0IGlzIHBvc3NpYmxlIHRvIG1ha2UgYSByZWxhdGl2ZSBpbXBvcnQgd2l0aGluXG50aGUgc2FtZSB0b3AgcGFja2FnZSB3aXRob3V0IGhhdmluZyB0byBtZW50aW9uIHRoZSBwYWNrYWdlIG5hbWUuIEJ5XG51c2luZyBsZWFkaW5nIGRvdHMgaW4gdGhlIHNwZWNpZmllZCBtb2R1bGUgb3IgcGFja2FnZSBhZnRlciBgYGZyb21gYFxueW91IGNhbiBzcGVjaWZ5IGhvdyBoaWdoIHRvIHRyYXZlcnNlIHVwIHRoZSBjdXJyZW50IHBhY2thZ2UgaGllcmFyY2h5XG53aXRob3V0IHNwZWNpZnlpbmcgZXhhY3QgbmFtZXMuIE9uZSBsZWFkaW5nIGRvdCBtZWFucyB0aGUgY3VycmVudFxucGFja2FnZSB3aGVyZSB0aGUgbW9kdWxlIG1ha2luZyB0aGUgaW1wb3J0IGV4aXN0cy4gVHdvIGRvdHMgbWVhbnMgdXBcbm9uZSBwYWNrYWdlIGxldmVsLiBUaHJlZSBkb3RzIGlzIHVwIHR3byBsZXZlbHMsIGV0Yy4gU28gaWYgeW91IGV4ZWN1dGVcbmBgZnJvbSAuIGltcG9ydCBtb2RgYCBmcm9tIGEgbW9kdWxlIGluIHRoZSBgYHBrZ2BgIHBhY2thZ2UgdGhlbiB5b3VcbndpbGwgZW5kIHVwIGltcG9ydGluZyBgYHBrZy5tb2RgYC4gSWYgeW91IGV4ZWN1dGUgYGBmcm9tIC4uc3VicGtnMlxuaW1wb3J0IG1vZGBgIGZyb20gd2l0aGluIGBgcGtnLnN1YnBrZzFgYCB5b3Ugd2lsbCBpbXBvcnRcbmBgcGtnLnN1YnBrZzIubW9kYGAuIFRoZSBzcGVjaWZpY2F0aW9uIGZvciByZWxhdGl2ZSBpbXBvcnRzIGlzXG5jb250YWluZWQgd2l0aGluICoqUEVQIDMyOCoqLlxuXG5gYGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKClgYCBpcyBwcm92aWRlZCB0byBzdXBwb3J0IGFwcGxpY2F0aW9ucyB0aGF0XG5kZXRlcm1pbmUgd2hpY2ggbW9kdWxlcyBuZWVkIHRvIGJlIGxvYWRlZCBkeW5hbWljYWxseS5cblxuXG5GdXR1cmUgc3RhdGVtZW50c1xuPT09PT09PT09PT09PT09PT1cblxuQSAqZnV0dXJlIHN0YXRlbWVudCogaXMgYSBkaXJlY3RpdmUgdG8gdGhlIGNvbXBpbGVyIHRoYXQgYSBwYXJ0aWN1bGFyXG5tb2R1bGUgc2hvdWxkIGJlIGNvbXBpbGVkIHVzaW5nIHN5bnRheCBvciBzZW1hbnRpY3MgdGhhdCB3aWxsIGJlXG5hdmFpbGFibGUgaW4gYSBzcGVjaWZpZWQgZnV0dXJlIHJlbGVhc2Ugb2YgUHl0aG9uLiAgVGhlIGZ1dHVyZVxuc3RhdGVtZW50IGlzIGludGVuZGVkIHRvIGVhc2UgbWlncmF0aW9uIHRvIGZ1dHVyZSB2ZXJzaW9ucyBvZiBQeXRob25cbnRoYXQgaW50cm9kdWNlIGluY29tcGF0aWJsZSBjaGFuZ2VzIHRvIHRoZSBsYW5ndWFnZS4gIEl0IGFsbG93cyB1c2Ugb2ZcbnRoZSBuZXcgZmVhdHVyZXMgb24gYSBwZXItbW9kdWxlIGJhc2lzIGJlZm9yZSB0aGUgcmVsZWFzZSBpbiB3aGljaCB0aGVcbmZlYXR1cmUgYmVjb21lcyBzdGFuZGFyZC5cblxuICAgZnV0dXJlX3N0YXRlbWVudCA6Oj0gImZyb20iICJfX2Z1dHVyZV9fIiAiaW1wb3J0IiBmZWF0dXJlIFsiYXMiIG5hbWVdXG4gICAgICAgICAgICAgICAgICAgICAgICAoIiwiIGZlYXR1cmUgWyJhcyIgbmFtZV0pKlxuICAgICAgICAgICAgICAgICAgICAgICAgfCAiZnJvbSIgIl9fZnV0dXJlX18iICJpbXBvcnQiICIoIiBmZWF0dXJlIFsiYXMiIG5hbWVdXG4gICAgICAgICAgICAgICAgICAgICAgICAoIiwiIGZlYXR1cmUgWyJhcyIgbmFtZV0pKiBbIiwiXSAiKSJcbiAgIGZlYXR1cmUgICAgICAgICAgOjo9IGlkZW50aWZpZXJcbiAgIG5hbWUgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXJcblxuQSBmdXR1cmUgc3RhdGVtZW50IG11c3QgYXBwZWFyIG5lYXIgdGhlIHRvcCBvZiB0aGUgbW9kdWxlLiAgVGhlIG9ubHlcbmxpbmVzIHRoYXQgY2FuIGFwcGVhciBiZWZvcmUgYSBmdXR1cmUgc3RhdGVtZW50IGFyZTpcblxuKiB0aGUgbW9kdWxlIGRvY3N0cmluZyAoaWYgYW55KSxcblxuKiBjb21tZW50cyxcblxuKiBibGFuayBsaW5lcywgYW5kXG5cbiogb3RoZXIgZnV0dXJlIHN0YXRlbWVudHMuXG5cblRoZSBmZWF0dXJlcyByZWNvZ25pemVkIGJ5IFB5dGhvbiAyLjYgYXJlIGBgdW5pY29kZV9saXRlcmFsc2BgLFxuYGBwcmludF9mdW5jdGlvbmBgLCBgYGFic29sdXRlX2ltcG9ydGBgLCBgYGRpdmlzaW9uYGAsIGBgZ2VuZXJhdG9yc2BgLFxuYGBuZXN0ZWRfc2NvcGVzYGAgYW5kIGBgd2l0aF9zdGF0ZW1lbnRgYC4gIGBgZ2VuZXJhdG9yc2BgLFxuYGB3aXRoX3N0YXRlbWVudGBgLCBgYG5lc3RlZF9zY29wZXNgYCBhcmUgcmVkdW5kYW50IGluIFB5dGhvbiB2ZXJzaW9uXG4yLjYgYW5kIGFib3ZlIGJlY2F1c2UgdGhleSBhcmUgYWx3YXlzIGVuYWJsZWQuXG5cbkEgZnV0dXJlIHN0YXRlbWVudCBpcyByZWNvZ25pemVkIGFuZCB0cmVhdGVkIHNwZWNpYWxseSBhdCBjb21waWxlXG50aW1lOiBDaGFuZ2VzIHRvIHRoZSBzZW1hbnRpY3Mgb2YgY29yZSBjb25zdHJ1Y3RzIGFyZSBvZnRlblxuaW1wbGVtZW50ZWQgYnkgZ2VuZXJhdGluZyBkaWZmZXJlbnQgY29kZS4gIEl0IG1heSBldmVuIGJlIHRoZSBjYXNlXG50aGF0IGEgbmV3IGZlYXR1cmUgaW50cm9kdWNlcyBuZXcgaW5jb21wYXRpYmxlIHN5bnRheCAoc3VjaCBhcyBhIG5ld1xucmVzZXJ2ZWQgd29yZCksIGluIHdoaWNoIGNhc2UgdGhlIGNvbXBpbGVyIG1heSBuZWVkIHRvIHBhcnNlIHRoZVxubW9kdWxlIGRpZmZlcmVudGx5LiAgU3VjaCBkZWNpc2lvbnMgY2Fubm90IGJlIHB1c2hlZCBvZmYgdW50aWxcbnJ1bnRpbWUuXG5cbkZvciBhbnkgZ2l2ZW4gcmVsZWFzZSwgdGhlIGNvbXBpbGVyIGtub3dzIHdoaWNoIGZlYXR1cmUgbmFtZXMgaGF2ZVxuYmVlbiBkZWZpbmVkLCBhbmQgcmFpc2VzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGEgZnV0dXJlIHN0YXRlbWVudFxuY29udGFpbnMgYSBmZWF0dXJlIG5vdCBrbm93biB0byBpdC5cblxuVGhlIGRpcmVjdCBydW50aW1lIHNlbWFudGljcyBhcmUgdGhlIHNhbWUgYXMgZm9yIGFueSBpbXBvcnQgc3RhdGVtZW50OlxudGhlcmUgaXMgYSBzdGFuZGFyZCBtb2R1bGUgYGBfX2Z1dHVyZV9fYGAsIGRlc2NyaWJlZCBsYXRlciwgYW5kIGl0XG53aWxsIGJlIGltcG9ydGVkIGluIHRoZSB1c3VhbCB3YXkgYXQgdGhlIHRpbWUgdGhlIGZ1dHVyZSBzdGF0ZW1lbnQgaXNcbmV4ZWN1dGVkLlxuXG5UaGUgaW50ZXJlc3RpbmcgcnVudGltZSBzZW1hbnRpY3MgZGVwZW5kIG9uIHRoZSBzcGVjaWZpYyBmZWF0dXJlXG5lbmFibGVkIGJ5IHRoZSBmdXR1cmUgc3RhdGVtZW50LlxuXG5Ob3RlIHRoYXQgdGhlcmUgaXMgbm90aGluZyBzcGVjaWFsIGFib3V0IHRoZSBzdGF0ZW1lbnQ6XG5cbiAgIGltcG9ydCBfX2Z1dHVyZV9fIFthcyBuYW1lXVxuXG5UaGF0IGlzIG5vdCBhIGZ1dHVyZSBzdGF0ZW1lbnQ7IGl0XCdzIGFuIG9yZGluYXJ5IGltcG9ydCBzdGF0ZW1lbnQgd2l0aFxubm8gc3BlY2lhbCBzZW1hbnRpY3Mgb3Igc3ludGF4IHJlc3RyaWN0aW9ucy5cblxuQ29kZSBjb21waWxlZCBieSBhbiBgYGV4ZWNgYCBzdGF0ZW1lbnQgb3IgY2FsbHMgdG8gdGhlIGJ1aWx0LWluXG5mdW5jdGlvbnMgYGBjb21waWxlKClgYCBhbmQgYGBleGVjZmlsZSgpYGAgdGhhdCBvY2N1ciBpbiBhIG1vZHVsZVxuYGBNYGAgY29udGFpbmluZyBhIGZ1dHVyZSBzdGF0ZW1lbnQgd2lsbCwgYnkgZGVmYXVsdCwgdXNlIHRoZSBuZXdcbnN5bnRheCBvciBzZW1hbnRpY3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBmdXR1cmUgc3RhdGVtZW50LiAgVGhpcyBjYW4sXG5zdGFydGluZyB3aXRoIFB5dGhvbiAyLjIgYmUgY29udHJvbGxlZCBieSBvcHRpb25hbCBhcmd1bWVudHMgdG9cbmBgY29tcGlsZSgpYGAgLS0tIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGF0IGZ1bmN0aW9uIGZvciBkZXRhaWxzLlxuXG5BIGZ1dHVyZSBzdGF0ZW1lbnQgdHlwZWQgYXQgYW4gaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgcHJvbXB0IHdpbGxcbnRha2UgZWZmZWN0IGZvciB0aGUgcmVzdCBvZiB0aGUgaW50ZXJwcmV0ZXIgc2Vzc2lvbi4gIElmIGFuXG5pbnRlcnByZXRlciBpcyBzdGFydGVkIHdpdGggdGhlICotaSogb3B0aW9uLCBpcyBwYXNzZWQgYSBzY3JpcHQgbmFtZVxudG8gZXhlY3V0ZSwgYW5kIHRoZSBzY3JpcHQgaW5jbHVkZXMgYSBmdXR1cmUgc3RhdGVtZW50LCBpdCB3aWxsIGJlIGluXG5lZmZlY3QgaW4gdGhlIGludGVyYWN0aXZlIHNlc3Npb24gc3RhcnRlZCBhZnRlciB0aGUgc2NyaXB0IGlzXG5leGVjdXRlZC5cblxuU2VlIGFsc286XG5cbiAgICoqUEVQIDIzNioqIC0gQmFjayB0byB0aGUgX19mdXR1cmVfX1xuICAgICAgVGhlIG9yaWdpbmFsIHByb3Bvc2FsIGZvciB0aGUgX19mdXR1cmVfXyBtZWNoYW5pc20uXG4nLAorICdpbic6ICdcbkNvbXBhcmlzb25zXG4qKioqKioqKioqKlxuXG5Vbmxpa2UgQywgYWxsIGNvbXBhcmlzb24gb3BlcmF0aW9ucyBpbiBQeXRob24gaGF2ZSB0aGUgc2FtZSBwcmlvcml0eSxcbndoaWNoIGlzIGxvd2VyIHRoYW4gdGhhdCBvZiBhbnkgYXJpdGhtZXRpYywgc2hpZnRpbmcgb3IgYml0d2lzZVxub3BlcmF0aW9uLiAgQWxzbyB1bmxpa2UgQywgZXhwcmVzc2lvbnMgbGlrZSBgYGEgPCBiIDwgY2BgIGhhdmUgdGhlXG5pbnRlcnByZXRhdGlvbiB0aGF0IGlzIGNvbnZlbnRpb25hbCBpbiBtYXRoZW1hdGljczpcblxuICAgY29tcGFyaXNvbiAgICA6Oj0gb3JfZXhwciAoIGNvbXBfb3BlcmF0b3Igb3JfZXhwciApKlxuICAgY29tcF9vcGVyYXRvciA6Oj0gIjwiIHwgIj4iIHwgIj09IiB8ICI+PSIgfCAiPD0iIHwgIjw+IiB8ICIhPSJcbiAgICAgICAgICAgICAgICAgICAgIHwgImlzIiBbIm5vdCJdIHwgWyJub3QiXSAiaW4iXG5cbkNvbXBhcmlzb25zIHlpZWxkIGJvb2xlYW4gdmFsdWVzOiBgYFRydWVgYCBvciBgYEZhbHNlYGAuXG5cbkNvbXBhcmlzb25zIGNhbiBiZSBjaGFpbmVkIGFyYml0cmFyaWx5LCBlLmcuLCBgYHggPCB5IDw9IHpgYCBpc1xuZXF1aXZhbGVudCB0byBgYHggPCB5IGFuZCB5IDw9IHpgYCwgZXhjZXB0IHRoYXQgYGB5YGAgaXMgZXZhbHVhdGVkXG5vbmx5IG9uY2UgKGJ1dCBpbiBib3RoIGNhc2VzIGBgemBgIGlzIG5vdCBldmFsdWF0ZWQgYXQgYWxsIHdoZW4gYGB4IDxcbnlgYCBpcyBmb3VuZCB0byBiZSBmYWxzZSkuXG5cbkZvcm1hbGx5LCBpZiAqYSosICpiKiwgKmMqLCAuLi4sICp5KiwgKnoqIGFyZSBleHByZXNzaW9ucyBhbmQgKm9wMSosXG4qb3AyKiwgLi4uLCAqb3BOKiBhcmUgY29tcGFyaXNvbiBvcGVyYXRvcnMsIHRoZW4gYGBhIG9wMSBiIG9wMiBjIC4uLiB5XG5vcE4gemBgIGlzIGVxdWl2YWxlbnQgdG8gYGBhIG9wMSBiIGFuZCBiIG9wMiBjIGFuZCAuLi4geSBvcE4gemBgLFxuZXhjZXB0IHRoYXQgZWFjaCBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBhdCBtb3N0IG9uY2UuXG5cbk5vdGUgdGhhdCBgYGEgb3AxIGIgb3AyIGNgYCBkb2VzblwndCBpbXBseSBhbnkga2luZCBvZiBjb21wYXJpc29uXG5iZXR3ZWVuICphKiBhbmQgKmMqLCBzbyB0aGF0LCBlLmcuLCBgYHggPCB5ID4gemBgIGlzIHBlcmZlY3RseSBsZWdhbFxuKHRob3VnaCBwZXJoYXBzIG5vdCBwcmV0dHkpLlxuXG5UaGUgZm9ybXMgYGA8PmBgIGFuZCBgYCE9YGAgYXJlIGVxdWl2YWxlbnQ7IGZvciBjb25zaXN0ZW5jeSB3aXRoIEMsXG5gYCE9YGAgaXMgcHJlZmVycmVkOyB3aGVyZSBgYCE9YGAgaXMgbWVudGlvbmVkIGJlbG93IGBgPD5gYCBpcyBhbHNvXG5hY2NlcHRlZC4gIFRoZSBgYDw+YGAgc3BlbGxpbmcgaXMgY29uc2lkZXJlZCBvYnNvbGVzY2VudC5cblxuVGhlIG9wZXJhdG9ycyBgYDxgYCwgYGA+YGAsIGBgPT1gYCwgYGA+PWBgLCBgYDw9YGAsIGFuZCBgYCE9YGAgY29tcGFyZVxudGhlIHZhbHVlcyBvZiB0d28gb2JqZWN0cy4gIFRoZSBvYmplY3RzIG5lZWQgbm90IGhhdmUgdGhlIHNhbWUgdHlwZS5cbklmIGJvdGggYXJlIG51bWJlcnMsIHRoZXkgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLiAgT3RoZXJ3aXNlLFxub2JqZWN0cyBvZiBkaWZmZXJlbnQgdHlwZXMgKmFsd2F5cyogY29tcGFyZSB1bmVxdWFsLCBhbmQgYXJlIG9yZGVyZWRcbmNvbnNpc3RlbnRseSBidXQgYXJiaXRyYXJpbHkuIFlvdSBjYW4gY29udHJvbCBjb21wYXJpc29uIGJlaGF2aW9yIG9mXG5vYmplY3RzIG9mIG5vbi1idWlsdC1pbiB0eXBlcyBieSBkZWZpbmluZyBhIGBgX19jbXBfX2BgIG1ldGhvZCBvciByaWNoXG5jb21wYXJpc29uIG1ldGhvZHMgbGlrZSBgYF9fZ3RfX2BgLCBkZXNjcmliZWQgaW4gc2VjdGlvbiAqU3BlY2lhbFxubWV0aG9kIG5hbWVzKi5cblxuKFRoaXMgdW51c3VhbCBkZWZpbml0aW9uIG9mIGNvbXBhcmlzb24gd2FzIHVzZWQgdG8gc2ltcGxpZnkgdGhlXG5kZWZpbml0aW9uIG9mIG9wZXJhdGlvbnMgbGlrZSBzb3J0aW5nIGFuZCB0aGUgYGBpbmBgIGFuZCBgYG5vdCBpbmBgXG5vcGVyYXRvcnMuIEluIHRoZSBmdXR1cmUsIHRoZSBjb21wYXJpc29uIHJ1bGVzIGZvciBvYmplY3RzIG9mXG5kaWZmZXJlbnQgdHlwZXMgYXJlIGxpa2VseSB0byBjaGFuZ2UuKVxuXG5Db21wYXJpc29uIG9mIG9iamVjdHMgb2YgdGhlIHNhbWUgdHlwZSBkZXBlbmRzIG9uIHRoZSB0eXBlOlxuXG4qIE51bWJlcnMgYXJlIGNvbXBhcmVkIGFyaXRobWV0aWNhbGx5LlxuXG4qIFN0cmluZ3MgYXJlIGNvbXBhcmVkIGxleGljb2dyYXBoaWNhbGx5IHVzaW5nIHRoZSBudW1lcmljIGVxdWl2YWxlbnRzXG4gICh0aGUgcmVzdWx0IG9mIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYG9yZCgpYGApIG9mIHRoZWlyIGNoYXJhY3RlcnMuXG4gIFVuaWNvZGUgYW5kIDgtYml0IHN0cmluZ3MgYXJlIGZ1bGx5IGludGVyb3BlcmFibGUgaW4gdGhpcyBiZWhhdmlvci5cbiAgWzRdXG5cbiogVHVwbGVzIGFuZCBsaXN0cyBhcmUgY29tcGFyZWQgbGV4aWNvZ3JhcGhpY2FsbHkgdXNpbmcgY29tcGFyaXNvbiBvZlxuICBjb3JyZXNwb25kaW5nIGVsZW1lbnRzLiAgVGhpcyBtZWFucyB0aGF0IHRvIGNvbXBhcmUgZXF1YWwsIGVhY2hcbiAgZWxlbWVudCBtdXN0IGNvbXBhcmUgZXF1YWwgYW5kIHRoZSB0d28gc2VxdWVuY2VzIG11c3QgYmUgb2YgdGhlIHNhbWVcbiAgdHlwZSBhbmQgaGF2ZSB0aGUgc2FtZSBsZW5ndGguXG5cbiAgSWYgbm90IGVxdWFsLCB0aGUgc2VxdWVuY2VzIGFyZSBvcmRlcmVkIHRoZSBzYW1lIGFzIHRoZWlyIGZpcnN0XG4gIGRpZmZlcmluZyBlbGVtZW50cy4gIEZvciBleGFtcGxlLCBgYGNtcChbMSwyLHhdLCBbMSwyLHldKWBgIHJldHVybnNcbiAgdGhlIHNhbWUgYXMgYGBjbXAoeCx5KWBgLiAgSWYgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBkb2VzIG5vdFxuICBleGlzdCwgdGhlIHNob3J0ZXIgc2VxdWVuY2UgaXMgb3JkZXJlZCBmaXJzdCAoZm9yIGV4YW1wbGUsIGBgWzEsMl0gPFxuICBbMSwyLDNdYGApLlxuXG4qIE1hcHBpbmdzIChkaWN0aW9uYXJpZXMpIGNvbXBhcmUgZXF1YWwgaWYgYW5kIG9ubHkgaWYgdGhlaXIgc29ydGVkXG4gIChrZXksIHZhbHVlKSBsaXN0cyBjb21wYXJlIGVxdWFsLiBbNV0gT3V0Y29tZXMgb3RoZXIgdGhhbiBlcXVhbGl0eVxuICBhcmUgcmVzb2x2ZWQgY29uc2lzdGVudGx5LCBidXQgYXJlIG5vdCBvdGhlcndpc2UgZGVmaW5lZC4gWzZdXG5cbiogTW9zdCBvdGhlciBvYmplY3RzIG9mIGJ1aWx0LWluIHR5cGVzIGNvbXBhcmUgdW5lcXVhbCB1bmxlc3MgdGhleSBhcmVcbiAgdGhlIHNhbWUgb2JqZWN0OyB0aGUgY2hvaWNlIHdoZXRoZXIgb25lIG9iamVjdCBpcyBjb25zaWRlcmVkIHNtYWxsZXJcbiAgb3IgbGFyZ2VyIHRoYW4gYW5vdGhlciBvbmUgaXMgbWFkZSBhcmJpdHJhcmlseSBidXQgY29uc2lzdGVudGx5XG4gIHdpdGhpbiBvbmUgZXhlY3V0aW9uIG9mIGEgcHJvZ3JhbS5cblxuVGhlIG9wZXJhdG9ycyBgYGluYGAgYW5kIGBgbm90IGluYGAgdGVzdCBmb3IgY29sbGVjdGlvbiBtZW1iZXJzaGlwLlxuYGB4IGluIHNgYCBldmFsdWF0ZXMgdG8gdHJ1ZSBpZiAqeCogaXMgYSBtZW1iZXIgb2YgdGhlIGNvbGxlY3Rpb24gKnMqLFxuYW5kIGZhbHNlIG90aGVyd2lzZS4gIGBgeCBub3QgaW4gc2BgIHJldHVybnMgdGhlIG5lZ2F0aW9uIG9mIGBgeCBpblxuc2BgLiBUaGUgY29sbGVjdGlvbiBtZW1iZXJzaGlwIHRlc3QgaGFzIHRyYWRpdGlvbmFsbHkgYmVlbiBib3VuZCB0b1xuc2VxdWVuY2VzOyBhbiBvYmplY3QgaXMgYSBtZW1iZXIgb2YgYSBjb2xsZWN0aW9uIGlmIHRoZSBjb2xsZWN0aW9uIGlzXG5hIHNlcXVlbmNlIGFuZCBjb250YWlucyBhbiBlbGVtZW50IGVxdWFsIHRvIHRoYXQgb2JqZWN0LiAgSG93ZXZlciwgaXRcbm1ha2Ugc2Vuc2UgZm9yIG1hbnkgb3RoZXIgb2JqZWN0IHR5cGVzIHRvIHN1cHBvcnQgbWVtYmVyc2hpcCB0ZXN0c1xud2l0aG91dCBiZWluZyBhIHNlcXVlbmNlLiAgSW4gcGFydGljdWxhciwgZGljdGlvbmFyaWVzIChmb3Iga2V5cykgYW5kXG5zZXRzIHN1cHBvcnQgbWVtYmVyc2hpcCB0ZXN0aW5nLlxuXG5Gb3IgdGhlIGxpc3QgYW5kIHR1cGxlIHR5cGVzLCBgYHggaW4geWBgIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlcmVcbmV4aXN0cyBhbiBpbmRleCAqaSogc3VjaCB0aGF0IGBgeCA9PSB5W2ldYGAgaXMgdHJ1ZS5cblxuRm9yIHRoZSBVbmljb2RlIGFuZCBzdHJpbmcgdHlwZXMsIGBgeCBpbiB5YGAgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZlxuKngqIGlzIGEgc3Vic3RyaW5nIG9mICp5Ki4gIEFuIGVxdWl2YWxlbnQgdGVzdCBpcyBgYHkuZmluZCh4KSAhPSAtMWBgLlxuTm90ZSwgKngqIGFuZCAqeSogbmVlZCBub3QgYmUgdGhlIHNhbWUgdHlwZTsgY29uc2VxdWVudGx5LCBgYHVcJ2FiXCcgaW5cblwnYWJjXCdgYCB3aWxsIHJldHVybiBgYFRydWVgYC4gRW1wdHkgc3RyaW5ncyBhcmUgYWx3YXlzIGNvbnNpZGVyZWQgdG9cbmJlIGEgc3Vic3RyaW5nIG9mIGFueSBvdGhlciBzdHJpbmcsIHNvIGBgIiIgaW4gImFiYyJgYCB3aWxsIHJldHVyblxuYGBUcnVlYGAuXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAyLjM6IFByZXZpb3VzbHksICp4KiB3YXMgcmVxdWlyZWQgdG8gYmUgYSBzdHJpbmcgb2Zcbmxlbmd0aCBgYDFgYC5cblxuRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRlZmluZSB0aGUgYGBfX2NvbnRhaW5zX18oKWBgIG1ldGhvZCxcbmBgeCBpbiB5YGAgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiBgYHkuX19jb250YWluc19fKHgpYGAgaXMgdHJ1ZS5cblxuRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRvIG5vdCBkZWZpbmUgYGBfX2NvbnRhaW5zX18oKWBgIGJ1dCBkb1xuZGVmaW5lIGBgX19pdGVyX18oKWBgLCBgYHggaW4geWBgIGlzIHRydWUgaWYgc29tZSB2YWx1ZSBgYHpgYCB3aXRoIGBgeFxuPT0gemBgIGlzIHByb2R1Y2VkIHdoaWxlIGl0ZXJhdGluZyBvdmVyIGBgeWBgLiAgSWYgYW4gZXhjZXB0aW9uIGlzXG5yYWlzZWQgZHVyaW5nIHRoZSBpdGVyYXRpb24sIGl0IGlzIGFzIGlmIGBgaW5gYCByYWlzZWQgdGhhdCBleGNlcHRpb24uXG5cbkxhc3RseSwgdGhlIG9sZC1zdHlsZSBpdGVyYXRpb24gcHJvdG9jb2wgaXMgdHJpZWQ6IGlmIGEgY2xhc3MgZGVmaW5lc1xuYGBfX2dldGl0ZW1fXygpYGAsIGBgeCBpbiB5YGAgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGVyZSBpcyBhIG5vbi1cbm5lZ2F0aXZlIGludGVnZXIgaW5kZXggKmkqIHN1Y2ggdGhhdCBgYHggPT0geVtpXWBgLCBhbmQgYWxsIGxvd2VyXG5pbnRlZ2VyIGluZGljZXMgZG8gbm90IHJhaXNlIGBgSW5kZXhFcnJvcmBgIGV4Y2VwdGlvbi4gKElmIGFueSBvdGhlclxuZXhjZXB0aW9uIGlzIHJhaXNlZCwgaXQgaXMgYXMgaWYgYGBpbmBgIHJhaXNlZCB0aGF0IGV4Y2VwdGlvbikuXG5cblRoZSBvcGVyYXRvciBgYG5vdCBpbmBgIGlzIGRlZmluZWQgdG8gaGF2ZSB0aGUgaW52ZXJzZSB0cnVlIHZhbHVlIG9mXG5gYGluYGAuXG5cblRoZSBvcGVyYXRvcnMgYGBpc2BgIGFuZCBgYGlzIG5vdGBgIHRlc3QgZm9yIG9iamVjdCBpZGVudGl0eTogYGB4IGlzXG55YGAgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiAqeCogYW5kICp5KiBhcmUgdGhlIHNhbWUgb2JqZWN0LiAgYGB4IGlzXG5ub3QgeWBgIHlpZWxkcyB0aGUgaW52ZXJzZSB0cnV0aCB2YWx1ZS4gWzddXG4nLAorICdpbnRlZ2Vycyc6ICdcbkludGVnZXIgYW5kIGxvbmcgaW50ZWdlciBsaXRlcmFsc1xuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbkludGVnZXIgYW5kIGxvbmcgaW50ZWdlciBsaXRlcmFscyBhcmUgZGVzY3JpYmVkIGJ5IHRoZSBmb2xsb3dpbmdcbmxleGljYWwgZGVmaW5pdGlvbnM6XG5cbiAgIGxvbmdpbnRlZ2VyICAgIDo6PSBpbnRlZ2VyICgibCIgfCAiTCIpXG4gICBpbnRlZ2VyICAgICAgICA6Oj0gZGVjaW1hbGludGVnZXIgfCBvY3RpbnRlZ2VyIHwgaGV4aW50ZWdlciB8IGJpbmludGVnZXJcbiAgIGRlY2ltYWxpbnRlZ2VyIDo6PSBub256ZXJvZGlnaXQgZGlnaXQqIHwgIjAiXG4gICBvY3RpbnRlZ2VyICAgICA6Oj0gIjAiICgibyIgfCAiTyIpIG9jdGRpZ2l0KyB8ICIwIiBvY3RkaWdpdCtcbiAgIGhleGludGVnZXIgICAgIDo6PSAiMCIgKCJ4IiB8ICJYIikgaGV4ZGlnaXQrXG4gICBiaW5pbnRlZ2VyICAgICA6Oj0gIjAiICgiYiIgfCAiQiIpIGJpbmRpZ2l0K1xuICAgbm9uemVyb2RpZ2l0ICAgOjo9ICIxIi4uLiI5IlxuICAgb2N0ZGlnaXQgICAgICAgOjo9ICIwIi4uLiI3IlxuICAgYmluZGlnaXQgICAgICAgOjo9ICIwIiB8ICIxIlxuICAgaGV4ZGlnaXQgICAgICAgOjo9IGRpZ2l0IHwgImEiLi4uImYiIHwgIkEiLi4uIkYiXG5cbkFsdGhvdWdoIGJvdGggbG93ZXIgY2FzZSBgYFwnbFwnYGAgYW5kIHVwcGVyIGNhc2UgYGBcJ0xcJ2BgIGFyZSBhbGxvd2VkIGFzXG5zdWZmaXggZm9yIGxvbmcgaW50ZWdlcnMsIGl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGFsd2F5cyB1c2VcbmBgXCdMXCdgYCwgc2luY2UgdGhlIGxldHRlciBgYFwnbFwnYGAgbG9va3MgdG9vIG11Y2ggbGlrZSB0aGUgZGlnaXRcbmBgXCcxXCdgYC5cblxuUGxhaW4gaW50ZWdlciBsaXRlcmFscyB0aGF0IGFyZSBhYm92ZSB0aGUgbGFyZ2VzdCByZXByZXNlbnRhYmxlIHBsYWluXG5pbnRlZ2VyIChlLmcuLCAyMTQ3NDgzNjQ3IHdoZW4gdXNpbmcgMzItYml0IGFyaXRobWV0aWMpIGFyZSBhY2NlcHRlZFxuYXMgaWYgdGhleSB3ZXJlIGxvbmcgaW50ZWdlcnMgaW5zdGVhZC4gWzFdICBUaGVyZSBpcyBubyBsaW1pdCBmb3IgbG9uZ1xuaW50ZWdlciBsaXRlcmFscyBhcGFydCBmcm9tIHdoYXQgY2FuIGJlIHN0b3JlZCBpbiBhdmFpbGFibGUgbWVtb3J5LlxuXG5Tb21lIGV4YW1wbGVzIG9mIHBsYWluIGludGVnZXIgbGl0ZXJhbHMgKGZpcnN0IHJvdykgYW5kIGxvbmcgaW50ZWdlclxubGl0ZXJhbHMgKHNlY29uZCBhbmQgdGhpcmQgcm93cyk6XG5cbiAgIDcgICAgIDIxNDc0ODM2NDcgICAgICAgICAgICAgICAgICAgICAgICAwMTc3XG4gICAzTCAgICA3OTIyODE2MjUxNDI2NDMzNzU5MzU0Mzk1MDMzNkwgICAgMDM3N0wgICAweDEwMDAwMDAwMExcbiAgICAgICAgIDc5MjI4MTYyNTE0MjY0MzM3NTkzNTQzOTUwMzM2ICAgICAgICAgICAgIDB4ZGVhZGJlZWZcbicsCisgJ2xhbWJkYSc6ICdcbkxhbWJkYXNcbioqKioqKipcblxuICAgbGFtYmRhX2V4cHIgICAgIDo6PSAibGFtYmRhIiBbcGFyYW1ldGVyX2xpc3RdOiBleHByZXNzaW9uXG4gICBvbGRfbGFtYmRhX2V4cHIgOjo9ICJsYW1iZGEiIFtwYXJhbWV0ZXJfbGlzdF06IG9sZF9leHByZXNzaW9uXG5cbkxhbWJkYSBleHByZXNzaW9ucyAoc29tZXRpbWVzIGNhbGxlZCBsYW1iZGEgZm9ybXMpIGhhdmUgdGhlIHNhbWVcbnN5bnRhY3RpYyBwb3NpdGlvbiBhcyBleHByZXNzaW9ucy4gIFRoZXkgYXJlIGEgc2hvcnRoYW5kIHRvIGNyZWF0ZVxuYW5vbnltb3VzIGZ1bmN0aW9uczsgdGhlIGV4cHJlc3Npb24gYGBsYW1iZGEgYXJndW1lbnRzOiBleHByZXNzaW9uYGBcbnlpZWxkcyBhIGZ1bmN0aW9uIG9iamVjdC4gIFRoZSB1bm5hbWVkIG9iamVjdCBiZWhhdmVzIGxpa2UgYSBmdW5jdGlvblxub2JqZWN0IGRlZmluZWQgd2l0aFxuXG4gICBkZWYgbmFtZShhcmd1bWVudHMpOlxuICAgICAgIHJldHVybiBleHByZXNzaW9uXG5cblNlZSBzZWN0aW9uICpGdW5jdGlvbiBkZWZpbml0aW9ucyogZm9yIHRoZSBzeW50YXggb2YgcGFyYW1ldGVyIGxpc3RzLlxuTm90ZSB0aGF0IGZ1bmN0aW9ucyBjcmVhdGVkIHdpdGggbGFtYmRhIGV4cHJlc3Npb25zIGNhbm5vdCBjb250YWluXG5zdGF0ZW1lbnRzLlxuJywKKyAnbGlzdHMnOiAnXG5MaXN0IGRpc3BsYXlzXG4qKioqKioqKioqKioqXG5cbkEgbGlzdCBkaXNwbGF5IGlzIGEgcG9zc2libHkgZW1wdHkgc2VyaWVzIG9mIGV4cHJlc3Npb25zIGVuY2xvc2VkIGluXG5zcXVhcmUgYnJhY2tldHM6XG5cbiAgIGxpc3RfZGlzcGxheSAgICAgICAgOjo9ICJbIiBbZXhwcmVzc2lvbl9saXN0IHwgbGlzdF9jb21wcmVoZW5zaW9uXSAiXSJcbiAgIGxpc3RfY29tcHJlaGVuc2lvbiAgOjo9IGV4cHJlc3Npb24gbGlzdF9mb3JcbiAgIGxpc3RfZm9yICAgICAgICAgICAgOjo9ICJmb3IiIHRhcmdldF9saXN0ICJpbiIgb2xkX2V4cHJlc3Npb25fbGlzdCBbbGlzdF9pdGVyXVxuICAgb2xkX2V4cHJlc3Npb25fbGlzdCA6Oj0gb2xkX2V4cHJlc3Npb24gWygiLCIgb2xkX2V4cHJlc3Npb24pKyBbIiwiXV1cbiAgIG9sZF9leHByZXNzaW9uICAgICAgOjo9IG9yX3Rlc3QgfCBvbGRfbGFtYmRhX2V4cHJcbiAgIGxpc3RfaXRlciAgICAgICAgICAgOjo9IGxpc3RfZm9yIHwgbGlzdF9pZlxuICAgbGlzdF9pZiAgICAgICAgICAgICA6Oj0gImlmIiBvbGRfZXhwcmVzc2lvbiBbbGlzdF9pdGVyXVxuXG5BIGxpc3QgZGlzcGxheSB5aWVsZHMgYSBuZXcgbGlzdCBvYmplY3QuICBJdHMgY29udGVudHMgYXJlIHNwZWNpZmllZFxuYnkgcHJvdmlkaW5nIGVpdGhlciBhIGxpc3Qgb2YgZXhwcmVzc2lvbnMgb3IgYSBsaXN0IGNvbXByZWhlbnNpb24uXG5XaGVuIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZXhwcmVzc2lvbnMgaXMgc3VwcGxpZWQsIGl0cyBlbGVtZW50c1xuYXJlIGV2YWx1YXRlZCBmcm9tIGxlZnQgdG8gcmlnaHQgYW5kIHBsYWNlZCBpbnRvIHRoZSBsaXN0IG9iamVjdCBpblxudGhhdCBvcmRlci4gIFdoZW4gYSBsaXN0IGNvbXByZWhlbnNpb24gaXMgc3VwcGxpZWQsIGl0IGNvbnNpc3RzIG9mIGFcbnNpbmdsZSBleHByZXNzaW9uIGZvbGxvd2VkIGJ5IGF0IGxlYXN0IG9uZSBgYGZvcmBgIGNsYXVzZSBhbmQgemVybyBvclxubW9yZSBgYGZvcmBgIG9yIGBgaWZgYCBjbGF1c2VzLiAgSW4gdGhpcyBjYXNlLCB0aGUgZWxlbWVudHMgb2YgdGhlIG5ld1xubGlzdCBhcmUgdGhvc2UgdGhhdCB3b3VsZCBiZSBwcm9kdWNlZCBieSBjb25zaWRlcmluZyBlYWNoIG9mIHRoZVxuYGBmb3JgYCBvciBgYGlmYGAgY2xhdXNlcyBhIGJsb2NrLCBuZXN0aW5nIGZyb20gbGVmdCB0byByaWdodCwgYW5kXG5ldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uIHRvIHByb2R1Y2UgYSBsaXN0IGVsZW1lbnQgZWFjaCB0aW1lIHRoZVxuaW5uZXJtb3N0IGJsb2NrIGlzIHJlYWNoZWQgWzFdLlxuJywKKyAnbmFtaW5nJzogIlxuTmFtaW5nIGFuZCBiaW5kaW5nXG4qKioqKioqKioqKioqKioqKipcblxuKk5hbWVzKiByZWZlciB0byBvYmplY3RzLiAgTmFtZXMgYXJlIGludHJvZHVjZWQgYnkgbmFtZSBiaW5kaW5nXG5vcGVyYXRpb25zLiBFYWNoIG9jY3VycmVuY2Ugb2YgYSBuYW1lIGluIHRoZSBwcm9ncmFtIHRleHQgcmVmZXJzIHRvXG50aGUgKmJpbmRpbmcqIG9mIHRoYXQgbmFtZSBlc3RhYmxpc2hlZCBpbiB0aGUgaW5uZXJtb3N0IGZ1bmN0aW9uIGJsb2NrXG5jb250YWluaW5nIHRoZSB1c2UuXG5cbkEgKmJsb2NrKiBpcyBhIHBpZWNlIG9mIFB5dGhvbiBwcm9ncmFtIHRleHQgdGhhdCBpcyBleGVjdXRlZCBhcyBhXG51bml0LiBUaGUgZm9sbG93aW5nIGFyZSBibG9ja3M6IGEgbW9kdWxlLCBhIGZ1bmN0aW9uIGJvZHksIGFuZCBhIGNsYXNzXG5kZWZpbml0aW9uLiBFYWNoIGNvbW1hbmQgdHlwZWQgaW50ZXJhY3RpdmVseSBpcyBhIGJsb2NrLiAgQSBzY3JpcHRcbmZpbGUgKGEgZmlsZSBnaXZlbiBhcyBzdGFuZGFyZCBpbnB1dCB0byB0aGUgaW50ZXJwcmV0ZXIgb3Igc3BlY2lmaWVkXG5vbiB0aGUgaW50ZXJwcmV0ZXIgY29tbWFuZCBsaW5lIHRoZSBmaXJzdCBhcmd1bWVudCkgaXMgYSBjb2RlIGJsb2NrLlxuQSBzY3JpcHQgY29tbWFuZCAoYSBjb21tYW5kIHNwZWNpZmllZCBvbiB0aGUgaW50ZXJwcmV0ZXIgY29tbWFuZCBsaW5lXG53aXRoIHRoZSAnKiotYyoqJyBvcHRpb24pIGlzIGEgY29kZSBibG9jay4gIFRoZSBmaWxlIHJlYWQgYnkgdGhlXG5idWlsdC1pbiBmdW5jdGlvbiBgYGV4ZWNmaWxlKClgYCBpcyBhIGNvZGUgYmxvY2suICBUaGUgc3RyaW5nIGFyZ3VtZW50XG5wYXNzZWQgdG8gdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGBgZXZhbCgpYGAgYW5kIHRvIHRoZSBgYGV4ZWNgYFxuc3RhdGVtZW50IGlzIGEgY29kZSBibG9jay4gVGhlIGV4cHJlc3Npb24gcmVhZCBhbmQgZXZhbHVhdGVkIGJ5IHRoZVxuYnVpbHQtaW4gZnVuY3Rpb24gYGBpbnB1dCgpYGAgaXMgYSBjb2RlIGJsb2NrLlxuXG5BIGNvZGUgYmxvY2sgaXMgZXhlY3V0ZWQgaW4gYW4gKmV4ZWN1dGlvbiBmcmFtZSouICBBIGZyYW1lIGNvbnRhaW5zXG5zb21lIGFkbWluaXN0cmF0aXZlIGluZm9ybWF0aW9uICh1c2VkIGZvciBkZWJ1Z2dpbmcpIGFuZCBkZXRlcm1pbmVzXG53aGVyZSBhbmQgaG93IGV4ZWN1dGlvbiBjb250aW51ZXMgYWZ0ZXIgdGhlIGNvZGUgYmxvY2sncyBleGVjdXRpb24gaGFzXG5jb21wbGV0ZWQuXG5cbkEgKnNjb3BlKiBkZWZpbmVzIHRoZSB2aXNpYmlsaXR5IG9mIGEgbmFtZSB3aXRoaW4gYSBibG9jay4gIElmIGEgbG9jYWxcbnZhcmlhYmxlIGlzIGRlZmluZWQgaW4gYSBibG9jaywgaXRzIHNjb3BlIGluY2x1ZGVzIHRoYXQgYmxvY2suICBJZiB0aGVcbmRlZmluaXRpb24gb2NjdXJzIGluIGEgZnVuY3Rpb24gYmxvY2ssIHRoZSBzY29wZSBleHRlbmRzIHRvIGFueSBibG9ja3NcbmNvbnRhaW5lZCB3aXRoaW4gdGhlIGRlZmluaW5nIG9uZSwgdW5sZXNzIGEgY29udGFpbmVkIGJsb2NrIGludHJvZHVjZXNcbmEgZGlmZmVyZW50IGJpbmRpbmcgZm9yIHRoZSBuYW1lLiAgVGhlIHNjb3BlIG9mIG5hbWVzIGRlZmluZWQgaW4gYVxuY2xhc3MgYmxvY2sgaXMgbGltaXRlZCB0byB0aGUgY2xhc3MgYmxvY2s7IGl0IGRvZXMgbm90IGV4dGVuZCB0byB0aGVcbmNvZGUgYmxvY2tzIG9mIG1ldGhvZHMgLS0gdGhpcyBpbmNsdWRlcyBnZW5lcmF0b3IgZXhwcmVzc2lvbnMgc2luY2VcbnRoZXkgYXJlIGltcGxlbWVudGVkIHVzaW5nIGEgZnVuY3Rpb24gc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgdGhlXG5mb2xsb3dpbmcgd2lsbCBmYWlsOlxuXG4gICBjbGFzcyBBOlxuICAgICAgIGEgPSA0MlxuICAgICAgIGIgPSBsaXN0KGEgKyBpIGZvciBpIGluIHJhbmdlKDEwKSlcblxuV2hlbiBhIG5hbWUgaXMgdXNlZCBpbiBhIGNvZGUgYmxvY2ssIGl0IGlzIHJlc29sdmVkIHVzaW5nIHRoZSBuZWFyZXN0XG5lbmNsb3Npbmcgc2NvcGUuICBUaGUgc2V0IG9mIGFsbCBzdWNoIHNjb3BlcyB2aXNpYmxlIHRvIGEgY29kZSBibG9ja1xuaXMgY2FsbGVkIHRoZSBibG9jaydzICplbnZpcm9ubWVudCouXG5cbklmIGEgbmFtZSBpcyBib3VuZCBpbiBhIGJsb2NrLCBpdCBpcyBhIGxvY2FsIHZhcmlhYmxlIG9mIHRoYXQgYmxvY2suXG5JZiBhIG5hbWUgaXMgYm91bmQgYXQgdGhlIG1vZHVsZSBsZXZlbCwgaXQgaXMgYSBnbG9iYWwgdmFyaWFibGUuICAoVGhlXG52YXJpYWJsZXMgb2YgdGhlIG1vZHVsZSBjb2RlIGJsb2NrIGFyZSBsb2NhbCBhbmQgZ2xvYmFsLikgIElmIGFcbnZhcmlhYmxlIGlzIHVzZWQgaW4gYSBjb2RlIGJsb2NrIGJ1dCBub3QgZGVmaW5lZCB0aGVyZSwgaXQgaXMgYSAqZnJlZVxudmFyaWFibGUqLlxuXG5XaGVuIGEgbmFtZSBpcyBub3QgZm91bmQgYXQgYWxsLCBhIGBgTmFtZUVycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZC5cbklmIHRoZSBuYW1lIHJlZmVycyB0byBhIGxvY2FsIHZhcmlhYmxlIHRoYXQgaGFzIG5vdCBiZWVuIGJvdW5kLCBhXG5gYFVuYm91bmRMb2NhbEVycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZC4gIGBgVW5ib3VuZExvY2FsRXJyb3JgYCBpcyBhXG5zdWJjbGFzcyBvZiBgYE5hbWVFcnJvcmBgLlxuXG5UaGUgZm9sbG93aW5nIGNvbnN0cnVjdHMgYmluZCBuYW1lczogZm9ybWFsIHBhcmFtZXRlcnMgdG8gZnVuY3Rpb25zLFxuYGBpbXBvcnRgYCBzdGF0ZW1lbnRzLCBjbGFzcyBhbmQgZnVuY3Rpb24gZGVmaW5pdGlvbnMgKHRoZXNlIGJpbmQgdGhlXG5jbGFzcyBvciBmdW5jdGlvbiBuYW1lIGluIHRoZSBkZWZpbmluZyBibG9jayksIGFuZCB0YXJnZXRzIHRoYXQgYXJlXG5pZGVudGlmaWVycyBpZiBvY2N1cnJpbmcgaW4gYW4gYXNzaWdubWVudCwgYGBmb3JgYCBsb29wIGhlYWRlciwgaW4gdGhlXG5zZWNvbmQgcG9zaXRpb24gb2YgYW4gYGBleGNlcHRgYCBjbGF1c2UgaGVhZGVyIG9yIGFmdGVyIGBgYXNgYCBpbiBhXG5gYHdpdGhgYCBzdGF0ZW1lbnQuICBUaGUgYGBpbXBvcnRgYCBzdGF0ZW1lbnQgb2YgdGhlIGZvcm0gYGBmcm9tIC4uLlxuaW1wb3J0ICpgYCBiaW5kcyBhbGwgbmFtZXMgZGVmaW5lZCBpbiB0aGUgaW1wb3J0ZWQgbW9kdWxlLCBleGNlcHRcbnRob3NlIGJlZ2lubmluZyB3aXRoIGFuIHVuZGVyc2NvcmUuICBUaGlzIGZvcm0gbWF5IG9ubHkgYmUgdXNlZCBhdCB0aGVcbm1vZHVsZSBsZXZlbC5cblxuQSB0YXJnZXQgb2NjdXJyaW5nIGluIGEgYGBkZWxgYCBzdGF0ZW1lbnQgaXMgYWxzbyBjb25zaWRlcmVkIGJvdW5kIGZvclxudGhpcyBwdXJwb3NlICh0aG91Z2ggdGhlIGFjdHVhbCBzZW1hbnRpY3MgYXJlIHRvIHVuYmluZCB0aGUgbmFtZSkuICBJdFxuaXMgaWxsZWdhbCB0byB1bmJpbmQgYSBuYW1lIHRoYXQgaXMgcmVmZXJlbmNlZCBieSBhbiBlbmNsb3Npbmcgc2NvcGU7XG50aGUgY29tcGlsZXIgd2lsbCByZXBvcnQgYSBgYFN5bnRheEVycm9yYGAuXG5cbkVhY2ggYXNzaWdubWVudCBvciBpbXBvcnQgc3RhdGVtZW50IG9jY3VycyB3aXRoaW4gYSBibG9jayBkZWZpbmVkIGJ5IGFcbmNsYXNzIG9yIGZ1bmN0aW9uIGRlZmluaXRpb24gb3IgYXQgdGhlIG1vZHVsZSBsZXZlbCAodGhlIHRvcC1sZXZlbFxuY29kZSBibG9jaykuXG5cbklmIGEgbmFtZSBiaW5kaW5nIG9wZXJhdGlvbiBvY2N1cnMgYW55d2hlcmUgd2l0aGluIGEgY29kZSBibG9jaywgYWxsXG51c2VzIG9mIHRoZSBuYW1lIHdpdGhpbiB0aGUgYmxvY2sgYXJlIHRyZWF0ZWQgYXMgcmVmZXJlbmNlcyB0byB0aGVcbmN1cnJlbnQgYmxvY2suICBUaGlzIGNhbiBsZWFkIHRvIGVycm9ycyB3aGVuIGEgbmFtZSBpcyB1c2VkIHdpdGhpbiBhXG5ibG9jayBiZWZvcmUgaXQgaXMgYm91bmQuIFRoaXMgcnVsZSBpcyBzdWJ0bGUuICBQeXRob24gbGFja3NcbmRlY2xhcmF0aW9ucyBhbmQgYWxsb3dzIG5hbWUgYmluZGluZyBvcGVyYXRpb25zIHRvIG9jY3VyIGFueXdoZXJlXG53aXRoaW4gYSBjb2RlIGJsb2NrLiAgVGhlIGxvY2FsIHZhcmlhYmxlcyBvZiBhIGNvZGUgYmxvY2sgY2FuIGJlXG5kZXRlcm1pbmVkIGJ5IHNjYW5uaW5nIHRoZSBlbnRpcmUgdGV4dCBvZiB0aGUgYmxvY2sgZm9yIG5hbWUgYmluZGluZ1xub3BlcmF0aW9ucy5cblxuSWYgdGhlIGdsb2JhbCBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrLCBhbGwgdXNlcyBvZiB0aGUgbmFtZVxuc3BlY2lmaWVkIGluIHRoZSBzdGF0ZW1lbnQgcmVmZXIgdG8gdGhlIGJpbmRpbmcgb2YgdGhhdCBuYW1lIGluIHRoZVxudG9wLWxldmVsIG5hbWVzcGFjZS4gTmFtZXMgYXJlIHJlc29sdmVkIGluIHRoZSB0b3AtbGV2ZWwgbmFtZXNwYWNlIGJ5XG5zZWFyY2hpbmcgdGhlIGdsb2JhbCBuYW1lc3BhY2UsIGkuZS4gdGhlIG5hbWVzcGFjZSBvZiB0aGUgbW9kdWxlXG5jb250YWluaW5nIHRoZSBjb2RlIGJsb2NrLCBhbmQgdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSwgdGhlIG5hbWVzcGFjZVxub2YgdGhlIG1vZHVsZSBgYF9fYnVpbHRpbl9fYGAuICBUaGUgZ2xvYmFsIG5hbWVzcGFjZSBpcyBzZWFyY2hlZFxuZmlyc3QuICBJZiB0aGUgbmFtZSBpcyBub3QgZm91bmQgdGhlcmUsIHRoZSBidWlsdGlucyBuYW1lc3BhY2UgaXNcbnNlYXJjaGVkLiAgVGhlIGdsb2JhbCBzdGF0ZW1lbnQgbXVzdCBwcmVjZWRlIGFsbCB1c2VzIG9mIHRoZSBuYW1lLlxuXG5UaGUgYnVpbHRpbnMgbmFtZXNwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhlY3V0aW9uIG9mIGEgY29kZSBibG9ja1xuaXMgYWN0dWFsbHkgZm91bmQgYnkgbG9va2luZyB1cCB0aGUgbmFtZSBgYF9fYnVpbHRpbnNfX2BgIGluIGl0c1xuZ2xvYmFsIG5hbWVzcGFjZTsgdGhpcyBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5IG9yIGEgbW9kdWxlIChpbiB0aGVcbmxhdHRlciBjYXNlIHRoZSBtb2R1bGUncyBkaWN0aW9uYXJ5IGlzIHVzZWQpLiAgQnkgZGVmYXVsdCwgd2hlbiBpbiB0aGVcbmBgX19tYWluX19gYCBtb2R1bGUsIGBgX19idWlsdGluc19fYGAgaXMgdGhlIGJ1aWx0LWluIG1vZHVsZVxuYGBfX2J1aWx0aW5fX2BgIChub3RlOiBubyAncycpOyB3aGVuIGluIGFueSBvdGhlciBtb2R1bGUsXG5gYF9fYnVpbHRpbnNfX2BgIGlzIGFuIGFsaWFzIGZvciB0aGUgZGljdGlvbmFyeSBvZiB0aGUgYGBfX2J1aWx0aW5fX2BgXG5tb2R1bGUgaXRzZWxmLiAgYGBfX2J1aWx0aW5zX19gYCBjYW4gYmUgc2V0IHRvIGEgdXNlci1jcmVhdGVkXG5kaWN0aW9uYXJ5IHRvIGNyZWF0ZSBhIHdlYWsgZm9ybSBvZiByZXN0cmljdGVkIGV4ZWN1dGlvbi5cblxuKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBVc2VycyBzaG91bGQgbm90IHRvdWNoXG5gYF9fYnVpbHRpbnNfX2BgOyBpdCBpcyBzdHJpY3RseSBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuICBVc2Vyc1xud2FudGluZyB0byBvdmVycmlkZSB2YWx1ZXMgaW4gdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBzaG91bGQgYGBpbXBvcnRgYFxudGhlIGBgX19idWlsdGluX19gYCAobm8gJ3MnKSBtb2R1bGUgYW5kIG1vZGlmeSBpdHMgYXR0cmlidXRlc1xuYXBwcm9wcmlhdGVseS5cblxuVGhlIG5hbWVzcGFjZSBmb3IgYSBtb2R1bGUgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIHRoZSBmaXJzdCB0aW1lIGFcbm1vZHVsZSBpcyBpbXBvcnRlZC4gIFRoZSBtYWluIG1vZHVsZSBmb3IgYSBzY3JpcHQgaXMgYWx3YXlzIGNhbGxlZFxuYGBfX21haW5fX2BgLlxuXG5UaGUgYGBnbG9iYWxgYCBzdGF0ZW1lbnQgaGFzIHRoZSBzYW1lIHNjb3BlIGFzIGEgbmFtZSBiaW5kaW5nXG5vcGVyYXRpb24gaW4gdGhlIHNhbWUgYmxvY2suICBJZiB0aGUgbmVhcmVzdCBlbmNsb3Npbmcgc2NvcGUgZm9yIGFcbmZyZWUgdmFyaWFibGUgY29udGFpbnMgYSBnbG9iYWwgc3RhdGVtZW50LCB0aGUgZnJlZSB2YXJpYWJsZSBpc1xudHJlYXRlZCBhcyBhIGdsb2JhbC5cblxuQSBjbGFzcyBkZWZpbml0aW9uIGlzIGFuIGV4ZWN1dGFibGUgc3RhdGVtZW50IHRoYXQgbWF5IHVzZSBhbmQgZGVmaW5lXG5uYW1lcy4gVGhlc2UgcmVmZXJlbmNlcyBmb2xsb3cgdGhlIG5vcm1hbCBydWxlcyBmb3IgbmFtZSByZXNvbHV0aW9uLlxuVGhlIG5hbWVzcGFjZSBvZiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBiZWNvbWVzIHRoZSBhdHRyaWJ1dGUgZGljdGlvbmFyeVxub2YgdGhlIGNsYXNzLiAgTmFtZXMgZGVmaW5lZCBhdCB0aGUgY2xhc3Mgc2NvcGUgYXJlIG5vdCB2aXNpYmxlIGluXG5tZXRob2RzLlxuXG5cbkludGVyYWN0aW9uIHdpdGggZHluYW1pYyBmZWF0dXJlc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZXJlIGFyZSBzZXZlcmFsIGNhc2VzIHdoZXJlIFB5dGhvbiBzdGF0ZW1lbnRzIGFyZSBpbGxlZ2FsIHdoZW4gdXNlZFxuaW4gY29uanVuY3Rpb24gd2l0aCBuZXN0ZWQgc2NvcGVzIHRoYXQgY29udGFpbiBmcmVlIHZhcmlhYmxlcy5cblxuSWYgYSB2YXJpYWJsZSBpcyByZWZlcmVuY2VkIGluIGFuIGVuY2xvc2luZyBzY29wZSwgaXQgaXMgaWxsZWdhbCB0b1xuZGVsZXRlIHRoZSBuYW1lLiAgQW4gZXJyb3Igd2lsbCBiZSByZXBvcnRlZCBhdCBjb21waWxlIHRpbWUuXG5cbklmIHRoZSB3aWxkIGNhcmQgZm9ybSBvZiBpbXBvcnQgLS0tIGBgaW1wb3J0ICpgYCAtLS0gaXMgdXNlZCBpbiBhXG5mdW5jdGlvbiBhbmQgdGhlIGZ1bmN0aW9uIGNvbnRhaW5zIG9yIGlzIGEgbmVzdGVkIGJsb2NrIHdpdGggZnJlZVxudmFyaWFibGVzLCB0aGUgY29tcGlsZXIgd2lsbCByYWlzZSBhIGBgU3ludGF4RXJyb3JgYC5cblxuSWYgYGBleGVjYGAgaXMgdXNlZCBpbiBhIGZ1bmN0aW9uIGFuZCB0aGUgZnVuY3Rpb24gY29udGFpbnMgb3IgaXMgYVxubmVzdGVkIGJsb2NrIHdpdGggZnJlZSB2YXJpYWJsZXMsIHRoZSBjb21waWxlciB3aWxsIHJhaXNlIGFcbmBgU3ludGF4RXJyb3JgYCB1bmxlc3MgdGhlIGV4ZWMgZXhwbGljaXRseSBzcGVjaWZpZXMgdGhlIGxvY2FsXG5uYW1lc3BhY2UgZm9yIHRoZSBgYGV4ZWNgYC4gIChJbiBvdGhlciB3b3JkcywgYGBleGVjIG9iamBgIHdvdWxkIGJlXG5pbGxlZ2FsLCBidXQgYGBleGVjIG9iaiBpbiBuc2BgIHdvdWxkIGJlIGxlZ2FsLilcblxuVGhlIGBgZXZhbCgpYGAsIGBgZXhlY2ZpbGUoKWBgLCBhbmQgYGBpbnB1dCgpYGAgZnVuY3Rpb25zIGFuZCB0aGVcbmBgZXhlY2BgIHN0YXRlbWVudCBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGZ1bGwgZW52aXJvbm1lbnQgZm9yXG5yZXNvbHZpbmcgbmFtZXMuICBOYW1lcyBtYXkgYmUgcmVzb2x2ZWQgaW4gdGhlIGxvY2FsIGFuZCBnbG9iYWxcbm5hbWVzcGFjZXMgb2YgdGhlIGNhbGxlci4gIEZyZWUgdmFyaWFibGVzIGFyZSBub3QgcmVzb2x2ZWQgaW4gdGhlXG5uZWFyZXN0IGVuY2xvc2luZyBuYW1lc3BhY2UsIGJ1dCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gWzFdIFRoZVxuYGBleGVjYGAgc3RhdGVtZW50IGFuZCB0aGUgYGBldmFsKClgYCBhbmQgYGBleGVjZmlsZSgpYGAgZnVuY3Rpb25zXG5oYXZlIG9wdGlvbmFsIGFyZ3VtZW50cyB0byBvdmVycmlkZSB0aGUgZ2xvYmFsIGFuZCBsb2NhbCBuYW1lc3BhY2UuXG5JZiBvbmx5IG9uZSBuYW1lc3BhY2UgaXMgc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGZvciBib3RoLlxuIiwKKyAnbnVtYmVycyc6ICJcbk51bWVyaWMgbGl0ZXJhbHNcbioqKioqKioqKioqKioqKipcblxuVGhlcmUgYXJlIGZvdXIgdHlwZXMgb2YgbnVtZXJpYyBsaXRlcmFsczogcGxhaW4gaW50ZWdlcnMsIGxvbmdcbmludGVnZXJzLCBmbG9hdGluZyBwb2ludCBudW1iZXJzLCBhbmQgaW1hZ2luYXJ5IG51bWJlcnMuICBUaGVyZSBhcmUgbm9cbmNvbXBsZXggbGl0ZXJhbHMgKGNvbXBsZXggbnVtYmVycyBjYW4gYmUgZm9ybWVkIGJ5IGFkZGluZyBhIHJlYWxcbm51bWJlciBhbmQgYW4gaW1hZ2luYXJ5IG51bWJlcikuXG5cbk5vdGUgdGhhdCBudW1lcmljIGxpdGVyYWxzIGRvIG5vdCBpbmNsdWRlIGEgc2lnbjsgYSBwaHJhc2UgbGlrZSBgYC0xYGBcbmlzIGFjdHVhbGx5IGFuIGV4cHJlc3Npb24gY29tcG9zZWQgb2YgdGhlIHVuYXJ5IG9wZXJhdG9yICdgYC1gYCcgYW5kXG50aGUgbGl0ZXJhbCBgYDFgYC5cbiIsCisgJ251bWVyaWMtdHlwZXMnOiAnXG5FbXVsYXRpbmcgbnVtZXJpYyB0eXBlc1xuKioqKioqKioqKioqKioqKioqKioqKipcblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGVtdWxhdGUgbnVtZXJpYyBvYmplY3RzLlxuTWV0aG9kcyBjb3JyZXNwb25kaW5nIHRvIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGVcbnBhcnRpY3VsYXIga2luZCBvZiBudW1iZXIgaW1wbGVtZW50ZWQgKGUuZy4sIGJpdHdpc2Ugb3BlcmF0aW9ucyBmb3Jcbm5vbi1pbnRlZ3JhbCBudW1iZXJzKSBzaG91bGQgYmUgbGVmdCB1bmRlZmluZWQuXG5cbm9iamVjdC5fX2FkZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fc3ViX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19tdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2Zsb29yZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19tb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2Rpdm1vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcG93X18oc2VsZiwgb3RoZXJbLCBtb2R1bG9dKVxub2JqZWN0Ll9fbHNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2FuZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9feG9yX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19vcl9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnkgYXJpdGhtZXRpY1xuICAgb3BlcmF0aW9ucyAoYGArYGAsIGBgLWBgLCBgYCpgYCwgYGAvL2BgLCBgYCVgYCwgYGBkaXZtb2QoKWBgLFxuICAgYGBwb3coKWBgLCBgYCoqYGAsIGBgPDxgYCwgYGA+PmBgLCBgYCZgYCwgYGBeYGAsIGBgfGBgKS4gIEZvclxuICAgaW5zdGFuY2UsIHRvIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uIGBgeCArIHlgYCwgd2hlcmUgKngqIGlzIGFuXG4gICBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQgaGFzIGFuIGBgX19hZGRfXygpYGAgbWV0aG9kLFxuICAgYGB4Ll9fYWRkX18oeSlgYCBpcyBjYWxsZWQuICBUaGUgYGBfX2Rpdm1vZF9fKClgYCBtZXRob2Qgc2hvdWxkIGJlXG4gICB0aGUgZXF1aXZhbGVudCB0byB1c2luZyBgYF9fZmxvb3JkaXZfXygpYGAgYW5kIGBgX19tb2RfXygpYGA7IGl0XG4gICBzaG91bGQgbm90IGJlIHJlbGF0ZWQgdG8gYGBfX3RydWVkaXZfXygpYGAgKGRlc2NyaWJlZCBiZWxvdykuICBOb3RlXG4gICB0aGF0IGBgX19wb3dfXygpYGAgc2hvdWxkIGJlIGRlZmluZWQgdG8gYWNjZXB0IGFuIG9wdGlvbmFsIHRoaXJkXG4gICBhcmd1bWVudCBpZiB0aGUgdGVybmFyeSB2ZXJzaW9uIG9mIHRoZSBidWlsdC1pbiBgYHBvdygpYGAgZnVuY3Rpb25cbiAgIGlzIHRvIGJlIHN1cHBvcnRlZC5cblxuICAgSWYgb25lIG9mIHRob3NlIG1ldGhvZHMgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uIHdpdGggdGhlXG4gICBzdXBwbGllZCBhcmd1bWVudHMsIGl0IHNob3VsZCByZXR1cm4gYGBOb3RJbXBsZW1lbnRlZGBgLlxuXG5vYmplY3QuX19kaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3RydWVkaXZfXyhzZWxmLCBvdGhlcilcblxuICAgVGhlIGRpdmlzaW9uIG9wZXJhdG9yIChgYC9gYCkgaXMgaW1wbGVtZW50ZWQgYnkgdGhlc2UgbWV0aG9kcy4gIFRoZVxuICAgYGBfX3RydWVkaXZfXygpYGAgbWV0aG9kIGlzIHVzZWQgd2hlbiBgYF9fZnV0dXJlX18uZGl2aXNpb25gYCBpcyBpblxuICAgZWZmZWN0LCBvdGhlcndpc2UgYGBfX2Rpdl9fKClgYCBpcyB1c2VkLiAgSWYgb25seSBvbmUgb2YgdGhlc2UgdHdvXG4gICBtZXRob2RzIGlzIGRlZmluZWQsIHRoZSBvYmplY3Qgd2lsbCBub3Qgc3VwcG9ydCBkaXZpc2lvbiBpbiB0aGVcbiAgIGFsdGVybmF0ZSBjb250ZXh0OyBgYFR5cGVFcnJvcmBgIHdpbGwgYmUgcmFpc2VkIGluc3RlYWQuXG5cbm9iamVjdC5fX3JhZGRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JzdWJfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JtdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3J0cnVlZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jtb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JkaXZtb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jwb3dfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jsc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jyc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JhbmRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3J4b3JfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jvcl9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnkgYXJpdGhtZXRpY1xuICAgb3BlcmF0aW9ucyAoYGArYGAsIGBgLWBgLCBgYCpgYCwgYGAvYGAsIGBgJWBgLCBgYGRpdm1vZCgpYGAsXG4gICBgYHBvdygpYGAsIGBgKipgYCwgYGA8PGBgLCBgYD4+YGAsIGBgJmBgLCBgYF5gYCwgYGB8YGApIHdpdGhcbiAgIHJlZmxlY3RlZCAoc3dhcHBlZCkgb3BlcmFuZHMuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgY2FsbGVkIGlmXG4gICB0aGUgbGVmdCBvcGVyYW5kIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uIGFuZFxuICAgdGhlIG9wZXJhbmRzIGFyZSBvZiBkaWZmZXJlbnQgdHlwZXMuIFsyXSBGb3IgaW5zdGFuY2UsIHRvIGV2YWx1YXRlXG4gICB0aGUgZXhwcmVzc2lvbiBgYHggLSB5YGAsIHdoZXJlICp5KiBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXRcbiAgIGhhcyBhbiBgYF9fcnN1Yl9fKClgYCBtZXRob2QsIGBgeS5fX3JzdWJfXyh4KWBgIGlzIGNhbGxlZCBpZlxuICAgYGB4Ll9fc3ViX18oeSlgYCByZXR1cm5zICpOb3RJbXBsZW1lbnRlZCouXG5cbiAgIE5vdGUgdGhhdCB0ZXJuYXJ5IGBgcG93KClgYCB3aWxsIG5vdCB0cnkgY2FsbGluZyBgYF9fcnBvd19fKClgYFxuICAgKHRoZSBjb2VyY2lvbiBydWxlcyB3b3VsZCBiZWNvbWUgdG9vIGNvbXBsaWNhdGVkKS5cblxuICAgTm90ZTogSWYgdGhlIHJpZ2h0IG9wZXJhbmRcJ3MgdHlwZSBpcyBhIHN1YmNsYXNzIG9mIHRoZSBsZWZ0IG9wZXJhbmRcJ3NcbiAgICAgdHlwZSBhbmQgdGhhdCBzdWJjbGFzcyBwcm92aWRlcyB0aGUgcmVmbGVjdGVkIG1ldGhvZCBmb3IgdGhlXG4gICAgIG9wZXJhdGlvbiwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBsZWZ0IG9wZXJhbmRcJ3NcbiAgICAgbm9uLXJlZmxlY3RlZCBtZXRob2QuICBUaGlzIGJlaGF2aW9yIGFsbG93cyBzdWJjbGFzc2VzIHRvXG4gICAgIG92ZXJyaWRlIHRoZWlyIGFuY2VzdG9yc1wnIG9wZXJhdGlvbnMuXG5cbm9iamVjdC5fX2lhZGRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lzdWJfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2ltdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2l0cnVlZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2ltb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lwb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pXG5vYmplY3QuX19pbHNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pcnNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pYW5kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19peG9yX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pb3JfXyhzZWxmLCBvdGhlcilcblxuICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYXVnbWVudGVkIGFyaXRobWV0aWNcbiAgIGFzc2lnbm1lbnRzIChgYCs9YGAsIGBgLT1gYCwgYGAqPWBgLCBgYC89YGAsIGBgLy89YGAsIGBgJT1gYCxcbiAgIGBgKio9YGAsIGBgPDw9YGAsIGBgPj49YGAsIGBgJj1gYCwgYGBePWBgLCBgYHw9YGApLiAgVGhlc2UgbWV0aG9kc1xuICAgc2hvdWxkIGF0dGVtcHQgdG8gZG8gdGhlIG9wZXJhdGlvbiBpbi1wbGFjZSAobW9kaWZ5aW5nICpzZWxmKikgYW5kXG4gICByZXR1cm4gdGhlIHJlc3VsdCAod2hpY2ggY291bGQgYmUsIGJ1dCBkb2VzIG5vdCBoYXZlIHRvIGJlLFxuICAgKnNlbGYqKS4gIElmIGEgc3BlY2lmaWMgbWV0aG9kIGlzIG5vdCBkZWZpbmVkLCB0aGUgYXVnbWVudGVkXG4gICBhc3NpZ25tZW50IGZhbGxzIGJhY2sgdG8gdGhlIG5vcm1hbCBtZXRob2RzLiAgRm9yIGluc3RhbmNlLCB0b1xuICAgZXhlY3V0ZSB0aGUgc3RhdGVtZW50IGBgeCArPSB5YGAsIHdoZXJlICp4KiBpcyBhbiBpbnN0YW5jZSBvZiBhXG4gICBjbGFzcyB0aGF0IGhhcyBhbiBgYF9faWFkZF9fKClgYCBtZXRob2QsIGBgeC5fX2lhZGRfXyh5KWBgIGlzXG4gICBjYWxsZWQuICBJZiAqeCogaXMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGRvZXMgbm90IGRlZmluZSBhXG4gICBgYF9faWFkZF9fKClgYCBtZXRob2QsIGBgeC5fX2FkZF9fKHkpYGAgYW5kIGBgeS5fX3JhZGRfXyh4KWBgIGFyZVxuICAgY29uc2lkZXJlZCwgYXMgd2l0aCB0aGUgZXZhbHVhdGlvbiBvZiBgYHggKyB5YGAuXG5cbm9iamVjdC5fX25lZ19fKHNlbGYpXG5vYmplY3QuX19wb3NfXyhzZWxmKVxub2JqZWN0Ll9fYWJzX18oc2VsZilcbm9iamVjdC5fX2ludmVydF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIHVuYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9ucyAoYGAtYGAsIGBgK2BgLFxuICAgYGBhYnMoKWBgIGFuZCBgYH5gYCkuXG5cbm9iamVjdC5fX2NvbXBsZXhfXyhzZWxmKVxub2JqZWN0Ll9faW50X18oc2VsZilcbm9iamVjdC5fX2xvbmdfXyhzZWxmKVxub2JqZWN0Ll9fZmxvYXRfXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgYGBjb21wbGV4KClgYCxcbiAgIGBgaW50KClgYCwgYGBsb25nKClgYCwgYW5kIGBgZmxvYXQoKWBgLiAgU2hvdWxkIHJldHVybiBhIHZhbHVlIG9mXG4gICB0aGUgYXBwcm9wcmlhdGUgdHlwZS5cblxub2JqZWN0Ll9fb2N0X18oc2VsZilcbm9iamVjdC5fX2hleF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyBgYG9jdCgpYGAgYW5kIGBgaGV4KClgYC5cbiAgIFNob3VsZCByZXR1cm4gYSBzdHJpbmcgdmFsdWUuXG5cbm9iamVjdC5fX2luZGV4X18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBgYG9wZXJhdG9yLmluZGV4KClgYC4gIEFsc28gY2FsbGVkIHdoZW5ldmVyXG4gICBQeXRob24gbmVlZHMgYW4gaW50ZWdlciBvYmplY3QgKHN1Y2ggYXMgaW4gc2xpY2luZykuICBNdXN0IHJldHVyblxuICAgYW4gaW50ZWdlciAoaW50IG9yIGxvbmcpLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjUuXG5cbm9iamVjdC5fX2NvZXJjZV9fKHNlbGYsIG90aGVyKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50ICJtaXhlZC1tb2RlIiBudW1lcmljIGFyaXRobWV0aWMuICBTaG91bGQgZWl0aGVyXG4gICByZXR1cm4gYSAyLXR1cGxlIGNvbnRhaW5pbmcgKnNlbGYqIGFuZCAqb3RoZXIqIGNvbnZlcnRlZCB0byBhXG4gICBjb21tb24gbnVtZXJpYyB0eXBlLCBvciBgYE5vbmVgYCBpZiBjb252ZXJzaW9uIGlzIGltcG9zc2libGUuICBXaGVuXG4gICB0aGUgY29tbW9uIHR5cGUgd291bGQgYmUgdGhlIHR5cGUgb2YgYGBvdGhlcmBgLCBpdCBpcyBzdWZmaWNpZW50IHRvXG4gICByZXR1cm4gYGBOb25lYGAsIHNpbmNlIHRoZSBpbnRlcnByZXRlciB3aWxsIGFsc28gYXNrIHRoZSBvdGhlclxuICAgb2JqZWN0IHRvIGF0dGVtcHQgYSBjb2VyY2lvbiAoYnV0IHNvbWV0aW1lcywgaWYgdGhlIGltcGxlbWVudGF0aW9uXG4gICBvZiB0aGUgb3RoZXIgdHlwZSBjYW5ub3QgYmUgY2hhbmdlZCwgaXQgaXMgdXNlZnVsIHRvIGRvIHRoZVxuICAgY29udmVyc2lvbiB0byB0aGUgb3RoZXIgdHlwZSBoZXJlKS4gIEEgcmV0dXJuIHZhbHVlIG9mXG4gICBgYE5vdEltcGxlbWVudGVkYGAgaXMgZXF1aXZhbGVudCB0byByZXR1cm5pbmcgYGBOb25lYGAuXG4nLAorICdvYmplY3RzJzogJ1xuT2JqZWN0cywgdmFsdWVzIGFuZCB0eXBlc1xuKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4qT2JqZWN0cyogYXJlIFB5dGhvblwncyBhYnN0cmFjdGlvbiBmb3IgZGF0YS4gIEFsbCBkYXRhIGluIGEgUHl0aG9uXG5wcm9ncmFtIGlzIHJlcHJlc2VudGVkIGJ5IG9iamVjdHMgb3IgYnkgcmVsYXRpb25zIGJldHdlZW4gb2JqZWN0cy4gKEluXG5hIHNlbnNlLCBhbmQgaW4gY29uZm9ybWFuY2UgdG8gVm9uIE5ldW1hbm5cJ3MgbW9kZWwgb2YgYSAic3RvcmVkXG5wcm9ncmFtIGNvbXB1dGVyLCIgY29kZSBpcyBhbHNvIHJlcHJlc2VudGVkIGJ5IG9iamVjdHMuKVxuXG5FdmVyeSBvYmplY3QgaGFzIGFuIGlkZW50aXR5LCBhIHR5cGUgYW5kIGEgdmFsdWUuICBBbiBvYmplY3RcJ3NcbippZGVudGl0eSogbmV2ZXIgY2hhbmdlcyBvbmNlIGl0IGhhcyBiZWVuIGNyZWF0ZWQ7IHlvdSBtYXkgdGhpbmsgb2YgaXRcbmFzIHRoZSBvYmplY3RcJ3MgYWRkcmVzcyBpbiBtZW1vcnkuICBUaGUgXCdgYGlzYGBcJyBvcGVyYXRvciBjb21wYXJlcyB0aGVcbmlkZW50aXR5IG9mIHR3byBvYmplY3RzOyB0aGUgYGBpZCgpYGAgZnVuY3Rpb24gcmV0dXJucyBhbiBpbnRlZ2VyXG5yZXByZXNlbnRpbmcgaXRzIGlkZW50aXR5IChjdXJyZW50bHkgaW1wbGVtZW50ZWQgYXMgaXRzIGFkZHJlc3MpLiBBblxub2JqZWN0XCdzICp0eXBlKiBpcyBhbHNvIHVuY2hhbmdlYWJsZS4gWzFdIEFuIG9iamVjdFwncyB0eXBlIGRldGVybWluZXNcbnRoZSBvcGVyYXRpb25zIHRoYXQgdGhlIG9iamVjdCBzdXBwb3J0cyAoZS5nLiwgImRvZXMgaXQgaGF2ZSBhXG5sZW5ndGg/IikgYW5kIGFsc28gZGVmaW5lcyB0aGUgcG9zc2libGUgdmFsdWVzIGZvciBvYmplY3RzIG9mIHRoYXRcbnR5cGUuICBUaGUgYGB0eXBlKClgYCBmdW5jdGlvbiByZXR1cm5zIGFuIG9iamVjdFwncyB0eXBlICh3aGljaCBpcyBhblxub2JqZWN0IGl0c2VsZikuICBUaGUgKnZhbHVlKiBvZiBzb21lIG9iamVjdHMgY2FuIGNoYW5nZS4gIE9iamVjdHNcbndob3NlIHZhbHVlIGNhbiBjaGFuZ2UgYXJlIHNhaWQgdG8gYmUgKm11dGFibGUqOyBvYmplY3RzIHdob3NlIHZhbHVlXG5pcyB1bmNoYW5nZWFibGUgb25jZSB0aGV5IGFyZSBjcmVhdGVkIGFyZSBjYWxsZWQgKmltbXV0YWJsZSouIChUaGVcbnZhbHVlIG9mIGFuIGltbXV0YWJsZSBjb250YWluZXIgb2JqZWN0IHRoYXQgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gYVxubXV0YWJsZSBvYmplY3QgY2FuIGNoYW5nZSB3aGVuIHRoZSBsYXR0ZXJcJ3MgdmFsdWUgaXMgY2hhbmdlZDsgaG93ZXZlclxudGhlIGNvbnRhaW5lciBpcyBzdGlsbCBjb25zaWRlcmVkIGltbXV0YWJsZSwgYmVjYXVzZSB0aGUgY29sbGVjdGlvbiBvZlxub2JqZWN0cyBpdCBjb250YWlucyBjYW5ub3QgYmUgY2hhbmdlZC4gIFNvLCBpbW11dGFiaWxpdHkgaXMgbm90XG5zdHJpY3RseSB0aGUgc2FtZSBhcyBoYXZpbmcgYW4gdW5jaGFuZ2VhYmxlIHZhbHVlLCBpdCBpcyBtb3JlIHN1YnRsZS4pXG5BbiBvYmplY3RcJ3MgbXV0YWJpbGl0eSBpcyBkZXRlcm1pbmVkIGJ5IGl0cyB0eXBlOyBmb3IgaW5zdGFuY2UsXG5udW1iZXJzLCBzdHJpbmdzIGFuZCB0dXBsZXMgYXJlIGltbXV0YWJsZSwgd2hpbGUgZGljdGlvbmFyaWVzIGFuZFxubGlzdHMgYXJlIG11dGFibGUuXG5cbk9iamVjdHMgYXJlIG5ldmVyIGV4cGxpY2l0bHkgZGVzdHJveWVkOyBob3dldmVyLCB3aGVuIHRoZXkgYmVjb21lXG51bnJlYWNoYWJsZSB0aGV5IG1heSBiZSBnYXJiYWdlLWNvbGxlY3RlZC4gIEFuIGltcGxlbWVudGF0aW9uIGlzXG5hbGxvd2VkIHRvIHBvc3Rwb25lIGdhcmJhZ2UgY29sbGVjdGlvbiBvciBvbWl0IGl0IGFsdG9nZXRoZXIgLS0tIGl0IGlzXG5hIG1hdHRlciBvZiBpbXBsZW1lbnRhdGlvbiBxdWFsaXR5IGhvdyBnYXJiYWdlIGNvbGxlY3Rpb24gaXNcbmltcGxlbWVudGVkLCBhcyBsb25nIGFzIG5vIG9iamVjdHMgYXJlIGNvbGxlY3RlZCB0aGF0IGFyZSBzdGlsbFxucmVhY2hhYmxlLlxuXG4qKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIENQeXRob24gY3VycmVudGx5IHVzZXMgYSByZWZlcmVuY2UtXG5jb3VudGluZyBzY2hlbWUgd2l0aCAob3B0aW9uYWwpIGRlbGF5ZWQgZGV0ZWN0aW9uIG9mIGN5Y2xpY2FsbHkgbGlua2VkXG5nYXJiYWdlLCB3aGljaCBjb2xsZWN0cyBtb3N0IG9iamVjdHMgYXMgc29vbiBhcyB0aGV5IGJlY29tZVxudW5yZWFjaGFibGUsIGJ1dCBpcyBub3QgZ3VhcmFudGVlZCB0byBjb2xsZWN0IGdhcmJhZ2UgY29udGFpbmluZ1xuY2lyY3VsYXIgcmVmZXJlbmNlcy4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgYGBnY2BgIG1vZHVsZSBmb3JcbmluZm9ybWF0aW9uIG9uIGNvbnRyb2xsaW5nIHRoZSBjb2xsZWN0aW9uIG9mIGN5Y2xpYyBnYXJiYWdlLiBPdGhlclxuaW1wbGVtZW50YXRpb25zIGFjdCBkaWZmZXJlbnRseSBhbmQgQ1B5dGhvbiBtYXkgY2hhbmdlLiBEbyBub3QgZGVwZW5kXG5vbiBpbW1lZGlhdGUgZmluYWxpemF0aW9uIG9mIG9iamVjdHMgd2hlbiB0aGV5IGJlY29tZSB1bnJlYWNoYWJsZSAoZXg6XG5hbHdheXMgY2xvc2UgZmlsZXMpLlxuXG5Ob3RlIHRoYXQgdGhlIHVzZSBvZiB0aGUgaW1wbGVtZW50YXRpb25cJ3MgdHJhY2luZyBvciBkZWJ1Z2dpbmdcbmZhY2lsaXRpZXMgbWF5IGtlZXAgb2JqZWN0cyBhbGl2ZSB0aGF0IHdvdWxkIG5vcm1hbGx5IGJlIGNvbGxlY3RhYmxlLlxuQWxzbyBub3RlIHRoYXQgY2F0Y2hpbmcgYW4gZXhjZXB0aW9uIHdpdGggYSBcJ2BgdHJ5YGAuLi5gYGV4Y2VwdGBgXCdcbnN0YXRlbWVudCBtYXkga2VlcCBvYmplY3RzIGFsaXZlLlxuXG5Tb21lIG9iamVjdHMgY29udGFpbiByZWZlcmVuY2VzIHRvICJleHRlcm5hbCIgcmVzb3VyY2VzIHN1Y2ggYXMgb3BlblxuZmlsZXMgb3Igd2luZG93cy4gIEl0IGlzIHVuZGVyc3Rvb2QgdGhhdCB0aGVzZSByZXNvdXJjZXMgYXJlIGZyZWVkXG53aGVuIHRoZSBvYmplY3QgaXMgZ2FyYmFnZS1jb2xsZWN0ZWQsIGJ1dCBzaW5jZSBnYXJiYWdlIGNvbGxlY3Rpb24gaXNcbm5vdCBndWFyYW50ZWVkIHRvIGhhcHBlbiwgc3VjaCBvYmplY3RzIGFsc28gcHJvdmlkZSBhbiBleHBsaWNpdCB3YXkgdG9cbnJlbGVhc2UgdGhlIGV4dGVybmFsIHJlc291cmNlLCB1c3VhbGx5IGEgYGBjbG9zZSgpYGAgbWV0aG9kLiBQcm9ncmFtc1xuYXJlIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGV4cGxpY2l0bHkgY2xvc2Ugc3VjaCBvYmplY3RzLiAgVGhlXG5cJ2BgdHJ5YGAuLi5gYGZpbmFsbHlgYFwnIHN0YXRlbWVudCBwcm92aWRlcyBhIGNvbnZlbmllbnQgd2F5IHRvIGRvXG50aGlzLlxuXG5Tb21lIG9iamVjdHMgY29udGFpbiByZWZlcmVuY2VzIHRvIG90aGVyIG9iamVjdHM7IHRoZXNlIGFyZSBjYWxsZWRcbipjb250YWluZXJzKi4gRXhhbXBsZXMgb2YgY29udGFpbmVycyBhcmUgdHVwbGVzLCBsaXN0cyBhbmRcbmRpY3Rpb25hcmllcy4gIFRoZSByZWZlcmVuY2VzIGFyZSBwYXJ0IG9mIGEgY29udGFpbmVyXCdzIHZhbHVlLiAgSW5cbm1vc3QgY2FzZXMsIHdoZW4gd2UgdGFsayBhYm91dCB0aGUgdmFsdWUgb2YgYSBjb250YWluZXIsIHdlIGltcGx5IHRoZVxudmFsdWVzLCBub3QgdGhlIGlkZW50aXRpZXMgb2YgdGhlIGNvbnRhaW5lZCBvYmplY3RzOyBob3dldmVyLCB3aGVuIHdlXG50YWxrIGFib3V0IHRoZSBtdXRhYmlsaXR5IG9mIGEgY29udGFpbmVyLCBvbmx5IHRoZSBpZGVudGl0aWVzIG9mIHRoZVxuaW1tZWRpYXRlbHkgY29udGFpbmVkIG9iamVjdHMgYXJlIGltcGxpZWQuICBTbywgaWYgYW4gaW1tdXRhYmxlXG5jb250YWluZXIgKGxpa2UgYSB0dXBsZSkgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gYSBtdXRhYmxlIG9iamVjdCwgaXRzXG52YWx1ZSBjaGFuZ2VzIGlmIHRoYXQgbXV0YWJsZSBvYmplY3QgaXMgY2hhbmdlZC5cblxuVHlwZXMgYWZmZWN0IGFsbW9zdCBhbGwgYXNwZWN0cyBvZiBvYmplY3QgYmVoYXZpb3IuICBFdmVuIHRoZVxuaW1wb3J0YW5jZSBvZiBvYmplY3QgaWRlbnRpdHkgaXMgYWZmZWN0ZWQgaW4gc29tZSBzZW5zZTogZm9yIGltbXV0YWJsZVxudHlwZXMsIG9wZXJhdGlvbnMgdGhhdCBjb21wdXRlIG5ldyB2YWx1ZXMgbWF5IGFjdHVhbGx5IHJldHVybiBhXG5yZWZlcmVuY2UgdG8gYW55IGV4aXN0aW5nIG9iamVjdCB3aXRoIHRoZSBzYW1lIHR5cGUgYW5kIHZhbHVlLCB3aGlsZVxuZm9yIG11dGFibGUgb2JqZWN0cyB0aGlzIGlzIG5vdCBhbGxvd2VkLiAgRS5nLiwgYWZ0ZXIgYGBhID0gMTsgYiA9XG4xYGAsIGBgYWBgIGFuZCBgYGJgYCBtYXkgb3IgbWF5IG5vdCByZWZlciB0byB0aGUgc2FtZSBvYmplY3Qgd2l0aCB0aGVcbnZhbHVlIG9uZSwgZGVwZW5kaW5nIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiwgYnV0IGFmdGVyIGBgYyA9IFtdOyBkID1cbltdYGAsIGBgY2BgIGFuZCBgYGRgYCBhcmUgZ3VhcmFudGVlZCB0byByZWZlciB0byB0d28gZGlmZmVyZW50LFxudW5pcXVlLCBuZXdseSBjcmVhdGVkIGVtcHR5IGxpc3RzLiAoTm90ZSB0aGF0IGBgYyA9IGQgPSBbXWBgIGFzc2lnbnNcbnRoZSBzYW1lIG9iamVjdCB0byBib3RoIGBgY2BgIGFuZCBgYGRgYC4pXG4nLAorICdvcGVyYXRvci1zdW1tYXJ5JzogJ1xuT3BlcmF0b3IgcHJlY2VkZW5jZVxuKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgZm9sbG93aW5nIHRhYmxlIHN1bW1hcml6ZXMgdGhlIG9wZXJhdG9yIHByZWNlZGVuY2VzIGluIFB5dGhvbixcbmZyb20gbG93ZXN0IHByZWNlZGVuY2UgKGxlYXN0IGJpbmRpbmcpIHRvIGhpZ2hlc3QgcHJlY2VkZW5jZSAobW9zdFxuYmluZGluZykuIE9wZXJhdG9ycyBpbiB0aGUgc2FtZSBib3ggaGF2ZSB0aGUgc2FtZSBwcmVjZWRlbmNlLiAgVW5sZXNzXG50aGUgc3ludGF4IGlzIGV4cGxpY2l0bHkgZ2l2ZW4sIG9wZXJhdG9ycyBhcmUgYmluYXJ5LiAgT3BlcmF0b3JzIGluXG50aGUgc2FtZSBib3ggZ3JvdXAgbGVmdCB0byByaWdodCAoZXhjZXB0IGZvciBjb21wYXJpc29ucywgaW5jbHVkaW5nXG50ZXN0cywgd2hpY2ggYWxsIGhhdmUgdGhlIHNhbWUgcHJlY2VkZW5jZSBhbmQgY2hhaW4gZnJvbSBsZWZ0IHRvIHJpZ2h0XG4tLS0gc2VlIHNlY3Rpb24gKkNvbXBhcmlzb25zKiAtLS0gYW5kIGV4cG9uZW50aWF0aW9uLCB3aGljaCBncm91cHNcbmZyb20gcmlnaHQgdG8gbGVmdCkuXG5cbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgT3BlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbnwgYGBsYW1iZGFgYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMYW1iZGEgZXhwcmVzc2lvbiAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBpZmBgIC0tIGBgZWxzZWBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDb25kaXRpb25hbCBleHByZXNzaW9uICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBvcmBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCb29sZWFuIE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBhbmRgYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCb29sZWFuIEFORCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBub3RgYCBgYHhgYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCb29sZWFuIE5PVCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBpbmBgLCBgYG5vdCBpbmBgLCBgYGlzYGAsIGBgaXMgbm90YGAsIGBgPGBgLCAgfCBDb21wYXJpc29ucywgaW5jbHVkaW5nIG1lbWJlcnNoaXAgICAgIHxcbnwgYGA8PWBgLCBgYD5gYCwgYGA+PWBgLCBgYDw+YGAsIGBgIT1gYCwgYGA9PWBgICAgfCB0ZXN0cyBhbmQgaWRlbnRpdHkgdGVzdHMgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGB8YGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCaXR3aXNlIE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBeYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCaXR3aXNlIFhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGAmYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCaXR3aXNlIEFORCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGA8PGBgLCBgYD4+YGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTaGlmdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGArYGAsIGBgLWBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24gICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGAqYGAsIGBgL2BgLCBgYC8vYGAsIGBgJWBgICAgICAgICAgICAgICAgICAgICAgfCBNdWx0aXBsaWNhdGlvbiwgZGl2aXNpb24sIHJlbWFpbmRlciAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBbOF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGAreGBgLCBgYC14YGAsIGBgfnhgYCAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQb3NpdGl2ZSwgbmVnYXRpdmUsIGJpdHdpc2UgTk9UICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGAqKmBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFeHBvbmVudGlhdGlvbiBbOV0gICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGB4W2luZGV4XWBgLCBgYHhbaW5kZXg6aW5kZXhdYGAsICAgICAgICAgICAgICAgfCBTdWJzY3JpcHRpb24sIHNsaWNpbmcsIGNhbGwsICAgICAgICAgIHxcbnwgYGB4KGFyZ3VtZW50cy4uLilgYCwgYGB4LmF0dHJpYnV0ZWBgICAgICAgICAgICAgfCBhdHRyaWJ1dGUgcmVmZXJlbmNlICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGAoZXhwcmVzc2lvbnMuLi4pYGAsIGBgW2V4cHJlc3Npb25zLi4uXWBgLCAgICAgfCBCaW5kaW5nIG9yIHR1cGxlIGRpc3BsYXksIGxpc3QgICAgICAgIHxcbnwgYGB7a2V5OiB2YWx1ZS4uLn1gYCwgYGBgZXhwcmVzc2lvbnMuLi5gYGAgICAgICAgfCBkaXNwbGF5LCBkaWN0aW9uYXJ5IGRpc3BsYXksIHN0cmluZyAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjb252ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuLVsgRm9vdG5vdGVzIF0tXG5cblsxXSBJbiBQeXRob24gMi4zIGFuZCBsYXRlciByZWxlYXNlcywgYSBsaXN0IGNvbXByZWhlbnNpb24gImxlYWtzIiB0aGVcbiAgICBjb250cm9sIHZhcmlhYmxlcyBvZiBlYWNoIGBgZm9yYGAgaXQgY29udGFpbnMgaW50byB0aGUgY29udGFpbmluZ1xuICAgIHNjb3BlLiAgSG93ZXZlciwgdGhpcyBiZWhhdmlvciBpcyBkZXByZWNhdGVkLCBhbmQgcmVseWluZyBvbiBpdFxuICAgIHdpbGwgbm90IHdvcmsgaW4gUHl0aG9uIDMuXG5cblsyXSBXaGlsZSBgYGFicyh4JXkpIDwgYWJzKHkpYGAgaXMgdHJ1ZSBtYXRoZW1hdGljYWxseSwgZm9yIGZsb2F0cyBpdFxuICAgIG1heSBub3QgYmUgdHJ1ZSBudW1lcmljYWxseSBkdWUgdG8gcm91bmRvZmYuICBGb3IgZXhhbXBsZSwgYW5kXG4gICAgYXNzdW1pbmcgYSBwbGF0Zm9ybSBvbiB3aGljaCBhIFB5dGhvbiBmbG9hdCBpcyBhbiBJRUVFIDc1NCBkb3VibGUtXG4gICAgcHJlY2lzaW9uIG51bWJlciwgaW4gb3JkZXIgdGhhdCBgYC0xZS0xMDAgJSAxZTEwMGBgIGhhdmUgdGhlIHNhbWVcbiAgICBzaWduIGFzIGBgMWUxMDBgYCwgdGhlIGNvbXB1dGVkIHJlc3VsdCBpcyBgYC0xZS0xMDAgKyAxZTEwMGBgLFxuICAgIHdoaWNoIGlzIG51bWVyaWNhbGx5IGV4YWN0bHkgZXF1YWwgdG8gYGAxZTEwMGBgLiAgVGhlIGZ1bmN0aW9uXG4gICAgYGBtYXRoLmZtb2QoKWBgIHJldHVybnMgYSByZXN1bHQgd2hvc2Ugc2lnbiBtYXRjaGVzIHRoZSBzaWduIG9mXG4gICAgdGhlIGZpcnN0IGFyZ3VtZW50IGluc3RlYWQsIGFuZCBzbyByZXR1cm5zIGBgLTFlLTEwMGBgIGluIHRoaXNcbiAgICBjYXNlLiBXaGljaCBhcHByb2FjaCBpcyBtb3JlIGFwcHJvcHJpYXRlIGRlcGVuZHMgb24gdGhlXG4gICAgYXBwbGljYXRpb24uXG5cblszXSBJZiB4IGlzIHZlcnkgY2xvc2UgdG8gYW4gZXhhY3QgaW50ZWdlciBtdWx0aXBsZSBvZiB5LCBpdFwnc1xuICAgIHBvc3NpYmxlIGZvciBgYGZsb29yKHgveSlgYCB0byBiZSBvbmUgbGFyZ2VyIHRoYW4gYGAoeC14JXkpL3lgYFxuICAgIGR1ZSB0byByb3VuZGluZy4gIEluIHN1Y2ggY2FzZXMsIFB5dGhvbiByZXR1cm5zIHRoZSBsYXR0ZXIgcmVzdWx0LFxuICAgIGluIG9yZGVyIHRvIHByZXNlcnZlIHRoYXQgYGBkaXZtb2QoeCx5KVswXSAqIHkgKyB4ICUgeWBgIGJlIHZlcnlcbiAgICBjbG9zZSB0byBgYHhgYC5cblxuWzRdIFdoaWxlIGNvbXBhcmlzb25zIGJldHdlZW4gdW5pY29kZSBzdHJpbmdzIG1ha2Ugc2Vuc2UgYXQgdGhlIGJ5dGVcbiAgICBsZXZlbCwgdGhleSBtYXkgYmUgY291bnRlci1pbnR1aXRpdmUgdG8gdXNlcnMuIEZvciBleGFtcGxlLCB0aGVcbiAgICBzdHJpbmdzIGBgdSJcXHUwMEM3ImBgIGFuZCBgYHUiXFx1MDA0M1xcdTAzMjciYGAgY29tcGFyZSBkaWZmZXJlbnRseSxcbiAgICBldmVuIHRob3VnaCB0aGV5IGJvdGggcmVwcmVzZW50IHRoZSBzYW1lIHVuaWNvZGUgY2hhcmFjdGVyIChMQVRJTlxuICAgIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBKS4gVG8gY29tcGFyZSBzdHJpbmdzIGluIGEgaHVtYW5cbiAgICByZWNvZ25pemFibGUgd2F5LCBjb21wYXJlIHVzaW5nIGBgdW5pY29kZWRhdGEubm9ybWFsaXplKClgYC5cblxuWzVdIFRoZSBpbXBsZW1lbnRhdGlvbiBjb21wdXRlcyB0aGlzIGVmZmljaWVudGx5LCB3aXRob3V0IGNvbnN0cnVjdGluZ1xuICAgIGxpc3RzIG9yIHNvcnRpbmcuXG5cbls2XSBFYXJsaWVyIHZlcnNpb25zIG9mIFB5dGhvbiB1c2VkIGxleGljb2dyYXBoaWMgY29tcGFyaXNvbiBvZiB0aGVcbiAgICBzb3J0ZWQgKGtleSwgdmFsdWUpIGxpc3RzLCBidXQgdGhpcyB3YXMgdmVyeSBleHBlbnNpdmUgZm9yIHRoZVxuICAgIGNvbW1vbiBjYXNlIG9mIGNvbXBhcmluZyBmb3IgZXF1YWxpdHkuICBBbiBldmVuIGVhcmxpZXIgdmVyc2lvbiBvZlxuICAgIFB5dGhvbiBjb21wYXJlZCBkaWN0aW9uYXJpZXMgYnkgaWRlbnRpdHkgb25seSwgYnV0IHRoaXMgY2F1c2VkXG4gICAgc3VycHJpc2VzIGJlY2F1c2UgcGVvcGxlIGV4cGVjdGVkIHRvIGJlIGFibGUgdG8gdGVzdCBhIGRpY3Rpb25hcnlcbiAgICBmb3IgZW1wdGluZXNzIGJ5IGNvbXBhcmluZyBpdCB0byBgYHt9YGAuXG5cbls3XSBEdWUgdG8gYXV0b21hdGljIGdhcmJhZ2UtY29sbGVjdGlvbiwgZnJlZSBsaXN0cywgYW5kIHRoZSBkeW5hbWljXG4gICAgbmF0dXJlIG9mIGRlc2NyaXB0b3JzLCB5b3UgbWF5IG5vdGljZSBzZWVtaW5nbHkgdW51c3VhbCBiZWhhdmlvdXJcbiAgICBpbiBjZXJ0YWluIHVzZXMgb2YgdGhlIGBgaXNgYCBvcGVyYXRvciwgbGlrZSB0aG9zZSBpbnZvbHZpbmdcbiAgICBjb21wYXJpc29ucyBiZXR3ZWVuIGluc3RhbmNlIG1ldGhvZHMsIG9yIGNvbnN0YW50cy4gIENoZWNrIHRoZWlyXG4gICAgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvLlxuXG5bOF0gVGhlIGBgJWBgIG9wZXJhdG9yIGlzIGFsc28gdXNlZCBmb3Igc3RyaW5nIGZvcm1hdHRpbmc7IHRoZSBzYW1lXG4gICAgcHJlY2VkZW5jZSBhcHBsaWVzLlxuXG5bOV0gVGhlIHBvd2VyIG9wZXJhdG9yIGBgKipgYCBiaW5kcyBsZXNzIHRpZ2h0bHkgdGhhbiBhbiBhcml0aG1ldGljIG9yXG4gICAgYml0d2lzZSB1bmFyeSBvcGVyYXRvciBvbiBpdHMgcmlnaHQsIHRoYXQgaXMsIGBgMioqLTFgYCBpc1xuICAgIGBgMC41YGAuXG4nLAorICdwYXNzJzogJ1xuVGhlIGBgcGFzc2BgIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKlxuXG4gICBwYXNzX3N0bXQgOjo9ICJwYXNzIlxuXG5gYHBhc3NgYCBpcyBhIG51bGwgb3BlcmF0aW9uIC0tLSB3aGVuIGl0IGlzIGV4ZWN1dGVkLCBub3RoaW5nIGhhcHBlbnMuXG5JdCBpcyB1c2VmdWwgYXMgYSBwbGFjZWhvbGRlciB3aGVuIGEgc3RhdGVtZW50IGlzIHJlcXVpcmVkXG5zeW50YWN0aWNhbGx5LCBidXQgbm8gY29kZSBuZWVkcyB0byBiZSBleGVjdXRlZCwgZm9yIGV4YW1wbGU6XG5cbiAgIGRlZiBmKGFyZyk6IHBhc3MgICAgIyBhIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3RoaW5nICh5ZXQpXG5cbiAgIGNsYXNzIEM6IHBhc3MgICAgICAgIyBhIGNsYXNzIHdpdGggbm8gbWV0aG9kcyAoeWV0KVxuJywKKyAncG93ZXInOiAnXG5UaGUgcG93ZXIgb3BlcmF0b3JcbioqKioqKioqKioqKioqKioqKlxuXG5UaGUgcG93ZXIgb3BlcmF0b3IgYmluZHMgbW9yZSB0aWdodGx5IHRoYW4gdW5hcnkgb3BlcmF0b3JzIG9uIGl0c1xubGVmdDsgaXQgYmluZHMgbGVzcyB0aWdodGx5IHRoYW4gdW5hcnkgb3BlcmF0b3JzIG9uIGl0cyByaWdodC4gIFRoZVxuc3ludGF4IGlzOlxuXG4gICBwb3dlciA6Oj0gcHJpbWFyeSBbIioqIiB1X2V4cHJdXG5cblRodXMsIGluIGFuIHVucGFyZW50aGVzaXplZCBzZXF1ZW5jZSBvZiBwb3dlciBhbmQgdW5hcnkgb3BlcmF0b3JzLCB0aGVcbm9wZXJhdG9ycyBhcmUgZXZhbHVhdGVkIGZyb20gcmlnaHQgdG8gbGVmdCAodGhpcyBkb2VzIG5vdCBjb25zdHJhaW5cbnRoZSBldmFsdWF0aW9uIG9yZGVyIGZvciB0aGUgb3BlcmFuZHMpOiBgYC0xKioyYGAgcmVzdWx0cyBpbiBgYC0xYGAuXG5cblRoZSBwb3dlciBvcGVyYXRvciBoYXMgdGhlIHNhbWUgc2VtYW50aWNzIGFzIHRoZSBidWlsdC1pbiBgYHBvdygpYGBcbmZ1bmN0aW9uLCB3aGVuIGNhbGxlZCB3aXRoIHR3byBhcmd1bWVudHM6IGl0IHlpZWxkcyBpdHMgbGVmdCBhcmd1bWVudFxucmFpc2VkIHRvIHRoZSBwb3dlciBvZiBpdHMgcmlnaHQgYXJndW1lbnQuICBUaGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlXG5maXJzdCBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS4gIFRoZSByZXN1bHQgdHlwZSBpcyB0aGF0IG9mIHRoZVxuYXJndW1lbnRzIGFmdGVyIGNvZXJjaW9uLlxuXG5XaXRoIG1peGVkIG9wZXJhbmQgdHlwZXMsIHRoZSBjb2VyY2lvbiBydWxlcyBmb3IgYmluYXJ5IGFyaXRobWV0aWNcbm9wZXJhdG9ycyBhcHBseS4gRm9yIGludCBhbmQgbG9uZyBpbnQgb3BlcmFuZHMsIHRoZSByZXN1bHQgaGFzIHRoZVxuc2FtZSB0eXBlIGFzIHRoZSBvcGVyYW5kcyAoYWZ0ZXIgY29lcmNpb24pIHVubGVzcyB0aGUgc2Vjb25kIGFyZ3VtZW50XG5pcyBuZWdhdGl2ZTsgaW4gdGhhdCBjYXNlLCBhbGwgYXJndW1lbnRzIGFyZSBjb252ZXJ0ZWQgdG8gZmxvYXQgYW5kIGFcbmZsb2F0IHJlc3VsdCBpcyBkZWxpdmVyZWQuIEZvciBleGFtcGxlLCBgYDEwKioyYGAgcmV0dXJucyBgYDEwMGBgLCBidXRcbmBgMTAqKi0yYGAgcmV0dXJucyBgYDAuMDFgYC4gKFRoaXMgbGFzdCBmZWF0dXJlIHdhcyBhZGRlZCBpbiBQeXRob25cbjIuMi4gSW4gUHl0aG9uIDIuMSBhbmQgYmVmb3JlLCBpZiBib3RoIGFyZ3VtZW50cyB3ZXJlIG9mIGludGVnZXIgdHlwZXNcbmFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IHdhcyBuZWdhdGl2ZSwgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQpLlxuXG5SYWlzaW5nIGBgMC4wYGAgdG8gYSBuZWdhdGl2ZSBwb3dlciByZXN1bHRzIGluIGFcbmBgWmVyb0RpdmlzaW9uRXJyb3JgYC4gUmFpc2luZyBhIG5lZ2F0aXZlIG51bWJlciB0byBhIGZyYWN0aW9uYWwgcG93ZXJcbnJlc3VsdHMgaW4gYSBgYFZhbHVlRXJyb3JgYC5cbicsCisgJ3ByaW50JzogJ1xuVGhlIGBgcHJpbnRgYCBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKioqXG5cbiAgIHByaW50X3N0bXQgOjo9ICJwcmludCIgKFtleHByZXNzaW9uICgiLCIgZXhwcmVzc2lvbikqIFsiLCJdXVxuICAgICAgICAgICAgICAgICAgfCAiPj4iIGV4cHJlc3Npb24gWygiLCIgZXhwcmVzc2lvbikrIFsiLCJdXSlcblxuYGBwcmludGBgIGV2YWx1YXRlcyBlYWNoIGV4cHJlc3Npb24gaW4gdHVybiBhbmQgd3JpdGVzIHRoZSByZXN1bHRpbmdcbm9iamVjdCB0byBzdGFuZGFyZCBvdXRwdXQgKHNlZSBiZWxvdykuICBJZiBhbiBvYmplY3QgaXMgbm90IGEgc3RyaW5nLFxuaXQgaXMgZmlyc3QgY29udmVydGVkIHRvIGEgc3RyaW5nIHVzaW5nIHRoZSBydWxlcyBmb3Igc3RyaW5nXG5jb252ZXJzaW9ucy4gIFRoZSAocmVzdWx0aW5nIG9yIG9yaWdpbmFsKSBzdHJpbmcgaXMgdGhlbiB3cml0dGVuLiAgQVxuc3BhY2UgaXMgd3JpdHRlbiBiZWZvcmUgZWFjaCBvYmplY3QgaXMgKGNvbnZlcnRlZCBhbmQpIHdyaXR0ZW4sIHVubGVzc1xudGhlIG91dHB1dCBzeXN0ZW0gYmVsaWV2ZXMgaXQgaXMgcG9zaXRpb25lZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGFcbmxpbmUuICBUaGlzIGlzIHRoZSBjYXNlICgxKSB3aGVuIG5vIGNoYXJhY3RlcnMgaGF2ZSB5ZXQgYmVlbiB3cml0dGVuXG50byBzdGFuZGFyZCBvdXRwdXQsICgyKSB3aGVuIHRoZSBsYXN0IGNoYXJhY3RlciB3cml0dGVuIHRvIHN0YW5kYXJkXG5vdXRwdXQgaXMgYSB3aGl0ZXNwYWNlIGNoYXJhY3RlciBleGNlcHQgYGBcJyBcJ2BgLCBvciAoMykgd2hlbiB0aGUgbGFzdFxud3JpdGUgb3BlcmF0aW9uIG9uIHN0YW5kYXJkIG91dHB1dCB3YXMgbm90IGEgYGBwcmludGBgIHN0YXRlbWVudC4gKEluXG5zb21lIGNhc2VzIGl0IG1heSBiZSBmdW5jdGlvbmFsIHRvIHdyaXRlIGFuIGVtcHR5IHN0cmluZyB0byBzdGFuZGFyZFxub3V0cHV0IGZvciB0aGlzIHJlYXNvbi4pXG5cbk5vdGU6IE9iamVjdHMgd2hpY2ggYWN0IGxpa2UgZmlsZSBvYmplY3RzIGJ1dCB3aGljaCBhcmUgbm90IHRoZSBidWlsdC1pblxuICBmaWxlIG9iamVjdHMgb2Z0ZW4gZG8gbm90IHByb3Blcmx5IGVtdWxhdGUgdGhpcyBhc3BlY3Qgb2YgdGhlIGZpbGVcbiAgb2JqZWN0XCdzIGJlaGF2aW9yLCBzbyBpdCBpcyBiZXN0IG5vdCB0byByZWx5IG9uIHRoaXMuXG5cbkEgYGBcJ1xcblwnYGAgY2hhcmFjdGVyIGlzIHdyaXR0ZW4gYXQgdGhlIGVuZCwgdW5sZXNzIHRoZSBgYHByaW50YGBcbnN0YXRlbWVudCBlbmRzIHdpdGggYSBjb21tYS4gIFRoaXMgaXMgdGhlIG9ubHkgYWN0aW9uIGlmIHRoZSBzdGF0ZW1lbnRcbmNvbnRhaW5zIGp1c3QgdGhlIGtleXdvcmQgYGBwcmludGBgLlxuXG5TdGFuZGFyZCBvdXRwdXQgaXMgZGVmaW5lZCBhcyB0aGUgZmlsZSBvYmplY3QgbmFtZWQgYGBzdGRvdXRgYCBpbiB0aGVcbmJ1aWx0LWluIG1vZHVsZSBgYHN5c2BgLiAgSWYgbm8gc3VjaCBvYmplY3QgZXhpc3RzLCBvciBpZiBpdCBkb2VzIG5vdFxuaGF2ZSBhIGBgd3JpdGUoKWBgIG1ldGhvZCwgYSBgYFJ1bnRpbWVFcnJvcmBgIGV4Y2VwdGlvbiBpcyByYWlzZWQuXG5cbmBgcHJpbnRgYCBhbHNvIGhhcyBhbiBleHRlbmRlZCBmb3JtLCBkZWZpbmVkIGJ5IHRoZSBzZWNvbmQgcG9ydGlvbiBvZlxudGhlIHN5bnRheCBkZXNjcmliZWQgYWJvdmUuIFRoaXMgZm9ybSBpcyBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXNcbiJgYHByaW50YGAgY2hldnJvbi4iIEluIHRoaXMgZm9ybSwgdGhlIGZpcnN0IGV4cHJlc3Npb24gYWZ0ZXIgdGhlXG5gYD4+YGAgbXVzdCBldmFsdWF0ZSB0byBhICJmaWxlLWxpa2UiIG9iamVjdCwgc3BlY2lmaWNhbGx5IGFuIG9iamVjdFxudGhhdCBoYXMgYSBgYHdyaXRlKClgYCBtZXRob2QgYXMgZGVzY3JpYmVkIGFib3ZlLiAgV2l0aCB0aGlzIGV4dGVuZGVkXG5mb3JtLCB0aGUgc3Vic2VxdWVudCBleHByZXNzaW9ucyBhcmUgcHJpbnRlZCB0byB0aGlzIGZpbGUgb2JqZWN0LiAgSWZcbnRoZSBmaXJzdCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBgYE5vbmVgYCwgdGhlbiBgYHN5cy5zdGRvdXRgYCBpc1xudXNlZCBhcyB0aGUgZmlsZSBmb3Igb3V0cHV0LlxuJywKKyAncmFpc2UnOiAnXG5UaGUgYGByYWlzZWBgIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKipcblxuICAgcmFpc2Vfc3RtdCA6Oj0gInJhaXNlIiBbZXhwcmVzc2lvbiBbIiwiIGV4cHJlc3Npb24gWyIsIiBleHByZXNzaW9uXV1dXG5cbklmIG5vIGV4cHJlc3Npb25zIGFyZSBwcmVzZW50LCBgYHJhaXNlYGAgcmUtcmFpc2VzIHRoZSBsYXN0IGV4Y2VwdGlvblxudGhhdCB3YXMgYWN0aXZlIGluIHRoZSBjdXJyZW50IHNjb3BlLiAgSWYgbm8gZXhjZXB0aW9uIGlzIGFjdGl2ZSBpblxudGhlIGN1cnJlbnQgc2NvcGUsIGEgYGBUeXBlRXJyb3JgYCBleGNlcHRpb24gaXMgcmFpc2VkIGluZGljYXRpbmcgdGhhdFxudGhpcyBpcyBhbiBlcnJvciAoaWYgcnVubmluZyB1bmRlciBJRExFLCBhIGBgUXVldWUuRW1wdHlgYCBleGNlcHRpb25cbmlzIHJhaXNlZCBpbnN0ZWFkKS5cblxuT3RoZXJ3aXNlLCBgYHJhaXNlYGAgZXZhbHVhdGVzIHRoZSBleHByZXNzaW9ucyB0byBnZXQgdGhyZWUgb2JqZWN0cyxcbnVzaW5nIGBgTm9uZWBgIGFzIHRoZSB2YWx1ZSBvZiBvbWl0dGVkIGV4cHJlc3Npb25zLiAgVGhlIGZpcnN0IHR3b1xub2JqZWN0cyBhcmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlICp0eXBlKiBhbmQgKnZhbHVlKiBvZiB0aGUgZXhjZXB0aW9uLlxuXG5JZiB0aGUgZmlyc3Qgb2JqZWN0IGlzIGFuIGluc3RhbmNlLCB0aGUgdHlwZSBvZiB0aGUgZXhjZXB0aW9uIGlzIHRoZVxuY2xhc3Mgb2YgdGhlIGluc3RhbmNlLCB0aGUgaW5zdGFuY2UgaXRzZWxmIGlzIHRoZSB2YWx1ZSwgYW5kIHRoZVxuc2Vjb25kIG9iamVjdCBtdXN0IGJlIGBgTm9uZWBgLlxuXG5JZiB0aGUgZmlyc3Qgb2JqZWN0IGlzIGEgY2xhc3MsIGl0IGJlY29tZXMgdGhlIHR5cGUgb2YgdGhlIGV4Y2VwdGlvbi5cblRoZSBzZWNvbmQgb2JqZWN0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBleGNlcHRpb24gdmFsdWU6IElmIGl0IGlzXG5hbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MsIHRoZSBpbnN0YW5jZSBiZWNvbWVzIHRoZSBleGNlcHRpb24gdmFsdWUuIElmXG50aGUgc2Vjb25kIG9iamVjdCBpcyBhIHR1cGxlLCBpdCBpcyB1c2VkIGFzIHRoZSBhcmd1bWVudCBsaXN0IGZvciB0aGVcbmNsYXNzIGNvbnN0cnVjdG9yOyBpZiBpdCBpcyBgYE5vbmVgYCwgYW4gZW1wdHkgYXJndW1lbnQgbGlzdCBpcyB1c2VkLFxuYW5kIGFueSBvdGhlciBvYmplY3QgaXMgdHJlYXRlZCBhcyBhIHNpbmdsZSBhcmd1bWVudCB0byB0aGVcbmNvbnN0cnVjdG9yLiAgVGhlIGluc3RhbmNlIHNvIGNyZWF0ZWQgYnkgY2FsbGluZyB0aGUgY29uc3RydWN0b3IgaXNcbnVzZWQgYXMgdGhlIGV4Y2VwdGlvbiB2YWx1ZS5cblxuSWYgYSB0aGlyZCBvYmplY3QgaXMgcHJlc2VudCBhbmQgbm90IGBgTm9uZWBgLCBpdCBtdXN0IGJlIGEgdHJhY2ViYWNrXG5vYmplY3QgKHNlZSBzZWN0aW9uICpUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqKSwgYW5kIGl0IGlzXG5zdWJzdGl0dXRlZCBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIGFzIHRoZSBwbGFjZSB3aGVyZSB0aGVcbmV4Y2VwdGlvbiBvY2N1cnJlZC4gIElmIHRoZSB0aGlyZCBvYmplY3QgaXMgcHJlc2VudCBhbmQgbm90IGFcbnRyYWNlYmFjayBvYmplY3Qgb3IgYGBOb25lYGAsIGEgYGBUeXBlRXJyb3JgYCBleGNlcHRpb24gaXMgcmFpc2VkLlxuVGhlIHRocmVlLWV4cHJlc3Npb24gZm9ybSBvZiBgYHJhaXNlYGAgaXMgdXNlZnVsIHRvIHJlLXJhaXNlIGFuXG5leGNlcHRpb24gdHJhbnNwYXJlbnRseSBpbiBhbiBleGNlcHQgY2xhdXNlLCBidXQgYGByYWlzZWBgIHdpdGggbm9cbmV4cHJlc3Npb25zIHNob3VsZCBiZSBwcmVmZXJyZWQgaWYgdGhlIGV4Y2VwdGlvbiB0byBiZSByZS1yYWlzZWQgd2FzXG50aGUgbW9zdCByZWNlbnRseSBhY3RpdmUgZXhjZXB0aW9uIGluIHRoZSBjdXJyZW50IHNjb3BlLlxuXG5BZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGV4Y2VwdGlvbnMgY2FuIGJlIGZvdW5kIGluIHNlY3Rpb25cbipFeGNlcHRpb25zKiwgYW5kIGluZm9ybWF0aW9uIGFib3V0IGhhbmRsaW5nIGV4Y2VwdGlvbnMgaXMgaW4gc2VjdGlvblxuKlRoZSB0cnkgc3RhdGVtZW50Ki5cbicsCisgJ3JldHVybic6ICdcblRoZSBgYHJldHVybmBgIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiAgIHJldHVybl9zdG10IDo6PSAicmV0dXJuIiBbZXhwcmVzc2lvbl9saXN0XVxuXG5gYHJldHVybmBgIG1heSBvbmx5IG9jY3VyIHN5bnRhY3RpY2FsbHkgbmVzdGVkIGluIGEgZnVuY3Rpb25cbmRlZmluaXRpb24sIG5vdCB3aXRoaW4gYSBuZXN0ZWQgY2xhc3MgZGVmaW5pdGlvbi5cblxuSWYgYW4gZXhwcmVzc2lvbiBsaXN0IGlzIHByZXNlbnQsIGl0IGlzIGV2YWx1YXRlZCwgZWxzZSBgYE5vbmVgYCBpc1xuc3Vic3RpdHV0ZWQuXG5cbmBgcmV0dXJuYGAgbGVhdmVzIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGNhbGwgd2l0aCB0aGUgZXhwcmVzc2lvbiBsaXN0XG4ob3IgYGBOb25lYGApIGFzIHJldHVybiB2YWx1ZS5cblxuV2hlbiBgYHJldHVybmBgIHBhc3NlcyBjb250cm9sIG91dCBvZiBhIGBgdHJ5YGAgc3RhdGVtZW50IHdpdGggYVxuYGBmaW5hbGx5YGAgY2xhdXNlLCB0aGF0IGBgZmluYWxseWBgIGNsYXVzZSBpcyBleGVjdXRlZCBiZWZvcmUgcmVhbGx5XG5sZWF2aW5nIHRoZSBmdW5jdGlvbi5cblxuSW4gYSBnZW5lcmF0b3IgZnVuY3Rpb24sIHRoZSBgYHJldHVybmBgIHN0YXRlbWVudCBpcyBub3QgYWxsb3dlZCB0b1xuaW5jbHVkZSBhbiBgYGV4cHJlc3Npb25fbGlzdGBgLiAgSW4gdGhhdCBjb250ZXh0LCBhIGJhcmUgYGByZXR1cm5gYFxuaW5kaWNhdGVzIHRoYXQgdGhlIGdlbmVyYXRvciBpcyBkb25lIGFuZCB3aWxsIGNhdXNlIGBgU3RvcEl0ZXJhdGlvbmBgXG50byBiZSByYWlzZWQuXG4nLAorICdzZXF1ZW5jZS10eXBlcyc6ICJcbkVtdWxhdGluZyBjb250YWluZXIgdHlwZXNcbioqKioqKioqKioqKioqKioqKioqKioqKipcblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGltcGxlbWVudCBjb250YWluZXIgb2JqZWN0cy5cbkNvbnRhaW5lcnMgdXN1YWxseSBhcmUgc2VxdWVuY2VzIChzdWNoIGFzIGxpc3RzIG9yIHR1cGxlcykgb3IgbWFwcGluZ3NcbihsaWtlIGRpY3Rpb25hcmllcyksIGJ1dCBjYW4gcmVwcmVzZW50IG90aGVyIGNvbnRhaW5lcnMgYXMgd2VsbC4gIFRoZVxuZmlyc3Qgc2V0IG9mIG1ldGhvZHMgaXMgdXNlZCBlaXRoZXIgdG8gZW11bGF0ZSBhIHNlcXVlbmNlIG9yIHRvXG5lbXVsYXRlIGEgbWFwcGluZzsgdGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBmb3IgYSBzZXF1ZW5jZSwgdGhlXG5hbGxvd2FibGUga2V5cyBzaG91bGQgYmUgdGhlIGludGVnZXJzICprKiBmb3Igd2hpY2ggYGAwIDw9IGsgPCBOYGBcbndoZXJlICpOKiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSwgb3Igc2xpY2Ugb2JqZWN0cywgd2hpY2hcbmRlZmluZSBhIHJhbmdlIG9mIGl0ZW1zLiAoRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB0aGUgbWV0aG9kXG5gYF9fZ2V0c2xpY2VfXygpYGAgKHNlZSBiZWxvdykgY2FuIGFsc28gYmUgZGVmaW5lZCB0byBoYW5kbGUgc2ltcGxlLFxuYnV0IG5vdCBleHRlbmRlZCBzbGljZXMuKSBJdCBpcyBhbHNvIHJlY29tbWVuZGVkIHRoYXQgbWFwcGluZ3MgcHJvdmlkZVxudGhlIG1ldGhvZHMgYGBrZXlzKClgYCwgYGB2YWx1ZXMoKWBgLCBgYGl0ZW1zKClgYCwgYGBoYXNfa2V5KClgYCxcbmBgZ2V0KClgYCwgYGBjbGVhcigpYGAsIGBgc2V0ZGVmYXVsdCgpYGAsIGBgaXRlcmtleXMoKWBgLFxuYGBpdGVydmFsdWVzKClgYCwgYGBpdGVyaXRlbXMoKWBgLCBgYHBvcCgpYGAsIGBgcG9waXRlbSgpYGAsXG5gYGNvcHkoKWBgLCBhbmQgYGB1cGRhdGUoKWBgIGJlaGF2aW5nIHNpbWlsYXIgdG8gdGhvc2UgZm9yIFB5dGhvbidzXG5zdGFuZGFyZCBkaWN0aW9uYXJ5IG9iamVjdHMuICBUaGUgYGBVc2VyRGljdGBgIG1vZHVsZSBwcm92aWRlcyBhXG5gYERpY3RNaXhpbmBgIGNsYXNzIHRvIGhlbHAgY3JlYXRlIHRob3NlIG1ldGhvZHMgZnJvbSBhIGJhc2Ugc2V0IG9mXG5gYF9fZ2V0aXRlbV9fKClgYCwgYGBfX3NldGl0ZW1fXygpYGAsIGBgX19kZWxpdGVtX18oKWBgLCBhbmRcbmBga2V5cygpYGAuIE11dGFibGUgc2VxdWVuY2VzIHNob3VsZCBwcm92aWRlIG1ldGhvZHMgYGBhcHBlbmQoKWBgLFxuYGBjb3VudCgpYGAsIGBgaW5kZXgoKWBgLCBgYGV4dGVuZCgpYGAsIGBgaW5zZXJ0KClgYCwgYGBwb3AoKWBgLFxuYGByZW1vdmUoKWBgLCBgYHJldmVyc2UoKWBgIGFuZCBgYHNvcnQoKWBgLCBsaWtlIFB5dGhvbiBzdGFuZGFyZCBsaXN0XG5vYmplY3RzLiAgRmluYWxseSwgc2VxdWVuY2UgdHlwZXMgc2hvdWxkIGltcGxlbWVudCBhZGRpdGlvbiAobWVhbmluZ1xuY29uY2F0ZW5hdGlvbikgYW5kIG11bHRpcGxpY2F0aW9uIChtZWFuaW5nIHJlcGV0aXRpb24pIGJ5IGRlZmluaW5nIHRoZVxubWV0aG9kcyBgYF9fYWRkX18oKWBgLCBgYF9fcmFkZF9fKClgYCwgYGBfX2lhZGRfXygpYGAsIGBgX19tdWxfXygpYGAsXG5gYF9fcm11bF9fKClgYCBhbmQgYGBfX2ltdWxfXygpYGAgZGVzY3JpYmVkIGJlbG93OyB0aGV5IHNob3VsZCBub3RcbmRlZmluZSBgYF9fY29lcmNlX18oKWBgIG9yIG90aGVyIG51bWVyaWNhbCBvcGVyYXRvcnMuICBJdCBpc1xucmVjb21tZW5kZWQgdGhhdCBib3RoIG1hcHBpbmdzIGFuZCBzZXF1ZW5jZXMgaW1wbGVtZW50IHRoZVxuYGBfX2NvbnRhaW5zX18oKWBgIG1ldGhvZCB0byBhbGxvdyBlZmZpY2llbnQgdXNlIG9mIHRoZSBgYGluYGBcbm9wZXJhdG9yOyBmb3IgbWFwcGluZ3MsIGBgaW5gYCBzaG91bGQgYmUgZXF1aXZhbGVudCBvZiBgYGhhc19rZXkoKWBgO1xuZm9yIHNlcXVlbmNlcywgaXQgc2hvdWxkIHNlYXJjaCB0aHJvdWdoIHRoZSB2YWx1ZXMuICBJdCBpcyBmdXJ0aGVyXG5yZWNvbW1lbmRlZCB0aGF0IGJvdGggbWFwcGluZ3MgYW5kIHNlcXVlbmNlcyBpbXBsZW1lbnQgdGhlXG5gYF9faXRlcl9fKClgYCBtZXRob2QgdG8gYWxsb3cgZWZmaWNpZW50IGl0ZXJhdGlvbiB0aHJvdWdoIHRoZVxuY29udGFpbmVyOyBmb3IgbWFwcGluZ3MsIGBgX19pdGVyX18oKWBgIHNob3VsZCBiZSB0aGUgc2FtZSBhc1xuYGBpdGVya2V5cygpYGA7IGZvciBzZXF1ZW5jZXMsIGl0IHNob3VsZCBpdGVyYXRlIHRocm91Z2ggdGhlIHZhbHVlcy5cblxub2JqZWN0Ll9fbGVuX18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gYGBsZW4oKWBgLiAgU2hvdWxkIHJldHVyblxuICAgdGhlIGxlbmd0aCBvZiB0aGUgb2JqZWN0LCBhbiBpbnRlZ2VyIGBgPj1gYCAwLiAgQWxzbywgYW4gb2JqZWN0XG4gICB0aGF0IGRvZXNuJ3QgZGVmaW5lIGEgYGBfX25vbnplcm9fXygpYGAgbWV0aG9kIGFuZCB3aG9zZVxuICAgYGBfX2xlbl9fKClgYCBtZXRob2QgcmV0dXJucyB6ZXJvIGlzIGNvbnNpZGVyZWQgdG8gYmUgZmFsc2UgaW4gYVxuICAgQm9vbGVhbiBjb250ZXh0LlxuXG5vYmplY3QuX19nZXRpdGVtX18oc2VsZiwga2V5KVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IGV2YWx1YXRpb24gb2YgYGBzZWxmW2tleV1gYC4gRm9yIHNlcXVlbmNlXG4gICB0eXBlcywgdGhlIGFjY2VwdGVkIGtleXMgc2hvdWxkIGJlIGludGVnZXJzIGFuZCBzbGljZSBvYmplY3RzLlxuICAgTm90ZSB0aGF0IHRoZSBzcGVjaWFsIGludGVycHJldGF0aW9uIG9mIG5lZ2F0aXZlIGluZGV4ZXMgKGlmIHRoZVxuICAgY2xhc3Mgd2lzaGVzIHRvIGVtdWxhdGUgYSBzZXF1ZW5jZSB0eXBlKSBpcyB1cCB0byB0aGVcbiAgIGBgX19nZXRpdGVtX18oKWBgIG1ldGhvZC4gSWYgKmtleSogaXMgb2YgYW4gaW5hcHByb3ByaWF0ZSB0eXBlLFxuICAgYGBUeXBlRXJyb3JgYCBtYXkgYmUgcmFpc2VkOyBpZiBvZiBhIHZhbHVlIG91dHNpZGUgdGhlIHNldCBvZlxuICAgaW5kZXhlcyBmb3IgdGhlIHNlcXVlbmNlIChhZnRlciBhbnkgc3BlY2lhbCBpbnRlcnByZXRhdGlvbiBvZlxuICAgbmVnYXRpdmUgdmFsdWVzKSwgYGBJbmRleEVycm9yYGAgc2hvdWxkIGJlIHJhaXNlZC4gRm9yIG1hcHBpbmdcbiAgIHR5cGVzLCBpZiAqa2V5KiBpcyBtaXNzaW5nIChub3QgaW4gdGhlIGNvbnRhaW5lciksIGBgS2V5RXJyb3JgYFxuICAgc2hvdWxkIGJlIHJhaXNlZC5cblxuICAgTm90ZTogYGBmb3JgYCBsb29wcyBleHBlY3QgdGhhdCBhbiBgYEluZGV4RXJyb3JgYCB3aWxsIGJlIHJhaXNlZCBmb3JcbiAgICAgaWxsZWdhbCBpbmRleGVzIHRvIGFsbG93IHByb3BlciBkZXRlY3Rpb24gb2YgdGhlIGVuZCBvZiB0aGVcbiAgICAgc2VxdWVuY2UuXG5cbm9iamVjdC5fX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IGFzc2lnbm1lbnQgdG8gYGBzZWxmW2tleV1gYC4gIFNhbWUgbm90ZSBhcyBmb3JcbiAgIGBgX19nZXRpdGVtX18oKWBgLiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBmb3IgbWFwcGluZ3MgaWZcbiAgIHRoZSBvYmplY3RzIHN1cHBvcnQgY2hhbmdlcyB0byB0aGUgdmFsdWVzIGZvciBrZXlzLCBvciBpZiBuZXcga2V5c1xuICAgY2FuIGJlIGFkZGVkLCBvciBmb3Igc2VxdWVuY2VzIGlmIGVsZW1lbnRzIGNhbiBiZSByZXBsYWNlZC4gIFRoZVxuICAgc2FtZSBleGNlcHRpb25zIHNob3VsZCBiZSByYWlzZWQgZm9yIGltcHJvcGVyICprZXkqIHZhbHVlcyBhcyBmb3JcbiAgIHRoZSBgYF9fZ2V0aXRlbV9fKClgYCBtZXRob2QuXG5cbm9iamVjdC5fX2RlbGl0ZW1fXyhzZWxmLCBrZXkpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgZGVsZXRpb24gb2YgYGBzZWxmW2tleV1gYC4gIFNhbWUgbm90ZSBhcyBmb3JcbiAgIGBgX19nZXRpdGVtX18oKWBgLiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBmb3IgbWFwcGluZ3MgaWZcbiAgIHRoZSBvYmplY3RzIHN1cHBvcnQgcmVtb3ZhbCBvZiBrZXlzLCBvciBmb3Igc2VxdWVuY2VzIGlmIGVsZW1lbnRzXG4gICBjYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzZXF1ZW5jZS4gIFRoZSBzYW1lIGV4Y2VwdGlvbnMgc2hvdWxkIGJlXG4gICByYWlzZWQgZm9yIGltcHJvcGVyICprZXkqIHZhbHVlcyBhcyBmb3IgdGhlIGBgX19nZXRpdGVtX18oKWBgXG4gICBtZXRob2QuXG5cbm9iamVjdC5fX2l0ZXJfXyhzZWxmKVxuXG4gICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhbiBpdGVyYXRvciBpcyByZXF1aXJlZCBmb3IgYSBjb250YWluZXIuXG4gICBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIG9iamVjdCB0aGF0IGNhbiBpdGVyYXRlXG4gICBvdmVyIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgY29udGFpbmVyLiAgRm9yIG1hcHBpbmdzLCBpdCBzaG91bGRcbiAgIGl0ZXJhdGUgb3ZlciB0aGUga2V5cyBvZiB0aGUgY29udGFpbmVyLCBhbmQgc2hvdWxkIGFsc28gYmUgbWFkZVxuICAgYXZhaWxhYmxlIGFzIHRoZSBtZXRob2QgYGBpdGVya2V5cygpYGAuXG5cbiAgIEl0ZXJhdG9yIG9iamVjdHMgYWxzbyBuZWVkIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZDsgdGhleSBhcmVcbiAgIHJlcXVpcmVkIHRvIHJldHVybiB0aGVtc2VsdmVzLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaXRlcmF0b3JcbiAgIG9iamVjdHMsIHNlZSAqSXRlcmF0b3IgVHlwZXMqLlxuXG5vYmplY3QuX19yZXZlcnNlZF9fKHNlbGYpXG5cbiAgIENhbGxlZCAoaWYgcHJlc2VudCkgYnkgdGhlIGBgcmV2ZXJzZWQoKWBgIGJ1aWx0LWluIHRvIGltcGxlbWVudFxuICAgcmV2ZXJzZSBpdGVyYXRpb24uICBJdCBzaG91bGQgcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIG9iamVjdCB0aGF0XG4gICBpdGVyYXRlcyBvdmVyIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgY29udGFpbmVyIGluIHJldmVyc2Ugb3JkZXIuXG5cbiAgIElmIHRoZSBgYF9fcmV2ZXJzZWRfXygpYGAgbWV0aG9kIGlzIG5vdCBwcm92aWRlZCwgdGhlXG4gICBgYHJldmVyc2VkKClgYCBidWlsdC1pbiB3aWxsIGZhbGwgYmFjayB0byB1c2luZyB0aGUgc2VxdWVuY2VcbiAgIHByb3RvY29sIChgYF9fbGVuX18oKWBgIGFuZCBgYF9fZ2V0aXRlbV9fKClgYCkuICBPYmplY3RzIHRoYXRcbiAgIHN1cHBvcnQgdGhlIHNlcXVlbmNlIHByb3RvY29sIHNob3VsZCBvbmx5IHByb3ZpZGVcbiAgIGBgX19yZXZlcnNlZF9fKClgYCBpZiB0aGV5IGNhbiBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIHRoYXQgaXNcbiAgIG1vcmUgZWZmaWNpZW50IHRoYW4gdGhlIG9uZSBwcm92aWRlZCBieSBgYHJldmVyc2VkKClgYC5cblxuICAgTmV3IGluIHZlcnNpb24gMi42LlxuXG5UaGUgbWVtYmVyc2hpcCB0ZXN0IG9wZXJhdG9ycyAoYGBpbmBgIGFuZCBgYG5vdCBpbmBgKSBhcmUgbm9ybWFsbHlcbmltcGxlbWVudGVkIGFzIGFuIGl0ZXJhdGlvbiB0aHJvdWdoIGEgc2VxdWVuY2UuICBIb3dldmVyLCBjb250YWluZXJcbm9iamVjdHMgY2FuIHN1cHBseSB0aGUgZm9sbG93aW5nIHNwZWNpYWwgbWV0aG9kIHdpdGggYSBtb3JlIGVmZmljaWVudFxuaW1wbGVtZW50YXRpb24sIHdoaWNoIGFsc28gZG9lcyBub3QgcmVxdWlyZSB0aGUgb2JqZWN0IGJlIGEgc2VxdWVuY2UuXG5cbm9iamVjdC5fX2NvbnRhaW5zX18oc2VsZiwgaXRlbSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBtZW1iZXJzaGlwIHRlc3Qgb3BlcmF0b3JzLiAgU2hvdWxkIHJldHVybiB0cnVlXG4gICBpZiAqaXRlbSogaXMgaW4gKnNlbGYqLCBmYWxzZSBvdGhlcndpc2UuICBGb3IgbWFwcGluZyBvYmplY3RzLCB0aGlzXG4gICBzaG91bGQgY29uc2lkZXIgdGhlIGtleXMgb2YgdGhlIG1hcHBpbmcgcmF0aGVyIHRoYW4gdGhlIHZhbHVlcyBvclxuICAgdGhlIGtleS1pdGVtIHBhaXJzLlxuXG4gICBGb3Igb2JqZWN0cyB0aGF0IGRvbid0IGRlZmluZSBgYF9fY29udGFpbnNfXygpYGAsIHRoZSBtZW1iZXJzaGlwXG4gICB0ZXN0IGZpcnN0IHRyaWVzIGl0ZXJhdGlvbiB2aWEgYGBfX2l0ZXJfXygpYGAsIHRoZW4gdGhlIG9sZFxuICAgc2VxdWVuY2UgaXRlcmF0aW9uIHByb3RvY29sIHZpYSBgYF9fZ2V0aXRlbV9fKClgYCwgc2VlICp0aGlzXG4gICBzZWN0aW9uIGluIHRoZSBsYW5ndWFnZSByZWZlcmVuY2UqLlxuIiwKKyAnc2hpZnRpbmcnOiAnXG5TaGlmdGluZyBvcGVyYXRpb25zXG4qKioqKioqKioqKioqKioqKioqXG5cblRoZSBzaGlmdGluZyBvcGVyYXRpb25zIGhhdmUgbG93ZXIgcHJpb3JpdHkgdGhhbiB0aGUgYXJpdGhtZXRpY1xub3BlcmF0aW9uczpcblxuICAgc2hpZnRfZXhwciA6Oj0gYV9leHByIHwgc2hpZnRfZXhwciAoICI8PCIgfCAiPj4iICkgYV9leHByXG5cblRoZXNlIG9wZXJhdG9ycyBhY2NlcHQgcGxhaW4gb3IgbG9uZyBpbnRlZ2VycyBhcyBhcmd1bWVudHMuICBUaGVcbmFyZ3VtZW50cyBhcmUgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUuICBUaGV5IHNoaWZ0IHRoZSBmaXJzdFxuYXJndW1lbnQgdG8gdGhlIGxlZnQgb3IgcmlnaHQgYnkgdGhlIG51bWJlciBvZiBiaXRzIGdpdmVuIGJ5IHRoZVxuc2Vjb25kIGFyZ3VtZW50LlxuXG5BIHJpZ2h0IHNoaWZ0IGJ5ICpuKiBiaXRzIGlzIGRlZmluZWQgYXMgZGl2aXNpb24gYnkgYGBwb3coMiwgbilgYC4gIEFcbmxlZnQgc2hpZnQgYnkgKm4qIGJpdHMgaXMgZGVmaW5lZCBhcyBtdWx0aXBsaWNhdGlvbiB3aXRoIGBgcG93KDIsXG5uKWBgLiAgTmVnYXRpdmUgc2hpZnQgY291bnRzIHJhaXNlIGEgYGBWYWx1ZUVycm9yYGAgZXhjZXB0aW9uLlxuXG5Ob3RlOiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhlIHJpZ2h0LWhhbmQgb3BlcmFuZCBpcyByZXF1aXJlZCB0b1xuICBiZSBhdCBtb3N0IGBgc3lzLm1heHNpemVgYC4gIElmIHRoZSByaWdodC1oYW5kIG9wZXJhbmQgaXMgbGFyZ2VyXG4gIHRoYW4gYGBzeXMubWF4c2l6ZWBgIGFuIGBgT3ZlcmZsb3dFcnJvcmBgIGV4Y2VwdGlvbiBpcyByYWlzZWQuXG4nLAorICdzbGljaW5ncyc6ICdcblNsaWNpbmdzXG4qKioqKioqKlxuXG5BIHNsaWNpbmcgc2VsZWN0cyBhIHJhbmdlIG9mIGl0ZW1zIGluIGEgc2VxdWVuY2Ugb2JqZWN0IChlLmcuLCBhXG5zdHJpbmcsIHR1cGxlIG9yIGxpc3QpLiAgU2xpY2luZ3MgbWF5IGJlIHVzZWQgYXMgZXhwcmVzc2lvbnMgb3IgYXNcbnRhcmdldHMgaW4gYXNzaWdubWVudCBvciBgYGRlbGBgIHN0YXRlbWVudHMuICBUaGUgc3ludGF4IGZvciBhXG5zbGljaW5nOlxuXG4gICBzbGljaW5nICAgICAgICAgIDo6PSBzaW1wbGVfc2xpY2luZyB8IGV4dGVuZGVkX3NsaWNpbmdcbiAgIHNpbXBsZV9zbGljaW5nICAgOjo9IHByaW1hcnkgIlsiIHNob3J0X3NsaWNlICJdIlxuICAgZXh0ZW5kZWRfc2xpY2luZyA6Oj0gcHJpbWFyeSAiWyIgc2xpY2VfbGlzdCAiXSJcbiAgIHNsaWNlX2xpc3QgICAgICAgOjo9IHNsaWNlX2l0ZW0gKCIsIiBzbGljZV9pdGVtKSogWyIsIl1cbiAgIHNsaWNlX2l0ZW0gICAgICAgOjo9IGV4cHJlc3Npb24gfCBwcm9wZXJfc2xpY2UgfCBlbGxpcHNpc1xuICAgcHJvcGVyX3NsaWNlICAgICA6Oj0gc2hvcnRfc2xpY2UgfCBsb25nX3NsaWNlXG4gICBzaG9ydF9zbGljZSAgICAgIDo6PSBbbG93ZXJfYm91bmRdICI6IiBbdXBwZXJfYm91bmRdXG4gICBsb25nX3NsaWNlICAgICAgIDo6PSBzaG9ydF9zbGljZSAiOiIgW3N0cmlkZV1cbiAgIGxvd2VyX2JvdW5kICAgICAgOjo9IGV4cHJlc3Npb25cbiAgIHVwcGVyX2JvdW5kICAgICAgOjo9IGV4cHJlc3Npb25cbiAgIHN0cmlkZSAgICAgICAgICAgOjo9IGV4cHJlc3Npb25cbiAgIGVsbGlwc2lzICAgICAgICAgOjo9ICIuLi4iXG5cblRoZXJlIGlzIGFtYmlndWl0eSBpbiB0aGUgZm9ybWFsIHN5bnRheCBoZXJlOiBhbnl0aGluZyB0aGF0IGxvb2tzIGxpa2VcbmFuIGV4cHJlc3Npb24gbGlzdCBhbHNvIGxvb2tzIGxpa2UgYSBzbGljZSBsaXN0LCBzbyBhbnkgc3Vic2NyaXB0aW9uXG5jYW4gYmUgaW50ZXJwcmV0ZWQgYXMgYSBzbGljaW5nLiAgUmF0aGVyIHRoYW4gZnVydGhlciBjb21wbGljYXRpbmcgdGhlXG5zeW50YXgsIHRoaXMgaXMgZGlzYW1iaWd1YXRlZCBieSBkZWZpbmluZyB0aGF0IGluIHRoaXMgY2FzZSB0aGVcbmludGVycHJldGF0aW9uIGFzIGEgc3Vic2NyaXB0aW9uIHRha2VzIHByaW9yaXR5IG92ZXIgdGhlXG5pbnRlcnByZXRhdGlvbiBhcyBhIHNsaWNpbmcgKHRoaXMgaXMgdGhlIGNhc2UgaWYgdGhlIHNsaWNlIGxpc3RcbmNvbnRhaW5zIG5vIHByb3BlciBzbGljZSBub3IgZWxsaXBzZXMpLiAgU2ltaWxhcmx5LCB3aGVuIHRoZSBzbGljZVxubGlzdCBoYXMgZXhhY3RseSBvbmUgc2hvcnQgc2xpY2UgYW5kIG5vIHRyYWlsaW5nIGNvbW1hLCB0aGVcbmludGVycHJldGF0aW9uIGFzIGEgc2ltcGxlIHNsaWNpbmcgdGFrZXMgcHJpb3JpdHkgb3ZlciB0aGF0IGFzIGFuXG5leHRlbmRlZCBzbGljaW5nLlxuXG5UaGUgc2VtYW50aWNzIGZvciBhIHNpbXBsZSBzbGljaW5nIGFyZSBhcyBmb2xsb3dzLiAgVGhlIHByaW1hcnkgbXVzdFxuZXZhbHVhdGUgdG8gYSBzZXF1ZW5jZSBvYmplY3QuICBUaGUgbG93ZXIgYW5kIHVwcGVyIGJvdW5kIGV4cHJlc3Npb25zLFxuaWYgcHJlc2VudCwgbXVzdCBldmFsdWF0ZSB0byBwbGFpbiBpbnRlZ2VyczsgZGVmYXVsdHMgYXJlIHplcm8gYW5kIHRoZVxuYGBzeXMubWF4aW50YGAsIHJlc3BlY3RpdmVseS4gIElmIGVpdGhlciBib3VuZCBpcyBuZWdhdGl2ZSwgdGhlXG5zZXF1ZW5jZVwncyBsZW5ndGggaXMgYWRkZWQgdG8gaXQuICBUaGUgc2xpY2luZyBub3cgc2VsZWN0cyBhbGwgaXRlbXNcbndpdGggaW5kZXggKmsqIHN1Y2ggdGhhdCBgYGkgPD0gayA8IGpgYCB3aGVyZSAqaSogYW5kICpqKiBhcmUgdGhlXG5zcGVjaWZpZWQgbG93ZXIgYW5kIHVwcGVyIGJvdW5kcy4gIFRoaXMgbWF5IGJlIGFuIGVtcHR5IHNlcXVlbmNlLiAgSXRcbmlzIG5vdCBhbiBlcnJvciBpZiAqaSogb3IgKmoqIGxpZSBvdXRzaWRlIHRoZSByYW5nZSBvZiB2YWxpZCBpbmRleGVzXG4oc3VjaCBpdGVtcyBkb25cJ3QgZXhpc3Qgc28gdGhleSBhcmVuXCd0IHNlbGVjdGVkKS5cblxuVGhlIHNlbWFudGljcyBmb3IgYW4gZXh0ZW5kZWQgc2xpY2luZyBhcmUgYXMgZm9sbG93cy4gIFRoZSBwcmltYXJ5XG5tdXN0IGV2YWx1YXRlIHRvIGEgbWFwcGluZyBvYmplY3QsIGFuZCBpdCBpcyBpbmRleGVkIHdpdGggYSBrZXkgdGhhdFxuaXMgY29uc3RydWN0ZWQgZnJvbSB0aGUgc2xpY2UgbGlzdCwgYXMgZm9sbG93cy4gIElmIHRoZSBzbGljZSBsaXN0XG5jb250YWlucyBhdCBsZWFzdCBvbmUgY29tbWEsIHRoZSBrZXkgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZVxuY29udmVyc2lvbiBvZiB0aGUgc2xpY2UgaXRlbXM7IG90aGVyd2lzZSwgdGhlIGNvbnZlcnNpb24gb2YgdGhlIGxvbmVcbnNsaWNlIGl0ZW0gaXMgdGhlIGtleS4gIFRoZSBjb252ZXJzaW9uIG9mIGEgc2xpY2UgaXRlbSB0aGF0IGlzIGFuXG5leHByZXNzaW9uIGlzIHRoYXQgZXhwcmVzc2lvbi4gIFRoZSBjb252ZXJzaW9uIG9mIGFuIGVsbGlwc2lzIHNsaWNlXG5pdGVtIGlzIHRoZSBidWlsdC1pbiBgYEVsbGlwc2lzYGAgb2JqZWN0LiAgVGhlIGNvbnZlcnNpb24gb2YgYSBwcm9wZXJcbnNsaWNlIGlzIGEgc2xpY2Ugb2JqZWN0IChzZWUgc2VjdGlvbiAqVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5Kilcbndob3NlIGBgc3RhcnRgYCwgYGBzdG9wYGAgYW5kIGBgc3RlcGBgIGF0dHJpYnV0ZXMgYXJlIHRoZSB2YWx1ZXMgb2ZcbnRoZSBleHByZXNzaW9ucyBnaXZlbiBhcyBsb3dlciBib3VuZCwgdXBwZXIgYm91bmQgYW5kIHN0cmlkZSxcbnJlc3BlY3RpdmVseSwgc3Vic3RpdHV0aW5nIGBgTm9uZWBgIGZvciBtaXNzaW5nIGV4cHJlc3Npb25zLlxuJywKKyAnc3BlY2lhbGF0dHJzJzogJ1xuU3BlY2lhbCBBdHRyaWJ1dGVzXG4qKioqKioqKioqKioqKioqKipcblxuVGhlIGltcGxlbWVudGF0aW9uIGFkZHMgYSBmZXcgc3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlcyB0byBzZXZlcmFsXG5vYmplY3QgdHlwZXMsIHdoZXJlIHRoZXkgYXJlIHJlbGV2YW50LiAgU29tZSBvZiB0aGVzZSBhcmUgbm90IHJlcG9ydGVkXG5ieSB0aGUgYGBkaXIoKWBgIGJ1aWx0LWluIGZ1bmN0aW9uLlxuXG5vYmplY3QuX19kaWN0X19cblxuICAgQSBkaWN0aW9uYXJ5IG9yIG90aGVyIG1hcHBpbmcgb2JqZWN0IHVzZWQgdG8gc3RvcmUgYW4gb2JqZWN0XCdzXG4gICAod3JpdGFibGUpIGF0dHJpYnV0ZXMuXG5cbm9iamVjdC5fX21ldGhvZHNfX1xuXG4gICBEZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi4yOiBVc2UgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGBgZGlyKClgYFxuICAgdG8gZ2V0IGEgbGlzdCBvZiBhbiBvYmplY3RcJ3MgYXR0cmlidXRlcy4gVGhpcyBhdHRyaWJ1dGUgaXMgbm9cbiAgIGxvbmdlciBhdmFpbGFibGUuXG5cbm9iamVjdC5fX21lbWJlcnNfX1xuXG4gICBEZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi4yOiBVc2UgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGBgZGlyKClgYFxuICAgdG8gZ2V0IGEgbGlzdCBvZiBhbiBvYmplY3RcJ3MgYXR0cmlidXRlcy4gVGhpcyBhdHRyaWJ1dGUgaXMgbm9cbiAgIGxvbmdlciBhdmFpbGFibGUuXG5cbmluc3RhbmNlLl9fY2xhc3NfX1xuXG4gICBUaGUgY2xhc3MgdG8gd2hpY2ggYSBjbGFzcyBpbnN0YW5jZSBiZWxvbmdzLlxuXG5jbGFzcy5fX2Jhc2VzX19cblxuICAgVGhlIHR1cGxlIG9mIGJhc2UgY2xhc3NlcyBvZiBhIGNsYXNzIG9iamVjdC5cblxuY2xhc3MuX19uYW1lX19cblxuICAgVGhlIG5hbWUgb2YgdGhlIGNsYXNzIG9yIHR5cGUuXG5cblRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgb25seSBzdXBwb3J0ZWQgYnkgKm5ldy1zdHlsZSBjbGFzcyplcy5cblxuY2xhc3MuX19tcm9fX1xuXG4gICBUaGlzIGF0dHJpYnV0ZSBpcyBhIHR1cGxlIG9mIGNsYXNzZXMgdGhhdCBhcmUgY29uc2lkZXJlZCB3aGVuXG4gICBsb29raW5nIGZvciBiYXNlIGNsYXNzZXMgZHVyaW5nIG1ldGhvZCByZXNvbHV0aW9uLlxuXG5jbGFzcy5tcm8oKVxuXG4gICBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIG1ldGFjbGFzcyB0byBjdXN0b21pemUgdGhlXG4gICBtZXRob2QgcmVzb2x1dGlvbiBvcmRlciBmb3IgaXRzIGluc3RhbmNlcy4gIEl0IGlzIGNhbGxlZCBhdCBjbGFzc1xuICAgaW5zdGFudGlhdGlvbiwgYW5kIGl0cyByZXN1bHQgaXMgc3RvcmVkIGluIGBgX19tcm9fX2BgLlxuXG5jbGFzcy5fX3N1YmNsYXNzZXNfXygpXG5cbiAgIEVhY2ggbmV3LXN0eWxlIGNsYXNzIGtlZXBzIGEgbGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgdG8gaXRzXG4gICBpbW1lZGlhdGUgc3ViY2xhc3Nlcy4gIFRoaXMgbWV0aG9kIHJldHVybnMgYSBsaXN0IG9mIGFsbCB0aG9zZVxuICAgcmVmZXJlbmNlcyBzdGlsbCBhbGl2ZS4gRXhhbXBsZTpcblxuICAgICAgPj4+IGludC5fX3N1YmNsYXNzZXNfXygpXG4gICAgICBbPHR5cGUgXCdib29sXCc+XVxuXG4tWyBGb290bm90ZXMgXS1cblxuWzFdIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gdGhlc2Ugc3BlY2lhbCBtZXRob2RzIG1heSBiZSBmb3VuZCBpblxuICAgIHRoZSBQeXRob24gUmVmZXJlbmNlIE1hbnVhbCAoKkJhc2ljIGN1c3RvbWl6YXRpb24qKS5cblxuWzJdIEFzIGEgY29uc2VxdWVuY2UsIHRoZSBsaXN0IGBgWzEsIDJdYGAgaXMgY29uc2lkZXJlZCBlcXVhbCB0b1xuICAgIGBgWzEuMCwgMi4wXWBgLCBhbmQgc2ltaWxhcmx5IGZvciB0dXBsZXMuXG5cblszXSBUaGV5IG11c3QgaGF2ZSBzaW5jZSB0aGUgcGFyc2VyIGNhblwndCB0ZWxsIHRoZSB0eXBlIG9mIHRoZVxuICAgIG9wZXJhbmRzLlxuXG5bNF0gQ2FzZWQgY2hhcmFjdGVycyBhcmUgdGhvc2Ugd2l0aCBnZW5lcmFsIGNhdGVnb3J5IHByb3BlcnR5IGJlaW5nXG4gICAgb25lIG9mICJMdSIgKExldHRlciwgdXBwZXJjYXNlKSwgIkxsIiAoTGV0dGVyLCBsb3dlcmNhc2UpLCBvciAiTHQiXG4gICAgKExldHRlciwgdGl0bGVjYXNlKS5cblxuWzVdIFRvIGZvcm1hdCBvbmx5IGEgdHVwbGUgeW91IHNob3VsZCB0aGVyZWZvcmUgcHJvdmlkZSBhIHNpbmdsZXRvblxuICAgIHR1cGxlIHdob3NlIG9ubHkgZWxlbWVudCBpcyB0aGUgdHVwbGUgdG8gYmUgZm9ybWF0dGVkLlxuXG5bNl0gVGhlIGFkdmFudGFnZSBvZiBsZWF2aW5nIHRoZSBuZXdsaW5lIG9uIGlzIHRoYXQgcmV0dXJuaW5nIGFuIGVtcHR5XG4gICAgc3RyaW5nIGlzIHRoZW4gYW4gdW5hbWJpZ3VvdXMgRU9GIGluZGljYXRpb24uICBJdCBpcyBhbHNvIHBvc3NpYmxlXG4gICAgKGluIGNhc2VzIHdoZXJlIGl0IG1pZ2h0IG1hdHRlciwgZm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIG1ha2VcbiAgICBhbiBleGFjdCBjb3B5IG9mIGEgZmlsZSB3aGlsZSBzY2FubmluZyBpdHMgbGluZXMpIHRvIHRlbGwgd2hldGhlclxuICAgIHRoZSBsYXN0IGxpbmUgb2YgYSBmaWxlIGVuZGVkIGluIGEgbmV3bGluZSBvciBub3QgKHllcyB0aGlzXG4gICAgaGFwcGVucyEpLlxuJywKKyAnc3BlY2lhbG5hbWVzJzogJ1xuU3BlY2lhbCBtZXRob2QgbmFtZXNcbioqKioqKioqKioqKioqKioqKioqXG5cbkEgY2xhc3MgY2FuIGltcGxlbWVudCBjZXJ0YWluIG9wZXJhdGlvbnMgdGhhdCBhcmUgaW52b2tlZCBieSBzcGVjaWFsXG5zeW50YXggKHN1Y2ggYXMgYXJpdGhtZXRpYyBvcGVyYXRpb25zIG9yIHN1YnNjcmlwdGluZyBhbmQgc2xpY2luZykgYnlcbmRlZmluaW5nIG1ldGhvZHMgd2l0aCBzcGVjaWFsIG5hbWVzLiBUaGlzIGlzIFB5dGhvblwncyBhcHByb2FjaCB0b1xuKm9wZXJhdG9yIG92ZXJsb2FkaW5nKiwgYWxsb3dpbmcgY2xhc3NlcyB0byBkZWZpbmUgdGhlaXIgb3duIGJlaGF2aW9yXG53aXRoIHJlc3BlY3QgdG8gbGFuZ3VhZ2Ugb3BlcmF0b3JzLiAgRm9yIGluc3RhbmNlLCBpZiBhIGNsYXNzIGRlZmluZXNcbmEgbWV0aG9kIG5hbWVkIGBgX19nZXRpdGVtX18oKWBgLCBhbmQgYGB4YGAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhpc1xuY2xhc3MsIHRoZW4gYGB4W2ldYGAgaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvIGBgeC5fX2dldGl0ZW1fXyhpKWBgIGZvclxub2xkLXN0eWxlIGNsYXNzZXMgYW5kIGBgdHlwZSh4KS5fX2dldGl0ZW1fXyh4LCBpKWBgIGZvciBuZXctc3R5bGVcbmNsYXNzZXMuICBFeGNlcHQgd2hlcmUgbWVudGlvbmVkLCBhdHRlbXB0cyB0byBleGVjdXRlIGFuIG9wZXJhdGlvblxucmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4gbm8gYXBwcm9wcmlhdGUgbWV0aG9kIGlzIGRlZmluZWQgKHR5cGljYWxseVxuYGBBdHRyaWJ1dGVFcnJvcmBgIG9yIGBgVHlwZUVycm9yYGApLlxuXG5XaGVuIGltcGxlbWVudGluZyBhIGNsYXNzIHRoYXQgZW11bGF0ZXMgYW55IGJ1aWx0LWluIHR5cGUsIGl0IGlzXG5pbXBvcnRhbnQgdGhhdCB0aGUgZW11bGF0aW9uIG9ubHkgYmUgaW1wbGVtZW50ZWQgdG8gdGhlIGRlZ3JlZSB0aGF0IGl0XG5tYWtlcyBzZW5zZSBmb3IgdGhlIG9iamVjdCBiZWluZyBtb2RlbGxlZC4gIEZvciBleGFtcGxlLCBzb21lXG5zZXF1ZW5jZXMgbWF5IHdvcmsgd2VsbCB3aXRoIHJldHJpZXZhbCBvZiBpbmRpdmlkdWFsIGVsZW1lbnRzLCBidXRcbmV4dHJhY3RpbmcgYSBzbGljZSBtYXkgbm90IG1ha2Ugc2Vuc2UuICAoT25lIGV4YW1wbGUgb2YgdGhpcyBpcyB0aGVcbmBgTm9kZUxpc3RgYCBpbnRlcmZhY2UgaW4gdGhlIFczQ1wncyBEb2N1bWVudCBPYmplY3QgTW9kZWwuKVxuXG5cbkJhc2ljIGN1c3RvbWl6YXRpb25cbj09PT09PT09PT09PT09PT09PT1cblxub2JqZWN0Ll9fbmV3X18oY2xzWywgLi4uXSlcblxuICAgQ2FsbGVkIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBjbGFzcyAqY2xzKi4gIGBgX19uZXdfXygpYGAgaXMgYVxuICAgc3RhdGljIG1ldGhvZCAoc3BlY2lhbC1jYXNlZCBzbyB5b3UgbmVlZCBub3QgZGVjbGFyZSBpdCBhcyBzdWNoKVxuICAgdGhhdCB0YWtlcyB0aGUgY2xhc3Mgb2Ygd2hpY2ggYW4gaW5zdGFuY2Ugd2FzIHJlcXVlc3RlZCBhcyBpdHNcbiAgIGZpcnN0IGFyZ3VtZW50LiAgVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRob3NlIHBhc3NlZCB0byB0aGVcbiAgIG9iamVjdCBjb25zdHJ1Y3RvciBleHByZXNzaW9uICh0aGUgY2FsbCB0byB0aGUgY2xhc3MpLiAgVGhlIHJldHVyblxuICAgdmFsdWUgb2YgYGBfX25ld19fKClgYCBzaG91bGQgYmUgdGhlIG5ldyBvYmplY3QgaW5zdGFuY2UgKHVzdWFsbHlcbiAgIGFuIGluc3RhbmNlIG9mICpjbHMqKS5cblxuICAgVHlwaWNhbCBpbXBsZW1lbnRhdGlvbnMgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcyBieVxuICAgaW52b2tpbmcgdGhlIHN1cGVyY2xhc3NcJ3MgYGBfX25ld19fKClgYCBtZXRob2QgdXNpbmdcbiAgIGBgc3VwZXIoY3VycmVudGNsYXNzLCBjbHMpLl9fbmV3X18oY2xzWywgLi4uXSlgYCB3aXRoIGFwcHJvcHJpYXRlXG4gICBhcmd1bWVudHMgYW5kIHRoZW4gbW9kaWZ5aW5nIHRoZSBuZXdseS1jcmVhdGVkIGluc3RhbmNlIGFzXG4gICBuZWNlc3NhcnkgYmVmb3JlIHJldHVybmluZyBpdC5cblxuICAgSWYgYGBfX25ld19fKClgYCByZXR1cm5zIGFuIGluc3RhbmNlIG9mICpjbHMqLCB0aGVuIHRoZSBuZXdcbiAgIGluc3RhbmNlXCdzIGBgX19pbml0X18oKWBgIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgbGlrZVxuICAgYGBfX2luaXRfXyhzZWxmWywgLi4uXSlgYCwgd2hlcmUgKnNlbGYqIGlzIHRoZSBuZXcgaW5zdGFuY2UgYW5kIHRoZVxuICAgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgd2VyZSBwYXNzZWQgdG8gYGBfX25ld19fKClgYC5cblxuICAgSWYgYGBfX25ld19fKClgYCBkb2VzIG5vdCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgKmNscyosIHRoZW4gdGhlIG5ld1xuICAgaW5zdGFuY2VcJ3MgYGBfX2luaXRfXygpYGAgbWV0aG9kIHdpbGwgbm90IGJlIGludm9rZWQuXG5cbiAgIGBgX19uZXdfXygpYGAgaXMgaW50ZW5kZWQgbWFpbmx5IHRvIGFsbG93IHN1YmNsYXNzZXMgb2YgaW1tdXRhYmxlXG4gICB0eXBlcyAobGlrZSBpbnQsIHN0ciwgb3IgdHVwbGUpIHRvIGN1c3RvbWl6ZSBpbnN0YW5jZSBjcmVhdGlvbi4gIEl0XG4gICBpcyBhbHNvIGNvbW1vbmx5IG92ZXJyaWRkZW4gaW4gY3VzdG9tIG1ldGFjbGFzc2VzIGluIG9yZGVyIHRvXG4gICBjdXN0b21pemUgY2xhc3MgY3JlYXRpb24uXG5cbm9iamVjdC5fX2luaXRfXyhzZWxmWywgLi4uXSlcblxuICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzIGNyZWF0ZWQuICBUaGUgYXJndW1lbnRzIGFyZSB0aG9zZVxuICAgcGFzc2VkIHRvIHRoZSBjbGFzcyBjb25zdHJ1Y3RvciBleHByZXNzaW9uLiAgSWYgYSBiYXNlIGNsYXNzIGhhcyBhblxuICAgYGBfX2luaXRfXygpYGAgbWV0aG9kLCB0aGUgZGVyaXZlZCBjbGFzc1wncyBgYF9faW5pdF9fKClgYCBtZXRob2QsXG4gICBpZiBhbnksIG11c3QgZXhwbGljaXRseSBjYWxsIGl0IHRvIGVuc3VyZSBwcm9wZXIgaW5pdGlhbGl6YXRpb24gb2ZcbiAgIHRoZSBiYXNlIGNsYXNzIHBhcnQgb2YgdGhlIGluc3RhbmNlOyBmb3IgZXhhbXBsZTpcbiAgIGBgQmFzZUNsYXNzLl9faW5pdF9fKHNlbGYsIFthcmdzLi4uXSlgYC4gIEFzIGEgc3BlY2lhbCBjb25zdHJhaW50XG4gICBvbiBjb25zdHJ1Y3RvcnMsIG5vIHZhbHVlIG1heSBiZSByZXR1cm5lZDsgZG9pbmcgc28gd2lsbCBjYXVzZSBhXG4gICBgYFR5cGVFcnJvcmBgIHRvIGJlIHJhaXNlZCBhdCBydW50aW1lLlxuXG5vYmplY3QuX19kZWxfXyhzZWxmKVxuXG4gICBDYWxsZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgYWJvdXQgdG8gYmUgZGVzdHJveWVkLiAgVGhpcyBpcyBhbHNvXG4gICBjYWxsZWQgYSBkZXN0cnVjdG9yLiAgSWYgYSBiYXNlIGNsYXNzIGhhcyBhIGBgX19kZWxfXygpYGAgbWV0aG9kLFxuICAgdGhlIGRlcml2ZWQgY2xhc3NcJ3MgYGBfX2RlbF9fKClgYCBtZXRob2QsIGlmIGFueSwgbXVzdCBleHBsaWNpdGx5XG4gICBjYWxsIGl0IHRvIGVuc3VyZSBwcm9wZXIgZGVsZXRpb24gb2YgdGhlIGJhc2UgY2xhc3MgcGFydCBvZiB0aGVcbiAgIGluc3RhbmNlLiAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlICh0aG91Z2ggbm90IHJlY29tbWVuZGVkISkgZm9yXG4gICB0aGUgYGBfX2RlbF9fKClgYCBtZXRob2QgdG8gcG9zdHBvbmUgZGVzdHJ1Y3Rpb24gb2YgdGhlIGluc3RhbmNlIGJ5XG4gICBjcmVhdGluZyBhIG5ldyByZWZlcmVuY2UgdG8gaXQuICBJdCBtYXkgdGhlbiBiZSBjYWxsZWQgYXQgYSBsYXRlclxuICAgdGltZSB3aGVuIHRoaXMgbmV3IHJlZmVyZW5jZSBpcyBkZWxldGVkLiAgSXQgaXMgbm90IGd1YXJhbnRlZWQgdGhhdFxuICAgYGBfX2RlbF9fKClgYCBtZXRob2RzIGFyZSBjYWxsZWQgZm9yIG9iamVjdHMgdGhhdCBzdGlsbCBleGlzdCB3aGVuXG4gICB0aGUgaW50ZXJwcmV0ZXIgZXhpdHMuXG5cbiAgIE5vdGU6IGBgZGVsIHhgYCBkb2VzblwndCBkaXJlY3RseSBjYWxsIGBgeC5fX2RlbF9fKClgYCAtLS0gdGhlIGZvcm1lclxuICAgICBkZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgZm9yIGBgeGBgIGJ5IG9uZSwgYW5kIHRoZSBsYXR0ZXJcbiAgICAgaXMgb25seSBjYWxsZWQgd2hlbiBgYHhgYFwncyByZWZlcmVuY2UgY291bnQgcmVhY2hlcyB6ZXJvLiAgU29tZVxuICAgICBjb21tb24gc2l0dWF0aW9ucyB0aGF0IG1heSBwcmV2ZW50IHRoZSByZWZlcmVuY2UgY291bnQgb2YgYW5cbiAgICAgb2JqZWN0IGZyb20gZ29pbmcgdG8gemVybyBpbmNsdWRlOiBjaXJjdWxhciByZWZlcmVuY2VzIGJldHdlZW5cbiAgICAgb2JqZWN0cyAoZS5nLiwgYSBkb3VibHktbGlua2VkIGxpc3Qgb3IgYSB0cmVlIGRhdGEgc3RydWN0dXJlIHdpdGhcbiAgICAgcGFyZW50IGFuZCBjaGlsZCBwb2ludGVycyk7IGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3Qgb24gdGhlXG4gICAgIHN0YWNrIGZyYW1lIG9mIGEgZnVuY3Rpb24gdGhhdCBjYXVnaHQgYW4gZXhjZXB0aW9uICh0aGUgdHJhY2ViYWNrXG4gICAgIHN0b3JlZCBpbiBgYHN5cy5leGNfdHJhY2ViYWNrYGAga2VlcHMgdGhlIHN0YWNrIGZyYW1lIGFsaXZlKTsgb3JcbiAgICAgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBvbiB0aGUgc3RhY2sgZnJhbWUgdGhhdCByYWlzZWQgYW5cbiAgICAgdW5oYW5kbGVkIGV4Y2VwdGlvbiBpbiBpbnRlcmFjdGl2ZSBtb2RlICh0aGUgdHJhY2ViYWNrIHN0b3JlZCBpblxuICAgICBgYHN5cy5sYXN0X3RyYWNlYmFja2BgIGtlZXBzIHRoZSBzdGFjayBmcmFtZSBhbGl2ZSkuICBUaGUgZmlyc3RcbiAgICAgc2l0dWF0aW9uIGNhbiBvbmx5IGJlIHJlbWVkaWVkIGJ5IGV4cGxpY2l0bHkgYnJlYWtpbmcgdGhlIGN5Y2xlcztcbiAgICAgdGhlIGxhdHRlciB0d28gc2l0dWF0aW9ucyBjYW4gYmUgcmVzb2x2ZWQgYnkgc3RvcmluZyBgYE5vbmVgYCBpblxuICAgICBgYHN5cy5leGNfdHJhY2ViYWNrYGAgb3IgYGBzeXMubGFzdF90cmFjZWJhY2tgYC4gIENpcmN1bGFyXG4gICAgIHJlZmVyZW5jZXMgd2hpY2ggYXJlIGdhcmJhZ2UgYXJlIGRldGVjdGVkIHdoZW4gdGhlIG9wdGlvbiBjeWNsZVxuICAgICBkZXRlY3RvciBpcyBlbmFibGVkIChpdFwncyBvbiBieSBkZWZhdWx0KSwgYnV0IGNhbiBvbmx5IGJlIGNsZWFuZWRcbiAgICAgdXAgaWYgdGhlcmUgYXJlIG5vIFB5dGhvbi1sZXZlbCBgYF9fZGVsX18oKWBgIG1ldGhvZHMgaW52b2x2ZWQuXG4gICAgIFJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgYGBnY2BgIG1vZHVsZSBmb3IgbW9yZVxuICAgICBpbmZvcm1hdGlvbiBhYm91dCBob3cgYGBfX2RlbF9fKClgYCBtZXRob2RzIGFyZSBoYW5kbGVkIGJ5IHRoZVxuICAgICBjeWNsZSBkZXRlY3RvciwgcGFydGljdWxhcmx5IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYGBnYXJiYWdlYGBcbiAgICAgdmFsdWUuXG5cbiAgIFdhcm5pbmc6IER1ZSB0byB0aGUgcHJlY2FyaW91cyBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoIGBgX19kZWxfXygpYGBcbiAgICAgbWV0aG9kcyBhcmUgaW52b2tlZCwgZXhjZXB0aW9ucyB0aGF0IG9jY3VyIGR1cmluZyB0aGVpciBleGVjdXRpb25cbiAgICAgYXJlIGlnbm9yZWQsIGFuZCBhIHdhcm5pbmcgaXMgcHJpbnRlZCB0byBgYHN5cy5zdGRlcnJgYCBpbnN0ZWFkLlxuICAgICBBbHNvLCB3aGVuIGBgX19kZWxfXygpYGAgaXMgaW52b2tlZCBpbiByZXNwb25zZSB0byBhIG1vZHVsZSBiZWluZ1xuICAgICBkZWxldGVkIChlLmcuLCB3aGVuIGV4ZWN1dGlvbiBvZiB0aGUgcHJvZ3JhbSBpcyBkb25lKSwgb3RoZXJcbiAgICAgZ2xvYmFscyByZWZlcmVuY2VkIGJ5IHRoZSBgYF9fZGVsX18oKWBgIG1ldGhvZCBtYXkgYWxyZWFkeSBoYXZlXG4gICAgIGJlZW4gZGVsZXRlZCBvciBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyB0b3JuIGRvd24gKGUuZy4gdGhlXG4gICAgIGltcG9ydCBtYWNoaW5lcnkgc2h1dHRpbmcgZG93bikuICBGb3IgdGhpcyByZWFzb24sIGBgX19kZWxfXygpYGBcbiAgICAgbWV0aG9kcyBzaG91bGQgZG8gdGhlIGFic29sdXRlIG1pbmltdW0gbmVlZGVkIHRvIG1haW50YWluXG4gICAgIGV4dGVybmFsIGludmFyaWFudHMuICBTdGFydGluZyB3aXRoIHZlcnNpb24gMS41LCBQeXRob25cbiAgICAgZ3VhcmFudGVlcyB0aGF0IGdsb2JhbHMgd2hvc2UgbmFtZSBiZWdpbnMgd2l0aCBhIHNpbmdsZVxuICAgICB1bmRlcnNjb3JlIGFyZSBkZWxldGVkIGZyb20gdGhlaXIgbW9kdWxlIGJlZm9yZSBvdGhlciBnbG9iYWxzIGFyZVxuICAgICBkZWxldGVkOyBpZiBubyBvdGhlciByZWZlcmVuY2VzIHRvIHN1Y2ggZ2xvYmFscyBleGlzdCwgdGhpcyBtYXlcbiAgICAgaGVscCBpbiBhc3N1cmluZyB0aGF0IGltcG9ydGVkIG1vZHVsZXMgYXJlIHN0aWxsIGF2YWlsYWJsZSBhdCB0aGVcbiAgICAgdGltZSB3aGVuIHRoZSBgYF9fZGVsX18oKWBgIG1ldGhvZCBpcyBjYWxsZWQuXG5cbiAgIFNlZSBhbHNvIHRoZSAqLVIqIGNvbW1hbmQtbGluZSBvcHRpb24uXG5cbm9iamVjdC5fX3JlcHJfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgdGhlIGBgcmVwcigpYGAgYnVpbHQtaW4gZnVuY3Rpb24gYW5kIGJ5IHN0cmluZ1xuICAgY29udmVyc2lvbnMgKHJldmVyc2UgcXVvdGVzKSB0byBjb21wdXRlIHRoZSAib2ZmaWNpYWwiIHN0cmluZ1xuICAgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiAgSWYgYXQgYWxsIHBvc3NpYmxlLCB0aGlzIHNob3VsZCBsb29rXG4gICBsaWtlIGEgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb24gdGhhdCBjb3VsZCBiZSB1c2VkIHRvIHJlY3JlYXRlIGFuXG4gICBvYmplY3Qgd2l0aCB0aGUgc2FtZSB2YWx1ZSAoZ2l2ZW4gYW4gYXBwcm9wcmlhdGUgZW52aXJvbm1lbnQpLiAgSWZcbiAgIHRoaXMgaXMgbm90IHBvc3NpYmxlLCBhIHN0cmluZyBvZiB0aGUgZm9ybSBgYDwuLi5zb21lIHVzZWZ1bFxuICAgZGVzY3JpcHRpb24uLi4+YGAgc2hvdWxkIGJlIHJldHVybmVkLiAgVGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIGFcbiAgIHN0cmluZyBvYmplY3QuIElmIGEgY2xhc3MgZGVmaW5lcyBgYF9fcmVwcl9fKClgYCBidXQgbm90XG4gICBgYF9fc3RyX18oKWBgLCB0aGVuIGBgX19yZXByX18oKWBgIGlzIGFsc28gdXNlZCB3aGVuIGFuICJpbmZvcm1hbCJcbiAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBpbnN0YW5jZXMgb2YgdGhhdCBjbGFzcyBpcyByZXF1aXJlZC5cblxuICAgVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgZGVidWdnaW5nLCBzbyBpdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGVcbiAgIHJlcHJlc2VudGF0aW9uIGlzIGluZm9ybWF0aW9uLXJpY2ggYW5kIHVuYW1iaWd1b3VzLlxuXG5vYmplY3QuX19zdHJfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgdGhlIGBgc3RyKClgYCBidWlsdC1pbiBmdW5jdGlvbiBhbmQgYnkgdGhlIGBgcHJpbnRgYFxuICAgc3RhdGVtZW50IHRvIGNvbXB1dGUgdGhlICJpbmZvcm1hbCIgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuXG4gICBvYmplY3QuICBUaGlzIGRpZmZlcnMgZnJvbSBgYF9fcmVwcl9fKClgYCBpbiB0aGF0IGl0IGRvZXMgbm90IGhhdmVcbiAgIHRvIGJlIGEgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb246IGEgbW9yZSBjb252ZW5pZW50IG9yIGNvbmNpc2VcbiAgIHJlcHJlc2VudGF0aW9uIG1heSBiZSB1c2VkIGluc3RlYWQuIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBhXG4gICBzdHJpbmcgb2JqZWN0LlxuXG5vYmplY3QuX19sdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fbGVfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2VxX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19uZV9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZ3RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2dlX18oc2VsZiwgb3RoZXIpXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDIuMS5cblxuICAgVGhlc2UgYXJlIHRoZSBzby1jYWxsZWQgInJpY2ggY29tcGFyaXNvbiIgbWV0aG9kcywgYW5kIGFyZSBjYWxsZWRcbiAgIGZvciBjb21wYXJpc29uIG9wZXJhdG9ycyBpbiBwcmVmZXJlbmNlIHRvIGBgX19jbXBfXygpYGAgYmVsb3cuIFRoZVxuICAgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBvcGVyYXRvciBzeW1ib2xzIGFuZCBtZXRob2QgbmFtZXMgaXMgYXNcbiAgIGZvbGxvd3M6IGBgeDx5YGAgY2FsbHMgYGB4Ll9fbHRfXyh5KWBgLCBgYHg8PXlgYCBjYWxsc1xuICAgYGB4Ll9fbGVfXyh5KWBgLCBgYHg9PXlgYCBjYWxscyBgYHguX19lcV9fKHkpYGAsIGBgeCE9eWBgIGFuZFxuICAgYGB4PD55YGAgY2FsbCBgYHguX19uZV9fKHkpYGAsIGBgeD55YGAgY2FsbHMgYGB4Ll9fZ3RfXyh5KWBgLCBhbmRcbiAgIGBgeD49eWBgIGNhbGxzIGBgeC5fX2dlX18oeSlgYC5cblxuICAgQSByaWNoIGNvbXBhcmlzb24gbWV0aG9kIG1heSByZXR1cm4gdGhlIHNpbmdsZXRvblxuICAgYGBOb3RJbXBsZW1lbnRlZGBgIGlmIGl0IGRvZXMgbm90IGltcGxlbWVudCB0aGUgb3BlcmF0aW9uIGZvciBhXG4gICBnaXZlbiBwYWlyIG9mIGFyZ3VtZW50cy4gQnkgY29udmVudGlvbiwgYGBGYWxzZWBgIGFuZCBgYFRydWVgYCBhcmVcbiAgIHJldHVybmVkIGZvciBhIHN1Y2Nlc3NmdWwgY29tcGFyaXNvbi4gSG93ZXZlciwgdGhlc2UgbWV0aG9kcyBjYW5cbiAgIHJldHVybiBhbnkgdmFsdWUsIHNvIGlmIHRoZSBjb21wYXJpc29uIG9wZXJhdG9yIGlzIHVzZWQgaW4gYVxuICAgQm9vbGVhbiBjb250ZXh0IChlLmcuLCBpbiB0aGUgY29uZGl0aW9uIG9mIGFuIGBgaWZgYCBzdGF0ZW1lbnQpLFxuICAgUHl0aG9uIHdpbGwgY2FsbCBgYGJvb2woKWBgIG9uIHRoZSB2YWx1ZSB0byBkZXRlcm1pbmUgaWYgdGhlIHJlc3VsdFxuICAgaXMgdHJ1ZSBvciBmYWxzZS5cblxuICAgVGhlcmUgYXJlIG5vIGltcGxpZWQgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGUgY29tcGFyaXNvbiBvcGVyYXRvcnMuXG4gICBUaGUgdHJ1dGggb2YgYGB4PT15YGAgZG9lcyBub3QgaW1wbHkgdGhhdCBgYHghPXlgYCBpcyBmYWxzZS5cbiAgIEFjY29yZGluZ2x5LCB3aGVuIGRlZmluaW5nIGBgX19lcV9fKClgYCwgb25lIHNob3VsZCBhbHNvIGRlZmluZVxuICAgYGBfX25lX18oKWBgIHNvIHRoYXQgdGhlIG9wZXJhdG9ycyB3aWxsIGJlaGF2ZSBhcyBleHBlY3RlZC4gIFNlZVxuICAgdGhlIHBhcmFncmFwaCBvbiBgYF9faGFzaF9fKClgYCBmb3Igc29tZSBpbXBvcnRhbnQgbm90ZXMgb25cbiAgIGNyZWF0aW5nICpoYXNoYWJsZSogb2JqZWN0cyB3aGljaCBzdXBwb3J0IGN1c3RvbSBjb21wYXJpc29uXG4gICBvcGVyYXRpb25zIGFuZCBhcmUgdXNhYmxlIGFzIGRpY3Rpb25hcnkga2V5cy5cblxuICAgVGhlcmUgYXJlIG5vIHN3YXBwZWQtYXJndW1lbnQgdmVyc2lvbnMgb2YgdGhlc2UgbWV0aG9kcyAodG8gYmUgdXNlZFxuICAgd2hlbiB0aGUgbGVmdCBhcmd1bWVudCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gYnV0IHRoZSByaWdodFxuICAgYXJndW1lbnQgZG9lcyk7IHJhdGhlciwgYGBfX2x0X18oKWBgIGFuZCBgYF9fZ3RfXygpYGAgYXJlIGVhY2hcbiAgIG90aGVyXCdzIHJlZmxlY3Rpb24sIGBgX19sZV9fKClgYCBhbmQgYGBfX2dlX18oKWBgIGFyZSBlYWNoIG90aGVyXCdzXG4gICByZWZsZWN0aW9uLCBhbmQgYGBfX2VxX18oKWBgIGFuZCBgYF9fbmVfXygpYGAgYXJlIHRoZWlyIG93blxuICAgcmVmbGVjdGlvbi5cblxuICAgQXJndW1lbnRzIHRvIHJpY2ggY29tcGFyaXNvbiBtZXRob2RzIGFyZSBuZXZlciBjb2VyY2VkLlxuXG4gICBUbyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIG9yZGVyaW5nIG9wZXJhdGlvbnMgZnJvbSBhIHNpbmdsZSByb290XG4gICBvcGVyYXRpb24sIHNlZSBgYGZ1bmN0b29scy50b3RhbF9vcmRlcmluZygpYGAuXG5cbm9iamVjdC5fX2NtcF9fKHNlbGYsIG90aGVyKVxuXG4gICBDYWxsZWQgYnkgY29tcGFyaXNvbiBvcGVyYXRpb25zIGlmIHJpY2ggY29tcGFyaXNvbiAoc2VlIGFib3ZlKSBpc1xuICAgbm90IGRlZmluZWQuICBTaG91bGQgcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciBpZiBgYHNlbGYgPCBvdGhlcmBgLFxuICAgemVybyBpZiBgYHNlbGYgPT0gb3RoZXJgYCwgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIGBgc2VsZiA+IG90aGVyYGAuXG4gICBJZiBubyBgYF9fY21wX18oKWBgLCBgYF9fZXFfXygpYGAgb3IgYGBfX25lX18oKWBgIG9wZXJhdGlvbiBpc1xuICAgZGVmaW5lZCwgY2xhc3MgaW5zdGFuY2VzIGFyZSBjb21wYXJlZCBieSBvYmplY3QgaWRlbnRpdHlcbiAgICgiYWRkcmVzcyIpLiAgU2VlIGFsc28gdGhlIGRlc2NyaXB0aW9uIG9mIGBgX19oYXNoX18oKWBgIGZvciBzb21lXG4gICBpbXBvcnRhbnQgbm90ZXMgb24gY3JlYXRpbmcgKmhhc2hhYmxlKiBvYmplY3RzIHdoaWNoIHN1cHBvcnQgY3VzdG9tXG4gICBjb21wYXJpc29uIG9wZXJhdGlvbnMgYW5kIGFyZSB1c2FibGUgYXMgZGljdGlvbmFyeSBrZXlzLiAoTm90ZTogdGhlXG4gICByZXN0cmljdGlvbiB0aGF0IGV4Y2VwdGlvbnMgYXJlIG5vdCBwcm9wYWdhdGVkIGJ5IGBgX19jbXBfXygpYGAgaGFzXG4gICBiZWVuIHJlbW92ZWQgc2luY2UgUHl0aG9uIDEuNS4pXG5cbm9iamVjdC5fX3JjbXBfXyhzZWxmLCBvdGhlcilcblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMTogTm8gbG9uZ2VyIHN1cHBvcnRlZC5cblxub2JqZWN0Ll9faGFzaF9fKHNlbGYpXG5cbiAgIENhbGxlZCBieSBidWlsdC1pbiBmdW5jdGlvbiBgYGhhc2goKWBgIGFuZCBmb3Igb3BlcmF0aW9ucyBvblxuICAgbWVtYmVycyBvZiBoYXNoZWQgY29sbGVjdGlvbnMgaW5jbHVkaW5nIGBgc2V0YGAsIGBgZnJvemVuc2V0YGAsIGFuZFxuICAgYGBkaWN0YGAuICBgYF9faGFzaF9fKClgYCBzaG91bGQgcmV0dXJuIGFuIGludGVnZXIuICBUaGUgb25seVxuICAgcmVxdWlyZWQgcHJvcGVydHkgaXMgdGhhdCBvYmplY3RzIHdoaWNoIGNvbXBhcmUgZXF1YWwgaGF2ZSB0aGUgc2FtZVxuICAgaGFzaCB2YWx1ZTsgaXQgaXMgYWR2aXNlZCB0byBzb21laG93IG1peCB0b2dldGhlciAoZS5nLiB1c2luZ1xuICAgZXhjbHVzaXZlIG9yKSB0aGUgaGFzaCB2YWx1ZXMgZm9yIHRoZSBjb21wb25lbnRzIG9mIHRoZSBvYmplY3QgdGhhdFxuICAgYWxzbyBwbGF5IGEgcGFydCBpbiBjb21wYXJpc29uIG9mIG9iamVjdHMuXG5cbiAgIElmIGEgY2xhc3MgZG9lcyBub3QgZGVmaW5lIGEgYGBfX2NtcF9fKClgYCBvciBgYF9fZXFfXygpYGAgbWV0aG9kXG4gICBpdCBzaG91bGQgbm90IGRlZmluZSBhIGBgX19oYXNoX18oKWBgIG9wZXJhdGlvbiBlaXRoZXI7IGlmIGl0XG4gICBkZWZpbmVzIGBgX19jbXBfXygpYGAgb3IgYGBfX2VxX18oKWBgIGJ1dCBub3QgYGBfX2hhc2hfXygpYGAsIGl0c1xuICAgaW5zdGFuY2VzIHdpbGwgbm90IGJlIHVzYWJsZSBpbiBoYXNoZWQgY29sbGVjdGlvbnMuICBJZiBhIGNsYXNzXG4gICBkZWZpbmVzIG11dGFibGUgb2JqZWN0cyBhbmQgaW1wbGVtZW50cyBhIGBgX19jbXBfXygpYGAgb3JcbiAgIGBgX19lcV9fKClgYCBtZXRob2QsIGl0IHNob3VsZCBub3QgaW1wbGVtZW50IGBgX19oYXNoX18oKWBgLCBzaW5jZVxuICAgaGFzaGFibGUgY29sbGVjdGlvbiBpbXBsZW1lbnRhdGlvbnMgcmVxdWlyZSB0aGF0IGEgb2JqZWN0XCdzIGhhc2hcbiAgIHZhbHVlIGlzIGltbXV0YWJsZSAoaWYgdGhlIG9iamVjdFwncyBoYXNoIHZhbHVlIGNoYW5nZXMsIGl0IHdpbGwgYmVcbiAgIGluIHRoZSB3cm9uZyBoYXNoIGJ1Y2tldCkuXG5cbiAgIFVzZXItZGVmaW5lZCBjbGFzc2VzIGhhdmUgYGBfX2NtcF9fKClgYCBhbmQgYGBfX2hhc2hfXygpYGAgbWV0aG9kc1xuICAgYnkgZGVmYXVsdDsgd2l0aCB0aGVtLCBhbGwgb2JqZWN0cyBjb21wYXJlIHVuZXF1YWwgKGV4Y2VwdCB3aXRoXG4gICB0aGVtc2VsdmVzKSBhbmQgYGB4Ll9faGFzaF9fKClgYCByZXR1cm5zIGEgcmVzdWx0IGRlcml2ZWQgZnJvbVxuICAgYGBpZCh4KWBgLlxuXG4gICBDbGFzc2VzIHdoaWNoIGluaGVyaXQgYSBgYF9faGFzaF9fKClgYCBtZXRob2QgZnJvbSBhIHBhcmVudCBjbGFzc1xuICAgYnV0IGNoYW5nZSB0aGUgbWVhbmluZyBvZiBgYF9fY21wX18oKWBgIG9yIGBgX19lcV9fKClgYCBzdWNoIHRoYXRcbiAgIHRoZSBoYXNoIHZhbHVlIHJldHVybmVkIGlzIG5vIGxvbmdlciBhcHByb3ByaWF0ZSAoZS5nLiBieSBzd2l0Y2hpbmdcbiAgIHRvIGEgdmFsdWUtYmFzZWQgY29uY2VwdCBvZiBlcXVhbGl0eSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0XG4gICBpZGVudGl0eSBiYXNlZCBlcXVhbGl0eSkgY2FuIGV4cGxpY2l0bHkgZmxhZyB0aGVtc2VsdmVzIGFzIGJlaW5nXG4gICB1bmhhc2hhYmxlIGJ5IHNldHRpbmcgYGBfX2hhc2hfXyA9IE5vbmVgYCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbi5cbiAgIERvaW5nIHNvIG1lYW5zIHRoYXQgbm90IG9ubHkgd2lsbCBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzIHJhaXNlIGFuXG4gICBhcHByb3ByaWF0ZSBgYFR5cGVFcnJvcmBgIHdoZW4gYSBwcm9ncmFtIGF0dGVtcHRzIHRvIHJldHJpZXZlIHRoZWlyXG4gICBoYXNoIHZhbHVlLCBidXQgdGhleSB3aWxsIGFsc28gYmUgY29ycmVjdGx5IGlkZW50aWZpZWQgYXNcbiAgIHVuaGFzaGFibGUgd2hlbiBjaGVja2luZyBgYGlzaW5zdGFuY2Uob2JqLCBjb2xsZWN0aW9ucy5IYXNoYWJsZSlgYFxuICAgKHVubGlrZSBjbGFzc2VzIHdoaWNoIGRlZmluZSB0aGVpciBvd24gYGBfX2hhc2hfXygpYGAgdG8gZXhwbGljaXRseVxuICAgcmFpc2UgYGBUeXBlRXJyb3JgYCkuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjU6IGBgX19oYXNoX18oKWBgIG1heSBub3cgYWxzbyByZXR1cm4gYSBsb25nXG4gICBpbnRlZ2VyIG9iamVjdDsgdGhlIDMyLWJpdCBpbnRlZ2VyIGlzIHRoZW4gZGVyaXZlZCBmcm9tIHRoZSBoYXNoIG9mXG4gICB0aGF0IG9iamVjdC5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNjogYGBfX2hhc2hfX2BgIG1heSBub3cgYmUgc2V0IHRvIGBgTm9uZWBgIHRvXG4gICBleHBsaWNpdGx5IGZsYWcgaW5zdGFuY2VzIG9mIGEgY2xhc3MgYXMgdW5oYXNoYWJsZS5cblxub2JqZWN0Ll9fbm9uemVyb19fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdHJ1dGggdmFsdWUgdGVzdGluZyBhbmQgdGhlIGJ1aWx0LWluIG9wZXJhdGlvblxuICAgYGBib29sKClgYDsgc2hvdWxkIHJldHVybiBgYEZhbHNlYGAgb3IgYGBUcnVlYGAsIG9yIHRoZWlyIGludGVnZXJcbiAgIGVxdWl2YWxlbnRzIGBgMGBgIG9yIGBgMWBgLiAgV2hlbiB0aGlzIG1ldGhvZCBpcyBub3QgZGVmaW5lZCxcbiAgIGBgX19sZW5fXygpYGAgaXMgY2FsbGVkLCBpZiBpdCBpcyBkZWZpbmVkLCBhbmQgdGhlIG9iamVjdCBpc1xuICAgY29uc2lkZXJlZCB0cnVlIGlmIGl0cyByZXN1bHQgaXMgbm9uemVyby4gSWYgYSBjbGFzcyBkZWZpbmVzXG4gICBuZWl0aGVyIGBgX19sZW5fXygpYGAgbm9yIGBgX19ub256ZXJvX18oKWBgLCBhbGwgaXRzIGluc3RhbmNlcyBhcmVcbiAgIGNvbnNpZGVyZWQgdHJ1ZS5cblxub2JqZWN0Ll9fdW5pY29kZV9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgYGB1bmljb2RlKClgYCBidWlsdC1pbjsgc2hvdWxkIHJldHVybiBhIFVuaWNvZGVcbiAgIG9iamVjdC4gV2hlbiB0aGlzIG1ldGhvZCBpcyBub3QgZGVmaW5lZCwgc3RyaW5nIGNvbnZlcnNpb24gaXNcbiAgIGF0dGVtcHRlZCwgYW5kIHRoZSByZXN1bHQgb2Ygc3RyaW5nIGNvbnZlcnNpb24gaXMgY29udmVydGVkIHRvXG4gICBVbmljb2RlIHVzaW5nIHRoZSBzeXN0ZW0gZGVmYXVsdCBlbmNvZGluZy5cblxuXG5DdXN0b21pemluZyBhdHRyaWJ1dGUgYWNjZXNzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBjdXN0b21pemUgdGhlIG1lYW5pbmcgb2ZcbmF0dHJpYnV0ZSBhY2Nlc3MgKHVzZSBvZiwgYXNzaWdubWVudCB0bywgb3IgZGVsZXRpb24gb2YgYGB4Lm5hbWVgYClcbmZvciBjbGFzcyBpbnN0YW5jZXMuXG5cbm9iamVjdC5fX2dldGF0dHJfXyhzZWxmLCBuYW1lKVxuXG4gICBDYWxsZWQgd2hlbiBhbiBhdHRyaWJ1dGUgbG9va3VwIGhhcyBub3QgZm91bmQgdGhlIGF0dHJpYnV0ZSBpbiB0aGVcbiAgIHVzdWFsIHBsYWNlcyAoaS5lLiBpdCBpcyBub3QgYW4gaW5zdGFuY2UgYXR0cmlidXRlIG5vciBpcyBpdCBmb3VuZFxuICAgaW4gdGhlIGNsYXNzIHRyZWUgZm9yIGBgc2VsZmBgKS4gIGBgbmFtZWBgIGlzIHRoZSBhdHRyaWJ1dGUgbmFtZS5cbiAgIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlXG4gICBhbiBgYEF0dHJpYnV0ZUVycm9yYGAgZXhjZXB0aW9uLlxuXG4gICBOb3RlIHRoYXQgaWYgdGhlIGF0dHJpYnV0ZSBpcyBmb3VuZCB0aHJvdWdoIHRoZSBub3JtYWwgbWVjaGFuaXNtLFxuICAgYGBfX2dldGF0dHJfXygpYGAgaXMgbm90IGNhbGxlZC4gIChUaGlzIGlzIGFuIGludGVudGlvbmFsIGFzeW1tZXRyeVxuICAgYmV0d2VlbiBgYF9fZ2V0YXR0cl9fKClgYCBhbmQgYGBfX3NldGF0dHJfXygpYGAuKSBUaGlzIGlzIGRvbmUgYm90aFxuICAgZm9yIGVmZmljaWVuY3kgcmVhc29ucyBhbmQgYmVjYXVzZSBvdGhlcndpc2UgYGBfX2dldGF0dHJfXygpYGBcbiAgIHdvdWxkIGhhdmUgbm8gd2F5IHRvIGFjY2VzcyBvdGhlciBhdHRyaWJ1dGVzIG9mIHRoZSBpbnN0YW5jZS4gIE5vdGVcbiAgIHRoYXQgYXQgbGVhc3QgZm9yIGluc3RhbmNlIHZhcmlhYmxlcywgeW91IGNhbiBmYWtlIHRvdGFsIGNvbnRyb2wgYnlcbiAgIG5vdCBpbnNlcnRpbmcgYW55IHZhbHVlcyBpbiB0aGUgaW5zdGFuY2UgYXR0cmlidXRlIGRpY3Rpb25hcnkgKGJ1dFxuICAgaW5zdGVhZCBpbnNlcnRpbmcgdGhlbSBpbiBhbm90aGVyIG9iamVjdCkuICBTZWUgdGhlXG4gICBgYF9fZ2V0YXR0cmlidXRlX18oKWBgIG1ldGhvZCBiZWxvdyBmb3IgYSB3YXkgdG8gYWN0dWFsbHkgZ2V0IHRvdGFsXG4gICBjb250cm9sIGluIG5ldy1zdHlsZSBjbGFzc2VzLlxuXG5vYmplY3QuX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpXG5cbiAgIENhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSBhc3NpZ25tZW50IGlzIGF0dGVtcHRlZC4gIFRoaXMgaXMgY2FsbGVkXG4gICBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgbWVjaGFuaXNtIChpLmUuIHN0b3JlIHRoZSB2YWx1ZSBpbiB0aGVcbiAgIGluc3RhbmNlIGRpY3Rpb25hcnkpLiAgKm5hbWUqIGlzIHRoZSBhdHRyaWJ1dGUgbmFtZSwgKnZhbHVlKiBpcyB0aGVcbiAgIHZhbHVlIHRvIGJlIGFzc2lnbmVkIHRvIGl0LlxuXG4gICBJZiBgYF9fc2V0YXR0cl9fKClgYCB3YW50cyB0byBhc3NpZ24gdG8gYW4gaW5zdGFuY2UgYXR0cmlidXRlLCBpdFxuICAgc2hvdWxkIG5vdCBzaW1wbHkgZXhlY3V0ZSBgYHNlbGYubmFtZSA9IHZhbHVlYGAgLS0tIHRoaXMgd291bGRcbiAgIGNhdXNlIGEgcmVjdXJzaXZlIGNhbGwgdG8gaXRzZWxmLiAgSW5zdGVhZCwgaXQgc2hvdWxkIGluc2VydCB0aGVcbiAgIHZhbHVlIGluIHRoZSBkaWN0aW9uYXJ5IG9mIGluc3RhbmNlIGF0dHJpYnV0ZXMsIGUuZy4sXG4gICBgYHNlbGYuX19kaWN0X19bbmFtZV0gPSB2YWx1ZWBgLiAgRm9yIG5ldy1zdHlsZSBjbGFzc2VzLCByYXRoZXJcbiAgIHRoYW4gYWNjZXNzaW5nIHRoZSBpbnN0YW5jZSBkaWN0aW9uYXJ5LCBpdCBzaG91bGQgY2FsbCB0aGUgYmFzZVxuICAgY2xhc3MgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSwgZm9yIGV4YW1wbGUsXG4gICBgYG9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSlgYC5cblxub2JqZWN0Ll9fZGVsYXR0cl9fKHNlbGYsIG5hbWUpXG5cbiAgIExpa2UgYGBfX3NldGF0dHJfXygpYGAgYnV0IGZvciBhdHRyaWJ1dGUgZGVsZXRpb24gaW5zdGVhZCBvZlxuICAgYXNzaWdubWVudC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgaWYgYGBkZWwgb2JqLm5hbWVgYCBpc1xuICAgbWVhbmluZ2Z1bCBmb3IgdGhlIG9iamVjdC5cblxuXG5Nb3JlIGF0dHJpYnV0ZSBhY2Nlc3MgZm9yIG5ldy1zdHlsZSBjbGFzc2VzXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvbmx5IGFwcGx5IHRvIG5ldy1zdHlsZSBjbGFzc2VzLlxuXG5vYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKVxuXG4gICBDYWxsZWQgdW5jb25kaXRpb25hbGx5IHRvIGltcGxlbWVudCBhdHRyaWJ1dGUgYWNjZXNzZXMgZm9yXG4gICBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzLiBJZiB0aGUgY2xhc3MgYWxzbyBkZWZpbmVzXG4gICBgYF9fZ2V0YXR0cl9fKClgYCwgdGhlIGxhdHRlciB3aWxsIG5vdCBiZSBjYWxsZWQgdW5sZXNzXG4gICBgYF9fZ2V0YXR0cmlidXRlX18oKWBgIGVpdGhlciBjYWxscyBpdCBleHBsaWNpdGx5IG9yIHJhaXNlcyBhblxuICAgYGBBdHRyaWJ1dGVFcnJvcmBgLiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSAoY29tcHV0ZWQpXG4gICBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2UgYW4gYGBBdHRyaWJ1dGVFcnJvcmBgIGV4Y2VwdGlvbi4gSW4gb3JkZXJcbiAgIHRvIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbiBpbiB0aGlzIG1ldGhvZCwgaXRzIGltcGxlbWVudGF0aW9uXG4gICBzaG91bGQgYWx3YXlzIGNhbGwgdGhlIGJhc2UgY2xhc3MgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSB0b1xuICAgYWNjZXNzIGFueSBhdHRyaWJ1dGVzIGl0IG5lZWRzLCBmb3IgZXhhbXBsZSxcbiAgIGBgb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSlgYC5cblxuICAgTm90ZTogVGhpcyBtZXRob2QgbWF5IHN0aWxsIGJlIGJ5cGFzc2VkIHdoZW4gbG9va2luZyB1cCBzcGVjaWFsIG1ldGhvZHNcbiAgICAgYXMgdGhlIHJlc3VsdCBvZiBpbXBsaWNpdCBpbnZvY2F0aW9uIHZpYSBsYW5ndWFnZSBzeW50YXggb3JcbiAgICAgYnVpbHQtaW4gZnVuY3Rpb25zLiBTZWUgKlNwZWNpYWwgbWV0aG9kIGxvb2t1cCBmb3IgbmV3LXN0eWxlXG4gICAgIGNsYXNzZXMqLlxuXG5cbkltcGxlbWVudGluZyBEZXNjcmlwdG9yc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvbmx5IGFwcGx5IHdoZW4gYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzXG5jb250YWluaW5nIHRoZSBtZXRob2QgKGEgc28tY2FsbGVkICpkZXNjcmlwdG9yKiBjbGFzcykgYXBwZWFycyBpbiBhblxuKm93bmVyKiBjbGFzcyAodGhlIGRlc2NyaXB0b3IgbXVzdCBiZSBpbiBlaXRoZXIgdGhlIG93bmVyXCdzIGNsYXNzXG5kaWN0aW9uYXJ5IG9yIGluIHRoZSBjbGFzcyBkaWN0aW9uYXJ5IGZvciBvbmUgb2YgaXRzIHBhcmVudHMpLiAgSW4gdGhlXG5leGFtcGxlcyBiZWxvdywgInRoZSBhdHRyaWJ1dGUiIHJlZmVycyB0byB0aGUgYXR0cmlidXRlIHdob3NlIG5hbWUgaXNcbnRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IGluIHRoZSBvd25lciBjbGFzc1wnIGBgX19kaWN0X19gYC5cblxub2JqZWN0Ll9fZ2V0X18oc2VsZiwgaW5zdGFuY2UsIG93bmVyKVxuXG4gICBDYWxsZWQgdG8gZ2V0IHRoZSBhdHRyaWJ1dGUgb2YgdGhlIG93bmVyIGNsYXNzIChjbGFzcyBhdHRyaWJ1dGVcbiAgIGFjY2Vzcykgb3Igb2YgYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcyAoaW5zdGFuY2UgYXR0cmlidXRlXG4gICBhY2Nlc3MpLiAqb3duZXIqIGlzIGFsd2F5cyB0aGUgb3duZXIgY2xhc3MsIHdoaWxlICppbnN0YW5jZSogaXMgdGhlXG4gICBpbnN0YW5jZSB0aGF0IHRoZSBhdHRyaWJ1dGUgd2FzIGFjY2Vzc2VkIHRocm91Z2gsIG9yIGBgTm9uZWBgIHdoZW5cbiAgIHRoZSBhdHRyaWJ1dGUgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgKm93bmVyKi4gIFRoaXMgbWV0aG9kIHNob3VsZFxuICAgcmV0dXJuIHRoZSAoY29tcHV0ZWQpIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZSBhblxuICAgYGBBdHRyaWJ1dGVFcnJvcmBgIGV4Y2VwdGlvbi5cblxub2JqZWN0Ll9fc2V0X18oc2VsZiwgaW5zdGFuY2UsIHZhbHVlKVxuXG4gICBDYWxsZWQgdG8gc2V0IHRoZSBhdHRyaWJ1dGUgb24gYW4gaW5zdGFuY2UgKmluc3RhbmNlKiBvZiB0aGUgb3duZXJcbiAgIGNsYXNzIHRvIGEgbmV3IHZhbHVlLCAqdmFsdWUqLlxuXG5vYmplY3QuX19kZWxldGVfXyhzZWxmLCBpbnN0YW5jZSlcblxuICAgQ2FsbGVkIHRvIGRlbGV0ZSB0aGUgYXR0cmlidXRlIG9uIGFuIGluc3RhbmNlICppbnN0YW5jZSogb2YgdGhlXG4gICBvd25lciBjbGFzcy5cblxuXG5JbnZva2luZyBEZXNjcmlwdG9yc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuSW4gZ2VuZXJhbCwgYSBkZXNjcmlwdG9yIGlzIGFuIG9iamVjdCBhdHRyaWJ1dGUgd2l0aCAiYmluZGluZ1xuYmVoYXZpb3IiLCBvbmUgd2hvc2UgYXR0cmlidXRlIGFjY2VzcyBoYXMgYmVlbiBvdmVycmlkZGVuIGJ5IG1ldGhvZHNcbmluIHRoZSBkZXNjcmlwdG9yIHByb3RvY29sOiAgYGBfX2dldF9fKClgYCwgYGBfX3NldF9fKClgYCwgYW5kXG5gYF9fZGVsZXRlX18oKWBgLiBJZiBhbnkgb2YgdGhvc2UgbWV0aG9kcyBhcmUgZGVmaW5lZCBmb3IgYW4gb2JqZWN0LFxuaXQgaXMgc2FpZCB0byBiZSBhIGRlc2NyaXB0b3IuXG5cblRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBhdHRyaWJ1dGUgYWNjZXNzIGlzIHRvIGdldCwgc2V0LCBvciBkZWxldGVcbnRoZSBhdHRyaWJ1dGUgZnJvbSBhbiBvYmplY3RcJ3MgZGljdGlvbmFyeS4gRm9yIGluc3RhbmNlLCBgYGEueGBgIGhhcyBhXG5sb29rdXAgY2hhaW4gc3RhcnRpbmcgd2l0aCBgYGEuX19kaWN0X19bXCd4XCddYGAsIHRoZW5cbmBgdHlwZShhKS5fX2RpY3RfX1tcJ3hcJ11gYCwgYW5kIGNvbnRpbnVpbmcgdGhyb3VnaCB0aGUgYmFzZSBjbGFzc2VzIG9mXG5gYHR5cGUoYSlgYCBleGNsdWRpbmcgbWV0YWNsYXNzZXMuXG5cbkhvd2V2ZXIsIGlmIHRoZSBsb29rZWQtdXAgdmFsdWUgaXMgYW4gb2JqZWN0IGRlZmluaW5nIG9uZSBvZiB0aGVcbmRlc2NyaXB0b3IgbWV0aG9kcywgdGhlbiBQeXRob24gbWF5IG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGFuZFxuaW52b2tlIHRoZSBkZXNjcmlwdG9yIG1ldGhvZCBpbnN0ZWFkLiAgV2hlcmUgdGhpcyBvY2N1cnMgaW4gdGhlXG5wcmVjZWRlbmNlIGNoYWluIGRlcGVuZHMgb24gd2hpY2ggZGVzY3JpcHRvciBtZXRob2RzIHdlcmUgZGVmaW5lZCBhbmRcbmhvdyB0aGV5IHdlcmUgY2FsbGVkLiAgTm90ZSB0aGF0IGRlc2NyaXB0b3JzIGFyZSBvbmx5IGludm9rZWQgZm9yIG5ld1xuc3R5bGUgb2JqZWN0cyBvciBjbGFzc2VzIChvbmVzIHRoYXQgc3ViY2xhc3MgYGBvYmplY3QoKWBgIG9yXG5gYHR5cGUoKWBgKS5cblxuVGhlIHN0YXJ0aW5nIHBvaW50IGZvciBkZXNjcmlwdG9yIGludm9jYXRpb24gaXMgYSBiaW5kaW5nLCBgYGEueGBgLlxuSG93IHRoZSBhcmd1bWVudHMgYXJlIGFzc2VtYmxlZCBkZXBlbmRzIG9uIGBgYWBgOlxuXG5EaXJlY3QgQ2FsbFxuICAgVGhlIHNpbXBsZXN0IGFuZCBsZWFzdCBjb21tb24gY2FsbCBpcyB3aGVuIHVzZXIgY29kZSBkaXJlY3RseVxuICAgaW52b2tlcyBhIGRlc2NyaXB0b3IgbWV0aG9kOiAgICBgYHguX19nZXRfXyhhKWBgLlxuXG5JbnN0YW5jZSBCaW5kaW5nXG4gICBJZiBiaW5kaW5nIHRvIGEgbmV3LXN0eWxlIG9iamVjdCBpbnN0YW5jZSwgYGBhLnhgYCBpcyB0cmFuc2Zvcm1lZFxuICAgaW50byB0aGUgY2FsbDogYGB0eXBlKGEpLl9fZGljdF9fW1wneFwnXS5fX2dldF9fKGEsIHR5cGUoYSkpYGAuXG5cbkNsYXNzIEJpbmRpbmdcbiAgIElmIGJpbmRpbmcgdG8gYSBuZXctc3R5bGUgY2xhc3MsIGBgQS54YGAgaXMgdHJhbnNmb3JtZWQgaW50byB0aGVcbiAgIGNhbGw6IGBgQS5fX2RpY3RfX1tcJ3hcJ10uX19nZXRfXyhOb25lLCBBKWBgLlxuXG5TdXBlciBCaW5kaW5nXG4gICBJZiBgYGFgYCBpcyBhbiBpbnN0YW5jZSBvZiBgYHN1cGVyYGAsIHRoZW4gdGhlIGJpbmRpbmcgYGBzdXBlcihCLFxuICAgb2JqKS5tKClgYCBzZWFyY2hlcyBgYG9iai5fX2NsYXNzX18uX19tcm9fX2BgIGZvciB0aGUgYmFzZSBjbGFzc1xuICAgYGBBYGAgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIGBgQmBgIGFuZCB0aGVuIGludm9rZXMgdGhlIGRlc2NyaXB0b3JcbiAgIHdpdGggdGhlIGNhbGw6IGBgQS5fX2RpY3RfX1tcJ21cJ10uX19nZXRfXyhvYmosIG9iai5fX2NsYXNzX18pYGAuXG5cbkZvciBpbnN0YW5jZSBiaW5kaW5ncywgdGhlIHByZWNlZGVuY2Ugb2YgZGVzY3JpcHRvciBpbnZvY2F0aW9uIGRlcGVuZHNcbm9uIHRoZSB3aGljaCBkZXNjcmlwdG9yIG1ldGhvZHMgYXJlIGRlZmluZWQuICBBIGRlc2NyaXB0b3IgY2FuIGRlZmluZVxuYW55IGNvbWJpbmF0aW9uIG9mIGBgX19nZXRfXygpYGAsIGBgX19zZXRfXygpYGAgYW5kIGBgX19kZWxldGVfXygpYGAuXG5JZiBpdCBkb2VzIG5vdCBkZWZpbmUgYGBfX2dldF9fKClgYCwgdGhlbiBhY2Nlc3NpbmcgdGhlIGF0dHJpYnV0ZSB3aWxsXG5yZXR1cm4gdGhlIGRlc2NyaXB0b3Igb2JqZWN0IGl0c2VsZiB1bmxlc3MgdGhlcmUgaXMgYSB2YWx1ZSBpbiB0aGVcbm9iamVjdFwncyBpbnN0YW5jZSBkaWN0aW9uYXJ5LiAgSWYgdGhlIGRlc2NyaXB0b3IgZGVmaW5lcyBgYF9fc2V0X18oKWBgXG5hbmQvb3IgYGBfX2RlbGV0ZV9fKClgYCwgaXQgaXMgYSBkYXRhIGRlc2NyaXB0b3I7IGlmIGl0IGRlZmluZXNcbm5laXRoZXIsIGl0IGlzIGEgbm9uLWRhdGEgZGVzY3JpcHRvci4gIE5vcm1hbGx5LCBkYXRhIGRlc2NyaXB0b3JzXG5kZWZpbmUgYm90aCBgYF9fZ2V0X18oKWBgIGFuZCBgYF9fc2V0X18oKWBgLCB3aGlsZSBub24tZGF0YVxuZGVzY3JpcHRvcnMgaGF2ZSBqdXN0IHRoZSBgYF9fZ2V0X18oKWBgIG1ldGhvZC4gIERhdGEgZGVzY3JpcHRvcnMgd2l0aFxuYGBfX3NldF9fKClgYCBhbmQgYGBfX2dldF9fKClgYCBkZWZpbmVkIGFsd2F5cyBvdmVycmlkZSBhIHJlZGVmaW5pdGlvblxuaW4gYW4gaW5zdGFuY2UgZGljdGlvbmFyeS4gIEluIGNvbnRyYXN0LCBub24tZGF0YSBkZXNjcmlwdG9ycyBjYW4gYmVcbm92ZXJyaWRkZW4gYnkgaW5zdGFuY2VzLlxuXG5QeXRob24gbWV0aG9kcyAoaW5jbHVkaW5nIGBgc3RhdGljbWV0aG9kKClgYCBhbmQgYGBjbGFzc21ldGhvZCgpYGApXG5hcmUgaW1wbGVtZW50ZWQgYXMgbm9uLWRhdGEgZGVzY3JpcHRvcnMuICBBY2NvcmRpbmdseSwgaW5zdGFuY2VzIGNhblxucmVkZWZpbmUgYW5kIG92ZXJyaWRlIG1ldGhvZHMuICBUaGlzIGFsbG93cyBpbmRpdmlkdWFsIGluc3RhbmNlcyB0b1xuYWNxdWlyZSBiZWhhdmlvcnMgdGhhdCBkaWZmZXIgZnJvbSBvdGhlciBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgY2xhc3MuXG5cblRoZSBgYHByb3BlcnR5KClgYCBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBhcyBhIGRhdGEgZGVzY3JpcHRvci5cbkFjY29yZGluZ2x5LCBpbnN0YW5jZXMgY2Fubm90IG92ZXJyaWRlIHRoZSBiZWhhdmlvciBvZiBhIHByb3BlcnR5LlxuXG5cbl9fc2xvdHNfX1xuLS0tLS0tLS0tXG5cbkJ5IGRlZmF1bHQsIGluc3RhbmNlcyBvZiBib3RoIG9sZCBhbmQgbmV3LXN0eWxlIGNsYXNzZXMgaGF2ZSBhXG5kaWN0aW9uYXJ5IGZvciBhdHRyaWJ1dGUgc3RvcmFnZS4gIFRoaXMgd2FzdGVzIHNwYWNlIGZvciBvYmplY3RzXG5oYXZpbmcgdmVyeSBmZXcgaW5zdGFuY2UgdmFyaWFibGVzLiAgVGhlIHNwYWNlIGNvbnN1bXB0aW9uIGNhbiBiZWNvbWVcbmFjdXRlIHdoZW4gY3JlYXRpbmcgbGFyZ2UgbnVtYmVycyBvZiBpbnN0YW5jZXMuXG5cblRoZSBkZWZhdWx0IGNhbiBiZSBvdmVycmlkZGVuIGJ5IGRlZmluaW5nICpfX3Nsb3RzX18qIGluIGEgbmV3LXN0eWxlXG5jbGFzcyBkZWZpbml0aW9uLiAgVGhlICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIHRha2VzIGEgc2VxdWVuY2Ugb2Zcbmluc3RhbmNlIHZhcmlhYmxlcyBhbmQgcmVzZXJ2ZXMganVzdCBlbm91Z2ggc3BhY2UgaW4gZWFjaCBpbnN0YW5jZSB0b1xuaG9sZCBhIHZhbHVlIGZvciBlYWNoIHZhcmlhYmxlLiAgU3BhY2UgaXMgc2F2ZWQgYmVjYXVzZSAqX19kaWN0X18qIGlzXG5ub3QgY3JlYXRlZCBmb3IgZWFjaCBpbnN0YW5jZS5cblxuX19zbG90c19fXG5cbiAgIFRoaXMgY2xhc3MgdmFyaWFibGUgY2FuIGJlIGFzc2lnbmVkIGEgc3RyaW5nLCBpdGVyYWJsZSwgb3Igc2VxdWVuY2VcbiAgIG9mIHN0cmluZ3Mgd2l0aCB2YXJpYWJsZSBuYW1lcyB1c2VkIGJ5IGluc3RhbmNlcy4gIElmIGRlZmluZWQgaW4gYVxuICAgbmV3LXN0eWxlIGNsYXNzLCAqX19zbG90c19fKiByZXNlcnZlcyBzcGFjZSBmb3IgdGhlIGRlY2xhcmVkXG4gICB2YXJpYWJsZXMgYW5kIHByZXZlbnRzIHRoZSBhdXRvbWF0aWMgY3JlYXRpb24gb2YgKl9fZGljdF9fKiBhbmRcbiAgICpfX3dlYWtyZWZfXyogZm9yIGVhY2ggaW5zdGFuY2UuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDIuMi5cblxuTm90ZXMgb24gdXNpbmcgKl9fc2xvdHNfXypcblxuKiBXaGVuIGluaGVyaXRpbmcgZnJvbSBhIGNsYXNzIHdpdGhvdXQgKl9fc2xvdHNfXyosIHRoZSAqX19kaWN0X18qXG4gIGF0dHJpYnV0ZSBvZiB0aGF0IGNsYXNzIHdpbGwgYWx3YXlzIGJlIGFjY2Vzc2libGUsIHNvIGEgKl9fc2xvdHNfXypcbiAgZGVmaW5pdGlvbiBpbiB0aGUgc3ViY2xhc3MgaXMgbWVhbmluZ2xlc3MuXG5cbiogV2l0aG91dCBhICpfX2RpY3RfXyogdmFyaWFibGUsIGluc3RhbmNlcyBjYW5ub3QgYmUgYXNzaWduZWQgbmV3XG4gIHZhcmlhYmxlcyBub3QgbGlzdGVkIGluIHRoZSAqX19zbG90c19fKiBkZWZpbml0aW9uLiAgQXR0ZW1wdHMgdG9cbiAgYXNzaWduIHRvIGFuIHVubGlzdGVkIHZhcmlhYmxlIG5hbWUgcmFpc2VzIGBgQXR0cmlidXRlRXJyb3JgYC4gSWZcbiAgZHluYW1pYyBhc3NpZ25tZW50IG9mIG5ldyB2YXJpYWJsZXMgaXMgZGVzaXJlZCwgdGhlbiBhZGRcbiAgYGBcJ19fZGljdF9fXCdgYCB0byB0aGUgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBpbiB0aGUgKl9fc2xvdHNfXypcbiAgZGVjbGFyYXRpb24uXG5cbiAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMzogUHJldmlvdXNseSwgYWRkaW5nIGBgXCdfX2RpY3RfX1wnYGAgdG8gdGhlXG4gICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIHdvdWxkIG5vdCBlbmFibGUgdGhlIGFzc2lnbm1lbnQgb2YgbmV3XG4gIGF0dHJpYnV0ZXMgbm90IHNwZWNpZmljYWxseSBsaXN0ZWQgaW4gdGhlIHNlcXVlbmNlIG9mIGluc3RhbmNlXG4gIHZhcmlhYmxlIG5hbWVzLlxuXG4qIFdpdGhvdXQgYSAqX193ZWFrcmVmX18qIHZhcmlhYmxlIGZvciBlYWNoIGluc3RhbmNlLCBjbGFzc2VzIGRlZmluaW5nXG4gICpfX3Nsb3RzX18qIGRvIG5vdCBzdXBwb3J0IHdlYWsgcmVmZXJlbmNlcyB0byBpdHMgaW5zdGFuY2VzLiBJZiB3ZWFrXG4gIHJlZmVyZW5jZSBzdXBwb3J0IGlzIG5lZWRlZCwgdGhlbiBhZGQgYGBcJ19fd2Vha3JlZl9fXCdgYCB0byB0aGVcbiAgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBpbiB0aGUgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24uXG5cbiAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMzogUHJldmlvdXNseSwgYWRkaW5nIGBgXCdfX3dlYWtyZWZfX1wnYGAgdG8gdGhlXG4gICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIHdvdWxkIG5vdCBlbmFibGUgc3VwcG9ydCBmb3Igd2Vha1xuICByZWZlcmVuY2VzLlxuXG4qICpfX3Nsb3RzX18qIGFyZSBpbXBsZW1lbnRlZCBhdCB0aGUgY2xhc3MgbGV2ZWwgYnkgY3JlYXRpbmdcbiAgZGVzY3JpcHRvcnMgKCpJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnMqKSBmb3IgZWFjaCB2YXJpYWJsZSBuYW1lLiAgQXNcbiAgYSByZXN1bHQsIGNsYXNzIGF0dHJpYnV0ZXMgY2Fubm90IGJlIHVzZWQgdG8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvclxuICBpbnN0YW5jZSB2YXJpYWJsZXMgZGVmaW5lZCBieSAqX19zbG90c19fKjsgb3RoZXJ3aXNlLCB0aGUgY2xhc3NcbiAgYXR0cmlidXRlIHdvdWxkIG92ZXJ3cml0ZSB0aGUgZGVzY3JpcHRvciBhc3NpZ25tZW50LlxuXG4qIFRoZSBhY3Rpb24gb2YgYSAqX19zbG90c19fKiBkZWNsYXJhdGlvbiBpcyBsaW1pdGVkIHRvIHRoZSBjbGFzc1xuICB3aGVyZSBpdCBpcyBkZWZpbmVkLiAgQXMgYSByZXN1bHQsIHN1YmNsYXNzZXMgd2lsbCBoYXZlIGEgKl9fZGljdF9fKlxuICB1bmxlc3MgdGhleSBhbHNvIGRlZmluZSAqX19zbG90c19fKiAod2hpY2ggbXVzdCBvbmx5IGNvbnRhaW4gbmFtZXNcbiAgb2YgYW55ICphZGRpdGlvbmFsKiBzbG90cykuXG5cbiogSWYgYSBjbGFzcyBkZWZpbmVzIGEgc2xvdCBhbHNvIGRlZmluZWQgaW4gYSBiYXNlIGNsYXNzLCB0aGUgaW5zdGFuY2VcbiAgdmFyaWFibGUgZGVmaW5lZCBieSB0aGUgYmFzZSBjbGFzcyBzbG90IGlzIGluYWNjZXNzaWJsZSAoZXhjZXB0IGJ5XG4gIHJldHJpZXZpbmcgaXRzIGRlc2NyaXB0b3IgZGlyZWN0bHkgZnJvbSB0aGUgYmFzZSBjbGFzcykuIFRoaXNcbiAgcmVuZGVycyB0aGUgbWVhbmluZyBvZiB0aGUgcHJvZ3JhbSB1bmRlZmluZWQuICBJbiB0aGUgZnV0dXJlLCBhXG4gIGNoZWNrIG1heSBiZSBhZGRlZCB0byBwcmV2ZW50IHRoaXMuXG5cbiogTm9uZW1wdHkgKl9fc2xvdHNfXyogZG9lcyBub3Qgd29yayBmb3IgY2xhc3NlcyBkZXJpdmVkIGZyb21cbiAgInZhcmlhYmxlLWxlbmd0aCIgYnVpbHQtaW4gdHlwZXMgc3VjaCBhcyBgYGxvbmdgYCwgYGBzdHJgYCBhbmRcbiAgYGB0dXBsZWBgLlxuXG4qIEFueSBub24tc3RyaW5nIGl0ZXJhYmxlIG1heSBiZSBhc3NpZ25lZCB0byAqX19zbG90c19fKi4gTWFwcGluZ3MgbWF5XG4gIGFsc28gYmUgdXNlZDsgaG93ZXZlciwgaW4gdGhlIGZ1dHVyZSwgc3BlY2lhbCBtZWFuaW5nIG1heSBiZVxuICBhc3NpZ25lZCB0byB0aGUgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBrZXkuXG5cbiogKl9fY2xhc3NfXyogYXNzaWdubWVudCB3b3JrcyBvbmx5IGlmIGJvdGggY2xhc3NlcyBoYXZlIHRoZSBzYW1lXG4gICpfX3Nsb3RzX18qLlxuXG4gIENoYW5nZWQgaW4gdmVyc2lvbiAyLjY6IFByZXZpb3VzbHksICpfX2NsYXNzX18qIGFzc2lnbm1lbnQgcmFpc2VkIGFuXG4gIGVycm9yIGlmIGVpdGhlciBuZXcgb3Igb2xkIGNsYXNzIGhhZCAqX19zbG90c19fKi5cblxuXG5DdXN0b21pemluZyBjbGFzcyBjcmVhdGlvblxuPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuQnkgZGVmYXVsdCwgbmV3LXN0eWxlIGNsYXNzZXMgYXJlIGNvbnN0cnVjdGVkIHVzaW5nIGBgdHlwZSgpYGAuIEFcbmNsYXNzIGRlZmluaXRpb24gaXMgcmVhZCBpbnRvIGEgc2VwYXJhdGUgbmFtZXNwYWNlIGFuZCB0aGUgdmFsdWUgb2ZcbmNsYXNzIG5hbWUgaXMgYm91bmQgdG8gdGhlIHJlc3VsdCBvZiBgYHR5cGUobmFtZSwgYmFzZXMsIGRpY3QpYGAuXG5cbldoZW4gdGhlIGNsYXNzIGRlZmluaXRpb24gaXMgcmVhZCwgaWYgKl9fbWV0YWNsYXNzX18qIGlzIGRlZmluZWQgdGhlblxudGhlIGNhbGxhYmxlIGFzc2lnbmVkIHRvIGl0IHdpbGwgYmUgY2FsbGVkIGluc3RlYWQgb2YgYGB0eXBlKClgYC4gVGhpc1xuYWxsb3dzIGNsYXNzZXMgb3IgZnVuY3Rpb25zIHRvIGJlIHdyaXR0ZW4gd2hpY2ggbW9uaXRvciBvciBhbHRlciB0aGVcbmNsYXNzIGNyZWF0aW9uIHByb2Nlc3M6XG5cbiogTW9kaWZ5aW5nIHRoZSBjbGFzcyBkaWN0aW9uYXJ5IHByaW9yIHRvIHRoZSBjbGFzcyBiZWluZyBjcmVhdGVkLlxuXG4qIFJldHVybmluZyBhbiBpbnN0YW5jZSBvZiBhbm90aGVyIGNsYXNzIC0tIGVzc2VudGlhbGx5IHBlcmZvcm1pbmcgdGhlXG4gIHJvbGUgb2YgYSBmYWN0b3J5IGZ1bmN0aW9uLlxuXG5UaGVzZSBzdGVwcyB3aWxsIGhhdmUgdG8gYmUgcGVyZm9ybWVkIGluIHRoZSBtZXRhY2xhc3NcJ3MgYGBfX25ld19fKClgYFxubWV0aG9kIC0tIGBgdHlwZS5fX25ld19fKClgYCBjYW4gdGhlbiBiZSBjYWxsZWQgZnJvbSB0aGlzIG1ldGhvZCB0b1xuY3JlYXRlIGEgY2xhc3Mgd2l0aCBkaWZmZXJlbnQgcHJvcGVydGllcy4gIFRoaXMgZXhhbXBsZSBhZGRzIGEgbmV3XG5lbGVtZW50IHRvIHRoZSBjbGFzcyBkaWN0aW9uYXJ5IGJlZm9yZSBjcmVhdGluZyB0aGUgY2xhc3M6XG5cbiAgIGNsYXNzIG1ldGFjbHModHlwZSk6XG4gICAgICAgZGVmIF9fbmV3X18obWNzLCBuYW1lLCBiYXNlcywgZGljdCk6XG4gICAgICAgICAgIGRpY3RbXCdmb29cJ10gPSBcJ21ldGFjbHMgd2FzIGhlcmVcJ1xuICAgICAgICAgICByZXR1cm4gdHlwZS5fX25ld19fKG1jcywgbmFtZSwgYmFzZXMsIGRpY3QpXG5cbllvdSBjYW4gb2YgY291cnNlIGFsc28gb3ZlcnJpZGUgb3RoZXIgY2xhc3MgbWV0aG9kcyAob3IgYWRkIG5ld1xubWV0aG9kcyk7IGZvciBleGFtcGxlIGRlZmluaW5nIGEgY3VzdG9tIGBgX19jYWxsX18oKWBgIG1ldGhvZCBpbiB0aGVcbm1ldGFjbGFzcyBhbGxvd3MgY3VzdG9tIGJlaGF2aW9yIHdoZW4gdGhlIGNsYXNzIGlzIGNhbGxlZCwgZS5nLiBub3RcbmFsd2F5cyBjcmVhdGluZyBhIG5ldyBpbnN0YW5jZS5cblxuX19tZXRhY2xhc3NfX1xuXG4gICBUaGlzIHZhcmlhYmxlIGNhbiBiZSBhbnkgY2FsbGFibGUgYWNjZXB0aW5nIGFyZ3VtZW50cyBmb3IgYGBuYW1lYGAsXG4gICBgYGJhc2VzYGAsIGFuZCBgYGRpY3RgYC4gIFVwb24gY2xhc3MgY3JlYXRpb24sIHRoZSBjYWxsYWJsZSBpcyB1c2VkXG4gICBpbnN0ZWFkIG9mIHRoZSBidWlsdC1pbiBgYHR5cGUoKWBgLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjIuXG5cblRoZSBhcHByb3ByaWF0ZSBtZXRhY2xhc3MgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZm9sbG93aW5nIHByZWNlZGVuY2VcbnJ1bGVzOlxuXG4qIElmIGBgZGljdFtcJ19fbWV0YWNsYXNzX19cJ11gYCBleGlzdHMsIGl0IGlzIHVzZWQuXG5cbiogT3RoZXJ3aXNlLCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgYmFzZSBjbGFzcywgaXRzIG1ldGFjbGFzcyBpc1xuICB1c2VkICh0aGlzIGxvb2tzIGZvciBhICpfX2NsYXNzX18qIGF0dHJpYnV0ZSBmaXJzdCBhbmQgaWYgbm90IGZvdW5kLFxuICB1c2VzIGl0cyB0eXBlKS5cblxuKiBPdGhlcndpc2UsIGlmIGEgZ2xvYmFsIHZhcmlhYmxlIG5hbWVkIF9fbWV0YWNsYXNzX18gZXhpc3RzLCBpdCBpc1xuICB1c2VkLlxuXG4qIE90aGVyd2lzZSwgdGhlIG9sZC1zdHlsZSwgY2xhc3NpYyBtZXRhY2xhc3MgKHR5cGVzLkNsYXNzVHlwZSkgaXNcbiAgdXNlZC5cblxuVGhlIHBvdGVudGlhbCB1c2VzIGZvciBtZXRhY2xhc3NlcyBhcmUgYm91bmRsZXNzLiBTb21lIGlkZWFzIHRoYXQgaGF2ZVxuYmVlbiBleHBsb3JlZCBpbmNsdWRpbmcgbG9nZ2luZywgaW50ZXJmYWNlIGNoZWNraW5nLCBhdXRvbWF0aWNcbmRlbGVnYXRpb24sIGF1dG9tYXRpYyBwcm9wZXJ0eSBjcmVhdGlvbiwgcHJveGllcywgZnJhbWV3b3JrcywgYW5kXG5hdXRvbWF0aWMgcmVzb3VyY2UgbG9ja2luZy9zeW5jaHJvbml6YXRpb24uXG5cblxuQ3VzdG9taXppbmcgaW5zdGFuY2UgYW5kIHN1YmNsYXNzIGNoZWNrc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5OZXcgaW4gdmVyc2lvbiAyLjYuXG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGVcbmBgaXNpbnN0YW5jZSgpYGAgYW5kIGBgaXNzdWJjbGFzcygpYGAgYnVpbHQtaW4gZnVuY3Rpb25zLlxuXG5JbiBwYXJ0aWN1bGFyLCB0aGUgbWV0YWNsYXNzIGBgYWJjLkFCQ01ldGFgYCBpbXBsZW1lbnRzIHRoZXNlIG1ldGhvZHNcbmluIG9yZGVyIHRvIGFsbG93IHRoZSBhZGRpdGlvbiBvZiBBYnN0cmFjdCBCYXNlIENsYXNzZXMgKEFCQ3MpIGFzXG4idmlydHVhbCBiYXNlIGNsYXNzZXMiIHRvIGFueSBjbGFzcyBvciB0eXBlIChpbmNsdWRpbmcgYnVpbHQtaW5cbnR5cGVzKSwgaW5jbHVkaW5nIG90aGVyIEFCQ3MuXG5cbmNsYXNzLl9faW5zdGFuY2VjaGVja19fKHNlbGYsIGluc3RhbmNlKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiAqaW5zdGFuY2UqIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgKGRpcmVjdCBvclxuICAgaW5kaXJlY3QpIGluc3RhbmNlIG9mICpjbGFzcyouIElmIGRlZmluZWQsIGNhbGxlZCB0byBpbXBsZW1lbnRcbiAgIGBgaXNpbnN0YW5jZShpbnN0YW5jZSwgY2xhc3MpYGAuXG5cbmNsYXNzLl9fc3ViY2xhc3NjaGVja19fKHNlbGYsIHN1YmNsYXNzKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiAqc3ViY2xhc3MqIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgKGRpcmVjdCBvclxuICAgaW5kaXJlY3QpIHN1YmNsYXNzIG9mICpjbGFzcyouICBJZiBkZWZpbmVkLCBjYWxsZWQgdG8gaW1wbGVtZW50XG4gICBgYGlzc3ViY2xhc3Moc3ViY2xhc3MsIGNsYXNzKWBgLlxuXG5Ob3RlIHRoYXQgdGhlc2UgbWV0aG9kcyBhcmUgbG9va2VkIHVwIG9uIHRoZSB0eXBlIChtZXRhY2xhc3MpIG9mIGFcbmNsYXNzLiAgVGhleSBjYW5ub3QgYmUgZGVmaW5lZCBhcyBjbGFzcyBtZXRob2RzIGluIHRoZSBhY3R1YWwgY2xhc3MuXG5UaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgbG9va3VwIG9mIHNwZWNpYWwgbWV0aG9kcyB0aGF0IGFyZSBjYWxsZWRcbm9uIGluc3RhbmNlcywgb25seSBpbiB0aGlzIGNhc2UgdGhlIGluc3RhbmNlIGlzIGl0c2VsZiBhIGNsYXNzLlxuXG5TZWUgYWxzbzpcblxuICAgKipQRVAgMzExOSoqIC0gSW50cm9kdWNpbmcgQWJzdHJhY3QgQmFzZSBDbGFzc2VzXG4gICAgICBJbmNsdWRlcyB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgY3VzdG9taXppbmcgYGBpc2luc3RhbmNlKClgYCBhbmRcbiAgICAgIGBgaXNzdWJjbGFzcygpYGAgYmVoYXZpb3IgdGhyb3VnaCBgYF9faW5zdGFuY2VjaGVja19fKClgYCBhbmRcbiAgICAgIGBgX19zdWJjbGFzc2NoZWNrX18oKWBgLCB3aXRoIG1vdGl2YXRpb24gZm9yIHRoaXMgZnVuY3Rpb25hbGl0eVxuICAgICAgaW4gdGhlIGNvbnRleHQgb2YgYWRkaW5nIEFic3RyYWN0IEJhc2UgQ2xhc3NlcyAoc2VlIHRoZSBgYGFiY2BgXG4gICAgICBtb2R1bGUpIHRvIHRoZSBsYW5ndWFnZS5cblxuXG5FbXVsYXRpbmcgY2FsbGFibGUgb2JqZWN0c1xuPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxub2JqZWN0Ll9fY2FsbF9fKHNlbGZbLCBhcmdzLi4uXSlcblxuICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzICJjYWxsZWQiIGFzIGEgZnVuY3Rpb247IGlmIHRoaXMgbWV0aG9kXG4gICBpcyBkZWZpbmVkLCBgYHgoYXJnMSwgYXJnMiwgLi4uKWBgIGlzIGEgc2hvcnRoYW5kIGZvclxuICAgYGB4Ll9fY2FsbF9fKGFyZzEsIGFyZzIsIC4uLilgYC5cblxuXG5FbXVsYXRpbmcgY29udGFpbmVyIHR5cGVzXG49PT09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBpbXBsZW1lbnQgY29udGFpbmVyIG9iamVjdHMuXG5Db250YWluZXJzIHVzdWFsbHkgYXJlIHNlcXVlbmNlcyAoc3VjaCBhcyBsaXN0cyBvciB0dXBsZXMpIG9yIG1hcHBpbmdzXG4obGlrZSBkaWN0aW9uYXJpZXMpLCBidXQgY2FuIHJlcHJlc2VudCBvdGhlciBjb250YWluZXJzIGFzIHdlbGwuICBUaGVcbmZpcnN0IHNldCBvZiBtZXRob2RzIGlzIHVzZWQgZWl0aGVyIHRvIGVtdWxhdGUgYSBzZXF1ZW5jZSBvciB0b1xuZW11bGF0ZSBhIG1hcHBpbmc7IHRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgZm9yIGEgc2VxdWVuY2UsIHRoZVxuYWxsb3dhYmxlIGtleXMgc2hvdWxkIGJlIHRoZSBpbnRlZ2VycyAqayogZm9yIHdoaWNoIGBgMCA8PSBrIDwgTmBgXG53aGVyZSAqTiogaXMgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UsIG9yIHNsaWNlIG9iamVjdHMsIHdoaWNoXG5kZWZpbmUgYSByYW5nZSBvZiBpdGVtcy4gKEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdGhlIG1ldGhvZFxuYGBfX2dldHNsaWNlX18oKWBgIChzZWUgYmVsb3cpIGNhbiBhbHNvIGJlIGRlZmluZWQgdG8gaGFuZGxlIHNpbXBsZSxcbmJ1dCBub3QgZXh0ZW5kZWQgc2xpY2VzLikgSXQgaXMgYWxzbyByZWNvbW1lbmRlZCB0aGF0IG1hcHBpbmdzIHByb3ZpZGVcbnRoZSBtZXRob2RzIGBga2V5cygpYGAsIGBgdmFsdWVzKClgYCwgYGBpdGVtcygpYGAsIGBgaGFzX2tleSgpYGAsXG5gYGdldCgpYGAsIGBgY2xlYXIoKWBgLCBgYHNldGRlZmF1bHQoKWBgLCBgYGl0ZXJrZXlzKClgYCxcbmBgaXRlcnZhbHVlcygpYGAsIGBgaXRlcml0ZW1zKClgYCwgYGBwb3AoKWBgLCBgYHBvcGl0ZW0oKWBgLFxuYGBjb3B5KClgYCwgYW5kIGBgdXBkYXRlKClgYCBiZWhhdmluZyBzaW1pbGFyIHRvIHRob3NlIGZvciBQeXRob25cJ3NcbnN0YW5kYXJkIGRpY3Rpb25hcnkgb2JqZWN0cy4gIFRoZSBgYFVzZXJEaWN0YGAgbW9kdWxlIHByb3ZpZGVzIGFcbmBgRGljdE1peGluYGAgY2xhc3MgdG8gaGVscCBjcmVhdGUgdGhvc2UgbWV0aG9kcyBmcm9tIGEgYmFzZSBzZXQgb2ZcbmBgX19nZXRpdGVtX18oKWBgLCBgYF9fc2V0aXRlbV9fKClgYCwgYGBfX2RlbGl0ZW1fXygpYGAsIGFuZFxuYGBrZXlzKClgYC4gTXV0YWJsZSBzZXF1ZW5jZXMgc2hvdWxkIHByb3ZpZGUgbWV0aG9kcyBgYGFwcGVuZCgpYGAsXG5gYGNvdW50KClgYCwgYGBpbmRleCgpYGAsIGBgZXh0ZW5kKClgYCwgYGBpbnNlcnQoKWBgLCBgYHBvcCgpYGAsXG5gYHJlbW92ZSgpYGAsIGBgcmV2ZXJzZSgpYGAgYW5kIGBgc29ydCgpYGAsIGxpa2UgUHl0aG9uIHN0YW5kYXJkIGxpc3Rcbm9iamVjdHMuICBGaW5hbGx5LCBzZXF1ZW5jZSB0eXBlcyBzaG91bGQgaW1wbGVtZW50IGFkZGl0aW9uIChtZWFuaW5nXG5jb25jYXRlbmF0aW9uKSBhbmQgbXVsdGlwbGljYXRpb24gKG1lYW5pbmcgcmVwZXRpdGlvbikgYnkgZGVmaW5pbmcgdGhlXG5tZXRob2RzIGBgX19hZGRfXygpYGAsIGBgX19yYWRkX18oKWBgLCBgYF9faWFkZF9fKClgYCwgYGBfX211bF9fKClgYCxcbmBgX19ybXVsX18oKWBgIGFuZCBgYF9faW11bF9fKClgYCBkZXNjcmliZWQgYmVsb3c7IHRoZXkgc2hvdWxkIG5vdFxuZGVmaW5lIGBgX19jb2VyY2VfXygpYGAgb3Igb3RoZXIgbnVtZXJpY2FsIG9wZXJhdG9ycy4gIEl0IGlzXG5yZWNvbW1lbmRlZCB0aGF0IGJvdGggbWFwcGluZ3MgYW5kIHNlcXVlbmNlcyBpbXBsZW1lbnQgdGhlXG5gYF9fY29udGFpbnNfXygpYGAgbWV0aG9kIHRvIGFsbG93IGVmZmljaWVudCB1c2Ugb2YgdGhlIGBgaW5gYFxub3BlcmF0b3I7IGZvciBtYXBwaW5ncywgYGBpbmBgIHNob3VsZCBiZSBlcXVpdmFsZW50IG9mIGBgaGFzX2tleSgpYGA7XG5mb3Igc2VxdWVuY2VzLCBpdCBzaG91bGQgc2VhcmNoIHRocm91Z2ggdGhlIHZhbHVlcy4gIEl0IGlzIGZ1cnRoZXJcbnJlY29tbWVuZGVkIHRoYXQgYm90aCBtYXBwaW5ncyBhbmQgc2VxdWVuY2VzIGltcGxlbWVudCB0aGVcbmBgX19pdGVyX18oKWBgIG1ldGhvZCB0byBhbGxvdyBlZmZpY2llbnQgaXRlcmF0aW9uIHRocm91Z2ggdGhlXG5jb250YWluZXI7IGZvciBtYXBwaW5ncywgYGBfX2l0ZXJfXygpYGAgc2hvdWxkIGJlIHRoZSBzYW1lIGFzXG5gYGl0ZXJrZXlzKClgYDsgZm9yIHNlcXVlbmNlcywgaXQgc2hvdWxkIGl0ZXJhdGUgdGhyb3VnaCB0aGUgdmFsdWVzLlxuXG5vYmplY3QuX19sZW5fXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYGxlbigpYGAuICBTaG91bGQgcmV0dXJuXG4gICB0aGUgbGVuZ3RoIG9mIHRoZSBvYmplY3QsIGFuIGludGVnZXIgYGA+PWBgIDAuICBBbHNvLCBhbiBvYmplY3RcbiAgIHRoYXQgZG9lc25cJ3QgZGVmaW5lIGEgYGBfX25vbnplcm9fXygpYGAgbWV0aG9kIGFuZCB3aG9zZVxuICAgYGBfX2xlbl9fKClgYCBtZXRob2QgcmV0dXJucyB6ZXJvIGlzIGNvbnNpZGVyZWQgdG8gYmUgZmFsc2UgaW4gYVxuICAgQm9vbGVhbiBjb250ZXh0LlxuXG5vYmplY3QuX19nZXRpdGVtX18oc2VsZiwga2V5KVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IGV2YWx1YXRpb24gb2YgYGBzZWxmW2tleV1gYC4gRm9yIHNlcXVlbmNlXG4gICB0eXBlcywgdGhlIGFjY2VwdGVkIGtleXMgc2hvdWxkIGJlIGludGVnZXJzIGFuZCBzbGljZSBvYmplY3RzLlxuICAgTm90ZSB0aGF0IHRoZSBzcGVjaWFsIGludGVycHJldGF0aW9uIG9mIG5lZ2F0aXZlIGluZGV4ZXMgKGlmIHRoZVxuICAgY2xhc3Mgd2lzaGVzIHRvIGVtdWxhdGUgYSBzZXF1ZW5jZSB0eXBlKSBpcyB1cCB0byB0aGVcbiAgIGBgX19nZXRpdGVtX18oKWBgIG1ldGhvZC4gSWYgKmtleSogaXMgb2YgYW4gaW5hcHByb3ByaWF0ZSB0eXBlLFxuICAgYGBUeXBlRXJyb3JgYCBtYXkgYmUgcmFpc2VkOyBpZiBvZiBhIHZhbHVlIG91dHNpZGUgdGhlIHNldCBvZlxuICAgaW5kZXhlcyBmb3IgdGhlIHNlcXVlbmNlIChhZnRlciBhbnkgc3BlY2lhbCBpbnRlcnByZXRhdGlvbiBvZlxuICAgbmVnYXRpdmUgdmFsdWVzKSwgYGBJbmRleEVycm9yYGAgc2hvdWxkIGJlIHJhaXNlZC4gRm9yIG1hcHBpbmdcbiAgIHR5cGVzLCBpZiAqa2V5KiBpcyBtaXNzaW5nIChub3QgaW4gdGhlIGNvbnRhaW5lciksIGBgS2V5RXJyb3JgYFxuICAgc2hvdWxkIGJlIHJhaXNlZC5cblxuICAgTm90ZTogYGBmb3JgYCBsb29wcyBleHBlY3QgdGhhdCBhbiBgYEluZGV4RXJyb3JgYCB3aWxsIGJlIHJhaXNlZCBmb3JcbiAgICAgaWxsZWdhbCBpbmRleGVzIHRvIGFsbG93IHByb3BlciBkZXRlY3Rpb24gb2YgdGhlIGVuZCBvZiB0aGVcbiAgICAgc2VxdWVuY2UuXG5cbm9iamVjdC5fX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IGFzc2lnbm1lbnQgdG8gYGBzZWxmW2tleV1gYC4gIFNhbWUgbm90ZSBhcyBmb3JcbiAgIGBgX19nZXRpdGVtX18oKWBgLiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBmb3IgbWFwcGluZ3MgaWZcbiAgIHRoZSBvYmplY3RzIHN1cHBvcnQgY2hhbmdlcyB0byB0aGUgdmFsdWVzIGZvciBrZXlzLCBvciBpZiBuZXcga2V5c1xuICAgY2FuIGJlIGFkZGVkLCBvciBmb3Igc2VxdWVuY2VzIGlmIGVsZW1lbnRzIGNhbiBiZSByZXBsYWNlZC4gIFRoZVxuICAgc2FtZSBleGNlcHRpb25zIHNob3VsZCBiZSByYWlzZWQgZm9yIGltcHJvcGVyICprZXkqIHZhbHVlcyBhcyBmb3JcbiAgIHRoZSBgYF9fZ2V0aXRlbV9fKClgYCBtZXRob2QuXG5cbm9iamVjdC5fX2RlbGl0ZW1fXyhzZWxmLCBrZXkpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgZGVsZXRpb24gb2YgYGBzZWxmW2tleV1gYC4gIFNhbWUgbm90ZSBhcyBmb3JcbiAgIGBgX19nZXRpdGVtX18oKWBgLiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBmb3IgbWFwcGluZ3MgaWZcbiAgIHRoZSBvYmplY3RzIHN1cHBvcnQgcmVtb3ZhbCBvZiBrZXlzLCBvciBmb3Igc2VxdWVuY2VzIGlmIGVsZW1lbnRzXG4gICBjYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzZXF1ZW5jZS4gIFRoZSBzYW1lIGV4Y2VwdGlvbnMgc2hvdWxkIGJlXG4gICByYWlzZWQgZm9yIGltcHJvcGVyICprZXkqIHZhbHVlcyBhcyBmb3IgdGhlIGBgX19nZXRpdGVtX18oKWBgXG4gICBtZXRob2QuXG5cbm9iamVjdC5fX2l0ZXJfXyhzZWxmKVxuXG4gICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhbiBpdGVyYXRvciBpcyByZXF1aXJlZCBmb3IgYSBjb250YWluZXIuXG4gICBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIG9iamVjdCB0aGF0IGNhbiBpdGVyYXRlXG4gICBvdmVyIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgY29udGFpbmVyLiAgRm9yIG1hcHBpbmdzLCBpdCBzaG91bGRcbiAgIGl0ZXJhdGUgb3ZlciB0aGUga2V5cyBvZiB0aGUgY29udGFpbmVyLCBhbmQgc2hvdWxkIGFsc28gYmUgbWFkZVxuICAgYXZhaWxhYmxlIGFzIHRoZSBtZXRob2QgYGBpdGVya2V5cygpYGAuXG5cbiAgIEl0ZXJhdG9yIG9iamVjdHMgYWxzbyBuZWVkIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZDsgdGhleSBhcmVcbiAgIHJlcXVpcmVkIHRvIHJldHVybiB0aGVtc2VsdmVzLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaXRlcmF0b3JcbiAgIG9iamVjdHMsIHNlZSAqSXRlcmF0b3IgVHlwZXMqLlxuXG5vYmplY3QuX19yZXZlcnNlZF9fKHNlbGYpXG5cbiAgIENhbGxlZCAoaWYgcHJlc2VudCkgYnkgdGhlIGBgcmV2ZXJzZWQoKWBgIGJ1aWx0LWluIHRvIGltcGxlbWVudFxuICAgcmV2ZXJzZSBpdGVyYXRpb24uICBJdCBzaG91bGQgcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIG9iamVjdCB0aGF0XG4gICBpdGVyYXRlcyBvdmVyIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgY29udGFpbmVyIGluIHJldmVyc2Ugb3JkZXIuXG5cbiAgIElmIHRoZSBgYF9fcmV2ZXJzZWRfXygpYGAgbWV0aG9kIGlzIG5vdCBwcm92aWRlZCwgdGhlXG4gICBgYHJldmVyc2VkKClgYCBidWlsdC1pbiB3aWxsIGZhbGwgYmFjayB0byB1c2luZyB0aGUgc2VxdWVuY2VcbiAgIHByb3RvY29sIChgYF9fbGVuX18oKWBgIGFuZCBgYF9fZ2V0aXRlbV9fKClgYCkuICBPYmplY3RzIHRoYXRcbiAgIHN1cHBvcnQgdGhlIHNlcXVlbmNlIHByb3RvY29sIHNob3VsZCBvbmx5IHByb3ZpZGVcbiAgIGBgX19yZXZlcnNlZF9fKClgYCBpZiB0aGV5IGNhbiBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIHRoYXQgaXNcbiAgIG1vcmUgZWZmaWNpZW50IHRoYW4gdGhlIG9uZSBwcm92aWRlZCBieSBgYHJldmVyc2VkKClgYC5cblxuICAgTmV3IGluIHZlcnNpb24gMi42LlxuXG5UaGUgbWVtYmVyc2hpcCB0ZXN0IG9wZXJhdG9ycyAoYGBpbmBgIGFuZCBgYG5vdCBpbmBgKSBhcmUgbm9ybWFsbHlcbmltcGxlbWVudGVkIGFzIGFuIGl0ZXJhdGlvbiB0aHJvdWdoIGEgc2VxdWVuY2UuICBIb3dldmVyLCBjb250YWluZXJcbm9iamVjdHMgY2FuIHN1cHBseSB0aGUgZm9sbG93aW5nIHNwZWNpYWwgbWV0aG9kIHdpdGggYSBtb3JlIGVmZmljaWVudFxuaW1wbGVtZW50YXRpb24sIHdoaWNoIGFsc28gZG9lcyBub3QgcmVxdWlyZSB0aGUgb2JqZWN0IGJlIGEgc2VxdWVuY2UuXG5cbm9iamVjdC5fX2NvbnRhaW5zX18oc2VsZiwgaXRlbSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBtZW1iZXJzaGlwIHRlc3Qgb3BlcmF0b3JzLiAgU2hvdWxkIHJldHVybiB0cnVlXG4gICBpZiAqaXRlbSogaXMgaW4gKnNlbGYqLCBmYWxzZSBvdGhlcndpc2UuICBGb3IgbWFwcGluZyBvYmplY3RzLCB0aGlzXG4gICBzaG91bGQgY29uc2lkZXIgdGhlIGtleXMgb2YgdGhlIG1hcHBpbmcgcmF0aGVyIHRoYW4gdGhlIHZhbHVlcyBvclxuICAgdGhlIGtleS1pdGVtIHBhaXJzLlxuXG4gICBGb3Igb2JqZWN0cyB0aGF0IGRvblwndCBkZWZpbmUgYGBfX2NvbnRhaW5zX18oKWBgLCB0aGUgbWVtYmVyc2hpcFxuICAgdGVzdCBmaXJzdCB0cmllcyBpdGVyYXRpb24gdmlhIGBgX19pdGVyX18oKWBgLCB0aGVuIHRoZSBvbGRcbiAgIHNlcXVlbmNlIGl0ZXJhdGlvbiBwcm90b2NvbCB2aWEgYGBfX2dldGl0ZW1fXygpYGAsIHNlZSAqdGhpc1xuICAgc2VjdGlvbiBpbiB0aGUgbGFuZ3VhZ2UgcmVmZXJlbmNlKi5cblxuXG5BZGRpdGlvbmFsIG1ldGhvZHMgZm9yIGVtdWxhdGlvbiBvZiBzZXF1ZW5jZSB0eXBlc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIGZvbGxvd2luZyBvcHRpb25hbCBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGZ1cnRoZXIgZW11bGF0ZVxuc2VxdWVuY2Ugb2JqZWN0cy4gIEltbXV0YWJsZSBzZXF1ZW5jZXMgbWV0aG9kcyBzaG91bGQgYXQgbW9zdCBvbmx5XG5kZWZpbmUgYGBfX2dldHNsaWNlX18oKWBgOyBtdXRhYmxlIHNlcXVlbmNlcyBtaWdodCBkZWZpbmUgYWxsIHRocmVlXG5tZXRob2RzLlxuXG5vYmplY3QuX19nZXRzbGljZV9fKHNlbGYsIGksIGopXG5cbiAgIERlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjA6IFN1cHBvcnQgc2xpY2Ugb2JqZWN0cyBhcyBwYXJhbWV0ZXJzXG4gICB0byB0aGUgYGBfX2dldGl0ZW1fXygpYGAgbWV0aG9kLiAoSG93ZXZlciwgYnVpbHQtaW4gdHlwZXMgaW5cbiAgIENQeXRob24gY3VycmVudGx5IHN0aWxsIGltcGxlbWVudCBgYF9fZ2V0c2xpY2VfXygpYGAuICBUaGVyZWZvcmUsXG4gICB5b3UgaGF2ZSB0byBvdmVycmlkZSBpdCBpbiBkZXJpdmVkIGNsYXNzZXMgd2hlbiBpbXBsZW1lbnRpbmdcbiAgIHNsaWNpbmcuKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IGV2YWx1YXRpb24gb2YgYGBzZWxmW2k6al1gYC4gVGhlIHJldHVybmVkXG4gICBvYmplY3Qgc2hvdWxkIGJlIG9mIHRoZSBzYW1lIHR5cGUgYXMgKnNlbGYqLiAgTm90ZSB0aGF0IG1pc3NpbmcgKmkqXG4gICBvciAqaiogaW4gdGhlIHNsaWNlIGV4cHJlc3Npb24gYXJlIHJlcGxhY2VkIGJ5IHplcm8gb3JcbiAgIGBgc3lzLm1heGludGBgLCByZXNwZWN0aXZlbHkuICBJZiBuZWdhdGl2ZSBpbmRleGVzIGFyZSB1c2VkIGluIHRoZVxuICAgc2xpY2UsIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlIGlzIGFkZGVkIHRvIHRoYXQgaW5kZXguIElmIHRoZVxuICAgaW5zdGFuY2UgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBgYF9fbGVuX18oKWBgIG1ldGhvZCwgYW5cbiAgIGBgQXR0cmlidXRlRXJyb3JgYCBpcyByYWlzZWQuIE5vIGd1YXJhbnRlZSBpcyBtYWRlIHRoYXQgaW5kZXhlc1xuICAgYWRqdXN0ZWQgdGhpcyB3YXkgYXJlIG5vdCBzdGlsbCBuZWdhdGl2ZS4gIEluZGV4ZXMgd2hpY2ggYXJlXG4gICBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UgYXJlIG5vdCBtb2RpZmllZC4gSWYgbm9cbiAgIGBgX19nZXRzbGljZV9fKClgYCBpcyBmb3VuZCwgYSBzbGljZSBvYmplY3QgaXMgY3JlYXRlZCBpbnN0ZWFkLCBhbmRcbiAgIHBhc3NlZCB0byBgYF9fZ2V0aXRlbV9fKClgYCBpbnN0ZWFkLlxuXG5vYmplY3QuX19zZXRzbGljZV9fKHNlbGYsIGksIGosIHNlcXVlbmNlKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IGFzc2lnbm1lbnQgdG8gYGBzZWxmW2k6al1gYC4gU2FtZSBub3RlcyBmb3IgKmkqXG4gICBhbmQgKmoqIGFzIGZvciBgYF9fZ2V0c2xpY2VfXygpYGAuXG5cbiAgIFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIElmIG5vIGBgX19zZXRzbGljZV9fKClgYCBpcyBmb3VuZCwgb3JcbiAgIGZvciBleHRlbmRlZCBzbGljaW5nIG9mIHRoZSBmb3JtIGBgc2VsZltpOmo6a11gYCwgYSBzbGljZSBvYmplY3QgaXNcbiAgIGNyZWF0ZWQsIGFuZCBwYXNzZWQgdG8gYGBfX3NldGl0ZW1fXygpYGAsIGluc3RlYWQgb2ZcbiAgIGBgX19zZXRzbGljZV9fKClgYCBiZWluZyBjYWxsZWQuXG5cbm9iamVjdC5fX2RlbHNsaWNlX18oc2VsZiwgaSwgailcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBkZWxldGlvbiBvZiBgYHNlbGZbaTpqXWBgLiBTYW1lIG5vdGVzIGZvciAqaSpcbiAgIGFuZCAqaiogYXMgZm9yIGBgX19nZXRzbGljZV9fKClgYC4gVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gSWYgbm9cbiAgIGBgX19kZWxzbGljZV9fKClgYCBpcyBmb3VuZCwgb3IgZm9yIGV4dGVuZGVkIHNsaWNpbmcgb2YgdGhlIGZvcm1cbiAgIGBgc2VsZltpOmo6a11gYCwgYSBzbGljZSBvYmplY3QgaXMgY3JlYXRlZCwgYW5kIHBhc3NlZCB0b1xuICAgYGBfX2RlbGl0ZW1fXygpYGAsIGluc3RlYWQgb2YgYGBfX2RlbHNsaWNlX18oKWBgIGJlaW5nIGNhbGxlZC5cblxuTm90aWNlIHRoYXQgdGhlc2UgbWV0aG9kcyBhcmUgb25seSBpbnZva2VkIHdoZW4gYSBzaW5nbGUgc2xpY2Ugd2l0aCBhXG5zaW5nbGUgY29sb24gaXMgdXNlZCwgYW5kIHRoZSBzbGljZSBtZXRob2QgaXMgYXZhaWxhYmxlLiAgRm9yIHNsaWNlXG5vcGVyYXRpb25zIGludm9sdmluZyBleHRlbmRlZCBzbGljZSBub3RhdGlvbiwgb3IgaW4gYWJzZW5jZSBvZiB0aGVcbnNsaWNlIG1ldGhvZHMsIGBgX19nZXRpdGVtX18oKWBgLCBgYF9fc2V0aXRlbV9fKClgYCBvclxuYGBfX2RlbGl0ZW1fXygpYGAgaXMgY2FsbGVkIHdpdGggYSBzbGljZSBvYmplY3QgYXMgYXJndW1lbnQuXG5cblRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZW1vbnN0cmF0ZSBob3cgdG8gbWFrZSB5b3VyIHByb2dyYW0gb3IgbW9kdWxlXG5jb21wYXRpYmxlIHdpdGggZWFybGllciB2ZXJzaW9ucyBvZiBQeXRob24gKGFzc3VtaW5nIHRoYXQgbWV0aG9kc1xuYGBfX2dldGl0ZW1fXygpYGAsIGBgX19zZXRpdGVtX18oKWBgIGFuZCBgYF9fZGVsaXRlbV9fKClgYCBzdXBwb3J0XG5zbGljZSBvYmplY3RzIGFzIGFyZ3VtZW50cyk6XG5cbiAgIGNsYXNzIE15Q2xhc3M6XG4gICAgICAgLi4uXG4gICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KTpcbiAgICAgICAgICAgLi4uXG4gICAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGluZGV4LCB2YWx1ZSk6XG4gICAgICAgICAgIC4uLlxuICAgICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBpbmRleCk6XG4gICAgICAgICAgIC4uLlxuXG4gICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCAwKTpcbiAgICAgICAgICAgIyBUaGV5IHdvblwndCBiZSBkZWZpbmVkIGlmIHZlcnNpb24gaXMgYXQgbGVhc3QgMi4wIGZpbmFsXG5cbiAgICAgICAgICAgZGVmIF9fZ2V0c2xpY2VfXyhzZWxmLCBpLCBqKTpcbiAgICAgICAgICAgICAgIHJldHVybiBzZWxmW21heCgwLCBpKTptYXgoMCwgaik6XVxuICAgICAgICAgICBkZWYgX19zZXRzbGljZV9fKHNlbGYsIGksIGosIHNlcSk6XG4gICAgICAgICAgICAgICBzZWxmW21heCgwLCBpKTptYXgoMCwgaik6XSA9IHNlcVxuICAgICAgICAgICBkZWYgX19kZWxzbGljZV9fKHNlbGYsIGksIGopOlxuICAgICAgICAgICAgICAgZGVsIHNlbGZbbWF4KDAsIGkpOm1heCgwLCBqKTpdXG4gICAgICAgLi4uXG5cbk5vdGUgdGhlIGNhbGxzIHRvIGBgbWF4KClgYDsgdGhlc2UgYXJlIG5lY2Vzc2FyeSBiZWNhdXNlIG9mIHRoZVxuaGFuZGxpbmcgb2YgbmVnYXRpdmUgaW5kaWNlcyBiZWZvcmUgdGhlIGBgX18qc2xpY2VfXygpYGAgbWV0aG9kcyBhcmVcbmNhbGxlZC4gIFdoZW4gbmVnYXRpdmUgaW5kZXhlcyBhcmUgdXNlZCwgdGhlIGBgX18qaXRlbV9fKClgYCBtZXRob2RzXG5yZWNlaXZlIHRoZW0gYXMgcHJvdmlkZWQsIGJ1dCB0aGUgYGBfXypzbGljZV9fKClgYCBtZXRob2RzIGdldCBhXG4iY29va2VkIiBmb3JtIG9mIHRoZSBpbmRleCB2YWx1ZXMuICBGb3IgZWFjaCBuZWdhdGl2ZSBpbmRleCB2YWx1ZSwgdGhlXG5sZW5ndGggb2YgdGhlIHNlcXVlbmNlIGlzIGFkZGVkIHRvIHRoZSBpbmRleCBiZWZvcmUgY2FsbGluZyB0aGUgbWV0aG9kXG4od2hpY2ggbWF5IHN0aWxsIHJlc3VsdCBpbiBhIG5lZ2F0aXZlIGluZGV4KTsgdGhpcyBpcyB0aGUgY3VzdG9tYXJ5XG5oYW5kbGluZyBvZiBuZWdhdGl2ZSBpbmRleGVzIGJ5IHRoZSBidWlsdC1pbiBzZXF1ZW5jZSB0eXBlcywgYW5kIHRoZVxuYGBfXyppdGVtX18oKWBgIG1ldGhvZHMgYXJlIGV4cGVjdGVkIHRvIGRvIHRoaXMgYXMgd2VsbC4gIEhvd2V2ZXIsXG5zaW5jZSB0aGV5IHNob3VsZCBhbHJlYWR5IGJlIGRvaW5nIHRoYXQsIG5lZ2F0aXZlIGluZGV4ZXMgY2Fubm90IGJlXG5wYXNzZWQgaW47IHRoZXkgbXVzdCBiZSBjb25zdHJhaW5lZCB0byB0aGUgYm91bmRzIG9mIHRoZSBzZXF1ZW5jZVxuYmVmb3JlIGJlaW5nIHBhc3NlZCB0byB0aGUgYGBfXyppdGVtX18oKWBgIG1ldGhvZHMuIENhbGxpbmcgYGBtYXgoMCxcbmkpYGAgY29udmVuaWVudGx5IHJldHVybnMgdGhlIHByb3BlciB2YWx1ZS5cblxuXG5FbXVsYXRpbmcgbnVtZXJpYyB0eXBlc1xuPT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGVtdWxhdGUgbnVtZXJpYyBvYmplY3RzLlxuTWV0aG9kcyBjb3JyZXNwb25kaW5nIHRvIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGVcbnBhcnRpY3VsYXIga2luZCBvZiBudW1iZXIgaW1wbGVtZW50ZWQgKGUuZy4sIGJpdHdpc2Ugb3BlcmF0aW9ucyBmb3Jcbm5vbi1pbnRlZ3JhbCBudW1iZXJzKSBzaG91bGQgYmUgbGVmdCB1bmRlZmluZWQuXG5cbm9iamVjdC5fX2FkZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fc3ViX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19tdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2Zsb29yZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19tb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2Rpdm1vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcG93X18oc2VsZiwgb3RoZXJbLCBtb2R1bG9dKVxub2JqZWN0Ll9fbHNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2FuZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9feG9yX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19vcl9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnkgYXJpdGhtZXRpY1xuICAgb3BlcmF0aW9ucyAoYGArYGAsIGBgLWBgLCBgYCpgYCwgYGAvL2BgLCBgYCVgYCwgYGBkaXZtb2QoKWBgLFxuICAgYGBwb3coKWBgLCBgYCoqYGAsIGBgPDxgYCwgYGA+PmBgLCBgYCZgYCwgYGBeYGAsIGBgfGBgKS4gIEZvclxuICAgaW5zdGFuY2UsIHRvIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uIGBgeCArIHlgYCwgd2hlcmUgKngqIGlzIGFuXG4gICBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQgaGFzIGFuIGBgX19hZGRfXygpYGAgbWV0aG9kLFxuICAgYGB4Ll9fYWRkX18oeSlgYCBpcyBjYWxsZWQuICBUaGUgYGBfX2Rpdm1vZF9fKClgYCBtZXRob2Qgc2hvdWxkIGJlXG4gICB0aGUgZXF1aXZhbGVudCB0byB1c2luZyBgYF9fZmxvb3JkaXZfXygpYGAgYW5kIGBgX19tb2RfXygpYGA7IGl0XG4gICBzaG91bGQgbm90IGJlIHJlbGF0ZWQgdG8gYGBfX3RydWVkaXZfXygpYGAgKGRlc2NyaWJlZCBiZWxvdykuICBOb3RlXG4gICB0aGF0IGBgX19wb3dfXygpYGAgc2hvdWxkIGJlIGRlZmluZWQgdG8gYWNjZXB0IGFuIG9wdGlvbmFsIHRoaXJkXG4gICBhcmd1bWVudCBpZiB0aGUgdGVybmFyeSB2ZXJzaW9uIG9mIHRoZSBidWlsdC1pbiBgYHBvdygpYGAgZnVuY3Rpb25cbiAgIGlzIHRvIGJlIHN1cHBvcnRlZC5cblxuICAgSWYgb25lIG9mIHRob3NlIG1ldGhvZHMgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uIHdpdGggdGhlXG4gICBzdXBwbGllZCBhcmd1bWVudHMsIGl0IHNob3VsZCByZXR1cm4gYGBOb3RJbXBsZW1lbnRlZGBgLlxuXG5vYmplY3QuX19kaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3RydWVkaXZfXyhzZWxmLCBvdGhlcilcblxuICAgVGhlIGRpdmlzaW9uIG9wZXJhdG9yIChgYC9gYCkgaXMgaW1wbGVtZW50ZWQgYnkgdGhlc2UgbWV0aG9kcy4gIFRoZVxuICAgYGBfX3RydWVkaXZfXygpYGAgbWV0aG9kIGlzIHVzZWQgd2hlbiBgYF9fZnV0dXJlX18uZGl2aXNpb25gYCBpcyBpblxuICAgZWZmZWN0LCBvdGhlcndpc2UgYGBfX2Rpdl9fKClgYCBpcyB1c2VkLiAgSWYgb25seSBvbmUgb2YgdGhlc2UgdHdvXG4gICBtZXRob2RzIGlzIGRlZmluZWQsIHRoZSBvYmplY3Qgd2lsbCBub3Qgc3VwcG9ydCBkaXZpc2lvbiBpbiB0aGVcbiAgIGFsdGVybmF0ZSBjb250ZXh0OyBgYFR5cGVFcnJvcmBgIHdpbGwgYmUgcmFpc2VkIGluc3RlYWQuXG5cbm9iamVjdC5fX3JhZGRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JzdWJfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JtdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3J0cnVlZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jtb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JkaXZtb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jwb3dfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jsc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jyc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JhbmRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3J4b3JfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jvcl9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnkgYXJpdGhtZXRpY1xuICAgb3BlcmF0aW9ucyAoYGArYGAsIGBgLWBgLCBgYCpgYCwgYGAvYGAsIGBgJWBgLCBgYGRpdm1vZCgpYGAsXG4gICBgYHBvdygpYGAsIGBgKipgYCwgYGA8PGBgLCBgYD4+YGAsIGBgJmBgLCBgYF5gYCwgYGB8YGApIHdpdGhcbiAgIHJlZmxlY3RlZCAoc3dhcHBlZCkgb3BlcmFuZHMuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgY2FsbGVkIGlmXG4gICB0aGUgbGVmdCBvcGVyYW5kIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uIGFuZFxuICAgdGhlIG9wZXJhbmRzIGFyZSBvZiBkaWZmZXJlbnQgdHlwZXMuIFsyXSBGb3IgaW5zdGFuY2UsIHRvIGV2YWx1YXRlXG4gICB0aGUgZXhwcmVzc2lvbiBgYHggLSB5YGAsIHdoZXJlICp5KiBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXRcbiAgIGhhcyBhbiBgYF9fcnN1Yl9fKClgYCBtZXRob2QsIGBgeS5fX3JzdWJfXyh4KWBgIGlzIGNhbGxlZCBpZlxuICAgYGB4Ll9fc3ViX18oeSlgYCByZXR1cm5zICpOb3RJbXBsZW1lbnRlZCouXG5cbiAgIE5vdGUgdGhhdCB0ZXJuYXJ5IGBgcG93KClgYCB3aWxsIG5vdCB0cnkgY2FsbGluZyBgYF9fcnBvd19fKClgYFxuICAgKHRoZSBjb2VyY2lvbiBydWxlcyB3b3VsZCBiZWNvbWUgdG9vIGNvbXBsaWNhdGVkKS5cblxuICAgTm90ZTogSWYgdGhlIHJpZ2h0IG9wZXJhbmRcJ3MgdHlwZSBpcyBhIHN1YmNsYXNzIG9mIHRoZSBsZWZ0IG9wZXJhbmRcJ3NcbiAgICAgdHlwZSBhbmQgdGhhdCBzdWJjbGFzcyBwcm92aWRlcyB0aGUgcmVmbGVjdGVkIG1ldGhvZCBmb3IgdGhlXG4gICAgIG9wZXJhdGlvbiwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBsZWZ0IG9wZXJhbmRcJ3NcbiAgICAgbm9uLXJlZmxlY3RlZCBtZXRob2QuICBUaGlzIGJlaGF2aW9yIGFsbG93cyBzdWJjbGFzc2VzIHRvXG4gICAgIG92ZXJyaWRlIHRoZWlyIGFuY2VzdG9yc1wnIG9wZXJhdGlvbnMuXG5cbm9iamVjdC5fX2lhZGRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lzdWJfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2ltdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2l0cnVlZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2ltb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lwb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pXG5vYmplY3QuX19pbHNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pcnNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pYW5kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19peG9yX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pb3JfXyhzZWxmLCBvdGhlcilcblxuICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYXVnbWVudGVkIGFyaXRobWV0aWNcbiAgIGFzc2lnbm1lbnRzIChgYCs9YGAsIGBgLT1gYCwgYGAqPWBgLCBgYC89YGAsIGBgLy89YGAsIGBgJT1gYCxcbiAgIGBgKio9YGAsIGBgPDw9YGAsIGBgPj49YGAsIGBgJj1gYCwgYGBePWBgLCBgYHw9YGApLiAgVGhlc2UgbWV0aG9kc1xuICAgc2hvdWxkIGF0dGVtcHQgdG8gZG8gdGhlIG9wZXJhdGlvbiBpbi1wbGFjZSAobW9kaWZ5aW5nICpzZWxmKikgYW5kXG4gICByZXR1cm4gdGhlIHJlc3VsdCAod2hpY2ggY291bGQgYmUsIGJ1dCBkb2VzIG5vdCBoYXZlIHRvIGJlLFxuICAgKnNlbGYqKS4gIElmIGEgc3BlY2lmaWMgbWV0aG9kIGlzIG5vdCBkZWZpbmVkLCB0aGUgYXVnbWVudGVkXG4gICBhc3NpZ25tZW50IGZhbGxzIGJhY2sgdG8gdGhlIG5vcm1hbCBtZXRob2RzLiAgRm9yIGluc3RhbmNlLCB0b1xuICAgZXhlY3V0ZSB0aGUgc3RhdGVtZW50IGBgeCArPSB5YGAsIHdoZXJlICp4KiBpcyBhbiBpbnN0YW5jZSBvZiBhXG4gICBjbGFzcyB0aGF0IGhhcyBhbiBgYF9faWFkZF9fKClgYCBtZXRob2QsIGBgeC5fX2lhZGRfXyh5KWBgIGlzXG4gICBjYWxsZWQuICBJZiAqeCogaXMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGRvZXMgbm90IGRlZmluZSBhXG4gICBgYF9faWFkZF9fKClgYCBtZXRob2QsIGBgeC5fX2FkZF9fKHkpYGAgYW5kIGBgeS5fX3JhZGRfXyh4KWBgIGFyZVxuICAgY29uc2lkZXJlZCwgYXMgd2l0aCB0aGUgZXZhbHVhdGlvbiBvZiBgYHggKyB5YGAuXG5cbm9iamVjdC5fX25lZ19fKHNlbGYpXG5vYmplY3QuX19wb3NfXyhzZWxmKVxub2JqZWN0Ll9fYWJzX18oc2VsZilcbm9iamVjdC5fX2ludmVydF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIHVuYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9ucyAoYGAtYGAsIGBgK2BgLFxuICAgYGBhYnMoKWBgIGFuZCBgYH5gYCkuXG5cbm9iamVjdC5fX2NvbXBsZXhfXyhzZWxmKVxub2JqZWN0Ll9faW50X18oc2VsZilcbm9iamVjdC5fX2xvbmdfXyhzZWxmKVxub2JqZWN0Ll9fZmxvYXRfXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgYGBjb21wbGV4KClgYCxcbiAgIGBgaW50KClgYCwgYGBsb25nKClgYCwgYW5kIGBgZmxvYXQoKWBgLiAgU2hvdWxkIHJldHVybiBhIHZhbHVlIG9mXG4gICB0aGUgYXBwcm9wcmlhdGUgdHlwZS5cblxub2JqZWN0Ll9fb2N0X18oc2VsZilcbm9iamVjdC5fX2hleF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyBgYG9jdCgpYGAgYW5kIGBgaGV4KClgYC5cbiAgIFNob3VsZCByZXR1cm4gYSBzdHJpbmcgdmFsdWUuXG5cbm9iamVjdC5fX2luZGV4X18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBgYG9wZXJhdG9yLmluZGV4KClgYC4gIEFsc28gY2FsbGVkIHdoZW5ldmVyXG4gICBQeXRob24gbmVlZHMgYW4gaW50ZWdlciBvYmplY3QgKHN1Y2ggYXMgaW4gc2xpY2luZykuICBNdXN0IHJldHVyblxuICAgYW4gaW50ZWdlciAoaW50IG9yIGxvbmcpLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjUuXG5cbm9iamVjdC5fX2NvZXJjZV9fKHNlbGYsIG90aGVyKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50ICJtaXhlZC1tb2RlIiBudW1lcmljIGFyaXRobWV0aWMuICBTaG91bGQgZWl0aGVyXG4gICByZXR1cm4gYSAyLXR1cGxlIGNvbnRhaW5pbmcgKnNlbGYqIGFuZCAqb3RoZXIqIGNvbnZlcnRlZCB0byBhXG4gICBjb21tb24gbnVtZXJpYyB0eXBlLCBvciBgYE5vbmVgYCBpZiBjb252ZXJzaW9uIGlzIGltcG9zc2libGUuICBXaGVuXG4gICB0aGUgY29tbW9uIHR5cGUgd291bGQgYmUgdGhlIHR5cGUgb2YgYGBvdGhlcmBgLCBpdCBpcyBzdWZmaWNpZW50IHRvXG4gICByZXR1cm4gYGBOb25lYGAsIHNpbmNlIHRoZSBpbnRlcnByZXRlciB3aWxsIGFsc28gYXNrIHRoZSBvdGhlclxuICAgb2JqZWN0IHRvIGF0dGVtcHQgYSBjb2VyY2lvbiAoYnV0IHNvbWV0aW1lcywgaWYgdGhlIGltcGxlbWVudGF0aW9uXG4gICBvZiB0aGUgb3RoZXIgdHlwZSBjYW5ub3QgYmUgY2hhbmdlZCwgaXQgaXMgdXNlZnVsIHRvIGRvIHRoZVxuICAgY29udmVyc2lvbiB0byB0aGUgb3RoZXIgdHlwZSBoZXJlKS4gIEEgcmV0dXJuIHZhbHVlIG9mXG4gICBgYE5vdEltcGxlbWVudGVkYGAgaXMgZXF1aXZhbGVudCB0byByZXR1cm5pbmcgYGBOb25lYGAuXG5cblxuQ29lcmNpb24gcnVsZXNcbj09PT09PT09PT09PT09XG5cblRoaXMgc2VjdGlvbiB1c2VkIHRvIGRvY3VtZW50IHRoZSBydWxlcyBmb3IgY29lcmNpb24uICBBcyB0aGUgbGFuZ3VhZ2VcbmhhcyBldm9sdmVkLCB0aGUgY29lcmNpb24gcnVsZXMgaGF2ZSBiZWNvbWUgaGFyZCB0byBkb2N1bWVudFxucHJlY2lzZWx5OyBkb2N1bWVudGluZyB3aGF0IG9uZSB2ZXJzaW9uIG9mIG9uZSBwYXJ0aWN1bGFyXG5pbXBsZW1lbnRhdGlvbiBkb2VzIGlzIHVuZGVzaXJhYmxlLiAgSW5zdGVhZCwgaGVyZSBhcmUgc29tZSBpbmZvcm1hbFxuZ3VpZGVsaW5lcyByZWdhcmRpbmcgY29lcmNpb24uICBJbiBQeXRob24gMywgY29lcmNpb24gd2lsbCBub3QgYmVcbnN1cHBvcnRlZC5cblxuKiBJZiB0aGUgbGVmdCBvcGVyYW5kIG9mIGEgJSBvcGVyYXRvciBpcyBhIHN0cmluZyBvciBVbmljb2RlIG9iamVjdCxcbiAgbm8gY29lcmNpb24gdGFrZXMgcGxhY2UgYW5kIHRoZSBzdHJpbmcgZm9ybWF0dGluZyBvcGVyYXRpb24gaXNcbiAgaW52b2tlZCBpbnN0ZWFkLlxuXG4qIEl0IGlzIG5vIGxvbmdlciByZWNvbW1lbmRlZCB0byBkZWZpbmUgYSBjb2VyY2lvbiBvcGVyYXRpb24uIE1peGVkLVxuICBtb2RlIG9wZXJhdGlvbnMgb24gdHlwZXMgdGhhdCBkb25cJ3QgZGVmaW5lIGNvZXJjaW9uIHBhc3MgdGhlXG4gIG9yaWdpbmFsIGFyZ3VtZW50cyB0byB0aGUgb3BlcmF0aW9uLlxuXG4qIE5ldy1zdHlsZSBjbGFzc2VzICh0aG9zZSBkZXJpdmVkIGZyb20gYGBvYmplY3RgYCkgbmV2ZXIgaW52b2tlIHRoZVxuICBgYF9fY29lcmNlX18oKWBgIG1ldGhvZCBpbiByZXNwb25zZSB0byBhIGJpbmFyeSBvcGVyYXRvcjsgdGhlIG9ubHlcbiAgdGltZSBgYF9fY29lcmNlX18oKWBgIGlzIGludm9rZWQgaXMgd2hlbiB0aGUgYnVpbHQtaW4gZnVuY3Rpb25cbiAgYGBjb2VyY2UoKWBgIGlzIGNhbGxlZC5cblxuKiBGb3IgbW9zdCBpbnRlbnRzIGFuZCBwdXJwb3NlcywgYW4gb3BlcmF0b3IgdGhhdCByZXR1cm5zXG4gIGBgTm90SW1wbGVtZW50ZWRgYCBpcyB0cmVhdGVkIHRoZSBzYW1lIGFzIG9uZSB0aGF0IGlzIG5vdFxuICBpbXBsZW1lbnRlZCBhdCBhbGwuXG5cbiogQmVsb3csIGBgX19vcF9fKClgYCBhbmQgYGBfX3JvcF9fKClgYCBhcmUgdXNlZCB0byBzaWduaWZ5IHRoZVxuICBnZW5lcmljIG1ldGhvZCBuYW1lcyBjb3JyZXNwb25kaW5nIHRvIGFuIG9wZXJhdG9yOyBgYF9faW9wX18oKWBgIGlzXG4gIHVzZWQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGluLXBsYWNlIG9wZXJhdG9yLiAgRm9yIGV4YW1wbGUsIGZvciB0aGVcbiAgb3BlcmF0b3IgXCdgYCtgYFwnLCBgYF9fYWRkX18oKWBgIGFuZCBgYF9fcmFkZF9fKClgYCBhcmUgdXNlZCBmb3IgdGhlXG4gIGxlZnQgYW5kIHJpZ2h0IHZhcmlhbnQgb2YgdGhlIGJpbmFyeSBvcGVyYXRvciwgYW5kIGBgX19pYWRkX18oKWBgXG4gIGZvciB0aGUgaW4tcGxhY2UgdmFyaWFudC5cblxuKiBGb3Igb2JqZWN0cyAqeCogYW5kICp5KiwgZmlyc3QgYGB4Ll9fb3BfXyh5KWBgIGlzIHRyaWVkLiAgSWYgdGhpcyBpc1xuICBub3QgaW1wbGVtZW50ZWQgb3IgcmV0dXJucyBgYE5vdEltcGxlbWVudGVkYGAsIGBgeS5fX3JvcF9fKHgpYGAgaXNcbiAgdHJpZWQuICBJZiB0aGlzIGlzIGFsc28gbm90IGltcGxlbWVudGVkIG9yIHJldHVybnNcbiAgYGBOb3RJbXBsZW1lbnRlZGBgLCBhIGBgVHlwZUVycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZC4gIEJ1dCBzZWVcbiAgdGhlIGZvbGxvd2luZyBleGNlcHRpb246XG5cbiogRXhjZXB0aW9uIHRvIHRoZSBwcmV2aW91cyBpdGVtOiBpZiB0aGUgbGVmdCBvcGVyYW5kIGlzIGFuIGluc3RhbmNlXG4gIG9mIGEgYnVpbHQtaW4gdHlwZSBvciBhIG5ldy1zdHlsZSBjbGFzcywgYW5kIHRoZSByaWdodCBvcGVyYW5kIGlzIGFuXG4gIGluc3RhbmNlIG9mIGEgcHJvcGVyIHN1YmNsYXNzIG9mIHRoYXQgdHlwZSBvciBjbGFzcyBhbmQgb3ZlcnJpZGVzXG4gIHRoZSBiYXNlXCdzIGBgX19yb3BfXygpYGAgbWV0aG9kLCB0aGUgcmlnaHQgb3BlcmFuZFwncyBgYF9fcm9wX18oKWBgXG4gIG1ldGhvZCBpcyB0cmllZCAqYmVmb3JlKiB0aGUgbGVmdCBvcGVyYW5kXCdzIGBgX19vcF9fKClgYCBtZXRob2QuXG5cbiAgVGhpcyBpcyBkb25lIHNvIHRoYXQgYSBzdWJjbGFzcyBjYW4gY29tcGxldGVseSBvdmVycmlkZSBiaW5hcnlcbiAgb3BlcmF0b3JzLiBPdGhlcndpc2UsIHRoZSBsZWZ0IG9wZXJhbmRcJ3MgYGBfX29wX18oKWBgIG1ldGhvZCB3b3VsZFxuICBhbHdheXMgYWNjZXB0IHRoZSByaWdodCBvcGVyYW5kOiB3aGVuIGFuIGluc3RhbmNlIG9mIGEgZ2l2ZW4gY2xhc3NcbiAgaXMgZXhwZWN0ZWQsIGFuIGluc3RhbmNlIG9mIGEgc3ViY2xhc3Mgb2YgdGhhdCBjbGFzcyBpcyBhbHdheXNcbiAgYWNjZXB0YWJsZS5cblxuKiBXaGVuIGVpdGhlciBvcGVyYW5kIHR5cGUgZGVmaW5lcyBhIGNvZXJjaW9uLCB0aGlzIGNvZXJjaW9uIGlzIGNhbGxlZFxuICBiZWZvcmUgdGhhdCB0eXBlXCdzIGBgX19vcF9fKClgYCBvciBgYF9fcm9wX18oKWBgIG1ldGhvZCBpcyBjYWxsZWQsXG4gIGJ1dCBubyBzb29uZXIuICBJZiB0aGUgY29lcmNpb24gcmV0dXJucyBhbiBvYmplY3Qgb2YgYSBkaWZmZXJlbnRcbiAgdHlwZSBmb3IgdGhlIG9wZXJhbmQgd2hvc2UgY29lcmNpb24gaXMgaW52b2tlZCwgcGFydCBvZiB0aGUgcHJvY2Vzc1xuICBpcyByZWRvbmUgdXNpbmcgdGhlIG5ldyBvYmplY3QuXG5cbiogV2hlbiBhbiBpbi1wbGFjZSBvcGVyYXRvciAobGlrZSBcJ2BgKz1gYFwnKSBpcyB1c2VkLCBpZiB0aGUgbGVmdFxuICBvcGVyYW5kIGltcGxlbWVudHMgYGBfX2lvcF9fKClgYCwgaXQgaXMgaW52b2tlZCB3aXRob3V0IGFueVxuICBjb2VyY2lvbi4gIFdoZW4gdGhlIG9wZXJhdGlvbiBmYWxscyBiYWNrIHRvIGBgX19vcF9fKClgYCBhbmQvb3JcbiAgYGBfX3JvcF9fKClgYCwgdGhlIG5vcm1hbCBjb2VyY2lvbiBydWxlcyBhcHBseS5cblxuKiBJbiBgYHggKyB5YGAsIGlmICp4KiBpcyBhIHNlcXVlbmNlIHRoYXQgaW1wbGVtZW50cyBzZXF1ZW5jZVxuICBjb25jYXRlbmF0aW9uLCBzZXF1ZW5jZSBjb25jYXRlbmF0aW9uIGlzIGludm9rZWQuXG5cbiogSW4gYGB4ICogeWBgLCBpZiBvbmUgb3BlcmFuZCBpcyBhIHNlcXVlbmNlIHRoYXQgaW1wbGVtZW50cyBzZXF1ZW5jZVxuICByZXBldGl0aW9uLCBhbmQgdGhlIG90aGVyIGlzIGFuIGludGVnZXIgKGBgaW50YGAgb3IgYGBsb25nYGApLFxuICBzZXF1ZW5jZSByZXBldGl0aW9uIGlzIGludm9rZWQuXG5cbiogUmljaCBjb21wYXJpc29ucyAoaW1wbGVtZW50ZWQgYnkgbWV0aG9kcyBgYF9fZXFfXygpYGAgYW5kIHNvIG9uKVxuICBuZXZlciB1c2UgY29lcmNpb24uICBUaHJlZS13YXkgY29tcGFyaXNvbiAoaW1wbGVtZW50ZWQgYnlcbiAgYGBfX2NtcF9fKClgYCkgZG9lcyB1c2UgY29lcmNpb24gdW5kZXIgdGhlIHNhbWUgY29uZGl0aW9ucyBhcyBvdGhlclxuICBiaW5hcnkgb3BlcmF0aW9ucyB1c2UgaXQuXG5cbiogSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHRoZSBidWlsdC1pbiBudW1lcmljIHR5cGVzIGBgaW50YGAsXG4gIGBgbG9uZ2BgLCBgYGZsb2F0YGAsIGFuZCBgYGNvbXBsZXhgYCBkbyBub3QgdXNlIGNvZXJjaW9uLiBBbGwgdGhlc2VcbiAgdHlwZXMgaW1wbGVtZW50IGEgYGBfX2NvZXJjZV9fKClgYCBtZXRob2QsIGZvciB1c2UgYnkgdGhlIGJ1aWx0LWluXG4gIGBgY29lcmNlKClgYCBmdW5jdGlvbi5cblxuICBDaGFuZ2VkIGluIHZlcnNpb24gMi43LlxuXG5cbldpdGggU3RhdGVtZW50IENvbnRleHQgTWFuYWdlcnNcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuTmV3IGluIHZlcnNpb24gMi41LlxuXG5BICpjb250ZXh0IG1hbmFnZXIqIGlzIGFuIG9iamVjdCB0aGF0IGRlZmluZXMgdGhlIHJ1bnRpbWUgY29udGV4dCB0b1xuYmUgZXN0YWJsaXNoZWQgd2hlbiBleGVjdXRpbmcgYSBgYHdpdGhgYCBzdGF0ZW1lbnQuIFRoZSBjb250ZXh0XG5tYW5hZ2VyIGhhbmRsZXMgdGhlIGVudHJ5IGludG8sIGFuZCB0aGUgZXhpdCBmcm9tLCB0aGUgZGVzaXJlZCBydW50aW1lXG5jb250ZXh0IGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBibG9jayBvZiBjb2RlLiAgQ29udGV4dCBtYW5hZ2VycyBhcmVcbm5vcm1hbGx5IGludm9rZWQgdXNpbmcgdGhlIGBgd2l0aGBgIHN0YXRlbWVudCAoZGVzY3JpYmVkIGluIHNlY3Rpb25cbipUaGUgd2l0aCBzdGF0ZW1lbnQqKSwgYnV0IGNhbiBhbHNvIGJlIHVzZWQgYnkgZGlyZWN0bHkgaW52b2tpbmcgdGhlaXJcbm1ldGhvZHMuXG5cblR5cGljYWwgdXNlcyBvZiBjb250ZXh0IG1hbmFnZXJzIGluY2x1ZGUgc2F2aW5nIGFuZCByZXN0b3JpbmcgdmFyaW91c1xua2luZHMgb2YgZ2xvYmFsIHN0YXRlLCBsb2NraW5nIGFuZCB1bmxvY2tpbmcgcmVzb3VyY2VzLCBjbG9zaW5nIG9wZW5lZFxuZmlsZXMsIGV0Yy5cblxuRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gY29udGV4dCBtYW5hZ2Vycywgc2VlICpDb250ZXh0IE1hbmFnZXIgVHlwZXMqLlxuXG5vYmplY3QuX19lbnRlcl9fKHNlbGYpXG5cbiAgIEVudGVyIHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlIGBgd2l0aGBgXG4gICBzdGF0ZW1lbnQgd2lsbCBiaW5kIHRoaXMgbWV0aG9kXCdzIHJldHVybiB2YWx1ZSB0byB0aGUgdGFyZ2V0KHMpXG4gICBzcGVjaWZpZWQgaW4gdGhlIGBgYXNgYCBjbGF1c2Ugb2YgdGhlIHN0YXRlbWVudCwgaWYgYW55LlxuXG5vYmplY3QuX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKVxuXG4gICBFeGl0IHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlIHBhcmFtZXRlcnNcbiAgIGRlc2NyaWJlIHRoZSBleGNlcHRpb24gdGhhdCBjYXVzZWQgdGhlIGNvbnRleHQgdG8gYmUgZXhpdGVkLiBJZiB0aGVcbiAgIGNvbnRleHQgd2FzIGV4aXRlZCB3aXRob3V0IGFuIGV4Y2VwdGlvbiwgYWxsIHRocmVlIGFyZ3VtZW50cyB3aWxsXG4gICBiZSBgYE5vbmVgYC5cblxuICAgSWYgYW4gZXhjZXB0aW9uIGlzIHN1cHBsaWVkLCBhbmQgdGhlIG1ldGhvZCB3aXNoZXMgdG8gc3VwcHJlc3MgdGhlXG4gICBleGNlcHRpb24gKGkuZS4sIHByZXZlbnQgaXQgZnJvbSBiZWluZyBwcm9wYWdhdGVkKSwgaXQgc2hvdWxkXG4gICByZXR1cm4gYSB0cnVlIHZhbHVlLiBPdGhlcndpc2UsIHRoZSBleGNlcHRpb24gd2lsbCBiZSBwcm9jZXNzZWRcbiAgIG5vcm1hbGx5IHVwb24gZXhpdCBmcm9tIHRoaXMgbWV0aG9kLlxuXG4gICBOb3RlIHRoYXQgYGBfX2V4aXRfXygpYGAgbWV0aG9kcyBzaG91bGQgbm90IHJlcmFpc2UgdGhlIHBhc3NlZC1pblxuICAgZXhjZXB0aW9uOyB0aGlzIGlzIHRoZSBjYWxsZXJcJ3MgcmVzcG9uc2liaWxpdHkuXG5cblNlZSBhbHNvOlxuXG4gICAqKlBFUCAwMzQzKiogLSBUaGUgIndpdGgiIHN0YXRlbWVudFxuICAgICAgVGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlIFB5dGhvblxuICAgICAgYGB3aXRoYGAgc3RhdGVtZW50LlxuXG5cblNwZWNpYWwgbWV0aG9kIGxvb2t1cCBmb3Igb2xkLXN0eWxlIGNsYXNzZXNcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuRm9yIG9sZC1zdHlsZSBjbGFzc2VzLCBzcGVjaWFsIG1ldGhvZHMgYXJlIGFsd2F5cyBsb29rZWQgdXAgaW4gZXhhY3RseVxudGhlIHNhbWUgd2F5IGFzIGFueSBvdGhlciBtZXRob2Qgb3IgYXR0cmlidXRlLiBUaGlzIGlzIHRoZSBjYXNlXG5yZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIG1ldGhvZCBpcyBiZWluZyBsb29rZWQgdXAgZXhwbGljaXRseSBhcyBpblxuYGB4Ll9fZ2V0aXRlbV9fKGkpYGAgb3IgaW1wbGljaXRseSBhcyBpbiBgYHhbaV1gYC5cblxuVGhpcyBiZWhhdmlvdXIgbWVhbnMgdGhhdCBzcGVjaWFsIG1ldGhvZHMgbWF5IGV4aGliaXQgZGlmZmVyZW50XG5iZWhhdmlvdXIgZm9yIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgYSBzaW5nbGUgb2xkLXN0eWxlIGNsYXNzIGlmIHRoZVxuYXBwcm9wcmlhdGUgc3BlY2lhbCBhdHRyaWJ1dGVzIGFyZSBzZXQgZGlmZmVyZW50bHk6XG5cbiAgID4+PiBjbGFzcyBDOlxuICAgLi4uICAgICBwYXNzXG4gICAuLi5cbiAgID4+PiBjMSA9IEMoKVxuICAgPj4+IGMyID0gQygpXG4gICA+Pj4gYzEuX19sZW5fXyA9IGxhbWJkYTogNVxuICAgPj4+IGMyLl9fbGVuX18gPSBsYW1iZGE6IDlcbiAgID4+PiBsZW4oYzEpXG4gICA1XG4gICA+Pj4gbGVuKGMyKVxuICAgOVxuXG5cblNwZWNpYWwgbWV0aG9kIGxvb2t1cCBmb3IgbmV3LXN0eWxlIGNsYXNzZXNcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuRm9yIG5ldy1zdHlsZSBjbGFzc2VzLCBpbXBsaWNpdCBpbnZvY2F0aW9ucyBvZiBzcGVjaWFsIG1ldGhvZHMgYXJlXG5vbmx5IGd1YXJhbnRlZWQgdG8gd29yayBjb3JyZWN0bHkgaWYgZGVmaW5lZCBvbiBhbiBvYmplY3RcJ3MgdHlwZSwgbm90XG5pbiB0aGUgb2JqZWN0XCdzIGluc3RhbmNlIGRpY3Rpb25hcnkuICBUaGF0IGJlaGF2aW91ciBpcyB0aGUgcmVhc29uIHdoeVxudGhlIGZvbGxvd2luZyBjb2RlIHJhaXNlcyBhbiBleGNlcHRpb24gKHVubGlrZSB0aGUgZXF1aXZhbGVudCBleGFtcGxlXG53aXRoIG9sZC1zdHlsZSBjbGFzc2VzKTpcblxuICAgPj4+IGNsYXNzIEMob2JqZWN0KTpcbiAgIC4uLiAgICAgcGFzc1xuICAgLi4uXG4gICA+Pj4gYyA9IEMoKVxuICAgPj4+IGMuX19sZW5fXyA9IGxhbWJkYTogNVxuICAgPj4+IGxlbihjKVxuICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA8bW9kdWxlPlxuICAgVHlwZUVycm9yOiBvYmplY3Qgb2YgdHlwZSBcJ0NcJyBoYXMgbm8gbGVuKClcblxuVGhlIHJhdGlvbmFsZSBiZWhpbmQgdGhpcyBiZWhhdmlvdXIgbGllcyB3aXRoIGEgbnVtYmVyIG9mIHNwZWNpYWxcbm1ldGhvZHMgc3VjaCBhcyBgYF9faGFzaF9fKClgYCBhbmQgYGBfX3JlcHJfXygpYGAgdGhhdCBhcmUgaW1wbGVtZW50ZWRcbmJ5IGFsbCBvYmplY3RzLCBpbmNsdWRpbmcgdHlwZSBvYmplY3RzLiBJZiB0aGUgaW1wbGljaXQgbG9va3VwIG9mXG50aGVzZSBtZXRob2RzIHVzZWQgdGhlIGNvbnZlbnRpb25hbCBsb29rdXAgcHJvY2VzcywgdGhleSB3b3VsZCBmYWlsXG53aGVuIGludm9rZWQgb24gdGhlIHR5cGUgb2JqZWN0IGl0c2VsZjpcblxuICAgPj4+IDEgLl9faGFzaF9fKCkgPT0gaGFzaCgxKVxuICAgVHJ1ZVxuICAgPj4+IGludC5fX2hhc2hfXygpID09IGhhc2goaW50KVxuICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA8bW9kdWxlPlxuICAgVHlwZUVycm9yOiBkZXNjcmlwdG9yIFwnX19oYXNoX19cJyBvZiBcJ2ludFwnIG9iamVjdCBuZWVkcyBhbiBhcmd1bWVudFxuXG5JbmNvcnJlY3RseSBhdHRlbXB0aW5nIHRvIGludm9rZSBhbiB1bmJvdW5kIG1ldGhvZCBvZiBhIGNsYXNzIGluIHRoaXNcbndheSBpcyBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgXCdtZXRhY2xhc3MgY29uZnVzaW9uXCcsIGFuZCBpcyBhdm9pZGVkXG5ieSBieXBhc3NpbmcgdGhlIGluc3RhbmNlIHdoZW4gbG9va2luZyB1cCBzcGVjaWFsIG1ldGhvZHM6XG5cbiAgID4+PiB0eXBlKDEpLl9faGFzaF9fKDEpID09IGhhc2goMSlcbiAgIFRydWVcbiAgID4+PiB0eXBlKGludCkuX19oYXNoX18oaW50KSA9PSBoYXNoKGludClcbiAgIFRydWVcblxuSW4gYWRkaXRpb24gdG8gYnlwYXNzaW5nIGFueSBpbnN0YW5jZSBhdHRyaWJ1dGVzIGluIHRoZSBpbnRlcmVzdCBvZlxuY29ycmVjdG5lc3MsIGltcGxpY2l0IHNwZWNpYWwgbWV0aG9kIGxvb2t1cCBnZW5lcmFsbHkgYWxzbyBieXBhc3Nlc1xudGhlIGBgX19nZXRhdHRyaWJ1dGVfXygpYGAgbWV0aG9kIGV2ZW4gb2YgdGhlIG9iamVjdFwncyBtZXRhY2xhc3M6XG5cbiAgID4+PiBjbGFzcyBNZXRhKHR5cGUpOlxuICAgLi4uICAgIGRlZiBfX2dldGF0dHJpYnV0ZV9fKCphcmdzKTpcbiAgIC4uLiAgICAgICBwcmludCAiTWV0YWNsYXNzIGdldGF0dHJpYnV0ZSBpbnZva2VkIlxuICAgLi4uICAgICAgIHJldHVybiB0eXBlLl9fZ2V0YXR0cmlidXRlX18oKmFyZ3MpXG4gICAuLi5cbiAgID4+PiBjbGFzcyBDKG9iamVjdCk6XG4gICAuLi4gICAgIF9fbWV0YWNsYXNzX18gPSBNZXRhXG4gICAuLi4gICAgIGRlZiBfX2xlbl9fKHNlbGYpOlxuICAgLi4uICAgICAgICAgcmV0dXJuIDEwXG4gICAuLi4gICAgIGRlZiBfX2dldGF0dHJpYnV0ZV9fKCphcmdzKTpcbiAgIC4uLiAgICAgICAgIHByaW50ICJDbGFzcyBnZXRhdHRyaWJ1dGUgaW52b2tlZCJcbiAgIC4uLiAgICAgICAgIHJldHVybiBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXygqYXJncylcbiAgIC4uLlxuICAgPj4+IGMgPSBDKClcbiAgID4+PiBjLl9fbGVuX18oKSAgICAgICAgICAgICAgICAgIyBFeHBsaWNpdCBsb29rdXAgdmlhIGluc3RhbmNlXG4gICBDbGFzcyBnZXRhdHRyaWJ1dGUgaW52b2tlZFxuICAgMTBcbiAgID4+PiB0eXBlKGMpLl9fbGVuX18oYykgICAgICAgICAgIyBFeHBsaWNpdCBsb29rdXAgdmlhIHR5cGVcbiAgIE1ldGFjbGFzcyBnZXRhdHRyaWJ1dGUgaW52b2tlZFxuICAgMTBcbiAgID4+PiBsZW4oYykgICAgICAgICAgICAgICAgICAgICAgIyBJbXBsaWNpdCBsb29rdXBcbiAgIDEwXG5cbkJ5cGFzc2luZyB0aGUgYGBfX2dldGF0dHJpYnV0ZV9fKClgYCBtYWNoaW5lcnkgaW4gdGhpcyBmYXNoaW9uXG5wcm92aWRlcyBzaWduaWZpY2FudCBzY29wZSBmb3Igc3BlZWQgb3B0aW1pc2F0aW9ucyB3aXRoaW4gdGhlXG5pbnRlcnByZXRlciwgYXQgdGhlIGNvc3Qgb2Ygc29tZSBmbGV4aWJpbGl0eSBpbiB0aGUgaGFuZGxpbmcgb2ZcbnNwZWNpYWwgbWV0aG9kcyAodGhlIHNwZWNpYWwgbWV0aG9kICptdXN0KiBiZSBzZXQgb24gdGhlIGNsYXNzIG9iamVjdFxuaXRzZWxmIGluIG9yZGVyIHRvIGJlIGNvbnNpc3RlbnRseSBpbnZva2VkIGJ5IHRoZSBpbnRlcnByZXRlcikuXG5cbi1bIEZvb3Rub3RlcyBdLVxuXG5bMV0gSXQgKmlzKiBwb3NzaWJsZSBpbiBzb21lIGNhc2VzIHRvIGNoYW5nZSBhbiBvYmplY3RcJ3MgdHlwZSwgdW5kZXJcbiAgICBjZXJ0YWluIGNvbnRyb2xsZWQgY29uZGl0aW9ucy4gSXQgZ2VuZXJhbGx5IGlzblwndCBhIGdvb2QgaWRlYVxuICAgIHRob3VnaCwgc2luY2UgaXQgY2FuIGxlYWQgdG8gc29tZSB2ZXJ5IHN0cmFuZ2UgYmVoYXZpb3VyIGlmIGl0IGlzXG4gICAgaGFuZGxlZCBpbmNvcnJlY3RseS5cblxuWzJdIEZvciBvcGVyYW5kcyBvZiB0aGUgc2FtZSB0eXBlLCBpdCBpcyBhc3N1bWVkIHRoYXQgaWYgdGhlIG5vbi1cbiAgICByZWZsZWN0ZWQgbWV0aG9kIChzdWNoIGFzIGBgX19hZGRfXygpYGApIGZhaWxzIHRoZSBvcGVyYXRpb24gaXNcbiAgICBub3Qgc3VwcG9ydGVkLCB3aGljaCBpcyB3aHkgdGhlIHJlZmxlY3RlZCBtZXRob2QgaXMgbm90IGNhbGxlZC5cbicsCisgJ3N0cmluZy1tZXRob2RzJzogJ1xuU3RyaW5nIE1ldGhvZHNcbioqKioqKioqKioqKioqXG5cbkJlbG93IGFyZSBsaXN0ZWQgdGhlIHN0cmluZyBtZXRob2RzIHdoaWNoIGJvdGggOC1iaXQgc3RyaW5ncyBhbmRcblVuaWNvZGUgb2JqZWN0cyBzdXBwb3J0LiAgU29tZSBvZiB0aGVtIGFyZSBhbHNvIGF2YWlsYWJsZSBvblxuYGBieXRlYXJyYXlgYCBvYmplY3RzLlxuXG5JbiBhZGRpdGlvbiwgUHl0aG9uXCdzIHN0cmluZ3Mgc3VwcG9ydCB0aGUgc2VxdWVuY2UgdHlwZSBtZXRob2RzXG5kZXNjcmliZWQgaW4gdGhlICpTZXF1ZW5jZSBUeXBlcyAtLS0gc3RyLCB1bmljb2RlLCBsaXN0LCB0dXBsZSxcbmJ5dGVhcnJheSwgYnVmZmVyLCB4cmFuZ2UqIHNlY3Rpb24uIFRvIG91dHB1dCBmb3JtYXR0ZWQgc3RyaW5ncyB1c2VcbnRlbXBsYXRlIHN0cmluZ3Mgb3IgdGhlIGBgJWBgIG9wZXJhdG9yIGRlc2NyaWJlZCBpbiB0aGUgKlN0cmluZ1xuRm9ybWF0dGluZyBPcGVyYXRpb25zKiBzZWN0aW9uLiBBbHNvLCBzZWUgdGhlIGBgcmVgYCBtb2R1bGUgZm9yIHN0cmluZ1xuZnVuY3Rpb25zIGJhc2VkIG9uIHJlZ3VsYXIgZXhwcmVzc2lvbnMuXG5cbnN0ci5jYXBpdGFsaXplKClcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggaXRzIGZpcnN0IGNoYXJhY3RlciBjYXBpdGFsaXplZFxuICAgYW5kIHRoZSByZXN0IGxvd2VyY2FzZWQuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuY2VudGVyKHdpZHRoWywgZmlsbGNoYXJdKVxuXG4gICBSZXR1cm4gY2VudGVyZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoICp3aWR0aCouIFBhZGRpbmcgaXMgZG9uZVxuICAgdXNpbmcgdGhlIHNwZWNpZmllZCAqZmlsbGNoYXIqIChkZWZhdWx0IGlzIGEgc3BhY2UpLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi40OiBTdXBwb3J0IGZvciB0aGUgKmZpbGxjaGFyKiBhcmd1bWVudC5cblxuc3RyLmNvdW50KHN1YlssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiB0aGUgbnVtYmVyIG9mIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgKnN1YipcbiAgIGluIHRoZSByYW5nZSBbKnN0YXJ0KiwgKmVuZCpdLiAgT3B0aW9uYWwgYXJndW1lbnRzICpzdGFydCogYW5kXG4gICAqZW5kKiBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXG5cbnN0ci5kZWNvZGUoW2VuY29kaW5nWywgZXJyb3JzXV0pXG5cbiAgIERlY29kZXMgdGhlIHN0cmluZyB1c2luZyB0aGUgY29kZWMgcmVnaXN0ZXJlZCBmb3IgKmVuY29kaW5nKi5cbiAgICplbmNvZGluZyogZGVmYXVsdHMgdG8gdGhlIGRlZmF1bHQgc3RyaW5nIGVuY29kaW5nLiAgKmVycm9ycyogbWF5XG4gICBiZSBnaXZlbiB0byBzZXQgYSBkaWZmZXJlbnQgZXJyb3IgaGFuZGxpbmcgc2NoZW1lLiAgVGhlIGRlZmF1bHQgaXNcbiAgIGBgXCdzdHJpY3RcJ2BgLCBtZWFuaW5nIHRoYXQgZW5jb2RpbmcgZXJyb3JzIHJhaXNlIGBgVW5pY29kZUVycm9yYGAuXG4gICBPdGhlciBwb3NzaWJsZSB2YWx1ZXMgYXJlIGBgXCdpZ25vcmVcJ2BgLCBgYFwncmVwbGFjZVwnYGAgYW5kIGFueSBvdGhlclxuICAgbmFtZSByZWdpc3RlcmVkIHZpYSBgYGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigpYGAsIHNlZSBzZWN0aW9uICpDb2RlY1xuICAgQmFzZSBDbGFzc2VzKi5cblxuICAgTmV3IGluIHZlcnNpb24gMi4yLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBTdXBwb3J0IGZvciBvdGhlciBlcnJvciBoYW5kbGluZyBzY2hlbWVzXG4gICBhZGRlZC5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNzogU3VwcG9ydCBmb3Iga2V5d29yZCBhcmd1bWVudHMgYWRkZWQuXG5cbnN0ci5lbmNvZGUoW2VuY29kaW5nWywgZXJyb3JzXV0pXG5cbiAgIFJldHVybiBhbiBlbmNvZGVkIHZlcnNpb24gb2YgdGhlIHN0cmluZy4gIERlZmF1bHQgZW5jb2RpbmcgaXMgdGhlXG4gICBjdXJyZW50IGRlZmF1bHQgc3RyaW5nIGVuY29kaW5nLiAgKmVycm9ycyogbWF5IGJlIGdpdmVuIHRvIHNldCBhXG4gICBkaWZmZXJlbnQgZXJyb3IgaGFuZGxpbmcgc2NoZW1lLiAgVGhlIGRlZmF1bHQgZm9yICplcnJvcnMqIGlzXG4gICBgYFwnc3RyaWN0XCdgYCwgbWVhbmluZyB0aGF0IGVuY29kaW5nIGVycm9ycyByYWlzZSBhXG4gICBgYFVuaWNvZGVFcnJvcmBgLiAgT3RoZXIgcG9zc2libGUgdmFsdWVzIGFyZSBgYFwnaWdub3JlXCdgYCxcbiAgIGBgXCdyZXBsYWNlXCdgYCwgYGBcJ3htbGNoYXJyZWZyZXBsYWNlXCdgYCwgYGBcJ2JhY2tzbGFzaHJlcGxhY2VcJ2BgIGFuZFxuICAgYW55IG90aGVyIG5hbWUgcmVnaXN0ZXJlZCB2aWEgYGBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoKWBgLCBzZWVcbiAgIHNlY3Rpb24gKkNvZGVjIEJhc2UgQ2xhc3NlcyouIEZvciBhIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLCBzZWVcbiAgIHNlY3Rpb24gKlN0YW5kYXJkIEVuY29kaW5ncyouXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDIuMC5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMzogU3VwcG9ydCBmb3IgYGBcJ3htbGNoYXJyZWZyZXBsYWNlXCdgYCBhbmRcbiAgIGBgXCdiYWNrc2xhc2hyZXBsYWNlXCdgYCBhbmQgb3RoZXIgZXJyb3IgaGFuZGxpbmcgc2NoZW1lcyBhZGRlZC5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNzogU3VwcG9ydCBmb3Iga2V5d29yZCBhcmd1bWVudHMgYWRkZWQuXG5cbnN0ci5lbmRzd2l0aChzdWZmaXhbLCBzdGFydFssIGVuZF1dKVxuXG4gICBSZXR1cm4gYGBUcnVlYGAgaWYgdGhlIHN0cmluZyBlbmRzIHdpdGggdGhlIHNwZWNpZmllZCAqc3VmZml4KixcbiAgIG90aGVyd2lzZSByZXR1cm4gYGBGYWxzZWBgLiAgKnN1ZmZpeCogY2FuIGFsc28gYmUgYSB0dXBsZSBvZlxuICAgc3VmZml4ZXMgdG8gbG9vayBmb3IuICBXaXRoIG9wdGlvbmFsICpzdGFydCosIHRlc3QgYmVnaW5uaW5nIGF0XG4gICB0aGF0IHBvc2l0aW9uLiAgV2l0aCBvcHRpb25hbCAqZW5kKiwgc3RvcCBjb21wYXJpbmcgYXQgdGhhdFxuICAgcG9zaXRpb24uXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjU6IEFjY2VwdCB0dXBsZXMgYXMgKnN1ZmZpeCouXG5cbnN0ci5leHBhbmR0YWJzKFt0YWJzaXplXSlcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdoZXJlIGFsbCB0YWIgY2hhcmFjdGVycyBhcmUgcmVwbGFjZWRcbiAgIGJ5IG9uZSBvciBtb3JlIHNwYWNlcywgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGNvbHVtbiBhbmQgdGhlXG4gICBnaXZlbiB0YWIgc2l6ZS4gIFRhYiBwb3NpdGlvbnMgb2NjdXIgZXZlcnkgKnRhYnNpemUqIGNoYXJhY3RlcnNcbiAgIChkZWZhdWx0IGlzIDgsIGdpdmluZyB0YWIgcG9zaXRpb25zIGF0IGNvbHVtbnMgMCwgOCwgMTYgYW5kIHNvIG9uKS5cbiAgIFRvIGV4cGFuZCB0aGUgc3RyaW5nLCB0aGUgY3VycmVudCBjb2x1bW4gaXMgc2V0IHRvIHplcm8gYW5kIHRoZVxuICAgc3RyaW5nIGlzIGV4YW1pbmVkIGNoYXJhY3RlciBieSBjaGFyYWN0ZXIuICBJZiB0aGUgY2hhcmFjdGVyIGlzIGFcbiAgIHRhYiAoYGBcXHRgYCksIG9uZSBvciBtb3JlIHNwYWNlIGNoYXJhY3RlcnMgYXJlIGluc2VydGVkIGluIHRoZVxuICAgcmVzdWx0IHVudGlsIHRoZSBjdXJyZW50IGNvbHVtbiBpcyBlcXVhbCB0byB0aGUgbmV4dCB0YWIgcG9zaXRpb24uXG4gICAoVGhlIHRhYiBjaGFyYWN0ZXIgaXRzZWxmIGlzIG5vdCBjb3BpZWQuKSAgSWYgdGhlIGNoYXJhY3RlciBpcyBhXG4gICBuZXdsaW5lIChgYFxcbmBgKSBvciByZXR1cm4gKGBgXFxyYGApLCBpdCBpcyBjb3BpZWQgYW5kIHRoZSBjdXJyZW50XG4gICBjb2x1bW4gaXMgcmVzZXQgdG8gemVyby4gIEFueSBvdGhlciBjaGFyYWN0ZXIgaXMgY29waWVkIHVuY2hhbmdlZFxuICAgYW5kIHRoZSBjdXJyZW50IGNvbHVtbiBpcyBpbmNyZW1lbnRlZCBieSBvbmUgcmVnYXJkbGVzcyBvZiBob3cgdGhlXG4gICBjaGFyYWN0ZXIgaXMgcmVwcmVzZW50ZWQgd2hlbiBwcmludGVkLlxuXG4gICA+Pj4gXCcwMVxcdDAxMlxcdDAxMjNcXHQwMTIzNFwnLmV4cGFuZHRhYnMoKVxuICAgXCcwMSAgICAgIDAxMiAgICAgMDEyMyAgICAwMTIzNFwnXG4gICA+Pj4gXCcwMVxcdDAxMlxcdDAxMjNcXHQwMTIzNFwnLmV4cGFuZHRhYnMoNClcbiAgIFwnMDEgIDAxMiAwMTIzICAgIDAxMjM0XCdcblxuc3RyLmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSlcblxuICAgUmV0dXJuIHRoZSBsb3dlc3QgaW5kZXggaW4gdGhlIHN0cmluZyB3aGVyZSBzdWJzdHJpbmcgKnN1YiogaXNcbiAgIGZvdW5kLCBzdWNoIHRoYXQgKnN1YiogaXMgY29udGFpbmVkIGluIHRoZSBzbGljZSBgYHNbc3RhcnQ6ZW5kXWBgLlxuICAgT3B0aW9uYWwgYXJndW1lbnRzICpzdGFydCogYW5kICplbmQqIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZVxuICAgbm90YXRpb24uICBSZXR1cm4gYGAtMWBgIGlmICpzdWIqIGlzIG5vdCBmb3VuZC5cblxuICAgTm90ZTogVGhlIGBgZmluZCgpYGAgbWV0aG9kIHNob3VsZCBiZSB1c2VkIG9ubHkgaWYgeW91IG5lZWQgdG8ga25vdyB0aGVcbiAgICAgcG9zaXRpb24gb2YgKnN1YiouICBUbyBjaGVjayBpZiAqc3ViKiBpcyBhIHN1YnN0cmluZyBvciBub3QsIHVzZVxuICAgICB0aGUgYGBpbmBgIG9wZXJhdG9yOlxuXG4gICAgICAgID4+PiBcJ1B5XCcgaW4gXCdQeXRob25cJ1xuICAgICAgICBUcnVlXG5cbnN0ci5mb3JtYXQoKmFyZ3MsICoqa3dhcmdzKVxuXG4gICBQZXJmb3JtIGEgc3RyaW5nIGZvcm1hdHRpbmcgb3BlcmF0aW9uLiAgVGhlIHN0cmluZyBvbiB3aGljaCB0aGlzXG4gICBtZXRob2QgaXMgY2FsbGVkIGNhbiBjb250YWluIGxpdGVyYWwgdGV4dCBvciByZXBsYWNlbWVudCBmaWVsZHNcbiAgIGRlbGltaXRlZCBieSBicmFjZXMgYGB7fWBgLiAgRWFjaCByZXBsYWNlbWVudCBmaWVsZCBjb250YWlucyBlaXRoZXJcbiAgIHRoZSBudW1lcmljIGluZGV4IG9mIGEgcG9zaXRpb25hbCBhcmd1bWVudCwgb3IgdGhlIG5hbWUgb2YgYVxuICAga2V5d29yZCBhcmd1bWVudC4gIFJldHVybnMgYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2hlcmUgZWFjaFxuICAgcmVwbGFjZW1lbnQgZmllbGQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZVxuICAgY29ycmVzcG9uZGluZyBhcmd1bWVudC5cblxuICAgPj4+ICJUaGUgc3VtIG9mIDEgKyAyIGlzIHswfSIuZm9ybWF0KDErMilcbiAgIFwnVGhlIHN1bSBvZiAxICsgMiBpcyAzXCdcblxuICAgU2VlICpGb3JtYXQgU3RyaW5nIFN5bnRheCogZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHZhcmlvdXNcbiAgIGZvcm1hdHRpbmcgb3B0aW9ucyB0aGF0IGNhbiBiZSBzcGVjaWZpZWQgaW4gZm9ybWF0IHN0cmluZ3MuXG5cbiAgIFRoaXMgbWV0aG9kIG9mIHN0cmluZyBmb3JtYXR0aW5nIGlzIHRoZSBuZXcgc3RhbmRhcmQgaW4gUHl0aG9uIDMsXG4gICBhbmQgc2hvdWxkIGJlIHByZWZlcnJlZCB0byB0aGUgYGAlYGAgZm9ybWF0dGluZyBkZXNjcmliZWQgaW5cbiAgICpTdHJpbmcgRm9ybWF0dGluZyBPcGVyYXRpb25zKiBpbiBuZXcgY29kZS5cblxuICAgTmV3IGluIHZlcnNpb24gMi42LlxuXG5zdHIuaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSlcblxuICAgTGlrZSBgYGZpbmQoKWBgLCBidXQgcmFpc2UgYGBWYWx1ZUVycm9yYGAgd2hlbiB0aGUgc3Vic3RyaW5nIGlzIG5vdFxuICAgZm91bmQuXG5cbnN0ci5pc2FsbnVtKClcblxuICAgUmV0dXJuIHRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgYWxwaGFudW1lcmljIGFuZFxuICAgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLmlzYWxwaGEoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBhbHBoYWJldGljIGFuZFxuICAgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLmlzZGlnaXQoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBkaWdpdHMgYW5kIHRoZXJlIGlzXG4gICBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuaXNsb3dlcigpXG5cbiAgIFJldHVybiB0cnVlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIFs0XSBpbiB0aGUgc3RyaW5nIGFyZSBsb3dlcmNhc2VcbiAgIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuaXNzcGFjZSgpXG5cbiAgIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBvbmx5IHdoaXRlc3BhY2UgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nXG4gICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLmlzdGl0bGUoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgdGl0bGVjYXNlZCBzdHJpbmcgYW5kIHRoZXJlIGlzIGF0XG4gICBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmb3IgZXhhbXBsZSB1cHBlcmNhc2UgY2hhcmFjdGVycyBtYXkgb25seVxuICAgZm9sbG93IHVuY2FzZWQgY2hhcmFjdGVycyBhbmQgbG93ZXJjYXNlIGNoYXJhY3RlcnMgb25seSBjYXNlZCBvbmVzLlxuICAgUmV0dXJuIGZhbHNlIG90aGVyd2lzZS5cblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci5pc3VwcGVyKClcblxuICAgUmV0dXJuIHRydWUgaWYgYWxsIGNhc2VkIGNoYXJhY3RlcnMgWzRdIGluIHRoZSBzdHJpbmcgYXJlIHVwcGVyY2FzZVxuICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS5cblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci5qb2luKGl0ZXJhYmxlKVxuXG4gICBSZXR1cm4gYSBzdHJpbmcgd2hpY2ggaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHN0cmluZ3MgaW4gdGhlXG4gICAqaXRlcmFibGUqICppdGVyYWJsZSouICBUaGUgc2VwYXJhdG9yIGJldHdlZW4gZWxlbWVudHMgaXMgdGhlXG4gICBzdHJpbmcgcHJvdmlkaW5nIHRoaXMgbWV0aG9kLlxuXG5zdHIubGp1c3Qod2lkdGhbLCBmaWxsY2hhcl0pXG5cbiAgIFJldHVybiB0aGUgc3RyaW5nIGxlZnQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCAqd2lkdGgqLlxuICAgUGFkZGluZyBpcyBkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgKmZpbGxjaGFyKiAoZGVmYXVsdCBpcyBhXG4gICBzcGFjZSkuICBUaGUgb3JpZ2luYWwgc3RyaW5nIGlzIHJldHVybmVkIGlmICp3aWR0aCogaXMgbGVzcyB0aGFuIG9yXG4gICBlcXVhbCB0byBgYGxlbihzKWBgLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi40OiBTdXBwb3J0IGZvciB0aGUgKmZpbGxjaGFyKiBhcmd1bWVudC5cblxuc3RyLmxvd2VyKClcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggYWxsIHRoZSBjYXNlZCBjaGFyYWN0ZXJzIFs0XVxuICAgY29udmVydGVkIHRvIGxvd2VyY2FzZS5cblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci5sc3RyaXAoW2NoYXJzXSlcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggbGVhZGluZyBjaGFyYWN0ZXJzIHJlbW92ZWQuICBUaGVcbiAgICpjaGFycyogYXJndW1lbnQgaXMgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgc2V0IG9mIGNoYXJhY3RlcnMgdG8gYmVcbiAgIHJlbW92ZWQuICBJZiBvbWl0dGVkIG9yIGBgTm9uZWBgLCB0aGUgKmNoYXJzKiBhcmd1bWVudCBkZWZhdWx0cyB0b1xuICAgcmVtb3Zpbmcgd2hpdGVzcGFjZS4gIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzIG5vdCBhIHByZWZpeDsgcmF0aGVyLFxuICAgYWxsIGNvbWJpbmF0aW9ucyBvZiBpdHMgdmFsdWVzIGFyZSBzdHJpcHBlZDpcblxuICAgPj4+IFwnICAgc3BhY2lvdXMgICBcJy5sc3RyaXAoKVxuICAgXCdzcGFjaW91cyAgIFwnXG4gICA+Pj4gXCd3d3cuZXhhbXBsZS5jb21cJy5sc3RyaXAoXCdjbW93ei5cJylcbiAgIFwnZXhhbXBsZS5jb21cJ1xuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4yLjI6IFN1cHBvcnQgZm9yIHRoZSAqY2hhcnMqIGFyZ3VtZW50LlxuXG5zdHIucGFydGl0aW9uKHNlcClcblxuICAgU3BsaXQgdGhlIHN0cmluZyBhdCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiAqc2VwKiwgYW5kIHJldHVybiBhXG4gICAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHBhcnQgYmVmb3JlIHRoZSBzZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3JcbiAgIGl0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIHRoZSBzZXBhcmF0b3IuICBJZiB0aGUgc2VwYXJhdG9yIGlzIG5vdFxuICAgZm91bmQsIHJldHVybiBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgc3RyaW5nIGl0c2VsZiwgZm9sbG93ZWQgYnlcbiAgIHR3byBlbXB0eSBzdHJpbmdzLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjUuXG5cbnN0ci5yZXBsYWNlKG9sZCwgbmV3WywgY291bnRdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBhbGwgb2NjdXJyZW5jZXMgb2Ygc3Vic3RyaW5nICpvbGQqXG4gICByZXBsYWNlZCBieSAqbmV3Ki4gIElmIHRoZSBvcHRpb25hbCBhcmd1bWVudCAqY291bnQqIGlzIGdpdmVuLCBvbmx5XG4gICB0aGUgZmlyc3QgKmNvdW50KiBvY2N1cnJlbmNlcyBhcmUgcmVwbGFjZWQuXG5cbnN0ci5yZmluZChzdWJbLCBzdGFydFssIGVuZF1dKVxuXG4gICBSZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gdGhlIHN0cmluZyB3aGVyZSBzdWJzdHJpbmcgKnN1YiogaXNcbiAgIGZvdW5kLCBzdWNoIHRoYXQgKnN1YiogaXMgY29udGFpbmVkIHdpdGhpbiBgYHNbc3RhcnQ6ZW5kXWBgLlxuICAgT3B0aW9uYWwgYXJndW1lbnRzICpzdGFydCogYW5kICplbmQqIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZVxuICAgbm90YXRpb24uICBSZXR1cm4gYGAtMWBgIG9uIGZhaWx1cmUuXG5cbnN0ci5yaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSlcblxuICAgTGlrZSBgYHJmaW5kKClgYCBidXQgcmFpc2VzIGBgVmFsdWVFcnJvcmBgIHdoZW4gdGhlIHN1YnN0cmluZyAqc3ViKlxuICAgaXMgbm90IGZvdW5kLlxuXG5zdHIucmp1c3Qod2lkdGhbLCBmaWxsY2hhcl0pXG5cbiAgIFJldHVybiB0aGUgc3RyaW5nIHJpZ2h0IGp1c3RpZmllZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi5cbiAgIFBhZGRpbmcgaXMgZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkICpmaWxsY2hhciogKGRlZmF1bHQgaXMgYVxuICAgc3BhY2UpLiBUaGUgb3JpZ2luYWwgc3RyaW5nIGlzIHJldHVybmVkIGlmICp3aWR0aCogaXMgbGVzcyB0aGFuIG9yXG4gICBlcXVhbCB0byBgYGxlbihzKWBgLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi40OiBTdXBwb3J0IGZvciB0aGUgKmZpbGxjaGFyKiBhcmd1bWVudC5cblxuc3RyLnJwYXJ0aXRpb24oc2VwKVxuXG4gICBTcGxpdCB0aGUgc3RyaW5nIGF0IHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgKnNlcCosIGFuZCByZXR1cm4gYVxuICAgMy10dXBsZSBjb250YWluaW5nIHRoZSBwYXJ0IGJlZm9yZSB0aGUgc2VwYXJhdG9yLCB0aGUgc2VwYXJhdG9yXG4gICBpdHNlbGYsIGFuZCB0aGUgcGFydCBhZnRlciB0aGUgc2VwYXJhdG9yLiAgSWYgdGhlIHNlcGFyYXRvciBpcyBub3RcbiAgIGZvdW5kLCByZXR1cm4gYSAzLXR1cGxlIGNvbnRhaW5pbmcgdHdvIGVtcHR5IHN0cmluZ3MsIGZvbGxvd2VkIGJ5XG4gICB0aGUgc3RyaW5nIGl0c2VsZi5cblxuICAgTmV3IGluIHZlcnNpb24gMi41LlxuXG5zdHIucnNwbGl0KFtzZXBbLCBtYXhzcGxpdF1dKVxuXG4gICBSZXR1cm4gYSBsaXN0IG9mIHRoZSB3b3JkcyBpbiB0aGUgc3RyaW5nLCB1c2luZyAqc2VwKiBhcyB0aGVcbiAgIGRlbGltaXRlciBzdHJpbmcuIElmICptYXhzcGxpdCogaXMgZ2l2ZW4sIGF0IG1vc3QgKm1heHNwbGl0KiBzcGxpdHNcbiAgIGFyZSBkb25lLCB0aGUgKnJpZ2h0bW9zdCogb25lcy4gIElmICpzZXAqIGlzIG5vdCBzcGVjaWZpZWQgb3JcbiAgIGBgTm9uZWBgLCBhbnkgd2hpdGVzcGFjZSBzdHJpbmcgaXMgYSBzZXBhcmF0b3IuICBFeGNlcHQgZm9yXG4gICBzcGxpdHRpbmcgZnJvbSB0aGUgcmlnaHQsIGBgcnNwbGl0KClgYCBiZWhhdmVzIGxpa2UgYGBzcGxpdCgpYGBcbiAgIHdoaWNoIGlzIGRlc2NyaWJlZCBpbiBkZXRhaWwgYmVsb3cuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDIuNC5cblxuc3RyLnJzdHJpcChbY2hhcnNdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCB0cmFpbGluZyBjaGFyYWN0ZXJzIHJlbW92ZWQuICBUaGVcbiAgICpjaGFycyogYXJndW1lbnQgaXMgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgc2V0IG9mIGNoYXJhY3RlcnMgdG8gYmVcbiAgIHJlbW92ZWQuICBJZiBvbWl0dGVkIG9yIGBgTm9uZWBgLCB0aGUgKmNoYXJzKiBhcmd1bWVudCBkZWZhdWx0cyB0b1xuICAgcmVtb3Zpbmcgd2hpdGVzcGFjZS4gIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzIG5vdCBhIHN1ZmZpeDsgcmF0aGVyLFxuICAgYWxsIGNvbWJpbmF0aW9ucyBvZiBpdHMgdmFsdWVzIGFyZSBzdHJpcHBlZDpcblxuICAgPj4+IFwnICAgc3BhY2lvdXMgICBcJy5yc3RyaXAoKVxuICAgXCcgICBzcGFjaW91c1wnXG4gICA+Pj4gXCdtaXNzaXNzaXBwaVwnLnJzdHJpcChcJ2lwelwnKVxuICAgXCdtaXNzaXNzXCdcblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMi4yOiBTdXBwb3J0IGZvciB0aGUgKmNoYXJzKiBhcmd1bWVudC5cblxuc3RyLnNwbGl0KFtzZXBbLCBtYXhzcGxpdF1dKVxuXG4gICBSZXR1cm4gYSBsaXN0IG9mIHRoZSB3b3JkcyBpbiB0aGUgc3RyaW5nLCB1c2luZyAqc2VwKiBhcyB0aGVcbiAgIGRlbGltaXRlciBzdHJpbmcuICBJZiAqbWF4c3BsaXQqIGlzIGdpdmVuLCBhdCBtb3N0ICptYXhzcGxpdCpcbiAgIHNwbGl0cyBhcmUgZG9uZSAodGh1cywgdGhlIGxpc3Qgd2lsbCBoYXZlIGF0IG1vc3QgYGBtYXhzcGxpdCsxYGBcbiAgIGVsZW1lbnRzKS4gIElmICptYXhzcGxpdCogaXMgbm90IHNwZWNpZmllZCBvciBgYC0xYGAsIHRoZW4gdGhlcmUgaXNcbiAgIG5vIGxpbWl0IG9uIHRoZSBudW1iZXIgb2Ygc3BsaXRzIChhbGwgcG9zc2libGUgc3BsaXRzIGFyZSBtYWRlKS5cblxuICAgSWYgKnNlcCogaXMgZ2l2ZW4sIGNvbnNlY3V0aXZlIGRlbGltaXRlcnMgYXJlIG5vdCBncm91cGVkIHRvZ2V0aGVyXG4gICBhbmQgYXJlIGRlZW1lZCB0byBkZWxpbWl0IGVtcHR5IHN0cmluZ3MgKGZvciBleGFtcGxlLFxuICAgYGBcJzEsLDJcJy5zcGxpdChcJyxcJylgYCByZXR1cm5zIGBgW1wnMVwnLCBcJ1wnLCBcJzJcJ11gYCkuICBUaGUgKnNlcCpcbiAgIGFyZ3VtZW50IG1heSBjb25zaXN0IG9mIG11bHRpcGxlIGNoYXJhY3RlcnMgKGZvciBleGFtcGxlLFxuICAgYGBcJzE8PjI8PjNcJy5zcGxpdChcJzw+XCcpYGAgcmV0dXJucyBgYFtcJzFcJywgXCcyXCcsIFwnM1wnXWBgKS4gU3BsaXR0aW5nXG4gICBhbiBlbXB0eSBzdHJpbmcgd2l0aCBhIHNwZWNpZmllZCBzZXBhcmF0b3IgcmV0dXJucyBgYFtcJ1wnXWBgLlxuXG4gICBJZiAqc2VwKiBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzIGBgTm9uZWBgLCBhIGRpZmZlcmVudCBzcGxpdHRpbmdcbiAgIGFsZ29yaXRobSBpcyBhcHBsaWVkOiBydW5zIG9mIGNvbnNlY3V0aXZlIHdoaXRlc3BhY2UgYXJlIHJlZ2FyZGVkXG4gICBhcyBhIHNpbmdsZSBzZXBhcmF0b3IsIGFuZCB0aGUgcmVzdWx0IHdpbGwgY29udGFpbiBubyBlbXB0eSBzdHJpbmdzXG4gICBhdCB0aGUgc3RhcnQgb3IgZW5kIGlmIHRoZSBzdHJpbmcgaGFzIGxlYWRpbmcgb3IgdHJhaWxpbmdcbiAgIHdoaXRlc3BhY2UuICBDb25zZXF1ZW50bHksIHNwbGl0dGluZyBhbiBlbXB0eSBzdHJpbmcgb3IgYSBzdHJpbmdcbiAgIGNvbnNpc3Rpbmcgb2YganVzdCB3aGl0ZXNwYWNlIHdpdGggYSBgYE5vbmVgYCBzZXBhcmF0b3IgcmV0dXJuc1xuICAgYGBbXWBgLlxuXG4gICBGb3IgZXhhbXBsZSwgYGBcJyAxICAyICAgMyAgXCcuc3BsaXQoKWBgIHJldHVybnMgYGBbXCcxXCcsIFwnMlwnLCBcJzNcJ11gYCxcbiAgIGFuZCBgYFwnICAxICAyICAgMyAgXCcuc3BsaXQoTm9uZSwgMSlgYCByZXR1cm5zIGBgW1wnMVwnLCBcJzIgICAzICBcJ11gYC5cblxuc3RyLnNwbGl0bGluZXMoW2tlZXBlbmRzXSlcblxuICAgUmV0dXJuIGEgbGlzdCBvZiB0aGUgbGluZXMgaW4gdGhlIHN0cmluZywgYnJlYWtpbmcgYXQgbGluZVxuICAgYm91bmRhcmllcy4gVGhpcyBtZXRob2QgdXNlcyB0aGUgKnVuaXZlcnNhbCBuZXdsaW5lcyogYXBwcm9hY2ggdG9cbiAgIHNwbGl0dGluZyBsaW5lcy4gTGluZSBicmVha3MgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIGxpc3RcbiAgIHVubGVzcyAqa2VlcGVuZHMqIGlzIGdpdmVuIGFuZCB0cnVlLlxuXG4gICBGb3IgZXhhbXBsZSwgYGBcJ2FiIGNcXG5cXG5kZSBmZ1xccmtsXFxyXFxuXCcuc3BsaXRsaW5lcygpYGAgcmV0dXJuc1xuICAgYGBbXCdhYiBjXCcsIFwnXCcsIFwnZGUgZmdcJywgXCdrbFwnXWBgLCB3aGlsZSB0aGUgc2FtZSBjYWxsIHdpdGhcbiAgIGBgc3BsaXRsaW5lcyhUcnVlKWBgIHJldHVybnMgYGBbXCdhYiBjXFxuXCcsIFwnXFxuXCcsIFwnZGUgZmdcXHJcJyxcbiAgIFwna2xcXHJcXG5cJ11gYC5cblxuICAgVW5saWtlIGBgc3BsaXQoKWBgIHdoZW4gYSBkZWxpbWl0ZXIgc3RyaW5nICpzZXAqIGlzIGdpdmVuLCB0aGlzXG4gICBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBsaXN0IGZvciB0aGUgZW1wdHkgc3RyaW5nLCBhbmQgYSB0ZXJtaW5hbFxuICAgbGluZSBicmVhayBkb2VzIG5vdCByZXN1bHQgaW4gYW4gZXh0cmEgbGluZS5cblxuc3RyLnN0YXJ0c3dpdGgocHJlZml4Wywgc3RhcnRbLCBlbmRdXSlcblxuICAgUmV0dXJuIGBgVHJ1ZWBgIGlmIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgKnByZWZpeCosIG90aGVyd2lzZVxuICAgcmV0dXJuIGBgRmFsc2VgYC4gKnByZWZpeCogY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBwcmVmaXhlcyB0byBsb29rXG4gICBmb3IuICBXaXRoIG9wdGlvbmFsICpzdGFydCosIHRlc3Qgc3RyaW5nIGJlZ2lubmluZyBhdCB0aGF0XG4gICBwb3NpdGlvbi4gIFdpdGggb3B0aW9uYWwgKmVuZCosIHN0b3AgY29tcGFyaW5nIHN0cmluZyBhdCB0aGF0XG4gICBwb3NpdGlvbi5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNTogQWNjZXB0IHR1cGxlcyBhcyAqcHJlZml4Ki5cblxuc3RyLnN0cmlwKFtjaGFyc10pXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHRoZSBsZWFkaW5nIGFuZCB0cmFpbGluZ1xuICAgY2hhcmFjdGVycyByZW1vdmVkLiBUaGUgKmNoYXJzKiBhcmd1bWVudCBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZVxuICAgc2V0IG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVtb3ZlZC4gSWYgb21pdHRlZCBvciBgYE5vbmVgYCwgdGhlXG4gICAqY2hhcnMqIGFyZ3VtZW50IGRlZmF1bHRzIHRvIHJlbW92aW5nIHdoaXRlc3BhY2UuIFRoZSAqY2hhcnMqXG4gICBhcmd1bWVudCBpcyBub3QgYSBwcmVmaXggb3Igc3VmZml4OyByYXRoZXIsIGFsbCBjb21iaW5hdGlvbnMgb2YgaXRzXG4gICB2YWx1ZXMgYXJlIHN0cmlwcGVkOlxuXG4gICA+Pj4gXCcgICBzcGFjaW91cyAgIFwnLnN0cmlwKClcbiAgIFwnc3BhY2lvdXNcJ1xuICAgPj4+IFwnd3d3LmV4YW1wbGUuY29tXCcuc3RyaXAoXCdjbW93ei5cJylcbiAgIFwnZXhhbXBsZVwnXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjIuMjogU3VwcG9ydCBmb3IgdGhlICpjaGFycyogYXJndW1lbnQuXG5cbnN0ci5zd2FwY2FzZSgpXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHVwcGVyY2FzZSBjaGFyYWN0ZXJzIGNvbnZlcnRlZCB0b1xuICAgbG93ZXJjYXNlIGFuZCB2aWNlIHZlcnNhLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLnRpdGxlKClcblxuICAgUmV0dXJuIGEgdGl0bGVjYXNlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcgd2hlcmUgd29yZHMgc3RhcnQgd2l0aCBhblxuICAgdXBwZXJjYXNlIGNoYXJhY3RlciBhbmQgdGhlIHJlbWFpbmluZyBjaGFyYWN0ZXJzIGFyZSBsb3dlcmNhc2UuXG5cbiAgIFRoZSBhbGdvcml0aG0gdXNlcyBhIHNpbXBsZSBsYW5ndWFnZS1pbmRlcGVuZGVudCBkZWZpbml0aW9uIG9mIGFcbiAgIHdvcmQgYXMgZ3JvdXBzIG9mIGNvbnNlY3V0aXZlIGxldHRlcnMuICBUaGUgZGVmaW5pdGlvbiB3b3JrcyBpblxuICAgbWFueSBjb250ZXh0cyBidXQgaXQgbWVhbnMgdGhhdCBhcG9zdHJvcGhlcyBpbiBjb250cmFjdGlvbnMgYW5kXG4gICBwb3NzZXNzaXZlcyBmb3JtIHdvcmQgYm91bmRhcmllcywgd2hpY2ggbWF5IG5vdCBiZSB0aGUgZGVzaXJlZFxuICAgcmVzdWx0OlxuXG4gICAgICA+Pj4gInRoZXlcJ3JlIGJpbGxcJ3MgZnJpZW5kcyBmcm9tIHRoZSBVSyIudGl0bGUoKVxuICAgICAgIlRoZXlcJ1JlIEJpbGxcJ1MgRnJpZW5kcyBGcm9tIFRoZSBVayJcblxuICAgQSB3b3JrYXJvdW5kIGZvciBhcG9zdHJvcGhlcyBjYW4gYmUgY29uc3RydWN0ZWQgdXNpbmcgcmVndWxhclxuICAgZXhwcmVzc2lvbnM6XG5cbiAgICAgID4+PiBpbXBvcnQgcmVcbiAgICAgID4+PiBkZWYgdGl0bGVjYXNlKHMpOlxuICAgICAgLi4uICAgICByZXR1cm4gcmUuc3ViKHIiW0EtWmEtel0rKFwnW0EtWmEtel0rKT8iLFxuICAgICAgLi4uICAgICAgICAgICAgICAgICAgIGxhbWJkYSBtbzogbW8uZ3JvdXAoMClbMF0udXBwZXIoKSArXG4gICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtby5ncm91cCgwKVsxOl0ubG93ZXIoKSxcbiAgICAgIC4uLiAgICAgICAgICAgICAgICAgICBzKVxuICAgICAgLi4uXG4gICAgICA+Pj4gdGl0bGVjYXNlKCJ0aGV5XCdyZSBiaWxsXCdzIGZyaWVuZHMuIilcbiAgICAgICJUaGV5XCdyZSBCaWxsXCdzIEZyaWVuZHMuIlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLnRyYW5zbGF0ZSh0YWJsZVssIGRlbGV0ZWNoYXJzXSlcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdoZXJlIGFsbCBjaGFyYWN0ZXJzIG9jY3VycmluZyBpbiB0aGVcbiAgIG9wdGlvbmFsIGFyZ3VtZW50ICpkZWxldGVjaGFycyogYXJlIHJlbW92ZWQsIGFuZCB0aGUgcmVtYWluaW5nXG4gICBjaGFyYWN0ZXJzIGhhdmUgYmVlbiBtYXBwZWQgdGhyb3VnaCB0aGUgZ2l2ZW4gdHJhbnNsYXRpb24gdGFibGUsXG4gICB3aGljaCBtdXN0IGJlIGEgc3RyaW5nIG9mIGxlbmd0aCAyNTYuXG5cbiAgIFlvdSBjYW4gdXNlIHRoZSBgYG1ha2V0cmFucygpYGAgaGVscGVyIGZ1bmN0aW9uIGluIHRoZSBgYHN0cmluZ2BgXG4gICBtb2R1bGUgdG8gY3JlYXRlIGEgdHJhbnNsYXRpb24gdGFibGUuIEZvciBzdHJpbmcgb2JqZWN0cywgc2V0IHRoZVxuICAgKnRhYmxlKiBhcmd1bWVudCB0byBgYE5vbmVgYCBmb3IgdHJhbnNsYXRpb25zIHRoYXQgb25seSBkZWxldGVcbiAgIGNoYXJhY3RlcnM6XG5cbiAgID4+PiBcJ3JlYWQgdGhpcyBzaG9ydCB0ZXh0XCcudHJhbnNsYXRlKE5vbmUsIFwnYWVpb3VcJylcbiAgIFwncmQgdGhzIHNocnQgdHh0XCdcblxuICAgTmV3IGluIHZlcnNpb24gMi42OiBTdXBwb3J0IGZvciBhIGBgTm9uZWBgICp0YWJsZSogYXJndW1lbnQuXG5cbiAgIEZvciBVbmljb2RlIG9iamVjdHMsIHRoZSBgYHRyYW5zbGF0ZSgpYGAgbWV0aG9kIGRvZXMgbm90IGFjY2VwdCB0aGVcbiAgIG9wdGlvbmFsICpkZWxldGVjaGFycyogYXJndW1lbnQuICBJbnN0ZWFkLCBpdCByZXR1cm5zIGEgY29weSBvZiB0aGVcbiAgICpzKiB3aGVyZSBhbGwgY2hhcmFjdGVycyBoYXZlIGJlZW4gbWFwcGVkIHRocm91Z2ggdGhlIGdpdmVuXG4gICB0cmFuc2xhdGlvbiB0YWJsZSB3aGljaCBtdXN0IGJlIGEgbWFwcGluZyBvZiBVbmljb2RlIG9yZGluYWxzIHRvXG4gICBVbmljb2RlIG9yZGluYWxzLCBVbmljb2RlIHN0cmluZ3Mgb3IgYGBOb25lYGAuIFVubWFwcGVkIGNoYXJhY3RlcnNcbiAgIGFyZSBsZWZ0IHVudG91Y2hlZC4gQ2hhcmFjdGVycyBtYXBwZWQgdG8gYGBOb25lYGAgYXJlIGRlbGV0ZWQuXG4gICBOb3RlLCBhIG1vcmUgZmxleGlibGUgYXBwcm9hY2ggaXMgdG8gY3JlYXRlIGEgY3VzdG9tIGNoYXJhY3RlclxuICAgbWFwcGluZyBjb2RlYyB1c2luZyB0aGUgYGBjb2RlY3NgYCBtb2R1bGUgKHNlZSBgYGVuY29kaW5ncy5jcDEyNTFgYFxuICAgZm9yIGFuIGV4YW1wbGUpLlxuXG5zdHIudXBwZXIoKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBhbGwgdGhlIGNhc2VkIGNoYXJhY3RlcnMgWzRdXG4gICBjb252ZXJ0ZWQgdG8gdXBwZXJjYXNlLiAgTm90ZSB0aGF0IGBgc3RyLnVwcGVyKCkuaXN1cHBlcigpYGAgbWlnaHRcbiAgIGJlIGBgRmFsc2VgYCBpZiBgYHNgYCBjb250YWlucyB1bmNhc2VkIGNoYXJhY3RlcnMgb3IgaWYgdGhlIFVuaWNvZGVcbiAgIGNhdGVnb3J5IG9mIHRoZSByZXN1bHRpbmcgY2hhcmFjdGVyKHMpIGlzIG5vdCAiTHUiIChMZXR0ZXIsXG4gICB1cHBlcmNhc2UpLCBidXQgZS5nLiAiTHQiIChMZXR0ZXIsIHRpdGxlY2FzZSkuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuemZpbGwod2lkdGgpXG5cbiAgIFJldHVybiB0aGUgbnVtZXJpYyBzdHJpbmcgbGVmdCBmaWxsZWQgd2l0aCB6ZXJvcyBpbiBhIHN0cmluZyBvZlxuICAgbGVuZ3RoICp3aWR0aCouICBBIHNpZ24gcHJlZml4IGlzIGhhbmRsZWQgY29ycmVjdGx5LiAgVGhlIG9yaWdpbmFsXG4gICBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYGBsZW4ocylgYC5cblxuICAgTmV3IGluIHZlcnNpb24gMi4yLjIuXG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgcHJlc2VudCBvbmx5IG9uIHVuaWNvZGUgb2JqZWN0czpcblxudW5pY29kZS5pc251bWVyaWMoKVxuXG4gICBSZXR1cm4gYGBUcnVlYGAgaWYgdGhlcmUgYXJlIG9ubHkgbnVtZXJpYyBjaGFyYWN0ZXJzIGluIFMsXG4gICBgYEZhbHNlYGAgb3RoZXJ3aXNlLiBOdW1lcmljIGNoYXJhY3RlcnMgaW5jbHVkZSBkaWdpdCBjaGFyYWN0ZXJzLFxuICAgYW5kIGFsbCBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSB0aGUgVW5pY29kZSBudW1lcmljIHZhbHVlIHByb3BlcnR5LFxuICAgZS5nLiBVKzIxNTUsIFZVTEdBUiBGUkFDVElPTiBPTkUgRklGVEguXG5cbnVuaWNvZGUuaXNkZWNpbWFsKClcblxuICAgUmV0dXJuIGBgVHJ1ZWBgIGlmIHRoZXJlIGFyZSBvbmx5IGRlY2ltYWwgY2hhcmFjdGVycyBpbiBTLFxuICAgYGBGYWxzZWBgIG90aGVyd2lzZS4gRGVjaW1hbCBjaGFyYWN0ZXJzIGluY2x1ZGUgZGlnaXQgY2hhcmFjdGVycyxcbiAgIGFuZCBhbGwgY2hhcmFjdGVycyB0aGF0IGNhbiBiZSB1c2VkIHRvIGZvcm0gZGVjaW1hbC1yYWRpeCBudW1iZXJzLFxuICAgZS5nLiBVKzA2NjAsIEFSQUJJQy1JTkRJQyBESUdJVCBaRVJPLlxuJywKKyAnc3RyaW5ncyc6ICdcblN0cmluZyBsaXRlcmFsc1xuKioqKioqKioqKioqKioqXG5cblN0cmluZyBsaXRlcmFscyBhcmUgZGVzY3JpYmVkIGJ5IHRoZSBmb2xsb3dpbmcgbGV4aWNhbCBkZWZpbml0aW9uczpcblxuICAgc3RyaW5nbGl0ZXJhbCAgIDo6PSBbc3RyaW5ncHJlZml4XShzaG9ydHN0cmluZyB8IGxvbmdzdHJpbmcpXG4gICBzdHJpbmdwcmVmaXggICAgOjo9ICJyIiB8ICJ1IiB8ICJ1ciIgfCAiUiIgfCAiVSIgfCAiVVIiIHwgIlVyIiB8ICJ1UiJcbiAgICAgICAgICAgICAgICAgICAgfCAiYiIgfCAiQiIgfCAiYnIiIHwgIkJyIiB8ICJiUiIgfCAiQlIiXG4gICBzaG9ydHN0cmluZyAgICAgOjo9ICJcJyIgc2hvcnRzdHJpbmdpdGVtKiAiXCciIHwgXCciXCcgc2hvcnRzdHJpbmdpdGVtKiBcJyJcJ1xuICAgbG9uZ3N0cmluZyAgICAgIDo6PSAiXCdcJ1wnIiBsb25nc3RyaW5naXRlbSogIlwnXCdcJyJcbiAgICAgICAgICAgICAgICAgIHwgXCciIiJcJyBsb25nc3RyaW5naXRlbSogXCciIiJcJ1xuICAgc2hvcnRzdHJpbmdpdGVtIDo6PSBzaG9ydHN0cmluZ2NoYXIgfCBlc2NhcGVzZXFcbiAgIGxvbmdzdHJpbmdpdGVtICA6Oj0gbG9uZ3N0cmluZ2NoYXIgfCBlc2NhcGVzZXFcbiAgIHNob3J0c3RyaW5nY2hhciA6Oj0gPGFueSBzb3VyY2UgY2hhcmFjdGVyIGV4Y2VwdCAiXFwiIG9yIG5ld2xpbmUgb3IgdGhlIHF1b3RlPlxuICAgbG9uZ3N0cmluZ2NoYXIgIDo6PSA8YW55IHNvdXJjZSBjaGFyYWN0ZXIgZXhjZXB0ICJcXCI+XG4gICBlc2NhcGVzZXEgICAgICAgOjo9ICJcXCIgPGFueSBBU0NJSSBjaGFyYWN0ZXI+XG5cbk9uZSBzeW50YWN0aWMgcmVzdHJpY3Rpb24gbm90IGluZGljYXRlZCBieSB0aGVzZSBwcm9kdWN0aW9ucyBpcyB0aGF0XG53aGl0ZXNwYWNlIGlzIG5vdCBhbGxvd2VkIGJldHdlZW4gdGhlIGBgc3RyaW5ncHJlZml4YGAgYW5kIHRoZSByZXN0IG9mXG50aGUgc3RyaW5nIGxpdGVyYWwuIFRoZSBzb3VyY2UgY2hhcmFjdGVyIHNldCBpcyBkZWZpbmVkIGJ5IHRoZVxuZW5jb2RpbmcgZGVjbGFyYXRpb247IGl0IGlzIEFTQ0lJIGlmIG5vIGVuY29kaW5nIGRlY2xhcmF0aW9uIGlzIGdpdmVuXG5pbiB0aGUgc291cmNlIGZpbGU7IHNlZSBzZWN0aW9uICpFbmNvZGluZyBkZWNsYXJhdGlvbnMqLlxuXG5JbiBwbGFpbiBFbmdsaXNoOiBTdHJpbmcgbGl0ZXJhbHMgY2FuIGJlIGVuY2xvc2VkIGluIG1hdGNoaW5nIHNpbmdsZVxucXVvdGVzIChgYFwnYGApIG9yIGRvdWJsZSBxdW90ZXMgKGBgImBgKS4gIFRoZXkgY2FuIGFsc28gYmUgZW5jbG9zZWQgaW5cbm1hdGNoaW5nIGdyb3VwcyBvZiB0aHJlZSBzaW5nbGUgb3IgZG91YmxlIHF1b3RlcyAodGhlc2UgYXJlIGdlbmVyYWxseVxucmVmZXJyZWQgdG8gYXMgKnRyaXBsZS1xdW90ZWQgc3RyaW5ncyopLiAgVGhlIGJhY2tzbGFzaCAoYGBcXGBgKVxuY2hhcmFjdGVyIGlzIHVzZWQgdG8gZXNjYXBlIGNoYXJhY3RlcnMgdGhhdCBvdGhlcndpc2UgaGF2ZSBhIHNwZWNpYWxcbm1lYW5pbmcsIHN1Y2ggYXMgbmV3bGluZSwgYmFja3NsYXNoIGl0c2VsZiwgb3IgdGhlIHF1b3RlIGNoYXJhY3Rlci5cblN0cmluZyBsaXRlcmFscyBtYXkgb3B0aW9uYWxseSBiZSBwcmVmaXhlZCB3aXRoIGEgbGV0dGVyIGBgXCdyXCdgYCBvclxuYGBcJ1JcJ2BgOyBzdWNoIHN0cmluZ3MgYXJlIGNhbGxlZCAqcmF3IHN0cmluZ3MqIGFuZCB1c2UgZGlmZmVyZW50IHJ1bGVzXG5mb3IgaW50ZXJwcmV0aW5nIGJhY2tzbGFzaCBlc2NhcGUgc2VxdWVuY2VzLiAgQSBwcmVmaXggb2YgYGBcJ3VcJ2BgIG9yXG5gYFwnVVwnYGAgbWFrZXMgdGhlIHN0cmluZyBhIFVuaWNvZGUgc3RyaW5nLiAgVW5pY29kZSBzdHJpbmdzIHVzZSB0aGVcblVuaWNvZGUgY2hhcmFjdGVyIHNldCBhcyBkZWZpbmVkIGJ5IHRoZSBVbmljb2RlIENvbnNvcnRpdW0gYW5kIElTT1xuMTA2NDYuICBTb21lIGFkZGl0aW9uYWwgZXNjYXBlIHNlcXVlbmNlcywgZGVzY3JpYmVkIGJlbG93LCBhcmVcbmF2YWlsYWJsZSBpbiBVbmljb2RlIHN0cmluZ3MuIEEgcHJlZml4IG9mIGBgXCdiXCdgYCBvciBgYFwnQlwnYGAgaXNcbmlnbm9yZWQgaW4gUHl0aG9uIDI7IGl0IGluZGljYXRlcyB0aGF0IHRoZSBsaXRlcmFsIHNob3VsZCBiZWNvbWUgYVxuYnl0ZXMgbGl0ZXJhbCBpbiBQeXRob24gMyAoZS5nLiB3aGVuIGNvZGUgaXMgYXV0b21hdGljYWxseSBjb252ZXJ0ZWRcbndpdGggMnRvMykuICBBIGBgXCd1XCdgYCBvciBgYFwnYlwnYGAgcHJlZml4IG1heSBiZSBmb2xsb3dlZCBieSBhbiBgYFwnclwnYGBcbnByZWZpeC5cblxuSW4gdHJpcGxlLXF1b3RlZCBzdHJpbmdzLCB1bmVzY2FwZWQgbmV3bGluZXMgYW5kIHF1b3RlcyBhcmUgYWxsb3dlZFxuKGFuZCBhcmUgcmV0YWluZWQpLCBleGNlcHQgdGhhdCB0aHJlZSB1bmVzY2FwZWQgcXVvdGVzIGluIGEgcm93XG50ZXJtaW5hdGUgdGhlIHN0cmluZy4gIChBICJxdW90ZSIgaXMgdGhlIGNoYXJhY3RlciB1c2VkIHRvIG9wZW4gdGhlXG5zdHJpbmcsIGkuZS4gZWl0aGVyIGBgXCdgYCBvciBgYCJgYC4pXG5cblVubGVzcyBhbiBgYFwnclwnYGAgb3IgYGBcJ1JcJ2BgIHByZWZpeCBpcyBwcmVzZW50LCBlc2NhcGUgc2VxdWVuY2VzIGluXG5zdHJpbmdzIGFyZSBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gcnVsZXMgc2ltaWxhciB0byB0aG9zZSB1c2VkIGJ5XG5TdGFuZGFyZCBDLiAgVGhlIHJlY29nbml6ZWQgZXNjYXBlIHNlcXVlbmNlcyBhcmU6XG5cbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgRXNjYXBlIFNlcXVlbmNlICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgIHxcbis9PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PStcbnwgYGBcXG5ld2xpbmVgYCAgICAgIHwgSWdub3JlZCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXFxcXGBgICAgICAgICAgICAgfCBCYWNrc2xhc2ggKGBgXFxgYCkgICAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXFxcJ2BgICAgICAgICAgICAgfCBTaW5nbGUgcXVvdGUgKGBgXCdgYCkgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXFwiYGAgICAgICAgICAgICB8IERvdWJsZSBxdW90ZSAoYGAiYGApICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFxcYWBgICAgICAgICAgICAgfCBBU0NJSSBCZWxsIChCRUwpICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcXGJgYCAgICAgICAgICAgIHwgQVNDSUkgQmFja3NwYWNlIChCUykgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXFxmYGAgICAgICAgICAgICB8IEFTQ0lJIEZvcm1mZWVkIChGRikgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFxcbmBgICAgICAgICAgICAgfCBBU0NJSSBMaW5lZmVlZCAoTEYpICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcXE57bmFtZX1gYCAgICAgIHwgQ2hhcmFjdGVyIG5hbWVkICpuYW1lKiBpbiB0aGUgICAgIHwgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgIHwgVW5pY29kZSBkYXRhYmFzZSAoVW5pY29kZSBvbmx5KSAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXFxyYGAgICAgICAgICAgICB8IEFTQ0lJIENhcnJpYWdlIFJldHVybiAoQ1IpICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFxcdGBgICAgICAgICAgICAgfCBBU0NJSSBIb3Jpem9udGFsIFRhYiAoVEFCKSAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcXHV4eHh4YGAgICAgICAgIHwgQ2hhcmFjdGVyIHdpdGggMTYtYml0IGhleCB2YWx1ZSAgIHwgKDEpICAgICB8XG58ICAgICAgICAgICAgICAgICAgIHwgKnh4eHgqIChVbmljb2RlIG9ubHkpICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXFxVeHh4eHh4eHhgYCAgICB8IENoYXJhY3RlciB3aXRoIDMyLWJpdCBoZXggdmFsdWUgICB8ICgyKSAgICAgfFxufCAgICAgICAgICAgICAgICAgICB8ICp4eHh4eHh4eCogKFVuaWNvZGUgb25seSkgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFxcdmBgICAgICAgICAgICAgfCBBU0NJSSBWZXJ0aWNhbCBUYWIgKFZUKSAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcXG9vb2BgICAgICAgICAgIHwgQ2hhcmFjdGVyIHdpdGggb2N0YWwgdmFsdWUgKm9vbyogIHwgKDMsNSkgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXFx4aGhgYCAgICAgICAgICB8IENoYXJhY3RlciB3aXRoIGhleCB2YWx1ZSAqaGgqICAgICB8ICg0LDUpICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuXG5Ob3RlczpcblxuMS4gSW5kaXZpZHVhbCBjb2RlIHVuaXRzIHdoaWNoIGZvcm0gcGFydHMgb2YgYSBzdXJyb2dhdGUgcGFpciBjYW4gYmVcbiAgIGVuY29kZWQgdXNpbmcgdGhpcyBlc2NhcGUgc2VxdWVuY2UuXG5cbjIuIEFueSBVbmljb2RlIGNoYXJhY3RlciBjYW4gYmUgZW5jb2RlZCB0aGlzIHdheSwgYnV0IGNoYXJhY3RlcnNcbiAgIG91dHNpZGUgdGhlIEJhc2ljIE11bHRpbGluZ3VhbCBQbGFuZSAoQk1QKSB3aWxsIGJlIGVuY29kZWQgdXNpbmcgYVxuICAgc3Vycm9nYXRlIHBhaXIgaWYgUHl0aG9uIGlzIGNvbXBpbGVkIHRvIHVzZSAxNi1iaXQgY29kZSB1bml0cyAodGhlXG4gICBkZWZhdWx0KS5cblxuMy4gQXMgaW4gU3RhbmRhcmQgQywgdXAgdG8gdGhyZWUgb2N0YWwgZGlnaXRzIGFyZSBhY2NlcHRlZC5cblxuNC4gVW5saWtlIGluIFN0YW5kYXJkIEMsIGV4YWN0bHkgdHdvIGhleCBkaWdpdHMgYXJlIHJlcXVpcmVkLlxuXG41LiBJbiBhIHN0cmluZyBsaXRlcmFsLCBoZXhhZGVjaW1hbCBhbmQgb2N0YWwgZXNjYXBlcyBkZW5vdGUgdGhlIGJ5dGVcbiAgIHdpdGggdGhlIGdpdmVuIHZhbHVlOyBpdCBpcyBub3QgbmVjZXNzYXJ5IHRoYXQgdGhlIGJ5dGUgZW5jb2RlcyBhXG4gICBjaGFyYWN0ZXIgaW4gdGhlIHNvdXJjZSBjaGFyYWN0ZXIgc2V0LiBJbiBhIFVuaWNvZGUgbGl0ZXJhbCwgdGhlc2VcbiAgIGVzY2FwZXMgZGVub3RlIGEgVW5pY29kZSBjaGFyYWN0ZXIgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuXG5cblVubGlrZSBTdGFuZGFyZCBDLCBhbGwgdW5yZWNvZ25pemVkIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIGxlZnQgaW4gdGhlXG5zdHJpbmcgdW5jaGFuZ2VkLCBpLmUuLCAqdGhlIGJhY2tzbGFzaCBpcyBsZWZ0IGluIHRoZSBzdHJpbmcqLiAgKFRoaXNcbmJlaGF2aW9yIGlzIHVzZWZ1bCB3aGVuIGRlYnVnZ2luZzogaWYgYW4gZXNjYXBlIHNlcXVlbmNlIGlzIG1pc3R5cGVkLFxudGhlIHJlc3VsdGluZyBvdXRwdXQgaXMgbW9yZSBlYXNpbHkgcmVjb2duaXplZCBhcyBicm9rZW4uKSAgSXQgaXMgYWxzb1xuaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgZXNjYXBlIHNlcXVlbmNlcyBtYXJrZWQgYXMgIihVbmljb2RlIG9ubHkpIlxuaW4gdGhlIHRhYmxlIGFib3ZlIGZhbGwgaW50byB0aGUgY2F0ZWdvcnkgb2YgdW5yZWNvZ25pemVkIGVzY2FwZXMgZm9yXG5ub24tVW5pY29kZSBzdHJpbmcgbGl0ZXJhbHMuXG5cbldoZW4gYW4gYGBcJ3JcJ2BgIG9yIGBgXCdSXCdgYCBwcmVmaXggaXMgcHJlc2VudCwgYSBjaGFyYWN0ZXIgZm9sbG93aW5nIGFcbmJhY2tzbGFzaCBpcyBpbmNsdWRlZCBpbiB0aGUgc3RyaW5nIHdpdGhvdXQgY2hhbmdlLCBhbmQgKmFsbFxuYmFja3NsYXNoZXMgYXJlIGxlZnQgaW4gdGhlIHN0cmluZyouICBGb3IgZXhhbXBsZSwgdGhlIHN0cmluZyBsaXRlcmFsXG5gYHIiXFxuImBgIGNvbnNpc3RzIG9mIHR3byBjaGFyYWN0ZXJzOiBhIGJhY2tzbGFzaCBhbmQgYSBsb3dlcmNhc2VcbmBgXCduXCdgYC4gIFN0cmluZyBxdW90ZXMgY2FuIGJlIGVzY2FwZWQgd2l0aCBhIGJhY2tzbGFzaCwgYnV0IHRoZVxuYmFja3NsYXNoIHJlbWFpbnMgaW4gdGhlIHN0cmluZzsgZm9yIGV4YW1wbGUsIGBgciJcXCIiYGAgaXMgYSB2YWxpZFxuc3RyaW5nIGxpdGVyYWwgY29uc2lzdGluZyBvZiB0d28gY2hhcmFjdGVyczogYSBiYWNrc2xhc2ggYW5kIGEgZG91YmxlXG5xdW90ZTsgYGByIlxcImBgIGlzIG5vdCBhIHZhbGlkIHN0cmluZyBsaXRlcmFsIChldmVuIGEgcmF3IHN0cmluZ1xuY2Fubm90IGVuZCBpbiBhbiBvZGQgbnVtYmVyIG9mIGJhY2tzbGFzaGVzKS4gIFNwZWNpZmljYWxseSwgKmEgcmF3XG5zdHJpbmcgY2Fubm90IGVuZCBpbiBhIHNpbmdsZSBiYWNrc2xhc2gqIChzaW5jZSB0aGUgYmFja3NsYXNoIHdvdWxkXG5lc2NhcGUgdGhlIGZvbGxvd2luZyBxdW90ZSBjaGFyYWN0ZXIpLiAgTm90ZSBhbHNvIHRoYXQgYSBzaW5nbGVcbmJhY2tzbGFzaCBmb2xsb3dlZCBieSBhIG5ld2xpbmUgaXMgaW50ZXJwcmV0ZWQgYXMgdGhvc2UgdHdvIGNoYXJhY3RlcnNcbmFzIHBhcnQgb2YgdGhlIHN0cmluZywgKm5vdCogYXMgYSBsaW5lIGNvbnRpbnVhdGlvbi5cblxuV2hlbiBhbiBgYFwnclwnYGAgb3IgYGBcJ1JcJ2BgIHByZWZpeCBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYVxuYGBcJ3VcJ2BgIG9yIGBgXCdVXCdgYCBwcmVmaXgsIHRoZW4gdGhlIGBgXFx1WFhYWGBgIGFuZCBgYFxcVVhYWFhYWFhYYGBcbmVzY2FwZSBzZXF1ZW5jZXMgYXJlIHByb2Nlc3NlZCB3aGlsZSAgKmFsbCBvdGhlciBiYWNrc2xhc2hlcyBhcmUgbGVmdFxuaW4gdGhlIHN0cmluZyouIEZvciBleGFtcGxlLCB0aGUgc3RyaW5nIGxpdGVyYWwgYGB1ciJcXHUwMDYyXFxuImBgXG5jb25zaXN0cyBvZiB0aHJlZSBVbmljb2RlIGNoYXJhY3RlcnM6IFwnTEFUSU4gU01BTEwgTEVUVEVSIEJcJywgXCdSRVZFUlNFXG5TT0xJRFVTXCcsIGFuZCBcJ0xBVElOIFNNQUxMIExFVFRFUiBOXCcuIEJhY2tzbGFzaGVzIGNhbiBiZSBlc2NhcGVkIHdpdGhcbmEgcHJlY2VkaW5nIGJhY2tzbGFzaDsgaG93ZXZlciwgYm90aCByZW1haW4gaW4gdGhlIHN0cmluZy4gIEFzIGFcbnJlc3VsdCwgYGBcXHVYWFhYYGAgZXNjYXBlIHNlcXVlbmNlcyBhcmUgb25seSByZWNvZ25pemVkIHdoZW4gdGhlcmUgYXJlXG5hbiBvZGQgbnVtYmVyIG9mIGJhY2tzbGFzaGVzLlxuJywKKyAnc3Vic2NyaXB0aW9ucyc6ICdcblN1YnNjcmlwdGlvbnNcbioqKioqKioqKioqKipcblxuQSBzdWJzY3JpcHRpb24gc2VsZWN0cyBhbiBpdGVtIG9mIGEgc2VxdWVuY2UgKHN0cmluZywgdHVwbGUgb3IgbGlzdClcbm9yIG1hcHBpbmcgKGRpY3Rpb25hcnkpIG9iamVjdDpcblxuICAgc3Vic2NyaXB0aW9uIDo6PSBwcmltYXJ5ICJbIiBleHByZXNzaW9uX2xpc3QgIl0iXG5cblRoZSBwcmltYXJ5IG11c3QgZXZhbHVhdGUgdG8gYW4gb2JqZWN0IG9mIGEgc2VxdWVuY2Ugb3IgbWFwcGluZyB0eXBlLlxuXG5JZiB0aGUgcHJpbWFyeSBpcyBhIG1hcHBpbmcsIHRoZSBleHByZXNzaW9uIGxpc3QgbXVzdCBldmFsdWF0ZSB0byBhblxub2JqZWN0IHdob3NlIHZhbHVlIGlzIG9uZSBvZiB0aGUga2V5cyBvZiB0aGUgbWFwcGluZywgYW5kIHRoZVxuc3Vic2NyaXB0aW9uIHNlbGVjdHMgdGhlIHZhbHVlIGluIHRoZSBtYXBwaW5nIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhhdFxua2V5LiAgKFRoZSBleHByZXNzaW9uIGxpc3QgaXMgYSB0dXBsZSBleGNlcHQgaWYgaXQgaGFzIGV4YWN0bHkgb25lXG5pdGVtLilcblxuSWYgdGhlIHByaW1hcnkgaXMgYSBzZXF1ZW5jZSwgdGhlIGV4cHJlc3Npb24gKGxpc3QpIG11c3QgZXZhbHVhdGUgdG8gYVxucGxhaW4gaW50ZWdlci4gIElmIHRoaXMgdmFsdWUgaXMgbmVnYXRpdmUsIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlXG5pcyBhZGRlZCB0byBpdCAoc28gdGhhdCwgZS5nLiwgYGB4Wy0xXWBgIHNlbGVjdHMgdGhlIGxhc3QgaXRlbSBvZlxuYGB4YGAuKSAgVGhlIHJlc3VsdGluZyB2YWx1ZSBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciBsZXNzIHRoYW5cbnRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHNlcXVlbmNlLCBhbmQgdGhlIHN1YnNjcmlwdGlvbiBzZWxlY3RzIHRoZVxuaXRlbSB3aG9zZSBpbmRleCBpcyB0aGF0IHZhbHVlIChjb3VudGluZyBmcm9tIHplcm8pLlxuXG5BIHN0cmluZ1wncyBpdGVtcyBhcmUgY2hhcmFjdGVycy4gIEEgY2hhcmFjdGVyIGlzIG5vdCBhIHNlcGFyYXRlIGRhdGFcbnR5cGUgYnV0IGEgc3RyaW5nIG9mIGV4YWN0bHkgb25lIGNoYXJhY3Rlci5cbicsCisgJ3RydXRoJzogIlxuVHJ1dGggVmFsdWUgVGVzdGluZ1xuKioqKioqKioqKioqKioqKioqKlxuXG5Bbnkgb2JqZWN0IGNhbiBiZSB0ZXN0ZWQgZm9yIHRydXRoIHZhbHVlLCBmb3IgdXNlIGluIGFuIGBgaWZgYCBvclxuYGB3aGlsZWBgIGNvbmRpdGlvbiBvciBhcyBvcGVyYW5kIG9mIHRoZSBCb29sZWFuIG9wZXJhdGlvbnMgYmVsb3cuIFRoZVxuZm9sbG93aW5nIHZhbHVlcyBhcmUgY29uc2lkZXJlZCBmYWxzZTpcblxuKiBgYE5vbmVgYFxuXG4qIGBgRmFsc2VgYFxuXG4qIHplcm8gb2YgYW55IG51bWVyaWMgdHlwZSwgZm9yIGV4YW1wbGUsIGBgMGBgLCBgYDBMYGAsIGBgMC4wYGAsXG4gIGBgMGpgYC5cblxuKiBhbnkgZW1wdHkgc2VxdWVuY2UsIGZvciBleGFtcGxlLCBgYCcnYGAsIGBgKClgYCwgYGBbXWBgLlxuXG4qIGFueSBlbXB0eSBtYXBwaW5nLCBmb3IgZXhhbXBsZSwgYGB7fWBgLlxuXG4qIGluc3RhbmNlcyBvZiB1c2VyLWRlZmluZWQgY2xhc3NlcywgaWYgdGhlIGNsYXNzIGRlZmluZXMgYVxuICBgYF9fbm9uemVyb19fKClgYCBvciBgYF9fbGVuX18oKWBgIG1ldGhvZCwgd2hlbiB0aGF0IG1ldGhvZCByZXR1cm5zXG4gIHRoZSBpbnRlZ2VyIHplcm8gb3IgYGBib29sYGAgdmFsdWUgYGBGYWxzZWBgLiBbMV1cblxuQWxsIG90aGVyIHZhbHVlcyBhcmUgY29uc2lkZXJlZCB0cnVlIC0tLSBzbyBvYmplY3RzIG9mIG1hbnkgdHlwZXMgYXJlXG5hbHdheXMgdHJ1ZS5cblxuT3BlcmF0aW9ucyBhbmQgYnVpbHQtaW4gZnVuY3Rpb25zIHRoYXQgaGF2ZSBhIEJvb2xlYW4gcmVzdWx0IGFsd2F5c1xucmV0dXJuIGBgMGBgIG9yIGBgRmFsc2VgYCBmb3IgZmFsc2UgYW5kIGBgMWBgIG9yIGBgVHJ1ZWBgIGZvciB0cnVlLFxudW5sZXNzIG90aGVyd2lzZSBzdGF0ZWQuIChJbXBvcnRhbnQgZXhjZXB0aW9uOiB0aGUgQm9vbGVhbiBvcGVyYXRpb25zXG5gYG9yYGAgYW5kIGBgYW5kYGAgYWx3YXlzIHJldHVybiBvbmUgb2YgdGhlaXIgb3BlcmFuZHMuKVxuIiwKKyAndHJ5JzogJ1xuVGhlIGBgdHJ5YGAgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKipcblxuVGhlIGBgdHJ5YGAgc3RhdGVtZW50IHNwZWNpZmllcyBleGNlcHRpb24gaGFuZGxlcnMgYW5kL29yIGNsZWFudXAgY29kZVxuZm9yIGEgZ3JvdXAgb2Ygc3RhdGVtZW50czpcblxuICAgdHJ5X3N0bXQgIDo6PSB0cnkxX3N0bXQgfCB0cnkyX3N0bXRcbiAgIHRyeTFfc3RtdCA6Oj0gInRyeSIgIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAgICgiZXhjZXB0IiBbZXhwcmVzc2lvbiBbKCJhcyIgfCAiLCIpIHRhcmdldF1dICI6IiBzdWl0ZSkrXG4gICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuICAgICAgICAgICAgICAgICBbImZpbmFsbHkiICI6IiBzdWl0ZV1cbiAgIHRyeTJfc3RtdCA6Oj0gInRyeSIgIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAgICJmaW5hbGx5IiAiOiIgc3VpdGVcblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNTogSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgUHl0aG9uLFxuYGB0cnlgYC4uLmBgZXhjZXB0YGAuLi5gYGZpbmFsbHlgYCBkaWQgbm90IHdvcmsuIGBgdHJ5YGAuLi5gYGV4Y2VwdGBgXG5oYWQgdG8gYmUgbmVzdGVkIGluIGBgdHJ5YGAuLi5gYGZpbmFsbHlgYC5cblxuVGhlIGBgZXhjZXB0YGAgY2xhdXNlKHMpIHNwZWNpZnkgb25lIG9yIG1vcmUgZXhjZXB0aW9uIGhhbmRsZXJzLiBXaGVuXG5ubyBleGNlcHRpb24gb2NjdXJzIGluIHRoZSBgYHRyeWBgIGNsYXVzZSwgbm8gZXhjZXB0aW9uIGhhbmRsZXIgaXNcbmV4ZWN1dGVkLiBXaGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlIGBgdHJ5YGAgc3VpdGUsIGEgc2VhcmNoIGZvclxuYW4gZXhjZXB0aW9uIGhhbmRsZXIgaXMgc3RhcnRlZC4gIFRoaXMgc2VhcmNoIGluc3BlY3RzIHRoZSBleGNlcHRcbmNsYXVzZXMgaW4gdHVybiB1bnRpbCBvbmUgaXMgZm91bmQgdGhhdCBtYXRjaGVzIHRoZSBleGNlcHRpb24uICBBblxuZXhwcmVzc2lvbi1sZXNzIGV4Y2VwdCBjbGF1c2UsIGlmIHByZXNlbnQsIG11c3QgYmUgbGFzdDsgaXQgbWF0Y2hlc1xuYW55IGV4Y2VwdGlvbi4gIEZvciBhbiBleGNlcHQgY2xhdXNlIHdpdGggYW4gZXhwcmVzc2lvbiwgdGhhdFxuZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQsIGFuZCB0aGUgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiBpZiB0aGVcbnJlc3VsdGluZyBvYmplY3QgaXMgImNvbXBhdGlibGUiIHdpdGggdGhlIGV4Y2VwdGlvbi4gIEFuIG9iamVjdCBpc1xuY29tcGF0aWJsZSB3aXRoIGFuIGV4Y2VwdGlvbiBpZiBpdCBpcyB0aGUgY2xhc3Mgb3IgYSBiYXNlIGNsYXNzIG9mIHRoZVxuZXhjZXB0aW9uIG9iamVjdCwgb3IgYSB0dXBsZSBjb250YWluaW5nIGFuIGl0ZW0gY29tcGF0aWJsZSB3aXRoIHRoZVxuZXhjZXB0aW9uLlxuXG5JZiBubyBleGNlcHQgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiwgdGhlIHNlYXJjaCBmb3IgYW4gZXhjZXB0aW9uXG5oYW5kbGVyIGNvbnRpbnVlcyBpbiB0aGUgc3Vycm91bmRpbmcgY29kZSBhbmQgb24gdGhlIGludm9jYXRpb24gc3RhY2suXG5bMV1cblxuSWYgdGhlIGV2YWx1YXRpb24gb2YgYW4gZXhwcmVzc2lvbiBpbiB0aGUgaGVhZGVyIG9mIGFuIGV4Y2VwdCBjbGF1c2VcbnJhaXNlcyBhbiBleGNlcHRpb24sIHRoZSBvcmlnaW5hbCBzZWFyY2ggZm9yIGEgaGFuZGxlciBpcyBjYW5jZWxlZCBhbmRcbmEgc2VhcmNoIHN0YXJ0cyBmb3IgdGhlIG5ldyBleGNlcHRpb24gaW4gdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIG9uXG50aGUgY2FsbCBzdGFjayAoaXQgaXMgdHJlYXRlZCBhcyBpZiB0aGUgZW50aXJlIGBgdHJ5YGAgc3RhdGVtZW50XG5yYWlzZWQgdGhlIGV4Y2VwdGlvbikuXG5cbldoZW4gYSBtYXRjaGluZyBleGNlcHQgY2xhdXNlIGlzIGZvdW5kLCB0aGUgZXhjZXB0aW9uIGlzIGFzc2lnbmVkIHRvXG50aGUgdGFyZ2V0IHNwZWNpZmllZCBpbiB0aGF0IGV4Y2VwdCBjbGF1c2UsIGlmIHByZXNlbnQsIGFuZCB0aGUgZXhjZXB0XG5jbGF1c2VcJ3Mgc3VpdGUgaXMgZXhlY3V0ZWQuICBBbGwgZXhjZXB0IGNsYXVzZXMgbXVzdCBoYXZlIGFuXG5leGVjdXRhYmxlIGJsb2NrLiAgV2hlbiB0aGUgZW5kIG9mIHRoaXMgYmxvY2sgaXMgcmVhY2hlZCwgZXhlY3V0aW9uXG5jb250aW51ZXMgbm9ybWFsbHkgYWZ0ZXIgdGhlIGVudGlyZSB0cnkgc3RhdGVtZW50LiAgKFRoaXMgbWVhbnMgdGhhdFxuaWYgdHdvIG5lc3RlZCBoYW5kbGVycyBleGlzdCBmb3IgdGhlIHNhbWUgZXhjZXB0aW9uLCBhbmQgdGhlIGV4Y2VwdGlvblxub2NjdXJzIGluIHRoZSB0cnkgY2xhdXNlIG9mIHRoZSBpbm5lciBoYW5kbGVyLCB0aGUgb3V0ZXIgaGFuZGxlciB3aWxsXG5ub3QgaGFuZGxlIHRoZSBleGNlcHRpb24uKVxuXG5CZWZvcmUgYW4gZXhjZXB0IGNsYXVzZVwncyBzdWl0ZSBpcyBleGVjdXRlZCwgZGV0YWlscyBhYm91dCB0aGVcbmV4Y2VwdGlvbiBhcmUgYXNzaWduZWQgdG8gdGhyZWUgdmFyaWFibGVzIGluIHRoZSBgYHN5c2BgIG1vZHVsZTpcbmBgc3lzLmV4Y190eXBlYGAgcmVjZWl2ZXMgdGhlIG9iamVjdCBpZGVudGlmeWluZyB0aGUgZXhjZXB0aW9uO1xuYGBzeXMuZXhjX3ZhbHVlYGAgcmVjZWl2ZXMgdGhlIGV4Y2VwdGlvblwncyBwYXJhbWV0ZXI7XG5gYHN5cy5leGNfdHJhY2ViYWNrYGAgcmVjZWl2ZXMgYSB0cmFjZWJhY2sgb2JqZWN0IChzZWUgc2VjdGlvbiAqVGhlXG5zdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSopIGlkZW50aWZ5aW5nIHRoZSBwb2ludCBpbiB0aGUgcHJvZ3JhbSB3aGVyZVxudGhlIGV4Y2VwdGlvbiBvY2N1cnJlZC4gVGhlc2UgZGV0YWlscyBhcmUgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGVcbmBgc3lzLmV4Y19pbmZvKClgYCBmdW5jdGlvbiwgd2hpY2ggcmV0dXJucyBhIHR1cGxlIGBgKGV4Y190eXBlLFxuZXhjX3ZhbHVlLCBleGNfdHJhY2ViYWNrKWBgLiAgVXNlIG9mIHRoZSBjb3JyZXNwb25kaW5nIHZhcmlhYmxlcyBpc1xuZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB0aGlzIGZ1bmN0aW9uLCBzaW5jZSB0aGVpciB1c2UgaXMgdW5zYWZlIGluIGFcbnRocmVhZGVkIHByb2dyYW0uICBBcyBvZiBQeXRob24gMS41LCB0aGUgdmFyaWFibGVzIGFyZSByZXN0b3JlZCB0b1xudGhlaXIgcHJldmlvdXMgdmFsdWVzIChiZWZvcmUgdGhlIGNhbGwpIHdoZW4gcmV0dXJuaW5nIGZyb20gYSBmdW5jdGlvblxudGhhdCBoYW5kbGVkIGFuIGV4Y2VwdGlvbi5cblxuVGhlIG9wdGlvbmFsIGBgZWxzZWBgIGNsYXVzZSBpcyBleGVjdXRlZCBpZiBhbmQgd2hlbiBjb250cm9sIGZsb3dzIG9mZlxudGhlIGVuZCBvZiB0aGUgYGB0cnlgYCBjbGF1c2UuIFsyXSBFeGNlcHRpb25zIGluIHRoZSBgYGVsc2VgYCBjbGF1c2VcbmFyZSBub3QgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nIGBgZXhjZXB0YGAgY2xhdXNlcy5cblxuSWYgYGBmaW5hbGx5YGAgaXMgcHJlc2VudCwgaXQgc3BlY2lmaWVzIGEgXCdjbGVhbnVwXCcgaGFuZGxlci4gIFRoZVxuYGB0cnlgYCBjbGF1c2UgaXMgZXhlY3V0ZWQsIGluY2x1ZGluZyBhbnkgYGBleGNlcHRgYCBhbmQgYGBlbHNlYGBcbmNsYXVzZXMuICBJZiBhbiBleGNlcHRpb24gb2NjdXJzIGluIGFueSBvZiB0aGUgY2xhdXNlcyBhbmQgaXMgbm90XG5oYW5kbGVkLCB0aGUgZXhjZXB0aW9uIGlzIHRlbXBvcmFyaWx5IHNhdmVkLiBUaGUgYGBmaW5hbGx5YGAgY2xhdXNlIGlzXG5leGVjdXRlZC4gIElmIHRoZXJlIGlzIGEgc2F2ZWQgZXhjZXB0aW9uLCBpdCBpcyByZS1yYWlzZWQgYXQgdGhlIGVuZFxub2YgdGhlIGBgZmluYWxseWBgIGNsYXVzZS4gSWYgdGhlIGBgZmluYWxseWBgIGNsYXVzZSByYWlzZXMgYW5vdGhlclxuZXhjZXB0aW9uIG9yIGV4ZWN1dGVzIGEgYGByZXR1cm5gYCBvciBgYGJyZWFrYGAgc3RhdGVtZW50LCB0aGUgc2F2ZWRcbmV4Y2VwdGlvbiBpcyBkaXNjYXJkZWQ6XG5cbiAgID4+PiBkZWYgZigpOlxuICAgLi4uICAgICB0cnk6XG4gICAuLi4gICAgICAgICAxLzBcbiAgIC4uLiAgICAgZmluYWxseTpcbiAgIC4uLiAgICAgICAgIHJldHVybiA0MlxuICAgLi4uXG4gICA+Pj4gZigpXG4gICA0MlxuXG5UaGUgZXhjZXB0aW9uIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgdG8gdGhlIHByb2dyYW0gZHVyaW5nXG5leGVjdXRpb24gb2YgdGhlIGBgZmluYWxseWBgIGNsYXVzZS5cblxuV2hlbiBhIGBgcmV0dXJuYGAsIGBgYnJlYWtgYCBvciBgYGNvbnRpbnVlYGAgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIGluXG50aGUgYGB0cnlgYCBzdWl0ZSBvZiBhIGBgdHJ5YGAuLi5gYGZpbmFsbHlgYCBzdGF0ZW1lbnQsIHRoZVxuYGBmaW5hbGx5YGAgY2xhdXNlIGlzIGFsc28gZXhlY3V0ZWQgXCdvbiB0aGUgd2F5IG91dC5cJyBBIGBgY29udGludWVgYFxuc3RhdGVtZW50IGlzIGlsbGVnYWwgaW4gdGhlIGBgZmluYWxseWBgIGNsYXVzZS4gKFRoZSByZWFzb24gaXMgYVxucHJvYmxlbSB3aXRoIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIC0tLSB0aGlzIHJlc3RyaWN0aW9uIG1heSBiZVxubGlmdGVkIGluIHRoZSBmdXR1cmUpLlxuXG5UaGUgcmV0dXJuIHZhbHVlIG9mIGEgZnVuY3Rpb24gaXMgZGV0ZXJtaW5lZCBieSB0aGUgbGFzdCBgYHJldHVybmBgXG5zdGF0ZW1lbnQgZXhlY3V0ZWQuICBTaW5jZSB0aGUgYGBmaW5hbGx5YGAgY2xhdXNlIGFsd2F5cyBleGVjdXRlcywgYVxuYGByZXR1cm5gYCBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGBgZmluYWxseWBgIGNsYXVzZSB3aWxsIGFsd2F5cyBiZVxudGhlIGxhc3Qgb25lIGV4ZWN1dGVkOlxuXG4gICA+Pj4gZGVmIGZvbygpOlxuICAgLi4uICAgICB0cnk6XG4gICAuLi4gICAgICAgICByZXR1cm4gXCd0cnlcJ1xuICAgLi4uICAgICBmaW5hbGx5OlxuICAgLi4uICAgICAgICAgcmV0dXJuIFwnZmluYWxseVwnXG4gICAuLi5cbiAgID4+PiBmb28oKVxuICAgXCdmaW5hbGx5XCdcblxuQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBleGNlcHRpb25zIGNhbiBiZSBmb3VuZCBpbiBzZWN0aW9uXG4qRXhjZXB0aW9ucyosIGFuZCBpbmZvcm1hdGlvbiBvbiB1c2luZyB0aGUgYGByYWlzZWBgIHN0YXRlbWVudCB0b1xuZ2VuZXJhdGUgZXhjZXB0aW9ucyBtYXkgYmUgZm91bmQgaW4gc2VjdGlvbiAqVGhlIHJhaXNlIHN0YXRlbWVudCouXG4nLAorICd0eXBlcyc6ICdcblRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeVxuKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbkJlbG93IGlzIGEgbGlzdCBvZiB0aGUgdHlwZXMgdGhhdCBhcmUgYnVpbHQgaW50byBQeXRob24uICBFeHRlbnNpb25cbm1vZHVsZXMgKHdyaXR0ZW4gaW4gQywgSmF2YSwgb3Igb3RoZXIgbGFuZ3VhZ2VzLCBkZXBlbmRpbmcgb24gdGhlXG5pbXBsZW1lbnRhdGlvbikgY2FuIGRlZmluZSBhZGRpdGlvbmFsIHR5cGVzLiAgRnV0dXJlIHZlcnNpb25zIG9mXG5QeXRob24gbWF5IGFkZCB0eXBlcyB0byB0aGUgdHlwZSBoaWVyYXJjaHkgKGUuZy4sIHJhdGlvbmFsIG51bWJlcnMsXG5lZmZpY2llbnRseSBzdG9yZWQgYXJyYXlzIG9mIGludGVnZXJzLCBldGMuKS5cblxuU29tZSBvZiB0aGUgdHlwZSBkZXNjcmlwdGlvbnMgYmVsb3cgY29udGFpbiBhIHBhcmFncmFwaCBsaXN0aW5nXG5cJ3NwZWNpYWwgYXR0cmlidXRlcy5cJyAgVGhlc2UgYXJlIGF0dHJpYnV0ZXMgdGhhdCBwcm92aWRlIGFjY2VzcyB0byB0aGVcbmltcGxlbWVudGF0aW9uIGFuZCBhcmUgbm90IGludGVuZGVkIGZvciBnZW5lcmFsIHVzZS4gIFRoZWlyIGRlZmluaXRpb25cbm1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS5cblxuTm9uZVxuICAgVGhpcyB0eXBlIGhhcyBhIHNpbmdsZSB2YWx1ZS4gIFRoZXJlIGlzIGEgc2luZ2xlIG9iamVjdCB3aXRoIHRoaXNcbiAgIHZhbHVlLiBUaGlzIG9iamVjdCBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBidWlsdC1pbiBuYW1lIGBgTm9uZWBgLlxuICAgSXQgaXMgdXNlZCB0byBzaWduaWZ5IHRoZSBhYnNlbmNlIG9mIGEgdmFsdWUgaW4gbWFueSBzaXR1YXRpb25zLFxuICAgZS5nLiwgaXQgaXMgcmV0dXJuZWQgZnJvbSBmdW5jdGlvbnMgdGhhdCBkb25cJ3QgZXhwbGljaXRseSByZXR1cm5cbiAgIGFueXRoaW5nLiBJdHMgdHJ1dGggdmFsdWUgaXMgZmFsc2UuXG5cbk5vdEltcGxlbWVudGVkXG4gICBUaGlzIHR5cGUgaGFzIGEgc2luZ2xlIHZhbHVlLiAgVGhlcmUgaXMgYSBzaW5nbGUgb2JqZWN0IHdpdGggdGhpc1xuICAgdmFsdWUuIFRoaXMgb2JqZWN0IGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGJ1aWx0LWluIG5hbWVcbiAgIGBgTm90SW1wbGVtZW50ZWRgYC4gTnVtZXJpYyBtZXRob2RzIGFuZCByaWNoIGNvbXBhcmlzb24gbWV0aG9kcyBtYXlcbiAgIHJldHVybiB0aGlzIHZhbHVlIGlmIHRoZXkgZG8gbm90IGltcGxlbWVudCB0aGUgb3BlcmF0aW9uIGZvciB0aGVcbiAgIG9wZXJhbmRzIHByb3ZpZGVkLiAgKFRoZSBpbnRlcnByZXRlciB3aWxsIHRoZW4gdHJ5IHRoZSByZWZsZWN0ZWRcbiAgIG9wZXJhdGlvbiwgb3Igc29tZSBvdGhlciBmYWxsYmFjaywgZGVwZW5kaW5nIG9uIHRoZSBvcGVyYXRvci4pICBJdHNcbiAgIHRydXRoIHZhbHVlIGlzIHRydWUuXG5cbkVsbGlwc2lzXG4gICBUaGlzIHR5cGUgaGFzIGEgc2luZ2xlIHZhbHVlLiAgVGhlcmUgaXMgYSBzaW5nbGUgb2JqZWN0IHdpdGggdGhpc1xuICAgdmFsdWUuIFRoaXMgb2JqZWN0IGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGJ1aWx0LWluIG5hbWVcbiAgIGBgRWxsaXBzaXNgYC4gSXQgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgcHJlc2VuY2Ugb2YgdGhlIGBgLi4uYGBcbiAgIHN5bnRheCBpbiBhIHNsaWNlLiAgSXRzIHRydXRoIHZhbHVlIGlzIHRydWUuXG5cbmBgbnVtYmVycy5OdW1iZXJgYFxuICAgVGhlc2UgYXJlIGNyZWF0ZWQgYnkgbnVtZXJpYyBsaXRlcmFscyBhbmQgcmV0dXJuZWQgYXMgcmVzdWx0cyBieVxuICAgYXJpdGhtZXRpYyBvcGVyYXRvcnMgYW5kIGFyaXRobWV0aWMgYnVpbHQtaW4gZnVuY3Rpb25zLiAgTnVtZXJpY1xuICAgb2JqZWN0cyBhcmUgaW1tdXRhYmxlOyBvbmNlIGNyZWF0ZWQgdGhlaXIgdmFsdWUgbmV2ZXIgY2hhbmdlcy5cbiAgIFB5dGhvbiBudW1iZXJzIGFyZSBvZiBjb3Vyc2Ugc3Ryb25nbHkgcmVsYXRlZCB0byBtYXRoZW1hdGljYWxcbiAgIG51bWJlcnMsIGJ1dCBzdWJqZWN0IHRvIHRoZSBsaW1pdGF0aW9ucyBvZiBudW1lcmljYWwgcmVwcmVzZW50YXRpb25cbiAgIGluIGNvbXB1dGVycy5cblxuICAgUHl0aG9uIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBpbnRlZ2VycywgZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgYW5kXG4gICBjb21wbGV4IG51bWJlcnM6XG5cbiAgIGBgbnVtYmVycy5JbnRlZ3JhbGBgXG4gICAgICBUaGVzZSByZXByZXNlbnQgZWxlbWVudHMgZnJvbSB0aGUgbWF0aGVtYXRpY2FsIHNldCBvZiBpbnRlZ2Vyc1xuICAgICAgKHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSkuXG5cbiAgICAgIFRoZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiBpbnRlZ2VyczpcblxuICAgICAgUGxhaW4gaW50ZWdlcnNcbiAgICAgICAgIFRoZXNlIHJlcHJlc2VudCBudW1iZXJzIGluIHRoZSByYW5nZSAtMjE0NzQ4MzY0OCB0aHJvdWdoXG4gICAgICAgICAyMTQ3NDgzNjQ3LiAoVGhlIHJhbmdlIG1heSBiZSBsYXJnZXIgb24gbWFjaGluZXMgd2l0aCBhXG4gICAgICAgICBsYXJnZXIgbmF0dXJhbCB3b3JkIHNpemUsIGJ1dCBub3Qgc21hbGxlci4pICBXaGVuIHRoZSByZXN1bHRcbiAgICAgICAgIG9mIGFuIG9wZXJhdGlvbiB3b3VsZCBmYWxsIG91dHNpZGUgdGhpcyByYW5nZSwgdGhlIHJlc3VsdCBpc1xuICAgICAgICAgbm9ybWFsbHkgcmV0dXJuZWQgYXMgYSBsb25nIGludGVnZXIgKGluIHNvbWUgY2FzZXMsIHRoZVxuICAgICAgICAgZXhjZXB0aW9uIGBgT3ZlcmZsb3dFcnJvcmBgIGlzIHJhaXNlZCBpbnN0ZWFkKS4gIEZvciB0aGVcbiAgICAgICAgIHB1cnBvc2Ugb2Ygc2hpZnQgYW5kIG1hc2sgb3BlcmF0aW9ucywgaW50ZWdlcnMgYXJlIGFzc3VtZWQgdG9cbiAgICAgICAgIGhhdmUgYSBiaW5hcnksIDJcJ3MgY29tcGxlbWVudCBub3RhdGlvbiB1c2luZyAzMiBvciBtb3JlIGJpdHMsXG4gICAgICAgICBhbmQgaGlkaW5nIG5vIGJpdHMgZnJvbSB0aGUgdXNlciAoaS5lLiwgYWxsIDQyOTQ5NjcyOTZcbiAgICAgICAgIGRpZmZlcmVudCBiaXQgcGF0dGVybnMgY29ycmVzcG9uZCB0byBkaWZmZXJlbnQgdmFsdWVzKS5cblxuICAgICAgTG9uZyBpbnRlZ2Vyc1xuICAgICAgICAgVGhlc2UgcmVwcmVzZW50IG51bWJlcnMgaW4gYW4gdW5saW1pdGVkIHJhbmdlLCBzdWJqZWN0IHRvXG4gICAgICAgICBhdmFpbGFibGUgKHZpcnR1YWwpIG1lbW9yeSBvbmx5LiAgRm9yIHRoZSBwdXJwb3NlIG9mIHNoaWZ0XG4gICAgICAgICBhbmQgbWFzayBvcGVyYXRpb25zLCBhIGJpbmFyeSByZXByZXNlbnRhdGlvbiBpcyBhc3N1bWVkLCBhbmRcbiAgICAgICAgIG5lZ2F0aXZlIG51bWJlcnMgYXJlIHJlcHJlc2VudGVkIGluIGEgdmFyaWFudCBvZiAyXCdzXG4gICAgICAgICBjb21wbGVtZW50IHdoaWNoIGdpdmVzIHRoZSBpbGx1c2lvbiBvZiBhbiBpbmZpbml0ZSBzdHJpbmcgb2ZcbiAgICAgICAgIHNpZ24gYml0cyBleHRlbmRpbmcgdG8gdGhlIGxlZnQuXG5cbiAgICAgIEJvb2xlYW5zXG4gICAgICAgICBUaGVzZSByZXByZXNlbnQgdGhlIHRydXRoIHZhbHVlcyBGYWxzZSBhbmQgVHJ1ZS4gIFRoZSB0d29cbiAgICAgICAgIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgYGBGYWxzZWBgIGFuZCBgYFRydWVgYCBhcmVcbiAgICAgICAgIHRoZSBvbmx5IEJvb2xlYW4gb2JqZWN0cy4gVGhlIEJvb2xlYW4gdHlwZSBpcyBhIHN1YnR5cGUgb2ZcbiAgICAgICAgIHBsYWluIGludGVnZXJzLCBhbmQgQm9vbGVhbiB2YWx1ZXMgYmVoYXZlIGxpa2UgdGhlIHZhbHVlcyAwXG4gICAgICAgICBhbmQgMSwgcmVzcGVjdGl2ZWx5LCBpbiBhbG1vc3QgYWxsIGNvbnRleHRzLCB0aGUgZXhjZXB0aW9uXG4gICAgICAgICBiZWluZyB0aGF0IHdoZW4gY29udmVydGVkIHRvIGEgc3RyaW5nLCB0aGUgc3RyaW5nc1xuICAgICAgICAgYGAiRmFsc2UiYGAgb3IgYGAiVHJ1ZSJgYCBhcmUgcmV0dXJuZWQsIHJlc3BlY3RpdmVseS5cblxuICAgICAgVGhlIHJ1bGVzIGZvciBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIGFyZSBpbnRlbmRlZCB0byBnaXZlIHRoZVxuICAgICAgbW9zdCBtZWFuaW5nZnVsIGludGVycHJldGF0aW9uIG9mIHNoaWZ0IGFuZCBtYXNrIG9wZXJhdGlvbnNcbiAgICAgIGludm9sdmluZyBuZWdhdGl2ZSBpbnRlZ2VycyBhbmQgdGhlIGxlYXN0IHN1cnByaXNlcyB3aGVuXG4gICAgICBzd2l0Y2hpbmcgYmV0d2VlbiB0aGUgcGxhaW4gYW5kIGxvbmcgaW50ZWdlciBkb21haW5zLiAgQW55XG4gICAgICBvcGVyYXRpb24sIGlmIGl0IHlpZWxkcyBhIHJlc3VsdCBpbiB0aGUgcGxhaW4gaW50ZWdlciBkb21haW4sXG4gICAgICB3aWxsIHlpZWxkIHRoZSBzYW1lIHJlc3VsdCBpbiB0aGUgbG9uZyBpbnRlZ2VyIGRvbWFpbiBvciB3aGVuXG4gICAgICB1c2luZyBtaXhlZCBvcGVyYW5kcy4gIFRoZSBzd2l0Y2ggYmV0d2VlbiBkb21haW5zIGlzIHRyYW5zcGFyZW50XG4gICAgICB0byB0aGUgcHJvZ3JhbW1lci5cblxuICAgYGBudW1iZXJzLlJlYWxgYCAoYGBmbG9hdGBgKVxuICAgICAgVGhlc2UgcmVwcmVzZW50IG1hY2hpbmUtbGV2ZWwgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludFxuICAgICAgbnVtYmVycy4gWW91IGFyZSBhdCB0aGUgbWVyY3kgb2YgdGhlIHVuZGVybHlpbmcgbWFjaGluZVxuICAgICAgYXJjaGl0ZWN0dXJlIChhbmQgQyBvciBKYXZhIGltcGxlbWVudGF0aW9uKSBmb3IgdGhlIGFjY2VwdGVkXG4gICAgICByYW5nZSBhbmQgaGFuZGxpbmcgb2Ygb3ZlcmZsb3cuIFB5dGhvbiBkb2VzIG5vdCBzdXBwb3J0IHNpbmdsZS1cbiAgICAgIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBudW1iZXJzOyB0aGUgc2F2aW5ncyBpbiBwcm9jZXNzb3IgYW5kXG4gICAgICBtZW1vcnkgdXNhZ2UgdGhhdCBhcmUgdXN1YWxseSB0aGUgcmVhc29uIGZvciB1c2luZyB0aGVzZSBpc1xuICAgICAgZHdhcmZlZCBieSB0aGUgb3ZlcmhlYWQgb2YgdXNpbmcgb2JqZWN0cyBpbiBQeXRob24sIHNvIHRoZXJlIGlzXG4gICAgICBubyByZWFzb24gdG8gY29tcGxpY2F0ZSB0aGUgbGFuZ3VhZ2Ugd2l0aCB0d28ga2luZHMgb2YgZmxvYXRpbmdcbiAgICAgIHBvaW50IG51bWJlcnMuXG5cbiAgIGBgbnVtYmVycy5Db21wbGV4YGBcbiAgICAgIFRoZXNlIHJlcHJlc2VudCBjb21wbGV4IG51bWJlcnMgYXMgYSBwYWlyIG9mIG1hY2hpbmUtbGV2ZWxcbiAgICAgIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gIFRoZSBzYW1lIGNhdmVhdHMgYXBwbHlcbiAgICAgIGFzIGZvciBmbG9hdGluZyBwb2ludCBudW1iZXJzLiBUaGUgcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnRzIG9mIGFcbiAgICAgIGNvbXBsZXggbnVtYmVyIGBgemBgIGNhbiBiZSByZXRyaWV2ZWQgdGhyb3VnaCB0aGUgcmVhZC1vbmx5XG4gICAgICBhdHRyaWJ1dGVzIGBgei5yZWFsYGAgYW5kIGBgei5pbWFnYGAuXG5cblNlcXVlbmNlc1xuICAgVGhlc2UgcmVwcmVzZW50IGZpbml0ZSBvcmRlcmVkIHNldHMgaW5kZXhlZCBieSBub24tbmVnYXRpdmVcbiAgIG51bWJlcnMuIFRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYGxlbigpYGAgcmV0dXJucyB0aGUgbnVtYmVyIG9mXG4gICBpdGVtcyBvZiBhIHNlcXVlbmNlLiBXaGVuIHRoZSBsZW5ndGggb2YgYSBzZXF1ZW5jZSBpcyAqbiosIHRoZVxuICAgaW5kZXggc2V0IGNvbnRhaW5zIHRoZSBudW1iZXJzIDAsIDEsIC4uLiwgKm4qLTEuICBJdGVtICppKiBvZlxuICAgc2VxdWVuY2UgKmEqIGlzIHNlbGVjdGVkIGJ5IGBgYVtpXWBgLlxuXG4gICBTZXF1ZW5jZXMgYWxzbyBzdXBwb3J0IHNsaWNpbmc6IGBgYVtpOmpdYGAgc2VsZWN0cyBhbGwgaXRlbXMgd2l0aFxuICAgaW5kZXggKmsqIHN1Y2ggdGhhdCAqaSogYGA8PWBgICprKiBgYDxgYCAqaiouICBXaGVuIHVzZWQgYXMgYW5cbiAgIGV4cHJlc3Npb24sIGEgc2xpY2UgaXMgYSBzZXF1ZW5jZSBvZiB0aGUgc2FtZSB0eXBlLiAgVGhpcyBpbXBsaWVzXG4gICB0aGF0IHRoZSBpbmRleCBzZXQgaXMgcmVudW1iZXJlZCBzbyB0aGF0IGl0IHN0YXJ0cyBhdCAwLlxuXG4gICBTb21lIHNlcXVlbmNlcyBhbHNvIHN1cHBvcnQgImV4dGVuZGVkIHNsaWNpbmciIHdpdGggYSB0aGlyZCAic3RlcCJcbiAgIHBhcmFtZXRlcjogYGBhW2k6ajprXWBgIHNlbGVjdHMgYWxsIGl0ZW1zIG9mICphKiB3aXRoIGluZGV4ICp4KlxuICAgd2hlcmUgYGB4ID0gaSArIG4qa2BgLCAqbiogYGA+PWBgIGBgMGBgIGFuZCAqaSogYGA8PWBgICp4KiBgYDxgYFxuICAgKmoqLlxuXG4gICBTZXF1ZW5jZXMgYXJlIGRpc3Rpbmd1aXNoZWQgYWNjb3JkaW5nIHRvIHRoZWlyIG11dGFiaWxpdHk6XG5cbiAgIEltbXV0YWJsZSBzZXF1ZW5jZXNcbiAgICAgIEFuIG9iamVjdCBvZiBhbiBpbW11dGFibGUgc2VxdWVuY2UgdHlwZSBjYW5ub3QgY2hhbmdlIG9uY2UgaXQgaXNcbiAgICAgIGNyZWF0ZWQuICAoSWYgdGhlIG9iamVjdCBjb250YWlucyByZWZlcmVuY2VzIHRvIG90aGVyIG9iamVjdHMsXG4gICAgICB0aGVzZSBvdGhlciBvYmplY3RzIG1heSBiZSBtdXRhYmxlIGFuZCBtYXkgYmUgY2hhbmdlZDsgaG93ZXZlcixcbiAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgZGlyZWN0bHkgcmVmZXJlbmNlZCBieSBhbiBpbW11dGFibGVcbiAgICAgIG9iamVjdCBjYW5ub3QgY2hhbmdlLilcblxuICAgICAgVGhlIGZvbGxvd2luZyB0eXBlcyBhcmUgaW1tdXRhYmxlIHNlcXVlbmNlczpcblxuICAgICAgU3RyaW5nc1xuICAgICAgICAgVGhlIGl0ZW1zIG9mIGEgc3RyaW5nIGFyZSBjaGFyYWN0ZXJzLiAgVGhlcmUgaXMgbm8gc2VwYXJhdGVcbiAgICAgICAgIGNoYXJhY3RlciB0eXBlOyBhIGNoYXJhY3RlciBpcyByZXByZXNlbnRlZCBieSBhIHN0cmluZyBvZiBvbmVcbiAgICAgICAgIGl0ZW0uIENoYXJhY3RlcnMgcmVwcmVzZW50IChhdCBsZWFzdCkgOC1iaXQgYnl0ZXMuICBUaGVcbiAgICAgICAgIGJ1aWx0LWluIGZ1bmN0aW9ucyBgYGNocigpYGAgYW5kIGBgb3JkKClgYCBjb252ZXJ0IGJldHdlZW5cbiAgICAgICAgIGNoYXJhY3RlcnMgYW5kIG5vbm5lZ2F0aXZlIGludGVnZXJzIHJlcHJlc2VudGluZyB0aGUgYnl0ZVxuICAgICAgICAgdmFsdWVzLiAgQnl0ZXMgd2l0aCB0aGUgdmFsdWVzIDAtMTI3IHVzdWFsbHkgcmVwcmVzZW50IHRoZVxuICAgICAgICAgY29ycmVzcG9uZGluZyBBU0NJSSB2YWx1ZXMsIGJ1dCB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdmFsdWVzXG4gICAgICAgICBpcyB1cCB0byB0aGUgcHJvZ3JhbS4gIFRoZSBzdHJpbmcgZGF0YSB0eXBlIGlzIGFsc28gdXNlZCB0b1xuICAgICAgICAgcmVwcmVzZW50IGFycmF5cyBvZiBieXRlcywgZS5nLiwgdG8gaG9sZCBkYXRhIHJlYWQgZnJvbSBhXG4gICAgICAgICBmaWxlLlxuXG4gICAgICAgICAoT24gc3lzdGVtcyB3aG9zZSBuYXRpdmUgY2hhcmFjdGVyIHNldCBpcyBub3QgQVNDSUksIHN0cmluZ3NcbiAgICAgICAgIG1heSB1c2UgRUJDRElDIGluIHRoZWlyIGludGVybmFsIHJlcHJlc2VudGF0aW9uLCBwcm92aWRlZCB0aGVcbiAgICAgICAgIGZ1bmN0aW9ucyBgYGNocigpYGAgYW5kIGBgb3JkKClgYCBpbXBsZW1lbnQgYSBtYXBwaW5nIGJldHdlZW5cbiAgICAgICAgIEFTQ0lJIGFuZCBFQkNESUMsIGFuZCBzdHJpbmcgY29tcGFyaXNvbiBwcmVzZXJ2ZXMgdGhlIEFTQ0lJXG4gICAgICAgICBvcmRlci4gT3IgcGVyaGFwcyBzb21lb25lIGNhbiBwcm9wb3NlIGEgYmV0dGVyIHJ1bGU/KVxuXG4gICAgICBVbmljb2RlXG4gICAgICAgICBUaGUgaXRlbXMgb2YgYSBVbmljb2RlIG9iamVjdCBhcmUgVW5pY29kZSBjb2RlIHVuaXRzLiAgQVxuICAgICAgICAgVW5pY29kZSBjb2RlIHVuaXQgaXMgcmVwcmVzZW50ZWQgYnkgYSBVbmljb2RlIG9iamVjdCBvZiBvbmVcbiAgICAgICAgIGl0ZW0gYW5kIGNhbiBob2xkIGVpdGhlciBhIDE2LWJpdCBvciAzMi1iaXQgdmFsdWVcbiAgICAgICAgIHJlcHJlc2VudGluZyBhIFVuaWNvZGUgb3JkaW5hbCAodGhlIG1heGltdW0gdmFsdWUgZm9yIHRoZVxuICAgICAgICAgb3JkaW5hbCBpcyBnaXZlbiBpbiBgYHN5cy5tYXh1bmljb2RlYGAsIGFuZCBkZXBlbmRzIG9uIGhvd1xuICAgICAgICAgUHl0aG9uIGlzIGNvbmZpZ3VyZWQgYXQgY29tcGlsZSB0aW1lKS4gIFN1cnJvZ2F0ZSBwYWlycyBtYXlcbiAgICAgICAgIGJlIHByZXNlbnQgaW4gdGhlIFVuaWNvZGUgb2JqZWN0LCBhbmQgd2lsbCBiZSByZXBvcnRlZCBhcyB0d29cbiAgICAgICAgIHNlcGFyYXRlIGl0ZW1zLiAgVGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyBgYHVuaWNocigpYGAgYW5kXG4gICAgICAgICBgYG9yZCgpYGAgY29udmVydCBiZXR3ZWVuIGNvZGUgdW5pdHMgYW5kIG5vbm5lZ2F0aXZlIGludGVnZXJzXG4gICAgICAgICByZXByZXNlbnRpbmcgdGhlIFVuaWNvZGUgb3JkaW5hbHMgYXMgZGVmaW5lZCBpbiB0aGUgVW5pY29kZVxuICAgICAgICAgU3RhbmRhcmQgMy4wLiBDb252ZXJzaW9uIGZyb20gYW5kIHRvIG90aGVyIGVuY29kaW5ncyBhcmVcbiAgICAgICAgIHBvc3NpYmxlIHRocm91Z2ggdGhlIFVuaWNvZGUgbWV0aG9kIGBgZW5jb2RlKClgYCBhbmQgdGhlXG4gICAgICAgICBidWlsdC1pbiBmdW5jdGlvbiBgYHVuaWNvZGUoKWBgLlxuXG4gICAgICBUdXBsZXNcbiAgICAgICAgIFRoZSBpdGVtcyBvZiBhIHR1cGxlIGFyZSBhcmJpdHJhcnkgUHl0aG9uIG9iamVjdHMuIFR1cGxlcyBvZlxuICAgICAgICAgdHdvIG9yIG1vcmUgaXRlbXMgYXJlIGZvcm1lZCBieSBjb21tYS1zZXBhcmF0ZWQgbGlzdHMgb2ZcbiAgICAgICAgIGV4cHJlc3Npb25zLiAgQSB0dXBsZSBvZiBvbmUgaXRlbSAoYSBcJ3NpbmdsZXRvblwnKSBjYW4gYmVcbiAgICAgICAgIGZvcm1lZCBieSBhZmZpeGluZyBhIGNvbW1hIHRvIGFuIGV4cHJlc3Npb24gKGFuIGV4cHJlc3Npb24gYnlcbiAgICAgICAgIGl0c2VsZiBkb2VzIG5vdCBjcmVhdGUgYSB0dXBsZSwgc2luY2UgcGFyZW50aGVzZXMgbXVzdCBiZVxuICAgICAgICAgdXNhYmxlIGZvciBncm91cGluZyBvZiBleHByZXNzaW9ucykuICBBbiBlbXB0eSB0dXBsZSBjYW4gYmVcbiAgICAgICAgIGZvcm1lZCBieSBhbiBlbXB0eSBwYWlyIG9mIHBhcmVudGhlc2VzLlxuXG4gICBNdXRhYmxlIHNlcXVlbmNlc1xuICAgICAgTXV0YWJsZSBzZXF1ZW5jZXMgY2FuIGJlIGNoYW5nZWQgYWZ0ZXIgdGhleSBhcmUgY3JlYXRlZC4gIFRoZVxuICAgICAgc3Vic2NyaXB0aW9uIGFuZCBzbGljaW5nIG5vdGF0aW9ucyBjYW4gYmUgdXNlZCBhcyB0aGUgdGFyZ2V0IG9mXG4gICAgICBhc3NpZ25tZW50IGFuZCBgYGRlbGBgIChkZWxldGUpIHN0YXRlbWVudHMuXG5cbiAgICAgIFRoZXJlIGFyZSBjdXJyZW50bHkgdHdvIGludHJpbnNpYyBtdXRhYmxlIHNlcXVlbmNlIHR5cGVzOlxuXG4gICAgICBMaXN0c1xuICAgICAgICAgVGhlIGl0ZW1zIG9mIGEgbGlzdCBhcmUgYXJiaXRyYXJ5IFB5dGhvbiBvYmplY3RzLiAgTGlzdHMgYXJlXG4gICAgICAgICBmb3JtZWQgYnkgcGxhY2luZyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGV4cHJlc3Npb25zIGluXG4gICAgICAgICBzcXVhcmUgYnJhY2tldHMuIChOb3RlIHRoYXQgdGhlcmUgYXJlIG5vIHNwZWNpYWwgY2FzZXMgbmVlZGVkXG4gICAgICAgICB0byBmb3JtIGxpc3RzIG9mIGxlbmd0aCAwIG9yIDEuKVxuXG4gICAgICBCeXRlIEFycmF5c1xuICAgICAgICAgQSBieXRlYXJyYXkgb2JqZWN0IGlzIGEgbXV0YWJsZSBhcnJheS4gVGhleSBhcmUgY3JlYXRlZCBieVxuICAgICAgICAgdGhlIGJ1aWx0LWluIGBgYnl0ZWFycmF5KClgYCBjb25zdHJ1Y3Rvci4gIEFzaWRlIGZyb20gYmVpbmdcbiAgICAgICAgIG11dGFibGUgKGFuZCBoZW5jZSB1bmhhc2hhYmxlKSwgYnl0ZSBhcnJheXMgb3RoZXJ3aXNlIHByb3ZpZGVcbiAgICAgICAgIHRoZSBzYW1lIGludGVyZmFjZSBhbmQgZnVuY3Rpb25hbGl0eSBhcyBpbW11dGFibGUgYnl0ZXNcbiAgICAgICAgIG9iamVjdHMuXG5cbiAgICAgIFRoZSBleHRlbnNpb24gbW9kdWxlIGBgYXJyYXlgYCBwcm92aWRlcyBhbiBhZGRpdGlvbmFsIGV4YW1wbGUgb2ZcbiAgICAgIGEgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlLlxuXG5TZXQgdHlwZXNcbiAgIFRoZXNlIHJlcHJlc2VudCB1bm9yZGVyZWQsIGZpbml0ZSBzZXRzIG9mIHVuaXF1ZSwgaW1tdXRhYmxlXG4gICBvYmplY3RzLiBBcyBzdWNoLCB0aGV5IGNhbm5vdCBiZSBpbmRleGVkIGJ5IGFueSBzdWJzY3JpcHQuIEhvd2V2ZXIsXG4gICB0aGV5IGNhbiBiZSBpdGVyYXRlZCBvdmVyLCBhbmQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGBgbGVuKClgYFxuICAgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIGEgc2V0LiBDb21tb24gdXNlcyBmb3Igc2V0cyBhcmUgZmFzdFxuICAgbWVtYmVyc2hpcCB0ZXN0aW5nLCByZW1vdmluZyBkdXBsaWNhdGVzIGZyb20gYSBzZXF1ZW5jZSwgYW5kXG4gICBjb21wdXRpbmcgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbnMgc3VjaCBhcyBpbnRlcnNlY3Rpb24sIHVuaW9uLFxuICAgZGlmZmVyZW5jZSwgYW5kIHN5bW1ldHJpYyBkaWZmZXJlbmNlLlxuXG4gICBGb3Igc2V0IGVsZW1lbnRzLCB0aGUgc2FtZSBpbW11dGFiaWxpdHkgcnVsZXMgYXBwbHkgYXMgZm9yXG4gICBkaWN0aW9uYXJ5IGtleXMuIE5vdGUgdGhhdCBudW1lcmljIHR5cGVzIG9iZXkgdGhlIG5vcm1hbCBydWxlcyBmb3JcbiAgIG51bWVyaWMgY29tcGFyaXNvbjogaWYgdHdvIG51bWJlcnMgY29tcGFyZSBlcXVhbCAoZS5nLiwgYGAxYGAgYW5kXG4gICBgYDEuMGBgKSwgb25seSBvbmUgb2YgdGhlbSBjYW4gYmUgY29udGFpbmVkIGluIGEgc2V0LlxuXG4gICBUaGVyZSBhcmUgY3VycmVudGx5IHR3byBpbnRyaW5zaWMgc2V0IHR5cGVzOlxuXG4gICBTZXRzXG4gICAgICBUaGVzZSByZXByZXNlbnQgYSBtdXRhYmxlIHNldC4gVGhleSBhcmUgY3JlYXRlZCBieSB0aGUgYnVpbHQtaW5cbiAgICAgIGBgc2V0KClgYCBjb25zdHJ1Y3RvciBhbmQgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgYnkgc2V2ZXJhbFxuICAgICAgbWV0aG9kcywgc3VjaCBhcyBgYGFkZCgpYGAuXG5cbiAgIEZyb3plbiBzZXRzXG4gICAgICBUaGVzZSByZXByZXNlbnQgYW4gaW1tdXRhYmxlIHNldC4gIFRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlXG4gICAgICBidWlsdC1pbiBgYGZyb3plbnNldCgpYGAgY29uc3RydWN0b3IuICBBcyBhIGZyb3plbnNldCBpc1xuICAgICAgaW1tdXRhYmxlIGFuZCAqaGFzaGFibGUqLCBpdCBjYW4gYmUgdXNlZCBhZ2FpbiBhcyBhbiBlbGVtZW50IG9mXG4gICAgICBhbm90aGVyIHNldCwgb3IgYXMgYSBkaWN0aW9uYXJ5IGtleS5cblxuTWFwcGluZ3NcbiAgIFRoZXNlIHJlcHJlc2VudCBmaW5pdGUgc2V0cyBvZiBvYmplY3RzIGluZGV4ZWQgYnkgYXJiaXRyYXJ5IGluZGV4XG4gICBzZXRzLiBUaGUgc3Vic2NyaXB0IG5vdGF0aW9uIGBgYVtrXWBgIHNlbGVjdHMgdGhlIGl0ZW0gaW5kZXhlZCBieVxuICAgYGBrYGAgZnJvbSB0aGUgbWFwcGluZyBgYGFgYDsgdGhpcyBjYW4gYmUgdXNlZCBpbiBleHByZXNzaW9ucyBhbmRcbiAgIGFzIHRoZSB0YXJnZXQgb2YgYXNzaWdubWVudHMgb3IgYGBkZWxgYCBzdGF0ZW1lbnRzLiBUaGUgYnVpbHQtaW5cbiAgIGZ1bmN0aW9uIGBgbGVuKClgYCByZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gYSBtYXBwaW5nLlxuXG4gICBUaGVyZSBpcyBjdXJyZW50bHkgYSBzaW5nbGUgaW50cmluc2ljIG1hcHBpbmcgdHlwZTpcblxuICAgRGljdGlvbmFyaWVzXG4gICAgICBUaGVzZSByZXByZXNlbnQgZmluaXRlIHNldHMgb2Ygb2JqZWN0cyBpbmRleGVkIGJ5IG5lYXJseVxuICAgICAgYXJiaXRyYXJ5IHZhbHVlcy4gIFRoZSBvbmx5IHR5cGVzIG9mIHZhbHVlcyBub3QgYWNjZXB0YWJsZSBhc1xuICAgICAga2V5cyBhcmUgdmFsdWVzIGNvbnRhaW5pbmcgbGlzdHMgb3IgZGljdGlvbmFyaWVzIG9yIG90aGVyXG4gICAgICBtdXRhYmxlIHR5cGVzIHRoYXQgYXJlIGNvbXBhcmVkIGJ5IHZhbHVlIHJhdGhlciB0aGFuIGJ5IG9iamVjdFxuICAgICAgaWRlbnRpdHksIHRoZSByZWFzb24gYmVpbmcgdGhhdCB0aGUgZWZmaWNpZW50IGltcGxlbWVudGF0aW9uIG9mXG4gICAgICBkaWN0aW9uYXJpZXMgcmVxdWlyZXMgYSBrZXlcJ3MgaGFzaCB2YWx1ZSB0byByZW1haW4gY29uc3RhbnQuXG4gICAgICBOdW1lcmljIHR5cGVzIHVzZWQgZm9yIGtleXMgb2JleSB0aGUgbm9ybWFsIHJ1bGVzIGZvciBudW1lcmljXG4gICAgICBjb21wYXJpc29uOiBpZiB0d28gbnVtYmVycyBjb21wYXJlIGVxdWFsIChlLmcuLCBgYDFgYCBhbmRcbiAgICAgIGBgMS4wYGApIHRoZW4gdGhleSBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgdG8gaW5kZXggdGhlIHNhbWVcbiAgICAgIGRpY3Rpb25hcnkgZW50cnkuXG5cbiAgICAgIERpY3Rpb25hcmllcyBhcmUgbXV0YWJsZTsgdGhleSBjYW4gYmUgY3JlYXRlZCBieSB0aGUgYGB7Li4ufWBgXG4gICAgICBub3RhdGlvbiAoc2VlIHNlY3Rpb24gKkRpY3Rpb25hcnkgZGlzcGxheXMqKS5cblxuICAgICAgVGhlIGV4dGVuc2lvbiBtb2R1bGVzIGBgZGJtYGAsIGBgZ2RibWBgLCBhbmQgYGBic2RkYmBgIHByb3ZpZGVcbiAgICAgIGFkZGl0aW9uYWwgZXhhbXBsZXMgb2YgbWFwcGluZyB0eXBlcy5cblxuQ2FsbGFibGUgdHlwZXNcbiAgIFRoZXNlIGFyZSB0aGUgdHlwZXMgdG8gd2hpY2ggdGhlIGZ1bmN0aW9uIGNhbGwgb3BlcmF0aW9uIChzZWVcbiAgIHNlY3Rpb24gKkNhbGxzKikgY2FuIGJlIGFwcGxpZWQ6XG5cbiAgIFVzZXItZGVmaW5lZCBmdW5jdGlvbnNcbiAgICAgIEEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCBpcyBjcmVhdGVkIGJ5IGEgZnVuY3Rpb25cbiAgICAgIGRlZmluaXRpb24gKHNlZSBzZWN0aW9uICpGdW5jdGlvbiBkZWZpbml0aW9ucyopLiAgSXQgc2hvdWxkIGJlXG4gICAgICBjYWxsZWQgd2l0aCBhbiBhcmd1bWVudCBsaXN0IGNvbnRhaW5pbmcgdGhlIHNhbWUgbnVtYmVyIG9mIGl0ZW1zXG4gICAgICBhcyB0aGUgZnVuY3Rpb25cJ3MgZm9ybWFsIHBhcmFtZXRlciBsaXN0LlxuXG4gICAgICBTcGVjaWFsIGF0dHJpYnV0ZXM6XG5cbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCBBdHRyaWJ1dGUgICAgICAgICAgICAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArPT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PStcbiAgICAgIHwgYGBfX2RvY19fYGAgICAgICAgICAgICAgfCBUaGUgZnVuY3Rpb25cJ3MgZG9jdW1lbnRhdGlvbiAgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgYGBmdW5jX2RvY2BgICAgICAgICAgICAgfCBzdHJpbmcsIG9yIGBgTm9uZWBgIGlmICAgICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IHVuYXZhaWxhYmxlLiAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgYGBfX25hbWVfX2BgICAgICAgICAgICAgfCBUaGUgZnVuY3Rpb25cJ3MgbmFtZS4gICAgICAgICAgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgYGBmdW5jX25hbWVgYCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8IGBgX19tb2R1bGVfX2BgICAgICAgICAgIHwgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0aGUgICAgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBmdW5jdGlvbiB3YXMgZGVmaW5lZCBpbiwgb3IgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IGBgTm9uZWBgIGlmIHVuYXZhaWxhYmxlLiAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgYGBfX2RlZmF1bHRzX19gYCAgICAgICAgfCBBIHR1cGxlIGNvbnRhaW5pbmcgZGVmYXVsdCAgICAgIHwgV3JpdGFibGUgICAgfFxuICAgICAgfCBgYGZ1bmNfZGVmYXVsdHNgYCAgICAgICB8IGFyZ3VtZW50IHZhbHVlcyBmb3IgdGhvc2UgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXJndW1lbnRzIHRoYXQgaGF2ZSBkZWZhdWx0cywgICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBvciBgYE5vbmVgYCBpZiBubyBhcmd1bWVudHMgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IGhhdmUgYSBkZWZhdWx0IHZhbHVlLiAgICAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgYGBfX2NvZGVfX2BgICAgICAgICAgICAgfCBUaGUgY29kZSBvYmplY3QgcmVwcmVzZW50aW5nICAgIHwgV3JpdGFibGUgICAgfFxuICAgICAgfCBgYGZ1bmNfY29kZWBgICAgICAgICAgICB8IHRoZSBjb21waWxlZCBmdW5jdGlvbiBib2R5LiAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgYGBfX2dsb2JhbHNfX2BgICAgICAgICAgfCBBIHJlZmVyZW5jZSB0byB0aGUgZGljdGlvbmFyeSAgIHwgUmVhZC1vbmx5ICAgfFxuICAgICAgfCBgYGZ1bmNfZ2xvYmFsc2BgICAgICAgICB8IHRoYXQgaG9sZHMgdGhlIGZ1bmN0aW9uXCdzICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IGdsb2JhbCB2YXJpYWJsZXMgLS0tIHRoZSBnbG9iYWwgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgbmFtZXNwYWNlIG9mIHRoZSBtb2R1bGUgaW4gICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCB3aGljaCB0aGUgZnVuY3Rpb24gd2FzIGRlZmluZWQuIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8IGBgX19kaWN0X19gYCAgICAgICAgICAgIHwgVGhlIG5hbWVzcGFjZSBzdXBwb3J0aW5nICAgICAgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgYGBmdW5jX2RpY3RgYCAgICAgICAgICAgfCBhcmJpdHJhcnkgZnVuY3Rpb24gYXR0cmlidXRlcy4gIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8IGBgX19jbG9zdXJlX19gYCAgICAgICAgIHwgYGBOb25lYGAgb3IgYSB0dXBsZSBvZiBjZWxscyAgICB8IFJlYWQtb25seSAgIHxcbiAgICAgIHwgYGBmdW5jX2Nsb3N1cmVgYCAgICAgICAgfCB0aGF0IGNvbnRhaW4gYmluZGluZ3MgZm9yIHRoZSAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IGZ1bmN0aW9uXCdzIGZyZWUgdmFyaWFibGVzLiAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG5cbiAgICAgIE1vc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgbGFiZWxsZWQgIldyaXRhYmxlIiBjaGVjayB0aGUgdHlwZSBvZiB0aGVcbiAgICAgIGFzc2lnbmVkIHZhbHVlLlxuXG4gICAgICBDaGFuZ2VkIGluIHZlcnNpb24gMi40OiBgYGZ1bmNfbmFtZWBgIGlzIG5vdyB3cml0YWJsZS5cblxuICAgICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNjogVGhlIGRvdWJsZS11bmRlcnNjb3JlIGF0dHJpYnV0ZXNcbiAgICAgIGBgX19jbG9zdXJlX19gYCwgYGBfX2NvZGVfX2BgLCBgYF9fZGVmYXVsdHNfX2BgLCBhbmRcbiAgICAgIGBgX19nbG9iYWxzX19gYCB3ZXJlIGludHJvZHVjZWQgYXMgYWxpYXNlcyBmb3IgdGhlIGNvcnJlc3BvbmRpbmdcbiAgICAgIGBgZnVuY18qYGAgYXR0cmlidXRlcyBmb3IgZm9yd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIFB5dGhvbiAzLlxuXG4gICAgICBGdW5jdGlvbiBvYmplY3RzIGFsc28gc3VwcG9ydCBnZXR0aW5nIGFuZCBzZXR0aW5nIGFyYml0cmFyeVxuICAgICAgYXR0cmlidXRlcywgd2hpY2ggY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCB0byBhdHRhY2ggbWV0YWRhdGFcbiAgICAgIHRvIGZ1bmN0aW9ucy4gIFJlZ3VsYXIgYXR0cmlidXRlIGRvdC1ub3RhdGlvbiBpcyB1c2VkIHRvIGdldCBhbmRcbiAgICAgIHNldCBzdWNoIGF0dHJpYnV0ZXMuICpOb3RlIHRoYXQgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb25seVxuICAgICAgc3VwcG9ydHMgZnVuY3Rpb24gYXR0cmlidXRlcyBvbiB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLiBGdW5jdGlvblxuICAgICAgYXR0cmlidXRlcyBvbiBidWlsdC1pbiBmdW5jdGlvbnMgbWF5IGJlIHN1cHBvcnRlZCBpbiB0aGVcbiAgICAgIGZ1dHVyZS4qXG5cbiAgICAgIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBmdW5jdGlvblwncyBkZWZpbml0aW9uIGNhbiBiZVxuICAgICAgcmV0cmlldmVkIGZyb20gaXRzIGNvZGUgb2JqZWN0OyBzZWUgdGhlIGRlc2NyaXB0aW9uIG9mIGludGVybmFsXG4gICAgICB0eXBlcyBiZWxvdy5cblxuICAgVXNlci1kZWZpbmVkIG1ldGhvZHNcbiAgICAgIEEgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3QgY29tYmluZXMgYSBjbGFzcywgYSBjbGFzcyBpbnN0YW5jZVxuICAgICAgKG9yIGBgTm9uZWBgKSBhbmQgYW55IGNhbGxhYmxlIG9iamVjdCAobm9ybWFsbHkgYSB1c2VyLWRlZmluZWRcbiAgICAgIGZ1bmN0aW9uKS5cblxuICAgICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogYGBpbV9zZWxmYGAgaXMgdGhlIGNsYXNzIGluc3RhbmNlXG4gICAgICBvYmplY3QsIGBgaW1fZnVuY2BgIGlzIHRoZSBmdW5jdGlvbiBvYmplY3Q7IGBgaW1fY2xhc3NgYCBpcyB0aGVcbiAgICAgIGNsYXNzIG9mIGBgaW1fc2VsZmBgIGZvciBib3VuZCBtZXRob2RzIG9yIHRoZSBjbGFzcyB0aGF0IGFza2VkXG4gICAgICBmb3IgdGhlIG1ldGhvZCBmb3IgdW5ib3VuZCBtZXRob2RzOyBgYF9fZG9jX19gYCBpcyB0aGUgbWV0aG9kXCdzXG4gICAgICBkb2N1bWVudGF0aW9uIChzYW1lIGFzIGBgaW1fZnVuYy5fX2RvY19fYGApOyBgYF9fbmFtZV9fYGAgaXMgdGhlXG4gICAgICBtZXRob2QgbmFtZSAoc2FtZSBhcyBgYGltX2Z1bmMuX19uYW1lX19gYCk7IGBgX19tb2R1bGVfX2BgIGlzXG4gICAgICB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRoZSBtZXRob2Qgd2FzIGRlZmluZWQgaW4sIG9yIGBgTm9uZWBgIGlmXG4gICAgICB1bmF2YWlsYWJsZS5cblxuICAgICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMjogYGBpbV9zZWxmYGAgdXNlZCB0byByZWZlciB0byB0aGUgY2xhc3NcbiAgICAgIHRoYXQgZGVmaW5lZCB0aGUgbWV0aG9kLlxuXG4gICAgICBDaGFuZ2VkIGluIHZlcnNpb24gMi42OiBGb3IgUHl0aG9uIDMgZm9yd2FyZC1jb21wYXRpYmlsaXR5LFxuICAgICAgYGBpbV9mdW5jYGAgaXMgYWxzbyBhdmFpbGFibGUgYXMgYGBfX2Z1bmNfX2BgLCBhbmQgYGBpbV9zZWxmYGBcbiAgICAgIGFzIGBgX19zZWxmX19gYC5cblxuICAgICAgTWV0aG9kcyBhbHNvIHN1cHBvcnQgYWNjZXNzaW5nIChidXQgbm90IHNldHRpbmcpIHRoZSBhcmJpdHJhcnlcbiAgICAgIGZ1bmN0aW9uIGF0dHJpYnV0ZXMgb24gdGhlIHVuZGVybHlpbmcgZnVuY3Rpb24gb2JqZWN0LlxuXG4gICAgICBVc2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdHMgbWF5IGJlIGNyZWF0ZWQgd2hlbiBnZXR0aW5nIGFuXG4gICAgICBhdHRyaWJ1dGUgb2YgYSBjbGFzcyAocGVyaGFwcyB2aWEgYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcyksIGlmXG4gICAgICB0aGF0IGF0dHJpYnV0ZSBpcyBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBvYmplY3QsIGFuIHVuYm91bmRcbiAgICAgIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0LCBvciBhIGNsYXNzIG1ldGhvZCBvYmplY3QuIFdoZW4gdGhlXG4gICAgICBhdHRyaWJ1dGUgaXMgYSB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCwgYSBuZXcgbWV0aG9kIG9iamVjdFxuICAgICAgaXMgb25seSBjcmVhdGVkIGlmIHRoZSBjbGFzcyBmcm9tIHdoaWNoIGl0IGlzIGJlaW5nIHJldHJpZXZlZCBpc1xuICAgICAgdGhlIHNhbWUgYXMsIG9yIGEgZGVyaXZlZCBjbGFzcyBvZiwgdGhlIGNsYXNzIHN0b3JlZCBpbiB0aGVcbiAgICAgIG9yaWdpbmFsIG1ldGhvZCBvYmplY3Q7IG90aGVyd2lzZSwgdGhlIG9yaWdpbmFsIG1ldGhvZCBvYmplY3QgaXNcbiAgICAgIHVzZWQgYXMgaXQgaXMuXG5cbiAgICAgIFdoZW4gYSB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCBpcyBjcmVhdGVkIGJ5IHJldHJpZXZpbmcgYVxuICAgICAgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCBmcm9tIGEgY2xhc3MsIGl0cyBgYGltX3NlbGZgYFxuICAgICAgYXR0cmlidXRlIGlzIGBgTm9uZWBgIGFuZCB0aGUgbWV0aG9kIG9iamVjdCBpcyBzYWlkIHRvIGJlXG4gICAgICB1bmJvdW5kLiBXaGVuIG9uZSBpcyBjcmVhdGVkIGJ5IHJldHJpZXZpbmcgYSB1c2VyLWRlZmluZWRcbiAgICAgIGZ1bmN0aW9uIG9iamVjdCBmcm9tIGEgY2xhc3MgdmlhIG9uZSBvZiBpdHMgaW5zdGFuY2VzLCBpdHNcbiAgICAgIGBgaW1fc2VsZmBgIGF0dHJpYnV0ZSBpcyB0aGUgaW5zdGFuY2UsIGFuZCB0aGUgbWV0aG9kIG9iamVjdCBpc1xuICAgICAgc2FpZCB0byBiZSBib3VuZC4gSW4gZWl0aGVyIGNhc2UsIHRoZSBuZXcgbWV0aG9kXCdzIGBgaW1fY2xhc3NgYFxuICAgICAgYXR0cmlidXRlIGlzIHRoZSBjbGFzcyBmcm9tIHdoaWNoIHRoZSByZXRyaWV2YWwgdGFrZXMgcGxhY2UsIGFuZFxuICAgICAgaXRzIGBgaW1fZnVuY2BgIGF0dHJpYnV0ZSBpcyB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gb2JqZWN0LlxuXG4gICAgICBXaGVuIGEgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3QgaXMgY3JlYXRlZCBieSByZXRyaWV2aW5nXG4gICAgICBhbm90aGVyIG1ldGhvZCBvYmplY3QgZnJvbSBhIGNsYXNzIG9yIGluc3RhbmNlLCB0aGUgYmVoYXZpb3VyIGlzXG4gICAgICB0aGUgc2FtZSBhcyBmb3IgYSBmdW5jdGlvbiBvYmplY3QsIGV4Y2VwdCB0aGF0IHRoZSBgYGltX2Z1bmNgYFxuICAgICAgYXR0cmlidXRlIG9mIHRoZSBuZXcgaW5zdGFuY2UgaXMgbm90IHRoZSBvcmlnaW5hbCBtZXRob2Qgb2JqZWN0XG4gICAgICBidXQgaXRzIGBgaW1fZnVuY2BgIGF0dHJpYnV0ZS5cblxuICAgICAgV2hlbiBhIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0IGlzIGNyZWF0ZWQgYnkgcmV0cmlldmluZyBhXG4gICAgICBjbGFzcyBtZXRob2Qgb2JqZWN0IGZyb20gYSBjbGFzcyBvciBpbnN0YW5jZSwgaXRzIGBgaW1fc2VsZmBgXG4gICAgICBhdHRyaWJ1dGUgaXMgdGhlIGNsYXNzIGl0c2VsZiwgYW5kIGl0cyBgYGltX2Z1bmNgYCBhdHRyaWJ1dGUgaXNcbiAgICAgIHRoZSBmdW5jdGlvbiBvYmplY3QgdW5kZXJseWluZyB0aGUgY2xhc3MgbWV0aG9kLlxuXG4gICAgICBXaGVuIGFuIHVuYm91bmQgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3QgaXMgY2FsbGVkLCB0aGVcbiAgICAgIHVuZGVybHlpbmcgZnVuY3Rpb24gKGBgaW1fZnVuY2BgKSBpcyBjYWxsZWQsIHdpdGggdGhlXG4gICAgICByZXN0cmljdGlvbiB0aGF0IHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIHRoZVxuICAgICAgcHJvcGVyIGNsYXNzIChgYGltX2NsYXNzYGApIG9yIG9mIGEgZGVyaXZlZCBjbGFzcyB0aGVyZW9mLlxuXG4gICAgICBXaGVuIGEgYm91bmQgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3QgaXMgY2FsbGVkLCB0aGVcbiAgICAgIHVuZGVybHlpbmcgZnVuY3Rpb24gKGBgaW1fZnVuY2BgKSBpcyBjYWxsZWQsIGluc2VydGluZyB0aGUgY2xhc3NcbiAgICAgIGluc3RhbmNlIChgYGltX3NlbGZgYCkgaW4gZnJvbnQgb2YgdGhlIGFyZ3VtZW50IGxpc3QuICBGb3JcbiAgICAgIGluc3RhbmNlLCB3aGVuIGBgQ2BgIGlzIGEgY2xhc3Mgd2hpY2ggY29udGFpbnMgYSBkZWZpbml0aW9uIGZvclxuICAgICAgYSBmdW5jdGlvbiBgYGYoKWBgLCBhbmQgYGB4YGAgaXMgYW4gaW5zdGFuY2Ugb2YgYGBDYGAsIGNhbGxpbmdcbiAgICAgIGBgeC5mKDEpYGAgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIGBgQy5mKHgsIDEpYGAuXG5cbiAgICAgIFdoZW4gYSB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCBpcyBkZXJpdmVkIGZyb20gYSBjbGFzcyBtZXRob2RcbiAgICAgIG9iamVjdCwgdGhlICJjbGFzcyBpbnN0YW5jZSIgc3RvcmVkIGluIGBgaW1fc2VsZmBgIHdpbGwgYWN0dWFsbHlcbiAgICAgIGJlIHRoZSBjbGFzcyBpdHNlbGYsIHNvIHRoYXQgY2FsbGluZyBlaXRoZXIgYGB4LmYoMSlgYCBvclxuICAgICAgYGBDLmYoMSlgYCBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgYGBmKEMsMSlgYCB3aGVyZSBgYGZgYCBpc1xuICAgICAgdGhlIHVuZGVybHlpbmcgZnVuY3Rpb24uXG5cbiAgICAgIE5vdGUgdGhhdCB0aGUgdHJhbnNmb3JtYXRpb24gZnJvbSBmdW5jdGlvbiBvYmplY3QgdG8gKHVuYm91bmQgb3JcbiAgICAgIGJvdW5kKSBtZXRob2Qgb2JqZWN0IGhhcHBlbnMgZWFjaCB0aW1lIHRoZSBhdHRyaWJ1dGUgaXNcbiAgICAgIHJldHJpZXZlZCBmcm9tIHRoZSBjbGFzcyBvciBpbnN0YW5jZS4gSW4gc29tZSBjYXNlcywgYSBmcnVpdGZ1bFxuICAgICAgb3B0aW1pemF0aW9uIGlzIHRvIGFzc2lnbiB0aGUgYXR0cmlidXRlIHRvIGEgbG9jYWwgdmFyaWFibGUgYW5kXG4gICAgICBjYWxsIHRoYXQgbG9jYWwgdmFyaWFibGUuIEFsc28gbm90aWNlIHRoYXQgdGhpcyB0cmFuc2Zvcm1hdGlvblxuICAgICAgb25seSBoYXBwZW5zIGZvciB1c2VyLWRlZmluZWQgZnVuY3Rpb25zOyBvdGhlciBjYWxsYWJsZSBvYmplY3RzXG4gICAgICAoYW5kIGFsbCBub24tY2FsbGFibGUgb2JqZWN0cykgYXJlIHJldHJpZXZlZCB3aXRob3V0XG4gICAgICB0cmFuc2Zvcm1hdGlvbi4gIEl0IGlzIGFsc28gaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB1c2VyLWRlZmluZWRcbiAgICAgIGZ1bmN0aW9ucyB3aGljaCBhcmUgYXR0cmlidXRlcyBvZiBhIGNsYXNzIGluc3RhbmNlIGFyZSBub3RcbiAgICAgIGNvbnZlcnRlZCB0byBib3VuZCBtZXRob2RzOyB0aGlzICpvbmx5KiBoYXBwZW5zIHdoZW4gdGhlXG4gICAgICBmdW5jdGlvbiBpcyBhbiBhdHRyaWJ1dGUgb2YgdGhlIGNsYXNzLlxuXG4gICBHZW5lcmF0b3IgZnVuY3Rpb25zXG4gICAgICBBIGZ1bmN0aW9uIG9yIG1ldGhvZCB3aGljaCB1c2VzIHRoZSBgYHlpZWxkYGAgc3RhdGVtZW50IChzZWVcbiAgICAgIHNlY3Rpb24gKlRoZSB5aWVsZCBzdGF0ZW1lbnQqKSBpcyBjYWxsZWQgYSAqZ2VuZXJhdG9yIGZ1bmN0aW9uKi5cbiAgICAgIFN1Y2ggYSBmdW5jdGlvbiwgd2hlbiBjYWxsZWQsIGFsd2F5cyByZXR1cm5zIGFuIGl0ZXJhdG9yIG9iamVjdFxuICAgICAgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb246ICBjYWxsaW5nXG4gICAgICB0aGUgaXRlcmF0b3JcJ3MgYGBuZXh0KClgYCBtZXRob2Qgd2lsbCBjYXVzZSB0aGUgZnVuY3Rpb24gdG9cbiAgICAgIGV4ZWN1dGUgdW50aWwgaXQgcHJvdmlkZXMgYSB2YWx1ZSB1c2luZyB0aGUgYGB5aWVsZGBgIHN0YXRlbWVudC5cbiAgICAgIFdoZW4gdGhlIGZ1bmN0aW9uIGV4ZWN1dGVzIGEgYGByZXR1cm5gYCBzdGF0ZW1lbnQgb3IgZmFsbHMgb2ZmXG4gICAgICB0aGUgZW5kLCBhIGBgU3RvcEl0ZXJhdGlvbmBgIGV4Y2VwdGlvbiBpcyByYWlzZWQgYW5kIHRoZVxuICAgICAgaXRlcmF0b3Igd2lsbCBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc2V0IG9mIHZhbHVlcyB0byBiZVxuICAgICAgcmV0dXJuZWQuXG5cbiAgIEJ1aWx0LWluIGZ1bmN0aW9uc1xuICAgICAgQSBidWlsdC1pbiBmdW5jdGlvbiBvYmplY3QgaXMgYSB3cmFwcGVyIGFyb3VuZCBhIEMgZnVuY3Rpb24uXG4gICAgICBFeGFtcGxlcyBvZiBidWlsdC1pbiBmdW5jdGlvbnMgYXJlIGBgbGVuKClgYCBhbmQgYGBtYXRoLnNpbigpYGBcbiAgICAgIChgYG1hdGhgYCBpcyBhIHN0YW5kYXJkIGJ1aWx0LWluIG1vZHVsZSkuIFRoZSBudW1iZXIgYW5kIHR5cGUgb2ZcbiAgICAgIHRoZSBhcmd1bWVudHMgYXJlIGRldGVybWluZWQgYnkgdGhlIEMgZnVuY3Rpb24uIFNwZWNpYWwgcmVhZC1cbiAgICAgIG9ubHkgYXR0cmlidXRlczogYGBfX2RvY19fYGAgaXMgdGhlIGZ1bmN0aW9uXCdzIGRvY3VtZW50YXRpb25cbiAgICAgIHN0cmluZywgb3IgYGBOb25lYGAgaWYgdW5hdmFpbGFibGU7IGBgX19uYW1lX19gYCBpcyB0aGVcbiAgICAgIGZ1bmN0aW9uXCdzIG5hbWU7IGBgX19zZWxmX19gYCBpcyBzZXQgdG8gYGBOb25lYGAgKGJ1dCBzZWUgdGhlXG4gICAgICBuZXh0IGl0ZW0pOyBgYF9fbW9kdWxlX19gYCBpcyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRoZVxuICAgICAgZnVuY3Rpb24gd2FzIGRlZmluZWQgaW4gb3IgYGBOb25lYGAgaWYgdW5hdmFpbGFibGUuXG5cbiAgIEJ1aWx0LWluIG1ldGhvZHNcbiAgICAgIFRoaXMgaXMgcmVhbGx5IGEgZGlmZmVyZW50IGRpc2d1aXNlIG9mIGEgYnVpbHQtaW4gZnVuY3Rpb24sIHRoaXNcbiAgICAgIHRpbWUgY29udGFpbmluZyBhbiBvYmplY3QgcGFzc2VkIHRvIHRoZSBDIGZ1bmN0aW9uIGFzIGFuXG4gICAgICBpbXBsaWNpdCBleHRyYSBhcmd1bWVudC4gIEFuIGV4YW1wbGUgb2YgYSBidWlsdC1pbiBtZXRob2QgaXNcbiAgICAgIGBgYWxpc3QuYXBwZW5kKClgYCwgYXNzdW1pbmcgKmFsaXN0KiBpcyBhIGxpc3Qgb2JqZWN0LiBJbiB0aGlzXG4gICAgICBjYXNlLCB0aGUgc3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlIGBgX19zZWxmX19gYCBpcyBzZXQgdG8gdGhlXG4gICAgICBvYmplY3QgZGVub3RlZCBieSAqYWxpc3QqLlxuXG4gICBDbGFzcyBUeXBlc1xuICAgICAgQ2xhc3MgdHlwZXMsIG9yICJuZXctc3R5bGUgY2xhc3NlcywiIGFyZSBjYWxsYWJsZS4gIFRoZXNlXG4gICAgICBvYmplY3RzIG5vcm1hbGx5IGFjdCBhcyBmYWN0b3JpZXMgZm9yIG5ldyBpbnN0YW5jZXMgb2ZcbiAgICAgIHRoZW1zZWx2ZXMsIGJ1dCB2YXJpYXRpb25zIGFyZSBwb3NzaWJsZSBmb3IgY2xhc3MgdHlwZXMgdGhhdFxuICAgICAgb3ZlcnJpZGUgYGBfX25ld19fKClgYC4gIFRoZSBhcmd1bWVudHMgb2YgdGhlIGNhbGwgYXJlIHBhc3NlZCB0b1xuICAgICAgYGBfX25ld19fKClgYCBhbmQsIGluIHRoZSB0eXBpY2FsIGNhc2UsIHRvIGBgX19pbml0X18oKWBgIHRvXG4gICAgICBpbml0aWFsaXplIHRoZSBuZXcgaW5zdGFuY2UuXG5cbiAgIENsYXNzaWMgQ2xhc3Nlc1xuICAgICAgQ2xhc3Mgb2JqZWN0cyBhcmUgZGVzY3JpYmVkIGJlbG93LiAgV2hlbiBhIGNsYXNzIG9iamVjdCBpc1xuICAgICAgY2FsbGVkLCBhIG5ldyBjbGFzcyBpbnN0YW5jZSAoYWxzbyBkZXNjcmliZWQgYmVsb3cpIGlzIGNyZWF0ZWRcbiAgICAgIGFuZCByZXR1cm5lZC4gIFRoaXMgaW1wbGllcyBhIGNhbGwgdG8gdGhlIGNsYXNzXCdzIGBgX19pbml0X18oKWBgXG4gICAgICBtZXRob2QgaWYgaXQgaGFzIG9uZS4gIEFueSBhcmd1bWVudHMgYXJlIHBhc3NlZCBvbiB0byB0aGVcbiAgICAgIGBgX19pbml0X18oKWBgIG1ldGhvZC4gIElmIHRoZXJlIGlzIG5vIGBgX19pbml0X18oKWBgIG1ldGhvZCxcbiAgICAgIHRoZSBjbGFzcyBtdXN0IGJlIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50cy5cblxuICAgQ2xhc3MgaW5zdGFuY2VzXG4gICAgICBDbGFzcyBpbnN0YW5jZXMgYXJlIGRlc2NyaWJlZCBiZWxvdy4gIENsYXNzIGluc3RhbmNlcyBhcmVcbiAgICAgIGNhbGxhYmxlIG9ubHkgd2hlbiB0aGUgY2xhc3MgaGFzIGEgYGBfX2NhbGxfXygpYGAgbWV0aG9kO1xuICAgICAgYGB4KGFyZ3VtZW50cylgYCBpcyBhIHNob3J0aGFuZCBmb3IgYGB4Ll9fY2FsbF9fKGFyZ3VtZW50cylgYC5cblxuTW9kdWxlc1xuICAgTW9kdWxlcyBhcmUgaW1wb3J0ZWQgYnkgdGhlIGBgaW1wb3J0YGAgc3RhdGVtZW50IChzZWUgc2VjdGlvbiAqVGhlXG4gICBpbXBvcnQgc3RhdGVtZW50KikuIEEgbW9kdWxlIG9iamVjdCBoYXMgYSBuYW1lc3BhY2UgaW1wbGVtZW50ZWQgYnlcbiAgIGEgZGljdGlvbmFyeSBvYmplY3QgKHRoaXMgaXMgdGhlIGRpY3Rpb25hcnkgcmVmZXJlbmNlZCBieSB0aGVcbiAgIGZ1bmNfZ2xvYmFscyBhdHRyaWJ1dGUgb2YgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1vZHVsZSkuXG4gICBBdHRyaWJ1dGUgcmVmZXJlbmNlcyBhcmUgdHJhbnNsYXRlZCB0byBsb29rdXBzIGluIHRoaXMgZGljdGlvbmFyeSxcbiAgIGUuZy4sIGBgbS54YGAgaXMgZXF1aXZhbGVudCB0byBgYG0uX19kaWN0X19bIngiXWBgLiBBIG1vZHVsZSBvYmplY3RcbiAgIGRvZXMgbm90IGNvbnRhaW4gdGhlIGNvZGUgb2JqZWN0IHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgbW9kdWxlXG4gICAoc2luY2UgaXQgaXNuXCd0IG5lZWRlZCBvbmNlIHRoZSBpbml0aWFsaXphdGlvbiBpcyBkb25lKS5cblxuICAgQXR0cmlidXRlIGFzc2lnbm1lbnQgdXBkYXRlcyB0aGUgbW9kdWxlXCdzIG5hbWVzcGFjZSBkaWN0aW9uYXJ5LFxuICAgZS5nLiwgYGBtLnggPSAxYGAgaXMgZXF1aXZhbGVudCB0byBgYG0uX19kaWN0X19bIngiXSA9IDFgYC5cblxuICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlOiBgYF9fZGljdF9fYGAgaXMgdGhlIG1vZHVsZVwncyBuYW1lc3BhY2VcbiAgIGFzIGEgZGljdGlvbmFyeSBvYmplY3QuXG5cbiAgICoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogQmVjYXVzZSBvZiB0aGUgd2F5IENQeXRob25cbiAgIGNsZWFycyBtb2R1bGUgZGljdGlvbmFyaWVzLCB0aGUgbW9kdWxlIGRpY3Rpb25hcnkgd2lsbCBiZSBjbGVhcmVkXG4gICB3aGVuIHRoZSBtb2R1bGUgZmFsbHMgb3V0IG9mIHNjb3BlIGV2ZW4gaWYgdGhlIGRpY3Rpb25hcnkgc3RpbGwgaGFzXG4gICBsaXZlIHJlZmVyZW5jZXMuICBUbyBhdm9pZCB0aGlzLCBjb3B5IHRoZSBkaWN0aW9uYXJ5IG9yIGtlZXAgdGhlXG4gICBtb2R1bGUgYXJvdW5kIHdoaWxlIHVzaW5nIGl0cyBkaWN0aW9uYXJ5IGRpcmVjdGx5LlxuXG4gICBQcmVkZWZpbmVkICh3cml0YWJsZSkgYXR0cmlidXRlczogYGBfX25hbWVfX2BgIGlzIHRoZSBtb2R1bGVcJ3NcbiAgIG5hbWU7IGBgX19kb2NfX2BgIGlzIHRoZSBtb2R1bGVcJ3MgZG9jdW1lbnRhdGlvbiBzdHJpbmcsIG9yIGBgTm9uZWBgXG4gICBpZiB1bmF2YWlsYWJsZTsgYGBfX2ZpbGVfX2BgIGlzIHRoZSBwYXRobmFtZSBvZiB0aGUgZmlsZSBmcm9tIHdoaWNoXG4gICB0aGUgbW9kdWxlIHdhcyBsb2FkZWQsIGlmIGl0IHdhcyBsb2FkZWQgZnJvbSBhIGZpbGUuIFRoZVxuICAgYGBfX2ZpbGVfX2BgIGF0dHJpYnV0ZSBpcyBub3QgcHJlc2VudCBmb3IgQyBtb2R1bGVzIHRoYXQgYXJlXG4gICBzdGF0aWNhbGx5IGxpbmtlZCBpbnRvIHRoZSBpbnRlcnByZXRlcjsgZm9yIGV4dGVuc2lvbiBtb2R1bGVzXG4gICBsb2FkZWQgZHluYW1pY2FsbHkgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LCBpdCBpcyB0aGUgcGF0aG5hbWUgb2YgdGhlXG4gICBzaGFyZWQgbGlicmFyeSBmaWxlLlxuXG5DbGFzc2VzXG4gICBCb3RoIGNsYXNzIHR5cGVzIChuZXctc3R5bGUgY2xhc3NlcykgYW5kIGNsYXNzIG9iamVjdHMgKG9sZC1cbiAgIHN0eWxlL2NsYXNzaWMgY2xhc3NlcykgYXJlIHR5cGljYWxseSBjcmVhdGVkIGJ5IGNsYXNzIGRlZmluaXRpb25zXG4gICAoc2VlIHNlY3Rpb24gKkNsYXNzIGRlZmluaXRpb25zKikuICBBIGNsYXNzIGhhcyBhIG5hbWVzcGFjZVxuICAgaW1wbGVtZW50ZWQgYnkgYSBkaWN0aW9uYXJ5IG9iamVjdC4gQ2xhc3MgYXR0cmlidXRlIHJlZmVyZW5jZXMgYXJlXG4gICB0cmFuc2xhdGVkIHRvIGxvb2t1cHMgaW4gdGhpcyBkaWN0aW9uYXJ5LCBlLmcuLCBgYEMueGBgIGlzXG4gICB0cmFuc2xhdGVkIHRvIGBgQy5fX2RpY3RfX1sieCJdYGAgKGFsdGhvdWdoIGZvciBuZXctc3R5bGUgY2xhc3Nlc1xuICAgaW4gcGFydGljdWxhciB0aGVyZSBhcmUgYSBudW1iZXIgb2YgaG9va3Mgd2hpY2ggYWxsb3cgZm9yIG90aGVyXG4gICBtZWFucyBvZiBsb2NhdGluZyBhdHRyaWJ1dGVzKS4gV2hlbiB0aGUgYXR0cmlidXRlIG5hbWUgaXMgbm90IGZvdW5kXG4gICB0aGVyZSwgdGhlIGF0dHJpYnV0ZSBzZWFyY2ggY29udGludWVzIGluIHRoZSBiYXNlIGNsYXNzZXMuICBGb3JcbiAgIG9sZC1zdHlsZSBjbGFzc2VzLCB0aGUgc2VhcmNoIGlzIGRlcHRoLWZpcnN0LCBsZWZ0LXRvLXJpZ2h0IGluIHRoZVxuICAgb3JkZXIgb2Ygb2NjdXJyZW5jZSBpbiB0aGUgYmFzZSBjbGFzcyBsaXN0LiBOZXctc3R5bGUgY2xhc3NlcyB1c2VcbiAgIHRoZSBtb3JlIGNvbXBsZXggQzMgbWV0aG9kIHJlc29sdXRpb24gb3JkZXIgd2hpY2ggYmVoYXZlcyBjb3JyZWN0bHlcbiAgIGV2ZW4gaW4gdGhlIHByZXNlbmNlIG9mIFwnZGlhbW9uZFwnIGluaGVyaXRhbmNlIHN0cnVjdHVyZXMgd2hlcmVcbiAgIHRoZXJlIGFyZSBtdWx0aXBsZSBpbmhlcml0YW5jZSBwYXRocyBsZWFkaW5nIGJhY2sgdG8gYSBjb21tb25cbiAgIGFuY2VzdG9yLiBBZGRpdGlvbmFsIGRldGFpbHMgb24gdGhlIEMzIE1STyB1c2VkIGJ5IG5ldy1zdHlsZVxuICAgY2xhc3NlcyBjYW4gYmUgZm91bmQgaW4gdGhlIGRvY3VtZW50YXRpb24gYWNjb21wYW55aW5nIHRoZSAyLjNcbiAgIHJlbGVhc2UgYXQgaHR0cDovL3d3dy5weXRob24ub3JnL2Rvd25sb2FkL3JlbGVhc2VzLzIuMy9tcm8vLlxuXG4gICBXaGVuIGEgY2xhc3MgYXR0cmlidXRlIHJlZmVyZW5jZSAoZm9yIGNsYXNzIGBgQ2BgLCBzYXkpIHdvdWxkIHlpZWxkXG4gICBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBvYmplY3Qgb3IgYW4gdW5ib3VuZCB1c2VyLWRlZmluZWQgbWV0aG9kXG4gICBvYmplY3Qgd2hvc2UgYXNzb2NpYXRlZCBjbGFzcyBpcyBlaXRoZXIgYGBDYGAgb3Igb25lIG9mIGl0cyBiYXNlXG4gICBjbGFzc2VzLCBpdCBpcyB0cmFuc2Zvcm1lZCBpbnRvIGFuIHVuYm91bmQgdXNlci1kZWZpbmVkIG1ldGhvZFxuICAgb2JqZWN0IHdob3NlIGBgaW1fY2xhc3NgYCBhdHRyaWJ1dGUgaXMgYGBDYGAuIFdoZW4gaXQgd291bGQgeWllbGQgYVxuICAgY2xhc3MgbWV0aG9kIG9iamVjdCwgaXQgaXMgdHJhbnNmb3JtZWQgaW50byBhIGJvdW5kIHVzZXItZGVmaW5lZFxuICAgbWV0aG9kIG9iamVjdCB3aG9zZSBgYGltX3NlbGZgYCBhdHRyaWJ1dGUgaXMgYGBDYGAuICBXaGVuIGl0IHdvdWxkXG4gICB5aWVsZCBhIHN0YXRpYyBtZXRob2Qgb2JqZWN0LCBpdCBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBvYmplY3RcbiAgIHdyYXBwZWQgYnkgdGhlIHN0YXRpYyBtZXRob2Qgb2JqZWN0LiBTZWUgc2VjdGlvbiAqSW1wbGVtZW50aW5nXG4gICBEZXNjcmlwdG9ycyogZm9yIGFub3RoZXIgd2F5IGluIHdoaWNoIGF0dHJpYnV0ZXMgcmV0cmlldmVkIGZyb20gYVxuICAgY2xhc3MgbWF5IGRpZmZlciBmcm9tIHRob3NlIGFjdHVhbGx5IGNvbnRhaW5lZCBpbiBpdHMgYGBfX2RpY3RfX2BgXG4gICAobm90ZSB0aGF0IG9ubHkgbmV3LXN0eWxlIGNsYXNzZXMgc3VwcG9ydCBkZXNjcmlwdG9ycykuXG5cbiAgIENsYXNzIGF0dHJpYnV0ZSBhc3NpZ25tZW50cyB1cGRhdGUgdGhlIGNsYXNzXCdzIGRpY3Rpb25hcnksIG5ldmVyXG4gICB0aGUgZGljdGlvbmFyeSBvZiBhIGJhc2UgY2xhc3MuXG5cbiAgIEEgY2xhc3Mgb2JqZWN0IGNhbiBiZSBjYWxsZWQgKHNlZSBhYm92ZSkgdG8geWllbGQgYSBjbGFzcyBpbnN0YW5jZVxuICAgKHNlZSBiZWxvdykuXG5cbiAgIFNwZWNpYWwgYXR0cmlidXRlczogYGBfX25hbWVfX2BgIGlzIHRoZSBjbGFzcyBuYW1lOyBgYF9fbW9kdWxlX19gYFxuICAgaXMgdGhlIG1vZHVsZSBuYW1lIGluIHdoaWNoIHRoZSBjbGFzcyB3YXMgZGVmaW5lZDsgYGBfX2RpY3RfX2BgIGlzXG4gICB0aGUgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBjbGFzc1wncyBuYW1lc3BhY2U7IGBgX19iYXNlc19fYGAgaXMgYVxuICAgdHVwbGUgKHBvc3NpYmx5IGVtcHR5IG9yIGEgc2luZ2xldG9uKSBjb250YWluaW5nIHRoZSBiYXNlIGNsYXNzZXMsXG4gICBpbiB0aGUgb3JkZXIgb2YgdGhlaXIgb2NjdXJyZW5jZSBpbiB0aGUgYmFzZSBjbGFzcyBsaXN0O1xuICAgYGBfX2RvY19fYGAgaXMgdGhlIGNsYXNzXCdzIGRvY3VtZW50YXRpb24gc3RyaW5nLCBvciBOb25lIGlmXG4gICB1bmRlZmluZWQuXG5cbkNsYXNzIGluc3RhbmNlc1xuICAgQSBjbGFzcyBpbnN0YW5jZSBpcyBjcmVhdGVkIGJ5IGNhbGxpbmcgYSBjbGFzcyBvYmplY3QgKHNlZSBhYm92ZSkuXG4gICBBIGNsYXNzIGluc3RhbmNlIGhhcyBhIG5hbWVzcGFjZSBpbXBsZW1lbnRlZCBhcyBhIGRpY3Rpb25hcnkgd2hpY2hcbiAgIGlzIHRoZSBmaXJzdCBwbGFjZSBpbiB3aGljaCBhdHRyaWJ1dGUgcmVmZXJlbmNlcyBhcmUgc2VhcmNoZWQuXG4gICBXaGVuIGFuIGF0dHJpYnV0ZSBpcyBub3QgZm91bmQgdGhlcmUsIGFuZCB0aGUgaW5zdGFuY2VcJ3MgY2xhc3MgaGFzXG4gICBhbiBhdHRyaWJ1dGUgYnkgdGhhdCBuYW1lLCB0aGUgc2VhcmNoIGNvbnRpbnVlcyB3aXRoIHRoZSBjbGFzc1xuICAgYXR0cmlidXRlcy4gIElmIGEgY2xhc3MgYXR0cmlidXRlIGlzIGZvdW5kIHRoYXQgaXMgYSB1c2VyLWRlZmluZWRcbiAgIGZ1bmN0aW9uIG9iamVjdCBvciBhbiB1bmJvdW5kIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0IHdob3NlXG4gICBhc3NvY2lhdGVkIGNsYXNzIGlzIHRoZSBjbGFzcyAoY2FsbCBpdCBgYENgYCkgb2YgdGhlIGluc3RhbmNlIGZvclxuICAgd2hpY2ggdGhlIGF0dHJpYnV0ZSByZWZlcmVuY2Ugd2FzIGluaXRpYXRlZCBvciBvbmUgb2YgaXRzIGJhc2VzLCBpdFxuICAgaXMgdHJhbnNmb3JtZWQgaW50byBhIGJvdW5kIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0IHdob3NlXG4gICBgYGltX2NsYXNzYGAgYXR0cmlidXRlIGlzIGBgQ2BgIGFuZCB3aG9zZSBgYGltX3NlbGZgYCBhdHRyaWJ1dGUgaXNcbiAgIHRoZSBpbnN0YW5jZS4gU3RhdGljIG1ldGhvZCBhbmQgY2xhc3MgbWV0aG9kIG9iamVjdHMgYXJlIGFsc29cbiAgIHRyYW5zZm9ybWVkLCBhcyBpZiB0aGV5IGhhZCBiZWVuIHJldHJpZXZlZCBmcm9tIGNsYXNzIGBgQ2BgOyBzZWVcbiAgIGFib3ZlIHVuZGVyICJDbGFzc2VzIi4gU2VlIHNlY3Rpb24gKkltcGxlbWVudGluZyBEZXNjcmlwdG9ycyogZm9yXG4gICBhbm90aGVyIHdheSBpbiB3aGljaCBhdHRyaWJ1dGVzIG9mIGEgY2xhc3MgcmV0cmlldmVkIHZpYSBpdHNcbiAgIGluc3RhbmNlcyBtYXkgZGlmZmVyIGZyb20gdGhlIG9iamVjdHMgYWN0dWFsbHkgc3RvcmVkIGluIHRoZVxuICAgY2xhc3NcJ3MgYGBfX2RpY3RfX2BgLiBJZiBubyBjbGFzcyBhdHRyaWJ1dGUgaXMgZm91bmQsIGFuZCB0aGVcbiAgIG9iamVjdFwncyBjbGFzcyBoYXMgYSBgYF9fZ2V0YXR0cl9fKClgYCBtZXRob2QsIHRoYXQgaXMgY2FsbGVkIHRvXG4gICBzYXRpc2Z5IHRoZSBsb29rdXAuXG5cbiAgIEF0dHJpYnV0ZSBhc3NpZ25tZW50cyBhbmQgZGVsZXRpb25zIHVwZGF0ZSB0aGUgaW5zdGFuY2VcJ3NcbiAgIGRpY3Rpb25hcnksIG5ldmVyIGEgY2xhc3NcJ3MgZGljdGlvbmFyeS4gIElmIHRoZSBjbGFzcyBoYXMgYVxuICAgYGBfX3NldGF0dHJfXygpYGAgb3IgYGBfX2RlbGF0dHJfXygpYGAgbWV0aG9kLCB0aGlzIGlzIGNhbGxlZFxuICAgaW5zdGVhZCBvZiB1cGRhdGluZyB0aGUgaW5zdGFuY2UgZGljdGlvbmFyeSBkaXJlY3RseS5cblxuICAgQ2xhc3MgaW5zdGFuY2VzIGNhbiBwcmV0ZW5kIHRvIGJlIG51bWJlcnMsIHNlcXVlbmNlcywgb3IgbWFwcGluZ3NcbiAgIGlmIHRoZXkgaGF2ZSBtZXRob2RzIHdpdGggY2VydGFpbiBzcGVjaWFsIG5hbWVzLiAgU2VlIHNlY3Rpb25cbiAgICpTcGVjaWFsIG1ldGhvZCBuYW1lcyouXG5cbiAgIFNwZWNpYWwgYXR0cmlidXRlczogYGBfX2RpY3RfX2BgIGlzIHRoZSBhdHRyaWJ1dGUgZGljdGlvbmFyeTtcbiAgIGBgX19jbGFzc19fYGAgaXMgdGhlIGluc3RhbmNlXCdzIGNsYXNzLlxuXG5GaWxlc1xuICAgQSBmaWxlIG9iamVjdCByZXByZXNlbnRzIGFuIG9wZW4gZmlsZS4gIEZpbGUgb2JqZWN0cyBhcmUgY3JlYXRlZCBieVxuICAgdGhlIGBgb3BlbigpYGAgYnVpbHQtaW4gZnVuY3Rpb24sIGFuZCBhbHNvIGJ5IGBgb3MucG9wZW4oKWBgLFxuICAgYGBvcy5mZG9wZW4oKWBgLCBhbmQgdGhlIGBgbWFrZWZpbGUoKWBgIG1ldGhvZCBvZiBzb2NrZXQgb2JqZWN0c1xuICAgKGFuZCBwZXJoYXBzIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBtZXRob2RzIHByb3ZpZGVkIGJ5IGV4dGVuc2lvblxuICAgbW9kdWxlcykuICBUaGUgb2JqZWN0cyBgYHN5cy5zdGRpbmBgLCBgYHN5cy5zdGRvdXRgYCBhbmRcbiAgIGBgc3lzLnN0ZGVycmBgIGFyZSBpbml0aWFsaXplZCB0byBmaWxlIG9iamVjdHMgY29ycmVzcG9uZGluZyB0byB0aGVcbiAgIGludGVycHJldGVyXCdzIHN0YW5kYXJkIGlucHV0LCBvdXRwdXQgYW5kIGVycm9yIHN0cmVhbXMuICBTZWUgKkZpbGVcbiAgIE9iamVjdHMqIGZvciBjb21wbGV0ZSBkb2N1bWVudGF0aW9uIG9mIGZpbGUgb2JqZWN0cy5cblxuSW50ZXJuYWwgdHlwZXNcbiAgIEEgZmV3IHR5cGVzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgaW50ZXJwcmV0ZXIgYXJlIGV4cG9zZWQgdG8gdGhlXG4gICB1c2VyLiBUaGVpciBkZWZpbml0aW9ucyBtYXkgY2hhbmdlIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIHRoZVxuICAgaW50ZXJwcmV0ZXIsIGJ1dCB0aGV5IGFyZSBtZW50aW9uZWQgaGVyZSBmb3IgY29tcGxldGVuZXNzLlxuXG4gICBDb2RlIG9iamVjdHNcbiAgICAgIENvZGUgb2JqZWN0cyByZXByZXNlbnQgKmJ5dGUtY29tcGlsZWQqIGV4ZWN1dGFibGUgUHl0aG9uIGNvZGUsXG4gICAgICBvciAqYnl0ZWNvZGUqLiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgY29kZSBvYmplY3QgYW5kIGFcbiAgICAgIGZ1bmN0aW9uIG9iamVjdCBpcyB0aGF0IHRoZSBmdW5jdGlvbiBvYmplY3QgY29udGFpbnMgYW4gZXhwbGljaXRcbiAgICAgIHJlZmVyZW5jZSB0byB0aGUgZnVuY3Rpb25cJ3MgZ2xvYmFscyAodGhlIG1vZHVsZSBpbiB3aGljaCBpdCB3YXNcbiAgICAgIGRlZmluZWQpLCB3aGlsZSBhIGNvZGUgb2JqZWN0IGNvbnRhaW5zIG5vIGNvbnRleHQ7IGFsc28gdGhlXG4gICAgICBkZWZhdWx0IGFyZ3VtZW50IHZhbHVlcyBhcmUgc3RvcmVkIGluIHRoZSBmdW5jdGlvbiBvYmplY3QsIG5vdFxuICAgICAgaW4gdGhlIGNvZGUgb2JqZWN0IChiZWNhdXNlIHRoZXkgcmVwcmVzZW50IHZhbHVlcyBjYWxjdWxhdGVkIGF0XG4gICAgICBydW4tdGltZSkuICBVbmxpa2UgZnVuY3Rpb24gb2JqZWN0cywgY29kZSBvYmplY3RzIGFyZSBpbW11dGFibGVcbiAgICAgIGFuZCBjb250YWluIG5vIHJlZmVyZW5jZXMgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIHRvIG11dGFibGVcbiAgICAgIG9iamVjdHMuXG5cbiAgICAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6IGBgY29fbmFtZWBgIGdpdmVzIHRoZSBmdW5jdGlvblxuICAgICAgbmFtZTsgYGBjb19hcmdjb3VudGBgIGlzIHRoZSBudW1iZXIgb2YgcG9zaXRpb25hbCBhcmd1bWVudHNcbiAgICAgIChpbmNsdWRpbmcgYXJndW1lbnRzIHdpdGggZGVmYXVsdCB2YWx1ZXMpOyBgYGNvX25sb2NhbHNgYCBpcyB0aGVcbiAgICAgIG51bWJlciBvZiBsb2NhbCB2YXJpYWJsZXMgdXNlZCBieSB0aGUgZnVuY3Rpb24gKGluY2x1ZGluZ1xuICAgICAgYXJndW1lbnRzKTsgYGBjb192YXJuYW1lc2BgIGlzIGEgdHVwbGUgY29udGFpbmluZyB0aGUgbmFtZXMgb2ZcbiAgICAgIHRoZSBsb2NhbCB2YXJpYWJsZXMgKHN0YXJ0aW5nIHdpdGggdGhlIGFyZ3VtZW50IG5hbWVzKTtcbiAgICAgIGBgY29fY2VsbHZhcnNgYCBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGxvY2FsXG4gICAgICB2YXJpYWJsZXMgdGhhdCBhcmUgcmVmZXJlbmNlZCBieSBuZXN0ZWQgZnVuY3Rpb25zO1xuICAgICAgYGBjb19mcmVldmFyc2BgIGlzIGEgdHVwbGUgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgZnJlZVxuICAgICAgdmFyaWFibGVzOyBgYGNvX2NvZGVgYCBpcyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHNlcXVlbmNlIG9mXG4gICAgICBieXRlY29kZSBpbnN0cnVjdGlvbnM7IGBgY29fY29uc3RzYGAgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZVxuICAgICAgbGl0ZXJhbHMgdXNlZCBieSB0aGUgYnl0ZWNvZGU7IGBgY29fbmFtZXNgYCBpcyBhIHR1cGxlXG4gICAgICBjb250YWluaW5nIHRoZSBuYW1lcyB1c2VkIGJ5IHRoZSBieXRlY29kZTsgYGBjb19maWxlbmFtZWBgIGlzXG4gICAgICB0aGUgZmlsZW5hbWUgZnJvbSB3aGljaCB0aGUgY29kZSB3YXMgY29tcGlsZWQ7XG4gICAgICBgYGNvX2ZpcnN0bGluZW5vYGAgaXMgdGhlIGZpcnN0IGxpbmUgbnVtYmVyIG9mIHRoZSBmdW5jdGlvbjtcbiAgICAgIGBgY29fbG5vdGFiYGAgaXMgYSBzdHJpbmcgZW5jb2RpbmcgdGhlIG1hcHBpbmcgZnJvbSBieXRlY29kZVxuICAgICAgb2Zmc2V0cyB0byBsaW5lIG51bWJlcnMgKGZvciBkZXRhaWxzIHNlZSB0aGUgc291cmNlIGNvZGUgb2YgdGhlXG4gICAgICBpbnRlcnByZXRlcik7IGBgY29fc3RhY2tzaXplYGAgaXMgdGhlIHJlcXVpcmVkIHN0YWNrIHNpemVcbiAgICAgIChpbmNsdWRpbmcgbG9jYWwgdmFyaWFibGVzKTsgYGBjb19mbGFnc2BgIGlzIGFuIGludGVnZXIgZW5jb2RpbmdcbiAgICAgIGEgbnVtYmVyIG9mIGZsYWdzIGZvciB0aGUgaW50ZXJwcmV0ZXIuXG5cbiAgICAgIFRoZSBmb2xsb3dpbmcgZmxhZyBiaXRzIGFyZSBkZWZpbmVkIGZvciBgYGNvX2ZsYWdzYGA6IGJpdFxuICAgICAgYGAweDA0YGAgaXMgc2V0IGlmIHRoZSBmdW5jdGlvbiB1c2VzIHRoZSBgYCphcmd1bWVudHNgYCBzeW50YXhcbiAgICAgIHRvIGFjY2VwdCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHBvc2l0aW9uYWwgYXJndW1lbnRzOyBiaXRcbiAgICAgIGBgMHgwOGBgIGlzIHNldCBpZiB0aGUgZnVuY3Rpb24gdXNlcyB0aGUgYGAqKmtleXdvcmRzYGAgc3ludGF4XG4gICAgICB0byBhY2NlcHQgYXJiaXRyYXJ5IGtleXdvcmQgYXJndW1lbnRzOyBiaXQgYGAweDIwYGAgaXMgc2V0IGlmXG4gICAgICB0aGUgZnVuY3Rpb24gaXMgYSBnZW5lcmF0b3IuXG5cbiAgICAgIEZ1dHVyZSBmZWF0dXJlIGRlY2xhcmF0aW9ucyAoYGBmcm9tIF9fZnV0dXJlX18gaW1wb3J0XG4gICAgICBkaXZpc2lvbmBgKSBhbHNvIHVzZSBiaXRzIGluIGBgY29fZmxhZ3NgYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGFcbiAgICAgIGNvZGUgb2JqZWN0IHdhcyBjb21waWxlZCB3aXRoIGEgcGFydGljdWxhciBmZWF0dXJlIGVuYWJsZWQ6IGJpdFxuICAgICAgYGAweDIwMDBgYCBpcyBzZXQgaWYgdGhlIGZ1bmN0aW9uIHdhcyBjb21waWxlZCB3aXRoIGZ1dHVyZVxuICAgICAgZGl2aXNpb24gZW5hYmxlZDsgYml0cyBgYDB4MTBgYCBhbmQgYGAweDEwMDBgYCB3ZXJlIHVzZWQgaW5cbiAgICAgIGVhcmxpZXIgdmVyc2lvbnMgb2YgUHl0aG9uLlxuXG4gICAgICBPdGhlciBiaXRzIGluIGBgY29fZmxhZ3NgYCBhcmUgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZS5cblxuICAgICAgSWYgYSBjb2RlIG9iamVjdCByZXByZXNlbnRzIGEgZnVuY3Rpb24sIHRoZSBmaXJzdCBpdGVtIGluXG4gICAgICBgYGNvX2NvbnN0c2BgIGlzIHRoZSBkb2N1bWVudGF0aW9uIHN0cmluZyBvZiB0aGUgZnVuY3Rpb24sIG9yXG4gICAgICBgYE5vbmVgYCBpZiB1bmRlZmluZWQuXG5cbiAgIEZyYW1lIG9iamVjdHNcbiAgICAgIEZyYW1lIG9iamVjdHMgcmVwcmVzZW50IGV4ZWN1dGlvbiBmcmFtZXMuICBUaGV5IG1heSBvY2N1ciBpblxuICAgICAgdHJhY2ViYWNrIG9iamVjdHMgKHNlZSBiZWxvdykuXG5cbiAgICAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6IGBgZl9iYWNrYGAgaXMgdG8gdGhlIHByZXZpb3VzXG4gICAgICBzdGFjayBmcmFtZSAodG93YXJkcyB0aGUgY2FsbGVyKSwgb3IgYGBOb25lYGAgaWYgdGhpcyBpcyB0aGVcbiAgICAgIGJvdHRvbSBzdGFjayBmcmFtZTsgYGBmX2NvZGVgYCBpcyB0aGUgY29kZSBvYmplY3QgYmVpbmcgZXhlY3V0ZWRcbiAgICAgIGluIHRoaXMgZnJhbWU7IGBgZl9sb2NhbHNgYCBpcyB0aGUgZGljdGlvbmFyeSB1c2VkIHRvIGxvb2sgdXBcbiAgICAgIGxvY2FsIHZhcmlhYmxlczsgYGBmX2dsb2JhbHNgYCBpcyB1c2VkIGZvciBnbG9iYWwgdmFyaWFibGVzO1xuICAgICAgYGBmX2J1aWx0aW5zYGAgaXMgdXNlZCBmb3IgYnVpbHQtaW4gKGludHJpbnNpYykgbmFtZXM7XG4gICAgICBgYGZfcmVzdHJpY3RlZGBgIGlzIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGlzXG4gICAgICBleGVjdXRpbmcgaW4gcmVzdHJpY3RlZCBleGVjdXRpb24gbW9kZTsgYGBmX2xhc3RpYGAgZ2l2ZXMgdGhlXG4gICAgICBwcmVjaXNlIGluc3RydWN0aW9uICh0aGlzIGlzIGFuIGluZGV4IGludG8gdGhlIGJ5dGVjb2RlIHN0cmluZ1xuICAgICAgb2YgdGhlIGNvZGUgb2JqZWN0KS5cblxuICAgICAgU3BlY2lhbCB3cml0YWJsZSBhdHRyaWJ1dGVzOiBgYGZfdHJhY2VgYCwgaWYgbm90IGBgTm9uZWBgLCBpcyBhXG4gICAgICBmdW5jdGlvbiBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGNvZGUgbGluZSAodGhpcyBpc1xuICAgICAgdXNlZCBieSB0aGUgZGVidWdnZXIpOyBgYGZfZXhjX3R5cGVgYCwgYGBmX2V4Y192YWx1ZWBgLFxuICAgICAgYGBmX2V4Y190cmFjZWJhY2tgYCByZXByZXNlbnQgdGhlIGxhc3QgZXhjZXB0aW9uIHJhaXNlZCBpbiB0aGVcbiAgICAgIHBhcmVudCBmcmFtZSBwcm92aWRlZCBhbm90aGVyIGV4Y2VwdGlvbiB3YXMgZXZlciByYWlzZWQgaW4gdGhlXG4gICAgICBjdXJyZW50IGZyYW1lIChpbiBhbGwgb3RoZXIgY2FzZXMgdGhleSBhcmUgTm9uZSk7IGBgZl9saW5lbm9gYFxuICAgICAgaXMgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIgb2YgdGhlIGZyYW1lIC0tLSB3cml0aW5nIHRvIHRoaXMgZnJvbVxuICAgICAgd2l0aGluIGEgdHJhY2UgZnVuY3Rpb24ganVtcHMgdG8gdGhlIGdpdmVuIGxpbmUgKG9ubHkgZm9yIHRoZVxuICAgICAgYm90dG9tLW1vc3QgZnJhbWUpLiAgQSBkZWJ1Z2dlciBjYW4gaW1wbGVtZW50IGEgSnVtcCBjb21tYW5kXG4gICAgICAoYWthIFNldCBOZXh0IFN0YXRlbWVudCkgYnkgd3JpdGluZyB0byBmX2xpbmVuby5cblxuICAgVHJhY2ViYWNrIG9iamVjdHNcbiAgICAgIFRyYWNlYmFjayBvYmplY3RzIHJlcHJlc2VudCBhIHN0YWNrIHRyYWNlIG9mIGFuIGV4Y2VwdGlvbi4gIEFcbiAgICAgIHRyYWNlYmFjayBvYmplY3QgaXMgY3JlYXRlZCB3aGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMuICBXaGVuIHRoZVxuICAgICAgc2VhcmNoIGZvciBhbiBleGNlcHRpb24gaGFuZGxlciB1bndpbmRzIHRoZSBleGVjdXRpb24gc3RhY2ssIGF0XG4gICAgICBlYWNoIHVud291bmQgbGV2ZWwgYSB0cmFjZWJhY2sgb2JqZWN0IGlzIGluc2VydGVkIGluIGZyb250IG9mXG4gICAgICB0aGUgY3VycmVudCB0cmFjZWJhY2suICBXaGVuIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIGlzIGVudGVyZWQsXG4gICAgICB0aGUgc3RhY2sgdHJhY2UgaXMgbWFkZSBhdmFpbGFibGUgdG8gdGhlIHByb2dyYW0uIChTZWUgc2VjdGlvblxuICAgICAgKlRoZSB0cnkgc3RhdGVtZW50Ki4pIEl0IGlzIGFjY2Vzc2libGUgYXMgYGBzeXMuZXhjX3RyYWNlYmFja2BgLFxuICAgICAgYW5kIGFsc28gYXMgdGhlIHRoaXJkIGl0ZW0gb2YgdGhlIHR1cGxlIHJldHVybmVkIGJ5XG4gICAgICBgYHN5cy5leGNfaW5mbygpYGAuICBUaGUgbGF0dGVyIGlzIHRoZSBwcmVmZXJyZWQgaW50ZXJmYWNlLFxuICAgICAgc2luY2UgaXQgd29ya3MgY29ycmVjdGx5IHdoZW4gdGhlIHByb2dyYW0gaXMgdXNpbmcgbXVsdGlwbGVcbiAgICAgIHRocmVhZHMuIFdoZW4gdGhlIHByb2dyYW0gY29udGFpbnMgbm8gc3VpdGFibGUgaGFuZGxlciwgdGhlXG4gICAgICBzdGFjayB0cmFjZSBpcyB3cml0dGVuIChuaWNlbHkgZm9ybWF0dGVkKSB0byB0aGUgc3RhbmRhcmQgZXJyb3JcbiAgICAgIHN0cmVhbTsgaWYgdGhlIGludGVycHJldGVyIGlzIGludGVyYWN0aXZlLCBpdCBpcyBhbHNvIG1hZGVcbiAgICAgIGF2YWlsYWJsZSB0byB0aGUgdXNlciBhcyBgYHN5cy5sYXN0X3RyYWNlYmFja2BgLlxuXG4gICAgICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiBgYHRiX25leHRgYCBpcyB0aGUgbmV4dCBsZXZlbCBpblxuICAgICAgdGhlIHN0YWNrIHRyYWNlICh0b3dhcmRzIHRoZSBmcmFtZSB3aGVyZSB0aGUgZXhjZXB0aW9uXG4gICAgICBvY2N1cnJlZCksIG9yIGBgTm9uZWBgIGlmIHRoZXJlIGlzIG5vIG5leHQgbGV2ZWw7IGBgdGJfZnJhbWVgYFxuICAgICAgcG9pbnRzIHRvIHRoZSBleGVjdXRpb24gZnJhbWUgb2YgdGhlIGN1cnJlbnQgbGV2ZWw7XG4gICAgICBgYHRiX2xpbmVub2BgIGdpdmVzIHRoZSBsaW5lIG51bWJlciB3aGVyZSB0aGUgZXhjZXB0aW9uXG4gICAgICBvY2N1cnJlZDsgYGB0Yl9sYXN0aWBgIGluZGljYXRlcyB0aGUgcHJlY2lzZSBpbnN0cnVjdGlvbi4gIFRoZVxuICAgICAgbGluZSBudW1iZXIgYW5kIGxhc3QgaW5zdHJ1Y3Rpb24gaW4gdGhlIHRyYWNlYmFjayBtYXkgZGlmZmVyXG4gICAgICBmcm9tIHRoZSBsaW5lIG51bWJlciBvZiBpdHMgZnJhbWUgb2JqZWN0IGlmIHRoZSBleGNlcHRpb25cbiAgICAgIG9jY3VycmVkIGluIGEgYGB0cnlgYCBzdGF0ZW1lbnQgd2l0aCBubyBtYXRjaGluZyBleGNlcHQgY2xhdXNlXG4gICAgICBvciB3aXRoIGEgZmluYWxseSBjbGF1c2UuXG5cbiAgIFNsaWNlIG9iamVjdHNcbiAgICAgIFNsaWNlIG9iamVjdHMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHNsaWNlcyB3aGVuICpleHRlbmRlZCBzbGljZVxuICAgICAgc3ludGF4KiBpcyB1c2VkLiBUaGlzIGlzIGEgc2xpY2UgdXNpbmcgdHdvIGNvbG9ucywgb3IgbXVsdGlwbGVcbiAgICAgIHNsaWNlcyBvciBlbGxpcHNlcyBzZXBhcmF0ZWQgYnkgY29tbWFzLCBlLmcuLCBgYGFbaTpqOnN0ZXBdYGAsXG4gICAgICBgYGFbaTpqLCBrOmxdYGAsIG9yIGBgYVsuLi4sIGk6al1gYC4gIFRoZXkgYXJlIGFsc28gY3JlYXRlZCBieVxuICAgICAgdGhlIGJ1aWx0LWluIGBgc2xpY2UoKWBgIGZ1bmN0aW9uLlxuXG4gICAgICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiBgYHN0YXJ0YGAgaXMgdGhlIGxvd2VyIGJvdW5kO1xuICAgICAgYGBzdG9wYGAgaXMgdGhlIHVwcGVyIGJvdW5kOyBgYHN0ZXBgYCBpcyB0aGUgc3RlcCB2YWx1ZTsgZWFjaCBpc1xuICAgICAgYGBOb25lYGAgaWYgb21pdHRlZC4gIFRoZXNlIGF0dHJpYnV0ZXMgY2FuIGhhdmUgYW55IHR5cGUuXG5cbiAgICAgIFNsaWNlIG9iamVjdHMgc3VwcG9ydCBvbmUgbWV0aG9kOlxuXG4gICAgICBzbGljZS5pbmRpY2VzKHNlbGYsIGxlbmd0aClcblxuICAgICAgICAgVGhpcyBtZXRob2QgdGFrZXMgYSBzaW5nbGUgaW50ZWdlciBhcmd1bWVudCAqbGVuZ3RoKiBhbmRcbiAgICAgICAgIGNvbXB1dGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleHRlbmRlZCBzbGljZSB0aGF0IHRoZSBzbGljZVxuICAgICAgICAgb2JqZWN0IHdvdWxkIGRlc2NyaWJlIGlmIGFwcGxpZWQgdG8gYSBzZXF1ZW5jZSBvZiAqbGVuZ3RoKlxuICAgICAgICAgaXRlbXMuICBJdCByZXR1cm5zIGEgdHVwbGUgb2YgdGhyZWUgaW50ZWdlcnM7IHJlc3BlY3RpdmVseVxuICAgICAgICAgdGhlc2UgYXJlIHRoZSAqc3RhcnQqIGFuZCAqc3RvcCogaW5kaWNlcyBhbmQgdGhlICpzdGVwKiBvclxuICAgICAgICAgc3RyaWRlIGxlbmd0aCBvZiB0aGUgc2xpY2UuIE1pc3Npbmcgb3Igb3V0LW9mLWJvdW5kcyBpbmRpY2VzXG4gICAgICAgICBhcmUgaGFuZGxlZCBpbiBhIG1hbm5lciBjb25zaXN0ZW50IHdpdGggcmVndWxhciBzbGljZXMuXG5cbiAgICAgICAgIE5ldyBpbiB2ZXJzaW9uIDIuMy5cblxuICAgU3RhdGljIG1ldGhvZCBvYmplY3RzXG4gICAgICBTdGF0aWMgbWV0aG9kIG9iamVjdHMgcHJvdmlkZSBhIHdheSBvZiBkZWZlYXRpbmcgdGhlXG4gICAgICB0cmFuc2Zvcm1hdGlvbiBvZiBmdW5jdGlvbiBvYmplY3RzIHRvIG1ldGhvZCBvYmplY3RzIGRlc2NyaWJlZFxuICAgICAgYWJvdmUuIEEgc3RhdGljIG1ldGhvZCBvYmplY3QgaXMgYSB3cmFwcGVyIGFyb3VuZCBhbnkgb3RoZXJcbiAgICAgIG9iamVjdCwgdXN1YWxseSBhIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0LiBXaGVuIGEgc3RhdGljXG4gICAgICBtZXRob2Qgb2JqZWN0IGlzIHJldHJpZXZlZCBmcm9tIGEgY2xhc3Mgb3IgYSBjbGFzcyBpbnN0YW5jZSwgdGhlXG4gICAgICBvYmplY3QgYWN0dWFsbHkgcmV0dXJuZWQgaXMgdGhlIHdyYXBwZWQgb2JqZWN0LCB3aGljaCBpcyBub3RcbiAgICAgIHN1YmplY3QgdG8gYW55IGZ1cnRoZXIgdHJhbnNmb3JtYXRpb24uIFN0YXRpYyBtZXRob2Qgb2JqZWN0cyBhcmVcbiAgICAgIG5vdCB0aGVtc2VsdmVzIGNhbGxhYmxlLCBhbHRob3VnaCB0aGUgb2JqZWN0cyB0aGV5IHdyYXAgdXN1YWxseVxuICAgICAgYXJlLiBTdGF0aWMgbWV0aG9kIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgdGhlIGJ1aWx0LWluXG4gICAgICBgYHN0YXRpY21ldGhvZCgpYGAgY29uc3RydWN0b3IuXG5cbiAgIENsYXNzIG1ldGhvZCBvYmplY3RzXG4gICAgICBBIGNsYXNzIG1ldGhvZCBvYmplY3QsIGxpa2UgYSBzdGF0aWMgbWV0aG9kIG9iamVjdCwgaXMgYSB3cmFwcGVyXG4gICAgICBhcm91bmQgYW5vdGhlciBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIHdheSBpbiB3aGljaCB0aGF0IG9iamVjdFxuICAgICAgaXMgcmV0cmlldmVkIGZyb20gY2xhc3NlcyBhbmQgY2xhc3MgaW5zdGFuY2VzLiBUaGUgYmVoYXZpb3VyIG9mXG4gICAgICBjbGFzcyBtZXRob2Qgb2JqZWN0cyB1cG9uIHN1Y2ggcmV0cmlldmFsIGlzIGRlc2NyaWJlZCBhYm92ZSxcbiAgICAgIHVuZGVyICJVc2VyLWRlZmluZWQgbWV0aG9kcyIuIENsYXNzIG1ldGhvZCBvYmplY3RzIGFyZSBjcmVhdGVkXG4gICAgICBieSB0aGUgYnVpbHQtaW4gYGBjbGFzc21ldGhvZCgpYGAgY29uc3RydWN0b3IuXG4nLAorICd0eXBlc2Z1bmN0aW9ucyc6ICdcbkZ1bmN0aW9uc1xuKioqKioqKioqXG5cbkZ1bmN0aW9uIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgZnVuY3Rpb24gZGVmaW5pdGlvbnMuICBUaGUgb25seVxub3BlcmF0aW9uIG9uIGEgZnVuY3Rpb24gb2JqZWN0IGlzIHRvIGNhbGwgaXQ6IGBgZnVuYyhhcmd1bWVudC1saXN0KWBgLlxuXG5UaGVyZSBhcmUgcmVhbGx5IHR3byBmbGF2b3JzIG9mIGZ1bmN0aW9uIG9iamVjdHM6IGJ1aWx0LWluIGZ1bmN0aW9uc1xuYW5kIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMuICBCb3RoIHN1cHBvcnQgdGhlIHNhbWUgb3BlcmF0aW9uICh0byBjYWxsXG50aGUgZnVuY3Rpb24pLCBidXQgdGhlIGltcGxlbWVudGF0aW9uIGlzIGRpZmZlcmVudCwgaGVuY2UgdGhlXG5kaWZmZXJlbnQgb2JqZWN0IHR5cGVzLlxuXG5TZWUgKkZ1bmN0aW9uIGRlZmluaXRpb25zKiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbicsCisgJ3R5cGVzbWFwcGluZyc6ICdcbk1hcHBpbmcgVHlwZXMgLS0tIGBgZGljdGBgXG4qKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5BICptYXBwaW5nKiBvYmplY3QgbWFwcyAqaGFzaGFibGUqIHZhbHVlcyB0byBhcmJpdHJhcnkgb2JqZWN0cy5cbk1hcHBpbmdzIGFyZSBtdXRhYmxlIG9iamVjdHMuICBUaGVyZSBpcyBjdXJyZW50bHkgb25seSBvbmUgc3RhbmRhcmRcbm1hcHBpbmcgdHlwZSwgdGhlICpkaWN0aW9uYXJ5Ki4gIChGb3Igb3RoZXIgY29udGFpbmVycyBzZWUgdGhlIGJ1aWx0XG5pbiBgYGxpc3RgYCwgYGBzZXRgYCwgYW5kIGBgdHVwbGVgYCBjbGFzc2VzLCBhbmQgdGhlIGBgY29sbGVjdGlvbnNgYFxubW9kdWxlLilcblxuQSBkaWN0aW9uYXJ5XCdzIGtleXMgYXJlICphbG1vc3QqIGFyYml0cmFyeSB2YWx1ZXMuICBWYWx1ZXMgdGhhdCBhcmVcbm5vdCAqaGFzaGFibGUqLCB0aGF0IGlzLCB2YWx1ZXMgY29udGFpbmluZyBsaXN0cywgZGljdGlvbmFyaWVzIG9yXG5vdGhlciBtdXRhYmxlIHR5cGVzICh0aGF0IGFyZSBjb21wYXJlZCBieSB2YWx1ZSByYXRoZXIgdGhhbiBieSBvYmplY3RcbmlkZW50aXR5KSBtYXkgbm90IGJlIHVzZWQgYXMga2V5cy4gIE51bWVyaWMgdHlwZXMgdXNlZCBmb3Iga2V5cyBvYmV5XG50aGUgbm9ybWFsIHJ1bGVzIGZvciBudW1lcmljIGNvbXBhcmlzb246IGlmIHR3byBudW1iZXJzIGNvbXBhcmUgZXF1YWxcbihzdWNoIGFzIGBgMWBgIGFuZCBgYDEuMGBgKSB0aGVuIHRoZXkgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHRvXG5pbmRleCB0aGUgc2FtZSBkaWN0aW9uYXJ5IGVudHJ5LiAgKE5vdGUgaG93ZXZlciwgdGhhdCBzaW5jZSBjb21wdXRlcnNcbnN0b3JlIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgYXMgYXBwcm94aW1hdGlvbnMgaXQgaXMgdXN1YWxseSB1bndpc2UgdG9cbnVzZSB0aGVtIGFzIGRpY3Rpb25hcnkga2V5cy4pXG5cbkRpY3Rpb25hcmllcyBjYW4gYmUgY3JlYXRlZCBieSBwbGFjaW5nIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2ZcbmBga2V5OiB2YWx1ZWBgIHBhaXJzIHdpdGhpbiBicmFjZXMsIGZvciBleGFtcGxlOiBgYHtcJ2phY2tcJzogNDA5OCxcblwnc2pvZXJkXCc6IDQxMjd9YGAgb3IgYGB7NDA5ODogXCdqYWNrXCcsIDQxMjc6IFwnc2pvZXJkXCd9YGAsIG9yIGJ5IHRoZVxuYGBkaWN0YGAgY29uc3RydWN0b3IuXG5cbmNsYXNzIGNsYXNzIGRpY3QoKiprd2FyZylcbmNsYXNzIGNsYXNzIGRpY3QobWFwcGluZywgKiprd2FyZylcbmNsYXNzIGNsYXNzIGRpY3QoaXRlcmFibGUsICoqa3dhcmcpXG5cbiAgIFJldHVybiBhIG5ldyBkaWN0aW9uYXJ5IGluaXRpYWxpemVkIGZyb20gYW4gb3B0aW9uYWwgcG9zaXRpb25hbFxuICAgYXJndW1lbnQgYW5kIGEgcG9zc2libHkgZW1wdHkgc2V0IG9mIGtleXdvcmQgYXJndW1lbnRzLlxuXG4gICBJZiBubyBwb3NpdGlvbmFsIGFyZ3VtZW50IGlzIGdpdmVuLCBhbiBlbXB0eSBkaWN0aW9uYXJ5IGlzIGNyZWF0ZWQuXG4gICBJZiBhIHBvc2l0aW9uYWwgYXJndW1lbnQgaXMgZ2l2ZW4gYW5kIGl0IGlzIGEgbWFwcGluZyBvYmplY3QsIGFcbiAgIGRpY3Rpb25hcnkgaXMgY3JlYXRlZCB3aXRoIHRoZSBzYW1lIGtleS12YWx1ZSBwYWlycyBhcyB0aGUgbWFwcGluZ1xuICAgb2JqZWN0LiAgT3RoZXJ3aXNlLCB0aGUgcG9zaXRpb25hbCBhcmd1bWVudCBtdXN0IGJlIGFuICppdGVyYWJsZSpcbiAgIG9iamVjdC4gIEVhY2ggaXRlbSBpbiB0aGUgaXRlcmFibGUgbXVzdCBpdHNlbGYgYmUgYW4gaXRlcmFibGUgd2l0aFxuICAgZXhhY3RseSB0d28gb2JqZWN0cy4gIFRoZSBmaXJzdCBvYmplY3Qgb2YgZWFjaCBpdGVtIGJlY29tZXMgYSBrZXlcbiAgIGluIHRoZSBuZXcgZGljdGlvbmFyeSwgYW5kIHRoZSBzZWNvbmQgb2JqZWN0IHRoZSBjb3JyZXNwb25kaW5nXG4gICB2YWx1ZS4gIElmIGEga2V5IG9jY3VycyBtb3JlIHRoYW4gb25jZSwgdGhlIGxhc3QgdmFsdWUgZm9yIHRoYXQga2V5XG4gICBiZWNvbWVzIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluIHRoZSBuZXcgZGljdGlvbmFyeS5cblxuICAgSWYga2V5d29yZCBhcmd1bWVudHMgYXJlIGdpdmVuLCB0aGUga2V5d29yZCBhcmd1bWVudHMgYW5kIHRoZWlyXG4gICB2YWx1ZXMgYXJlIGFkZGVkIHRvIHRoZSBkaWN0aW9uYXJ5IGNyZWF0ZWQgZnJvbSB0aGUgcG9zaXRpb25hbFxuICAgYXJndW1lbnQuICBJZiBhIGtleSBiZWluZyBhZGRlZCBpcyBhbHJlYWR5IHByZXNlbnQsIHRoZSB2YWx1ZSBmcm9tXG4gICB0aGUga2V5d29yZCBhcmd1bWVudCByZXBsYWNlcyB0aGUgdmFsdWUgZnJvbSB0aGUgcG9zaXRpb25hbFxuICAgYXJndW1lbnQuXG5cbiAgIFRvIGlsbHVzdHJhdGUsIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgYWxsIHJldHVybiBhIGRpY3Rpb25hcnkgZXF1YWxcbiAgIHRvIGBgeyJvbmUiOiAxLCAidHdvIjogMiwgInRocmVlIjogM31gYDpcblxuICAgICAgPj4+IGEgPSBkaWN0KG9uZT0xLCB0d289MiwgdGhyZWU9MylcbiAgICAgID4+PiBiID0ge1wnb25lXCc6IDEsIFwndHdvXCc6IDIsIFwndGhyZWVcJzogM31cbiAgICAgID4+PiBjID0gZGljdCh6aXAoW1wnb25lXCcsIFwndHdvXCcsIFwndGhyZWVcJ10sIFsxLCAyLCAzXSkpXG4gICAgICA+Pj4gZCA9IGRpY3QoWyhcJ3R3b1wnLCAyKSwgKFwnb25lXCcsIDEpLCAoXCd0aHJlZVwnLCAzKV0pXG4gICAgICA+Pj4gZSA9IGRpY3Qoe1wndGhyZWVcJzogMywgXCdvbmVcJzogMSwgXCd0d29cJzogMn0pXG4gICAgICA+Pj4gYSA9PSBiID09IGMgPT0gZCA9PSBlXG4gICAgICBUcnVlXG5cbiAgIFByb3ZpZGluZyBrZXl3b3JkIGFyZ3VtZW50cyBhcyBpbiB0aGUgZmlyc3QgZXhhbXBsZSBvbmx5IHdvcmtzIGZvclxuICAga2V5cyB0aGF0IGFyZSB2YWxpZCBQeXRob24gaWRlbnRpZmllcnMuICBPdGhlcndpc2UsIGFueSB2YWxpZCBrZXlzXG4gICBjYW4gYmUgdXNlZC5cblxuICAgTmV3IGluIHZlcnNpb24gMi4yLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBTdXBwb3J0IGZvciBidWlsZGluZyBhIGRpY3Rpb25hcnkgZnJvbVxuICAga2V5d29yZCBhcmd1bWVudHMgYWRkZWQuXG5cbiAgIFRoZXNlIGFyZSB0aGUgb3BlcmF0aW9ucyB0aGF0IGRpY3Rpb25hcmllcyBzdXBwb3J0IChhbmQgdGhlcmVmb3JlLFxuICAgY3VzdG9tIG1hcHBpbmcgdHlwZXMgc2hvdWxkIHN1cHBvcnQgdG9vKTpcblxuICAgbGVuKGQpXG5cbiAgICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBkaWN0aW9uYXJ5ICpkKi5cblxuICAgZFtrZXldXG5cbiAgICAgIFJldHVybiB0aGUgaXRlbSBvZiAqZCogd2l0aCBrZXkgKmtleSouICBSYWlzZXMgYSBgYEtleUVycm9yYGAgaWZcbiAgICAgICprZXkqIGlzIG5vdCBpbiB0aGUgbWFwLlxuXG4gICAgICBOZXcgaW4gdmVyc2lvbiAyLjU6IElmIGEgc3ViY2xhc3Mgb2YgZGljdCBkZWZpbmVzIGEgbWV0aG9kXG4gICAgICBgYF9fbWlzc2luZ19fKClgYCwgaWYgdGhlIGtleSAqa2V5KiBpcyBub3QgcHJlc2VudCwgdGhlXG4gICAgICBgYGRba2V5XWBgIG9wZXJhdGlvbiBjYWxscyB0aGF0IG1ldGhvZCB3aXRoIHRoZSBrZXkgKmtleSogYXNcbiAgICAgIGFyZ3VtZW50LiAgVGhlIGBgZFtrZXldYGAgb3BlcmF0aW9uIHRoZW4gcmV0dXJucyBvciByYWlzZXNcbiAgICAgIHdoYXRldmVyIGlzIHJldHVybmVkIG9yIHJhaXNlZCBieSB0aGUgYGBfX21pc3NpbmdfXyhrZXkpYGAgY2FsbFxuICAgICAgaWYgdGhlIGtleSBpcyBub3QgcHJlc2VudC4gTm8gb3RoZXIgb3BlcmF0aW9ucyBvciBtZXRob2RzIGludm9rZVxuICAgICAgYGBfX21pc3NpbmdfXygpYGAuIElmIGBgX19taXNzaW5nX18oKWBgIGlzIG5vdCBkZWZpbmVkLFxuICAgICAgYGBLZXlFcnJvcmBgIGlzIHJhaXNlZC4gIGBgX19taXNzaW5nX18oKWBgIG11c3QgYmUgYSBtZXRob2Q7IGl0XG4gICAgICBjYW5ub3QgYmUgYW4gaW5zdGFuY2UgdmFyaWFibGUuIEZvciBhbiBleGFtcGxlLCBzZWVcbiAgICAgIGBgY29sbGVjdGlvbnMuZGVmYXVsdGRpY3RgYC5cblxuICAgZFtrZXldID0gdmFsdWVcblxuICAgICAgU2V0IGBgZFtrZXldYGAgdG8gKnZhbHVlKi5cblxuICAgZGVsIGRba2V5XVxuXG4gICAgICBSZW1vdmUgYGBkW2tleV1gYCBmcm9tICpkKi4gIFJhaXNlcyBhIGBgS2V5RXJyb3JgYCBpZiAqa2V5KiBpc1xuICAgICAgbm90IGluIHRoZSBtYXAuXG5cbiAgIGtleSBpbiBkXG5cbiAgICAgIFJldHVybiBgYFRydWVgYCBpZiAqZCogaGFzIGEga2V5ICprZXkqLCBlbHNlIGBgRmFsc2VgYC5cblxuICAgICAgTmV3IGluIHZlcnNpb24gMi4yLlxuXG4gICBrZXkgbm90IGluIGRcblxuICAgICAgRXF1aXZhbGVudCB0byBgYG5vdCBrZXkgaW4gZGBgLlxuXG4gICAgICBOZXcgaW4gdmVyc2lvbiAyLjIuXG5cbiAgIGl0ZXIoZClcblxuICAgICAgUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMgb2YgdGhlIGRpY3Rpb25hcnkuICBUaGlzIGlzIGFcbiAgICAgIHNob3J0Y3V0IGZvciBgYGl0ZXJrZXlzKClgYC5cblxuICAgY2xlYXIoKVxuXG4gICAgICBSZW1vdmUgYWxsIGl0ZW1zIGZyb20gdGhlIGRpY3Rpb25hcnkuXG5cbiAgIGNvcHkoKVxuXG4gICAgICBSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhlIGRpY3Rpb25hcnkuXG5cbiAgIGZyb21rZXlzKHNlcVssIHZhbHVlXSlcblxuICAgICAgQ3JlYXRlIGEgbmV3IGRpY3Rpb25hcnkgd2l0aCBrZXlzIGZyb20gKnNlcSogYW5kIHZhbHVlcyBzZXQgdG9cbiAgICAgICp2YWx1ZSouXG5cbiAgICAgIGBgZnJvbWtleXMoKWBgIGlzIGEgY2xhc3MgbWV0aG9kIHRoYXQgcmV0dXJucyBhIG5ldyBkaWN0aW9uYXJ5LlxuICAgICAgKnZhbHVlKiBkZWZhdWx0cyB0byBgYE5vbmVgYC5cblxuICAgICAgTmV3IGluIHZlcnNpb24gMi4zLlxuXG4gICBnZXQoa2V5WywgZGVmYXVsdF0pXG5cbiAgICAgIFJldHVybiB0aGUgdmFsdWUgZm9yICprZXkqIGlmICprZXkqIGlzIGluIHRoZSBkaWN0aW9uYXJ5LCBlbHNlXG4gICAgICAqZGVmYXVsdCouIElmICpkZWZhdWx0KiBpcyBub3QgZ2l2ZW4sIGl0IGRlZmF1bHRzIHRvIGBgTm9uZWBgLFxuICAgICAgc28gdGhhdCB0aGlzIG1ldGhvZCBuZXZlciByYWlzZXMgYSBgYEtleUVycm9yYGAuXG5cbiAgIGhhc19rZXkoa2V5KVxuXG4gICAgICBUZXN0IGZvciB0aGUgcHJlc2VuY2Ugb2YgKmtleSogaW4gdGhlIGRpY3Rpb25hcnkuICBgYGhhc19rZXkoKWBgXG4gICAgICBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIGBga2V5IGluIGRgYC5cblxuICAgaXRlbXMoKVxuXG4gICAgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBkaWN0aW9uYXJ5XCdzIGxpc3Qgb2YgYGAoa2V5LCB2YWx1ZSlgYFxuICAgICAgcGFpcnMuXG5cbiAgICAgICoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogS2V5cyBhbmQgdmFsdWVzIGFyZSBsaXN0ZWQgaW5cbiAgICAgIGFuIGFyYml0cmFyeSBvcmRlciB3aGljaCBpcyBub24tcmFuZG9tLCB2YXJpZXMgYWNyb3NzIFB5dGhvblxuICAgICAgaW1wbGVtZW50YXRpb25zLCBhbmQgZGVwZW5kcyBvbiB0aGUgZGljdGlvbmFyeVwncyBoaXN0b3J5IG9mXG4gICAgICBpbnNlcnRpb25zIGFuZCBkZWxldGlvbnMuXG5cbiAgICAgIElmIGBgaXRlbXMoKWBgLCBgYGtleXMoKWBgLCBgYHZhbHVlcygpYGAsIGBgaXRlcml0ZW1zKClgYCxcbiAgICAgIGBgaXRlcmtleXMoKWBgLCBhbmQgYGBpdGVydmFsdWVzKClgYCBhcmUgY2FsbGVkIHdpdGggbm9cbiAgICAgIGludGVydmVuaW5nIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGRpY3Rpb25hcnksIHRoZSBsaXN0cyB3aWxsXG4gICAgICBkaXJlY3RseSBjb3JyZXNwb25kLiAgVGhpcyBhbGxvd3MgdGhlIGNyZWF0aW9uIG9mIGBgKHZhbHVlLFxuICAgICAga2V5KWBgIHBhaXJzIHVzaW5nIGBgemlwKClgYDogYGBwYWlycyA9IHppcChkLnZhbHVlcygpLFxuICAgICAgZC5rZXlzKCkpYGAuICBUaGUgc2FtZSByZWxhdGlvbnNoaXAgaG9sZHMgZm9yIHRoZSBgYGl0ZXJrZXlzKClgYFxuICAgICAgYW5kIGBgaXRlcnZhbHVlcygpYGAgbWV0aG9kczogYGBwYWlycyA9IHppcChkLml0ZXJ2YWx1ZXMoKSxcbiAgICAgIGQuaXRlcmtleXMoKSlgYCBwcm92aWRlcyB0aGUgc2FtZSB2YWx1ZSBmb3IgYGBwYWlyc2BgLiBBbm90aGVyXG4gICAgICB3YXkgdG8gY3JlYXRlIHRoZSBzYW1lIGxpc3QgaXMgYGBwYWlycyA9IFsodiwgaykgZm9yIChrLCB2KSBpblxuICAgICAgZC5pdGVyaXRlbXMoKV1gYC5cblxuICAgaXRlcml0ZW1zKClcblxuICAgICAgUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGRpY3Rpb25hcnlcJ3MgYGAoa2V5LCB2YWx1ZSlgYCBwYWlycy5cbiAgICAgIFNlZSB0aGUgbm90ZSBmb3IgYGBkaWN0Lml0ZW1zKClgYC5cblxuICAgICAgVXNpbmcgYGBpdGVyaXRlbXMoKWBgIHdoaWxlIGFkZGluZyBvciBkZWxldGluZyBlbnRyaWVzIGluIHRoZVxuICAgICAgZGljdGlvbmFyeSBtYXkgcmFpc2UgYSBgYFJ1bnRpbWVFcnJvcmBgIG9yIGZhaWwgdG8gaXRlcmF0ZSBvdmVyXG4gICAgICBhbGwgZW50cmllcy5cblxuICAgICAgTmV3IGluIHZlcnNpb24gMi4yLlxuXG4gICBpdGVya2V5cygpXG5cbiAgICAgIFJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBkaWN0aW9uYXJ5XCdzIGtleXMuICBTZWUgdGhlIG5vdGUgZm9yXG4gICAgICBgYGRpY3QuaXRlbXMoKWBgLlxuXG4gICAgICBVc2luZyBgYGl0ZXJrZXlzKClgYCB3aGlsZSBhZGRpbmcgb3IgZGVsZXRpbmcgZW50cmllcyBpbiB0aGVcbiAgICAgIGRpY3Rpb25hcnkgbWF5IHJhaXNlIGEgYGBSdW50aW1lRXJyb3JgYCBvciBmYWlsIHRvIGl0ZXJhdGUgb3ZlclxuICAgICAgYWxsIGVudHJpZXMuXG5cbiAgICAgIE5ldyBpbiB2ZXJzaW9uIDIuMi5cblxuICAgaXRlcnZhbHVlcygpXG5cbiAgICAgIFJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBkaWN0aW9uYXJ5XCdzIHZhbHVlcy4gIFNlZSB0aGUgbm90ZVxuICAgICAgZm9yIGBgZGljdC5pdGVtcygpYGAuXG5cbiAgICAgIFVzaW5nIGBgaXRlcnZhbHVlcygpYGAgd2hpbGUgYWRkaW5nIG9yIGRlbGV0aW5nIGVudHJpZXMgaW4gdGhlXG4gICAgICBkaWN0aW9uYXJ5IG1heSByYWlzZSBhIGBgUnVudGltZUVycm9yYGAgb3IgZmFpbCB0byBpdGVyYXRlIG92ZXJcbiAgICAgIGFsbCBlbnRyaWVzLlxuXG4gICAgICBOZXcgaW4gdmVyc2lvbiAyLjIuXG5cbiAgIGtleXMoKVxuXG4gICAgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBkaWN0aW9uYXJ5XCdzIGxpc3Qgb2Yga2V5cy4gIFNlZSB0aGUgbm90ZVxuICAgICAgZm9yIGBgZGljdC5pdGVtcygpYGAuXG5cbiAgIHBvcChrZXlbLCBkZWZhdWx0XSlcblxuICAgICAgSWYgKmtleSogaXMgaW4gdGhlIGRpY3Rpb25hcnksIHJlbW92ZSBpdCBhbmQgcmV0dXJuIGl0cyB2YWx1ZSxcbiAgICAgIGVsc2UgcmV0dXJuICpkZWZhdWx0Ki4gIElmICpkZWZhdWx0KiBpcyBub3QgZ2l2ZW4gYW5kICprZXkqIGlzXG4gICAgICBub3QgaW4gdGhlIGRpY3Rpb25hcnksIGEgYGBLZXlFcnJvcmBgIGlzIHJhaXNlZC5cblxuICAgICAgTmV3IGluIHZlcnNpb24gMi4zLlxuXG4gICBwb3BpdGVtKClcblxuICAgICAgUmVtb3ZlIGFuZCByZXR1cm4gYW4gYXJiaXRyYXJ5IGBgKGtleSwgdmFsdWUpYGAgcGFpciBmcm9tIHRoZVxuICAgICAgZGljdGlvbmFyeS5cblxuICAgICAgYGBwb3BpdGVtKClgYCBpcyB1c2VmdWwgdG8gZGVzdHJ1Y3RpdmVseSBpdGVyYXRlIG92ZXIgYVxuICAgICAgZGljdGlvbmFyeSwgYXMgb2Z0ZW4gdXNlZCBpbiBzZXQgYWxnb3JpdGhtcy4gIElmIHRoZSBkaWN0aW9uYXJ5XG4gICAgICBpcyBlbXB0eSwgY2FsbGluZyBgYHBvcGl0ZW0oKWBgIHJhaXNlcyBhIGBgS2V5RXJyb3JgYC5cblxuICAgc2V0ZGVmYXVsdChrZXlbLCBkZWZhdWx0XSlcblxuICAgICAgSWYgKmtleSogaXMgaW4gdGhlIGRpY3Rpb25hcnksIHJldHVybiBpdHMgdmFsdWUuICBJZiBub3QsIGluc2VydFxuICAgICAgKmtleSogd2l0aCBhIHZhbHVlIG9mICpkZWZhdWx0KiBhbmQgcmV0dXJuICpkZWZhdWx0Ki4gICpkZWZhdWx0KlxuICAgICAgZGVmYXVsdHMgdG8gYGBOb25lYGAuXG5cbiAgIHVwZGF0ZShbb3RoZXJdKVxuXG4gICAgICBVcGRhdGUgdGhlIGRpY3Rpb25hcnkgd2l0aCB0aGUga2V5L3ZhbHVlIHBhaXJzIGZyb20gKm90aGVyKixcbiAgICAgIG92ZXJ3cml0aW5nIGV4aXN0aW5nIGtleXMuICBSZXR1cm4gYGBOb25lYGAuXG5cbiAgICAgIGBgdXBkYXRlKClgYCBhY2NlcHRzIGVpdGhlciBhbm90aGVyIGRpY3Rpb25hcnkgb2JqZWN0IG9yIGFuXG4gICAgICBpdGVyYWJsZSBvZiBrZXkvdmFsdWUgcGFpcnMgKGFzIHR1cGxlcyBvciBvdGhlciBpdGVyYWJsZXMgb2ZcbiAgICAgIGxlbmd0aCB0d28pLiAgSWYga2V5d29yZCBhcmd1bWVudHMgYXJlIHNwZWNpZmllZCwgdGhlIGRpY3Rpb25hcnlcbiAgICAgIGlzIHRoZW4gdXBkYXRlZCB3aXRoIHRob3NlIGtleS92YWx1ZSBwYWlyczogYGBkLnVwZGF0ZShyZWQ9MSxcbiAgICAgIGJsdWU9MilgYC5cblxuICAgICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNDogQWxsb3dlZCB0aGUgYXJndW1lbnQgdG8gYmUgYW4gaXRlcmFibGVcbiAgICAgIG9mIGtleS92YWx1ZSBwYWlycyBhbmQgYWxsb3dlZCBrZXl3b3JkIGFyZ3VtZW50cy5cblxuICAgdmFsdWVzKClcblxuICAgICAgUmV0dXJuIGEgY29weSBvZiB0aGUgZGljdGlvbmFyeVwncyBsaXN0IG9mIHZhbHVlcy4gIFNlZSB0aGUgbm90ZVxuICAgICAgZm9yIGBgZGljdC5pdGVtcygpYGAuXG5cbiAgIHZpZXdpdGVtcygpXG5cbiAgICAgIFJldHVybiBhIG5ldyB2aWV3IG9mIHRoZSBkaWN0aW9uYXJ5XCdzIGl0ZW1zIChgYChrZXksIHZhbHVlKWBgXG4gICAgICBwYWlycykuICBTZWUgYmVsb3cgZm9yIGRvY3VtZW50YXRpb24gb2YgdmlldyBvYmplY3RzLlxuXG4gICAgICBOZXcgaW4gdmVyc2lvbiAyLjcuXG5cbiAgIHZpZXdrZXlzKClcblxuICAgICAgUmV0dXJuIGEgbmV3IHZpZXcgb2YgdGhlIGRpY3Rpb25hcnlcJ3Mga2V5cy4gIFNlZSBiZWxvdyBmb3JcbiAgICAgIGRvY3VtZW50YXRpb24gb2YgdmlldyBvYmplY3RzLlxuXG4gICAgICBOZXcgaW4gdmVyc2lvbiAyLjcuXG5cbiAgIHZpZXd2YWx1ZXMoKVxuXG4gICAgICBSZXR1cm4gYSBuZXcgdmlldyBvZiB0aGUgZGljdGlvbmFyeVwncyB2YWx1ZXMuICBTZWUgYmVsb3cgZm9yXG4gICAgICBkb2N1bWVudGF0aW9uIG9mIHZpZXcgb2JqZWN0cy5cblxuICAgICAgTmV3IGluIHZlcnNpb24gMi43LlxuXG5cbkRpY3Rpb25hcnkgdmlldyBvYmplY3RzXG49PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgb2JqZWN0cyByZXR1cm5lZCBieSBgYGRpY3Qudmlld2tleXMoKWBgLCBgYGRpY3Qudmlld3ZhbHVlcygpYGAgYW5kXG5gYGRpY3Qudmlld2l0ZW1zKClgYCBhcmUgKnZpZXcgb2JqZWN0cyouICBUaGV5IHByb3ZpZGUgYSBkeW5hbWljIHZpZXdcbm9uIHRoZSBkaWN0aW9uYXJ5XCdzIGVudHJpZXMsIHdoaWNoIG1lYW5zIHRoYXQgd2hlbiB0aGUgZGljdGlvbmFyeVxuY2hhbmdlcywgdGhlIHZpZXcgcmVmbGVjdHMgdGhlc2UgY2hhbmdlcy5cblxuRGljdGlvbmFyeSB2aWV3cyBjYW4gYmUgaXRlcmF0ZWQgb3ZlciB0byB5aWVsZCB0aGVpciByZXNwZWN0aXZlIGRhdGEsXG5hbmQgc3VwcG9ydCBtZW1iZXJzaGlwIHRlc3RzOlxuXG5sZW4oZGljdHZpZXcpXG5cbiAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGRpY3Rpb25hcnkuXG5cbml0ZXIoZGljdHZpZXcpXG5cbiAgIFJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzLCB2YWx1ZXMgb3IgaXRlbXMgKHJlcHJlc2VudGVkIGFzXG4gICB0dXBsZXMgb2YgYGAoa2V5LCB2YWx1ZSlgYCkgaW4gdGhlIGRpY3Rpb25hcnkuXG5cbiAgIEtleXMgYW5kIHZhbHVlcyBhcmUgaXRlcmF0ZWQgb3ZlciBpbiBhbiBhcmJpdHJhcnkgb3JkZXIgd2hpY2ggaXNcbiAgIG5vbi1yYW5kb20sIHZhcmllcyBhY3Jvc3MgUHl0aG9uIGltcGxlbWVudGF0aW9ucywgYW5kIGRlcGVuZHMgb25cbiAgIHRoZSBkaWN0aW9uYXJ5XCdzIGhpc3Rvcnkgb2YgaW5zZXJ0aW9ucyBhbmQgZGVsZXRpb25zLiBJZiBrZXlzLFxuICAgdmFsdWVzIGFuZCBpdGVtcyB2aWV3cyBhcmUgaXRlcmF0ZWQgb3ZlciB3aXRoIG5vIGludGVydmVuaW5nXG4gICBtb2RpZmljYXRpb25zIHRvIHRoZSBkaWN0aW9uYXJ5LCB0aGUgb3JkZXIgb2YgaXRlbXMgd2lsbCBkaXJlY3RseVxuICAgY29ycmVzcG9uZC4gIFRoaXMgYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBgYCh2YWx1ZSwga2V5KWBgIHBhaXJzXG4gICB1c2luZyBgYHppcCgpYGA6IGBgcGFpcnMgPSB6aXAoZC52YWx1ZXMoKSwgZC5rZXlzKCkpYGAuICBBbm90aGVyXG4gICB3YXkgdG8gY3JlYXRlIHRoZSBzYW1lIGxpc3QgaXMgYGBwYWlycyA9IFsodiwgaykgZm9yIChrLCB2KSBpblxuICAgZC5pdGVtcygpXWBgLlxuXG4gICBJdGVyYXRpbmcgdmlld3Mgd2hpbGUgYWRkaW5nIG9yIGRlbGV0aW5nIGVudHJpZXMgaW4gdGhlIGRpY3Rpb25hcnlcbiAgIG1heSByYWlzZSBhIGBgUnVudGltZUVycm9yYGAgb3IgZmFpbCB0byBpdGVyYXRlIG92ZXIgYWxsIGVudHJpZXMuXG5cbnggaW4gZGljdHZpZXdcblxuICAgUmV0dXJuIGBgVHJ1ZWBgIGlmICp4KiBpcyBpbiB0aGUgdW5kZXJseWluZyBkaWN0aW9uYXJ5XCdzIGtleXMsXG4gICB2YWx1ZXMgb3IgaXRlbXMgKGluIHRoZSBsYXR0ZXIgY2FzZSwgKngqIHNob3VsZCBiZSBhIGBgKGtleSxcbiAgIHZhbHVlKWBgIHR1cGxlKS5cblxuS2V5cyB2aWV3cyBhcmUgc2V0LWxpa2Ugc2luY2UgdGhlaXIgZW50cmllcyBhcmUgdW5pcXVlIGFuZCBoYXNoYWJsZS5cbklmIGFsbCB2YWx1ZXMgYXJlIGhhc2hhYmxlLCBzbyB0aGF0IChrZXksIHZhbHVlKSBwYWlycyBhcmUgdW5pcXVlIGFuZFxuaGFzaGFibGUsIHRoZW4gdGhlIGl0ZW1zIHZpZXcgaXMgYWxzbyBzZXQtbGlrZS4gIChWYWx1ZXMgdmlld3MgYXJlIG5vdFxudHJlYXRlZCBhcyBzZXQtbGlrZSBzaW5jZSB0aGUgZW50cmllcyBhcmUgZ2VuZXJhbGx5IG5vdCB1bmlxdWUuKSAgVGhlblxudGhlc2Ugc2V0IG9wZXJhdGlvbnMgYXJlIGF2YWlsYWJsZSAoIm90aGVyIiByZWZlcnMgZWl0aGVyIHRvIGFub3RoZXJcbnZpZXcgb3IgYSBzZXQpOlxuXG5kaWN0dmlldyAmIG90aGVyXG5cbiAgIFJldHVybiB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBkaWN0dmlldyBhbmQgdGhlIG90aGVyIG9iamVjdCBhcyBhXG4gICBuZXcgc2V0LlxuXG5kaWN0dmlldyB8IG90aGVyXG5cbiAgIFJldHVybiB0aGUgdW5pb24gb2YgdGhlIGRpY3R2aWV3IGFuZCB0aGUgb3RoZXIgb2JqZWN0IGFzIGEgbmV3IHNldC5cblxuZGljdHZpZXcgLSBvdGhlclxuXG4gICBSZXR1cm4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZGljdHZpZXcgYW5kIHRoZSBvdGhlciBvYmplY3RcbiAgIChhbGwgZWxlbWVudHMgaW4gKmRpY3R2aWV3KiB0aGF0IGFyZW5cJ3QgaW4gKm90aGVyKikgYXMgYSBuZXcgc2V0LlxuXG5kaWN0dmlldyBeIG90aGVyXG5cbiAgIFJldHVybiB0aGUgc3ltbWV0cmljIGRpZmZlcmVuY2UgKGFsbCBlbGVtZW50cyBlaXRoZXIgaW4gKmRpY3R2aWV3KlxuICAgb3IgKm90aGVyKiwgYnV0IG5vdCBpbiBib3RoKSBvZiB0aGUgZGljdHZpZXcgYW5kIHRoZSBvdGhlciBvYmplY3RcbiAgIGFzIGEgbmV3IHNldC5cblxuQW4gZXhhbXBsZSBvZiBkaWN0aW9uYXJ5IHZpZXcgdXNhZ2U6XG5cbiAgID4+PiBkaXNoZXMgPSB7XCdlZ2dzXCc6IDIsIFwnc2F1c2FnZVwnOiAxLCBcJ2JhY29uXCc6IDEsIFwnc3BhbVwnOiA1MDB9XG4gICA+Pj4ga2V5cyA9IGRpc2hlcy52aWV3a2V5cygpXG4gICA+Pj4gdmFsdWVzID0gZGlzaGVzLnZpZXd2YWx1ZXMoKVxuXG4gICA+Pj4gIyBpdGVyYXRpb25cbiAgID4+PiBuID0gMFxuICAgPj4+IGZvciB2YWwgaW4gdmFsdWVzOlxuICAgLi4uICAgICBuICs9IHZhbFxuICAgPj4+IHByaW50KG4pXG4gICA1MDRcblxuICAgPj4+ICMga2V5cyBhbmQgdmFsdWVzIGFyZSBpdGVyYXRlZCBvdmVyIGluIHRoZSBzYW1lIG9yZGVyXG4gICA+Pj4gbGlzdChrZXlzKVxuICAgW1wnZWdnc1wnLCBcJ2JhY29uXCcsIFwnc2F1c2FnZVwnLCBcJ3NwYW1cJ11cbiAgID4+PiBsaXN0KHZhbHVlcylcbiAgIFsyLCAxLCAxLCA1MDBdXG5cbiAgID4+PiAjIHZpZXcgb2JqZWN0cyBhcmUgZHluYW1pYyBhbmQgcmVmbGVjdCBkaWN0IGNoYW5nZXNcbiAgID4+PiBkZWwgZGlzaGVzW1wnZWdnc1wnXVxuICAgPj4+IGRlbCBkaXNoZXNbXCdzYXVzYWdlXCddXG4gICA+Pj4gbGlzdChrZXlzKVxuICAgW1wnc3BhbVwnLCBcJ2JhY29uXCddXG5cbiAgID4+PiAjIHNldCBvcGVyYXRpb25zXG4gICA+Pj4ga2V5cyAmIHtcJ2VnZ3NcJywgXCdiYWNvblwnLCBcJ3NhbGFkXCd9XG4gICB7XCdiYWNvblwnfVxuJywKKyAndHlwZXNtZXRob2RzJzogJ1xuTWV0aG9kc1xuKioqKioqKlxuXG5NZXRob2RzIGFyZSBmdW5jdGlvbnMgdGhhdCBhcmUgY2FsbGVkIHVzaW5nIHRoZSBhdHRyaWJ1dGUgbm90YXRpb24uXG5UaGVyZSBhcmUgdHdvIGZsYXZvcnM6IGJ1aWx0LWluIG1ldGhvZHMgKHN1Y2ggYXMgYGBhcHBlbmQoKWBgIG9uXG5saXN0cykgYW5kIGNsYXNzIGluc3RhbmNlIG1ldGhvZHMuICBCdWlsdC1pbiBtZXRob2RzIGFyZSBkZXNjcmliZWRcbndpdGggdGhlIHR5cGVzIHRoYXQgc3VwcG9ydCB0aGVtLlxuXG5UaGUgaW1wbGVtZW50YXRpb24gYWRkcyB0d28gc3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlcyB0byBjbGFzc1xuaW5zdGFuY2UgbWV0aG9kczogYGBtLmltX3NlbGZgYCBpcyB0aGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRob2Rcbm9wZXJhdGVzLCBhbmQgYGBtLmltX2Z1bmNgYCBpcyB0aGUgZnVuY3Rpb24gaW1wbGVtZW50aW5nIHRoZSBtZXRob2QuXG5DYWxsaW5nIGBgbShhcmctMSwgYXJnLTIsIC4uLiwgYXJnLW4pYGAgaXMgY29tcGxldGVseSBlcXVpdmFsZW50IHRvXG5jYWxsaW5nIGBgbS5pbV9mdW5jKG0uaW1fc2VsZiwgYXJnLTEsIGFyZy0yLCAuLi4sIGFyZy1uKWBgLlxuXG5DbGFzcyBpbnN0YW5jZSBtZXRob2RzIGFyZSBlaXRoZXIgKmJvdW5kKiBvciAqdW5ib3VuZCosIHJlZmVycmluZyB0b1xud2hldGhlciB0aGUgbWV0aG9kIHdhcyBhY2Nlc3NlZCB0aHJvdWdoIGFuIGluc3RhbmNlIG9yIGEgY2xhc3MsXG5yZXNwZWN0aXZlbHkuICBXaGVuIGEgbWV0aG9kIGlzIHVuYm91bmQsIGl0cyBgYGltX3NlbGZgYCBhdHRyaWJ1dGVcbndpbGwgYmUgYGBOb25lYGAgYW5kIGlmIGNhbGxlZCwgYW4gZXhwbGljaXQgYGBzZWxmYGAgb2JqZWN0IG11c3QgYmVcbnBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQuICBJbiB0aGlzIGNhc2UsIGBgc2VsZmBgIG11c3QgYmUgYW5cbmluc3RhbmNlIG9mIHRoZSB1bmJvdW5kIG1ldGhvZFwncyBjbGFzcyAob3IgYSBzdWJjbGFzcyBvZiB0aGF0IGNsYXNzKSxcbm90aGVyd2lzZSBhIGBgVHlwZUVycm9yYGAgaXMgcmFpc2VkLlxuXG5MaWtlIGZ1bmN0aW9uIG9iamVjdHMsIG1ldGhvZHMgb2JqZWN0cyBzdXBwb3J0IGdldHRpbmcgYXJiaXRyYXJ5XG5hdHRyaWJ1dGVzLiBIb3dldmVyLCBzaW5jZSBtZXRob2QgYXR0cmlidXRlcyBhcmUgYWN0dWFsbHkgc3RvcmVkIG9uXG50aGUgdW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3QgKGBgbWV0aC5pbV9mdW5jYGApLCBzZXR0aW5nIG1ldGhvZFxuYXR0cmlidXRlcyBvbiBlaXRoZXIgYm91bmQgb3IgdW5ib3VuZCBtZXRob2RzIGlzIGRpc2FsbG93ZWQuXG5BdHRlbXB0aW5nIHRvIHNldCBhbiBhdHRyaWJ1dGUgb24gYSBtZXRob2QgcmVzdWx0cyBpbiBhblxuYGBBdHRyaWJ1dGVFcnJvcmBgIGJlaW5nIHJhaXNlZC4gIEluIG9yZGVyIHRvIHNldCBhIG1ldGhvZCBhdHRyaWJ1dGUsXG55b3UgbmVlZCB0byBleHBsaWNpdGx5IHNldCBpdCBvbiB0aGUgdW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3Q6XG5cbiAgID4+PiBjbGFzcyBDOlxuICAgLi4uICAgICBkZWYgbWV0aG9kKHNlbGYpOlxuICAgLi4uICAgICAgICAgcGFzc1xuICAgLi4uXG4gICA+Pj4gYyA9IEMoKVxuICAgPj4+IGMubWV0aG9kLndob2FtaSA9IFwnbXkgbmFtZSBpcyBtZXRob2RcJyAgIyBjYW5cJ3Qgc2V0IG9uIHRoZSBtZXRob2RcbiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT5cbiAgIEF0dHJpYnV0ZUVycm9yOiBcJ2luc3RhbmNlbWV0aG9kXCcgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgXCd3aG9hbWlcJ1xuICAgPj4+IGMubWV0aG9kLmltX2Z1bmMud2hvYW1pID0gXCdteSBuYW1lIGlzIG1ldGhvZFwnXG4gICA+Pj4gYy5tZXRob2Qud2hvYW1pXG4gICBcJ215IG5hbWUgaXMgbWV0aG9kXCdcblxuU2VlICpUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuJywKKyAndHlwZXNtb2R1bGVzJzogIlxuTW9kdWxlc1xuKioqKioqKlxuXG5UaGUgb25seSBzcGVjaWFsIG9wZXJhdGlvbiBvbiBhIG1vZHVsZSBpcyBhdHRyaWJ1dGUgYWNjZXNzOlxuYGBtLm5hbWVgYCwgd2hlcmUgKm0qIGlzIGEgbW9kdWxlIGFuZCAqbmFtZSogYWNjZXNzZXMgYSBuYW1lIGRlZmluZWRcbmluICptKidzIHN5bWJvbCB0YWJsZS4gTW9kdWxlIGF0dHJpYnV0ZXMgY2FuIGJlIGFzc2lnbmVkIHRvLiAgKE5vdGVcbnRoYXQgdGhlIGBgaW1wb3J0YGAgc3RhdGVtZW50IGlzIG5vdCwgc3RyaWN0bHkgc3BlYWtpbmcsIGFuIG9wZXJhdGlvblxub24gYSBtb2R1bGUgb2JqZWN0OyBgYGltcG9ydCBmb29gYCBkb2VzIG5vdCByZXF1aXJlIGEgbW9kdWxlIG9iamVjdFxubmFtZWQgKmZvbyogdG8gZXhpc3QsIHJhdGhlciBpdCByZXF1aXJlcyBhbiAoZXh0ZXJuYWwpICpkZWZpbml0aW9uKlxuZm9yIGEgbW9kdWxlIG5hbWVkICpmb28qIHNvbWV3aGVyZS4pXG5cbkEgc3BlY2lhbCBhdHRyaWJ1dGUgb2YgZXZlcnkgbW9kdWxlIGlzIGBgX19kaWN0X19gYC4gVGhpcyBpcyB0aGVcbmRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgbW9kdWxlJ3Mgc3ltYm9sIHRhYmxlLiBNb2RpZnlpbmcgdGhpc1xuZGljdGlvbmFyeSB3aWxsIGFjdHVhbGx5IGNoYW5nZSB0aGUgbW9kdWxlJ3Mgc3ltYm9sIHRhYmxlLCBidXQgZGlyZWN0XG5hc3NpZ25tZW50IHRvIHRoZSBgYF9fZGljdF9fYGAgYXR0cmlidXRlIGlzIG5vdCBwb3NzaWJsZSAoeW91IGNhblxud3JpdGUgYGBtLl9fZGljdF9fWydhJ10gPSAxYGAsIHdoaWNoIGRlZmluZXMgYGBtLmFgYCB0byBiZSBgYDFgYCwgYnV0XG55b3UgY2FuJ3Qgd3JpdGUgYGBtLl9fZGljdF9fID0ge31gYCkuICBNb2RpZnlpbmcgYGBfX2RpY3RfX2BgIGRpcmVjdGx5XG5pcyBub3QgcmVjb21tZW5kZWQuXG5cbk1vZHVsZXMgYnVpbHQgaW50byB0aGUgaW50ZXJwcmV0ZXIgYXJlIHdyaXR0ZW4gbGlrZSB0aGlzOiBgYDxtb2R1bGVcbidzeXMnIChidWlsdC1pbik+YGAuICBJZiBsb2FkZWQgZnJvbSBhIGZpbGUsIHRoZXkgYXJlIHdyaXR0ZW4gYXNcbmBgPG1vZHVsZSAnb3MnIGZyb20gJy91c3IvbG9jYWwvbGliL3B5dGhvblguWS9vcy5weWMnPmBgLlxuIiwKKyAndHlwZXNzZXEnOiAnXG5TZXF1ZW5jZSBUeXBlcyAtLS0gYGBzdHJgYCwgYGB1bmljb2RlYGAsIGBgbGlzdGBgLCBgYHR1cGxlYGAsIGBgYnl0ZWFycmF5YGAsIGBgYnVmZmVyYGAsIGBgeHJhbmdlYGBcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5UaGVyZSBhcmUgc2V2ZW4gc2VxdWVuY2UgdHlwZXM6IHN0cmluZ3MsIFVuaWNvZGUgc3RyaW5ncywgbGlzdHMsXG50dXBsZXMsIGJ5dGVhcnJheXMsIGJ1ZmZlcnMsIGFuZCB4cmFuZ2Ugb2JqZWN0cy5cblxuRm9yIG90aGVyIGNvbnRhaW5lcnMgc2VlIHRoZSBidWlsdCBpbiBgYGRpY3RgYCBhbmQgYGBzZXRgYCBjbGFzc2VzLFxuYW5kIHRoZSBgYGNvbGxlY3Rpb25zYGAgbW9kdWxlLlxuXG5TdHJpbmcgbGl0ZXJhbHMgYXJlIHdyaXR0ZW4gaW4gc2luZ2xlIG9yIGRvdWJsZSBxdW90ZXM6IGBgXCd4eXp6eVwnYGAsXG5gYCJmcm9ib3p6ImBgLiAgU2VlICpTdHJpbmcgbGl0ZXJhbHMqIGZvciBtb3JlIGFib3V0IHN0cmluZyBsaXRlcmFscy5cblVuaWNvZGUgc3RyaW5ncyBhcmUgbXVjaCBsaWtlIHN0cmluZ3MsIGJ1dCBhcmUgc3BlY2lmaWVkIGluIHRoZSBzeW50YXhcbnVzaW5nIGEgcHJlY2VkaW5nIGBgXCd1XCdgYCBjaGFyYWN0ZXI6IGBgdVwnYWJjXCdgYCwgYGB1ImRlZiJgYC4gSW5cbmFkZGl0aW9uIHRvIHRoZSBmdW5jdGlvbmFsaXR5IGRlc2NyaWJlZCBoZXJlLCB0aGVyZSBhcmUgYWxzbyBzdHJpbmctXG5zcGVjaWZpYyBtZXRob2RzIGRlc2NyaWJlZCBpbiB0aGUgKlN0cmluZyBNZXRob2RzKiBzZWN0aW9uLiBMaXN0cyBhcmVcbmNvbnN0cnVjdGVkIHdpdGggc3F1YXJlIGJyYWNrZXRzLCBzZXBhcmF0aW5nIGl0ZW1zIHdpdGggY29tbWFzOiBgYFthLFxuYiwgY11gYC4gVHVwbGVzIGFyZSBjb25zdHJ1Y3RlZCBieSB0aGUgY29tbWEgb3BlcmF0b3IgKG5vdCB3aXRoaW5cbnNxdWFyZSBicmFja2V0cyksIHdpdGggb3Igd2l0aG91dCBlbmNsb3NpbmcgcGFyZW50aGVzZXMsIGJ1dCBhbiBlbXB0eVxudHVwbGUgbXVzdCBoYXZlIHRoZSBlbmNsb3NpbmcgcGFyZW50aGVzZXMsIHN1Y2ggYXMgYGBhLCBiLCBjYGAgb3JcbmBgKClgYC4gIEEgc2luZ2xlIGl0ZW0gdHVwbGUgbXVzdCBoYXZlIGEgdHJhaWxpbmcgY29tbWEsIHN1Y2ggYXNcbmBgKGQsKWBgLlxuXG5CeXRlYXJyYXkgb2JqZWN0cyBhcmUgY3JlYXRlZCB3aXRoIHRoZSBidWlsdC1pbiBmdW5jdGlvblxuYGBieXRlYXJyYXkoKWBgLlxuXG5CdWZmZXIgb2JqZWN0cyBhcmUgbm90IGRpcmVjdGx5IHN1cHBvcnRlZCBieSBQeXRob24gc3ludGF4LCBidXQgY2FuIGJlXG5jcmVhdGVkIGJ5IGNhbGxpbmcgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGBgYnVmZmVyKClgYC4gIFRoZXkgZG9uXCd0XG5zdXBwb3J0IGNvbmNhdGVuYXRpb24gb3IgcmVwZXRpdGlvbi5cblxuT2JqZWN0cyBvZiB0eXBlIHhyYW5nZSBhcmUgc2ltaWxhciB0byBidWZmZXJzIGluIHRoYXQgdGhlcmUgaXMgbm9cbnNwZWNpZmljIHN5bnRheCB0byBjcmVhdGUgdGhlbSwgYnV0IHRoZXkgYXJlIGNyZWF0ZWQgdXNpbmcgdGhlXG5gYHhyYW5nZSgpYGAgZnVuY3Rpb24uICBUaGV5IGRvblwndCBzdXBwb3J0IHNsaWNpbmcsIGNvbmNhdGVuYXRpb24gb3JcbnJlcGV0aXRpb24sIGFuZCB1c2luZyBgYGluYGAsIGBgbm90IGluYGAsIGBgbWluKClgYCBvciBgYG1heCgpYGAgb25cbnRoZW0gaXMgaW5lZmZpY2llbnQuXG5cbk1vc3Qgc2VxdWVuY2UgdHlwZXMgc3VwcG9ydCB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbnMuICBUaGUgYGBpbmBgIGFuZFxuYGBub3QgaW5gYCBvcGVyYXRpb25zIGhhdmUgdGhlIHNhbWUgcHJpb3JpdGllcyBhcyB0aGUgY29tcGFyaXNvblxub3BlcmF0aW9ucy4gIFRoZSBgYCtgYCBhbmQgYGAqYGAgb3BlcmF0aW9ucyBoYXZlIHRoZSBzYW1lIHByaW9yaXR5IGFzXG50aGUgY29ycmVzcG9uZGluZyBudW1lcmljIG9wZXJhdGlvbnMuIFszXSBBZGRpdGlvbmFsIG1ldGhvZHMgYXJlXG5wcm92aWRlZCBmb3IgKk11dGFibGUgU2VxdWVuY2UgVHlwZXMqLlxuXG5UaGlzIHRhYmxlIGxpc3RzIHRoZSBzZXF1ZW5jZSBvcGVyYXRpb25zIHNvcnRlZCBpbiBhc2NlbmRpbmcgcHJpb3JpdHlcbihvcGVyYXRpb25zIGluIHRoZSBzYW1lIGJveCBoYXZlIHRoZSBzYW1lIHByaW9yaXR5KS4gIEluIHRoZSB0YWJsZSxcbipzKiBhbmQgKnQqIGFyZSBzZXF1ZW5jZXMgb2YgdGhlIHNhbWUgdHlwZTsgKm4qLCAqaSogYW5kICpqKiBhcmVcbmludGVnZXJzOlxuXG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IE9wZXJhdGlvbiAgICAgICAgICB8IFJlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgICAgICB8XG4rPT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT0rXG58IGBgeCBpbiBzYGAgICAgICAgICB8IGBgVHJ1ZWBgIGlmIGFuIGl0ZW0gb2YgKnMqIGlzICAgIHwgKDEpICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICB8IGVxdWFsIHRvICp4KiwgZWxzZSBgYEZhbHNlYGAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgeCBub3QgaW4gc2BgICAgICB8IGBgRmFsc2VgYCBpZiBhbiBpdGVtIG9mICpzKiBpcyAgIHwgKDEpICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICB8IGVxdWFsIHRvICp4KiwgZWxzZSBgYFRydWVgYCAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgcyArIHRgYCAgICAgICAgICB8IHRoZSBjb25jYXRlbmF0aW9uIG9mICpzKiBhbmQgKnQqIHwgKDYpICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgcyAqIG4sIG4gKiBzYGAgICB8ICpuKiBzaGFsbG93IGNvcGllcyBvZiAqcyogICAgICAgIHwgKDIpICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICB8IGNvbmNhdGVuYXRlZCAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgc1tpXWBgICAgICAgICAgICB8ICppKnRoIGl0ZW0gb2YgKnMqLCBvcmlnaW4gMCAgICAgIHwgKDMpICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgc1tpOmpdYGAgICAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogICAgIHwgKDMpKDQpICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgc1tpOmo6a11gYCAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogICAgIHwgKDMpKDUpICAgICB8XG58ICAgICAgICAgICAgICAgICAgICB8IHdpdGggc3RlcCAqayogICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgbGVuKHMpYGAgICAgICAgICB8IGxlbmd0aCBvZiAqcyogICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgbWluKHMpYGAgICAgICAgICB8IHNtYWxsZXN0IGl0ZW0gb2YgKnMqICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgbWF4KHMpYGAgICAgICAgICB8IGxhcmdlc3QgaXRlbSBvZiAqcyogICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgcy5pbmRleCh4KWBgICAgICB8IGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHwgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICB8ICp4KiBpbiAqcyogICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgcy5jb3VudCh4KWBgICAgICB8IHRvdGFsIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiAgIHwgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICB8ICp4KiBpbiAqcyogICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG5cblNlcXVlbmNlIHR5cGVzIGFsc28gc3VwcG9ydCBjb21wYXJpc29ucy4gSW4gcGFydGljdWxhciwgdHVwbGVzIGFuZFxubGlzdHMgYXJlIGNvbXBhcmVkIGxleGljb2dyYXBoaWNhbGx5IGJ5IGNvbXBhcmluZyBjb3JyZXNwb25kaW5nXG5lbGVtZW50cy4gVGhpcyBtZWFucyB0aGF0IHRvIGNvbXBhcmUgZXF1YWwsIGV2ZXJ5IGVsZW1lbnQgbXVzdCBjb21wYXJlXG5lcXVhbCBhbmQgdGhlIHR3byBzZXF1ZW5jZXMgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlIGFuZCBoYXZlIHRoZSBzYW1lXG5sZW5ndGguIChGb3IgZnVsbCBkZXRhaWxzIHNlZSAqQ29tcGFyaXNvbnMqIGluIHRoZSBsYW5ndWFnZVxucmVmZXJlbmNlLilcblxuTm90ZXM6XG5cbjEuIFdoZW4gKnMqIGlzIGEgc3RyaW5nIG9yIFVuaWNvZGUgc3RyaW5nIG9iamVjdCB0aGUgYGBpbmBgIGFuZCBgYG5vdFxuICAgaW5gYCBvcGVyYXRpb25zIGFjdCBsaWtlIGEgc3Vic3RyaW5nIHRlc3QuICBJbiBQeXRob24gdmVyc2lvbnNcbiAgIGJlZm9yZSAyLjMsICp4KiBoYWQgdG8gYmUgYSBzdHJpbmcgb2YgbGVuZ3RoIDEuIEluIFB5dGhvbiAyLjMgYW5kXG4gICBiZXlvbmQsICp4KiBtYXkgYmUgYSBzdHJpbmcgb2YgYW55IGxlbmd0aC5cblxuMi4gVmFsdWVzIG9mICpuKiBsZXNzIHRoYW4gYGAwYGAgYXJlIHRyZWF0ZWQgYXMgYGAwYGAgKHdoaWNoIHlpZWxkcyBhblxuICAgZW1wdHkgc2VxdWVuY2Ugb2YgdGhlIHNhbWUgdHlwZSBhcyAqcyopLiAgTm90ZSBhbHNvIHRoYXQgdGhlIGNvcGllc1xuICAgYXJlIHNoYWxsb3c7IG5lc3RlZCBzdHJ1Y3R1cmVzIGFyZSBub3QgY29waWVkLiAgVGhpcyBvZnRlbiBoYXVudHNcbiAgIG5ldyBQeXRob24gcHJvZ3JhbW1lcnM7IGNvbnNpZGVyOlxuXG4gICA+Pj4gbGlzdHMgPSBbW11dICogM1xuICAgPj4+IGxpc3RzXG4gICBbW10sIFtdLCBbXV1cbiAgID4+PiBsaXN0c1swXS5hcHBlbmQoMylcbiAgID4+PiBsaXN0c1xuICAgW1szXSwgWzNdLCBbM11dXG5cbiAgIFdoYXQgaGFzIGhhcHBlbmVkIGlzIHRoYXQgYGBbW11dYGAgaXMgYSBvbmUtZWxlbWVudCBsaXN0IGNvbnRhaW5pbmdcbiAgIGFuIGVtcHR5IGxpc3QsIHNvIGFsbCB0aHJlZSBlbGVtZW50cyBvZiBgYFtbXV0gKiAzYGAgYXJlIChwb2ludGVyc1xuICAgdG8pIHRoaXMgc2luZ2xlIGVtcHR5IGxpc3QuICBNb2RpZnlpbmcgYW55IG9mIHRoZSBlbGVtZW50cyBvZlxuICAgYGBsaXN0c2BgIG1vZGlmaWVzIHRoaXMgc2luZ2xlIGxpc3QuIFlvdSBjYW4gY3JlYXRlIGEgbGlzdCBvZlxuICAgZGlmZmVyZW50IGxpc3RzIHRoaXMgd2F5OlxuXG4gICA+Pj4gbGlzdHMgPSBbW10gZm9yIGkgaW4gcmFuZ2UoMyldXG4gICA+Pj4gbGlzdHNbMF0uYXBwZW5kKDMpXG4gICA+Pj4gbGlzdHNbMV0uYXBwZW5kKDUpXG4gICA+Pj4gbGlzdHNbMl0uYXBwZW5kKDcpXG4gICA+Pj4gbGlzdHNcbiAgIFtbM10sIFs1XSwgWzddXVxuXG4zLiBJZiAqaSogb3IgKmoqIGlzIG5lZ2F0aXZlLCB0aGUgaW5kZXggaXMgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGVcbiAgIHN0cmluZzogYGBsZW4ocykgKyBpYGAgb3IgYGBsZW4ocykgKyBqYGAgaXMgc3Vic3RpdHV0ZWQuICBCdXQgbm90ZVxuICAgdGhhdCBgYC0wYGAgaXMgc3RpbGwgYGAwYGAuXG5cbjQuIFRoZSBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqIGlzIGRlZmluZWQgYXMgdGhlIHNlcXVlbmNlIG9mXG4gICBpdGVtcyB3aXRoIGluZGV4ICprKiBzdWNoIHRoYXQgYGBpIDw9IGsgPCBqYGAuICBJZiAqaSogb3IgKmoqIGlzXG4gICBncmVhdGVyIHRoYW4gYGBsZW4ocylgYCwgdXNlIGBgbGVuKHMpYGAuICBJZiAqaSogaXMgb21pdHRlZCBvclxuICAgYGBOb25lYGAsIHVzZSBgYDBgYC4gIElmICpqKiBpcyBvbWl0dGVkIG9yIGBgTm9uZWBgLCB1c2VcbiAgIGBgbGVuKHMpYGAuICBJZiAqaSogaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICpqKiwgdGhlIHNsaWNlIGlzXG4gICBlbXB0eS5cblxuNS4gVGhlIHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogd2l0aCBzdGVwICprKiBpcyBkZWZpbmVkIGFzIHRoZVxuICAgc2VxdWVuY2Ugb2YgaXRlbXMgd2l0aCBpbmRleCAgYGB4ID0gaSArIG4qa2BgIHN1Y2ggdGhhdCBgYDAgPD0gbiA8XG4gICAoai1pKS9rYGAuICBJbiBvdGhlciB3b3JkcywgdGhlIGluZGljZXMgYXJlIGBgaWBgLCBgYGkra2BgLFxuICAgYGBpKzIqa2BgLCBgYGkrMyprYGAgYW5kIHNvIG9uLCBzdG9wcGluZyB3aGVuICpqKiBpcyByZWFjaGVkIChidXRcbiAgIG5ldmVyIGluY2x1ZGluZyAqaiopLiAgSWYgKmkqIG9yICpqKiBpcyBncmVhdGVyIHRoYW4gYGBsZW4ocylgYCxcbiAgIHVzZSBgYGxlbihzKWBgLiAgSWYgKmkqIG9yICpqKiBhcmUgb21pdHRlZCBvciBgYE5vbmVgYCwgdGhleSBiZWNvbWVcbiAgICJlbmQiIHZhbHVlcyAod2hpY2ggZW5kIGRlcGVuZHMgb24gdGhlIHNpZ24gb2YgKmsqKS4gIE5vdGUsICprKlxuICAgY2Fubm90IGJlIHplcm8uIElmICprKiBpcyBgYE5vbmVgYCwgaXQgaXMgdHJlYXRlZCBsaWtlIGBgMWBgLlxuXG42LiAqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIElmICpzKiBhbmQgKnQqIGFyZSBib3RoIHN0cmluZ3MsXG4gICBzb21lIFB5dGhvbiBpbXBsZW1lbnRhdGlvbnMgc3VjaCBhcyBDUHl0aG9uIGNhbiB1c3VhbGx5IHBlcmZvcm0gYW5cbiAgIGluLXBsYWNlIG9wdGltaXphdGlvbiBmb3IgYXNzaWdubWVudHMgb2YgdGhlIGZvcm0gYGBzID0gcyArIHRgYCBvclxuICAgYGBzICs9IHRgYC4gIFdoZW4gYXBwbGljYWJsZSwgdGhpcyBvcHRpbWl6YXRpb24gbWFrZXMgcXVhZHJhdGljXG4gICBydW4tdGltZSBtdWNoIGxlc3MgbGlrZWx5LiAgVGhpcyBvcHRpbWl6YXRpb24gaXMgYm90aCB2ZXJzaW9uIGFuZFxuICAgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LiAgRm9yIHBlcmZvcm1hbmNlIHNlbnNpdGl2ZSBjb2RlLCBpdCBpc1xuICAgcHJlZmVyYWJsZSB0byB1c2UgdGhlIGBgc3RyLmpvaW4oKWBgIG1ldGhvZCB3aGljaCBhc3N1cmVzXG4gICBjb25zaXN0ZW50IGxpbmVhciBjb25jYXRlbmF0aW9uIHBlcmZvcm1hbmNlIGFjcm9zcyB2ZXJzaW9ucyBhbmRcbiAgIGltcGxlbWVudGF0aW9ucy5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNDogRm9ybWVybHksIHN0cmluZyBjb25jYXRlbmF0aW9uIG5ldmVyXG4gICBvY2N1cnJlZCBpbi1wbGFjZS5cblxuXG5TdHJpbmcgTWV0aG9kc1xuPT09PT09PT09PT09PT1cblxuQmVsb3cgYXJlIGxpc3RlZCB0aGUgc3RyaW5nIG1ldGhvZHMgd2hpY2ggYm90aCA4LWJpdCBzdHJpbmdzIGFuZFxuVW5pY29kZSBvYmplY3RzIHN1cHBvcnQuICBTb21lIG9mIHRoZW0gYXJlIGFsc28gYXZhaWxhYmxlIG9uXG5gYGJ5dGVhcnJheWBgIG9iamVjdHMuXG5cbkluIGFkZGl0aW9uLCBQeXRob25cJ3Mgc3RyaW5ncyBzdXBwb3J0IHRoZSBzZXF1ZW5jZSB0eXBlIG1ldGhvZHNcbmRlc2NyaWJlZCBpbiB0aGUgKlNlcXVlbmNlIFR5cGVzIC0tLSBzdHIsIHVuaWNvZGUsIGxpc3QsIHR1cGxlLFxuYnl0ZWFycmF5LCBidWZmZXIsIHhyYW5nZSogc2VjdGlvbi4gVG8gb3V0cHV0IGZvcm1hdHRlZCBzdHJpbmdzIHVzZVxudGVtcGxhdGUgc3RyaW5ncyBvciB0aGUgYGAlYGAgb3BlcmF0b3IgZGVzY3JpYmVkIGluIHRoZSAqU3RyaW5nXG5Gb3JtYXR0aW5nIE9wZXJhdGlvbnMqIHNlY3Rpb24uIEFsc28sIHNlZSB0aGUgYGByZWBgIG1vZHVsZSBmb3Igc3RyaW5nXG5mdW5jdGlvbnMgYmFzZWQgb24gcmVndWxhciBleHByZXNzaW9ucy5cblxuc3RyLmNhcGl0YWxpemUoKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBpdHMgZmlyc3QgY2hhcmFjdGVyIGNhcGl0YWxpemVkXG4gICBhbmQgdGhlIHJlc3QgbG93ZXJjYXNlZC5cblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci5jZW50ZXIod2lkdGhbLCBmaWxsY2hhcl0pXG5cbiAgIFJldHVybiBjZW50ZXJlZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi4gUGFkZGluZyBpcyBkb25lXG4gICB1c2luZyB0aGUgc3BlY2lmaWVkICpmaWxsY2hhciogKGRlZmF1bHQgaXMgYSBzcGFjZSkuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjQ6IFN1cHBvcnQgZm9yIHRoZSAqZmlsbGNoYXIqIGFyZ3VtZW50LlxuXG5zdHIuY291bnQoc3ViWywgc3RhcnRbLCBlbmRdXSlcblxuICAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2VzIG9mIHN1YnN0cmluZyAqc3ViKlxuICAgaW4gdGhlIHJhbmdlIFsqc3RhcnQqLCAqZW5kKl0uICBPcHRpb25hbCBhcmd1bWVudHMgKnN0YXJ0KiBhbmRcbiAgICplbmQqIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cblxuc3RyLmRlY29kZShbZW5jb2RpbmdbLCBlcnJvcnNdXSlcblxuICAgRGVjb2RlcyB0aGUgc3RyaW5nIHVzaW5nIHRoZSBjb2RlYyByZWdpc3RlcmVkIGZvciAqZW5jb2RpbmcqLlxuICAgKmVuY29kaW5nKiBkZWZhdWx0cyB0byB0aGUgZGVmYXVsdCBzdHJpbmcgZW5jb2RpbmcuICAqZXJyb3JzKiBtYXlcbiAgIGJlIGdpdmVuIHRvIHNldCBhIGRpZmZlcmVudCBlcnJvciBoYW5kbGluZyBzY2hlbWUuICBUaGUgZGVmYXVsdCBpc1xuICAgYGBcJ3N0cmljdFwnYGAsIG1lYW5pbmcgdGhhdCBlbmNvZGluZyBlcnJvcnMgcmFpc2UgYGBVbmljb2RlRXJyb3JgYC5cbiAgIE90aGVyIHBvc3NpYmxlIHZhbHVlcyBhcmUgYGBcJ2lnbm9yZVwnYGAsIGBgXCdyZXBsYWNlXCdgYCBhbmQgYW55IG90aGVyXG4gICBuYW1lIHJlZ2lzdGVyZWQgdmlhIGBgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKClgYCwgc2VlIHNlY3Rpb24gKkNvZGVjXG4gICBCYXNlIENsYXNzZXMqLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjIuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjM6IFN1cHBvcnQgZm9yIG90aGVyIGVycm9yIGhhbmRsaW5nIHNjaGVtZXNcbiAgIGFkZGVkLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi43OiBTdXBwb3J0IGZvciBrZXl3b3JkIGFyZ3VtZW50cyBhZGRlZC5cblxuc3RyLmVuY29kZShbZW5jb2RpbmdbLCBlcnJvcnNdXSlcblxuICAgUmV0dXJuIGFuIGVuY29kZWQgdmVyc2lvbiBvZiB0aGUgc3RyaW5nLiAgRGVmYXVsdCBlbmNvZGluZyBpcyB0aGVcbiAgIGN1cnJlbnQgZGVmYXVsdCBzdHJpbmcgZW5jb2RpbmcuICAqZXJyb3JzKiBtYXkgYmUgZ2l2ZW4gdG8gc2V0IGFcbiAgIGRpZmZlcmVudCBlcnJvciBoYW5kbGluZyBzY2hlbWUuICBUaGUgZGVmYXVsdCBmb3IgKmVycm9ycyogaXNcbiAgIGBgXCdzdHJpY3RcJ2BgLCBtZWFuaW5nIHRoYXQgZW5jb2RpbmcgZXJyb3JzIHJhaXNlIGFcbiAgIGBgVW5pY29kZUVycm9yYGAuICBPdGhlciBwb3NzaWJsZSB2YWx1ZXMgYXJlIGBgXCdpZ25vcmVcJ2BgLFxuICAgYGBcJ3JlcGxhY2VcJ2BgLCBgYFwneG1sY2hhcnJlZnJlcGxhY2VcJ2BgLCBgYFwnYmFja3NsYXNocmVwbGFjZVwnYGAgYW5kXG4gICBhbnkgb3RoZXIgbmFtZSByZWdpc3RlcmVkIHZpYSBgYGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigpYGAsIHNlZVxuICAgc2VjdGlvbiAqQ29kZWMgQmFzZSBDbGFzc2VzKi4gRm9yIGEgbGlzdCBvZiBwb3NzaWJsZSBlbmNvZGluZ3MsIHNlZVxuICAgc2VjdGlvbiAqU3RhbmRhcmQgRW5jb2RpbmdzKi5cblxuICAgTmV3IGluIHZlcnNpb24gMi4wLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBTdXBwb3J0IGZvciBgYFwneG1sY2hhcnJlZnJlcGxhY2VcJ2BgIGFuZFxuICAgYGBcJ2JhY2tzbGFzaHJlcGxhY2VcJ2BgIGFuZCBvdGhlciBlcnJvciBoYW5kbGluZyBzY2hlbWVzIGFkZGVkLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi43OiBTdXBwb3J0IGZvciBrZXl3b3JkIGFyZ3VtZW50cyBhZGRlZC5cblxuc3RyLmVuZHN3aXRoKHN1ZmZpeFssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiBgYFRydWVgYCBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCB0aGUgc3BlY2lmaWVkICpzdWZmaXgqLFxuICAgb3RoZXJ3aXNlIHJldHVybiBgYEZhbHNlYGAuICAqc3VmZml4KiBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mXG4gICBzdWZmaXhlcyB0byBsb29rIGZvci4gIFdpdGggb3B0aW9uYWwgKnN0YXJ0KiwgdGVzdCBiZWdpbm5pbmcgYXRcbiAgIHRoYXQgcG9zaXRpb24uICBXaXRoIG9wdGlvbmFsICplbmQqLCBzdG9wIGNvbXBhcmluZyBhdCB0aGF0XG4gICBwb3NpdGlvbi5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNTogQWNjZXB0IHR1cGxlcyBhcyAqc3VmZml4Ki5cblxuc3RyLmV4cGFuZHRhYnMoW3RhYnNpemVdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2hlcmUgYWxsIHRhYiBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZFxuICAgYnkgb25lIG9yIG1vcmUgc3BhY2VzLCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgY29sdW1uIGFuZCB0aGVcbiAgIGdpdmVuIHRhYiBzaXplLiAgVGFiIHBvc2l0aW9ucyBvY2N1ciBldmVyeSAqdGFic2l6ZSogY2hhcmFjdGVyc1xuICAgKGRlZmF1bHQgaXMgOCwgZ2l2aW5nIHRhYiBwb3NpdGlvbnMgYXQgY29sdW1ucyAwLCA4LCAxNiBhbmQgc28gb24pLlxuICAgVG8gZXhwYW5kIHRoZSBzdHJpbmcsIHRoZSBjdXJyZW50IGNvbHVtbiBpcyBzZXQgdG8gemVybyBhbmQgdGhlXG4gICBzdHJpbmcgaXMgZXhhbWluZWQgY2hhcmFjdGVyIGJ5IGNoYXJhY3Rlci4gIElmIHRoZSBjaGFyYWN0ZXIgaXMgYVxuICAgdGFiIChgYFxcdGBgKSwgb25lIG9yIG1vcmUgc3BhY2UgY2hhcmFjdGVycyBhcmUgaW5zZXJ0ZWQgaW4gdGhlXG4gICByZXN1bHQgdW50aWwgdGhlIGN1cnJlbnQgY29sdW1uIGlzIGVxdWFsIHRvIHRoZSBuZXh0IHRhYiBwb3NpdGlvbi5cbiAgIChUaGUgdGFiIGNoYXJhY3RlciBpdHNlbGYgaXMgbm90IGNvcGllZC4pICBJZiB0aGUgY2hhcmFjdGVyIGlzIGFcbiAgIG5ld2xpbmUgKGBgXFxuYGApIG9yIHJldHVybiAoYGBcXHJgYCksIGl0IGlzIGNvcGllZCBhbmQgdGhlIGN1cnJlbnRcbiAgIGNvbHVtbiBpcyByZXNldCB0byB6ZXJvLiAgQW55IG90aGVyIGNoYXJhY3RlciBpcyBjb3BpZWQgdW5jaGFuZ2VkXG4gICBhbmQgdGhlIGN1cnJlbnQgY29sdW1uIGlzIGluY3JlbWVudGVkIGJ5IG9uZSByZWdhcmRsZXNzIG9mIGhvdyB0aGVcbiAgIGNoYXJhY3RlciBpcyByZXByZXNlbnRlZCB3aGVuIHByaW50ZWQuXG5cbiAgID4+PiBcJzAxXFx0MDEyXFx0MDEyM1xcdDAxMjM0XCcuZXhwYW5kdGFicygpXG4gICBcJzAxICAgICAgMDEyICAgICAwMTIzICAgIDAxMjM0XCdcbiAgID4+PiBcJzAxXFx0MDEyXFx0MDEyM1xcdDAxMjM0XCcuZXhwYW5kdGFicyg0KVxuICAgXCcwMSAgMDEyIDAxMjMgICAgMDEyMzRcJ1xuXG5zdHIuZmluZChzdWJbLCBzdGFydFssIGVuZF1dKVxuXG4gICBSZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBpbiB0aGUgc3RyaW5nIHdoZXJlIHN1YnN0cmluZyAqc3ViKiBpc1xuICAgZm91bmQsIHN1Y2ggdGhhdCAqc3ViKiBpcyBjb250YWluZWQgaW4gdGhlIHNsaWNlIGBgc1tzdGFydDplbmRdYGAuXG4gICBPcHRpb25hbCBhcmd1bWVudHMgKnN0YXJ0KiBhbmQgKmVuZCogYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlXG4gICBub3RhdGlvbi4gIFJldHVybiBgYC0xYGAgaWYgKnN1YiogaXMgbm90IGZvdW5kLlxuXG4gICBOb3RlOiBUaGUgYGBmaW5kKClgYCBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgb25seSBpZiB5b3UgbmVlZCB0byBrbm93IHRoZVxuICAgICBwb3NpdGlvbiBvZiAqc3ViKi4gIFRvIGNoZWNrIGlmICpzdWIqIGlzIGEgc3Vic3RyaW5nIG9yIG5vdCwgdXNlXG4gICAgIHRoZSBgYGluYGAgb3BlcmF0b3I6XG5cbiAgICAgICAgPj4+IFwnUHlcJyBpbiBcJ1B5dGhvblwnXG4gICAgICAgIFRydWVcblxuc3RyLmZvcm1hdCgqYXJncywgKiprd2FyZ3MpXG5cbiAgIFBlcmZvcm0gYSBzdHJpbmcgZm9ybWF0dGluZyBvcGVyYXRpb24uICBUaGUgc3RyaW5nIG9uIHdoaWNoIHRoaXNcbiAgIG1ldGhvZCBpcyBjYWxsZWQgY2FuIGNvbnRhaW4gbGl0ZXJhbCB0ZXh0IG9yIHJlcGxhY2VtZW50IGZpZWxkc1xuICAgZGVsaW1pdGVkIGJ5IGJyYWNlcyBgYHt9YGAuICBFYWNoIHJlcGxhY2VtZW50IGZpZWxkIGNvbnRhaW5zIGVpdGhlclxuICAgdGhlIG51bWVyaWMgaW5kZXggb2YgYSBwb3NpdGlvbmFsIGFyZ3VtZW50LCBvciB0aGUgbmFtZSBvZiBhXG4gICBrZXl3b3JkIGFyZ3VtZW50LiAgUmV0dXJucyBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aGVyZSBlYWNoXG4gICByZXBsYWNlbWVudCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlXG4gICBjb3JyZXNwb25kaW5nIGFyZ3VtZW50LlxuXG4gICA+Pj4gIlRoZSBzdW0gb2YgMSArIDIgaXMgezB9Ii5mb3JtYXQoMSsyKVxuICAgXCdUaGUgc3VtIG9mIDEgKyAyIGlzIDNcJ1xuXG4gICBTZWUgKkZvcm1hdCBTdHJpbmcgU3ludGF4KiBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgdmFyaW91c1xuICAgZm9ybWF0dGluZyBvcHRpb25zIHRoYXQgY2FuIGJlIHNwZWNpZmllZCBpbiBmb3JtYXQgc3RyaW5ncy5cblxuICAgVGhpcyBtZXRob2Qgb2Ygc3RyaW5nIGZvcm1hdHRpbmcgaXMgdGhlIG5ldyBzdGFuZGFyZCBpbiBQeXRob24gMyxcbiAgIGFuZCBzaG91bGQgYmUgcHJlZmVycmVkIHRvIHRoZSBgYCVgYCBmb3JtYXR0aW5nIGRlc2NyaWJlZCBpblxuICAgKlN0cmluZyBGb3JtYXR0aW5nIE9wZXJhdGlvbnMqIGluIG5ldyBjb2RlLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjYuXG5cbnN0ci5pbmRleChzdWJbLCBzdGFydFssIGVuZF1dKVxuXG4gICBMaWtlIGBgZmluZCgpYGAsIGJ1dCByYWlzZSBgYFZhbHVlRXJyb3JgYCB3aGVuIHRoZSBzdWJzdHJpbmcgaXMgbm90XG4gICBmb3VuZC5cblxuc3RyLmlzYWxudW0oKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBhbHBoYW51bWVyaWMgYW5kXG4gICB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuaXNhbHBoYSgpXG5cbiAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGFscGhhYmV0aWMgYW5kXG4gICB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuaXNkaWdpdCgpXG5cbiAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGRpZ2l0cyBhbmQgdGhlcmUgaXNcbiAgIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS5cblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci5pc2xvd2VyKClcblxuICAgUmV0dXJuIHRydWUgaWYgYWxsIGNhc2VkIGNoYXJhY3RlcnMgWzRdIGluIHRoZSBzdHJpbmcgYXJlIGxvd2VyY2FzZVxuICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS5cblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci5pc3NwYWNlKClcblxuICAgUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmdcbiAgIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuaXN0aXRsZSgpXG5cbiAgIFJldHVybiB0cnVlIGlmIHRoZSBzdHJpbmcgaXMgYSB0aXRsZWNhc2VkIHN0cmluZyBhbmQgdGhlcmUgaXMgYXRcbiAgIGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZvciBleGFtcGxlIHVwcGVyY2FzZSBjaGFyYWN0ZXJzIG1heSBvbmx5XG4gICBmb2xsb3cgdW5jYXNlZCBjaGFyYWN0ZXJzIGFuZCBsb3dlcmNhc2UgY2hhcmFjdGVycyBvbmx5IGNhc2VkIG9uZXMuXG4gICBSZXR1cm4gZmFsc2Ugb3RoZXJ3aXNlLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLmlzdXBwZXIoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2FzZWQgY2hhcmFjdGVycyBbNF0gaW4gdGhlIHN0cmluZyBhcmUgdXBwZXJjYXNlXG4gICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNhc2VkIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLmpvaW4oaXRlcmFibGUpXG5cbiAgIFJldHVybiBhIHN0cmluZyB3aGljaCBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgc3RyaW5ncyBpbiB0aGVcbiAgICppdGVyYWJsZSogKml0ZXJhYmxlKi4gIFRoZSBzZXBhcmF0b3IgYmV0d2VlbiBlbGVtZW50cyBpcyB0aGVcbiAgIHN0cmluZyBwcm92aWRpbmcgdGhpcyBtZXRob2QuXG5cbnN0ci5sanVzdCh3aWR0aFssIGZpbGxjaGFyXSlcblxuICAgUmV0dXJuIHRoZSBzdHJpbmcgbGVmdCBqdXN0aWZpZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoICp3aWR0aCouXG4gICBQYWRkaW5nIGlzIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCAqZmlsbGNoYXIqIChkZWZhdWx0IGlzIGFcbiAgIHNwYWNlKS4gIFRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW4gb3JcbiAgIGVxdWFsIHRvIGBgbGVuKHMpYGAuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjQ6IFN1cHBvcnQgZm9yIHRoZSAqZmlsbGNoYXIqIGFyZ3VtZW50LlxuXG5zdHIubG93ZXIoKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBhbGwgdGhlIGNhc2VkIGNoYXJhY3RlcnMgWzRdXG4gICBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLmxzdHJpcChbY2hhcnNdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBsZWFkaW5nIGNoYXJhY3RlcnMgcmVtb3ZlZC4gIFRoZVxuICAgKmNoYXJzKiBhcmd1bWVudCBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBzZXQgb2YgY2hhcmFjdGVycyB0byBiZVxuICAgcmVtb3ZlZC4gIElmIG9taXR0ZWQgb3IgYGBOb25lYGAsIHRoZSAqY2hhcnMqIGFyZ3VtZW50IGRlZmF1bHRzIHRvXG4gICByZW1vdmluZyB3aGl0ZXNwYWNlLiAgVGhlICpjaGFycyogYXJndW1lbnQgaXMgbm90IGEgcHJlZml4OyByYXRoZXIsXG4gICBhbGwgY29tYmluYXRpb25zIG9mIGl0cyB2YWx1ZXMgYXJlIHN0cmlwcGVkOlxuXG4gICA+Pj4gXCcgICBzcGFjaW91cyAgIFwnLmxzdHJpcCgpXG4gICBcJ3NwYWNpb3VzICAgXCdcbiAgID4+PiBcJ3d3dy5leGFtcGxlLmNvbVwnLmxzdHJpcChcJ2Ntb3d6LlwnKVxuICAgXCdleGFtcGxlLmNvbVwnXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjIuMjogU3VwcG9ydCBmb3IgdGhlICpjaGFycyogYXJndW1lbnQuXG5cbnN0ci5wYXJ0aXRpb24oc2VwKVxuXG4gICBTcGxpdCB0aGUgc3RyaW5nIGF0IHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mICpzZXAqLCBhbmQgcmV0dXJuIGFcbiAgIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlIHNlcGFyYXRvclxuICAgaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgdGhlIHNlcGFyYXRvci4gIElmIHRoZSBzZXBhcmF0b3IgaXMgbm90XG4gICBmb3VuZCwgcmV0dXJuIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBzdHJpbmcgaXRzZWxmLCBmb2xsb3dlZCBieVxuICAgdHdvIGVtcHR5IHN0cmluZ3MuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDIuNS5cblxuc3RyLnJlcGxhY2Uob2xkLCBuZXdbLCBjb3VudF0pXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGFsbCBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgKm9sZCpcbiAgIHJlcGxhY2VkIGJ5ICpuZXcqLiAgSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50ICpjb3VudCogaXMgZ2l2ZW4sIG9ubHlcbiAgIHRoZSBmaXJzdCAqY291bnQqIG9jY3VycmVuY2VzIGFyZSByZXBsYWNlZC5cblxuc3RyLnJmaW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiB0aGUgaGlnaGVzdCBpbmRleCBpbiB0aGUgc3RyaW5nIHdoZXJlIHN1YnN0cmluZyAqc3ViKiBpc1xuICAgZm91bmQsIHN1Y2ggdGhhdCAqc3ViKiBpcyBjb250YWluZWQgd2l0aGluIGBgc1tzdGFydDplbmRdYGAuXG4gICBPcHRpb25hbCBhcmd1bWVudHMgKnN0YXJ0KiBhbmQgKmVuZCogYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlXG4gICBub3RhdGlvbi4gIFJldHVybiBgYC0xYGAgb24gZmFpbHVyZS5cblxuc3RyLnJpbmRleChzdWJbLCBzdGFydFssIGVuZF1dKVxuXG4gICBMaWtlIGBgcmZpbmQoKWBgIGJ1dCByYWlzZXMgYGBWYWx1ZUVycm9yYGAgd2hlbiB0aGUgc3Vic3RyaW5nICpzdWIqXG4gICBpcyBub3QgZm91bmQuXG5cbnN0ci5yanVzdCh3aWR0aFssIGZpbGxjaGFyXSlcblxuICAgUmV0dXJuIHRoZSBzdHJpbmcgcmlnaHQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCAqd2lkdGgqLlxuICAgUGFkZGluZyBpcyBkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgKmZpbGxjaGFyKiAoZGVmYXVsdCBpcyBhXG4gICBzcGFjZSkuIFRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW4gb3JcbiAgIGVxdWFsIHRvIGBgbGVuKHMpYGAuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjQ6IFN1cHBvcnQgZm9yIHRoZSAqZmlsbGNoYXIqIGFyZ3VtZW50LlxuXG5zdHIucnBhcnRpdGlvbihzZXApXG5cbiAgIFNwbGl0IHRoZSBzdHJpbmcgYXQgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiAqc2VwKiwgYW5kIHJldHVybiBhXG4gICAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHBhcnQgYmVmb3JlIHRoZSBzZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3JcbiAgIGl0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIHRoZSBzZXBhcmF0b3IuICBJZiB0aGUgc2VwYXJhdG9yIGlzIG5vdFxuICAgZm91bmQsIHJldHVybiBhIDMtdHVwbGUgY29udGFpbmluZyB0d28gZW1wdHkgc3RyaW5ncywgZm9sbG93ZWQgYnlcbiAgIHRoZSBzdHJpbmcgaXRzZWxmLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjUuXG5cbnN0ci5yc3BsaXQoW3NlcFssIG1heHNwbGl0XV0pXG5cbiAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcsIHVzaW5nICpzZXAqIGFzIHRoZVxuICAgZGVsaW1pdGVyIHN0cmluZy4gSWYgKm1heHNwbGl0KiBpcyBnaXZlbiwgYXQgbW9zdCAqbWF4c3BsaXQqIHNwbGl0c1xuICAgYXJlIGRvbmUsIHRoZSAqcmlnaHRtb3N0KiBvbmVzLiAgSWYgKnNlcCogaXMgbm90IHNwZWNpZmllZCBvclxuICAgYGBOb25lYGAsIGFueSB3aGl0ZXNwYWNlIHN0cmluZyBpcyBhIHNlcGFyYXRvci4gIEV4Y2VwdCBmb3JcbiAgIHNwbGl0dGluZyBmcm9tIHRoZSByaWdodCwgYGByc3BsaXQoKWBgIGJlaGF2ZXMgbGlrZSBgYHNwbGl0KClgYFxuICAgd2hpY2ggaXMgZGVzY3JpYmVkIGluIGRldGFpbCBiZWxvdy5cblxuICAgTmV3IGluIHZlcnNpb24gMi40LlxuXG5zdHIucnN0cmlwKFtjaGFyc10pXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHRyYWlsaW5nIGNoYXJhY3RlcnMgcmVtb3ZlZC4gIFRoZVxuICAgKmNoYXJzKiBhcmd1bWVudCBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBzZXQgb2YgY2hhcmFjdGVycyB0byBiZVxuICAgcmVtb3ZlZC4gIElmIG9taXR0ZWQgb3IgYGBOb25lYGAsIHRoZSAqY2hhcnMqIGFyZ3VtZW50IGRlZmF1bHRzIHRvXG4gICByZW1vdmluZyB3aGl0ZXNwYWNlLiAgVGhlICpjaGFycyogYXJndW1lbnQgaXMgbm90IGEgc3VmZml4OyByYXRoZXIsXG4gICBhbGwgY29tYmluYXRpb25zIG9mIGl0cyB2YWx1ZXMgYXJlIHN0cmlwcGVkOlxuXG4gICA+Pj4gXCcgICBzcGFjaW91cyAgIFwnLnJzdHJpcCgpXG4gICBcJyAgIHNwYWNpb3VzXCdcbiAgID4+PiBcJ21pc3Npc3NpcHBpXCcucnN0cmlwKFwnaXB6XCcpXG4gICBcJ21pc3Npc3NcJ1xuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4yLjI6IFN1cHBvcnQgZm9yIHRoZSAqY2hhcnMqIGFyZ3VtZW50LlxuXG5zdHIuc3BsaXQoW3NlcFssIG1heHNwbGl0XV0pXG5cbiAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcsIHVzaW5nICpzZXAqIGFzIHRoZVxuICAgZGVsaW1pdGVyIHN0cmluZy4gIElmICptYXhzcGxpdCogaXMgZ2l2ZW4sIGF0IG1vc3QgKm1heHNwbGl0KlxuICAgc3BsaXRzIGFyZSBkb25lICh0aHVzLCB0aGUgbGlzdCB3aWxsIGhhdmUgYXQgbW9zdCBgYG1heHNwbGl0KzFgYFxuICAgZWxlbWVudHMpLiAgSWYgKm1heHNwbGl0KiBpcyBub3Qgc3BlY2lmaWVkIG9yIGBgLTFgYCwgdGhlbiB0aGVyZSBpc1xuICAgbm8gbGltaXQgb24gdGhlIG51bWJlciBvZiBzcGxpdHMgKGFsbCBwb3NzaWJsZSBzcGxpdHMgYXJlIG1hZGUpLlxuXG4gICBJZiAqc2VwKiBpcyBnaXZlbiwgY29uc2VjdXRpdmUgZGVsaW1pdGVycyBhcmUgbm90IGdyb3VwZWQgdG9nZXRoZXJcbiAgIGFuZCBhcmUgZGVlbWVkIHRvIGRlbGltaXQgZW1wdHkgc3RyaW5ncyAoZm9yIGV4YW1wbGUsXG4gICBgYFwnMSwsMlwnLnNwbGl0KFwnLFwnKWBgIHJldHVybnMgYGBbXCcxXCcsIFwnXCcsIFwnMlwnXWBgKS4gIFRoZSAqc2VwKlxuICAgYXJndW1lbnQgbWF5IGNvbnNpc3Qgb2YgbXVsdGlwbGUgY2hhcmFjdGVycyAoZm9yIGV4YW1wbGUsXG4gICBgYFwnMTw+Mjw+M1wnLnNwbGl0KFwnPD5cJylgYCByZXR1cm5zIGBgW1wnMVwnLCBcJzJcJywgXCczXCddYGApLiBTcGxpdHRpbmdcbiAgIGFuIGVtcHR5IHN0cmluZyB3aXRoIGEgc3BlY2lmaWVkIHNlcGFyYXRvciByZXR1cm5zIGBgW1wnXCddYGAuXG5cbiAgIElmICpzZXAqIGlzIG5vdCBzcGVjaWZpZWQgb3IgaXMgYGBOb25lYGAsIGEgZGlmZmVyZW50IHNwbGl0dGluZ1xuICAgYWxnb3JpdGhtIGlzIGFwcGxpZWQ6IHJ1bnMgb2YgY29uc2VjdXRpdmUgd2hpdGVzcGFjZSBhcmUgcmVnYXJkZWRcbiAgIGFzIGEgc2luZ2xlIHNlcGFyYXRvciwgYW5kIHRoZSByZXN1bHQgd2lsbCBjb250YWluIG5vIGVtcHR5IHN0cmluZ3NcbiAgIGF0IHRoZSBzdGFydCBvciBlbmQgaWYgdGhlIHN0cmluZyBoYXMgbGVhZGluZyBvciB0cmFpbGluZ1xuICAgd2hpdGVzcGFjZS4gIENvbnNlcXVlbnRseSwgc3BsaXR0aW5nIGFuIGVtcHR5IHN0cmluZyBvciBhIHN0cmluZ1xuICAgY29uc2lzdGluZyBvZiBqdXN0IHdoaXRlc3BhY2Ugd2l0aCBhIGBgTm9uZWBgIHNlcGFyYXRvciByZXR1cm5zXG4gICBgYFtdYGAuXG5cbiAgIEZvciBleGFtcGxlLCBgYFwnIDEgIDIgICAzICBcJy5zcGxpdCgpYGAgcmV0dXJucyBgYFtcJzFcJywgXCcyXCcsIFwnM1wnXWBgLFxuICAgYW5kIGBgXCcgIDEgIDIgICAzICBcJy5zcGxpdChOb25lLCAxKWBgIHJldHVybnMgYGBbXCcxXCcsIFwnMiAgIDMgIFwnXWBgLlxuXG5zdHIuc3BsaXRsaW5lcyhba2VlcGVuZHNdKVxuXG4gICBSZXR1cm4gYSBsaXN0IG9mIHRoZSBsaW5lcyBpbiB0aGUgc3RyaW5nLCBicmVha2luZyBhdCBsaW5lXG4gICBib3VuZGFyaWVzLiBUaGlzIG1ldGhvZCB1c2VzIHRoZSAqdW5pdmVyc2FsIG5ld2xpbmVzKiBhcHByb2FjaCB0b1xuICAgc3BsaXR0aW5nIGxpbmVzLiBMaW5lIGJyZWFrcyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgbGlzdFxuICAgdW5sZXNzICprZWVwZW5kcyogaXMgZ2l2ZW4gYW5kIHRydWUuXG5cbiAgIEZvciBleGFtcGxlLCBgYFwnYWIgY1xcblxcbmRlIGZnXFxya2xcXHJcXG5cJy5zcGxpdGxpbmVzKClgYCByZXR1cm5zXG4gICBgYFtcJ2FiIGNcJywgXCdcJywgXCdkZSBmZ1wnLCBcJ2tsXCddYGAsIHdoaWxlIHRoZSBzYW1lIGNhbGwgd2l0aFxuICAgYGBzcGxpdGxpbmVzKFRydWUpYGAgcmV0dXJucyBgYFtcJ2FiIGNcXG5cJywgXCdcXG5cJywgXCdkZSBmZ1xcclwnLFxuICAgXCdrbFxcclxcblwnXWBgLlxuXG4gICBVbmxpa2UgYGBzcGxpdCgpYGAgd2hlbiBhIGRlbGltaXRlciBzdHJpbmcgKnNlcCogaXMgZ2l2ZW4sIHRoaXNcbiAgIG1ldGhvZCByZXR1cm5zIGFuIGVtcHR5IGxpc3QgZm9yIHRoZSBlbXB0eSBzdHJpbmcsIGFuZCBhIHRlcm1pbmFsXG4gICBsaW5lIGJyZWFrIGRvZXMgbm90IHJlc3VsdCBpbiBhbiBleHRyYSBsaW5lLlxuXG5zdHIuc3RhcnRzd2l0aChwcmVmaXhbLCBzdGFydFssIGVuZF1dKVxuXG4gICBSZXR1cm4gYGBUcnVlYGAgaWYgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSAqcHJlZml4Kiwgb3RoZXJ3aXNlXG4gICByZXR1cm4gYGBGYWxzZWBgLiAqcHJlZml4KiBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIHByZWZpeGVzIHRvIGxvb2tcbiAgIGZvci4gIFdpdGggb3B0aW9uYWwgKnN0YXJ0KiwgdGVzdCBzdHJpbmcgYmVnaW5uaW5nIGF0IHRoYXRcbiAgIHBvc2l0aW9uLiAgV2l0aCBvcHRpb25hbCAqZW5kKiwgc3RvcCBjb21wYXJpbmcgc3RyaW5nIGF0IHRoYXRcbiAgIHBvc2l0aW9uLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi41OiBBY2NlcHQgdHVwbGVzIGFzICpwcmVmaXgqLlxuXG5zdHIuc3RyaXAoW2NoYXJzXSlcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggdGhlIGxlYWRpbmcgYW5kIHRyYWlsaW5nXG4gICBjaGFyYWN0ZXJzIHJlbW92ZWQuIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzIGEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlXG4gICBzZXQgb2YgY2hhcmFjdGVycyB0byBiZSByZW1vdmVkLiBJZiBvbWl0dGVkIG9yIGBgTm9uZWBgLCB0aGVcbiAgICpjaGFycyogYXJndW1lbnQgZGVmYXVsdHMgdG8gcmVtb3Zpbmcgd2hpdGVzcGFjZS4gVGhlICpjaGFycypcbiAgIGFyZ3VtZW50IGlzIG5vdCBhIHByZWZpeCBvciBzdWZmaXg7IHJhdGhlciwgYWxsIGNvbWJpbmF0aW9ucyBvZiBpdHNcbiAgIHZhbHVlcyBhcmUgc3RyaXBwZWQ6XG5cbiAgID4+PiBcJyAgIHNwYWNpb3VzICAgXCcuc3RyaXAoKVxuICAgXCdzcGFjaW91c1wnXG4gICA+Pj4gXCd3d3cuZXhhbXBsZS5jb21cJy5zdHJpcChcJ2Ntb3d6LlwnKVxuICAgXCdleGFtcGxlXCdcblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMi4yOiBTdXBwb3J0IGZvciB0aGUgKmNoYXJzKiBhcmd1bWVudC5cblxuc3RyLnN3YXBjYXNlKClcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggdXBwZXJjYXNlIGNoYXJhY3RlcnMgY29udmVydGVkIHRvXG4gICBsb3dlcmNhc2UgYW5kIHZpY2UgdmVyc2EuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIudGl0bGUoKVxuXG4gICBSZXR1cm4gYSB0aXRsZWNhc2VkIHZlcnNpb24gb2YgdGhlIHN0cmluZyB3aGVyZSB3b3JkcyBzdGFydCB3aXRoIGFuXG4gICB1cHBlcmNhc2UgY2hhcmFjdGVyIGFuZCB0aGUgcmVtYWluaW5nIGNoYXJhY3RlcnMgYXJlIGxvd2VyY2FzZS5cblxuICAgVGhlIGFsZ29yaXRobSB1c2VzIGEgc2ltcGxlIGxhbmd1YWdlLWluZGVwZW5kZW50IGRlZmluaXRpb24gb2YgYVxuICAgd29yZCBhcyBncm91cHMgb2YgY29uc2VjdXRpdmUgbGV0dGVycy4gIFRoZSBkZWZpbml0aW9uIHdvcmtzIGluXG4gICBtYW55IGNvbnRleHRzIGJ1dCBpdCBtZWFucyB0aGF0IGFwb3N0cm9waGVzIGluIGNvbnRyYWN0aW9ucyBhbmRcbiAgIHBvc3Nlc3NpdmVzIGZvcm0gd29yZCBib3VuZGFyaWVzLCB3aGljaCBtYXkgbm90IGJlIHRoZSBkZXNpcmVkXG4gICByZXN1bHQ6XG5cbiAgICAgID4+PiAidGhleVwncmUgYmlsbFwncyBmcmllbmRzIGZyb20gdGhlIFVLIi50aXRsZSgpXG4gICAgICAiVGhleVwnUmUgQmlsbFwnUyBGcmllbmRzIEZyb20gVGhlIFVrIlxuXG4gICBBIHdvcmthcm91bmQgZm9yIGFwb3N0cm9waGVzIGNhbiBiZSBjb25zdHJ1Y3RlZCB1c2luZyByZWd1bGFyXG4gICBleHByZXNzaW9uczpcblxuICAgICAgPj4+IGltcG9ydCByZVxuICAgICAgPj4+IGRlZiB0aXRsZWNhc2Uocyk6XG4gICAgICAuLi4gICAgIHJldHVybiByZS5zdWIociJbQS1aYS16XSsoXCdbQS1aYS16XSspPyIsXG4gICAgICAuLi4gICAgICAgICAgICAgICAgICAgbGFtYmRhIG1vOiBtby5ncm91cCgwKVswXS51cHBlcigpICtcbiAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vLmdyb3VwKDApWzE6XS5sb3dlcigpLFxuICAgICAgLi4uICAgICAgICAgICAgICAgICAgIHMpXG4gICAgICAuLi5cbiAgICAgID4+PiB0aXRsZWNhc2UoInRoZXlcJ3JlIGJpbGxcJ3MgZnJpZW5kcy4iKVxuICAgICAgIlRoZXlcJ3JlIEJpbGxcJ3MgRnJpZW5kcy4iXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIudHJhbnNsYXRlKHRhYmxlWywgZGVsZXRlY2hhcnNdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2hlcmUgYWxsIGNoYXJhY3RlcnMgb2NjdXJyaW5nIGluIHRoZVxuICAgb3B0aW9uYWwgYXJndW1lbnQgKmRlbGV0ZWNoYXJzKiBhcmUgcmVtb3ZlZCwgYW5kIHRoZSByZW1haW5pbmdcbiAgIGNoYXJhY3RlcnMgaGF2ZSBiZWVuIG1hcHBlZCB0aHJvdWdoIHRoZSBnaXZlbiB0cmFuc2xhdGlvbiB0YWJsZSxcbiAgIHdoaWNoIG11c3QgYmUgYSBzdHJpbmcgb2YgbGVuZ3RoIDI1Ni5cblxuICAgWW91IGNhbiB1c2UgdGhlIGBgbWFrZXRyYW5zKClgYCBoZWxwZXIgZnVuY3Rpb24gaW4gdGhlIGBgc3RyaW5nYGBcbiAgIG1vZHVsZSB0byBjcmVhdGUgYSB0cmFuc2xhdGlvbiB0YWJsZS4gRm9yIHN0cmluZyBvYmplY3RzLCBzZXQgdGhlXG4gICAqdGFibGUqIGFyZ3VtZW50IHRvIGBgTm9uZWBgIGZvciB0cmFuc2xhdGlvbnMgdGhhdCBvbmx5IGRlbGV0ZVxuICAgY2hhcmFjdGVyczpcblxuICAgPj4+IFwncmVhZCB0aGlzIHNob3J0IHRleHRcJy50cmFuc2xhdGUoTm9uZSwgXCdhZWlvdVwnKVxuICAgXCdyZCB0aHMgc2hydCB0eHRcJ1xuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjY6IFN1cHBvcnQgZm9yIGEgYGBOb25lYGAgKnRhYmxlKiBhcmd1bWVudC5cblxuICAgRm9yIFVuaWNvZGUgb2JqZWN0cywgdGhlIGBgdHJhbnNsYXRlKClgYCBtZXRob2QgZG9lcyBub3QgYWNjZXB0IHRoZVxuICAgb3B0aW9uYWwgKmRlbGV0ZWNoYXJzKiBhcmd1bWVudC4gIEluc3RlYWQsIGl0IHJldHVybnMgYSBjb3B5IG9mIHRoZVxuICAgKnMqIHdoZXJlIGFsbCBjaGFyYWN0ZXJzIGhhdmUgYmVlbiBtYXBwZWQgdGhyb3VnaCB0aGUgZ2l2ZW5cbiAgIHRyYW5zbGF0aW9uIHRhYmxlIHdoaWNoIG11c3QgYmUgYSBtYXBwaW5nIG9mIFVuaWNvZGUgb3JkaW5hbHMgdG9cbiAgIFVuaWNvZGUgb3JkaW5hbHMsIFVuaWNvZGUgc3RyaW5ncyBvciBgYE5vbmVgYC4gVW5tYXBwZWQgY2hhcmFjdGVyc1xuICAgYXJlIGxlZnQgdW50b3VjaGVkLiBDaGFyYWN0ZXJzIG1hcHBlZCB0byBgYE5vbmVgYCBhcmUgZGVsZXRlZC5cbiAgIE5vdGUsIGEgbW9yZSBmbGV4aWJsZSBhcHByb2FjaCBpcyB0byBjcmVhdGUgYSBjdXN0b20gY2hhcmFjdGVyXG4gICBtYXBwaW5nIGNvZGVjIHVzaW5nIHRoZSBgYGNvZGVjc2BgIG1vZHVsZSAoc2VlIGBgZW5jb2RpbmdzLmNwMTI1MWBgXG4gICBmb3IgYW4gZXhhbXBsZSkuXG5cbnN0ci51cHBlcigpXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGFsbCB0aGUgY2FzZWQgY2hhcmFjdGVycyBbNF1cbiAgIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UuICBOb3RlIHRoYXQgYGBzdHIudXBwZXIoKS5pc3VwcGVyKClgYCBtaWdodFxuICAgYmUgYGBGYWxzZWBgIGlmIGBgc2BgIGNvbnRhaW5zIHVuY2FzZWQgY2hhcmFjdGVycyBvciBpZiB0aGUgVW5pY29kZVxuICAgY2F0ZWdvcnkgb2YgdGhlIHJlc3VsdGluZyBjaGFyYWN0ZXIocykgaXMgbm90ICJMdSIgKExldHRlcixcbiAgIHVwcGVyY2FzZSksIGJ1dCBlLmcuICJMdCIgKExldHRlciwgdGl0bGVjYXNlKS5cblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci56ZmlsbCh3aWR0aClcblxuICAgUmV0dXJuIHRoZSBudW1lcmljIHN0cmluZyBsZWZ0IGZpbGxlZCB3aXRoIHplcm9zIGluIGEgc3RyaW5nIG9mXG4gICBsZW5ndGggKndpZHRoKi4gIEEgc2lnbiBwcmVmaXggaXMgaGFuZGxlZCBjb3JyZWN0bHkuICBUaGUgb3JpZ2luYWxcbiAgIHN0cmluZyBpcyByZXR1cm5lZCBpZiAqd2lkdGgqIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgYGxlbihzKWBgLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjIuMi5cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBwcmVzZW50IG9ubHkgb24gdW5pY29kZSBvYmplY3RzOlxuXG51bmljb2RlLmlzbnVtZXJpYygpXG5cbiAgIFJldHVybiBgYFRydWVgYCBpZiB0aGVyZSBhcmUgb25seSBudW1lcmljIGNoYXJhY3RlcnMgaW4gUyxcbiAgIGBgRmFsc2VgYCBvdGhlcndpc2UuIE51bWVyaWMgY2hhcmFjdGVycyBpbmNsdWRlIGRpZ2l0IGNoYXJhY3RlcnMsXG4gICBhbmQgYWxsIGNoYXJhY3RlcnMgdGhhdCBoYXZlIHRoZSBVbmljb2RlIG51bWVyaWMgdmFsdWUgcHJvcGVydHksXG4gICBlLmcuIFUrMjE1NSwgVlVMR0FSIEZSQUNUSU9OIE9ORSBGSUZUSC5cblxudW5pY29kZS5pc2RlY2ltYWwoKVxuXG4gICBSZXR1cm4gYGBUcnVlYGAgaWYgdGhlcmUgYXJlIG9ubHkgZGVjaW1hbCBjaGFyYWN0ZXJzIGluIFMsXG4gICBgYEZhbHNlYGAgb3RoZXJ3aXNlLiBEZWNpbWFsIGNoYXJhY3RlcnMgaW5jbHVkZSBkaWdpdCBjaGFyYWN0ZXJzLFxuICAgYW5kIGFsbCBjaGFyYWN0ZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gZm9ybSBkZWNpbWFsLXJhZGl4IG51bWJlcnMsXG4gICBlLmcuIFUrMDY2MCwgQVJBQklDLUlORElDIERJR0lUIFpFUk8uXG5cblxuU3RyaW5nIEZvcm1hdHRpbmcgT3BlcmF0aW9uc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5TdHJpbmcgYW5kIFVuaWNvZGUgb2JqZWN0cyBoYXZlIG9uZSB1bmlxdWUgYnVpbHQtaW4gb3BlcmF0aW9uOiB0aGVcbmBgJWBgIG9wZXJhdG9yIChtb2R1bG8pLiAgVGhpcyBpcyBhbHNvIGtub3duIGFzIHRoZSBzdHJpbmdcbipmb3JtYXR0aW5nKiBvciAqaW50ZXJwb2xhdGlvbiogb3BlcmF0b3IuICBHaXZlbiBgYGZvcm1hdCAlIHZhbHVlc2BgXG4od2hlcmUgKmZvcm1hdCogaXMgYSBzdHJpbmcgb3IgVW5pY29kZSBvYmplY3QpLCBgYCVgYCBjb252ZXJzaW9uXG5zcGVjaWZpY2F0aW9ucyBpbiAqZm9ybWF0KiBhcmUgcmVwbGFjZWQgd2l0aCB6ZXJvIG9yIG1vcmUgZWxlbWVudHMgb2Zcbip2YWx1ZXMqLiAgVGhlIGVmZmVjdCBpcyBzaW1pbGFyIHRvIHRoZSB1c2luZyBgYHNwcmludGYoKWBgIGluIHRoZSBDXG5sYW5ndWFnZS4gIElmICpmb3JtYXQqIGlzIGEgVW5pY29kZSBvYmplY3QsIG9yIGlmIGFueSBvZiB0aGUgb2JqZWN0c1xuYmVpbmcgY29udmVydGVkIHVzaW5nIHRoZSBgYCVzYGAgY29udmVyc2lvbiBhcmUgVW5pY29kZSBvYmplY3RzLCB0aGVcbnJlc3VsdCB3aWxsIGFsc28gYmUgYSBVbmljb2RlIG9iamVjdC5cblxuSWYgKmZvcm1hdCogcmVxdWlyZXMgYSBzaW5nbGUgYXJndW1lbnQsICp2YWx1ZXMqIG1heSBiZSBhIHNpbmdsZSBub24tXG50dXBsZSBvYmplY3QuIFs1XSAgT3RoZXJ3aXNlLCAqdmFsdWVzKiBtdXN0IGJlIGEgdHVwbGUgd2l0aCBleGFjdGx5XG50aGUgbnVtYmVyIG9mIGl0ZW1zIHNwZWNpZmllZCBieSB0aGUgZm9ybWF0IHN0cmluZywgb3IgYSBzaW5nbGVcbm1hcHBpbmcgb2JqZWN0IChmb3IgZXhhbXBsZSwgYSBkaWN0aW9uYXJ5KS5cblxuQSBjb252ZXJzaW9uIHNwZWNpZmllciBjb250YWlucyB0d28gb3IgbW9yZSBjaGFyYWN0ZXJzIGFuZCBoYXMgdGhlXG5mb2xsb3dpbmcgY29tcG9uZW50cywgd2hpY2ggbXVzdCBvY2N1ciBpbiB0aGlzIG9yZGVyOlxuXG4xLiBUaGUgYGBcJyVcJ2BgIGNoYXJhY3Rlciwgd2hpY2ggbWFya3MgdGhlIHN0YXJ0IG9mIHRoZSBzcGVjaWZpZXIuXG5cbjIuIE1hcHBpbmcga2V5IChvcHRpb25hbCksIGNvbnNpc3Rpbmcgb2YgYSBwYXJlbnRoZXNpc2VkIHNlcXVlbmNlIG9mXG4gICBjaGFyYWN0ZXJzIChmb3IgZXhhbXBsZSwgYGAoc29tZW5hbWUpYGApLlxuXG4zLiBDb252ZXJzaW9uIGZsYWdzIChvcHRpb25hbCksIHdoaWNoIGFmZmVjdCB0aGUgcmVzdWx0IG9mIHNvbWVcbiAgIGNvbnZlcnNpb24gdHlwZXMuXG5cbjQuIE1pbmltdW0gZmllbGQgd2lkdGggKG9wdGlvbmFsKS4gIElmIHNwZWNpZmllZCBhcyBhbiBgYFwnKlwnYGBcbiAgIChhc3RlcmlzayksIHRoZSBhY3R1YWwgd2lkdGggaXMgcmVhZCBmcm9tIHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlXG4gICB0dXBsZSBpbiAqdmFsdWVzKiwgYW5kIHRoZSBvYmplY3QgdG8gY29udmVydCBjb21lcyBhZnRlciB0aGVcbiAgIG1pbmltdW0gZmllbGQgd2lkdGggYW5kIG9wdGlvbmFsIHByZWNpc2lvbi5cblxuNS4gUHJlY2lzaW9uIChvcHRpb25hbCksIGdpdmVuIGFzIGEgYGBcJy5cJ2BgIChkb3QpIGZvbGxvd2VkIGJ5IHRoZVxuICAgcHJlY2lzaW9uLiAgSWYgc3BlY2lmaWVkIGFzIGBgXCcqXCdgYCAoYW4gYXN0ZXJpc2spLCB0aGUgYWN0dWFsIHdpZHRoXG4gICBpcyByZWFkIGZyb20gdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgdHVwbGUgaW4gKnZhbHVlcyosIGFuZCB0aGVcbiAgIHZhbHVlIHRvIGNvbnZlcnQgY29tZXMgYWZ0ZXIgdGhlIHByZWNpc2lvbi5cblxuNi4gTGVuZ3RoIG1vZGlmaWVyIChvcHRpb25hbCkuXG5cbjcuIENvbnZlcnNpb24gdHlwZS5cblxuV2hlbiB0aGUgcmlnaHQgYXJndW1lbnQgaXMgYSBkaWN0aW9uYXJ5IChvciBvdGhlciBtYXBwaW5nIHR5cGUpLCB0aGVuXG50aGUgZm9ybWF0cyBpbiB0aGUgc3RyaW5nICptdXN0KiBpbmNsdWRlIGEgcGFyZW50aGVzaXNlZCBtYXBwaW5nIGtleVxuaW50byB0aGF0IGRpY3Rpb25hcnkgaW5zZXJ0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGBgXCclXCdgYCBjaGFyYWN0ZXIuXG5UaGUgbWFwcGluZyBrZXkgc2VsZWN0cyB0aGUgdmFsdWUgdG8gYmUgZm9ybWF0dGVkIGZyb20gdGhlIG1hcHBpbmcuXG5Gb3IgZXhhbXBsZTpcblxuPj4+IHByaW50IFwnJShsYW5ndWFnZSlzIGhhcyAlKG51bWJlcikwM2QgcXVvdGUgdHlwZXMuXCcgJSBcXFxuLi4uICAgICAgIHsibGFuZ3VhZ2UiOiAiUHl0aG9uIiwgIm51bWJlciI6IDJ9XG5QeXRob24gaGFzIDAwMiBxdW90ZSB0eXBlcy5cblxuSW4gdGhpcyBjYXNlIG5vIGBgKmBgIHNwZWNpZmllcnMgbWF5IG9jY3VyIGluIGEgZm9ybWF0IChzaW5jZSB0aGV5XG5yZXF1aXJlIGEgc2VxdWVudGlhbCBwYXJhbWV0ZXIgbGlzdCkuXG5cblRoZSBjb252ZXJzaW9uIGZsYWcgY2hhcmFjdGVycyBhcmU6XG5cbistLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgRmxhZyAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbis9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbnwgYGBcJyNcJ2BgICAgfCBUaGUgdmFsdWUgY29udmVyc2lvbiB3aWxsIHVzZSB0aGUgImFsdGVybmF0ZSBmb3JtIiAod2hlcmUgZGVmaW5lZCAgICAgfFxufCAgICAgICAgICAgfCBiZWxvdykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYFwnMFwnYGAgICB8IFRoZSBjb252ZXJzaW9uIHdpbGwgYmUgemVybyBwYWRkZWQgZm9yIG51bWVyaWMgdmFsdWVzLiAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgXCctXCdgYCAgIHwgVGhlIGNvbnZlcnRlZCB2YWx1ZSBpcyBsZWZ0IGFkanVzdGVkIChvdmVycmlkZXMgdGhlIGBgXCcwXCdgYCAgICAgICAgICAgfFxufCAgICAgICAgICAgfCBjb252ZXJzaW9uIGlmIGJvdGggYXJlIGdpdmVuKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYFwnIFwnYGAgICB8IChhIHNwYWNlKSBBIGJsYW5rIHNob3VsZCBiZSBsZWZ0IGJlZm9yZSBhIHBvc2l0aXZlIG51bWJlciAob3IgZW1wdHkgICB8XG58ICAgICAgICAgICB8IHN0cmluZykgcHJvZHVjZWQgYnkgYSBzaWduZWQgY29udmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgXCcrXCdgYCAgIHwgQSBzaWduIGNoYXJhY3RlciAoYGBcJytcJ2BgIG9yIGBgXCctXCdgYCkgd2lsbCBwcmVjZWRlIHRoZSBjb252ZXJzaW9uICAgICB8XG58ICAgICAgICAgICB8IChvdmVycmlkZXMgYSAic3BhY2UiIGZsYWcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG5cbkEgbGVuZ3RoIG1vZGlmaWVyIChgYGhgYCwgYGBsYGAsIG9yIGBgTGBgKSBtYXkgYmUgcHJlc2VudCwgYnV0IGlzXG5pZ25vcmVkIGFzIGl0IGlzIG5vdCBuZWNlc3NhcnkgZm9yIFB5dGhvbiAtLSBzbyBlLmcuIGBgJWxkYGAgaXNcbmlkZW50aWNhbCB0byBgYCVkYGAuXG5cblRoZSBjb252ZXJzaW9uIHR5cGVzIGFyZTpcblxuKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBDb252ZXJzaW9uICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzICAgfFxuKz09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09K1xufCBgYFwnZFwnYGAgICAgICB8IFNpZ25lZCBpbnRlZ2VyIGRlY2ltYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXCdpXCdgYCAgICAgIHwgU2lnbmVkIGludGVnZXIgZGVjaW1hbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcJ29cJ2BgICAgICAgfCBTaWduZWQgb2N0YWwgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgxKSAgICAgfFxuKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFwndVwnYGAgICAgICB8IE9ic29sZXRlIHR5cGUgLS0gaXQgaXMgaWRlbnRpY2FsIHRvIGBgXCdkXCdgYC4gICAgICAgICAgfCAoNykgICAgIHxcbistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcJ3hcJ2BgICAgICAgfCBTaWduZWQgaGV4YWRlY2ltYWwgKGxvd2VyY2FzZSkuICAgICAgICAgICAgICAgICAgICAgICB8ICgyKSAgICAgfFxuKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFwnWFwnYGAgICAgICB8IFNpZ25lZCBoZXhhZGVjaW1hbCAodXBwZXJjYXNlKS4gICAgICAgICAgICAgICAgICAgICAgIHwgKDIpICAgICB8XG4rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXCdlXCdgYCAgICAgIHwgRmxvYXRpbmcgcG9pbnQgZXhwb25lbnRpYWwgZm9ybWF0IChsb3dlcmNhc2UpLiAgICAgICAgfCAoMykgICAgIHxcbistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcJ0VcJ2BgICAgICAgfCBGbG9hdGluZyBwb2ludCBleHBvbmVudGlhbCBmb3JtYXQgKHVwcGVyY2FzZSkuICAgICAgICB8ICgzKSAgICAgfFxuKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFwnZlwnYGAgICAgICB8IEZsb2F0aW5nIHBvaW50IGRlY2ltYWwgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgIHwgKDMpICAgICB8XG4rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXCdGXCdgYCAgICAgIHwgRmxvYXRpbmcgcG9pbnQgZGVjaW1hbCBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgfCAoMykgICAgIHxcbistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcJ2dcJ2BgICAgICAgfCBGbG9hdGluZyBwb2ludCBmb3JtYXQuIFVzZXMgbG93ZXJjYXNlIGV4cG9uZW50aWFsICAgICB8ICg0KSAgICAgfFxufCAgICAgICAgICAgICAgfCBmb3JtYXQgaWYgZXhwb25lbnQgaXMgbGVzcyB0aGFuIC00IG9yIG5vdCBsZXNzIHRoYW4gICB8ICAgICAgICAgfFxufCAgICAgICAgICAgICAgfCBwcmVjaXNpb24sIGRlY2ltYWwgZm9ybWF0IG90aGVyd2lzZS4gICAgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFwnR1wnYGAgICAgICB8IEZsb2F0aW5nIHBvaW50IGZvcm1hdC4gVXNlcyB1cHBlcmNhc2UgZXhwb25lbnRpYWwgICAgIHwgKDQpICAgICB8XG58ICAgICAgICAgICAgICB8IGZvcm1hdCBpZiBleHBvbmVudCBpcyBsZXNzIHRoYW4gLTQgb3Igbm90IGxlc3MgdGhhbiAgIHwgICAgICAgICB8XG58ICAgICAgICAgICAgICB8IHByZWNpc2lvbiwgZGVjaW1hbCBmb3JtYXQgb3RoZXJ3aXNlLiAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXCdjXCdgYCAgICAgIHwgU2luZ2xlIGNoYXJhY3RlciAoYWNjZXB0cyBpbnRlZ2VyIG9yIHNpbmdsZSBjaGFyYWN0ZXIgfCAgICAgICAgIHxcbnwgICAgICAgICAgICAgIHwgc3RyaW5nKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcJ3JcJ2BgICAgICAgfCBTdHJpbmcgKGNvbnZlcnRzIGFueSBQeXRob24gb2JqZWN0IHVzaW5nICpyZXByKCkqKS4gICB8ICg1KSAgICAgfFxuKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFwnc1wnYGAgICAgICB8IFN0cmluZyAoY29udmVydHMgYW55IFB5dGhvbiBvYmplY3QgdXNpbmcgYGBzdHIoKWBgKS4gIHwgKDYpICAgICB8XG4rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXCclXCdgYCAgICAgIHwgTm8gYXJndW1lbnQgaXMgY29udmVydGVkLCByZXN1bHRzIGluIGEgYGBcJyVcJ2BgICAgICAgICB8ICAgICAgICAgfFxufCAgICAgICAgICAgICAgfCBjaGFyYWN0ZXIgaW4gdGhlIHJlc3VsdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuXG5Ob3RlczpcblxuMS4gVGhlIGFsdGVybmF0ZSBmb3JtIGNhdXNlcyBhIGxlYWRpbmcgemVybyAoYGBcJzBcJ2BgKSB0byBiZSBpbnNlcnRlZFxuICAgYmV0d2VlbiBsZWZ0LWhhbmQgcGFkZGluZyBhbmQgdGhlIGZvcm1hdHRpbmcgb2YgdGhlIG51bWJlciBpZiB0aGVcbiAgIGxlYWRpbmcgY2hhcmFjdGVyIG9mIHRoZSByZXN1bHQgaXMgbm90IGFscmVhZHkgYSB6ZXJvLlxuXG4yLiBUaGUgYWx0ZXJuYXRlIGZvcm0gY2F1c2VzIGEgbGVhZGluZyBgYFwnMHhcJ2BgIG9yIGBgXCcwWFwnYGAgKGRlcGVuZGluZ1xuICAgb24gd2hldGhlciB0aGUgYGBcJ3hcJ2BgIG9yIGBgXCdYXCdgYCBmb3JtYXQgd2FzIHVzZWQpIHRvIGJlIGluc2VydGVkXG4gICBiZXR3ZWVuIGxlZnQtaGFuZCBwYWRkaW5nIGFuZCB0aGUgZm9ybWF0dGluZyBvZiB0aGUgbnVtYmVyIGlmIHRoZVxuICAgbGVhZGluZyBjaGFyYWN0ZXIgb2YgdGhlIHJlc3VsdCBpcyBub3QgYWxyZWFkeSBhIHplcm8uXG5cbjMuIFRoZSBhbHRlcm5hdGUgZm9ybSBjYXVzZXMgdGhlIHJlc3VsdCB0byBhbHdheXMgY29udGFpbiBhIGRlY2ltYWxcbiAgIHBvaW50LCBldmVuIGlmIG5vIGRpZ2l0cyBmb2xsb3cgaXQuXG5cbiAgIFRoZSBwcmVjaXNpb24gZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbFxuICAgcG9pbnQgYW5kIGRlZmF1bHRzIHRvIDYuXG5cbjQuIFRoZSBhbHRlcm5hdGUgZm9ybSBjYXVzZXMgdGhlIHJlc3VsdCB0byBhbHdheXMgY29udGFpbiBhIGRlY2ltYWxcbiAgIHBvaW50LCBhbmQgdHJhaWxpbmcgemVyb2VzIGFyZSBub3QgcmVtb3ZlZCBhcyB0aGV5IHdvdWxkIG90aGVyd2lzZVxuICAgYmUuXG5cbiAgIFRoZSBwcmVjaXNpb24gZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGRpZ2l0cyBiZWZvcmVcbiAgIGFuZCBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCBhbmQgZGVmYXVsdHMgdG8gNi5cblxuNS4gVGhlIGBgJXJgYCBjb252ZXJzaW9uIHdhcyBhZGRlZCBpbiBQeXRob24gMi4wLlxuXG4gICBUaGUgcHJlY2lzaW9uIGRldGVybWluZXMgdGhlIG1heGltYWwgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXNlZC5cblxuNi4gSWYgdGhlIG9iamVjdCBvciBmb3JtYXQgcHJvdmlkZWQgaXMgYSBgYHVuaWNvZGVgYCBzdHJpbmcsIHRoZVxuICAgcmVzdWx0aW5nIHN0cmluZyB3aWxsIGFsc28gYmUgYGB1bmljb2RlYGAuXG5cbiAgIFRoZSBwcmVjaXNpb24gZGV0ZXJtaW5lcyB0aGUgbWF4aW1hbCBudW1iZXIgb2YgY2hhcmFjdGVycyB1c2VkLlxuXG43LiBTZWUgKipQRVAgMjM3KiouXG5cblNpbmNlIFB5dGhvbiBzdHJpbmdzIGhhdmUgYW4gZXhwbGljaXQgbGVuZ3RoLCBgYCVzYGAgY29udmVyc2lvbnMgZG9cbm5vdCBhc3N1bWUgdGhhdCBgYFwnXFwwXCdgYCBpcyB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAyLjc6IGBgJWZgYCBjb252ZXJzaW9ucyBmb3IgbnVtYmVycyB3aG9zZSBhYnNvbHV0ZVxudmFsdWUgaXMgb3ZlciAxZTUwIGFyZSBubyBsb25nZXIgcmVwbGFjZWQgYnkgYGAlZ2BgIGNvbnZlcnNpb25zLlxuXG5BZGRpdGlvbmFsIHN0cmluZyBvcGVyYXRpb25zIGFyZSBkZWZpbmVkIGluIHN0YW5kYXJkIG1vZHVsZXNcbmBgc3RyaW5nYGAgYW5kIGBgcmVgYC5cblxuXG5YUmFuZ2UgVHlwZVxuPT09PT09PT09PT1cblxuVGhlIGBgeHJhbmdlYGAgdHlwZSBpcyBhbiBpbW11dGFibGUgc2VxdWVuY2Ugd2hpY2ggaXMgY29tbW9ubHkgdXNlZFxuZm9yIGxvb3BpbmcuICBUaGUgYWR2YW50YWdlIG9mIHRoZSBgYHhyYW5nZWBgIHR5cGUgaXMgdGhhdCBhblxuYGB4cmFuZ2VgYCBvYmplY3Qgd2lsbCBhbHdheXMgdGFrZSB0aGUgc2FtZSBhbW91bnQgb2YgbWVtb3J5LCBub1xubWF0dGVyIHRoZSBzaXplIG9mIHRoZSByYW5nZSBpdCByZXByZXNlbnRzLiAgVGhlcmUgYXJlIG5vIGNvbnNpc3RlbnRcbnBlcmZvcm1hbmNlIGFkdmFudGFnZXMuXG5cblhSYW5nZSBvYmplY3RzIGhhdmUgdmVyeSBsaXR0bGUgYmVoYXZpb3I6IHRoZXkgb25seSBzdXBwb3J0IGluZGV4aW5nLFxuaXRlcmF0aW9uLCBhbmQgdGhlIGBgbGVuKClgYCBmdW5jdGlvbi5cblxuXG5NdXRhYmxlIFNlcXVlbmNlIFR5cGVzXG49PT09PT09PT09PT09PT09PT09PT09XG5cbkxpc3QgYW5kIGBgYnl0ZWFycmF5YGAgb2JqZWN0cyBzdXBwb3J0IGFkZGl0aW9uYWwgb3BlcmF0aW9ucyB0aGF0XG5hbGxvdyBpbi1wbGFjZSBtb2RpZmljYXRpb24gb2YgdGhlIG9iamVjdC4gT3RoZXIgbXV0YWJsZSBzZXF1ZW5jZVxudHlwZXMgKHdoZW4gYWRkZWQgdG8gdGhlIGxhbmd1YWdlKSBzaG91bGQgYWxzbyBzdXBwb3J0IHRoZXNlXG5vcGVyYXRpb25zLiBTdHJpbmdzIGFuZCB0dXBsZXMgYXJlIGltbXV0YWJsZSBzZXF1ZW5jZSB0eXBlczogc3VjaFxub2JqZWN0cyBjYW5ub3QgYmUgbW9kaWZpZWQgb25jZSBjcmVhdGVkLiBUaGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgYXJlXG5kZWZpbmVkIG9uIG11dGFibGUgc2VxdWVuY2UgdHlwZXMgKHdoZXJlICp4KiBpcyBhbiBhcmJpdHJhcnkgb2JqZWN0KTpcblxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IE9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICB8IFJlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgICAgICAgICAgICAgICAgIHxcbis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09K1xufCBgYHNbaV0gPSB4YGAgICAgICAgICAgICAgICAgICAgfCBpdGVtICppKiBvZiAqcyogaXMgcmVwbGFjZWQgYnkgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICp4KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHNbaTpqXSA9IHRgYCAgICAgICAgICAgICAgICAgfCBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqIGlzICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGxhY2VkIGJ5IHRoZSBjb250ZW50cyBvZiB0aGUgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaXRlcmFibGUgKnQqICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgZGVsIHNbaTpqXWBgICAgICAgICAgICAgICAgICB8IHNhbWUgYXMgYGBzW2k6al0gPSBbXWBgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHNbaTpqOmtdID0gdGBgICAgICAgICAgICAgICAgfCB0aGUgZWxlbWVudHMgb2YgYGBzW2k6ajprXWBgIGFyZSB8ICgxKSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGxhY2VkIGJ5IHRob3NlIG9mICp0KiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYGRlbCBzW2k6ajprXWBgICAgICAgICAgICAgICAgfCByZW1vdmVzIHRoZSBlbGVtZW50cyBvZiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBgc1tpOmo6a11gYCBmcm9tIHRoZSBsaXN0ICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHMuYXBwZW5kKHgpYGAgICAgICAgICAgICAgICAgfCBzYW1lIGFzIGBgc1tsZW4ocyk6bGVuKHMpXSA9ICAgICB8ICgyKSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFt4XWBgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHMuZXh0ZW5kKHgpYGAgICAgICAgICAgICAgICAgfCBzYW1lIGFzIGBgc1tsZW4ocyk6bGVuKHMpXSA9IHhgYCB8ICgzKSAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzLmNvdW50KHgpYGAgICAgICAgICAgICAgICAgIHwgcmV0dXJuIG51bWJlciBvZiAqaSpcJ3MgZm9yIHdoaWNoIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGBzW2ldID09IHhgYCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgcy5pbmRleCh4WywgaVssIGpdXSlgYCAgICAgICB8IHJldHVybiBzbWFsbGVzdCAqayogc3VjaCB0aGF0ICAgIHwgKDQpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGBzW2tdID09IHhgYCBhbmQgYGBpIDw9IGsgPCBqYGAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgcy5pbnNlcnQoaSwgeClgYCAgICAgICAgICAgICB8IHNhbWUgYXMgYGBzW2k6aV0gPSBbeF1gYCAgICAgICAgIHwgKDUpICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHMucG9wKFtpXSlgYCAgICAgICAgICAgICAgICAgfCBzYW1lIGFzIGBgeCA9IHNbaV07IGRlbCBzW2ldOyAgICB8ICg2KSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJldHVybiB4YGAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHMucmVtb3ZlKHgpYGAgICAgICAgICAgICAgICAgfCBzYW1lIGFzIGBgZGVsIHNbcy5pbmRleCh4KV1gYCAgICB8ICg0KSAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzLnJldmVyc2UoKWBgICAgICAgICAgICAgICAgIHwgcmV2ZXJzZXMgdGhlIGl0ZW1zIG9mICpzKiBpbiAgICAgfCAoNykgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwbGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzLnNvcnQoW2NtcFssIGtleVssICAgICAgICAgIHwgc29ydCB0aGUgaXRlbXMgb2YgKnMqIGluIHBsYWNlICAgfCAoNykoOCkoOSkoMTApICAgICAgICAgfFxufCByZXZlcnNlXV1dKWBgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuTm90ZXM6XG5cbjEuICp0KiBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzbGljZSBpdCBpcyAgcmVwbGFjaW5nLlxuXG4yLiBUaGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBQeXRob24gaGFzIGhpc3RvcmljYWxseSBhY2NlcHRlZCBtdWx0aXBsZVxuICAgcGFyYW1ldGVycyBhbmQgaW1wbGljaXRseSBqb2luZWQgdGhlbSBpbnRvIGEgdHVwbGU7IHRoaXMgbm8gbG9uZ2VyXG4gICB3b3JrcyBpbiBQeXRob24gMi4wLiAgVXNlIG9mIHRoaXMgbWlzZmVhdHVyZSBoYXMgYmVlbiBkZXByZWNhdGVkXG4gICBzaW5jZSBQeXRob24gMS40LlxuXG4zLiAqeCogY2FuIGJlIGFueSBpdGVyYWJsZSBvYmplY3QuXG5cbjQuIFJhaXNlcyBgYFZhbHVlRXJyb3JgYCB3aGVuICp4KiBpcyBub3QgZm91bmQgaW4gKnMqLiBXaGVuIGEgbmVnYXRpdmVcbiAgIGluZGV4IGlzIHBhc3NlZCBhcyB0aGUgc2Vjb25kIG9yIHRoaXJkIHBhcmFtZXRlciB0byB0aGUgYGBpbmRleCgpYGBcbiAgIG1ldGhvZCwgdGhlIGxpc3QgbGVuZ3RoIGlzIGFkZGVkLCBhcyBmb3Igc2xpY2UgaW5kaWNlcy4gIElmIGl0IGlzXG4gICBzdGlsbCBuZWdhdGl2ZSwgaXQgaXMgdHJ1bmNhdGVkIHRvIHplcm8sIGFzIGZvciBzbGljZSBpbmRpY2VzLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBQcmV2aW91c2x5LCBgYGluZGV4KClgYCBkaWRuXCd0IGhhdmVcbiAgIGFyZ3VtZW50cyBmb3Igc3BlY2lmeWluZyBzdGFydCBhbmQgc3RvcCBwb3NpdGlvbnMuXG5cbjUuIFdoZW4gYSBuZWdhdGl2ZSBpbmRleCBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciB0byB0aGVcbiAgIGBgaW5zZXJ0KClgYCBtZXRob2QsIHRoZSBsaXN0IGxlbmd0aCBpcyBhZGRlZCwgYXMgZm9yIHNsaWNlXG4gICBpbmRpY2VzLiAgSWYgaXQgaXMgc3RpbGwgbmVnYXRpdmUsIGl0IGlzIHRydW5jYXRlZCB0byB6ZXJvLCBhcyBmb3JcbiAgIHNsaWNlIGluZGljZXMuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjM6IFByZXZpb3VzbHksIGFsbCBuZWdhdGl2ZSBpbmRpY2VzIHdlcmVcbiAgIHRydW5jYXRlZCB0byB6ZXJvLlxuXG42LiBUaGUgYGBwb3AoKWBgIG1ldGhvZFwncyBvcHRpb25hbCBhcmd1bWVudCAqaSogZGVmYXVsdHMgdG8gYGAtMWBgLCBzb1xuICAgdGhhdCBieSBkZWZhdWx0IHRoZSBsYXN0IGl0ZW0gaXMgcmVtb3ZlZCBhbmQgcmV0dXJuZWQuXG5cbjcuIFRoZSBgYHNvcnQoKWBgIGFuZCBgYHJldmVyc2UoKWBgIG1ldGhvZHMgbW9kaWZ5IHRoZSBsaXN0IGluIHBsYWNlXG4gICBmb3IgZWNvbm9teSBvZiBzcGFjZSB3aGVuIHNvcnRpbmcgb3IgcmV2ZXJzaW5nIGEgbGFyZ2UgbGlzdC4gIFRvXG4gICByZW1pbmQgeW91IHRoYXQgdGhleSBvcGVyYXRlIGJ5IHNpZGUgZWZmZWN0LCB0aGV5IGRvblwndCByZXR1cm4gdGhlXG4gICBzb3J0ZWQgb3IgcmV2ZXJzZWQgbGlzdC5cblxuOC4gVGhlIGBgc29ydCgpYGAgbWV0aG9kIHRha2VzIG9wdGlvbmFsIGFyZ3VtZW50cyBmb3IgY29udHJvbGxpbmcgdGhlXG4gICBjb21wYXJpc29ucy5cblxuICAgKmNtcCogc3BlY2lmaWVzIGEgY3VzdG9tIGNvbXBhcmlzb24gZnVuY3Rpb24gb2YgdHdvIGFyZ3VtZW50cyAobGlzdFxuICAgaXRlbXMpIHdoaWNoIHNob3VsZCByZXR1cm4gYSBuZWdhdGl2ZSwgemVybyBvciBwb3NpdGl2ZSBudW1iZXJcbiAgIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBjb25zaWRlcmVkIHNtYWxsZXIgdGhhbixcbiAgIGVxdWFsIHRvLCBvciBsYXJnZXIgdGhhbiB0aGUgc2Vjb25kIGFyZ3VtZW50OiBgYGNtcD1sYW1iZGEgeCx5OlxuICAgY21wKHgubG93ZXIoKSwgeS5sb3dlcigpKWBgLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGBOb25lYGAuXG5cbiAgICprZXkqIHNwZWNpZmllcyBhIGZ1bmN0aW9uIG9mIG9uZSBhcmd1bWVudCB0aGF0IGlzIHVzZWQgdG8gZXh0cmFjdFxuICAgYSBjb21wYXJpc29uIGtleSBmcm9tIGVhY2ggbGlzdCBlbGVtZW50OiBgYGtleT1zdHIubG93ZXJgYC4gIFRoZVxuICAgZGVmYXVsdCB2YWx1ZSBpcyBgYE5vbmVgYC5cblxuICAgKnJldmVyc2UqIGlzIGEgYm9vbGVhbiB2YWx1ZS4gIElmIHNldCB0byBgYFRydWVgYCwgdGhlbiB0aGUgbGlzdFxuICAgZWxlbWVudHMgYXJlIHNvcnRlZCBhcyBpZiBlYWNoIGNvbXBhcmlzb24gd2VyZSByZXZlcnNlZC5cblxuICAgSW4gZ2VuZXJhbCwgdGhlICprZXkqIGFuZCAqcmV2ZXJzZSogY29udmVyc2lvbiBwcm9jZXNzZXMgYXJlIG11Y2hcbiAgIGZhc3RlciB0aGFuIHNwZWNpZnlpbmcgYW4gZXF1aXZhbGVudCAqY21wKiBmdW5jdGlvbi4gIFRoaXMgaXNcbiAgIGJlY2F1c2UgKmNtcCogaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGZvciBlYWNoIGxpc3QgZWxlbWVudCB3aGlsZVxuICAgKmtleSogYW5kICpyZXZlcnNlKiB0b3VjaCBlYWNoIGVsZW1lbnQgb25seSBvbmNlLiAgVXNlXG4gICBgYGZ1bmN0b29scy5jbXBfdG9fa2V5KClgYCB0byBjb252ZXJ0IGFuIG9sZC1zdHlsZSAqY21wKiBmdW5jdGlvblxuICAgdG8gYSAqa2V5KiBmdW5jdGlvbi5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMzogU3VwcG9ydCBmb3IgYGBOb25lYGAgYXMgYW4gZXF1aXZhbGVudCB0b1xuICAgb21pdHRpbmcgKmNtcCogd2FzIGFkZGVkLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi40OiBTdXBwb3J0IGZvciAqa2V5KiBhbmQgKnJldmVyc2UqIHdhcyBhZGRlZC5cblxuOS4gU3RhcnRpbmcgd2l0aCBQeXRob24gMi4zLCB0aGUgYGBzb3J0KClgYCBtZXRob2QgaXMgZ3VhcmFudGVlZCB0byBiZVxuICAgc3RhYmxlLiAgQSBzb3J0IGlzIHN0YWJsZSBpZiBpdCBndWFyYW50ZWVzIG5vdCB0byBjaGFuZ2UgdGhlXG4gICByZWxhdGl2ZSBvcmRlciBvZiBlbGVtZW50cyB0aGF0IGNvbXBhcmUgZXF1YWwgLS0tIHRoaXMgaXMgaGVscGZ1bFxuICAgZm9yIHNvcnRpbmcgaW4gbXVsdGlwbGUgcGFzc2VzIChmb3IgZXhhbXBsZSwgc29ydCBieSBkZXBhcnRtZW50LFxuICAgdGhlbiBieSBzYWxhcnkgZ3JhZGUpLlxuXG4xMC4gKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBXaGlsZSBhIGxpc3QgaXMgYmVpbmcgc29ydGVkLFxuICAgIHRoZSBlZmZlY3Qgb2YgYXR0ZW1wdGluZyB0byBtdXRhdGUsIG9yIGV2ZW4gaW5zcGVjdCwgdGhlIGxpc3QgaXNcbiAgICB1bmRlZmluZWQuICBUaGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBQeXRob24gMi4zIGFuZCBuZXdlciBtYWtlcyB0aGVcbiAgICBsaXN0IGFwcGVhciBlbXB0eSBmb3IgdGhlIGR1cmF0aW9uLCBhbmQgcmFpc2VzIGBgVmFsdWVFcnJvcmBgIGlmXG4gICAgaXQgY2FuIGRldGVjdCB0aGF0IHRoZSBsaXN0IGhhcyBiZWVuIG11dGF0ZWQgZHVyaW5nIGEgc29ydC5cbicsCisgJ3R5cGVzc2VxLW11dGFibGUnOiAiXG5NdXRhYmxlIFNlcXVlbmNlIFR5cGVzXG4qKioqKioqKioqKioqKioqKioqKioqXG5cbkxpc3QgYW5kIGBgYnl0ZWFycmF5YGAgb2JqZWN0cyBzdXBwb3J0IGFkZGl0aW9uYWwgb3BlcmF0aW9ucyB0aGF0XG5hbGxvdyBpbi1wbGFjZSBtb2RpZmljYXRpb24gb2YgdGhlIG9iamVjdC4gT3RoZXIgbXV0YWJsZSBzZXF1ZW5jZVxudHlwZXMgKHdoZW4gYWRkZWQgdG8gdGhlIGxhbmd1YWdlKSBzaG91bGQgYWxzbyBzdXBwb3J0IHRoZXNlXG5vcGVyYXRpb25zLiBTdHJpbmdzIGFuZCB0dXBsZXMgYXJlIGltbXV0YWJsZSBzZXF1ZW5jZSB0eXBlczogc3VjaFxub2JqZWN0cyBjYW5ub3QgYmUgbW9kaWZpZWQgb25jZSBjcmVhdGVkLiBUaGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgYXJlXG5kZWZpbmVkIG9uIG11dGFibGUgc2VxdWVuY2UgdHlwZXMgKHdoZXJlICp4KiBpcyBhbiBhcmJpdHJhcnkgb2JqZWN0KTpcblxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IE9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICB8IFJlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgICAgICAgICAgICAgICAgIHxcbis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09K1xufCBgYHNbaV0gPSB4YGAgICAgICAgICAgICAgICAgICAgfCBpdGVtICppKiBvZiAqcyogaXMgcmVwbGFjZWQgYnkgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICp4KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHNbaTpqXSA9IHRgYCAgICAgICAgICAgICAgICAgfCBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqIGlzICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGxhY2VkIGJ5IHRoZSBjb250ZW50cyBvZiB0aGUgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaXRlcmFibGUgKnQqICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgZGVsIHNbaTpqXWBgICAgICAgICAgICAgICAgICB8IHNhbWUgYXMgYGBzW2k6al0gPSBbXWBgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHNbaTpqOmtdID0gdGBgICAgICAgICAgICAgICAgfCB0aGUgZWxlbWVudHMgb2YgYGBzW2k6ajprXWBgIGFyZSB8ICgxKSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGxhY2VkIGJ5IHRob3NlIG9mICp0KiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYGRlbCBzW2k6ajprXWBgICAgICAgICAgICAgICAgfCByZW1vdmVzIHRoZSBlbGVtZW50cyBvZiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBgc1tpOmo6a11gYCBmcm9tIHRoZSBsaXN0ICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHMuYXBwZW5kKHgpYGAgICAgICAgICAgICAgICAgfCBzYW1lIGFzIGBgc1tsZW4ocyk6bGVuKHMpXSA9ICAgICB8ICgyKSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFt4XWBgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHMuZXh0ZW5kKHgpYGAgICAgICAgICAgICAgICAgfCBzYW1lIGFzIGBgc1tsZW4ocyk6bGVuKHMpXSA9IHhgYCB8ICgzKSAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzLmNvdW50KHgpYGAgICAgICAgICAgICAgICAgIHwgcmV0dXJuIG51bWJlciBvZiAqaSoncyBmb3Igd2hpY2ggfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgYHNbaV0gPT0geGBgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzLmluZGV4KHhbLCBpWywgal1dKWBgICAgICAgIHwgcmV0dXJuIHNtYWxsZXN0ICprKiBzdWNoIHRoYXQgICAgfCAoNCkgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgYHNba10gPT0geGBgIGFuZCBgYGkgPD0gayA8IGpgYCB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzLmluc2VydChpLCB4KWBgICAgICAgICAgICAgIHwgc2FtZSBhcyBgYHNbaTppXSA9IFt4XWBgICAgICAgICAgfCAoNSkgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgcy5wb3AoW2ldKWBgICAgICAgICAgICAgICAgICB8IHNhbWUgYXMgYGB4ID0gc1tpXTsgZGVsIHNbaV07ICAgIHwgKDYpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmV0dXJuIHhgYCAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgcy5yZW1vdmUoeClgYCAgICAgICAgICAgICAgICB8IHNhbWUgYXMgYGBkZWwgc1tzLmluZGV4KHgpXWBgICAgIHwgKDQpICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHMucmV2ZXJzZSgpYGAgICAgICAgICAgICAgICAgfCByZXZlcnNlcyB0aGUgaXRlbXMgb2YgKnMqIGluICAgICB8ICg3KSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBsYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHMuc29ydChbY21wWywga2V5WywgICAgICAgICAgfCBzb3J0IHRoZSBpdGVtcyBvZiAqcyogaW4gcGxhY2UgICB8ICg3KSg4KSg5KSgxMCkgICAgICAgICB8XG58IHJldmVyc2VdXV0pYGAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuXG5Ob3RlczpcblxuMS4gKnQqIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNsaWNlIGl0IGlzICByZXBsYWNpbmcuXG5cbjIuIFRoZSBDIGltcGxlbWVudGF0aW9uIG9mIFB5dGhvbiBoYXMgaGlzdG9yaWNhbGx5IGFjY2VwdGVkIG11bHRpcGxlXG4gICBwYXJhbWV0ZXJzIGFuZCBpbXBsaWNpdGx5IGpvaW5lZCB0aGVtIGludG8gYSB0dXBsZTsgdGhpcyBubyBsb25nZXJcbiAgIHdvcmtzIGluIFB5dGhvbiAyLjAuICBVc2Ugb2YgdGhpcyBtaXNmZWF0dXJlIGhhcyBiZWVuIGRlcHJlY2F0ZWRcbiAgIHNpbmNlIFB5dGhvbiAxLjQuXG5cbjMuICp4KiBjYW4gYmUgYW55IGl0ZXJhYmxlIG9iamVjdC5cblxuNC4gUmFpc2VzIGBgVmFsdWVFcnJvcmBgIHdoZW4gKngqIGlzIG5vdCBmb3VuZCBpbiAqcyouIFdoZW4gYSBuZWdhdGl2ZVxuICAgaW5kZXggaXMgcGFzc2VkIGFzIHRoZSBzZWNvbmQgb3IgdGhpcmQgcGFyYW1ldGVyIHRvIHRoZSBgYGluZGV4KClgYFxuICAgbWV0aG9kLCB0aGUgbGlzdCBsZW5ndGggaXMgYWRkZWQsIGFzIGZvciBzbGljZSBpbmRpY2VzLiAgSWYgaXQgaXNcbiAgIHN0aWxsIG5lZ2F0aXZlLCBpdCBpcyB0cnVuY2F0ZWQgdG8gemVybywgYXMgZm9yIHNsaWNlIGluZGljZXMuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjM6IFByZXZpb3VzbHksIGBgaW5kZXgoKWBgIGRpZG4ndCBoYXZlXG4gICBhcmd1bWVudHMgZm9yIHNwZWNpZnlpbmcgc3RhcnQgYW5kIHN0b3AgcG9zaXRpb25zLlxuXG41LiBXaGVuIGEgbmVnYXRpdmUgaW5kZXggaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8gdGhlXG4gICBgYGluc2VydCgpYGAgbWV0aG9kLCB0aGUgbGlzdCBsZW5ndGggaXMgYWRkZWQsIGFzIGZvciBzbGljZVxuICAgaW5kaWNlcy4gIElmIGl0IGlzIHN0aWxsIG5lZ2F0aXZlLCBpdCBpcyB0cnVuY2F0ZWQgdG8gemVybywgYXMgZm9yXG4gICBzbGljZSBpbmRpY2VzLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBQcmV2aW91c2x5LCBhbGwgbmVnYXRpdmUgaW5kaWNlcyB3ZXJlXG4gICB0cnVuY2F0ZWQgdG8gemVyby5cblxuNi4gVGhlIGBgcG9wKClgYCBtZXRob2QncyBvcHRpb25hbCBhcmd1bWVudCAqaSogZGVmYXVsdHMgdG8gYGAtMWBgLCBzb1xuICAgdGhhdCBieSBkZWZhdWx0IHRoZSBsYXN0IGl0ZW0gaXMgcmVtb3ZlZCBhbmQgcmV0dXJuZWQuXG5cbjcuIFRoZSBgYHNvcnQoKWBgIGFuZCBgYHJldmVyc2UoKWBgIG1ldGhvZHMgbW9kaWZ5IHRoZSBsaXN0IGluIHBsYWNlXG4gICBmb3IgZWNvbm9teSBvZiBzcGFjZSB3aGVuIHNvcnRpbmcgb3IgcmV2ZXJzaW5nIGEgbGFyZ2UgbGlzdC4gIFRvXG4gICByZW1pbmQgeW91IHRoYXQgdGhleSBvcGVyYXRlIGJ5IHNpZGUgZWZmZWN0LCB0aGV5IGRvbid0IHJldHVybiB0aGVcbiAgIHNvcnRlZCBvciByZXZlcnNlZCBsaXN0LlxuXG44LiBUaGUgYGBzb3J0KClgYCBtZXRob2QgdGFrZXMgb3B0aW9uYWwgYXJndW1lbnRzIGZvciBjb250cm9sbGluZyB0aGVcbiAgIGNvbXBhcmlzb25zLlxuXG4gICAqY21wKiBzcGVjaWZpZXMgYSBjdXN0b20gY29tcGFyaXNvbiBmdW5jdGlvbiBvZiB0d28gYXJndW1lbnRzIChsaXN0XG4gICBpdGVtcykgd2hpY2ggc2hvdWxkIHJldHVybiBhIG5lZ2F0aXZlLCB6ZXJvIG9yIHBvc2l0aXZlIG51bWJlclxuICAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGNvbnNpZGVyZWQgc21hbGxlciB0aGFuLFxuICAgZXF1YWwgdG8sIG9yIGxhcmdlciB0aGFuIHRoZSBzZWNvbmQgYXJndW1lbnQ6IGBgY21wPWxhbWJkYSB4LHk6XG4gICBjbXAoeC5sb3dlcigpLCB5Lmxvd2VyKCkpYGAuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgYE5vbmVgYC5cblxuICAgKmtleSogc3BlY2lmaWVzIGEgZnVuY3Rpb24gb2Ygb25lIGFyZ3VtZW50IHRoYXQgaXMgdXNlZCB0byBleHRyYWN0XG4gICBhIGNvbXBhcmlzb24ga2V5IGZyb20gZWFjaCBsaXN0IGVsZW1lbnQ6IGBga2V5PXN0ci5sb3dlcmBgLiAgVGhlXG4gICBkZWZhdWx0IHZhbHVlIGlzIGBgTm9uZWBgLlxuXG4gICAqcmV2ZXJzZSogaXMgYSBib29sZWFuIHZhbHVlLiAgSWYgc2V0IHRvIGBgVHJ1ZWBgLCB0aGVuIHRoZSBsaXN0XG4gICBlbGVtZW50cyBhcmUgc29ydGVkIGFzIGlmIGVhY2ggY29tcGFyaXNvbiB3ZXJlIHJldmVyc2VkLlxuXG4gICBJbiBnZW5lcmFsLCB0aGUgKmtleSogYW5kICpyZXZlcnNlKiBjb252ZXJzaW9uIHByb2Nlc3NlcyBhcmUgbXVjaFxuICAgZmFzdGVyIHRoYW4gc3BlY2lmeWluZyBhbiBlcXVpdmFsZW50ICpjbXAqIGZ1bmN0aW9uLiAgVGhpcyBpc1xuICAgYmVjYXVzZSAqY21wKiBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIGVhY2ggbGlzdCBlbGVtZW50IHdoaWxlXG4gICAqa2V5KiBhbmQgKnJldmVyc2UqIHRvdWNoIGVhY2ggZWxlbWVudCBvbmx5IG9uY2UuICBVc2VcbiAgIGBgZnVuY3Rvb2xzLmNtcF90b19rZXkoKWBgIHRvIGNvbnZlcnQgYW4gb2xkLXN0eWxlICpjbXAqIGZ1bmN0aW9uXG4gICB0byBhICprZXkqIGZ1bmN0aW9uLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBTdXBwb3J0IGZvciBgYE5vbmVgYCBhcyBhbiBlcXVpdmFsZW50IHRvXG4gICBvbWl0dGluZyAqY21wKiB3YXMgYWRkZWQuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjQ6IFN1cHBvcnQgZm9yICprZXkqIGFuZCAqcmV2ZXJzZSogd2FzIGFkZGVkLlxuXG45LiBTdGFydGluZyB3aXRoIFB5dGhvbiAyLjMsIHRoZSBgYHNvcnQoKWBgIG1ldGhvZCBpcyBndWFyYW50ZWVkIHRvIGJlXG4gICBzdGFibGUuICBBIHNvcnQgaXMgc3RhYmxlIGlmIGl0IGd1YXJhbnRlZXMgbm90IHRvIGNoYW5nZSB0aGVcbiAgIHJlbGF0aXZlIG9yZGVyIG9mIGVsZW1lbnRzIHRoYXQgY29tcGFyZSBlcXVhbCAtLS0gdGhpcyBpcyBoZWxwZnVsXG4gICBmb3Igc29ydGluZyBpbiBtdWx0aXBsZSBwYXNzZXMgKGZvciBleGFtcGxlLCBzb3J0IGJ5IGRlcGFydG1lbnQsXG4gICB0aGVuIGJ5IHNhbGFyeSBncmFkZSkuXG5cbjEwLiAqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIFdoaWxlIGEgbGlzdCBpcyBiZWluZyBzb3J0ZWQsXG4gICAgdGhlIGVmZmVjdCBvZiBhdHRlbXB0aW5nIHRvIG11dGF0ZSwgb3IgZXZlbiBpbnNwZWN0LCB0aGUgbGlzdCBpc1xuICAgIHVuZGVmaW5lZC4gIFRoZSBDIGltcGxlbWVudGF0aW9uIG9mIFB5dGhvbiAyLjMgYW5kIG5ld2VyIG1ha2VzIHRoZVxuICAgIGxpc3QgYXBwZWFyIGVtcHR5IGZvciB0aGUgZHVyYXRpb24sIGFuZCByYWlzZXMgYGBWYWx1ZUVycm9yYGAgaWZcbiAgICBpdCBjYW4gZGV0ZWN0IHRoYXQgdGhlIGxpc3QgaGFzIGJlZW4gbXV0YXRlZCBkdXJpbmcgYSBzb3J0LlxuIiwKKyAndW5hcnknOiAnXG5VbmFyeSBhcml0aG1ldGljIGFuZCBiaXR3aXNlIG9wZXJhdGlvbnNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5BbGwgdW5hcnkgYXJpdGhtZXRpYyBhbmQgYml0d2lzZSBvcGVyYXRpb25zIGhhdmUgdGhlIHNhbWUgcHJpb3JpdHk6XG5cbiAgIHVfZXhwciA6Oj0gcG93ZXIgfCAiLSIgdV9leHByIHwgIisiIHVfZXhwciB8ICJ+IiB1X2V4cHJcblxuVGhlIHVuYXJ5IGBgLWBgIChtaW51cykgb3BlcmF0b3IgeWllbGRzIHRoZSBuZWdhdGlvbiBvZiBpdHMgbnVtZXJpY1xuYXJndW1lbnQuXG5cblRoZSB1bmFyeSBgYCtgYCAocGx1cykgb3BlcmF0b3IgeWllbGRzIGl0cyBudW1lcmljIGFyZ3VtZW50IHVuY2hhbmdlZC5cblxuVGhlIHVuYXJ5IGBgfmBgIChpbnZlcnQpIG9wZXJhdG9yIHlpZWxkcyB0aGUgYml0d2lzZSBpbnZlcnNpb24gb2YgaXRzXG5wbGFpbiBvciBsb25nIGludGVnZXIgYXJndW1lbnQuICBUaGUgYml0d2lzZSBpbnZlcnNpb24gb2YgYGB4YGAgaXNcbmRlZmluZWQgYXMgYGAtKHgrMSlgYC4gIEl0IG9ubHkgYXBwbGllcyB0byBpbnRlZ3JhbCBudW1iZXJzLlxuXG5JbiBhbGwgdGhyZWUgY2FzZXMsIGlmIHRoZSBhcmd1bWVudCBkb2VzIG5vdCBoYXZlIHRoZSBwcm9wZXIgdHlwZSwgYVxuYGBUeXBlRXJyb3JgYCBleGNlcHRpb24gaXMgcmFpc2VkLlxuJywKKyAnd2hpbGUnOiAnXG5UaGUgYGB3aGlsZWBgIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKipcblxuVGhlIGBgd2hpbGVgYCBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgcmVwZWF0ZWQgZXhlY3V0aW9uIGFzIGxvbmcgYXMgYW5cbmV4cHJlc3Npb24gaXMgdHJ1ZTpcblxuICAgd2hpbGVfc3RtdCA6Oj0gIndoaWxlIiBleHByZXNzaW9uICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG5cblRoaXMgcmVwZWF0ZWRseSB0ZXN0cyB0aGUgZXhwcmVzc2lvbiBhbmQsIGlmIGl0IGlzIHRydWUsIGV4ZWN1dGVzIHRoZVxuZmlyc3Qgc3VpdGU7IGlmIHRoZSBleHByZXNzaW9uIGlzIGZhbHNlICh3aGljaCBtYXkgYmUgdGhlIGZpcnN0IHRpbWVcbml0IGlzIHRlc3RlZCkgdGhlIHN1aXRlIG9mIHRoZSBgYGVsc2VgYCBjbGF1c2UsIGlmIHByZXNlbnQsIGlzXG5leGVjdXRlZCBhbmQgdGhlIGxvb3AgdGVybWluYXRlcy5cblxuQSBgYGJyZWFrYGAgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSB0ZXJtaW5hdGVzIHRoZSBsb29wXG53aXRob3V0IGV4ZWN1dGluZyB0aGUgYGBlbHNlYGAgY2xhdXNlXCdzIHN1aXRlLiAgQSBgYGNvbnRpbnVlYGBcbnN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgc2tpcHMgdGhlIHJlc3Qgb2YgdGhlIHN1aXRlIGFuZFxuZ29lcyBiYWNrIHRvIHRlc3RpbmcgdGhlIGV4cHJlc3Npb24uXG4nLAorICd3aXRoJzogJ1xuVGhlIGBgd2l0aGBgIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKlxuXG5OZXcgaW4gdmVyc2lvbiAyLjUuXG5cblRoZSBgYHdpdGhgYCBzdGF0ZW1lbnQgaXMgdXNlZCB0byB3cmFwIHRoZSBleGVjdXRpb24gb2YgYSBibG9jayB3aXRoXG5tZXRob2RzIGRlZmluZWQgYnkgYSBjb250ZXh0IG1hbmFnZXIgKHNlZSBzZWN0aW9uICpXaXRoIFN0YXRlbWVudFxuQ29udGV4dCBNYW5hZ2VycyopLiBUaGlzIGFsbG93cyBjb21tb25cbmBgdHJ5YGAuLi5gYGV4Y2VwdGBgLi4uYGBmaW5hbGx5YGAgdXNhZ2UgcGF0dGVybnMgdG8gYmUgZW5jYXBzdWxhdGVkXG5mb3IgY29udmVuaWVudCByZXVzZS5cblxuICAgd2l0aF9zdG10IDo6PSAid2l0aCIgd2l0aF9pdGVtICgiLCIgd2l0aF9pdGVtKSogIjoiIHN1aXRlXG4gICB3aXRoX2l0ZW0gOjo9IGV4cHJlc3Npb24gWyJhcyIgdGFyZ2V0XVxuXG5UaGUgZXhlY3V0aW9uIG9mIHRoZSBgYHdpdGhgYCBzdGF0ZW1lbnQgd2l0aCBvbmUgIml0ZW0iIHByb2NlZWRzIGFzXG5mb2xsb3dzOlxuXG4xLiBUaGUgY29udGV4dCBleHByZXNzaW9uICh0aGUgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGUgYGB3aXRoX2l0ZW1gYClcbiAgIGlzIGV2YWx1YXRlZCB0byBvYnRhaW4gYSBjb250ZXh0IG1hbmFnZXIuXG5cbjIuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgYGBfX2V4aXRfXygpYGAgaXMgbG9hZGVkIGZvciBsYXRlciB1c2UuXG5cbjMuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgYGBfX2VudGVyX18oKWBgIG1ldGhvZCBpcyBpbnZva2VkLlxuXG40LiBJZiBhIHRhcmdldCB3YXMgaW5jbHVkZWQgaW4gdGhlIGBgd2l0aGBgIHN0YXRlbWVudCwgdGhlIHJldHVyblxuICAgdmFsdWUgZnJvbSBgYF9fZW50ZXJfXygpYGAgaXMgYXNzaWduZWQgdG8gaXQuXG5cbiAgIE5vdGU6IFRoZSBgYHdpdGhgYCBzdGF0ZW1lbnQgZ3VhcmFudGVlcyB0aGF0IGlmIHRoZSBgYF9fZW50ZXJfXygpYGBcbiAgICAgbWV0aG9kIHJldHVybnMgd2l0aG91dCBhbiBlcnJvciwgdGhlbiBgYF9fZXhpdF9fKClgYCB3aWxsIGFsd2F5c1xuICAgICBiZSBjYWxsZWQuIFRodXMsIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGFzc2lnbm1lbnQgdG8gdGhlXG4gICAgIHRhcmdldCBsaXN0LCBpdCB3aWxsIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgYW4gZXJyb3Igb2NjdXJyaW5nXG4gICAgIHdpdGhpbiB0aGUgc3VpdGUgd291bGQgYmUuIFNlZSBzdGVwIDYgYmVsb3cuXG5cbjUuIFRoZSBzdWl0ZSBpcyBleGVjdXRlZC5cblxuNi4gVGhlIGNvbnRleHQgbWFuYWdlclwncyBgYF9fZXhpdF9fKClgYCBtZXRob2QgaXMgaW52b2tlZC4gSWYgYW5cbiAgIGV4Y2VwdGlvbiBjYXVzZWQgdGhlIHN1aXRlIHRvIGJlIGV4aXRlZCwgaXRzIHR5cGUsIHZhbHVlLCBhbmRcbiAgIHRyYWNlYmFjayBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byBgYF9fZXhpdF9fKClgYC4gT3RoZXJ3aXNlLFxuICAgdGhyZWUgYGBOb25lYGAgYXJndW1lbnRzIGFyZSBzdXBwbGllZC5cblxuICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbiwgYW5kIHRoZSByZXR1cm4gdmFsdWVcbiAgIGZyb20gdGhlIGBgX19leGl0X18oKWBgIG1ldGhvZCB3YXMgZmFsc2UsIHRoZSBleGNlcHRpb24gaXNcbiAgIHJlcmFpc2VkLiBJZiB0aGUgcmV0dXJuIHZhbHVlIHdhcyB0cnVlLCB0aGUgZXhjZXB0aW9uIGlzXG4gICBzdXBwcmVzc2VkLCBhbmQgZXhlY3V0aW9uIGNvbnRpbnVlcyB3aXRoIHRoZSBzdGF0ZW1lbnQgZm9sbG93aW5nXG4gICB0aGUgYGB3aXRoYGAgc3RhdGVtZW50LlxuXG4gICBJZiB0aGUgc3VpdGUgd2FzIGV4aXRlZCBmb3IgYW55IHJlYXNvbiBvdGhlciB0aGFuIGFuIGV4Y2VwdGlvbiwgdGhlXG4gICByZXR1cm4gdmFsdWUgZnJvbSBgYF9fZXhpdF9fKClgYCBpcyBpZ25vcmVkLCBhbmQgZXhlY3V0aW9uIHByb2NlZWRzXG4gICBhdCB0aGUgbm9ybWFsIGxvY2F0aW9uIGZvciB0aGUga2luZCBvZiBleGl0IHRoYXQgd2FzIHRha2VuLlxuXG5XaXRoIG1vcmUgdGhhbiBvbmUgaXRlbSwgdGhlIGNvbnRleHQgbWFuYWdlcnMgYXJlIHByb2Nlc3NlZCBhcyBpZlxubXVsdGlwbGUgYGB3aXRoYGAgc3RhdGVtZW50cyB3ZXJlIG5lc3RlZDpcblxuICAgd2l0aCBBKCkgYXMgYSwgQigpIGFzIGI6XG4gICAgICAgc3VpdGVcblxuaXMgZXF1aXZhbGVudCB0b1xuXG4gICB3aXRoIEEoKSBhcyBhOlxuICAgICAgIHdpdGggQigpIGFzIGI6XG4gICAgICAgICAgIHN1aXRlXG5cbk5vdGU6IEluIFB5dGhvbiAyLjUsIHRoZSBgYHdpdGhgYCBzdGF0ZW1lbnQgaXMgb25seSBhbGxvd2VkIHdoZW4gdGhlXG4gIGBgd2l0aF9zdGF0ZW1lbnRgYCBmZWF0dXJlIGhhcyBiZWVuIGVuYWJsZWQuICBJdCBpcyBhbHdheXMgZW5hYmxlZFxuICBpbiBQeXRob24gMi42LlxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMi43OiBTdXBwb3J0IGZvciBtdWx0aXBsZSBjb250ZXh0IGV4cHJlc3Npb25zLlxuXG5TZWUgYWxzbzpcblxuICAgKipQRVAgMDM0MyoqIC0gVGhlICJ3aXRoIiBzdGF0ZW1lbnRcbiAgICAgIFRoZSBzcGVjaWZpY2F0aW9uLCBiYWNrZ3JvdW5kLCBhbmQgZXhhbXBsZXMgZm9yIHRoZSBQeXRob25cbiAgICAgIGBgd2l0aGBgIHN0YXRlbWVudC5cbicsCisgJ3lpZWxkJzogJ1xuVGhlIGBgeWllbGRgYCBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKioqXG5cbiAgIHlpZWxkX3N0bXQgOjo9IHlpZWxkX2V4cHJlc3Npb25cblxuVGhlIGBgeWllbGRgYCBzdGF0ZW1lbnQgaXMgb25seSB1c2VkIHdoZW4gZGVmaW5pbmcgYSBnZW5lcmF0b3JcbmZ1bmN0aW9uLCBhbmQgaXMgb25seSB1c2VkIGluIHRoZSBib2R5IG9mIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24uXG5Vc2luZyBhIGBgeWllbGRgYCBzdGF0ZW1lbnQgaW4gYSBmdW5jdGlvbiBkZWZpbml0aW9uIGlzIHN1ZmZpY2llbnQgdG9cbmNhdXNlIHRoYXQgZGVmaW5pdGlvbiB0byBjcmVhdGUgYSBnZW5lcmF0b3IgZnVuY3Rpb24gaW5zdGVhZCBvZiBhXG5ub3JtYWwgZnVuY3Rpb24uXG5cbldoZW4gYSBnZW5lcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkLCBpdCByZXR1cm5zIGFuIGl0ZXJhdG9yIGtub3duIGFzIGFcbmdlbmVyYXRvciBpdGVyYXRvciwgb3IgbW9yZSBjb21tb25seSwgYSBnZW5lcmF0b3IuICBUaGUgYm9keSBvZiB0aGVcbmdlbmVyYXRvciBmdW5jdGlvbiBpcyBleGVjdXRlZCBieSBjYWxsaW5nIHRoZSBnZW5lcmF0b3JcJ3MgYGBuZXh0KClgYFxubWV0aG9kIHJlcGVhdGVkbHkgdW50aWwgaXQgcmFpc2VzIGFuIGV4Y2VwdGlvbi5cblxuV2hlbiBhIGBgeWllbGRgYCBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQsIHRoZSBzdGF0ZSBvZiB0aGUgZ2VuZXJhdG9yIGlzXG5mcm96ZW4gYW5kIHRoZSB2YWx1ZSBvZiBgYGV4cHJlc3Npb25fbGlzdGBgIGlzIHJldHVybmVkIHRvXG5gYG5leHQoKWBgXCdzIGNhbGxlci4gIEJ5ICJmcm96ZW4iIHdlIG1lYW4gdGhhdCBhbGwgbG9jYWwgc3RhdGUgaXNcbnJldGFpbmVkLCBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgYmluZGluZ3Mgb2YgbG9jYWwgdmFyaWFibGVzLCB0aGVcbmluc3RydWN0aW9uIHBvaW50ZXIsIGFuZCB0aGUgaW50ZXJuYWwgZXZhbHVhdGlvbiBzdGFjazogZW5vdWdoXG5pbmZvcm1hdGlvbiBpcyBzYXZlZCBzbyB0aGF0IHRoZSBuZXh0IHRpbWUgYGBuZXh0KClgYCBpcyBpbnZva2VkLCB0aGVcbmZ1bmN0aW9uIGNhbiBwcm9jZWVkIGV4YWN0bHkgYXMgaWYgdGhlIGBgeWllbGRgYCBzdGF0ZW1lbnQgd2VyZSBqdXN0XG5hbm90aGVyIGV4dGVybmFsIGNhbGwuXG5cbkFzIG9mIFB5dGhvbiB2ZXJzaW9uIDIuNSwgdGhlIGBgeWllbGRgYCBzdGF0ZW1lbnQgaXMgbm93IGFsbG93ZWQgaW5cbnRoZSBgYHRyeWBgIGNsYXVzZSBvZiBhIGBgdHJ5YGAgLi4uICBgYGZpbmFsbHlgYCBjb25zdHJ1Y3QuICBJZiB0aGVcbmdlbmVyYXRvciBpcyBub3QgcmVzdW1lZCBiZWZvcmUgaXQgaXMgZmluYWxpemVkIChieSByZWFjaGluZyBhIHplcm9cbnJlZmVyZW5jZSBjb3VudCBvciBieSBiZWluZyBnYXJiYWdlIGNvbGxlY3RlZCksIHRoZSBnZW5lcmF0b3ItXG5pdGVyYXRvclwncyBgYGNsb3NlKClgYCBtZXRob2Qgd2lsbCBiZSBjYWxsZWQsIGFsbG93aW5nIGFueSBwZW5kaW5nXG5gYGZpbmFsbHlgYCBjbGF1c2VzIHRvIGV4ZWN1dGUuXG5cbkZvciBmdWxsIGRldGFpbHMgb2YgYGB5aWVsZGBgIHNlbWFudGljcywgcmVmZXIgdG8gdGhlICpZaWVsZFxuZXhwcmVzc2lvbnMqIHNlY3Rpb24uXG5cbk5vdGU6IEluIFB5dGhvbiAyLjIsIHRoZSBgYHlpZWxkYGAgc3RhdGVtZW50IHdhcyBvbmx5IGFsbG93ZWQgd2hlbiB0aGVcbiAgYGBnZW5lcmF0b3JzYGAgZmVhdHVyZSBoYXMgYmVlbiBlbmFibGVkLiAgVGhpcyBgYF9fZnV0dXJlX19gYCBpbXBvcnRcbiAgc3RhdGVtZW50IHdhcyB1c2VkIHRvIGVuYWJsZSB0aGUgZmVhdHVyZTpcblxuICAgICBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGdlbmVyYXRvcnNcblxuU2VlIGFsc286XG5cbiAgICoqUEVQIDAyNTUqKiAtIFNpbXBsZSBHZW5lcmF0b3JzXG4gICAgICBUaGUgcHJvcG9zYWwgZm9yIGFkZGluZyBnZW5lcmF0b3JzIGFuZCB0aGUgYGB5aWVsZGBgIHN0YXRlbWVudFxuICAgICAgdG8gUHl0aG9uLlxuXG4gICAqKlBFUCAwMzQyKiogLSBDb3JvdXRpbmVzIHZpYSBFbmhhbmNlZCBHZW5lcmF0b3JzXG4gICAgICBUaGUgcHJvcG9zYWwgdGhhdCwgYW1vbmcgb3RoZXIgZ2VuZXJhdG9yIGVuaGFuY2VtZW50cywgcHJvcG9zZWRcbiAgICAgIGFsbG93aW5nIGBgeWllbGRgYCB0byBhcHBlYXIgaW5zaWRlIGEgYGB0cnlgYCAuLi4gYGBmaW5hbGx5YGBcbiAgICAgIGJsb2NrLlxuJ30KZGlmZiAtLWdpdCBhL0xpYi9yYW5kb20ucHkgYi9MaWIvcmFuZG9tLnB5CmluZGV4IDM2Yjk1NjUuLjNmOTZhMzcgMTAwNjQ0Ci0tLSBhL0xpYi9yYW5kb20ucHkKKysrIGIvTGliL3JhbmRvbS5weQpAQCAtMTA4LDcgKzEwOCw5IEBACiAKICAgICAgICAgaWYgYSBpcyBOb25lOgogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGEgPSBsb25nKF9oZXhsaWZ5KF91cmFuZG9tKDE2KSksIDE2KQorICAgICAgICAgICAgICAgICMgU2VlZCB3aXRoIGVub3VnaCBieXRlcyB0byBzcGFuIHRoZSAxOTkzNyBiaXQKKyAgICAgICAgICAgICAgICAjIHN0YXRlIHNwYWNlIGZvciB0aGUgTWVyc2VubmUgVHdpc3RlcgorICAgICAgICAgICAgICAgIGEgPSBsb25nKF9oZXhsaWZ5KF91cmFuZG9tKDI1MDApKSwgMTYpCiAgICAgICAgICAgICBleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKICAgICAgICAgICAgICAgICBpbXBvcnQgdGltZQogICAgICAgICAgICAgICAgIGEgPSBsb25nKHRpbWUudGltZSgpICogMjU2KSAjIHVzZSBmcmFjdGlvbmFsIHNlY29uZHMKQEAgLTE3MCwyOSArMTcyLDI4IEBACiAKICMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tIGludGVnZXIgbWV0aG9kcyAgLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0gICAgZGVmIHJhbmRyYW5nZShzZWxmLCBzdGFydCwgc3RvcD1Ob25lLCBzdGVwPTEsIGludD1pbnQsIGRlZmF1bHQ9Tm9uZSwKLSAgICAgICAgICAgICAgICAgIG1heHdpZHRoPTFMPDxCUEYpOgorICAgIGRlZiByYW5kcmFuZ2Uoc2VsZiwgc3RhcnQsIHN0b3A9Tm9uZSwgc3RlcD0xLCBfaW50PWludCwgX21heHdpZHRoPTFMPDxCUEYpOgogICAgICAgICAiIiJDaG9vc2UgYSByYW5kb20gaXRlbSBmcm9tIHJhbmdlKHN0YXJ0LCBzdG9wWywgc3RlcF0pLgogCiAgICAgICAgIFRoaXMgZml4ZXMgdGhlIHByb2JsZW0gd2l0aCByYW5kaW50KCkgd2hpY2ggaW5jbHVkZXMgdGhlCiAgICAgICAgIGVuZHBvaW50OyBpbiBQeXRob24gdGhpcyBpcyB1c3VhbGx5IG5vdCB3aGF0IHlvdSB3YW50LgotICAgICAgICBEbyBub3Qgc3VwcGx5IHRoZSAnaW50JywgJ2RlZmF1bHQnLCBhbmQgJ21heHdpZHRoJyBhcmd1bWVudHMuCisKICAgICAgICAgIiIiCiAKICAgICAgICAgIyBUaGlzIGNvZGUgaXMgYSBiaXQgbWVzc3kgdG8gbWFrZSBpdCBmYXN0IGZvciB0aGUKICAgICAgICAgIyBjb21tb24gY2FzZSB3aGlsZSBzdGlsbCBkb2luZyBhZGVxdWF0ZSBlcnJvciBjaGVja2luZy4KLSAgICAgICAgaXN0YXJ0ID0gaW50KHN0YXJ0KQorICAgICAgICBpc3RhcnQgPSBfaW50KHN0YXJ0KQogICAgICAgICBpZiBpc3RhcnQgIT0gc3RhcnQ6CiAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAibm9uLWludGVnZXIgYXJnIDEgZm9yIHJhbmRyYW5nZSgpIgotICAgICAgICBpZiBzdG9wIGlzIGRlZmF1bHQ6CisgICAgICAgIGlmIHN0b3AgaXMgTm9uZToKICAgICAgICAgICAgIGlmIGlzdGFydCA+IDA6Ci0gICAgICAgICAgICAgICAgaWYgaXN0YXJ0ID49IG1heHdpZHRoOgorICAgICAgICAgICAgICAgIGlmIGlzdGFydCA+PSBfbWF4d2lkdGg6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9yYW5kYmVsb3coaXN0YXJ0KQotICAgICAgICAgICAgICAgIHJldHVybiBpbnQoc2VsZi5yYW5kb20oKSAqIGlzdGFydCkKKyAgICAgICAgICAgICAgICByZXR1cm4gX2ludChzZWxmLnJhbmRvbSgpICogaXN0YXJ0KQogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImVtcHR5IHJhbmdlIGZvciByYW5kcmFuZ2UoKSIKIAogICAgICAgICAjIHN0b3AgYXJndW1lbnQgc3VwcGxpZWQuCi0gICAgICAgIGlzdG9wID0gaW50KHN0b3ApCisgICAgICAgIGlzdG9wID0gX2ludChzdG9wKQogICAgICAgICBpZiBpc3RvcCAhPSBzdG9wOgogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIm5vbi1pbnRlZ2VyIHN0b3AgZm9yIHJhbmRyYW5nZSgpIgogICAgICAgICB3aWR0aCA9IGlzdG9wIC0gaXN0YXJ0CkBAIC0yMTAsMTQgKzIxMSwxNCBAQAogICAgICAgICAgICAgIyBhIGxvbmcsIGJ1dCB3ZSdyZSBzdXBwb3NlZCB0byByZXR1cm4gYW4gaW50IChmb3IgYmFja3dhcmQKICAgICAgICAgICAgICMgY29tcGF0aWJpbGl0eSkuCiAKLSAgICAgICAgICAgIGlmIHdpZHRoID49IG1heHdpZHRoOgotICAgICAgICAgICAgICAgIHJldHVybiBpbnQoaXN0YXJ0ICsgc2VsZi5fcmFuZGJlbG93KHdpZHRoKSkKLSAgICAgICAgICAgIHJldHVybiBpbnQoaXN0YXJ0ICsgaW50KHNlbGYucmFuZG9tKCkqd2lkdGgpKQorICAgICAgICAgICAgaWYgd2lkdGggPj0gX21heHdpZHRoOgorICAgICAgICAgICAgICAgIHJldHVybiBfaW50KGlzdGFydCArIHNlbGYuX3JhbmRiZWxvdyh3aWR0aCkpCisgICAgICAgICAgICByZXR1cm4gX2ludChpc3RhcnQgKyBfaW50KHNlbGYucmFuZG9tKCkqd2lkdGgpKQogICAgICAgICBpZiBzdGVwID09IDE6CiAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiZW1wdHkgcmFuZ2UgZm9yIHJhbmRyYW5nZSgpICglZCwlZCwgJWQpIiAlIChpc3RhcnQsIGlzdG9wLCB3aWR0aCkKIAogICAgICAgICAjIE5vbi11bml0IHN0ZXAgYXJndW1lbnQgc3VwcGxpZWQuCi0gICAgICAgIGlzdGVwID0gaW50KHN0ZXApCisgICAgICAgIGlzdGVwID0gX2ludChzdGVwKQogICAgICAgICBpZiBpc3RlcCAhPSBzdGVwOgogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIm5vbi1pbnRlZ2VyIHN0ZXAgZm9yIHJhbmRyYW5nZSgpIgogICAgICAgICBpZiBpc3RlcCA+IDA6CkBAIC0yMzAsOSArMjMxLDkgQEAKICAgICAgICAgaWYgbiA8PSAwOgogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImVtcHR5IHJhbmdlIGZvciByYW5kcmFuZ2UoKSIKIAotICAgICAgICBpZiBuID49IG1heHdpZHRoOgorICAgICAgICBpZiBuID49IF9tYXh3aWR0aDoKICAgICAgICAgICAgIHJldHVybiBpc3RhcnQgKyBpc3RlcCpzZWxmLl9yYW5kYmVsb3cobikKLSAgICAgICAgcmV0dXJuIGlzdGFydCArIGlzdGVwKmludChzZWxmLnJhbmRvbSgpICogbikKKyAgICAgICAgcmV0dXJuIGlzdGFydCArIGlzdGVwKl9pbnQoc2VsZi5yYW5kb20oKSAqIG4pCiAKICAgICBkZWYgcmFuZGludChzZWxmLCBhLCBiKToKICAgICAgICAgIiIiUmV0dXJuIHJhbmRvbSBpbnRlZ2VyIGluIHJhbmdlIFthLCBiXSwgaW5jbHVkaW5nIGJvdGggZW5kIHBvaW50cy4KQEAgLTI0MCw3ICsyNDEsNyBAQAogCiAgICAgICAgIHJldHVybiBzZWxmLnJhbmRyYW5nZShhLCBiKzEpCiAKLSAgICBkZWYgX3JhbmRiZWxvdyhzZWxmLCBuLCBfbG9nPV9sb2csIGludD1pbnQsIF9tYXh3aWR0aD0xTDw8QlBGLAorICAgIGRlZiBfcmFuZGJlbG93KHNlbGYsIG4sIF9sb2c9X2xvZywgX2ludD1pbnQsIF9tYXh3aWR0aD0xTDw8QlBGLAogICAgICAgICAgICAgICAgICAgIF9NZXRob2Q9X01ldGhvZFR5cGUsIF9CdWlsdGluTWV0aG9kPV9CdWlsdGluTWV0aG9kVHlwZSk6CiAgICAgICAgICIiIlJldHVybiBhIHJhbmRvbSBpbnQgaW4gdGhlIHJhbmdlIFswLG4pCiAKQEAgLTI1Nyw3ICsyNTgsNyBAQAogICAgICAgICAgICAgIyBoYXMgbm90IGJlZW4gb3ZlcnJpZGRlbiBvciBpZiBhIG5ldyBnZXRyYW5kYml0cygpIHdhcyBzdXBwbGllZC4KICAgICAgICAgICAgICMgVGhpcyBhc3N1cmVzIHRoYXQgdGhlIHR3byBtZXRob2RzIGNvcnJlc3BvbmQuCiAgICAgICAgICAgICBpZiB0eXBlKHNlbGYucmFuZG9tKSBpcyBfQnVpbHRpbk1ldGhvZCBvciB0eXBlKGdldHJhbmRiaXRzKSBpcyBfTWV0aG9kOgotICAgICAgICAgICAgICAgIGsgPSBpbnQoMS4wMDAwMSArIF9sb2cobi0xLCAyLjApKSAgICMgMioqayA+IG4tMSA+IDIqKihrLTIpCisgICAgICAgICAgICAgICAgayA9IF9pbnQoMS4wMDAwMSArIF9sb2cobi0xLCAyLjApKSAgICMgMioqayA+IG4tMSA+IDIqKihrLTIpCiAgICAgICAgICAgICAgICAgciA9IGdldHJhbmRiaXRzKGspCiAgICAgICAgICAgICAgICAgd2hpbGUgciA+PSBuOgogICAgICAgICAgICAgICAgICAgICByID0gZ2V0cmFuZGJpdHMoaykKQEAgLTI2NSw3ICsyNjYsNyBAQAogICAgICAgICBpZiBuID49IF9tYXh3aWR0aDoKICAgICAgICAgICAgIF93YXJuKCJVbmRlcmx5aW5nIHJhbmRvbSgpIGdlbmVyYXRvciBkb2VzIG5vdCBzdXBwbHkgXG4iCiAgICAgICAgICAgICAgICAgImVub3VnaCBiaXRzIHRvIGNob29zZSBmcm9tIGEgcG9wdWxhdGlvbiByYW5nZSB0aGlzIGxhcmdlIikKLSAgICAgICAgcmV0dXJuIGludChzZWxmLnJhbmRvbSgpICogbikKKyAgICAgICAgcmV0dXJuIF9pbnQoc2VsZi5yYW5kb20oKSAqIG4pCiAKICMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tIHNlcXVlbmNlIG1ldGhvZHMgIC0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMjczLDE4ICsyNzQsMjAgQEAKICAgICAgICAgIiIiQ2hvb3NlIGEgcmFuZG9tIGVsZW1lbnQgZnJvbSBhIG5vbi1lbXB0eSBzZXF1ZW5jZS4iIiIKICAgICAgICAgcmV0dXJuIHNlcVtpbnQoc2VsZi5yYW5kb20oKSAqIGxlbihzZXEpKV0gICMgcmFpc2VzIEluZGV4RXJyb3IgaWYgc2VxIGlzIGVtcHR5CiAKLSAgICBkZWYgc2h1ZmZsZShzZWxmLCB4LCByYW5kb209Tm9uZSwgaW50PWludCk6CisgICAgZGVmIHNodWZmbGUoc2VsZiwgeCwgcmFuZG9tPU5vbmUpOgogICAgICAgICAiIiJ4LCByYW5kb209cmFuZG9tLnJhbmRvbSAtPiBzaHVmZmxlIGxpc3QgeCBpbiBwbGFjZTsgcmV0dXJuIE5vbmUuCiAKICAgICAgICAgT3B0aW9uYWwgYXJnIHJhbmRvbSBpcyBhIDAtYXJndW1lbnQgZnVuY3Rpb24gcmV0dXJuaW5nIGEgcmFuZG9tCiAgICAgICAgIGZsb2F0IGluIFswLjAsIDEuMCk7IGJ5IGRlZmF1bHQsIHRoZSBzdGFuZGFyZCByYW5kb20ucmFuZG9tLgorCiAgICAgICAgICIiIgogCiAgICAgICAgIGlmIHJhbmRvbSBpcyBOb25lOgogICAgICAgICAgICAgcmFuZG9tID0gc2VsZi5yYW5kb20KKyAgICAgICAgX2ludCA9IGludAogICAgICAgICBmb3IgaSBpbiByZXZlcnNlZCh4cmFuZ2UoMSwgbGVuKHgpKSk6CiAgICAgICAgICAgICAjIHBpY2sgYW4gZWxlbWVudCBpbiB4WzppKzFdIHdpdGggd2hpY2ggdG8gZXhjaGFuZ2UgeFtpXQotICAgICAgICAgICAgaiA9IGludChyYW5kb20oKSAqIChpKzEpKQorICAgICAgICAgICAgaiA9IF9pbnQocmFuZG9tKCkgKiAoaSsxKSkKICAgICAgICAgICAgIHhbaV0sIHhbal0gPSB4W2pdLCB4W2ldCiAKICAgICBkZWYgc2FtcGxlKHNlbGYsIHBvcHVsYXRpb24sIGspOgpAQCAtMzY4LDcgKzM3MSwxMCBAQAogCiAgICAgICAgICIiIgogICAgICAgICB1ID0gc2VsZi5yYW5kb20oKQotICAgICAgICBjID0gMC41IGlmIG1vZGUgaXMgTm9uZSBlbHNlIChtb2RlIC0gbG93KSAvIChoaWdoIC0gbG93KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjID0gMC41IGlmIG1vZGUgaXMgTm9uZSBlbHNlIChtb2RlIC0gbG93KSAvIChoaWdoIC0gbG93KQorICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gbG93CiAgICAgICAgIGlmIHUgPiBjOgogICAgICAgICAgICAgdSA9IDEuMCAtIHUKICAgICAgICAgICAgIGMgPSAxLjAgLSBjCkBAIC00NTcsMjcgKzQ2MywyNSBAQAogICAgICAgICBpZiBrYXBwYSA8PSAxZS02OgogICAgICAgICAgICAgcmV0dXJuIFRXT1BJICogcmFuZG9tKCkKIAotICAgICAgICBhID0gMS4wICsgX3NxcnQoMS4wICsgNC4wICoga2FwcGEgKiBrYXBwYSkKLSAgICAgICAgYiA9IChhIC0gX3NxcnQoMi4wICogYSkpLygyLjAgKiBrYXBwYSkKLSAgICAgICAgciA9ICgxLjAgKyBiICogYikvKDIuMCAqIGIpCisgICAgICAgIHMgPSAwLjUgLyBrYXBwYQorICAgICAgICByID0gcyArIF9zcXJ0KDEuMCArIHMgKiBzKQogCiAgICAgICAgIHdoaWxlIDE6CiAgICAgICAgICAgICB1MSA9IHJhbmRvbSgpCi0KICAgICAgICAgICAgIHogPSBfY29zKF9waSAqIHUxKQotICAgICAgICAgICAgZiA9ICgxLjAgKyByICogeikvKHIgKyB6KQotICAgICAgICAgICAgYyA9IGthcHBhICogKHIgLSBmKQogCisgICAgICAgICAgICBkID0geiAvIChyICsgeikKICAgICAgICAgICAgIHUyID0gcmFuZG9tKCkKLQotICAgICAgICAgICAgaWYgdTIgPCBjICogKDIuMCAtIGMpIG9yIHUyIDw9IGMgKiBfZXhwKDEuMCAtIGMpOgorICAgICAgICAgICAgaWYgdTIgPCAxLjAgLSBkICogZCBvciB1MiA8PSAoMS4wIC0gZCkgKiBfZXhwKGQpOgogICAgICAgICAgICAgICAgIGJyZWFrCiAKKyAgICAgICAgcSA9IDEuMCAvIHIKKyAgICAgICAgZiA9IChxICsgeikgLyAoMS4wICsgcSAqIHopCiAgICAgICAgIHUzID0gcmFuZG9tKCkKICAgICAgICAgaWYgdTMgPiAwLjU6Ci0gICAgICAgICAgICB0aGV0YSA9IChtdSAlIFRXT1BJKSArIF9hY29zKGYpCisgICAgICAgICAgICB0aGV0YSA9IChtdSArIF9hY29zKGYpKSAlIFRXT1BJCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB0aGV0YSA9IChtdSAlIFRXT1BJKSAtIF9hY29zKGYpCisgICAgICAgICAgICB0aGV0YSA9IChtdSAtIF9hY29zKGYpKSAlIFRXT1BJCiAKICAgICAgICAgcmV0dXJuIHRoZXRhCiAKZGlmZiAtLWdpdCBhL0xpYi9yZS5weSBiL0xpYi9yZS5weQppbmRleCA2YTAxNzQzLi45YjAxZjNlIDEwMDY0NAotLS0gYS9MaWIvcmUucHkKKysrIGIvTGliL3JlLnB5CkBAIC0xOTgsMTAgKzE5OCw4IEBACiAgICAgIkNvbXBpbGUgYSB0ZW1wbGF0ZSBwYXR0ZXJuLCByZXR1cm5pbmcgYSBwYXR0ZXJuIG9iamVjdCIKICAgICByZXR1cm4gX2NvbXBpbGUocGF0dGVybiwgZmxhZ3N8VCkKIAotX2FscGhhbnVtID0ge30KLWZvciBjIGluICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OTAnOgotICAgIF9hbHBoYW51bVtjXSA9IDEKLWRlbCBjCitfYWxwaGFudW0gPSBmcm96ZW5zZXQoCisgICAgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5IikKIAogZGVmIGVzY2FwZShwYXR0ZXJuKToKICAgICAiRXNjYXBlIGFsbCBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgaW4gcGF0dGVybi4iCkBAIC0yMjcsMTEgKzIyNSwxMyBAQAogCiBkZWYgX2NvbXBpbGUoKmtleSk6CiAgICAgIyBpbnRlcm5hbDogY29tcGlsZSBwYXR0ZXJuCi0gICAgY2FjaGVrZXkgPSAodHlwZShrZXlbMF0pLCkgKyBrZXkKLSAgICBwID0gX2NhY2hlLmdldChjYWNoZWtleSkKLSAgICBpZiBwIGlzIG5vdCBOb25lOgotICAgICAgICByZXR1cm4gcAogICAgIHBhdHRlcm4sIGZsYWdzID0ga2V5CisgICAgYnlwYXNzX2NhY2hlID0gZmxhZ3MgJiBERUJVRworICAgIGlmIG5vdCBieXBhc3NfY2FjaGU6CisgICAgICAgIGNhY2hla2V5ID0gKHR5cGUoa2V5WzBdKSwpICsga2V5CisgICAgICAgIHAgPSBfY2FjaGUuZ2V0KGNhY2hla2V5KQorICAgICAgICBpZiBwIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHAKICAgICBpZiBpc2luc3RhbmNlKHBhdHRlcm4sIF9wYXR0ZXJuX3R5cGUpOgogICAgICAgICBpZiBmbGFnczoKICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0Nhbm5vdCBwcm9jZXNzIGZsYWdzIGFyZ3VtZW50IHdpdGggYSBjb21waWxlZCBwYXR0ZXJuJykKQEAgLTI0Miw5ICsyNDIsMTAgQEAKICAgICAgICAgcCA9IHNyZV9jb21waWxlLmNvbXBpbGUocGF0dGVybiwgZmxhZ3MpCiAgICAgZXhjZXB0IGVycm9yLCB2OgogICAgICAgICByYWlzZSBlcnJvciwgdiAjIGludmFsaWQgZXhwcmVzc2lvbgotICAgIGlmIGxlbihfY2FjaGUpID49IF9NQVhDQUNIRToKLSAgICAgICAgX2NhY2hlLmNsZWFyKCkKLSAgICBfY2FjaGVbY2FjaGVrZXldID0gcAorICAgIGlmIG5vdCBieXBhc3NfY2FjaGU6CisgICAgICAgIGlmIGxlbihfY2FjaGUpID49IF9NQVhDQUNIRToKKyAgICAgICAgICAgIF9jYWNoZS5jbGVhcigpCisgICAgICAgIF9jYWNoZVtjYWNoZWtleV0gPSBwCiAgICAgcmV0dXJuIHAKIAogZGVmIF9jb21waWxlX3JlcGwoKmtleSk6CmRpZmYgLS1naXQgYS9MaWIvcmZjODIyLnB5IGIvTGliL3JmYzgyMi5weQppbmRleCAzYjI5YTZhLi5iNjVkOGRhIDEwMDY0NAotLS0gYS9MaWIvcmZjODIyLnB5CisrKyBiL0xpYi9yZmM4MjIucHkKQEAgLTIxMiw3ICsyMTIsNyBAQAogICAgICAgICBZb3UgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHlvdXIgYXBwbGljYXRpb24gd2FudHMgdG8gYmVuZCB0aGUKICAgICAgICAgcnVsZXMsIGUuZy4gdG8gc3RyaXAgdHJhaWxpbmcgd2hpdGVzcGFjZSwgb3IgdG8gcmVjb2duaXplIE1IIHRlbXBsYXRlCiAgICAgICAgIHNlcGFyYXRvcnMgKCctLS0tLS0tLScpLiAgRm9yIGNvbnZlbmllbmNlIChlLmcuIGZvciBjb2RlIHJlYWRpbmcgZnJvbQotICAgICAgICBzb2NrZXRzKSBhIGxpbmUgY29uc2lzdGluZyBvZiBcclxuIGFsc28gbWF0Y2hlcy4KKyAgICAgICAgc29ja2V0cykgYSBsaW5lIGNvbnNpc3Rpbmcgb2YgXFxyXFxuIGFsc28gbWF0Y2hlcy4KICAgICAgICAgIiIiCiAgICAgICAgIHJldHVybiBsaW5lIGluIF9ibGFua2xpbmVzCiAKZGlmZiAtLWdpdCBhL0xpYi9ybGNvbXBsZXRlci5weSBiL0xpYi9ybGNvbXBsZXRlci5weQppbmRleCA1M2RlMjk2Li42ZTRiZDEyIDEwMDY0NAotLS0gYS9MaWIvcmxjb21wbGV0ZXIucHkKKysrIGIvTGliL3JsY29tcGxldGVyLnB5CkBAIC0xLDEzICsxLDExIEBACi0iIiJXb3JkIGNvbXBsZXRpb24gZm9yIEdOVSByZWFkbGluZSAyLjAuCisiIiJXb3JkIGNvbXBsZXRpb24gZm9yIEdOVSByZWFkbGluZS4KIAotVGhpcyByZXF1aXJlcyB0aGUgbGF0ZXN0IGV4dGVuc2lvbiB0byB0aGUgcmVhZGxpbmUgbW9kdWxlLiBUaGUgY29tcGxldGVyCi1jb21wbGV0ZXMga2V5d29yZHMsIGJ1aWx0LWlucyBhbmQgZ2xvYmFscyBpbiBhIHNlbGVjdGFibGUgbmFtZXNwYWNlICh3aGljaAotZGVmYXVsdHMgdG8gX19tYWluX18pOyB3aGVuIGNvbXBsZXRpbmcgTkFNRS5OQU1FLi4uLCBpdCBldmFsdWF0ZXMgKCEpIHRoZQotZXhwcmVzc2lvbiB1cCB0byB0aGUgbGFzdCBkb3QgYW5kIGNvbXBsZXRlcyBpdHMgYXR0cmlidXRlcy4KK1RoZSBjb21wbGV0ZXIgY29tcGxldGVzIGtleXdvcmRzLCBidWlsdC1pbnMgYW5kIGdsb2JhbHMgaW4gYSBzZWxlY3RhYmxlCituYW1lc3BhY2UgKHdoaWNoIGRlZmF1bHRzIHRvIF9fbWFpbl9fKTsgd2hlbiBjb21wbGV0aW5nIE5BTUUuTkFNRS4uLiwgaXQKK2V2YWx1YXRlcyAoISkgdGhlIGV4cHJlc3Npb24gdXAgdG8gdGhlIGxhc3QgZG90IGFuZCBjb21wbGV0ZXMgaXRzIGF0dHJpYnV0ZXMuCiAKLUl0J3MgdmVyeSBjb29sIHRvIGRvICJpbXBvcnQgc3lzIiB0eXBlICJzeXMuIiwgaGl0IHRoZQotY29tcGxldGlvbiBrZXkgKHR3aWNlKSwgYW5kIHNlZSB0aGUgbGlzdCBvZiBuYW1lcyBkZWZpbmVkIGJ5IHRoZQotc3lzIG1vZHVsZSEKK0l0J3MgdmVyeSBjb29sIHRvIGRvICJpbXBvcnQgc3lzIiB0eXBlICJzeXMuIiwgaGl0IHRoZSBjb21wbGV0aW9uIGtleSAodHdpY2UpLAorYW5kIHNlZSB0aGUgbGlzdCBvZiBuYW1lcyBkZWZpbmVkIGJ5IHRoZSBzeXMgbW9kdWxlIQogCiBUaXA6IHRvIHVzZSB0aGUgdGFiIGtleSBhcyB0aGUgY29tcGxldGlvbiBrZXksIGNhbGwKIApAQCAtMTUsMTggKzEzLDE2IEBACiAKIE5vdGVzOgogCi0tIEV4Y2VwdGlvbnMgcmFpc2VkIGJ5IHRoZSBjb21wbGV0ZXIgZnVuY3Rpb24gYXJlICppZ25vcmVkKiAoYW5kCi1nZW5lcmFsbHkgY2F1c2UgdGhlIGNvbXBsZXRpb24gdG8gZmFpbCkuICBUaGlzIGlzIGEgZmVhdHVyZSAtLSBzaW5jZQotcmVhZGxpbmUgc2V0cyB0aGUgdHR5IGRldmljZSBpbiByYXcgKG9yIGNicmVhaykgbW9kZSwgcHJpbnRpbmcgYQotdHJhY2ViYWNrIHdvdWxkbid0IHdvcmsgd2VsbCB3aXRob3V0IHNvbWUgY29tcGxpY2F0ZWQgaG9vcGxhIHRvIHNhdmUsCi1yZXNldCBhbmQgcmVzdG9yZSB0aGUgdHR5IHN0YXRlLgorLSBFeGNlcHRpb25zIHJhaXNlZCBieSB0aGUgY29tcGxldGVyIGZ1bmN0aW9uIGFyZSAqaWdub3JlZCogKGFuZCBnZW5lcmFsbHkgY2F1c2UKKyAgdGhlIGNvbXBsZXRpb24gdG8gZmFpbCkuICBUaGlzIGlzIGEgZmVhdHVyZSAtLSBzaW5jZSByZWFkbGluZSBzZXRzIHRoZSB0dHkKKyAgZGV2aWNlIGluIHJhdyAob3IgY2JyZWFrKSBtb2RlLCBwcmludGluZyBhIHRyYWNlYmFjayB3b3VsZG4ndCB3b3JrIHdlbGwKKyAgd2l0aG91dCBzb21lIGNvbXBsaWNhdGVkIGhvb3BsYSB0byBzYXZlLCByZXNldCBhbmQgcmVzdG9yZSB0aGUgdHR5IHN0YXRlLgogCi0tIFRoZSBldmFsdWF0aW9uIG9mIHRoZSBOQU1FLk5BTUUuLi4gZm9ybSBtYXkgY2F1c2UgYXJiaXRyYXJ5Ci1hcHBsaWNhdGlvbiBkZWZpbmVkIGNvZGUgdG8gYmUgZXhlY3V0ZWQgaWYgYW4gb2JqZWN0IHdpdGggYQotX19nZXRhdHRyX18gaG9vayBpcyBmb3VuZC4gIFNpbmNlIGl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUKLWFwcGxpY2F0aW9uIChvciB0aGUgdXNlcikgdG8gZW5hYmxlIHRoaXMgZmVhdHVyZSwgSSBjb25zaWRlciB0aGlzIGFuCi1hY2NlcHRhYmxlIHJpc2suICBNb3JlIGNvbXBsaWNhdGVkIGV4cHJlc3Npb25zIChlLmcuIGZ1bmN0aW9uIGNhbGxzIG9yCi1pbmRleGluZyBvcGVyYXRpb25zKSBhcmUgKm5vdCogZXZhbHVhdGVkLgorLSBUaGUgZXZhbHVhdGlvbiBvZiB0aGUgTkFNRS5OQU1FLi4uIGZvcm0gbWF5IGNhdXNlIGFyYml0cmFyeSBhcHBsaWNhdGlvbgorICBkZWZpbmVkIGNvZGUgdG8gYmUgZXhlY3V0ZWQgaWYgYW4gb2JqZWN0IHdpdGggYSBfX2dldGF0dHJfXyBob29rIGlzIGZvdW5kLgorICBTaW5jZSBpdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGFwcGxpY2F0aW9uIChvciB0aGUgdXNlcikgdG8gZW5hYmxlIHRoaXMKKyAgZmVhdHVyZSwgSSBjb25zaWRlciB0aGlzIGFuIGFjY2VwdGFibGUgcmlzay4gIE1vcmUgY29tcGxpY2F0ZWQgZXhwcmVzc2lvbnMKKyAgKGUuZy4gZnVuY3Rpb24gY2FsbHMgb3IgaW5kZXhpbmcgb3BlcmF0aW9ucykgYXJlICpub3QqIGV2YWx1YXRlZC4KIAogLSBHTlUgcmVhZGxpbmUgaXMgYWxzbyB1c2VkIGJ5IHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgaW5wdXQoKSBhbmQKIHJhd19pbnB1dCgpLCBhbmQgdGh1cyB0aGVzZSBhbHNvIGJlbmVmaXQvc3VmZmVyIGZyb20gdGhlIGNvbXBsZXRlcgpAQCAtMzUsNyArMzEsNyBAQAogaXRzIGlucHV0LgogCiAtIFdoZW4gdGhlIG9yaWdpbmFsIHN0ZGluIGlzIG5vdCBhIHR0eSBkZXZpY2UsIEdOVSByZWFkbGluZSBpcyBuZXZlcgotdXNlZCwgYW5kIHRoaXMgbW9kdWxlIChhbmQgdGhlIHJlYWRsaW5lIG1vZHVsZSkgYXJlIHNpbGVudGx5IGluYWN0aXZlLgorICB1c2VkLCBhbmQgdGhpcyBtb2R1bGUgKGFuZCB0aGUgcmVhZGxpbmUgbW9kdWxlKSBhcmUgc2lsZW50bHkgaW5hY3RpdmUuCiAKICIiIgogCkBAIC0xMjAsNyArMTE2LDcgQEAKICAgICAgICAgIiIiQ29tcHV0ZSBtYXRjaGVzIHdoZW4gdGV4dCBjb250YWlucyBhIGRvdC4KIAogICAgICAgICBBc3N1bWluZyB0aGUgdGV4dCBpcyBvZiB0aGUgZm9ybSBOQU1FLk5BTUUuLi4uW05BTUVdLCBhbmQgaXMKLSAgICAgICAgZXZhbHVhdGFibGUgaW4gc2VsZi5uYW1lc3BhY2UsIGl0IHdpbGwgYmUgZXZhbHVhdGVkIGFuZCBpdHMgYXR0cmlidXRlcworICAgICAgICBldmFsdWFibGUgaW4gc2VsZi5uYW1lc3BhY2UsIGl0IHdpbGwgYmUgZXZhbHVhdGVkIGFuZCBpdHMgYXR0cmlidXRlcwogICAgICAgICAoYXMgcmV2ZWFsZWQgYnkgZGlyKCkpIGFyZSB1c2VkIGFzIHBvc3NpYmxlIGNvbXBsZXRpb25zLiAgKEZvciBjbGFzcwogICAgICAgICBpbnN0YW5jZXMsIGNsYXNzIG1lbWJlcnMgYXJlIGFsc28gY29uc2lkZXJlZC4pCiAKZGlmZiAtLWdpdCBhL0xpYi9yb2JvdHBhcnNlci5weSBiL0xpYi9yb2JvdHBhcnNlci5weQppbmRleCAxNzIyODYzLi5iNDZiNzUzIDEwMDY0NAotLS0gYS9MaWIvcm9ib3RwYXJzZXIucHkKKysrIGIvTGliL3JvYm90cGFyc2VyLnB5CkBAIC03LDcgKzcsOCBAQAogICAgIDIpIFBTRiBsaWNlbnNlIGZvciBQeXRob24gMi4yCiAKICAgICBUaGUgcm9ib3RzLnR4dCBFeGNsdXNpb24gUHJvdG9jb2wgaXMgaW1wbGVtZW50ZWQgYXMgc3BlY2lmaWVkIGluCi0gICAgaHR0cDovL2luZm8ud2ViY3Jhd2xlci5jb20vbWFrL3Byb2plY3RzL3JvYm90cy9ub3JvYm90cy1yZmMuaHRtbAorICAgIGh0dHA6Ly93d3cucm9ib3RzdHh0Lm9yZy9ub3JvYm90cy1yZmMudHh0CisKICIiIgogaW1wb3J0IHVybHBhcnNlCiBpbXBvcnQgdXJsbGliCkBAIC02MCw3ICs2MSw3IEBACiAgICAgICAgIHNlbGYuZXJyY29kZSA9IG9wZW5lci5lcnJjb2RlCiAgICAgICAgIGlmIHNlbGYuZXJyY29kZSBpbiAoNDAxLCA0MDMpOgogICAgICAgICAgICAgc2VsZi5kaXNhbGxvd19hbGwgPSBUcnVlCi0gICAgICAgIGVsaWYgc2VsZi5lcnJjb2RlID49IDQwMDoKKyAgICAgICAgZWxpZiBzZWxmLmVycmNvZGUgPj0gNDAwIGFuZCBzZWxmLmVycmNvZGUgPCA1MDA6CiAgICAgICAgICAgICBzZWxmLmFsbG93X2FsbCA9IFRydWUKICAgICAgICAgZWxpZiBzZWxmLmVycmNvZGUgPT0gMjAwIGFuZCBsaW5lczoKICAgICAgICAgICAgIHNlbGYucGFyc2UobGluZXMpCkBAIC04Niw2ICs4Nyw3IEBACiAgICAgICAgIGxpbmVudW1iZXIgPSAwCiAgICAgICAgIGVudHJ5ID0gRW50cnkoKQogCisgICAgICAgIHNlbGYubW9kaWZpZWQoKQogICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKICAgICAgICAgICAgIGxpbmVudW1iZXIgKz0gMQogICAgICAgICAgICAgaWYgbm90IGxpbmU6CkBAIC0xMzEsNiArMTMzLDE0IEBACiAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgaWYgc2VsZi5hbGxvd19hbGw6CiAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgICMgVW50aWwgdGhlIHJvYm90cy50eHQgZmlsZSBoYXMgYmVlbiByZWFkIG9yIGZvdW5kIG5vdAorICAgICAgICAjIHRvIGV4aXN0LCB3ZSBtdXN0IGFzc3VtZSB0aGF0IG5vIHVybCBpcyBhbGxvd2FibGUuCisgICAgICAgICMgVGhpcyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgd2hlbiBhIHVzZXIgZXJyb25lbm91c2x5CisgICAgICAgICMgY2FsbHMgY2FuX2ZldGNoKCkgYmVmb3JlIGNhbGxpbmcgcmVhZCgpLgorICAgICAgICBpZiBub3Qgc2VsZi5sYXN0X2NoZWNrZWQ6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKwogICAgICAgICAjIHNlYXJjaCBmb3IgZ2l2ZW4gdXNlciBhZ2VudCBtYXRjaGVzCiAgICAgICAgICMgdGhlIGZpcnN0IG1hdGNoIGNvdW50cwogICAgICAgICBwYXJzZWRfdXJsID0gdXJscGFyc2UudXJscGFyc2UodXJsbGliLnVucXVvdGUodXJsKSkKQEAgLTE2MCw2ICsxNzAsNyBAQAogICAgICAgICBpZiBwYXRoID09ICcnIGFuZCBub3QgYWxsb3dhbmNlOgogICAgICAgICAgICAgIyBhbiBlbXB0eSB2YWx1ZSBtZWFucyBhbGxvdyBhbGwKICAgICAgICAgICAgIGFsbG93YW5jZSA9IFRydWUKKyAgICAgICAgcGF0aCA9IHVybHBhcnNlLnVybHVucGFyc2UodXJscGFyc2UudXJscGFyc2UocGF0aCkpCiAgICAgICAgIHNlbGYucGF0aCA9IHVybGxpYi5xdW90ZShwYXRoKQogICAgICAgICBzZWxmLmFsbG93YW5jZSA9IGFsbG93YW5jZQogCmRpZmYgLS1naXQgYS9MaWIvcnVucHkucHkgYi9MaWIvcnVucHkucHkKaW5kZXggZjYzNWM0Yi4uYzRkN2NjMiAxMDA2NDQKLS0tIGEvTGliL3J1bnB5LnB5CisrKyBiL0xpYi9ydW5weS5weQpAQCAtMjAwLDcgKzIwMCw3IEBACiAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICBlbHNlOgogICAgICAgICAgICAgIyBUaGUgZm9sbG93aW5nIGNoZWNrIGxvb2tzIGEgYml0IG9kZC4gVGhlIHRyaWNrIGlzIHRoYXQKLSAgICAgICAgICAgICMgTnVsbEltcG9ydGVyIHRocm93cyBJbXBvcnRFcnJvciBpZiB0aGUgc3VwcGxpZWQgcGF0aCBpcyBhCisgICAgICAgICAgICAjIE51bGxJbXBvcnRlciByYWlzZXMgSW1wb3J0RXJyb3IgaWYgdGhlIHN1cHBsaWVkIHBhdGggaXMgYQogICAgICAgICAgICAgIyAqdmFsaWQqIGRpcmVjdG9yeSBlbnRyeSAoYW5kIGhlbmNlIGFibGUgdG8gYmUgaGFuZGxlZAogICAgICAgICAgICAgIyBieSB0aGUgc3RhbmRhcmQgaW1wb3J0IG1hY2hpbmVyeSkKICAgICAgICAgICAgIHRyeToKZGlmZiAtLWdpdCBhL0xpYi9zaHV0aWwucHkgYi9MaWIvc2h1dGlsLnB5CmluZGV4IGJlODMyNTEuLmUxMmY3OTEgMTAwNjQ0Ci0tLSBhL0xpYi9zaHV0aWwucHkKKysrIGIvTGliL3NodXRpbC5weQpAQCAtMTAyLDggKzEwMiwxMCBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBvcy5jaGZsYWdzKGRzdCwgc3Quc3RfZmxhZ3MpCiAgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCB3aHk6Ci0gICAgICAgICAgICBpZiAobm90IGhhc2F0dHIoZXJybm8sICdFT1BOT1RTVVBQJykgb3IKLSAgICAgICAgICAgICAgICB3aHkuZXJybm8gIT0gZXJybm8uRU9QTk9UU1VQUCk6CisgICAgICAgICAgICBmb3IgZXJyIGluICdFT1BOT1RTVVBQJywgJ0VOT1RTVVAnOgorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoZXJybm8sIGVycikgYW5kIHdoeS5lcnJubyA9PSBnZXRhdHRyKGVycm5vLCBlcnIpOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICByYWlzZQogCiBkZWYgY29weShzcmMsIGRzdCk6CkBAIC0yMDEsNyArMjAzLDcgQEAKICAgICAgICAgICAgICMgQ29weWluZyBmaWxlIGFjY2VzcyB0aW1lcyBtYXkgZmFpbCBvbiBXaW5kb3dzCiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBlcnJvcnMuZXh0ZW5kKChzcmMsIGRzdCwgc3RyKHdoeSkpKQorICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgoc3JjLCBkc3QsIHN0cih3aHkpKSkKICAgICBpZiBlcnJvcnM6CiAgICAgICAgIHJhaXNlIEVycm9yLCBlcnJvcnMKIApAQCAtMjU3LDcgKzI1OSw4IEBACiBkZWYgX2Jhc2VuYW1lKHBhdGgpOgogICAgICMgQSBiYXNlbmFtZSgpIHZhcmlhbnQgd2hpY2ggZmlyc3Qgc3RyaXBzIHRoZSB0cmFpbGluZyBzbGFzaCwgaWYgcHJlc2VudC4KICAgICAjIFRodXMgd2UgYWx3YXlzIGdldCB0aGUgbGFzdCBjb21wb25lbnQgb2YgdGhlIHBhdGgsIGV2ZW4gZm9yIGRpcmVjdG9yaWVzLgotICAgIHJldHVybiBvcy5wYXRoLmJhc2VuYW1lKHBhdGgucnN0cmlwKG9zLnBhdGguc2VwKSkKKyAgICBzZXAgPSBvcy5wYXRoLnNlcCArIChvcy5wYXRoLmFsdHNlcCBvciAnJykKKyAgICByZXR1cm4gb3MucGF0aC5iYXNlbmFtZShwYXRoLnJzdHJpcChzZXApKQogCiBkZWYgbW92ZShzcmMsIGRzdCk6CiAgICAgIiIiUmVjdXJzaXZlbHkgbW92ZSBhIGZpbGUgb3IgZGlyZWN0b3J5IHRvIGFub3RoZXIgbG9jYXRpb24uIFRoaXMgaXMKQEAgLTQ0NCwxNyArNDQ3LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB6aXBfZmlsZW5hbWUsIGJhc2VfZGlyKQogCiAgICAgICAgIGlmIG5vdCBkcnlfcnVuOgotICAgICAgICAgICAgemlwID0gemlwZmlsZS5aaXBGaWxlKHppcF9maWxlbmFtZSwgInciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uPXppcGZpbGUuWklQX0RFRkxBVEVEKQotCi0gICAgICAgICAgICBmb3IgZGlycGF0aCwgZGlybmFtZXMsIGZpbGVuYW1lcyBpbiBvcy53YWxrKGJhc2VfZGlyKToKLSAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlbmFtZXM6Ci0gICAgICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguam9pbihkaXJwYXRoLCBuYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICB6aXAud3JpdGUocGF0aCwgcGF0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxvZ2dlciBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiYWRkaW5nICclcyciLCBwYXRoKQotICAgICAgICAgICAgemlwLmNsb3NlKCkKKyAgICAgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHppcF9maWxlbmFtZSwgInciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb249emlwZmlsZS5aSVBfREVGTEFURUQpIGFzIHpmOgorICAgICAgICAgICAgICAgIGZvciBkaXJwYXRoLCBkaXJuYW1lcywgZmlsZW5hbWVzIGluIG9zLndhbGsoYmFzZV9kaXIpOgorICAgICAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlbmFtZXM6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4oZGlycGF0aCwgbmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6Zi53cml0ZShwYXRoLCBwYXRoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxvZ2dlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oImFkZGluZyAnJXMnIiwgcGF0aCkKIAogICAgIHJldHVybiB6aXBfZmlsZW5hbWUKIApkaWZmIC0tZ2l0IGEvTGliL3NpdGUucHkgYi9MaWIvc2l0ZS5weQppbmRleCA5MGNmMzMxLi5kMmUxOGYxIDEwMDY0NAotLS0gYS9MaWIvc2l0ZS5weQorKysgYi9MaWIvc2l0ZS5weQpAQCAtMTE0LDE4ICsxMTQsNiBAQAogICAgIHN5cy5wYXRoWzpdID0gTAogICAgIHJldHVybiBrbm93bl9wYXRocwogCi0jIFhYWCBUaGlzIHNob3VsZCBub3QgYmUgcGFydCBvZiBzaXRlLnB5LCBzaW5jZSBpdCBpcyBuZWVkZWQgZXZlbiB3aGVuCi0jIHVzaW5nIHRoZSAtUyBvcHRpb24gZm9yIFB5dGhvbi4gIFNlZSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvNTg2NjgwCi1kZWYgYWRkYnVpbGRkaXIoKToKLSAgICAiIiJBcHBlbmQgLi9idWlsZC9saWIuPHBsYXRmb3JtPiBpbiBjYXNlIHdlJ3JlIHJ1bm5pbmcgaW4gdGhlIGJ1aWxkIGRpcgotICAgIChlc3BlY2lhbGx5IGZvciBHdWlkbyA6LSkiIiIKLSAgICBmcm9tIHN5c2NvbmZpZyBpbXBvcnQgZ2V0X3BsYXRmb3JtCi0gICAgcyA9ICJidWlsZC9saWIuJXMtJS4zcyIgJSAoZ2V0X3BsYXRmb3JtKCksIHN5cy52ZXJzaW9uKQotICAgIGlmIGhhc2F0dHIoc3lzLCAnZ2V0dG90YWxyZWZjb3VudCcpOgotICAgICAgICBzICs9ICctcHlkZWJ1ZycKLSAgICBzID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShzeXMucGF0aC5wb3AoKSksIHMpCi0gICAgc3lzLnBhdGguYXBwZW5kKHMpCi0KIAogZGVmIF9pbml0X3BhdGhpbmZvKCk6CiAgICAgIiIiUmV0dXJuIGEgc2V0IGNvbnRhaW5pbmcgYWxsIGV4aXN0aW5nIGRpcmVjdG9yeSBlbnRyaWVzIGZyb20gc3lzLnBhdGgiIiIKQEAgLTMxMiw3ICszMDAsNyBAQAogICAgICAgICAgICAgIyBsb2NhdGlvbnMuCiAgICAgICAgICAgICBmcm9tIHN5c2NvbmZpZyBpbXBvcnQgZ2V0X2NvbmZpZ192YXIKICAgICAgICAgICAgIGZyYW1ld29yayA9IGdldF9jb25maWdfdmFyKCJQWVRIT05GUkFNRVdPUksiKQotICAgICAgICAgICAgaWYgZnJhbWV3b3JrIGFuZCAiLyVzLmZyYW1ld29yay8iJShmcmFtZXdvcmssKSBpbiBwcmVmaXg6CisgICAgICAgICAgICBpZiBmcmFtZXdvcms6CiAgICAgICAgICAgICAgICAgc2l0ZXBhY2thZ2VzLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbigiL0xpYnJhcnkiLCBmcmFtZXdvcmssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnZlcnNpb25bOjNdLCAic2l0ZS1wYWNrYWdlcyIpKQpAQCAtNDQ4LDcgKzQzNiw3IEBACiAgICAgZm9yIHN1cHBvcnRpbmcgUHl0aG9uIGRldmVsb3BtZW50LiAgU2VlIHd3dy5weXRob24ub3JnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIiIikKICAgICBoZXJlID0gb3MucGF0aC5kaXJuYW1lKG9zLl9fZmlsZV9fKQogICAgIF9fYnVpbHRpbl9fLmxpY2Vuc2UgPSBfUHJpbnRlcigKLSAgICAgICAgImxpY2Vuc2UiLCAiU2VlIGh0dHA6Ly93d3cucHl0aG9uLm9yZy8lLjNzL2xpY2Vuc2UuaHRtbCIgJSBzeXMudmVyc2lvbiwKKyAgICAgICAgImxpY2Vuc2UiLCAiU2VlIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9wc2YvbGljZW5zZS8iLAogICAgICAgICBbIkxJQ0VOU0UudHh0IiwgIkxJQ0VOU0UiXSwKICAgICAgICAgW29zLnBhdGguam9pbihoZXJlLCBvcy5wYXJkaXIpLCBoZXJlLCBvcy5jdXJkaXJdKQogCkBAIC01MzcsOSArNTI1LDYgQEAKIAogICAgIGFic19fZmlsZV9fKCkKICAgICBrbm93bl9wYXRocyA9IHJlbW92ZWR1cHBhdGhzKCkKLSAgICBpZiAob3MubmFtZSA9PSAicG9zaXgiIGFuZCBzeXMucGF0aCBhbmQKLSAgICAgICAgb3MucGF0aC5iYXNlbmFtZShzeXMucGF0aFstMV0pID09ICJNb2R1bGVzIik6Ci0gICAgICAgIGFkZGJ1aWxkZGlyKCkKICAgICBpZiBFTkFCTEVfVVNFUl9TSVRFIGlzIE5vbmU6CiAgICAgICAgIEVOQUJMRV9VU0VSX1NJVEUgPSBjaGVja19lbmFibGV1c2Vyc2l0ZSgpCiAgICAga25vd25fcGF0aHMgPSBhZGR1c2Vyc2l0ZXBhY2thZ2VzKGtub3duX3BhdGhzKQpkaWZmIC0tZ2l0IGEvTGliL3NtdHBsaWIucHkgYi9MaWIvc210cGxpYi5weQppbmRleCAwNzU4MmY2Li43ZjA3ODQwIDEwMDc1NQotLS0gYS9MaWIvc210cGxpYi5weQorKysgYi9MaWIvc210cGxpYi5weQpAQCAtMjM3LDEwICsyMzcsMTIgQEAKIAogICAgICAgICBJZiBzcGVjaWZpZWQsIGBob3N0JyBpcyB0aGUgbmFtZSBvZiB0aGUgcmVtb3RlIGhvc3QgdG8gd2hpY2ggdG8KICAgICAgICAgY29ubmVjdC4gIElmIHNwZWNpZmllZCwgYHBvcnQnIHNwZWNpZmllcyB0aGUgcG9ydCB0byB3aGljaCB0byBjb25uZWN0LgotICAgICAgICBCeSBkZWZhdWx0LCBzbXRwbGliLlNNVFBfUE9SVCBpcyB1c2VkLiAgQW4gU01UUENvbm5lY3RFcnJvciBpcyByYWlzZWQKLSAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBgaG9zdCcgZG9lc24ndCByZXNwb25kIGNvcnJlY3RseS4gIElmIHNwZWNpZmllZCwKLSAgICAgICAgYGxvY2FsX2hvc3RuYW1lYCBpcyB1c2VkIGFzIHRoZSBGUUROIG9mIHRoZSBsb2NhbCBob3N0LiAgQnkgZGVmYXVsdCwKLSAgICAgICAgdGhlIGxvY2FsIGhvc3RuYW1lIGlzIGZvdW5kIHVzaW5nIHNvY2tldC5nZXRmcWRuKCkuCisgICAgICAgIEJ5IGRlZmF1bHQsIHNtdHBsaWIuU01UUF9QT1JUIGlzIHVzZWQuICBJZiBhIGhvc3QgaXMgc3BlY2lmaWVkIHRoZQorICAgICAgICBjb25uZWN0IG1ldGhvZCBpcyBjYWxsZWQsIGFuZCBpZiBpdCByZXR1cm5zIGFueXRoaW5nIG90aGVyIHRoYW4gYQorICAgICAgICBzdWNjZXNzIGNvZGUgYW4gU01UUENvbm5lY3RFcnJvciBpcyByYWlzZWQuICBJZiBzcGVjaWZpZWQsCisgICAgICAgIGBsb2NhbF9ob3N0bmFtZWAgaXMgdXNlZCBhcyB0aGUgRlFETiBvZiB0aGUgbG9jYWwgaG9zdCBmb3IgdGhlCisgICAgICAgIEhFTE8vRUhMTyBjb21tYW5kLiAgT3RoZXJ3aXNlLCB0aGUgbG9jYWwgaG9zdG5hbWUgaXMgZm91bmQgdXNpbmcKKyAgICAgICAgc29ja2V0LmdldGZxZG4oKS4KIAogICAgICAgICAiIiIKICAgICAgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dApAQCAtMjc2LDEyICsyNzgsMTIgQEAKICAgICAgICAgIiIiCiAgICAgICAgIHNlbGYuZGVidWdsZXZlbCA9IGRlYnVnbGV2ZWwKIAotICAgIGRlZiBfZ2V0X3NvY2tldChzZWxmLCBwb3J0LCBob3N0LCB0aW1lb3V0KToKKyAgICBkZWYgX2dldF9zb2NrZXQoc2VsZiwgaG9zdCwgcG9ydCwgdGltZW91dCk6CiAgICAgICAgICMgVGhpcyBtYWtlcyBpdCBzaW1wbGVyIGZvciBTTVRQX1NTTCB0byB1c2UgdGhlIFNNVFAgY29ubmVjdCBjb2RlCiAgICAgICAgICMgYW5kIGp1c3QgYWx0ZXIgdGhlIHNvY2tldCBjb25uZWN0aW9uIGJpdC4KICAgICAgICAgaWYgc2VsZi5kZWJ1Z2xldmVsID4gMDoKICAgICAgICAgICAgIHByaW50Pj5zdGRlcnIsICdjb25uZWN0OicsIChob3N0LCBwb3J0KQotICAgICAgICByZXR1cm4gc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uKChwb3J0LCBob3N0KSwgdGltZW91dCkKKyAgICAgICAgcmV0dXJuIHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoaG9zdCwgcG9ydCksIHRpbWVvdXQpCiAKICAgICBkZWYgY29ubmVjdChzZWxmLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTApOgogICAgICAgICAiIiJDb25uZWN0IHRvIGEgaG9zdCBvbiBhIGdpdmVuIHBvcnQuCkBAIC03NTgsMTIgKzc2MCwxNSBAQAogaWYgX2hhdmVfc3NsOgogCiAgICAgY2xhc3MgU01UUF9TU0woU01UUCk6Ci0gICAgICAgICIiIiBUaGlzIGlzIGEgc3ViY2xhc3MgZGVyaXZlZCBmcm9tIFNNVFAgdGhhdCBjb25uZWN0cyBvdmVyIGFuIFNTTCBlbmNyeXB0ZWQKLSAgICAgICAgc29ja2V0ICh0byB1c2UgdGhpcyBjbGFzcyB5b3UgbmVlZCBhIHNvY2tldCBtb2R1bGUgdGhhdCB3YXMgY29tcGlsZWQgd2l0aCBTU0wKLSAgICAgICAgc3VwcG9ydCkuIElmIGhvc3QgaXMgbm90IHNwZWNpZmllZCwgJycgKHRoZSBsb2NhbCBob3N0KSBpcyB1c2VkLiBJZiBwb3J0IGlzCi0gICAgICAgIG9taXR0ZWQsIHRoZSBzdGFuZGFyZCBTTVRQLW92ZXItU1NMIHBvcnQgKDQ2NSkgaXMgdXNlZC4ga2V5ZmlsZSBhbmQgY2VydGZpbGUKLSAgICAgICAgYXJlIGFsc28gb3B0aW9uYWwgLSB0aGV5IGNhbiBjb250YWluIGEgUEVNIGZvcm1hdHRlZCBwcml2YXRlIGtleSBhbmQKLSAgICAgICAgY2VydGlmaWNhdGUgY2hhaW4gZmlsZSBmb3IgdGhlIFNTTCBjb25uZWN0aW9uLgorICAgICAgICAiIiIgVGhpcyBpcyBhIHN1YmNsYXNzIGRlcml2ZWQgZnJvbSBTTVRQIHRoYXQgY29ubmVjdHMgb3ZlciBhbiBTU0wKKyAgICAgICAgZW5jcnlwdGVkIHNvY2tldCAodG8gdXNlIHRoaXMgY2xhc3MgeW91IG5lZWQgYSBzb2NrZXQgbW9kdWxlIHRoYXQgd2FzCisgICAgICAgIGNvbXBpbGVkIHdpdGggU1NMIHN1cHBvcnQpLiBJZiBob3N0IGlzIG5vdCBzcGVjaWZpZWQsICcnICh0aGUgbG9jYWwKKyAgICAgICAgaG9zdCkgaXMgdXNlZC4gSWYgcG9ydCBpcyBvbWl0dGVkLCB0aGUgc3RhbmRhcmQgU01UUC1vdmVyLVNTTCBwb3J0CisgICAgICAgICg0NjUpIGlzIHVzZWQuICBsb2NhbF9ob3N0bmFtZSBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBpdCBkb2VzIGluIHRoZQorICAgICAgICBTTVRQIGNsYXNzLiAga2V5ZmlsZSBhbmQgY2VydGZpbGUgYXJlIGFsc28gb3B0aW9uYWwgLSB0aGV5IGNhbiBjb250YWluCisgICAgICAgIGEgUEVNIGZvcm1hdHRlZCBwcml2YXRlIGtleSBhbmQgY2VydGlmaWNhdGUgY2hhaW4gZmlsZSBmb3IgdGhlIFNTTAorICAgICAgICBjb25uZWN0aW9uLgorCiAgICAgICAgICIiIgogCiAgICAgICAgIGRlZmF1bHRfcG9ydCA9IFNNVFBfU1NMX1BPUlQKQEAgLTc5NCw5ICs3OTksMTAgQEAKICAgICAiIiJMTVRQIC0gTG9jYWwgTWFpbCBUcmFuc2ZlciBQcm90b2NvbAogCiAgICAgVGhlIExNVFAgcHJvdG9jb2wsIHdoaWNoIGlzIHZlcnkgc2ltaWxhciB0byBFU01UUCwgaXMgaGVhdmlseSBiYXNlZAotICAgIG9uIHRoZSBzdGFuZGFyZCBTTVRQIGNsaWVudC4gSXQncyBjb21tb24gdG8gdXNlIFVuaXggc29ja2V0cyBmb3IgTE1UUCwKLSAgICBzbyBvdXIgY29ubmVjdCgpIG1ldGhvZCBtdXN0IHN1cHBvcnQgdGhhdCBhcyB3ZWxsIGFzIGEgcmVndWxhcgotICAgIGhvc3Q6cG9ydCBzZXJ2ZXIuIFRvIHNwZWNpZnkgYSBVbml4IHNvY2tldCwgeW91IG11c3QgdXNlIGFuIGFic29sdXRlCisgICAgb24gdGhlIHN0YW5kYXJkIFNNVFAgY2xpZW50LiBJdCdzIGNvbW1vbiB0byB1c2UgVW5peCBzb2NrZXRzIGZvcgorICAgIExNVFAsIHNvIG91ciBjb25uZWN0KCkgbWV0aG9kIG11c3Qgc3VwcG9ydCB0aGF0IGFzIHdlbGwgYXMgYSByZWd1bGFyCisgICAgaG9zdDpwb3J0IHNlcnZlci4gIGxvY2FsX2hvc3RuYW1lIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIGl0IGRvZXMgaW4KKyAgICB0aGUgU01UUCBjbGFzcy4gIFRvIHNwZWNpZnkgYSBVbml4IHNvY2tldCwgeW91IG11c3QgdXNlIGFuIGFic29sdXRlCiAgICAgcGF0aCBhcyB0aGUgaG9zdCwgc3RhcnRpbmcgd2l0aCBhICcvJy4KIAogICAgIEF1dGhlbnRpY2F0aW9uIGlzIHN1cHBvcnRlZCwgdXNpbmcgdGhlIHJlZ3VsYXIgU01UUCBtZWNoYW5pc20uIFdoZW4KQEAgLTgxOCwxMyArODI0LDEzIEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHNlbGYuc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1VOSVgsIHNvY2tldC5TT0NLX1NUUkVBTSkKICAgICAgICAgICAgIHNlbGYuc29jay5jb25uZWN0KGhvc3QpCi0gICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIG1zZzoKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKICAgICAgICAgICAgIGlmIHNlbGYuZGVidWdsZXZlbCA+IDA6CiAgICAgICAgICAgICAgICAgcHJpbnQ+PnN0ZGVyciwgJ2Nvbm5lY3QgZmFpbDonLCBob3N0CiAgICAgICAgICAgICBpZiBzZWxmLnNvY2s6CiAgICAgICAgICAgICAgICAgc2VsZi5zb2NrLmNsb3NlKCkKICAgICAgICAgICAgIHNlbGYuc29jayA9IE5vbmUKLSAgICAgICAgICAgIHJhaXNlIHNvY2tldC5lcnJvciwgbXNnCisgICAgICAgICAgICByYWlzZQogICAgICAgICAoY29kZSwgbXNnKSA9IHNlbGYuZ2V0cmVwbHkoKQogICAgICAgICBpZiBzZWxmLmRlYnVnbGV2ZWwgPiAwOgogICAgICAgICAgICAgcHJpbnQ+PnN0ZGVyciwgImNvbm5lY3Q6IiwgbXNnCmRpZmYgLS1naXQgYS9MaWIvc29ja2V0LnB5IGIvTGliL3NvY2tldC5weQppbmRleCBiZDM2NGU3Li5hYWMwNGY2IDEwMDY0NAotLS0gYS9MaWIvc29ja2V0LnB5CisrKyBiL0xpYi9zb2NrZXQucHkKQEAgLTMxOSw4ICszMTksOCBAQAogICAgICAgICBzZWxmLl93YnVmLmFwcGVuZChkYXRhKQogICAgICAgICBzZWxmLl93YnVmX2xlbiArPSBsZW4oZGF0YSkKICAgICAgICAgaWYgKHNlbGYuX3didWZzaXplID09IDAgb3IKLSAgICAgICAgICAgIHNlbGYuX3didWZzaXplID09IDEgYW5kICdcbicgaW4gZGF0YSBvcgotICAgICAgICAgICAgc2VsZi5fd2J1Zl9sZW4gPj0gc2VsZi5fd2J1ZnNpemUpOgorICAgICAgICAgICAgKHNlbGYuX3didWZzaXplID09IDEgYW5kICdcbicgaW4gZGF0YSkgb3IKKyAgICAgICAgICAgIChzZWxmLl93YnVmc2l6ZSA+IDEgYW5kIHNlbGYuX3didWZfbGVuID49IHNlbGYuX3didWZzaXplKSk6CiAgICAgICAgICAgICBzZWxmLmZsdXNoKCkKIAogICAgIGRlZiB3cml0ZWxpbmVzKHNlbGYsIGxpc3QpOgpkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvZGJhcGkyLnB5IGIvTGliL3NxbGl0ZTMvZGJhcGkyLnB5CmluZGV4IDdlYjI4ZTguLjBkNGRjYWYgMTAwNjQ0Ci0tLSBhL0xpYi9zcWxpdGUzL2RiYXBpMi5weQorKysgYi9MaWIvc3FsaXRlMy9kYmFwaTIucHkKQEAgLTEsNCArMSw0IEBACi0jLSotIGNvZGluZzogSVNPLTg4NTktMSAtKi0KKyMgLSotIGNvZGluZzogaXNvLTg4NTktMSAtKi0KICMgcHlzcWxpdGUyL2RiYXBpMi5weTogdGhlIERCLUFQSSAyLjAgaW50ZXJmYWNlCiAjCiAjIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KQEAgLTIxLDYgKzIxLDcgQEAKICMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgogIyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgogCitpbXBvcnQgY29sbGVjdGlvbnMKIGltcG9ydCBkYXRldGltZQogaW1wb3J0IHRpbWUKIApAQCAtNTEsNiArNTIsNyBAQAogc3FsaXRlX3ZlcnNpb25faW5mbyA9IHR1cGxlKFtpbnQoeCkgZm9yIHggaW4gc3FsaXRlX3ZlcnNpb24uc3BsaXQoIi4iKV0pCiAKIEJpbmFyeSA9IGJ1ZmZlcgorY29sbGVjdGlvbnMuU2VxdWVuY2UucmVnaXN0ZXIoUm93KQogCiBkZWYgcmVnaXN0ZXJfYWRhcHRlcnNfYW5kX2NvbnZlcnRlcnMoKToKICAgICBkZWYgYWRhcHRfZGF0ZSh2YWwpOgpAQCAtNjgsNyArNzAsNyBAQAogICAgICAgICB0aW1lcGFydF9mdWxsID0gdGltZXBhcnQuc3BsaXQoIi4iKQogICAgICAgICBob3VycywgbWludXRlcywgc2Vjb25kcyA9IG1hcChpbnQsIHRpbWVwYXJ0X2Z1bGxbMF0uc3BsaXQoIjoiKSkKICAgICAgICAgaWYgbGVuKHRpbWVwYXJ0X2Z1bGwpID09IDI6Ci0gICAgICAgICAgICBtaWNyb3NlY29uZHMgPSBpbnQodGltZXBhcnRfZnVsbFsxXSkKKyAgICAgICAgICAgIG1pY3Jvc2Vjb25kcyA9IGludCgnezowPDYuNn0nLmZvcm1hdCh0aW1lcGFydF9mdWxsWzFdLmRlY29kZSgpKSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIG1pY3Jvc2Vjb25kcyA9IDAKIApkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvZHVtcC5weSBiL0xpYi9zcWxpdGUzL2R1bXAucHkKaW5kZXggNDA5YTQwNS4uZTVjNWVmMiAxMDA2NDQKLS0tIGEvTGliL3NxbGl0ZTMvZHVtcC5weQorKysgYi9MaWIvc3FsaXRlMy9kdW1wLnB5CkBAIC0xLDYgKzEsMTIgQEAKICMgTWltaWMgdGhlIHNxbGl0ZTMgY29uc29sZSBzaGVsbCdzIC5kdW1wIGNvbW1hbmQKICMgQXV0aG9yOiBQYXVsIEtpcHBlcyA8a2lwcGVzcEBnbWFpbC5jb20+CiAKKyMgRXZlcnkgaWRlbnRpZmllciBpbiBzcWwgaXMgcXVvdGVkIGJhc2VkIG9uIGEgY29tbWVudCBpbiBzcWxpdGUKKyMgZG9jdW1lbnRhdGlvbiAiU1FMaXRlIGFkZHMgbmV3IGtleXdvcmRzIGZyb20gdGltZSB0byB0aW1lIHdoZW4gaXQKKyMgdGFrZXMgb24gbmV3IGZlYXR1cmVzLiBTbyB0byBwcmV2ZW50IHlvdXIgY29kZSBmcm9tIGJlaW5nIGJyb2tlbiBieQorIyBmdXR1cmUgZW5oYW5jZW1lbnRzLCB5b3Ugc2hvdWxkIG5vcm1hbGx5IHF1b3RlIGFueSBpZGVudGlmaWVyIHRoYXQKKyMgaXMgYW4gRW5nbGlzaCBsYW5ndWFnZSB3b3JkLCBldmVuIGlmIHlvdSBkbyBub3QgaGF2ZSB0by4iCisKIGRlZiBfaXRlcmR1bXAoY29ubmVjdGlvbik6CiAgICAgIiIiCiAgICAgUmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgZHVtcCBvZiB0aGUgZGF0YWJhc2UgaW4gYW4gU1FMIHRleHQgZm9ybWF0LgpAQCAtMTUsNDYgKzIxLDQ3IEBACiAKICAgICAjIHNxbGl0ZV9tYXN0ZXIgdGFibGUgY29udGFpbnMgdGhlIFNRTCBDUkVBVEUgc3RhdGVtZW50cyBmb3IgdGhlIGRhdGFiYXNlLgogICAgIHEgPSAiIiIKLSAgICAgICAgU0VMRUNUIG5hbWUsIHR5cGUsIHNxbAotICAgICAgICBGUk9NIHNxbGl0ZV9tYXN0ZXIKLSAgICAgICAgICAgIFdIRVJFIHNxbCBOT1QgTlVMTCBBTkQKLSAgICAgICAgICAgIHR5cGUgPT0gJ3RhYmxlJworICAgICAgICBTRUxFQ1QgIm5hbWUiLCAidHlwZSIsICJzcWwiCisgICAgICAgIEZST00gInNxbGl0ZV9tYXN0ZXIiCisgICAgICAgICAgICBXSEVSRSAic3FsIiBOT1QgTlVMTCBBTkQKKyAgICAgICAgICAgICJ0eXBlIiA9PSAndGFibGUnCisgICAgICAgICAgICBPUkRFUiBCWSAibmFtZSIKICAgICAgICAgIiIiCiAgICAgc2NoZW1hX3JlcyA9IGN1LmV4ZWN1dGUocSkKICAgICBmb3IgdGFibGVfbmFtZSwgdHlwZSwgc3FsIGluIHNjaGVtYV9yZXMuZmV0Y2hhbGwoKToKICAgICAgICAgaWYgdGFibGVfbmFtZSA9PSAnc3FsaXRlX3NlcXVlbmNlJzoKLSAgICAgICAgICAgIHlpZWxkKCdERUxFVEUgRlJPTSBzcWxpdGVfc2VxdWVuY2U7JykKKyAgICAgICAgICAgIHlpZWxkKCdERUxFVEUgRlJPTSAic3FsaXRlX3NlcXVlbmNlIjsnKQogICAgICAgICBlbGlmIHRhYmxlX25hbWUgPT0gJ3NxbGl0ZV9zdGF0MSc6Ci0gICAgICAgICAgICB5aWVsZCgnQU5BTFlaRSBzcWxpdGVfbWFzdGVyOycpCisgICAgICAgICAgICB5aWVsZCgnQU5BTFlaRSAic3FsaXRlX21hc3RlciI7JykKICAgICAgICAgZWxpZiB0YWJsZV9uYW1lLnN0YXJ0c3dpdGgoJ3NxbGl0ZV8nKToKICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICMgTk9URTogVmlydHVhbCB0YWJsZSBzdXBwb3J0IG5vdCBpbXBsZW1lbnRlZAogICAgICAgICAjZWxpZiBzcWwuc3RhcnRzd2l0aCgnQ1JFQVRFIFZJUlRVQUwgVEFCTEUnKToKICAgICAgICAgIyAgICBxdGFibGUgPSB0YWJsZV9uYW1lLnJlcGxhY2UoIiciLCAiJyciKQogICAgICAgICAjICAgIHlpZWxkKCJJTlNFUlQgSU5UTyBzcWxpdGVfbWFzdGVyKHR5cGUsbmFtZSx0YmxfbmFtZSxyb290cGFnZSxzcWwpIlwKLSAgICAgICAgIyAgICAgICAgIlZBTFVFUygndGFibGUnLCclcycsJyVzJywwLCclcycpOyIgJQorICAgICAgICAjICAgICAgICAiVkFMVUVTKCd0YWJsZScsJ3swfScsJ3swfScsMCwnezF9Jyk7Ii5mb3JtYXQoCiAgICAgICAgICMgICAgICAgIHF0YWJsZSwKLSAgICAgICAgIyAgICAgICAgcXRhYmxlLAotICAgICAgICAjICAgICAgICBzcWwucmVwbGFjZSgiJyciKSkKKyAgICAgICAgIyAgICAgICAgc3FsLnJlcGxhY2UoIicnIikpKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgeWllbGQoJyVzOycgJSBzcWwpCiAKICAgICAgICAgIyBCdWlsZCB0aGUgaW5zZXJ0IHN0YXRlbWVudCBmb3IgZWFjaCByb3cgb2YgdGhlIGN1cnJlbnQgdGFibGUKLSAgICAgICAgcmVzID0gY3UuZXhlY3V0ZSgiUFJBR01BIHRhYmxlX2luZm8oJyVzJykiICUgdGFibGVfbmFtZSkKKyAgICAgICAgdGFibGVfbmFtZV9pZGVudCA9IHRhYmxlX25hbWUucmVwbGFjZSgnIicsICciIicpCisgICAgICAgIHJlcyA9IGN1LmV4ZWN1dGUoJ1BSQUdNQSB0YWJsZV9pbmZvKCJ7MH0iKScuZm9ybWF0KHRhYmxlX25hbWVfaWRlbnQpKQogICAgICAgICBjb2x1bW5fbmFtZXMgPSBbc3RyKHRhYmxlX2luZm9bMV0pIGZvciB0YWJsZV9pbmZvIGluIHJlcy5mZXRjaGFsbCgpXQotICAgICAgICBxID0gIlNFTEVDVCAnSU5TRVJUIElOVE8gXCIlKHRibF9uYW1lKXNcIiBWQUxVRVMoIgotICAgICAgICBxICs9ICIsIi5qb2luKFsiJ3x8cXVvdGUoIiArIGNvbCArICIpfHwnIiBmb3IgY29sIGluIGNvbHVtbl9uYW1lc10pCi0gICAgICAgIHEgKz0gIiknIEZST00gJyUodGJsX25hbWUpcyciCi0gICAgICAgIHF1ZXJ5X3JlcyA9IGN1LmV4ZWN1dGUocSAlIHsndGJsX25hbWUnOiB0YWJsZV9uYW1lfSkKKyAgICAgICAgcSA9ICIiIlNFTEVDVCAnSU5TRVJUIElOVE8gInswfSIgVkFMVUVTKHsxfSknIEZST00gInswfSI7IiIiLmZvcm1hdCgKKyAgICAgICAgICAgIHRhYmxlX25hbWVfaWRlbnQsCisgICAgICAgICAgICAiLCIuam9pbigiIiInfHxxdW90ZSgiezB9Iil8fCciIiIuZm9ybWF0KGNvbC5yZXBsYWNlKCciJywgJyIiJykpIGZvciBjb2wgaW4gY29sdW1uX25hbWVzKSkKKyAgICAgICAgcXVlcnlfcmVzID0gY3UuZXhlY3V0ZShxKQogICAgICAgICBmb3Igcm93IGluIHF1ZXJ5X3JlczoKICAgICAgICAgICAgIHlpZWxkKCIlczsiICUgcm93WzBdKQogCiAgICAgIyBOb3cgd2hlbiB0aGUgdHlwZSBpcyAnaW5kZXgnLCAndHJpZ2dlcicsIG9yICd2aWV3JwogICAgIHEgPSAiIiIKLSAgICAgICAgU0VMRUNUIG5hbWUsIHR5cGUsIHNxbAotICAgICAgICBGUk9NIHNxbGl0ZV9tYXN0ZXIKLSAgICAgICAgICAgIFdIRVJFIHNxbCBOT1QgTlVMTCBBTkQKLSAgICAgICAgICAgIHR5cGUgSU4gKCdpbmRleCcsICd0cmlnZ2VyJywgJ3ZpZXcnKQorICAgICAgICBTRUxFQ1QgIm5hbWUiLCAidHlwZSIsICJzcWwiCisgICAgICAgIEZST00gInNxbGl0ZV9tYXN0ZXIiCisgICAgICAgICAgICBXSEVSRSAic3FsIiBOT1QgTlVMTCBBTkQKKyAgICAgICAgICAgICJ0eXBlIiBJTiAoJ2luZGV4JywgJ3RyaWdnZXInLCAndmlldycpCiAgICAgICAgICIiIgogICAgIHNjaGVtYV9yZXMgPSBjdS5leGVjdXRlKHEpCiAgICAgZm9yIG5hbWUsIHR5cGUsIHNxbCBpbiBzY2hlbWFfcmVzLmZldGNoYWxsKCk6CmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L2RiYXBpLnB5IGIvTGliL3NxbGl0ZTMvdGVzdC9kYmFwaS5weQppbmRleCA2NzAxYzIyLi5jMzU2ZDQ3IDEwMDY0NAotLS0gYS9MaWIvc3FsaXRlMy90ZXN0L2RiYXBpLnB5CisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvZGJhcGkucHkKQEAgLTIwMyw2ICsyMDMsMTMgQEAKICAgICBkZWYgQ2hlY2tFeGVjdXRlQXJnU3RyaW5nKHNlbGYpOgogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICg/KSIsICgiSHVnbyIsKSkKIAorICAgIGRlZiBDaGVja0V4ZWN1dGVBcmdTdHJpbmdXaXRoWmVyb0J5dGUoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKD8pIiwgKCJIdVx4MDBnbyIsKSkKKworICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCB3aGVyZSBpZD0/IiwgKHNlbGYuY3UubGFzdHJvd2lkLCkpCisgICAgICAgIHJvdyA9IHNlbGYuY3UuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgIkh1XHgwMGdvIikKKwogICAgIGRlZiBDaGVja0V4ZWN1dGVXcm9uZ05vT2ZBcmdzMShzZWxmKToKICAgICAgICAgIyB0b28gbWFueSBwYXJhbWV0ZXJzCiAgICAgICAgIHRyeToKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvZHVtcC5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvZHVtcC5weQppbmRleCA4M2I2YjA1Li5iN2RlODEwIDEwMDY0NAotLS0gYS9MaWIvc3FsaXRlMy90ZXN0L2R1bXAucHkKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC9kdW1wLnB5CkBAIC0xMyw2ICsxMywxNCBAQAogCiAgICAgZGVmIENoZWNrVGFibGVEdW1wKHNlbGYpOgogICAgICAgICBleHBlY3RlZF9zcWxzID0gWworICAgICAgICAgICAgICAgICIiIkNSRUFURSBUQUJMRSAiaW5kZXgiKCJpbmRleCIgYmxvYik7IiIiCisgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICIiIklOU0VSVCBJTlRPICJpbmRleCIgVkFMVUVTKFgnMDEnKTsiIiIKKyAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIiIiQ1JFQVRFIFRBQkxFICJxdW90ZWQiInRhYmxlIigicXVvdGVkIiJmaWVsZCIgdGV4dCk7IiIiCisgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICIiIklOU0VSVCBJTlRPICJxdW90ZWQiInRhYmxlIiBWQUxVRVMoJ3F1b3RlZCcndmFsdWUnKTsiIiIKKyAgICAgICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgIkNSRUFURSBUQUJMRSB0MShpZCBpbnRlZ2VyIHByaW1hcnkga2V5LCBzMSB0ZXh0LCAiIFwKICAgICAgICAgICAgICAgICAidDFfaTEgaW50ZWdlciBub3QgbnVsbCwgaTIgaW50ZWdlciwgdW5pcXVlIChzMSksICIgXAogICAgICAgICAgICAgICAgICJjb25zdHJhaW50IHQxX2lkeDEgdW5pcXVlIChpMikpOyIKQEAgLTIxLDYgKzI5LDggQEAKICAgICAgICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPIFwidDFcIiBWQUxVRVMoMiwnZm9vMicsMzAsMzApOyIKICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgdSJJTlNFUlQgSU5UTyBcInQxXCIgVkFMVUVTKDMsJ2ZceGMzXHhiNicsNDAsMTApOyIKKyAgICAgICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgIkNSRUFURSBUQUJMRSB0MihpZCBpbnRlZ2VyLCB0Ml9pMSBpbnRlZ2VyLCAiIFwKICAgICAgICAgICAgICAgICAidDJfaTIgaW50ZWdlciwgcHJpbWFyeSBrZXkgKGlkKSwiIFwKICAgICAgICAgICAgICAgICAiZm9yZWlnbiBrZXkodDJfaTEpIHJlZmVyZW5jZXMgdDEodDFfaTEpKTsiCkBAIC00MSw2ICs1MSwyNyBAQAogICAgICAgICBbc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF9zcWxzW2ldLCBhY3R1YWxfc3Fsc1tpXSkKICAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4oZXhwZWN0ZWRfc3FscykpXQogCisgICAgZGVmIENoZWNrVW5vcmRlcmFibGVSb3coc2VsZik6CisgICAgICAgICMgaXRlcmR1bXAoKSBzaG91bGQgYmUgYWJsZSB0byBjb3BlIHdpdGggdW5vcmRlcmFibGUgcm93IHR5cGVzIChpc3N1ZSAjMTU1NDUpCisgICAgICAgIGNsYXNzIFVub3JkZXJhYmxlUm93OgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGN1cnNvciwgcm93KToKKyAgICAgICAgICAgICAgICBzZWxmLnJvdyA9IHJvdworICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5yb3dbaW5kZXhdCisgICAgICAgIHNlbGYuY3gucm93X2ZhY3RvcnkgPSBVbm9yZGVyYWJsZVJvdworICAgICAgICBDUkVBVEVfQUxQSEEgPSAiIiJDUkVBVEUgVEFCTEUgImFscGhhIiAoIm9uZSIpOyIiIgorICAgICAgICBDUkVBVEVfQkVUQSA9ICIiIkNSRUFURSBUQUJMRSAiYmV0YSIgKCJ0d28iKTsiIiIKKyAgICAgICAgZXhwZWN0ZWQgPSBbCisgICAgICAgICAgICAiQkVHSU4gVFJBTlNBQ1RJT047IiwKKyAgICAgICAgICAgIENSRUFURV9BTFBIQSwKKyAgICAgICAgICAgIENSRUFURV9CRVRBLAorICAgICAgICAgICAgIkNPTU1JVDsiCisgICAgICAgICAgICBdCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZShDUkVBVEVfQkVUQSkKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKENSRUFURV9BTFBIQSkKKyAgICAgICAgZ290ID0gbGlzdChzZWxmLmN4Lml0ZXJkdW1wKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGdvdCkKKwogZGVmIHN1aXRlKCk6CiAgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSh1bml0dGVzdC5tYWtlU3VpdGUoRHVtcFRlc3RzLCAiQ2hlY2siKSkKIApkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC9mYWN0b3J5LnB5IGIvTGliL3NxbGl0ZTMvdGVzdC9mYWN0b3J5LnB5CmluZGV4IGYwOTA5NTUuLjA4MTNhMTMgMTAwNjQ0Ci0tLSBhL0xpYi9zcWxpdGUzL3Rlc3QvZmFjdG9yeS5weQorKysgYi9MaWIvc3FsaXRlMy90ZXN0L2ZhY3RvcnkucHkKQEAgLTIzLDYgKzIzLDcgQEAKIAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgc3FsaXRlMyBhcyBzcWxpdGUKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IFNlcXVlbmNlCiAKIGNsYXNzIE15Q29ubmVjdGlvbihzcWxpdGUuQ29ubmVjdGlvbik6CiAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CkBAIC00Nyw5ICs0OCw3IEBACiAgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKIAogICAgIGRlZiBDaGVja0lzSW5zdGFuY2Uoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNlbGYuY29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNeUNvbm5lY3Rpb24pLAotICAgICAgICAgICAgICAgICAgICAgICAgImNvbm5lY3Rpb24gaXMgbm90IGluc3RhbmNlIG9mIE15Q29ubmVjdGlvbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWxmLmNvbiwgTXlDb25uZWN0aW9uKQogCiBjbGFzcyBDdXJzb3JGYWN0b3J5VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBzZXRVcChzZWxmKToKQEAgLTYwLDkgKzU5LDcgQEAKIAogICAgIGRlZiBDaGVja0lzSW5zdGFuY2Uoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcihmYWN0b3J5PU15Q3Vyc29yKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShjdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE15Q3Vyc29yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJjdXJzb3IgaXMgbm90IGluc3RhbmNlIG9mIE15Q3Vyc29yIikKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGN1ciwgTXlDdXJzb3IpCiAKIGNsYXNzIFJvd0ZhY3RvcnlUZXN0c0JhY2t3YXJkc0NvbXBhdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgpAQCAtNzIsOSArNjksNyBAQAogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoZmFjdG9yeT1NeUN1cnNvcikKICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCA0KzUgYXMgZm9vIikKICAgICAgICAgcm93ID0gY3VyLmZldGNob25lKCkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uocm93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJyb3cgaXMgbm90IGluc3RhbmNlIG9mIGRpY3QiKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uocm93LCBkaWN0KQogICAgICAgICBjdXIuY2xvc2UoKQogCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgpAQCAtODcsMjggKzgyLDQyIEBACiAgICAgZGVmIENoZWNrQ3VzdG9tRmFjdG9yeShzZWxmKToKICAgICAgICAgc2VsZi5jb24ucm93X2ZhY3RvcnkgPSBsYW1iZGEgY3VyLCByb3c6IGxpc3Qocm93KQogICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgMSwgMiIpLmZldGNob25lKCkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uocm93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJyb3cgaXMgbm90IGluc3RhbmNlIG9mIGxpc3QiKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uocm93LCBsaXN0KQogCiAgICAgZGVmIENoZWNrU3FsaXRlUm93SW5kZXgoc2VsZik6CiAgICAgICAgIHNlbGYuY29uLnJvd19mYWN0b3J5ID0gc3FsaXRlLlJvdwogICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgMSBhcyBhLCAyIGFzIGIiKS5mZXRjaG9uZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHJvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FsaXRlLlJvdyksCi0gICAgICAgICAgICAgICAgICAgICAgICAicm93IGlzIG5vdCBpbnN0YW5jZSBvZiBzcWxpdGUuUm93IikKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHJvdywgc3FsaXRlLlJvdykKIAogICAgICAgICBjb2wxLCBjb2wyID0gcm93WyJhIl0sIHJvd1siYiJdCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb2wxID09IDEsICJieSBuYW1lOiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAnYSciKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoY29sMiA9PSAyLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ2EnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2wxLCAxLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ2EnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2wyLCAyLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ2EnIikKIAogICAgICAgICBjb2wxLCBjb2wyID0gcm93WyJBIl0sIHJvd1siQiJdCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb2wxID09IDEsICJieSBuYW1lOiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAnQSciKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoY29sMiA9PSAyLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ0InIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2wxLCAxLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ0EnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2wyLCAyLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ0InIikKIAotICAgICAgICBjb2wxLCBjb2wyID0gcm93WzBdLCByb3dbMV0KLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbDEgPT0gMSwgImJ5IGluZGV4OiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAwIikKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbDIgPT0gMiwgImJ5IGluZGV4OiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAxIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIDEsICJieSBpbmRleDogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBMXSwgMSwgImJ5IGluZGV4OiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMV0sIDIsICJieSBpbmRleDogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzFMXSwgMiwgImJ5IGluZGV4OiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAxIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbLTFdLCAyLCAiYnkgaW5kZXg6IHdyb25nIHJlc3VsdCBmb3IgY29sdW1uIC0xIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbLTFMXSwgMiwgImJ5IGluZGV4OiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAtMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93Wy0yXSwgMSwgImJ5IGluZGV4OiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAtMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93Wy0yTF0sIDEsICJieSBpbmRleDogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gLTIiKQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvcik6CisgICAgICAgICAgICByb3dbJ2MnXQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IpOgorICAgICAgICAgICAgcm93WzJdCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvcik6CisgICAgICAgICAgICByb3dbMkxdCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvcik6CisgICAgICAgICAgICByb3dbLTNdCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvcik6CisgICAgICAgICAgICByb3dbLTNMXQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IpOgorICAgICAgICAgICAgcm93WzIqKjEwMDBdCiAKICAgICBkZWYgQ2hlY2tTcWxpdGVSb3dJdGVyKHNlbGYpOgogICAgICAgICAiIiJDaGVja3MgaWYgdGhlIHJvdyBvYmplY3QgaXMgaXRlcmFibGUiIiIKQEAgLTEyMiw2ICsxMzEsNyBAQAogICAgICAgICBzZWxmLmNvbi5yb3dfZmFjdG9yeSA9IHNxbGl0ZS5Sb3cKICAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEgYXMgYSwgMiBhcyBiIikuZmV0Y2hvbmUoKQogICAgICAgICB0ID0gdHVwbGUocm93KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIChyb3dbJ2EnXSwgcm93WydiJ10pKQogCiAgICAgZGVmIENoZWNrU3FsaXRlUm93QXNEaWN0KHNlbGYpOgogICAgICAgICAiIiJDaGVja3MgaWYgdGhlIHJvdyBvYmplY3QgY2FuIGJlIGNvcnJlY3RseSBjb252ZXJ0ZWQgdG8gYSBkaWN0aW9uYXJ5IiIiCkBAIC0xMzgsOCArMTQ4LDggQEAKICAgICAgICAgcm93XzIgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgMSBhcyBhLCAyIGFzIGIiKS5mZXRjaG9uZSgpCiAgICAgICAgIHJvd18zID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEgYXMgYSwgMyBhcyBiIikuZmV0Y2hvbmUoKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyb3dfMSA9PSByb3dfMSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJvd18xID09IHJvd18yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd18xLCByb3dfMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dfMSwgcm93XzIpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyb3dfMiAhPSByb3dfMykKIAogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJvd18xICE9IHJvd18xKQpAQCAtMTUxLDYgKzE2MSwxNSBAQAogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJvd18xLCByb3dfMykKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChoYXNoKHJvd18xKSwgaGFzaChyb3dfMykpCiAKKyAgICBkZWYgQ2hlY2tTcWxpdGVSb3dBc1NlcXVlbmNlKHNlbGYpOgorICAgICAgICAiIiIgQ2hlY2tzIGlmIHRoZSByb3cgb2JqZWN0IGNhbiBhY3QgbGlrZSBhIHNlcXVlbmNlICIiIgorICAgICAgICBzZWxmLmNvbi5yb3dfZmFjdG9yeSA9IHNxbGl0ZS5Sb3cKKyAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEgYXMgYSwgMiBhcyBiIikuZmV0Y2hvbmUoKQorCisgICAgICAgIGFzX3R1cGxlID0gdHVwbGUocm93KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocmV2ZXJzZWQocm93KSksIGxpc3QocmV2ZXJzZWQoYXNfdHVwbGUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHJvdywgU2VxdWVuY2UpCisKICAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKIApAQCAtMTYxLDIwICsxODAsMjAgQEAKICAgICBkZWYgQ2hlY2tVbmljb2RlKHNlbGYpOgogICAgICAgICBhdXN0cmlhID0gdW5pY29kZSgi1nN0ZXJyZWljaCIsICJsYXRpbjEiKQogICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgPyIsIChhdXN0cmlhLCkpLmZldGNob25lKCkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUocm93WzBdKSA9PSB1bmljb2RlLCAidHlwZSBvZiByb3dbMF0gbXVzdCBiZSB1bmljb2RlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJvd1swXSksIHVuaWNvZGUsICJ0eXBlIG9mIHJvd1swXSBtdXN0IGJlIHVuaWNvZGUiKQogCiAgICAgZGVmIENoZWNrU3RyaW5nKHNlbGYpOgogICAgICAgICBzZWxmLmNvbi50ZXh0X2ZhY3RvcnkgPSBzdHIKICAgICAgICAgYXVzdHJpYSA9IHVuaWNvZGUoItZzdGVycmVpY2giLCAibGF0aW4xIikKICAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ID8iLCAoYXVzdHJpYSwpKS5mZXRjaG9uZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHJvd1swXSkgPT0gc3RyLCAidHlwZSBvZiByb3dbMF0gbXVzdCBiZSBzdHIiKQotICAgICAgICBzZWxmLmFzc2VydFRydWUocm93WzBdID09IGF1c3RyaWEuZW5jb2RlKCJ1dGYtOCIpLCAiY29sdW1uIG11c3QgZXF1YWwgb3JpZ2luYWwgZGF0YSBpbiBVVEYtOCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyb3dbMF0pLCBzdHIsICJ0eXBlIG9mIHJvd1swXSBtdXN0IGJlIHN0ciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCBhdXN0cmlhLmVuY29kZSgidXRmLTgiKSwgImNvbHVtbiBtdXN0IGVxdWFsIG9yaWdpbmFsIGRhdGEgaW4gVVRGLTgiKQogCiAgICAgZGVmIENoZWNrQ3VzdG9tKHNlbGYpOgogICAgICAgICBzZWxmLmNvbi50ZXh0X2ZhY3RvcnkgPSBsYW1iZGEgeDogdW5pY29kZSh4LCAidXRmLTgiLCAiaWdub3JlIikKICAgICAgICAgYXVzdHJpYSA9IHVuaWNvZGUoItZzdGVycmVpY2giLCAibGF0aW4xIikKICAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ID8iLCAoYXVzdHJpYS5lbmNvZGUoImxhdGluMSIpLCkpLmZldGNob25lKCkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUocm93WzBdKSA9PSB1bmljb2RlLCAidHlwZSBvZiByb3dbMF0gbXVzdCBiZSB1bmljb2RlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJvd1swXSksIHVuaWNvZGUsICJ0eXBlIG9mIHJvd1swXSBtdXN0IGJlIHVuaWNvZGUiKQogICAgICAgICBzZWxmLmFzc2VydFRydWUocm93WzBdLmVuZHN3aXRoKHUicmVpY2giKSwgImNvbHVtbiBtdXN0IGNvbnRhaW4gb3JpZ2luYWwgZGF0YSIpCiAKICAgICBkZWYgQ2hlY2tPcHRpbWl6ZWRVbmljb2RlKHNlbGYpOgpAQCAtMTgzLDggKzIwMiw0NiBAQAogICAgICAgICBnZXJtYW55ID0gdW5pY29kZSgiRGV1dGNobGFuZCIpCiAgICAgICAgIGFfcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ID8iLCAoYXVzdHJpYSwpKS5mZXRjaG9uZSgpCiAgICAgICAgIGRfcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ID8iLCAoZ2VybWFueSwpKS5mZXRjaG9uZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGFfcm93WzBdKSA9PSB1bmljb2RlLCAidHlwZSBvZiBub24tQVNDSUkgcm93IG11c3QgYmUgdW5pY29kZSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGRfcm93WzBdKSA9PSBzdHIsICJ0eXBlIG9mIEFTQ0lJLW9ubHkgcm93IG11c3QgYmUgc3RyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGFfcm93WzBdKSwgdW5pY29kZSwgInR5cGUgb2Ygbm9uLUFTQ0lJIHJvdyBtdXN0IGJlIHVuaWNvZGUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZF9yb3dbMF0pLCBzdHIsICJ0eXBlIG9mIEFTQ0lJLW9ubHkgcm93IG11c3QgYmUgc3RyIikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCitjbGFzcyBUZXh0RmFjdG9yeVRlc3RzV2l0aEVtYmVkZGVkWmVyb0J5dGVzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QgKHZhbHVlIHRleHQpIikKKyAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCAodmFsdWUpIHZhbHVlcyAoPykiLCAoImFceDAwYiIsKSkKKworICAgIGRlZiBDaGVja1N0cmluZyhzZWxmKToKKyAgICAgICAgIyB0ZXh0X2ZhY3RvcnkgZGVmYXVsdHMgdG8gdW5pY29kZQorICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgdmFsdWUgZnJvbSB0ZXN0IikuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUocm93WzBdKSwgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sICJhXHgwMGIiKQorCisgICAgZGVmIENoZWNrQ3VzdG9tKHNlbGYpOgorICAgICAgICAjIEEgY3VzdG9tIGZhY3Rvcnkgc2hvdWxkIHJlY2VpdmUgYW4gc3RyIGFyZ3VtZW50CisgICAgICAgIHNlbGYuY29uLnRleHRfZmFjdG9yeSA9IGxhbWJkYSB4OiB4CisgICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCB2YWx1ZSBmcm9tIHRlc3QiKS5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShyb3dbMF0pLCBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAiYVx4MDBiIikKKworICAgIGRlZiBDaGVja09wdGltaXplZFVuaWNvZGVBc1N0cmluZyhzZWxmKToKKyAgICAgICAgIyBBU0NJSSAtPiBzdHIgYXJndW1lbnQKKyAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gc3FsaXRlLk9wdGltaXplZFVuaWNvZGUKKyAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IHZhbHVlIGZyb20gdGVzdCIpLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKHJvd1swXSksIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sICJhXHgwMGIiKQorCisgICAgZGVmIENoZWNrT3B0aW1pemVkVW5pY29kZUFzVW5pY29kZShzZWxmKToKKyAgICAgICAgIyBOb24tQVNDSUkgLT4gdW5pY29kZSBhcmd1bWVudAorICAgICAgICBzZWxmLmNvbi50ZXh0X2ZhY3RvcnkgPSBzcWxpdGUuT3B0aW1pemVkVW5pY29kZQorICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCJkZWxldGUgZnJvbSB0ZXN0IikKKyAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCAodmFsdWUpIHZhbHVlcyAoPykiLCAodSfkXDD2JywpKQorICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgdmFsdWUgZnJvbSB0ZXN0IikuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUocm93WzBdKSwgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIHUi5Fx4MDD2IikKIAogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICAgc2VsZi5jb24uY2xvc2UoKQpAQCAtMTk1LDcgKzI1Miw4IEBACiAgICAgcm93X3N1aXRlX2NvbXBhdCA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShSb3dGYWN0b3J5VGVzdHNCYWNrd2FyZHNDb21wYXQsICJDaGVjayIpCiAgICAgcm93X3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFJvd0ZhY3RvcnlUZXN0cywgIkNoZWNrIikKICAgICB0ZXh0X3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFRleHRGYWN0b3J5VGVzdHMsICJDaGVjayIpCi0gICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgoY29ubmVjdGlvbl9zdWl0ZSwgY3Vyc29yX3N1aXRlLCByb3dfc3VpdGVfY29tcGF0LCByb3dfc3VpdGUsIHRleHRfc3VpdGUpKQorICAgIHRleHRfemVyb19ieXRlc19zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShUZXh0RmFjdG9yeVRlc3RzV2l0aEVtYmVkZGVkWmVyb0J5dGVzLCAiQ2hlY2siKQorICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKGNvbm5lY3Rpb25fc3VpdGUsIGN1cnNvcl9zdWl0ZSwgcm93X3N1aXRlX2NvbXBhdCwgcm93X3N1aXRlLCB0ZXh0X3N1aXRlLCB0ZXh0X3plcm9fYnl0ZXNfc3VpdGUpKQogCiBkZWYgdGVzdCgpOgogICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvaG9va3MucHkgYi9MaWIvc3FsaXRlMy90ZXN0L2hvb2tzLnB5CmluZGV4IDI3NDVjOGIuLjE2ZjIxN2QgMTAwNjQ0Ci0tLSBhL0xpYi9zcWxpdGUzL3Rlc3QvaG9va3MucHkKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC9ob29rcy5weQpAQCAtNzYsNiArNzYsMjUgQEAKICAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yLCBlOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmFyZ3NbMF0ubG93ZXIoKSwgIm5vIHN1Y2ggY29sbGF0aW9uIHNlcXVlbmNlOiBteWNvbGwiKQogCisgICAgZGVmIENoZWNrQ29sbGF0aW9uUmV0dXJuc0xhcmdlSW50ZWdlcihzZWxmKToKKyAgICAgICAgZGVmIG15Y29sbCh4LCB5KToKKyAgICAgICAgICAgICMgcmV2ZXJzZSBvcmRlcgorICAgICAgICAgICAgcmV0dXJuIC0oKHggPiB5KSAtICh4IDwgeSkpICogMioqMzIKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIG15Y29sbCkKKyAgICAgICAgc3FsID0gIiIiCisgICAgICAgICAgICBzZWxlY3QgeCBmcm9tICgKKyAgICAgICAgICAgIHNlbGVjdCAnYScgYXMgeAorICAgICAgICAgICAgdW5pb24KKyAgICAgICAgICAgIHNlbGVjdCAnYicgYXMgeAorICAgICAgICAgICAgdW5pb24KKyAgICAgICAgICAgIHNlbGVjdCAnYycgYXMgeAorICAgICAgICAgICAgKSBvcmRlciBieSB4IGNvbGxhdGUgbXljb2xsCisgICAgICAgICAgICAiIiIKKyAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoc3FsKS5mZXRjaGFsbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBbKCdjJywpLCAoJ2InLCksICgnYScsKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSJ0aGUgZXhwZWN0ZWQgb3JkZXIgd2FzIG5vdCByZXR1cm5lZCIpCisKICAgICBkZWYgQ2hlY2tDb2xsYXRpb25SZWdpc3RlclR3aWNlKHNlbGYpOgogICAgICAgICAiIiIKICAgICAgICAgUmVnaXN0ZXIgdHdvIGRpZmZlcmVudCBjb2xsYXRpb24gZnVuY3Rpb25zIHVuZGVyIHRoZSBzYW1lIG5hbWUuCkBAIC0xNDMsNyArMTYyLDcgQEAKICAgICAgICAgICAgIGNyZWF0ZSB0YWJsZSBiYXIgKGEsIGIpCiAgICAgICAgICAgICAiIiIpCiAgICAgICAgIHNlY29uZF9jb3VudCA9IGxlbihwcm9ncmVzc19jYWxscykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZpcnN0X2NvdW50ID4gc2Vjb25kX2NvdW50KQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChmaXJzdF9jb3VudCwgc2Vjb25kX2NvdW50KQogCiAgICAgZGVmIENoZWNrQ2FuY2VsT3BlcmF0aW9uKHNlbGYpOgogICAgICAgICAiIiIKQEAgLTE2NiwxNCArMTg1LDE0IEBACiAgICAgICAgIFRlc3QgdGhhdCBzZXR0aW5nIHRoZSBwcm9ncmVzcyBoYW5kbGVyIHRvIE5vbmUgY2xlYXJzIHRoZSBwcmV2aW91c2x5IHNldCBoYW5kbGVyLgogICAgICAgICAiIiIKICAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKLSAgICAgICAgYWN0aW9uID0gMAorICAgICAgICBhY3Rpb24gPSBbXQogICAgICAgICBkZWYgcHJvZ3Jlc3MoKToKLSAgICAgICAgICAgIGFjdGlvbiA9IDEKKyAgICAgICAgICAgIGFjdGlvbi5hcHBlbmQoMSkKICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgIGNvbi5zZXRfcHJvZ3Jlc3NfaGFuZGxlcihwcm9ncmVzcywgMSkKICAgICAgICAgY29uLnNldF9wcm9ncmVzc19oYW5kbGVyKE5vbmUsIDEpCiAgICAgICAgIGNvbi5leGVjdXRlKCJzZWxlY3QgMSB1bmlvbiBzZWxlY3QgMiB1bmlvbiBzZWxlY3QgMyIpLmZldGNoYWxsKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3Rpb24sIDAsICJwcm9ncmVzcyBoYW5kbGVyIHdhcyBub3QgY2xlYXJlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGFjdGlvbiksIDAsICJwcm9ncmVzcyBoYW5kbGVyIHdhcyBub3QgY2xlYXJlZCIpCiAKIGRlZiBzdWl0ZSgpOgogICAgIGNvbGxhdGlvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDb2xsYXRpb25UZXN0cywgIkNoZWNrIikKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvcmVncmVzc2lvbi5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvcmVncmVzc2lvbi5weQppbmRleCAxMDMwMDYxLi41Yjc3NTljIDEwMDY0NAotLS0gYS9MaWIvc3FsaXRlMy90ZXN0L3JlZ3Jlc3Npb24ucHkKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC9yZWdyZXNzaW9uLnB5CkBAIC0xLDQgKzEsNCBAQAotIy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCisjLSotIGNvZGluZzogaXNvLTg4NTktMSAtKi0KICMgcHlzcWxpdGUyL3Rlc3QvcmVncmVzc2lvbi5weTogcHlzcWxpdGUgcmVncmVzc2lvbiB0ZXN0cwogIwogIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CkBAIC0xNTksNyArMTU5LDggQEAKIAogICAgIGRlZiBDaGVja0N1cnNvckNvbnN0cnVjdG9yQ2FsbENoZWNrKHNlbGYpOgogICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZpZXMgdGhhdCBjdXJzb3IgbWV0aG9kcyBjaGVjayB3ZXRoZXIgYmFzZSBjbGFzcyBfX2luaXRfXyB3YXMgY2FsbGVkLgorICAgICAgICBWZXJpZmllcyB0aGF0IGN1cnNvciBtZXRob2RzIGNoZWNrIHdoZXRoZXIgYmFzZSBjbGFzcyBfX2luaXRfXyB3YXMKKyAgICAgICAgY2FsbGVkLgogICAgICAgICAiIiIKICAgICAgICAgY2xhc3MgQ3Vyc29yKHNxbGl0ZS5DdXJzb3IpOgogICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbik6CkBAIC0xNzcsNyArMTc4LDggQEAKIAogICAgIGRlZiBDaGVja0Nvbm5lY3Rpb25Db25zdHJ1Y3RvckNhbGxDaGVjayhzZWxmKToKICAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmaWVzIHRoYXQgY29ubmVjdGlvbiBtZXRob2RzIGNoZWNrIHdldGhlciBiYXNlIGNsYXNzIF9faW5pdF9fIHdhcyBjYWxsZWQuCisgICAgICAgIFZlcmlmaWVzIHRoYXQgY29ubmVjdGlvbiBtZXRob2RzIGNoZWNrIHdoZXRoZXIgYmFzZSBjbGFzcyBfX2luaXRfXyB3YXMKKyAgICAgICAgY2FsbGVkLgogICAgICAgICAiIiIKICAgICAgICAgY2xhc3MgQ29ubmVjdGlvbihzcWxpdGUuQ29ubmVjdGlvbik6CiAgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CkBAIC0yNjQsNiArMjY2LDU5IEBACiAgICAgICAgICIiIgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuV2FybmluZywgc2VsZi5jb24sIDEpCiAKKyAgICBkZWYgQ2hlY2tSZWN1cnNpdmVDdXJzb3JVc2Uoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTA4MTEKKworICAgICAgICBSZWN1cnNpdmVseSB1c2luZyBhIGN1cnNvciwgc3VjaCBhcyB3aGVuIHJldXNpbmcgaXQgZnJvbSBhIGdlbmVyYXRvciBsZWQgdG8gc2VnZmF1bHRzLgorICAgICAgICBOb3cgd2UgY2F0Y2ggcmVjdXJzaXZlIGN1cnNvciB1c2FnZSBhbmQgcmFpc2UgYSBQcm9ncmFtbWluZ0Vycm9yLgorICAgICAgICAiIiIKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKworICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBhIChiYXIpIikKKyAgICAgICAgY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBiIChiYXopIikKKworICAgICAgICBkZWYgZm9vKCk6CisgICAgICAgICAgICBjdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gYSAoYmFyKSB2YWx1ZXMgKD8pIiwgKDEsKSkKKyAgICAgICAgICAgIHlpZWxkIDEKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yKToKKyAgICAgICAgICAgIGN1ci5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gYiAoYmF6KSB2YWx1ZXMgKD8pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGksKSBmb3IgaSBpbiBmb28oKSkpCisKKyAgICBkZWYgQ2hlY2tDb252ZXJ0VGltZXN0YW1wTWljcm9zZWNvbmRQYWRkaW5nKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTE0NzIwCisKKyAgICAgICAgVGhlIG1pY3Jvc2Vjb25kIHBhcnNpbmcgb2YgY29udmVydF90aW1lc3RhbXAoKSBzaG91bGQgcGFkIHdpdGggemVyb3MsCisgICAgICAgIHNpbmNlIHRoZSBtaWNyb3NlY29uZCBzdHJpbmcgIjQ1NiIgYWN0dWFsbHkgcmVwcmVzZW50cyAiNDU2MDAwIi4KKyAgICAgICAgIiIiCisKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IiwgZGV0ZWN0X3R5cGVzPXNxbGl0ZS5QQVJTRV9ERUNMVFlQRVMpCisgICAgICAgIGN1ciA9IGNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgiQ1JFQVRFIFRBQkxFIHQgKHggVElNRVNUQU1QKSIpCisKKyAgICAgICAgIyBNaWNyb3NlY29uZHMgc2hvdWxkIGJlIDQ1NjAwMAorICAgICAgICBjdXIuZXhlY3V0ZSgiSU5TRVJUIElOVE8gdCAoeCkgVkFMVUVTICgnMjAxMi0wNC0wNCAxNTowNjowMC40NTYnKSIpCisKKyAgICAgICAgIyBNaWNyb3NlY29uZHMgc2hvdWxkIGJlIHRydW5jYXRlZCB0byAxMjM0NTYKKyAgICAgICAgY3VyLmV4ZWN1dGUoIklOU0VSVCBJTlRPIHQgKHgpIFZBTFVFUyAoJzIwMTItMDQtMDQgMTU6MDY6MDAuMTIzNDU2Nzg5JykiKQorCisgICAgICAgIGN1ci5leGVjdXRlKCJTRUxFQ1QgKiBGUk9NIHQiKQorICAgICAgICB2YWx1ZXMgPSBbeFswXSBmb3IgeCBpbiBjdXIuZmV0Y2hhbGwoKV0KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlcywgWworICAgICAgICAgICAgZGF0ZXRpbWUuZGF0ZXRpbWUoMjAxMiwgNCwgNCwgMTUsIDYsIDAsIDQ1NjAwMCksCisgICAgICAgICAgICBkYXRldGltZS5kYXRldGltZSgyMDEyLCA0LCA0LCAxNSwgNiwgMCwgMTIzNDU2KSwKKyAgICAgICAgXSkKKworICAgIGRlZiBDaGVja0ludmFsaWRJc29sYXRpb25MZXZlbFR5cGUoc2VsZik6CisgICAgICAgICMgaXNvbGF0aW9uIGxldmVsIGlzIGEgc3RyaW5nLCBub3QgYW4gaW50ZWdlcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbGl0ZS5jb25uZWN0LCAiOm1lbW9yeToiLCBpc29sYXRpb25fbGV2ZWw9MTIzKQorCisKIGRlZiBzdWl0ZSgpOgogICAgIHJlZ3Jlc3Npb25fc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoUmVncmVzc2lvblRlc3RzLCAiQ2hlY2siKQogICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKHJlZ3Jlc3Npb25fc3VpdGUsKSkKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvdHlwZXMucHkgYi9MaWIvc3FsaXRlMy90ZXN0L3R5cGVzLnB5CmluZGV4IGM1YWIzOWIuLjQwMGE0ZjIgMTAwNjQ0Ci0tLSBhL0xpYi9zcWxpdGUzL3Rlc3QvdHlwZXMucHkKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC90eXBlcy5weQpAQCAtMjQ0LDcgKzI0NCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWx1ZSksIGZsb2F0KQogCiAgICAgZGVmIENoZWNrTnVtYmVyMihzZWxmKToKLSAgICAgICAgIiIiQ2hlY2tzIHdldGhlciBjb252ZXJ0ZXIgbmFtZXMgYXJlIGN1dCBvZmYgYXQgJygnIGNoYXJhY3RlcnMiIiIKKyAgICAgICAgIiIiQ2hlY2tzIHdoZXRoZXIgY29udmVydGVyIG5hbWVzIGFyZSBjdXQgb2ZmIGF0ICcoJyBjaGFyYWN0ZXJzIiIiCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobjIpIHZhbHVlcyAoNSkiKQogICAgICAgICB2YWx1ZSA9IHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBuMiBmcm9tIHRlc3QiKS5mZXRjaG9uZSgpWzBdCiAgICAgICAgICMgaWYgdGhlIGNvbnZlcnRlciBpcyBub3QgdXNlZCwgaXQncyBhbiBpbnQgaW5zdGVhZCBvZiBhIGZsb2F0CmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L3VzZXJmdW5jdGlvbnMucHkgYi9MaWIvc3FsaXRlMy90ZXN0L3VzZXJmdW5jdGlvbnMucHkKaW5kZXggODBiNmYwYy4uNjM0ODEyZCAxMDA2NDQKLS0tIGEvTGliL3NxbGl0ZTMvdGVzdC91c2VyZnVuY3Rpb25zLnB5CisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weQpAQCAtMzcsNiArMzcsOCBAQAogICAgIHJldHVybiBOb25lCiBkZWYgZnVuY19yZXR1cm5ibG9iKCk6CiAgICAgcmV0dXJuIGJ1ZmZlcigiYmxvYiIpCitkZWYgZnVuY19yZXR1cm5sb25nbG9uZygpOgorICAgIHJldHVybiAxPDwzMQogZGVmIGZ1bmNfcmFpc2VleGNlcHRpb24oKToKICAgICA1IC8vIDAKIApAQCAtNTAsNiArNTIsOCBAQAogICAgIHJldHVybiB0eXBlKHYpIGlzIHR5cGUoTm9uZSkKIGRlZiBmdW5jX2lzYmxvYih2KToKICAgICByZXR1cm4gdHlwZSh2KSBpcyBidWZmZXIKK2RlZiBmdW5jX2lzbG9uZ2xvbmcodik6CisgICAgcmV0dXJuIGlzaW5zdGFuY2UodiwgKGludCwgbG9uZykpIGFuZCB2ID49IDE8PDMxCiAKIGNsYXNzIEFnZ3JOb1N0ZXA6CiAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgpAQCAtMTI2LDYgKzEzMCw3IEBACiAgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmV0dXJuZmxvYXQiLCAwLCBmdW5jX3JldHVybmZsb2F0KQogICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJldHVybm51bGwiLCAwLCBmdW5jX3JldHVybm51bGwpCiAgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmV0dXJuYmxvYiIsIDAsIGZ1bmNfcmV0dXJuYmxvYikKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZXR1cm5sb25nbG9uZyIsIDAsIGZ1bmNfcmV0dXJubG9uZ2xvbmcpCiAgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmFpc2VleGNlcHRpb24iLCAwLCBmdW5jX3JhaXNlZXhjZXB0aW9uKQogCiAgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigiaXNzdHJpbmciLCAxLCBmdW5jX2lzc3RyaW5nKQpAQCAtMTMzLDYgKzEzOCw3IEBACiAgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigiaXNmbG9hdCIsIDEsIGZ1bmNfaXNmbG9hdCkKICAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJpc25vbmUiLCAxLCBmdW5jX2lzbm9uZSkKICAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJpc2Jsb2IiLCAxLCBmdW5jX2lzYmxvYikKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJpc2xvbmdsb25nIiwgMSwgZnVuY19pc2xvbmdsb25nKQogCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCkBAIC0xOTksNiArMjA1LDEyIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWwpLCBidWZmZXIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCBidWZmZXIoImJsb2IiKSkKIAorICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5Mb25nTG9uZyhzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZXR1cm5sb25nbG9uZygpIikKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDE8PDMxKQorCiAgICAgZGVmIENoZWNrRnVuY0V4Y2VwdGlvbihzZWxmKToKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICAgdHJ5OgpAQCAtMjM4LDYgKzI1MCwxMiBAQAogICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKIAorICAgIGRlZiBDaGVja1BhcmFtTG9uZ0xvbmcoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaXNsb25nbG9uZyg/KSIsICgxPDw0MiwpKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKKwogY2xhc3MgQWdncmVnYXRlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQpAQCAtMzU2LDE0ICszNzQsMTUgQEAKICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDYwKQogCi1kZWYgYXV0aG9yaXplcl9jYihhY3Rpb24sIGFyZzEsIGFyZzIsIGRibmFtZSwgc291cmNlKToKLSAgICBpZiBhY3Rpb24gIT0gc3FsaXRlLlNRTElURV9TRUxFQ1Q6Ci0gICAgICAgIHJldHVybiBzcWxpdGUuU1FMSVRFX0RFTlkKLSAgICBpZiBhcmcyID09ICdjMicgb3IgYXJnMSA9PSAndDInOgotICAgICAgICByZXR1cm4gc3FsaXRlLlNRTElURV9ERU5ZCi0gICAgcmV0dXJuIHNxbGl0ZS5TUUxJVEVfT0sKLQogY2xhc3MgQXV0aG9yaXplclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGF1dGhvcml6ZXJfY2IoYWN0aW9uLCBhcmcxLCBhcmcyLCBkYm5hbWUsIHNvdXJjZSk6CisgICAgICAgIGlmIGFjdGlvbiAhPSBzcWxpdGUuU1FMSVRFX1NFTEVDVDoKKyAgICAgICAgICAgIHJldHVybiBzcWxpdGUuU1FMSVRFX0RFTlkKKyAgICAgICAgaWYgYXJnMiA9PSAnYzInIG9yIGFyZzEgPT0gJ3QyJzoKKyAgICAgICAgICAgIHJldHVybiBzcWxpdGUuU1FMSVRFX0RFTlkKKyAgICAgICAgcmV0dXJuIHNxbGl0ZS5TUUxJVEVfT0sKKwogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgICBzZWxmLmNvbi5leGVjdXRlc2NyaXB0KCIiIgpAQCAtMzc2LDEyICszOTUsMTIgQEAKICAgICAgICAgIyBGb3Igb3VyIHNlY3VyaXR5IHRlc3Q6CiAgICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCBjMiBmcm9tIHQyIikKIAotICAgICAgICBzZWxmLmNvbi5zZXRfYXV0aG9yaXplcihhdXRob3JpemVyX2NiKQorICAgICAgICBzZWxmLmNvbi5zZXRfYXV0aG9yaXplcihzZWxmLmF1dGhvcml6ZXJfY2IpCiAKICAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIHBhc3MKIAotICAgIGRlZiBDaGVja1RhYmxlQWNjZXNzKHNlbGYpOgorICAgIGRlZiB0ZXN0X3RhYmxlX2FjY2VzcyhzZWxmKToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ICogZnJvbSB0MiIpCiAgICAgICAgIGV4Y2VwdCBzcWxpdGUuRGF0YWJhc2VFcnJvciwgZToKQEAgLTM5MCw3ICs0MDksNyBAQAogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIGV4Y2VwdGlvbiBkdWUgdG8gbWlzc2luZyBwcml2aWxlZ2VzIikKIAotICAgIGRlZiBDaGVja0NvbHVtbkFjY2VzcyhzZWxmKToKKyAgICBkZWYgdGVzdF9jb2x1bW5fYWNjZXNzKHNlbGYpOgogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgYzIgZnJvbSB0MSIpCiAgICAgICAgIGV4Y2VwdCBzcWxpdGUuRGF0YWJhc2VFcnJvciwgZToKQEAgLTM5OSwxMSArNDE4LDQ2IEBACiAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gZXhjZXB0aW9uIGR1ZSB0byBtaXNzaW5nIHByaXZpbGVnZXMiKQogCitjbGFzcyBBdXRob3JpemVyUmFpc2VFeGNlcHRpb25UZXN0cyhBdXRob3JpemVyVGVzdHMpOgorICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgYXV0aG9yaXplcl9jYihhY3Rpb24sIGFyZzEsIGFyZzIsIGRibmFtZSwgc291cmNlKToKKyAgICAgICAgaWYgYWN0aW9uICE9IHNxbGl0ZS5TUUxJVEVfU0VMRUNUOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICBpZiBhcmcyID09ICdjMicgb3IgYXJnMSA9PSAndDInOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICByZXR1cm4gc3FsaXRlLlNRTElURV9PSworCitjbGFzcyBBdXRob3JpemVySWxsZWdhbFR5cGVUZXN0cyhBdXRob3JpemVyVGVzdHMpOgorICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgYXV0aG9yaXplcl9jYihhY3Rpb24sIGFyZzEsIGFyZzIsIGRibmFtZSwgc291cmNlKToKKyAgICAgICAgaWYgYWN0aW9uICE9IHNxbGl0ZS5TUUxJVEVfU0VMRUNUOgorICAgICAgICAgICAgcmV0dXJuIDAuMAorICAgICAgICBpZiBhcmcyID09ICdjMicgb3IgYXJnMSA9PSAndDInOgorICAgICAgICAgICAgcmV0dXJuIDAuMAorICAgICAgICByZXR1cm4gc3FsaXRlLlNRTElURV9PSworCitjbGFzcyBBdXRob3JpemVyTGFyZ2VJbnRlZ2VyVGVzdHMoQXV0aG9yaXplclRlc3RzKToKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGF1dGhvcml6ZXJfY2IoYWN0aW9uLCBhcmcxLCBhcmcyLCBkYm5hbWUsIHNvdXJjZSk6CisgICAgICAgIGlmIGFjdGlvbiAhPSBzcWxpdGUuU1FMSVRFX1NFTEVDVDoKKyAgICAgICAgICAgIHJldHVybiAyKiozMgorICAgICAgICBpZiBhcmcyID09ICdjMicgb3IgYXJnMSA9PSAndDInOgorICAgICAgICAgICAgcmV0dXJuIDIqKjMyCisgICAgICAgIHJldHVybiBzcWxpdGUuU1FMSVRFX09LCisKKwogZGVmIHN1aXRlKCk6CiAgICAgZnVuY3Rpb25fc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoRnVuY3Rpb25UZXN0cywgIkNoZWNrIikKICAgICBhZ2dyZWdhdGVfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQWdncmVnYXRlVGVzdHMsICJDaGVjayIpCi0gICAgYXV0aG9yaXplcl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShBdXRob3JpemVyVGVzdHMsICJDaGVjayIpCi0gICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgoZnVuY3Rpb25fc3VpdGUsIGFnZ3JlZ2F0ZV9zdWl0ZSwgYXV0aG9yaXplcl9zdWl0ZSkpCisgICAgYXV0aG9yaXplcl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShBdXRob3JpemVyVGVzdHMpCisgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgoCisgICAgICAgICAgICBmdW5jdGlvbl9zdWl0ZSwKKyAgICAgICAgICAgIGFnZ3JlZ2F0ZV9zdWl0ZSwKKyAgICAgICAgICAgIGF1dGhvcml6ZXJfc3VpdGUsCisgICAgICAgICAgICB1bml0dGVzdC5tYWtlU3VpdGUoQXV0aG9yaXplclJhaXNlRXhjZXB0aW9uVGVzdHMpLAorICAgICAgICAgICAgdW5pdHRlc3QubWFrZVN1aXRlKEF1dGhvcml6ZXJJbGxlZ2FsVHlwZVRlc3RzKSwKKyAgICAgICAgICAgIHVuaXR0ZXN0Lm1ha2VTdWl0ZShBdXRob3JpemVyTGFyZ2VJbnRlZ2VyVGVzdHMpLAorICAgICAgICApKQogCiBkZWYgdGVzdCgpOgogICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKZGlmZiAtLWdpdCBhL0xpYi9zcmVfY29tcGlsZS5weSBiL0xpYi9zcmVfY29tcGlsZS5weQppbmRleCAyYTBjNzQ1Li40NzE3NTNlIDEwMDY0NAotLS0gYS9MaWIvc3JlX2NvbXBpbGUucHkKKysrIGIvTGliL3NyZV9jb21waWxlLnB5CkBAIC0yNzYsMTAgKzI3NiwxMCBAQAogIyBzZXQgaXMgY29uc3RydWN0ZWQuIFRoZW4sIHRoaXMgYml0bWFwIGlzIHNsaWNlZCBpbnRvIGNodW5rcyBvZiAyNTYKICMgY2hhcmFjdGVycywgZHVwbGljYXRlIGNodW5rcyBhcmUgZWxpbWluYXRlZCwgYW5kIGVhY2ggY2h1bmsgaXMKICMgZ2l2ZW4gYSBudW1iZXIuIEluIHRoZSBjb21waWxlZCBleHByZXNzaW9uLCB0aGUgY2hhcnNldCBpcwotIyByZXByZXNlbnRlZCBieSBhIDE2LWJpdCB3b3JkIHNlcXVlbmNlLCBjb25zaXN0aW5nIG9mIG9uZSB3b3JkIGZvcgotIyB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCBjaHVua3MsIGEgc2VxdWVuY2Ugb2YgMjU2IGJ5dGVzICgxMjggd29yZHMpCisjIHJlcHJlc2VudGVkIGJ5IGEgMzItYml0IHdvcmQgc2VxdWVuY2UsIGNvbnNpc3Rpbmcgb2Ygb25lIHdvcmQgZm9yCisjIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGNodW5rcywgYSBzZXF1ZW5jZSBvZiAyNTYgYnl0ZXMgKDY0IHdvcmRzKQogIyBvZiBjaHVuayBudW1iZXJzIGluZGV4ZWQgYnkgdGhlaXIgb3JpZ2luYWwgY2h1bmsgcG9zaXRpb24sIGFuZCBhCi0jIHNlcXVlbmNlIG9mIGNodW5rcyAoMTYgd29yZHMgZWFjaCkuCisjIHNlcXVlbmNlIG9mIDI1Ni1iaXQgY2h1bmtzICg4IHdvcmRzIGVhY2gpLgogCiAjIENvbXByZXNzaW9uIGlzIG5vcm1hbGx5IGdvb2Q6IGluIGEgdHlwaWNhbCBjaGFyc2V0LCBsYXJnZSByYW5nZXMgb2YKICMgVW5pY29kZSB3aWxsIGJlIGVpdGhlciBjb21wbGV0ZWx5IGV4Y2x1ZGVkIChlLmcuIGlmIG9ubHkgY3lyaWxsaWMKQEAgLTI5NCw3ICsyOTQsNyBAQAogCiAjIEluIFVDUy00IG1vZGUsIHRoZSBCSUdDSEFSU0VUIG9wY29kZSBzdGlsbCBzdXBwb3J0cyBvbmx5IHN1YnNldHMKICMgb2YgdGhlIGJhc2ljIG11bHRpbGluZ3VhbCBwbGFuZTsgYW4gZWZmaWNpZW50IHJlcHJlc2VudGF0aW9uCi0jIGZvciBhbGwgb2YgVVRGLTE2IGhhcyBub3QgeWV0IGJlZW4gZGV2ZWxvcGVkLiBUaGlzIG1lYW5zLAorIyBmb3IgYWxsIG9mIFVuaWNvZGUgaGFzIG5vdCB5ZXQgYmVlbiBkZXZlbG9wZWQuIFRoaXMgbWVhbnMsCiAjIGluIHBhcnRpY3VsYXIsIHRoYXQgbmVnYXRlZCBjaGFyc2V0cyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXMKICMgYmlnY2hhcnNldHMuCiAKQEAgLTM0Myw3ICszNDMsNyBAQAogICAgIGVsc2U6CiAgICAgICAgIGNvZGUgPSAnSScKICAgICAjIENvbnZlcnQgYmxvY2sgaW5kaWNlcyB0byBieXRlIGFycmF5IG9mIDI1NiBieXRlcwotICAgIG1hcHBpbmcgPSBhcnJheS5hcnJheSgnYicsIG1hcHBpbmcpLnRvc3RyaW5nKCkKKyAgICBtYXBwaW5nID0gYXJyYXkuYXJyYXkoJ0InLCBtYXBwaW5nKS50b3N0cmluZygpCiAgICAgIyBDb252ZXJ0IGJ5dGUgYXJyYXkgdG8gd29yZCBhcnJheQogICAgIG1hcHBpbmcgPSBhcnJheS5hcnJheShjb2RlLCBtYXBwaW5nKQogICAgIGFzc2VydCBtYXBwaW5nLml0ZW1zaXplID09IF9zcmUuQ09ERVNJWkUKQEAgLTM1NCw4ICszNTQsNiBAQAogZGVmIF9zaW1wbGUoYXYpOgogICAgICMgY2hlY2sgaWYgYXYgaXMgYSAic2ltcGxlIiBvcGVyYXRvcgogICAgIGxvLCBoaSA9IGF2WzJdLmdldHdpZHRoKCkKLSAgICBpZiBsbyA9PSAwIGFuZCBoaSA9PSBNQVhSRVBFQVQ6Ci0gICAgICAgIHJhaXNlIGVycm9yLCAibm90aGluZyB0byByZXBlYXQiCiAgICAgcmV0dXJuIGxvID09IGhpID09IDEgYW5kIGF2WzJdWzBdWzBdICE9IFNVQlBBVFRFUk4KIAogZGVmIF9jb21waWxlX2luZm8oY29kZSwgcGF0dGVybiwgZmxhZ3MpOgpkaWZmIC0tZ2l0IGEvTGliL3NyZV9jb25zdGFudHMucHkgYi9MaWIvc3JlX2NvbnN0YW50cy5weQppbmRleCAxODYzZjQ4Li42OTIyNGUyIDEwMDY0NAotLS0gYS9MaWIvc3JlX2NvbnN0YW50cy5weQorKysgYi9MaWIvc3JlX2NvbnN0YW50cy5weQpAQCAtMTUsOSArMTUsMTEgQEAKIAogTUFHSUMgPSAyMDAzMTAxNwogCi0jIG1heCBjb2RlIHdvcmQgaW4gdGhpcyByZWxlYXNlCi0KLU1BWFJFUEVBVCA9IDY1NTM1Cit0cnk6CisgICAgZnJvbSBfc3JlIGltcG9ydCBNQVhSRVBFQVQKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBpbXBvcnQgX3NyZQorICAgIE1BWFJFUEVBVCA9IF9zcmUuTUFYUkVQRUFUID0gNjU1MzUKIAogIyBTUkUgc3RhbmRhcmQgZXhjZXB0aW9uIChhY2Nlc3MgYXMgc3JlLmVycm9yKQogIyBzaG91bGQgdGhpcyByZWFsbHkgYmUgaGVyZT8KZGlmZiAtLWdpdCBhL0xpYi9zcmVfcGFyc2UucHkgYi9MaWIvc3JlX3BhcnNlLnB5CmluZGV4IDE4MmQxZWIuLjBhMzYxYWIgMTAwNjQ0Ci0tLSBhL0xpYi9zcmVfcGFyc2UucHkKKysrIGIvTGliL3NyZV9wYXJzZS5weQpAQCAtMTQxLDEyICsxNDEsMTIgQEAKICAgICAgICAgIyBkZXRlcm1pbmUgdGhlIHdpZHRoIChtaW4sIG1heCkgZm9yIHRoaXMgc3VicGF0dGVybgogICAgICAgICBpZiBzZWxmLndpZHRoOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYud2lkdGgKLSAgICAgICAgbG8gPSBoaSA9IDBMCisgICAgICAgIGxvID0gaGkgPSAwCiAgICAgICAgIFVOSVRDT0RFUyA9IChBTlksIFJBTkdFLCBJTiwgTElURVJBTCwgTk9UX0xJVEVSQUwsIENBVEVHT1JZKQogICAgICAgICBSRVBFQVRDT0RFUyA9IChNSU5fUkVQRUFULCBNQVhfUkVQRUFUKQogICAgICAgICBmb3Igb3AsIGF2IGluIHNlbGYuZGF0YToKICAgICAgICAgICAgIGlmIG9wIGlzIEJSQU5DSDoKLSAgICAgICAgICAgICAgICBpID0gc3lzLm1heGludAorICAgICAgICAgICAgICAgIGkgPSBNQVhSRVBFQVQgLSAxCiAgICAgICAgICAgICAgICAgaiA9IDAKICAgICAgICAgICAgICAgICBmb3IgYXYgaW4gYXZbMV06CiAgICAgICAgICAgICAgICAgICAgIGwsIGggPSBhdi5nZXR3aWR0aCgpCkBAIC0xNjQsMTQgKzE2NCwxNCBAQAogICAgICAgICAgICAgICAgIGhpID0gaGkgKyBqCiAgICAgICAgICAgICBlbGlmIG9wIGluIFJFUEVBVENPREVTOgogICAgICAgICAgICAgICAgIGksIGogPSBhdlsyXS5nZXR3aWR0aCgpCi0gICAgICAgICAgICAgICAgbG8gPSBsbyArIGxvbmcoaSkgKiBhdlswXQotICAgICAgICAgICAgICAgIGhpID0gaGkgKyBsb25nKGopICogYXZbMV0KKyAgICAgICAgICAgICAgICBsbyA9IGxvICsgaSAqIGF2WzBdCisgICAgICAgICAgICAgICAgaGkgPSBoaSArIGogKiBhdlsxXQogICAgICAgICAgICAgZWxpZiBvcCBpbiBVTklUQ09ERVM6CiAgICAgICAgICAgICAgICAgbG8gPSBsbyArIDEKICAgICAgICAgICAgICAgICBoaSA9IGhpICsgMQogICAgICAgICAgICAgZWxpZiBvcCA9PSBTVUNDRVNTOgogICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIHNlbGYud2lkdGggPSBpbnQobWluKGxvLCBzeXMubWF4aW50KSksIGludChtaW4oaGksIHN5cy5tYXhpbnQpKQorICAgICAgICBzZWxmLndpZHRoID0gbWluKGxvLCBNQVhSRVBFQVQgLSAxKSwgbWluKGhpLCBNQVhSRVBFQVQpCiAgICAgICAgIHJldHVybiBzZWxmLndpZHRoCiAKIGNsYXNzIFRva2VuaXplcjoKQEAgLTIyOCw3ICsyMjgsNyBAQAogICAgIGlmIGNvZGU6CiAgICAgICAgIHJldHVybiBjb2RlCiAgICAgY29kZSA9IENBVEVHT1JJRVMuZ2V0KGVzY2FwZSkKLSAgICBpZiBjb2RlOgorICAgIGlmIGNvZGUgYW5kIGNvZGVbMF0gPT0gSU46CiAgICAgICAgIHJldHVybiBjb2RlCiAgICAgdHJ5OgogICAgICAgICBjID0gZXNjYXBlWzE6Ml0KQEAgLTQ5OCwxMCArNDk4LDE0IEBACiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgaWYgbG86CiAgICAgICAgICAgICAgICAgICAgIG1pbiA9IGludChsbykKKyAgICAgICAgICAgICAgICAgICAgaWYgbWluID49IE1BWFJFUEVBVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIE92ZXJmbG93RXJyb3IoInRoZSByZXBldGl0aW9uIG51bWJlciBpcyB0b28gbGFyZ2UiKQogICAgICAgICAgICAgICAgIGlmIGhpOgogICAgICAgICAgICAgICAgICAgICBtYXggPSBpbnQoaGkpCi0gICAgICAgICAgICAgICAgaWYgbWF4IDwgbWluOgotICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgImJhZCByZXBlYXQgaW50ZXJ2YWwiCisgICAgICAgICAgICAgICAgICAgIGlmIG1heCA+PSBNQVhSRVBFQVQ6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBPdmVyZmxvd0Vycm9yKCJ0aGUgcmVwZXRpdGlvbiBudW1iZXIgaXMgdG9vIGxhcmdlIikKKyAgICAgICAgICAgICAgICAgICAgaWYgbWF4IDwgbWluOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IoImJhZCByZXBlYXQgaW50ZXJ2YWwiKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgIm5vdCBzdXBwb3J0ZWQiCiAgICAgICAgICAgICAjIGZpZ3VyZSBvdXQgd2hpY2ggaXRlbSB0byByZXBlYXQKQEAgLTU0MSw4ICs1NDUsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZSArIGNoYXIKICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IG5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IoIm1pc3NpbmcgZ3JvdXAgbmFtZSIpCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgaXNuYW1lKG5hbWUpOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAiYmFkIGNoYXJhY3RlciBpbiBncm91cCBuYW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yKCJiYWQgY2hhcmFjdGVyIGluIGdyb3VwIG5hbWUgJXIiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKQogICAgICAgICAgICAgICAgICAgICBlbGlmIHNvdXJjZW1hdGNoKCI9Iik6CiAgICAgICAgICAgICAgICAgICAgICAgICAjIG5hbWVkIGJhY2tyZWZlcmVuY2UKICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiIgpAQCAtNTUzLDExICs1NjAsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBjaGFyID09ICIpIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZSArIGNoYXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBuYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yKCJtaXNzaW5nIGdyb3VwIG5hbWUiKQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlzbmFtZShuYW1lKToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgImJhZCBjaGFyYWN0ZXIgaW4gZ3JvdXAgbmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvcigiYmFkIGNoYXJhY3RlciBpbiBiYWNrcmVmIGdyb3VwIG5hbWUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlciIgJSBuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgZ2lkID0gc3RhdGUuZ3JvdXBkaWN0LmdldChuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgZ2lkIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJ1bmtub3duIGdyb3VwIG5hbWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gInVua25vd24gZ3JvdXAgbmFtZTogezAhcn0iLmZvcm1hdChuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yKG1zZykKICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnBhdHRlcm5hcHBlbmQoKEdST1VQUkVGLCBnaWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICAgZWxzZToKQEAgLTYwNSwxMCArNjE2LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRuYW1lID0gY29uZG5hbWUgKyBjaGFyCiAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gMgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgY29uZG5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvcigibWlzc2luZyBncm91cCBuYW1lIikKICAgICAgICAgICAgICAgICAgICAgaWYgaXNuYW1lKGNvbmRuYW1lKToKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRncm91cCA9IHN0YXRlLmdyb3VwZGljdC5nZXQoY29uZG5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBjb25kZ3JvdXAgaXMgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgInVua25vd24gZ3JvdXAgbmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSAidW5rbm93biBncm91cCBuYW1lOiB7MCFyfSIuZm9ybWF0KGNvbmRuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yKG1zZykKICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kZ3JvdXAgPSBpbnQoY29uZG5hbWUpCkBAIC03MjMsNyArNzM3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUgKyBjaGFyCiAgICAgICAgICAgICAgICAgaWYgbm90IG5hbWU6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAiYmFkIGdyb3VwIG5hbWUiCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAibWlzc2luZyBncm91cCBuYW1lIgogICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpbnQobmFtZSkKICAgICAgICAgICAgICAgICAgICAgaWYgaW5kZXggPCAwOgpAQCAtNzM0LDcgKzc0OCw4IEBACiAgICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gcGF0dGVybi5ncm91cGluZGV4W25hbWVdCiAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEluZGV4RXJyb3IsICJ1bmtub3duIGdyb3VwIG5hbWUiCisgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSAidW5rbm93biBncm91cCBuYW1lOiB7MCFyfSIuZm9ybWF0KG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBJbmRleEVycm9yKG1zZykKICAgICAgICAgICAgICAgICBhKChNQVJLLCBpbmRleCkpCiAgICAgICAgICAgICBlbGlmIGMgPT0gIjAiOgogICAgICAgICAgICAgICAgIGlmIHMubmV4dCBpbiBPQ1RESUdJVFM6CmRpZmYgLS1naXQgYS9MaWIvc3NsLnB5IGIvTGliL3NzbC5weQppbmRleCBmM2U1MTIzLi42NjZjZWEzIDEwMDY0NAotLS0gYS9MaWIvc3NsLnB5CisrKyBiL0xpYi9zc2wucHkKQEAgLTgxLDE2ICs4MSwyMyBAQAogfQogdHJ5OgogICAgIGZyb20gX3NzbCBpbXBvcnQgUFJPVE9DT0xfU1NMdjIKKyAgICBfU1NMdjJfSUZfRVhJU1RTID0gUFJPVE9DT0xfU1NMdjIKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICBwYXNzCisgICAgX1NTTHYyX0lGX0VYSVNUUyA9IE5vbmUKIGVsc2U6CiAgICAgX1BST1RPQ09MX05BTUVTW1BST1RPQ09MX1NTTHYyXSA9ICJTU0x2MiIKIAogZnJvbSBzb2NrZXQgaW1wb3J0IHNvY2tldCwgX2ZpbGVvYmplY3QsIF9kZWxlZ2F0ZV9tZXRob2RzLCBlcnJvciBhcyBzb2NrZXRfZXJyb3IKIGZyb20gc29ja2V0IGltcG9ydCBnZXRuYW1laW5mbyBhcyBfZ2V0bmFtZWluZm8KK2Zyb20gc29ja2V0IGltcG9ydCBTT0xfU09DS0VULCBTT19UWVBFLCBTT0NLX1NUUkVBTQogaW1wb3J0IGJhc2U2NCAgICAgICAgIyBmb3IgREVSLXRvLVBFTSB0cmFuc2xhdGlvbgogaW1wb3J0IGVycm5vCiAKKyMgRGlzYWJsZSB3ZWFrIG9yIGluc2VjdXJlIGNpcGhlcnMgYnkgZGVmYXVsdAorIyAoT3BlblNTTCdzIGRlZmF1bHQgc2V0dGluZyBpcyAnREVGQVVMVDohYU5VTEw6IWVOVUxMJykKK19ERUZBVUxUX0NJUEhFUlMgPSAnREVGQVVMVDohYU5VTEw6IWVOVUxMOiFMT1c6IUVYUE9SVDohU1NMdjInCisKKwogY2xhc3MgU1NMU29ja2V0KHNvY2tldCk6CiAKICAgICAiIiJUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBzdWJ0eXBlIG9mIHNvY2tldC5zb2NrZXQgdGhhdCB3cmFwcwpAQCAtMTAyLDYgKzEwOSwxMCBAQAogICAgICAgICAgICAgICAgICBzc2xfdmVyc2lvbj1QUk9UT0NPTF9TU0x2MjMsIGNhX2NlcnRzPU5vbmUsCiAgICAgICAgICAgICAgICAgIGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0PVRydWUsCiAgICAgICAgICAgICAgICAgIHN1cHByZXNzX3JhZ2dlZF9lb2ZzPVRydWUsIGNpcGhlcnM9Tm9uZSk6CisgICAgICAgICMgQ2FuJ3QgdXNlIHNvY2sudHlwZSBhcyBvdGhlciBmbGFncyAoc3VjaCBhcyBTT0NLX05PTkJMT0NLKSBnZXQKKyAgICAgICAgIyBtaXhlZCBpbi4KKyAgICAgICAgaWYgc29jay5nZXRzb2Nrb3B0KFNPTF9TT0NLRVQsIFNPX1RZUEUpICE9IFNPQ0tfU1RSRUFNOgorICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigib25seSBzdHJlYW0gc29ja2V0cyBhcmUgc3VwcG9ydGVkIikKICAgICAgICAgc29ja2V0Ll9faW5pdF9fKHNlbGYsIF9zb2NrPXNvY2suX3NvY2spCiAgICAgICAgICMgVGhlIGluaXRpYWxpemVyIGZvciBzb2NrZXQgb3ZlcnJpZGVzIHRoZSBtZXRob2RzIHNlbmQoKSwgcmVjdigpLCBldGMuCiAgICAgICAgICMgaW4gdGhlIGluc3RhbmNjZSwgd2hpY2ggd2UgZG9uJ3QgbmVlZCAtLSBidXQgd2Ugd2FudCB0byBwcm92aWRlIHRoZQpAQCAtMTEyLDYgKzEyMyw5IEBACiAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICAgICAgcGFzcwogCisgICAgICAgIGlmIGNpcGhlcnMgaXMgTm9uZSBhbmQgc3NsX3ZlcnNpb24gIT0gX1NTTHYyX0lGX0VYSVNUUzoKKyAgICAgICAgICAgIGNpcGhlcnMgPSBfREVGQVVMVF9DSVBIRVJTCisKICAgICAgICAgaWYgY2VydGZpbGUgYW5kIG5vdCBrZXlmaWxlOgogICAgICAgICAgICAga2V5ZmlsZSA9IGNlcnRmaWxlCiAgICAgICAgICMgc2VlIGlmIGl0J3MgY29ubmVjdGVkCkBAIC0zMDQsMTcgKzMxOCwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jZXJ0X3JlcXMsIHNlbGYuc3NsX3ZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNhX2NlcnRzLCBzZWxmLmNpcGhlcnMpCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHNvY2tldC5jb25uZWN0KHNlbGYsIGFkZHIpCi0gICAgICAgICAgICBpZiBzZWxmLmRvX2hhbmRzaGFrZV9vbl9jb25uZWN0OgotICAgICAgICAgICAgICAgIHNlbGYuZG9faGFuZHNoYWtlKCkKLSAgICAgICAgZXhjZXB0IHNvY2tldF9lcnJvciBhcyBlOgogICAgICAgICAgICAgaWYgcmV0dXJuX2Vycm5vOgotICAgICAgICAgICAgICAgIHJldHVybiBlLmVycm5vCisgICAgICAgICAgICAgICAgcmMgPSBzb2NrZXQuY29ubmVjdF9leChzZWxmLCBhZGRyKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLl9zc2xvYmogPSBOb25lCi0gICAgICAgICAgICAgICAgcmFpc2UgZQotICAgICAgICBzZWxmLl9jb25uZWN0ZWQgPSBUcnVlCi0gICAgICAgIHJldHVybiAwCisgICAgICAgICAgICAgICAgcmMgPSBOb25lCisgICAgICAgICAgICAgICAgc29ja2V0LmNvbm5lY3Qoc2VsZiwgYWRkcikKKyAgICAgICAgICAgIGlmIG5vdCByYzoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmRvX2hhbmRzaGFrZV9vbl9jb25uZWN0OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmRvX2hhbmRzaGFrZSgpCisgICAgICAgICAgICAgICAgc2VsZi5fY29ubmVjdGVkID0gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuIHJjCisgICAgICAgIGV4Y2VwdCBzb2NrZXRfZXJyb3I6CisgICAgICAgICAgICBzZWxmLl9zc2xvYmogPSBOb25lCisgICAgICAgICAgICByYWlzZQogCiAgICAgZGVmIGNvbm5lY3Qoc2VsZiwgYWRkcik6CiAgICAgICAgICIiIkNvbm5lY3RzIHRvIHJlbW90ZSBBRERSLCBhbmQgdGhlbiB3cmFwcyB0aGUgY29ubmVjdGlvbiBpbgpAQCAtMzMzLDE3ICszNDksMjEgQEAKICAgICAgICAgU1NMIGNoYW5uZWwsIGFuZCB0aGUgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIGNsaWVudC4iIiIKIAogICAgICAgICBuZXdzb2NrLCBhZGRyID0gc29ja2V0LmFjY2VwdChzZWxmKQotICAgICAgICByZXR1cm4gKFNTTFNvY2tldChuZXdzb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlmaWxlPXNlbGYua2V5ZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydGZpbGU9c2VsZi5jZXJ0ZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX3NpZGU9VHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNlbGYuY2VydF9yZXFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfdmVyc2lvbj1zZWxmLnNzbF92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1zZWxmLmNhX2NlcnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjaXBoZXJzPXNlbGYuY2lwaGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZG9faGFuZHNoYWtlX29uX2Nvbm5lY3Q9c2VsZi5kb19oYW5kc2hha2Vfb25fY29ubmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcHJlc3NfcmFnZ2VkX2VvZnM9c2VsZi5zdXBwcmVzc19yYWdnZWRfZW9mcyksCi0gICAgICAgICAgICAgICAgYWRkcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIChTU0xTb2NrZXQobmV3c29jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleWZpbGU9c2VsZi5rZXlmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydGZpbGU9c2VsZi5jZXJ0ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9zaWRlPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c2VsZi5jZXJ0X3JlcXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfdmVyc2lvbj1zZWxmLnNzbF92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9c2VsZi5jYV9jZXJ0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpcGhlcnM9c2VsZi5jaXBoZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9faGFuZHNoYWtlX29uX2Nvbm5lY3Q9c2VsZi5kb19oYW5kc2hha2Vfb25fY29ubmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHByZXNzX3JhZ2dlZF9lb2ZzPXNlbGYuc3VwcHJlc3NfcmFnZ2VkX2VvZnMpLAorICAgICAgICAgICAgICAgICAgICBhZGRyKQorICAgICAgICBleGNlcHQgc29ja2V0X2Vycm9yIGFzIGU6CisgICAgICAgICAgICBuZXdzb2NrLmNsb3NlKCkKKyAgICAgICAgICAgIHJhaXNlIGUKIAogICAgIGRlZiBtYWtlZmlsZShzZWxmLCBtb2RlPSdyJywgYnVmc2l6ZT0tMSk6CiAKZGlmZiAtLWdpdCBhL0xpYi9zdHJpbmcucHkgYi9MaWIvc3RyaW5nLnB5CmluZGV4IDljMGViZTEuLjk3Mjc4MDMgMTAwNjQ0Ci0tLSBhL0xpYi9zdHJpbmcucHkKKysrIGIvTGliL3N0cmluZy5weQpAQCAtNjAxLDEyICs2MDEsMTIgQEAKIAogICAgIGRlZiBjb252ZXJ0X2ZpZWxkKHNlbGYsIHZhbHVlLCBjb252ZXJzaW9uKToKICAgICAgICAgIyBkbyBhbnkgY29udmVyc2lvbiBvbiB0aGUgcmVzdWx0aW5nIG9iamVjdAotICAgICAgICBpZiBjb252ZXJzaW9uID09ICdyJzoKLSAgICAgICAgICAgIHJldHVybiByZXByKHZhbHVlKQorICAgICAgICBpZiBjb252ZXJzaW9uIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gdmFsdWUKICAgICAgICAgZWxpZiBjb252ZXJzaW9uID09ICdzJzoKICAgICAgICAgICAgIHJldHVybiBzdHIodmFsdWUpCi0gICAgICAgIGVsaWYgY29udmVyc2lvbiBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuIHZhbHVlCisgICAgICAgIGVsaWYgY29udmVyc2lvbiA9PSAncic6CisgICAgICAgICAgICByZXR1cm4gcmVwcih2YWx1ZSkKICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVW5rbm93biBjb252ZXJzaW9uIHNwZWNpZmllciB7MCFzfSIuZm9ybWF0KGNvbnZlcnNpb24pKQogCiAKZGlmZiAtLWdpdCBhL0xpYi9zdWJwcm9jZXNzLnB5IGIvTGliL3N1YnByb2Nlc3MucHkKaW5kZXggZjBlZjMwZS4uZjllOTEwNCAxMDA2NDQKLS0tIGEvTGliL3N1YnByb2Nlc3MucHkKKysrIGIvTGliL3N1YnByb2Nlc3MucHkKQEAgLTIsOCArMiw2IEBACiAjCiAjIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbW9kdWxlLCBzZWUgUEVQIDMyNC4KICMKLSMgVGhpcyBtb2R1bGUgc2hvdWxkIHJlbWFpbiBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMiwgc2VlIFBFUCAyOTEuCi0jCiAjIENvcHlyaWdodCAoYykgMjAwMy0yMDA1IGJ5IFBldGVyIEFzdHJhbmQgPGFzdHJhbmRAbHlzYXRvci5saXUuc2U+CiAjCiAjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KQEAgLTEzLDcgKzExLDcgQEAKIAogVGhpcyBtb2R1bGUgYWxsb3dzIHlvdSB0byBzcGF3biBwcm9jZXNzZXMsIGNvbm5lY3QgdG8gdGhlaXIKIGlucHV0L291dHB1dC9lcnJvciBwaXBlcywgYW5kIG9idGFpbiB0aGVpciByZXR1cm4gY29kZXMuICBUaGlzIG1vZHVsZQotaW50ZW5kcyB0byByZXBsYWNlIHNldmVyYWwgb3RoZXIsIG9sZGVyIG1vZHVsZXMgYW5kIGZ1bmN0aW9ucywgbGlrZToKK2ludGVuZHMgdG8gcmVwbGFjZSBzZXZlcmFsIG9sZGVyIG1vZHVsZXMgYW5kIGZ1bmN0aW9uczoKIAogb3Muc3lzdGVtCiBvcy5zcGF3bioKQEAgLTE0NSw3ICsxNDMsNyBAQAogc3RhcnRlZCB0byBleGVjdXRlLCB3aWxsIGJlIHJlLXJhaXNlZCBpbiB0aGUgcGFyZW50LiAgQWRkaXRpb25hbGx5LAogdGhlIGV4Y2VwdGlvbiBvYmplY3Qgd2lsbCBoYXZlIG9uZSBleHRyYSBhdHRyaWJ1dGUgY2FsbGVkCiAnY2hpbGRfdHJhY2ViYWNrJywgd2hpY2ggaXMgYSBzdHJpbmcgY29udGFpbmluZyB0cmFjZWJhY2sgaW5mb3JtYXRpb24KLWZyb20gdGhlIGNoaWxkcyBwb2ludCBvZiB2aWV3LgorZnJvbSB0aGUgY2hpbGQncyBwb2ludCBvZiB2aWV3LgogCiBUaGUgbW9zdCBjb21tb24gZXhjZXB0aW9uIHJhaXNlZCBpcyBPU0Vycm9yLiAgVGhpcyBvY2N1cnMsIGZvcgogZXhhbXBsZSwgd2hlbiB0cnlpbmcgdG8gZXhlY3V0ZSBhIG5vbi1leGlzdGVudCBmaWxlLiAgQXBwbGljYXRpb25zCkBAIC00ODIsNiArNDgwLDM3IEBACiAgICAgICAgICAgICByYWlzZQogCiAKKyMgWFhYIFRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIGJ5IG11bHRpcHJvY2Vzc2luZyBhbmQgdGhlIHRlc3Qgc3VpdGUsCisjIGJ1dCBpdCdzIGhlcmUgc28gdGhhdCBpdCBjYW4gYmUgaW1wb3J0ZWQgd2hlbiBQeXRob24gaXMgY29tcGlsZWQgd2l0aG91dAorIyB0aHJlYWRzLgorCitkZWYgX2FyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpOgorICAgICIiIlJldHVybiBhIGxpc3Qgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cyByZXByb2R1Y2luZyB0aGUgY3VycmVudAorICAgIHNldHRpbmdzIGluIHN5cy5mbGFncyBhbmQgc3lzLndhcm5vcHRpb25zLiIiIgorICAgIGZsYWdfb3B0X21hcCA9IHsKKyAgICAgICAgJ2RlYnVnJzogJ2QnLAorICAgICAgICAjICdpbnNwZWN0JzogJ2knLAorICAgICAgICAjICdpbnRlcmFjdGl2ZSc6ICdpJywKKyAgICAgICAgJ29wdGltaXplJzogJ08nLAorICAgICAgICAnZG9udF93cml0ZV9ieXRlY29kZSc6ICdCJywKKyAgICAgICAgJ25vX3VzZXJfc2l0ZSc6ICdzJywKKyAgICAgICAgJ25vX3NpdGUnOiAnUycsCisgICAgICAgICdpZ25vcmVfZW52aXJvbm1lbnQnOiAnRScsCisgICAgICAgICd2ZXJib3NlJzogJ3YnLAorICAgICAgICAnYnl0ZXNfd2FybmluZyc6ICdiJywKKyAgICAgICAgJ2hhc2hfcmFuZG9taXphdGlvbic6ICdSJywKKyAgICAgICAgJ3B5M2tfd2FybmluZyc6ICczJywKKyAgICB9CisgICAgYXJncyA9IFtdCisgICAgZm9yIGZsYWcsIG9wdCBpbiBmbGFnX29wdF9tYXAuaXRlbXMoKToKKyAgICAgICAgdiA9IGdldGF0dHIoc3lzLmZsYWdzLCBmbGFnKQorICAgICAgICBpZiB2ID4gMDoKKyAgICAgICAgICAgIGFyZ3MuYXBwZW5kKCctJyArIG9wdCAqIHYpCisgICAgZm9yIG9wdCBpbiBzeXMud2Fybm9wdGlvbnM6CisgICAgICAgIGFyZ3MuYXBwZW5kKCctVycgKyBvcHQpCisgICAgcmV0dXJuIGFyZ3MKKworCiBkZWYgY2FsbCgqcG9wZW5hcmdzLCAqKmt3YXJncyk6CiAgICAgIiIiUnVuIGNvbW1hbmQgd2l0aCBhcmd1bWVudHMuICBXYWl0IGZvciBjb21tYW5kIHRvIGNvbXBsZXRlLCB0aGVuCiAgICAgcmV0dXJuIHRoZSByZXR1cm5jb2RlIGF0dHJpYnV0ZS4KQEAgLTYxNiw2ICs2NDUsOCBAQAogCiAKIGNsYXNzIFBvcGVuKG9iamVjdCk6CisgICAgX2NoaWxkX2NyZWF0ZWQgPSBGYWxzZSAgIyBTZXQgaGVyZSBzaW5jZSBfX2RlbF9fIGNoZWNrcyBpdAorCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyZ3MsIGJ1ZnNpemU9MCwgZXhlY3V0YWJsZT1Ob25lLAogICAgICAgICAgICAgICAgICBzdGRpbj1Ob25lLCBzdGRvdXQ9Tm9uZSwgc3RkZXJyPU5vbmUsCiAgICAgICAgICAgICAgICAgIHByZWV4ZWNfZm49Tm9uZSwgY2xvc2VfZmRzPUZhbHNlLCBzaGVsbD1GYWxzZSwKQEAgLTYyNCw3ICs2NTUsNiBAQAogICAgICAgICAiIiJDcmVhdGUgbmV3IFBvcGVuIGluc3RhbmNlLiIiIgogICAgICAgICBfY2xlYW51cCgpCiAKLSAgICAgICAgc2VsZi5fY2hpbGRfY3JlYXRlZCA9IEZhbHNlCiAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGJ1ZnNpemUsIChpbnQsIGxvbmcpKToKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiYnVmc2l6ZSBtdXN0IGJlIGFuIGludGVnZXIiKQogCkBAIC02NjksMTQgKzY5OSwyOSBAQAogCiAgICAgICAgIChwMmNyZWFkLCBwMmN3cml0ZSwKICAgICAgICAgIGMycHJlYWQsIGMycHdyaXRlLAotICAgICAgICAgZXJycmVhZCwgZXJyd3JpdGUpID0gc2VsZi5fZ2V0X2hhbmRsZXMoc3RkaW4sIHN0ZG91dCwgc3RkZXJyKQorICAgICAgICAgZXJycmVhZCwgZXJyd3JpdGUpLCB0b19jbG9zZSA9IHNlbGYuX2dldF9oYW5kbGVzKHN0ZGluLCBzdGRvdXQsIHN0ZGVycikKIAotICAgICAgICBzZWxmLl9leGVjdXRlX2NoaWxkKGFyZ3MsIGV4ZWN1dGFibGUsIHByZWV4ZWNfZm4sIGNsb3NlX2ZkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2QsIGVudiwgdW5pdmVyc2FsX25ld2xpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0dXBpbmZvLCBjcmVhdGlvbmZsYWdzLCBzaGVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwMmNyZWFkLCBwMmN3cml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMnByZWFkLCBjMnB3cml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJyZWFkLCBlcnJ3cml0ZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fZXhlY3V0ZV9jaGlsZChhcmdzLCBleGVjdXRhYmxlLCBwcmVleGVjX2ZuLCBjbG9zZV9mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3ZCwgZW52LCB1bml2ZXJzYWxfbmV3bGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0dXBpbmZvLCBjcmVhdGlvbmZsYWdzLCBzaGVsbCwgdG9fY2xvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAyY3JlYWQsIHAyY3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMnByZWFkLCBjMnB3cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJycmVhZCwgZXJyd3JpdGUpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAjIFByZXNlcnZlIG9yaWdpbmFsIGV4Y2VwdGlvbiBpbiBjYXNlIG9zLmNsb3NlIHJhaXNlcy4KKyAgICAgICAgICAgIGV4Y190eXBlLCBleGNfdmFsdWUsIGV4Y190cmFjZSA9IHN5cy5leGNfaW5mbygpCisKKyAgICAgICAgICAgIGZvciBmZCBpbiB0b19jbG9zZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGlmIG1zd2luZG93czoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkLkNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zLmNsb3NlKGZkKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIHJhaXNlIGV4Y190eXBlLCBleGNfdmFsdWUsIGV4Y190cmFjZQogCiAgICAgICAgIGlmIG1zd2luZG93czoKICAgICAgICAgICAgIGlmIHAyY3dyaXRlIGlzIG5vdCBOb25lOgpAQCAtNzA2LDExICs3NTEsMTEgQEAKICAgICAgICAgcmV0dXJuIGRhdGEKIAogCi0gICAgZGVmIF9fZGVsX18oc2VsZiwgX21heGludD1zeXMubWF4aW50LCBfYWN0aXZlPV9hY3RpdmUpOgorICAgIGRlZiBfX2RlbF9fKHNlbGYsIF9tYXhpbnQ9c3lzLm1heGludCk6CiAgICAgICAgICMgSWYgX19pbml0X18gaGFzbid0IGhhZCBhIGNoYW5jZSB0byBleGVjdXRlIChlLmcuIGlmIGl0CiAgICAgICAgICMgd2FzIHBhc3NlZCBhbiB1bmRlY2xhcmVkIGtleXdvcmQgYXJndW1lbnQpLCB3ZSBkb24ndAogICAgICAgICAjIGhhdmUgYSBfY2hpbGRfY3JlYXRlZCBhdHRyaWJ1dGUgYXQgYWxsLgotICAgICAgICBpZiBub3QgZ2V0YXR0cihzZWxmLCAnX2NoaWxkX2NyZWF0ZWQnLCBGYWxzZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLl9jaGlsZF9jcmVhdGVkOgogICAgICAgICAgICAgIyBXZSBkaWRuJ3QgZ2V0IHRvIHN1Y2Nlc3NmdWxseSBjcmVhdGUgYSBjaGlsZCBwcm9jZXNzLgogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICMgSW4gY2FzZSB0aGUgY2hpbGQgaGFzbid0IGJlZW4gd2FpdGVkIG9uLCBjaGVjayBpZiBpdCdzIGRvbmUuCkBAIC03NjYsOCArODExLDkgQEAKICAgICAgICAgICAgICIiIkNvbnN0cnVjdCBhbmQgcmV0dXJuIHR1cGxlIHdpdGggSU8gb2JqZWN0czoKICAgICAgICAgICAgIHAyY3JlYWQsIHAyY3dyaXRlLCBjMnByZWFkLCBjMnB3cml0ZSwgZXJycmVhZCwgZXJyd3JpdGUKICAgICAgICAgICAgICIiIgorICAgICAgICAgICAgdG9fY2xvc2UgPSBzZXQoKQogICAgICAgICAgICAgaWYgc3RkaW4gaXMgTm9uZSBhbmQgc3Rkb3V0IGlzIE5vbmUgYW5kIHN0ZGVyciBpcyBOb25lOgotICAgICAgICAgICAgICAgIHJldHVybiAoTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpLCB0b19jbG9zZQogCiAgICAgICAgICAgICBwMmNyZWFkLCBwMmN3cml0ZSA9IE5vbmUsIE5vbmUKICAgICAgICAgICAgIGMycHJlYWQsIGMycHdyaXRlID0gTm9uZSwgTm9uZQpAQCAtNzg1LDYgKzgzMSwxMCBAQAogICAgICAgICAgICAgICAgICMgQXNzdW1pbmcgZmlsZS1saWtlIG9iamVjdAogICAgICAgICAgICAgICAgIHAyY3JlYWQgPSBtc3ZjcnQuZ2V0X29zZmhhbmRsZShzdGRpbi5maWxlbm8oKSkKICAgICAgICAgICAgIHAyY3JlYWQgPSBzZWxmLl9tYWtlX2luaGVyaXRhYmxlKHAyY3JlYWQpCisgICAgICAgICAgICAjIFdlIGp1c3QgZHVwbGljYXRlZCB0aGUgaGFuZGxlLCBpdCBoYXMgdG8gYmUgY2xvc2VkIGF0IHRoZSBlbmQKKyAgICAgICAgICAgIHRvX2Nsb3NlLmFkZChwMmNyZWFkKQorICAgICAgICAgICAgaWYgc3RkaW4gPT0gUElQRToKKyAgICAgICAgICAgICAgICB0b19jbG9zZS5hZGQocDJjd3JpdGUpCiAKICAgICAgICAgICAgIGlmIHN0ZG91dCBpcyBOb25lOgogICAgICAgICAgICAgICAgIGMycHdyaXRlID0gX3N1YnByb2Nlc3MuR2V0U3RkSGFuZGxlKF9zdWJwcm9jZXNzLlNURF9PVVRQVVRfSEFORExFKQpAQCAtNzk4LDYgKzg0OCwxMCBAQAogICAgICAgICAgICAgICAgICMgQXNzdW1pbmcgZmlsZS1saWtlIG9iamVjdAogICAgICAgICAgICAgICAgIGMycHdyaXRlID0gbXN2Y3J0LmdldF9vc2ZoYW5kbGUoc3Rkb3V0LmZpbGVubygpKQogICAgICAgICAgICAgYzJwd3JpdGUgPSBzZWxmLl9tYWtlX2luaGVyaXRhYmxlKGMycHdyaXRlKQorICAgICAgICAgICAgIyBXZSBqdXN0IGR1cGxpY2F0ZWQgdGhlIGhhbmRsZSwgaXQgaGFzIHRvIGJlIGNsb3NlZCBhdCB0aGUgZW5kCisgICAgICAgICAgICB0b19jbG9zZS5hZGQoYzJwd3JpdGUpCisgICAgICAgICAgICBpZiBzdGRvdXQgPT0gUElQRToKKyAgICAgICAgICAgICAgICB0b19jbG9zZS5hZGQoYzJwcmVhZCkKIAogICAgICAgICAgICAgaWYgc3RkZXJyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgZXJyd3JpdGUgPSBfc3VicHJvY2Vzcy5HZXRTdGRIYW5kbGUoX3N1YnByb2Nlc3MuU1REX0VSUk9SX0hBTkRMRSkKQEAgLTgxMywxMCArODY3LDE0IEBACiAgICAgICAgICAgICAgICAgIyBBc3N1bWluZyBmaWxlLWxpa2Ugb2JqZWN0CiAgICAgICAgICAgICAgICAgZXJyd3JpdGUgPSBtc3ZjcnQuZ2V0X29zZmhhbmRsZShzdGRlcnIuZmlsZW5vKCkpCiAgICAgICAgICAgICBlcnJ3cml0ZSA9IHNlbGYuX21ha2VfaW5oZXJpdGFibGUoZXJyd3JpdGUpCisgICAgICAgICAgICAjIFdlIGp1c3QgZHVwbGljYXRlZCB0aGUgaGFuZGxlLCBpdCBoYXMgdG8gYmUgY2xvc2VkIGF0IHRoZSBlbmQKKyAgICAgICAgICAgIHRvX2Nsb3NlLmFkZChlcnJ3cml0ZSkKKyAgICAgICAgICAgIGlmIHN0ZGVyciA9PSBQSVBFOgorICAgICAgICAgICAgICAgIHRvX2Nsb3NlLmFkZChlcnJyZWFkKQogCiAgICAgICAgICAgICByZXR1cm4gKHAyY3JlYWQsIHAyY3dyaXRlLAogICAgICAgICAgICAgICAgICAgICBjMnByZWFkLCBjMnB3cml0ZSwKLSAgICAgICAgICAgICAgICAgICAgZXJycmVhZCwgZXJyd3JpdGUpCisgICAgICAgICAgICAgICAgICAgIGVycnJlYWQsIGVycndyaXRlKSwgdG9fY2xvc2UKIAogCiAgICAgICAgIGRlZiBfbWFrZV9pbmhlcml0YWJsZShzZWxmLCBoYW5kbGUpOgpAQCAtODQ1LDcgKzkwMyw3IEBACiAKICAgICAgICAgZGVmIF9leGVjdXRlX2NoaWxkKHNlbGYsIGFyZ3MsIGV4ZWN1dGFibGUsIHByZWV4ZWNfZm4sIGNsb3NlX2ZkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3ZCwgZW52LCB1bml2ZXJzYWxfbmV3bGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydHVwaW5mbywgY3JlYXRpb25mbGFncywgc2hlbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydHVwaW5mbywgY3JlYXRpb25mbGFncywgc2hlbGwsIHRvX2Nsb3NlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcDJjcmVhZCwgcDJjd3JpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMnByZWFkLCBjMnB3cml0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycnJlYWQsIGVycndyaXRlKToKQEAgLTg4NCw2ICs5NDIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgIyBraWxsIGNoaWxkcmVuLgogICAgICAgICAgICAgICAgICAgICBjcmVhdGlvbmZsYWdzIHw9IF9zdWJwcm9jZXNzLkNSRUFURV9ORVdfQ09OU09MRQogCisgICAgICAgICAgICBkZWYgX2Nsb3NlX2luX3BhcmVudChmZCk6CisgICAgICAgICAgICAgICAgZmQuQ2xvc2UoKQorICAgICAgICAgICAgICAgIHRvX2Nsb3NlLnJlbW92ZShmZCkKKwogICAgICAgICAgICAgIyBTdGFydCB0aGUgcHJvY2VzcwogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIGhwLCBodCwgcGlkLCB0aWQgPSBfc3VicHJvY2Vzcy5DcmVhdGVQcm9jZXNzKGV4ZWN1dGFibGUsIGFyZ3MsCkBAIC05MDgsMTEgKzk3MCwxMSBAQAogICAgICAgICAgICAgICAgICMgcGlwZSB3aWxsIG5vdCBjbG9zZSB3aGVuIHRoZSBjaGlsZCBwcm9jZXNzIGV4aXRzIGFuZCB0aGUKICAgICAgICAgICAgICAgICAjIFJlYWRGaWxlIHdpbGwgaGFuZy4KICAgICAgICAgICAgICAgICBpZiBwMmNyZWFkIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgICAgICBwMmNyZWFkLkNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgX2Nsb3NlX2luX3BhcmVudChwMmNyZWFkKQogICAgICAgICAgICAgICAgIGlmIGMycHdyaXRlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgICAgICBjMnB3cml0ZS5DbG9zZSgpCisgICAgICAgICAgICAgICAgICAgIF9jbG9zZV9pbl9wYXJlbnQoYzJwd3JpdGUpCiAgICAgICAgICAgICAgICAgaWYgZXJyd3JpdGUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgIGVycndyaXRlLkNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgX2Nsb3NlX2luX3BhcmVudChlcnJ3cml0ZSkKIAogICAgICAgICAgICAgIyBSZXRhaW4gdGhlIHByb2Nlc3MgaGFuZGxlLCBidXQgY2xvc2UgdGhlIHRocmVhZCBoYW5kbGUKICAgICAgICAgICAgIHNlbGYuX2NoaWxkX2NyZWF0ZWQgPSBUcnVlCkBAIC05NzMsNyArMTAzNSwxNSBAQAogICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0ZGluLndyaXRlKGlucHV0KQogICAgICAgICAgICAgICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FUElQRToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRVBJUEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb21tdW5pY2F0ZSgpIHNob3VsZCBpZ25vcmUgYnJva2VuIHBpcGUgZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIChlLmVycm5vID09IGVycm5vLkVJTlZBTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHNlbGYucG9sbCgpIGlzIG5vdCBOb25lKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIElzc3VlICMxOTYxMjogc3RkaW4ud3JpdGUoKSBmYWlscyB3aXRoIEVJTlZBTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgdGhlIHByb2Nlc3MgYWxyZWFkeSBleGl0ZWQgYmVmb3JlIHRoZSB3cml0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgICAgICBzZWxmLnN0ZGluLmNsb3NlKCkKIApAQCAtMTAxNiw3ICsxMDg2LDE3IEBACiAgICAgICAgIGRlZiB0ZXJtaW5hdGUoc2VsZik6CiAgICAgICAgICAgICAiIiJUZXJtaW5hdGVzIHRoZSBwcm9jZXNzCiAgICAgICAgICAgICAiIiIKLSAgICAgICAgICAgIF9zdWJwcm9jZXNzLlRlcm1pbmF0ZVByb2Nlc3Moc2VsZi5faGFuZGxlLCAxKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIF9zdWJwcm9jZXNzLlRlcm1pbmF0ZVByb2Nlc3Moc2VsZi5faGFuZGxlLCAxKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICAjIEVSUk9SX0FDQ0VTU19ERU5JRUQgKHdpbmVycm9yIDUpIGlzIHJlY2VpdmVkIHdoZW4gdGhlCisgICAgICAgICAgICAgICAgIyBwcm9jZXNzIGFscmVhZHkgZGllZC4KKyAgICAgICAgICAgICAgICBpZiBlLndpbmVycm9yICE9IDU6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgcmMgPSBfc3VicHJvY2Vzcy5HZXRFeGl0Q29kZVByb2Nlc3Moc2VsZi5faGFuZGxlKQorICAgICAgICAgICAgICAgIGlmIHJjID09IF9zdWJwcm9jZXNzLlNUSUxMX0FDVElWRToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICBzZWxmLnJldHVybmNvZGUgPSByYwogCiAgICAgICAgIGtpbGwgPSB0ZXJtaW5hdGUKIApAQCAtMTAyOCw2ICsxMTA4LDcgQEAKICAgICAgICAgICAgICIiIkNvbnN0cnVjdCBhbmQgcmV0dXJuIHR1cGxlIHdpdGggSU8gb2JqZWN0czoKICAgICAgICAgICAgIHAyY3JlYWQsIHAyY3dyaXRlLCBjMnByZWFkLCBjMnB3cml0ZSwgZXJycmVhZCwgZXJyd3JpdGUKICAgICAgICAgICAgICIiIgorICAgICAgICAgICAgdG9fY2xvc2UgPSBzZXQoKQogICAgICAgICAgICAgcDJjcmVhZCwgcDJjd3JpdGUgPSBOb25lLCBOb25lCiAgICAgICAgICAgICBjMnByZWFkLCBjMnB3cml0ZSA9IE5vbmUsIE5vbmUKICAgICAgICAgICAgIGVycnJlYWQsIGVycndyaXRlID0gTm9uZSwgTm9uZQpAQCAtMTAzNiw2ICsxMTE3LDcgQEAKICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICBlbGlmIHN0ZGluID09IFBJUEU6CiAgICAgICAgICAgICAgICAgcDJjcmVhZCwgcDJjd3JpdGUgPSBzZWxmLnBpcGVfY2xvZXhlYygpCisgICAgICAgICAgICAgICAgdG9fY2xvc2UudXBkYXRlKChwMmNyZWFkLCBwMmN3cml0ZSkpCiAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uoc3RkaW4sIGludCk6CiAgICAgICAgICAgICAgICAgcDJjcmVhZCA9IHN0ZGluCiAgICAgICAgICAgICBlbHNlOgpAQCAtMTA0Niw2ICsxMTI4LDcgQEAKICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICBlbGlmIHN0ZG91dCA9PSBQSVBFOgogICAgICAgICAgICAgICAgIGMycHJlYWQsIGMycHdyaXRlID0gc2VsZi5waXBlX2Nsb2V4ZWMoKQorICAgICAgICAgICAgICAgIHRvX2Nsb3NlLnVwZGF0ZSgoYzJwcmVhZCwgYzJwd3JpdGUpKQogICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHN0ZG91dCwgaW50KToKICAgICAgICAgICAgICAgICBjMnB3cml0ZSA9IHN0ZG91dAogICAgICAgICAgICAgZWxzZToKQEAgLTEwNTYsNiArMTEzOSw3IEBACiAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgZWxpZiBzdGRlcnIgPT0gUElQRToKICAgICAgICAgICAgICAgICBlcnJyZWFkLCBlcnJ3cml0ZSA9IHNlbGYucGlwZV9jbG9leGVjKCkKKyAgICAgICAgICAgICAgICB0b19jbG9zZS51cGRhdGUoKGVycnJlYWQsIGVycndyaXRlKSkKICAgICAgICAgICAgIGVsaWYgc3RkZXJyID09IFNURE9VVDoKICAgICAgICAgICAgICAgICBlcnJ3cml0ZSA9IGMycHdyaXRlCiAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uoc3RkZXJyLCBpbnQpOgpAQCAtMTA2Niw3ICsxMTUwLDcgQEAKIAogICAgICAgICAgICAgcmV0dXJuIChwMmNyZWFkLCBwMmN3cml0ZSwKICAgICAgICAgICAgICAgICAgICAgYzJwcmVhZCwgYzJwd3JpdGUsCi0gICAgICAgICAgICAgICAgICAgIGVycnJlYWQsIGVycndyaXRlKQorICAgICAgICAgICAgICAgICAgICBlcnJyZWFkLCBlcnJ3cml0ZSksIHRvX2Nsb3NlCiAKIAogICAgICAgICBkZWYgX3NldF9jbG9leGVjX2ZsYWcoc2VsZiwgZmQsIGNsb2V4ZWM9VHJ1ZSk6CkBAIC0xMTEwLDcgKzExOTQsNyBAQAogCiAgICAgICAgIGRlZiBfZXhlY3V0ZV9jaGlsZChzZWxmLCBhcmdzLCBleGVjdXRhYmxlLCBwcmVleGVjX2ZuLCBjbG9zZV9mZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2QsIGVudiwgdW5pdmVyc2FsX25ld2xpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnR1cGluZm8sIGNyZWF0aW9uZmxhZ3MsIHNoZWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnR1cGluZm8sIGNyZWF0aW9uZmxhZ3MsIHNoZWxsLCB0b19jbG9zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAyY3JlYWQsIHAyY3dyaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYzJwcmVhZCwgYzJwd3JpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJyZWFkLCBlcnJ3cml0ZSk6CkBAIC0xMTI5LDYgKzEyMTMsMTAgQEAKICAgICAgICAgICAgIGlmIGV4ZWN1dGFibGUgaXMgTm9uZToKICAgICAgICAgICAgICAgICBleGVjdXRhYmxlID0gYXJnc1swXQogCisgICAgICAgICAgICBkZWYgX2Nsb3NlX2luX3BhcmVudChmZCk6CisgICAgICAgICAgICAgICAgb3MuY2xvc2UoZmQpCisgICAgICAgICAgICAgICAgdG9fY2xvc2UucmVtb3ZlKGZkKQorCiAgICAgICAgICAgICAjIEZvciB0cmFuc2ZlcnJpbmcgcG9zc2libGUgZXhlYyBmYWlsdXJlIGZyb20gY2hpbGQgdG8gcGFyZW50CiAgICAgICAgICAgICAjIFRoZSBmaXJzdCBjaGFyIHNwZWNpZmllcyB0aGUgZXhjZXB0aW9uIHR5cGU6IDAgbWVhbnMKICAgICAgICAgICAgICMgT1NFcnJvciwgMSBtZWFucyBzb21lIG90aGVyIGVycm9yLgpAQCAtMTE4NywxNiArMTI3NSwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoZmQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZWQuYWRkKGZkKQogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDbG9zZSBhbGwgb3RoZXIgZmRzLCBpZiBhc2tlZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBjbG9zZV9mZHM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Nsb3NlX2ZkcyhidXQ9ZXJycGlwZV93cml0ZSkKLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGN3ZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2hkaXIoY3dkKQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcHJlZXhlY19mbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZXhlY19mbigpCiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENsb3NlIGFsbCBvdGhlciBmZHMsIGlmIGFza2VkIGZvciAtIGFmdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmVleGVjX2ZuKCksIHdoaWNoIG1heSBvcGVuIEZEcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBjbG9zZV9mZHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Nsb3NlX2ZkcyhidXQ9ZXJycGlwZV93cml0ZSkKKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVudiBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5leGVjdnAoZXhlY3V0YWJsZSwgYXJncykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgpAQCAtMTIyMiwxNyArMTMxMSwxNyBAQAogICAgICAgICAgICAgICAgICAgICAjIGJlIHN1cmUgdGhlIEZEIGlzIGNsb3NlZCBubyBtYXR0ZXIgd2hhdAogICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZShlcnJwaXBlX3dyaXRlKQogCi0gICAgICAgICAgICAgICAgaWYgcDJjcmVhZCBpcyBub3QgTm9uZSBhbmQgcDJjd3JpdGUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgIG9zLmNsb3NlKHAyY3JlYWQpCi0gICAgICAgICAgICAgICAgaWYgYzJwd3JpdGUgaXMgbm90IE5vbmUgYW5kIGMycHJlYWQgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgIG9zLmNsb3NlKGMycHdyaXRlKQotICAgICAgICAgICAgICAgIGlmIGVycndyaXRlIGlzIG5vdCBOb25lIGFuZCBlcnJyZWFkIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZShlcnJ3cml0ZSkKLQogICAgICAgICAgICAgICAgICMgV2FpdCBmb3IgZXhlYyB0byBmYWlsIG9yIHN1Y2NlZWQ7IHBvc3NpYmx5IHJhaXNpbmcgZXhjZXB0aW9uCiAgICAgICAgICAgICAgICAgIyBFeGNlcHRpb24gbGltaXRlZCB0byAxTQogICAgICAgICAgICAgICAgIGRhdGEgPSBfZWludHJfcmV0cnlfY2FsbChvcy5yZWFkLCBlcnJwaXBlX3JlYWQsIDEwNDg1NzYpCiAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGlmIHAyY3JlYWQgaXMgbm90IE5vbmUgYW5kIHAyY3dyaXRlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBfY2xvc2VfaW5fcGFyZW50KHAyY3JlYWQpCisgICAgICAgICAgICAgICAgaWYgYzJwd3JpdGUgaXMgbm90IE5vbmUgYW5kIGMycHJlYWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIF9jbG9zZV9pbl9wYXJlbnQoYzJwd3JpdGUpCisgICAgICAgICAgICAgICAgaWYgZXJyd3JpdGUgaXMgbm90IE5vbmUgYW5kIGVycnJlYWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIF9jbG9zZV9pbl9wYXJlbnQoZXJyd3JpdGUpCisKICAgICAgICAgICAgICAgICAjIGJlIHN1cmUgdGhlIEZEIGlzIGNsb3NlZCBubyBtYXR0ZXIgd2hhdAogICAgICAgICAgICAgICAgIG9zLmNsb3NlKGVycnBpcGVfcmVhZCkKIApAQCAtMTI0Myw5ICsxMzMyLDYgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FQ0hJTEQ6CiAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgIGNoaWxkX2V4Y2VwdGlvbiA9IHBpY2tsZS5sb2FkcyhkYXRhKQotICAgICAgICAgICAgICAgIGZvciBmZCBpbiAocDJjd3JpdGUsIGMycHJlYWQsIGVycnJlYWQpOgotICAgICAgICAgICAgICAgICAgICBpZiBmZCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgICAgIG9zLmNsb3NlKGZkKQogICAgICAgICAgICAgICAgIHJhaXNlIGNoaWxkX2V4Y2VwdGlvbgogCiAKQEAgLTEyNTMsNyArMTMzOSw3IEBACiAgICAgICAgICAgICAgICAgX1dURVJNU0lHPW9zLldURVJNU0lHLCBfV0lGRVhJVEVEPW9zLldJRkVYSVRFRCwKICAgICAgICAgICAgICAgICBfV0VYSVRTVEFUVVM9b3MuV0VYSVRTVEFUVVMpOgogICAgICAgICAgICAgIyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgKGluZGlyZWN0bHkpIGJ5IF9fZGVsX18sIHNvIGl0IGNhbm5vdAotICAgICAgICAgICAgIyByZWZlciB0byBhbnl0aGluZyBvdXRzaWRlIG9mIGl0cyBsb2NhbCBzY29wZS4iIiIKKyAgICAgICAgICAgICMgcmVmZXIgdG8gYW55dGhpbmcgb3V0c2lkZSBvZiBpdHMgbG9jYWwgc2NvcGUuCiAgICAgICAgICAgICBpZiBfV0lGU0lHTkFMRUQoc3RzKToKICAgICAgICAgICAgICAgICBzZWxmLnJldHVybmNvZGUgPSAtX1dURVJNU0lHKHN0cykKICAgICAgICAgICAgIGVsaWYgX1dJRkVYSVRFRChzdHMpOgpAQCAtMTI2NCw3ICsxMzUwLDcgQEAKIAogCiAgICAgICAgIGRlZiBfaW50ZXJuYWxfcG9sbChzZWxmLCBfZGVhZHN0YXRlPU5vbmUsIF93YWl0cGlkPW9zLndhaXRwaWQsCi0gICAgICAgICAgICAgICAgX1dOT0hBTkc9b3MuV05PSEFORywgX29zX2Vycm9yPW9zLmVycm9yKToKKyAgICAgICAgICAgICAgICBfV05PSEFORz1vcy5XTk9IQU5HLCBfb3NfZXJyb3I9b3MuZXJyb3IsIF9FQ0hJTEQ9ZXJybm8uRUNISUxEKToKICAgICAgICAgICAgICIiIkNoZWNrIGlmIGNoaWxkIHByb2Nlc3MgaGFzIHRlcm1pbmF0ZWQuICBSZXR1cm5zIHJldHVybmNvZGUKICAgICAgICAgICAgIGF0dHJpYnV0ZS4KIApAQCAtMTI3NywxNiArMTM2MywyMyBAQAogICAgICAgICAgICAgICAgICAgICBwaWQsIHN0cyA9IF93YWl0cGlkKHNlbGYucGlkLCBfV05PSEFORykKICAgICAgICAgICAgICAgICAgICAgaWYgcGlkID09IHNlbGYucGlkOgogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faGFuZGxlX2V4aXRzdGF0dXMoc3RzKQotICAgICAgICAgICAgICAgIGV4Y2VwdCBfb3NfZXJyb3I6CisgICAgICAgICAgICAgICAgZXhjZXB0IF9vc19lcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgICBpZiBfZGVhZHN0YXRlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gX2RlYWRzdGF0ZQorICAgICAgICAgICAgICAgICAgICBpZiBlLmVycm5vID09IF9FQ0hJTEQ6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFRoaXMgaGFwcGVucyBpZiBTSUdDTEQgaXMgc2V0IHRvIGJlIGlnbm9yZWQgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICMgd2FpdGluZyBmb3IgY2hpbGQgcHJvY2Vzc2VzIGhhcyBvdGhlcndpc2UgYmVlbgorICAgICAgICAgICAgICAgICAgICAgICAgIyBkaXNhYmxlZCBmb3Igb3VyIHByb2Nlc3MuICBUaGlzIGNoaWxkIGlzIGRlYWQsIHdlCisgICAgICAgICAgICAgICAgICAgICAgICAjIGNhbid0IGdldCB0aGUgc3RhdHVzLgorICAgICAgICAgICAgICAgICAgICAgICAgIyBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTU3NTYKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmV0dXJuY29kZSA9IDAKICAgICAgICAgICAgIHJldHVybiBzZWxmLnJldHVybmNvZGUKIAogCiAgICAgICAgIGRlZiB3YWl0KHNlbGYpOgogICAgICAgICAgICAgIiIiV2FpdCBmb3IgY2hpbGQgcHJvY2VzcyB0byB0ZXJtaW5hdGUuICBSZXR1cm5zIHJldHVybmNvZGUKICAgICAgICAgICAgIGF0dHJpYnV0ZS4iIiIKLSAgICAgICAgICAgIGlmIHNlbGYucmV0dXJuY29kZSBpcyBOb25lOgorICAgICAgICAgICAgd2hpbGUgc2VsZi5yZXR1cm5jb2RlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICBwaWQsIHN0cyA9IF9laW50cl9yZXRyeV9jYWxsKG9zLndhaXRwaWQsIHNlbGYucGlkLCAwKQogICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CkBAIC0xMjk1LDggKzEzODgsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGhhcHBlbnMgaWYgU0lHQ0xEIGlzIHNldCB0byBiZSBpZ25vcmVkIG9yIHdhaXRpbmcKICAgICAgICAgICAgICAgICAgICAgIyBmb3IgY2hpbGQgcHJvY2Vzc2VzIGhhcyBvdGhlcndpc2UgYmVlbiBkaXNhYmxlZCBmb3Igb3VyCiAgICAgICAgICAgICAgICAgICAgICMgcHJvY2Vzcy4gIFRoaXMgY2hpbGQgaXMgZGVhZCwgd2UgY2FuJ3QgZ2V0IHRoZSBzdGF0dXMuCisgICAgICAgICAgICAgICAgICAgIHBpZCA9IHNlbGYucGlkCiAgICAgICAgICAgICAgICAgICAgIHN0cyA9IDAKLSAgICAgICAgICAgICAgICBzZWxmLl9oYW5kbGVfZXhpdHN0YXR1cyhzdHMpCisgICAgICAgICAgICAgICAgIyBDaGVjayB0aGUgcGlkIGFuZCBsb29wIGFzIHdhaXRwaWQgaGFzIGJlZW4ga25vd24gdG8gcmV0dXJuCisgICAgICAgICAgICAgICAgIyAwIGV2ZW4gd2l0aG91dCBXTk9IQU5HIGluIG9kZCBzaXR1YXRpb25zLiAgaXNzdWUxNDM5Ni4KKyAgICAgICAgICAgICAgICBpZiBwaWQgPT0gc2VsZi5waWQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2hhbmRsZV9leGl0c3RhdHVzKHN0cykKICAgICAgICAgICAgIHJldHVybiBzZWxmLnJldHVybmNvZGUKIAogCmRpZmYgLS1naXQgYS9MaWIvc3VuYXUucHkgYi9MaWIvc3VuYXUucHkKaW5kZXggYTA0ZDhjMC4uYjUzMDQ0ZCAxMDA2NDQKLS0tIGEvTGliL3N1bmF1LnB5CisrKyBiL0xpYi9zdW5hdS5weQpAQCAtMjAzLDYgKzIwMywxMCBAQAogICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5faW5mbyA9ICcnCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2RhdGFfcG9zID0gZmlsZS50ZWxsKCkKKyAgICAgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgSU9FcnJvcik6CisgICAgICAgICAgICBzZWxmLl9kYXRhX3BvcyA9IE5vbmUKIAogICAgIGRlZiBnZXRmcChzZWxmKToKICAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGUKQEAgLTIyMCw3ICsyMjQsNyBAQAogICAgICAgICBpZiBzZWxmLl9kYXRhX3NpemUgPT0gQVVESU9fVU5LTk9XTl9TSVpFOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VOS05PV05fU0laRQogICAgICAgICBpZiBzZWxmLl9lbmNvZGluZyBpbiBfc2ltcGxlX2VuY29kaW5nczoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl9kYXRhX3NpemUgLyBzZWxmLl9mcmFtZXNpemUKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9kYXRhX3NpemUgLy8gc2VsZi5fZnJhbWVzaXplCiAgICAgICAgIHJldHVybiAwICAgICAgICAgICAgICAgICMgWFhYLS1tdXN0IGRvIHNvbWUgYXJpdGhtZXRpYyBoZXJlCiAKICAgICBkZWYgZ2V0Y29tcHR5cGUoc2VsZik6CkBAIC0yNTUsNyArMjU5LDggQEAKICAgICAgICAgICAgIGlmIG5mcmFtZXMgPT0gQVVESU9fVU5LTk9XTl9TSVpFOgogICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9maWxlLnJlYWQoKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5fZmlsZS5yZWFkKG5mcmFtZXMgKiBzZWxmLl9mcmFtZXNpemUgKiBzZWxmLl9uY2hhbm5lbHMpCisgICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2ZpbGUucmVhZChuZnJhbWVzICogc2VsZi5fZnJhbWVzaXplKQorICAgICAgICAgICAgc2VsZi5fc291bmRwb3MgKz0gbGVuKGRhdGEpIC8vIHNlbGYuX2ZyYW1lc2l6ZQogICAgICAgICAgICAgaWYgc2VsZi5fZW5jb2RpbmcgPT0gQVVESU9fRklMRV9FTkNPRElOR19NVUxBV184OgogICAgICAgICAgICAgICAgIGltcG9ydCBhdWRpb29wCiAgICAgICAgICAgICAgICAgZGF0YSA9IGF1ZGlvb3AudWxhdzJsaW4oZGF0YSwgc2VsZi5fc2FtcHdpZHRoKQpAQCAtMjYzLDggKzI2OCwxMCBAQAogICAgICAgICByZXR1cm4gTm9uZSAgICAgICAgICAgICAjIFhYWC0tbm90IGltcGxlbWVudGVkIHlldAogCiAgICAgZGVmIHJld2luZChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fZGF0YV9wb3MgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJ2Nhbm5vdCBzZWVrJykKKyAgICAgICAgc2VsZi5fZmlsZS5zZWVrKHNlbGYuX2RhdGFfcG9zKQogICAgICAgICBzZWxmLl9zb3VuZHBvcyA9IDAKLSAgICAgICAgc2VsZi5fZmlsZS5zZWVrKHNlbGYuX2hkcl9zaXplKQogCiAgICAgZGVmIHRlbGwoc2VsZik6CiAgICAgICAgIHJldHVybiBzZWxmLl9zb3VuZHBvcwpAQCAtMjcyLDcgKzI3OSw5IEBACiAgICAgZGVmIHNldHBvcyhzZWxmLCBwb3MpOgogICAgICAgICBpZiBwb3MgPCAwIG9yIHBvcyA+IHNlbGYuZ2V0bmZyYW1lcygpOgogICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdwb3NpdGlvbiBub3QgaW4gcmFuZ2UnCi0gICAgICAgIHNlbGYuX2ZpbGUuc2Vlayhwb3MgKiBzZWxmLl9mcmFtZXNpemUgKyBzZWxmLl9oZHJfc2l6ZSkKKyAgICAgICAgaWYgc2VsZi5fZGF0YV9wb3MgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJ2Nhbm5vdCBzZWVrJykKKyAgICAgICAgc2VsZi5fZmlsZS5zZWVrKHNlbGYuX2RhdGFfcG9zICsgcG9zICogc2VsZi5fZnJhbWVzaXplKQogICAgICAgICBzZWxmLl9zb3VuZHBvcyA9IHBvcwogCiAgICAgZGVmIGNsb3NlKHNlbGYpOgpAQCAtMzgyLDEwICszOTEsMTAgQEAKIAogICAgIGRlZiB3cml0ZWZyYW1lc3JhdyhzZWxmLCBkYXRhKToKICAgICAgICAgc2VsZi5fZW5zdXJlX2hlYWRlcl93cml0dGVuKCkKLSAgICAgICAgbmZyYW1lcyA9IGxlbihkYXRhKSAvIHNlbGYuX2ZyYW1lc2l6ZQogICAgICAgICBpZiBzZWxmLl9jb21wdHlwZSA9PSAnVUxBVyc6CiAgICAgICAgICAgICBpbXBvcnQgYXVkaW9vcAogICAgICAgICAgICAgZGF0YSA9IGF1ZGlvb3AubGluMnVsYXcoZGF0YSwgc2VsZi5fc2FtcHdpZHRoKQorICAgICAgICBuZnJhbWVzID0gbGVuKGRhdGEpIC8vIHNlbGYuX2ZyYW1lc2l6ZQogICAgICAgICBzZWxmLl9maWxlLndyaXRlKGRhdGEpCiAgICAgICAgIHNlbGYuX25mcmFtZXN3cml0dGVuID0gc2VsZi5fbmZyYW1lc3dyaXR0ZW4gKyBuZnJhbWVzCiAgICAgICAgIHNlbGYuX2RhdGF3cml0dGVuID0gc2VsZi5fZGF0YXdyaXR0ZW4gKyBsZW4oZGF0YSkKQEAgLTM5NywxMiArNDA2LDE1IEBACiAgICAgICAgICAgICBzZWxmLl9wYXRjaGhlYWRlcigpCiAKICAgICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgICAgIHNlbGYuX2Vuc3VyZV9oZWFkZXJfd3JpdHRlbigpCi0gICAgICAgIGlmIHNlbGYuX25mcmFtZXN3cml0dGVuICE9IHNlbGYuX25mcmFtZXMgb3IgXAotICAgICAgICAgICAgICAgICAgc2VsZi5fZGF0YWxlbmd0aCAhPSBzZWxmLl9kYXRhd3JpdHRlbjoKLSAgICAgICAgICAgIHNlbGYuX3BhdGNoaGVhZGVyKCkKLSAgICAgICAgc2VsZi5fZmlsZS5mbHVzaCgpCi0gICAgICAgIHNlbGYuX2ZpbGUgPSBOb25lCisgICAgICAgIGlmIHNlbGYuX2ZpbGU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5fZW5zdXJlX2hlYWRlcl93cml0dGVuKCkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9uZnJhbWVzd3JpdHRlbiAhPSBzZWxmLl9uZnJhbWVzIG9yIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2RhdGFsZW5ndGggIT0gc2VsZi5fZGF0YXdyaXR0ZW46CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhdGNoaGVhZGVyKCkKKyAgICAgICAgICAgICAgICBzZWxmLl9maWxlLmZsdXNoKCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc2VsZi5fZmlsZSA9IE5vbmUKIAogICAgICMKICAgICAjIHByaXZhdGUgbWV0aG9kcwpAQCAtNDQ1LDYgKzQ1NywxMCBAQAogICAgICAgICAgICAgbGVuZ3RoID0gQVVESU9fVU5LTk9XTl9TSVpFCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBsZW5ndGggPSBzZWxmLl9uZnJhbWVzICogc2VsZi5fZnJhbWVzaXplCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2Zvcm1fbGVuZ3RoX3BvcyA9IHNlbGYuX2ZpbGUudGVsbCgpCisgICAgICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIElPRXJyb3IpOgorICAgICAgICAgICAgc2VsZi5fZm9ybV9sZW5ndGhfcG9zID0gTm9uZQogICAgICAgICBfd3JpdGVfdTMyKHNlbGYuX2ZpbGUsIGxlbmd0aCkKICAgICAgICAgc2VsZi5fZGF0YWxlbmd0aCA9IGxlbmd0aAogICAgICAgICBfd3JpdGVfdTMyKHNlbGYuX2ZpbGUsIGVuY29kaW5nKQpAQCAtNDU0LDcgKzQ3MCw5IEBACiAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJ1wwJyooaGVhZGVyX3NpemUgLSBsZW4oc2VsZi5faW5mbykgLSAyNCkpCiAKICAgICBkZWYgX3BhdGNoaGVhZGVyKHNlbGYpOgotICAgICAgICBzZWxmLl9maWxlLnNlZWsoOCkKKyAgICAgICAgaWYgc2VsZi5fZm9ybV9sZW5ndGhfcG9zIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCdjYW5ub3Qgc2VlaycpCisgICAgICAgIHNlbGYuX2ZpbGUuc2VlayhzZWxmLl9mb3JtX2xlbmd0aF9wb3MpCiAgICAgICAgIF93cml0ZV91MzIoc2VsZi5fZmlsZSwgc2VsZi5fZGF0YXdyaXR0ZW4pCiAgICAgICAgIHNlbGYuX2RhdGFsZW5ndGggPSBzZWxmLl9kYXRhd3JpdHRlbgogICAgICAgICBzZWxmLl9maWxlLnNlZWsoMCwgMikKZGlmZiAtLWdpdCBhL0xpYi9zeW1ib2wucHkgYi9MaWIvc3ltYm9sLnB5CmluZGV4IGNmMTc5ZTUuLmI0ZDRlMTMgMTAwNzU1Ci0tLSBhL0xpYi9zeW1ib2wucHkKKysrIGIvTGliL3N5bWJvbC5weQpAQCAtNyw3ICs3LDcgQEAKICMgIFRvIHVwZGF0ZSB0aGUgc3ltYm9scyBpbiB0aGlzIGZpbGUsICdjZCcgdG8gdGhlIHRvcCBkaXJlY3Rvcnkgb2YKICMgIHRoZSBweXRob24gc291cmNlIHRyZWUgYWZ0ZXIgYnVpbGRpbmcgdGhlIGludGVycHJldGVyIGFuZCBydW46CiAjCi0jICAgIHB5dGhvbiBMaWIvc3ltYm9sLnB5CisjICAgIC4vcHl0aG9uIExpYi9zeW1ib2wucHkKIAogIy0tc3RhcnQgY29uc3RhbnRzLS0KIHNpbmdsZV9pbnB1dCA9IDI1NgpkaWZmIC0tZ2l0IGEvTGliL3N5bXRhYmxlLnB5IGIvTGliL3N5bXRhYmxlLnB5CmluZGV4IGNhNzNmNTguLjBiYTlkMWEgMTAwNjQ0Ci0tLSBhL0xpYi9zeW10YWJsZS5weQorKysgYi9MaWIvc3ltdGFibGUucHkKQEAgLTEwLDEwICsxMCw3IEBACiBfX2FsbF9fID0gWyJzeW10YWJsZSIsICJTeW1ib2xUYWJsZSIsICJDbGFzcyIsICJGdW5jdGlvbiIsICJTeW1ib2wiXQogCiBkZWYgc3ltdGFibGUoY29kZSwgZmlsZW5hbWUsIGNvbXBpbGVfdHlwZSk6Ci0gICAgcmF3ID0gX3N5bXRhYmxlLnN5bXRhYmxlKGNvZGUsIGZpbGVuYW1lLCBjb21waWxlX3R5cGUpCi0gICAgZm9yIHRvcCBpbiByYXcuaXRlcnZhbHVlcygpOgotICAgICAgICBpZiB0b3AubmFtZSA9PSAndG9wJzoKLSAgICAgICAgICAgIGJyZWFrCisgICAgdG9wID0gX3N5bXRhYmxlLnN5bXRhYmxlKGNvZGUsIGZpbGVuYW1lLCBjb21waWxlX3R5cGUpCiAgICAgcmV0dXJuIF9uZXdTeW1ib2xUYWJsZSh0b3AsIGZpbGVuYW1lKQogCiBjbGFzcyBTeW1ib2xUYWJsZUZhY3Rvcnk6CmRpZmYgLS1naXQgYS9MaWIvc3lzY29uZmlnLnB5IGIvTGliL3N5c2NvbmZpZy5weQppbmRleCA5ZThhY2M1Li5hYTY5MzUxIDEwMDY0NAotLS0gYS9MaWIvc3lzY29uZmlnLnB5CisrKyBiL0xpYi9zeXNjb25maWcucHkKQEAgLTExNiw2ICsxMTYsMTAgQEAKIGlmIG9zLm5hbWUgPT0gIm50IiBhbmQgIlxccGNidWlsZFxcYW1kNjQiIGluIF9QUk9KRUNUX0JBU0VbLTE0Ol0ubG93ZXIoKToKICAgICBfUFJPSkVDVF9CQVNFID0gX3NhZmVfcmVhbHBhdGgob3MucGF0aC5qb2luKF9QUk9KRUNUX0JBU0UsIHBhcmRpciwgcGFyZGlyKSkKIAorIyBzZXQgZm9yIGNyb3NzIGJ1aWxkcworaWYgIl9QWVRIT05fUFJPSkVDVF9CQVNFIiBpbiBvcy5lbnZpcm9uOgorICAgICMgdGhlIGJ1aWxkIGRpcmVjdG9yeSBmb3IgcG9zaXggYnVpbGRzCisgICAgX1BST0pFQ1RfQkFTRSA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5hYnNwYXRoKCIuIikpCiBkZWYgaXNfcHl0aG9uX2J1aWxkKCk6CiAgICAgZm9yIGZuIGluICgiU2V0dXAuZGlzdCIsICJTZXR1cC5sb2NhbCIpOgogICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmpvaW4oX1BST0pFQ1RfQkFTRSwgIk1vZHVsZXMiLCBmbikpOgpAQCAtMTc2LDggKzE4MCw5IEBACiAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgogICAgICAgICBmcmFtZXdvcmsgPSBnZXRfY29uZmlnX3ZhcigiUFlUSE9ORlJBTUVXT1JLIikKICAgICAgICAgaWYgZnJhbWV3b3JrOgotICAgICAgICAgICAgcmV0dXJuIGpvaW51c2VyKCJ+IiwgIkxpYnJhcnkiLCBmcmFtZXdvcmssICIlZC4lZCIlKAotICAgICAgICAgICAgICAgIHN5cy52ZXJzaW9uX2luZm9bOjJdKSkKKyAgICAgICAgICAgIHJldHVybiBlbnZfYmFzZSBpZiBlbnZfYmFzZSBlbHNlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2ludXNlcigifiIsICJMaWJyYXJ5IiwgZnJhbWV3b3JrLCAiJWQuJWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHN5cy52ZXJzaW9uX2luZm9bOjJdKSkKIAogICAgIHJldHVybiBlbnZfYmFzZSBpZiBlbnZfYmFzZSBlbHNlIGpvaW51c2VyKCJ+IiwgIi5sb2NhbCIpCiAKQEAgLTI3Myw5ICsyNzgsMTAgQEAKICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihfUFJPSkVDVF9CQVNFLCAiTWFrZWZpbGUiKQogICAgIHJldHVybiBvcy5wYXRoLmpvaW4oZ2V0X3BhdGgoJ3BsYXRzdGRsaWInKSwgImNvbmZpZyIsICJNYWtlZmlsZSIpCiAKLQotZGVmIF9pbml0X3Bvc2l4KHZhcnMpOgotICAgICIiIkluaXRpYWxpemUgdGhlIG1vZHVsZSBhcyBhcHByb3ByaWF0ZSBmb3IgUE9TSVggc3lzdGVtcy4iIiIKK2RlZiBfZ2VuZXJhdGVfcG9zaXhfdmFycygpOgorICAgICIiIkdlbmVyYXRlIHRoZSBQeXRob24gbW9kdWxlIGNvbnRhaW5pbmcgYnVpbGQtdGltZSB2YXJpYWJsZXMuIiIiCisgICAgaW1wb3J0IHBwcmludAorICAgIHZhcnMgPSB7fQogICAgICMgbG9hZCB0aGUgaW5zdGFsbGVkIE1ha2VmaWxlOgogICAgIG1ha2VmaWxlID0gX2dldF9tYWtlZmlsZV9maWxlbmFtZSgpCiAgICAgdHJ5OgpAQCAtMzAzLDYgKzMwOSw0OSBAQAogICAgIGlmIF9QWVRIT05fQlVJTEQ6CiAgICAgICAgIHZhcnNbJ0xEU0hBUkVEJ10gPSB2YXJzWydCTERTSEFSRUQnXQogCisgICAgIyBUaGVyZSdzIGEgY2hpY2tlbi1hbmQtZWdnIHNpdHVhdGlvbiBvbiBPUyBYIHdpdGggcmVnYXJkcyB0byB0aGUKKyAgICAjIF9zeXNjb25maWdkYXRhIG1vZHVsZSBhZnRlciB0aGUgY2hhbmdlcyBpbnRyb2R1Y2VkIGJ5ICMxNTI5ODoKKyAgICAjIGdldF9jb25maWdfdmFycygpIGlzIGNhbGxlZCBieSBnZXRfcGxhdGZvcm0oKSBhcyBwYXJ0IG9mIHRoZQorICAgICMgYG1ha2UgcHlidWlsZGRpci50eHRgIHRhcmdldCAtLSB3aGljaCBpcyBhIHByZWN1cnNvciB0byB0aGUKKyAgICAjIF9zeXNjb25maWdkYXRhLnB5IG1vZHVsZSBiZWluZyBjb25zdHJ1Y3RlZC4gIFVuZm9ydHVuYXRlbHksCisgICAgIyBnZXRfY29uZmlnX3ZhcnMoKSBldmVudHVhbGx5IGNhbGxzIF9pbml0X3Bvc2l4KCksIHdoaWNoIGF0dGVtcHRzCisgICAgIyB0byBpbXBvcnQgX3N5c2NvbmZpZ2RhdGEsIHdoaWNoIHdlIHdvbid0IGhhdmUgYnVpbHQgeWV0LiAgSW4gb3JkZXIKKyAgICAjIGZvciBfaW5pdF9wb3NpeCgpIHRvIHdvcmssIGlmIHdlJ3JlIG9uIERhcndpbiwganVzdCBtb2NrIHVwIHRoZQorICAgICMgX3N5c2NvbmZpZ2RhdGEgbW9kdWxlIG1hbnVhbGx5IGFuZCBwb3B1bGF0ZSBpdCB3aXRoIHRoZSBidWlsZCB2YXJzLgorICAgICMgVGhpcyBpcyBtb3JlIHRoYW4gc3VmZmljaWVudCBmb3IgZW5zdXJpbmcgdGhlIHN1YnNlcXVlbnQgY2FsbCB0bworICAgICMgZ2V0X3BsYXRmb3JtKCkgc3VjY2VlZHMuCisgICAgbmFtZSA9ICdfc3lzY29uZmlnZGF0YScKKyAgICBpZiAnZGFyd2luJyBpbiBzeXMucGxhdGZvcm06CisgICAgICAgIGltcG9ydCBpbXAKKyAgICAgICAgbW9kdWxlID0gaW1wLm5ld19tb2R1bGUobmFtZSkKKyAgICAgICAgbW9kdWxlLmJ1aWxkX3RpbWVfdmFycyA9IHZhcnMKKyAgICAgICAgc3lzLm1vZHVsZXNbbmFtZV0gPSBtb2R1bGUKKworICAgIHB5YnVpbGRkaXIgPSAnYnVpbGQvbGliLiVzLSVzJyAlIChnZXRfcGxhdGZvcm0oKSwgc3lzLnZlcnNpb25bOjNdKQorICAgIGlmIGhhc2F0dHIoc3lzLCAiZ2V0dG90YWxyZWZjb3VudCIpOgorICAgICAgICBweWJ1aWxkZGlyICs9ICctcHlkZWJ1ZycKKyAgICB0cnk6CisgICAgICAgIG9zLm1ha2VkaXJzKHB5YnVpbGRkaXIpCisgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBkZXN0ZmlsZSA9IG9zLnBhdGguam9pbihweWJ1aWxkZGlyLCBuYW1lICsgJy5weScpCisKKyAgICB3aXRoIG9wZW4oZGVzdGZpbGUsICd3YicpIGFzIGY6CisgICAgICAgIGYud3JpdGUoJyMgc3lzdGVtIGNvbmZpZ3VyYXRpb24gZ2VuZXJhdGVkIGFuZCB1c2VkIGJ5JworICAgICAgICAgICAgICAgICcgdGhlIHN5c2NvbmZpZyBtb2R1bGVcbicpCisgICAgICAgIGYud3JpdGUoJ2J1aWxkX3RpbWVfdmFycyA9ICcpCisgICAgICAgIHBwcmludC5wcHJpbnQodmFycywgc3RyZWFtPWYpCisKKyAgICAjIENyZWF0ZSBmaWxlIHVzZWQgZm9yIHN5cy5wYXRoIGZpeHVwIC0tIHNlZSBNb2R1bGVzL2dldHBhdGguYworICAgIHdpdGggb3BlbigncHlidWlsZGRpci50eHQnLCAndycpIGFzIGY6CisgICAgICAgIGYud3JpdGUocHlidWlsZGRpcikKKworZGVmIF9pbml0X3Bvc2l4KHZhcnMpOgorICAgICIiIkluaXRpYWxpemUgdGhlIG1vZHVsZSBhcyBhcHByb3ByaWF0ZSBmb3IgUE9TSVggc3lzdGVtcy4iIiIKKyAgICAjIF9zeXNjb25maWdkYXRhIGlzIGdlbmVyYXRlZCBhdCBidWlsZCB0aW1lLCBzZWUgX2dlbmVyYXRlX3Bvc2l4X3ZhcnMoKQorICAgIGZyb20gX3N5c2NvbmZpZ2RhdGEgaW1wb3J0IGJ1aWxkX3RpbWVfdmFycworICAgIHZhcnMudXBkYXRlKGJ1aWxkX3RpbWVfdmFycykKKwogZGVmIF9pbml0X25vbl9wb3NpeCh2YXJzKToKICAgICAiIiJJbml0aWFsaXplIHRoZSBtb2R1bGUgYXMgYXBwcm9wcmlhdGUgZm9yIE5UIiIiCiAgICAgIyBzZXQgYmFzaWMgaW5zdGFsbCBkaXJlY3RvcmllcwpAQCAtNDQ0LDY0ICs0OTMsMTEgQEAKICAgICAgICAgICAgICAgICBzcmNkaXIgPSBvcy5wYXRoLmpvaW4oYmFzZSwgX0NPTkZJR19WQVJTWydzcmNkaXInXSkKICAgICAgICAgICAgICAgICBfQ09ORklHX1ZBUlNbJ3NyY2RpciddID0gb3MucGF0aC5ub3JtcGF0aChzcmNkaXIpCiAKKyAgICAgICAgIyBPUyBYIHBsYXRmb3JtcyByZXF1aXJlIHNwZWNpYWwgY3VzdG9taXphdGlvbiB0byBoYW5kbGUKKyAgICAgICAgIyBtdWx0aS1hcmNoaXRlY3R1cmUsIG11bHRpLW9zLXZlcnNpb24gaW5zdGFsbGVycwogICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6Ci0gICAgICAgICAgICBrZXJuZWxfdmVyc2lvbiA9IG9zLnVuYW1lKClbMl0gIyBLZXJuZWwgdmVyc2lvbiAoOC40LjMpCi0gICAgICAgICAgICBtYWpvcl92ZXJzaW9uID0gaW50KGtlcm5lbF92ZXJzaW9uLnNwbGl0KCcuJylbMF0pCi0KLSAgICAgICAgICAgIGlmIG1ham9yX3ZlcnNpb24gPCA4OgotICAgICAgICAgICAgICAgICMgT24gTWFjIE9TIFggYmVmb3JlIDEwLjQsIGNoZWNrIGlmIC1hcmNoIGFuZCAtaXN5c3Jvb3QKLSAgICAgICAgICAgICAgICAjIGFyZSBpbiBDRkxBR1Mgb3IgTERGTEFHUyBhbmQgcmVtb3ZlIHRoZW0gaWYgdGhleSBhcmUuCi0gICAgICAgICAgICAgICAgIyBUaGlzIGlzIG5lZWRlZCB3aGVuIGJ1aWxkaW5nIGV4dGVuc2lvbnMgb24gYSAxMC4zIHN5c3RlbQotICAgICAgICAgICAgICAgICMgdXNpbmcgYSB1bml2ZXJzYWwgYnVpbGQgb2YgcHl0aG9uLgotICAgICAgICAgICAgICAgIGZvciBrZXkgaW4gKCdMREZMQUdTJywgJ0JBU0VDRkxBR1MnLAotICAgICAgICAgICAgICAgICAgICAgICAgIyBhIG51bWJlciBvZiBkZXJpdmVkIHZhcmlhYmxlcy4gVGhlc2UgbmVlZCB0byBiZQotICAgICAgICAgICAgICAgICAgICAgICAgIyBwYXRjaGVkIHVwIGFzIHdlbGwuCi0gICAgICAgICAgICAgICAgICAgICAgICAnQ0ZMQUdTJywgJ1BZX0NGTEFHUycsICdCTERTSEFSRUQnKToKLSAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBfQ09ORklHX1ZBUlNba2V5XQotICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHJlLnN1YignLWFyY2hccytcdytccycsICcgJywgZmxhZ3MpCi0gICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcmUuc3ViKCctaXN5c3Jvb3QgW14gXHRdKicsICcgJywgZmxhZ3MpCi0gICAgICAgICAgICAgICAgICAgIF9DT05GSUdfVkFSU1trZXldID0gZmxhZ3MKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgIyBBbGxvdyB0aGUgdXNlciB0byBvdmVycmlkZSB0aGUgYXJjaGl0ZWN0dXJlIGZsYWdzIHVzaW5nCi0gICAgICAgICAgICAgICAgIyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLSAgICAgICAgICAgICAgICAjIE5PVEU6IFRoaXMgbmFtZSB3YXMgaW50cm9kdWNlZCBieSBBcHBsZSBpbiBPU1ggMTAuNSBhbmQKLSAgICAgICAgICAgICAgICAjIGlzIHVzZWQgYnkgc2V2ZXJhbCBzY3JpcHRpbmcgbGFuZ3VhZ2VzIGRpc3RyaWJ1dGVkIHdpdGgKLSAgICAgICAgICAgICAgICAjIHRoYXQgT1MgcmVsZWFzZS4KLSAgICAgICAgICAgICAgICBpZiAnQVJDSEZMQUdTJyBpbiBvcy5lbnZpcm9uOgotICAgICAgICAgICAgICAgICAgICBhcmNoID0gb3MuZW52aXJvblsnQVJDSEZMQUdTJ10KLSAgICAgICAgICAgICAgICAgICAgZm9yIGtleSBpbiAoJ0xERkxBR1MnLCAnQkFTRUNGTEFHUycsCi0gICAgICAgICAgICAgICAgICAgICAgICAjIGEgbnVtYmVyIG9mIGRlcml2ZWQgdmFyaWFibGVzLiBUaGVzZSBuZWVkIHRvIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAjIHBhdGNoZWQgdXAgYXMgd2VsbC4KLSAgICAgICAgICAgICAgICAgICAgICAgICdDRkxBR1MnLCAnUFlfQ0ZMQUdTJywgJ0JMRFNIQVJFRCcpOgotCi0gICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IF9DT05GSUdfVkFSU1trZXldCi0gICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHJlLnN1YignLWFyY2hccytcdytccycsICcgJywgZmxhZ3MpCi0gICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IGZsYWdzICsgJyAnICsgYXJjaAotICAgICAgICAgICAgICAgICAgICAgICAgX0NPTkZJR19WQVJTW2tleV0gPSBmbGFncwotCi0gICAgICAgICAgICAgICAgIyBJZiB3ZSdyZSBvbiBPU1ggMTAuNSBvciBsYXRlciBhbmQgdGhlIHVzZXIgdHJpZXMgdG8KLSAgICAgICAgICAgICAgICAjIGNvbXBpbGVzIGFuIGV4dGVuc2lvbiB1c2luZyBhbiBTREsgdGhhdCBpcyBub3QgcHJlc2VudAotICAgICAgICAgICAgICAgICMgb24gdGhlIGN1cnJlbnQgbWFjaGluZSBpdCBpcyBiZXR0ZXIgdG8gbm90IHVzZSBhbiBTREsKLSAgICAgICAgICAgICAgICAjIHRoYW4gdG8gZmFpbC4KLSAgICAgICAgICAgICAgICAjCi0gICAgICAgICAgICAgICAgIyBUaGUgbWFqb3IgdXNlY2FzZSBmb3IgdGhpcyBpcyB1c2VycyB1c2luZyBhIFB5dGhvbi5vcmcKLSAgICAgICAgICAgICAgICAjIGJpbmFyeSBpbnN0YWxsZXIgIG9uIE9TWCAxMC42OiB0aGF0IGluc3RhbGxlciB1c2VzCi0gICAgICAgICAgICAgICAgIyB0aGUgMTAuNHUgU0RLLCBidXQgdGhhdCBTREsgaXMgbm90IGluc3RhbGxlZCBieSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgIyB3aGVuIHlvdSBpbnN0YWxsIFhjb2RlLgotICAgICAgICAgICAgICAgICMKLSAgICAgICAgICAgICAgICBDRkxBR1MgPSBfQ09ORklHX1ZBUlMuZ2V0KCdDRkxBR1MnLCAnJykKLSAgICAgICAgICAgICAgICBtID0gcmUuc2VhcmNoKCctaXN5c3Jvb3RccysoXFMrKScsIENGTEFHUykKLSAgICAgICAgICAgICAgICBpZiBtIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgICAgICBzZGsgPSBtLmdyb3VwKDEpCi0gICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZGspOgotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGtleSBpbiAoJ0xERkxBR1MnLCAnQkFTRUNGTEFHUycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYSBudW1iZXIgb2YgZGVyaXZlZCB2YXJpYWJsZXMuIFRoZXNlIG5lZWQgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwYXRjaGVkIHVwIGFzIHdlbGwuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NGTEFHUycsICdQWV9DRkxBR1MnLCAnQkxEU0hBUkVEJyk6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IF9DT05GSUdfVkFSU1trZXldCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSByZS5zdWIoJy1pc3lzcm9vdFxzK1xTKyhcc3wkKScsICcgJywgZmxhZ3MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NPTkZJR19WQVJTW2tleV0gPSBmbGFncworICAgICAgICAgICAgaW1wb3J0IF9vc3hfc3VwcG9ydAorICAgICAgICAgICAgX29zeF9zdXBwb3J0LmN1c3RvbWl6ZV9jb25maWdfdmFycyhfQ09ORklHX1ZBUlMpCiAKICAgICBpZiBhcmdzOgogICAgICAgICB2YWxzID0gW10KQEAgLTU1OSw2ICs1NTUsMTAgQEAKICAgICAgICAgICAgIHJldHVybiAnd2luLWlhNjQnCiAgICAgICAgIHJldHVybiBzeXMucGxhdGZvcm0KIAorICAgICMgU2V0IGZvciBjcm9zcyBidWlsZHMgZXhwbGljaXRseQorICAgIGlmICJfUFlUSE9OX0hPU1RfUExBVEZPUk0iIGluIG9zLmVudmlyb246CisgICAgICAgIHJldHVybiBvcy5lbnZpcm9uWyJfUFlUSE9OX0hPU1RfUExBVEZPUk0iXQorCiAgICAgaWYgb3MubmFtZSAhPSAicG9zaXgiIG9yIG5vdCBoYXNhdHRyKG9zLCAndW5hbWUnKToKICAgICAgICAgIyBYWFggd2hhdCBhYm91dCB0aGUgYXJjaGl0ZWN0dXJlPyBOVCBpcyBJbnRlbCBvciBBbHBoYSwKICAgICAgICAgIyBNYWMgT1MgaXMgTTY4ayBvciBQUEMsIGV0Yy4KQEAgLTU4Miw2ICs1ODIsMTEgQEAKICAgICAgICAgaWYgcmVsZWFzZVswXSA+PSAiNSI6ICAgICAgICAgICAjIFN1bk9TIDUgPT0gU29sYXJpcyAyCiAgICAgICAgICAgICBvc25hbWUgPSAic29sYXJpcyIKICAgICAgICAgICAgIHJlbGVhc2UgPSAiJWQuJXMiICUgKGludChyZWxlYXNlWzBdKSAtIDMsIHJlbGVhc2VbMjpdKQorICAgICAgICAgICAgIyBXZSBjYW4ndCB1c2UgInBsYXRmb3JtLmFyY2hpdGVjdHVyZSgpWzBdIiBiZWNhdXNlIGEKKyAgICAgICAgICAgICMgYm9vdHN0cmFwIHByb2JsZW0uIFdlIHVzZSBhIGRpY3QgdG8gZ2V0IGFuIGVycm9yCisgICAgICAgICAgICAjIGlmIHNvbWUgc3VzcGljaW91cyBoYXBwZW5zLgorICAgICAgICAgICAgYml0bmVzcyA9IHsyMTQ3NDgzNjQ3OiIzMmJpdCIsIDkyMjMzNzIwMzY4NTQ3NzU4MDc6IjY0Yml0In0KKyAgICAgICAgICAgIG1hY2hpbmUgKz0gIi4lcyIgJSBiaXRuZXNzW3N5cy5tYXhpbnRdCiAgICAgICAgICMgZmFsbCB0aHJvdWdoIHRvIHN0YW5kYXJkIG9zbmFtZS1yZWxlYXNlLW1hY2hpbmUgcmVwcmVzZW50YXRpb24KICAgICBlbGlmIG9zbmFtZVs6NF0gPT0gImlyaXgiOiAgICAgICAgICAgICAgIyBjb3VsZCBiZSAiaXJpeDY0IiEKICAgICAgICAgcmV0dXJuICIlcy0lcyIgJSAob3NuYW1lLCByZWxlYXNlKQpAQCAtNTk0LDk0ICs1OTksMzggQEAKICAgICAgICAgaWYgbToKICAgICAgICAgICAgIHJlbGVhc2UgPSBtLmdyb3VwKCkKICAgICBlbGlmIG9zbmFtZVs6Nl0gPT0gImRhcndpbiI6Ci0gICAgICAgICMKLSAgICAgICAgIyBGb3Igb3VyIHB1cnBvc2VzLCB3ZSdsbCBhc3N1bWUgdGhhdCB0aGUgc3lzdGVtIHZlcnNpb24gZnJvbQotICAgICAgICAjIGRpc3R1dGlscycgcGVyc3BlY3RpdmUgaXMgd2hhdCBNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgaXMgc2V0Ci0gICAgICAgICMgdG8uIFRoaXMgbWFrZXMgdGhlIGNvbXBhdGliaWxpdHkgc3RvcnkgYSBiaXQgbW9yZSBzYW5lIGJlY2F1c2UgdGhlCi0gICAgICAgICMgbWFjaGluZSBpcyBnb2luZyB0byBjb21waWxlIGFuZCBsaW5rIGFzIGlmIGl0IHdlcmUKLSAgICAgICAgIyBNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQuCi0gICAgICAgIGNmZ3ZhcnMgPSBnZXRfY29uZmlnX3ZhcnMoKQotICAgICAgICBtYWN2ZXIgPSBjZmd2YXJzLmdldCgnTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJykKLQotICAgICAgICBpZiAxOgotICAgICAgICAgICAgIyBBbHdheXMgY2FsY3VsYXRlIHRoZSByZWxlYXNlIG9mIHRoZSBydW5uaW5nIG1hY2hpbmUsCi0gICAgICAgICAgICAjIG5lZWRlZCB0byBkZXRlcm1pbmUgaWYgd2UgY2FuIGJ1aWxkIGZhdCBiaW5hcmllcyBvciBub3QuCi0KLSAgICAgICAgICAgIG1hY3JlbGVhc2UgPSBtYWN2ZXIKLSAgICAgICAgICAgICMgR2V0IHRoZSBzeXN0ZW0gdmVyc2lvbi4gUmVhZGluZyB0aGlzIHBsaXN0IGlzIGEgZG9jdW1lbnRlZAotICAgICAgICAgICAgIyB3YXkgdG8gZ2V0IHRoZSBzeXN0ZW0gdmVyc2lvbiAoc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvcgotICAgICAgICAgICAgIyB0aGUgR2VzdGFsdCBNYW5hZ2VyKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGYgPSBvcGVuKCcvU3lzdGVtL0xpYnJhcnkvQ29yZVNlcnZpY2VzL1N5c3RlbVZlcnNpb24ucGxpc3QnKQotICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6Ci0gICAgICAgICAgICAgICAgIyBXZSdyZSBvbiBhIHBsYWluIGRhcndpbiBib3gsIGZhbGwgYmFjayB0byB0aGUgZGVmYXVsdAotICAgICAgICAgICAgICAgICMgYmVoYXZpb3VyLgotICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBtID0gcmUuc2VhcmNoKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInPGtleT5Qcm9kdWN0VXNlclZpc2libGVWZXJzaW9uPC9rZXk+XHMqJyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcic8c3RyaW5nPiguKj8pPC9zdHJpbmc+JywgZi5yZWFkKCkpCi0gICAgICAgICAgICAgICAgICAgIGlmIG0gaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYWNyZWxlYXNlID0gJy4nLmpvaW4obS5ncm91cCgxKS5zcGxpdCgnLicpWzoyXSkKLSAgICAgICAgICAgICAgICAgICAgIyBlbHNlOiBmYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQgYmVoYXZpb3VyCi0gICAgICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCi0KLSAgICAgICAgaWYgbm90IG1hY3ZlcjoKLSAgICAgICAgICAgIG1hY3ZlciA9IG1hY3JlbGVhc2UKLQotICAgICAgICBpZiBtYWN2ZXI6Ci0gICAgICAgICAgICByZWxlYXNlID0gbWFjdmVyCi0gICAgICAgICAgICBvc25hbWUgPSAibWFjb3N4IgotCi0gICAgICAgICAgICBpZiAobWFjcmVsZWFzZSArICcuJykgPj0gJzEwLjQuJyBhbmQgXAotICAgICAgICAgICAgICAgICAgICAnLWFyY2gnIGluIGdldF9jb25maWdfdmFycygpLmdldCgnQ0ZMQUdTJywgJycpLnN0cmlwKCk6Ci0gICAgICAgICAgICAgICAgIyBUaGUgdW5pdmVyc2FsIGJ1aWxkIHdpbGwgYnVpbGQgZmF0IGJpbmFyaWVzLCBidXQgbm90IG9uCi0gICAgICAgICAgICAgICAgIyBzeXN0ZW1zIGJlZm9yZSAxMC40Ci0gICAgICAgICAgICAgICAgIwotICAgICAgICAgICAgICAgICMgVHJ5IHRvIGRldGVjdCA0LXdheSB1bml2ZXJzYWwgYnVpbGRzLCB0aG9zZSBoYXZlIG1hY2hpbmUtdHlwZQotICAgICAgICAgICAgICAgICMgJ3VuaXZlcnNhbCcgaW5zdGVhZCBvZiAnZmF0Jy4KLQotICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAnZmF0JwotICAgICAgICAgICAgICAgIGNmbGFncyA9IGdldF9jb25maWdfdmFycygpLmdldCgnQ0ZMQUdTJykKLQotICAgICAgICAgICAgICAgIGFyY2hzID0gcmUuZmluZGFsbCgnLWFyY2hccysoXFMrKScsIGNmbGFncykKLSAgICAgICAgICAgICAgICBhcmNocyA9IHR1cGxlKHNvcnRlZChzZXQoYXJjaHMpKSkKLQotICAgICAgICAgICAgICAgIGlmIGxlbihhcmNocykgPT0gMToKLSAgICAgICAgICAgICAgICAgICAgbWFjaGluZSA9IGFyY2hzWzBdCi0gICAgICAgICAgICAgICAgZWxpZiBhcmNocyA9PSAoJ2kzODYnLCAncHBjJyk6Ci0gICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAnZmF0JwotICAgICAgICAgICAgICAgIGVsaWYgYXJjaHMgPT0gKCdpMzg2JywgJ3g4Nl82NCcpOgotICAgICAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ2ludGVsJwotICAgICAgICAgICAgICAgIGVsaWYgYXJjaHMgPT0gKCdpMzg2JywgJ3BwYycsICd4ODZfNjQnKToKLSAgICAgICAgICAgICAgICAgICAgbWFjaGluZSA9ICdmYXQzJwotICAgICAgICAgICAgICAgIGVsaWYgYXJjaHMgPT0gKCdwcGM2NCcsICd4ODZfNjQnKToKLSAgICAgICAgICAgICAgICAgICAgbWFjaGluZSA9ICdmYXQ2NCcKLSAgICAgICAgICAgICAgICBlbGlmIGFyY2hzID09ICgnaTM4NicsICdwcGMnLCAncHBjNjQnLCAneDg2XzY0Jyk6Ci0gICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAndW5pdmVyc2FsJwotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICJEb24ndCBrbm93IG1hY2hpbmUgdmFsdWUgZm9yIGFyY2hzPSVyIiUoYXJjaHMsKSkKLQotICAgICAgICAgICAgZWxpZiBtYWNoaW5lID09ICdpMzg2JzoKLSAgICAgICAgICAgICAgICAjIE9uIE9TWCB0aGUgbWFjaGluZSB0eXBlIHJldHVybmVkIGJ5IHVuYW1lIGlzIGFsd2F5cyB0aGUKLSAgICAgICAgICAgICAgICAjIDMyLWJpdCB2YXJpYW50LCBldmVuIGlmIHRoZSBleGVjdXRhYmxlIGFyY2hpdGVjdHVyZSBpcwotICAgICAgICAgICAgICAgICMgdGhlIDY0LWJpdCB2YXJpYW50Ci0gICAgICAgICAgICAgICAgaWYgc3lzLm1heGludCA+PSAyKiozMjoKLSAgICAgICAgICAgICAgICAgICAgbWFjaGluZSA9ICd4ODZfNjQnCi0KLSAgICAgICAgICAgIGVsaWYgbWFjaGluZSBpbiAoJ1Bvd2VyUEMnLCAnUG93ZXJfTWFjaW50b3NoJyk6Ci0gICAgICAgICAgICAgICAgIyBQaWNrIGEgc2FuZSBuYW1lIGZvciB0aGUgUFBDIGFyY2hpdGVjdHVyZS4KLSAgICAgICAgICAgICAgICAjIFNlZSAnaTM4NicgY2FzZQotICAgICAgICAgICAgICAgIGlmIHN5cy5tYXhpbnQgPj0gMioqMzI6Ci0gICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAncHBjNjQnCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgbWFjaGluZSA9ICdwcGMnCisgICAgICAgIGltcG9ydCBfb3N4X3N1cHBvcnQKKyAgICAgICAgb3NuYW1lLCByZWxlYXNlLCBtYWNoaW5lID0gX29zeF9zdXBwb3J0LmdldF9wbGF0Zm9ybV9vc3goCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9jb25maWdfdmFycygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc25hbWUsIHJlbGVhc2UsIG1hY2hpbmUpCiAKICAgICByZXR1cm4gIiVzLSVzLSVzIiAlIChvc25hbWUsIHJlbGVhc2UsIG1hY2hpbmUpCiAKIAogZGVmIGdldF9weXRob25fdmVyc2lvbigpOgogICAgIHJldHVybiBfUFlfVkVSU0lPTl9TSE9SVAorCisKK2RlZiBfcHJpbnRfZGljdCh0aXRsZSwgZGF0YSk6CisgICAgZm9yIGluZGV4LCAoa2V5LCB2YWx1ZSkgaW4gZW51bWVyYXRlKHNvcnRlZChkYXRhLml0ZW1zKCkpKToKKyAgICAgICAgaWYgaW5kZXggPT0gMDoKKyAgICAgICAgICAgIHByaW50ICclczogJyAlICh0aXRsZSkKKyAgICAgICAgcHJpbnQgJ1x0JXMgPSAiJXMiJyAlIChrZXksIHZhbHVlKQorCisKK2RlZiBfbWFpbigpOgorICAgICIiIkRpc3BsYXkgYWxsIGluZm9ybWF0aW9uIHN5c2NvbmZpZyBkZXRhaW5zLiIiIgorICAgIGlmICctLWdlbmVyYXRlLXBvc2l4LXZhcnMnIGluIHN5cy5hcmd2OgorICAgICAgICBfZ2VuZXJhdGVfcG9zaXhfdmFycygpCisgICAgICAgIHJldHVybgorICAgIHByaW50ICdQbGF0Zm9ybTogIiVzIicgJSBnZXRfcGxhdGZvcm0oKQorICAgIHByaW50ICdQeXRob24gdmVyc2lvbjogIiVzIicgJSBnZXRfcHl0aG9uX3ZlcnNpb24oKQorICAgIHByaW50ICdDdXJyZW50IGluc3RhbGxhdGlvbiBzY2hlbWU6ICIlcyInICUgX2dldF9kZWZhdWx0X3NjaGVtZSgpCisgICAgcHJpbnQKKyAgICBfcHJpbnRfZGljdCgnUGF0aHMnLCBnZXRfcGF0aHMoKSkKKyAgICBwcmludAorICAgIF9wcmludF9kaWN0KCdWYXJpYWJsZXMnLCBnZXRfY29uZmlnX3ZhcnMoKSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90YXJmaWxlLnB5IGIvTGliL3RhcmZpbGUucHkKaW5kZXggZWQ1YmNmMi4uNTdlYTg3NyAxMDA2NDQKLS0tIGEvTGliL3RhcmZpbGUucHkKKysrIGIvTGliL3RhcmZpbGUucHkKQEAgLTEsNCArMSwzIEBACi0jIS91c3IvYmluL2VudiBweXRob24KICMgLSotIGNvZGluZzogaXNvLTg4NTktMSAtKi0KICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIHRhcmZpbGUucHkKQEAgLTMzMCw3ICszMjksNyBAQAogICAgICIiIkdlbmVyYWwgZXhjZXB0aW9uIGZvciBleHRyYWN0IGVycm9ycy4iIiIKICAgICBwYXNzCiBjbGFzcyBSZWFkRXJyb3IoVGFyRXJyb3IpOgotICAgICIiIkV4Y2VwdGlvbiBmb3IgdW5yZWFkYmxlIHRhciBhcmNoaXZlcy4iIiIKKyAgICAiIiJFeGNlcHRpb24gZm9yIHVucmVhZGFibGUgdGFyIGFyY2hpdmVzLiIiIgogICAgIHBhc3MKIGNsYXNzIENvbXByZXNzaW9uRXJyb3IoVGFyRXJyb3IpOgogICAgICIiIkV4Y2VwdGlvbiBmb3IgdW5hdmFpbGFibGUgY29tcHJlc3Npb24gbWV0aG9kcy4iIiIKQEAgLTQ1NCw2ICs0NTMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKQogICAgICAgICB0aW1lc3RhbXAgPSBzdHJ1Y3QucGFjaygiPEwiLCBsb25nKHRpbWUudGltZSgpKSkKICAgICAgICAgc2VsZi5fX3dyaXRlKCJcMDM3XDIxM1wwMTBcMDEwJXNcMDAyXDM3NyIgJSB0aW1lc3RhbXApCisgICAgICAgIGlmIHR5cGUoc2VsZi5uYW1lKSBpcyB1bmljb2RlOgorICAgICAgICAgICAgc2VsZi5uYW1lID0gc2VsZi5uYW1lLmVuY29kZSgiaXNvLTg4NTktMSIsICJyZXBsYWNlIikKICAgICAgICAgaWYgc2VsZi5uYW1lLmVuZHN3aXRoKCIuZ3oiKToKICAgICAgICAgICAgIHNlbGYubmFtZSA9IHNlbGYubmFtZVs6LTNdCiAgICAgICAgIHNlbGYuX193cml0ZShzZWxmLm5hbWUgKyBOVUwpCkBAIC0xNTA3LDEwICsxNTA4LDExIEBACiAgICAgICAgICAgIGNhbiBiZSBkZXRlcm1pbmVkLCBgbW9kZScgaXMgb3ZlcnJpZGRlbiBieSBgZmlsZW9iaidzIG1vZGUuCiAgICAgICAgICAgIGBmaWxlb2JqJyBpcyBub3QgY2xvc2VkLCB3aGVuIFRhckZpbGUgaXMgY2xvc2VkLgogICAgICAgICAiIiIKLSAgICAgICAgaWYgbGVuKG1vZGUpID4gMSBvciBtb2RlIG5vdCBpbiAicmF3IjoKKyAgICAgICAgbW9kZXMgPSB7InIiOiAicmIiLCAiYSI6ICJyK2IiLCAidyI6ICJ3YiJ9CisgICAgICAgIGlmIG1vZGUgbm90IGluIG1vZGVzOgogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBtdXN0IGJlICdyJywgJ2EnIG9yICd3JyIpCiAgICAgICAgIHNlbGYubW9kZSA9IG1vZGUKLSAgICAgICAgc2VsZi5fbW9kZSA9IHsiciI6ICJyYiIsICJhIjogInIrYiIsICJ3IjogIndiIn1bbW9kZV0KKyAgICAgICAgc2VsZi5fbW9kZSA9IG1vZGVzW21vZGVdCiAKICAgICAgICAgaWYgbm90IGZpbGVvYmo6CiAgICAgICAgICAgICBpZiBzZWxmLm1vZGUgPT0gImEiIGFuZCBub3Qgb3MucGF0aC5leGlzdHMobmFtZSk6CkBAIC0xNjgwLDcgKzE2ODIsNyBAQAogICAgICAgICAgICAgZmlsZW1vZGUgPSBmaWxlbW9kZSBvciAiciIKICAgICAgICAgICAgIGNvbXB0eXBlID0gY29tcHR5cGUgb3IgInRhciIKIAotICAgICAgICAgICAgaWYgZmlsZW1vZGUgbm90IGluICJydyI6CisgICAgICAgICAgICBpZiBmaWxlbW9kZSBub3QgaW4gKCJyIiwgInciKToKICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtb2RlIG11c3QgYmUgJ3InIG9yICd3JyIpCiAKICAgICAgICAgICAgIHQgPSBjbHMobmFtZSwgZmlsZW1vZGUsCkBAIC0xNjg5LDcgKzE2OTEsNyBAQAogICAgICAgICAgICAgdC5fZXh0ZmlsZW9iaiA9IEZhbHNlCiAgICAgICAgICAgICByZXR1cm4gdAogCi0gICAgICAgIGVsaWYgbW9kZSBpbiAiYXciOgorICAgICAgICBlbGlmIG1vZGUgaW4gKCJhIiwgInciKToKICAgICAgICAgICAgIHJldHVybiBjbHMudGFyb3BlbihuYW1lLCBtb2RlLCBmaWxlb2JqLCAqKmt3YXJncykKIAogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmRpc2Nlcm5pYmxlIG1vZGUiKQpAQCAtMTY5OCw3ICsxNzAwLDcgQEAKICAgICBkZWYgdGFyb3BlbihjbHMsIG5hbWUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUsICoqa3dhcmdzKToKICAgICAgICAgIiIiT3BlbiB1bmNvbXByZXNzZWQgdGFyIGFyY2hpdmUgbmFtZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLgogICAgICAgICAiIiIKLSAgICAgICAgaWYgbGVuKG1vZGUpID4gMSBvciBtb2RlIG5vdCBpbiAicmF3IjoKKyAgICAgICAgaWYgbW9kZSBub3QgaW4gKCJyIiwgImEiLCAidyIpOgogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBtdXN0IGJlICdyJywgJ2EnIG9yICd3JyIpCiAgICAgICAgIHJldHVybiBjbHMobmFtZSwgbW9kZSwgZmlsZW9iaiwgKiprd2FyZ3MpCiAKQEAgLTE3MDcsNyArMTcwOSw3IEBACiAgICAgICAgICIiIk9wZW4gZ3ppcCBjb21wcmVzc2VkIHRhciBhcmNoaXZlIG5hbWUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4KICAgICAgICAgICAgQXBwZW5kaW5nIGlzIG5vdCBhbGxvd2VkLgogICAgICAgICAiIiIKLSAgICAgICAgaWYgbGVuKG1vZGUpID4gMSBvciBtb2RlIG5vdCBpbiAicnciOgorICAgICAgICBpZiBtb2RlIG5vdCBpbiAoInIiLCAidyIpOgogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBtdXN0IGJlICdyJyBvciAndyciKQogCiAgICAgICAgIHRyeToKQEAgLTE3MjQsNyArMTcyNiw5IEBACiAgICAgICAgICAgICAgICAgZ3ppcC5HemlwRmlsZShuYW1lLCBtb2RlLCBjb21wcmVzc2xldmVsLCBmaWxlb2JqKSwKICAgICAgICAgICAgICAgICAqKmt3YXJncykKICAgICAgICAgZXhjZXB0IElPRXJyb3I6Ci0gICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IoIm5vdCBhIGd6aXAgZmlsZSIpCisgICAgICAgICAgICBpZiBtb2RlID09ICdyJzoKKyAgICAgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IoIm5vdCBhIGd6aXAgZmlsZSIpCisgICAgICAgICAgICByYWlzZQogICAgICAgICB0Ll9leHRmaWxlb2JqID0gRmFsc2UKICAgICAgICAgcmV0dXJuIHQKIApAQCAtMTczMyw3ICsxNzM3LDcgQEAKICAgICAgICAgIiIiT3BlbiBiemlwMiBjb21wcmVzc2VkIHRhciBhcmNoaXZlIG5hbWUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4KICAgICAgICAgICAgQXBwZW5kaW5nIGlzIG5vdCBhbGxvd2VkLgogICAgICAgICAiIiIKLSAgICAgICAgaWYgbGVuKG1vZGUpID4gMSBvciBtb2RlIG5vdCBpbiAicnciOgorICAgICAgICBpZiBtb2RlIG5vdCBpbiAoInIiLCAidyIpOgogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBtdXN0IGJlICdyJyBvciAndycuIikKIAogICAgICAgICB0cnk6CkBAIC0xNzQ5LDcgKzE3NTMsOSBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICB0ID0gY2xzLnRhcm9wZW4obmFtZSwgbW9kZSwgZmlsZW9iaiwgKiprd2FyZ3MpCiAgICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgRU9GRXJyb3IpOgotICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJub3QgYSBiemlwMiBmaWxlIikKKyAgICAgICAgICAgIGlmIG1vZGUgPT0gJ3InOgorICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcigibm90IGEgYnppcDIgZmlsZSIpCisgICAgICAgICAgICByYWlzZQogICAgICAgICB0Ll9leHRmaWxlb2JqID0gRmFsc2UKICAgICAgICAgcmV0dXJuIHQKIApAQCAtMTk4NSw5ICsxOTkxLDggQEAKIAogICAgICAgICAjIEFwcGVuZCB0aGUgdGFyIGhlYWRlciBhbmQgZGF0YSB0byB0aGUgYXJjaGl2ZS4KICAgICAgICAgaWYgdGFyaW5mby5pc3JlZygpOgotICAgICAgICAgICAgZiA9IGJsdG5fb3BlbihuYW1lLCAicmIiKQotICAgICAgICAgICAgc2VsZi5hZGRmaWxlKHRhcmluZm8sIGYpCi0gICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHdpdGggYmx0bl9vcGVuKG5hbWUsICJyYiIpIGFzIGY6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRmaWxlKHRhcmluZm8sIGYpCiAKICAgICAgICAgZWxpZiB0YXJpbmZvLmlzZGlyKCk6CiAgICAgICAgICAgICBzZWxmLmFkZGZpbGUodGFyaW5mbykKQEAgLTIxOTUsMTAgKzIyMDAsMTEgQEAKICAgICAgICAgIiIiTWFrZSBhIGZpbGUgY2FsbGVkIHRhcmdldHBhdGguCiAgICAgICAgICIiIgogICAgICAgICBzb3VyY2UgPSBzZWxmLmV4dHJhY3RmaWxlKHRhcmluZm8pCi0gICAgICAgIHRhcmdldCA9IGJsdG5fb3Blbih0YXJnZXRwYXRoLCAid2IiKQotICAgICAgICBjb3B5ZmlsZW9iaihzb3VyY2UsIHRhcmdldCkKLSAgICAgICAgc291cmNlLmNsb3NlKCkKLSAgICAgICAgdGFyZ2V0LmNsb3NlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBibHRuX29wZW4odGFyZ2V0cGF0aCwgIndiIikgYXMgdGFyZ2V0OgorICAgICAgICAgICAgICAgIGNvcHlmaWxlb2JqKHNvdXJjZSwgdGFyZ2V0KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc291cmNlLmNsb3NlKCkKIAogICAgIGRlZiBtYWtldW5rbm93bihzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKICAgICAgICAgIiIiTWFrZSBhIGZpbGUgZnJvbSBhIFRhckluZm8gb2JqZWN0IHdpdGggYW4gdW5rbm93biB0eXBlCkBAIC0yMzk1LDcgKzI0MDEsNyBAQAogICAgICAgICAiIiIKICAgICAgICAgaWYgdGFyaW5mby5pc3N5bSgpOgogICAgICAgICAgICAgIyBBbHdheXMgc2VhcmNoIHRoZSBlbnRpcmUgYXJjaGl2ZS4KLSAgICAgICAgICAgIGxpbmtuYW1lID0gb3MucGF0aC5kaXJuYW1lKHRhcmluZm8ubmFtZSkgKyAiLyIgKyB0YXJpbmZvLmxpbmtuYW1lCisgICAgICAgICAgICBsaW5rbmFtZSA9ICIvIi5qb2luKGZpbHRlcihOb25lLCAob3MucGF0aC5kaXJuYW1lKHRhcmluZm8ubmFtZSksIHRhcmluZm8ubGlua25hbWUpKSkKICAgICAgICAgICAgIGxpbWl0ID0gTm9uZQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgIyBTZWFyY2ggdGhlIGFyY2hpdmUgYmVmb3JlIHRoZSBsaW5rLCBiZWNhdXNlIGEgaGFyZCBsaW5rIGlzCkBAIC0yNDYwLDE2ICsyNDY2LDE4IEBACiAgICAgICAgICMgRml4IGZvciBTRiAjMTEwMDQyOTogVW5kZXIgcmFyZSBjaXJjdW1zdGFuY2VzIGl0IGNhbgogICAgICAgICAjIGhhcHBlbiB0aGF0IGdldG1lbWJlcnMoKSBpcyBjYWxsZWQgZHVyaW5nIGl0ZXJhdGlvbiwKICAgICAgICAgIyB3aGljaCB3aWxsIGNhdXNlIFRhckl0ZXIgdG8gc3RvcCBwcmVtYXR1cmVseS4KLSAgICAgICAgaWYgbm90IHNlbGYudGFyZmlsZS5fbG9hZGVkOgorCisgICAgICAgIGlmIHNlbGYuaW5kZXggPT0gMCBhbmQgc2VsZi50YXJmaWxlLmZpcnN0bWVtYmVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyZmlsZS5uZXh0KCkKKyAgICAgICAgZWxpZiBzZWxmLmluZGV4IDwgbGVuKHNlbGYudGFyZmlsZS5tZW1iZXJzKToKKyAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhcmZpbGUubWVtYmVyc1tzZWxmLmluZGV4XQorICAgICAgICBlbGlmIG5vdCBzZWxmLnRhcmZpbGUuX2xvYWRlZDoKICAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhcmZpbGUubmV4dCgpCiAgICAgICAgICAgICBpZiBub3QgdGFyaW5mbzoKICAgICAgICAgICAgICAgICBzZWxmLnRhcmZpbGUuX2xvYWRlZCA9IFRydWUKICAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyZmlsZS5tZW1iZXJzW3NlbGYuaW5kZXhdCi0gICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKLSAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCiAgICAgICAgIHNlbGYuaW5kZXggKz0gMQogICAgICAgICByZXR1cm4gdGFyaW5mbwogCmRpZmYgLS1naXQgYS9MaWIvdGVsbmV0bGliLnB5IGIvTGliL3RlbG5ldGxpYi5weQppbmRleCBiYWU0YWU3Li44OGFhNDgyIDEwMDY0NAotLS0gYS9MaWIvdGVsbmV0bGliLnB5CisrKyBiL0xpYi90ZWxuZXRsaWIucHkKQEAgLTM0LDYgKzM0LDcgQEAKIAogCiAjIEltcG9ydGVkIG1vZHVsZXMKK2ltcG9ydCBlcnJubwogaW1wb3J0IHN5cwogaW1wb3J0IHNvY2tldAogaW1wb3J0IHNlbGVjdApAQCAtMjA1LDYgKzIwNiw3IEBACiAgICAgICAgIHNlbGYuc2IgPSAwICMgZmxhZyBmb3IgU0IgYW5kIFNFIHNlcXVlbmNlLgogICAgICAgICBzZWxmLnNiZGF0YXEgPSAnJwogICAgICAgICBzZWxmLm9wdGlvbl9jYWxsYmFjayA9IE5vbmUKKyAgICAgICAgc2VsZi5faGFzX3BvbGwgPSBoYXNhdHRyKHNlbGVjdCwgJ3BvbGwnKQogICAgICAgICBpZiBob3N0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgc2VsZi5vcGVuKGhvc3QsIHBvcnQsIHRpbWVvdXQpCiAKQEAgLTI4Nyw2ICsyODksNjMgQEAKICAgICAgICAgaXMgY2xvc2VkIGFuZCBubyBjb29rZWQgZGF0YSBpcyBhdmFpbGFibGUuCiAKICAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX2hhc19wb2xsOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWRfdW50aWxfd2l0aF9wb2xsKG1hdGNoLCB0aW1lb3V0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWRfdW50aWxfd2l0aF9zZWxlY3QobWF0Y2gsIHRpbWVvdXQpCisKKyAgICBkZWYgX3JlYWRfdW50aWxfd2l0aF9wb2xsKHNlbGYsIG1hdGNoLCB0aW1lb3V0KToKKyAgICAgICAgIiIiUmVhZCB1bnRpbCBhIGdpdmVuIHN0cmluZyBpcyBlbmNvdW50ZXJlZCBvciB1bnRpbCB0aW1lb3V0LgorCisgICAgICAgIFRoaXMgbWV0aG9kIHVzZXMgc2VsZWN0LnBvbGwoKSB0byBpbXBsZW1lbnQgdGhlIHRpbWVvdXQuCisgICAgICAgICIiIgorICAgICAgICBuID0gbGVuKG1hdGNoKQorICAgICAgICBjYWxsX3RpbWVvdXQgPSB0aW1lb3V0CisgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBmcm9tIHRpbWUgaW1wb3J0IHRpbWUKKyAgICAgICAgICAgIHRpbWVfc3RhcnQgPSB0aW1lKCkKKyAgICAgICAgc2VsZi5wcm9jZXNzX3Jhd3EoKQorICAgICAgICBpID0gc2VsZi5jb29rZWRxLmZpbmQobWF0Y2gpCisgICAgICAgIGlmIGkgPCAwOgorICAgICAgICAgICAgcG9sbGVyID0gc2VsZWN0LnBvbGwoKQorICAgICAgICAgICAgcG9sbF9pbl9vcl9wcmlvcml0eV9mbGFncyA9IHNlbGVjdC5QT0xMSU4gfCBzZWxlY3QuUE9MTFBSSQorICAgICAgICAgICAgcG9sbGVyLnJlZ2lzdGVyKHNlbGYsIHBvbGxfaW5fb3JfcHJpb3JpdHlfZmxhZ3MpCisgICAgICAgICAgICB3aGlsZSBpIDwgMCBhbmQgbm90IHNlbGYuZW9mOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgIyBQb2xsIHRha2VzIGl0cyB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy4KKyAgICAgICAgICAgICAgICAgICAgcmVhZHkgPSBwb2xsZXIucG9sbChOb25lIGlmIHRpbWVvdXQgaXMgTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgMTAwMCAqIGNhbGxfdGltZW91dCkKKyAgICAgICAgICAgICAgICBleGNlcHQgc2VsZWN0LmVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRUlOVFI6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWQgPSB0aW1lKCkgLSB0aW1lX3N0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbF90aW1lb3V0ID0gdGltZW91dC1lbGFwc2VkCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIGZvciBmZCwgbW9kZSBpbiByZWFkeToKKyAgICAgICAgICAgICAgICAgICAgaWYgbW9kZSAmIHBvbGxfaW5fb3JfcHJpb3JpdHlfZmxhZ3M6CisgICAgICAgICAgICAgICAgICAgICAgICBpID0gbWF4KDAsIGxlbihzZWxmLmNvb2tlZHEpLW4pCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGxfcmF3cSgpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NfcmF3cSgpCisgICAgICAgICAgICAgICAgICAgICAgICBpID0gc2VsZi5jb29rZWRxLmZpbmQobWF0Y2gsIGkpCisgICAgICAgICAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgZWxhcHNlZCA9IHRpbWUoKSAtIHRpbWVfc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgaWYgZWxhcHNlZCA+PSB0aW1lb3V0OgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgY2FsbF90aW1lb3V0ID0gdGltZW91dC1lbGFwc2VkCisgICAgICAgICAgICBwb2xsZXIudW5yZWdpc3RlcihzZWxmKQorICAgICAgICBpZiBpID49IDA6CisgICAgICAgICAgICBpID0gaSArIG4KKyAgICAgICAgICAgIGJ1ZiA9IHNlbGYuY29va2VkcVs6aV0KKyAgICAgICAgICAgIHNlbGYuY29va2VkcSA9IHNlbGYuY29va2VkcVtpOl0KKyAgICAgICAgICAgIHJldHVybiBidWYKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZF92ZXJ5X2xhenkoKQorCisgICAgZGVmIF9yZWFkX3VudGlsX3dpdGhfc2VsZWN0KHNlbGYsIG1hdGNoLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICAiIiJSZWFkIHVudGlsIGEgZ2l2ZW4gc3RyaW5nIGlzIGVuY291bnRlcmVkIG9yIHVudGlsIHRpbWVvdXQuCisKKyAgICAgICAgVGhlIHRpbWVvdXQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgc2VsZWN0LnNlbGVjdCgpLgorICAgICAgICAiIiIKICAgICAgICAgbiA9IGxlbihtYXRjaCkKICAgICAgICAgc2VsZi5wcm9jZXNzX3Jhd3EoKQogICAgICAgICBpID0gc2VsZi5jb29rZWRxLmZpbmQobWF0Y2gpCkBAIC01ODksNiArNjQ4LDgwIEBACiAgICAgICAgIHJlc3VsdHMgYXJlIHVuZGV0ZXJtaW5pc3RpYywgYW5kIG1heSBkZXBlbmQgb24gdGhlIEkvTyB0aW1pbmcuCiAKICAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX2hhc19wb2xsOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2V4cGVjdF93aXRoX3BvbGwobGlzdCwgdGltZW91dCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9leHBlY3Rfd2l0aF9zZWxlY3QobGlzdCwgdGltZW91dCkKKworICAgIGRlZiBfZXhwZWN0X3dpdGhfcG9sbChzZWxmLCBleHBlY3RfbGlzdCwgdGltZW91dD1Ob25lKToKKyAgICAgICAgIiIiUmVhZCB1bnRpbCBvbmUgZnJvbSBhIGxpc3Qgb2YgYSByZWd1bGFyIGV4cHJlc3Npb25zIG1hdGNoZXMuCisKKyAgICAgICAgVGhpcyBtZXRob2QgdXNlcyBzZWxlY3QucG9sbCgpIHRvIGltcGxlbWVudCB0aGUgdGltZW91dC4KKyAgICAgICAgIiIiCisgICAgICAgIHJlID0gTm9uZQorICAgICAgICBleHBlY3RfbGlzdCA9IGV4cGVjdF9saXN0WzpdCisgICAgICAgIGluZGljZXMgPSByYW5nZShsZW4oZXhwZWN0X2xpc3QpKQorICAgICAgICBmb3IgaSBpbiBpbmRpY2VzOgorICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoZXhwZWN0X2xpc3RbaV0sICJzZWFyY2giKToKKyAgICAgICAgICAgICAgICBpZiBub3QgcmU6IGltcG9ydCByZQorICAgICAgICAgICAgICAgIGV4cGVjdF9saXN0W2ldID0gcmUuY29tcGlsZShleHBlY3RfbGlzdFtpXSkKKyAgICAgICAgY2FsbF90aW1lb3V0ID0gdGltZW91dAorICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZnJvbSB0aW1lIGltcG9ydCB0aW1lCisgICAgICAgICAgICB0aW1lX3N0YXJ0ID0gdGltZSgpCisgICAgICAgIHNlbGYucHJvY2Vzc19yYXdxKCkKKyAgICAgICAgbSA9IE5vbmUKKyAgICAgICAgZm9yIGkgaW4gaW5kaWNlczoKKyAgICAgICAgICAgIG0gPSBleHBlY3RfbGlzdFtpXS5zZWFyY2goc2VsZi5jb29rZWRxKQorICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICBlID0gbS5lbmQoKQorICAgICAgICAgICAgICAgIHRleHQgPSBzZWxmLmNvb2tlZHFbOmVdCisgICAgICAgICAgICAgICAgc2VsZi5jb29rZWRxID0gc2VsZi5jb29rZWRxW2U6XQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIG5vdCBtOgorICAgICAgICAgICAgcG9sbGVyID0gc2VsZWN0LnBvbGwoKQorICAgICAgICAgICAgcG9sbF9pbl9vcl9wcmlvcml0eV9mbGFncyA9IHNlbGVjdC5QT0xMSU4gfCBzZWxlY3QuUE9MTFBSSQorICAgICAgICAgICAgcG9sbGVyLnJlZ2lzdGVyKHNlbGYsIHBvbGxfaW5fb3JfcHJpb3JpdHlfZmxhZ3MpCisgICAgICAgICAgICB3aGlsZSBub3QgbSBhbmQgbm90IHNlbGYuZW9mOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmVhZHkgPSBwb2xsZXIucG9sbChOb25lIGlmIHRpbWVvdXQgaXMgTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgMTAwMCAqIGNhbGxfdGltZW91dCkKKyAgICAgICAgICAgICAgICBleGNlcHQgc2VsZWN0LmVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRUlOVFI6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWQgPSB0aW1lKCkgLSB0aW1lX3N0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbF90aW1lb3V0ID0gdGltZW91dC1lbGFwc2VkCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIGZvciBmZCwgbW9kZSBpbiByZWFkeToKKyAgICAgICAgICAgICAgICAgICAgaWYgbW9kZSAmIHBvbGxfaW5fb3JfcHJpb3JpdHlfZmxhZ3M6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGxfcmF3cSgpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NfcmF3cSgpCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiBpbmRpY2VzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBleHBlY3RfbGlzdFtpXS5zZWFyY2goc2VsZi5jb29rZWRxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBtLmVuZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBzZWxmLmNvb2tlZHFbOmVdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29va2VkcSA9IHNlbGYuY29va2VkcVtlOl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBlbGFwc2VkID0gdGltZSgpIC0gdGltZV9zdGFydAorICAgICAgICAgICAgICAgICAgICBpZiBlbGFwc2VkID49IHRpbWVvdXQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBjYWxsX3RpbWVvdXQgPSB0aW1lb3V0LWVsYXBzZWQKKyAgICAgICAgICAgIHBvbGxlci51bnJlZ2lzdGVyKHNlbGYpCisgICAgICAgIGlmIG06CisgICAgICAgICAgICByZXR1cm4gKGksIG0sIHRleHQpCisgICAgICAgIHRleHQgPSBzZWxmLnJlYWRfdmVyeV9sYXp5KCkKKyAgICAgICAgaWYgbm90IHRleHQgYW5kIHNlbGYuZW9mOgorICAgICAgICAgICAgcmFpc2UgRU9GRXJyb3IKKyAgICAgICAgcmV0dXJuICgtMSwgTm9uZSwgdGV4dCkKKworICAgIGRlZiBfZXhwZWN0X3dpdGhfc2VsZWN0KHNlbGYsIGxpc3QsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgICIiIlJlYWQgdW50aWwgb25lIGZyb20gYSBsaXN0IG9mIGEgcmVndWxhciBleHByZXNzaW9ucyBtYXRjaGVzLgorCisgICAgICAgIFRoZSB0aW1lb3V0IGlzIGltcGxlbWVudGVkIHVzaW5nIHNlbGVjdC5zZWxlY3QoKS4KKyAgICAgICAgIiIiCiAgICAgICAgIHJlID0gTm9uZQogICAgICAgICBsaXN0ID0gbGlzdFs6XQogICAgICAgICBpbmRpY2VzID0gcmFuZ2UobGVuKGxpc3QpKQpkaWZmIC0tZ2l0IGEvTGliL3RlbXBmaWxlLnB5IGIvTGliL3RlbXBmaWxlLnB5CmluZGV4IDIwMjMyODAuLmMzMjQ2ZTUgMTAwNjQ0Ci0tLSBhL0xpYi90ZW1wZmlsZS5weQorKysgYi9MaWIvdGVtcGZpbGUucHkKQEAgLTI5LDYgKzI5LDcgQEAKIAogIyBJbXBvcnRzLgogCitpbXBvcnQgaW8gYXMgX2lvCiBpbXBvcnQgb3MgYXMgX29zCiBpbXBvcnQgZXJybm8gYXMgX2Vycm5vCiBmcm9tIHJhbmRvbSBpbXBvcnQgUmFuZG9tIGFzIF9SYW5kb20KQEAgLTE5MywxNSArMTk0LDE4IEBACiAgICAgICAgICAgICBuYW1lID0gbmFtZXIubmV4dCgpCiAgICAgICAgICAgICBmaWxlbmFtZSA9IF9vcy5wYXRoLmpvaW4oZGlyLCBuYW1lKQogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGZkID0gX29zLm9wZW4oZmlsZW5hbWUsIGZsYWdzLCAwNjAwKQotICAgICAgICAgICAgICAgIGZwID0gX29zLmZkb3BlbihmZCwgJ3cnKQotICAgICAgICAgICAgICAgIGZwLndyaXRlKCdibGF0JykKLSAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCi0gICAgICAgICAgICAgICAgX29zLnVubGluayhmaWxlbmFtZSkKLSAgICAgICAgICAgICAgICBkZWwgZnAsIGZkCisgICAgICAgICAgICAgICAgZmQgPSBfb3Mub3BlbihmaWxlbmFtZSwgZmxhZ3MsIDBvNjAwKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBfaW8ub3BlbihmZCwgJ3diJywgY2xvc2VmZD1GYWxzZSkgYXMgZnA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnAud3JpdGUoYidibGF0JykKKyAgICAgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgICAgIF9vcy5jbG9zZShmZCkKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICBfb3MudW5saW5rKGZpbGVuYW1lKQogICAgICAgICAgICAgICAgIHJldHVybiBkaXIKLSAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvciksIGU6Ci0gICAgICAgICAgICAgICAgaWYgZVswXSAhPSBfZXJybm8uRUVYSVNUOgorICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKSBhcyBlOgorICAgICAgICAgICAgICAgIGlmIGUuYXJnc1swXSAhPSBfZXJybm8uRUVYSVNUOgogICAgICAgICAgICAgICAgICAgICBicmVhayAjIG5vIHBvaW50IHRyeWluZyBtb3JlIG5hbWVzIGluIHRoaXMgZGlyZWN0b3J5CiAgICAgICAgICAgICAgICAgcGFzcwogICAgIHJhaXNlIElPRXJyb3IsIChfZXJybm8uRU5PRU5ULApAQCAtMjM4LDYgKzI0MiwxMCBAQAogICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKICAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gX2Vycm5vLkVFWElTVDoKICAgICAgICAgICAgICAgICBjb250aW51ZSAjIHRyeSBhZ2FpbgorICAgICAgICAgICAgaWYgX29zLm5hbWUgPT0gJ250JyBhbmQgZS5lcnJubyA9PSBfZXJybm8uRUFDQ0VTOgorICAgICAgICAgICAgICAgICMgT24gd2luZG93cywgd2hlbiBhIGRpcmVjdG9yeSB3aXRoIHRoZSBjaG9zZW4gbmFtZSBhbHJlYWR5CisgICAgICAgICAgICAgICAgIyBleGlzdHMsIEVBQ0NFUyBlcnJvciBjb2RlIGlzIHJldHVybmVkIGluc3RlYWQgb2YgRUVYSVNULgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICByYWlzZQogCiAgICAgcmFpc2UgSU9FcnJvciwgKF9lcnJuby5FRVhJU1QsICJObyB1c2FibGUgdGVtcG9yYXJ5IGZpbGUgbmFtZSBmb3VuZCIpCkBAIC00NTIsOCArNDYwLDEyIEBACiAgICAgICAgIGZsYWdzIHw9IF9vcy5PX1RFTVBPUkFSWQogCiAgICAgKGZkLCBuYW1lKSA9IF9ta3N0ZW1wX2lubmVyKGRpciwgcHJlZml4LCBzdWZmaXgsIGZsYWdzKQotICAgIGZpbGUgPSBfb3MuZmRvcGVuKGZkLCBtb2RlLCBidWZzaXplKQotICAgIHJldHVybiBfVGVtcG9yYXJ5RmlsZVdyYXBwZXIoZmlsZSwgbmFtZSwgZGVsZXRlKQorICAgIHRyeToKKyAgICAgICAgZmlsZSA9IF9vcy5mZG9wZW4oZmQsIG1vZGUsIGJ1ZnNpemUpCisgICAgICAgIHJldHVybiBfVGVtcG9yYXJ5RmlsZVdyYXBwZXIoZmlsZSwgbmFtZSwgZGVsZXRlKQorICAgIGV4Y2VwdDoKKyAgICAgICAgX29zLmNsb3NlKGZkKQorICAgICAgICByYWlzZQogCiBpZiBfb3MubmFtZSAhPSAncG9zaXgnIG9yIF9vcy5zeXMucGxhdGZvcm0gPT0gJ2N5Z3dpbic6CiAgICAgIyBPbiBub24tUE9TSVggYW5kIEN5Z3dpbiBzeXN0ZW1zLCBhc3N1bWUgdGhhdCB3ZSBjYW5ub3QgdW5saW5rIGEgZmlsZQpAQCAtNTQ2LDEwICs1NTgsNiBAQAogICAgIGRlZiBjbG9zZWQoc2VsZik6CiAgICAgICAgIHJldHVybiBzZWxmLl9maWxlLmNsb3NlZAogCi0gICAgQHByb3BlcnR5Ci0gICAgZGVmIGVuY29kaW5nKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fZmlsZS5lbmNvZGluZwotCiAgICAgZGVmIGZpbGVubyhzZWxmKToKICAgICAgICAgc2VsZi5yb2xsb3ZlcigpCiAgICAgICAgIHJldHVybiBzZWxmLl9maWxlLmZpbGVubygpCkBAIC01NjIsMTUgKzU3MCwxNyBAQAogCiAgICAgQHByb3BlcnR5CiAgICAgZGVmIG1vZGUoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLl9maWxlLm1vZGUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGUubW9kZQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fVGVtcG9yYXJ5RmlsZUFyZ3NbMF0KIAogICAgIEBwcm9wZXJ0eQogICAgIGRlZiBuYW1lKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fZmlsZS5uYW1lCi0KLSAgICBAcHJvcGVydHkKLSAgICBkZWYgbmV3bGluZXMoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLl9maWxlLm5ld2xpbmVzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9maWxlLm5hbWUKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKIAogICAgIGRlZiBuZXh0KHNlbGYpOgogICAgICAgICByZXR1cm4gc2VsZi5fZmlsZS5uZXh0CkBAIC02MTAsNCArNjIwLDcgQEAKICAgICAgICAgcmV0dXJuIHJ2CiAKICAgICBkZWYgeHJlYWRsaW5lcyhzZWxmLCAqYXJncyk6Ci0gICAgICAgIHJldHVybiBzZWxmLl9maWxlLnhyZWFkbGluZXMoKmFyZ3MpCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5fZmlsZSwgJ3hyZWFkbGluZXMnKTogICMgcmVhbCBmaWxlCisgICAgICAgICAgICByZXR1cm4gaXRlcihzZWxmLl9maWxlKQorICAgICAgICBlbHNlOiAgIyBTdHJpbmdJTygpCisgICAgICAgICAgICByZXR1cm4gaXRlcihzZWxmLl9maWxlLnJlYWRsaW5lcygqYXJncykpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9hdWRpb2RhdGEvcGx1Y2stcGNtMTYuYWlmZiBiL0xpYi90ZXN0L2F1ZGlvZGF0YS9wbHVjay1wY20xNi5haWZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOGM0MGQKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9hdWRpb2RhdGEvcGx1Y2stcGNtMTYuYWlmZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9hdWRpb2RhdGEvcGx1Y2stcGNtMTYuYXUgYi9MaWIvdGVzdC9hdWRpb2RhdGEvcGx1Y2stcGNtMTYuYXUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk4ZjA3ZgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2F1ZGlvZGF0YS9wbHVjay1wY20xNi5hdQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9hdWRpb2RhdGEvcGx1Y2stcGNtMTYud2F2IGIvTGliL3Rlc3QvYXVkaW9kYXRhL3BsdWNrLXBjbTE2LndhdgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjg2MjdkCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvYXVkaW9kYXRhL3BsdWNrLXBjbTE2LndhdgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9hdWRpb2RhdGEvcGx1Y2stcGNtMjQuYWlmZiBiL0xpYi90ZXN0L2F1ZGlvZGF0YS9wbHVjay1wY20yNC5haWZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYmExNDUKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9hdWRpb2RhdGEvcGx1Y2stcGNtMjQuYWlmZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9hdWRpb2RhdGEvcGx1Y2stcGNtMjQud2F2IGIvTGliL3Rlc3QvYXVkaW9kYXRhL3BsdWNrLXBjbTI0LndhdgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGQ5MmMzCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvYXVkaW9kYXRhL3BsdWNrLXBjbTI0LndhdgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9hdWRpb2RhdGEvcGx1Y2stcGNtMzIuYWlmZiBiL0xpYi90ZXN0L2F1ZGlvZGF0YS9wbHVjay1wY20zMi5haWZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YWMwMzcKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9hdWRpb2RhdGEvcGx1Y2stcGNtMzIuYWlmZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9hdWRpb2RhdGEvcGx1Y2stcGNtMzIuYXUgYi9MaWIvdGVzdC9hdWRpb2RhdGEvcGx1Y2stcGNtMzIuYXUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJlZTU5NgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2F1ZGlvZGF0YS9wbHVjay1wY20zMi5hdQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9hdWRpb2RhdGEvcGx1Y2stcGNtMzIud2F2IGIvTGliL3Rlc3QvYXVkaW9kYXRhL3BsdWNrLXBjbTMyLndhdgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDY2MjhiCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvYXVkaW9kYXRhL3BsdWNrLXBjbTMyLndhdgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9hdWRpb2RhdGEvcGx1Y2stcGNtOC5haWZmIGIvTGliL3Rlc3QvYXVkaW9kYXRhL3BsdWNrLXBjbTguYWlmZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGU0ZjNiCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvYXVkaW9kYXRhL3BsdWNrLXBjbTguYWlmZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9hdWRpb2RhdGEvcGx1Y2stcGNtOC5hdSBiL0xpYi90ZXN0L2F1ZGlvZGF0YS9wbHVjay1wY204LmF1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MTcyYzgKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9hdWRpb2RhdGEvcGx1Y2stcGNtOC5hdQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9hdWRpb2RhdGEvcGx1Y2stcGNtOC53YXYgYi9MaWIvdGVzdC9hdWRpb2RhdGEvcGx1Y2stcGNtOC53YXYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIyOGNiOAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2F1ZGlvZGF0YS9wbHVjay1wY204LndhdgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9hdWRpb2RhdGEvcGx1Y2stdWxhdy5haWZjIGIvTGliL3Rlc3QvYXVkaW9kYXRhL3BsdWNrLXVsYXcuYWlmYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDg1Y2YwCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvYXVkaW9kYXRhL3BsdWNrLXVsYXcuYWlmYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9hdWRpb2RhdGEvcGx1Y2stdWxhdy5hdSBiL0xpYi90ZXN0L2F1ZGlvZGF0YS9wbHVjay11bGF3LmF1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMTAzNTMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9hdWRpb2RhdGEvcGx1Y2stdWxhdy5hdQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9hdWRpb3Rlc3RzLnB5IGIvTGliL3Rlc3QvYXVkaW90ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGFiZDJhCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvYXVkaW90ZXN0cy5weQpAQCAtMCwwICsxLDI4MyBAQAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgZmluZGZpbGUsIFRFU1RGTiwgdW5saW5rCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBhcnJheQoraW1wb3J0IGlvCitpbXBvcnQgcGlja2xlCitpbXBvcnQgc3lzCitpbXBvcnQgYmFzZTY0CisKK2NsYXNzIFVuc2Vla2FibGVJTyhmaWxlKToKKyAgICBkZWYgdGVsbChzZWxmKToKKyAgICAgICAgcmFpc2UgaW8uVW5zdXBwb3J0ZWRPcGVyYXRpb24KKworICAgIGRlZiBzZWVrKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJhaXNlIGlvLlVuc3VwcG9ydGVkT3BlcmF0aW9uCisKK2RlZiBmcm9taGV4KHMpOgorICAgIHJldHVybiBiYXNlNjQuYjE2ZGVjb2RlKHMucmVwbGFjZSgnICcsICcnKSkKKworZGVmIGJ5dGVzd2FwMihkYXRhKToKKyAgICBhID0gYXJyYXkuYXJyYXkoJ2gnKQorICAgIGEuZnJvbXN0cmluZyhkYXRhKQorICAgIGEuYnl0ZXN3YXAoKQorICAgIHJldHVybiBhLnRvc3RyaW5nKCkKKworZGVmIGJ5dGVzd2FwMyhkYXRhKToKKyAgICBiYSA9IGJ5dGVhcnJheShkYXRhKQorICAgIGJhWzo6M10gPSBkYXRhWzI6OjNdCisgICAgYmFbMjo6M10gPSBkYXRhWzo6M10KKyAgICByZXR1cm4gYnl0ZXMoYmEpCisKK2RlZiBieXRlc3dhcDQoZGF0YSk6CisgICAgYSA9IGFycmF5LmFycmF5KCdpJykKKyAgICBhLmZyb21zdHJpbmcoZGF0YSkKKyAgICBhLmJ5dGVzd2FwKCkKKyAgICByZXR1cm4gYS50b3N0cmluZygpCisKKworY2xhc3MgQXVkaW9UZXN0czoKKyAgICBjbG9zZV9mZCA9IEZhbHNlCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZiA9IHNlbGYuZm91dCA9IE5vbmUKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5mIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5mLmNsb3NlKCkKKyAgICAgICAgaWYgc2VsZi5mb3V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5mb3V0LmNsb3NlKCkKKyAgICAgICAgdW5saW5rKFRFU1RGTikKKworICAgIGRlZiBjaGVja19wYXJhbXMoc2VsZiwgZiwgbmNoYW5uZWxzLCBzYW1wd2lkdGgsIGZyYW1lcmF0ZSwgbmZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbXB0eXBlLCBjb21wbmFtZSk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5nZXRuY2hhbm5lbHMoKSwgbmNoYW5uZWxzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZ2V0c2FtcHdpZHRoKCksIHNhbXB3aWR0aCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmdldGZyYW1lcmF0ZSgpLCBmcmFtZXJhdGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5nZXRuZnJhbWVzKCksIG5mcmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5nZXRjb21wdHlwZSgpLCBjb21wdHlwZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmdldGNvbXBuYW1lKCksIGNvbXBuYW1lKQorCisgICAgICAgIHBhcmFtcyA9IGYuZ2V0cGFyYW1zKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJhbXMsCisgICAgICAgICAgICAgICAgKG5jaGFubmVscywgc2FtcHdpZHRoLCBmcmFtZXJhdGUsIG5mcmFtZXMsIGNvbXB0eXBlLCBjb21wbmFtZSkpCisKKyAgICAgICAgZHVtcCA9IHBpY2tsZS5kdW1wcyhwYXJhbXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGlja2xlLmxvYWRzKGR1bXApLCBwYXJhbXMpCisKKworY2xhc3MgQXVkaW9Xcml0ZVRlc3RzKEF1ZGlvVGVzdHMpOgorCisgICAgZGVmIGNyZWF0ZV9maWxlKHNlbGYsIHRlc3RmaWxlKToKKyAgICAgICAgZiA9IHNlbGYuZm91dCA9IHNlbGYubW9kdWxlLm9wZW4odGVzdGZpbGUsICd3YicpCisgICAgICAgIGYuc2V0bmNoYW5uZWxzKHNlbGYubmNoYW5uZWxzKQorICAgICAgICBmLnNldHNhbXB3aWR0aChzZWxmLnNhbXB3aWR0aCkKKyAgICAgICAgZi5zZXRmcmFtZXJhdGUoc2VsZi5mcmFtZXJhdGUpCisgICAgICAgIGYuc2V0Y29tcHR5cGUoc2VsZi5jb21wdHlwZSwgc2VsZi5jb21wbmFtZSkKKyAgICAgICAgcmV0dXJuIGYKKworICAgIGRlZiBjaGVja19maWxlKHNlbGYsIHRlc3RmaWxlLCBuZnJhbWVzLCBmcmFtZXMpOgorICAgICAgICBmID0gc2VsZi5tb2R1bGUub3Blbih0ZXN0ZmlsZSwgJ3JiJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmdldG5jaGFubmVscygpLCBzZWxmLm5jaGFubmVscykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5nZXRzYW1wd2lkdGgoKSwgc2VsZi5zYW1wd2lkdGgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZ2V0ZnJhbWVyYXRlKCksIHNlbGYuZnJhbWVyYXRlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmdldG5mcmFtZXMoKSwgbmZyYW1lcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkZnJhbWVzKG5mcmFtZXMpLCBmcmFtZXMpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X3dyaXRlX3BhcmFtcyhzZWxmKToKKyAgICAgICAgZiA9IHNlbGYuY3JlYXRlX2ZpbGUoVEVTVEZOKQorICAgICAgICBmLnNldG5mcmFtZXMoc2VsZi5uZnJhbWVzKQorICAgICAgICBmLndyaXRlZnJhbWVzKHNlbGYuZnJhbWVzKQorICAgICAgICBzZWxmLmNoZWNrX3BhcmFtcyhmLCBzZWxmLm5jaGFubmVscywgc2VsZi5zYW1wd2lkdGgsIHNlbGYuZnJhbWVyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5mcmFtZXMsIHNlbGYuY29tcHR5cGUsIHNlbGYuY29tcG5hbWUpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIHRlc3Rfd3JpdGUoc2VsZik6CisgICAgICAgIGYgPSBzZWxmLmNyZWF0ZV9maWxlKFRFU1RGTikKKyAgICAgICAgZi5zZXRuZnJhbWVzKHNlbGYubmZyYW1lcykKKyAgICAgICAgZi53cml0ZWZyYW1lcyhzZWxmLmZyYW1lcykKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgc2VsZi5jaGVja19maWxlKFRFU1RGTiwgc2VsZi5uZnJhbWVzLCBzZWxmLmZyYW1lcykKKworICAgIGRlZiB0ZXN0X2luY29tcGxldGVkX3dyaXRlKHNlbGYpOgorICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAnd2InKSBhcyB0ZXN0ZmlsZToKKyAgICAgICAgICAgIHRlc3RmaWxlLndyaXRlKGInYWJhYmFnYWxhbWFnYScpCisgICAgICAgICAgICBmID0gc2VsZi5jcmVhdGVfZmlsZSh0ZXN0ZmlsZSkKKyAgICAgICAgICAgIGYuc2V0bmZyYW1lcyhzZWxmLm5mcmFtZXMgKyAxKQorICAgICAgICAgICAgZi53cml0ZWZyYW1lcyhzZWxmLmZyYW1lcykKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIHdpdGggb3BlbihURVNURk4sICdyYicpIGFzIHRlc3RmaWxlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0ZmlsZS5yZWFkKDEzKSwgYidhYmFiYWdhbGFtYWdhJykKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfZmlsZSh0ZXN0ZmlsZSwgc2VsZi5uZnJhbWVzLCBzZWxmLmZyYW1lcykKKworICAgIGRlZiB0ZXN0X211bHRpcGxlX3dyaXRlcyhzZWxmKToKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgJ3diJykgYXMgdGVzdGZpbGU6CisgICAgICAgICAgICB0ZXN0ZmlsZS53cml0ZShiJ2FiYWJhZ2FsYW1hZ2EnKQorICAgICAgICAgICAgZiA9IHNlbGYuY3JlYXRlX2ZpbGUodGVzdGZpbGUpCisgICAgICAgICAgICBmLnNldG5mcmFtZXMoc2VsZi5uZnJhbWVzKQorICAgICAgICAgICAgZnJhbWVzaXplID0gc2VsZi5uY2hhbm5lbHMgKiBzZWxmLnNhbXB3aWR0aAorICAgICAgICAgICAgZi53cml0ZWZyYW1lcyhzZWxmLmZyYW1lc1s6LWZyYW1lc2l6ZV0pCisgICAgICAgICAgICBmLndyaXRlZnJhbWVzKHNlbGYuZnJhbWVzWy1mcmFtZXNpemU6XSkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIHdpdGggb3BlbihURVNURk4sICdyYicpIGFzIHRlc3RmaWxlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0ZmlsZS5yZWFkKDEzKSwgYidhYmFiYWdhbGFtYWdhJykKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfZmlsZSh0ZXN0ZmlsZSwgc2VsZi5uZnJhbWVzLCBzZWxmLmZyYW1lcykKKworICAgIGRlZiB0ZXN0X292ZXJmbG93ZWRfd3JpdGUoc2VsZik6CisgICAgICAgIHdpdGggb3BlbihURVNURk4sICd3YicpIGFzIHRlc3RmaWxlOgorICAgICAgICAgICAgdGVzdGZpbGUud3JpdGUoYidhYmFiYWdhbGFtYWdhJykKKyAgICAgICAgICAgIGYgPSBzZWxmLmNyZWF0ZV9maWxlKHRlc3RmaWxlKQorICAgICAgICAgICAgZi5zZXRuZnJhbWVzKHNlbGYubmZyYW1lcyAtIDEpCisgICAgICAgICAgICBmLndyaXRlZnJhbWVzKHNlbGYuZnJhbWVzKQorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgJ3JiJykgYXMgdGVzdGZpbGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RmaWxlLnJlYWQoMTMpLCBiJ2FiYWJhZ2FsYW1hZ2EnKQorICAgICAgICAgICAgc2VsZi5jaGVja19maWxlKHRlc3RmaWxlLCBzZWxmLm5mcmFtZXMsIHNlbGYuZnJhbWVzKQorCisgICAgZGVmIHRlc3RfdW5zZWVrYWJsZV9yZWFkKHNlbGYpOgorICAgICAgICBmID0gc2VsZi5jcmVhdGVfZmlsZShURVNURk4pCisgICAgICAgIGYuc2V0bmZyYW1lcyhzZWxmLm5mcmFtZXMpCisgICAgICAgIGYud3JpdGVmcmFtZXMoc2VsZi5mcmFtZXMpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIHdpdGggVW5zZWVrYWJsZUlPKFRFU1RGTiwgJ3JiJykgYXMgdGVzdGZpbGU6CisgICAgICAgICAgICBzZWxmLmNoZWNrX2ZpbGUodGVzdGZpbGUsIHNlbGYubmZyYW1lcywgc2VsZi5mcmFtZXMpCisKKyAgICBkZWYgdGVzdF91bnNlZWthYmxlX3dyaXRlKHNlbGYpOgorICAgICAgICB3aXRoIFVuc2Vla2FibGVJTyhURVNURk4sICd3YicpIGFzIHRlc3RmaWxlOgorICAgICAgICAgICAgZiA9IHNlbGYuY3JlYXRlX2ZpbGUodGVzdGZpbGUpCisgICAgICAgICAgICBmLnNldG5mcmFtZXMoc2VsZi5uZnJhbWVzKQorICAgICAgICAgICAgZi53cml0ZWZyYW1lcyhzZWxmLmZyYW1lcykKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5mb3V0ID0gTm9uZQorCisgICAgICAgIHNlbGYuY2hlY2tfZmlsZShURVNURk4sIHNlbGYubmZyYW1lcywgc2VsZi5mcmFtZXMpCisKKyAgICBkZWYgdGVzdF91bnNlZWthYmxlX2luY29tcGxldGVkX3dyaXRlKHNlbGYpOgorICAgICAgICB3aXRoIFVuc2Vla2FibGVJTyhURVNURk4sICd3YicpIGFzIHRlc3RmaWxlOgorICAgICAgICAgICAgdGVzdGZpbGUud3JpdGUoYidhYmFiYWdhbGFtYWdhJykKKyAgICAgICAgICAgIGYgPSBzZWxmLmNyZWF0ZV9maWxlKHRlc3RmaWxlKQorICAgICAgICAgICAgZi5zZXRuZnJhbWVzKHNlbGYubmZyYW1lcyArIDEpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZi53cml0ZWZyYW1lcyhzZWxmLmZyYW1lcykKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAncmInKSBhcyB0ZXN0ZmlsZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdGZpbGUucmVhZCgxMyksIGInYWJhYmFnYWxhbWFnYScpCisgICAgICAgICAgICBzZWxmLmNoZWNrX2ZpbGUodGVzdGZpbGUsIHNlbGYubmZyYW1lcyArIDEsIHNlbGYuZnJhbWVzKQorCisgICAgZGVmIHRlc3RfdW5zZWVrYWJsZV9vdmVyZmxvd2VkX3dyaXRlKHNlbGYpOgorICAgICAgICB3aXRoIFVuc2Vla2FibGVJTyhURVNURk4sICd3YicpIGFzIHRlc3RmaWxlOgorICAgICAgICAgICAgdGVzdGZpbGUud3JpdGUoYidhYmFiYWdhbGFtYWdhJykKKyAgICAgICAgICAgIGYgPSBzZWxmLmNyZWF0ZV9maWxlKHRlc3RmaWxlKQorICAgICAgICAgICAgZi5zZXRuZnJhbWVzKHNlbGYubmZyYW1lcyAtIDEpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZi53cml0ZWZyYW1lcyhzZWxmLmZyYW1lcykKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAncmInKSBhcyB0ZXN0ZmlsZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdGZpbGUucmVhZCgxMyksIGInYWJhYmFnYWxhbWFnYScpCisgICAgICAgICAgICBmcmFtZXNpemUgPSBzZWxmLm5jaGFubmVscyAqIHNlbGYuc2FtcHdpZHRoCisgICAgICAgICAgICBzZWxmLmNoZWNrX2ZpbGUodGVzdGZpbGUsIHNlbGYubmZyYW1lcyAtIDEsIHNlbGYuZnJhbWVzWzotZnJhbWVzaXplXSkKKworCitjbGFzcyBBdWRpb1Rlc3RzV2l0aFNvdXJjZUZpbGUoQXVkaW9UZXN0cyk6CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICBjbHMuc25kZmlsZXBhdGggPSBmaW5kZmlsZShjbHMuc25kZmlsZW5hbWUsIHN1YmRpcj0nYXVkaW9kYXRhJykKKworICAgIGRlZiB0ZXN0X3JlYWRfcGFyYW1zKHNlbGYpOgorICAgICAgICBmID0gc2VsZi5mID0gc2VsZi5tb2R1bGUub3BlbihzZWxmLnNuZGZpbGVwYXRoKQorICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbChmLmdldGZwKCkubmFtZSwgc2VsZi5zbmRmaWxlcGF0aCkKKyAgICAgICAgc2VsZi5jaGVja19wYXJhbXMoZiwgc2VsZi5uY2hhbm5lbHMsIHNlbGYuc2FtcHdpZHRoLCBzZWxmLmZyYW1lcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zbmRmaWxlbmZyYW1lcywgc2VsZi5jb21wdHlwZSwgc2VsZi5jb21wbmFtZSkKKworICAgIGRlZiB0ZXN0X2Nsb3NlKHNlbGYpOgorICAgICAgICB3aXRoIG9wZW4oc2VsZi5zbmRmaWxlcGF0aCwgJ3JiJykgYXMgdGVzdGZpbGU6CisgICAgICAgICAgICBmID0gc2VsZi5mID0gc2VsZi5tb2R1bGUub3Blbih0ZXN0ZmlsZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodGVzdGZpbGUuY2xvc2VkKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RmaWxlLmNsb3NlZCwgc2VsZi5jbG9zZV9mZCkKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgJ3diJykgYXMgdGVzdGZpbGU6CisgICAgICAgICAgICBmb3V0ID0gc2VsZi5mb3V0ID0gc2VsZi5tb2R1bGUub3Blbih0ZXN0ZmlsZSwgJ3diJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodGVzdGZpbGUuY2xvc2VkKQorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLm1vZHVsZS5FcnJvcik6CisgICAgICAgICAgICAgICAgZm91dC5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RmaWxlLmNsb3NlZCwgc2VsZi5jbG9zZV9mZCkKKyAgICAgICAgICAgIGZvdXQuY2xvc2UoKSAjIGRvIG5vdGhpbmcKKworICAgIGRlZiB0ZXN0X3JlYWQoc2VsZik6CisgICAgICAgIGZyYW1lc2l6ZSA9IHNlbGYubmNoYW5uZWxzICogc2VsZi5zYW1wd2lkdGgKKyAgICAgICAgY2h1bmsxID0gc2VsZi5mcmFtZXNbOjIgKiBmcmFtZXNpemVdCisgICAgICAgIGNodW5rMiA9IHNlbGYuZnJhbWVzWzIgKiBmcmFtZXNpemU6IDQgKiBmcmFtZXNpemVdCisgICAgICAgIGYgPSBzZWxmLmYgPSBzZWxmLm1vZHVsZS5vcGVuKHNlbGYuc25kZmlsZXBhdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkZnJhbWVzKDApLCBiJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkZnJhbWVzKDIpLCBjaHVuazEpCisgICAgICAgIGYucmV3aW5kKCkKKyAgICAgICAgcG9zMCA9IGYudGVsbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zMCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRmcmFtZXMoMiksIGNodW5rMSkKKyAgICAgICAgcG9zMiA9IGYudGVsbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zMiwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRmcmFtZXMoMiksIGNodW5rMikKKyAgICAgICAgZi5zZXRwb3MocG9zMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRmcmFtZXMoMiksIGNodW5rMikKKyAgICAgICAgZi5zZXRwb3MocG9zMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRmcmFtZXMoMiksIGNodW5rMSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLm1vZHVsZS5FcnJvcik6CisgICAgICAgICAgICBmLnNldHBvcygtMSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLm1vZHVsZS5FcnJvcik6CisgICAgICAgICAgICBmLnNldHBvcyhmLmdldG5mcmFtZXMoKSArIDEpCisKKyAgICBkZWYgdGVzdF9jb3B5KHNlbGYpOgorICAgICAgICBmID0gc2VsZi5mID0gc2VsZi5tb2R1bGUub3BlbihzZWxmLnNuZGZpbGVwYXRoKQorICAgICAgICBmb3V0ID0gc2VsZi5mb3V0ID0gc2VsZi5tb2R1bGUub3BlbihURVNURk4sICd3YicpCisgICAgICAgIGZvdXQuc2V0cGFyYW1zKGYuZ2V0cGFyYW1zKCkpCisgICAgICAgIGkgPSAwCisgICAgICAgIG4gPSBmLmdldG5mcmFtZXMoKQorICAgICAgICB3aGlsZSBuID4gMDoKKyAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICAgZm91dC53cml0ZWZyYW1lcyhmLnJlYWRmcmFtZXMoaSkpCisgICAgICAgICAgICBuIC09IGkKKyAgICAgICAgZm91dC5jbG9zZSgpCisgICAgICAgIGZvdXQgPSBzZWxmLmZvdXQgPSBzZWxmLm1vZHVsZS5vcGVuKFRFU1RGTiwgJ3JiJykKKyAgICAgICAgZi5yZXdpbmQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZ2V0cGFyYW1zKCksIGZvdXQuZ2V0cGFyYW1zKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkZnJhbWVzKGYuZ2V0bmZyYW1lcygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3V0LnJlYWRmcmFtZXMoZm91dC5nZXRuZnJhbWVzKCkpKQorCisgICAgZGVmIHRlc3RfcmVhZF9ub3RfZnJvbV9zdGFydChzZWxmKToKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgJ3diJykgYXMgdGVzdGZpbGU6CisgICAgICAgICAgICB0ZXN0ZmlsZS53cml0ZShiJ2FiYWJhZ2FsYW1hZ2EnKQorICAgICAgICAgICAgd2l0aCBvcGVuKHNlbGYuc25kZmlsZXBhdGgsICdyYicpIGFzIGY6CisgICAgICAgICAgICAgICAgdGVzdGZpbGUud3JpdGUoZi5yZWFkKCkpCisKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgJ3JiJykgYXMgdGVzdGZpbGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RmaWxlLnJlYWQoMTMpLCBiJ2FiYWJhZ2FsYW1hZ2EnKQorICAgICAgICAgICAgZiA9IHNlbGYubW9kdWxlLm9wZW4odGVzdGZpbGUsICdyYicpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmdldG5jaGFubmVscygpLCBzZWxmLm5jaGFubmVscykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZ2V0c2FtcHdpZHRoKCksIHNlbGYuc2FtcHdpZHRoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5nZXRmcmFtZXJhdGUoKSwgc2VsZi5mcmFtZXJhdGUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmdldG5mcmFtZXMoKSwgc2VsZi5zbmRmaWxlbmZyYW1lcykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGZyYW1lcyhzZWxmLm5mcmFtZXMpLCBzZWxmLmZyYW1lcykKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9iYWRfY29kaW5nMy5weSBiL0xpYi90ZXN0L2JhZF9jb2RpbmczLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ODM2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9iYWRfY29kaW5nMy5weQpAQCAtMCwwICsxLDIgQEAKKyMgY29kaW5nOiBzdHJpbmctZXNjYXBlCitceDcwXHg3Mlx4NjlceDZlXHg3NFx4MjBceDMyXHgyYlx4MzJceDBhCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jcmFzaGVycy9idWZmZXJfbXV0YXRlLnB5IGIvTGliL3Rlc3QvY3Jhc2hlcnMvYnVmZmVyX211dGF0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjhkN2NjCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvY3Jhc2hlcnMvYnVmZmVyX211dGF0ZS5weQpAQCAtMCwwICsxLDMwIEBACisjCisjIFRoZSB2YXJpb3VzIG1ldGhvZHMgb2YgYnVmZmVyb2JqZWN0LmMgKGhlcmUgYnVmZmVyX3N1YnNjcmlwdCgpKSBjYWxsCisjIGdldF9idWYoKSBiZWZvcmUgY2FsbGluZyBwb3RlbnRpYWxseSBtb3JlIFB5dGhvbiBjb2RlIChoZXJlIHZpYQorIyBQeVNsaWNlX0dldEluZGljZXNFeCgpKS4gIEJ1dCBnZXRfYnVmKCkgYWxyZWFkeSByZXR1cm5lZCBhIHZvaWQqCisjIHBvaW50ZXIuICBUaGlzIHZvaWQqIHBvaW50ZXIgY2FuIGJlY29tZSBpbnZhbGlkIGlmIHRoZSBvYmplY3QKKyMgdW5kZXJseWluZyB0aGUgYnVmZmVyIGlzIG11dGF0ZWQgKGhlcmUgYSBieXRlYXJyYXkgb2JqZWN0KS4KKyMKKyMgQXMgdXN1YWwsIHBsZWFzZSBrZWVwIGluIG1pbmQgdGhhdCB0aGUgdGhyZWUgImhlcmUiIGluIHRoZSBzZW50ZW5jZQorIyBhYm92ZSBhcmUgb25seSBleGFtcGxlcy4gIEVhY2ggY2FuIGJlIGNoYW5nZWQgZWFzaWx5IGFuZCBsZWFkIHRvCisjIGFub3RoZXIgY3Jhc2hlci4KKyMKKyMgVGhpcyBjcmFzaGVzIGZvciBtZSBvbiBMaW51eCAzMi1iaXRzIHdpdGggQ1B5dGhvbiAyLjYgYW5kIDIuNworIyB3aXRoIGEgc2VnbWVudGF0aW9uIGZhdWx0LgorIworCisKK2NsYXNzIFBzZXVkb0luZGV4KG9iamVjdCk6CisgICAgZGVmIF9faW5kZXhfXyhzZWxmKToKKyAgICAgICAgZm9yIGMgaW4gImZvb2JhciIqbjoKKyAgICAgICAgICAgIGEuYXBwZW5kKGMpCisgICAgICAgIHJldHVybiBuICogNAorCisKK2ZvciBuIGluIHJhbmdlKDEsIDEwMDAwMCwgMTAwKToKKyAgICBhID0gYnl0ZWFycmF5KCJ0ZXN0IipuKQorICAgIGJ1ZiA9IGJ1ZmZlcihhKQorCisgICAgcyA9IGJ1Zls6UHNldWRvSW5kZXgoKToxXQorICAgICNwcmludCByZXByKHMpCisgICAgI2Fzc2VydCBzID09ICJ0ZXN0IipuCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jcmFzaGVycy9kZWNyZWZfYmVmb3JlX2Fzc2lnbm1lbnQucHkgYi9MaWIvdGVzdC9jcmFzaGVycy9kZWNyZWZfYmVmb3JlX2Fzc2lnbm1lbnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViMTdmYQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2NyYXNoZXJzL2RlY3JlZl9iZWZvcmVfYXNzaWdubWVudC5weQpAQCAtMCwwICsxLDQ0IEBACisiIiIKK0dlbmVyYWwgZXhhbXBsZSBmb3IgYW4gYXR0YWNrIGFnYWluc3QgY29kZSBsaWtlIHRoaXM6CisKKyAgICBQeV9ERUNSRUYob2JqLT5hdHRyKTsgb2JqLT5hdHRyID0gLi4uOworCitoZXJlIGluIE1vZHVsZS9fanNvbi5jOnNjYW5uZXJfaW5pdCgpLgorCitFeHBsYW5hdGlvbjogaWYgdGhlIGZpcnN0IFB5X0RFQ1JFRigpIGNhbGxzIGVpdGhlciBhIF9fZGVsX18gb3IgYQord2Vha3JlZiBjYWxsYmFjaywgaXQgd2lsbCBydW4gd2hpbGUgdGhlICdvYmonIGFwcGVhcnMgdG8gaGF2ZSBpbgorJ29iai0+YXR0cicgc3RpbGwgdGhlIG9sZCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCwgYnV0IG5vdCBob2xkaW5nCit0aGUgcmVmZXJlbmNlIGNvdW50IGFueSBtb3JlLgorCitTdGF0dXM6IHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgcmVwbGFjaW5nIHRoZXNlIGNhc2VzLCBidXQgdGhlcmUgaXMgYW4KK2luZmluaXRlIG51bWJlciBvZiBzdWNoIGNhc2VzLgorIiIiCisKK2ltcG9ydCBfanNvbiwgd2Vha3JlZgorCitjbGFzcyBDdHgxKG9iamVjdCk6CisgICAgZW5jb2RpbmcgPSAidXRmOCIKKyAgICBzdHJpY3QgPSBOb25lCisgICAgb2JqZWN0X2hvb2sgPSBOb25lCisgICAgb2JqZWN0X3BhaXJzX2hvb2sgPSBOb25lCisgICAgcGFyc2VfZmxvYXQgPSBOb25lCisgICAgcGFyc2VfaW50ID0gTm9uZQorICAgIHBhcnNlX2NvbnN0YW50ID0gTm9uZQorCitjbGFzcyBGb28odW5pY29kZSk6CisgICAgcGFzcworCitkZWYgZGVsZXRlX21lKCphcmdzKToKKyAgICBwcmludCBzY2FubmVyLmVuY29kaW5nLl9fZGljdF9fCisKK2NsYXNzIEN0eDIoQ3R4MSk6CisgICAgQHByb3BlcnR5CisgICAgZGVmIGVuY29kaW5nKHNlbGYpOgorICAgICAgICBnbG9iYWwgd3JlZgorICAgICAgICBmID0gRm9vKCJ1dGY4IikKKyAgICAgICAgZi5hYmMgPSBnbG9iYWxzKCkKKyAgICAgICAgd3JlZiA9IHdlYWtyZWYucmVmKGYsIGRlbGV0ZV9tZSkKKyAgICAgICAgcmV0dXJuIGYKKworc2Nhbm5lciA9IF9qc29uLm1ha2Vfc2Nhbm5lcihDdHgxKCkpCitzY2FubmVyLl9faW5pdF9fKEN0eDIoKSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2NyYXNoZXJzL3JlY3Vyc2l2ZV9jYWxsLnB5IGIvTGliL3Rlc3QvY3Jhc2hlcnMvcmVjdXJzaXZlX2NhbGwucHkKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvY3Vyc2VzX3Rlc3RzLnB5IGIvTGliL3Rlc3QvY3Vyc2VzX3Rlc3RzLnB5Cm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2ltZ2hkcmRhdGEvcHl0aG9uLmJtcCBiL0xpYi90ZXN0L2ltZ2hkcmRhdGEvcHl0aG9uLmJtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzVmOTUxCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvaW1naGRyZGF0YS9weXRob24uYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2ltZ2hkcmRhdGEvcHl0aG9uLmdpZiBiL0xpYi90ZXN0L2ltZ2hkcmRhdGEvcHl0aG9uLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmZkOWZlCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvaW1naGRyZGF0YS9weXRob24uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2ltZ2hkcmRhdGEvcHl0aG9uLmpwZyBiL0xpYi90ZXN0L2ltZ2hkcmRhdGEvcHl0aG9uLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTIyMmMwCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvaW1naGRyZGF0YS9weXRob24uanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2ltZ2hkcmRhdGEvcHl0aG9uLnBibSBiL0xpYi90ZXN0L2ltZ2hkcmRhdGEvcHl0aG9uLnBibQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODQ4YmE3Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvaW1naGRyZGF0YS9weXRob24ucGJtCkBAIC0wLDAgKzEsMyBAQAorUDQKKzE2IDE2Civ7f/G/+t/Vf62xW/GlYV/BWAGwAbAB8AfwH/Af8D///wpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2ltZ2hkcmRhdGEvcHl0aG9uLnBnbSBiL0xpYi90ZXN0L2ltZ2hkcmRhdGEvcHl0aG9uLnBnbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzQ5ZjJhCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvaW1naGRyZGF0YS9weXRob24ucGdtCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2ltZ2hkcmRhdGEvcHl0aG9uLnBuZyBiL0xpYi90ZXN0L2ltZ2hkcmRhdGEvcHl0aG9uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTk4N2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvaW1naGRyZGF0YS9weXRob24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2ltZ2hkcmRhdGEvcHl0aG9uLnBwbSBiL0xpYi90ZXN0L2ltZ2hkcmRhdGEvcHl0aG9uLnBwbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDljZGIzCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvaW1naGRyZGF0YS9weXRob24ucHBtCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2ltZ2hkcmRhdGEvcHl0aG9uLnJhcyBiL0xpYi90ZXN0L2ltZ2hkcmRhdGEvcHl0aG9uLnJhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzBlOTZmCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvaW1naGRyZGF0YS9weXRob24ucmFzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2ltZ2hkcmRhdGEvcHl0aG9uLnNnaSBiL0xpYi90ZXN0L2ltZ2hkcmRhdGEvcHl0aG9uLnNnaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmU5MDgxCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvaW1naGRyZGF0YS9weXRob24uc2dpCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2ltZ2hkcmRhdGEvcHl0aG9uLnRpZmYgYi9MaWIvdGVzdC9pbWdoZHJkYXRhL3B5dGhvbi50aWZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZDBiZmMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9pbWdoZHJkYXRhL3B5dGhvbi50aWZmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2ltZ2hkcmRhdGEvcHl0aG9uLnhibSBiL0xpYi90ZXN0L2ltZ2hkcmRhdGEvcHl0aG9uLnhibQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmJlZTJlCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvaW1naGRyZGF0YS9weXRob24ueGJtCkBAIC0wLDAgKzEsNiBAQAorI2RlZmluZSBweXRob25fd2lkdGggMTYKKyNkZWZpbmUgcHl0aG9uX2hlaWdodCAxNgorc3RhdGljIGNoYXIgcHl0aG9uX2JpdHNbXSA9IHsKKyAgMHhERiwgMHhGRSwgMHg4RiwgMHhGRCwgMHg1RiwgMHhGQiwgMHhBQiwgMHhGRSwgMHhCNSwgMHg4RCwgMHhEQSwgMHg4RiwgCisgIDB4QTUsIDB4ODYsIDB4RkEsIDB4ODMsIDB4MUEsIDB4ODAsIDB4MEQsIDB4ODAsIDB4MEQsIDB4ODAsIDB4MEYsIDB4RTAsIAorICAweDBGLCAweEY4LCAweDBGLCAweEY4LCAweDBGLCAweEZDLCAweEZGLCAweEZGLCB9OwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvaW5zcGVjdF9mb2RkZXIucHkgYi9MaWIvdGVzdC9pbnNwZWN0X2ZvZGRlci5weQppbmRleCBhZmRlMmUyLi41Yzg3YWU2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC9pbnNwZWN0X2ZvZGRlci5weQorKysgYi9MaWIvdGVzdC9pbnNwZWN0X2ZvZGRlci5weQpAQCAtNDksNiArNDksOCBAQAogY2xhc3MgTWFsb2Rvcm91c1BlcnZlcnQoU3R1cGlkR2l0KToKICAgICBwYXNzCiAKK1RpdCA9IE1hbG9kb3JvdXNQZXJ2ZXJ0CisKIGNsYXNzIFBhcnJvdERyb3BwaW5nczoKICAgICBwYXNzCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2tleWNlcnQucGVtIGIvTGliL3Rlc3Qva2V5Y2VydC5wZW0KaW5kZXggMmY0NmZjZi4uNjQzMThhYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3Qva2V5Y2VydC5wZW0KKysrIGIvTGliL3Rlc3Qva2V5Y2VydC5wZW0KQEAgLTEsMzIgKzEsMzEgQEAKLS0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS0KLU1JSUNYd0lCQUFLQmdRQzhkZHJobStMdXRCdmpZY1FsbkgyMVBQSXNlSjFKVkcySE1tTjJDbVprMll1a08rOUwKLW9wZEpoVHZiR2ZFajBEUXMxSUU4TStrVFV5T211S2ZWckZNS3d0VmVDSnBockFuaG96N1RZT3VMQlNxdDdsVkgKLWZoaS9Wd292RVNKbGFCT3ArV01uZmhjZHVQRVlIWXgvNmNuVmFwSWtabkx0MzB6dTJ1bStEekE5alFJREFRQUIKLUFvR0JBSzBGWnBhS2o2V25KWk4wUnFoaEsrZ2d0Qld3Qm5jMFUvb3pnS3oyajFzM2ZzU2hZZWlHdFc2Q0s1blUKLUQxZFo1d3poYkdUaEk3TGlPWER2UnVjYzluN3ZVZ2kwYWxxUFEvUEZvZFB4QU4vZUVZa21YUTdXMms3endzREEKLUlVSzBLVWhrdFFiTHU4cUYvbThxTTg2YmE5eTkvOVlrWHVRYlozQ09sNWFoVFpyaEFrRUEzMDFQMDhSS3YzS00KLW9YbkdVMlVIVHVKMU1BRDJoT3JQeGpENC93eEEvMzlFV0c5YlpjemJKeWdnQjRSSHUwSTNOT1NGakFtM0hRbTAKLUFOT3U1UUs5b3dKQkFOZ09lTGZOTmNGNHBwK1Vpa1JGcXhrNWhVTHFSQVd6VnhWcldlODVGbFBtMFZWbUhiYi8KLWxvaWY3bXFqVThvMWpUZC9MTTdSRDlmMnVzWnlFMnBzYXc4Q1FRQ05MaGtwWDNLTzVrS0ptUzlON0pNWlNjNGoKLW9vZzU4eWVZTzhCQnFLS3pwdWcwTFh1UXVsdFl2Mks0dmVhSU8wNGlMOVZMZTV6OVMvUTFqYUNIQkJ1WEFrRUEKLXo4Z2pHb2kxQU9wNlBCQkxaTnNuY0N2Y1YvMGFDKzFzZTRIeFRObzIrZHVLU0RuYnErbGpxT00rRTdvZFUrTnEKLWV3dklXT0cvL2U4ZnNzZDBtcTNIeXdKQkFKOGwvYzhHVm1ycEZUeDhyL25aMlB5eWp0M2RIMXdpZG9vRFhZU1YKLXE2R2JmNDFMbG81c1lBdG14ZG5kVExBU3VIS2VjYWNUZ1pWaHkwRnJ5WnBMS3JVPQotLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0KKy0tLS0tQkVHSU4gUFJJVkFURSBLRVktLS0tLQorTUlJQ2R3SUJBREFOQmdrcWhraUc5dzBCQVFFRkFBU0NBbUV3Z2dKZEFnRUFBb0dCQU50YjArWXJLdXhldkdwbQorTHJqYVVoWlNnejZ6RkFtdUdGbUttVWJkam1mdjl6U21tZHNRSWtzSysrakswQmU5TGVaeTIwajZhaE9mdVZhMAordWZFbVBvUDdGeTRoWGVnS1pSOWNDV2NJZS9BNkgyeFdGMUlJSkxSVExhVThvbC9JN1QrdW01SEQ1QXdBd05QUAorVVNOVTBFZWdtdnAreHhXdTNOWDJtMVZlb3Q4NUFnTUJBQUVDZ1lBM1pkWjY3M1gwb2V4RmxxN0FBbXJ1dGtIdAorQ0w3THZ3cnBPaWFCamh5VHhUZVNOV3p2dFFCa0lVOERPSTBiSWF6QTRVcmVBRmZmd3R2RXVQbW9uRGIzRitJcQorU01BdTQyWGNHeVZaRWwrZ0hsVFBVOVhSWDduVE9YVnQrTWxSUlJ4TDZ0OUdrR2ZVQVhJM1h4SkRYVzNjMHZCSworVUw5eHFEOGNPUlhPZkUwNnJRSkJBUDhtRVgxRVJrUjY0UHRzb2U0MjgxdmpUbE5mSWJzN05NUGtVbnJuOU4vWQorQkxoak5JZlEzSEZaRzhCVE1MZlg3a0NTOUQ1OTNEVzV0VjRaOUJQL2M2Y0NRUURjRnpDY1ZBck5oMkpTeXdPUQorWmZUZlJiSmcvWjVMdDlGa25ndjFtZWVHTlBnSU1MTjhTZzY3OXBBT09XbXpkTU8zVjcwNnJOUHpTVk1NRTdFNQorb1BJZkFrRUE4cERkZGFyUDV0Q3ZUVGdVcG1URmJha20wS29UWm0yK0Z6SGNuQTRqUmgrWE5UalRPdjk4WTZJaworZU81ZDFabktYc2VXdmtabmNRZ3hmZG5NcXFwajV3SkFjTnEvUlZuZTFEYllsd1djaFQyU2k2NU1ZbW1KOHQrRgorMG1jc1VMcWpPbkVNd2Y1ZStwdHE1THp3YnlySFpZcTVGTms3b2N1ZlB2L1pRcmNTU0MrY0Z3SkJBS3ZPSkJ5UworeDU2cXlHZVpMT1FsV1MySlMzS0pvNTlYdUxGR3FjYmdOOU9tOXhGYTQxWWI0TjlOdnBsRml2c3ZaZHczbTFRLworU1BJWFF1VDhSTVBEVk5RPQorLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQogLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi1NSUlDcHpDQ0FoQ2dBd0lCQWdJSkFQK3FTdHYxY0lHTk1BMEdDU3FHU0liM0RRRUJCUVVBTUlHSk1Rc3dDUVlECi1WUVFHRXdKVlV6RVJNQThHQTFVRUNCTUlSR1ZzWVhkaGNtVXhFekFSQmdOVkJBY1RDbGRwYkcxcGJtZDBiMjR4Ci1JekFoQmdOVkJBb1RHbEI1ZEdodmJpQlRiMlowZDJGeVpTQkdiM1Z1WkdGMGFXOXVNUXd3Q2dZRFZRUUxFd05UCi1VMHd4SHpBZEJnTlZCQU1URm5OdmJXVnRZV05vYVc1bExuQjVkR2h2Ymk1dmNtY3dIaGNOTURjd09ESTNNVFkxCi1ORFV3V2hjTk1UTXdNakUyTVRZMU5EVXdXakNCaVRFTE1Ba0dBMVVFQmhNQ1ZWTXhFVEFQQmdOVkJBZ1RDRVJsCi1iR0YzWVhKbE1STXdFUVlEVlFRSEV3cFhhV3h0YVc1bmRHOXVNU013SVFZRFZRUUtFeHBRZVhSb2IyNGdVMjltCi1kSGRoY21VZ1JtOTFibVJoZEdsdmJqRU1NQW9HQTFVRUN4TURVMU5NTVI4d0hRWURWUVFERXhaemIyMWxiV0ZqCi1hR2x1WlM1d2VYUm9iMjR1YjNKbk1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRQzhkZHJoCi1tK0x1dEJ2alljUWxuSDIxUFBJc2VKMUpWRzJITW1OMkNtWmsyWXVrTys5TG9wZEpoVHZiR2ZFajBEUXMxSUU4Ci1NK2tUVXlPbXVLZlZyRk1Ld3RWZUNKcGhyQW5ob3o3VFlPdUxCU3F0N2xWSGZoaS9Wd292RVNKbGFCT3ArV01uCi1maGNkdVBFWUhZeC82Y25WYXBJa1puTHQzMHp1MnVtK0R6QTlqUUlEQVFBQm94VXdFekFSQmdsZ2hrZ0JodmhDCi1BUUVFQkFNQ0JrQXdEUVlKS29aSWh2Y05BUUVGQlFBRGdZRUFGNFE1QlZxbUNPTHYxbjhqZS9KdzlLNjY5VlhiCi0wOGh5R3pRaGtlbUVCWVFkNmZ6UTlBLzFaekhrSktiMVA2eXJlT0xTRWg0S2N4WVB5ckxSQzFsbDhucjVPbEN4Ci1DTWhLa1RuUjZxQnNkTlYwWHRkVTIrTjI1aHFXK01hNFplcXNOL2lpSlZDR05PWkdudlF1dkNBR1dGOCtKL2YvCi1pSGtDNmdHZEJKaG9nczQ9CitNSUlDVkRDQ0FiMmdBd0lCQWdJSkFOZkhPQmtacjhKT01BMEdDU3FHU0liM0RRRUJCUVVBTUY4eEN6QUpCZ05WCitCQVlUQWxoWk1SY3dGUVlEVlFRSEV3NURZWE4wYkdVZ1FXNTBhSEpoZURFak1DRUdBMVVFQ2hNYVVIbDBhRzl1CitJRk52Wm5SM1lYSmxJRVp2ZFc1a1lYUnBiMjR4RWpBUUJnTlZCQU1UQ1d4dlkyRnNhRzl6ZERBZUZ3MHhNREV3CitNRGd5TXpBeE5UWmFGdzB5TURFd01EVXlNekF4TlRaYU1GOHhDekFKQmdOVkJBWVRBbGhaTVJjd0ZRWURWUVFICitFdzVEWVhOMGJHVWdRVzUwYUhKaGVERWpNQ0VHQTFVRUNoTWFVSGwwYUc5dUlGTnZablIzWVhKbElFWnZkVzVrCitZWFJwYjI0eEVqQVFCZ05WQkFNVENXeHZZMkZzYUc5emREQ0JuekFOQmdrcWhraUc5dzBCQVFFRkFBT0JqUUF3CitnWWtDZ1lFQTIxdlQ1aXNxN0Y2OGFtWXV1TnBTRmxLRFByTVVDYTRZV1lxWlJ0Mk9aKy8zTkthWjJ4QWlTd3I3Cis2TXJRRjcwdDVuTGJTUHBxRTUrNVZyUzU4U1krZy9zWExpRmQ2QXBsSDF3Slp3aDc4RG9mYkZZWFVnZ2t0Rk10CitwVHlpWDhqdFA2NmJrY1BrREFEQTA4OVJJMVRRUjZDYStuN0hGYTdjMWZhYlZWNmkzemtDQXdFQUFhTVlNQll3CitGQVlEVlIwUkJBMHdDNElKYkc5allXeG9iM04wTUEwR0NTcUdTSWIzRFFFQkJRVUFBNEdCQUhQY3RRQkVRNHdkCitCSjYrSmNwSXJhb3BMbjhCR2hiak5XajQwbW1ScVdCL05BV0Y2TTVuZTdLcEdBdTd0TGVHNGhiMXpMYWxkSzhHCitseHkyR1BTUkY2TEZTNDhkcEVqMkhiTXYybnZ2Nnh4YWxETUo5K0RpY1dnQUtUUTZiY1gyajNHVWtDUjBnL1QxCitDUmxOQkFBbHZoS3pPN0NscGY5bDBZS0JFZnJhSkJ5WAogLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbGVha2Vycy90ZXN0X2N0eXBlcy5weSBiL0xpYi90ZXN0L2xlYWtlcnMvdGVzdF9jdHlwZXMucHkKaW5kZXggMGY5YTJjZC4uN2Q3ZTlmZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvbGVha2Vycy90ZXN0X2N0eXBlcy5weQorKysgYi9MaWIvdGVzdC9sZWFrZXJzL3Rlc3RfY3R5cGVzLnB5CkBAIC0xLDYgKzEsNSBAQAogCiAjIFRha2VuIGZyb20gTGliL2N0eXBlcy90ZXN0L3Rlc3Rfa2VlcHJlZnMucHksIFBvaW50ZXJUb1N0cnVjdHVyZS50ZXN0KCkuCi0jIFdoZW4gdGhpcyBsZWFrIGlzIGZpeGVkLCByZW1lbWJlciB0byByZW1vdmUgZnJvbSBNaXNjL2J1aWxkLnNoIExFQUtZX1RFU1RTLgogCiBmcm9tIGN0eXBlcyBpbXBvcnQgU3RydWN0dXJlLCBjX2ludCwgUE9JTlRFUgogaW1wb3J0IGdjCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9tYXBwaW5nX3Rlc3RzLnB5IGIvTGliL3Rlc3QvbWFwcGluZ190ZXN0cy5weQppbmRleCA0OWY2Mzc5Li5mNDM3NTBiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9tYXBwaW5nX3Rlc3RzLnB5CisrKyBiL0xpYi90ZXN0L21hcHBpbmdfdGVzdHMucHkKQEAgLTIwOSw4ICsyMDksMTIgQEAKICAgICAgICAgZC51cGRhdGUoU2ltcGxlVXNlckRpY3QoKSkKICAgICAgICAgaTEgPSBkLml0ZW1zKCkKICAgICAgICAgaTIgPSBzZWxmLnJlZmVyZW5jZS5pdGVtcygpCi0gICAgICAgIGkxLnNvcnQoKQotICAgICAgICBpMi5zb3J0KCkKKworICAgICAgICBkZWYgc2FmZV9zb3J0X2tleShrdik6CisgICAgICAgICAgICBrLCB2ID0ga3YKKyAgICAgICAgICAgIHJldHVybiBpZCh0eXBlKGspKSwgaWQodHlwZSh2KSksIGssIHYKKyAgICAgICAgaTEuc29ydChrZXk9c2FmZV9zb3J0X2tleSkKKyAgICAgICAgaTIuc29ydChrZXk9c2FmZV9zb3J0X2tleSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpMSwgaTIpCiAKICAgICAgICAgY2xhc3MgRXhjKEV4Y2VwdGlvbik6IHBhc3MKQEAgLTM0Myw3ICszNDcsNyBAQAogICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGQuaGFzX2tleSgnYScpKQogICAgICAgICBkID0gc2VsZi5fZnVsbF9tYXBwaW5nKHsnYSc6IDEsICdiJzogMn0pCiAgICAgICAgIGsgPSBkLmtleXMoKQotICAgICAgICBrLnNvcnQoKQorICAgICAgICBrLnNvcnQoa2V5PWxhbWJkYSBrOiAoaWQodHlwZShrKSksIGspKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGssIFsnYScsICdiJ10pCiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLmhhc19rZXkpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9tcF9mb3JrX2JvbWIucHkgYi9MaWIvdGVzdC9tcF9mb3JrX2JvbWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJjZWEyNQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L21wX2ZvcmtfYm9tYi5weQpAQCAtMCwwICsxLDE2IEBACitpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCisKK2RlZiBmb28oY29ubik6CisgICAgY29ubi5zZW5kKCIxMjMiKQorCisjIEJlY2F1c2UgImlmIF9fbmFtZV9fID09ICdfX21haW5fXyciIGlzIG1pc3NpbmcgdGhpcyB3aWxsIG5vdCB3b3JrCisjIGNvcnJlY3RseSBvbiBXaW5kb3dzLiAgSG93ZXZlciwgd2Ugc2hvdWxkIGdldCBhIFJ1bnRpbWVFcnJvciByYXRoZXIKKyMgdGhhbiB0aGUgV2luZG93cyBlcXVpdmFsZW50IG9mIGEgZm9yayBib21iLgorCityLCB3ID0gbXVsdGlwcm9jZXNzaW5nLlBpcGUoRmFsc2UpCitwID0gbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3ModGFyZ2V0PWZvbywgYXJncz0odywpKQorcC5zdGFydCgpCit3LmNsb3NlKCkKK3ByaW50KHIucmVjdigpKQorci5jbG9zZSgpCitwLmpvaW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbnVsbGJ5dGVjZXJ0LnBlbSBiL0xpYi90ZXN0L251bGxieXRlY2VydC5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ3MTg2YwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L251bGxieXRlY2VydC5wZW0KQEAgLTAsMCArMSw5MCBAQAorQ2VydGlmaWNhdGU6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiAwICgweDApCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgU1Q9T3JlZ29uLCBMPUJlYXZlcnRvbiwgTz1QeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiwgT1U9UHl0aG9uIENvcmUgRGV2ZWxvcG1lbnQsIENOPW51bGwucHl0aG9uLm9yZ1x4MDBleGFtcGxlLm9yZy9lbWFpbEFkZHJlc3M9cHl0aG9uLWRldkBweXRob24ub3JnCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBBdWcgIDcgMTM6MTE6NTIgMjAxMyBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEF1ZyAgNyAxMzoxMjo1MiAyMDEzIEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBTVD1PcmVnb24sIEw9QmVhdmVydG9uLCBPPVB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBPVT1QeXRob24gQ29yZSBEZXZlbG9wbWVudCwgQ049bnVsbC5weXRob24ub3JnXHgwMGV4YW1wbGUub3JnL2VtYWlsQWRkcmVzcz1weXRob24tZGV2QHB5dGhvbi5vcmcKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgICAgIFB1YmxpYy1LZXk6ICgyMDQ4IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzOgorICAgICAgICAgICAgICAgICAgICAwMDpiNTplYTplZDpjOTpmYjo0Njo3ZDo2ZjozYjo3Njo4MDpkZDozYTpmMzoKKyAgICAgICAgICAgICAgICAgICAgMDM6OTQ6MGI6YTc6YTY6ZGI6ZWM6MWQ6ZGY6ZmY6MjM6NzQ6MDg6OWQ6OTc6CisgICAgICAgICAgICAgICAgICAgIDE2OjNmOmEzOmE0OjdiOjNlOjFiOjBlOjk2OjU5OjI1OjAzOmE3OjI2OmUyOgorICAgICAgICAgICAgICAgICAgICA4ODphOTpjZjo3OTpjZDpmNzowNDo1NjpiMDphYjo3OTozMjo2ZTo1OTpjMToKKyAgICAgICAgICAgICAgICAgICAgMzI6MzA6NTQ6ZWI6NTg6YTg6Y2I6OTE6ZjA6NDI6YTU6NjQ6Mjc6Y2I6ZDQ6CisgICAgICAgICAgICAgICAgICAgIDU2OjMxOjg4OjUyOmFkOmNmOmJkOjdmOmYwOjA2OjY0OjFmOmNjOjI3OmI4OgorICAgICAgICAgICAgICAgICAgICBhMzo4Yjo4YzpmMzpkODoyOToxZjoyNTowYjpmNTo0NjowNjoxYjpjYTowMjoKKyAgICAgICAgICAgICAgICAgICAgNDU6YWQ6N2I6NzY6MGE6OWM6YmY6YmI6Yjk6YWU6MGQ6MTY6YWI6NjA6NzU6CisgICAgICAgICAgICAgICAgICAgIGFlOjA2OjNlOjljOjdjOjMxOmRjOjkyOjJmOjI5OjFhOmUwOjRiOjBjOjkxOgorICAgICAgICAgICAgICAgICAgICA5MDo2YzplOTozNzpjNTo5MDpkNzoyYTpkNzo5NzoxNTphMzo4MDo4Zjo1ZDoKKyAgICAgICAgICAgICAgICAgICAgN2I6NDk6OGY6NTQ6MzA6ZDQ6OTc6MmM6MWM6NWI6Mzc6YjU6YWI6Njk6MzA6CisgICAgICAgICAgICAgICAgICAgIDY4OjQzOmQzOjMzOjc4OjRiOjAyOjYwOmY1OjNjOjQ0OjgwOmExOjhmOmU3OgorICAgICAgICAgICAgICAgICAgICBmMDowZjpkMTo1ZTo4Nzo5ZTo0NjpjZjo2MjpmYzpmOTpiZjowYzo2NToxMjoKKyAgICAgICAgICAgICAgICAgICAgZjE6OTM6Yzg6MzU6Nzk6M2Y6Yzg6ZWM6ZWM6NDc6ZjU6ZWY6YmU6NDQ6ZDU6CisgICAgICAgICAgICAgICAgICAgIGFlOjgyOjFlOjJkOjlhOjlmOjk4OjVhOjY3OjY1OmUxOjc0OjcwOjdjOmNiOgorICAgICAgICAgICAgICAgICAgICBkMzpjMjpjZTowZTo0NTo0OToyNzpkYzplMzoyZDpkNDpmYjo0ODowZToyZjoKKyAgICAgICAgICAgICAgICAgICAgOWU6Nzc6Yjg6MTQ6NDY6YzA6YzQ6MzY6Y2E6MDI6YWU6NmE6OTE6OGM6ZGE6CisgICAgICAgICAgICAgICAgICAgIDJmOjg1CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogY3JpdGljYWwKKyAgICAgICAgICAgICAgICBDQTpGQUxTRQorICAgICAgICAgICAgWDUwOXYzIFN1YmplY3QgS2V5IElkZW50aWZpZXI6CisgICAgICAgICAgICAgICAgODg6NUE6NTU6QzA6NTI6RkY6NjE6Q0Q6NTI6QTM6MzU6MEY6RUE6NUE6OUM6MjQ6Mzg6MjI6Rjc6NUMKKyAgICAgICAgICAgIFg1MDl2MyBLZXkgVXNhZ2U6CisgICAgICAgICAgICAgICAgRGlnaXRhbCBTaWduYXR1cmUsIE5vbiBSZXB1ZGlhdGlvbiwgS2V5IEVuY2lwaGVybWVudAorICAgICAgICAgICAgWDUwOXYzIFN1YmplY3QgQWx0ZXJuYXRpdmUgTmFtZToKKyAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgV0FSTklORzogVGhlIHZhbHVlcyBmb3IgRE5TLCBlbWFpbCBhbmQgVVJJIGFyZSBXUk9ORy4gT3BlblNTTAorICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXNuJ3QgcHJpbnQgdGhlIHRleHQgYWZ0ZXIgYSBOVUxMIGJ5dGUuCisgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgIEROUzphbHRudWxsLnB5dGhvbi5vcmcsIGVtYWlsOm51bGxAcHl0aG9uLm9yZywgVVJJOmh0dHA6Ly9udWxsLnB5dGhvbi5vcmcsIElQIEFkZHJlc3M6MTkyLjAuMi4xLCBJUCBBZGRyZXNzOjIwMDE6REI4OjA6MDowOjA6MDoxCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgICBhYzo0Zjo0NTplZjo3ZDo0OTphODoyMTo3MDo4ZTo4ODo1OTozZTpkNDozNjo0Mjo3MDpmNToKKyAgICAgICAgIGEzOmJkOjhiOmQ3OmE4OmQwOjU4OmY2OjMxOjRhOmIxOmE0OmE2OmRkOjZmOmQ5OmU4OjQ0OgorICAgICAgICAgM2M6YjY6MGE6NzE6ZDY6N2Y6YjE6MDg6NjE6OWQ6NjA6Y2U6NzU6Y2Y6Nzc6MGM6ZDI6Mzc6CisgICAgICAgICA4NjowMjo4ZDo1ZTo1ZDpmOTowZjo3MTpiNDoxNjphODpjMTozZDoyMzoxYzpmMToxMTpiMzoKKyAgICAgICAgIDU2OjZlOmNhOmQwOjhkOjM0Ojk0OmU2Ojg3OjJhOjk5OmYyOmFlOmFlOmNjOmMyOmU4Ojg2OgorICAgICAgICAgZGU6MDg6YTg6N2Y6YzU6MDU6ZmE6NmY6ODE6YTc6ODI6ZTY6ZDA6NTM6OWQ6MzQ6ZjQ6YWM6CisgICAgICAgICAzZTo0MDpmZTo4OTo1Nzo3YToyOTphNDo5MTo3ZTowYjpjNjo1MTozMTplNToxMDoyZjphNDoKKyAgICAgICAgIDYwOjc2OmNkOjk1OjUxOjFhOmJlOjhiOmExOmIwOmZkOmFkOjUyOmJkOmQ3OjFiOjg3OjYwOgorICAgICAgICAgZDI6MzE6Yzc6MTc6YzQ6MTg6NGY6MmQ6MDg6MjU6YTM6YTc6NGY6Yjc6OTI6Y2E6ZTI6ZjU6CisgICAgICAgICAyNTpmMTo1NDo3NTo4MTo5ZDpiMzozZDo2MTphMjpmNzpkYTplZDplMTpjNjo2ZjoyYzo2MDoKKyAgICAgICAgIDFmOmQ4OjZmOmM1OjkyOjA1OmFiOmM5OjA5OjYyOjQ5OmE5OjE0OmFkOjU1OjExOmNjOmQ2OgorICAgICAgICAgNGE6MTk6OTQ6OTk6OTc6Mzc6MWQ6ODE6NWY6OGI6Y2Y6YTM6YTg6OTY6NDQ6NTE6MDg6M2Q6CisgICAgICAgICAwYjowNTo2NToxMjplYjpiNjo3MDo4MDo4ODo0ODo3Mjo0ZjpjNjpjMjpkYTpjZjpjZDo4ZToKKyAgICAgICAgIDViOmJhOjk3OjJmOjYwOmI0Ojk2OjU2OjQ5OjVlOjNhOjQzOjc2OjYzOjA0OmJlOjJhOmY2OgorICAgICAgICAgYzE6Y2E6YTk6OTQKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRTJEQ0NBOENnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQ0J4VEVMTUFrR0ExVUVCaE1DVlZNeAorRHpBTkJnTlZCQWdNQms5eVpXZHZiakVTTUJBR0ExVUVCd3dKUW1WaGRtVnlkRzl1TVNNd0lRWURWUVFLREJwUQorZVhSb2IyNGdVMjltZEhkaGNtVWdSbTkxYm1SaGRHbHZiakVnTUI0R0ExVUVDd3dYVUhsMGFHOXVJRU52Y21VZworUkdWMlpXeHZjRzFsYm5ReEpEQWlCZ05WQkFNTUcyNTFiR3d1Y0hsMGFHOXVMbTl5WndCbGVHRnRjR3hsTG05eQorWnpFa01DSUdDU3FHU0liM0RRRUpBUllWY0hsMGFHOXVMV1JsZGtCd2VYUm9iMjR1YjNKbk1CNFhEVEV6TURndworTnpFek1URTFNbG9YRFRFek1EZ3dOekV6TVRJMU1sb3dnY1V4Q3pBSkJnTlZCQVlUQWxWVE1ROHdEUVlEVlFRSQorREFaUGNtVm5iMjR4RWpBUUJnTlZCQWNNQ1VKbFlYWmxjblJ2YmpFak1DRUdBMVVFQ2d3YVVIbDBhRzl1SUZOdgorWm5SM1lYSmxJRVp2ZFc1a1lYUnBiMjR4SURBZUJnTlZCQXNNRjFCNWRHaHZiaUJEYjNKbElFUmxkbVZzYjNCdAorWlc1ME1TUXdJZ1lEVlFRRERCdHVkV3hzTG5CNWRHaHZiaTV2Y21jQVpYaGhiWEJzWlM1dmNtY3hKREFpQmdrcQoraGtpRzl3MEJDUUVXRlhCNWRHaHZiaTFrWlhaQWNIbDBhRzl1TG05eVp6Q0NBU0l3RFFZSktvWklodmNOQVFFQgorQlFBRGdnRVBBRENDQVFvQ2dnRUJBTFhxN2NuN1JuMXZPM2FBM1RyekE1UUxwNmJiN0IzZi95TjBDSjJYRmoragorcEhzK0d3NldXU1VEcHliaWlLblBlYzMzQkZhd3Eza3libG5CTWpCVTYxaW95NUh3UXFWa0o4dlVWakdJVXEzUAordlgvd0JtUWZ6Q2U0bzR1TTg5Z3BIeVVMOVVZR0c4b0NSYTE3ZGdxY3Y3dTVyZzBXcTJCMXJnWStuSHd4M0pJdgorS1JyZ1N3eVJrR3pwTjhXUTF5clhseFdqZ0k5ZGUwbVBWRERVbHl3Y1d6ZTFxMmt3YUVQVE0zaExBbUQxUEVTQQorb1kvbjhBL1JYb2VlUnM5aS9QbS9ER1VTOFpQSU5Yay95T3pzUi9YdnZrVFZyb0llTFpxZm1GcG5aZUYwY0h6TAorMDhMT0RrVkpKOXpqTGRUN1NBNHZubmU0RkViQXhEYktBcTVxa1l6YUw0VUNBd0VBQWFPQjBEQ0J6VEFNQmdOVgorSFJNQkFmOEVBakFBTUIwR0ExVWREZ1FXQkJTSVdsWEFVdjloelZLak5RL3FXcHdrT0NMM1hEQUxCZ05WSFE4RQorQkFNQ0JlQXdnWkFHQTFVZEVRU0JpRENCaFlJZVlXeDBiblZzYkM1d2VYUm9iMjR1YjNKbkFHVjRZVzF3YkdVdQorWTI5dGdTQnVkV3hzUUhCNWRHaHZiaTV2Y21jQWRYTmxja0JsZUdGdGNHeGxMbTl5WjRZcGFIUjBjRG92TDI1MQorYkd3dWNIbDBhRzl1TG05eVp3Qm9kSFJ3T2k4dlpYaGhiWEJzWlM1dmNtZUhCTUFBQWdHSEVDQUJEYmdBQUFBQQorQUFBQUFBQUFBQUV3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUt4UFJlOTlTYWdoY0k2SVdUN1VOa0p3OWFPOQoraTllbzBGajJNVXF4cEtiZGI5bm9SRHkyQ25IV2Y3RUlZWjFnem5YUGR3elNONFlDalY1ZCtROXh0QmFvd1QwagorSFBFUnMxWnV5dENOTkpUbWh5cVo4cTZ1ek1Mb2h0NElxSC9GQmZwdmdhZUM1dEJUblRUMHJENUEvb2xYZWltawora1g0THhsRXg1UkF2cEdCMnpaVlJHcjZMb2JEOXJWSzkxeHVIWU5JeHh4ZkVHRTh0Q0NXanAwKzNrc3JpOVNYeAorVkhXQm5iTTlZYUwzMnUzaHhtOHNZQi9ZYjhXU0JhdkpDV0pKcVJTdFZSSE0xa29abEptWE54MkJYNHZQbzZpVworUkZFSVBRc0ZaUkxydG5DQWlFaHlUOGJDMnMvTmpsdTZseTlndEpaV1NWNDZRM1pqQkw0cTlzSEtxWlE9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9waWNrbGV0ZXN0ZXIucHkgYi9MaWIvdGVzdC9waWNrbGV0ZXN0ZXIucHkKaW5kZXggYzMyMWY4ZS4uMTU5OTg5MyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvcGlja2xldGVzdGVyLnB5CisrKyBiL0xpYi90ZXN0L3BpY2tsZXRlc3Rlci5weQpAQCAtNiw3ICs2LDE0IEBACiBpbXBvcnQgcGlja2xldG9vbHMKIGltcG9ydCBjb3B5X3JlZwogCi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0RmFpbGVkLCBoYXZlX3VuaWNvZGUsIFRFU1RGTgorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdEZhaWxlZCwgdmVyYm9zZSwgaGF2ZV91bmljb2RlLCBURVNURk4KK3RyeToKKyAgICBmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBfMkcsIF8xTSwgcHJlY2lzaW9uYmlnbWVtdGVzdAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgICMgdGhpcyBpbXBvcnQgbWlnaHQgZmFpbCB3aGVuIHJ1biBvbiBvbGRlciBQeXRob24gdmVyc2lvbnMgYnkgdGVzdF94cGlja2xlCisgICAgXzJHID0gXzFNID0gMAorICAgIGRlZiBwcmVjaXNpb25iaWdtZW10ZXN0KCphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBsYW1iZGEgc2VsZjogTm9uZQogCiAjIFRlc3RzIHRoYXQgdHJ5IGEgbnVtYmVyIG9mIHBpY2tsZSBwcm90b2NvbHMgc2hvdWxkIGhhdmUgYQogIyAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKQEAgLTUwMiwxMCArNTA5LDEwIEBACiAgICAgICAgIGkgPSBDKCkKICAgICAgICAgaS5hdHRyID0gaQogICAgICAgICBmb3IgcHJvdG8gaW4gcHJvdG9jb2xzOgotICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoaSwgMikKKyAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKGksIHByb3RvKQogICAgICAgICAgICAgeCA9IHNlbGYubG9hZHMocykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlyKHgpLCBkaXIoaSkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoeC5hdHRyIGlzIHgpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHguYXR0ciwgeCkKIAogICAgIGRlZiB0ZXN0X3JlY3Vyc2l2ZV9tdWx0aShzZWxmKToKICAgICAgICAgbCA9IFtdCkBAIC01MzEsNiArNTM4LDggQEAKICAgICAgICAgICAgICAgICAgICAgIidhYmNcIiIsICMgb3BlbiBxdW90ZSBhbmQgY2xvc2UgcXVvdGUgZG9uJ3QgbWF0Y2gKICAgICAgICAgICAgICAgICAgICAgIidhYmMnICAgPyIsICMganVuayBhZnRlciBjbG9zZSBxdW90ZQogICAgICAgICAgICAgICAgICAgICAiJ1xcJyIsICMgdHJhaWxpbmcgYmFja3NsYXNoCisgICAgICAgICAgICAgICAgICAgICInIiwgICAgIyBpc3N1ZSAjMTc3MTAKKyAgICAgICAgICAgICAgICAgICAgIicgIiwgICAjIGlzc3VlICMxNzcxMAogICAgICAgICAgICAgICAgICAgICAjIHNvbWUgdGVzdHMgb2YgdGhlIHF1b3RpbmcgcnVsZXMKICAgICAgICAgICAgICAgICAgICAgIyInYWJjXCJcJyciLAogICAgICAgICAgICAgICAgICAgICAjIidcXFxcYVwnXCdcJ1xcXCdcXFxcXCcnIiwKQEAgLTExNDMsMzAgKzExNTIsMzQgQEAKICAgICAgICAgaWYgaXNpbnN0YW5jZShvYmplY3QsIGludCkgYW5kIG9iamVjdCAlIDIgPT0gMDoKICAgICAgICAgICAgIHNlbGYuaWRfY291bnQgKz0gMQogICAgICAgICAgICAgcmV0dXJuIHN0cihvYmplY3QpCisgICAgICAgIGVsaWYgb2JqZWN0ID09ICJ0ZXN0X2ZhbHNlX3ZhbHVlIjoKKyAgICAgICAgICAgIHNlbGYuZmFsc2VfY291bnQgKz0gMQorICAgICAgICAgICAgcmV0dXJuICIiCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByZXR1cm4gTm9uZQogCiAgICAgZGVmIHBlcnNpc3RlbnRfbG9hZChzZWxmLCBvaWQpOgotICAgICAgICBzZWxmLmxvYWRfY291bnQgKz0gMQotICAgICAgICBvYmplY3QgPSBpbnQob2lkKQotICAgICAgICBhc3NlcnQgb2JqZWN0ICUgMiA9PSAwCi0gICAgICAgIHJldHVybiBvYmplY3QKKyAgICAgICAgaWYgbm90IG9pZDoKKyAgICAgICAgICAgIHNlbGYubG9hZF9mYWxzZV9jb3VudCArPSAxCisgICAgICAgICAgICByZXR1cm4gInRlc3RfZmFsc2VfdmFsdWUiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmxvYWRfY291bnQgKz0gMQorICAgICAgICAgICAgb2JqZWN0ID0gaW50KG9pZCkKKyAgICAgICAgICAgIGFzc2VydCBvYmplY3QgJSAyID09IDAKKyAgICAgICAgICAgIHJldHVybiBvYmplY3QKIAogICAgIGRlZiB0ZXN0X3BlcnNpc3RlbmNlKHNlbGYpOgotICAgICAgICBzZWxmLmlkX2NvdW50ID0gMAotICAgICAgICBzZWxmLmxvYWRfY291bnQgPSAwCi0gICAgICAgIEwgPSByYW5nZSgxMCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxvYWRzKHNlbGYuZHVtcHMoTCkpLCBMKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuaWRfY291bnQsIDUpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2FkX2NvdW50LCA1KQotCi0gICAgZGVmIHRlc3RfYmluX3BlcnNpc3RlbmNlKHNlbGYpOgotICAgICAgICBzZWxmLmlkX2NvdW50ID0gMAotICAgICAgICBzZWxmLmxvYWRfY291bnQgPSAwCi0gICAgICAgIEwgPSByYW5nZSgxMCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxvYWRzKHNlbGYuZHVtcHMoTCwgMSkpLCBMKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuaWRfY291bnQsIDUpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2FkX2NvdW50LCA1KQorICAgICAgICBMID0gcmFuZ2UoMTApICsgWyJ0ZXN0X2ZhbHNlX3ZhbHVlIl0KKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgIHNlbGYuaWRfY291bnQgPSAwCisgICAgICAgICAgICBzZWxmLmZhbHNlX2NvdW50ID0gMAorICAgICAgICAgICAgc2VsZi5sb2FkX2ZhbHNlX2NvdW50ID0gMAorICAgICAgICAgICAgc2VsZi5sb2FkX2NvdW50ID0gMAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxvYWRzKHNlbGYuZHVtcHMoTCwgcHJvdG8pKSwgTCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5pZF9jb3VudCwgNSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mYWxzZV9jb3VudCwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2FkX2NvdW50LCA1KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxvYWRfZmFsc2VfY291bnQsIDEpCiAKIGNsYXNzIEFic3RyYWN0UGlja2xlclVucGlja2xlck9iamVjdFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtMTI4MCwzICsxMjkzLDMxIEBACiAgICAgICAgIGYud3JpdGUocGlja2xlZDIpCiAgICAgICAgIGYuc2VlaygwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVucGlja2xlci5sb2FkKCksIGRhdGEyKQorCitjbGFzcyBCaWdtZW1QaWNrbGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAjIE1lbW9yeSByZXF1aXJlbWVudHM6IDEgYnl0ZSBwZXIgY2hhcmFjdGVyIGZvciBpbnB1dCBzdHJpbmdzLCAxIGJ5dGUKKyAgICAjIGZvciBwaWNrbGVkIGRhdGEsIDEgYnl0ZSBmb3IgdW5waWNrbGVkIHN0cmluZ3MsIDEgYnl0ZSBmb3IgaW50ZXJuYWwKKyAgICAjIGJ1ZmZlciBhbmQgMSBieXRlIG9mIGZyZWUgc3BhY2UgZm9yIHJlc2l6aW5nIG9mIGludGVybmFsIGJ1ZmZlci4KKworICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzJHICsgMTAwKl8xTSwgbWVtdXNlPTUpCisgICAgZGVmIHRlc3RfaHVnZV9zdHJsaXN0KHNlbGYsIHNpemUpOgorICAgICAgICBjaHVua3NpemUgPSAyKioyMAorICAgICAgICBkYXRhID0gW10KKyAgICAgICAgd2hpbGUgc2l6ZSA+IGNodW5rc2l6ZToKKyAgICAgICAgICAgIGRhdGEuYXBwZW5kKCd4JyAqIGNodW5rc2l6ZSkKKyAgICAgICAgICAgIHNpemUgLT0gY2h1bmtzaXplCisgICAgICAgICAgICBjaHVua3NpemUgKz0gMQorICAgICAgICBkYXRhLmFwcGVuZCgneScgKiBzaXplKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBwaWNrbGVkID0gc2VsZi5kdW1wcyhkYXRhLCBwcm90bykKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gc2VsZi5sb2FkcyhwaWNrbGVkKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgZGF0YSkKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICByZXMgPSBOb25lCisgICAgICAgICAgICAgICAgICAgIHBpY2tsZWQgPSBOb25lCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBkYXRhID0gTm9uZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvcHlkb2NfbW9kLnB5IGIvTGliL3Rlc3QvcHlkb2NfbW9kLnB5CmluZGV4IDljNTMzMjQuLmFhOTNhMzMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3B5ZG9jX21vZC5weQorKysgYi9MaWIvdGVzdC9weWRvY19tb2QucHkKQEAgLTE1LDYgKzE1LDE2IEBACiAgICAgTk9fTUVBTklORyA9ICJlZ2dzIgogICAgIHBhc3MKIAorY2xhc3MgQyhvYmplY3QpOgorICAgIGRlZiBzYXlfbm8oc2VsZik6CisgICAgICAgIHJldHVybiAibm8iCisgICAgZGVmIGdldF9hbnN3ZXIoc2VsZik6CisgICAgICAgICIiIiBSZXR1cm4gc2F5X25vKCkgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnNheV9ubygpCisgICAgZGVmIGlzX2l0X3RydWUoc2VsZik6CisgICAgICAgICIiIiBSZXR1cm4gc2VsZi5nZXRfYW5zd2VyKCkgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmdldF9hbnN3ZXIoKQorCiBkZWYgZG9jX2Z1bmMoKToKICAgICAiIiIKICAgICBUaGlzIGZ1bmN0aW9uIHNvbHZlcyBhbGwgb2YgdGhlIHdvcmxkJ3MgcHJvYmxlbXM6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC9yZWdleF90ZXN0cy5weSBiL0xpYi90ZXN0L3JlZ2V4X3Rlc3RzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDA0YWQwLi4wMDAwMDAwCi0tLSBhL0xpYi90ZXN0L3JlZ2V4X3Rlc3RzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLSMgUmVnZXggdGVzdCBzdWl0ZSBhbmQgYmVuY2htYXJrIHN1aXRlIHYxLjVhMgotIyBEdWUgdG8gdGhlIHVzZSBvZiByImF3IiBzdHJpbmdzLCB0aGlzIGZpbGUgd2lsbAotIyBvbmx5IHdvcmsgd2l0aCBQeXRob24gMS41IG9yIGhpZ2hlci4KLQotIyBUaGUgMyBwb3NzaWJsZSBvdXRjb21lcyBmb3IgZWFjaCBwYXR0ZXJuCi1bU1VDQ0VFRCwgRkFJTCwgU1lOVEFYX0VSUk9SXSA9IHJhbmdlKDMpCi0KLSMgQmVuY2htYXJrIHN1aXRlIChuZWVkcyBleHBhbnNpb24pCi0jCi0jIFRoZSBiZW5jaG1hcmsgc3VpdGUgZG9lcyBub3QgdGVzdCBjb3JyZWN0bmVzcywganVzdCBzcGVlZC4gIFRoZQotIyBmaXJzdCBlbGVtZW50IG9mIGVhY2ggdHVwbGUgaXMgdGhlIHJlZ2V4IHBhdHRlcm47IHRoZSBzZWNvbmQgaXMgYQotIyBzdHJpbmcgdG8gbWF0Y2ggaXQgYWdhaW5zdC4gIFRoZSBiZW5jaG1hcmtpbmcgY29kZSB3aWxsIGVtYmVkIHRoZQotIyBzZWNvbmQgc3RyaW5nIGluc2lkZSBzZXZlcmFsIHNpemVzIG9mIHBhZGRpbmcsIHRvIHRlc3QgaG93IHJlZ2V4Ci0jIG1hdGNoaW5nIHBlcmZvcm1zIG9uIGxhcmdlIHN0cmluZ3MuCi0KLWJlbmNobWFya3MgPSBbCi0gICAgICAgICgnUHl0aG9uJywgJ1B5dGhvbicpLCAgICAgICAgICAgICAgICAgICAgICMgU2ltcGxlIHRleHQgbGl0ZXJhbAotICAgICAgICAoJy4qUHl0aG9uJywgJ1B5dGhvbicpLCAgICAgICAgICAgICAgICAgICAjIEJhZCB0ZXh0IGxpdGVyYWwKLSAgICAgICAgKCcuKlB5dGhvbi4qJywgJ1B5dGhvbicpLCAgICAgICAgICAgICAgICAgIyBXb3JzZSB0ZXh0IGxpdGVyYWwKLSAgICAgICAgKCcuKlxcKFB5dGhvblxcKScsICdQeXRob24nKSwgICAgICAgICAgICAgIyBCYWQgdGV4dCBsaXRlcmFsIHdpdGggZ3JvdXBpbmcKLQotICAgICAgICAoJyhQeXRob25cXHxQZXJsXFx8VGNsJywgJ1BlcmwnKSwgICAgICAgICAgIyBBbHRlcm5hdGlvbgotICAgICAgICAoJ1xcKFB5dGhvblxcfFBlcmxcXHxUY2xcXCknLCAnUGVybCcpLCAgICAgIyBHcm91cGVkIGFsdGVybmF0aW9uCi0gICAgICAgICgnXFwoUHl0aG9uXFwpXFwxJywgJ1B5dGhvblB5dGhvbicpLCAgICAgICAjIEJhY2tyZWZlcmVuY2UKLSMgICAgICAgKCdcXChbMGEtel1bYS16XSosXFwpKycsICdhNSxiNyxjOSwnKSwgICAgICMgRGlzYWJsZSB0aGUgZmFzdG1hcCBvcHRpbWl6YXRpb24KLSAgICAgICAgKCdcXChbYS16XVthLXowLTldKixcXCkrJywgJ2E1LGI3LGM5LCcpICAgICMgQSBmZXcgc2V0cwotXQotCi0jIFRlc3Qgc3VpdGUgKGZvciB2ZXJpZnlpbmcgY29ycmVjdG5lc3MpCi0jCi0jIFRoZSB0ZXN0IHN1aXRlIGlzIGEgbGlzdCBvZiA1LSBvciAzLXR1cGxlcy4gIFRoZSA1IHBhcnRzIG9mIGEKLSMgY29tcGxldGUgdHVwbGUgYXJlOgotIyBlbGVtZW50IDA6IGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhdHRlcm4KLSMgICAgICAgICAxOiB0aGUgc3RyaW5nIHRvIG1hdGNoIGFnYWluc3QgdGhlIHBhdHRlcm4KLSMgICAgICAgICAyOiB0aGUgZXhwZWN0ZWQgcmVzdWx0IChTVUNDRUVELCBGQUlMLCBTWU5UQVhfRVJST1IpCi0jICAgICAgICAgMzogYSBzdHJpbmcgdGhhdCB3aWxsIGJlIGV2YWwoKSdlZCB0byBwcm9kdWNlIGEgdGVzdCBzdHJpbmcuCi0jICAgICAgICAgICAgVGhpcyBpcyBhbiBhcmJpdHJhcnkgUHl0aG9uIGV4cHJlc3Npb247IHRoZSBhdmFpbGFibGUKLSMgICAgICAgICAgICB2YXJpYWJsZXMgYXJlICJmb3VuZCIgKHRoZSB3aG9sZSBtYXRjaCksIGFuZCAiZzEiLCAiZzIiLCAuLi4KLSMgICAgICAgICAgICB1cCB0byAiZzEwIiBjb250YWluIHRoZSBjb250ZW50cyBvZiBlYWNoIGdyb3VwLCBvciB0aGUKLSMgICAgICAgICAgICBzdHJpbmcgJ05vbmUnIGlmIHRoZSBncm91cCB3YXNuJ3QgZ2l2ZW4gYSB2YWx1ZS4KLSMgICAgICAgICA0OiBUaGUgZXhwZWN0ZWQgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24uCi0jICAgICAgICAgICAgSWYgdGhlIHR3byBkb24ndCBtYXRjaCwgYW4gZXJyb3IgaXMgcmVwb3J0ZWQuCi0jCi0jIElmIHRoZSByZWdleCBpc24ndCBleHBlY3RlZCB0byB3b3JrLCB0aGUgbGF0dGVyIHR3byBlbGVtZW50cyBjYW4gYmUgb21pdHRlZC4KLQotdGVzdHMgPSBbCi0oJ2FiYycsICdhYmMnLCBTVUNDRUVELAotICdmb3VuZCcsICdhYmMnKSwKLSgnYWJjJywgJ3hiYycsIEZBSUwpLAotKCdhYmMnLCAnYXhjJywgRkFJTCksCi0oJ2FiYycsICdhYngnLCBGQUlMKSwKLSgnYWJjJywgJ3hhYmN5JywgU1VDQ0VFRCwKLSAnZm91bmQnLCAnYWJjJyksCi0oJ2FiYycsICdhYmFiYycsIFNVQ0NFRUQsCi0gJ2ZvdW5kJywgJ2FiYycpLAotKCdhYipjJywgJ2FiYycsIFNVQ0NFRUQsCi0gJ2ZvdW5kJywgJ2FiYycpLAotKCdhYipiYycsICdhYmMnLCBTVUNDRUVELAotICdmb3VuZCcsICdhYmMnKSwKLSgnYWIqYmMnLCAnYWJiYycsIFNVQ0NFRUQsCi0gJ2ZvdW5kJywgJ2FiYmMnKSwKLSgnYWIqYmMnLCAnYWJiYmJjJywgU1VDQ0VFRCwKLSAnZm91bmQnLCAnYWJiYmJjJyksCi0oJ2FiK2JjJywgJ2FiYmMnLCBTVUNDRUVELAotICdmb3VuZCcsICdhYmJjJyksCi0oJ2FiK2JjJywgJ2FiYycsIEZBSUwpLAotKCdhYitiYycsICdhYnEnLCBGQUlMKSwKLSgnYWIrYmMnLCAnYWJiYmJjJywgU1VDQ0VFRCwKLSAnZm91bmQnLCAnYWJiYmJjJyksCi0oJ2FiP2JjJywgJ2FiYmMnLCBTVUNDRUVELAotICdmb3VuZCcsICdhYmJjJyksCi0oJ2FiP2JjJywgJ2FiYycsIFNVQ0NFRUQsCi0gJ2ZvdW5kJywgJ2FiYycpLAotKCdhYj9iYycsICdhYmJiYmMnLCBGQUlMKSwKLSgnYWI/YycsICdhYmMnLCBTVUNDRUVELAotICdmb3VuZCcsICdhYmMnKSwKLSgnXmFiYyQnLCAnYWJjJywgU1VDQ0VFRCwKLSAnZm91bmQnLCAnYWJjJyksCi0oJ15hYmMkJywgJ2FiY2MnLCBGQUlMKSwKLSgnXmFiYycsICdhYmNjJywgU1VDQ0VFRCwKLSAnZm91bmQnLCAnYWJjJyksCi0oJ15hYmMkJywgJ2FhYmMnLCBGQUlMKSwKLSgnYWJjJCcsICdhYWJjJywgU1VDQ0VFRCwKLSAnZm91bmQnLCAnYWJjJyksCi0oJ14nLCAnYWJjJywgU1VDQ0VFRCwKLSAnZm91bmQrIi0iJywgJy0nKSwKLSgnJCcsICdhYmMnLCBTVUNDRUVELAotICdmb3VuZCsiLSInLCAnLScpLAotKCdhLmMnLCAnYWJjJywgU1VDQ0VFRCwKLSAnZm91bmQnLCAnYWJjJyksCi0oJ2EuYycsICdheGMnLCBTVUNDRUVELAotICdmb3VuZCcsICdheGMnKSwKLSgnYS4qYycsICdheHl6YycsIFNVQ0NFRUQsCi0gJ2ZvdW5kJywgJ2F4eXpjJyksCi0oJ2EuKmMnLCAnYXh5emQnLCBGQUlMKSwKLSgnYVtiY11kJywgJ2FiYycsIEZBSUwpLAotKCdhW2JjXWQnLCAnYWJkJywgU1VDQ0VFRCwKLSAnZm91bmQnLCAnYWJkJyksCi0oJ2FbYi1kXWUnLCAnYWJkJywgRkFJTCksCi0oJ2FbYi1kXWUnLCAnYWNlJywgU1VDQ0VFRCwKLSAnZm91bmQnLCAnYWNlJyksCi0oJ2FbYi1kXScsICdhYWMnLCBTVUNDRUVELAotICdmb3VuZCcsICdhYycpLAotKCdhWy1iXScsICdhLScsIFNVQ0NFRUQsCi0gJ2ZvdW5kJywgJ2EtJyksCi0oJ2FbYi1dJywgJ2EtJywgU1VDQ0VFRCwKLSAnZm91bmQnLCAnYS0nKSwKLSgnYVtdYicsICctJywgU1lOVEFYX0VSUk9SKSwKLSgnYVsnLCAnLScsIFNZTlRBWF9FUlJPUiksCi0oJ2FcXCcsICctJywgU1lOVEFYX0VSUk9SKSwKLSgnYWJjXFwpJywgJy0nLCBTWU5UQVhfRVJST1IpLAotKCdcXChhYmMnLCAnLScsIFNZTlRBWF9FUlJPUiksCi0oJ2FdJywgJ2FdJywgU1VDQ0VFRCwKLSAnZm91bmQnLCAnYV0nKSwKLSgnYVtdXWInLCAnYV1iJywgU1VDQ0VFRCwKLSAnZm91bmQnLCAnYV1iJyksCi0oJ2FbXmJjXWQnLCAnYWVkJywgU1VDQ0VFRCwKLSAnZm91bmQnLCAnYWVkJyksCi0oJ2FbXmJjXWQnLCAnYWJkJywgRkFJTCksCi0oJ2FbXi1iXWMnLCAnYWRjJywgU1VDQ0VFRCwKLSAnZm91bmQnLCAnYWRjJyksCi0oJ2FbXi1iXWMnLCAnYS1jJywgRkFJTCksCi0oJ2FbXl1iXWMnLCAnYV1jJywgRkFJTCksCi0oJ2FbXl1iXWMnLCAnYWRjJywgU1VDQ0VFRCwKLSAnZm91bmQnLCAnYWRjJyksCi0oJ1xcYmFcXGInLCAnYS0nLCBTVUNDRUVELAotICciLSInLCAnLScpLAotKCdcXGJhXFxiJywgJy1hJywgU1VDQ0VFRCwKLSAnIi0iJywgJy0nKSwKLSgnXFxiYVxcYicsICctYS0nLCBTVUNDRUVELAotICciLSInLCAnLScpLAotKCdcXGJ5XFxiJywgJ3h5JywgRkFJTCksCi0oJ1xcYnlcXGInLCAneXonLCBGQUlMKSwKLSgnXFxieVxcYicsICd4eXonLCBGQUlMKSwKLSgnYWJcXHxjZCcsICdhYmMnLCBTVUNDRUVELAotICdmb3VuZCcsICdhYicpLAotKCdhYlxcfGNkJywgJ2FiY2QnLCBTVUNDRUVELAotICdmb3VuZCcsICdhYicpLAotKCdcXChcXCllZicsICdkZWYnLCBTVUNDRUVELAotICdmb3VuZCsiLSIrZzEnLCAnZWYtJyksCi0oJyRiJywgJ2InLCBGQUlMKSwKLSgnYShiJywgJ2EoYicsIFNVQ0NFRUQsCi0gJ2ZvdW5kKyItIitnMScsICdhKGItTm9uZScpLAotKCdhKCpiJywgJ2FiJywgU1VDQ0VFRCwKLSAnZm91bmQnLCAnYWInKSwKLSgnYSgqYicsICdhKChiJywgU1VDQ0VFRCwKLSAnZm91bmQnLCAnYSgoYicpLAotKCdhXFxcXGInLCAnYVxcYicsIFNVQ0NFRUQsCi0gJ2ZvdW5kJywgJ2FcXGInKSwKLSgnXFwoXFwoYVxcKVxcKScsICdhYmMnLCBTVUNDRUVELAotICdmb3VuZCsiLSIrZzErIi0iK2cyJywgJ2EtYS1hJyksCi0oJ1xcKGFcXCliXFwoY1xcKScsICdhYmMnLCBTVUNDRUVELAotICdmb3VuZCsiLSIrZzErIi0iK2cyJywgJ2FiYy1hLWMnKSwKLSgnYStiK2MnLCAnYWFiYmFiYycsIFNVQ0NFRUQsCi0gJ2ZvdW5kJywgJ2FiYycpLAotKCdcXChhK1xcfGJcXCkqJywgJ2FiJywgU1VDQ0VFRCwKLSAnZm91bmQrIi0iK2cxJywgJ2FiLWInKSwKLSgnXFwoYStcXHxiXFwpKycsICdhYicsIFNVQ0NFRUQsCi0gJ2ZvdW5kKyItIitnMScsICdhYi1iJyksCi0oJ1xcKGErXFx8YlxcKT8nLCAnYWInLCBTVUNDRUVELAotICdmb3VuZCsiLSIrZzEnLCAnYS1hJyksCi0oJ1xcKVxcKCcsICctJywgU1lOVEFYX0VSUk9SKSwKLSgnW15hYl0qJywgJ2NkZScsIFNVQ0NFRUQsCi0gJ2ZvdW5kJywgJ2NkZScpLAotKCdhYmMnLCAnJywgRkFJTCksCi0oJ2EqJywgJycsIFNVQ0NFRUQsCi0gJ2ZvdW5kJywgJycpLAotKCdhXFx8YlxcfGNcXHxkXFx8ZScsICdlJywgU1VDQ0VFRCwKLSAnZm91bmQnLCAnZScpLAotKCdcXChhXFx8YlxcfGNcXHxkXFx8ZVxcKWYnLCAnZWYnLCBTVUNDRUVELAotICdmb3VuZCsiLSIrZzEnLCAnZWYtZScpLAotKCdhYmNkKmVmZycsICdhYmNkZWZnJywgU1VDQ0VFRCwKLSAnZm91bmQnLCAnYWJjZGVmZycpLAotKCdhYionLCAneGFieWFiYmJ6JywgU1VDQ0VFRCwKLSAnZm91bmQnLCAnYWInKSwKLSgnYWIqJywgJ3hheWFiYmJ6JywgU1VDQ0VFRCwKLSAnZm91bmQnLCAnYScpLAotKCdcXChhYlxcfGNkXFwpZScsICdhYmNkZScsIFNVQ0NFRUQsCi0gJ2ZvdW5kKyItIitnMScsICdjZGUtY2QnKSwKLSgnW2FiaGdlZmRjXWlqJywgJ2hpaicsIFNVQ0NFRUQsCi0gJ2ZvdW5kJywgJ2hpaicpLAotKCdeXFwoYWJcXHxjZFxcKWUnLCAnYWJjZGUnLCBGQUlMLAotICd4ZzF5JywgJ3h5JyksCi0oJ1xcKGFiY1xcfFxcKWVmJywgJ2FiY2RlZicsIFNVQ0NFRUQsCi0gJ2ZvdW5kKyItIitnMScsICdlZi0nKSwKLSgnXFwoYVxcfGJcXCljKmQnLCAnYWJjZCcsIFNVQ0NFRUQsCi0gJ2ZvdW5kKyItIitnMScsICdiY2QtYicpLAotKCdcXChhYlxcfGFiKlxcKWJjJywgJ2FiYycsIFNVQ0NFRUQsCi0gJ2ZvdW5kKyItIitnMScsICdhYmMtYScpLAotKCdhXFwoW2JjXSpcXCljKicsICdhYmMnLCBTVUNDRUVELAotICdmb3VuZCsiLSIrZzEnLCAnYWJjLWJjJyksCi0oJ2FcXChbYmNdKlxcKVxcKGMqZFxcKScsICdhYmNkJywgU1VDQ0VFRCwKLSAnZm91bmQrIi0iK2cxKyItIitnMicsICdhYmNkLWJjLWQnKSwKLSgnYVxcKFtiY10rXFwpXFwoYypkXFwpJywgJ2FiY2QnLCBTVUNDRUVELAotICdmb3VuZCsiLSIrZzErIi0iK2cyJywgJ2FiY2QtYmMtZCcpLAotKCdhXFwoW2JjXSpcXClcXChjK2RcXCknLCAnYWJjZCcsIFNVQ0NFRUQsCi0gJ2ZvdW5kKyItIitnMSsiLSIrZzInLCAnYWJjZC1iLWNkJyksCi0oJ2FbYmNkXSpkY2RjZGUnLCAnYWRjZGNkZScsIFNVQ0NFRUQsCi0gJ2ZvdW5kJywgJ2FkY2RjZGUnKSwKLSgnYVtiY2RdK2RjZGNkZScsICdhZGNkY2RlJywgRkFJTCksCi0oJ1xcKGFiXFx8YVxcKWIqYycsICdhYmMnLCBTVUNDRUVELAotICdmb3VuZCsiLSIrZzEnLCAnYWJjLWFiJyksCi0oJ1xcKFxcKGFcXClcXChiXFwpY1xcKVxcKGRcXCknLCAnYWJjZCcsIFNVQ0NFRUQsCi0gJ2cxKyItIitnMisiLSIrZzMrIi0iK2c0JywgJ2FiYy1hLWItZCcpLAotKCdbYS16QS1aX11bYS16QS1aMC05X10qJywgJ2FscGhhJywgU1VDQ0VFRCwKLSAnZm91bmQnLCAnYWxwaGEnKSwKLSgnXmFcXChiYytcXHxiW2VoXVxcKWdcXHwuaCQnLCAnYWJoJywgU1VDQ0VFRCwKLSAnZm91bmQrIi0iK2cxJywgJ2JoLU5vbmUnKSwKLSgnXFwoYmMrZCRcXHxlZipnLlxcfGg/aVxcKGpcXHxrXFwpXFwpJywgJ2VmZmd6JywgU1VDQ0VFRCwKLSAnZm91bmQrIi0iK2cxKyItIitnMicsICdlZmZnei1lZmZnei1Ob25lJyksCi0oJ1xcKGJjK2QkXFx8ZWYqZy5cXHxoP2lcXChqXFx8a1xcKVxcKScsICdpaicsIFNVQ0NFRUQsCi0gJ2ZvdW5kKyItIitnMSsiLSIrZzInLCAnaWotaWotaicpLAotKCdcXChiYytkJFxcfGVmKmcuXFx8aD9pXFwoalxcfGtcXClcXCknLCAnZWZmZycsIEZBSUwpLAotKCdcXChiYytkJFxcfGVmKmcuXFx8aD9pXFwoalxcfGtcXClcXCknLCAnYmNkZCcsIEZBSUwpLAotKCdcXChiYytkJFxcfGVmKmcuXFx8aD9pXFwoalxcfGtcXClcXCknLCAncmVmZmd6JywgU1VDQ0VFRCwKLSAnZm91bmQrIi0iK2cxKyItIitnMicsICdlZmZnei1lZmZnei1Ob25lJyksCi0oJ1xcKFxcKFxcKFxcKFxcKFxcKFxcKFxcKFxcKGFcXClcXClcXClcXClcXClcXClcXClcXClcXCknLCAnYScsIFNVQ0NFRUQsCi0gJ2ZvdW5kJywgJ2EnKSwKLSgnbXVsdGlwbGUgd29yZHMgb2YgdGV4dCcsICd1aC11aCcsIEZBSUwpLAotKCdtdWx0aXBsZSB3b3JkcycsICdtdWx0aXBsZSB3b3JkcywgeWVhaCcsIFNVQ0NFRUQsCi0gJ2ZvdW5kJywgJ211bHRpcGxlIHdvcmRzJyksCi0oJ1xcKC4qXFwpY1xcKC4qXFwpJywgJ2FiY2RlJywgU1VDQ0VFRCwKLSAnZm91bmQrIi0iK2cxKyItIitnMicsICdhYmNkZS1hYi1kZScpLAotKCcoXFwoLipcXCksIFxcKC4qXFwpKScsICcoYSwgYiknLCBTVUNDRUVELAotICdnMisiLSIrZzEnLCAnYi1hJyksCi0oJ1trXScsICdhYicsIEZBSUwpLAotKCdhWy1dP2MnLCAnYWMnLCBTVUNDRUVELAotICdmb3VuZCcsICdhYycpLAotKCdcXChhYmNcXClcXDEnLCAnYWJjYWJjJywgU1VDQ0VFRCwKLSAnZzEnLCAnYWJjJyksCi0oJ1xcKFthLWNdKlxcKVxcMScsICdhYmNhYmMnLCBTVUNDRUVELAotICdnMScsICdhYmMnKSwKLSgnXlxcKC4rXFwpP0InLCAnQUInLCBTVUNDRUVELAotICdnMScsICdBJyksCi0oJ1xcKGErXFwpLlxcMSQnLCAnYWFhYWEnLCBTVUNDRUVELAotICdmb3VuZCsiLSIrZzEnLCAnYWFhYWEtYWEnKSwKLSgnXlxcKGErXFwpLlxcMSQnLCAnYWFhYScsIEZBSUwpLAotKCdcXChhYmNcXClcXDEnLCAnYWJjYWJjJywgU1VDQ0VFRCwKLSAnZm91bmQrIi0iK2cxJywgJ2FiY2FiYy1hYmMnKSwKLSgnXFwoW2EtY10rXFwpXFwxJywgJ2FiY2FiYycsIFNVQ0NFRUQsCi0gJ2ZvdW5kKyItIitnMScsICdhYmNhYmMtYWJjJyksCi0oJ1xcKGFcXClcXDEnLCAnYWEnLCBTVUNDRUVELAotICdmb3VuZCsiLSIrZzEnLCAnYWEtYScpLAotKCdcXChhK1xcKVxcMScsICdhYScsIFNVQ0NFRUQsCi0gJ2ZvdW5kKyItIitnMScsICdhYS1hJyksCi0oJ1xcKGErXFwpK1xcMScsICdhYScsIFNVQ0NFRUQsCi0gJ2ZvdW5kKyItIitnMScsICdhYS1hJyksCi0oJ1xcKGFcXCkuK1xcMScsICdhYmEnLCBTVUNDRUVELAotICdmb3VuZCsiLSIrZzEnLCAnYWJhLWEnKSwKLSgnXFwoYVxcKWJhKlxcMScsICdhYmEnLCBTVUNDRUVELAotICdmb3VuZCsiLSIrZzEnLCAnYWJhLWEnKSwKLSgnXFwoYWFcXHxhXFwpYVxcMSQnLCAnYWFhJywgU1VDQ0VFRCwKLSAnZm91bmQrIi0iK2cxJywgJ2FhYS1hJyksCi0oJ1xcKGFcXHxhYVxcKWFcXDEkJywgJ2FhYScsIFNVQ0NFRUQsCi0gJ2ZvdW5kKyItIitnMScsICdhYWEtYScpLAotKCdcXChhK1xcKWFcXDEkJywgJ2FhYScsIFNVQ0NFRUQsCi0gJ2ZvdW5kKyItIitnMScsICdhYWEtYScpLAotKCdcXChbYWJjXSpcXClcXDEnLCAnYWJjYWJjJywgU1VDQ0VFRCwKLSAnZm91bmQrIi0iK2cxJywgJ2FiY2FiYy1hYmMnKSwKLSgnXFwoYVxcKVxcKGJcXCljXFx8YWInLCAnYWInLCBTVUNDRUVELAotICdmb3VuZCsiLSIrZzErIi0iK2cyJywgJ2FiLU5vbmUtTm9uZScpLAotKCdcXChhXFwpK3gnLCAnYWFheCcsIFNVQ0NFRUQsCi0gJ2ZvdW5kKyItIitnMScsICdhYWF4LWEnKSwKLSgnXFwoW2FjXVxcKSt4JywgJ2FhY3gnLCBTVUNDRUVELAotICdmb3VuZCsiLSIrZzEnLCAnYWFjeC1jJyksCi0oJ1xcKFteL10qL1xcKSpzdWIxLycsICdkOm1zZ3MvdGRpci9zdWIxL3RyaWFsL2F3YXkuY3BwJywgU1VDQ0VFRCwKLSAnZm91bmQrIi0iK2cxJywgJ2Q6bXNncy90ZGlyL3N1YjEvLXRkaXIvJyksCi0oJ1xcKFteLl0qXFwpXFwuXFwoW146XSpcXCk6W1QgXStcXCguKlxcKScsICd0cmFjazEudGl0bGU6VEJsYWggYmxhaCBibGFoJywgU1VDQ0VFRCwKLSAnZm91bmQrIi0iK2cxKyItIitnMisiLSIrZzMnLCAndHJhY2sxLnRpdGxlOlRCbGFoIGJsYWggYmxhaC10cmFjazEtdGl0bGUtQmxhaCBibGFoIGJsYWgnKSwKLSgnXFwoW15OXSpOXFwpKycsICdhYk5OeHl6TicsIFNVQ0NFRUQsCi0gJ2ZvdW5kKyItIitnMScsICdhYk5OeHl6Ti14eXpOJyksCi0oJ1xcKFteTl0qTlxcKSsnLCAnYWJOTnh5eicsIFNVQ0NFRUQsCi0gJ2ZvdW5kKyItIitnMScsICdhYk5OLU4nKSwKLSgnXFwoW2FiY10qXFwpeCcsICdhYmN4JywgU1VDQ0VFRCwKLSAnZm91bmQrIi0iK2cxJywgJ2FiY3gtYWJjJyksCi0oJ1xcKFthYmNdKlxcKXgnLCAnYWJjJywgRkFJTCksCi0oJ1xcKFt4eXpdKlxcKXgnLCAnYWJjeCcsIFNVQ0NFRUQsCi0gJ2ZvdW5kKyItIitnMScsICd4LScpLAotKCdcXChhXFwpK2JcXHxhYWMnLCAnYWFjJywgU1VDQ0VFRCwKLSAnZm91bmQrIi0iK2cxJywgJ2FhYy1Ob25lJyksCi0oJ1w8YScsICdhJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2EnKSwKLSgnXDxhJywgJyEnLCBGQUlMKSwKLSgnYVw8YicsICdhYicsIEZBSUwpLAotKCdhXD4nLCAnYWInLCBGQUlMKSwKLSgnYVw+JywgJ2EhJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2EnKSwKLSgnYVw+JywgJ2EnLCBTVUNDRUVELCAnZm91bmQnLCAnYScpLAotXQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvcmVncnRlc3QucHkgYi9MaWIvdGVzdC9yZWdydGVzdC5weQppbmRleCA1MDQ0Y2U0Li4yMTcwOWY3IDEwMDc1NQotLS0gYS9MaWIvdGVzdC9yZWdydGVzdC5weQorKysgYi9MaWIvdGVzdC9yZWdydGVzdC5weQpAQCAtMzIsNyArMzIsNyBAQAogCiBTZWxlY3RpbmcgdGVzdHMKIAotLXIvLS1yYW5kb20gICAgIC0tIHJhbmRvbWl6ZSB0ZXN0IGV4ZWN1dGlvbiBvcmRlciAoc2VlIGJlbG93KQorLXIvLS1yYW5kb21pemUgIC0tIHJhbmRvbWl6ZSB0ZXN0IGV4ZWN1dGlvbiBvcmRlciAoc2VlIGJlbG93KQogICAgLS1yYW5kc2VlZCAgIC0tIHBhc3MgYSByYW5kb20gc2VlZCB0byByZXByb2R1Y2UgYSBwcmV2aW91cyByYW5kb20gcnVuCiAtZi8tLWZyb21maWxlICAgLS0gcmVhZCBuYW1lcyBvZiB0ZXN0cyB0byBydW4gZnJvbSBhIGZpbGUgKHNlZSBiZWxvdykKIC14Ly0tZXhjbHVkZSAgICAtLSBhcmd1bWVudHMgYXJlIHRlc3RzIHRvICpleGNsdWRlKgpAQCAtMTU4LDYgKzE1OCw3IEBACiBpbXBvcnQgb3MKIGltcG9ydCByYW5kb20KIGltcG9ydCByZQoraW1wb3J0IHNodXRpbAogaW1wb3J0IHN5cwogaW1wb3J0IHRpbWUKIGltcG9ydCB0cmFjZWJhY2sKQEAgLTI1OCw3ICsyNTksNyBAQAogICAgIHRyeToKICAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAnaHZxeHNTcmY6bHU6dDpURDpOTFI6RndXTTpqOicsCiAgICAgICAgICAgICBbJ2hlbHAnLCAndmVyYm9zZScsICd2ZXJib3NlMicsICd2ZXJib3NlMycsICdxdWlldCcsCi0gICAgICAgICAgICAgJ2V4Y2x1ZGUnLCAnc2luZ2xlJywgJ3Nsb3cnLCAncmFuZG9tJywgJ2Zyb21maWxlJywgJ2ZpbmRsZWFrcycsCisgICAgICAgICAgICAgJ2V4Y2x1ZGUnLCAnc2luZ2xlJywgJ3Nsb3cnLCAncmFuZG9taXplJywgJ2Zyb21maWxlPScsICdmaW5kbGVha3MnLAogICAgICAgICAgICAgICd1c2U9JywgJ3RocmVzaG9sZD0nLCAndHJhY2UnLCAnY292ZXJkaXI9JywgJ25vY292ZXJkaXInLAogICAgICAgICAgICAgICdydW5sZWFrcycsICdodW50cmxlYWtzPScsICdtZW1saW1pdD0nLCAncmFuZHNlZWQ9JywKICAgICAgICAgICAgICAnbXVsdGlwcm9jZXNzPScsICdzbGF2ZWFyZ3M9JywgJ2ZvcmV2ZXInLCAnaGVhZGVyJ10pCkBAIC01NDAsNiArNTQxLDggQEAKICAgICAgICAgICAgICAgICAgICAgcHJpbnQgc3Rkb3V0CiAgICAgICAgICAgICAgICAgaWYgc3RkZXJyOgogICAgICAgICAgICAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsIHN0ZGVycgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQogICAgICAgICAgICAgICAgIGlmIHJlc3VsdFswXSA9PSBJTlRFUlJVUFRFRDoKICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHJlc3VsdFsxXSA9PSAnS2V5Ym9hcmRJbnRlcnJ1cHQnCiAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEtleWJvYXJkSW50ZXJydXB0ICAgIyBXaGF0IGVsc2U/CkBAIC03NTgsNyArNzYxLDkgQEAKICAgICAjIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBuYW1lcy4KIAogICAgIHJlc291cmNlcyA9ICgnc3lzLmFyZ3YnLCAnY3dkJywgJ3N5cy5zdGRpbicsICdzeXMuc3Rkb3V0JywgJ3N5cy5zdGRlcnInLAotICAgICAgICAgICAgICAgICAnb3MuZW52aXJvbicsICdzeXMucGF0aCcsICdhc3luY29yZS5zb2NrZXRfbWFwJykKKyAgICAgICAgICAgICAgICAgJ29zLmVudmlyb24nLCAnc3lzLnBhdGgnLCAnYXN5bmNvcmUuc29ja2V0X21hcCcsCisgICAgICAgICAgICAgICAgICd0ZXN0X3N1cHBvcnQuVEVTVEZOJywKKyAgICAgICAgICAgICAgICApCiAKICAgICBkZWYgZ2V0X3N5c19hcmd2KHNlbGYpOgogICAgICAgICByZXR1cm4gaWQoc3lzLmFyZ3YpLCBzeXMuYXJndiwgc3lzLmFyZ3ZbOl0KQEAgLTgwOSw2ICs4MTQsMjEgQEAKICAgICAgICAgICAgIGFzeW5jb3JlLmNsb3NlX2FsbChpZ25vcmVfYWxsPVRydWUpCiAgICAgICAgICAgICBhc3luY29yZS5zb2NrZXRfbWFwLnVwZGF0ZShzYXZlZF9tYXApCiAKKyAgICBkZWYgZ2V0X3Rlc3Rfc3VwcG9ydF9URVNURk4oc2VsZik6CisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4pOgorICAgICAgICAgICAgcmVzdWx0ID0gJ2YnCisgICAgICAgIGVsaWYgb3MucGF0aC5pc2Rpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKToKKyAgICAgICAgICAgIHJlc3VsdCA9ICdkJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzdWx0ID0gTm9uZQorICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgZGVmIHJlc3RvcmVfdGVzdF9zdXBwb3J0X1RFU1RGTihzZWxmLCBzYXZlZF92YWx1ZSk6CisgICAgICAgIGlmIHNhdmVkX3ZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOKToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgICAgIGVsaWYgb3MucGF0aC5pc2Rpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKToKKyAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKICAgICBkZWYgcmVzb3VyY2VfaW5mbyhzZWxmKToKICAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5yZXNvdXJjZXM6CiAgICAgICAgICAgICBtZXRob2Rfc3VmZml4ID0gbmFtZS5yZXBsYWNlKCcuJywgJ18nKQpAQCAtOTI0LDcgKzk0NCw2IEBACiAgICAgICAgIHJldHVybiBGQUlMRUQsIHRlc3RfdGltZQogCiBkZWYgY2xlYW51cF90ZXN0X2Ryb3BwaW5ncyh0ZXN0bmFtZSwgdmVyYm9zZSk6Ci0gICAgaW1wb3J0IHNodXRpbAogICAgIGltcG9ydCBzdGF0CiAgICAgaW1wb3J0IGdjCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3NhbXBsZV9kb2N0ZXN0X25vX2RvY3N0cmluZ3MucHkgYi9MaWIvdGVzdC9zYW1wbGVfZG9jdGVzdF9ub19kb2NzdHJpbmdzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MjAxZWQKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9zYW1wbGVfZG9jdGVzdF9ub19kb2NzdHJpbmdzLnB5CkBAIC0wLDAgKzEsMTIgQEAKKyMgVGhpcyBpcyBhIHNhbXBsZSBtb2R1bGUgdXNlZCBmb3IgdGVzdGluZyBkb2N0ZXN0LgorIworIyBUaGlzIG1vZHVsZSBpcyBmb3IgdGVzdGluZyBob3cgZG9jdGVzdCBoYW5kbGVzIGEgbW9kdWxlIHdpdGggbm8KKyMgZG9jc3RyaW5ncy4KKworCitjbGFzcyBGb28ob2JqZWN0KToKKworICAgICMgQSBjbGFzcyB3aXRoIG5vIGRvY3N0cmluZy4KKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvc2FtcGxlX2RvY3Rlc3Rfbm9fZG9jdGVzdHMucHkgYi9MaWIvdGVzdC9zYW1wbGVfZG9jdGVzdF9ub19kb2N0ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGFhNTcyCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3Qvc2FtcGxlX2RvY3Rlc3Rfbm9fZG9jdGVzdHMucHkKQEAgLTAsMCArMSwxNSBAQAorIiIiVGhpcyBpcyBhIHNhbXBsZSBtb2R1bGUgdXNlZCBmb3IgdGVzdGluZyBkb2N0ZXN0LgorCitUaGlzIG1vZHVsZSBpcyBmb3IgdGVzdGluZyBob3cgZG9jdGVzdCBoYW5kbGVzIGEgbW9kdWxlIHdpdGggZG9jc3RyaW5ncworYnV0IG5vIGRvY3Rlc3QgZXhhbXBsZXMuCisKKyIiIgorCisKK2NsYXNzIEZvbyhvYmplY3QpOgorICAgICIiIkEgZG9jc3RyaW5nIHdpdGggbm8gZG9jdGVzdCBleGFtcGxlcy4KKworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9zY3JpcHRfaGVscGVyLnB5IGIvTGliL3Rlc3Qvc2NyaXB0X2hlbHBlci5weQppbmRleCAzMzc4NTRhLi43ZjdjNzBlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9zY3JpcHRfaGVscGVyLnB5CisrKyBiL0xpYi90ZXN0L3NjcmlwdF9oZWxwZXIucHkKQEAgLTEwLDcgKzEwLDEzIEBACiBpbXBvcnQgcHlfY29tcGlsZQogaW1wb3J0IGNvbnRleHRsaWIKIGltcG9ydCBzaHV0aWwKLWltcG9ydCB6aXBmaWxlCit0cnk6CisgICAgaW1wb3J0IHppcGZpbGUKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAjIElmIFB5dGhvbiBpcyBidWlsZCB3aXRob3V0IFVuaWNvZGUgc3VwcG9ydCwgaW1wb3J0aW5nIF9pbyB3aWxsCisgICAgIyBmYWlsLCB3aGljaCwgaW4gdHVybiwgbWVhbnMgdGhhdCB6aXBmaWxlIGNhbm5vdCBiZSBpbXBvcnRlZAorICAgICMgTW9zdCBvZiB0aGlzIG1vZHVsZSBjYW4gdGhlbiBzdGlsbCBiZSB1c2VkLgorICAgIHBhc3MKIAogZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgc3RyaXBfcHl0aG9uX3N0ZGVycgogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9zaGEyNTYucGVtIGIvTGliL3Rlc3Qvc2hhMjU2LnBlbQppbmRleCBkNDg4ZTZkLi45NDc1NTc2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC9zaGEyNTYucGVtCisrKyBiL0xpYi90ZXN0L3NoYTI1Ni5wZW0KQEAgLTEsMTI5ICsxLDEyOCBAQAogIyBDZXJ0aWZpY2F0ZSBjaGFpbiBmb3IgaHR0cHM6Ly9zaGEyNTYudGJzLWludGVybmV0LmNvbQotIDAgczovQz1GUi9wb3N0YWxDb2RlPTE0MDAwL1NUPUNhbHZhZG9zL0w9Q0FFTi9zdHJlZXQ9MjIgcnVlIGRlIEJyZXRhZ25lL089VEJTIElOVEVSTkVUL09VPTAwMDIgNDQwNDQzODEwL09VPXNoYS0yNTYgcHJvZHVjdGlvbi9DTj1zaGEyNTYudGJzLWludGVybmV0LmNvbQotICAgaTovQz1GUi9TVD1DYWx2YWRvcy9MPUNhZW4vTz1UQlMgSU5URVJORVQvT1U9VGVybXMgYW5kIENvbmRpdGlvbnM6IGh0dHA6Ly93d3cudGJzLWludGVybmV0LmNvbS9DQS9yZXBvc2l0b3J5L09VPVRCUyBJTlRFUk5FVCBDQS9DTj1UQlMgWDUwOSBDQSBTR0MKKyAwIHM6L0M9RlIvcG9zdGFsQ29kZT0xNDAwMC9TVD1DYWx2YWRvcy9MPUNBRU4vc3RyZWV0PTIyIHJ1ZSBkZSBCcmV0YWduZS9PPVRCUyBJTlRFUk5FVC9PVT0wMDAyIDQ0MDQ0MzgxMC9PVT1DZXJ0aWZpY2F0cyBUQlMgWDUwOS9DTj1lY29tLnRicy14NTA5LmNvbQorICAgaTovQz1GUi9TVD1DYWx2YWRvcy9MPUNhZW4vTz1UQlMgSU5URVJORVQvT1U9VGVybXMgYW5kIENvbmRpdGlvbnM6IGh0dHA6Ly93d3cudGJzLWludGVybmV0LmNvbS9DQS9yZXBvc2l0b3J5L09VPVRCUyBJTlRFUk5FVCBDQS9DTj1UQlMgWDUwOSBDQSBidXNpbmVzcwogLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi1NSUlHWFRDQ0JVV2dBd0lCQWdJUkFNbWFnK3lnU0FkeFpzYnl6WWpodVcwd0RRWUpLb1pJaHZjTkFRRUxCUUF3Ci1nY1F4Q3pBSkJnTlZCQVlUQWtaU01SRXdEd1lEVlFRSUV3aERZV3gyWVdSdmN6RU5NQXNHQTFVRUJ4TUVRMkZsCi1iakVWTUJNR0ExVUVDaE1NVkVKVElFbE9WRVZTVGtWVU1VZ3dSZ1lEVlFRTEV6OVVaWEp0Y3lCaGJtUWdRMjl1Ci1aR2wwYVc5dWN6b2dhSFIwY0RvdkwzZDNkeTUwWW5NdGFXNTBaWEp1WlhRdVkyOXRMME5CTDNKbGNHOXphWFJ2Ci1jbmt4R0RBV0JnTlZCQXNURDFSQ1V5QkpUbFJGVWs1RlZDQkRRVEVZTUJZR0ExVUVBeE1QVkVKVElGZzFNRGtnCi1RMEVnVTBkRE1CNFhEVEV3TURJeE9EQXdNREF3TUZvWERURXlNREl4T1RJek5UazFPVm93Z2NzeEN6QUpCZ05WCi1CQVlUQWtaU01RNHdEQVlEVlFRUkV3VXhOREF3TURFUk1BOEdBMVVFQ0JNSVEyRnNkbUZrYjNNeERUQUxCZ05WCi1CQWNUQkVOQlJVNHhHekFaQmdOVkJBa1RFakl5SUhKMVpTQmtaU0JDY21WMFlXZHVaVEVWTUJNR0ExVUVDaE1NCi1WRUpUSUVsT1ZFVlNUa1ZVTVJjd0ZRWURWUVFMRXc0d01EQXlJRFEwTURRME16Z3hNREViTUJrR0ExVUVDeE1TCi1jMmhoTFRJMU5pQndjbTlrZFdOMGFXOXVNU0F3SGdZRFZRUURFeGR6YUdFeU5UWXVkR0p6TFdsdWRHVnlibVYwCi1MbU52YlRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS2J1TThWVDdmMG5udHd1Ci1OM0Y3djlLSUJsaEtOQXhxQ3J6aU9YVTVpcVV0OEhyUUIzRHRIYmRtSUkrQ3BWVWx3bG1lcHN4Nkcrc3JFWjlhCi1NSUdBeTBueGk1YUxiN3dhdGt5SWRQakpUTXZUVUJRLytSUFd6dDVKdFliYlk5QmxKK3ljaTBkY3RQNzRmNE5VCi1JU0x0bHJFalViZjJnVG9oTHJjRTAxVGZtT0Y2UERFYkI1UEtEaTM4Y0IzTnpLZml6V2ZyT2FKVzZRMUMxcU9KCi15NC80amtVUkVYMVVGVUl4eng3djYyVmZqWFNHbGNqR3BCWDFmdnRBQlFPU0xlRTBhNmdjaURaczFSRXFyb0ZmCi01ZVh0cVlwaHBUYTE0WjgzSVRYTWZnZzVOemUxVnRNbnpJOVF4NGJsWUJ3NGRnUVZFdUlzWXI3RkRCT0lURHpjCi1WRVZYWngwQ0F3RUFBYU9DQWo4d2dnSTdNQjhHQTFVZEl3UVlNQmFBRkFkRWRvV1RLTHgvYlhqU0N1djZURXZmCi0yWUlmTUIwR0ExVWREZ1FXQkJTSktJL0FZVkk5UlFOWTBRUElxYzhlajJRaXZUQU9CZ05WSFE4QkFmOEVCQU1DCi1CYUF3REFZRFZSMFRBUUgvQkFJd0FEQTBCZ05WSFNVRUxUQXJCZ2dyQmdFRkJRY0RBUVlJS3dZQkJRVUhBd0lHCi1DaXNHQVFRQmdqY0tBd01HQ1dDR1NBR0crRUlFQVRCTUJnTlZIU0FFUlRCRE1FRUdDeXNHQVFRQmdPVTNBZ1FCCi1NREl3TUFZSUt3WUJCUVVIQWdFV0pHaDBkSEJ6T2k4dmQzZDNMblJpY3kxcGJuUmxjbTVsZEM1amIyMHZRMEV2Ci1RMUJUTkRCdEJnTlZIUjhFWmpCa01ES2dNS0F1aGl4b2RIUndPaTh2WTNKc0xuUmljeTFwYm5SbGNtNWxkQzVqCi1iMjB2VkVKVFdEVXdPVU5CVTBkRExtTnliREF1b0N5Z0tvWW9hSFIwY0RvdkwyTnliQzUwWW5NdGVEVXdPUzVqCi1iMjB2VkVKVFdEVXdPVU5CVTBkRExtTnliRENCcGdZSUt3WUJCUVVIQVFFRWdaa3dnWll3T0FZSUt3WUJCUVVICi1NQUtHTEdoMGRIQTZMeTlqY25RdWRHSnpMV2x1ZEdWeWJtVjBMbU52YlM5VVFsTllOVEE1UTBGVFIwTXVZM0owCi1NRFFHQ0NzR0FRVUZCekFDaGlob2RIUndPaTh2WTNKMExuUmljeTE0TlRBNUxtTnZiUzlVUWxOWU5UQTVRMEZUCi1SME11WTNKME1DUUdDQ3NHQVFVRkJ6QUJoaGhvZEhSd09pOHZiMk56Y0M1MFluTXRlRFV3T1M1amIyMHdQd1lECi1WUjBSQkRnd05vSVhjMmhoTWpVMkxuUmljeTFwYm5SbGNtNWxkQzVqYjIyQ0czZDNkeTV6YUdFeU5UWXVkR0p6Ci1MV2x1ZEdWeWJtVjBMbU52YlRBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQUE1TkwwRDRRU3FoRXJobGtkUG16Ci1YdGlNdmRHTCtaZWhNNGNvVFJJcGFzTS9BZ3QzNlJjME56Q3ZuUXdLRSt3a25nZzFHeTJxZTdRMEUvemlxQnRCCi1mWll6ZFZndTF6ZGlMNGtUYWYrd0ZLWUFGR3NGYnllRW1YeXN5K0NNd2FOb0YydnBTakNVMVVENTZiRW5UWC9XCi1meFZaWXh0QlFVcG51MndPc204Y0RadVpSdjlYcllnQWhHajlUdDZGMGFWSFNER241OXV3U2hHMStCVkYvdWp1Ci1TQ3lQVFRqTDFvYzdZRWxKVXpSL3g0bVFKWXZ0UUk4Z0RJREFHRU9zN3YzUi9nS2E1RU1mYlVRVUk0Qzg0VWJJCi1ZejA5SmRud3MvTWtDL0htMUJaRXFrODl1N0h2ZnYrb0hxRWIwWGFVbzBURGZzeEUwTTFzTWRuTGI5MVFOUUJtCi1VUT09CitNSUlHVGpDQ0JUYWdBd0lCQWdJUU9oM2Q5ZE5EUHExY1NkSm1FaU1wcURBTkJna3Foa2lHOXcwQkFRVUZBRENCCit5VEVMTUFrR0ExVUVCaE1DUmxJeEVUQVBCZ05WQkFnVENFTmhiSFpoWkc5ek1RMHdDd1lEVlFRSEV3UkRZV1Z1CitNUlV3RXdZRFZRUUtFd3hVUWxNZ1NVNVVSVkpPUlZReFNEQkdCZ05WQkFzVFAxUmxjbTF6SUdGdVpDQkRiMjVrCithWFJwYjI1ek9pQm9kSFJ3T2k4dmQzZDNMblJpY3kxcGJuUmxjbTVsZEM1amIyMHZRMEV2Y21Wd2IzTnBkRzl5CitlVEVZTUJZR0ExVUVDeE1QVkVKVElFbE9WRVZTVGtWVUlFTkJNUjB3R3dZRFZRUURFeFJVUWxNZ1dEVXdPU0JECitRU0JpZFhOcGJtVnpjekFlRncweE1UQXhNalV3TURBd01EQmFGdzB4TXpBeU1EVXlNelU1TlRsYU1JSEhNUXN3CitDUVlEVlFRR0V3SkdVakVPTUF3R0ExVUVFUk1GTVRRd01EQXhFVEFQQmdOVkJBZ1RDRU5oYkhaaFpHOXpNUTB3CitDd1lEVlFRSEV3UkRRVVZPTVJzd0dRWURWUVFKRXhJeU1pQnlkV1VnWkdVZ1FuSmxkR0ZuYm1VeEZUQVRCZ05WCitCQW9UREZSQ1V5QkpUbFJGVWs1RlZERVhNQlVHQTFVRUN4TU9NREF3TWlBME5EQTBORE00TVRBeEhUQWJCZ05WCitCQXNURkVObGNuUnBabWxqWVhSeklGUkNVeUJZTlRBNU1Sb3dHQVlEVlFRREV4RmxZMjl0TG5SaWN5MTROVEE1CitMbU52YlRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS1JybEhVbkorKzFscGNnCitqdFljbzdjZG1SZStFRWZUbXdQZkNkZlYzRzFRZnNUU3ZZNkZmTXBtLzgzcHFIZlQrNEFOd3IxOHdEOVpyQUVOCitHMTZtZjlWZENHSzEyK1RQN0RtcWVaeUdJcWxGRm9haFFubWI4RWFydkU0My8xVWVRMkNWOVhtendadnBxZWxpCitMZlhzRm9uYXdyWTNINlpuTXdTNjRTdDYxWis5Z2R5dVovUmJzb1pCYlQ1S1VqREVHODQ0UVJVNE9UMUlHZUVJCitlWTVOTTVSTkloNlpOaFZ0cWVlQ3hNUzdhZk9Oa0hRck9jbzczUmRTVFJjay9Iajk2T2ZsM01ITkhyeXIrQU1LCitER0ZrMWtMQ1pHcFBkWHRreFh2YURlUW9pWURsaWwyNkNXYytZSzZ4eURQTWRzV3ZvRzE0Wkx5Q3B6TVhBNy83Cis0WUFRUkgwQ0F3RUFBYU9DQWpBd2dnSXNNQjhHQTFVZEl3UVlNQmFBRkJvSkJNejVDWSs3SHFETzFLUVVmMHZWCitJMWpOTUIwR0ExVWREZ1FXQkJRZ09VOEhzV3pibUQ0V1pQNVd0ZHc3amNhMldEQU9CZ05WSFE4QkFmOEVCQU1DCitCYUF3REFZRFZSMFRBUUgvQkFJd0FEQWRCZ05WSFNVRUZqQVVCZ2dyQmdFRkJRY0RBUVlJS3dZQkJRVUhBd0l3CitUQVlEVlIwZ0JFVXdRekJCQmdzckJnRUVBWURsTndJQkFUQXlNREFHQ0NzR0FRVUZCd0lCRmlSb2RIUndjem92CitMM2QzZHk1MFluTXRhVzUwWlhKdVpYUXVZMjl0TDBOQkwwTlFVekV3ZHdZRFZSMGZCSEF3YmpBM29EV2dNNFl4CithSFIwY0RvdkwyTnliQzUwWW5NdGFXNTBaWEp1WlhRdVkyOXRMMVJDVTFnMU1EbERRV0oxYzJsdVpYTnpMbU55CitiREF6b0RHZ0w0WXRhSFIwY0RvdkwyTnliQzUwWW5NdGVEVXdPUzVqYjIwdlZFSlRXRFV3T1VOQlluVnphVzVsCitjM011WTNKc01JR3dCZ2dyQmdFRkJRY0JBUVNCb3pDQm9EQTlCZ2dyQmdFRkJRY3dBb1l4YUhSMGNEb3ZMMk55CitkQzUwWW5NdGFXNTBaWEp1WlhRdVkyOXRMMVJDVTFnMU1EbERRV0oxYzJsdVpYTnpMbU55ZERBNUJnZ3JCZ0VGCitCUWN3QW9ZdGFIUjBjRG92TDJOeWRDNTBZbk10ZURVd09TNWpiMjB2VkVKVFdEVXdPVU5CWW5WemFXNWxjM011CitZM0owTUNRR0NDc0dBUVVGQnpBQmhoaG9kSFJ3T2k4dmIyTnpjQzUwWW5NdGVEVXdPUzVqYjIwd013WURWUjBSCitCQ3d3S29JUlpXTnZiUzUwWW5NdGVEVXdPUzVqYjIyQ0ZYZDNkeTVsWTI5dExuUmljeTE0TlRBNUxtTnZiVEFOCitCZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFyVDROSGZiWTg3YkdBdzhsUFY0RG1IbG11RHVWcC95N2x0TzNZbnNlCiszUno4UnhXMkF6dU8wT3kyRjBDdTR5V0t0TXlFeU1YeUhxV3RhZTdFbFJiZFR1NXc1R3dWQkxKSENsQ3pDOFM5CitTcGdNTVFUeDNSZ244dmprSHVVOVZaUWx1bFp5aVBLN3l1bmpjN2MzMTBTOUZSWjdYeE93ZjhObng0V25CK05vCitXcmZBcHpoaFFsMzF3K1J5ck54WmU1OGhDZkRESG1ldlJ2d0xqUTc4NVpvUVhKRGoyajNxQUQ0YUkyeUI4bEI1CitvYUUxamxDSnpDN0ttei9ZOWp6Zm12L3pBczFMUVRtOWt0ZXZ2NEJUVUZhR2p2OWp4blExeG5TODYyWmlvdUxXCit6WllJbFlQZjRGNkpqWEdpSVFnUVJnbElMVWZxM2Z0SmQ5L29rOVc5WkY4aDh3PT0KIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLSAxIHM6L0M9RlIvU1Q9Q2FsdmFkb3MvTD1DYWVuL089VEJTIElOVEVSTkVUL09VPVRlcm1zIGFuZCBDb25kaXRpb25zOiBodHRwOi8vd3d3LnRicy1pbnRlcm5ldC5jb20vQ0EvcmVwb3NpdG9yeS9PVT1UQlMgSU5URVJORVQgQ0EvQ049VEJTIFg1MDkgQ0EgU0dDCisgMSBzOi9DPUZSL1NUPUNhbHZhZG9zL0w9Q2Flbi9PPVRCUyBJTlRFUk5FVC9PVT1UZXJtcyBhbmQgQ29uZGl0aW9uczogaHR0cDovL3d3dy50YnMtaW50ZXJuZXQuY29tL0NBL3JlcG9zaXRvcnkvT1U9VEJTIElOVEVSTkVUIENBL0NOPVRCUyBYNTA5IENBIGJ1c2luZXNzCiAgICBpOi9DPVNFL089QWRkVHJ1c3QgQUIvT1U9QWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsvQ049QWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9vdAogLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi1NSUlGVmpDQ0JENmdBd0lCQWdJUVhwRFowRVRKTVYwMldUeDNHVG5oaFRBTkJna3Foa2lHOXcwQkFRVUZBREJ2CitNSUlGUHpDQ0JDZWdBd0lCQWdJUURsQnovKytpUlNtTERlVlJIVC9oQURBTkJna3Foa2lHOXcwQkFRVUZBREJ2CiBNUXN3Q1FZRFZRUUdFd0pUUlRFVU1CSUdBMVVFQ2hNTFFXUmtWSEoxYzNRZ1FVSXhKakFrQmdOVkJBc1RIVUZrCiBaRlJ5ZFhOMElFVjRkR1Z5Ym1Gc0lGUlVVQ0JPWlhSM2IzSnJNU0l3SUFZRFZRUURFeGxCWkdSVWNuVnpkQ0JGCi1lSFJsY201aGJDQkRRU0JTYjI5ME1CNFhEVEExTVRJd01UQXdNREF3TUZvWERURTVNRFl5TkRFNU1EWXpNRm93Ci1nY1F4Q3pBSkJnTlZCQVlUQWtaU01SRXdEd1lEVlFRSUV3aERZV3gyWVdSdmN6RU5NQXNHQTFVRUJ4TUVRMkZsCitlSFJsY201aGJDQkRRU0JTYjI5ME1CNFhEVEExTVRJd01UQXdNREF3TUZvWERURTVNRGN3T1RFNE1Ua3lNbG93CitnY2t4Q3pBSkJnTlZCQVlUQWtaU01SRXdEd1lEVlFRSUV3aERZV3gyWVdSdmN6RU5NQXNHQTFVRUJ4TUVRMkZsCiBiakVWTUJNR0ExVUVDaE1NVkVKVElFbE9WRVZTVGtWVU1VZ3dSZ1lEVlFRTEV6OVVaWEp0Y3lCaGJtUWdRMjl1CiBaR2wwYVc5dWN6b2dhSFIwY0RvdkwzZDNkeTUwWW5NdGFXNTBaWEp1WlhRdVkyOXRMME5CTDNKbGNHOXphWFJ2Ci1jbmt4R0RBV0JnTlZCQXNURDFSQ1V5QkpUbFJGVWs1RlZDQkRRVEVZTUJZR0ExVUVBeE1QVkVKVElGZzFNRGtnCi1RMEVnVTBkRE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBc2dPa08zZjd3ek42Ci1yT2pnNDV0UjV2akJmeks3cW1WOUlCeGIvUVc5RUVYeEcrRTdGTmhacVFMdHdHQktvU3NIVG5RcVY3NXdXTWswCi05dGluV3ZmdEJrU3BqNXNUaS84Y2J6SmZVdlRTVlloM1F4djZBVlZqTU1IL3J1TGpFNnkrNFBvYVBzOFdvWUFRCi10czVSNFoxZzhjL1duVGVwTHN0MngwL1d2N0dtdW9RaStnWHZIVTZZckJpdTdYa2VZaHpjOTVRZHZpV1NKUkRrCi1vd2hiNUs0M3FoY3ZqUm1CZk8vcGFHbENsaURHWnA4bUh3ckkyMW13b2JXcFZqVHhaUndZTzNiZDQrVEdjSTRHCi1JZTV3bUh3RThGN1NLMXRnU3FiQmFjS2pEYTkzajd0eEtrZnovWWQybjdUR3FPWGlIUHNKcEc2NTV2ckt0blhrCi05dnMxem9EZUpRSURBUUFCbzRJQmxqQ0NBWkl3SFFZRFZSME9CQllFRkFkRWRvV1RLTHgvYlhqU0N1djZURXZmCi0yWUlmTUE0R0ExVWREd0VCL3dRRUF3SUJCakFTQmdOVkhSTUJBZjhFQ0RBR0FRSC9BZ0VBTUNBR0ExVWRKUVFaCi1NQmNHQ2lzR0FRUUJnamNLQXdNR0NXQ0dTQUdHK0VJRUFUQVlCZ05WSFNBRUVUQVBNQTBHQ3lzR0FRUUJnT1UzCi1BZ1FCTUhzR0ExVWRId1IwTUhJd09LQTJvRFNHTW1oMGRIQTZMeTlqY213dVkyOXRiMlJ2WTJFdVkyOXRMMEZrCi1aRlJ5ZFhOMFJYaDBaWEp1WVd4RFFWSnZiM1F1WTNKc01EYWdOS0F5aGpCb2RIUndPaTh2WTNKc0xtTnZiVzlrCi1ieTV1WlhRdlFXUmtWSEoxYzNSRmVIUmxjbTVoYkVOQlVtOXZkQzVqY213d2dZQUdDQ3NHQVFVRkJ3RUJCSFF3Ci1jakE0QmdnckJnRUZCUWN3QW9Zc2FIUjBjRG92TDJOeWRDNWpiMjF2Wkc5allTNWpiMjB2UVdSa1ZISjFjM1JWCi1WRTVUUjBORFFTNWpjblF3TmdZSUt3WUJCUVVITUFLR0ttaDBkSEE2THk5amNuUXVZMjl0YjJSdkxtNWxkQzlCCi1aR1JVY25WemRGVlVUbE5IUTBOQkxtTnlkREFSQmdsZ2hrZ0JodmhDQVFFRUJBTUNBZ1F3RFFZSktvWklodmNOCi1BUUVGQlFBRGdnRUJBSzJ6RXpzK2pjSXJWSzlvRGtkRFpOdmh1QllUZENmcHhmRnMrT0F1alcwYklmSkF5MjMyCi1ldVZzbkptNnUvK09ycUt1ZEQydGFkMkJiZWpMTFhoTVpWaWFDbUs3RDluclhIeDR0ZTVFUDhyTDE5U1VWcUxZCi0xcFRudjVkaE5nRWd2QTduNWxJekRTWXM3eVJMc3I3SEpzWVByNlNlWVN1Wml6eVgxU056N29vSjMyL0YzWDk4Ci1SQjBNbGMvRTBPeU9ya1E5L3k1SXJucG5hU29yYThDblVyVjVYTk9nK2t5Q3o5ZWRDeXg0RDV3WFljd1pQVld6Ci04YURxcXVFU3JlelB5anRmaTRXUk80cy9WRDNITFp2T3h6TXJXQVZZQ0RHOUZ4YU9oRjBRR3V1RzFGN0YzR0tWCi12NnByTnlDbDAxNmtSbDJqMVVUK2E3Z0xkOGZBMjVBNEM5RT0KK2Nua3hHREFXQmdOVkJBc1REMVJDVXlCSlRsUkZVazVGVkNCRFFURWRNQnNHQTFVRUF4TVVWRUpUSUZnMU1Ea2cKK1EwRWdZblZ6YVc1bGMzTXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEQjFQQVUKK3F1ZENjejN0bXlHY2YrdTZFa1pxb25LS0hyVjRnWllidlZrSVJvam1tbGhmaS9qd3ZwSHZvOGJxU3QvOVJqNVMKK2poQ0RXMHBjYkkrSVBQdEQxSnkrQ0hOU2ZuTXFWRHk2Q0tRM3A1bWFUekNNRzZaVCtYam52Y05ENXYrRnRhaUIKK3hrMWlDWDZ1dnQwamVVdGRadllieXl0c1NERTZjM1k1Ly93UnhPRjh0TTFKeGlid08zcHlFUjI2amJiTjJnUXoKK20vRWtkR2pMZEo0c3ZQazIzV0RBdlE2RzAvejJMY0FhSkIrWExmcVJ3ZlFwSFF2ZkthMXVUaThQaXZDOHF0aXAKK3JtTlFNTVBNanhTSzJhelg4Y0tqalRESmlVS2FDYjRWSGxKRFdLRXNDRlJwZ0pBb0F1WDhmN1lmczFNNGVzR28KK3NXYjNQR3NwSzNPMjJ1SWxBZ01CQUFHamdnRjZNSUlCZGpBZEJnTlZIUTRFRmdRVUdna0V6UGtKajdzZW9NN1UKK3BCUi9TOVVqV00wd0RnWURWUjBQQVFIL0JBUURBZ0VHTUJJR0ExVWRFd0VCL3dRSU1BWUJBZjhDQVFBd0dBWUQKK1ZSMGdCQkV3RHpBTkJnc3JCZ0VFQVlEbE53SUJBVEI3QmdOVkhSOEVkREJ5TURpZ05xQTBoakpvZEhSd09pOHYKK1kzSnNMbU52Ylc5a2IyTmhMbU52YlM5QlpHUlVjblZ6ZEVWNGRHVnlibUZzUTBGU2IyOTBMbU55YkRBMm9EU2cKK01vWXdhSFIwY0RvdkwyTnliQzVqYjIxdlpHOHVibVYwTDBGa1pGUnlkWE4wUlhoMFpYSnVZV3hEUVZKdmIzUXUKK1kzSnNNSUdHQmdnckJnRUZCUWNCQVFSNk1IZ3dPd1lJS3dZQkJRVUhNQUtHTDJoMGRIQTZMeTlqY25RdVkyOXQKK2IyUnZZMkV1WTI5dEwwRmtaRlJ5ZFhOMFZWUk9VMlZ5ZG1WeVEwRXVZM0owTURrR0NDc0dBUVVGQnpBQ2hpMW8KK2RIUndPaTh2WTNKMExtTnZiVzlrYnk1dVpYUXZRV1JrVkhKMWMzUlZWRTVUWlhKMlpYSkRRUzVqY25Rd0VRWUoKK1lJWklBWWI0UWdFQkJBUURBZ0lFTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFBN21xck1nay9NckU2UW5iTkEKK2g0blJDbjJ0aTRiZzR3MkMzbEI2YlN2UlBuWXd1Tnc5SmI4dnVLa05GelJEeE5KWHFWRFpkZkZXNUNWUUp1eWQKK25mQXg4Myt3aytzcHp2RmFFMUtoRllmTjlHOXBRZlhVZnZEUm9JY0pnUEVLVVhMMXdSaU9HK0lqVTNWVkk4cGcKK0lncUhrcjd5bGxuNWk1ekNpRkFQdUlKbVlVU0ZnL2d4SDV4a0NOY2pKcXFySHJIYXRKcjZRcnJrZTkzam91cHcKK29VMW5qZkFjWnRZcDZmYmlLNnUyYjFwSnF3a1ZCRThSc2ZMblBoUmorU0ZicHZqdjhPZDdvL2llSmhGSVlRTlUKK2syalgydThxWm5BaU53OTNMWlc5bHBZanR1dk1YcThRUXBwRU5OamE1YjUzcTdVd0krbFU3WkdqWjdxdXVFU3AKK0o2LzUKIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KICAyIHM6L0M9U0UvTz1BZGRUcnVzdCBBQi9PVT1BZGRUcnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yay9DTj1BZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290Ci0gICBpOi9DPVVTL1NUPVVUL0w9U2FsdCBMYWtlIENpdHkvTz1UaGUgVVNFUlRSVVNUIE5ldHdvcmsvT1U9aHR0cDovL3d3dy51c2VydHJ1c3QuY29tL0NOPVVUTiAtIERBVEFDb3JwIFNHQworICAgaTovQz1VUy9TVD1VVC9MPVNhbHQgTGFrZSBDaXR5L089VGhlIFVTRVJUUlVTVCBOZXR3b3JrL09VPWh0dHA6Ly93d3cudXNlcnRydXN0LmNvbS9DTj1VVE4tVVNFUkZpcnN0LUhhcmR3YXJlCiAtLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KLU1JSUVaakNDQTA2Z0F3SUJBZ0lRVVNZS2t4emlmNXpEcFY5NTRIS3VnakFOQmdrcWhraUc5dzBCQVFVRkFEQ0IKLWt6RUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdUQWxWVU1SY3dGUVlEVlFRSEV3NVRZV3gwSUV4aGEyVWcKK01JSUVUekNDQXplZ0F3SUJBZ0lRSE01RVlwVVplcDFqVXZueUk2bTJtREFOQmdrcWhraUc5dzBCQVFVRkFEQ0IKK2x6RUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdUQWxWVU1SY3dGUVlEVlFRSEV3NVRZV3gwSUV4aGEyVWcKIFEybDBlVEVlTUJ3R0ExVUVDaE1WVkdobElGVlRSVkpVVWxWVFZDQk9aWFIzYjNKck1TRXdId1lEVlFRTEV4aG8KLWRIUndPaTh2ZDNkM0xuVnpaWEowY25WemRDNWpiMjB4R3pBWkJnTlZCQU1URWxWVVRpQXRJRVJCVkVGRGIzSncKLUlGTkhRekFlRncwd05UQTJNRGN3T0RBNU1UQmFGdzB4T1RBMk1qUXhPVEEyTXpCYU1HOHhDekFKQmdOVkJBWVQKLUFsTkZNUlF3RWdZRFZRUUtFd3RCWkdSVWNuVnpkQ0JCUWpFbU1DUUdBMVVFQ3hNZFFXUmtWSEoxYzNRZ1JYaDAKLVpYSnVZV3dnVkZSUUlFNWxkSGR2Y21zeElqQWdCZ05WQkFNVEdVRmtaRlJ5ZFhOMElFVjRkR1Z5Ym1Gc0lFTkIKLUlGSnZiM1F3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQzM5eG96NXZJQUJDMDUKLTRFNWI3Uis4YkEvTnRmb2p0czdlbXhFemw2UXBUSDJUbjcxS3ZKUHRBeHJqajgvbGJWQmExcGNwbEZxQXNFbDYKLTJ5NlYvYmpLdnpjNExSNCtrVUd0Y0ZiSDhFOC82REtlZE1ySWtGVHB4bDhQZUoyYVFEd09yR0dxWGhTUG5vZWgKLWFsRGMxNXBPcndXenBuR1VuSEd6VUdBS3h4T2RPQWVHQXFqcHFHa21HSkNyVExCUEk2czZUNFRZMzg2ZjRXbHYKLXU5ZEMxMnRFNU1ldDdtMUJYM0phY1FnM3MzbGxwRm1nbERmM0FDOE53cEp5MnRBNGN0c1VxRVhFWFNwOXQ3VFcKLXhPNnN6Uk5FdDhrcjNVTUFKZnBodVdscVdDTVJ0NmN6ajFaMVdmWE5LZGRHdHdvclpiYlRRbThWc3JoNysrL3AKLVhWUFZORm9uQWdNQkFBR2pnZGd3Z2RVd0h3WURWUjBqQkJnd0ZvQVVVekxSczg5Lyt1RHhvRjJGVHBMU25rVWQKLXRFOHdIUVlEVlIwT0JCWUVGSzI5bUhvMHRDYjMrc1FtVk84RHZlQWt5MVFhTUE0R0ExVWREd0VCL3dRRUF3SUIKLUJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CRUdDV0NHU0FHRytFSUJBUVFFQXdJQkFqQWdCZ05WSFNVRUdUQVgKLUJnb3JCZ0VFQVlJM0NnTURCZ2xnaGtnQmh2aENCQUV3UFFZRFZSMGZCRFl3TkRBeW9EQ2dMb1lzYUhSMGNEb3YKLUwyTnliQzUxYzJWeWRISjFjM1F1WTI5dEwxVlVUaTFFUVZSQlEyOXljRk5IUXk1amNtd3dEUVlKS29aSWh2Y04KLUFRRUZCUUFEZ2dFQkFNYnVVeGRvRkxKUkloNlFXQTJVL2IzeGNPV0dMY00yTVk5VVNFYm5MUWczdkd3S1lPRU8KLXJWRTA0QktUNmI2NHE3Z210T21XUFNpUHJtUUgvdUFCN01Yamtlc1lvUEYxZnRzSzVwK1IyNit1ZGQ4amtXamQKLUZ3QmFTLzlrYkhEckFSclFrTm5IcHRadDloUGsvN1hKMGg0cXk3RWxReVo0MlRDYlRnMGV2bW52MytyK0xiUE0KLStiRGR0UlRLa2RTeXRhWDdBUm1qUjNtZm5ZeVZoelQ0SHppUzJqYW1FZnByNjJ2cDNFVjRGVGtHMTAxQjVDSEkKLTNDK0gwYmUvU0dCMXBXTExKTjQ3WWFBcElLYSt4V3ljeE9rS2FTTHZrVHI2SnEvUlcwR25PdUw0T0FkQ3E4RmIKLStNNXR1ZzhFUHpJMHJOd0VLTmR3TUJRbUJzVGttNWpWejNnPQorZEhSd09pOHZkM2QzTG5WelpYSjBjblZ6ZEM1amIyMHhIekFkQmdOVkJBTVRGbFZVVGkxVlUwVlNSbWx5YzNRdAorU0dGeVpIZGhjbVV3SGhjTk1EVXdOakEzTURnd09URXdXaGNOTVRrd056QTVNVGd4T1RJeVdqQnZNUXN3Q1FZRAorVlFRR0V3SlRSVEVVTUJJR0ExVUVDaE1MUVdSa1ZISjFjM1FnUVVJeEpqQWtCZ05WQkFzVEhVRmtaRlJ5ZFhOMAorSUVWNGRHVnlibUZzSUZSVVVDQk9aWFIzYjNKck1TSXdJQVlEVlFRREV4bEJaR1JVY25WemRDQkZlSFJsY201aAorYkNCRFFTQlNiMjkwTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF0L2NhTStieQorQUFRdE9lQk9XKzBmdkd3UHpiWDZJN2JPM3BzUk01ZWtLVXg5azUrOVNyeVQ3UU1hNDQvUDVXMVFXdGFYS1pSYQorZ0xCSmV0c3VsZjI0eXI4M09DMGVQcEZCclhCV3gvQlBQK2d5bm5US3lKQlU2Y1pmRDNpZG1rQThEcXhocWw0VQorajU2SG9XcFEzTmVhVHE4RnM2WnhsSnh4czFCZ0NzY1RuVGdIaGdLbzZhaHBKaGlRcTB5d1R5T3JPaytFMk4vTworbitGcGI3dlhRdGRyUk9USHJlNXRRVjl5V25FSU43TjVaYVJab0pRMzl3QXZEY0tTY3RyUU9ITGJGS2hGeEYwcQorZmJlMDFzVHVyTTBUUkxmSks5MURBQ1g2WWJscGFsZ2pFYmVuTTQ5V2RWbjF6U25YUnJjS0syVzIwMEp2RmJLNAorZS92djZWMVQxVFJhSndJREFRQUJvNEc5TUlHNk1COEdBMVVkSXdRWU1CYUFGS0Z5WHlZYktKaERsVjBITjlXRgorbHAxTDBzTkZNQjBHQTFVZERnUVdCQlN0dlpoNk5MUW05L3JFSmxUdkE3M2dKTXRVR2pBT0JnTlZIUThCQWY4RQorQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QVJCZ2xnaGtnQmh2aENBUUVFQkFNQ0FRSXdSQVlEVlIwZgorQkQwd096QTVvRGVnTllZemFIUjBjRG92TDJOeWJDNTFjMlZ5ZEhKMWMzUXVZMjl0TDFWVVRpMVZVMFZTUm1seQorYzNRdFNHRnlaSGRoY21VdVkzSnNNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUJ5UWhBTk9zNGtDbHJ3RjhCVworb252VU9HQ1NqUks1MnpZWmdEWFlOakR0bXI1cko2TnlQRkRObitKeGtMcGpZZXRJRk1UYlNSZTY3OUJ0OG03YQorZ0lBb1FZRlF0eE11eUxuSmVnQjJhRWJRaUl4aC90QzIxVWNGRjdrdGRuRG9UbEE2dzNwTHV2dW5hSTg0T2YzbworMllCcmh6a1RiQ2ZhWWs1SlJsVHB1ZFc5RGtVa0hCc3l4M25rblBLbnBsa0lHYUswamduOEUwbitTRmFiWWFIaworSTlMcm9ZVC8rSnRMZWZoOWxnQmRBZ1Z2MFVQYnpvR2Z1RHNyay9aaCtVcmdiTEZwSG9WbkVsaHpia2g2NFowWAorT0dhSnVuUWM2OGNDWnU1SFRuL2FLN2ZCR01jVmZsUkNYTFZFUXBVOVBJQWRHQThZbnZnNjg0dDhHTWFLc1JsMQoraklHWgogLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQotIDMgczovQz1VUy9TVD1VVC9MPVNhbHQgTGFrZSBDaXR5L089VGhlIFVTRVJUUlVTVCBOZXR3b3JrL09VPWh0dHA6Ly93d3cudXNlcnRydXN0LmNvbS9DTj1VVE4gLSBEQVRBQ29ycCBTR0MKLSAgIGk6L0M9VVMvU1Q9VVQvTD1TYWx0IExha2UgQ2l0eS9PPVRoZSBVU0VSVFJVU1QgTmV0d29yay9PVT1odHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20vQ049VVROIC0gREFUQUNvcnAgU0dDCisgMyBzOi9DPVVTL1NUPVVUL0w9U2FsdCBMYWtlIENpdHkvTz1UaGUgVVNFUlRSVVNUIE5ldHdvcmsvT1U9aHR0cDovL3d3dy51c2VydHJ1c3QuY29tL0NOPVVUTi1VU0VSRmlyc3QtSGFyZHdhcmUKKyAgIGk6L0M9VVMvU1Q9VVQvTD1TYWx0IExha2UgQ2l0eS9PPVRoZSBVU0VSVFJVU1QgTmV0d29yay9PVT1odHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20vQ049VVROLVVTRVJGaXJzdC1IYXJkd2FyZQogLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi1NSUlFWGpDQ0EwYWdBd0lCQWdJUVJMNE1pMUFBSWJRUjB5cG9CcW10YVRBTkJna3Foa2lHOXcwQkFRVUZBRENCCi1rekVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnVEFsVlVNUmN3RlFZRFZRUUhFdzVUWVd4MElFeGhhMlVnCitNSUlFZERDQ0ExeWdBd0lCQWdJUVJMNE1pMUFBSkxRUjB6WXEvbVVLL1RBTkJna3Foa2lHOXcwQkFRVUZBRENCCitsekVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnVEFsVlVNUmN3RlFZRFZRUUhFdzVUWVd4MElFeGhhMlVnCiBRMmwwZVRFZU1Cd0dBMVVFQ2hNVlZHaGxJRlZUUlZKVVVsVlRWQ0JPWlhSM2IzSnJNU0V3SHdZRFZRUUxFeGhvCi1kSFJ3T2k4dmQzZDNMblZ6WlhKMGNuVnpkQzVqYjIweEd6QVpCZ05WQkFNVEVsVlVUaUF0SUVSQlZFRkRiM0p3Ci1JRk5IUXpBZUZ3MDVPVEEyTWpReE9EVTNNakZhRncweE9UQTJNalF4T1RBMk16QmFNSUdUTVFzd0NRWURWUVFHCi1Fd0pWVXpFTE1Ba0dBMVVFQ0JNQ1ZWUXhGekFWQmdOVkJBY1REbE5oYkhRZ1RHRnJaU0JEYVhSNU1SNHdIQVlECi1WUVFLRXhWVWFHVWdWVk5GVWxSU1ZWTlVJRTVsZEhkdmNtc3hJVEFmQmdOVkJBc1RHR2gwZEhBNkx5OTNkM2N1Ci1kWE5sY25SeWRYTjBMbU52YlRFYk1Ca0dBMVVFQXhNU1ZWUk9JQzBnUkVGVVFVTnZjbkFnVTBkRE1JSUJJakFOCi1CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEzKzVZRUtJcmJsWEVqcjh1UmdubjRBZ1BMaXQ2Ci1FNVFidmZhMmdJNWxCWk1BSHJ5djRnK09HUTBTUit5c3JhUDZMbkQ0M203N1ZrSVZuaTVjN3lQZUlia0ZkaWNaCi1EMC9XdzV5MHZwUVpZL0ttRVFyclUwaWN2dklwT3hib0dxQk1wc24wR0Zsb3dIRHlVd0RBWGxDQ3BWWnZOdmxLCi00RVNHb0UxTzFrZHVTVXJMWjllbXhBVzVqaDcwL1AvTjV6YmduQVZzc2pNaUZkQzA0TXdYd0xMQTlQNHlQeWtxCi1sWHZZOHFkT0QxUjhvUTJBc3drRHdmOWMzVjZhUHJ5dXZFZUthcTV4eWgreEtyaGZRZ1VMN0VZdzBYSUx5dWxXCi1iZlh2MzNpK1licXlwYTRFVEx5b3JHa1ZsNzN2NjdTTXZ6WDQxTVBSS0E1Y09wOXdHRE1nZDhTaXJ3SURBUUFCCi1vNEdyTUlHb01Bc0dBMVVkRHdRRUF3SUJ4akFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJUCi1NdEd6ejMvNjRQR2dYWVZPa3RLZVJSMjBUekE5QmdOVkhSOEVOakEwTURLZ01LQXVoaXhvZEhSd09pOHZZM0pzCi1MblZ6WlhKMGNuVnpkQzVqYjIwdlZWUk9MVVJCVkVGRGIzSndVMGRETG1OeWJEQXFCZ05WSFNVRUl6QWhCZ2dyCi1CZ0VGQlFjREFRWUtLd1lCQkFHQ053b0RBd1lKWUlaSUFZYjRRZ1FCTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCCi1BUUFuTlpjQWlvc292Y1l6TUI0cC9PTDMxWmpVUUx0Z3lyK3JGeXdKTm45UStrSGNycFk2Q2lNK2lWbkpvd2Z0Ci1HemV0L0h5K1VVbGEzam9LVkFnV1JjS1pzWWZOakdqZ2FRUHB4RTZZc2p1TUZyTU9vQXlZVUp1VHFYQUp5Q3lqCi1qOThDNU9CeE92RzBJM0tncWdIZjM1ZytGRkNnTVNhOUtPbGFNQ1oxK1h0Z0hJM3p6VkFtYlFRbm10L1ZEVVZICi1LV3NzNW5iWnFTbDlNdDNKTmp5OXJqWHhFWjRkdTVBL0VrZE9qdGQrRDJKekhWSW1PQndZU2Ywd2RKckU1U0l2Ci0yTUNON1pGNlRBQ1BjbjlkMnQwYmkwVnI1OTFwbDZqRlZrd1BEUGFmZXBFMzlwZUM0TjF4YWY5MlAyQk5QTS8zCi1tZm5HVi9USlZUbDR1aXg1eWFhSUsvUUkKK2RIUndPaTh2ZDNkM0xuVnpaWEowY25WemRDNWpiMjB4SHpBZEJnTlZCQU1URmxWVVRpMVZVMFZTUm1seWMzUXQKK1NHRnlaSGRoY21Vd0hoY05PVGt3TnpBNU1UZ3hNRFF5V2hjTk1Ua3dOekE1TVRneE9USXlXakNCbHpFTE1Ba0cKK0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnVEFsVlVNUmN3RlFZRFZRUUhFdzVUWVd4MElFeGhhMlVnUTJsMGVURWUKK01Cd0dBMVVFQ2hNVlZHaGxJRlZUUlZKVVVsVlRWQ0JPWlhSM2IzSnJNU0V3SHdZRFZRUUxFeGhvZEhSd09pOHYKK2QzZDNMblZ6WlhKMGNuVnpkQzVqYjIweEh6QWRCZ05WQkFNVEZsVlVUaTFWVTBWU1JtbHljM1F0U0dGeVpIZGgKK2NtVXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDeDk4TTRQN1NvZjg4NWdsRm4KKzBHMmYwdjlZOCtlZksrd05pVlNadVRpWkZ2ZmdJWGxJd3J0aGRCS1dIVHhxY3RVOEVHYzZPZTByRTgxbTY1VUoKK002UnNsN0hveHV6QmRYbWNSbDZOcTlCcS9ia3FWUmNRVkxNWjhKcjI4YkZkdHFkdCsrQnhGMnVpaVBzQTMvNGEKK01YY01tZ0Y2c1RMakt3RUhPRzdEcFY0anZFV2JlMURCeVRDUDIrVXJldE5iK3pOQUhxRFZtQmU4aTRmRGlkTmQKK29JNnlxcXIyam1tSUJzWDZpU0h6Q0oxcExna3pteWtOUmcrTXpFazBzR2xSdmZrR3pXaXRaa3k4UHF4aHZRcUkKK0RzamZQZTU4QkV5ZENsNXJrZGJ1eCswb2phdE5oNGx6MEc2azBCNFdpeFRoZGtRRGYyT3M1TTFKbk1XUzlLc3kKK29VaGJBZ01CQUFHamdia3dnYll3Q3dZRFZSMFBCQVFEQWdIR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWUQKK1ZSME9CQllFRktGeVh5WWJLSmhEbFYwSE45V0ZscDFMMHNORk1FUUdBMVVkSHdROU1Ec3dPYUEzb0RXR00yaDAKK2RIQTZMeTlqY213dWRYTmxjblJ5ZFhOMExtTnZiUzlWVkU0dFZWTkZVa1pwY25OMExVaGhjbVIzWVhKbExtTnkKK2JEQXhCZ05WSFNVRUtqQW9CZ2dyQmdFRkJRY0RBUVlJS3dZQkJRVUhBd1VHQ0NzR0FRVUZCd01HQmdnckJnRUYKK0JRY0RCekFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBUnhrUDNuVEdtWmV2L0swb1huV082eTFuN2s1N0s5Y00KKy8vYmV5MVdpQ3VGTVZHV1RZR3VmRXB5dFhvTXM2MXF1d09RdDlBQmpIYmpBYlBMUFNidE5rMjhHcGdvaXNrbGkKK0NFNy95TWdVc29nV1hlY0I1QktWNVVVMHM0dHB2YyswaFk5MVVaNTlPamc2RkVnU3h2dW5PeHFORFlKQUIrZ0UKK0NKQ2hpY3NaVU4vS0hBRzhIUVFaZXhCMmx6dnVrSkRLeEE0ZkZtNTE3elA0MDI5YkhwYmo0SFIzZEh1S29tNHQKKzNYYldPVENDOEt1Y1V2SXF4NjlKWG43SGFPV0NnY2hxSi9rbmlDclZXRkNWSC9BN0hGZTdmUlE1WWl1YXlaU1MKK0txTWlEUCtKSm4xZkl5dEgxeFVkcVdxZVVRMHFVWjZCK2RRN1huQVNmeEF5bkI2N25maG1xQT09CiAtLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9zc2xfY2VydC5wZW0gYi9MaWIvdGVzdC9zc2xfY2VydC5wZW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkN2FjMjMuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3Qvc3NsX2NlcnQucGVtCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi1NSUlDTERDQ0FkWUNBUUF3RFFZSktvWklodmNOQVFFRUJRQXdnYUF4Q3pBSkJnTlZCQVlUQWxCVU1STXdFUVlECi1WUVFJRXdwUmRXVmxibk5zWVc1a01ROHdEUVlEVlFRSEV3Wk1hWE5pYjJFeEZ6QVZCZ05WQkFvVERrNWxkWEp2Ci1ibWx2TENCTVpHRXVNUmd3RmdZRFZRUUxFdzlFWlhObGJuWnZiSFpwYldWdWRHOHhHekFaQmdOVkJBTVRFbUp5Ci1kWFIxY3k1dVpYVnliMjVwYnk1d2RERWJNQmtHQ1NxR1NJYjNEUUVKQVJZTWMyRnRjRzlBYVd0cExtWnBNQjRYCi1EVGsyTURrd05UQXpOREkwTTFvWERUazJNVEF3TlRBek5ESTBNMW93Z2FBeEN6QUpCZ05WQkFZVEFsQlVNUk13Ci1FUVlEVlFRSUV3cFJkV1ZsYm5Oc1lXNWtNUTh3RFFZRFZRUUhFd1pNYVhOaWIyRXhGekFWQmdOVkJBb1REazVsCi1kWEp2Ym1sdkxDQk1aR0V1TVJnd0ZnWURWUVFMRXc5RVpYTmxiblp2YkhacGJXVnVkRzh4R3pBWkJnTlZCQU1UCi1FbUp5ZFhSMWN5NXVaWFZ5YjI1cGJ5NXdkREViTUJrR0NTcUdTSWIzRFFFSkFSWU1jMkZ0Y0c5QWFXdHBMbVpwCi1NRnd3RFFZSktvWklodmNOQVFFQkJRQURTd0F3U0FKQkFMNythdHkzUzFpQkEvK3l4anh2NHExTVVUZDFrak53Ci1MNGxZS2JwenpsbUM1YmVhUVhlUTJSbUdNVFhVK21EdnVxSXRqVkhPSzNEdlBLN2xUY1NHZnRVQ0F3RUFBVEFOCi1CZ2txaGtpRzl3MEJBUVFGQUFOQkFGcVBFS0ZqazZUNkNLVEh2YVFlRUFzWDAvOFlIUEhxSC85QW5oU2pyd3VYCi05RUJjMG42YlZHaE43WGFYZDZzSjdkeW05c2JzV3hiK3BKZHVybmt4ang0PQotLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvc3NsX2tleS5wZW0gYi9MaWIvdGVzdC9zc2xfa2V5LnBlbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM5YWQ2Ni4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC9zc2xfa2V5LnBlbQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQotTUlJQlBBSUJBQUpCQUw3K2F0eTNTMWlCQS8reXhqeHY0cTFNVVRkMWtqTndMNGxZS2JwenpsbUM1YmVhUVhlUQotMlJtR01UWFUrbUR2dXFJdGpWSE9LM0R2UEs3bFRjU0dmdFVDQXdFQUFRSkJBTGprSytqYzIraWloSTk4cmlFRgotb3VkbWtOemlTUlRZam53ang4bUNvQWpQV3ZpQjNjNzQyZU8zRkc0L3NvaTFqRDlBNWFsaWhFT1hmVXpsb2VucgotOElFQ0lRRDNCNSswbCs2OEJBLzZkNzZpVU5xQUFWOGRqR1R6dnhuQ3h5Y254UFF5ZFFJaEFNWHQ0dHJVSTNuYwotYStVOFlMMkhQRkEzZ21oQnNTSUNicTJPcHRPQ25NN2hBaUVBNlhpM0pJUUVDb2I4WXdrUmoyOURVMy80V1lENwotV0xQZ3NRcHdvMUd1U3BFQ0lDR3NuV0g1b2FlRDl0OWpiRm9TZmhKdnYwSVpteGRjTHBSY3BzbHBlV0JCQWlFQQotNi81QjhKMEdIZEpxODlGSHdFRy9IMmVWVlVZdTV5L2FENnNnY20rMEF2Zz0KLS0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9zdHJpbmdfdGVzdHMucHkgYi9MaWIvdGVzdC9zdHJpbmdfdGVzdHMucHkKaW5kZXggNTkzMWYzZC4uMDQ3OTYwMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3Qvc3RyaW5nX3Rlc3RzLnB5CisrKyBiL0xpYi90ZXN0L3N0cmluZ190ZXN0cy5weQpAQCAtNzQ5LDEwICs3NDksMTAgQEAKICAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdyZXBsYWNlJywgNDIsICdoJykKICAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdyZXBsYWNlJywgJ2gnLCA0MikKIAorICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLm1heGludCA+ICgxIDw8IDMyKSBvciBzdHJ1Y3QuY2FsY3NpemUoJ1AnKSAhPSA0LAorICAgICAgICAgICAgICAgICAgICAgJ29ubHkgYXBwbGllcyB0byAzMi1iaXQgcGxhdGZvcm1zJykKICAgICBkZWYgdGVzdF9yZXBsYWNlX292ZXJmbG93KHNlbGYpOgogICAgICAgICAjIENoZWNrIGZvciBvdmVyZmxvdyBjaGVja2luZyBvbiAzMiBiaXQgbWFjaGluZXMKLSAgICAgICAgaWYgc3lzLm1heGludCAhPSAyMTQ3NDgzNjQ3IG9yIHN0cnVjdC5jYWxjc2l6ZSgiUCIpID4gNDoKLSAgICAgICAgICAgIHJldHVybgogICAgICAgICBBMl8xNiA9ICJBIiAqICgyKioxNikKICAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhPdmVyZmxvd0Vycm9yLCBBMl8xNiwgInJlcGxhY2UiLCAiIiwgQTJfMTYpCiAgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoT3ZlcmZsb3dFcnJvciwgQTJfMTYsICJyZXBsYWNlIiwgIkEiLCBBMl8xNikKQEAgLTExMTMsNiArMTExMywzMSBAQAogICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJyUxMC4qZicsICdfX21vZF9fJywgKCdmb28nLCA0Mi4pKQogICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFZhbHVlRXJyb3IsICclMTAnLCAnX19tb2RfXycsICg0MiwpKQogCisgICAgICAgIGNsYXNzIFgob2JqZWN0KTogcGFzcworICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2FiYycsICdfX21vZF9fJywgWCgpKQorICAgICAgICBjbGFzcyBYKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgayk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGsKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdtZWxvbiBhcHBsZScsICclKG1lbG9uKXMgJShhcHBsZSlzJywgJ19fbW9kX18nLCBYKCkpCisKKyAgICBAdGVzdF9zdXBwb3J0LmNweXRob25fb25seQorICAgIGRlZiB0ZXN0X2Zvcm1hdHRpbmdfY19saW1pdHMoc2VsZik6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBQWV9TU0laRV9UX01BWCwgSU5UX01BWCwgVUlOVF9NQVgKKyAgICAgICAgU0laRV9NQVggPSAoMSA8PCAoUFlfU1NJWkVfVF9NQVguYml0X2xlbmd0aCgpICsgMSkpIC0gMQorICAgICAgICB3aWR0aCA9IGludChQWV9TU0laRV9UX01BWCArIDEpCisgICAgICAgIGlmIHdpZHRoIDw9IHN5cy5tYXhpbnQ6CisgICAgICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKE92ZXJmbG93RXJyb3IsICclKnMnLCAnX19tb2RfXycsICh3aWR0aCwgJycpKQorICAgICAgICBwcmVjID0gaW50KElOVF9NQVggKyAxKQorICAgICAgICBpZiBwcmVjIDw9IHN5cy5tYXhpbnQ6CisgICAgICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKE92ZXJmbG93RXJyb3IsICclLipmJywgJ19fbW9kX18nLCAocHJlYywgMS4gLyA3KSkKKyAgICAgICAgIyBJc3N1ZSAxNTk4OQorICAgICAgICB3aWR0aCA9IGludChTSVpFX01BWCArIDEpCisgICAgICAgIGlmIHdpZHRoIDw9IHN5cy5tYXhpbnQ6CisgICAgICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKE92ZXJmbG93RXJyb3IsICclKnMnLCAnX19tb2RfXycsICh3aWR0aCwgJycpKQorICAgICAgICBwcmVjID0gaW50KFVJTlRfTUFYICsgMSkKKyAgICAgICAgaWYgcHJlYyA8PSBzeXMubWF4aW50OgorICAgICAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhPdmVyZmxvd0Vycm9yLCAnJS4qZicsICdfX21vZF9fJywgKHByZWMsIDEuIC8gNykpCisKICAgICBkZWYgdGVzdF9mbG9hdGZvcm1hdHRpbmcoc2VsZik6CiAgICAgICAgICMgZmxvYXQgZm9ybWF0dGluZwogICAgICAgICBmb3IgcHJlYyBpbiB4cmFuZ2UoMTAwKToKQEAgLTEyNjQsMjcgKzEyODksMjcgQEAKICAgICAjIEFkZGl0aW9uYWwgdGVzdHMgdGhhdCBvbmx5IHdvcmsgd2l0aAogICAgICMgOGJpdCBjb21wYXRpYmxlIG9iamVjdCwgaS5lLiBzdHIgYW5kIFVzZXJTdHJpbmcKIAotICAgIGlmIHRlc3Rfc3VwcG9ydC5oYXZlX3VuaWNvZGU6Ci0gICAgICAgIGRlZiB0ZXN0X2VuY29kaW5nX2RlY29kaW5nKHNlbGYpOgotICAgICAgICAgICAgY29kZWNzID0gWygncm90MTMnLCAndXJ5eWIgamJleXEnKSwKLSAgICAgICAgICAgICAgICAgICAgICAoJ2Jhc2U2NCcsICdhR1ZzYkc4Z2QyOXliR1E9XG4nKSwKLSAgICAgICAgICAgICAgICAgICAgICAoJ2hleCcsICc2ODY1NmM2YzZmMjA3NzZmNzI2YzY0JyksCi0gICAgICAgICAgICAgICAgICAgICAgKCd1dScsICdiZWdpbiA2NjYgPGRhdGE+XG4rOiY1TDsmXFxAPVZdUjsmMCBcbiBcbmVuZFxuJyldCi0gICAgICAgICAgICBmb3IgZW5jb2RpbmcsIGRhdGEgaW4gY29kZWNzOgotICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbChkYXRhLCAnaGVsbG8gd29ybGQnLCAnZW5jb2RlJywgZW5jb2RpbmcpCi0gICAgICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdoZWxsbyB3b3JsZCcsIGRhdGEsICdkZWNvZGUnLCBlbmNvZGluZykKLSAgICAgICAgICAgICMgemxpYiBpcyBvcHRpb25hbCwgc28gd2UgbWFrZSB0aGUgdGVzdCBvcHRpb25hbCB0b28uLi4KLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBpbXBvcnQgemxpYgotICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgZGF0YSA9ICd4XHg5Y1x4Y2JIXHhjZFx4YzlceGM5VyhceGNmL1x4Y2FJXHgwMVx4MDBceDFhXHgwYlx4MDRdJwotICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbChkYXRhLCAnaGVsbG8gd29ybGQnLCAnZW5jb2RlJywgJ3psaWInKQotICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnaGVsbG8gd29ybGQnLCBkYXRhLCAnZGVjb2RlJywgJ3psaWInKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHRlc3Rfc3VwcG9ydC5oYXZlX3VuaWNvZGUsICdubyB1bmljb2RlIHN1cHBvcnQnKQorICAgIGRlZiB0ZXN0X2VuY29kaW5nX2RlY29kaW5nKHNlbGYpOgorICAgICAgICBjb2RlY3MgPSBbKCdyb3QxMycsICd1cnl5YiBqYmV5cScpLAorICAgICAgICAgICAgICAgICAgKCdiYXNlNjQnLCAnYUdWc2JHOGdkMjl5YkdRPVxuJyksCisgICAgICAgICAgICAgICAgICAoJ2hleCcsICc2ODY1NmM2YzZmMjA3NzZmNzI2YzY0JyksCisgICAgICAgICAgICAgICAgICAoJ3V1JywgJ2JlZ2luIDY2NiA8ZGF0YT5cbis6JjVMOyZcXEA9Vl1SOyYwIFxuIFxuZW5kXG4nKV0KKyAgICAgICAgZm9yIGVuY29kaW5nLCBkYXRhIGluIGNvZGVjczoKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbChkYXRhLCAnaGVsbG8gd29ybGQnLCAnZW5jb2RlJywgZW5jb2RpbmcpCisgICAgICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2hlbGxvIHdvcmxkJywgZGF0YSwgJ2RlY29kZScsIGVuY29kaW5nKQorICAgICAgICAjIHpsaWIgaXMgb3B0aW9uYWwsIHNvIHdlIG1ha2UgdGhlIHRlc3Qgb3B0aW9uYWwgdG9vLi4uCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCB6bGliCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRhdGEgPSAneFx4OWNceGNiSFx4Y2RceGM5XHhjOVcoXHhjZi9ceGNhSVx4MDFceDAwXHgxYVx4MGJceDA0XScKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbChkYXRhLCAnaGVsbG8gd29ybGQnLCAnZW5jb2RlJywgJ3psaWInKQorICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdoZWxsbyB3b3JsZCcsIGRhdGEsICdkZWNvZGUnLCAnemxpYicpCiAKLSAgICAgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAneHl6JywgJ2RlY29kZScsIDQyKQotICAgICAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICd4eXonLCAnZW5jb2RlJywgNDIpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAneHl6JywgJ2RlY29kZScsIDQyKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ3h5eicsICdlbmNvZGUnLCA0MikKIAogCiBjbGFzcyBNaXhpblN0clVuaWNvZGVUZXN0OgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvc3VicHJvY2Vzc2RhdGEvc2lnY2hpbGRfaWdub3JlLnB5IGIvTGliL3Rlc3Qvc3VicHJvY2Vzc2RhdGEvc2lnY2hpbGRfaWdub3JlLnB5CmluZGV4IDYwNzJhZWMuLjg2MzIwZmIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3N1YnByb2Nlc3NkYXRhL3NpZ2NoaWxkX2lnbm9yZS5weQorKysgYi9MaWIvdGVzdC9zdWJwcm9jZXNzZGF0YS9zaWdjaGlsZF9pZ25vcmUucHkKQEAgLTEsNiArMSwxNSBAQAotaW1wb3J0IHNpZ25hbCwgc3VicHJvY2Vzcywgc3lzCitpbXBvcnQgc2lnbmFsLCBzdWJwcm9jZXNzLCBzeXMsIHRpbWUKICMgT24gTGludXggdGhpcyBjYXVzZXMgb3Mud2FpdHBpZCB0byBmYWlsIHdpdGggT1NFcnJvciBhcyB0aGUgT1MgaGFzIGFscmVhZHkKICMgcmVhcGVkIG91ciBjaGlsZCBwcm9jZXNzLiAgVGhlIHdhaXQoKSBwYXNzaW5nIHRoZSBPU0Vycm9yIG9uIHRvIHRoZSBjYWxsZXIKICMgYW5kIGNhdXNpbmcgdXMgdG8gZXhpdCB3aXRoIGFuIGVycm9yIGlzIHdoYXQgd2UgYXJlIHRlc3RpbmcgYWdhaW5zdC4KIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0NITEQsIHNpZ25hbC5TSUdfSUdOKQogc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICctYycsICdwcmludCgiYWxiYXRyb3NzIiknXSkud2FpdCgpCisjIEFsc28gZW5zdXJlIHBvbGwoKSBoYW5kbGVzIGFuIGVycm5vLkVDSElMRCBhcHByb3ByaWF0ZWx5LgorcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAnLWMnLCAncHJpbnQoImFsYmF0cm9zcyIpJ10pCitudW1fcG9sbHMgPSAwCit3aGlsZSBwLnBvbGwoKSBpcyBOb25lOgorICAgICMgV2FpdGluZyBmb3IgdGhlIHByb2Nlc3MgdG8gZmluaXNoLgorICAgIHRpbWUuc2xlZXAoMC4wMSkgICMgQXZvaWQgYmVpbmcgYSBDUFUgYnVzeSBsb29wLgorICAgIG51bV9wb2xscyArPSAxCisgICAgaWYgbnVtX3BvbGxzID4gMzAwMDoKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdwb2xsIHNob3VsZCBoYXZlIHJldHVybmVkIDAgd2l0aGluIDMwIHNlY29uZHMnKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvc3ZuX3B5dGhvbl9vcmdfaHR0cHNfY2VydC5wZW0gYi9MaWIvdGVzdC9zdm5fcHl0aG9uX29yZ19odHRwc19jZXJ0LnBlbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBmY2QzNy4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC9zdm5fcHl0aG9uX29yZ19odHRwc19jZXJ0LnBlbQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQotTUlJRlFUQ0NCQ21nQXdJQkFnSVFMMnF3N2xwc0hxVExjQmgxUFZqc2FUQU5CZ2txaGtpRzl3MEJBUVVGQURDQgotbHpFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ1RBbFZVTVJjd0ZRWURWUVFIRXc1VFlXeDBJRXhoYTJVZwotUTJsMGVURWVNQndHQTFVRUNoTVZWR2hsSUZWVFJWSlVVbFZUVkNCT1pYUjNiM0pyTVNFd0h3WURWUVFMRXhobwotZEhSd09pOHZkM2QzTG5WelpYSjBjblZ6ZEM1amIyMHhIekFkQmdOVkJBTVRGbFZVVGkxVlUwVlNSbWx5YzNRdAotU0dGeVpIZGhjbVV3SGhjTk1EY3dOREV3TURBd01EQXdXaGNOTVRBd05EQTVNak0xT1RVNVdqQ0J2akVMTUFrRwotQTFVRUJoTUNWVk14RGpBTUJnTlZCQkVUQlRBeE9UTTRNUll3RkFZRFZRUUlFdzFOWVhOellXTm9kWE5sZEhSegotTVJFd0R3WURWUVFIRXdoSmNITjNhWFJqYURFTU1Bb0dBMVVFQ1JNRGJpOWhNUXd3Q2dZRFZRUVNFd00yTlRNeAotSXpBaEJnTlZCQW9UR2xCNWRHaHZiaUJUYjJaMGQyRnlaU0JHYjNWdVpHRjBhVzl1TVJvd0dBWURWUVFMRXhGRAotYjIxdlpHOGdTVzV6ZEdGdWRGTlRUREVYTUJVR0ExVUVBeE1PYzNadUxuQjVkR2h2Ymk1dmNtY3dnWjh3RFFZSgotS29aSWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFNRk9mRmVMcGlJTjlVelRDZWhDZ1E0VzN1ZmFxNTI0cVBvWAotMDBpTkRpSS9laGQ2a0MwQlhJUDUveTlsUG9NbjduUnNqZGpjelVhVm1sUFdHOEJodkFESzNaWkltN20vM21aVwotTy8rQzV2R0U5WXVPcUlLZTBWb056L2NaYVlreitDMnhtT3dEVHA2YStsczI5ampVZm94TWQ5Z3RHdHVPcDdzKwotSW91VkQzd1pBZ01CQUFHamdnSGlNSUlCM2pBZkJnTlZIU01FR0RBV2dCU2hjbDhtR3lpWVE1VmRCemZWaFphZAotUzlMRFJUQWRCZ05WSFE0RUZnUVVrZU5BcUxibktxODZXL2doQlY5eGZDKzdoOXN3RGdZRFZSMFBBUUgvQkFRRAotQWdXZ01Bd0dBMVVkRXdFQi93UUNNQUF3SFFZRFZSMGxCQll3RkFZSUt3WUJCUVVIQXdFR0NDc0dBUVVGQndNQwotTUJFR0NXQ0dTQUdHK0VJQkFRUUVBd0lHd0RCR0JnTlZIU0FFUHpBOU1Ec0dEQ3NHQVFRQnNqRUJBZ0VEQkRBcgotTUNrR0NDc0dBUVVGQndJQkZoMW9kSFJ3Y3pvdkwzTmxZM1Z5WlM1amIyMXZaRzh1Ym1WMEwwTlFVekI3QmdOVgotSFI4RWREQnlNRGlnTnFBMGhqSm9kSFJ3T2k4dlkzSnNMbU52Ylc5a2IyTmhMbU52YlM5VlZFNHRWVk5GVWtacAotY25OMExVaGhjbVIzWVhKbExtTnliREEyb0RTZ01vWXdhSFIwY0RvdkwyTnliQzVqYjIxdlpHOHVibVYwTDFWVQotVGkxVlUwVlNSbWx5YzNRdFNHRnlaSGRoY21VdVkzSnNNSUdHQmdnckJnRUZCUWNCQVFSNk1IZ3dPd1lJS3dZQgotQlFVSE1BS0dMMmgwZEhBNkx5OWpjblF1WTI5dGIyUnZZMkV1WTI5dEwxVlVUa0ZrWkZSeWRYTjBVMlZ5ZG1WeQotUTBFdVkzSjBNRGtHQ0NzR0FRVUZCekFDaGkxb2RIUndPaTh2WTNKMExtTnZiVzlrYnk1dVpYUXZWVlJPUVdSawotVkhKMWMzUlRaWEoyWlhKRFFTNWpjblF3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUZCeEVPZUtyNSt2dXJ6RQotNkRpUDRUSGhRc3ArTEEwK3RuWjVya1Y3Uk9EQW1GNnN0cmpPTmwzRktXR1NxcnVjV05uRlRvL0hNZ3JnWkpIUQotQ3VueHJKZjRKNUNWei9DdkdsZmRCRG1DcFl6NWFnYzhiN0VKaG1NMldvV1NxQys1Q1lJWHVSelV1WWNLV2pQdAotM0xWMzEyWmlsNEJhZVord3Y0U0tSOGNMOGpzQi9zajhReEx4clpqT0dYdFZYM0o5NUFuclk3Qk1EanVDQkR4eAotZFVVT1VKcGRKNHVuZEFHMW9mMFpzUE9HSjV2aVNKWU5lSjlpT2pTdWEyNG1mWjJhUS9tVUxpcm5xRjhHa3IzOAotQ01sQzhpbzVjdDVObkxna1dtUHIwRlM1VXlhbExlV1hpb3BTNmhNb2Z2dTk1MlZHTHlhY0xnTWw3ZDlTNUFhTAotbXhNSEhlbz0KLS0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3N5bWxpbmtfc3VwcG9ydC5weSBiL0xpYi90ZXN0L3N5bWxpbmtfc3VwcG9ydC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDFkMGY5Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3Qvc3ltbGlua19zdXBwb3J0LnB5CkBAIC0wLDAgKzEsMTAwIEBACitpbXBvcnQgb3MKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHBsYXRmb3JtCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRFU1RGTgorCitkZWYgY2FuX3N5bWxpbmsoKToKKyAgICAjIGNhY2hlIHRoZSByZXN1bHQgaW4gY2FuX3N5bWxpbmsucHJldl92YWwKKyAgICBwcmV2X3ZhbCA9IGdldGF0dHIoY2FuX3N5bWxpbmssICdwcmV2X3ZhbCcsIE5vbmUpCisgICAgaWYgcHJldl92YWwgaXMgbm90IE5vbmU6CisgICAgICAgIHJldHVybiBwcmV2X3ZhbAorICAgIHN5bWxpbmtfcGF0aCA9IFRFU1RGTiArICJjYW5fc3ltbGluayIKKyAgICB0cnk6CisgICAgICAgIHN5bWxpbmsoVEVTVEZOLCBzeW1saW5rX3BhdGgpCisgICAgICAgIGNhbiA9IFRydWUKKyAgICBleGNlcHQgKE9TRXJyb3IsIE5vdEltcGxlbWVudGVkRXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgY2FuID0gRmFsc2UKKyAgICBlbHNlOgorICAgICAgICBvcy5yZW1vdmUoc3ltbGlua19wYXRoKQorICAgIGNhbl9zeW1saW5rLnByZXZfdmFsID0gY2FuCisgICAgcmV0dXJuIGNhbgorCitkZWYgc2tpcF91bmxlc3Nfc3ltbGluayh0ZXN0KToKKyAgICAiIiJTa2lwIGRlY29yYXRvciBmb3IgdGVzdHMgdGhhdCByZXF1aXJlIGZ1bmN0aW9uYWwgc3ltbGluayIiIgorICAgIG9rID0gY2FuX3N5bWxpbmsoKQorICAgIG1zZyA9ICJSZXF1aXJlcyBmdW5jdGlvbmFsIHN5bWxpbmsgaW1wbGVtZW50YXRpb24iCisgICAgcmV0dXJuIHRlc3QgaWYgb2sgZWxzZSB1bml0dGVzdC5za2lwKG1zZykodGVzdCkKKworZGVmIF9zeW1saW5rX3dpbjMyKHRhcmdldCwgbGluaywgdGFyZ2V0X2lzX2RpcmVjdG9yeT1GYWxzZSk6CisgICAgIiIiCisgICAgQ3R5cGVzIHN5bWxpbmsgaW1wbGVtZW50YXRpb24gc2luY2UgUHl0aG9uIGRvZXNuJ3Qgc3VwcG9ydAorICAgIHN5bWxpbmtzIGluIHdpbmRvd3MgeWV0LiBCb3Jyb3dlZCBmcm9tIGphcmFjby53aW5kb3dzIHByb2plY3QuCisgICAgIiIiCisgICAgaW1wb3J0IGN0eXBlcy53aW50eXBlcworICAgIENyZWF0ZVN5bWJvbGljTGluayA9IGN0eXBlcy53aW5kbGwua2VybmVsMzIuQ3JlYXRlU3ltYm9saWNMaW5rVworICAgIENyZWF0ZVN5bWJvbGljTGluay5hcmd0eXBlcyA9ICgKKyAgICAgICAgY3R5cGVzLndpbnR5cGVzLkxQV1NUUiwKKyAgICAgICAgY3R5cGVzLndpbnR5cGVzLkxQV1NUUiwKKyAgICAgICAgY3R5cGVzLndpbnR5cGVzLkRXT1JELAorICAgICAgICApCisgICAgQ3JlYXRlU3ltYm9saWNMaW5rLnJlc3R5cGUgPSBjdHlwZXMud2ludHlwZXMuQk9PTEVBTgorCisgICAgZGVmIGZvcm1hdF9zeXN0ZW1fbWVzc2FnZShlcnJubyk6CisgICAgICAgICIiIgorICAgICAgICBDYWxsIEZvcm1hdE1lc3NhZ2Ugd2l0aCBhIHN5c3RlbSBlcnJvciBudW1iZXIgdG8gcmV0cmlldmUKKyAgICAgICAgdGhlIGRlc2NyaXB0aXZlIGVycm9yIG1lc3NhZ2UuCisgICAgICAgICIiIgorICAgICAgICAjIGZpcnN0IHNvbWUgZmxhZ3MgdXNlZCBieSBGb3JtYXRNZXNzYWdlVworICAgICAgICBBTExPQ0FURV9CVUZGRVIgPSAweDEwMAorICAgICAgICBBUkdVTUVOVF9BUlJBWSA9IDB4MjAwMAorICAgICAgICBGUk9NX0hNT0RVTEUgPSAweDgwMAorICAgICAgICBGUk9NX1NUUklORyA9IDB4NDAwCisgICAgICAgIEZST01fU1lTVEVNID0gMHgxMDAwCisgICAgICAgIElHTk9SRV9JTlNFUlRTID0gMHgyMDAKKworICAgICAgICAjIExldCBGb3JtYXRNZXNzYWdlVyBhbGxvY2F0ZSB0aGUgYnVmZmVyICh3ZSdsbCBmcmVlIGl0IGJlbG93KQorICAgICAgICAjIEFsc28sIGxldCBpdCBrbm93IHdlIHdhbnQgYSBzeXN0ZW0gZXJyb3IgbWVzc2FnZS4KKyAgICAgICAgZmxhZ3MgPSBBTExPQ0FURV9CVUZGRVIgfCBGUk9NX1NZU1RFTQorICAgICAgICBzb3VyY2UgPSBOb25lCisgICAgICAgIG1lc3NhZ2VfaWQgPSBlcnJubworICAgICAgICBsYW5ndWFnZV9pZCA9IDAKKyAgICAgICAgcmVzdWx0X2J1ZmZlciA9IGN0eXBlcy53aW50eXBlcy5MUFdTVFIoKQorICAgICAgICBidWZmZXJfc2l6ZSA9IDAKKyAgICAgICAgYXJndW1lbnRzID0gTm9uZQorICAgICAgICBieXRlcyA9IGN0eXBlcy53aW5kbGwua2VybmVsMzIuRm9ybWF0TWVzc2FnZVcoCisgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgIHNvdXJjZSwKKyAgICAgICAgICAgIG1lc3NhZ2VfaWQsCisgICAgICAgICAgICBsYW5ndWFnZV9pZCwKKyAgICAgICAgICAgIGN0eXBlcy5ieXJlZihyZXN1bHRfYnVmZmVyKSwKKyAgICAgICAgICAgIGJ1ZmZlcl9zaXplLAorICAgICAgICAgICAgYXJndW1lbnRzLAorICAgICAgICAgICAgKQorICAgICAgICAjIG5vdGUgdGhlIGZvbGxvd2luZyB3aWxsIGNhdXNlIGFuIGluZmluaXRlIGxvb3AgaWYgR2V0TGFzdEVycm9yCisgICAgICAgICMgIHJlcGVhdGVkbHkgcmV0dXJucyBhbiBlcnJvciB0aGF0IGNhbm5vdCBiZSBmb3JtYXR0ZWQsIGFsdGhvdWdoCisgICAgICAgICMgIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgIGhhbmRsZV9ub256ZXJvX3N1Y2Nlc3MoYnl0ZXMpCisgICAgICAgIG1lc3NhZ2UgPSByZXN1bHRfYnVmZmVyLnZhbHVlCisgICAgICAgIGN0eXBlcy53aW5kbGwua2VybmVsMzIuTG9jYWxGcmVlKHJlc3VsdF9idWZmZXIpCisgICAgICAgIHJldHVybiBtZXNzYWdlCisKKyAgICBkZWYgaGFuZGxlX25vbnplcm9fc3VjY2VzcyhyZXN1bHQpOgorICAgICAgICBpZiByZXN1bHQgPT0gMDoKKyAgICAgICAgICAgIHZhbHVlID0gY3R5cGVzLndpbmRsbC5rZXJuZWwzMi5HZXRMYXN0RXJyb3IoKQorICAgICAgICAgICAgc3RyZXJyb3IgPSBmb3JtYXRfc3lzdGVtX21lc3NhZ2UodmFsdWUpCisgICAgICAgICAgICByYWlzZSBXaW5kb3dzRXJyb3IodmFsdWUsIHN0cmVycm9yKQorCisgICAgdGFyZ2V0X2lzX2RpcmVjdG9yeSA9IHRhcmdldF9pc19kaXJlY3Rvcnkgb3Igb3MucGF0aC5pc2Rpcih0YXJnZXQpCisgICAgaGFuZGxlX25vbnplcm9fc3VjY2VzcyhDcmVhdGVTeW1ib2xpY0xpbmsobGluaywgdGFyZ2V0LCB0YXJnZXRfaXNfZGlyZWN0b3J5KSkKKworc3ltbGluayA9IG9zLnN5bWxpbmsgaWYgaGFzYXR0cihvcywgJ3N5bWxpbmsnKSBlbHNlICgKKyAgICBfc3ltbGlua193aW4zMiBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAnV2luZG93cycgZWxzZSBOb25lCispCisKK2RlZiByZW1vdmVfc3ltbGluayhuYW1lKToKKyAgICAjIE9uIFdpbmRvd3MsIHRvIHJlbW92ZSBhIGRpcmVjdG9yeSBzeW1saW5rLCBvbmUgbXVzdCB1c2Ugcm1kaXIKKyAgICB0cnk6CisgICAgICAgIG9zLnJtZGlyKG5hbWUpCisgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgIG9zLnJlbW92ZShuYW1lKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9TdHJpbmdJTy5weSBiL0xpYi90ZXN0L3Rlc3RfU3RyaW5nSU8ucHkKaW5kZXggYmYwYzczMy4uNDJmMzA3YSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9TdHJpbmdJTy5weQorKysgYi9MaWIvdGVzdC90ZXN0X1N0cmluZ0lPLnB5CkBAIC01LDYgKzUsNyBAQAogaW1wb3J0IGNTdHJpbmdJTwogaW1wb3J0IHR5cGVzCiBpbXBvcnQgYXJyYXkKK2ltcG9ydCBzeXMKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiAKIApAQCAtMTksNyArMjAsNiBAQAogICAgIGNvbnN0cnVjdG9yID0gc3RyCiAKICAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYuX2xpbmUgPSBzZWxmLmNvbnN0cnVjdG9yKHNlbGYuX2xpbmUpCiAgICAgICAgIHNlbGYuX2xpbmVzID0gc2VsZi5jb25zdHJ1Y3Rvcigoc2VsZi5fbGluZSArICdcbicpICogNSkKICAgICAgICAgc2VsZi5fZnAgPSBzZWxmLk1PRFVMRS5TdHJpbmdJTyhzZWxmLl9saW5lcykKIApAQCAtMjcsNiArMjcsOCBAQAogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLl9mcC5zZWVrKQogICAgICAgICBlcShzZWxmLl9mcC5yZWFkKDEwKSwgc2VsZi5fbGluZVs6MTBdKQorICAgICAgICBlcShzZWxmLl9mcC5yZWFkKDApLCAnJykKKyAgICAgICAgZXEoc2VsZi5fZnAucmVhZGxpbmUoMCksICcnKQogICAgICAgICBlcShzZWxmLl9mcC5yZWFkbGluZSgpLCBzZWxmLl9saW5lWzEwOl0gKyAnXG4nKQogICAgICAgICBlcShsZW4oc2VsZi5fZnAucmVhZGxpbmVzKDYwKSksIDIpCiAgICAgICAgIHNlbGYuX2ZwLnNlZWsoMCkKQEAgLTEwNSw2ICsxMDcsNDUgQEAKICAgICAgICAgc2VsZi5fZnAuY2xvc2UoKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLl9mcC5nZXR2YWx1ZSkKIAorICAgIEB0ZXN0X3N1cHBvcnQuYmlnbWVtdGVzdCh0ZXN0X3N1cHBvcnQuXzJHICsgMioqMjYsIG1lbXVzZT0yLjAwMSkKKyAgICBkZWYgdGVzdF9yZWFkc19mcm9tX2xhcmdlX3N0cmVhbShzZWxmLCBzaXplKToKKyAgICAgICAgbGluZXNpemUgPSAyKioyNiAjIDY0IE1pQgorICAgICAgICBsaW5lcyA9IFsneCcgKiAobGluZXNpemUgLSAxKSArICdcbiddICogKHNpemUgLy8gbGluZXNpemUpICsgXAorICAgICAgICAgICAgICAgIFsneScgKiAoc2l6ZSAlIGxpbmVzaXplKV0KKyAgICAgICAgZiA9IHNlbGYuTU9EVUxFLlN0cmluZ0lPKCcnLmpvaW4obGluZXMpKQorICAgICAgICBmb3IgaSwgZXhwZWN0ZWQgaW4gZW51bWVyYXRlKGxpbmVzKToKKyAgICAgICAgICAgIGxpbmUgPSBmLnJlYWQobGVuKGV4cGVjdGVkKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpbmUpLCBsZW4oZXhwZWN0ZWQpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCBleHBlY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgJycpCisgICAgICAgIGYuc2VlaygwKQorICAgICAgICBmb3IgaSwgZXhwZWN0ZWQgaW4gZW51bWVyYXRlKGxpbmVzKToKKyAgICAgICAgICAgIGxpbmUgPSBmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpbmUpLCBsZW4oZXhwZWN0ZWQpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCBleHBlY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRsaW5lKCksICcnKQorICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRsaW5lcygpLCBsaW5lcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRsaW5lcygpLCBbXSkKKyAgICAgICAgZi5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkbGluZXMoc2l6ZSksIGxpbmVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGxpbmVzKCksIFtdKQorCisgICAgIyBJbiB3b3JzdCBjYXNlIGNTdHJpbmdJTyByZXF1aXJlcyAyICsgMSArIDEvMiArIDEvMioqMiArIC4uLiA9IDQKKyAgICAjIGJ5dGVzIHBlciBpbnB1dCBjaGFyYWN0ZXIuCisgICAgQHRlc3Rfc3VwcG9ydC5iaWdtZW10ZXN0KHRlc3Rfc3VwcG9ydC5fMkcsIG1lbXVzZT00KQorICAgIGRlZiB0ZXN0X3dyaXRlc190b19sYXJnZV9zdHJlYW0oc2VsZiwgc2l6ZSk6CisgICAgICAgIHMgPSAneCcgKiAyKioyNiAjIDY0IE1pQgorICAgICAgICBmID0gc2VsZi5NT0RVTEUuU3RyaW5nSU8oKQorICAgICAgICBuID0gc2l6ZQorICAgICAgICB3aGlsZSBuID4gbGVuKHMpOgorICAgICAgICAgICAgZi53cml0ZShzKQorICAgICAgICAgICAgbiAtPSBsZW4ocykKKyAgICAgICAgcyA9IE5vbmUKKyAgICAgICAgZi53cml0ZSgneCcgKiBuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihmLmdldHZhbHVlKCkpLCBzaXplKQorCisKIGNsYXNzIFRlc3RTdHJpbmdJTyhUZXN0R2VuZXJpY1N0cmluZ0lPKToKICAgICBNT0RVTEUgPSBTdHJpbmdJTwogCkBAIC0xNjgsMTIgKzIwOSwxNiBAQAogY2xhc3MgVGVzdEJ1ZmZlcmNTdHJpbmdJTyhUZXN0Y1N0cmluZ0lPKToKICAgICBjb25zdHJ1Y3RvciA9IGJ1ZmZlcgogCitjbGFzcyBUZXN0TWVtb3J5dmlld2NTdHJpbmdJTyhUZXN0Y1N0cmluZ0lPKToKKyAgICBjb25zdHJ1Y3RvciA9IG1lbW9yeXZpZXcKKwogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0U3RyaW5nSU8sIFRlc3RjU3RyaW5nSU8pCiAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygoImJ1ZmZlci4uIG5vdCBzdXBwb3J0ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKSk6CiAgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdEJ1ZmZlclN0cmluZ0lPLCBUZXN0QnVmZmVyY1N0cmluZ0lPKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdE1lbW9yeXZpZXdjU3RyaW5nSU8pCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfX19mdXR1cmVfXy5weSBiL0xpYi90ZXN0L3Rlc3RfX19mdXR1cmVfXy5weQppbmRleCAxZDhmOGU2Li5iNTczMzgyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X19fZnV0dXJlX18ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9fX2Z1dHVyZV9fLnB5CkBAIC0xLDQgKzEsMyBAQAotIyEgL3Vzci9iaW4vZW52IHB5dGhvbgogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogaW1wb3J0IF9fZnV0dXJlX18KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfX29zeF9zdXBwb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF9fb3N4X3N1cHBvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFkZDAwZQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L3Rlc3RfX29zeF9zdXBwb3J0LnB5CkBAIC0wLDAgKzEsMjgxIEBACisiIiIKK1Rlc3Qgc3VpdGUgZm9yIF9vc3hfc3VwcG9ydDogc2hhcmVkIE9TIFggc3VwcG9ydCBmdW5jdGlvbnMuCisiIiIKKworaW1wb3J0IG9zCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBzdGF0CitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKKworaW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0CisKK2ltcG9ydCBfb3N4X3N1cHBvcnQKKworQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoImRhcndpbiIpLCAicmVxdWlyZXMgT1MgWCIpCitjbGFzcyBUZXN0X09TWFN1cHBvcnQodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLm1heERpZmYgPSBOb25lCisgICAgICAgIHNlbGYucHJvZ19uYW1lID0gJ2JvZ3VzX3Byb2dyYW1feHh4eCcKKyAgICAgICAgc2VsZi50ZW1wX3BhdGhfZGlyID0gb3MucGF0aC5hYnNwYXRoKG9zLmdldGN3ZCgpKQorICAgICAgICBzZWxmLmVudiA9IHRlc3QudGVzdF9zdXBwb3J0LkVudmlyb25tZW50VmFyR3VhcmQoKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc2VsZi5lbnYuX19leGl0X18pCisgICAgICAgIGZvciBjdiBpbiAoJ0NGTEFHUycsICdMREZMQUdTJywgJ0NQUEZMQUdTJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQkFTRUNGTEFHUycsICdCTERTSEFSRUQnLCAnTERTSEFSRUQnLCAnQ0MnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDWFgnLCAnUFlfQ0ZMQUdTJywgJ1BZX0xERkxBR1MnLCAnUFlfQ1BQRkxBR1MnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQWV9DT1JFX0NGTEFHUycpOgorICAgICAgICAgICAgaWYgY3YgaW4gc2VsZi5lbnY6CisgICAgICAgICAgICAgICAgc2VsZi5lbnYudW5zZXQoY3YpCisKKyAgICBkZWYgYWRkX2V4cGVjdGVkX3NhdmVkX2luaXRpYWxfdmFsdWVzKHNlbGYsIGNvbmZpZ192YXJzLCBleHBlY3RlZF92YXJzKToKKyAgICAgICAgIyBFbnN1cmUgdGhhdCB0aGUgaW5pdGlhbCB2YWx1ZXMgZm9yIGFsbCBtb2RpZmllZCBjb25maWcgdmFycworICAgICAgICAjIGFyZSBhbHNvIHNhdmVkIHdpdGggbW9kaWZpZWQga2V5cy4KKyAgICAgICAgZXhwZWN0ZWRfdmFycy51cGRhdGUoKCdfT1NYX1NVUFBPUlRfSU5JVElBTF8nKyBrLAorICAgICAgICAgICAgICAgIGNvbmZpZ192YXJzW2tdKSBmb3IgayBpbiBjb25maWdfdmFycworICAgICAgICAgICAgICAgICAgICBpZiBjb25maWdfdmFyc1trXSAhPSBleHBlY3RlZF92YXJzW2tdKQorCisgICAgZGVmIHRlc3RfX2ZpbmRfZXhlY3V0YWJsZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5lbnZbJ1BBVEgnXToKKyAgICAgICAgICAgIHNlbGYuZW52WydQQVRIJ10gPSBzZWxmLmVudlsnUEFUSCddICsgJzonCisgICAgICAgIHNlbGYuZW52WydQQVRIJ10gPSBzZWxmLmVudlsnUEFUSCddICsgb3MucGF0aC5hYnNwYXRoKHNlbGYudGVtcF9wYXRoX2RpcikKKyAgICAgICAgdGVzdC50ZXN0X3N1cHBvcnQudW5saW5rKHNlbGYucHJvZ19uYW1lKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShfb3N4X3N1cHBvcnQuX2ZpbmRfZXhlY3V0YWJsZShzZWxmLnByb2dfbmFtZSkpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cCh0ZXN0LnRlc3Rfc3VwcG9ydC51bmxpbmssIHNlbGYucHJvZ19uYW1lKQorICAgICAgICB3aXRoIG9wZW4oc2VsZi5wcm9nX25hbWUsICd3JykgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoIiMhL2Jpbi9zaFxuL2Jpbi9lY2hvIE9LXG4iKQorICAgICAgICBvcy5jaG1vZChzZWxmLnByb2dfbmFtZSwgc3RhdC5TX0lSV1hVKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucHJvZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vc3hfc3VwcG9ydC5fZmluZF9leGVjdXRhYmxlKHNlbGYucHJvZ19uYW1lKSkKKworICAgIGRlZiB0ZXN0X19yZWFkX291dHB1dChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5lbnZbJ1BBVEgnXToKKyAgICAgICAgICAgIHNlbGYuZW52WydQQVRIJ10gPSBzZWxmLmVudlsnUEFUSCddICsgJzonCisgICAgICAgIHNlbGYuZW52WydQQVRIJ10gPSBzZWxmLmVudlsnUEFUSCddICsgb3MucGF0aC5hYnNwYXRoKHNlbGYudGVtcF9wYXRoX2RpcikKKyAgICAgICAgdGVzdC50ZXN0X3N1cHBvcnQudW5saW5rKHNlbGYucHJvZ19uYW1lKQorICAgICAgICBzZWxmLmFkZENsZWFudXAodGVzdC50ZXN0X3N1cHBvcnQudW5saW5rLCBzZWxmLnByb2dfbmFtZSkKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYucHJvZ19uYW1lLCAndycpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKCIjIS9iaW4vc2hcbi9iaW4vZWNobyBFeHBlY3RlZE91dHB1dFxuIikKKyAgICAgICAgb3MuY2htb2Qoc2VsZi5wcm9nX25hbWUsIHN0YXQuU19JUldYVSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnRXhwZWN0ZWRPdXRwdXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vc3hfc3VwcG9ydC5fcmVhZF9vdXRwdXQoc2VsZi5wcm9nX25hbWUpKQorCisgICAgZGVmIHRlc3RfX2ZpbmRfYnVpbGRfdG9vbChzZWxmKToKKyAgICAgICAgb3V0ID0gX29zeF9zdXBwb3J0Ll9maW5kX2J1aWxkX3Rvb2woJ2NjJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNmaWxlKG91dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NjIG5vdCBmb3VuZCAtIGNoZWNrIHhjb2RlLXNlbGVjdCcpCisKKyAgICBkZWYgdGVzdF9fZ2V0X3N5c3RlbV92ZXJzaW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUocGxhdGZvcm0ubWFjX3ZlcigpWzBdLnN0YXJ0c3dpdGgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3N4X3N1cHBvcnQuX2dldF9zeXN0ZW1fdmVyc2lvbigpKSkKKworICAgIGRlZiB0ZXN0X19yZW1vdmVfb3JpZ2luYWxfdmFsdWVzKHNlbGYpOgorICAgICAgICBjb25maWdfdmFycyA9IHsKKyAgICAgICAgJ0NDJzogJ2djYy10ZXN0IC1wdGhyZWFkcycsCisgICAgICAgIH0KKyAgICAgICAgZXhwZWN0ZWRfdmFycyA9IHsKKyAgICAgICAgJ0NDJzogJ2NsYW5nIC1wdGhyZWFkcycsCisgICAgICAgIH0KKyAgICAgICAgY3YgPSAnQ0MnCisgICAgICAgIG5ld3ZhbHVlID0gJ2NsYW5nIC1wdGhyZWFkcycKKyAgICAgICAgX29zeF9zdXBwb3J0Ll9zYXZlX21vZGlmaWVkX3ZhbHVlKGNvbmZpZ192YXJzLCBjdiwgbmV3dmFsdWUpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZXhwZWN0ZWRfdmFycywgY29uZmlnX3ZhcnMpCisgICAgICAgIF9vc3hfc3VwcG9ydC5fcmVtb3ZlX29yaWdpbmFsX3ZhbHVlcyhjb25maWdfdmFycykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF92YXJzLCBjb25maWdfdmFycykKKworICAgIGRlZiB0ZXN0X19zYXZlX21vZGlmaWVkX3ZhbHVlKHNlbGYpOgorICAgICAgICBjb25maWdfdmFycyA9IHsKKyAgICAgICAgJ0NDJzogJ2djYy10ZXN0IC1wdGhyZWFkcycsCisgICAgICAgIH0KKyAgICAgICAgZXhwZWN0ZWRfdmFycyA9IHsKKyAgICAgICAgJ0NDJzogJ2NsYW5nIC1wdGhyZWFkcycsCisgICAgICAgIH0KKyAgICAgICAgc2VsZi5hZGRfZXhwZWN0ZWRfc2F2ZWRfaW5pdGlhbF92YWx1ZXMoY29uZmlnX3ZhcnMsIGV4cGVjdGVkX3ZhcnMpCisgICAgICAgIGN2ID0gJ0NDJworICAgICAgICBuZXd2YWx1ZSA9ICdjbGFuZyAtcHRocmVhZHMnCisgICAgICAgIF9vc3hfc3VwcG9ydC5fc2F2ZV9tb2RpZmllZF92YWx1ZShjb25maWdfdmFycywgY3YsIG5ld3ZhbHVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX3ZhcnMsIGNvbmZpZ192YXJzKQorCisgICAgZGVmIHRlc3RfX3NhdmVfbW9kaWZpZWRfdmFsdWVfdW5jaGFuZ2VkKHNlbGYpOgorICAgICAgICBjb25maWdfdmFycyA9IHsKKyAgICAgICAgJ0NDJzogJ2djYy10ZXN0IC1wdGhyZWFkcycsCisgICAgICAgIH0KKyAgICAgICAgZXhwZWN0ZWRfdmFycyA9IGNvbmZpZ192YXJzLmNvcHkoKQorICAgICAgICBjdiA9ICdDQycKKyAgICAgICAgbmV3dmFsdWUgPSAnZ2NjLXRlc3QgLXB0aHJlYWRzJworICAgICAgICBfb3N4X3N1cHBvcnQuX3NhdmVfbW9kaWZpZWRfdmFsdWUoY29uZmlnX3ZhcnMsIGN2LCBuZXd2YWx1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF92YXJzLCBjb25maWdfdmFycykKKworICAgIGRlZiB0ZXN0X19zdXBwb3J0c191bml2ZXJzYWxfYnVpbGRzKHNlbGYpOgorICAgICAgICBpbXBvcnQgcGxhdGZvcm0KKyAgICAgICAgbWFjX3Zlcl90dXBsZSA9IHR1cGxlKGludChpKSBmb3IgaSBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtLm1hY192ZXIoKVswXS5zcGxpdCgnLicpWzA6Ml0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFjX3Zlcl90dXBsZSA+PSAoMTAsIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vc3hfc3VwcG9ydC5fc3VwcG9ydHNfdW5pdmVyc2FsX2J1aWxkcygpKQorCisgICAgZGVmIHRlc3RfX2ZpbmRfYXBwcm9wcmlhdGVfY29tcGlsZXIoc2VsZik6CisgICAgICAgIGNvbXBpbGVycyA9ICgKKyAgICAgICAgICAgICAgICAgICAgICAgICgnZ2NjLXRlc3QnLCAnaTY4Ni1hcHBsZS1kYXJ3aW4xMS1sbHZtLWdjYy00LjInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgnY2xhbmcnLCAnY2xhbmcgdmVyc2lvbiAzLjEnKSwKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICBjb25maWdfdmFycyA9IHsKKyAgICAgICAgJ0NDJzogJ2djYy10ZXN0IC1wdGhyZWFkcycsCisgICAgICAgICdDWFgnOiAnY2MrKy10ZXN0JywKKyAgICAgICAgJ0NGTEFHUyc6ICctZm5vLXN0cmljdC1hbGlhc2luZyAgLWcgLU8zIC1hcmNoIHBwYyAtYXJjaCBpMzg2ICAnLAorICAgICAgICAnTERGTEFHUyc6ICctYXJjaCBwcGMgLWFyY2ggaTM4NiAgIC1nJywKKyAgICAgICAgJ0NQUEZMQUdTJzogJy1JLiAtaXN5c3Jvb3QgL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkaycsCisgICAgICAgICdCTERTSEFSRUQnOiAnZ2NjLXRlc3QgLWJ1bmRsZSAtYXJjaCBwcGMgLWFyY2ggaTM4NiAtZycsCisgICAgICAgICdMRFNIQVJFRCc6ICdnY2MtdGVzdCAtYnVuZGxlIC1hcmNoIHBwYyAtYXJjaCBpMzg2ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICctaXN5c3Jvb3QgL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkayAtZycsCisgICAgICAgIH0KKyAgICAgICAgZXhwZWN0ZWRfdmFycyA9IHsKKyAgICAgICAgJ0NDJzogJ2NsYW5nIC1wdGhyZWFkcycsCisgICAgICAgICdDWFgnOiAnY2xhbmcrKycsCisgICAgICAgICdDRkxBR1MnOiAnLWZuby1zdHJpY3QtYWxpYXNpbmcgIC1nIC1PMyAtYXJjaCBwcGMgLWFyY2ggaTM4NiAgJywKKyAgICAgICAgJ0xERkxBR1MnOiAnLWFyY2ggcHBjIC1hcmNoIGkzODYgICAtZycsCisgICAgICAgICdDUFBGTEFHUyc6ICctSS4gLWlzeXNyb290IC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGsnLAorICAgICAgICAnQkxEU0hBUkVEJzogJ2NsYW5nIC1idW5kbGUgLWFyY2ggcHBjIC1hcmNoIGkzODYgLWcnLAorICAgICAgICAnTERTSEFSRUQnOiAnY2xhbmcgLWJ1bmRsZSAtYXJjaCBwcGMgLWFyY2ggaTM4NiAnCisgICAgICAgICAgICAgICAgICAgICAgICAnLWlzeXNyb290IC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGsgLWcnLAorICAgICAgICB9CisgICAgICAgIHNlbGYuYWRkX2V4cGVjdGVkX3NhdmVkX2luaXRpYWxfdmFsdWVzKGNvbmZpZ192YXJzLCBleHBlY3RlZF92YXJzKQorCisgICAgICAgIHN1ZmZpeCA9ICgnOicgKyBzZWxmLmVudlsnUEFUSCddKSBpZiBzZWxmLmVudlsnUEFUSCddIGVsc2UgJycKKyAgICAgICAgc2VsZi5lbnZbJ1BBVEgnXSA9IG9zLnBhdGguYWJzcGF0aChzZWxmLnRlbXBfcGF0aF9kaXIpICsgc3VmZml4CisgICAgICAgIGZvciBjX25hbWUsIGNfb3V0cHV0IGluIGNvbXBpbGVyczoKKyAgICAgICAgICAgIHRlc3QudGVzdF9zdXBwb3J0LnVubGluayhjX25hbWUpCisgICAgICAgICAgICBzZWxmLmFkZENsZWFudXAodGVzdC50ZXN0X3N1cHBvcnQudW5saW5rLCBjX25hbWUpCisgICAgICAgICAgICB3aXRoIG9wZW4oY19uYW1lLCAndycpIGFzIGY6CisgICAgICAgICAgICAgICAgZi53cml0ZSgiIyEvYmluL3NoXG4vYmluL2VjaG8gIiArIGNfb3V0cHV0KQorICAgICAgICAgICAgb3MuY2htb2QoY19uYW1lLCBzdGF0LlNfSVJXWFUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3N4X3N1cHBvcnQuX2ZpbmRfYXBwcm9wcmlhdGVfY29tcGlsZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfdmFycykpCisKKyAgICBkZWYgdGVzdF9fcmVtb3ZlX3VuaXZlcnNhbF9mbGFncyhzZWxmKToKKyAgICAgICAgY29uZmlnX3ZhcnMgPSB7CisgICAgICAgICdDRkxBR1MnOiAnLWZuby1zdHJpY3QtYWxpYXNpbmcgIC1nIC1PMyAtYXJjaCBwcGMgLWFyY2ggaTM4NiAgJywKKyAgICAgICAgJ0xERkxBR1MnOiAnLWFyY2ggcHBjIC1hcmNoIGkzODYgICAtZycsCisgICAgICAgICdDUFBGTEFHUyc6ICctSS4gLWlzeXNyb290IC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGsnLAorICAgICAgICAnQkxEU0hBUkVEJzogJ2djYy00LjAgLWJ1bmRsZSAgLWFyY2ggcHBjIC1hcmNoIGkzODYgLWcnLAorICAgICAgICAnTERTSEFSRUQnOiAnZ2NjLTQuMCAtYnVuZGxlICAtYXJjaCBwcGMgLWFyY2ggaTM4NiAnCisgICAgICAgICAgICAgICAgICAgICAgICAnLWlzeXNyb290IC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGsgLWcnLAorICAgICAgICB9CisgICAgICAgIGV4cGVjdGVkX3ZhcnMgPSB7CisgICAgICAgICdDRkxBR1MnOiAnLWZuby1zdHJpY3QtYWxpYXNpbmcgIC1nIC1PMyAgICAnLAorICAgICAgICAnTERGTEFHUyc6ICcgICAgLWcnLAorICAgICAgICAnQ1BQRkxBR1MnOiAnLUkuICAnLAorICAgICAgICAnQkxEU0hBUkVEJzogJ2djYy00LjAgLWJ1bmRsZSAgICAtZycsCisgICAgICAgICdMRFNIQVJFRCc6ICdnY2MtNC4wIC1idW5kbGUgICAgICAtZycsCisgICAgICAgIH0KKyAgICAgICAgc2VsZi5hZGRfZXhwZWN0ZWRfc2F2ZWRfaW5pdGlhbF92YWx1ZXMoY29uZmlnX3ZhcnMsIGV4cGVjdGVkX3ZhcnMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF92YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vc3hfc3VwcG9ydC5fcmVtb3ZlX3VuaXZlcnNhbF9mbGFncygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ192YXJzKSkKKworICAgIGRlZiB0ZXN0X19yZW1vdmVfdW5zdXBwb3J0ZWRfYXJjaHMoc2VsZik6CisgICAgICAgIGNvbmZpZ192YXJzID0geworICAgICAgICAnQ0MnOiAnY2xhbmcnLAorICAgICAgICAnQ0ZMQUdTJzogJy1mbm8tc3RyaWN0LWFsaWFzaW5nICAtZyAtTzMgLWFyY2ggcHBjIC1hcmNoIGkzODYgICcsCisgICAgICAgICdMREZMQUdTJzogJy1hcmNoIHBwYyAtYXJjaCBpMzg2ICAgLWcnLAorICAgICAgICAnQ1BQRkxBR1MnOiAnLUkuIC1pc3lzcm9vdCAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrJywKKyAgICAgICAgJ0JMRFNIQVJFRCc6ICdnY2MtNC4wIC1idW5kbGUgIC1hcmNoIHBwYyAtYXJjaCBpMzg2IC1nJywKKyAgICAgICAgJ0xEU0hBUkVEJzogJ2djYy00LjAgLWJ1bmRsZSAgLWFyY2ggcHBjIC1hcmNoIGkzODYgJworICAgICAgICAgICAgICAgICAgICAgICAgJy1pc3lzcm9vdCAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrIC1nJywKKyAgICAgICAgfQorICAgICAgICBleHBlY3RlZF92YXJzID0geworICAgICAgICAnQ0MnOiAnY2xhbmcnLAorICAgICAgICAnQ0ZMQUdTJzogJy1mbm8tc3RyaWN0LWFsaWFzaW5nICAtZyAtTzMgIC1hcmNoIGkzODYgICcsCisgICAgICAgICdMREZMQUdTJzogJyAtYXJjaCBpMzg2ICAgLWcnLAorICAgICAgICAnQ1BQRkxBR1MnOiAnLUkuIC1pc3lzcm9vdCAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrJywKKyAgICAgICAgJ0JMRFNIQVJFRCc6ICdnY2MtNC4wIC1idW5kbGUgICAtYXJjaCBpMzg2IC1nJywKKyAgICAgICAgJ0xEU0hBUkVEJzogJ2djYy00LjAgLWJ1bmRsZSAgIC1hcmNoIGkzODYgJworICAgICAgICAgICAgICAgICAgICAgICAgJy1pc3lzcm9vdCAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrIC1nJywKKyAgICAgICAgfQorICAgICAgICBzZWxmLmFkZF9leHBlY3RlZF9zYXZlZF9pbml0aWFsX3ZhbHVlcyhjb25maWdfdmFycywgZXhwZWN0ZWRfdmFycykKKworICAgICAgICBzdWZmaXggPSAoJzonICsgc2VsZi5lbnZbJ1BBVEgnXSkgaWYgc2VsZi5lbnZbJ1BBVEgnXSBlbHNlICcnCisgICAgICAgIHNlbGYuZW52WydQQVRIJ10gPSBvcy5wYXRoLmFic3BhdGgoc2VsZi50ZW1wX3BhdGhfZGlyKSArIHN1ZmZpeAorICAgICAgICBjX25hbWUgPSAnY2xhbmcnCisgICAgICAgIHRlc3QudGVzdF9zdXBwb3J0LnVubGluayhjX25hbWUpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cCh0ZXN0LnRlc3Rfc3VwcG9ydC51bmxpbmssIGNfbmFtZSkKKyAgICAgICAgIyBleGl0IHN0YXR1cyAyNTUgbWVhbnMgbm8gUFBDIHN1cHBvcnQgaW4gdGhpcyBjb21waWxlciBjaGFpbgorICAgICAgICB3aXRoIG9wZW4oY19uYW1lLCAndycpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKCIjIS9iaW4vc2hcbmV4aXQgMjU1IikKKyAgICAgICAgb3MuY2htb2QoY19uYW1lLCBzdGF0LlNfSVJXWFUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3N4X3N1cHBvcnQuX3JlbW92ZV91bnN1cHBvcnRlZF9hcmNocygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ192YXJzKSkKKworICAgIGRlZiB0ZXN0X19vdmVycmlkZV9hbGxfYXJjaHMoc2VsZik6CisgICAgICAgIHNlbGYuZW52WydBUkNIRkxBR1MnXSA9ICctYXJjaCB4ODZfNjQnCisgICAgICAgIGNvbmZpZ192YXJzID0geworICAgICAgICAnQ0MnOiAnY2xhbmcnLAorICAgICAgICAnQ0ZMQUdTJzogJy1mbm8tc3RyaWN0LWFsaWFzaW5nICAtZyAtTzMgLWFyY2ggcHBjIC1hcmNoIGkzODYgICcsCisgICAgICAgICdMREZMQUdTJzogJy1hcmNoIHBwYyAtYXJjaCBpMzg2ICAgLWcnLAorICAgICAgICAnQ1BQRkxBR1MnOiAnLUkuIC1pc3lzcm9vdCAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrJywKKyAgICAgICAgJ0JMRFNIQVJFRCc6ICdnY2MtNC4wIC1idW5kbGUgIC1hcmNoIHBwYyAtYXJjaCBpMzg2IC1nJywKKyAgICAgICAgJ0xEU0hBUkVEJzogJ2djYy00LjAgLWJ1bmRsZSAtYXJjaCBwcGMgLWFyY2ggaTM4NiAnCisgICAgICAgICAgICAgICAgICAgICAgICAnLWlzeXNyb290IC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGsgLWcnLAorICAgICAgICB9CisgICAgICAgIGV4cGVjdGVkX3ZhcnMgPSB7CisgICAgICAgICdDQyc6ICdjbGFuZycsCisgICAgICAgICdDRkxBR1MnOiAnLWZuby1zdHJpY3QtYWxpYXNpbmcgIC1nIC1PMyAgICAgLWFyY2ggeDg2XzY0JywKKyAgICAgICAgJ0xERkxBR1MnOiAnICAgIC1nIC1hcmNoIHg4Nl82NCcsCisgICAgICAgICdDUFBGTEFHUyc6ICctSS4gLWlzeXNyb290IC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGsnLAorICAgICAgICAnQkxEU0hBUkVEJzogJ2djYy00LjAgLWJ1bmRsZSAgICAtZyAtYXJjaCB4ODZfNjQnLAorICAgICAgICAnTERTSEFSRUQnOiAnZ2NjLTQuMCAtYnVuZGxlICAgLWlzeXNyb290ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICcvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrIC1nIC1hcmNoIHg4Nl82NCcsCisgICAgICAgIH0KKyAgICAgICAgc2VsZi5hZGRfZXhwZWN0ZWRfc2F2ZWRfaW5pdGlhbF92YWx1ZXMoY29uZmlnX3ZhcnMsIGV4cGVjdGVkX3ZhcnMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF92YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vc3hfc3VwcG9ydC5fb3ZlcnJpZGVfYWxsX2FyY2hzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnX3ZhcnMpKQorCisgICAgZGVmIHRlc3RfX2NoZWNrX2Zvcl91bmF2YWlsYWJsZV9zZGsoc2VsZik6CisgICAgICAgIGNvbmZpZ192YXJzID0geworICAgICAgICAnQ0MnOiAnY2xhbmcnLAorICAgICAgICAnQ0ZMQUdTJzogJy1mbm8tc3RyaWN0LWFsaWFzaW5nICAtZyAtTzMgLWFyY2ggcHBjIC1hcmNoIGkzODYgICcKKyAgICAgICAgICAgICAgICAgICAgICAgICctaXN5c3Jvb3QgL0RldmVsb3Blci9TREtzL01hY09TWDEwLjEuc2RrJywKKyAgICAgICAgJ0xERkxBR1MnOiAnLWFyY2ggcHBjIC1hcmNoIGkzODYgICAtZycsCisgICAgICAgICdDUFBGTEFHUyc6ICctSS4gLWlzeXNyb290IC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC4xLnNkaycsCisgICAgICAgICdCTERTSEFSRUQnOiAnZ2NjLTQuMCAtYnVuZGxlICAtYXJjaCBwcGMgLWFyY2ggaTM4NiAtZycsCisgICAgICAgICdMRFNIQVJFRCc6ICdnY2MtNC4wIC1idW5kbGUgIC1hcmNoIHBwYyAtYXJjaCBpMzg2ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICctaXN5c3Jvb3QgL0RldmVsb3Blci9TREtzL01hY09TWDEwLjEuc2RrIC1nJywKKyAgICAgICAgfQorICAgICAgICBleHBlY3RlZF92YXJzID0geworICAgICAgICAnQ0MnOiAnY2xhbmcnLAorICAgICAgICAnQ0ZMQUdTJzogJy1mbm8tc3RyaWN0LWFsaWFzaW5nICAtZyAtTzMgLWFyY2ggcHBjIC1hcmNoIGkzODYgICcKKyAgICAgICAgICAgICAgICAgICAgICAgICcgJywKKyAgICAgICAgJ0xERkxBR1MnOiAnLWFyY2ggcHBjIC1hcmNoIGkzODYgICAtZycsCisgICAgICAgICdDUFBGTEFHUyc6ICctSS4gICcsCisgICAgICAgICdCTERTSEFSRUQnOiAnZ2NjLTQuMCAtYnVuZGxlICAtYXJjaCBwcGMgLWFyY2ggaTM4NiAtZycsCisgICAgICAgICdMRFNIQVJFRCc6ICdnY2MtNC4wIC1idW5kbGUgIC1hcmNoIHBwYyAtYXJjaCBpMzg2ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICcgLWcnLAorICAgICAgICB9CisgICAgICAgIHNlbGYuYWRkX2V4cGVjdGVkX3NhdmVkX2luaXRpYWxfdmFsdWVzKGNvbmZpZ192YXJzLCBleHBlY3RlZF92YXJzKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3N4X3N1cHBvcnQuX2NoZWNrX2Zvcl91bmF2YWlsYWJsZV9zZGsoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfdmFycykpCisKKyAgICBkZWYgdGVzdF9nZXRfcGxhdGZvcm1fb3N4KHNlbGYpOgorICAgICAgICAjIE5vdGUsIGdldF9wbGF0Zm9ybV9vc3ggaXMgY3VycmVudGx5IHRlc3RlZCBtb3JlIGV4dGVuc2l2ZWx5CisgICAgICAgICMgaW5kaXJlY3RseSBieSB0ZXN0X3N5c2NvbmZpZyBhbmQgdGVzdF9kaXN0dXRpbHMKKyAgICAgICAgY29uZmlnX3ZhcnMgPSB7CisgICAgICAgICdDRkxBR1MnOiAnLWZuby1zdHJpY3QtYWxpYXNpbmcgIC1nIC1PMyAtYXJjaCBwcGMgLWFyY2ggaTM4NiAgJworICAgICAgICAgICAgICAgICAgICAgICAgJy1pc3lzcm9vdCAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuMS5zZGsnLAorICAgICAgICAnTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJzogJzEwLjYnLAorICAgICAgICB9CisgICAgICAgIHJlc3VsdCA9IF9vc3hfc3VwcG9ydC5nZXRfcGxhdGZvcm1fb3N4KGNvbmZpZ192YXJzLCAnICcsICcgJywgJyAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgnbWFjb3N4JywgJzEwLjYnLCAnZmF0JyksIHJlc3VsdCkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RfT1NYU3VwcG9ydCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hZXBhY2sucHkgYi9MaWIvdGVzdC90ZXN0X2FlcGFjay5weQppbmRleCBmNGVhMjViLi44NGM4NjA5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2FlcGFjay5weQorKysgYi9MaWIvdGVzdC90ZXN0X2FlcGFjay5weQpAQCAtNTksMTAgKzU5LDEwIEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGltcG9ydCBDYXJib24uRmlsZQogICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ0NhcmJvbi5GaWxlIG5vdCBhdmFpbGFibGUnKQogCiAgICAgICAgIGlmIG5vdCBoYXNhdHRyKENhcmJvbi5GaWxlLCAiRlNTcGVjIik6Ci0gICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ0NhcmJvbi5GaWxlLkZTU3BlYyBub3QgYXZhaWxhYmxlJykKICAgICAgICAgbyA9IENhcmJvbi5GaWxlLkZTU3BlYyhvcy5jdXJkaXIpCiAgICAgICAgIHBhY2tlZCA9IGFlcGFjay5wYWNrKG8pCiAgICAgICAgIHVucGFja2VkID0gYWVwYWNrLnVucGFjayhwYWNrZWQpCkBAIC03Miw5ICs3Miw5IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGltcG9ydCBDYXJib24uRmlsZQogICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ0NhcmJvbi5GaWxlIG5vdCBhdmFpbGFibGUnKQogICAgICAgICBpZiBub3QgaGFzYXR0cihDYXJib24uRmlsZSwgIkZTU3BlYyIpOgotICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCdDYXJib24uRmlsZS5GU1NwZWMgbm90IGF2YWlsYWJsZScpCiAgICAgICAgIG8gPSBDYXJib24uRmlsZS5GU1NwZWMob3MuY3VyZGlyKS5OZXdBbGlhc01pbmltYWwoKQogICAgICAgICBwYWNrZWQgPSBhZXBhY2sucGFjayhvKQogICAgICAgICB1bnBhY2tlZCA9IGFlcGFjay51bnBhY2socGFja2VkKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9haWZjLnB5IGIvTGliL3Rlc3QvdGVzdF9haWZjLnB5CmluZGV4IGNiZjAwZTkuLmNmYzQ5MWQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYWlmYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2FpZmMucHkKQEAgLTEsMTE1ICsxLDM0MSBAQAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgZmluZGZpbGUsIHJ1bl91bml0dGVzdCwgVEVTVEZOCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCAoZmluZGZpbGUsIFRFU1RGTiwgdW5saW5rLCBjYXB0dXJlZF9zdGRvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX3VuaXR0ZXN0KQogaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IGF1ZGlvdGVzdHMKIGltcG9ydCBvcwotCitpbXBvcnQgaW8KK2ltcG9ydCBzeXMKK2ltcG9ydCBzdHJ1Y3QKIGltcG9ydCBhaWZjCiAKIAotY2xhc3MgQUlGQ1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorY2xhc3MgQWlmY1Rlc3QoYXVkaW90ZXN0cy5BdWRpb1dyaXRlVGVzdHMsCisgICAgICAgICAgICAgICBhdWRpb3Rlc3RzLkF1ZGlvVGVzdHNXaXRoU291cmNlRmlsZSk6CisgICAgbW9kdWxlID0gYWlmYworICAgIGNsb3NlX2ZkID0gVHJ1ZQorICAgIHRlc3RfdW5zZWVrYWJsZV9yZWFkID0gTm9uZQogCi0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBzZWxmLmYgPSBzZWxmLmZvdXQgPSBOb25lCi0gICAgICAgIHNlbGYuc25kZmlsZXBhdGggPSBmaW5kZmlsZSgnU2luZS0xMDAwSHotMzAwbXMuYWlmJykKIAotICAgIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAgICAgaWYgc2VsZi5mIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2VsZi5mLmNsb3NlKCkKLSAgICAgICAgaWYgc2VsZi5mb3V0IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHNlbGYuZm91dC5jbG9zZSgpCi0gICAgICAgICAgICBleGNlcHQgKGFpZmMuRXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKLSAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIG9zLnJlbW92ZShURVNURk4pCi0gICAgICAgIGV4Y2VwdCBPU0Vycm9yOgotICAgICAgICAgICAgcGFzcworY2xhc3MgQWlmY1BDTThUZXN0KEFpZmNUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgc25kZmlsZW5hbWUgPSAncGx1Y2stcGNtOC5haWZmJworICAgIHNuZGZpbGVuZnJhbWVzID0gMzMwNworICAgIG5jaGFubmVscyA9IDIKKyAgICBzYW1wd2lkdGggPSAxCisgICAgZnJhbWVyYXRlID0gMTEwMjUKKyAgICBuZnJhbWVzID0gNDgKKyAgICBjb21wdHlwZSA9ICdOT05FJworICAgIGNvbXBuYW1lID0gJ25vdCBjb21wcmVzc2VkJworICAgIGZyYW1lcyA9IGF1ZGlvdGVzdHMuZnJvbWhleCgiIiJcCisgICAgICAwMkZGIDRCMDAgMzEwNCA4MDA4IENCMDYgNDgwMyBCRjAxIDAzRkUgQjhGQSBCNEYzIDI5RUIgMUFFNiBcCisgICAgICBFREU0IEM2RTIgMEVFMCBFRkUwIDU3RTIgRkJFOCAxM0VGIEQ4RjcgOTdGQiBGNUZDIDA4RkIgREZGQiBcCisgICAgICAxMUZBIDNFRkIgQkNGQyA2NkZGIENGMDQgNDMwOSBDMTBFIDUxMTIgRUUxNyA4MjE2IDdGMTQgODAxMiBcCisgICAgICA0OTBFIDUyMEQgRUYwRiBDRTBGIEU0MEMgNjMwQSAwODBBIDJCMEIgNTEwRSA4QjExIEI2MEUgNDQwQSBcCisgICAgICAiIiIpCiAKKworY2xhc3MgQWlmY1BDTTE2VGVzdChBaWZjVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIHNuZGZpbGVuYW1lID0gJ3BsdWNrLXBjbTE2LmFpZmYnCisgICAgc25kZmlsZW5mcmFtZXMgPSAzMzA3CisgICAgbmNoYW5uZWxzID0gMgorICAgIHNhbXB3aWR0aCA9IDIKKyAgICBmcmFtZXJhdGUgPSAxMTAyNQorICAgIG5mcmFtZXMgPSA0OAorICAgIGNvbXB0eXBlID0gJ05PTkUnCisgICAgY29tcG5hbWUgPSAnbm90IGNvbXByZXNzZWQnCisgICAgZnJhbWVzID0gYXVkaW90ZXN0cy5mcm9taGV4KCIiIlwKKyAgICAgIDAyMkVGRkVBIDRCNUQwMEY2IDMxMTgwNEVBIDgwRTEwODQwIENCRTEwNkIxIDQ4QTkwM0Y1IEJGRTYwMUIyIDAzNkNGRTdCIFwKKyAgICAgIEI4NThGQTNFIEI0QjFGMzRGIDI5OUFFQkNBIDFBNURFNkRBIEVERkFFNDkxIEM2MjhFMjc1IDBFMDlFMEI1IEVGMkFFMDI5IFwKKyAgICAgIDU3NThFMjcxIEZCMzVFODNGIDEzNzZFRjg2IEQ4MkJGNzI3IDk3OTBGQjc2IEY1RkFGQzBGIDA4NjdGQjlDIERGMzBGQjQzIFwKKyAgICAgIDExN0VGQTM2IDNFRTVGQjVCIEJDNzlGQ0IxIDY2RDlGRjVEIENGMTUwNDEyIDQzMUQwOTdDIEMxQkEwRUM4IDUxMjExMkExIFwKKyAgICAgIEVFRTIxNzUzIDgyMDcxNjY1IDdGRkYxNDQzIDgwMDQxMjhGIDQ5QTIwRUFGIDUyQkIwREJBIEVGQjQwRjYwIENFM0MwRkJGIFwKKyAgICAgIEU0QjMwQ0VDIDYzNDMwQTVDIDA4QzgwQTIwIDJCQkIwQjA4IDUxNEEwRTQzIDhCQ0YxMTM5IEI2RjYwRUVCIDQ0MTIwQTVFIFwKKyAgICAgICIiIikKKworCitjbGFzcyBBaWZjUENNMjRUZXN0KEFpZmNUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgc25kZmlsZW5hbWUgPSAncGx1Y2stcGNtMjQuYWlmZicKKyAgICBzbmRmaWxlbmZyYW1lcyA9IDMzMDcKKyAgICBuY2hhbm5lbHMgPSAyCisgICAgc2FtcHdpZHRoID0gMworICAgIGZyYW1lcmF0ZSA9IDExMDI1CisgICAgbmZyYW1lcyA9IDQ4CisgICAgY29tcHR5cGUgPSAnTk9ORScKKyAgICBjb21wbmFtZSA9ICdub3QgY29tcHJlc3NlZCcKKyAgICBmcmFtZXMgPSBhdWRpb3Rlc3RzLmZyb21oZXgoIiIiXAorICAgICAgMDIyRDY1RkZFQjlEIDRCNUEwRjAwRkE1NCAzMTEzQzMwNEVFMkIgODBEQ0Q2MDg0MzAzIFwKKyAgICAgIENCREVDMDA2QjI2MSA0OEE5OTgwM0YyRjggQkZFODI0MDFCMDdEIDAzNkJGQkZFN0I1RCBcCisgICAgICBCODU3NTZGQTNFQzkgQjRCMDU1RjM1MDJCIDI5OTgzMEVCQ0I2MiAxQTVDQTdFNkQ5OUEgXAorICAgICAgRURGQTNFRTQ5MUJEIEM2MjVFQkUyNzg4NCAwRTA1QTlFMEI2Q0YgRUYyOTI5RTAyOTIyIFwKKyAgICAgIDU3NThEOEUyNzA2NyBGQjM1NTdFODNFMTYgMTM3N0JGRUY4NDAyIEQ4MkM1QkY3MjcyQSBcCisgICAgICA5NzhGMTZGQjc3NDUgRjVGODY1RkMxMDEzIDA4NjYzNUZCOUM0RSBERjMwRkNGQjQwRUUgXAorICAgICAgMTE3RkUwRkEzNDM4IDNFRTZCOEZCNUFDMyBCQzc3QTNGQ0IyRjQgNjZENkRBRkY1RjMyIFwKKyAgICAgIENGMTNCOTA0MTI3NSA0MzFENjkwOTdBOEMgQzFCQjYwMEVDNzRFIDUxMjBCOTEyQTJCQSBcCisgICAgICBFRURGNjQxNzU0QzAgODIwNzAwMTY2NEI3IDdGRkZGRjE0NDUzRiA4MDAwMDAxMjk0RTYgXAorICAgICAgNDk5QzFCMEVCM0IyIDUyQjczRTBEQkNBMCBFRkIyQjIwRjVGRDggQ0UzQ0RCMEZCRTEyIFwKKyAgICAgIEU0QjQ5QzBDRUEyRCA2MzQ0QTgwQTVBN0MgMDhDOEZFMEExRkZFIDJCQjk4NjBCMEEwRSBcCisgICAgICA1MTQ4NkYwRTQ0RTEgOEJDQzY0MTEzQjA1IEI2RjRFQzBFRUIzNiA0NDEzMTcwQTVCNDggXAorICAgICAgIiIiKQorCisKK2NsYXNzIEFpZmNQQ00zMlRlc3QoQWlmY1Rlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBzbmRmaWxlbmFtZSA9ICdwbHVjay1wY20zMi5haWZmJworICAgIHNuZGZpbGVuZnJhbWVzID0gMzMwNworICAgIG5jaGFubmVscyA9IDIKKyAgICBzYW1wd2lkdGggPSA0CisgICAgZnJhbWVyYXRlID0gMTEwMjUKKyAgICBuZnJhbWVzID0gNDgKKyAgICBjb21wdHlwZSA9ICdOT05FJworICAgIGNvbXBuYW1lID0gJ25vdCBjb21wcmVzc2VkJworICAgIGZyYW1lcyA9IGF1ZGlvdGVzdHMuZnJvbWhleCgiIiJcCisgICAgICAwMjJENjVCQ0ZGRUI5RDkyIDRCNUEwRjgwMDBGQTU0OUMgMzExM0MzNDAwNEVFMkJDMCA4MERDRDY4MDA4NDMwM0UwIFwKKyAgICAgIENCREVDMEMwMDZCMjYxNDAgNDhBOTk4MDAwM0YyRjhGQyBCRkU4MjQ4MDAxQjA3RDkyIDAzNkJGQjYwRkU3QjVEMzQgXAorICAgICAgQjg1NzU2MDBGQTNFQzkyMCBCNEIwNTUwMEYzNTAyQkMwIDI5OTgzMDAwRUJDQjYyNDAgMUE1Q0E3QTBFNkQ5OUE2MCBcCisgICAgICBFREZBM0U4MEU0OTFCRDQwIEM2MjVFQjgwRTI3ODg0QTAgMEUwNUE5QTBFMEI2Q0ZFMCBFRjI5Mjk0MEUwMjkyMjgwIFwKKyAgICAgIDU3NThEODAwRTI3MDY3MDAgRkIzNTU3RDhFODNFMTY0MCAxMzc3QkYwMEVGODQwMjgwIEQ4MkM1QjgwRjcyNzJBODAgXAorICAgICAgOTc4RjE2MDBGQjc3NDU2MCBGNUY4NjUxMEZDMTAxMzY0IDA4NjYzNUEwRkI5QzRFMjAgREYzMEZDNDBGQjQwRUUyOCBcCisgICAgICAxMTdGRTBBMEZBMzQzOEIwIDNFRTZCODQwRkI1QUMzRjAgQkM3N0EzODBGQ0IyRjQ1NCA2NkQ2REE4MEZGNUYzMkI0IFwKKyAgICAgIENGMTNCOTgwMDQxMjc1QjAgNDMxRDY5ODAwOTdBOEMwMCBDMUJCNjAwMDBFQzc0RTAwIDUxMjBCOTgwMTJBMkJBQTAgXAorICAgICAgRUVERjY0QzAxNzU0QzA2MCA4MjA3MDAwMDE2NjRCNzgwIDdGRkZGRkZGMTQ0NTNGNDAgODAwMDAwMDAxMjk0RTZFMCBcCisgICAgICA0OTlDMUIwMDBFQjNCMjcwIDUyQjczRTAwMERCQ0EwMjAgRUZCMkIyRTAwRjVGRDg4MCBDRTNDREI0MDBGQkUxMjcwIFwKKyAgICAgIEU0QjQ5Q0MwMENFQTJEOTAgNjM0NEE4ODAwQTVBN0NBMCAwOEM4RkU4MDBBMUZGRUUwIDJCQjk4NkMwMEIwQTBFMDAgXAorICAgICAgNTE0ODZGODAwRTQ0RTE5MCA4QkNDNjQ4MDExM0IwNTgwIEI2RjRFQzAwMEVFQjM2MzAgNDQxMzE3ODAwQTVCNDhBMCBcCisgICAgICAiIiIpCisKKworY2xhc3MgQWlmY1VMQVdUZXN0KEFpZmNUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgc25kZmlsZW5hbWUgPSAncGx1Y2stdWxhdy5haWZjJworICAgIHNuZGZpbGVuZnJhbWVzID0gMzMwNworICAgIG5jaGFubmVscyA9IDIKKyAgICBzYW1wd2lkdGggPSAyCisgICAgZnJhbWVyYXRlID0gMTEwMjUKKyAgICBuZnJhbWVzID0gNDgKKyAgICBjb21wdHlwZSA9ICd1bGF3JworICAgIGNvbXBuYW1lID0gJycKKyAgICBmcmFtZXMgPSBhdWRpb3Rlc3RzLmZyb21oZXgoIiIiXAorICAgICAgMDIyQ0ZGRTggNDk3QzAxMDQgMzA3QzA0REMgODI4NDA4M0MgQ0I4NDA2OUMgNDk3QzAzREMgQkU4NDAxQUMgMDM2Q0ZFNzQgXAorICAgICAgQjY4NEZBMjQgQjY4NEYzNDQgMkE3Q0VDMDQgMTlGQ0U3MDQgRUUwNEU1MDQgQzU4NEUyMDQgMEUzQ0UxMDQgRUYwNERGODQgXAorICAgICAgNTU3Q0UyMDQgRkIyNEU4MDQgMTJGQ0VGMDQgRDc4NEY3NDQgOTY4NEZCNjQgRjVDNEZDMjQgMDgzQ0ZCQTQgREY4NEZCMjQgXAorICAgICAgMTFGQ0ZBMjQgM0U3Q0ZCNjQgQkE4NEZDQjQgNjU3Q0ZGNUMgQ0Y4NDA0MUMgNDE3QzA5M0MgQzE4NDBFQkMgNTE3QzEyRkMgXAorICAgICAgRUYwNDE2RkMgODI4NDE1RkMgN0Q3QzEzRkMgODI4NDEyRkMgNDk3QzBFQkMgNTE3QzBEQkMgRjAwNDBGM0MgQ0Q4NDBGRkMgXAorICAgICAgRTUwNDBDQkMgNjE3QzBBM0MgMDhCQzBBM0MgMkM3QzBCM0MgNTE3QzBFM0MgOEE4NDEwRkMgQjY4NDBFQkMgNDU3QzBBM0MgXAorICAgICAgIiIiKQorICAgIGlmIHN5cy5ieXRlb3JkZXIgIT0gJ2JpZyc6CisgICAgICAgIGZyYW1lcyA9IGF1ZGlvdGVzdHMuYnl0ZXN3YXAyKGZyYW1lcykKKworCitjbGFzcyBBaWZjTWlzY1Rlc3QoYXVkaW90ZXN0cy5BdWRpb1Rlc3RzLCB1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3Rfc2tpcHVua25vd24oc2VsZik6CiAgICAgICAgICNJc3N1ZSAyMjQ1CiAgICAgICAgICNUaGlzIGZpbGUgY29udGFpbnMgY2h1bmsgdHlwZXMgYWlmYyBkb2Vzbid0IHJlY29nbml6ZS4KLSAgICAgICAgc2VsZi5mID0gYWlmYy5vcGVuKHNlbGYuc25kZmlsZXBhdGgpCisgICAgICAgIHNlbGYuZiA9IGFpZmMub3BlbihmaW5kZmlsZSgnU2luZS0xMDAwSHotMzAwbXMuYWlmJykpCiAKLSAgICBkZWYgdGVzdF9wYXJhbXMoc2VsZik6Ci0gICAgICAgIGYgPSBzZWxmLmYgPSBhaWZjLm9wZW4oc2VsZi5zbmRmaWxlcGF0aCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmdldG5jaGFubmVscygpLCAyKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZ2V0c2FtcHdpZHRoKCksIDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5nZXRmcmFtZXJhdGUoKSwgNDgwMDApCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5nZXRuZnJhbWVzKCksIDE0NDAwKQorICAgIGRlZiB0ZXN0X3dyaXRlX21hcmtlcnNfdmFsdWVzKHNlbGYpOgorICAgICAgICBmb3V0ID0gYWlmYy5vcGVuKGlvLkJ5dGVzSU8oKSwgJ3diJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3V0LmdldG1hcmtlcnMoKSwgTm9uZSkKKyAgICAgICAgZm91dC5zZXRtYXJrKDEsIDAsICdmb28xJykKKyAgICAgICAgZm91dC5zZXRtYXJrKDEsIDEsICdmb28yJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3V0LmdldG1hcmsoMSksICgxLCAxLCAnZm9vMicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvdXQuZ2V0bWFya2VycygpLCBbKDEsIDEsICdmb28yJyldKQorICAgICAgICBmb3V0LmluaXRmcChOb25lKQorCisgICAgZGVmIHRlc3RfcmVhZF9tYXJrZXJzKHNlbGYpOgorICAgICAgICBmb3V0ID0gc2VsZi5mb3V0ID0gYWlmYy5vcGVuKFRFU1RGTiwgJ3diJykKKyAgICAgICAgZm91dC5haWZmKCkKKyAgICAgICAgZm91dC5zZXRwYXJhbXMoKDEsIDEsIDEsIDEsICdOT05FJywgJycpKQorICAgICAgICBmb3V0LnNldG1hcmsoMSwgMCwgJ29kZCcpCisgICAgICAgIGZvdXQuc2V0bWFyaygyLCAwLCAnZXZlbicpCisgICAgICAgIGZvdXQud3JpdGVmcmFtZXMoJ1x4MDAnKQorICAgICAgICBmb3V0LmNsb3NlKCkKKyAgICAgICAgZiA9IHNlbGYuZiA9IGFpZmMub3BlbihURVNURk4sICdyYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5nZXRtYXJrZXJzKCksIFsoMSwgMCwgJ29kZCcpLCAoMiwgMCwgJ2V2ZW4nKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5nZXRtYXJrKDEpLCAoMSwgMCwgJ29kZCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZ2V0bWFyaygyKSwgKDIsIDAsICdldmVuJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGFpZmMuRXJyb3IsIGYuZ2V0bWFyaywgMykKKworCitjbGFzcyBBSUZDTG93TGV2ZWxUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3JlYWRfd3JpdHRlbihzZWxmKToKKyAgICAgICAgZGVmIHJlYWRfd3JpdHRlbihzZWxmLCB3aGF0KToKKyAgICAgICAgICAgIGYgPSBpby5CeXRlc0lPKCkKKyAgICAgICAgICAgIGdldGF0dHIoYWlmYywgJ193cml0ZV8nICsgd2hhdCkoZiwgeCkKKyAgICAgICAgICAgIGYuc2VlaygwKQorICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoYWlmYywgJ19yZWFkXycgKyB3aGF0KShmKQorICAgICAgICBmb3IgeCBpbiAoLTEsIDAsIDAuMSwgMSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRfd3JpdHRlbih4LCAnZmxvYXQnKSwgeCkKKyAgICAgICAgZm9yIHggaW4gKGZsb2F0KCdOYU4nKSwgZmxvYXQoJ0luZicpKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZF93cml0dGVuKHgsICdmbG9hdCcpLCBhaWZjLl9IVUdFX1ZBTCkKKyAgICAgICAgZm9yIHggaW4gKCcnLCAnZm9vJywgJ2EnICogMjU1KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZF93cml0dGVuKHgsICdzdHJpbmcnKSwgeCkKKyAgICAgICAgZm9yIHggaW4gKC0weDdGRkZGRkZGLCAtMSwgMCwgMSwgMHg3RkZGRkZGRik6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRfd3JpdHRlbih4LCAnbG9uZycpLCB4KQorICAgICAgICBmb3IgeCBpbiAoMCwgMSwgMHhGRkZGRkZGRik6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRfd3JpdHRlbih4LCAndWxvbmcnKSwgeCkKKyAgICAgICAgZm9yIHggaW4gKC0weDdGRkYsIC0xLCAwLCAxLCAweDdGRkYpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkX3dyaXR0ZW4oeCwgJ3Nob3J0JyksIHgpCisgICAgICAgIGZvciB4IGluICgwLCAxLCAweEZGRkYpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkX3dyaXR0ZW4oeCwgJ3VzaG9ydCcpLCB4KQorCisgICAgZGVmIHRlc3RfcmVhZF9yYWlzZXMoc2VsZik6CisgICAgICAgIGYgPSBpby5CeXRlc0lPKCdceDAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRU9GRXJyb3IsIGFpZmMuX3JlYWRfdWxvbmcsIGYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEVPRkVycm9yLCBhaWZjLl9yZWFkX2xvbmcsIGYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEVPRkVycm9yLCBhaWZjLl9yZWFkX3VzaG9ydCwgZikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRU9GRXJyb3IsIGFpZmMuX3JlYWRfc2hvcnQsIGYpCisKKyAgICBkZWYgdGVzdF93cml0ZV9sb25nX3N0cmluZ19yYWlzZXMoc2VsZik6CisgICAgICAgIGYgPSBpby5CeXRlc0lPKCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIGFpZmMuX3dyaXRlX3N0cmluZyhmLCAndG9vIGxvbmcnICogMjU1KQorCisgICAgZGVmIHRlc3Rfd3Jvbmdfb3Blbl9tb2RlKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKGFpZmMuRXJyb3IpOgorICAgICAgICAgICAgYWlmYy5vcGVuKFRFU1RGTiwgJ3dyb25nX21vZGUnKQorCisgICAgZGVmIHRlc3RfcmVhZF93cm9uZ19mb3JtKHNlbGYpOgorICAgICAgICBiMSA9IGlvLkJ5dGVzSU8oJ1dSTkcnICsgc3RydWN0LnBhY2soJz5MJywgMCkpCisgICAgICAgIGIyID0gaW8uQnl0ZXNJTygnRk9STScgKyBzdHJ1Y3QucGFjaygnPkwnLCA0KSArICdXUk5HJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYWlmYy5FcnJvciwgYWlmYy5vcGVuLCBiMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYWlmYy5FcnJvciwgYWlmYy5vcGVuLCBiMikKKworICAgIGRlZiB0ZXN0X3JlYWRfbm9fY29tbV9jaHVuayhzZWxmKToKKyAgICAgICAgYiA9IGlvLkJ5dGVzSU8oJ0ZPUk0nICsgc3RydWN0LnBhY2soJz5MJywgNCkgKyAnQUlGRicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGFpZmMuRXJyb3IsIGFpZmMub3BlbiwgYikKKworICAgIGRlZiB0ZXN0X3JlYWRfd3JvbmdfY29tcHJlc3Npb25fdHlwZShzZWxmKToKKyAgICAgICAgYiA9ICdGT1JNJyArIHN0cnVjdC5wYWNrKCc+TCcsIDQpICsgJ0FJRkMnCisgICAgICAgIGIgKz0gJ0NPTU0nICsgc3RydWN0LnBhY2soJz5MaGxoaExMJywgMjMsIDAsIDAsIDAsIDAsIDAsIDApCisgICAgICAgIGIgKz0gJ1dSTkcnICsgc3RydWN0LnBhY2soJ0InLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhaWZjLkVycm9yLCBhaWZjLm9wZW4sIGlvLkJ5dGVzSU8oYikpCisKKyAgICBkZWYgdGVzdF9yZWFkX3dyb25nX21hcmtzKHNlbGYpOgorICAgICAgICBiID0gJ0ZPUk0nICsgc3RydWN0LnBhY2soJz5MJywgNCkgKyAnQUlGRicKKyAgICAgICAgYiArPSAnQ09NTScgKyBzdHJ1Y3QucGFjaygnPkxobGhoTEwnLCAxOCwgMCwgMCwgMCwgMCwgMCwgMCkKKyAgICAgICAgYiArPSAnU1NORCcgKyBzdHJ1Y3QucGFjaygnPkwnLCA4KSArICdceDAwJyAqIDgKKyAgICAgICAgYiArPSAnTUFSSycgKyBzdHJ1Y3QucGFjaygnPkxoQicsIDMsIDEsIDEpCisgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgczoKKyAgICAgICAgICAgIGYgPSBhaWZjLm9wZW4oaW8uQnl0ZXNJTyhiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksICdXYXJuaW5nOiBNQVJLIGNodW5rIGNvbnRhaW5zICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvbmx5IDAgbWFya2VycyBpbnN0ZWFkIG9mIDFcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5nZXRtYXJrZXJzKCksIE5vbmUpCisKKyAgICBkZWYgdGVzdF9yZWFkX2NvbW1fa2x1ZGdlX2NvbXBuYW1lX2V2ZW4oc2VsZik6CisgICAgICAgIGIgPSAnRk9STScgKyBzdHJ1Y3QucGFjaygnPkwnLCA0KSArICdBSUZDJworICAgICAgICBiICs9ICdDT01NJyArIHN0cnVjdC5wYWNrKCc+TGhsaGhMTCcsIDE4LCAwLCAwLCAwLCAwLCAwLCAwKQorICAgICAgICBiICs9ICdOT05FJyArIHN0cnVjdC5wYWNrKCdCJywgNCkgKyAnZXZlbicgKyAnXHgwMCcKKyAgICAgICAgYiArPSAnU1NORCcgKyBzdHJ1Y3QucGFjaygnPkwnLCA4KSArICdceDAwJyAqIDgKKyAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBzOgorICAgICAgICAgICAgZiA9IGFpZmMub3Blbihpby5CeXRlc0lPKGIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwgJ1dhcm5pbmc6IGJhZCBDT01NIGNodW5rIHNpemVcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5nZXRjb21wbmFtZSgpLCAnZXZlbicpCisKKyAgICBkZWYgdGVzdF9yZWFkX2NvbW1fa2x1ZGdlX2NvbXBuYW1lX29kZChzZWxmKToKKyAgICAgICAgYiA9ICdGT1JNJyArIHN0cnVjdC5wYWNrKCc+TCcsIDQpICsgJ0FJRkMnCisgICAgICAgIGIgKz0gJ0NPTU0nICsgc3RydWN0LnBhY2soJz5MaGxoaExMJywgMTgsIDAsIDAsIDAsIDAsIDAsIDApCisgICAgICAgIGIgKz0gJ05PTkUnICsgc3RydWN0LnBhY2soJ0InLCAzKSArICdvZGQnCisgICAgICAgIGIgKz0gJ1NTTkQnICsgc3RydWN0LnBhY2soJz5MJywgOCkgKyAnXHgwMCcgKiA4CisgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgczoKKyAgICAgICAgICAgIGYgPSBhaWZjLm9wZW4oaW8uQnl0ZXNJTyhiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksICdXYXJuaW5nOiBiYWQgQ09NTSBjaHVuayBzaXplXG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZ2V0Y29tcG5hbWUoKSwgJ29kZCcpCisKKyAgICBkZWYgdGVzdF93cml0ZV9wYXJhbXNfcmFpc2VzKHNlbGYpOgorICAgICAgICBmb3V0ID0gYWlmYy5vcGVuKGlvLkJ5dGVzSU8oKSwgJ3diJykKKyAgICAgICAgd3JvbmdfcGFyYW1zID0gKDAsIDAsIDAsIDAsICdXUk5HJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGFpZmMuRXJyb3IsIGZvdXQuc2V0cGFyYW1zLCB3cm9uZ19wYXJhbXMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGFpZmMuRXJyb3IsIGZvdXQuZ2V0cGFyYW1zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhaWZjLkVycm9yLCBmb3V0LnNldG5jaGFubmVscywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYWlmYy5FcnJvciwgZm91dC5nZXRuY2hhbm5lbHMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGFpZmMuRXJyb3IsIGZvdXQuc2V0c2FtcHdpZHRoLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhaWZjLkVycm9yLCBmb3V0LmdldHNhbXB3aWR0aCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYWlmYy5FcnJvciwgZm91dC5zZXRmcmFtZXJhdGUsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGFpZmMuRXJyb3IsIGZvdXQuZ2V0ZnJhbWVyYXRlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhaWZjLkVycm9yLCBmb3V0LnNldGNvbXB0eXBlLCAnV1JORycsICcnKQorICAgICAgICBmb3V0LmFpZmYoKQorICAgICAgICBmb3V0LnNldG5jaGFubmVscygxKQorICAgICAgICBmb3V0LnNldHNhbXB3aWR0aCgxKQorICAgICAgICBmb3V0LnNldGZyYW1lcmF0ZSgxKQorICAgICAgICBmb3V0LnNldG5mcmFtZXMoMSkKKyAgICAgICAgZm91dC53cml0ZWZyYW1lcygnXHgwMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGFpZmMuRXJyb3IsIGZvdXQuc2V0cGFyYW1zLCAoMSwgMSwgMSwgMSwgMSwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGFpZmMuRXJyb3IsIGZvdXQuc2V0bmNoYW5uZWxzLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhaWZjLkVycm9yLCBmb3V0LnNldHNhbXB3aWR0aCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYWlmYy5FcnJvciwgZm91dC5zZXRmcmFtZXJhdGUsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGFpZmMuRXJyb3IsIGZvdXQuc2V0bmZyYW1lcywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYWlmYy5FcnJvciwgZm91dC5zZXRjb21wdHlwZSwgJ05PTkUnLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYWlmYy5FcnJvciwgZm91dC5haWZmKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhaWZjLkVycm9yLCBmb3V0LmFpZmMpCisKKyAgICBkZWYgdGVzdF93cml0ZV9wYXJhbXNfc2luZ2xlcyhzZWxmKToKKyAgICAgICAgZm91dCA9IGFpZmMub3Blbihpby5CeXRlc0lPKCksICd3YicpCisgICAgICAgIGZvdXQuYWlmYygpCisgICAgICAgIGZvdXQuc2V0bmNoYW5uZWxzKDEpCisgICAgICAgIGZvdXQuc2V0c2FtcHdpZHRoKDIpCisgICAgICAgIGZvdXQuc2V0ZnJhbWVyYXRlKDMpCisgICAgICAgIGZvdXQuc2V0bmZyYW1lcyg0KQorICAgICAgICBmb3V0LnNldGNvbXB0eXBlKCdOT05FJywgJ25hbWUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvdXQuZ2V0bmNoYW5uZWxzKCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm91dC5nZXRzYW1wd2lkdGgoKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3V0LmdldGZyYW1lcmF0ZSgpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvdXQuZ2V0bmZyYW1lcygpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvdXQudGVsbCgpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvdXQuZ2V0Y29tcHR5cGUoKSwgJ05PTkUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvdXQuZ2V0Y29tcG5hbWUoKSwgJ25hbWUnKQorICAgICAgICBmb3V0LndyaXRlZnJhbWVzKCdceDAwJyAqIDQgKiBmb3V0LmdldHNhbXB3aWR0aCgpICogZm91dC5nZXRuY2hhbm5lbHMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3V0LmdldG5mcmFtZXMoKSwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3V0LnRlbGwoKSwgNCkKKworICAgIGRlZiB0ZXN0X3dyaXRlX3BhcmFtc19idW5jaChzZWxmKToKKyAgICAgICAgZm91dCA9IGFpZmMub3Blbihpby5CeXRlc0lPKCksICd3YicpCisgICAgICAgIGZvdXQuYWlmYygpCisgICAgICAgIHAgPSAoMSwgMiwgMywgNCwgJ05PTkUnLCAnbmFtZScpCisgICAgICAgIGZvdXQuc2V0cGFyYW1zKHApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm91dC5nZXRwYXJhbXMoKSwgcCkKKyAgICAgICAgZm91dC5pbml0ZnAoTm9uZSkKKworICAgIGRlZiB0ZXN0X3dyaXRlX2hlYWRlcl9yYWlzZXMoc2VsZik6CisgICAgICAgIGZvdXQgPSBhaWZjLm9wZW4oaW8uQnl0ZXNJTygpLCAnd2InKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhaWZjLkVycm9yLCBmb3V0LmNsb3NlKQorICAgICAgICBmb3V0ID0gYWlmYy5vcGVuKGlvLkJ5dGVzSU8oKSwgJ3diJykKKyAgICAgICAgZm91dC5zZXRuY2hhbm5lbHMoMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYWlmYy5FcnJvciwgZm91dC5jbG9zZSkKKyAgICAgICAgZm91dCA9IGFpZmMub3Blbihpby5CeXRlc0lPKCksICd3YicpCisgICAgICAgIGZvdXQuc2V0bmNoYW5uZWxzKDEpCisgICAgICAgIGZvdXQuc2V0c2FtcHdpZHRoKDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGFpZmMuRXJyb3IsIGZvdXQuY2xvc2UpCisKKyAgICBkZWYgdGVzdF93cml0ZV9oZWFkZXJfY29tcHR5cGVfcmFpc2VzKHNlbGYpOgorICAgICAgICBmb3IgY29tcHR5cGUgaW4gKCdVTEFXJywgJ3VsYXcnLCAnQUxBVycsICdhbGF3JywgJ0c3MjInKToKKyAgICAgICAgICAgIGZvdXQgPSBhaWZjLm9wZW4oaW8uQnl0ZXNJTygpLCAnd2InKQorICAgICAgICAgICAgZm91dC5zZXRzYW1wd2lkdGgoMSkKKyAgICAgICAgICAgIGZvdXQuc2V0Y29tcHR5cGUoY29tcHR5cGUsICcnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYWlmYy5FcnJvciwgZm91dC5jbG9zZSkKKyAgICAgICAgICAgIGZvdXQuaW5pdGZwKE5vbmUpCisKKyAgICBkZWYgdGVzdF93cml0ZV9tYXJrZXJzX3JhaXNlcyhzZWxmKToKKyAgICAgICAgZm91dCA9IGFpZmMub3Blbihpby5CeXRlc0lPKCksICd3YicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGFpZmMuRXJyb3IsIGZvdXQuc2V0bWFyaywgMCwgMCwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGFpZmMuRXJyb3IsIGZvdXQuc2V0bWFyaywgMSwgLTEsICcnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhaWZjLkVycm9yLCBmb3V0LnNldG1hcmssIDEsIDAsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGFpZmMuRXJyb3IsIGZvdXQuZ2V0bWFyaywgMSkKKyAgICAgICAgZm91dC5pbml0ZnAoTm9uZSkKKworICAgIGRlZiB0ZXN0X3dyaXRlX2FpZmZfYnlfZXh0ZW5zaW9uKHNlbGYpOgorICAgICAgICBzYW1wd2lkdGggPSAyCisgICAgICAgIGZvdXQgPSBzZWxmLmZvdXQgPSBhaWZjLm9wZW4oVEVTVEZOICsgJy5haWZmJywgJ3diJykKKyAgICAgICAgZm91dC5zZXRwYXJhbXMoKDEsIHNhbXB3aWR0aCwgMSwgMSwgJ1VMQVcnLCAnJykpCisgICAgICAgIGZyYW1lcyA9ICdceDAwJyAqIGZvdXQuZ2V0bmNoYW5uZWxzKCkgKiBzYW1wd2lkdGgKKyAgICAgICAgZm91dC53cml0ZWZyYW1lcyhmcmFtZXMpCisgICAgICAgIGZvdXQuY2xvc2UoKQorICAgICAgICBmID0gc2VsZi5mID0gYWlmYy5vcGVuKFRFU1RGTiArICcuYWlmZicsICdyYicpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5nZXRjb21wdHlwZSgpLCAnTk9ORScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5nZXRjb21wbmFtZSgpLCAnbm90IGNvbXByZXNzZWQnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZ2V0cGFyYW1zKCksICgyLCAyLCA0ODAwMCwgMTQ0MDAsICdOT05FJywgJ25vdCBjb21wcmVzc2VkJykpCi0KLSAgICBkZWYgdGVzdF9yZWFkKHNlbGYpOgotICAgICAgICBmID0gc2VsZi5mID0gYWlmYy5vcGVuKHNlbGYuc25kZmlsZXBhdGgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIDApCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkZnJhbWVzKDIpLCAnXHgwMFx4MDBceDAwXHgwMFx4MGJceGQ0XHgwYlx4ZDQnKQotICAgICAgICBmLnJld2luZCgpCi0gICAgICAgIHBvczAgPSBmLnRlbGwoKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvczAsIDApCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkZnJhbWVzKDIpLCAnXHgwMFx4MDBceDAwXHgwMFx4MGJceGQ0XHgwYlx4ZDQnKQotICAgICAgICBwb3MyID0gZi50ZWxsKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3MyLCAyKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGZyYW1lcygyKSwgJ1x4MTd0XHgxN3QiXHhhZCJceGFkJykKLSAgICAgICAgZi5zZXRwb3MocG9zMikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRmcmFtZXMoMiksICdceDE3dFx4MTd0Ilx4YWQiXHhhZCcpCi0gICAgICAgIGYuc2V0cG9zKHBvczApCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkZnJhbWVzKDIpLCAnXHgwMFx4MDBceDAwXHgwMFx4MGJceGQ0XHgwYlx4ZDQnKQotCi0gICAgZGVmIHRlc3Rfd3JpdGUoc2VsZik6Ci0gICAgICAgIGYgPSBzZWxmLmYgPSBhaWZjLm9wZW4oc2VsZi5zbmRmaWxlcGF0aCkKLSAgICAgICAgZm91dCA9IHNlbGYuZm91dCA9IGFpZmMub3BlbihURVNURk4sICd3YicpCi0gICAgICAgIGZvdXQuYWlmYygpCi0gICAgICAgIGZvdXQuc2V0cGFyYW1zKGYuZ2V0cGFyYW1zKCkpCi0gICAgICAgIGZvciBmcmFtZSBpbiByYW5nZShmLmdldG5mcmFtZXMoKSk6Ci0gICAgICAgICAgICBmb3V0LndyaXRlZnJhbWVzKGYucmVhZGZyYW1lcygxKSkKLSAgICAgICAgZm91dC5jbG9zZSgpCi0gICAgICAgIGZvdXQgPSBzZWxmLmZvdXQgPSBhaWZjLm9wZW4oVEVTVEZOLCAncmInKQotICAgICAgICBmLnJld2luZCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5nZXRwYXJhbXMoKSwgZm91dC5nZXRwYXJhbXMoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRmcmFtZXMoNSksIGZvdXQucmVhZGZyYW1lcyg1KSkKLQotICAgIGRlZiB0ZXN0X2NvbXByZXNzKHNlbGYpOgotICAgICAgICBmID0gc2VsZi5mID0gYWlmYy5vcGVuKHNlbGYuc25kZmlsZXBhdGgpCi0gICAgICAgIGZvdXQgPSBzZWxmLmZvdXQgPSBhaWZjLm9wZW4oVEVTVEZOLCAnd2InKQotICAgICAgICBmb3V0LmFpZmMoKQotICAgICAgICBmb3V0LnNldG5jaGFubmVscyhmLmdldG5jaGFubmVscygpKQotICAgICAgICBmb3V0LnNldHNhbXB3aWR0aChmLmdldHNhbXB3aWR0aCgpKQotICAgICAgICBmb3V0LnNldGZyYW1lcmF0ZShmLmdldGZyYW1lcmF0ZSgpKQotICAgICAgICBmb3V0LnNldGNvbXB0eXBlKCdVTEFXJywgJ2ZvbycpCi0gICAgICAgIGZvciBmcmFtZSBpbiByYW5nZShmLmdldG5mcmFtZXMoKSk6Ci0gICAgICAgICAgICBmb3V0LndyaXRlZnJhbWVzKGYucmVhZGZyYW1lcygxKSkKLSAgICAgICAgZm91dC5jbG9zZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0TGVzcygKLSAgICAgICAgICAgIG9zLnN0YXQoVEVTVEZOKS5zdF9zaXplLAotICAgICAgICAgICAgb3Muc3RhdChzZWxmLnNuZGZpbGVwYXRoKS5zdF9zaXplKjAuNzUsCi0gICAgICAgICAgICApCi0gICAgICAgIGZvdXQgPSBzZWxmLmZvdXQgPSBhaWZjLm9wZW4oVEVTVEZOLCAncmInKQotICAgICAgICBmLnJld2luZCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5nZXRwYXJhbXMoKVswOjNdLCBmb3V0LmdldHBhcmFtcygpWzA6M10pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm91dC5nZXRjb21wdHlwZSgpLCAnVUxBVycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm91dC5nZXRjb21wbmFtZSgpLCAnZm9vJykKLSAgICAgICAgIyBYWFg6IHRoaXMgdGVzdCBmYWlscywgbm90IHN1cmUgaWYgaXQgc2hvdWxkIHN1Y2NlZWQgb3Igbm90Ci0gICAgICAgICMgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRmcmFtZXMoNSksIGZvdXQucmVhZGZyYW1lcyg1KSkKLQotICAgIGRlZiB0ZXN0X2Nsb3NlKHNlbGYpOgotICAgICAgICBjbGFzcyBXcmFwZmlsZShvYmplY3QpOgotICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGUpOgotICAgICAgICAgICAgICAgIHNlbGYuZmlsZSA9IG9wZW4oZmlsZSwgJ3JiJykKLSAgICAgICAgICAgICAgICBzZWxmLmNsb3NlZCA9IEZhbHNlCi0gICAgICAgICAgICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgICAgICAgICAgICAgc2VsZi5maWxlLmNsb3NlKCkKLSAgICAgICAgICAgICAgICBzZWxmLmNsb3NlZCA9IFRydWUKLSAgICAgICAgICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKTogcmV0dXJuIGdldGF0dHIoc2VsZi5maWxlLCBhdHRyKQotICAgICAgICB0ZXN0ZmlsZSA9IFdyYXBmaWxlKHNlbGYuc25kZmlsZXBhdGgpCi0gICAgICAgIGYgPSBzZWxmLmYgPSBhaWZjLm9wZW4odGVzdGZpbGUpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdGZpbGUuY2xvc2VkLCBGYWxzZSkKICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdGZpbGUuY2xvc2VkLCBUcnVlKQogCiAKIGRlZiB0ZXN0X21haW4oKToKLSAgICBydW5fdW5pdHRlc3QoQUlGQ1Rlc3QpCi0KKyAgICBydW5fdW5pdHRlc3QoQWlmY1BDTThUZXN0LCBBaWZjUENNMTZUZXN0LCBBaWZjUENNMTZUZXN0LCBBaWZjUENNMjRUZXN0LAorICAgICAgICAgICAgICAgICBBaWZjUENNMzJUZXN0LCBBaWZjVUxBV1Rlc3QsCisgICAgICAgICAgICAgICAgIEFpZmNNaXNjVGVzdCwgQUlGQ0xvd0xldmVsVGVzdCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICB1bml0dGVzdC5tYWluKCkKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hbC5weSBiL0xpYi90ZXN0L3Rlc3RfYWwucHkKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA2ODg1NzZkLi5hMDBhYmZjCi0tLSBhL0xpYi90ZXN0L3Rlc3RfYWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hbC5weQpAQCAtMSw0ICsxLDMgQEAKLSMhIC91c3IvYmluL2VudiBweXRob24KICIiIldoaW1weSB0ZXN0IHNjcmlwdCBmb3IgdGhlIGFsIG1vZHVsZQogICAgUm9nZXIgRS4gTWFzc2UKICIiIgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hbnlkYm0ucHkgYi9MaWIvdGVzdC90ZXN0X2FueWRibS5weQppbmRleCBhMDFkZDBiLi4yNDEyMDYxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2FueWRibS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2FueWRibS5weQpAQCAtMSw0ICsxLDMgQEAKLSMhIC91c3IvYmluL2VudiBweXRob24KICIiIlRlc3Qgc2NyaXB0IGZvciB0aGUgYW55ZGJtIG1vZHVsZQogICAgYmFzZWQgb24gdGVzdGR1bWJkYm0ucHkKICIiIgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hcmdwYXJzZS5weSBiL0xpYi90ZXN0L3Rlc3RfYXJncGFyc2UucHkKaW5kZXggMjhkMWVmMy4uMGRmNjZhZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9hcmdwYXJzZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2FyZ3BhcnNlLnB5CkBAIC00Nyw2ICs0Nyw5IEBACiAKICAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIG9zLmNoZGlyKHNlbGYub2xkX2RpcikKKyAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoc2VsZi50ZW1wX2RpciwgdG9wZG93bj1GYWxzZSk6CisgICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKKyAgICAgICAgICAgICAgICBvcy5jaG1vZChvcy5wYXRoLmpvaW4oc2VsZi50ZW1wX2RpciwgbmFtZSksIHN0YXQuU19JV1JJVEUpCiAgICAgICAgIHNodXRpbC5ybXRyZWUoc2VsZi50ZW1wX2RpciwgVHJ1ZSkKIAogICAgIGRlZiBjcmVhdGVfcmVhZG9ubHlfZmlsZShzZWxmLCBmaWxlbmFtZSk6CkBAIC0xMzc0LDYgKzEzNzcsNyBAQAogICAgICAgICAoJ1ggQGhlbGxvJywgTlMoYT1Ob25lLCB4PSdYJywgeT1bJ2hlbGxvIHdvcmxkISddKSksCiAgICAgICAgICgnLWEgQiBAcmVjdXJzaXZlIFkgWicsIE5TKGE9J0EnLCB4PSdoZWxsbyB3b3JsZCEnLCB5PVsnWScsICdaJ10pKSwKICAgICAgICAgKCdYIEByZWN1cnNpdmUgWiAtYSBCJywgTlMoYT0nQicsIHg9J1gnLCB5PVsnaGVsbG8gd29ybGQhJywgJ1onXSkpLAorICAgICAgICAoWyItYSIsICIiLCAiWCIsICJZIl0sIE5TKGE9JycsIHg9J1gnLCB5PVsnWSddKSksCiAgICAgXQogCiAKQEAgLTE0NjYsNiArMTQ3MCwyMiBAQAogICAgICAgICAoJ3JlYWRvbmx5JywgTlMoeD1Ob25lLCBzcGFtPVJGaWxlKCdyZWFkb25seScpKSksCiAgICAgXQogCitjbGFzcyBUZXN0RmlsZVR5cGVEZWZhdWx0cyhUZW1wRGlyTWl4aW4sIFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoYXQgYSBmaWxlIGlzIG5vdCBjcmVhdGVkIHVubGVzcyB0aGUgZGVmYXVsdCBpcyBuZWVkZWQiIiIKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKFRlc3RGaWxlVHlwZURlZmF1bHRzLCBzZWxmKS5zZXRVcCgpCisgICAgICAgIGZpbGUgPSBvcGVuKG9zLnBhdGguam9pbihzZWxmLnRlbXBfZGlyLCAnZ29vZCcpLCAndycpCisgICAgICAgIGZpbGUud3JpdGUoJ2dvb2QnKQorICAgICAgICBmaWxlLmNsb3NlKCkKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLWMnLCB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyJyksIGRlZmF1bHQ9J25vLWZpbGUudHh0JyksCisgICAgXQorICAgICMgc2hvdWxkIHByb3Zva2Ugbm8gc3VjaCBmaWxlIGVycm9yCisgICAgZmFpbHVyZXMgPSBbJyddCisgICAgIyBzaG91bGQgbm90IHByb3Zva2UgZXJyb3IgYmVjYXVzZSBkZWZhdWx0IGZpbGUgaXMgY3JlYXRlZAorICAgIHN1Y2Nlc3NlcyA9IFsoJy1jIGdvb2QnLCBOUyhjPVJGaWxlKCdnb29kJykpKV0KKwogCiBjbGFzcyBUZXN0RmlsZVR5cGVSQihUZW1wRGlyTWl4aW4sIFBhcnNlclRlc3RDYXNlKToKICAgICAiIiJUZXN0IHRoZSBGaWxlVHlwZSBvcHRpb24vYXJndW1lbnQgdHlwZSBmb3IgcmVhZGluZyBmaWxlcyIiIgpAQCAtMTc2Myw2ICsxNzgzLDE0IEBACiAgICAgICAgIHBhcnNlcjIuYWRkX2FyZ3VtZW50KCcteScsIGNob2ljZXM9JzEyMycsIGhlbHA9J3kgaGVscCcpCiAgICAgICAgIHBhcnNlcjIuYWRkX2FyZ3VtZW50KCd6JywgdHlwZT1jb21wbGV4LCBuYXJncz0nKicsIGhlbHA9J3ogaGVscCcpCiAKKyAgICAgICAgIyBhZGQgdGhpcmQgc3ViLXBhcnNlcgorICAgICAgICBwYXJzZXIzX2t3YXJncyA9IGRpY3QoZGVzY3JpcHRpb249JzMgZGVzY3JpcHRpb24nKQorICAgICAgICBpZiBzdWJwYXJzZXJfaGVscDoKKyAgICAgICAgICAgIHBhcnNlcjNfa3dhcmdzWydoZWxwJ10gPSAnMyBoZWxwJworICAgICAgICBwYXJzZXIzID0gc3VicGFyc2Vycy5hZGRfcGFyc2VyKCczJywgKipwYXJzZXIzX2t3YXJncykKKyAgICAgICAgcGFyc2VyMy5hZGRfYXJndW1lbnQoJ3QnLCB0eXBlPWludCwgaGVscD0ndCBoZWxwJykKKyAgICAgICAgcGFyc2VyMy5hZGRfYXJndW1lbnQoJ3UnLCBuYXJncz0nLi4uJywgaGVscD0ndSBoZWxwJykKKwogICAgICAgICAjIHJldHVybiB0aGUgbWFpbiBwYXJzZXIKICAgICAgICAgcmV0dXJuIHBhcnNlcgogCkBAIC0xNzkyLDYgKzE4MjAsMTAgQEAKICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlX2FyZ3MoJy0tZm9vIDAuMTI1IDEgYycuc3BsaXQoKSksCiAgICAgICAgICAgICBOUyhmb289VHJ1ZSwgYmFyPTAuMTI1LCB3PU5vbmUsIHg9J2MnKSwKICAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VfYXJncygnLTEuNSAzIDExIC0tIGEgLS1mb28gNyAtLSBiJy5zcGxpdCgpKSwKKyAgICAgICAgICAgIE5TKGZvbz1GYWxzZSwgYmFyPS0xLjUsIHQ9MTEsIHU9WydhJywgJy0tZm9vJywgJzcnLCAnLS0nLCAnYiddKSwKKyAgICAgICAgKQogCiAgICAgZGVmIHRlc3RfcGFyc2Vfa25vd25fYXJncyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKQEAgLTE4MjYsMTUgKzE4NTgsMTUgQEAKIAogICAgIGRlZiB0ZXN0X2hlbHAoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZXIuZm9ybWF0X3VzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgJ3VzYWdlOiBQUk9HIFstaF0gWy0tZm9vXSBiYXIgezEsMn0gLi4uXG4nKQorICAgICAgICAgICAgICAgICAgICAgICAgICd1c2FnZTogUFJPRyBbLWhdIFstLWZvb10gYmFyIHsxLDIsM30gLi4uXG4nKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2VyLmZvcm1hdF9oZWxwKCksIHRleHR3cmFwLmRlZGVudCgnJydcCi0gICAgICAgICAgICB1c2FnZTogUFJPRyBbLWhdIFstLWZvb10gYmFyIHsxLDJ9IC4uLgorICAgICAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbLS1mb29dIGJhciB7MSwyLDN9IC4uLgogCiAgICAgICAgICAgICBtYWluIGRlc2NyaXB0aW9uCiAKICAgICAgICAgICAgIHBvc2l0aW9uYWwgYXJndW1lbnRzOgogICAgICAgICAgICAgICBiYXIgICAgICAgICBiYXIgaGVscAotICAgICAgICAgICAgICB7MSwyfSAgICAgICBjb21tYW5kIGhlbHAKKyAgICAgICAgICAgICAgezEsMiwzfSAgICAgY29tbWFuZCBoZWxwCiAKICAgICAgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKICAgICAgICAgICAgICAgLWgsIC0taGVscCAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdApAQCAtMTg0NSwxNSArMTg3NywxNSBAQAogICAgICAgICAjIE1ha2Ugc3VyZSAtIGlzIHN0aWxsIHVzZWQgZm9yIGhlbHAgaWYgaXQgaXMgYSBub24tZmlyc3QgcHJlZml4IGNoYXIKICAgICAgICAgcGFyc2VyID0gc2VsZi5fZ2V0X3BhcnNlcihwcmVmaXhfY2hhcnM9Jys6LScpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLmZvcm1hdF91c2FnZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICd1c2FnZTogUFJPRyBbLWhdIFsrK2Zvb10gYmFyIHsxLDJ9IC4uLlxuJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAndXNhZ2U6IFBST0cgWy1oXSBbKytmb29dIGJhciB7MSwyLDN9IC4uLlxuJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIuZm9ybWF0X2hlbHAoKSwgdGV4dHdyYXAuZGVkZW50KCcnJ1wKLSAgICAgICAgICAgIHVzYWdlOiBQUk9HIFstaF0gWysrZm9vXSBiYXIgezEsMn0gLi4uCisgICAgICAgICAgICB1c2FnZTogUFJPRyBbLWhdIFsrK2Zvb10gYmFyIHsxLDIsM30gLi4uCiAKICAgICAgICAgICAgIG1haW4gZGVzY3JpcHRpb24KIAogICAgICAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CiAgICAgICAgICAgICAgIGJhciAgICAgICAgIGJhciBoZWxwCi0gICAgICAgICAgICAgIHsxLDJ9ICAgICAgIGNvbW1hbmQgaGVscAorICAgICAgICAgICAgICB7MSwyLDN9ICAgICBjb21tYW5kIGhlbHAKIAogICAgICAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgogICAgICAgICAgICAgICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CkBAIC0xODY0LDE1ICsxODk2LDE1IEBACiAgICAgZGVmIHRlc3RfaGVscF9hbHRlcm5hdGVfcHJlZml4X2NoYXJzKHNlbGYpOgogICAgICAgICBwYXJzZXIgPSBzZWxmLl9nZXRfcGFyc2VyKHByZWZpeF9jaGFycz0nKzovJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIuZm9ybWF0X3VzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgJ3VzYWdlOiBQUk9HIFsraF0gWysrZm9vXSBiYXIgezEsMn0gLi4uXG4nKQorICAgICAgICAgICAgICAgICAgICAgICAgICd1c2FnZTogUFJPRyBbK2hdIFsrK2Zvb10gYmFyIHsxLDIsM30gLi4uXG4nKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5mb3JtYXRfaGVscCgpLCB0ZXh0d3JhcC5kZWRlbnQoJycnXAotICAgICAgICAgICAgdXNhZ2U6IFBST0cgWytoXSBbKytmb29dIGJhciB7MSwyfSAuLi4KKyAgICAgICAgICAgIHVzYWdlOiBQUk9HIFsraF0gWysrZm9vXSBiYXIgezEsMiwzfSAuLi4KIAogICAgICAgICAgICAgbWFpbiBkZXNjcmlwdGlvbgogCiAgICAgICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKICAgICAgICAgICAgICAgYmFyICAgICAgICAgYmFyIGhlbHAKLSAgICAgICAgICAgICAgezEsMn0gICAgICAgY29tbWFuZCBoZWxwCisgICAgICAgICAgICAgIHsxLDIsM30gICAgIGNvbW1hbmQgaGVscAogCiAgICAgICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CiAgICAgICAgICAgICAgICtoLCArK2hlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKQEAgLTE4ODEsMTggKzE5MTMsMTkgQEAKIAogICAgIGRlZiB0ZXN0X3BhcnNlcl9jb21tYW5kX2hlbHAoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb21tYW5kX2hlbHBfcGFyc2VyLmZvcm1hdF91c2FnZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICd1c2FnZTogUFJPRyBbLWhdIFstLWZvb10gYmFyIHsxLDJ9IC4uLlxuJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAndXNhZ2U6IFBST0cgWy1oXSBbLS1mb29dIGJhciB7MSwyLDN9IC4uLlxuJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbW1hbmRfaGVscF9wYXJzZXIuZm9ybWF0X2hlbHAoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0d3JhcC5kZWRlbnQoJycnXAotICAgICAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbLS1mb29dIGJhciB7MSwyfSAuLi4KKyAgICAgICAgICAgIHVzYWdlOiBQUk9HIFstaF0gWy0tZm9vXSBiYXIgezEsMiwzfSAuLi4KIAogICAgICAgICAgICAgbWFpbiBkZXNjcmlwdGlvbgogCiAgICAgICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKICAgICAgICAgICAgICAgYmFyICAgICAgICAgYmFyIGhlbHAKLSAgICAgICAgICAgICAgezEsMn0gICAgICAgY29tbWFuZCBoZWxwCisgICAgICAgICAgICAgIHsxLDIsM30gICAgIGNvbW1hbmQgaGVscAogICAgICAgICAgICAgICAgIDEgICAgICAgICAxIGhlbHAKICAgICAgICAgICAgICAgICAyICAgICAgICAgMiBoZWxwCisgICAgICAgICAgICAgICAgMyAgICAgICAgIDMgaGVscAogCiAgICAgICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CiAgICAgICAgICAgICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKQEAgLTIxMzUsOCArMjE2OCw5IEBACiAgICAgICAgIHBhcmVudHMgPSBbc2VsZi5hYmNkX3BhcmVudCwgc2VsZi53eHl6X3BhcmVudF0KICAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIocGFyZW50cz1wYXJlbnRzKQogICAgICAgICBwYXJzZXJfaGVscCA9IHBhcnNlci5mb3JtYXRfaGVscCgpCisgICAgICAgIHByb2duYW1lID0gc2VsZi5tYWluX3Byb2dyYW0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXJfaGVscCwgdGV4dHdyYXAuZGVkZW50KCcnJ1wKLSAgICAgICAgICAgIHVzYWdlOiB7fSBbLWhdIFstYiBCXSBbLS1kIERdIFstLXcgV10gWy15IFldIGEgegorICAgICAgICAgICAgdXNhZ2U6IHt9e31bLWhdIFstYiBCXSBbLS1kIERdIFstLXcgV10gWy15IFldIGEgegogCiAgICAgICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKICAgICAgICAgICAgICAgYQpAQCAtMjE1Miw3ICsyMTg2LDcgQEAKIAogICAgICAgICAgICAgeDoKICAgICAgICAgICAgICAgLXkgWQotICAgICAgICAnJycuZm9ybWF0KHNlbGYubWFpbl9wcm9ncmFtKSkpCisgICAgICAgICcnJy5mb3JtYXQocHJvZ25hbWUsICcgJyBpZiBwcm9nbmFtZSBlbHNlICcnICkpKQogCiAgICAgZGVmIHRlc3RfZ3JvdXBzX3BhcmVudHMoc2VsZik6CiAgICAgICAgIHBhcmVudCA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKGFkZF9oZWxwPUZhbHNlKQpAQCAtMjE2OCw4ICsyMjAyLDkgQEAKICAgICAgICAgICAgIFsnLXknLCAnWScsICcteicsICdaJ10pCiAKICAgICAgICAgcGFyc2VyX2hlbHAgPSBwYXJzZXIuZm9ybWF0X2hlbHAoKQorICAgICAgICBwcm9nbmFtZSA9IHNlbGYubWFpbl9wcm9ncmFtCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyX2hlbHAsIHRleHR3cmFwLmRlZGVudCgnJydcCi0gICAgICAgICAgICB1c2FnZToge30gWy1oXSBbLXcgV10gWy14IFhdIFsteSBZIHwgLXogWl0KKyAgICAgICAgICAgIHVzYWdlOiB7fXt9Wy1oXSBbLXcgV10gWy14IFhdIFsteSBZIHwgLXogWl0KIAogICAgICAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgogICAgICAgICAgICAgICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CkBAIC0yMTgxLDcgKzIyMTYsNyBAQAogCiAgICAgICAgICAgICAgIC13IFcKICAgICAgICAgICAgICAgLXggWAotICAgICAgICAnJycuZm9ybWF0KHNlbGYubWFpbl9wcm9ncmFtKSkpCisgICAgICAgICcnJy5mb3JtYXQocHJvZ25hbWUsICcgJyBpZiBwcm9nbmFtZSBlbHNlICcnICkpKQogCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIyBNdXR1YWxseSBleGNsdXNpdmUgZ3JvdXAgdGVzdHMKQEAgLTI5MDQsNiArMjkzOSw2MCBAQAogICAgICAgICAwLjEKICAgICAgICAgJycnCiAKK2NsYXNzIFRlc3RTaG9ydENvbHVtbnMoSGVscFRlc3RDYXNlKToKKyAgICAnJydUZXN0IGV4dHJlbWVseSBzbWFsbCBudW1iZXIgb2YgY29sdW1ucy4KKworICAgIFRlc3RDYXNlIHByZXZlbnRzICJDT0xVTU5TIiBmcm9tIGJlaW5nIHRvbyBzbWFsbCBpbiB0aGUgdGVzdHMgdGhlbXNlbHZlcywKKyAgICBidXQgd2UgZG9uJ3Qgd2FudCBhbnkgZXhjZXB0aW9ucyB0aHJvd24gaW4gc3VjaCBjYXNlLiBPbmx5IHVnbHkgcmVwcmVzZW50YXRpb24uCisgICAgJycnCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBlbnYgPSB0ZXN0X3N1cHBvcnQuRW52aXJvbm1lbnRWYXJHdWFyZCgpCisgICAgICAgIGVudi5zZXQoIkNPTFVNTlMiLCAnMTUnKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoZW52Ll9fZXhpdF9fKQorCisgICAgcGFyc2VyX3NpZ25hdHVyZSAgICAgICAgICAgID0gVGVzdEhlbHBCaWdnZXJPcHRpb25hbHMucGFyc2VyX3NpZ25hdHVyZQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgICAgICAgICA9IFRlc3RIZWxwQmlnZ2VyT3B0aW9uYWxzLmFyZ3VtZW50X3NpZ25hdHVyZXMKKyAgICBhcmd1bWVudF9ncm91cF9zaWduYXR1cmVzICAgPSBUZXN0SGVscEJpZ2dlck9wdGlvbmFscy5hcmd1bWVudF9ncm91cF9zaWduYXR1cmVzCisgICAgdXNhZ2UgPSAnJydcCisgICAgICAgIHVzYWdlOiBQUk9HCisgICAgICAgICAgICAgICBbLWhdCisgICAgICAgICAgICAgICBbLXZdCisgICAgICAgICAgICAgICBbLXhdCisgICAgICAgICAgICAgICBbLS15IFldCisgICAgICAgICAgICAgICBmb28KKyAgICAgICAgICAgICAgIGJhcgorICAgICAgICAnJycKKyAgICBoZWxwID0gdXNhZ2UgKyAnJydcCisKKyAgICAgICAgREVTQ1JJUFRJT04KKworICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICBmb28KKyAgICAgICAgICAgIEZPTyBIRUxQCisgICAgICAgICAgYmFyCisgICAgICAgICAgICBCQVIgSEVMUAorCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAtaCwgLS1oZWxwCisgICAgICAgICAgICBzaG93IHRoaXMKKyAgICAgICAgICAgIGhlbHAKKyAgICAgICAgICAgIG1lc3NhZ2UgYW5kCisgICAgICAgICAgICBleGl0CisgICAgICAgICAgLXYsIC0tdmVyc2lvbgorICAgICAgICAgICAgc2hvdworICAgICAgICAgICAgcHJvZ3JhbSdzCisgICAgICAgICAgICB2ZXJzaW9uCisgICAgICAgICAgICBudW1iZXIgYW5kCisgICAgICAgICAgICBleGl0CisgICAgICAgICAgLXgKKyAgICAgICAgICAgIFggSEVMUAorICAgICAgICAgIC0teSBZCisgICAgICAgICAgICBZIEhFTFAKKworICAgICAgICBFUElMT0cKKyAgICAnJycKKyAgICB2ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgPSBUZXN0SGVscEJpZ2dlck9wdGlvbmFscy52ZXJzaW9uCisKIAogY2xhc3MgVGVzdEhlbHBCaWdnZXJPcHRpb25hbEdyb3VwcyhIZWxwVGVzdENhc2UpOgogICAgICIiIk1ha2Ugc3VyZSB0aGF0IGFyZ3VtZW50IGhlbHAgYWxpZ25zIHdoZW4gb3B0aW9ucyBhcmUgbG9uZ2VyIiIiCkBAIC00MzY0LDYgKzQ0NTMsMTIgQEAKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zMiAhPSBuczMpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuczIgIT0gbnM0KQogCisgICAgZGVmIHRlc3RfZXF1YWxpdHlfcmV0dXJuc19ub3RpbXBsZW1ldGVkKHNlbGYpOgorICAgICAgICAjIFNlZSBpc3N1ZSAyMTQ4MQorICAgICAgICBucyA9IGFyZ3BhcnNlLk5hbWVzcGFjZShhPTEsIGI9MikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhucy5fX2VxX18oTm9uZSksIE5vdEltcGxlbWVudGVkKQorICAgICAgICBzZWxmLmFzc2VydElzKG5zLl9fbmVfXyhOb25lKSwgTm90SW1wbGVtZW50ZWQpCisKIAogIyA9PT09PT09PT09PT09PT09PT09CiAjIEZpbGUgZW5jb2RpbmcgdGVzdHMKQEAgLTQ0MTYsMTIgKzQ1MTEsOTUgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuZmFpbCgpCiAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIENoZWNrIHRoYXQgdGhlIHR5cGUgZnVuY3Rpb24gaXMgY2FsbGVkIG9ubHkgb25jZQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdFR5cGVGdW5jdGlvbkNhbGxPbmx5T25jZShUZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF90eXBlX2Z1bmN0aW9uX2NhbGxfb25seV9vbmNlKHNlbGYpOgorICAgICAgICBkZWYgc3BhbShzdHJpbmdfdG9fY29udmVydCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmluZ190b19jb252ZXJ0LCAnc3BhbSEnKQorICAgICAgICAgICAgcmV0dXJuICdmb29fY29udmVydGVkJworCisgICAgICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1mb28nLCB0eXBlPXNwYW0sIGRlZmF1bHQ9J2JhcicpCisgICAgICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygnLS1mb28gc3BhbSEnLnNwbGl0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTlMoZm9vPSdmb29fY29udmVydGVkJyksIGFyZ3MpCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIENoZWNrIHNlbWFudGljcyByZWdhcmRpbmcgdGhlIGRlZmF1bHQgYXJndW1lbnQgYW5kIHR5cGUgY29udmVyc2lvbgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdFR5cGVGdW5jdGlvbkNhbGxlZE9uRGVmYXVsdChUZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF90eXBlX2Z1bmN0aW9uX2NhbGxfd2l0aF9ub25fc3RyaW5nX2RlZmF1bHQoc2VsZik6CisgICAgICAgIGRlZiBzcGFtKGludF90b19jb252ZXJ0KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50X3RvX2NvbnZlcnQsIDApCisgICAgICAgICAgICByZXR1cm4gJ2Zvb19jb252ZXJ0ZWQnCisKKyAgICAgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWZvbycsIHR5cGU9c3BhbSwgZGVmYXVsdD0wKQorICAgICAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoW10pCisgICAgICAgICMgZm9vIHNob3VsZCAqbm90KiBiZSBjb252ZXJ0ZWQgYmVjYXVzZSBpdHMgZGVmYXVsdCBpcyBub3QgYSBzdHJpbmcuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTlMoZm9vPTApLCBhcmdzKQorCisgICAgZGVmIHRlc3RfdHlwZV9mdW5jdGlvbl9jYWxsX3dpdGhfc3RyaW5nX2RlZmF1bHQoc2VsZik6CisgICAgICAgIGRlZiBzcGFtKGludF90b19jb252ZXJ0KToKKyAgICAgICAgICAgIHJldHVybiAnZm9vX2NvbnZlcnRlZCcKKworICAgICAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tZm9vJywgdHlwZT1zcGFtLCBkZWZhdWx0PScwJykKKyAgICAgICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKFtdKQorICAgICAgICAjIGZvbyBpcyBjb252ZXJ0ZWQgYmVjYXVzZSBpdHMgZGVmYXVsdCBpcyBhIHN0cmluZy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOUyhmb289J2Zvb19jb252ZXJ0ZWQnKSwgYXJncykKKworICAgIGRlZiB0ZXN0X25vX2RvdWJsZV90eXBlX2NvbnZlcnNpb25fb2ZfZGVmYXVsdChzZWxmKToKKyAgICAgICAgZGVmIGV4dGVuZChzdHJfdG9fY29udmVydCk6CisgICAgICAgICAgICByZXR1cm4gc3RyX3RvX2NvbnZlcnQgKyAnKicKKworICAgICAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tdGVzdCcsIHR5cGU9ZXh0ZW5kLCBkZWZhdWx0PScqJykKKyAgICAgICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKFtdKQorICAgICAgICAjIFRoZSB0ZXN0IGFyZ3VtZW50IHdpbGwgYmUgdHdvIHN0YXJzLCBvbmUgY29taW5nIGZyb20gdGhlIGRlZmF1bHQKKyAgICAgICAgIyB2YWx1ZSBhbmQgb25lIGNvbWluZyBmcm9tIHRoZSB0eXBlIGNvbnZlcnNpb24gYmVpbmcgY2FsbGVkIGV4YWN0bHkKKyAgICAgICAgIyBvbmNlLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5TKHRlc3Q9JyoqJyksIGFyZ3MpCisKKyAgICBkZWYgdGVzdF9pc3N1ZV8xNTkwNihzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTU5MDY6IFdoZW4gYWN0aW9uPSdhcHBlbmQnLCB0eXBlPXN0ciwgZGVmYXVsdD1bXSBhcmUKKyAgICAgICAgIyBwcm92aWRpbmcsIHRoZSBkZXN0IHZhbHVlIHdhcyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uICJbXSIgd2hlbiBpdAorICAgICAgICAjIHNob3VsZCBoYXZlIGJlZW4gYW4gZW1wdHkgbGlzdC4KKyAgICAgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXRlc3QnLCBkZXN0PSd0ZXN0JywgdHlwZT1zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1bXSwgYWN0aW9uPSdhcHBlbmQnKQorICAgICAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncy50ZXN0LCBbXSkKKwogIyA9PT09PT09PT09PT09PT09PT09PT09CiAjIHBhcnNlX2tub3duX2FyZ3MgdGVzdHMKICMgPT09PT09PT09PT09PT09PT09PT09PQogCiBjbGFzcyBUZXN0UGFyc2VLbm93bkFyZ3MoVGVzdENhc2UpOgogCisgICAgZGVmIHRlc3RfYXJndW1lbnRzX3R1cGxlKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgICAgIHBhcnNlci5wYXJzZV9hcmdzKCgpKQorCisgICAgZGVmIHRlc3RfYXJndW1lbnRzX2xpc3Qoc2VsZik6CisgICAgICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLnBhcnNlX2FyZ3MoW10pCisKKyAgICBkZWYgdGVzdF9hcmd1bWVudHNfdHVwbGVfcG9zaXRpb25hbChzZWxmKToKKyAgICAgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCd4JykKKyAgICAgICAgcGFyc2VyLnBhcnNlX2FyZ3MoKCd4JywpKQorCisgICAgZGVmIHRlc3RfYXJndW1lbnRzX2xpc3RfcG9zaXRpb25hbChzZWxmKToKKyAgICAgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCd4JykKKyAgICAgICAgcGFyc2VyLnBhcnNlX2FyZ3MoWyd4J10pCisKICAgICBkZWYgdGVzdF9vcHRpb25hbHMoc2VsZik6CiAgICAgICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKICAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1mb28nKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hcnJheS5weSBiL0xpYi90ZXN0L3Rlc3RfYXJyYXkucHkKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBhY2Y1YjhmLi5iOTMzY2JmCi0tLSBhL0xpYi90ZXN0L3Rlc3RfYXJyYXkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hcnJheS5weQpAQCAtMSw0ICsxLDMgQEAKLSMhIC91c3IvYmluL2VudiBweXRob24KICIiIlRlc3QgdGhlIGFycmF5bW9kdWxlLgogICAgUm9nZXIgRS4gTWFzc2UKICIiIgpAQCAtOSw2ICs4LDcgQEAKIGZyb20gd2Vha3JlZiBpbXBvcnQgcHJveHkKIGltcG9ydCBhcnJheSwgY1N0cmluZ0lPCiBmcm9tIGNQaWNrbGUgaW1wb3J0IGxvYWRzLCBkdW1wcywgSElHSEVTVF9QUk9UT0NPTAoraW1wb3J0IHN5cwogCiBjbGFzcyBBcnJheVN1YmNsYXNzKGFycmF5LmFycmF5KToKICAgICBwYXNzCkBAIC00OSw3ICs0OSw3IEBACiAgICAgZGVmIHRlc3RfY29uc3RydWN0b3Ioc2VsZik6CiAgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEudHlwZWNvZGUsIHNlbGYudHlwZWNvZGUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhLml0ZW1zaXplPj1zZWxmLm1pbml0ZW1zaXplKQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChhLml0ZW1zaXplLCBzZWxmLm1pbml0ZW1zaXplKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGFycmF5LmFycmF5LCBzZWxmLnR5cGVjb2RlLCBOb25lKQogCiAgICAgZGVmIHRlc3RfbGVuKHNlbGYpOgpAQCAtMjUzLDM5ICsyNTMsMzkgQEAKIAogICAgIGRlZiB0ZXN0X2NtcChzZWxmKToKICAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhID09IDQyKSBpcyBGYWxzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhICE9IDQyKSBpcyBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKGEgPT0gNDIsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKGEgIT0gNDIsIFRydWUpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhID09IGEpIGlzIFRydWUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSAhPSBhKSBpcyBGYWxzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhIDwgYSkgaXMgRmFsc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA8PSBhKSBpcyBUcnVlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPiBhKSBpcyBGYWxzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhID49IGEpIGlzIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoYSA9PSBhLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKGEgIT0gYSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoYSA8IGEsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKGEgPD0gYSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhhID4gYSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoYSA+PSBhLCBUcnVlKQogCiAgICAgICAgIGFsID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5zbWFsbGVyZXhhbXBsZSkKICAgICAgICAgYWIgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmJpZ2dlcmV4YW1wbGUpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhID09IDIqYSkgaXMgRmFsc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSAhPSAyKmEpIGlzIFRydWUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA8IDIqYSkgaXMgVHJ1ZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhIDw9IDIqYSkgaXMgVHJ1ZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhID4gMiphKSBpcyBGYWxzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhID49IDIqYSkgaXMgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoYSA9PSAyKmEsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKGEgIT0gMiphLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKGEgPCAyKmEsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoYSA8PSAyKmEsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoYSA+IDIqYSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoYSA+PSAyKmEsIEZhbHNlKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA9PSBhbCkgaXMgRmFsc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSAhPSBhbCkgaXMgVHJ1ZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhIDwgYWwpIGlzIEZhbHNlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPD0gYWwpIGlzIEZhbHNlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPiBhbCkgaXMgVHJ1ZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhID49IGFsKSBpcyBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKGEgPT0gYWwsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKGEgIT0gYWwsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoYSA8IGFsLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhhIDw9IGFsLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhhID4gYWwsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoYSA+PSBhbCwgVHJ1ZSkKIAotICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPT0gYWIpIGlzIEZhbHNlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgIT0gYWIpIGlzIFRydWUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA8IGFiKSBpcyBUcnVlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPD0gYWIpIGlzIFRydWUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA+IGFiKSBpcyBGYWxzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhID49IGFiKSBpcyBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhhID09IGFiLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhhICE9IGFiLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKGEgPCBhYiwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhhIDw9IGFiLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKGEgPiBhYiwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoYSA+PSBhYiwgRmFsc2UpCiAKICAgICBkZWYgdGVzdF9hZGQoc2VsZik6CiAgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpIFwKQEAgLTMwNCw3ICszMDQsNyBAQAogICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlWzo6LTFdKQogICAgICAgICBiID0gYQogICAgICAgICBhICs9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIDIqc2VsZi5leGFtcGxlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoYSBpcyBiKQorICAgICAgICBzZWxmLmFzc2VydElzKGEsIGIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICBhLAogICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlWzo6LTFdKzIqc2VsZi5leGFtcGxlKQpAQCAtMzUzLDIyICszNTMsMjIgQEAKICAgICAgICAgYiA9IGEKIAogICAgICAgICBhICo9IDUKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaXMgYikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhhLCBiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgYSwKICAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIDUqc2VsZi5leGFtcGxlKQogICAgICAgICApCiAKICAgICAgICAgYSAqPSAwCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhIGlzIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoYSwgYikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlKSkKIAogICAgICAgICBhICo9IDEwMDAKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaXMgYikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhhLCBiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUpKQogCiAgICAgICAgIGEgKj0gLTEKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaXMgYikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhhLCBiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUpKQogCiAgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCkBAIC03NTMsNyArNzUzLDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaW1wb3J0IGdjCiAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgnZ2MgbW9kdWxlIG5vdCBhdmFpbGFibGUnKQogICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSkKICAgICAgICAgbCA9IFtpdGVyKGEpXQogICAgICAgICBsLmFwcGVuZChsKQpAQCAtNzcyLDE1ICs3NzIsMTUgQEAKICAgICAgICAgcyA9IE5vbmUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUmVmZXJlbmNlRXJyb3IsIGxlbiwgcCkKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIoc3lzLCAnZ2V0cmVmY291bnQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdCBuZWVkcyBzeXMuZ2V0cmVmY291bnQoKScpCiAgICAgZGVmIHRlc3RfYnVnXzc4MjM2OShzZWxmKToKLSAgICAgICAgaW1wb3J0IHN5cwotICAgICAgICBpZiBoYXNhdHRyKHN5cywgImdldHJlZmNvdW50Iik6Ci0gICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6Ci0gICAgICAgICAgICAgICAgYiA9IGFycmF5LmFycmF5KCdCJywgcmFuZ2UoNjQpKQotICAgICAgICAgICAgcmMgPSBzeXMuZ2V0cmVmY291bnQoMTApCi0gICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6Ci0gICAgICAgICAgICAgICAgYiA9IGFycmF5LmFycmF5KCdCJywgcmFuZ2UoNjQpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYywgc3lzLmdldHJlZmNvdW50KDEwKSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgYiA9IGFycmF5LmFycmF5KCdCJywgcmFuZ2UoNjQpKQorICAgICAgICByYyA9IHN5cy5nZXRyZWZjb3VudCgxMCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgYiA9IGFycmF5LmFycmF5KCdCJywgcmFuZ2UoNjQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJjLCBzeXMuZ2V0cmVmY291bnQoMTApKQogCiAgICAgZGVmIHRlc3Rfc3ViY2xhc3Nfd2l0aF9rd2FyZ3Moc2VsZik6CiAgICAgICAgICMgU0YgYnVnICMxNDg2NjYzIC0tIHRoaXMgdXNlZCB0byBlcnJvbmVvdXNseSByYWlzZSBhIFR5cGVFcnJvcgpAQCAtOTg1LDYgKzk4NSwxOSBAQAogICAgICAgICB1cHBlciA9IGxvbmcocG93KDIsIGEuaXRlbXNpemUgKiA4KSkgLSAxTAogICAgICAgICBzZWxmLmNoZWNrX292ZXJmbG93KGxvd2VyLCB1cHBlcikKIAorICAgIEB0ZXN0X3N1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3Rfc2l6ZW9mX3dpdGhfYnVmZmVyKHNlbGYpOgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBiYXNlc2l6ZSA9IHRlc3Rfc3VwcG9ydC5jYWxjdm9ianNpemUoJzRQJykKKyAgICAgICAgYnVmZmVyX3NpemUgPSBhLmJ1ZmZlcl9pbmZvKClbMV0gKiBhLml0ZW1zaXplCisgICAgICAgIHRlc3Rfc3VwcG9ydC5jaGVja19zaXplb2Yoc2VsZiwgYSwgYmFzZXNpemUgKyBidWZmZXJfc2l6ZSkKKworICAgIEB0ZXN0X3N1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3Rfc2l6ZW9mX3dpdGhvdXRfYnVmZmVyKHNlbGYpOgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSkKKyAgICAgICAgYmFzZXNpemUgPSB0ZXN0X3N1cHBvcnQuY2FsY3ZvYmpzaXplKCc0UCcpCisgICAgICAgIHRlc3Rfc3VwcG9ydC5jaGVja19zaXplb2Yoc2VsZiwgYSwgYmFzZXNpemUpCisKIAogY2xhc3MgQnl0ZVRlc3QoU2lnbmVkTnVtYmVyVGVzdCk6CiAgICAgdHlwZWNvZGUgPSAnYicKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXN0LnB5IGIvTGliL3Rlc3QvdGVzdF9hc3QucHkKaW5kZXggZTNhYTViMS4uMGExY2E0MSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9hc3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hc3QucHkKQEAgLTE4LDcgKzE4LDcgQEAKIAogCiAjIFRoZXNlIHRlc3RzIGFyZSBjb21waWxlZCB0aHJvdWdoICJleGVjIgotIyBUaGVyZSBzaG91bGQgYmUgYXRsZWFzdCBvbmUgdGVzdCBwZXIgc3RhdGVtZW50CisjIFRoZXJlIHNob3VsZCBiZSBhdCBsZWFzdCBvbmUgdGVzdCBwZXIgc3RhdGVtZW50CiBleGVjX3Rlc3RzID0gWwogICAgICMgTm9uZQogICAgICJOb25lIiwKQEAgLTIzMSw2ICsyMzEsMTIgQEAKICAgICAgICAgaW0gPSBhc3QucGFyc2UoImZyb20gLiBpbXBvcnQgeSIpLmJvZHlbMF0KICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoaW0ubW9kdWxlKQogCisgICAgZGVmIHRlc3Rfbm9uX2ludGVybmVkX2Z1dHVyZV9mcm9tX2FzdChzZWxmKToKKyAgICAgICAgbW9kID0gYXN0LnBhcnNlKCJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uIikKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1vZC5ib2R5WzBdLCBhc3QuSW1wb3J0RnJvbSkKKyAgICAgICAgbW9kLmJvZHlbMF0ubW9kdWxlID0gIiBfX2Z1dHVyZV9fICIuc3RyaXAoKQorICAgICAgICBjb21waWxlKG1vZCwgIjx0ZXN0PiIsICJleGVjIikKKwogICAgIGRlZiB0ZXN0X2Jhc2VfY2xhc3NlcyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoYXN0LkZvciwgYXN0LnN0bXQpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhhc3QuTmFtZSwgYXN0LmV4cHIpKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hc3luY2hhdC5weSBiL0xpYi90ZXN0L3Rlc3RfYXN5bmNoYXQucHkKaW5kZXggYzgxZWMwZC4uOWM0YzcxNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9hc3luY2hhdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2FzeW5jaGF0LnB5CkBAIC0xLDYgKzEsMTAgQEAKICMgdGVzdCBhc3luY2hhdAogCi1pbXBvcnQgYXN5bmNvcmUsIGFzeW5jaGF0LCBzb2NrZXQsIHRpbWUKK2ltcG9ydCBlcnJubworaW1wb3J0IGFzeW5jb3JlCitpbXBvcnQgYXN5bmNoYXQKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCB0aW1lCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBzeXMKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CkBAIC0yMzUsNiArMjM5LDMxIEBACiBjbGFzcyBUZXN0QXN5bmNoYXRfV2l0aFBvbGwoVGVzdEFzeW5jaGF0KToKICAgICB1c2Vwb2xsID0gVHJ1ZQogCisKK2NsYXNzIFRlc3RBc3luY2hhdE1vY2tlZCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfYmxvY2tpbmdpb2Vycm9yKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxNjEzMzogaGFuZGxlX3JlYWQoKSBtdXN0IGlnbm9yZSBibG9ja2luZyBJL08gZXJyb3JzIGxpa2UKKyAgICAgICAgIyBFQUdBSU4KKyAgICAgICAgY2xhc3MgZmFrZV9zb2NrZXQ6CisgICAgICAgICAgICBkZWYgZmlsZW5vKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAwCisKKyAgICAgICAgICAgIGRlZiByZWN2KHNlbGYsIHNpemUpOgorICAgICAgICAgICAgICAgIHJhaXNlIHNvY2tldC5lcnJvcihlcnJuby5FQUdBSU4sICJFQUdBSU4iKQorCisgICAgICAgIGNsYXNzIE15Q2hhdChhc3luY2hhdC5hc3luY19jaGF0KToKKyAgICAgICAgICAgIGRlZiBoYW5kbGVfZXJyb3Ioc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJlcnJvciIpCisKKyAgICAgICAgc29jayA9IGZha2Vfc29ja2V0KCkKKyAgICAgICAgZGlzcGF0Y2hlciA9IE15Q2hhdCgpCisgICAgICAgIGRpc3BhdGNoZXIuc2V0X3NvY2tldChzb2NrKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoZGlzcGF0Y2hlci5kZWxfY2hhbm5lbCkKKworICAgICAgICAjIG11c3Qgbm90IGNhbGwgaGFuZGxlX2Vycm9yKCkKKyAgICAgICAgZGlzcGF0Y2hlci5oYW5kbGVfcmVhZCgpCisKKwogY2xhc3MgVGVzdEhlbHBlckZ1bmN0aW9ucyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfZmluZF9wcmVmaXhfYXRfZW5kKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzeW5jaGF0LmZpbmRfcHJlZml4X2F0X2VuZCgicXdlcnR5XHIiLCAiXHJcbiIpLCAxKQpAQCAtMjY3LDYgKzI5Niw3IEBACiAKIGRlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RBc3luY2hhdCwgVGVzdEFzeW5jaGF0X1dpdGhQb2xsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEFzeW5jaGF0TW9ja2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEhlbHBlckZ1bmN0aW9ucywgVGVzdEZpZm8pCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2FzeW5jb3JlLnB5IGIvTGliL3Rlc3QvdGVzdF9hc3luY29yZS5weQppbmRleCA3ZDFhM2NiLi4yMGVjZWI2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2FzeW5jb3JlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYXN5bmNvcmUucHkKQEAgLTcsOSArNywxMCBAQAogaW1wb3J0IHRpbWUKIGltcG9ydCB3YXJuaW5ncwogaW1wb3J0IGVycm5vCitpbXBvcnQgc3RydWN0CiAKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Ci1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBURVNURk4sIHJ1bl91bml0dGVzdCwgdW5saW5rCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBURVNURk4sIHJ1bl91bml0dGVzdCwgdW5saW5rLCBIT1NUCiBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwogCiB0cnk6CkBAIC0xNyw3ICsxOCw2IEBACiBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgdGhyZWFkaW5nID0gTm9uZQogCi1IT1NUID0gdGVzdF9zdXBwb3J0LkhPU1QKIAogY2xhc3MgZHVtbXlzb2NrZXQ6CiAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgpAQCAtNDgzLDggKzQ4Myw5IEBACiAgICAgICAgIHJldHVybiBzZWxmLnNvY2tldC5nZXRzb2NrbmFtZSgpWzoyXQogCiAgICAgZGVmIGhhbmRsZV9hY2NlcHQoc2VsZik6Ci0gICAgICAgIHNvY2ssIGFkZHIgPSBzZWxmLmFjY2VwdCgpCi0gICAgICAgIHNlbGYuaGFuZGxlcihzb2NrKQorICAgICAgICBwYWlyID0gc2VsZi5hY2NlcHQoKQorICAgICAgICBpZiBwYWlyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5oYW5kbGVyKHBhaXJbMF0pCiAKICAgICBkZWYgaGFuZGxlX2Vycm9yKHNlbGYpOgogICAgICAgICByYWlzZQpAQCAtNzAzLDYgKzcwNCwyNyBAQAogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgc29jay5jbG9zZSgpCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorICAgIEB0ZXN0X3N1cHBvcnQucmVhcF90aHJlYWRzCisgICAgZGVmIHRlc3RfcXVpY2tfY29ubmVjdChzZWxmKToKKyAgICAgICAgIyBzZWU6IGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxMDM0MAorICAgICAgICBzZXJ2ZXIgPSBUQ1BTZXJ2ZXIoKQorICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9bGFtYmRhOiBhc3luY29yZS5sb29wKHRpbWVvdXQ9MC4xLCBjb3VudD01MDApKQorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHQuam9pbikKKworICAgICAgICBmb3IgeCBpbiB4cmFuZ2UoMjApOgorICAgICAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgICAgIHMuc2V0dGltZW91dCguMikKKyAgICAgICAgICAgIHMuc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX0xJTkdFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QucGFjaygnaWknLCAxLCAwKSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzLmNvbm5lY3Qoc2VydmVyLmFkZHJlc3MpCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcy5jbG9zZSgpCisKIAogY2xhc3MgVGVzdEFQSV9Vc2VTZWxlY3QoQmFzZVRlc3RBUEkpOgogICAgIHVzZV9wb2xsID0gRmFsc2UKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXVkaW9vcC5weSBiL0xpYi90ZXN0L3Rlc3RfYXVkaW9vcC5weQppbmRleCBlMDNjZWI1Li5lNWE1MTU5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2F1ZGlvb3AucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hdWRpb29wLnB5CkBAIC0xLDE3MSArMSwzNTMgQEAKIGltcG9ydCBhdWRpb29wCitpbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzdHJ1Y3QKIGZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAogCiAKLWRlZiBnZW5kYXRhMSgpOgotICAgIHJldHVybiAnXDBcMVwyJworZm9ybWF0cyA9IHsKKyAgICAxOiAnYicsCisgICAgMjogJ2gnLAorICAgIDQ6ICdpJywKK30KIAotZGVmIGdlbmRhdGEyKCk6Ci0gICAgaWYgYXVkaW9vcC5nZXRzYW1wbGUoJ1wwXDEnLCAyLCAwKSA9PSAxOgotICAgICAgICByZXR1cm4gJ1wwXDBcMFwxXDBcMicKLSAgICBlbHNlOgotICAgICAgICByZXR1cm4gJ1wwXDBcMVwwXDJcMCcKK2RlZiBwYWNrKHdpZHRoLCBkYXRhKToKKyAgICByZXR1cm4gc3RydWN0LnBhY2soJz0lZCVzJyAlIChsZW4oZGF0YSksIGZvcm1hdHNbd2lkdGhdKSwgKmRhdGEpCiAKLWRlZiBnZW5kYXRhNCgpOgotICAgIGlmIGF1ZGlvb3AuZ2V0c2FtcGxlKCdcMFwwXDBcMScsIDQsIDApID09IDE6Ci0gICAgICAgIHJldHVybiAnXDBcMFwwXDBcMFwwXDBcMVwwXDBcMFwyJwotICAgIGVsc2U6Ci0gICAgICAgIHJldHVybiAnXDBcMFwwXDBcMVwwXDBcMFwyXDBcMFwwJworcGFja3MgPSB7CisgICAgMTogbGFtYmRhICpkYXRhOiBwYWNrKDEsIGRhdGEpLAorICAgIDI6IGxhbWJkYSAqZGF0YTogcGFjaygyLCBkYXRhKSwKKyAgICA0OiBsYW1iZGEgKmRhdGE6IHBhY2soNCwgZGF0YSksCit9CittYXh2YWx1ZXMgPSB7dzogKDEgPDwgKDggKiB3IC0gMSkpIC0gMSBmb3IgdyBpbiAoMSwgMiwgNCl9CittaW52YWx1ZXMgPSB7dzogLTEgPDwgKDggKiB3IC0gMSkgZm9yIHcgaW4gKDEsIDIsIDQpfQogCi1kYXRhID0gW2dlbmRhdGExKCksIGdlbmRhdGEyKCksIGdlbmRhdGE0KCldCitkYXRhcyA9IHsKKyAgICAxOiBiJ1x4MDBceDEyXHg0NVx4YmJceDdmXHg4MFx4ZmYnLAorICAgIDI6IHBhY2tzWzJdKDAsIDB4MTIzNCwgMHg0NTY3LCAtMHg0NTY3LCAweDdmZmYsIC0weDgwMDAsIC0xKSwKKyAgICA0OiBwYWNrc1s0XSgwLCAweDEyMzQ1Njc4LCAweDQ1Njc4OWFiLCAtMHg0NTY3ODlhYiwKKyAgICAgICAgICAgICAgICAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMCwgLTEpLAorfQogCiBJTlZBTElEX0RBVEEgPSBbCi0gICAgKCdhYmMnLCAwKSwKLSAgICAoJ2FiYycsIDIpLAotICAgICgnYWJjJywgNCksCisgICAgKGInYWJjJywgMCksCisgICAgKGInYWJjJywgMiksCisgICAgKGInYWJjJywgNCksCiBdCiAKIAogY2xhc3MgVGVzdEF1ZGlvb3AodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfbWF4KHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubWF4KGRhdGFbMF0sIDEpLCAyKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubWF4KGRhdGFbMV0sIDIpLCAyKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubWF4KGRhdGFbMl0sIDQpLCAyKQorICAgICAgICBmb3IgdyBpbiAxLCAyLCA0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm1heChiJycsIHcpLCAwKQorICAgICAgICAgICAgcCA9IHBhY2tzW3ddCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubWF4KHAoNSksIHcpLCA1KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm1heChwKDUsIC04LCAtMSksIHcpLCA4KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm1heChwKG1heHZhbHVlc1t3XSksIHcpLCBtYXh2YWx1ZXNbd10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubWF4KHAobWludmFsdWVzW3ddKSwgdyksIC1taW52YWx1ZXNbd10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubWF4KGRhdGFzW3ddLCB3KSwgLW1pbnZhbHVlc1t3XSkKIAogICAgIGRlZiB0ZXN0X21pbm1heChzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm1pbm1heChkYXRhWzBdLCAxKSwgKDAsIDIpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubWlubWF4KGRhdGFbMV0sIDIpLCAoMCwgMikpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5taW5tYXgoZGF0YVsyXSwgNCksICgwLCAyKSkKKyAgICAgICAgZm9yIHcgaW4gMSwgMiwgNDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5taW5tYXgoYicnLCB3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKSkKKyAgICAgICAgICAgIHAgPSBwYWNrc1t3XQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm1pbm1heChwKDUpLCB3KSwgKDUsIDUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm1pbm1heChwKDUsIC04LCAtMSksIHcpLCAoLTgsIDUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm1pbm1heChwKG1heHZhbHVlc1t3XSksIHcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF4dmFsdWVzW3ddLCBtYXh2YWx1ZXNbd10pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm1pbm1heChwKG1pbnZhbHVlc1t3XSksIHcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWludmFsdWVzW3ddLCBtaW52YWx1ZXNbd10pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm1pbm1heChkYXRhc1t3XSwgdyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtaW52YWx1ZXNbd10sIG1heHZhbHVlc1t3XSkpCiAKICAgICBkZWYgdGVzdF9tYXhwcChzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm1heHBwKGRhdGFbMF0sIDEpLCAwKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubWF4cHAoZGF0YVsxXSwgMiksIDApCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5tYXhwcChkYXRhWzJdLCA0KSwgMCkKKyAgICAgICAgZm9yIHcgaW4gMSwgMiwgNDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5tYXhwcChiJycsIHcpLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm1heHBwKHBhY2tzW3ddKCpyYW5nZSgxMDApKSwgdyksIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubWF4cHAocGFja3Nbd10oOSwgMTAsIDUsIDUsIDAsIDEpLCB3KSwgMTApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubWF4cHAoZGF0YXNbd10sIHcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXh2YWx1ZXNbd10gLSBtaW52YWx1ZXNbd10pCiAKICAgICBkZWYgdGVzdF9hdmcoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hdmcoZGF0YVswXSwgMSksIDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hdmcoZGF0YVsxXSwgMiksIDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hdmcoZGF0YVsyXSwgNCksIDEpCisgICAgICAgIGZvciB3IGluIDEsIDIsIDQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYXZnKGInJywgdyksIDApCisgICAgICAgICAgICBwID0gcGFja3Nbd10KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hdmcocCg1KSwgdyksIDUpCisgICAgICAgICAgICBzZWxmIC5hc3NlcnRFcXVhbChhdWRpb29wLmF2ZyhwKDUsIDgpLCB3KSwgNikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hdmcocCg1LCAtOCksIHcpLCAtMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hdmcocChtYXh2YWx1ZXNbd10sIG1heHZhbHVlc1t3XSksIHcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXh2YWx1ZXNbd10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYXZnKHAobWludmFsdWVzW3ddLCBtaW52YWx1ZXNbd10pLCB3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWludmFsdWVzW3ddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYXZnKHBhY2tzWzRdKDB4NTAwMDAwMDAsIDB4NzAwMDAwMDApLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAweDYwMDAwMDAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYXZnKHBhY2tzWzRdKC0weDUwMDAwMDAwLCAtMHg3MDAwMDAwMCksIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIC0weDYwMDAwMDAwKQogCiAgICAgZGVmIHRlc3RfYXZncHAoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hdmdwcChkYXRhWzBdLCAxKSwgMCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmF2Z3BwKGRhdGFbMV0sIDIpLCAwKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYXZncHAoZGF0YVsyXSwgNCksIDApCisgICAgICAgIGZvciB3IGluIDEsIDIsIDQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYXZncHAoYicnLCB3KSwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hdmdwcChwYWNrc1t3XSgqcmFuZ2UoMTAwKSksIHcpLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmF2Z3BwKHBhY2tzW3ddKDksIDEwLCA1LCA1LCAwLCAxKSwgdyksIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYXZncHAoZGF0YXNbMV0sIDEpLCAxOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hdmdwcChkYXRhc1syXSwgMiksIDUwNTM0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYXZncHAoZGF0YXNbNF0sIDQpLCAzMzExODk3MDAyKQogCiAgICAgZGVmIHRlc3Rfcm1zKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3Aucm1zKGRhdGFbMF0sIDEpLCAxKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3Aucm1zKGRhdGFbMV0sIDIpLCAxKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3Aucm1zKGRhdGFbMl0sIDQpLCAxKQorICAgICAgICBmb3IgdyBpbiAxLCAyLCA0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLnJtcyhiJycsIHcpLCAwKQorICAgICAgICAgICAgcCA9IHBhY2tzW3ddCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3Aucm1zKHAoKnJhbmdlKDEwMCkpLCB3KSwgNTcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGF1ZGlvb3Aucm1zKHAobWF4dmFsdWVzW3ddKSAqIDUsIHcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXh2YWx1ZXNbd10sIGRlbHRhPTEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGF1ZGlvb3Aucm1zKHAobWludmFsdWVzW3ddKSAqIDUsIHcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtbWludmFsdWVzW3ddLCBkZWx0YT0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3Aucm1zKGRhdGFzWzFdLCAxKSwgNzcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5ybXMoZGF0YXNbMl0sIDIpLCAyMDAwMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLnJtcyhkYXRhc1s0XSwgNCksIDEzMTA4NTQxNTIpCiAKICAgICBkZWYgdGVzdF9jcm9zcyhzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmNyb3NzKGRhdGFbMF0sIDEpLCAwKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuY3Jvc3MoZGF0YVsxXSwgMiksIDApCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5jcm9zcyhkYXRhWzJdLCA0KSwgMCkKKyAgICAgICAgZm9yIHcgaW4gMSwgMiwgNDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5jcm9zcyhiJycsIHcpLCAtMSkKKyAgICAgICAgICAgIHAgPSBwYWNrc1t3XQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmNyb3NzKHAoMCwgMSwgMiksIHcpLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmNyb3NzKHAoMSwgMiwgLTMsIC00KSwgdyksIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuY3Jvc3MocCgtMSwgLTIsIDMsIDQpLCB3KSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5jcm9zcyhwKDAsIG1pbnZhbHVlc1t3XSksIHcpLCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmNyb3NzKHAobWludmFsdWVzW3ddLCBtYXh2YWx1ZXNbd10pLCB3KSwgMSkKIAogICAgIGRlZiB0ZXN0X2FkZChzZWxmKToKLSAgICAgICAgZGF0YTIgPSBbXQotICAgICAgICBmb3IgZCBpbiBkYXRhOgotICAgICAgICAgICAgc3RyID0gJycKLSAgICAgICAgICAgIGZvciBzIGluIGQ6Ci0gICAgICAgICAgICAgICAgc3RyID0gc3RyICsgY2hyKG9yZChzKSoyKQotICAgICAgICAgICAgZGF0YTIuYXBwZW5kKHN0cikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmFkZChkYXRhWzBdLCBkYXRhWzBdLCAxKSwgZGF0YTJbMF0pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hZGQoZGF0YVsxXSwgZGF0YVsxXSwgMiksIGRhdGEyWzFdKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYWRkKGRhdGFbMl0sIGRhdGFbMl0sIDQpLCBkYXRhMlsyXSkKKyAgICAgICAgZm9yIHcgaW4gMSwgMiwgNDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hZGQoYicnLCBiJycsIHcpLCBiJycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYWRkKGRhdGFzW3ddLCBiJ1wwJyAqIGxlbihkYXRhc1t3XSksIHcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhc1t3XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmFkZChkYXRhc1sxXSwgZGF0YXNbMV0sIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInXHgwMFx4MjRceDdmXHg4MFx4N2ZceDgwXHhmZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hZGQoZGF0YXNbMl0sIGRhdGFzWzJdLCAyKSwKKyAgICAgICAgICAgICAgICBwYWNrc1syXSgwLCAweDI0NjgsIDB4N2ZmZiwgLTB4ODAwMCwgMHg3ZmZmLCAtMHg4MDAwLCAtMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hZGQoZGF0YXNbNF0sIGRhdGFzWzRdLCA0KSwKKyAgICAgICAgICAgICAgICBwYWNrc1s0XSgwLCAweDI0NjhhY2YwLCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDAsIC0yKSkKIAogICAgIGRlZiB0ZXN0X2JpYXMoc2VsZik6Ci0gICAgICAgICMgTm90ZTogdGhpcyB0ZXN0IGFzc3VtZXMgdGhhdCBhdmcoKSB3b3JrcwotICAgICAgICBkMSA9IGF1ZGlvb3AuYmlhcyhkYXRhWzBdLCAxLCAxMDApCi0gICAgICAgIGQyID0gYXVkaW9vcC5iaWFzKGRhdGFbMV0sIDIsIDEwMCkKLSAgICAgICAgZDQgPSBhdWRpb29wLmJpYXMoZGF0YVsyXSwgNCwgMTAwKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYXZnKGQxLCAxKSwgMTAxKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYXZnKGQyLCAyKSwgMTAxKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYXZnKGQ0LCA0KSwgMTAxKQorICAgICAgICBmb3IgdyBpbiAxLCAyLCA0OgorICAgICAgICAgICAgZm9yIGJpYXMgaW4gMCwgMSwgLTEsIDEyNywgLTEyOCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDA6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmJpYXMoYicnLCB3LCBiaWFzKSwgYicnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYmlhcyhkYXRhc1sxXSwgMSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidceDAxXHgxM1x4NDZceGJjXHg4MFx4ODFceDAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmJpYXMoZGF0YXNbMV0sIDEsIC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ1x4ZmZceDExXHg0NFx4YmFceDdlXHg3Zlx4ZmUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYmlhcyhkYXRhc1sxXSwgMSwgMHg3ZmZmZmZmZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidceGZmXHgxMVx4NDRceGJhXHg3ZVx4N2ZceGZlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmJpYXMoZGF0YXNbMV0sIDEsIC0weDgwMDAwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhc1sxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmJpYXMoZGF0YXNbMl0sIDIsIDEpLAorICAgICAgICAgICAgICAgIHBhY2tzWzJdKDEsIDB4MTIzNSwgMHg0NTY4LCAtMHg0NTY2LCAtMHg4MDAwLCAtMHg3ZmZmLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmJpYXMoZGF0YXNbMl0sIDIsIC0xKSwKKyAgICAgICAgICAgICAgICBwYWNrc1syXSgtMSwgMHgxMjMzLCAweDQ1NjYsIC0weDQ1NjgsIDB4N2ZmZSwgMHg3ZmZmLCAtMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5iaWFzKGRhdGFzWzJdLCAyLCAweDdmZmZmZmZmKSwKKyAgICAgICAgICAgICAgICBwYWNrc1syXSgtMSwgMHgxMjMzLCAweDQ1NjYsIC0weDQ1NjgsIDB4N2ZmZSwgMHg3ZmZmLCAtMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5iaWFzKGRhdGFzWzJdLCAyLCAtMHg4MDAwMDAwMCksCisgICAgICAgICAgICAgICAgZGF0YXNbMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5iaWFzKGRhdGFzWzRdLCA0LCAxKSwKKyAgICAgICAgICAgICAgICBwYWNrc1s0XSgxLCAweDEyMzQ1Njc5LCAweDQ1Njc4OWFjLCAtMHg0NTY3ODlhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAtMHg4MDAwMDAwMCwgLTB4N2ZmZmZmZmYsIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYmlhcyhkYXRhc1s0XSwgNCwgLTEpLAorICAgICAgICAgICAgICAgIHBhY2tzWzRdKC0xLCAweDEyMzQ1Njc3LCAweDQ1Njc4OWFhLCAtMHg0NTY3ODlhYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAweDdmZmZmZmZlLCAweDdmZmZmZmZmLCAtMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5iaWFzKGRhdGFzWzRdLCA0LCAweDdmZmZmZmZmKSwKKyAgICAgICAgICAgICAgICBwYWNrc1s0XSgweDdmZmZmZmZmLCAtMHg2ZGNiYTk4OSwgLTB4M2E5ODc2NTYsIDB4M2E5ODc2NTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgLTIsIC0xLCAweDdmZmZmZmZlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmJpYXMoZGF0YXNbNF0sIDQsIC0weDgwMDAwMDAwKSwKKyAgICAgICAgICAgICAgICBwYWNrc1s0XSgtMHg4MDAwMDAwMCwgLTB4NmRjYmE5ODgsIC0weDNhOTg3NjU1LCAweDNhOTg3NjU1LAorICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAwLCAweDdmZmZmZmZmKSkKIAogICAgIGRlZiB0ZXN0X2xpbjJsaW4oc2VsZik6Ci0gICAgICAgICMgdG9vIHNpbXBsZTogd2UgdGVzdCBvbmx5IHRoZSBzaXplCi0gICAgICAgIGZvciBkMSBpbiBkYXRhOgotICAgICAgICAgICAgZm9yIGQyIGluIGRhdGE6Ci0gICAgICAgICAgICAgICAgZ290ID0gbGVuKGQxKS8vMwotICAgICAgICAgICAgICAgIHd0ZCA9IGxlbihkMikvLzMKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhdWRpb29wLmxpbjJsaW4oZDEsIGdvdCwgd3RkKSksIGxlbihkMikpCisgICAgICAgIGZvciB3IGluIDEsIDIsIDQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubGluMmxpbihkYXRhc1t3XSwgdywgdyksIGRhdGFzW3ddKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4ybGluKGRhdGFzWzFdLCAxLCAyKSwKKyAgICAgICAgICAgIHBhY2tzWzJdKDAsIDB4MTIwMCwgMHg0NTAwLCAtMHg0NTAwLCAweDdmMDAsIC0weDgwMDAsIC0weDEwMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4ybGluKGRhdGFzWzFdLCAxLCA0KSwKKyAgICAgICAgICAgIHBhY2tzWzRdKDAsIDB4MTIwMDAwMDAsIDB4NDUwMDAwMDAsIC0weDQ1MDAwMDAwLAorICAgICAgICAgICAgICAgICAgICAgMHg3ZjAwMDAwMCwgLTB4ODAwMDAwMDAsIC0weDEwMDAwMDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubGluMmxpbihkYXRhc1syXSwgMiwgMSksCisgICAgICAgICAgICBiJ1x4MDBceDEyXHg0NVx4YmFceDdmXHg4MFx4ZmYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubGluMmxpbihkYXRhc1syXSwgMiwgNCksCisgICAgICAgICAgICBwYWNrc1s0XSgwLCAweDEyMzQwMDAwLCAweDQ1NjcwMDAwLCAtMHg0NTY3MDAwMCwKKyAgICAgICAgICAgICAgICAgICAgIDB4N2ZmZjAwMDAsIC0weDgwMDAwMDAwLCAtMHgxMDAwMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4ybGluKGRhdGFzWzRdLCA0LCAxKSwKKyAgICAgICAgICAgIGInXHgwMFx4MTJceDQ1XHhiYVx4N2ZceDgwXHhmZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4ybGluKGRhdGFzWzRdLCA0LCAyKSwKKyAgICAgICAgICAgIHBhY2tzWzJdKDAsIDB4MTIzNCwgMHg0NTY3LCAtMHg0NTY4LCAweDdmZmYsIC0weDgwMDAsIC0xKSkKIAogICAgIGRlZiB0ZXN0X2FkcGNtMmxpbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmFkcGNtMmxpbihiJ1x4MDdceDdmXHg3ZicsIDEsIE5vbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChiJ1x4MDBceDAwXHgwMFx4ZmZceDAwXHhmZicsICgtMTc5LCA0MCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYWRwY20ybGluKGInXHgwN1x4N2ZceDdmJywgMiwgTm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKHBhY2tzWzJdKDAsIDB4YiwgMHgyOSwgLTB4MTYsIDB4NzIsIC0weGIzKSwgKC0xNzksIDQwKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hZHBjbTJsaW4oYidceDA3XHg3Zlx4N2YnLCA0LCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAocGFja3NbNF0oMCwgMHhiMDAwMCwgMHgyOTAwMDAsIC0weDE2MDAwMCwgMHg3MjAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0weGIzMDAwMCksICgtMTc5LCA0MCkpKQorCiAgICAgICAgICMgVmVyeSBjdXJzb3J5IHRlc3QKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmFkcGNtMmxpbignXDBcMCcsIDEsIE5vbmUpLCAoJ1wwXDBcMFwwJywgKDAsMCkpKQorICAgICAgICBmb3IgdyBpbiAxLCAyLCA0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmFkcGNtMmxpbihiJ1wwJyAqIDUsIHcsIE5vbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYidcMCcgKiB3ICogMTAsICgwLCAwKSkpCiAKICAgICBkZWYgdGVzdF9saW4yYWRwY20oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4yYWRwY20oZGF0YXNbMV0sIDEsIE5vbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChiJ1x4MDdceDdmXHg3ZicsICgtMjIxLCAzOSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubGluMmFkcGNtKGRhdGFzWzJdLCAyLCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoYidceDA3XHg3Zlx4N2YnLCAoMzEsIDM5KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4yYWRwY20oZGF0YXNbNF0sIDQsIE5vbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChiJ1x4MDdceDdmXHg3ZicsICgzMSwgMzkpKSkKKwogICAgICAgICAjIFZlcnkgY3Vyc29yeSB0ZXN0Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4yYWRwY20oJ1wwXDBcMFwwJywgMSwgTm9uZSksICgnXDBcMCcsICgwLDApKSkKKyAgICAgICAgZm9yIHcgaW4gMSwgMiwgNDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4yYWRwY20oYidcMCcgKiB3ICogMTAsIHcsIE5vbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYidcMCcgKiA1LCAoMCwgMCkpKQogCiAgICAgZGVmIHRlc3RfbGluMmFsYXcoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4yYWxhdyhkYXRhWzBdLCAxKSwgJ1x4ZDVceGM1XHhmNScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4yYWxhdyhkYXRhWzFdLCAyKSwgJ1x4ZDVceGQ1XHhkNScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4yYWxhdyhkYXRhWzJdLCA0KSwgJ1x4ZDVceGQ1XHhkNScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4yYWxhdyhkYXRhc1sxXSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidceGQ1XHg4N1x4YTRceDI0XHhhYVx4MmFceDVhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmxpbjJhbGF3KGRhdGFzWzJdLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ1x4ZDVceDg3XHhhNFx4MjRceGFhXHgyYVx4NTUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubGluMmFsYXcoZGF0YXNbNF0sIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInXHhkNVx4ODdceGE0XHgyNFx4YWFceDJhXHg1NScpCiAKICAgICBkZWYgdGVzdF9hbGF3MmxpbihzZWxmKToKLSAgICAgICAgIyBDdXJzb3J5Ci0gICAgICAgIGQgPSBhdWRpb29wLmxpbjJhbGF3KGRhdGFbMF0sIDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hbGF3MmxpbihkLCAxKSwgZGF0YVswXSkKKyAgICAgICAgZW5jb2RlZCA9IGInXHgwMFx4MDNceDI0XHgyYVx4NTFceDU0XHg1NVx4NThceDZiXHg3MVx4N2YnXAorICAgICAgICAgICAgICAgICAgYidceDgwXHg4M1x4YTRceGFhXHhkMVx4ZDRceGQ1XHhkOFx4ZWJceGYxXHhmZicKKyAgICAgICAgc3JjID0gWy02ODgsIC03MjAsIC0yMjQwLCAtNDAzMiwgLTksIC0zLCAtMSwgLTI3LCAtMjQ0LCAtODIsIC0xMDYsCisgICAgICAgICAgICAgICA2ODgsIDcyMCwgMjI0MCwgNDAzMiwgOSwgMywgMSwgMjcsIDI0NCwgODIsIDEwNl0KKyAgICAgICAgZm9yIHcgaW4gMSwgMiwgNDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hbGF3MmxpbihlbmNvZGVkLCB3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja3Nbd10oKih4IDw8ICh3ICogOCkgPj4gMTMgZm9yIHggaW4gc3JjKSkpCisKKyAgICAgICAgZW5jb2RlZCA9ICcnLmpvaW4oY2hyKHgpIGZvciB4IGluIHhyYW5nZSgyNTYpKQorICAgICAgICBmb3IgdyBpbiAyLCA0OgorICAgICAgICAgICAgZGVjb2RlZCA9IGF1ZGlvb3AuYWxhdzJsaW4oZW5jb2RlZCwgdykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4yYWxhdyhkZWNvZGVkLCB3KSwgZW5jb2RlZCkKIAogICAgIGRlZiB0ZXN0X2xpbjJ1bGF3KHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubGluMnVsYXcoZGF0YVswXSwgMSksICdceGZmXHhlN1x4ZGInKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubGluMnVsYXcoZGF0YVsxXSwgMiksICdceGZmXHhmZlx4ZmYnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubGluMnVsYXcoZGF0YVsyXSwgNCksICdceGZmXHhmZlx4ZmYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubGluMnVsYXcoZGF0YXNbMV0sIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInXHhmZlx4YWRceDhlXHgwZVx4ODBceDAwXHg2NycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4ydWxhdyhkYXRhc1syXSwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidceGZmXHhhZFx4OGVceDBlXHg4MFx4MDBceDdlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmxpbjJ1bGF3KGRhdGFzWzRdLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ1x4ZmZceGFkXHg4ZVx4MGVceDgwXHgwMFx4N2UnKQogCiAgICAgZGVmIHRlc3RfdWxhdzJsaW4oc2VsZik6Ci0gICAgICAgICMgQ3Vyc29yeQotICAgICAgICBkID0gYXVkaW9vcC5saW4ydWxhdyhkYXRhWzBdLCAxKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AudWxhdzJsaW4oZCwgMSksIGRhdGFbMF0pCisgICAgICAgIGVuY29kZWQgPSBiJ1x4MDBceDBlXHgyOFx4M2ZceDU3XHg2YVx4NzZceDdjXHg3ZVx4N2YnXAorICAgICAgICAgICAgICAgICAgYidceDgwXHg4ZVx4YThceGJmXHhkN1x4ZWFceGY2XHhmY1x4ZmVceGZmJworICAgICAgICBzcmMgPSBbLTgwMzEsIC00NDQ3LCAtMTQ3MSwgLTQ5NSwgLTE2MywgLTUzLCAtMTgsIC02LCAtMiwgMCwKKyAgICAgICAgICAgICAgIDgwMzEsIDQ0NDcsIDE0NzEsIDQ5NSwgMTYzLCA1MywgMTgsIDYsIDIsIDBdCisgICAgICAgIGZvciB3IGluIDEsIDIsIDQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AudWxhdzJsaW4oZW5jb2RlZCwgdyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tzW3ddKCooeCA8PCAodyAqIDgpID4+IDE0IGZvciB4IGluIHNyYykpKQorCisgICAgICAgICMgQ3VycmVudCB1LWxhdyBpbXBsZW1lbnRhdGlvbiBoYXMgdHdvIGNvZGVzIGZvIDA6IDB4N2YgYW5kIDB4ZmYuCisgICAgICAgIGVuY29kZWQgPSAnJy5qb2luKGNocih4KSBmb3IgeCBpbiByYW5nZSgxMjcpICsgcmFuZ2UoMTI4LCAyNTYpKQorICAgICAgICBmb3IgdyBpbiAyLCA0OgorICAgICAgICAgICAgZGVjb2RlZCA9IGF1ZGlvb3AudWxhdzJsaW4oZW5jb2RlZCwgdykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4ydWxhdyhkZWNvZGVkLCB3KSwgZW5jb2RlZCkKIAogICAgIGRlZiB0ZXN0X211bChzZWxmKToKLSAgICAgICAgZGF0YTIgPSBbXQotICAgICAgICBmb3IgZCBpbiBkYXRhOgotICAgICAgICAgICAgc3RyID0gJycKLSAgICAgICAgICAgIGZvciBzIGluIGQ6Ci0gICAgICAgICAgICAgICAgc3RyID0gc3RyICsgY2hyKG9yZChzKSoyKQotICAgICAgICAgICAgZGF0YTIuYXBwZW5kKHN0cikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm11bChkYXRhWzBdLCAxLCAyKSwgZGF0YTJbMF0pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5tdWwoZGF0YVsxXSwyLCAyKSwgZGF0YTJbMV0pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5tdWwoZGF0YVsyXSwgNCwgMiksIGRhdGEyWzJdKQorICAgICAgICBmb3IgdyBpbiAxLCAyLCA0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm11bChiJycsIHcsIDIpLCBiJycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubXVsKGRhdGFzW3ddLCB3LCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYidcMCcgKiBsZW4oZGF0YXNbd10pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm11bChkYXRhc1t3XSwgdywgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzW3ddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubXVsKGRhdGFzWzFdLCAxLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ1x4MDBceDI0XHg3Zlx4ODBceDdmXHg4MFx4ZmUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubXVsKGRhdGFzWzJdLCAyLCAyKSwKKyAgICAgICAgICAgICAgICBwYWNrc1syXSgwLCAweDI0NjgsIDB4N2ZmZiwgLTB4ODAwMCwgMHg3ZmZmLCAtMHg4MDAwLCAtMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5tdWwoZGF0YXNbNF0sIDQsIDIpLAorICAgICAgICAgICAgICAgIHBhY2tzWzRdKDAsIDB4MjQ2OGFjZjAsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwLCAtMikpCiAKICAgICBkZWYgdGVzdF9yYXRlY3Yoc2VsZik6CisgICAgICAgIGZvciB3IGluIDEsIDIsIDQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AucmF0ZWN2KGInJywgdywgMSwgODAwMCwgODAwMCwgTm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiJycsICgtMSwgKCgwLCAwKSwpKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AucmF0ZWN2KGInJywgdywgNSwgODAwMCwgODAwMCwgTm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiJycsICgtMSwgKCgwLCAwKSwpICogNSkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLnJhdGVjdihiJycsIHcsIDEsIDgwMDAsIDE2MDAwLCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGInJywgKC0yLCAoKDAsIDApLCkpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5yYXRlY3YoZGF0YXNbd10sIHcsIDEsIDgwMDAsIDgwMDAsIE5vbmUpWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhc1t3XSkKICAgICAgICAgc3RhdGUgPSBOb25lCi0gICAgICAgIGQxLCBzdGF0ZSA9IGF1ZGlvb3AucmF0ZWN2KGRhdGFbMF0sIDEsIDEsIDgwMDAsIDE2MDAwLCBzdGF0ZSkKLSAgICAgICAgZDIsIHN0YXRlID0gYXVkaW9vcC5yYXRlY3YoZGF0YVswXSwgMSwgMSwgODAwMCwgMTYwMDAsIHN0YXRlKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxICsgZDIsICdcMDAwXDAwMFwwMDFcMDAxXDAwMlwwMDFcMDAwXDAwMFwwMDFcMDAxXDAwMicpCisgICAgICAgIGQxLCBzdGF0ZSA9IGF1ZGlvb3AucmF0ZWN2KGInXHgwMFx4MDFceDAyJywgMSwgMSwgODAwMCwgMTYwMDAsIHN0YXRlKQorICAgICAgICBkMiwgc3RhdGUgPSBhdWRpb29wLnJhdGVjdihiJ1x4MDBceDAxXHgwMicsIDEsIDEsIDgwMDAsIDE2MDAwLCBzdGF0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMSArIGQyLCBiJ1wwMDBcMDAwXDAwMVwwMDFcMDAyXDAwMVwwMDBcMDAwXDAwMVwwMDFcMDAyJykKKworICAgICAgICBmb3IgdyBpbiAxLCAyLCA0OgorICAgICAgICAgICAgZDAsIHN0YXRlMCA9IGF1ZGlvb3AucmF0ZWN2KGRhdGFzW3ddLCB3LCAxLCA4MDAwLCAxNjAwMCwgTm9uZSkKKyAgICAgICAgICAgIGQsIHN0YXRlID0gYicnLCBOb25lCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4oZGF0YXNbd10pLCB3KToKKyAgICAgICAgICAgICAgICBkMSwgc3RhdGUgPSBhdWRpb29wLnJhdGVjdihkYXRhc1t3XVtpOmkgKyB3XSwgdywgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MDAwLCAxNjAwMCwgc3RhdGUpCisgICAgICAgICAgICAgICAgZCArPSBkMQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBkMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdGUsIHN0YXRlMCkKIAogICAgIGRlZiB0ZXN0X3JldmVyc2Uoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5yZXZlcnNlKGRhdGFbMF0sIDEpLCAnXDJcMVwwJykKKyAgICAgICAgZm9yIHcgaW4gMSwgMiwgNDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5yZXZlcnNlKGInJywgdyksIGInJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5yZXZlcnNlKHBhY2tzW3ddKDAsIDEsIDIpLCB3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja3Nbd10oMiwgMSwgMCkpCiAKICAgICBkZWYgdGVzdF90b21vbm8oc2VsZik6Ci0gICAgICAgIGRhdGEyID0gJycKLSAgICAgICAgZm9yIGQgaW4gZGF0YVswXToKLSAgICAgICAgICAgIGRhdGEyID0gZGF0YTIgKyBkICsgZAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AudG9tb25vKGRhdGEyLCAxLCAwLjUsIDAuNSksIGRhdGFbMF0pCisgICAgICAgIGZvciB3IGluIDEsIDIsIDQ6CisgICAgICAgICAgICBkYXRhMSA9IGRhdGFzW3ddCisgICAgICAgICAgICBkYXRhMiA9IGJ5dGVhcnJheSgyICogbGVuKGRhdGExKSkKKyAgICAgICAgICAgIGZvciBrIGluIHJhbmdlKHcpOgorICAgICAgICAgICAgICAgIGRhdGEyW2s6OjIqd10gPSBkYXRhMVtrOjp3XQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLnRvbW9ubyhzdHIoZGF0YTIpLCB3LCAxLCAwKSwgZGF0YTEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AudG9tb25vKHN0cihkYXRhMiksIHcsIDAsIDEpLCBiJ1wwJyAqIGxlbihkYXRhMSkpCisgICAgICAgICAgICBmb3IgayBpbiByYW5nZSh3KToKKyAgICAgICAgICAgICAgICBkYXRhMltrK3c6OjIqd10gPSBkYXRhMVtrOjp3XQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLnRvbW9ubyhzdHIoZGF0YTIpLCB3LCAwLjUsIDAuNSksIGRhdGExKQogCiAgICAgZGVmIHRlc3RfdG9zdGVyZW8oc2VsZik6Ci0gICAgICAgIGRhdGEyID0gJycKLSAgICAgICAgZm9yIGQgaW4gZGF0YVswXToKLSAgICAgICAgICAgIGRhdGEyID0gZGF0YTIgKyBkICsgZAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AudG9zdGVyZW8oZGF0YVswXSwgMSwgMSwgMSksIGRhdGEyKQorICAgICAgICBmb3IgdyBpbiAxLCAyLCA0OgorICAgICAgICAgICAgZGF0YTEgPSBkYXRhc1t3XQorICAgICAgICAgICAgZGF0YTIgPSBieXRlYXJyYXkoMiAqIGxlbihkYXRhMSkpCisgICAgICAgICAgICBmb3IgayBpbiByYW5nZSh3KToKKyAgICAgICAgICAgICAgICBkYXRhMltrOjoyKnddID0gZGF0YTFbazo6d10KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC50b3N0ZXJlbyhkYXRhMSwgdywgMSwgMCksIGRhdGEyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLnRvc3RlcmVvKGRhdGExLCB3LCAwLCAwKSwgYidcMCcgKiBsZW4oZGF0YTIpKQorICAgICAgICAgICAgZm9yIGsgaW4gcmFuZ2Uodyk6CisgICAgICAgICAgICAgICAgZGF0YTJbayt3OjoyKnddID0gZGF0YTFbazo6d10KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC50b3N0ZXJlbyhkYXRhMSwgdywgMSwgMSksIGRhdGEyKQogCiAgICAgZGVmIHRlc3RfZmluZGZhY3RvcihzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmZpbmRmYWN0b3IoZGF0YVsxXSwgZGF0YVsxXSksIDEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmZpbmRmYWN0b3IoZGF0YXNbMl0sIGRhdGFzWzJdKSwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuZmluZGZhY3RvcihiJ1wwJyAqIGxlbihkYXRhc1syXSksIGRhdGFzWzJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLjApCiAKICAgICBkZWYgdGVzdF9maW5kZml0KHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuZmluZGZpdChkYXRhWzFdLCBkYXRhWzFdKSwgKDAsIDEuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5maW5kZml0KGRhdGFzWzJdLCBkYXRhc1syXSksICgwLCAxLjApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuZmluZGZpdChkYXRhc1syXSwgcGFja3NbMl0oMSwgMiwgMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgxLCA4MDM4LjgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuZmluZGZpdChkYXRhc1syXVs6LTJdICogNSArIGRhdGFzWzJdLCBkYXRhc1syXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKDMwLCAxLjApKQogCiAgICAgZGVmIHRlc3RfZmluZG1heChzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmZpbmRtYXgoZGF0YVsxXSwgMSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5maW5kbWF4KGRhdGFzWzJdLCAxKSwgNSkKIAogICAgIGRlZiB0ZXN0X2dldHNhbXBsZShzZWxmKToKLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMyk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuZ2V0c2FtcGxlKGRhdGFbMF0sIDEsIGkpLCBpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmdldHNhbXBsZShkYXRhWzFdLCAyLCBpKSwgaSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5nZXRzYW1wbGUoZGF0YVsyXSwgNCwgaSksIGkpCisgICAgICAgIGZvciB3IGluIDEsIDIsIDQ6CisgICAgICAgICAgICBkYXRhID0gcGFja3Nbd10oMCwgMSwgLTEsIG1heHZhbHVlc1t3XSwgbWludmFsdWVzW3ddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmdldHNhbXBsZShkYXRhLCB3LCAwKSwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5nZXRzYW1wbGUoZGF0YSwgdywgMSksIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuZ2V0c2FtcGxlKGRhdGEsIHcsIDIpLCAtMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5nZXRzYW1wbGUoZGF0YSwgdywgMyksIG1heHZhbHVlc1t3XSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5nZXRzYW1wbGUoZGF0YSwgdywgNCksIG1pbnZhbHVlc1t3XSkKIAogICAgIGRlZiB0ZXN0X25lZ2F0aXZlbGVuKHNlbGYpOgogICAgICAgICAjIGZyb20gaXNzdWUgMzMwNiwgcHJldmlvdXNseSBpdCBzZWdmYXVsdGVkCkBAIC0xOTMsMTAgKzM3NSwxNSBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYXVkaW9vcC5lcnJvciwgYXVkaW9vcC5saW4ybGluLCBkYXRhLCBzaXplLCBzaXplMikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGF1ZGlvb3AuZXJyb3IsIGF1ZGlvb3AucmF0ZWN2LCBkYXRhLCBzaXplLCAxLCAxLCAxLCBzdGF0ZSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGF1ZGlvb3AuZXJyb3IsIGF1ZGlvb3AubGluMnVsYXcsIGRhdGEsIHNpemUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhdWRpb29wLmVycm9yLCBhdWRpb29wLnVsYXcybGluLCBkYXRhLCBzaXplKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYXVkaW9vcC5lcnJvciwgYXVkaW9vcC5saW4yYWxhdywgZGF0YSwgc2l6ZSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGF1ZGlvb3AuZXJyb3IsIGF1ZGlvb3AuYWxhdzJsaW4sIGRhdGEsIHNpemUpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhdWRpb29wLmVycm9yLCBhdWRpb29wLmxpbjJhZHBjbSwgZGF0YSwgc2l6ZSwgc3RhdGUpCisKKyAgICBkZWYgdGVzdF93cm9uZ3NpemUoc2VsZik6CisgICAgICAgIGRhdGEgPSBiJ2FiY2RlZmdoJworICAgICAgICBzdGF0ZSA9IE5vbmUKKyAgICAgICAgZm9yIHNpemUgaW4gKC0xLCAwLCAzLCA1LCAxMDI0KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGF1ZGlvb3AuZXJyb3IsIGF1ZGlvb3AudWxhdzJsaW4sIGRhdGEsIHNpemUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhdWRpb29wLmVycm9yLCBhdWRpb29wLmFsYXcybGluLCBkYXRhLCBzaXplKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYXVkaW9vcC5lcnJvciwgYXVkaW9vcC5hZHBjbTJsaW4sIGRhdGEsIHNpemUsIHN0YXRlKQogCiBkZWYgdGVzdF9tYWluKCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Jhc2U2NC5weSBiL0xpYi90ZXN0L3Rlc3RfYmFzZTY0LnB5CmluZGV4IGZmMmMzNzAuLjNmMmNlZTQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYmFzZTY0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYmFzZTY0LnB5CkBAIC0xOCw2ICsxOCw4IEBACiAgICAgICAgICAgICJZV0pqWkdWbVoyaHBhbXRzYlc1dmNIRnljM1IxZG5kNGVYcEJRa05FIgogICAgICAgICAgICAiUlVaSFNFbEtTMHhOVGs5UVVWSlRWRlZXVjFoWldqQXhNak0wXG5OVCIKICAgICAgICAgICAgIlkzT0RraFFDTXdYaVlxS0NrN09qdytMQzRnVzExN2ZRPT1cbiIpCisgICAgICAgICMgTm9uLWJ5dGVzCisgICAgICAgIGVxKGJhc2U2NC5lbmNvZGVzdHJpbmcoYnl0ZWFycmF5KCdhYmMnKSksICdZV0pqXG4nKQogCiAgICAgZGVmIHRlc3RfZGVjb2Rlc3RyaW5nKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKQEAgLTMyLDYgKzM0LDggQEAKICAgICAgICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIgogICAgICAgICAgICAiMDEyMzQ1Njc4OSFAIzBeJiooKTs6PD4sLiBbXXt9IikKICAgICAgICAgZXEoYmFzZTY0LmRlY29kZXN0cmluZygnJyksICcnKQorICAgICAgICAjIE5vbi1ieXRlcworICAgICAgICBlcShiYXNlNjQuZGVjb2Rlc3RyaW5nKGJ5dGVhcnJheSgiWVdKalxuIikpLCAiYWJjIikKIAogICAgIGRlZiB0ZXN0X2VuY29kZShzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCkBAIC03Myw2ICs3NywxMCBAQAogICAgICAgICAgICAiWTNPRGtoUUNNd1hpWXFLQ2s3T2p3K0xDNGdXMTE3ZlE9PSIpCiAgICAgICAgICMgVGVzdCB3aXRoIGFyYml0cmFyeSBhbHRlcm5hdGl2ZSBjaGFyYWN0ZXJzCiAgICAgICAgIGVxKGJhc2U2NC5iNjRlbmNvZGUoJ1x4ZDNWXHhiZW9ceGY3XHgxZCcsIGFsdGNoYXJzPScqJCcpLCAnMDFhKmIkY2QnKQorICAgICAgICAjIE5vbi1ieXRlcworICAgICAgICBlcShiYXNlNjQuYjY0ZW5jb2RlKGJ5dGVhcnJheSgnYWJjZCcpKSwgJ1lXSmpaQT09JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBiYXNlNjQuYjY0ZW5jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnXHhkM1ZceGJlb1x4ZjdceDFkJywgYWx0Y2hhcnM9Ynl0ZWFycmF5KCcqJCcpKQogICAgICAgICAjIFRlc3Qgc3RhbmRhcmQgYWxwaGFiZXQKICAgICAgICAgZXEoYmFzZTY0LnN0YW5kYXJkX2I2NGVuY29kZSgid3d3LnB5dGhvbi5vcmciKSwgImQzZDNMbkI1ZEdodmJpNXZjbWM9IikKICAgICAgICAgZXEoYmFzZTY0LnN0YW5kYXJkX2I2NGVuY29kZSgiYSIpLCAiWVE9PSIpCkBAIC04NSw4ICs5MywxMiBAQAogICAgICAgICAgICAiWVdKalpHVm1aMmhwYW10c2JXNXZjSEZ5YzNSMWRuZDRlWHBCUWtORSIKICAgICAgICAgICAgIlJVWkhTRWxLUzB4TlRrOVFVVkpUVkZWV1YxaFpXakF4TWpNME5UIgogICAgICAgICAgICAiWTNPRGtoUUNNd1hpWXFLQ2s3T2p3K0xDNGdXMTE3ZlE9PSIpCisgICAgICAgICMgTm9uLWJ5dGVzCisgICAgICAgIGVxKGJhc2U2NC5zdGFuZGFyZF9iNjRlbmNvZGUoYnl0ZWFycmF5KCdhYmNkJykpLCAnWVdKalpBPT0nKQogICAgICAgICAjIFRlc3Qgd2l0aCAnVVJMIHNhZmUnIGFsdGVybmF0aXZlIGNoYXJhY3RlcnMKICAgICAgICAgZXEoYmFzZTY0LnVybHNhZmVfYjY0ZW5jb2RlKCdceGQzVlx4YmVvXHhmN1x4MWQnKSwgJzAxYS1iX2NkJykKKyAgICAgICAgIyBOb24tYnl0ZXMKKyAgICAgICAgZXEoYmFzZTY0LnVybHNhZmVfYjY0ZW5jb2RlKGJ5dGVhcnJheSgnXHhkM1ZceGJlb1x4ZjdceDFkJykpLCAnMDFhLWJfY2QnKQogCiAgICAgZGVmIHRlc3RfYjY0ZGVjb2RlKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKQEAgLTEwNCw2ICsxMTYsOCBAQAogICAgICAgICBlcShiYXNlNjQuYjY0ZGVjb2RlKCcnKSwgJycpCiAgICAgICAgICMgVGVzdCB3aXRoIGFyYml0cmFyeSBhbHRlcm5hdGl2ZSBjaGFyYWN0ZXJzCiAgICAgICAgIGVxKGJhc2U2NC5iNjRkZWNvZGUoJzAxYSpiJGNkJywgYWx0Y2hhcnM9JyokJyksICdceGQzVlx4YmVvXHhmN1x4MWQnKQorICAgICAgICAjIE5vbi1ieXRlcworICAgICAgICBlcShiYXNlNjQuYjY0ZGVjb2RlKGJ5dGVhcnJheSgiWVdKaiIpKSwgImFiYyIpCiAgICAgICAgICMgVGVzdCBzdGFuZGFyZCBhbHBoYWJldAogICAgICAgICBlcShiYXNlNjQuc3RhbmRhcmRfYjY0ZGVjb2RlKCJkM2QzTG5CNWRHaHZiaTV2Y21jPSIpLCAid3d3LnB5dGhvbi5vcmciKQogICAgICAgICBlcShiYXNlNjQuc3RhbmRhcmRfYjY0ZGVjb2RlKCJZUT09IiksICJhIikKQEAgLTExNiw4ICsxMzAsMTIgQEAKICAgICAgICAgICAgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IgogICAgICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiCiAgICAgICAgICAgICIwMTIzNDU2Nzg5IUAjMF4mKigpOzo8PiwuIFtde30iKQorICAgICAgICAjIE5vbi1ieXRlcworICAgICAgICBlcShiYXNlNjQuc3RhbmRhcmRfYjY0ZGVjb2RlKGJ5dGVhcnJheSgiWVdKaiIpKSwgImFiYyIpCiAgICAgICAgICMgVGVzdCB3aXRoICdVUkwgc2FmZScgYWx0ZXJuYXRpdmUgY2hhcmFjdGVycwogICAgICAgICBlcShiYXNlNjQudXJsc2FmZV9iNjRkZWNvZGUoJzAxYS1iX2NkJyksICdceGQzVlx4YmVvXHhmN1x4MWQnKQorICAgICAgICAjIE5vbi1ieXRlcworICAgICAgICBlcShiYXNlNjQudXJsc2FmZV9iNjRkZWNvZGUoYnl0ZWFycmF5KCcwMWEtYl9jZCcpKSwgJ1x4ZDNWXHhiZW9ceGY3XHgxZCcpCiAKICAgICBkZWYgdGVzdF9iNjRkZWNvZGVfZXJyb3Ioc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYmFzZTY0LmI2NGRlY29kZSwgJ2FiYycpCkBAIC0xMzEsNiArMTQ5LDggQEAKICAgICAgICAgZXEoYmFzZTY0LmIzMmVuY29kZSgnYWJjJyksICdNRlJHRz09PScpCiAgICAgICAgIGVxKGJhc2U2NC5iMzJlbmNvZGUoJ2FiY2QnKSwgJ01GUkdHWkE9JykKICAgICAgICAgZXEoYmFzZTY0LmIzMmVuY29kZSgnYWJjZGUnKSwgJ01GUkdHWkRGJykKKyAgICAgICAgIyBOb24tYnl0ZXMKKyAgICAgICAgZXEoYmFzZTY0LmIzMmVuY29kZShieXRlYXJyYXkoJ2FiY2QnKSksICdNRlJHR1pBPScpCiAKICAgICBkZWYgdGVzdF9iMzJkZWNvZGUoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbApAQCAtMTQxLDYgKzE2MSw4IEBACiAgICAgICAgIGVxKGJhc2U2NC5iMzJkZWNvZGUoJ01GUkdHPT09JyksICdhYmMnKQogICAgICAgICBlcShiYXNlNjQuYjMyZGVjb2RlKCdNRlJHR1pBPScpLCAnYWJjZCcpCiAgICAgICAgIGVxKGJhc2U2NC5iMzJkZWNvZGUoJ01GUkdHWkRGJyksICdhYmNkZScpCisgICAgICAgICMgTm9uLWJ5dGVzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYmFzZTY0LmIzMmRlY29kZSwgYnl0ZWFycmF5KCdNRlJHRz09PScpKQogCiAgICAgZGVmIHRlc3RfYjMyZGVjb2RlX2Nhc2Vmb2xkKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKQEAgLTE3MSw2ICsxOTMsOCBAQAogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKICAgICAgICAgZXEoYmFzZTY0LmIxNmVuY29kZSgnXHgwMVx4MDJceGFiXHhjZFx4ZWYnKSwgJzAxMDJBQkNERUYnKQogICAgICAgICBlcShiYXNlNjQuYjE2ZW5jb2RlKCdceDAwJyksICcwMCcpCisgICAgICAgICMgTm9uLWJ5dGVzCisgICAgICAgIGVxKGJhc2U2NC5iMTZlbmNvZGUoYnl0ZWFycmF5KCdceDAxXHgwMlx4YWJceGNkXHhlZicpKSwgJzAxMDJBQkNERUYnKQogCiAgICAgZGVmIHRlc3RfYjE2ZGVjb2RlKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKQEAgLTE4MCw2ICsyMDQsOCBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJhc2U2NC5iMTZkZWNvZGUsICcwMTAyYWJjZGVmJykKICAgICAgICAgIyBDYXNlIGZvbGQKICAgICAgICAgZXEoYmFzZTY0LmIxNmRlY29kZSgnMDEwMmFiY2RlZicsIFRydWUpLCAnXHgwMVx4MDJceGFiXHhjZFx4ZWYnKQorICAgICAgICAjIE5vbi1ieXRlcworICAgICAgICBlcShiYXNlNjQuYjE2ZGVjb2RlKGJ5dGVhcnJheSgiMDEwMkFCQ0RFRiIpKSwgJ1x4MDFceDAyXHhhYlx4Y2RceGVmJykKIAogCiAMCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2JpZ21lbS5weSBiL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5CmluZGV4IGM1NjAxNjcuLmM0MWMzNzMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5CkBAIC0xMTgsMTIgKzExOCwxMyBAQAogICAgICAgICBleGNlcHQgTWVtb3J5RXJyb3I6CiAgICAgICAgICAgICBwYXNzICMgYWNjZXB0YWJsZSBvbiAzMi1iaXQKIAotICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzJHLTEsIG1lbXVzZT0yKQorICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzJHLTEsIG1lbXVzZT00KQogICAgIGRlZiB0ZXN0X2RlY29kZWFzY2lpKHNlbGYsIHNpemUpOgogICAgICAgICByZXR1cm4gc2VsZi5iYXNpY19lbmNvZGVfdGVzdChzaXplLCAnYXNjaWknLCBjPSdBJykKIAogICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzRHIC8vIDUsIG1lbXVzZT02KzIpCiAgICAgZGVmIHRlc3RfdW5pY29kZV9yZXByX29mbHcoc2VsZiwgc2l6ZSk6CisgICAgICAgIHNlbGYuc2tpcFRlc3QoInRlc3QgY3Jhc2hlcyAtIHNlZSBpc3N1ZSAjMTQ5MDQiKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzID0gdSJcdUFBQUEiKnNpemUKICAgICAgICAgICAgIHIgPSByZXByKHMpCkBAIC00ODUsNyArNDg2LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmNvdW50KCcuJyksIDMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5jb3VudCgnLScpLCBzaXplICogMikKIAotICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMTAsIG1lbXVzZT0yKQorICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMTAsIG1lbXVzZT01KQogICAgIGRlZiB0ZXN0X3JlcHJfc21hbGwoc2VsZiwgc2l6ZSk6CiAgICAgICAgIHMgPSAnLScgKiBzaXplCiAgICAgICAgIHMgPSByZXByKHMpCkBAIC00OTcsNyArNDk4LDYgQEAKICAgICAgICAgIyByZXByKCkgd2lsbCBjcmVhdGUgYSBzdHJpbmcgZm91ciB0aW1lcyBhcyBsYXJnZSBhcyB0aGlzICdiaW5hcnkKICAgICAgICAgIyBzdHJpbmcnLCBidXQgd2UgZG9uJ3Qgd2FudCB0byBhbGxvY2F0ZSBtdWNoIG1vcmUgdGhhbiB0d2ljZQogICAgICAgICAjIHNpemUgaW4gdG90YWwuICAoV2UgZG8gZXh0cmEgdGVzdGluZyBpbiB0ZXN0X3JlcHJfbGFyZ2UoKSkKLSAgICAgICAgc2l6ZSA9IHNpemUgLy8gNSAqIDIKICAgICAgICAgcyA9ICdceDAwJyAqIHNpemUKICAgICAgICAgcyA9IHJlcHIocykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIHNpemUgKiA0ICsgMikKQEAgLTU0MSw3ICs1NDEsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgc2l6ZSAqIDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5jb3VudCgnLicpLCBzaXplICogMikKIAotICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMjAsIG1lbXVzZT0xKQorICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMjAsIG1lbXVzZT0yKQogICAgIGRlZiB0ZXN0X3NsaWNlX2FuZF9nZXRpdGVtKHNlbGYsIHNpemUpOgogICAgICAgICBTVUJTVFIgPSAnMDEyMzQ1Njc4OScKICAgICAgICAgc3VibGVuID0gbGVuKFNVQlNUUikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYmluaGV4LnB5IGIvTGliL3Rlc3QvdGVzdF9iaW5oZXgucHkKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAyZjg5NzAzLi4xZjZhMGFhCi0tLSBhL0xpYi90ZXN0L3Rlc3RfYmluaGV4LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYmluaGV4LnB5CkBAIC0xLDQgKzEsMyBAQAotIyEgL3Vzci9iaW4vZW52IHB5dGhvbgogIiIiVGVzdCBzY3JpcHQgZm9yIHRoZSBiaW5oZXggQyBtb2R1bGUKIAogICAgVXNlcyB0aGUgbWVjaGFuaXNtIG9mIHRoZSBweXRob24gYmluaGV4IG1vZHVsZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9iaXNlY3QucHkgYi9MaWIvdGVzdC90ZXN0X2Jpc2VjdC5weQppbmRleCA5MzRiYThjLi41YzMzMzBiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Jpc2VjdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Jpc2VjdC5weQpAQCAtMjMsNiArMjMsMjggQEAKIGltcG9ydCBiaXNlY3QgYXMgY19iaXNlY3QKIAogCitjbGFzcyBSYW5nZShvYmplY3QpOgorICAgICIiIkEgdHJpdmlhbCB4cmFuZ2UoKS1saWtlIG9iamVjdCB3aXRob3V0IGFueSBpbnRlZ2VyIHdpZHRoIGxpbWl0YXRpb25zLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGFydCwgc3RvcCk6CisgICAgICAgIHNlbGYuc3RhcnQgPSBzdGFydAorICAgICAgICBzZWxmLnN0b3AgPSBzdG9wCisgICAgICAgIHNlbGYubGFzdF9pbnNlcnQgPSBOb25lCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc3RvcCAtIHNlbGYuc3RhcnQKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpZHgpOgorICAgICAgICBuID0gc2VsZi5zdG9wIC0gc2VsZi5zdGFydAorICAgICAgICBpZiBpZHggPCAwOgorICAgICAgICAgICAgaWR4ICs9IG4KKyAgICAgICAgaWYgaWR4ID49IG46CisgICAgICAgICAgICByYWlzZSBJbmRleEVycm9yKGlkeCkKKyAgICAgICAgcmV0dXJuIHNlbGYuc3RhcnQgKyBpZHgKKworICAgIGRlZiBpbnNlcnQoc2VsZiwgaWR4LCBpdGVtKToKKyAgICAgICAgc2VsZi5sYXN0X2luc2VydCA9IGlkeCwgaXRlbQorCisKIGNsYXNzIFRlc3RCaXNlY3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIG1vZHVsZSA9IE5vbmUKIApAQCAtMTIyLDYgKzE0NCwzNSBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtb2QuaW5zb3J0X2xlZnQsIFsxLCAyLCAzXSwgNSwgLTEsIDMpLAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtb2QuaW5zb3J0X3JpZ2h0LCBbMSwgMiwgM10sIDUsIC0xLCAzKSwKIAorICAgIGRlZiB0ZXN0X2xhcmdlX3JhbmdlKHNlbGYpOgorICAgICAgICAjIElzc3VlIDEzNDk2CisgICAgICAgIG1vZCA9IHNlbGYubW9kdWxlCisgICAgICAgIG4gPSBzeXMubWF4c2l6ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkYXRhID0geHJhbmdlKG4tMSkKKyAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJjYW4ndCBjcmVhdGUgYSB4cmFuZ2UoKSBvYmplY3Qgb2Ygc2l6ZSBgc3lzLm1heHNpemVgIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2QuYmlzZWN0X2xlZnQoZGF0YSwgbi0zKSwgbi0zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5iaXNlY3RfcmlnaHQoZGF0YSwgbi0zKSwgbi0yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5iaXNlY3RfbGVmdChkYXRhLCBuLTMsIG4tMTAsIG4pLCBuLTMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLmJpc2VjdF9yaWdodChkYXRhLCBuLTMsIG4tMTAsIG4pLCBuLTIpCisKKyAgICBkZWYgdGVzdF9sYXJnZV9weXJhbmdlKHNlbGYpOgorICAgICAgICAjIFNhbWUgYXMgYWJvdmUsIGJ1dCB3aXRob3V0IEMtaW1wb3NlZCBsaW1pdHMgb24gcmFuZ2UoKSBwYXJhbWV0ZXJzCisgICAgICAgIG1vZCA9IHNlbGYubW9kdWxlCisgICAgICAgIG4gPSBzeXMubWF4c2l6ZQorICAgICAgICBkYXRhID0gUmFuZ2UoMCwgbi0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5iaXNlY3RfbGVmdChkYXRhLCBuLTMpLCBuLTMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLmJpc2VjdF9yaWdodChkYXRhLCBuLTMpLCBuLTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLmJpc2VjdF9sZWZ0KGRhdGEsIG4tMywgbi0xMCwgbiksIG4tMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2QuYmlzZWN0X3JpZ2h0KGRhdGEsIG4tMywgbi0xMCwgbiksIG4tMikKKyAgICAgICAgeCA9IG4gLSAxMDAKKyAgICAgICAgbW9kLmluc29ydF9sZWZ0KGRhdGEsIHgsIHggLSA1MCwgeCArIDUwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEubGFzdF9pbnNlcnQsICh4LCB4KSkKKyAgICAgICAgeCA9IG4gLSAyMDAKKyAgICAgICAgbW9kLmluc29ydF9yaWdodChkYXRhLCB4LCB4IC0gNTAsIHggKyA1MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLmxhc3RfaW5zZXJ0LCAoeCArIDEsIHgpKQorCiAgICAgZGVmIHRlc3RfcmFuZG9tKHNlbGYsIG49MjUpOgogICAgICAgICBmcm9tIHJhbmRvbSBpbXBvcnQgcmFuZHJhbmdlCiAgICAgICAgIGZvciBpIGluIHhyYW5nZShuKToKQEAgLTE5MSw3ICsyNDIsNyBAQAogICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIGYgPSBzZWxmLm1vZHVsZS5pbnNvcnRfcmlnaHQKICAgICAgICAgICAgICAgICBmKGluc29ydGVkLCBkaWdpdCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQoaW5zb3J0ZWQpLCBpbnNvcnRlZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGluc29ydGVkKSwgaW5zb3J0ZWQpCiAKICAgICBkZWYgdGVzdF9iYWNrY29tcGF0aWJpbGl0eShzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm1vZHVsZS5pbnNvcnQsIHNlbGYubW9kdWxlLmluc29ydF9yaWdodCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYnNkZGIucHkgYi9MaWIvdGVzdC90ZXN0X2JzZGRiLnB5Cm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZDFlZTBhMS4uM2ZmMDIwYQotLS0gYS9MaWIvdGVzdC90ZXN0X2JzZGRiLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYnNkZGIucHkKQEAgLTEsNCArMSwzIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCiAiIiJUZXN0IHNjcmlwdCBmb3IgdGhlIGJzZGRiIEMgbW9kdWxlIGJ5IFJvZ2VyIEUuIE1hc3NlCiAgICBBZGFwdGVkIHRvIHVuaXR0ZXN0IGZvcm1hdCBhbmQgZXhwYW5kZWQgc2NvcGUgYnkgUmF5bW9uZCBIZXR0aW5nZXIKICIiIgpAQCAtNDcsMTAgKzQ2LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRJbignZGlzY292ZXJlZCcsIHNlbGYuZi52YWx1ZXMoKSkKIAogICAgIGRlZiB0ZXN0X2Nsb3NlX2FuZF9yZW9wZW4oc2VsZik6Ci0gICAgICAgIGlmIHNlbGYuZm5hbWUgaXMgTm9uZToKLSAgICAgICAgICAgICMgaWYgd2UncmUgdXNpbmcgYW4gaW4tbWVtb3J5IG9ubHkgZGIsIHdlIGNhbid0IHJlb3BlbiBpdAotICAgICAgICAgICAgIyBzbyBmaW5pc2ggaGVyZS4KLSAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZShzZWxmLmZuYW1lKQogICAgICAgICBzZWxmLmYuY2xvc2UoKQogICAgICAgICBzZWxmLmYgPSBzZWxmLm9wZW5tZXRob2RbMF0oc2VsZi5mbmFtZSwgJ3cnKQogICAgICAgICBmb3IgaywgdiBpbiBzZWxmLmQuaXRlcml0ZW1zKCk6CkBAIC0zMDksOCArMzA1LDcgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mW2tdLCB2KQogCiAgICAgZGVmIHRlc3Rfa2V5b3JkZXJpbmcoc2VsZik6Ci0gICAgICAgIGlmIHNlbGYub3Blbm1ldGhvZFswXSBpcyBub3QgYnNkZGIuYnRvcGVuOgotICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5vcGVubWV0aG9kWzBdLCBic2RkYi5idG9wZW4pCiAgICAgICAgIGtleXMgPSBzZWxmLmQua2V5cygpCiAgICAgICAgIGtleXMuc29ydCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mLmZpcnN0KClbMF0sIGtleXNbMF0pCkBAIC0zMjcsMTkgKzMyMiwzNCBAQAogICAgIGZuYW1lID0gTm9uZQogICAgIG9wZW5tZXRob2QgPSBbYnNkZGIuYnRvcGVuXQogCisgICAgIyBpZiB3ZSdyZSB1c2luZyBhbiBpbi1tZW1vcnkgb25seSBkYiwgd2UgY2FuJ3QgcmVvcGVuIGl0CisgICAgdGVzdF9jbG9zZV9hbmRfcmVvcGVuID0gTm9uZQorCiBjbGFzcyBUZXN0QlRyZWVfSW5NZW1vcnlfVHJ1bmNhdGUoVGVzdEJTRERCKToKICAgICBmbmFtZSA9IE5vbmUKICAgICBvcGVuZmxhZyA9ICduJwogICAgIG9wZW5tZXRob2QgPSBbYnNkZGIuYnRvcGVuXQogCisgICAgIyBpZiB3ZSdyZSB1c2luZyBhbiBpbi1tZW1vcnkgb25seSBkYiwgd2UgY2FuJ3QgcmVvcGVuIGl0CisgICAgdGVzdF9jbG9zZV9hbmRfcmVvcGVuID0gTm9uZQorCiBjbGFzcyBUZXN0SGFzaFRhYmxlKFRlc3RCU0REQik6CiAgICAgZm5hbWUgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCiAgICAgb3Blbm1ldGhvZCA9IFtic2RkYi5oYXNob3Blbl0KIAorICAgICMga2V5b3JkZXJpbmcgaXMgc3BlY2lmaWMgdG8gYnRvcGVuIG1ldGhvZAorICAgIHRlc3Rfa2V5b3JkZXJpbmcgPSBOb25lCisKIGNsYXNzIFRlc3RIYXNoVGFibGVfSW5NZW1vcnkoVGVzdEJTRERCKToKICAgICBmbmFtZSA9IE5vbmUKICAgICBvcGVubWV0aG9kID0gW2JzZGRiLmhhc2hvcGVuXQogCisgICAgIyBpZiB3ZSdyZSB1c2luZyBhbiBpbi1tZW1vcnkgb25seSBkYiwgd2UgY2FuJ3QgcmVvcGVuIGl0CisgICAgdGVzdF9jbG9zZV9hbmRfcmVvcGVuID0gTm9uZQorCisgICAgIyBrZXlvcmRlcmluZyBpcyBzcGVjaWZpYyB0byBidG9wZW4gbWV0aG9kCisgICAgdGVzdF9rZXlvcmRlcmluZyA9IE5vbmUKKwogIyMgICAgICAgICAjIChic2RkYi5ybm9wZW4sJ1JlY29yZCBOdW1iZXJzJyksICdwdXQnIGZvciBSRUNOTyBmb3IgYnNkZGIgMS44NQogIyMgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJzIGJyb2tlbi4uLiBhdCBsZWFzdCBvbgogIyMgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2xhcmlzIEludGVsIC0gcm1hc3NlIDEvOTcKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYnVmZmVyLnB5IGIvTGliL3Rlc3QvdGVzdF9idWZmZXIucHkKaW5kZXggNmJkYzM0ZC4uYTAyYzVmNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9idWZmZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9idWZmZXIucHkKQEAgLTQsNiArNCw3IEBACiAKICIiIgogCitpbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiAKQEAgLTIxLDYgKzIyLDE5IEBACiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYltzdGFydDpzdG9wOnN0ZXBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbc3RhcnQ6c3RvcDpzdGVwXSkKIAorICAgIGRlZiB0ZXN0X25ld2J1ZmZlcl9pbnRlcmZhY2Uoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IHRoZSBidWZmZXIgb2JqZWN0IGhhcyB0aGUgbmV3IGJ1ZmZlciBpbnRlcmZhY2UKKyAgICAgICAgIyBhcyB1c2VkIGJ5IHRoZSBtZW1vcnl2aWV3IG9iamVjdAorICAgICAgICBzID0gIiIuam9pbihjaHIoYykgZm9yIGMgaW4gbGlzdChyYW5nZSgyNTUsIC0xLCAtMSkpKQorICAgICAgICBiID0gYnVmZmVyKHMpCisgICAgICAgIG0gPSBtZW1vcnl2aWV3KGIpICMgU2hvdWxkIG5vdCByYWlzZSBhbiBleGNlcHRpb24KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnRvYnl0ZXMoKSwgcykKKworICAgIGRlZiB0ZXN0X2xhcmdlX2J1ZmZlcl9zaXplX2FuZF9vZmZzZXQoc2VsZik6CisgICAgICAgIGRhdGEgPSBieXRlYXJyYXkoJ2hvbGEgbXVuZG8nKQorICAgICAgICBidWYgPSBidWZmZXIoZGF0YSwgc3lzLm1heHNpemUsIHN5cy5tYXhzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6NDA5Nl0sICIiKQorCiAKIGRlZiB0ZXN0X21haW4oKToKICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCgiYnVmZmVyLi4gbm90IHN1cHBvcnRlZCIsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2J1aWx0aW4ucHkgYi9MaWIvdGVzdC90ZXN0X2J1aWx0aW4ucHkKaW5kZXggMWQzNWE2YS4uMTU1ODFkOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9idWlsdGluLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYnVpbHRpbi5weQpAQCAtMTEwLDYgKzExMCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYWxsKSAgICAgICAgICAgICAgICAgICAjIE5vIGFyZ3MKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhbGwsIFsyLCA0LCA2XSwgW10pICAgICMgVG9vIG1hbnkgYXJncwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsbChbXSksIFRydWUpICAgICAgICAgICAgICAgICAgICAgIyBFbXB0eSBpdGVyYXRvcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsbChbMCwgVGVzdEZhaWxpbmdCb29sKCldKSwgRmFsc2UpIyBTaG9ydC1jaXJjdWl0CiAgICAgICAgIFMgPSBbNTAsIDYwXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsbCh4ID4gNDIgZm9yIHggaW4gUyksIFRydWUpCiAgICAgICAgIFMgPSBbNTAsIDQwLCA2MF0KQEAgLTExOSwxMSArMTIwLDEyIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYW55KFtOb25lLCBOb25lLCBOb25lXSksIEZhbHNlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFueShbTm9uZSwgNCwgTm9uZV0pLCBUcnVlKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGFueSwgW05vbmUsIFRlc3RGYWlsaW5nQm9vbCgpLCA2XSkKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBhbGwsIFRlc3RGYWlsaW5nSXRlcigpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGFueSwgVGVzdEZhaWxpbmdJdGVyKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYW55LCAxMCkgICAgICAgICAgICAgICAjIE5vbi1pdGVyYWJsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGFueSkgICAgICAgICAgICAgICAgICAgIyBObyBhcmdzCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYW55LCBbMiwgNCwgNl0sIFtdKSAgICAjIFRvbyBtYW55IGFyZ3MKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbnkoW10pLCBGYWxzZSkgICAgICAgICAgICAgICAgICAgICMgRW1wdHkgaXRlcmF0b3IKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbnkoWzEsIFRlc3RGYWlsaW5nQm9vbCgpXSksIFRydWUpICMgU2hvcnQtY2lyY3VpdAogICAgICAgICBTID0gWzQwLCA2MCwgMzBdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYW55KHggPiA0MiBmb3IgeCBpbiBTKSwgVHJ1ZSkKICAgICAgICAgUyA9IFsxMCwgMjAsIDMwXQpAQCAtNDQ1LDU5ICs0NDcsNiBAQAogICAgICAgICAgICAgICAgIHJldHVybiAnYScKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBldmFsLCAnZGlyKCknLCBnbG9iYWxzKCksIEMoKSkKIAotICAgICMgRG9uZSBvdXRzaWRlIG9mIHRoZSBtZXRob2QgdGVzdF96IHRvIGdldCB0aGUgY29ycmVjdCBzY29wZQotICAgIHogPSAwCi0gICAgZiA9IG9wZW4oVEVTVEZOLCAndycpCi0gICAgZi53cml0ZSgneiA9IHorMVxuJykKLSAgICBmLndyaXRlKCd6ID0geioyXG4nKQotICAgIGYuY2xvc2UoKQotICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygoImV4ZWNmaWxlLi4gbm90IHN1cHBvcnRlZCBpbiAzLngiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKSk6Ci0gICAgICAgIGV4ZWNmaWxlKFRFU1RGTikKLQotICAgIGRlZiB0ZXN0X2V4ZWNmaWxlKHNlbGYpOgotICAgICAgICBnbG9iYWwgbnVtcnVucwotICAgICAgICBpZiBudW1ydW5zOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIG51bXJ1bnMgKz0gMQotCi0gICAgICAgIGdsb2JhbHMgPSB7J2EnOiAxLCAnYic6IDJ9Ci0gICAgICAgIGxvY2FscyA9IHsnYic6IDIwMCwgJ2MnOiAzMDB9Ci0KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9fY2xhc3NfXy56LCAyKQotICAgICAgICBnbG9iYWxzWyd6J10gPSAwCi0gICAgICAgIGV4ZWNmaWxlKFRFU1RGTiwgZ2xvYmFscykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnbG9iYWxzWyd6J10sIDIpCi0gICAgICAgIGxvY2Fsc1sneiddID0gMAotICAgICAgICBleGVjZmlsZShURVNURk4sIGdsb2JhbHMsIGxvY2FscykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2NhbHNbJ3onXSwgMikKLQotICAgICAgICBjbGFzcyBNOgotICAgICAgICAgICAgIlRlc3QgbWFwcGluZyBpbnRlcmZhY2UgdmVyc3VzIHBvc3NpYmxlIGNhbGxzIGZyb20gZXhlY2ZpbGUoKS4iCi0gICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgICAgICAgICAgc2VsZi56ID0gMTAKLSAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgotICAgICAgICAgICAgICAgIGlmIGtleSA9PSAneic6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnoKLSAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcgotICAgICAgICAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgotICAgICAgICAgICAgICAgIGlmIGtleSA9PSAneic6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYueiA9IHZhbHVlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yCi0KLSAgICAgICAgbG9jYWxzID0gTSgpCi0gICAgICAgIGxvY2Fsc1sneiddID0gMAotICAgICAgICBleGVjZmlsZShURVNURk4sIGdsb2JhbHMsIGxvY2FscykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2NhbHNbJ3onXSwgMikKLQotICAgICAgICB1bmxpbmsoVEVTVEZOKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGV4ZWNmaWxlKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGV4ZWNmaWxlLCBURVNURk4sIHt9LCAoKSkKLSAgICAgICAgaW1wb3J0IG9zCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGV4ZWNmaWxlLCBvcy5jdXJkaXIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGV4ZWNmaWxlLCAiSV9kb250X2V4aXN0IikKLQogICAgIGRlZiB0ZXN0X2ZpbHRlcihzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWx0ZXIobGFtYmRhIGM6ICdhJyA8PSBjIDw9ICd6JywgJ0hlbGxvIFdvcmxkJyksICdlbGxvb3JsZCcpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsdGVyKE5vbmUsIFsxLCAnaGVsbG8nLCBbXSwgWzNdLCAnJywgTm9uZSwgOSwgMF0pLCBbMSwgJ2hlbGxvJywgWzNdLCA5XSkKQEAgLTY4MCw2ICs2MjksOCBAQAogCiAgICAgIyBUZXN0IGlucHV0KCkgbGF0ZXIsIHRvZ2V0aGVyIHdpdGggcmF3X2lucHV0CiAKKyAgICAjIHRlc3RfaW50KCk6IHNlZSB0ZXN0X2ludC5weSBmb3IgaW50KCkgdGVzdHMuCisKICAgICBkZWYgdGVzdF9pbnRlcm4oc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaW50ZXJuKQogICAgICAgICAjIFRoaXMgZmFpbHMgaWYgdGhlIHRlc3QgaXMgcnVuIHR3aWNlIHdpdGggYSBjb25zdGFudCBzdHJpbmcsCkBAIC0xNjQyLDYgKzE1OTMsNTYgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgeC50cmFuc2xhdGUsICIxIiwgMSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB4LnRyYW5zbGF0ZSwgIjEiKjI1NiwgMSkKIAorY2xhc3MgVGVzdEV4ZWNGaWxlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIERvbmUgb3V0c2lkZSBvZiB0aGUgbWV0aG9kIHRlc3RfeiB0byBnZXQgdGhlIGNvcnJlY3Qgc2NvcGUKKyAgICB6ID0gMAorICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3cnKQorICAgIGYud3JpdGUoJ3ogPSB6KzFcbicpCisgICAgZi53cml0ZSgneiA9IHoqMlxuJykKKyAgICBmLmNsb3NlKCkKKyAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoKCJleGVjZmlsZS4uIG5vdCBzdXBwb3J0ZWQgaW4gMy54IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICBleGVjZmlsZShURVNURk4pCisKKyAgICBkZWYgdGVzdF9leGVjZmlsZShzZWxmKToKKyAgICAgICAgZ2xvYmFscyA9IHsnYSc6IDEsICdiJzogMn0KKyAgICAgICAgbG9jYWxzID0geydiJzogMjAwLCAnYyc6IDMwMH0KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX19jbGFzc19fLnosIDIpCisgICAgICAgIGdsb2JhbHNbJ3onXSA9IDAKKyAgICAgICAgZXhlY2ZpbGUoVEVTVEZOLCBnbG9iYWxzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdsb2JhbHNbJ3onXSwgMikKKyAgICAgICAgbG9jYWxzWyd6J10gPSAwCisgICAgICAgIGV4ZWNmaWxlKFRFU1RGTiwgZ2xvYmFscywgbG9jYWxzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvY2Fsc1sneiddLCAyKQorCisgICAgICAgIGNsYXNzIE06CisgICAgICAgICAgICAiVGVzdCBtYXBwaW5nIGludGVyZmFjZSB2ZXJzdXMgcG9zc2libGUgY2FsbHMgZnJvbSBleGVjZmlsZSgpLiIKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLnogPSAxMAorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgaWYga2V5ID09ICd6JzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuegorICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yCisgICAgICAgICAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgaWYga2V5ID09ICd6JzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi56ID0gdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IKKworICAgICAgICBsb2NhbHMgPSBNKCkKKyAgICAgICAgbG9jYWxzWyd6J10gPSAwCisgICAgICAgIGV4ZWNmaWxlKFRFU1RGTiwgZ2xvYmFscywgbG9jYWxzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvY2Fsc1sneiddLCAyKQorCisgICAgICAgIHVubGluayhURVNURk4pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZXhlY2ZpbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZXhlY2ZpbGUsIFRFU1RGTiwge30sICgpKQorICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgZXhlY2ZpbGUsIG9zLmN1cmRpcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgZXhlY2ZpbGUsICJJX2RvbnRfZXhpc3QiKQorCisKIGNsYXNzIFRlc3RTb3J0ZWQodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CkBAIC0xNjg5LDYgKzE2OTAsMTIgQEAKICAgICAgICAgcnVuX3VuaXR0ZXN0KCphcmdzKQogCiBkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgZ2xvYmFsIG51bXJ1bnMKKyAgICBpZiBub3QgbnVtcnVuczoKKyAgICAgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKAorICAgICAgICAgICAgICAgICgiLisgbm90IHN1cHBvcnRlZCBpbiAzLngiLCBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgICAgIHJ1bl91bml0dGVzdChUZXN0RXhlY0ZpbGUpCisgICAgbnVtcnVucyArPSAxCiAgICAgdGVzdF9jbGFzc2VzID0gKEJ1aWx0aW5UZXN0LCBUZXN0U29ydGVkKQogCiAgICAgX3J1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ieXRlcy5weSBiL0xpYi90ZXN0L3Rlc3RfYnl0ZXMucHkKaW5kZXggMmVmMWM4OC4uOTg4YjkzMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9ieXRlcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2J5dGVzLnB5CkBAIC02MzUsNiArNjM1LDI2IEBACiAgICAgICAgIGJbMzowXSA9IFs0MiwgNDIsIDQyXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGJ5dGVhcnJheShbMCwgMSwgMiwgNDIsIDQyLCA0MiwgMywgNCwgNSwgNiwgNywgOCwgOV0pKQogCisgICAgICAgIGJbMzpdID0gYidmb28nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYnl0ZWFycmF5KFswLCAxLCAyLCAxMDIsIDExMSwgMTExXSkpCisKKyAgICAgICAgYls6M10gPSBtZW1vcnl2aWV3KGInZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBieXRlYXJyYXkoWzEwMiwgMTExLCAxMTEsIDEwMiwgMTExLCAxMTFdKSkKKworICAgICAgICBiWzM6NF0gPSBbXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGJ5dGVhcnJheShbMTAyLCAxMTEsIDExMSwgMTExLCAxMTFdKSkKKworICAgICAgICBiWzE6XSA9IGxpc3QoYid1dXV1JykgICMgdGhpcyB3b3JrcyBvbmx5IG9uIFB5dGhvbjIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBieXRlYXJyYXkoWzEwMiwgMTE3LCAxMTcsIDExNywgMTE3XSkpCisKKyAgICAgICAgZm9yIGVsZW0gaW4gWzUsIC01LCAwLCBsb25nKDEwZTIwKSwgdSdzdHInLCAyLjMsIFt1J2EnLCB1J2InXSwgW1tdXV06CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICAgICAgYlszOjRdID0gZWxlbQorCisgICAgICAgIGZvciBlbGVtIGluIFtbMjU0LCAyNTUsIDI1Nl0sIFstMjU2LCA5MDAwXV06CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgICAgIGJbMzo0XSA9IGVsZW0KKwogICAgIGRlZiB0ZXN0X2V4dGVuZGVkX3NldF9kZWxfc2xpY2Uoc2VsZik6CiAgICAgICAgIGluZGljZXMgPSAoMCwgTm9uZSwgMSwgMywgMTksIDMwMCwgMTw8MzMzLCAtMSwgLTIsIC0zMSwgLTMwMCkKICAgICAgICAgZm9yIHN0YXJ0IGluIGluZGljZXM6CkBAIC05MDUsNiArOTI1LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChieXRlcyhiImFiYyIpIDwgYiJhYiIsIEZhbHNlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ5dGVzKGIiYWJjIikgPD0gYiJhYiIsIEZhbHNlKQogCisgICAgQHRlc3QudGVzdF9zdXBwb3J0LnJlcXVpcmVzX2RvY3N0cmluZ3MKICAgICBkZWYgdGVzdF9kb2Moc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKGJ5dGVhcnJheS5fX2RvY19fKQogICAgICAgICBzZWxmLmFzc2VydFRydWUoYnl0ZWFycmF5Ll9fZG9jX18uc3RhcnRzd2l0aCgiYnl0ZWFycmF5KCIpLCBieXRlYXJyYXkuX19kb2NfXykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYnoyLnB5IGIvTGliL3Rlc3QvdGVzdF9iejIucHkKaW5kZXggZDljY2YwYS4uZTJjMjIyYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9iejIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9iejIucHkKQEAgLTEsNiArMSw1IEBACi0jIS91c3IvYmluL2VudiBweXRob24KIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Ci1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBURVNURk4sIGltcG9ydF9tb2R1bGUKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRFU1RGTiwgXzRHLCBiaWdtZW10ZXN0LCBpbXBvcnRfbW9kdWxlLCBmaW5kZmlsZQogCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwpAQCAtMjMsNiArMjIsNyBAQAogICAgIFRFWFQgPSAncm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYmFzaFxuYmluOng6MToxOmJpbjovYmluOlxuZGFlbW9uOng6MjoyOmRhZW1vbjovc2JpbjpcbmFkbTp4OjM6NDphZG06L3Zhci9hZG06XG5scDp4OjQ6NzpscDovdmFyL3Nwb29sL2xwZDpcbnN5bmM6eDo1OjA6c3luYzovc2JpbjovYmluL3N5bmNcbnNodXRkb3duOng6NjowOnNodXRkb3duOi9zYmluOi9zYmluL3NodXRkb3duXG5oYWx0Ong6NzowOmhhbHQ6L3NiaW46L3NiaW4vaGFsdFxubWFpbDp4Ojg6MTI6bWFpbDovdmFyL3Nwb29sL21haWw6XG5uZXdzOng6OToxMzpuZXdzOi92YXIvc3Bvb2wvbmV3czpcbnV1Y3A6eDoxMDoxNDp1dWNwOi92YXIvc3Bvb2wvdXVjcDpcbm9wZXJhdG9yOng6MTE6MDpvcGVyYXRvcjovcm9vdDpcbmdhbWVzOng6MTI6MTAwOmdhbWVzOi91c3IvZ2FtZXM6XG5nb3BoZXI6eDoxMzozMDpnb3BoZXI6L3Vzci9saWIvZ29waGVyLWRhdGE6XG5mdHA6eDoxNDo1MDpGVFAgVXNlcjovdmFyL2Z0cDovYmluL2Jhc2hcbm5vYm9keTp4OjY1NTM0OjY1NTM0Ok5vYm9keTovaG9tZTpcbnBvc3RmaXg6eDoxMDA6MTAxOnBvc3RmaXg6L3Zhci9zcG9vbC9wb3N0Zml4OlxubmllbWV5ZXI6eDo1MDA6NTAwOjovaG9tZS9uaWVtZXllcjovYmluL2Jhc2hcbnBvc3RncmVzOng6MTAxOjEwMjpQb3N0Z3JlU1FMIFNlcnZlcjovdmFyL2xpYi9wZ3NxbDovYmluL2Jhc2hcbm15c3FsOng6MTAyOjEwMzpNeVNRTCBzZXJ2ZXI6L3Zhci9saWIvbXlzcWw6L2Jpbi9iYXNoXG53d3c6eDoxMDM6MTA0OjovdmFyL3d3dzovYmluL2ZhbHNlXG4nCiAgICAgREFUQSA9ICdCWmg5MUFZJlNZLlx4YzhOXHgxOFx4MDBceDAxPl9ceDgwXHgwMFx4MTBAXHgwMlx4ZmZceGYwXHgwMVx4MDduXHgwMD9ceGU3XHhmZlx4ZTAwXHgwMVx4OTlceGFhXHgwMFx4YzBceDAzRlx4ODZceDhjIyZceDgzRlx4OWFceDAzXHgwNlx4YTZceGQwXHhhNlx4OTNNXHgwZlFceGE3XHhhOFx4MDZceDgwNGhoXHgxMiRceDExXHhhNGk0XHhmMTRTXHhkMjxRXHhiNVx4MGZIXHhkM1x4ZDRceGRkXHhkNVx4ODdceGJiXHhmOFx4OTRcclx4OGZceGFmSVx4MTJceGUxXHhjOVx4ZjgvRVx4MDBwdVx4ODlceDEyXVx4YzlceGJiRExcblFceDBlXHQxXHgxMlx4ZGZceGEwXHhjMFx4OTdceGFjMk85XHg4OVx4MTNceDk0XHgwZVx4MWM3XHgwZWRceDk1SVx4MGNceGFhSlx4YTRceDE4TFx4MTBceDA1I1x4OWNceGFmXHhiYVx4YmMvXHg5N1x4OGEjQ1x4YzhceGUxXHg4Y1dceGY5XHhlMlx4ZDBceGQ2TVx4YTdceDhiWGE8ZVx4ODR0XHhjYkxceGIzXHhhN1x4ZDlceGNkXHhkMVx4Y2JceDg0Llx4YWZceGIzXHhhYlx4YWJceGFkYG59XHhhMGxoXHRFLFx4OGVaXHgxNVx4MTdWSD5ceDg4XHhlNVx4Y2Q5Z2Q2XHgwYlxuXHhlOVx4OWJceGQ1XHg4YVx4OTlceGY3XHgwOC5LXHg4ZXZceGZiXHhmN3h3XHhiYlx4ZGZceGExXHg5Mlx4ZjFceGRkfC8iO1x4YTJceGJhXHg5Zlx4ZDVceGIxI0FceGI2XHhmNlx4YjNvXHhjOVx4YzV5XFxceGViT1x4ZTdceDg1XHg5YVx4YmNceGI2ZjhceDk1Mlx4ZDVceGQ3IiVceDg5PlYsXHhmN1x4YTZ6XHhlMlx4OWZceGEzXHhkZlx4MTFceDExIlx4ZDZFKUlceGE5XHgxM15ceGNhXHhmM3JceGQwXHgwM1VceDkyMlx4ZjI2XHhlY1x4YjZceGVkXHg4Ylx4YzNVXHgxM1x4OWRceGM1XHgxNzBceGE0XHhmYV5ceDkyXHhhY0RGXHg4YVx4OTdceGQ2XHgxOVx4ZmVceGRkXHhiOFx4YmRceDFhXHg5YVx4MTlceGEzXHg4MGFua1JceDhiXHhlNVx4ZDgzXVx4YTlceGM2XHgwOFx4ODJmXHhmNlx4YjkiNmwkXHhiOGpAXHhjMFx4OGFceGIwbDEuLlx4YmFrXHg4M2xzXHgxNVx4YmNceGY0XHhjMVx4MTNceGJlXHhmOEVceGI4XHg5ZFxyXHhhOFx4OWRrXHg4NFx4ZDNuXHhmYVx4YWNRXHgwN1x4YjEleVx4YWF2XHhiNFx4MDhceGUwelx4MWJceDE2XHhmNVx4MDRceGU5XHhjY1x4YjlceDA4elx4MWVuNy5HXHhmY11ceGM5XHgxNFx4ZTFCQFx4YmIhOGAnCiAgICAgREFUQV9DUkxGID0gJ0JaaDkxQVkmU1lceGFlelx4YmJOXHgwMFx4MDFIXHhkZlx4ODBceDAwXHgxMkBceDAyXHhmZlx4ZjBceDAxXHgwN25ceDAwP1x4ZTdceGZmXHhlMEBceDAxXHhiY1x4YzZgXHg4NipceDhkPU1ceGE5XHg5YVx4ODZceGQwTEBceDBmSVx4YTYhXHhhMVx4MTNceGM4XHg4OGpkaVx4OGRAXHgwM0BceDFhXHgxYVx4MGNceDBjXHg4MyBceDAwXHhjNGgyXHgxOVx4MDFceDgyRFx4ODRlXHRceGU4XHg5OVx4ODlceDE5XHgxYWhceDAwXHJceDFhXHgxMVx4YWZceDliXHgwZkdceGY1KFx4MWJceDFmP1x0XHgxMlx4Y2ZceGI1XHhmY1x4OTVFXHgwMHBzXHg4OVx4MTJeXHhhNFx4ZGRceGEyJlx4MDUoXHg4N1x4MDRceDk4XHg4OXVceGU0MCVceGI2XHgxOVwnXHg4Y1x4YzRceDg5XHhjYVx4MDdceDBlXHgxYiFceDkxVUlGVSVDXHg5OTQhRElceGQyXHhmYVx4ZjBceGYxTjhXXHhkZVx4MTNBXHhmNVx4OWNyJT9ceDlmMztJNDVBXHhkMVx4OGJUXHhiMTxsXHhiYVx4Y2JfXHhjMDB4WVx4MTdyXHgxN1x4ODhceDA4XHgwOEBceGEwXHJ5QFx4MTBceDA0JClgXHhmMlx4Y2VceDg5elx4YjBzXHhlY1x4OWIuaVdceDlkXHg4MVx4YjUtK3RceDlmXHgxYVwnXHg5N2RCXHhmNXhceGI1XHhiZS5bLlx4ZDdceDBlXHg4MVx4ZTdceDA4XHgxY05gXHg4OFx4MTBceGNhXHg4N1x4YzMhIlx4ODBceDkyUlx4YTEvXHhkMVx4YzBceGU2bWZceGFjXHhiZFx4OTlceGNjYVx4YjNceDg3ODA+XHhhNFx4YzdceDhkXHgxYVxcIlx4YWRceGExXHhhYnlCZ1x4MTVceGI5bFx4ODhceDg4XHg5MWsiXHg5NFx4YTRceGQ0XHg4OVx4YWUqXHhhNlx4MGJceDEwXHgwY1x4ZDZceGQ0bVx4ZTg2XHhlY1x4YjVqXHg4YVx4ODZqXCc7XHhjYS5ceDAxSVx4ZjJceGFhSlx4ZThceDg4XHg4Y1UrdDNceGZiXHgwY1xuXHhhMzNceDEzcjJcclx4MTZceGUwXHhiMyhceGJmXHgxZFx4ODNyXHhlN01ceGYwRFx4MTM2NVx4ZDhceDg4XHhkM1x4YTRceDkyXHhjYjJceDA2XHgwNFxcXHhjMVx4YjBceGVhLy9ceGJlayZceGQ4XHhlNit0XHhlNVx4YTFceDEzXHhhZGFceDE2XHhkZXI1InddXHhhMmlceGI3W1x4OTdSIFx4ZTJJVFx4Y2Q7Wlx4MDRkazRceGFkXHg4YVx0XHhkM1x4ODF6XHgxMFx4ZjE6XmBceGFiXHgxZlx4YzVceGRjXHg5MU5ceDE0JCtceDllXHhhZVx4ZDNceDgwJworICAgIEVNUFRZX0RBVEEgPSAnQlpoOVx4MTdyRThQXHg5MFx4MDBceDAwXHgwMFx4MDAnCiAKICAgICBpZiBoYXNfY21kbGluZV9idW56aXAyOgogICAgICAgICBkZWYgZGVjb21wcmVzcyhzZWxmLCBkYXRhKToKQEAgLTQzLDYgKzQzLDcgQEAKICAgICAgICAgZGVmIGRlY29tcHJlc3Moc2VsZiwgZGF0YSk6CiAgICAgICAgICAgICByZXR1cm4gYnoyLmRlY29tcHJlc3MoZGF0YSkKIAorCiBjbGFzcyBCWjJGaWxlVGVzdChCYXNlVGVzdCk6CiAgICAgIlRlc3QgQloyRmlsZSB0eXBlIG1pc2NlbGxhbmVvdXMgbWV0aG9kcy4iCiAKQEAgLTMyMyw2ICszMjQsMjEgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGYucmVhZGxpbmUpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmLnJlYWRsaW5lcykKIAorICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09ICd3aW4zMicsCisgICAgICAgICAgICAgICAgICAgICAndGVzdCBkZXBlbmRzIG9uIGJlaW5nIGFibGUgdG8gZGVsZXRlIGEgc3RpbGwtb3BlbiBmaWxlLCcKKyAgICAgICAgICAgICAgICAgICAgICcgd2hpY2ggaXMgbm90IHBvc3NpYmxlIG9uIFdpbmRvd3MnKQorICAgIGRlZiB0ZXN0SW5pdE5vbkV4aXN0ZW50RmlsZShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTk4Nzg6IFNob3VsZCBub3Qgc2VnZmF1bHQgd2hlbiBfX2luaXRfXyB3aXRoIG5vbi1leGlzdGVudAorICAgICAgICAjIGZpbGUgZm9yIHRoZSBzZWNvbmQgdGltZS4KKyAgICAgICAgc2VsZi5jcmVhdGVUZW1wRmlsZSgpCisgICAgICAgICMgVGVzdCBjbG9zZSgpOgorICAgICAgICB3aXRoIEJaMkZpbGUoc2VsZi5maWxlbmFtZSwgIndiIikgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGYuX19pbml0X18sICJub24tZXhpc3RlbnQtZmlsZSIpCisgICAgICAgICMgVGVzdCBvYmplY3QgZGVhbGxvY2F0aW9uIHdpdGhvdXQgY2FsbCB0byBjbG9zZSgpOgorICAgICAgICBmID0gYnoyLkJaMkZpbGUoc2VsZi5maWxlbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgZi5fX2luaXRfXywgIm5vbi1leGlzdGVudC1maWxlIikKKyAgICAgICAgZGVsIGYKKwogY2xhc3MgQloyQ29tcHJlc3NvclRlc3QoQmFzZVRlc3QpOgogICAgIGRlZiB0ZXN0Q29tcHJlc3Moc2VsZik6CiAgICAgICAgICMgIlRlc3QgQloyQ29tcHJlc3Nvci5jb21wcmVzcygpL2ZsdXNoKCkiCkBAIC0zMzIsNiArMzQ4LDEzIEBACiAgICAgICAgIGRhdGEgKz0gYnoyYy5mbHVzaCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kZWNvbXByZXNzKGRhdGEpLCBzZWxmLlRFWFQpCiAKKyAgICBkZWYgdGVzdENvbXByZXNzRW1wdHlTdHJpbmcoc2VsZik6CisgICAgICAgICMgIlRlc3QgQloyQ29tcHJlc3Nvci5jb21wcmVzcygpL2ZsdXNoKCkgb2YgZW1wdHkgc3RyaW5nIgorICAgICAgICBiejJjID0gQloyQ29tcHJlc3NvcigpCisgICAgICAgIGRhdGEgPSBiejJjLmNvbXByZXNzKCcnKQorICAgICAgICBkYXRhICs9IGJ6MmMuZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIHNlbGYuRU1QVFlfREFUQSkKKwogICAgIGRlZiB0ZXN0Q29tcHJlc3NDaHVua3MxMChzZWxmKToKICAgICAgICAgIyAiVGVzdCBCWjJDb21wcmVzc29yLmNvbXByZXNzKCkvZmx1c2goKSB3aXRoIGNodW5rcyBvZiAxMCBieXRlcyIKICAgICAgICAgYnoyYyA9IEJaMkNvbXByZXNzb3IoKQpAQCAtMzQ2LDYgKzM2OSwxNyBAQAogICAgICAgICBkYXRhICs9IGJ6MmMuZmx1c2goKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGVjb21wcmVzcyhkYXRhKSwgc2VsZi5URVhUKQogCisgICAgQGJpZ21lbXRlc3QoXzRHLCBtZW11c2U9MS4yNSkKKyAgICBkZWYgdGVzdEJpZ21lbShzZWxmLCBzaXplKToKKyAgICAgICAgdGV4dCA9ICJhIiAqIHNpemUKKyAgICAgICAgYnoyYyA9IGJ6Mi5CWjJDb21wcmVzc29yKCkKKyAgICAgICAgZGF0YSA9IGJ6MmMuY29tcHJlc3ModGV4dCkgKyBiejJjLmZsdXNoKCkKKyAgICAgICAgZGVsIHRleHQKKyAgICAgICAgdGV4dCA9IHNlbGYuZGVjb21wcmVzcyhkYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0ZXh0KSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0LnN0cmlwKCJhIiksICIiKQorCisKIGNsYXNzIEJaMkRlY29tcHJlc3NvclRlc3QoQmFzZVRlc3QpOgogICAgIGRlZiB0ZXN0X0NvbnN0cnVjdG9yKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIEJaMkRlY29tcHJlc3NvciwgNDIpCkBAIC0zODMsNiArNDE3LDE3IEBACiAgICAgICAgIGJ6MmQgPSBCWjJEZWNvbXByZXNzb3IoKQogICAgICAgICB0ZXh0ID0gYnoyZC5kZWNvbXByZXNzKHNlbGYuREFUQSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRU9GRXJyb3IsIGJ6MmQuZGVjb21wcmVzcywgImFueXRoaW5nIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRU9GRXJyb3IsIGJ6MmQuZGVjb21wcmVzcywgIiIpCisKKyAgICBAYmlnbWVtdGVzdChfNEcsIG1lbXVzZT0xLjI1KQorICAgIGRlZiB0ZXN0QmlnbWVtKHNlbGYsIHNpemUpOgorICAgICAgICAjIElzc3VlICMxNDM5ODogZGVjb21wcmVzc2lvbiBmYWlscyB3aGVuIG91dHB1dCBkYXRhIGlzID49MkdCLgorICAgICAgICBpZiBzaXplIDwgXzRHOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiVGVzdCBuZWVkcyA1R0Igb2YgbWVtb3J5IHRvIHJ1bi4iKQorICAgICAgICBjb21wcmVzc2VkID0gYnoyLmNvbXByZXNzKCJhIiAqIF80RykKKyAgICAgICAgdGV4dCA9IGJ6Mi5CWjJEZWNvbXByZXNzb3IoKS5kZWNvbXByZXNzKGNvbXByZXNzZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRleHQpLCBfNEcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dC5zdHJpcCgiYSIpLCAiIikKIAogCiBjbGFzcyBGdW5jVGVzdChCYXNlVGVzdCk6CkBAIC0zOTMsNiArNDM4LDExIEBACiAgICAgICAgIGRhdGEgPSBiejIuY29tcHJlc3Moc2VsZi5URVhUKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGVjb21wcmVzcyhkYXRhKSwgc2VsZi5URVhUKQogCisgICAgZGVmIHRlc3RDb21wcmVzc0VtcHR5U3RyaW5nKHNlbGYpOgorICAgICAgICAjICJUZXN0IGNvbXByZXNzKCkgb2YgZW1wdHkgc3RyaW5nIgorICAgICAgICB0ZXh0ID0gYnoyLmNvbXByZXNzKCcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQsIHNlbGYuRU1QVFlfREFUQSkKKwogICAgIGRlZiB0ZXN0RGVjb21wcmVzcyhzZWxmKToKICAgICAgICAgIyAiVGVzdCBkZWNvbXByZXNzKCkgZnVuY3Rpb24iCiAgICAgICAgIHRleHQgPSBiejIuZGVjb21wcmVzcyhzZWxmLkRBVEEpCkBAIC00MDMsMTAgKzQ1MywzNCBAQAogICAgICAgICB0ZXh0ID0gYnoyLmRlY29tcHJlc3MoIiIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dCwgIiIpCiAKKyAgICBkZWYgdGVzdERlY29tcHJlc3NUb0VtcHR5U3RyaW5nKHNlbGYpOgorICAgICAgICAjICJUZXN0IGRlY29tcHJlc3MoKSBvZiBtaW5pbWFsIGJ6MiBkYXRhIHRvIGVtcHR5IHN0cmluZyIKKyAgICAgICAgdGV4dCA9IGJ6Mi5kZWNvbXByZXNzKHNlbGYuRU1QVFlfREFUQSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0LCAnJykKKwogICAgIGRlZiB0ZXN0RGVjb21wcmVzc0luY29tcGxldGUoc2VsZik6CiAgICAgICAgICMgIlRlc3QgZGVjb21wcmVzcygpIGZ1bmN0aW9uIHdpdGggaW5jb21wbGV0ZSBkYXRhIgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBiejIuZGVjb21wcmVzcywgc2VsZi5EQVRBWzotMTBdKQogCisgICAgQGJpZ21lbXRlc3QoXzRHLCBtZW11c2U9MS4yNSkKKyAgICBkZWYgdGVzdENvbXByZXNzQmlnbWVtKHNlbGYsIHNpemUpOgorICAgICAgICB0ZXh0ID0gImEiICogc2l6ZQorICAgICAgICBkYXRhID0gYnoyLmNvbXByZXNzKHRleHQpCisgICAgICAgIGRlbCB0ZXh0CisgICAgICAgIHRleHQgPSBzZWxmLmRlY29tcHJlc3MoZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odGV4dCksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dC5zdHJpcCgiYSIpLCAiIikKKworICAgIEBiaWdtZW10ZXN0KF80RywgbWVtdXNlPTEuMjUpCisgICAgZGVmIHRlc3REZWNvbXByZXNzQmlnbWVtKHNlbGYsIHNpemUpOgorICAgICAgICAjIElzc3VlICMxNDM5ODogZGVjb21wcmVzc2lvbiBmYWlscyB3aGVuIG91dHB1dCBkYXRhIGlzID49MkdCLgorICAgICAgICBpZiBzaXplIDwgXzRHOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiVGVzdCBuZWVkcyA1R0Igb2YgbWVtb3J5IHRvIHJ1bi4iKQorICAgICAgICBjb21wcmVzc2VkID0gYnoyLmNvbXByZXNzKCJhIiAqIF80RykKKyAgICAgICAgdGV4dCA9IGJ6Mi5kZWNvbXByZXNzKGNvbXByZXNzZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRleHQpLCBfNEcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dC5zdHJpcCgiYSIpLCAiIikKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCiAgICAgICAgIEJaMkZpbGVUZXN0LApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jYWxlbmRhci5weSBiL0xpYi90ZXN0L3Rlc3RfY2FsZW5kYXIucHkKaW5kZXggMmE1NjI2OC4uNDBmYjc2ZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jYWxlbmRhci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NhbGVuZGFyLnB5CkBAIC0zLDYgKzMsNyBAQAogCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogaW1wb3J0IGxvY2FsZQoraW1wb3J0IGRhdGV0aW1lCiAKIAogcmVzdWx0XzIwMDRfdGV4dCA9ICIiIgpAQCAtMjU0LDEzICsyNTUsMzAgQEAKICAgICAgICAgIyAoaXQgaXMgc3RpbGwgbm90IHRocmVhZC1zYWZlIHRob3VnaCkKICAgICAgICAgb2xkX29jdG9iZXIgPSBjYWxlbmRhci5UZXh0Q2FsZW5kYXIoKS5mb3JtYXRtb250aG5hbWUoMjAxMCwgMTAsIDEwKQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBjYWxlbmRhci5Mb2NhbGVUZXh0Q2FsZW5kYXIobG9jYWxlPScnKS5mb3JtYXRtb250aG5hbWUoMjAxMCwgMTAsIDEwKQorICAgICAgICAgICAgY2FsID0gY2FsZW5kYXIuTG9jYWxlVGV4dENhbGVuZGFyKGxvY2FsZT0nJykKKyAgICAgICAgICAgIGxvY2FsX3dlZWtkYXkgPSBjYWwuZm9ybWF0d2Vla2RheSgxLCAxMCkKKyAgICAgICAgICAgIGxvY2FsX21vbnRoID0gY2FsLmZvcm1hdG1vbnRobmFtZSgyMDEwLCAxMCwgMTApCiAgICAgICAgIGV4Y2VwdCBsb2NhbGUuRXJyb3I6CiAgICAgICAgICAgICAjIGNhbm5vdCBzZXQgdGhlIHN5c3RlbSBkZWZhdWx0IGxvY2FsZSAtLSBza2lwIHJlc3Qgb2YgdGVzdAotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGNhbGVuZGFyLkxvY2FsZUhUTUxDYWxlbmRhcihsb2NhbGU9JycpLmZvcm1hdG1vbnRobmFtZSgyMDEwLCAxMCkKKyAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCdjYW5ub3Qgc2V0IHRoZSBzeXN0ZW0gZGVmYXVsdCBsb2NhbGUnKQorICAgICAgICAjIHNob3VsZCBiZSBlbmNvZGFibGUKKyAgICAgICAgbG9jYWxfd2Vla2RheS5lbmNvZGUoJ3V0Zi04JykKKyAgICAgICAgbG9jYWxfbW9udGguZW5jb2RlKCd1dGYtOCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxvY2FsX3dlZWtkYXkpLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwobGVuKGxvY2FsX21vbnRoKSwgMTApCisgICAgICAgIGNhbCA9IGNhbGVuZGFyLkxvY2FsZUhUTUxDYWxlbmRhcihsb2NhbGU9JycpCisgICAgICAgIGxvY2FsX3dlZWtkYXkgPSBjYWwuZm9ybWF0d2Vla2RheSgxKQorICAgICAgICBsb2NhbF9tb250aCA9IGNhbC5mb3JtYXRtb250aG5hbWUoMjAxMCwgMTApCisgICAgICAgICMgc2hvdWxkIGJlIGVuY29kYWJsZQorICAgICAgICBsb2NhbF93ZWVrZGF5LmVuY29kZSgndXRmLTgnKQorICAgICAgICBsb2NhbF9tb250aC5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgbmV3X29jdG9iZXIgPSBjYWxlbmRhci5UZXh0Q2FsZW5kYXIoKS5mb3JtYXRtb250aG5hbWUoMjAxMCwgMTAsIDEwKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvbGRfb2N0b2JlciwgbmV3X29jdG9iZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2xkX29jdG9iZXIsIG5ld19vY3RvYmVyKQorCisgICAgZGVmIHRlc3RfaXRlcm1vbnRoZGF0ZXMoc2VsZik6CisgICAgICAgICMgZW5zdXJlIGl0ZXJtb250aGRhdGVzIGRvZXNuJ3Qgb3ZlcmZsb3cgYWZ0ZXIgZGF0ZXRpbWUuTUFYWUVBUgorICAgICAgICAjIHNlZSAjMTU0MjEKKyAgICAgICAgbGlzdChjYWxlbmRhci5DYWxlbmRhcigpLml0ZXJtb250aGRhdGVzKGRhdGV0aW1lLk1BWFlFQVIsIDEyKSkKIAogCiBjbGFzcyBNb250aENhbGVuZGFyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jYXBpLnB5IGIvTGliL3Rlc3QvdGVzdF9jYXBpLnB5CmluZGV4IDdkZWMyZGUuLmEyY2I1YzcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY2FwaS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NhcGkucHkKQEAgLTgsMTAgKzgsMTQgQEAKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIHRyeToKKyAgICBpbXBvcnQgdGhyZWFkCiAgICAgaW1wb3J0IHRocmVhZGluZwogZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHRocmVhZCA9IE5vbmUKICAgICB0aHJlYWRpbmcgPSBOb25lCi1pbXBvcnQgX3Rlc3RjYXBpCisjIFNraXAgdGhpcyB0ZXN0IGlmIHRoZSBfdGVzdGNhcGkgbW9kdWxlIGlzbid0IGF2YWlsYWJsZS4KK190ZXN0Y2FwaSA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdfdGVzdGNhcGknKQorCiAKIEB1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZywgJ1RocmVhZGluZyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LicpCiBjbGFzcyBUZXN0UGVuZGluZ0NhbGxzKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTk2LDggKzEwMCwzMiBAQAogICAgICAgICBzZWxmLnBlbmRpbmdjYWxsc193YWl0KGwsIG4pCiAKIAotZGVmIHRlc3RfbWFpbigpOgorQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nIGFuZCB0aHJlYWQsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorY2xhc3MgVGVzdFRocmVhZFN0YXRlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAorICAgIEB0ZXN0X3N1cHBvcnQucmVhcF90aHJlYWRzCisgICAgZGVmIHRlc3RfdGhyZWFkX3N0YXRlKHNlbGYpOgorICAgICAgICAjIHNvbWUgZXh0cmEgdGhyZWFkLXN0YXRlIHRlc3RzIGRyaXZlbiB2aWEgX3Rlc3RjYXBpCisgICAgICAgIGRlZiB0YXJnZXQoKToKKyAgICAgICAgICAgIGlkZW50cyA9IFtdCisKKyAgICAgICAgICAgIGRlZiBjYWxsYmFjaygpOgorICAgICAgICAgICAgICAgIGlkZW50cy5hcHBlbmQodGhyZWFkLmdldF9pZGVudCgpKQorCisgICAgICAgICAgICBfdGVzdGNhcGkuX3Rlc3RfdGhyZWFkX3N0YXRlKGNhbGxiYWNrKQorICAgICAgICAgICAgYSA9IGIgPSBjYWxsYmFjaworICAgICAgICAgICAgdGltZS5zbGVlcCgxKQorICAgICAgICAgICAgIyBDaGVjayBvdXIgbWFpbiB0aHJlYWQgaXMgaW4gdGhlIGxpc3QgZXhhY3RseSAzIHRpbWVzLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpZGVudHMuY291bnQodGhyZWFkLmdldF9pZGVudCgpKSwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGZpbmQgbWFpbiB0aHJlYWQgY29ycmVjdGx5IGluIHRoZSBsaXN0IikKKworICAgICAgICB0YXJnZXQoKQorICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9dGFyZ2V0KQorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgdC5qb2luKCkKKworCitkZWYgdGVzdF9tYWluKCk6CiAgICAgZm9yIG5hbWUgaW4gZGlyKF90ZXN0Y2FwaSk6CiAgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgndGVzdF8nKToKICAgICAgICAgICAgIHRlc3QgPSBnZXRhdHRyKF90ZXN0Y2FwaSwgbmFtZSkKQEAgLTEwOCwzMyArMTM2LDcgQEAKICAgICAgICAgICAgIGV4Y2VwdCBfdGVzdGNhcGkuZXJyb3I6CiAgICAgICAgICAgICAgICAgcmFpc2UgdGVzdF9zdXBwb3J0LlRlc3RGYWlsZWQsIHN5cy5leGNfaW5mbygpWzFdCiAKLSAgICAjIHNvbWUgZXh0cmEgdGhyZWFkLXN0YXRlIHRlc3RzIGRyaXZlbiB2aWEgX3Rlc3RjYXBpCi0gICAgZGVmIFRlc3RUaHJlYWRTdGF0ZSgpOgotICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKLSAgICAgICAgICAgIHByaW50ICJhdXRvLXRocmVhZC1zdGF0ZSIKLQotICAgICAgICBpZGVudHMgPSBbXQotCi0gICAgICAgIGRlZiBjYWxsYmFjaygpOgotICAgICAgICAgICAgaWRlbnRzLmFwcGVuZCh0aHJlYWQuZ2V0X2lkZW50KCkpCi0KLSAgICAgICAgX3Rlc3RjYXBpLl90ZXN0X3RocmVhZF9zdGF0ZShjYWxsYmFjaykKLSAgICAgICAgYSA9IGIgPSBjYWxsYmFjawotICAgICAgICB0aW1lLnNsZWVwKDEpCi0gICAgICAgICMgQ2hlY2sgb3VyIG1haW4gdGhyZWFkIGlzIGluIHRoZSBsaXN0IGV4YWN0bHkgMyB0aW1lcy4KLSAgICAgICAgaWYgaWRlbnRzLmNvdW50KHRocmVhZC5nZXRfaWRlbnQoKSkgIT0gMzoKLSAgICAgICAgICAgIHJhaXNlIHRlc3Rfc3VwcG9ydC5UZXN0RmFpbGVkLCBcCi0gICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgZmluZCBtYWluIHRocmVhZCBjb3JyZWN0bHkgaW4gdGhlIGxpc3QiCi0KLSAgICBpZiB0aHJlYWRpbmc6Ci0gICAgICAgIGltcG9ydCB0aHJlYWQKLSAgICAgICAgaW1wb3J0IHRpbWUKLSAgICAgICAgVGVzdFRocmVhZFN0YXRlKCkKLSAgICAgICAgdD10aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1UZXN0VGhyZWFkU3RhdGUpCi0gICAgICAgIHQuc3RhcnQoKQotICAgICAgICB0LmpvaW4oKQotCi0gICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0UGVuZGluZ0NhbGxzKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdFBlbmRpbmdDYWxscywgVGVzdFRocmVhZFN0YXRlKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NkLnB5IGIvTGliL3Rlc3QvdGVzdF9jZC5weQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGVkYWE4MmIuLjE4Y2E1ODYKLS0tIGEvTGliL3Rlc3QvdGVzdF9jZC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NkLnB5CkBAIC0xLDQgKzEsMyBAQAotIyEgL3Vzci9iaW4vZW52IHB5dGhvbgogIiIiV2hpbXB5IHRlc3Qgc2NyaXB0IGZvciB0aGUgY2QgbW9kdWxlCiAgICBSb2dlciBFLiBNYXNzZQogIiIiCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NmZ3BhcnNlci5weSBiL0xpYi90ZXN0L3Rlc3RfY2ZncGFyc2VyLnB5CmluZGV4IGE3YWQxOGQuLmRmNjVmNmUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY2ZncGFyc2VyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY2ZncGFyc2VyLnB5CkBAIC0yODQsMTMgKzI4NCwxNyBAQAogICAgICAgICBjZi5zZXQoInNlY3QiLCAib3B0aW9uMSIsIG15c3RyKCJzcGxhdCIpKQogICAgICAgICBjZi5zZXQoInNlY3QiLCAib3B0aW9uMiIsICJzcGxhdCIpCiAgICAgICAgIGNmLnNldCgic2VjdCIsICJvcHRpb24yIiwgbXlzdHIoInNwbGF0IikpCisKKyAgICBkZWYgdGVzdF9zZXRfdW5pY29kZShzZWxmKToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgdW5pY29kZQogICAgICAgICBleGNlcHQgTmFtZUVycm9yOgotICAgICAgICAgICAgcGFzcwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgY2Yuc2V0KCJzZWN0IiwgIm9wdGlvbjEiLCB1bmljb2RlKCJzcGxhdCIpKQotICAgICAgICAgICAgY2Yuc2V0KCJzZWN0IiwgIm9wdGlvbjIiLCB1bmljb2RlKCJzcGxhdCIpKQorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgnbm8gdW5pY29kZSBzdXBwb3J0JykKKworICAgICAgICBjZiA9IHNlbGYuZnJvbXN0cmluZygiW3NlY3RdXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb24xPWZvb1xuIikKKyAgICAgICAgY2Yuc2V0KCJzZWN0IiwgIm9wdGlvbjEiLCB1bmljb2RlKCJzcGxhdCIpKQorICAgICAgICBjZi5zZXQoInNlY3QiLCAib3B0aW9uMiIsIHVuaWNvZGUoInNwbGF0IikpCiAKICAgICBkZWYgdGVzdF9yZWFkX3JldHVybnNfZmlsZV9saXN0KHNlbGYpOgogICAgICAgICBmaWxlMSA9IHRlc3Rfc3VwcG9ydC5maW5kZmlsZSgiY2ZncGFyc2VyLjEiKQpAQCAtNjA0LDYgKzYwOCwxMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAibzQgPSAxXG5cbiIpCiAKIAorY2xhc3MgRXhjZXB0aW9uUGlja2xpbmdUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgZm9yIGlzc3VlICMxMzc2MDogQ29uZmlnUGFyc2VyIGV4Y2VwdGlvbnMgYXJlIG5vdCBwaWNrbGFibGUuIiIiCisKKyAgICBkZWYgdGVzdF9lcnJvcihzZWxmKToKKyAgICAgICAgaW1wb3J0IHBpY2tsZQorICAgICAgICBlMSA9IENvbmZpZ1BhcnNlci5FcnJvcigndmFsdWUnKQorICAgICAgICBwaWNrbGVkID0gcGlja2xlLmR1bXBzKGUxKQorICAgICAgICBlMiA9IHBpY2tsZS5sb2FkcyhwaWNrbGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLm1lc3NhZ2UsIGUyLm1lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihlMSksIHJlcHIoZTIpKQorCisgICAgZGVmIHRlc3Rfbm9zZWN0aW9uZXJyb3Ioc2VsZik6CisgICAgICAgIGltcG9ydCBwaWNrbGUKKyAgICAgICAgZTEgPSBDb25maWdQYXJzZXIuTm9TZWN0aW9uRXJyb3IoJ3NlY3Rpb24nKQorICAgICAgICBwaWNrbGVkID0gcGlja2xlLmR1bXBzKGUxKQorICAgICAgICBlMiA9IHBpY2tsZS5sb2FkcyhwaWNrbGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLm1lc3NhZ2UsIGUyLm1lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEuYXJncywgZTIuYXJncykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5zZWN0aW9uLCBlMi5zZWN0aW9uKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZTEpLCByZXByKGUyKSkKKworICAgIGRlZiB0ZXN0X25vb3B0aW9uZXJyb3Ioc2VsZik6CisgICAgICAgIGltcG9ydCBwaWNrbGUKKyAgICAgICAgZTEgPSBDb25maWdQYXJzZXIuTm9PcHRpb25FcnJvcignb3B0aW9uJywgJ3NlY3Rpb24nKQorICAgICAgICBwaWNrbGVkID0gcGlja2xlLmR1bXBzKGUxKQorICAgICAgICBlMiA9IHBpY2tsZS5sb2FkcyhwaWNrbGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLm1lc3NhZ2UsIGUyLm1lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEuYXJncywgZTIuYXJncykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5zZWN0aW9uLCBlMi5zZWN0aW9uKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLm9wdGlvbiwgZTIub3B0aW9uKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZTEpLCByZXByKGUyKSkKKworICAgIGRlZiB0ZXN0X2R1cGxpY2F0ZXNlY3Rpb25lcnJvcihzZWxmKToKKyAgICAgICAgaW1wb3J0IHBpY2tsZQorICAgICAgICBlMSA9IENvbmZpZ1BhcnNlci5EdXBsaWNhdGVTZWN0aW9uRXJyb3IoJ3NlY3Rpb24nKQorICAgICAgICBwaWNrbGVkID0gcGlja2xlLmR1bXBzKGUxKQorICAgICAgICBlMiA9IHBpY2tsZS5sb2FkcyhwaWNrbGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLm1lc3NhZ2UsIGUyLm1lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEuYXJncywgZTIuYXJncykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5zZWN0aW9uLCBlMi5zZWN0aW9uKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZTEpLCByZXByKGUyKSkKKworICAgIGRlZiB0ZXN0X2ludGVycG9sYXRpb25lcnJvcihzZWxmKToKKyAgICAgICAgaW1wb3J0IHBpY2tsZQorICAgICAgICBlMSA9IENvbmZpZ1BhcnNlci5JbnRlcnBvbGF0aW9uRXJyb3IoJ29wdGlvbicsICdzZWN0aW9uJywgJ21zZycpCisgICAgICAgIHBpY2tsZWQgPSBwaWNrbGUuZHVtcHMoZTEpCisgICAgICAgIGUyID0gcGlja2xlLmxvYWRzKHBpY2tsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEubWVzc2FnZSwgZTIubWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5hcmdzLCBlMi5hcmdzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLnNlY3Rpb24sIGUyLnNlY3Rpb24pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEub3B0aW9uLCBlMi5vcHRpb24pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihlMSksIHJlcHIoZTIpKQorCisgICAgZGVmIHRlc3RfaW50ZXJwb2xhdGlvbm1pc3NpbmdvcHRpb25lcnJvcihzZWxmKToKKyAgICAgICAgaW1wb3J0IHBpY2tsZQorICAgICAgICBlMSA9IENvbmZpZ1BhcnNlci5JbnRlcnBvbGF0aW9uTWlzc2luZ09wdGlvbkVycm9yKCdvcHRpb24nLCAnc2VjdGlvbicsCisgICAgICAgICAgICAncmF3dmFsJywgJ3JlZmVyZW5jZScpCisgICAgICAgIHBpY2tsZWQgPSBwaWNrbGUuZHVtcHMoZTEpCisgICAgICAgIGUyID0gcGlja2xlLmxvYWRzKHBpY2tsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEubWVzc2FnZSwgZTIubWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5hcmdzLCBlMi5hcmdzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLnNlY3Rpb24sIGUyLnNlY3Rpb24pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEub3B0aW9uLCBlMi5vcHRpb24pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEucmVmZXJlbmNlLCBlMi5yZWZlcmVuY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihlMSksIHJlcHIoZTIpKQorCisgICAgZGVmIHRlc3RfaW50ZXJwb2xhdGlvbnN5bnRheGVycm9yKHNlbGYpOgorICAgICAgICBpbXBvcnQgcGlja2xlCisgICAgICAgIGUxID0gQ29uZmlnUGFyc2VyLkludGVycG9sYXRpb25TeW50YXhFcnJvcignb3B0aW9uJywgJ3NlY3Rpb24nLCAnbXNnJykKKyAgICAgICAgcGlja2xlZCA9IHBpY2tsZS5kdW1wcyhlMSkKKyAgICAgICAgZTIgPSBwaWNrbGUubG9hZHMocGlja2xlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5tZXNzYWdlLCBlMi5tZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLmFyZ3MsIGUyLmFyZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEuc2VjdGlvbiwgZTIuc2VjdGlvbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5vcHRpb24sIGUyLm9wdGlvbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGUxKSwgcmVwcihlMikpCisKKyAgICBkZWYgdGVzdF9pbnRlcnBvbGF0aW9uZGVwdGhlcnJvcihzZWxmKToKKyAgICAgICAgaW1wb3J0IHBpY2tsZQorICAgICAgICBlMSA9IENvbmZpZ1BhcnNlci5JbnRlcnBvbGF0aW9uRGVwdGhFcnJvcignb3B0aW9uJywgJ3NlY3Rpb24nLAorICAgICAgICAgICAgJ3Jhd3ZhbCcpCisgICAgICAgIHBpY2tsZWQgPSBwaWNrbGUuZHVtcHMoZTEpCisgICAgICAgIGUyID0gcGlja2xlLmxvYWRzKHBpY2tsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEubWVzc2FnZSwgZTIubWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5hcmdzLCBlMi5hcmdzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLnNlY3Rpb24sIGUyLnNlY3Rpb24pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEub3B0aW9uLCBlMi5vcHRpb24pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihlMSksIHJlcHIoZTIpKQorCisgICAgZGVmIHRlc3RfcGFyc2luZ2Vycm9yKHNlbGYpOgorICAgICAgICBpbXBvcnQgcGlja2xlCisgICAgICAgIGUxID0gQ29uZmlnUGFyc2VyLlBhcnNpbmdFcnJvcignc291cmNlJykKKyAgICAgICAgZTEuYXBwZW5kKDEsICdsaW5lMScpCisgICAgICAgIGUxLmFwcGVuZCgyLCAnbGluZTInKQorICAgICAgICBlMS5hcHBlbmQoMywgJ2xpbmUzJykKKyAgICAgICAgcGlja2xlZCA9IHBpY2tsZS5kdW1wcyhlMSkKKyAgICAgICAgZTIgPSBwaWNrbGUubG9hZHMocGlja2xlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5tZXNzYWdlLCBlMi5tZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLmFyZ3MsIGUyLmFyZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEuZmlsZW5hbWUsIGUyLmZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLmVycm9ycywgZTIuZXJyb3JzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZTEpLCByZXByKGUyKSkKKworICAgIGRlZiB0ZXN0X21pc3NpbmdzZWN0aW9uaGVhZGVyZXJyb3Ioc2VsZik6CisgICAgICAgIGltcG9ydCBwaWNrbGUKKyAgICAgICAgZTEgPSBDb25maWdQYXJzZXIuTWlzc2luZ1NlY3Rpb25IZWFkZXJFcnJvcignZmlsZW5hbWUnLCAxMjMsICdsaW5lJykKKyAgICAgICAgcGlja2xlZCA9IHBpY2tsZS5kdW1wcyhlMSkKKyAgICAgICAgZTIgPSBwaWNrbGUubG9hZHMocGlja2xlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5tZXNzYWdlLCBlMi5tZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLmFyZ3MsIGUyLmFyZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEubGluZSwgZTIubGluZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5maWxlbmFtZSwgZTIuZmlsZW5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEubGluZW5vLCBlMi5saW5lbm8pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihlMSksIHJlcHIoZTIpKQorCisKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAogICAgICAgICBDb25maWdQYXJzZXJUZXN0Q2FzZSwKQEAgLTYxNCw2ICs3MzQsNyBAQAogICAgICAgICBTb3J0ZWRUZXN0Q2FzZSwKICAgICAgICAgSXNzdWU3MDA1VGVzdENhc2UsCiAgICAgICAgIFRlc3RDaGFpbk1hcCwKKyAgICAgICAgRXhjZXB0aW9uUGlja2xpbmdUZXN0Q2FzZSwKICAgICAgICAgKQogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY2dpLnB5IGIvTGliL3Rlc3QvdGVzdF9jZ2kucHkKaW5kZXggNjM1NDdiMi4uYzljZjA5NSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jZ2kucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jZ2kucHkKQEAgLTUsNiArNSw4IEBACiBpbXBvcnQgdGVtcGZpbGUKIGltcG9ydCB1bml0dGVzdAogCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlCisKIGNsYXNzIEhhY2tlZFN5c01vZHVsZToKICAgICAjIFRoZSByZWdyZXNzaW9uIHRlc3Qgd2lsbCBoYXZlIHJlYWwgdmFsdWVzIGluIHN5cy5hcmd2LCB3aGljaAogICAgICMgd2lsbCBjb21wbGV0ZWx5IGNvbmZ1c2UgdGhlIHRlc3Qgb2YgdGhlIGNnaSBtb2R1bGUKQEAgLTEyMCw2ICsxMjIsMTEgQEAKIAogY2xhc3MgQ2dpVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCisgICAgZGVmIHRlc3RfZXNjYXBlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJ0ZXN0ICZhbXA7IHN0cmluZyIsIGNnaS5lc2NhcGUoInRlc3QgJiBzdHJpbmciKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiJmx0O3Rlc3Qgc3RyaW5nJmd0OyIsIGNnaS5lc2NhcGUoIjx0ZXN0IHN0cmluZz4iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiJnF1b3Q7dGVzdCBzdHJpbmcmcXVvdDsiLCBjZ2kuZXNjYXBlKCcidGVzdCBzdHJpbmciJywgVHJ1ZSkpCisKICAgICBkZWYgdGVzdF9zdHJpY3Qoc2VsZik6CiAgICAgICAgIGZvciBvcmlnLCBleHBlY3QgaW4gcGFyc2Vfc3RyaWN0X3Rlc3RfY2FzZXM6CiAgICAgICAgICAgICAjIFRlc3QgYmFzaWMgcGFyc2luZwpAQCAtMjI1LDcgKzIzMiwxNSBAQAogICAgICAgICAjIGlmIHdlJ3JlIG5vdCBjaHVua2luZyBwcm9wZXJseSwgcmVhZGxpbmUgaXMgb25seSBjYWxsZWQgdHdpY2UKICAgICAgICAgIyAoYnkgcmVhZF9iaW5hcnkpOyBpZiB3ZSBhcmUgY2h1bmtpbmcgcHJvcGVybHksIGl0IHdpbGwgYmUgY2FsbGVkIDUgdGltZXMKICAgICAgICAgIyBhcyBsb25nIGFzIHRoZSBjaHVua3NpemUgaXMgMSA8PCAxNi4KLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYubnVtY2FsbHMgPiAyKQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIoZi5udW1jYWxscywgMikKKworICAgIGRlZiB0ZXN0X2ZpZWxkc3RvcmFnZV9pbnZhbGlkKHNlbGYpOgorICAgICAgICBmcyA9IGNnaS5GaWVsZFN0b3JhZ2UoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGZzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJvb2woZnMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZnMpLCBsaXN0KGZzLmtleXMoKSkpCisgICAgICAgIGZzLmxpc3QuYXBwZW5kKG5hbWVkdHVwbGUoJ01vY2tGaWVsZFN0b3JhZ2UnLCAnbmFtZScpKCdmaWVsZHZhbHVlJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmcykKIAogICAgIGRlZiB0ZXN0X2ZpZWxkc3RvcmFnZV9tdWx0aXBhcnQoc2VsZik6CiAgICAgICAgICNUZXN0IGJhc2ljIEZpZWxkU3RvcmFnZSBtdWx0aXBhcnQgcGFyc2luZwpAQCAtMjYxLDYgKzI3NiwyOSBAQAogICAgICAgICAgICAgICAgIGdvdCA9IGdldGF0dHIoZnMubGlzdFt4XSwgaykKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwKQogCisgICAgZGVmIHRlc3RfZmllbGRzdG9yYWdlX211bHRpcGFydF9tYXhsaW5lKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxODE2NworICAgICAgICBtYXhsaW5lID0gMSA8PCAxNgorICAgICAgICBzZWxmLm1heERpZmYgPSBOb25lCisgICAgICAgIGRlZiBjaGVjayhjb250ZW50KToKKyAgICAgICAgICAgIGRhdGEgPSAiIiIKKy0tLTEyMworQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJ1cGxvYWQiOyBmaWxlbmFtZT0iZmFrZS50eHQiCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KKworJXMKKy0tLTEyMy0tCisiIiIucmVwbGFjZSgnXG4nLCAnXHJcbicpICUgY29udGVudAorICAgICAgICAgICAgZW52aXJvbiA9IHsKKyAgICAgICAgICAgICAgICAnQ09OVEVOVF9MRU5HVEgnOiAgIHN0cihsZW4oZGF0YSkpLAorICAgICAgICAgICAgICAgICdDT05URU5UX1RZUEUnOiAgICAgJ211bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PS0xMjMnLAorICAgICAgICAgICAgICAgICdSRVFVRVNUX01FVEhPRCc6ICAgJ1BPU1QnLAorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZW5fcmVzdWx0KGRhdGEsIGVudmlyb24pLCB7J3VwbG9hZCc6IGNvbnRlbnR9KQorICAgICAgICBjaGVjaygneCcgKiAobWF4bGluZSAtIDEpKQorICAgICAgICBjaGVjaygneCcgKiAobWF4bGluZSAtIDEpICsgJ1xyJykKKyAgICAgICAgY2hlY2soJ3gnICogKG1heGxpbmUgLSAxKSArICdccicgKyAneScgKiAobWF4bGluZSAtIDEpKQorCiAgICAgX3FzX3Jlc3VsdCA9IHsKICAgICAgICAgJ2tleTEnOiAndmFsdWUxJywKICAgICAgICAgJ2tleTInOiBbJ3ZhbHVlMngnLCAndmFsdWUyeSddLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jbC5weSBiL0xpYi90ZXN0L3Rlc3RfY2wucHkKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA1MDEwMmU5Li45NTgyMjgyCi0tLSBhL0xpYi90ZXN0L3Rlc3RfY2wucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jbC5weQpAQCAtMSw0ICsxLDMgQEAKLSMhIC91c3IvYmluL2VudiBweXRob24KICIiIldoaW1weSB0ZXN0IHNjcmlwdCBmb3IgdGhlIGNsIG1vZHVsZQogICAgUm9nZXIgRS4gTWFzc2UKICIiIgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jbGFzcy5weSBiL0xpYi90ZXN0L3Rlc3RfY2xhc3MucHkKaW5kZXggZGI3NWI5My4uZTVjZGYwOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jbGFzcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NsYXNzLnB5CkBAIC02MjgsNiArNjI4LDEzIEBACiAgICAgICAgIGEgPSBBKGhhc2goQS5mLmltX2Z1bmMpXigtMSkpCiAgICAgICAgIGhhc2goYS5mKQogCisgICAgZGVmIHRlc3RBdHRyU2xvdHMoc2VsZik6CisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGZvciBjIGluIEMsIEMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdHlwZShjKS5fX2dldGF0dHJpYnV0ZV9fLCBjLCBbXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdHlwZShjKS5fX3NldGF0dHJfXywgYywgW10sIFtdKQorCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygKICAgICAgICAgICAgICgiLitfXyhnZXR8c2V0fGRlbClzbGljZV9fIGhhcyBiZWVuIHJlbW92ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jbWF0aC5weSBiL0xpYi90ZXN0L3Rlc3RfY21hdGgucHkKaW5kZXggOGI1YzRiZi4uNWQxMDI2MSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jbWF0aC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NtYXRoLnB5CkBAIC0yODIsNyArMjgyLDcgQEAKIAogICAgIGRlZiB0ZXN0X3NwZWNpZmljX3ZhbHVlcyhzZWxmKToKICAgICAgICAgaWYgbm90IGZsb2F0Ll9fZ2V0Zm9ybWF0X18oImRvdWJsZSIpLnN0YXJ0c3dpdGgoIklFRUUiKToKLSAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgnbmVlZHMgSUVFRSBkb3VibGUnKQogCiAgICAgICAgIGRlZiByZWN0X2NvbXBsZXgoeik6CiAgICAgICAgICAgICAiIiJXcmFwcGVkIHZlcnNpb24gb2YgcmVjdCB0aGF0IGFjY2VwdHMgYSBjb21wbGV4IG51bWJlciBpbnN0ZWFkIG9mCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NtZC5weSBiL0xpYi90ZXN0L3Rlc3RfY21kLnB5CmluZGV4IGM0NmZlYzguLjJjYjJjODggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY21kLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY21kLnB5CkBAIC0xLDQgKzEsMyBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiAiIiIKIFRlc3Qgc2NyaXB0IGZvciB0aGUgJ2NtZCcgbW9kdWxlCiBPcmlnaW5hbCBieSBNaWNoYWVsIFNjaG5laWRlcgpAQCAtODQsMTEgKzgzLDExIEBACiAgICAgPEJMQU5LTElORT4KICAgICBEb2N1bWVudGVkIGNvbW1hbmRzICh0eXBlIGhlbHAgPHRvcGljPik6CiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIGFkZAorICAgIGFkZCAgaGVscAogICAgIDxCTEFOS0xJTkU+CiAgICAgVW5kb2N1bWVudGVkIGNvbW1hbmRzOgogICAgID09PT09PT09PT09PT09PT09PT09PT0KLSAgICBleGl0ICBoZWxwICBzaGVsbAorICAgIGV4aXQgIHNoZWxsCiAgICAgPEJMQU5LTElORT4KIAogICAgIFRlc3QgZm9yIHRoZSBmdW5jdGlvbiBwcmludF90b3BpY3MoKToKQEAgLTEyNSwxMSArMTI0LDExIEBACiAgICAgPEJMQU5LTElORT4KICAgICBEb2N1bWVudGVkIGNvbW1hbmRzICh0eXBlIGhlbHAgPHRvcGljPik6CiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIGFkZAorICAgIGFkZCAgaGVscAogICAgIDxCTEFOS0xJTkU+CiAgICAgVW5kb2N1bWVudGVkIGNvbW1hbmRzOgogICAgID09PT09PT09PT09PT09PT09PT09PT0KLSAgICBleGl0ICBoZWxwICBzaGVsbAorICAgIGV4aXQgIHNoZWxsCiAgICAgPEJMQU5LTElORT4KICAgICBoZWxwIHRleHQgZm9yIGFkZAogICAgIEhlbGxvIGZyb20gcG9zdGxvb3AKQEAgLTE4Miw2ICsxODEsMTQgQEAKICAgICAgICAgZGVmIGRvX0VPRihzZWxmLCBhcmdzKToKICAgICAgICAgICAgIHJldHVybiBUcnVlCiAKKworICAgIGNsYXNzIHNpbXBsZWNtZDIoc2ltcGxlY21kKToKKworICAgICAgICBkZWYgZG9fRU9GKHNlbGYsIGFyZ3MpOgorICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJyoqKiBVbmtub3duIHN5bnRheDogRU9GJworICAgICAgICAgICAgcmV0dXJuIFRydWUKKworCiAgICAgZGVmIHRlc3RfZmlsZV93aXRoX21pc3NpbmdfZmluYWxfbmwoc2VsZik6CiAgICAgICAgIGlucHV0ID0gU3RyaW5nSU8uU3RyaW5nSU8oInByaW50IHRlc3RcbnByaW50IHRlc3QyIikKICAgICAgICAgb3V0cHV0ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQpAQCAtMTk0LDYgKzIwMSwyNyBAQAogICAgICAgICAgICAgICIoQ21kKSAiKSkKIAogCisgICAgZGVmIHRlc3RfaW5wdXRfcmVzZXRfYXRfRU9GKHNlbGYpOgorICAgICAgICBpbnB1dCA9IFN0cmluZ0lPLlN0cmluZ0lPKCJwcmludCB0ZXN0XG5wcmludCB0ZXN0MiIpCisgICAgICAgIG91dHB1dCA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgY21kID0gc2VsZi5zaW1wbGVjbWQyKHN0ZGluPWlucHV0LCBzdGRvdXQ9b3V0cHV0KQorICAgICAgICBjbWQudXNlX3Jhd2lucHV0ID0gRmFsc2UKKyAgICAgICAgY21kLmNtZGxvb3AoKQorICAgICAgICBzZWxmLmFzc2VydE11bHRpTGluZUVxdWFsKG91dHB1dC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgKCIoQ21kKSB0ZXN0XG4iCisgICAgICAgICAgICAgIihDbWQpIHRlc3QyXG4iCisgICAgICAgICAgICAgIihDbWQpICoqKiBVbmtub3duIHN5bnRheDogRU9GXG4iKSkKKyAgICAgICAgaW5wdXQgPSBTdHJpbmdJTy5TdHJpbmdJTygicHJpbnQgXG5cbiIpCisgICAgICAgIG91dHB1dCA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgY21kLnN0ZGluID0gaW5wdXQKKyAgICAgICAgY21kLnN0ZG91dCA9IG91dHB1dAorICAgICAgICBjbWQuY21kbG9vcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0TXVsdGlMaW5lRXF1YWwob3V0cHV0LmdldHZhbHVlKCksCisgICAgICAgICAgICAoIihDbWQpIFxuIgorICAgICAgICAgICAgICIoQ21kKSBcbiIKKyAgICAgICAgICAgICAiKENtZCkgKioqIFVua25vd24gc3ludGF4OiBFT0ZcbiIpKQorCisKIGRlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKICAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3RfY21kCiAgICAgdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3RfY21kLCB2ZXJib3NlKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jbWRfbGluZS5weSBiL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmUucHkKaW5kZXggYmUzYjcwZS4uMTJmMjZkOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jbWRfbGluZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NtZF9saW5lLnB5CkBAIC0yLDkgKzIsMTMgQEAKICMgQWxsIHRlc3RzIGFyZSBleGVjdXRlZCB3aXRoIGVudmlyb25tZW50IHZhcmlhYmxlcyBpZ25vcmVkCiAjIFNlZSB0ZXN0X2NtZF9saW5lX3NjcmlwdC5weSBmb3IgdGVzdGluZyBvZiBzY3JpcHQgZXhlY3V0aW9uCiAKLWltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydCwgdW5pdHRlc3QKK2ltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydAogaW1wb3J0IHN5cwotZnJvbSB0ZXN0LnNjcmlwdF9oZWxwZXIgaW1wb3J0IHNwYXduX3B5dGhvbiwga2lsbF9weXRob24sIHB5dGhvbl9leGl0X2NvZGUKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnNjcmlwdF9oZWxwZXIgaW1wb3J0ICgKKyAgICBhc3NlcnRfcHl0aG9uX29rLCBhc3NlcnRfcHl0aG9uX2ZhaWx1cmUsIHNwYXduX3B5dGhvbiwga2lsbF9weXRob24sCisgICAgcHl0aG9uX2V4aXRfY29kZQorKQogCiAKIGNsYXNzIENtZExpbmVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTg2LDYgKzkwLDUwIEBACiAgICAgICAgICAgICBzZWxmLmV4aXRfY29kZSgnLWMnLCAncGFzcycpLAogICAgICAgICAgICAgMCkKIAorICAgIGRlZiB0ZXN0X2hhc2hfcmFuZG9taXphdGlvbihzZWxmKToKKyAgICAgICAgIyBWZXJpZnkgdGhhdCAtUiBlbmFibGVzIGhhc2ggcmFuZG9taXphdGlvbjoKKyAgICAgICAgc2VsZi52ZXJpZnlfdmFsaWRfZmxhZygnLVInKQorICAgICAgICBoYXNoZXMgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgyKToKKyAgICAgICAgICAgIGNvZGUgPSAncHJpbnQoaGFzaCgic3BhbSIpKScKKyAgICAgICAgICAgIGRhdGEgPSBzZWxmLnN0YXJ0X3B5dGhvbignLVInLCAnLWMnLCBjb2RlKQorICAgICAgICAgICAgaGFzaGVzLmFwcGVuZChkYXRhKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGhhc2hlc1swXSwgaGFzaGVzWzFdKQorCisgICAgICAgICMgVmVyaWZ5IHRoYXQgc3lzLmZsYWdzIGNvbnRhaW5zIGhhc2hfcmFuZG9taXphdGlvbgorICAgICAgICBjb2RlID0gJ2ltcG9ydCBzeXM7IHByaW50IHN5cy5mbGFncycKKyAgICAgICAgZGF0YSA9IHNlbGYuc3RhcnRfcHl0aG9uKCctUicsICctYycsIGNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnaGFzaF9yYW5kb21pemF0aW9uPTEnIGluIGRhdGEpCisKKyAgICBkZWYgdGVzdF9kZWxfX19tYWluX18oc2VsZik6CisgICAgICAgICMgSXNzdWUgIzE1MDAxOiBQeVJ1bl9TaW1wbGVGaWxlRXhGbGFncygpIGRpZCBjcmFzaCBiZWNhdXNlIGl0IGtlcHQgYQorICAgICAgICAjIGJvcnJvd2VkIHJlZmVyZW5jZSB0byB0aGUgZGljdCBvZiBfX21haW5fXyBtb2R1bGUgYW5kIGxhdGVyIG1vZGlmeQorICAgICAgICAjIHRoZSBkaWN0IHdoZXJlYXMgdGhlIG1vZHVsZSB3YXMgZGVzdHJveWVkCisgICAgICAgIGZpbGVuYW1lID0gdGVzdC50ZXN0X3N1cHBvcnQuVEVTVEZOCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cCh0ZXN0LnRlc3Rfc3VwcG9ydC51bmxpbmssIGZpbGVuYW1lKQorICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJ3IikgYXMgc2NyaXB0OgorICAgICAgICAgICAgcHJpbnQgPj5zY3JpcHQsICJpbXBvcnQgc3lzIgorICAgICAgICAgICAgcHJpbnQgPj5zY3JpcHQsICJkZWwgc3lzLm1vZHVsZXNbJ19fbWFpbl9fJ10iCisgICAgICAgIGFzc2VydF9weXRob25fb2soZmlsZW5hbWUpCisKKyAgICBkZWYgdGVzdF91bmtub3duX29wdGlvbnMoc2VsZik6CisgICAgICAgIHJjLCBvdXQsIGVyciA9IGFzc2VydF9weXRob25fZmFpbHVyZSgnLUUnLCAnLXonKQorICAgICAgICBzZWxmLmFzc2VydEluKGInVW5rbm93biBvcHRpb246IC16JywgZXJyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyci5zcGxpdGxpbmVzKCkuY291bnQoYidVbmtub3duIG9wdGlvbjogLXonKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJycsIG91dCkKKyAgICAgICAgIyBBZGQgIndpdGhvdXQ9Jy1FJyIgdG8gcHJldmVudCBfYXNzZXJ0X3B5dGhvbiB0byBhcHBlbmQgLUUKKyAgICAgICAgIyB0byBlbnZfdmFycyBhbmQgY2hhbmdlIHRoZSBvdXRwdXQgb2Ygc3RkZXJyCisgICAgICAgIHJjLCBvdXQsIGVyciA9IGFzc2VydF9weXRob25fZmFpbHVyZSgnLXonLCB3aXRob3V0PSctRScpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oYidVbmtub3duIG9wdGlvbjogLXonLCBlcnIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLnNwbGl0bGluZXMoKS5jb3VudChiJ1Vua25vd24gb3B0aW9uOiAteicpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInJywgb3V0KQorICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX2ZhaWx1cmUoJy1hJywgJy16Jywgd2l0aG91dD0nLUUnKQorICAgICAgICBzZWxmLmFzc2VydEluKGInVW5rbm93biBvcHRpb246IC1hJywgZXJyKQorICAgICAgICAjIG9ubHkgdGhlIGZpcnN0IHVua25vd24gb3B0aW9uIGlzIHJlcG9ydGVkCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oYidVbmtub3duIG9wdGlvbjogLXonLCBlcnIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLnNwbGl0bGluZXMoKS5jb3VudChiJ1Vua25vd24gb3B0aW9uOiAtYScpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInJywgb3V0KQorCiAKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0LnRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQ21kTGluZVRlc3QpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NtZF9saW5lX3NjcmlwdC5weSBiL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmVfc2NyaXB0LnB5CmluZGV4IDA5OTQ3MWYuLjhiMDUyMjcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmVfc2NyaXB0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmVfc2NyaXB0LnB5CkBAIC02LDExICs2LDE0IEBACiBpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQKIGZyb20gdGVzdC5zY3JpcHRfaGVscGVyIGltcG9ydCAocnVuX3B5dGhvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcF9kaXIsIG1ha2Vfc2NyaXB0LCBjb21waWxlX3NjcmlwdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wa2csIG1ha2VfemlwX3NjcmlwdCwgbWFrZV96aXBfcGtnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRfcHl0aG9uX2ZhaWx1cmUsIG1ha2VfcGtnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3ppcF9zY3JpcHQsIG1ha2VfemlwX3BrZykKIAogdmVyYm9zZSA9IHRlc3QudGVzdF9zdXBwb3J0LnZlcmJvc2UKIAogCitleGFtcGxlX2FyZ3MgPSBbJ3Rlc3QxJywgJ3Rlc3QyJywgJ3Rlc3QzJ10KKwogdGVzdF9zb3VyY2UgPSAiIiJcCiAjIFNjcmlwdCBtYXkgYmUgcnVuIHdpdGggb3B0aW1pc2F0aW9uIGVuYWJsZWQsIHNvIGRvbid0IHJlbHkgb24gYXNzZXJ0CiAjIHN0YXRlbWVudHMgYmVpbmcgZXhlY3V0ZWQKQEAgLTIwNCw2ICsyMDcsMTkgQEAKICAgICAgICAgICAgIGxhdW5jaF9uYW1lID0gX21ha2VfbGF1bmNoX3NjcmlwdChzY3JpcHRfZGlyLCAnbGF1bmNoJywgJ3Rlc3RfcGtnJykKICAgICAgICAgICAgIHNlbGYuX2NoZWNrX2ltcG9ydF9lcnJvcihsYXVuY2hfbmFtZSwgbXNnKQogCisgICAgZGVmIHRlc3RfZGFzaF9tX2Vycm9yX2NvZGVfaXNfb25lKHNlbGYpOgorICAgICAgICAjIElmIGEgbW9kdWxlIGlzIGludm9rZWQgd2l0aCB0aGUgLW0gY29tbWFuZCBsaW5lIGZsYWcKKyAgICAgICAgIyBhbmQgcmVzdWx0cyBpbiBhbiBlcnJvciB0aGF0IHRoZSByZXR1cm4gY29kZSB0byB0aGUKKyAgICAgICAgIyBzaGVsbCBpcyAnMScKKyAgICAgICAgd2l0aCB0ZW1wX2RpcigpIGFzIHNjcmlwdF9kaXI6CisgICAgICAgICAgICBwa2dfZGlyID0gb3MucGF0aC5qb2luKHNjcmlwdF9kaXIsICd0ZXN0X3BrZycpCisgICAgICAgICAgICBtYWtlX3BrZyhwa2dfZGlyKQorICAgICAgICAgICAgc2NyaXB0X25hbWUgPSBfbWFrZV90ZXN0X3NjcmlwdChwa2dfZGlyLCAnb3RoZXInLCAiaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzogcmFpc2UgVmFsdWVFcnJvciIpCisgICAgICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX2ZhaWx1cmUoJy1tJywgJ3Rlc3RfcGtnLm90aGVyJywgKmV4YW1wbGVfYXJncykKKyAgICAgICAgICAgIGlmIHZlcmJvc2UgPiAxOgorICAgICAgICAgICAgICAgIHByaW50KG91dCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmMsIDEpCisKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3QudGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChDbWRMaW5lVGVzdCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZS5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZS5weQppbmRleCA5N2FkZjU5Li5jNTg4OTk5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlLnB5CkBAIC04Miw3ICs4Miw3IEBACiAKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHdlYWtyZWYKLWltcG9ydCBfdGVzdGNhcGkKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl9kb2N0ZXN0LCBydW5fdW5pdHRlc3QsIGNweXRob25fb25seQogCiAKIGRlZiBjb25zdHModCk6CkBAIC0xMDQsNyArMTA0LDkgQEAKIAogY2xhc3MgQ29kZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCisgICAgQGNweXRob25fb25seQogICAgIGRlZiB0ZXN0X25ld2VtcHR5KHNlbGYpOgorICAgICAgICBpbXBvcnQgX3Rlc3RjYXBpCiAgICAgICAgIGNvID0gX3Rlc3RjYXBpLmNvZGVfbmV3ZW1wdHkoImZpbGVuYW1lIiwgImZ1bmNuYW1lIiwgMTUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY28uY29fZmlsZW5hbWUsICJmaWxlbmFtZSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY28uY29fbmFtZSwgImZ1bmNuYW1lIikKQEAgLTEzNyw3ICsxMzksNiBAQAogCiAKIGRlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKLSAgICBmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fZG9jdGVzdCwgcnVuX3VuaXR0ZXN0CiAgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X2NvZGUKICAgICBydW5fZG9jdGVzdCh0ZXN0X2NvZGUsIHZlcmJvc2UpCiAgICAgcnVuX3VuaXR0ZXN0KENvZGVUZXN0LCBDb2RlV2Vha1JlZlRlc3QpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjY2FsbGJhY2tzLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY2NhbGxiYWNrcy5weQppbmRleCA0ODI1ZjQzLi5kYmRiNGY0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjY2FsbGJhY2tzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNjYWxsYmFja3MucHkKQEAgLTY2LDE1ICs2NiwzNCBAQAogICAgICAgICAjIHJlcGxhY2UgdW5lbmNvZGFibGUgY2hhcmFjdGVycyB3aGljaCBudW1lcmljIGNoYXJhY3RlciBlbnRpdGllcy4KICAgICAgICAgIyBGb3IgYXNjaWksIGxhdGluLTEgYW5kIGNoYXJtYXBzIHRoaXMgaXMgY29tcGxldGVseSBpbXBsZW1lbnRlZAogICAgICAgICAjIGluIEMgYW5kIHNob3VsZCBiZSByZWFzb25hYmx5IGZhc3QuCi0gICAgICAgIHMgPSB1Ilx1MzBiOVx1MzBkMVx1MzBlMiBceGU0bmQgZWdncyIKKyAgICAgICAgcyA9IHUiXHUzMGI5XHUzMGQxXHUzMGUyIFx4ZTRuZCBlZ2dcdTAxNjEiCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICBzLmVuY29kZSgiYXNjaWkiLCAieG1sY2hhcnJlZnJlcGxhY2UiKSwKLSAgICAgICAgICAgICImIzEyNDczOyYjMTI0OTc7JiMxMjUxNDsgJiMyMjg7bmQgZWdncyIKKyAgICAgICAgICAgICImIzEyNDczOyYjMTI0OTc7JiMxMjUxNDsgJiMyMjg7bmQgZWdnJiMzNTM7IgogICAgICAgICApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICBzLmVuY29kZSgibGF0aW4tMSIsICJ4bWxjaGFycmVmcmVwbGFjZSIpLAotICAgICAgICAgICAgIiYjMTI0NzM7JiMxMjQ5NzsmIzEyNTE0OyBceGU0bmQgZWdncyIKKyAgICAgICAgICAgICImIzEyNDczOyYjMTI0OTc7JiMxMjUxNDsgXHhlNG5kIGVnZyYjMzUzOyIKICAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgcy5lbmNvZGUoImlzby04ODU5LTE1IiwgInhtbGNoYXJyZWZyZXBsYWNlIiksCisgICAgICAgICAgICAiJiMxMjQ3MzsmIzEyNDk3OyYjMTI1MTQ7IFx4ZTRuZCBlZ2dceGE4IgorICAgICAgICApCisKKyAgICBkZWYgdGVzdF94bWxjaGFycmVmcmVwbGFjZV93aXRoX3N1cnJvZ2F0ZXMoc2VsZik6CisgICAgICAgIHRlc3RzID0gWyh1J1xVMDAwMWY0OWQnLCAnJiMxMjgxNTc7JyksCisgICAgICAgICAgICAgICAgICh1J1x1ZDgzZCcsICcmIzU1MzU3OycpLAorICAgICAgICAgICAgICAgICAodSdcdWRjOWQnLCAnJiM1NjQ3NzsnKSwKKyAgICAgICAgICAgICAgICBdCisgICAgICAgIGlmIHUnXHVkODNkXHVkYzlkJyAhPSB1J1xVMDAwMWY0OWQnOgorICAgICAgICAgICAgdGVzdHMgKz0gWyh1J1x1ZDgzZFx1ZGM5ZCcsICcmIzU1MzU3OyYjNTY0Nzc7JyldCisgICAgICAgIGZvciBlbmNvZGluZyBpbiBbJ2FzY2lpJywgJ2xhdGluMScsICdpc28tODg1OS0xNSddOgorICAgICAgICAgICAgZm9yIHMsIGV4cCBpbiB0ZXN0czoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZW5jb2RlKGVuY29kaW5nLCAneG1sY2hhcnJlZnJlcGxhY2UnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cCwgbXNnPSclci5lbmNvZGUoJXIpJyAlIChzLCBlbmNvZGluZykpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgocysnWCcpLmVuY29kZShlbmNvZGluZywgJ3htbGNoYXJyZWZyZXBsYWNlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHArJ1gnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSclci5lbmNvZGUoJXIpJyAlIChzICsgJ1gnLCBlbmNvZGluZykpCiAKICAgICBkZWYgdGVzdF94bWxjaGFybmFtZXJlcGxhY2Uoc2VsZik6CiAgICAgICAgICMgVGhpcyB0aW1lIHVzZSBhIG5hbWVkIGNoYXJhY3RlciBlbnRpdHkgZm9yIHVuZW5jb2RhYmxlCkBAIC0yNjIsMTIgKzI4MSwxMiBAQAogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICAiXFx1MzA0Mlx1M3h4eCIuZGVjb2RlKCJ1bmljb2RlLWVzY2FwZSIsICJ0ZXN0LmhhbmRsZXIxIiksCi0gICAgICAgICAgICB1Ilx1MzA0Mls8OTI+PDExNz48NTE+PDEyMD5deHgiCisgICAgICAgICAgICB1Ilx1MzA0Mls8OTI+PDExNz48NTE+XXh4eCIKICAgICAgICAgKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICAiXFx1MzA0Mlx1M3h4Ii5kZWNvZGUoInVuaWNvZGUtZXNjYXBlIiwgInRlc3QuaGFuZGxlcjEiKSwKLSAgICAgICAgICAgIHUiXHUzMDQyWzw5Mj48MTE3Pjw1MT48MTIwPjwxMjA+XSIKKyAgICAgICAgICAgIHUiXHUzMDQyWzw5Mj48MTE3Pjw1MT5deHgiCiAgICAgICAgICkKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKApAQCAtNzE3LDcgKzczNiw3IEBACiAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIGNvZGVjcy5jaGFybWFwX2RlY29kZSwgIlx4ZmYiLCAic3RyaWN0IiwgezB4ZmY6IE5vbmV9KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb2RlY3MuY2hhcm1hcF9kZWNvZGUsICJceGZmIiwgInN0cmljdCIsIEQoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb2RlY3MuY2hhcm1hcF9kZWNvZGUsICJceGZmIiwgInN0cmljdCIsIHsweGZmOiBzeXMubWF4dW5pY29kZSsxfSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb2RlY3MuY2hhcm1hcF9kZWNvZGUsICJceGZmIiwgInN0cmljdCIsIHsweGZmOiAweDExMDAwMH0pCiAKICAgICBkZWYgdGVzdF9lbmNvZGVoZWxwZXIoc2VsZik6CiAgICAgICAgICMgZW5oYW5jZSBjb3ZlcmFnZSBvZjoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfY24ucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2NuLnB5CmluZGV4IDIxNWU4ZGUuLmNkMTAyZmQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfY24ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19jbi5weQpAQCAtMSw0ICsxLDMgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgogIwogIyB0ZXN0X2NvZGVjZW5jb2RpbmdzX2NuLnB5CiAjICAgQ29kZWMgZW5jb2RpbmcgdGVzdHMgZm9yIFBSQyBlbmNvZGluZ3MuCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2hrLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19oay5weQppbmRleCBiMWMyNjA2Li4zOTFjMzE2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2hrLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaGsucHkKQEAgLTEsNCArMSwzIEBACi0jIS91c3IvYmluL2VudiBweXRob24KICMKICMgdGVzdF9jb2RlY2VuY29kaW5nc19oay5weQogIyAgIENvZGVjIGVuY29kaW5nIHRlc3RzIGZvciBIb25nS29uZyBlbmNvZGluZ3MuCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2lzbzIwMjIucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2lzbzIwMjIucHkKaW5kZXggOWQxZDJhZi4uOWYyMzYyOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19pc28yMDIyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaXNvMjAyMi5weQpAQCAtMSw1ICsxLDMgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotIwogIyBDb2RlYyBlbmNvZGluZyB0ZXN0cyBmb3IgSVNPIDIwMjIgZW5jb2RpbmdzLgogCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydApAQCAtMzYsNiArMzQsNyBAQAogCiAgICAgIyBpc28yMDIyX2tyLnR4dCBjYW5ub3QgYmUgdXNlZCB0byB0ZXN0ICJjaHVuayBjb2RpbmciOiB0aGUgZXNjYXBlCiAgICAgIyBzZXF1ZW5jZSBpcyBvbmx5IHdyaXR0ZW4gb24gdGhlIGZpcnN0IGxpbmUKKyAgICBAdW5pdHRlc3Quc2tpcCgnaXNvMjAyMl9rci50eHQgY2Fubm90IGJlIHVzZWQgdG8gdGVzdCAiY2h1bmsgY29kaW5nIicpCiAgICAgZGVmIHRlc3RfY2h1bmtjb2Rpbmcoc2VsZik6CiAgICAgICAgIHBhc3MKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19qcC5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfanAucHkKaW5kZXggNWY4MWY0MS4uZjNjZjkyMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19qcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2pwLnB5CkBAIC0xLDQgKzEsMyBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiAjCiAjIHRlc3RfY29kZWNlbmNvZGluZ3NfanAucHkKICMgICBDb2RlYyBlbmNvZGluZyB0ZXN0cyBmb3IgSmFwYW5lc2UgZW5jb2RpbmdzLgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19rci5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3Nfa3IucHkKaW5kZXggOGM4NjZhOS4uNDVlYTYyYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19rci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2tyLnB5CkBAIC0xLDQgKzEsMyBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiAjCiAjIHRlc3RfY29kZWNlbmNvZGluZ3Nfa3IucHkKICMgICBDb2RlYyBlbmNvZGluZyB0ZXN0cyBmb3IgUk9LIGVuY29kaW5ncy4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfdHcucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX3R3LnB5CmluZGV4IDk4M2QwNmYuLmM2MmQzMjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfdHcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc190dy5weQpAQCAtMSw0ICsxLDMgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgogIwogIyB0ZXN0X2NvZGVjZW5jb2RpbmdzX3R3LnB5CiAjICAgQ29kZWMgZW5jb2RpbmcgdGVzdHMgZm9yIFJPQyBlbmNvZGluZ3MuCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19jbi5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX2NuLnB5CmluZGV4IDM0NGZjNTYuLjlmNDI4NTggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX2NuLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX2NuLnB5CkBAIC0xLDQgKzEsMyBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiAjCiAjIHRlc3RfY29kZWNtYXBzX2NuLnB5CiAjICAgQ29kZWMgbWFwcGluZyB0ZXN0cyBmb3IgUFJDIGVuY29kaW5ncwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfaGsucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19oay5weQppbmRleCAzNjJhYjdmLi4zZmQzZWI4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19oay5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19oay5weQpAQCAtMSw0ICsxLDMgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgogIwogIyB0ZXN0X2NvZGVjbWFwc19oay5weQogIyAgIENvZGVjIG1hcHBpbmcgdGVzdHMgZm9yIEhvbmdLb25nIGVuY29kaW5ncwpAQCAtMTcsNSArMTYsNCBAQAogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoX19uYW1lX18pCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgdGVzdF9zdXBwb3J0LnVzZV9yZXNvdXJjZXMgPSBbJ3VybGZldGNoJ10KICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfanAucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19qcC5weQppbmRleCA1NDY2YTk4Li4wYmY0M2I2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19qcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19qcC5weQpAQCAtMSw0ICsxLDMgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgogIwogIyB0ZXN0X2NvZGVjbWFwc19qcC5weQogIyAgIENvZGVjIG1hcHBpbmcgdGVzdHMgZm9yIEphcGFuZXNlIGVuY29kaW5ncwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfa3IucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19rci5weQppbmRleCAzOWM2MTJlLi5iMjUxM2VhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19rci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19rci5weQpAQCAtMSw0ICsxLDMgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgogIwogIyB0ZXN0X2NvZGVjbWFwc19rci5weQogIyAgIENvZGVjIG1hcHBpbmcgdGVzdHMgZm9yIFJPSyBlbmNvZGluZ3MKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX3R3LnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfdHcucHkKaW5kZXggMTQzYWUyMy4uZmY2YTM1NiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfdHcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfdHcucHkKQEAgLTEsNCArMSwzIEBACi0jIS91c3IvYmluL2VudiBweXRob24KICMKICMgdGVzdF9jb2RlY21hcHNfdHcucHkKICMgICBDb2RlYyBtYXBwaW5nIHRlc3RzIGZvciBST0MgZW5jb2RpbmdzCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjcy5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5CmluZGV4IGQ0MzRmODMuLmYyZWM2NzAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5CkBAIC0yLDcgKzIsMTIgQEAKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IGNvZGVjcwogaW1wb3J0IGxvY2FsZQotaW1wb3J0IHN5cywgU3RyaW5nSU8sIF90ZXN0Y2FwaQoraW1wb3J0IHN5cywgU3RyaW5nSU8KKworZGVmIGNvZGluZ19jaGVja2VyKHNlbGYsIGNvZGVyKToKKyAgICBkZWYgY2hlY2soaW5wdXQsIGV4cGVjdCk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29kZXIoaW5wdXQpLCAoZXhwZWN0LCBsZW4oaW5wdXQpKSkKKyAgICByZXR1cm4gY2hlY2sKIAogY2xhc3MgUXVldWUob2JqZWN0KToKICAgICAiIiIKQEAgLTkyLDE5ICs5NywyMCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRhbGxsaW5lcyhzLCBUcnVlLCAxMCksIHNleHBlY3RlZCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkYWxsbGluZXMocywgRmFsc2UsIDEwKSwgc2V4cGVjdGVkbm9lbmRzKQogCisgICAgICAgIGxpbmVlbmRzID0gKCJcbiIsICJcclxuIiwgIlxyIiwgdSJcdTIwMjgiKQogICAgICAgICAjIFRlc3QgbG9uZyBsaW5lcyAobXVsdGlwbGUgY2FsbHMgdG8gcmVhZCgpIGluIHJlYWRsaW5lKCkpCiAgICAgICAgIHZ3ID0gW10KICAgICAgICAgdndvID0gW10KLSAgICAgICAgZm9yIChpLCBsaW5lZW5kKSBpbiBlbnVtZXJhdGUodSJcbiBcclxuIFxyIFx1MjAyOCIuc3BsaXQoKSk6Ci0gICAgICAgICAgICB2dy5hcHBlbmQoKGkqMjAwKSp1IlwzMDQyIiArIGxpbmVlbmQpCi0gICAgICAgICAgICB2d28uYXBwZW5kKChpKjIwMCkqdSJcMzA0MiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGFsbGxpbmVzKCIiLmpvaW4odncpLCBUcnVlKSwgIiIuam9pbih2dykpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGFsbGxpbmVzKCIiLmpvaW4odncpLCBGYWxzZSksIiIuam9pbih2d28pKQorICAgICAgICBmb3IgKGksIGxpbmVlbmQpIGluIGVudW1lcmF0ZShsaW5lZW5kcyk6CisgICAgICAgICAgICB2dy5hcHBlbmQoKGkqMjAwKzIwMCkqdSJcdTMwNDIiICsgbGluZWVuZCkKKyAgICAgICAgICAgIHZ3by5hcHBlbmQoKGkqMjAwKzIwMCkqdSJcdTMwNDIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRhbGxsaW5lcygiIi5qb2luKHZ3KSwgVHJ1ZSksICJ8Ii5qb2luKHZ3KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkYWxsbGluZXMoIiIuam9pbih2dyksIEZhbHNlKSwgInwiLmpvaW4odndvKSkKIAogICAgICAgICAjIFRlc3QgbGluZXMgd2hlcmUgdGhlIGZpcnN0IHJlYWQgbWlnaHQgZW5kIHdpdGggXHIsIHNvIHRoZQogICAgICAgICAjIHJlYWRlciBoYXMgdG8gbG9vayBhaGVhZCB3aGV0aGVyIHRoaXMgaXMgYSBsb25lIFxyIG9yIGEgXHJcbgogICAgICAgICBmb3Igc2l6ZSBpbiB4cmFuZ2UoODApOgotICAgICAgICAgICAgZm9yIGxpbmVlbmQgaW4gdSJcbiBcclxuIFxyIFx1MjAyOCIuc3BsaXQoKToKKyAgICAgICAgICAgIGZvciBsaW5lZW5kIGluIGxpbmVlbmRzOgogICAgICAgICAgICAgICAgIHMgPSAxMCooc2l6ZSp1ImEiICsgbGluZWVuZCArIHUieHh4XG4iKQogICAgICAgICAgICAgICAgIHJlYWRlciA9IGdldHJlYWRlcihzKQogICAgICAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMCk6CkBAIC0xMTIsMTIgKzExOCw1NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRsaW5lKGtlZXBlbmRzPVRydWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSp1ImEiICsgbGluZWVuZCwKICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRsaW5lKGtlZXBlbmRzPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgInh4eFxuIiwKKyAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgIHJlYWRlciA9IGdldHJlYWRlcihzKQogICAgICAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMCk6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIucmVhZGxpbmUoa2VlcGVuZHM9RmFsc2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSp1ImEiLAogICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIucmVhZGxpbmUoa2VlcGVuZHM9RmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgInh4eCIsCisgICAgICAgICAgICAgICAgICAgICkKKworICAgIGRlZiB0ZXN0X21peGVkX3JlYWRsaW5lX2FuZF9yZWFkKHNlbGYpOgorICAgICAgICBsaW5lcyA9IFsiSHVtcHR5IER1bXB0eSBzYXQgb24gYSB3YWxsLFxuIiwKKyAgICAgICAgICAgICAgICAgIkh1bXB0eSBEdW1wdHkgaGFkIGEgZ3JlYXQgZmFsbC5cclxuIiwKKyAgICAgICAgICAgICAgICAgIkFsbCB0aGUga2luZydzIGhvcnNlcyBhbmQgYWxsIHRoZSBraW5nJ3MgbWVuXHIiLAorICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgcHV0IEh1bXB0eSB0b2dldGhlciBhZ2Fpbi4iXQorICAgICAgICBkYXRhID0gJycuam9pbihsaW5lcykKKyAgICAgICAgZGVmIGdldHJlYWRlcigpOgorICAgICAgICAgICAgc3RyZWFtID0gU3RyaW5nSU8uU3RyaW5nSU8oZGF0YS5lbmNvZGUoc2VsZi5lbmNvZGluZykpCisgICAgICAgICAgICByZXR1cm4gY29kZWNzLmdldHJlYWRlcihzZWxmLmVuY29kaW5nKShzdHJlYW0pCisKKyAgICAgICAgIyBJc3N1ZSAjODI2MDogVGVzdCByZWFkbGluZSgpIGZvbGxvd2VkIGJ5IHJlYWQoKQorICAgICAgICBmID0gZ2V0cmVhZGVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRsaW5lKCksIGxpbmVzWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCAnJy5qb2luKGxpbmVzWzE6XSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksICcnKQorCisgICAgICAgICMgSXNzdWUgIzE2NjM2OiBUZXN0IHJlYWRsaW5lKCkgZm9sbG93ZWQgYnkgcmVhZGxpbmVzKCkKKyAgICAgICAgZiA9IGdldHJlYWRlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkbGluZSgpLCBsaW5lc1swXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRsaW5lcygpLCBsaW5lc1sxOl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksICcnKQorCisgICAgICAgICMgVGVzdCByZWFkKCkgZm9sbG93ZWQgYnkgcmVhZCgpCisgICAgICAgIGYgPSBnZXRyZWFkZXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZChzaXplPTQwLCBjaGFycz01KSwgZGF0YVs6NV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksIGRhdGFbNTpdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCAnJykKKworICAgICAgICAjIElzc3VlICMxMjQ0NjogVGVzdCByZWFkKCkgZm9sbG93ZWQgYnkgcmVhZGxpbmVzKCkKKyAgICAgICAgZiA9IGdldHJlYWRlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKHNpemU9NDAsIGNoYXJzPTUpLCBkYXRhWzo1XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRsaW5lcygpLCBbbGluZXNbMF1bNTpdXSArIGxpbmVzWzE6XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgJycpCiAKICAgICBkZWYgdGVzdF9idWcxMTc1Mzk2KHNlbGYpOgogICAgICAgICBzID0gWwpAQCAtMjgxLDcgKzMyOSw3IEBACiAKICAgICBkZWYgdGVzdF9wYXJ0aWFsKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX3BhcnRpYWwoCi0gICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmIiwKKyAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmZcVTAwMDEwMDAwIiwKICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICB1IiIsICMgZmlyc3QgYnl0ZSBvZiBCT00gcmVhZAogICAgICAgICAgICAgICAgIHUiIiwgIyBzZWNvbmQgYnl0ZSBvZiBCT00gcmVhZApAQCAtMzAzLDYgKzM1MSwxMCBAQAogICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDAiLAogICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDAiLAogICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmZcVTAwMDEwMDAwIiwKICAgICAgICAgICAgIF0KICAgICAgICAgKQogCkBAIC0zMzEsNyArMzgzLDcgQEAKIAogICAgIGRlZiB0ZXN0X3BhcnRpYWwoc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tfcGFydGlhbCgKLSAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZlxVMDAwMTAwMDAiLAogICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgIHUiIiwKICAgICAgICAgICAgICAgICB1IiIsCkBAIC0zNDksNiArNDAxLDEwIEBACiAgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMCIsCiAgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMCIsCiAgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZlxVMDAwMTAwMDAiLAogICAgICAgICAgICAgXQogICAgICAgICApCiAKQEAgLTM3MSw3ICs0MjcsNyBAQAogCiAgICAgZGVmIHRlc3RfcGFydGlhbChzZWxmKToKICAgICAgICAgc2VsZi5jaGVja19wYXJ0aWFsKAotICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmXFUwMDAxMDAwMCIsCiAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgdSIiLAogICAgICAgICAgICAgICAgIHUiIiwKQEAgLTM4OSw2ICs0NDUsMTAgQEAKICAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwIiwKICAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwIiwKICAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmXFUwMDAxMDAwMCIsCiAgICAgICAgICAgICBdCiAgICAgICAgICkKIApAQCAtNDM5LDcgKzQ5OSw3IEBACiAKICAgICBkZWYgdGVzdF9wYXJ0aWFsKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX3BhcnRpYWwoCi0gICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmIiwKKyAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmZcVTAwMDEwMDAwIiwKICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICB1IiIsICMgZmlyc3QgYnl0ZSBvZiBCT00gcmVhZAogICAgICAgICAgICAgICAgIHUiIiwgIyBzZWNvbmQgYnl0ZSBvZiBCT00gcmVhZCA9PiBieXRlb3JkZXIga25vd24KQEAgLTQ1MSw2ICs1MTEsMTAgQEAKICAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwIiwKICAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwIiwKICAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmXFUwMDAxMDAwMCIsCiAgICAgICAgICAgICBdCiAgICAgICAgICkKIApAQCAtNDgxLDcgKzU0NSw3IEBACiAKICAgICBkZWYgdGVzdF9wYXJ0aWFsKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX3BhcnRpYWwoCi0gICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmIiwKKyAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmZcVTAwMDEwMDAwIiwKICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICB1IiIsCiAgICAgICAgICAgICAgICAgdSJceDAwIiwKQEAgLTQ5MSwxOCArNTU1LDM0IEBACiAgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMCIsCiAgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMCIsCiAgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZlxVMDAwMTAwMDAiLAogICAgICAgICAgICAgXQogICAgICAgICApCiAKICAgICBkZWYgdGVzdF9lcnJvcnMoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgY29kZWNzLnV0Zl8xNl9sZV9kZWNvZGUsICJceGZmIiwgInN0cmljdCIsIFRydWUpCisgICAgICAgIHRlc3RzID0gWworICAgICAgICAgICAgKGInXHhmZicsIHUnXHVmZmZkJyksCisgICAgICAgICAgICAoYidBXHgwMFonLCB1J0FcdWZmZmQnKSwKKyAgICAgICAgICAgIChiJ0FceDAwQlx4MDBDXHgwMERceDAwWicsIHUnQUJDRFx1ZmZmZCcpLAorICAgICAgICAgICAgKGInXHgwMFx4ZDgnLCB1J1x1ZmZmZCcpLAorICAgICAgICAgICAgKGInXHgwMFx4ZDhBJywgdSdcdWZmZmQnKSwKKyAgICAgICAgICAgIChiJ1x4MDBceGQ4QVx4MDAnLCB1J1x1ZmZmZEEnKSwKKyAgICAgICAgICAgIChiJ1x4MDBceGRjQVx4MDAnLCB1J1x1ZmZmZEEnKSwKKyAgICAgICAgXQorICAgICAgICBmb3IgcmF3LCBleHBlY3RlZCBpbiB0ZXN0czoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgY29kZWNzLnV0Zl8xNl9sZV9kZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXcsICdzdHJpY3QnLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYXcuZGVjb2RlKCd1dGYtMTZsZScsICdyZXBsYWNlJyksIGV4cGVjdGVkKQogCiBjbGFzcyBVVEYxNkJFVGVzdChSZWFkVGVzdCk6CiAgICAgZW5jb2RpbmcgPSAidXRmLTE2LWJlIgogCiAgICAgZGVmIHRlc3RfcGFydGlhbChzZWxmKToKICAgICAgICAgc2VsZi5jaGVja19wYXJ0aWFsKAotICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmXFUwMDAxMDAwMCIsCiAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgdSIiLAogICAgICAgICAgICAgICAgIHUiXHgwMCIsCkBAIC01MTIsMTggKzU5MiwzNCBAQAogICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDAiLAogICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDAiLAogICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmZcVTAwMDEwMDAwIiwKICAgICAgICAgICAgIF0KICAgICAgICAgKQogCiAgICAgZGVmIHRlc3RfZXJyb3JzKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIGNvZGVjcy51dGZfMTZfYmVfZGVjb2RlLCAiXHhmZiIsICJzdHJpY3QiLCBUcnVlKQorICAgICAgICB0ZXN0cyA9IFsKKyAgICAgICAgICAgIChiJ1x4ZmYnLCB1J1x1ZmZmZCcpLAorICAgICAgICAgICAgKGInXHgwMEFceGZmJywgdSdBXHVmZmZkJyksCisgICAgICAgICAgICAoYidceDAwQVx4MDBCXHgwMENceDAwRFonLCB1J0FCQ0RcdWZmZmQnKSwKKyAgICAgICAgICAgIChiJ1x4ZDhceDAwJywgdSdcdWZmZmQnKSwKKyAgICAgICAgICAgIChiJ1x4ZDhceDAwXHhkYycsIHUnXHVmZmZkJyksCisgICAgICAgICAgICAoYidceGQ4XHgwMFx4MDBBJywgdSdcdWZmZmRBJyksCisgICAgICAgICAgICAoYidceGRjXHgwMFx4MDBBJywgdSdcdWZmZmRBJyksCisgICAgICAgIF0KKyAgICAgICAgZm9yIHJhdywgZXhwZWN0ZWQgaW4gdGVzdHM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIGNvZGVjcy51dGZfMTZfYmVfZGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3LCAnc3RyaWN0JywgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmF3LmRlY29kZSgndXRmLTE2YmUnLCAncmVwbGFjZScpLCBleHBlY3RlZCkKIAogY2xhc3MgVVRGOFRlc3QoUmVhZFRlc3QpOgogICAgIGVuY29kaW5nID0gInV0Zi04IgogCiAgICAgZGVmIHRlc3RfcGFydGlhbChzZWxmKToKICAgICAgICAgc2VsZi5jaGVja19wYXJ0aWFsKAotICAgICAgICAgICAgdSJceDAwXHhmZlx1MDdmZlx1MDgwMFx1ZmZmZiIsCisgICAgICAgICAgICB1Ilx4MDBceGZmXHUwN2ZmXHUwODAwXHVmZmZmXFUwMDAxMDAwMCIsCiAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgdSJceDAwIiwKICAgICAgICAgICAgICAgICB1Ilx4MDAiLApAQCAtNTM2LDYgKzYzMiwxMCBAQAogICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTA3ZmZcdTA4MDAiLAogICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTA3ZmZcdTA4MDAiLAogICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTA3ZmZcdTA4MDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTA3ZmZcdTA4MDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTA3ZmZcdTA4MDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTA3ZmZcdTA4MDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTA3ZmZcdTA4MDBcdWZmZmZcVTAwMDEwMDAwIiwKICAgICAgICAgICAgIF0KICAgICAgICAgKQogCkBAIC01NTQsNiArNjU0LDM1IEBACiAgICAgICAgICAgICBdCiAgICAgICAgICkKIAorICAgIGRlZiB0ZXN0X2Vycm9ycyhzZWxmKToKKyAgICAgICAgdGVzdHMgPSBbCisgICAgICAgICAgICAoJ2FceGZmYicsIHUnYVx1ZmZmZGInKSwKKyAgICAgICAgICAgICgnYStJSycsIHUnYVx1ZmZmZCcpLAorICAgICAgICAgICAgKCdhK0lLLWInLCB1J2FcdWZmZmRiJyksCisgICAgICAgICAgICAoJ2ErSUssYicsIHUnYVx1ZmZmZGInKSwKKyAgICAgICAgICAgICgnYStJS3gnLCB1J2FcdTIwYWNcdWZmZmQnKSwKKyAgICAgICAgICAgICgnYStJS3gtYicsIHUnYVx1MjBhY1x1ZmZmZGInKSwKKyAgICAgICAgICAgICgnYStJS3dncicsIHUnYVx1MjBhY1x1ZmZmZCcpLAorICAgICAgICAgICAgKCdhK0lLd2dyLWInLCB1J2FcdTIwYWNcdWZmZmRiJyksCisgICAgICAgICAgICAoJ2ErSUt3Z3IsJywgdSdhXHUyMGFjXHVmZmZkJyksCisgICAgICAgICAgICAoJ2ErSUt3Z3IsLWInLCB1J2FcdTIwYWNcdWZmZmQtYicpLAorICAgICAgICAgICAgKCdhK0lLd2dyQicsIHUnYVx1MjBhY1x1MjBhY1x1ZmZmZCcpLAorICAgICAgICAgICAgKCdhK0lLd2dyQi1iJywgdSdhXHUyMGFjXHUyMGFjXHVmZmZkYicpLAorICAgICAgICAgICAgKCdhKy8sK0lLdy1iJywgdSdhXHVmZmZkXHUyMGFjYicpLAorICAgICAgICAgICAgKCdhKy8vLCtJS3ctYicsIHUnYVx1ZmZmZFx1MjBhY2InKSwKKyAgICAgICAgICAgICgnYSsvLy8sK0lLdy1iJywgdSdhXHVmZmZmXHVmZmZkXHUyMGFjYicpLAorICAgICAgICAgICAgKCdhKy8vLy8sK0lLdy1iJywgdSdhXHVmZmZmXHVmZmZkXHUyMGFjYicpLAorICAgICAgICBdCisgICAgICAgIGZvciByYXcsIGV4cGVjdGVkIGluIHRlc3RzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCBjb2RlY3MudXRmXzdfZGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3LCAnc3RyaWN0JywgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmF3LmRlY29kZSgndXRmLTcnLCAncmVwbGFjZScpLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X25vbmJtcChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1xVMDAwMTA0QTAnLmVuY29kZShzZWxmLmVuY29kaW5nKSwgJysyQUhjb0EtJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1x1ZDgwMVx1ZGNhMCcuZW5jb2RlKHNlbGYuZW5jb2RpbmcpLCAnKzJBSGNvQS0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcrMkFIY29BLScuZGVjb2RlKHNlbGYuZW5jb2RpbmcpLCB1J1xVMDAwMTA0QTAnKQorCiBjbGFzcyBVVEYxNkV4VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgdGVzdF9lcnJvcnMoc2VsZik6CkBAIC01OTUsNyArNzI0LDcgQEAKIAogICAgIGRlZiB0ZXN0X3BhcnRpYWwoc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tfcGFydGlhbCgKLSAgICAgICAgICAgIHUiXHVmZWZmXHgwMFx4ZmZcdTA3ZmZcdTA4MDBcdWZmZmYiLAorICAgICAgICAgICAgdSJcdWZlZmZceDAwXHhmZlx1MDdmZlx1MDgwMFx1ZmZmZlxVMDAwMTAwMDAiLAogICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgIHUiIiwKICAgICAgICAgICAgICAgICB1IiIsCkBAIC02MTQsNiArNzQzLDEwIEBACiAgICAgICAgICAgICAgICAgdSJcdWZlZmZceDAwXHhmZlx1MDdmZlx1MDgwMCIsCiAgICAgICAgICAgICAgICAgdSJcdWZlZmZceDAwXHhmZlx1MDdmZlx1MDgwMCIsCiAgICAgICAgICAgICAgICAgdSJcdWZlZmZceDAwXHhmZlx1MDdmZlx1MDgwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJcdWZlZmZceDAwXHhmZlx1MDdmZlx1MDgwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJcdWZlZmZceDAwXHhmZlx1MDdmZlx1MDgwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJcdWZlZmZceDAwXHhmZlx1MDdmZlx1MDgwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJcdWZlZmZceDAwXHhmZlx1MDdmZlx1MDgwMFx1ZmZmZlxVMDAwMTAwMDAiLAogICAgICAgICAgICAgXQogICAgICAgICApCiAKQEAgLTY3NCw2ICs4MDcsNTQgQEAKICAgICBkZWYgdGVzdF9lbXB0eShzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2RlY3MuZXNjYXBlX2RlY29kZSgiIiksICgiIiwgMCkpCiAKKyAgICBkZWYgdGVzdF9yYXcoc2VsZik6CisgICAgICAgIGRlY29kZSA9IGNvZGVjcy5lc2NhcGVfZGVjb2RlCisgICAgICAgIGZvciBiIGluIHJhbmdlKDI1Nik6CisgICAgICAgICAgICBiID0gY2hyKGIpCisgICAgICAgICAgICBpZiBiICE9ICdcXCc6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGUoYiArICcwJyksIChiICsgJzAnLCAyKSkKKworICAgIGRlZiB0ZXN0X2VzY2FwZShzZWxmKToKKyAgICAgICAgZGVjb2RlID0gY29kZWNzLmVzY2FwZV9kZWNvZGUKKyAgICAgICAgY2hlY2sgPSBjb2RpbmdfY2hlY2tlcihzZWxmLCBkZWNvZGUpCisgICAgICAgIGNoZWNrKGIiW1xcXG5dIiwgYiJbXSIpCisgICAgICAgIGNoZWNrKGJyJ1tcIl0nLCBiJ1siXScpCisgICAgICAgIGNoZWNrKGJyIltcJ10iLCBiIlsnXSIpCisgICAgICAgIGNoZWNrKGJyIltcXF0iLCBiciJbXF0iKQorICAgICAgICBjaGVjayhiciJbXGFdIiwgYiJbXHgwN10iKQorICAgICAgICBjaGVjayhiciJbXGJdIiwgYiJbXHgwOF0iKQorICAgICAgICBjaGVjayhiciJbXHRdIiwgYiJbXHgwOV0iKQorICAgICAgICBjaGVjayhiciJbXG5dIiwgYiJbXHgwYV0iKQorICAgICAgICBjaGVjayhiciJbXHZdIiwgYiJbXHgwYl0iKQorICAgICAgICBjaGVjayhiciJbXGZdIiwgYiJbXHgwY10iKQorICAgICAgICBjaGVjayhiciJbXHJdIiwgYiJbXHgwZF0iKQorICAgICAgICBjaGVjayhiciJbXDddIiwgYiJbXHgwN10iKQorICAgICAgICBjaGVjayhiciJbXDhdIiwgYnIiW1w4XSIpCisgICAgICAgIGNoZWNrKGJyIltcNzhdIiwgYiJbXHgwNzhdIikKKyAgICAgICAgY2hlY2soYnIiW1w0MV0iLCBiIlshXSIpCisgICAgICAgIGNoZWNrKGJyIltcNDE4XSIsIGIiWyE4XSIpCisgICAgICAgIGNoZWNrKGJyIltcMTAxXSIsIGIiW0FdIikKKyAgICAgICAgY2hlY2soYnIiW1wxMDEwXSIsIGIiW0EwXSIpCisgICAgICAgIGNoZWNrKGJyIltcNTAxXSIsIGIiW0FdIikKKyAgICAgICAgY2hlY2soYnIiW1x4NDFdIiwgYiJbQV0iKQorICAgICAgICBjaGVjayhiciJbXFg0MV0iLCBiciJbXFg0MV0iKQorICAgICAgICBjaGVjayhiciJbXHg0MTBdIiwgYiJbQTBdIikKKyAgICAgICAgZm9yIGIgaW4gcmFuZ2UoMjU2KToKKyAgICAgICAgICAgIGIgPSBjaHIoYikKKyAgICAgICAgICAgIGlmIGIgbm90IGluICdcbiJcJ1xcYWJ0bnZmcjAxMjM0NTY3eCc6CisgICAgICAgICAgICAgICAgY2hlY2soJ1xcJyArIGIsICdcXCcgKyBiKQorCisgICAgZGVmIHRlc3RfZXJyb3JzKHNlbGYpOgorICAgICAgICBkZWNvZGUgPSBjb2RlY3MuZXNjYXBlX2RlY29kZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBkZWNvZGUsIGJyIlx4IikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZGVjb2RlLCBiciJbXHhdIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGUoYnIiW1x4XVx4IiwgImlnbm9yZSIpLCAoYiJbXSIsIDYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZShiciJbXHhdXHgiLCAicmVwbGFjZSIpLCAoYiJbP10/IiwgNikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGRlY29kZSwgYnIiXHgwIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZGVjb2RlLCBiciJbXHgwXSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlKGJyIltceDBdXHgwIiwgImlnbm9yZSIpLCAoYiJbXSIsIDgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZShiciJbXHgwXVx4MCIsICJyZXBsYWNlIiksIChiIls/XT8iLCA4KSkKKwogY2xhc3MgUmVjb2RpbmdUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9yZWNvZGluZyhzZWxmKToKICAgICAgICAgZiA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKQEAgLTEzNTgsNyArMTUzOSw3IEBACiAKIGNsYXNzIEJhc2ljVW5pY29kZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X2Jhc2ljcyhzZWxmKToKLSAgICAgICAgcyA9IHUiYWJjMTIzIiAjIGFsbCBjb2RlY3Mgc2hvdWxkIGJlIGFibGUgdG8gZW5jb2RlIHRoZXNlCisgICAgICAgIHMgPSB1ImFiYzEyMyIgICMgYWxsIGNvZGVjcyBzaG91bGQgYmUgYWJsZSB0byBlbmNvZGUgdGhlc2UKICAgICAgICAgZm9yIGVuY29kaW5nIGluIGFsbF91bmljb2RlX2VuY29kaW5nczoKICAgICAgICAgICAgIG5hbWUgPSBjb2RlY3MubG9va3VwKGVuY29kaW5nKS5uYW1lCiAgICAgICAgICAgICBpZiBlbmNvZGluZy5lbmRzd2l0aCgiX2NvZGVjIik6CkBAIC0xMzY3LDkgKzE1NDgsOSBAQAogICAgICAgICAgICAgICAgIG5hbWUgPSAibGF0aW5fMSIKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2RpbmcucmVwbGFjZSgiXyIsICItIiksIG5hbWUucmVwbGFjZSgiXyIsICItIikpCiAgICAgICAgICAgICAoYnl0ZXMsIHNpemUpID0gY29kZWNzLmdldGVuY29kZXIoZW5jb2RpbmcpKHMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemUsIGxlbihzKSwgIiVyICE9ICVyIChlbmNvZGluZz0lcikiICUgKHNpemUsIGxlbihzKSwgZW5jb2RpbmcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplLCBsZW4ocyksICJlbmNvZGluZz0lciIgJSBlbmNvZGluZykKICAgICAgICAgICAgIChjaGFycywgc2l6ZSkgPSBjb2RlY3MuZ2V0ZGVjb2RlcihlbmNvZGluZykoYnl0ZXMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNoYXJzLCBzLCAiJXIgIT0gJXIgKGVuY29kaW5nPSVyKSIgJSAoY2hhcnMsIHMsIGVuY29kaW5nKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2hhcnMsIHMsICJlbmNvZGluZz0lciIgJSBlbmNvZGluZykKIAogICAgICAgICAgICAgaWYgZW5jb2Rpbmcgbm90IGluIGJyb2tlbl91bmljb2RlX3dpdGhfc3RyZWFtczoKICAgICAgICAgICAgICAgICAjIGNoZWNrIHN0cmVhbSByZWFkZXIvd3JpdGVyCkBAIC0xMzg1LDE1ICsxNTY2LDEzIEBACiAgICAgICAgICAgICAgICAgZm9yIGMgaW4gZW5jb2RlZHJlc3VsdDoKICAgICAgICAgICAgICAgICAgICAgcS53cml0ZShjKQogICAgICAgICAgICAgICAgICAgICBkZWNvZGVkcmVzdWx0ICs9IHJlYWRlci5yZWFkKCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZWRyZXN1bHQsIHMsICIlciAhPSAlciAoZW5jb2Rpbmc9JXIpIiAlIChkZWNvZGVkcmVzdWx0LCBzLCBlbmNvZGluZykpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVkcmVzdWx0LCBzLCAiZW5jb2Rpbmc9JXIiICUgZW5jb2RpbmcpCiAKICAgICAgICAgICAgIGlmIGVuY29kaW5nIG5vdCBpbiBicm9rZW5faW5jcmVtZW50YWxfY29kZXJzOgotICAgICAgICAgICAgICAgICMgY2hlY2sgaW5jcmVtZW50YWwgZGVjb2Rlci9lbmNvZGVyIChmZXRjaGVkIHZpYSB0aGUgUHl0aG9uCi0gICAgICAgICAgICAgICAgIyBhbmQgQyBBUEkpIGFuZCBpdGVyZW5jb2RlKCkvaXRlcmRlY29kZSgpCisgICAgICAgICAgICAgICAgIyBjaGVjayBpbmNyZW1lbnRhbCBkZWNvZGVyL2VuY29kZXIgYW5kIGl0ZXJlbmNvZGUoKS9pdGVyZGVjb2RlKCkKICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgIGVuY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxlbmNvZGVyKGVuY29kaW5nKSgpCi0gICAgICAgICAgICAgICAgICAgIGNlbmNvZGVyID0gX3Rlc3RjYXBpLmNvZGVjX2luY3JlbWVudGFsZW5jb2RlcihlbmNvZGluZykKLSAgICAgICAgICAgICAgICBleGNlcHQgTG9va3VwRXJyb3I6ICMgbm8gSW5jcmVtZW50YWxFbmNvZGVyCisgICAgICAgICAgICAgICAgZXhjZXB0IExvb2t1cEVycm9yOiAgIyBubyBJbmNyZW1lbnRhbEVuY29kZXIKICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgaW5jcmVtZW50YWwgZGVjb2Rlci9lbmNvZGVyCkBAIC0xNDA2LDQ1ICsxNTg1LDcxIEBACiAgICAgICAgICAgICAgICAgICAgIGZvciBjIGluIGVuY29kZWRyZXN1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkcmVzdWx0ICs9IGRlY29kZXIuZGVjb2RlKGMpCiAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRyZXN1bHQgKz0gZGVjb2Rlci5kZWNvZGUoIiIsIFRydWUpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlZHJlc3VsdCwgcywgIiVyICE9ICVyIChlbmNvZGluZz0lcikiICUgKGRlY29kZWRyZXN1bHQsIHMsIGVuY29kaW5nKSkKLQotICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIEMgQVBJCi0gICAgICAgICAgICAgICAgICAgIGVuY29kZWRyZXN1bHQgPSAiIgotICAgICAgICAgICAgICAgICAgICBmb3IgYyBpbiBzOgotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZHJlc3VsdCArPSBjZW5jb2Rlci5lbmNvZGUoYykKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlZHJlc3VsdCArPSBjZW5jb2Rlci5lbmNvZGUodSIiLCBUcnVlKQotICAgICAgICAgICAgICAgICAgICBjZGVjb2RlciA9IF90ZXN0Y2FwaS5jb2RlY19pbmNyZW1lbnRhbGRlY29kZXIoZW5jb2RpbmcpCi0gICAgICAgICAgICAgICAgICAgIGRlY29kZWRyZXN1bHQgPSB1IiIKLSAgICAgICAgICAgICAgICAgICAgZm9yIGMgaW4gZW5jb2RlZHJlc3VsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRyZXN1bHQgKz0gY2RlY29kZXIuZGVjb2RlKGMpCi0gICAgICAgICAgICAgICAgICAgIGRlY29kZWRyZXN1bHQgKz0gY2RlY29kZXIuZGVjb2RlKCIiLCBUcnVlKQotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZWRyZXN1bHQsIHMsICIlciAhPSAlciAoZW5jb2Rpbmc9JXIpIiAlIChkZWNvZGVkcmVzdWx0LCBzLCBlbmNvZGluZykpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlZHJlc3VsdCwgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5jb2Rpbmc9JXIiICUgZW5jb2RpbmcpCiAKICAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpdGVyZW5jb2RlKCkvaXRlcmRlY29kZSgpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHUiIi5qb2luKGNvZGVjcy5pdGVyZGVjb2RlKGNvZGVjcy5pdGVyZW5jb2RlKHMsIGVuY29kaW5nKSwgZW5jb2RpbmcpKQotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgcywgIiVyICE9ICVyIChlbmNvZGluZz0lcikiICUgKHJlc3VsdCwgcywgZW5jb2RpbmcpKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB1IiIuam9pbihjb2RlY3MuaXRlcmRlY29kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuaXRlcmVuY29kZShzLCBlbmNvZGluZyksIGVuY29kaW5nKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHMsICJlbmNvZGluZz0lciIgJSBlbmNvZGluZykKIAogICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGl0ZXJlbmNvZGUoKS9pdGVyZGVjb2RlKCkgd2l0aCBlbXB0eSBzdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdSIiLmpvaW4oY29kZWNzLml0ZXJkZWNvZGUoY29kZWNzLml0ZXJlbmNvZGUodSIiLCBlbmNvZGluZyksIGVuY29kaW5nKSkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdSIiLmpvaW4oY29kZWNzLml0ZXJkZWNvZGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLml0ZXJlbmNvZGUodSIiLCBlbmNvZGluZyksIGVuY29kaW5nKSkKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHUiIikKIAogICAgICAgICAgICAgICAgIGlmIGVuY29kaW5nIG5vdCBpbiBvbmx5X3N0cmljdF9tb2RlOgogICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGluY3JlbWVudGFsIGRlY29kZXIvZW5jb2RlciB3aXRoIGVycm9ycyBhcmd1bWVudAogICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZW5jb2RlcihlbmNvZGluZykoImlnbm9yZSIpCi0gICAgICAgICAgICAgICAgICAgICAgICBjZW5jb2RlciA9IF90ZXN0Y2FwaS5jb2RlY19pbmNyZW1lbnRhbGVuY29kZXIoZW5jb2RpbmcsICJpZ25vcmUiKQotICAgICAgICAgICAgICAgICAgICBleGNlcHQgTG9va3VwRXJyb3I6ICMgbm8gSW5jcmVtZW50YWxFbmNvZGVyCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBMb29rdXBFcnJvcjogICMgbm8gSW5jcmVtZW50YWxFbmNvZGVyCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkcmVzdWx0ID0gIiIuam9pbihlbmNvZGVyLmVuY29kZShjKSBmb3IgYyBpbiBzKQogICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlciA9IGNvZGVjcy5nZXRpbmNyZW1lbnRhbGRlY29kZXIoZW5jb2RpbmcpKCJpZ25vcmUiKQotICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZHJlc3VsdCA9IHUiIi5qb2luKGRlY29kZXIuZGVjb2RlKGMpIGZvciBjIGluIGVuY29kZWRyZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZWRyZXN1bHQsIHMsICIlciAhPSAlciAoZW5jb2Rpbmc9JXIpIiAlIChkZWNvZGVkcmVzdWx0LCBzLCBlbmNvZGluZykpCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkcmVzdWx0ID0gdSIiLmpvaW4oZGVjb2Rlci5kZWNvZGUoYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYyBpbiBlbmNvZGVkcmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVkcmVzdWx0LCBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5jb2Rpbmc9JXIiICUgZW5jb2RpbmcpCiAKKyAgICBAdGVzdF9zdXBwb3J0LmNweXRob25fb25seQorICAgIGRlZiB0ZXN0X2Jhc2ljc19jYXBpKHNlbGYpOgorICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgY29kZWNfaW5jcmVtZW50YWxlbmNvZGVyLCBjb2RlY19pbmNyZW1lbnRhbGRlY29kZXIKKyAgICAgICAgcyA9IHUiYWJjMTIzIiAgIyBhbGwgY29kZWNzIHNob3VsZCBiZSBhYmxlIHRvIGVuY29kZSB0aGVzZQorICAgICAgICBmb3IgZW5jb2RpbmcgaW4gYWxsX3VuaWNvZGVfZW5jb2RpbmdzOgorICAgICAgICAgICAgaWYgZW5jb2Rpbmcgbm90IGluIGJyb2tlbl9pbmNyZW1lbnRhbF9jb2RlcnM6CisgICAgICAgICAgICAgICAgIyBjaGVjayBpbmNyZW1lbnRhbCBkZWNvZGVyL2VuY29kZXIgYW5kIGl0ZXJlbmNvZGUoKS9pdGVyZGVjb2RlKCkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGNlbmNvZGVyID0gY29kZWNfaW5jcmVtZW50YWxlbmNvZGVyKGVuY29kaW5nKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBMb29rdXBFcnJvcjogICMgbm8gSW5jcmVtZW50YWxFbmNvZGVyCisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIEMgQVBJCisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRyZXN1bHQgPSAiIgorICAgICAgICAgICAgICAgICAgICBmb3IgYyBpbiBzOgorICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZHJlc3VsdCArPSBjZW5jb2Rlci5lbmNvZGUoYykKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZHJlc3VsdCArPSBjZW5jb2Rlci5lbmNvZGUodSIiLCBUcnVlKQorICAgICAgICAgICAgICAgICAgICBjZGVjb2RlciA9IGNvZGVjX2luY3JlbWVudGFsZGVjb2RlcihlbmNvZGluZykKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlZHJlc3VsdCA9IHUiIgorICAgICAgICAgICAgICAgICAgICBmb3IgYyBpbiBlbmNvZGVkcmVzdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZHJlc3VsdCArPSBjZGVjb2Rlci5kZWNvZGUoYykKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlZHJlc3VsdCArPSBjZGVjb2Rlci5kZWNvZGUoIiIsIFRydWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlZHJlc3VsdCwgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5jb2Rpbmc9JXIiICUgZW5jb2RpbmcpCisKKyAgICAgICAgICAgICAgICBpZiBlbmNvZGluZyBub3QgaW4gb25seV9zdHJpY3RfbW9kZToKKyAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpbmNyZW1lbnRhbCBkZWNvZGVyL2VuY29kZXIgd2l0aCBlcnJvcnMgYXJndW1lbnQKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2VuY29kZXIgPSBjb2RlY19pbmNyZW1lbnRhbGVuY29kZXIoZW5jb2RpbmcsICJpZ25vcmUiKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgTG9va3VwRXJyb3I6ICAjIG5vIEluY3JlbWVudGFsRW5jb2RlcgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZHJlc3VsdCA9ICIiLmpvaW4oY2VuY29kZXIuZW5jb2RlKGMpIGZvciBjIGluIHMpCi0gICAgICAgICAgICAgICAgICAgICAgICBjZGVjb2RlciA9IF90ZXN0Y2FwaS5jb2RlY19pbmNyZW1lbnRhbGRlY29kZXIoZW5jb2RpbmcsICJpZ25vcmUiKQotICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZHJlc3VsdCA9IHUiIi5qb2luKGNkZWNvZGVyLmRlY29kZShjKSBmb3IgYyBpbiBlbmNvZGVkcmVzdWx0KQotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVkcmVzdWx0LCBzLCAiJXIgIT0gJXIgKGVuY29kaW5nPSVyKSIgJSAoZGVjb2RlZHJlc3VsdCwgcywgZW5jb2RpbmcpKQorICAgICAgICAgICAgICAgICAgICAgICAgY2RlY29kZXIgPSBjb2RlY19pbmNyZW1lbnRhbGRlY29kZXIoZW5jb2RpbmcsICJpZ25vcmUiKQorICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZHJlc3VsdCA9IHUiIi5qb2luKGNkZWNvZGVyLmRlY29kZShjKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBjIGluIGVuY29kZWRyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZWRyZXN1bHQsIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmNvZGluZz0lciIgJSBlbmNvZGluZykKIAogICAgIGRlZiB0ZXN0X3NlZWsoc2VsZik6CiAgICAgICAgICMgYWxsIGNvZGVjcyBzaG91bGQgYmUgYWJsZSB0byBlbmNvZGUgdGhlc2UKQEAgLTE0OTUsNiArMTcwMCwxNCBAQAogICAgICAgICAgICAgKHUiYWJjIiwgMykKICAgICAgICAgKQogCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSwgYiJceDAwXHgwMVx4MDIiLCAic3RyaWN0IiwgdSJhYiIKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSwgIlx4MDBceDAxXHgwMiIsICJzdHJpY3QiLCB1ImFiXHVmZmZlIgorICAgICAgICApCisKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSgiXHgwMFx4MDFceDAyIiwgInJlcGxhY2UiLCB1ImFiIiksCiAgICAgICAgICAgICAodSJhYlx1ZmZmZCIsIDMpCkBAIC0xNTIxLDYgKzE3MzQsMTQ5IEBACiAgICAgICAgICAgICAodSIiLCBsZW4oYWxsYnl0ZXMpKQogICAgICAgICApCiAKKyAgICBkZWYgdGVzdF9kZWNvZGVfd2l0aF9pbnQyc3RyX21hcChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSgiXHgwMFx4MDFceDAyIiwgInN0cmljdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezA6IHUnYScsIDE6IHUnYicsIDI6IHUnYyd9KSwKKyAgICAgICAgICAgICh1ImFiYyIsIDMpCisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlKCJceDAwXHgwMVx4MDIiLCAic3RyaWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MDogdSdBYScsIDE6IHUnQmInLCAyOiB1J0NjJ30pLAorICAgICAgICAgICAgKHUiQWFCYkNjIiwgMykKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoIlx4MDBceDAxXHgwMiIsICJzdHJpY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswOiB1J1xVMDAxMEZGRkYnLCAxOiB1J2InLCAyOiB1J2MnfSksCisgICAgICAgICAgICAodSJcVTAwMTBGRkZGYmMiLCAzKQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSgiXHgwMFx4MDFceDAyIiwgInN0cmljdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezA6IHUnYScsIDE6IHUnYicsIDI6IHUnJ30pLAorICAgICAgICAgICAgKHUiYWIiLCAzKQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlLCAiXHgwMFx4MDFceDAyIiwgInN0cmljdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswOiB1J2EnLCAxOiB1J2InfQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlLCAiXHgwMFx4MDFceDAyIiwgInN0cmljdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswOiB1J2EnLCAxOiB1J2InLCAyOiBOb25lfQorICAgICAgICApCisKKyAgICAgICAgIyBJc3N1ZSAjMTQ4NTAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlLCAiXHgwMFx4MDFceDAyIiwgInN0cmljdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswOiB1J2EnLCAxOiB1J2InLCAyOiB1J1x1ZmZmZSd9CisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlKCJceDAwXHgwMVx4MDIiLCAicmVwbGFjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezA6IHUnYScsIDE6IHUnYid9KSwKKyAgICAgICAgICAgICh1ImFiXHVmZmZkIiwgMykKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoIlx4MDBceDAxXHgwMiIsICJyZXBsYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MDogdSdhJywgMTogdSdiJywgMjogTm9uZX0pLAorICAgICAgICAgICAgKHUiYWJcdWZmZmQiLCAzKQorICAgICAgICApCisKKyAgICAgICAgIyBJc3N1ZSAjMTQ4NTAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSgiXHgwMFx4MDFceDAyIiwgInJlcGxhY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswOiB1J2EnLCAxOiB1J2InLCAyOiB1J1x1ZmZmZSd9KSwKKyAgICAgICAgICAgICh1ImFiXHVmZmZkIiwgMykKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoIlx4MDBceDAxXHgwMiIsICJpZ25vcmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswOiB1J2EnLCAxOiB1J2InfSksCisgICAgICAgICAgICAodSJhYiIsIDMpCisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlKCJceDAwXHgwMVx4MDIiLCAiaWdub3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MDogdSdhJywgMTogdSdiJywgMjogTm9uZX0pLAorICAgICAgICAgICAgKHUiYWIiLCAzKQorICAgICAgICApCisKKyAgICAgICAgIyBJc3N1ZSAjMTQ4NTAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSgiXHgwMFx4MDFceDAyIiwgImlnbm9yZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezA6IHUnYScsIDE6IHUnYicsIDI6IHUnXHVmZmZlJ30pLAorICAgICAgICAgICAgKHUiYWIiLCAzKQorICAgICAgICApCisKKyAgICAgICAgYWxsYnl0ZXMgPSAiIi5qb2luKGNocihpKSBmb3IgaSBpbiB4cmFuZ2UoMjU2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZShhbGxieXRlcywgImlnbm9yZSIsIHt9KSwKKyAgICAgICAgICAgICh1IiIsIGxlbihhbGxieXRlcykpCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2RlY29kZV93aXRoX2ludDJpbnRfbWFwKHNlbGYpOgorICAgICAgICBhID0gb3JkKHUnYScpCisgICAgICAgIGIgPSBvcmQodSdiJykKKyAgICAgICAgYyA9IG9yZCh1J2MnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoIlx4MDBceDAxXHgwMiIsICJzdHJpY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswOiBhLCAxOiBiLCAyOiBjfSksCisgICAgICAgICAgICAodSJhYmMiLCAzKQorICAgICAgICApCisKKyAgICAgICAgIyBJc3N1ZSAjMTUzNzkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSgiXHgwMFx4MDFceDAyIiwgInN0cmljdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezA6IDB4MTBGRkZGLCAxOiBiLCAyOiBjfSksCisgICAgICAgICAgICAodSJcVTAwMTBGRkZGYmMiLCAzKQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlLCAiXHgwMFx4MDFceDAyIiwgInN0cmljdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswOiAweDExMDAwMCwgMTogYiwgMjogY30KKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSwgIlx4MDBceDAxXHgwMiIsICJzdHJpY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MDogYSwgMTogYn0sCisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsCisgICAgICAgICAgICBjb2RlY3MuY2hhcm1hcF9kZWNvZGUsICJceDAwXHgwMVx4MDIiLCAic3RyaWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezA6IGEsIDE6IGIsIDI6IDB4RkZGRX0sCisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlKCJceDAwXHgwMVx4MDIiLCAicmVwbGFjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezA6IGEsIDE6IGJ9KSwKKyAgICAgICAgICAgICh1ImFiXHVmZmZkIiwgMykKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoIlx4MDBceDAxXHgwMiIsICJyZXBsYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MDogYSwgMTogYiwgMjogMHhGRkZFfSksCisgICAgICAgICAgICAodSJhYlx1ZmZmZCIsIDMpCisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlKCJceDAwXHgwMVx4MDIiLCAiaWdub3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MDogYSwgMTogYn0pLAorICAgICAgICAgICAgKHUiYWIiLCAzKQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSgiXHgwMFx4MDFceDAyIiwgImlnbm9yZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezA6IGEsIDE6IGIsIDI6IDB4RkZGRX0pLAorICAgICAgICAgICAgKHUiYWIiLCAzKQorICAgICAgICApCisKKwogY2xhc3MgV2l0aFN0bXRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9lbmNvZGVkZmlsZShzZWxmKToKICAgICAgICAgZiA9IFN0cmluZ0lPLlN0cmluZ0lPKCJceGMzXHhiYyIpCkBAIC0xNTM1LDYgKzE4OTEsMTM0IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNydy5yZWFkKCksIHUiXHhmYyIpCiAKIAorY2xhc3MgVW5pY29kZUVzY2FwZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2VtcHR5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvZGVjcy51bmljb2RlX2VzY2FwZV9lbmNvZGUodSIiKSwgKCIiLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2RlY3MudW5pY29kZV9lc2NhcGVfZGVjb2RlKCIiKSwgKHUiIiwgMCkpCisKKyAgICBkZWYgdGVzdF9yYXdfZW5jb2RlKHNlbGYpOgorICAgICAgICBlbmNvZGUgPSBjb2RlY3MudW5pY29kZV9lc2NhcGVfZW5jb2RlCisgICAgICAgIGZvciBiIGluIHJhbmdlKDMyLCAxMjcpOgorICAgICAgICAgICAgaWYgYiAhPSBvcmQoJ1xcJyk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGUodW5pY2hyKGIpKSwgKGNocihiKSwgMSkpCisKKyAgICBkZWYgdGVzdF9yYXdfZGVjb2RlKHNlbGYpOgorICAgICAgICBkZWNvZGUgPSBjb2RlY3MudW5pY29kZV9lc2NhcGVfZGVjb2RlCisgICAgICAgIGZvciBiIGluIHJhbmdlKDI1Nik6CisgICAgICAgICAgICBpZiBiICE9IG9yZCgnXFwnKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZShjaHIoYikgKyAnMCcpLCAodW5pY2hyKGIpICsgdScwJywgMikpCisKKyAgICBkZWYgdGVzdF9lc2NhcGVfZW5jb2RlKHNlbGYpOgorICAgICAgICBlbmNvZGUgPSBjb2RlY3MudW5pY29kZV9lc2NhcGVfZW5jb2RlCisgICAgICAgIGNoZWNrID0gY29kaW5nX2NoZWNrZXIoc2VsZiwgZW5jb2RlKQorICAgICAgICBjaGVjayh1J1x0JywgcidcdCcpCisgICAgICAgIGNoZWNrKHUnXG4nLCByJ1xuJykKKyAgICAgICAgY2hlY2sodSdccicsIHInXHInKQorICAgICAgICBjaGVjayh1J1xcJywgcidcXCcpCisgICAgICAgIGZvciBiIGluIHJhbmdlKDMyKToKKyAgICAgICAgICAgIGlmIGNocihiKSBub3QgaW4gJ1x0XG5ccic6CisgICAgICAgICAgICAgICAgY2hlY2sodW5pY2hyKGIpLCAnXFx4JTAyeCcgJSBiKQorICAgICAgICBmb3IgYiBpbiByYW5nZSgxMjcsIDI1Nik6CisgICAgICAgICAgICBjaGVjayh1bmljaHIoYiksICdcXHglMDJ4JyAlIGIpCisgICAgICAgIGNoZWNrKHUnXHUyMGFjJywgcidcdTIwYWMnKQorICAgICAgICBjaGVjayh1J1xVMDAwMWQxMjAnLCByJ1xVMDAwMWQxMjAnKQorCisgICAgZGVmIHRlc3RfZXNjYXBlX2RlY29kZShzZWxmKToKKyAgICAgICAgZGVjb2RlID0gY29kZWNzLnVuaWNvZGVfZXNjYXBlX2RlY29kZQorICAgICAgICBjaGVjayA9IGNvZGluZ19jaGVja2VyKHNlbGYsIGRlY29kZSkKKyAgICAgICAgY2hlY2soIltcXFxuXSIsIHUiW10iKQorICAgICAgICBjaGVjayhyJ1tcIl0nLCB1J1siXScpCisgICAgICAgIGNoZWNrKHIiW1wnXSIsIHUiWyddIikKKyAgICAgICAgY2hlY2sociJbXFxdIiwgdXIiW1xdIikKKyAgICAgICAgY2hlY2sociJbXGFdIiwgdSJbXHgwN10iKQorICAgICAgICBjaGVjayhyIltcYl0iLCB1IltceDA4XSIpCisgICAgICAgIGNoZWNrKHIiW1x0XSIsIHUiW1x4MDldIikKKyAgICAgICAgY2hlY2sociJbXG5dIiwgdSJbXHgwYV0iKQorICAgICAgICBjaGVjayhyIltcdl0iLCB1IltceDBiXSIpCisgICAgICAgIGNoZWNrKHIiW1xmXSIsIHUiW1x4MGNdIikKKyAgICAgICAgY2hlY2sociJbXHJdIiwgdSJbXHgwZF0iKQorICAgICAgICBjaGVjayhyIltcN10iLCB1IltceDA3XSIpCisgICAgICAgIGNoZWNrKHIiW1w4XSIsIHVyIltcOF0iKQorICAgICAgICBjaGVjayhyIltcNzhdIiwgdSJbXHgwNzhdIikKKyAgICAgICAgY2hlY2sociJbXDQxXSIsIHUiWyFdIikKKyAgICAgICAgY2hlY2sociJbXDQxOF0iLCB1IlshOF0iKQorICAgICAgICBjaGVjayhyIltcMTAxXSIsIHUiW0FdIikKKyAgICAgICAgY2hlY2sociJbXDEwMTBdIiwgdSJbQTBdIikKKyAgICAgICAgY2hlY2sociJbXHg0MV0iLCB1IltBXSIpCisgICAgICAgIGNoZWNrKHIiW1x4NDEwXSIsIHUiW0EwXSIpCisgICAgICAgIGNoZWNrKHIiXHUyMGFjIiwgdSJcdTIwYWMiKQorICAgICAgICBjaGVjayhyIlxVMDAwMWQxMjAiLCB1IlxVMDAwMWQxMjAiKQorICAgICAgICBmb3IgYiBpbiByYW5nZSgyNTYpOgorICAgICAgICAgICAgaWYgY2hyKGIpIG5vdCBpbiAnXG4iXCdcXGFidG52ZnIwMTIzNDU2N3h1VU4nOgorICAgICAgICAgICAgICAgIGNoZWNrKCdcXCcgKyBjaHIoYiksIHUnXFwnICsgdW5pY2hyKGIpKQorCisgICAgZGVmIHRlc3RfZGVjb2RlX2Vycm9ycyhzZWxmKToKKyAgICAgICAgZGVjb2RlID0gY29kZWNzLnVuaWNvZGVfZXNjYXBlX2RlY29kZQorICAgICAgICBmb3IgYywgZCBpbiAoJ3gnLCAyKSwgKCd1JywgNCksICgnVScsIDQpOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoZCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCBkZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcIiArIGMgKyAiMCIqaSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIGRlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW1xcIiArIGMgKyAiMCIqaSArICJdIikKKyAgICAgICAgICAgICAgICBkYXRhID0gIltcXCIgKyBjICsgIjAiKmkgKyAiXVxcIiArIGMgKyAiMCIqaQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlKGRhdGEsICJpZ25vcmUiKSwgKHUiW10iLCBsZW4oZGF0YSkpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlKGRhdGEsICJyZXBsYWNlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodSJbXHVmZmZkXVx1ZmZmZCIsIGxlbihkYXRhKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgZGVjb2RlLCByIlxVMDAxMTAwMDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZShyIlxVMDAxMTAwMDAiLCAiaWdub3JlIiksICh1IiIsIDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGUociJcVTAwMTEwMDAwIiwgInJlcGxhY2UiKSwgKHUiXHVmZmZkIiwgMTApKQorCisKK2NsYXNzIFJhd1VuaWNvZGVFc2NhcGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9lbXB0eShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2RlY3MucmF3X3VuaWNvZGVfZXNjYXBlX2VuY29kZSh1IiIpLCAoIiIsIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvZGVjcy5yYXdfdW5pY29kZV9lc2NhcGVfZGVjb2RlKCIiKSwgKHUiIiwgMCkpCisKKyAgICBkZWYgdGVzdF9yYXdfZW5jb2RlKHNlbGYpOgorICAgICAgICBlbmNvZGUgPSBjb2RlY3MucmF3X3VuaWNvZGVfZXNjYXBlX2VuY29kZQorICAgICAgICBmb3IgYiBpbiByYW5nZSgyNTYpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGUodW5pY2hyKGIpKSwgKGNocihiKSwgMSkpCisKKyAgICBkZWYgdGVzdF9yYXdfZGVjb2RlKHNlbGYpOgorICAgICAgICBkZWNvZGUgPSBjb2RlY3MucmF3X3VuaWNvZGVfZXNjYXBlX2RlY29kZQorICAgICAgICBmb3IgYiBpbiByYW5nZSgyNTYpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGUoY2hyKGIpICsgJzAnKSwgKHVuaWNocihiKSArIHUnMCcsIDIpKQorCisgICAgZGVmIHRlc3RfZXNjYXBlX2VuY29kZShzZWxmKToKKyAgICAgICAgZW5jb2RlID0gY29kZWNzLnJhd191bmljb2RlX2VzY2FwZV9lbmNvZGUKKyAgICAgICAgY2hlY2sgPSBjb2RpbmdfY2hlY2tlcihzZWxmLCBlbmNvZGUpCisgICAgICAgIGZvciBiIGluIHJhbmdlKDI1Nik6CisgICAgICAgICAgICBpZiBjaHIoYikgbm90IGluICd1VSc6CisgICAgICAgICAgICAgICAgY2hlY2sodSdcXCcgKyB1bmljaHIoYiksICdcXCcgKyBjaHIoYikpCisgICAgICAgIGNoZWNrKHUnXHUyMGFjJywgcidcdTIwYWMnKQorICAgICAgICBjaGVjayh1J1xVMDAwMWQxMjAnLCByJ1xVMDAwMWQxMjAnKQorCisgICAgZGVmIHRlc3RfZXNjYXBlX2RlY29kZShzZWxmKToKKyAgICAgICAgZGVjb2RlID0gY29kZWNzLnJhd191bmljb2RlX2VzY2FwZV9kZWNvZGUKKyAgICAgICAgY2hlY2sgPSBjb2RpbmdfY2hlY2tlcihzZWxmLCBkZWNvZGUpCisgICAgICAgIGZvciBiIGluIHJhbmdlKDI1Nik6CisgICAgICAgICAgICBpZiBjaHIoYikgbm90IGluICd1VSc6CisgICAgICAgICAgICAgICAgY2hlY2soJ1xcJyArIGNocihiKSwgdSdcXCcgKyB1bmljaHIoYikpCisgICAgICAgIGNoZWNrKHIiXHUyMGFjIiwgdSJcdTIwYWMiKQorICAgICAgICBjaGVjayhyIlxVMDAwMWQxMjAiLCB1IlxVMDAwMWQxMjAiKQorCisgICAgZGVmIHRlc3RfZGVjb2RlX2Vycm9ycyhzZWxmKToKKyAgICAgICAgZGVjb2RlID0gY29kZWNzLnJhd191bmljb2RlX2VzY2FwZV9kZWNvZGUKKyAgICAgICAgZm9yIGMsIGQgaW4gKCd1JywgNCksICgnVScsIDQpOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoZCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCBkZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcIiArIGMgKyAiMCIqaSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIGRlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW1xcIiArIGMgKyAiMCIqaSArICJdIikKKyAgICAgICAgICAgICAgICBkYXRhID0gIltcXCIgKyBjICsgIjAiKmkgKyAiXVxcIiArIGMgKyAiMCIqaQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlKGRhdGEsICJpZ25vcmUiKSwgKHUiW10iLCBsZW4oZGF0YSkpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlKGRhdGEsICJyZXBsYWNlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodSJbXHVmZmZkXVx1ZmZmZCIsIGxlbihkYXRhKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgZGVjb2RlLCByIlxVMDAxMTAwMDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZShyIlxVMDAxMTAwMDAiLCAiaWdub3JlIiksICh1IiIsIDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGUociJcVTAwMTEwMDAwIiwgInJlcGxhY2UiKSwgKHUiXHVmZmZkIiwgMTApKQorCisKIGNsYXNzIEJvbVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X3NlZWswKHNlbGYpOgogICAgICAgICBkYXRhID0gdSIxMjM0NTY3ODkwIgpAQCAtMTYyMCw2ICsyMTA0LDggQEAKICAgICAgICAgQmFzaWNTdHJUZXN0LAogICAgICAgICBDaGFybWFwVGVzdCwKICAgICAgICAgV2l0aFN0bXRUZXN0LAorICAgICAgICBVbmljb2RlRXNjYXBlVGVzdCwKKyAgICAgICAgUmF3VW5pY29kZUVzY2FwZVRlc3QsCiAgICAgICAgIEJvbVRlc3QsCiAgICAgKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVvcC5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZW9wLnB5CmluZGV4IDk5ZmU2ZjkuLjAwY2QzY2UgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZW9wLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZW9wLnB5CkBAIC01MCw3ICs1MCw3IEBACiAgICAgICAgICcnJ3N1Y2NlZWQgaWZmIHN0ciBpcyB0aGUgc3RhcnQgb2YgYW4gaW52YWxpZCBwaWVjZSBvZiBjb2RlJycnCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGNvbXBpbGVfY29tbWFuZChzdHIsc3ltYm9sPXN5bWJvbCkKLSAgICAgICAgICAgIHNlbGYuZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBjb2RlIikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiTm8gZXhjZXB0aW9uIHJhaXNlZCBmb3IgaW52YWxpZCBjb2RlIikKICAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzX3N5bnRheCkKICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbGxlY3Rpb25zLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2xsZWN0aW9ucy5weQppbmRleCAzMTNmODFmLi5kZTRiYTg2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvbGxlY3Rpb25zLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29sbGVjdGlvbnMucHkKQEAgLTgsNiArOCw3IEBACiBmcm9tIHJhbmRvbSBpbXBvcnQgcmFuZHJhbmdlLCBzaHVmZmxlCiBpbXBvcnQga2V5d29yZAogaW1wb3J0IHJlCitpbXBvcnQgc2V0cwogaW1wb3J0IHN5cwogZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgSGFzaGFibGUsIEl0ZXJhYmxlLCBJdGVyYXRvcgogZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgU2l6ZWQsIENvbnRhaW5lciwgQ2FsbGFibGUKQEAgLTE3LDYgKzE4LDQzIEBACiAKIFRlc3ROVCA9IG5hbWVkdHVwbGUoJ1Rlc3ROVCcsICd4IHkgeicpICAgICMgdHlwZSB1c2VkIGZvciBwaWNrbGUgdGVzdHMKIAorcHkyNzNfbmFtZWRfdHVwbGVfcGlja2xlID0gJycnXAorY2NvcHlfcmVnCitfcmVjb25zdHJ1Y3RvcgorcDAKKyhjdGVzdC50ZXN0X2NvbGxlY3Rpb25zCitUZXN0TlQKK3AxCitjX19idWlsdGluX18KK3R1cGxlCitwMgorKEkxMAorSTIwCitJMzAKK3RwMwordHA0CitScDUKK2Njb2xsZWN0aW9ucworT3JkZXJlZERpY3QKK3A2CisoKGxwNworKGxwOAorUyd4JworcDkKK2FJMTAKK2FhKGxwMTAKK1MneScKK3AxMQorYUkyMAorYWEobHAxMgorUyd6JworcDEzCithSTMwCithYXRwMTQKK1JwMTUKK2IuCisnJycKKwogY2xhc3MgVGVzdE5hbWVkVHVwbGUodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfZmFjdG9yeShzZWxmKToKQEAgLTIxNSw2ICsyNTMsMTEgQEAKICAgICAgICAgIyB0ZXN0IF9fZ2V0bmV3YXJnc19fCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5fX2dldG5ld2FyZ3NfXygpLCB2YWx1ZXMpCiAKKyAgICBkZWYgdGVzdF9waWNrbGluZ19idWdfMTgwMTUoc2VsZik6CisgICAgICAgICMgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTE4MDE1CisgICAgICAgIHB0ID0gcGlja2xlLmxvYWRzKHB5MjczX25hbWVkX3R1cGxlX3BpY2tsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwdC54LCAxMCkKKwogY2xhc3MgQUJDVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHZhbGlkYXRlX2Fic3RyYWN0X21ldGhvZHMoc2VsZiwgYWJjLCAqbmFtZXMpOgpAQCAtNTUyLDYgKzU5NSwxOTggQEAKICAgICAgICAgcyB8PSBzCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgZnVsbCkKIAorICAgIGRlZiB0ZXN0X2lzc3VlMTYzNzMoc2VsZik6CisgICAgICAgICMgUmVjdXJzaW9uIGVycm9yIGNvbXBhcmluZyBjb21wYXJhYmxlIGFuZCBub25jb21wYXJhYmxlCisgICAgICAgICMgU2V0IGluc3RhbmNlcworICAgICAgICBjbGFzcyBNeUNvbXBhcmFibGVTZXQoU2V0KToKKyAgICAgICAgICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBpdGVyKFtdKQorICAgICAgICBjbGFzcyBNeU5vbkNvbXBhcmFibGVTZXQoU2V0KToKKyAgICAgICAgICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBpdGVyKFtdKQorICAgICAgICAgICAgZGVmIF9fbGVfXyhzZWxmLCB4KToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICAgICAgICAgIGRlZiBfX2x0X18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisKKyAgICAgICAgY3MgPSBNeUNvbXBhcmFibGVTZXQoKQorICAgICAgICBuY3MgPSBNeU5vbkNvbXBhcmFibGVTZXQoKQorCisgICAgICAgICMgUnVuIGFsbCB0aGUgdmFyaWFudHMgdG8gbWFrZSBzdXJlIHRoZXkgZG9uJ3QgbXV0dWFsbHkgcmVjdXJzZQorICAgICAgICBuY3MgPCBjcworICAgICAgICBuY3MgPD0gY3MKKyAgICAgICAgbmNzID4gY3MKKyAgICAgICAgbmNzID49IGNzCisgICAgICAgIGNzIDwgbmNzCisgICAgICAgIGNzIDw9IG5jcworICAgICAgICBjcyA+IG5jcworICAgICAgICBjcyA+PSBuY3MKKworICAgIGRlZiBhc3NlcnRTYW1lU2V0KHNlbGYsIHMxLCBzMik6CisgICAgICAgICMgY29lcmNlIGJvdGggdG8gYSByZWFsIHNldCB0aGVuIGNoZWNrIGVxdWFsaXR5CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KHMxKSwgc2V0KHMyKSkKKworICAgIGRlZiB0ZXN0X1NldF9pbnRlcm9wZXJhYmlsaXR5X3dpdGhfcmVhbF9zZXRzKHNlbGYpOgorICAgICAgICAjIElzc3VlOiA4NzQzCisgICAgICAgIGNsYXNzIExpc3RTZXQoU2V0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbGVtZW50cz0oKSk6CisgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gW10KKyAgICAgICAgICAgICAgICBmb3IgZWxlbSBpbiBlbGVtZW50czoKKyAgICAgICAgICAgICAgICAgICAgaWYgZWxlbSBub3QgaW4gc2VsZi5kYXRhOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLmFwcGVuZChlbGVtKQorICAgICAgICAgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBlbGVtKToKKyAgICAgICAgICAgICAgICByZXR1cm4gZWxlbSBpbiBzZWxmLmRhdGEKKyAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlcihzZWxmLmRhdGEpCisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gbGVuKHNlbGYuZGF0YSkKKyAgICAgICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ1NldCh7IXJ9KScuZm9ybWF0KHNlbGYuZGF0YSkKKworICAgICAgICByMSA9IHNldCgnYWJjJykKKyAgICAgICAgcjIgPSBzZXQoJ2JjZCcpCisgICAgICAgIHIzID0gc2V0KCdhYmNkZScpCisgICAgICAgIGYxID0gTGlzdFNldCgnYWJjJykKKyAgICAgICAgZjIgPSBMaXN0U2V0KCdiY2QnKQorICAgICAgICBmMyA9IExpc3RTZXQoJ2FiY2RlJykKKyAgICAgICAgbDEgPSBsaXN0KCdhYmNjYmEnKQorICAgICAgICBsMiA9IGxpc3QoJ2JjZGRjYicpCisgICAgICAgIGwzID0gbGlzdCgnYWJjZGVlZGNiYScpCisgICAgICAgIHAxID0gc2V0cy5TZXQoJ2FiYycpCisgICAgICAgIHAyID0gc2V0cy5TZXQoJ2JjZCcpCisgICAgICAgIHAzID0gc2V0cy5TZXQoJ2FiY2RlJykKKworICAgICAgICB0YXJnZXQgPSByMSAmIHIyCisgICAgICAgIHNlbGYuYXNzZXJ0U2FtZVNldChmMSAmIGYyLCB0YXJnZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0U2FtZVNldChmMSAmIHIyLCB0YXJnZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0U2FtZVNldChyMiAmIGYxLCB0YXJnZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0U2FtZVNldChmMSAmIHAyLCB0YXJnZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0U2FtZVNldChwMiAmIGYxLCB0YXJnZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0U2FtZVNldChmMSAmIGwyLCB0YXJnZXQpCisKKyAgICAgICAgdGFyZ2V0ID0gcjEgfCByMgorICAgICAgICBzZWxmLmFzc2VydFNhbWVTZXQoZjEgfCBmMiwgdGFyZ2V0KQorICAgICAgICBzZWxmLmFzc2VydFNhbWVTZXQoZjEgfCByMiwgdGFyZ2V0KQorICAgICAgICBzZWxmLmFzc2VydFNhbWVTZXQocjIgfCBmMSwgdGFyZ2V0KQorICAgICAgICBzZWxmLmFzc2VydFNhbWVTZXQoZjEgfCBwMiwgdGFyZ2V0KQorICAgICAgICBzZWxmLmFzc2VydFNhbWVTZXQocDIgfCBmMSwgdGFyZ2V0KQorICAgICAgICBzZWxmLmFzc2VydFNhbWVTZXQoZjEgfCBsMiwgdGFyZ2V0KQorCisgICAgICAgIGZ3ZF90YXJnZXQgPSByMSAtIHIyCisgICAgICAgIHJldl90YXJnZXQgPSByMiAtIHIxCisgICAgICAgIHNlbGYuYXNzZXJ0U2FtZVNldChmMSAtIGYyLCBmd2RfdGFyZ2V0KQorICAgICAgICBzZWxmLmFzc2VydFNhbWVTZXQoZjIgLSBmMSwgcmV2X3RhcmdldCkKKyAgICAgICAgc2VsZi5hc3NlcnRTYW1lU2V0KGYxIC0gcjIsIGZ3ZF90YXJnZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0U2FtZVNldChmMiAtIHIxLCByZXZfdGFyZ2V0KQorICAgICAgICBzZWxmLmFzc2VydFNhbWVTZXQocjEgLSBmMiwgZndkX3RhcmdldCkKKyAgICAgICAgc2VsZi5hc3NlcnRTYW1lU2V0KHIyIC0gZjEsIHJldl90YXJnZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0U2FtZVNldChmMSAtIHAyLCBmd2RfdGFyZ2V0KQorICAgICAgICBzZWxmLmFzc2VydFNhbWVTZXQoZjIgLSBwMSwgcmV2X3RhcmdldCkKKyAgICAgICAgc2VsZi5hc3NlcnRTYW1lU2V0KHAxIC0gZjIsIGZ3ZF90YXJnZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0U2FtZVNldChwMiAtIGYxLCByZXZfdGFyZ2V0KQorICAgICAgICBzZWxmLmFzc2VydFNhbWVTZXQoZjEgLSBsMiwgZndkX3RhcmdldCkKKyAgICAgICAgc2VsZi5hc3NlcnRTYW1lU2V0KGYyIC0gbDEsIHJldl90YXJnZXQpCisKKyAgICAgICAgdGFyZ2V0ID0gcjEgXiByMgorICAgICAgICBzZWxmLmFzc2VydFNhbWVTZXQoZjEgXiBmMiwgdGFyZ2V0KQorICAgICAgICBzZWxmLmFzc2VydFNhbWVTZXQoZjEgXiByMiwgdGFyZ2V0KQorICAgICAgICBzZWxmLmFzc2VydFNhbWVTZXQocjIgXiBmMSwgdGFyZ2V0KQorICAgICAgICBzZWxmLmFzc2VydFNhbWVTZXQoZjEgXiBwMiwgdGFyZ2V0KQorICAgICAgICBzZWxmLmFzc2VydFNhbWVTZXQocDIgXiBmMSwgdGFyZ2V0KQorICAgICAgICBzZWxmLmFzc2VydFNhbWVTZXQoZjEgXiBsMiwgdGFyZ2V0KQorCisgICAgICAgICMgcHJvcGVyIHN1YnNldAorICAgICAgICBzZWxmLmFzc2VydFRydWUoZjEgPCBmMykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmMSA8IGYxKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYxIDwgZjIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyMSA8IGYzKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHIxIDwgZjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocjEgPCBmMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHIxIDwgcjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocjEgPCByMSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyMSA8IHIyKQorICAgICAgICAjIHB5dGhvbiAyIG9ubHksIGNyb3NzLXR5cGUgY29tcGFyZXMgd2lsbCBzdWNjZWVkCisgICAgICAgIGYxIDwgbDMKKyAgICAgICAgZjEgPCBsMQorICAgICAgICBmMSA8IGwyCisKKyAgICAgICAgIyBhbnkgc3Vic2V0CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmMSA8PSBmMykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYxIDw9IGYxKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYxIDw9IGYyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocjEgPD0gZjMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyMSA8PSBmMSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyMSA8PSBmMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHIxIDw9IHIzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocjEgPD0gcjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocjEgPD0gcjIpCisgICAgICAgICMgcHl0aG9uIDIgb25seSwgY3Jvc3MtdHlwZSBjb21wYXJlcyB3aWxsIHN1Y2NlZWQKKyAgICAgICAgZjEgPD0gbDMKKyAgICAgICAgZjEgPD0gbDEKKyAgICAgICAgZjEgPD0gbDIKKworICAgICAgICAjIHByb3BlciBzdXBlcnNldAorICAgICAgICBzZWxmLmFzc2VydFRydWUoZjMgPiBmMSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmMSA+IGYxKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYyID4gZjEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyMyA+IHIxKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYxID4gcjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZjIgPiByMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHIzID4gcjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocjEgPiByMSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyMiA+IHIxKQorICAgICAgICAjIHB5dGhvbiAyIG9ubHksIGNyb3NzLXR5cGUgY29tcGFyZXMgd2lsbCBzdWNjZWVkCisgICAgICAgIGYxID4gbDMKKyAgICAgICAgZjEgPiBsMQorICAgICAgICBmMSA+IGwyCisKKyAgICAgICAgIyBhbnkgc3VwZXJzZXQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYzID49IGYxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZjEgPj0gZjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZjIgPj0gZjEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyMyA+PSByMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYxID49IHIxKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYyID49IHIxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocjMgPj0gcjEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyMSA+PSByMSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyMiA+PSByMSkKKyAgICAgICAgIyBweXRob24gMiBvbmx5LCBjcm9zcy10eXBlIGNvbXBhcmVzIHdpbGwgc3VjY2VlZAorICAgICAgICBmMSA+PSBsMworICAgICAgICBmMSA+PWwxCisgICAgICAgIGYxID49IGwyCisKKyAgICAgICAgIyBlcXVhbGl0eQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZjEgPT0gZjEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyMSA9PSBmMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYxID09IHIxKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYxID09IGYzKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHIxID09IGYzKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYxID09IHIzKQorICAgICAgICAjIHB5dGhvbiAyIG9ubHksIGNyb3NzLXR5cGUgY29tcGFyZXMgd2lsbCBzdWNjZWVkCisgICAgICAgIGYxID09IGwzCisgICAgICAgIGYxID09IGwxCisgICAgICAgIGYxID09IGwyCisKKyAgICAgICAgIyBpbmVxdWFsaXR5CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZjEgIT0gZjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocjEgIT0gZjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZjEgIT0gcjEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmMSAhPSBmMykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHIxICE9IGYzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZjEgIT0gcjMpCisgICAgICAgICMgcHl0aG9uIDIgb25seSwgY3Jvc3MtdHlwZSBjb21wYXJlcyB3aWxsIHN1Y2NlZWQKKyAgICAgICAgZjEgIT0gbDMKKyAgICAgICAgZjEgIT0gbDEKKyAgICAgICAgZjEgIT0gbDIKKwogICAgIGRlZiB0ZXN0X01hcHBpbmcoc2VsZik6CiAgICAgICAgIGZvciBzYW1wbGUgaW4gW2RpY3RdOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNhbXBsZSgpLCBNYXBwaW5nKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb21waWxlLnB5IGIvTGliL3Rlc3QvdGVzdF9jb21waWxlLnB5CmluZGV4IDIyZDE3MDguLjVmOTFkMGQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29tcGlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvbXBpbGUucHkKQEAgLTEsMyArMSw0IEBACitpbXBvcnQgbWF0aAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgc3lzCiBpbXBvcnQgX2FzdApAQCAtNjEsNiArNjIsNTAgQEAKICAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yOgogICAgICAgICAgICAgcGFzcwogCisgICAgZGVmIHRlc3RfZXhlY19mdW5jdGlvbmFsX3N0eWxlKHNlbGYpOgorICAgICAgICAjIEV4ZWMnaW5nIGEgdHVwbGUgb2YgbGVuZ3RoIDIgd29ya3MuCisgICAgICAgIGcgPSB7J2InOiAyfQorICAgICAgICBleGVjKCJhID0gYiArIDEiLCBnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdbJ2EnXSwgMykKKworICAgICAgICAjIEFzIGRvZXMgZXhlYydpbmcgYSB0dXBsZSBvZiBsZW5ndGggMy4KKyAgICAgICAgbCA9IHsnYic6IDN9CisgICAgICAgIGcgPSB7J2InOiA1LCAnYyc6IDd9CisgICAgICAgIGV4ZWMoImEgPSBiICsgYyIsIGcsIGwpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ2EnLCBnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxbJ2EnXSwgMTApCisKKyAgICAgICAgIyBUdXBsZXMgbm90IG9mIGxlbmd0aCAyIG9yIDMgYXJlIGludmFsaWQuCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIGV4ZWMoImEgPSBiICsgMSIsKQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIGV4ZWMoImEgPSBiICsgMSIsIHt9LCB7fSwge30pCisKKyAgICAgICAgIyBDYW4ndCBtaXggYW5kIG1hdGNoIHRoZSB0d28gY2FsbGluZyBmb3Jtcy4KKyAgICAgICAgZyA9IHsnYSc6IDMsICdiJzogNH0KKyAgICAgICAgbCA9IHt9CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIGV4ZWMoImEgPSBiICsgMSIsIGcpIGluIGcKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgZXhlYygiYSA9IGIgKyAxIiwgZywgbCkgaW4gZywgbAorCisgICAgZGVmIHRlc3RfbmVzdGVkX3F1YWxpZmllZF9leGVjKHNlbGYpOgorICAgICAgICAjIENhbiB1c2UgcXVhbGlmaWVkIGV4ZWMgaW4gbmVzdGVkIGZ1bmN0aW9ucy4KKyAgICAgICAgY29kZSA9IFsiIiIKK2RlZiBnKCk6CisgICAgZGVmIGYoKToKKyAgICAgICAgaWYgVHJ1ZToKKyAgICAgICAgICAgIGV4ZWMgIiIgaW4ge30sIHt9CisgICAgICAgICIiIiwgIiIiCitkZWYgZygpOgorICAgIGRlZiBmKCk6CisgICAgICAgIGlmIFRydWU6CisgICAgICAgICAgICBleGVjKCIiLCB7fSwge30pCisgICAgICAgICIiIl0KKyAgICAgICAgZm9yIGMgaW4gY29kZToKKyAgICAgICAgICAgIGNvbXBpbGUoYywgIjxjb2RlPiIsICJleGVjIikKKwogICAgIGRlZiB0ZXN0X2V4ZWNfd2l0aF9nZW5lcmFsX21hcHBpbmdfZm9yX2xvY2FscyhzZWxmKToKIAogICAgICAgICBjbGFzcyBNOgpAQCAtNDkxLDggKzUzNiw0NiBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbXBpbGUsIGFzdCwgJzxhc3Q+JywgJ2V4ZWMnKQogCiAKK2NsYXNzIFRlc3RTdGFja1NpemUodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgVGhlc2UgdGVzdHMgY2hlY2sgdGhhdCB0aGUgY29tcHV0ZWQgc3RhY2sgc2l6ZSBmb3IgYSBjb2RlIG9iamVjdAorICAgICMgc3RheXMgd2l0aGluIHJlYXNvbmFibGUgYm91bmRzIChzZWUgaXNzdWUgIzIxNTIzIGZvciBhbiBleGFtcGxlCisgICAgIyBkeXNmdW5jdGlvbikuCisgICAgTiA9IDEwMAorCisgICAgZGVmIGNoZWNrX3N0YWNrX3NpemUoc2VsZiwgY29kZSk6CisgICAgICAgICMgVG8gYXNzZXJ0IHRoYXQgdGhlIGFsbGVnZWQgc3RhY2sgc2l6ZSBpcyBub3QgTyhOKSwgd2UKKyAgICAgICAgIyBjaGVjayB0aGF0IGl0IGlzIHNtYWxsZXIgdGhhbiBsb2coTikuCisgICAgICAgIGlmIGlzaW5zdGFuY2UoY29kZSwgc3RyKToKKyAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKGNvZGUsICI8Zm9vPiIsICJzaW5nbGUiKQorICAgICAgICBtYXhfc2l6ZSA9IG1hdGguY2VpbChtYXRoLmxvZyhsZW4oY29kZS5jb19jb2RlKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKGNvZGUuY29fc3RhY2tzaXplLCBtYXhfc2l6ZSkKKworICAgIGRlZiB0ZXN0X2FuZChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19zdGFja19zaXplKCJ4IGFuZCAiICogc2VsZi5OICsgIngiKQorCisgICAgZGVmIHRlc3Rfb3Ioc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfc3RhY2tfc2l6ZSgieCBvciAiICogc2VsZi5OICsgIngiKQorCisgICAgZGVmIHRlc3RfYW5kX29yKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3N0YWNrX3NpemUoInggYW5kIHggb3IgIiAqIHNlbGYuTiArICJ4IikKKworICAgIGRlZiB0ZXN0X2NoYWluZWRfY29tcGFyaXNvbihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19zdGFja19zaXplKCJ4IDwgIiAqIHNlbGYuTiArICJ4IikKKworICAgIGRlZiB0ZXN0X2lmX2Vsc2Uoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfc3RhY2tfc2l6ZSgieCBpZiB4IGVsc2UgIiAqIHNlbGYuTiArICJ4IikKKworICAgIGRlZiB0ZXN0X2Jpbm9wKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3N0YWNrX3NpemUoInggKyAiICogc2VsZi5OICsgIngiKQorCisgICAgZGVmIHRlc3RfZnVuY19hbmQoc2VsZik6CisgICAgICAgIGNvZGUgPSAiZGVmIGYoeCk6XG4iCisgICAgICAgIGNvZGUgKz0gIiAgIHggYW5kIHhcbiIgKiBzZWxmLk4KKyAgICAgICAgc2VsZi5jaGVja19zdGFja19zaXplKGNvZGUpCisKKwogZGVmIHRlc3RfbWFpbigpOgotICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdFNwZWNpZmljcykKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KF9fbmFtZV9fKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIHRlc3RfbWFpbigpCisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbXBpbGVhbGwucHkgYi9MaWIvdGVzdC90ZXN0X2NvbXBpbGVhbGwucHkKaW5kZXggYmZmNjk4OS4uZDNhMjZkYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb21waWxlYWxsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29tcGlsZWFsbC5weQpAQCAtMzEsMTEgKzMxLDEwIEBACiAgICAgICAgIGNvbXBhcmUgPSBzdHJ1Y3QucGFjaygnPDRzbCcsIGltcC5nZXRfbWFnaWMoKSwgbXRpbWUpCiAgICAgICAgIHJldHVybiBkYXRhLCBjb21wYXJlCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAnc3RhdCcpLCAndGVzdCBuZWVkcyBvcy5zdGF0KCknKQogICAgIGRlZiByZWNyZWF0aW9uX2NoZWNrKHNlbGYsIG1ldGFkYXRhKToKICAgICAgICAgIiIiQ2hlY2sgdGhhdCBjb21waWxlYWxsIHJlY3JlYXRlcyBieXRlY29kZSB3aGVuIHRoZSBuZXcgbWV0YWRhdGEgaXMKICAgICAgICAgdXNlZC4iIiIKLSAgICAgICAgaWYgbm90IGhhc2F0dHIob3MsICdzdGF0Jyk6Ci0gICAgICAgICAgICByZXR1cm4KICAgICAgICAgcHlfY29tcGlsZS5jb21waWxlKHNlbGYuc291cmNlX3BhdGgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKnNlbGYuZGF0YSgpKQogICAgICAgICB3aXRoIG9wZW4oc2VsZi5iY19wYXRoLCAncmInKSBhcyBmaWxlOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb21waWxlci5weSBiL0xpYi90ZXN0L3Rlc3RfY29tcGlsZXIucHkKaW5kZXggMzMyZTBiYi4uNDU5ODgxMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb21waWxlci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvbXBpbGVyLnB5CkBAIC0yOCw4ICsyOCw4IEBACiAgICAgICAgIGxpYmRpciA9IG9zLnBhdGguZGlybmFtZShvcy5fX2ZpbGVfXykKICAgICAgICAgdGVzdGRpciA9IG9zLnBhdGguZGlybmFtZSh0ZXN0LnRlc3Rfc3VwcG9ydC5fX2ZpbGVfXykKIAotICAgICAgICBmb3IgZGlyIGluIFtsaWJkaXIsIHRlc3RkaXJdOgotICAgICAgICAgICAgZm9yIGJhc2VuYW1lIGluIG9zLmxpc3RkaXIoZGlyKToKKyAgICAgICAgZm9yIGRpciBpbiBbdGVzdGRpcl06CisgICAgICAgICAgICBmb3IgYmFzZW5hbWUgaW4gInRlc3Rfb3MucHkiLDoKICAgICAgICAgICAgICAgICAjIFByaW50IHN0aWxsIHdvcmtpbmcgbWVzc2FnZSBzaW5jZSB0aGlzIHRlc3QgY2FuIGJlIHJlYWxseSBzbG93CiAgICAgICAgICAgICAgICAgaWYgbmV4dF90aW1lIDw9IHRpbWUudGltZSgpOgogICAgICAgICAgICAgICAgICAgICBuZXh0X3RpbWUgPSB0aW1lLnRpbWUoKSArIF9QUklOVF9XT1JLSU5HX01TR19JTlRFUlZBTApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb29raWUucHkgYi9MaWIvdGVzdC90ZXN0X2Nvb2tpZS5weQppbmRleCBkMDkzOThkLi41MzcwYThkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Nvb2tpZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Nvb2tpZS5weQpAQCAtNjQsMTMgKzY0LDEzIEBACiAKICAgICAgICAgIyBsb2FkaW5nICdleHBpcmVzJwogICAgICAgICBDID0gQ29va2llLlNpbXBsZUNvb2tpZSgpCi0gICAgICAgIEMubG9hZCgnQ3VzdG9tZXI9IlciOyBleHBpcmVzPVdlZCwgMDEtSmFuLTIwMTAgMDA6MDA6MDAgR01UJykKKyAgICAgICAgQy5sb2FkKCdDdXN0b21lcj0iVyI7IGV4cGlyZXM9V2VkLCAwMSBKYW4gMjAxMCAwMDowMDowMCBHTVQnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKENbJ0N1c3RvbWVyJ11bJ2V4cGlyZXMnXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAnV2VkLCAwMS1KYW4tMjAxMCAwMDowMDowMCBHTVQnKQorICAgICAgICAgICAgICAgICAgICAgICAgICdXZWQsIDAxIEphbiAyMDEwIDAwOjAwOjAwIEdNVCcpCiAgICAgICAgIEMgPSBDb29raWUuU2ltcGxlQ29va2llKCkKLSAgICAgICAgQy5sb2FkKCdDdXN0b21lcj0iVyI7IGV4cGlyZXM9V2VkLCAwMS1KYW4tOTggMDA6MDA6MDAgR01UJykKKyAgICAgICAgQy5sb2FkKCdDdXN0b21lcj0iVyI7IGV4cGlyZXM9V2VkLCAwMSBKYW4gOTggMDA6MDA6MDAgR01UJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDWydDdXN0b21lciddWydleHBpcmVzJ10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgJ1dlZCwgMDEtSmFuLTk4IDAwOjAwOjAwIEdNVCcpCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1dlZCwgMDEgSmFuIDk4IDAwOjAwOjAwIEdNVCcpCiAKICAgICBkZWYgdGVzdF9leHRlbmRlZF9lbmNvZGUoc2VsZik6CiAgICAgICAgICMgSXNzdWUgOTgyNDogc29tZSBicm93c2VycyBkb24ndCBmb2xsb3cgdGhlIHN0YW5kYXJkOyB3ZSBub3cKQEAgLTgwLDYgKzgwLDUxIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy5vdXRwdXQoWyd2YWwnXSksCiAgICAgICAgICAgICAnU2V0LUNvb2tpZTogdmFsPSJzb21lXFwwNTRmdW5reVxcMDczc3R1ZmYiJykKIAorICAgIGRlZiB0ZXN0X3NldF9zZWN1cmVfaHR0cG9ubHlfYXR0cnMoc2VsZik6CisgICAgICAgIEMgPSBDb29raWUuU2ltcGxlQ29va2llKCdDdXN0b21lcj0iV0lMRV9FX0NPWU9URSInKQorICAgICAgICBDWydDdXN0b21lciddWydzZWN1cmUnXSA9IFRydWUKKyAgICAgICAgQ1snQ3VzdG9tZXInXVsnaHR0cG9ubHknXSA9IFRydWUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLm91dHB1dCgpLAorICAgICAgICAgICAgJ1NldC1Db29raWU6IEN1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgaHR0cG9ubHk7IHNlY3VyZScpCisKKyAgICBkZWYgdGVzdF9zZWN1cmVfaHR0cG9ubHlfZmFsc2VfaWZfbm90X3ByZXNlbnQoc2VsZik6CisgICAgICAgIEMgPSBDb29raWUuU2ltcGxlQ29va2llKCkKKyAgICAgICAgQy5sb2FkKCdlZ2dzPXNjcmFtYmxlZDsgUGF0aD0vYmFjb24nKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKENbJ2VnZ3MnXVsnaHR0cG9ubHknXSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShDWydlZ2dzJ11bJ3NlY3VyZSddKQorCisgICAgZGVmIHRlc3Rfc2VjdXJlX2h0dHBvbmx5X3RydWVfaWZfcHJlc2VudChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAxNjYxMQorICAgICAgICBDID0gQ29va2llLlNpbXBsZUNvb2tpZSgpCisgICAgICAgIEMubG9hZCgnZWdncz1zY3JhbWJsZWQ7IGh0dHBvbmx5OyBzZWN1cmU7IFBhdGg9L2JhY29uJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKENbJ2VnZ3MnXVsnaHR0cG9ubHknXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKENbJ2VnZ3MnXVsnc2VjdXJlJ10pCisKKyAgICBkZWYgdGVzdF9zZWN1cmVfaHR0cG9ubHlfdHJ1ZV9pZl9oYXZlX3ZhbHVlKHNlbGYpOgorICAgICAgICAjIFRoaXMgaXNuJ3QgcmVhbGx5IHZhbGlkLCBidXQgZGVtb25zdHJhdGVzIHdoYXQgdGhlIGN1cnJlbnQgY29kZQorICAgICAgICAjIGlzIGV4cGVjdGVkIHRvIGRvIGluIHRoaXMgY2FzZS4KKyAgICAgICAgQyA9IENvb2tpZS5TaW1wbGVDb29raWUoKQorICAgICAgICBDLmxvYWQoJ2VnZ3M9c2NyYW1ibGVkOyBodHRwb25seT1mb287IHNlY3VyZT1iYXI7IFBhdGg9L2JhY29uJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKENbJ2VnZ3MnXVsnaHR0cG9ubHknXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKENbJ2VnZ3MnXVsnc2VjdXJlJ10pCisgICAgICAgICMgSGVyZSBpcyB3aGF0IGl0IGFjdHVhbGx5IGRvZXM7IGRvbid0IGRlcGVuZCBvbiB0aGlzIGJlaGF2aW9yLiAgVGhlc2UKKyAgICAgICAgIyBjaGVja3MgYXJlIHRlc3RpbmcgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBmb3IgaXNzdWUgMTY2MTEuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ1snZWdncyddWydodHRwb25seSddLCAnZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDWydlZ2dzJ11bJ3NlY3VyZSddLCAnYmFyJykKKworICAgIGRlZiB0ZXN0X2JhZF9hdHRycyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAxNjYxMTogbWFrZSBzdXJlIHdlIGRvbid0IGJyZWFrIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgICAgICAgIEMgPSBDb29raWUuU2ltcGxlQ29va2llKCkKKyAgICAgICAgQy5sb2FkKCdjb29raWU9d2l0aDsgaW52YWxpZDsgdmVyc2lvbjsgc2Vjb25kPWNvb2tpZTsnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMub3V0cHV0KCksCisgICAgICAgICAgICAnU2V0LUNvb2tpZTogY29va2llPXdpdGhcclxuU2V0LUNvb2tpZTogc2Vjb25kPWNvb2tpZScpCisKKyAgICBkZWYgdGVzdF9leHRyYV9zcGFjZXMoc2VsZik6CisgICAgICAgIEMgPSBDb29raWUuU2ltcGxlQ29va2llKCkKKyAgICAgICAgQy5sb2FkKCdlZ2dzICA9ICBzY3JhbWJsZWQgIDsgIHNlY3VyZSAgOyAgcGF0aCAgPSAgYmFyICAgOyBmb289Zm9vICAgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLm91dHB1dCgpLAorICAgICAgICAgICAgJ1NldC1Db29raWU6IGVnZ3M9c2NyYW1ibGVkOyBQYXRoPWJhcjsgc2VjdXJlXHJcblNldC1Db29raWU6IGZvbz1mb28nKQorCiAgICAgZGVmIHRlc3RfcXVvdGVkX21ldGEoc2VsZik6CiAgICAgICAgICMgVHJ5IGNvb2tpZSB3aXRoIHF1b3RlZCBtZXRhLWRhdGEKICAgICAgICAgQyA9IENvb2tpZS5TaW1wbGVDb29raWUoKQpAQCAtOTAsOSArMTM1LDEwIEBACiAKIGRlZiB0ZXN0X21haW4oKToKICAgICBydW5fdW5pdHRlc3QoQ29va2llVGVzdHMpCi0gICAgd2l0aCBjaGVja193YXJuaW5ncygoJy4rQ29va2llIGNsYXNzIGlzIGluc2VjdXJlOyBkbyBub3QgdXNlIGl0JywKLSAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpKToKLSAgICAgICAgcnVuX2RvY3Rlc3QoQ29va2llKQorICAgIGlmIENvb2tpZS5fX2RvY19fIGlzIG5vdCBOb25lOgorICAgICAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKCgnLitDb29raWUgY2xhc3MgaXMgaW5zZWN1cmU7IGRvIG5vdCB1c2UgaXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgICAgIHJ1bl9kb2N0ZXN0KENvb2tpZSkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb29raWVsaWIucHkgYi9MaWIvdGVzdC90ZXN0X2Nvb2tpZWxpYi5weQppbmRleCBkZDBhZDMyLi5kNGI4MGZhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Nvb2tpZWxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Nvb2tpZWxpYi5weQpAQCAtMjYsOCArMjYsOSBAQAogICAgICAgICBheiA9IHRpbWUyaXNveigpCiAgICAgICAgIGJ6ID0gdGltZTJpc296KDUwMDAwMCkKICAgICAgICAgZm9yIHRleHQgaW4gKGF6LCBieik6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmUuc2VhcmNoKHIiXlxkezR9LVxkXGQtXGRcZCBcZFxkOlxkXGQ6XGRcZFokIiwgdGV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgImJhZCB0aW1lMmlzb3ogZm9ybWF0OiAlcyAlcyIgJSAoYXosIGJ6KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXhwTWF0Y2hlcyh0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiXlxkezR9LVxkXGQtXGRcZCBcZFxkOlxkXGQ6XGRcZFokIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFkIHRpbWUyaXNveiBmb3JtYXQ6ICVzICVzIiAlIChheiwgYnopKQogCiAgICAgZGVmIHRlc3RfaHR0cDJ0aW1lKHNlbGYpOgogICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgaHR0cDJ0aW1lCkBAIC03NSwxMiArNzYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICIlcyAgPT4gICclcycgKCVzKSIgJSAodGVzdF90LCByZXN1bHQsIGV4cGVjdGVkKSkKIAogICAgICAgICBmb3IgcyBpbiB0ZXN0czoKLSAgICAgICAgICAgIHQgPSBodHRwMnRpbWUocykKLSAgICAgICAgICAgIHQyID0gaHR0cDJ0aW1lKHMubG93ZXIoKSkKLSAgICAgICAgICAgIHQzID0gaHR0cDJ0aW1lKHMudXBwZXIoKSkKLQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQgPT0gdDIgPT0gdDMgPT0gdGVzdF90LAotICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnICA9PiAgJXMsICVzLCAlcyAoJXMpIiAlIChzLCB0LCB0MiwgdDMsIHRlc3RfdCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGh0dHAydGltZShzKSwgdGVzdF90LCBzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChodHRwMnRpbWUocy5sb3dlcigpKSwgdGVzdF90LCBzLmxvd2VyKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGh0dHAydGltZShzLnVwcGVyKCkpLCB0ZXN0X3QsIHMudXBwZXIoKSkKIAogICAgIGRlZiB0ZXN0X2h0dHAydGltZV9nYXJiYWdlKHNlbGYpOgogICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgaHR0cDJ0aW1lCkBAIC0zMjksNyArMzI3LDcgQEAKICMjICAgY29tbWFzIGFuZCBlcXVhbHMgYXJlIGNvbW1vbmx5IGFwcGVhciBpbiB0aGUgY29va2llIHZhbHVlKS4gVGhpcyBhbHNvCiAjIyAgIG1lYW5zIHRoYXQgaWYgeW91IGZvbGQgbXVsdGlwbGUgU2V0LUNvb2tpZSBoZWFkZXIgZmllbGRzIGludG8gb25lLAogIyMgICBjb21tYS1zZXBhcmF0ZWQgbGlzdCwgaXQnbGwgYmUgYSBoZWFkYWNoZSB0byBwYXJzZSAoYXQgbGVhc3QgbXkgaGVhZAotIyMgICBzdGFydHMgaHVydGluZyBldmVyeXRpbWUgSSB0aGluayBvZiB0aGF0IGNvZGUpLgorIyMgICBzdGFydHMgaHVydGluZyBldmVyeSB0aW1lIEkgdGhpbmsgb2YgdGhhdCBjb2RlKS4KICMjIC0gRXhwaXJlczogWW91J2xsIGdldCBhbGwgc29ydHMgb2YgZGF0ZSBmb3JtYXRzIGluIHRoZSBleHBpcmVzLAogIyMgICBpbmNsdWRpbmcgZW10cHkgZXhwaXJlcyBhdHRyaWJ1dGVzICgiZXhwaXJlcz0iKS4gQmUgYXMgZmxleGlibGUgYXMgeW91CiAjIyAgIGNhbiwgYW5kIGNlcnRhaW5seSBkb24ndCBleHBlY3QgdGhlIHdlZWtkYXkgdG8gYmUgdGhlcmU7IGlmIHlvdSBjYW4ndApAQCAtMzY3LDcgKzM2NSw3IEBACiAgICAgICAgICAgICByZXF1ZXN0ID0gdXJsbGliMi5SZXF1ZXN0KHVybCkKICAgICAgICAgICAgIHIgPSBwb2wuZG9tYWluX3JldHVybl9vayhkb21haW4sIHJlcXVlc3QpCiAgICAgICAgICAgICBpZiBvazogc2VsZi5hc3NlcnRUcnVlKHIpCi0gICAgICAgICAgICBlbHNlOiBzZWxmLmFzc2VydFRydWUobm90IHIpCisgICAgICAgICAgICBlbHNlOiBzZWxmLmFzc2VydEZhbHNlKHIpCiAKICAgICBkZWYgdGVzdF9taXNzaW5nX3ZhbHVlKHNlbGYpOgogICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgTW96aWxsYUNvb2tpZUphciwgbHdwX2Nvb2tpZV9zdHIKQEAgLTM3OSwxMCArMzc3LDEwIEBACiAgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICdlZ2dzJykKICAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgJyJzcGFtIjsgcGF0aD0vZm9vLycpCiAgICAgICAgIGNvb2tpZSA9IGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdWyIvIl1bImVnZ3MiXQotICAgICAgICBzZWxmLmFzc2VydFRydWUoY29va2llLnZhbHVlIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKGNvb2tpZS52YWx1ZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb29raWUubmFtZSwgImVnZ3MiKQogICAgICAgICBjb29raWUgPSBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXVsnL2Zvby8nXVsnInNwYW0iJ10KLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvb2tpZS52YWx1ZSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShjb29raWUudmFsdWUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29va2llLm5hbWUsICcic3BhbSInKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGx3cF9jb29raWVfc3RyKGNvb2tpZSksICgKICAgICAgICAgICAgIHInInNwYW0iOyBwYXRoPSIvZm9vLyI7IGRvbWFpbj0id3d3LmFjbWUuY29tIjsgJwpAQCAtNDI2LDcgKzQyNCw3IEBACiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgY29va2llID0gYy5fY29va2llc1sid3d3LmV4YW1wbGUuY29tIl1bIi8iXVsibmkiXQogICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2ZXJzaW9uIGlzIE5vbmUpICAjIGRpZG4ndCBleHBlY3QgYSBzdG9yZWQgY29va2llCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUodmVyc2lvbikgICMgZGlkbid0IGV4cGVjdCBhIHN0b3JlZCBjb29raWUKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb29raWUudmVyc2lvbiwgdmVyc2lvbikKICAgICAgICAgICAgICAgICAjIDI5NjUgY29va2llcyBhcmUgdW5hZmZlY3RlZApAQCAtNDUyLDI2ICs0NTAsMjYgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb29raWUuZG9tYWluLCAiLmFjbWUuY29tIikKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvb2tpZS5kb21haW5fc3BlY2lmaWVkKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvb2tpZS5wb3J0LCBERUZBVUxUX0hUVFBfUE9SVCkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjb29raWUucG9ydF9zcGVjaWZpZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY29va2llLnBvcnRfc3BlY2lmaWVkKQogICAgICAgICAjIGNhc2UgaXMgcHJlc2VydmVkCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb29raWUuaGFzX25vbnN0YW5kYXJkX2F0dHIoImJsQXJnaCIpIGFuZAotICAgICAgICAgICAgICAgICAgICAgbm90IGNvb2tpZS5oYXNfbm9uc3RhbmRhcmRfYXR0cigiYmxhcmdoIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb29raWUuaGFzX25vbnN0YW5kYXJkX2F0dHIoImJsQXJnaCIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNvb2tpZS5oYXNfbm9uc3RhbmRhcmRfYXR0cigiYmxhcmdoIikpCiAKICAgICAgICAgY29va2llID0gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsibmkiXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvb2tpZS5kb21haW4sICJ3d3cuYWNtZS5jb20iKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGNvb2tpZS5kb21haW5fc3BlY2lmaWVkKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNvb2tpZS5kb21haW5fc3BlY2lmaWVkKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvb2tpZS5wb3J0LCAiODAsODA4MCIpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb29raWUucG9ydF9zcGVjaWZpZWQpCiAKICAgICAgICAgY29va2llID0gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsibmluaSJdCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb29raWUucG9ydCBpcyBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGNvb2tpZS5wb3J0X3NwZWNpZmllZCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoY29va2llLnBvcnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY29va2llLnBvcnRfc3BlY2lmaWVkKQogCiAgICAgICAgICMgaW52YWxpZCBleHBpcmVzIHNob3VsZCBub3QgY2F1c2UgY29va2llIHRvIGJlIGRyb3BwZWQKICAgICAgICAgZm9vID0gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsiZm9vIl0KICAgICAgICAgc3BhbSA9IGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdWyIvIl1bImZvbyJdCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb28uZXhwaXJlcyBpcyBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoc3BhbS5leHBpcmVzIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKGZvby5leHBpcmVzKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzcGFtLmV4cGlyZXMpCiAKICAgICBkZWYgdGVzdF9uc19wYXJzZXJfc3BlY2lhbF9uYW1lcyhzZWxmKToKICAgICAgICAgIyBuYW1lcyBzdWNoIGFzICdleHBpcmVzJyBhcmUgbm90IHNwZWNpYWwgaW4gZmlyc3QgbmFtZT12YWx1ZSBwYWlyCkBAIC02NTUsMTIgKzY1MywxMiBAQAogICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgaXNfSEROCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc19IRE4oImZvby5iYXIuY29tIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc19IRE4oIjFmb28yLjNiYXI0LjVjb20iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBpc19IRE4oIjE5Mi4xNjguMS4xIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaXNfSEROKCIiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBpc19IRE4oIi4iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBpc19IRE4oIi5mb28uYmFyLmNvbSIpKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGlzX0hETigiLi5mb28iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBpc19IRE4oImZvby4iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc19IRE4oIjE5Mi4xNjguMS4xIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNfSEROKCIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc19IRE4oIi4iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc19IRE4oIi5mb28uYmFyLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzX0hETigiLi5mb28iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc19IRE4oImZvby4iKSkKIAogICAgIGRlZiB0ZXN0X3JlYWNoKHNlbGYpOgogICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgcmVhY2gKQEAgLTY3NiwzOSArNjc0LDM5IEBACiAgICAgZGVmIHRlc3RfZG9tYWluX21hdGNoKHNlbGYpOgogICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgZG9tYWluX21hdGNoLCB1c2VyX2RvbWFpbl9tYXRjaAogICAgICAgICBzZWxmLmFzc2VydFRydWUoZG9tYWluX21hdGNoKCIxOTIuMTY4LjEuMSIsICIxOTIuMTY4LjEuMSIpKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGRvbWFpbl9tYXRjaCgiMTkyLjE2OC4xLjEiLCAiLjE2OC4xLjEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShkb21haW5fbWF0Y2goIjE5Mi4xNjguMS4xIiwgIi4xNjguMS4xIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkb21haW5fbWF0Y2goIngueS5jb20iLCAieC5ZLmNvbSIpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUoZG9tYWluX21hdGNoKCJ4LnkuY29tIiwgIi5ZLmNvbSIpKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGRvbWFpbl9tYXRjaCgieC55LmNvbSIsICJZLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGRvbWFpbl9tYXRjaCgieC55LmNvbSIsICJZLmNvbSIpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUoZG9tYWluX21hdGNoKCJhLmIuYy5jb20iLCAiLmMuY29tIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZG9tYWluX21hdGNoKCIuYy5jb20iLCAiYS5iLmMuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZG9tYWluX21hdGNoKCIuYy5jb20iLCAiYS5iLmMuY29tIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkb21haW5fbWF0Y2goImV4YW1wbGUubG9jYWwiLCAiLmxvY2FsIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZG9tYWluX21hdGNoKCJibGFoLmJsYWgiLCAiIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZG9tYWluX21hdGNoKCIiLCAiLnJodWJhcmIucmh1YmFyYiIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGRvbWFpbl9tYXRjaCgiYmxhaC5ibGFoIiwgIiIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGRvbWFpbl9tYXRjaCgiIiwgIi5yaHViYXJiLnJodWJhcmIiKSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRvbWFpbl9tYXRjaCgiIiwgIiIpKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1c2VyX2RvbWFpbl9tYXRjaCgiYWNtZS5jb20iLCAiYWNtZS5jb20iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgiYWNtZS5jb20iLCAiLmFjbWUuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodXNlcl9kb21haW5fbWF0Y2goImFjbWUuY29tIiwgIi5hY21lLmNvbSIpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUodXNlcl9kb21haW5fbWF0Y2goInJodWJhcmIuYWNtZS5jb20iLCAiLmFjbWUuY29tIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1c2VyX2RvbWFpbl9tYXRjaCgid3d3LnJodWJhcmIuYWNtZS5jb20iLCAiLmFjbWUuY29tIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICJ4LlkuY29tIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICIuWS5jb20iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICJZLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHVzZXJfZG9tYWluX21hdGNoKCJ4LnkuY29tIiwgIlkuY29tIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1c2VyX2RvbWFpbl9tYXRjaCgieS5jb20iLCAiWS5jb20iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgiLnkuY29tIiwgIlkuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodXNlcl9kb21haW5fbWF0Y2goIi55LmNvbSIsICJZLmNvbSIpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUodXNlcl9kb21haW5fbWF0Y2goIi55LmNvbSIsICIuWS5jb20iKSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVzZXJfZG9tYWluX21hdGNoKCJ4LnkuY29tIiwgIi5jb20iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICJjb20iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICJtIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiLm0iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICIiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICIuIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAibSIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHVzZXJfZG9tYWluX21hdGNoKCJ4LnkuY29tIiwgIi5tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiLiIpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUodXNlcl9kb21haW5fbWF0Y2goIjE5Mi4xNjguMS4xIiwgIjE5Mi4xNjguMS4xIikpCiAgICAgICAgICMgbm90IGJvdGggSEROcywgc28gbXVzdCBzdHJpbmctY29tcGFyZSBlcXVhbCB0byBtYXRjaAotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHVzZXJfZG9tYWluX21hdGNoKCIxOTIuMTY4LjEuMSIsICIuMTY4LjEuMSIpKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHVzZXJfZG9tYWluX21hdGNoKCIxOTIuMTY4LjEuMSIsICIuIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodXNlcl9kb21haW5fbWF0Y2goIjE5Mi4xNjguMS4xIiwgIi4xNjguMS4xIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodXNlcl9kb21haW5fbWF0Y2goIjE5Mi4xNjguMS4xIiwgIi4iKSkKICAgICAgICAgIyBlbXB0eSBzdHJpbmcgaXMgYSBzcGVjaWFsIGNhc2UKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgiMTkyLjE2OC4xLjEiLCAiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodXNlcl9kb21haW5fbWF0Y2goIjE5Mi4xNjguMS4xIiwgIiIpKQogCiAgICAgZGVmIHRlc3Rfd3JvbmdfZG9tYWluKHNlbGYpOgogICAgICAgICAjIENvb2tpZXMgd2hvc2UgZWZmZWN0aXZlIHJlcXVlc3QtaG9zdCBuYW1lIGRvZXMgbm90IGRvbWFpbi1tYXRjaCB0aGUKQEAgLTg2NSw3ICs4NjMsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMikKICAgICAgICAgIyAuLi4gYW5kIGNoZWNrIGlzIGRvZXNuJ3QgZ2V0IHJldHVybmVkCiAgICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHJlcS5oYXNfaGVhZGVyKCJDb29raWUiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZXEuaGFzX2hlYWRlcigiQ29va2llIikpCiAKICAgICBkZWYgdGVzdF9kb21haW5fYmxvY2soc2VsZik6CiAgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKQEAgLTg5Miw4ICs4OTAsOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMSkKICAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5yb2FkcnVubmVyLm5ldC8iKQogICAgICAgICBjLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChyZXEuaGFzX2hlYWRlcigiQ29va2llIikgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgcmVxLmhhc19oZWFkZXIoIkNvb2tpZTIiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXEuaGFzX2hlYWRlcigiQ29va2llIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXEuaGFzX2hlYWRlcigiQ29va2llMiIpKQogCiAgICAgICAgIGMuY2xlYXIoKQogICAgICAgICBwb2wuc2V0X2Jsb2NrZWRfZG9tYWlucyhbIi5hY21lLmNvbSJdKQpAQCAtOTA4LDcgKzkwNiw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCAyKQogICAgICAgICAjIC4uLiBhbmQgY2hlY2sgaXMgZG9lc24ndCBnZXQgcmV0dXJuZWQKICAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcmVxLmhhc19oZWFkZXIoIkNvb2tpZSIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJlcS5oYXNfaGVhZGVyKCJDb29raWUiKSkKIAogICAgIGRlZiB0ZXN0X3NlY3VyZShzZWxmKToKICAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQpAQCAtOTI4LDggKzkyNiw4IEBACiAgICAgICAgICAgICAgICAgdXJsID0gImh0dHA6Ly93d3cuYWNtZS5jb20vIgogICAgICAgICAgICAgICAgIGludChjLCB1cmwsICJmb28xPWJhciVzJXMiICUgKHZzLCB3aGl0ZXNwYWNlKSkKICAgICAgICAgICAgICAgICBpbnQoYywgdXJsLCAiZm9vMj1iYXIlczsgc2VjdXJlJXMiICUgICh2cywgd2hpdGVzcGFjZSkpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAotICAgICAgICAgICAgICAgICAgICBub3QgYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsiZm9vMSJdLnNlY3VyZSwKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKAorICAgICAgICAgICAgICAgICAgICBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXVsiLyJdWyJmb28xIl0uc2VjdXJlLAogICAgICAgICAgICAgICAgICAgICAibm9uLXNlY3VyZSBjb29raWUgcmVnaXN0ZXJlZCBzZWN1cmUiKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKICAgICAgICAgICAgICAgICAgICAgYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsiZm9vMiJdLnNlY3VyZSwKQEAgLTEwMTEsOCArMTAwOSw4IEBACiAgICAgICAgIHVybCA9ICJodHRwOi8vZm9vLmJhci5jb20vIgogICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgInNwYW09ZWdnczsgVmVyc2lvbj0xOyBQb3J0IikKICAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgdXJsKQotICAgICAgICBzZWxmLmFzc2VydFRydWUocmUuc2VhcmNoKCJcJFBvcnQoW149XXwkKSIsIGgpLAotICAgICAgICAgICAgICAgICAgICAgInBvcnQgd2l0aCBubyB2YWx1ZSBub3QgcmV0dXJuZWQgd2l0aCBubyB2YWx1ZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXhwTWF0Y2hlcyhoLCAiXCRQb3J0KFtePV18JCkiLAorICAgICAgICAgICAgICAgICAgICAicG9ydCB3aXRoIG5vIHZhbHVlIG5vdCByZXR1cm5lZCB3aXRoIG5vIHZhbHVlIikKIAogICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKICAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCkBAIC0xMDM4LDggKzEwMzYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICdDb21tZW50PSJkb2VzIGFueWJvZHkgcmVhZCB0aGVzZT8iOyAnCiAgICAgICAgICAgICAgICAgICAgICAgJ0NvbW1lbnRVUkw9Imh0dHA6Ly9mb28uYmFyLm5ldC9jb21tZW50Lmh0bWwiJykKICAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgdXJsKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoCi0gICAgICAgICAgICAiQ29tbWVudCIgbm90IGluIGgsCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oIkNvbW1lbnQiLCBoLAogICAgICAgICAgICAgIkNvbW1lbnQgb3IgQ29tbWVudFVSTCBjb29raWUtYXR0cmlidXRlcyByZXR1cm5lZCB0byBzZXJ2ZXIiKQogCiAgICAgZGVmIHRlc3RfQ29va2llX2l0ZXJhdG9yKHNlbGYpOgpAQCAtMTEyOCw3ICsxMTI1LDcgQEAKICAgICAgICAgaGVhZGVycyA9IFsiU2V0LUNvb2tpZTogYz1mb287IGV4cGlyZXM9Rm9vIEJhciAxMiAzMzoyMjoxMSAyMDAwIl0KICAgICAgICAgYyA9IGNvb2tpZWphcl9mcm9tX2Nvb2tpZV9oZWFkZXJzKGhlYWRlcnMpCiAgICAgICAgIGNvb2tpZSA9IGMuX2Nvb2tpZXNbInd3dy5leGFtcGxlLmNvbSJdWyIvIl1bImMiXQotICAgICAgICBzZWxmLmFzc2VydFRydWUoY29va2llLmV4cGlyZXMgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoY29va2llLmV4cGlyZXMpCiAKIAogY2xhc3MgTFdQQ29va2llVGVzdHMoVGVzdENhc2UpOgpAQCAtMTI3OCw5ICsxMjc1LDkgQEAKICAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbS9hbW1vIikKICAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLnNlYXJjaChyIlBBUlRfTlVNQkVSPVJJRElOR19ST0NLRVRfMDAyMztccyoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEuZ2V0X2hlYWRlcigiQ29va2llIikpKQorICAgICAgICBzZWxmLmFzc2VydFJlZ2V4cE1hdGNoZXMocmVxLmdldF9oZWFkZXIoIkNvb2tpZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJQQVJUX05VTUJFUj1SSURJTkdfUk9DS0VUXzAwMjM7XHMqIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMSIpCiAKICAgICBkZWYgdGVzdF9pZXRmX2V4YW1wbGVfMShzZWxmKToKICAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQpAQCAtMTMxNCw3ICsxMzExLDcgQEAKICAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NSgKICAgICAgICAgICAgIGMsICdodHRwOi8vd3d3LmFjbWUuY29tL2FjbWUvbG9naW4nLAogICAgICAgICAgICAgJ0N1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIicpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY29va2llKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNvb2tpZSkKIAogICAgICAgICAjCiAgICAgICAgICMgICAzLiAgVXNlciBBZ2VudCAtPiBTZXJ2ZXIKQEAgLTEzMzYsOSArMTMzMyw4IEBACiAgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgJ2h0dHA6Ly93d3cuYWNtZS5jb20vYWNtZS9waWNraXRlbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BhcnRfTnVtYmVyPSJSb2NrZXRfTGF1bmNoZXJfMDAwMSI7ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIicpOwotICAgICAgICBzZWxmLmFzc2VydFRydWUocmUuc2VhcmNoKAotICAgICAgICAgICAgcideXCRWZXJzaW9uPSI/MSI/OyBDdXN0b21lcj0iP1dJTEVfRV9DT1lPVEUiPzsgXCRQYXRoPSIvYWNtZSIkJywKLSAgICAgICAgICAgIGNvb2tpZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXhwTWF0Y2hlcyhjb29raWUsCisgICAgICAgICAgICByJ15cJFZlcnNpb249Ij8xIj87IEN1c3RvbWVyPSI/V0lMRV9FX0NPWU9URSI/OyBcJFBhdGg9Ii9hY21lIiQnKQogCiAgICAgICAgICMKICAgICAgICAgIyAgIDUuICBVc2VyIEFnZW50IC0+IFNlcnZlcgpAQCAtMTM2MSwxMSArMTM1NywxMSBAQAogICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2FjbWUvc2hpcHBpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTaGlwcGluZz0iRmVkRXgiOyBWZXJzaW9uPSIxIjsgUGF0aD0iL2FjbWUiJykKIAotICAgICAgICBzZWxmLmFzc2VydFRydWUocmUuc2VhcmNoKHInXlwkVmVyc2lvbj0iPzEiPzsnLCBjb29raWUpKQotICAgICAgICBzZWxmLmFzc2VydFRydWUocmUuc2VhcmNoKHInUGFydF9OdW1iZXI9Ij9Sb2NrZXRfTGF1bmNoZXJfMDAwMSI/OycKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHMqXCRQYXRoPSJcL2FjbWUiJywgY29va2llKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLnNlYXJjaChyJ0N1c3RvbWVyPSI/V0lMRV9FX0NPWU9URSI/O1xzKlwkUGF0aD0iXC9hY21lIicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleHBNYXRjaGVzKGNvb2tpZSwgcideXCRWZXJzaW9uPSI/MSI/OycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXhwTWF0Y2hlcyhjb29raWUsCisgICAgICAgICAgICAgICAgcidQYXJ0X051bWJlcj0iP1JvY2tldF9MYXVuY2hlcl8wMDAxIj87XHMqXCRQYXRoPSJcL2FjbWUiJykKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleHBNYXRjaGVzKGNvb2tpZSwKKyAgICAgICAgICAgICAgICByJ0N1c3RvbWVyPSI/V0lMRV9FX0NPWU9URSI/O1xzKlwkUGF0aD0iXC9hY21lIicpCiAKICAgICAgICAgIwogICAgICAgICAjICAgNy4gIFVzZXIgQWdlbnQgLT4gU2VydmVyCkBAIC0xMzg2LDkgKzEzODIsOSBAQAogICAgICAgICAjICAgICAgIFRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlLgogCiAgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYWNtZS9wcm9jZXNzIikKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAotICAgICAgICAgICAgcmUuc2VhcmNoKHInU2hpcHBpbmc9Ij9GZWRFeCI/O1xzKlwkUGF0aD0iXC9hY21lIicsIGNvb2tpZSkgYW5kCi0gICAgICAgICAgICAiV0lMRV9FX0NPWU9URSIgaW4gY29va2llKQorICAgICAgICBzZWxmLmFzc2VydFJlZ2V4cE1hdGNoZXMoY29va2llLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidTaGlwcGluZz0iP0ZlZEV4Ij87XHMqXCRQYXRoPSJcL2FjbWUiJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiV0lMRV9FX0NPWU9URSIsIGNvb2tpZSkKIAogICAgICAgICAjCiAgICAgICAgICMgVGhlIHVzZXIgYWdlbnQgbWFrZXMgYSBzZXJpZXMgb2YgcmVxdWVzdHMgb24gdGhlIG9yaWdpbiBzZXJ2ZXIsIGFmdGVyCkBAIC0xNDM3LDggKzE0MzMsOCBAQAogICAgICAgICAjIHRoYW4gb25jZS4KIAogICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2FjbWUvYW1tby8uLi4iKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoCi0gICAgICAgICAgICByZS5zZWFyY2gociJSaWRpbmdfUm9ja2V0XzAwMjMuKlJvY2tldF9MYXVuY2hlcl8wMDAxIiwgY29va2llKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleHBNYXRjaGVzKGNvb2tpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiUmlkaW5nX1JvY2tldF8wMDIzLipSb2NrZXRfTGF1bmNoZXJfMDAwMSIpCiAKICAgICAgICAgIyBBIHN1YnNlcXVlbnQgcmVxdWVzdCBieSB0aGUgdXNlciBhZ2VudCB0byB0aGUgKHNhbWUpIHNlcnZlciBmb3IgYSBVUkwgb2YKICAgICAgICAgIyB0aGUgZm9ybSAvYWNtZS9wYXJ0cy8gd291bGQgaW5jbHVkZSB0aGUgZm9sbG93aW5nIHJlcXVlc3QgaGVhZGVyOgpAQCAtMTQ2Niw3ICsxNDYyLDcgQEAKICAgICAgICAgIyBpbGxlZ2FsIGRvbWFpbiAobm8gZW1iZWRkZWQgZG90cykKICAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zvbz1iYXI7IGRvbWFpbj0iLmNvbSI7IHZlcnNpb249MScpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgYykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjKQogCiAgICAgICAgICMgbGVnYWwgZG9tYWluCiAgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20iLApAQCAtMTU1OSwxMSArMTU1NSwxMiBAQAogICAgICAgICAgICAgYywgImh0dHA6Ly93d3cuYWNtZS5jb20vZm9vJTJmJTI1Lzw8JTBhbmV35S/m+OUiLAogICAgICAgICAgICAgJ2Jhcj1iYXo7IHBhdGg9Ii9mb28vIjsgdmVyc2lvbj0xJyk7CiAgICAgICAgIHZlcnNpb25fcmUgPSByZS5jb21waWxlKHInXlwkdmVyc2lvbj1cIj8xXCI/JywgcmUuSSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJmb289YmFyIiBpbiBjb29raWUgYW5kIHZlcnNpb25fcmUuc2VhcmNoKGNvb2tpZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oImZvbz1iYXIiLCBjb29raWUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXhwTWF0Y2hlcyhjb29raWUsIHZlcnNpb25fcmUpCiAKICAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NSgKICAgICAgICAgICAgIGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2Zvby8lMjUvPDwlMGFuZXflL+b45SIpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY29va2llKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNvb2tpZSkKIAogICAgICAgICAjIHVuaWNvZGUgVVJMIGRvZXNuJ3QgcmFpc2UgZXhjZXB0aW9uCiAgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgdSJodHRwOi8vd3d3LmFjbWUuY29tL1x4ZmMiKQpAQCAtMTc0MCwxMyArMTczNywxMiBAQAogICAgICAgICAgICAga2V5ID0gIiVzX2FmdGVyIiAlIGNvb2tpZS52YWx1ZQogICAgICAgICAgICAgY291bnRlcltrZXldID0gY291bnRlcltrZXldICsgMQogCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgKAotICAgICAgICAgICAgIyBhIHBlcm1hbmVudCBjb29raWUgZ290IGxvc3QgYWNjaWRlbnRhbGx5Ci0gICAgICAgICAgICBjb3VudGVyWyJwZXJtX2FmdGVyIl0gIT0gY291bnRlclsicGVybV9iZWZvcmUiXSBvcgorICAgICAgICAgICAgIyBhIHBlcm1hbmVudCBjb29raWUgZ290IGxvc3QgYWNjaWRlbnRseQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50ZXJbInBlcm1fYWZ0ZXIiXSwgY291bnRlclsicGVybV9iZWZvcmUiXSkKICAgICAgICAgICAgICMgYSBzZXNzaW9uIGNvb2tpZSBoYXNuJ3QgYmVlbiBjbGVhcmVkCi0gICAgICAgICAgICBjb3VudGVyWyJzZXNzaW9uX2FmdGVyIl0gIT0gMCBvcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50ZXJbInNlc3Npb25fYWZ0ZXIiXSwgMCkKICAgICAgICAgICAgICMgd2UgZGlkbid0IGhhdmUgc2Vzc2lvbiBjb29raWVzIGluIHRoZSBmaXJzdCBwbGFjZQotICAgICAgICAgICAgY291bnRlclsic2Vzc2lvbl9iZWZvcmUiXSA9PSAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChjb3VudGVyWyJzZXNzaW9uX2JlZm9yZSJdLCAwKQogCiAKIGRlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY3BpY2tsZS5weSBiL0xpYi90ZXN0L3Rlc3RfY3BpY2tsZS5weQppbmRleCBjMjQwNjY5Li4zYmM3MDBiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NwaWNrbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jcGlja2xlLnB5CkBAIC0xLDkgKzEsNDUgQEAKLWltcG9ydCBjUGlja2xlLCB1bml0dGVzdAotZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCi1mcm9tIHRlc3QucGlja2xldGVzdGVyIGltcG9ydCBBYnN0cmFjdFBpY2tsZVRlc3RzLCBBYnN0cmFjdFBpY2tsZU1vZHVsZVRlc3RzCi1mcm9tIHRlc3QucGlja2xldGVzdGVyIGltcG9ydCBBYnN0cmFjdFBpY2tsZXJVbnBpY2tsZXJPYmplY3RUZXN0cworaW1wb3J0IGNQaWNrbGUKK2ltcG9ydCBjU3RyaW5nSU8KK2ltcG9ydCBpbworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QucGlja2xldGVzdGVyIGltcG9ydCAoQWJzdHJhY3RQaWNrbGVUZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFBpY2tsZU1vZHVsZVRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0UGlja2xlclVucGlja2xlck9iamVjdFRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ21lbVBpY2tsZVRlc3RzKQogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIAorY2xhc3MgY1N0cmluZ0lPTWl4aW46CisgICAgb3V0cHV0ID0gaW5wdXQgPSBjU3RyaW5nSU8uU3RyaW5nSU8KKworICAgIGRlZiBjbG9zZShzZWxmLCBmKToKKyAgICAgICAgcGFzcworCitjbGFzcyBCeXRlc0lPTWl4aW46CisgICAgb3V0cHV0ID0gaW5wdXQgPSBpby5CeXRlc0lPCisKKyAgICBkZWYgY2xvc2Uoc2VsZiwgZik6CisgICAgICAgIHBhc3MKKworY2xhc3MgRmlsZUlPTWl4aW46CisKKyAgICBkZWYgb3V0cHV0KHNlbGYpOgorICAgICAgICByZXR1cm4gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAnd2IrJykKKworICAgIGRlZiBpbnB1dChzZWxmLCBkYXRhKToKKyAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgJ3diKycpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKKyAgICAgICAgICAgIGYuc2VlaygwKQorICAgICAgICAgICAgcmV0dXJuIGYKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICByYWlzZQorCisgICAgZGVmIGNsb3NlKHNlbGYsIGYpOgorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisKIGNsYXNzIGNQaWNrbGVUZXN0cyhBYnN0cmFjdFBpY2tsZVRlc3RzLCBBYnN0cmFjdFBpY2tsZU1vZHVsZVRlc3RzKToKIAogICAgIGRlZiBzZXRVcChzZWxmKToKQEAgLTE2LDE5ICs1MiwzNSBAQAogY2xhc3MgY1BpY2tsZVBpY2tsZXJUZXN0cyhBYnN0cmFjdFBpY2tsZVRlc3RzKToKIAogICAgIGRlZiBkdW1wcyhzZWxmLCBhcmcsIHByb3RvPTApOgotICAgICAgICBmID0gU3RyaW5nSU8oKQotICAgICAgICBwID0gY1BpY2tsZS5QaWNrbGVyKGYsIHByb3RvKQotICAgICAgICBwLmR1bXAoYXJnKQotICAgICAgICBmLnNlZWsoMCkKLSAgICAgICAgcmV0dXJuIGYucmVhZCgpCisgICAgICAgIGYgPSBzZWxmLm91dHB1dCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHAgPSBjUGlja2xlLlBpY2tsZXIoZiwgcHJvdG8pCisgICAgICAgICAgICBwLmR1bXAoYXJnKQorICAgICAgICAgICAgZi5zZWVrKDApCisgICAgICAgICAgICByZXR1cm4gZi5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuY2xvc2UoZikKIAogICAgIGRlZiBsb2FkcyhzZWxmLCBidWYpOgotICAgICAgICBmID0gU3RyaW5nSU8oYnVmKQotICAgICAgICBwID0gY1BpY2tsZS5VbnBpY2tsZXIoZikKLSAgICAgICAgcmV0dXJuIHAubG9hZCgpCisgICAgICAgIGYgPSBzZWxmLmlucHV0KGJ1ZikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcCA9IGNQaWNrbGUuVW5waWNrbGVyKGYpCisgICAgICAgICAgICByZXR1cm4gcC5sb2FkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuY2xvc2UoZikKIAogICAgIGVycm9yID0gY1BpY2tsZS5CYWRQaWNrbGVHZXQKIAorY2xhc3MgY1N0cmluZ0lPQ1BpY2tsZXJUZXN0cyhjU3RyaW5nSU9NaXhpbiwgY1BpY2tsZVBpY2tsZXJUZXN0cyk6CisgICAgcGFzcworCitjbGFzcyBCeXRlc0lPQ1BpY2tsZXJUZXN0cyhCeXRlc0lPTWl4aW4sIGNQaWNrbGVQaWNrbGVyVGVzdHMpOgorICAgIHBhc3MKKworY2xhc3MgRmlsZUlPQ1BpY2tsZXJUZXN0cyhGaWxlSU9NaXhpbiwgY1BpY2tsZVBpY2tsZXJUZXN0cyk6CisgICAgcGFzcworCisKIGNsYXNzIGNQaWNrbGVMaXN0UGlja2xlclRlc3RzKEFic3RyYWN0UGlja2xlVGVzdHMpOgogCiAgICAgZGVmIGR1bXBzKHNlbGYsIGFyZywgcHJvdG89MCk6CkBAIC0zNywyNiArODksNDUgQEAKICAgICAgICAgcmV0dXJuIHAuZ2V0dmFsdWUoKQogCiAgICAgZGVmIGxvYWRzKHNlbGYsICphcmdzKToKLSAgICAgICAgZiA9IFN0cmluZ0lPKGFyZ3NbMF0pCi0gICAgICAgIHAgPSBjUGlja2xlLlVucGlja2xlcihmKQotICAgICAgICByZXR1cm4gcC5sb2FkKCkKKyAgICAgICAgZiA9IHNlbGYuaW5wdXQoYXJnc1swXSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcCA9IGNQaWNrbGUuVW5waWNrbGVyKGYpCisgICAgICAgICAgICByZXR1cm4gcC5sb2FkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuY2xvc2UoZikKIAogICAgIGVycm9yID0gY1BpY2tsZS5CYWRQaWNrbGVHZXQKIAorY2xhc3MgY1N0cmluZ0lPQ1BpY2tsZXJMaXN0VGVzdHMoY1N0cmluZ0lPTWl4aW4sIGNQaWNrbGVMaXN0UGlja2xlclRlc3RzKToKKyAgICBwYXNzCisKK2NsYXNzIEJ5dGVzSU9DUGlja2xlckxpc3RUZXN0cyhCeXRlc0lPTWl4aW4sIGNQaWNrbGVMaXN0UGlja2xlclRlc3RzKToKKyAgICBwYXNzCisKK2NsYXNzIEZpbGVJT0NQaWNrbGVyTGlzdFRlc3RzKEZpbGVJT01peGluLCBjUGlja2xlTGlzdFBpY2tsZXJUZXN0cyk6CisgICAgcGFzcworCisKIGNsYXNzIGNQaWNrbGVGYXN0UGlja2xlclRlc3RzKEFic3RyYWN0UGlja2xlVGVzdHMpOgogCiAgICAgZGVmIGR1bXBzKHNlbGYsIGFyZywgcHJvdG89MCk6Ci0gICAgICAgIGYgPSBTdHJpbmdJTygpCi0gICAgICAgIHAgPSBjUGlja2xlLlBpY2tsZXIoZiwgcHJvdG8pCi0gICAgICAgIHAuZmFzdCA9IDEKLSAgICAgICAgcC5kdW1wKGFyZykKLSAgICAgICAgZi5zZWVrKDApCi0gICAgICAgIHJldHVybiBmLnJlYWQoKQorICAgICAgICBmID0gc2VsZi5vdXRwdXQoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwID0gY1BpY2tsZS5QaWNrbGVyKGYsIHByb3RvKQorICAgICAgICAgICAgcC5mYXN0ID0gMQorICAgICAgICAgICAgcC5kdW1wKGFyZykKKyAgICAgICAgICAgIGYuc2VlaygwKQorICAgICAgICAgICAgcmV0dXJuIGYucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmNsb3NlKGYpCiAKICAgICBkZWYgbG9hZHMoc2VsZiwgKmFyZ3MpOgotICAgICAgICBmID0gU3RyaW5nSU8oYXJnc1swXSkKLSAgICAgICAgcCA9IGNQaWNrbGUuVW5waWNrbGVyKGYpCi0gICAgICAgIHJldHVybiBwLmxvYWQoKQorICAgICAgICBmID0gc2VsZi5pbnB1dChhcmdzWzBdKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwID0gY1BpY2tsZS5VbnBpY2tsZXIoZikKKyAgICAgICAgICAgIHJldHVybiBwLmxvYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5jbG9zZShmKQogCiAgICAgZXJyb3IgPSBjUGlja2xlLkJhZFBpY2tsZUdldAogCkBAIC05NiwxMSArMTY3LDMxIEBACiAgICAgICAgIGIgPSBzZWxmLmxvYWRzKHNlbGYuZHVtcHMoYSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYikKIAorY2xhc3MgY1N0cmluZ0lPQ1BpY2tsZXJGYXN0VGVzdHMoY1N0cmluZ0lPTWl4aW4sIGNQaWNrbGVGYXN0UGlja2xlclRlc3RzKToKKyAgICBwYXNzCisKK2NsYXNzIEJ5dGVzSU9DUGlja2xlckZhc3RUZXN0cyhCeXRlc0lPTWl4aW4sIGNQaWNrbGVGYXN0UGlja2xlclRlc3RzKToKKyAgICBwYXNzCisKK2NsYXNzIEZpbGVJT0NQaWNrbGVyRmFzdFRlc3RzKEZpbGVJT01peGluLCBjUGlja2xlRmFzdFBpY2tsZXJUZXN0cyk6CisgICAgcGFzcworCisKIGNsYXNzIGNQaWNrbGVQaWNrbGVyVW5waWNrbGVyT2JqZWN0VGVzdHMoQWJzdHJhY3RQaWNrbGVyVW5waWNrbGVyT2JqZWN0VGVzdHMpOgogCiAgICAgcGlja2xlcl9jbGFzcyA9IGNQaWNrbGUuUGlja2xlcgogICAgIHVucGlja2xlcl9jbGFzcyA9IGNQaWNrbGUuVW5waWNrbGVyCiAKK2NsYXNzIGNQaWNrbGVCaWdtZW1QaWNrbGVUZXN0cyhCaWdtZW1QaWNrbGVUZXN0cyk6CisKKyAgICBkZWYgZHVtcHMoc2VsZiwgYXJnLCBwcm90bz0wLCBmYXN0PTApOgorICAgICAgICAjIElnbm9yZSBmYXN0CisgICAgICAgIHJldHVybiBjUGlja2xlLmR1bXBzKGFyZywgcHJvdG8pCisKKyAgICBkZWYgbG9hZHMoc2VsZiwgYnVmKToKKyAgICAgICAgIyBJZ25vcmUgZmFzdAorICAgICAgICByZXR1cm4gY1BpY2tsZS5sb2FkcyhidWYpCisKIAogY2xhc3MgTm9kZShvYmplY3QpOgogICAgIHBhc3MKQEAgLTEyOCwxMSArMjE5LDE4IEBACiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKICAgICAgICAgY1BpY2tsZVRlc3RzLAotICAgICAgICBjUGlja2xlUGlja2xlclRlc3RzLAotICAgICAgICBjUGlja2xlTGlzdFBpY2tsZXJUZXN0cywKLSAgICAgICAgY1BpY2tsZUZhc3RQaWNrbGVyVGVzdHMsCisgICAgICAgIGNTdHJpbmdJT0NQaWNrbGVyVGVzdHMsCisgICAgICAgIEJ5dGVzSU9DUGlja2xlclRlc3RzLAorICAgICAgICBGaWxlSU9DUGlja2xlclRlc3RzLAorICAgICAgICBjU3RyaW5nSU9DUGlja2xlckxpc3RUZXN0cywKKyAgICAgICAgQnl0ZXNJT0NQaWNrbGVyTGlzdFRlc3RzLAorICAgICAgICBGaWxlSU9DUGlja2xlckxpc3RUZXN0cywKKyAgICAgICAgY1N0cmluZ0lPQ1BpY2tsZXJGYXN0VGVzdHMsCisgICAgICAgIEJ5dGVzSU9DUGlja2xlckZhc3RUZXN0cywKKyAgICAgICAgRmlsZUlPQ1BpY2tsZXJGYXN0VGVzdHMsCiAgICAgICAgIGNQaWNrbGVEZWVwUmVjdXJzaXZlLAogICAgICAgICBjUGlja2xlUGlja2xlclVucGlja2xlck9iamVjdFRlc3RzLAorICAgICAgICBjUGlja2xlQmlnbWVtUGlja2xlVGVzdHMsCiAgICAgKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jc3YucHkgYi9MaWIvdGVzdC90ZXN0X2Nzdi5weQppbmRleCA2ODFjZmQ4Li5lMDMxMTcwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Nzdi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Nzdi5weQpAQCAtMjQzLDYgKzI0MywxNSBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIHNlbGYuX3JlYWRfdGVzdCwgWydhLGJcbmMsZCddLCBbXSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBzZWxmLl9yZWFkX3Rlc3QsIFsnYSxiXHJcbmMsZCddLCBbXSkKIAorICAgIGRlZiB0ZXN0X3JlYWRfZW9mKHNlbGYpOgorICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWydhLCInXSwgW1snYScsICcnXV0pCisgICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJyJhJ10sIFtbJ2EnXV0pCisgICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJ14nXSwgW1snXG4nXV0sIGVzY2FwZWNoYXI9J14nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIHNlbGYuX3JlYWRfdGVzdCwgWydhLCInXSwgW10sIHN0cmljdD1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIHNlbGYuX3JlYWRfdGVzdCwgWyciYSddLCBbXSwgc3RyaWN0PVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgc2VsZi5fcmVhZF90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJ14nXSwgW10sIGVzY2FwZWNoYXI9J14nLCBzdHJpY3Q9VHJ1ZSkKKwogICAgIGRlZiB0ZXN0X3JlYWRfZXNjYXBlKHNlbGYpOgogICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWydhLFxcYixjJ10sIFtbJ2EnLCAnYicsICdjJ11dLCBlc2NhcGVjaGFyPSdcXCcpCiAgICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJ2EsYlxcLGMnXSwgW1snYScsICdiLGMnXV0sIGVzY2FwZWNoYXI9J1xcJykKQEAgLTYyMSw2ICs2MzAsMjMgQEAKICAgICAgICAgZmlsZW9iaiA9IFN0cmluZ0lPKCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YuRGljdFdyaXRlciwgZmlsZW9iaikKIAorICAgIGRlZiB0ZXN0X3dyaXRlX2ZpZWxkc19ub3RfaW5fZmllbGRuYW1lcyhzZWxmKToKKyAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdyaXRlciA9IGNzdi5EaWN0V3JpdGVyKGZpbGVvYmosIGZpZWxkbmFtZXMgPSBbImYxIiwgImYyIiwgImYzIl0pCisgICAgICAgICAgICAjIE9mIHNwZWNpYWwgbm90ZSBpcyB0aGUgbm9uLXN0cmluZyBrZXkgKGlzc3VlIDE5NDQ5KQorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKSBhcyBjeDoKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coeyJmNCI6IDEwLCAiZjIiOiAic3BhbSIsIDE6ICJhYmMifSkKKyAgICAgICAgICAgIGV4Y2VwdGlvbiA9IHN0cihjeC5leGNlcHRpb24pCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJmaWVsZG5hbWVzIiwgZXhjZXB0aW9uKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigiJ2Y0JyIsIGV4Y2VwdGlvbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oIidmMiciLCBleGNlcHRpb24pCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCIxIiwgZXhjZXB0aW9uKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCisgICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKKwogICAgIGRlZiB0ZXN0X3JlYWRfZGljdF9maWVsZHMoc2VsZik6CiAgICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCiAgICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQpAQCAtODQ0LDYgKzg3MCw3IEBACiAgICAgICAgICAgICBsaW5ldGVybWluYXRvciA9ICdcclxuJwogICAgICAgICAgICAgcXVvdGluZyA9IGNzdi5RVU9URV9OT05FCiAgICAgICAgIGQgPSBteWRpYWxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQucXVvdGluZywgY3N2LlFVT1RFX05PTkUpCiAKICAgICAgICAgbXlkaWFsZWN0LnF1b3RpbmcgPSBOb25lCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgbXlkaWFsZWN0KQpAQCAtODUyLDEyICs4NzksMjEgQEAKICAgICAgICAgbXlkaWFsZWN0LnF1b3RpbmcgPSBjc3YuUVVPVEVfQUxMCiAgICAgICAgIG15ZGlhbGVjdC5xdW90ZWNoYXIgPSAnIicKICAgICAgICAgZCA9IG15ZGlhbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5xdW90aW5nLCBjc3YuUVVPVEVfQUxMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQucXVvdGVjaGFyLCAnIicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLmRvdWJsZXF1b3RlKQogCiAgICAgICAgIG15ZGlhbGVjdC5xdW90ZWNoYXIgPSAiJyciCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgbXlkaWFsZWN0KQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvcikgYXMgY206CisgICAgICAgICAgICBteWRpYWxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICcicXVvdGVjaGFyIiBtdXN0IGJlIGFuIDEtY2hhcmFjdGVyIHN0cmluZycpCiAKICAgICAgICAgbXlkaWFsZWN0LnF1b3RlY2hhciA9IDQKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBteWRpYWxlY3QpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yKSBhcyBjbToKKyAgICAgICAgICAgIG15ZGlhbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNtLmV4Y2VwdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgJyJxdW90ZWNoYXIiIG11c3QgYmUgc3RyaW5nLCBub3QgaW50JykKIAogICAgIGRlZiB0ZXN0X2RlbGltaXRlcihzZWxmKToKICAgICAgICAgY2xhc3MgbXlkaWFsZWN0KGNzdi5EaWFsZWN0KToKQEAgLTg2OCwxMiArOTA0LDMxIEBACiAgICAgICAgICAgICBsaW5ldGVybWluYXRvciA9ICdcclxuJwogICAgICAgICAgICAgcXVvdGluZyA9IGNzdi5RVU9URV9OT05FCiAgICAgICAgIGQgPSBteWRpYWxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZGVsaW1pdGVyLCAiOyIpCiAKICAgICAgICAgbXlkaWFsZWN0LmRlbGltaXRlciA9ICI6OjoiCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgbXlkaWFsZWN0KQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvcikgYXMgY206CisgICAgICAgICAgICBteWRpYWxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICciZGVsaW1pdGVyIiBtdXN0IGJlIGFuIDEtY2hhcmFjdGVyIHN0cmluZycpCisKKyAgICAgICAgbXlkaWFsZWN0LmRlbGltaXRlciA9ICIiCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yKSBhcyBjbToKKyAgICAgICAgICAgIG15ZGlhbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNtLmV4Y2VwdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgJyJkZWxpbWl0ZXIiIG11c3QgYmUgYW4gMS1jaGFyYWN0ZXIgc3RyaW5nJykKKworICAgICAgICBteWRpYWxlY3QuZGVsaW1pdGVyID0gdSIsIgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvcikgYXMgY206CisgICAgICAgICAgICBteWRpYWxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICciZGVsaW1pdGVyIiBtdXN0IGJlIHN0cmluZywgbm90IHVuaWNvZGUnKQogCiAgICAgICAgIG15ZGlhbGVjdC5kZWxpbWl0ZXIgPSA0Ci0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgbXlkaWFsZWN0KQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvcikgYXMgY206CisgICAgICAgICAgICBteWRpYWxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICciZGVsaW1pdGVyIiBtdXN0IGJlIHN0cmluZywgbm90IGludCcpCiAKICAgICBkZWYgdGVzdF9saW5ldGVybWluYXRvcihzZWxmKToKICAgICAgICAgY2xhc3MgbXlkaWFsZWN0KGNzdi5EaWFsZWN0KToKQEAgLTg4NCwxMiArOTM5LDE3IEBACiAgICAgICAgICAgICBsaW5ldGVybWluYXRvciA9ICdcclxuJwogICAgICAgICAgICAgcXVvdGluZyA9IGNzdi5RVU9URV9OT05FCiAgICAgICAgIGQgPSBteWRpYWxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQubGluZXRlcm1pbmF0b3IsICdcclxuJykKIAogICAgICAgICBteWRpYWxlY3QubGluZXRlcm1pbmF0b3IgPSAiOjo6IgogICAgICAgICBkID0gbXlkaWFsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmxpbmV0ZXJtaW5hdG9yLCAiOjo6IikKIAogICAgICAgICBteWRpYWxlY3QubGluZXRlcm1pbmF0b3IgPSA0Ci0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgbXlkaWFsZWN0KQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvcikgYXMgY206CisgICAgICAgICAgICBteWRpYWxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICcibGluZXRlcm1pbmF0b3IiIG11c3QgYmUgYSBzdHJpbmcnKQogCiAKIGNsYXNzIFRlc3RTbmlmZmVyKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTkwNSw3ICs5NjUsNyBAQAogJ1RvbW15JydzIFBsYWNlJzonQmx1ZSBJc2xhbmQnOidJTCc6JzEyLzI4LzAyJzonQmx1ZSBTdW5kYXkvV2hpdGUgQ3JvdycKICdTdG9uZWN1dHRlcnMgJydTZWFmb29kJycgYW5kIENob3AgSG91c2UnOidMZW1vbnQnOidJTCc6JzEyLzE5LzAyJzonV2VlayBCYWNrJwogIiIiCi0gICAgaGVhZGVyID0gJycnXAorICAgIGhlYWRlcjEgPSAnJydcCiAidmVudWUiLCJjaXR5Iiwic3RhdGUiLCJkYXRlIiwicGVyZm9ybWVycyIKICcnJwogICAgIHNhbXBsZTMgPSAnJydcCkBAIC05MjQsMTAgKzk4NCwzNSBAQAogICAgIHNhbXBsZTYgPSAiYXxifGNcclxuZHxlfGZcclxuIgogICAgIHNhbXBsZTcgPSAiJ2EnfCdiJ3wnYydcclxuJ2QnfGV8ZlxyXG4iCiAKKyMgSXNzdWUgMTgxNTU6IFVzZSBhIGRlbGltaXRlciB0aGF0IGlzIGEgc3BlY2lhbCBjaGFyIHRvIHJlZ2V4OgorCisgICAgaGVhZGVyMiA9ICcnJ1wKKyJ2ZW51ZSIrImNpdHkiKyJzdGF0ZSIrImRhdGUiKyJwZXJmb3JtZXJzIgorJycnCisgICAgc2FtcGxlOCA9ICIiIlwKK0hhcnJ5J3MrIEFybGluZ3RvbiBIZWlnaHRzKyBJTCsgMi8xLzAzKyBLaW1pIEhheWVzCitTaGFyayBDaXR5KyBHbGVuZGFsZSBIZWlnaHRzKyBJTCsgMTIvMjgvMDIrIFByZXplbmNlCitUb21teSdzIFBsYWNlKyBCbHVlIElzbGFuZCsgSUwrIDEyLzI4LzAyKyBCbHVlIFN1bmRheS9XaGl0ZSBDcm93CitTdG9uZWN1dHRlcnMgU2VhZm9vZCBhbmQgQ2hvcCBIb3VzZSsgTGVtb250KyBJTCsgMTIvMTkvMDIrIFdlZWsgQmFjaworIiIiCisgICAgc2FtcGxlOSA9ICIiIlwKKydIYXJyeScncycrIEFybGluZ3RvbiBIZWlnaHRzJysgJ0lMJysgJzIvMS8wMycrICdLaW1pIEhheWVzJworJ1NoYXJrIENpdHknKyBHbGVuZGFsZSBIZWlnaHRzJysnIElMJysgJzEyLzI4LzAyJysgJ1ByZXplbmNlJworJ1RvbW15JydzIFBsYWNlJysgQmx1ZSBJc2xhbmQnKyAnSUwnKyAnMTIvMjgvMDInKyAnQmx1ZSBTdW5kYXkvV2hpdGUgQ3JvdycKKydTdG9uZWN1dHRlcnMgJydTZWFmb29kJycgYW5kIENob3AgSG91c2UnKyAnTGVtb250JysgJ0lMJysgJzEyLzE5LzAyJysgJ1dlZWsgQmFjaycKKyIiIgorCiAgICAgZGVmIHRlc3RfaGFzX2hlYWRlcihzZWxmKToKICAgICAgICAgc25pZmZlciA9IGNzdi5TbmlmZmVyKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbmlmZmVyLmhhc19oZWFkZXIoc2VsZi5zYW1wbGUxKSwgRmFsc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc25pZmZlci5oYXNfaGVhZGVyKHNlbGYuaGVhZGVyK3NlbGYuc2FtcGxlMSksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc25pZmZlci5oYXNfaGVhZGVyKHNlbGYuaGVhZGVyMSArIHNlbGYuc2FtcGxlMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X2hhc19oZWFkZXJfcmVnZXhfc3BlY2lhbF9kZWxpbWl0ZXIoc2VsZik6CisgICAgICAgIHNuaWZmZXIgPSBjc3YuU25pZmZlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc25pZmZlci5oYXNfaGVhZGVyKHNlbGYuc2FtcGxlOCksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNuaWZmZXIuaGFzX2hlYWRlcihzZWxmLmhlYWRlcjIgKyBzZWxmLnNhbXBsZTgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRydWUpCiAKICAgICBkZWYgdGVzdF9zbmlmZihzZWxmKToKICAgICAgICAgc25pZmZlciA9IGNzdi5TbmlmZmVyKCkKQEAgLTk2MSw4NiArMTA0Niw5NiBAQAogICAgICAgICBkaWFsZWN0ID0gc25pZmZlci5zbmlmZihzZWxmLnNhbXBsZTcpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5kZWxpbWl0ZXIsICJ8IikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsZWN0LnF1b3RlY2hhciwgIiciKQorICAgICAgICBkaWFsZWN0ID0gc25pZmZlci5zbmlmZihzZWxmLnNhbXBsZTgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5kZWxpbWl0ZXIsICcrJykKKyAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5zYW1wbGU5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxlY3QuZGVsaW1pdGVyLCAnKycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5xdW90ZWNoYXIsICInIikKIAogICAgIGRlZiB0ZXN0X2RvdWJsZXF1b3RlKHNlbGYpOgogICAgICAgICBzbmlmZmVyID0gY3N2LlNuaWZmZXIoKQotICAgICAgICBkaWFsZWN0ID0gc25pZmZlci5zbmlmZihzZWxmLmhlYWRlcikKKyAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5oZWFkZXIxKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGRpYWxlY3QuZG91YmxlcXVvdGUpCisgICAgICAgIGRpYWxlY3QgPSBzbmlmZmVyLnNuaWZmKHNlbGYuaGVhZGVyMikKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShkaWFsZWN0LmRvdWJsZXF1b3RlKQogICAgICAgICBkaWFsZWN0ID0gc25pZmZlci5zbmlmZihzZWxmLnNhbXBsZTIpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaWFsZWN0LmRvdWJsZXF1b3RlKQorICAgICAgICBkaWFsZWN0ID0gc25pZmZlci5zbmlmZihzZWxmLnNhbXBsZTgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZGlhbGVjdC5kb3VibGVxdW90ZSkKKyAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5zYW1wbGU5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGlhbGVjdC5kb3VibGVxdW90ZSkKIAotaWYgbm90IGhhc2F0dHIoc3lzLCAiZ2V0dG90YWxyZWZjb3VudCIpOgotICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOiBwcmludCAiKioqIHNraXBwaW5nIGxlYWthZ2UgdGVzdHMgKioqIgotZWxzZToKLSAgICBjbGFzcyBOVUw6Ci0gICAgICAgIGRlZiB3cml0ZShzLCAqYXJncyk6Ci0gICAgICAgICAgICBwYXNzCi0gICAgICAgIHdyaXRlbGluZXMgPSB3cml0ZQorY2xhc3MgTlVMOgorICAgIGRlZiB3cml0ZShzLCAqYXJncyk6CisgICAgICAgIHBhc3MKKyAgICB3cml0ZWxpbmVzID0gd3JpdGUKIAotICAgIGNsYXNzIFRlc3RMZWFrcyh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgICAgIGRlZiB0ZXN0X2NyZWF0ZV9yZWFkKHNlbGYpOgotICAgICAgICAgICAgZGVsdGEgPSAwCi0gICAgICAgICAgICBsYXN0cmMgPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCi0gICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMjApOgotICAgICAgICAgICAgICAgIGdjLmNvbGxlY3QoKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2MuZ2FyYmFnZSwgW10pCi0gICAgICAgICAgICAgICAgcmMgPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCi0gICAgICAgICAgICAgICAgY3N2LnJlYWRlcihbImEsYixjXHJcbiJdKQotICAgICAgICAgICAgICAgIGNzdi5yZWFkZXIoWyJhLGIsY1xyXG4iXSkKLSAgICAgICAgICAgICAgICBjc3YucmVhZGVyKFsiYSxiLGNcclxuIl0pCi0gICAgICAgICAgICAgICAgZGVsdGEgPSByYy1sYXN0cmMKLSAgICAgICAgICAgICAgICBsYXN0cmMgPSByYwotICAgICAgICAgICAgIyBpZiBjc3YucmVhZGVyKCkgbGVha3MsIGxhc3QgZGVsdGEgc2hvdWxkIGJlIDMgb3IgbW9yZQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWx0YSA8IDMsIFRydWUpCitAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKHN5cywgImdldHRvdGFscmVmY291bnQiKSwKKyAgICAgICAgICAgICAgICAgICAgICdyZXF1aXJlcyBzeXMuZ2V0dG90YWxyZWZjb3VudCgpJykKK2NsYXNzIFRlc3RMZWFrcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfY3JlYXRlX3JlYWQoc2VsZik6CisgICAgICAgIGRlbHRhID0gMAorICAgICAgICBsYXN0cmMgPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgyMCk6CisgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2MuZ2FyYmFnZSwgW10pCisgICAgICAgICAgICByYyA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgICAgIGNzdi5yZWFkZXIoWyJhLGIsY1xyXG4iXSkKKyAgICAgICAgICAgIGNzdi5yZWFkZXIoWyJhLGIsY1xyXG4iXSkKKyAgICAgICAgICAgIGNzdi5yZWFkZXIoWyJhLGIsY1xyXG4iXSkKKyAgICAgICAgICAgIGRlbHRhID0gcmMtbGFzdHJjCisgICAgICAgICAgICBsYXN0cmMgPSByYworICAgICAgICAjIGlmIGNzdi5yZWFkZXIoKSBsZWFrcywgbGFzdCBkZWx0YSBzaG91bGQgYmUgMyBvciBtb3JlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVsdGEgPCAzLCBUcnVlKQogCi0gICAgICAgIGRlZiB0ZXN0X2NyZWF0ZV93cml0ZShzZWxmKToKLSAgICAgICAgICAgIGRlbHRhID0gMAotICAgICAgICAgICAgbGFzdHJjID0gc3lzLmdldHRvdGFscmVmY291bnQoKQotICAgICAgICAgICAgcyA9IE5VTCgpCi0gICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMjApOgotICAgICAgICAgICAgICAgIGdjLmNvbGxlY3QoKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2MuZ2FyYmFnZSwgW10pCi0gICAgICAgICAgICAgICAgcmMgPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCi0gICAgICAgICAgICAgICAgY3N2LndyaXRlcihzKQotICAgICAgICAgICAgICAgIGNzdi53cml0ZXIocykKLSAgICAgICAgICAgICAgICBjc3Yud3JpdGVyKHMpCi0gICAgICAgICAgICAgICAgZGVsdGEgPSByYy1sYXN0cmMKLSAgICAgICAgICAgICAgICBsYXN0cmMgPSByYwotICAgICAgICAgICAgIyBpZiBjc3Yud3JpdGVyKCkgbGVha3MsIGxhc3QgZGVsdGEgc2hvdWxkIGJlIDMgb3IgbW9yZQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWx0YSA8IDMsIFRydWUpCisgICAgZGVmIHRlc3RfY3JlYXRlX3dyaXRlKHNlbGYpOgorICAgICAgICBkZWx0YSA9IDAKKyAgICAgICAgbGFzdHJjID0gc3lzLmdldHRvdGFscmVmY291bnQoKQorICAgICAgICBzID0gTlVMKCkKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDIwKToKKyAgICAgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnYy5nYXJiYWdlLCBbXSkKKyAgICAgICAgICAgIHJjID0gc3lzLmdldHRvdGFscmVmY291bnQoKQorICAgICAgICAgICAgY3N2LndyaXRlcihzKQorICAgICAgICAgICAgY3N2LndyaXRlcihzKQorICAgICAgICAgICAgY3N2LndyaXRlcihzKQorICAgICAgICAgICAgZGVsdGEgPSByYy1sYXN0cmMKKyAgICAgICAgICAgIGxhc3RyYyA9IHJjCisgICAgICAgICMgaWYgY3N2LndyaXRlcigpIGxlYWtzLCBsYXN0IGRlbHRhIHNob3VsZCBiZSAzIG9yIG1vcmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWx0YSA8IDMsIFRydWUpCiAKLSAgICAgICAgZGVmIHRlc3RfcmVhZChzZWxmKToKLSAgICAgICAgICAgIGRlbHRhID0gMAotICAgICAgICAgICAgcm93cyA9IFsiYSxiLGNcclxuIl0qNQotICAgICAgICAgICAgbGFzdHJjID0gc3lzLmdldHRvdGFscmVmY291bnQoKQotICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDIwKToKLSAgICAgICAgICAgICAgICBnYy5jb2xsZWN0KCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdjLmdhcmJhZ2UsIFtdKQotICAgICAgICAgICAgICAgIHJjID0gc3lzLmdldHRvdGFscmVmY291bnQoKQotICAgICAgICAgICAgICAgIHJkciA9IGNzdi5yZWFkZXIocm93cykKLSAgICAgICAgICAgICAgICBmb3Igcm93IGluIHJkcjoKLSAgICAgICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgICAgIGRlbHRhID0gcmMtbGFzdHJjCi0gICAgICAgICAgICAgICAgbGFzdHJjID0gcmMKLSAgICAgICAgICAgICMgaWYgcmVhZGVyIGxlYWtzIGR1cmluZyByZWFkLCBkZWx0YSBzaG91bGQgYmUgNSBvciBtb3JlCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlbHRhIDwgNSwgVHJ1ZSkKKyAgICBkZWYgdGVzdF9yZWFkKHNlbGYpOgorICAgICAgICBkZWx0YSA9IDAKKyAgICAgICAgcm93cyA9IFsiYSxiLGNcclxuIl0qNQorICAgICAgICBsYXN0cmMgPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgyMCk6CisgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2MuZ2FyYmFnZSwgW10pCisgICAgICAgICAgICByYyA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgICAgIHJkciA9IGNzdi5yZWFkZXIocm93cykKKyAgICAgICAgICAgIGZvciByb3cgaW4gcmRyOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGRlbHRhID0gcmMtbGFzdHJjCisgICAgICAgICAgICBsYXN0cmMgPSByYworICAgICAgICAjIGlmIHJlYWRlciBsZWFrcyBkdXJpbmcgcmVhZCwgZGVsdGEgc2hvdWxkIGJlIDUgb3IgbW9yZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlbHRhIDwgNSwgVHJ1ZSkKIAotICAgICAgICBkZWYgdGVzdF93cml0ZShzZWxmKToKLSAgICAgICAgICAgIGRlbHRhID0gMAotICAgICAgICAgICAgcm93cyA9IFtbMSwyLDNdXSo1Ci0gICAgICAgICAgICBzID0gTlVMKCkKLSAgICAgICAgICAgIGxhc3RyYyA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKLSAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSgyMCk6Ci0gICAgICAgICAgICAgICAgZ2MuY29sbGVjdCgpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnYy5nYXJiYWdlLCBbXSkKLSAgICAgICAgICAgICAgICByYyA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKLSAgICAgICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKHMpCi0gICAgICAgICAgICAgICAgZm9yIHJvdyBpbiByb3dzOgotICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3cocm93KQotICAgICAgICAgICAgICAgIGRlbHRhID0gcmMtbGFzdHJjCi0gICAgICAgICAgICAgICAgbGFzdHJjID0gcmMKLSAgICAgICAgICAgICMgaWYgd3JpdGVyIGxlYWtzIGR1cmluZyB3cml0ZSwgbGFzdCBkZWx0YSBzaG91bGQgYmUgNSBvciBtb3JlCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlbHRhIDwgNSwgVHJ1ZSkKKyAgICBkZWYgdGVzdF93cml0ZShzZWxmKToKKyAgICAgICAgZGVsdGEgPSAwCisgICAgICAgIHJvd3MgPSBbWzEsMiwzXV0qNQorICAgICAgICBzID0gTlVMKCkKKyAgICAgICAgbGFzdHJjID0gc3lzLmdldHRvdGFscmVmY291bnQoKQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMjApOgorICAgICAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdjLmdhcmJhZ2UsIFtdKQorICAgICAgICAgICAgcmMgPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCisgICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKHMpCisgICAgICAgICAgICBmb3Igcm93IGluIHJvd3M6CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KHJvdykKKyAgICAgICAgICAgIGRlbHRhID0gcmMtbGFzdHJjCisgICAgICAgICAgICBsYXN0cmMgPSByYworICAgICAgICAjIGlmIHdyaXRlciBsZWFrcyBkdXJpbmcgd3JpdGUsIGxhc3QgZGVsdGEgc2hvdWxkIGJlIDUgb3IgbW9yZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlbHRhIDwgNSwgVHJ1ZSkKIAogIyBjb21tZW50ZWQgb3V0IGZvciBub3cgLSBjc3YgbW9kdWxlIGRvZXNuJ3QgeWV0IHN1cHBvcnQgVW5pY29kZQogIyMgY2xhc3MgVGVzdFVuaWNvZGUodW5pdHRlc3QuVGVzdENhc2UpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jdXJzZXMucHkgYi9MaWIvdGVzdC90ZXN0X2N1cnNlcy5weQppbmRleCBmYTBkNDY5Li5mY2Y5NjE4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2N1cnNlcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2N1cnNlcy5weQpAQCAtMjUwLDYgKzI1MCwyNiBAQAogICAgIGV4Y2VwdCBjdXJzZXMucGFuZWwuZXJyb3I6CiAgICAgICAgIHBhc3MKIAorZGVmIHRlc3RfdXNlcnB0cl9tZW1vcnlfbGVhayhzdGRzY3IpOgorICAgIHcgPSBjdXJzZXMubmV3d2luKDEwLCAxMCkKKyAgICBwID0gY3Vyc2VzLnBhbmVsLm5ld19wYW5lbCh3KQorICAgIG9iaiA9IG9iamVjdCgpCisgICAgbnJlZnMgPSBzeXMuZ2V0cmVmY291bnQob2JqKQorICAgIGZvciBpIGluIHJhbmdlKDEwMCk6CisgICAgICAgIHAuc2V0X3VzZXJwdHIob2JqKQorCisgICAgcC5zZXRfdXNlcnB0cihOb25lKQorICAgIGlmIHN5cy5nZXRyZWZjb3VudChvYmopICE9IG5yZWZzOgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJzZXRfdXNlcnB0ciBsZWFrZWQgcmVmZXJlbmNlcyIKKworZGVmIHRlc3RfdXNlcnB0cl9zZWdmYXVsdChzdGRzY3IpOgorICAgIHBhbmVsID0gY3Vyc2VzLnBhbmVsLm5ld19wYW5lbChzdGRzY3IpCisgICAgY2xhc3MgQToKKyAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICAgICBwYW5lbC5zZXRfdXNlcnB0cihOb25lKQorICAgIHBhbmVsLnNldF91c2VycHRyKEEoKSkKKyAgICBwYW5lbC5zZXRfdXNlcnB0cihOb25lKQorCiBkZWYgdGVzdF9yZXNpemVfdGVybShzdGRzY3IpOgogICAgIGlmIGhhc2F0dHIoY3Vyc2VzLCAncmVzaXpldGVybScpOgogICAgICAgICBsaW5lcywgY29scyA9IGN1cnNlcy5MSU5FUywgY3Vyc2VzLkNPTFMKQEAgLTI2OCw2ICsyODgsOCBAQAogICAgICAgICBtb2R1bGVfZnVuY3Moc3Rkc2NyKQogICAgICAgICB3aW5kb3dfZnVuY3Moc3Rkc2NyKQogICAgICAgICB0ZXN0X3VzZXJwdHJfd2l0aG91dF9zZXQoc3Rkc2NyKQorICAgICAgICB0ZXN0X3VzZXJwdHJfbWVtb3J5X2xlYWsoc3Rkc2NyKQorICAgICAgICB0ZXN0X3VzZXJwdHJfc2VnZmF1bHQoc3Rkc2NyKQogICAgICAgICB0ZXN0X3Jlc2l6ZV90ZXJtKHN0ZHNjcikKICAgICAgICAgdGVzdF9pc3N1ZTYyNDMoc3Rkc2NyKQogICAgIGZpbmFsbHk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RhdGV0aW1lLnB5IGIvTGliL3Rlc3QvdGVzdF9kYXRldGltZS5weQppbmRleCBkMjQ2ZDYwLi43Y2FhNDA4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RhdGV0aW1lLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGF0ZXRpbWUucHkKQEAgLTEwMSwxMSArMTAxLDExIEBACiAgICAgICAgICMgY2Fycnkgbm8gZGF0YSksIGJ1dCB0aGV5IG5lZWQgdG8gYmUgcGlja2xhYmxlIGFueXdheSBlbHNlCiAgICAgICAgICMgY29uY3JldGUgc3ViY2xhc3NlcyBjYW4ndCBiZSBwaWNrbGVkLgogICAgICAgICBvcmlnID0gdHppbmZvLl9fbmV3X18odHppbmZvKQotICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShvcmlnKSBpcyB0emluZm8pCisgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShvcmlnKSwgdHppbmZvKQogICAgICAgICBmb3IgcGlja2xlciwgdW5waWNrbGVyLCBwcm90byBpbiBwaWNrbGVfY2hvaWNlczoKICAgICAgICAgICAgIGdyZWVuID0gcGlja2xlci5kdW1wcyhvcmlnLCBwcm90bykKICAgICAgICAgICAgIGRlcml2ZWQgPSB1bnBpY2tsZXIubG9hZHMoZ3JlZW4pCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShkZXJpdmVkKSBpcyB0emluZm8pCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoZGVyaXZlZCksIHR6aW5mbykKIAogICAgIGRlZiB0ZXN0X3BpY2tsaW5nX3N1YmNsYXNzKHNlbGYpOgogICAgICAgICAjIE1ha2Ugc3VyZSB3ZSBjYW4gcGlja2xlL3VucGlja2xlIGFuIGluc3RhbmNlIG9mIGEgc3ViY2xhc3MuCkBAIC0xMjQsNyArMTI0LDcgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVyaXZlZC50em5hbWUoTm9uZSksICdjb29raWUnKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCYXNlIGNsYXNlIGZvciB0ZXN0aW5nIGEgcGFydGljdWxhciBhc3BlY3Qgb2YgdGltZWRlbHRhLCB0aW1lLCBkYXRlIGFuZAorIyBCYXNlIGNsYXNzIGZvciB0ZXN0aW5nIGEgcGFydGljdWxhciBhc3BlY3Qgb2YgdGltZWRlbHRhLCB0aW1lLCBkYXRlIGFuZAogIyBkYXRldGltZSBjb21wYXJpc29ucy4KIAogY2xhc3MgSGFybWxlc3NNaXhlZENvbXBhcmlzb246CkBAIC0zMjgsOSArMzI4LDkgQEAKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxID09IHQyKQogICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPD0gdDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA+PSB0MikKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSAhPSB0MikKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA8IHQyKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID4gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodDEgIT0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodDEgPCB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0MSA+IHQyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MSwgdDIpLCAwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MiwgdDEpLCAwKQogCkBAIC0zNDIsMTIgKzM0MiwxMiBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQyID49IHQxKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxICE9IHQyKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQyICE9IHQxKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA9PSB0MikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDIgPT0gdDEpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID4gdDIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQyIDwgdDEpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID49IHQyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MiA8PSB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodDEgPT0gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHQyID09IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0MSA+IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0MiA8IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0MSA+PSB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodDIgPD0gdDEpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MSwgdDIpLCAtMSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQyLCB0MSksIDEpCiAKQEAgLTQ1OSw3ICs0NTksNyBAQAogICAgICAgICBzZWxmLmFzc2VydFRydWUodGltZWRlbHRhKDAsIDEpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUodGltZWRlbHRhKDAsIDAsIDEpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUodGltZWRlbHRhKG1pY3Jvc2Vjb25kcz0xKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0aW1lZGVsdGEoMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodGltZWRlbHRhKDApKQogCiAgICAgZGVmIHRlc3Rfc3ViY2xhc3NfdGltZWRlbHRhKHNlbGYpOgogCkBAIC00NzUsMTcgKzQ3NSwxNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiByb3VuZChzdW0pCiAKICAgICAgICAgdDEgPSBUKGRheXM9MSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodDEpIGlzIFQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZSh0MSksIFQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEuYXNfaG91cnMoKSwgMjQpCiAKICAgICAgICAgdDIgPSBUKGRheXM9LTEsIHNlY29uZHM9LTM2MDApCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHQyKSBpcyBUKQorICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUodDIpLCBUKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQyLmFzX2hvdXJzKCksIC0yNSkKIAogICAgICAgICB0MyA9IHQxICsgdDIKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodDMpIGlzIHRpbWVkZWx0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKHQzKSwgdGltZWRlbHRhKQogICAgICAgICB0NCA9IFQuZnJvbV90ZCh0MykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodDQpIGlzIFQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZSh0NCksIFQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDMuZGF5cywgdDQuZGF5cykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0My5zZWNvbmRzLCB0NC5zZWNvbmRzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQzLm1pY3Jvc2Vjb25kcywgdDQubWljcm9zZWNvbmRzKQpAQCAtNzgzLDggKzc4Myw5IEBACiAKICAgICAgICAgIyBJdCB3b3JrZWQgb3IgaXQgZGlkbid0LiAgSWYgaXQgZGlkbid0LCBhc3N1bWUgaXQncyByZWFzb24gIzIsIGFuZAogICAgICAgICAjIGxldCB0aGUgdGVzdCBwYXNzIGlmIHRoZXkncmUgd2l0aGluIGhhbGYgYSBzZWNvbmQgb2YgZWFjaCBvdGhlci4KLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRvZGF5ID09IHRvZGF5YWdhaW4gb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIGFicyh0b2RheWFnYWluIC0gdG9kYXkpIDwgdGltZWRlbHRhKHNlY29uZHM9MC41KSkKKyAgICAgICAgaWYgdG9kYXkgIT0gdG9kYXlhZ2FpbjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwodG9kYXlhZ2FpbiwgdG9kYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhPXRpbWVkZWx0YShzZWNvbmRzPTAuNSkpCiAKICAgICBkZWYgdGVzdF93ZWVrZGF5KHNlbGYpOgogICAgICAgICBmb3IgaSBpbiByYW5nZSg3KToKQEAgLTk3NCw5ICs5NzUsOSBAQAogICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPT0gdDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA8PSB0MikKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxID49IHQyKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxICE9IHQyKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxIDwgdDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPiB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0MSAhPSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0MSA8IHQyKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHQxID4gdDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQxLCB0MiksIDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQyLCB0MSksIDApCiAKQEAgLTk4OCwxMiArOTg5LDEyIEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDIgPj0gdDEpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgIT0gdDIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDIgIT0gdDEpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID09IHQyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MiA9PSB0MSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPiB0MikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDIgPCB0MSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPj0gdDIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQyIDw9IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0MSA9PSB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodDIgPT0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHQxID4gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHQyIDwgdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHQxID49IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0MiA8PSB0MSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQxLCB0MiksIC0xKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDIsIHQxKSwgMSkKIApAQCAtMTQ0NCw5ICsxNDQ1LDkgQEAKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxID09IHQyKQogICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPD0gdDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA+PSB0MikKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSAhPSB0MikKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA8IHQyKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID4gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodDEgIT0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodDEgPCB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0MSA+IHQyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MSwgdDIpLCAwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MiwgdDEpLCAwKQogCkBAIC0xNDYwLDEyICsxNDYxLDEyIEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDIgPj0gdDEpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgIT0gdDIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDIgIT0gdDEpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID09IHQyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MiA9PSB0MSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPiB0MikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDIgPCB0MSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPj0gdDIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQyIDw9IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0MSA9PSB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodDIgPT0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHQxID4gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHQyIDwgdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHQxID49IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0MiA8PSB0MSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQxLCB0MiksIC0xKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDIsIHQxKSwgMSkKIApAQCAtMTU0MSw3ICsxNTQyLDcgQEAKICAgICAgICAgICAgIGlmIGFicyhmcm9tX3RpbWVzdGFtcCAtIGZyb21fbm93KSA8PSB0b2xlcmFuY2U6CiAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICMgRWxzZSB0cnkgYWdhaW4gYSBmZXcgdGltZXMuCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhYnMoZnJvbV90aW1lc3RhbXAgLSBmcm9tX25vdykgPD0gdG9sZXJhbmNlKQorICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbChhYnMoZnJvbV90aW1lc3RhbXAgLSBmcm9tX25vdyksIHRvbGVyYW5jZSkKIAogICAgIGRlZiB0ZXN0X3N0cnB0aW1lKHNlbGYpOgogICAgICAgICBpbXBvcnQgX3N0cnB0aW1lCkBAIC0xNzI3LDkgKzE3MjgsOSBAQAogICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPT0gdDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA8PSB0MikKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxID49IHQyKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxICE9IHQyKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxIDwgdDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPiB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0MSAhPSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0MSA8IHQyKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHQxID4gdDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQxLCB0MiksIDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQyLCB0MSksIDApCiAKQEAgLTE3NDMsMTIgKzE3NDQsMTIgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MiA+PSB0MSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSAhPSB0MikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MiAhPSB0MSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPT0gdDIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQyID09IHQxKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA+IHQyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MiA8IHQxKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA+PSB0MikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDIgPD0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHQxID09IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0MiA9PSB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodDEgPiB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodDIgPCB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodDEgPj0gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHQyIDw9IHQxKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDEsIHQyKSwgLTEpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MiwgdDEpLCAxKQogCkBAIC0xOTI4LDggKzE5MjksOCBAQAogICAgICAgICBzZWxmLmFzc2VydFRydWUoY2xzKDAsIDEpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUoY2xzKDAsIDAsIDEpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUoY2xzKDAsIDAsIDAsIDEpKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGNscygwKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjbHMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjbHMoMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY2xzKCkpCiAKICAgICBkZWYgdGVzdF9yZXBsYWNlKHNlbGYpOgogICAgICAgICBjbHMgPSBzZWxmLnRoZWNsYXNzCkBAIC0yMDI2LDcgKzIwMjcsNyBAQAogICAgICAgICAgICAgZGVmIHV0Y29mZnNldChzZWxmLCBkdCk6IHBhc3MKICAgICAgICAgYiA9IEJldHRlclRyeSgpCiAgICAgICAgIHQgPSBjbHMoMSwgMSwgMSwgdHppbmZvPWIpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0LnR6aW5mbyBpcyBiKQorICAgICAgICBzZWxmLmFzc2VydElzKHQudHppbmZvLCBiKQogCiAgICAgZGVmIHRlc3RfdXRjX29mZnNldF9vdXRfb2ZfYm91bmRzKHNlbGYpOgogICAgICAgICBjbGFzcyBFZGd5KHR6aW5mbyk6CkBAIC0yMDY1LDkgKzIwNjYsOSBAQAogICAgICAgICBmb3IgdCBpbiAoY2xzKDEsIDEsIDEpLAogICAgICAgICAgICAgICAgICAgY2xzKDEsIDEsIDEsIHR6aW5mbz1Ob25lKSwKICAgICAgICAgICAgICAgICAgIGNscygxLCAxLCAxLCB0emluZm89QzEoKSkpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQudXRjb2Zmc2V0KCkgaXMgTm9uZSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0LmRzdCgpIGlzIE5vbmUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodC50em5hbWUoKSBpcyBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUodC51dGNvZmZzZXQoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHQuZHN0KCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZSh0LnR6bmFtZSgpKQogCiAgICAgICAgIGNsYXNzIEMzKHR6aW5mbyk6CiAgICAgICAgICAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KTogcmV0dXJuIHRpbWVkZWx0YShtaW51dGVzPS0xNDM5KQpAQCAtMjE2MSw3ICsyMTYyLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lm1pbnV0ZSwgMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnNlY29uZCwgMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lm1pY3Jvc2Vjb25kLCAwKQotICAgICAgICBzZWxmLmFzc2VydFRydWUodC50emluZm8gaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUodC50emluZm8pCiAKICAgICBkZWYgdGVzdF96b25lcyhzZWxmKToKICAgICAgICAgZXN0ID0gRml4ZWRPZmZzZXQoLTMwMCwgIkVTVCIsIDEpCkBAIC0yMTc2LDI1ICsyMTc3LDI1IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEudHppbmZvLCBlc3QpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDIudHppbmZvLCB1dGMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDMudHppbmZvLCBtZXQpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0NC50emluZm8gaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUodDQudHppbmZvKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQ1LnR6aW5mbywgdXRjKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEudXRjb2Zmc2V0KCksIHRpbWVkZWx0YShtaW51dGVzPS0zMDApKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQyLnV0Y29mZnNldCgpLCB0aW1lZGVsdGEobWludXRlcz0wKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0My51dGNvZmZzZXQoKSwgdGltZWRlbHRhKG1pbnV0ZXM9NjApKQotICAgICAgICBzZWxmLmFzc2VydFRydWUodDQudXRjb2Zmc2V0KCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUodDQudXRjb2Zmc2V0KCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdDEudXRjb2Zmc2V0LCAibm8gYXJncyIpCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MS50em5hbWUoKSwgIkVTVCIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDIudHpuYW1lKCksICJVVEMiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQzLnR6bmFtZSgpLCAiTUVUIikKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQ0LnR6bmFtZSgpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHQ0LnR6bmFtZSgpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQxLnR6bmFtZSwgIm5vIGFyZ3MiKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEuZHN0KCksIHRpbWVkZWx0YShtaW51dGVzPTEpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQyLmRzdCgpLCB0aW1lZGVsdGEobWludXRlcz0tMikpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDMuZHN0KCksIHRpbWVkZWx0YShtaW51dGVzPTMpKQotICAgICAgICBzZWxmLmFzc2VydFRydWUodDQuZHN0KCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUodDQuZHN0KCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdDEuZHN0LCAibm8gYXJncyIpCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKHQxKSwgaGFzaCh0MikpCkBAIC0yMjg1LDEwICsyMjg2LDEwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0KQogCiAgICAgICAgIHQgPSBjbHMoNSwgdHppbmZvPUZpeGVkT2Zmc2V0KDMwMCwgIiIpKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodCkKIAogICAgICAgICB0ID0gY2xzKDIzLCA1OSwgdHppbmZvPUZpeGVkT2Zmc2V0KDIzKjYwICsgNTksICIiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHQpCiAKICAgICAgICAgIyBNb3N0bHkgZW5zdXJpbmcgdGhpcyBkb2Vzbid0IG92ZXJmbG93IGludGVybmFsbHkuCiAgICAgICAgIHQgPSBjbHMoMCwgdHppbmZvPUZpeGVkT2Zmc2V0KDIzKjYwICsgNTksICIiKSkKQEAgLTIzMjYsMTMgKzIzMjcsMTMgQEAKICAgICAgICAgIyBFbnN1cmUgd2UgY2FuIGdldCByaWQgb2YgYSB0emluZm8uCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZS50em5hbWUoKSwgIisxMDAiKQogICAgICAgICBiYXNlMiA9IGJhc2UucmVwbGFjZSh0emluZm89Tm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJhc2UyLnR6aW5mbyBpcyBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoYmFzZTIudHpuYW1lKCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoYmFzZTIudHppbmZvKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShiYXNlMi50em5hbWUoKSkKIAogICAgICAgICAjIEVuc3VyZSB3ZSBjYW4gYWRkIG9uZS4KICAgICAgICAgYmFzZTMgPSBiYXNlMi5yZXBsYWNlKHR6aW5mbz16MTAwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhc2UsIGJhc2UzKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoYmFzZS50emluZm8gaXMgYmFzZTMudHppbmZvKQorICAgICAgICBzZWxmLmFzc2VydElzKGJhc2UudHppbmZvLCBiYXNlMy50emluZm8pCiAKICAgICAgICAgIyBPdXQgb2YgYm91bmRzLgogICAgICAgICBiYXNlID0gY2xzKDEpCkBAIC0yNTY3LDcgKzI1NjgsNyBAQAogICAgICAgICB0ejU1ID0gRml4ZWRPZmZzZXQoLTMzMCwgIndlc3QgNTozMCIpCiAgICAgICAgIHRpbWVhd2FyZSA9IG5vdy50aW1lKCkucmVwbGFjZSh0emluZm89dHo1NSkKICAgICAgICAgbm93YXdhcmUgPSBzZWxmLnRoZWNsYXNzLmNvbWJpbmUobm93LmRhdGUoKSwgdGltZWF3YXJlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm93YXdhcmUudHppbmZvIGlzIHR6NTUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMobm93YXdhcmUudHppbmZvLCB0ejU1KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5vd2F3YXJlLnRpbWV0eigpLCB0aW1lYXdhcmUpCiAKICAgICAgICAgIyBDYW4ndCBtaXggYXdhcmUgYW5kIG5vbi1hd2FyZS4KQEAgLTI1ODYsMTUgKzI1ODcsMTUgQEAKICAgICAgICAgIyBBZGRpbmcgYSBkZWx0YSBzaG91bGQgcHJlc2VydmUgdHppbmZvLgogICAgICAgICBkZWx0YSA9IHRpbWVkZWx0YSh3ZWVrcz0xLCBtaW51dGVzPTEyLCBtaWNyb3NlY29uZHM9NTY3OCkKICAgICAgICAgbm93YXdhcmVwbHVzID0gbm93YXdhcmUgKyBkZWx0YQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm93YXdhcmUudHppbmZvIGlzIHR6NTUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMobm93YXdhcmUudHppbmZvLCB0ejU1KQogICAgICAgICBub3dhd2FyZXBsdXMyID0gZGVsdGEgKyBub3dhd2FyZQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm93YXdhcmVwbHVzMi50emluZm8gaXMgdHo1NSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhub3dhd2FyZXBsdXMyLnR6aW5mbywgdHo1NSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3dhd2FyZXBsdXMsIG5vd2F3YXJlcGx1czIpCiAKICAgICAgICAgIyB0aGF0IC0gZGVsdGEgc2hvdWxkIGJlIHdoYXQgd2Ugc3RhcnRlZCB3aXRoLCBhbmQgdGhhdCAtIHdoYXQgd2UKICAgICAgICAgIyBzdGFydGVkIHdpdGggc2hvdWxkIGJlIGRlbHRhLgogICAgICAgICBkaWZmID0gbm93YXdhcmVwbHVzIC0gZGVsdGEKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpZmYudHppbmZvIGlzIHR6NTUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZGlmZi50emluZm8sIHR6NTUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm93YXdhcmUsIGRpZmYpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBkZWx0YSAtIG5vd2F3YXJlcGx1cykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3dhd2FyZXBsdXMgLSBub3dhd2FyZSwgZGVsdGEpCkBAIC0yNjAzLDcgKzI2MDQsNyBAQAogICAgICAgICB0enIgPSBGaXhlZE9mZnNldChyYW5kb20ucmFuZHJhbmdlKC0xNDM5LCAxNDQwKSwgInJhbmRvbXRpbWV6b25lIikKICAgICAgICAgIyBBdHRhY2ggaXQgdG8gbm93YXdhcmVwbHVzLgogICAgICAgICBub3dhd2FyZXBsdXMgPSBub3dhd2FyZXBsdXMucmVwbGFjZSh0emluZm89dHpyKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm93YXdhcmVwbHVzLnR6aW5mbyBpcyB0enIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMobm93YXdhcmVwbHVzLnR6aW5mbywgdHpyKQogICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgZGlmZmVyZW5jZSB0YWtlcyB0aGUgdGltZXpvbmUgYWRqdXN0bWVudHMgaW50byBhY2NvdW50LgogICAgICAgICBnb3QgPSBub3dhd2FyZSAtIG5vd2F3YXJlcGx1cwogICAgICAgICAjIEV4cGVjdGVkOiAgKG5vd2F3YXJlIGJhc2UgLSBub3dhd2FyZSBvZmZzZXQpIC0KQEAgLTI2MzAsNyArMjYzMSw3IEBACiAgICAgICAgIG9mZjQyID0gRml4ZWRPZmZzZXQoNDIsICI0MiIpCiAgICAgICAgIGFub3RoZXIgPSBtZXRoKG9mZjQyKQogICAgICAgICBhZ2FpbiA9IG1ldGgodHo9b2ZmNDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhbm90aGVyLnR6aW5mbyBpcyBhZ2Fpbi50emluZm8pCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoYW5vdGhlci50emluZm8sIGFnYWluLnR6aW5mbykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbm90aGVyLnV0Y29mZnNldCgpLCB0aW1lZGVsdGEobWludXRlcz00MikpCiAgICAgICAgICMgQmFkIGFyZ3VtZW50IHdpdGggYW5kIHcvbyBuYW1pbmcgdGhlIGtleXdvcmQuCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWV0aCwgMTYpCkBAIC0yNjQ3LDcgKzI2NDgsNyBAQAogICAgICAgICB1dGMgPSBGaXhlZE9mZnNldCgwLCAidXRjIiwgMCkKICAgICAgICAgZm9yIGR1bW15IGluIHJhbmdlKDMpOgogICAgICAgICAgICAgbm93ID0gZGF0ZXRpbWUubm93KHdlaXJkdHopCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm93LnR6aW5mbyBpcyB3ZWlyZHR6KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhub3cudHppbmZvLCB3ZWlyZHR6KQogICAgICAgICAgICAgdXRjbm93ID0gZGF0ZXRpbWUudXRjbm93KCkucmVwbGFjZSh0emluZm89dXRjKQogICAgICAgICAgICAgbm93MiA9IHV0Y25vdy5hc3RpbWV6b25lKHdlaXJkdHopCiAgICAgICAgICAgICBpZiBhYnMobm93IC0gbm93MikgPCB0aW1lZGVsdGEoc2Vjb25kcz0zMCk6CkBAIC0yNjY4LDcgKzI2NjksNyBAQAogICAgICAgICBvZmY0MiA9IEZpeGVkT2Zmc2V0KDQyLCAiNDIiKQogICAgICAgICBhbm90aGVyID0gbWV0aCh0cywgb2ZmNDIpCiAgICAgICAgIGFnYWluID0gbWV0aCh0cywgdHo9b2ZmNDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhbm90aGVyLnR6aW5mbyBpcyBhZ2Fpbi50emluZm8pCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoYW5vdGhlci50emluZm8sIGFnYWluLnR6aW5mbykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbm90aGVyLnV0Y29mZnNldCgpLCB0aW1lZGVsdGEobWludXRlcz00MikpCiAgICAgICAgICMgQmFkIGFyZ3VtZW50IHdpdGggYW5kIHcvbyBuYW1pbmcgdGhlIGtleXdvcmQuCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWV0aCwgdHMsIDE2KQpAQCAtMjg2MiwxMyArMjg2MywxMyBAQAogICAgICAgICAjIEVuc3VyZSB3ZSBjYW4gZ2V0IHJpZCBvZiBhIHR6aW5mby4KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXNlLnR6bmFtZSgpLCAiKzEwMCIpCiAgICAgICAgIGJhc2UyID0gYmFzZS5yZXBsYWNlKHR6aW5mbz1Ob25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoYmFzZTIudHppbmZvIGlzIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYXNlMi50em5hbWUoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShiYXNlMi50emluZm8pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKGJhc2UyLnR6bmFtZSgpKQogCiAgICAgICAgICMgRW5zdXJlIHdlIGNhbiBhZGQgb25lLgogICAgICAgICBiYXNlMyA9IGJhc2UyLnJlcGxhY2UodHppbmZvPXoxMDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZSwgYmFzZTMpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYXNlLnR6aW5mbyBpcyBiYXNlMy50emluZm8pCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoYmFzZS50emluZm8sIGJhc2UzLnR6aW5mbykKIAogICAgICAgICAjIE91dCBvZiBib3VuZHMuCiAgICAgICAgIGJhc2UgPSBjbHMoMjAwMCwgMiwgMjkpCkBAIC0yODgxLDIwICsyODgyLDIwIEBACiAgICAgICAgIGZtNWggPSBGaXhlZE9mZnNldCgtdGltZWRlbHRhKGhvdXJzPTUpLCAibTMwMCIpCiAKICAgICAgICAgZHQgPSBzZWxmLnRoZWNsYXNzLm5vdyh0ej1mNDRtKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoZHQudHppbmZvIGlzIGY0NG0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZHQudHppbmZvLCBmNDRtKQogICAgICAgICAjIFJlcGxhY2luZyB3aXRoIGRlZ2VuZXJhdGUgdHppbmZvIHJhaXNlcyBhbiBleGNlcHRpb24uCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGR0LmFzdGltZXpvbmUsIGZub25lKQogICAgICAgICAjIERpdHRvIHdpdGggTm9uZSB0ei4KICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkdC5hc3RpbWV6b25lLCBOb25lKQogICAgICAgICAjIFJlcGxhY2luZyB3aXRoIHNhbWUgdHppbmZvIG1ha2VzIG5vIGNoYW5nZS4KICAgICAgICAgeCA9IGR0LmFzdGltZXpvbmUoZHQudHppbmZvKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoeC50emluZm8gaXMgZjQ0bSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh4LnR6aW5mbywgZjQ0bSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmRhdGUoKSwgZHQuZGF0ZSgpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgudGltZSgpLCBkdC50aW1lKCkpCiAKICAgICAgICAgIyBSZXBsYWNpbmcgd2l0aCBkaWZmZXJlbnQgdHppbmZvIGRvZXMgYWRqdXN0LgogICAgICAgICBnb3QgPSBkdC5hc3RpbWV6b25lKGZtNWgpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnb3QudHppbmZvIGlzIGZtNWgpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZ290LnR6aW5mbywgZm01aCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QudXRjb2Zmc2V0KCksIHRpbWVkZWx0YShob3Vycz0tNSkpCiAgICAgICAgIGV4cGVjdGVkID0gZHQgLSBkdC51dGNvZmZzZXQoKSAgIyBpbiBlZmZlY3QsIGNvbnZlcnQgdG8gVVRDCiAgICAgICAgIGV4cGVjdGVkICs9IGZtNWgudXRjb2Zmc2V0KGR0KSAgIyBhbmQgZnJvbSB0aGVyZSB0byBsb2NhbCB0aW1lCkBAIC0yOTAyLDcgKzI5MDMsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdC5kYXRlKCksIGV4cGVjdGVkLmRhdGUoKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QudGltZSgpLCBleHBlY3RlZC50aW1lKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290LnRpbWV0eigpLCBleHBlY3RlZC50aW1ldHooKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdvdC50emluZm8gaXMgZXhwZWN0ZWQudHppbmZvKQorICAgICAgICBzZWxmLmFzc2VydElzKGdvdC50emluZm8sIGV4cGVjdGVkLnR6aW5mbykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QsIGV4cGVjdGVkKQogCiAgICAgZGVmIHRlc3RfYXdhcmVfc3VidHJhY3Qoc2VsZik6CkBAIC0zMzMwLDggKzMzMzEsOCBAQAogICAgICAgICBhc19kYXRldGltZSA9IGRhdGV0aW1lLmNvbWJpbmUoYXNfZGF0ZSwgdGltZSgpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUoYXNfZGF0ZSAhPSBhc19kYXRldGltZSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFzX2RhdGV0aW1lICE9IGFzX2RhdGUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgYXNfZGF0ZSA9PSBhc19kYXRldGltZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBhc19kYXRldGltZSA9PSBhc19kYXRlKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGFzX2RhdGUgPT0gYXNfZGF0ZXRpbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoYXNfZGF0ZXRpbWUgPT0gYXNfZGF0ZSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGFzX2RhdGUgPCBhc19kYXRldGltZSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGFzX2RhdGV0aW1lIDwgYXNfZGF0ZSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGFzX2RhdGUgPD0gYXNfZGF0ZXRpbWUpCkBAIC0zMzQ1LDggKzMzNDYsNyBAQAogICAgICAgICAjIHByb2plY3Rpb24gaWYgdXNlIG9mIGEgZGF0ZSBtZXRob2QgaXMgZm9yY2VkLgogICAgICAgICBzZWxmLmFzc2VydFRydWUoYXNfZGF0ZS5fX2VxX18oYXNfZGF0ZXRpbWUpKQogICAgICAgICBkaWZmZXJlbnRfZGF5ID0gKGFzX2RhdGUuZGF5ICsgMSkgJSAyMCArIDEKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBhc19kYXRlLl9fZXFfXyhhc19kYXRldGltZS5yZXBsYWNlKGRheT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50X2RheSkpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGFzX2RhdGUuX19lcV9fKGFzX2RhdGV0aW1lLnJlcGxhY2UoZGF5PWRpZmZlcmVudF9kYXkpKSkKIAogICAgICAgICAjIEFuZCBkYXRlIHNob3VsZCBjb21wYXJlIHdpdGggb3RoZXIgc3ViY2xhc3NlcyBvZiBkYXRlLiAgSWYgYQogICAgICAgICAjIHN1YmNsYXNzIHdhbnRzIHRvIHN0b3AgdGhpcywgaXQncyB1cCB0byB0aGUgc3ViY2xhc3MgdG8gZG8gc28uCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RlY2ltYWwucHkgYi9MaWIvdGVzdC90ZXN0X2RlY2ltYWwucHkKaW5kZXggYTAxMWIyZi4uMDkwMjI3OCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kZWNpbWFsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGVjaW1hbC5weQpAQCAtMjIzLDcgKzIyMyw2IEBACiAgICAgICAgIGdsb2JhbCBza2lwX2V4cGVjdGVkCiAgICAgICAgIGlmIHNraXBfZXhwZWN0ZWQ6CiAgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdAotICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIHdpdGggb3BlbihmaWxlKSBhcyBmOgogICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKCdcclxuJywgJycpLnJlcGxhY2UoJ1xuJywgJycpCkBAIC0yMzQsNyArMjMzLDYgQEAKICAgICAgICAgICAgICAgICAgICAgI0V4Y2VwdGlvbiByYWlzZWQgd2hlcmUgdGhlcmUgc2hvdWxkbid0IGhhdmUgYmVlbiBvbmUuCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnRXhjZXB0aW9uICInK2V4Y2VwdGlvbi5fX2NsYXNzX18uX19uYW1lX18gKyAnIiByYWlzZWQgb24gbGluZSAnK2xpbmUpCiAKLSAgICAgICAgcmV0dXJuCiAKICAgICBkZWYgZXZhbF9saW5lKHNlbGYsIHMpOgogICAgICAgICBpZiBzLmZpbmQoJyAtPiAnKSA+PSAwIGFuZCBzWzoyXSAhPSAnLS0nIGFuZCBub3Qgcy5zdGFydHN3aXRoKCcgIC0tJyk6CkBAIC0zOTEsNyArMzg5LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAnSW5jb3JyZWN0IGFuc3dlciBmb3IgJyArIHMgKyAnIC0tIGdvdCAnICsgcmVzdWx0KQogICAgICAgICBzZWxmLmFzc2VydEl0ZW1zRXF1YWwobXlleGNlcHRpb25zLCB0aGVpcmV4Y2VwdGlvbnMsCiAgICAgICAgICAgICAgICdJbmNvcnJlY3QgZmxhZ3Mgc2V0IGluICcgKyBzICsgJyAtLSBnb3QgJyArIHN0cihteWV4Y2VwdGlvbnMpKQotICAgICAgICByZXR1cm4KIAogICAgIGRlZiBnZXRleGNlcHRpb25zKHNlbGYpOgogICAgICAgICByZXR1cm4gW2UgZm9yIGUgaW4gU2lnbmFscyBpZiBzZWxmLmNvbnRleHQuZmxhZ3NbZV1dCkBAIC04MzQsNyArODMxLDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgZnJvbSBsb2NhbGUgaW1wb3J0IENIQVJfTUFYCiAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgnbG9jYWxlLkNIQVJfTUFYIG5vdCBhdmFpbGFibGUnKQogCiAgICAgICAgICMgU2V0IHVwIHNvbWUgbG9jYWxlY29udi1saWtlIGRpY3Rpb25hcmllcwogICAgICAgICBlbl9VUyA9IHsKQEAgLTExOTYsNyArMTE5Myw2IEBACiAKICAgICBjbHMuYXNzZXJ0RXF1YWwodGVzdDEsIERlY2ltYWwoJzAuMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMycpKQogICAgIGNscy5hc3NlcnRFcXVhbCh0ZXN0MiwgRGVjaW1hbCgnMC4zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzJykpCi0gICAgcmV0dXJuCiAKIGRlZiB0aGZ1bmMyKGNscyk6CiAgICAgZDEgPSBEZWNpbWFsKDEpCkBAIC0xMjEwLDE3ICsxMjA2LDEyIEBACiAKICAgICBjbHMuYXNzZXJ0RXF1YWwodGVzdDEsIERlY2ltYWwoJzAuMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMycpKQogICAgIGNscy5hc3NlcnRFcXVhbCh0ZXN0MiwgRGVjaW1hbCgnMC4zMzMzMzMzMzMzMzMzMzMzMzMnKSkKLSAgICByZXR1cm4KIAogCitAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICd0aHJlYWRpbmcgcmVxdWlyZWQnKQogY2xhc3MgRGVjaW1hbFVzZU9mQ29udGV4dFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgICcnJ1VuaXQgdGVzdHMgZm9yIFVzZSBvZiBDb250ZXh0IGNhc2VzIGluIERlY2ltYWwuJycnCiAKLSAgICB0cnk6Ci0gICAgICAgIGltcG9ydCB0aHJlYWRpbmcKLSAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgIHRocmVhZGluZyA9IE5vbmUKLQogICAgICMgVGFrZSBjYXJlIGV4ZWN1dGluZyB0aGlzIHRlc3QgZnJvbSBJRExFLCB0aGVyZSdzIGFuIGlzc3VlIGluIHRocmVhZGluZwogICAgICMgdGhhdCBoYW5ncyBJRExFIGFuZCBJIGNvdWxkbid0IGZpbmQgaXQKIApAQCAtMTIzOSwxMCArMTIzMCw2IEBACiAKICAgICAgICAgc2VsZi5maW5pc2gxLndhaXQoKQogICAgICAgICBzZWxmLmZpbmlzaDIud2FpdCgpCi0gICAgICAgIHJldHVybgotCi0gICAgaWYgdGhyZWFkaW5nIGlzIE5vbmU6Ci0gICAgICAgIGRlbCB0ZXN0X3RocmVhZGluZwogCiAKIGNsYXNzIERlY2ltYWxVc2FiaWxpdHlUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTE0NDgsNiArMTQzNSwxOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KGQxKSwgNjYpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoZDIpLCAxNS4zMikKIAorICAgIGRlZiB0ZXN0X25hbl90b19mbG9hdChzZWxmKToKKyAgICAgICAgIyBUZXN0IGNvbnZlcnNpb25zIG9mIGRlY2ltYWwgTkFOcyB0byBmbG9hdC4KKyAgICAgICAgIyBTZWUgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTE1NTQ0CisgICAgICAgIGZvciBzIGluICgnbmFuJywgJ25hbjEyMzQnLCAnLW5hbicsICctbmFuMjQ2OCcpOgorICAgICAgICAgICAgZiA9IGZsb2F0KERlY2ltYWwocykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihmKSkKKworICAgIGRlZiB0ZXN0X3NuYW5fdG9fZmxvYXQoc2VsZik6CisgICAgICAgIGZvciBzIGluICgnc25hbicsICctc25hbicsICdzbmFuMTM1NycsICctc25hbjEyMzQnKToKKyAgICAgICAgICAgIGQgPSBEZWNpbWFsKHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgZCkKKwogICAgIGRlZiB0ZXN0X2V2YWxfcm91bmRfdHJpcChzZWxmKToKIAogICAgICAgICAjd2l0aCB6ZXJvCkBAIC0xNTI4LDcgKzE1MjcsNiBAQAogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEuX3NpZ24sIGIxLl9zaWduKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEuX2ludCwgYjEuX2ludCkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLl9leHAsIGIxLl9leHApCi0gICAgICAgICAgICByZXR1cm4KIAogICAgICAgICBEZWNpbWFsKGQxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLl9zaWduLCBiMS5fc2lnbikKQEAgLTIyNzMsNyArMjI3MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wZXJhdGlvbiByYWlzZXMgZGlmZmVyZW50IGZsYWdzIGRlcGVuZGluZyBvbiBmbGFncyBzZXQ6ICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCAlcywgZ290ICVzIiAlIChleHBlY3RlZF9mbGFncywgbmV3X2ZsYWdzKSkKIAotZGVmIHRlc3RfbWFpbihhcml0aD1GYWxzZSwgdmVyYm9zZT1Ob25lLCB0b2RvX3Rlc3RzPU5vbmUsIGRlYnVnPU5vbmUpOgorZGVmIHRlc3RfbWFpbihhcml0aD1Ob25lLCB2ZXJib3NlPU5vbmUsIHRvZG9fdGVzdHM9Tm9uZSwgZGVidWc9Tm9uZSk6CiAgICAgIiIiIEV4ZWN1dGUgdGhlIHRlc3RzLgogCiAgICAgUnVucyBhbGwgYXJpdGhtZXRpYyB0ZXN0cyBpZiBhcml0aCBpcyBUcnVlIG9yIGlmIHRoZSAiZGVjaW1hbCIgcmVzb3VyY2UKQEAgLTIyODIsNyArMjI4MCw3IEBACiAKICAgICBpbml0KCkKICAgICBnbG9iYWwgVEVTVF9BTEwsIERFQlVHCi0gICAgVEVTVF9BTEwgPSBhcml0aCBvciBpc19yZXNvdXJjZV9lbmFibGVkKCdkZWNpbWFsJykKKyAgICBURVNUX0FMTCA9IGFyaXRoIGlmIGFyaXRoIGlzIG5vdCBOb25lIGVsc2UgaXNfcmVzb3VyY2VfZW5hYmxlZCgnZGVjaW1hbCcpCiAgICAgREVCVUcgPSBkZWJ1ZwogCiAgICAgaWYgdG9kb190ZXN0cyBpcyBOb25lOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kZXF1ZS5weSBiL0xpYi90ZXN0L3Rlc3RfZGVxdWUucHkKaW5kZXggYTBkMzBmMS4uNTk1YTBjNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kZXF1ZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RlcXVlLnB5CkBAIC02LDYgKzYsNyBAQAogaW1wb3J0IGNvcHkKIGltcG9ydCBjUGlja2xlIGFzIHBpY2tsZQogaW1wb3J0IHJhbmRvbQoraW1wb3J0IHN0cnVjdAogCiBCSUcgPSAxMDAwMDAKIApAQCAtNTE3LDYgKzUxOCwyMSBAQAogICAgICAgICAgICAgZ2MuY29sbGVjdCgpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmVmKCkgaXMgTm9uZSwgIkN5Y2xlIHdhcyBub3QgY29sbGVjdGVkIikKIAorICAgIGNoZWNrX3NpemVvZiA9IHRlc3Rfc3VwcG9ydC5jaGVja19zaXplb2YKKworICAgIEB0ZXN0X3N1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3Rfc2l6ZW9mKHNlbGYpOgorICAgICAgICBCTE9DS0xFTiA9IDYyCisgICAgICAgIGJhc2VzaXplID0gdGVzdF9zdXBwb3J0LmNhbGNvYmpzaXplKCcyUDRQbFAnKQorICAgICAgICBibG9ja3NpemUgPSBzdHJ1Y3QuY2FsY3NpemUoJzJQJWRQJyAlIEJMT0NLTEVOKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iamVjdC5fX3NpemVvZl9fKGRlcXVlKCkpLCBiYXNlc2l6ZSkKKyAgICAgICAgY2hlY2sgPSBzZWxmLmNoZWNrX3NpemVvZgorICAgICAgICBjaGVjayhkZXF1ZSgpLCBiYXNlc2l6ZSArIGJsb2Nrc2l6ZSkKKyAgICAgICAgY2hlY2soZGVxdWUoJ2EnKSwgYmFzZXNpemUgKyBibG9ja3NpemUpCisgICAgICAgIGNoZWNrKGRlcXVlKCdhJyAqIChCTE9DS0xFTiAvLyAyKSksIGJhc2VzaXplICsgYmxvY2tzaXplKQorICAgICAgICBjaGVjayhkZXF1ZSgnYScgKiAoQkxPQ0tMRU4gLy8gMiArIDEpKSwgYmFzZXNpemUgKyAyICogYmxvY2tzaXplKQorICAgICAgICBjaGVjayhkZXF1ZSgnYScgKiAoNDIgKiBCTE9DS0xFTikpLCBiYXNlc2l6ZSArIDQzICogYmxvY2tzaXplKQorCiBjbGFzcyBUZXN0VmFyaW91c0l0ZXJhdG9yQXJncyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgdGVzdF9jb25zdHJ1Y3RvcihzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkgYi9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5CmluZGV4IDk2NGNjNWMuLjZmOTE4NDIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kZXNjci5weQpAQCAtMSw3ICsxLDkgQEAKIGltcG9ydCBfX2J1aWx0aW5fXworaW1wb3J0IGdjCiBpbXBvcnQgc3lzCiBpbXBvcnQgdHlwZXMKIGltcG9ydCB1bml0dGVzdAoraW1wb3J0IHdlYWtyZWYKIAogZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKQEAgLTM5NiwxMyArMzk4LDIxIEBACiAKIGNsYXNzIENsYXNzUHJvcGVydGllc0FuZE1ldGhvZHModW5pdHRlc3QuVGVzdENhc2UpOgogCisgICAgZGVmIGFzc2VydEhhc0F0dHIoc2VsZiwgb2JqLCBuYW1lKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIob2JqLCBuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICclciBoYXMgbm8gYXR0cmlidXRlICVyJyAlIChvYmosIG5hbWUpKQorCisgICAgZGVmIGFzc2VydE5vdEhhc0F0dHIoc2VsZiwgb2JqLCBuYW1lKToKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKG9iaiwgbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgJyVyIGhhcyB1bmV4cGVjdGVkIGF0dHJpYnV0ZSAlcicgJSAob2JqLCBuYW1lKSkKKwogICAgIGRlZiB0ZXN0X3B5dGhvbl9kaWN0cyhzZWxmKToKICAgICAgICAgIyBUZXN0aW5nIFB5dGhvbiBzdWJjbGFzcyBvZiBkaWN0Li4uCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGRpY3QsIGRpY3QpKQogICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoe30sIGRpY3QpCiAgICAgICAgIGQgPSBkaWN0KCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCB7fSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuX19jbGFzc19fIGlzIGRpY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZC5fX2NsYXNzX18sIGRpY3QpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLCBkaWN0KQogICAgICAgICBjbGFzcyBDKGRpY3QpOgogICAgICAgICAgICAgc3RhdGUgPSAtMQpAQCAtNTgzLDcgKzU5Myw3IEBACiAgICAgICAgICAgICBkZWYgX3NldF94KHNlbGYsIHgpOgogICAgICAgICAgICAgICAgIHNlbGYuX194ID0gLXgKICAgICAgICAgYSA9IEEoKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGhhc2F0dHIoYSwgIngiKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RIYXNBdHRyKGEsICJ4IikKICAgICAgICAgYS54ID0gMTIKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLngsIDEyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuX0FfX3gsIC0xMikKQEAgLTkzMiwxNCArOTQyLDE0IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShhKSwgb2JqZWN0KQogICAgICAgICBiID0gb2JqZWN0KCkKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChhLCBiKQotICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoYSwgImZvbyIpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEhhc0F0dHIoYSwgImZvbyIpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGEuZm9vID0gMTIKICAgICAgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVHlwZUVycm9yKToKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuZmFpbCgib2JqZWN0KCkgc2hvdWxkIG5vdCBhbGxvdyBzZXR0aW5nIGEgZm9vIGF0dHJpYnV0ZSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihvYmplY3QoKSwgIl9fZGljdF9fIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SGFzQXR0cihvYmplY3QoKSwgIl9fZGljdF9fIikKIAogICAgICAgICBjbGFzcyBDZGljdChvYmplY3QpOgogICAgICAgICAgICAgcGFzcwpAQCAtOTU0LDI4ICs5NjQsMjggQEAKICAgICAgICAgY2xhc3MgQzAob2JqZWN0KToKICAgICAgICAgICAgIF9fc2xvdHNfXyA9IFtdCiAgICAgICAgIHggPSBDMCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cih4LCAiX19kaWN0X18iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKHgsICJmb28iKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RIYXNBdHRyKHgsICJfX2RpY3RfXyIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SGFzQXR0cih4LCAiZm9vIikKIAogICAgICAgICBjbGFzcyBDMShvYmplY3QpOgogICAgICAgICAgICAgX19zbG90c19fID0gWydhJ10KICAgICAgICAgeCA9IEMxKCkKLSAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKHgsICJfX2RpY3RfXyIpKQotICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoeCwgImEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RIYXNBdHRyKHgsICJfX2RpY3RfXyIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SGFzQXR0cih4LCAiYSIpCiAgICAgICAgIHguYSA9IDEKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmEsIDEpCiAgICAgICAgIHguYSA9IE5vbmUKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmEsIE5vbmUpCiAgICAgICAgIGRlbCB4LmEKLSAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKHgsICJhIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SGFzQXR0cih4LCAiYSIpCiAKICAgICAgICAgY2xhc3MgQzMob2JqZWN0KToKICAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsnYScsICdiJywgJ2MnXQogICAgICAgICB4ID0gQzMoKQotICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoeCwgIl9fZGljdF9fIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cih4LCAnYScpKQotICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoeCwgJ2InKSkKLSAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKHgsICdjJykpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SGFzQXR0cih4LCAiX19kaWN0X18iKQorICAgICAgICBzZWxmLmFzc2VydE5vdEhhc0F0dHIoeCwgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydE5vdEhhc0F0dHIoeCwgJ2InKQorICAgICAgICBzZWxmLmFzc2VydE5vdEhhc0F0dHIoeCwgJ2MnKQogICAgICAgICB4LmEgPSAxCiAgICAgICAgIHguYiA9IDIKICAgICAgICAgeC5jID0gMwpAQCAtOTkxLDggKzEwMDEsOCBAQAogICAgICAgICAgICAgZGVmIGdldChzZWxmKToKICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2EKICAgICAgICAgeCA9IEM0KDUpCi0gICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cih4LCAnX19kaWN0X18nKSkKLSAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKHgsICdfX2EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RIYXNBdHRyKHgsICdfX2RpY3RfXycpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SGFzQXR0cih4LCAnX19hJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmdldCgpLCA1KQogICAgICAgICB0cnk6CiAgICAgICAgICAgICB4Ll9fYSA9IDYKQEAgLTEwNDksMTEgKzEwNTksMTIgQEAKICAgICAgICAgYy5hYmMgPSA1CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5hYmMsIDUpCiAKKyAgICBkZWYgdGVzdF91bmljb2RlX3Nsb3RzKHNlbGYpOgogICAgICAgICAjIFRlc3QgdW5pY29kZSBzbG90IG5hbWVzCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHVuaWNvZGUKICAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ25vIHVuaWNvZGUgc3VwcG9ydCcpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAjIFRlc3QgYSBzaW5nbGUgdW5pY29kZSBzdHJpbmcgaXMgbm90IGV4cGFuZGVkIGFzIGEgc2VxdWVuY2UuCiAgICAgICAgICAgICBjbGFzcyBDKG9iamVjdCk6CkBAIC0xMTI3LDcgKzExMzgsNiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKENvdW50ZWQuY291bnRlciwgMCkKIAogICAgICAgICAjIFRlc3QgbG9va3VwIGxlYWtzIFtTRiBidWcgNTcyNTY3XQotICAgICAgICBpbXBvcnQgZ2MKICAgICAgICAgaWYgaGFzYXR0cihnYywgJ2dldF9vYmplY3RzJyk6CiAgICAgICAgICAgICBjbGFzcyBHKG9iamVjdCk6CiAgICAgICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgpAQCAtMTE2MywxNiArMTE3MywxNiBAQAogICAgICAgICBjbGFzcyBEKG9iamVjdCk6CiAgICAgICAgICAgICBfX3Nsb3RzX18gPSBbIl9fZGljdF9fIl0KICAgICAgICAgYSA9IEQoKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihhLCAiX19kaWN0X18iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGEsICJfX3dlYWtyZWZfXyIpKQorICAgICAgICBzZWxmLmFzc2VydEhhc0F0dHIoYSwgIl9fZGljdF9fIikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RIYXNBdHRyKGEsICJfX3dlYWtyZWZfXyIpCiAgICAgICAgIGEuZm9vID0gNDIKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLl9fZGljdF9fLCB7ImZvbyI6IDQyfSkKIAogICAgICAgICBjbGFzcyBXKG9iamVjdCk6CiAgICAgICAgICAgICBfX3Nsb3RzX18gPSBbIl9fd2Vha3JlZl9fIl0KICAgICAgICAgYSA9IFcoKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihhLCAiX193ZWFrcmVmX18iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGEsICJfX2RpY3RfXyIpKQorICAgICAgICBzZWxmLmFzc2VydEhhc0F0dHIoYSwgIl9fd2Vha3JlZl9fIikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RIYXNBdHRyKGEsICJfX2RpY3RfXyIpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGEuZm9vID0gNDIKICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgpAQCAtMTE4MywxNiArMTE5MywxNiBAQAogICAgICAgICBjbGFzcyBDMShXLCBEKToKICAgICAgICAgICAgIF9fc2xvdHNfXyA9IFtdCiAgICAgICAgIGEgPSBDMSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGEsICJfX2RpY3RfXyIpKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihhLCAiX193ZWFrcmVmX18iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRIYXNBdHRyKGEsICJfX2RpY3RfXyIpCisgICAgICAgIHNlbGYuYXNzZXJ0SGFzQXR0cihhLCAiX193ZWFrcmVmX18iKQogICAgICAgICBhLmZvbyA9IDQyCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fX2RpY3RfXywgeyJmb28iOiA0Mn0pCiAKICAgICAgICAgY2xhc3MgQzIoRCwgVyk6CiAgICAgICAgICAgICBfX3Nsb3RzX18gPSBbXQogICAgICAgICBhID0gQzIoKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihhLCAiX19kaWN0X18iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoYSwgIl9fd2Vha3JlZl9fIikpCisgICAgICAgIHNlbGYuYXNzZXJ0SGFzQXR0cihhLCAiX19kaWN0X18iKQorICAgICAgICBzZWxmLmFzc2VydEhhc0F0dHIoYSwgIl9fd2Vha3JlZl9fIikKICAgICAgICAgYS5mb28gPSA0MgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuX19kaWN0X18sIHsiZm9vIjogNDJ9KQogCkBAIC0xMjQwLDcgKzEyNTAsNyBAQAogICAgICAgICBjbGFzcyBDKG9iamVjdCk6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGEgPSBDKCkKLSAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGEsICJmb29iYXIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RIYXNBdHRyKGEsICJmb29iYXIiKQogICAgICAgICBDLmZvb2JhciA9IDIKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmZvb2JhciwgMikKICAgICAgICAgQy5tZXRob2QgPSBsYW1iZGEgc2VsZjogNDIKQEAgLTEyNTAsNyArMTI2MCw3IEBACiAgICAgICAgIEMuX19pbnRfXyA9IGxhbWJkYSBzZWxmOiAxMDAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoYSksIDEwMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmZvb2JhciwgMikKLSAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGEsICJzcGFtIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SGFzQXR0cihhLCAic3BhbSIpCiAgICAgICAgIGRlZiBteWdldGF0dHIoc2VsZiwgbmFtZSk6CiAgICAgICAgICAgICBpZiBuYW1lID09ICJzcGFtIjoKICAgICAgICAgICAgICAgICByZXR1cm4gInNwYW0iCkBAIC0xNDE4LDYgKzE0MjgsMjIgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCBzcGFtLnNwYW1saXN0KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGExKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGQxKQorICAgICAgICBzcGFtX2NtID0gc3BhbS5zcGFtbGlzdC5fX2RpY3RfX1snY2xhc3NtZXRoJ10KKyAgICAgICAgeDIsIGEyLCBkMiA9IHNwYW1fY20oc3BhbS5zcGFtbGlzdCwgKmEsICoqZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Miwgc3BhbS5zcGFtbGlzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhMiwgYTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDIsIGQxKQorICAgICAgICBjbGFzcyBTdWJTcGFtKHNwYW0uc3BhbWxpc3QpOiBwYXNzCisgICAgICAgIHgyLCBhMiwgZDIgPSBzcGFtX2NtKFN1YlNwYW0sICphLCAqKmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIsIFN1YlNwYW0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYTIsIGExKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyLCBkMSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgc3BhbV9jbSgpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIHNwYW1fY20oc3BhbS5zcGFtbGlzdCgpKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBzcGFtX2NtKGxpc3QpCiAKICAgICBkZWYgdGVzdF9zdGF0aWNtZXRob2RzKHNlbGYpOgogICAgICAgICAjIFRlc3Rpbmcgc3RhdGljIG1ldGhvZHMuLi4KQEAgLTE1MDQsNyArMTUzMCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS54LCAxMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLngsIDExKQogICAgICAgICBkZWwgYS54Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzYXR0cihhLCAneCcpLCAwKQorICAgICAgICBzZWxmLmFzc2VydE5vdEhhc0F0dHIoYSwgJ3gnKQogCiAgICAgZGVmIHRlc3RfbmV3c2xvdHMoc2VsZik6CiAgICAgICAgICMgVGVzdGluZyBfX25ld19fIHNsb3Qgb3ZlcnJpZGUuLi4KQEAgLTE3ODAsMTggKzE4MDYsMTggQEAKICAgICAgICAgICAgICAgICByYWlzZSBJbmRleEVycm9yCiAgICAgICAgIGMxID0gQygpCiAgICAgICAgIGMyID0gQygpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgbm90IGMxKSAjIFdoYXQ/CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uobm90IGMxKQogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGMxKSwgaWQoYzIpKQogICAgICAgICBoYXNoKGMxKQogICAgICAgICBoYXNoKGMyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChjMSwgYzIpLCBjbXAoaWQoYzEpLCBpZChjMikpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMxLCBjMSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGMxICE9IGMyKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGMxICE9IGMxKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGMxID09IGMyKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGMxICE9IGMxKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGMxID09IGMyKQogICAgICAgICAjIE5vdGUgdGhhdCB0aGUgbW9kdWxlIG5hbWUgYXBwZWFycyBpbiBzdHIvcmVwciwgYW5kIHRoYXQgdmFyaWVzCiAgICAgICAgICMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhpcyB0ZXN0IGlzIHJ1biBzdGFuZGFsb25lIG9yIGZyb20gYSBmcmFtZXdvcmsuCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHIoYzEpLmZpbmQoJ0Mgb2JqZWN0IGF0ICcpID49IDApCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKHN0cihjMSkuZmluZCgnQyBvYmplY3QgYXQgJyksIDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGMxKSwgcmVwcihjMSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oLTEsIGMxKQogICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CkBAIC0xODA0LDE4ICsxODMwLDE4IEBACiAgICAgICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcgogICAgICAgICBkMSA9IEQoKQogICAgICAgICBkMiA9IEQoKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG5vdCBkMSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShub3QgZDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoZDEpLCBpZChkMikpCiAgICAgICAgIGhhc2goZDEpCiAgICAgICAgIGhhc2goZDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKGQxLCBkMiksIGNtcChpZChkMSksIGlkKGQyKSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEsIGQxKQogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGQxLCBkMikKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBkMSAhPSBkMSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBkMSA9PSBkMikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShkMSAhPSBkMSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShkMSA9PSBkMikKICAgICAgICAgIyBOb3RlIHRoYXQgdGhlIG1vZHVsZSBuYW1lIGFwcGVhcnMgaW4gc3RyL3JlcHIsIGFuZCB0aGF0IHZhcmllcwogICAgICAgICAjIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoaXMgdGVzdCBpcyBydW4gc3RhbmRhbG9uZSBvciBmcm9tIGEgZnJhbWV3b3JrLgotICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyKGQxKS5maW5kKCdEIG9iamVjdCBhdCAnKSA+PSAwKQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChzdHIoZDEpLmZpbmQoJ0Qgb2JqZWN0IGF0ICcpLCAwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihkMSksIHJlcHIoZDEpKQogICAgICAgICBzZWxmLmFzc2VydE5vdEluKC0xLCBkMSkKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgpAQCAtMTg0NSwxMSArMTg3MSwxMSBAQAogICAgICAgICBwMSA9IFByb3h5KDEpCiAgICAgICAgIHBfMSA9IFByb3h5KC0xKQogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHAwKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG5vdCBwMSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShub3QgcDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChwMCksIGhhc2goMCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocDAsIHAwKQogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHAwLCBwMSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwMCAhPSBwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwMCAhPSBwMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3QgcDAsIHAxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChwMCwgcDEpLCAtMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAocDAsIHAwKSwgMCkKQEAgLTE4ODUsNyArMTkxMSw3IEBACiAgICAgICAgIHAxID0gRFByb3h5KDEpCiAgICAgICAgIHBfMSA9IERQcm94eSgtMSkKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwMCkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBub3QgcDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uobm90IHAxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2gocDApLCBoYXNoKDApKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAwLCBwMCkKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChwMCwgcDEpCkBAIC0xOTc4LDcgKzIwMDQsNyBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICB3ZWFrcmVmLnJlZihubykKICAgICAgICAgZXhjZXB0IFR5cGVFcnJvciwgbXNnOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cihtc2cpLmZpbmQoIndlYWsgcmVmZXJlbmNlIikgPj0gMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oIndlYWsgcmVmZXJlbmNlIiwgc3RyKG1zZykpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwoIndlYWtyZWYucmVmKG5vKSBzaG91bGQgYmUgaWxsZWdhbCIpCiAgICAgICAgIGNsYXNzIFdlYWsob2JqZWN0KToKQEAgLTIwMDIsMTcgKzIwMjgsMTcgQEAKICAgICAgICAgICAgICAgICBkZWwgc2VsZi5fX3gKICAgICAgICAgICAgIHggPSBwcm9wZXJ0eShnZXR4LCBzZXR4LCBkZWx4LCBkb2M9IkknbSB0aGUgeCBwcm9wZXJ0eS4iKQogICAgICAgICBhID0gQygpCi0gICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihhLCAieCIpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEhhc0F0dHIoYSwgIngiKQogICAgICAgICBhLnggPSA0MgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuX0NfX3gsIDQyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEueCwgNDIpCiAgICAgICAgIGRlbCBhLngKLSAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGEsICJ4IikpCi0gICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihhLCAiX0NfX3giKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RIYXNBdHRyKGEsICJ4IikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RIYXNBdHRyKGEsICJfQ19feCIpCiAgICAgICAgIEMueC5fX3NldF9fKGEsIDEwMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLnguX19nZXRfXyhhKSwgMTAwKQogICAgICAgICBDLnguX19kZWxldGVfXyhhKQotICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoYSwgIngiKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RIYXNBdHRyKGEsICJ4IikKIAogICAgICAgICByYXcgPSBDLl9fZGljdF9fWyd4J10KICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHJhdywgcHJvcGVydHkpCkBAIC0yMDI0LDkgKzIwNTAsOSBAQAogICAgICAgICBzZWxmLmFzc2VydEluKCJmZGVsIiwgYXR0cnMpCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYXcuX19kb2NfXywgIkknbSB0aGUgeCBwcm9wZXJ0eS4iKQotICAgICAgICBzZWxmLmFzc2VydFRydWUocmF3LmZnZXQgaXMgQy5fX2RpY3RfX1snZ2V0eCddKQotICAgICAgICBzZWxmLmFzc2VydFRydWUocmF3LmZzZXQgaXMgQy5fX2RpY3RfX1snc2V0eCddKQotICAgICAgICBzZWxmLmFzc2VydFRydWUocmF3LmZkZWwgaXMgQy5fX2RpY3RfX1snZGVseCddKQorICAgICAgICBzZWxmLmFzc2VydElzKHJhdy5mZ2V0LCBDLl9fZGljdF9fWydnZXR4J10pCisgICAgICAgIHNlbGYuYXNzZXJ0SXMocmF3LmZzZXQsIEMuX19kaWN0X19bJ3NldHgnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhyYXcuZmRlbCwgQy5fX2RpY3RfX1snZGVseCddKQogCiAgICAgICAgIGZvciBhdHRyIGluICJfX2RvY19fIiwgImZnZXQiLCAiZnNldCIsICJmZGVsIjoKICAgICAgICAgICAgIHRyeToKQEAgLTIwNjYsNiArMjA5Miw3IEBACiAgICAgICAgICAgICBwcm9wMiA9IHByb3BlcnR5KGZzZXQ9c2V0dGVyKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm9wMi5fX2RvY19fLCBOb25lKQogCisgICAgQHRlc3Rfc3VwcG9ydC5jcHl0aG9uX29ubHkKICAgICBkZWYgdGVzdF90ZXN0Y2FwaV9ub19zZWdmYXVsdChzZWxmKToKICAgICAgICAgIyB0aGlzIHNlZ2ZhdWx0ZWQgaW4gMi41YjIKICAgICAgICAgdHJ5OgpAQCAtMjA5MCwxNCArMjExNywxNCBAQAogICAgICAgICAgICAgICAgIGRlbCBzZWxmLl9mb28KICAgICAgICAgYyA9IEMoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMuZm9vLl9fZG9jX18sICJoZWxsbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihjLCAiZm9vIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SGFzQXR0cihjLCAiZm9vIikKICAgICAgICAgYy5mb28gPSAtNDIKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoYywgJ19mb28nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRIYXNBdHRyKGMsICdfZm9vJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLl9mb28sIDQyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZm9vLCA0MikKICAgICAgICAgZGVsIGMuZm9vCi0gICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihjLCAnX2ZvbycpKQotICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoYywgImZvbyIpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEhhc0F0dHIoYywgJ19mb28nKQorICAgICAgICBzZWxmLmFzc2VydE5vdEhhc0F0dHIoYywgImZvbyIpCiAKICAgICAgICAgY2xhc3MgRChDKToKICAgICAgICAgICAgIEBDLmZvby5kZWxldGVyCkBAIC0yNDgzLDEzICsyNTEwLDEzIEBACiAgICAgICAgIGEgPSBoZXhpbnQoMTIzNDUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgMTIzNDUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGEpLCAxMjM0NSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGludChhKS5fX2NsYXNzX18gaXMgaW50KQorICAgICAgICBzZWxmLmFzc2VydElzKGludChhKS5fX2NsYXNzX18sIGludCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGEpLCBoYXNoKDEyMzQ1KSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgrYSkuX19jbGFzc19fIGlzIGludCkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhID4+IDApLl9fY2xhc3NfXyBpcyBpbnQpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA8PCAwKS5fX2NsYXNzX18gaXMgaW50KQotICAgICAgICBzZWxmLmFzc2VydFRydWUoKGhleGludCgwKSA8PCAxMikuX19jbGFzc19fIGlzIGludCkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChoZXhpbnQoMCkgPj4gMTIpLl9fY2xhc3NfXyBpcyBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoKCthKS5fX2NsYXNzX18sIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygoYSA+PiAwKS5fX2NsYXNzX18sIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygoYSA8PCAwKS5fX2NsYXNzX18sIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygoaGV4aW50KDApIDw8IDEyKS5fX2NsYXNzX18sIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygoaGV4aW50KDApID4+IDEyKS5fX2NsYXNzX18sIGludCkKIAogICAgICAgICBjbGFzcyBvY3Rsb25nKGxvbmcpOgogICAgICAgICAgICAgX19zbG90c19fID0gW10KQEAgLTI1MDksMzEgKzI1MzYsMzEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCAxMjM0NUwpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZyhhKSwgMTIzNDVMKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goYSksIGhhc2goMTIzNDVMKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxvbmcoYSkuX19jbGFzc19fIGlzIGxvbmcpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoK2EpLl9fY2xhc3NfXyBpcyBsb25nKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoKC1hKS5fX2NsYXNzX18gaXMgbG9uZykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgtb2N0bG9uZygwKSkuX19jbGFzc19fIGlzIGxvbmcpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA+PiAwKS5fX2NsYXNzX18gaXMgbG9uZykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhIDw8IDApLl9fY2xhc3NfXyBpcyBsb25nKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgLSAwKS5fX2NsYXNzX18gaXMgbG9uZykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhICogMSkuX19jbGFzc19fIGlzIGxvbmcpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSAqKiAxKS5fX2NsYXNzX18gaXMgbG9uZykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhIC8vIDEpLl9fY2xhc3NfXyBpcyBsb25nKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoKDEgKiBhKS5fX2NsYXNzX18gaXMgbG9uZykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhIHwgMCkuX19jbGFzc19fIGlzIGxvbmcpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSBeIDApLl9fY2xhc3NfXyBpcyBsb25nKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgJiAtMUwpLl9fY2xhc3NfXyBpcyBsb25nKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoKG9jdGxvbmcoMCkgPDwgMTIpLl9fY2xhc3NfXyBpcyBsb25nKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoKG9jdGxvbmcoMCkgPj4gMTIpLl9fY2xhc3NfXyBpcyBsb25nKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoYWJzKG9jdGxvbmcoMCkpLl9fY2xhc3NfXyBpcyBsb25nKQorICAgICAgICBzZWxmLmFzc2VydElzKGxvbmcoYSkuX19jbGFzc19fLCBsb25nKQorICAgICAgICBzZWxmLmFzc2VydElzKCgrYSkuX19jbGFzc19fLCBsb25nKQorICAgICAgICBzZWxmLmFzc2VydElzKCgtYSkuX19jbGFzc19fLCBsb25nKQorICAgICAgICBzZWxmLmFzc2VydElzKCgtb2N0bG9uZygwKSkuX19jbGFzc19fLCBsb25nKQorICAgICAgICBzZWxmLmFzc2VydElzKChhID4+IDApLl9fY2xhc3NfXywgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRJcygoYSA8PCAwKS5fX2NsYXNzX18sIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoKGEgLSAwKS5fX2NsYXNzX18sIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoKGEgKiAxKS5fX2NsYXNzX18sIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoKGEgKiogMSkuX19jbGFzc19fLCBsb25nKQorICAgICAgICBzZWxmLmFzc2VydElzKChhIC8vIDEpLl9fY2xhc3NfXywgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRJcygoMSAqIGEpLl9fY2xhc3NfXywgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRJcygoYSB8IDApLl9fY2xhc3NfXywgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRJcygoYSBeIDApLl9fY2xhc3NfXywgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRJcygoYSAmIC0xTCkuX19jbGFzc19fLCBsb25nKQorICAgICAgICBzZWxmLmFzc2VydElzKChvY3Rsb25nKDApIDw8IDEyKS5fX2NsYXNzX18sIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoKG9jdGxvbmcoMCkgPj4gMTIpLl9fY2xhc3NfXywgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhhYnMob2N0bG9uZygwKSkuX19jbGFzc19fLCBsb25nKQogCiAgICAgICAgICMgQmVjYXVzZSBvY3Rsb25nIG92ZXJyaWRlcyBfX2FkZF9fLCB3ZSBjYW4ndCBjaGVjayB0aGUgYWJzZW5jZSBvZiArMAogICAgICAgICAjIG9wdGltaXphdGlvbnMgdXNpbmcgb2N0bG9uZy4KICAgICAgICAgY2xhc3MgbG9uZ2Nsb25lKGxvbmcpOgogICAgICAgICAgICAgcGFzcwogICAgICAgICBhID0gbG9uZ2Nsb25lKDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSArIDApLl9fY2xhc3NfXyBpcyBsb25nKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoKDAgKyBhKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRJcygoYSArIDApLl9fY2xhc3NfXywgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRJcygoMCArIGEpLl9fY2xhc3NfXywgbG9uZykKIAogICAgICAgICAjIENoZWNrIHRoYXQgbmVnYXRpdmUgY2xvbmVzIGRvbid0IHNlZ2ZhdWx0CiAgICAgICAgIGEgPSBsb25nY2xvbmUoLTEpCkBAIC0yNTUwLDkgKzI1NzcsOSBAQAogICAgICAgICBhID0gcHJlY2Zsb2F0KDEyMzQ1KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIDEyMzQ1LjApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoYSksIDEyMzQ1LjApCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmbG9hdChhKS5fX2NsYXNzX18gaXMgZmxvYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZmxvYXQoYSkuX19jbGFzc19fLCBmbG9hdCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGEpLCBoYXNoKDEyMzQ1LjApKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoKCthKS5fX2NsYXNzX18gaXMgZmxvYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoKCthKS5fX2NsYXNzX18sIGZsb2F0KQogCiAgICAgICAgIGNsYXNzIG1hZGNvbXBsZXgoY29tcGxleCk6CiAgICAgICAgICAgICBkZWYgX19yZXByX18oc2VsZik6CkBAIC0yNjAwLDIwICsyNjI3LDIwIEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIHQpCiAgICAgICAgIGEgPSBtYWR0dXBsZSgoMSwyLDMsNCw1KSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dXBsZShhKSwgKDEsMiwzLDQsNSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0dXBsZShhKS5fX2NsYXNzX18gaXMgdHVwbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModHVwbGUoYSkuX19jbGFzc19fLCB0dXBsZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGEpLCBoYXNoKCgxLDIsMyw0LDUpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFbOl0uX19jbGFzc19fIGlzIHR1cGxlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgKiAxKS5fX2NsYXNzX18gaXMgdHVwbGUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSAqIDApLl9fY2xhc3NfXyBpcyB0dXBsZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhICsgKCkpLl9fY2xhc3NfXyBpcyB0dXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhhWzpdLl9fY2xhc3NfXywgdHVwbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoKGEgKiAxKS5fX2NsYXNzX18sIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydElzKChhICogMCkuX19jbGFzc19fLCB0dXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygoYSArICgpKS5fX2NsYXNzX18sIHR1cGxlKQogICAgICAgICBhID0gbWFkdHVwbGUoKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoYSksICgpKQotICAgICAgICBzZWxmLmFzc2VydFRydWUodHVwbGUoYSkuX19jbGFzc19fIGlzIHR1cGxlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgKyBhKS5fX2NsYXNzX18gaXMgdHVwbGUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSAqIDApLl9fY2xhc3NfXyBpcyB0dXBsZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhICogMSkuX19jbGFzc19fIGlzIHR1cGxlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgKiAyKS5fX2NsYXNzX18gaXMgdHVwbGUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhWzpdLl9fY2xhc3NfXyBpcyB0dXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh0dXBsZShhKS5fX2NsYXNzX18sIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydElzKChhICsgYSkuX19jbGFzc19fLCB0dXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygoYSAqIDApLl9fY2xhc3NfXywgdHVwbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoKGEgKiAxKS5fX2NsYXNzX18sIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydElzKChhICogMikuX19jbGFzc19fLCB0dXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhhWzpdLl9fY2xhc3NfXywgdHVwbGUpCiAKICAgICAgICAgY2xhc3MgbWFkc3RyaW5nKHN0cik6CiAgICAgICAgICAgICBfcmV2ID0gTm9uZQpAQCAtMjYzNSw1MSArMjY2Miw1MSBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LCBzKQogICAgICAgICBzID0gbWFkc3RyaW5nKCIxMjM0NSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHMpLCAiMTIzNDUiKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyKHMpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc3RyKHMpLl9fY2xhc3NfXywgc3RyKQogCiAgICAgICAgIGJhc2UgPSAiXHgwMCIgKiA1CiAgICAgICAgIHMgPSBtYWRzdHJpbmcoYmFzZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBiYXNlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihzKSwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cihzKS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydElzKHN0cihzKS5fX2NsYXNzX18sIHN0cikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKHMpLCBoYXNoKGJhc2UpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHtzOiAxfVtiYXNlXSwgMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7YmFzZTogMX1bc10sIDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgocyArICIiKS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydElzKChzICsgIiIpLl9fY2xhc3NfXywgc3RyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMgKyAiIiwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgiIiArIHMpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoKCIiICsgcykuX19jbGFzc19fLCBzdHIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIiIgKyBzLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoKHMgKiAwKS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydElzKChzICogMCkuX19jbGFzc19fLCBzdHIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocyAqIDAsICIiKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoKHMgKiAxKS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydElzKChzICogMSkuX19jbGFzc19fLCBzdHIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocyAqIDEsIGJhc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgocyAqIDIpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoKHMgKiAyKS5fX2NsYXNzX18sIHN0cikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzICogMiwgYmFzZSArIGJhc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzWzpdLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc1s6XS5fX2NsYXNzX18sIHN0cikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWzpdLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoc1swOjBdLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc1swOjBdLl9fY2xhc3NfXywgc3RyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbMDowXSwgIiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnN0cmlwKCkuX19jbGFzc19fIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzLnN0cmlwKCkuX19jbGFzc19fLCBzdHIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5zdHJpcCgpLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUocy5sc3RyaXAoKS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydElzKHMubHN0cmlwKCkuX19jbGFzc19fLCBzdHIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5sc3RyaXAoKSwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMucnN0cmlwKCkuX19jbGFzc19fIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzLnJzdHJpcCgpLl9fY2xhc3NfXywgc3RyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMucnN0cmlwKCksIGJhc2UpCiAgICAgICAgIGlkZW50aXR5dGFiID0gJycuam9pbihbY2hyKGkpIGZvciBpIGluIHJhbmdlKDI1NildKQotICAgICAgICBzZWxmLmFzc2VydFRydWUocy50cmFuc2xhdGUoaWRlbnRpdHl0YWIpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMocy50cmFuc2xhdGUoaWRlbnRpdHl0YWIpLl9fY2xhc3NfXywgc3RyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudHJhbnNsYXRlKGlkZW50aXR5dGFiKSwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMudHJhbnNsYXRlKGlkZW50aXR5dGFiLCAieCIpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMocy50cmFuc2xhdGUoaWRlbnRpdHl0YWIsICJ4IikuX19jbGFzc19fLCBzdHIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy50cmFuc2xhdGUoaWRlbnRpdHl0YWIsICJ4IiksIGJhc2UpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy50cmFuc2xhdGUoaWRlbnRpdHl0YWIsICJceDAwIiksICIiKQotICAgICAgICBzZWxmLmFzc2VydFRydWUocy5yZXBsYWNlKCJ4IiwgIngiKS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydElzKHMucmVwbGFjZSgieCIsICJ4IikuX19jbGFzc19fLCBzdHIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5yZXBsYWNlKCJ4IiwgIngiKSwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMubGp1c3QobGVuKHMpKS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydElzKHMubGp1c3QobGVuKHMpKS5fX2NsYXNzX18sIHN0cikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmxqdXN0KGxlbihzKSksIGJhc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnJqdXN0KGxlbihzKSkuX19jbGFzc19fIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzLnJqdXN0KGxlbihzKSkuX19jbGFzc19fLCBzdHIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5yanVzdChsZW4ocykpLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUocy5jZW50ZXIobGVuKHMpKS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydElzKHMuY2VudGVyKGxlbihzKSkuX19jbGFzc19fLCBzdHIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5jZW50ZXIobGVuKHMpKSwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMubG93ZXIoKS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydElzKHMubG93ZXIoKS5fX2NsYXNzX18sIHN0cikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmxvd2VyKCksIGJhc2UpCiAKICAgICAgICAgY2xhc3MgbWFkdW5pY29kZSh1bmljb2RlKToKQEAgLTI2OTgsNDcgKzI3MjUsNDcgQEAKICAgICAgICAgYmFzZSA9IHUiMTIzNDUiCiAgICAgICAgIHUgPSBtYWR1bmljb2RlKGJhc2UpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZSh1KSwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVuaWNvZGUodSkuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModW5pY29kZSh1KS5fX2NsYXNzX18sIHVuaWNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaCh1KSwgaGFzaChiYXNlKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7dTogMX1bYmFzZV0sIDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoe2Jhc2U6IDF9W3VdLCAxKQotICAgICAgICBzZWxmLmFzc2VydFRydWUodS5zdHJpcCgpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydElzKHUuc3RyaXAoKS5fX2NsYXNzX18sIHVuaWNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5zdHJpcCgpLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUodS5sc3RyaXAoKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh1LmxzdHJpcCgpLl9fY2xhc3NfXywgdW5pY29kZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LmxzdHJpcCgpLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUodS5yc3RyaXAoKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh1LnJzdHJpcCgpLl9fY2xhc3NfXywgdW5pY29kZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LnJzdHJpcCgpLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUodS5yZXBsYWNlKHUieCIsIHUieCIpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydElzKHUucmVwbGFjZSh1IngiLCB1IngiKS5fX2NsYXNzX18sIHVuaWNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5yZXBsYWNlKHUieCIsIHUieCIpLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUodS5yZXBsYWNlKHUieHkiLCB1Inh5IikuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModS5yZXBsYWNlKHUieHkiLCB1Inh5IikuX19jbGFzc19fLCB1bmljb2RlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUucmVwbGFjZSh1Inh5IiwgdSJ4eSIpLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUodS5jZW50ZXIobGVuKHUpKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh1LmNlbnRlcihsZW4odSkpLl9fY2xhc3NfXywgdW5pY29kZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LmNlbnRlcihsZW4odSkpLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUodS5sanVzdChsZW4odSkpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydElzKHUubGp1c3QobGVuKHUpKS5fX2NsYXNzX18sIHVuaWNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5sanVzdChsZW4odSkpLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUodS5yanVzdChsZW4odSkpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydElzKHUucmp1c3QobGVuKHUpKS5fX2NsYXNzX18sIHVuaWNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5yanVzdChsZW4odSkpLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUodS5sb3dlcigpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydElzKHUubG93ZXIoKS5fX2NsYXNzX18sIHVuaWNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5sb3dlcigpLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUodS51cHBlcigpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydElzKHUudXBwZXIoKS5fX2NsYXNzX18sIHVuaWNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS51cHBlcigpLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUodS5jYXBpdGFsaXplKCkuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModS5jYXBpdGFsaXplKCkuX19jbGFzc19fLCB1bmljb2RlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUuY2FwaXRhbGl6ZSgpLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUodS50aXRsZSgpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydElzKHUudGl0bGUoKS5fX2NsYXNzX18sIHVuaWNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS50aXRsZSgpLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoKHUgKyB1IiIpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydElzKCh1ICsgdSIiKS5fX2NsYXNzX18sIHVuaWNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSArIHUiIiwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCh1IiIgKyB1KS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygodSIiICsgdSkuX19jbGFzc19fLCB1bmljb2RlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiIiArIHUsIGJhc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgodSAqIDApLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydElzKCh1ICogMCkuX19jbGFzc19fLCB1bmljb2RlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUgKiAwLCB1IiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgodSAqIDEpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydElzKCh1ICogMSkuX19jbGFzc19fLCB1bmljb2RlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUgKiAxLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoKHUgKiAyKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygodSAqIDIpLl9fY2xhc3NfXywgdW5pY29kZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1ICogMiwgYmFzZSArIGJhc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1WzpdLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydElzKHVbOl0uX19jbGFzc19fLCB1bmljb2RlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVbOl0sIGJhc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1WzA6MF0uX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModVswOjBdLl9fY2xhc3NfXywgdW5pY29kZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1WzA6MF0sIHUiIikKIAogICAgICAgICBjbGFzcyBzdWJsaXN0KGxpc3QpOgpAQCAtMjg4NCwxMiArMjkxMSwxNiBAQAogICAgICAgICAgICAgYyA9IHsxOiBjMSwgMjogYzIsIDM6IGMzfQogICAgICAgICAgICAgZm9yIHggaW4gMSwgMiwgMzoKICAgICAgICAgICAgICAgICBmb3IgeSBpbiAxLCAyLCAzOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY21wKGNbeF0sIGNbeV0pID09IGNtcCh4LCB5KSwgIng9JWQsIHk9JWQiICUgKHgsIHkpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChjW3hdLCBjW3ldKSwgY21wKHgsIHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4PSVkLCB5PSVkIiAlICh4LCB5KSkKICAgICAgICAgICAgICAgICAgICAgZm9yIG9wIGluICI8IiwgIjw9IiwgIj09IiwgIiE9IiwgIj4iLCAiPj0iOgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV2YWwoImNbeF0gJXMgY1t5XSIgJSBvcCkgPT0gZXZhbCgieCAlcyB5IiAlIG9wKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieD0lZCwgeT0lZCIgJSAoeCwgeSkpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbXAoY1t4XSwgeSkgPT0gY21wKHgsIHkpLCAieD0lZCwgeT0lZCIgJSAoeCwgeSkpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbXAoeCwgY1t5XSkgPT0gY21wKHgsIHkpLCAieD0lZCwgeT0lZCIgJSAoeCwgeSkpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoImNbeF0gJXMgY1t5XSIgJSBvcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2YWwoInggJXMgeSIgJSBvcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4PSVkLCB5PSVkIiAlICh4LCB5KSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoY1t4XSwgeSksIGNtcCh4LCB5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieD0lZCwgeT0lZCIgJSAoeCwgeSkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHgsIGNbeV0pLCBjbXAoeCwgeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIng9JWQsIHk9JWQiICUgKHgsIHkpKQogCiAgICAgZGVmIHRlc3RfcmljaF9jb21wYXJpc29ucyhzZWxmKToKICAgICAgICAgIyBUZXN0aW5nIHJpY2ggY29tcGFyaXNvbnMuLi4KQEAgLTI5NjIsMTIgKzI5OTMsMTUgQEAKICAgICAgICAgICAgIGZvciB4IGluIDEsIDIsIDM6CiAgICAgICAgICAgICAgICAgZm9yIHkgaW4gMSwgMiwgMzoKICAgICAgICAgICAgICAgICAgICAgZm9yIG9wIGluICI8IiwgIjw9IiwgIj09IiwgIiE9IiwgIj4iLCAiPj0iOgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV2YWwoImNbeF0gJXMgY1t5XSIgJSBvcCkgPT0gZXZhbCgieCAlcyB5IiAlIG9wKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieD0lZCwgeT0lZCIgJSAoeCwgeSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZXZhbCgiY1t4XSAlcyB5IiAlIG9wKSA9PSBldmFsKCJ4ICVzIHkiICUgb3ApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4PSVkLCB5PSVkIiAlICh4LCB5KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShldmFsKCJ4ICVzIGNbeV0iICUgb3ApID09IGV2YWwoInggJXMgeSIgJSBvcCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIng9JWQsIHk9JWQiICUgKHgsIHkpKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCJjW3hdICVzIGNbeV0iICUgb3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsKCJ4ICVzIHkiICUgb3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieD0lZCwgeT0lZCIgJSAoeCwgeSkpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoImNbeF0gJXMgeSIgJSBvcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2YWwoInggJXMgeSIgJSBvcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4PSVkLCB5PSVkIiAlICh4LCB5KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgieCAlcyBjW3ldIiAlIG9wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZhbCgieCAlcyB5IiAlIG9wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIng9JWQsIHk9JWQiICUgKHgsIHkpKQogCiAgICAgZGVmIHRlc3RfY29lcmNpb25zKHNlbGYpOgogICAgICAgICAjIFRlc3RpbmcgY29lcmNpb25zLi4uCkBAIC0zMDMyLDkgKzMwNjYsOSBAQAogICAgICAgICAgICAgZm9yIGNsczIgaW4gQywgRCwgRSwgRjoKICAgICAgICAgICAgICAgICB4ID0gY2xzKCkKICAgICAgICAgICAgICAgICB4Ll9fY2xhc3NfXyA9IGNsczIKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoeC5fX2NsYXNzX18gaXMgY2xzMikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHguX19jbGFzc19fLCBjbHMyKQogICAgICAgICAgICAgICAgIHguX19jbGFzc19fID0gY2xzCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHguX19jbGFzc19fIGlzIGNscykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHguX19jbGFzc19fLCBjbHMpCiAgICAgICAgIGRlZiBjYW50KHgsIEMpOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHguX19jbGFzc19fID0gQwpAQCAtMzA5NiwxMSArMzEzMCwxMSBAQAogICAgICAgICAgICAgeCA9IGNscygpCiAgICAgICAgICAgICB4LmEgPSAxCiAgICAgICAgICAgICB4Ll9fY2xhc3NfXyA9IGNsczIKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4Ll9fY2xhc3NfXyBpcyBjbHMyLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh4Ll9fY2xhc3NfXywgY2xzMiwKICAgICAgICAgICAgICAgICAgICAiYXNzaWduaW5nICVyIGFzIF9fY2xhc3NfXyBmb3IgJXIgc2lsZW50bHkgZmFpbGVkIiAlIChjbHMyLCB4KSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5hLCAxKQogICAgICAgICAgICAgeC5fX2NsYXNzX18gPSBjbHMKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4Ll9fY2xhc3NfXyBpcyBjbHMsCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHguX19jbGFzc19fLCBjbHMsCiAgICAgICAgICAgICAgICAgICAgImFzc2lnbmluZyAlciBhcyBfX2NsYXNzX18gZm9yICVyIHNpbGVudGx5IGZhaWxlZCIgJSAoY2xzLCB4KSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5hLCAxKQogICAgICAgICBmb3IgY2xzIGluIEcsIEosIEssIEwsIE0sIE4sIFAsIFIsIGxpc3QsIEludDoKQEAgLTMyNzAsNyArMzMwNCw3IEBACiAgICAgICAgICAgICAgICAgZm9yIGNscyBpbiBDLCBDMSwgQzI6CiAgICAgICAgICAgICAgICAgICAgIHMgPSBwLmR1bXBzKGNscywgYmluKQogICAgICAgICAgICAgICAgICAgICBjbHMyID0gcC5sb2FkcyhzKQotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2xzMiBpcyBjbHMpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoY2xzMiwgY2xzKQogCiAgICAgICAgICAgICAgICAgYSA9IEMxKDEsIDIpOyBhLmFwcGVuZCg0Mik7IGEuYXBwZW5kKDI0KQogICAgICAgICAgICAgICAgIGIgPSBDMigiaGVsbG8iLCAid29ybGQiLCA0MikKQEAgLTMzMDAsNyArMzMzNCw3IEBACiAgICAgICAgIGltcG9ydCBjb3B5CiAgICAgICAgIGZvciBjbHMgaW4gQywgQzEsIEMyOgogICAgICAgICAgICAgY2xzMiA9IGNvcHkuZGVlcGNvcHkoY2xzKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNsczIgaXMgY2xzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhjbHMyLCBjbHMpCiAKICAgICAgICAgYSA9IEMxKDEsIDIpOyBhLmFwcGVuZCg0Mik7IGEuYXBwZW5kKDI0KQogICAgICAgICBiID0gQzIoImhlbGxvIiwgIndvcmxkIiwgNDIpCkBAIC0zMzcxLDkgKzM0MDUsOSBAQAogICAgICAgICAgICAgIyBOb3cgaXQgc2hvdWxkIHdvcmsKICAgICAgICAgICAgIHggPSBDKCkKICAgICAgICAgICAgIHkgPSBwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKHgpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNhdHRyKHksICdhJyksIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEhhc0F0dHIoeSwgJ2EnKQogICAgICAgICAgICAgeSA9IGNQaWNrbGUubG9hZHMoY1BpY2tsZS5kdW1wcyh4KSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzYXR0cih5LCAnYScpLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RIYXNBdHRyKHksICdhJykKICAgICAgICAgICAgIHguYSA9IDQyCiAgICAgICAgICAgICB5ID0gcGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyh4KSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5hLCA0MikKQEAgLTM2ODksOSArMzcyMyw5IEBACiAgICAgICAgIGZyb20gdHlwZXMgaW1wb3J0IE1vZHVsZVR5cGUgYXMgTQogICAgICAgICBtID0gTS5fX25ld19fKE0pCiAgICAgICAgIHN0cihtKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2F0dHIobSwgIl9fbmFtZV9fIiksIDApCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzYXR0cihtLCAiX19maWxlX18iKSwgMCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNhdHRyKG0sICJmb28iKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RIYXNBdHRyKG0sICJfX25hbWVfXyIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SGFzQXR0cihtLCAiX19maWxlX18iKQorICAgICAgICBzZWxmLmFzc2VydE5vdEhhc0F0dHIobSwgImZvbyIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobS5fX2RpY3RfXykgICAjIE5vbmUgb3Ige30gYXJlIGJvdGggcmVhc29uYWJsZSBhbnN3ZXJzCiAgICAgICAgIG0uZm9vID0gMQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uX19kaWN0X18sIHsiZm9vIjogMX0pCkBAIC0zODcxLDggKzM5MDUsOCBAQAogICAgICAgICAgICAgX19zbG90c19fPSgpCiAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC5jaGVja19pbXBsX2RldGFpbCgpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLl9fYmFzaWNzaXplX18sIEIuX19iYXNpY3NpemVfXykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoQywgJ19fZGljdF9fJykpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKEMsICdfX3dlYWtyZWZfXycpKQorICAgICAgICBzZWxmLmFzc2VydEhhc0F0dHIoQywgJ19fZGljdF9fJykKKyAgICAgICAgc2VsZi5hc3NlcnRIYXNBdHRyKEMsICdfX3dlYWtyZWZfXycpCiAgICAgICAgIEMoKS54ID0gMgogCiAgICAgZGVmIHRlc3Rfcm11bChzZWxmKToKQEAgLTQxMTksNiArNDE1MywyMCBAQAogICAgICAgICBDLl9fbmFtZV9fID0gJ0QuRScKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoQy5fX21vZHVsZV9fLCBDLl9fbmFtZV9fKSwgKG1vZCwgJ0QuRScpKQogCisgICAgZGVmIHRlc3RfZXZpbF90eXBlX25hbWUoc2VsZik6CisgICAgICAgICMgQSBiYWRseSBwbGFjZWQgUHlfREVDUkVGIGluIHR5cGVfc2V0X25hbWUgbGVkIHRvIGFyYml0cmFyeSBjb2RlCisgICAgICAgICMgZXhlY3V0aW9uIHdoaWxlIHRoZSB0eXBlIHN0cnVjdHVyZSB3YXMgbm90IGluIGEgc2FuZSBzdGF0ZSwgYW5kIGEKKyAgICAgICAgIyBwb3NzaWJsZSBzZWdtZW50YXRpb24gZmF1bHQgYXMgYSByZXN1bHQuICBTZWUgYnVnICMxNjQ0Ny4KKyAgICAgICAgY2xhc3MgTmFzdHkoc3RyKToKKyAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIEMuX19uYW1lX18gPSAib3RoZXIiCisKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIEMuX19uYW1lX18gPSBOYXN0eSgiYWJjIikKKyAgICAgICAgQy5fX25hbWVfXyA9ICJub3JtYWwiCisKICAgICBkZWYgdGVzdF9zdWJjbGFzc19yaWdodF9vcChzZWxmKToKICAgICAgICAgIyBUZXN0aW5nIGNvcnJlY3QgZGlzcGF0Y2ggb2Ygc3ViY2xhc3Mgb3ZlcmxvYWRpbmcgX19yPG9wPl9fLi4uCiAKQEAgLTQzNTksNyArNDQwNyw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5hdHRyLCAxKQogICAgICAgICAjIHRoaXMgbWFrZXMgYSBjcmFzaCBtb3JlIGxpa2VseToKICAgICAgICAgdGVzdF9zdXBwb3J0LmdjX2NvbGxlY3QoKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2F0dHIoYywgJ2F0dHInKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SGFzQXR0cihjLCAnYXR0cicpCiAKICAgICBkZWYgdGVzdF9pbml0KHNlbGYpOgogICAgICAgICAjIFNGIDExNTU5MzgKQEAgLTQzODAsMTcgKzQ0MjgsMTcgQEAKICAgICAgICAgbCA9IFtdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobC5fX2FkZF9fLCBsLl9fYWRkX18pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobC5fX2FkZF9fLCBbXS5fX2FkZF9fKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobC5fX2FkZF9fICE9IFs1XS5fX2FkZF9fKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobC5fX2FkZF9fICE9IGwuX19tdWxfXykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGwuX19hZGRfXy5fX25hbWVfXyA9PSAnX19hZGRfXycpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwobC5fX2FkZF9fLCBbNV0uX19hZGRfXykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChsLl9fYWRkX18sIGwuX19tdWxfXykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsLl9fYWRkX18uX19uYW1lX18sICdfX2FkZF9fJykKICAgICAgICAgaWYgaGFzYXR0cihsLl9fYWRkX18sICdfX3NlbGZfXycpOgogICAgICAgICAgICAgIyBDUHl0aG9uCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobC5fX2FkZF9fLl9fc2VsZl9fIGlzIGwpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobC5fX2FkZF9fLl9fb2JqY2xhc3NfXyBpcyBsaXN0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhsLl9fYWRkX18uX19zZWxmX18sIGwpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKGwuX19hZGRfXy5fX29iamNsYXNzX18sIGxpc3QpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAjIFB5dGhvbiBpbXBsZW1lbnRhdGlvbnMgd2hlcmUgW10uX19hZGRfXyBpcyBhIG5vcm1hbCBib3VuZCBtZXRob2QKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsLl9fYWRkX18uaW1fc2VsZiBpcyBsKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGwuX19hZGRfXy5pbV9jbGFzcyBpcyBsaXN0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhsLl9fYWRkX18uaW1fc2VsZiwgbCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMobC5fX2FkZF9fLmltX2NsYXNzLCBsaXN0KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwuX19hZGRfXy5fX2RvY19fLCBsaXN0Ll9fYWRkX18uX19kb2NfXykKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaGFzaChsLl9fYWRkX18pCkBAIC00NTQxLDcgKzQ1ODksNiBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZ2V0YXR0ciwgQygpLCAiYXR0ciIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVzY3IuY291bnRlciwgNCkKIAotICAgICAgICBpbXBvcnQgZ2MKICAgICAgICAgY2xhc3MgRXZpbEdldGF0dHJpYnV0ZShvYmplY3QpOgogICAgICAgICAgICAgIyBUaGlzIHVzZWQgdG8gc2VnZmF1bHQKICAgICAgICAgICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKQEAgLTQ1NTQsNiArNDYwMSw5IEBACiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIGdldGF0dHIsIEV2aWxHZXRhdHRyaWJ1dGUoKSwgImF0dHIiKQogCisgICAgZGVmIHRlc3RfdHlwZV9fX2dldGF0dHJpYnV0ZV9fKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHR5cGUuX19nZXRhdHRyaWJ1dGVfXywgbGlzdCwgdHlwZSkKKwogICAgIGRlZiB0ZXN0X2Fic3RyYWN0bWV0aG9kcyhzZWxmKToKICAgICAgICAgIyB0eXBlIHByZXRlbmRzIG5vdCB0byBoYXZlIF9fYWJzdHJhY3RtZXRob2RzX18uCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBnZXRhdHRyLCB0eXBlLCAiX19hYnN0cmFjdG1ldGhvZHNfXyIpCkBAIC00NTcxLDcgKzQ2MjEsNyBAQAogCiAgICAgICAgIGZha2Vfc3RyID0gRmFrZVN0cigpCiAgICAgICAgICMgaXNpbnN0YW5jZSgpIHJlYWRzIF9fY2xhc3NfXyBvbiBuZXcgc3R5bGUgY2xhc3NlcwotICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShmYWtlX3N0ciwgc3RyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGZha2Vfc3RyLCBzdHIpCiAKICAgICAgICAgIyBjYWxsIGEgbWV0aG9kIGRlc2NyaXB0b3IKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgpAQCAtNDU4OCw3ICs0NjM4LDMwIEBACiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIEZvby5fX3JlcHJfXyA9IEZvby5fX3N0cl9fCiAgICAgICAgIGZvbyA9IEZvbygpCi0gICAgICAgIHN0cihmb28pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgc3RyLCBmb28pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgcmVwciwgZm9vKQorCisgICAgZGVmIHRlc3RfbWl4aW5nX3Nsb3Rfd3JhcHBlcnMoc2VsZik6CisgICAgICAgIGNsYXNzIFgoZGljdCk6CisgICAgICAgICAgICBfX3NldGF0dHJfXyA9IGRpY3QuX19zZXRpdGVtX18KKyAgICAgICAgeCA9IFgoKQorICAgICAgICB4LnkgPSA0MgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHhbInkiXSwgNDIpCisKKyAgICBkZWYgdGVzdF9jeWNsZV90aHJvdWdoX2RpY3Qoc2VsZik6CisgICAgICAgICMgU2VlIGJ1ZyAjMTQ2OTYyOQorICAgICAgICBjbGFzcyBYKGRpY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIGRpY3QuX19pbml0X18oc2VsZikKKyAgICAgICAgICAgICAgICBzZWxmLl9fZGljdF9fID0gc2VsZgorICAgICAgICB4ID0gWCgpCisgICAgICAgIHguYXR0ciA9IDQyCisgICAgICAgIHdyID0gd2Vha3JlZi5yZWYoeCkKKyAgICAgICAgZGVsIHgKKyAgICAgICAgdGVzdF9zdXBwb3J0LmdjX2NvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZSh3cigpKQorICAgICAgICBmb3IgbyBpbiBnYy5nZXRfb2JqZWN0cygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vdCh0eXBlKG8pLCBYKQogCiBjbGFzcyBEaWN0UHJveHlUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kZXNjcnR1dC5weSBiL0xpYi90ZXN0L3Rlc3RfZGVzY3J0dXQucHkKaW5kZXggMTU3YjlmNC4uMzNmZjBjOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kZXNjcnR1dC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Rlc2NydHV0LnB5CkBAIC0zMjksNyArMzI5LDcgQEAKICAgICAuLi4gICAgICAgICByZXR1cm4gc2VsZi5fX3NldChpbnN0LCB2YWx1ZSkKIAogTm93IGxldCdzIGRlZmluZSBhIGNsYXNzIHdpdGggYW4gYXR0cmlidXRlIHggZGVmaW5lZCBieSBhIHBhaXIgb2YgbWV0aG9kcywKLWdldHgoKSBhbmQgYW5kIHNldHgoKToKK2dldHgoKSBhbmQgc2V0eCgpOgogCiAgICAgPj4+IGNsYXNzIEMob2JqZWN0KToKICAgICAuLi4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGljdC5weSBiL0xpYi90ZXN0L3Rlc3RfZGljdC5weQppbmRleCAyOTE2N2QwLi5hNTY4NWI5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RpY3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kaWN0LnB5CkBAIC0zMyw5ICszMywxMSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQua2V5cygpLCBbXSkKICAgICAgICAgZCA9IHsnYSc6IDEsICdiJzogMn0KICAgICAgICAgayA9IGQua2V5cygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KGspLCB7J2EnLCAnYid9KQorICAgICAgICBzZWxmLmFzc2VydEluKCdhJywgaykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignYicsIGspCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLmhhc19rZXkoJ2EnKSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuaGFzX2tleSgnYicpKQotCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5rZXlzLCBOb25lKQogCiAgICAgZGVmIHRlc3RfdmFsdWVzKHNlbGYpOgpAQCAtMjU0LDYgKzI1NiwxNCBAQAogICAgICAgICBkID0gZGljdCh6aXAocmFuZ2UoNiksIHJhbmdlKDYpKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWN0LmZyb21rZXlzKGQsIDApLCBkaWN0KHppcChyYW5nZSg2KSwgWzBdKjYpKSkKIAorICAgICAgICBjbGFzcyBiYWRkaWN0MyhkaWN0KToKKyAgICAgICAgICAgIGRlZiBfX25ld19fKGNscyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGQKKyAgICAgICAgZCA9IHtpIDogaSBmb3IgaSBpbiByYW5nZSgxMCl9CisgICAgICAgIHJlcyA9IGQuY29weSgpCisgICAgICAgIHJlcy51cGRhdGUoYT1Ob25lLCBiPU5vbmUsIGM9Tm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYWRkaWN0My5mcm9ta2V5cyh7ImEiLCAiYiIsICJjIn0pLCByZXMpCisKICAgICBkZWYgdGVzdF9jb3B5KHNlbGYpOgogICAgICAgICBkID0gezE6MSwgMjoyLCAzOjN9CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5jb3B5KCksIHsxOjEsIDI6MiwgMzozfSkKQEAgLTI5OSw2ICszMDksMjYgQEAKICAgICAgICAgeC5mYWlsID0gVHJ1ZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGMsIGQuc2V0ZGVmYXVsdCwgeCwgW10pCiAKKyAgICBkZWYgdGVzdF9zZXRkZWZhdWx0X2F0b21pYyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTM1MjE6IHNldGRlZmF1bHQoKSBjYWxscyBfX2hhc2hfXyBhbmQgX19lcV9fIG9ubHkgb25jZS4KKyAgICAgICAgY2xhc3MgSGFzaGVkKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5oYXNoX2NvdW50ID0gMAorICAgICAgICAgICAgICAgIHNlbGYuZXFfY291bnQgPSAwCisgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5oYXNoX2NvdW50ICs9IDEKKyAgICAgICAgICAgICAgICByZXR1cm4gNDIKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHNlbGYuZXFfY291bnQgKz0gMQorICAgICAgICAgICAgICAgIHJldHVybiBpZChzZWxmKSA9PSBpZChvdGhlcikKKyAgICAgICAgaGFzaGVkMSA9IEhhc2hlZCgpCisgICAgICAgIHkgPSB7aGFzaGVkMTogNX0KKyAgICAgICAgaGFzaGVkMiA9IEhhc2hlZCgpCisgICAgICAgIHkuc2V0ZGVmYXVsdChoYXNoZWQyLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoZWQxLmhhc2hfY291bnQsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaGVkMi5oYXNoX2NvdW50LCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2hlZDEuZXFfY291bnQgKyBoYXNoZWQyLmVxX2NvdW50LCAxKQorCiAgICAgZGVmIHRlc3RfcG9waXRlbShzZWxmKToKICAgICAgICAgIyBkaWN0LnBvcGl0ZW0oKQogICAgICAgICBmb3IgY29weW1vZGUgaW4gLTEsICsxOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kaWN0Y29tcHMucHkgYi9MaWIvdGVzdC90ZXN0X2RpY3Rjb21wcy5weQppbmRleCA5YWY5ZTQ4Li4wNGNiYjJjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RpY3Rjb21wcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RpY3Rjb21wcy5weQpAQCAtMSw1NCArMSw5MSBAQAoraW1wb3J0IHVuaXR0ZXN0CiAKLWRvY3Rlc3RzID0gIiIiCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydCBhcyBzdXBwb3J0CiAKLSAgICA+Pj4gayA9ICJvbGQgdmFsdWUiCi0gICAgPj4+IHsgazogTm9uZSBmb3IgayBpbiByYW5nZSgxMCkgfQotICAgIHswOiBOb25lLCAxOiBOb25lLCAyOiBOb25lLCAzOiBOb25lLCA0OiBOb25lLCA1OiBOb25lLCA2OiBOb25lLCA3OiBOb25lLCA4OiBOb25lLCA5OiBOb25lfQotICAgID4+PiBrCi0gICAgJ29sZCB2YWx1ZScKKyMgRm9yIHNjb3BlIHRlc3RpbmcuCitnID0gIkdsb2JhbCB2YXJpYWJsZSIKIAotICAgID4+PiB7IGs6IGsrMTAgZm9yIGsgaW4gcmFuZ2UoMTApIH0KLSAgICB7MDogMTAsIDE6IDExLCAyOiAxMiwgMzogMTMsIDQ6IDE0LCA1OiAxNSwgNjogMTYsIDc6IDE3LCA4OiAxOCwgOTogMTl9CiAKLSAgICA+Pj4gZyA9ICJHbG9iYWwgdmFyaWFibGUiCi0gICAgPj4+IHsgazogZyBmb3IgayBpbiByYW5nZSgxMCkgfQotICAgIHswOiAnR2xvYmFsIHZhcmlhYmxlJywgMTogJ0dsb2JhbCB2YXJpYWJsZScsIDI6ICdHbG9iYWwgdmFyaWFibGUnLCAzOiAnR2xvYmFsIHZhcmlhYmxlJywgNDogJ0dsb2JhbCB2YXJpYWJsZScsIDU6ICdHbG9iYWwgdmFyaWFibGUnLCA2OiAnR2xvYmFsIHZhcmlhYmxlJywgNzogJ0dsb2JhbCB2YXJpYWJsZScsIDg6ICdHbG9iYWwgdmFyaWFibGUnLCA5OiAnR2xvYmFsIHZhcmlhYmxlJ30KK2NsYXNzIERpY3RDb21wcmVoZW5zaW9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLSAgICA+Pj4geyBrOiB2IGZvciBrIGluIHJhbmdlKDEwKSBmb3IgdiBpbiByYW5nZSgxMCkgaWYgayA9PSB2IH0KLSAgICB7MDogMCwgMTogMSwgMjogMiwgMzogMywgNDogNCwgNTogNSwgNjogNiwgNzogNywgODogOCwgOTogOX0KKyAgICBkZWYgdGVzdF9iYXNpY3Moc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gezA6IDEwLCAxOiAxMSwgMjogMTIsIDM6IDEzLCA0OiAxNCwgNTogMTUsIDY6IDE2LCA3OiAxNywKKyAgICAgICAgICAgICAgICAgICAgODogMTgsIDk6IDE5fQorICAgICAgICBhY3R1YWwgPSB7azogayArIDEwIGZvciBrIGluIHJhbmdlKDEwKX0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWwsIGV4cGVjdGVkKQogCi0gICAgPj4+IHsgazogdiBmb3IgdiBpbiByYW5nZSgxMCkgZm9yIGsgaW4gcmFuZ2Uodio5LCB2KjEwKSB9Ci0gICAgezk6IDEsIDE4OiAyLCAxOTogMiwgMjc6IDMsIDI4OiAzLCAyOTogMywgMzY6IDQsIDM3OiA0LCAzODogNCwgMzk6IDQsIDQ1OiA1LCA0NjogNSwgNDc6IDUsIDQ4OiA1LCA0OTogNSwgNTQ6IDYsIDU1OiA2LCA1NjogNiwgNTc6IDYsIDU4OiA2LCA1OTogNiwgNjM6IDcsIDY0OiA3LCA2NTogNywgNjY6IDcsIDY3OiA3LCA2ODogNywgNjk6IDcsIDcyOiA4LCA3MzogOCwgNzQ6IDgsIDc1OiA4LCA3NjogOCwgNzc6IDgsIDc4OiA4LCA3OTogOCwgODE6IDksIDgyOiA5LCA4MzogOSwgODQ6IDksIDg1OiA5LCA4NjogOSwgODc6IDksIDg4OiA5LCA4OTogOX0KKyAgICAgICAgZXhwZWN0ZWQgPSB7MDogMCwgMTogMSwgMjogMiwgMzogMywgNDogNCwgNTogNSwgNjogNiwgNzogNywgODogOCwgOTogOX0KKyAgICAgICAgYWN0dWFsID0ge2s6IHYgZm9yIGsgaW4gcmFuZ2UoMTApIGZvciB2IGluIHJhbmdlKDEwKSBpZiBrID09IHZ9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCkKIAotICAgID4+PiB7IHg6IHkgZm9yIHksIHggaW4gKCgxLCAyKSwgKDMsIDQpKSB9ID0gNSAjIGRvY3Rlc3Q6ICtJR05PUkVfRVhDRVBUSU9OX0RFVEFJTAotICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgICAgICAuLi4KLSAgICBTeW50YXhFcnJvcjogLi4uCisgICAgZGVmIHRlc3Rfc2NvcGVfaXNvbGF0aW9uKHNlbGYpOgorICAgICAgICBrID0gIkxvY2FsIFZhcmlhYmxlIgogCi0gICAgPj4+IHsgeDogeSBmb3IgeSwgeCBpbiAoKDEsIDIpLCAoMywgNCkpIH0gKz0gNSAjIGRvY3Rlc3Q6ICtJR05PUkVfRVhDRVBUSU9OX0RFVEFJTAotICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgICAgICAuLi4KLSAgICBTeW50YXhFcnJvcjogLi4uCisgICAgICAgIGV4cGVjdGVkID0gezA6IE5vbmUsIDE6IE5vbmUsIDI6IE5vbmUsIDM6IE5vbmUsIDQ6IE5vbmUsIDU6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgIDY6IE5vbmUsIDc6IE5vbmUsIDg6IE5vbmUsIDk6IE5vbmV9CisgICAgICAgIGFjdHVhbCA9IHtrOiBOb25lIGZvciBrIGluIHJhbmdlKDEwKX0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWwsIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGssICJMb2NhbCBWYXJpYWJsZSIpCiAKLSIiIgorICAgICAgICBleHBlY3RlZCA9IHs5OiAxLCAxODogMiwgMTk6IDIsIDI3OiAzLCAyODogMywgMjk6IDMsIDM2OiA0LCAzNzogNCwKKyAgICAgICAgICAgICAgICAgICAgMzg6IDQsIDM5OiA0LCA0NTogNSwgNDY6IDUsIDQ3OiA1LCA0ODogNSwgNDk6IDUsIDU0OiA2LAorICAgICAgICAgICAgICAgICAgICA1NTogNiwgNTY6IDYsIDU3OiA2LCA1ODogNiwgNTk6IDYsIDYzOiA3LCA2NDogNywgNjU6IDcsCisgICAgICAgICAgICAgICAgICAgIDY2OiA3LCA2NzogNywgNjg6IDcsIDY5OiA3LCA3MjogOCwgNzM6IDgsIDc0OiA4LCA3NTogOCwKKyAgICAgICAgICAgICAgICAgICAgNzY6IDgsIDc3OiA4LCA3ODogOCwgNzk6IDgsIDgxOiA5LCA4MjogOSwgODM6IDksIDg0OiA5LAorICAgICAgICAgICAgICAgICAgICA4NTogOSwgODY6IDksIDg3OiA5LCA4ODogOSwgODk6IDl9CisgICAgICAgIGFjdHVhbCA9IHtrOiB2IGZvciB2IGluIHJhbmdlKDEwKSBmb3IgayBpbiByYW5nZSh2ICogOSwgdiAqIDEwKX0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrLCAiTG9jYWwgVmFyaWFibGUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQpCiAKLV9fdGVzdF9fID0geydkb2N0ZXN0cycgOiBkb2N0ZXN0c30KKyAgICBkZWYgdGVzdF9zY29wZV9pc29sYXRpb25fZnJvbV9nbG9iYWwoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gezA6IE5vbmUsIDE6IE5vbmUsIDI6IE5vbmUsIDM6IE5vbmUsIDQ6IE5vbmUsIDU6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgIDY6IE5vbmUsIDc6IE5vbmUsIDg6IE5vbmUsIDk6IE5vbmV9CisgICAgICAgIGFjdHVhbCA9IHtnOiBOb25lIGZvciBnIGluIHJhbmdlKDEwKX0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWwsIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGcsICJHbG9iYWwgdmFyaWFibGUiKQogCi1kZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6Ci0gICAgaW1wb3J0IHN5cwotICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Ci0gICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X2RpY3Rjb21wcwotICAgIHRlc3Rfc3VwcG9ydC5ydW5fZG9jdGVzdCh0ZXN0X2RpY3Rjb21wcywgdmVyYm9zZSkKKyAgICAgICAgZXhwZWN0ZWQgPSB7OTogMSwgMTg6IDIsIDE5OiAyLCAyNzogMywgMjg6IDMsIDI5OiAzLCAzNjogNCwgMzc6IDQsCisgICAgICAgICAgICAgICAgICAgIDM4OiA0LCAzOTogNCwgNDU6IDUsIDQ2OiA1LCA0NzogNSwgNDg6IDUsIDQ5OiA1LCA1NDogNiwKKyAgICAgICAgICAgICAgICAgICAgNTU6IDYsIDU2OiA2LCA1NzogNiwgNTg6IDYsIDU5OiA2LCA2MzogNywgNjQ6IDcsIDY1OiA3LAorICAgICAgICAgICAgICAgICAgICA2NjogNywgNjc6IDcsIDY4OiA3LCA2OTogNywgNzI6IDgsIDczOiA4LCA3NDogOCwgNzU6IDgsCisgICAgICAgICAgICAgICAgICAgIDc2OiA4LCA3NzogOCwgNzg6IDgsIDc5OiA4LCA4MTogOSwgODI6IDksIDgzOiA5LCA4NDogOSwKKyAgICAgICAgICAgICAgICAgICAgODU6IDksIDg2OiA5LCA4NzogOSwgODg6IDksIDg5OiA5fQorICAgICAgICBhY3R1YWwgPSB7ZzogdiBmb3IgdiBpbiByYW5nZSgxMCkgZm9yIGcgaW4gcmFuZ2UodiAqIDksIHYgKiAxMCl9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZywgIkdsb2JhbCB2YXJpYWJsZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCkKIAotICAgICMgdmVyaWZ5IHJlZmVyZW5jZSBjb3VudGluZwotICAgIGlmIHZlcmJvc2UgYW5kIGhhc2F0dHIoc3lzLCAiZ2V0dG90YWxyZWZjb3VudCIpOgotICAgICAgICBpbXBvcnQgZ2MKLSAgICAgICAgY291bnRzID0gW05vbmVdICogNQotICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oY291bnRzKSk6Ci0gICAgICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3QodGVzdF9kaWN0Y29tcHMsIHZlcmJvc2UpCi0gICAgICAgICAgICBnYy5jb2xsZWN0KCkKLSAgICAgICAgICAgIGNvdW50c1tpXSA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKLSAgICAgICAgcHJpbnQoY291bnRzKQorICAgIGRlZiB0ZXN0X2dsb2JhbF92aXNpYmlsaXR5KHNlbGYpOgorICAgICAgICBleHBlY3RlZCA9IHswOiAnR2xvYmFsIHZhcmlhYmxlJywgMTogJ0dsb2JhbCB2YXJpYWJsZScsCisgICAgICAgICAgICAgICAgICAgIDI6ICdHbG9iYWwgdmFyaWFibGUnLCAzOiAnR2xvYmFsIHZhcmlhYmxlJywKKyAgICAgICAgICAgICAgICAgICAgNDogJ0dsb2JhbCB2YXJpYWJsZScsIDU6ICdHbG9iYWwgdmFyaWFibGUnLAorICAgICAgICAgICAgICAgICAgICA2OiAnR2xvYmFsIHZhcmlhYmxlJywgNzogJ0dsb2JhbCB2YXJpYWJsZScsCisgICAgICAgICAgICAgICAgICAgIDg6ICdHbG9iYWwgdmFyaWFibGUnLCA5OiAnR2xvYmFsIHZhcmlhYmxlJ30KKyAgICAgICAgYWN0dWFsID0ge2s6IGcgZm9yIGsgaW4gcmFuZ2UoMTApfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9sb2NhbF92aXNpYmlsaXR5KHNlbGYpOgorICAgICAgICB2ID0gIkxvY2FsIHZhcmlhYmxlIgorICAgICAgICBleHBlY3RlZCA9IHswOiAnTG9jYWwgdmFyaWFibGUnLCAxOiAnTG9jYWwgdmFyaWFibGUnLAorICAgICAgICAgICAgICAgICAgICAyOiAnTG9jYWwgdmFyaWFibGUnLCAzOiAnTG9jYWwgdmFyaWFibGUnLAorICAgICAgICAgICAgICAgICAgICA0OiAnTG9jYWwgdmFyaWFibGUnLCA1OiAnTG9jYWwgdmFyaWFibGUnLAorICAgICAgICAgICAgICAgICAgICA2OiAnTG9jYWwgdmFyaWFibGUnLCA3OiAnTG9jYWwgdmFyaWFibGUnLAorICAgICAgICAgICAgICAgICAgICA4OiAnTG9jYWwgdmFyaWFibGUnLCA5OiAnTG9jYWwgdmFyaWFibGUnfQorICAgICAgICBhY3R1YWwgPSB7azogdiBmb3IgayBpbiByYW5nZSgxMCl9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LCAiTG9jYWwgdmFyaWFibGUiKQorCisgICAgZGVmIHRlc3RfaWxsZWdhbF9hc3NpZ25tZW50KHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFN5bnRheEVycm9yLCAiY2FuJ3QgYXNzaWduIik6CisgICAgICAgICAgICBjb21waWxlKCJ7eDogeSBmb3IgeSwgeCBpbiAoKDEsIDIpLCAoMywgNCkpfSA9IDUiLCAiPHRlc3Q+IiwKKyAgICAgICAgICAgICAgICAgICAgImV4ZWMiKQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoU3ludGF4RXJyb3IsICJjYW4ndCBhc3NpZ24iKToKKyAgICAgICAgICAgIGNvbXBpbGUoInt4OiB5IGZvciB5LCB4IGluICgoMSwgMiksICgzLCA0KSl9ICs9IDUiLCAiPHRlc3Q+IiwKKyAgICAgICAgICAgICAgICAgICAgImV4ZWMiKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBzdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICB0ZXN0X21haW4odmVyYm9zZT1UcnVlKQorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RpY3R2aWV3cy5weSBiL0xpYi90ZXN0L3Rlc3RfZGljdHZpZXdzLnB5CmluZGV4IGY5MDM2NzYuLjMwY2ZiOTMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGljdHZpZXdzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGljdHZpZXdzLnB5CkBAIC0xMTIsNiArMTEyLDEzIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEudmlld2tleXMoKSBeIHNldChkMy52aWV3a2V5cygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICB7J2EnLCAnYicsICdkJywgJ2UnfSkKIAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLnZpZXdrZXlzKCkgLSBkMS52aWV3a2V5cygpLCBzZXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS52aWV3a2V5cygpIC0gZDIudmlld2tleXMoKSwgeydhJ30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEudmlld2tleXMoKSAtIGQzLnZpZXdrZXlzKCksIHsnYScsICdiJ30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEudmlld2tleXMoKSAtIHNldChkMS52aWV3a2V5cygpKSwgc2V0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEudmlld2tleXMoKSAtIHNldChkMi52aWV3a2V5cygpKSwgeydhJ30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEudmlld2tleXMoKSAtIHNldChkMy52aWV3a2V5cygpKSwgeydhJywgJ2InfSkKKwogICAgIGRlZiB0ZXN0X2l0ZW1zX3NldF9vcGVyYXRpb25zKHNlbGYpOgogICAgICAgICBkMSA9IHsnYSc6IDEsICdiJzogMn0KICAgICAgICAgZDIgPSB7J2EnOiAyLCAnYic6IDJ9CkBAIC0xNDQsNiArMTUxLDE5IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEudmlld2l0ZW1zKCkgXiBkMy52aWV3aXRlbXMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICB7KCdhJywgMSksICgnYicsIDIpLCAoJ2QnLCA0KSwgKCdlJywgNSl9KQogCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEudmlld2l0ZW1zKCkgLSBkMS52aWV3aXRlbXMoKSwgc2V0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEudmlld2l0ZW1zKCkgLSBkMi52aWV3aXRlbXMoKSwgeygnYScsIDEpfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS52aWV3aXRlbXMoKSAtIGQzLnZpZXdpdGVtcygpLCB7KCdhJywgMSksICgnYicsIDIpfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS52aWV3aXRlbXMoKSAtIHNldChkMS52aWV3aXRlbXMoKSksIHNldCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLnZpZXdpdGVtcygpIC0gc2V0KGQyLnZpZXdpdGVtcygpKSwgeygnYScsIDEpfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS52aWV3aXRlbXMoKSAtIHNldChkMy52aWV3aXRlbXMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgeygnYScsIDEpLCAoJ2InLCAyKX0pCisKKyAgICBkZWYgdGVzdF9yZWN1cnNpdmVfcmVwcihzZWxmKToKKyAgICAgICAgZCA9IHt9CisgICAgICAgIGRbNDJdID0gZC52aWV3dmFsdWVzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCByZXByLCBkKQorCiAKIAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RpZmZsaWIucHkgYi9MaWIvdGVzdC90ZXN0X2RpZmZsaWIucHkKaW5kZXggMzEwYmY5OS4uMzVmMmMzNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kaWZmbGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGlmZmxpYi5weQpAQCAtNTksNiArNTksMTUgQEAKICAgICAgICAgZGlmZl9nZW4gPSBkaWZmbGliLnVuaWZpZWRfZGlmZihbXSwgW10pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIGRpZmZfZ2VuLm5leHQpCiAKKyAgICBkZWYgdGVzdF9tYXRjaGluZ19ibG9ja3NfY2FjaGUoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzIxNjM1CisgICAgICAgIHMgPSBkaWZmbGliLlNlcXVlbmNlTWF0Y2hlcihOb25lLCAiYWJ4Y2QiLCAiYWJjZCIpCisgICAgICAgIGZpcnN0ID0gcy5nZXRfbWF0Y2hpbmdfYmxvY2tzKCkKKyAgICAgICAgc2Vjb25kID0gcy5nZXRfbWF0Y2hpbmdfYmxvY2tzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWNvbmRbMF0uc2l6ZSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWNvbmRbMV0uc2l6ZSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWNvbmRbMl0uc2l6ZSwgMCkKKwogICAgIGRlZiB0ZXN0X2FkZGVkX3RhYl9oaW50KHNlbGYpOgogICAgICAgICAjIENoZWNrIGZpeCBmb3IgYnVnICMxNDg4OTQzCiAgICAgICAgIGRpZmYgPSBsaXN0KGRpZmZsaWIuRGlmZmVyKCkuY29tcGFyZShbIlx0SSBhbSBhIGJ1Z2d5Il0sWyJcdFx0SSBhbSBhIGJ1ZyJdKSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGlzLnB5IGIvTGliL3Rlc3QvdGVzdF9kaXMucHkKaW5kZXggNmNlNGI3OS4uZGE1YmE0YiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kaXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kaXMucHkKQEAgLTEyNSw2ICsxMjUsOCBAQAogICAgICAgICAjIHNvIGZhaWxzIGlmIHRoZSB0ZXN0cyBhcmUgcnVuIHdpdGggLU8uICBTa2lwIHRoaXMgdGVzdCB0aGVuLgogICAgICAgICBpZiBfX2RlYnVnX186CiAgICAgICAgICAgICBzZWxmLmRvX2Rpc2Fzc2VtYmx5X3Rlc3QoYnVnMTMzMzk4MiwgZGlzX2J1ZzEzMzM5ODIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCduZWVkIGFzc2VydHMsIHJ1biB3aXRob3V0IC1PJykKIAogICAgIGRlZiB0ZXN0X2JpZ19saW5lbm9zKHNlbGYpOgogICAgICAgICBkZWYgZnVuYyhjb3VudCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RsLnB5IGIvTGliL3Rlc3QvdGVzdF9kbC5weQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDYwNjlhNzcuLmRhOTczMGYKLS0tIGEvTGliL3Rlc3QvdGVzdF9kbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RsLnB5CkBAIC0xLDQgKzEsMyBAQAotIyEgL3Vzci9iaW4vZW52IHB5dGhvbgogIiIiVGVzdCBkbG1vZHVsZS5jCiAgICBSb2dlciBFLiBNYXNzZSAgcmV2aXNlZCBzdHJhdGVneSBieSBCYXJyeSBXYXJzYXcKICIiIgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kb2N0ZXN0LnB5IGIvTGliL3Rlc3QvdGVzdF9kb2N0ZXN0LnB5CmluZGV4IGRmMzNlNzAuLmE1OGM0YWUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZG9jdGVzdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RvY3Rlc3QucHkKQEAgLTI1OCw2ICsyNTgsMjEgQEAKICAgICA+Pj4gZSA9IGRvY3Rlc3QuRXhhbXBsZSgncmFpc2UgWCgpJywgJycsIGV4Y19tc2cpCiAgICAgPj4+IGUuZXhjX21zZwogICAgICdcbicKKworQ29tcGFyZSBgRXhhbXBsZWA6CisgICAgPj4+IGV4YW1wbGUgPSBkb2N0ZXN0LkV4YW1wbGUoJ3ByaW50IDEnLCAnMVxuJykKKyAgICA+Pj4gc2FtZV9leGFtcGxlID0gZG9jdGVzdC5FeGFtcGxlKCdwcmludCAxJywgJzFcbicpCisgICAgPj4+IG90aGVyX2V4YW1wbGUgPSBkb2N0ZXN0LkV4YW1wbGUoJ3ByaW50IDQyJywgJzQyXG4nKQorICAgID4+PiBleGFtcGxlID09IHNhbWVfZXhhbXBsZQorICAgIFRydWUKKyAgICA+Pj4gZXhhbXBsZSAhPSBzYW1lX2V4YW1wbGUKKyAgICBGYWxzZQorICAgID4+PiBoYXNoKGV4YW1wbGUpID09IGhhc2goc2FtZV9leGFtcGxlKQorICAgIFRydWUKKyAgICA+Pj4gZXhhbXBsZSA9PSBvdGhlcl9leGFtcGxlCisgICAgRmFsc2UKKyAgICA+Pj4gZXhhbXBsZSAhPSBvdGhlcl9leGFtcGxlCisgICAgVHJ1ZQogIiIiCiAKIGRlZiB0ZXN0X0RvY1Rlc3QoKTogciIiIgpAQCAtMzQ3LDYgKzM2Miw1MCBAQAogICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICBWYWx1ZUVycm9yOiBsaW5lIDIgb2YgdGhlIGRvY3N0cmluZyBmb3Igc29tZV90ZXN0IGxhY2tzIGJsYW5rIGFmdGVyIC4uLjogJy4uLnByaW50IDEnCiAKK0NvbXBhcmUgYERvY1Rlc3RgOgorCisgICAgPj4+IGRvY3N0cmluZyA9ICcnJworICAgIC4uLiAgICAgPj4+IHByaW50IDEyCisgICAgLi4uICAgICAxMgorICAgIC4uLiAnJycKKyAgICA+Pj4gdGVzdCA9IHBhcnNlci5nZXRfZG9jdGVzdChkb2NzdHJpbmcsIGdsb2JzLCAnc29tZV90ZXN0JywKKyAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAnc29tZV90ZXN0JywgMjApCisgICAgPj4+IHNhbWVfdGVzdCA9IHBhcnNlci5nZXRfZG9jdGVzdChkb2NzdHJpbmcsIGdsb2JzLCAnc29tZV90ZXN0JywKKyAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb21lX3Rlc3QnLCAyMCkKKyAgICA+Pj4gdGVzdCA9PSBzYW1lX3Rlc3QKKyAgICBUcnVlCisgICAgPj4+IHRlc3QgIT0gc2FtZV90ZXN0CisgICAgRmFsc2UKKyAgICA+Pj4gaGFzaCh0ZXN0KSA9PSBoYXNoKHNhbWVfdGVzdCkKKyAgICBUcnVlCisgICAgPj4+IGRvY3N0cmluZyA9ICcnJworICAgIC4uLiAgICAgPj4+IHByaW50IDQyCisgICAgLi4uICAgICA0MgorICAgIC4uLiAnJycKKyAgICA+Pj4gb3RoZXJfdGVzdCA9IHBhcnNlci5nZXRfZG9jdGVzdChkb2NzdHJpbmcsIGdsb2JzLCAnb3RoZXJfdGVzdCcsCisgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ290aGVyX2ZpbGUnLCAxMCkKKyAgICA+Pj4gdGVzdCA9PSBvdGhlcl90ZXN0CisgICAgRmFsc2UKKyAgICA+Pj4gdGVzdCAhPSBvdGhlcl90ZXN0CisgICAgVHJ1ZQorCitDb21wYXJlIGBEb2NUZXN0Q2FzZWA6CisKKyAgICA+Pj4gRG9jVGVzdENhc2UgPSBkb2N0ZXN0LkRvY1Rlc3RDYXNlCisgICAgPj4+IHRlc3RfY2FzZSA9IERvY1Rlc3RDYXNlKHRlc3QpCisgICAgPj4+IHNhbWVfdGVzdF9jYXNlID0gRG9jVGVzdENhc2Uoc2FtZV90ZXN0KQorICAgID4+PiBvdGhlcl90ZXN0X2Nhc2UgPSBEb2NUZXN0Q2FzZShvdGhlcl90ZXN0KQorICAgID4+PiB0ZXN0X2Nhc2UgPT0gc2FtZV90ZXN0X2Nhc2UKKyAgICBUcnVlCisgICAgPj4+IHRlc3RfY2FzZSAhPSBzYW1lX3Rlc3RfY2FzZQorICAgIEZhbHNlCisgICAgPj4+IGhhc2godGVzdF9jYXNlKSA9PSBoYXNoKHNhbWVfdGVzdF9jYXNlKQorICAgIFRydWUKKyAgICA+Pj4gdGVzdCA9PSBvdGhlcl90ZXN0X2Nhc2UKKyAgICBGYWxzZQorICAgID4+PiB0ZXN0ICE9IG90aGVyX3Rlc3RfY2FzZQorICAgIFRydWUKKwogIiIiCiAKIGRlZiB0ZXN0X0RvY1Rlc3RGaW5kZXIoKTogciIiIgpAQCAtOTYwLDYgKzEwMTksMzMgQEAKICAgICAgICAgVmFsdWVFcnJvcjogbWVzc2FnZQogICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0xLCBhdHRlbXB0ZWQ9MSkKIAorSWYgdGhlIGV4Y2VwdGlvbiBkb2VzIG5vdCBoYXZlIGEgbWVzc2FnZSwgeW91IGNhbiBzdGlsbCB1c2UKK0lHTk9SRV9FWENFUFRJT05fREVUQUlMIHRvIG5vcm1hbGl6ZSB0aGUgbW9kdWxlcyBiZXR3ZWVuIFB5dGhvbiAyIGFuZCAzOgorCisgICAgPj4+IGRlZiBmKHgpOgorICAgIC4uLiAgICAgcicnJworICAgIC4uLiAgICAgPj4+IGZyb20gUXVldWUgaW1wb3J0IEVtcHR5CisgICAgLi4uICAgICA+Pj4gcmFpc2UgRW1wdHkoKSAjZG9jdGVzdDogK0lHTk9SRV9FWENFUFRJT05fREVUQUlMCisgICAgLi4uICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgLi4uICAgICBmb28uYmFyLkVtcHR5CisgICAgLi4uICAgICAnJycKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KKyAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UpLnJ1bih0ZXN0KQorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MikKKworTm90ZSB0aGF0IGEgdHJhaWxpbmcgY29sb24gZG9lc24ndCBtYXR0ZXIgZWl0aGVyOgorCisgICAgPj4+IGRlZiBmKHgpOgorICAgIC4uLiAgICAgcicnJworICAgIC4uLiAgICAgPj4+IGZyb20gUXVldWUgaW1wb3J0IEVtcHR5CisgICAgLi4uICAgICA+Pj4gcmFpc2UgRW1wdHkoKSAjZG9jdGVzdDogK0lHTk9SRV9FWENFUFRJT05fREVUQUlMCisgICAgLi4uICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgLi4uICAgICBmb28uYmFyLkVtcHR5OgorICAgIC4uLiAgICAgJycnCisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTIpCisKIElmIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQgYnV0IG5vdCBleHBlY3RlZCwgdGhlbiBpdCBpcyByZXBvcnRlZCBhcyBhbgogdW5leHBlY3RlZCBleGNlcHRpb246CiAKQEAgLTE5NDcsNiArMjAzMywzMSBAQAogICAgICAgICAgPj4+IHN1aXRlLnJ1bih1bml0dGVzdC5UZXN0UmVzdWx0KCkpCiAgICAgICAgICA8dW5pdHRlc3QucmVzdWx0LlRlc3RSZXN1bHQgcnVuPTkgZXJyb3JzPTAgZmFpbHVyZXM9ND4KIAorICAgICAgIFRoZSBtb2R1bGUgbmVlZCBub3QgY29udGFpbiBhbnkgZG9jdGVzdCBleGFtcGxlczoKKworICAgICAgICAgPj4+IHN1aXRlID0gZG9jdGVzdC5Eb2NUZXN0U3VpdGUoJ3Rlc3Quc2FtcGxlX2RvY3Rlc3Rfbm9fZG9jdGVzdHMnKQorICAgICAgICAgPj4+IHN1aXRlLnJ1bih1bml0dGVzdC5UZXN0UmVzdWx0KCkpCisgICAgICAgICA8dW5pdHRlc3QucmVzdWx0LlRlc3RSZXN1bHQgcnVuPTAgZXJyb3JzPTAgZmFpbHVyZXM9MD4KKworICAgICAgIEhvd2V2ZXIsIGlmIERvY1Rlc3RTdWl0ZSBmaW5kcyBubyBkb2NzdHJpbmdzLCBpdCByYWlzZXMgYW4gZXJyb3I6CisKKyAgICAgICAgID4+PiB0cnk6CisgICAgICAgICAuLi4gICAgIGRvY3Rlc3QuRG9jVGVzdFN1aXRlKCd0ZXN0LnNhbXBsZV9kb2N0ZXN0X25vX2RvY3N0cmluZ3MnKQorICAgICAgICAgLi4uIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGU6CisgICAgICAgICAuLi4gICAgIGVycm9yID0gZQorCisgICAgICAgICA+Pj4gcHJpbnQoZXJyb3IuYXJnc1sxXSkKKyAgICAgICAgIGhhcyBubyBkb2NzdHJpbmdzCisKKyAgICAgICBZb3UgY2FuIHByZXZlbnQgdGhpcyBlcnJvciBieSBwYXNzaW5nIGEgRG9jVGVzdEZpbmRlciBpbnN0YW5jZSB3aXRoCisgICAgICAgdGhlIGBleGNsdWRlX2VtcHR5YCBrZXl3b3JkIGFyZ3VtZW50IHNldCB0byBGYWxzZToKKworICAgICAgICAgPj4+IGZpbmRlciA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcihleGNsdWRlX2VtcHR5PUZhbHNlKQorICAgICAgICAgPj4+IHN1aXRlID0gZG9jdGVzdC5Eb2NUZXN0U3VpdGUoJ3Rlc3Quc2FtcGxlX2RvY3Rlc3Rfbm9fZG9jc3RyaW5ncycsCisgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2ZpbmRlcj1maW5kZXIpCisgICAgICAgICA+Pj4gc3VpdGUucnVuKHVuaXR0ZXN0LlRlc3RSZXN1bHQoKSkKKyAgICAgICAgIDx1bml0dGVzdC5yZXN1bHQuVGVzdFJlc3VsdCBydW49MCBlcnJvcnM9MCBmYWlsdXJlcz0wPgorCiAgICAgICAgV2UgY2FuIHVzZSB0aGUgY3VycmVudCBtb2R1bGU6CiAKICAgICAgICAgID4+PiBzdWl0ZSA9IHRlc3Quc2FtcGxlX2RvY3Rlc3QudGVzdF9zdWl0ZSgpCkBAIC0yNTg5LDcgKzI3MDAsOSBAQAogICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9kb2N0ZXN0CiAKICAgICAjIElnbm9yZSBhbGwgd2FybmluZ3MgYWJvdXQgdGhlIHVzZSBvZiBjbGFzcyBUZXN0ZXIgaW4gdGhpcyBtb2R1bGUuCi0gICAgZGVwcmVjYXRpb25zID0gWygiY2xhc3MgVGVzdGVyIGlzIGRlcHJlY2F0ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpXQorICAgIGRlcHJlY2F0aW9ucyA9IFtdCisgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICBkZXByZWNhdGlvbnMuYXBwZW5kKCgiY2xhc3MgVGVzdGVyIGlzIGRlcHJlY2F0ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpKQogICAgIGlmIHN5cy5weTNrd2FybmluZzoKICAgICAgICAgZGVwcmVjYXRpb25zICs9IFsoImJhY2txdW90ZSBub3Qgc3VwcG9ydGVkIiwgU3ludGF4V2FybmluZyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgKCJleGVjZmlsZS4uIG5vdCBzdXBwb3J0ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpXQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kb2N4bWxycGMucHkgYi9MaWIvdGVzdC90ZXN0X2RvY3htbHJwYy5weQppbmRleCA3MTYzMzNlLi44MGQxODAzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RvY3htbHJwYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RvY3htbHJwYy5weQpAQCAtMTAwLDcgKzEwMCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcG9uc2Uuc3RhdHVzLCAyMDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcG9uc2UuZ2V0aGVhZGVyKCJDb250ZW50LXR5cGUiKSwgInRleHQvaHRtbCIpCiAKLSAgICAgICAgIyBTZXJ2ZXIgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB3ZSBkb24ndCBzdGFydCB0byByZWFkIHRoZSBkYXRhCisgICAgICAgICMgU2VydmVyIHJhaXNlcyBhbiBleGNlcHRpb24gaWYgd2UgZG9uJ3Qgc3RhcnQgdG8gcmVhZCB0aGUgZGF0YQogICAgICAgICByZXNwb25zZS5yZWFkKCkKIAogICAgIGRlZiB0ZXN0X2ludmFsaWRfZ2V0X3Jlc3BvbnNlKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kdW1iZGJtLnB5IGIvTGliL3Rlc3QvdGVzdF9kdW1iZGJtLnB5CmluZGV4IDA0MWZhYzEuLjZmNTMyNGYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZHVtYmRibS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2R1bWJkYm0ucHkKQEAgLTEsNCArMSwzIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCiAiIiJUZXN0IHNjcmlwdCBmb3IgdGhlIGR1bWJkYm0gbW9kdWxlCiAgICBPcmlnaW5hbCBieSBSb2dlciBFLiBNYXNzZQogIiIiCkBAIC0zOCwxMSArMzcsOSBAQAogICAgICAgICBzZWxmLnJlYWRfaGVscGVyKGYpCiAgICAgICAgIGYuY2xvc2UoKQogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2NobW9kJyksICdvcy5jaG1vZCBub3QgYXZhaWxhYmxlJykKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAndW1hc2snKSwgJ29zLnVtYXNrIG5vdCBhdmFpbGFibGUnKQogICAgIGRlZiB0ZXN0X2R1bWJkYm1fY3JlYXRpb25fbW9kZShzZWxmKToKLSAgICAgICAgIyBPbiBwbGF0Zm9ybXMgd2l0aG91dCBjaG1vZCwgZG9uJ3QgZG8gYW55dGhpbmcuCi0gICAgICAgIGlmIG5vdCAoaGFzYXR0cihvcywgJ2NobW9kJykgYW5kIGhhc2F0dHIob3MsICd1bWFzaycpKToKLSAgICAgICAgICAgIHJldHVybgotCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG9sZF91bWFzayA9IG9zLnVtYXNrKDAwMDIpCiAgICAgICAgICAgICBmID0gZHVtYmRibS5vcGVuKF9mbmFtZSwgJ2MnLCAwNjM3KQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9lbWFpbC5weSBiL0xpYi90ZXN0L3Rlc3RfZW1haWwucHkKaW5kZXggY2I0ZWU2MC4uYWI2ZTBiMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9lbWFpbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2VtYWlsLnB5CkBAIC0zLDEwICszLDEyIEBACiAKICMgVGhlIHNwZWNpZmljIHRlc3RzIG5vdyBsaXZlIGluIExpYi9lbWFpbC90ZXN0CiBmcm9tIGVtYWlsLnRlc3QudGVzdF9lbWFpbCBpbXBvcnQgc3VpdGUKK2Zyb20gZW1haWwudGVzdC50ZXN0X2VtYWlsX3JlbmFtZWQgaW1wb3J0IHN1aXRlIGFzIHN1aXRlMgogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3Qoc3VpdGUoKSkKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KHN1aXRlMigpKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2VudW1lcmF0ZS5weSBiL0xpYi90ZXN0L3Rlc3RfZW51bWVyYXRlLnB5CmluZGV4IDZiOWZmNzkuLmFhYzRkYTcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZW51bWVyYXRlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZW51bWVyYXRlLnB5CkBAIC0xODgsMTEgKzE4OCwxMCBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJldmVyc2VkKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJldmVyc2VkLCBbXSwgJ2V4dHJhJykKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIoc3lzLCAnZ2V0cmVmY291bnQnKSwgJ3Rlc3QgbmVlZHMgc3lzLmdldHJlZmNvdW50KCknKQogICAgIGRlZiB0ZXN0X2J1ZzEyMjk0Mjkoc2VsZik6CiAgICAgICAgICMgdGhpcyBidWcgd2FzIG5ldmVyIGluIHJldmVyc2VkLCBpdCB3YXMgaW4KICAgICAgICAgIyBQeU9iamVjdF9DYWxsTWV0aG9kLCBhbmQgcmV2ZXJzZWRfbmV3IGNhbGxzIHRoYXQgc29tZXRpbWVzLgotICAgICAgICBpZiBub3QgaGFzYXR0cihzeXMsICJnZXRyZWZjb3VudCIpOgotICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIGRlZiBmKCk6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIHIgPSBmLl9fcmV2ZXJzZWRfXyA9IG9iamVjdCgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2VvZi5weSBiL0xpYi90ZXN0L3Rlc3RfZW9mLnB5CmluZGV4IDc2MzkxN2YuLjdkZTQ2ODYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZW9mLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZW9mLnB5CkBAIC0xLDQgKzEsMyBAQAotIyEgL3Vzci9iaW4vZW52IHB5dGhvbgogIiIidGVzdCBzY3JpcHQgZm9yIGEgZmV3IG5ldyBpbnZhbGlkIHRva2VuIGNhdGNoZXMiIiIKIAogaW1wb3J0IHVuaXR0ZXN0CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Vwb2xsLnB5IGIvTGliL3Rlc3QvdGVzdF9lcG9sbC5weQppbmRleCAyMTZlMmM3Li5jZDU3MjJmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Vwb2xsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZXBvbGwucHkKQEAgLTM2LDYgKzM2LDcgQEAKIGV4Y2VwdCBJT0Vycm9yLCBlOgogICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRU5PU1lTOgogICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgia2VybmVsIGRvZXNuJ3Qgc3VwcG9ydCBlcG9sbCgpIikKKyAgICByYWlzZQogCiBjbGFzcyBUZXN0RVBvbGwodW5pdHRlc3QuVGVzdENhc2UpOgogCkBAIC0xNjMsMTEgKzE2NCw4IEBACiAgICAgICAgIGV4cGVjdGVkLnNvcnQoKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZlbnRzLCBleHBlY3RlZCkKLSAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0aGVuIC0gbm93ID4gMC4wMSwgdGhlbiAtIG5vdykKIAotICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQogICAgICAgICBldmVudHMgPSBlcC5wb2xsKHRpbWVvdXQ9Mi4xLCBtYXhldmVudHM9NCkKLSAgICAgICAgdGhlbiA9IHRpbWUudGltZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZXZlbnRzKQogCiAgICAgICAgIGNsaWVudC5zZW5kKCJIZWxsbyEiKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9lcnJuby5weSBiL0xpYi90ZXN0L3Rlc3RfZXJybm8ucHkKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBiYjg5MThmLi43YTM3ZDNhCi0tLSBhL0xpYi90ZXN0L3Rlc3RfZXJybm8ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9lcnJuby5weQpAQCAtMSw0ICsxLDMgQEAKLSMhIC91c3IvYmluL2VudiBweXRob24KICIiIlRlc3QgdGhlIGVycm5vIG1vZHVsZQogICAgUm9nZXIgRS4gTWFzc2UKICIiIgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9leGNlcHRpb25zLnB5IGIvTGliL3Rlc3QvdGVzdF9leGNlcHRpb25zLnB5CmluZGV4IDIxNjA2NDEuLmRjMDJjYjMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZXhjZXB0aW9ucy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2V4Y2VwdGlvbnMucHkKQEAgLTQzMSw2ICs0MzEsMTIgQEAKICAgICAgICAgdS5zdGFydCA9IDEwMDAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodSksICJjYW4ndCB0cmFuc2xhdGUgY2hhcmFjdGVycyBpbiBwb3NpdGlvbiAxMDAwLTQ6IDk2NTIzMDk1MTQ0MzY4NTcyNDk5NyIpCiAKKyAgICBkZWYgdGVzdF91bmljb2RlX2Vycm9yc19ub19vYmplY3Qoc2VsZik6CisgICAgICAgICMgU2VlIGlzc3VlICMyMTEzNC4KKyAgICAgICAga2xhc3NlcyA9IFVuaWNvZGVFbmNvZGVFcnJvciwgVW5pY29kZURlY29kZUVycm9yLCBVbmljb2RlVHJhbnNsYXRlRXJyb3IKKyAgICAgICAgZm9yIGtsYXNzIGluIGtsYXNzZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihrbGFzcy5fX25ld19fKGtsYXNzKSksICIiKQorCiAgICAgZGVmIHRlc3RfYmFkaXNpbnN0YW5jZShzZWxmKToKICAgICAgICAgIyBCdWcgIzI1NDI6IGlmIGlzc3ViY2xhc3MoZSwgTXlFeGNlcHRpb24pIHJhaXNlcyBhbiBleGNlcHRpb24sCiAgICAgICAgICMgaXQgc2hvdWxkIGJlIGlnbm9yZWQKQEAgLTQ3OSw2ICs0ODUsMTggQEAKICAgICAgICAgZXhjZXB0IEFzc2VydGlvbkVycm9yIGFzIGU6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlKSwgIigzLCkiKQogCisgICAgZGVmIHRlc3RfYmFkX2V4Y2VwdGlvbl9jbGVhcmluZyhzZWxmKToKKyAgICAgICAgIyBTZWUgaXNzdWUgMTY0NDU6IHVzZSBvZiBQeV9YREVDUkVGIGluc3RlYWQgb2YgUHlfQ0xFQVIgaW4KKyAgICAgICAgIyBCYXNlRXhjZXB0aW9uX3NldF9tZXNzYWdlIGdhdmUgYSBwb3NzaWJsZSB3YXkgdG8gc2VnZmF1bHQgdGhlCisgICAgICAgICMgaW50ZXJwcmV0ZXIuCisgICAgICAgIGNsYXNzIE5hc3R5KHN0cik6CisgICAgICAgICAgICBkZWYgX19kZWxfXyhtZXNzYWdlKToKKyAgICAgICAgICAgICAgICBkZWwgZS5tZXNzYWdlCisKKyAgICAgICAgZSA9IFZhbHVlRXJyb3IoTmFzdHkoIm1zZyIpKQorICAgICAgICBlLmFyZ3MgPSAoKQorICAgICAgICBkZWwgZS5tZXNzYWdlCisKIAogIyBIZWxwZXIgY2xhc3MgdXNlZCBieSBUZXN0U2FtZVN0ckFuZFVuaWNvZGVNc2cKIGNsYXNzIEV4Y1dpdGhPdmVycmlkZGVuU3RyKEV4Y2VwdGlvbik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZjbnRsLnB5IGIvTGliL3Rlc3QvdGVzdF9mY250bC5weQppbmRleCBkZjA5MzkxLi4zYTE4MDMxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ZjbnRsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZmNudGwucHkKQEAgLTgsOSArOCw5IEBACiBpbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0ICh2ZXJib3NlLCBURVNURk4sIHVubGluaywgcnVuX3VuaXR0ZXN0LAotICAgIGltcG9ydF9tb2R1bGUpCisgICAgaW1wb3J0X21vZHVsZSwgY3B5dGhvbl9vbmx5KQogCi0jIFNraXAgdGVzdCBpZiBubyBmbmN0bCBtb2R1bGUuCisjIFNraXAgdGVzdCBpZiBubyBmY250bCBtb2R1bGUuCiBmY250bCA9IGltcG9ydF9tb2R1bGUoJ2ZjbnRsJykKIAogCkBAIC01MSw2ICs1MSwxMiBAQAogbG9ja2RhdGEgPSBnZXRfbG9ja2RhdGEoKQogCiAKK2NsYXNzIEJhZEZpbGU6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZuKToKKyAgICAgICAgc2VsZi5mbiA9IGZuCisgICAgZGVmIGZpbGVubyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZm4KKwogY2xhc3MgVGVzdEZjbnRsKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiBzZXRVcChzZWxmKToKQEAgLTgxLDYgKzg3LDI5IEBACiAgICAgICAgICAgICBydiA9IGZjbnRsLmZjbnRsKHNlbGYuZiwgZmNudGwuRl9TRVRMS1csIGxvY2tkYXRhKQogICAgICAgICBzZWxmLmYuY2xvc2UoKQogCisgICAgZGVmIHRlc3RfZmNudGxfYmFkX2ZpbGUoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICBmY250bC5mY250bCgtMSwgZmNudGwuRl9TRVRGTCwgb3MuT19OT05CTE9DSykKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIGZjbnRsLmZjbnRsKEJhZEZpbGUoLTEpLCBmY250bC5GX1NFVEZMLCBvcy5PX05PTkJMT0NLKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBmY250bC5mY250bCgnc3BhbScsIGZjbnRsLkZfU0VURkwsIG9zLk9fTk9OQkxPQ0spCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIGZjbnRsLmZjbnRsKEJhZEZpbGUoJ3NwYW0nKSwgZmNudGwuRl9TRVRGTCwgb3MuT19OT05CTE9DSykKKworICAgIEBjcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdF9mY250bF9iYWRfZmlsZV9vdmVyZmxvdyhzZWxmKToKKyAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IElOVF9NQVgsIElOVF9NSU4KKyAgICAgICAgIyBJc3N1ZSAxNTk4OQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgZmNudGwuZmNudGwoSU5UX01BWCArIDEsIGZjbnRsLkZfU0VURkwsIG9zLk9fTk9OQkxPQ0spCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICBmY250bC5mY250bChCYWRGaWxlKElOVF9NQVggKyAxKSwgZmNudGwuRl9TRVRGTCwgb3MuT19OT05CTE9DSykKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIGZjbnRsLmZjbnRsKElOVF9NSU4gLSAxLCBmY250bC5GX1NFVEZMLCBvcy5PX05PTkJMT0NLKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgZmNudGwuZmNudGwoQmFkRmlsZShJTlRfTUlOIC0gMSksIGZjbnRsLkZfU0VURkwsIG9zLk9fTk9OQkxPQ0spCisKICAgICBkZWYgdGVzdF9mY250bF82NF9iaXQoc2VsZik6CiAgICAgICAgICMgSXNzdWUgIzEzMDkzNTI6IGZjbnRsIHNob3VsZG4ndCBmYWlsIHdoZW4gdGhlIHRoaXJkIGFyZyBmaXRzIGluIGEKICAgICAgICAgIyBDICdsb25nJyBidXQgbm90IGluIGEgQyAnaW50Jy4KQEAgLTkyLDcgKzEyMSwxMCBAQAogICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiRl9OT1RJRlkgb3IgRE5fTVVMVElTSE9UIHVuYXZhaWxhYmxlIikKICAgICAgICAgZmQgPSBvcy5vcGVuKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoVEVTVEZOKSksIG9zLk9fUkRPTkxZKQogICAgICAgICB0cnk6CisgICAgICAgICAgICAjIFRoaXMgd2lsbCByYWlzZSBPdmVyZmxvd0Vycm9yIGlmIGlzc3VlMTMwOTM1MiBpcyBwcmVzZW50LgogICAgICAgICAgICAgZmNudGwuZmNudGwoZmQsIGNtZCwgZmxhZ3MpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgcGFzcyAgIyBSdW5uaW5nIG9uIGEgc3lzdGVtIHRoYXQgZG9lc24ndCBzdXBwb3J0IHRoZXNlIGZsYWdzLgogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgb3MuY2xvc2UoZmQpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZmlsZS5weSBiL0xpYi90ZXN0L3Rlc3RfZmlsZS5weQppbmRleCBkZmZhNGI1Li40ZjJjOWVmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ZpbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9maWxlLnB5CkBAIC0xNTQsMTYgKzE1NCw2IEBACiAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCclciBpcyBhbiBpbnZhbGlkIGZpbGUgbW9kZScgJSBtb2RlKQogCi0gICAgZGVmIHRlc3RTdGRpbihzZWxmKToKLSAgICAgICAgIyBUaGlzIGNhdXNlcyB0aGUgaW50ZXJwcmV0ZXIgdG8gZXhpdCBvbiBPU0YxIHY1LjEuCi0gICAgICAgIGlmIHN5cy5wbGF0Zm9ybSAhPSAnb3NmMVY1JzoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChJT0Vycm9yLCBWYWx1ZUVycm9yKSwgc3lzLnN0ZGluLnNlZWssIC0xKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcHJpbnQoKAotICAgICAgICAgICAgICAgICcgIFNraXBwaW5nIHN5cy5zdGRpbi5zZWVrKC0xKSwgaXQgbWF5IGNyYXNoIHRoZSBpbnRlcnByZXRlci4nCi0gICAgICAgICAgICAgICAgJyBUZXN0IG1hbnVhbGx5LicpLCBmaWxlPXN5cy5fX3N0ZG91dF9fKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoSU9FcnJvciwgVmFsdWVFcnJvciksIHN5cy5zdGRpbi50cnVuY2F0ZSkKLQogICAgIGRlZiB0ZXN0QmFkTW9kZUFyZ3VtZW50KHNlbGYpOgogICAgICAgICAjIHZlcmlmeSB0aGF0IHdlIGdldCBhIHNlbnNpYmxlIGVycm9yIG1lc3NhZ2UgZm9yIGJhZCBtb2RlIGFyZ3VtZW50CiAgICAgICAgIGJhZF9tb2RlID0gInF3ZXJ0eSIKQEAgLTMxMCw2ICszMDAsNyBAQAogICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgicmVhZGxpbmVzKCkgYWZ0ZXIgbmV4dCgpIHdpdGggZW1wdHkgYnVmZmVyICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZC4gR290ICVyLCBleHBlY3RlZCAlciIgJSAobGluZSwgdGVzdGxpbmUpKQogICAgICAgICAgICAgIyBSZWFkaW5nIGFmdGVyIGl0ZXJhdGlvbiBoaXQgRU9GIHNob3VsZG4ndCBodXJ0IGVpdGhlcgorICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgICBmID0gc2VsZi5vcGVuKFRFU1RGTiwgJ3JiJykKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBmOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9maWxlMmsucHkgYi9MaWIvdGVzdC90ZXN0X2ZpbGUyay5weQppbmRleCAzOTlmMTE5Li5mYWUxZGI2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ZpbGUyay5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ZpbGUyay5weQpAQCAtMiw2ICsyLDkgQEAKIGltcG9ydCBvcwogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgaXRlcnRvb2xzCitpbXBvcnQgc2VsZWN0CitpbXBvcnQgc2lnbmFsCitpbXBvcnQgc3VicHJvY2VzcwogaW1wb3J0IHRpbWUKIGZyb20gYXJyYXkgaW1wb3J0IGFycmF5CiBmcm9tIHdlYWtyZWYgaW1wb3J0IHByb3h5CkBAIC04Niw5ICs4OSwyMyBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZi53cml0ZWxpbmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBbTm9uU3RyaW5nKCksIE5vblN0cmluZygpXSkKIAorICAgIGRlZiB0ZXN0V3JpdGVsaW5lc0J1ZmZlcihzZWxmKToKKyAgICAgICAgc2VsZi5mLndyaXRlbGluZXMoW2FycmF5KCdjJywgJ2FiYycpXSkKKyAgICAgICAgc2VsZi5mLmNsb3NlKCkKKyAgICAgICAgc2VsZi5mID0gb3BlbihURVNURk4sICdyYicpCisgICAgICAgIGJ1ZiA9IHNlbGYuZi5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYsICdhYmMnKQorCiAgICAgZGVmIHRlc3RSZXByKHNlbGYpOgogICAgICAgICAjIHZlcmlmeSByZXByIHdvcmtzCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKHNlbGYuZikuc3RhcnRzd2l0aCgiPG9wZW4gZmlsZSAnIiArIFRFU1RGTikpCisgICAgICAgICMgc2VlIGlzc3VlICMxNDE2MQorICAgICAgICAjIFdpbmRvd3MgZG9lc24ndCBsaWtlIFxyXG5cdCIgaW4gdGhlIGZpbGUgbmFtZSwgYnV0ICcgaXMgb2sKKyAgICAgICAgZm5hbWUgPSAneHhccnh4XG54eFwneHgieHgnIGlmIHN5cy5wbGF0Zm9ybSAhPSAid2luMzIiIGVsc2UgInh4J3h4IgorICAgICAgICB3aXRoIG9wZW4oZm5hbWUsICd3JykgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy5yZW1vdmUsIGZuYW1lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcHIoZikuc3RhcnRzd2l0aCgKKyAgICAgICAgICAgICAgICAgICAgIjxvcGVuIGZpbGUgJXIsIG1vZGUgJ3cnIGF0IiAlIGZuYW1lKSkKIAogICAgIGRlZiB0ZXN0RXJyb3JzKHNlbGYpOgogICAgICAgICBzZWxmLmYuY2xvc2UoKQpAQCAtNDA1LDYgKzQyMiwyMCBAQAogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgb3MudW5saW5rKFRFU1RGTikKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKG9zLm5hbWUgPT0gJ3Bvc2l4JywgJ3Rlc3QgcmVxdWlyZXMgYSBwb3NpeCBzeXN0ZW0uJykKKyAgICBkZWYgdGVzdF93cml0ZV9mdWxsKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxNzk3NgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gb3BlbignL2Rldi9mdWxsJywgJ3cnLCAxKQorICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoInJlcXVpcmVzICcvZGV2L2Z1bGwnIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yKToKKyAgICAgICAgICAgICAgICBmLndyaXRlKCdoZWxsbycpCisgICAgICAgICAgICAgICAgZi53cml0ZSgnXG4nKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisKIGNsYXNzIEZpbGVTdWJjbGFzc1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0RXhpdChzZWxmKToKQEAgLTU5NSw2ICs2MjYsMTQ4IEBACiAgICAgICAgIHNlbGYuX3Rlc3RfY2xvc2Vfb3Blbl9pbyhpb19mdW5jKQogCiAKK0B1bml0dGVzdC5za2lwVW5sZXNzKG9zLm5hbWUgPT0gJ3Bvc2l4JywgJ3Rlc3QgcmVxdWlyZXMgYSBwb3NpeCBzeXN0ZW0uJykKK2NsYXNzIFRlc3RGaWxlU2lnbmFsRUlOVFIodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBfdGVzdF9yZWFkaW5nKHNlbGYsIGRhdGFfdG9fd3JpdGUsIHJlYWRfYW5kX3ZlcmlmeV9jb2RlLCBtZXRob2RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXM9RmFsc2UpOgorICAgICAgICAiIiJHZW5lcmljIGJ1ZmZlcmVkIHJlYWQgbWV0aG9kIHRlc3QgaGFybmVzcyB0byB2ZXJpZnkgRUlOVFIgYmVoYXZpb3IuCisKKyAgICAgICAgQWxzbyB2YWxpZGF0ZXMgdGhhdCBQeXRob24gc2lnbmFsIGhhbmRsZXJzIGFyZSBydW4gZHVyaW5nIHRoZSByZWFkLgorCisgICAgICAgIEFyZ3M6CisgICAgICAgICAgICBkYXRhX3RvX3dyaXRlOiBTdHJpbmcgdG8gd3JpdGUgdG8gdGhlIGNoaWxkIHByb2Nlc3MgZm9yIHJlYWRpbmcKKyAgICAgICAgICAgICAgICBiZWZvcmUgc2VuZGluZyBpdCBhIHNpZ25hbCwgY29uZmlybWluZyB0aGUgc2lnbmFsIHdhcyBoYW5kbGVkLAorICAgICAgICAgICAgICAgIHdyaXRpbmcgYSBmaW5hbCBuZXdsaW5lIGNoYXIgYW5kIGNsb3NpbmcgdGhlIGluZmlsZSBwaXBlLgorICAgICAgICAgICAgcmVhZF9hbmRfdmVyaWZ5X2NvZGU6IFNpbmdsZSAibGluZSIgb2YgY29kZSB0byByZWFkIGZyb20gYSBmaWxlCisgICAgICAgICAgICAgICAgb2JqZWN0IG5hbWVkICdpbmZpbGUnIGFuZCB2YWxpZGF0ZSB0aGUgcmVzdWx0LiAgVGhpcyB3aWxsIGJlCisgICAgICAgICAgICAgICAgZXhlY3V0ZWQgYXMgcGFydCBvZiBhIHB5dGhvbiBzdWJwcm9jZXNzIGZlZCBkYXRhX3RvX3dyaXRlLgorICAgICAgICAgICAgbWV0aG9kX25hbWU6IFRoZSBuYW1lIG9mIHRoZSByZWFkIG1ldGhvZCBiZWluZyB0ZXN0ZWQsIGZvciB1c2UgaW4KKyAgICAgICAgICAgICAgICBhbiBlcnJvciBtZXNzYWdlIG9uIGZhaWx1cmUuCisgICAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXM6IElmIFRydWUsIGluZmlsZSB3aWxsIGJlIG9wZW5lZCBpbiB1bml2ZXJzYWwKKyAgICAgICAgICAgICAgICBuZXdsaW5lIG1vZGUgaW4gdGhlIGNoaWxkIHByb2Nlc3MuCisgICAgICAgICIiIgorICAgICAgICBpZiB1bml2ZXJzYWxfbmV3bGluZXM6CisgICAgICAgICAgICAjIFRlc3QgdGhlIFxyXG4gLT4gXG4gY29udmVyc2lvbiB3aGlsZSB3ZSdyZSBhdCBpdC4KKyAgICAgICAgICAgIGRhdGFfdG9fd3JpdGUgPSBkYXRhX3RvX3dyaXRlLnJlcGxhY2UoJ1xuJywgJ1xyXG4nKQorICAgICAgICAgICAgaW5maWxlX3NldHVwX2NvZGUgPSAnaW5maWxlID0gb3MuZmRvcGVuKHN5cy5zdGRpbi5maWxlbm8oKSwgInJVIiknCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpbmZpbGVfc2V0dXBfY29kZSA9ICdpbmZpbGUgPSBzeXMuc3RkaW4nCisgICAgICAgICMgVG90YWwgcGlwZSBJTyBpbiB0aGlzIGZ1bmN0aW9uIGlzIHNtYWxsZXIgdGhhbiB0aGUgbWluaW11bSBwb3NpeCBPUworICAgICAgICAjIHBpcGUgYnVmZmVyIHNpemUgb2YgNTEyIGJ5dGVzLiAgTm8gd3JpdGVyIHNob3VsZCBibG9jay4KKyAgICAgICAgYXNzZXJ0IGxlbihkYXRhX3RvX3dyaXRlKSA8IDUxMiwgJ2RhdGFfdG9fd3JpdGUgbXVzdCBmaXQgaW4gcGlwZSBidWYuJworCisgICAgICAgIGNoaWxkX2NvZGUgPSAoCisgICAgICAgICAgICAgJ2ltcG9ydCBvcywgc2lnbmFsLCBzeXMgOycKKyAgICAgICAgICAgICAnc2lnbmFsLnNpZ25hbCgnCisgICAgICAgICAgICAgICAgICAgICAnc2lnbmFsLlNJR0lOVCwgbGFtYmRhIHMsIGY6IHN5cy5zdGRlcnIud3JpdGUoIiRcXG4iKSkgOycKKyAgICAgICAgICAgICArIGluZmlsZV9zZXR1cF9jb2RlICsgJyA7JyArCisgICAgICAgICAgICAgJ2Fzc2VydCBpc2luc3RhbmNlKGluZmlsZSwgZmlsZSkgOycKKyAgICAgICAgICAgICAnc3lzLnN0ZGVyci53cml0ZSgiR28uXFxuIikgOycKKyAgICAgICAgICAgICArIHJlYWRfYW5kX3ZlcmlmeV9jb2RlKQorICAgICAgICByZWFkZXJfcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oCisgICAgICAgICAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAnLWMnLCBjaGlsZF9jb2RlXSwKKyAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgIyBXYWl0IGZvciB0aGUgc2lnbmFsIGhhbmRsZXIgdG8gYmUgaW5zdGFsbGVkLgorICAgICAgICBnbyA9IHJlYWRlcl9wcm9jZXNzLnN0ZGVyci5yZWFkKDQpCisgICAgICAgIGlmIGdvICE9ICdHby5cbic6CisgICAgICAgICAgICByZWFkZXJfcHJvY2Vzcy5raWxsKCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnRXJyb3IgZnJvbSAlcyBwcm9jZXNzIHdoaWxlIGF3YWl0aW5nICJHbyI6XG4lcycgJSAoCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9uYW1lLCBnbytyZWFkZXJfcHJvY2Vzcy5zdGRlcnIucmVhZCgpKSkKKyAgICAgICAgcmVhZGVyX3Byb2Nlc3Muc3RkaW4ud3JpdGUoZGF0YV90b193cml0ZSkKKyAgICAgICAgc2lnbmFsc19zZW50ID0gMAorICAgICAgICBybGlzdCA9IFtdCisgICAgICAgICMgV2UgZG9uJ3Qga25vdyB3aGVuIHRoZSByZWFkX2FuZF92ZXJpZnlfY29kZSBpbiBvdXIgY2hpbGQgaXMgYWN0dWFsbHkKKyAgICAgICAgIyBleGVjdXRpbmcgd2l0aGluIHRoZSByZWFkIHN5c3RlbSBjYWxsIHdlIHdhbnQgdG8gaW50ZXJydXB0LiAgVGhpcworICAgICAgICAjIGxvb3Agd2FpdHMgZm9yIGEgYml0IGJlZm9yZSBzZW5kaW5nIHRoZSBmaXJzdCBzaWduYWwgdG8gaW5jcmVhc2UKKyAgICAgICAgIyB0aGUgbGlrZWxpaG9vZCBvZiB0aGF0LiAgSW1wbGVtZW50YXRpb25zIHdpdGhvdXQgY29ycmVjdCBFSU5UUgorICAgICAgICAjIGFuZCBzaWduYWwgaGFuZGxpbmcgdXN1YWxseSBmYWlsIHRoaXMgdGVzdC4KKyAgICAgICAgd2hpbGUgbm90IHJsaXN0OgorICAgICAgICAgICAgcmxpc3QsIF8sIF8gPSBzZWxlY3Quc2VsZWN0KFtyZWFkZXJfcHJvY2Vzcy5zdGRlcnJdLCAoKSwgKCksIDAuMDUpCisgICAgICAgICAgICByZWFkZXJfcHJvY2Vzcy5zZW5kX3NpZ25hbChzaWduYWwuU0lHSU5UKQorICAgICAgICAgICAgIyBHaXZlIHRoZSBzdWJwcm9jZXNzIHRpbWUgdG8gaGFuZGxlIGl0IGJlZm9yZSB3ZSBsb29wIGFyb3VuZCBhbmQKKyAgICAgICAgICAgICMgc2VuZCBhbm90aGVyIG9uZS4gIE9uIE9TWCB0aGUgc2Vjb25kIHNpZ25hbCBoYXBwZW5pbmcgY2xvc2UgdG8KKyAgICAgICAgICAgICMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGZpcnN0IHdhcyBjYXVzaW5nIHRoZSBzdWJwcm9jZXNzIHRvIGNyYXNoCisgICAgICAgICAgICAjIHZpYSB0aGUgT1MncyBkZWZhdWx0IFNJR0lOVCBoYW5kbGVyLgorICAgICAgICAgICAgdGltZS5zbGVlcCgwLjEpCisgICAgICAgICAgICBzaWduYWxzX3NlbnQgKz0gMQorICAgICAgICAgICAgaWYgc2lnbmFsc19zZW50ID4gMjAwOgorICAgICAgICAgICAgICAgIHJlYWRlcl9wcm9jZXNzLmtpbGwoKQorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZmFpbGVkIHRvIGhhbmRsZSBzaWduYWwgZHVyaW5nICVzLiIgJSBtZXRob2RfbmFtZSkKKyAgICAgICAgIyBUaGlzIGFzc3VtZXMgYW55dGhpbmcgdW5leHBlY3RlZCB0aGF0IHdyaXRlcyB0byBzdGRlcnIgd2lsbCBhbHNvCisgICAgICAgICMgd3JpdGUgYSBuZXdsaW5lLiAgVGhhdCBpcyB0cnVlIG9mIHRoZSB0cmFjZWJhY2sgcHJpbnRpbmcgY29kZS4KKyAgICAgICAgc2lnbmFsX2xpbmUgPSByZWFkZXJfcHJvY2Vzcy5zdGRlcnIucmVhZGxpbmUoKQorICAgICAgICBpZiBzaWduYWxfbGluZSAhPSAnJFxuJzoKKyAgICAgICAgICAgIHJlYWRlcl9wcm9jZXNzLmtpbGwoKQorICAgICAgICAgICAgc2VsZi5mYWlsKCdFcnJvciBmcm9tICVzIHByb2Nlc3Mgd2hpbGUgYXdhaXRpbmcgc2lnbmFsOlxuJXMnICUgKAorICAgICAgICAgICAgICAgICAgICBtZXRob2RfbmFtZSwgc2lnbmFsX2xpbmUrcmVhZGVyX3Byb2Nlc3Muc3RkZXJyLnJlYWQoKSkpCisgICAgICAgICMgV2UgYXBwZW5kIGEgbmV3bGluZSB0byBvdXIgaW5wdXQgc28gdGhhdCBhIHJlYWRsaW5lIGNhbGwgY2FuCisgICAgICAgICMgZW5kIG9uIGl0cyBvd24gYmVmb3JlIHRoZSBFT0YgaXMgc2Vlbi4KKyAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSByZWFkZXJfcHJvY2Vzcy5jb21tdW5pY2F0ZShpbnB1dD0nXG4nKQorICAgICAgICBpZiByZWFkZXJfcHJvY2Vzcy5yZXR1cm5jb2RlICE9IDA6CisgICAgICAgICAgICBzZWxmLmZhaWwoJyVzKCkgcHJvY2VzcyBleGl0ZWQgcmM9JWQuXG5TVERPVVQ6XG4lc1xuU1RERVJSOlxuJXMnICUgKAorICAgICAgICAgICAgICAgICAgICBtZXRob2RfbmFtZSwgcmVhZGVyX3Byb2Nlc3MucmV0dXJuY29kZSwgc3Rkb3V0LCBzdGRlcnIpKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmUoc2VsZiwgdW5pdmVyc2FsX25ld2xpbmVzPUZhbHNlKToKKyAgICAgICAgIiIiZmlsZS5yZWFkbGluZSBtdXN0IGhhbmRsZSBzaWduYWxzIGFuZCBub3QgbG9zZSBkYXRhLiIiIgorICAgICAgICBzZWxmLl90ZXN0X3JlYWRpbmcoCisgICAgICAgICAgICAgICAgZGF0YV90b193cml0ZT0naGVsbG8sIHdvcmxkIScsCisgICAgICAgICAgICAgICAgcmVhZF9hbmRfdmVyaWZ5X2NvZGU9KAorICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmUgPSBpbmZpbGUucmVhZGxpbmUoKSA7JworICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGVjdGVkX2xpbmUgPSAiaGVsbG8sIHdvcmxkIVxcbiIgOycKKyAgICAgICAgICAgICAgICAgICAgICAgICdhc3NlcnQgbGluZSA9PSBleHBlY3RlZF9saW5lLCAoJworICAgICAgICAgICAgICAgICAgICAgICAgJyJyZWFkICVyIGV4cGVjdGVkICVyIiAlIChsaW5lLCBleHBlY3RlZF9saW5lKSknCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICBtZXRob2RfbmFtZT0ncmVhZGxpbmUnLAorICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz11bml2ZXJzYWxfbmV3bGluZXMpCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZV93aXRoX3VuaXZlcnNhbF9uZXdsaW5lcyhzZWxmKToKKyAgICAgICAgc2VsZi50ZXN0X3JlYWRsaW5lKHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmVzKHNlbGYsIHVuaXZlcnNhbF9uZXdsaW5lcz1GYWxzZSk6CisgICAgICAgICIiImZpbGUucmVhZGxpbmVzIG11c3QgaGFuZGxlIHNpZ25hbHMgYW5kIG5vdCBsb3NlIGRhdGEuIiIiCisgICAgICAgIHNlbGYuX3Rlc3RfcmVhZGluZygKKyAgICAgICAgICAgICAgICBkYXRhX3RvX3dyaXRlPSdoZWxsb1xud29ybGQhJywKKyAgICAgICAgICAgICAgICByZWFkX2FuZF92ZXJpZnlfY29kZT0oCisgICAgICAgICAgICAgICAgICAgICAgICAnbGluZXMgPSBpbmZpbGUucmVhZGxpbmVzKCkgOycKKyAgICAgICAgICAgICAgICAgICAgICAgICdleHBlY3RlZF9saW5lcyA9IFsiaGVsbG9cXG4iLCAid29ybGQhXFxuIl0gOycKKyAgICAgICAgICAgICAgICAgICAgICAgICdhc3NlcnQgbGluZXMgPT0gZXhwZWN0ZWRfbGluZXMsICgnCisgICAgICAgICAgICAgICAgICAgICAgICAnInJlYWRsaW5lcyByZXR1cm5lZCB3cm9uZyBkYXRhLlxcbiIgJworICAgICAgICAgICAgICAgICAgICAgICAgJyJnb3QgbGluZXMgJXJcXG5leHBlY3RlZCAgJXIiICcKKyAgICAgICAgICAgICAgICAgICAgICAgICclIChsaW5lcywgZXhwZWN0ZWRfbGluZXMpKScKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgIG1ldGhvZF9uYW1lPSdyZWFkbGluZXMnLAorICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz11bml2ZXJzYWxfbmV3bGluZXMpCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZXNfd2l0aF91bml2ZXJzYWxfbmV3bGluZXMoc2VsZik6CisgICAgICAgIHNlbGYudGVzdF9yZWFkbGluZXModW5pdmVyc2FsX25ld2xpbmVzPVRydWUpCisKKyAgICBkZWYgdGVzdF9yZWFkYWxsKHNlbGYpOgorICAgICAgICAiIiJVbmJvdW5kZWQgZmlsZS5yZWFkKCkgbXVzdCBoYW5kbGUgc2lnbmFscyBhbmQgbm90IGxvc2UgZGF0YS4iIiIKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkaW5nKAorICAgICAgICAgICAgICAgIGRhdGFfdG9fd3JpdGU9J2hlbGxvLCB3b3JsZCFhYmNkZWZnaGlqa2xtJywKKyAgICAgICAgICAgICAgICByZWFkX2FuZF92ZXJpZnlfY29kZT0oCisgICAgICAgICAgICAgICAgICAgICAgICAnZGF0YSA9IGluZmlsZS5yZWFkKCkgOycKKyAgICAgICAgICAgICAgICAgICAgICAgICdleHBlY3RlZF9kYXRhID0gImhlbGxvLCB3b3JsZCFhYmNkZWZnaGlqa2xtXFxuIjsnCisgICAgICAgICAgICAgICAgICAgICAgICAnYXNzZXJ0IGRhdGEgPT0gZXhwZWN0ZWRfZGF0YSwgKCcKKyAgICAgICAgICAgICAgICAgICAgICAgICcicmVhZCAlciBleHBlY3RlZCAlciIgJSAoZGF0YSwgZXhwZWN0ZWRfZGF0YSkpJworICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgbWV0aG9kX25hbWU9J3VuYm91bmRlZCByZWFkJykKKworICAgIGRlZiB0ZXN0X3JlYWRpbnRvKHNlbGYpOgorICAgICAgICAiIiJmaWxlLnJlYWRpbnRvIG11c3QgaGFuZGxlIHNpZ25hbHMgYW5kIG5vdCBsb3NlIGRhdGEuIiIiCisgICAgICAgIHNlbGYuX3Rlc3RfcmVhZGluZygKKyAgICAgICAgICAgICAgICBkYXRhX3RvX3dyaXRlPSdoZWxsbywgd29ybGQhJywKKyAgICAgICAgICAgICAgICByZWFkX2FuZF92ZXJpZnlfY29kZT0oCisgICAgICAgICAgICAgICAgICAgICAgICAnZGF0YSA9IGJ5dGVhcnJheSg1MCkgOycKKyAgICAgICAgICAgICAgICAgICAgICAgICdudW1fcmVhZCA9IGluZmlsZS5yZWFkaW50byhkYXRhKSA7JworICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGVjdGVkX2RhdGEgPSAiaGVsbG8sIHdvcmxkIVxcbiI7JworICAgICAgICAgICAgICAgICAgICAgICAgJ2Fzc2VydCBkYXRhWzpudW1fcmVhZF0gPT0gZXhwZWN0ZWRfZGF0YSwgKCcKKyAgICAgICAgICAgICAgICAgICAgICAgICcicmVhZCAlciBleHBlY3RlZCAlciIgJSAoZGF0YSwgZXhwZWN0ZWRfZGF0YSkpJworICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgbWV0aG9kX25hbWU9J3JlYWRpbnRvJykKKworCiBjbGFzcyBTdGRvdXRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgdGVzdF9tb3ZlX3N0ZG91dF9vbl93cml0ZShzZWxmKToKQEAgLTY3MSw3ICs4NDQsNyBAQAogICAgICMgU28gZ2V0IHJpZCBvZiBpdCBubyBtYXR0ZXIgd2hhdC4KICAgICB0cnk6CiAgICAgICAgIHJ1bl91bml0dGVzdChBdXRvRmlsZVRlc3RzLCBPdGhlckZpbGVUZXN0cywgRmlsZVN1YmNsYXNzVGVzdHMsCi0gICAgICAgICAgICBGaWxlVGhyZWFkaW5nVGVzdHMsIFN0ZG91dFRlc3RzKQorICAgICAgICAgICAgRmlsZVRocmVhZGluZ1Rlc3RzLCBUZXN0RmlsZVNpZ25hbEVJTlRSLCBTdGRvdXRUZXN0cykKICAgICBmaW5hbGx5OgogICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhURVNURk4pOgogICAgICAgICAgICAgb3MudW5saW5rKFRFU1RGTikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZmlsZV9laW50ci5weSBiL0xpYi90ZXN0L3Rlc3RfZmlsZV9laW50ci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmJmZjNhCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9maWxlX2VpbnRyLnB5CkBAIC0wLDAgKzEsMjM5IEBACisjIFdyaXR0ZW4gdG8gdGVzdCBpbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbHMgaW50ZXJmZXJpbmcgd2l0aCBvdXIgbWFueSBidWZmZXJlZAorIyBJTyBpbXBsZW1lbnRhdGlvbnMuICBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTIyNjgKKyMKKyMgVGhpcyB0ZXN0cyB0aGUgJ19pbycgbW9kdWxlLiAgU2ltaWxhciB0ZXN0cyBmb3IgUHl0aG9uIDIueCdzIG9sZGVyCisjIGRlZmF1bHQgZmlsZSBJL08gaW1wbGVtZW50YXRpb24gZXhpc3Qgd2l0aGluIHRlc3RfZmlsZTJrLnB5LgorIworIyBJdCB3YXMgc3VnZ2VzdGVkIHRoYXQgdGhpcyBjb2RlIGNvdWxkIGJlIG1lcmdlZCBpbnRvIHRlc3RfaW8gYW5kIHRoZSB0ZXN0cworIyBtYWRlIHRvIHdvcmsgdXNpbmcgdGhlIHNhbWUgbWV0aG9kIGFzIHRoZSBleGlzdGluZyBzaWduYWwgdGVzdHMgaW4gdGVzdF9pby4KKyMgSSB3YXMgdW5hYmxlIHRvIGdldCBzaW5nbGUgcHJvY2VzcyB0ZXN0cyB1c2luZyBhbGFybSBvciBzZXRpdGltZXIgdGhhdCB3YXkKKyMgdG8gcmVwcm9kdWNlIHRoZSBFSU5UUiBwcm9ibGVtcy4gIFRoaXMgcHJvY2VzcyBiYXNlZCB0ZXN0IHN1aXRlIHJlcHJvZHVjZXMKKyMgdGhlIHByb2JsZW1zIHByaW9yIHRvIHRoZSBpc3N1ZTEyMjY4IHBhdGNoIHJlbGlhYmx5IG9uIExpbnV4IGFuZCBPU1guCisjICAtIGdyZWdvcnkucC5zbWl0aAorCitpbXBvcnQgb3MKK2ltcG9ydCBzZWxlY3QKK2ltcG9ydCBzaWduYWwKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKK2ltcG9ydCB0aW1lCitpbXBvcnQgdW5pdHRlc3QKKworIyBUZXN0IGltcG9ydCBhbGwgb2YgdGhlIHRoaW5ncyB3ZSdyZSBhYm91dCB0byB0cnkgdGVzdGluZyB1cCBmcm9udC4KK2Zyb20gX2lvIGltcG9ydCBGaWxlSU8KKworCitAdW5pdHRlc3Quc2tpcFVubGVzcyhvcy5uYW1lID09ICdwb3NpeCcsICd0ZXN0cyByZXF1aXJlcyBhIHBvc2l4IHN5c3RlbS4nKQorY2xhc3MgVGVzdEZpbGVJT1NpZ25hbEludGVycnVwdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLl9wcm9jZXNzID0gTm9uZQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9wcm9jZXNzIGFuZCBzZWxmLl9wcm9jZXNzLnBvbGwoKSBpcyBOb25lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX3Byb2Nlc3Mua2lsbCgpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgX2dlbmVyYXRlX2luZmlsZV9zZXR1cF9jb2RlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBpbmZpbGUgPSAuLi4gbGluZSBvZiBjb2RlIGZvciB0aGUgcmVhZGVyIHByb2Nlc3MuCisKKyAgICAgICAgc3ViY2xhc3Nlc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIHRvIHRlc3QgZGlmZmVyZW50IElPIG9iamVjdHMuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gKCdpbXBvcnQgX2lvIDsnCisgICAgICAgICAgICAgICAgJ2luZmlsZSA9IF9pby5GaWxlSU8oc3lzLnN0ZGluLmZpbGVubygpLCAicmIiKScpCisKKyAgICBkZWYgZmFpbF93aXRoX3Byb2Nlc3NfaW5mbyhzZWxmLCB3aHksIHN0ZG91dD1iJycsIHN0ZGVycj1iJycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbXVuaWNhdGU9VHJ1ZSk6CisgICAgICAgICIiIkEgY29tbW9uIHdheSB0byBjbGVhbnVwIGFuZCBmYWlsIHdpdGggdXNlZnVsIGRlYnVnIG91dHB1dC4KKworICAgICAgICBLaWxscyB0aGUgcHJvY2VzcyBpZiBpdCBpcyBzdGlsbCBydW5uaW5nLCBjb2xsZWN0cyByZW1haW5pbmcgb3V0cHV0CisgICAgICAgIGFuZCBmYWlscyB0aGUgdGVzdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaW5jbHVkaW5nIHRoZSBvdXRwdXQuCisKKyAgICAgICAgQXJnczoKKyAgICAgICAgICAgIHdoeTogVGV4dCB0byBnbyBhZnRlciAiRXJyb3IgZnJvbSBJTyBwcm9jZXNzIiBpbiB0aGUgbWVzc2FnZS4KKyAgICAgICAgICAgIHN0ZG91dCwgc3RkZXJyOiBzdGFuZGFyZCBvdXRwdXQgYW5kIGVycm9yIGZyb20gdGhlIHByb2Nlc3Mgc28KKyAgICAgICAgICAgICAgICBmYXIgdG8gaW5jbHVkZSBpbiB0aGUgZXJyb3IgbWVzc2FnZS4KKyAgICAgICAgICAgIGNvbW11bmljYXRlOiBib29sLCB3aGVuIFRydWUgd2UgY2FsbCBjb21tdW5pY2F0ZSgpIG9uIHRoZSBwcm9jZXNzCisgICAgICAgICAgICAgICAgYWZ0ZXIga2lsbGluZyBpdCB0byBnYXRoZXIgYWRkaXRpb25hbCBvdXRwdXQuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLl9wcm9jZXNzLnBvbGwoKSBpcyBOb25lOgorICAgICAgICAgICAgdGltZS5zbGVlcCgwLjEpICAjIGdpdmUgaXQgdGltZSB0byBmaW5pc2ggcHJpbnRpbmcgdGhlIGVycm9yLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX3Byb2Nlc3MudGVybWluYXRlKCkgICMgRW5zdXJlIGl0IGRpZXMuCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGlmIGNvbW11bmljYXRlOgorICAgICAgICAgICAgc3Rkb3V0X2VuZCwgc3RkZXJyX2VuZCA9IHNlbGYuX3Byb2Nlc3MuY29tbXVuaWNhdGUoKQorICAgICAgICAgICAgc3Rkb3V0ICs9IHN0ZG91dF9lbmQKKyAgICAgICAgICAgIHN0ZGVyciArPSBzdGRlcnJfZW5kCisgICAgICAgIHNlbGYuZmFpbCgnRXJyb3IgZnJvbSBJTyBwcm9jZXNzICVzOlxuU1RET1VUOlxuJXNTVERFUlI6XG4lc1xuJyAlCisgICAgICAgICAgICAgICAgICAod2h5LCBzdGRvdXQuZGVjb2RlKCksIHN0ZGVyci5kZWNvZGUoKSkpCisKKyAgICBkZWYgX3Rlc3RfcmVhZGluZyhzZWxmLCBkYXRhX3RvX3dyaXRlLCByZWFkX2FuZF92ZXJpZnlfY29kZSk6CisgICAgICAgICIiIkdlbmVyaWMgYnVmZmVyZWQgcmVhZCBtZXRob2QgdGVzdCBoYXJuZXNzIHRvIHZhbGlkYXRlIEVJTlRSIGJlaGF2aW9yLgorCisgICAgICAgIEFsc28gdmFsaWRhdGVzIHRoYXQgUHl0aG9uIHNpZ25hbCBoYW5kbGVycyBhcmUgcnVuIGR1cmluZyB0aGUgcmVhZC4KKworICAgICAgICBBcmdzOgorICAgICAgICAgICAgZGF0YV90b193cml0ZTogU3RyaW5nIHRvIHdyaXRlIHRvIHRoZSBjaGlsZCBwcm9jZXNzIGZvciByZWFkaW5nCisgICAgICAgICAgICAgICAgYmVmb3JlIHNlbmRpbmcgaXQgYSBzaWduYWwsIGNvbmZpcm1pbmcgdGhlIHNpZ25hbCB3YXMgaGFuZGxlZCwKKyAgICAgICAgICAgICAgICB3cml0aW5nIGEgZmluYWwgbmV3bGluZSBhbmQgY2xvc2luZyB0aGUgaW5maWxlIHBpcGUuCisgICAgICAgICAgICByZWFkX2FuZF92ZXJpZnlfY29kZTogU2luZ2xlICJsaW5lIiBvZiBjb2RlIHRvIHJlYWQgZnJvbSBhIGZpbGUKKyAgICAgICAgICAgICAgICBvYmplY3QgbmFtZWQgJ2luZmlsZScgYW5kIHZhbGlkYXRlIHRoZSByZXN1bHQuICBUaGlzIHdpbGwgYmUKKyAgICAgICAgICAgICAgICBleGVjdXRlZCBhcyBwYXJ0IG9mIGEgcHl0aG9uIHN1YnByb2Nlc3MgZmVkIGRhdGFfdG9fd3JpdGUuCisgICAgICAgICIiIgorICAgICAgICBpbmZpbGVfc2V0dXBfY29kZSA9IHNlbGYuX2dlbmVyYXRlX2luZmlsZV9zZXR1cF9jb2RlKCkKKyAgICAgICAgIyBUb3RhbCBwaXBlIElPIGluIHRoaXMgZnVuY3Rpb24gaXMgc21hbGxlciB0aGFuIHRoZSBtaW5pbXVtIHBvc2l4IE9TCisgICAgICAgICMgcGlwZSBidWZmZXIgc2l6ZSBvZiA1MTIgYnl0ZXMuICBObyB3cml0ZXIgc2hvdWxkIGJsb2NrLgorICAgICAgICBhc3NlcnQgbGVuKGRhdGFfdG9fd3JpdGUpIDwgNTEyLCAnZGF0YV90b193cml0ZSBtdXN0IGZpdCBpbiBwaXBlIGJ1Zi4nCisKKyAgICAgICAgIyBTdGFydCBhIHN1YnByb2Nlc3MgdG8gY2FsbCBvdXIgcmVhZCBtZXRob2Qgd2hpbGUgaGFuZGxpbmcgYSBzaWduYWwuCisgICAgICAgIHNlbGYuX3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKAorICAgICAgICAgICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgJy11JywgJy1jJywKKyAgICAgICAgICAgICAgICAgJ2ltcG9ydCBpbywgc2lnbmFsLCBzeXMgOycKKyAgICAgICAgICAgICAgICAgJ3NpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0lOVCwgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW1iZGEgcywgZjogc3lzLnN0ZGVyci53cml0ZSgiJFxcbiIpKSA7JworICAgICAgICAgICAgICAgICArIGluZmlsZV9zZXR1cF9jb2RlICsgJyA7JyArCisgICAgICAgICAgICAgICAgICdzeXMuc3RkZXJyLndyaXRlKCJXb3JtIFNpZ24hXFxuIikgOycKKyAgICAgICAgICAgICAgICAgKyByZWFkX2FuZF92ZXJpZnlfY29kZSArICcgOycgKworICAgICAgICAgICAgICAgICAnaW5maWxlLmNsb3NlKCknCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKworICAgICAgICAjIFdhaXQgZm9yIHRoZSBzaWduYWwgaGFuZGxlciB0byBiZSBpbnN0YWxsZWQuCisgICAgICAgIHdvcm1fc2lnbiA9IHNlbGYuX3Byb2Nlc3Muc3RkZXJyLnJlYWQobGVuKGInV29ybSBTaWduIVxuJykpCisgICAgICAgIGlmIHdvcm1fc2lnbiAhPSBiJ1dvcm0gU2lnbiFcbic6ICAjIFNlZSBhbHNvLCBEdW5lIGJ5IEZyYW5rIEhlcmJlcnQuCisgICAgICAgICAgICBzZWxmLmZhaWxfd2l0aF9wcm9jZXNzX2luZm8oJ3doaWxlIGF3YWl0aW5nIGEgc2lnbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXdvcm1fc2lnbikKKyAgICAgICAgc2VsZi5fcHJvY2Vzcy5zdGRpbi53cml0ZShkYXRhX3RvX3dyaXRlKQorCisgICAgICAgIHNpZ25hbHNfc2VudCA9IDAKKyAgICAgICAgcmxpc3QgPSBbXQorICAgICAgICAjIFdlIGRvbid0IGtub3cgd2hlbiB0aGUgcmVhZF9hbmRfdmVyaWZ5X2NvZGUgaW4gb3VyIGNoaWxkIGlzIGFjdHVhbGx5CisgICAgICAgICMgZXhlY3V0aW5nIHdpdGhpbiB0aGUgcmVhZCBzeXN0ZW0gY2FsbCB3ZSB3YW50IHRvIGludGVycnVwdC4gIFRoaXMKKyAgICAgICAgIyBsb29wIHdhaXRzIGZvciBhIGJpdCBiZWZvcmUgc2VuZGluZyB0aGUgZmlyc3Qgc2lnbmFsIHRvIGluY3JlYXNlCisgICAgICAgICMgdGhlIGxpa2VsaWhvb2Qgb2YgdGhhdC4gIEltcGxlbWVudGF0aW9ucyB3aXRob3V0IGNvcnJlY3QgRUlOVFIKKyAgICAgICAgIyBhbmQgc2lnbmFsIGhhbmRsaW5nIHVzdWFsbHkgZmFpbCB0aGlzIHRlc3QuCisgICAgICAgIHdoaWxlIG5vdCBybGlzdDoKKyAgICAgICAgICAgIHJsaXN0LCBfLCBfID0gc2VsZWN0LnNlbGVjdChbc2VsZi5fcHJvY2Vzcy5zdGRlcnJdLCAoKSwgKCksIDAuMDUpCisgICAgICAgICAgICBzZWxmLl9wcm9jZXNzLnNlbmRfc2lnbmFsKHNpZ25hbC5TSUdJTlQpCisgICAgICAgICAgICBzaWduYWxzX3NlbnQgKz0gMQorICAgICAgICAgICAgaWYgc2lnbmFsc19zZW50ID4gMjAwOgorICAgICAgICAgICAgICAgIHNlbGYuX3Byb2Nlc3Mua2lsbCgpCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdyZWFkZXIgcHJvY2VzcyBmYWlsZWQgdG8gaGFuZGxlIG91ciBzaWduYWxzLicpCisgICAgICAgICMgVGhpcyBhc3N1bWVzIGFueXRoaW5nIHVuZXhwZWN0ZWQgdGhhdCB3cml0ZXMgdG8gc3RkZXJyIHdpbGwgYWxzbworICAgICAgICAjIHdyaXRlIGEgbmV3bGluZS4gIFRoYXQgaXMgdHJ1ZSBvZiB0aGUgdHJhY2ViYWNrIHByaW50aW5nIGNvZGUuCisgICAgICAgIHNpZ25hbF9saW5lID0gc2VsZi5fcHJvY2Vzcy5zdGRlcnIucmVhZGxpbmUoKQorICAgICAgICBpZiBzaWduYWxfbGluZSAhPSBiJyRcbic6CisgICAgICAgICAgICBzZWxmLmZhaWxfd2l0aF9wcm9jZXNzX2luZm8oJ3doaWxlIGF3YWl0aW5nIHNpZ25hbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXNpZ25hbF9saW5lKQorCisgICAgICAgICMgV2UgYXBwZW5kIGEgbmV3bGluZSB0byBvdXIgaW5wdXQgc28gdGhhdCBhIHJlYWRsaW5lIGNhbGwgY2FuCisgICAgICAgICMgZW5kIG9uIGl0cyBvd24gYmVmb3JlIHRoZSBFT0YgaXMgc2VlbiBhbmQgc28gdGhhdCB3ZSdyZSB0ZXN0aW5nCisgICAgICAgICMgdGhlIHJlYWQgY2FsbCB0aGF0IHdhcyBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbCBiZWZvcmUgdGhlIGVuZCBvZgorICAgICAgICAjIHRoZSBkYXRhIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkLgorICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHNlbGYuX3Byb2Nlc3MuY29tbXVuaWNhdGUoaW5wdXQ9YidcbicpCisgICAgICAgIGlmIHNlbGYuX3Byb2Nlc3MucmV0dXJuY29kZToKKyAgICAgICAgICAgIHNlbGYuZmFpbF93aXRoX3Byb2Nlc3NfaW5mbygKKyAgICAgICAgICAgICAgICAgICAgJ2V4aXRlZCByYz0lZCcgJSBzZWxmLl9wcm9jZXNzLnJldHVybmNvZGUsCisgICAgICAgICAgICAgICAgICAgIHN0ZG91dCwgc3RkZXJyLCBjb21tdW5pY2F0ZT1GYWxzZSkKKyAgICAgICAgIyBQQVNTIQorCisgICAgIyBTdHJpbmcgZm9ybWF0IGZvciB0aGUgcmVhZF9hbmRfdmVyaWZ5X2NvZGUgdXNlZCBieSByZWFkIG1ldGhvZHMuCisgICAgX1JFQURJTkdfQ09ERV9URU1QTEFURSA9ICgKKyAgICAgICAgICAgICdnb3QgPSBpbmZpbGUue3JlYWRfbWV0aG9kX25hbWV9KCkgOycKKyAgICAgICAgICAgICdleHBlY3RlZCA9IHtleHBlY3RlZCFyfSA7JworICAgICAgICAgICAgJ2Fzc2VydCBnb3QgPT0gZXhwZWN0ZWQsICgnCisgICAgICAgICAgICAgICAgICAgICcie3JlYWRfbWV0aG9kX25hbWV9IHJldHVybmVkIHdyb25nIGRhdGEuXFxuIicKKyAgICAgICAgICAgICAgICAgICAgJyJnb3QgZGF0YSAlclxcbmV4cGVjdGVkICVyIiAlIChnb3QsIGV4cGVjdGVkKSknCisgICAgICAgICAgICApCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZShzZWxmKToKKyAgICAgICAgIiIicmVhZGxpbmUoKSBtdXN0IGhhbmRsZSBzaWduYWxzIGFuZCBub3QgbG9zZSBkYXRhLiIiIgorICAgICAgICBzZWxmLl90ZXN0X3JlYWRpbmcoCisgICAgICAgICAgICAgICAgZGF0YV90b193cml0ZT1iJ2hlbGxvLCB3b3JsZCEnLAorICAgICAgICAgICAgICAgIHJlYWRfYW5kX3ZlcmlmeV9jb2RlPXNlbGYuX1JFQURJTkdfQ09ERV9URU1QTEFURS5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkX21ldGhvZF9uYW1lPSdyZWFkbGluZScsCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD1iJ2hlbGxvLCB3b3JsZCFcbicpKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmVzKHNlbGYpOgorICAgICAgICAiIiJyZWFkbGluZXMoKSBtdXN0IGhhbmRsZSBzaWduYWxzIGFuZCBub3QgbG9zZSBkYXRhLiIiIgorICAgICAgICBzZWxmLl90ZXN0X3JlYWRpbmcoCisgICAgICAgICAgICAgICAgZGF0YV90b193cml0ZT1iJ2hlbGxvXG53b3JsZCEnLAorICAgICAgICAgICAgICAgIHJlYWRfYW5kX3ZlcmlmeV9jb2RlPXNlbGYuX1JFQURJTkdfQ09ERV9URU1QTEFURS5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkX21ldGhvZF9uYW1lPSdyZWFkbGluZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ9W2InaGVsbG9cbicsIGInd29ybGQhXG4nXSkpCisKKyAgICBkZWYgdGVzdF9yZWFkYWxsKHNlbGYpOgorICAgICAgICAiIiJyZWFkYWxsKCkgbXVzdCBoYW5kbGUgc2lnbmFscyBhbmQgbm90IGxvc2UgZGF0YS4iIiIKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkaW5nKAorICAgICAgICAgICAgICAgIGRhdGFfdG9fd3JpdGU9YidoZWxsb1xud29ybGQhJywKKyAgICAgICAgICAgICAgICByZWFkX2FuZF92ZXJpZnlfY29kZT1zZWxmLl9SRUFESU5HX0NPREVfVEVNUExBVEUuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9tZXRob2RfbmFtZT0ncmVhZGFsbCcsCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD1iJ2hlbGxvXG53b3JsZCFcbicpKQorICAgICAgICAjIHJlYWQoKSBpcyB0aGUgc2FtZSB0aGluZyBhcyByZWFkYWxsKCkuCisgICAgICAgIHNlbGYuX3Rlc3RfcmVhZGluZygKKyAgICAgICAgICAgICAgICBkYXRhX3RvX3dyaXRlPWInaGVsbG9cbndvcmxkIScsCisgICAgICAgICAgICAgICAgcmVhZF9hbmRfdmVyaWZ5X2NvZGU9c2VsZi5fUkVBRElOR19DT0RFX1RFTVBMQVRFLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfbWV0aG9kX25hbWU9J3JlYWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ9YidoZWxsb1xud29ybGQhXG4nKSkKKworCitjbGFzcyBUZXN0QnVmZmVyZWRJT1NpZ25hbEludGVycnVwdChUZXN0RmlsZUlPU2lnbmFsSW50ZXJydXB0KToKKyAgICBkZWYgX2dlbmVyYXRlX2luZmlsZV9zZXR1cF9jb2RlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBpbmZpbGUgPSAuLi4gbGluZSBvZiBjb2RlIHRvIG1ha2UgYSBCdWZmZXJlZFJlYWRlci4iIiIKKyAgICAgICAgcmV0dXJuICgnaW5maWxlID0gaW8ub3BlbihzeXMuc3RkaW4uZmlsZW5vKCksICJyYiIpIDsnCisgICAgICAgICAgICAgICAgJ2ltcG9ydCBfaW8gO2Fzc2VydCBpc2luc3RhbmNlKGluZmlsZSwgX2lvLkJ1ZmZlcmVkUmVhZGVyKScpCisKKyAgICBkZWYgdGVzdF9yZWFkYWxsKHNlbGYpOgorICAgICAgICAiIiJCdWZmZXJlZFJlYWRlci5yZWFkKCkgbXVzdCBoYW5kbGUgc2lnbmFscyBhbmQgbm90IGxvc2UgZGF0YS4iIiIKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkaW5nKAorICAgICAgICAgICAgICAgIGRhdGFfdG9fd3JpdGU9YidoZWxsb1xud29ybGQhJywKKyAgICAgICAgICAgICAgICByZWFkX2FuZF92ZXJpZnlfY29kZT1zZWxmLl9SRUFESU5HX0NPREVfVEVNUExBVEUuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9tZXRob2RfbmFtZT0ncmVhZCcsCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD1iJ2hlbGxvXG53b3JsZCFcbicpKQorCisKK2NsYXNzIFRlc3RUZXh0SU9TaWduYWxJbnRlcnJ1cHQoVGVzdEZpbGVJT1NpZ25hbEludGVycnVwdCk6CisgICAgZGVmIF9nZW5lcmF0ZV9pbmZpbGVfc2V0dXBfY29kZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgaW5maWxlID0gLi4uIGxpbmUgb2YgY29kZSB0byBtYWtlIGEgVGV4dElPV3JhcHBlci4iIiIKKyAgICAgICAgcmV0dXJuICgnaW5maWxlID0gaW8ub3BlbihzeXMuc3RkaW4uZmlsZW5vKCksICJydCIsIG5ld2xpbmU9Tm9uZSkgOycKKyAgICAgICAgICAgICAgICAnaW1wb3J0IF9pbyA7YXNzZXJ0IGlzaW5zdGFuY2UoaW5maWxlLCBfaW8uVGV4dElPV3JhcHBlciknKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmUoc2VsZik6CisgICAgICAgICIiInJlYWRsaW5lKCkgbXVzdCBoYW5kbGUgc2lnbmFscyBhbmQgbm90IGxvc2UgZGF0YS4iIiIKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkaW5nKAorICAgICAgICAgICAgICAgIGRhdGFfdG9fd3JpdGU9YidoZWxsbywgd29ybGQhJywKKyAgICAgICAgICAgICAgICByZWFkX2FuZF92ZXJpZnlfY29kZT1zZWxmLl9SRUFESU5HX0NPREVfVEVNUExBVEUuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9tZXRob2RfbmFtZT0ncmVhZGxpbmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ9J2hlbGxvLCB3b3JsZCFcbicpKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmVzKHNlbGYpOgorICAgICAgICAiIiJyZWFkbGluZXMoKSBtdXN0IGhhbmRsZSBzaWduYWxzIGFuZCBub3QgbG9zZSBkYXRhLiIiIgorICAgICAgICBzZWxmLl90ZXN0X3JlYWRpbmcoCisgICAgICAgICAgICAgICAgZGF0YV90b193cml0ZT1iJ2hlbGxvXHJcbndvcmxkIScsCisgICAgICAgICAgICAgICAgcmVhZF9hbmRfdmVyaWZ5X2NvZGU9c2VsZi5fUkVBRElOR19DT0RFX1RFTVBMQVRFLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfbWV0aG9kX25hbWU9J3JlYWRsaW5lcycsCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD1bJ2hlbGxvXG4nLCAnd29ybGQhXG4nXSkpCisKKyAgICBkZWYgdGVzdF9yZWFkYWxsKHNlbGYpOgorICAgICAgICAiIiJyZWFkKCkgbXVzdCBoYW5kbGUgc2lnbmFscyBhbmQgbm90IGxvc2UgZGF0YS4iIiIKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkaW5nKAorICAgICAgICAgICAgICAgIGRhdGFfdG9fd3JpdGU9YidoZWxsb1xud29ybGQhJywKKyAgICAgICAgICAgICAgICByZWFkX2FuZF92ZXJpZnlfY29kZT1zZWxmLl9SRUFESU5HX0NPREVfVEVNUExBVEUuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9tZXRob2RfbmFtZT0ncmVhZCcsCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD0iaGVsbG9cbndvcmxkIVxuIikpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3RfY2FzZXMgPSBbCisgICAgICAgICAgICB0YyBmb3IgdGMgaW4gZ2xvYmFscygpLnZhbHVlcygpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRjLCB0eXBlKSBhbmQgaXNzdWJjbGFzcyh0YywgdW5pdHRlc3QuVGVzdENhc2UpXQorICAgIHJ1bl91bml0dGVzdCgqdGVzdF9jYXNlcykKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZpbGVpbnB1dC5weSBiL0xpYi90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5CmluZGV4IDg0YWVkMWEuLmMxNWFkODQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5CkBAIC0yMTgsOCArMjE4LDQ5IEBACiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICByZW1vdmVfdGVtcGZpbGVzKHQxKQogCisgICAgZGVmIHRlc3RfcmVhZGxpbmUoc2VsZik6CisgICAgICAgIHdpdGggb3BlbihURVNURk4sICd3YicpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKCdBXG5CXHJcbkNccicpCisgICAgICAgICAgICAjIEZpbGwgVGV4dElPV3JhcHBlciBidWZmZXIuCisgICAgICAgICAgICBmLndyaXRlKCcxMjM0NTY3ODlcbicgKiAxMDAwKQorICAgICAgICAgICAgIyBJc3N1ZSAjMjA1MDE6IHJlYWRsaW5lKCkgc2hvdWxkbid0IHJlYWQgd2hvbGUgZmlsZS4KKyAgICAgICAgICAgIGYud3JpdGUoJ1x4ODAnKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc2FmZV91bmxpbmssIFRFU1RGTikKKworICAgICAgICBmaSA9IEZpbGVJbnB1dChmaWxlcz1URVNURk4sIG9wZW5ob29rPWhvb2tfZW5jb2RlZCgnYXNjaWknKSwgYnVmc2l6ZT04KQorICAgICAgICAjIFRoZSBtb3N0IGxpa2VseSBmYWlsdXJlIGlzIGEgVW5pY29kZURlY29kZUVycm9yIGR1ZSB0byB0aGUgZW50aXJlCisgICAgICAgICMgZmlsZSBiZWluZyByZWFkIHdoZW4gaXQgc2hvdWxkbid0IGhhdmUgYmVlbi4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaS5yZWFkbGluZSgpLCB1J0FcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkucmVhZGxpbmUoKSwgdSdCXHJcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkucmVhZGxpbmUoKSwgdSdDXHInKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvcik6CisgICAgICAgICAgICAjIFJlYWQgdG8gdGhlIGVuZCBvZiBmaWxlLgorICAgICAgICAgICAgbGlzdChmaSkKKyAgICAgICAgZmkuY2xvc2UoKQorCitjbGFzcyBUZXN0X2hvb2tfZW5jb2RlZCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVW5pdCB0ZXN0cyBmb3IgZmlsZWlucHV0Lmhvb2tfZW5jb2RlZCgpIiIiCisKKyAgICBkZWYgdGVzdF9tb2RlcyhzZWxmKToKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgJ3diJykgYXMgZjoKKyAgICAgICAgICAgICMgVVRGLTcgaXMgYSBjb252ZW5pZW50LCBzZWxkb20gdXNlZCBlbmNvZGluZworICAgICAgICAgICAgZi53cml0ZSgnQVxuQlxyXG5DXHJEK0lLdy0nKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc2FmZV91bmxpbmssIFRFU1RGTikKKworICAgICAgICBkZWYgY2hlY2sobW9kZSwgZXhwZWN0ZWRfbGluZXMpOgorICAgICAgICAgICAgZmkgPSBGaWxlSW5wdXQoZmlsZXM9VEVTVEZOLCBtb2RlPW1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuaG9vaz1ob29rX2VuY29kZWQoJ3V0Zi03JykpCisgICAgICAgICAgICBsaW5lcyA9IGxpc3QoZmkpCisgICAgICAgICAgICBmaS5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmVzLCBleHBlY3RlZF9saW5lcykKKworICAgICAgICBjaGVjaygncicsIFt1J0FcbicsIHUnQlxyXG4nLCB1J0NccicsIHUnRFx1MjBhYyddKQorICAgICAgICBjaGVjaygnclUnLCBbdSdBXG4nLCB1J0JcclxuJywgdSdDXHInLCB1J0RcdTIwYWMnXSkKKyAgICAgICAgY2hlY2soJ1UnLCBbdSdBXG4nLCB1J0JcclxuJywgdSdDXHInLCB1J0RcdTIwYWMnXSkKKyAgICAgICAgY2hlY2soJ3JiJywgW3UnQVxuJywgdSdCXHJcbicsIHUnQ1xyJywgdSdEXHUyMGFjJ10pCisKIGRlZiB0ZXN0X21haW4oKToKLSAgICBydW5fdW5pdHRlc3QoQnVmZmVyU2l6ZXNUZXN0cywgRmlsZUlucHV0VGVzdHMpCisgICAgcnVuX3VuaXR0ZXN0KEJ1ZmZlclNpemVzVGVzdHMsIEZpbGVJbnB1dFRlc3RzLCBUZXN0X2hvb2tfZW5jb2RlZCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9maWxlaW8ucHkgYi9MaWIvdGVzdC90ZXN0X2ZpbGVpby5weQppbmRleCA5Njg4ZmZjLi5iNDVkNzliIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ZpbGVpby5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ZpbGVpby5weQpAQCAtOSw5ICs5LDEwIEBACiBmcm9tIGFycmF5IGltcG9ydCBhcnJheQogZnJvbSB3ZWFrcmVmIGltcG9ydCBwcm94eQogZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHdyYXBzCitmcm9tIFVzZXJMaXN0IGltcG9ydCBVc2VyTGlzdAogCiBmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBURVNURk4sIGNoZWNrX3dhcm5pbmdzLCBydW5fdW5pdHRlc3QsIG1ha2VfYmFkX2ZkCi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBweTNrX2J5dGVzIGFzIGJ5dGVzCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBweTNrX2J5dGVzIGFzIGJ5dGVzLCBjcHl0aG9uX29ubHkKIGZyb20gdGVzdC5zY3JpcHRfaGVscGVyIGltcG9ydCBydW5fcHl0aG9uCiAKIGZyb20gX2lvIGltcG9ydCBGaWxlSU8gYXMgX0ZpbGVJTwpAQCAtNzEsNiArNzIsMjYgQEAKICAgICAgICAgbiA9IHNlbGYuZi5yZWFkaW50byhhKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFycmF5KGInYicsIFsxLCAyXSksIGFbOm5dKQogCisgICAgZGVmIHRlc3RXcml0ZWxpbmVzTGlzdChzZWxmKToKKyAgICAgICAgbCA9IFtiJzEyMycsIGInNDU2J10KKyAgICAgICAgc2VsZi5mLndyaXRlbGluZXMobCkKKyAgICAgICAgc2VsZi5mLmNsb3NlKCkKKyAgICAgICAgc2VsZi5mID0gX0ZpbGVJTyhURVNURk4sICdyYicpCisgICAgICAgIGJ1ZiA9IHNlbGYuZi5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYsIGInMTIzNDU2JykKKworICAgIGRlZiB0ZXN0V3JpdGVsaW5lc1VzZXJMaXN0KHNlbGYpOgorICAgICAgICBsID0gVXNlckxpc3QoW2InMTIzJywgYic0NTYnXSkKKyAgICAgICAgc2VsZi5mLndyaXRlbGluZXMobCkKKyAgICAgICAgc2VsZi5mLmNsb3NlKCkKKyAgICAgICAgc2VsZi5mID0gX0ZpbGVJTyhURVNURk4sICdyYicpCisgICAgICAgIGJ1ZiA9IHNlbGYuZi5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYsIGInMTIzNDU2JykKKworICAgIGRlZiB0ZXN0V3JpdGVsaW5lc0Vycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZi53cml0ZWxpbmVzLCBbMSwgMiwgM10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5mLndyaXRlbGluZXMsIE5vbmUpCisKICAgICBkZWYgdGVzdF9ub25lX2FyZ3Moc2VsZik6CiAgICAgICAgIHNlbGYuZi53cml0ZShiImhpXG5ieWVcbmFiYyIpCiAgICAgICAgIHNlbGYuZi5jbG9zZSgpCkBAIC0xMzAsNiArMTUxLDE0IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBJT0Vycm9yIikKIAorICAgIEB1bml0dGVzdC5za2lwSWYob3MubmFtZSA9PSAnbnQnLCAidGVzdCBvbmx5IHdvcmtzIG9uIGEgUE9TSVgtbGlrZSBzeXN0ZW0iKQorICAgIGRlZiB0ZXN0T3BlbkRpckZEKHNlbGYpOgorICAgICAgICBmZCA9IG9zLm9wZW4oJy4nLCBvcy5PX1JET05MWSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yKSBhcyBjbToKKyAgICAgICAgICAgIF9GaWxlSU8oZmQsICdyJykKKyAgICAgICAgb3MuY2xvc2UoZmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY20uZXhjZXB0aW9uLmVycm5vLCBlcnJuby5FSVNESVIpCisKICAgICAjQSBzZXQgb2YgZnVuY3Rpb25zIHRlc3RpbmcgdGhhdCB3ZSBnZXQgZXhwZWN0ZWQgYmVoYXZpb3VyIGlmIHNvbWVvbmUgaGFzCiAgICAgI21hbnVhbGx5IGNsb3NlZCB0aGUgaW50ZXJuYWwgZmlsZSBkZXNjcmlwdG9yLiAgRmlyc3QsIGEgZGVjb3JhdG9yOgogICAgIGRlZiBDbG9zZWRGRChmdW5jKToKQEAgLTI1MywyOSArMjgyLDMwIEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuc2Vla2FibGUoKSwgVHJ1ZSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5pc2F0dHkoKSwgRmFsc2UpCiAgICAgICAgICAgICBmLmNsb3NlKCkKLQotICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICJ3aW4zMiI6Ci0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBmID0gX0ZpbGVJTygiL2Rldi90dHkiLCAiYSIpCi0gICAgICAgICAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgICMgV2hlbiBydW4gaW4gYSBjcm9uIGpvYiB0aGVyZSBqdXN0IGFyZW4ndCBhbnkKLSAgICAgICAgICAgICAgICAgICAgIyB0dHlzLCBzbyBza2lwIHRoZSB0ZXN0LiAgVGhpcyBhbHNvIGhhbmRsZXMgb3RoZXIKLSAgICAgICAgICAgICAgICAgICAgIyBPUydlcyB0aGF0IGRvbid0IHN1cHBvcnQgL2Rldi90dHkuCi0gICAgICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGFibGUoKSwgRmFsc2UpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi53cml0YWJsZSgpLCBUcnVlKQotICAgICAgICAgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gIT0gImRhcndpbiIgYW5kIFwKLSAgICAgICAgICAgICAgICAgICAgICAgJ2JzZCcgbm90IGluIHN5cy5wbGF0Zm9ybSBhbmQgXAotICAgICAgICAgICAgICAgICAgICAgICBub3Qgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ3N1bm9zJyk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAjIFNvbWVob3cgL2Rldi90dHkgYXBwZWFycyBzZWVrYWJsZSBvbiBzb21lIEJTRHMKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5zZWVrYWJsZSgpLCBGYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmlzYXR0eSgpLCBUcnVlKQotICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIG9zLnVubGluayhURVNURk4pCiAKLSAgICBkZWYgdGVzdE1vZGVTdHJpbmdzKHNlbGYpOgorICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09ICd3aW4zMicsICdubyB0dHlzIG9uIFdpbmRvd3MnKQorICAgIGRlZiB0ZXN0QWJsZXNPblRUWShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IF9GaWxlSU8oIi9kZXYvdHR5IiwgImEiKQorICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvcjoKKyAgICAgICAgICAgICMgV2hlbiBydW4gaW4gYSBjcm9uIGpvYiB0aGVyZSBqdXN0IGFyZW4ndCBhbnkKKyAgICAgICAgICAgICMgdHR5cywgc28gc2tpcCB0aGUgdGVzdC4gIFRoaXMgYWxzbyBoYW5kbGVzIG90aGVyCisgICAgICAgICAgICAjIE9TJ2VzIHRoYXQgZG9uJ3Qgc3VwcG9ydCAvZGV2L3R0eS4KKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ25lZWQgL2Rldi90dHknKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRhYmxlKCksIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLndyaXRhYmxlKCksIFRydWUpCisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gIT0gImRhcndpbiIgYW5kIFwKKyAgICAgICAgICAgICAgICdic2QnIG5vdCBpbiBzeXMucGxhdGZvcm0gYW5kIFwKKyAgICAgICAgICAgICAgIG5vdCBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnc3Vub3MnKToKKyAgICAgICAgICAgICAgICAjIFNvbWVob3cgL2Rldi90dHkgYXBwZWFycyBzZWVrYWJsZSBvbiBzb21lIEJTRHMKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuc2Vla2FibGUoKSwgRmFsc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuaXNhdHR5KCksIFRydWUpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0SW52YWxpZE1vZGVTdHJpbmdzKHNlbGYpOgogICAgICAgICAjIGNoZWNrIGludmFsaWQgbW9kZSBzdHJpbmdzCiAgICAgICAgIGZvciBtb2RlIGluICgiIiwgImFVIiwgIndVKyIsICJydyIsICJydCIpOgogICAgICAgICAgICAgdHJ5OgpAQCAtMjg2LDYgKzMxNiwyMSBAQAogICAgICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnJXIgaXMgYW4gaW52YWxpZCBmaWxlIG1vZGUnICUgbW9kZSkKIAorICAgIGRlZiB0ZXN0TW9kZVN0cmluZ3Moc2VsZik6CisgICAgICAgICMgdGVzdCB0aGF0IHRoZSBtb2RlIGF0dHJpYnV0ZSBpcyBjb3JyZWN0IGZvciB2YXJpb3VzIG1vZGUgc3RyaW5ncworICAgICAgICAjIGdpdmVuIGFzIGluaXQgYXJncworICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgbW9kZXMgaW4gWygndycsICd3YicpLCAoJ3diJywgJ3diJyksICgnd2IrJywgJ3JiKycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3crYicsICdyYisnKSwgKCdhJywgJ2FiJyksICgnYWInLCAnYWInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCdhYisnLCAnYWIrJyksICgnYStiJywgJ2FiKycpLCAoJ3InLCAncmInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCdyYicsICdyYicpLCAoJ3JiKycsICdyYisnKSwgKCdyK2InLCAncmIrJyldOgorICAgICAgICAgICAgICAgICMgcmVhZCBtb2RlcyBhcmUgbGFzdCBzbyB0aGF0IFRFU1RGTiB3aWxsIGV4aXN0IGZpcnN0CisgICAgICAgICAgICAgICAgd2l0aCBfRmlsZUlPKFRFU1RGTiwgbW9kZXNbMF0pIGFzIGY6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5tb2RlLCBtb2Rlc1sxXSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKFRFU1RGTik6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKFRFU1RGTikKKwogICAgIGRlZiB0ZXN0VW5pY29kZU9wZW4oc2VsZik6CiAgICAgICAgICMgdmVyaWZ5IHJlcHIgd29ya3MgZm9yIHVuaWNvZGUgdG9vCiAgICAgICAgIGYgPSBfRmlsZUlPKHN0cihURVNURk4pLCAidyIpCkBAIC0yOTcsOCArMzQyLDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgZm4gPSBURVNURk4uZW5jb2RlKCJhc2NpaSIpCiAgICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6Ci0gICAgICAgICAgICAjIFNraXAgdGVzdAotICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCdjb3VsZCBub3QgZW5jb2RlICVyIHRvIGFzY2lpJyAlIFRFU1RGTikKICAgICAgICAgZiA9IF9GaWxlSU8oZm4sICJ3IikKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgZi53cml0ZShiImFiYyIpCkBAIC0zMTUsNiArMzU5LDEzIEBACiAgICAgICAgICAgICBpbXBvcnQgbXN2Y3J0CiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBtc3ZjcnQuZ2V0X29zZmhhbmRsZSwgbWFrZV9iYWRfZmQoKSkKIAorICAgIEBjcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdEludmFsaWRGZF9vdmVyZmxvdyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAxNTk4OQorICAgICAgICBpbXBvcnQgX3Rlc3RjYXBpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgX0ZpbGVJTywgX3Rlc3RjYXBpLklOVF9NQVggKyAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIF9GaWxlSU8sIF90ZXN0Y2FwaS5JTlRfTUlOIC0gMSkKKwogICAgIGRlZiB0ZXN0QmFkTW9kZUFyZ3VtZW50KHNlbGYpOgogICAgICAgICAjIHZlcmlmeSB0aGF0IHdlIGdldCBhIHNlbnNpYmxlIGVycm9yIG1lc3NhZ2UgZm9yIGJhZCBtb2RlIGFyZ3VtZW50CiAgICAgICAgIGJhZF9tb2RlID0gInF3ZXJ0eSIKQEAgLTQxNywxMCArNDY4LDIyIEBACiAgICAgICAgIGVudiA9IGRpY3Qob3MuZW52aXJvbikKICAgICAgICAgZW52W2InTENfQ1RZUEUnXSA9IGInQycKICAgICAgICAgXywgb3V0ID0gcnVuX3B5dGhvbignLWMnLCAnaW1wb3J0IF9pbzsgX2lvLkZpbGVJTyglciknICUgZmlsZW5hbWUsIGVudj1lbnYpCi0gICAgICAgIGlmICgnVW5pY29kZUVuY29kZUVycm9yJyBub3QgaW4gb3V0IGFuZAotICAgICAgICAgICAgJ0lPRXJyb3I6IFtFcnJubyAyXSBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5JyBub3QgaW4gb3V0KToKKyAgICAgICAgaWYgKCdVbmljb2RlRW5jb2RlRXJyb3InIG5vdCBpbiBvdXQgYW5kIG5vdAorICAgICAgICAgICAgICAgICggKCdJT0Vycm9yOiBbRXJybm8gMl0gTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeScgaW4gb3V0KSBvcgorICAgICAgICAgICAgICAgICAgKCdJT0Vycm9yOiBbRXJybm8gMjJdIEludmFsaWQgYXJndW1lbnQnIGluIG91dCkgKSApOgogICAgICAgICAgICAgc2VsZi5mYWlsKCdCYWQgb3V0cHV0OiAlcicgJSBvdXQpCiAKKyAgICBkZWYgdGVzdFVuY2xvc2VkRkRPbkV4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgY2xhc3MgTXlFeGNlcHRpb24oRXhjZXB0aW9uKTogcGFzcworICAgICAgICBjbGFzcyBNeUZpbGVJTyhfRmlsZUlPKToKKyAgICAgICAgICAgIGRlZiBfX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgaWYgbmFtZSA9PSAibmFtZSI6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIE15RXhjZXB0aW9uKCJibG9ja2VkIHNldHRpbmcgbmFtZSIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyKE15RmlsZUlPLCBzZWxmKS5fX3NldGF0dHJfXyhuYW1lLCB2YWx1ZSkKKyAgICAgICAgZmQgPSBvcy5vcGVuKF9fZmlsZV9fLCBvcy5PX1JET05MWSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTXlFeGNlcHRpb24sIE15RmlsZUlPLCBmZCkKKyAgICAgICAgb3MuY2xvc2UoZmQpICAjIHNob3VsZCBub3QgcmFpc2UgT1NFcnJvcihFQkFERikKKwogZGVmIHRlc3RfbWFpbigpOgogICAgICMgSGlzdG9yaWNhbGx5LCB0aGVzZSB0ZXN0cyBoYXZlIGJlZW4gc2xvcHB5IGFib3V0IHJlbW92aW5nIFRFU1RGTi4KICAgICAjIFNvIGdldCByaWQgb2YgaXQgbm8gbWF0dGVyIHdoYXQuCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Zsb2F0LnB5IGIvTGliL3Rlc3QvdGVzdF9mbG9hdC5weQppbmRleCA0MjQ2MzcxLi5lNjc3OWM0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Zsb2F0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZmxvYXQucHkKQEAgLTEwMSw3ICsxMDEsNyBAQAogICAgICAgICAjIGl0IHN0aWxsIGhhcyB0byBhY2NlcHQgdGhlIG5vcm1hbCBweXRob24gc3ludGF4CiAgICAgICAgIGltcG9ydCBsb2NhbGUKICAgICAgICAgaWYgbm90IGxvY2FsZS5sb2NhbGVjb252KClbJ2RlY2ltYWxfcG9pbnQnXSA9PSAnLCc6Ci0gICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ2RlY2ltYWxfcG9pbnQgaXMgbm90ICIsIicpCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCgiICAzLjE0ICAiKSwgMy4xNCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCgiKzMuMTQgICIpLCAzLjE0KQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mb3JtYXQucHkgYi9MaWIvdGVzdC90ZXN0X2Zvcm1hdC5weQppbmRleCBmMzk0MjZiLi5iYTMzOTllIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Zvcm1hdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Zvcm1hdC5weQpAQCAtMjM0LDYgKzIzNCwxNiBAQAogICAgICAgICB0ZXN0Zm9ybWF0KCclZycsIDEuMSwgJzEuMScpCiAgICAgICAgIHRlc3Rmb3JtYXQoJyUjZycsIDEuMSwgJzEuMTAwMDAnKQogCisgICAgICAgICMgUmVncmVzc2lvbiB0ZXN0IGZvciBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTU1MTYuCisgICAgICAgIGNsYXNzIEludEZhaWxzKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbnRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkCisgICAgICAgICAgICBkZWYgX19sb25nX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDAKKworICAgICAgICBmc3QgPSBJbnRGYWlscygpCisgICAgICAgIHRlc3Rmb3JtYXQoIiV4IiwgZnN0LCAnMCcpCisKICAgICAgICAgIyBUZXN0IGV4Y2VwdGlvbiBmb3IgdW5rbm93biBmb3JtYXQgY2hhcmFjdGVycwogICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICAgcHJpbnQgJ1Rlc3RpbmcgZXhjZXB0aW9ucycKQEAgLTI5Miw2ICszMDIsMzMgQEAKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEZvcm1hdFRlc3QpCiAKKyAgICBkZWYgdGVzdF9wcmVjaXNpb24oc2VsZik6CisgICAgICAgIGYgPSAxLjIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoZiwgIi4wZiIpLCAiMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KGYsICIuM2YiKSwgIjEuMjAwIikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKSBhcyBjbToKKyAgICAgICAgICAgIGZvcm1hdChmLCAiLiVzZiIgJSAoc3lzLm1heHNpemUgKyAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY20uZXhjZXB0aW9uKSwgInByZWNpc2lvbiB0b28gYmlnIikKKworICAgICAgICBjID0gY29tcGxleChmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdChjLCAiLjBmIiksICIxKzBqIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoYywgIi4zZiIpLCAiMS4yMDArMC4wMDBqIikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKSBhcyBjbToKKyAgICAgICAgICAgIGZvcm1hdChjLCAiLiVzZiIgJSAoc3lzLm1heHNpemUgKyAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY20uZXhjZXB0aW9uKSwgInByZWNpc2lvbiB0b28gYmlnIikKKworICAgIEB0ZXN0X3N1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3RfcHJlY2lzaW9uX2NfbGltaXRzKHNlbGYpOgorICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgSU5UX01BWAorCisgICAgICAgIGYgPSAxLjIKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKSBhcyBjbToKKyAgICAgICAgICAgIGZvcm1hdChmLCAiLiVzZiIgJSAoSU5UX01BWCArIDEpKQorCisgICAgICAgIGMgPSBjb21wbGV4KGYpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcikgYXMgY206CisgICAgICAgICAgICBmb3JtYXQoYywgIi4lc2YiICUgKElOVF9NQVggKyAxKSkKKwogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mcmFjdGlvbnMucHkgYi9MaWIvdGVzdC90ZXN0X2ZyYWN0aW9ucy5weQppbmRleCBhNzk4NDc3Li5kZTA5YmIwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ZyYWN0aW9ucy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ZyYWN0aW9ucy5weQpAQCAtNiw2ICs2LDcgQEAKIGltcG9ydCBudW1iZXJzCiBpbXBvcnQgb3BlcmF0b3IKIGltcG9ydCBmcmFjdGlvbnMKK2ltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAogZnJvbSBjb3B5IGltcG9ydCBjb3B5LCBkZWVwY29weQogZnJvbSBjUGlja2xlIGltcG9ydCBkdW1wcywgbG9hZHMKQEAgLTg4LDYgKzg5LDkgQEAKICAgICBfX2hhc2hfXyA9IE5vbmUKIAogCitjbGFzcyBEdW1teUZyYWN0aW9uKGZyYWN0aW9ucy5GcmFjdGlvbik6CisgICAgIiIiRHVtbXkgRnJhY3Rpb24gc3ViY2xhc3MgZm9yIGNvcHkgYW5kIGRlZXBjb3B5IHRlc3RpbmcuIiIiCisKIGNsYXNzIEdjZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RNaXNjKHNlbGYpOgpAQCAtMzAxLDExICszMDUsMTUgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGKDIwMSwgMjAwKS5saW1pdF9kZW5vbWluYXRvcigxMDApLCBGKDEpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEYoMjAxLCAyMDApLmxpbWl0X2Rlbm9taW5hdG9yKDEwMSksIEYoMTAyLCAxMDEpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEYoMCkubGltaXRfZGVub21pbmF0b3IoMTAwMDApLCBGKDApKQorICAgICAgICBmb3IgaSBpbiAoMCwgLTEpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAorICAgICAgICAgICAgICAgIFZhbHVlRXJyb3IsICJtYXhfZGVub21pbmF0b3Igc2hvdWxkIGJlIGF0IGxlYXN0IDEiLAorICAgICAgICAgICAgICAgIEYoMSkubGltaXRfZGVub21pbmF0b3IsIGkpCiAKICAgICBkZWYgdGVzdENvbnZlcnNpb25zKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKC0xLCBtYXRoLnRydW5jKEYoLTExLCAxMCkpKQogICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKC0xLCBpbnQoRigtMTEsIDEwKSkpCi0KKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygxLCBtYXRoLnRydW5jKEYoMTEsIDEwKSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIGJvb2woRigwLCAxKSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgYm9vbChGKDMsIDIpKSkKICAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygwLjEsIGZsb2F0KEYoMSwgMTApKSkKQEAgLTMzMCw2ICszMzgsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEYoOCwgMjcpLCBGKDIsIDMpICoqIEYoMykpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRigyNywgOCksIEYoMiwgMykgKiogRigtMykpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoMi4wLCBGKDQpICoqIEYoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRigxLCAxKSwgK0YoMSwgMSkpCiAgICAgICAgICMgV2lsbCByZXR1cm4gMWogaW4gMy4wOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBwb3csIEYoLTEpLCBGKDEsIDIpKQogCkBAIC0zOTQsNiArNDAzLDEwIEBACiAgICAgICAgICAgICBUeXBlRXJyb3IsCiAgICAgICAgICAgICAidW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciArOiAnRnJhY3Rpb24nIGFuZCAnRGVjaW1hbCciLAogICAgICAgICAgICAgb3BlcmF0b3IuYWRkLCBGKDMsMTEpLCBEZWNpbWFsKCczLjE0MTU5MjYnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAorICAgICAgICAgICAgVHlwZUVycm9yLAorICAgICAgICAgICAgInVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgKzogJ0RlY2ltYWwnIGFuZCAnRnJhY3Rpb24nIiwKKyAgICAgICAgICAgIG9wZXJhdG9yLmFkZCwgRGVjaW1hbCgnMy4xNDE1OTI2JyksIEYoMywxMSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoRig1LCAyKSwgRGVjaW1hbCgnMi41JykpCiAKICAgICBkZWYgdGVzdENvbXBhcmlzb25zKHNlbGYpOgpAQCAtNTcxLDkgKzU4NCwxNCBAQAogCiAgICAgZGVmIHRlc3RfY29weV9kZWVwY29weV9waWNrbGUoc2VsZik6CiAgICAgICAgIHIgPSBGKDEzLCA3KQorICAgICAgICBkciA9IER1bW15RnJhY3Rpb24oMTMsIDcpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwociwgbG9hZHMoZHVtcHMocikpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlkKHIpLCBpZChjb3B5KHIpKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpZChyKSwgaWQoZGVlcGNvcHkocikpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGRyKSwgaWQoY29weShkcikpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGRyKSwgaWQoZGVlcGNvcHkoZHIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscyhkciwgY29weShkcikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoZHIsIGRlZXBjb3B5KGRyKSkKIAogICAgIGRlZiB0ZXN0X3Nsb3RzKHNlbGYpOgogICAgICAgICAjIElzc3VlIDQ5OTgKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZnRwbGliLnB5IGIvTGliL3Rlc3QvdGVzdF9mdHBsaWIucHkKaW5kZXggOTE5OTU4Mi4uYjNkOGY3ZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9mdHBsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mdHBsaWIucHkKQEAgLTE1LDkgKzE1LDkgQEAKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICBzc2wgPSBOb25lCiAKLWZyb20gdW5pdHRlc3QgaW1wb3J0IFRlc3RDYXNlCitmcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0Q2FzZSwgU2tpcFRlc3QsIHNraXBVbmxlc3MKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Ci1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBIT1NUCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBIT1NULCBIT1NUdjYKIHRocmVhZGluZyA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCd0aHJlYWRpbmcnKQogCiAKQEAgLTY1LDYgKzY1LDcgQEAKICAgICAgICAgc2VsZi5sYXN0X3JlY2VpdmVkX2RhdGEgPSAnJwogICAgICAgICBzZWxmLm5leHRfcmVzcG9uc2UgPSAnJwogICAgICAgICBzZWxmLnJlc3QgPSBOb25lCisgICAgICAgIHNlbGYubmV4dF9yZXRyX2RhdGEgPSBSRVRSX0RBVEEKICAgICAgICAgc2VsZi5wdXNoKCcyMjAgd2VsY29tZScpCiAKICAgICBkZWYgY29sbGVjdF9pbmNvbWluZ19kYXRhKHNlbGYsIGRhdGEpOgpAQCAtMTg5LDcgKzE5MCw3IEBACiAgICAgICAgICAgICBvZmZzZXQgPSBpbnQoc2VsZi5yZXN0KQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgb2Zmc2V0ID0gMAotICAgICAgICBzZWxmLmR0cC5wdXNoKFJFVFJfREFUQVtvZmZzZXQ6XSkKKyAgICAgICAgc2VsZi5kdHAucHVzaChzZWxmLm5leHRfcmV0cl9kYXRhW29mZnNldDpdKQogICAgICAgICBzZWxmLmR0cC5jbG9zZV93aGVuX2RvbmUoKQogICAgICAgICBzZWxmLnJlc3QgPSBOb25lCiAKQEAgLTIwMyw2ICsyMDQsMTEgQEAKICAgICAgICAgc2VsZi5kdHAucHVzaChOTFNUX0RBVEEpCiAgICAgICAgIHNlbGYuZHRwLmNsb3NlX3doZW5fZG9uZSgpCiAKKyAgICBkZWYgY21kX3NldGxvbmdyZXRyKHNlbGYsIGFyZyk6CisgICAgICAgICMgRm9yIHRlc3RpbmcuIE5leHQgUkVUUiB3aWxsIHJldHVybiBsb25nIGxpbmUuCisgICAgICAgIHNlbGYubmV4dF9yZXRyX2RhdGEgPSAneCcgKiBpbnQoYXJnKQorICAgICAgICBzZWxmLnB1c2goJzEyNSBzZXRsb25ncmV0ciBvaycpCisKIAogY2xhc3MgRHVtbXlGVFBTZXJ2ZXIoYXN5bmNvcmUuZGlzcGF0Y2hlciwgdGhyZWFkaW5nLlRocmVhZCk6CiAKQEAgLTQ3NCw2ICs0ODAsMTQgQEAKICAgICBkZWYgdGVzdF9ybWQoc2VsZik6CiAgICAgICAgIHNlbGYuY2xpZW50LnJtZCgnZm9vJykKIAorICAgIGRlZiB0ZXN0X2N3ZChzZWxmKToKKyAgICAgICAgZGlyID0gc2VsZi5jbGllbnQuY3dkKCcvZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXIsICcyNTAgY3dkIG9rJykKKworICAgIGRlZiB0ZXN0X21rZChzZWxmKToKKyAgICAgICAgZGlyID0gc2VsZi5jbGllbnQubWtkKCcvZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXIsICcvZm9vJykKKwogICAgIGRlZiB0ZXN0X3B3ZChzZWxmKToKICAgICAgICAgZGlyID0gc2VsZi5jbGllbnQucHdkKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXIsICdwd2Qgb2snKQpAQCAtNTUwLDExICs1NjQsMzMgQEAKICAgICAgICAgIyBJUHY0IGlzIGluIHVzZSwganVzdCBtYWtlIHN1cmUgc2VuZF9lcHN2IGhhcyBub3QgYmVlbiB1c2VkCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXJ2ZXIuaGFuZGxlci5sYXN0X3JlY2VpdmVkX2NtZCwgJ3Bhc3YnKQogCisgICAgZGVmIHRlc3RfbGluZV90b29fbG9uZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZnRwbGliLkVycm9yLCBzZWxmLmNsaWVudC5zZW5kY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAneCcgKiBzZWxmLmNsaWVudC5tYXhsaW5lICogMikKIAorICAgIGRlZiB0ZXN0X3JldHJsaW5lc190b29fbG9uZyhzZWxmKToKKyAgICAgICAgc2VsZi5jbGllbnQuc2VuZGNtZCgnU0VUTE9OR1JFVFIgJWQnICUgKHNlbGYuY2xpZW50Lm1heGxpbmUgKiAyKSkKKyAgICAgICAgcmVjZWl2ZWQgPSBbXQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhmdHBsaWIuRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50LnJldHJsaW5lcywgJ3JldHInLCByZWNlaXZlZC5hcHBlbmQpCisKKyAgICBkZWYgdGVzdF9zdG9ybGluZXNfdG9vX2xvbmcoc2VsZik6CisgICAgICAgIGYgPSBTdHJpbmdJTy5TdHJpbmdJTygneCcgKiBzZWxmLmNsaWVudC5tYXhsaW5lICogMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZnRwbGliLkVycm9yLCBzZWxmLmNsaWVudC5zdG9ybGluZXMsICdzdG9yJywgZikKKworCitAc2tpcFVubGVzcyhzb2NrZXQuaGFzX2lwdjYsICJJUHY2IG5vdCBlbmFibGVkIikKIGNsYXNzIFRlc3RJUHY2RW52aXJvbm1lbnQoVGVzdENhc2UpOgogCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgRHVtbXlGVFBTZXJ2ZXIoKEhPU1QsIDApLCBhZj1zb2NrZXQuQUZfSU5FVDYpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICByYWlzZSBTa2lwVGVzdCgiSVB2NiBub3QgZW5hYmxlZCIpCisKICAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYuc2VydmVyID0gRHVtbXlGVFBTZXJ2ZXIoKEhPU1QsIDApLCBhZj1zb2NrZXQuQUZfSU5FVDYpCisgICAgICAgIHNlbGYuc2VydmVyID0gRHVtbXlGVFBTZXJ2ZXIoKEhPU1R2NiwgMCksIGFmPXNvY2tldC5BRl9JTkVUNikKICAgICAgICAgc2VsZi5zZXJ2ZXIuc3RhcnQoKQogICAgICAgICBzZWxmLmNsaWVudCA9IGZ0cGxpYi5GVFAoKQogICAgICAgICBzZWxmLmNsaWVudC5jb25uZWN0KHNlbGYuc2VydmVyLmhvc3QsIHNlbGYuc2VydmVyLnBvcnQpCkBAIC01ODcsNiArNjIzLDcgQEAKICAgICAgICAgcmV0cigpCiAKIAorQHNraXBVbmxlc3Moc3NsLCAiU1NMIG5vdCBhdmFpbGFibGUiKQogY2xhc3MgVGVzdFRMU19GVFBDbGFzc01peGluKFRlc3RGVFBDbGFzcyk6CiAgICAgIiIiUmVwZWF0IFRlc3RGVFBDbGFzcyB0ZXN0cyBzdGFydGluZyB0aGUgVExTIGxheWVyIGZvciBib3RoIGNvbnRyb2wKICAgICBhbmQgZGF0YSBjb25uZWN0aW9ucyBmaXJzdC4KQEAgLTYwMiw2ICs2MzksNyBAQAogICAgICAgICBzZWxmLmNsaWVudC5wcm90X3AoKQogCiAKK0Bza2lwVW5sZXNzKHNzbCwgIlNTTCBub3QgYXZhaWxhYmxlIikKIGNsYXNzIFRlc3RUTFNfRlRQQ2xhc3MoVGVzdENhc2UpOgogICAgICIiIlNwZWNpZmljIFRMU19GVFAgY2xhc3MgdGVzdHMuIiIiCiAKQEAgLTY2Nyw3ICs3MDUsNyBAQAogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc2VsZi5ldnQgPSB0aHJlYWRpbmcuRXZlbnQoKQogICAgICAgICBzZWxmLnNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCi0gICAgICAgIHNlbGYuc29jay5zZXR0aW1lb3V0KDMpCisgICAgICAgIHNlbGYuc29jay5zZXR0aW1lb3V0KDEwKQogICAgICAgICBzZWxmLnBvcnQgPSB0ZXN0X3N1cHBvcnQuYmluZF9wb3J0KHNlbGYuc29jaykKICAgICAgICAgdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5zZXJ2ZXIsIGFyZ3M9KHNlbGYuZXZ0LHNlbGYuc29jaykpLnN0YXJ0KCkKICAgICAgICAgIyBXYWl0IGZvciB0aGUgc2VydmVyIHRvIGJlIHJlYWR5LgpAQCAtNzAyLDEwICs3NDAsMTAgQEAKIAogICAgIGRlZiB0ZXN0VGltZW91dERlZmF1bHQoc2VsZik6CiAgICAgICAgICMgZGVmYXVsdCAtLSB1c2UgZ2xvYmFsIHNvY2tldCB0aW1lb3V0Ci0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSkKICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDMwKQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmdHAgPSBmdHBsaWIuRlRQKCJsb2NhbGhvc3QiKQorICAgICAgICAgICAgZnRwID0gZnRwbGliLkZUUChIT1NUKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnRwLnNvY2suZ2V0dGltZW91dCgpLCAzMCkKQEAgLTcxNCwxMyArNzUyLDEzIEBACiAKICAgICBkZWYgdGVzdFRpbWVvdXROb25lKHNlbGYpOgogICAgICAgICAjIG5vIHRpbWVvdXQgLS0gZG8gbm90IHVzZSBnbG9iYWwgc29ja2V0IHRpbWVvdXQKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpKQogICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoMzApCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIGZ0cCA9IGZ0cGxpYi5GVFAoImxvY2FsaG9zdCIsIHRpbWVvdXQ9Tm9uZSkKKyAgICAgICAgICAgIGZ0cCA9IGZ0cGxpYi5GVFAoSE9TVCwgdGltZW91dD1Ob25lKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmdHAuc29jay5nZXR0aW1lb3V0KCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoZnRwLnNvY2suZ2V0dGltZW91dCgpKQogICAgICAgICBzZWxmLmV2dC53YWl0KCkKICAgICAgICAgZnRwLmNsb3NlKCkKIApAQCAtNzU1LDE3ICs3OTMsOSBAQAogCiAKIGRlZiB0ZXN0X21haW4oKToKLSAgICB0ZXN0cyA9IFtUZXN0RlRQQ2xhc3MsIFRlc3RUaW1lb3V0c10KLSAgICBpZiBzb2NrZXQuaGFzX2lwdjY6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIER1bW15RlRQU2VydmVyKChIT1NULCAwKSwgYWY9c29ja2V0LkFGX0lORVQ2KQotICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgotICAgICAgICAgICAgcGFzcwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgdGVzdHMuYXBwZW5kKFRlc3RJUHY2RW52aXJvbm1lbnQpCi0KLSAgICBpZiBzc2wgaXMgbm90IE5vbmU6Ci0gICAgICAgIHRlc3RzLmV4dGVuZChbVGVzdFRMU19GVFBDbGFzc01peGluLCBUZXN0VExTX0ZUUENsYXNzXSkKKyAgICB0ZXN0cyA9IFtUZXN0RlRQQ2xhc3MsIFRlc3RUaW1lb3V0cywKKyAgICAgICAgICAgICBUZXN0SVB2NkVudmlyb25tZW50LAorICAgICAgICAgICAgIFRlc3RUTFNfRlRQQ2xhc3NNaXhpbiwgVGVzdFRMU19GVFBDbGFzc10KIAogICAgIHRocmVhZF9pbmZvID0gdGVzdF9zdXBwb3J0LnRocmVhZGluZ19zZXR1cCgpCiAgICAgdHJ5OgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkgYi9MaWIvdGVzdC90ZXN0X2Z1bmN0b29scy5weQppbmRleCBhNzEzMzE0Li40NDVhZDllIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Z1bmN0b29scy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Z1bmN0b29scy5weQpAQCAtNDMsOCArNDMsNiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuYXJncywgKDEsIDIpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAua2V5d29yZHMsIGRpY3QoYT0xMCwgYj0yMCkpCiAgICAgICAgICMgYXR0cmlidXRlcyBzaG91bGQgbm90IGJlIHdyaXRhYmxlCi0gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHNlbGYudGhldHlwZSwgdHlwZSk6Ci0gICAgICAgICAgICByZXR1cm4KICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBwLCAnZnVuYycsIG1hcCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBwLCAnYXJncycsICgxLCAyKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBwLCAna2V5d29yZHMnLCBkaWN0KGE9MSwgYj0yKSkKQEAgLTE1MSw2ICsxNDksMjMgQEAKICAgICAgICAgZl9jb3B5ID0gcGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyhmKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaWduYXR1cmUoZiksIHNpZ25hdHVyZShmX2NvcHkpKQogCisgICAgIyBJc3N1ZSA2MDgzOiBSZWZlcmVuY2UgY291bnRpbmcgYnVnCisgICAgZGVmIHRlc3Rfc2V0c3RhdGVfcmVmY291bnQoc2VsZik6CisgICAgICAgIGNsYXNzIEJhZFNlcXVlbmNlOgorICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDQKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIGlmIGtleSA9PSAwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF4CisgICAgICAgICAgICAgICAgZWxpZiBrZXkgPT0gMToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHJhbmdlKDEwMDAwMDApKQorICAgICAgICAgICAgICAgIGVsaWYga2V5IGluICgyLCAzKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9CisgICAgICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcgorCisgICAgICAgIGYgPSBzZWxmLnRoZXR5cGUob2JqZWN0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeXN0ZW1FcnJvciwgZi5fX3NldHN0YXRlX18sIEJhZFNlcXVlbmNlKCkpCisKIGNsYXNzIFBhcnRpYWxTdWJjbGFzcyhmdW5jdG9vbHMucGFydGlhbCk6CiAgICAgcGFzcwogCkBAIC0xNjMsNyArMTc4LDEwIEBACiAgICAgdGhldHlwZSA9IFB5dGhvblBhcnRpYWwKIAogICAgICMgdGhlIHB5dGhvbiB2ZXJzaW9uIGlzbid0IHBpY2tsYWJsZQotICAgIGRlZiB0ZXN0X3BpY2tsZShzZWxmKTogcGFzcworICAgIHRlc3RfcGlja2xlID0gdGVzdF9zZXRzdGF0ZV9yZWZjb3VudCA9IE5vbmUKKworICAgICMgdGhlIHB5dGhvbiB2ZXJzaW9uIGlzbid0IGEgdHlwZQorICAgIHRlc3RfYXR0cmlidXRlcyA9IE5vbmUKIAogY2xhc3MgVGVzdFVwZGF0ZVdyYXBwZXIodW5pdHRlc3QuVGVzdENhc2UpOgogCkBAIC0yMzIsNiArMjUwLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cmFwcGVyLmF0dHIsICdUaGlzIGlzIGEgZGlmZmVyZW50IHRlc3QnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyYXBwZXIuZGljdF9hdHRyLCBmLmRpY3RfYXR0cikKIAorICAgIEB0ZXN0X3N1cHBvcnQucmVxdWlyZXNfZG9jc3RyaW5ncwogICAgIGRlZiB0ZXN0X2J1aWx0aW5fdXBkYXRlKHNlbGYpOgogICAgICAgICAjIFRlc3QgZm9yIGJ1ZyAjMTU3NjI0MQogICAgICAgICBkZWYgd3JhcHBlcigpOgpAQCAtMjU4LDcgKzI3Nyw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3JhcHBlci5fX25hbWVfXywgJ2YnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyYXBwZXIuYXR0ciwgJ1RoaXMgaXMgYWxzbyBhIHRlc3QnKQogCi0gICAgQHVuaXR0ZXN0LnNraXBJZihub3Qgc3lzLmZsYWdzLm9wdGltaXplIDw9IDEsCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMuZmxhZ3Mub3B0aW1pemUgPj0gMiwKICAgICAgICAgICAgICAgICAgICAgICJEb2NzdHJpbmdzIGFyZSBvbWl0dGVkIHdpdGggLU8yIGFuZCBhYm92ZSIpCiAgICAgZGVmIHRlc3RfZGVmYXVsdF91cGRhdGVfZG9jKHNlbGYpOgogICAgICAgICB3cmFwcGVyID0gc2VsZi5fZGVmYXVsdF91cGRhdGUoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nYy5weSBiL0xpYi90ZXN0L3Rlc3RfZ2MucHkKaW5kZXggNWEzNWRlYy4uZmQ4NzRjMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2djLnB5CkBAIC0xLDkgKzEsMTUgQEAKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZSwgcnVuX3VuaXR0ZXN0CiBpbXBvcnQgc3lzCitpbXBvcnQgdGltZQogaW1wb3J0IGdjCiBpbXBvcnQgd2Vha3JlZgogCit0cnk6CisgICAgaW1wb3J0IHRocmVhZGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHRocmVhZGluZyA9IE5vbmUKKwogIyMjIFN1cHBvcnQgY29kZQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCkBAIC0yOTksNiArMzA1LDY5IEBACiAgICAgICAgICAgICAgICAgdiA9IHsxOiB2LCAyOiBPdWNoKCl9CiAgICAgICAgIGdjLmRpc2FibGUoKQogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAidGVzdCBtZWFuaW5nbGVzcyBvbiBidWlsZHMgd2l0aG91dCB0aHJlYWRzIikKKyAgICBkZWYgdGVzdF90cmFzaGNhbl90aHJlYWRzKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxMzk5MjogdHJhc2hjYW4gbWVjaGFuaXNtIHNob3VsZCBiZSB0aHJlYWQtc2FmZQorICAgICAgICBORVNUSU5HID0gNjAKKyAgICAgICAgTl9USFJFQURTID0gMgorCisgICAgICAgIGRlZiBzbGVlcGVyX2dlbigpOgorICAgICAgICAgICAgIiIiQSBnZW5lcmF0b3IgdGhhdCByZWxlYXNlcyB0aGUgR0lMIHdoZW4gY2xvc2VkIG9yIGRlYWxsb2MnZWQuIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgeWllbGQKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjAwMDAwMSkKKworICAgICAgICBjbGFzcyBDKGxpc3QpOgorICAgICAgICAgICAgIyBBcHBlbmRpbmcgdG8gYSBsaXN0IGlzIGF0b21pYywgd2hpY2ggYXZvaWRzIHRoZSB1c2Ugb2YgYSBsb2NrLgorICAgICAgICAgICAgaW5pdHMgPSBbXQorICAgICAgICAgICAgZGVscyA9IFtdCisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgYWxpc3QpOgorICAgICAgICAgICAgICAgIHNlbGZbOl0gPSBhbGlzdAorICAgICAgICAgICAgICAgIEMuaW5pdHMuYXBwZW5kKE5vbmUpCisgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAjIFRoaXMgX19kZWxfXyBpcyBjYWxsZWQgYnkgc3VidHlwZV9kZWFsbG9jKCkuCisgICAgICAgICAgICAgICAgQy5kZWxzLmFwcGVuZChOb25lKQorICAgICAgICAgICAgICAgICMgYGdgIHdpbGwgcmVsZWFzZSB0aGUgR0lMIHdoZW4gZ2FyYmFnZS1jb2xsZWN0ZWQuICBUaGlzCisgICAgICAgICAgICAgICAgIyBoZWxwcyBhc3NlcnQgc3VidHlwZV9kZWFsbG9jJ3MgYmVoYXZpb3VyIHdoZW4gdGhyZWFkcworICAgICAgICAgICAgICAgICMgc3dpdGNoIGluIHRoZSBtaWRkbGUgb2YgaXQuCisgICAgICAgICAgICAgICAgZyA9IHNsZWVwZXJfZ2VuKCkKKyAgICAgICAgICAgICAgICBuZXh0KGcpCisgICAgICAgICAgICAgICAgIyBOb3cgdGhhdCBfX2RlbF9fIGlzIGZpbmlzaGVkLCBzdWJ0eXBlX2RlYWxsb2Mgd2lsbCBwcm9jZWVkCisgICAgICAgICAgICAgICAgIyB0byBjYWxsIGxpc3RfZGVhbGxvYywgd2hpY2ggYWxzbyB1c2VzIHRoZSB0cmFzaGNhbiBtZWNoYW5pc20uCisKKyAgICAgICAgZGVmIG1ha2VfbmVzdGVkKCk6CisgICAgICAgICAgICAiIiJDcmVhdGUgYSBzdWZmaWNpZW50bHkgbmVzdGVkIGNvbnRhaW5lciBvYmplY3Qgc28gdGhhdCB0aGUKKyAgICAgICAgICAgIHRyYXNoY2FuIG1lY2hhbmlzbSBpcyBpbnZva2VkIHdoZW4gZGVhbGxvY2F0aW5nIGl0LiIiIgorICAgICAgICAgICAgeCA9IEMoW10pCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShORVNUSU5HKToKKyAgICAgICAgICAgICAgICB4ID0gW0MoW3hdKV0KKyAgICAgICAgICAgIGRlbCB4CisKKyAgICAgICAgZGVmIHJ1bl90aHJlYWQoKToKKyAgICAgICAgICAgICIiIkV4ZXJjaXNlIG1ha2VfbmVzdGVkKCkgaW4gYSBsb29wLiIiIgorICAgICAgICAgICAgd2hpbGUgbm90IGV4aXQ6CisgICAgICAgICAgICAgICAgbWFrZV9uZXN0ZWQoKQorCisgICAgICAgIG9sZF9jaGVja2ludGVydmFsID0gc3lzLmdldGNoZWNraW50ZXJ2YWwoKQorICAgICAgICBzeXMuc2V0Y2hlY2tpbnRlcnZhbCgzKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBleGl0ID0gRmFsc2UKKyAgICAgICAgICAgIHRocmVhZHMgPSBbXQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoTl9USFJFQURTKToKKyAgICAgICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9cnVuX3RocmVhZCkKKyAgICAgICAgICAgICAgICB0aHJlYWRzLmFwcGVuZCh0KQorICAgICAgICAgICAgZm9yIHQgaW4gdGhyZWFkczoKKyAgICAgICAgICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMS4wKQorICAgICAgICAgICAgZXhpdCA9IFRydWUKKyAgICAgICAgICAgIGZvciB0IGluIHRocmVhZHM6CisgICAgICAgICAgICAgICAgdC5qb2luKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zZXRjaGVja2ludGVydmFsKG9sZF9jaGVja2ludGVydmFsKQorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oQy5pbml0cyksIGxlbihDLmRlbHMpKQorCiAgICAgZGVmIHRlc3RfYm9vbShzZWxmKToKICAgICAgICAgY2xhc3MgQm9vbToKICAgICAgICAgICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBzb21lYXR0cmlidXRlKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2RiLnB5IGIvTGliL3Rlc3QvdGVzdF9nZGIucHkKaW5kZXggNmQ0ZmRhMS4uNmJiZTA1YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nZGIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nZGIucHkKQEAgLTE5LDI1ICsxOSw1OSBAQAogICAgICMgVGhpcyBpcyB3aGF0ICJubyBnZGIiIGxvb2tzIGxpa2UuICBUaGVyZSBtYXksIGhvd2V2ZXIsIGJlIG90aGVyCiAgICAgIyBlcnJvcnMgdGhhdCBtYW5pZmVzdCB0aGlzIHdheSB0b28uCiAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoIkNvdWxkbid0IGZpbmQgZ2RiIG9uIHRoZSBwYXRoIikKLWdkYl92ZXJzaW9uX251bWJlciA9IHJlLnNlYXJjaChyIl5HTlUgZ2RiIFteXGRdKihcZCspXC4iLCBnZGJfdmVyc2lvbikKLWlmIGludChnZGJfdmVyc2lvbl9udW1iZXIuZ3JvdXAoMSkpIDwgNzoKK2dkYl92ZXJzaW9uX251bWJlciA9IHJlLnNlYXJjaCgiXkdOVSBnZGIgW15cZF0qKFxkKylcLihcZCkiLCBnZGJfdmVyc2lvbikKK2dkYl9tYWpvcl92ZXJzaW9uID0gaW50KGdkYl92ZXJzaW9uX251bWJlci5ncm91cCgxKSkKK2dkYl9taW5vcl92ZXJzaW9uID0gaW50KGdkYl92ZXJzaW9uX251bWJlci5ncm91cCgyKSkKK2lmIGdkYl9tYWpvcl92ZXJzaW9uIDwgNzoKICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgiZ2RiIHZlcnNpb25zIGJlZm9yZSA3LjAgZGlkbid0IHN1cHBvcnQgcHl0aG9uIGVtYmVkZGluZyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFNhdzpcbiIgKyBnZGJfdmVyc2lvbikKIAorIyBMb2NhdGlvbiBvZiBjdXN0b20gaG9va3MgZmlsZSBpbiBhIHJlcG9zaXRvcnkgY2hlY2tvdXQuCitjaGVja291dF9ob29rX3BhdGggPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKHN5cy5leGVjdXRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHl0aG9uLWdkYi5weScpCisKK2RlZiBydW5fZ2RiKCphcmdzLCAqKmVudl92YXJzKToKKyAgICAiIiJSdW5zIGdkYiBpbiAtLWJhdGNoIG1vZGUgd2l0aCB0aGUgYWRkaXRpb25hbCBhcmd1bWVudHMgZ2l2ZW4gYnkgKmFyZ3MuCisKKyAgICBSZXR1cm5zIGl0cyAoc3Rkb3V0LCBzdGRlcnIpCisgICAgIiIiCisgICAgaWYgZW52X3ZhcnM6CisgICAgICAgIGVudiA9IG9zLmVudmlyb24uY29weSgpCisgICAgICAgIGVudi51cGRhdGUoZW52X3ZhcnMpCisgICAgZWxzZToKKyAgICAgICAgZW52ID0gTm9uZQorICAgIGJhc2VfY21kID0gKCdnZGInLCAnLS1iYXRjaCcpCisgICAgaWYgKGdkYl9tYWpvcl92ZXJzaW9uLCBnZGJfbWlub3JfdmVyc2lvbikgPj0gKDcsIDQpOgorICAgICAgICBiYXNlX2NtZCArPSAoJy1pZXgnLCAnYWRkLWF1dG8tbG9hZC1zYWZlLXBhdGggJyArIGNoZWNrb3V0X2hvb2tfcGF0aCkKKyAgICBvdXQsIGVyciA9IHN1YnByb2Nlc3MuUG9wZW4oYmFzZV9jbWQgKyBhcmdzLAorICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFLCBlbnY9ZW52LAorICAgICAgICApLmNvbW11bmljYXRlKCkKKyAgICByZXR1cm4gb3V0LCBlcnIKKwogIyBWZXJpZnkgdGhhdCAiZ2RiIiB3YXMgYnVpbHQgd2l0aCB0aGUgZW1iZWRkZWQgcHl0aG9uIHN1cHBvcnQgZW5hYmxlZDoKLWNtZCA9ICItLWV2YWwtY29tbWFuZD1weXRob24gaW1wb3J0IHN5czsgcHJpbnQgc3lzLnZlcnNpb25faW5mbyIKLXAgPSBzdWJwcm9jZXNzLlBvcGVuKFsiZ2RiIiwgIi0tYmF0Y2giLCBjbWRdLAotICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKLWdkYnB5X3ZlcnNpb24sIF8gPSBwLmNvbW11bmljYXRlKCkKLWlmIGdkYnB5X3ZlcnNpb24gPT0gJyc6CitnZGJweV92ZXJzaW9uLCBfID0gcnVuX2dkYigiLS1ldmFsLWNvbW1hbmQ9cHl0aG9uIGltcG9ydCBzeXM7IHByaW50KHN5cy52ZXJzaW9uX2luZm8pIikKK2lmIG5vdCBnZGJweV92ZXJzaW9uOgogICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJnZGIgbm90IGJ1aWx0IHdpdGggZW1iZWRkZWQgcHl0aG9uIHN1cHBvcnQiKQogCisjIFZlcmlmeSB0aGF0ICJnZGIiIGNhbiBsb2FkIG91ciBjdXN0b20gaG9va3MsIGFzIE9TIHNlY3VyaXR5IHNldHRpbmdzIG1heQorIyBkaXNhbGxvdyB0aGlzIHdpdGhvdXQgYSBjdXN0b21pc2VkIC5nZGJpbml0LgorY21kID0gWyctLWFyZ3MnLCBzeXMuZXhlY3V0YWJsZV0KK18sIGdkYnB5X2Vycm9ycyA9IHJ1bl9nZGIoJy0tYXJncycsIHN5cy5leGVjdXRhYmxlKQoraWYgImF1dG8tbG9hZGluZyBoYXMgYmVlbiBkZWNsaW5lZCIgaW4gZ2RicHlfZXJyb3JzOgorICAgIG1zZyA9ICJnZGIgc2VjdXJpdHkgc2V0dGluZ3MgcHJldmVudCB1c2Ugb2YgY3VzdG9tIGhvb2tzOiAiCisgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QobXNnICsgZ2RicHlfZXJyb3JzLnJzdHJpcCgpKQorCitkZWYgcHl0aG9uX2lzX29wdGltaXplZCgpOgorICAgIGNmbGFncyA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcnMoKVsnUFlfQ0ZMQUdTJ10KKyAgICBmaW5hbF9vcHQgPSAiIgorICAgIGZvciBvcHQgaW4gY2ZsYWdzLnNwbGl0KCk6CisgICAgICAgIGlmIG9wdC5zdGFydHN3aXRoKCctTycpOgorICAgICAgICAgICAgZmluYWxfb3B0ID0gb3B0CisgICAgcmV0dXJuIChmaW5hbF9vcHQgYW5kIGZpbmFsX29wdCAhPSAnLU8wJykKKwogZGVmIGdkYl9oYXNfZnJhbWVfc2VsZWN0KCk6CiAgICAgIyBEb2VzIHRoaXMgYnVpbGQgb2YgZ2RiIGhhdmUgZ2RiLkZyYW1lLnNlbGVjdCA/Ci0gICAgY21kID0gIi0tZXZhbC1jb21tYW5kPXB5dGhvbiBwcmludChkaXIoZ2RiLkZyYW1lKSkiCi0gICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oWyJnZGIiLCAiLS1iYXRjaCIsIGNtZF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKLSAgICBzdGRvdXQsIF8gPSBwLmNvbW11bmljYXRlKCkKKyAgICBzdGRvdXQsIF8gPSBydW5fZ2RiKCItLWV2YWwtY29tbWFuZD1weXRob24gcHJpbnQoZGlyKGdkYi5GcmFtZSkpIikKICAgICBtID0gcmUubWF0Y2gocicuKlxbKC4qKVxdLionLCBzdGRvdXQpCiAgICAgaWYgbm90IG06CiAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJVbmFibGUgdG8gcGFyc2Ugb3V0cHV0IGZyb20gZ2RiLkZyYW1lLnNlbGVjdCB0ZXN0IikKQEAgLTUwLDE2ICs4NCw2IEBACiAKICAgICAiIiJUZXN0IHRoYXQgdGhlIGRlYnVnZ2VyIGNhbiBkZWJ1ZyBQeXRob24uIiIiCiAKLSAgICBkZWYgcnVuX2dkYihzZWxmLCAqYXJncyk6Ci0gICAgICAgICIiIlJ1bnMgZ2RiIHdpdGggdGhlIGNvbW1hbmQgbGluZSBnaXZlbiBieSAqYXJncy4KLQotICAgICAgICBSZXR1cm5zIGl0cyBzdGRvdXQsIHN0ZGVycgotICAgICAgICAiIiIKLSAgICAgICAgb3V0LCBlcnIgPSBzdWJwcm9jZXNzLlBvcGVuKAotICAgICAgICAgICAgYXJncywgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSwKLSAgICAgICAgICAgICkuY29tbXVuaWNhdGUoKQotICAgICAgICByZXR1cm4gb3V0LCBlcnIKLQogICAgIGRlZiBnZXRfc3RhY2tfdHJhY2Uoc2VsZiwgc291cmNlPU5vbmUsIHNjcmlwdD1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludD0nUHlPYmplY3RfUHJpbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgY21kc19hZnRlcl9icmVha3BvaW50PU5vbmUsCkBAIC0xMTYsMjIgKzE0MCwzNCBAQAogICAgICAgICAjIHByaW50ICcgJy5qb2luKGFyZ3MpCiAKICAgICAgICAgIyBVc2UgImFyZ3MiIHRvIGludm9rZSBnZGIsIGNhcHR1cmluZyBzdGRvdXQsIHN0ZGVycjoKLSAgICAgICAgb3V0LCBlcnIgPSBzZWxmLnJ1bl9nZGIoKmFyZ3MpCisgICAgICAgIG91dCwgZXJyID0gcnVuX2dkYigqYXJncywgUFlUSE9OSEFTSFNFRUQ9JzAnKQogCi0gICAgICAgICMgSWdub3JlIHNvbWUgbm9pc2Ugb24gc3RkZXJyIGR1ZSB0byB0aGUgcGVuZGluZyBicmVha3BvaW50OgotICAgICAgICBlcnIgPSBlcnIucmVwbGFjZSgnRnVuY3Rpb24gIiVzIiBub3QgZGVmaW5lZC5cbicgJSBicmVha3BvaW50LCAnJykKLSAgICAgICAgIyBJZ25vcmUgc29tZSBvdGhlciBub2lzZSBvbiBzdGRlcnIgKGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU4NjAwKQotICAgICAgICBlcnIgPSBlcnIucmVwbGFjZSgid2FybmluZzogVW5hYmxlIHRvIGZpbmQgbGlidGhyZWFkX2RiIG1hdGNoaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiIGluZmVyaW9yJ3MgdGhyZWFkIGxpYnJhcnksIHRocmVhZCBkZWJ1Z2dpbmcgd2lsbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiBub3QgYmUgYXZhaWxhYmxlLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJycpCi0gICAgICAgIGVyciA9IGVyci5yZXBsYWNlKCJ3YXJuaW5nOiBDYW5ub3QgaW5pdGlhbGl6ZSB0aHJlYWQgZGVidWdnaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiIGxpYnJhcnk6IERlYnVnZ2VyIHNlcnZpY2UgZmFpbGVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAnJykKKyAgICAgICAgZXJybGluZXMgPSBlcnIuc3BsaXRsaW5lcygpCisgICAgICAgIHVuZXhwZWN0ZWRfZXJybGluZXMgPSBbXQorCisgICAgICAgICMgSWdub3JlIHNvbWUgYmVuaWduIG1lc3NhZ2VzIG9uIHN0ZGVyci4KKyAgICAgICAgaWdub3JlX3BhdHRlcm5zID0gKAorICAgICAgICAgICAgJ0Z1bmN0aW9uICIlcyIgbm90IGRlZmluZWQuJyAlIGJyZWFrcG9pbnQsCisgICAgICAgICAgICAid2FybmluZzogbm8gbG9hZGFibGUgc2VjdGlvbnMgZm91bmQgaW4gYWRkZWQgc3ltYm9sLWZpbGUiCisgICAgICAgICAgICAiIHN5c3RlbS1zdXBwbGllZCBEU08iLAorICAgICAgICAgICAgIndhcm5pbmc6IFVuYWJsZSB0byBmaW5kIGxpYnRocmVhZF9kYiBtYXRjaGluZyIKKyAgICAgICAgICAgICIgaW5mZXJpb3IncyB0aHJlYWQgbGlicmFyeSwgdGhyZWFkIGRlYnVnZ2luZyB3aWxsIgorICAgICAgICAgICAgIiBub3QgYmUgYXZhaWxhYmxlLiIsCisgICAgICAgICAgICAid2FybmluZzogQ2Fubm90IGluaXRpYWxpemUgdGhyZWFkIGRlYnVnZ2luZyIKKyAgICAgICAgICAgICIgbGlicmFyeTogRGVidWdnZXIgc2VydmljZSBmYWlsZWQiLAorICAgICAgICAgICAgJ3dhcm5pbmc6IENvdWxkIG5vdCBsb2FkIHNoYXJlZCBsaWJyYXJ5IHN5bWJvbHMgZm9yICcKKyAgICAgICAgICAgICdsaW51eC12ZHNvLnNvJywKKyAgICAgICAgICAgICd3YXJuaW5nOiBDb3VsZCBub3QgbG9hZCBzaGFyZWQgbGlicmFyeSBzeW1ib2xzIGZvciAnCisgICAgICAgICAgICAnbGludXgtZ2F0ZS5zbycsCisgICAgICAgICAgICAnRG8geW91IG5lZWQgInNldCBzb2xpYi1zZWFyY2gtcGF0aCIgb3IgJworICAgICAgICAgICAgJyJzZXQgc3lzcm9vdCI/JywKKyAgICAgICAgICAgICkKKyAgICAgICAgZm9yIGxpbmUgaW4gZXJybGluZXM6CisgICAgICAgICAgICBpZiBub3QgbGluZS5zdGFydHN3aXRoKGlnbm9yZV9wYXR0ZXJucyk6CisgICAgICAgICAgICAgICAgdW5leHBlY3RlZF9lcnJsaW5lcy5hcHBlbmQobGluZSkKIAogICAgICAgICAjIEVuc3VyZSBubyB1bmV4cGVjdGVkIGVycm9yIG1lc3NhZ2VzOgotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyciwgJycpCi0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmV4cGVjdGVkX2VycmxpbmVzLCBbXSkKICAgICAgICAgcmV0dXJuIG91dAogCiAgICAgZGVmIGdldF9nZGJfcmVwcihzZWxmLCBzb3VyY2UsCkBAIC0xNzgsNyArMjE0LDcgQEAKICAgICAgICAgIyBtYXRjaGVzIHJlcHIodmFsdWUpIGluIHRoaXMgcHJvY2VzczoKICAgICAgICAgZ2RiX3JlcHIsIGdkYl9vdXRwdXQgPSBzZWxmLmdldF9nZGJfcmVwcigncHJpbnQgJyArIHJlcHIodmFsKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRzX2FmdGVyX2JyZWFrcG9pbnQpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2RiX3JlcHIsIHJlcHIodmFsKSwgZ2RiX291dHB1dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZGJfcmVwciwgcmVwcih2YWwpKQogCiAgICAgZGVmIHRlc3RfaW50KHNlbGYpOgogICAgICAgICAnVmVyaWZ5IHRoZSBwcmV0dHktcHJpbnRpbmcgb2YgdmFyaW91cyAiaW50IiB2YWx1ZXMnCkBAIC0yMDUsNyArMjQxLDcgQEAKICAgICAgICAgJ1ZlcmlmeSB0aGUgcHJldHR5LXByaW50aW5nIG9mIGRpY3Rpb25hcmllcycKICAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKHt9KQogICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoeydmb28nOiAnYmFyJ30pCi0gICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcih7J2Zvbyc6ICdiYXInLCAnZG91Z2xhcyc6NDJ9KQorICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoInsnZm9vJzogJ2JhcicsICdkb3VnbGFzJzo0Mn0iKQogCiAgICAgZGVmIHRlc3RfbGlzdHMoc2VsZik6CiAgICAgICAgICdWZXJpZnkgdGhlIHByZXR0eS1wcmludGluZyBvZiBsaXN0cycKQEAgLTI1Miw4ICsyODgsMTQgQEAKICAgICBkZWYgdGVzdF9zZXRzKHNlbGYpOgogICAgICAgICAnVmVyaWZ5IHRoZSBwcmV0dHktcHJpbnRpbmcgb2Ygc2V0cycKICAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKHNldCgpKQotICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoc2V0KFsnYScsICdiJ10pKQotICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoc2V0KFs0LCA1LCA2XSkpCisgICAgICAgIHJlcCA9IHNlbGYuZ2V0X2dkYl9yZXByKCJwcmludCBzZXQoWydhJywgJ2InXSkiKVswXQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwLnN0YXJ0c3dpdGgoInNldChbIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXAuZW5kc3dpdGgoIl0pIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChyZXApLCB7J2EnLCAnYid9KQorICAgICAgICByZXAgPSBzZWxmLmdldF9nZGJfcmVwcigicHJpbnQgc2V0KFs0LCA1XSkiKVswXQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwLnN0YXJ0c3dpdGgoInNldChbIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXAuZW5kc3dpdGgoIl0pIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChyZXApLCB7NCwgNX0pCiAKICAgICAgICAgIyBFbnN1cmUgdGhhdCB3ZSBoYW5kbGVkIHNldHMgY29udGFpbmluZyB0aGUgImR1bW15IiBrZXkgdmFsdWUsCiAgICAgICAgICMgd2hpY2ggaGFwcGVucyBvbiBkZWxldGlvbjoKQEAgLTI2NSw4ICszMDcsMTQgQEAKICAgICBkZWYgdGVzdF9mcm96ZW5zZXRzKHNlbGYpOgogICAgICAgICAnVmVyaWZ5IHRoZSBwcmV0dHktcHJpbnRpbmcgb2YgZnJvemVuc2V0cycKICAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKGZyb3plbnNldCgpKQotICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoZnJvemVuc2V0KFsnYScsICdiJ10pKQotICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoZnJvemVuc2V0KFs0LCA1LCA2XSkpCisgICAgICAgIHJlcCA9IHNlbGYuZ2V0X2dkYl9yZXByKCJwcmludCBmcm96ZW5zZXQoWydhJywgJ2InXSkiKVswXQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwLnN0YXJ0c3dpdGgoImZyb3plbnNldChbIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXAuZW5kc3dpdGgoIl0pIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChyZXApLCB7J2EnLCAnYid9KQorICAgICAgICByZXAgPSBzZWxmLmdldF9nZGJfcmVwcigicHJpbnQgZnJvemVuc2V0KFs0LCA1XSkiKVswXQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwLnN0YXJ0c3dpdGgoImZyb3plbnNldChbIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXAuZW5kc3dpdGgoIl0pIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChyZXApLCB7NCwgNX0pCiAKICAgICBkZWYgdGVzdF9leGNlcHRpb25zKHNlbGYpOgogICAgICAgICAjIFRlc3QgYSBSdW50aW1lRXJyb3IKQEAgLTU0Myw2ICs1OTEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUuRE9UQUxMKSwKICAgICAgICAgICAgICAgICAgICAgICAgICdVbmV4cGVjdGVkIGdkYiByZXByZXNlbnRhdGlvbjogJXJcbiVzJyAlIChnZGJfb3V0cHV0LCBnZGJfb3V0cHV0KSkKIAorQHVuaXR0ZXN0LnNraXBJZihweXRob25faXNfb3B0aW1pemVkKCksCisgICAgICAgICAgICAgICAgICJQeXRob24gd2FzIGNvbXBpbGVkIHdpdGggb3B0aW1pemF0aW9ucyIpCiBjbGFzcyBQeUxpc3RUZXN0cyhEZWJ1Z2dlclRlc3RzKToKICAgICBkZWYgYXNzZXJ0TGlzdGluZyhzZWxmLCBleHBlY3RlZCwgYWN0dWFsKToKICAgICAgICAgc2VsZi5hc3NlcnRFbmRzV2l0aChhY3R1YWwsIGV4cGVjdGVkKQpAQCAtNTg1LDYgKzYzNSw4IEBACiAKIGNsYXNzIFN0YWNrTmF2aWdhdGlvblRlc3RzKERlYnVnZ2VyVGVzdHMpOgogICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKEhBU19QWVVQX1BZRE9XTiwgInRlc3QgcmVxdWlyZXMgcHktdXAvcHktZG93biBjb21tYW5kcyIpCisgICAgQHVuaXR0ZXN0LnNraXBJZihweXRob25faXNfb3B0aW1pemVkKCksCisgICAgICAgICAgICAgICAgICAgICAiUHl0aG9uIHdhcyBjb21waWxlZCB3aXRoIG9wdGltaXphdGlvbnMiKQogICAgIGRlZiB0ZXN0X3B5dXBfY29tbWFuZChzZWxmKToKICAgICAgICAgJ1ZlcmlmeSB0aGF0IHRoZSAicHktdXAiIGNvbW1hbmQgd29ya3MnCiAgICAgICAgIGJ0ID0gc2VsZi5nZXRfc3RhY2tfdHJhY2Uoc2NyaXB0PXNlbGYuZ2V0X3NhbXBsZV9zY3JpcHQoKSwKQEAgLTYxMiw2ICs2NjQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVbmFibGUgdG8gZmluZCBhbiBvbGRlciBweXRob24gZnJhbWVcbicpCiAKICAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhIQVNfUFlVUF9QWURPV04sICJ0ZXN0IHJlcXVpcmVzIHB5LXVwL3B5LWRvd24gY29tbWFuZHMiKQorICAgIEB1bml0dGVzdC5za2lwSWYocHl0aG9uX2lzX29wdGltaXplZCgpLAorICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiB3YXMgY29tcGlsZWQgd2l0aCBvcHRpbWl6YXRpb25zIikKICAgICBkZWYgdGVzdF91cF90aGVuX2Rvd24oc2VsZik6CiAgICAgICAgICdWZXJpZnkgInB5LXVwIiBmb2xsb3dlZCBieSAicHktZG93biInCiAgICAgICAgIGJ0ID0gc2VsZi5nZXRfc3RhY2tfdHJhY2Uoc2NyaXB0PXNlbGYuZ2V0X3NhbXBsZV9zY3JpcHQoKSwKQEAgLTYyNSw2ICs2NzksOCBAQAogJCcnJykKIAogY2xhc3MgUHlCdFRlc3RzKERlYnVnZ2VyVGVzdHMpOgorICAgIEB1bml0dGVzdC5za2lwSWYocHl0aG9uX2lzX29wdGltaXplZCgpLAorICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiB3YXMgY29tcGlsZWQgd2l0aCBvcHRpbWl6YXRpb25zIikKICAgICBkZWYgdGVzdF9iYXNpY19jb21tYW5kKHNlbGYpOgogICAgICAgICAnVmVyaWZ5IHRoYXQgdGhlICJweS1idCIgY29tbWFuZCB3b3JrcycKICAgICAgICAgYnQgPSBzZWxmLmdldF9zdGFja190cmFjZShzY3JpcHQ9c2VsZi5nZXRfc2FtcGxlX3NjcmlwdCgpLApAQCAtNjM2LDEwICs2OTIsMTIgQEAKICNbMC05XSsgRnJhbWUgMHhbMC05YS1mXSssIGZvciBmaWxlIC4qZ2RiX3NhbXBsZS5weSwgbGluZSA0LCBpbiBmb28gXChhPTEsIGI9MiwgYz0zXCkKICAgICBiYXJcKGEsIGIsIGNcKQogI1swLTldKyBGcmFtZSAweFswLTlhLWZdKywgZm9yIGZpbGUgLipnZGJfc2FtcGxlLnB5LCBsaW5lIDEyLCBpbiA8bW9kdWxlPiBcKFwpCi1mb29cKDEsIDIsIDNcKQorICAgIGZvb1woMSwgMiwgM1wpCiAnJycpCiAKIGNsYXNzIFB5UHJpbnRUZXN0cyhEZWJ1Z2dlclRlc3RzKToKKyAgICBAdW5pdHRlc3Quc2tpcElmKHB5dGhvbl9pc19vcHRpbWl6ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICJQeXRob24gd2FzIGNvbXBpbGVkIHdpdGggb3B0aW1pemF0aW9ucyIpCiAgICAgZGVmIHRlc3RfYmFzaWNfY29tbWFuZChzZWxmKToKICAgICAgICAgJ1ZlcmlmeSB0aGF0IHRoZSAicHktcHJpbnQiIGNvbW1hbmQgd29ya3MnCiAgICAgICAgIGJ0ID0gc2VsZi5nZXRfc3RhY2tfdHJhY2Uoc2NyaXB0PXNlbGYuZ2V0X3NhbXBsZV9zY3JpcHQoKSwKQEAgLTY0OCwxOCArNzA2LDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIi4qXG5sb2NhbCAnYXJncycgPSBcKDEsIDIsIDNcKVxuLioiKQogCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoSEFTX1BZVVBfUFlET1dOLCAidGVzdCByZXF1aXJlcyBweS11cC9weS1kb3duIGNvbW1hbmRzIikKKyAgICBAdW5pdHRlc3Quc2tpcElmKHB5dGhvbl9pc19vcHRpbWl6ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICJQeXRob24gd2FzIGNvbXBpbGVkIHdpdGggb3B0aW1pemF0aW9ucyIpCiAgICAgZGVmIHRlc3RfcHJpbnRfYWZ0ZXJfdXAoc2VsZik6CiAgICAgICAgIGJ0ID0gc2VsZi5nZXRfc3RhY2tfdHJhY2Uoc2NyaXB0PXNlbGYuZ2V0X3NhbXBsZV9zY3JpcHQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRzX2FmdGVyX2JyZWFrcG9pbnQ9WydweS11cCcsICdweS1wcmludCBjJywgJ3B5LXByaW50IGInLCAncHktcHJpbnQgYSddKQogICAgICAgICBzZWxmLmFzc2VydE11bHRpbGluZU1hdGNoZXMoYnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIi4qXG5sb2NhbCAnYycgPSAzXG5sb2NhbCAnYicgPSAyXG5sb2NhbCAnYScgPSAxXG4uKiIpCiAKKyAgICBAdW5pdHRlc3Quc2tpcElmKHB5dGhvbl9pc19vcHRpbWl6ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICJQeXRob24gd2FzIGNvbXBpbGVkIHdpdGggb3B0aW1pemF0aW9ucyIpCiAgICAgZGVmIHRlc3RfcHJpbnRpbmdfZ2xvYmFsKHNlbGYpOgogICAgICAgICBidCA9IHNlbGYuZ2V0X3N0YWNrX3RyYWNlKHNjcmlwdD1zZWxmLmdldF9zYW1wbGVfc2NyaXB0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kc19hZnRlcl9icmVha3BvaW50PVsncHktcHJpbnQgX19uYW1lX18nXSkKICAgICAgICAgc2VsZi5hc3NlcnRNdWx0aWxpbmVNYXRjaGVzKGJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciIuKlxuZ2xvYmFsICdfX25hbWVfXycgPSAnX19tYWluX18nXG4uKiIpCiAKKyAgICBAdW5pdHRlc3Quc2tpcElmKHB5dGhvbl9pc19vcHRpbWl6ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICJQeXRob24gd2FzIGNvbXBpbGVkIHdpdGggb3B0aW1pemF0aW9ucyIpCiAgICAgZGVmIHRlc3RfcHJpbnRpbmdfYnVpbHRpbihzZWxmKToKICAgICAgICAgYnQgPSBzZWxmLmdldF9zdGFja190cmFjZShzY3JpcHQ9c2VsZi5nZXRfc2FtcGxlX3NjcmlwdCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZHNfYWZ0ZXJfYnJlYWtwb2ludD1bJ3B5LXByaW50IGxlbiddKQpAQCAtNjY3LDYgKzczMSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIi4qXG5idWlsdGluICdsZW4nID0gPGJ1aWx0LWluIGZ1bmN0aW9uIGxlbj5cbi4qIikKIAogY2xhc3MgUHlMb2NhbHNUZXN0cyhEZWJ1Z2dlclRlc3RzKToKKyAgICBAdW5pdHRlc3Quc2tpcElmKHB5dGhvbl9pc19vcHRpbWl6ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICJQeXRob24gd2FzIGNvbXBpbGVkIHdpdGggb3B0aW1pemF0aW9ucyIpCiAgICAgZGVmIHRlc3RfYmFzaWNfY29tbWFuZChzZWxmKToKICAgICAgICAgYnQgPSBzZWxmLmdldF9zdGFja190cmFjZShzY3JpcHQ9c2VsZi5nZXRfc2FtcGxlX3NjcmlwdCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZHNfYWZ0ZXJfYnJlYWtwb2ludD1bJ3B5LWxvY2FscyddKQpAQCAtNjc0LDYgKzc0MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIi4qXG5hcmdzID0gXCgxLCAyLCAzXClcbi4qIikKIAogICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKEhBU19QWVVQX1BZRE9XTiwgInRlc3QgcmVxdWlyZXMgcHktdXAvcHktZG93biBjb21tYW5kcyIpCisgICAgQHVuaXR0ZXN0LnNraXBJZihweXRob25faXNfb3B0aW1pemVkKCksCisgICAgICAgICAgICAgICAgICAgICAiUHl0aG9uIHdhcyBjb21waWxlZCB3aXRoIG9wdGltaXphdGlvbnMiKQogICAgIGRlZiB0ZXN0X2xvY2Fsc19hZnRlcl91cChzZWxmKToKICAgICAgICAgYnQgPSBzZWxmLmdldF9zdGFja190cmFjZShzY3JpcHQ9c2VsZi5nZXRfc2FtcGxlX3NjcmlwdCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZHNfYWZ0ZXJfYnJlYWtwb2ludD1bJ3B5LXVwJywgJ3B5LWxvY2FscyddKQpAQCAtNjgxLDE1ICs3NDksNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciIuKlxuYSA9IDFcbmIgPSAyXG5jID0gM1xuLioiKQogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgY2ZsYWdzID0gc3lzY29uZmlnLmdldF9jb25maWdfdmFycygpWydQWV9DRkxBR1MnXQotICAgIGZpbmFsX29wdCA9ICIiCi0gICAgZm9yIG9wdCBpbiBjZmxhZ3Muc3BsaXQoKToKLSAgICAgICAgaWYgb3B0LnN0YXJ0c3dpdGgoJy1PJyk6Ci0gICAgICAgICAgICBmaW5hbF9vcHQgPSBvcHQKLSAgICBpZiBmaW5hbF9vcHQgYW5kIGZpbmFsX29wdCAhPSAnLU8wJzoKLSAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoIlB5dGhvbiB3YXMgYnVpbHQgd2l0aCBjb21waWxlciBvcHRpbWl6YXRpb25zLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0cyBjYW4ndCByZWxpYWJseSBzdWNjZWVkIikKLQogICAgIHJ1bl91bml0dGVzdChQcmV0dHlQcmludFRlc3RzLAogICAgICAgICAgICAgICAgICBQeUxpc3RUZXN0cywKICAgICAgICAgICAgICAgICAgU3RhY2tOYXZpZ2F0aW9uVGVzdHMsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2dkYm0ucHkgYi9MaWIvdGVzdC90ZXN0X2dkYm0ucHkKaW5kZXggZjRiYmMzOC4uZTkxNjlhMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nZGJtLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ2RibS5weQpAQCAtNDcsNyArNDcsNyBAQAogICAgICAgICBhbGwgPSBzZXQoZ2RibS5vcGVuX2ZsYWdzKQogICAgICAgICAjIFRlc3Qgc3RhbmRhcmQgZmxhZ3MgKHByZXN1bWFibHkgImNyd24iKS4KICAgICAgICAgbW9kZXMgPSBhbGwgLSBzZXQoJ2ZzdScpCi0gICAgICAgIGZvciBtb2RlIGluIG1vZGVzOgorICAgICAgICBmb3IgbW9kZSBpbiBzb3J0ZWQobW9kZXMpOgogICAgICAgICAgICAgc2VsZi5nID0gZ2RibS5vcGVuKGZpbGVuYW1lLCBtb2RlKQogICAgICAgICAgICAgc2VsZi5nLmNsb3NlKCkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nZW5lcmF0b3JzLnB5IGIvTGliL3Rlc3QvdGVzdF9nZW5lcmF0b3JzLnB5CmluZGV4IDE5YmZlMDcuLjI3Mzk5ZjcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2VuZXJhdG9ycy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dlbmVyYXRvcnMucHkKQEAgLTM4Myw3ICszODMsOCBAQAogPHR5cGUgJ2dlbmVyYXRvcic+CiA+Pj4gW3MgZm9yIHMgaW4gZGlyKGkpIGlmIG5vdCBzLnN0YXJ0c3dpdGgoJ18nKV0KIFsnY2xvc2UnLCAnZ2lfY29kZScsICdnaV9mcmFtZScsICdnaV9ydW5uaW5nJywgJ25leHQnLCAnc2VuZCcsICd0aHJvdyddCi0+Pj4gcHJpbnQgaS5uZXh0Ll9fZG9jX18KKz4+PiBmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBIQVZFX0RPQ1NUUklOR1MKKz4+PiBwcmludChpLm5leHQuX19kb2NfXyBpZiBIQVZFX0RPQ1NUUklOR1MgZWxzZSAneC5uZXh0KCkgLT4gdGhlIG5leHQgdmFsdWUsIG9yIHJhaXNlIFN0b3BJdGVyYXRpb24nKQogeC5uZXh0KCkgLT4gdGhlIG5leHQgdmFsdWUsIG9yIHJhaXNlIFN0b3BJdGVyYXRpb24KID4+PiBpdGVyKGkpIGlzIGkKIFRydWUKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2VuZXJpY3BhdGgucHkgYi9MaWIvdGVzdC90ZXN0X2dlbmVyaWNwYXRoLnB5CmluZGV4IDM5NzViNTYuLjk0MzgwYjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2VuZXJpY3BhdGgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nZW5lcmljcGF0aC5weQpAQCAtMTk5LDEzICsxOTksNDAgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwYW5kdmFycygiJFtmb29dYmFyIiksICIkW2Zvb11iYXIiKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBhbmR2YXJzKCIkYmFyIGJhciIpLCAiJGJhciBiYXIiKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBhbmR2YXJzKCIkP2JhciIpLCAiJD9iYXIiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBhbmR2YXJzKCIke2Zvb31iYXIiKSwgImJhcmJhciIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGFuZHZhcnMoIiRmb299YmFyIiksICJiYXJ9YmFyIikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwYW5kdmFycygiJHtmb28iKSwgIiR7Zm9vIikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwYW5kdmFycygiJHt7Zm9vfX0iKSwgImJhejF9IikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwYW5kdmFycygiJGZvbyRmb28iKSwgImJhcmJhciIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGFuZHZhcnMoIiRiYXIkYmFyIiksICIkYmFyJGJhciIpCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh0ZXN0X3N1cHBvcnQuRlNfTk9OQVNDSUksICduZWVkIHRlc3Rfc3VwcG9ydC5GU19OT05BU0NJSScpCisgICAgZGVmIHRlc3RfZXhwYW5kdmFyc19ub25hc2NpaShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5wYXRobW9kdWxlLl9fbmFtZV9fID09ICdtYWNwYXRoJzoKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ21hY3BhdGguZXhwYW5kdmFycyBpcyBhIHN0dWInKQorICAgICAgICBleHBhbmR2YXJzID0gc2VsZi5wYXRobW9kdWxlLmV4cGFuZHZhcnMKKyAgICAgICAgZGVmIGNoZWNrKHZhbHVlLCBleHBlY3RlZCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGFuZHZhcnModmFsdWUpLCBleHBlY3RlZCkKKyAgICAgICAgZW5jb2RpbmcgPSBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuRW52aXJvbm1lbnRWYXJHdWFyZCgpIGFzIGVudjoKKyAgICAgICAgICAgIGVudi5jbGVhcigpCisgICAgICAgICAgICB1bm9uYXNjaWkgPSB0ZXN0X3N1cHBvcnQuRlNfTk9OQVNDSUkKKyAgICAgICAgICAgIHNub25hc2NpaSA9IHVub25hc2NpaS5lbmNvZGUoZW5jb2RpbmcpCisgICAgICAgICAgICBlbnZbJ3NwYW0nXSA9IHNub25hc2NpaQorICAgICAgICAgICAgZW52W3Nub25hc2NpaV0gPSAnaGFtJyArIHNub25hc2NpaQorICAgICAgICAgICAgY2hlY2soc25vbmFzY2lpLCBzbm9uYXNjaWkpCisgICAgICAgICAgICBjaGVjaygnJHNwYW0gYmFyJywgJyVzIGJhcicgJSBzbm9uYXNjaWkpCisgICAgICAgICAgICBjaGVjaygnJHtzcGFtfWJhcicsICclc2JhcicgJSBzbm9uYXNjaWkpCisgICAgICAgICAgICBjaGVjaygnJHslc31iYXInICUgc25vbmFzY2lpLCAnaGFtJXNiYXInICUgc25vbmFzY2lpKQorICAgICAgICAgICAgY2hlY2soJyRiYXIlcyBiYXInICUgc25vbmFzY2lpLCAnJGJhciVzIGJhcicgJSBzbm9uYXNjaWkpCisgICAgICAgICAgICBjaGVjaygnJHNwYW19YmFyJywgJyVzfWJhcicgJSBzbm9uYXNjaWkpCisKKyAgICAgICAgICAgIGNoZWNrKHVub25hc2NpaSwgdW5vbmFzY2lpKQorICAgICAgICAgICAgY2hlY2sodSckc3BhbSBiYXInLCB1JyVzIGJhcicgJSB1bm9uYXNjaWkpCisgICAgICAgICAgICBjaGVjayh1JyR7c3BhbX1iYXInLCB1JyVzYmFyJyAlIHVub25hc2NpaSkKKyAgICAgICAgICAgIGNoZWNrKHUnJHslc31iYXInICUgdW5vbmFzY2lpLCB1J2hhbSVzYmFyJyAlIHVub25hc2NpaSkKKyAgICAgICAgICAgIGNoZWNrKHUnJGJhciVzIGJhcicgJSB1bm9uYXNjaWksIHUnJGJhciVzIGJhcicgJSB1bm9uYXNjaWkpCisgICAgICAgICAgICBjaGVjayh1JyRzcGFtfWJhcicsIHUnJXN9YmFyJyAlIHVub25hc2NpaSkKKwogICAgIGRlZiB0ZXN0X2Fic3BhdGgoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oImZvbyIsIHNlbGYucGF0aG1vZHVsZS5hYnNwYXRoKCJmb28iKSkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nZW5leHBzLnB5IGIvTGliL3Rlc3QvdGVzdF9nZW5leHBzLnB5CmluZGV4IDNkODk2YTUuLmZjNTkzYTMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2VuZXhwcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dlbmV4cHMucHkKQEAgLTIyMyw3ICsyMjMsOCBAQAogICAgID4+PiBzZXQoYXR0ciBmb3IgYXR0ciBpbiBkaXIoZykgaWYgbm90IGF0dHIuc3RhcnRzd2l0aCgnX18nKSkgPj0gZXhwZWN0ZWQKICAgICBUcnVlCiAKLSAgICA+Pj4gcHJpbnQgZy5uZXh0Ll9fZG9jX18KKyAgICA+Pj4gZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgSEFWRV9ET0NTVFJJTkdTCisgICAgPj4+IHByaW50KGcubmV4dC5fX2RvY19fIGlmIEhBVkVfRE9DU1RSSU5HUyBlbHNlICd4Lm5leHQoKSAtPiB0aGUgbmV4dCB2YWx1ZSwgb3IgcmFpc2UgU3RvcEl0ZXJhdGlvbicpCiAgICAgeC5uZXh0KCkgLT4gdGhlIG5leHQgdmFsdWUsIG9yIHJhaXNlIFN0b3BJdGVyYXRpb24KICAgICA+Pj4gaW1wb3J0IHR5cGVzCiAgICAgPj4+IGlzaW5zdGFuY2UoZywgdHlwZXMuR2VuZXJhdG9yVHlwZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2V0YXJnczIucHkgYi9MaWIvdGVzdC90ZXN0X2dldGFyZ3MyLnB5CmluZGV4IGQwNjI5NmIuLmFiYTMwNGEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2V0YXJnczIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nZXRhcmdzMi5weQpAQCAtMSw1ICsxLDcgQEAKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKyMgU2tpcCB0aGlzIHRlc3QgaWYgdGhlIF90ZXN0Y2FwaSBtb2R1bGUgaXNuJ3QgYXZhaWxhYmxlLgordGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ190ZXN0Y2FwaScpCiBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgZ2V0YXJnc19rZXl3b3JkcwogaW1wb3J0IHdhcm5pbmdzCiAKQEAgLTQyLDYgKzQ0LDEzIEBACiAgICAgIElOVF9NSU4sIExPTkdfTUlOLCBMT05HX01BWCwgUFlfU1NJWkVfVF9NSU4sIFBZX1NTSVpFX1RfTUFYLCBcCiAgICAgIFNIUlRfTUlOLCBTSFJUX01BWAogCit0cnk6CisgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IGdldGFyZ3NfTCwgZ2V0YXJnc19LCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgX1BZX0xPTkdfTE9OR19hdmFpbGFibGUgPSBGYWxzZQorZWxzZToKKyAgICBfUFlfTE9OR19MT05HX2F2YWlsYWJsZSA9IFRydWUKKwogIyBmYWtlLCB0aGV5IGFyZSBub3QgZGVmaW5lZCBpbiBQeXRob24ncyBoZWFkZXIgZmlsZXMKIExMT05HX01BWCA9IDIqKjYzLTEKIExMT05HX01JTiA9IC0yKio2MwpAQCAtMjA4LDYgKzIxNyw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGdldGFyZ3NfbiwgVkVSWV9MQVJHRSkKIAogCitAdW5pdHRlc3Quc2tpcFVubGVzcyhfUFlfTE9OR19MT05HX2F2YWlsYWJsZSwgJ1BZX0xPTkdfTE9ORyBub3QgYXZhaWxhYmxlJykKIGNsYXNzIExvbmdMb25nX1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9MKHNlbGYpOgogICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgZ2V0YXJnc19MCkBAIC0zMjIsMTMgKzMzMiw4IEBACiAgICAgICAgICAgICBzZWxmLmZhaWwoJ1R5cGVFcnJvciBzaG91bGQgaGF2ZSBiZWVuIHJhaXNlZCcpCiAKIGRlZiB0ZXN0X21haW4oKToKLSAgICB0ZXN0cyA9IFtTaWduZWRfVGVzdENhc2UsIFVuc2lnbmVkX1Rlc3RDYXNlLCBUdXBsZV9UZXN0Q2FzZSwgS2V5d29yZHNfVGVzdENhc2VdCi0gICAgdHJ5OgotICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgZ2V0YXJnc19MLCBnZXRhcmdzX0sKLSAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgIHBhc3MgIyBQWV9MT05HX0xPTkcgbm90IGF2YWlsYWJsZQotICAgIGVsc2U6Ci0gICAgICAgIHRlc3RzLmFwcGVuZChMb25nTG9uZ19UZXN0Q2FzZSkKKyAgICB0ZXN0cyA9IFtTaWduZWRfVGVzdENhc2UsIFVuc2lnbmVkX1Rlc3RDYXNlLCBMb25nTG9uZ19UZXN0Q2FzZSwKKyAgICAgICAgICAgICBUdXBsZV9UZXN0Q2FzZSwgS2V5d29yZHNfVGVzdENhc2VdCiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdHMpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2dsLnB5IGIvTGliL3Rlc3QvdGVzdF9nbC5weQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGM5MjY0ZWUuLjkyZTFlOGQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dsLnB5CkBAIC0xLDQgKzEsMyBAQAotIyEgL3Vzci9iaW4vZW52IHB5dGhvbgogIiIiVmVyeSBzaW1wbGUgdGVzdCBzY3JpcHQgZm9yIHRoZSBTR0kgZ2wgbGlicmFyeSBleHRlbnNpb24gbW9kdWxlCiAgICAgdGFrZW4gbW9zdGx5IGZyb20gdGhlIGRvY3VtZW50YXRpb24uCiAgICAgUm9nZXIgRS4gTWFzc2UKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2xvYi5weSBiL0xpYi90ZXN0L3Rlc3RfZ2xvYi5weQppbmRleCA2OTIzMjJkLi5iMzYwZDA5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dsb2IucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nbG9iLnB5CkBAIC0xLDggKzEsMTUgQEAKLWltcG9ydCB1bml0dGVzdAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBURVNURk4KIGltcG9ydCBnbG9iCiBpbXBvcnQgb3MKIGltcG9ydCBzaHV0aWwKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIFRFU1RGTgorCisKK2RlZiBmc2RlY29kZShzKToKKyAgICByZXR1cm4gdW5pY29kZShzLCBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkpCisKIAogY2xhc3MgR2xvYlRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtMTgsMTYgKzI1LDE5IEBACiAgICAgICAgIGYuY2xvc2UoKQogCiAgICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBzZWxmLnRlbXBkaXIgPSBURVNURk4rIl9kaXIiCisgICAgICAgIHNlbGYudGVtcGRpciA9IFRFU1RGTiArICJfZGlyIgogICAgICAgICBzZWxmLm1rdGVtcCgnYScsICdEJykKICAgICAgICAgc2VsZi5ta3RlbXAoJ2FhYicsICdGJykKKyAgICAgICAgc2VsZi5ta3RlbXAoJy5hYScsICdHJykKKyAgICAgICAgc2VsZi5ta3RlbXAoJy5iYicsICdIJykKICAgICAgICAgc2VsZi5ta3RlbXAoJ2FhYScsICd6enpGJykKICAgICAgICAgc2VsZi5ta3RlbXAoJ1paWicpCiAgICAgICAgIHNlbGYubWt0ZW1wKCdhJywgJ2JjZCcsICdFRicpCiAgICAgICAgIHNlbGYubWt0ZW1wKCdhJywgJ2JjZCcsICdlZmcnLCAnaGEnKQogICAgICAgICBpZiBoYXNhdHRyKG9zLCAnc3ltbGluaycpOgogICAgICAgICAgICAgb3Muc3ltbGluayhzZWxmLm5vcm0oJ2Jyb2tlbicpLCBzZWxmLm5vcm0oJ3N5bTEnKSkKLSAgICAgICAgICAgIG9zLnN5bWxpbmsoc2VsZi5ub3JtKCdicm9rZW4nKSwgc2VsZi5ub3JtKCdzeW0yJykpCisgICAgICAgICAgICBvcy5zeW1saW5rKCdicm9rZW4nLCBzZWxmLm5vcm0oJ3N5bTInKSkKKyAgICAgICAgICAgIG9zLnN5bWxpbmsob3MucGF0aC5qb2luKCdhJywgJ2JjZCcpLCBzZWxmLm5vcm0oJ3N5bTMnKSkKIAogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLnRlbXBkaXIpCkBAIC00MCwxMCArNTAsMTYgQEAKICAgICAgICAgcCA9IG9zLnBhdGguam9pbihzZWxmLnRlbXBkaXIsIHBhdHRlcm4pCiAgICAgICAgIHJlcyA9IGdsb2IuZ2xvYihwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZ2xvYi5pZ2xvYihwKSksIHJlcykKKyAgICAgICAgdXJlcyA9IFtmc2RlY29kZSh4KSBmb3IgeCBpbiByZXNdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2xvYi5nbG9iKGZzZGVjb2RlKHApKSwgdXJlcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGdsb2IuaWdsb2IoZnNkZWNvZGUocCkpKSwgdXJlcykKICAgICAgICAgcmV0dXJuIHJlcwogCiAgICAgZGVmIGFzc2VydFNlcXVlbmNlc0VxdWFsX25vb3JkZXIoc2VsZiwgbDEsIGwyKToKKyAgICAgICAgbDEgPSBsaXN0KGwxKQorICAgICAgICBsMiA9IGxpc3QobDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KGwxKSwgc2V0KGwyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQobDEpLCBzb3J0ZWQobDIpKQogCiAgICAgZGVmIHRlc3RfZ2xvYl9saXRlcmFsKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0U2VxdWVuY2VzRXF1YWxfbm9vcmRlcgpAQCAtNTIsMjAgKzY4LDI2IEBACiAgICAgICAgIGVxKHNlbGYuZ2xvYignYWFiJyksIFtzZWxmLm5vcm0oJ2FhYicpXSkKICAgICAgICAgZXEoc2VsZi5nbG9iKCd6eW11cmd5JyksIFtdKQogCisgICAgICAgIHJlcyA9IGdsb2IuZ2xvYignKicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoe3R5cGUocikgZm9yIHIgaW4gcmVzfSwge3N0cn0pCisgICAgICAgIHJlcyA9IGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4ob3MuY3VyZGlyLCAnKicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHt0eXBlKHIpIGZvciByIGluIHJlc30sIHtzdHJ9KQorCiAgICAgICAgICMgdGVzdCByZXR1cm4gdHlwZXMgYXJlIHVuaWNvZGUsIGJ1dCBvbmx5IGlmIG9zLmxpc3RkaXIKICAgICAgICAgIyByZXR1cm5zIHVuaWNvZGUgZmlsZW5hbWVzCi0gICAgICAgIHVuaXNldCA9IHNldChbdW5pY29kZV0pCi0gICAgICAgIHRtcCA9IG9zLmxpc3RkaXIodScuJykKLSAgICAgICAgaWYgc2V0KHR5cGUoeCkgZm9yIHggaW4gdG1wKSA9PSB1bmlzZXQ6Ci0gICAgICAgICAgICB1MSA9IGdsb2IuZ2xvYih1JyonKQotICAgICAgICAgICAgdTIgPSBnbG9iLmdsb2IodScuLyonKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQodHlwZShyKSBmb3IgciBpbiB1MSksIHVuaXNldCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KHR5cGUocikgZm9yIHIgaW4gdTIpLCB1bmlzZXQpCisgICAgICAgIHRtcCA9IG9zLmxpc3RkaXIoZnNkZWNvZGUob3MuY3VyZGlyKSkKKyAgICAgICAgaWYge3R5cGUoeCkgZm9yIHggaW4gdG1wfSA9PSB7dW5pY29kZX06CisgICAgICAgICAgICByZXMgPSBnbG9iLmdsb2IodScqJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoe3R5cGUocikgZm9yIHIgaW4gcmVzfSwge3VuaWNvZGV9KQorICAgICAgICAgICAgcmVzID0gZ2xvYi5nbG9iKG9zLnBhdGguam9pbihmc2RlY29kZShvcy5jdXJkaXIpLCB1JyonKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoe3R5cGUocikgZm9yIHIgaW4gcmVzfSwge3VuaWNvZGV9KQogCiAgICAgZGVmIHRlc3RfZ2xvYl9vbmVfZGlyZWN0b3J5KHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0U2VxdWVuY2VzRXF1YWxfbm9vcmRlcgogICAgICAgICBlcShzZWxmLmdsb2IoJ2EqJyksIG1hcChzZWxmLm5vcm0sIFsnYScsICdhYWInLCAnYWFhJ10pKQogICAgICAgICBlcShzZWxmLmdsb2IoJyphJyksIG1hcChzZWxmLm5vcm0sIFsnYScsICdhYWEnXSkpCisgICAgICAgIGVxKHNlbGYuZ2xvYignLionKSwgbWFwKHNlbGYubm9ybSwgWycuYWEnLCAnLmJiJ10pKQorICAgICAgICBlcShzZWxmLmdsb2IoJz9hYScpLCBtYXAoc2VsZi5ub3JtLCBbJ2FhYSddKSkKICAgICAgICAgZXEoc2VsZi5nbG9iKCdhYT8nKSwgbWFwKHNlbGYubm9ybSwgWydhYWEnLCAnYWFiJ10pKQogICAgICAgICBlcShzZWxmLmdsb2IoJ2FhW2FiXScpLCBtYXAoc2VsZi5ub3JtLCBbJ2FhYScsICdhYWInXSkpCiAgICAgICAgIGVxKHNlbGYuZ2xvYignKnEnKSwgW10pCkBAIC04NywyMyArMTA5LDY4IEBACiAgICAgICAgIGVxKHNlbGYuZ2xvYignKicsICcqYScpLCBbXSkKICAgICAgICAgZXEoc2VsZi5nbG9iKCdhJywgJyonLCAnKicsICcqYScpLAogICAgICAgICAgICBbc2VsZi5ub3JtKCdhJywgJ2JjZCcsICdlZmcnLCAnaGEnKV0pCi0gICAgICAgIGVxKHNlbGYuZ2xvYignP2E/JywgJypGJyksIG1hcChzZWxmLm5vcm0sIFtvcy5wYXRoLmpvaW4oJ2FhYScsICd6enpGJyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oJ2FhYicsICdGJyldKSkKKyAgICAgICAgZXEoc2VsZi5nbG9iKCc/YT8nLCAnKkYnKSwgW3NlbGYubm9ybSgnYWFhJywgJ3p6ekYnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubm9ybSgnYWFiJywgJ0YnKV0pCiAKICAgICBkZWYgdGVzdF9nbG9iX2RpcmVjdG9yeV93aXRoX3RyYWlsaW5nX3NsYXNoKHNlbGYpOgotICAgICAgICAjIFdlIGFyZSB2ZXJpZnlpbmcgdGhhdCB3aGVuIHRoZXJlIGlzIHdpbGRjYXJkIHBhdHRlcm4gd2hpY2gKLSAgICAgICAgIyBlbmRzIHdpdGggb3Muc2VwIGRvZXNuJ3QgYmxvdyB1cC4KLSAgICAgICAgcmVzID0gZ2xvYi5nbG9iKHNlbGYudGVtcGRpciArICcqJyArIG9zLnNlcCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzKSwgMSkKLSAgICAgICAgIyBlaXRoZXIgb2YgdGhlc2UgcmVzdWx0cyBhcmUgcmVhc29uYWJsZQotICAgICAgICBzZWxmLmFzc2VydEluKHJlc1swXSwgW3NlbGYudGVtcGRpciwgc2VsZi50ZW1wZGlyICsgb3Muc2VwXSkKKyAgICAgICAgIyBQYXR0ZXJucyBlbmRpbmcgd2l0aCBhIHNsYXNoIHNob3VsZG4ndCBtYXRjaCBub24tZGlycworICAgICAgICByZXMgPSBnbG9iLmdsb2Ioc2VsZi5ub3JtKCdaKlonKSArIG9zLnNlcCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIFtdKQorICAgICAgICByZXMgPSBnbG9iLmdsb2Ioc2VsZi5ub3JtKCdaWlonKSArIG9zLnNlcCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIFtdKQorICAgICAgICAjIFdoZW4gdGhlcmUgaXMgYSB3aWxkY2FyZCBwYXR0ZXJuIHdoaWNoIGVuZHMgd2l0aCBvcy5zZXAsIGdsb2IoKQorICAgICAgICAjIGRvZXNuJ3QgYmxvdyB1cC4KKyAgICAgICAgcmVzID0gZ2xvYi5nbG9iKHNlbGYubm9ybSgnYWEqJykgKyBvcy5zZXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDIpCisgICAgICAgICMgZWl0aGVyIG9mIHRoZXNlIHJlc3VsdHMgaXMgcmVhc29uYWJsZQorICAgICAgICBzZWxmLmFzc2VydEluKHNldChyZXMpLCBbCisgICAgICAgICAgICAgICAgICAgICAge3NlbGYubm9ybSgnYWFhJyksIHNlbGYubm9ybSgnYWFiJyl9LAorICAgICAgICAgICAgICAgICAgICAgIHtzZWxmLm5vcm0oJ2FhYScpICsgb3Muc2VwLCBzZWxmLm5vcm0oJ2FhYicpICsgb3Muc2VwfSwKKyAgICAgICAgICAgICAgICAgICAgICBdKQogCisgICAgZGVmIHRlc3RfZ2xvYl91bmljb2RlX2RpcmVjdG9yeV93aXRoX3RyYWlsaW5nX3NsYXNoKHNlbGYpOgorICAgICAgICAjIFNhbWUgYXMgdGVzdF9nbG9iX2RpcmVjdG9yeV93aXRoX3RyYWlsaW5nX3NsYXNoLCBidXQgd2l0aCBhbgorICAgICAgICAjIHVuaWNvZGUgYXJndW1lbnQuCisgICAgICAgIHJlcyA9IGdsb2IuZ2xvYihmc2RlY29kZShzZWxmLm5vcm0oJ1oqWicpICsgb3Muc2VwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIFtdKQorICAgICAgICByZXMgPSBnbG9iLmdsb2IoZnNkZWNvZGUoc2VsZi5ub3JtKCdaWlonKSArIG9zLnNlcCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBbXSkKKyAgICAgICAgcmVzID0gZ2xvYi5nbG9iKGZzZGVjb2RlKHNlbGYubm9ybSgnYWEqJykgKyBvcy5zZXApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXMpLCAyKQorICAgICAgICAjIGVpdGhlciBvZiB0aGVzZSByZXN1bHRzIGlzIHJlYXNvbmFibGUKKyAgICAgICAgc2VsZi5hc3NlcnRJbihzZXQocmVzKSwgWworICAgICAgICAgICAgICAgICAgICAgIHtmc2RlY29kZShzZWxmLm5vcm0oJ2FhYScpKSwgZnNkZWNvZGUoc2VsZi5ub3JtKCdhYWInKSl9LAorICAgICAgICAgICAgICAgICAgICAgIHtmc2RlY29kZShzZWxmLm5vcm0oJ2FhYScpICsgb3Muc2VwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZnNkZWNvZGUoc2VsZi5ub3JtKCdhYWInKSArIG9zLnNlcCl9LAorICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAnc3ltbGluaycpLCAiUmVxdWlyZXMgc3ltbGluayBzdXBwb3J0IikKKyAgICBkZWYgdGVzdF9nbG9iX3N5bWxpbmtzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0U2VxdWVuY2VzRXF1YWxfbm9vcmRlcgorICAgICAgICBlcShzZWxmLmdsb2IoJ3N5bTMnKSwgW3NlbGYubm9ybSgnc3ltMycpXSkKKyAgICAgICAgZXEoc2VsZi5nbG9iKCdzeW0zJywgJyonKSwgW3NlbGYubm9ybSgnc3ltMycsICdFRicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ub3JtKCdzeW0zJywgJ2VmZycpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihzZWxmLmdsb2IoJ3N5bTMnICsgb3Muc2VwKSwKKyAgICAgICAgICAgICAgICAgICAgICBbW3NlbGYubm9ybSgnc3ltMycpXSwgW3NlbGYubm9ybSgnc3ltMycpICsgb3Muc2VwXV0pCisgICAgICAgIGVxKHNlbGYuZ2xvYignKicsICcqRicpLAorICAgICAgICAgICBbc2VsZi5ub3JtKCdhYWEnLCAnenp6RicpLCBzZWxmLm5vcm0oJ2FhYicsICdGJyksCisgICAgICAgICAgICBzZWxmLm5vcm0oJ3N5bTMnLCAnRUYnKV0pCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAnc3ltbGluaycpLCAiUmVxdWlyZXMgc3ltbGluayBzdXBwb3J0IikKICAgICBkZWYgdGVzdF9nbG9iX2Jyb2tlbl9zeW1saW5rcyhzZWxmKToKLSAgICAgICAgaWYgaGFzYXR0cihvcywgJ3N5bWxpbmsnKToKLSAgICAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRTZXF1ZW5jZXNFcXVhbF9ub29yZGVyCi0gICAgICAgICAgICBlcShzZWxmLmdsb2IoJ3N5bSonKSwgW3NlbGYubm9ybSgnc3ltMScpLCBzZWxmLm5vcm0oJ3N5bTInKV0pCi0gICAgICAgICAgICBlcShzZWxmLmdsb2IoJ3N5bTEnKSwgW3NlbGYubm9ybSgnc3ltMScpXSkKLSAgICAgICAgICAgIGVxKHNlbGYuZ2xvYignc3ltMicpLCBbc2VsZi5ub3JtKCdzeW0yJyldKQorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0U2VxdWVuY2VzRXF1YWxfbm9vcmRlcgorICAgICAgICBlcShzZWxmLmdsb2IoJ3N5bSonKSwgW3NlbGYubm9ybSgnc3ltMScpLCBzZWxmLm5vcm0oJ3N5bTInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5vcm0oJ3N5bTMnKV0pCisgICAgICAgIGVxKHNlbGYuZ2xvYignc3ltMScpLCBbc2VsZi5ub3JtKCdzeW0xJyldKQorICAgICAgICBlcShzZWxmLmdsb2IoJ3N5bTInKSwgW3NlbGYubm9ybSgnc3ltMicpXSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiLCAiV2luMzIgc3BlY2lmaWMgdGVzdCIpCisgICAgZGVmIHRlc3RfZ2xvYl9tYWdpY19pbl9kcml2ZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydFNlcXVlbmNlc0VxdWFsX25vb3JkZXIKKyAgICAgICAgZXEoZ2xvYi5nbG9iKCcqOicpLCBbXSkKKyAgICAgICAgZXEoZ2xvYi5nbG9iKHUnKjonKSwgW10pCisgICAgICAgIGVxKGdsb2IuZ2xvYignPzonKSwgW10pCisgICAgICAgIGVxKGdsb2IuZ2xvYih1Jz86JyksIFtdKQogCiAKIGRlZiB0ZXN0X21haW4oKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ3JhbW1hci5weSBiL0xpYi90ZXN0L3Rlc3RfZ3JhbW1hci5weQppbmRleCA4NmNjMDg0Li41Zjc3YzFkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dyYW1tYXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5CkBAIC03NSw2ICs3NSwxMiBAQAogICAgICAgICB4ID0gLjNlMTQKICAgICAgICAgeCA9IDMuMWU0CiAKKyAgICBkZWYgdGVzdF9mbG9hdF9leHBvbmVudF90b2tlbml6YXRpb24oc2VsZik6CisgICAgICAgICMgU2VlIGlzc3VlIDIxNjQyLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEgaWYgMWVsc2UgMCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxIGlmIDBlbHNlIDAsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCAiMCBpZiAxRWxzZSAwIikKKwogICAgIGRlZiB0ZXN0U3RyaW5nTGl0ZXJhbHMoc2VsZik6CiAgICAgICAgIHggPSAnJzsgeSA9ICIiOyBzZWxmLmFzc2VydFRydWUobGVuKHgpID09IDAgYW5kIHggPT0geSkKICAgICAgICAgeCA9ICdcJyc7IHkgPSAiJyI7IHNlbGYuYXNzZXJ0VHJ1ZShsZW4oeCkgPT0gMSBhbmQgeCA9PSB5IGFuZCBvcmQoeCkgPT0gMzkpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2dycC5weSBiL0xpYi90ZXN0L3Rlc3RfZ3JwLnB5CmluZGV4IGU5ZTE3NTguLmQzMWUzOWMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ3JwLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ3JwLnB5CkBAIC0xNiw3ICsxNiw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVbMV0sIHZhbHVlLmdyX3Bhc3N3ZCkKICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHZhbHVlLmdyX3Bhc3N3ZCwgYmFzZXN0cmluZykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZVsyXSwgdmFsdWUuZ3JfZ2lkKQotICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UodmFsdWUuZ3JfZ2lkLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh2YWx1ZS5ncl9naWQsIChsb25nLCBpbnQpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlWzNdLCB2YWx1ZS5ncl9tZW0pCiAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh2YWx1ZS5ncl9tZW0sIGxpc3QpCiAKQEAgLTI2LDggKzI2LDEwIEBACiAgICAgICAgIGZvciBlIGluIGVudHJpZXM6CiAgICAgICAgICAgICBzZWxmLmNoZWNrX3ZhbHVlKGUpCiAKKyAgICBkZWYgdGVzdF92YWx1ZXNfZXh0ZW5kZWQoc2VsZik6CisgICAgICAgIGVudHJpZXMgPSBncnAuZ2V0Z3JhbGwoKQogICAgICAgICBpZiBsZW4oZW50cmllcykgPiAxMDAwOiAgIyBIdWdlIGdyb3VwIGZpbGUgKE5JUz8pIC0tIHNraXAgdGhlIHJlc3QKLSAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgnaHVnZSBncm91cCBmaWxlLCBleHRlbmRlZCB0ZXN0IHNraXBwZWQnKQogCiAgICAgICAgIGZvciBlIGluIGVudHJpZXM6CiAgICAgICAgICAgICBlMiA9IGdycC5nZXRncmdpZChlLmdyX2dpZCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ3ppcC5weSBiL0xpYi90ZXN0L3Rlc3RfZ3ppcC5weQppbmRleCA1NzM4NzllLi5hYTU2ZWQzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2d6aXAucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nemlwLnB5CkBAIC0xLDQgKzEsMyBAQAotIyEgL3Vzci9iaW4vZW52IHB5dGhvbgogIiIiVGVzdCBzY3JpcHQgZm9yIHRoZSBnemlwIG1vZHVsZS4KICIiIgogCkBAIC01Myw2ICs1MiwxMyBAQAogICAgICAgICAgICAgZCA9IGYucmVhZCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZGF0YTEqNTApCiAKKyAgICBkZWYgdGVzdF9yZWFkX3VuaXZlcnNhbF9uZXdsaW5lcyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjNTE0ODogUmVhZGluZyBicmVha3Mgd2hlbiBtb2RlIGNvbnRhaW5zICdVJy4KKyAgICAgICAgc2VsZi50ZXN0X3dyaXRlKCkKKyAgICAgICAgd2l0aCBnemlwLkd6aXBGaWxlKHNlbGYuZmlsZW5hbWUsICdyVScpIGFzIGY6CisgICAgICAgICAgICBkID0gZi5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBkYXRhMSo1MCkKKwogICAgIGRlZiB0ZXN0X2lvX29uX2Nsb3NlZF9vYmplY3Qoc2VsZik6CiAgICAgICAgICMgVGVzdCB0aGF0IEkvTyBvcGVyYXRpb25zIG9uIGNsb3NlZCBHemlwRmlsZSBvYmplY3RzIHJhaXNlIGEKICAgICAgICAgIyBWYWx1ZUVycm9yLCBqdXN0IGxpa2UgdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb25zIG9uIGZpbGUgb2JqZWN0cy4KQEAgLTI3NCw2ICsyODAsMjIgQEAKICAgICAgICAgICAgIGQgPSBmLnJlYWQoKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBkYXRhMSAqIDUwLCAiSW5jb3JyZWN0IGRhdGEgaW4gZmlsZSIpCiAKKyAgICBkZWYgdGVzdF9maWxlb2JqX2Zyb21fZmRvcGVuKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxMzc4MTogQ3JlYXRpbmcgYSBHemlwRmlsZSB1c2luZyBhIGZpbGVvYmogZnJvbSBvcy5mZG9wZW4oKQorICAgICAgICAjIHNob3VsZCBub3QgZW1iZWQgdGhlIGZha2UgZmlsZW5hbWUgIjxmZG9wZW4+IiBpbiB0aGUgb3V0cHV0IGZpbGUuCisgICAgICAgIGZkID0gb3Mub3BlbihzZWxmLmZpbGVuYW1lLCBvcy5PX1dST05MWSB8IG9zLk9fQ1JFQVQpCisgICAgICAgIHdpdGggb3MuZmRvcGVuKGZkLCAid2IiKSBhcyBmOgorICAgICAgICAgICAgd2l0aCBnemlwLkd6aXBGaWxlKGZpbGVvYmo9ZiwgbW9kZT0idyIpIGFzIGc6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnLm5hbWUsICIiKQorCisgICAgZGVmIHRlc3RfcmVhZF93aXRoX2V4dHJhKHNlbGYpOgorICAgICAgICAjIEd6aXAgZGF0YSB3aXRoIGFuIGV4dHJhIGZpZWxkCisgICAgICAgIGd6ZGF0YSA9IChiJ1x4MWZceDhiXHgwOFx4MDRceGIyXHgxN2NRXHgwMlx4ZmYnCisgICAgICAgICAgICAgICAgICBiJ1x4MDVceDAwRXh0cmEnCisgICAgICAgICAgICAgICAgICBiJ1x4MGJJLS5ceDAxXHgwMDJceGQxTXhceDA0XHgwMFx4MDBceDAwJykKKyAgICAgICAgd2l0aCBnemlwLkd6aXBGaWxlKGZpbGVvYmo9aW8uQnl0ZXNJTyhnemRhdGEpKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgYidUZXN0JykKKwogZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdEd6aXApCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaGFzaC5weSBiL0xpYi90ZXN0L3Rlc3RfaGFzaC5weQppbmRleCBkMjU3MWQwLi5kZWM3ZGNiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2hhc2gucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9oYXNoLnB5CkBAIC0zLDEwICszLDE4IEBACiAjCiAjIEFsc28gdGVzdCB0aGF0IGhhc2ggaW1wbGVtZW50YXRpb25zIGFyZSBpbmhlcml0ZWQgYXMgZXhwZWN0ZWQKIAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgc3RydWN0CitpbXBvcnQgZGF0ZXRpbWUKIGltcG9ydCB1bml0dGVzdAoraW1wb3J0IHN1YnByb2Nlc3MKKwogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IEhhc2hhYmxlCiAKK0lTXzY0QklUID0gKHN0cnVjdC5jYWxjc2l6ZSgnbCcpID09IDgpCisKIAogY2xhc3MgSGFzaEVxdWFsaXR5VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogCkBAIC0xMzQsMTAgKzE0MiwxMDYgQEAKICAgICAgICAgZm9yIG9iaiBpbiBzZWxmLmhhc2hlc190b19jaGVjazoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChvYmopLCBfZGVmYXVsdF9oYXNoKG9iaikpCiAKK2NsYXNzIEhhc2hSYW5kb21pemF0aW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIyBFYWNoIHN1YmNsYXNzIHNob3VsZCBkZWZpbmUgYSBmaWVsZCAicmVwcl8iLCBjb250YWluaW5nIHRoZSByZXByKCkgb2YKKyAgICAjIGFuIG9iamVjdCB0byBiZSB0ZXN0ZWQKKworICAgIGRlZiBnZXRfaGFzaF9jb21tYW5kKHNlbGYsIHJlcHJfKToKKyAgICAgICAgcmV0dXJuICdwcmludChoYXNoKCVzKSknICUgcmVwcl8KKworICAgIGRlZiBnZXRfaGFzaChzZWxmLCByZXByXywgc2VlZD1Ob25lKToKKyAgICAgICAgZW52ID0gb3MuZW52aXJvbi5jb3B5KCkKKyAgICAgICAgaWYgc2VlZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGVudlsnUFlUSE9OSEFTSFNFRUQnXSA9IHN0cihzZWVkKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZW52LnBvcCgnUFlUSE9OSEFTSFNFRUQnLCBOb25lKQorICAgICAgICBjbWRfbGluZSA9IFtzeXMuZXhlY3V0YWJsZSwgJy1jJywgc2VsZi5nZXRfaGFzaF9jb21tYW5kKHJlcHJfKV0KKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY21kX2xpbmUsIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY9ZW52KQorICAgICAgICBvdXQsIGVyciA9IHAuY29tbXVuaWNhdGUoKQorICAgICAgICBvdXQgPSB0ZXN0X3N1cHBvcnQuc3RyaXBfcHl0aG9uX3N0ZGVycihvdXQpCisgICAgICAgIHJldHVybiBpbnQob3V0LnN0cmlwKCkpCisKKyAgICBkZWYgdGVzdF9yYW5kb21pemVkX2hhc2goc2VsZik6CisgICAgICAgICMgdHdvIHJ1bnMgc2hvdWxkIHJldHVybiBkaWZmZXJlbnQgaGFzaGVzCisgICAgICAgIHJ1bjEgPSBzZWxmLmdldF9oYXNoKHNlbGYucmVwcl8sIHNlZWQ9J3JhbmRvbScpCisgICAgICAgIHJ1bjIgPSBzZWxmLmdldF9oYXNoKHNlbGYucmVwcl8sIHNlZWQ9J3JhbmRvbScpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocnVuMSwgcnVuMikKKworY2xhc3MgU3RyaW5nbGlrZUhhc2hSYW5kb21pemF0aW9uVGVzdHMoSGFzaFJhbmRvbWl6YXRpb25UZXN0cyk6CisgICAgZGVmIHRlc3RfbnVsbF9oYXNoKHNlbGYpOgorICAgICAgICAjIFBZVEhPTkhBU0hTRUVEPTAgZGlzYWJsZXMgdGhlIHJhbmRvbWl6ZWQgaGFzaAorICAgICAgICBpZiBJU182NEJJVDoKKyAgICAgICAgICAgIGtub3duX2hhc2hfb2Zfb2JqID0gMTQ1MzA3OTcyOTE4ODA5ODIxMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAga25vd25faGFzaF9vZl9vYmogPSAtMTYwMDkyNTUzMworCisgICAgICAgICMgUmFuZG9taXphdGlvbiBpcyBkaXNhYmxlZCBieSBkZWZhdWx0OgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0X2hhc2goc2VsZi5yZXByXyksIGtub3duX2hhc2hfb2Zfb2JqKQorCisgICAgICAgICMgSXQgY2FuIGFsc28gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGUgc2VlZCB0byAwOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0X2hhc2goc2VsZi5yZXByXywgc2VlZD0wKSwga25vd25faGFzaF9vZl9vYmopCisKKyAgICBkZWYgdGVzdF9maXhlZF9oYXNoKHNlbGYpOgorICAgICAgICAjIHRlc3QgYSBmaXhlZCBzZWVkIGZvciB0aGUgcmFuZG9taXplZCBoYXNoCisgICAgICAgICMgTm90ZSB0aGF0IGFsbCB0eXBlcyBzaGFyZSB0aGUgc2FtZSB2YWx1ZXM6CisgICAgICAgIGlmIElTXzY0QklUOgorICAgICAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAnbGl0dGxlJzoKKyAgICAgICAgICAgICAgICBoID0gLTQ0MTA5MTE1MDIzMDM4Nzg1MDkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaCA9IC0zNTcwMTUwOTY5NDc5OTk0MTMwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICdsaXR0bGUnOgorICAgICAgICAgICAgICAgIGggPSAtMjA2MDc2Nzk5CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGggPSAtMTAyNDAxNDQ1NworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0X2hhc2goc2VsZi5yZXByXywgc2VlZD00MiksIGgpCisKK2NsYXNzIFN0ckhhc2hSYW5kb21pemF0aW9uVGVzdHMoU3RyaW5nbGlrZUhhc2hSYW5kb21pemF0aW9uVGVzdHMpOgorICAgIHJlcHJfID0gcmVwcignYWJjJykKKworICAgIGRlZiB0ZXN0X2VtcHR5X3N0cmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKCIiKSwgMCkKKworY2xhc3MgVW5pY29kZUhhc2hSYW5kb21pemF0aW9uVGVzdHMoU3RyaW5nbGlrZUhhc2hSYW5kb21pemF0aW9uVGVzdHMpOgorICAgIHJlcHJfID0gcmVwcih1J2FiYycpCisKKyAgICBkZWYgdGVzdF9lbXB0eV9zdHJpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaCh1IiIpLCAwKQorCitjbGFzcyBCdWZmZXJIYXNoUmFuZG9taXphdGlvblRlc3RzKFN0cmluZ2xpa2VIYXNoUmFuZG9taXphdGlvblRlc3RzKToKKyAgICByZXByXyA9ICdidWZmZXIoImFiYyIpJworCisgICAgZGVmIHRlc3RfZW1wdHlfc3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goYnVmZmVyKCIiKSksIDApCisKK2NsYXNzIERhdGV0aW1lVGVzdHMoSGFzaFJhbmRvbWl6YXRpb25UZXN0cyk6CisgICAgZGVmIGdldF9oYXNoX2NvbW1hbmQoc2VsZiwgcmVwcl8pOgorICAgICAgICByZXR1cm4gJ2ltcG9ydCBkYXRldGltZTsgcHJpbnQoaGFzaCglcykpJyAlIHJlcHJfCisKK2NsYXNzIERhdGV0aW1lRGF0ZVRlc3RzKERhdGV0aW1lVGVzdHMpOgorICAgIHJlcHJfID0gcmVwcihkYXRldGltZS5kYXRlKDEwNjYsIDEwLCAxNCkpCisKK2NsYXNzIERhdGV0aW1lRGF0ZXRpbWVUZXN0cyhEYXRldGltZVRlc3RzKToKKyAgICByZXByXyA9IHJlcHIoZGF0ZXRpbWUuZGF0ZXRpbWUoMSwgMiwgMywgNCwgNSwgNiwgNykpCisKK2NsYXNzIERhdGV0aW1lVGltZVRlc3RzKERhdGV0aW1lVGVzdHMpOgorICAgIHJlcHJfID0gcmVwcihkYXRldGltZS50aW1lKDApKQorCisKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEhhc2hFcXVhbGl0eVRlc3RDYXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzaEluaGVyaXRhbmNlVGVzdENhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNoQnVpbHRpbnNUZXN0Q2FzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc2hCdWlsdGluc1Rlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RySGFzaFJhbmRvbWl6YXRpb25UZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaWNvZGVIYXNoUmFuZG9taXphdGlvblRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySGFzaFJhbmRvbWl6YXRpb25UZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGV0aW1lRGF0ZVRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZXRpbWVEYXRldGltZVRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZXRpbWVUaW1lVGVzdHMpCisKIAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9oYXNobGliLnB5IGIvTGliL3Rlc3QvdGVzdF9oYXNobGliLnB5CmluZGV4IDg1NWVjYmYuLjNmYzE3MmYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaGFzaGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2hhc2hsaWIucHkKQEAgLTE2LDYgKzE2LDggQEAKICAgICB0aHJlYWRpbmcgPSBOb25lCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB3YXJuaW5ncworZnJvbSBiaW5hc2NpaSBpbXBvcnQgdW5oZXhsaWZ5CisKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiBmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBfNEcsIHByZWNpc2lvbmJpZ21lbXRlc3QKIApAQCAtMTA4LDEyICsxMTAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2FsZ28uaXNsb3dlcigpXSkpCiAKICAgICBkZWYgdGVzdF91bmtub3duX2hhc2goc2VsZik6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGhhc2hsaWIubmV3KCdzcGFtIHNwYW0gc3BhbSBzcGFtIHNwYW0nKQotICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwID09ICJoYXNobGliIGRpZG4ndCByZWplY3QgYm9ndXMgaGFzaCBuYW1lIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaGFzaGxpYi5uZXcsICdzcGFtIHNwYW0gc3BhbSBzcGFtIHNwYW0nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGhhc2hsaWIubmV3LCAxKQogCiAgICAgZGVmIHRlc3RfZ2V0X2J1aWx0aW5fY29uc3RydWN0b3Ioc2VsZik6CiAgICAgICAgIGdldF9idWlsdGluX2NvbnN0cnVjdG9yID0gaGFzaGxpYi5fX2RpY3RfX1sKQEAgLTEzMiw2ICsxMzAsNyBAQAogICAgICAgICAgICAgICAgIHN5cy5tb2R1bGVzWydfbWQ1J10gPSBfbWQ1CiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1snX21kNSddCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0X2J1aWx0aW5fY29uc3RydWN0b3IsIDMpCiAKICAgICBkZWYgdGVzdF9oZXhkaWdlc3Qoc2VsZik6CiAgICAgICAgIGZvciBuYW1lIGluIHNlbGYuc3VwcG9ydGVkX2hhc2hfbmFtZXM6CkBAIC0xNzAsNiArMTY5LDIxIEBACiAgICAgICAgICAgICAgICAgICAgICUgKG5hbWUsIGhhc2hfb2JqZWN0X2NvbnN0cnVjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlZCwgbGVuKGRhdGEpLCBkaWdlc3QpKQogCisgICAgZGVmIGNoZWNrX3VwZGF0ZShzZWxmLCBuYW1lLCBkYXRhLCBkaWdlc3QpOgorICAgICAgICBjb25zdHJ1Y3RvcnMgPSBzZWxmLmNvbnN0cnVjdG9yc190b190ZXN0W25hbWVdCisgICAgICAgICMgMiBpcyBmb3IgaGFzaGxpYi5uYW1lKC4uLikgYW5kIGhhc2hsaWIubmV3KG5hbWUsIC4uLikKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwobGVuKGNvbnN0cnVjdG9ycyksIDIpCisgICAgICAgIGZvciBoYXNoX29iamVjdF9jb25zdHJ1Y3RvciBpbiBjb25zdHJ1Y3RvcnM6CisgICAgICAgICAgICBoID0gaGFzaF9vYmplY3RfY29uc3RydWN0b3IoKQorICAgICAgICAgICAgaC51cGRhdGUoZGF0YSkKKyAgICAgICAgICAgIGNvbXB1dGVkID0gaC5oZXhkaWdlc3QoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgY29tcHV0ZWQsIGRpZ2VzdCwKKyAgICAgICAgICAgICAgICAgICAgIkhhc2ggYWxnb3JpdGhtICVzIHVzaW5nICVzIHdoZW4gdXBkYXRlZCByZXR1cm5lZCBoZXhkaWdlc3QiCisgICAgICAgICAgICAgICAgICAgICIgJXIgZm9yICVkIGJ5dGUgaW5wdXQgZGF0YSB0aGF0IHNob3VsZCBoYXZlIGhhc2hlZCB0byAlci4iCisgICAgICAgICAgICAgICAgICAgICUgKG5hbWUsIGhhc2hfb2JqZWN0X2NvbnN0cnVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlZCwgbGVuKGRhdGEpLCBkaWdlc3QpKQorCiAgICAgZGVmIGNoZWNrX3VuaWNvZGUoc2VsZiwgYWxnb3JpdGhtX25hbWUpOgogICAgICAgICAjIFVuaWNvZGUgb2JqZWN0cyBhcmUgbm90IGFsbG93ZWQgYXMgaW5wdXQuCiAgICAgICAgIGV4cGVjdGVkID0gaGFzaGxpYi5uZXcoYWxnb3JpdGhtX25hbWUsIHN0cih1J3NwYW0nKSkuaGV4ZGlnZXN0KCkKQEAgLTE5NSwyMSArMjA5LDIwIEBACiAgICAgICAgIHNlbGYuY2hlY2soJ21kNScsICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OScsCiAgICAgICAgICAgICAgICAgICAgJ2QxNzRhYjk4ZDI3N2Q5ZjVhNTYxMWMyYzlmNDE5ZDlmJykKIAotICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzRHICsgNSwgbWVtdXNlPTEpCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMubWF4c2l6ZSA8IF80RyArIDUsICd0ZXN0IGNhbm5vdCBydW4gb24gMzItYml0IHN5c3RlbXMnKQorICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzRHICsgNSwgbWVtdXNlPTEsIGRyeV9ydW49RmFsc2UpCiAgICAgZGVmIHRlc3RfY2FzZV9tZDVfaHVnZShzZWxmLCBzaXplKToKLSAgICAgICAgaWYgc2l6ZSA9PSBfNEcgKyA1OgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHNlbGYuY2hlY2soJ21kNScsICdBJypzaXplLCAnYzlhZjJkZmYzNzQ2OGNlNWRmZWU4ZjJjZmMwYTljNmQnKQotICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6Ci0gICAgICAgICAgICAgICAgcGFzcyAjIDMyLWJpdCBhcmNoCisgICAgICAgIHNlbGYuY2hlY2soJ21kNScsICdBJypzaXplLCAnYzlhZjJkZmYzNzQ2OGNlNWRmZWU4ZjJjZmMwYTljNmQnKQogCi0gICAgQHByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1fNEcgLSAxLCBtZW11c2U9MSkKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5tYXhzaXplIDwgXzRHICsgNSwgJ3Rlc3QgY2Fubm90IHJ1biBvbiAzMi1iaXQgc3lzdGVtcycpCisgICAgQHByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1fNEcgKyA1LCBtZW11c2U9MSwgZHJ5X3J1bj1GYWxzZSkKKyAgICBkZWYgdGVzdF9jYXNlX21kNV9odWdlX3VwZGF0ZShzZWxmLCBzaXplKToKKyAgICAgICAgc2VsZi5jaGVja191cGRhdGUoJ21kNScsICdBJypzaXplLCAnYzlhZjJkZmYzNzQ2OGNlNWRmZWU4ZjJjZmMwYTljNmQnKQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMubWF4c2l6ZSA8IF80RyAtIDEsICd0ZXN0IGNhbm5vdCBydW4gb24gMzItYml0IHN5c3RlbXMnKQorICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzRHIC0gMSwgbWVtdXNlPTEsIGRyeV9ydW49RmFsc2UpCiAgICAgZGVmIHRlc3RfY2FzZV9tZDVfdWludG1heChzZWxmLCBzaXplKToKLSAgICAgICAgaWYgc2l6ZSA9PSBfNEcgLSAxOgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHNlbGYuY2hlY2soJ21kNScsICdBJypzaXplLCAnMjgxMzhkMzA2ZmYxYjgyODFmMWE5MDY3ZTFhMWEyYjMnKQotICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6Ci0gICAgICAgICAgICAgICAgcGFzcyAjIDMyLWJpdCBhcmNoCisgICAgICAgIHNlbGYuY2hlY2soJ21kNScsICdBJypzaXplLCAnMjgxMzhkMzA2ZmYxYjgyODFmMWE5MDY3ZTFhMWEyYjMnKQogCiAgICAgIyB1c2UgdGhlIHRocmVlIGV4YW1wbGVzIGZyb20gRmVkZXJhbCBJbmZvcm1hdGlvbiBQcm9jZXNzaW5nIFN0YW5kYXJkcwogICAgICMgUHVibGljYXRpb24gMTgwLTEsIFNlY3VyZSBIYXNoIFN0YW5kYXJkLCAgMTk5NSBBcHJpbCAxNwpAQCAtMjMxLDYgKzI0NCwyMyBAQAogICAgICAgICBzZWxmLmNoZWNrKCdzaGExJywgImEiICogMTAwMDAwMCwKICAgICAgICAgICAgICAgICAgICAiMzRhYTk3M2NkNGM0ZGFhNGY2MWVlYjJiZGJhZDI3MzE2NTM0MDE2ZiIpCiAKKyAgICBAcHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPV80RyArIDUsIG1lbXVzZT0xKQorICAgIGRlZiB0ZXN0X2Nhc2Vfc2hhMV9odWdlKHNlbGYsIHNpemUpOgorICAgICAgICBpZiBzaXplID09IF80RyArIDU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVjaygnc2hhMScsICdBJypzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgJzg3ZDc0NWM1MGU2YjI4NzlmZmEwZmIyYzkzMGU5ZmJmZTBkYzlhNWInKQorICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcyAjIDMyLWJpdCBhcmNoCisKKyAgICBAcHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPV80RyArIDUsIG1lbXVzZT0xKQorICAgIGRlZiB0ZXN0X2Nhc2Vfc2hhMV9odWdlX3VwZGF0ZShzZWxmLCBzaXplKToKKyAgICAgICAgaWYgc2l6ZSA9PSBfNEcgKyA1OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfdXBkYXRlKCdzaGExJywgJ0EnKnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAnODdkNzQ1YzUwZTZiMjg3OWZmYTBmYjJjOTMwZTlmYmZlMGRjOWE1YicpCisgICAgICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzICMgMzItYml0IGFyY2gKIAogICAgICMgdXNlIHRoZSBleGFtcGxlcyBmcm9tIEZlZGVyYWwgSW5mb3JtYXRpb24gUHJvY2Vzc2luZyBTdGFuZGFyZHMKICAgICAjIFB1YmxpY2F0aW9uIDE4MC0yLCBTZWN1cmUgSGFzaCBTdGFuZGFyZCwgIDIwMDIgQXVndXN0IDEKQEAgLTM1NCw4ICszODQsNzIgQEAKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX2hhc2gsIGhhc2hlci5oZXhkaWdlc3QoKSkKIAorCitjbGFzcyBLREZUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgcGJrZGYyX3Rlc3RfdmVjdG9ycyA9IFsKKyAgICAgICAgKGIncGFzc3dvcmQnLCBiJ3NhbHQnLCAxLCBOb25lKSwKKyAgICAgICAgKGIncGFzc3dvcmQnLCBiJ3NhbHQnLCAyLCBOb25lKSwKKyAgICAgICAgKGIncGFzc3dvcmQnLCBiJ3NhbHQnLCA0MDk2LCBOb25lKSwKKyAgICAgICAgIyB0b28gc2xvdywgaXQgdGFrZXMgb3ZlciBhIG1pbnV0ZSBvbiBhIGZhc3QgQ1BVLgorICAgICAgICAjKGIncGFzc3dvcmQnLCBiJ3NhbHQnLCAxNjc3NzIxNiwgTm9uZSksCisgICAgICAgIChiJ3Bhc3N3b3JkUEFTU1dPUkRwYXNzd29yZCcsIGInc2FsdFNBTFRzYWx0U0FMVHNhbHRTQUxUc2FsdFNBTFRzYWx0JywKKyAgICAgICAgIDQwOTYsIC0xKSwKKyAgICAgICAgKGIncGFzc1wwd29yZCcsIGInc2FcMGx0JywgNDA5NiwgMTYpLAorICAgIF0KKworICAgIHBia2RmMl9yZXN1bHRzID0geworICAgICAgICAic2hhMSI6IFsKKyAgICAgICAgICAgICMgb2ZmaWNhbCB0ZXN0IHZlY3RvcnMgZnJvbSBSRkMgNjA3MAorICAgICAgICAgICAgKHVuaGV4bGlmeSgnMGM2MGM4MGY5NjFmMGU3MWYzYTliNTI0YWY2MDEyMDYyZmUwMzdhNicpLCBOb25lKSwKKyAgICAgICAgICAgICh1bmhleGxpZnkoJ2VhNmMwMTRkYzcyZDZmOGNjZDFlZDkyYWNlMWQ0MWYwZDhkZTg5NTcnKSwgTm9uZSksCisgICAgICAgICAgICAodW5oZXhsaWZ5KCc0YjAwNzkwMWI3NjU0ODlhYmVhZDQ5ZDkyNmY3MjFkMDY1YTQyOWMxJyksIE5vbmUpLAorICAgICAgICAgICAgIyh1bmhleGxpZnkoJ2VlZmUzZDYxY2Q0ZGE0ZTRlOTk0NWIzZDZiYTIxNThjMjYzNGU5ODQnKSwgTm9uZSksCisgICAgICAgICAgICAodW5oZXhsaWZ5KCczZDJlZWM0ZmU0MWM4NDliODBjOGQ4MzY2MmMwZTQ0YThiMjkxYTk2NGMnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnZjJmMDcwMzgnKSwgMjUpLAorICAgICAgICAgICAgKHVuaGV4bGlmeSgnNTZmYTZhYTc1NTQ4MDk5ZGNjMzdkN2YwMzQyNWUwYzMnKSwgTm9uZSksXSwKKyAgICAgICAgInNoYTI1NiI6IFsKKyAgICAgICAgICAgICh1bmhleGxpZnkoJzEyMGZiNmNmZmNmOGIzMmM0M2U3MjI1MjU2YzRmODM3JworICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2E4NjU0OGM5MmNjYzM1NDgwODA1OTg3Y2I3MGJlMTdiJyksIE5vbmUpLAorICAgICAgICAgICAgKHVuaGV4bGlmeSgnYWU0ZDBjOTVhZjZiNDZkMzJkMGFkZmY5MjhmMDZkZDAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnMmEzMDNmOGVmM2MyNTFkZmQ2ZTJkODVhOTU0NzRjNDMnKSwgTm9uZSksCisgICAgICAgICAgICAodW5oZXhsaWZ5KCdjNWU0NzhkNTkyODhjODQxYWE1MzBkYjY4NDVjNGM4ZCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICc5NjI4OTNhMDAxY2U0ZTExYTQ5NjM4NzNhYTk4MTM0YScpLCBOb25lKSwKKyAgICAgICAgICAgICModW5oZXhsaWZ5KCdjZjgxYzY2ZmU4Y2ZjMDRkMWYzMWVjYjY1ZGFiNDA4OScKKyAgICAgICAgICAgICMgICAgICAgICAgICAgICAnZjdmMTc5ZTg5YjNiMGJjYjE3YWQxMGUzYWM2ZWJhNDYnKSwgTm9uZSksCisgICAgICAgICAgICAodW5oZXhsaWZ5KCczNDhjODlkYmNiZDMyYjJmMzJkODE0YjgxMTZlODRjZjJiMTcnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnMzQ3ZWJjMTgwMDE4MWM0ZTJhMWZiOGRkNTNlMWM2MzU1MThjN2RhYzQ3ZTknKSwgNDApLAorICAgICAgICAgICAgKHVuaGV4bGlmeSgnODliNjlkMDUxNmY4Mjk4OTNjNjk2MjI2NjUwYTg2ODcnKSwgTm9uZSksXSwKKyAgICAgICAgInNoYTUxMiI6IFsKKyAgICAgICAgICAgICh1bmhleGxpZnkoJzg2N2Y3MGNmMWFkZTAyY2ZmMzc1MjU5OWEzYTUzZGM0YWYzNGM3YTY2OTgxNWFlNScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdkNTEzNTU0ZTFjOGNmMjUyYzAyZDQ3MGEyODVhMDUwMWJhZDk5OWJmZTk0M2MwOGYnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnMDUwMjM1ZDdkNjhiMWRhNTVlNjNmNzNiNjBhNTdmY2UnKSwgTm9uZSksCisgICAgICAgICAgICAodW5oZXhsaWZ5KCdlMWQ5YzE2YWE2ODE3MDhhNDVmNWM3YzRlMjE1Y2ViNjZlMDExYTJlOWYwMDQwNzEnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnM2YxOGFlZmRiODY2ZDUzY2Y3NmNhYjI4NjhhMzliOWY3ODQwZWRjZTRmZWY1YTgyJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JlNjczMzVjNzdhNjA2OGUwNDExMjc1NGYyN2NjZjRlJyksIE5vbmUpLAorICAgICAgICAgICAgKHVuaGV4bGlmeSgnZDE5N2IxYjMzZGIwMTQzZTAxOGIxMmYzZDFkMTQ3OWU2Y2RlYmRjYzk3YzVjMGY4JworICAgICAgICAgICAgICAgICAgICAgICAgICAgJzdmNjkwMmUwNzJmNDU3YjUxNDNmMzA2MDI2NDFiM2Q1NWNkMzM1OTg4Y2IzNmI4NCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICczNzYwNjBlY2Q1MzJlMDM5Yjc0MmEyMzk0MzRhZjJkNScpLCBOb25lKSwKKyAgICAgICAgICAgICh1bmhleGxpZnkoJzhjMDUxMWY0YzZlNTk3YzZhYzYzMTVkOGYwMzYyZTIyNWYzYzUwMTQ5NWJhMjNiOCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICc2OGMwMDUxNzRkYzRlZTcxMTE1YjU5ZjllNjBjZDk1MzJmYTMzZTBmNzVhZWZlMzAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnMjI1YzU4M2ExODZjZDgyYmQ0ZGFlYTk3MjRhM2QzYjgnKSwgNjQpLAorICAgICAgICAgICAgKHVuaGV4bGlmeSgnOWQ5ZTljNGNkMjFmZTRiZTI0ZDViODI0NGM3NTk2NjUnKSwgTm9uZSksXSwKKyAgICB9CisKKyAgICBkZWYgdGVzdF9wYmtkZjJfaG1hYyhzZWxmKToKKyAgICAgICAgZm9yIGRpZ2VzdF9uYW1lLCByZXN1bHRzIGluIHNlbGYucGJrZGYyX3Jlc3VsdHMuaXRlbXMoKToKKyAgICAgICAgICAgIGZvciBpLCB2ZWN0b3IgaW4gZW51bWVyYXRlKHNlbGYucGJrZGYyX3Rlc3RfdmVjdG9ycyk6CisgICAgICAgICAgICAgICAgcGFzc3dvcmQsIHNhbHQsIHJvdW5kcywgZGtsZW4gPSB2ZWN0b3IKKyAgICAgICAgICAgICAgICBleHBlY3RlZCwgb3ZlcndyaXRlX2RrbGVuID0gcmVzdWx0c1tpXQorICAgICAgICAgICAgICAgIGlmIG92ZXJ3cml0ZV9ka2xlbjoKKyAgICAgICAgICAgICAgICAgICAgZGtsZW4gPSBvdmVyd3JpdGVfZGtsZW4KKyAgICAgICAgICAgICAgICBvdXQgPSBoYXNobGliLnBia2RmMl9obWFjKAorICAgICAgICAgICAgICAgICAgICBkaWdlc3RfbmFtZSwgcGFzc3dvcmQsIHNhbHQsIHJvdW5kcywgZGtsZW4pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXQsIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpZ2VzdF9uYW1lLCBwYXNzd29yZCwgc2FsdCwgcm91bmRzLCBka2xlbikpCisKKwogZGVmIHRlc3RfbWFpbigpOgotICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoSGFzaExpYlRlc3RDYXNlKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoSGFzaExpYlRlc3RDYXNlLCBLREZUZXN0cykKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9oZWFwcS5weSBiL0xpYi90ZXN0L3Rlc3RfaGVhcHEucHkKaW5kZXggNTkzMmE0MC4uYzRkZTU5MyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9oZWFwcS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2hlYXBxLnB5CkBAIC0xNTgsNiArMTU4LDE1IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGNoYWluKCppbnB1dHMpKSwgbGlzdChzZWxmLm1vZHVsZS5tZXJnZSgqaW5wdXRzKSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzZWxmLm1vZHVsZS5tZXJnZSgpKSwgW10pCiAKKyAgICBkZWYgdGVzdF9tZXJnZV9kb2VzX25vdF9zdXBwcmVzc19pbmRleF9lcnJvcihzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAxOTAxODogSGVhcHEubWVyZ2Ugc3VwcHJlc3NlcyBJbmRleEVycm9yIGZyb20gdXNlciBnZW5lcmF0b3IKKyAgICAgICAgZGVmIGl0ZXJhYmxlKCk6CisgICAgICAgICAgICBzID0gbGlzdChyYW5nZSgxMCkpCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgyMCk6CisgICAgICAgICAgICAgICAgeWllbGQgc1tpXSAgICAgICAjIEluZGV4RXJyb3Igd2hlbiBpID4gMTAKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yKToKKyAgICAgICAgICAgIGxpc3Qoc2VsZi5tb2R1bGUubWVyZ2UoaXRlcmFibGUoKSwgaXRlcmFibGUoKSkpCisKICAgICBkZWYgdGVzdF9tZXJnZV9zdGFiaWxpdHkoc2VsZik6CiAgICAgICAgIGNsYXNzIEludChpbnQpOgogICAgICAgICAgICAgcGFzcwpAQCAtMzE1LDYgKzMyNCwxNiBAQAogICAgICdUZXN0IG11bHRpcGxlIHRpZXJzIG9mIGl0ZXJhdG9ycycKICAgICByZXR1cm4gY2hhaW4oaW1hcChsYW1iZGEgeDp4LCBSKElnKEcoc2VxbikpKSkpCiAKK2NsYXNzIFNpZGVFZmZlY3RMVDoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUsIGhlYXApOgorICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgc2VsZi5oZWFwID0gaGVhcAorCisgICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHNlbGYuaGVhcFs6XSA9IFtdCisgICAgICAgIHJldHVybiBzZWxmLnZhbHVlIDwgb3RoZXIudmFsdWUKKworCiBjbGFzcyBUZXN0RXJyb3JIYW5kbGluZyhUZXN0Q2FzZSk6CiAgICAgbW9kdWxlID0gTm9uZQogCkBAIC0zNjEsNiArMzgwLDIyIEBACiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmLCAyLCBOKHMpKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBmLCAyLCBFKHMpKQogCisgICAgIyBJc3N1ZSAjMTcyNzg6IHRoZSBoZWFwIG1heSBjaGFuZ2Ugc2l6ZSB3aGlsZSBpdCdzIGJlaW5nIHdhbGtlZC4KKworICAgIGRlZiB0ZXN0X2hlYXBwdXNoX211dGF0aW5nX2hlYXAoc2VsZik6CisgICAgICAgIGhlYXAgPSBbXQorICAgICAgICBoZWFwLmV4dGVuZChTaWRlRWZmZWN0TFQoaSwgaGVhcCkgZm9yIGkgaW4gcmFuZ2UoMjAwKSkKKyAgICAgICAgIyBQeXRob24gdmVyc2lvbiByYWlzZXMgSW5kZXhFcnJvciwgQyB2ZXJzaW9uIFJ1bnRpbWVFcnJvcgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKChJbmRleEVycm9yLCBSdW50aW1lRXJyb3IpKToKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLmhlYXBwdXNoKGhlYXAsIFNpZGVFZmZlY3RMVCg1LCBoZWFwKSkKKworICAgIGRlZiB0ZXN0X2hlYXBwb3BfbXV0YXRpbmdfaGVhcChzZWxmKToKKyAgICAgICAgaGVhcCA9IFtdCisgICAgICAgIGhlYXAuZXh0ZW5kKFNpZGVFZmZlY3RMVChpLCBoZWFwKSBmb3IgaSBpbiByYW5nZSgyMDApKQorICAgICAgICAjIFB5dGhvbiB2ZXJzaW9uIHJhaXNlcyBJbmRleEVycm9yLCBDIHZlcnNpb24gUnVudGltZUVycm9yCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoKEluZGV4RXJyb3IsIFJ1bnRpbWVFcnJvcikpOgorICAgICAgICAgICAgc2VsZi5tb2R1bGUuaGVhcHBvcChoZWFwKQorCiAKIGNsYXNzIFRlc3RFcnJvckhhbmRsaW5nUHl0aG9uKFRlc3RFcnJvckhhbmRsaW5nKToKICAgICBtb2R1bGUgPSBweV9oZWFwcQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9obWFjLnB5IGIvTGliL3Rlc3QvdGVzdF9obWFjLnB5CmluZGV4IGNkMTQ4ZTkuLjgzOWQwMTkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaG1hYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2htYWMucHkKQEAgLTEsMyArMSw1IEBACisjIGNvZGluZzogdXRmLTgKKwogaW1wb3J0IGhtYWMKIGltcG9ydCBoYXNobGliCiBpbXBvcnQgdW5pdHRlc3QKQEAgLTMwMiwxMiArMzA0LDEyMiBAQAogICAgICAgICBzZWxmLmFzc2VydFRydWUoaDEuaGV4ZGlnZXN0KCkgPT0gaDIuaGV4ZGlnZXN0KCksCiAgICAgICAgICAgICAiSGV4ZGlnZXN0IG9mIGNvcHkgZG9lc24ndCBtYXRjaCBvcmlnaW5hbCBoZXhkaWdlc3QuIikKIAorCitjbGFzcyBDb21wYXJlRGlnZXN0VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfY29tcGFyZV9kaWdlc3Qoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBpbnB1dCB0eXBlIGV4Y2VwdGlvbiBoYW5kbGluZworICAgICAgICBhLCBiID0gMTAwLCAyMDAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBobWFjLmNvbXBhcmVfZGlnZXN0LCBhLCBiKQorICAgICAgICBhLCBiID0gMTAwLCBiImZvb2JhciIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBobWFjLmNvbXBhcmVfZGlnZXN0LCBhLCBiKQorICAgICAgICBhLCBiID0gYiJmb29iYXIiLCAyMDAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBobWFjLmNvbXBhcmVfZGlnZXN0LCBhLCBiKQorICAgICAgICBhLCBiID0gdSJmb29iYXIiLCBiImZvb2JhciIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBobWFjLmNvbXBhcmVfZGlnZXN0LCBhLCBiKQorICAgICAgICBhLCBiID0gYiJmb29iYXIiLCB1ImZvb2JhciIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBobWFjLmNvbXBhcmVfZGlnZXN0LCBhLCBiKQorCisgICAgICAgICMgVGVzdGluZyBieXRlcyBvZiBkaWZmZXJlbnQgbGVuZ3RocworICAgICAgICBhLCBiID0gYiJmb29iYXIiLCBiImZvbyIKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShobWFjLmNvbXBhcmVfZGlnZXN0KGEsIGIpKQorICAgICAgICBhLCBiID0gYiJceGRlXHhhZFx4YmVceGVmIiwgYiJceGRlXHhhZCIKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShobWFjLmNvbXBhcmVfZGlnZXN0KGEsIGIpKQorCisgICAgICAgICMgVGVzdGluZyBieXRlcyBvZiBzYW1lIGxlbmd0aHMsIGRpZmZlcmVudCB2YWx1ZXMKKyAgICAgICAgYSwgYiA9IGIiZm9vYmFyIiwgYiJmb29iYXoiCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaG1hYy5jb21wYXJlX2RpZ2VzdChhLCBiKSkKKyAgICAgICAgYSwgYiA9IGIiXHhkZVx4YWRceGJlXHhlZiIsIGIiXHhhYlx4YWRceDFkXHhlYSIKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShobWFjLmNvbXBhcmVfZGlnZXN0KGEsIGIpKQorCisgICAgICAgICMgVGVzdGluZyBieXRlcyBvZiBzYW1lIGxlbmd0aHMsIHNhbWUgdmFsdWVzCisgICAgICAgIGEsIGIgPSBiImZvb2JhciIsIGIiZm9vYmFyIgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaG1hYy5jb21wYXJlX2RpZ2VzdChhLCBiKSkKKyAgICAgICAgYSwgYiA9IGIiXHhkZVx4YWRceGJlXHhlZiIsIGIiXHhkZVx4YWRceGJlXHhlZiIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhtYWMuY29tcGFyZV9kaWdlc3QoYSwgYikpCisKKyAgICAgICAgIyBUZXN0aW5nIGJ5dGVhcnJheXMgb2Ygc2FtZSBsZW5ndGhzLCBzYW1lIHZhbHVlcworICAgICAgICBhLCBiID0gYnl0ZWFycmF5KGIiZm9vYmFyIiksIGJ5dGVhcnJheShiImZvb2JhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShobWFjLmNvbXBhcmVfZGlnZXN0KGEsIGIpKQorCisgICAgICAgICMgVGVzdGluZyBieXRlYXJyYXlzIG9mIGRpZmZlZW50IGxlbmd0aHMKKyAgICAgICAgYSwgYiA9IGJ5dGVhcnJheShiImZvb2JhciIpLCBieXRlYXJyYXkoYiJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhtYWMuY29tcGFyZV9kaWdlc3QoYSwgYikpCisKKyAgICAgICAgIyBUZXN0aW5nIGJ5dGVhcnJheXMgb2Ygc2FtZSBsZW5ndGhzLCBkaWZmZXJlbnQgdmFsdWVzCisgICAgICAgIGEsIGIgPSBieXRlYXJyYXkoYiJmb29iYXIiKSwgYnl0ZWFycmF5KGIiZm9vYmF6IikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShobWFjLmNvbXBhcmVfZGlnZXN0KGEsIGIpKQorCisgICAgICAgICMgVGVzdGluZyBieXRlIGFuZCBieXRlYXJyYXkgb2Ygc2FtZSBsZW5ndGhzLCBzYW1lIHZhbHVlcworICAgICAgICBhLCBiID0gYnl0ZWFycmF5KGIiZm9vYmFyIiksIGIiZm9vYmFyIgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaG1hYy5jb21wYXJlX2RpZ2VzdChhLCBiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhtYWMuY29tcGFyZV9kaWdlc3QoYiwgYSkpCisKKyAgICAgICAgIyBUZXN0aW5nIGJ5dGUgYnl0ZWFycmF5IG9mIGRpZmZlZW50IGxlbmd0aHMKKyAgICAgICAgYSwgYiA9IGJ5dGVhcnJheShiImZvb2JhciIpLCBiImZvbyIKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShobWFjLmNvbXBhcmVfZGlnZXN0KGEsIGIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhtYWMuY29tcGFyZV9kaWdlc3QoYiwgYSkpCisKKyAgICAgICAgIyBUZXN0aW5nIGJ5dGUgYW5kIGJ5dGVhcnJheSBvZiBzYW1lIGxlbmd0aHMsIGRpZmZlcmVudCB2YWx1ZXMKKyAgICAgICAgYSwgYiA9IGJ5dGVhcnJheShiImZvb2JhciIpLCBiImZvb2JheiIKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShobWFjLmNvbXBhcmVfZGlnZXN0KGEsIGIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhtYWMuY29tcGFyZV9kaWdlc3QoYiwgYSkpCisKKyAgICAgICAgIyBUZXN0aW5nIHN0ciBvZiBzYW1lIGxlbmd0aHMKKyAgICAgICAgYSwgYiA9ICJmb29iYXIiLCAiZm9vYmFyIgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaG1hYy5jb21wYXJlX2RpZ2VzdChhLCBiKSkKKworICAgICAgICAjIFRlc3Rpbmcgc3RyIG9mIGRpZmZlZW50IGxlbmd0aHMKKyAgICAgICAgYSwgYiA9ICJmb28iLCAiZm9vYmFyIgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhtYWMuY29tcGFyZV9kaWdlc3QoYSwgYikpCisKKyAgICAgICAgIyBUZXN0aW5nIGJ5dGVzIG9mIHNhbWUgbGVuZ3RocywgZGlmZmVyZW50IHZhbHVlcworICAgICAgICBhLCBiID0gImZvb2JhciIsICJmb29iYXoiCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaG1hYy5jb21wYXJlX2RpZ2VzdChhLCBiKSkKKworICAgICAgICAjIFRlc3RpbmcgZXJyb3IgY2FzZXMKKyAgICAgICAgYSwgYiA9IHUiZm9vYmFyIiwgYiJmb29iYXIiCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaG1hYy5jb21wYXJlX2RpZ2VzdCwgYSwgYikKKyAgICAgICAgYSwgYiA9IGIiZm9vYmFyIiwgdSJmb29iYXIiCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaG1hYy5jb21wYXJlX2RpZ2VzdCwgYSwgYikKKyAgICAgICAgYSwgYiA9IGIiZm9vYmFyIiwgMQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGhtYWMuY29tcGFyZV9kaWdlc3QsIGEsIGIpCisgICAgICAgIGEsIGIgPSAxMDAsIDIwMAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGhtYWMuY29tcGFyZV9kaWdlc3QsIGEsIGIpCisgICAgICAgIGEsIGIgPSAiZm9vw6QiLCAiZm9vw6QiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShobWFjLmNvbXBhcmVfZGlnZXN0KGEsIGIpKQorCisgICAgICAgICMgc3ViY2xhc3NlcyBhcmUgc3VwcG9ydGVkIGJ5IGlnbm9yZSBfX2VxX18KKyAgICAgICAgY2xhc3MgbXlzdHIoc3RyKToKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIGEsIGIgPSBteXN0cigiZm9vYmFyIiksIG15c3RyKCJmb29iYXIiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaG1hYy5jb21wYXJlX2RpZ2VzdChhLCBiKSkKKyAgICAgICAgYSwgYiA9IG15c3RyKCJmb29iYXIiKSwgImZvb2JhciIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhtYWMuY29tcGFyZV9kaWdlc3QoYSwgYikpCisgICAgICAgIGEsIGIgPSBteXN0cigiZm9vYmFyIiksIG15c3RyKCJmb29iYXoiKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhtYWMuY29tcGFyZV9kaWdlc3QoYSwgYikpCisKKyAgICAgICAgY2xhc3MgbXlieXRlcyhieXRlcyk6CisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBhLCBiID0gbXlieXRlcyhiImZvb2JhciIpLCBteWJ5dGVzKGIiZm9vYmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhtYWMuY29tcGFyZV9kaWdlc3QoYSwgYikpCisgICAgICAgIGEsIGIgPSBteWJ5dGVzKGIiZm9vYmFyIiksIGIiZm9vYmFyIgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaG1hYy5jb21wYXJlX2RpZ2VzdChhLCBiKSkKKyAgICAgICAgYSwgYiA9IG15Ynl0ZXMoYiJmb29iYXIiKSwgbXlieXRlcyhiImZvb2JheiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaG1hYy5jb21wYXJlX2RpZ2VzdChhLCBiKSkKKworCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKICAgICAgICAgVGVzdFZlY3RvcnNUZXN0Q2FzZSwKICAgICAgICAgQ29uc3RydWN0b3JUZXN0Q2FzZSwKICAgICAgICAgU2FuaXR5VGVzdENhc2UsCi0gICAgICAgIENvcHlUZXN0Q2FzZQorICAgICAgICBDb3B5VGVzdENhc2UsCisgICAgICAgIENvbXBhcmVEaWdlc3RUZXN0Q2FzZSwKICAgICApCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2h0bWxwYXJzZXIucHkgYi9MaWIvdGVzdC90ZXN0X2h0bWxwYXJzZXIucHkKaW5kZXggNWRmZTQ2Ni4uY2RlMmJkMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9odG1scGFyc2VyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaHRtbHBhcnNlci5weQpAQCAtMTE0LDcgKzExNCw3IEBACiA8SW1nIHNSYz0nQmFyJyBpc01BUD5zYW1wbGUKIHRleHQKICYjeDIwMUM7Ci08IS0tY29tbWVudDJhLS0gLS1jb21tZW50MmItLT48IT4KKzwhLS1jb21tZW50MmEtLSAtLWNvbW1lbnQyYi0tPgogPC9IdG1sPgogIiIiLCBbCiAgICAgKCJkYXRhIiwgIlxuIiksCkBAIC0xNDIsMjQgKzE0Miw2IEBACiAgICAgICAgICAgICAoImRhdGEiLCAiIGZvbyIpLAogICAgICAgICAgICAgXSkKIAotICAgIGRlZiB0ZXN0X2RvY3R5cGVfZGVjbChzZWxmKToKLSAgICAgICAgaW5zaWRlID0gIiIiXAotRE9DVFlQRSBodG1sIFsKLSAgPCFFTEVNRU5UIGh0bWwgLSBPIEVNUFRZPgotICA8IUFUVExJU1QgaHRtbAotICAgICAgdmVyc2lvbiBDREFUQSAjSU1QTElFRAotICAgICAgcHJvZmlsZSBDREFUQSAnRHVibGluQ29yZSc+Ci0gIDwhTk9UQVRJT04gZGF0YXR5cGUgU1lTVEVNICdodHRwOi8veG1sLnB5dGhvbi5vcmcvbm90YXRpb25zL3B5dGhvbi1tb2R1bGUnPgotICA8IUVOVElUWSBteUVudGl0eSAnaW50ZXJuYWwgcGFyc2VkIGVudGl0eSc+Ci0gIDwhRU5USVRZIGFuRW50aXR5IFNZU1RFTSAnaHR0cDovL3htbC5weXRob24ub3JnL2VudGl0aWVzL3NvbWV0aGluZy54bWwnPgotICA8IUVOVElUWSAlIHBhcmFtRW50aXR5ICduYW1lfG5hbWV8bmFtZSc+Ci0gICVwYXJhbUVudGl0eTsKLSAgPCEtLSBjb21tZW50IC0tPgotXSIiIgotICAgICAgICBzZWxmLl9ydW5fY2hlY2soIjwhJXM+IiAlIGluc2lkZSwgWwotICAgICAgICAgICAgKCJkZWNsIiwgaW5zaWRlKSwKLSAgICAgICAgICAgIF0pCi0KICAgICBkZWYgdGVzdF9iYWRfbmVzdGluZyhzZWxmKToKICAgICAgICAgIyBTdHJhbmdlbHksIHRoaXMgKmlzKiBzdXBwb3NlZCB0byB0ZXN0IHRoYXQgb3ZlcmxhcHBpbmcKICAgICAgICAgIyBlbGVtZW50cyBhcmUgYWxsb3dlZC4gIEhUTUxQYXJzZXIgaXMgbW9yZSBnZWFyZWQgdG93YXJkCkBAIC0xODIsNyArMTY0LDggQEAKICAgICAgICAgICAgIF0pCiAKICAgICBkZWYgdGVzdF9pbGxlZ2FsX2RlY2xhcmF0aW9ucyhzZWxmKToKLSAgICAgICAgc2VsZi5fcGFyc2VfZXJyb3IoJzwhc3BhY2VyIHR5cGU9ImJsb2NrIiBoZWlnaHQ9IjI1Ij4nKQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soJzwhc3BhY2VyIHR5cGU9ImJsb2NrIiBoZWlnaHQ9IjI1Ij4nLAorICAgICAgICAgICAgICAgICAgICAgICAgWygnY29tbWVudCcsICdzcGFjZXIgdHlwZT0iYmxvY2siIGhlaWdodD0iMjUiJyldKQogCiAgICAgZGVmIHRlc3Rfc3RhcnR0YWdfZW5kX2JvdW5kYXJ5KHNlbGYpOgogICAgICAgICBzZWxmLl9ydW5fY2hlY2soIiIiPGEgYj0nPCc+IiIiLCBbKCJzdGFydHRhZyIsICJhIiwgWygiYiIsICI8IildKV0pCkBAIC0yMTksMjEgKzIwMiw4MSBAQAogICAgICAgICBzZWxmLl9ydW5fY2hlY2soWyI8IS0tYWJjLS0+IiwgIiJdLCBvdXRwdXQpCiAKICAgICBkZWYgdGVzdF9zdGFydHRhZ19qdW5rX2NoYXJzKHNlbGYpOgotICAgICAgICBzZWxmLl9wYXJzZV9lcnJvcigiPC8+IikKLSAgICAgICAgc2VsZi5fcGFyc2VfZXJyb3IoIjwvJD4iKQotICAgICAgICBzZWxmLl9wYXJzZV9lcnJvcigiPC8iKQotICAgICAgICBzZWxmLl9wYXJzZV9lcnJvcigiPC9hIikKLSAgICAgICAgc2VsZi5fcGFyc2VfZXJyb3IoIjxhPGE+IikKLSAgICAgICAgc2VsZi5fcGFyc2VfZXJyb3IoIjwvYTxhPiIpCi0gICAgICAgIHNlbGYuX3BhcnNlX2Vycm9yKCI8ISIpCi0gICAgICAgIHNlbGYuX3BhcnNlX2Vycm9yKCI8YSIpCi0gICAgICAgIHNlbGYuX3BhcnNlX2Vycm9yKCI8YSBmb289J2JhciciKQotICAgICAgICBzZWxmLl9wYXJzZV9lcnJvcigiPGEgZm9vPSdiYXIiKQotICAgICAgICBzZWxmLl9wYXJzZV9lcnJvcigiPGEgZm9vPSc+JyIpCi0gICAgICAgIHNlbGYuX3BhcnNlX2Vycm9yKCI8YSBmb289Jz4iKQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soIjwvPiIsIFtdKQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soIjwvJD4iLCBbKCdjb21tZW50JywgJyQnKV0pCisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiPC8iLCBbKCdkYXRhJywgJzwvJyldKQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soIjwvYSIsIFsoJ2RhdGEnLCAnPC9hJyldKQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soIjxhPGE+IiwgWygnc3RhcnR0YWcnLCAnYTxhJywgW10pXSkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCI8L2E8YT4iLCBbKCdlbmR0YWcnLCAnYTxhJyldKQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soIjwhIiwgWygnZGF0YScsICc8IScpXSkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCI8YSIsIFsoJ2RhdGEnLCAnPGEnKV0pCisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiPGEgZm9vPSdiYXInIiwgWygnZGF0YScsICI8YSBmb289J2JhciciKV0pCisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiPGEgZm9vPSdiYXIiLCBbKCdkYXRhJywgIjxhIGZvbz0nYmFyIildKQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soIjxhIGZvbz0nPiciLCBbKCdkYXRhJywgIjxhIGZvbz0nPiciKV0pCisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiPGEgZm9vPSc+IiwgWygnZGF0YScsICI8YSBmb289Jz4iKV0pCisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiPGEkPiIsIFsoJ3N0YXJ0dGFnJywgJ2EkJywgW10pXSkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCI8YSRiPiIsIFsoJ3N0YXJ0dGFnJywgJ2EkYicsIFtdKV0pCisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiPGEkYi8+IiwgWygnc3RhcnRlbmR0YWcnLCAnYSRiJywgW10pXSkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCI8YSRiICA+IiwgWygnc3RhcnR0YWcnLCAnYSRiJywgW10pXSkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCI8YSRiICAvPiIsIFsoJ3N0YXJ0ZW5kdGFnJywgJ2EkYicsIFtdKV0pCisKKyAgICBkZWYgdGVzdF92YWxpZF9kb2N0eXBlcyhzZWxmKToKKyAgICAgICAgIyBmcm9tIGh0dHA6Ly93d3cudzMub3JnL1FBLzIwMDIvMDQvdmFsaWQtZHRkLWxpc3QuaHRtbAorICAgICAgICBkdGRzID0gWydIVE1MJywgICMgSFRNTDUgZG9jdHlwZQorICAgICAgICAgICAgICAgICgnSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iICcKKyAgICAgICAgICAgICAgICAgJyJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIicpLAorICAgICAgICAgICAgICAgICgnSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAnCisgICAgICAgICAgICAgICAgICciaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIicpLAorICAgICAgICAgICAgICAgICgnaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAnCisgICAgICAgICAgICAgICAgICciaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCInKSwKKyAgICAgICAgICAgICAgICAoJ2h0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgRnJhbWVzZXQvL0VOIiAnCisgICAgICAgICAgICAgICAgICciaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtZnJhbWVzZXQuZHRkIicpLAorICAgICAgICAgICAgICAgICgnbWF0aCBQVUJMSUMgIi0vL1czQy8vRFREIE1hdGhNTCAyLjAvL0VOIiAnCisgICAgICAgICAgICAgICAgICciaHR0cDovL3d3dy53My5vcmcvTWF0aC9EVEQvbWF0aG1sMi9tYXRobWwyLmR0ZCInKSwKKyAgICAgICAgICAgICAgICAoJ2h0bWwgUFVCTElDICItLy9XM0MvL0RURCAnCisgICAgICAgICAgICAgICAgICdYSFRNTCAxLjEgcGx1cyBNYXRoTUwgMi4wIHBsdXMgU1ZHIDEuMS8vRU4iICcKKyAgICAgICAgICAgICAgICAgJyJodHRwOi8vd3d3LnczLm9yZy8yMDAyLzA0L3hodG1sLW1hdGgtc3ZnL3hodG1sLW1hdGgtc3ZnLmR0ZCInKSwKKyAgICAgICAgICAgICAgICAoJ3N2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAnCisgICAgICAgICAgICAgICAgICciaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIicpLAorICAgICAgICAgICAgICAgICdodG1sIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgMi4wLy9FTiInLAorICAgICAgICAgICAgICAgICdodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIiddCisgICAgICAgIGZvciBkdGQgaW4gZHRkczoKKyAgICAgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiPCFET0NUWVBFICVzPiIgJSBkdGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWygnZGVjbCcsICdET0NUWVBFICcgKyBkdGQpXSkKKworICAgIGRlZiB0ZXN0X3NsYXNoZXNfaW5fc3RhcnR0YWcoc2VsZik6CisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygnPGEgZm9vPSJ2YXIiLz4nLCBbKCdzdGFydGVuZHRhZycsICdhJywgWygnZm9vJywgJ3ZhcicpXSldKQorICAgICAgICBodG1sID0gKCc8aW1nIHdpZHRoPTkwMiBoZWlnaHQ9MjUwcHggJworICAgICAgICAgICAgICAgICdzcmM9Ii9zaXRlcy9kZWZhdWx0L2ZpbGVzL2ltYWdlcy9ob21lcGFnZS9mb28uanBnIiAnCisgICAgICAgICAgICAgICAgJy8qd2hhdCBhbSBJIGRvaW5nIGhlcmUqLyAvPicpCisgICAgICAgIGV4cGVjdGVkID0gWygKKyAgICAgICAgICAgICdzdGFydGVuZHRhZycsICdpbWcnLAorICAgICAgICAgICAgWygnd2lkdGgnLCAnOTAyJyksICgnaGVpZ2h0JywgJzI1MHB4JyksCisgICAgICAgICAgICAgKCdzcmMnLCAnL3NpdGVzL2RlZmF1bHQvZmlsZXMvaW1hZ2VzL2hvbWVwYWdlL2Zvby5qcGcnKSwKKyAgICAgICAgICAgICAoJyp3aGF0JywgTm9uZSksICgnYW0nLCBOb25lKSwgKCdpJywgTm9uZSksCisgICAgICAgICAgICAgKCdkb2luZycsIE5vbmUpLCAoJ2hlcmUqJywgTm9uZSldCisgICAgICAgICldCisgICAgICAgIHNlbGYuX3J1bl9jaGVjayhodG1sLCBleHBlY3RlZCkKKyAgICAgICAgaHRtbCA9ICgnPGEgLyAvZm9vLyAvIC89LyAvIC9iYXIvIC8gLz4nCisgICAgICAgICAgICAgICAgJzxhIC8gL2Zvby8gLyAvPS8gLyAvYmFyLyAvID4nKQorICAgICAgICBleHBlY3RlZCA9IFsKKyAgICAgICAgICAgICgnc3RhcnRlbmR0YWcnLCAnYScsIFsoJ2ZvbycsIE5vbmUpLCAoJz0nLCBOb25lKSwgKCdiYXInLCBOb25lKV0pLAorICAgICAgICAgICAgKCdzdGFydHRhZycsICdhJywgWygnZm9vJywgTm9uZSksICgnPScsIE5vbmUpLCAoJ2JhcicsIE5vbmUpXSkKKyAgICAgICAgXQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soaHRtbCwgZXhwZWN0ZWQpCisgICAgICAgICNzZWUgaXNzdWUgIzE0NTM4CisgICAgICAgIGh0bWwgPSAoJzxtZXRhPjxtZXRhIC8gPjxtZXRhIC8vID48bWV0YSAvIC8gPicKKyAgICAgICAgICAgICAgICAnPG1ldGEvPjxtZXRhIC8+PG1ldGEgLy8+PG1ldGEvLz4nKQorICAgICAgICBleHBlY3RlZCA9IFsKKyAgICAgICAgICAgICgnc3RhcnR0YWcnLCAnbWV0YScsIFtdKSwgKCdzdGFydHRhZycsICdtZXRhJywgW10pLAorICAgICAgICAgICAgKCdzdGFydHRhZycsICdtZXRhJywgW10pLCAoJ3N0YXJ0dGFnJywgJ21ldGEnLCBbXSksCisgICAgICAgICAgICAoJ3N0YXJ0ZW5kdGFnJywgJ21ldGEnLCBbXSksICgnc3RhcnRlbmR0YWcnLCAnbWV0YScsIFtdKSwKKyAgICAgICAgICAgICgnc3RhcnRlbmR0YWcnLCAnbWV0YScsIFtdKSwgKCdzdGFydGVuZHRhZycsICdtZXRhJywgW10pLAorICAgICAgICBdCisgICAgICAgIHNlbGYuX3J1bl9jaGVjayhodG1sLCBleHBlY3RlZCkKIAogICAgIGRlZiB0ZXN0X2RlY2xhcmF0aW9uX2p1bmtfY2hhcnMoc2VsZik6Ci0gICAgICAgIHNlbGYuX3BhcnNlX2Vycm9yKCI8IURPQ1RZUEUgZm9vICQgPiIpCisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiPCFET0NUWVBFIGZvbyAkID4iLCBbKCdkZWNsJywgJ0RPQ1RZUEUgZm9vICQgJyldKQogCiAgICAgZGVmIHRlc3Rfc3RhcnRlbmR0YWcoc2VsZik6CiAgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiPHAvPiIsIFsKQEAgLTI0OSw2ICsyOTIsNDQgQEAKICAgICAgICAgICAgICgiZW5kdGFnIiwgInAiKSwKICAgICAgICAgICAgIF0pCiAKKyAgICBkZWYgdGVzdF9pbnZhbGlkX2VuZF90YWdzKHNlbGYpOgorICAgICAgICAjIEEgY29sbGVjdGlvbiBvZiBicm9rZW4gZW5kIHRhZ3MuIDxicj4gaXMgdXNlZCBhcyBzZXBhcmF0b3IuCisgICAgICAgICMgc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L3Rva2VuaXphdGlvbi5odG1sI2VuZC10YWctb3Blbi1zdGF0ZQorICAgICAgICAjIGFuZCAjMTM5OTMKKyAgICAgICAgaHRtbCA9ICgnPGJyPjwvbGFiZWw8L3A+PGJyPjwvZGl2IGVuZCB0bUFkLWxlYWRlckJvYXJkPjxicj48LzxoND48YnI+JworICAgICAgICAgICAgICAgICc8L2xpIGNsYXNzPSJ1bml0Ij48YnI+PC9saVxyXG5cdFx0XHRcdFx0XHQ8L3VsPjxicj48Lz48YnI+JykKKyAgICAgICAgZXhwZWN0ZWQgPSBbKCdzdGFydHRhZycsICdicicsIFtdKSwKKyAgICAgICAgICAgICAgICAgICAgIyA8IGlzIHBhcnQgb2YgdGhlIG5hbWUsIC8gaXMgZGlzY2FyZGVkLCBwIGlzIGFuIGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAoJ2VuZHRhZycsICdsYWJlbDwnKSwKKyAgICAgICAgICAgICAgICAgICAgKCdzdGFydHRhZycsICdicicsIFtdKSwKKyAgICAgICAgICAgICAgICAgICAgIyB0ZXh0IGFuZCBhdHRyaWJ1dGVzIGFyZSBkaXNjYXJkZWQKKyAgICAgICAgICAgICAgICAgICAgKCdlbmR0YWcnLCAnZGl2JyksCisgICAgICAgICAgICAgICAgICAgICgnc3RhcnR0YWcnLCAnYnInLCBbXSksCisgICAgICAgICAgICAgICAgICAgICMgY29tbWVudCBiZWNhdXNlIHRoZSBmaXJzdCBjaGFyIGFmdGVyIDwvIGlzIG5vdCBhLXpBLVoKKyAgICAgICAgICAgICAgICAgICAgKCdjb21tZW50JywgJzxoNCcpLAorICAgICAgICAgICAgICAgICAgICAoJ3N0YXJ0dGFnJywgJ2JyJywgW10pLAorICAgICAgICAgICAgICAgICAgICAjIGF0dHJpYnV0ZXMgYXJlIGRpc2NhcmRlZAorICAgICAgICAgICAgICAgICAgICAoJ2VuZHRhZycsICdsaScpLAorICAgICAgICAgICAgICAgICAgICAoJ3N0YXJ0dGFnJywgJ2JyJywgW10pLAorICAgICAgICAgICAgICAgICAgICAjIGV2ZXJ5dGhpbmcgdGlsbCB1bCAoaW5jbHVkZWQpIGlzIGRpc2NhcmRlZAorICAgICAgICAgICAgICAgICAgICAoJ2VuZHRhZycsICdsaScpLAorICAgICAgICAgICAgICAgICAgICAoJ3N0YXJ0dGFnJywgJ2JyJywgW10pLAorICAgICAgICAgICAgICAgICAgICAjIDwvPiBpcyBpZ25vcmVkCisgICAgICAgICAgICAgICAgICAgICgnc3RhcnR0YWcnLCAnYnInLCBbXSldCisgICAgICAgIHNlbGYuX3J1bl9jaGVjayhodG1sLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2Jyb2tlbl9pbnZhbGlkX2VuZF90YWcoc2VsZik6CisgICAgICAgICMgVGhpcyBpcyB0ZWNobmljYWxseSB3cm9uZyAodGhlICI+IHNob3VsZG4ndCBiZSBpbmNsdWRlZCBpbiB0aGUgJ2RhdGEnKQorICAgICAgICAjIGJ1dCBpcyBwcm9iYWJseSBub3Qgd29ydGggZml4aW5nIGl0IChpbiBhZGRpdGlvbiB0byBhbGwgdGhlIGNhc2VzIG9mCisgICAgICAgICMgdGhlIHByZXZpb3VzIHRlc3QsIGl0IHdvdWxkIHJlcXVpcmUgYSBmdWxsIGF0dHJpYnV0ZSBwYXJzaW5nKS4KKyAgICAgICAgIyBzZWUgIzEzOTkzCisgICAgICAgIGh0bWwgPSAnPGI+VGhpczwvYiBhdHRyPSI+Ij4gY29uZnVzZXMgdGhlIHBhcnNlcicKKyAgICAgICAgZXhwZWN0ZWQgPSBbKCdzdGFydHRhZycsICdiJywgW10pLAorICAgICAgICAgICAgICAgICAgICAoJ2RhdGEnLCAnVGhpcycpLAorICAgICAgICAgICAgICAgICAgICAoJ2VuZHRhZycsICdiJyksCisgICAgICAgICAgICAgICAgICAgICgnZGF0YScsICciPiBjb25mdXNlcyB0aGUgcGFyc2VyJyldCisgICAgICAgIHNlbGYuX3J1bl9jaGVjayhodG1sLCBleHBlY3RlZCkKKwogICAgIGRlZiB0ZXN0X2dldF9zdGFydHRhZ190ZXh0KHNlbGYpOgogICAgICAgICBzID0gIiIiPGZvbzpiYXIgICBcbiAgIG9uZT0iMSJcdHR3bz0yICAgPiIiIgogICAgICAgICBzZWxmLl9ydW5fY2hlY2tfZXh0cmEocywgWwpAQCAtMzEzLDYgKzM5NCwxMiBAQAogICAgICAgICAgICAgKCJkYXRhIiwgIiYjYmFkOyIpLAogICAgICAgICAgICAgKCJlbmR0YWciLCAicCIpLAogICAgICAgICBdKQorICAgICAgICAjIGFkZCB0aGUgW10gYXMgYSB3b3JrYXJvdW5kIHRvIGF2b2lkIGJ1ZmZlcmluZyAoc2VlICMyMDI4OCkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiPGRpdj4mI2JhZDs8L2Rpdj4iXSwgWworICAgICAgICAgICAgKCJzdGFydHRhZyIsICJkaXYiLCBbXSksCisgICAgICAgICAgICAoImRhdGEiLCAiJiNiYWQ7IiksCisgICAgICAgICAgICAoImVuZHRhZyIsICJkaXYiKSwKKyAgICAgICAgXSkKIAogICAgIGRlZiB0ZXN0X3VuZXNjYXBlX2Z1bmN0aW9uKHNlbGYpOgogICAgICAgICBwYXJzZXIgPSBIVE1MUGFyc2VyLkhUTUxQYXJzZXIoKQpAQCAtNDQ5LDYgKzUzNiw4MSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBbKCJocmVmIiwgImh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvXCI+OyIpXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgKCJkYXRhIiwgInNwYW0iKSwgKCJlbmR0YWciLCAiYSIpXSkKIAorICAgIGRlZiB0ZXN0X2NvbW1lbnRzKHNlbGYpOgorICAgICAgICBodG1sID0gKCI8IS0tIEknbSBhIHZhbGlkIGNvbW1lbnQgLS0+IgorICAgICAgICAgICAgICAgICc8IS0tbWUgdG9vIS0tPicKKyAgICAgICAgICAgICAgICAnPCEtLS0tLS0+JworICAgICAgICAgICAgICAgICc8IS0tLS0+JworICAgICAgICAgICAgICAgICc8IS0tLS1JIGhhdmUgbWFueSBoeXBoZW5zLS0tLT4nCisgICAgICAgICAgICAgICAgJzwhLS0gSSBoYXZlIGEgPiBpbiB0aGUgbWlkZGxlIC0tPicKKyAgICAgICAgICAgICAgICAnPCEtLSBhbmQgSSBoYXZlIC0tIGluIHRoZSBtaWRkbGUhIC0tPicpCisgICAgICAgIGV4cGVjdGVkID0gWygnY29tbWVudCcsICIgSSdtIGEgdmFsaWQgY29tbWVudCAiKSwKKyAgICAgICAgICAgICAgICAgICAgKCdjb21tZW50JywgJ21lIHRvbyEnKSwKKyAgICAgICAgICAgICAgICAgICAgKCdjb21tZW50JywgJy0tJyksCisgICAgICAgICAgICAgICAgICAgICgnY29tbWVudCcsICcnKSwKKyAgICAgICAgICAgICAgICAgICAgKCdjb21tZW50JywgJy0tSSBoYXZlIG1hbnkgaHlwaGVucy0tJyksCisgICAgICAgICAgICAgICAgICAgICgnY29tbWVudCcsICcgSSBoYXZlIGEgPiBpbiB0aGUgbWlkZGxlICcpLAorICAgICAgICAgICAgICAgICAgICAoJ2NvbW1lbnQnLCAnIGFuZCBJIGhhdmUgLS0gaW4gdGhlIG1pZGRsZSEgJyldCisgICAgICAgIHNlbGYuX3J1bl9jaGVjayhodG1sLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2Jyb2tlbl9jb21tZW50cyhzZWxmKToKKyAgICAgICAgaHRtbCA9ICgnPCEgbm90IHJlYWxseSBhIGNvbW1lbnQgPicKKyAgICAgICAgICAgICAgICAnPCEgbm90IGEgY29tbWVudCBlaXRoZXIgLS0+JworICAgICAgICAgICAgICAgICc8ISAtLSBjbG9zZSBlbm91Z2ggLS0+JworICAgICAgICAgICAgICAgICc8IT48ITwtLSB0aGlzIHdhcyBhbiBlbXB0eSBjb21tZW50PicKKyAgICAgICAgICAgICAgICAnPCEhISBhbm90aGVyIGJvZ3VzIGNvbW1lbnQgISEhPicpCisgICAgICAgIGV4cGVjdGVkID0gWworICAgICAgICAgICAgKCdjb21tZW50JywgJyBub3QgcmVhbGx5IGEgY29tbWVudCAnKSwKKyAgICAgICAgICAgICgnY29tbWVudCcsICcgbm90IGEgY29tbWVudCBlaXRoZXIgLS0nKSwKKyAgICAgICAgICAgICgnY29tbWVudCcsICcgLS0gY2xvc2UgZW5vdWdoIC0tJyksCisgICAgICAgICAgICAoJ2NvbW1lbnQnLCAnJyksCisgICAgICAgICAgICAoJ2NvbW1lbnQnLCAnPC0tIHRoaXMgd2FzIGFuIGVtcHR5IGNvbW1lbnQnKSwKKyAgICAgICAgICAgICgnY29tbWVudCcsICchISBhbm90aGVyIGJvZ3VzIGNvbW1lbnQgISEhJyksCisgICAgICAgIF0KKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKGh0bWwsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfY29uZGNvbXMoc2VsZik6CisgICAgICAgIGh0bWwgPSAoJzwhLS1baWYgSUUgJiAhKGx0ZSBJRSA4KV0+YXJlblwndDwhW2VuZGlmXS0tPicKKyAgICAgICAgICAgICAgICAnPCEtLVtpZiBJRSA4XT5jb25kY29tczwhW2VuZGlmXS0tPicKKyAgICAgICAgICAgICAgICAnPCEtLVtpZiBsdGUgSUUgN10+cHJldHR5PzwhW2VuZGlmXS0tPicpCisgICAgICAgIGV4cGVjdGVkID0gWygnY29tbWVudCcsICJbaWYgSUUgJiAhKGx0ZSBJRSA4KV0+YXJlbid0PCFbZW5kaWZdIiksCisgICAgICAgICAgICAgICAgICAgICgnY29tbWVudCcsICdbaWYgSUUgOF0+Y29uZGNvbXM8IVtlbmRpZl0nKSwKKyAgICAgICAgICAgICAgICAgICAgKCdjb21tZW50JywgJ1tpZiBsdGUgSUUgN10+cHJldHR5PzwhW2VuZGlmXScpXQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soaHRtbCwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9icm9rZW5fY29uZGNvbXMoc2VsZik6CisgICAgICAgICMgdGhlc2UgY29uZGNvbXMgYXJlIG1pc3NpbmcgdGhlICctLScgYWZ0ZXIgJzwhJyBhbmQgYmVmb3JlIHRoZSAnPicKKyAgICAgICAgaHRtbCA9ICgnPCFbaWYgIShJRSldPmJyb2tlbiBjb25kY29tPCFbZW5kaWZdPicKKyAgICAgICAgICAgICAgICAnPCFbaWYgISBJRV0+PGxpbmsgaHJlZj0iZmF2aWNvbi50aWZmIi8+PCFbZW5kaWZdPicKKyAgICAgICAgICAgICAgICAnPCFbaWYgIUlFIDZdPjxpbWcgc3JjPSJmaXJlZm94LnBuZyIgLz48IVtlbmRpZl0+JworICAgICAgICAgICAgICAgICc8IVtpZiAhaWUgNl0+PGI+Zm9vPC9iPjwhW2VuZGlmXT4nCisgICAgICAgICAgICAgICAgJzwhW2lmICghSUUpfChsdCBJRSA5KV0+PGltZyBzcmM9Im1hbW1vdGguYm1wIiAvPjwhW2VuZGlmXT4nKQorICAgICAgICAjIEFjY29yZGluZyB0byB0aGUgSFRNTDUgc3BlY3Mgc2VjdGlvbnMgIjguMi40LjQ0IEJvZ3VzIGNvbW1lbnQgc3RhdGUiCisgICAgICAgICMgYW5kICI4LjIuNC40NSBNYXJrdXAgZGVjbGFyYXRpb24gb3BlbiBzdGF0ZSIsIGNvbW1lbnQgdG9rZW5zIHNob3VsZAorICAgICAgICAjIGJlIGVtaXR0ZWQgaW5zdGVhZCBvZiAndW5rbm93biBkZWNsJywgYnV0IGNhbGxpbmcgdW5rbm93bl9kZWNsCisgICAgICAgICMgcHJvdmlkZXMgbW9yZSBmbGV4aWJpbGl0eS4KKyAgICAgICAgIyBTZWUgYWxzbyBMaWIvX21hcmt1cGJhc2UucHk6cGFyc2VfZGVjbGFyYXRpb24KKyAgICAgICAgZXhwZWN0ZWQgPSBbCisgICAgICAgICAgICAoJ3Vua25vd24gZGVjbCcsICdpZiAhKElFKScpLAorICAgICAgICAgICAgKCdkYXRhJywgJ2Jyb2tlbiBjb25kY29tJyksCisgICAgICAgICAgICAoJ3Vua25vd24gZGVjbCcsICdlbmRpZicpLAorICAgICAgICAgICAgKCd1bmtub3duIGRlY2wnLCAnaWYgISBJRScpLAorICAgICAgICAgICAgKCdzdGFydGVuZHRhZycsICdsaW5rJywgWygnaHJlZicsICdmYXZpY29uLnRpZmYnKV0pLAorICAgICAgICAgICAgKCd1bmtub3duIGRlY2wnLCAnZW5kaWYnKSwKKyAgICAgICAgICAgICgndW5rbm93biBkZWNsJywgJ2lmICFJRSA2JyksCisgICAgICAgICAgICAoJ3N0YXJ0ZW5kdGFnJywgJ2ltZycsIFsoJ3NyYycsICdmaXJlZm94LnBuZycpXSksCisgICAgICAgICAgICAoJ3Vua25vd24gZGVjbCcsICdlbmRpZicpLAorICAgICAgICAgICAgKCd1bmtub3duIGRlY2wnLCAnaWYgIWllIDYnKSwKKyAgICAgICAgICAgICgnc3RhcnR0YWcnLCAnYicsIFtdKSwKKyAgICAgICAgICAgICgnZGF0YScsICdmb28nKSwKKyAgICAgICAgICAgICgnZW5kdGFnJywgJ2InKSwKKyAgICAgICAgICAgICgndW5rbm93biBkZWNsJywgJ2VuZGlmJyksCisgICAgICAgICAgICAoJ3Vua25vd24gZGVjbCcsICdpZiAoIUlFKXwobHQgSUUgOSknKSwKKyAgICAgICAgICAgICgnc3RhcnRlbmR0YWcnLCAnaW1nJywgWygnc3JjJywgJ21hbW1vdGguYm1wJyldKSwKKyAgICAgICAgICAgICgndW5rbm93biBkZWNsJywgJ2VuZGlmJykKKyAgICAgICAgXQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soaHRtbCwgZXhwZWN0ZWQpCisKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoSFRNTFBhcnNlclRlc3RDYXNlLCBBdHRyaWJ1dGVzVGVzdENhc2UpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2h0dHBsaWIucHkgYi9MaWIvdGVzdC90ZXN0X2h0dHBsaWIucHkKaW5kZXggMzhjMGQyZC4uNzI4MDBlNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9odHRwbGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaHR0cGxpYi5weQpAQCAtMTMsMTAgKzEzLDEyIEBACiBIT1NUID0gdGVzdF9zdXBwb3J0LkhPU1QKIAogY2xhc3MgRmFrZVNvY2tldDoKLSAgICBkZWYgX19pbml0X18oc2VsZiwgdGV4dCwgZmlsZWNsYXNzPVN0cmluZ0lPLlN0cmluZ0lPKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGV4dCwgZmlsZWNsYXNzPVN0cmluZ0lPLlN0cmluZ0lPLCBob3N0PU5vbmUsIHBvcnQ9Tm9uZSk6CiAgICAgICAgIHNlbGYudGV4dCA9IHRleHQKICAgICAgICAgc2VsZi5maWxlY2xhc3MgPSBmaWxlY2xhc3MKICAgICAgICAgc2VsZi5kYXRhID0gJycKKyAgICAgICAgc2VsZi5ob3N0ID0gaG9zdAorICAgICAgICBzZWxmLnBvcnQgPSBwb3J0CiAKICAgICBkZWYgc2VuZGFsbChzZWxmLCBkYXRhKToKICAgICAgICAgc2VsZi5kYXRhICs9ICcnLmpvaW4oZGF0YSkKQEAgLTI2LDYgKzI4LDkgQEAKICAgICAgICAgICAgIHJhaXNlIGh0dHBsaWIuVW5pbXBsZW1lbnRlZEZpbGVNb2RlKCkKICAgICAgICAgcmV0dXJuIHNlbGYuZmlsZWNsYXNzKHNlbGYudGV4dCkKIAorICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgcGFzcworCiBjbGFzcyBFUGlwZVNvY2tldChGYWtlU29ja2V0KToKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXh0LCBwaXBlX3RyaWdnZXIpOgpAQCAtOTAsMTIgKzk1LDQwIEBACiAgICAgICAgICAgICAgICAgY29ubi5yZXF1ZXN0KCdQT1NUJywgJy8nLCBib2R5LCBoZWFkZXJzKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29ubi5fYnVmZmVyLmNvdW50W2hlYWRlci5sb3dlcigpXSwgMSkKIAorICAgIGRlZiB0ZXN0X2NvbnRlbnRfbGVuZ3RoXzAoc2VsZik6CisKKyAgICAgICAgY2xhc3MgQ29udGVudExlbmd0aENoZWNrZXIobGlzdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgbGlzdC5fX2luaXRfXyhzZWxmKQorICAgICAgICAgICAgICAgIHNlbGYuY29udGVudF9sZW5ndGggPSBOb25lCisgICAgICAgICAgICBkZWYgYXBwZW5kKHNlbGYsIGl0ZW0pOgorICAgICAgICAgICAgICAgIGt2ID0gaXRlbS5zcGxpdCgnOicsIDEpCisgICAgICAgICAgICAgICAgaWYgbGVuKGt2KSA+IDEgYW5kIGt2WzBdLmxvd2VyKCkgPT0gJ2NvbnRlbnQtbGVuZ3RoJzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250ZW50X2xlbmd0aCA9IGt2WzFdLnN0cmlwKCkKKyAgICAgICAgICAgICAgICBsaXN0LmFwcGVuZChzZWxmLCBpdGVtKQorCisgICAgICAgICMgUE9TVCB3aXRoIGVtcHR5IGJvZHkKKyAgICAgICAgY29ubiA9IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24oJ2V4YW1wbGUuY29tJykKKyAgICAgICAgY29ubi5zb2NrID0gRmFrZVNvY2tldChOb25lKQorICAgICAgICBjb25uLl9idWZmZXIgPSBDb250ZW50TGVuZ3RoQ2hlY2tlcigpCisgICAgICAgIGNvbm4ucmVxdWVzdCgnUE9TVCcsICcvJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29ubi5fYnVmZmVyLmNvbnRlbnRfbGVuZ3RoLCAnMCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnSGVhZGVyIENvbnRlbnQtTGVuZ3RoIG5vdCBzZXQnKQorCisgICAgICAgICMgUFVUIHJlcXVlc3Qgd2l0aCBlbXB0eSBib2R5CisgICAgICAgIGNvbm4gPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKCdleGFtcGxlLmNvbScpCisgICAgICAgIGNvbm4uc29jayA9IEZha2VTb2NrZXQoTm9uZSkKKyAgICAgICAgY29ubi5fYnVmZmVyID0gQ29udGVudExlbmd0aENoZWNrZXIoKQorICAgICAgICBjb25uLnJlcXVlc3QoJ1BVVCcsICcvJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29ubi5fYnVmZmVyLmNvbnRlbnRfbGVuZ3RoLCAnMCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnSGVhZGVyIENvbnRlbnQtTGVuZ3RoIG5vdCBzZXQnKQorCiAgICAgZGVmIHRlc3RfcHV0aGVhZGVyKHNlbGYpOgogICAgICAgICBjb25uID0gaHR0cGxpYi5IVFRQQ29ubmVjdGlvbignZXhhbXBsZS5jb20nKQogICAgICAgICBjb25uLnNvY2sgPSBGYWtlU29ja2V0KE5vbmUpCiAgICAgICAgIGNvbm4ucHV0cmVxdWVzdCgnR0VUJywnLycpCiAgICAgICAgIGNvbm4ucHV0aGVhZGVyKCdDb250ZW50LWxlbmd0aCcsNDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnQ29udGVudC1sZW5ndGg6IDQyJyBpbiBjb25uLl9idWZmZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ0NvbnRlbnQtbGVuZ3RoOiA0MicsIGNvbm4uX2J1ZmZlcikKIAogICAgIGRlZiB0ZXN0X2lwdjZob3N0X2hlYWRlcihzZWxmKToKICAgICAgICAgIyBEZWZhdWx0IGhvc3QgaGVhZGVyIG9uIElQdjYgdHJhbnNhY3Rpb24gc2hvdWxkIHdyYXBwZWQgYnkgW10gaWYKQEAgLTEyNSw2ICsxNTgsOCBAQAogICAgICAgICBzb2NrID0gRmFrZVNvY2tldChib2R5KQogICAgICAgICByZXNwID0gaHR0cGxpYi5IVFRQUmVzcG9uc2Uoc29jaykKICAgICAgICAgcmVzcC5iZWdpbigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcC5yZWFkKDApLCAnJykgICMgSXNzdWUgIzIwMDA3CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVzcC5pc2Nsb3NlZCgpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3AucmVhZCgpLCAnVGV4dCcpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXNwLmlzY2xvc2VkKCkpCiAKQEAgLTEzOCw3ICsxNzMsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZXhjKSwgJycnQmFkU3RhdHVzTGluZSgiXCdcJyIsKScnJykKIAogICAgIGRlZiB0ZXN0X3BhcnRpYWxfcmVhZHMoc2VsZik6Ci0gICAgICAgICMgaWYgd2UgaGF2ZSBhIGxlbmdodCwgdGhlIHN5c3RlbSBrbm93cyB3aGVuIHRvIGNsb3NlIGl0c2VsZgorICAgICAgICAjIGlmIHdlIGhhdmUgYSBsZW5ndGgsIHRoZSBzeXN0ZW0ga25vd3Mgd2hlbiB0byBjbG9zZSBpdHNlbGYKICAgICAgICAgIyBzYW1lIGJlaGF2aW91ciB0aGFuIHdoZW4gd2UgcmVhZCB0aGUgd2hvbGUgdGhpbmcgd2l0aCByZWFkKCkKICAgICAgICAgYm9keSA9ICJIVFRQLzEuMSAyMDAgT2tcclxuQ29udGVudC1MZW5ndGg6IDRcclxuXHJcblRleHQiCiAgICAgICAgIHNvY2sgPSBGYWtlU29ja2V0KGJvZHkpCkBAIC0xNDksNiArMTg0LDMyIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcC5yZWFkKDIpLCAneHQnKQogICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzcC5pc2Nsb3NlZCgpKQogCisgICAgZGVmIHRlc3RfcGFydGlhbF9yZWFkc19ub19jb250ZW50X2xlbmd0aChzZWxmKToKKyAgICAgICAgIyB3aGVuIG5vIGxlbmd0aCBpcyBwcmVzZW50LCB0aGUgc29ja2V0IHNob3VsZCBiZSBncmFjZWZ1bGx5IGNsb3NlZCB3aGVuCisgICAgICAgICMgYWxsIGRhdGEgd2FzIHJlYWQKKyAgICAgICAgYm9keSA9ICJIVFRQLzEuMSAyMDAgT2tcclxuXHJcblRleHQiCisgICAgICAgIHNvY2sgPSBGYWtlU29ja2V0KGJvZHkpCisgICAgICAgIHJlc3AgPSBodHRwbGliLkhUVFBSZXNwb25zZShzb2NrKQorICAgICAgICByZXNwLmJlZ2luKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwLnJlYWQoMiksICdUZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVzcC5pc2Nsb3NlZCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3AucmVhZCgyKSwgJ3h0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwLnJlYWQoMSksICcnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzcC5pc2Nsb3NlZCgpKQorCisgICAgZGVmIHRlc3RfcGFydGlhbF9yZWFkc19pbmNvbXBsZXRlX2JvZHkoc2VsZik6CisgICAgICAgICMgaWYgdGhlIHNlcnZlciBzaHV0cyBkb3duIHRoZSBjb25uZWN0aW9uIGJlZm9yZSB0aGUgd2hvbGUKKyAgICAgICAgIyBjb250ZW50LWxlbmd0aCBpcyBkZWxpdmVyZWQsIHRoZSBzb2NrZXQgaXMgZ3JhY2VmdWxseSBjbG9zZWQKKyAgICAgICAgYm9keSA9ICJIVFRQLzEuMSAyMDAgT2tcclxuQ29udGVudC1MZW5ndGg6IDEwXHJcblxyXG5UZXh0IgorICAgICAgICBzb2NrID0gRmFrZVNvY2tldChib2R5KQorICAgICAgICByZXNwID0gaHR0cGxpYi5IVFRQUmVzcG9uc2Uoc29jaykKKyAgICAgICAgcmVzcC5iZWdpbigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcC5yZWFkKDIpLCAnVGUnKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJlc3AuaXNjbG9zZWQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwLnJlYWQoMiksICd4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcC5yZWFkKDEpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3AuaXNjbG9zZWQoKSkKKwogICAgIGRlZiB0ZXN0X2hvc3RfcG9ydChzZWxmKToKICAgICAgICAgIyBDaGVjayBpbnZhbGlkIGhvc3RfcG9ydAogCkBAIC0yNzksNyArMzQwLDcgQEAKICAgICAgICAgcmVzcCA9IGh0dHBsaWIuSFRUUFJlc3BvbnNlKHNvY2ssIG1ldGhvZD0iR0VUIikKICAgICAgICAgcmVzcC5iZWdpbigpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcC5yZWFkKCksICdIZWxsb1xyXG4nKQotICAgICAgICByZXNwLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3AuaXNjbG9zZWQoKSkKIAogICAgIGRlZiB0ZXN0X2luY29tcGxldGVfcmVhZChzZWxmKToKICAgICAgICAgc29jayA9IEZha2VTb2NrZXQoJ0hUVFAvMS4xIDIwMCBPS1xyXG5Db250ZW50LUxlbmd0aDogMTBcclxuXHJcbkhlbGxvXHJcbicpCkBAIC0yOTMsMTAgKzM1NCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmNvbXBsZXRlUmVhZCg3IGJ5dGVzIHJlYWQsIDMgbW9yZSBleHBlY3RlZCkiKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoaSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmNvbXBsZXRlUmVhZCg3IGJ5dGVzIHJlYWQsIDMgbW9yZSBleHBlY3RlZCkiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3AuaXNjbG9zZWQoKSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuZmFpbCgnSW5jb21wbGV0ZVJlYWQgZXhwZWN0ZWQnKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgcmVzcC5jbG9zZSgpCiAKICAgICBkZWYgdGVzdF9lcGlwZShzZWxmKToKICAgICAgICAgc29jayA9IEVQaXBlU29ja2V0KApAQCAtMzQ5LDYgKzQwOSwxNCBAQAogICAgICAgICByZXNwLmJlZ2luKCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoaHR0cGxpYi5MaW5lVG9vTG9uZywgcmVzcC5yZWFkKQogCisgICAgZGVmIHRlc3RfZWFybHlfZW9mKHNlbGYpOgorICAgICAgICAjIFRlc3QgaHR0cHJlc3BvbnNlIHdpdGggbm8gXHJcbiB0ZXJtaW5hdGlvbiwKKyAgICAgICAgYm9keSA9ICJIVFRQLzEuMSAyMDAgT2siCisgICAgICAgIHNvY2sgPSBGYWtlU29ja2V0KGJvZHkpCisgICAgICAgIHJlc3AgPSBodHRwbGliLkhUVFBSZXNwb25zZShzb2NrKQorICAgICAgICByZXNwLmJlZ2luKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwLnJlYWQoKSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXNwLmlzY2xvc2VkKCkpCiAKIGNsYXNzIE9mZmxpbmVUZXN0KFRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9yZXNwb25zZXMoc2VsZik6CkBAIC00MDMsNyArNDcxLDcgQEAKICAgICAgICAgSFRUUENvbm5lY3Rpb24gYW5kIGludG8gdGhlIHNvY2tldC4KICAgICAgICAgJycnCiAgICAgICAgICMgZGVmYXVsdCAtLSB1c2UgZ2xvYmFsIHNvY2tldCB0aW1lb3V0Ci0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSkKICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDMwKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBodHRwQ29ubiA9IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24oSE9TVCwgVGltZW91dFRlc3QuUE9SVCkKQEAgLTQxNCw3ICs0ODIsNyBAQAogICAgICAgICBodHRwQ29ubi5jbG9zZSgpCiAKICAgICAgICAgIyBubyB0aW1lb3V0IC0tIGRvIG5vdCB1c2UgZ2xvYmFsIHNvY2tldCBkZWZhdWx0Ci0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSkKICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDMwKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBodHRwQ29ubiA9IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24oSE9TVCwgVGltZW91dFRlc3QuUE9SVCwKQEAgLTQ2Myw5ICs1MzEsNDggQEAKICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIlBvcnQgaW5jb3JyZWN0bHkgcGFyc2VkOiAlcyAhPSAlcyIgJSAocCwgYy5ob3N0KSkKIAogCitjbGFzcyBUdW5uZWxUZXN0cyhUZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfY29ubmVjdChzZWxmKToKKyAgICAgICAgcmVzcG9uc2VfdGV4dCA9ICgKKyAgICAgICAgICAgICdIVFRQLzEuMCAyMDAgT0tcclxuXHJcbicgICAjIFJlcGx5IHRvIENPTk5FQ1QKKyAgICAgICAgICAgICdIVFRQLzEuMSAyMDAgT0tcclxuJyAgICAgICAjIFJlcGx5IHRvIEhFQUQKKyAgICAgICAgICAgICdDb250ZW50LUxlbmd0aDogNDJcclxuXHJcbicKKyAgICAgICAgKQorCisgICAgICAgIGRlZiBjcmVhdGVfY29ubmVjdGlvbihhZGRyZXNzLCB0aW1lb3V0PU5vbmUsIHNvdXJjZV9hZGRyZXNzPU5vbmUpOgorICAgICAgICAgICAgcmV0dXJuIEZha2VTb2NrZXQocmVzcG9uc2VfdGV4dCwgaG9zdD1hZGRyZXNzWzBdLCBwb3J0PWFkZHJlc3NbMV0pCisKKyAgICAgICAgY29ubiA9IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24oJ3Byb3h5LmNvbScpCisgICAgICAgIGNvbm4uX2NyZWF0ZV9jb25uZWN0aW9uID0gY3JlYXRlX2Nvbm5lY3Rpb24KKworICAgICAgICAjIE9uY2UgY29ubmVjdGVkLCB3ZSBzaG91bGQgbm90IGJlIGFibGUgdG8gdHVubmVsIGFueW1vcmUKKyAgICAgICAgY29ubi5jb25uZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBjb25uLnNldF90dW5uZWwsICdkZXN0aW5hdGlvbi5jb20nKQorCisgICAgICAgICMgQnV0IGlmIGNsb3NlIHRoZSBjb25uZWN0aW9uLCB3ZSBhcmUgZ29vZC4KKyAgICAgICAgY29ubi5jbG9zZSgpCisgICAgICAgIGNvbm4uc2V0X3R1bm5lbCgnZGVzdGluYXRpb24uY29tJykKKyAgICAgICAgY29ubi5yZXF1ZXN0KCdIRUFEJywgJy8nLCAnJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbm4uc29jay5ob3N0LCAncHJveHkuY29tJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb25uLnNvY2sucG9ydCwgODApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnQ09OTkVDVCBkZXN0aW5hdGlvbi5jb20nIGluIGNvbm4uc29jay5kYXRhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ0hvc3Q6IGRlc3RpbmF0aW9uLmNvbScgaW4gY29ubi5zb2NrLmRhdGEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdIb3N0OiBwcm94eS5jb20nIG5vdCBpbiBjb25uLnNvY2suZGF0YSkKKworICAgICAgICBjb25uLmNsb3NlKCkKKworICAgICAgICBjb25uLnJlcXVlc3QoJ1BVVCcsICcvJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29ubi5zb2NrLmhvc3QsICdwcm94eS5jb20nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbm4uc29jay5wb3J0LCA4MCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdDT05ORUNUIGRlc3RpbmF0aW9uLmNvbScgaW4gY29ubi5zb2NrLmRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnSG9zdDogZGVzdGluYXRpb24uY29tJyBpbiBjb25uLnNvY2suZGF0YSkKKworCiBkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChIZWFkZXJUZXN0cywgT2ZmbGluZVRlc3QsIEJhc2ljVGVzdCwgVGltZW91dFRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQU1RpbWVvdXRUZXN0LCBTb3VyY2VBZGRyZXNzVGVzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBTVGltZW91dFRlc3QsIFNvdXJjZUFkZHJlc3NUZXN0LCBUdW5uZWxUZXN0cykKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9odHRwc2VydmVycy5weSBiL0xpYi90ZXN0L3Rlc3RfaHR0cHNlcnZlcnMucHkKaW5kZXggOTdhYmRmNS4uZjc3NmIwNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9odHRwc2VydmVycy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2h0dHBzZXJ2ZXJzLnB5CkBAIC00LDExICs0LDYgQEAKIEpvc2lwIER6b2xvbmdhLCBhbmQgTWljaGFlbCBPdHRlbmVkZXIgZm9yIHRoZSAyMDA3LzA4IEdIT1AgY29udGVzdC4KICIiIgogCi1mcm9tIEJhc2VIVFRQU2VydmVyIGltcG9ydCBCYXNlSFRUUFJlcXVlc3RIYW5kbGVyLCBIVFRQU2VydmVyCi1mcm9tIFNpbXBsZUhUVFBTZXJ2ZXIgaW1wb3J0IFNpbXBsZUhUVFBSZXF1ZXN0SGFuZGxlcgotZnJvbSBDR0lIVFRQU2VydmVyIGltcG9ydCBDR0lIVFRQUmVxdWVzdEhhbmRsZXIKLWltcG9ydCBDR0lIVFRQU2VydmVyCi0KIGltcG9ydCBvcwogaW1wb3J0IHN5cwogaW1wb3J0IHJlCkBAIC0xNywxMiArMTIsMTcgQEAKIGltcG9ydCB1cmxsaWIKIGltcG9ydCBodHRwbGliCiBpbXBvcnQgdGVtcGZpbGUKLQogaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgQ0dJSFRUUFNlcnZlcgogCisKK2Zyb20gQmFzZUhUVFBTZXJ2ZXIgaW1wb3J0IEJhc2VIVFRQUmVxdWVzdEhhbmRsZXIsIEhUVFBTZXJ2ZXIKK2Zyb20gU2ltcGxlSFRUUFNlcnZlciBpbXBvcnQgU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyCitmcm9tIENHSUhUVFBTZXJ2ZXIgaW1wb3J0IENHSUhUVFBSZXF1ZXN0SGFuZGxlcgogZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KLQogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworCiB0aHJlYWRpbmcgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgndGhyZWFkaW5nJykKIAogCkBAIC00Myw3ICs0Myw3IEBACiAgICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQogICAgICAgICBzZWxmLndmaWxlLndyaXRlKGInPGh0bWw+PGJvZHk+RGF0YTwvYm9keT48L2h0bWw+XHJcbicpCiAKLSAgICBkZWYgbG9nX21lc3NhZ2Uoc2VsZiwgZm9ybWF0LCAqYXJncyk6CisgICAgZGVmIGxvZ19tZXNzYWdlKHNlbGYsIGZtdCwgKmFyZ3MpOgogICAgICAgICBwYXNzCiAKIApAQCAtOTcsOSArOTcsOSBAQAogICAgICAgICBzZWxmLmhhbmRsZXIgPSBTb2NrZXRsZXNzUmVxdWVzdEhhbmRsZXIoKQogCiAgICAgZGVmIHNlbmRfdHlwaWNhbF9yZXF1ZXN0KHNlbGYsIG1lc3NhZ2UpOgotICAgICAgICBpbnB1dCA9IFN0cmluZ0lPKG1lc3NhZ2UpCisgICAgICAgIGlucHV0X21zZyA9IFN0cmluZ0lPKG1lc3NhZ2UpCiAgICAgICAgIG91dHB1dCA9IFN0cmluZ0lPKCkKLSAgICAgICAgc2VsZi5oYW5kbGVyLnJmaWxlID0gaW5wdXQKKyAgICAgICAgc2VsZi5oYW5kbGVyLnJmaWxlID0gaW5wdXRfbXNnCiAgICAgICAgIHNlbGYuaGFuZGxlci53ZmlsZSA9IG91dHB1dAogICAgICAgICBzZWxmLmhhbmRsZXIuaGFuZGxlX29uZV9yZXF1ZXN0KCkKICAgICAgICAgb3V0cHV0LnNlZWsoMCkKQEAgLTExNCw3ICsxMTQsNyBAQAogCiAgICAgZGVmIHZlcmlmeV9odHRwX3NlcnZlcl9yZXNwb25zZShzZWxmLCByZXNwb25zZSk6CiAgICAgICAgIG1hdGNoID0gc2VsZi5IVFRQUmVzcG9uc2VNYXRjaC5zZWFyY2gocmVzcG9uc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRjaCBpcyBub3QgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUobWF0Y2gpCiAKICAgICBkZWYgdGVzdF9odHRwXzFfMShzZWxmKToKICAgICAgICAgcmVzdWx0ID0gc2VsZi5zZW5kX3R5cGljYWxfcmVxdWVzdCgnR0VUIC8gSFRUUC8xLjFcclxuXHJcbicpCkBAIC0xODksNyArMTg5LDcgQEAKIAogICAgIGRlZiB0ZXN0X3JlcXVlc3RfbGluZV90cmltbWluZyhzZWxmKToKICAgICAgICAgc2VsZi5jb24uX2h0dHBfdnNuX3N0ciA9ICdIVFRQLzEuMVxuJwotICAgICAgICBzZWxmLmNvbi5wdXRyZXF1ZXN0KCdHRVQnLCAnLycpCisgICAgICAgIHNlbGYuY29uLnB1dHJlcXVlc3QoJ1hZWkJPR1VTJywgJy8nKQogICAgICAgICBzZWxmLmNvbi5lbmRoZWFkZXJzKCkKICAgICAgICAgcmVzID0gc2VsZi5jb24uZ2V0cmVzcG9uc2UoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5zdGF0dXMsIDUwMSkKQEAgLTIxNiw4ICsyMTYsOSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5zdGF0dXMsIDUwMSkKIAogICAgIGRlZiB0ZXN0X3ZlcnNpb25fbm9uZShzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgYSB2YWxpZCBtZXRob2QgaXMgcmVqZWN0ZWQgd2hlbiBub3QgSFRUUC8xLngKICAgICAgICAgc2VsZi5jb24uX2h0dHBfdnNuX3N0ciA9ICcnCi0gICAgICAgIHNlbGYuY29uLnB1dHJlcXVlc3QoJ1BVVCcsICcvJykKKyAgICAgICAgc2VsZi5jb24ucHV0cmVxdWVzdCgnQ1VTVE9NJywgJy8nKQogICAgICAgICBzZWxmLmNvbi5lbmRoZWFkZXJzKCkKICAgICAgICAgcmVzID0gc2VsZi5jb24uZ2V0cmVzcG9uc2UoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5zdGF0dXMsIDQwMCkKQEAgLTI5Niw3ICsyOTcsNyBAQAogICAgICAgICAgICAgb3MuY2hkaXIoc2VsZi5jd2QpCiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLnRlbXBkaXIpCi0gICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBCYXNlVGVzdENhc2UudGVhckRvd24oc2VsZikKQEAgLTMxMyw2ICszMTQsOSBAQAogICAgICAgICAjY29uc3RydWN0cyB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIEhUVFBTZXJ2ZXIKICAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnJlcXVlc3Qoc2VsZi50ZW1wZGlyX25hbWUgKyAnL3Rlc3QnKQogICAgICAgICBzZWxmLmNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHJlc3BvbnNlLCAyMDAsIGRhdGE9c2VsZi5kYXRhKQorICAgICAgICAjIGNoZWNrIGZvciB0cmFpbGluZyAiLyIgd2hpY2ggc2hvdWxkIHJldHVybiA0MDQuIFNlZSBJc3N1ZTE3MzI0CisgICAgICAgIHJlc3BvbnNlID0gc2VsZi5yZXF1ZXN0KHNlbGYudGVtcGRpcl9uYW1lICsgJy90ZXN0LycpCisgICAgICAgIHNlbGYuY2hlY2tfc3RhdHVzX2FuZF9yZWFzb24ocmVzcG9uc2UsIDQwNCkKICAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnJlcXVlc3Qoc2VsZi50ZW1wZGlyX25hbWUgKyAnLycpCiAgICAgICAgIHNlbGYuY2hlY2tfc3RhdHVzX2FuZF9yZWFzb24ocmVzcG9uc2UsIDIwMCkKICAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnJlcXVlc3Qoc2VsZi50ZW1wZGlyX25hbWUpCkBAIC0zMjEsMTcgKzMyNSwxNiBAQAogICAgICAgICBzZWxmLmNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHJlc3BvbnNlLCA0MDQpCiAgICAgICAgIHJlc3BvbnNlID0gc2VsZi5yZXF1ZXN0KCcvJyArICdUaGlzRG9lc05vdEV4aXN0JyArICcvJykKICAgICAgICAgc2VsZi5jaGVja19zdGF0dXNfYW5kX3JlYXNvbihyZXNwb25zZSwgNDA0KQotICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4oc2VsZi50ZW1wZGlyX25hbWUsICdpbmRleC5odG1sJyksICd3JykKLSAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnJlcXVlc3QoJy8nICsgc2VsZi50ZW1wZGlyX25hbWUgKyAnLycpCi0gICAgICAgIHNlbGYuY2hlY2tfc3RhdHVzX2FuZF9yZWFzb24ocmVzcG9uc2UsIDIwMCkKLQotICAgICAgICAjIGNobW9kKCkgZG9lc24ndCB3b3JrIGFzIGV4cGVjdGVkIG9uIFdpbmRvd3MsIGFuZCBmaWxlc3lzdGVtCi0gICAgICAgICMgcGVybWlzc2lvbnMgYXJlIGlnbm9yZWQgYnkgcm9vdCBvbiBVbml4LgotICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCcgYW5kIG9zLmdldGV1aWQoKSAhPSAwOgotICAgICAgICAgICAgb3MuY2htb2Qoc2VsZi50ZW1wZGlyLCAwKQotICAgICAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnJlcXVlc3Qoc2VsZi50ZW1wZGlyX25hbWUgKyAnLycpCi0gICAgICAgICAgICBzZWxmLmNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHJlc3BvbnNlLCA0MDQpCi0gICAgICAgICAgICBvcy5jaG1vZChzZWxmLnRlbXBkaXIsIDA3NTUpCisgICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oc2VsZi50ZW1wZGlyX25hbWUsICdpbmRleC5odG1sJyksICd3JykgYXMgZnA6CisgICAgICAgICAgICByZXNwb25zZSA9IHNlbGYucmVxdWVzdCgnLycgKyBzZWxmLnRlbXBkaXJfbmFtZSArICcvJykKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfc3RhdHVzX2FuZF9yZWFzb24ocmVzcG9uc2UsIDIwMCkKKyAgICAgICAgICAgICMgY2htb2QoKSBkb2Vzbid0IHdvcmsgYXMgZXhwZWN0ZWQgb24gV2luZG93cywgYW5kIGZpbGVzeXN0ZW0KKyAgICAgICAgICAgICMgcGVybWlzc2lvbnMgYXJlIGlnbm9yZWQgYnkgcm9vdCBvbiBVbml4LgorICAgICAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnIGFuZCBvcy5nZXRldWlkKCkgIT0gMDoKKyAgICAgICAgICAgICAgICBvcy5jaG1vZChzZWxmLnRlbXBkaXIsIDApCisgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnJlcXVlc3Qoc2VsZi50ZW1wZGlyX25hbWUgKyAnLycpCisgICAgICAgICAgICAgICAgc2VsZi5jaGVja19zdGF0dXNfYW5kX3JlYXNvbihyZXNwb25zZSwgNDA0KQorICAgICAgICAgICAgICAgIG9zLmNobW9kKHNlbGYudGVtcGRpciwgMDc1NSkKIAogICAgIGRlZiB0ZXN0X2hlYWQoc2VsZik6CiAgICAgICAgIHJlc3BvbnNlID0gc2VsZi5yZXF1ZXN0KApAQCAtMzgzLDcgKzM4Niw5IEBACiAgICAgICAgIEJhc2VUZXN0Q2FzZS5zZXRVcChzZWxmKQogICAgICAgICBzZWxmLnBhcmVudF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgICAgICAgc2VsZi5jZ2lfZGlyID0gb3MucGF0aC5qb2luKHNlbGYucGFyZW50X2RpciwgJ2NnaS1iaW4nKQorICAgICAgICBzZWxmLmNnaV9jaGlsZF9kaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi5jZ2lfZGlyLCAnY2hpbGQtZGlyJykKICAgICAgICAgb3MubWtkaXIoc2VsZi5jZ2lfZGlyKQorICAgICAgICBvcy5ta2RpcihzZWxmLmNnaV9jaGlsZF9kaXIpCiAKICAgICAgICAgIyBUaGUgc2hlYmFuZyBsaW5lIHNob3VsZCBiZSBwdXJlIEFTQ0lJOiB1c2Ugc3ltbGluayBpZiBwb3NzaWJsZS4KICAgICAgICAgIyBTZWUgaXNzdWUgIzc2NjguCkBAIC0zOTMsNiArMzk4LDExIEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLnB5dGhvbmV4ZSA9IHN5cy5leGVjdXRhYmxlCiAKKyAgICAgICAgc2VsZi5ub2NnaV9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYucGFyZW50X2RpciwgJ25vY2dpLnB5JykKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYubm9jZ2lfcGF0aCwgJ3cnKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLndyaXRlKGNnaV9maWxlMSAlIHNlbGYucHl0aG9uZXhlKQorICAgICAgICBvcy5jaG1vZChzZWxmLm5vY2dpX3BhdGgsIDA3NzcpCisKICAgICAgICAgc2VsZi5maWxlMV9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYuY2dpX2RpciwgJ2ZpbGUxLnB5JykKICAgICAgICAgd2l0aCBvcGVuKHNlbGYuZmlsZTFfcGF0aCwgJ3cnKSBhcyBmaWxlMToKICAgICAgICAgICAgIGZpbGUxLndyaXRlKGNnaV9maWxlMSAlIHNlbGYucHl0aG9uZXhlKQpAQCAtNDAzLDYgKzQxMywxMSBAQAogICAgICAgICAgICAgZmlsZTIud3JpdGUoY2dpX2ZpbGUyICUgc2VsZi5weXRob25leGUpCiAgICAgICAgIG9zLmNobW9kKHNlbGYuZmlsZTJfcGF0aCwgMDc3NykKIAorICAgICAgICBzZWxmLmZpbGUzX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5jZ2lfY2hpbGRfZGlyLCAnZmlsZTMucHknKQorICAgICAgICB3aXRoIG9wZW4oc2VsZi5maWxlM19wYXRoLCAndycpIGFzIGZpbGUzOgorICAgICAgICAgICAgZmlsZTMud3JpdGUoY2dpX2ZpbGUxICUgc2VsZi5weXRob25leGUpCisgICAgICAgIG9zLmNobW9kKHNlbGYuZmlsZTNfcGF0aCwgMDc3NykKKwogICAgICAgICBzZWxmLmN3ZCA9IG9zLmdldGN3ZCgpCiAgICAgICAgIG9zLmNoZGlyKHNlbGYucGFyZW50X2RpcikKIApAQCAtNDExLDQ4ICs0MjYsNTQgQEAKICAgICAgICAgICAgIG9zLmNoZGlyKHNlbGYuY3dkKQogICAgICAgICAgICAgaWYgc2VsZi5weXRob25leGUgIT0gc3lzLmV4ZWN1dGFibGU6CiAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHNlbGYucHl0aG9uZXhlKQorICAgICAgICAgICAgb3MucmVtb3ZlKHNlbGYubm9jZ2lfcGF0aCkKICAgICAgICAgICAgIG9zLnJlbW92ZShzZWxmLmZpbGUxX3BhdGgpCiAgICAgICAgICAgICBvcy5yZW1vdmUoc2VsZi5maWxlMl9wYXRoKQorICAgICAgICAgICAgb3MucmVtb3ZlKHNlbGYuZmlsZTNfcGF0aCkKKyAgICAgICAgICAgIG9zLnJtZGlyKHNlbGYuY2dpX2NoaWxkX2RpcikKICAgICAgICAgICAgIG9zLnJtZGlyKHNlbGYuY2dpX2RpcikKICAgICAgICAgICAgIG9zLnJtZGlyKHNlbGYucGFyZW50X2RpcikKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIEJhc2VUZXN0Q2FzZS50ZWFyRG93bihzZWxmKQogCi0gICAgZGVmIHRlc3RfdXJsX2NvbGxhcHNlX3BhdGhfc3BsaXQoc2VsZik6CisgICAgZGVmIHRlc3RfdXJsX2NvbGxhcHNlX3BhdGgoc2VsZik6CisgICAgICAgICMgdmVyaWZ5IHRhaWwgaXMgdGhlIGxhc3QgcG9ydGlvbiBhbmQgaGVhZCBpcyB0aGUgcmVzdCBvbiBwcm9wZXIgdXJscwogICAgICAgICB0ZXN0X3ZlY3RvcnMgPSB7Ci0gICAgICAgICAgICAnJzogKCcvJywgJycpLAorICAgICAgICAgICAgJyc6ICcvLycsCiAgICAgICAgICAgICAnLi4nOiBJbmRleEVycm9yLAogICAgICAgICAgICAgJy8uLy8uLic6IEluZGV4RXJyb3IsCi0gICAgICAgICAgICAnLyc6ICgnLycsICcnKSwKLSAgICAgICAgICAgICcvLyc6ICgnLycsICcnKSwKLSAgICAgICAgICAgICcvXFwnOiAoJy8nLCAnXFwnKSwKLSAgICAgICAgICAgICcvLi8vJzogKCcvJywgJycpLAotICAgICAgICAgICAgJ2NnaS1iaW4vZmlsZTEucHknOiAoJy9jZ2ktYmluJywgJ2ZpbGUxLnB5JyksCi0gICAgICAgICAgICAnL2NnaS1iaW4vZmlsZTEucHknOiAoJy9jZ2ktYmluJywgJ2ZpbGUxLnB5JyksCi0gICAgICAgICAgICAnYSc6ICgnLycsICdhJyksCi0gICAgICAgICAgICAnL2EnOiAoJy8nLCAnYScpLAotICAgICAgICAgICAgJy8vYSc6ICgnLycsICdhJyksCi0gICAgICAgICAgICAnLi9hJzogKCcvJywgJ2EnKSwKLSAgICAgICAgICAgICcuL0M6Lyc6ICgnL0M6JywgJycpLAotICAgICAgICAgICAgJy9hL2InOiAoJy9hJywgJ2InKSwKLSAgICAgICAgICAgICcvYS9iLyc6ICgnL2EvYicsICcnKSwKLSAgICAgICAgICAgICcvYS9iL2MvLi4nOiAoJy9hL2InLCAnJyksCi0gICAgICAgICAgICAnL2EvYi9jLy4uL2QnOiAoJy9hL2InLCAnZCcpLAotICAgICAgICAgICAgJy9hL2IvYy8uLi9kL2UvLi4vZic6ICgnL2EvYi9kJywgJ2YnKSwKLSAgICAgICAgICAgICcvYS9iL2MvLi4vZC9lLy4uLy4uL2YnOiAoJy9hL2InLCAnZicpLAotICAgICAgICAgICAgJy9hL2IvYy8uLi9kL2UvLi4vLi8uLy4vLi4vL2YnOiAoJy9hL2InLCAnZicpLAorICAgICAgICAgICAgJy8nOiAnLy8nLAorICAgICAgICAgICAgJy8vJzogJy8vJywKKyAgICAgICAgICAgICcvXFwnOiAnLy9cXCcsCisgICAgICAgICAgICAnLy4vLyc6ICcvLycsCisgICAgICAgICAgICAnY2dpLWJpbi9maWxlMS5weSc6ICcvY2dpLWJpbi9maWxlMS5weScsCisgICAgICAgICAgICAnL2NnaS1iaW4vZmlsZTEucHknOiAnL2NnaS1iaW4vZmlsZTEucHknLAorICAgICAgICAgICAgJ2EnOiAnLy9hJywKKyAgICAgICAgICAgICcvYSc6ICcvL2EnLAorICAgICAgICAgICAgJy8vYSc6ICcvL2EnLAorICAgICAgICAgICAgJy4vYSc6ICcvL2EnLAorICAgICAgICAgICAgJy4vQzovJzogJy9DOi8nLAorICAgICAgICAgICAgJy9hL2InOiAnL2EvYicsCisgICAgICAgICAgICAnL2EvYi8nOiAnL2EvYi8nLAorICAgICAgICAgICAgJy9hL2IvLic6ICcvYS9iLycsCisgICAgICAgICAgICAnL2EvYi9jLy4uJzogJy9hL2IvJywKKyAgICAgICAgICAgICcvYS9iL2MvLi4vZCc6ICcvYS9iL2QnLAorICAgICAgICAgICAgJy9hL2IvYy8uLi9kL2UvLi4vZic6ICcvYS9iL2QvZicsCisgICAgICAgICAgICAnL2EvYi9jLy4uL2QvZS8uLi8uLi9mJzogJy9hL2IvZicsCisgICAgICAgICAgICAnL2EvYi9jLy4uL2QvZS8uLi8uLy4vLi8uLi8vZic6ICcvYS9iL2YnLAogICAgICAgICAgICAgJy4uL2EvYi9jLy4uL2QvZS8uLi8uLy4vLi8uLi8vZic6IEluZGV4RXJyb3IsCi0gICAgICAgICAgICAnL2EvYi9jLy4uL2QvZS8uLi8uLi8uLi9mJzogKCcvYScsICdmJyksCi0gICAgICAgICAgICAnL2EvYi9jLy4uL2QvZS8uLi8uLi8uLi8uLi9mJzogKCcvJywgJ2YnKSwKKyAgICAgICAgICAgICcvYS9iL2MvLi4vZC9lLy4uLy4uLy4uL2YnOiAnL2EvZicsCisgICAgICAgICAgICAnL2EvYi9jLy4uL2QvZS8uLi8uLi8uLi8uLi9mJzogJy8vZicsCiAgICAgICAgICAgICAnL2EvYi9jLy4uL2QvZS8uLi8uLi8uLi8uLi8uLi9mJzogSW5kZXhFcnJvciwKLSAgICAgICAgICAgICcvYS9iL2MvLi4vZC9lLy4uLy4uLy4uLy4uL2YvLi4nOiAoJy8nLCAnJyksCisgICAgICAgICAgICAnL2EvYi9jLy4uL2QvZS8uLi8uLi8uLi8uLi9mLy4uJzogJy8vJywKKyAgICAgICAgICAgICcvYS9iL2MvLi4vZC9lLy4uLy4uLy4uLy4uL2YvLi4vLic6ICcvLycsCiAgICAgICAgIH0KICAgICAgICAgZm9yIHBhdGgsIGV4cGVjdGVkIGluIHRlc3RfdmVjdG9ycy5pdGVyaXRlbXMoKToKICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXhwZWN0ZWQsIHR5cGUpIGFuZCBpc3N1YmNsYXNzKGV4cGVjdGVkLCBFeGNlcHRpb24pOgogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGV4cGVjdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENHSUhUVFBTZXJ2ZXIuX3VybF9jb2xsYXBzZV9wYXRoX3NwbGl0LCBwYXRoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENHSUhUVFBTZXJ2ZXIuX3VybF9jb2xsYXBzZV9wYXRoLCBwYXRoKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBhY3R1YWwgPSBDR0lIVFRQU2VydmVyLl91cmxfY29sbGFwc2VfcGF0aF9zcGxpdChwYXRoKQorICAgICAgICAgICAgICAgIGFjdHVhbCA9IENHSUhUVFBTZXJ2ZXIuX3VybF9jb2xsYXBzZV9wYXRoKHBhdGgpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgYWN0dWFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSdwYXRoID0gJXJcbkdvdDogICAgJXJcbldhbnRlZDogJXInICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXRoLCBhY3R1YWwsIGV4cGVjdGVkKSkKQEAgLTQ2Miw2ICs0ODMsMTAgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoJ0hlbGxvIFdvcmxkXG4nLCAndGV4dC9odG1sJywgMjAwKSwKICAgICAgICAgICAgIChyZXMucmVhZCgpLCByZXMuZ2V0aGVhZGVyKCdDb250ZW50LXR5cGUnKSwgcmVzLnN0YXR1cykpCiAKKyAgICBkZWYgdGVzdF9pc3N1ZTE5NDM1KHNlbGYpOgorICAgICAgICByZXMgPSBzZWxmLnJlcXVlc3QoJy8vLy8vLy8vLy8vbm9jZ2kucHkvLi4vY2dpLWJpbi9ub3RoZXJlLnNoJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuc3RhdHVzLCA0MDQpCisKICAgICBkZWYgdGVzdF9wb3N0KHNlbGYpOgogICAgICAgICBwYXJhbXMgPSB1cmxsaWIudXJsZW5jb2RlKHsnc3BhbScgOiAxLCAnZWdncycgOiAncHl0aG9uJywgJ2JhY29uJyA6IDEyMzQ1Nn0pCiAgICAgICAgIGhlYWRlcnMgPSB7J0NvbnRlbnQtdHlwZScgOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ30KQEAgLTQ5NSw2ICs1MjAsMTYgQEAKICAgICAgICAgICAgICAgICAocmVzLnJlYWQoKSwgcmVzLmdldGhlYWRlcignQ29udGVudC10eXBlJyksIHJlcy5zdGF0dXMpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLmVudmlyb25bJ1NFUlZFUl9TT0ZUV0FSRSddLCBzaWduYXR1cmUpCiAKKyAgICBkZWYgdGVzdF91cmxxdW90ZV9kZWNvZGluZ19pbl9jZ2lfY2hlY2soc2VsZik6CisgICAgICAgIHJlcyA9IHNlbGYucmVxdWVzdCgnL2NnaS1iaW4lMmZmaWxlMS5weScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGInSGVsbG8gV29ybGRcbicsICd0ZXh0L2h0bWwnLCAyMDApLAorICAgICAgICAgICAgICAgIChyZXMucmVhZCgpLCByZXMuZ2V0aGVhZGVyKCdDb250ZW50LXR5cGUnKSwgcmVzLnN0YXR1cykpCisKKyAgICBkZWYgdGVzdF9uZXN0ZWRfY2dpX3BhdGhfaXNzdWUyMTMyMyhzZWxmKToKKyAgICAgICAgcmVzID0gc2VsZi5yZXF1ZXN0KCcvY2dpLWJpbi9jaGlsZC1kaXIvZmlsZTMucHknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChiJ0hlbGxvIFdvcmxkXG4nLCAndGV4dC9odG1sJywgMjAwKSwKKyAgICAgICAgICAgICAgICAocmVzLnJlYWQoKSwgcmVzLmdldGhlYWRlcignQ29udGVudC10eXBlJyksIHJlcy5zdGF0dXMpKQorCiAKIGNsYXNzIFNpbXBsZUhUVFBSZXF1ZXN0SGFuZGxlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAiIiIgVGVzdCB1cmwgcGFyc2luZyAiIiIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaWRsZS5weSBiL0xpYi90ZXN0L3Rlc3RfaWRsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmQzOGZlCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9pZGxlLnB5CkBAIC0wLDAgKzEsMjAgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQgYXMgc3VwcG9ydAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgaW1wb3J0X21vZHVsZQorCisjIFNraXAgdGVzdCBpZiBfdGhyZWFkIG9yIF90a2ludGVyIHdhc24ndCBidWlsdCBvciBpZGxlbGliIHdhcyBkZWxldGVkLgoraW1wb3J0X21vZHVsZSgndGhyZWFkaW5nJykgICMgaW1wb3J0ZWQgYnkgaWRsZWxpYi5QeVNoZWxsLCBpbXBvcnRzIF90aHJlYWQKK3RrID0gaW1wb3J0X21vZHVsZSgnVGtpbnRlcicpICAjIGltcG9ydHMgX3RraW50ZXIKK2lkbGV0ZXN0ID0gaW1wb3J0X21vZHVsZSgnaWRsZWxpYi5pZGxlX3Rlc3QnKQorCisjIFdpdGhvdXQgdGVzdF9tYWluIHByZXNlbnQsIHJlZ3J0ZXN0LnJ1bnRlc3RfaW5uZXIgKGxpbmUxMjE5KSBjYWxscworIyB1bml0dGVzdC5UZXN0TG9hZGVyKCkubG9hZFRlc3RzRnJvbU1vZHVsZSh0aGlzX21vZHVsZSkgd2hpY2ggY2FsbHMKKyMgbG9hZF90ZXN0cygpIGlmIGl0IGZpbmRzIGl0LiAoVW5pdHRlc3QubWFpbiBkb2VzIHRoZSBzYW1lLikKK2xvYWRfdGVzdHMgPSBpZGxldGVzdC5sb2FkX3Rlc3RzCisKKyMgcHJlLTMuMyByZWdydGVzdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBsb2FkX3Rlc3RzIHByb3RvY29sLiB1c2UgdGVzdF9tYWluCitkZWYgdGVzdF9tYWluKCk6CisgICAgc3VwcG9ydC5ydW5fdW5pdHRlc3QodW5pdHRlc3QuVGVzdExvYWRlcigpLmxvYWRUZXN0c0Zyb21Nb2R1bGUoaWRsZXRlc3QpKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltYWdlb3AucHkgYi9MaWIvdGVzdC90ZXN0X2ltYWdlb3AucHkKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA1NjMyMGZiLi4zMWVkYmQxCi0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1hZ2VvcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltYWdlb3AucHkKQEAgLTEsNSArMSwzIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCi0KICIiIlRlc3Qgc2NyaXB0IGZvciB0aGUgaW1hZ2VvcCBtb2R1bGUuICBUaGlzIGhhcyB0aGUgc2lkZQogICAgZWZmZWN0IG9mIHBhcnRpYWxseSB0ZXN0aW5nIHRoZSBpbWdmaWxlIG1vZHVsZSBhcyB3ZWxsLgogICAgUm9nZXIgRS4gTWFzc2UKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1hcGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfaW1hcGxpYi5weQppbmRleCAxNWIwZWEwLi40MDViN2VhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltYXBsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbWFwbGliLnB5CkBAIC03OSw3ICs3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgICAgICAgbGluZSArPSBwYXJ0CiAgICAgICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgICMgLi5idXQgU1NMU29ja2V0cyB0aHJvdyBleGNlcHRpb25zLgorICAgICAgICAgICAgICAgICAgICAjIC4uYnV0IFNTTFNvY2tldHMgcmFpc2UgZXhjZXB0aW9ucy4KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICAgaWYgbGluZS5lbmRzd2l0aCgnXHJcbicpOgogICAgICAgICAgICAgICAgICAgICBicmVhawpAQCAtMTY1LDYgKzE2NSwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbWFwX2NsYXNzLCAqc2VydmVyLnNlcnZlcl9hZGRyZXNzKQogCiAKKyAgICBkZWYgdGVzdF9saW5ldG9vbG9uZyhzZWxmKToKKyAgICAgICAgY2xhc3MgVG9vTG9uZ0hhbmRsZXIoU2ltcGxlSU1BUEhhbmRsZXIpOgorICAgICAgICAgICAgZGVmIGhhbmRsZShzZWxmKToKKyAgICAgICAgICAgICAgICAjIFNlbmQgYSB2ZXJ5IGxvbmcgcmVzcG9uc2UgbGluZQorICAgICAgICAgICAgICAgIHNlbGYud2ZpbGUud3JpdGUoJyogT0sgJyArIGltYXBsaWIuX01BWExJTkUqJ3gnICsgJ1xyXG4nKQorCisgICAgICAgIHdpdGggc2VsZi5yZWFwZWRfc2VydmVyKFRvb0xvbmdIYW5kbGVyKSBhcyBzZXJ2ZXI6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhpbWFwbGliLklNQVA0LmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbWFwX2NsYXNzLCAqc2VydmVyLnNlcnZlcl9hZGRyZXNzKQorCiBjbGFzcyBUaHJlYWRlZE5ldHdvcmtlZFRlc3RzKEJhc2VUaHJlYWRlZE5ldHdvcmtlZFRlc3RzKToKIAogICAgIHNlcnZlcl9jbGFzcyA9IFNvY2tldFNlcnZlci5UQ1BTZXJ2ZXIKQEAgLTE3Nyw2ICsxODcsOSBAQAogICAgIHNlcnZlcl9jbGFzcyA9IFNlY3VyZVRDUFNlcnZlcgogICAgIGltYXBfY2xhc3MgPSBJTUFQNF9TU0wKIAorICAgIGRlZiB0ZXN0X2xpbmV0b29sb25nKHNlbGYpOgorICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgidGVzdCBpcyBub3QgcmVsaWFibGUgb24gMi43OyBzZWUgaXNzdWUgMjAxMTgiKQorCiAKIGNsYXNzIFJlbW90ZUlNQVBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBob3N0ID0gJ2N5cnVzLmFuZHJldy5jbXUuZWR1JwpAQCAtMjM2LDUgKzI0OSw0IEBACiAKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICBzdXBwb3J0LnVzZV9yZXNvdXJjZXMgPSBbJ25ldHdvcmsnXQogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltZ2ZpbGUucHkgYi9MaWIvdGVzdC90ZXN0X2ltZ2ZpbGUucHkKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAzOWU4OTE3Li42N2EyMzE1Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1nZmlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltZ2ZpbGUucHkKQEAgLTEsNSArMSwzIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCi0KICIiIlNpbXBsZSB0ZXN0IHNjcmlwdCBmb3IgaW1nZmlsZS5jCiAgICBSb2dlciBFLiBNYXNzZQogIiIiCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltZ2hkci5weSBiL0xpYi90ZXN0L3Rlc3RfaW1naGRyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMDZkOWIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC90ZXN0X2ltZ2hkci5weQpAQCAtMCwwICsxLDEyMCBAQAoraW1wb3J0IGltZ2hkcgoraW1wb3J0IGlvCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IGZpbmRmaWxlLCBURVNURk4sIHVubGluaywgcnVuX3VuaXR0ZXN0CisKK1RFU1RfRklMRVMgPSAoCisgICAgKCdweXRob24ucG5nJywgJ3BuZycpLAorICAgICgncHl0aG9uLmdpZicsICdnaWYnKSwKKyAgICAoJ3B5dGhvbi5ibXAnLCAnYm1wJyksCisgICAgKCdweXRob24ucHBtJywgJ3BwbScpLAorICAgICgncHl0aG9uLnBnbScsICdwZ20nKSwKKyAgICAoJ3B5dGhvbi5wYm0nLCAncGJtJyksCisgICAgKCdweXRob24uanBnJywgJ2pwZWcnKSwKKyAgICAoJ3B5dGhvbi5yYXMnLCAncmFzdCcpLAorICAgICgncHl0aG9uLnNnaScsICdyZ2InKSwKKyAgICAoJ3B5dGhvbi50aWZmJywgJ3RpZmYnKSwKKyAgICAoJ3B5dGhvbi54Ym0nLCAneGJtJykKKykKKworY2xhc3MgVW5zZWVrYWJsZUlPKGlvLkZpbGVJTyk6CisgICAgZGVmIHRlbGwoc2VsZik6CisgICAgICAgIHJhaXNlIGlvLlVuc3VwcG9ydGVkT3BlcmF0aW9uCisKKyAgICBkZWYgc2VlayhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByYWlzZSBpby5VbnN1cHBvcnRlZE9wZXJhdGlvbgorCitjbGFzcyBUZXN0SW1naGRyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICBjbHMudGVzdGZpbGUgPSBmaW5kZmlsZSgncHl0aG9uLnBuZycsIHN1YmRpcj0naW1naGRyZGF0YScpCisgICAgICAgIHdpdGggb3BlbihjbHMudGVzdGZpbGUsICdyYicpIGFzIHN0cmVhbToKKyAgICAgICAgICAgIGNscy50ZXN0ZGF0YSA9IHN0cmVhbS5yZWFkKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdW5saW5rKFRFU1RGTikKKworICAgIGRlZiB0ZXN0X2RhdGEoc2VsZik6CisgICAgICAgIGZvciBmaWxlbmFtZSwgZXhwZWN0ZWQgaW4gVEVTVF9GSUxFUzoKKyAgICAgICAgICAgIGZpbGVuYW1lID0gZmluZGZpbGUoZmlsZW5hbWUsIHN1YmRpcj0naW1naGRyZGF0YScpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltZ2hkci53aGF0KGZpbGVuYW1lKSwgZXhwZWN0ZWQpCisgICAgICAgICAgICB1ZmlsZW5hbWUgPSBmaWxlbmFtZS5kZWNvZGUoc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWdoZHIud2hhdCh1ZmlsZW5hbWUpLCBleHBlY3RlZCkKKyAgICAgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3JiJykgYXMgc3RyZWFtOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1naGRyLndoYXQoc3RyZWFtKSwgZXhwZWN0ZWQpCisgICAgICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICdyYicpIGFzIHN0cmVhbToKKyAgICAgICAgICAgICAgICBkYXRhID0gc3RyZWFtLnJlYWQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWdoZHIud2hhdChOb25lLCBkYXRhKSwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9yZWdpc3Rlcl90ZXN0KHNlbGYpOgorICAgICAgICBkZWYgdGVzdF9qdW1ibyhoLCBmaWxlKToKKyAgICAgICAgICAgIGlmIGguc3RhcnRzd2l0aChiJ2VnZ3MnKToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ2hhbScKKyAgICAgICAgaW1naGRyLnRlc3RzLmFwcGVuZCh0ZXN0X2p1bWJvKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoaW1naGRyLnRlc3RzLnBvcCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWdoZHIud2hhdChOb25lLCBiJ2VnZ3MnKSwgJ2hhbScpCisKKyAgICBkZWYgdGVzdF9maWxlX3BvcyhzZWxmKToKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgJ3diJykgYXMgc3RyZWFtOgorICAgICAgICAgICAgc3RyZWFtLndyaXRlKGInYWJhYmFnYWxhbWFnYScpCisgICAgICAgICAgICBwb3MgPSBzdHJlYW0udGVsbCgpCisgICAgICAgICAgICBzdHJlYW0ud3JpdGUoc2VsZi50ZXN0ZGF0YSkKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgJ3JiJykgYXMgc3RyZWFtOgorICAgICAgICAgICAgc3RyZWFtLnNlZWsocG9zKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbWdoZHIud2hhdChzdHJlYW0pLCAncG5nJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyZWFtLnRlbGwoKSwgcG9zKQorCisgICAgZGVmIHRlc3RfYmFkX2FyZ3Moc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIGltZ2hkci53aGF0KCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgICAgICBpbWdoZHIud2hhdChOb25lKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBpbWdoZHIud2hhdChzZWxmLnRlc3RmaWxlLCAxKQorICAgICAgICB3aXRoIG9wZW4oc2VsZi50ZXN0ZmlsZSwgJ3JiJykgYXMgZjoKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IpOgorICAgICAgICAgICAgICAgIGltZ2hkci53aGF0KGYuZmlsZW5vKCkpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX2hlYWRlcnMoc2VsZik6CisgICAgICAgIGZvciBoZWFkZXIgaW4gKGInXDIxMVBOXHJcbicsCisgICAgICAgICAgICAgICAgICAgICAgIGInXDAwMVwzMzEnLAorICAgICAgICAgICAgICAgICAgICAgICBiJ1x4NTlceEE2JywKKyAgICAgICAgICAgICAgICAgICAgICAgYidjdXRlY2F0JywKKyAgICAgICAgICAgICAgICAgICAgICAgYicwMDAwMDBKRkknLAorICAgICAgICAgICAgICAgICAgICAgICBiJ0dJRjgwJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShpbWdoZHIud2hhdChOb25lLCBoZWFkZXIpKQorCisgICAgZGVmIHRlc3RfbWlzc2luZ19maWxlKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IpOgorICAgICAgICAgICAgaW1naGRyLndoYXQoJ21pc3NpbmcnKQorCisgICAgZGVmIHRlc3RfY2xvc2VkX2ZpbGUoc2VsZik6CisgICAgICAgIHN0cmVhbSA9IG9wZW4oc2VsZi50ZXN0ZmlsZSwgJ3JiJykKKyAgICAgICAgc3RyZWFtLmNsb3NlKCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKSBhcyBjbToKKyAgICAgICAgICAgIGltZ2hkci53aGF0KHN0cmVhbSkKKyAgICAgICAgc3RyZWFtID0gaW8uQnl0ZXNJTyhzZWxmLnRlc3RkYXRhKQorICAgICAgICBzdHJlYW0uY2xvc2UoKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpIGFzIGNtOgorICAgICAgICAgICAgaW1naGRyLndoYXQoc3RyZWFtKQorCisgICAgZGVmIHRlc3RfdW5zZWVrYWJsZShzZWxmKToKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgJ3diJykgYXMgc3RyZWFtOgorICAgICAgICAgICAgc3RyZWFtLndyaXRlKHNlbGYudGVzdGRhdGEpCisgICAgICAgIHdpdGggVW5zZWVrYWJsZUlPKFRFU1RGTiwgJ3JiJykgYXMgc3RyZWFtOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhpby5VbnN1cHBvcnRlZE9wZXJhdGlvbik6CisgICAgICAgICAgICAgICAgaW1naGRyLndoYXQoc3RyZWFtKQorCisgICAgZGVmIHRlc3Rfb3V0cHV0X3N0cmVhbShzZWxmKToKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgJ3diJykgYXMgc3RyZWFtOgorICAgICAgICAgICAgc3RyZWFtLndyaXRlKHNlbGYudGVzdGRhdGEpCisgICAgICAgICAgICBzdHJlYW0uc2VlaygwKQorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yKSBhcyBjbToKKyAgICAgICAgICAgICAgICBpbWdoZHIud2hhdChzdHJlYW0pCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoVGVzdEltZ2hkcikKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXAucHkgYi9MaWIvdGVzdC90ZXN0X2ltcC5weQppbmRleCA3N2U0NGJlLi4xYmRjNDdhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcC5weQpAQCAtMiw3ICsyLDEyIEBACiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiAKK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgdGhyZWFkID0gTm9uZQogCitAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWQsICd0aHJlYWRpbmcgbm90IGF2YWlsYWJsZScpCiBjbGFzcyBMb2NrVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgIiIiVmVyeSBiYXNpYyB0ZXN0IG9mIGltcG9ydCBsb2NrIGZ1bmN0aW9ucy4iIiIKQEAgLTY4LDEzICs3Myw4IEBACiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdHMgPSBbCiAgICAgICAgIFJlbG9hZFRlc3RzLAorICAgICAgICBMb2NrVGVzdHMsCiAgICAgXQotICAgIHRyeToKLSAgICAgICAgaW1wb3J0IHRocmVhZAotICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgcGFzcwotICAgIGVsc2U6Ci0gICAgICAgIHRlc3RzLmFwcGVuZChMb2NrVGVzdHMpCiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdHMpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydC5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0LnB5CmluZGV4IGZjM2QwMDEuLmMxN2RhMTAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0LnB5CkBAIC0xLDIyICsxLDM4IEBACitpbXBvcnQgZXJybm8KIGltcG9ydCBpbXAKIGltcG9ydCBtYXJzaGFsCiBpbXBvcnQgb3MKIGltcG9ydCBweV9jb21waWxlCiBpbXBvcnQgcmFuZG9tCiBpbXBvcnQgc3RhdAoraW1wb3J0IHN0cnVjdAogaW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgdGV4dHdyYXAKK2ltcG9ydCBzaHV0aWwKKwogZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgKHVubGluaywgVEVTVEZOLCB1bmxvYWQsIHJ1bl91bml0dGVzdCwgcm10cmVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2p5dGhvbiwgY2hlY2tfd2FybmluZ3MsIEVudmlyb25tZW50VmFyR3VhcmQpCi1pbXBvcnQgdGV4dHdyYXAKK2Zyb20gdGVzdCBpbXBvcnQgc3ltbGlua19zdXBwb3J0CiBmcm9tIHRlc3QgaW1wb3J0IHNjcmlwdF9oZWxwZXIKIAorZGVmIF9maWxlcyhuYW1lKToKKyAgICByZXR1cm4gKG5hbWUgKyBvcy5leHRzZXAgKyAicHkiLAorICAgICAgICAgICAgbmFtZSArIG9zLmV4dHNlcCArICJweWMiLAorICAgICAgICAgICAgbmFtZSArIG9zLmV4dHNlcCArICJweW8iLAorICAgICAgICAgICAgbmFtZSArIG9zLmV4dHNlcCArICJweXciLAorICAgICAgICAgICAgbmFtZSArICIkcHkuY2xhc3MiKQorCitkZWYgY2htb2RfZmlsZXMobmFtZSk6CisgICAgZm9yIGYgaW4gX2ZpbGVzKG5hbWUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5jaG1vZChmLCAwNjAwKQorICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBleGM6CisgICAgICAgICAgICBpZiBleGMuZXJybm8gIT0gZXJybm8uRU5PRU5UOgorICAgICAgICAgICAgICAgIHJhaXNlCisKIGRlZiByZW1vdmVfZmlsZXMobmFtZSk6Ci0gICAgZm9yIGYgaW4gKG5hbWUgKyBvcy5leHRzZXAgKyAicHkiLAotICAgICAgICAgICAgICBuYW1lICsgb3MuZXh0c2VwICsgInB5YyIsCi0gICAgICAgICAgICAgIG5hbWUgKyBvcy5leHRzZXAgKyAicHlvIiwKLSAgICAgICAgICAgICAgbmFtZSArIG9zLmV4dHNlcCArICJweXciLAotICAgICAgICAgICAgICBuYW1lICsgIiRweS5jbGFzcyIpOgorICAgIGZvciBmIGluIF9maWxlcyhuYW1lKToKICAgICAgICAgdW5saW5rKGYpCiAKIApAQCAtNzIsNyArODgsOCBAQAogICAgICAgICAgICAgICAgIHVubGluayhzb3VyY2UpCiAKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBpbXAucmVsb2FkKG1vZCkKKyAgICAgICAgICAgICAgICBpZiBub3Qgc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGU6CisgICAgICAgICAgICAgICAgICAgIGltcC5yZWxvYWQobW9kKQogICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yLCBlcnI6CiAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJpbXBvcnQgZnJvbSAucHljLy5weW8gZmFpbGVkOiAlcyIgJSBlcnIpCiAgICAgICAgICAgICBmaW5hbGx5OgpAQCAtODksNyArMTA2LDEwIEBACiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBkZWwgc3lzLnBhdGhbMF0KIAotICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKG9zLm5hbWUgPT0gJ3Bvc2l4JywgInRlc3QgbWVhbmluZ2Z1bCBvbmx5IG9uIHBvc2l4IHN5c3RlbXMiKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKG9zLm5hbWUgPT0gJ3Bvc2l4JywKKyAgICAgICAgInRlc3QgbWVhbmluZ2Z1bCBvbmx5IG9uIHBvc2l4IHN5c3RlbXMiKQorICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGUsCisgICAgICAgICJ0ZXN0IG1lYW5pbmdmdWwgb25seSB3aGVuIHdyaXRpbmcgYnl0ZWNvZGUiKQogICAgIGRlZiB0ZXN0X2V4ZWN1dGVfYml0X25vdF9jb3BpZWQoc2VsZik6CiAgICAgICAgICMgSXNzdWUgNjA3MDogdW5kZXIgcG9zaXggLnB5YyBmaWxlcyBnb3QgdGhlaXIgZXhlY3V0ZSBiaXQgc2V0IGlmCiAgICAgICAgICMgdGhlIC5weSBmaWxlIGhhZCB0aGUgZXhlY3V0ZSBiaXQgc2V0LCBidXQgdGhleSBhcmVuJ3QgZXhlY3V0YWJsZS4KQEAgLTExNiw2ICsxMzYsNDIgQEAKICAgICAgICAgICAgIHVubG9hZChURVNURk4pCiAgICAgICAgICAgICBkZWwgc3lzLnBhdGhbMF0KIAorICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGUsCisgICAgICAgICJ0ZXN0IG1lYW5pbmdmdWwgb25seSB3aGVuIHdyaXRpbmcgYnl0ZWNvZGUiKQorICAgIGRlZiB0ZXN0X3Jld3JpdGVfcHljX3dpdGhfcmVhZF9vbmx5X3NvdXJjZShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSA2MDc0OiBhIGxvbmcgdGltZSBhZ28gb24gcG9zaXgsIGFuZCBtb3JlIHJlY2VudGx5IG9uIFdpbmRvd3MsCisgICAgICAgICMgYSByZWFkIG9ubHkgc291cmNlIGZpbGUgcmVzdWx0ZWQgaW4gYSByZWFkIG9ubHkgcHljIGZpbGUsIHdoaWNoCisgICAgICAgICMgbGVkIHRvIHByb2JsZW1zIHdpdGggdXBkYXRpbmcgaXQgbGF0ZXIKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLmN1cmRpcikKKyAgICAgICAgZm5hbWUgPSBURVNURk4gKyBvcy5leHRzZXAgKyAicHkiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgV3JpdGUgYSBQeXRob24gZmlsZSwgbWFrZSBpdCByZWFkLW9ubHkgYW5kIGltcG9ydCBpdAorICAgICAgICAgICAgd2l0aCBvcGVuKGZuYW1lLCAndycpIGFzIGY6CisgICAgICAgICAgICAgICAgZi53cml0ZSgieCA9ICdvcmlnaW5hbCdcbiIpCisgICAgICAgICAgICAjIFR3ZWFrIHRoZSBtdGltZSBvZiB0aGUgc291cmNlIHRvIGVuc3VyZSBweWMgZ2V0cyB1cGRhdGVkIGxhdGVyCisgICAgICAgICAgICBzID0gb3Muc3RhdChmbmFtZSkKKyAgICAgICAgICAgIG9zLnV0aW1lKGZuYW1lLCAocy5zdF9hdGltZSwgcy5zdF9tdGltZS0xMDAwMDAwMDApKQorICAgICAgICAgICAgb3MuY2htb2QoZm5hbWUsIDA0MDApCisgICAgICAgICAgICBtMSA9IF9faW1wb3J0X18oVEVTVEZOKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtMS54LCAnb3JpZ2luYWwnKQorICAgICAgICAgICAgIyBDaGFuZ2UgdGhlIGZpbGUgYW5kIHRoZW4gcmVpbXBvcnQgaXQKKyAgICAgICAgICAgIG9zLmNobW9kKGZuYW1lLCAwNjAwKQorICAgICAgICAgICAgd2l0aCBvcGVuKGZuYW1lLCAndycpIGFzIGY6CisgICAgICAgICAgICAgICAgZi53cml0ZSgieCA9ICdyZXdyaXR0ZW4nXG4iKQorICAgICAgICAgICAgdW5sb2FkKFRFU1RGTikKKyAgICAgICAgICAgIG0yID0gX19pbXBvcnRfXyhURVNURk4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0yLngsICdyZXdyaXR0ZW4nKQorICAgICAgICAgICAgIyBOb3cgZGVsZXRlIHRoZSBzb3VyY2UgZmlsZSBhbmQgY2hlY2sgdGhlIHB5YyB3YXMgcmV3cml0dGVuCisgICAgICAgICAgICB1bmxpbmsoZm5hbWUpCisgICAgICAgICAgICB1bmxvYWQoVEVTVEZOKQorICAgICAgICAgICAgbTMgPSBfX2ltcG9ydF9fKFRFU1RGTikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobTMueCwgJ3Jld3JpdHRlbicpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBjaG1vZF9maWxlcyhURVNURk4pCisgICAgICAgICAgICByZW1vdmVfZmlsZXMoVEVTVEZOKQorICAgICAgICAgICAgdW5sb2FkKFRFU1RGTikKKyAgICAgICAgICAgIGRlbCBzeXMucGF0aFswXQorCiAgICAgZGVmIHRlc3RfaW1wX21vZHVsZShzZWxmKToKICAgICAgICAgIyBWZXJpZnkgdGhhdCB0aGUgaW1wIG1vZHVsZSBjYW4gY29ycmVjdGx5IGxvYWQgYW5kIGZpbmQgLnB5IGZpbGVzCiAKQEAgLTI2Myw3ICszMTksMTAgQEAKICAgICAgICAgICAgICAgICAgIGltcG9ydCBpbXAKICAgICAgICAgICAgIHN5cy5hcmd2Lmluc2VydCgwLCBDKCkpCiAgICAgICAgICAgICAiIiIpKQotICAgICAgICBzY3JpcHRfaGVscGVyLmFzc2VydF9weXRob25fb2sodGVzdGZuKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzY3JpcHRfaGVscGVyLmFzc2VydF9weXRob25fb2sodGVzdGZuKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdW5saW5rKHRlc3RmbikKIAogICAgIGRlZiB0ZXN0X2J1Zzc3MzIoc2VsZik6CiAgICAgICAgIHNvdXJjZSA9IFRFU1RGTiArICcucHknCkBAIC0yNzQsNiArMzMzLDcwIEBACiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBvcy5ybWRpcihzb3VyY2UpCiAKKyAgICBkZWYgdGVzdF90aW1lc3RhbXBfb3ZlcmZsb3coc2VsZik6CisgICAgICAgICMgQSBtb2RpZmljYXRpb24gdGltZXN0YW1wIGxhcmdlciB0aGFuIDIqKjMyIHNob3VsZCBub3QgYmUgYSBwcm9ibGVtCisgICAgICAgICMgd2hlbiBpbXBvcnRpbmcgYSBtb2R1bGUgKGlzc3VlICMxMTIzNSkuCisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5jdXJkaXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNvdXJjZSA9IFRFU1RGTiArICIucHkiCisgICAgICAgICAgICBjb21waWxlZCA9IHNvdXJjZSArICgnYycgaWYgX19kZWJ1Z19fIGVsc2UgJ28nKQorICAgICAgICAgICAgd2l0aCBvcGVuKHNvdXJjZSwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy51dGltZShzb3VyY2UsICgyICoqIDMzIC0gNSwgMiAqKiAzMyAtIDUpKQorICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiY2Fubm90IHNldCBtb2RpZmljYXRpb24gdGltZSB0byBsYXJnZSBpbnRlZ2VyIikKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBnZXRhdHRyKGVycm5vLCAnRU9WRVJGTE9XJywgTm9uZSk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiY2Fubm90IHNldCBtb2RpZmljYXRpb24gdGltZSB0byBsYXJnZSBpbnRlZ2VyICh7fSkiLmZvcm1hdChlKSkKKyAgICAgICAgICAgIF9faW1wb3J0X18oVEVTVEZOKQorICAgICAgICAgICAgIyBUaGUgcHljIGZpbGUgd2FzIGNyZWF0ZWQuCisgICAgICAgICAgICBvcy5zdGF0KGNvbXBpbGVkKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGVsIHN5cy5wYXRoWzBdCisgICAgICAgICAgICByZW1vdmVfZmlsZXMoVEVTVEZOKQorCisgICAgZGVmIHRlc3RfcHljX210aW1lKHNlbGYpOgorICAgICAgICAjIFRlc3QgZm9yIGlzc3VlICMxMzg2MzogLnB5YyB0aW1lc3RhbXAgc29tZXRpbWVzIGluY29ycmVjdCBvbiBXaW5kb3dzLgorICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgb3MuY3VyZGlyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIEphbiAxLCAyMDEyOyBKdWwgMSwgMjAxMi4KKyAgICAgICAgICAgIG10aW1lcyA9IDEzMjUzNzYwMDAsIDEzNDExMDA4MDAKKworICAgICAgICAgICAgIyBEaWZmZXJlbnQgbmFtZXMgdG8gYXZvaWQgcnVubmluZyBpbnRvIGltcG9ydCBjYWNoaW5nLgorICAgICAgICAgICAgdGFpbHMgPSAic3BhbSIsICJlZ2dzIgorICAgICAgICAgICAgZm9yIG10aW1lLCB0YWlsIGluIHppcChtdGltZXMsIHRhaWxzKToKKyAgICAgICAgICAgICAgICBtb2R1bGUgPSBURVNURk4gKyB0YWlsCisgICAgICAgICAgICAgICAgc291cmNlID0gbW9kdWxlICsgIi5weSIKKyAgICAgICAgICAgICAgICBjb21waWxlZCA9IHNvdXJjZSArICgnYycgaWYgX19kZWJ1Z19fIGVsc2UgJ28nKQorCisgICAgICAgICAgICAgICAgIyBDcmVhdGUgYSBuZXcgUHl0aG9uIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gbXRpbWUuCisgICAgICAgICAgICAgICAgd2l0aCBvcGVuKHNvdXJjZSwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCIjIEp1c3QgdGVzdGluZ1xueD0xLCAyLCAzXG4iKQorICAgICAgICAgICAgICAgIG9zLnV0aW1lKHNvdXJjZSwgKG10aW1lLCBtdGltZSkpCisKKyAgICAgICAgICAgICAgICAjIEdlbmVyYXRlIHRoZSAucHljL28gZmlsZTsgaWYgaXQgY291bGRuJ3QgYmUgY3JlYXRlZAorICAgICAgICAgICAgICAgICMgZm9yIHNvbWUgcmVhc29uLCBza2lwIHRoZSB0ZXN0LgorICAgICAgICAgICAgICAgIG0gPSBfX2ltcG9ydF9fKG1vZHVsZSkKKyAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoY29tcGlsZWQpOgorICAgICAgICAgICAgICAgICAgICB1bmxpbmsoc291cmNlKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJDb3VsZG4ndCBjcmVhdGUgLnB5Yy8ucHlvIGZpbGUuIikKKworICAgICAgICAgICAgICAgICMgQWN0dWFsIG1vZGlmaWNhdGlvbiB0aW1lIG9mIC5weSBmaWxlLgorICAgICAgICAgICAgICAgIG10aW1lMSA9IGludChvcy5zdGF0KHNvdXJjZSkuc3RfbXRpbWUpICYgMHhmZmZmZmZmZgorCisgICAgICAgICAgICAgICAgIyBtdGltZSB0aGF0IHdhcyBlbmNvZGVkIGluIHRoZSAucHljIGZpbGUuCisgICAgICAgICAgICAgICAgd2l0aCBvcGVuKGNvbXBpbGVkLCAncmInKSBhcyBmOgorICAgICAgICAgICAgICAgICAgICBtdGltZTIgPSBzdHJ1Y3QudW5wYWNrKCc8TCcsIGYucmVhZCg4KVs0Ol0pWzBdCisKKyAgICAgICAgICAgICAgICB1bmxpbmsoY29tcGlsZWQpCisgICAgICAgICAgICAgICAgdW5saW5rKHNvdXJjZSkKKworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXRpbWUxLCBtdGltZTIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMucGF0aC5wb3AoMCkKKwogCiBjbGFzcyBQeWNSZXdyaXRpbmdUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgIyBUZXN0IHRoYXQgdGhlIGBjb19maWxlbmFtZWAgYXR0cmlidXRlIG9uIGNvZGUgb2JqZWN0cyBhbHdheXMgcG9pbnRzCkBAIC0zMjQsNyArNDQ3LDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2QuZnVuY19maWxlbmFtZSwgc2VsZi5maWxlX25hbWUpCiAgICAgICAgIGRlbCBzeXMubW9kdWxlc1tzZWxmLm1vZHVsZV9uYW1lXQogICAgICAgICBtb2QgPSBzZWxmLmltcG9ydF9tb2R1bGUoKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5tb2R1bGVfZmlsZW5hbWUsIHNlbGYuY29tcGlsZWRfbmFtZSkKKyAgICAgICAgaWYgbm90IHN5cy5kb250X3dyaXRlX2J5dGVjb2RlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2QubW9kdWxlX2ZpbGVuYW1lLCBzZWxmLmNvbXBpbGVkX25hbWUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLmNvZGVfZmlsZW5hbWUsIHNlbGYuZmlsZV9uYW1lKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5mdW5jX2ZpbGVuYW1lLCBzZWxmLmZpbGVfbmFtZSkKIApAQCAtMzk2LDYgKzUyMCwxMyBAQAogICAgICAgICBkcml2ZSA9IHBhdGhbMF0KICAgICAgICAgdW5jID0gIlxcXFwlc1xcJXMkIiUoaG4sIGRyaXZlKQogICAgICAgICB1bmMgKz0gcGF0aFsyOl0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MubGlzdGRpcih1bmMpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICAgICAgICBpZiBlLmVycm5vIGluIChlcnJuby5FUEVSTSwgZXJybm8uRUFDQ0VTKToKKyAgICAgICAgICAgICAgICAjIFNlZSBpc3N1ZSAjMTUzMzgKKyAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJjYW5ub3QgYWNjZXNzIGFkbWluaXN0cmF0aXZlIHNoYXJlICVyIiAlICh1bmMsKSkKKyAgICAgICAgICAgIHJhaXNlCiAgICAgICAgIHN5cy5wYXRoLmFwcGVuZChwYXRoKQogICAgICAgICBtb2QgPSBfX2ltcG9ydF9fKCJ0ZXN0X3RyYWlsaW5nX3NsYXNoIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2QudGVzdGRhdGEsICd0ZXN0X3RyYWlsaW5nX3NsYXNoJykKQEAgLTQ2MCw4ICs1OTEsNTggQEAKICAgICAgICAgICAgICAgICAgICAgICAiaW1wbGljaXQgYWJzb2x1dGUgaW1wb3J0IikKIAogCitjbGFzcyBUZXN0U3ltYm9saWNhbGx5TGlua2VkUGFja2FnZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgcGFja2FnZV9uYW1lID0gJ3NhbXBsZScKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi50YWdnZWQpOgorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLnRhZ2dlZCkKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi5wYWNrYWdlX25hbWUpOgorICAgICAgICAgICAgc3ltbGlua19zdXBwb3J0LnJlbW92ZV9zeW1saW5rKHNlbGYucGFja2FnZV9uYW1lKQorICAgICAgICBzZWxmLm9yaWdfc3lzX3BhdGggPSBzeXMucGF0aFs6XQorCisgICAgICAgICMgY3JlYXRlIGEgc2FtcGxlIHBhY2thZ2U7IGltYWdpbmUgeW91IGhhdmUgYSBwYWNrYWdlIHdpdGggYSB0YWcgYW5kCisgICAgICAgICMgIHlvdSB3YW50IHRvIHN5bWJvbGljYWxseSBsaW5rIGl0IGZyb20gaXRzIHVudGFnZ2VkIG5hbWUuCisgICAgICAgIG9zLm1rZGlyKHNlbGYudGFnZ2VkKQorICAgICAgICBpbml0X2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi50YWdnZWQsICdfX2luaXRfXy5weScpCisgICAgICAgIG9wZW4oaW5pdF9maWxlLCAndycpLmNsb3NlKCkKKyAgICAgICAgYXNzZXJ0IG9zLnBhdGguZXhpc3RzKGluaXRfZmlsZSkKKworICAgICAgICAjIG5vdyBjcmVhdGUgYSBzeW1saW5rIHRvIHRoZSB0YWdnZWQgcGFja2FnZQorICAgICAgICAjIHNhbXBsZSAtPiBzYW1wbGUtdGFnZ2VkCisgICAgICAgIHN5bWxpbmtfc3VwcG9ydC5zeW1saW5rKHNlbGYudGFnZ2VkLCBzZWxmLnBhY2thZ2VfbmFtZSkKKworICAgICAgICBhc3NlcnQgb3MucGF0aC5pc2RpcihzZWxmLnBhY2thZ2VfbmFtZSkKKyAgICAgICAgYXNzZXJ0IG9zLnBhdGguaXNmaWxlKG9zLnBhdGguam9pbihzZWxmLnBhY2thZ2VfbmFtZSwgJ19faW5pdF9fLnB5JykpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgdGFnZ2VkKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5wYWNrYWdlX25hbWUgKyAnLXRhZ2dlZCcKKworICAgICMgcmVncmVzc2lvbiB0ZXN0IGZvciBpc3N1ZTY3MjcKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcygKKyAgICAgICAgbm90IGhhc2F0dHIoc3lzLCAnZ2V0d2luZG93c3ZlcnNpb24nKQorICAgICAgICBvciBzeXMuZ2V0d2luZG93c3ZlcnNpb24oKSA+PSAoNiwgMCksCisgICAgICAgICJXaW5kb3dzIFZpc3RhIG9yIGxhdGVyIHJlcXVpcmVkIikKKyAgICBAc3ltbGlua19zdXBwb3J0LnNraXBfdW5sZXNzX3N5bWxpbmsKKyAgICBkZWYgdGVzdF9zeW1saW5rZWRfZGlyX2ltcG9ydGFibGUoc2VsZik6CisgICAgICAgICMgbWFrZSBzdXJlIHNhbXBsZSBjYW4gb25seSBiZSBpbXBvcnRlZCBmcm9tIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKyAgICAgICAgc3lzLnBhdGhbOl0gPSBbJy4nXQorCisgICAgICAgICMgYW5kIHRyeSB0byBpbXBvcnQgdGhlIHBhY2thZ2UKKyAgICAgICAgX19pbXBvcnRfXyhzZWxmLnBhY2thZ2VfbmFtZSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgIyBub3cgY2xlYW51cAorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLnBhY2thZ2VfbmFtZSk6CisgICAgICAgICAgICBzeW1saW5rX3N1cHBvcnQucmVtb3ZlX3N5bWxpbmsoc2VsZi5wYWNrYWdlX25hbWUpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYudGFnZ2VkKToKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoc2VsZi50YWdnZWQpCisgICAgICAgIHN5cy5wYXRoWzpdID0gc2VsZi5vcmlnX3N5c19wYXRoCisKIGRlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKLSAgICBydW5fdW5pdHRlc3QoSW1wb3J0VGVzdHMsIFB5Y1Jld3JpdGluZ1Rlc3RzLCBQYXRoc1Rlc3RzLCBSZWxhdGl2ZUltcG9ydFRlc3RzKQorICAgIHJ1bl91bml0dGVzdChJbXBvcnRUZXN0cywgUHljUmV3cml0aW5nVGVzdHMsIFBhdGhzVGVzdHMsCisgICAgICAgIFJlbGF0aXZlSW1wb3J0VGVzdHMsIFRlc3RTeW1ib2xpY2FsbHlMaW5rZWRQYWNrYWdlKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgICMgVGVzdCBuZWVkcyB0byBiZSBhIHBhY2thZ2UsIHNvIHdlIGNhbiBkbyByZWxhdGl2ZSBpbXBvcnRzLgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbmRleC5weSBiL0xpYi90ZXN0L3Rlc3RfaW5kZXgucHkKaW5kZXggYTkyYjQ0Mi4uNGMyOTk5MyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbmRleC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2luZGV4LnB5CkBAIC05MSw3ICs5MSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXFbc2VsZi5vOnNlbGYubzJdLCBzZWxmLnNlcVsxOjNdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2VxW3NlbGYubjpzZWxmLm4yXSwgc2VsZi5zZXFbMjo0XSkKIAotICAgIGRlZiB0ZXN0X3NsaWNlX2J1Zzc1MzIoc2VsZik6CisgICAgZGVmIHRlc3Rfc2xpY2VfYnVnNzUzMmEoc2VsZik6CiAgICAgICAgIHNlcWxlbiA9IGxlbihzZWxmLnNlcSkKICAgICAgICAgc2VsZi5vLmluZCA9IGludChzZXFsZW4gKiAxLjUpCiAgICAgICAgIHNlbGYubi5pbmQgPSBzZXFsZW4gKyAyCkBAIC05OSw5ICs5OSwxMiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2VxWzpzZWxmLm9dLCBzZWxmLnNlcSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNlcVtzZWxmLm46XSwgc2VsZi5zZXFbMDowXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNlcVs6c2VsZi5uXSwgc2VsZi5zZXEpCisKKyAgICBkZWYgdGVzdF9zbGljZV9idWc3NTMyYihzZWxmKToKICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLnNlcSwgQ2xhc3NpY1NlcSk6Ci0gICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ3Rlc3QgZmFpbHMgZm9yIENsYXNzaWNTZXEnKQogICAgICAgICAjIFRoZXNlIHRlc3RzIGZhaWwgZm9yIENsYXNzaWNTZXEgKHNlZSBidWcgIzc1MzIpCisgICAgICAgIHNlcWxlbiA9IGxlbihzZWxmLnNlcSkKICAgICAgICAgc2VsZi5vMi5pbmQgPSAtc2VxbGVuIC0gMgogICAgICAgICBzZWxmLm4yLmluZCA9IC1pbnQoc2VxbGVuICogMS41KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2VxW3NlbGYubzI6XSwgc2VsZi5zZXEpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2luc3BlY3QucHkgYi9MaWIvdGVzdC90ZXN0X2luc3BlY3QucHkKaW5kZXggYjhjOWExOC4uNDEzMGNkMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weQpAQCAtMjIwLDggKzIyMCwyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIFsoJ0Zlc3RlcmluZ0dvYicsIG1vZC5GZXN0ZXJpbmdHb2IpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoJ01hbG9kb3JvdXNQZXJ2ZXJ0JywgbW9kLk1hbG9kb3JvdXNQZXJ2ZXJ0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdQYXJyb3REcm9wcGluZ3MnLCBtb2QuUGFycm90RHJvcHBpbmdzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKCdTdHVwaWRHaXQnLCBtb2QuU3R1cGlkR2l0KV0pCi0gICAgICAgIHRyZWUgPSBpbnNwZWN0LmdldGNsYXNzdHJlZShbY2xzWzFdIGZvciBjbHMgaW4gY2xhc3Nlc10sIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICgnU3R1cGlkR2l0JywgbW9kLlN0dXBpZEdpdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgnVGl0JywgbW9kLk1hbG9kb3JvdXNQZXJ2ZXJ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBdKQorICAgICAgICB0cmVlID0gaW5zcGVjdC5nZXRjbGFzc3RyZWUoW2Nsc1sxXSBmb3IgY2xzIGluIGNsYXNzZXNdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgWyhtb2QuUGFycm90RHJvcHBpbmdzLCAoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFsobW9kLkZlc3RlcmluZ0dvYiwgKG1vZC5NYWxvZG9yb3VzUGVydmVydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLlBhcnJvdERyb3BwaW5ncykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAobW9kLlN0dXBpZEdpdCwgKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbKG1vZC5NYWxvZG9yb3VzUGVydmVydCwgKG1vZC5TdHVwaWRHaXQsKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG1vZC5GZXN0ZXJpbmdHb2IsIChtb2QuTWFsb2Rvcm91c1BlcnZlcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2QuUGFycm90RHJvcHBpbmdzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisgICAgICAgIHRyZWUgPSBpbnNwZWN0LmdldGNsYXNzdHJlZShbY2xzWzFdIGZvciBjbHMgaW4gY2xhc3Nlc10sIFRydWUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJlZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBbKG1vZC5QYXJyb3REcm9wcGluZ3MsICgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vZC5TdHVwaWRHaXQsICgpKSwKQEAgLTQwNCwxMCArNDE5LDQzIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5maW5kc291cmNlKGNvKSwgKGxpbmVzLDApKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZ2V0c291cmNlKGNvKSwgbGluZXNbMF0pCiAKKyAgICBkZWYgdGVzdF9maW5kc291cmNlX3dpdGhvdXRfZmlsZW5hbWUoc2VsZik6CisgICAgICAgIGZvciBmbmFtZSBpbiBbJycsICc8c3RyaW5nPiddOgorICAgICAgICAgICAgY28gPSBjb21waWxlKCd4PTEnLCBmbmFtZSwgImV4ZWMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgaW5zcGVjdC5maW5kc291cmNlLCBjbykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGluc3BlY3QuZ2V0c291cmNlLCBjbykKKworCitjbGFzcyBfQnJva2VuRGF0YURlc2NyaXB0b3Iob2JqZWN0KToKKyAgICAiIiIKKyAgICBBIGJyb2tlbiBkYXRhIGRlc2NyaXB0b3IuIFNlZSBidWcgIzE3ODUuCisgICAgIiIiCisgICAgZGVmIF9fZ2V0X18oKmFyZ3MpOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigic2hvdWxkIG5vdCBfX2dldF9fIGRhdGEgZGVzY3JpcHRvcnMiKQorCisgICAgZGVmIF9fc2V0X18oKmFyZ3MpOgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKKworICAgIGRlZiBfX2dldGF0dHJfXygqYXJncyk6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJzaG91bGQgbm90IF9fZ2V0YXR0cl9fIGRhdGEgZGVzY3JpcHRvcnMiKQorCisKK2NsYXNzIF9Ccm9rZW5NZXRob2REZXNjcmlwdG9yKG9iamVjdCk6CisgICAgIiIiCisgICAgQSBicm9rZW4gbWV0aG9kIGRlc2NyaXB0b3IuIFNlZSBidWcgIzE3ODUuCisgICAgIiIiCisgICAgZGVmIF9fZ2V0X18oKmFyZ3MpOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigic2hvdWxkIG5vdCBfX2dldF9fIG1ldGhvZCBkZXNjcmlwdG9ycyIpCisKKyAgICBkZWYgX19nZXRhdHRyX18oKmFyZ3MpOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigic2hvdWxkIG5vdCBfX2dldGF0dHJfXyBtZXRob2QgZGVzY3JpcHRvcnMiKQorCisKICMgSGVscGVyIGZvciB0ZXN0aW5nIGNsYXNzaWZ5X2NsYXNzX2F0dHJzLgogZGVmIGF0dHJzX3dvX29ianMoY2xzKToKICAgICByZXR1cm4gW3RbOjNdIGZvciB0IGluIGluc3BlY3QuY2xhc3NpZnlfY2xhc3NfYXR0cnMoY2xzKV0KIAorCiBjbGFzcyBUZXN0Q2xhc3Nlc0FuZEZ1bmN0aW9ucyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfY2xhc3NpY19tcm8oc2VsZik6CiAgICAgICAgICMgVGVzdCBjbGFzc2ljLWNsYXNzIG1ldGhvZCByZXNvbHV0aW9uIG9yZGVyLgpAQCAtNDk0LDYgKzU0Miw5IEBACiAKICAgICAgICAgICAgIGRhdGFibG9iID0gJzEnCiAKKyAgICAgICAgICAgIGRkID0gX0Jyb2tlbkRhdGFEZXNjcmlwdG9yKCkKKyAgICAgICAgICAgIG1kID0gX0Jyb2tlbk1ldGhvZERlc2NyaXB0b3IoKQorCiAgICAgICAgIGF0dHJzID0gYXR0cnNfd29fb2JqcyhBKQogICAgICAgICBzZWxmLmFzc2VydEluKCgncycsICdzdGF0aWMgbWV0aG9kJywgQSksIGF0dHJzLCAnbWlzc2luZyBzdGF0aWMgbWV0aG9kJykKICAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2MnLCAnY2xhc3MgbWV0aG9kJywgQSksIGF0dHJzLCAnbWlzc2luZyBjbGFzcyBtZXRob2QnKQpAQCAtNTAxLDYgKzU1Miw4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdtJywgJ21ldGhvZCcsIEEpLCBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKICAgICAgICAgc2VsZi5hc3NlcnRJbigoJ20xJywgJ21ldGhvZCcsIEEpLCBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKICAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2RhdGFibG9iJywgJ2RhdGEnLCBBKSwgYXR0cnMsICdtaXNzaW5nIGRhdGEnKQorICAgICAgICBzZWxmLmFzc2VydEluKCgnbWQnLCAnbWV0aG9kJywgQSksIGF0dHJzLCAnbWlzc2luZyBtZXRob2QgZGVzY3JpcHRvcicpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdkZCcsICdkYXRhJywgQSksIGF0dHJzLCAnbWlzc2luZyBkYXRhIGRlc2NyaXB0b3InKQogCiAgICAgICAgIGNsYXNzIEIoQSk6CiAgICAgICAgICAgICBkZWYgbShzZWxmKTogcGFzcwpAQCAtNTEyLDYgKzU2NSw4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdtJywgJ21ldGhvZCcsIEIpLCBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKICAgICAgICAgc2VsZi5hc3NlcnRJbigoJ20xJywgJ21ldGhvZCcsIEEpLCBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKICAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2RhdGFibG9iJywgJ2RhdGEnLCBBKSwgYXR0cnMsICdtaXNzaW5nIGRhdGEnKQorICAgICAgICBzZWxmLmFzc2VydEluKCgnbWQnLCAnbWV0aG9kJywgQSksIGF0dHJzLCAnbWlzc2luZyBtZXRob2QgZGVzY3JpcHRvcicpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdkZCcsICdkYXRhJywgQSksIGF0dHJzLCAnbWlzc2luZyBkYXRhIGRlc2NyaXB0b3InKQogCiAKICAgICAgICAgY2xhc3MgQyhBKToKQEAgLTUyNSw2ICs1ODAsOCBAQAogICAgICAgICBzZWxmLmFzc2VydEluKCgnbScsICdtZXRob2QnLCBDKSwgYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdtMScsICdtZXRob2QnLCBBKSwgYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdkYXRhYmxvYicsICdkYXRhJywgQSksIGF0dHJzLCAnbWlzc2luZyBkYXRhJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ21kJywgJ21ldGhvZCcsIEEpLCBhdHRycywgJ21pc3NpbmcgbWV0aG9kIGRlc2NyaXB0b3InKQorICAgICAgICBzZWxmLmFzc2VydEluKCgnZGQnLCAnZGF0YScsIEEpLCBhdHRycywgJ21pc3NpbmcgZGF0YSBkZXNjcmlwdG9yJykKIAogICAgICAgICBjbGFzcyBEKEIsIEMpOgogICAgICAgICAgICAgZGVmIG0xKHNlbGYpOiBwYXNzCkBAIC01MzksNiArNTk2LDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRJbigoJ20nLCAnbWV0aG9kJywgQiksIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQogICAgICAgICBzZWxmLmFzc2VydEluKCgnbTEnLCAnbWV0aG9kJywgRCksIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQogICAgICAgICBzZWxmLmFzc2VydEluKCgnZGF0YWJsb2InLCAnZGF0YScsIEEpLCBhdHRycywgJ21pc3NpbmcgZGF0YScpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdtZCcsICdtZXRob2QnLCBBKSwgYXR0cnMsICdtaXNzaW5nIG1ldGhvZCBkZXNjcmlwdG9yJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2RkJywgJ2RhdGEnLCBBKSwgYXR0cnMsICdtaXNzaW5nIGRhdGEgZGVzY3JpcHRvcicpCiAKIAogICAgIGRlZiB0ZXN0X2NsYXNzaWZ5X29sZHN0eWxlKHNlbGYpOgpAQCAtNTU0LDYgKzYxMywzOCBAQAogICAgICAgICAiIiIKICAgICAgICAgc2VsZi5fY2xhc3NpZnlfdGVzdChUcnVlKQogCisgICAgZGVmIHRlc3RfY2xhc3NpZnlfYnVpbHRpbl90eXBlcyhzZWxmKToKKyAgICAgICAgIyBTaW1wbGUgc2FuaXR5IGNoZWNrIHRoYXQgYWxsIGJ1aWx0LWluIHR5cGVzIGNhbiBoYXZlIHRoZWlyCisgICAgICAgICMgYXR0cmlidXRlcyBjbGFzc2lmaWVkLgorICAgICAgICBmb3IgbmFtZSBpbiBkaXIoX19idWlsdGluX18pOgorICAgICAgICAgICAgYnVpbHRpbiA9IGdldGF0dHIoX19idWlsdGluX18sIG5hbWUpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGJ1aWx0aW4sIHR5cGUpOgorICAgICAgICAgICAgICAgIGluc3BlY3QuY2xhc3NpZnlfY2xhc3NfYXR0cnMoYnVpbHRpbikKKworICAgIGRlZiB0ZXN0X2dldG1lbWJlcnNfbWV0aG9kKHNlbGYpOgorICAgICAgICAjIE9sZC1zdHlsZSBjbGFzc2VzCisgICAgICAgIGNsYXNzIEI6CisgICAgICAgICAgICBkZWYgZihzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2YnLCBCLmYpLCBpbnNwZWN0LmdldG1lbWJlcnMoQikpCisgICAgICAgICMgY29udHJhcnkgdG8gc3BlYywgaXNtZXRob2QoKSBpcyBhbHNvIFRydWUgZm9yIHVuYm91bmQgbWV0aG9kcworICAgICAgICAjIChzZWUgIzE3ODUpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdmJywgQi5mKSwgaW5zcGVjdC5nZXRtZW1iZXJzKEIsIGluc3BlY3QuaXNtZXRob2QpKQorICAgICAgICBiID0gQigpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdmJywgYi5mKSwgaW5zcGVjdC5nZXRtZW1iZXJzKGIpKQorICAgICAgICBzZWxmLmFzc2VydEluKCgnZicsIGIuZiksIGluc3BlY3QuZ2V0bWVtYmVycyhiLCBpbnNwZWN0LmlzbWV0aG9kKSkKKworICAgICAgICAjIE5ldy1zdHlsZSBjbGFzc2VzCisgICAgICAgIGNsYXNzIEIob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBmKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydEluKCgnZicsIEIuZiksIGluc3BlY3QuZ2V0bWVtYmVycyhCKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2YnLCBCLmYpLCBpbnNwZWN0LmdldG1lbWJlcnMoQiwgaW5zcGVjdC5pc21ldGhvZCkpCisgICAgICAgIGIgPSBCKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2YnLCBiLmYpLCBpbnNwZWN0LmdldG1lbWJlcnMoYikpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdmJywgYi5mKSwgaW5zcGVjdC5nZXRtZW1iZXJzKGIsIGluc3BlY3QuaXNtZXRob2QpKQogCiAKIGNsYXNzIFRlc3RHZXRjYWxsYXJnc0Z1bmN0aW9ucyh1bml0dGVzdC5UZXN0Q2FzZSk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ludC5weSBiL0xpYi90ZXN0L3Rlc3RfaW50LnB5CmluZGV4IGZhNDYyMTIuLjM2NWY5YTIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW50LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW50LnB5CkBAIC0xLDYgKzEsNyBAQAogaW1wb3J0IHN5cwogCiBpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiBmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGhhdmVfdW5pY29kZQogaW1wb3J0IG1hdGgKIApAQCAtNDQsNyArNDUsMjcgQEAKICAgICAgICAgKHVuaWNocigweDIwMCksIFZhbHVlRXJyb3IpLAogXQogCi1jbGFzcyBJbnRUZXN0Q2FzZXModW5pdHRlc3QuVGVzdENhc2UpOgorY2xhc3MgSW50TG9uZ0NvbW1vblRlc3RzKG9iamVjdCk6CisKKyAgICAiIiJNaXhpbiBvZiB0ZXN0IGNhc2VzIHRvIHNoYXJlIGJldHdlZW4gYm90aCB0ZXN0X2ludCBhbmQgdGVzdF9sb25nLiIiIgorCisgICAgIyBDaGFuZ2UgdG8gaW50IG9yIGxvbmcgaW4gdGhlIFRlc3RDYXNlIHN1YmNsYXNzLgorICAgIG50eXBlID0gTm9uZQorCisgICAgZGVmIHRlc3Rfbm9fYXJncyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm50eXBlKCksIDApCisKKyAgICBkZWYgdGVzdF9rZXl3b3JkX2FyZ3Moc2VsZik6CisgICAgICAgICMgVGVzdCBpbnZva2luZyBjb25zdHJ1Y3RvciB1c2luZyBrZXl3b3JkIGFyZ3VtZW50cy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm50eXBlKHg9MS4yKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm50eXBlKCcxMDAnLCBiYXNlPTIpLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubnR5cGUoeD0nMTAwJywgYmFzZT0yKSwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLm50eXBlLCBiYXNlPTEwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYubnR5cGUsIGJhc2U9MCkKKworY2xhc3MgSW50VGVzdENhc2VzKEludExvbmdDb21tb25UZXN0cywgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgbnR5cGUgPSBpbnQKIAogICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgzMTQpLCAzMTQpCkBAIC0zMTUsNiArMzM2LDQ2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGZsb2F0KDIqKjU0KzEwKSksIDIqKjU0KzgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGZsb2F0KDIqKjU0KzExKSksIDIqKjU0KzEyKQogCisgICAgZGVmIHRlc3RfdmFsaWRfbm9uX251bWVyaWNfaW5wdXRfdHlwZXNfZm9yX3goc2VsZik6CisgICAgICAgICMgVGVzdCBwb3NzaWJsZSB2YWxpZCBub24tbnVtZXJpYyB0eXBlcyBmb3IgeCwgaW5jbHVkaW5nIHN1YmNsYXNzZXMKKyAgICAgICAgIyBvZiB0aGUgYWxsb3dlZCBidWlsdC1pbiB0eXBlcy4KKyAgICAgICAgY2xhc3MgQ3VzdG9tU3RyKHN0cik6IHBhc3MKKyAgICAgICAgdmFsdWVzID0gWycxMDAnLCBDdXN0b21TdHIoJzEwMCcpXQorCisgICAgICAgIGlmIGhhdmVfdW5pY29kZToKKyAgICAgICAgICAgIGNsYXNzIEN1c3RvbVVuaWNvZGUodW5pY29kZSk6IHBhc3MKKyAgICAgICAgICAgIHZhbHVlcyArPSBbdW5pY29kZSgnMTAwJyksIEN1c3RvbVVuaWNvZGUodW5pY29kZSgnMTAwJykpXQorCisgICAgICAgIGZvciB4IGluIHZhbHVlczoKKyAgICAgICAgICAgIG1zZyA9ICd4IGhhcyB2YWx1ZSAlcyBhbmQgdHlwZSAlcycgJSAoeCwgdHlwZSh4KS5fX25hbWVfXykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCh4KSwgMTAwLCBtc2c9bXNnKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KHgsIDIpLCA0LCBtc2c9bXNnKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvciwgZXJyOgorICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdGb3IgJXMgZ290IFR5cGVFcnJvcjogJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSh4KS5fX25hbWVfXywgZXJyKSkKKworICAgIGRlZiB0ZXN0X2Vycm9yX29uX3N0cmluZ19mbG9hdF9mb3JfeChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW50LCAnMS4yJykKKworICAgIGRlZiB0ZXN0X2Vycm9yX29uX2J5dGVhcnJheV9mb3JfeChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpbnQsIGJ5dGVhcnJheSgnMTAwJyksIDIpCisKKyAgICBkZWYgdGVzdF9lcnJvcl9vbl9pbnZhbGlkX2ludF9iYXNlcyhzZWxmKToKKyAgICAgICAgZm9yIGJhc2UgaW4gWy0xLCAxLCAxMDAwXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGludCwgJzEwMCcsIGJhc2UpCisKKyAgICBkZWYgdGVzdF9lcnJvcl9vbl9zdHJpbmdfYmFzZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpbnQsIDEwMCwgYmFzZT0nZm9vJykKKworICAgIEB0ZXN0X3N1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3Rfc21hbGxfaW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhpbnQoJzEwJyksIDEwKQorICAgICAgICBzZWxmLmFzc2VydElzKGludCgnLTEnKSwgLTEpCisgICAgICAgIGlmIGhhdmVfdW5pY29kZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoaW50KHUnMTAnKSwgMTApCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKGludCh1Jy0xJyksIC0xKQorCiAgICAgZGVmIHRlc3RfaW50Y29udmVyc2lvbihzZWxmKToKICAgICAgICAgIyBUZXN0IF9faW50X18oKQogICAgICAgICBjbGFzcyBDbGFzc2ljTWlzc2luZ01ldGhvZHM6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2lvLnB5IGIvTGliL3Rlc3QvdGVzdF9pby5weQppbmRleCBiOTk3MmYzLi5hZjNiOTBhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2lvLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW8ucHkKQEAgLTI5LDEyICsyOSwxNSBAQAogaW1wb3J0IHJhbmRvbQogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgd2Vha3JlZgoraW1wb3J0IHdhcm5pbmdzCiBpbXBvcnQgYWJjCiBpbXBvcnQgc2lnbmFsCiBpbXBvcnQgZXJybm8KIGZyb20gaXRlcnRvb2xzIGltcG9ydCBjeWNsZSwgY291bnQKIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCitmcm9tIFVzZXJMaXN0IGltcG9ydCBVc2VyTGlzdAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQgYXMgc3VwcG9ydAoraW1wb3J0IGNvbnRleHRsaWIKIAogaW1wb3J0IGNvZGVjcwogaW1wb3J0IGlvICAjIEMgaW1wbGVtZW50YXRpb24gb2YgaW8KQEAgLTM5MSwxNCArMzk0LDkgQEAKICAgICAgICAgIyBhIGxvbmcgdGltZSB0byBidWlsZCB0aGUgPjJHQiBmaWxlIGFuZCB0YWtlcyA+MkdCIG9mIGRpc2sgc3BhY2UKICAgICAgICAgIyB0aGVyZWZvcmUgdGhlIHJlc291cmNlIG11c3QgYmUgZW5hYmxlZCB0byBydW4gdGhpcyB0ZXN0LgogICAgICAgICBpZiBzeXMucGxhdGZvcm1bOjNdID09ICd3aW4nIG9yIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKLSAgICAgICAgICAgIGlmIG5vdCBzdXBwb3J0LmlzX3Jlc291cmNlX2VuYWJsZWQoImxhcmdlZmlsZSIpOgotICAgICAgICAgICAgICAgIHByaW50KCJcblRlc3RpbmcgbGFyZ2UgZmlsZSBvcHMgc2tpcHBlZCBvbiAlcy4iICUgc3lzLnBsYXRmb3JtLAotICAgICAgICAgICAgICAgICAgICAgIGZpbGU9c3lzLnN0ZGVycikKLSAgICAgICAgICAgICAgICBwcmludCgiSXQgcmVxdWlyZXMgJWQgYnl0ZXMgYW5kIGEgbG9uZyB0aW1lLiIgJSBzZWxmLkxBUkdFLAotICAgICAgICAgICAgICAgICAgICAgIGZpbGU9c3lzLnN0ZGVycikKLSAgICAgICAgICAgICAgICBwcmludCgiVXNlICdyZWdydGVzdC5weSAtdSBsYXJnZWZpbGUgdGVzdF9pbycgdG8gcnVuIGl0LiIsCi0gICAgICAgICAgICAgICAgICAgICAgZmlsZT1zeXMuc3RkZXJyKQotICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc3VwcG9ydC5yZXF1aXJlcygKKyAgICAgICAgICAgICAgICAnbGFyZ2VmaWxlJywKKyAgICAgICAgICAgICAgICAndGVzdCByZXF1aXJlcyAlcyBieXRlcyBhbmQgYSBsb25nIHRpbWUgdG8gcnVuJyAlIHNlbGYuTEFSR0UpCiAgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAidytiIiwgMCkgYXMgZjoKICAgICAgICAgICAgIHNlbGYubGFyZ2VfZmlsZV9vcHMoZikKICAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3K2IiKSBhcyBmOgpAQCAtNTcyLDYgKzU3MCw3IEBACiAgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCkKICAgICAgICAgZi5mbHVzaCA9IGJhZF9mbHVzaAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBmLmNsb3NlKSAjIGV4Y2VwdGlvbiBub3Qgc3dhbGxvd2VkCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLmNsb3NlZCkKIAogICAgIGRlZiB0ZXN0X211bHRpX2Nsb3NlKHNlbGYpOgogICAgICAgICBmID0gc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiLCBidWZmZXJpbmc9MCkKQEAgLTU5Myw2ICs1OTIsMzMgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYXdpby5yZWFkKDIpLCBOb25lKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhd2lvLnJlYWQoMiksIGIiIikKIAorICAgIGRlZiB0ZXN0X2ZpbGVpb19jbG9zZWZkKHNlbGYpOgorICAgICAgICAjIElzc3VlICM0ODQxCisgICAgICAgIHdpdGggc2VsZi5vcGVuKF9fZmlsZV9fLCAncmInKSBhcyBmMSwgXAorICAgICAgICAgICAgIHNlbGYub3BlbihfX2ZpbGVfXywgJ3JiJykgYXMgZjI6CisgICAgICAgICAgICBmaWxlaW8gPSBzZWxmLkZpbGVJTyhmMS5maWxlbm8oKSwgY2xvc2VmZD1GYWxzZSkKKyAgICAgICAgICAgICMgLl9faW5pdF9fKCkgbXVzdCBub3QgY2xvc2UgZjEKKyAgICAgICAgICAgIGZpbGVpby5fX2luaXRfXyhmMi5maWxlbm8oKSwgY2xvc2VmZD1GYWxzZSkKKyAgICAgICAgICAgIGYxLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICMgLmNsb3NlKCkgbXVzdCBub3QgY2xvc2UgZjIKKyAgICAgICAgICAgIGZpbGVpby5jbG9zZSgpCisgICAgICAgICAgICBmMi5yZWFkbGluZSgpCisKKyAgICBkZWYgdGVzdF9ub25idWZmZXJlZF90ZXh0aW8oc2VsZik6CisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUpIGFzIHJlY29yZGVkOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgICAgICBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICd3JywgYnVmZmVyaW5nPTApCisgICAgICAgICAgICBzdXBwb3J0LmdjX2NvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlY29yZGVkLCBbXSkKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfbmV3bGluZShzZWxmKToKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSkgYXMgcmVjb3JkZWQ6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgICAgIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgJ3cnLCBuZXdsaW5lPSdpbnZhbGlkJykKKyAgICAgICAgICAgIHN1cHBvcnQuZ2NfY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVjb3JkZWQsIFtdKQorCisKIGNsYXNzIENJT1Rlc3QoSU9UZXN0KToKIAogICAgIGRlZiB0ZXN0X0lPQmFzZV9maW5hbGl6ZShzZWxmKToKQEAgLTYzNCw2ICs2NjAsNyBAQAogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGJ1ZmlvLmZpbGVubygpKQogCisgICAgQHVuaXR0ZXN0LnNraXAoJ3Rlc3QgaGF2aW5nIGV4aXN0ZW50aWFsIGNyaXNpcycpCiAgICAgZGVmIHRlc3Rfbm9fZmlsZW5vKHNlbGYpOgogICAgICAgICAjIFhYWCB3aWxsIHdlIGFsd2F5cyBoYXZlIGZpbGVubygpIGZ1bmN0aW9uPyBJZiBzbywga2lsbAogICAgICAgICAjIHRoaXMgdGVzdC4gRWxzZSwgd3JpdGUgaXQuCkBAIC03MTgsNiArNzQ1LDIxIEBACiAgICAgICAgIHJhdy5mbHVzaCA9IGJhZF9mbHVzaAogICAgICAgICBiID0gc2VsZi50cChyYXcpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGIuY2xvc2UpICMgZXhjZXB0aW9uIG5vdCBzd2FsbG93ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGIuY2xvc2VkKQorCisgICAgZGVmIHRlc3RfY2xvc2VfZXJyb3Jfb25fY2xvc2Uoc2VsZik6CisgICAgICAgIHJhdyA9IHNlbGYuTW9ja1Jhd0lPKCkKKyAgICAgICAgZGVmIGJhZF9mbHVzaCgpOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcignZmx1c2gnKQorICAgICAgICBkZWYgYmFkX2Nsb3NlKCk6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCdjbG9zZScpCisgICAgICAgIHJhdy5jbG9zZSA9IGJhZF9jbG9zZQorICAgICAgICBiID0gc2VsZi50cChyYXcpCisgICAgICAgIGIuZmx1c2ggPSBiYWRfZmx1c2gKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yKSBhcyBlcnI6ICMgZXhjZXB0aW9uIG5vdCBzd2FsbG93ZWQKKyAgICAgICAgICAgIGIuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyci5leGNlcHRpb24uYXJncywgKCdjbG9zZScsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShiLmNsb3NlZCkKIAogICAgIGRlZiB0ZXN0X211bHRpX2Nsb3NlKHNlbGYpOgogICAgICAgICByYXcgPSBzZWxmLk1vY2tSYXdJTygpCkBAIC03MzUsNiArNzc3LDIwIEBACiAgICAgICAgICAgICBidWYucmF3ID0geAogCiAKK2NsYXNzIFNpemVvZlRlc3Q6CisKKyAgICBAc3VwcG9ydC5jcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdF9zaXplb2Yoc2VsZik6CisgICAgICAgIGJ1ZnNpemUxID0gNDA5NgorICAgICAgICBidWZzaXplMiA9IDgxOTIKKyAgICAgICAgcmF3aW8gPSBzZWxmLk1vY2tSYXdJTygpCisgICAgICAgIGJ1ZmlvID0gc2VsZi50cChyYXdpbywgYnVmZmVyX3NpemU9YnVmc2l6ZTEpCisgICAgICAgIHNpemUgPSBzeXMuZ2V0c2l6ZW9mKGJ1ZmlvKSAtIGJ1ZnNpemUxCisgICAgICAgIHJhd2lvID0gc2VsZi5Nb2NrUmF3SU8oKQorICAgICAgICBidWZpbyA9IHNlbGYudHAocmF3aW8sIGJ1ZmZlcl9zaXplPWJ1ZnNpemUyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5nZXRzaXplb2YoYnVmaW8pLCBzaXplICsgYnVmc2l6ZTIpCisKKwogY2xhc3MgQnVmZmVyZWRSZWFkZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlLCBDb21tb25CdWZmZXJlZFRlc3RzKToKICAgICByZWFkX21vZGUgPSAicmIiCiAKQEAgLTc1Miw2ICs4MDgsMTYgQEAKICAgICAgICAgYnVmaW8uX19pbml0X18ocmF3aW8pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJhYmMiLCBidWZpby5yZWFkKCkpCiAKKyAgICBkZWYgdGVzdF91bmluaXRpYWxpemVkKHNlbGYpOgorICAgICAgICBidWZpbyA9IHNlbGYudHAuX19uZXdfXyhzZWxmLnRwKQorICAgICAgICBkZWwgYnVmaW8KKyAgICAgICAgYnVmaW8gPSBzZWxmLnRwLl9fbmV3X18oc2VsZi50cCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoKFZhbHVlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuaW5pdGlhbGl6ZWR8aGFzIG5vIGF0dHJpYnV0ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmlvLnJlYWQsIDApCisgICAgICAgIGJ1ZmlvLl9faW5pdF9fKHNlbGYuTW9ja1Jhd0lPKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmaW8ucmVhZCgwKSwgYicnKQorCiAgICAgZGVmIHRlc3RfcmVhZChzZWxmKToKICAgICAgICAgZm9yIGFyZyBpbiAoTm9uZSwgNyk6CiAgICAgICAgICAgICByYXdpbyA9IHNlbGYuTW9ja1Jhd0lPKChiImFiYyIsIGIiZCIsIGIiZWZnIikpCkBAIC05MTgsNyArOTg0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCBmb3Ige306IHt9ICE9IDAiLmZvcm1hdChuLCByYXdpby5fZXh0cmFuZW91c19yZWFkcykpCiAKIAotY2xhc3MgQ0J1ZmZlcmVkUmVhZGVyVGVzdChCdWZmZXJlZFJlYWRlclRlc3QpOgorY2xhc3MgQ0J1ZmZlcmVkUmVhZGVyVGVzdChCdWZmZXJlZFJlYWRlclRlc3QsIFNpemVvZlRlc3QpOgogICAgIHRwID0gaW8uQnVmZmVyZWRSZWFkZXIKIAogICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgpAQCAtOTU5LDYgKzEwMjUsMTIgQEAKICAgICAgICAgc3VwcG9ydC5nY19jb2xsZWN0KCkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdyKCkgaXMgTm9uZSwgd3IpCiAKKyAgICBkZWYgdGVzdF9hcmdzX2Vycm9yKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxNzI3NQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFR5cGVFcnJvciwgIkJ1ZmZlcmVkUmVhZGVyIik6CisgICAgICAgICAgICBzZWxmLnRwKGlvLkJ5dGVzSU8oKSwgMTAyNCwgMTAyNCwgMTAyNCkKKworCiBjbGFzcyBQeUJ1ZmZlcmVkUmVhZGVyVGVzdChCdWZmZXJlZFJlYWRlclRlc3QpOgogICAgIHRwID0gcHlpby5CdWZmZXJlZFJlYWRlcgogCkBAIC05ODIsNiArMTA1NCwxNiBAQAogICAgICAgICBidWZpby5mbHVzaCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiIiLmpvaW4ocmF3aW8uX3dyaXRlX3N0YWNrKSwgYiJhYmNnaGkiKQogCisgICAgZGVmIHRlc3RfdW5pbml0aWFsaXplZChzZWxmKToKKyAgICAgICAgYnVmaW8gPSBzZWxmLnRwLl9fbmV3X18oc2VsZi50cCkKKyAgICAgICAgZGVsIGJ1ZmlvCisgICAgICAgIGJ1ZmlvID0gc2VsZi50cC5fX25ld19fKHNlbGYudHApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKChWYWx1ZUVycm9yLCBBdHRyaWJ1dGVFcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmluaXRpYWxpemVkfGhhcyBubyBhdHRyaWJ1dGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZpby53cml0ZSwgYicnKQorICAgICAgICBidWZpby5fX2luaXRfXyhzZWxmLk1vY2tSYXdJTygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZmlvLndyaXRlKGInJyksIDApCisKICAgICBkZWYgdGVzdF9kZXRhY2hfZmx1c2goc2VsZik6CiAgICAgICAgIHJhdyA9IHNlbGYuTW9ja1Jhd0lPKCkKICAgICAgICAgYnVmID0gc2VsZi50cChyYXcpCkBAIC0xMDk5LDYgKzExODEsMjggQEAKICAgICAgICAgYnVmaW8uZmx1c2goKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYWJjIiwgd3JpdGVyLl93cml0ZV9zdGFja1swXSkKIAorICAgIGRlZiB0ZXN0X3dyaXRlbGluZXMoc2VsZik6CisgICAgICAgIGwgPSBbYidhYicsIGInY2QnLCBiJ2VmJ10KKyAgICAgICAgd3JpdGVyID0gc2VsZi5Nb2NrUmF3SU8oKQorICAgICAgICBidWZpbyA9IHNlbGYudHAod3JpdGVyLCA4KQorICAgICAgICBidWZpby53cml0ZWxpbmVzKGwpCisgICAgICAgIGJ1ZmlvLmZsdXNoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJycuam9pbih3cml0ZXIuX3dyaXRlX3N0YWNrKSwgYidhYmNkZWYnKQorCisgICAgZGVmIHRlc3Rfd3JpdGVsaW5lc191c2VybGlzdChzZWxmKToKKyAgICAgICAgbCA9IFVzZXJMaXN0KFtiJ2FiJywgYidjZCcsIGInZWYnXSkKKyAgICAgICAgd3JpdGVyID0gc2VsZi5Nb2NrUmF3SU8oKQorICAgICAgICBidWZpbyA9IHNlbGYudHAod3JpdGVyLCA4KQorICAgICAgICBidWZpby53cml0ZWxpbmVzKGwpCisgICAgICAgIGJ1ZmlvLmZsdXNoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJycuam9pbih3cml0ZXIuX3dyaXRlX3N0YWNrKSwgYidhYmNkZWYnKQorCisgICAgZGVmIHRlc3Rfd3JpdGVsaW5lc19lcnJvcihzZWxmKToKKyAgICAgICAgd3JpdGVyID0gc2VsZi5Nb2NrUmF3SU8oKQorICAgICAgICBidWZpbyA9IHNlbGYudHAod3JpdGVyLCA4KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJ1ZmlvLndyaXRlbGluZXMsIFsxLCAyLCAzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBidWZpby53cml0ZWxpbmVzLCBOb25lKQorCiAgICAgZGVmIHRlc3RfZGVzdHJ1Y3RvcihzZWxmKToKICAgICAgICAgd3JpdGVyID0gc2VsZi5Nb2NrUmF3SU8oKQogICAgICAgICBidWZpbyA9IHNlbGYudHAod3JpdGVyLCA4KQpAQCAtMTE4MCw4ICsxMjg0LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKSk6CiAgICAgICAgICAgICBzZWxmLnRwKHNlbGYuTW9ja1Jhd0lPKCksIDgsIDEyKQogCisgICAgZGVmIHRlc3Rfd3JpdGVfZXJyb3Jfb25fY2xvc2Uoc2VsZik6CisgICAgICAgIHJhdyA9IHNlbGYuTW9ja1Jhd0lPKCkKKyAgICAgICAgZGVmIGJhZF93cml0ZShiKToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoKQorICAgICAgICByYXcud3JpdGUgPSBiYWRfd3JpdGUKKyAgICAgICAgYiA9IHNlbGYudHAocmF3KQorICAgICAgICBiLndyaXRlKGInc3BhbScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGIuY2xvc2UpICMgZXhjZXB0aW9uIG5vdCBzd2FsbG93ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGIuY2xvc2VkKQogCi1jbGFzcyBDQnVmZmVyZWRXcml0ZXJUZXN0KEJ1ZmZlcmVkV3JpdGVyVGVzdCk6CisKK2NsYXNzIENCdWZmZXJlZFdyaXRlclRlc3QoQnVmZmVyZWRXcml0ZXJUZXN0LCBTaXplb2ZUZXN0KToKICAgICB0cCA9IGlvLkJ1ZmZlcmVkV3JpdGVyCiAKICAgICBkZWYgdGVzdF9jb25zdHJ1Y3RvcihzZWxmKToKQEAgLTEyMTksNiArMTMzMywxMSBAQAogICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgInJiIikgYXMgZjoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksIGIiMTIzeHh4IikKIAorICAgIGRlZiB0ZXN0X2FyZ3NfZXJyb3Ioc2VsZik6CisgICAgICAgICMgSXNzdWUgIzE3Mjc1CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVHlwZUVycm9yLCAiQnVmZmVyZWRXcml0ZXIiKToKKyAgICAgICAgICAgIHNlbGYudHAoaW8uQnl0ZXNJTygpLCAxMDI0LCAxMDI0LCAxMDI0KQorCiAKIGNsYXNzIFB5QnVmZmVyZWRXcml0ZXJUZXN0KEJ1ZmZlcmVkV3JpdGVyVGVzdCk6CiAgICAgdHAgPSBweWlvLkJ1ZmZlcmVkV3JpdGVyCkBAIC0xMjI5LDYgKzEzNDgsMjAgQEAKICAgICAgICAgcGFpciA9IHNlbGYudHAoc2VsZi5Nb2NrUmF3SU8oKSwgc2VsZi5Nb2NrUmF3SU8oKSkKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwYWlyLmNsb3NlZCkKIAorICAgIGRlZiB0ZXN0X3VuaW5pdGlhbGl6ZWQoc2VsZik6CisgICAgICAgIHBhaXIgPSBzZWxmLnRwLl9fbmV3X18oc2VsZi50cCkKKyAgICAgICAgZGVsIHBhaXIKKyAgICAgICAgcGFpciA9IHNlbGYudHAuX19uZXdfXyhzZWxmLnRwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCgoVmFsdWVFcnJvciwgQXR0cmlidXRlRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5pbml0aWFsaXplZHxoYXMgbm8gYXR0cmlidXRlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpci5yZWFkLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCgoVmFsdWVFcnJvciwgQXR0cmlidXRlRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5pbml0aWFsaXplZHxoYXMgbm8gYXR0cmlidXRlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpci53cml0ZSwgYicnKQorICAgICAgICBwYWlyLl9faW5pdF9fKHNlbGYuTW9ja1Jhd0lPKCksIHNlbGYuTW9ja1Jhd0lPKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFpci5yZWFkKDApLCBiJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFpci53cml0ZShiJycpLCAwKQorCiAgICAgZGVmIHRlc3RfZGV0YWNoKHNlbGYpOgogICAgICAgICBwYWlyID0gc2VsZi50cChzZWxmLk1vY2tSYXdJTygpLCBzZWxmLk1vY2tSYXdJTygpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLlVuc3VwcG9ydGVkT3BlcmF0aW9uLCBwYWlyLmRldGFjaCkKQEAgLTEzNTYsNiArMTQ4OSwxMCBAQAogICAgICAgICBCdWZmZXJlZFJlYWRlclRlc3QudGVzdF9jb25zdHJ1Y3RvcihzZWxmKQogICAgICAgICBCdWZmZXJlZFdyaXRlclRlc3QudGVzdF9jb25zdHJ1Y3RvcihzZWxmKQogCisgICAgZGVmIHRlc3RfdW5pbml0aWFsaXplZChzZWxmKToKKyAgICAgICAgQnVmZmVyZWRSZWFkZXJUZXN0LnRlc3RfdW5pbml0aWFsaXplZChzZWxmKQorICAgICAgICBCdWZmZXJlZFdyaXRlclRlc3QudGVzdF91bmluaXRpYWxpemVkKHNlbGYpCisKICAgICBkZWYgdGVzdF9yZWFkX2FuZF93cml0ZShzZWxmKToKICAgICAgICAgcmF3ID0gc2VsZi5Nb2NrUmF3SU8oKGIiYXNkZiIsIGIiZ2hqayIpKQogICAgICAgICBydyA9IHNlbGYudHAocmF3LCA4KQpAQCAtMTU3MCw3ICsxNzA3LDggQEAKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhdy5nZXR2YWx1ZSgpLCBiJzFiXG4yZGVmXG4zXG4nKQogCiAKLWNsYXNzIENCdWZmZXJlZFJhbmRvbVRlc3QoQ0J1ZmZlcmVkUmVhZGVyVGVzdCwgQ0J1ZmZlcmVkV3JpdGVyVGVzdCwgQnVmZmVyZWRSYW5kb21UZXN0KToKK2NsYXNzIENCdWZmZXJlZFJhbmRvbVRlc3QoQ0J1ZmZlcmVkUmVhZGVyVGVzdCwgQ0J1ZmZlcmVkV3JpdGVyVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyZWRSYW5kb21UZXN0LCBTaXplb2ZUZXN0KToKICAgICB0cCA9IGlvLkJ1ZmZlcmVkUmFuZG9tCiAKICAgICBkZWYgdGVzdF9jb25zdHJ1Y3RvcihzZWxmKToKQEAgLTE1ODcsNiArMTcyNSwxMiBAQAogICAgICAgICBDQnVmZmVyZWRSZWFkZXJUZXN0LnRlc3RfZ2FyYmFnZV9jb2xsZWN0aW9uKHNlbGYpCiAgICAgICAgIENCdWZmZXJlZFdyaXRlclRlc3QudGVzdF9nYXJiYWdlX2NvbGxlY3Rpb24oc2VsZikKIAorICAgIGRlZiB0ZXN0X2FyZ3NfZXJyb3Ioc2VsZik6CisgICAgICAgICMgSXNzdWUgIzE3Mjc1CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVHlwZUVycm9yLCAiQnVmZmVyZWRSYW5kb20iKToKKyAgICAgICAgICAgIHNlbGYudHAoaW8uQnl0ZXNJTygpLCAxMDI0LCAxMDI0LCAxMDI0KQorCisKIGNsYXNzIFB5QnVmZmVyZWRSYW5kb21UZXN0KEJ1ZmZlcmVkUmFuZG9tVGVzdCk6CiAgICAgdHAgPSBweWlvLkJ1ZmZlcmVkUmFuZG9tCiAKQEAgLTIxODMsNiArMjMyNywyOCBAQAogICAgICAgICAgICAgcmVhZHMgKz0gYwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRzLCAiQSIqMTI3KyJcbkIiKQogCisgICAgZGVmIHRlc3Rfd3JpdGVsaW5lcyhzZWxmKToKKyAgICAgICAgbCA9IFsnYWInLCAnY2QnLCAnZWYnXQorICAgICAgICBidWYgPSBzZWxmLkJ5dGVzSU8oKQorICAgICAgICB0eHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoYnVmKQorICAgICAgICB0eHQud3JpdGVsaW5lcyhsKQorICAgICAgICB0eHQuZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi5nZXR2YWx1ZSgpLCBiJ2FiY2RlZicpCisKKyAgICBkZWYgdGVzdF93cml0ZWxpbmVzX3VzZXJsaXN0KHNlbGYpOgorICAgICAgICBsID0gVXNlckxpc3QoWydhYicsICdjZCcsICdlZiddKQorICAgICAgICBidWYgPSBzZWxmLkJ5dGVzSU8oKQorICAgICAgICB0eHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoYnVmKQorICAgICAgICB0eHQud3JpdGVsaW5lcyhsKQorICAgICAgICB0eHQuZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi5nZXR2YWx1ZSgpLCBiJ2FiY2RlZicpCisKKyAgICBkZWYgdGVzdF93cml0ZWxpbmVzX2Vycm9yKHNlbGYpOgorICAgICAgICB0eHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoc2VsZi5CeXRlc0lPKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdHh0LndyaXRlbGluZXMsIFsxLCAyLCAzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0eHQud3JpdGVsaW5lcywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0eHQud3JpdGVsaW5lcywgYidhYmMnKQorCiAgICAgZGVmIHRlc3RfaXNzdWUxMzk1XzEoc2VsZik6CiAgICAgICAgIHR4dCA9IHNlbGYuVGV4dElPV3JhcHBlcihzZWxmLkJ5dGVzSU8oc2VsZi50ZXN0ZGF0YSksIGVuY29kaW5nPSJhc2NpaSIpCiAKQEAgLTIzMDYsNiArMjQ3Miw3IEBACiAgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCkKICAgICAgICAgdHh0LmZsdXNoID0gYmFkX2ZsdXNoCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIHR4dC5jbG9zZSkgIyBleGNlcHRpb24gbm90IHN3YWxsb3dlZAorICAgICAgICBzZWxmLmFzc2VydFRydWUodHh0LmNsb3NlZCkKIAogICAgIGRlZiB0ZXN0X211bHRpX2Nsb3NlKHNlbGYpOgogICAgICAgICB0eHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoc2VsZi5CeXRlc0lPKHNlbGYudGVzdGRhdGEpLCBlbmNvZGluZz0iYXNjaWkiKQpAQCAtMjMyMCw2ICsyNDg3LDM5IEBACiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IpKToKICAgICAgICAgICAgIHR4dC5idWZmZXIgPSBidWYKIAorICAgIGRlZiB0ZXN0X3JlYWRfbm9uYnl0ZXMoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzE3MTA2CisgICAgICAgICMgQ3Jhc2ggd2hlbiB1bmRlcmx5aW5nIHJlYWQoKSByZXR1cm5zIG5vbi1ieXRlcworICAgICAgICBjbGFzcyBOb25ieXRlc1N0cmVhbShzZWxmLlN0cmluZ0lPKToKKyAgICAgICAgICAgIHJlYWQxID0gc2VsZi5TdHJpbmdJTy5yZWFkCisgICAgICAgIGNsYXNzIE5vbmJ5dGVzU3RyZWFtKHNlbGYuU3RyaW5nSU8pOgorICAgICAgICAgICAgcmVhZDEgPSBzZWxmLlN0cmluZ0lPLnJlYWQKKyAgICAgICAgdCA9IHNlbGYuVGV4dElPV3JhcHBlcihOb25ieXRlc1N0cmVhbSgnYScpKQorICAgICAgICB3aXRoIHNlbGYubWF5YmVSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIHQucmVhZCgxKQorICAgICAgICB0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKE5vbmJ5dGVzU3RyZWFtKCdhJykpCisgICAgICAgIHdpdGggc2VsZi5tYXliZVJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgdC5yZWFkbGluZSgpCisgICAgICAgIHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoTm9uYnl0ZXNTdHJlYW0oJ2EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnJlYWQoKSwgdSdhJykKKworICAgIGRlZiB0ZXN0X2lsbGVnYWxfZGVjb2RlcihzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTcxMDYKKyAgICAgICAgIyBDcmFzaCB3aGVuIGRlY29kZXIgcmV0dXJucyBub24tc3RyaW5nCisgICAgICAgIHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoc2VsZi5CeXRlc0lPKGInYWFhYWFhJyksIG5ld2xpbmU9J1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZz0ncXVvcHJpX2NvZGVjJykKKyAgICAgICAgd2l0aCBzZWxmLm1heWJlUmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICB0LnJlYWQoMSkKKyAgICAgICAgdCA9IHNlbGYuVGV4dElPV3JhcHBlcihzZWxmLkJ5dGVzSU8oYidhYWFhYWEnKSwgbmV3bGluZT0nXG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nPSdxdW9wcmlfY29kZWMnKQorICAgICAgICB3aXRoIHNlbGYubWF5YmVSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIHQucmVhZGxpbmUoKQorICAgICAgICB0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKHNlbGYuQnl0ZXNJTyhiJ2FhYWFhYScpLCBuZXdsaW5lPSdcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc9J3F1b3ByaV9jb2RlYycpCisgICAgICAgIHdpdGggc2VsZi5tYXliZVJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgdC5yZWFkKCkKKworCiBjbGFzcyBDVGV4dElPV3JhcHBlclRlc3QoVGV4dElPV3JhcHBlclRlc3QpOgogCiAgICAgZGVmIHRlc3RfaW5pdGlhbGl6YXRpb24oc2VsZik6CkBAIC0yMzYxLDkgKzI1NjEsMTMgQEAKICAgICAgICAgICAgIHQyLmJ1ZGR5ID0gdDEKICAgICAgICAgc3VwcG9ydC5nY19jb2xsZWN0KCkKIAorICAgIG1heWJlUmFpc2VzID0gdW5pdHRlc3QuVGVzdENhc2UuYXNzZXJ0UmFpc2VzCisKIAogY2xhc3MgUHlUZXh0SU9XcmFwcGVyVGVzdChUZXh0SU9XcmFwcGVyVGVzdCk6Ci0gICAgcGFzcworICAgIEBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCisgICAgZGVmIG1heWJlUmFpc2VzKHNlbGYsICphcmdzLCAqKmt3ZHMpOgorICAgICAgICB5aWVsZAogCiAKIGNsYXNzIEluY3JlbWVudGFsTmV3bGluZURlY29kZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTI3MjUsNyArMjkyOSw3IEBACiAgICAgICAgICAgICAjIFRoZSBidWZmZXJlZCBJTyBsYXllciBtdXN0IGNoZWNrIGZvciBwZW5kaW5nIHNpZ25hbAogICAgICAgICAgICAgIyBoYW5kbGVycywgd2hpY2ggaW4gdGhpcyBjYXNlIHdpbGwgaW52b2tlIGFsYXJtX2ludGVycnVwdCgpLgogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW8ud3JpdGUsIGl0ZW0gKiAoMTAyNCAqIDEwMjQpKQorICAgICAgICAgICAgICAgICAgICAgICAgd2lvLndyaXRlLCBpdGVtICogKHN1cHBvcnQuUElQRV9NQVhfU0laRSAvLyBsZW4oaXRlbSkgKyAxKSkKICAgICAgICAgICAgIHQuam9pbigpCiAgICAgICAgICAgICAjIFdlIGdvdCBvbmUgYnl0ZSwgZ2V0IGFub3RoZXIgb25lIGFuZCBjaGVjayB0aGF0IGl0IGlzbid0IGEKICAgICAgICAgICAgICMgcmVwZWF0IG9mIHRoZSBmaXJzdCBvbmUuCkBAIC0yODIzLDcgKzMwMjcsNyBAQAogICAgICAgICBzZWxlY3QgPSBzdXBwb3J0LmltcG9ydF9tb2R1bGUoInNlbGVjdCIpCiAgICAgICAgICMgQSBxdWFudGl0eSB0aGF0IGV4Y2VlZHMgdGhlIGJ1ZmZlciBzaXplIG9mIGFuIGFub255bW91cyBwaXBlJ3MKICAgICAgICAgIyB3cml0ZSBlbmQuCi0gICAgICAgIE4gPSAxMDI0ICogMTAyNAorICAgICAgICBOID0gc3VwcG9ydC5QSVBFX01BWF9TSVpFCiAgICAgICAgIHIsIHcgPSBvcy5waXBlKCkKICAgICAgICAgZmRvcGVuX2t3YXJnc1siY2xvc2VmZCJdID0gRmFsc2UKICAgICAgICAgIyBXZSBuZWVkIGEgc2VwYXJhdGUgdGhyZWFkIHRvIHJlYWQgZnJvbSB0aGUgcGlwZSBhbmQgYWxsb3cgdGhlCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2l0ZXIucHkgYi9MaWIvdGVzdC90ZXN0X2l0ZXIucHkKaW5kZXggNjQ5ODRjYy4uYmQxYjMyZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pdGVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaXRlci5weQpAQCAtNTI2LDcgKzUyNiw3IEBACiAgICAgICAgIGQgPSB7Im9uZSI6IDEsICJ0d28iOiAyLCAidGhyZWUiOiAzfQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZHVjZShhZGQsIGQpLCAiIi5qb2luKGQua2V5cygpKSkKIAotICAgICMgVGhpcyB0ZXN0IGNhc2Ugd2lsbCBiZSByZW1vdmVkIGlmIHdlIGRvbid0IGhhdmUgVW5pY29kZQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhdmVfdW5pY29kZSwgJ25lZWRzIHVuaWNvZGUgc3VwcG9ydCcpCiAgICAgZGVmIHRlc3RfdW5pY29kZV9qb2luX2VuZGNhc2Uoc2VsZik6CiAKICAgICAgICAgIyBUaGlzIGNsYXNzIGluc2VydHMgYSBVbmljb2RlIG9iamVjdCBpbnRvIGl0cyBhcmd1bWVudCdzIG5hdHVyYWwKQEAgLTU2Nyw4ICs1NjcsNiBAQAogICAgICAgICAgICAgICAgIHVubGluayhURVNURk4pCiAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgICAgICBwYXNzCi0gICAgaWYgbm90IGhhdmVfdW5pY29kZToKLSAgICAgICAgZGVmIHRlc3RfdW5pY29kZV9qb2luX2VuZGNhc2Uoc2VsZik6IHBhc3MKIAogICAgICMgVGVzdCBpdGVyYXRvcnMgd2l0aCAneCBpbiB5JyBhbmQgJ3ggbm90IGluIHknLgogICAgIGRlZiB0ZXN0X2luX2FuZF9ub3RfaW4oc2VsZik6CkBAIC05MDgsNiArOTA2LDIxIEBACiAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICBwYXNzCiAKKyAgICBkZWYgdGVzdF9leHRlbmRpbmdfbGlzdF93aXRoX2l0ZXJhdG9yX2RvZXNfbm90X3NlZ2ZhdWx0KHNlbGYpOgorICAgICAgICAjIFRoZSBjb2RlIHRvIGV4dGVuZCBhIGxpc3Qgd2l0aCBhbiBpdGVyYXRvciBoYXMgYSBmYWlyCisgICAgICAgICMgYW1vdW50IG9mIG5vbnRyaXZpYWwgbG9naWMgaW4gdGVybXMgb2YgZ3Vlc3NpbmcgaG93CisgICAgICAgICMgbXVjaCBtZW1vcnkgdG8gYWxsb2NhdGUgaW4gYWR2YW5jZSwgInN0ZWFsaW5nIiByZWZzLAorICAgICAgICAjIGFuZCB0aGVuIHNocmlua2luZyBhdCB0aGUgZW5kLiAgVGhpcyBpcyBhIGJhc2ljIHNtb2tlCisgICAgICAgICMgdGVzdCBmb3IgdGhhdCBzY2VuYXJpby4KKyAgICAgICAgZGVmIGdlbigpOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNTAwKToKKyAgICAgICAgICAgICAgICB5aWVsZCBpCisgICAgICAgIGxzdCA9IFswXSAqIDUwMAorICAgICAgICBmb3IgaSBpbiByYW5nZSgyNDApOgorICAgICAgICAgICAgbHN0LnBvcCgwKQorICAgICAgICBsc3QuZXh0ZW5kKGdlbigpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsc3QpLCA3NjApCisKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHJ1bl91bml0dGVzdChUZXN0Q2FzZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaXRlcnRvb2xzLnB5IGIvTGliL3Rlc3QvdGVzdF9pdGVydG9vbHMucHkKaW5kZXggY2NkYmY4YS4uMWJmNmM1MyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pdGVydG9vbHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pdGVydG9vbHMucHkKQEAgLTEsNyArMSw3IEBACiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiBmcm9tIGl0ZXJ0b29scyBpbXBvcnQgKgotZnJvbSB3ZWFrcmVmIGltcG9ydCBwcm94eQoraW1wb3J0IHdlYWtyZWYKIGZyb20gZGVjaW1hbCBpbXBvcnQgRGVjaW1hbAogZnJvbSBmcmFjdGlvbnMgaW1wb3J0IEZyYWN0aW9uCiBpbXBvcnQgc3lzCkBAIC0yNzQsNyArMjc0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGxpc3QocGVybXV0YXRpb25zKHZhbHVlcywgTm9uZSkpKSAjIHRlc3QgciBhcyBOb25lCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBsaXN0KHBlcm11dGF0aW9ucyh2YWx1ZXMpKSkgICAgICAgIyB0ZXN0IGRlZmF1bHQgcgogCi0gICAgQHRlc3Rfc3VwcG9ydC5pbXBsX2RldGFpbCgidHVwbGUgcmVzdXNlIGlzIENQeXRob24gc3BlY2lmaWMiKQorICAgIEB0ZXN0X3N1cHBvcnQuaW1wbF9kZXRhaWwoInR1cGxlIHJldXNlIGlzIHNwZWNpZmljIHRvIENQeXRob24iKQogICAgIGRlZiB0ZXN0X3Blcm11dGF0aW9uc190dXBsZV9yZXVzZShzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2V0KG1hcChpZCwgcGVybXV0YXRpb25zKCdhYmNkZScsIDMpKSkpLCAxKQogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGxlbihzZXQobWFwKGlkLCBsaXN0KHBlcm11dGF0aW9ucygnYWJjZGUnLCAzKSkpKSksIDEpCkBAIC01MzYsNyArNTM2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICB6aXAoJ2FiYycsICdkZWYnKSkKIAogICAgIEB0ZXN0X3N1cHBvcnQuaW1wbF9kZXRhaWwoInR1cGxlIHJldXNlIGlzIHNwZWNpZmljIHRvIENQeXRob24iKQotICAgIGRlZiB0ZXN0X2l6aXBfdHVwbGVfcmVzdXNlKHNlbGYpOgorICAgIGRlZiB0ZXN0X2l6aXBfdHVwbGVfcmV1c2Uoc2VsZik6CiAgICAgICAgIGlkcyA9IG1hcChpZCwgaXppcCgnYWJjJywgJ2RlZicpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1pbihpZHMpLCBtYXgoaWRzKSkKICAgICAgICAgaWRzID0gbWFwKGlkLCBsaXN0KGl6aXAoJ2FiYycsICdkZWYnKSkpCkBAIC02OTgsNiArNjk4LDkgQEAKIAogICAgIGRlZiB0ZXN0X3JlcGVhdChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHJlcGVhdChvYmplY3Q9J2EnLCB0aW1lcz0zKSksIFsnYScsICdhJywgJ2EnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHJlcGVhdChvYmplY3Q9J2EnLCB0aW1lcz0wKSksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocmVwZWF0KG9iamVjdD0nYScsIHRpbWVzPS0xKSksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocmVwZWF0KG9iamVjdD0nYScsIHRpbWVzPS0yKSksIFtdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcCh4cmFuZ2UoMykscmVwZWF0KCdhJykpLAogICAgICAgICAgICAgICAgICAgICAgICAgIFsoMCwgJ2EnKSwgKDEsICdhJyksICgyLCAnYScpXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHJlcGVhdCgnYScsIDMpKSwgWydhJywgJ2EnLCAnYSddKQpAQCAtNzE0LDYgKzcxNywxMiBAQAogICAgICAgICBsaXN0KHIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihyKSwgJ3JlcGVhdCgoMSswaiksIDApJykKIAorICAgIGRlZiB0ZXN0X3JlcGVhdF93aXRoX25lZ2F0aXZlX3RpbWVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIocmVwZWF0KCdhJywgLTEpKSwgInJlcGVhdCgnYScsIDApIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHJlcGVhdCgnYScsIC0yKSksICJyZXBlYXQoJ2EnLCAwKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihyZXBlYXQoJ2EnLCB0aW1lcz0tMSkpLCAicmVwZWF0KCdhJywgMCkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIocmVwZWF0KCdhJywgdGltZXM9LTIpKSwgInJlcGVhdCgnYScsIDApIikKKwogICAgIGRlZiB0ZXN0X2ltYXAoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpbWFwKG9wZXJhdG9yLnBvdywgcmFuZ2UoMyksIHJhbmdlKDEsNykpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBbMCoqMSwgMSoqMiwgMioqM10pCkBAIC03OTIsNiArODAxLDE1IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpc2xpY2UoYywgMSwgMywgNTApKSwgWzFdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5leHQoYyksIDMpCiAKKyAgICAgICAgIyBJc3N1ZSAjMjEzMjE6IGNoZWNrIHNvdXJjZSBpdGVyYXRvciBpcyBub3QgcmVmZXJlbmNlZAorICAgICAgICAjIGZyb20gaXNsaWNlKCkgYWZ0ZXIgdGhlIGxhdHRlciBoYXMgYmVlbiBleGhhdXN0ZWQKKyAgICAgICAgaXQgPSAoeCBmb3IgeCBpbiAoMSwgMikpCisgICAgICAgIHdyID0gd2Vha3JlZi5yZWYoaXQpCisgICAgICAgIGl0ID0gaXNsaWNlKGl0LCAxKQorICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZSh3cigpKQorICAgICAgICBsaXN0KGl0KSAjIGV4aGF1c3QgdGhlIGl0ZXJhdG9yCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHdyKCkpCisKICAgICBkZWYgdGVzdF90YWtld2hpbGUoc2VsZik6CiAgICAgICAgIGRhdGEgPSBbMSwgMywgNSwgMjAsIDIsIDQsIDYsIDhdCiAgICAgICAgIHVuZGVydGVuID0gbGFtYmRhIHg6IHg8MTAKQEAgLTkwMSwxMSArOTE5LDE3IEBACiAKICAgICAgICAgIyB0ZXN0IHRoYXQgdGVlIG9iamVjdHMgYXJlIHdlYWsgcmVmZXJlbmNhYmxlCiAgICAgICAgIGEsIGIgPSB0ZWUoeHJhbmdlKDEwKSkKLSAgICAgICAgcCA9IHByb3h5KGEpCisgICAgICAgIHAgPSB3ZWFrcmVmLnByb3h5KGEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXR0cihwLCAnX19jbGFzc19fJyksIHR5cGUoYikpCiAgICAgICAgIGRlbCBhCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJlZmVyZW5jZUVycm9yLCBnZXRhdHRyLCBwLCAnX19jbGFzc19fJykKIAorICAgICMgSXNzdWUgMTM0NTQ6IENyYXNoIHdoZW4gZGVsZXRpbmcgYmFja3dhcmQgaXRlcmF0b3IgZnJvbSB0ZWUoKQorICAgIGRlZiB0ZXN0X3RlZV9kZWxfYmFja3dhcmQoc2VsZik6CisgICAgICAgIGZvcndhcmQsIGJhY2t3YXJkID0gdGVlKHJlcGVhdChOb25lLCAyMDAwMDAwMCkpCisgICAgICAgIGFueShmb3J3YXJkKSAgIyBleGhhdXN0IHRoZSBpdGVyYXRvcgorICAgICAgICBkZWwgYmFja3dhcmQKKwogICAgIGRlZiB0ZXN0X1N0b3BJdGVyYXRpb24oc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIGl6aXAoKS5uZXh0KQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2txdWV1ZS5weSBiL0xpYi90ZXN0L3Rlc3Rfa3F1ZXVlLnB5CmluZGV4IGU1ZWVjZmEuLjNkZmZjNzMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfa3F1ZXVlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfa3F1ZXVlLnB5CkBAIC03MCwxMyArNzAsMTMgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldiwgZXYpCiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZXYsIG90aGVyKQogCi0gICAgICAgIGJpZ251bSA9IHN5cy5tYXhzaXplICogMiArIDEKLSAgICAgICAgZXYgPSBzZWxlY3Qua2V2ZW50KGJpZ251bSwgMSwgMiwgMywgc3lzLm1heHNpemUsIGJpZ251bSkKKyAgICAgICAgYmlnbnVtID0gMHg3ZmZmCisgICAgICAgIGV2ID0gc2VsZWN0LmtldmVudChiaWdudW0sIDEsIDIsIDMsIGJpZ251bSAtIDEsIGJpZ251bSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldi5pZGVudCwgYmlnbnVtKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LmZpbHRlciwgMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldi5mbGFncywgMikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldi5mZmxhZ3MsIDMpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXYuZGF0YSwgc3lzLm1heHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXYuZGF0YSwgYmlnbnVtIC0gMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldi51ZGF0YSwgYmlnbnVtKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LCBldikKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChldiwgb3RoZXIpCkBAIC05NiwxMSArOTYsNiBAQAogICAgICAgICAgICAgcGFzcyAjIEZyZWVCU0QgZG9lc24ndCByYWlzZSBhbiBleGNlcHRpb24gaGVyZQogICAgICAgICBzZXJ2ZXIsIGFkZHIgPSBzZXJ2ZXJTb2NrZXQuYWNjZXB0KCkKIAotICAgICAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgiZGFyd2luIik6Ci0gICAgICAgICAgICBmbGFncyA9IHNlbGVjdC5LUV9FVl9BREQgfCBzZWxlY3QuS1FfRVZfRU5BQkxFCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBmbGFncyA9IDAKLQogICAgICAgICBrcSA9IHNlbGVjdC5rcXVldWUoKQogICAgICAgICBrcTIgPSBzZWxlY3Qua3F1ZXVlLmZyb21mZChrcS5maWxlbm8oKSkKIApAQCAtMTIyLDExICsxMTcsMTAgQEAKICAgICAgICAga3EyLmNvbnRyb2woW2V2XSwgMCkKIAogICAgICAgICBldmVudHMgPSBrcS5jb250cm9sKE5vbmUsIDQsIDEpCi0gICAgICAgIGV2ZW50cyA9IFsoZS5pZGVudCwgZS5maWx0ZXIsIGUuZmxhZ3MpIGZvciBlIGluIGV2ZW50c10KLSAgICAgICAgZXZlbnRzLnNvcnQoKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2ZW50cywgWwotICAgICAgICAgICAgKGNsaWVudC5maWxlbm8oKSwgc2VsZWN0LktRX0ZJTFRFUl9XUklURSwgZmxhZ3MpLAotICAgICAgICAgICAgKHNlcnZlci5maWxlbm8oKSwgc2VsZWN0LktRX0ZJTFRFUl9XUklURSwgZmxhZ3MpXSkKKyAgICAgICAgZXZlbnRzID0gc2V0KChlLmlkZW50LCBlLmZpbHRlcikgZm9yIGUgaW4gZXZlbnRzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2ZW50cywgc2V0KFsKKyAgICAgICAgICAgIChjbGllbnQuZmlsZW5vKCksIHNlbGVjdC5LUV9GSUxURVJfV1JJVEUpLAorICAgICAgICAgICAgKHNlcnZlci5maWxlbm8oKSwgc2VsZWN0LktRX0ZJTFRFUl9XUklURSldKSkKIAogICAgICAgICBjbGllbnQuc2VuZCgiSGVsbG8hIikKICAgICAgICAgc2VydmVyLnNlbmQoIndvcmxkISEhIikKQEAgLTE0MCwxNCArMTM0LDEyIEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwoJ3RpbWVvdXQgd2FpdGluZyBmb3IgZXZlbnQgbm90aWZpY2F0aW9ucycpCiAKLSAgICAgICAgZXZlbnRzID0gWyhlLmlkZW50LCBlLmZpbHRlciwgZS5mbGFncykgZm9yIGUgaW4gZXZlbnRzXQotICAgICAgICBldmVudHMuc29ydCgpCi0KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmVudHMsIFsKLSAgICAgICAgICAgIChjbGllbnQuZmlsZW5vKCksIHNlbGVjdC5LUV9GSUxURVJfV1JJVEUsIGZsYWdzKSwKLSAgICAgICAgICAgIChjbGllbnQuZmlsZW5vKCksIHNlbGVjdC5LUV9GSUxURVJfUkVBRCwgZmxhZ3MpLAotICAgICAgICAgICAgKHNlcnZlci5maWxlbm8oKSwgc2VsZWN0LktRX0ZJTFRFUl9XUklURSwgZmxhZ3MpLAotICAgICAgICAgICAgKHNlcnZlci5maWxlbm8oKSwgc2VsZWN0LktRX0ZJTFRFUl9SRUFELCBmbGFncyldKQorICAgICAgICBldmVudHMgPSBzZXQoKGUuaWRlbnQsIGUuZmlsdGVyKSBmb3IgZSBpbiBldmVudHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZlbnRzLCBzZXQoWworICAgICAgICAgICAgKGNsaWVudC5maWxlbm8oKSwgc2VsZWN0LktRX0ZJTFRFUl9XUklURSksCisgICAgICAgICAgICAoY2xpZW50LmZpbGVubygpLCBzZWxlY3QuS1FfRklMVEVSX1JFQUQpLAorICAgICAgICAgICAgKHNlcnZlci5maWxlbm8oKSwgc2VsZWN0LktRX0ZJTFRFUl9XUklURSksCisgICAgICAgICAgICAoc2VydmVyLmZpbGVubygpLCBzZWxlY3QuS1FfRklMVEVSX1JFQUQpXSkpCiAKICAgICAgICAgIyBSZW1vdmUgY29tcGxldGVseSBjbGllbnQsIGFuZCBzZXJ2ZXIgcmVhZCBwYXJ0CiAgICAgICAgIGV2ID0gc2VsZWN0LmtldmVudChjbGllbnQuZmlsZW5vKCksCkBAIC0xNjQsMTAgKzE1Niw5IEBACiAgICAgICAgIGtxLmNvbnRyb2woW2V2XSwgMCwgMCkKIAogICAgICAgICBldmVudHMgPSBrcS5jb250cm9sKFtdLCA0LCAwLjk5KQotICAgICAgICBldmVudHMgPSBbKGUuaWRlbnQsIGUuZmlsdGVyLCBlLmZsYWdzKSBmb3IgZSBpbiBldmVudHNdCi0gICAgICAgIGV2ZW50cy5zb3J0KCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmVudHMsIFsKLSAgICAgICAgICAgIChzZXJ2ZXIuZmlsZW5vKCksIHNlbGVjdC5LUV9GSUxURVJfV1JJVEUsIGZsYWdzKV0pCisgICAgICAgIGV2ZW50cyA9IHNldCgoZS5pZGVudCwgZS5maWx0ZXIpIGZvciBlIGluIGV2ZW50cykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmVudHMsIHNldChbCisgICAgICAgICAgICAoc2VydmVyLmZpbGVubygpLCBzZWxlY3QuS1FfRklMVEVSX1dSSVRFKV0pKQogCiAgICAgICAgIGNsaWVudC5jbG9zZSgpCiAgICAgICAgIHNlcnZlci5jbG9zZSgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2xvY2FsZS5weSBiL0xpYi90ZXN0L3Rlc3RfbG9jYWxlLnB5CmluZGV4IGE4OGQzNGIuLmNkNGQ0NmQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbG9jYWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbG9jYWxlLnB5CkBAIC0xLDUgKzEsNCBAQAogZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCB2ZXJib3NlCi1mcm9tIHBsYXRmb3JtIGltcG9ydCBsaW51eF9kaXN0cmlidXRpb24KIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IGxvY2FsZQogaW1wb3J0IHN5cwpAQCAtMzczLDYgKzM3Miw3NyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnXHhlY1x4YTBceGJjJy5zcGxpdCgpLCBbJ1x4ZWNceGEwXHhiYyddKQogCiAKK2NsYXNzIE5vcm1hbGl6ZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBjaGVjayhzZWxmLCBsb2NhbGVuYW1lLCBleHBlY3RlZCk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9jYWxlLm5vcm1hbGl6ZShsb2NhbGVuYW1lKSwgZXhwZWN0ZWQsIG1zZz1sb2NhbGVuYW1lKQorCisgICAgZGVmIHRlc3RfbG9jYWxlX2FsaWFzKHNlbGYpOgorICAgICAgICBmb3IgbG9jYWxlbmFtZSwgYWxpYXMgaW4gbG9jYWxlLmxvY2FsZV9hbGlhcy5pdGVtcygpOgorICAgICAgICAgICAgc2VsZi5jaGVjayhsb2NhbGVuYW1lLCBhbGlhcykKKworICAgIGRlZiB0ZXN0X2VtcHR5KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrKCcnLCAnJykKKworICAgIGRlZiB0ZXN0X2Moc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soJ2MnLCAnQycpCisgICAgICAgIHNlbGYuY2hlY2soJ3Bvc2l4JywgJ0MnKQorCisgICAgZGVmIHRlc3RfZW5nbGlzaChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygnZW4nLCAnZW5fVVMuSVNPODg1OS0xJykKKyAgICAgICAgc2VsZi5jaGVjaygnRU4nLCAnZW5fVVMuSVNPODg1OS0xJykKKyAgICAgICAgc2VsZi5jaGVjaygnZW5fVVMnLCAnZW5fVVMuSVNPODg1OS0xJykKKyAgICAgICAgc2VsZi5jaGVjaygnZW5fdXMnLCAnZW5fVVMuSVNPODg1OS0xJykKKyAgICAgICAgc2VsZi5jaGVjaygnZW5fR0InLCAnZW5fR0IuSVNPODg1OS0xJykKKyAgICAgICAgc2VsZi5jaGVjaygnZW5fVVMuVVRGLTgnLCAnZW5fVVMuVVRGLTgnKQorICAgICAgICBzZWxmLmNoZWNrKCdlbl9VUy51dGY4JywgJ2VuX1VTLlVURi04JykKKyAgICAgICAgc2VsZi5jaGVjaygnZW5fVVM6VVRGLTgnLCAnZW5fVVMuVVRGLTgnKQorICAgICAgICBzZWxmLmNoZWNrKCdlbl9VUy5JU084ODU5LTEnLCAnZW5fVVMuSVNPODg1OS0xJykKKyAgICAgICAgc2VsZi5jaGVjaygnZW5fVVMuVVMtQVNDSUknLCAnZW5fVVMuSVNPODg1OS0xJykKKyAgICAgICAgc2VsZi5jaGVjaygnZW5nbGlzaCcsICdlbl9FTi5JU084ODU5LTEnKQorCisgICAgZGVmIHRlc3RfaHlwaGVuYXRlZF9lbmNvZGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygnYXpfQVouaXNvODg1OTllJywgJ2F6X0FaLklTTzg4NTktOUUnKQorICAgICAgICBzZWxmLmNoZWNrKCdhel9BWi5JU084ODU5LTlFJywgJ2F6X0FaLklTTzg4NTktOUUnKQorICAgICAgICBzZWxmLmNoZWNrKCd0dF9SVS5rb2k4YycsICd0dF9SVS5LT0k4LUMnKQorICAgICAgICBzZWxmLmNoZWNrKCd0dF9SVS5LT0k4LUMnLCAndHRfUlUuS09JOC1DJykKKyAgICAgICAgc2VsZi5jaGVjaygnbG9fTEEuY3AxMTMzJywgJ2xvX0xBLklCTS1DUDExMzMnKQorICAgICAgICBzZWxmLmNoZWNrKCdsb19MQS5pYm1jcDExMzMnLCAnbG9fTEEuSUJNLUNQMTEzMycpCisgICAgICAgIHNlbGYuY2hlY2soJ2xvX0xBLklCTS1DUDExMzMnLCAnbG9fTEEuSUJNLUNQMTEzMycpCisgICAgICAgIHNlbGYuY2hlY2soJ3VrX3VhLm1pY3Jvc29mdGNwMTI1MScsICd1a19VQS5DUDEyNTEnKQorICAgICAgICBzZWxmLmNoZWNrKCd1a191YS5taWNyb3NvZnQtY3AxMjUxJywgJ3VrX1VBLkNQMTI1MScpCisgICAgICAgIHNlbGYuY2hlY2soJ2thX2dlLmdlb3JnaWFuYWNhZGVteScsICdrYV9HRS5HRU9SR0lBTi1BQ0FERU1ZJykKKyAgICAgICAgc2VsZi5jaGVjaygna2FfR0UuR0VPUkdJQU4tQUNBREVNWScsICdrYV9HRS5HRU9SR0lBTi1BQ0FERU1ZJykKKyAgICAgICAgc2VsZi5jaGVjaygnY3NfQ1ouaXNvODg1OTInLCAnY3NfQ1ouSVNPODg1OS0yJykKKyAgICAgICAgc2VsZi5jaGVjaygnY3NfQ1ouSVNPODg1OS0yJywgJ2NzX0NaLklTTzg4NTktMicpCisKKyAgICBkZWYgdGVzdF9ldXJvX21vZGlmaWVyKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrKCdkZV9ERUBldXJvJywgJ2RlX0RFLklTTzg4NTktMTUnKQorICAgICAgICBzZWxmLmNoZWNrKCdlbl9VUy5JU084ODU5LTE1QGV1cm8nLCAnZW5fVVMuSVNPODg1OS0xNScpCisKKyAgICBkZWYgdGVzdF9sYXRpbl9tb2RpZmllcihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygnYmVfQlkuVVRGLThAbGF0aW4nLCAnYmVfQlkuVVRGLThAbGF0aW4nKQorICAgICAgICBzZWxmLmNoZWNrKCdzcl9SUy5VVEYtOEBsYXRpbicsICdzcl9SUy5VVEYtOEBsYXRpbicpCisKKyAgICBkZWYgdGVzdF92YWxlbmNpYV9tb2RpZmllcihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygnY2FfRVMuVVRGLThAdmFsZW5jaWEnLCAnY2FfRVMuVVRGLThAdmFsZW5jaWEnKQorICAgICAgICBzZWxmLmNoZWNrKCdjYV9FU0B2YWxlbmNpYScsICdjYV9FUy5JU084ODU5LTFAdmFsZW5jaWEnKQorICAgICAgICBzZWxmLmNoZWNrKCdjYUB2YWxlbmNpYScsICdjYV9FUy5JU084ODU5LTFAdmFsZW5jaWEnKQorCisgICAgZGVmIHRlc3RfZGV2YW5hZ2FyaV9tb2RpZmllcihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygna3NfSU4uVVRGLThAZGV2YW5hZ2FyaScsICdrc19JTi5VVEYtOEBkZXZhbmFnYXJpJykKKyAgICAgICAgc2VsZi5jaGVjaygna3NfSU5AZGV2YW5hZ2FyaScsICdrc19JTi5VVEYtOEBkZXZhbmFnYXJpJykKKyAgICAgICAgc2VsZi5jaGVjaygna3NAZGV2YW5hZ2FyaScsICdrc19JTi5VVEYtOEBkZXZhbmFnYXJpJykKKyAgICAgICAgc2VsZi5jaGVjaygna3NfSU4uVVRGLTgnLCAna3NfSU4uVVRGLTgnKQorICAgICAgICBzZWxmLmNoZWNrKCdrc19JTicsICdrc19JTi5VVEYtOCcpCisgICAgICAgIHNlbGYuY2hlY2soJ2tzJywgJ2tzX0lOLlVURi04JykKKyAgICAgICAgc2VsZi5jaGVjaygnc2RfSU4uVVRGLThAZGV2YW5hZ2FyaScsICdzZF9JTi5VVEYtOEBkZXZhbmFnYXJpJykKKyAgICAgICAgc2VsZi5jaGVjaygnc2RfSU5AZGV2YW5hZ2FyaScsICdzZF9JTi5VVEYtOEBkZXZhbmFnYXJpJykKKyAgICAgICAgc2VsZi5jaGVjaygnc2RAZGV2YW5hZ2FyaScsICdzZF9JTi5VVEYtOEBkZXZhbmFnYXJpJykKKyAgICAgICAgc2VsZi5jaGVjaygnc2RfSU4uVVRGLTgnLCAnc2RfSU4uVVRGLTgnKQorICAgICAgICBzZWxmLmNoZWNrKCdzZF9JTicsICdzZF9JTi5VVEYtOCcpCisgICAgICAgIHNlbGYuY2hlY2soJ3NkJywgJ3NkX0lOLlVURi04JykKKworCiBjbGFzcyBUZXN0TWlzY2VsbGFuZW91cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfZ2V0cHJlZmVycmVkZW5jb2Rpbmcoc2VsZik6CiAgICAgICAgICMgSW52b2tlIGdldHByZWZlcnJlZGVuY29kaW5nIHRvIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBjYXVzZSBleGNlcHRpb25zLgpAQCAtMzk3LDE5ICs0NjcsMjUgQEAKICAgICAgICAgIyBjcmFzaGVyIGZyb20gYnVnICM3NDE5CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGxvY2FsZS5FcnJvciwgbG9jYWxlLnNldGxvY2FsZSwgMTIzNDUpCiAKLSAgICBAdW5pdHRlc3Quc2tpcElmKGxpbnV4X2Rpc3RyaWJ1dGlvbigpWzBdID09ICdGZWRvcmEnLCAiRmVkb3JhIHNldGxvY2FsZSgpICIKLSAgICAgICAgICAgICAgICAgICAgICJidWc6IGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9NzI2NTM2IikKICAgICBkZWYgdGVzdF9nZXRzZXRsb2NhbGVfaXNzdWUxODEzKHNlbGYpOgogICAgICAgICAjIElzc3VlICMxODEzOiBzZXR0aW5nIGFuZCBnZXR0aW5nIHRoZSBsb2NhbGUgdW5kZXIgYSBUdXJraXNoIGxvY2FsZQogICAgICAgICBvbGRsb2NhbGUgPSBsb2NhbGUuZ2V0bG9jYWxlKCkKICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKGxvY2FsZS5zZXRsb2NhbGUsIGxvY2FsZS5MQ19DVFlQRSwgb2xkbG9jYWxlKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19DVFlQRSwgJ3RyX1RSJykKLSAgICAgICAgZXhjZXB0IGxvY2FsZS5FcnJvcjoKKyAgICAgICAgZm9yIGxvYyBpbiAoJ3RyX1RSJywgJ3RyX1RSLlVURi04JywgJ3RyX1RSLklTTzg4NTktOScpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX0NUWVBFLCBsb2MpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGV4Y2VwdCBsb2NhbGUuRXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZWxzZToKICAgICAgICAgICAgICMgVW5zdXBwb3J0ZWQgbG9jYWxlIG9uIHRoaXMgc3lzdGVtCiAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCd0ZXN0IG5lZWRzIFR1cmtpc2ggbG9jYWxlJykKICAgICAgICAgbG9jID0gbG9jYWxlLmdldGxvY2FsZSgpCi0gICAgICAgIGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX0NUWVBFLCBsb2MpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX0NUWVBFLCBsb2MpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiRmFpbGVkIHRvIHNldCBsb2NhbGUgJXIgKGRlZmF1bHQgbG9jYWxlIGlzICVyKTogJXIiICUKKyAgICAgICAgICAgICAgICAgICAgICAobG9jLCBvbGRsb2NhbGUsIGUpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvYywgbG9jYWxlLmdldGxvY2FsZSgpKQogCiAgICAgZGVmIHRlc3Rfbm9ybWFsaXplX2lzc3VlMTI3NTIoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2xvZ2dpbmcucHkgYi9MaWIvdGVzdC90ZXN0X2xvZ2dpbmcucHkKaW5kZXggMmFhYzM2MC4uNjc3ZjAxMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9sb2dnaW5nLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbG9nZ2luZy5weQpAQCAtMSw2ICsxLDQgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotIwotIyBDb3B5cmlnaHQgMjAwMS0yMDEwIGJ5IFZpbmF5IFNhamlwLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBDb3B5cmlnaHQgMjAwMS0yMDEzIGJ5IFZpbmF5IFNhamlwLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogIwogIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKICMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLApAQCAtMTgsNyArMTYsNyBAQAogCiAiIiJUZXN0IGhhcm5lc3MgZm9yIHRoZSBsb2dnaW5nIG1vZHVsZS4gUnVuIGFsbCB0ZXN0cy4KIAotQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgVmluYXkgU2FqaXAuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBWaW5heSBTYWppcC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICIiIgogCiBpbXBvcnQgbG9nZ2luZwpAQCAtMzEsNiArMjksNyBAQAogaW1wb3J0IGdjCiBpbXBvcnQganNvbgogaW1wb3J0IG9zCitpbXBvcnQgcmFuZG9tCiBpbXBvcnQgcmUKIGltcG9ydCBzZWxlY3QKIGltcG9ydCBzb2NrZXQKQEAgLTQwLDYgKzM5LDcgQEAKIGltcG9ydCB0ZW1wZmlsZQogZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgY2FwdHVyZWRfc3Rkb3V0LCBydW5fd2l0aF9sb2NhbGUsIHJ1bl91bml0dGVzdAogaW1wb3J0IHRleHR3cmFwCitpbXBvcnQgdGltZQogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgd2FybmluZ3MKIGltcG9ydCB3ZWFrcmVmCkBAIC03MTIsOSArNzEyLDMwIEBACiAgICAgZGF0ZWZtdD0KICAgICAiIiIKIAotICAgIGRlZiBhcHBseV9jb25maWcoc2VsZiwgY29uZik6CisgICAgZGlzYWJsZV90ZXN0ID0gIiIiCisgICAgW2xvZ2dlcnNdCisgICAga2V5cz1yb290CisKKyAgICBbaGFuZGxlcnNdCisgICAga2V5cz1zY3JlZW4KKworICAgIFtmb3JtYXR0ZXJzXQorICAgIGtleXM9CisKKyAgICBbbG9nZ2VyX3Jvb3RdCisgICAgbGV2ZWw9REVCVUcKKyAgICBoYW5kbGVycz1zY3JlZW4KKworICAgIFtoYW5kbGVyX3NjcmVlbl0KKyAgICBsZXZlbD1ERUJVRworICAgIGNsYXNzPVN0cmVhbUhhbmRsZXIKKyAgICBhcmdzPShzeXMuc3Rkb3V0LCkKKyAgICBmb3JtYXR0ZXI9CisgICAgIiIiCisKKyAgICBkZWYgYXBwbHlfY29uZmlnKHNlbGYsIGNvbmYsICoqa3dhcmdzKToKICAgICAgICAgZmlsZSA9IGNTdHJpbmdJTy5TdHJpbmdJTyh0ZXh0d3JhcC5kZWRlbnQoY29uZikpCi0gICAgICAgIGxvZ2dpbmcuY29uZmlnLmZpbGVDb25maWcoZmlsZSkKKyAgICAgICAgbG9nZ2luZy5jb25maWcuZmlsZUNvbmZpZyhmaWxlLCAqKmt3YXJncykKIAogICAgIGRlZiB0ZXN0X2NvbmZpZzBfb2soc2VsZik6CiAgICAgICAgICMgQSBzaW1wbGUgY29uZmlnIGZpbGUgd2hpY2ggb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHNldHRpbmdzLgpAQCAtODE4LDYgKzgzOSwxNSBAQAogICAgICAgICAgICAgIyBPcmlnaW5hbCBsb2dnZXIgb3V0cHV0IGlzIGVtcHR5LgogICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFtdKQogCisgICAgZGVmIHRlc3RfbG9nZ2VyX2Rpc2FibGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hcHBseV9jb25maWcoc2VsZi5kaXNhYmxlX3Rlc3QpCisgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdmb28nKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGxvZ2dlci5kaXNhYmxlZCkKKyAgICAgICAgc2VsZi5hcHBseV9jb25maWcoc2VsZi5kaXNhYmxlX3Rlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsb2dnZXIuZGlzYWJsZWQpCisgICAgICAgIHNlbGYuYXBwbHlfY29uZmlnKHNlbGYuZGlzYWJsZV90ZXN0LCBkaXNhYmxlX2V4aXN0aW5nX2xvZ2dlcnM9RmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobG9nZ2VyLmRpc2FibGVkKQorCiBjbGFzcyBMb2dSZWNvcmRTdHJlYW1IYW5kbGVyKFN0cmVhbVJlcXVlc3RIYW5kbGVyKToKIAogICAgICIiIkhhbmRsZXIgZm9yIGEgc3RyZWFtaW5nIGxvZ2dpbmcgcmVxdWVzdC4gSXQgc2F2ZXMgdGhlIGxvZyBtZXNzYWdlIGluIHRoZQpAQCAtMTAyOCw2ICsxMDU4LDI0IEBACiAgICAgICAgICNDb21wYXJlIGFnYWluc3Qgd2hhdCB0aGUgZGF0YSBzaG91bGQgYmUgd2hlbiBlbmNvZGVkIGluIENQLTEyNTEKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCAnXHhlNFx4ZWUgXHhmMVx4ZTJceGU4XHhlNFx4ZTBceGVkXHhlOFx4ZmZcbicpCiAKKyAgICBkZWYgdGVzdF9lbmNvZGluZ191dGYxNl91bmljb2RlKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxOTI2NworICAgICAgICBsb2cgPSBsb2dnaW5nLmdldExvZ2dlcigidGVzdCIpCisgICAgICAgIG1lc3NhZ2UgPSB1J2JcdTAxNDJcdTAxMDVkJworICAgICAgICB3cml0ZXJfY2xhc3MgPSBjb2RlY3MuZ2V0d3JpdGVyKCd1dGYtMTYtbGUnKQorICAgICAgICB3cml0ZXJfY2xhc3MuZW5jb2RpbmcgPSAndXRmLTE2LWxlJworICAgICAgICBzdHJlYW0gPSBjU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICB3cml0ZXIgPSB3cml0ZXJfY2xhc3Moc3RyZWFtLCAnc3RyaWN0JykKKyAgICAgICAgaGFuZGxlciA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcih3cml0ZXIpCisgICAgICAgIGxvZy5hZGRIYW5kbGVyKGhhbmRsZXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxvZy53YXJuaW5nKG1lc3NhZ2UpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBsb2cucmVtb3ZlSGFuZGxlcihoYW5kbGVyKQorICAgICAgICAgICAgaGFuZGxlci5jbG9zZSgpCisgICAgICAgIHMgPSBzdHJlYW0uZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsICdiXHgwMEJceDAxXHgwNVx4MDFkXHgwMFxuXHgwMCcpCisKIAogY2xhc3MgV2FybmluZ3NUZXN0KEJhc2VUZXN0KToKIApAQCAtMTU4Myw2ICsxNjMxLDM2IEBACiAgICAgICAgIH0sCiAgICAgfQogCisgICAgb3V0X29mX29yZGVyID0geworICAgICAgICAidmVyc2lvbiI6IDEsCisgICAgICAgICJmb3JtYXR0ZXJzIjogeworICAgICAgICAgICAgIm15U2ltcGxlRm9ybWF0dGVyIjogeworICAgICAgICAgICAgICAgICJmb3JtYXQiOiAiJShhc2N0aW1lKXMgKCUobmFtZSlzKSAlKGxldmVsbmFtZSlzOiAlKG1lc3NhZ2UpcyIKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImhhbmRsZXJzIjogeworICAgICAgICAgICAgImZpbGVHbG9iYWwiOiB7CisgICAgICAgICAgICAgICAgImNsYXNzIjogImxvZ2dpbmcuU3RyZWFtSGFuZGxlciIsCisgICAgICAgICAgICAgICAgImxldmVsIjogIkRFQlVHIiwKKyAgICAgICAgICAgICAgICAiZm9ybWF0dGVyIjogIm15U2ltcGxlRm9ybWF0dGVyIgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJidWZmZXJHbG9iYWwiOiB7CisgICAgICAgICAgICAgICAgImNsYXNzIjogImxvZ2dpbmcuaGFuZGxlcnMuTWVtb3J5SGFuZGxlciIsCisgICAgICAgICAgICAgICAgImNhcGFjaXR5IjogNSwKKyAgICAgICAgICAgICAgICAiZm9ybWF0dGVyIjogIm15U2ltcGxlRm9ybWF0dGVyIiwKKyAgICAgICAgICAgICAgICAidGFyZ2V0IjogImZpbGVHbG9iYWwiLAorICAgICAgICAgICAgICAgICJsZXZlbCI6ICJERUJVRyIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJsb2dnZXJzIjogeworICAgICAgICAgICAgIm15bW9kdWxlIjogeworICAgICAgICAgICAgICAgICJsZXZlbCI6ICJERUJVRyIsCisgICAgICAgICAgICAgICAgImhhbmRsZXJzIjogWyJidWZmZXJHbG9iYWwiXSwKKyAgICAgICAgICAgICAgICAicHJvcGFnYXRlIjogInRydWUiCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBkZWYgYXBwbHlfY29uZmlnKHNlbGYsIGNvbmYpOgogICAgICAgICBsb2dnaW5nLmNvbmZpZy5kaWN0Q29uZmlnKGNvbmYpCiAKQEAgLTE4MzcsNiArMTkxNSwxMCBAQAogICAgICAgICAgICAgIyBPcmlnaW5hbCBsb2dnZXIgb3V0cHV0IGlzIGVtcHR5LgogICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFtdKQogCisgICAgZGVmIHRlc3Rfb3V0X29mX29yZGVyKHNlbGYpOgorICAgICAgICBzZWxmLmFwcGx5X2NvbmZpZyhzZWxmLm91dF9vZl9vcmRlcikKKyAgICAgICAgaGFuZGxlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdteW1vZHVsZScpLmhhbmRsZXJzWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShoYW5kbGVyLnRhcmdldCwgbG9nZ2luZy5IYW5kbGVyKQogCiBjbGFzcyBNYW5hZ2VyVGVzdChCYXNlVGVzdCk6CiAgICAgZGVmIHRlc3RfbWFuYWdlcl9sb2dnZXJjbGFzcyhzZWxmKToKQEAgLTE4NzMsNiArMTk1NSw0NyBAQAogICAgICAgICBzZWxmLmFzc2VydFRydWUoYzIgaXMgYzMpCiAKIAorY2xhc3MgSGFuZGxlclRlc3QoQmFzZVRlc3QpOgorCisgICAgQHVuaXR0ZXN0LnNraXBJZihvcy5uYW1lID09ICdudCcsICdXYXRjaGVkRmlsZUhhbmRsZXIgbm90IGFwcHJvcHJpYXRlIGZvciBXaW5kb3dzLicpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKKyAgICBkZWYgdGVzdF9yYWNlKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxNDYzMiByZWZlcnMuCisgICAgICAgIGRlZiByZW1vdmVfbG9vcChmbmFtZSwgdHJpZXMpOgorICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2UodHJpZXMpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKGZuYW1lKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjAwNCAqIHJhbmRvbS5yYW5kaW50KDAsIDQpKQorCisgICAgICAgIGRlbF9jb3VudCA9IDUwMAorICAgICAgICBsb2dfY291bnQgPSA1MDAKKworICAgICAgICBmb3IgZGVsYXkgaW4gKEZhbHNlLCBUcnVlKToKKyAgICAgICAgICAgIGZkLCBmbiA9IHRlbXBmaWxlLm1rc3RlbXAoJy5sb2cnLCAndGVzdF9sb2dnaW5nLTMtJykKKyAgICAgICAgICAgIG9zLmNsb3NlKGZkKQorICAgICAgICAgICAgcmVtb3ZlciA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJlbW92ZV9sb29wLCBhcmdzPShmbiwgZGVsX2NvdW50KSkKKyAgICAgICAgICAgIHJlbW92ZXIuZGFlbW9uID0gVHJ1ZQorICAgICAgICAgICAgcmVtb3Zlci5zdGFydCgpCisgICAgICAgICAgICBoID0gbG9nZ2luZy5oYW5kbGVycy5XYXRjaGVkRmlsZUhhbmRsZXIoZm4sIGRlbGF5PWRlbGF5KQorICAgICAgICAgICAgZiA9IGxvZ2dpbmcuRm9ybWF0dGVyKCclKGFzY3RpbWUpczogJShsZXZlbG5hbWUpczogJShtZXNzYWdlKXMnKQorICAgICAgICAgICAgaC5zZXRGb3JtYXR0ZXIoZikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmb3IgXyBpbiByYW5nZShsb2dfY291bnQpOgorICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMDA1KQorICAgICAgICAgICAgICAgICAgICByID0gbG9nZ2luZy5tYWtlTG9nUmVjb3JkKHsnbXNnJzogJ3Rlc3RpbmcnIH0pCisgICAgICAgICAgICAgICAgICAgIGguaGFuZGxlKHIpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHJlbW92ZXIuam9pbigpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBoLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGZuKToKKyAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKGZuKQorCisKICMgU2V0IHRoZSBsb2NhbGUgdG8gdGhlIHBsYXRmb3JtLWRlcGVuZGVudCBkZWZhdWx0LiAgSSBoYXZlIG5vIGlkZWEKICMgd2h5IHRoZSB0ZXN0IGRvZXMgdGhpcywgYnV0IGluIGFueSBjYXNlIHdlIHNhdmUgdGhlIGN1cnJlbnQgbG9jYWxlCiAjIGZpcnN0IGFuZCByZXN0b3JlIGl0IGF0IHRoZSBlbmQuCkBAIC0xODgyLDcgKzIwMDUsNyBAQAogICAgICAgICAgICAgICAgICBDdXN0b21MZXZlbHNBbmRGaWx0ZXJzVGVzdCwgTWVtb3J5SGFuZGxlclRlc3QsCiAgICAgICAgICAgICAgICAgIENvbmZpZ0ZpbGVUZXN0LCBTb2NrZXRIYW5kbGVyVGVzdCwgTWVtb3J5VGVzdCwKICAgICAgICAgICAgICAgICAgRW5jb2RpbmdUZXN0LCBXYXJuaW5nc1Rlc3QsIENvbmZpZ0RpY3RUZXN0LCBNYW5hZ2VyVGVzdCwKLSAgICAgICAgICAgICAgICAgQ2hpbGRMb2dnZXJUZXN0KQorICAgICAgICAgICAgICAgICBDaGlsZExvZ2dlclRlc3QsIEhhbmRsZXJUZXN0KQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2xvbmcucHkgYi9MaWIvdGVzdC90ZXN0X2xvbmcucHkKaW5kZXggNThjZmMzYS4uOGQxNmJiMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9sb25nLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbG9uZy5weQpAQCAtMSwxMCArMSwxMSBAQAogaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogaW1wb3J0IHN5cwogCiBpbXBvcnQgcmFuZG9tCiBpbXBvcnQgbWF0aAogCitmcm9tIHRlc3QgaW1wb3J0IHRlc3RfaW50LCB0ZXN0X3N1cHBvcnQKKwogIyBVc2VkIGZvciBsYXp5IGZvcm1hdHRpbmcgb2YgZmFpbHVyZSBtZXNzYWdlcwogY2xhc3MgRnJtKG9iamVjdCk6CiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZvcm1hdCwgKmFyZ3MpOgpAQCAtNzgsOCArNzksOSBAQAogICAgICAgICAodW5pY2hyKDB4MjAwKSwgVmFsdWVFcnJvciksCiBdCiAKK2NsYXNzIExvbmdUZXN0KHRlc3RfaW50LkludExvbmdDb21tb25UZXN0cywgdW5pdHRlc3QuVGVzdENhc2UpOgogCi1jbGFzcyBMb25nVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgbnR5cGUgPSBsb25nCiAKICAgICAjIEdldCBxdWFzaS1yYW5kb20gbG9uZyBjb25zaXN0aW5nIG9mIG5kaWdpdHMgZGlnaXRzIChpbiBiYXNlIEJBU0UpLgogICAgICMgcXVhc2kgPT0gdGhlIG1vc3Qtc2lnbmlmaWNhbnQgZGlnaXQgd2lsbCBub3QgYmUgMCwgYW5kIHRoZSBudW1iZXIKQEAgLTg4LDcgKzkwLDcgQEAKICAgICAjIFRoZSBzaWduIG9mIHRoZSBudW1iZXIgaXMgYWxzbyByYW5kb20uCiAKICAgICBkZWYgZ2V0cmFuKHNlbGYsIG5kaWdpdHMpOgotICAgICAgICBzZWxmLmFzc2VydFRydWUobmRpZ2l0cyA+IDApCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcihuZGlnaXRzLCAwKQogICAgICAgICBuYml0c19oaSA9IG5kaWdpdHMgKiBTSElGVAogICAgICAgICBuYml0c19sbyA9IG5iaXRzX2hpIC0gU0hJRlQgKyAxCiAgICAgICAgIGFuc3dlciA9IDBMCkBAIC01ODYsNyArNTg4LDcgQEAKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgeCA9IGxvbmcyKDFMPDwxMDApCiAgICAgICAgIHkgPSBpbnQoeCkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoeSkgaXMgbG9uZywKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKHkpLCBsb25nLAogICAgICAgICAgICAgIm92ZXJmbG93aW5nIGludCBjb252ZXJzaW9uIG11c3QgcmV0dXJuIGxvbmcgbm90IGxvbmcgc3VidHlwZSIpCiAKICAgICAgICAgIyBsb25nIC0+IFB5X3NzaXplX3QgY29udmVyc2lvbgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tYWNvcy5weSBiL0xpYi90ZXN0L3Rlc3RfbWFjb3MucHkKaW5kZXggNWFmNTEwNS4uMDk1NmQxZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tYWNvcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X21hY29zLnB5CkBAIC04LDExICs4LDkgQEAKIFRFU1RGTjIgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOICsgJzInCiAKIGNsYXNzIFRlc3RNYWNPUyh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhvcy5wYXRoLmV4aXN0cygnL0RldmVsb3Blci9Ub29scy9TZXRGaWxlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJy9EZXZlbG9wZXIvVG9vbHMvU2V0RmlsZSBkb2VzIG5vdCBleGlzdCcpCiAgICAgZGVmIHRlc3RHZXRDcmVhdG9yQW5kVHlwZShzZWxmKToKLSAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKCcvRGV2ZWxvcGVyL1Rvb2xzL1NldEZpbGUnKToKLSAgICAgICAgICAgIHJldHVybgotCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGZwID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAndycpCiAgICAgICAgICAgICBmcC53cml0ZSgnXG4nKQpAQCAtMjksMTAgKzI3LDkgQEAKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Mob3MucGF0aC5leGlzdHMoJy9EZXZlbG9wZXIvVG9vbHMvR2V0RmlsZUluZm8nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnL0RldmVsb3Blci9Ub29scy9HZXRGaWxlSW5mbyBkb2VzIG5vdCBleGlzdCcpCiAgICAgZGVmIHRlc3RTZXRDcmVhdG9yQW5kVHlwZShzZWxmKToKLSAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKCcvRGV2ZWxvcGVyL1Rvb2xzL0dldEZpbGVJbmZvJyk6Ci0gICAgICAgICAgICByZXR1cm4KLQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBmcCA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgJ3cnKQogICAgICAgICAgICAgZnAud3JpdGUoJ1xuJykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWFjb3N0b29scy5weSBiL0xpYi90ZXN0L3Rlc3RfbWFjb3N0b29scy5weQppbmRleCA0ZjE1OTgyLi5lZDgwYzFkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21hY29zdG9vbHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tYWNvc3Rvb2xzLnB5CkBAIC0xMiw2ICsxMiw4IEBACiAKIFRFU1RGTjIgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOICsgJzInCiAKK3JlcXVpcmVzXzMyYml0ID0gdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMubWF4aW50IDwgMioqMzIsICczMi1iaXQgb25seSB0ZXN0JykKKwogY2xhc3MgVGVzdE1hY29zdG9vbHModW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHNldFVwKHNlbGYpOgpAQCAtNTEsMzAgKzUzLDMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpLCBxdWlldD1UcnVlKToKICAgICAgICAgICAgIG1hY29zdG9vbHMudG91Y2hlZCh0ZXN0X3N1cHBvcnQuVEVTVEZOKQogCi0gICAgaWYgc3lzLm1heGludCA8IDIqKjMyOgotICAgICAgICBkZWYgdGVzdF9jb3B5KHNlbGYpOgotICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhURVNURk4yKQotICAgICAgICAgICAgbWFjb3N0b29scy5jb3B5KHRlc3Rfc3VwcG9ydC5URVNURk4sIFRFU1RGTjIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tcGFyZURhdGEoKSwgJycpCisgICAgQHJlcXVpcmVzXzMyYml0CisgICAgZGVmIHRlc3RfY29weShzZWxmKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhURVNURk4yKQorICAgICAgICBtYWNvc3Rvb2xzLmNvcHkodGVzdF9zdXBwb3J0LlRFU1RGTiwgVEVTVEZOMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbXBhcmVEYXRhKCksICcnKQogCi0gICAgaWYgc3lzLm1heGludCA8IDIqKjMyOgotICAgICAgICBkZWYgdGVzdF9ta2FsaWFzKHNlbGYpOgotICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhURVNURk4yKQotICAgICAgICAgICAgbWFjb3N0b29scy5ta2FsaWFzKHRlc3Rfc3VwcG9ydC5URVNURk4sIFRFU1RGTjIpCi0gICAgICAgICAgICBmc3MsIF8sIF8gPSBDYXJib24uRmlsZS5SZXNvbHZlQWxpYXNGaWxlKFRFU1RGTjIsIDApCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZzcy5hc19wYXRobmFtZSgpLCBvcy5wYXRoLnJlYWxwYXRoKHRlc3Rfc3VwcG9ydC5URVNURk4pKQorICAgIEByZXF1aXJlc18zMmJpdAorICAgIGRlZiB0ZXN0X21rYWxpYXMoc2VsZik6CisgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoVEVTVEZOMikKKyAgICAgICAgbWFjb3N0b29scy5ta2FsaWFzKHRlc3Rfc3VwcG9ydC5URVNURk4sIFRFU1RGTjIpCisgICAgICAgIGZzcywgXywgXyA9IENhcmJvbi5GaWxlLlJlc29sdmVBbGlhc0ZpbGUoVEVTVEZOMiwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmc3MuYXNfcGF0aG5hbWUoKSwgb3MucGF0aC5yZWFscGF0aCh0ZXN0X3N1cHBvcnQuVEVTVEZOKSkKIAotICAgICAgICBkZWYgdGVzdF9ta2FsaWFzX3JlbGF0aXZlKHNlbGYpOgotICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhURVNURk4yKQotICAgICAgICAgICAgIyBJZiB0aGUgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QsIHRoZW4gY2hhbmNlcyBhcmUgdGhpcyBpcyBhIG5ldwotICAgICAgICAgICAgIyBpbnN0YWxsIG9mIFB5dGhvbiBzbyBkb24ndCBjcmVhdGUgaXQgc2luY2UgdGhlIHVzZXIgbWlnaHQgZW5kIHVwCi0gICAgICAgICAgICAjIHJ1bm5pbmcgYGBzdWRvIG1ha2UgaW5zdGFsbGBgIGFuZCBjcmVhdGluZyB0aGUgZGlyZWN0b3J5IGhlcmUgd29uJ3QKLSAgICAgICAgICAgICMgbGVhdmUgaXQgd2l0aCB0aGUgcHJvcGVyIHBlcm1pc3Npb25zLgotICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHN5cy5wcmVmaXgpOgotICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgbWFjb3N0b29scy5ta2FsaWFzKHRlc3Rfc3VwcG9ydC5URVNURk4sIFRFU1RGTjIsIHN5cy5wcmVmaXgpCi0gICAgICAgICAgICBmc3MsIF8sIF8gPSBDYXJib24uRmlsZS5SZXNvbHZlQWxpYXNGaWxlKFRFU1RGTjIsIDApCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZzcy5hc19wYXRobmFtZSgpLCBvcy5wYXRoLnJlYWxwYXRoKHRlc3Rfc3VwcG9ydC5URVNURk4pKQorICAgIEByZXF1aXJlc18zMmJpdAorICAgICMgSWYgdGhlIGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0LCB0aGVuIGNoYW5jZXMgYXJlIHRoaXMgaXMgYSBuZXcKKyAgICAjIGluc3RhbGwgb2YgUHl0aG9uIHNvIGRvbid0IGNyZWF0ZSBpdCBzaW5jZSB0aGUgdXNlciBtaWdodCBlbmQgdXAKKyAgICAjIHJ1bm5pbmcgYGBzdWRvIG1ha2UgaW5zdGFsbGBgIGFuZCBjcmVhdGluZyB0aGUgZGlyZWN0b3J5IGhlcmUgd29uJ3QKKyAgICAjIGxlYXZlIGl0IHdpdGggdGhlIHByb3BlciBwZXJtaXNzaW9ucy4KKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhvcy5wYXRoLmV4aXN0cyhzeXMucHJlZml4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXIgZG9lc24ndCBleGlzdCIgJSBzeXMucHJlZml4KQorICAgIGRlZiB0ZXN0X21rYWxpYXNfcmVsYXRpdmUoc2VsZik6CisgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoVEVTVEZOMikKKworICAgICAgICBtYWNvc3Rvb2xzLm1rYWxpYXModGVzdF9zdXBwb3J0LlRFU1RGTiwgVEVTVEZOMiwgc3lzLnByZWZpeCkKKyAgICAgICAgZnNzLCBfLCBfID0gQ2FyYm9uLkZpbGUuUmVzb2x2ZUFsaWFzRmlsZShURVNURk4yLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZzcy5hc19wYXRobmFtZSgpLCBvcy5wYXRoLnJlYWxwYXRoKHRlc3Rfc3VwcG9ydC5URVNURk4pKQogCiAKIGRlZiB0ZXN0X21haW4oKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWFjdXJsMnBhdGgucHkgYi9MaWIvdGVzdC90ZXN0X21hY3VybDJwYXRoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OTBkNmQKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC90ZXN0X21hY3VybDJwYXRoLnB5CkBAIC0wLDAgKzEsMzEgQEAKK2ltcG9ydCBtYWN1cmwycGF0aAoraW1wb3J0IHVuaXR0ZXN0CisKK2NsYXNzIE1hY1VybDJQYXRoVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3VybDJwYXRobmFtZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiOmluZGV4Lmh0bWwiLCBtYWN1cmwycGF0aC51cmwycGF0aG5hbWUoImluZGV4Lmh0bWwiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiOmJhcjppbmRleC5odG1sIiwgbWFjdXJsMnBhdGgudXJsMnBhdGhuYW1lKCJiYXIvaW5kZXguaHRtbCIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJmb286YmFyOmluZGV4Lmh0bWwiLCBtYWN1cmwycGF0aC51cmwycGF0aG5hbWUoIi9mb28vYmFyL2luZGV4Lmh0bWwiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiZm9vOmJhciIsIG1hY3VybDJwYXRoLnVybDJwYXRobmFtZSgiL2Zvby9iYXIvIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIiIsIG1hY3VybDJwYXRoLnVybDJwYXRobmFtZSgiLyIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIG1hY3VybDJwYXRoLnVybDJwYXRobmFtZSwgImh0dHA6Ly9mb28uY29tIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiaW5kZXguaHRtbCIsIG1hY3VybDJwYXRoLnVybDJwYXRobmFtZSgiLy8vaW5kZXguaHRtbCIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIG1hY3VybDJwYXRoLnVybDJwYXRobmFtZSwgIi8vaW5kZXguaHRtbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjppbmRleC5odG1sIiwgbWFjdXJsMnBhdGgudXJsMnBhdGhuYW1lKCIuL2luZGV4Lmh0bWwiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiOmluZGV4Lmh0bWwiLCBtYWN1cmwycGF0aC51cmwycGF0aG5hbWUoImZvby8uLi9pbmRleC5odG1sIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjo6aW5kZXguaHRtbCIsIG1hY3VybDJwYXRoLnVybDJwYXRobmFtZSgiLi4vaW5kZXguaHRtbCIpKQorCisgICAgZGVmIHRlc3RfcGF0aG5hbWUydXJsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJkcml2ZSIsIG1hY3VybDJwYXRoLnBhdGhuYW1lMnVybCgiZHJpdmU6IikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImRyaXZlL2RpciIsIG1hY3VybDJwYXRoLnBhdGhuYW1lMnVybCgiZHJpdmU6ZGlyOiIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJkcml2ZS9kaXIvZmlsZSIsIG1hY3VybDJwYXRoLnBhdGhuYW1lMnVybCgiZHJpdmU6ZGlyOmZpbGUiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiZHJpdmUvZmlsZSIsIG1hY3VybDJwYXRoLnBhdGhuYW1lMnVybCgiZHJpdmU6ZmlsZSIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJmaWxlIiwgbWFjdXJsMnBhdGgucGF0aG5hbWUydXJsKCJmaWxlIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImZpbGUiLCBtYWN1cmwycGF0aC5wYXRobmFtZTJ1cmwoIjpmaWxlIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImRpciIsIG1hY3VybDJwYXRoLnBhdGhuYW1lMnVybCgiOmRpcjoiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiZGlyL2ZpbGUiLCBtYWN1cmwycGF0aC5wYXRobmFtZTJ1cmwoIjpkaXI6ZmlsZSIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIG1hY3VybDJwYXRoLnBhdGhuYW1lMnVybCwgIi8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJkaXIvLi4vZmlsZSIsIG1hY3VybDJwYXRoLnBhdGhuYW1lMnVybCgiZGlyOjpmaWxlIikpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21haWxib3gucHkgYi9MaWIvdGVzdC90ZXN0X21haWxib3gucHkKaW5kZXggNzVlMGE4ZC4uMjI2MWJiOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tYWlsYm94LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbWFpbGJveC5weQpAQCAtNiw3ICs2LDkgQEAKIGltcG9ydCBlbWFpbAogaW1wb3J0IGVtYWlsLm1lc3NhZ2UKIGltcG9ydCByZQoraW1wb3J0IHNodXRpbAogaW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgdGVtcGZpbGUKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBtYWlsYm94CkBAIC0xOSw3ICsyMSw3IEBACiAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCiByZmM4MjIgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgncmZjODIyJywgZGVwcmVjYXRlZD1UcnVlKQogCi1jbGFzcyBUZXN0QmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CitjbGFzcyBUZXN0QmFzZToKIAogICAgIGRlZiBfY2hlY2tfc2FtcGxlKHNlbGYsIG1zZyk6CiAgICAgICAgICMgSW5zcGVjdCBhIG1haWxib3guTWVzc2FnZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2FtcGxlIG1lc3NhZ2UKQEAgLTM4LDIwICs0MCwxNSBAQAogICAgIGRlZiBfZGVsZXRlX3JlY3Vyc2l2ZWx5KHNlbGYsIHRhcmdldCk6CiAgICAgICAgICMgRGVsZXRlIGEgZmlsZSBvciBkZWxldGUgYSBkaXJlY3RvcnkgcmVjdXJzaXZlbHkKICAgICAgICAgaWYgb3MucGF0aC5pc2Rpcih0YXJnZXQpOgotICAgICAgICAgICAgZm9yIHBhdGgsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsodGFyZ2V0LCB0b3Bkb3duPUZhbHNlKToKLSAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKLSAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKG9zLnBhdGguam9pbihwYXRoLCBuYW1lKSkKLSAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBkaXJzOgotICAgICAgICAgICAgICAgICAgICBvcy5ybWRpcihvcy5wYXRoLmpvaW4ocGF0aCwgbmFtZSkpCi0gICAgICAgICAgICBvcy5ybWRpcih0YXJnZXQpCisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQucm10cmVlKHRhcmdldCkKICAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyh0YXJnZXQpOgotICAgICAgICAgICAgb3MucmVtb3ZlKHRhcmdldCkKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsodGFyZ2V0KQogCiAKIGNsYXNzIFRlc3RNYWlsYm94KFRlc3RCYXNlKToKIAogICAgIF9mYWN0b3J5ID0gTm9uZSAgICAgIyBPdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgdG8gcmV1c2UgdGVzdHMKLSAgICBfdGVtcGxhdGUgPSAnRnJvbTogZm9vXG5cbiVzJworICAgIF90ZW1wbGF0ZSA9ICdGcm9tOiBmb29cblxuJXNcbicKIAogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc2VsZi5fcGF0aCA9IHRlc3Rfc3VwcG9ydC5URVNURk4KQEAgLTc5LDYgKzc2LDE4IEBACiAgICAgICAgIGZvciBpIGluICgxLCAyLCAzLCA0KToKICAgICAgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShzZWxmLl9ib3hba2V5c1tpXV0pCiAKKyAgICBkZWYgdGVzdF9hZGRfZmlsZShzZWxmKToKKyAgICAgICAgd2l0aCB0ZW1wZmlsZS5UZW1wb3JhcnlGaWxlKCd3KycpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgICAgIGYuc2VlaygwKQorICAgICAgICAgICAga2V5ID0gc2VsZi5fYm94LmFkZChmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleSkuc3BsaXQoJ1xuJyksCisgICAgICAgICAgICBfc2FtcGxlX21lc3NhZ2Uuc3BsaXQoJ1xuJykpCisKKyAgICBkZWYgdGVzdF9hZGRfU3RyaW5nSU8oc2VsZik6CisgICAgICAgIGtleSA9IHNlbGYuX2JveC5hZGQoU3RyaW5nSU8uU3RyaW5nSU8oc2VsZi5fdGVtcGxhdGUgJSAiMCIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleSksIHNlbGYuX3RlbXBsYXRlICUgIjAiKQorCiAgICAgZGVmIHRlc3RfcmVtb3ZlKHNlbGYpOgogICAgICAgICAjIFJlbW92ZSBtZXNzYWdlcyB1c2luZyByZW1vdmUoKQogICAgICAgICBzZWxmLl90ZXN0X3JlbW92ZV9vcl9kZWxpdGVtKHNlbGYuX2JveC5yZW1vdmUpCkBAIC0xMjgsMjIgKzEzNywyMyBAQAogICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDApCiAgICAgICAgIG1zZyA9IHNlbGYuX2JveC5nZXQoa2V5MCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dbJ2Zyb20nXSwgJ2ZvbycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKCksICcwJykKLSAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLl9ib3guZ2V0KCdmb28nKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoKSwgJzBcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNlbGYuX2JveC5nZXQoJ2ZvbycpKQogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuX2JveC5nZXQoJ2ZvbycsIEZhbHNlKSkKICAgICAgICAgc2VsZi5fYm94LmNsb3NlKCkKICAgICAgICAgc2VsZi5fYm94ID0gc2VsZi5fZmFjdG9yeShzZWxmLl9wYXRoLCBmYWN0b3J5PXJmYzgyMi5NZXNzYWdlKQogICAgICAgICBrZXkxID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDEpCiAgICAgICAgIG1zZyA9IHNlbGYuX2JveC5nZXQoa2V5MSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dbJ2Zyb20nXSwgJ2ZvbycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmZwLnJlYWQoKSwgJzEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5mcC5yZWFkKCksICcxJyArIG9zLmxpbmVzZXApCisgICAgICAgIG1zZy5mcC5jbG9zZSgpCiAKICAgICBkZWYgdGVzdF9nZXRpdGVtKHNlbGYpOgogICAgICAgICAjIFJldHJpZXZlIG1lc3NhZ2UgdXNpbmcgX19nZXRpdGVtX18oKQogICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDApCiAgICAgICAgIG1zZyA9IHNlbGYuX2JveFtrZXkwXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ1snZnJvbSddLCAnZm9vJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoKSwgJzAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZCgpLCAnMFxuJykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogc2VsZi5fYm94Wydmb28nXSkKICAgICAgICAgc2VsZi5fYm94LmRpc2NhcmQoa2V5MCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogc2VsZi5fYm94W2tleTBdKQpAQCAtMTU1LDcgKzE2NSw3IEBACiAgICAgICAgIG1zZzAgPSBzZWxmLl9ib3guZ2V0X21lc3NhZ2Uoa2V5MCkKICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1zZzAsIG1haWxib3guTWVzc2FnZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cwWydmcm9tJ10sICdmb28nKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZzAuZ2V0X3BheWxvYWQoKSwgJzAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZzAuZ2V0X3BheWxvYWQoKSwgJzBcbicpCiAgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShzZWxmLl9ib3guZ2V0X21lc3NhZ2Uoa2V5MSkpCiAKICAgICBkZWYgdGVzdF9nZXRfc3RyaW5nKHNlbGYpOgpAQCAtMTY5LDEwICsxNzksMTQgQEAKICAgICAgICAgIyBHZXQgZmlsZSByZXByZXNlbnRhdGlvbnMgb2YgbWVzc2FnZXMKICAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKQogICAgICAgICBrZXkxID0gc2VsZi5fYm94LmFkZChfc2FtcGxlX21lc3NhZ2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LmdldF9maWxlKGtleTApLnJlYWQoKS5yZXBsYWNlKG9zLmxpbmVzZXAsICdcbicpLAorICAgICAgICBtc2cwID0gc2VsZi5fYm94LmdldF9maWxlKGtleTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnMC5yZWFkKCkucmVwbGFjZShvcy5saW5lc2VwLCAnXG4nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlIDApCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LmdldF9maWxlKGtleTEpLnJlYWQoKS5yZXBsYWNlKG9zLmxpbmVzZXAsICdcbicpLAorICAgICAgICBtc2cxID0gc2VsZi5fYm94LmdldF9maWxlKGtleTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnMS5yZWFkKCkucmVwbGFjZShvcy5saW5lc2VwLCAnXG4nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIG1zZzAuY2xvc2UoKQorICAgICAgICBtc2cxLmNsb3NlKCkKIAogICAgIGRlZiB0ZXN0X2dldF9maWxlX2Nhbl9iZV9jbG9zZWRfdHdpY2Uoc2VsZik6CiAgICAgICAgICMgSXNzdWUgMTE3MDAKQEAgLTIzNSw4ICsyNDksNyBAQAogICAgICAgICAgICAgY291bnQgPSAwCiAgICAgICAgICAgICBmb3IgdmFsdWUgaW4gcmV0dXJuZWRfdmFsdWVzOgogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVbJ2Zyb20nXSwgJ2ZvbycpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGludCh2YWx1ZS5nZXRfcGF5bG9hZCgpKSA8IHJlcGV0aXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUuZ2V0X3BheWxvYWQoKSwgcmVwZXRpdGlvbnMpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0TGVzcyhpbnQodmFsdWUuZ2V0X3BheWxvYWQoKSksIHJlcGV0aXRpb25zKQogICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHZhbHVlcyksIGNvdW50KQogCkBAIC0zMjQsMTUgKzMzNywxNSBAQAogICAgICAgICBzZWxmLmFzc2VydEluKGtleTAsIHNlbGYuX2JveCkKICAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAxKQogICAgICAgICBzZWxmLmFzc2VydEluKGtleTEsIHNlbGYuX2JveCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3gucG9wKGtleTApLmdldF9wYXlsb2FkKCksICcwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3gucG9wKGtleTApLmdldF9wYXlsb2FkKCksICcwXG4nKQogICAgICAgICBzZWxmLmFzc2VydE5vdEluKGtleTAsIHNlbGYuX2JveCkKICAgICAgICAgc2VsZi5hc3NlcnRJbihrZXkxLCBzZWxmLl9ib3gpCiAgICAgICAgIGtleTIgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMikKICAgICAgICAgc2VsZi5hc3NlcnRJbihrZXkyLCBzZWxmLl9ib3gpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LnBvcChrZXkyKS5nZXRfcGF5bG9hZCgpLCAnMicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LnBvcChrZXkyKS5nZXRfcGF5bG9hZCgpLCAnMlxuJykKICAgICAgICAgc2VsZi5hc3NlcnROb3RJbihrZXkyLCBzZWxmLl9ib3gpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oa2V5MSwgc2VsZi5fYm94KQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5wb3Aoa2V5MSkuZ2V0X3BheWxvYWQoKSwgJzEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5wb3Aoa2V5MSkuZ2V0X3BheWxvYWQoKSwgJzFcbicpCiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oa2V5MSwgc2VsZi5fYm94KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLl9ib3gpLCAwKQogCkBAIC0zOTAsNiArNDAzLDE3IEBACiAgICAgICAgICMgV3JpdGUgY2hhbmdlcyB0byBkaXNrCiAgICAgICAgIHNlbGYuX3Rlc3RfZmx1c2hfb3JfY2xvc2Uoc2VsZi5fYm94LmZsdXNoLCBUcnVlKQogCisgICAgZGVmIHRlc3RfcG9waXRlbV9hbmRfZmx1c2hfdHdpY2Uoc2VsZik6CisgICAgICAgICMgU2VlICMxNTAzNi4KKyAgICAgICAgc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDApCisgICAgICAgIHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAxKQorICAgICAgICBzZWxmLl9ib3guZmx1c2goKQorCisgICAgICAgIHNlbGYuX2JveC5wb3BpdGVtKCkKKyAgICAgICAgc2VsZi5fYm94LmZsdXNoKCkKKyAgICAgICAgc2VsZi5fYm94LnBvcGl0ZW0oKQorICAgICAgICBzZWxmLl9ib3guZmx1c2goKQorCiAgICAgZGVmIHRlc3RfbG9ja191bmxvY2soc2VsZik6CiAgICAgICAgICMgTG9jayBhbmQgdW5sb2NrIHRoZSBtYWlsYm94CiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3MucGF0aC5leGlzdHMoc2VsZi5fZ2V0X2xvY2tfcGF0aCgpKSkKQEAgLTQwNyw2ICs0MzEsNyBAQAogICAgICAgICBzZWxmLl9ib3guYWRkKGNvbnRlbnRzWzBdKQogICAgICAgICBzZWxmLl9ib3guYWRkKGNvbnRlbnRzWzFdKQogICAgICAgICBzZWxmLl9ib3guYWRkKGNvbnRlbnRzWzJdKQorICAgICAgICBvbGRib3ggPSBzZWxmLl9ib3gKICAgICAgICAgbWV0aG9kKCkKICAgICAgICAgaWYgc2hvdWxkX2NhbGxfY2xvc2U6CiAgICAgICAgICAgICBzZWxmLl9ib3guY2xvc2UoKQpAQCAtNDE1LDYgKzQ0MCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGtleXMpLCAzKQogICAgICAgICBmb3Iga2V5IGluIGtleXM6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEluKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleSksIGNvbnRlbnRzKQorICAgICAgICBvbGRib3guY2xvc2UoKQogCiAgICAgZGVmIHRlc3RfZHVtcF9tZXNzYWdlKHNlbGYpOgogICAgICAgICAjIFdyaXRlIG1lc3NhZ2UgcmVwcmVzZW50YXRpb25zIHRvIGRpc2sKQEAgLTQzMyw3ICs0NTksNyBAQAogICAgICAgICByZXR1cm4gc2VsZi5fcGF0aCArICcubG9jaycKIAogCi1jbGFzcyBUZXN0TWFpbGJveFN1cGVyY2xhc3MoVGVzdEJhc2UpOgorY2xhc3MgVGVzdE1haWxib3hTdXBlcmNsYXNzKFRlc3RCYXNlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgdGVzdF9ub3RpbXBsZW1lbnRlZChzZWxmKToKICAgICAgICAgIyBUZXN0IHRoYXQgYWxsIE1haWxib3ggbWV0aG9kcyByYWlzZSBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbi4KQEAgLTQ2OCw3ICs0OTQsNyBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC5jbG9zZSgpKQogCiAKLWNsYXNzIFRlc3RNYWlsZGlyKFRlc3RNYWlsYm94KToKK2NsYXNzIFRlc3RNYWlsZGlyKFRlc3RNYWlsYm94LCB1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBfZmFjdG9yeSA9IGxhbWJkYSBzZWxmLCBwYXRoLCBmYWN0b3J5PU5vbmU6IG1haWxib3guTWFpbGRpcihwYXRoLCBmYWN0b3J5KQogCkBAIC01MTAsNyArNTM2LDcgQEAKICAgICAgICAgbXNnX3JldHVybmVkID0gc2VsZi5fYm94LmdldF9tZXNzYWdlKGtleSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dfcmV0dXJuZWQuZ2V0X3N1YmRpcigpLCAnbmV3JykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dfcmV0dXJuZWQuZ2V0X2ZsYWdzKCksICcnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ19yZXR1cm5lZC5nZXRfcGF5bG9hZCgpLCAnMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnX3JldHVybmVkLmdldF9wYXlsb2FkKCksICcxXG4nKQogICAgICAgICBtc2cyID0gbWFpbGJveC5NYWlsZGlyTWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDIpCiAgICAgICAgIG1zZzIuc2V0X2luZm8oJzIsUycpCiAgICAgICAgIHNlbGYuX2JveFtrZXldID0gbXNnMgpAQCAtNTE4LDcgKzU0NCw3IEBACiAgICAgICAgIG1zZ19yZXR1cm5lZCA9IHNlbGYuX2JveC5nZXRfbWVzc2FnZShrZXkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnX3JldHVybmVkLmdldF9zdWJkaXIoKSwgJ25ldycpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnX3JldHVybmVkLmdldF9mbGFncygpLCAnUycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnX3JldHVybmVkLmdldF9wYXlsb2FkKCksICczJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dfcmV0dXJuZWQuZ2V0X3BheWxvYWQoKSwgJzNcbicpCiAKICAgICBkZWYgdGVzdF9jb25zaXN0ZW50X2ZhY3Rvcnkoc2VsZik6CiAgICAgICAgICMgQWRkIGEgbWVzc2FnZS4KQEAgLTYzNywzMiArNjYzLDMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRtcCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpbGUgaW4gd3JvbmcgbG9jYXRpb246ICclcyciICUgaGVhZCkKICAgICAgICAgICAgIG1hdGNoID0gcGF0dGVybi5tYXRjaCh0YWlsKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGNoIGlzIG5vdCBOb25lLCAiSW52YWxpZCBmaWxlIG5hbWU6ICclcyciICUgdGFpbCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKG1hdGNoLCAiSW52YWxpZCBmaWxlIG5hbWU6ICclcyciICUgdGFpbCkKICAgICAgICAgICAgIGdyb3VwcyA9IG1hdGNoLmdyb3VwcygpCiAgICAgICAgICAgICBpZiBwcmV2aW91c19ncm91cHMgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGludChncm91cHNbMF0gPj0gcHJldmlvdXNfZ3JvdXBzWzBdKSwKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChpbnQoZ3JvdXBzWzBdKSwgaW50KHByZXZpb3VzX2dyb3Vwc1swXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb24tbW9ub3RvbmljIHNlY29uZHM6ICclcycgYmVmb3JlICclcyciICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZXZpb3VzX2dyb3Vwc1swXSwgZ3JvdXBzWzBdKSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaW50KGdyb3Vwc1sxXSA+PSBwcmV2aW91c19ncm91cHNbMV0pIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3Vwc1swXSAhPSBncm91cHNbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb24tbW9ub3RvbmljIG1pbGxpc2Vjb25kczogJyVzJyBiZWZvcmUgJyVzJyIgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJldmlvdXNfZ3JvdXBzWzFdLCBncm91cHNbMV0pKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbnQoZ3JvdXBzWzJdKSA9PSBwaWQsCisgICAgICAgICAgICAgICAgaWYgaW50KGdyb3Vwc1swXSkgPT0gaW50KHByZXZpb3VzX2dyb3Vwc1swXSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKGludChncm91cHNbMV0pLCBpbnQocHJldmlvdXNfZ3JvdXBzWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vbi1tb25vdG9uaWMgbWlsbGlzZWNvbmRzOiAnJXMnIGJlZm9yZSAnJXMnIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcmV2aW91c19ncm91cHNbMV0sIGdyb3Vwc1sxXSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoZ3JvdXBzWzJdKSwgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvY2VzcyBJRCBtaXNtYXRjaDogJyVzJyBzaG91bGQgYmUgJyVzJyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3JvdXBzWzJdLCBwaWQpKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbnQoZ3JvdXBzWzNdKSA9PSBpbnQocHJldmlvdXNfZ3JvdXBzWzNdKSArIDEsCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoZ3JvdXBzWzNdKSwgaW50KHByZXZpb3VzX2dyb3Vwc1szXSkgKyAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uLXNlcXVlbnRpYWwgY291bnRlcjogJyVzJyBiZWZvcmUgJyVzJyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJldmlvdXNfZ3JvdXBzWzNdLCBncm91cHNbM10pKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShncm91cHNbNF0gPT0gaG9zdG5hbWUsCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncm91cHNbNF0sIGhvc3RuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9zdCBuYW1lIG1pc21hdGNoOiAnJXMnIHNob3VsZCBiZSAnJXMnIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncm91cHNbNF0sIGhvc3RuYW1lKSkKICAgICAgICAgICAgIHByZXZpb3VzX2dyb3VwcyA9IGdyb3VwcwogICAgICAgICAgICAgdG1wX2ZpbGUud3JpdGUoX3NhbXBsZV9tZXNzYWdlKQogICAgICAgICAgICAgdG1wX2ZpbGUuc2VlaygwKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRtcF9maWxlLnJlYWQoKSA9PSBfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRtcF9maWxlLnJlYWQoKSwgX3NhbXBsZV9tZXNzYWdlKQogICAgICAgICAgICAgdG1wX2ZpbGUuY2xvc2UoKQogICAgICAgICBmaWxlX2NvdW50ID0gbGVuKG9zLmxpc3RkaXIob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICJ0bXAiKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmaWxlX2NvdW50ID09IHJlcGV0aXRpb25zLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfY291bnQsIHJlcGV0aXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgIldyb25nIGZpbGUgY291bnQ6ICclcycgc2hvdWxkIGJlICclcyciICUKICAgICAgICAgICAgICAgICAgICAgIChmaWxlX2NvdW50LCByZXBldGl0aW9ucykpCiAKQEAgLTc0NSwxMCArNzcxLDEwIEBACiAgICAgICAgIGZvciBtc2cgaW4gc2VsZi5fYm94OgogICAgICAgICAgICAgcGFzcwogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ3VtYXNrJyksICd0ZXN0IG5lZWRzIG9zLnVtYXNrKCknKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdzdGF0JyksICd0ZXN0IG5lZWRzIG9zLnN0YXQoKScpCiAgICAgZGVmIHRlc3RfZmlsZV9wZXJtaXNzaW9ucyhzZWxmKToKICAgICAgICAgIyBWZXJpZnkgdGhhdCBtZXNzYWdlIGZpbGVzIGFyZSBjcmVhdGVkIHdpdGhvdXQgZXhlY3V0ZSBwZXJtaXNzaW9ucwotICAgICAgICBpZiBub3QgaGFzYXR0cihvcywgInN0YXQiKSBvciBub3QgaGFzYXR0cihvcywgInVtYXNrIik6Ci0gICAgICAgICAgICByZXR1cm4KICAgICAgICAgbXNnID0gbWFpbGJveC5NYWlsZGlyTWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDApCiAgICAgICAgIG9yaWdfdW1hc2sgPSBvcy51bWFzaygwKQogICAgICAgICB0cnk6CkBAIC03NTksMTIgKzc4NSwxMSBAQAogICAgICAgICBtb2RlID0gb3Muc3RhdChwYXRoKS5zdF9tb2RlCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kZSAmIDAxMTEsIDApCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAndW1hc2snKSwgJ3Rlc3QgbmVlZHMgb3MudW1hc2soKScpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ3N0YXQnKSwgJ3Rlc3QgbmVlZHMgb3Muc3RhdCgpJykKICAgICBkZWYgdGVzdF9mb2xkZXJfZmlsZV9wZXJtcyhzZWxmKToKICAgICAgICAgIyBGcm9tIGJ1ZyAjMzIyOCwgd2Ugd2FudCB0byB2ZXJpZnkgdGhhdCB0aGUgZmlsZSBjcmVhdGVkIGluc2lkZSBhIE1haWxkaXIKICAgICAgICAgIyBzdWJmb2xkZXIgaXNuJ3QgbWFya2VkIGFzIGV4ZWN1dGFibGUuCi0gICAgICAgIGlmIG5vdCBoYXNhdHRyKG9zLCAic3RhdCIpIG9yIG5vdCBoYXNhdHRyKG9zLCAidW1hc2siKToKLSAgICAgICAgICAgIHJldHVybgotCiAgICAgICAgIG9yaWdfdW1hc2sgPSBvcy51bWFzaygwKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzdWJmb2xkZXIgPSBzZWxmLl9ib3guYWRkX2ZvbGRlcignc3ViZm9sZGVyJykKQEAgLTgxNyw3ICs4NDIsNDkgQEAKICAgICAgICAgc2VsZi5fYm94Ll9yZWZyZXNoKCkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlZnJlc2hlZCgpKQogCi1jbGFzcyBfVGVzdE1ib3hNTURGKFRlc3RNYWlsYm94KToKKworY2xhc3MgX1Rlc3RTaW5nbGVGaWxlKFRlc3RNYWlsYm94KToKKyAgICAnJydDb21tb24gdGVzdHMgZm9yIHNpbmdsZS1maWxlIG1haWxib3hlcycnJworCisgICAgZGVmIHRlc3RfYWRkX2RvZXNudF9yZXdyaXRlKHNlbGYpOgorICAgICAgICAjIFdoZW4gb25seSBhZGRpbmcgbWVzc2FnZXMsIGZsdXNoKCkgc2hvdWxkIG5vdCByZXdyaXRlIHRoZQorICAgICAgICAjIG1haWxib3ggZmlsZS4gU2VlIGlzc3VlICM5NTU5LgorCisgICAgICAgICMgSW5vZGUgbnVtYmVyIGNoYW5nZXMgaWYgdGhlIGNvbnRlbnRzIGFyZSB3cml0dGVuIHRvIGFub3RoZXIKKyAgICAgICAgIyBmaWxlIHdoaWNoIGlzIHRoZW4gcmVuYW1lZCBvdmVyIHRoZSBvcmlnaW5hbCBmaWxlLiBTbyB3ZQorICAgICAgICAjIG11c3QgY2hlY2sgdGhhdCB0aGUgaW5vZGUgbnVtYmVyIGRvZXNuJ3QgY2hhbmdlLgorICAgICAgICBpbm9kZV9iZWZvcmUgPSBvcy5zdGF0KHNlbGYuX3BhdGgpLnN0X2lubworCisgICAgICAgIHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBzZWxmLl9ib3guZmx1c2goKQorCisgICAgICAgIGlub2RlX2FmdGVyID0gb3Muc3RhdChzZWxmLl9wYXRoKS5zdF9pbm8KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbm9kZV9iZWZvcmUsIGlub2RlX2FmdGVyKQorCisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBtZXNzYWdlIHdhcyByZWFsbHkgYWRkZWQKKyAgICAgICAgc2VsZi5fYm94LmNsb3NlKCkKKyAgICAgICAgc2VsZi5fYm94ID0gc2VsZi5fZmFjdG9yeShzZWxmLl9wYXRoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLl9ib3gpLCAxKQorCisgICAgZGVmIHRlc3RfcGVybWlzc2lvbnNfYWZ0ZXJfZmx1c2goc2VsZik6CisgICAgICAgICMgU2VlIGlzc3VlICM1MzQ2CisKKyAgICAgICAgIyBNYWtlIHRoZSBtYWlsYm94IHdvcmxkIHdyaXRhYmxlLiBJdCdzIHVubGlrZWx5IHRoYXQgdGhlIG5ldworICAgICAgICAjIG1haWxib3ggZmlsZSB3b3VsZCBoYXZlIHRoZXNlIHBlcm1pc3Npb25zIGFmdGVyIGZsdXNoKCksCisgICAgICAgICMgYmVjYXVzZSB1bWFzayB1c3VhbGx5IHByZXZlbnRzIGl0LgorICAgICAgICBtb2RlID0gb3Muc3RhdChzZWxmLl9wYXRoKS5zdF9tb2RlIHwgMG82NjYKKyAgICAgICAgb3MuY2htb2Qoc2VsZi5fcGF0aCwgbW9kZSkKKworICAgICAgICBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMCkKKyAgICAgICAgaSA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAxKQorICAgICAgICAjIE5lZWQgdG8gcmVtb3ZlIG9uZSBtZXNzYWdlIHRvIG1ha2UgZmx1c2goKSBjcmVhdGUgYSBuZXcgZmlsZQorICAgICAgICBzZWxmLl9ib3gucmVtb3ZlKGkpCisgICAgICAgIHNlbGYuX2JveC5mbHVzaCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5zdGF0KHNlbGYuX3BhdGgpLnN0X21vZGUsIG1vZGUpCisKKworY2xhc3MgX1Rlc3RNYm94TU1ERihfVGVzdFNpbmdsZUZpbGUpOgogCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzZWxmLl9ib3guY2xvc2UoKQpAQCAtODI3LDE0ICs4OTQsMTQgQEAKIAogICAgIGRlZiB0ZXN0X2FkZF9mcm9tX3N0cmluZyhzZWxmKToKICAgICAgICAgIyBBZGQgYSBzdHJpbmcgc3RhcnRpbmcgd2l0aCAnRnJvbSAnIHRvIHRoZSBtYWlsYm94Ci0gICAgICAgIGtleSA9IHNlbGYuX2JveC5hZGQoJ0Zyb20gZm9vQGJhciBibGFoXG5Gcm9tOiBmb29cblxuMCcpCisgICAgICAgIGtleSA9IHNlbGYuX2JveC5hZGQoJ0Zyb20gZm9vQGJhciBibGFoXG5Gcm9tOiBmb29cblxuMFxuJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3hba2V5XS5nZXRfZnJvbSgpLCAnZm9vQGJhciBibGFoJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3hba2V5XS5nZXRfcGF5bG9hZCgpLCAnMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94W2tleV0uZ2V0X3BheWxvYWQoKSwgJzBcbicpCiAKICAgICBkZWYgdGVzdF9hZGRfbWJveF9vcl9tbWRmX21lc3NhZ2Uoc2VsZik6CiAgICAgICAgICMgQWRkIGFuIG1ib3hNZXNzYWdlIG9yIE1NREZNZXNzYWdlCiAgICAgICAgIGZvciBjbGFzc18gaW4gKG1haWxib3gubWJveE1lc3NhZ2UsIG1haWxib3guTU1ERk1lc3NhZ2UpOgotICAgICAgICAgICAgbXNnID0gY2xhc3NfKCdGcm9tIGZvb0BiYXIgYmxhaFxuRnJvbTogZm9vXG5cbjAnKQorICAgICAgICAgICAgbXNnID0gY2xhc3NfKCdGcm9tIGZvb0BiYXIgYmxhaFxuRnJvbTogZm9vXG5cbjBcbicpCiAgICAgICAgICAgICBrZXkgPSBzZWxmLl9ib3guYWRkKG1zZykKIAogICAgIGRlZiB0ZXN0X29wZW5fY2xvc2Vfb3BlbihzZWxmKToKQEAgLTg2NSwyNiArOTMyLDM3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnRlbnRzLCBmLnJlYWQoKSkKICAgICAgICAgc2VsZi5fYm94ID0gc2VsZi5fZmFjdG9yeShzZWxmLl9wYXRoKQogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2ZvcmsnKSwgIlRlc3QgbmVlZHMgZm9yaygpLiIpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihzb2NrZXQsICdzb2NrZXRwYWlyJyksICJUZXN0IG5lZWRzIHNvY2tldHBhaXIoKS4iKQogICAgIGRlZiB0ZXN0X2xvY2tfY29uZmxpY3Qoc2VsZik6Ci0gICAgICAgICMgRm9yayBvZmYgYSBzdWJwcm9jZXNzIHRoYXQgd2lsbCBsb2NrIHRoZSBmaWxlIGZvciAyIHNlY29uZHMsCi0gICAgICAgICMgdW5sb2NrIGl0LCBhbmQgdGhlbiBleGl0LgotICAgICAgICBpZiBub3QgaGFzYXR0cihvcywgJ2ZvcmsnKToKLSAgICAgICAgICAgIHJldHVybgorICAgICAgICAjIEZvcmsgb2ZmIGEgY2hpbGQgcHJvY2VzcyB0aGF0IHdpbGwgbG9jayB0aGUgbWFpbGJveCB0ZW1wb3JhcmlseSwKKyAgICAgICAgIyB1bmxvY2sgaXQgYW5kIGV4aXQuCisgICAgICAgIGMsIHAgPSBzb2NrZXQuc29ja2V0cGFpcigpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChjLmNsb3NlKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5jbG9zZSkKKwogICAgICAgICBwaWQgPSBvcy5mb3JrKCkKICAgICAgICAgaWYgcGlkID09IDA6Ci0gICAgICAgICAgICAjIEluIHRoZSBjaGlsZCwgbG9jayB0aGUgbWFpbGJveC4KLSAgICAgICAgICAgIHNlbGYuX2JveC5sb2NrKCkKLSAgICAgICAgICAgIHRpbWUuc2xlZXAoMikKLSAgICAgICAgICAgIHNlbGYuX2JveC51bmxvY2soKQotICAgICAgICAgICAgb3MuX2V4aXQoMCkKKyAgICAgICAgICAgICMgY2hpbGQKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIGxvY2sgdGhlIG1haWxib3gsIGFuZCBzaWduYWwgdGhlIHBhcmVudCBpdCBjYW4gcHJvY2VlZAorICAgICAgICAgICAgICAgIHNlbGYuX2JveC5sb2NrKCkKKyAgICAgICAgICAgICAgICBjLnNlbmQoYidjJykKIAotICAgICAgICAjIEluIHRoZSBwYXJlbnQsIHNsZWVwIGEgYml0IHRvIGdpdmUgdGhlIGNoaWxkIHRpbWUgdG8gYWNxdWlyZQotICAgICAgICAjIHRoZSBsb2NrLgotICAgICAgICB0aW1lLnNsZWVwKDAuNSkKKyAgICAgICAgICAgICAgICAjIHdhaXQgdW50aWwgdGhlIHBhcmVudCBpcyBkb25lLCBhbmQgdW5sb2NrIHRoZSBtYWlsYm94CisgICAgICAgICAgICAgICAgYy5yZWN2KDEpCisgICAgICAgICAgICAgICAgc2VsZi5fYm94LnVubG9jaygpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIG9zLl9leGl0KDApCisKKyAgICAgICAgIyBJbiB0aGUgcGFyZW50LCB3YWl0IHVudGlsIHRoZSBjaGlsZCBzaWduYWxzIGl0IGxvY2tlZCB0aGUgbWFpbGJveC4KKyAgICAgICAgcC5yZWN2KDEpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKG1haWxib3guRXh0ZXJuYWxDbGFzaEVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fYm94LmxvY2spCiAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAjIFNpZ25hbCB0aGUgY2hpbGQgaXQgY2FuIG5vdyByZWxlYXNlIHRoZSBsb2NrIGFuZCBleGl0LgorICAgICAgICAgICAgcC5zZW5kKGIncCcpCiAgICAgICAgICAgICAjIFdhaXQgZm9yIGNoaWxkIHRvIGV4aXQuICBMb2NraW5nIHNob3VsZCBub3cgc3VjY2VlZC4KICAgICAgICAgICAgIGV4aXRlZF9waWQsIHN0YXR1cyA9IG9zLndhaXRwaWQocGlkLCAwKQogCkBAIC05MDcsMzUgKzk4NSw1OSBAQAogICAgICAgICBzZWxmLl9ib3guY2xvc2UoKQogCiAKLWNsYXNzIFRlc3RNYm94KF9UZXN0TWJveE1NREYpOgorY2xhc3MgVGVzdE1ib3goX1Rlc3RNYm94TU1ERiwgdW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgX2ZhY3RvcnkgPSBsYW1iZGEgc2VsZiwgcGF0aCwgZmFjdG9yeT1Ob25lOiBtYWlsYm94Lm1ib3gocGF0aCwgZmFjdG9yeSkKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICd1bWFzaycpLCAndGVzdCBuZWVkcyBvcy51bWFzaygpJykKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAnc3RhdCcpLCAndGVzdCBuZWVkcyBvcy5zdGF0KCknKQogICAgIGRlZiB0ZXN0X2ZpbGVfcGVybXMoc2VsZik6CiAgICAgICAgICMgRnJvbSBidWcgIzMyMjgsIHdlIHdhbnQgdG8gdmVyaWZ5IHRoYXQgdGhlIG1haWxib3ggZmlsZSBpc24ndCBleGVjdXRhYmxlLAogICAgICAgICAjIGV2ZW4gaWYgdGhlIHVtYXNrIGlzIHNldCB0byBzb21ldGhpbmcgdGhhdCB3b3VsZCBsZWF2ZSBleGVjdXRhYmxlIGJpdHMgc2V0LgogICAgICAgICAjIFdlIG9ubHkgcnVuIHRoaXMgdGVzdCBvbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IHVtYXNrLgotICAgICAgICBpZiBoYXNhdHRyKG9zLCAndW1hc2snKSBhbmQgaGFzYXR0cihvcywgJ3N0YXQnKToKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBvbGRfdW1hc2sgPSBvcy51bWFzaygwMDc3KQotICAgICAgICAgICAgICAgIHNlbGYuX2JveC5jbG9zZSgpCi0gICAgICAgICAgICAgICAgb3MudW5saW5rKHNlbGYuX3BhdGgpCi0gICAgICAgICAgICAgICAgc2VsZi5fYm94ID0gbWFpbGJveC5tYm94KHNlbGYuX3BhdGgsIGNyZWF0ZT1UcnVlKQotICAgICAgICAgICAgICAgIHNlbGYuX2JveC5hZGQoJycpCi0gICAgICAgICAgICAgICAgc2VsZi5fYm94LmNsb3NlKCkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgb3MudW1hc2sob2xkX3VtYXNrKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvbGRfdW1hc2sgPSBvcy51bWFzaygwMDc3KQorICAgICAgICAgICAgc2VsZi5fYm94LmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnVubGluayhzZWxmLl9wYXRoKQorICAgICAgICAgICAgc2VsZi5fYm94ID0gbWFpbGJveC5tYm94KHNlbGYuX3BhdGgsIGNyZWF0ZT1UcnVlKQorICAgICAgICAgICAgc2VsZi5fYm94LmFkZCgnJykKKyAgICAgICAgICAgIHNlbGYuX2JveC5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy51bWFzayhvbGRfdW1hc2spCiAKLSAgICAgICAgICAgIHN0ID0gb3Muc3RhdChzZWxmLl9wYXRoKQotICAgICAgICAgICAgcGVybXMgPSBzdC5zdF9tb2RlCi0gICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKChwZXJtcyAmIDAxMTEpKSAjIEV4ZWN1dGUgYml0cyBzaG91bGQgYWxsIGJlIG9mZi4KKyAgICAgICAgc3QgPSBvcy5zdGF0KHNlbGYuX3BhdGgpCisgICAgICAgIHBlcm1zID0gc3Quc3RfbW9kZQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKChwZXJtcyAmIDAxMTEpKSAjIEV4ZWN1dGUgYml0cyBzaG91bGQgYWxsIGJlIG9mZi4KIAotY2xhc3MgVGVzdE1NREYoX1Rlc3RNYm94TU1ERik6CisgICAgZGVmIHRlc3RfdGVybWluYXRpbmdfbmV3bGluZShzZWxmKToKKyAgICAgICAgbWVzc2FnZSA9IGVtYWlsLm1lc3NhZ2UuTWVzc2FnZSgpCisgICAgICAgIG1lc3NhZ2VbJ0Zyb20nXSA9ICdqb2huQGV4YW1wbGUuY29tJworICAgICAgICBtZXNzYWdlLnNldF9wYXlsb2FkKCdObyBuZXdsaW5lIGF0IHRoZSBlbmQnKQorICAgICAgICBpID0gc2VsZi5fYm94LmFkZChtZXNzYWdlKQorCisgICAgICAgICMgQSBuZXdsaW5lIHNob3VsZCBoYXZlIGJlZW4gYXBwZW5kZWQgdG8gdGhlIHBheWxvYWQKKyAgICAgICAgbWVzc2FnZSA9IHNlbGYuX2JveC5nZXQoaSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLmdldF9wYXlsb2FkKCksICdObyBuZXdsaW5lIGF0IHRoZSBlbmRcbicpCisKKyAgICBkZWYgdGVzdF9tZXNzYWdlX3NlcGFyYXRvcihzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGVyZSdzIGFsd2F5cyBhIHNpbmdsZSBibGFuayBsaW5lIGFmdGVyIGVhY2ggbWVzc2FnZQorICAgICAgICBzZWxmLl9ib3guYWRkKCdGcm9tOiBmb29cblxuMCcpICAjIE5vIG5ld2xpbmUgYXQgdGhlIGVuZAorICAgICAgICB3aXRoIG9wZW4oc2VsZi5fcGF0aCkgYXMgZjoKKyAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhWy0zOl0sICcwXG5cbicpCisKKyAgICAgICAgc2VsZi5fYm94LmFkZCgnRnJvbTogZm9vXG5cbjBcbicpICAjIE5ld2xpbmUgYXQgdGhlIGVuZAorICAgICAgICB3aXRoIG9wZW4oc2VsZi5fcGF0aCkgYXMgZjoKKyAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhWy0zOl0sICcwXG5cbicpCisKKworY2xhc3MgVGVzdE1NREYoX1Rlc3RNYm94TU1ERiwgdW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgX2ZhY3RvcnkgPSBsYW1iZGEgc2VsZiwgcGF0aCwgZmFjdG9yeT1Ob25lOiBtYWlsYm94Lk1NREYocGF0aCwgZmFjdG9yeSkKIAogCi1jbGFzcyBUZXN0TUgoVGVzdE1haWxib3gpOgorY2xhc3MgVGVzdE1IKFRlc3RNYWlsYm94LCB1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBfZmFjdG9yeSA9IGxhbWJkYSBzZWxmLCBwYXRoLCBmYWN0b3J5PU5vbmU6IG1haWxib3guTUgocGF0aCwgZmFjdG9yeSkKIApAQCAtMTA2Nyw3ICsxMTY5LDcgQEAKICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCAnLm1oX3NlcXVlbmNlcy5sb2NrJykKIAogCi1jbGFzcyBUZXN0QmFieWwoVGVzdE1haWxib3gpOgorY2xhc3MgVGVzdEJhYnlsKF9UZXN0U2luZ2xlRmlsZSwgdW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgX2ZhY3RvcnkgPSBsYW1iZGEgc2VsZiwgcGF0aCwgZmFjdG9yeT1Ob25lOiBtYWlsYm94LkJhYnlsKHBhdGgsIGZhY3RvcnkpCiAKQEAgLTEwOTYsNyArMTE5OCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KHNlbGYuX2JveC5nZXRfbGFiZWxzKCkpLCBzZXQoWydibGFoJ10pKQogCiAKLWNsYXNzIFRlc3RNZXNzYWdlKFRlc3RCYXNlKToKK2NsYXNzIFRlc3RNZXNzYWdlKFRlc3RCYXNlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBfZmFjdG9yeSA9IG1haWxib3guTWVzc2FnZSAgICAgICMgT3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzIHRvIHJldXNlIHRlc3RzCiAKQEAgLTExMzcsNyArMTIzOSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtc2csIHNlbGYuX2ZhY3RvcnkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmtleXMoKSwgW10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobXNnLmlzX211bHRpcGFydCgpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZCgpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShtc2cuZ2V0X3BheWxvYWQoKSkKIAogICAgIGRlZiB0ZXN0X2luaXRpYWxpemVfaW5jb3JyZWN0bHkoc2VsZik6CiAgICAgICAgICMgSW5pdGlhbGl6ZSB3aXRoIGludmFsaWQgYXJndW1lbnQKQEAgLTExNjcsNyArMTI2OSw3IEBACiAgICAgICAgIHBhc3MKIAogCi1jbGFzcyBUZXN0TWFpbGRpck1lc3NhZ2UoVGVzdE1lc3NhZ2UpOgorY2xhc3MgVGVzdE1haWxkaXJNZXNzYWdlKFRlc3RNZXNzYWdlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBfZmFjdG9yeSA9IG1haWxib3guTWFpbGRpck1lc3NhZ2UKIApAQCAtMTIxMCw3ICsxMzEyLDcgQEAKICAgICAgICAgIyBVc2UgZ2V0X2RhdGUoKSBhbmQgc2V0X2RhdGUoKQogICAgICAgICBtc2cgPSBtYWlsYm94Lk1haWxkaXJNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKICAgICAgICAgZGlmZiA9IG1zZy5nZXRfZGF0ZSgpIC0gdGltZS50aW1lKCkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFicyhkaWZmKSA8IDYwLCBkaWZmKQorICAgICAgICBzZWxmLmFzc2VydExlc3MoYWJzKGRpZmYpLCA2MCwgZGlmZikKICAgICAgICAgbXNnLnNldF9kYXRlKDAuMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2RhdGUoKSwgMC4wKQogCkBAIC0xMjQyLDcgKzEzNDQsNyBAQAogICAgICAgICBzZWxmLl9jaGVja19zYW1wbGUobXNnKQogCiAKLWNsYXNzIF9UZXN0TWJveE1NREZNZXNzYWdlKFRlc3RNZXNzYWdlKToKK2NsYXNzIF9UZXN0TWJveE1NREZNZXNzYWdlOgogCiAgICAgX2ZhY3RvcnkgPSBtYWlsYm94Ll9tYm94TU1ERk1lc3NhZ2UKIApAQCAtMTI4NSwxNiArMTM4NywxNyBAQAogICAgICAgICAjIENoZWNrIGNvbnRlbnRzIG9mICJGcm9tICIgbGluZQogICAgICAgICBpZiBzZW5kZXIgaXMgTm9uZToKICAgICAgICAgICAgIHNlbmRlciA9ICJNQUlMRVItREFFTU9OIgotICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goc2VuZGVyICsgciIgXHd7M30gXHd7M30gW1xkIF1cZCBbXGQgXVxkOlxkezJ9OiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiXGR7Mn0gXGR7NH0iLCBtc2cuZ2V0X2Zyb20oKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKHJlLm1hdGNoKAorICAgICAgICAgICAgICAgIHNlbmRlciArIHIiIFx3ezN9IFx3ezN9IFtcZCBdXGQgW1xkIF1cZDpcZHsyfTpcZHsyfSBcZHs0fSIsCisgICAgICAgICAgICAgICAgbXNnLmdldF9mcm9tKCkpKQogCiAKLWNsYXNzIFRlc3RNYm94TWVzc2FnZShfVGVzdE1ib3hNTURGTWVzc2FnZSk6CitjbGFzcyBUZXN0TWJveE1lc3NhZ2UoX1Rlc3RNYm94TU1ERk1lc3NhZ2UsIFRlc3RNZXNzYWdlKToKIAogICAgIF9mYWN0b3J5ID0gbWFpbGJveC5tYm94TWVzc2FnZQogCiAKLWNsYXNzIFRlc3RNSE1lc3NhZ2UoVGVzdE1lc3NhZ2UpOgorY2xhc3MgVGVzdE1ITWVzc2FnZShUZXN0TWVzc2FnZSwgdW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgX2ZhY3RvcnkgPSBtYWlsYm94Lk1ITWVzc2FnZQogCkBAIC0xMzI1LDcgKzE0MjgsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfc2VxdWVuY2VzKCksIFsnZm9vYmFyJywgJ3JlcGxpZWQnXSkKIAogCi1jbGFzcyBUZXN0QmFieWxNZXNzYWdlKFRlc3RNZXNzYWdlKToKK2NsYXNzIFRlc3RCYWJ5bE1lc3NhZ2UoVGVzdE1lc3NhZ2UsIHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIF9mYWN0b3J5ID0gbWFpbGJveC5CYWJ5bE1lc3NhZ2UKIApAQCAtMTM2MCw3ICsxNDYzLDcgQEAKICAgICAgICAgbXNnID0gbWFpbGJveC5CYWJ5bE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQogICAgICAgICB2aXNpYmxlID0gbXNnLmdldF92aXNpYmxlKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2aXNpYmxlLmtleXMoKSwgW10pCi0gICAgICAgIHNlbGYuYXNzZXJ0SXModmlzaWJsZS5nZXRfcGF5bG9hZCgpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZSh2aXNpYmxlLmdldF9wYXlsb2FkKCkpCiAgICAgICAgIHZpc2libGVbJ1VzZXItQWdlbnQnXSA9ICdGb29CYXIgMS4wJwogICAgICAgICB2aXNpYmxlWydYLVdoYXRldmVyJ10gPSAnQmxhaCcKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3Zpc2libGUoKS5rZXlzKCksIFtdKQpAQCAtMTM2OSwxMCArMTQ3MiwxMCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZpc2libGUua2V5cygpLCBbJ1VzZXItQWdlbnQnLCAnWC1XaGF0ZXZlciddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZpc2libGVbJ1VzZXItQWdlbnQnXSwgJ0Zvb0JhciAxLjAnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZpc2libGVbJ1gtV2hhdGV2ZXInXSwgJ0JsYWgnKQotICAgICAgICBzZWxmLmFzc2VydElzKHZpc2libGUuZ2V0X3BheWxvYWQoKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUodmlzaWJsZS5nZXRfcGF5bG9hZCgpKQogICAgICAgICBtc2cudXBkYXRlX3Zpc2libGUoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZpc2libGUua2V5cygpLCBbJ1VzZXItQWdlbnQnLCAnWC1XaGF0ZXZlciddKQotICAgICAgICBzZWxmLmFzc2VydElzKHZpc2libGUuZ2V0X3BheWxvYWQoKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUodmlzaWJsZS5nZXRfcGF5bG9hZCgpKQogICAgICAgICB2aXNpYmxlID0gbXNnLmdldF92aXNpYmxlKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2aXNpYmxlLmtleXMoKSwgWydVc2VyLUFnZW50JywgJ0RhdGUnLCAnRnJvbScsICdUbycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU3ViamVjdCddKQpAQCAtMTM4MCwxMiArMTQ4MywxMiBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2aXNpYmxlW2hlYWRlcl0sIG1zZ1toZWFkZXJdKQogCiAKLWNsYXNzIFRlc3RNTURGTWVzc2FnZShfVGVzdE1ib3hNTURGTWVzc2FnZSk6CitjbGFzcyBUZXN0TU1ERk1lc3NhZ2UoX1Rlc3RNYm94TU1ERk1lc3NhZ2UsIFRlc3RNZXNzYWdlKToKIAogICAgIF9mYWN0b3J5ID0gbWFpbGJveC5NTURGTWVzc2FnZQogCiAKLWNsYXNzIFRlc3RNZXNzYWdlQ29udmVyc2lvbihUZXN0QmFzZSk6CitjbGFzcyBUZXN0TWVzc2FnZUNvbnZlcnNpb24oVGVzdEJhc2UsIHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X3BsYWluX3RvX3goc2VsZik6CiAgICAgICAgICMgQ29udmVydCBNZXNzYWdlIHRvIGFsbCBmb3JtYXRzCkBAIC0xNzA4LDcgKzE4MTEsNyBAQAogICAgICAgICBwcm94eS5jbG9zZSgpCiAKIAotY2xhc3MgVGVzdFByb3h5RmlsZShUZXN0UHJveHlGaWxlQmFzZSk6CitjbGFzcyBUZXN0UHJveHlGaWxlKFRlc3RQcm94eUZpbGVCYXNlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIHNlbGYuX3BhdGggPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCkBAIC0xNzU3LDcgKzE4NjAsNyBAQAogICAgICAgICBzZWxmLl90ZXN0X2Nsb3NlKG1haWxib3guX1Byb3h5RmlsZShzZWxmLl9maWxlKSkKIAogCi1jbGFzcyBUZXN0UGFydGlhbEZpbGUoVGVzdFByb3h5RmlsZUJhc2UpOgorY2xhc3MgVGVzdFBhcnRpYWxGaWxlKFRlc3RQcm94eUZpbGVCYXNlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIHNlbGYuX3BhdGggPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCkBAIC0xODI0LDYgKzE5MjcsMTAgQEAKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgICMgY3JlYXRlIGEgbmV3IG1haWxkaXIgbWFpbGJveCB0byB3b3JrIHdpdGg6CiAgICAgICAgIHNlbGYuX2RpciA9IHRlc3Rfc3VwcG9ydC5URVNURk4KKyAgICAgICAgaWYgb3MucGF0aC5pc2RpcihzZWxmLl9kaXIpOgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnJtdHJlZShzZWxmLl9kaXIpCisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHNlbGYuX2Rpcik6CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKHNlbGYuX2RpcikKICAgICAgICAgb3MubWtkaXIoc2VsZi5fZGlyKQogICAgICAgICBvcy5ta2Rpcihvcy5wYXRoLmpvaW4oc2VsZi5fZGlyLCAiY3VyIikpCiAgICAgICAgIG9zLm1rZGlyKG9zLnBhdGguam9pbihzZWxmLl9kaXIsICJ0bXAiKSkKQEAgLTE4MzMsMTAgKzE5NDAsMTAgQEAKIAogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICAgbWFwKG9zLnVubGluaywgc2VsZi5fbXNnZmlsZXMpCi0gICAgICAgIG9zLnJtZGlyKG9zLnBhdGguam9pbihzZWxmLl9kaXIsICJjdXIiKSkKLSAgICAgICAgb3Mucm1kaXIob3MucGF0aC5qb2luKHNlbGYuX2RpciwgInRtcCIpKQotICAgICAgICBvcy5ybWRpcihvcy5wYXRoLmpvaW4oc2VsZi5fZGlyLCAibmV3IikpCi0gICAgICAgIG9zLnJtZGlyKHNlbGYuX2RpcikKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJtZGlyKG9zLnBhdGguam9pbihzZWxmLl9kaXIsICJjdXIiKSkKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJtZGlyKG9zLnBhdGguam9pbihzZWxmLl9kaXIsICJ0bXAiKSkKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJtZGlyKG9zLnBhdGguam9pbihzZWxmLl9kaXIsICJuZXciKSkKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJtZGlyKHNlbGYuX2RpcikKIAogICAgIGRlZiBjcmVhdGVNZXNzYWdlKHNlbGYsIGRpciwgbWJveD1GYWxzZSk6CiAgICAgICAgIHQgPSBpbnQodGltZS50aW1lKCkgJSAxMDAwMDAwKQpAQCAtMTg2NCw0NiArMTk3MSw1NiBAQAogICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgYm94ZXMgYXR0cmlidXRlIGFjdHVhbGx5IGdldHMgc2V0LgogICAgICAgICBzZWxmLm1ib3ggPSBtYWlsYm94Lk1haWxkaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKICAgICAgICAgI3NlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHNlbGYubWJveCwgImJveGVzIikpCi0gICAgICAgICNzZWxmLmFzc2VydFRydWUobGVuKHNlbGYubWJveC5ib3hlcykgPT0gMCkKLSAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLm1ib3gubmV4dCgpLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYubWJveC5uZXh0KCksIE5vbmUpCisgICAgICAgICNzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLm1ib3guYm94ZXMpLCAwKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzZWxmLm1ib3gubmV4dCgpKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzZWxmLm1ib3gubmV4dCgpKQogCiAgICAgZGVmIHRlc3Rfbm9uZW1wdHlfbWFpbGRpcl9jdXIoc2VsZik6CiAgICAgICAgIHNlbGYuY3JlYXRlTWVzc2FnZSgiY3VyIikKICAgICAgICAgc2VsZi5tYm94ID0gbWFpbGJveC5NYWlsZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCi0gICAgICAgICNzZWxmLmFzc2VydFRydWUobGVuKHNlbGYubWJveC5ib3hlcykgPT0gMSkKLSAgICAgICAgc2VsZi5hc3NlcnRJc05vdChzZWxmLm1ib3gubmV4dCgpLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYubWJveC5uZXh0KCksIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5tYm94Lm5leHQoKSwgTm9uZSkKKyAgICAgICAgI3NlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYubWJveC5ib3hlcyksIDEpCisgICAgICAgIG1zZyA9IHNlbGYubWJveC5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUobXNnKQorICAgICAgICBtc2cuZnAuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzZWxmLm1ib3gubmV4dCgpKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzZWxmLm1ib3gubmV4dCgpKQogCiAgICAgZGVmIHRlc3Rfbm9uZW1wdHlfbWFpbGRpcl9uZXcoc2VsZik6CiAgICAgICAgIHNlbGYuY3JlYXRlTWVzc2FnZSgibmV3IikKICAgICAgICAgc2VsZi5tYm94ID0gbWFpbGJveC5NYWlsZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCi0gICAgICAgICNzZWxmLmFzc2VydFRydWUobGVuKHNlbGYubWJveC5ib3hlcykgPT0gMSkKLSAgICAgICAgc2VsZi5hc3NlcnRJc05vdChzZWxmLm1ib3gubmV4dCgpLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYubWJveC5uZXh0KCksIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5tYm94Lm5leHQoKSwgTm9uZSkKKyAgICAgICAgI3NlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYubWJveC5ib3hlcyksIDEpCisgICAgICAgIG1zZyA9IHNlbGYubWJveC5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUobXNnKQorICAgICAgICBtc2cuZnAuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzZWxmLm1ib3gubmV4dCgpKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzZWxmLm1ib3gubmV4dCgpKQogCiAgICAgZGVmIHRlc3Rfbm9uZW1wdHlfbWFpbGRpcl9ib3RoKHNlbGYpOgogICAgICAgICBzZWxmLmNyZWF0ZU1lc3NhZ2UoImN1ciIpCiAgICAgICAgIHNlbGYuY3JlYXRlTWVzc2FnZSgibmV3IikKICAgICAgICAgc2VsZi5tYm94ID0gbWFpbGJveC5NYWlsZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCi0gICAgICAgICNzZWxmLmFzc2VydFRydWUobGVuKHNlbGYubWJveC5ib3hlcykgPT0gMikKLSAgICAgICAgc2VsZi5hc3NlcnRJc05vdChzZWxmLm1ib3gubmV4dCgpLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydElzTm90KHNlbGYubWJveC5uZXh0KCksIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5tYm94Lm5leHQoKSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLm1ib3gubmV4dCgpLCBOb25lKQorICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5tYm94LmJveGVzKSwgMikKKyAgICAgICAgbXNnID0gc2VsZi5tYm94Lm5leHQoKQorICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZShtc2cpCisgICAgICAgIG1zZy5mcC5jbG9zZSgpCisgICAgICAgIG1zZyA9IHNlbGYubWJveC5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUobXNnKQorICAgICAgICBtc2cuZnAuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzZWxmLm1ib3gubmV4dCgpKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzZWxmLm1ib3gubmV4dCgpKQogCiAgICAgZGVmIHRlc3RfdW5peF9tYm94KHNlbGYpOgogICAgICAgICAjIyMgc2hvdWxkIGJlIGJldHRlciEKICAgICAgICAgaW1wb3J0IGVtYWlsLnBhcnNlcgogICAgICAgICBmbmFtZSA9IHNlbGYuY3JlYXRlTWVzc2FnZSgiY3VyIiwgVHJ1ZSkKICAgICAgICAgbiA9IDAKLSAgICAgICAgZm9yIG1zZyBpbiBtYWlsYm94LlBvcnRhYmxlVW5peE1haWxib3gob3BlbihmbmFtZSksCisgICAgICAgIGZpZCA9IG9wZW4oZm5hbWUpCisgICAgICAgIGZvciBtc2cgaW4gbWFpbGJveC5Qb3J0YWJsZVVuaXhNYWlsYm94KGZpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1haWwucGFyc2VyLlBhcnNlcigpLnBhcnNlKToKICAgICAgICAgICAgIG4gKz0gMQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dbInN1YmplY3QiXSwgIlNpbXBsZSBUZXN0IikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHN0cihtc2cpKSwgbGVuKEZST01fKStsZW4oRFVNTVlfTUVTU0FHRSkpCisgICAgICAgIGZpZC5jbG9zZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobiwgMSkKIAogIyMgRW5kOiBjbGFzc2VzIGZyb20gdGhlIG9yaWdpbmFsIG1vZHVsZSAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpLgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tYXJzaGFsLnB5IGIvTGliL3Rlc3QvdGVzdF9tYXJzaGFsLnB5CmluZGV4IDc0NGY5M2MuLjU5ZmEzZWIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWFyc2hhbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X21hcnNoYWwucHkKQEAgLTEsNCArMSwzIEBACi0jIS91c3IvYmluL2VudiBweXRob24KICMgLSotIGNvZGluZzogaXNvLTg4NTktMSAtKi0KIAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKQEAgLTI2OSw2ICsyNjgsNTMgQEAKICAgICAgICAgaW52YWxpZF9zdHJpbmcgPSAnbFx4MDJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwJwogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXJzaGFsLmxvYWRzLCBpbnZhbGlkX3N0cmluZykKIAorTEFSR0VfU0laRSA9IDIqKjMxCitjaGFyYWN0ZXJfc2l6ZSA9IDQgaWYgc3lzLm1heHVuaWNvZGUgPiAweEZGRkYgZWxzZSAyCitwb2ludGVyX3NpemUgPSA4IGlmIHN5cy5tYXhzaXplID4gMHhGRkZGRkZGRiBlbHNlIDQKKworQHVuaXR0ZXN0LnNraXBJZihMQVJHRV9TSVpFID4gc3lzLm1heHNpemUsICJ0ZXN0IGNhbm5vdCBydW4gb24gMzItYml0IHN5c3RlbXMiKQorY2xhc3MgTGFyZ2VWYWx1ZXNUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIGNoZWNrX3VubWFyc2hhbGxhYmxlKHNlbGYsIGRhdGEpOgorICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAnd2InKQorICAgICAgICBzZWxmLmFkZENsZWFudXAodGVzdF9zdXBwb3J0LnVubGluaywgdGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgd2l0aCBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWFyc2hhbC5kdW1wLCBkYXRhLCBmKQorCisgICAgQHRlc3Rfc3VwcG9ydC5wcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9TEFSR0VfU0laRSwgbWVtdXNlPTEsIGRyeV9ydW49RmFsc2UpCisgICAgZGVmIHRlc3Rfc3RyaW5nKHNlbGYsIHNpemUpOgorICAgICAgICBzZWxmLmNoZWNrX3VubWFyc2hhbGxhYmxlKCd4JyAqIHNpemUpCisKKyAgICBAdGVzdF9zdXBwb3J0LnByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1MQVJHRV9TSVpFLAorICAgICAgICAgICAgbWVtdXNlPWNoYXJhY3Rlcl9zaXplICsgMiwgZHJ5X3J1bj1GYWxzZSkKKyAgICBkZWYgdGVzdF91bmljb2RlKHNlbGYsIHNpemUpOgorICAgICAgICBzZWxmLmNoZWNrX3VubWFyc2hhbGxhYmxlKHUneCcgKiBzaXplKQorCisgICAgQHRlc3Rfc3VwcG9ydC5wcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9TEFSR0VfU0laRSwKKyAgICAgICAgICAgIG1lbXVzZT1wb2ludGVyX3NpemUsIGRyeV9ydW49RmFsc2UpCisgICAgZGVmIHRlc3RfdHVwbGUoc2VsZiwgc2l6ZSk6CisgICAgICAgIHNlbGYuY2hlY2tfdW5tYXJzaGFsbGFibGUoKE5vbmUsKSAqIHNpemUpCisKKyAgICBAdGVzdF9zdXBwb3J0LnByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1MQVJHRV9TSVpFLAorICAgICAgICAgICAgbWVtdXNlPXBvaW50ZXJfc2l6ZSwgZHJ5X3J1bj1GYWxzZSkKKyAgICBkZWYgdGVzdF9saXN0KHNlbGYsIHNpemUpOgorICAgICAgICBzZWxmLmNoZWNrX3VubWFyc2hhbGxhYmxlKFtOb25lXSAqIHNpemUpCisKKyAgICBAdGVzdF9zdXBwb3J0LnByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1MQVJHRV9TSVpFLAorICAgICAgICAgICAgbWVtdXNlPXBvaW50ZXJfc2l6ZSoxMiArIHN5cy5nZXRzaXplb2YoTEFSR0VfU0laRS0xKSwKKyAgICAgICAgICAgIGRyeV9ydW49RmFsc2UpCisgICAgZGVmIHRlc3Rfc2V0KHNlbGYsIHNpemUpOgorICAgICAgICBzZWxmLmNoZWNrX3VubWFyc2hhbGxhYmxlKHNldChyYW5nZShzaXplKSkpCisKKyAgICBAdGVzdF9zdXBwb3J0LnByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1MQVJHRV9TSVpFLAorICAgICAgICAgICAgbWVtdXNlPXBvaW50ZXJfc2l6ZSoxMiArIHN5cy5nZXRzaXplb2YoTEFSR0VfU0laRS0xKSwKKyAgICAgICAgICAgIGRyeV9ydW49RmFsc2UpCisgICAgZGVmIHRlc3RfZnJvemVuc2V0KHNlbGYsIHNpemUpOgorICAgICAgICBzZWxmLmNoZWNrX3VubWFyc2hhbGxhYmxlKGZyb3plbnNldChyYW5nZShzaXplKSkpCisKKyAgICBAdGVzdF9zdXBwb3J0LnByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1MQVJHRV9TSVpFLCBtZW11c2U9MSwgZHJ5X3J1bj1GYWxzZSkKKyAgICBkZWYgdGVzdF9ieXRlYXJyYXkoc2VsZiwgc2l6ZSk6CisgICAgICAgIHNlbGYuY2hlY2tfdW5tYXJzaGFsbGFibGUoYnl0ZWFycmF5KHNpemUpKQorCiAKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEludFRlc3RDYXNlLApAQCAtMjc3LDcgKzMyMyw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlVGVzdENhc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250YWluZXJUZXN0Q2FzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvblRlc3RDYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVnc1Rlc3RDYXNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVnc1Rlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFyZ2VWYWx1ZXNUZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21hdGgucHkgYi9MaWIvdGVzdC90ZXN0X21hdGgucHkKaW5kZXggYWM0NDc1ZS4uYzdmNTc1MiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tYXRoLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbWF0aC5weQpAQCAtNTk5LDYgKzU5OSw5IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5sb2coSU5GKSwgSU5GKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmxvZywgTklORikKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5sb2coTkFOKSkpCisgICAgICAgICMgTG9nIHZhbHVlcyBzaG91bGQgbWF0Y2ggZm9yIGludCBhbmQgbG9uZyAoaXNzdWUgIzE4NzM5KS4KKyAgICAgICAgZm9yIG4gaW4gcmFuZ2UoMSwgMTAwMCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgubG9nKG4pLCBtYXRoLmxvZyhsb25nKG4pKSkKIAogICAgIGRlZiB0ZXN0TG9nMXAoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5sb2cxcCkKQEAgLTYyMSw2ICs2MjQsOSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgubG9nKElORiksIElORikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5sb2cxMCwgTklORikKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5sb2cxMChOQU4pKSkKKyAgICAgICAgIyBMb2cgdmFsdWVzIHNob3VsZCBtYXRjaCBmb3IgaW50IGFuZCBsb25nIChpc3N1ZSAjMTg3MzkpLgorICAgICAgICBmb3IgbiBpbiByYW5nZSgxLCAxMDAwKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5sb2cxMChuKSwgbWF0aC5sb2cxMChsb25nKG4pKSkKIAogICAgIGRlZiB0ZXN0TW9kZihzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLm1vZGYpCkBAIC05MDAsMzggKzkwNiwzNyBAQAogICAgICMgc3RpbGwgZmFpbHMgdGhpcyBwYXJ0IG9mIHRoZSB0ZXN0IG9uIHNvbWUgcGxhdGZvcm1zLiAgRm9yIG5vdywgd2Ugb25seQogICAgICMgKnJ1biogdGVzdF9leGNlcHRpb25zKCkgaW4gdmVyYm9zZSBtb2RlLCBzbyB0aGF0IHRoaXMgaXNuJ3Qgbm9ybWFsbHkKICAgICAjIHRlc3RlZC4KKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh2ZXJib3NlLCAncmVxdWlyZXMgdmVyYm9zZSBtb2RlJykKKyAgICBkZWYgdGVzdF9leGNlcHRpb25zKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB4ID0gbWF0aC5leHAoLTEwMDAwMDAwMDApCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICMgbWF0aG1vZHVsZS5jIGlzIGZhaWxpbmcgdG8gd2VlZCBvdXQgdW5kZXJmbG93cyBmcm9tIGxpYm0sIG9yCisgICAgICAgICAgICAjIHdlJ3ZlIGdvdCBhbiBmcCBmb3JtYXQgd2l0aCBodWdlIGR5bmFtaWMgcmFuZ2UKKyAgICAgICAgICAgIHNlbGYuZmFpbCgidW5kZXJmbG93aW5nIGV4cCgpIHNob3VsZCBub3QgaGF2ZSByYWlzZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgImFuIGV4Y2VwdGlvbiIpCisgICAgICAgIGlmIHggIT0gMDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgidW5kZXJmbG93aW5nIGV4cCgpIHNob3VsZCBoYXZlIHJldHVybmVkIDAiKQogCi0gICAgaWYgdmVyYm9zZToKLSAgICAgICAgZGVmIHRlc3RfZXhjZXB0aW9ucyhzZWxmKToKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICB4ID0gbWF0aC5leHAoLTEwMDAwMDAwMDApCi0gICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgIyBtYXRobW9kdWxlLmMgaXMgZmFpbGluZyB0byB3ZWVkIG91dCB1bmRlcmZsb3dzIGZyb20gbGlibSwgb3IKLSAgICAgICAgICAgICAgICAjIHdlJ3ZlIGdvdCBhbiBmcCBmb3JtYXQgd2l0aCBodWdlIGR5bmFtaWMgcmFuZ2UKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInVuZGVyZmxvd2luZyBleHAoKSBzaG91bGQgbm90IGhhdmUgcmFpc2VkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImFuIGV4Y2VwdGlvbiIpCi0gICAgICAgICAgICBpZiB4ICE9IDA6Ci0gICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ1bmRlcmZsb3dpbmcgZXhwKCkgc2hvdWxkIGhhdmUgcmV0dXJuZWQgMCIpCisgICAgICAgICMgSWYgdGhpcyBmYWlscywgcHJvYmFibHkgdXNpbmcgYSBzdHJpY3QgSUVFRS03NTQgY29uZm9ybWluZyBsaWJtLCBhbmQgeAorICAgICAgICAjIGlzICtJbmYgYWZ0ZXJ3YXJkcy4gIEJ1dCBQeXRob24gd2FudHMgb3ZlcmZsb3dzIGRldGVjdGVkIGJ5IGRlZmF1bHQuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHggPSBtYXRoLmV4cCgxMDAwMDAwMDAwKQorICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgib3ZlcmZsb3dpbmcgZXhwKCkgZGlkbid0IHRyaWdnZXIgT3ZlcmZsb3dFcnJvciIpCiAKLSAgICAgICAgICAgICMgSWYgdGhpcyBmYWlscywgcHJvYmFibHkgdXNpbmcgYSBzdHJpY3QgSUVFRS03NTQgY29uZm9ybWluZyBsaWJtLCBhbmQgeAotICAgICAgICAgICAgIyBpcyArSW5mIGFmdGVyd2FyZHMuICBCdXQgUHl0aG9uIHdhbnRzIG92ZXJmbG93cyBkZXRlY3RlZCBieSBkZWZhdWx0LgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHggPSBtYXRoLmV4cCgxMDAwMDAwMDAwKQotICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6Ci0gICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIm92ZXJmbG93aW5nIGV4cCgpIGRpZG4ndCB0cmlnZ2VyIE92ZXJmbG93RXJyb3IiKQotCi0gICAgICAgICAgICAjIElmIHRoaXMgZmFpbHMsIGl0IGNvdWxkIGJlIGEgcHV6emxlLiAgT25lIG9kZCBwb3NzaWJpbGl0eSBpcyB0aGF0Ci0gICAgICAgICAgICAjIG1hdGhtb2R1bGUuYydzIG1hY3JvcyBhcmUgZ2V0dGluZyBjb25mdXNlZCB3aGlsZSBjb21wYXJpbmcKLSAgICAgICAgICAgICMgSW5mIChIVUdFX1ZBTCkgdG8gYSBOYU4sIGFuZCBhcnRpZmljaWFsbHkgc2V0dGluZyBlcnJubyB0byBFUkFOR0UKLSAgICAgICAgICAgICMgYXMgYSByZXN1bHQgKGFuZCBzbyByYWlzaW5nIE92ZXJmbG93RXJyb3IgaW5zdGVhZCkuCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgeCA9IG1hdGguc3FydCgtMS4wKQotICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInNxcnQoLTEpIGRpZG4ndCByYWlzZSBWYWx1ZUVycm9yIikKKyAgICAgICAgIyBJZiB0aGlzIGZhaWxzLCBpdCBjb3VsZCBiZSBhIHB1enpsZS4gIE9uZSBvZGQgcG9zc2liaWxpdHkgaXMgdGhhdAorICAgICAgICAjIG1hdGhtb2R1bGUuYydzIG1hY3JvcyBhcmUgZ2V0dGluZyBjb25mdXNlZCB3aGlsZSBjb21wYXJpbmcKKyAgICAgICAgIyBJbmYgKEhVR0VfVkFMKSB0byBhIE5hTiwgYW5kIGFydGlmaWNpYWxseSBzZXR0aW5nIGVycm5vIHRvIEVSQU5HRQorICAgICAgICAjIGFzIGEgcmVzdWx0IChhbmQgc28gcmFpc2luZyBPdmVyZmxvd0Vycm9yIGluc3RlYWQpLgorICAgICAgICB0cnk6CisgICAgICAgICAgICB4ID0gbWF0aC5zcXJ0KC0xLjApCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzcXJ0KC0xKSBkaWRuJ3QgcmFpc2UgVmFsdWVFcnJvciIpCiAKICAgICBAcmVxdWlyZXNfSUVFRV83NTQKICAgICBkZWYgdGVzdF90ZXN0ZmlsZShzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWVtb3J5aW8ucHkgYi9MaWIvdGVzdC90ZXN0X21lbW9yeWlvLnB5CmluZGV4IDY4NjU3YWEuLjc0YTlmZmIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWVtb3J5aW8ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tZW1vcnlpby5weQpAQCAtMzI4LDkgKzMyOCw5IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uaXNhdHR5KCksIEZhbHNlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLmNsb3NlZCwgRmFsc2UpCiAgICAgICAgIG1lbWlvLmNsb3NlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby53cml0YWJsZSgpLCBUcnVlKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWRhYmxlKCksIFRydWUpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uc2Vla2FibGUoKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWVtaW8ud3JpdGFibGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1lbWlvLnJlYWRhYmxlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtZW1pby5zZWVrYWJsZSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWVtaW8uaXNhdHR5KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLmNsb3NlZCwgVHJ1ZSkKIApAQCAtNTIyLDYgKzUyMiwxNyBAQAogICAgICAgICBzZWxmLmFzc2VydElzTm9uZShtZW1pby5lcnJvcnMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobWVtaW8ubGluZV9idWZmZXJpbmcpCiAKKyAgICBkZWYgdGVzdF9uZXdsaW5lX2RlZmF1bHQoc2VsZik6CisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKCJhXG5iXHJcbmNccmQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QobWVtaW8pLCBbImFcbiIsICJiXHJcbiIsICJjXHJkIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uZ2V0dmFsdWUoKSwgImFcbmJcclxuY1xyZCIpCisKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLndyaXRlKCJhXG5iXHJcbmNccmQiKSwgOCkKKyAgICAgICAgbWVtaW8uc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QobWVtaW8pLCBbImFcbiIsICJiXHJcbiIsICJjXHJkIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uZ2V0dmFsdWUoKSwgImFcbmJcclxuY1xyZCIpCisKICAgICBkZWYgdGVzdF9uZXdsaW5lX25vbmUoc2VsZik6CiAgICAgICAgICMgbmV3bGluZT1Ob25lCiAgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKCJhXG5iXHJcbmNccmQiLCBuZXdsaW5lPU5vbmUpCkBAIC01MzEsMTIgKzU0MiwxNiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWQoMiksICJcbmIiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWQoMiksICJcbmMiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWQoMSksICJcbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uZ2V0dmFsdWUoKSwgImFcbmJcbmNcbmQiKQorCiAgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKG5ld2xpbmU9Tm9uZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBtZW1pby53cml0ZSgiYVxuIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgbWVtaW8ud3JpdGUoImJcclxuIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgbWVtaW8ud3JpdGUoImNccmQiKSkKICAgICAgICAgbWVtaW8uc2VlaygwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWQoKSwgImFcbmJcbmNcbmQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLmdldHZhbHVlKCksICJhXG5iXG5jXG5kIikKKwogICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcygiYVxyXG5iIiwgbmV3bGluZT1Ob25lKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWQoMyksICJhXG5iIikKIApAQCAtNTQ4LDYgKzU2Myw4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZCg0KSwgImFcbmJcciIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZCgyKSwgIlxuYyIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZCgxKSwgIlxyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5nZXR2YWx1ZSgpLCAiYVxuYlxyXG5jXHJkIikKKwogICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcyhuZXdsaW5lPSIiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIG1lbWlvLndyaXRlKCJhXG4iKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBtZW1pby53cml0ZSgiYlxyIikpCkBAIC01NTUsMTEgKzU3MiwxOSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIG1lbWlvLndyaXRlKCJccmQiKSkKICAgICAgICAgbWVtaW8uc2VlaygwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QobWVtaW8pLCBbImFcbiIsICJiXHJcbiIsICJjXHIiLCAiZCJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLmdldHZhbHVlKCksICJhXG5iXHJcbmNccmQiKQogCiAgICAgZGVmIHRlc3RfbmV3bGluZV9sZihzZWxmKToKICAgICAgICAgIyBuZXdsaW5lPSJcbiIKLSAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoImFcbmJcclxuY1xyZCIpCisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKCJhXG5iXHJcbmNccmQiLCBuZXdsaW5lPSJcbiIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChtZW1pbyksIFsiYVxuIiwgImJcclxuIiwgImNccmQiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5nZXR2YWx1ZSgpLCAiYVxuYlxyXG5jXHJkIikKKworICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcyhuZXdsaW5lPSJcbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ud3JpdGUoImFcbmJcclxuY1xyZCIpLCA4KQorICAgICAgICBtZW1pby5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChtZW1pbyksIFsiYVxuIiwgImJcclxuIiwgImNccmQiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5nZXR2YWx1ZSgpLCAiYVxuYlxyXG5jXHJkIikKIAogICAgIGRlZiB0ZXN0X25ld2xpbmVfY3Ioc2VsZik6CiAgICAgICAgICMgbmV3bGluZT0iXHIiCkBAIC01NjcsNiArNTkyLDE1IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZCgpLCAiYVxyYlxyXHJjXHJkIikKICAgICAgICAgbWVtaW8uc2VlaygwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QobWVtaW8pLCBbImFcciIsICJiXHIiLCAiXHIiLCAiY1xyIiwgImQiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5nZXR2YWx1ZSgpLCAiYVxyYlxyXHJjXHJkIikKKworICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcyhuZXdsaW5lPSJcciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ud3JpdGUoImFcbmJcclxuY1xyZCIpLCA4KQorICAgICAgICBtZW1pby5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChtZW1pbyksIFsiYVxyIiwgImJcciIsICJcciIsICJjXHIiLCAiZCJdKQorICAgICAgICBtZW1pby5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZGxpbmVzKCksIFsiYVxyIiwgImJcciIsICJcciIsICJjXHIiLCAiZCJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLmdldHZhbHVlKCksICJhXHJiXHJccmNccmQiKQogCiAgICAgZGVmIHRlc3RfbmV3bGluZV9jcmxmKHNlbGYpOgogICAgICAgICAjIG5ld2xpbmU9IlxyXG4iCkBAIC01NzQsMTEgKzYwOCwyMSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWQoKSwgImFcclxuYlxyXHJcbmNccmQiKQogICAgICAgICBtZW1pby5zZWVrKDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChtZW1pbyksIFsiYVxyXG4iLCAiYlxyXHJcbiIsICJjXHJkIl0pCisgICAgICAgIG1lbWlvLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkbGluZXMoKSwgWyJhXHJcbiIsICJiXHJcclxuIiwgImNccmQiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5nZXR2YWx1ZSgpLCAiYVxyXG5iXHJcclxuY1xyZCIpCisKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MobmV3bGluZT0iXHJcbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ud3JpdGUoImFcbmJcclxuY1xyZCIpLCA4KQorICAgICAgICBtZW1pby5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChtZW1pbyksIFsiYVxyXG4iLCAiYlxyXHJcbiIsICJjXHJkIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uZ2V0dmFsdWUoKSwgImFcclxuYlxyXHJcbmNccmQiKQogCiAgICAgZGVmIHRlc3RfaXNzdWU1MjY1KHNlbGYpOgogICAgICAgICAjIFN0cmluZ0lPIGNhbiBkdXBsaWNhdGUgbmV3bGluZXMgaW4gdW5pdmVyc2FsIG5ld2xpbmVzIG1vZGUKICAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoImFcclxuYlxyXG4iLCBuZXdsaW5lPU5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZCg1KSwgImFcbmJcbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uZ2V0dmFsdWUoKSwgImFcbmJcbiIpCiAKIAogY2xhc3MgUHlTdHJpbmdJT1Rlc3QoTWVtb3J5VGVzdE1peGluLCBNZW1vcnlTZWVrVGVzdE1peGluLApAQCAtNTg4LDYgKzYzMiwxNiBAQAogICAgIFVuc3VwcG9ydGVkT3BlcmF0aW9uID0gcHlpby5VbnN1cHBvcnRlZE9wZXJhdGlvbgogICAgIEVPRiA9ICIiCiAKKyAgICBkZWYgdGVzdF9sb25lX3N1cnJvZ2F0ZXMoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzIwNDI0CisgICAgICAgIHN1cnJvZ2F0ZSA9IHVuaWNocigweGQ4MDApCisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKHN1cnJvZ2F0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkKCksIHN1cnJvZ2F0ZSkKKworICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcygpCisgICAgICAgIG1lbWlvLndyaXRlKHN1cnJvZ2F0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5nZXR2YWx1ZSgpLCBzdXJyb2dhdGUpCisKIAogY2xhc3MgUHlTdHJpbmdJT1BpY2tsZVRlc3QoVGV4dElPVGVzdE1peGluLCB1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgIiIiVGVzdCBpZiBwaWNrbGUgcmVzdG9yZXMgcHJvcGVybHkgdGhlIGludGVybmFsIHN0YXRlIG9mIFN0cmluZ0lPLgpAQCAtNjM4LDYgKzY5MiwxNiBAQAogICAgICAgICBtZW1pby5jbG9zZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1lbWlvLl9fc2V0c3RhdGVfXywgKGIiY2xvc2VkIiwgMCwgTm9uZSkpCiAKKyAgICBjaGVja19zaXplb2YgPSBzdXBwb3J0LmNoZWNrX3NpemVvZgorCisgICAgQHN1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3Rfc2l6ZW9mKHNlbGYpOgorICAgICAgICBiYXNlc2l6ZSA9IHN1cHBvcnQuY2FsY29ianNpemUoYidQMlBQMlAnKQorICAgICAgICBjaGVjayA9IHNlbGYuY2hlY2tfc2l6ZW9mCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqZWN0Ll9fc2l6ZW9mX18oaW8uQnl0ZXNJTygpKSwgYmFzZXNpemUpCisgICAgICAgIGNoZWNrKGlvLkJ5dGVzSU8oKSwgYmFzZXNpemUgKQorICAgICAgICBjaGVjayhpby5CeXRlc0lPKGInYScpLCBiYXNlc2l6ZSArIDEgKyAxICkKKyAgICAgICAgY2hlY2soaW8uQnl0ZXNJTyhiJ2EnICogMTAwMCksIGJhc2VzaXplICsgMTAwMCArIDEgKQogCiBjbGFzcyBDU3RyaW5nSU9UZXN0KFB5U3RyaW5nSU9UZXN0KToKICAgICBpb2NsYXNzID0gaW8uU3RyaW5nSU8KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWVtb3J5dmlldy5weSBiL0xpYi90ZXN0L3Rlc3RfbWVtb3J5dmlldy5weQppbmRleCA1MjVkZGVhLi5mMTRiYWZkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21lbW9yeXZpZXcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tZW1vcnl2aWV3LnB5CkBAIC02Myw3ICs2Myw3IEBACiAKICAgICBkZWYgdGVzdF9zZXRpdGVtX3JlYWRvbmx5KHNlbGYpOgogICAgICAgICBpZiBub3Qgc2VsZi5yb190eXBlOgotICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJubyByZWFkLW9ubHkgdHlwZSB0byB0ZXN0IikKICAgICAgICAgYiA9IHNlbGYucm9fdHlwZShzZWxmLl9zb3VyY2UpCiAgICAgICAgIG9sZHJlZmNvdW50ID0gc3lzLmdldHJlZmNvdW50KGIpCiAgICAgICAgIG0gPSBzZWxmLl92aWV3KGIpCkBAIC03Nyw3ICs3Nyw3IEBACiAKICAgICBkZWYgdGVzdF9zZXRpdGVtX3dyaXRhYmxlKHNlbGYpOgogICAgICAgICBpZiBub3Qgc2VsZi5yd190eXBlOgotICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJubyB3cml0YWJsZSB0eXBlIHRvIHRlc3QiKQogICAgICAgICB0cCA9IHNlbGYucndfdHlwZQogICAgICAgICBiID0gc2VsZi5yd190eXBlKHNlbGYuX3NvdXJjZSkKICAgICAgICAgb2xkcmVmY291bnQgPSBzeXMuZ2V0cmVmY291bnQoYikKQEAgLTE4MywxMyArMTgzLDEzIEBACiAKICAgICBkZWYgdGVzdF9hdHRyaWJ1dGVzX3JlYWRvbmx5KHNlbGYpOgogICAgICAgICBpZiBub3Qgc2VsZi5yb190eXBlOgotICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJubyByZWFkLW9ubHkgdHlwZSB0byB0ZXN0IikKICAgICAgICAgbSA9IHNlbGYuY2hlY2tfYXR0cmlidXRlc193aXRoX3R5cGUoc2VsZi5yb190eXBlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0ucmVhZG9ubHksIFRydWUpCiAKICAgICBkZWYgdGVzdF9hdHRyaWJ1dGVzX3dyaXRhYmxlKHNlbGYpOgogICAgICAgICBpZiBub3Qgc2VsZi5yd190eXBlOgotICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJubyB3cml0YWJsZSB0eXBlIHRvIHRlc3QiKQogICAgICAgICBtID0gc2VsZi5jaGVja19hdHRyaWJ1dGVzX3dpdGhfdHlwZShzZWxmLnJ3X3R5cGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5yZWFkb25seSwgRmFsc2UpCiAKQEAgLTIzNiw3ICsyMzYsNyBAQAogICAgICAgICAjIGJ1ZmZlciBhcyB3cml0YWJsZSBjYXVzaW5nIGEgc2VnZmF1bHQgaWYgdXNpbmcgbW1hcAogICAgICAgICB0cCA9IHNlbGYucm9fdHlwZQogICAgICAgICBpZiB0cCBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJubyByZWFkLW9ubHkgdHlwZSB0byB0ZXN0IikKICAgICAgICAgYiA9IHRwKHNlbGYuX3NvdXJjZSkKICAgICAgICAgbSA9IHNlbGYuX3ZpZXcoYikKICAgICAgICAgaSA9IGlvLkJ5dGVzSU8oYidaWlpaJykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWltZXR5cGVzLnB5IGIvTGliL3Rlc3QvdGVzdF9taW1ldHlwZXMucHkKaW5kZXggMzUwOGI1Ni4uZTlhNzIxNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9taW1ldHlwZXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9taW1ldHlwZXMucHkKQEAgLTEsMyArMSw1IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorCiBpbXBvcnQgbWltZXR5cGVzCiBpbXBvcnQgU3RyaW5nSU8KIGltcG9ydCB1bml0dGVzdApAQCAtMjEsNiArMjMsOCBAQAogICAgICAgICBlcShzZWxmLmRiLmd1ZXNzX3R5cGUoImZvby50Z3oiKSwgKCJhcHBsaWNhdGlvbi94LXRhciIsICJnemlwIikpCiAgICAgICAgIGVxKHNlbGYuZGIuZ3Vlc3NfdHlwZSgiZm9vLnRhci5neiIpLCAoImFwcGxpY2F0aW9uL3gtdGFyIiwgImd6aXAiKSkKICAgICAgICAgZXEoc2VsZi5kYi5ndWVzc190eXBlKCJmb28udGFyLloiKSwgKCJhcHBsaWNhdGlvbi94LXRhciIsICJjb21wcmVzcyIpKQorICAgICAgICBlcShzZWxmLmRiLmd1ZXNzX3R5cGUoImZvby50YXIuYnoyIiksICgiYXBwbGljYXRpb24veC10YXIiLCAiYnppcDIiKSkKKyAgICAgICAgZXEoc2VsZi5kYi5ndWVzc190eXBlKCJmb28udGFyLnh6IiksICgiYXBwbGljYXRpb24veC10YXIiLCAieHoiKSkKIAogICAgIGRlZiB0ZXN0X2RhdGFfdXJscyhzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCkBAIC02OSw4ICs3Myw2IEBACiAgICAgICAgICMgZW5zdXJlIGFsbCBlbnRyaWVzIGFjdHVhbGx5IGNvbWUgZnJvbSB0aGUgV2luZG93cyByZWdpc3RyeQogICAgICAgICBzZWxmLm9yaWdpbmFsX3R5cGVzX21hcCA9IG1pbWV0eXBlcy50eXBlc19tYXAuY29weSgpCiAgICAgICAgIG1pbWV0eXBlcy50eXBlc19tYXAuY2xlYXIoKQotICAgICAgICBtaW1ldHlwZXMuaW5pdCgpCi0gICAgICAgIHNlbGYuZGIgPSBtaW1ldHlwZXMuTWltZVR5cGVzKCkKIAogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICAgIyByZXN0b3JlIGRlZmF1bHQgc2V0dGluZ3MKQEAgLTgyLDEyICs4NCw4NyBAQAogICAgICAgICAjIFdpbmRvd3MgcmVnaXN0cnkgaXMgdW5kb2N1bWVudGVkIEFGQUlLLgogICAgICAgICAjIFVzZSBmaWxlIHR5cGVzIHRoYXQgc2hvdWxkICphbHdheXMqIGV4aXN0OgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKLSAgICAgICAgZXEoc2VsZi5kYi5ndWVzc190eXBlKCJmb28udHh0IiksICgidGV4dC9wbGFpbiIsIE5vbmUpKQorICAgICAgICBtaW1ldHlwZXMuaW5pdCgpCisgICAgICAgIGRiID0gbWltZXR5cGVzLk1pbWVUeXBlcygpCisgICAgICAgIGVxKGRiLmd1ZXNzX3R5cGUoImZvby50eHQiKSwgKCJ0ZXh0L3BsYWluIiwgTm9uZSkpCisgICAgICAgIGVxKGRiLmd1ZXNzX3R5cGUoImltYWdlLmpwZyIpLCAoImltYWdlL2pwZWciLCBOb25lKSkKKyAgICAgICAgZXEoZGIuZ3Vlc3NfdHlwZSgiaW1hZ2UucG5nIiksICgiaW1hZ2UvcG5nIiwgTm9uZSkpCisKKyAgICBkZWYgdGVzdF9ub25fbGF0aW5fZXh0ZW5zaW9uKHNlbGYpOgorICAgICAgICBpbXBvcnQgX3dpbnJlZworCisgICAgICAgIGNsYXNzIE1vY2tXaW5yZWcob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgICAgICAgICBpZiBuYW1lID09ICdFbnVtS2V5JzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhbWJkYSBrZXksIGk6IF93aW5yZWcuRW51bUtleShrZXksIGkpICsgIlx4YTMiCisgICAgICAgICAgICAgICAgZWxpZiBuYW1lID09ICdPcGVuS2V5JzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhbWJkYSBrZXksIG5hbWU6IF93aW5yZWcuT3BlbktleShrZXksIG5hbWUucnN0cmlwKCJceGEzIikpCisgICAgICAgICAgICAgICAgZWxpZiBuYW1lID09ICdRdWVyeVZhbHVlRXgnOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGFtYmRhIHN1YmtleSwgbGFiZWw6ICh1J9GC0LXQutGB0YIv0L/RgNC+0YHRgtC+0LknICwgX3dpbnJlZy5SRUdfU1opCisgICAgICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoX3dpbnJlZywgbmFtZSkKKworICAgICAgICBtaW1ldHlwZXMuX3dpbnJlZyA9IE1vY2tXaW5yZWcoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIHRoaXMgdXNlZCB0byB0aHJvdyBhbiBleGNlcHRpb24gaWYgcmVnaXN0cnkgY29udGFpbmVkIG5vbi1MYXRpbgorICAgICAgICAgICAgIyBjaGFyYWN0ZXJzIGluIGV4dGVuc2lvbnMgKGlzc3VlICM5MjkxKQorICAgICAgICAgICAgbWltZXR5cGVzLmluaXQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgbWltZXR5cGVzLl93aW5yZWcgPSBfd2lucmVnCisKKyAgICBkZWYgdGVzdF9ub25fbGF0aW5fdHlwZShzZWxmKToKKyAgICAgICAgaW1wb3J0IF93aW5yZWcKKworICAgICAgICBjbGFzcyBNb2NrV2lucmVnKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CisgICAgICAgICAgICAgICAgaWYgbmFtZSA9PSAnUXVlcnlWYWx1ZUV4JzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhbWJkYSBzdWJrZXksIGxhYmVsOiAodSfRgtC10LrRgdGCL9C/0YDQvtGB0YLQvtC5JywgX3dpbnJlZy5SRUdfU1opCisgICAgICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoX3dpbnJlZywgbmFtZSkKKworICAgICAgICBtaW1ldHlwZXMuX3dpbnJlZyA9IE1vY2tXaW5yZWcoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIHRoaXMgdXNlZCB0byB0aHJvdyBhbiBleGNlcHRpb24gaWYgcmVnaXN0cnkgY29udGFpbmVkIG5vbi1MYXRpbgorICAgICAgICAgICAgIyBjaGFyYWN0ZXJzIGluIGNvbnRlbnQgdHlwZXMgKGlzc3VlICM5MjkxKQorICAgICAgICAgICAgbWltZXR5cGVzLmluaXQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgbWltZXR5cGVzLl93aW5yZWcgPSBfd2lucmVnCisKKyAgICBkZWYgdGVzdF90eXBlX21hcF92YWx1ZXMoc2VsZik6CisgICAgICAgIGltcG9ydCBfd2lucmVnCisKKyAgICAgICAgY2xhc3MgTW9ja1dpbnJlZyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICAgICAgICAgIGlmIG5hbWUgPT0gJ1F1ZXJ5VmFsdWVFeCc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYW1iZGEgc3Via2V5LCBsYWJlbDogKHUndGV4dC9wbGFpbicsIF93aW5yZWcuUkVHX1NaKQorICAgICAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKF93aW5yZWcsIG5hbWUpCisKKyAgICAgICAgbWltZXR5cGVzLl93aW5yZWcgPSBNb2NrV2lucmVnKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbWltZXR5cGVzLmluaXQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobWltZXR5cGVzLnR5cGVzX21hcC52YWx1ZXMoKVswXSwgc3RyKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG1pbWV0eXBlcy5fd2lucmVnID0gX3dpbnJlZworCisgICAgZGVmIHRlc3RfcmVnaXN0cnlfcmVhZF9lcnJvcihzZWxmKToKKyAgICAgICAgaW1wb3J0IF93aW5yZWcKKworICAgICAgICBjbGFzcyBNb2NrV2lucmVnKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgT3BlbktleShzZWxmLCBrZXksIG5hbWUpOgorICAgICAgICAgICAgICAgIGlmIGtleSAhPSBfd2lucmVnLkhLRVlfQ0xBU1NFU19ST09UOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBXaW5kb3dzRXJyb3IoNSwgIkFjY2VzcyBpcyBkZW5pZWQiKQorICAgICAgICAgICAgICAgIHJldHVybiBfd2lucmVnLk9wZW5LZXkoa2V5LCBuYW1lKQorICAgICAgICAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKF93aW5yZWcsIG5hbWUpCisKKyAgICAgICAgbWltZXR5cGVzLl93aW5yZWcgPSBNb2NrV2lucmVnKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbWltZXR5cGVzLmluaXQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgbWltZXR5cGVzLl93aW5yZWcgPSBfd2lucmVnCiAKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KE1pbWVUeXBlc1Rlc3RDYXNlLAogICAgICAgICBXaW4zMk1pbWVUeXBlc1Rlc3RDYXNlCi0gICAgICAgICkKKyAgICApCiAKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWluaWRvbS5weSBiL0xpYi90ZXN0L3Rlc3RfbWluaWRvbS5weQppbmRleCAwNjBjMWE1Li42Njk3M2VkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21pbmlkb20ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9taW5pZG9tLnB5CkBAIC0zNDAsMTkgKzM0MCw2IEBACiAgICAgICAgICAgICAgICAgYW5kIGVsLmdldEF0dHJpYnV0ZSgic3BhbTIiKSA9PSAiYmFtMiIpCiAgICAgICAgIGRvbS51bmxpbmsoKQogCi0gICAgZGVmIHRlc3RHZXRBdHRyTGlzdChzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgZGVmIHRlc3RHZXRBdHRyVmFsdWVzKHNlbGYpOiBwYXNzCi0KLSAgICBkZWYgdGVzdEdldEF0dHJMZW5ndGgoc2VsZik6IHBhc3MKLQotICAgIGRlZiB0ZXN0R2V0QXR0cmlidXRlKHNlbGYpOiBwYXNzCi0KLSAgICBkZWYgdGVzdEdldEF0dHJpYnV0ZU5TKHNlbGYpOiBwYXNzCi0KLSAgICBkZWYgdGVzdEdldEF0dHJpYnV0ZU5vZGUoc2VsZik6IHBhc3MKLQogICAgIGRlZiB0ZXN0R2V0RWxlbWVudHNCeVRhZ05hbWVOUyhzZWxmKToKICAgICAgICAgZD0iIiI8Zm9vIHhtbG5zOm1pbmlkb209J2h0dHA6Ly9weXhtbC5zZi5uZXQvbWluaWRvbSc+CiAgICAgICAgIDxtaW5pZG9tOm15ZWxlbS8+CkBAIC00MjMsOCArNDEwLDYgQEAKICAgICAgICAgc2VsZi5jb25maXJtKHN0cihub2RlKSA9PSByZXByKG5vZGUpKQogICAgICAgICBkb20udW5saW5rKCkKIAotICAgIGRlZiB0ZXN0VGV4dE5vZGVSZXByKHNlbGYpOiBwYXNzCi0KICAgICBkZWYgdGVzdFdyaXRlWE1MKHNlbGYpOgogICAgICAgICBzdHIgPSAnPD94bWwgdmVyc2lvbj0iMS4wIiA/PjxhIGI9ImMiLz4nCiAgICAgICAgIGRvbSA9IHBhcnNlU3RyaW5nKHN0cikKQEAgLTQ4OCwxNCArNDczLDYgQEAKICAgICAgICAgICAgICAgICBhbmQgcGkubG9jYWxOYW1lIGlzIE5vbmUKICAgICAgICAgICAgICAgICBhbmQgcGkubmFtZXNwYWNlVVJJID09IHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFKQogCi0gICAgZGVmIHRlc3RQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25SZXByKHNlbGYpOiBwYXNzCi0KLSAgICBkZWYgdGVzdFRleHRSZXByKHNlbGYpOiBwYXNzCi0KLSAgICBkZWYgdGVzdFdyaXRlVGV4dChzZWxmKTogcGFzcwotCi0gICAgZGVmIHRlc3REb2N1bWVudEVsZW1lbnQoc2VsZik6IHBhc3MKLQogICAgIGRlZiB0ZXN0VG9vTWFueURvY3VtZW50RWxlbWVudHMoc2VsZik6CiAgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8ZG9jLz4iKQogICAgICAgICBlbGVtID0gZG9jLmNyZWF0ZUVsZW1lbnQoImV4dHJhIikKQEAgLTUwNCwyNiArNDgxLDYgQEAKICAgICAgICAgZWxlbS51bmxpbmsoKQogICAgICAgICBkb2MudW5saW5rKCkKIAotICAgIGRlZiB0ZXN0Q3JlYXRlRWxlbWVudE5TKHNlbGYpOiBwYXNzCi0KLSAgICBkZWYgdGVzdENyZWF0ZUF0dHJpYnV0ZU5TKHNlbGYpOiBwYXNzCi0KLSAgICBkZWYgdGVzdFBhcnNlKHNlbGYpOiBwYXNzCi0KLSAgICBkZWYgdGVzdFBhcnNlU3RyaW5nKHNlbGYpOiBwYXNzCi0KLSAgICBkZWYgdGVzdENvbW1lbnQoc2VsZik6IHBhc3MKLQotICAgIGRlZiB0ZXN0QXR0ckxpc3RJdGVtKHNlbGYpOiBwYXNzCi0KLSAgICBkZWYgdGVzdEF0dHJMaXN0SXRlbXMoc2VsZik6IHBhc3MKLQotICAgIGRlZiB0ZXN0QXR0ckxpc3RJdGVtTlMoc2VsZik6IHBhc3MKLQotICAgIGRlZiB0ZXN0QXR0ckxpc3RLZXlzKHNlbGYpOiBwYXNzCi0KLSAgICBkZWYgdGVzdEF0dHJMaXN0S2V5c05TKHNlbGYpOiBwYXNzCi0KICAgICBkZWYgdGVzdFJlbW92ZU5hbWVkSXRlbShzZWxmKToKICAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoIjxkb2MgYT0nJy8+IikKICAgICAgICAgZSA9IGRvYy5kb2N1bWVudEVsZW1lbnQKQEAgLTU0MywzMiArNTAwLDYgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoeG1sLmRvbS5Ob3RGb3VuZEVyciwgYXR0cnMucmVtb3ZlTmFtZWRJdGVtTlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8veG1sLnB5dGhvbi5vcmcvIiwgImIiKQogCi0gICAgZGVmIHRlc3RBdHRyTGlzdFZhbHVlcyhzZWxmKTogcGFzcwotCi0gICAgZGVmIHRlc3RBdHRyTGlzdExlbmd0aChzZWxmKTogcGFzcwotCi0gICAgZGVmIHRlc3RBdHRyTGlzdF9fZ2V0aXRlbV9fKHNlbGYpOiBwYXNzCi0KLSAgICBkZWYgdGVzdEF0dHJMaXN0X19zZXRpdGVtX18oc2VsZik6IHBhc3MKLQotICAgIGRlZiB0ZXN0U2V0QXR0clZhbHVlYW5kTm9kZVZhbHVlKHNlbGYpOiBwYXNzCi0KLSAgICBkZWYgdGVzdFBhcnNlRWxlbWVudChzZWxmKTogcGFzcwotCi0gICAgZGVmIHRlc3RQYXJzZUF0dHJpYnV0ZXMoc2VsZik6IHBhc3MKLQotICAgIGRlZiB0ZXN0UGFyc2VFbGVtZW50TmFtZXNwYWNlcyhzZWxmKTogcGFzcwotCi0gICAgZGVmIHRlc3RQYXJzZUF0dHJpYnV0ZU5hbWVzcGFjZXMoc2VsZik6IHBhc3MKLQotICAgIGRlZiB0ZXN0UGFyc2VQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25zKHNlbGYpOiBwYXNzCi0KLSAgICBkZWYgdGVzdENoaWxkTm9kZXMoc2VsZik6IHBhc3MKLQotICAgIGRlZiB0ZXN0Rmlyc3RDaGlsZChzZWxmKTogcGFzcwotCi0gICAgZGVmIHRlc3RIYXNDaGlsZE5vZGVzKHNlbGYpOiBwYXNzCi0KICAgICBkZWYgX3Rlc3RDbG9uZUVsZW1lbnRDb3BpZXNBdHRyaWJ1dGVzKHNlbGYsIGUxLCBlMiwgdGVzdCk6CiAgICAgICAgIGF0dHJzMSA9IGUxLmF0dHJpYnV0ZXMKICAgICAgICAgYXR0cnMyID0gZTIuYXR0cmlidXRlcwpAQCAtMTA2MCw3ICs5OTEsNyBAQAogICAgICAgICAgICAgICAgICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xNSI/Pjxmb28+XHhhNDwvZm9vPicsCiAgICAgICAgICAgICAgICAgInRlc3RFbmNvZGluZ3MgLSBlbmNvZGluZyBFVVJPIFNJR04iKQogCi0gICAgICAgICMgVmVyaWZ5IHRoYXQgY2hhcmFjdGVyIGRlY29kaW5nIGVycm9ycyB0aHJvdyBleGNlcHRpb25zIGluc3RlYWQKKyAgICAgICAgIyBWZXJpZnkgdGhhdCBjaGFyYWN0ZXIgZGVjb2RpbmcgZXJyb3JzIHJhaXNlIGV4Y2VwdGlvbnMgaW5zdGVhZAogICAgICAgICAjIG9mIGNyYXNoaW5nCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgcGFyc2VTdHJpbmcsCiAgICAgICAgICAgICAgICAgJzxmcmFuXHhlN2Fpcz5Db21tZW50IFx4ZTdhIHZhID8gVHJceGU4cyBiaWVuID88L2ZyYW5ceGU3YWlzPicpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21tYXAucHkgYi9MaWIvdGVzdC90ZXN0X21tYXAucHkKaW5kZXggMmMyODYzZS4uNjJjNjViZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tbWFwLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbW1hcC5weQpAQCAtMzIwLDI2ICszMjAsMjUgQEAKICAgICAgICAgbWYuY2xvc2UoKQogICAgICAgICBmLmNsb3NlKCkKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICJzdGF0IiksICJuZWVkcyBvcy5zdGF0KCkiKQogICAgIGRlZiB0ZXN0X2VudGlyZV9maWxlKHNlbGYpOgogICAgICAgICAjIHRlc3QgbWFwcGluZyBvZiBlbnRpcmUgZmlsZSBieSBwYXNzaW5nIDAgZm9yIG1hcCBsZW5ndGgKLSAgICAgICAgaWYgaGFzYXR0cihvcywgInN0YXQiKToKLSAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgIncrIikKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAidysiKQogCi0gICAgICAgICAgICBmLndyaXRlKDIqKjE2ICogJ20nKSAjIEFyYml0cmFyeSBjaGFyYWN0ZXIKLSAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmLndyaXRlKDIqKjE2ICogJ20nKSAjIEFyYml0cmFyeSBjaGFyYWN0ZXIKKyAgICAgICAgZi5jbG9zZSgpCiAKLSAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInJiKyIpCi0gICAgICAgICAgICBtZiA9IG1tYXAubW1hcChmLmZpbGVubygpLCAwKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obWYpLCAyKioxNiwgIk1hcCBzaXplIHNob3VsZCBlcXVhbCBmaWxlIHNpemUuIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWYucmVhZCgyKioxNiksIDIqKjE2ICogIm0iKQotICAgICAgICAgICAgbWYuY2xvc2UoKQotICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInJiKyIpCisgICAgICAgIG1mID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1mKSwgMioqMTYsICJNYXAgc2l6ZSBzaG91bGQgZXF1YWwgZmlsZSBzaXplLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWYucmVhZCgyKioxNiksIDIqKjE2ICogIm0iKQorICAgICAgICBtZi5jbG9zZSgpCisgICAgICAgIGYuY2xvc2UoKQogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgInN0YXQiKSwgIm5lZWRzIG9zLnN0YXQoKSIpCiAgICAgZGVmIHRlc3RfbGVuZ3RoXzBfb2Zmc2V0KHNlbGYpOgogICAgICAgICAjIElzc3VlICMxMDkxNjogdGVzdCBtYXBwaW5nIG9mIHJlbWFpbmRlciBvZiBmaWxlIGJ5IHBhc3NpbmcgMCBmb3IKICAgICAgICAgIyBtYXAgbGVuZ3RoIHdpdGggYW4gb2Zmc2V0IGRvZXNuJ3QgY2F1c2UgYSBzZWdmYXVsdC4KLSAgICAgICAgaWYgbm90IGhhc2F0dHIob3MsICJzdGF0Iik6Ci0gICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJuZWVkcyBvcy5zdGF0IikKICAgICAgICAgIyBOT1RFOiBhbGxvY2F0aW9uIGdyYW51bGFyaXR5IGlzIGN1cnJlbnRseSA2NTUzNiB1bmRlciBXaW42NCwKICAgICAgICAgIyBhbmQgdGhlcmVmb3JlIHRoZSBtaW5pbXVtIG9mZnNldCBhbGlnbm1lbnQuCiAgICAgICAgIHdpdGggb3BlbihURVNURk4sICJ3YiIpIGFzIGY6CkBAIC0zNTIsMTIgKzM1MSwxMCBAQAogICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICBtZi5jbG9zZSgpCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAic3RhdCIpLCAibmVlZHMgb3Muc3RhdCgpIikKICAgICBkZWYgdGVzdF9sZW5ndGhfMF9sYXJnZV9vZmZzZXQoc2VsZik6CiAgICAgICAgICMgSXNzdWUgIzEwOTU5OiB0ZXN0IG1hcHBpbmcgb2YgYSBmaWxlIGJ5IHBhc3NpbmcgMCBmb3IKICAgICAgICAgIyBtYXAgbGVuZ3RoIHdpdGggYSBsYXJnZSBvZmZzZXQgZG9lc24ndCBjYXVzZSBhIHNlZ2ZhdWx0LgotICAgICAgICBpZiBub3QgaGFzYXR0cihvcywgInN0YXQiKToKLSAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoIm5lZWRzIG9zLnN0YXQiKQotCiAgICAgICAgIHdpdGggb3BlbihURVNURk4sICJ3YiIpIGFzIGY6CiAgICAgICAgICAgICBmLndyaXRlKDExNTY5OSAqIGInbScpICMgQXJiaXRyYXJ5IGNoYXJhY3RlcgogCkBAIC00NjYsNiArNDYzLDE1IEBACiAgICAgICAgIGYuZmx1c2ggKCkKICAgICAgICAgcmV0dXJuIG1tYXAubW1hcCAoZi5maWxlbm8oKSwgMCkKIAorICAgIGRlZiB0ZXN0X2VtcHR5X2ZpbGUgKHNlbGYpOgorICAgICAgICBmID0gb3BlbiAoVEVTVEZOLCAndytiJykKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHdpdGggb3BlbihURVNURk4sICJyYiIpIGFzIGYgOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBtbWFwIGFuIGVtcHR5IGZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbWFwLm1tYXAsIGYuZmlsZW5vKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzcz1tbWFwLkFDQ0VTU19SRUFEKQorCiAgICAgZGVmIHRlc3Rfb2Zmc2V0IChzZWxmKToKICAgICAgICAgZiA9IG9wZW4gKFRFU1RGTiwgJ3crYicpCiAKQEAgLTUyOSw5ICs1MzUsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBtbWFwLm1tYXAuX19uZXdfXyhrbGFzcywgLTEsICphcmdzLCAqKmt3YXJncykKICAgICAgICAgYW5vbl9tbWFwKFBBR0VTSVpFKQogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihtbWFwLCAnUFJPVF9SRUFEJyksICJuZWVkcyBtbWFwLlBST1RfUkVBRCIpCiAgICAgZGVmIHRlc3RfcHJvdF9yZWFkb25seShzZWxmKToKLSAgICAgICAgaWYgbm90IGhhc2F0dHIobW1hcCwgJ1BST1RfUkVBRCcpOgotICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIG1hcHNpemUgPSAxMAogICAgICAgICBvcGVuKFRFU1RGTiwgIndiIikud3JpdGUoImEiKm1hcHNpemUpCiAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInJiIikKQEAgLTU3NSw2NiArNTgwLDY4IEBACiAgICAgICAgIG0uc2Vlayg4KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtLndyaXRlLCAiYmFyIikKIAotICAgIGlmIG9zLm5hbWUgPT0gJ250JzoKLSAgICAgICAgZGVmIHRlc3RfdGFnbmFtZShzZWxmKToKLSAgICAgICAgICAgIGRhdGExID0gIjAxMjM0NTY3ODkiCi0gICAgICAgICAgICBkYXRhMiA9ICJhYmNkZWZnaGlqIgotICAgICAgICAgICAgYXNzZXJ0IGxlbihkYXRhMSkgPT0gbGVuKGRhdGEyKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKG9zLm5hbWUgPT0gJ250JywgJ3JlcXVpcmVzIFdpbmRvd3MnKQorICAgIGRlZiB0ZXN0X3RhZ25hbWUoc2VsZik6CisgICAgICAgIGRhdGExID0gIjAxMjM0NTY3ODkiCisgICAgICAgIGRhdGEyID0gImFiY2RlZmdoaWoiCisgICAgICAgIGFzc2VydCBsZW4oZGF0YTEpID09IGxlbihkYXRhMikKIAotICAgICAgICAgICAgIyBUZXN0IHNhbWUgdGFnCi0gICAgICAgICAgICBtMSA9IG1tYXAubW1hcCgtMSwgbGVuKGRhdGExKSwgdGFnbmFtZT0iZm9vIikKLSAgICAgICAgICAgIG0xWzpdID0gZGF0YTEKLSAgICAgICAgICAgIG0yID0gbW1hcC5tbWFwKC0xLCBsZW4oZGF0YTIpLCB0YWduYW1lPSJmb28iKQotICAgICAgICAgICAgbTJbOl0gPSBkYXRhMgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtMVs6XSwgZGF0YTIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0yWzpdLCBkYXRhMikKLSAgICAgICAgICAgIG0yLmNsb3NlKCkKLSAgICAgICAgICAgIG0xLmNsb3NlKCkKKyAgICAgICAgIyBUZXN0IHNhbWUgdGFnCisgICAgICAgIG0xID0gbW1hcC5tbWFwKC0xLCBsZW4oZGF0YTEpLCB0YWduYW1lPSJmb28iKQorICAgICAgICBtMVs6XSA9IGRhdGExCisgICAgICAgIG0yID0gbW1hcC5tbWFwKC0xLCBsZW4oZGF0YTIpLCB0YWduYW1lPSJmb28iKQorICAgICAgICBtMls6XSA9IGRhdGEyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobTFbOl0sIGRhdGEyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0yWzpdLCBkYXRhMikKKyAgICAgICAgbTIuY2xvc2UoKQorICAgICAgICBtMS5jbG9zZSgpCiAKLSAgICAgICAgICAgICMgVGVzdCBkaWZmZXJlbnQgdGFnCi0gICAgICAgICAgICBtMSA9IG1tYXAubW1hcCgtMSwgbGVuKGRhdGExKSwgdGFnbmFtZT0iZm9vIikKLSAgICAgICAgICAgIG0xWzpdID0gZGF0YTEKLSAgICAgICAgICAgIG0yID0gbW1hcC5tbWFwKC0xLCBsZW4oZGF0YTIpLCB0YWduYW1lPSJib28iKQotICAgICAgICAgICAgbTJbOl0gPSBkYXRhMgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtMVs6XSwgZGF0YTEpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0yWzpdLCBkYXRhMikKLSAgICAgICAgICAgIG0yLmNsb3NlKCkKLSAgICAgICAgICAgIG0xLmNsb3NlKCkKKyAgICAgICAgIyBUZXN0IGRpZmZlcmVudCB0YWcKKyAgICAgICAgbTEgPSBtbWFwLm1tYXAoLTEsIGxlbihkYXRhMSksIHRhZ25hbWU9ImZvbyIpCisgICAgICAgIG0xWzpdID0gZGF0YTEKKyAgICAgICAgbTIgPSBtbWFwLm1tYXAoLTEsIGxlbihkYXRhMiksIHRhZ25hbWU9ImJvbyIpCisgICAgICAgIG0yWzpdID0gZGF0YTIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtMVs6XSwgZGF0YTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobTJbOl0sIGRhdGEyKQorICAgICAgICBtMi5jbG9zZSgpCisgICAgICAgIG0xLmNsb3NlKCkKIAotICAgICAgICBkZWYgdGVzdF9jcmFzaGVyX29uX3dpbmRvd3Moc2VsZik6Ci0gICAgICAgICAgICAjIFNob3VsZCBub3QgY3Jhc2ggKElzc3VlIDE3MzM5ODYpCi0gICAgICAgICAgICBtID0gbW1hcC5tbWFwKC0xLCAxMDAwLCB0YWduYW1lPSJmb28iKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIG1tYXAubW1hcCgtMSwgNTAwMCwgdGFnbmFtZT0iZm9vIilbOl0gIyBzYW1lIHRhZ25hbWUsIGJ1dCBsYXJnZXIgc2l6ZQotICAgICAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIG0uY2xvc2UoKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKG9zLm5hbWUgPT0gJ250JywgJ3JlcXVpcmVzIFdpbmRvd3MnKQorICAgIGRlZiB0ZXN0X2NyYXNoZXJfb25fd2luZG93cyhzZWxmKToKKyAgICAgICAgIyBTaG91bGQgbm90IGNyYXNoIChJc3N1ZSAxNzMzOTg2KQorICAgICAgICBtID0gbW1hcC5tbWFwKC0xLCAxMDAwLCB0YWduYW1lPSJmb28iKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtbWFwLm1tYXAoLTEsIDUwMDAsIHRhZ25hbWU9ImZvbyIpWzpdICMgc2FtZSB0YWduYW1lLCBidXQgbGFyZ2VyIHNpemUKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworICAgICAgICBtLmNsb3NlKCkKIAotICAgICAgICAgICAgIyBTaG91bGQgbm90IGNyYXNoIChJc3N1ZSA1Mzg1KQotICAgICAgICAgICAgb3BlbihURVNURk4sICJ3YiIpLndyaXRlKCJ4IioxMCkKLSAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInIrYiIpCi0gICAgICAgICAgICBtID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIDApCi0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBtLnJlc2l6ZSgwKSAjIHdpbGwgcmFpc2UgV2luZG93c0Vycm9yCi0gICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIG1bOl0KLSAgICAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICBtLmNsb3NlKCkKKyAgICAgICAgIyBTaG91bGQgbm90IGNyYXNoIChJc3N1ZSA1Mzg1KQorICAgICAgICBvcGVuKFRFU1RGTiwgIndiIikud3JpdGUoIngiKjEwKQorICAgICAgICBmID0gb3BlbihURVNURk4sICJyK2IiKQorICAgICAgICBtID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIDApCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtLnJlc2l6ZSgwKSAjIHdpbGwgcmFpc2UgV2luZG93c0Vycm9yCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbVs6XQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIG0uY2xvc2UoKQogCi0gICAgICAgIGRlZiB0ZXN0X2ludmFsaWRfZGVzY3JpcHRvcihzZWxmKToKLSAgICAgICAgICAgICMgc29ja2V0IGZpbGUgZGVzY3JpcHRvcnMgYXJlIHZhbGlkLCBidXQgb3V0IG9mIHJhbmdlCi0gICAgICAgICAgICAjIGZvciBfZ2V0X29zZmhhbmRsZSwgY2F1c2luZyBhIGNyYXNoIHdoZW4gdmFsaWRhdGluZyB0aGUKLSAgICAgICAgICAgICMgcGFyYW1ldGVycyB0byBfZ2V0X29zZmhhbmRsZS4KLSAgICAgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KCkKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKG1tYXAuZXJyb3IpOgotICAgICAgICAgICAgICAgICAgICBtID0gbW1hcC5tbWFwKHMuZmlsZW5vKCksIDEwKQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBzLmNsb3NlKCkKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhvcy5uYW1lID09ICdudCcsICdyZXF1aXJlcyBXaW5kb3dzJykKKyAgICBkZWYgdGVzdF9pbnZhbGlkX2Rlc2NyaXB0b3Ioc2VsZik6CisgICAgICAgICMgc29ja2V0IGZpbGUgZGVzY3JpcHRvcnMgYXJlIHZhbGlkLCBidXQgb3V0IG9mIHJhbmdlCisgICAgICAgICMgZm9yIF9nZXRfb3NmaGFuZGxlLCBjYXVzaW5nIGEgY3Jhc2ggd2hlbiB2YWxpZGF0aW5nIHRoZQorICAgICAgICAjIHBhcmFtZXRlcnMgdG8gX2dldF9vc2ZoYW5kbGUuCisgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhtbWFwLmVycm9yKToKKyAgICAgICAgICAgICAgICBtID0gbW1hcC5tbWFwKHMuZmlsZW5vKCksIDEwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgcy5jbG9zZSgpCiAKIAogY2xhc3MgTGFyZ2VNbWFwVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtNjY5LDYgKzY3NiwxMyBAQAogCiAgICAgZGVmIHRlc3RfbGFyZ2VfZmlsZXNpemUoc2VsZik6CiAgICAgICAgIHdpdGggc2VsZi5fbWFrZV90ZXN0X2ZpbGUoMHgxN0ZGRkZGRkYsIGIiICIpIGFzIGY6CisgICAgICAgICAgICBpZiBzeXMubWF4c2l6ZSA8IDB4MTgwMDAwMDAwOgorICAgICAgICAgICAgICAgICMgT24gMzIgYml0IHBsYXRmb3JtcyB0aGUgZmlsZSBpcyBsYXJnZXIgdGhhbiBzeXMubWF4c2l6ZSBzbworICAgICAgICAgICAgICAgICMgbWFwcGluZyB0aGUgd2hvbGUgZmlsZSBzaG91bGQgZmFpbCAtLSBJc3N1ZSAjMTY3NDMKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IpOgorICAgICAgICAgICAgICAgICAgICBtbWFwLm1tYXAoZi5maWxlbm8oKSwgMHgxODAwMDAwMDAsIGFjY2Vzcz1tbWFwLkFDQ0VTU19SRUFEKQorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICAgICAgICAgIG1tYXAubW1hcChmLmZpbGVubygpLCAwLCBhY2Nlc3M9bW1hcC5BQ0NFU1NfUkVBRCkKICAgICAgICAgICAgIG0gPSBtbWFwLm1tYXAoZi5maWxlbm8oKSwgMHgxMDAwMCwgYWNjZXNzPW1tYXAuQUNDRVNTX1JFQUQpCiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnNpemUoKSwgMHgxODAwMDAwMDApCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21vZHVsZS5weSBiL0xpYi90ZXN0L3Rlc3RfbW9kdWxlLnB5CmluZGV4IDU2MDVlM2MuLjIxZWFmM2UgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbW9kdWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbW9kdWxlLnB5CkBAIC03MCw3ICs3MCw3IEBACiAgICAgICAgIG0gPSBNb2R1bGVUeXBlKCJmb28iKQogICAgICAgICBtLmRlc3Ryb3llZCA9IGRlc3Ryb3llZAogICAgICAgICBzID0gIiIiY2xhc3MgQToKLSAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICBkZWYgX19kZWxfXyhzZWxmLCBkZXN0cm95ZWQ9ZGVzdHJveWVkKToKICAgICAgICAgZGVzdHJveWVkLmFwcGVuZCgxKQogYSA9IEEoKSIiIgogICAgICAgICBleGVjKHMsIG0uX19kaWN0X18pCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5IGIvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weQppbmRleCA1ZTg2Y2EyLi44YWNhMzgxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHkKQEAgLTEsNSArMSwzIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLSMKICMgdGVzdF9tdWx0aWJ5dGVjb2RlYy5weQogIyAgIFVuaXQgdGVzdCBmb3IgbXVsdGlieXRlY29kZWMgaXRzZWxmCiAjCkBAIC0xNTcsNTcgKzE1NSw1NSBAQAogICAgICAgICAgICAgb3MudW5saW5rKFRFU1RGTikKIAogY2xhc3MgVGVzdF9TdHJlYW1Xcml0ZXIodW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGlmIGxlbih1J1xVMDAwMTIzNDUnKSA9PSAyOiAjIFVDUzIKLSAgICAgICAgZGVmIHRlc3RfZ2IxODAzMChzZWxmKToKLSAgICAgICAgICAgIHMgPSBTdHJpbmdJTy5TdHJpbmdJTygpCi0gICAgICAgICAgICBjID0gY29kZWNzLmdldHdyaXRlcignZ2IxODAzMCcpKHMpCi0gICAgICAgICAgICBjLndyaXRlKHUnMTIzJykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLCAnMTIzJykKLSAgICAgICAgICAgIGMud3JpdGUodSdcVTAwMDEyMzQ1JykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLCAnMTIzXHg5MDdceDk1OScpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MobGVuKHUnXFUwMDAxMjM0NScpID09IDIsICduZWVkIGEgbmFycm93IGJ1aWxkJykKKyAgICBkZWYgdGVzdF9nYjE4MDMwKHNlbGYpOgorICAgICAgICBzID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBjID0gY29kZWNzLmdldHdyaXRlcignZ2IxODAzMCcpKHMpCisgICAgICAgIGMud3JpdGUodScxMjMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwgJzEyMycpCisgICAgICAgIGMud3JpdGUodSdcVTAwMDEyMzQ1JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksICcxMjNceDkwN1x4OTU5JykKKyAgICAgICAgYy53cml0ZSh1J1xVMDAwMTIzNDUnWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwgJzEyM1x4OTA3XHg5NTknKQorICAgICAgICBjLndyaXRlKHUnXFUwMDAxMjM0NSdbMV0gKyB1J1xVMDAwMTIzNDUnICsgdSdcdWFjMDBcdTAwYWMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwKKyAgICAgICAgICAgICAgICAnMTIzXHg5MDdceDk1OVx4OTA3XHg5NTlceDkwN1x4OTU5XHg4MjdceGNmNVx4ODEwXHg4NTEnKQorICAgICAgICBjLndyaXRlKHUnXFUwMDAxMjM0NSdbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgICAgICcxMjNceDkwN1x4OTU5XHg5MDdceDk1OVx4OTA3XHg5NTlceDgyN1x4Y2Y1XHg4MTBceDg1MScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgYy5yZXNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksCisgICAgICAgICAgICAgICAgJzEyM1x4OTA3XHg5NTlceDkwN1x4OTU5XHg5MDdceDk1OVx4ODI3XHhjZjVceDgxMFx4ODUxJykKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGxlbih1J1xVMDAwMTIzNDUnKSA9PSAyLCAnbmVlZCBhIG5hcnJvdyBidWlsZCcpCisgICAgZGVmIHRlc3RfdXRmXzgoc2VsZik6CisgICAgICAgIHM9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgYyA9IGNvZGVjcy5nZXR3cml0ZXIoJ3V0Zi04JykocykKKyAgICAgICAgYy53cml0ZSh1JzEyMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLCAnMTIzJykKKyAgICAgICAgYy53cml0ZSh1J1xVMDAwMTIzNDUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwgJzEyM1x4ZjBceDkyXHg4ZFx4ODUnKQorCisgICAgICAgICMgUHl0aG9uIHV0Zi04IGNvZGVjIGNhbid0IGJ1ZmZlciBzdXJyb2dhdGUgcGFpcnMgeWV0LgorICAgICAgICBpZiAwOgogICAgICAgICAgICAgYy53cml0ZSh1J1xVMDAwMTIzNDUnWzBdKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksICcxMjNceDkwN1x4OTU5JykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLCAnMTIzXHhmMFx4OTJceDhkXHg4NScpCiAgICAgICAgICAgICBjLndyaXRlKHUnXFUwMDAxMjM0NSdbMV0gKyB1J1xVMDAwMTIzNDUnICsgdSdcdWFjMDBcdTAwYWMnKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICcxMjNceDkwN1x4OTU5XHg5MDdceDk1OVx4OTA3XHg5NTlceDgyN1x4Y2Y1XHg4MTBceDg1MScpCisgICAgICAgICAgICAgICAgJzEyM1x4ZjBceDkyXHg4ZFx4ODVceGYwXHg5Mlx4OGRceDg1XHhmMFx4OTJceDhkXHg4NScKKyAgICAgICAgICAgICAgICAnXHhlYVx4YjBceDgwXHhjMlx4YWMnKQogICAgICAgICAgICAgYy53cml0ZSh1J1xVMDAwMTIzNDUnWzBdKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICcxMjNceDkwN1x4OTU5XHg5MDdceDk1OVx4OTA3XHg5NTlceDgyN1x4Y2Y1XHg4MTBceDg1MScpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIGMucmVzZXQpCisgICAgICAgICAgICAgICAgJzEyM1x4ZjBceDkyXHg4ZFx4ODVceGYwXHg5Mlx4OGRceDg1XHhmMFx4OTJceDhkXHg4NScKKyAgICAgICAgICAgICAgICAnXHhlYVx4YjBceDgwXHhjMlx4YWMnKQorICAgICAgICAgICAgYy5yZXNldCgpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgJzEyM1x4OTA3XHg5NTlceDkwN1x4OTU5XHg5MDdceDk1OVx4ODI3XHhjZjVceDgxMFx4ODUxJykKLQotICAgICAgICBkZWYgdGVzdF91dGZfOChzZWxmKToKLSAgICAgICAgICAgIHM9IFN0cmluZ0lPLlN0cmluZ0lPKCkKLSAgICAgICAgICAgIGMgPSBjb2RlY3MuZ2V0d3JpdGVyKCd1dGYtOCcpKHMpCi0gICAgICAgICAgICBjLndyaXRlKHUnMTIzJykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLCAnMTIzJykKLSAgICAgICAgICAgIGMud3JpdGUodSdcVTAwMDEyMzQ1JykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLCAnMTIzXHhmMFx4OTJceDhkXHg4NScpCi0KLSAgICAgICAgICAgICMgUHl0aG9uIHV0Zi04IGNvZGVjIGNhbid0IGJ1ZmZlciBzdXJyb2dhdGUgcGFpcnMgeWV0LgotICAgICAgICAgICAgaWYgMDoKLSAgICAgICAgICAgICAgICBjLndyaXRlKHUnXFUwMDAxMjM0NSdbMF0pCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksICcxMjNceGYwXHg5Mlx4OGRceDg1JykKLSAgICAgICAgICAgICAgICBjLndyaXRlKHUnXFUwMDAxMjM0NSdbMV0gKyB1J1xVMDAwMTIzNDUnICsgdSdcdWFjMDBcdTAwYWMnKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAnMTIzXHhmMFx4OTJceDhkXHg4NVx4ZjBceDkyXHg4ZFx4ODVceGYwXHg5Mlx4OGRceDg1JwotICAgICAgICAgICAgICAgICAgICAnXHhlYVx4YjBceDgwXHhjMlx4YWMnKQotICAgICAgICAgICAgICAgIGMud3JpdGUodSdcVTAwMDEyMzQ1J1swXSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgJzEyM1x4ZjBceDkyXHg4ZFx4ODVceGYwXHg5Mlx4OGRceDg1XHhmMFx4OTJceDhkXHg4NScKLSAgICAgICAgICAgICAgICAgICAgJ1x4ZWFceGIwXHg4MFx4YzJceGFjJykKLSAgICAgICAgICAgICAgICBjLnJlc2V0KCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgJzEyM1x4ZjBceDkyXHg4ZFx4ODVceGYwXHg5Mlx4OGRceDg1XHhmMFx4OTJceDhkXHg4NScKLSAgICAgICAgICAgICAgICAgICAgJ1x4ZWFceGIwXHg4MFx4YzJceGFjXHhlZFx4YTBceDg4JykKLSAgICAgICAgICAgICAgICBjLndyaXRlKHUnXFUwMDAxMjM0NSdbMV0pCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICcxMjNceGYwXHg5Mlx4OGRceDg1XHhmMFx4OTJceDhkXHg4NVx4ZjBceDkyXHg4ZFx4ODUnCi0gICAgICAgICAgICAgICAgICAgICdceGVhXHhiMFx4ODBceGMyXHhhY1x4ZWRceGEwXHg4OFx4ZWRceGJkXHg4NScpCi0KLSAgICBlbHNlOiAjIFVDUzQKLSAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICcxMjNceGYwXHg5Mlx4OGRceDg1XHhmMFx4OTJceDhkXHg4NVx4ZjBceDkyXHg4ZFx4ODUnCisgICAgICAgICAgICAgICAgJ1x4ZWFceGIwXHg4MFx4YzJceGFjXHhlZFx4YTBceDg4JykKKyAgICAgICAgICAgIGMud3JpdGUodSdcVTAwMDEyMzQ1J1sxXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgICAgICcxMjNceGYwXHg5Mlx4OGRceDg1XHhmMFx4OTJceDhkXHg4NVx4ZjBceDkyXHg4ZFx4ODUnCisgICAgICAgICAgICAgICAgJ1x4ZWFceGIwXHg4MFx4YzJceGFjXHhlZFx4YTBceDg4XHhlZFx4YmRceDg1JykKIAogICAgIGRlZiB0ZXN0X3N0cmVhbXdyaXRlcl9zdHJ3cml0ZShzZWxmKToKICAgICAgICAgcyA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5weSBiL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5weQppbmRleCA1MmEyZTUwLi5jNWRjZmEzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LnB5CkBAIC0xLDUgKzEsMyBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jCiAjIHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5weQogIyAgIENvbW1vbiBVbml0dGVzdCBSb3V0aW5lcyBmb3IgQ0pLIGNvZGVjcwogIwpAQCAtNjcsNyArNjUsNyBAQAogCiAgICAgZGVmIHRlc3RfeG1sY2hhcnJlZnJlcGxhY2Uoc2VsZik6CiAgICAgICAgIGlmIHNlbGYuaGFzX2lzbzEwNjQ2OgotICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCdlbmNvZGluZyBjb250YWlucyBmdWxsIElTTyAxMDY0NiBtYXAnKQogCiAgICAgICAgIHMgPSB1Ilx1MGIxM1x1MGIyM1x1MGI2MCBuZCBlZ2dzIgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKApAQCAtNzcsNyArNzUsNyBAQAogCiAgICAgZGVmIHRlc3RfY3VzdG9tcmVwbGFjZV9lbmNvZGUoc2VsZik6CiAgICAgICAgIGlmIHNlbGYuaGFzX2lzbzEwNjQ2OgotICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCdlbmNvZGluZyBjb250YWlucyBmdWxsIElTTyAxMDY0NiBtYXAnKQogCiAgICAgICAgIGZyb20gaHRtbGVudGl0eWRlZnMgaW1wb3J0IGNvZGVwb2ludDJuYW1lCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbXVsdGlwcm9jZXNzaW5nLnB5IGIvTGliL3Rlc3QvdGVzdF9tdWx0aXByb2Nlc3NpbmcucHkKaW5kZXggZTUyNThiYi4uNDJmNmRkOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tdWx0aXByb2Nlc3NpbmcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tdWx0aXByb2Nlc3NpbmcucHkKQEAgLTEsNSArMSwzIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLQogIwogIyBVbml0IHRlc3RzIGZvciB0aGUgbXVsdGlwcm9jZXNzaW5nIHBhY2thZ2UKICMKQEAgLTE2LDYgKzE0LDcgQEAKIGltcG9ydCByYW5kb20KIGltcG9ydCBsb2dnaW5nCiBpbXBvcnQgZXJybm8KK2ltcG9ydCB0ZXN0LnNjcmlwdF9oZWxwZXIKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwogX211bHRpcHJvY2Vzc2luZyA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdfbXVsdGlwcm9jZXNzaW5nJykKQEAgLTE4MSw3ICsxODAsNyBAQAogCiAgICAgZGVmIHRlc3RfY3VycmVudChzZWxmKToKICAgICAgICAgaWYgc2VsZi5UWVBFID09ICd0aHJlYWRzJzoKLSAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgndGVzdCBub3QgYXBwcm9wcmlhdGUgZm9yIHt9Jy5mb3JtYXQoc2VsZi5UWVBFKSkKIAogICAgICAgICBjdXJyZW50ID0gc2VsZi5jdXJyZW50X3Byb2Nlc3MoKQogICAgICAgICBhdXRoa2V5ID0gY3VycmVudC5hdXRoa2V5CkBAIC0yNDgsNyArMjQ3LDcgQEAKIAogICAgIGRlZiB0ZXN0X3Rlcm1pbmF0ZShzZWxmKToKICAgICAgICAgaWYgc2VsZi5UWVBFID09ICd0aHJlYWRzJzoKLSAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgndGVzdCBub3QgYXBwcm9wcmlhdGUgZm9yIHt9Jy5mb3JtYXQoc2VsZi5UWVBFKSkKIAogICAgICAgICBwID0gc2VsZi5Qcm9jZXNzKHRhcmdldD1zZWxmLl90ZXN0X3Rlcm1pbmF0ZSkKICAgICAgICAgcC5kYWVtb24gPSBUcnVlCkBAIC0zMjUsNiArMzI0LDM2IEBACiAgICAgICAgICAgICBdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBleHBlY3RlZCkKIAorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfdGVzdF9zeXNfZXhpdChjbHMsIHJlYXNvbiwgdGVzdGZuKToKKyAgICAgICAgc3lzLnN0ZGVyciA9IG9wZW4odGVzdGZuLCAndycpCisgICAgICAgIHN5cy5leGl0KHJlYXNvbikKKworICAgIGRlZiB0ZXN0X3N5c19leGl0KHNlbGYpOgorICAgICAgICAjIFNlZSBJc3N1ZSAxMzg1NAorICAgICAgICBpZiBzZWxmLlRZUEUgPT0gJ3RocmVhZHMnOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgndGVzdCBub3QgYXBwcm9wcmlhdGUgZm9yIHt9Jy5mb3JtYXQoc2VsZi5UWVBFKSkKKworICAgICAgICB0ZXN0Zm4gPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cCh0ZXN0X3N1cHBvcnQudW5saW5rLCB0ZXN0Zm4pCisKKyAgICAgICAgZm9yIHJlYXNvbiwgY29kZSBpbiAoKFsxLCAyLCAzXSwgMSksICgnaWdub3JlIHRoaXMnLCAxKSk6CisgICAgICAgICAgICBwID0gc2VsZi5Qcm9jZXNzKHRhcmdldD1zZWxmLl90ZXN0X3N5c19leGl0LCBhcmdzPShyZWFzb24sIHRlc3RmbikpCisgICAgICAgICAgICBwLmRhZW1vbiA9IFRydWUKKyAgICAgICAgICAgIHAuc3RhcnQoKQorICAgICAgICAgICAgcC5qb2luKDUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuZXhpdGNvZGUsIGNvZGUpCisKKyAgICAgICAgICAgIHdpdGggb3Blbih0ZXN0Zm4sICdyJykgYXMgZjoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLnJzdHJpcCgpLCBzdHIocmVhc29uKSkKKworICAgICAgICBmb3IgcmVhc29uIGluIChUcnVlLCBGYWxzZSwgOCk6CisgICAgICAgICAgICBwID0gc2VsZi5Qcm9jZXNzKHRhcmdldD1zeXMuZXhpdCwgYXJncz0ocmVhc29uLCkpCisgICAgICAgICAgICBwLmRhZW1vbiA9IFRydWUKKyAgICAgICAgICAgIHAuc3RhcnQoKQorICAgICAgICAgICAgcC5qb2luKDUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuZXhpdGNvZGUsIHJlYXNvbikKKwogIwogIwogIwpAQCAtNTUxLDcgKzU4MCw3IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocS5xc2l6ZSgpLCAwKQogICAgICAgICBleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKLSAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgncXNpemUgbWV0aG9kIG5vdCBpbXBsZW1lbnRlZCcpCiAgICAgICAgIHEucHV0KDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocS5xc2l6ZSgpLCAxKQogICAgICAgICBxLnB1dCg1KQpAQCAtNjUyLDcgKzY4MSw3IEBACiAKICAgICBkZWYgdGVzdF90aW1lb3V0KHNlbGYpOgogICAgICAgICBpZiBzZWxmLlRZUEUgIT0gJ3Byb2Nlc3Nlcyc6Ci0gICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ3Rlc3Qgbm90IGFwcHJvcHJpYXRlIGZvciB7fScuZm9ybWF0KHNlbGYuVFlQRSkpCiAKICAgICAgICAgc2VtID0gc2VsZi5TZW1hcGhvcmUoMCkKICAgICAgICAgYWNxdWlyZSA9IFRpbWluZ1dyYXBwZXIoc2VtLmFjcXVpcmUpCkBAIC0xMDg2LDYgKzExMTUsMTYgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbWFwKHNxciwgcmFuZ2UoMTAwKSwgY2h1bmtzaXplPTIwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAoc3FyLCByYW5nZSgxMDApKSkKIAorICAgIGRlZiB0ZXN0X21hcF91bnBsaWNrbGFibGUoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzE5NDI1IC0tIGZhaWx1cmUgdG8gcGlja2xlIHNob3VsZCBub3QgY2F1c2UgYSBoYW5nCisgICAgICAgIGlmIHNlbGYuVFlQRSA9PSAndGhyZWFkcyc6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCd0ZXN0IG5vdCBhcHByb3ByaWF0ZSBmb3Ige30nLmZvcm1hdChzZWxmLlRZUEUpKQorICAgICAgICBjbGFzcyBBKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ2Nhbm5vdCBwaWNrbGUnKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6CisgICAgICAgICAgICBzZWxmLnBvb2wubWFwKHNxciwgW0EoKV0qMTApCisKICAgICBkZWYgdGVzdF9tYXBfY2h1bmtzaXplKHNlbGYpOgogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzZWxmLnBvb2wubWFwX2FzeW5jKHNxciwgW10sIGNodW5rc2l6ZT0xKS5nZXQodGltZW91dD1USU1FT1VUMSkKQEAgLTEwOTksNyArMTEzOCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0VGltaW5nQWxtb3N0RXF1YWwoZ2V0LmVsYXBzZWQsIFRJTUVPVVQxKQogCiAgICAgZGVmIHRlc3RfYXN5bmNfdGltZW91dChzZWxmKToKLSAgICAgICAgcmVzID0gc2VsZi5wb29sLmFwcGx5X2FzeW5jKHNxciwgKDYsIFRJTUVPVVQyICsgMC4yKSkKKyAgICAgICAgcmVzID0gc2VsZi5wb29sLmFwcGx5X2FzeW5jKHNxciwgKDYsIFRJTUVPVVQyICsgMS4wKSkKICAgICAgICAgZ2V0ID0gVGltaW5nV3JhcHBlcihyZXMuZ2V0KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhtdWx0aXByb2Nlc3NpbmcuVGltZW91dEVycm9yLCBnZXQsIHRpbWVvdXQ9VElNRU9VVDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0VGltaW5nQWxtb3N0RXF1YWwoZ2V0LmVsYXBzZWQsIFRJTUVPVVQyKQpAQCAtMTEzNSwyMyArMTE3NCw0NSBAQAogICAgICAgICBwLmpvaW4oKQogCiAgICAgZGVmIHRlc3RfdGVybWluYXRlKHNlbGYpOgotICAgICAgICBpZiBzZWxmLlRZUEUgPT0gJ21hbmFnZXInOgotICAgICAgICAgICAgIyBPbiBVbml4IGEgZm9ya2VkIHByb2Nlc3MgaW5jcmVmcyBlYWNoIHNoYXJlZCBvYmplY3QgdG8KLSAgICAgICAgICAgICMgd2hpY2ggaXRzIHBhcmVudCBwcm9jZXNzIGhlbGQgYSByZWZlcmVuY2UuICBJZiB0aGUKLSAgICAgICAgICAgICMgZm9ya2VkIHByb2Nlc3MgZ2V0cyB0ZXJtaW5hdGVkIHRoZW4gdGhlcmUgaXMgbGlrZWx5IHRvCi0gICAgICAgICAgICAjIGJlIGEgcmVmZXJlbmNlIGxlYWsuICBTbyB0byBwcmV2ZW50Ci0gICAgICAgICAgICAjIF9UZXN0WlpaTnVtYmVyT2ZPYmplY3RzIGZyb20gZmFpbGluZyB3ZSBza2lwIHRoaXMgdGVzdAotICAgICAgICAgICAgIyB3aGVuIHVzaW5nIGEgbWFuYWdlci4KLSAgICAgICAgICAgIHJldHVybgotCi0gICAgICAgIHJlc3VsdCA9IHNlbGYucG9vbC5tYXBfYXN5bmMoCisgICAgICAgIHAgPSBzZWxmLlBvb2woNCkKKyAgICAgICAgcmVzdWx0ID0gcC5tYXBfYXN5bmMoCiAgICAgICAgICAgICB0aW1lLnNsZWVwLCBbMC4xIGZvciBpIGluIHJhbmdlKDEwMDAwKV0sIGNodW5rc2l6ZT0xCiAgICAgICAgICAgICApCi0gICAgICAgIHNlbGYucG9vbC50ZXJtaW5hdGUoKQotICAgICAgICBqb2luID0gVGltaW5nV3JhcHBlcihzZWxmLnBvb2wuam9pbikKKyAgICAgICAgcC50ZXJtaW5hdGUoKQorICAgICAgICBqb2luID0gVGltaW5nV3JhcHBlcihwLmpvaW4pCiAgICAgICAgIGpvaW4oKQogICAgICAgICBzZWxmLmFzc2VydFRydWUoam9pbi5lbGFwc2VkIDwgMC4yKQogCisgICAgZGVmIHRlc3RfZW1wdHlfaXRlcmFibGUoc2VsZik6CisgICAgICAgICMgU2VlIElzc3VlIDEyMTU3CisgICAgICAgIHAgPSBzZWxmLlBvb2woMSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubWFwKHNxciwgW10pLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHAuaW1hcChzcXIsIFtdKSksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocC5pbWFwX3Vub3JkZXJlZChzcXIsIFtdKSksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubWFwX2FzeW5jKHNxciwgW10pLmdldCgpLCBbXSkKKworICAgICAgICBwLmNsb3NlKCkKKyAgICAgICAgcC5qb2luKCkKKworZGVmIHVucGlja2xlYWJsZV9yZXN1bHQoKToKKyAgICByZXR1cm4gbGFtYmRhOiA0MgorCitjbGFzcyBfVGVzdFBvb2xXb3JrZXJFcnJvcnMoQmFzZVRlc3RDYXNlKToKKyAgICBBTExPV0VEX1RZUEVTID0gKCdwcm9jZXNzZXMnLCApCisKKyAgICBkZWYgdGVzdF91bnBpY2tsZWFibGVfcmVzdWx0KHNlbGYpOgorICAgICAgICBmcm9tIG11bHRpcHJvY2Vzc2luZy5wb29sIGltcG9ydCBNYXliZUVuY29kaW5nRXJyb3IKKyAgICAgICAgcCA9IG11bHRpcHJvY2Vzc2luZy5Qb29sKDIpCisKKyAgICAgICAgIyBNYWtlIHN1cmUgd2UgZG9uJ3QgbG9zZSBwb29sIHByb2Nlc3NlcyBiZWNhdXNlIG9mIGVuY29kaW5nIGVycm9ycy4KKyAgICAgICAgZm9yIGl0ZXJhdGlvbiBpbiByYW5nZSgyMCk6CisgICAgICAgICAgICByZXMgPSBwLmFwcGx5X2FzeW5jKHVucGlja2xlYWJsZV9yZXN1bHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhNYXliZUVuY29kaW5nRXJyb3IsIHJlcy5nZXQpCisKKyAgICAgICAgcC5jbG9zZSgpCisgICAgICAgIHAuam9pbigpCisKIGNsYXNzIF9UZXN0UG9vbFdvcmtlckxpZmV0aW1lKEJhc2VUZXN0Q2FzZSk6CiAKICAgICBBTExPV0VEX1RZUEVTID0gKCdwcm9jZXNzZXMnLCApCkBAIC0xMzI0LDcgKzEzODUsNyBAQAogICAgICAgICBhdXRoa2V5ID0gb3MudXJhbmRvbSgzMikKIAogICAgICAgICBtYW5hZ2VyID0gUXVldWVNYW5hZ2VyKAotICAgICAgICAgICAgYWRkcmVzcz0oJ2xvY2FsaG9zdCcsIDApLCBhdXRoa2V5PWF1dGhrZXksIHNlcmlhbGl6ZXI9U0VSSUFMSVpFUgorICAgICAgICAgICAgYWRkcmVzcz0odGVzdC50ZXN0X3N1cHBvcnQuSE9TVCwgMCksIGF1dGhrZXk9YXV0aGtleSwgc2VyaWFsaXplcj1TRVJJQUxJWkVSCiAgICAgICAgICAgICApCiAgICAgICAgIG1hbmFnZXIuc3RhcnQoKQogCkBAIC0xMzYyLDcgKzE0MjMsNyBAQAogICAgIGRlZiB0ZXN0X3JhcGlkX3Jlc3RhcnQoc2VsZik6CiAgICAgICAgIGF1dGhrZXkgPSBvcy51cmFuZG9tKDMyKQogICAgICAgICBtYW5hZ2VyID0gUXVldWVNYW5hZ2VyKAotICAgICAgICAgICAgYWRkcmVzcz0oJ2xvY2FsaG9zdCcsIDApLCBhdXRoa2V5PWF1dGhrZXksIHNlcmlhbGl6ZXI9U0VSSUFMSVpFUikKKyAgICAgICAgICAgIGFkZHJlc3M9KHRlc3QudGVzdF9zdXBwb3J0LkhPU1QsIDApLCBhdXRoa2V5PWF1dGhrZXksIHNlcmlhbGl6ZXI9U0VSSUFMSVpFUikKICAgICAgICAgc3J2ciA9IG1hbmFnZXIuZ2V0X3NlcnZlcigpCiAgICAgICAgIGFkZHIgPSBzcnZyLmFkZHJlc3MKICAgICAgICAgIyBDbG9zZSB0aGUgY29ubmVjdGlvbi5MaXN0ZW5lciBzb2NrZXQgd2hpY2ggZ2V0cyBvcGVuZWQgYXMgYSBwYXJ0CkBAIC0xNDUyLDYgKzE1MTMsNyBAQAogICAgICAgICBzZWxmLmFzc2VydFRpbWluZ0FsbW9zdEVxdWFsKHBvbGwuZWxhcHNlZCwgVElNRU9VVDEpCiAKICAgICAgICAgY29ubi5zZW5kKE5vbmUpCisgICAgICAgIHRpbWUuc2xlZXAoLjEpCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb2xsKFRJTUVPVVQxKSwgVHJ1ZSkKICAgICAgICAgc2VsZi5hc3NlcnRUaW1pbmdBbG1vc3RFcXVhbChwb2xsLmVsYXBzZWQsIDApCkBAIC0xNTA5LDcgKzE1NzEsNyBAQAogCiAgICAgZGVmIHRlc3Rfc2VuZGJ5dGVzKHNlbGYpOgogICAgICAgICBpZiBzZWxmLlRZUEUgIT0gJ3Byb2Nlc3Nlcyc6Ci0gICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ3Rlc3Qgbm90IGFwcHJvcHJpYXRlIGZvciB7fScuZm9ybWF0KHNlbGYuVFlQRSkpCiAKICAgICAgICAgbXNnID0gbGF0aW4oJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JykKICAgICAgICAgYSwgYiA9IHNlbGYuUGlwZSgpCkBAIC0xNjUxLDYgKzE3MTMsMjMgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29ubi5yZWN2KCksICdoZWxsbycpCiAgICAgICAgICAgICBwLmpvaW4oKQogICAgICAgICAgICAgbC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9pc3N1ZTE0NzI1KHNlbGYpOgorICAgICAgICBsID0gc2VsZi5jb25uZWN0aW9uLkxpc3RlbmVyKCkKKyAgICAgICAgcCA9IHNlbGYuUHJvY2Vzcyh0YXJnZXQ9c2VsZi5fdGVzdCwgYXJncz0obC5hZGRyZXNzLCkpCisgICAgICAgIHAuZGFlbW9uID0gVHJ1ZQorICAgICAgICBwLnN0YXJ0KCkKKyAgICAgICAgdGltZS5zbGVlcCgxKQorICAgICAgICAjIE9uIFdpbmRvd3MgdGhlIGNsaWVudCBwcm9jZXNzIHNob3VsZCBieSBub3cgaGF2ZSBjb25uZWN0ZWQsCisgICAgICAgICMgd3JpdHRlbiBkYXRhIGFuZCBjbG9zZWQgdGhlIHBpcGUgaGFuZGxlIGJ5IG5vdy4gIFRoaXMgY2F1c2VzCisgICAgICAgICMgQ29ubmVjdE5hbWRlZFBpcGUoKSB0byBmYWlsIHdpdGggRVJST1JfTk9fREFUQS4gIFNlZSBJc3N1ZQorICAgICAgICAjIDE0NzI1LgorICAgICAgICBjb25uID0gbC5hY2NlcHQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbm4ucmVjdigpLCAnaGVsbG8nKQorICAgICAgICBjb25uLmNsb3NlKCkKKyAgICAgICAgcC5qb2luKCkKKyAgICAgICAgbC5jbG9zZSgpCisKICMKICMgVGVzdCBvZiBzZW5kaW5nIGNvbm5lY3Rpb24gYW5kIHNvY2tldCBvYmplY3RzIGJldHdlZW4gcHJvY2Vzc2VzCiAjCkBAIC0yMDI2LDYgKzIxMDUsMzggQEAKICMgICAgICAgICBhc3NlcnQgc2VsZi5fX2hhbmRsZWQKIAogIworIyBDaGVjayB0aGF0IFByb2Nlc3Muam9pbigpIHJldHJpZXMgaWYgb3Mud2FpdHBpZCgpIGZhaWxzIHdpdGggRUlOVFIKKyMKKworY2xhc3MgX1Rlc3RQb2xsRWludHIoQmFzZVRlc3RDYXNlKToKKworICAgIEFMTE9XRURfVFlQRVMgPSAoJ3Byb2Nlc3NlcycsKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9raWxsZXIoY2xzLCBwaWQpOgorICAgICAgICB0aW1lLnNsZWVwKDAuNSkKKyAgICAgICAgb3Mua2lsbChwaWQsIHNpZ25hbC5TSUdVU1IxKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihzaWduYWwsICdTSUdVU1IxJyksICdyZXF1aXJlcyBTSUdVU1IxJykKKyAgICBkZWYgdGVzdF9wb2xsX2VpbnRyKHNlbGYpOgorICAgICAgICBnb3Rfc2lnbmFsID0gW0ZhbHNlXQorICAgICAgICBkZWYgcmVjb3JkKCphcmdzKToKKyAgICAgICAgICAgIGdvdF9zaWduYWxbMF0gPSBUcnVlCisgICAgICAgIHBpZCA9IG9zLmdldHBpZCgpCisgICAgICAgIG9sZGhhbmRsZXIgPSBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdVU1IxLCByZWNvcmQpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGtpbGxlciA9IHNlbGYuUHJvY2Vzcyh0YXJnZXQ9c2VsZi5fa2lsbGVyLCBhcmdzPShwaWQsKSkKKyAgICAgICAgICAgIGtpbGxlci5zdGFydCgpCisgICAgICAgICAgICBwID0gc2VsZi5Qcm9jZXNzKHRhcmdldD10aW1lLnNsZWVwLCBhcmdzPSgxLCkpCisgICAgICAgICAgICBwLnN0YXJ0KCkKKyAgICAgICAgICAgIHAuam9pbigpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZ290X3NpZ25hbFswXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5leGl0Y29kZSwgMCkKKyAgICAgICAgICAgIGtpbGxlci5qb2luKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1VTUjEsIG9sZGhhbmRsZXIpCisKKyMKICMgVGVzdCB0byB2ZXJpZnkgaGFuZGxlIHZlcmlmaWNhdGlvbiwgc2VlIGlzc3VlIDMzMjEKICMKIApAQCAtMjA3OCw3ICsyMTg5LDcgQEAKICAgICAgICAgJ1F1ZXVlJywgJ0xvY2snLCAnUkxvY2snLCAnU2VtYXBob3JlJywgJ0JvdW5kZWRTZW1hcGhvcmUnLAogICAgICAgICAnQ29uZGl0aW9uJywgJ0V2ZW50JywgJ1ZhbHVlJywgJ0FycmF5JywgJ1Jhd1ZhbHVlJywKICAgICAgICAgJ1Jhd0FycmF5JywgJ2N1cnJlbnRfcHJvY2VzcycsICdhY3RpdmVfY2hpbGRyZW4nLCAnUGlwZScsCi0gICAgICAgICdjb25uZWN0aW9uJywgJ0pvaW5hYmxlUXVldWUnCisgICAgICAgICdjb25uZWN0aW9uJywgJ0pvaW5hYmxlUXVldWUnLCAnUG9vbCcKICAgICAgICAgKSkpCiAKIHRlc3RjYXNlc19wcm9jZXNzZXMgPSBjcmVhdGVfdGVzdF9jYXNlcyhQcm9jZXNzZXNNaXhpbiwgdHlwZT0ncHJvY2Vzc2VzJykKQEAgLTIwOTIsNyArMjIwMyw3IEBACiAgICAgbG9jYWxzKCkudXBkYXRlKGdldF9hdHRyaWJ1dGVzKG1hbmFnZXIsICgKICAgICAgICAgJ1F1ZXVlJywgJ0xvY2snLCAnUkxvY2snLCAnU2VtYXBob3JlJywgJ0JvdW5kZWRTZW1hcGhvcmUnLAogICAgICAgICdDb25kaXRpb24nLCAnRXZlbnQnLCAnVmFsdWUnLCAnQXJyYXknLCAnbGlzdCcsICdkaWN0JywKLSAgICAgICAgJ05hbWVzcGFjZScsICdKb2luYWJsZVF1ZXVlJworICAgICAgICAnTmFtZXNwYWNlJywgJ0pvaW5hYmxlUXVldWUnLCAnUG9vbCcKICAgICAgICAgKSkpCiAKIHRlc3RjYXNlc19tYW5hZ2VyID0gY3JlYXRlX3Rlc3RfY2FzZXMoTWFuYWdlck1peGluLCB0eXBlPSdtYW5hZ2VyJykKQEAgLTIxMDYsNyArMjIxNyw3IEBACiAgICAgICAgICdRdWV1ZScsICdMb2NrJywgJ1JMb2NrJywgJ1NlbWFwaG9yZScsICdCb3VuZGVkU2VtYXBob3JlJywKICAgICAgICAgJ0NvbmRpdGlvbicsICdFdmVudCcsICdWYWx1ZScsICdBcnJheScsICdjdXJyZW50X3Byb2Nlc3MnLAogICAgICAgICAnYWN0aXZlX2NoaWxkcmVuJywgJ1BpcGUnLCAnY29ubmVjdGlvbicsICdkaWN0JywgJ2xpc3QnLAotICAgICAgICAnTmFtZXNwYWNlJywgJ0pvaW5hYmxlUXVldWUnCisgICAgICAgICdOYW1lc3BhY2UnLCAnSm9pbmFibGVRdWV1ZScsICdQb29sJwogICAgICAgICApKSkKIAogdGVzdGNhc2VzX3RocmVhZHMgPSBjcmVhdGVfdGVzdF9jYXNlcyhUaHJlYWRzTWl4aW4sIHR5cGU9J3RocmVhZHMnKQpAQCAtMjE3NiwxNSArMjI4NywxNSBAQAogIyBWZXJpZmllcyBvcy5jbG9zZShzeXMuc3RkaW4uZmlsZW5vKSB2cy4gc3lzLnN0ZGluLmNsb3NlKCkgYmVoYXZpb3IKICMKIAotZGVmIF9UaGlzU3ViUHJvY2VzcyhxKToKK2RlZiBfdGhpc19zdWJfcHJvY2VzcyhxKToKICAgICB0cnk6CiAgICAgICAgIGl0ZW0gPSBxLmdldChibG9jaz1GYWxzZSkKICAgICBleGNlcHQgUXVldWUuRW1wdHk6CiAgICAgICAgIHBhc3MKIAotZGVmIF9UZXN0UHJvY2VzcyhxKToKK2RlZiBfdGVzdF9wcm9jZXNzKHEpOgogICAgIHF1ZXVlID0gbXVsdGlwcm9jZXNzaW5nLlF1ZXVlKCkKLSAgICBzdWJQcm9jID0gbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3ModGFyZ2V0PV9UaGlzU3ViUHJvY2VzcywgYXJncz0ocXVldWUsKSkKKyAgICBzdWJQcm9jID0gbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3ModGFyZ2V0PV90aGlzX3N1Yl9wcm9jZXNzLCBhcmdzPShxdWV1ZSwpKQogICAgIHN1YlByb2MuZGFlbW9uID0gVHJ1ZQogICAgIHN1YlByb2Muc3RhcnQoKQogICAgIHN1YlByb2Muam9pbigpCkBAIC0yMjIxLDcgKzIzMzIsNyBAQAogCiAgICAgZGVmIHRlc3RfcXVldWVfaW5fcHJvY2VzcyhzZWxmKToKICAgICAgICAgcXVldWUgPSBtdWx0aXByb2Nlc3NpbmcuUXVldWUoKQotICAgICAgICBwcm9jID0gbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3ModGFyZ2V0PV9UZXN0UHJvY2VzcywgYXJncz0ocXVldWUsKSkKKyAgICAgICAgcHJvYyA9IG11bHRpcHJvY2Vzc2luZy5Qcm9jZXNzKHRhcmdldD1fdGVzdF9wcm9jZXNzLCBhcmdzPShxdWV1ZSwpKQogICAgICAgICBwcm9jLnN0YXJ0KCkKICAgICAgICAgcHJvYy5qb2luKCkKIApAQCAtMjIzOCw4ICsyMzQ5LDE5MiBAQAogICAgICAgICBmbGlrZS5mbHVzaCgpCiAgICAgICAgIGFzc2VydCBzaW8uZ2V0dmFsdWUoKSA9PSAnZm9vJwogCisjCisjIFRlc3QgaW50ZXJhY3Rpb24gd2l0aCBzb2NrZXQgdGltZW91dHMgLSBzZWUgSXNzdWUgIzYwNTYKKyMKKworY2xhc3MgVGVzdFRpbWVvdXRzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX3Rlc3RfdGltZW91dChjbHMsIGNoaWxkLCBhZGRyZXNzKToKKyAgICAgICAgdGltZS5zbGVlcCgxKQorICAgICAgICBjaGlsZC5zZW5kKDEyMykKKyAgICAgICAgY2hpbGQuY2xvc2UoKQorICAgICAgICBjb25uID0gbXVsdGlwcm9jZXNzaW5nLmNvbm5lY3Rpb24uQ2xpZW50KGFkZHJlc3MpCisgICAgICAgIGNvbm4uc2VuZCg0NTYpCisgICAgICAgIGNvbm4uY2xvc2UoKQorCisgICAgZGVmIHRlc3RfdGltZW91dChzZWxmKToKKyAgICAgICAgb2xkX3RpbWVvdXQgPSBzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoMC4xKQorICAgICAgICAgICAgcGFyZW50LCBjaGlsZCA9IG11bHRpcHJvY2Vzc2luZy5QaXBlKGR1cGxleD1UcnVlKQorICAgICAgICAgICAgbCA9IG11bHRpcHJvY2Vzc2luZy5jb25uZWN0aW9uLkxpc3RlbmVyKGZhbWlseT0nQUZfSU5FVCcpCisgICAgICAgICAgICBwID0gbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3ModGFyZ2V0PXNlbGYuX3Rlc3RfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPShjaGlsZCwgbC5hZGRyZXNzKSkKKyAgICAgICAgICAgIHAuc3RhcnQoKQorICAgICAgICAgICAgY2hpbGQuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJlbnQucmVjdigpLCAxMjMpCisgICAgICAgICAgICBwYXJlbnQuY2xvc2UoKQorICAgICAgICAgICAgY29ubiA9IGwuYWNjZXB0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29ubi5yZWN2KCksIDQ1NikKKyAgICAgICAgICAgIGNvbm4uY2xvc2UoKQorICAgICAgICAgICAgbC5jbG9zZSgpCisgICAgICAgICAgICBwLmpvaW4oMTApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQob2xkX3RpbWVvdXQpCisKKyMKKyMgVGVzdCB3aGF0IGhhcHBlbnMgd2l0aCBubyAiaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJyIKKyMKKworY2xhc3MgVGVzdE5vRm9ya0JvbWIodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X25vZm9ya2JvbWIoc2VsZik6CisgICAgICAgIG5hbWUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgJ21wX2ZvcmtfYm9tYi5weScpCisgICAgICAgIGlmIFdJTjMyOgorICAgICAgICAgICAgcmMsIG91dCwgZXJyID0gdGVzdC5zY3JpcHRfaGVscGVyLmFzc2VydF9weXRob25fZmFpbHVyZShuYW1lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJywgb3V0LmRlY29kZSgnYXNjaWknKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ1J1bnRpbWVFcnJvcicsIGVyci5kZWNvZGUoJ2FzY2lpJykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYywgb3V0LCBlcnIgPSB0ZXN0LnNjcmlwdF9oZWxwZXIuYXNzZXJ0X3B5dGhvbl9vayhuYW1lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnMTIzJywgb3V0LmRlY29kZSgnYXNjaWknKS5yc3RyaXAoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycsIGVyci5kZWNvZGUoJ2FzY2lpJykpCisKKyMKKyMgSXNzdWUgMTIwOTg6IGNoZWNrIHN5cy5mbGFncyBvZiBjaGlsZCBtYXRjaGVzIHRoYXQgZm9yIHBhcmVudAorIworCitjbGFzcyBUZXN0RmxhZ3ModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBydW5faW5fZ3JhbmRjaGlsZChjbHMsIGNvbm4pOgorICAgICAgICBjb25uLnNlbmQodHVwbGUoc3lzLmZsYWdzKSkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBydW5faW5fY2hpbGQoY2xzKToKKyAgICAgICAgaW1wb3J0IGpzb24KKyAgICAgICAgciwgdyA9IG11bHRpcHJvY2Vzc2luZy5QaXBlKGR1cGxleD1GYWxzZSkKKyAgICAgICAgcCA9IG11bHRpcHJvY2Vzc2luZy5Qcm9jZXNzKHRhcmdldD1jbHMucnVuX2luX2dyYW5kY2hpbGQsIGFyZ3M9KHcsKSkKKyAgICAgICAgcC5zdGFydCgpCisgICAgICAgIGdyYW5kY2hpbGRfZmxhZ3MgPSByLnJlY3YoKQorICAgICAgICBwLmpvaW4oKQorICAgICAgICByLmNsb3NlKCkKKyAgICAgICAgdy5jbG9zZSgpCisgICAgICAgIGZsYWdzID0gKHR1cGxlKHN5cy5mbGFncyksIGdyYW5kY2hpbGRfZmxhZ3MpCisgICAgICAgIHByaW50KGpzb24uZHVtcHMoZmxhZ3MpKQorCisgICAgZGVmIHRlc3RfZmxhZ3Moc2VsZik6CisgICAgICAgIGltcG9ydCBqc29uLCBzdWJwcm9jZXNzCisgICAgICAgICMgc3RhcnQgY2hpbGQgcHJvY2VzcyB1c2luZyB1bnVzdWFsIGZsYWdzCisgICAgICAgIHByb2cgPSAoJ2Zyb20gdGVzdC50ZXN0X211bHRpcHJvY2Vzc2luZyBpbXBvcnQgVGVzdEZsYWdzOyAnICsKKyAgICAgICAgICAgICAgICAnVGVzdEZsYWdzLnJ1bl9pbl9jaGlsZCgpJykKKyAgICAgICAgZGF0YSA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KAorICAgICAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAnLUUnLCAnLUInLCAnLU8nLCAnLWMnLCBwcm9nXSkKKyAgICAgICAgY2hpbGRfZmxhZ3MsIGdyYW5kY2hpbGRfZmxhZ3MgPSBqc29uLmxvYWRzKGRhdGEuZGVjb2RlKCdhc2NpaScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNoaWxkX2ZsYWdzLCBncmFuZGNoaWxkX2ZsYWdzKQorCisjCisjIElzc3VlICMxNzU1NTogRm9ya0F3YXJlVGhyZWFkTG9jaworIworCitjbGFzcyBUZXN0Rm9ya0F3YXJlVGhyZWFkTG9jayh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBXZSByZWN1cmlzdmVseSBzdGFydCBwcm9jZXNzZXMuICBJc3N1ZSAjMTc1NTUgbWVhbnQgdGhhdCB0aGUKKyAgICAjIGFmdGVyIGZvcmsgcmVnaXN0cnkgd291bGQgZ2V0IGR1cGxpY2F0ZSBlbnRyaWVzIGZvciB0aGUgc2FtZQorICAgICMgbG9jay4gIFRoZSBzaXplIG9mIHRoZSByZWdpc3RyeSBhdCBnZW5lcmF0aW9uIG4gd2FzIH4yKipuLgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGNoaWxkKGNscywgbiwgY29ubik6CisgICAgICAgIGlmIG4gPiAxOgorICAgICAgICAgICAgcCA9IG11bHRpcHJvY2Vzc2luZy5Qcm9jZXNzKHRhcmdldD1jbHMuY2hpbGQsIGFyZ3M9KG4tMSwgY29ubikpCisgICAgICAgICAgICBwLnN0YXJ0KCkKKyAgICAgICAgICAgIHAuam9pbigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb25uLnNlbmQobGVuKHV0aWwuX2FmdGVyZm9ya19yZWdpc3RyeSkpCisgICAgICAgIGNvbm4uY2xvc2UoKQorCisgICAgZGVmIHRlc3RfbG9jayhzZWxmKToKKyAgICAgICAgciwgdyA9IG11bHRpcHJvY2Vzc2luZy5QaXBlKEZhbHNlKQorICAgICAgICBsID0gdXRpbC5Gb3JrQXdhcmVUaHJlYWRMb2NrKCkKKyAgICAgICAgb2xkX3NpemUgPSBsZW4odXRpbC5fYWZ0ZXJmb3JrX3JlZ2lzdHJ5KQorICAgICAgICBwID0gbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3ModGFyZ2V0PXNlbGYuY2hpbGQsIGFyZ3M9KDUsIHcpKQorICAgICAgICBwLnN0YXJ0KCkKKyAgICAgICAgbmV3X3NpemUgPSByLnJlY3YoKQorICAgICAgICBwLmpvaW4oKQorICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbChuZXdfc2l6ZSwgb2xkX3NpemUpCisKKyMKKyMgSXNzdWUgIzE3MDk3OiBFSU5UUiBzaG91bGQgYmUgaWdub3JlZCBieSByZWN2KCksIHNlbmQoKSwgYWNjZXB0KCkgZXRjCisjCisKK2NsYXNzIFRlc3RJZ25vcmVFSU5UUih1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX3Rlc3RfaWdub3JlKGNscywgY29ubik6CisgICAgICAgIGRlZiBoYW5kbGVyKHNpZ251bSwgZnJhbWUpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdVU1IxLCBoYW5kbGVyKQorICAgICAgICBjb25uLnNlbmQoJ3JlYWR5JykKKyAgICAgICAgeCA9IGNvbm4ucmVjdigpCisgICAgICAgIGNvbm4uc2VuZCh4KQorICAgICAgICBjb25uLnNlbmRfYnl0ZXMoYid4JyooMTAyNCoxMDI0KSkgICAjIHNlbmRpbmcgMSBNQiBzaG91bGQgYmxvY2sKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIoc2lnbmFsLCAnU0lHVVNSMScpLCAncmVxdWlyZXMgU0lHVVNSMScpCisgICAgZGVmIHRlc3RfaWdub3JlKHNlbGYpOgorICAgICAgICBjb25uLCBjaGlsZF9jb25uID0gbXVsdGlwcm9jZXNzaW5nLlBpcGUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwID0gbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3ModGFyZ2V0PXNlbGYuX3Rlc3RfaWdub3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KGNoaWxkX2Nvbm4sKSkKKyAgICAgICAgICAgIHAuZGFlbW9uID0gVHJ1ZQorICAgICAgICAgICAgcC5zdGFydCgpCisgICAgICAgICAgICBjaGlsZF9jb25uLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29ubi5yZWN2KCksICdyZWFkeScpCisgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKyAgICAgICAgICAgIG9zLmtpbGwocC5waWQsIHNpZ25hbC5TSUdVU1IxKQorICAgICAgICAgICAgdGltZS5zbGVlcCgwLjEpCisgICAgICAgICAgICBjb25uLnNlbmQoMTIzNCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29ubi5yZWN2KCksIDEyMzQpCisgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKyAgICAgICAgICAgIG9zLmtpbGwocC5waWQsIHNpZ25hbC5TSUdVU1IxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb25uLnJlY3ZfYnl0ZXMoKSwgYid4JyooMTAyNCoxMDI0KSkKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorICAgICAgICAgICAgcC5qb2luKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGNvbm4uY2xvc2UoKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF90ZXN0X2lnbm9yZV9saXN0ZW5lcihjbHMsIGNvbm4pOgorICAgICAgICBkZWYgaGFuZGxlcihzaWdudW0sIGZyYW1lKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHVVNSMSwgaGFuZGxlcikKKyAgICAgICAgbCA9IG11bHRpcHJvY2Vzc2luZy5jb25uZWN0aW9uLkxpc3RlbmVyKCkKKyAgICAgICAgY29ubi5zZW5kKGwuYWRkcmVzcykKKyAgICAgICAgYSA9IGwuYWNjZXB0KCkKKyAgICAgICAgYS5zZW5kKCd3ZWxjb21lJykKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIoc2lnbmFsLCAnU0lHVVNSMScpLCAncmVxdWlyZXMgU0lHVVNSMScpCisgICAgZGVmIHRlc3RfaWdub3JlX2xpc3RlbmVyKHNlbGYpOgorICAgICAgICBjb25uLCBjaGlsZF9jb25uID0gbXVsdGlwcm9jZXNzaW5nLlBpcGUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwID0gbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3ModGFyZ2V0PXNlbGYuX3Rlc3RfaWdub3JlX2xpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KGNoaWxkX2Nvbm4sKSkKKyAgICAgICAgICAgIHAuZGFlbW9uID0gVHJ1ZQorICAgICAgICAgICAgcC5zdGFydCgpCisgICAgICAgICAgICBjaGlsZF9jb25uLmNsb3NlKCkKKyAgICAgICAgICAgIGFkZHJlc3MgPSBjb25uLnJlY3YoKQorICAgICAgICAgICAgdGltZS5zbGVlcCgwLjEpCisgICAgICAgICAgICBvcy5raWxsKHAucGlkLCBzaWduYWwuU0lHVVNSMSkKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorICAgICAgICAgICAgY2xpZW50ID0gbXVsdGlwcm9jZXNzaW5nLmNvbm5lY3Rpb24uQ2xpZW50KGFkZHJlc3MpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNsaWVudC5yZWN2KCksICd3ZWxjb21lJykKKyAgICAgICAgICAgIHAuam9pbigpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBjb25uLmNsb3NlKCkKKworIworIworIworCiB0ZXN0Y2FzZXNfb3RoZXIgPSBbT3RoZXJUZXN0LCBUZXN0SW52YWxpZEhhbmRsZSwgVGVzdEluaXRpYWxpemVycywKLSAgICAgICAgICAgICAgICAgICBUZXN0U3RkaW5CYWRmaWxlZGVzY3JpcHRvcl0KKyAgICAgICAgICAgICAgICAgICBUZXN0U3RkaW5CYWRmaWxlZGVzY3JpcHRvciwgVGVzdFRpbWVvdXRzLCBUZXN0Tm9Gb3JrQm9tYiwKKyAgICAgICAgICAgICAgICAgICBUZXN0RmxhZ3MsIFRlc3RGb3JrQXdhcmVUaHJlYWRMb2NrLCBUZXN0SWdub3JlRUlOVFJdCiAKICMKICMKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbXV0ZXgucHkgYi9MaWIvdGVzdC90ZXN0X211dGV4LnB5CmluZGV4IDI4ODIyMTMuLjAzMDA4MGUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbXV0ZXgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tdXRleC5weQpAQCAtMTQsNyArMTQsNyBAQAogICAgICAgICAgICAgbS5sb2NrKGNhbGxlZF9ieV9tdXRleDIsICJlZ2dzIikKIAogICAgICAgICBkZWYgY2FsbGVkX2J5X211dGV4Mihzb21lX2RhdGEpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc29tZV9kYXRhLCAiZWdncyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvbWVfZGF0YSwgImVnZ3MiKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG0udGVzdCgpLCAibXV0ZXggbm90IGhlbGQiKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlYWR5X2Zvcl8yLAogICAgICAgICAgICAgICAgICAgICAgICAgICJjYWxsZWRfYnlfbXV0ZXgyIGNhbGxlZCB0b28gc29vbiIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X25ldHJjLnB5IGIvTGliL3Rlc3QvdGVzdF9uZXRyYy5weQppbmRleCAyNzk1NDU2Li40MTU2YzUzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X25ldHJjLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbmV0cmMucHkKQEAgLTUsOSArNSw2IEBACiAKIGNsYXNzIE5ldHJjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogCi0gICAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgICAgICBvcy51bmxpbmsodGVtcF9maWxlbmFtZSkKLQogICAgIGRlZiBtYWtlX25yYyhzZWxmLCB0ZXN0X2RhdGEpOgogICAgICAgICB0ZXN0X2RhdGEgPSB0ZXh0d3JhcC5kZWRlbnQodGVzdF9kYXRhKQogICAgICAgICBtb2RlID0gJ3cnCkBAIC0xNSw2ICsxMiw3IEBACiAgICAgICAgICAgICBtb2RlICs9ICd0JwogICAgICAgICB3aXRoIG9wZW4odGVtcF9maWxlbmFtZSwgbW9kZSkgYXMgZnA6CiAgICAgICAgICAgICBmcC53cml0ZSh0ZXN0X2RhdGEpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy51bmxpbmssIHRlbXBfZmlsZW5hbWUpCiAgICAgICAgIHJldHVybiBuZXRyYy5uZXRyYyh0ZW1wX2ZpbGVuYW1lKQogCiAgICAgZGVmIHRlc3RfZGVmYXVsdChzZWxmKToKQEAgLTEwMyw2ICsxMDEsMjggQEAKICAgICAgICAgICAgICIiIiwgJyNwYXNzJykKIAogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Mob3MubmFtZSA9PSAncG9zaXgnLCAnUE9TSVggb25seSB0ZXN0JykKKyAgICBkZWYgdGVzdF9zZWN1cml0eShzZWxmKToKKyAgICAgICAgIyBUaGlzIHRlc3QgaXMgaW5jb21wbGV0ZSBzaW5jZSB3ZSBhcmUgbm9ybWFsbHkgbm90IHJ1biBhcyByb290IGFuZAorICAgICAgICAjIHRoZXJlZm9yZSBjYW4ndCB0ZXN0IHRoZSBmaWxlIG93bmVyc2hpcCBiZWluZyB3cm9uZy4KKyAgICAgICAgZCA9IHRlc3Rfc3VwcG9ydC5URVNURk4KKyAgICAgICAgb3MubWtkaXIoZCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHRlc3Rfc3VwcG9ydC5ybXRyZWUsIGQpCisgICAgICAgIGZuID0gb3MucGF0aC5qb2luKGQsICcubmV0cmMnKQorICAgICAgICB3aXRoIG9wZW4oZm4sICd3dCcpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKCIiIlwKKyAgICAgICAgICAgICAgICBtYWNoaW5lIGZvby5kb21haW4uY29tIGxvZ2luIGJhciBwYXNzd29yZCBwYXNzCisgICAgICAgICAgICAgICAgZGVmYXVsdCBsb2dpbiBmb28gcGFzc3dvcmQgcGFzcworICAgICAgICAgICAgICAgICIiIikKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuRW52aXJvbm1lbnRWYXJHdWFyZCgpIGFzIGVudmlyb246CisgICAgICAgICAgICBlbnZpcm9uLnNldCgnSE9NRScsIGQpCisgICAgICAgICAgICBvcy5jaG1vZChmbiwgMDYwMCkKKyAgICAgICAgICAgIG5yYyA9IG5ldHJjLm5ldHJjKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnJjLmhvc3RzWydmb28uZG9tYWluLmNvbSddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2JhcicsIE5vbmUsICdwYXNzJykpCisgICAgICAgICAgICBvcy5jaG1vZChmbiwgMG82MjIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhuZXRyYy5OZXRyY1BhcnNlRXJyb3IsIG5ldHJjLm5ldHJjKQorCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChOZXRyY1Rlc3RDYXNlKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X25pcy5weSBiL0xpYi90ZXN0L3Rlc3RfbmlzLnB5CmluZGV4IDhkNDk1NTAuLjJhOWYyYTggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbmlzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbmlzLnB5CkBAIC05LDExICs5LDcgQEAKICAgICAgICAgICAgIG1hcHMgPSBuaXMubWFwcygpCiAgICAgICAgIGV4Y2VwdCBuaXMuZXJyb3IsIG1zZzoKICAgICAgICAgICAgICMgTklTIGlzIHByb2JhYmx5IG5vdCBhY3RpdmUsIHNvIHRoaXMgdGVzdCBpc24ndCB1c2VmdWwKLSAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgotICAgICAgICAgICAgICAgIHByaW50ICJUZXN0IFNraXBwZWQ6IiwgbXNnCi0gICAgICAgICAgICAjIENhbid0IHJhaXNlIFNraXBUZXN0IGFzIHJlZ3J0ZXN0IG9ubHkgcmVjb2duaXplcyB0aGUgZXhjZXB0aW9uCi0gICAgICAgICAgICAjICAgaW1wb3J0IHRpbWUuCi0gICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3Qoc3RyKG1zZykpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgICMgT24gc29tZSBzeXN0ZW1zLCB0aGlzIG1hcCBpcyBvbmx5IGFjY2Vzc2libGUgdG8gdGhlCiAgICAgICAgICAgICAjIHN1cGVyIHVzZXIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfbm50cGxpYi5weSBiL0xpYi90ZXN0L3Rlc3Rfbm50cGxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2YyMjY3Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9ubnRwbGliLnB5CkBAIC0wLDAgKzEsNzMgQEAKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBubnRwbGliCitpbXBvcnQgdGltZQoraW1wb3J0IHVuaXR0ZXN0CisKK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgdGhyZWFkaW5nID0gTm9uZQorCisKK2Zyb20gdW5pdHRlc3QgaW1wb3J0IFRlc3RDYXNlCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitIT1NUID0gdGVzdF9zdXBwb3J0LkhPU1QKKworCitkZWYgc2VydmVyKGV2dCwgc2VydiwgZXZpbD1GYWxzZSk6CisgICAgc2Vydi5saXN0ZW4oNSkKKyAgICB0cnk6CisgICAgICAgIGNvbm4sIGFkZHIgPSBzZXJ2LmFjY2VwdCgpCisgICAgZXhjZXB0IHNvY2tldC50aW1lb3V0OgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgaWYgZXZpbDoKKyAgICAgICAgICAgIGNvbm4uc2VuZCgiMSBJJ20gdG9vIGxvbmcgcmVzcG9uc2UiICogMzAwMCArICJcbiIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb25uLnNlbmQoIjEgSSdtIE9LIHJlc3BvbnNlXG4iKQorICAgICAgICBjb25uLmNsb3NlKCkKKyAgICBmaW5hbGx5OgorICAgICAgICBzZXJ2LmNsb3NlKCkKKyAgICAgICAgZXZ0LnNldCgpCisKKworY2xhc3MgQmFzZVNlcnZlclRlc3QoVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5ldnQgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICBzZWxmLnNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNlbGYuc29jay5zZXR0aW1lb3V0KDMpCisgICAgICAgIHNlbGYucG9ydCA9IHRlc3Rfc3VwcG9ydC5iaW5kX3BvcnQoc2VsZi5zb2NrKQorICAgICAgICB0aHJlYWRpbmcuVGhyZWFkKAorICAgICAgICAgICAgdGFyZ2V0PXNlcnZlciwKKyAgICAgICAgICAgIGFyZ3M9KHNlbGYuZXZ0LCBzZWxmLnNvY2ssIHNlbGYuZXZpbCkpLnN0YXJ0KCkKKyAgICAgICAgdGltZS5zbGVlcCguMSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5ldnQud2FpdCgpCisKKworQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAndGhyZWFkaW5nIHJlcXVpcmVkJykKK2NsYXNzIFNlcnZlclRlc3RzKEJhc2VTZXJ2ZXJUZXN0KToKKyAgICBldmlsID0gRmFsc2UKKworICAgIGRlZiB0ZXN0X2Jhc2ljX2Nvbm5lY3Qoc2VsZik6CisgICAgICAgIG5udHAgPSBubnRwbGliLk5OVFAoJ2xvY2FsaG9zdCcsIHNlbGYucG9ydCkKKyAgICAgICAgbm50cC5zb2NrLmNsb3NlKCkKKworCitAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICd0aHJlYWRpbmcgcmVxdWlyZWQnKQorY2xhc3MgRXZpbFNlcnZlclRlc3RzKEJhc2VTZXJ2ZXJUZXN0KToKKyAgICBldmlsID0gVHJ1ZQorCisgICAgZGVmIHRlc3RfdG9vX2xvbmdfbGluZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMobm50cGxpYi5OTlRQRGF0YUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBubnRwbGliLk5OVFAsICdsb2NhbGhvc3QnLCBzZWxmLnBvcnQpCisKKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoRXZpbFNlcnZlclRlc3RzKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoU2VydmVyVGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfbm9ybWFsaXphdGlvbi5weSBiL0xpYi90ZXN0L3Rlc3Rfbm9ybWFsaXphdGlvbi5weQppbmRleCAzMDQwYTA4Li4xYzQ1YWQ1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X25vcm1hbGl6YXRpb24ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9ub3JtYWxpemF0aW9uLnB5CkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgICAgICAgICAgICAgYzEsYzIsYzMsYzQsYzUgPSBbdW5pc3RyKHgpIGZvciB4IGluIGxpbmUuc3BsaXQoJzsnKVs6LTFdXQogICAgICAgICAgICAgZXhjZXB0IFJhbmdlRXJyb3I6CiAgICAgICAgICAgICAgICAgIyBTa2lwIHVuc3VwcG9ydGVkIGNoYXJhY3RlcnM7Ci0gICAgICAgICAgICAgICAgIyB0cnkgYXRsZWFzdCBhZGRpbmcgYzEgaWYgd2UgYXJlIGluIHBhcnQxCisgICAgICAgICAgICAgICAgIyB0cnkgYXQgbGVhc3QgYWRkaW5nIGMxIGlmIHdlIGFyZSBpbiBwYXJ0MQogICAgICAgICAgICAgICAgIGlmIHBhcnQgPT0gIkBQYXJ0MSI6CiAgICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgIGMxID0gdW5pc3RyKGxpbmUuc3BsaXQoJzsnKVswXSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbnRwYXRoLnB5IGIvTGliL3Rlc3QvdGVzdF9udHBhdGgucHkKaW5kZXggZTE4NTJjMC4uNzhhZjE4YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9udHBhdGgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9udHBhdGgucHkKQEAgLTEsMTYgKzEsMjAgQEAKKyMgY29kaW5nOiB1dGYtOAogaW1wb3J0IG50cGF0aAogaW1wb3J0IG9zCitpbXBvcnQgc3lzCiBmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0RmFpbGVkCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydCwgdGVzdF9nZW5lcmljcGF0aAogaW1wb3J0IHVuaXR0ZXN0CiAKK2RlZiB0ZXN0ZXIwKGZuLCB3YW50UmVzdWx0KToKKyAgICBnb3RSZXN1bHQgPSBldmFsKGZuKQorICAgIGlmIHdhbnRSZXN1bHQgIT0gZ290UmVzdWx0OgorICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAiJXMgc2hvdWxkIHJldHVybjogJXIgYnV0IHJldHVybmVkOiAlciIgXAorICAgICAgICAgICAgICAlKGZuLCB3YW50UmVzdWx0LCBnb3RSZXN1bHQpCiAKIGRlZiB0ZXN0ZXIoZm4sIHdhbnRSZXN1bHQpOgogICAgIGZuID0gZm4ucmVwbGFjZSgiXFwiLCAiXFxcXCIpCi0gICAgZ290UmVzdWx0ID0gZXZhbChmbikKLSAgICBpZiB3YW50UmVzdWx0ICE9IGdvdFJlc3VsdDoKLSAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCwgIiVzIHNob3VsZCByZXR1cm46ICVzIGJ1dCByZXR1cm5lZDogJXMiIFwKLSAgICAgICAgICAgICAgJShzdHIoZm4pLCBzdHIod2FudFJlc3VsdCksIHN0cihnb3RSZXN1bHQpKQorICAgIHRlc3RlcjAoZm4sIHdhbnRSZXN1bHQpCiAKIAogY2xhc3MgVGVzdE50cGF0aCh1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC0zMSwxMiArMzUsNDEgQEAKICAgICAgICAgICAgICAgICgnYzonLCAnXFxmb29cXGJhcicpKQogICAgICAgICB0ZXN0ZXIoJ250cGF0aC5zcGxpdGRyaXZlKCJjOi9mb28vYmFyIiknLAogICAgICAgICAgICAgICAgKCdjOicsICcvZm9vL2JhcicpKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5zcGxpdGRyaXZlKCJcXFxcY29ua3lcXG1vdW50cG9pbnRcXGZvb1xcYmFyIiknLAorICAgICAgICAgICAgICAgKCdcXFxcY29ua3lcXG1vdW50cG9pbnQnLCAnXFxmb29cXGJhcicpKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5zcGxpdGRyaXZlKCIvL2Nvbmt5L21vdW50cG9pbnQvZm9vL2JhciIpJywKKyAgICAgICAgICAgICAgICgnLy9jb25reS9tb3VudHBvaW50JywgJy9mb28vYmFyJykpCisgICAgICAgIHRlc3RlcignbnRwYXRoLnNwbGl0ZHJpdmUoIlxcXFxcXGNvbmt5XFxtb3VudHBvaW50XFxmb29cXGJhciIpJywKKyAgICAgICAgICAgICgnJywgJ1xcXFxcXGNvbmt5XFxtb3VudHBvaW50XFxmb29cXGJhcicpKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5zcGxpdGRyaXZlKCIvLy9jb25reS9tb3VudHBvaW50L2Zvby9iYXIiKScsCisgICAgICAgICAgICAoJycsICcvLy9jb25reS9tb3VudHBvaW50L2Zvby9iYXInKSkKKyAgICAgICAgdGVzdGVyKCdudHBhdGguc3BsaXRkcml2ZSgiXFxcXGNvbmt5XFxcXG1vdW50cG9pbnRcXGZvb1xcYmFyIiknLAorICAgICAgICAgICAgICAgKCcnLCAnXFxcXGNvbmt5XFxcXG1vdW50cG9pbnRcXGZvb1xcYmFyJykpCisgICAgICAgIHRlc3RlcignbnRwYXRoLnNwbGl0ZHJpdmUoIi8vY29ua3kvL21vdW50cG9pbnQvZm9vL2JhciIpJywKKyAgICAgICAgICAgICAgICgnJywgJy8vY29ua3kvL21vdW50cG9pbnQvZm9vL2JhcicpKQorICAgICAgICAjIElzc3VlICMxOTkxMTogVU5DIHBhcnQgY29udGFpbmluZyBVKzAxMzAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChudHBhdGguc3BsaXRkcml2ZSh1Jy8vY29ua3kvTU9VTlRQT8SwTlQvZm9vL2JhcicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICh1Jy8vY29ua3kvTU9VTlRQT8SwTlQnLCAnL2Zvby9iYXInKSkKIAogICAgIGRlZiB0ZXN0X3NwbGl0dW5jKHNlbGYpOgorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5zcGxpdHVuYygiYzpcXGZvb1xcYmFyIiknLAorICAgICAgICAgICAgICAgKCcnLCAnYzpcXGZvb1xcYmFyJykpCisgICAgICAgIHRlc3RlcignbnRwYXRoLnNwbGl0dW5jKCJjOi9mb28vYmFyIiknLAorICAgICAgICAgICAgICAgKCcnLCAnYzovZm9vL2JhcicpKQogICAgICAgICB0ZXN0ZXIoJ250cGF0aC5zcGxpdHVuYygiXFxcXGNvbmt5XFxtb3VudHBvaW50XFxmb29cXGJhciIpJywKICAgICAgICAgICAgICAgICgnXFxcXGNvbmt5XFxtb3VudHBvaW50JywgJ1xcZm9vXFxiYXInKSkKICAgICAgICAgdGVzdGVyKCdudHBhdGguc3BsaXR1bmMoIi8vY29ua3kvbW91bnRwb2ludC9mb28vYmFyIiknLAogICAgICAgICAgICAgICAgKCcvL2Nvbmt5L21vdW50cG9pbnQnLCAnL2Zvby9iYXInKSkKKyAgICAgICAgdGVzdGVyKCdudHBhdGguc3BsaXR1bmMoIlxcXFxcXGNvbmt5XFxtb3VudHBvaW50XFxmb29cXGJhciIpJywKKyAgICAgICAgICAgICAgICgnJywgJ1xcXFxcXGNvbmt5XFxtb3VudHBvaW50XFxmb29cXGJhcicpKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5zcGxpdHVuYygiLy8vY29ua3kvbW91bnRwb2ludC9mb28vYmFyIiknLAorICAgICAgICAgICAgICAgKCcnLCAnLy8vY29ua3kvbW91bnRwb2ludC9mb28vYmFyJykpCisgICAgICAgIHRlc3RlcignbnRwYXRoLnNwbGl0dW5jKCJcXFxcY29ua3lcXFxcbW91bnRwb2ludFxcZm9vXFxiYXIiKScsCisgICAgICAgICAgICAgICAoJycsICdcXFxcY29ua3lcXFxcbW91bnRwb2ludFxcZm9vXFxiYXInKSkKKyAgICAgICAgdGVzdGVyKCdudHBhdGguc3BsaXR1bmMoIi8vY29ua3kvL21vdW50cG9pbnQvZm9vL2JhciIpJywKKyAgICAgICAgICAgICAgICgnJywgJy8vY29ua3kvL21vdW50cG9pbnQvZm9vL2JhcicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG50cGF0aC5zcGxpdHVuYyh1Jy8vY29ua3kvTU9VTlRQT1x1MDEzME5UL2Zvby9iYXInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodScvL2Nvbmt5L01PVU5UUE9cdTAxMzBOVCcsIHUnL2Zvby9iYXInKSkKIAogICAgIGRlZiB0ZXN0X3NwbGl0KHNlbGYpOgogICAgICAgICB0ZXN0ZXIoJ250cGF0aC5zcGxpdCgiYzpcXGZvb1xcYmFyIiknLCAoJ2M6XFxmb28nLCAnYmFyJykpCkBAIC00NSwxMCArNzgsMTAgQEAKIAogICAgICAgICB0ZXN0ZXIoJ250cGF0aC5zcGxpdCgiYzpcXCIpJywgKCdjOlxcJywgJycpKQogICAgICAgICB0ZXN0ZXIoJ250cGF0aC5zcGxpdCgiXFxcXGNvbmt5XFxtb3VudHBvaW50XFwiKScsCi0gICAgICAgICAgICAgICAoJ1xcXFxjb25reVxcbW91bnRwb2ludCcsICcnKSkKKyAgICAgICAgICAgICAgICgnXFxcXGNvbmt5XFxtb3VudHBvaW50XFwnLCAnJykpCiAKICAgICAgICAgdGVzdGVyKCdudHBhdGguc3BsaXQoImM6LyIpJywgKCdjOi8nLCAnJykpCi0gICAgICAgIHRlc3RlcignbnRwYXRoLnNwbGl0KCIvL2Nvbmt5L21vdW50cG9pbnQvIiknLCAoJy8vY29ua3kvbW91bnRwb2ludCcsICcnKSkKKyAgICAgICAgdGVzdGVyKCdudHBhdGguc3BsaXQoIi8vY29ua3kvbW91bnRwb2ludC8iKScsICgnLy9jb25reS9tb3VudHBvaW50LycsICcnKSkKIAogICAgIGRlZiB0ZXN0X2lzYWJzKHNlbGYpOgogICAgICAgICB0ZXN0ZXIoJ250cGF0aC5pc2FicygiYzpcXCIpJywgMSkKQEAgLTcxLDEwICsxMDQsNyBAQAogICAgICAgICB0ZXN0ZXIoJ250cGF0aC5qb2luKCIvYSIpJywgJy9hJykKICAgICAgICAgdGVzdGVyKCdudHBhdGguam9pbigiXFxhIiknLCAnXFxhJykKICAgICAgICAgdGVzdGVyKCdudHBhdGguam9pbigiYToiKScsICdhOicpCi0gICAgICAgIHRlc3RlcignbnRwYXRoLmpvaW4oImE6IiwgImIiKScsICdhOmInKQotICAgICAgICB0ZXN0ZXIoJ250cGF0aC5qb2luKCJhOiIsICIvYiIpJywgJ2E6L2InKQogICAgICAgICB0ZXN0ZXIoJ250cGF0aC5qb2luKCJhOiIsICJcXGIiKScsICdhOlxcYicpCi0gICAgICAgIHRlc3RlcignbnRwYXRoLmpvaW4oImEiLCAiL2IiKScsICcvYicpCiAgICAgICAgIHRlc3RlcignbnRwYXRoLmpvaW4oImEiLCAiXFxiIiknLCAnXFxiJykKICAgICAgICAgdGVzdGVyKCdudHBhdGguam9pbigiYSIsICJiIiwgImMiKScsICdhXFxiXFxjJykKICAgICAgICAgdGVzdGVyKCdudHBhdGguam9pbigiYVxcIiwgImIiLCAiYyIpJywgJ2FcXGJcXGMnKQpAQCAtODIsMjIgKzExMiw0NiBAQAogICAgICAgICB0ZXN0ZXIoJ250cGF0aC5qb2luKCJhIiwgImIiLCAiXFxjIiknLCAnXFxjJykKICAgICAgICAgdGVzdGVyKCdudHBhdGguam9pbigiZDpcXCIsICJcXHBsZWVwIiknLCAnZDpcXHBsZWVwJykKICAgICAgICAgdGVzdGVyKCdudHBhdGguam9pbigiZDpcXCIsICJhIiwgImIiKScsICdkOlxcYVxcYicpCi0gICAgICAgIHRlc3RlcigibnRwYXRoLmpvaW4oJ2M6JywgJy9hJykiLCAnYzovYScpCi0gICAgICAgIHRlc3RlcigibnRwYXRoLmpvaW4oJ2M6LycsICcvYScpIiwgJ2M6L2EnKQotICAgICAgICB0ZXN0ZXIoIm50cGF0aC5qb2luKCdjOi9hJywgJy9iJykiLCAnL2InKQotICAgICAgICB0ZXN0ZXIoIm50cGF0aC5qb2luKCdjOicsICdkOi8nKSIsICdkOi8nKQotICAgICAgICB0ZXN0ZXIoIm50cGF0aC5qb2luKCdjOi8nLCAnZDovJykiLCAnZDovJykKLSAgICAgICAgdGVzdGVyKCJudHBhdGguam9pbignYzovJywgJ2Q6L2EvYicpIiwgJ2Q6L2EvYicpCiAKLSAgICAgICAgdGVzdGVyKCJudHBhdGguam9pbignJykiLCAnJykKLSAgICAgICAgdGVzdGVyKCJudHBhdGguam9pbignJywgJycsICcnLCAnJywgJycpIiwgJycpCi0gICAgICAgIHRlc3RlcigibnRwYXRoLmpvaW4oJ2EnKSIsICdhJykKICAgICAgICAgdGVzdGVyKCJudHBhdGguam9pbignJywgJ2EnKSIsICdhJykKICAgICAgICAgdGVzdGVyKCJudHBhdGguam9pbignJywgJycsICcnLCAnJywgJ2EnKSIsICdhJykKICAgICAgICAgdGVzdGVyKCJudHBhdGguam9pbignYScsICcnKSIsICdhXFwnKQogICAgICAgICB0ZXN0ZXIoIm50cGF0aC5qb2luKCdhJywgJycsICcnLCAnJywgJycpIiwgJ2FcXCcpCiAgICAgICAgIHRlc3RlcigibnRwYXRoLmpvaW4oJ2FcXCcsICcnKSIsICdhXFwnKQogICAgICAgICB0ZXN0ZXIoIm50cGF0aC5qb2luKCdhXFwnLCAnJywgJycsICcnLCAnJykiLCAnYVxcJykKKyAgICAgICAgdGVzdGVyKCJudHBhdGguam9pbignYS8nLCAnJykiLCAnYS8nKQorCisgICAgICAgIHRlc3RlcigibnRwYXRoLmpvaW4oJ2EvYicsICd4L3knKSIsICdhL2JcXHgveScpCisgICAgICAgIHRlc3RlcigibnRwYXRoLmpvaW4oJy9hL2InLCAneC95JykiLCAnL2EvYlxceC95JykKKyAgICAgICAgdGVzdGVyKCJudHBhdGguam9pbignL2EvYi8nLCAneC95JykiLCAnL2EvYi94L3knKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5qb2luKCdjOicsICd4L3knKSIsICdjOngveScpCisgICAgICAgIHRlc3RlcigibnRwYXRoLmpvaW4oJ2M6YS9iJywgJ3gveScpIiwgJ2M6YS9iXFx4L3knKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5qb2luKCdjOmEvYi8nLCAneC95JykiLCAnYzphL2IveC95JykKKyAgICAgICAgdGVzdGVyKCJudHBhdGguam9pbignYzovJywgJ3gveScpIiwgJ2M6L3gveScpCisgICAgICAgIHRlc3RlcigibnRwYXRoLmpvaW4oJ2M6L2EvYicsICd4L3knKSIsICdjOi9hL2JcXHgveScpCisgICAgICAgIHRlc3RlcigibnRwYXRoLmpvaW4oJ2M6L2EvYi8nLCAneC95JykiLCAnYzovYS9iL3gveScpCisgICAgICAgIHRlc3RlcigibnRwYXRoLmpvaW4oJy8vY29tcHV0ZXIvc2hhcmUnLCAneC95JykiLCAnLy9jb21wdXRlci9zaGFyZVxceC95JykKKyAgICAgICAgdGVzdGVyKCJudHBhdGguam9pbignLy9jb21wdXRlci9zaGFyZS8nLCAneC95JykiLCAnLy9jb21wdXRlci9zaGFyZS94L3knKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5qb2luKCcvL2NvbXB1dGVyL3NoYXJlL2EvYicsICd4L3knKSIsICcvL2NvbXB1dGVyL3NoYXJlL2EvYlxceC95JykKKworICAgICAgICB0ZXN0ZXIoIm50cGF0aC5qb2luKCdhL2InLCAnL3gveScpIiwgJy94L3knKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5qb2luKCcvYS9iJywgJy94L3knKSIsICcveC95JykKKyAgICAgICAgdGVzdGVyKCJudHBhdGguam9pbignYzonLCAnL3gveScpIiwgJ2M6L3gveScpCisgICAgICAgIHRlc3RlcigibnRwYXRoLmpvaW4oJ2M6YS9iJywgJy94L3knKSIsICdjOi94L3knKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5qb2luKCdjOi8nLCAnL3gveScpIiwgJ2M6L3gveScpCisgICAgICAgIHRlc3RlcigibnRwYXRoLmpvaW4oJ2M6L2EvYicsICcveC95JykiLCAnYzoveC95JykKKyAgICAgICAgdGVzdGVyKCJudHBhdGguam9pbignLy9jb21wdXRlci9zaGFyZScsICcveC95JykiLCAnLy9jb21wdXRlci9zaGFyZS94L3knKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5qb2luKCcvL2NvbXB1dGVyL3NoYXJlLycsICcveC95JykiLCAnLy9jb21wdXRlci9zaGFyZS94L3knKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5qb2luKCcvL2NvbXB1dGVyL3NoYXJlL2EnLCAnL3gveScpIiwgJy8vY29tcHV0ZXIvc2hhcmUveC95JykKKworICAgICAgICB0ZXN0ZXIoIm50cGF0aC5qb2luKCdjOicsICdDOngveScpIiwgJ0M6eC95JykKKyAgICAgICAgdGVzdGVyKCJudHBhdGguam9pbignYzphL2InLCAnQzp4L3knKSIsICdDOmEvYlxceC95JykKKyAgICAgICAgdGVzdGVyKCJudHBhdGguam9pbignYzovJywgJ0M6eC95JykiLCAnQzoveC95JykKKyAgICAgICAgdGVzdGVyKCJudHBhdGguam9pbignYzovYS9iJywgJ0M6eC95JykiLCAnQzovYS9iXFx4L3knKQorCisgICAgICAgIGZvciB4IGluICgnJywgJ2EvYicsICcvYS9iJywgJ2M6JywgJ2M6YS9iJywgJ2M6LycsICdjOi9hL2InKToKKyAgICAgICAgICAgIGZvciB5IGluICgnZDonLCAnZDp4L3knLCAnZDovJywgJ2Q6L3gveScpOgorICAgICAgICAgICAgICAgIHRlc3RlcigibnRwYXRoLmpvaW4oJXIsICVyKSIgJSAoeCwgeSksIHkpCiAKICAgICBkZWYgdGVzdF9ub3JtcGF0aChzZWxmKToKICAgICAgICAgdGVzdGVyKCJudHBhdGgubm9ybXBhdGgoJ0EvLy8vLy8uLy4vLy8uLy9CJykiLCByJ0FcQicpCkBAIC0xMzgsNyArMTkyLDYgQEAKICAgICAgICAgICAgIHRlc3RlcignbnRwYXRoLmV4cGFuZHZhcnMoIiRbZm9vXWJhciIpJywgIiRbZm9vXWJhciIpCiAgICAgICAgICAgICB0ZXN0ZXIoJ250cGF0aC5leHBhbmR2YXJzKCIkYmFyIGJhciIpJywgIiRiYXIgYmFyIikKICAgICAgICAgICAgIHRlc3RlcignbnRwYXRoLmV4cGFuZHZhcnMoIiQ/YmFyIiknLCAiJD9iYXIiKQotICAgICAgICAgICAgdGVzdGVyKCdudHBhdGguZXhwYW5kdmFycygiJHtmb299YmFyIiknLCAiYmFyYmFyIikKICAgICAgICAgICAgIHRlc3RlcignbnRwYXRoLmV4cGFuZHZhcnMoIiRmb299YmFyIiknLCAiYmFyfWJhciIpCiAgICAgICAgICAgICB0ZXN0ZXIoJ250cGF0aC5leHBhbmR2YXJzKCIke2ZvbyIpJywgIiR7Zm9vIikKICAgICAgICAgICAgIHRlc3RlcignbnRwYXRoLmV4cGFuZHZhcnMoIiR7e2Zvb319IiknLCAiYmF6MX0iKQpAQCAtMTUyLDYgKzIwNSw2NSBAQAogICAgICAgICAgICAgdGVzdGVyKCdudHBhdGguZXhwYW5kdmFycygiJWZvbyUlYmFyIiknLCAiYmFyJWJhciIpCiAgICAgICAgICAgICB0ZXN0ZXIoJ250cGF0aC5leHBhbmR2YXJzKCJcJyVmb28lXCclYmFyIiknLCAiXCclZm9vJVwnJWJhciIpCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh0ZXN0X3N1cHBvcnQuRlNfTk9OQVNDSUksICduZWVkIHRlc3Rfc3VwcG9ydC5GU19OT05BU0NJSScpCisgICAgZGVmIHRlc3RfZXhwYW5kdmFyc19ub25hc2NpaShzZWxmKToKKyAgICAgICAgZW5jb2RpbmcgPSBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkKKyAgICAgICAgZGVmIGNoZWNrKHZhbHVlLCBleHBlY3RlZCk6CisgICAgICAgICAgICB0ZXN0ZXIwKCJudHBhdGguZXhwYW5kdmFycyglcikiICUgdmFsdWUsIGV4cGVjdGVkKQorICAgICAgICAgICAgdGVzdGVyMCgibnRwYXRoLmV4cGFuZHZhcnMoJXIpIiAlIHZhbHVlLmRlY29kZShlbmNvZGluZyksCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLmRlY29kZShlbmNvZGluZykpCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LkVudmlyb25tZW50VmFyR3VhcmQoKSBhcyBlbnY6CisgICAgICAgICAgICBlbnYuY2xlYXIoKQorICAgICAgICAgICAgdW5vbmFzY2lpID0gdGVzdF9zdXBwb3J0LkZTX05PTkFTQ0lJCisgICAgICAgICAgICBzbm9uYXNjaWkgPSB1bm9uYXNjaWkuZW5jb2RlKGVuY29kaW5nKQorICAgICAgICAgICAgZW52WydzcGFtJ10gPSBzbm9uYXNjaWkKKyAgICAgICAgICAgIGVudltzbm9uYXNjaWldID0gJ2hhbScgKyBzbm9uYXNjaWkKKyAgICAgICAgICAgIGNoZWNrKCckc3BhbSBiYXInLCAnJXMgYmFyJyAlIHNub25hc2NpaSkKKyAgICAgICAgICAgIGNoZWNrKCckJXMgYmFyJyAlIHNub25hc2NpaSwgJyQlcyBiYXInICUgc25vbmFzY2lpKQorICAgICAgICAgICAgY2hlY2soJyR7c3BhbX1iYXInLCAnJXNiYXInICUgc25vbmFzY2lpKQorICAgICAgICAgICAgY2hlY2soJyR7JXN9YmFyJyAlIHNub25hc2NpaSwgJ2hhbSVzYmFyJyAlIHNub25hc2NpaSkKKyAgICAgICAgICAgIGNoZWNrKCckc3BhbX1iYXInLCAnJXN9YmFyJyAlIHNub25hc2NpaSkKKyAgICAgICAgICAgIGNoZWNrKCckJXN9YmFyJyAlIHNub25hc2NpaSwgJyQlc31iYXInICUgc25vbmFzY2lpKQorICAgICAgICAgICAgY2hlY2soJyVzcGFtJSBiYXInLCAnJXMgYmFyJyAlIHNub25hc2NpaSkKKyAgICAgICAgICAgIGNoZWNrKCcle30lIGJhcicuZm9ybWF0KHNub25hc2NpaSksICdoYW0lcyBiYXInICUgc25vbmFzY2lpKQorICAgICAgICAgICAgY2hlY2soJyVzcGFtJWJhcicsICclc2JhcicgJSBzbm9uYXNjaWkpCisgICAgICAgICAgICBjaGVjaygnJXt9JWJhcicuZm9ybWF0KHNub25hc2NpaSksICdoYW0lc2JhcicgJSBzbm9uYXNjaWkpCisKKyAgICBkZWYgdGVzdF9leHBhbmR1c2VyKHNlbGYpOgorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5leHBhbmR1c2VyKCJ0ZXN0IiknLCAndGVzdCcpCisKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuRW52aXJvbm1lbnRWYXJHdWFyZCgpIGFzIGVudjoKKyAgICAgICAgICAgIGVudi5jbGVhcigpCisgICAgICAgICAgICB0ZXN0ZXIoJ250cGF0aC5leHBhbmR1c2VyKCJ+dGVzdCIpJywgJ350ZXN0JykKKworICAgICAgICAgICAgZW52WydIT01FUEFUSCddID0gJ2VyaWNcXGlkbGUnCisgICAgICAgICAgICBlbnZbJ0hPTUVEUklWRSddID0gJ0M6XFwnCisgICAgICAgICAgICB0ZXN0ZXIoJ250cGF0aC5leHBhbmR1c2VyKCJ+dGVzdCIpJywgJ0M6XFxlcmljXFx0ZXN0JykKKyAgICAgICAgICAgIHRlc3RlcignbnRwYXRoLmV4cGFuZHVzZXIoIn4iKScsICdDOlxcZXJpY1xcaWRsZScpCisKKyAgICAgICAgICAgIGRlbCBlbnZbJ0hPTUVEUklWRSddCisgICAgICAgICAgICB0ZXN0ZXIoJ250cGF0aC5leHBhbmR1c2VyKCJ+dGVzdCIpJywgJ2VyaWNcXHRlc3QnKQorICAgICAgICAgICAgdGVzdGVyKCdudHBhdGguZXhwYW5kdXNlcigifiIpJywgJ2VyaWNcXGlkbGUnKQorCisgICAgICAgICAgICBlbnYuY2xlYXIoKQorICAgICAgICAgICAgZW52WydVU0VSUFJPRklMRSddID0gJ0M6XFxlcmljXFxpZGxlJworICAgICAgICAgICAgdGVzdGVyKCdudHBhdGguZXhwYW5kdXNlcigifnRlc3QiKScsICdDOlxcZXJpY1xcdGVzdCcpCisgICAgICAgICAgICB0ZXN0ZXIoJ250cGF0aC5leHBhbmR1c2VyKCJ+IiknLCAnQzpcXGVyaWNcXGlkbGUnKQorCisgICAgICAgICAgICBlbnYuY2xlYXIoKQorICAgICAgICAgICAgZW52WydIT01FJ10gPSAnQzpcXGlkbGVcXGVyaWMnCisgICAgICAgICAgICB0ZXN0ZXIoJ250cGF0aC5leHBhbmR1c2VyKCJ+dGVzdCIpJywgJ0M6XFxpZGxlXFx0ZXN0JykKKyAgICAgICAgICAgIHRlc3RlcignbnRwYXRoLmV4cGFuZHVzZXIoIn4iKScsICdDOlxcaWRsZVxcZXJpYycpCisKKyAgICAgICAgICAgIHRlc3RlcignbnRwYXRoLmV4cGFuZHVzZXIoIn50ZXN0XFxmb29cXGJhciIpJywKKyAgICAgICAgICAgICAgICAgICAnQzpcXGlkbGVcXHRlc3RcXGZvb1xcYmFyJykKKyAgICAgICAgICAgIHRlc3RlcignbnRwYXRoLmV4cGFuZHVzZXIoIn50ZXN0L2Zvby9iYXIiKScsCisgICAgICAgICAgICAgICAgICAgJ0M6XFxpZGxlXFx0ZXN0L2Zvby9iYXInKQorICAgICAgICAgICAgdGVzdGVyKCdudHBhdGguZXhwYW5kdXNlcigiflxcZm9vXFxiYXIiKScsCisgICAgICAgICAgICAgICAgICAgJ0M6XFxpZGxlXFxlcmljXFxmb29cXGJhcicpCisgICAgICAgICAgICB0ZXN0ZXIoJ250cGF0aC5leHBhbmR1c2VyKCJ+L2Zvby9iYXIiKScsCisgICAgICAgICAgICAgICAgICAgJ0M6XFxpZGxlXFxlcmljL2Zvby9iYXInKQorCiAgICAgZGVmIHRlc3RfYWJzcGF0aChzZWxmKToKICAgICAgICAgIyBudHBhdGguYWJzcGF0aCgpIGNhbiBvbmx5IGJlIHVzZWQgb24gYSBzeXN0ZW0gd2l0aCB0aGUgIm50IiBtb2R1bGUKICAgICAgICAgIyAocmVhc29uYWJseSksIHNvIHdlIHByb3RlY3QgdGhpcyB0ZXN0IHdpdGggImltcG9ydCBudCIuICBUaGlzIGFsbG93cwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vbGRfbWFpbGJveC5weSBiL0xpYi90ZXN0L3Rlc3Rfb2xkX21haWxib3gucHkKaW5kZXggZThkZmY1MC4uMTRiYTljMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9vbGRfbWFpbGJveC5weQorKysgYi9MaWIvdGVzdC90ZXN0X29sZF9tYWlsYm94LnB5CkBAIC03Myw3ICs3Myw5IEBACiAgICAgICAgIHNlbGYuY3JlYXRlTWVzc2FnZSgiY3VyIikKICAgICAgICAgc2VsZi5tYm94ID0gbWFpbGJveC5NYWlsZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5tYm94KSA9PSAxKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYm94Lm5leHQoKSBpcyBub3QgTm9uZSkKKyAgICAgICAgbXNnID0gc2VsZi5tYm94Lm5leHQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnIGlzIG5vdCBOb25lKQorICAgICAgICBtc2cuZnAuY2xvc2UoKQogICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQogICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQogCkBAIC04MSw3ICs4Myw5IEBACiAgICAgICAgIHNlbGYuY3JlYXRlTWVzc2FnZSgibmV3IikKICAgICAgICAgc2VsZi5tYm94ID0gbWFpbGJveC5NYWlsZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5tYm94KSA9PSAxKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYm94Lm5leHQoKSBpcyBub3QgTm9uZSkKKyAgICAgICAgbXNnID0gc2VsZi5tYm94Lm5leHQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnIGlzIG5vdCBOb25lKQorICAgICAgICBtc2cuZnAuY2xvc2UoKQogICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQogICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQogCkBAIC05MCw4ICs5NCwxMiBAQAogICAgICAgICBzZWxmLmNyZWF0ZU1lc3NhZ2UoIm5ldyIpCiAgICAgICAgIHNlbGYubWJveCA9IG1haWxib3guTWFpbGRpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQogICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYubWJveCkgPT0gMikKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgbm90IE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1ib3gubmV4dCgpIGlzIG5vdCBOb25lKQorICAgICAgICBtc2cgPSBzZWxmLm1ib3gubmV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cgaXMgbm90IE5vbmUpCisgICAgICAgIG1zZy5mcC5jbG9zZSgpCisgICAgICAgIG1zZyA9IHNlbGYubWJveC5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZyBpcyBub3QgTm9uZSkKKyAgICAgICAgbXNnLmZwLmNsb3NlKCkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vcGVucHR5LnB5IGIvTGliL3Rlc3QvdGVzdF9vcGVucHR5LnB5CmluZGV4IDIwYzRmZTIuLjRiMzRiM2EgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3BlbnB0eS5weQorKysgYi9MaWIvdGVzdC90ZXN0X29wZW5wdHkucHkKQEAgLTEwLDYgKzEwLDggQEAKIGNsYXNzIE9wZW5wdHlUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdChzZWxmKToKICAgICAgICAgbWFzdGVyLCBzbGF2ZSA9IG9zLm9wZW5wdHkoKQorICAgICAgICBzZWxmLmFkZENsZWFudXAob3MuY2xvc2UsIG1hc3RlcikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKG9zLmNsb3NlLCBzbGF2ZSkKICAgICAgICAgaWYgbm90IG9zLmlzYXR0eShzbGF2ZSk6CiAgICAgICAgICAgICBzZWxmLmZhaWwoIlNsYXZlLWVuZCBvZiBwdHkgaXMgbm90IGEgdGVybWluYWwuIikKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vcHRwYXJzZS5weSBiL0xpYi90ZXN0L3Rlc3Rfb3B0cGFyc2UucHkKaW5kZXggZjg2ZWEwMS4uZGMyZWYwYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9vcHRwYXJzZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X29wdHBhcnNlLnB5CkBAIC0zODMsNiArMzgzLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5wYXJzZXIucmVtb3ZlX29wdGlvbiwgKCdmb28nLCksIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlRXJyb3IsICJubyBzdWNoIG9wdGlvbiAnZm9vJyIpCiAKKyAgICBAdGVzdF9zdXBwb3J0LmltcGxfZGV0YWlsKCdSZWxpZXMgb24gc3lzLmdldHJlZmNvdW50JywgY3B5dGhvbj1UcnVlKQogICAgIGRlZiB0ZXN0X3JlZmxlYWsoc2VsZik6CiAgICAgICAgICMgSWYgYW4gT3B0aW9uUGFyc2VyIGlzIGNhcnJ5aW5nIGFyb3VuZCBhIHJlZmVyZW5jZSB0byBhIGxhcmdlCiAgICAgICAgICMgb2JqZWN0LCB2YXJpb3VzIGN5Y2xlcyBjYW4gcHJldmVudCBpdCBmcm9tIGJlaW5nIEdDJ2QgaW4KQEAgLTc2OSw2ICs3NzAsMTMgQEAKICAgICAgICAgc2VsZi5hc3NlcnRQYXJzZUZhaWwoWyItdGVzdCJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm8gc3VjaCBvcHRpb246IC1lIikKIAorICAgIGRlZiB0ZXN0X2FkZF9vcHRpb25fYWNjZXB0c191bmljb2RlKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKHUiLXUiLCB1Ii0tdW5pY29kZSIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi11Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2EnOiBOb25lLCAnYm9vJzogTm9uZSwgJ2Zvbyc6IE5vbmUsICd1bmljb2RlJzogVHJ1ZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSkKKworCiBjbGFzcyBUZXN0Qm9vbChCYXNlVGVzdCk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBvcHRpb25zID0gW21ha2Vfb3B0aW9uKCItdiIsCkBAIC0xNDM3LDYgKzE0NDUsMzkgQEAKICAgLWgsIC0taGVscCAgICAgICAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKICIiIgogCitfZXhwZWN0ZWRfdmVyeV9oZWxwX3Nob3J0X2xpbmVzID0gIiIiXAorVXNhZ2U6IGJhci5weSBbb3B0aW9uc10KKworT3B0aW9uczoKKyAgLWEgQVBQTEUKKyAgICB0aHJvdworICAgIEFQUExFcyBhdAorICAgIGJhc2tldAorICAtYiBOVU0sIC0tYm9vPU5VTQorICAgIHNob3V0CisgICAgImJvbyEiIE5VTQorICAgIHRpbWVzIChpbgorICAgIG9yZGVyIHRvCisgICAgZnJpZ2h0ZW4KKyAgICBhd2F5IGFsbAorICAgIHRoZSBldmlsCisgICAgc3Bpcml0cworICAgIHRoYXQgY2F1c2UKKyAgICB0cm91YmxlIGFuZAorICAgIG1heWhlbSkKKyAgLS1mb289Rk9PCisgICAgc3RvcmUgRk9PCisgICAgaW4gdGhlIGZvbworICAgIGxpc3QgZm9yCisgICAgbGF0ZXIKKyAgICBmb29pbmcKKyAgLWgsIC0taGVscAorICAgIHNob3cgdGhpcworICAgIGhlbHAKKyAgICBtZXNzYWdlIGFuZAorICAgIGV4aXQKKyIiIgorCiBjbGFzcyBUZXN0SGVscChCYXNlVGVzdCk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLnBhcnNlciA9IHNlbGYubWFrZV9wYXJzZXIoODApCkBAIC0xNDk4LDYgKzE1MzksOCBAQAogICAgICAgICAjIHdlIGxvb2sgYXQgJENPTFVNTlMuCiAgICAgICAgIHNlbGYucGFyc2VyID0gc2VsZi5tYWtlX3BhcnNlcig2MCkKICAgICAgICAgc2VsZi5hc3NlcnRIZWxwRXF1YWxzKF9leHBlY3RlZF9oZWxwX3Nob3J0X2xpbmVzKQorICAgICAgICBzZWxmLnBhcnNlciA9IHNlbGYubWFrZV9wYXJzZXIoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRIZWxwRXF1YWxzKF9leHBlY3RlZF92ZXJ5X2hlbHBfc2hvcnRfbGluZXMpCiAKICAgICBkZWYgdGVzdF9oZWxwX3VuaWNvZGUoc2VsZik6CiAgICAgICAgIHNlbGYucGFyc2VyID0gSW50ZXJjZXB0aW5nT3B0aW9uUGFyc2VyKHVzYWdlPVNVUFBSRVNTX1VTQUdFKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vcy5weSBiL0xpYi90ZXN0L3Rlc3Rfb3MucHkKaW5kZXggZWVjMTYyMS4uMDIzZWJmNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9vcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X29zLnB5CkBAIC0xMCw3ICsxMCwxMyBAQAogaW1wb3J0IHNpZ25hbAogaW1wb3J0IHN1YnByb2Nlc3MKIGltcG9ydCB0aW1lCit0cnk6CisgICAgaW1wb3J0IHJlc291cmNlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcmVzb3VyY2UgPSBOb25lCisKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHRlc3Quc2NyaXB0X2hlbHBlciBpbXBvcnQgYXNzZXJ0X3B5dGhvbl9vawogaW1wb3J0IG1tYXAKIGltcG9ydCB1dWlkCiAKQEAgLTc3LDkgKzgzLDggQEAKICAgICAgICAgb3BlbihuYW1lLCAidyIpCiAgICAgICAgIHNlbGYuZmlsZXMuYXBwZW5kKG5hbWUpCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAndGVtcG5hbScpLCAndGVzdCBuZWVkcyBvcy50ZW1wbmFtKCknKQogICAgIGRlZiB0ZXN0X3RlbXBuYW0oc2VsZik6Ci0gICAgICAgIGlmIG5vdCBoYXNhdHRyKG9zLCAidGVtcG5hbSIpOgotICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKICAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAidGVtcG5hbSIsIFJ1bnRpbWVXYXJuaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJ0ZXN0X29zJCIpCkBAIC05Myw5ICs5OCw4IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5iYXNlbmFtZShuYW1lKVs6M10gPT0gInBmeCIpCiAgICAgICAgICAgICBzZWxmLmNoZWNrX3RlbXBmaWxlKG5hbWUpCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAndG1wZmlsZScpLCAndGVzdCBuZWVkcyBvcy50bXBmaWxlKCknKQogICAgIGRlZiB0ZXN0X3RtcGZpbGUoc2VsZik6Ci0gICAgICAgIGlmIG5vdCBoYXNhdHRyKG9zLCAidG1wZmlsZSIpOgotICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICMgQXMgd2l0aCB0ZXN0X3RtcG5hbSgpIGJlbG93LCB0aGUgV2luZG93cyBpbXBsZW1lbnRhdGlvbiBvZiB0bXBmaWxlKCkKICAgICAgICAgIyBhdHRlbXB0cyB0byBjcmVhdGUgYSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgY3VycmVudCBkcml2ZS4KICAgICAgICAgIyBPbiBWaXN0YSBhbmQgU2VydmVyIDIwMDgsIHRoaXMgdGVzdCB3aWxsIGFsd2F5cyBmYWlsIGZvciBub3JtYWwgdXNlcnMKQEAgLTE0NCw5ICsxNDgsOCBAQAogICAgICAgICAgICAgZnAuY2xvc2UoKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMgPT0gImZvb2JhciIpCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAndG1wbmFtJyksICd0ZXN0IG5lZWRzIG9zLnRtcG5hbSgpJykKICAgICBkZWYgdGVzdF90bXBuYW0oc2VsZik6Ci0gICAgICAgIGlmIG5vdCBoYXNhdHRyKG9zLCAidG1wbmFtIik6Ci0gICAgICAgICAgICByZXR1cm4KICAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgogICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJ0bXBuYW0iLCBSdW50aW1lV2FybmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIidGVzdF9vcyQiKQpAQCAtMTg3LDEwICsxOTAsOCBAQAogICAgICAgICBvcy51bmxpbmsoc2VsZi5mbmFtZSkKICAgICAgICAgb3Mucm1kaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdzdGF0JyksICd0ZXN0IG5lZWRzIG9zLnN0YXQoKScpCiAgICAgZGVmIHRlc3Rfc3RhdF9hdHRyaWJ1dGVzKHNlbGYpOgotICAgICAgICBpZiBub3QgaGFzYXR0cihvcywgInN0YXQiKToKLSAgICAgICAgICAgIHJldHVybgotCiAgICAgICAgIGltcG9ydCBzdGF0CiAgICAgICAgIHJlc3VsdCA9IG9zLnN0YXQoc2VsZi5mbmFtZSkKIApAQCAtMjEzLDMzICsyMTQsMzMgQEAKIAogICAgICAgICB0cnk6CiAgICAgICAgICAgICByZXN1bHRbMjAwXQotICAgICAgICAgICAgc2VsZi5mYWlsKCJObyBleGNlcHRpb24gdGhyb3duIikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiTm8gZXhjZXB0aW9uIHJhaXNlZCIpCiAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgICAgICAgcGFzcwogCiAgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgYXNzaWdubWVudCBmYWlscwogICAgICAgICB0cnk6CiAgICAgICAgICAgICByZXN1bHQuc3RfbW9kZSA9IDEKLSAgICAgICAgICAgIHNlbGYuZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpCisgICAgICAgICAgICBzZWxmLmZhaWwoIk5vIGV4Y2VwdGlvbiByYWlzZWQiKQogICAgICAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IpOgogICAgICAgICAgICAgcGFzcwogCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJlc3VsdC5zdF9yZGV2ID0gMQotICAgICAgICAgICAgc2VsZi5mYWlsKCJObyBleGNlcHRpb24gdGhyb3duIikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiTm8gZXhjZXB0aW9uIHJhaXNlZCIpCiAgICAgICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFR5cGVFcnJvcik6CiAgICAgICAgICAgICBwYXNzCiAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgcmVzdWx0LnBhcnJvdCA9IDEKLSAgICAgICAgICAgIHNlbGYuZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpCisgICAgICAgICAgICBzZWxmLmZhaWwoIk5vIGV4Y2VwdGlvbiByYWlzZWQiKQogICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICBwYXNzCiAKICAgICAgICAgIyBVc2UgdGhlIHN0YXRfcmVzdWx0IGNvbnN0cnVjdG9yIHdpdGggYSB0b28tc2hvcnQgdHVwbGUuCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJlc3VsdDIgPSBvcy5zdGF0X3Jlc3VsdCgoMTAsKSkKLSAgICAgICAgICAgIHNlbGYuZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpCisgICAgICAgICAgICBzZWxmLmZhaWwoIk5vIGV4Y2VwdGlvbiByYWlzZWQiKQogICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAgcGFzcwogCkBAIC0yNTAsMTYgKzI1MSwxNCBAQAogICAgICAgICAgICAgcGFzcwogCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAnc3RhdHZmcycpLCAndGVzdCBuZWVkcyBvcy5zdGF0dmZzKCknKQogICAgIGRlZiB0ZXN0X3N0YXR2ZnNfYXR0cmlidXRlcyhzZWxmKToKLSAgICAgICAgaWYgbm90IGhhc2F0dHIob3MsICJzdGF0dmZzIik6Ci0gICAgICAgICAgICByZXR1cm4KLQogICAgICAgICB0cnk6CiAgICAgICAgICAgICByZXN1bHQgPSBvcy5zdGF0dmZzKHNlbGYuZm5hbWUpCiAgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgogICAgICAgICAgICAgIyBPbiBBdGhlT1MsIGdsaWJjIGFsd2F5cyByZXR1cm5zIEVOT1NZUwogICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FTk9TWVM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgnZ2xpYmMgYWx3YXlzIHJldHVybnMgRU5PU1lTIG9uIEF0aGVPUycpCiAKICAgICAgICAgIyBNYWtlIHN1cmUgZGlyZWN0IGFjY2VzcyB3b3JrcwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5mX2JmcmVlLCByZXN1bHRbM10pCkBAIC0yNzMsMjAgKzI3MiwyMCBAQAogICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IGFzc2lnbm1lbnQgcmVhbGx5IGZhaWxzCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJlc3VsdC5mX2JmcmVlID0gMQotICAgICAgICAgICAgc2VsZi5mYWlsKCJObyBleGNlcHRpb24gdGhyb3duIikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiTm8gZXhjZXB0aW9uIHJhaXNlZCIpCiAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICBwYXNzCiAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgcmVzdWx0LnBhcnJvdCA9IDEKLSAgICAgICAgICAgIHNlbGYuZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpCisgICAgICAgICAgICBzZWxmLmZhaWwoIk5vIGV4Y2VwdGlvbiByYWlzZWQiKQogICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICBwYXNzCiAKICAgICAgICAgIyBVc2UgdGhlIGNvbnN0cnVjdG9yIHdpdGggYSB0b28tc2hvcnQgdHVwbGUuCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJlc3VsdDIgPSBvcy5zdGF0dmZzX3Jlc3VsdCgoMTAsKSkKLSAgICAgICAgICAgIHNlbGYuZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpCisgICAgICAgICAgICBzZWxmLmZhaWwoIk5vIGV4Y2VwdGlvbiByYWlzZWQiKQogICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAgcGFzcwogCkBAIC0zMDUsMTAgKzMwNCwxMCBAQAogICAgICAgICBzdDIgPSBvcy5zdGF0KHRlc3Rfc3VwcG9ydC5URVNURk4pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3QyLnN0X210aW1lLCBpbnQoc3Quc3RfbXRpbWUtZGVsdGEpKQogCi0gICAgIyBSZXN0cmljdCB0ZXN0IHRvIFdpbjMyLCBzaW5jZSB0aGVyZSBpcyBubyBndWFyYW50ZWUgb3RoZXIKKyAgICAjIFJlc3RyaWN0IHRlc3RzIHRvIFdpbjMyLCBzaW5jZSB0aGVyZSBpcyBubyBndWFyYW50ZWUgb3RoZXIKICAgICAjIHN5c3RlbXMgc3VwcG9ydCBjZW50aXNlY29uZHMKLSAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKLSAgICAgICAgZGVmIGdldF9maWxlX3N5c3RlbShwYXRoKToKKyAgICBkZWYgZ2V0X2ZpbGVfc3lzdGVtKHBhdGgpOgorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKICAgICAgICAgICAgIHJvb3QgPSBvcy5wYXRoLnNwbGl0ZHJpdmUob3MucGF0aC5hYnNwYXRoKHBhdGgpKVswXSArICdcXCcKICAgICAgICAgICAgIGltcG9ydCBjdHlwZXMKICAgICAgICAgICAgIGtlcm5lbDMyID0gY3R5cGVzLndpbmRsbC5rZXJuZWwzMgpAQCAtMzE2LDI1ICszMTUsMzEgQEAKICAgICAgICAgICAgIGlmIGtlcm5lbDMyLkdldFZvbHVtZUluZm9ybWF0aW9uQShyb290LCBOb25lLCAwLCBOb25lLCBOb25lLCBOb25lLCBidWYsIGxlbihidWYpKToKICAgICAgICAgICAgICAgICByZXR1cm4gYnVmLnZhbHVlCiAKLSAgICAgICAgaWYgZ2V0X2ZpbGVfc3lzdGVtKHRlc3Rfc3VwcG9ydC5URVNURk4pID09ICJOVEZTIjoKLSAgICAgICAgICAgIGRlZiB0ZXN0XzE1NjUxNTAoc2VsZik6Ci0gICAgICAgICAgICAgICAgdDEgPSAxMTU5MTk1MDM5LjI1Ci0gICAgICAgICAgICAgICAgb3MudXRpbWUoc2VsZi5mbmFtZSwgKHQxLCB0MSkpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5zdGF0KHNlbGYuZm5hbWUpLnN0X210aW1lLCB0MSkKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwgIldpbjMyIHNwZWNpZmljIHRlc3RzIikKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhnZXRfZmlsZV9zeXN0ZW0odGVzdF9zdXBwb3J0LlRFU1RGTikgPT0gIk5URlMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlcyBOVEZTIikKKyAgICBkZWYgdGVzdF8xNTY1MTUwKHNlbGYpOgorICAgICAgICB0MSA9IDExNTkxOTUwMzkuMjUKKyAgICAgICAgb3MudXRpbWUoc2VsZi5mbmFtZSwgKHQxLCB0MSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Muc3RhdChzZWxmLmZuYW1lKS5zdF9tdGltZSwgdDEpCiAKLSAgICAgICAgICAgIGRlZiB0ZXN0X2xhcmdlX3RpbWUoc2VsZik6Ci0gICAgICAgICAgICAgICAgdDEgPSA1MDAwMDAwMDAwICMgc29tZSBkYXkgaW4gMjEyOAotICAgICAgICAgICAgICAgIG9zLnV0aW1lKHNlbGYuZm5hbWUsICh0MSwgdDEpKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Muc3RhdChzZWxmLmZuYW1lKS5zdF9tdGltZSwgdDEpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIsICJXaW4zMiBzcGVjaWZpYyB0ZXN0cyIpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoZ2V0X2ZpbGVfc3lzdGVtKHRlc3Rfc3VwcG9ydC5URVNURk4pID09ICJOVEZTIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZXMgTlRGUyIpCisgICAgZGVmIHRlc3RfbGFyZ2VfdGltZShzZWxmKToKKyAgICAgICAgdDEgPSA1MDAwMDAwMDAwICMgc29tZSBkYXkgaW4gMjEyOAorICAgICAgICBvcy51dGltZShzZWxmLmZuYW1lLCAodDEsIHQxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5zdGF0KHNlbGYuZm5hbWUpLnN0X210aW1lLCB0MSkKIAotICAgICAgICBkZWYgdGVzdF8xNjg2NDc1KHNlbGYpOgotICAgICAgICAgICAgIyBWZXJpZnkgdGhhdCBhbiBvcGVuIGZpbGUgY2FuIGJlIHN0YXQnZWQKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBvcy5zdGF0KHIiYzpccGFnZWZpbGUuc3lzIikKLSAgICAgICAgICAgIGV4Y2VwdCBXaW5kb3dzRXJyb3IsIGU6Ci0gICAgICAgICAgICAgICAgaWYgZS5lcnJubyA9PSAyOiAjIGZpbGUgZG9lcyBub3QgZXhpc3Q7IGNhbm5vdCBydW4gdGVzdAotICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkNvdWxkIG5vdCBzdGF0IHBhZ2VmaWxlLnN5cyIpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIsICJXaW4zMiBzcGVjaWZpYyB0ZXN0cyIpCisgICAgZGVmIHRlc3RfMTY4NjQ3NShzZWxmKToKKyAgICAgICAgIyBWZXJpZnkgdGhhdCBhbiBvcGVuIGZpbGUgY2FuIGJlIHN0YXQnZWQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3Muc3RhdChyImM6XHBhZ2VmaWxlLnN5cyIpCisgICAgICAgIGV4Y2VwdCBXaW5kb3dzRXJyb3IsIGU6CisgICAgICAgICAgICBpZiBlLmVycm5vID09IDI6ICMgZmlsZSBkb2VzIG5vdCBleGlzdDsgY2Fubm90IHJ1biB0ZXN0CisgICAgICAgICAgICAgICAgc2VsZi5za2lwVGVzdChyJ2M6XHBhZ2VmaWxlLnN5cyBkb2VzIG5vdCBleGlzdCcpCisgICAgICAgICAgICBzZWxmLmZhaWwoIkNvdWxkIG5vdCBzdGF0IHBhZ2VmaWxlLnN5cyIpCiAKIGZyb20gdGVzdCBpbXBvcnQgbWFwcGluZ190ZXN0cwogCkBAIC01MjYsMjIgKzUzMSw3MyBAQAogICAgICAgICBmLmNsb3NlKCkKIAogY2xhc3MgVVJhbmRvbVRlc3RzICh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgZGVmIHRlc3RfdXJhbmRvbShzZWxmKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ob3MudXJhbmRvbSgxKSksIDEpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihvcy51cmFuZG9tKDEwKSksIDEwKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ob3MudXJhbmRvbSgxMDApKSwgMTAwKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ob3MudXJhbmRvbSgxMDAwKSksIDEwMDApCi0gICAgICAgICAgICAjIHNlZSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMzcwOAotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcy51cmFuZG9tLCAwLjkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9zLnVyYW5kb20sIDEuMSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3MudXJhbmRvbSwgMi4wKQotICAgICAgICBleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X3VyYW5kb21fbGVuZ3RoKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihvcy51cmFuZG9tKDApKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ob3MudXJhbmRvbSgxKSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG9zLnVyYW5kb20oMTApKSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG9zLnVyYW5kb20oMTAwKSksIDEwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ob3MudXJhbmRvbSgxMDAwKSksIDEwMDApCisKKyAgICBkZWYgdGVzdF91cmFuZG9tX3ZhbHVlKHNlbGYpOgorICAgICAgICBkYXRhMSA9IG9zLnVyYW5kb20oMTYpCisgICAgICAgIGRhdGEyID0gb3MudXJhbmRvbSgxNikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChkYXRhMSwgZGF0YTIpCisKKyAgICBkZWYgZ2V0X3VyYW5kb21fc3VicHJvY2VzcyhzZWxmLCBjb3VudCk6CisgICAgICAgICMgV2UgbmVlZCB0byB1c2UgcmVwcigpIGFuZCBldmFsKCkgdG8gYXZvaWQgbGluZSBlbmRpbmcgY29udmVyc2lvbnMKKyAgICAgICAgIyB1bmRlciBXaW5kb3dzLgorICAgICAgICBjb2RlID0gJ1xuJy5qb2luKCgKKyAgICAgICAgICAgICdpbXBvcnQgb3MsIHN5cycsCisgICAgICAgICAgICAnZGF0YSA9IG9zLnVyYW5kb20oJXMpJyAlIGNvdW50LAorICAgICAgICAgICAgJ3N5cy5zdGRvdXQud3JpdGUocmVwcihkYXRhKSknLAorICAgICAgICAgICAgJ3N5cy5zdGRvdXQuZmx1c2goKScsCisgICAgICAgICAgICAncHJpbnQgPj4gc3lzLnN0ZGVyciwgKGxlbihkYXRhKSwgZGF0YSknKSkKKyAgICAgICAgY21kX2xpbmUgPSBbc3lzLmV4ZWN1dGFibGUsICctYycsIGNvZGVdCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZF9saW5lLCBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIG91dCwgZXJyID0gcC5jb21tdW5pY2F0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC53YWl0KCksIDAsIChwLndhaXQoKSwgZXJyKSkKKyAgICAgICAgb3V0ID0gZXZhbChvdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG91dCksIGNvdW50LCBlcnIpCisgICAgICAgIHJldHVybiBvdXQKKworICAgIGRlZiB0ZXN0X3VyYW5kb21fc3VicHJvY2VzcyhzZWxmKToKKyAgICAgICAgZGF0YTEgPSBzZWxmLmdldF91cmFuZG9tX3N1YnByb2Nlc3MoMTYpCisgICAgICAgIGRhdGEyID0gc2VsZi5nZXRfdXJhbmRvbV9zdWJwcm9jZXNzKDE2KQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGRhdGExLCBkYXRhMikKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHJlc291cmNlLCAidGVzdCByZXF1aXJlcyB0aGUgcmVzb3VyY2UgbW9kdWxlIikKKyAgICBkZWYgdGVzdF91cmFuZG9tX2ZhaWx1cmUoc2VsZik6CisgICAgICAgICMgQ2hlY2sgdXJhbmRvbSgpIGZhaWxpbmcgd2hlbiBpdCBpcyBub3QgYWJsZSB0byBvcGVuIC9kZXYvcmFuZG9tLgorICAgICAgICAjIFdlIHNwYXduIGEgbmV3IHByb2Nlc3MgdG8gbWFrZSB0aGUgdGVzdCBtb3JlIHJvYnVzdCAoaWYgZ2V0cmxpbWl0KCkKKyAgICAgICAgIyBmYWlsZWQgdG8gcmVzdG9yZSB0aGUgZmlsZSBkZXNjcmlwdG9yIGxpbWl0IGFmdGVyIHRoaXMsIHRoZSB3aG9sZQorICAgICAgICAjIHRlc3Qgc3VpdGUgd291bGQgY3Jhc2g7IHRoaXMgYWN0dWFsbHkgaGFwcGVuZWQgb24gdGhlIE9TIFggVGlnZXIKKyAgICAgICAgIyBidWlsZGJvdCkuCisgICAgICAgIGNvZGUgPSAiIiJpZiAxOgorICAgICAgICAgICAgaW1wb3J0IGVycm5vCisgICAgICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgICAgIGltcG9ydCByZXNvdXJjZQorCisgICAgICAgICAgICBzb2Z0X2xpbWl0LCBoYXJkX2xpbWl0ID0gcmVzb3VyY2UuZ2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9OT0ZJTEUpCisgICAgICAgICAgICByZXNvdXJjZS5zZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX05PRklMRSwgKDEsIGhhcmRfbGltaXQpKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLnVyYW5kb20oMTYpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgIGFzc2VydCBlLmVycm5vID09IGVycm5vLkVNRklMRSwgZS5lcnJubworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiT1NFcnJvciBub3QgcmFpc2VkIikKKyAgICAgICAgICAgICIiIgorICAgICAgICBhc3NlcnRfcHl0aG9uX29rKCctYycsIGNvZGUpCisKKworY2xhc3MgRXhlY3ZwZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X2V4ZWN2cGVfd2l0aF9iYWRfYXJnbGlzdChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgb3MuZXhlY3ZwZSwgJ25vdGVwYWQnLCBbXSwgTm9uZSkKIAorCitAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwgIldpbjMyIHNwZWNpZmljIHRlc3RzIikKIGNsYXNzIFdpbjMyRXJyb3JUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfcmVuYW1lKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhXaW5kb3dzRXJyb3IsIG9zLnJlbmFtZSwgdGVzdF9zdXBwb3J0LlRFU1RGTiwgdGVzdF9zdXBwb3J0LlRFU1RGTisiLmJhayIpCkBAIC01ODgsMTIxICs2NDQsMTE4IEBACiAgICAgICAgICAgICBzZWxmLmZhaWwoIiVyIGRpZG4ndCByYWlzZSBhIE9TRXJyb3Igd2l0aCBhIGJhZCBmaWxlIGRlc2NyaXB0b3IiCiAgICAgICAgICAgICAgICAgICAgICAgJSBmKQogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2lzYXR0eScpLCAndGVzdCBuZWVkcyBvcy5pc2F0dHkoKScpCiAgICAgZGVmIHRlc3RfaXNhdHR5KHNlbGYpOgotICAgICAgICBpZiBoYXNhdHRyKG9zLCAiaXNhdHR5Iik6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLmlzYXR0eSh0ZXN0X3N1cHBvcnQubWFrZV9iYWRfZmQoKSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLmlzYXR0eSh0ZXN0X3N1cHBvcnQubWFrZV9iYWRfZmQoKSksIEZhbHNlKQogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2Nsb3NlcmFuZ2UnKSwgJ3Rlc3QgbmVlZHMgb3MuY2xvc2VyYW5nZSgpJykKICAgICBkZWYgdGVzdF9jbG9zZXJhbmdlKHNlbGYpOgotICAgICAgICBpZiBoYXNhdHRyKG9zLCAiY2xvc2VyYW5nZSIpOgotICAgICAgICAgICAgZmQgPSB0ZXN0X3N1cHBvcnQubWFrZV9iYWRfZmQoKQotICAgICAgICAgICAgIyBNYWtlIHN1cmUgbm9uZSBvZiB0aGUgZGVzY3JpcHRvcnMgd2UgYXJlIGFib3V0IHRvIGNsb3NlIGFyZQotICAgICAgICAgICAgIyBjdXJyZW50bHkgdmFsaWQgKGlzc3VlIDY1NDIpLgotICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgotICAgICAgICAgICAgICAgIHRyeTogb3MuZnN0YXQoZmQraSkKLSAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBpZiBpIDwgMjoKLSAgICAgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgKLSAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBhY3F1aXJlIGEgcmFuZ2Ugb2YgaW52YWxpZCBmaWxlIGRlc2NyaXB0b3JzIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MuY2xvc2VyYW5nZShmZCwgZmQgKyBpLTEpLCBOb25lKQorICAgICAgICBmZCA9IHRlc3Rfc3VwcG9ydC5tYWtlX2JhZF9mZCgpCisgICAgICAgICMgTWFrZSBzdXJlIG5vbmUgb2YgdGhlIGRlc2NyaXB0b3JzIHdlIGFyZSBhYm91dCB0byBjbG9zZSBhcmUKKyAgICAgICAgIyBjdXJyZW50bHkgdmFsaWQgKGlzc3VlIDY1NDIpLgorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICB0cnk6IG9zLmZzdGF0KGZkK2kpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIGkgPCAyOgorICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoCisgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBhY3F1aXJlIGEgcmFuZ2Ugb2YgaW52YWxpZCBmaWxlIGRlc2NyaXB0b3JzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5jbG9zZXJhbmdlKGZkLCBmZCArIGktMSksIE5vbmUpCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAnZHVwMicpLCAndGVzdCBuZWVkcyBvcy5kdXAyKCknKQogICAgIGRlZiB0ZXN0X2R1cDIoc2VsZik6Ci0gICAgICAgIGlmIGhhc2F0dHIob3MsICJkdXAyIik6Ci0gICAgICAgICAgICBzZWxmLmNoZWNrKG9zLmR1cDIsIDIwKQorICAgICAgICBzZWxmLmNoZWNrKG9zLmR1cDIsIDIwKQogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2ZjaG1vZCcpLCAndGVzdCBuZWVkcyBvcy5mY2htb2QoKScpCiAgICAgZGVmIHRlc3RfZmNobW9kKHNlbGYpOgotICAgICAgICBpZiBoYXNhdHRyKG9zLCAiZmNobW9kIik6Ci0gICAgICAgICAgICBzZWxmLmNoZWNrKG9zLmZjaG1vZCwgMCkKKyAgICAgICAgc2VsZi5jaGVjayhvcy5mY2htb2QsIDApCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAnZmNob3duJyksICd0ZXN0IG5lZWRzIG9zLmZjaG93bigpJykKICAgICBkZWYgdGVzdF9mY2hvd24oc2VsZik6Ci0gICAgICAgIGlmIGhhc2F0dHIob3MsICJmY2hvd24iKToKLSAgICAgICAgICAgIHNlbGYuY2hlY2sob3MuZmNob3duLCAtMSwgLTEpCisgICAgICAgIHNlbGYuY2hlY2sob3MuZmNob3duLCAtMSwgLTEpCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAnZnBhdGhjb25mJyksICd0ZXN0IG5lZWRzIG9zLmZwYXRoY29uZigpJykKICAgICBkZWYgdGVzdF9mcGF0aGNvbmYoc2VsZik6Ci0gICAgICAgIGlmIGhhc2F0dHIob3MsICJmcGF0aGNvbmYiKToKLSAgICAgICAgICAgIHNlbGYuY2hlY2sob3MuZnBhdGhjb25mLCAiUENfTkFNRV9NQVgiKQorICAgICAgICBzZWxmLmNoZWNrKG9zLmZwYXRoY29uZiwgIlBDX05BTUVfTUFYIikKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdmdHJ1bmNhdGUnKSwgJ3Rlc3QgbmVlZHMgb3MuZnRydW5jYXRlKCknKQogICAgIGRlZiB0ZXN0X2Z0cnVuY2F0ZShzZWxmKToKLSAgICAgICAgaWYgaGFzYXR0cihvcywgImZ0cnVuY2F0ZSIpOgotICAgICAgICAgICAgc2VsZi5jaGVjayhvcy5mdHJ1bmNhdGUsIDApCisgICAgICAgIHNlbGYuY2hlY2sob3MuZnRydW5jYXRlLCAwKQogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2xzZWVrJyksICd0ZXN0IG5lZWRzIG9zLmxzZWVrKCknKQogICAgIGRlZiB0ZXN0X2xzZWVrKHNlbGYpOgotICAgICAgICBpZiBoYXNhdHRyKG9zLCAibHNlZWsiKToKLSAgICAgICAgICAgIHNlbGYuY2hlY2sob3MubHNlZWssIDAsIDApCisgICAgICAgIHNlbGYuY2hlY2sob3MubHNlZWssIDAsIDApCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAncmVhZCcpLCAndGVzdCBuZWVkcyBvcy5yZWFkKCknKQogICAgIGRlZiB0ZXN0X3JlYWQoc2VsZik6Ci0gICAgICAgIGlmIGhhc2F0dHIob3MsICJyZWFkIik6Ci0gICAgICAgICAgICBzZWxmLmNoZWNrKG9zLnJlYWQsIDEpCisgICAgICAgIHNlbGYuY2hlY2sob3MucmVhZCwgMSkKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICd0Y3NldHBncnAnKSwgJ3Rlc3QgbmVlZHMgb3MudGNzZXRwZ3JwKCknKQogICAgIGRlZiB0ZXN0X3Rjc2V0cGdycHQoc2VsZik6Ci0gICAgICAgIGlmIGhhc2F0dHIob3MsICJ0Y3NldHBncnAiKToKLSAgICAgICAgICAgIHNlbGYuY2hlY2sob3MudGNzZXRwZ3JwLCAwKQorICAgICAgICBzZWxmLmNoZWNrKG9zLnRjc2V0cGdycCwgMCkKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICd3cml0ZScpLCAndGVzdCBuZWVkcyBvcy53cml0ZSgpJykKICAgICBkZWYgdGVzdF93cml0ZShzZWxmKToKLSAgICAgICAgaWYgaGFzYXR0cihvcywgIndyaXRlIik6Ci0gICAgICAgICAgICBzZWxmLmNoZWNrKG9zLndyaXRlLCAiICIpCisgICAgICAgIHNlbGYuY2hlY2sob3Mud3JpdGUsICIgIikKIAotaWYgc3lzLnBsYXRmb3JtICE9ICd3aW4zMic6Ci0gICAgY2xhc3MgV2luMzJFcnJvclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICAgICAgcGFzcworQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwgIlBvc2l4IHNwZWNpZmljIHRlc3RzIikKK2NsYXNzIFBvc2l4VWlkR2lkVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdzZXR1aWQnKSwgJ3Rlc3QgbmVlZHMgb3Muc2V0dWlkKCknKQorICAgIGRlZiB0ZXN0X3NldHVpZChzZWxmKToKKyAgICAgICAgaWYgb3MuZ2V0dWlkKCkgIT0gMDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKG9zLmVycm9yLCBvcy5zZXR1aWQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIG9zLnNldHVpZCwgMTw8MzIpCiAKLSAgICBjbGFzcyBQb3NpeFVpZEdpZFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICAgICAgaWYgaGFzYXR0cihvcywgJ3NldHVpZCcpOgotICAgICAgICAgICAgZGVmIHRlc3Rfc2V0dWlkKHNlbGYpOgotICAgICAgICAgICAgICAgIGlmIG9zLmdldHVpZCgpICE9IDA6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKG9zLmVycm9yLCBvcy5zZXR1aWQsIDApCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgb3Muc2V0dWlkLCAxPDwzMikKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAnc2V0Z2lkJyksICd0ZXN0IG5lZWRzIG9zLnNldGdpZCgpJykKKyAgICBkZWYgdGVzdF9zZXRnaWQoc2VsZik6CisgICAgICAgIGlmIG9zLmdldHVpZCgpICE9IDA6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhvcy5lcnJvciwgb3Muc2V0Z2lkLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBvcy5zZXRnaWQsIDE8PDMyKQogCi0gICAgICAgIGlmIGhhc2F0dHIob3MsICdzZXRnaWQnKToKLSAgICAgICAgICAgIGRlZiB0ZXN0X3NldGdpZChzZWxmKToKLSAgICAgICAgICAgICAgICBpZiBvcy5nZXR1aWQoKSAhPSAwOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhvcy5lcnJvciwgb3Muc2V0Z2lkLCAwKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIG9zLnNldGdpZCwgMTw8MzIpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ3NldGV1aWQnKSwgJ3Rlc3QgbmVlZHMgb3Muc2V0ZXVpZCgpJykKKyAgICBkZWYgdGVzdF9zZXRldWlkKHNlbGYpOgorICAgICAgICBpZiBvcy5nZXR1aWQoKSAhPSAwOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMob3MuZXJyb3IsIG9zLnNldGV1aWQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIG9zLnNldGV1aWQsIDE8PDMyKQogCi0gICAgICAgIGlmIGhhc2F0dHIob3MsICdzZXRldWlkJyk6Ci0gICAgICAgICAgICBkZWYgdGVzdF9zZXRldWlkKHNlbGYpOgotICAgICAgICAgICAgICAgIGlmIG9zLmdldHVpZCgpICE9IDA6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKG9zLmVycm9yLCBvcy5zZXRldWlkLCAwKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIG9zLnNldGV1aWQsIDE8PDMyKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdzZXRlZ2lkJyksICd0ZXN0IG5lZWRzIG9zLnNldGVnaWQoKScpCisgICAgZGVmIHRlc3Rfc2V0ZWdpZChzZWxmKToKKyAgICAgICAgaWYgb3MuZ2V0dWlkKCkgIT0gMDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKG9zLmVycm9yLCBvcy5zZXRlZ2lkLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBvcy5zZXRlZ2lkLCAxPDwzMikKIAotICAgICAgICBpZiBoYXNhdHRyKG9zLCAnc2V0ZWdpZCcpOgotICAgICAgICAgICAgZGVmIHRlc3Rfc2V0ZWdpZChzZWxmKToKLSAgICAgICAgICAgICAgICBpZiBvcy5nZXR1aWQoKSAhPSAwOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhvcy5lcnJvciwgb3Muc2V0ZWdpZCwgMCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBvcy5zZXRlZ2lkLCAxPDwzMikKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAnc2V0cmV1aWQnKSwgJ3Rlc3QgbmVlZHMgb3Muc2V0cmV1aWQoKScpCisgICAgZGVmIHRlc3Rfc2V0cmV1aWQoc2VsZik6CisgICAgICAgIGlmIG9zLmdldHVpZCgpICE9IDA6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhvcy5lcnJvciwgb3Muc2V0cmV1aWQsIDAsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIG9zLnNldHJldWlkLCAxPDwzMiwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgb3Muc2V0cmV1aWQsIDAsIDE8PDMyKQogCi0gICAgICAgIGlmIGhhc2F0dHIob3MsICdzZXRyZXVpZCcpOgotICAgICAgICAgICAgZGVmIHRlc3Rfc2V0cmV1aWQoc2VsZik6Ci0gICAgICAgICAgICAgICAgaWYgb3MuZ2V0dWlkKCkgIT0gMDoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMob3MuZXJyb3IsIG9zLnNldHJldWlkLCAwLCAwKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIG9zLnNldHJldWlkLCAxPDwzMiwgMCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBvcy5zZXRyZXVpZCwgMCwgMTw8MzIpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ3NldHJldWlkJyksICd0ZXN0IG5lZWRzIG9zLnNldHJldWlkKCknKQorICAgIGRlZiB0ZXN0X3NldHJldWlkX25lZzEoc2VsZik6CisgICAgICAgICMgTmVlZHMgdG8gYWNjZXB0IC0xLiAgV2UgcnVuIHRoaXMgaW4gYSBzdWJwcm9jZXNzIHRvIGF2b2lkCisgICAgICAgICMgYWx0ZXJpbmcgdGhlIHRlc3QgcnVubmVyJ3MgcHJvY2VzcyBzdGF0ZSAoaXNzdWU4MDQ1KS4KKyAgICAgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKFsKKyAgICAgICAgICAgICAgICBzeXMuZXhlY3V0YWJsZSwgJy1jJywKKyAgICAgICAgICAgICAgICAnaW1wb3J0IG9zLHN5cztvcy5zZXRyZXVpZCgtMSwtMSk7c3lzLmV4aXQoMCknXSkKIAotICAgICAgICAgICAgZGVmIHRlc3Rfc2V0cmV1aWRfbmVnMShzZWxmKToKLSAgICAgICAgICAgICAgICAjIE5lZWRzIHRvIGFjY2VwdCAtMS4gIFdlIHJ1biB0aGlzIGluIGEgc3VicHJvY2VzcyB0byBhdm9pZAotICAgICAgICAgICAgICAgICMgYWx0ZXJpbmcgdGhlIHRlc3QgcnVubmVyJ3MgcHJvY2VzcyBzdGF0ZSAoaXNzdWU4MDQ1KS4KLSAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoWwotICAgICAgICAgICAgICAgICAgICAgICAgc3lzLmV4ZWN1dGFibGUsICctYycsCi0gICAgICAgICAgICAgICAgICAgICAgICAnaW1wb3J0IG9zLHN5cztvcy5zZXRyZXVpZCgtMSwtMSk7c3lzLmV4aXQoMCknXSkKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAnc2V0cmVnaWQnKSwgJ3Rlc3QgbmVlZHMgb3Muc2V0cmVnaWQoKScpCisgICAgZGVmIHRlc3Rfc2V0cmVnaWQoc2VsZik6CisgICAgICAgIGlmIG9zLmdldHVpZCgpICE9IDA6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhvcy5lcnJvciwgb3Muc2V0cmVnaWQsIDAsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIG9zLnNldHJlZ2lkLCAxPDwzMiwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgb3Muc2V0cmVnaWQsIDAsIDE8PDMyKQogCi0gICAgICAgIGlmIGhhc2F0dHIob3MsICdzZXRyZWdpZCcpOgotICAgICAgICAgICAgZGVmIHRlc3Rfc2V0cmVnaWQoc2VsZik6Ci0gICAgICAgICAgICAgICAgaWYgb3MuZ2V0dWlkKCkgIT0gMDoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMob3MuZXJyb3IsIG9zLnNldHJlZ2lkLCAwLCAwKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIG9zLnNldHJlZ2lkLCAxPDwzMiwgMCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBvcy5zZXRyZWdpZCwgMCwgMTw8MzIpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ3NldHJlZ2lkJyksICd0ZXN0IG5lZWRzIG9zLnNldHJlZ2lkKCknKQorICAgIGRlZiB0ZXN0X3NldHJlZ2lkX25lZzEoc2VsZik6CisgICAgICAgICMgTmVlZHMgdG8gYWNjZXB0IC0xLiAgV2UgcnVuIHRoaXMgaW4gYSBzdWJwcm9jZXNzIHRvIGF2b2lkCisgICAgICAgICMgYWx0ZXJpbmcgdGhlIHRlc3QgcnVubmVyJ3MgcHJvY2VzcyBzdGF0ZSAoaXNzdWU4MDQ1KS4KKyAgICAgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKFsKKyAgICAgICAgICAgICAgICBzeXMuZXhlY3V0YWJsZSwgJy1jJywKKyAgICAgICAgICAgICAgICAnaW1wb3J0IG9zLHN5cztvcy5zZXRyZWdpZCgtMSwtMSk7c3lzLmV4aXQoMCknXSkKIAotICAgICAgICAgICAgZGVmIHRlc3Rfc2V0cmVnaWRfbmVnMShzZWxmKToKLSAgICAgICAgICAgICAgICAjIE5lZWRzIHRvIGFjY2VwdCAtMS4gIFdlIHJ1biB0aGlzIGluIGEgc3VicHJvY2VzcyB0byBhdm9pZAotICAgICAgICAgICAgICAgICMgYWx0ZXJpbmcgdGhlIHRlc3QgcnVubmVyJ3MgcHJvY2VzcyBzdGF0ZSAoaXNzdWU4MDQ1KS4KLSAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoWwotICAgICAgICAgICAgICAgICAgICAgICAgc3lzLmV4ZWN1dGFibGUsICctYycsCi0gICAgICAgICAgICAgICAgICAgICAgICAnaW1wb3J0IG9zLHN5cztvcy5zZXRyZWdpZCgtMSwtMSk7c3lzLmV4aXQoMCknXSkKLWVsc2U6Ci0gICAgY2xhc3MgUG9zaXhVaWRHaWRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgICAgIHBhc3MKIAogQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIsICJXaW4zMiBzcGVjaWZpYyB0ZXN0cyIpCiBjbGFzcyBXaW4zMktpbGxUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC04MjgsNiArODgxLDcgQEAKICAgICAgICAgTWFrZWRpclRlc3RzLAogICAgICAgICBEZXZOdWxsVGVzdHMsCiAgICAgICAgIFVSYW5kb21UZXN0cywKKyAgICAgICAgRXhlY3ZwZVRlc3RzLAogICAgICAgICBXaW4zMkVycm9yVGVzdHMsCiAgICAgICAgIFRlc3RJbnZhbGlkRkQsCiAgICAgICAgIFBvc2l4VWlkR2lkVGVzdHMsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BhcnNlci5weSBiL0xpYi90ZXN0L3Rlc3RfcGFyc2VyLnB5CmluZGV4IDMzYjkxYmQuLjY1YTc2MmMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGFyc2VyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGFyc2VyLnB5CkBAIC0xLDcgKzEsOSBAQAogaW1wb3J0IHBhcnNlcgogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgc3lzCi1mcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IHN0cnVjdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQgYXMgc3VwcG9ydAorZnJvbSB0ZXN0LnNjcmlwdF9oZWxwZXIgaW1wb3J0IGFzc2VydF9weXRob25fZmFpbHVyZQogCiAjCiAjICBGaXJzdCwgd2UgdGVzdCB0aGF0IHdlIGNhbiBnZW5lcmF0ZSB0cmVlcyBmcm9tIHZhbGlkIHNvdXJjZSBmcmFnbWVudHMsCkBAIC01NjYsOCArNTY4LDE5IEBACiAgICAgICAgIHN0ID0gcGFyc2VyLnN1aXRlKCdhID0gdSJcdTEiJykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIHBhcnNlci5jb21waWxlc3QsIHN0KQogCisgICAgZGVmIHRlc3RfaXNzdWVfOTAxMShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSA5MDExOiBjb21waWxhdGlvbiBvZiBhbiB1bmFyeSBtaW51cyBleHByZXNzaW9uIGNoYW5nZWQKKyAgICAgICAgIyB0aGUgbWVhbmluZyBvZiB0aGUgU1QsIHNvIHRoYXQgYSBzZWNvbmQgY29tcGlsYXRpb24gcHJvZHVjZWQKKyAgICAgICAgIyBpbmNvcnJlY3QgcmVzdWx0cy4KKyAgICAgICAgc3QgPSBwYXJzZXIuZXhwcignLTMnKQorICAgICAgICBjb2RlMSA9IHBhcnNlci5jb21waWxlc3Qoc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChjb2RlMSksIC0zKQorICAgICAgICBjb2RlMiA9IHBhcnNlci5jb21waWxlc3Qoc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChjb2RlMiksIC0zKQorCisKIGNsYXNzIFBhcnNlclN0YWNrTGltaXRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgIiIidHJ5IHRvIHB1c2ggdGhlIHBhcnNlciB0by9vdmVyIGl0J3MgbGltaXRzLgorICAgICIiInRyeSB0byBwdXNoIHRoZSBwYXJzZXIgdG8vb3ZlciBpdHMgbGltaXRzLgogICAgIHNlZSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTg4MSBmb3IgYSBkaXNjdXNzaW9uCiAgICAgIiIiCiAgICAgZGVmIF9uZXN0ZWRfZXhwcmVzc2lvbihzZWxmLCBsZXZlbCk6CkBAIC01ODAsMTUgKzU5Myw2MyBAQAogCiAgICAgZGVmIHRlc3RfdHJpZ2dlcl9tZW1vcnlfZXJyb3Ioc2VsZik6CiAgICAgICAgIGUgPSBzZWxmLl9uZXN0ZWRfZXhwcmVzc2lvbigxMDApCi0gICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIkV4cGVjdGluZyAnc19wdXNoOiBwYXJzZXIgc3RhY2sgb3ZlcmZsb3cnIGluIG5leHQgbGluZSIKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTWVtb3J5RXJyb3IsIHBhcnNlci5leHByLCBlKQorICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX2ZhaWx1cmUoJy1jJywgZSkKKyAgICAgICAgIyBwYXJzaW5nIHRoZSBleHByZXNzaW9uIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yIG1lc3NhZ2UKKyAgICAgICAgIyBmb2xsb3dlZCBieSBhIE1lbW9yeUVycm9yIChzZWUgIzExOTYzKQorICAgICAgICBzZWxmLmFzc2VydEluKGInc19wdXNoOiBwYXJzZXIgc3RhY2sgb3ZlcmZsb3cnLCBlcnIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oYidNZW1vcnlFcnJvcicsIGVycikKKworY2xhc3MgU1RPYmplY3RUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBvcGVyYXRpb25zIG9uIFNUIG9iamVjdHMgdGhlbXNlbHZlcyIiIgorCisgICAgY2hlY2tfc2l6ZW9mID0gc3VwcG9ydC5jaGVja19zaXplb2YKKworICAgIEBzdXBwb3J0LmNweXRob25fb25seQorICAgIGRlZiB0ZXN0X3NpemVvZihzZWxmKToKKyAgICAgICAgZGVmIFhYWFJPVU5EVVAobik6CisgICAgICAgICAgICBpZiBuIDw9IDE6CisgICAgICAgICAgICAgICAgcmV0dXJuIG4KKyAgICAgICAgICAgIGlmIG4gPD0gMTI4OgorICAgICAgICAgICAgICAgIHJldHVybiAobiArIDMpICYgfjMKKyAgICAgICAgICAgIHJldHVybiAxIDw8IChuIC0gMSkuYml0X2xlbmd0aCgpCisKKyAgICAgICAgYmFzZXNpemUgPSBzdXBwb3J0LmNhbGNvYmpzaXplKCdQaWknKQorICAgICAgICBub2Rlc2l6ZSA9IHN0cnVjdC5jYWxjc2l6ZSgnaFAzaVAwaCcpCisgICAgICAgIGRlZiBzaXplb2ZjaGlsZHJlbihub2RlKToKKyAgICAgICAgICAgIGlmIG5vZGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgcmVzID0gMAorICAgICAgICAgICAgaGFzc3RyID0gbGVuKG5vZGUpID4gMSBhbmQgaXNpbnN0YW5jZShub2RlWy0xXSwgc3RyKQorICAgICAgICAgICAgaWYgaGFzc3RyOgorICAgICAgICAgICAgICAgIHJlcyArPSBsZW4obm9kZVstMV0pICsgMQorICAgICAgICAgICAgY2hpbGRyZW4gPSBub2RlWzE6LTFdIGlmIGhhc3N0ciBlbHNlIG5vZGVbMTpdCisgICAgICAgICAgICBpZiBjaGlsZHJlbjoKKyAgICAgICAgICAgICAgICByZXMgKz0gWFhYUk9VTkRVUChsZW4oY2hpbGRyZW4pKSAqIG5vZGVzaXplCisgICAgICAgICAgICAgICAgZm9yIGNoaWxkIGluIGNoaWxkcmVuOgorICAgICAgICAgICAgICAgICAgICByZXMgKz0gc2l6ZW9mY2hpbGRyZW4oY2hpbGQpCisgICAgICAgICAgICByZXR1cm4gcmVzCisKKyAgICAgICAgZGVmIGNoZWNrX3N0X3NpemVvZihzdCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrX3NpemVvZihzdCwgYmFzZXNpemUgKyBub2Rlc2l6ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mY2hpbGRyZW4oc3QudG90dXBsZSgpKSkKKworICAgICAgICBjaGVja19zdF9zaXplb2YocGFyc2VyLmV4cHIoJzIgKyAzJykpCisgICAgICAgIGNoZWNrX3N0X3NpemVvZihwYXJzZXIuZXhwcignMiArIDMgKyA0JykpCisgICAgICAgIGNoZWNrX3N0X3NpemVvZihwYXJzZXIuc3VpdGUoJ3ggPSAyICsgMycpKQorICAgICAgICBjaGVja19zdF9zaXplb2YocGFyc2VyLnN1aXRlKCcnKSkKKyAgICAgICAgY2hlY2tfc3Rfc2l6ZW9mKHBhcnNlci5zdWl0ZSgnIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0nKSkKKyAgICAgICAgY2hlY2tfc3Rfc2l6ZW9mKHBhcnNlci5leHByKCdbJyArICcyLCcgKiAxMDAwICsgJ10nKSkKKworCisgICAgIyBYWFggdGVzdHMgZm9yIHBpY2tsaW5nIGFuZCB1bnBpY2tsaW5nIG9mIFNUIG9iamVjdHMgc2hvdWxkIGdvIGhlcmUKIAogZGVmIHRlc3RfbWFpbigpOgotICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgc3VwcG9ydC5ydW5fdW5pdHRlc3QoCiAgICAgICAgIFJvdW5kdHJpcExlZ2FsU3ludGF4VGVzdENhc2UsCiAgICAgICAgIElsbGVnYWxTeW50YXhUZXN0Q2FzZSwKICAgICAgICAgQ29tcGlsZVRlc3RDYXNlLAogICAgICAgICBQYXJzZXJTdGFja0xpbWl0VGVzdENhc2UsCisgICAgICAgIFNUT2JqZWN0VGVzdENhc2UsCiAgICAgKQogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGRiLnB5IGIvTGliL3Rlc3QvdGVzdF9wZGIucHkKaW5kZXggNWE5MDkxZi4uNTU5Zjc1NiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wZGIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wZGIucHkKQEAgLTYsMTIgKzYsNjkgQEAKIGltcG9ydCBvcwogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHRleHR3cmFwCiAKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiAjIFRoaXMgbGl0dGxlIGhlbHBlciBjbGFzcyBpcyBlc3NlbnRpYWwgZm9yIHRlc3RpbmcgcGRiIHVuZGVyIGRvY3Rlc3QuCiBmcm9tIHRlc3RfZG9jdGVzdCBpbXBvcnQgX0Zha2VJbnB1dAogCiAKK2NsYXNzIFBkYlRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBydW5fcGRiKHNlbGYsIHNjcmlwdCwgY29tbWFuZHMpOgorICAgICAgICAiIiJSdW4gJ3NjcmlwdCcgbGluZXMgd2l0aCBwZGIgYW5kIHRoZSBwZGIgJ2NvbW1hbmRzJy4iIiIKKyAgICAgICAgZmlsZW5hbWUgPSAnbWFpbi5weScKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAndycpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKHRleHR3cmFwLmRlZGVudChzY3JpcHQpKQorICAgICAgICBzZWxmLmFkZENsZWFudXAodGVzdF9zdXBwb3J0LnVubGluaywgZmlsZW5hbWUpCisgICAgICAgIGNtZCA9IFtzeXMuZXhlY3V0YWJsZSwgJy1tJywgJ3BkYicsIGZpbGVuYW1lXQorICAgICAgICBzdGRvdXQgPSBzdGRlcnIgPSBOb25lCisgICAgICAgIHByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSBwcm9jLmNvbW11bmljYXRlKGNvbW1hbmRzKQorICAgICAgICBwcm9jLnN0ZG91dC5jbG9zZSgpCisgICAgICAgIHByb2Muc3RkaW4uY2xvc2UoKQorICAgICAgICByZXR1cm4gc3Rkb3V0LCBzdGRlcnIKKworICAgIGRlZiB0ZXN0X2lzc3VlMTMxODMoc2VsZik6CisgICAgICAgIHNjcmlwdCA9ICIiIgorICAgICAgICAgICAgZnJvbSBiYXIgaW1wb3J0IGJhcgorCisgICAgICAgICAgICBkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgYmFyKCkKKworICAgICAgICAgICAgZGVmIG5vcGUoKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGRlZiBmb29iYXIoKToKKyAgICAgICAgICAgICAgICBmb28oKQorICAgICAgICAgICAgICAgIG5vcGUoKQorCisgICAgICAgICAgICBmb29iYXIoKQorICAgICAgICAiIiIKKyAgICAgICAgY29tbWFuZHMgPSAiIiIKKyAgICAgICAgICAgIGZyb20gYmFyIGltcG9ydCBiYXIKKyAgICAgICAgICAgIGJyZWFrIGJhcgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHN0ZXAKKyAgICAgICAgICAgIHN0ZXAKKyAgICAgICAgICAgIHF1aXQKKyAgICAgICAgIiIiCisgICAgICAgIGJhciA9ICIiIgorICAgICAgICAgICAgZGVmIGJhcigpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIiIiCisgICAgICAgIHdpdGggb3BlbignYmFyLnB5JywgJ3cnKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZSh0ZXh0d3JhcC5kZWRlbnQoYmFyKSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHRlc3Rfc3VwcG9ydC51bmxpbmssICdiYXIucHknKQorICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHNlbGYucnVuX3BkYihzY3JpcHQsIGNvbW1hbmRzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBhbnkoJ21haW4ucHkoNSlmb28oKS0+Tm9uZScgaW4gbCBmb3IgbCBpbiBzdGRvdXQuc3BsaXRsaW5lcygpKSwKKyAgICAgICAgICAgICdGYWlsIHRvIHN0ZXAgaW50byB0aGUgY2FsbGVyIGFmdGVyIGEgcmV0dXJuJykKKworCiBjbGFzcyBQZGJUZXN0SW5wdXQob2JqZWN0KToKICAgICAiIiJDb250ZXh0IG1hbmFnZXIgdGhhdCBtYWtlcyB0ZXN0aW5nIFBkYiBpbiBkb2N0ZXN0cyBlYXNpZXIuIiIiCiAKQEAgLTMwOSw3ICszNjYsOSBAQAogZGVmIHRlc3RfbWFpbigpOgogICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9wZGIKICAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3QodGVzdF9wZGIsIHZlcmJvc2l0eT1UcnVlKQotICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoTW9kdWxlSW5pdFRlc3RlcikKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICBQZGJUZXN0Q2FzZSwKKyAgICAgICAgTW9kdWxlSW5pdFRlc3RlcikKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wZWVwaG9sZXIucHkgYi9MaWIvdGVzdC90ZXN0X3BlZXBob2xlci5weQppbmRleCAzZThiN2FlLi43ZTA1ZjQ5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BlZXBob2xlci5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BlZXBob2xlci5weQpAQCAtMTM4LDIxICsxMzgsMjIgQEAKICAgICAgICAgc2VsZi5hc3NlcnRJbignKDEwMDApJywgYXNtKQogCiAgICAgZGVmIHRlc3RfYmluYXJ5X3N1YnNjcl9vbl91bmljb2RlKHNlbGYpOgotICAgICAgICAjIHZhbGlkIGNvZGUgZ2V0IG9wdGltaXplZAorICAgICAgICAjIHVuaWNvZGUgc3RyaW5ncyBkb24ndCBnZXQgb3B0aW1pemVkCiAgICAgICAgIGFzbSA9IGRpc19zaW5nbGUoJ3UiZm9vIlswXScpCi0gICAgICAgIHNlbGYuYXNzZXJ0SW4oIih1J2YnKSIsIGFzbSkKLSAgICAgICAgc2VsZi5hc3NlcnROb3RJbignQklOQVJZX1NVQlNDUicsIGFzbSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigiKHUnZicpIiwgYXNtKQorICAgICAgICBzZWxmLmFzc2VydEluKCdCSU5BUllfU1VCU0NSJywgYXNtKQogICAgICAgICBhc20gPSBkaXNfc2luZ2xlKCd1Ilx1MDA2MVx1ZmZmZiJbMV0nKQotICAgICAgICBzZWxmLmFzc2VydEluKCIodSdcXHVmZmZmJykiLCBhc20pCi0gICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ0JJTkFSWV9TVUJTQ1InLCBhc20pCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oIih1J1xcdWZmZmYnKSIsIGFzbSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignQklOQVJZX1NVQlNDUicsIGFzbSkKIAotICAgICAgICAjIGludmFsaWQgY29kZSBkb2Vzbid0IGdldCBvcHRpbWl6ZWQKICAgICAgICAgIyBvdXQgb2YgcmFuZ2UKICAgICAgICAgYXNtID0gZGlzX3NpbmdsZSgndSJmdXUiWzEwXScpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ0JJTkFSWV9TVUJTQ1InLCBhc20pCiAgICAgICAgICMgbm9uLUJNUCBjaGFyIChzZWUgIzUwNTcpCiAgICAgICAgIGFzbSA9IGRpc19zaW5nbGUoJ3UiXFUwMDAxMjM0NSJbMF0nKQogICAgICAgICBzZWxmLmFzc2VydEluKCdCSU5BUllfU1VCU0NSJywgYXNtKQorICAgICAgICBhc20gPSBkaXNfc2luZ2xlKCd1IlxVMDAwMTIzNDVhYmNkZWYiWzNdJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignQklOQVJZX1NVQlNDUicsIGFzbSkKIAogCiAgICAgZGVmIHRlc3RfZm9sZGluZ19vZl91bmFyeW9wc19vbl9jb25zdGFudHMoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BlcDI2My5weSBiL0xpYi90ZXN0L3Rlc3RfcGVwMjYzLnB5CmluZGV4IDkyODY0NjcuLmEzYWJjM2MgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGVwMjYzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGVwMjYzLnB5CkBAIC00MSw2ICs0MSwyOSBAQAogICAgICAgICAjIHR3byBieXRlcyBpbiBjb21tb24gd2l0aCB0aGUgVVRGLTggQk9NCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCAnXHhlZlx4YmJceDIwJykKIAorICAgIGRlZiB0ZXN0X2Vycm9yX21lc3NhZ2Uoc2VsZik6CisgICAgICAgIGNvbXBpbGUoJyMgLSotIGNvZGluZzogaXNvLTg4NTktMTUgLSotXG4nLCAnZHVtbXknLCAnZXhlYycpCisgICAgICAgIGNvbXBpbGUoJ1x4ZWZceGJiXHhiZlxuJywgJ2R1bW15JywgJ2V4ZWMnKQorICAgICAgICBjb21waWxlKCdceGVmXHhiYlx4YmYjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLVxuJywgJ2R1bW15JywgJ2V4ZWMnKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFN5bnRheEVycm9yLCAnZmFrZScpOgorICAgICAgICAgICAgY29tcGlsZSgnIyAtKi0gY29kaW5nOiBmYWtlIC0qLVxuJywgJ2R1bW15JywgJ2V4ZWMnKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFN5bnRheEVycm9yLCAnaXNvLTg4NTktMTUnKToKKyAgICAgICAgICAgIGNvbXBpbGUoJ1x4ZWZceGJiXHhiZiMgLSotIGNvZGluZzogaXNvLTg4NTktMTUgLSotXG4nLAorICAgICAgICAgICAgICAgICAgICAnZHVtbXknLCAnZXhlYycpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoU3ludGF4RXJyb3IsICdCT00nKToKKyAgICAgICAgICAgIGNvbXBpbGUoJ1x4ZWZceGJiXHhiZiMgLSotIGNvZGluZzogaXNvLTg4NTktMTUgLSotXG4nLAorICAgICAgICAgICAgICAgICAgICAnZHVtbXknLCAnZXhlYycpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoU3ludGF4RXJyb3IsICdmYWtlJyk6CisgICAgICAgICAgICBjb21waWxlKCdceGVmXHhiYlx4YmYjIC0qLSBjb2Rpbmc6IGZha2UgLSotXG4nLCAnZHVtbXknLCAnZXhlYycpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoU3ludGF4RXJyb3IsICdCT00nKToKKyAgICAgICAgICAgIGNvbXBpbGUoJ1x4ZWZceGJiXHhiZiMgLSotIGNvZGluZzogZmFrZSAtKi1cbicsICdkdW1teScsICdleGVjJykKKworICAgIGRlZiB0ZXN0X25vbl91bmljb2RlX2NvZGVjKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFN5bnRheEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb2RlYyBkaWQgbm90IHJldHVybiBhIHVuaWNvZGUnKToKKyAgICAgICAgICAgIGZyb20gdGVzdCBpbXBvcnQgYmFkX2NvZGluZzMKKworCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChQRVAyNjNUZXN0KQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BpY2tsZS5weSBiL0xpYi90ZXN0L3Rlc3RfcGlja2xlLnB5CmluZGV4IDZjODM4MTEuLmMzMTI2NDkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGlja2xlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGlja2xlLnB5CkBAIC0zLDEwICszLDExIEBACiAKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiAKLWZyb20gdGVzdC5waWNrbGV0ZXN0ZXIgaW1wb3J0IEFic3RyYWN0UGlja2xlVGVzdHMKLWZyb20gdGVzdC5waWNrbGV0ZXN0ZXIgaW1wb3J0IEFic3RyYWN0UGlja2xlTW9kdWxlVGVzdHMKLWZyb20gdGVzdC5waWNrbGV0ZXN0ZXIgaW1wb3J0IEFic3RyYWN0UGVyc2lzdGVudFBpY2tsZXJUZXN0cwotZnJvbSB0ZXN0LnBpY2tsZXRlc3RlciBpbXBvcnQgQWJzdHJhY3RQaWNrbGVyVW5waWNrbGVyT2JqZWN0VGVzdHMKK2Zyb20gdGVzdC5waWNrbGV0ZXN0ZXIgaW1wb3J0IChBYnN0cmFjdFBpY2tsZVRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0UGlja2xlTW9kdWxlVGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RQZXJzaXN0ZW50UGlja2xlclRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0UGlja2xlclVucGlja2xlck9iamVjdFRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ21lbVBpY2tsZVRlc3RzKQogCiBjbGFzcyBQaWNrbGVUZXN0cyhBYnN0cmFjdFBpY2tsZVRlc3RzLCBBYnN0cmFjdFBpY2tsZU1vZHVsZVRlc3RzKToKIApAQCAtNjYsNiArNjcsMTYgQEAKICAgICBwaWNrbGVyX2NsYXNzID0gcGlja2xlLlBpY2tsZXIKICAgICB1bnBpY2tsZXJfY2xhc3MgPSBwaWNrbGUuVW5waWNrbGVyCiAKK2NsYXNzIFBpY2tsZUJpZ21lbVBpY2tsZVRlc3RzKEJpZ21lbVBpY2tsZVRlc3RzKToKKworICAgIGRlZiBkdW1wcyhzZWxmLCBhcmcsIHByb3RvPTAsIGZhc3Q9MCk6CisgICAgICAgICMgSWdub3JlIGZhc3QKKyAgICAgICAgcmV0dXJuIHBpY2tsZS5kdW1wcyhhcmcsIHByb3RvKQorCisgICAgZGVmIGxvYWRzKHNlbGYsIGJ1Zik6CisgICAgICAgICMgSWdub3JlIGZhc3QKKyAgICAgICAgcmV0dXJuIHBpY2tsZS5sb2FkcyhidWYpCisKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCkBAIC03Myw2ICs4NCw3IEBACiAgICAgICAgIFBpY2tsZXJUZXN0cywKICAgICAgICAgUGVyc1BpY2tsZXJUZXN0cywKICAgICAgICAgUGlja2xlclVucGlja2xlck9iamVjdFRlc3RzLAorICAgICAgICBQaWNrbGVCaWdtZW1QaWNrbGVUZXN0cywKICAgICApCiAgICAgdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KHBpY2tsZSkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wbGF0Zm9ybS5weSBiL0xpYi90ZXN0L3Rlc3RfcGxhdGZvcm0ucHkKaW5kZXggOTQxZDQyOC4uMzMxOTk1ZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wbGF0Zm9ybS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BsYXRmb3JtLnB5CkBAIC04NCwxNSArODQsMjggQEAKICAgICAgICAgICAgICAgICAoIkNQeXRob24iLCAiMi42LjEiLCAidGFncy9yMjYxIiwgIjY3NTE1IiwKICAgICAgICAgICAgICAgICAgKCdyMjYxOjY3NTE1JywgJ0RlYyAgNiAyMDA4IDE1OjI2OjAwJyksCiAgICAgICAgICAgICAgICAgICdHQ0MgNC4wLjEgKEFwcGxlIENvbXB1dGVyLCBJbmMuIGJ1aWxkIDUzNzApJyksCisKICAgICAgICAgICAgICgiSXJvblB5dGhvbiAyLjAgKDIuMC4wLjApIG9uIC5ORVQgMi4wLjUwNzI3LjMwNTMiLCBOb25lLCAiY2xpIikKICAgICAgICAgICAgIDoKICAgICAgICAgICAgICAgICAoIklyb25QeXRob24iLCAiMi4wLjAiLCAiIiwgIiIsICgiIiwgIiIpLAogICAgICAgICAgICAgICAgICAiLk5FVCAyLjAuNTA3MjcuMzA1MyIpLAorCisgICAgICAgICAgICAoIjIuNi4xIChJcm9uUHl0aG9uIDIuNi4xICgyLjYuMTA5MjAuMCkgb24gLk5FVCAyLjAuNTA3MjcuMTQzMykiLCBOb25lLCAiY2xpIikKKyAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICAoIklyb25QeXRob24iLCAiMi42LjEiLCAiIiwgIiIsICgiIiwgIiIpLAorICAgICAgICAgICAgICAgICAiLk5FVCAyLjAuNTA3MjcuMTQzMyIpLAorCisgICAgICAgICAgICAoIjIuNy40IChJcm9uUHl0aG9uIDIuNy40ICgyLjcuMC40MCkgb24gTW9ubyA0LjAuMzAzMTkuMSAoMzItYml0KSkiLCBOb25lLCAiY2xpIikKKyAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICAoIklyb25QeXRob24iLCAiMi43LjQiLCAiIiwgIiIsICgiIiwgIiIpLAorICAgICAgICAgICAgICAgICAiTW9ubyA0LjAuMzAzMTkuMSAoMzItYml0KSIpLAorCiAgICAgICAgICAgICAoIjIuNSAodHJ1bms6NjEwNywgTWFyIDI2IDIwMDksIDEzOjAyOjE4KSBcbltKYXZhIEhvdFNwb3QoVE0pIENsaWVudCBWTSAoXCJBcHBsZSBDb21wdXRlciwgSW5jLlwiKV0iLAogICAgICAgICAgICAgKCdKeXRob24nLCAndHJ1bmsnLCAnNjEwNycpLCAiamF2YTEuNS4wXzE2IikKICAgICAgICAgICAgIDoKICAgICAgICAgICAgICAgICAoIkp5dGhvbiIsICIyLjUuMCIsICJ0cnVuayIsICI2MTA3IiwKICAgICAgICAgICAgICAgICAgKCd0cnVuazo2MTA3JywgJ01hciAyNiAyMDA5JyksICJqYXZhMS41LjBfMTYiKSwKKwogICAgICAgICAgICAgKCIyLjUuMiAoNjMzNzgsIE1hciAyNiAyMDA5LCAxODowMzoyOSlcbltQeVB5IDEuMC4wXSIsCiAgICAgICAgICAgICAgKCdQeVB5JywgJ3RydW5rJywgJzYzMzc4JyksIHNlbGYuc2F2ZV9wbGF0Zm9ybSkKICAgICAgICAgICAgIDoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGxpc3RsaWIucHkgYi9MaWIvdGVzdC90ZXN0X3BsaXN0bGliLnB5CmluZGV4IGU2ZTBmODYuLjc4NTlhZDAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGxpc3RsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wbGlzdGxpYi5weQpAQCAtMTM1LDYgKzEzNSwxOCBAQAogICAgICAgICBkYXRhMiA9IHBsaXN0bGliLndyaXRlUGxpc3RUb1N0cmluZyhwbDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgZGF0YTIpCiAKKyAgICBkZWYgdGVzdF9pbmRlbnRhdGlvbl9hcnJheShzZWxmKToKKyAgICAgICAgZGF0YSA9IFtbW1tbW1tbeyd0ZXN0JzogcGxpc3RsaWIuRGF0YShiJ2FhYWFhYScpfV1dXV1dXV1dCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGxpc3RsaWIucmVhZFBsaXN0RnJvbVN0cmluZyhwbGlzdGxpYi53cml0ZVBsaXN0VG9TdHJpbmcoZGF0YSkpLCBkYXRhKQorCisgICAgZGVmIHRlc3RfaW5kZW50YXRpb25fZGljdChzZWxmKToKKyAgICAgICAgZGF0YSA9IHsnMSc6IHsnMic6IHsnMyc6IHsnNCc6IHsnNSc6IHsnNic6IHsnNyc6IHsnOCc6IHsnOSc6IHBsaXN0bGliLkRhdGEoYidhYWFhYWEnKX19fX19fX19fQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBsaXN0bGliLnJlYWRQbGlzdEZyb21TdHJpbmcocGxpc3RsaWIud3JpdGVQbGlzdFRvU3RyaW5nKGRhdGEpKSwgZGF0YSkKKworICAgIGRlZiB0ZXN0X2luZGVudGF0aW9uX2RpY3RfbWl4KHNlbGYpOgorICAgICAgICBkYXRhID0geycxJzogeycyJzogW3snMyc6IFtbW1tbeyd0ZXN0JzogcGxpc3RsaWIuRGF0YShiJ2FhYWFhYScpfV1dXV1dfV19fQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBsaXN0bGliLnJlYWRQbGlzdEZyb21TdHJpbmcocGxpc3RsaWIud3JpdGVQbGlzdFRvU3RyaW5nKGRhdGEpKSwgZGF0YSkKKwogICAgIGRlZiB0ZXN0X2FwcGxlZm9ybWF0dGluZyhzZWxmKToKICAgICAgICAgcGwgPSBwbGlzdGxpYi5yZWFkUGxpc3RGcm9tU3RyaW5nKFRFU1REQVRBKQogICAgICAgICBkYXRhID0gcGxpc3RsaWIud3JpdGVQbGlzdFRvU3RyaW5nKHBsKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wb2xsLnB5IGIvTGliL3Rlc3QvdGVzdF9wb2xsLnB5CmluZGV4IGQzM2FmOTEuLjFlMTk1ZWQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcG9sbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BvbGwucHkKQEAgLTEsNyArMSwxNSBAQAogIyBUZXN0IGNhc2UgZm9yIHRoZSBvcy5wb2xsKCkgZnVuY3Rpb24KIAotaW1wb3J0IG9zLCBzZWxlY3QsIHJhbmRvbSwgdW5pdHRlc3QKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRFU1RGTiwgcnVuX3VuaXR0ZXN0CitpbXBvcnQgb3MKK2ltcG9ydCByYW5kb20KK2ltcG9ydCBzZWxlY3QKK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgdGhyZWFkaW5nID0gTm9uZQoraW1wb3J0IHRpbWUKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCBydW5fdW5pdHRlc3QsIHJlYXBfdGhyZWFkcywgY3B5dGhvbl9vbmx5CiAKIHRyeToKICAgICBzZWxlY3QucG9sbApAQCAtMTUwLDYgKzE1OCw1NCBAQAogICAgICAgICBpZiB4ICE9IDU6CiAgICAgICAgICAgICBzZWxmLmZhaWwoJ092ZXJmbG93IG11c3QgaGF2ZSBvY2N1cnJlZCcpCiAKKyAgICAgICAgIyBJc3N1ZXMgIzE1OTg5LCAjMTc5MTkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgcG9sbHN0ZXIucmVnaXN0ZXIsIDAsIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBwb2xsc3Rlci5yZWdpc3RlciwgMCwgMSA8PCA2NCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgcG9sbHN0ZXIubW9kaWZ5LCAxLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgcG9sbHN0ZXIubW9kaWZ5LCAxLCAxIDw8IDY0KQorCisgICAgQGNweXRob25fb25seQorICAgIGRlZiB0ZXN0X3BvbGxfY19saW1pdHMoc2VsZik6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBVU0hSVF9NQVgsIElOVF9NQVgsIFVJTlRfTUFYCisgICAgICAgIHBvbGxzdGVyID0gc2VsZWN0LnBvbGwoKQorICAgICAgICBwb2xsc3Rlci5yZWdpc3RlcigxKQorCisgICAgICAgICMgSXNzdWVzICMxNTk4OSwgIzE3OTE5CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHBvbGxzdGVyLnJlZ2lzdGVyLCAwLCBVU0hSVF9NQVggKyAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBwb2xsc3Rlci5tb2RpZnksIDEsIFVTSFJUX01BWCArIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHBvbGxzdGVyLnBvbGwsIElOVF9NQVggKyAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBwb2xsc3Rlci5wb2xsLCBVSU5UX01BWCArIDEpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorICAgIEByZWFwX3RocmVhZHMKKyAgICBkZWYgdGVzdF90aHJlYWRlZF9wb2xsKHNlbGYpOgorICAgICAgICByLCB3ID0gb3MucGlwZSgpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy5jbG9zZSwgcikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKG9zLmNsb3NlLCB3KQorICAgICAgICByZmRzID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgZmQgPSBvcy5kdXAocikKKyAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy5jbG9zZSwgZmQpCisgICAgICAgICAgICByZmRzLmFwcGVuZChmZCkKKyAgICAgICAgcG9sbHN0ZXIgPSBzZWxlY3QucG9sbCgpCisgICAgICAgIGZvciBmZCBpbiByZmRzOgorICAgICAgICAgICAgcG9sbHN0ZXIucmVnaXN0ZXIoZmQsIHNlbGVjdC5QT0xMSU4pCisKKyAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXBvbGxzdGVyLnBvbGwpCisgICAgICAgIHQuc3RhcnQoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0aW1lLnNsZWVwKDAuNSkKKyAgICAgICAgICAgICMgdHJpZ2dlciB1ZmRzIGFycmF5IHJlYWxsb2NhdGlvbgorICAgICAgICAgICAgZm9yIGZkIGluIHJmZHM6CisgICAgICAgICAgICAgICAgcG9sbHN0ZXIudW5yZWdpc3RlcihmZCkKKyAgICAgICAgICAgIHBvbGxzdGVyLnJlZ2lzdGVyKHcsIHNlbGVjdC5QT0xMT1VUKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBwb2xsc3Rlci5wb2xsKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgIyBhbmQgbWFrZSB0aGUgY2FsbCB0byBwb2xsKCkgZnJvbSB0aGUgdGhyZWFkIHJldHVybgorICAgICAgICAgICAgb3Mud3JpdGUodywgYidzcGFtJykKKyAgICAgICAgICAgIHQuam9pbigpCisKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHJ1bl91bml0dGVzdChQb2xsVGVzdHMpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcG9wZW4ucHkgYi9MaWIvdGVzdC90ZXN0X3BvcGVuLnB5CmluZGV4IDkyYjVlOTIuLjgyZDQ2MjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcG9wZW4ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wb3Blbi5weQpAQCAtMSw0ICsxLDMgQEAKLSMhIC91c3IvYmluL2VudiBweXRob24KICIiIkJhc2ljIHRlc3RzIGZvciBvcy5wb3BlbigpCiAKICAgUGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgcGxhdGZvcm1zIHRoYXQgZmFrZSBwb3Blbi4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcG9wZW4yLnB5IGIvTGliL3Rlc3QvdGVzdF9wb3BlbjIucHkKaW5kZXggZWE0MTA3NS4uNGE3NDVlMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wb3BlbjIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wb3BlbjIucHkKQEAgLTEsNCArMSwzIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCiAiIiJUZXN0IHNjcmlwdCBmb3IgcG9wZW4yLnB5IiIiCiAKIGltcG9ydCB3YXJuaW5ncwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wb3BsaWIucHkgYi9MaWIvdGVzdC90ZXN0X3BvcGxpYi5weQppbmRleCA0Mzc1ZjcxLi5hZjQ4ZmRkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BvcGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BvcGxpYi5weQpAQCAtMTEsNyArMTEsNyBAQAogaW1wb3J0IHRpbWUKIGltcG9ydCBlcnJubwogCi1mcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0Q2FzZQorZnJvbSB1bml0dGVzdCBpbXBvcnQgVGVzdENhc2UsIHNraXBVbmxlc3MKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiBmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBIT1NUCiB0aHJlYWRpbmcgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgndGhyZWFkaW5nJykKQEAgLTI2MywxNyArMjYzLDIwIEBACiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIER1bW15UE9QM0hhbmRsZXIuaGFuZGxlX3JlYWQoc2VsZikKIAotICAgIGNsYXNzIFRlc3RQT1AzX1NTTENsYXNzKFRlc3RQT1AzQ2xhc3MpOgotICAgICAgICAjIHJlcGVhdCBwcmV2aW91cyB0ZXN0cyBieSB1c2luZyBwb3BsaWIuUE9QM19TU0wKK3JlcXVpcmVzX3NzbCA9IHNraXBVbmxlc3MoU1VQUE9SVFNfU1NMLCAnU1NMIG5vdCBzdXBwb3J0ZWQnKQogCi0gICAgICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgICAgIHNlbGYuc2VydmVyID0gRHVtbXlQT1AzU2VydmVyKChIT1NULCAwKSkKLSAgICAgICAgICAgIHNlbGYuc2VydmVyLmhhbmRsZXIgPSBEdW1teVBPUDNfU1NMSGFuZGxlcgotICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc3RhcnQoKQotICAgICAgICAgICAgc2VsZi5jbGllbnQgPSBwb3BsaWIuUE9QM19TU0woc2VsZi5zZXJ2ZXIuaG9zdCwgc2VsZi5zZXJ2ZXIucG9ydCkKK0ByZXF1aXJlc19zc2wKK2NsYXNzIFRlc3RQT1AzX1NTTENsYXNzKFRlc3RQT1AzQ2xhc3MpOgorICAgICMgcmVwZWF0IHByZXZpb3VzIHRlc3RzIGJ5IHVzaW5nIHBvcGxpYi5QT1AzX1NTTAogCi0gICAgICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ1BPUDNfU1NMJywgcG9wbGliLl9fYWxsX18pCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZlciA9IER1bW15UE9QM1NlcnZlcigoSE9TVCwgMCkpCisgICAgICAgIHNlbGYuc2VydmVyLmhhbmRsZXIgPSBEdW1teVBPUDNfU1NMSGFuZGxlcgorICAgICAgICBzZWxmLnNlcnZlci5zdGFydCgpCisgICAgICAgIHNlbGYuY2xpZW50ID0gcG9wbGliLlBPUDNfU1NMKHNlbGYuc2VydmVyLmhvc3QsIHNlbGYuc2VydmVyLnBvcnQpCisKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ1BPUDNfU1NMJywgcG9wbGliLl9fYWxsX18pCiAKIAogY2xhc3MgVGVzdFRpbWVvdXRzKFRlc3RDYXNlKToKQEAgLTI4MSw1NyArMjg0LDU4IEBACiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLmV2dCA9IHRocmVhZGluZy5FdmVudCgpCiAgICAgICAgIHNlbGYuc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKLSAgICAgICAgc2VsZi5zb2NrLnNldHRpbWVvdXQoMykKKyAgICAgICAgc2VsZi5zb2NrLnNldHRpbWVvdXQoNjApICAjIFNhZmV0eSBuZXQuIExvb2sgaXNzdWUgMTE4MTIKICAgICAgICAgc2VsZi5wb3J0ID0gdGVzdF9zdXBwb3J0LmJpbmRfcG9ydChzZWxmLnNvY2spCi0gICAgICAgIHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYuc2VydmVyLCBhcmdzPShzZWxmLmV2dCxzZWxmLnNvY2spKS5zdGFydCgpCi0gICAgICAgIHRpbWUuc2xlZXAoLjEpCisgICAgICAgIHNlbGYudGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5zZXJ2ZXIsIGFyZ3M9KHNlbGYuZXZ0LHNlbGYuc29jaykpCisgICAgICAgIHNlbGYudGhyZWFkLnNldERhZW1vbihUcnVlKQorICAgICAgICBzZWxmLnRocmVhZC5zdGFydCgpCisgICAgICAgIHNlbGYuZXZ0LndhaXQoKQogCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgICAgICBzZWxmLmV2dC53YWl0KCkKKyAgICAgICAgc2VsZi50aHJlYWQuam9pbigpCisgICAgICAgIGRlbCBzZWxmLnRocmVhZCAgIyBDbGVhciBvdXQgYW55IGRhbmdsaW5nIFRocmVhZCBvYmplY3RzLgogCiAgICAgZGVmIHNlcnZlcihzZWxmLCBldnQsIHNlcnYpOgogICAgICAgICBzZXJ2Lmxpc3Rlbig1KQorICAgICAgICBldnQuc2V0KCkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgY29ubiwgYWRkciA9IHNlcnYuYWNjZXB0KCkKLSAgICAgICAgZXhjZXB0IHNvY2tldC50aW1lb3V0OgotICAgICAgICAgICAgcGFzcwotICAgICAgICBlbHNlOgogICAgICAgICAgICAgY29ubi5zZW5kKCIrIEhvbGEgbXVuZG9cbiIpCiAgICAgICAgICAgICBjb25uLmNsb3NlKCkKKyAgICAgICAgZXhjZXB0IHNvY2tldC50aW1lb3V0OgorICAgICAgICAgICAgcGFzcwogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgc2Vydi5jbG9zZSgpCi0gICAgICAgICAgICBldnQuc2V0KCkKIAogICAgIGRlZiB0ZXN0VGltZW91dERlZmF1bHQoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSkKICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDMwKQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBwb3AgPSBwb3BsaWIuUE9QMygibG9jYWxob3N0Iiwgc2VsZi5wb3J0KQorICAgICAgICAgICAgcG9wID0gcG9wbGliLlBPUDMoSE9TVCwgc2VsZi5wb3J0KQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9wLnNvY2suZ2V0dGltZW91dCgpLCAzMCkKICAgICAgICAgcG9wLnNvY2suY2xvc2UoKQogCiAgICAgZGVmIHRlc3RUaW1lb3V0Tm9uZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpKQogICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoMzApCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHBvcCA9IHBvcGxpYi5QT1AzKEhPU1QsIHNlbGYucG9ydCwgdGltZW91dD1Ob25lKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3Auc29jay5nZXR0aW1lb3V0KCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocG9wLnNvY2suZ2V0dGltZW91dCgpKQogICAgICAgICBwb3Auc29jay5jbG9zZSgpCiAKICAgICBkZWYgdGVzdFRpbWVvdXRWYWx1ZShzZWxmKToKLSAgICAgICAgcG9wID0gcG9wbGliLlBPUDMoImxvY2FsaG9zdCIsIHNlbGYucG9ydCwgdGltZW91dD0zMCkKKyAgICAgICAgcG9wID0gcG9wbGliLlBPUDMoSE9TVCwgc2VsZi5wb3J0LCB0aW1lb3V0PTMwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvcC5zb2NrLmdldHRpbWVvdXQoKSwgMzApCiAgICAgICAgIHBvcC5zb2NrLmNsb3NlKCkKIAogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgdGVzdHMgPSBbVGVzdFBPUDNDbGFzcywgVGVzdFRpbWVvdXRzXQotICAgIGlmIFNVUFBPUlRTX1NTTDoKLSAgICAgICAgdGVzdHMuYXBwZW5kKFRlc3RQT1AzX1NTTENsYXNzKQorICAgIHRlc3RzID0gW1Rlc3RQT1AzQ2xhc3MsIFRlc3RUaW1lb3V0cywKKyAgICAgICAgICAgICBUZXN0UE9QM19TU0xDbGFzc10KICAgICB0aHJlYWRfaW5mbyA9IHRlc3Rfc3VwcG9ydC50aHJlYWRpbmdfc2V0dXAoKQogICAgIHRyeToKICAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdHMpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3Bvc2l4LnB5IGIvTGliL3Rlc3QvdGVzdF9wb3NpeC5weQppbmRleCBhNmE3MzA2Li5kZjEyMmY3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3Bvc2l4LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcG9zaXgucHkKQEAgLTksNiArOSw3IEBACiBpbXBvcnQgc3lzCiBpbXBvcnQgdGltZQogaW1wb3J0IG9zCitpbXBvcnQgcGxhdGZvcm0KIGltcG9ydCBwd2QKIGltcG9ydCBzaHV0aWwKIGltcG9ydCBzdGF0CkBAIC01Miw0NyArNTMsNTUgQEAKICAgICAgICAgICAgICAgICAgICAgcG9zaXhfZnVuYygpCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcG9zaXhfZnVuYywgMSkKIAotICAgIGlmIGhhc2F0dHIocG9zaXgsICdnZXRyZXN1aWQnKToKLSAgICAgICAgZGVmIHRlc3RfZ2V0cmVzdWlkKHNlbGYpOgotICAgICAgICAgICAgdXNlcl9pZHMgPSBwb3NpeC5nZXRyZXN1aWQoKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odXNlcl9pZHMpLCAzKQotICAgICAgICAgICAgZm9yIHZhbCBpbiB1c2VyX2lkczoKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbCh2YWwsIDApCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihwb3NpeCwgJ2dldHJlc3VpZCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0IG5lZWRzIHBvc2l4LmdldHJlc3VpZCgpJykKKyAgICBkZWYgdGVzdF9nZXRyZXN1aWQoc2VsZik6CisgICAgICAgIHVzZXJfaWRzID0gcG9zaXguZ2V0cmVzdWlkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odXNlcl9pZHMpLCAzKQorICAgICAgICBmb3IgdmFsIGluIHVzZXJfaWRzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwodmFsLCAwKQogCi0gICAgaWYgaGFzYXR0cihwb3NpeCwgJ2dldHJlc2dpZCcpOgotICAgICAgICBkZWYgdGVzdF9nZXRyZXNnaWQoc2VsZik6Ci0gICAgICAgICAgICBncm91cF9pZHMgPSBwb3NpeC5nZXRyZXNnaWQoKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZ3JvdXBfaWRzKSwgMykKLSAgICAgICAgICAgIGZvciB2YWwgaW4gZ3JvdXBfaWRzOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKHZhbCwgMCkKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKHBvc2l4LCAnZ2V0cmVzZ2lkJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QgbmVlZHMgcG9zaXguZ2V0cmVzZ2lkKCknKQorICAgIGRlZiB0ZXN0X2dldHJlc2dpZChzZWxmKToKKyAgICAgICAgZ3JvdXBfaWRzID0gcG9zaXguZ2V0cmVzZ2lkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZ3JvdXBfaWRzKSwgMykKKyAgICAgICAgZm9yIHZhbCBpbiBncm91cF9pZHM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbCh2YWwsIDApCiAKLSAgICBpZiBoYXNhdHRyKHBvc2l4LCAnc2V0cmVzdWlkJyk6Ci0gICAgICAgIGRlZiB0ZXN0X3NldHJlc3VpZChzZWxmKToKLSAgICAgICAgICAgIGN1cnJlbnRfdXNlcl9pZHMgPSBwb3NpeC5nZXRyZXN1aWQoKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocG9zaXguc2V0cmVzdWlkKCpjdXJyZW50X3VzZXJfaWRzKSkKLSAgICAgICAgICAgICMgLTEgbWVhbnMgZG9uJ3QgY2hhbmdlIHRoYXQgdmFsdWUuCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShwb3NpeC5zZXRyZXN1aWQoLTEsIC0xLCAtMSkpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihwb3NpeCwgJ3NldHJlc3VpZCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0IG5lZWRzIHBvc2l4LnNldHJlc3VpZCgpJykKKyAgICBkZWYgdGVzdF9zZXRyZXN1aWQoc2VsZik6CisgICAgICAgIGN1cnJlbnRfdXNlcl9pZHMgPSBwb3NpeC5nZXRyZXN1aWQoKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShwb3NpeC5zZXRyZXN1aWQoKmN1cnJlbnRfdXNlcl9pZHMpKQorICAgICAgICAjIC0xIG1lYW5zIGRvbid0IGNoYW5nZSB0aGF0IHZhbHVlLgorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShwb3NpeC5zZXRyZXN1aWQoLTEsIC0xLCAtMSkpCiAKLSAgICAgICAgZGVmIHRlc3Rfc2V0cmVzdWlkX2V4Y2VwdGlvbihzZWxmKToKLSAgICAgICAgICAgICMgRG9uJ3QgZG8gdGhpcyB0ZXN0IGlmIHNvbWVvbmUgaXMgc2lsbHkgZW5vdWdoIHRvIHJ1biB1cyBhcyByb290LgotICAgICAgICAgICAgY3VycmVudF91c2VyX2lkcyA9IHBvc2l4LmdldHJlc3VpZCgpCi0gICAgICAgICAgICBpZiAwIG5vdCBpbiBjdXJyZW50X3VzZXJfaWRzOgotICAgICAgICAgICAgICAgIG5ld191c2VyX2lkcyA9IChjdXJyZW50X3VzZXJfaWRzWzBdKzEsIC0xLCAtMSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBwb3NpeC5zZXRyZXN1aWQsICpuZXdfdXNlcl9pZHMpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihwb3NpeCwgJ3NldHJlc3VpZCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0IG5lZWRzIHBvc2l4LnNldHJlc3VpZCgpJykKKyAgICBkZWYgdGVzdF9zZXRyZXN1aWRfZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICAjIERvbid0IGRvIHRoaXMgdGVzdCBpZiBzb21lb25lIGlzIHNpbGx5IGVub3VnaCB0byBydW4gdXMgYXMgcm9vdC4KKyAgICAgICAgY3VycmVudF91c2VyX2lkcyA9IHBvc2l4LmdldHJlc3VpZCgpCisgICAgICAgIGlmIDAgbm90IGluIGN1cnJlbnRfdXNlcl9pZHM6CisgICAgICAgICAgICBuZXdfdXNlcl9pZHMgPSAoY3VycmVudF91c2VyX2lkc1swXSsxLCAtMSwgLTEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBwb3NpeC5zZXRyZXN1aWQsICpuZXdfdXNlcl9pZHMpCiAKLSAgICBpZiBoYXNhdHRyKHBvc2l4LCAnc2V0cmVzZ2lkJyk6Ci0gICAgICAgIGRlZiB0ZXN0X3NldHJlc2dpZChzZWxmKToKLSAgICAgICAgICAgIGN1cnJlbnRfZ3JvdXBfaWRzID0gcG9zaXguZ2V0cmVzZ2lkKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHBvc2l4LnNldHJlc2dpZCgqY3VycmVudF9ncm91cF9pZHMpKQotICAgICAgICAgICAgIyAtMSBtZWFucyBkb24ndCBjaGFuZ2UgdGhhdCB2YWx1ZS4KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHBvc2l4LnNldHJlc2dpZCgtMSwgLTEsIC0xKSkKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKHBvc2l4LCAnc2V0cmVzZ2lkJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QgbmVlZHMgcG9zaXguc2V0cmVzZ2lkKCknKQorICAgIGRlZiB0ZXN0X3NldHJlc2dpZChzZWxmKToKKyAgICAgICAgY3VycmVudF9ncm91cF9pZHMgPSBwb3NpeC5nZXRyZXNnaWQoKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShwb3NpeC5zZXRyZXNnaWQoKmN1cnJlbnRfZ3JvdXBfaWRzKSkKKyAgICAgICAgIyAtMSBtZWFucyBkb24ndCBjaGFuZ2UgdGhhdCB2YWx1ZS4KKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocG9zaXguc2V0cmVzZ2lkKC0xLCAtMSwgLTEpKQogCi0gICAgICAgIGRlZiB0ZXN0X3NldHJlc2dpZF9leGNlcHRpb24oc2VsZik6Ci0gICAgICAgICAgICAjIERvbid0IGRvIHRoaXMgdGVzdCBpZiBzb21lb25lIGlzIHNpbGx5IGVub3VnaCB0byBydW4gdXMgYXMgcm9vdC4KLSAgICAgICAgICAgIGN1cnJlbnRfZ3JvdXBfaWRzID0gcG9zaXguZ2V0cmVzZ2lkKCkKLSAgICAgICAgICAgIGlmIDAgbm90IGluIGN1cnJlbnRfZ3JvdXBfaWRzOgotICAgICAgICAgICAgICAgIG5ld19ncm91cF9pZHMgPSAoY3VycmVudF9ncm91cF9pZHNbMF0rMSwgLTEsIC0xKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIHBvc2l4LnNldHJlc2dpZCwgKm5ld19ncm91cF9pZHMpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihwb3NpeCwgJ3NldHJlc2dpZCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0IG5lZWRzIHBvc2l4LnNldHJlc2dpZCgpJykKKyAgICBkZWYgdGVzdF9zZXRyZXNnaWRfZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICAjIERvbid0IGRvIHRoaXMgdGVzdCBpZiBzb21lb25lIGlzIHNpbGx5IGVub3VnaCB0byBydW4gdXMgYXMgcm9vdC4KKyAgICAgICAgY3VycmVudF9ncm91cF9pZHMgPSBwb3NpeC5nZXRyZXNnaWQoKQorICAgICAgICBpZiAwIG5vdCBpbiBjdXJyZW50X2dyb3VwX2lkczoKKyAgICAgICAgICAgIG5ld19ncm91cF9pZHMgPSAoY3VycmVudF9ncm91cF9pZHNbMF0rMSwgLTEsIC0xKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgcG9zaXguc2V0cmVzZ2lkLCAqbmV3X2dyb3VwX2lkcykKIAogICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIocG9zaXgsICdpbml0Z3JvdXBzJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QgbmVlZHMgb3MuaW5pdGdyb3VwcygpIikKQEAgLTEwNyw3ICsxMTYsMTEgQEAKICAgICAgICAgIyBJZiBhIG5vbi1wcml2aWxlZ2VkIHVzZXIgaW52b2tlcyBpdCwgaXQgc2hvdWxkIGZhaWwgd2l0aCBPU0Vycm9yCiAgICAgICAgICMgRVBFUk0uCiAgICAgICAgIGlmIG9zLmdldHVpZCgpICE9IDA6Ci0gICAgICAgICAgICBuYW1lID0gcHdkLmdldHB3dWlkKHBvc2l4LmdldHVpZCgpKS5wd19uYW1lCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbmFtZSA9IHB3ZC5nZXRwd3VpZChwb3NpeC5nZXR1aWQoKSkucHdfbmFtZQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgICMgdGhlIGN1cnJlbnQgVUlEIG1heSBub3QgaGF2ZSBhIHB3ZCBlbnRyeQorICAgICAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJuZWVkIGEgcHdkIGVudHJ5IikKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBwb3NpeC5pbml0Z3JvdXBzKG5hbWUsIDEzKQogICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKQEAgLTExNSwxMjggKzEyOCwxODUgQEAKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJFeHBlY3RlZCBPU0Vycm9yIHRvIGJlIHJhaXNlZCBieSBpbml0Z3JvdXBzIikKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIocG9zaXgsICdzdGF0dmZzJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QgbmVlZHMgcG9zaXguc3RhdHZmcygpJykKICAgICBkZWYgdGVzdF9zdGF0dmZzKHNlbGYpOgotICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAnc3RhdHZmcycpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvc2l4LnN0YXR2ZnMob3MuY3VyZGlyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvc2l4LnN0YXR2ZnMob3MuY3VyZGlyKSkKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIocG9zaXgsICdmc3RhdHZmcycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0IG5lZWRzIHBvc2l4LmZzdGF0dmZzKCknKQogICAgIGRlZiB0ZXN0X2ZzdGF0dmZzKHNlbGYpOgotICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAnZnN0YXR2ZnMnKToKLSAgICAgICAgICAgIGZwID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3NpeC5mc3RhdHZmcyhmcC5maWxlbm8oKSkpCi0gICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgZnAgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3NpeC5mc3RhdHZmcyhmcC5maWxlbm8oKSkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKHBvc2l4LCAnZnRydW5jYXRlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QgbmVlZHMgcG9zaXguZnRydW5jYXRlKCknKQogICAgIGRlZiB0ZXN0X2Z0cnVuY2F0ZShzZWxmKToKLSAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ2Z0cnVuY2F0ZScpOgotICAgICAgICAgICAgZnAgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICd3KycpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgIyB3ZSBuZWVkIHRvIGhhdmUgc29tZSBkYXRhIHRvIHRydW5jYXRlCi0gICAgICAgICAgICAgICAgZnAud3JpdGUoJ3Rlc3QnKQotICAgICAgICAgICAgICAgIGZwLmZsdXNoKCkKLSAgICAgICAgICAgICAgICBwb3NpeC5mdHJ1bmNhdGUoZnAuZmlsZW5vKCksIDApCi0gICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgZnAgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICd3KycpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgd2UgbmVlZCB0byBoYXZlIHNvbWUgZGF0YSB0byB0cnVuY2F0ZQorICAgICAgICAgICAgZnAud3JpdGUoJ3Rlc3QnKQorICAgICAgICAgICAgZnAuZmx1c2goKQorICAgICAgICAgICAgcG9zaXguZnRydW5jYXRlKGZwLmZpbGVubygpLCAwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihwb3NpeCwgJ2R1cCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0IG5lZWRzIHBvc2l4LmR1cCgpJykKICAgICBkZWYgdGVzdF9kdXAoc2VsZik6Ci0gICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICdkdXAnKToKLSAgICAgICAgICAgIGZwID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGZkID0gcG9zaXguZHVwKGZwLmZpbGVubygpKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShmZCwgaW50KQotICAgICAgICAgICAgICAgIG9zLmNsb3NlKGZkKQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIGZwID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmZCA9IHBvc2l4LmR1cChmcC5maWxlbm8oKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShmZCwgaW50KQorICAgICAgICAgICAgb3MuY2xvc2UoZmQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKHBvc2l4LCAnY29uZnN0cicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0IG5lZWRzIHBvc2l4LmNvbmZzdHIoKScpCiAgICAgZGVmIHRlc3RfY29uZnN0cihzZWxmKToKLSAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ2NvbmZzdHInKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHBvc2l4LmNvbmZzdHIsICJDU19nYXJiYWdlIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBvc2l4LmNvbmZzdHIoIkNTX1BBVEgiKSkgPiAwLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBwb3NpeC5jb25mc3RyLCAiQ1NfZ2FyYmFnZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBvc2l4LmNvbmZzdHIoIkNTX1BBVEgiKSkgPiAwLCBUcnVlKQogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihwb3NpeCwgJ2R1cDInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdCBuZWVkcyBwb3NpeC5kdXAyKCknKQogICAgIGRlZiB0ZXN0X2R1cDIoc2VsZik6Ci0gICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICdkdXAyJyk6Ci0gICAgICAgICAgICBmcDEgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4pCi0gICAgICAgICAgICBmcDIgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4pCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcG9zaXguZHVwMihmcDEuZmlsZW5vKCksIGZwMi5maWxlbm8oKSkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgZnAxLmNsb3NlKCkKLSAgICAgICAgICAgICAgICBmcDIuY2xvc2UoKQorICAgICAgICBmcDEgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIGZwMiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcG9zaXguZHVwMihmcDEuZmlsZW5vKCksIGZwMi5maWxlbm8oKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwMS5jbG9zZSgpCisgICAgICAgICAgICBmcDIuY2xvc2UoKQogCiAgICAgZGVmIGZkb3Blbl9oZWxwZXIoc2VsZiwgKmFyZ3MpOgogICAgICAgICBmZCA9IG9zLm9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgb3MuT19SRE9OTFkpCiAgICAgICAgIGZwMiA9IHBvc2l4LmZkb3BlbihmZCwgKmFyZ3MpCiAgICAgICAgIGZwMi5jbG9zZSgpCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKHBvc2l4LCAnZmRvcGVuJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QgbmVlZHMgcG9zaXguZmRvcGVuKCknKQogICAgIGRlZiB0ZXN0X2Zkb3BlbihzZWxmKToKLSAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ2Zkb3BlbicpOgotICAgICAgICAgICAgc2VsZi5mZG9wZW5faGVscGVyKCkKLSAgICAgICAgICAgIHNlbGYuZmRvcGVuX2hlbHBlcigncicpCi0gICAgICAgICAgICBzZWxmLmZkb3Blbl9oZWxwZXIoJ3InLCAxMDApCisgICAgICAgIHNlbGYuZmRvcGVuX2hlbHBlcigpCisgICAgICAgIHNlbGYuZmRvcGVuX2hlbHBlcigncicpCisgICAgICAgIHNlbGYuZmRvcGVuX2hlbHBlcigncicsIDEwMCkKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIocG9zaXgsICdmZG9wZW4nKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICBub3Qgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoInN1bm9zIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QgbmVlZHMgcG9zaXguZmRvcGVuKCknKQorICAgIGRlZiB0ZXN0X2Zkb3Blbl9rZWVwc19mZF9vcGVuX29uX2Vycm9ycyhzZWxmKToKKyAgICAgICAgZmQgPSBvcy5vcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sIG9zLk9fUkRPTkxZKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBwb3NpeC5mZG9wZW4sIGZkLCAndycpCisgICAgICAgIG9zLmNsb3NlKGZkKSAjIGZkIHNob3VsZCBub3QgYmUgY2xvc2VkLgorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihwb3NpeCwgJ09fRVhMT0NLJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QgbmVlZHMgcG9zaXguT19FWExPQ0snKQogICAgIGRlZiB0ZXN0X29zZXhsb2NrKHNlbGYpOgotICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAiT19FWExPQ0siKToKKyAgICAgICAgZmQgPSBvcy5vcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sCisgICAgICAgICAgICAgICAgICAgICBvcy5PX1dST05MWXxvcy5PX0VYTE9DS3xvcy5PX0NSRUFUKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBvcy5vcGVuLCB0ZXN0X3N1cHBvcnQuVEVTVEZOLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5PX1dST05MWXxvcy5PX0VYTE9DS3xvcy5PX05PTkJMT0NLKQorICAgICAgICBvcy5jbG9zZShmZCkKKworICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAiT19TSExPQ0siKToKICAgICAgICAgICAgIGZkID0gb3Mub3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLAotICAgICAgICAgICAgICAgICAgICAgICAgIG9zLk9fV1JPTkxZfG9zLk9fRVhMT0NLfG9zLk9fQ1JFQVQpCisgICAgICAgICAgICAgICAgICAgICAgICAgb3MuT19XUk9OTFl8b3MuT19TSExPQ0t8b3MuT19DUkVBVCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIG9zLm9wZW4sIHRlc3Rfc3VwcG9ydC5URVNURk4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5PX1dST05MWXxvcy5PX0VYTE9DS3xvcy5PX05PTkJMT0NLKQogICAgICAgICAgICAgb3MuY2xvc2UoZmQpCiAKLSAgICAgICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICJPX1NITE9DSyIpOgotICAgICAgICAgICAgICAgIGZkID0gb3Mub3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5PX1dST05MWXxvcy5PX1NITE9DS3xvcy5PX0NSRUFUKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIG9zLm9wZW4sIHRlc3Rfc3VwcG9ydC5URVNURk4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuT19XUk9OTFl8b3MuT19FWExPQ0t8b3MuT19OT05CTE9DSykKLSAgICAgICAgICAgICAgICBvcy5jbG9zZShmZCkKLQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIocG9zaXgsICdPX1NITE9DSycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0IG5lZWRzIHBvc2l4Lk9fU0hMT0NLJykKICAgICBkZWYgdGVzdF9vc3NobG9jayhzZWxmKToKLSAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgIk9fU0hMT0NLIik6Ci0gICAgICAgICAgICBmZDEgPSBvcy5vcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sCisgICAgICAgIGZkMSA9IG9zLm9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwKKyAgICAgICAgICAgICAgICAgICAgICBvcy5PX1dST05MWXxvcy5PX1NITE9DS3xvcy5PX0NSRUFUKQorICAgICAgICBmZDIgPSBvcy5vcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sCisgICAgICAgICAgICAgICAgICAgICAgb3MuT19XUk9OTFl8b3MuT19TSExPQ0t8b3MuT19DUkVBVCkKKyAgICAgICAgb3MuY2xvc2UoZmQyKQorICAgICAgICBvcy5jbG9zZShmZDEpCisKKyAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgIk9fRVhMT0NLIik6CisgICAgICAgICAgICBmZCA9IG9zLm9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5PX1dST05MWXxvcy5PX1NITE9DS3xvcy5PX0NSRUFUKQotICAgICAgICAgICAgZmQyID0gb3Mub3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLAotICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5PX1dST05MWXxvcy5PX1NITE9DS3xvcy5PX0NSRUFUKQotICAgICAgICAgICAgb3MuY2xvc2UoZmQyKQotICAgICAgICAgICAgb3MuY2xvc2UoZmQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgb3Mub3BlbiwgdGVzdF9zdXBwb3J0LlRFU1RGTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLk9fUkRPTkxZfG9zLk9fRVhMT0NLfG9zLk9fTk9OQkxPQ0spCisgICAgICAgICAgICBvcy5jbG9zZShmZCkKIAotICAgICAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgIk9fRVhMT0NLIik6Ci0gICAgICAgICAgICAgICAgZmQgPSBvcy5vcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLk9fV1JPTkxZfG9zLk9fU0hMT0NLfG9zLk9fQ1JFQVQpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgb3Mub3BlbiwgdGVzdF9zdXBwb3J0LlRFU1RGTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5PX1JET05MWXxvcy5PX0VYTE9DS3xvcy5PX05PTkJMT0NLKQotICAgICAgICAgICAgICAgIG9zLmNsb3NlKGZkKQotCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihwb3NpeCwgJ2ZzdGF0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QgbmVlZHMgcG9zaXguZnN0YXQoKScpCiAgICAgZGVmIHRlc3RfZnN0YXQoc2VsZik6Ci0gICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICdmc3RhdCcpOgotICAgICAgICAgICAgZnAgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4pCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvc2l4LmZzdGF0KGZwLmZpbGVubygpKSkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBmcCA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvc2l4LmZzdGF0KGZwLmZpbGVubygpKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIocG9zaXgsICdzdGF0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QgbmVlZHMgcG9zaXguc3RhdCgpJykKICAgICBkZWYgdGVzdF9zdGF0KHNlbGYpOgotICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAnc3RhdCcpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvc2l4LnN0YXQodGVzdF9zdXBwb3J0LlRFU1RGTikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3NpeC5zdGF0KHRlc3Rfc3VwcG9ydC5URVNURk4pKQogCi0gICAgZGVmIF90ZXN0X2FsbF9jaG93bl9jb21tb24oc2VsZiwgY2hvd25fZnVuYywgZmlyc3RfcGFyYW0pOgorICAgIGRlZiBfdGVzdF9hbGxfY2hvd25fY29tbW9uKHNlbGYsIGNob3duX2Z1bmMsIGZpcnN0X3BhcmFtLCBzdGF0X2Z1bmMpOgogICAgICAgICAiIiJDb21tb24gY29kZSBmb3IgY2hvd24sIGZjaG93biBhbmQgbGNob3duIHRlc3RzLiIiIgotICAgICAgICBpZiBvcy5nZXR1aWQoKSA9PSAwOgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICMgTWFueSBsaW51eCBkaXN0cm9zIGhhdmUgYSBuZnNub2JvZHkgdXNlciBhcyBNQVhfVUlELTIKLSAgICAgICAgICAgICAgICAjIHRoYXQgbWFrZXMgYSBnb29kIHRlc3QgY2FzZSBmb3Igc2lnbmVkbmVzcyBpc3N1ZXMuCi0gICAgICAgICAgICAgICAgIyAgIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxNzQ3ODU4Ci0gICAgICAgICAgICAgICAgIyBUaGlzIHBhcnQgb2YgdGhlIHRlc3Qgb25seSBydW5zIHdoZW4gcnVuIGFzIHJvb3QuCi0gICAgICAgICAgICAgICAgIyBPbmx5IHNjYXJ5IHBlb3BsZSBydW4gdGhlaXIgdGVzdHMgYXMgcm9vdC4KLSAgICAgICAgICAgICAgICBlbnQgPSBwd2QuZ2V0cHduYW0oJ25mc25vYm9keScpCi0gICAgICAgICAgICAgICAgY2hvd25fZnVuYyhmaXJzdF9wYXJhbSwgZW50LnB3X3VpZCwgZW50LnB3X2dpZCkKLSAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGRlZiBjaGVja19zdGF0KHVpZCwgZ2lkKToKKyAgICAgICAgICAgIGlmIHN0YXRfZnVuYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzdGF0ID0gc3RhdF9mdW5jKGZpcnN0X3BhcmFtKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdC5zdF91aWQsIHVpZCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXQuc3RfZ2lkLCBnaWQpCisgICAgICAgIHVpZCA9IG9zLmdldHVpZCgpCisgICAgICAgIGdpZCA9IG9zLmdldGdpZCgpCisgICAgICAgICMgdGVzdCBhIHN1Y2Nlc3NmdWwgY2hvd24gY2FsbAorICAgICAgICBjaG93bl9mdW5jKGZpcnN0X3BhcmFtLCB1aWQsIGdpZCkKKyAgICAgICAgY2hlY2tfc3RhdCh1aWQsIGdpZCkKKyAgICAgICAgY2hvd25fZnVuYyhmaXJzdF9wYXJhbSwgLTEsIGdpZCkKKyAgICAgICAgY2hlY2tfc3RhdCh1aWQsIGdpZCkKKyAgICAgICAgY2hvd25fZnVuYyhmaXJzdF9wYXJhbSwgdWlkLCAtMSkKKyAgICAgICAgY2hlY2tfc3RhdCh1aWQsIGdpZCkKKworICAgICAgICBpZiB1aWQgPT0gMDoKKyAgICAgICAgICAgICMgVHJ5IGFuIGFtdXNpbmdseSBsYXJnZSB1aWQvZ2lkIHRvIG1ha2Ugc3VyZSB3ZSBoYW5kbGUKKyAgICAgICAgICAgICMgbGFyZ2UgdW5zaWduZWQgdmFsdWVzLiAgKGNob3duIGxldHMgeW91IHVzZSBhbnkKKyAgICAgICAgICAgICMgdWlkL2dpZCB5b3UgbGlrZSwgZXZlbiBpZiB0aGV5IGFyZW4ndCBkZWZpbmVkLikKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgVGhpcyBwcm9ibGVtIGtlZXBzIGNvbWluZyB1cDoKKyAgICAgICAgICAgICMgICBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTc0Nzg1OAorICAgICAgICAgICAgIyAgIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU0NTkxCisgICAgICAgICAgICAjICAgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTE1MzAxCisgICAgICAgICAgICAjIEhvcGVmdWxseSB0aGUgZml4IGluIDQ1OTEgZml4ZXMgaXQgZm9yIGdvb2QhCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIFRoaXMgcGFydCBvZiB0aGUgdGVzdCBvbmx5IHJ1bnMgd2hlbiBydW4gYXMgcm9vdC4KKyAgICAgICAgICAgICMgT25seSBzY2FyeSBwZW9wbGUgcnVuIHRoZWlyIHRlc3RzIGFzIHJvb3QuCisKKyAgICAgICAgICAgIGJpZ192YWx1ZSA9IDIqKjMxCisgICAgICAgICAgICBjaG93bl9mdW5jKGZpcnN0X3BhcmFtLCBiaWdfdmFsdWUsIGJpZ192YWx1ZSkKKyAgICAgICAgICAgIGNoZWNrX3N0YXQoYmlnX3ZhbHVlLCBiaWdfdmFsdWUpCisgICAgICAgICAgICBjaG93bl9mdW5jKGZpcnN0X3BhcmFtLCAtMSwgLTEpCisgICAgICAgICAgICBjaGVja19zdGF0KGJpZ192YWx1ZSwgYmlnX3ZhbHVlKQorICAgICAgICAgICAgY2hvd25fZnVuYyhmaXJzdF9wYXJhbSwgdWlkLCBnaWQpCisgICAgICAgICAgICBjaGVja19zdGF0KHVpZCwgZ2lkKQorICAgICAgICBlbGlmIHBsYXRmb3JtLnN5c3RlbSgpIGluICgnSFAtVVgnLCAnU3VuT1MnKToKKyAgICAgICAgICAgICMgSFAtVVggYW5kIFNvbGFyaXMgY2FuIGFsbG93IGEgbm9uLXJvb3QgdXNlciB0byBjaG93bigpIHRvIHJvb3QKKyAgICAgICAgICAgICMgKGlzc3VlICM1MTEzKQorICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoIlNraXBwaW5nIGJlY2F1c2Ugb2Ygbm9uLXN0YW5kYXJkIGNob3duKCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlaGF2aW9yIikKICAgICAgICAgZWxzZToKICAgICAgICAgICAgICMgbm9uLXJvb3QgY2Fubm90IGNob3duIHRvIHJvb3QsIHJhaXNlcyBPU0Vycm9yCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBjaG93bl9mdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfcGFyYW0sIDAsIDApCi0KLSAgICAgICAgIyB0ZXN0IGEgc3VjY2Vzc2Z1bCBjaG93biBjYWxsCi0gICAgICAgIGNob3duX2Z1bmMoZmlyc3RfcGFyYW0sIG9zLmdldHVpZCgpLCBvcy5nZXRnaWQoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIGNob3duX2Z1bmMsIGZpcnN0X3BhcmFtLCAwLCAwKQorICAgICAgICAgICAgY2hlY2tfc3RhdCh1aWQsIGdpZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIGNob3duX2Z1bmMsIGZpcnN0X3BhcmFtLCAwLCAtMSkKKyAgICAgICAgICAgIGNoZWNrX3N0YXQodWlkLCBnaWQpCisgICAgICAgICAgICBpZiAwIG5vdCBpbiBvcy5nZXRncm91cHMoKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBjaG93bl9mdW5jLCBmaXJzdF9wYXJhbSwgLTEsIDApCisgICAgICAgICAgICAgICAgY2hlY2tfc3RhdCh1aWQsIGdpZCkKKyAgICAgICAgIyB0ZXN0IGlsbGVnYWwgdHlwZXMKKyAgICAgICAgZm9yIHQgaW4gc3RyLCBmbG9hdDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY2hvd25fZnVuYywgZmlyc3RfcGFyYW0sIHQodWlkKSwgZ2lkKQorICAgICAgICAgICAgY2hlY2tfc3RhdCh1aWQsIGdpZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY2hvd25fZnVuYywgZmlyc3RfcGFyYW0sIHVpZCwgdChnaWQpKQorICAgICAgICAgICAgY2hlY2tfc3RhdCh1aWQsIGdpZCkKIAogICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIocG9zaXgsICdjaG93bicpLCAidGVzdCBuZWVkcyBvcy5jaG93bigpIikKICAgICBkZWYgdGVzdF9jaG93bihzZWxmKToKQEAgLTI0Niw3ICszMTYsOCBAQAogCiAgICAgICAgICMgcmUtY3JlYXRlIHRoZSBmaWxlCiAgICAgICAgIG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgJ3cnKS5jbG9zZSgpCi0gICAgICAgIHNlbGYuX3Rlc3RfYWxsX2Nob3duX2NvbW1vbihwb3NpeC5jaG93biwgdGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5fdGVzdF9hbGxfY2hvd25fY29tbW9uKHBvc2l4LmNob3duLCB0ZXN0X3N1cHBvcnQuVEVTVEZOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihwb3NpeCwgJ3N0YXQnLCBOb25lKSkKIAogICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIocG9zaXgsICdmY2hvd24nKSwgInRlc3QgbmVlZHMgb3MuZmNob3duKCkiKQogICAgIGRlZiB0ZXN0X2ZjaG93bihzZWxmKToKQEAgLTI1Niw3ICszMjcsOCBAQAogICAgICAgICB0ZXN0X2ZpbGUgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICd3JykKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgZmQgPSB0ZXN0X2ZpbGUuZmlsZW5vKCkKLSAgICAgICAgICAgIHNlbGYuX3Rlc3RfYWxsX2Nob3duX2NvbW1vbihwb3NpeC5mY2hvd24sIGZkKQorICAgICAgICAgICAgc2VsZi5fdGVzdF9hbGxfY2hvd25fY29tbW9uKHBvc2l4LmZjaG93biwgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihwb3NpeCwgJ2ZzdGF0JywgTm9uZSkpCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICB0ZXN0X2ZpbGUuY2xvc2UoKQogCkBAIC0yNjUsNjYgKzMzNyw3OSBAQAogICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKICAgICAgICAgIyBjcmVhdGUgYSBzeW1saW5rCiAgICAgICAgIG9zLnN5bWxpbmsoX0RVTU1ZX1NZTUxJTkssIHRlc3Rfc3VwcG9ydC5URVNURk4pCi0gICAgICAgIHNlbGYuX3Rlc3RfYWxsX2Nob3duX2NvbW1vbihwb3NpeC5sY2hvd24sIHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYuX3Rlc3RfYWxsX2Nob3duX2NvbW1vbihwb3NpeC5sY2hvd24sIHRlc3Rfc3VwcG9ydC5URVNURk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKHBvc2l4LCAnbHN0YXQnLCBOb25lKSkKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIocG9zaXgsICdjaGRpcicpLCAndGVzdCBuZWVkcyBwb3NpeC5jaGRpcigpJykKICAgICBkZWYgdGVzdF9jaGRpcihzZWxmKToKLSAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ2NoZGlyJyk6Ci0gICAgICAgICAgICBwb3NpeC5jaGRpcihvcy5jdXJkaXIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBwb3NpeC5jaGRpciwgdGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgcG9zaXguY2hkaXIob3MuY3VyZGlyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBwb3NpeC5jaGRpciwgdGVzdF9zdXBwb3J0LlRFU1RGTikKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIocG9zaXgsICdsc2RpcicpLCAndGVzdCBuZWVkcyBwb3NpeC5sc2RpcigpJykKICAgICBkZWYgdGVzdF9sc2RpcihzZWxmKToKLSAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ2xzZGlyJyk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEluKHRlc3Rfc3VwcG9ydC5URVNURk4sIHBvc2l4LmxzZGlyKG9zLmN1cmRpcikpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgcG9zaXgubHNkaXIob3MuY3VyZGlyKSkKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIocG9zaXgsICdhY2Nlc3MnKSwgJ3Rlc3QgbmVlZHMgcG9zaXguYWNjZXNzKCknKQogICAgIGRlZiB0ZXN0X2FjY2VzcyhzZWxmKToKLSAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ2FjY2VzcycpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvc2l4LmFjY2Vzcyh0ZXN0X3N1cHBvcnQuVEVTVEZOLCBvcy5SX09LKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvc2l4LmFjY2Vzcyh0ZXN0X3N1cHBvcnQuVEVTVEZOLCBvcy5SX09LKSkKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIocG9zaXgsICd1bWFzaycpLCAndGVzdCBuZWVkcyBwb3NpeC51bWFzaygpJykKICAgICBkZWYgdGVzdF91bWFzayhzZWxmKToKLSAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ3VtYXNrJyk6Ci0gICAgICAgICAgICBvbGRfbWFzayA9IHBvc2l4LnVtYXNrKDApCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uob2xkX21hc2ssIGludCkKLSAgICAgICAgICAgIHBvc2l4LnVtYXNrKG9sZF9tYXNrKQorICAgICAgICBvbGRfbWFzayA9IHBvc2l4LnVtYXNrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShvbGRfbWFzaywgaW50KQorICAgICAgICBwb3NpeC51bWFzayhvbGRfbWFzaykKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIocG9zaXgsICdzdHJlcnJvcicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0IG5lZWRzIHBvc2l4LnN0cmVycm9yKCknKQogICAgIGRlZiB0ZXN0X3N0cmVycm9yKHNlbGYpOgotICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAnc3RyZXJyb3InKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3NpeC5zdHJlcnJvcigwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvc2l4LnN0cmVycm9yKDApKQogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihwb3NpeCwgJ3BpcGUnKSwgJ3Rlc3QgbmVlZHMgcG9zaXgucGlwZSgpJykKICAgICBkZWYgdGVzdF9waXBlKHNlbGYpOgotICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAncGlwZScpOgotICAgICAgICAgICAgcmVhZGVyLCB3cml0ZXIgPSBwb3NpeC5waXBlKCkKLSAgICAgICAgICAgIG9zLmNsb3NlKHJlYWRlcikKLSAgICAgICAgICAgIG9zLmNsb3NlKHdyaXRlcikKKyAgICAgICAgcmVhZGVyLCB3cml0ZXIgPSBwb3NpeC5waXBlKCkKKyAgICAgICAgb3MuY2xvc2UocmVhZGVyKQorICAgICAgICBvcy5jbG9zZSh3cml0ZXIpCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKHBvc2l4LCAndGVtcG5hbScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0IG5lZWRzIHBvc2l4LnRlbXBuYW0oKScpCiAgICAgZGVmIHRlc3RfdGVtcG5hbShzZWxmKToKLSAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ3RlbXBuYW0nKToKLSAgICAgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgInRlbXBuYW0iLCBEZXByZWNhdGlvbldhcm5pbmcpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvc2l4LnRlbXBuYW0oKSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocG9zaXgudGVtcG5hbShvcy5jdXJkaXIpKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3NpeC50ZW1wbmFtKG9zLmN1cmRpciwgJ2JsYWgnKSkKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJ0ZW1wbmFtIiwgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvc2l4LnRlbXBuYW0oKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3NpeC50ZW1wbmFtKG9zLmN1cmRpcikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocG9zaXgudGVtcG5hbShvcy5jdXJkaXIsICdibGFoJykpCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKHBvc2l4LCAndG1wZmlsZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0IG5lZWRzIHBvc2l4LnRtcGZpbGUoKScpCiAgICAgZGVmIHRlc3RfdG1wZmlsZShzZWxmKToKLSAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ3RtcGZpbGUnKToKLSAgICAgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgInRtcGZpbGUiLCBEZXByZWNhdGlvbldhcm5pbmcpCi0gICAgICAgICAgICAgICAgZnAgPSBwb3NpeC50bXBmaWxlKCkKLSAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAidG1wZmlsZSIsIERlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgICAgIGZwID0gcG9zaXgudG1wZmlsZSgpCisgICAgICAgICAgICBmcC5jbG9zZSgpCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKHBvc2l4LCAndXRpbWUnKSwgJ3Rlc3QgbmVlZHMgcG9zaXgudXRpbWUoKScpCiAgICAgZGVmIHRlc3RfdXRpbWUoc2VsZik6Ci0gICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICd1dGltZScpOgotICAgICAgICAgICAgbm93ID0gdGltZS50aW1lKCkKLSAgICAgICAgICAgIHBvc2l4LnV0aW1lKHRlc3Rfc3VwcG9ydC5URVNURk4sIE5vbmUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBvc2l4LnV0aW1lLCB0ZXN0X3N1cHBvcnQuVEVTVEZOLCAoTm9uZSwgTm9uZSkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBvc2l4LnV0aW1lLCB0ZXN0X3N1cHBvcnQuVEVTVEZOLCAobm93LCBOb25lKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcG9zaXgudXRpbWUsIHRlc3Rfc3VwcG9ydC5URVNURk4sIChOb25lLCBub3cpKQotICAgICAgICAgICAgcG9zaXgudXRpbWUodGVzdF9zdXBwb3J0LlRFU1RGTiwgKGludChub3cpLCBpbnQobm93KSkpCi0gICAgICAgICAgICBwb3NpeC51dGltZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAobm93LCBub3cpKQorICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQorICAgICAgICBwb3NpeC51dGltZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBvc2l4LnV0aW1lLCB0ZXN0X3N1cHBvcnQuVEVTVEZOLCAoTm9uZSwgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcG9zaXgudXRpbWUsIHRlc3Rfc3VwcG9ydC5URVNURk4sIChub3csIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBvc2l4LnV0aW1lLCB0ZXN0X3N1cHBvcnQuVEVTVEZOLCAoTm9uZSwgbm93KSkKKyAgICAgICAgcG9zaXgudXRpbWUodGVzdF9zdXBwb3J0LlRFU1RGTiwgKGludChub3cpLCBpbnQobm93KSkpCisgICAgICAgIHBvc2l4LnV0aW1lKHRlc3Rfc3VwcG9ydC5URVNURk4sIChub3csIG5vdykpCiAKICAgICBkZWYgX3Rlc3RfY2hmbGFnc19yZWd1bGFyX2ZpbGUoc2VsZiwgY2hmbGFnc19mdW5jLCB0YXJnZXRfZmlsZSk6CiAgICAgICAgIHN0ID0gb3Muc3RhdCh0YXJnZXRfZmlsZSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoc3QsICdzdF9mbGFncycpKQotICAgICAgICBjaGZsYWdzX2Z1bmModGFyZ2V0X2ZpbGUsIHN0LnN0X2ZsYWdzIHwgc3RhdC5VRl9JTU1VVEFCTEUpCisKKyAgICAgICAgIyBaRlMgcmV0dXJucyBFT1BOT1RTVVBQIHdoZW4gYXR0ZW1wdGluZyB0byBzZXQgZmxhZyBVRl9JTU1VVEFCTEUuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNoZmxhZ3NfZnVuYyh0YXJnZXRfZmlsZSwgc3Quc3RfZmxhZ3MgfCBzdGF0LlVGX0lNTVVUQUJMRSkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXJyOgorICAgICAgICAgICAgaWYgZXJyLmVycm5vICE9IGVycm5vLkVPUE5PVFNVUFA6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIG1zZyA9ICdjaGZsYWcgVUZfSU1NVVRBQkxFIG5vdCBzdXBwb3J0ZWQgYnkgdW5kZXJseWluZyBmcycKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QobXNnKQorCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG5ld19zdCA9IG9zLnN0YXQodGFyZ2V0X2ZpbGUpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0LnN0X2ZsYWdzIHwgc3RhdC5VRl9JTU1VVEFCTEUsIG5ld19zdC5zdF9mbGFncykKQEAgLTM1Myw4ICs0MzgsMTYgQEAKICAgICAgICAgc2VsZi50ZWFyZG93bl9maWxlcy5hcHBlbmQoX0RVTU1ZX1NZTUxJTkspCiAgICAgICAgIGR1bW15X3N5bWxpbmtfc3QgPSBvcy5sc3RhdChfRFVNTVlfU1lNTElOSykKIAotICAgICAgICBwb3NpeC5sY2hmbGFncyhfRFVNTVlfU1lNTElOSywKLSAgICAgICAgICAgICAgICAgICAgICAgZHVtbXlfc3ltbGlua19zdC5zdF9mbGFncyB8IHN0YXQuVUZfSU1NVVRBQkxFKQorICAgICAgICAjIFpGUyByZXR1cm5zIEVPUE5PVFNVUFAgd2hlbiBhdHRlbXB0aW5nIHRvIHNldCBmbGFnIFVGX0lNTVVUQUJMRS4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcG9zaXgubGNoZmxhZ3MoX0RVTU1ZX1NZTUxJTkssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1teV9zeW1saW5rX3N0LnN0X2ZsYWdzIHwgc3RhdC5VRl9JTU1VVEFCTEUpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGVycjoKKyAgICAgICAgICAgIGlmIGVyci5lcnJubyAhPSBlcnJuby5FT1BOT1RTVVBQOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBtc2cgPSAnY2hmbGFnIFVGX0lNTVVUQUJMRSBub3Qgc3VwcG9ydGVkIGJ5IHVuZGVybHlpbmcgZnMnCisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KG1zZykKKwogICAgICAgICB0cnk6CiAgICAgICAgICAgICBuZXdfdGVzdGZuX3N0ID0gb3Muc3RhdCh0ZXN0X3N1cHBvcnQuVEVTVEZOKQogICAgICAgICAgICAgbmV3X2R1bW15X3N5bWxpbmtfc3QgPSBvcy5sc3RhdChfRFVNTVlfU1lNTElOSykKQEAgLTM2NSw1NyArNDU4LDcxIEBACiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBwb3NpeC5sY2hmbGFncyhfRFVNTVlfU1lNTElOSywgZHVtbXlfc3ltbGlua19zdC5zdF9mbGFncykKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIocG9zaXgsICdnZXRjd2QnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdCBuZWVkcyBwb3NpeC5nZXRjd2QoKScpCiAgICAgZGVmIHRlc3RfZ2V0Y3dkX2xvbmdfcGF0aG5hbWVzKHNlbGYpOgotICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAnZ2V0Y3dkJyk6Ci0gICAgICAgICAgICBkaXJuYW1lID0gJ2dldGN3ZC10ZXN0LWRpcmVjdG9yeS0wMTIzNDU2Nzg5YWJjZGVmLTAxMjM0NTY3ODkwYWJjZGVmJwotICAgICAgICAgICAgY3VyZGlyID0gb3MuZ2V0Y3dkKCkKLSAgICAgICAgICAgIGJhc2VfcGF0aCA9IG9zLnBhdGguYWJzcGF0aCh0ZXN0X3N1cHBvcnQuVEVTVEZOKSArICcuZ2V0Y3dkJworICAgICAgICBkaXJuYW1lID0gJ2dldGN3ZC10ZXN0LWRpcmVjdG9yeS0wMTIzNDU2Nzg5YWJjZGVmLTAxMjM0NTY3ODkwYWJjZGVmJworICAgICAgICBjdXJkaXIgPSBvcy5nZXRjd2QoKQorICAgICAgICBiYXNlX3BhdGggPSBvcy5wYXRoLmFic3BhdGgodGVzdF9zdXBwb3J0LlRFU1RGTikgKyAnLmdldGN3ZCcKIAotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIG9zLm1rZGlyKGJhc2VfcGF0aCkKLSAgICAgICAgICAgICAgICBvcy5jaGRpcihiYXNlX3BhdGgpCi0gICAgICAgICAgICBleGNlcHQ6Ci0jICAgICAgICAgICAgICAgSnVzdCByZXR1cm5pbmcgbm90aGluZyBpbnN0ZWFkIG9mIHRoZSBTa2lwVGVzdCBleGNlcHRpb24sCi0jICAgICAgICAgICAgICAgYmVjYXVzZSB0aGUgdGVzdCByZXN1bHRzIGluIEVycm9yIGluIHRoYXQgY2FzZS4KLSMgICAgICAgICAgICAgICBJcyB0aGF0IG9rPwotIyAgICAgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCwgImNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5IGZvciB0ZXN0aW5nIgotICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5ta2RpcihiYXNlX3BhdGgpCisgICAgICAgICAgICBvcy5jaGRpcihiYXNlX3BhdGgpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoImNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5IGZvciB0ZXN0aW5nIikKIAotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGRlZiBfY3JlYXRlX2FuZF9kb19nZXRjd2QoZGlybmFtZSwgY3VycmVudF9wYXRoX2xlbmd0aCA9IDApOgotICAgICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcy5ta2RpcihkaXJuYW1lKQotICAgICAgICAgICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCwgIm1rZGlyIGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5IHN1ZmZpY2llbnRseSBkZWVwIGZvciBnZXRjd2QgdGVzdCIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVmIF9jcmVhdGVfYW5kX2RvX2dldGN3ZChkaXJuYW1lLCBjdXJyZW50X3BhdGhfbGVuZ3RoID0gMCk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBvcy5ta2RpcihkaXJuYW1lKQorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgibWtkaXIgY2Fubm90IGNyZWF0ZSBkaXJlY3Rvcnkgc3VmZmljaWVudGx5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVlcCBmb3IgZ2V0Y3dkIHRlc3QiKQogCi0gICAgICAgICAgICAgICAgICAgIG9zLmNoZGlyKGRpcm5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgICAgIG9zLmdldGN3ZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiBjdXJyZW50X3BhdGhfbGVuZ3RoIDwgNDA5OToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY3JlYXRlX2FuZF9kb19nZXRjd2QoZGlybmFtZSwgY3VycmVudF9wYXRoX2xlbmd0aCArIGxlbihkaXJuYW1lKSArIDEpCi0gICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9lcnJubyA9IGVycm5vLkVOQU1FVE9PTE9ORwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgJ3N1bm9zJyBpbiBzeXMucGxhdGZvcm0gb3IgJ29wZW5ic2QnIGluIHN5cy5wbGF0Zm9ybToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9lcnJubyA9IGVycm5vLkVSQU5HRSAjIElzc3VlIDkxODUKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5lcnJubywgZXhwZWN0ZWRfZXJybm8pCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcy5jaGRpcignLi4nKQotICAgICAgICAgICAgICAgICAgICAgICAgb3Mucm1kaXIoZGlybmFtZSkKKyAgICAgICAgICAgICAgICBvcy5jaGRpcihkaXJuYW1lKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb3MuZ2V0Y3dkKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgY3VycmVudF9wYXRoX2xlbmd0aCA8IDQwOTk6CisgICAgICAgICAgICAgICAgICAgICAgICBfY3JlYXRlX2FuZF9kb19nZXRjd2QoZGlybmFtZSwgY3VycmVudF9wYXRoX2xlbmd0aCArIGxlbihkaXJuYW1lKSArIDEpCisgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfZXJybm8gPSBlcnJuby5FTkFNRVRPT0xPTkcKKyAgICAgICAgICAgICAgICAgICAgIyBUaGUgZm9sbG93aW5nIHBsYXRmb3JtcyBoYXZlIHF1aXJreSBnZXRjd2QoKQorICAgICAgICAgICAgICAgICAgICAjIGJlaGF2aW91ciAtLSBzZWUgaXNzdWUgOTE4NSBhbmQgMTU3NjUgZm9yCisgICAgICAgICAgICAgICAgICAgICMgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgcXVpcmt5X3BsYXRmb3JtID0gKAorICAgICAgICAgICAgICAgICAgICAgICAgJ3N1bm9zJyBpbiBzeXMucGxhdGZvcm0gb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICduZXRic2QnIGluIHN5cy5wbGF0Zm9ybSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgJ29wZW5ic2QnIGluIHN5cy5wbGF0Zm9ybQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIGlmIHF1aXJreV9wbGF0Zm9ybToKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2Vycm5vID0gZXJybm8uRVJBTkdFCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5lcnJubywgZXhwZWN0ZWRfZXJybm8pCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgb3MuY2hkaXIoJy4uJykKKyAgICAgICAgICAgICAgICAgICAgb3Mucm1kaXIoZGlybmFtZSkKIAotICAgICAgICAgICAgICAgIF9jcmVhdGVfYW5kX2RvX2dldGN3ZChkaXJuYW1lKQorICAgICAgICAgICAgX2NyZWF0ZV9hbmRfZG9fZ2V0Y3dkKGRpcm5hbWUpCiAKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgb3MuY2hkaXIoY3VyZGlyKQotICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoYmFzZV9wYXRoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuY2hkaXIoY3VyZGlyKQorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShiYXNlX3BhdGgpCiAKICAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAnZ2V0ZWdpZCcpLCAidGVzdCBuZWVkcyBvcy5nZXRlZ2lkKCkiKQogICAgIGRlZiB0ZXN0X2dldGdyb3VwcyhzZWxmKToKLSAgICAgICAgd2l0aCBvcy5wb3BlbignaWQgLUcnKSBhcyBpZGc6CisgICAgICAgIHdpdGggb3MucG9wZW4oJ2lkIC1HIDI+L2Rldi9udWxsJykgYXMgaWRnOgogICAgICAgICAgICAgZ3JvdXBzID0gaWRnLnJlYWQoKS5zdHJpcCgpCisgICAgICAgICAgICByZXQgPSBpZGcuY2xvc2UoKQogCi0gICAgICAgIGlmIG5vdCBncm91cHM6CisgICAgICAgIGlmIHJldCAhPSBOb25lIG9yIG5vdCBncm91cHM6CiAgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgibmVlZCB3b3JraW5nICdpZCAtRyciKQogCisgICAgICAgICMgSXNzdWVzIDE2Njk4OiBPUyBYIEFCSXMgcHJpb3IgdG8gMTAuNiBoYXZlIGxpbWl0cyBvbiBnZXRncm91cHMoKQorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgICAgICBpbXBvcnQgc3lzY29uZmlnCisgICAgICAgICAgICBkdCA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJykgb3IgJzEwLjAnCisgICAgICAgICAgICBpZiB0dXBsZShpbnQobikgZm9yIG4gaW4gZHQuc3BsaXQoJy4nKVswOjJdKSA8ICgxMCwgNik6CisgICAgICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoImdldGdyb3VwcygyKSBpcyBicm9rZW4gcHJpb3IgdG8gMTAuNiIpCisKICAgICAgICAgIyAnaWQgLUcnIGFuZCAnb3MuZ2V0Z3JvdXBzKCknIHNob3VsZCByZXR1cm4gdGhlIHNhbWUKICAgICAgICAgIyBncm91cHMsIGlnbm9yaW5nIG9yZGVyIGFuZCBkdXBsaWNhdGVzLgogICAgICAgICAjICMxMDgyMiAtIGl0IGlzIGltcGxlbWVudGF0aW9uIGRlZmluZWQgd2hldGhlciBwb3NpeC5nZXRncm91cHMoKQpAQCAtNDQzLDE3ICs1NTAsMTcgQEAKICAgICAgICAgICAgIHBvc2l4LmluaXRncm91cHMobmFtZSwgc2VsZi5zYXZlZF9ncm91cHNbMF0pCiAKICAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKHBvc2l4LCAnaW5pdGdyb3VwcycpLAotICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0IG5lZWRzIHBvc2l4LmluaXRncm91cHMoKSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QgbmVlZHMgcG9zaXguaW5pdGdyb3VwcygpJykKICAgICBkZWYgdGVzdF9pbml0Z3JvdXBzKHNlbGYpOgogICAgICAgICAjIGZpbmQgbWlzc2luZyBncm91cAogCi0gICAgICAgIGcgPSBtYXgoc2VsZi5zYXZlZF9ncm91cHMpICsgMQorICAgICAgICBnID0gbWF4KHNlbGYuc2F2ZWRfZ3JvdXBzIG9yIFswXSkgKyAxCiAgICAgICAgIG5hbWUgPSBwd2QuZ2V0cHd1aWQocG9zaXguZ2V0dWlkKCkpLnB3X25hbWUKICAgICAgICAgcG9zaXguaW5pdGdyb3VwcyhuYW1lLCBnKQogICAgICAgICBzZWxmLmFzc2VydEluKGcsIHBvc2l4LmdldGdyb3VwcygpKQogCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihwb3NpeCwgJ3NldGdyb3VwcycpLAotICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0IG5lZWRzIHBvc2l4LnNldGdyb3VwcygpIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdCBuZWVkcyBwb3NpeC5zZXRncm91cHMoKScpCiAgICAgZGVmIHRlc3Rfc2V0Z3JvdXBzKHNlbGYpOgogICAgICAgICBmb3IgZ3JvdXBzIGluIFtbMF0sIHJhbmdlKDE2KV06CiAgICAgICAgICAgICBwb3NpeC5zZXRncm91cHMoZ3JvdXBzKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wb3NpeHBhdGgucHkgYi9MaWIvdGVzdC90ZXN0X3Bvc2l4cGF0aC5weQppbmRleCA4YmI3OGQ2Li5mNzRkYzE0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3Bvc2l4cGF0aC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3Bvc2l4cGF0aC5weQpAQCAtOSw2ICs5LDE2IEBACiAKIEFCU1RGTiA9IGFic3BhdGgodGVzdF9zdXBwb3J0LlRFU1RGTikKIAorZGVmIHNraXBfaWZfQUJTVEZOX2NvbnRhaW5zX2JhY2tzbGFzaCh0ZXN0KToKKyAgICAiIiIKKyAgICBPbiBXaW5kb3dzLCBwb3NpeHBhdGguYWJzcGF0aCBzdGlsbCByZXR1cm5zIHBhdGhzIHdpdGggYmFja3NsYXNoZXMKKyAgICBpbnN0ZWFkIG9mIHBvc2l4IGZvcndhcmQgc2xhc2hlcy4gSWYgdGhpcyBpcyB0aGUgY2FzZSwgc2V2ZXJhbCB0ZXN0cworICAgIGZhaWwsIHNvIHNraXAgdGhlbS4KKyAgICAiIiIKKyAgICBmb3VuZF9iYWNrc2xhc2ggPSAnXFwnIGluIEFCU1RGTgorICAgIG1zZyA9ICJBQlNURk4gaXMgbm90IGEgcG9zaXggcGF0aCAtIHRlc3RzIGZhaWwiCisgICAgcmV0dXJuIFt0ZXN0LCB1bml0dGVzdC5za2lwKG1zZykodGVzdCldW2ZvdW5kX2JhY2tzbGFzaF0KKwogZGVmIHNhZmVfcm1kaXIoZGlybmFtZSk6CiAgICAgdHJ5OgogICAgICAgICBvcy5ybWRpcihkaXJuYW1lKQpAQCAtMTEwLDggKzEyMCwxMCBAQAogICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgVHJ1ZQogICAgICAgICAgICAgKQotICAgICAgICAgICAgIyBJZiB3ZSBkb24ndCBoYXZlIGxpbmtzLCBhc3N1bWUgdGhhdCBvcy5zdGF0IGRvZXNuJ3QgcmV0dXJuIHJlc29uYWJsZQotICAgICAgICAgICAgIyBpbm9kZSBpbmZvcm1hdGlvbiBhbmQgdGh1cywgdGhhdCBzYW1lZmlsZSgpIGRvZXNuJ3Qgd29yaworCisgICAgICAgICAgICAjIElmIHdlIGRvbid0IGhhdmUgbGlua3MsIGFzc3VtZSB0aGF0IG9zLnN0YXQgZG9lc24ndCByZXR1cm4KKyAgICAgICAgICAgICMgcmVhc29uYWJsZSBpbm9kZSBpbmZvcm1hdGlvbiBhbmQgdGh1cywgdGhhdCBzYW1lZmlsZSgpIGRvZXNuJ3QKKyAgICAgICAgICAgICMgd29yay4KICAgICAgICAgICAgIGlmIGhhc2F0dHIob3MsICJzeW1saW5rIik6CiAgICAgICAgICAgICAgICAgb3Muc3ltbGluaygKICAgICAgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LlRFU1RGTiArICIxIiwKQEAgLTE1MSwxOSArMTYzLDE5IEBACiAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICBUcnVlCiAgICAgICAgICAgICApCi0gICAgICAgICAgICAjIElmIHdlIGRvbid0IGhhdmUgbGlua3MsIGFzc3VtZSB0aGF0IG9zLnN0YXQoKSBkb2Vzbid0IHJldHVybiByZXNvbmFibGUKLSAgICAgICAgICAgICMgaW5vZGUgaW5mb3JtYXRpb24gYW5kIHRodXMsIHRoYXQgc2FtZWZpbGUoKSBkb2Vzbid0IHdvcmsKKyAgICAgICAgICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSBsaW5rcywgYXNzdW1lIHRoYXQgb3Muc3RhdCgpIGRvZXNuJ3QgcmV0dXJuCisgICAgICAgICAgICAjIHJlYXNvbmFibGUgaW5vZGUgaW5mb3JtYXRpb24gYW5kIHRodXMsIHRoYXQgc2FtZXN0YXQoKSBkb2Vzbid0CisgICAgICAgICAgICAjIHdvcmsuCiAgICAgICAgICAgICBpZiBoYXNhdHRyKG9zLCAic3ltbGluayIpOgotICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIob3MsICJzeW1saW5rIik6Ci0gICAgICAgICAgICAgICAgICAgIG9zLnN5bWxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTiArICIxIiwgdGVzdF9zdXBwb3J0LlRFU1RGTiArICIyIikKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcygKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l4cGF0aC5zYW1lc3RhdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5zdGF0KHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnN0YXQodGVzdF9zdXBwb3J0LlRFU1RGTiArICIyIikKLSAgICAgICAgICAgICAgICAgICAgICAgICksCi0gICAgICAgICAgICAgICAgICAgICAgICBUcnVlCi0gICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMiIpCisgICAgICAgICAgICAgICAgb3Muc3ltbGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjEiLCB0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjIiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoCisgICAgICAgICAgICAgICAgICAgIHBvc2l4cGF0aC5zYW1lc3RhdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zLnN0YXQodGVzdF9zdXBwb3J0LlRFU1RGTiArICIxIiksCisgICAgICAgICAgICAgICAgICAgICAgICBvcy5zdGF0KHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMiIpCisgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgICAgIFRydWUKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMiIpCiAgICAgICAgICAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiArICIyIiwgIndiIikKICAgICAgICAgICAgICAgICBmLndyaXRlKCJiYXIiKQogICAgICAgICAgICAgICAgIGYuY2xvc2UoKQpAQCAtMjAxLDYgKzIxMyw3IEBACiAgICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5FbnZpcm9ubWVudFZhckd1YXJkKCkgYXMgZW52OgogICAgICAgICAgICAgICAgIGVudlsnSE9NRSddID0gJy8nCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGguZXhwYW5kdXNlcigifiIpLCAiLyIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGguZXhwYW5kdXNlcigifi9mb28iKSwgIi9mb28iKQogCiAgICAgZGVmIHRlc3Rfbm9ybXBhdGgoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLm5vcm1wYXRoKCIiKSwgIi4iKQpAQCAtMjExLDYgKzIyNCwxOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5ub3JtcGF0aCgiLy8vZm9vLy4vL2Jhci8vLi8vLi4vLy4vL2JheiIpLCAiL2Zvby9iYXoiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5ub3JtcGF0aCgiLy8vLi4vLy4vZm9vLy4vL2JhciIpLCAiL2Zvby9iYXIiKQogCisgICAgQHNraXBfaWZfQUJTVEZOX2NvbnRhaW5zX2JhY2tzbGFzaAorICAgIGRlZiB0ZXN0X3JlYWxwYXRoX2N1cmRpcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscGF0aCgnLicpLCBvcy5nZXRjd2QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscGF0aCgnLi8uJyksIG9zLmdldGN3ZCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxwYXRoKCcvJy5qb2luKFsnLiddICogMTAwKSksIG9zLmdldGN3ZCgpKQorCisgICAgQHNraXBfaWZfQUJTVEZOX2NvbnRhaW5zX2JhY2tzbGFzaAorICAgIGRlZiB0ZXN0X3JlYWxwYXRoX3BhcmRpcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscGF0aCgnLi4nKSwgZGlybmFtZShvcy5nZXRjd2QoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhbHBhdGgoJy4uLy4uJyksIGRpcm5hbWUoZGlybmFtZShvcy5nZXRjd2QoKSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxwYXRoKCcvJy5qb2luKFsnLi4nXSAqIDEwMCkpLCAnLycpCisKICAgICBpZiBoYXNhdHRyKG9zLCAic3ltbGluayIpOgogICAgICAgICBkZWYgdGVzdF9yZWFscGF0aF9iYXNpYyhzZWxmKToKICAgICAgICAgICAgICMgQmFzaWMgb3BlcmF0aW9uLgpAQCAtMjMzLDYgKzI1OCwyMiBAQAogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhbHBhdGgoQUJTVEZOKyIxIiksIEFCU1RGTisiMSIpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscGF0aChBQlNURk4rIjIiKSwgQUJTVEZOKyIyIikKIAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhbHBhdGgoQUJTVEZOKyIxL3giKSwgQUJTVEZOKyIxL3giKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhbHBhdGgoQUJTVEZOKyIxLy4uIiksIGRpcm5hbWUoQUJTVEZOKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxwYXRoKEFCU1RGTisiMS8uLi94IiksIGRpcm5hbWUoQUJTVEZOKSArICIveCIpCisgICAgICAgICAgICAgICAgb3Muc3ltbGluayhBQlNURk4rIngiLCBBQlNURk4rInkiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhbHBhdGgoQUJTVEZOKyIxLy4uLyIgKyBiYXNlbmFtZShBQlNURk4pICsgInkiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTVEZOICsgInkiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhbHBhdGgoQUJTVEZOKyIxLy4uLyIgKyBiYXNlbmFtZShBQlNURk4pICsgIjEiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTVEZOICsgIjEiKQorCisgICAgICAgICAgICAgICAgb3Muc3ltbGluayhiYXNlbmFtZShBQlNURk4pICsgImEvYiIsIEFCU1RGTisiYSIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscGF0aChBQlNURk4rImEiKSwgQUJTVEZOKyJhL2IiKQorCisgICAgICAgICAgICAgICAgb3Muc3ltbGluaygiLi4vIiArIGJhc2VuYW1lKGRpcm5hbWUoQUJTVEZOKSkgKyAiLyIgKworICAgICAgICAgICAgICAgICAgICAgICAgYmFzZW5hbWUoQUJTVEZOKSArICJjIiwgQUJTVEZOKyJjIikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxwYXRoKEFCU1RGTisiYyIpLCBBQlNURk4rImMiKQorCiAgICAgICAgICAgICAgICAgIyBUZXN0IHVzaW5nIHJlbGF0aXZlIHBhdGggYXMgd2VsbC4KICAgICAgICAgICAgICAgICBvcy5jaGRpcihkaXJuYW1lKEFCU1RGTikpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscGF0aChiYXNlbmFtZShBQlNURk4pKSwgQUJTVEZOKQpAQCAtMjQxLDYgKzI4Miw0MCBAQAogICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoQUJTVEZOKQogICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoQUJTVEZOKyIxIikKICAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKEFCU1RGTisiMiIpCisgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhBQlNURk4rInkiKQorICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoQUJTVEZOKyJjIikKKyAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKEFCU1RGTisiYSIpCisKKyAgICAgICAgZGVmIHRlc3RfcmVhbHBhdGhfcmVwZWF0ZWRfaW5kaXJlY3Rfc3ltbGlua3Moc2VsZik6CisgICAgICAgICAgICAjIElzc3VlICM2OTc1LgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLm1rZGlyKEFCU1RGTikKKyAgICAgICAgICAgICAgICBvcy5zeW1saW5rKCcuLi8nICsgYmFzZW5hbWUoQUJTVEZOKSwgQUJTVEZOICsgJy9zZWxmJykKKyAgICAgICAgICAgICAgICBvcy5zeW1saW5rKCdzZWxmL3NlbGYvc2VsZicsIEFCU1RGTiArICcvbGluaycpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscGF0aChBQlNURk4gKyAnL2xpbmsnKSwgQUJTVEZOKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKEFCU1RGTiArICcvc2VsZicpCisgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhBQlNURk4gKyAnL2xpbmsnKQorICAgICAgICAgICAgICAgIHNhZmVfcm1kaXIoQUJTVEZOKQorCisgICAgICAgIGRlZiB0ZXN0X3JlYWxwYXRoX2RlZXBfcmVjdXJzaW9uKHNlbGYpOgorICAgICAgICAgICAgZGVwdGggPSAxMAorICAgICAgICAgICAgb2xkX3BhdGggPSBhYnNwYXRoKCcuJykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5ta2RpcihBQlNURk4pCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoZGVwdGgpOgorICAgICAgICAgICAgICAgICAgICBvcy5zeW1saW5rKCcvJy5qb2luKFsnJWQnICUgaV0gKiAxMCksIEFCU1RGTiArICcvJWQnICUgKGkgKyAxKSkKKyAgICAgICAgICAgICAgICBvcy5zeW1saW5rKCcuJywgQUJTVEZOICsgJy8wJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxwYXRoKEFCU1RGTiArICcvJWQnICUgZGVwdGgpLCBBQlNURk4pCisKKyAgICAgICAgICAgICAgICAjIFRlc3QgdXNpbmcgcmVsYXRpdmUgcGF0aCBhcyB3ZWxsLgorICAgICAgICAgICAgICAgIG9zLmNoZGlyKEFCU1RGTikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxwYXRoKCclZCcgJSBkZXB0aCksIEFCU1RGTikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgb3MuY2hkaXIob2xkX3BhdGgpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoZGVwdGggKyAxKToKKyAgICAgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhBQlNURk4gKyAnLyVkJyAlIGkpCisgICAgICAgICAgICAgICAgc2FmZV9ybWRpcihBQlNURk4pCiAKICAgICAgICAgZGVmIHRlc3RfcmVhbHBhdGhfcmVzb2x2ZV9wYXJlbnRzKHNlbGYpOgogICAgICAgICAgICAgIyBXZSBhbHNvIG5lZWQgdG8gcmVzb2x2ZSBhbnkgc3ltbGlua3MgaW4gdGhlIHBhcmVudHMgb2YgYSByZWxhdGl2ZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wcHJpbnQucHkgYi9MaWIvdGVzdC90ZXN0X3BwcmludC5weQppbmRleCBlMDEzN2RmLi41MDQ5M2Y2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BwcmludC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BwcmludC5weQpAQCAtMjQsNiArMjQsMjAgQEAKICAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgIHJldHVybiB0dXBsZS5fX3JlcHJfXyhzZWxmKQogCitjbGFzcyBzZXQyKHNldCk6CisgICAgcGFzcworCitjbGFzcyBzZXQzKHNldCk6CisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2V0Ll9fcmVwcl9fKHNlbGYpCisKK2NsYXNzIGZyb3plbnNldDIoZnJvemVuc2V0KToKKyAgICBwYXNzCisKK2NsYXNzIGZyb3plbnNldDMoZnJvemVuc2V0KToKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiBmcm96ZW5zZXQuX19yZXByX18oc2VsZikKKwogY2xhc3MgZGljdDIoZGljdCk6CiAgICAgcGFzcwogCkBAIC0xMTQsMjIgKzEyOCwyNCBAQAogICAgICAgICBmb3Igc2ltcGxlIGluICgwLCAwTCwgMCswaiwgMC4wLCAiIiwgdW5pKCIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgKCksIHR1cGxlMigpLCB0dXBsZTMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgW10sIGxpc3QyKCksIGxpc3QzKCksCisgICAgICAgICAgICAgICAgICAgICAgIHNldCgpLCBzZXQyKCksIHNldDMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KCksIGZyb3plbnNldDIoKSwgZnJvemVuc2V0MygpLAogICAgICAgICAgICAgICAgICAgICAgICB7fSwgZGljdDIoKSwgZGljdDMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlLCBwcHJpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIC02LCAtNkwsIC02LTZqLCAtMS41LCAieCIsIHVuaSgieCIpLCAoMywpLCBbM10sIHszOiA2fSwKICAgICAgICAgICAgICAgICAgICAgICAgKDEsMiksIFszLDRdLCB7NTogNn0sCiAgICAgICAgICAgICAgICAgICAgICAgIHR1cGxlMigoMSwyKSksIHR1cGxlMygoMSwyKSksIHR1cGxlMyhyYW5nZSgxMDApKSwKICAgICAgICAgICAgICAgICAgICAgICAgWzMsNF0sIGxpc3QyKFszLDRdKSwgbGlzdDMoWzMsNF0pLCBsaXN0MyhyYW5nZSgxMDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2V0KHs3fSksIHNldDIoezd9KSwgc2V0Myh7N30pLAorICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoezh9KSwgZnJvemVuc2V0Mih7OH0pLCBmcm96ZW5zZXQzKHs4fSksCiAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QyKHs1OiA2fSksIGRpY3QzKHs1OiA2fSksCiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlKDEwLCAtMTEsIC0xKQogICAgICAgICAgICAgICAgICAgICAgICk6CiAgICAgICAgICAgICBuYXRpdmUgPSByZXByKHNpbXBsZSkKLSAgICAgICAgICAgIGZvciBmdW5jdGlvbiBpbiAicGZvcm1hdCIsICJzYWZlcmVwciI6Ci0gICAgICAgICAgICAgICAgZiA9IGdldGF0dHIocHByaW50LCBmdW5jdGlvbikKLSAgICAgICAgICAgICAgICBnb3QgPSBmKHNpbXBsZSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5hdGl2ZSwgZ290LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkICVzIGdvdCAlcyBmcm9tIHBwcmludC4lcyIgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5hdGl2ZSwgZ290LCBmdW5jdGlvbikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBwcmludC5wZm9ybWF0KHNpbXBsZSksIG5hdGl2ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQoc2ltcGxlLCB3aWR0aD0xLCBpbmRlbnQ9MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoJ1xuJywgJyAnKSwgbmF0aXZlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcHJpbnQuc2FmZXJlcHIoc2ltcGxlKSwgbmF0aXZlKQogCiAgICAgZGVmIHRlc3RfYmFzaWNfbGluZV93cmFwKHNlbGYpOgogICAgICAgICAjIHZlcmlmeSBiYXNpYyBsaW5lLXdyYXBwaW5nIG9wZXJhdGlvbgpAQCAtMjA1LDE5ICsyMjEsNTkgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEb3R0ZWRQcmV0dHlQcmludGVyKCkucGZvcm1hdChvKSwgZXhwKQogCiAgICAgZGVmIHRlc3Rfc2V0X3JlcHJzKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBwcmludC5wZm9ybWF0KHNldCgpKSwgJ3NldCgpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcHJpbnQucGZvcm1hdChzZXQoKSksICdzZXQoW10pJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcHJpbnQucGZvcm1hdChzZXQocmFuZ2UoMykpKSwgJ3NldChbMCwgMSwgMl0pJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcHJpbnQucGZvcm1hdChmcm96ZW5zZXQoKSksICdmcm96ZW5zZXQoKScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQoZnJvemVuc2V0KHJhbmdlKDMpKSksICdmcm96ZW5zZXQoWzAsIDEsIDJdKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQoc2V0KHJhbmdlKDcpKSwgd2lkdGg9MjApLCAnJydcCitzZXQoWzAsCisgICAgIDEsCisgICAgIDIsCisgICAgIDMsCisgICAgIDQsCisgICAgIDUsCisgICAgIDZdKScnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcHJpbnQucGZvcm1hdChzZXQyKHJhbmdlKDcpKSwgd2lkdGg9MjApLCAnJydcCitzZXQyKFswLAorICAgICAgMSwKKyAgICAgIDIsCisgICAgICAzLAorICAgICAgNCwKKyAgICAgIDUsCisgICAgICA2XSknJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQoc2V0MyhyYW5nZSg3KSksIHdpZHRoPTIwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0MyhbMCwgMSwgMiwgMywgNCwgNSwgNl0pJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBwcmludC5wZm9ybWF0KGZyb3plbnNldCgpKSwgJ2Zyb3plbnNldChbXSknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBwcmludC5wZm9ybWF0KGZyb3plbnNldChyYW5nZSgzKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdmcm96ZW5zZXQoWzAsIDEsIDJdKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQoZnJvemVuc2V0KHJhbmdlKDcpKSwgd2lkdGg9MjApLCAnJydcCitmcm96ZW5zZXQoWzAsCisgICAgICAgICAgIDEsCisgICAgICAgICAgIDIsCisgICAgICAgICAgIDMsCisgICAgICAgICAgIDQsCisgICAgICAgICAgIDUsCisgICAgICAgICAgIDZdKScnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcHJpbnQucGZvcm1hdChmcm96ZW5zZXQyKHJhbmdlKDcpKSwgd2lkdGg9MjApLCAnJydcCitmcm96ZW5zZXQyKFswLAorICAgICAgICAgICAgMSwKKyAgICAgICAgICAgIDIsCisgICAgICAgICAgICAzLAorICAgICAgICAgICAgNCwKKyAgICAgICAgICAgIDUsCisgICAgICAgICAgICA2XSknJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQoZnJvemVuc2V0MyhyYW5nZSg3KSksIHdpZHRoPTIwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnZnJvemVuc2V0MyhbMCwgMSwgMiwgMywgNCwgNSwgNl0pJykKKworICAgIGRlZiB0ZXN0X3NldF9vZl9zZXRzX3JlcHJzKHNlbGYpOgogICAgICAgICBjdWJlX3JlcHJfdGd0ID0gIiIiXAoge2Zyb3plbnNldChbXSk6IGZyb3plbnNldChbZnJvemVuc2V0KFsyXSksIGZyb3plbnNldChbMF0pLCBmcm96ZW5zZXQoWzFdKV0pLAotIGZyb3plbnNldChbMF0pOiBmcm96ZW5zZXQoW2Zyb3plbnNldCgpLAorIGZyb3plbnNldChbMF0pOiBmcm96ZW5zZXQoW2Zyb3plbnNldChbXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswLCAyXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswLCAxXSldKSwKLSBmcm96ZW5zZXQoWzFdKTogZnJvemVuc2V0KFtmcm96ZW5zZXQoKSwKKyBmcm96ZW5zZXQoWzFdKTogZnJvemVuc2V0KFtmcm96ZW5zZXQoW10pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMSwgMl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwgMV0pXSksCi0gZnJvemVuc2V0KFsyXSk6IGZyb3plbnNldChbZnJvemVuc2V0KCksCisgZnJvemVuc2V0KFsyXSk6IGZyb3plbnNldChbZnJvemVuc2V0KFtdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzEsIDJdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsIDJdKV0pLAogIGZyb3plbnNldChbMSwgMl0pOiBmcm96ZW5zZXQoW2Zyb3plbnNldChbMl0pLApAQCAtMjQzLDcgKzI5OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMV0pXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoW10pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzBdKV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoWzJdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswLApAQCAtMjU5LDcgKzMxNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoW10pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzFdKV0pXSksCiAgZnJvemVuc2V0KFtmcm96ZW5zZXQoWzEsIDJdKSwgZnJvemVuc2V0KFsxXSldKTogZnJvemVuc2V0KFtmcm96ZW5zZXQoW2Zyb3plbnNldChbMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXSksCkBAIC0yNjksNyArMzI1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KFsyXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXSldKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMV0pXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsCkBAIC0yODUsNyArMzQxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KFsyXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXSldKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMl0pXSldKSwKICBmcm96ZW5zZXQoW2Zyb3plbnNldChbXSksIGZyb3plbnNldChbMF0pXSk6IGZyb3plbnNldChbZnJvemVuc2V0KFtmcm96ZW5zZXQoWzBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsCkBAIC0yOTMsMTYgKzM0OSwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFsxXSldKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoW10pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMl0pXSldKSwKLSBmcm96ZW5zZXQoW2Zyb3plbnNldChbXSksIGZyb3plbnNldChbMV0pXSk6IGZyb3plbnNldChbZnJvemVuc2V0KFtmcm96ZW5zZXQoKSwKKyBmcm96ZW5zZXQoW2Zyb3plbnNldChbXSksIGZyb3plbnNldChbMV0pXSk6IGZyb3plbnNldChbZnJvemVuc2V0KFtmcm96ZW5zZXQoW10pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMF0pXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KFsxXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFsxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KFtdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzJdKV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwKQEAgLTMxMCw5ICszNjYsOSBAQAogIGZyb3plbnNldChbZnJvemVuc2V0KFsyXSksIGZyb3plbnNldChbXSldKTogZnJvemVuc2V0KFtmcm96ZW5zZXQoW2Zyb3plbnNldChbMl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswXSldKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoW10pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMV0pXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KFsyXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswLApAQCAtMzMzLDcgKzM4OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMV0pXSldKSwKLSBmcm96ZW5zZXQoW2Zyb3plbnNldChbMF0pLCBmcm96ZW5zZXQoWzAsIDFdKV0pOiBmcm96ZW5zZXQoW2Zyb3plbnNldChbZnJvemVuc2V0KCksCisgZnJvemVuc2V0KFtmcm96ZW5zZXQoWzBdKSwgZnJvemVuc2V0KFswLCAxXSldKTogZnJvemVuc2V0KFtmcm96ZW5zZXQoW2Zyb3plbnNldChbXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMF0pXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxXSksCkBAIC0zNTcsNyArNDEzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KFswXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXSldKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMl0pXSldKSwKICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMCwgMSwgMl0pLCBmcm96ZW5zZXQoWzAsIDJdKV0pOiBmcm96ZW5zZXQoW2Zyb3plbnNldChbZnJvemVuc2V0KFsxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKSwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcHJvcGVydHkucHkgYi9MaWIvdGVzdC90ZXN0X3Byb3BlcnR5LnB5CmluZGV4IGU1ZmMxNzQuLmU1YTAyOWIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcHJvcGVydHkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wcm9wZXJ0eS5weQpAQCAtMTYzLDcgKzE2Myw3IEBACiAgICAgICAgICAgICBGb28uc3BhbS5fX2RvY19fLAogICAgICAgICAgICAgInNwYW0gd3JhcHBlZCBpbiBwcm9wZXJ0eSBzdWJjbGFzcyIpCiAKLSAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5mbGFncy5vcHRpbWl6ZSA8PSAyLAorICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLmZsYWdzLm9wdGltaXplID49IDIsCiAgICAgICAgICAgICAgICAgICAgICAiRG9jc3RyaW5ncyBhcmUgb21pdHRlZCB3aXRoIC1PMiBhbmQgYWJvdmUiKQogICAgIGRlZiB0ZXN0X3Byb3BlcnR5X3NldHRlcl9jb3BpZXNfZ2V0dGVyX2RvY3N0cmluZyhzZWxmKToKICAgICAgICAgY2xhc3MgRm9vKG9iamVjdCk6CkBAIC0xOTYsNyArMTk2LDcgQEAKICAgICAgICAgICAgIEZvb1N1Yi5zcGFtLl9fZG9jX18sCiAgICAgICAgICAgICAic3BhbSB3cmFwcGVkIGluIHByb3BlcnR5IHN1YmNsYXNzIikKIAotICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLmZsYWdzLm9wdGltaXplIDw9IDIsCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMuZmxhZ3Mub3B0aW1pemUgPj0gMiwKICAgICAgICAgICAgICAgICAgICAgICJEb2NzdHJpbmdzIGFyZSBvbWl0dGVkIHdpdGggLU8yIGFuZCBhYm92ZSIpCiAgICAgZGVmIHRlc3RfcHJvcGVydHlfbmV3X2dldHRlcl9uZXdfZG9jc3RyaW5nKHNlbGYpOgogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3B0eS5weSBiL0xpYi90ZXN0L3Rlc3RfcHR5LnB5CmluZGV4IDA1YWI1OTguLmJlYzM4YzQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcHR5LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcHR5LnB5CkBAIC04LDcgKzgsOSBAQAogaW1wb3J0IHB0eQogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCitpbXBvcnQgc2VsZWN0CiBpbXBvcnQgc2lnbmFsCitpbXBvcnQgc29ja2V0CiBpbXBvcnQgdW5pdHRlc3QKIAogVEVTVF9TVFJJTkdfMSA9ICJJIHdpc2ggdG8gYnV5IGEgZmlzaCBsaWNlbnNlLlxuIgpAQCAtMTUwLDcgKzE1Miw3IEBACiAgICAgICAgICAgICAjIHBsYXRmb3JtLWRlcGVuZGVudCBhbW91bnQgb2YgZGF0YSBpcyB3cml0dGVuIHRvIGl0cyBmZC4gIE9uCiAgICAgICAgICAgICAjIExpbnV4IDIuNiwgaXQncyA0MDAwIGJ5dGVzIGFuZCB0aGUgY2hpbGQgd29uJ3QgYmxvY2ssIGJ1dCBvbiBPUwogICAgICAgICAgICAgIyBYIGV2ZW4gdGhlIHNtYWxsIHdyaXRlcyBpbiB0aGUgY2hpbGQgYWJvdmUgd2lsbCBibG9jayBpdC4gIEFsc28KLSAgICAgICAgICAgICMgb24gTGludXgsIHRoZSByZWFkKCkgd2lsbCB0aHJvdyBhbiBPU0Vycm9yIChpbnB1dC9vdXRwdXQgZXJyb3IpCisgICAgICAgICAgICAjIG9uIExpbnV4LCB0aGUgcmVhZCgpIHdpbGwgcmFpc2UgYW4gT1NFcnJvciAoaW5wdXQvb3V0cHV0IGVycm9yKQogICAgICAgICAgICAgIyB3aGVuIGl0IHRyaWVzIHRvIHJlYWQgcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgYnV0IHRoZSBjaGlsZCdzCiAgICAgICAgICAgICAjIGFscmVhZHkgZXhpdGVkLCBzbyBjYXRjaCBhbmQgZGlzY2FyZCB0aG9zZSBleGNlcHRpb25zLiAgSXQncyBub3QKICAgICAgICAgICAgICMgd29ydGggY2hlY2tpbmcgZm9yIEVJTy4KQEAgLTE5Myw4ICsxOTUsOTUgQEAKIAogICAgICAgICAjIHB0eS5mb3JrKCkgcGFzc2VkLgogCisKK2NsYXNzIFNtYWxsUHR5VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRoZXNlIHRlc3RzIGRvbid0IHNwYXduIGNoaWxkcmVuIG9yIGhhbmcuIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYub3JpZ19zdGRpbl9maWxlbm8gPSBwdHkuU1RESU5fRklMRU5PCisgICAgICAgIHNlbGYub3JpZ19zdGRvdXRfZmlsZW5vID0gcHR5LlNURE9VVF9GSUxFTk8KKyAgICAgICAgc2VsZi5vcmlnX3B0eV9zZWxlY3QgPSBwdHkuc2VsZWN0CisgICAgICAgIHNlbGYuZmRzID0gW10gICMgQSBsaXN0IG9mIGZpbGUgZGVzY3JpcHRvcnMgdG8gY2xvc2UuCisgICAgICAgIHNlbGYuc2VsZWN0X3JmZHNfbGVuZ3RocyA9IFtdCisgICAgICAgIHNlbGYuc2VsZWN0X3JmZHNfcmVzdWx0cyA9IFtdCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHB0eS5TVERJTl9GSUxFTk8gPSBzZWxmLm9yaWdfc3RkaW5fZmlsZW5vCisgICAgICAgIHB0eS5TVERPVVRfRklMRU5PID0gc2VsZi5vcmlnX3N0ZG91dF9maWxlbm8KKyAgICAgICAgcHR5LnNlbGVjdCA9IHNlbGYub3JpZ19wdHlfc2VsZWN0CisgICAgICAgIGZvciBmZCBpbiBzZWxmLmZkczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5jbG9zZShmZCkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgX3BpcGUoc2VsZik6CisgICAgICAgIHBpcGVfZmRzID0gb3MucGlwZSgpCisgICAgICAgIHNlbGYuZmRzLmV4dGVuZChwaXBlX2ZkcykKKyAgICAgICAgcmV0dXJuIHBpcGVfZmRzCisKKyAgICBkZWYgX21vY2tfc2VsZWN0KHNlbGYsIHJmZHMsIHdmZHMsIHhmZHMpOgorICAgICAgICAjIFRoaXMgd2lsbCByYWlzZSBJbmRleEVycm9yIHdoZW4gbm8gbW9yZSBleHBlY3RlZCBjYWxscyBleGlzdC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNlbGVjdF9yZmRzX2xlbmd0aHMucG9wKDApLCBsZW4ocmZkcykpCisgICAgICAgIHJldHVybiBzZWxmLnNlbGVjdF9yZmRzX3Jlc3VsdHMucG9wKDApLCBbXSwgW10KKworICAgIGRlZiB0ZXN0X19jb3B5X3RvX2VhY2goc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhlIG5vcm1hbCBkYXRhIGNhc2Ugb24gYm90aCBtYXN0ZXJfZmQgYW5kIHN0ZGluLiIiIgorICAgICAgICByZWFkX2Zyb21fc3Rkb3V0X2ZkLCBtb2NrX3N0ZG91dF9mZCA9IHNlbGYuX3BpcGUoKQorICAgICAgICBwdHkuU1RET1VUX0ZJTEVOTyA9IG1vY2tfc3Rkb3V0X2ZkCisgICAgICAgIG1vY2tfc3RkaW5fZmQsIHdyaXRlX3RvX3N0ZGluX2ZkID0gc2VsZi5fcGlwZSgpCisgICAgICAgIHB0eS5TVERJTl9GSUxFTk8gPSBtb2NrX3N0ZGluX2ZkCisgICAgICAgIHNvY2tldHBhaXIgPSBzb2NrZXQuc29ja2V0cGFpcigpCisgICAgICAgIG1hc3RlcnMgPSBbcy5maWxlbm8oKSBmb3IgcyBpbiBzb2NrZXRwYWlyXQorICAgICAgICBzZWxmLmZkcy5leHRlbmQobWFzdGVycykKKworICAgICAgICAjIEZlZWQgZGF0YS4gIFNtYWxsZXIgdGhhbiBQSVBFQlVGLiAgVGhlc2Ugd3JpdGVzIHdpbGwgbm90IGJsb2NrLgorICAgICAgICBvcy53cml0ZShtYXN0ZXJzWzFdLCBiJ2Zyb20gbWFzdGVyJykKKyAgICAgICAgb3Mud3JpdGUod3JpdGVfdG9fc3RkaW5fZmQsIGInZnJvbSBzdGRpbicpCisKKyAgICAgICAgIyBFeHBlY3QgdHdvIHNlbGVjdCBjYWxscywgdGhlIGxhc3Qgb25lIHdpbGwgY2F1c2UgSW5kZXhFcnJvcgorICAgICAgICBwdHkuc2VsZWN0ID0gc2VsZi5fbW9ja19zZWxlY3QKKyAgICAgICAgc2VsZi5zZWxlY3RfcmZkc19sZW5ndGhzLmFwcGVuZCgyKQorICAgICAgICBzZWxmLnNlbGVjdF9yZmRzX3Jlc3VsdHMuYXBwZW5kKFttb2NrX3N0ZGluX2ZkLCBtYXN0ZXJzWzBdXSkKKyAgICAgICAgc2VsZi5zZWxlY3RfcmZkc19sZW5ndGhzLmFwcGVuZCgyKQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvcik6CisgICAgICAgICAgICBwdHkuX2NvcHkobWFzdGVyc1swXSkKKworICAgICAgICAjIFRlc3QgdGhhdCB0aGUgcmlnaHQgZGF0YSB3ZW50IHRvIHRoZSByaWdodCBwbGFjZXMuCisgICAgICAgIHJmZHMgPSBzZWxlY3Quc2VsZWN0KFtyZWFkX2Zyb21fc3Rkb3V0X2ZkLCBtYXN0ZXJzWzFdXSwgW10sIFtdLCAwKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtyZWFkX2Zyb21fc3Rkb3V0X2ZkLCBtYXN0ZXJzWzFdXSwgcmZkcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5yZWFkKHJlYWRfZnJvbV9zdGRvdXRfZmQsIDIwKSwgYidmcm9tIG1hc3RlcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MucmVhZChtYXN0ZXJzWzFdLCAyMCksIGInZnJvbSBzdGRpbicpCisKKyAgICBkZWYgdGVzdF9fY29weV9lb2Zfb25fYWxsKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoZSBlbXB0eSByZWFkIEVPRiBjYXNlIG9uIGJvdGggbWFzdGVyX2ZkIGFuZCBzdGRpbi4iIiIKKyAgICAgICAgcmVhZF9mcm9tX3N0ZG91dF9mZCwgbW9ja19zdGRvdXRfZmQgPSBzZWxmLl9waXBlKCkKKyAgICAgICAgcHR5LlNURE9VVF9GSUxFTk8gPSBtb2NrX3N0ZG91dF9mZAorICAgICAgICBtb2NrX3N0ZGluX2ZkLCB3cml0ZV90b19zdGRpbl9mZCA9IHNlbGYuX3BpcGUoKQorICAgICAgICBwdHkuU1RESU5fRklMRU5PID0gbW9ja19zdGRpbl9mZAorICAgICAgICBzb2NrZXRwYWlyID0gc29ja2V0LnNvY2tldHBhaXIoKQorICAgICAgICBtYXN0ZXJzID0gW3MuZmlsZW5vKCkgZm9yIHMgaW4gc29ja2V0cGFpcl0KKyAgICAgICAgc2VsZi5mZHMuZXh0ZW5kKG1hc3RlcnMpCisKKyAgICAgICAgb3MuY2xvc2UobWFzdGVyc1sxXSkKKyAgICAgICAgc29ja2V0cGFpclsxXS5jbG9zZSgpCisgICAgICAgIG9zLmNsb3NlKHdyaXRlX3RvX3N0ZGluX2ZkKQorCisgICAgICAgICMgRXhwZWN0IHR3byBzZWxlY3QgY2FsbHMsIHRoZSBsYXN0IG9uZSB3aWxsIGNhdXNlIEluZGV4RXJyb3IKKyAgICAgICAgcHR5LnNlbGVjdCA9IHNlbGYuX21vY2tfc2VsZWN0CisgICAgICAgIHNlbGYuc2VsZWN0X3JmZHNfbGVuZ3Rocy5hcHBlbmQoMikKKyAgICAgICAgc2VsZi5zZWxlY3RfcmZkc19yZXN1bHRzLmFwcGVuZChbbW9ja19zdGRpbl9mZCwgbWFzdGVyc1swXV0pCisgICAgICAgICMgV2UgZXhwZWN0IHRoYXQgYm90aCBmZHMgd2VyZSByZW1vdmVkIGZyb20gdGhlIGZkcyBsaXN0IGFzIHRoZXkKKyAgICAgICAgIyBib3RoIGVuY291bnRlcmVkIGFuIEVPRiBiZWZvcmUgdGhlIHNlY29uZCBzZWxlY3QgY2FsbC4KKyAgICAgICAgc2VsZi5zZWxlY3RfcmZkc19sZW5ndGhzLmFwcGVuZCgwKQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvcik6CisgICAgICAgICAgICBwdHkuX2NvcHkobWFzdGVyc1swXSkKKworCiBkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6Ci0gICAgcnVuX3VuaXR0ZXN0KFB0eVRlc3QpCisgICAgcnVuX3VuaXR0ZXN0KFNtYWxsUHR5VGVzdHMsIFB0eVRlc3QpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcHdkLnB5IGIvTGliL3Rlc3QvdGVzdF9wd2QucHkKaW5kZXggNjdlMTFiNi4uODI4ZjZkZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wd2QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wd2QucHkKQEAgLTgsOCArOCw2IEBACiAKICAgICBkZWYgdGVzdF92YWx1ZXMoc2VsZik6CiAgICAgICAgIGVudHJpZXMgPSBwd2QuZ2V0cHdhbGwoKQotICAgICAgICBlbnRyaWVzYnluYW1lID0ge30KLSAgICAgICAgZW50cmllc2J5dWlkID0ge30KIAogICAgICAgICBmb3IgZSBpbiBlbnRyaWVzOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZSksIDcpCkBAIC0xOCw5ICsxNiw5IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVbMV0sIGUucHdfcGFzc3dkKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGUucHdfcGFzc3dkLCBiYXNlc3RyaW5nKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlWzJdLCBlLnB3X3VpZCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShlLnB3X3VpZCwgaW50KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGUucHdfdWlkLCAoaW50LCBsb25nKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZVszXSwgZS5wd19naWQpCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZS5wd19naWQsIGludCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShlLnB3X2dpZCwgKGludCwgbG9uZykpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVbNF0sIGUucHdfZ2Vjb3MpCiAgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZS5wd19nZWNvcywgYmFzZXN0cmluZykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZVs1XSwgZS5wd19kaXIpCkBAIC0zMiwxMyArMzAsMjAgQEAKICAgICAgICAgICAgICMgZm9yIG9uZSB1aWQKICAgICAgICAgICAgICMgICAgc2VsZi5hc3NlcnRFcXVhbChwd2QuZ2V0cHd1aWQoZS5wd191aWQpLCBlKQogICAgICAgICAgICAgIyBpbnN0ZWFkIG9mIHRoaXMgY29sbGVjdCBhbGwgZW50cmllcyBmb3Igb25lIHVpZAotICAgICAgICAgICAgIyBhbmQgY2hlY2sgYWZ0ZXJ3YXJkcworICAgICAgICAgICAgIyBhbmQgY2hlY2sgYWZ0ZXJ3YXJkcyAoZG9uZSBpbiB0ZXN0X3ZhbHVlc19leHRlbmRlZCkKKworICAgIGRlZiB0ZXN0X3ZhbHVlc19leHRlbmRlZChzZWxmKToKKyAgICAgICAgZW50cmllcyA9IHB3ZC5nZXRwd2FsbCgpCisgICAgICAgIGVudHJpZXNieW5hbWUgPSB7fQorICAgICAgICBlbnRyaWVzYnl1aWQgPSB7fQorCisgICAgICAgIGlmIGxlbihlbnRyaWVzKSA+IDEwMDA6ICAjIEh1Z2UgcGFzc3dkIGZpbGUgKE5JUz8pIC0tIHNraXAgdGhpcyB0ZXN0CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCdwYXNzd2QgZmlsZSBpcyBodWdlOyBleHRlbmRlZCB0ZXN0IHNraXBwZWQnKQorCisgICAgICAgIGZvciBlIGluIGVudHJpZXM6CiAgICAgICAgICAgICBlbnRyaWVzYnluYW1lLnNldGRlZmF1bHQoZS5wd19uYW1lLCBbXSkuYXBwZW5kKGUpCiAgICAgICAgICAgICBlbnRyaWVzYnl1aWQuc2V0ZGVmYXVsdChlLnB3X3VpZCwgW10pLmFwcGVuZChlKQogCi0gICAgICAgIGlmIGxlbihlbnRyaWVzKSA+IDEwMDA6ICAjIEh1Z2UgcGFzc3dkIGZpbGUgKE5JUz8pIC0tIHNraXAgdGhlIHJlc3QKLSAgICAgICAgICAgIHJldHVybgotCiAgICAgICAgICMgY2hlY2sgd2hldGhlciB0aGUgZW50cnkgcmV0dXJuZWQgYnkgZ2V0cHd1aWQoKQogICAgICAgICAjIGZvciBlYWNoIHVpZCBpcyBhbW9uZyB0aG9zZSBmcm9tIGdldHB3YWxsKCkgZm9yIHRoaXMgdWlkCiAgICAgICAgIGZvciBlIGluIGVudHJpZXM6CkBAIC00OSw3ICs1NCw5IEBACiAKICAgICBkZWYgdGVzdF9lcnJvcnMoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHdkLmdldHB3dWlkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHB3ZC5nZXRwd3VpZCwgMy4xNCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwd2QuZ2V0cHduYW0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHdkLmdldHB3bmFtLCA0MikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwd2QuZ2V0cHdhbGwsIDQyKQogCiAgICAgICAgICMgdHJ5IHRvIGdldCBzb21lIGVycm9ycwpAQCAtOTMsNiArMTAwLDEzIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oZmFrZXVpZCwgYnl1aWRzKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgcHdkLmdldHB3dWlkLCBmYWtldWlkKQogCisgICAgICAgICMgLTEgc2hvdWxkbid0IGJlIGEgdmFsaWQgdWlkIGJlY2F1c2UgaXQgaGFzIGEgc3BlY2lhbCBtZWFuaW5nIGluIG1hbnkKKyAgICAgICAgIyB1aWQtcmVsYXRlZCBmdW5jdGlvbnMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIHB3ZC5nZXRwd3VpZCwgLTEpCisgICAgICAgICMgc2hvdWxkIGJlIG91dCBvZiB1aWRfdCByYW5nZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgcHdkLmdldHB3dWlkLCAyKioxMjgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBwd2QuZ2V0cHd1aWQsIC0yKioxMjgpCisKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFB3ZFRlc3QpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcHkza3dhcm4ucHkgYi9MaWIvdGVzdC90ZXN0X3B5M2t3YXJuLnB5CmluZGV4IDJhZmQ4YTEuLjVhZWU2YTUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcHkza3dhcm4ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9weTNrd2Fybi5weQpAQCAtMzA3LDYgKzMwNywxMSBAQAogICAgICAgICAgICAgdy5yZXNldCgpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoc2VxdWVuY2VJbmNsdWRlcyhyYW5nZSgzKSwgMiksIHcsIHNlcV93YXJuKQogCisgICAgZGVmIHRlc3Rfbm9uYXNjaWlfYnl0ZXNfbGl0ZXJhbHMoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gIm5vbi1hc2NpaSBieXRlcyBsaXRlcmFscyBub3Qgc3VwcG9ydGVkIGluIDMueCIKKyAgICAgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKChleHBlY3RlZCwgU3ludGF4V2FybmluZykpOgorICAgICAgICAgICAgZXhlYyAiYidceGJkJyIKKwogCiBjbGFzcyBUZXN0U3RkbGliUmVtb3ZhbHModW5pdHRlc3QuVGVzdENhc2UpOgogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3B5Y2xici5weSBiL0xpYi90ZXN0L3Rlc3RfcHljbGJyLnB5CmluZGV4IDZhYTk2ZDUuLjdiZGM1NTUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcHljbGJyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcHljbGJyLnB5CkBAIC0xODgsNiArMTg4LDExIEBACiAgICAgICAgIGNtKCdlbWFpbC5wYXJzZXInKQogICAgICAgICBjbSgndGVzdC50ZXN0X3B5Y2xicicpCiAKKyAgICBkZWYgdGVzdF9pc3N1ZV8xNDc5OChzZWxmKToKKyAgICAgICAgIyB0ZXN0IEltcG9ydEVycm9yIGlzIHJhaXNlZCB3aGVuIHRoZSBmaXJzdCBwYXJ0IG9mIGEgZG90dGVkIG5hbWUgaXMKKyAgICAgICAgIyBub3QgYSBwYWNrYWdlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEltcG9ydEVycm9yLCBweWNsYnIucmVhZG1vZHVsZV9leCwgJ2FzeW5jb3JlLmZvbycpCisKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHJ1bl91bml0dGVzdChQeWNsYnJUZXN0KQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9weWRvYy5weSBiL0xpYi90ZXN0L3Rlc3RfcHlkb2MucHkKaW5kZXggYjQzMzg1MC4uYzExYzA2YiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9weWRvYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3B5ZG9jLnB5CkBAIC00LDE4ICs0LDI5IEBACiBpbXBvcnQgX19idWlsdGluX18KIGltcG9ydCByZQogaW1wb3J0IHB5ZG9jCitpbXBvcnQgY29udGV4dGxpYgogaW1wb3J0IGluc3BlY3QKIGltcG9ydCBrZXl3b3JkCitpbXBvcnQgcGtndXRpbAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgeG1sLmV0cmVlCitpbXBvcnQgdHlwZXMKIGltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydAogZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQogZnJvbSB0ZXN0LnNjcmlwdF9oZWxwZXIgaW1wb3J0IGFzc2VydF9weXRob25fb2sKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0ICgKLSAgICBURVNURk4sIHJtdHJlZSwgcmVhcF9jaGlsZHJlbiwgY2FwdHVyZWRfc3Rkb3V0KQorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgKFRFU1RGTiwgcm10cmVlLCByZWFwX2NoaWxkcmVuLCBjYXB0dXJlZF9zdGRvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZWRfc3RkZXJyLCByZXF1aXJlc19kb2NzdHJpbmdzKQogCiBmcm9tIHRlc3QgaW1wb3J0IHB5ZG9jX21vZAogCitpZiB0ZXN0LnRlc3Rfc3VwcG9ydC5IQVZFX0RPQ1NUUklOR1M6CisgICAgZXhwZWN0ZWRfZGF0YV9kb2NzdHJpbmdzID0gKAorICAgICAgICAnZGljdGlvbmFyeSBmb3IgaW5zdGFuY2UgdmFyaWFibGVzIChpZiBkZWZpbmVkKScsCisgICAgICAgICdsaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0IChpZiBkZWZpbmVkKScsCisgICAgICAgICkKK2Vsc2U6CisgICAgZXhwZWN0ZWRfZGF0YV9kb2NzdHJpbmdzID0gKCcnLCAnJykKKwogZXhwZWN0ZWRfdGV4dF9wYXR0ZXJuID0gXAogIiIiCiBOQU1FCkBAIC0yNyw2ICszOCw3IEBACiBDTEFTU0VTCiAgICAgX19idWlsdGluX18ub2JqZWN0CiAgICAgICAgIEIKKyAgICAgICAgQwogICAgIEEKIFx4MjBceDIwXHgyMFx4MjAKICAgICBjbGFzcyBBCkBAIC00MCwxNiArNTIsMzQgQEAKICAgICBjbGFzcyBCKF9fYnVpbHRpbl9fLm9iamVjdCkKICAgICAgfCAgRGF0YSBkZXNjcmlwdG9ycyBkZWZpbmVkIGhlcmU6CiAgICAgIHxceDIwXHgyMAotICAgICB8ICBfX2RpY3RfXwotICAgICB8ICAgICAgZGljdGlvbmFyeSBmb3IgaW5zdGFuY2UgdmFyaWFibGVzIChpZiBkZWZpbmVkKQorICAgICB8ICBfX2RpY3RfXyVzCiAgICAgIHxceDIwXHgyMAotICAgICB8ICBfX3dlYWtyZWZfXwotICAgICB8ICAgICAgbGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgdG8gdGhlIG9iamVjdCAoaWYgZGVmaW5lZCkKKyAgICAgfCAgX193ZWFrcmVmX18lcwogICAgICB8XHgyMFx4MjAKICAgICAgfCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICB8ICBEYXRhIGFuZCBvdGhlciBhdHRyaWJ1dGVzIGRlZmluZWQgaGVyZToKICAgICAgfFx4MjBceDIwCiAgICAgIHwgIE5PX01FQU5JTkcgPSAnZWdncycKK1x4MjBceDIwXHgyMFx4MjAKKyAgICBjbGFzcyBDKF9fYnVpbHRpbl9fLm9iamVjdCkKKyAgICAgfCAgTWV0aG9kcyBkZWZpbmVkIGhlcmU6CisgICAgIHxceDIwXHgyMAorICAgICB8ICBnZXRfYW5zd2VyKHNlbGYpCisgICAgIHwgICAgICBSZXR1cm4gc2F5X25vKCkKKyAgICAgfFx4MjBceDIwCisgICAgIHwgIGlzX2l0X3RydWUoc2VsZikKKyAgICAgfCAgICAgIFJldHVybiBzZWxmLmdldF9hbnN3ZXIoKQorICAgICB8XHgyMFx4MjAKKyAgICAgfCAgc2F5X25vKHNlbGYpCisgICAgIHxceDIwXHgyMAorICAgICB8ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIHwgIERhdGEgZGVzY3JpcHRvcnMgZGVmaW5lZCBoZXJlOgorICAgICB8XHgyMFx4MjAKKyAgICAgfCAgX19kaWN0X18KKyAgICAgfCAgICAgIGRpY3Rpb25hcnkgZm9yIGluc3RhbmNlIHZhcmlhYmxlcyAoaWYgZGVmaW5lZCkKKyAgICAgfFx4MjBceDIwCisgICAgIHwgIF9fd2Vha3JlZl9fCisgICAgIHwgICAgICBsaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0IChpZiBkZWZpbmVkKQogCiBGVU5DVElPTlMKICAgICBkb2NfZnVuYygpCkBAIC03NSw2ICsxMDUsOSBAQAogICAgIE5vYm9keQogIiIiLnN0cmlwKCkKIAorZXhwZWN0ZWRfdGV4dF9kYXRhX2RvY3N0cmluZ3MgPSB0dXBsZSgnXG4gICAgIHwgICAgICAnICsgcyBpZiBzIGVsc2UgJycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHMgaW4gZXhwZWN0ZWRfZGF0YV9kb2NzdHJpbmdzKQorCiBleHBlY3RlZF9odG1sX3BhdHRlcm4gPSBcCiAiIiIKIDx0YWJsZSB3aWR0aD0iMTAwJSUiIGNlbGxzcGFjaW5nPTAgY2VsbHBhZGRpbmc9MiBib3JkZXI9MCBzdW1tYXJ5PSJoZWFkaW5nIj4KQEAgLTk2LDYgKzEyOSw3IEBACiA8L2ZvbnQ+PC9kdD48ZGQ+CiA8ZGw+CiA8ZHQ+PGZvbnQgZmFjZT0iaGVsdmV0aWNhLCBhcmlhbCI+PGEgaHJlZj0idGVzdC5weWRvY19tb2QuaHRtbCNCIj5CPC9hPgorPC9mb250PjwvZHQ+PGR0Pjxmb250IGZhY2U9ImhlbHZldGljYSwgYXJpYWwiPjxhIGhyZWY9InRlc3QucHlkb2NfbW9kLmh0bWwjQyI+QzwvYT4KIDwvZm9udD48L2R0PjwvZGw+CiA8L2RkPgogPGR0Pjxmb250IGZhY2U9ImhlbHZldGljYSwgYXJpYWwiPjxhIGhyZWY9InRlc3QucHlkb2NfbW9kLmh0bWwjQSI+QTwvYT4KQEAgLTEyMSwxNSArMTU1LDM3IEBACiA8dHI+PHRkIGJnY29sb3I9IiNmZmM4ZDgiPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDs8L3R0PjwvdGQ+PHRkPiZuYnNwOzwvdGQ+CiA8dGQgd2lkdGg9IjEwMCUlIj5EYXRhIGRlc2NyaXB0b3JzIGRlZmluZWQgaGVyZTo8YnI+CiA8ZGw+PGR0PjxzdHJvbmc+X19kaWN0X188L3N0cm9uZz48L2R0PgotPGRkPjx0dD5kaWN0aW9uYXJ5Jm5ic3A7Zm9yJm5ic3A7aW5zdGFuY2UmbmJzcDt2YXJpYWJsZXMmbmJzcDsoaWYmbmJzcDtkZWZpbmVkKTwvdHQ+PC9kZD4KKzxkZD48dHQ+JXM8L3R0PjwvZGQ+CiA8L2RsPgogPGRsPjxkdD48c3Ryb25nPl9fd2Vha3JlZl9fPC9zdHJvbmc+PC9kdD4KLTxkZD48dHQ+bGlzdCZuYnNwO29mJm5ic3A7d2VhayZuYnNwO3JlZmVyZW5jZXMmbmJzcDt0byZuYnNwO3RoZSZuYnNwO29iamVjdCZuYnNwOyhpZiZuYnNwO2RlZmluZWQpPC90dD48L2RkPgorPGRkPjx0dD4lczwvdHQ+PC9kZD4KIDwvZGw+CiA8aHI+CiBEYXRhIGFuZCBvdGhlciBhdHRyaWJ1dGVzIGRlZmluZWQgaGVyZTo8YnI+CiA8ZGw+PGR0PjxzdHJvbmc+Tk9fTUVBTklORzwvc3Ryb25nPiA9ICdlZ2dzJzwvZGw+CiAKKzwvdGQ+PC90cj48L3RhYmxlPiA8cD4KKzx0YWJsZSB3aWR0aD0iMTAwJSUiIGNlbGxzcGFjaW5nPTAgY2VsbHBhZGRpbmc9MiBib3JkZXI9MCBzdW1tYXJ5PSJzZWN0aW9uIj4KKzx0ciBiZ2NvbG9yPSIjZmZjOGQ4Ij4KKzx0ZCBjb2xzcGFuPTMgdmFsaWduPWJvdHRvbT4mbmJzcDs8YnI+Cis8Zm9udCBjb2xvcj0iIzAwMDAwMCIgZmFjZT0iaGVsdmV0aWNhLCBhcmlhbCI+PGEgbmFtZT0iQyI+Y2xhc3MgPHN0cm9uZz5DPC9zdHJvbmc+PC9hPig8YSBocmVmPSJfX2J1aWx0aW5fXy5odG1sI29iamVjdCI+X19idWlsdGluX18ub2JqZWN0PC9hPik8L2ZvbnQ+PC90ZD48L3RyPgorXHgyMFx4MjBceDIwXHgyMAorPHRyPjx0ZCBiZ2NvbG9yPSIjZmZjOGQ4Ij48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90dD48L3RkPjx0ZD4mbmJzcDs8L3RkPgorPHRkIHdpZHRoPSIxMDAlJSI+TWV0aG9kcyBkZWZpbmVkIGhlcmU6PGJyPgorPGRsPjxkdD48YSBuYW1lPSJDLWdldF9hbnN3ZXIiPjxzdHJvbmc+Z2V0X2Fuc3dlcjwvc3Ryb25nPjwvYT4oc2VsZik8L2R0PjxkZD48dHQ+UmV0dXJuJm5ic3A7PGEgaHJlZj0iI0Mtc2F5X25vIj5zYXlfbm88L2E+KCk8L3R0PjwvZGQ+PC9kbD4KKworPGRsPjxkdD48YSBuYW1lPSJDLWlzX2l0X3RydWUiPjxzdHJvbmc+aXNfaXRfdHJ1ZTwvc3Ryb25nPjwvYT4oc2VsZik8L2R0PjxkZD48dHQ+UmV0dXJuJm5ic3A7c2VsZi48YSBocmVmPSIjQy1nZXRfYW5zd2VyIj5nZXRfYW5zd2VyPC9hPigpPC90dD48L2RkPjwvZGw+CisKKzxkbD48ZHQ+PGEgbmFtZT0iQy1zYXlfbm8iPjxzdHJvbmc+c2F5X25vPC9zdHJvbmc+PC9hPihzZWxmKTwvZHQ+PC9kbD4KKworPGhyPgorRGF0YSBkZXNjcmlwdG9ycyBkZWZpbmVkIGhlcmU6PGJyPgorPGRsPjxkdD48c3Ryb25nPl9fZGljdF9fPC9zdHJvbmc+PC9kdD4KKzxkZD48dHQ+ZGljdGlvbmFyeSZuYnNwO2ZvciZuYnNwO2luc3RhbmNlJm5ic3A7dmFyaWFibGVzJm5ic3A7KGlmJm5ic3A7ZGVmaW5lZCk8L3R0PjwvZGQ+Cis8L2RsPgorPGRsPjxkdD48c3Ryb25nPl9fd2Vha3JlZl9fPC9zdHJvbmc+PC9kdD4KKzxkZD48dHQ+bGlzdCZuYnNwO29mJm5ic3A7d2VhayZuYnNwO3JlZmVyZW5jZXMmbmJzcDt0byZuYnNwO3RoZSZuYnNwO29iamVjdCZuYnNwOyhpZiZuYnNwO2RlZmluZWQpPC90dD48L2RkPgorPC9kbD4KIDwvdGQ+PC90cj48L3RhYmxlPjwvdGQ+PC90cj48L3RhYmxlPjxwPgogPHRhYmxlIHdpZHRoPSIxMDAlJSIgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz0yIGJvcmRlcj0wIHN1bW1hcnk9InNlY3Rpb24iPgogPHRyIGJnY29sb3I9IiNlZWFhNzciPgpAQCAtMTY4LDYgKzIyNCw4IEBACiA8dGQgd2lkdGg9IjEwMCUlIj5Ob2JvZHk8L3RkPjwvdHI+PC90YWJsZT4KICIiIi5zdHJpcCgpCiAKK2V4cGVjdGVkX2h0bWxfZGF0YV9kb2NzdHJpbmdzID0gdHVwbGUocy5yZXBsYWNlKCcgJywgJyZuYnNwOycpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBzIGluIGV4cGVjdGVkX2RhdGFfZG9jc3RyaW5ncykKIAogIyBvdXRwdXQgcGF0dGVybiBmb3IgbWlzc2luZyBtb2R1bGUKIG1pc3NpbmdfcGF0dGVybiA9ICJubyBQeXRob24gZG9jdW1lbnRhdGlvbiBmb3VuZCBmb3IgJyVzJyIKQEAgLTIxNyw4ICsyNzUsMzIgQEAKICAgICBwcmludCAnXG4nICsgJycuam9pbihkaWZmcykKIAogCi1jbGFzcyBQeURvY0RvY1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorY2xhc3MgUHlkb2NCYXNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKKyAgICBkZWYgX3Jlc3RyaWN0ZWRfd2Fsa19wYWNrYWdlcyhzZWxmLCB3YWxrX3BhY2thZ2VzLCBwYXRoPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgQSB2ZXJzaW9uIG9mIHBrZ3V0aWwud2Fsa19wYWNrYWdlcygpIHRoYXQgd2lsbCByZXN0cmljdCBpdHNlbGYgdG8KKyAgICAgICAgYSBnaXZlbiBwYXRoLgorICAgICAgICAiIiIKKyAgICAgICAgZGVmYXVsdF9wYXRoID0gcGF0aCBvciBbb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKV0KKyAgICAgICAgZGVmIHdyYXBwZXIocGF0aD1Ob25lLCBwcmVmaXg9JycsIG9uZXJyb3I9Tm9uZSk6CisgICAgICAgICAgICByZXR1cm4gd2Fsa19wYWNrYWdlcyhwYXRoIG9yIGRlZmF1bHRfcGF0aCwgcHJlZml4LCBvbmVycm9yKQorICAgICAgICByZXR1cm4gd3JhcHBlcgorCisgICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKKyAgICBkZWYgcmVzdHJpY3Rfd2Fsa19wYWNrYWdlcyhzZWxmLCBwYXRoPU5vbmUpOgorICAgICAgICB3YWxrX3BhY2thZ2VzID0gcGtndXRpbC53YWxrX3BhY2thZ2VzCisgICAgICAgIHBrZ3V0aWwud2Fsa19wYWNrYWdlcyA9IHNlbGYuX3Jlc3RyaWN0ZWRfd2Fsa19wYWNrYWdlcyh3YWxrX3BhY2thZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeWllbGQKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHBrZ3V0aWwud2Fsa19wYWNrYWdlcyA9IHdhbGtfcGFja2FnZXMKKworCitjbGFzcyBQeWRvY0RvY1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQHJlcXVpcmVzX2RvY3N0cmluZ3MKICAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5mbGFncy5vcHRpbWl6ZSA+PSAyLAogICAgICAgICAgICAgICAgICAgICAgIkRvY3N0cmluZ3MgYXJlIG9taXR0ZWQgd2l0aCAtTzIgYW5kIGFib3ZlIikKICAgICBkZWYgdGVzdF9odG1sX2RvYyhzZWxmKToKQEAgLTIyOSwxNyArMzExLDIxIEBACiAgICAgICAgICAgICBtb2RfdXJsID0gbnR1cmwycGF0aC5wYXRobmFtZTJ1cmwobW9kX2ZpbGUpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBtb2RfdXJsID0gbW9kX2ZpbGUKLSAgICAgICAgZXhwZWN0ZWRfaHRtbCA9IGV4cGVjdGVkX2h0bWxfcGF0dGVybiAlIChtb2RfdXJsLCBtb2RfZmlsZSwgZG9jX2xvYykKKyAgICAgICAgZXhwZWN0ZWRfaHRtbCA9IGV4cGVjdGVkX2h0bWxfcGF0dGVybiAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgIChtb2RfdXJsLCBtb2RfZmlsZSwgZG9jX2xvYykgKworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfaHRtbF9kYXRhX2RvY3N0cmluZ3MpCiAgICAgICAgIGlmIHJlc3VsdCAhPSBleHBlY3RlZF9odG1sOgogICAgICAgICAgICAgcHJpbnRfZGlmZnMoZXhwZWN0ZWRfaHRtbCwgcmVzdWx0KQogICAgICAgICAgICAgc2VsZi5mYWlsKCJvdXRwdXRzIGFyZSBub3QgZXF1YWwsIHNlZSBkaWZmIGFib3ZlIikKIAorICAgIEByZXF1aXJlc19kb2NzdHJpbmdzCiAgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMuZmxhZ3Mub3B0aW1pemUgPj0gMiwKICAgICAgICAgICAgICAgICAgICAgICJEb2NzdHJpbmdzIGFyZSBvbWl0dGVkIHdpdGggLU8yIGFuZCBhYm92ZSIpCiAgICAgZGVmIHRlc3RfdGV4dF9kb2Moc2VsZik6CiAgICAgICAgIHJlc3VsdCwgZG9jX2xvYyA9IGdldF9weWRvY190ZXh0KHB5ZG9jX21vZCkKLSAgICAgICAgZXhwZWN0ZWRfdGV4dCA9IGV4cGVjdGVkX3RleHRfcGF0dGVybiAlIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnNwZWN0LmdldGFic2ZpbGUocHlkb2NfbW9kKSwgZG9jX2xvYykKKyAgICAgICAgZXhwZWN0ZWRfdGV4dCA9IGV4cGVjdGVkX3RleHRfcGF0dGVybiAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnNwZWN0LmdldGFic2ZpbGUocHlkb2NfbW9kKSwgZG9jX2xvYykgKworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfdGV4dF9kYXRhX2RvY3N0cmluZ3MpCiAgICAgICAgIGlmIHJlc3VsdCAhPSBleHBlY3RlZF90ZXh0OgogICAgICAgICAgICAgcHJpbnRfZGlmZnMoZXhwZWN0ZWRfdGV4dCwgcmVzdWx0KQogICAgICAgICAgICAgc2VsZi5mYWlsKCJvdXRwdXRzIGFyZSBub3QgZXF1YWwsIHNlZSBkaWZmIGFib3ZlIikKQEAgLTI0OSw2ICszMzUsMjUgQEAKICAgICAgICAgcmVzdWx0LCBkb2NfbG9jID0gZ2V0X3B5ZG9jX3RleHQoeG1sLmV0cmVlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRvY19sb2MsICIiLCAiTU9EVUxFIERPQ1MgaW5jb3JyZWN0bHkgaW5jbHVkZXMgYSBsaW5rIikKIAorICAgIGRlZiB0ZXN0X2dldHBhZ2VyX3dpdGhfc3RkaW5fbm9uZShzZWxmKToKKyAgICAgICAgcHJldmlvdXNfc3RkaW4gPSBzeXMuc3RkaW4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3lzLnN0ZGluID0gTm9uZQorICAgICAgICAgICAgcHlkb2MuZ2V0cGFnZXIoKSAjIFNob3VsZG4ndCBmYWlsLgorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnN0ZGluID0gcHJldmlvdXNfc3RkaW4KKworICAgIGRlZiB0ZXN0X25vbl9zdHJfbmFtZShzZWxmKToKKyAgICAgICAgIyBpc3N1ZTE0NjM4CisgICAgICAgICMgVHJlYXQgaWxsZWdhbCAobm9uLXN0cikgbmFtZSBsaWtlIG5vIG5hbWUKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIF9fbmFtZV9fID0gNDIKKyAgICAgICAgY2xhc3MgQjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgYWRvYyA9IHB5ZG9jLnJlbmRlcl9kb2MoQSgpKQorICAgICAgICBiZG9jID0gcHlkb2MucmVuZGVyX2RvYyhCKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWRvYy5yZXBsYWNlKCJBIiwgIkIiKSwgYmRvYykKKwogICAgIGRlZiB0ZXN0X25vdF9oZXJlKHNlbGYpOgogICAgICAgICBtaXNzaW5nX21vZHVsZSA9ICJ0ZXN0LmlfYW1fbm90X2hlcmUiCiAgICAgICAgIHJlc3VsdCA9IHJ1bl9weWRvYyhtaXNzaW5nX21vZHVsZSkKQEAgLTI3OCw3ICszODMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICI8dHlwZSAnZXhjZXB0aW9ucy5FeGNlcHRpb24nPiIpCiAKIAotY2xhc3MgUHlkb2NJbXBvcnRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKK2NsYXNzIFB5ZG9jSW1wb3J0VGVzdChQeWRvY0Jhc2VUZXN0KToKIAogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc2VsZi50ZXN0X2RpciA9IG9zLm1rZGlyKFRFU1RGTikKQEAgLTMxMyw4ICs0MTgsMTkgQEAKICAgICAgICAgYmFkc3ludGF4ID0gb3MucGF0aC5qb2luKHBrZ2RpciwgIl9faW5pdF9fIikgKyBvcy5leHRzZXAgKyAicHkiCiAgICAgICAgIHdpdGggb3BlbihiYWRzeW50YXgsICd3JykgYXMgZjoKICAgICAgICAgICAgIGYud3JpdGUoImludmFsaWQgcHl0aG9uIHN5bnRheCA9ICQxXG4iKQotICAgICAgICByZXN1bHQgPSBydW5fcHlkb2MoJ25vdGhpbmcnLCAnLWsnLCBQWVRIT05QQVRIPVRFU1RGTikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJywgcmVzdWx0KQorICAgICAgICB3aXRoIHNlbGYucmVzdHJpY3Rfd2Fsa19wYWNrYWdlcyhwYXRoPVtURVNURk5dKToKKyAgICAgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgb3V0OgorICAgICAgICAgICAgICAgIHdpdGggY2FwdHVyZWRfc3RkZXJyKCkgYXMgZXJyOgorICAgICAgICAgICAgICAgICAgICBweWRvYy5hcHJvcG9zKCd4eXp6eScpCisgICAgICAgICAgICAjIE5vIHJlc3VsdCwgbm8gZXJyb3IKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LmdldHZhbHVlKCksICcnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIuZ2V0dmFsdWUoKSwgJycpCisgICAgICAgICAgICAjIFRoZSBwYWNrYWdlIG5hbWUgaXMgc3RpbGwgbWF0Y2hlZAorICAgICAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBvdXQ6CisgICAgICAgICAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRlcnIoKSBhcyBlcnI6CisgICAgICAgICAgICAgICAgICAgIHB5ZG9jLmFwcm9wb3MoJ3N5bnRheGVycicpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dC5nZXR2YWx1ZSgpLnN0cmlwKCksICdzeW50YXhlcnInKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIuZ2V0dmFsdWUoKSwgJycpCiAKICAgICBkZWYgdGVzdF9hcHJvcG9zX3dpdGhfdW5yZWFkYWJsZV9kaXIoc2VsZik6CiAgICAgICAgICMgSXNzdWUgNzM2NyAtIHB5ZG9jIC1rIGZhaWxlZCB3aGVuIHVucmVhZGFibGUgZGlyIG9uIHBhdGgKQEAgLTMyMyw4ICs0MzksMTMgQEAKICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKG9zLnJtZGlyLCBzZWxmLnVucmVhZGFibGVfZGlyKQogICAgICAgICAjIE5vdGUsIG9uIFdpbmRvd3MgdGhlIGRpcmVjdG9yeSBhcHBlYXJzIHRvIGJlIHN0aWxsCiAgICAgICAgICMgICByZWFkYWJsZSBzbyB0aGlzIGlzIG5vdCByZWFsbHkgdGVzdGluZyB0aGUgaXNzdWUgdGhlcmUKLSAgICAgICAgcmVzdWx0ID0gcnVuX3B5ZG9jKCdub3RoaW5nJywgJy1rJywgUFlUSE9OUEFUSD1URVNURk4pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycsIHJlc3VsdCkKKyAgICAgICAgd2l0aCBzZWxmLnJlc3RyaWN0X3dhbGtfcGFja2FnZXMocGF0aD1bVEVTVEZOXSk6CisgICAgICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIG91dDoKKyAgICAgICAgICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZGVycigpIGFzIGVycjoKKyAgICAgICAgICAgICAgICAgICAgcHlkb2MuYXByb3BvcygnU09NRUtFWScpCisgICAgICAgICMgTm8gcmVzdWx0LCBubyBlcnJvcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dC5nZXR2YWx1ZSgpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIuZ2V0dmFsdWUoKSwgJycpCiAKIAogY2xhc3MgVGVzdERlc2NyaXB0aW9ucyh1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC0zNTUsMTMgKzQ3NiwxMDMgQEAKICAgICBkZWYgdGVzdF9uYW1lZHR1cGxlX3B1YmxpY191bmRlcnNjb3JlKHNlbGYpOgogICAgICAgICBOVCA9IG5hbWVkdHVwbGUoJ05UJywgWydhYmMnLCAnZGVmJ10sIHJlbmFtZT1UcnVlKQogICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIGhlbHBfaW86Ci0gICAgICAgICAgICBoZWxwKE5UKQorICAgICAgICAgICAgcHlkb2MuaGVscChOVCkKICAgICAgICAgaGVscHRleHQgPSBoZWxwX2lvLmdldHZhbHVlKCkKICAgICAgICAgc2VsZi5hc3NlcnRJbignXzEnLCBoZWxwdGV4dCkKICAgICAgICAgc2VsZi5hc3NlcnRJbignX3JlcGxhY2UnLCBoZWxwdGV4dCkKICAgICAgICAgc2VsZi5hc3NlcnRJbignX2FzZGljdCcsIGhlbHB0ZXh0KQogCiAKK0B1bml0dGVzdC5za2lwVW5sZXNzKHRlc3QudGVzdF9zdXBwb3J0LmhhdmVfdW5pY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICJ0ZXN0IHJlcXVpcmVzIHVuaWNvZGUgc3VwcG9ydCIpCitjbGFzcyBUZXN0VW5pY29kZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICMgQmV0dGVyIG5vdCB0byB1c2UgdW5pY29kZSBlc2NhcGVzIGluIGxpdGVyYWxzLCBsZXN0IHRoZQorICAgICAgICAjIHBhcnNlciBjaG9rZSBvbiBpdCBpZiBQeXRob24gaGFzIGJlZW4gYnVpbHQgd2l0aG91dAorICAgICAgICAjIHVuaWNvZGUgc3VwcG9ydC4KKyAgICAgICAgc2VsZi5RICA9IHR5cGVzLk1vZHVsZVR5cGUoCisgICAgICAgICAgICAnUScsICdSYXRpb25hbCBudW1iZXJzOiBceGUyXHg4NFx4OWEnLmRlY29kZSgndXRmOCcpKQorICAgICAgICBzZWxmLlEuX192ZXJzaW9uX18gPSAnXHhlMlx4ODRceDlhJy5kZWNvZGUoJ3V0ZjgnKQorICAgICAgICBzZWxmLlEuX19kYXRlX18gPSAnXHhlMlx4ODRceDlhJy5kZWNvZGUoJ3V0ZjgnKQorICAgICAgICBzZWxmLlEuX19hdXRob3JfXyA9ICdceGUyXHg4NFx4OWEnLmRlY29kZSgndXRmOCcpCisgICAgICAgIHNlbGYuUS5fX2NyZWRpdHNfXyA9ICdceGUyXHg4NFx4OWEnLmRlY29kZSgndXRmOCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNlbGYuUS5fX2RvY19fLCB1bmljb2RlKQorCisgICAgZGVmIHRlc3RfcmVuZGVyX2RvYyhzZWxmKToKKyAgICAgICAgIyByZW5kZXJfZG9jIGlzIHJvYnVzdCBhZ2FpbnN0IHVuaWNvZGUgaW4gZG9jc3RyaW5ncworICAgICAgICBkb2MgPSBweWRvYy5yZW5kZXJfZG9jKHNlbGYuUSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGRvYywgc3RyKQorCisgICAgZGVmIHRlc3RfZW5jb2RlKHNlbGYpOgorICAgICAgICAjIF9lbmNvZGUgaXMgcm9idXN0IGFnYWluc3QgY2hhcmFjdGVycyBvdXQgdGhlIHNwZWNpZmllZCBlbmNvZGluZworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHB5ZG9jLl9lbmNvZGUoc2VsZi5RLl9fZG9jX18sICdhc2NpaScpLCAnUmF0aW9uYWwgbnVtYmVyczogJiM4NDc0OycpCisKKyAgICBkZWYgdGVzdF9waXBlcGFnZXIoc2VsZik6CisgICAgICAgICMgcGlwZXBhZ2VyIGRvZXMgbm90IGNob2tlIG9uIHVuaWNvZGUKKyAgICAgICAgZG9jID0gcHlkb2MucmVuZGVyX2RvYyhzZWxmLlEpCisKKyAgICAgICAgc2F2ZWQsIG9zLnBvcGVuID0gb3MucG9wZW4sIG9wZW4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCB0ZXN0LnRlc3Rfc3VwcG9ydC50ZW1wX2N3ZCgpOgorICAgICAgICAgICAgICAgIHB5ZG9jLnBpcGVwYWdlcihkb2MsICdwaXBlJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZW4oJ3BpcGUnKS5yZWFkKCksIHB5ZG9jLl9lbmNvZGUoZG9jKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnBvcGVuID0gc2F2ZWQKKworICAgIGRlZiB0ZXN0X3RlbXBmaWxlcGFnZXIoc2VsZik6CisgICAgICAgICMgdGVtcGZpbGVwYWdlciBkb2VzIG5vdCBjaG9rZSBvbiB1bmljb2RlCisgICAgICAgIGRvYyA9IHB5ZG9jLnJlbmRlcl9kb2Moc2VsZi5RKQorCisgICAgICAgIG91dHB1dCA9IHt9CisgICAgICAgIGRlZiBtb2NrX3N5c3RlbShjbWQpOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBjbWQuc3RyaXAoKVsxOi0xXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnIicgKyBmaWxlbmFtZSArICciJywgY21kLnN0cmlwKCkpCisgICAgICAgICAgICBvdXRwdXRbJ2NvbnRlbnQnXSA9IG9wZW4oZmlsZW5hbWUpLnJlYWQoKQorICAgICAgICBzYXZlZCwgb3Muc3lzdGVtID0gb3Muc3lzdGVtLCBtb2NrX3N5c3RlbQorICAgICAgICB0cnk6CisgICAgICAgICAgICBweWRvYy50ZW1wZmlsZXBhZ2VyKGRvYywgJycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dHB1dFsnY29udGVudCddLCBweWRvYy5fZW5jb2RlKGRvYykpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5zeXN0ZW0gPSBzYXZlZAorCisgICAgZGVmIHRlc3RfcGxhaW5wYWdlcihzZWxmKToKKyAgICAgICAgIyBwbGFpbnBhZ2VyIGRvZXMgbm90IGNob2tlIG9uIHVuaWNvZGUKKyAgICAgICAgZG9jID0gcHlkb2MucmVuZGVyX2RvYyhzZWxmLlEpCisKKyAgICAgICAgIyBOb3RlOiBjYXB0dXJlZF9zdGRvdXQgaXMgdG9vIHBlcm1pc3NpdmUgd2hlbiBpdCBjb21lcyB0bworICAgICAgICAjIHVuaWNvZGUsIGFuZCB1c2luZyBpdCBoZXJlIHdvdWxkIG1ha2UgdGhlIHRlc3QgYWx3YXlzCisgICAgICAgICMgcGFzcy4KKyAgICAgICAgd2l0aCB0ZXN0LnRlc3Rfc3VwcG9ydC50ZW1wX2N3ZCgpOgorICAgICAgICAgICAgd2l0aCBvcGVuKCdvdXRwdXQnLCAndycpIGFzIGY6CisgICAgICAgICAgICAgICAgc2F2ZWQsIHN5cy5zdGRvdXQgPSBzeXMuc3Rkb3V0LCBmCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBweWRvYy5wbGFpbnBhZ2VyKGRvYykKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc2F2ZWQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ1JhdGlvbmFsIG51bWJlcnM6Jywgb3Blbignb3V0cHV0JykucmVhZCgpKQorCisgICAgZGVmIHRlc3RfdHR5cGFnZXIoc2VsZik6CisgICAgICAgICMgdHR5cGFnZXIgZG9lcyBub3QgY2hva2Ugb24gdW5pY29kZQorICAgICAgICBkb2MgPSBweWRvYy5yZW5kZXJfZG9jKHNlbGYuUSkKKyAgICAgICAgIyBUZXN0IHR0eXBhZ2VyCisgICAgICAgIHdpdGggdGVzdC50ZXN0X3N1cHBvcnQudGVtcF9jd2QoKSwgdGVzdC50ZXN0X3N1cHBvcnQuY2FwdHVyZWRfc3RkaW4oKToKKyAgICAgICAgICAgIHdpdGggb3Blbignb3V0cHV0JywgJ3cnKSBhcyBmOgorICAgICAgICAgICAgICAgIHNhdmVkLCBzeXMuc3Rkb3V0ID0gc3lzLnN0ZG91dCwgZgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcHlkb2MudHR5cGFnZXIoZG9jKQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzYXZlZAorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbignUmF0aW9uYWwgbnVtYmVyczonLCBvcGVuKCdvdXRwdXQnKS5yZWFkKCkpCisKKyAgICBkZWYgdGVzdF9odG1scGFnZShzZWxmKToKKyAgICAgICAgIyBodG1sLnBhZ2UgZG9lcyBub3QgY2hva2Ugb24gdW5pY29kZQorICAgICAgICB3aXRoIHRlc3QudGVzdF9zdXBwb3J0LnRlbXBfY3dkKCk6CisgICAgICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIG91dHB1dDoKKyAgICAgICAgICAgICAgICBweWRvYy53cml0ZWRvYyhzZWxmLlEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0cHV0LmdldHZhbHVlKCksICd3cm90ZSBRLmh0bWxcbicpCisKIGNsYXNzIFRlc3RIZWxwZXIodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X2tleXdvcmRzKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZChweWRvYy5IZWxwZXIua2V5d29yZHMpLApAQCAtMzc2LDcgKzU4Nyw3IEBACiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgcHlkb2MucmVuZGVyX2RvYyhuYW1lKQogICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnZmluZGluZyB0aGUgZG9jIG9mIHshcn0gZmFpbGVkJy5mb3JtYXQobykpCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdmaW5kaW5nIHRoZSBkb2Mgb2YgeyFyfSBmYWlsZWQnLmZvcm1hdChuYW1lKSkKIAogICAgICAgICBmb3IgbmFtZSBpbiAoJ25vdF9fYnVpbHRpbl9fJywgJ3N0cnJyJywgJ3N0cnIudHJhbnNsYXRlJywKICAgICAgICAgICAgICAgICAgICAgICdzdHIudHJycnJhbnNsYXRlJywgJ19fYnVpbHRpbl9fLnN0cnJyJywKQEAgLTM4Nyw5ICs1OTgsMTAgQEAKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHRyeToKLSAgICAgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFB5RG9jRG9jVGVzdCwKKyAgICAgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFB5ZG9jRG9jVGVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5ZG9jSW1wb3J0VGVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3REZXNjcmlwdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0VW5pY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RIZWxwZXIpCiAgICAgZmluYWxseToKICAgICAgICAgcmVhcF9jaGlsZHJlbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3B5ZXhwYXQucHkgYi9MaWIvdGVzdC90ZXN0X3B5ZXhwYXQucHkKaW5kZXggNzViMDMxYS4uOWY2M2Q0ZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9weWV4cGF0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcHlleHBhdC5weQpAQCAtMjI4LDYgKzIyOCwxNyBAQAogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQogCisgICAgZGVmIHRlc3RfcGFyc2VfYWdhaW4oc2VsZik6CisgICAgICAgIHBhcnNlciA9IGV4cGF0LlBhcnNlckNyZWF0ZSgpCisgICAgICAgIGZpbGUgPSBTdHJpbmdJTy5TdHJpbmdJTyhkYXRhKQorICAgICAgICBwYXJzZXIuUGFyc2VGaWxlKGZpbGUpCisgICAgICAgICMgSXNzdWUgNjY3NjogZW5zdXJlIGEgbWVhbmluZ2Z1bCBleGNlcHRpb24gaXMgcmFpc2VkIHdoZW4gYXR0ZW1wdGluZworICAgICAgICAjIHRvIHBhcnNlIG1vcmUgdGhhbiBvbmUgWE1MIGRvY3VtZW50IHBlciB4bWxwYXJzZXIgaW5zdGFuY2UsCisgICAgICAgICMgYSBsaW1pdGF0aW9uIG9mIHRoZSBFeHBhdCBsaWJyYXJ5LgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKGV4cGF0LmVycm9yKSBhcyBjbToKKyAgICAgICAgICAgIHBhcnNlci5QYXJzZUZpbGUoZmlsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBhdC5FcnJvclN0cmluZyhjbS5leGNlcHRpb24uY29kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGF0LmVycm9ycy5YTUxfRVJST1JfRklOSVNIRUQpCiAKIGNsYXNzIE5hbWVzcGFjZVNlcGFyYXRvclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X2xlZ2FsKHNlbGYpOgpAQCAtNTg4LDYgKzU5OSw1OCBAQAogICAgICAgICBleGNlcHQgZXhwYXQuRXhwYXRFcnJvciBhcyBlOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZSksICdYTUwgZGVjbGFyYXRpb24gbm90IHdlbGwtZm9ybWVkOiBsaW5lIDEsIGNvbHVtbiAxNCcpCiAKK2NsYXNzIEZvcmVpZ25EVERUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiCisgICAgVGVzdHMgZm9yIHRoZSBVc2VGb3JlaWduRFREIG1ldGhvZCBvZiBleHBhdCBwYXJzZXIgb2JqZWN0cy4KKyAgICAiIiIKKyAgICBkZWYgdGVzdF91c2VfZm9yZWlnbl9kdGQoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBJZiBVc2VGb3JlaWduRFREIGlzIHBhc3NlZCBUcnVlIGFuZCBhIGRvY3VtZW50IHdpdGhvdXQgYW4gZXh0ZXJuYWwKKyAgICAgICAgZW50aXR5IHJlZmVyZW5jZSBpcyBwYXJzZWQsIEV4dGVybmFsRW50aXR5UmVmSGFuZGxlciBpcyBmaXJzdCBjYWxsZWQKKyAgICAgICAgd2l0aCBOb25lIGZvciB0aGUgcHVibGljIGFuZCBzeXN0ZW0gaWRzLgorICAgICAgICAiIiIKKyAgICAgICAgaGFuZGxlcl9jYWxsX2FyZ3MgPSBbXQorICAgICAgICBkZWYgcmVzb2x2ZV9lbnRpdHkoY29udGV4dCwgYmFzZSwgc3lzdGVtX2lkLCBwdWJsaWNfaWQpOgorICAgICAgICAgICAgaGFuZGxlcl9jYWxsX2FyZ3MuYXBwZW5kKChwdWJsaWNfaWQsIHN5c3RlbV9pZCkpCisgICAgICAgICAgICByZXR1cm4gMQorCisgICAgICAgIHBhcnNlciA9IGV4cGF0LlBhcnNlckNyZWF0ZSgpCisgICAgICAgIHBhcnNlci5Vc2VGb3JlaWduRFREKFRydWUpCisgICAgICAgIHBhcnNlci5TZXRQYXJhbUVudGl0eVBhcnNpbmcoZXhwYXQuWE1MX1BBUkFNX0VOVElUWV9QQVJTSU5HX0FMV0FZUykKKyAgICAgICAgcGFyc2VyLkV4dGVybmFsRW50aXR5UmVmSGFuZGxlciA9IHJlc29sdmVfZW50aXR5CisgICAgICAgIHBhcnNlci5QYXJzZSgiPD94bWwgdmVyc2lvbj0nMS4wJz8+PGVsZW1lbnQvPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFuZGxlcl9jYWxsX2FyZ3MsIFsoTm9uZSwgTm9uZSldKQorCisgICAgICAgICMgdGVzdCBVc2VGb3JlaWduRFREKCkgaXMgZXF1YWwgdG8gVXNlRm9yZWlnbkRURChUcnVlKQorICAgICAgICBoYW5kbGVyX2NhbGxfYXJnc1s6XSA9IFtdCisKKyAgICAgICAgcGFyc2VyID0gZXhwYXQuUGFyc2VyQ3JlYXRlKCkKKyAgICAgICAgcGFyc2VyLlVzZUZvcmVpZ25EVEQoKQorICAgICAgICBwYXJzZXIuU2V0UGFyYW1FbnRpdHlQYXJzaW5nKGV4cGF0LlhNTF9QQVJBTV9FTlRJVFlfUEFSU0lOR19BTFdBWVMpCisgICAgICAgIHBhcnNlci5FeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIgPSByZXNvbHZlX2VudGl0eQorICAgICAgICBwYXJzZXIuUGFyc2UoIjw/eG1sIHZlcnNpb249JzEuMCc/PjxlbGVtZW50Lz4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhbmRsZXJfY2FsbF9hcmdzLCBbKE5vbmUsIE5vbmUpXSkKKworICAgIGRlZiB0ZXN0X2lnbm9yZV91c2VfZm9yZWlnbl9kdGQoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBJZiBVc2VGb3JlaWduRFREIGlzIHBhc3NlZCBUcnVlIGFuZCBhIGRvY3VtZW50IHdpdGggYW4gZXh0ZXJuYWwKKyAgICAgICAgZW50aXR5IHJlZmVyZW5jZSBpcyBwYXJzZWQsIEV4dGVybmFsRW50aXR5UmVmSGFuZGxlciBpcyBjYWxsZWQgd2l0aAorICAgICAgICB0aGUgcHVibGljIGFuZCBzeXN0ZW0gaWRzIGZyb20gdGhlIGRvY3VtZW50LgorICAgICAgICAiIiIKKyAgICAgICAgaGFuZGxlcl9jYWxsX2FyZ3MgPSBbXQorICAgICAgICBkZWYgcmVzb2x2ZV9lbnRpdHkoY29udGV4dCwgYmFzZSwgc3lzdGVtX2lkLCBwdWJsaWNfaWQpOgorICAgICAgICAgICAgaGFuZGxlcl9jYWxsX2FyZ3MuYXBwZW5kKChwdWJsaWNfaWQsIHN5c3RlbV9pZCkpCisgICAgICAgICAgICByZXR1cm4gMQorCisgICAgICAgIHBhcnNlciA9IGV4cGF0LlBhcnNlckNyZWF0ZSgpCisgICAgICAgIHBhcnNlci5Vc2VGb3JlaWduRFREKFRydWUpCisgICAgICAgIHBhcnNlci5TZXRQYXJhbUVudGl0eVBhcnNpbmcoZXhwYXQuWE1MX1BBUkFNX0VOVElUWV9QQVJTSU5HX0FMV0FZUykKKyAgICAgICAgcGFyc2VyLkV4dGVybmFsRW50aXR5UmVmSGFuZGxlciA9IHJlc29sdmVfZW50aXR5CisgICAgICAgIHBhcnNlci5QYXJzZSgKKyAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnPz48IURPQ1RZUEUgZm9vIFBVQkxJQyAnYmFyJyAnYmF6Jz48ZWxlbWVudC8+IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYW5kbGVyX2NhbGxfYXJncywgWygiYmFyIiwgImJheiIpXSkKKworCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgcnVuX3VuaXR0ZXN0KFNldEF0dHJpYnV0ZVRlc3QsCiAgICAgICAgICAgICAgICAgIFBhcnNlVGVzdCwKQEAgLTU5OCw3ICs2NjEsOCBAQAogICAgICAgICAgICAgICAgICBQb3NpdGlvblRlc3QsCiAgICAgICAgICAgICAgICAgIHNmMTI5NjQzM1Rlc3QsCiAgICAgICAgICAgICAgICAgIENoYXJkYXRhQnVmZmVyVGVzdCwKLSAgICAgICAgICAgICAgICAgTWFsZm9ybWVkSW5wdXRUZXh0KQorICAgICAgICAgICAgICAgICBNYWxmb3JtZWRJbnB1dFRleHQsCisgICAgICAgICAgICAgICAgIEZvcmVpZ25EVERUZXN0cykKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9xdWV1ZS5weSBiL0xpYi90ZXN0L3Rlc3RfcXVldWUucHkKaW5kZXggMGIzOGU3ZS4uMzRhNGFlZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9xdWV1ZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3F1ZXVlLnB5CkBAIC00Myw2ICs0Myw5IEBACiAKIGNsYXNzIEJsb2NraW5nVGVzdE1peGluOgogCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLnQgPSBOb25lCisKICAgICBkZWYgZG9fYmxvY2tpbmdfdGVzdChzZWxmLCBibG9ja19mdW5jLCBibG9ja19hcmdzLCB0cmlnZ2VyX2Z1bmMsIHRyaWdnZXJfYXJncyk6CiAgICAgICAgIHNlbGYudCA9IF9UcmlnZ2VyVGhyZWFkKHRyaWdnZXJfZnVuYywgdHJpZ2dlcl9hcmdzKQogICAgICAgICBzZWxmLnQuc3RhcnQoKQpAQCAtNzksNyArODIsNyBAQAogICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgidHJpZ2dlciB0aHJlYWQgZW5kZWQgYnV0IGV2ZW50IG5ldmVyIHNldCIpCiAKIAotY2xhc3MgQmFzZVF1ZXVlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSwgQmxvY2tpbmdUZXN0TWl4aW4pOgorY2xhc3MgQmFzZVF1ZXVlVGVzdChCbG9ja2luZ1Rlc3RNaXhpbik6CiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLmN1bSA9IDAKICAgICAgICAgc2VsZi5jdW1sb2NrID0gdGhyZWFkaW5nLkxvY2soKQpAQCAtMTkxLDEzICsxOTQsMTMgQEAKICAgICAgICAgc2VsZi5zaW1wbGVfcXVldWVfdGVzdChxKQogCiAKLWNsYXNzIFF1ZXVlVGVzdChCYXNlUXVldWVUZXN0KToKK2NsYXNzIFF1ZXVlVGVzdChCYXNlUXVldWVUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgdHlwZTJ0ZXN0ID0gUXVldWUuUXVldWUKIAotY2xhc3MgTGlmb1F1ZXVlVGVzdChCYXNlUXVldWVUZXN0KToKK2NsYXNzIExpZm9RdWV1ZVRlc3QoQmFzZVF1ZXVlVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgogICAgIHR5cGUydGVzdCA9IFF1ZXVlLkxpZm9RdWV1ZQogCi1jbGFzcyBQcmlvcml0eVF1ZXVlVGVzdChCYXNlUXVldWVUZXN0KToKK2NsYXNzIFByaW9yaXR5UXVldWVUZXN0KEJhc2VRdWV1ZVRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICB0eXBlMnRlc3QgPSBRdWV1ZS5Qcmlvcml0eVF1ZXVlCiAKIApAQCAtMjIyLDcgKzIyNSw3IEBACiAgICAgICAgICAgICByYWlzZSBGYWlsaW5nUXVldWVFeGNlcHRpb24sICJZb3UgTG9zZSIKICAgICAgICAgcmV0dXJuIFF1ZXVlLlF1ZXVlLl9nZXQoc2VsZikKIAotY2xhc3MgRmFpbGluZ1F1ZXVlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSwgQmxvY2tpbmdUZXN0TWl4aW4pOgorY2xhc3MgRmFpbGluZ1F1ZXVlVGVzdChCbG9ja2luZ1Rlc3RNaXhpbiwgdW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIGZhaWxpbmdfcXVldWVfdGVzdChzZWxmLCBxKToKICAgICAgICAgaWYgbm90IHEuZW1wdHkoKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcmFuZG9tLnB5IGIvTGliL3Rlc3QvdGVzdF9yYW5kb20ucHkKaW5kZXggZGY4Mjk5MC4uMWE1YTg2YiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9yYW5kb20ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9yYW5kb20ucHkKQEAgLTEsNSArMSwzIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLQogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgcmFuZG9tCiBpbXBvcnQgdGltZQpAQCAtNTcsNiArNTUsMTQgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5nZW4uanVtcGFoZWFkKSAgIyBuZWVkcyBhbiBhcmcKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5nZW4uanVtcGFoZWFkLCAyLCAzKSAgIyB0b28gbWFueQogCisgICAgZGVmIHRlc3RfanVtcGFoZWFkX3Byb2R1Y2VzX3ZhbGlkX3N0YXRlKHNlbGYpOgorICAgICAgICAjIEZyb20gaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTE0NTkxLgorICAgICAgICBzZWxmLmdlbi5zZWVkKDE5OTIxMDM2OCkKKyAgICAgICAgc2VsZi5nZW4uanVtcGFoZWFkKDEzNTUwNjc0MjMyNTU0NjQ1OTAwKQorICAgICAgICBmb3IgaSBpbiByYW5nZSg1MDApOgorICAgICAgICAgICAgdmFsID0gc2VsZi5nZW4ucmFuZG9tKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0TGVzcyh2YWwsIDEuMCkKKwogICAgIGRlZiB0ZXN0X3NhbXBsZShzZWxmKToKICAgICAgICAgIyBGb3IgdGhlIGVudGlyZSBhbGxvd2FibGUgcmFuZ2Ugb2YgMCA8PSBrIDw9IE4sIHZhbGlkYXRlIHRoYXQKICAgICAgICAgIyB0aGUgc2FtcGxlIGlzIG9mIHRoZSBjb3JyZWN0IGxlbmd0aCBhbmQgY29udGFpbnMgb25seSB1bmlxdWUgaXRlbXMKQEAgLTI0MywxMCArMjQ5LDEwIEBACiAKICAgICBkZWYgdGVzdF9iaWdyYW5kX3JhbmdlcyhzZWxmKToKICAgICAgICAgZm9yIGkgaW4gWzQwLDgwLCAxNjAsIDIwMCwgMjExLCAyNTAsIDM3NSwgNTEyLCA1NTBdOgotICAgICAgICAgICAgc3RhcnQgPSBzZWxmLmdlbi5yYW5kcmFuZ2UoMiAqKiBpKQotICAgICAgICAgICAgc3RvcCA9IHNlbGYuZ2VuLnJhbmRyYW5nZSgyICoqIChpLTIpKQorICAgICAgICAgICAgc3RhcnQgPSBzZWxmLmdlbi5yYW5kcmFuZ2UoMiAqKiAoaS0yKSkKKyAgICAgICAgICAgIHN0b3AgPSBzZWxmLmdlbi5yYW5kcmFuZ2UoMiAqKiBpKQogICAgICAgICAgICAgaWYgc3RvcCA8PSBzdGFydDoKLSAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0YXJ0IDw9IHNlbGYuZ2VuLnJhbmRyYW5nZShzdGFydCwgc3RvcCkgPCBzdG9wKQogCiAgICAgZGVmIHRlc3RfcmFuZ2VsaW1pdHMoc2VsZik6CkBAIC0zOTUsMTAgKzQwMSwxMCBAQAogCiAgICAgZGVmIHRlc3RfYmlncmFuZF9yYW5nZXMoc2VsZik6CiAgICAgICAgIGZvciBpIGluIFs0MCw4MCwgMTYwLCAyMDAsIDIxMSwgMjUwLCAzNzUsIDUxMiwgNTUwXToKLSAgICAgICAgICAgIHN0YXJ0ID0gc2VsZi5nZW4ucmFuZHJhbmdlKDIgKiogaSkKLSAgICAgICAgICAgIHN0b3AgPSBzZWxmLmdlbi5yYW5kcmFuZ2UoMiAqKiAoaS0yKSkKKyAgICAgICAgICAgIHN0YXJ0ID0gc2VsZi5nZW4ucmFuZHJhbmdlKDIgKiogKGktMikpCisgICAgICAgICAgICBzdG9wID0gc2VsZi5nZW4ucmFuZHJhbmdlKDIgKiogaSkKICAgICAgICAgICAgIGlmIHN0b3AgPD0gc3RhcnQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdGFydCA8PSBzZWxmLmdlbi5yYW5kcmFuZ2Uoc3RhcnQsIHN0b3ApIDwgc3RvcCkKIAogICAgIGRlZiB0ZXN0X3JhbmdlbGltaXRzKHNlbGYpOgpAQCAtNDg2LDYgKzQ5Miw3IEBACiAgICAgICAgIGcucmFuZG9tID0geFs6XS5wb3A7IGcucGFyZXRvdmFyaWF0ZSgxLjApCiAgICAgICAgIGcucmFuZG9tID0geFs6XS5wb3A7IGcuZXhwb3ZhcmlhdGUoMS4wKQogICAgICAgICBnLnJhbmRvbSA9IHhbOl0ucG9wOyBnLndlaWJ1bGx2YXJpYXRlKDEuMCwgMS4wKQorICAgICAgICBnLnJhbmRvbSA9IHhbOl0ucG9wOyBnLnZvbm1pc2VzdmFyaWF0ZSgxLjAsIDEuMCkKICAgICAgICAgZy5yYW5kb20gPSB4WzpdLnBvcDsgZy5ub3JtYWx2YXJpYXRlKDAuMCwgMS4wKQogICAgICAgICBnLnJhbmRvbSA9IHhbOl0ucG9wOyBnLmdhdXNzKDAuMCwgMS4wKQogICAgICAgICBnLnJhbmRvbSA9IHhbOl0ucG9wOyBnLmxvZ25vcm12YXJpYXRlKDAuMCwgMS4wKQpAQCAtNTA2LDYgKzUxMyw3IEBACiAgICAgICAgICAgICAgICAgKGcudW5pZm9ybSwgKDEuMCwxMC4wKSwgKDEwLjArMS4wKS8yLCAoMTAuMC0xLjApKioyLzEyKSwKICAgICAgICAgICAgICAgICAoZy50cmlhbmd1bGFyLCAoMC4wLCAxLjAsIDEuMC8zLjApLCA0LjAvOS4wLCA3LjAvOS4wLzE4LjApLAogICAgICAgICAgICAgICAgIChnLmV4cG92YXJpYXRlLCAoMS41LCksIDEvMS41LCAxLzEuNSoqMiksCisgICAgICAgICAgICAgICAgKGcudm9ubWlzZXN2YXJpYXRlLCAoMS4yMywgMCksIHBpLCBwaSoqMi8zKSwKICAgICAgICAgICAgICAgICAoZy5wYXJldG92YXJpYXRlLCAoNS4wLCksIDUuMC8oNS4wLTEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuMC8oKDUuMC0xKSoqMiooNS4wLTIpKSksCiAgICAgICAgICAgICAgICAgKGcud2VpYnVsbHZhcmlhdGUsICgxLjAsIDMuMCksIGdhbW1hKDErMS8zLjApLApAQCAtNTIyLDggKzUzMCw1MCBAQAogICAgICAgICAgICAgICAgIHMxICs9IGUKICAgICAgICAgICAgICAgICBzMiArPSAoZSAtIG11KSAqKiAyCiAgICAgICAgICAgICBOID0gbGVuKHkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHMxL04sIG11LCAyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChzMi8oTi0xKSwgc2lnbWFzcXJkLCAyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChzMS9OLCBtdSwgcGxhY2VzPTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZz0nJXMlcicgJSAodmFyaWF0ZS5fX25hbWVfXywgYXJncykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHMyLyhOLTEpLCBzaWdtYXNxcmQsIHBsYWNlcz0yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2c9JyVzJXInICUgKHZhcmlhdGUuX19uYW1lX18sIGFyZ3MpKQorCisgICAgZGVmIHRlc3RfY29uc3RhbnQoc2VsZik6CisgICAgICAgIGcgPSByYW5kb20uUmFuZG9tKCkKKyAgICAgICAgTiA9IDEwMAorICAgICAgICBmb3IgdmFyaWF0ZSwgYXJncywgZXhwZWN0ZWQgaW4gWworICAgICAgICAgICAgICAgIChnLnVuaWZvcm0sICgxMC4wLCAxMC4wKSwgMTAuMCksCisgICAgICAgICAgICAgICAgKGcudHJpYW5ndWxhciwgKDEwLjAsIDEwLjApLCAxMC4wKSwKKyAgICAgICAgICAgICAgICAoZy50cmlhbmd1bGFyLCAoMTAuMCwgMTAuMCwgMTAuMCksIDEwLjApLAorICAgICAgICAgICAgICAgIChnLmV4cG92YXJpYXRlLCAoZmxvYXQoJ2luZicpLCksIDAuMCksCisgICAgICAgICAgICAgICAgKGcudm9ubWlzZXN2YXJpYXRlLCAoMy4wLCBmbG9hdCgnaW5mJykpLCAzLjApLAorICAgICAgICAgICAgICAgIChnLmdhdXNzLCAoMTAuMCwgMC4wKSwgMTAuMCksCisgICAgICAgICAgICAgICAgKGcubG9nbm9ybXZhcmlhdGUsICgwLjAsIDAuMCksIDEuMCksCisgICAgICAgICAgICAgICAgKGcubG9nbm9ybXZhcmlhdGUsICgtZmxvYXQoJ2luZicpLCAwLjApLCAwLjApLAorICAgICAgICAgICAgICAgIChnLm5vcm1hbHZhcmlhdGUsICgxMC4wLCAwLjApLCAxMC4wKSwKKyAgICAgICAgICAgICAgICAoZy5wYXJldG92YXJpYXRlLCAoZmxvYXQoJ2luZicpLCksIDEuMCksCisgICAgICAgICAgICAgICAgKGcud2VpYnVsbHZhcmlhdGUsICgxMC4wLCBmbG9hdCgnaW5mJykpLCAxMC4wKSwKKyAgICAgICAgICAgICAgICAoZy53ZWlidWxsdmFyaWF0ZSwgKDAuMCwgMTAuMCksIDAuMCksCisgICAgICAgICAgICBdOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoTik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YXJpYXRlKCphcmdzKSwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF92b25fbWlzZXNfcmFuZ2Uoc2VsZik6CisgICAgICAgICMgSXNzdWUgMTcxNDk6IHZvbiBtaXNlcyB2YXJpYXRlcyB3ZXJlIG5vdCBjb25zaXN0ZW50bHkgaW4gdGhlCisgICAgICAgICMgcmFuZ2UgWzAsIDIqUEldLgorICAgICAgICBnID0gcmFuZG9tLlJhbmRvbSgpCisgICAgICAgIE4gPSAxMDAKKyAgICAgICAgZm9yIG11IGluIDAuMCwgMC4xLCAzLjEsIDYuMjoKKyAgICAgICAgICAgIGZvciBrYXBwYSBpbiAwLjAsIDIuMywgNTAwLjA6CisgICAgICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2UoTik6CisgICAgICAgICAgICAgICAgICAgIHNhbXBsZSA9IGcudm9ubWlzZXN2YXJpYXRlKG11LCBrYXBwYSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAgICAgMCA8PSBzYW1wbGUgPD0gcmFuZG9tLlRXT1BJLAorICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSgidm9ubWlzZXN2YXJpYXRlKHt9LCB7fSkgcHJvZHVjZWQgYSByZXN1bHQge30gb3V0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG9mIHJhbmdlIFswLCAyKnBpXSIpLmZvcm1hdChtdSwga2FwcGEsIHNhbXBsZSkpCisKKyAgICBkZWYgdGVzdF92b25fbWlzZXNfbGFyZ2Vfa2FwcGEoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzE3MTQxOiB2b25taXNlc3ZhcmlhdGUoKSB3YXMgaGFuZyBmb3IgbGFyZ2Uga2FwcGFzCisgICAgICAgIHJhbmRvbS52b25taXNlc3ZhcmlhdGUoMCwgMWUxNSkKKyAgICAgICAgcmFuZG9tLnZvbm1pc2VzdmFyaWF0ZSgwLCAxZTEwMCkKKwogCiBjbGFzcyBUZXN0TW9kdWxlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdE1hZ2ljQ29uc3RhbnRzKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9yZS5weSBiL0xpYi90ZXN0L3Rlc3RfcmUucHkKaW5kZXggMWY3Mzk2Ny4uZDc2OTI4OCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9yZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3JlLnB5CkBAIC0xLDExICsxLDE1IEBACiBmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlLCBydW5fdW5pdHRlc3QsIGltcG9ydF9tb2R1bGUKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHByZWNpc2lvbmJpZ21lbXRlc3QsIF8yRywgY3B5dGhvbl9vbmx5Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBjYXB0dXJlZF9zdGRvdXQKIGltcG9ydCByZQogZnJvbSByZSBpbXBvcnQgU2Nhbm5lcgoraW1wb3J0IHNyZV9jb25zdGFudHMKIGltcG9ydCBzeXMKIGltcG9ydCBzdHJpbmcKIGltcG9ydCB0cmFjZWJhY2sKIGZyb20gd2Vha3JlZiBpbXBvcnQgcHJveHkKIAorCiAjIE1pc2MgdGVzdHMgZnJvbSBUaW0gUGV0ZXJzJyByZS5kb2MKIAogIyBXQVJOSU5HOiBEb24ndCBjaGFuZ2UgZGV0YWlscyBpbiB0aGVzZSB0ZXN0cyBpZiB5b3UgZG9uJ3Qga25vdwpAQCAtMTc0LDExICsxNzgsMzEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJ3gqJywgJy0nLCAnYWJ4ZCcpLCAnLWEtYi1kLScpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCd4KycsICctJywgJ2FieGQnKSwgJ2FiLWQnKQogCisgICAgZGVmIHRlc3Rfc3ltYm9saWNfZ3JvdXBzKHNlbGYpOgorICAgICAgICByZS5jb21waWxlKCcoP1A8YT54KSg/UD1hKSg/KGEpeSknKQorICAgICAgICByZS5jb21waWxlKCcoP1A8YTE+eCkoP1A9YTEpKD8oYTEpeSknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuY29tcGlsZSwgJyg/UDxhPikoP1A8YT4pJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLmNvbXBpbGUsICcoP1B4KScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCAnKD9QPSknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuY29tcGlsZSwgJyg/UD0xKScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCAnKD9QPWEpJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLmNvbXBpbGUsICcoP1A9YTEpJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLmNvbXBpbGUsICcoP1A9YS4pJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLmNvbXBpbGUsICcoP1A8KScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCAnKD9QPD4pJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLmNvbXBpbGUsICcoP1A8MT4pJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLmNvbXBpbGUsICcoP1A8YS4+KScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCAnKD8oKSknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuY29tcGlsZSwgJyg/KGEpKScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCAnKD8oMWEpKScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCAnKD8oYS4pKScpCisKICAgICBkZWYgdGVzdF9zeW1ib2xpY19yZWZzKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuc3ViLCAnKD9QPGE+eCknLCAnXGc8YScsICd4eCcpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5zdWIsICcoP1A8YT54KScsICdcZzwnLCAneHgnKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuc3ViLCAnKD9QPGE+eCknLCAnXGcnLCAneHgnKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuc3ViLCAnKD9QPGE+eCknLCAnXGc8YSBhPicsICd4eCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5zdWIsICcoP1A8YT54KScsICdcZzw+JywgJ3h4JykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLnN1YiwgJyg/UDxhPngpJywgJ1xnPDFhMT4nLCAneHgnKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCByZS5zdWIsICcoP1A8YT54KScsICdcZzxhYj4nLCAneHgnKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuc3ViLCAnKD9QPGE+eCl8KD9QPGI+eSknLCAnXGc8Yj4nLCAneHgnKQpAQCAtMzczLDExICszOTcsNDUgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zZWFyY2gociJcZFxEXHdcV1xzXFMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMWFhISBhIiwgcmUuVU5JQ09ERSkuZ3JvdXAoMCksICIxYWEhIGEiKQogCisgICAgZGVmIHRlc3Rfc3RyaW5nX2JvdW5kYXJpZXMoc2VsZik6CisgICAgICAgICMgU2VlIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxMDcxMworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaChyIlxiKGFiYylcYiIsICJhYmMiKS5ncm91cCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYWJjIikKKyAgICAgICAgIyBUaGVyZSdzIGEgd29yZCBib3VuZGFyeSBhdCB0aGUgc3RhcnQgb2YgYSBzdHJpbmcuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChyIlxiIiwgImFiYyIpKQorICAgICAgICAjIEEgbm9uLWVtcHR5IHN0cmluZyBpbmNsdWRlcyBhIG5vbi1ib3VuZGFyeSB6ZXJvLWxlbmd0aCBtYXRjaC4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLnNlYXJjaChyIlxCIiwgImFiYyIpKQorICAgICAgICAjIFRoZXJlIGlzIG5vIG5vbi1ib3VuZGFyeSBtYXRjaCBhdCB0aGUgc3RhcnQgb2YgYSBzdHJpbmcuCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmUubWF0Y2gociJcQiIsICJhYmMiKSkKKyAgICAgICAgIyBIb3dldmVyLCBhbiBlbXB0eSBzdHJpbmcgY29udGFpbnMgbm8gd29yZCBib3VuZGFyaWVzLCBhbmQgYWxzbyBubworICAgICAgICAjIG5vbi1ib3VuZGFyaWVzLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaChyIlxCIiwgIiIpLCBOb25lKQorICAgICAgICAjIFRoaXMgb25lIGlzIHF1ZXN0aW9uYWJsZSBhbmQgZGlmZmVyZW50IGZyb20gdGhlIHBlcmxyZSBiZWhhdmlvdXIsCisgICAgICAgICMgYnV0IGRlc2NyaWJlcyBjdXJyZW50IGJlaGF2aW9yLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaChyIlxiIiwgIiIpLCBOb25lKQorICAgICAgICAjIEEgc2luZ2xlIHdvcmQtY2hhcmFjdGVyIHN0cmluZyBoYXMgdHdvIGJvdW5kYXJpZXMsIGJ1dCBubworICAgICAgICAjIG5vbi1ib3VuZGFyeSBnYXBzLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZS5maW5kYWxsKHIiXGIiLCAiYSIpKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmUuZmluZGFsbChyIlxCIiwgImEiKSksIDApCisgICAgICAgICMgSWYgdGhlcmUgYXJlIG5vIHdvcmRzLCB0aGVyZSBhcmUgbm8gYm91bmRhcmllcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZS5maW5kYWxsKHIiXGIiLCAiICIpKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmUuZmluZGFsbChyIlxiIiwgIiAgICIpKSwgMCkKKyAgICAgICAgIyBDYW4gbWF0Y2ggYXJvdW5kIHRoZSB3aGl0ZXNwYWNlLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZS5maW5kYWxsKHIiXEIiLCAiICIpKSwgMikKKwogICAgIGRlZiB0ZXN0X2JpZ2NoYXJzZXQoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2godSIoW1x1MjIyMlx1MjIyM10pIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Ilx1MjIyMiIpLmdyb3VwKDEpLCB1Ilx1MjIyMiIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2godSIoW1x1MjIyMlx1MjIyM10pIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Ilx1MjIyMiIsIHJlLlVOSUNPREUpLmdyb3VwKDEpLCB1Ilx1MjIyMiIpCisgICAgICAgIHIgPSB1J1slc10nICUgdScnLmpvaW4obWFwKHVuaWNociwgcmFuZ2UoMjU2LCAyKioxNiwgMjU1KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gociwgdSJcdWZmMDEiLCByZS5VTklDT0RFKS5ncm91cCgpLCB1Ilx1ZmYwMSIpCisKKyAgICBkZWYgdGVzdF9iaWdfY29kZXNpemUoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzExNjAKKyAgICAgICAgciA9IHJlLmNvbXBpbGUoJ3wnLmpvaW4oKCclZCcleCBmb3IgeCBpbiByYW5nZSgxMDAwMCkpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUoci5tYXRjaCgnMTAwMCcpKQorICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZShyLm1hdGNoKCc5OTk5JykpCiAKICAgICBkZWYgdGVzdF9hbnlhbGwoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goImEuYiIsICJhXG5iIiwgcmUuRE9UQUxMKS5ncm91cCgwKSwKQEAgLTU3NCw2ICs2MzIsMTUgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgnKHgpKnknLCA1MDAwMConeCcrJ3knKS5ncm91cCgxKSwgJ3gnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCcoeCkqP3knLCA1MDAwMConeCcrJ3knKS5ncm91cCgxKSwgJ3gnKQogCisgICAgZGVmIHRlc3RfdW5saW1pdGVkX3plcm9fd2lkdGhfcmVwZWF0KHNlbGYpOgorICAgICAgICAjIElzc3VlICM5NjY5CisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHJlLm1hdGNoKHInKD86YT8pKnknLCAneicpKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaChyJyg/OmE/KSt5JywgJ3onKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmUubWF0Y2gocicoPzphPyl7Mix9eScsICd6JykpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHJlLm1hdGNoKHInKD86YT8pKj95JywgJ3onKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmUubWF0Y2gocicoPzphPykrP3knLCAneicpKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaChyJyg/OmE/KXsyLH0/eScsICd6JykpCisKICAgICBkZWYgdGVzdF9zY2FubmVyKHNlbGYpOgogICAgICAgICBkZWYgc19pZGVudChzY2FubmVyLCB0b2tlbik6IHJldHVybiB0b2tlbgogICAgICAgICBkZWYgc19vcGVyYXRvcihzY2FubmVyLCB0b2tlbik6IHJldHVybiAib3AlcyIgJSB0b2tlbgpAQCAtNjM0LDcgKzcwMSw3IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHVuaWNvZGUKICAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKLSAgICAgICAgICAgIHJldHVybiAgIyBubyBwcm9ibGVtIGlmIHdlIGhhdmUgbm8gdW5pY29kZQorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgnbm8gcHJvYmxlbSBpZiB3ZSBoYXZlIG5vIHVuaWNvZGUnKQogICAgICAgICBjbGFzcyBteV91bmljb2RlKHVuaWNvZGUpOiBwYXNzCiAgICAgICAgIHBhdCA9IHJlLmNvbXBpbGUobXlfdW5pY29kZSgiYWJjIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGF0Lm1hdGNoKCJ4eXoiKSwgTm9uZSkKQEAgLTY0OCw3ICs3MTUsNyBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICB1bmljb2RlCiAgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6Ci0gICAgICAgICAgICByZXR1cm4gIyBubyBwcm9ibGVtIGlmIHdlIGhhdmUgbm8gdW5pY29kZQorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgnbm8gcHJvYmxlbSBpZiB3ZSBoYXZlIG5vIHVuaWNvZGUnKQogICAgICAgICBzZWxmLmFzc2VydFRydWUocmUuY29tcGlsZSgnYnVnXzkyNjA3NScpIGlzIG5vdAogICAgICAgICAgICAgICAgICAgICAgcmUuY29tcGlsZShldmFsKCJ1J2J1Z185MjYwNzUnIikpKQogCkBAIC02NTYsNyArNzIzLDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgdW5pY29kZQogICAgICAgICBleGNlcHQgTmFtZUVycm9yOgotICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgnbm8gcHJvYmxlbSBpZiB3ZSBoYXZlIG5vIHVuaWNvZGUnKQogICAgICAgICBwYXR0ZXJuID0gZXZhbCgndSJbXHUwMDJFXHUzMDAyXHVGRjBFXHVGRjYxXSInKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLmNvbXBpbGUocGF0dGVybikuc3BsaXQoImEuYi5jIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgWydhJywnYicsJ2MnXSkKQEAgLTc1Nyw2ICs4MjQsMTI5IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmUuZmluZGl0ZXIsICJhIiwge30pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIF9zcmUuY29tcGlsZSwgImFiYyIsIDAsIFtsb25nX292ZXJmbG93XSkKIAorICAgIGRlZiB0ZXN0X2NvbXBpbGUoc2VsZik6CisgICAgICAgICMgVGVzdCByZXR1cm4gdmFsdWUgd2hlbiBnaXZlbiBzdHJpbmcgYW5kIHBhdHRlcm4gYXMgcGFyYW1ldGVyCisgICAgICAgIHBhdHRlcm4gPSByZS5jb21waWxlKCdyYW5kb20gcGF0dGVybicpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShwYXR0ZXJuLCByZS5fcGF0dGVybl90eXBlKQorICAgICAgICBzYW1lX3BhdHRlcm4gPSByZS5jb21waWxlKHBhdHRlcm4pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzYW1lX3BhdHRlcm4sIHJlLl9wYXR0ZXJuX3R5cGUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2FtZV9wYXR0ZXJuLCBwYXR0ZXJuKQorICAgICAgICAjIFRlc3QgYmVoYXZpb3VyIHdoZW4gbm90IGdpdmVuIGEgc3RyaW5nIG9yIHBhdHRlcm4gYXMgcGFyYW1ldGVyCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmUuY29tcGlsZSwgMCkKKworICAgIGRlZiB0ZXN0X2J1Z18xMzg5OShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTM4OTk6IHJlIHBhdHRlcm4gciJbXEFdIiBzaG91bGQgd29yayBsaWtlICJBIiBidXQgbWF0Y2hlcworICAgICAgICAjIG5vdGhpbmcuIERpdHRvIEIgYW5kIFouCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuZmluZGFsbChyJ1tcQVxCXGJcQ1xaXScsICdBQlxiQ1onKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ0EnLCAnQicsICdcYicsICdDJywgJ1onXSkKKworICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzJHLCBtZW11c2U9MSkKKyAgICBkZWYgdGVzdF9sYXJnZV9zZWFyY2goc2VsZiwgc2l6ZSk6CisgICAgICAgICMgSXNzdWUgIzEwMTgyOiBpbmRpY2VzIHdlcmUgMzItYml0LXRydW5jYXRlZC4KKyAgICAgICAgcyA9ICdhJyAqIHNpemUKKyAgICAgICAgbSA9IHJlLnNlYXJjaCgnJCcsIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5zdGFydCgpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZW5kKCksIHNpemUpCisKKyAgICAjIFRoZSBodWdlIG1lbXVzZSBpcyBiZWNhdXNlIG9mIHJlLnN1YigpIHVzaW5nIGEgbGlzdCBhbmQgYSBqb2luKCkKKyAgICAjIHRvIGNyZWF0ZSB0aGUgcmVwbGFjZW1lbnQgcmVzdWx0LgorICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzJHLCBtZW11c2U9MTYgKyAyKQorICAgIGRlZiB0ZXN0X2xhcmdlX3N1Ym4oc2VsZiwgc2l6ZSk6CisgICAgICAgICMgSXNzdWUgIzEwMTgyOiBpbmRpY2VzIHdlcmUgMzItYml0LXRydW5jYXRlZC4KKyAgICAgICAgcyA9ICdhJyAqIHNpemUKKyAgICAgICAgciwgbiA9IHJlLnN1Ym4oJycsICcnLCBzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIsIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobiwgc2l6ZSArIDEpCisKKworICAgIGRlZiB0ZXN0X3JlcGVhdF9taW5tYXhfb3ZlcmZsb3coc2VsZik6CisgICAgICAgICMgSXNzdWUgIzEzMTY5CisgICAgICAgIHN0cmluZyA9ICJ4IiAqIDEwMDAwMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHIiLns2NTUzNX0iLCBzdHJpbmcpLnNwYW4oKSwgKDAsIDY1NTM1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyIi57LDY1NTM1fSIsIHN0cmluZykuc3BhbigpLCAoMCwgNjU1MzUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHIiLns2NTUzNSx9PyIsIHN0cmluZykuc3BhbigpLCAoMCwgNjU1MzUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHIiLns2NTUzNn0iLCBzdHJpbmcpLnNwYW4oKSwgKDAsIDY1NTM2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyIi57LDY1NTM2fSIsIHN0cmluZykuc3BhbigpLCAoMCwgNjU1MzYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHIiLns2NTUzNix9PyIsIHN0cmluZykuc3BhbigpLCAoMCwgNjU1MzYpKQorICAgICAgICAjIDIqKjEyOCBzaG91bGQgYmUgYmlnIGVub3VnaCB0byBvdmVyZmxvdyBib3RoIFNSRV9DT0RFIGFuZCBQeV9zc2l6ZV90LgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCByZS5jb21waWxlLCByIi57JWR9IiAlIDIqKjEyOCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgcmUuY29tcGlsZSwgciIueywlZH0iICUgMioqMTI4KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCByZS5jb21waWxlLCByIi57JWQsfT8iICUgMioqMTI4KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCByZS5jb21waWxlLCByIi57JWQsJWR9IiAlICgyKioxMjksIDIqKjEyOCkpCisKKyAgICBAY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3RfcmVwZWF0X21pbm1heF9vdmVyZmxvd19tYXhyZXBlYXQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gX3NyZSBpbXBvcnQgTUFYUkVQRUFUCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ3JlcXVpcmVzIF9zcmUuTUFYUkVQRUFUIGNvbnN0YW50JykKKyAgICAgICAgc3RyaW5nID0gIngiICogMTAwMDAwCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHJlLm1hdGNoKHIiLnslZH0iICUgKE1BWFJFUEVBVCAtIDEpLCBzdHJpbmcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHIiLnssJWR9IiAlIChNQVhSRVBFQVQgLSAxKSwgc3RyaW5nKS5zcGFuKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIDEwMDAwMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHJlLm1hdGNoKHIiLnslZCx9PyIgJSAoTUFYUkVQRUFUIC0gMSksIHN0cmluZykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHJlLmNvbXBpbGUsIHIiLnslZH0iICUgTUFYUkVQRUFUKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCByZS5jb21waWxlLCByIi57LCVkfSIgJSBNQVhSRVBFQVQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHJlLmNvbXBpbGUsIHIiLnslZCx9PyIgJSBNQVhSRVBFQVQpCisKKyAgICBkZWYgdGVzdF9iYWNrcmVmX2dyb3VwX25hbWVfaW5fZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICAjIElzc3VlIDE3MzQxOiBQb29yIGVycm9yIG1lc3NhZ2Ugd2hlbiBjb21waWxpbmcgaW52YWxpZCByZWdleAorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKHNyZV9jb25zdGFudHMuZXJyb3IsICc8Zm9vPicpOgorICAgICAgICAgICAgcmUuY29tcGlsZSgnKD9QPTxmb28+KScpCisKKyAgICBkZWYgdGVzdF9ncm91cF9uYW1lX2luX2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAxNzM0MTogUG9vciBlcnJvciBtZXNzYWdlIHdoZW4gY29tcGlsaW5nIGludmFsaWQgcmVnZXgKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChzcmVfY29uc3RhbnRzLmVycm9yLCAnXD9mb28nKToKKyAgICAgICAgICAgIHJlLmNvbXBpbGUoJyg/UDw/Zm9vPiknKQorCisgICAgZGVmIHRlc3RfaXNzdWUxNzk5OChzZWxmKToKKyAgICAgICAgZm9yIHJlcHMgaW4gJyonLCAnKycsICc/JywgJ3sxfSc6CisgICAgICAgICAgICBmb3IgbW9kIGluICcnLCAnPyc6CisgICAgICAgICAgICAgICAgcGF0dGVybiA9ICcuJyArIHJlcHMgKyBtb2QgKyAneXonCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5jb21waWxlKHBhdHRlcm4sIHJlLlMpLmZpbmRhbGwoJ3h5eicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyd4eXonXSwgbXNnPXBhdHRlcm4pCisgICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uZW5jb2RlKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLmNvbXBpbGUocGF0dGVybiwgcmUuUykuZmluZGFsbChiJ3h5eicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2IneHl6J10sIG1zZz1wYXR0ZXJuKQorCisKKyAgICBkZWYgdGVzdF9idWdfMjUzNyhzZWxmKToKKyAgICAgICAgIyBpc3N1ZSAyNTM3OiBlbXB0eSBzdWJtYXRjaGVzCisgICAgICAgIGZvciBvdXRlcl9vcCBpbiAoJ3swLH0nLCAnKicsICcrJywgJ3sxLDE4N30nKToKKyAgICAgICAgICAgIGZvciBpbm5lcl9vcCBpbiAoJ3swLH0nLCAnKicsICc/Jyk6CisgICAgICAgICAgICAgICAgciA9IHJlLmNvbXBpbGUoIl4oKHh8eSklcyklcyIgJSAoaW5uZXJfb3AsIG91dGVyX29wKSkKKyAgICAgICAgICAgICAgICBtID0gci5tYXRjaCgieHl5enkiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5ncm91cCgwKSwgInh5eSIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmdyb3VwKDEpLCAiIikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZ3JvdXAoMiksICJ5IikKKworICAgIGRlZiB0ZXN0X2RlYnVnX2ZsYWcoc2VsZik6CisgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgb3V0OgorICAgICAgICAgICAgcmUuY29tcGlsZSgnZm9vJywgcmUuREVCVUcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LmdldHZhbHVlKCkuc3BsaXRsaW5lcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnbGl0ZXJhbCAxMDInLCAnbGl0ZXJhbCAxMTEnLCAnbGl0ZXJhbCAxMTEnXSkKKyAgICAgICAgIyBEZWJ1ZyBvdXRwdXQgaXMgb3V0cHV0IGFnYWluIGV2ZW4gYSBzZWNvbmQgdGltZSAoYnlwYXNzaW5nCisgICAgICAgICMgdGhlIGNhY2hlIC0tIGlzc3VlICMyMDQyNikuCisgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgb3V0OgorICAgICAgICAgICAgcmUuY29tcGlsZSgnZm9vJywgcmUuREVCVUcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LmdldHZhbHVlKCkuc3BsaXRsaW5lcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnbGl0ZXJhbCAxMDInLCAnbGl0ZXJhbCAxMTEnLCAnbGl0ZXJhbCAxMTEnXSkKKworICAgIGRlZiB0ZXN0X2tleXdvcmRfcGFyYW1ldGVycyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMjAyODM6IEFjY2VwdGluZyB0aGUgc3RyaW5nIGtleXdvcmQgcGFyYW1ldGVyLgorICAgICAgICBwYXQgPSByZS5jb21waWxlKHInKGFiKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBwYXQubWF0Y2goc3RyaW5nPSdhYnJhY2FkYWJyYScsIHBvcz03LCBlbmRwb3M9MTApLnNwYW4oKSwgKDcsIDkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgcGF0LnNlYXJjaChzdHJpbmc9J2FicmFjYWRhYnJhJywgcG9zPTMsIGVuZHBvcz0xMCkuc3BhbigpLCAoNywgOSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBwYXQuZmluZGFsbChzdHJpbmc9J2FicmFjYWRhYnJhJywgcG9zPTMsIGVuZHBvcz0xMCksIFsnYWInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHBhdC5zcGxpdChzdHJpbmc9J2FicmFjYWRhYnJhJywgbWF4c3BsaXQ9MSksCisgICAgICAgICAgICBbJycsICdhYicsICdyYWNhZGFicmEnXSkKKworCiBkZWYgcnVuX3JlX3Rlc3RzKCk6CiAgICAgZnJvbSB0ZXN0LnJlX3Rlc3RzIGltcG9ydCB0ZXN0cywgU1VDQ0VFRCwgRkFJTCwgU1lOVEFYX0VSUk9SCiAgICAgaWYgdmVyYm9zZToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcmVhZGxpbmUucHkgYi9MaWIvdGVzdC90ZXN0X3JlYWRsaW5lLnB5CmluZGV4IDExMDQ1YzguLmFhYmJmNTQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcmVhZGxpbmUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9yZWFkbGluZS5weQpAQCAtMSwxNyArMSwyMyBAQAogIiIiCiBWZXJ5IG1pbmltYWwgdW5pdHRlc3RzIGZvciBwYXJ0cyBvZiB0aGUgcmVhZGxpbmUgbW9kdWxlLgotCi1UaGVzZSB0ZXN0cyB3ZXJlIGFkZGVkIHRvIGNoZWNrIHRoYXQgdGhlIGxpYmVkaXQgZW11bGF0aW9uIG9uIE9TWCBhbmQKLXRoZSAicmVhbCIgcmVhZGxpbmUgaGF2ZSB0aGUgc2FtZSBpbnRlcmZhY2UgZm9yIGhpc3RvcnkgbWFuaXB1bGF0aW9uLiBUaGF0J3MKLXdoeSB0aGUgdGVzdHMgY292ZXIgb25seSBhIHNtYWxsIHN1YnNldCBvZiB0aGUgaW50ZXJmYWNlLgogIiIiCitpbXBvcnQgb3MKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBpbXBvcnRfbW9kdWxlCitmcm9tIHRlc3Quc2NyaXB0X2hlbHBlciBpbXBvcnQgYXNzZXJ0X3B5dGhvbl9vawogCiAjIFNraXAgdGVzdHMgaWYgdGhlcmUgaXMgbm8gcmVhZGxpbmUgbW9kdWxlCiByZWFkbGluZSA9IGltcG9ydF9tb2R1bGUoJ3JlYWRsaW5lJykKIAogY2xhc3MgVGVzdEhpc3RvcnlNYW5pcHVsYXRpb24gKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUaGVzZSB0ZXN0cyB3ZXJlIGFkZGVkIHRvIGNoZWNrIHRoYXQgdGhlIGxpYmVkaXQgZW11bGF0aW9uIG9uIE9TWCBhbmQKKyAgICB0aGUgInJlYWwiIHJlYWRsaW5lIGhhdmUgdGhlIHNhbWUgaW50ZXJmYWNlIGZvciBoaXN0b3J5IG1hbmlwdWxhdGlvbi4KKyAgICBUaGF0J3Mgd2h5IHRoZSB0ZXN0cyBjb3ZlciBvbmx5IGEgc21hbGwgc3Vic2V0IG9mIHRoZSBpbnRlcmZhY2UuCisgICAgIiIiCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKG5vdCBoYXNhdHRyKHJlYWRsaW5lLCAnY2xlYXJfaGlzdG9yeScpLAorICAgICAgICAgICAgICAgICAgICAgIlRoZSBoaXN0b3J5IHVwZGF0ZSB0ZXN0IGNhbm5vdCBiZSBydW4gYmVjYXVzZSB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgImNsZWFyX2hpc3RvcnkgbWV0aG9kIGlzIG5vdCBhdmFpbGFibGUuIikKICAgICBkZWYgdGVzdEhpc3RvcnlVcGRhdGVzKHNlbGYpOgogICAgICAgICByZWFkbGluZS5jbGVhcl9oaXN0b3J5KCkKIApAQCAtMzYsOCArNDIsMTggQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkbGluZS5nZXRfY3VycmVudF9oaXN0b3J5X2xlbmd0aCgpLCAxKQogCiAKK2NsYXNzIFRlc3RSZWFkbGluZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfaW5pdChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTk4ODQ6IEVuc3VyZSB0aGF0IHRoZSBBTlNJIHNlcXVlbmNlICJcMDMzWzEwMzRoIiBpcyBub3QKKyAgICAgICAgIyB3cml0dGVuIGludG8gc3Rkb3V0IHdoZW4gdGhlIHJlYWRsaW5lIG1vZHVsZSBpcyBpbXBvcnRlZCBhbmQgc3Rkb3V0CisgICAgICAgICMgaXMgcmVkaXJlY3RlZCB0byBhIHBpcGUuCisgICAgICAgIHJjLCBzdGRvdXQsIHN0ZGVyciA9IGFzc2VydF9weXRob25fb2soJy1jJywgJ2ltcG9ydCByZWFkbGluZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVSTT0neHRlcm0tMjU2Y29sb3InKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0ZG91dCwgYicnKQorCisKIGRlZiB0ZXN0X21haW4oKToKLSAgICBydW5fdW5pdHRlc3QoVGVzdEhpc3RvcnlNYW5pcHVsYXRpb24pCisgICAgcnVuX3VuaXR0ZXN0KFRlc3RIaXN0b3J5TWFuaXB1bGF0aW9uLCBUZXN0UmVhZGxpbmUpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcmVwci5weSBiL0xpYi90ZXN0L3Rlc3RfcmVwci5weQppbmRleCA4YjIwYWNkLi4zZTFlODkwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3JlcHIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9yZXByLnB5CkBAIC0xMzAsMTAgKzEzMCwxMCBAQAogICAgIGRlZiB0ZXN0X2ZpbGUoc2VsZik6CiAgICAgICAgIGZwID0gb3Blbih1bml0dGVzdC5fX2ZpbGVfXykKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcHIoZnApLnN0YXJ0c3dpdGgoCi0gICAgICAgICAgICAiPG9wZW4gZmlsZSAnJXMnLCBtb2RlICdyJyBhdCAweCIgJSB1bml0dGVzdC5fX2ZpbGVfXykpCisgICAgICAgICAgICAiPG9wZW4gZmlsZSAlciwgbW9kZSAncicgYXQgMHgiICUgdW5pdHRlc3QuX19maWxlX18pKQogICAgICAgICBmcC5jbG9zZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKGZwKS5zdGFydHN3aXRoKAotICAgICAgICAgICAgIjxjbG9zZWQgZmlsZSAnJXMnLCBtb2RlICdyJyBhdCAweCIgJSB1bml0dGVzdC5fX2ZpbGVfXykpCisgICAgICAgICAgICAiPGNsb3NlZCBmaWxlICVyLCBtb2RlICdyJyBhdCAweCIgJSB1bml0dGVzdC5fX2ZpbGVfXykpCiAKICAgICBkZWYgdGVzdF9sYW1iZGEoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKGxhbWJkYSB4OiB4KS5zdGFydHN3aXRoKApAQCAtMTc5LDggKzE3OSwxNSBAQAogICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwcih4KS5zdGFydHN3aXRoKCc8cmVhZC1vbmx5IGJ1ZmZlciBmb3IgMHgnKSkKIAogICAgIGRlZiB0ZXN0X2NlbGwoc2VsZik6Ci0gICAgICAgICMgWFhYIEhtbT8gSG93IHRvIGdldCBhdCBhIGNlbGwgb2JqZWN0PwotICAgICAgICBwYXNzCisgICAgICAgIGRlZiBnZXRfY2VsbCgpOgorICAgICAgICAgICAgeCA9IDQyCisgICAgICAgICAgICBkZWYgaW5uZXIoKToKKyAgICAgICAgICAgICAgICByZXR1cm4geAorICAgICAgICAgICAgcmV0dXJuIGlubmVyCisgICAgICAgIHggPSBnZXRfY2VsbCgpLl9fY2xvc3VyZV9fWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXhwTWF0Y2hlcyhyZXByKHgpLCByJzxjZWxsIGF0IDB4WzAtOUEtRmEtZl0rOiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ2ludCBvYmplY3QgYXQgMHhbMC05QS1GYS1mXSs+JykKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleHBNYXRjaGVzKHIoeCksIHInPGNlbGwgYXQuKlwuXC5cLi4qPicpCiAKICAgICBkZWYgdGVzdF9kZXNjcmlwdG9ycyhzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCkBAIC0yNjEsNiArMjY4LDcgQEAKICAgICAgICAgZXEocmVwcihmb28uZm9vKSwKICAgICAgICAgICAgICAgICI8Y2xhc3MgJyVzLmZvbyc+IiAlIGZvby5fX25hbWVfXykKIAorICAgIEB1bml0dGVzdC5za2lwKCduZWVkIGEgc3VpdGFibGUgb2JqZWN0JykKICAgICBkZWYgdGVzdF9vYmplY3Qoc2VsZik6CiAgICAgICAgICMgWFhYIFRlc3QgdGhlIHJlcHIgb2YgYSB0eXBlIHdpdGggYSByZWFsbHkgbG9uZyB0cF9uYW1lIGJ1dCB3aXRoIG5vCiAgICAgICAgICMgdHBfcmVwci4gIFdJQk5JIHdlIGhhZCA6OklubGluZT8gOikKQEAgLTMwMiw2ICszMTAsNyBAQAogICAgICAgICAgICAgJzxib3VuZCBtZXRob2QgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEuYW1ldGhvZCBvZiA8JXMuYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEgaW5zdGFuY2UgYXQgMHgnIFwKICAgICAgICAgICAgICUgKHF1eC5fX25hbWVfXywpICkpCiAKKyAgICBAdW5pdHRlc3Quc2tpcCgnbmVlZHMgYSBidWlsdC1pbiBmdW5jdGlvbiB3aXRoIGEgcmVhbGx5IGxvbmcgbmFtZScpCiAgICAgZGVmIHRlc3RfYnVpbHRpbl9mdW5jdGlvbihzZWxmKToKICAgICAgICAgIyBYWFggdGVzdCBidWlsdC1pbiBmdW5jdGlvbnMgYW5kIG1ldGhvZHMgd2l0aCByZWFsbHkgbG9uZyBuYW1lcwogICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3Jlc291cmNlLnB5IGIvTGliL3Rlc3QvdGVzdF9yZXNvdXJjZS5weQppbmRleCA1MjY5MmE3Li5kZTI5ZDNiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3Jlc291cmNlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcmVzb3VyY2UucHkKQEAgLTE4LDYyICsxOCw2MCBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICAoY3VyLCBtYXgpID0gcmVzb3VyY2UuZ2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9GU0laRSkKICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICAgICAgICAgcGFzcwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgIyBSTElNSVRfRlNJWkUgc2hvdWxkIGJlIFJMSU1fSU5GSU5JVFksIHdoaWNoIHdpbGwgYmUgYSByZWFsbHkgYmlnCi0gICAgICAgICAgICAjIG51bWJlciBvbiBhIHBsYXRmb3JtIHdpdGggbGFyZ2UgZmlsZSBzdXBwb3J0LiAgT24gdGhlc2UgcGxhdGZvcm1zLAotICAgICAgICAgICAgIyB3ZSBuZWVkIHRvIHRlc3QgdGhhdCB0aGUgZ2V0L3NldHJsaW1pdCBmdW5jdGlvbnMgcHJvcGVybHkgY29udmVydAotICAgICAgICAgICAgIyB0aGUgbnVtYmVyIHRvIGEgQyBsb25nIGxvbmcgYW5kIHRoYXQgdGhlIGNvbnZlcnNpb24gZG9lc24ndCByYWlzZQotICAgICAgICAgICAgIyBhbiBlcnJvci4KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzb3VyY2UuUkxJTV9JTkZJTklUWSwgbWF4KQotICAgICAgICAgICAgcmVzb3VyY2Uuc2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9GU0laRSwgKGN1ciwgbWF4KSkKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ1JMSU1JVF9GU0laRSBub3QgYXZhaWxhYmxlJykKKyAgICAgICAgIyBSTElNSVRfRlNJWkUgc2hvdWxkIGJlIFJMSU1fSU5GSU5JVFksIHdoaWNoIHdpbGwgYmUgYSByZWFsbHkgYmlnCisgICAgICAgICMgbnVtYmVyIG9uIGEgcGxhdGZvcm0gd2l0aCBsYXJnZSBmaWxlIHN1cHBvcnQuICBPbiB0aGVzZSBwbGF0Zm9ybXMsCisgICAgICAgICMgd2UgbmVlZCB0byB0ZXN0IHRoYXQgdGhlIGdldC9zZXRybGltaXQgZnVuY3Rpb25zIHByb3Blcmx5IGNvbnZlcnQKKyAgICAgICAgIyB0aGUgbnVtYmVyIHRvIGEgQyBsb25nIGxvbmcgYW5kIHRoYXQgdGhlIGNvbnZlcnNpb24gZG9lc24ndCByYWlzZQorICAgICAgICAjIGFuIGVycm9yLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc291cmNlLlJMSU1fSU5GSU5JVFksIG1heCkKKyAgICAgICAgcmVzb3VyY2Uuc2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9GU0laRSwgKGN1ciwgbWF4KSkKIAogICAgIGRlZiB0ZXN0X2ZzaXplX2VuZm9yY2VkKHNlbGYpOgogICAgICAgICB0cnk6CiAgICAgICAgICAgICAoY3VyLCBtYXgpID0gcmVzb3VyY2UuZ2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9GU0laRSkKICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICAgICAgICAgcGFzcwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgIyBDaGVjayB0byBzZWUgd2hhdCBoYXBwZW5zIHdoZW4gdGhlIFJMSU1JVF9GU0laRSBpcyBzbWFsbC4gIFNvbWUKLSAgICAgICAgICAgICMgdmVyc2lvbnMgb2YgUHl0aG9uIHdlcmUgdGVybWluYXRlZCBieSBhbiB1bmNhdWdodCBTSUdYRlNaLCBidXQKLSAgICAgICAgICAgICMgcHl0aG9ucnVuLmMgaGFzIGJlZW4gZml4ZWQgdG8gaWdub3JlIHRoYXQgZXhjZXB0aW9uLiAgSWYgc28sIHRoZQotICAgICAgICAgICAgIyB3cml0ZSgpIHNob3VsZCByZXR1cm4gRUZCSUcgd2hlbiB0aGUgbGltaXQgaXMgZXhjZWVkZWQuCisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCdSTElNSVRfRlNJWkUgbm90IGF2YWlsYWJsZScpCisgICAgICAgICMgQ2hlY2sgdG8gc2VlIHdoYXQgaGFwcGVucyB3aGVuIHRoZSBSTElNSVRfRlNJWkUgaXMgc21hbGwuICBTb21lCisgICAgICAgICMgdmVyc2lvbnMgb2YgUHl0aG9uIHdlcmUgdGVybWluYXRlZCBieSBhbiB1bmNhdWdodCBTSUdYRlNaLCBidXQKKyAgICAgICAgIyBweXRob25ydW4uYyBoYXMgYmVlbiBmaXhlZCB0byBpZ25vcmUgdGhhdCBleGNlcHRpb24uICBJZiBzbywgdGhlCisgICAgICAgICMgd3JpdGUoKSBzaG91bGQgcmV0dXJuIEVGQklHIHdoZW4gdGhlIGxpbWl0IGlzIGV4Y2VlZGVkLgogCi0gICAgICAgICAgICAjIEF0IGxlYXN0IG9uZSBwbGF0Zm9ybSBoYXMgYW4gdW5saW1pdGVkIFJMSU1JVF9GU0laRSBhbmQgYXR0ZW1wdHMKLSAgICAgICAgICAgICMgdG8gY2hhbmdlIGl0IHJhaXNlIFZhbHVlRXJyb3IgaW5zdGVhZC4KKyAgICAgICAgIyBBdCBsZWFzdCBvbmUgcGxhdGZvcm0gaGFzIGFuIHVubGltaXRlZCBSTElNSVRfRlNJWkUgYW5kIGF0dGVtcHRzCisgICAgICAgICMgdG8gY2hhbmdlIGl0IHJhaXNlIFZhbHVlRXJyb3IgaW5zdGVhZC4KKyAgICAgICAgdHJ5OgogICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJlc291cmNlLnNldHJsaW1pdChyZXNvdXJjZS5STElNSVRfRlNJWkUsICgxMDI0LCBtYXgpKQorICAgICAgICAgICAgICAgIGxpbWl0X3NldCA9IFRydWUKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIGxpbWl0X3NldCA9IEZhbHNlCisgICAgICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYud3JpdGUoIlgiICogMTAyNCkKICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIHJlc291cmNlLnNldHJsaW1pdChyZXNvdXJjZS5STElNSVRfRlNJWkUsICgxMDI0LCBtYXgpKQotICAgICAgICAgICAgICAgICAgICBsaW1pdF9zZXQgPSBUcnVlCi0gICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgIGxpbWl0X3NldCA9IEZhbHNlCi0gICAgICAgICAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIGYud3JpdGUoIlgiICogMTAyNCkKLSAgICAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgiWSIpCisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoIlkiKQorICAgICAgICAgICAgICAgICAgICBmLmZsdXNoKCkKKyAgICAgICAgICAgICAgICAgICAgIyBPbiBzb21lIHN5c3RlbXMgKGUuZy4sIFVidW50dSBvbiBocHBhKSB0aGUgZmx1c2goKQorICAgICAgICAgICAgICAgICAgICAjIGRvZXNuJ3QgYWx3YXlzIGNhdXNlIHRoZSBleGNlcHRpb24sIGJ1dCB0aGUgY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICAjIGRvZXMgZXZlbnR1YWxseS4gIFRyeSBmbHVzaGluZyBzZXZlcmFsIHRpbWVzIGluCisgICAgICAgICAgICAgICAgICAgICMgYW4gYXR0ZW1wdCB0byBlbnN1cmUgdGhlIGZpbGUgaXMgcmVhbGx5IHN5bmNlZCBhbmQKKyAgICAgICAgICAgICAgICAgICAgIyB0aGUgZXhjZXB0aW9uIHJhaXNlZC4KKyAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNSk6CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKC4xKQogICAgICAgICAgICAgICAgICAgICAgICAgZi5mbHVzaCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAjIE9uIHNvbWUgc3lzdGVtcyAoZS5nLiwgVWJ1bnR1IG9uIGhwcGEpIHRoZSBmbHVzaCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAjIGRvZXNuJ3QgYWx3YXlzIGNhdXNlIHRoZSBleGNlcHRpb24sIGJ1dCB0aGUgY2xvc2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgIyBkb2VzIGV2ZW50dWFsbHkuICBUcnkgZmx1c2hpbmcgc2V2ZXJhbCB0aW1lcyBpbgotICAgICAgICAgICAgICAgICAgICAgICAgIyBhbiBhdHRlbXB0IHRvIGVuc3VyZSB0aGUgZmlsZSBpcyByZWFsbHkgc3luY2VkIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgZXhjZXB0aW9uIHJhaXNlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDUpOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoLjEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5mbHVzaCgpCi0gICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGxpbWl0X3NldDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQotICAgICAgICAgICAgICAgICAgICBpZiBsaW1pdF9zZXQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAjIENsb3NlIHdpbGwgYXR0ZW1wdCB0byBmbHVzaCB0aGUgYnl0ZSB3ZSB3cm90ZQotICAgICAgICAgICAgICAgICAgICAgICAgIyBSZXN0b3JlIGxpbWl0IGZpcnN0IHRvIGF2b2lkIGdldHRpbmcgYSBzcHVyaW91cyBlcnJvcgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2Uuc2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9GU0laRSwgKGN1ciwgbWF4KSkKLSAgICAgICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBsaW1pdF9zZXQ6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgIGlmIGxpbWl0X3NldDoKKyAgICAgICAgICAgICAgICAgICAgIyBDbG9zZSB3aWxsIGF0dGVtcHQgdG8gZmx1c2ggdGhlIGJ5dGUgd2Ugd3JvdGUKKyAgICAgICAgICAgICAgICAgICAgIyBSZXN0b3JlIGxpbWl0IGZpcnN0IHRvIGF2b2lkIGdldHRpbmcgYSBzcHVyaW91cyBlcnJvcgogICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5zZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX0ZTSVpFLCAoY3VyLCBtYXgpKQotICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBsaW1pdF9zZXQ6CisgICAgICAgICAgICAgICAgcmVzb3VyY2Uuc2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9GU0laRSwgKGN1ciwgbWF4KSkKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKIAogICAgIGRlZiB0ZXN0X2ZzaXplX3Rvb2JpZyhzZWxmKToKICAgICAgICAgIyBCZSBzdXJlIHRoYXQgc2V0cmxpbWl0IGlzIGNoZWNraW5nIGZvciByZWFsbHkgbGFyZ2UgdmFsdWVzCkBAIC04MSwxNiArNzksMTUgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgKGN1ciwgbWF4KSA9IHJlc291cmNlLmdldHJsaW1pdChyZXNvdXJjZS5STElNSVRfRlNJWkUpCiAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ1JMSU1JVF9GU0laRSBub3QgYXZhaWxhYmxlJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzb3VyY2Uuc2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9GU0laRSwgKHRvb19iaWcsIG1heCkpCisgICAgICAgIGV4Y2VwdCAoT3ZlcmZsb3dFcnJvciwgVmFsdWVFcnJvcik6CiAgICAgICAgICAgICBwYXNzCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcmVzb3VyY2Uuc2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9GU0laRSwgKHRvb19iaWcsIG1heCkpCi0gICAgICAgICAgICBleGNlcHQgKE92ZXJmbG93RXJyb3IsIFZhbHVlRXJyb3IpOgotICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICByZXNvdXJjZS5zZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX0ZTSVpFLCAobWF4LCB0b29fYmlnKSkKLSAgICAgICAgICAgIGV4Y2VwdCAoT3ZlcmZsb3dFcnJvciwgVmFsdWVFcnJvcik6Ci0gICAgICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICByZXNvdXJjZS5zZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX0ZTSVpFLCAobWF4LCB0b29fYmlnKSkKKyAgICAgICAgZXhjZXB0IChPdmVyZmxvd0Vycm9yLCBWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIHBhc3MKIAogICAgIGRlZiB0ZXN0X2dldHJ1c2FnZShzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZXNvdXJjZS5nZXRydXNhZ2UpCkBAIC0xMDMsNiArMTAwLDIyIEBACiAgICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgQXR0cmlidXRlRXJyb3IpOgogICAgICAgICAgICAgcGFzcwogCisgICAgIyBJc3N1ZSA2MDgzOiBSZWZlcmVuY2UgY291bnRpbmcgYnVnCisgICAgZGVmIHRlc3Rfc2V0cnVzYWdlX3JlZmNvdW50KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBsaW1pdHMgPSByZXNvdXJjZS5nZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX0NQVSkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgnUkxJTUlUX0NQVSBub3QgYXZhaWxhYmxlJykKKyAgICAgICAgY2xhc3MgQmFkU2VxdWVuY2U6CisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMgorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgaWYga2V5IGluICgwLCAxKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlbih0dXBsZShyYW5nZSgxMDAwMDAwKSkpCisgICAgICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcgorCisgICAgICAgIHJlc291cmNlLnNldHJsaW1pdChyZXNvdXJjZS5STElNSVRfQ1BVLCBCYWRTZXF1ZW5jZSgpKQorCiBkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChSZXNvdXJjZVRlc3QpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfcm9ib3RwYXJzZXIucHkgYi9MaWIvdGVzdC90ZXN0X3JvYm90cGFyc2VyLnB5CmluZGV4IGIzZDRhNDYuLjM2YWM5NDEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfcm9ib3RwYXJzZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9yb2JvdHBhcnNlci5weQpAQCAtMiw2ICsyLDEyIEBACiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogZnJvbSB1cmxsaWIyIGltcG9ydCB1cmxvcGVuLCBIVFRQRXJyb3IKIAorSEFWRV9IVFRQUyA9IFRydWUKK3RyeToKKyAgICBmcm9tIHVybGxpYjIgaW1wb3J0IEhUVFBTSGFuZGxlcgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIEhBVkVfSFRUUFMgPSBGYWxzZQorCiBjbGFzcyBSb2JvdFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgX19pbml0X18oc2VsZiwgaW5kZXgsIHBhcnNlciwgdXJsLCBnb29kLCBhZ2VudCk6CiAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlLl9faW5pdF9fKHNlbGYpCkBAIC0yMjgsNiArMjM0LDE4IEBACiAKIFJvYm90VGVzdCgxNSwgZG9jLCBnb29kLCBiYWQpCiAKKyMgMTYuIEVtcHR5IHF1ZXJ5IChpc3N1ZSAjMTc0MDMpLiBOb3JtYWxpemluZyB0aGUgdXJsIGZpcnN0LgorZG9jID0gIiIiCitVc2VyLWFnZW50OiAqCitBbGxvdzogL3NvbWUvcGF0aD8KK0Rpc2FsbG93OiAvYW5vdGhlci9wYXRoPworIiIiCisKK2dvb2QgPSBbJy9zb21lL3BhdGg/J10KK2JhZCA9IFsnL2Fub3RoZXIvcGF0aD8nXQorCitSb2JvdFRlc3QoMTYsIGRvYywgZ29vZCwgYmFkKQorCiAKIGNsYXNzIE5ldHdvcmtUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKQEAgLTI1Nyw2ICsyNzUsNyBAQAogICAgICAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJyVzIGlzIHVuYXZhaWxhYmxlJyAlIHVybCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLmNhbl9mZXRjaCgiKiIsIHJvYm90c191cmwpLCBGYWxzZSkKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKEhBVkVfSFRUUFMsICduZWVkIFNTTCBzdXBwb3J0IHRvIGRvd25sb2FkIGxpY2Vuc2UnKQogICAgIGRlZiB0ZXN0UHl0aG9uT3JnKHNlbGYpOgogICAgICAgICB0ZXN0X3N1cHBvcnQucmVxdWlyZXMoJ25ldHdvcmsnKQogICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoJ3d3dy5weXRob24ub3JnJyk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3J1bnB5LnB5IGIvTGliL3Rlc3QvdGVzdF9ydW5weS5weQppbmRleCBkYmNiMjNkLi43Njg1OGQ1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3J1bnB5LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcnVucHkucHkKQEAgLTE3MCwxMSArMTcwLDEyIEBACiAgICAgICAgICAgICBkZWwgZDEgIyBFbnN1cmUgX19sb2FkZXJfXyBlbnRyeSBkb2Vzbid0IGtlZXAgZmlsZSBvcGVuCiAgICAgICAgICAgICBfX2ltcG9ydF9fKG1vZF9uYW1lKQogICAgICAgICAgICAgb3MucmVtb3ZlKG1vZF9mbmFtZSkKLSAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICJSdW5uaW5nIGZyb20gY29tcGlsZWQ6IiwgbW9kX25hbWUKLSAgICAgICAgICAgIGQyID0gcnVuX21vZHVsZShtb2RfbmFtZSkgIyBSZWFkIGZyb20gYnl0ZWNvZGUKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oIngiLCBkMikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkMlsieCJdID09IDEpCi0gICAgICAgICAgICBkZWwgZDIgIyBFbnN1cmUgX19sb2FkZXJfXyBlbnRyeSBkb2Vzbid0IGtlZXAgZmlsZSBvcGVuCisgICAgICAgICAgICBpZiBub3Qgc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGU6CisgICAgICAgICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgIlJ1bm5pbmcgZnJvbSBjb21waWxlZDoiLCBtb2RfbmFtZQorICAgICAgICAgICAgICAgIGQyID0gcnVuX21vZHVsZShtb2RfbmFtZSkgIyBSZWFkIGZyb20gYnl0ZWNvZGUKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJ4IiwgZDIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQyWyJ4Il0gPT0gMSkKKyAgICAgICAgICAgICAgICBkZWwgZDIgIyBFbnN1cmUgX19sb2FkZXJfXyBlbnRyeSBkb2Vzbid0IGtlZXAgZmlsZSBvcGVuCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBzZWxmLl9kZWxfcGtnKHBrZ19kaXIsIGRlcHRoLCBtb2RfbmFtZSkKICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgIk1vZHVsZSBleGVjdXRlZCBzdWNjZXNzZnVsbHkiCkBAIC0xOTIsMTEgKzE5MywxMiBAQAogICAgICAgICAgICAgZGVsIGQxICMgRW5zdXJlIF9fbG9hZGVyX18gZW50cnkgZG9lc24ndCBrZWVwIGZpbGUgb3BlbgogICAgICAgICAgICAgX19pbXBvcnRfXyhtb2RfbmFtZSkKICAgICAgICAgICAgIG9zLnJlbW92ZShtb2RfZm5hbWUpCi0gICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAiUnVubmluZyBmcm9tIGNvbXBpbGVkOiIsIHBrZ19uYW1lCi0gICAgICAgICAgICBkMiA9IHJ1bl9tb2R1bGUocGtnX25hbWUpICMgUmVhZCBmcm9tIGJ5dGVjb2RlCi0gICAgICAgICAgICBzZWxmLmFzc2VydEluKCJ4IiwgZDIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZDJbIngiXSA9PSAxKQotICAgICAgICAgICAgZGVsIGQyICMgRW5zdXJlIF9fbG9hZGVyX18gZW50cnkgZG9lc24ndCBrZWVwIGZpbGUgb3BlbgorICAgICAgICAgICAgaWYgbm90IHN5cy5kb250X3dyaXRlX2J5dGVjb2RlOgorICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICJSdW5uaW5nIGZyb20gY29tcGlsZWQ6IiwgcGtnX25hbWUKKyAgICAgICAgICAgICAgICBkMiA9IHJ1bl9tb2R1bGUocGtnX25hbWUpICMgUmVhZCBmcm9tIGJ5dGVjb2RlCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigieCIsIGQyKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkMlsieCJdID09IDEpCisgICAgICAgICAgICAgICAgZGVsIGQyICMgRW5zdXJlIF9fbG9hZGVyX18gZW50cnkgZG9lc24ndCBrZWVwIGZpbGUgb3BlbgogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgc2VsZi5fZGVsX3BrZyhwa2dfZGlyLCBkZXB0aCwgcGtnX25hbWUpCiAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICJQYWNrYWdlIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSIKQEAgLTI0NiwxMyArMjQ4LDE0IEBACiAgICAgICAgICAgICBkZWwgZDEgIyBFbnN1cmUgX19sb2FkZXJfXyBlbnRyeSBkb2Vzbid0IGtlZXAgZmlsZSBvcGVuCiAgICAgICAgICAgICBfX2ltcG9ydF9fKG1vZF9uYW1lKQogICAgICAgICAgICAgb3MucmVtb3ZlKG1vZF9mbmFtZSkKLSAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICJSdW5uaW5nIGZyb20gY29tcGlsZWQ6IiwgbW9kX25hbWUKLSAgICAgICAgICAgIGQyID0gcnVuX21vZHVsZShtb2RfbmFtZSwgcnVuX25hbWU9cnVuX25hbWUpICMgUmVhZCBmcm9tIGJ5dGVjb2RlCi0gICAgICAgICAgICBzZWxmLmFzc2VydEluKCJfX3BhY2thZ2VfXyIsIGQyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQyWyJfX3BhY2thZ2VfXyJdID09IHBrZ19uYW1lKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigic2libGluZyIsIGQyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigibmVwaGV3IiwgZDIpCi0gICAgICAgICAgICBkZWwgZDIgIyBFbnN1cmUgX19sb2FkZXJfXyBlbnRyeSBkb2Vzbid0IGtlZXAgZmlsZSBvcGVuCisgICAgICAgICAgICBpZiBub3Qgc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGU6CisgICAgICAgICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgIlJ1bm5pbmcgZnJvbSBjb21waWxlZDoiLCBtb2RfbmFtZQorICAgICAgICAgICAgICAgIGQyID0gcnVuX21vZHVsZShtb2RfbmFtZSwgcnVuX25hbWU9cnVuX25hbWUpICMgUmVhZCBmcm9tIGJ5dGVjb2RlCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigiX19wYWNrYWdlX18iLCBkMikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZDJbIl9fcGFja2FnZV9fIl0gPT0gcGtnX25hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigic2libGluZyIsIGQyKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oIm5lcGhldyIsIGQyKQorICAgICAgICAgICAgICAgIGRlbCBkMiAjIEVuc3VyZSBfX2xvYWRlcl9fIGVudHJ5IGRvZXNuJ3Qga2VlcCBmaWxlIG9wZW4KICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIHNlbGYuX2RlbF9wa2cocGtnX2RpciwgZGVwdGgsIG1vZF9uYW1lKQogICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAiTW9kdWxlIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2F4LnB5IGIvTGliL3Rlc3QvdGVzdF9zYXgucHkKaW5kZXggYWRiOTMwNS4uODY2MzhhMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zYXgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zYXgucHkKQEAgLTE0LDEyICsxNCwyOCBAQAogZnJvbSB4bWwuc2F4LmhhbmRsZXIgaW1wb3J0IGZlYXR1cmVfbmFtZXNwYWNlcwogZnJvbSB4bWwuc2F4LnhtbHJlYWRlciBpbXBvcnQgSW5wdXRTb3VyY2UsIEF0dHJpYnV0ZXNJbXBsLCBBdHRyaWJ1dGVzTlNJbXBsCiBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBpbworaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydCBhcyBzdXBwb3J0CiBmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBmaW5kZmlsZSwgcnVuX3VuaXR0ZXN0CiBpbXBvcnQgdW5pdHRlc3QKIAogVEVTVF9YTUxGSUxFID0gZmluZGZpbGUoInRlc3QueG1sIiwgc3ViZGlyPSJ4bWx0ZXN0ZGF0YSIpCiBURVNUX1hNTEZJTEVfT1VUID0gZmluZGZpbGUoInRlc3QueG1sLm91dCIsIHN1YmRpcj0ieG1sdGVzdGRhdGEiKQogCitzdXBwb3J0c191bmljb2RlX2ZpbGVuYW1lcyA9IFRydWUKK2lmIG5vdCBvcy5wYXRoLnN1cHBvcnRzX3VuaWNvZGVfZmlsZW5hbWVzOgorICAgIHRyeToKKyAgICAgICAgc3VwcG9ydC5URVNURk5fVU5JQ09ERS5lbmNvZGUoc3VwcG9ydC5URVNURk5fRU5DT0RJTkcpCisgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVW5pY29kZUVycm9yLCBUeXBlRXJyb3IpOgorICAgICAgICAjIEVpdGhlciB0aGUgZmlsZSBzeXN0ZW0gZW5jb2RpbmcgaXMgTm9uZSwgb3IgdGhlIGZpbGUgbmFtZQorICAgICAgICAjIGNhbm5vdCBiZSBlbmNvZGVkIGluIHRoZSBmaWxlIHN5c3RlbSBlbmNvZGluZy4KKyAgICAgICAgc3VwcG9ydHNfdW5pY29kZV9maWxlbmFtZXMgPSBGYWxzZQorcmVxdWlyZXNfdW5pY29kZV9maWxlbmFtZXMgPSB1bml0dGVzdC5za2lwVW5sZXNzKAorICAgICAgICBzdXBwb3J0c191bmljb2RlX2ZpbGVuYW1lcywKKyAgICAgICAgJ1JlcXVpcmVzIHVuaWNvZGUgZmlsZW5hbWVzIHN1cHBvcnQnKQorCiBuc191cmkgPSAiaHR0cDovL3d3dy5weXRob24ub3JnL3htbC1ucy9zYXh0ZXN0LyIKIAogY2xhc3MgWG1sVGVzdEJhc2UodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtMTU1LDkgKzE3MSw5IEBACiAKIHN0YXJ0ID0gJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz5cbicKIAotY2xhc3MgWG1sZ2VuVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CitjbGFzcyBYbWxnZW5UZXN0OgogICAgIGRlZiB0ZXN0X3htbGdlbl9iYXNpYyhzZWxmKToKLSAgICAgICAgcmVzdWx0ID0gU3RyaW5nSU8oKQorICAgICAgICByZXN1bHQgPSBzZWxmLmlvY2xhc3MoKQogICAgICAgICBnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQogICAgICAgICBnZW4uc3RhcnREb2N1bWVudCgpCiAgICAgICAgIGdlbi5zdGFydEVsZW1lbnQoImRvYyIsIHt9KQpAQCAtMTY3LDcgKzE4Myw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmdldHZhbHVlKCksIHN0YXJ0ICsgIjxkb2M+PC9kb2M+IikKIAogICAgIGRlZiB0ZXN0X3htbGdlbl9jb250ZW50KHNlbGYpOgotICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCisgICAgICAgIHJlc3VsdCA9IHNlbGYuaW9jbGFzcygpCiAgICAgICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCiAKICAgICAgICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQpAQCAtMTc5LDcgKzE5NSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmdldHZhbHVlKCksIHN0YXJ0ICsgIjxkb2M+aHVoZWk8L2RvYz4iKQogCiAgICAgZGVmIHRlc3RfeG1sZ2VuX3BpKHNlbGYpOgotICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCisgICAgICAgIHJlc3VsdCA9IHNlbGYuaW9jbGFzcygpCiAgICAgICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCiAKICAgICAgICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQpAQCAtMTkxLDcgKzIwNyw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmdldHZhbHVlKCksIHN0YXJ0ICsgIjw/dGVzdCBkYXRhPz48ZG9jPjwvZG9jPiIpCiAKICAgICBkZWYgdGVzdF94bWxnZW5fY29udGVudF9lc2NhcGUoc2VsZik6Ci0gICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5pb2NsYXNzKCkKICAgICAgICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKIAogICAgICAgICBnZW4uc3RhcnREb2N1bWVudCgpCkBAIC0yMDQsNyArMjIwLDcgQEAKICAgICAgICAgICAgIHN0YXJ0ICsgIjxkb2M+Jmx0O2h1aGVpJmFtcDs8L2RvYz4iKQogCiAgICAgZGVmIHRlc3RfeG1sZ2VuX2F0dHJfZXNjYXBlKHNlbGYpOgotICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCisgICAgICAgIHJlc3VsdCA9IHNlbGYuaW9jbGFzcygpCiAgICAgICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCiAKICAgICAgICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQpAQCAtMjIzLDggKzIzOSw0MSBAQAogICAgICAgICAgICAgICI8ZSBhPVwiJyZxdW90O1wiPjwvZT4iCiAgICAgICAgICAgICAgIjxlIGE9XCImIzEwOyYjMTM7JiM5O1wiPjwvZT48L2RvYz4iKSkKIAorICAgIGRlZiB0ZXN0X3htbGdlbl9lbmNvZGluZyhzZWxmKToKKyAgICAgICAgZW5jb2RpbmdzID0gKCdpc28tODg1OS0xNScsICd1dGYtOCcsCisgICAgICAgICAgICAgICAgICAgICAndXRmLTE2YmUnLCAndXRmLTE2bGUnLAorICAgICAgICAgICAgICAgICAgICAgJ3V0Zi0zMmJlJywgJ3V0Zi0zMmxlJykKKyAgICAgICAgZm9yIGVuY29kaW5nIGluIGVuY29kaW5nczoKKyAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuaW9jbGFzcygpCisgICAgICAgICAgICBnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0LCBlbmNvZGluZz1lbmNvZGluZykKKworICAgICAgICAgICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQorICAgICAgICAgICAgZ2VuLnN0YXJ0RWxlbWVudCgiZG9jIiwgeyJhIjogdSdcdTIwYWMnfSkKKyAgICAgICAgICAgIGdlbi5jaGFyYWN0ZXJzKHUiXHUyMGFjIikKKyAgICAgICAgICAgIGdlbi5lbmRFbGVtZW50KCJkb2MiKQorICAgICAgICAgICAgZ2VuLmVuZERvY3VtZW50KCkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuZ2V0dmFsdWUoKSwgKAorICAgICAgICAgICAgICAgIHUnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iJXMiPz5cbicKKyAgICAgICAgICAgICAgICB1Jzxkb2MgYT0iXHUyMGFjIj5cdTIwYWM8L2RvYz4nICUgZW5jb2RpbmcKKyAgICAgICAgICAgICAgICApLmVuY29kZShlbmNvZGluZywgJ3htbGNoYXJyZWZyZXBsYWNlJykpCisKKyAgICBkZWYgdGVzdF94bWxnZW5fdW5lbmNvZGFibGUoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuaW9jbGFzcygpCisgICAgICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQsIGVuY29kaW5nPSdhc2NpaScpCisKKyAgICAgICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQorICAgICAgICBnZW4uc3RhcnRFbGVtZW50KCJkb2MiLCB7ImEiOiB1J1x1MjBhYyd9KQorICAgICAgICBnZW4uY2hhcmFjdGVycyh1Ilx1MjBhYyIpCisgICAgICAgIGdlbi5lbmRFbGVtZW50KCJkb2MiKQorICAgICAgICBnZW4uZW5kRG9jdW1lbnQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmdldHZhbHVlKCksCisgICAgICAgICAgICAgICAgJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9ImFzY2lpIj8+XG4nCisgICAgICAgICAgICAgICAgJzxkb2MgYT0iJiM4MzY0OyI+JiM4MzY0OzwvZG9jPicpCisKICAgICBkZWYgdGVzdF94bWxnZW5faWdub3JhYmxlKHNlbGYpOgotICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCisgICAgICAgIHJlc3VsdCA9IHNlbGYuaW9jbGFzcygpCiAgICAgICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCiAKICAgICAgICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQpAQCAtMjM1LDggKzI4NCwyOCBAQAogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmdldHZhbHVlKCksIHN0YXJ0ICsgIjxkb2M+IDwvZG9jPiIpCiAKKyAgICBkZWYgdGVzdF94bWxnZW5fZW5jb2RpbmdfYnl0ZXMoc2VsZik6CisgICAgICAgIGVuY29kaW5ncyA9ICgnaXNvLTg4NTktMTUnLCAndXRmLTgnLAorICAgICAgICAgICAgICAgICAgICAgJ3V0Zi0xNmJlJywgJ3V0Zi0xNmxlJywKKyAgICAgICAgICAgICAgICAgICAgICd1dGYtMzJiZScsICd1dGYtMzJsZScpCisgICAgICAgIGZvciBlbmNvZGluZyBpbiBlbmNvZGluZ3M6CisgICAgICAgICAgICByZXN1bHQgPSBzZWxmLmlvY2xhc3MoKQorICAgICAgICAgICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCwgZW5jb2Rpbmc9ZW5jb2RpbmcpCisKKyAgICAgICAgICAgIGdlbi5zdGFydERvY3VtZW50KCkKKyAgICAgICAgICAgIGdlbi5zdGFydEVsZW1lbnQoImRvYyIsIHsiYSI6IHUnXHUyMGFjJ30pCisgICAgICAgICAgICBnZW4uY2hhcmFjdGVycyh1Ilx1MjBhYyIuZW5jb2RlKGVuY29kaW5nKSkKKyAgICAgICAgICAgIGdlbi5pZ25vcmFibGVXaGl0ZXNwYWNlKCIgIi5lbmNvZGUoZW5jb2RpbmcpKQorICAgICAgICAgICAgZ2VuLmVuZEVsZW1lbnQoImRvYyIpCisgICAgICAgICAgICBnZW4uZW5kRG9jdW1lbnQoKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5nZXR2YWx1ZSgpLCAoCisgICAgICAgICAgICAgICAgdSc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSIlcyI/PlxuJworICAgICAgICAgICAgICAgIHUnPGRvYyBhPSJcdTIwYWMiPlx1MjBhYyA8L2RvYz4nICUgZW5jb2RpbmcKKyAgICAgICAgICAgICAgICApLmVuY29kZShlbmNvZGluZywgJ3htbGNoYXJyZWZyZXBsYWNlJykpCisKICAgICBkZWYgdGVzdF94bWxnZW5fbnMoc2VsZik6Ci0gICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5pb2NsYXNzKCkKICAgICAgICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKIAogICAgICAgICBnZW4uc3RhcnREb2N1bWVudCgpCkBAIC0yNTQsNyArMzIzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNfdXJpKSkKIAogICAgIGRlZiB0ZXN0XzE0NjMwMjZfMShzZWxmKToKLSAgICAgICAgcmVzdWx0ID0gU3RyaW5nSU8oKQorICAgICAgICByZXN1bHQgPSBzZWxmLmlvY2xhc3MoKQogICAgICAgICBnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQogCiAgICAgICAgIGdlbi5zdGFydERvY3VtZW50KCkKQEAgLTI2NSw3ICszMzQsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5nZXR2YWx1ZSgpLCBzdGFydCsnPGEgYj0iYyI+PC9hPicpCiAKICAgICBkZWYgdGVzdF8xNDYzMDI2XzIoc2VsZik6Ci0gICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5pb2NsYXNzKCkKICAgICAgICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKIAogICAgICAgICBnZW4uc3RhcnREb2N1bWVudCgpCkBAIC0yNzgsNyArMzQ3LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuZ2V0dmFsdWUoKSwgc3RhcnQrJzxhIHhtbG5zPSJxdXgiPjwvYT4nKQogCiAgICAgZGVmIHRlc3RfMTQ2MzAyNl8zKHNlbGYpOgotICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCisgICAgICAgIHJlc3VsdCA9IHNlbGYuaW9jbGFzcygpCiAgICAgICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCiAKICAgICAgICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQpAQCAtMjk0LDcgKzM2Myw3IEBACiAgICAgZGVmIHRlc3RfNTAyN18xKHNlbGYpOgogICAgICAgICAjIFRoZSB4bWwgcHJlZml4IChhcyBpbiB4bWw6bGFuZyBiZWxvdykgaXMgcmVzZXJ2ZWQgYW5kIGJvdW5kIGJ5CiAgICAgICAgICMgZGVmaW5pdGlvbiB0byBodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UuICBYTUxHZW5lcmF0b3IgaGFkCi0gICAgICAgICMgYSBidWcgd2hlcmVieSBhIEtleUVycm9yIGlzIHRocm93biBiZWNhdXNlIHRoaXMgbmFtZXNwYWNlIGlzIG1pc3NpbmcKKyAgICAgICAgIyBhIGJ1ZyB3aGVyZWJ5IGEgS2V5RXJyb3IgaXMgcmFpc2VkIGJlY2F1c2UgdGhpcyBuYW1lc3BhY2UgaXMgbWlzc2luZwogICAgICAgICAjIGZyb20gYSBkaWN0aW9uYXJ5LgogICAgICAgICAjCiAgICAgICAgICMgVGhpcyB0ZXN0IGRlbW9uc3RyYXRlcyB0aGUgYnVnIGJ5IHBhcnNpbmcgYSBkb2N1bWVudC4KQEAgLTMwNiw3ICszNzUsNyBAQAogCiAgICAgICAgIHBhcnNlciA9IG1ha2VfcGFyc2VyKCkKICAgICAgICAgcGFyc2VyLnNldEZlYXR1cmUoZmVhdHVyZV9uYW1lc3BhY2VzLCBUcnVlKQotICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCisgICAgICAgIHJlc3VsdCA9IHNlbGYuaW9jbGFzcygpCiAgICAgICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCiAgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihnZW4pCiAgICAgICAgIHBhcnNlci5wYXJzZSh0ZXN0X3htbCkKQEAgLTMyMCwxMiArMzg5LDEyIEBACiAgICAgZGVmIHRlc3RfNTAyN18yKHNlbGYpOgogICAgICAgICAjIFRoZSB4bWwgcHJlZml4IChhcyBpbiB4bWw6bGFuZyBiZWxvdykgaXMgcmVzZXJ2ZWQgYW5kIGJvdW5kIGJ5CiAgICAgICAgICMgZGVmaW5pdGlvbiB0byBodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UuICBYTUxHZW5lcmF0b3IgaGFkCi0gICAgICAgICMgYSBidWcgd2hlcmVieSBhIEtleUVycm9yIGlzIHRocm93biBiZWNhdXNlIHRoaXMgbmFtZXNwYWNlIGlzIG1pc3NpbmcKKyAgICAgICAgIyBhIGJ1ZyB3aGVyZWJ5IGEgS2V5RXJyb3IgaXMgcmFpc2VkIGJlY2F1c2UgdGhpcyBuYW1lc3BhY2UgaXMgbWlzc2luZwogICAgICAgICAjIGZyb20gYSBkaWN0aW9uYXJ5LgogICAgICAgICAjCiAgICAgICAgICMgVGhpcyB0ZXN0IGRlbW9uc3RyYXRlcyB0aGUgYnVnIGJ5IGRpcmVjdCBtYW5pcHVsYXRpb24gb2YgdGhlCiAgICAgICAgICMgWE1MR2VuZXJhdG9yLgotICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCisgICAgICAgIHJlc3VsdCA9IHNlbGYuaW9jbGFzcygpCiAgICAgICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCiAKICAgICAgICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQpAQCAtMzQ1LDYgKzQxNCw0NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAnPGE6ZzIgeG1sOmxhbmc9ImVuIj5IZWxsbzwvYTpnMj4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvYTpnMT4nKSkKIAorICAgIGRlZiB0ZXN0X25vX2Nsb3NlX2ZpbGUoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuaW9jbGFzcygpCisgICAgICAgIGRlZiBmdW5jKG91dCk6CisgICAgICAgICAgICBnZW4gPSBYTUxHZW5lcmF0b3Iob3V0KQorICAgICAgICAgICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQorICAgICAgICAgICAgZ2VuLnN0YXJ0RWxlbWVudCgiZG9jIiwge30pCisgICAgICAgIGZ1bmMocmVzdWx0KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJlc3VsdC5jbG9zZWQpCisKKyAgICBkZWYgdGVzdF94bWxnZW5fZnJhZ21lbnQoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuaW9jbGFzcygpCisgICAgICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCisKKyAgICAgICAgIyBEb24ndCBjYWxsIGdlbi5zdGFydERvY3VtZW50KCkKKyAgICAgICAgZ2VuLnN0YXJ0RWxlbWVudCgiZm9vIiwgeyJhIjogIjEuMCJ9KQorICAgICAgICBnZW4uY2hhcmFjdGVycygiSGVsbG8iKQorICAgICAgICBnZW4uZW5kRWxlbWVudCgiZm9vIikKKyAgICAgICAgZ2VuLnN0YXJ0RWxlbWVudCgiYmFyIiwgeyJiIjogIjIuMCJ9KQorICAgICAgICBnZW4uZW5kRWxlbWVudCgiYmFyIikKKyAgICAgICAgIyBEb24ndCBjYWxsIGdlbi5lbmREb2N1bWVudCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuZ2V0dmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnPGZvbyBhPSIxLjAiPkhlbGxvPC9mb28+PGJhciBiPSIyLjAiPjwvYmFyPicpCisKK2NsYXNzIFN0cmluZ1htbGdlblRlc3QoWG1sZ2VuVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGlvY2xhc3MgPSBTdHJpbmdJTworCitjbGFzcyBCeXRlc0lPWG1sZ2VuVGVzdChYbWxnZW5UZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgaW9jbGFzcyA9IGlvLkJ5dGVzSU8KKworY2xhc3MgV3JpdGVyWG1sZ2VuVGVzdChYbWxnZW5UZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgY2xhc3MgaW9jbGFzcyhsaXN0KToKKyAgICAgICAgd3JpdGUgPSBsaXN0LmFwcGVuZAorICAgICAgICBjbG9zZWQgPSBGYWxzZQorCisgICAgICAgIGRlZiBnZXR2YWx1ZShzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBiJycuam9pbihzZWxmKQorCiAKIGNsYXNzIFhNTEZpbHRlckJhc2VUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9maWx0ZXJfYmFzaWMoc2VsZik6CkBAIC0zODQsNiArNDkxLDIxIEBACiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuZ2V0dmFsdWUoKSwgeG1sX3Rlc3Rfb3V0KQogCisgICAgQHJlcXVpcmVzX3VuaWNvZGVfZmlsZW5hbWVzCisgICAgZGVmIHRlc3RfZXhwYXRfZmlsZV91bmljb2RlKHNlbGYpOgorICAgICAgICBmbmFtZSA9IHN1cHBvcnQuVEVTVEZOX1VOSUNPREUKKyAgICAgICAgc2h1dGlsLmNvcHlmaWxlKFRFU1RfWE1MRklMRSwgZm5hbWUpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgZm5hbWUpCisKKyAgICAgICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCisgICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKKyAgICAgICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKworICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoeG1sZ2VuKQorICAgICAgICBwYXJzZXIucGFyc2Uob3BlbihmbmFtZSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuZ2V0dmFsdWUoKSwgeG1sX3Rlc3Rfb3V0KQorCiAgICAgIyA9PT09PSBEVERIYW5kbGVyIHN1cHBvcnQKIAogICAgIGNsYXNzIFRlc3REVERIYW5kbGVyOgpAQCAtNTIzLDYgKzY0NSwyMSBAQAogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmdldHZhbHVlKCksIHhtbF90ZXN0X291dCkKIAorICAgIEByZXF1aXJlc191bmljb2RlX2ZpbGVuYW1lcworICAgIGRlZiB0ZXN0X2V4cGF0X2lucHNvdXJjZV9zeXNpZF91bmljb2RlKHNlbGYpOgorICAgICAgICBmbmFtZSA9IHN1cHBvcnQuVEVTVEZOX1VOSUNPREUKKyAgICAgICAgc2h1dGlsLmNvcHlmaWxlKFRFU1RfWE1MRklMRSwgZm5hbWUpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgZm5hbWUpCisKKyAgICAgICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCisgICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKKyAgICAgICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKworICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoeG1sZ2VuKQorICAgICAgICBwYXJzZXIucGFyc2UoSW5wdXRTb3VyY2UoZm5hbWUpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmdldHZhbHVlKCksIHhtbF90ZXN0X291dCkKKwogICAgIGRlZiB0ZXN0X2V4cGF0X2lucHNvdXJjZV9zdHJlYW0oc2VsZik6CiAgICAgICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQogICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCkBAIC01OTYsNiArNzMzLDIxIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLmdldFN5c3RlbUlkKCksIFRFU1RfWE1MRklMRSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIuZ2V0UHVibGljSWQoKSwgTm9uZSkKIAorICAgIEByZXF1aXJlc191bmljb2RlX2ZpbGVuYW1lcworICAgIGRlZiB0ZXN0X2V4cGF0X2xvY2F0b3Jfd2l0aGluZm9fdW5pY29kZShzZWxmKToKKyAgICAgICAgZm5hbWUgPSBzdXBwb3J0LlRFU1RGTl9VTklDT0RFCisgICAgICAgIHNodXRpbC5jb3B5ZmlsZShURVNUX1hNTEZJTEUsIGZuYW1lKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIGZuYW1lKQorCisgICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKKyAgICAgICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKyAgICAgICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcih4bWxnZW4pCisgICAgICAgIHBhcnNlci5wYXJzZShmbmFtZSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5nZXRTeXN0ZW1JZCgpLCBmbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIuZ2V0UHVibGljSWQoKSwgTm9uZSkKKwogCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIwpAQCAtNzQ0LDcgKzg5Niw5IEBACiBkZWYgdGVzdF9tYWluKCk6CiAgICAgcnVuX3VuaXR0ZXN0KE1ha2VQYXJzZXJUZXN0LAogICAgICAgICAgICAgICAgICBTYXh1dGlsc1Rlc3QsCi0gICAgICAgICAgICAgICAgIFhtbGdlblRlc3QsCisgICAgICAgICAgICAgICAgIFN0cmluZ1htbGdlblRlc3QsCisgICAgICAgICAgICAgICAgIEJ5dGVzSU9YbWxnZW5UZXN0LAorICAgICAgICAgICAgICAgICBXcml0ZXJYbWxnZW5UZXN0LAogICAgICAgICAgICAgICAgICBFeHBhdFJlYWRlclRlc3QsCiAgICAgICAgICAgICAgICAgIEVycm9yUmVwb3J0aW5nVGVzdCwKICAgICAgICAgICAgICAgICAgWG1sUmVhZGVyVGVzdCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2VsZWN0LnB5IGIvTGliL3Rlc3QvdGVzdF9zZWxlY3QucHkKaW5kZXggNzliMjQ5Yi4uMTc1YmJkYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zZWxlY3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zZWxlY3QucHkKQEAgLTQ5LDYgKzQ5LDE1IEBACiAgICAgICAgICAgICBzZWxmLmZhaWwoJ1VuZXhwZWN0ZWQgcmV0dXJuIHZhbHVlcyBmcm9tIHNlbGVjdCgpOicsIHJmZCwgd2ZkLCB4ZmQpCiAgICAgICAgIHAuY2xvc2UoKQogCisgICAgIyBJc3N1ZSAxNjIzMDogQ3Jhc2ggb24gc2VsZWN0IHJlc2l6ZWQgbGlzdAorICAgIGRlZiB0ZXN0X3NlbGVjdF9tdXRhdGVkKHNlbGYpOgorICAgICAgICBhID0gW10KKyAgICAgICAgY2xhc3MgRjoKKyAgICAgICAgICAgIGRlZiBmaWxlbm8oc2VsZik6CisgICAgICAgICAgICAgICAgZGVsIGFbLTFdCisgICAgICAgICAgICAgICAgcmV0dXJuIHN5cy5fX3N0ZG91dF9fLmZpbGVubygpCisgICAgICAgIGFbOl0gPSBbRigpXSAqIDEwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZWN0LnNlbGVjdChbXSwgYSwgW10pLCAoW10sIGFbOjVdLCBbXSkpCiAKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFNlbGVjdFRlc3RDYXNlKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zZXQucHkgYi9MaWIvdGVzdC90ZXN0X3NldC5weQppbmRleCBiODc1M2ExLi42MTBiZTdjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NldC5weQpAQCAtNTYxLDEwICs1NjEsMTAgQEAKICAgICAgICAgcyA9IE5vbmUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUmVmZXJlbmNlRXJyb3IsIHN0ciwgcCkKIAotICAgICMgQyBBUEkgdGVzdCBvbmx5IGF2YWlsYWJsZSBpbiBhIGRlYnVnIGJ1aWxkCi0gICAgaWYgaGFzYXR0cihzZXQsICJ0ZXN0X2NfYXBpIik6Ci0gICAgICAgIGRlZiB0ZXN0X2NfYXBpKHNlbGYpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoKS50ZXN0X2NfYXBpKCksIFRydWUpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihzZXQsICJ0ZXN0X2NfYXBpIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ0MgQVBJIHRlc3Qgb25seSBhdmFpbGFibGUgaW4gYSBkZWJ1ZyBidWlsZCcpCisgICAgZGVmIHRlc3RfY19hcGkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KCkudGVzdF9jX2FwaSgpLCBUcnVlKQogCiBjbGFzcyBTZXRTdWJjbGFzcyhzZXQpOgogICAgIHBhc3MKQEAgLTY4Nyw2ICs2ODcsMTcgQEAKICAgICAgICAgaWYgc2VsZi5yZXByIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHNlbGYuc2V0KSwgc2VsZi5yZXByKQogCisgICAgZGVmIGNoZWNrX3JlcHJfYWdhaW5zdF92YWx1ZXMoc2VsZik6CisgICAgICAgIHRleHQgPSByZXByKHNlbGYuc2V0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGV4dC5zdGFydHN3aXRoKCd7JykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0ZXh0LmVuZHN3aXRoKCd9JykpCisKKyAgICAgICAgcmVzdWx0ID0gdGV4dFsxOi0xXS5zcGxpdCgnLCAnKQorICAgICAgICByZXN1bHQuc29ydCgpCisgICAgICAgIHNvcnRlZF9yZXByX3ZhbHVlcyA9IFtyZXByKHZhbHVlKSBmb3IgdmFsdWUgaW4gc2VsZi52YWx1ZXNdCisgICAgICAgIHNvcnRlZF9yZXByX3ZhbHVlcy5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHNvcnRlZF9yZXByX3ZhbHVlcykKKwogICAgIGRlZiB0ZXN0X3ByaW50KHNlbGYpOgogICAgICAgICBmbyA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikKICAgICAgICAgdHJ5OgpAQCAtODM2LDYgKzg0Nyw0NiBAQAogICAgICAgICBzZWxmLmxlbmd0aCA9IDMKICAgICAgICAgc2VsZi5yZXByICAgPSBOb25lCiAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdEJhc2ljT3BzU3RyaW5nKFRlc3RCYXNpY09wcyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNhc2UgICA9ICJzdHJpbmcgc2V0IgorICAgICAgICBzZWxmLnZhbHVlcyA9IFsiYSIsICJiIiwgImMiXQorICAgICAgICBzZWxmLnNldCAgICA9IHNldChzZWxmLnZhbHVlcykKKyAgICAgICAgc2VsZi5kdXAgICAgPSBzZXQoc2VsZi52YWx1ZXMpCisgICAgICAgIHNlbGYubGVuZ3RoID0gMworCisgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19yZXByX2FnYWluc3RfdmFsdWVzKCkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0QmFzaWNPcHNVbmljb2RlKFRlc3RCYXNpY09wcyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNhc2UgICA9ICJ1bmljb2RlIHNldCIKKyAgICAgICAgc2VsZi52YWx1ZXMgPSBbdSJhIiwgdSJiIiwgdSJjIl0KKyAgICAgICAgc2VsZi5zZXQgICAgPSBzZXQoc2VsZi52YWx1ZXMpCisgICAgICAgIHNlbGYuZHVwICAgID0gc2V0KHNlbGYudmFsdWVzKQorICAgICAgICBzZWxmLmxlbmd0aCA9IDMKKworICAgIGRlZiB0ZXN0X3JlcHIoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfcmVwcl9hZ2FpbnN0X3ZhbHVlcygpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdEJhc2ljT3BzTWl4ZWRTdHJpbmdVbmljb2RlKFRlc3RCYXNpY09wcyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNhc2UgICA9ICJzdHJpbmcgYW5kIGJ5dGVzIHNldCIKKyAgICAgICAgc2VsZi52YWx1ZXMgPSBbImEiLCAiYiIsIHUiYSIsIHUiYiJdCisgICAgICAgIHNlbGYuc2V0ICAgID0gc2V0KHNlbGYudmFsdWVzKQorICAgICAgICBzZWxmLmR1cCAgICA9IHNldChzZWxmLnZhbHVlcykKKyAgICAgICAgc2VsZi5sZW5ndGggPSA0CisKKyAgICBkZWYgdGVzdF9yZXByKHNlbGYpOgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygpOgorICAgICAgICAgICAgc2VsZi5jaGVja19yZXByX2FnYWluc3RfdmFsdWVzKCkKKwogIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBkZWYgYmFkaXRlcigpOgpAQCAtOTY2LDggKzEwMTcsNiBAQAogICAgICAgICAjIHdpdGhvdXQgY2FsbGluZyBfX2NtcF9fLgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChhLCBhKSwgMCkKIAotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNtcCwgYSwgMTIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY21wLCAiYWJjIiwgYSkKIAogIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0xMjE4LDE3ICsxMjY3LDYgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm90aGVyICE9IHNlbGYuc2V0LCBUcnVlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0ICE9IHNlbGYub3RoZXIsIFRydWUpCiAKLSAgICBkZWYgdGVzdF9nZV9ndF9sZV9sdChzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYuc2V0IDwgc2VsZi5vdGhlcikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYuc2V0IDw9IHNlbGYub3RoZXIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLnNldCA+IHNlbGYub3RoZXIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLnNldCA+PSBzZWxmLm90aGVyKQotCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLm90aGVyIDwgc2VsZi5zZXQpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLm90aGVyIDw9IHNlbGYuc2V0KQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5vdGhlciA+IHNlbGYuc2V0KQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5vdGhlciA+PSBzZWxmLnNldCkKLQogICAgIGRlZiB0ZXN0X3VwZGF0ZV9vcGVyYXRvcihzZWxmKToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc2VsZi5zZXQgfD0gc2VsZi5vdGhlcgpAQCAtMTM0MSwxOCArMTM3OSw2IEBACiAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotY2xhc3MgVGVzdE9ubHlTZXRzT3BlcmF0b3IoVGVzdE9ubHlTZXRzSW5CaW5hcnlPcHMpOgotICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgc2VsZi5zZXQgICA9IHNldCgoMSwgMiwgMykpCi0gICAgICAgIHNlbGYub3RoZXIgPSBvcGVyYXRvci5hZGQKLSAgICAgICAgc2VsZi5vdGhlcklzSXRlcmFibGUgPSBGYWxzZQotCi0gICAgZGVmIHRlc3RfZ2VfZ3RfbGVfbHQoc2VsZik6Ci0gICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKLSAgICAgICAgICAgIHN1cGVyKFRlc3RPbmx5U2V0c09wZXJhdG9yLCBzZWxmKS50ZXN0X2dlX2d0X2xlX2x0KCkKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBjbGFzcyBUZXN0T25seVNldHNUdXBsZShUZXN0T25seVNldHNJbkJpbmFyeU9wcyk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLnNldCAgID0gc2V0KCgxLCAyLCAzKSkKQEAgLTE1NjQsNyArMTU5MCw3IEBACiAgICAgICAgICAgICBmb3IgbWV0aCBpbiAocy51bmlvbiwgcy5pbnRlcnNlY3Rpb24sIHMuZGlmZmVyZW5jZSwgcy5zeW1tZXRyaWNfZGlmZmVyZW5jZSwgcy5pc2Rpc2pvaW50KToKICAgICAgICAgICAgICAgICBmb3IgZyBpbiAoRywgSSwgSWcsIEwsIFIpOgogICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IG1ldGgoZGF0YSkKLSAgICAgICAgICAgICAgICAgICAgYWN0dWFsID0gbWV0aChHKGRhdGEpKQorICAgICAgICAgICAgICAgICAgICBhY3R1YWwgPSBtZXRoKGcoZGF0YSkpCiAgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXhwZWN0ZWQsIGJvb2wpOgogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWwsIGV4cGVjdGVkKQogICAgICAgICAgICAgICAgICAgICBlbHNlOgpAQCAtMTc1MCw3ICsxNzc2LDYgQEAKICAgICAgICAgVGVzdFN1YnNldE5vbk92ZXJsYXAsCiAgICAgICAgIFRlc3RPbmx5U2V0c051bWVyaWMsCiAgICAgICAgIFRlc3RPbmx5U2V0c0RpY3QsCi0gICAgICAgIFRlc3RPbmx5U2V0c09wZXJhdG9yLAogICAgICAgICBUZXN0T25seVNldHNUdXBsZSwKICAgICAgICAgVGVzdE9ubHlTZXRzU3RyaW5nLAogICAgICAgICBUZXN0T25seVNldHNHZW5lcmF0b3IsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NldHMucHkgYi9MaWIvdGVzdC90ZXN0X3NldHMucHkKaW5kZXggMDc1NGVkNy4uMzE5YmRjYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zZXRzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2V0cy5weQpAQCAtMSw1ICsxLDMgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotCiBpbXBvcnQgdW5pdHRlc3QsIG9wZXJhdG9yLCBjb3B5LCBwaWNrbGUsIHJhbmRvbQogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zaHV0aWwucHkgYi9MaWIvdGVzdC90ZXN0X3NodXRpbC5weQppbmRleCBiNGU1NDE1Li4wZTgxMTQ1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NodXRpbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NodXRpbC5weQpAQCAtNyw2ICs3LDcgQEAKIGltcG9ydCBzdGF0CiBpbXBvcnQgb3MKIGltcG9ydCBvcy5wYXRoCitpbXBvcnQgZXJybm8KIGZyb20gb3MucGF0aCBpbXBvcnQgc3BsaXRkcml2ZQogZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IGZpbmRfZXhlY3V0YWJsZSwgc3Bhd24KIGZyb20gc2h1dGlsIGltcG9ydCAoX21ha2VfdGFyYmFsbCwgX21ha2VfemlwZmlsZSwgbWFrZV9hcmNoaXZlLApAQCAtNzcsMzMgKzc4LDM0IEBACiAgICAgICAgIGZpbGVuYW1lID0gdGVtcGZpbGUubWt0ZW1wKCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgc2h1dGlsLnJtdHJlZSwgZmlsZW5hbWUpCiAKLSAgICAjIFNlZSBidWcgIzEwNzE1MTMgZm9yIHdoeSB3ZSBkb24ndCBydW4gdGhpcyBvbiBjeWd3aW4KLSAgICAjIGFuZCBidWcgIzEwNzY0NjcgZm9yIHdoeSB3ZSBkb24ndCBydW4gdGhpcyBhcyByb290LgotICAgIGlmIChoYXNhdHRyKG9zLCAnY2htb2QnKSBhbmQgc3lzLnBsYXRmb3JtWzo2XSAhPSAnY3lnd2luJwotICAgICAgICBhbmQgbm90IChoYXNhdHRyKG9zLCAnZ2V0ZXVpZCcpIGFuZCBvcy5nZXRldWlkKCkgPT0gMCkpOgotICAgICAgICBkZWYgdGVzdF9vbl9lcnJvcihzZWxmKToKLSAgICAgICAgICAgIHNlbGYuZXJyb3JTdGF0ZSA9IDAKLSAgICAgICAgICAgIG9zLm1rZGlyKFRFU1RGTikKLSAgICAgICAgICAgIHNlbGYuY2hpbGRwYXRoID0gb3MucGF0aC5qb2luKFRFU1RGTiwgJ2EnKQotICAgICAgICAgICAgZiA9IG9wZW4oc2VsZi5jaGlsZHBhdGgsICd3JykKLSAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgICAgb2xkX2Rpcl9tb2RlID0gb3Muc3RhdChURVNURk4pLnN0X21vZGUKLSAgICAgICAgICAgIG9sZF9jaGlsZF9tb2RlID0gb3Muc3RhdChzZWxmLmNoaWxkcGF0aCkuc3RfbW9kZQotICAgICAgICAgICAgIyBNYWtlIHVud3JpdGFibGUuCi0gICAgICAgICAgICBvcy5jaG1vZChzZWxmLmNoaWxkcGF0aCwgc3RhdC5TX0lSRUFEKQotICAgICAgICAgICAgb3MuY2htb2QoVEVTVEZOLCBzdGF0LlNfSVJFQUQpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2NobW9kJyksICdyZXF1aXJlcyBvcy5jaG1vZCgpJykKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybVs6Nl0gPT0gJ2N5Z3dpbicsCisgICAgICAgICAgICAgICAgICAgICAiVGhpcyB0ZXN0IGNhbid0IGJlIHJ1biBvbiBDeWd3aW4gKGlzc3VlICMxMDcxNTEzKS4iKQorICAgIEB1bml0dGVzdC5za2lwSWYoaGFzYXR0cihvcywgJ2dldGV1aWQnKSBhbmQgb3MuZ2V0ZXVpZCgpID09IDAsCisgICAgICAgICAgICAgICAgICAgICAiVGhpcyB0ZXN0IGNhbid0IGJlIHJ1biByZWxpYWJseSBhcyByb290IChpc3N1ZSAjMTA3NjQ2NykuIikKKyAgICBkZWYgdGVzdF9vbl9lcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5lcnJvclN0YXRlID0gMAorICAgICAgICBvcy5ta2RpcihURVNURk4pCisgICAgICAgIHNlbGYuY2hpbGRwYXRoID0gb3MucGF0aC5qb2luKFRFU1RGTiwgJ2EnKQorICAgICAgICBmID0gb3BlbihzZWxmLmNoaWxkcGF0aCwgJ3cnKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgb2xkX2Rpcl9tb2RlID0gb3Muc3RhdChURVNURk4pLnN0X21vZGUKKyAgICAgICAgb2xkX2NoaWxkX21vZGUgPSBvcy5zdGF0KHNlbGYuY2hpbGRwYXRoKS5zdF9tb2RlCisgICAgICAgICMgTWFrZSB1bndyaXRhYmxlLgorICAgICAgICBvcy5jaG1vZChzZWxmLmNoaWxkcGF0aCwgc3RhdC5TX0lSRUFEKQorICAgICAgICBvcy5jaG1vZChURVNURk4sIHN0YXQuU19JUkVBRCkKIAotICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShURVNURk4sIG9uZXJyb3I9c2VsZi5jaGVja19hcmdzX3RvX29uZXJyb3IpCi0gICAgICAgICAgICAjIFRlc3Qgd2hldGhlciBvbmVycm9yIGhhcyBhY3R1YWxseSBiZWVuIGNhbGxlZC4KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lcnJvclN0YXRlLCAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgY2FsbCB0byBvbmVycm9yIGZ1bmN0aW9uIGRpZCBub3QgaGFwcGVuLiIpCisgICAgICAgIHNodXRpbC5ybXRyZWUoVEVTVEZOLCBvbmVycm9yPXNlbGYuY2hlY2tfYXJnc190b19vbmVycm9yKQorICAgICAgICAjIFRlc3Qgd2hldGhlciBvbmVycm9yIGhhcyBhY3R1YWxseSBiZWVuIGNhbGxlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVycm9yU3RhdGUsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGNhbGwgdG8gb25lcnJvciBmdW5jdGlvbiBkaWQgbm90IGhhcHBlbi4iKQogCi0gICAgICAgICAgICAjIE1ha2Ugd3JpdGFibGUgYWdhaW4uCi0gICAgICAgICAgICBvcy5jaG1vZChURVNURk4sIG9sZF9kaXJfbW9kZSkKLSAgICAgICAgICAgIG9zLmNobW9kKHNlbGYuY2hpbGRwYXRoLCBvbGRfY2hpbGRfbW9kZSkKKyAgICAgICAgIyBNYWtlIHdyaXRhYmxlIGFnYWluLgorICAgICAgICBvcy5jaG1vZChURVNURk4sIG9sZF9kaXJfbW9kZSkKKyAgICAgICAgb3MuY2htb2Qoc2VsZi5jaGlsZHBhdGgsIG9sZF9jaGlsZF9tb2RlKQogCi0gICAgICAgICAgICAjIENsZWFuIHVwLgotICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShURVNURk4pCisgICAgICAgICMgQ2xlYW4gdXAuCisgICAgICAgIHNodXRpbC5ybXRyZWUoVEVTVEZOKQogCiAgICAgZGVmIGNoZWNrX2FyZ3NfdG9fb25lcnJvcihzZWxmLCBmdW5jLCBhcmcsIGV4Yyk6CiAgICAgICAgICMgdGVzdF9ybXRyZWVfZXJyb3JzIGRlbGliZXJhdGVseSBydW5zIHJtdHJlZQpAQCAtMzA3LDM3ICszMDksNjcgQEAKICAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShURVNURk4sIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKIAotICAgIGlmIGhhc2F0dHIob3MsICJta2ZpZm8iKToKLSAgICAgICAgIyBJc3N1ZSAjMzAwMjogY29weWZpbGUgYW5kIGNvcHl0cmVlIGJsb2NrIGluZGVmaW5pdGVseSBvbiBuYW1lZCBwaXBlcwotICAgICAgICBkZWYgdGVzdF9jb3B5ZmlsZV9uYW1lZF9waXBlKHNlbGYpOgotICAgICAgICAgICAgb3MubWtmaWZvKFRFU1RGTikKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzaHV0aWwuU3BlY2lhbEZpbGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaHV0aWwuY29weWZpbGUsIFRFU1RGTiwgVEVTVEZOMikKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzaHV0aWwuU3BlY2lhbEZpbGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaHV0aWwuY29weWZpbGUsIF9fZmlsZV9fLCBURVNURk4pCi0gICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgIG9zLnJlbW92ZShURVNURk4pCisgICAgIyBJc3N1ZSAjMzAwMjogY29weWZpbGUgYW5kIGNvcHl0cmVlIGJsb2NrIGluZGVmaW5pdGVseSBvbiBuYW1lZCBwaXBlcworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICJta2ZpZm8iKSwgJ3JlcXVpcmVzIG9zLm1rZmlmbygpJykKKyAgICBkZWYgdGVzdF9jb3B5ZmlsZV9uYW1lZF9waXBlKHNlbGYpOgorICAgICAgICBvcy5ta2ZpZm8oVEVTVEZOKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzaHV0aWwuU3BlY2lhbEZpbGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5ZmlsZSwgVEVTVEZOLCBURVNURk4yKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2h1dGlsLlNwZWNpYWxGaWxlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaHV0aWwuY29weWZpbGUsIF9fZmlsZV9fLCBURVNURk4pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5yZW1vdmUoVEVTVEZOKQogCi0gICAgICAgIGRlZiB0ZXN0X2NvcHl0cmVlX25hbWVkX3BpcGUoc2VsZik6Ci0gICAgICAgICAgICBvcy5ta2RpcihURVNURk4pCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgIm1rZmlmbyIpLCAncmVxdWlyZXMgb3MubWtmaWZvKCknKQorICAgIGRlZiB0ZXN0X2NvcHl0cmVlX25hbWVkX3BpcGUoc2VsZik6CisgICAgICAgIG9zLm1rZGlyKFRFU1RGTikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3ViZGlyID0gb3MucGF0aC5qb2luKFRFU1RGTiwgInN1YmRpciIpCisgICAgICAgICAgICBvcy5ta2RpcihzdWJkaXIpCisgICAgICAgICAgICBwaXBlID0gb3MucGF0aC5qb2luKHN1YmRpciwgIm15cGlwZSIpCisgICAgICAgICAgICBvcy5ta2ZpZm8ocGlwZSkKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBzdWJkaXIgPSBvcy5wYXRoLmpvaW4oVEVTVEZOLCAic3ViZGlyIikKLSAgICAgICAgICAgICAgICBvcy5ta2RpcihzdWJkaXIpCi0gICAgICAgICAgICAgICAgcGlwZSA9IG9zLnBhdGguam9pbihzdWJkaXIsICJteXBpcGUiKQotICAgICAgICAgICAgICAgIG9zLm1rZmlmbyhwaXBlKQotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHl0cmVlKFRFU1RGTiwgVEVTVEZOMikKLSAgICAgICAgICAgICAgICBleGNlcHQgc2h1dGlsLkVycm9yIGFzIGU6Ci0gICAgICAgICAgICAgICAgICAgIGVycm9ycyA9IGUuYXJnc1swXQotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihlcnJvcnMpLCAxKQotICAgICAgICAgICAgICAgICAgICBzcmMsIGRzdCwgZXJyb3JfbXNnID0gZXJyb3JzWzBdCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImAlc2AgaXMgYSBuYW1lZCBwaXBlIiAlIHBpcGUsIGVycm9yX21zZykKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInNodXRpbC5FcnJvciBzaG91bGQgaGF2ZSBiZWVuIHJhaXNlZCIpCi0gICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoVEVTVEZOLCBpZ25vcmVfZXJyb3JzPVRydWUpCi0gICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShURVNURk4yLCBpZ25vcmVfZXJyb3JzPVRydWUpCisgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHl0cmVlKFRFU1RGTiwgVEVTVEZOMikKKyAgICAgICAgICAgIGV4Y2VwdCBzaHV0aWwuRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICBlcnJvcnMgPSBlLmFyZ3NbMF0KKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihlcnJvcnMpLCAxKQorICAgICAgICAgICAgICAgIHNyYywgZHN0LCBlcnJvcl9tc2cgPSBlcnJvcnNbMF0KKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJgJXNgIGlzIGEgbmFtZWQgcGlwZSIgJSBwaXBlLCBlcnJvcl9tc2cpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgic2h1dGlsLkVycm9yIHNob3VsZCBoYXZlIGJlZW4gcmFpc2VkIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoVEVTVEZOLCBpZ25vcmVfZXJyb3JzPVRydWUpCisgICAgICAgICAgICBzaHV0aWwucm10cmVlKFRFU1RGTjIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdjaGZsYWdzJykgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgaGFzYXR0cihlcnJubywgJ0VPUE5PVFNVUFAnKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICBoYXNhdHRyKGVycm5vLCAnRU5PVFNVUCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlcyBvcy5jaGZsYWdzLCBFT1BOT1RTVVBQICYgRU5PVFNVUCIpCisgICAgZGVmIHRlc3RfY29weXN0YXRfaGFuZGxlc19oYXJtbGVzc19jaGZsYWdzX2Vycm9ycyhzZWxmKToKKyAgICAgICAgdG1wZGlyID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgZmlsZTEgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAnZmlsZTEnKQorICAgICAgICBmaWxlMiA9IG9zLnBhdGguam9pbih0bXBkaXIsICdmaWxlMicpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZShmaWxlMSwgJ3h4eCcpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZShmaWxlMiwgJ3h4eCcpCisKKyAgICAgICAgZGVmIG1ha2VfY2hmbGFnc19yYWlzZXIoZXJyKToKKyAgICAgICAgICAgIGV4ID0gT1NFcnJvcigpCisKKyAgICAgICAgICAgIGRlZiBfY2hmbGFnc19yYWlzZXIocGF0aCwgZmxhZ3MpOgorICAgICAgICAgICAgICAgIGV4LmVycm5vID0gZXJyCisgICAgICAgICAgICAgICAgcmFpc2UgZXgKKyAgICAgICAgICAgIHJldHVybiBfY2hmbGFnc19yYWlzZXIKKyAgICAgICAgb2xkX2NoZmxhZ3MgPSBvcy5jaGZsYWdzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBlcnIgaW4gZXJybm8uRU9QTk9UU1VQUCwgZXJybm8uRU5PVFNVUDoKKyAgICAgICAgICAgICAgICBvcy5jaGZsYWdzID0gbWFrZV9jaGZsYWdzX3JhaXNlcihlcnIpCisgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHlzdGF0KGZpbGUxLCBmaWxlMikKKyAgICAgICAgICAgICMgYXNzZXJ0IG90aGVycyBlcnJvcnMgYnJlYWsgaXQKKyAgICAgICAgICAgIG9zLmNoZmxhZ3MgPSBtYWtlX2NoZmxhZ3NfcmFpc2VyKGVycm5vLkVPUE5PVFNVUFAgKyBlcnJuby5FTk9UU1VQKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgc2h1dGlsLmNvcHlzdGF0LCBmaWxlMSwgZmlsZTIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5jaGZsYWdzID0gb2xkX2NoZmxhZ3MKIAogICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHpsaWIsICJyZXF1aXJlcyB6bGliIikKICAgICBkZWYgdGVzdF9tYWtlX3RhcmJhbGwoc2VsZik6CkBAIC02MTksMTYgKzY1MSwxNCBAQAogICAgIGRlZiB0ZXN0X21vdmVfZmlsZV9vdGhlcl9mcyhzZWxmKToKICAgICAgICAgIyBNb3ZlIGEgZmlsZSB0byBhbiBleGlzdGluZyBkaXIgb24gYW5vdGhlciBmaWxlc3lzdGVtLgogICAgICAgICBpZiBub3Qgc2VsZi5kaXJfb3RoZXJfZnM6Ci0gICAgICAgICAgICAjIHNraXAKLSAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgnZGlyIG9uIG90aGVyIGZpbGVzeXN0ZW0gbm90IGF2YWlsYWJsZScpCiAgICAgICAgIHNlbGYuX2NoZWNrX21vdmVfZmlsZShzZWxmLnNyY19maWxlLCBzZWxmLmZpbGVfb3RoZXJfZnMsCiAgICAgICAgICAgICBzZWxmLmZpbGVfb3RoZXJfZnMpCiAKICAgICBkZWYgdGVzdF9tb3ZlX2ZpbGVfdG9fZGlyX290aGVyX2ZzKHNlbGYpOgogICAgICAgICAjIE1vdmUgYSBmaWxlIHRvIGFub3RoZXIgbG9jYXRpb24gb24gYW5vdGhlciBmaWxlc3lzdGVtLgogICAgICAgICBpZiBub3Qgc2VsZi5kaXJfb3RoZXJfZnM6Ci0gICAgICAgICAgICAjIHNraXAKLSAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgnZGlyIG9uIG90aGVyIGZpbGVzeXN0ZW0gbm90IGF2YWlsYWJsZScpCiAgICAgICAgIHNlbGYuX2NoZWNrX21vdmVfZmlsZShzZWxmLnNyY19maWxlLCBzZWxmLmRpcl9vdGhlcl9mcywKICAgICAgICAgICAgIHNlbGYuZmlsZV9vdGhlcl9mcykKIApAQCAtNjQ2LDggKzY3Niw3IEBACiAgICAgZGVmIHRlc3RfbW92ZV9kaXJfb3RoZXJfZnMoc2VsZik6CiAgICAgICAgICMgTW92ZSBhIGRpciB0byBhbm90aGVyIGxvY2F0aW9uIG9uIGFub3RoZXIgZmlsZXN5c3RlbS4KICAgICAgICAgaWYgbm90IHNlbGYuZGlyX290aGVyX2ZzOgotICAgICAgICAgICAgIyBza2lwCi0gICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ2RpciBvbiBvdGhlciBmaWxlc3lzdGVtIG5vdCBhdmFpbGFibGUnKQogICAgICAgICBkc3RfZGlyID0gdGVtcGZpbGUubWt0ZW1wKGRpcj1zZWxmLmRpcl9vdGhlcl9mcykKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc2VsZi5fY2hlY2tfbW92ZV9kaXIoc2VsZi5zcmNfZGlyLCBkc3RfZGlyLCBkc3RfZGlyKQpAQCAtNjY1LDExICs2OTQsMTkgQEAKICAgICBkZWYgdGVzdF9tb3ZlX2Rpcl90b19kaXJfb3RoZXJfZnMoc2VsZik6CiAgICAgICAgICMgTW92ZSBhIGRpciBpbnNpZGUgYW4gZXhpc3RpbmcgZGlyIG9uIGFub3RoZXIgZmlsZXN5c3RlbS4KICAgICAgICAgaWYgbm90IHNlbGYuZGlyX290aGVyX2ZzOgotICAgICAgICAgICAgIyBza2lwCi0gICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ2RpciBvbiBvdGhlciBmaWxlc3lzdGVtIG5vdCBhdmFpbGFibGUnKQogICAgICAgICBzZWxmLl9jaGVja19tb3ZlX2RpcihzZWxmLnNyY19kaXIsIHNlbGYuZGlyX290aGVyX2ZzLAogICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYuZGlyX290aGVyX2ZzLCBvcy5wYXRoLmJhc2VuYW1lKHNlbGYuc3JjX2RpcikpKQogCisgICAgZGVmIHRlc3RfbW92ZV9kaXJfc2VwX3RvX2RpcihzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tfbW92ZV9kaXIoc2VsZi5zcmNfZGlyICsgb3MucGF0aC5zZXAsIHNlbGYuZHN0X2RpciwKKyAgICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLmRzdF9kaXIsIG9zLnBhdGguYmFzZW5hbWUoc2VsZi5zcmNfZGlyKSkpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhvcy5wYXRoLmFsdHNlcCwgJ3JlcXVpcmVzIG9zLnBhdGguYWx0c2VwJykKKyAgICBkZWYgdGVzdF9tb3ZlX2Rpcl9hbHRzZXBfdG9fZGlyKHNlbGYpOgorICAgICAgICBzZWxmLl9jaGVja19tb3ZlX2RpcihzZWxmLnNyY19kaXIgKyBvcy5wYXRoLmFsdHNlcCwgc2VsZi5kc3RfZGlyLAorICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYuZHN0X2Rpciwgb3MucGF0aC5iYXNlbmFtZShzZWxmLnNyY19kaXIpKSkKKwogICAgIGRlZiB0ZXN0X2V4aXN0aW5nX2ZpbGVfaW5zaWRlX2Rlc3RfZGlyKHNlbGYpOgogICAgICAgICAjIEEgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgaW5zaWRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgYWxyZWFkeSBleGlzdHMuCiAgICAgICAgIHdpdGggb3BlbihzZWxmLmRzdF9maWxlLCAid2IiKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2lnbmFsLnB5IGIvTGliL3Rlc3QvdGVzdF9zaWduYWwucHkKaW5kZXggOGZlYjE0NS4uNzQ4M2Y2NCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zaWduYWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zaWduYWwucHkKQEAgLTEwOSw3ICsxMDksNyBAQAogICAgICAgICAgICAgIyBUaGlzIHdhaXQgc2hvdWxkIGJlIGludGVycnVwdGVkIGJ5IHRoZSBzaWduYWwncyBleGNlcHRpb24uCiAgICAgICAgICAgICBzZWxmLndhaXQoY2hpbGQpCiAgICAgICAgICAgICB0aW1lLnNsZWVwKDEpICAjIEdpdmUgdGhlIHNpZ25hbCB0aW1lIHRvIGJlIGRlbGl2ZXJlZC4KLSAgICAgICAgICAgIHNlbGYuZmFpbCgnSGFuZGxlckJDYWxsZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24nKQorICAgICAgICAgICAgc2VsZi5mYWlsKCdIYW5kbGVyQkNhbGxlZCBleGNlcHRpb24gbm90IHJhaXNlZCcpCiAgICAgICAgIGV4Y2VwdCBIYW5kbGVyQkNhbGxlZDoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmJfY2FsbGVkKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmFfY2FsbGVkKQpAQCAtMTQ4LDcgKzE0OCw3IEBACiAgICAgICAgICMgdGVzdC1ydW5uaW5nIHByb2Nlc3MgZnJvbSBhbGwgdGhlIHNpZ25hbHMuIEl0IHRoZW4KICAgICAgICAgIyBjb21tdW5pY2F0ZXMgd2l0aCB0aGF0IGNoaWxkIHByb2Nlc3Mgb3ZlciBhIHBpcGUgYW5kCiAgICAgICAgICMgcmUtcmFpc2VzIGluZm9ybWF0aW9uIGFib3V0IGFueSBleGNlcHRpb25zIHRoZSBjaGlsZAotICAgICAgICAjIHRocm93cy4gVGhlIHJlYWwgd29yayBoYXBwZW5zIGluIHNlbGYucnVuX3Rlc3QoKS4KKyAgICAgICAgIyByYWlzZXMuIFRoZSByZWFsIHdvcmsgaGFwcGVucyBpbiBzZWxmLnJ1bl90ZXN0KCkuCiAgICAgICAgIG9zX2RvbmVfciwgb3NfZG9uZV93ID0gb3MucGlwZSgpCiAgICAgICAgIHdpdGggY2xvc2luZyhvcy5mZG9wZW4ob3NfZG9uZV9yKSkgYXMgZG9uZV9yLCBcCiAgICAgICAgICAgICAgY2xvc2luZyhvcy5mZG9wZW4ob3NfZG9uZV93LCAndycpKSBhcyBkb25lX3c6CkBAIC0yMjcsNiArMjI3LDEzIEBACiAgICAgICAgICAgICBzaWduYWwuc2lnbmFsKDcsIGhhbmRsZXIpCiAKIAorY2xhc3MgV2FrZXVwRkRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX2ZkKHNlbGYpOgorICAgICAgICBmZCA9IHRlc3Rfc3VwcG9ydC5tYWtlX2JhZF9mZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNpZ25hbC5zZXRfd2FrZXVwX2ZkLCBmZCkKKworCiBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiLCAiTm90IHZhbGlkIG9uIFdpbmRvd3MiKQogY2xhc3MgV2FrZXVwU2lnbmFsVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIFRJTUVPVVRfRlVMTCA9IDEwCkBAIC00ODUsOCArNDkyLDkgQEAKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQmFzaWNTaWduYWxUZXN0cywgSW50ZXJQcm9jZXNzU2lnbmFsVGVzdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXYWtldXBTaWduYWxUZXN0cywgU2lnaW50ZXJydXB0VGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0aW1lclRlc3QsIFdpbmRvd3NTaWduYWxUZXN0cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdha2V1cEZEVGVzdHMsIFdha2V1cFNpZ25hbFRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2lnaW50ZXJydXB0VGVzdCwgSXRpbWVyVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd3NTaWduYWxUZXN0cykKIAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zaXRlLnB5IGIvTGliL3Rlc3QvdGVzdF9zaXRlLnB5CmluZGV4IDlmZDIzZmEuLjA4OTg0NDkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2l0ZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NpdGUucHkKQEAgLTIyOCw3ICsyMjgsMTkgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRpcnMpLCAxKQogICAgICAgICAgICAgd2FudGVkID0gb3MucGF0aC5qb2luKCd4b3hvJywgJ0xpYicsICdzaXRlLXBhY2thZ2VzJykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlyc1swXSwgd2FudGVkKQorICAgICAgICBlbGlmIChzeXMucGxhdGZvcm0gPT0gImRhcndpbiIgYW5kCisgICAgICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoIlBZVEhPTkZSQU1FV09SSyIpKToKKyAgICAgICAgICAgICMgT1MgWCBmcmFtZXdvcmsgYnVpbGRzCisgICAgICAgICAgICBzaXRlLlBSRUZJWEVTID0gWydQeXRob24uZnJhbWV3b3JrJ10KKyAgICAgICAgICAgIGRpcnMgPSBzaXRlLmdldHNpdGVwYWNrYWdlcygpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkaXJzKSwgMykKKyAgICAgICAgICAgIHdhbnRlZCA9IG9zLnBhdGguam9pbignL0xpYnJhcnknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiUFlUSE9ORlJBTUVXT1JLIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnZlcnNpb25bOjNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaXRlLXBhY2thZ2VzJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlyc1syXSwgd2FudGVkKQogICAgICAgICBlbGlmIG9zLnNlcCA9PSAnLyc6CisgICAgICAgICAgICAjIE9TIFggbm9uLWZyYW13ZXdvcmsgYnVpbGRzLCBMaW51eCwgRnJlZUJTRCwgZXRjCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkaXJzKSwgMikKICAgICAgICAgICAgIHdhbnRlZCA9IG9zLnBhdGguam9pbigneG94bycsICdsaWInLCAncHl0aG9uJyArIHN5cy52ZXJzaW9uWzozXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2l0ZS1wYWNrYWdlcycpCkBAIC0yMzYsMjQgKzI0OCwxMiBAQAogICAgICAgICAgICAgd2FudGVkID0gb3MucGF0aC5qb2luKCd4b3hvJywgJ2xpYicsICdzaXRlLXB5dGhvbicpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcnNbMV0sIHdhbnRlZCkKICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgb3RoZXIgcGxhdGZvcm1zCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkaXJzKSwgMikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlyc1swXSwgJ3hveG8nKQogICAgICAgICAgICAgd2FudGVkID0gb3MucGF0aC5qb2luKCd4b3hvJywgJ2xpYicsICdzaXRlLXBhY2thZ2VzJykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlyc1sxXSwgd2FudGVkKQogCi0gICAgICAgICMgbGV0J3MgdHJ5IHRoZSBzcGVjaWZpYyBBcHBsZSBsb2NhdGlvbgotICAgICAgICBpZiAoc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iIGFuZAotICAgICAgICAgICAgc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCJQWVRIT05GUkFNRVdPUksiKSk6Ci0gICAgICAgICAgICBzaXRlLlBSRUZJWEVTID0gWydQeXRob24uZnJhbWV3b3JrJ10KLSAgICAgICAgICAgIGRpcnMgPSBzaXRlLmdldHNpdGVwYWNrYWdlcygpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkaXJzKSwgNCkKLSAgICAgICAgICAgIHdhbnRlZCA9IG9zLnBhdGguam9pbignficsICdMaWJyYXJ5JywgJ1B5dGhvbicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnZlcnNpb25bOjNdLCAnc2l0ZS1wYWNrYWdlcycpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcnNbMl0sIG9zLnBhdGguZXhwYW5kdXNlcih3YW50ZWQpKQotICAgICAgICAgICAgd2FudGVkID0gb3MucGF0aC5qb2luKCcvTGlicmFyeScsICdQeXRob24nLCBzeXMudmVyc2lvbls6M10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpdGUtcGFja2FnZXMnKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXJzWzNdLCB3YW50ZWQpCi0KIGNsYXNzIFB0aEZpbGUob2JqZWN0KToKICAgICAiIiJIZWxwZXIgY2xhc3MgZm9yIGhhbmRsaW5nIHRlc3Rpbmcgb2YgLnB0aCBmaWxlcyIiIgogCkBAIC0zNDMsNiArMzQzLDcgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4ocGF0aCwgc2Vlbl9wYXRocykKICAgICAgICAgICAgIHNlZW5fcGF0aHMuYWRkKHBhdGgpCiAKKyAgICBAdW5pdHRlc3Quc2tpcCgndGVzdCBub3QgaW1wbGVtZW50ZWQnKQogICAgIGRlZiB0ZXN0X2FkZF9idWlsZF9kaXIoc2VsZik6CiAgICAgICAgICMgVGVzdCB0aGF0IHRoZSBidWlsZCBkaXJlY3RvcnkncyBNb2R1bGVzIGRpcmVjdG9yeSBpcyB1c2VkIHdoZW4gaXQKICAgICAgICAgIyBzaG91bGQgYmUuCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NtdHBsaWIucHkgYi9MaWIvdGVzdC90ZXN0X3NtdHBsaWIucHkKaW5kZXggODE4MDZjOS4uYWE5MGVhYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zbXRwbGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc210cGxpYi5weQpAQCAtNzcsNyArNzcsNyBAQAogICAgICAgICBzbXRwLmNsb3NlKCkKIAogICAgIGRlZiB0ZXN0VGltZW91dERlZmF1bHQoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSkKICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDMwKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzbXRwID0gc210cGxpYi5TTVRQKEhPU1QsIHNlbGYucG9ydCkKQEAgLTg3LDEzICs4NywxMyBAQAogICAgICAgICBzbXRwLmNsb3NlKCkKIAogICAgIGRlZiB0ZXN0VGltZW91dE5vbmUoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSkKICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDMwKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzbXRwID0gc210cGxpYi5TTVRQKEhPU1QsIHNlbGYucG9ydCwgdGltZW91dD1Ob25lKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzbXRwLnNvY2suZ2V0dGltZW91dCgpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNtdHAuc29jay5nZXR0aW1lb3V0KCkpCiAgICAgICAgIHNtdHAuY2xvc2UoKQogCiAgICAgZGVmIHRlc3RUaW1lb3V0VmFsdWUoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NtdHBuZXQucHkgYi9MaWIvdGVzdC90ZXN0X3NtdHBuZXQucHkKaW5kZXggMmRjMzllYi4uMDBjZTlkZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zbXRwbmV0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc210cG5ldC5weQpAQCAtMSw1ICsxLDMgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiBpbXBvcnQgc210cGxpYgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zb2NrZXQucHkgYi9MaWIvdGVzdC90ZXN0X3NvY2tldC5weQppbmRleCA4MTg5YmZmLi44MWJkNTM3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NvY2tldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NvY2tldC5weQpAQCAtMSw5ICsxLDggQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiAKIGltcG9ydCBlcnJubworaW1wb3J0IGl0ZXJ0b29scwogaW1wb3J0IHNvY2tldAogaW1wb3J0IHNlbGVjdAogaW1wb3J0IHRpbWUKQEAgLTE2LDYgKzE1LDExIEBACiBmcm9tIHdlYWtyZWYgaW1wb3J0IHByb3h5CiBpbXBvcnQgc2lnbmFsCiBpbXBvcnQgbWF0aAordHJ5OgorICAgIGltcG9ydCBfc29ja2V0CitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgX3NvY2tldCA9IE5vbmUKKwogCiBkZWYgdHJ5X2FkZHJlc3MoaG9zdCwgcG9ydD0wLCBmYW1pbHk9c29ja2V0LkFGX0lORVQpOgogICAgICIiIlRyeSB0byBiaW5kIGEgc29ja2V0IG9uIHRoZSBnaXZlbiBob3N0OnBvcnQgYW5kIHJldHVybiBUcnVlCkBAIC0yNDUsNiArMjQ5LDE5IEBACiAKIGNsYXNzIEdlbmVyYWxNb2R1bGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhfc29ja2V0IGlzIG5vdCBOb25lLCAnbmVlZCBfc29ja2V0IG1vZHVsZScpCisgICAgZGVmIHRlc3RfY3NvY2tldF9yZXByKHNlbGYpOgorICAgICAgICBzID0gX3NvY2tldC5zb2NrZXQoX3NvY2tldC5BRl9JTkVULCBfc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBleHBlY3RlZCA9ICgnPHNvY2tldCBvYmplY3QsIGZkPSVzLCBmYW1pbHk9JXMsIHR5cGU9JXMsIHByb3RvY29sPSVzPicKKyAgICAgICAgICAgICAgICAgICAgICAgICUgKHMuZmlsZW5vKCksIHMuZmFtaWx5LCBzLnR5cGUsIHMucHJvdG8pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHMpLCBleHBlY3RlZCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHMuY2xvc2UoKQorICAgICAgICBleHBlY3RlZCA9ICgnPHNvY2tldCBvYmplY3QsIGZkPS0xLCBmYW1pbHk9JXMsIHR5cGU9JXMsIHByb3RvY29sPSVzPicKKyAgICAgICAgICAgICAgICAgICAgJSAocy5mYW1pbHksIHMudHlwZSwgcy5wcm90bykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihzKSwgZXhwZWN0ZWQpCisKICAgICBkZWYgdGVzdF93ZWFrcmVmKHNlbGYpOgogICAgICAgICBzID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQogICAgICAgICBwID0gcHJveHkocykKQEAgLTMzMCwyOCArMzQ3LDI5IEBACiAgICAgICAgICAgICBpcCA9IHNvY2tldC5nZXRob3N0YnluYW1lKGhvc3RuYW1lKQogICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgogICAgICAgICAgICAgIyBQcm9iYWJseSBuYW1lIGxvb2t1cCB3YXNuJ3Qgc2V0IHVwIHJpZ2h0OyBza2lwIHRoaXMgdGVzdAotICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCduYW1lIGxvb2t1cCBmYWlsdXJlJykKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlwLmZpbmQoJy4nKSA+PSAwLCAiRXJyb3IgcmVzb2x2aW5nIGhvc3QgdG8gaXAuIikKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaG5hbWUsIGFsaWFzZXMsIGlwYWRkcnMgPSBzb2NrZXQuZ2V0aG9zdGJ5YWRkcihpcCkKICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKICAgICAgICAgICAgICMgUHJvYmFibHkgYSBzaW1pbGFyIHByb2JsZW0gYXMgYWJvdmU7IHNraXAgdGhpcyB0ZXN0Ci0gICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ2FkZHJlc3MgbG9va3VwIGZhaWx1cmUnKQogICAgICAgICBhbGxfaG9zdF9uYW1lcyA9IFtob3N0bmFtZSwgaG5hbWVdICsgYWxpYXNlcwogICAgICAgICBmcWhuID0gc29ja2V0LmdldGZxZG4oaXApCiAgICAgICAgIGlmIG5vdCBmcWhuIGluIGFsbF9ob3N0X25hbWVzOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJFcnJvciB0ZXN0aW5nIGhvc3QgcmVzb2x1dGlvbiBtZWNoYW5pc21zLiAoZnFkbjogJXMsIGFsbDogJXMpIiAlIChmcWhuLCByZXByKGFsbF9ob3N0X25hbWVzKSkpCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKHN5cywgJ2dldHJlZmNvdW50JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QgbmVlZHMgc3lzLmdldHJlZmNvdW50KCknKQogICAgIGRlZiB0ZXN0UmVmQ291bnRHZXROYW1lSW5mbyhzZWxmKToKICAgICAgICAgIyBUZXN0aW5nIHJlZmVyZW5jZSBjb3VudCBmb3IgZ2V0bmFtZWluZm8KLSAgICAgICAgaWYgaGFzYXR0cihzeXMsICJnZXRyZWZjb3VudCIpOgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICMgT24gc29tZSB2ZXJzaW9ucywgdGhpcyBsb3NlcyBhIHJlZmVyZW5jZQotICAgICAgICAgICAgICAgIG9yaWcgPSBzeXMuZ2V0cmVmY291bnQoX19uYW1lX18pCi0gICAgICAgICAgICAgICAgc29ja2V0LmdldG5hbWVpbmZvKF9fbmFtZV9fLDApCi0gICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLmdldHJlZmNvdW50KF9fbmFtZV9fKSwgb3JpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb2NrZXQuZ2V0bmFtZWluZm8gbG9zZXMgYSByZWZlcmVuY2UiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIE9uIHNvbWUgdmVyc2lvbnMsIHRoaXMgbG9zZXMgYSByZWZlcmVuY2UKKyAgICAgICAgICAgIG9yaWcgPSBzeXMuZ2V0cmVmY291bnQoX19uYW1lX18pCisgICAgICAgICAgICBzb2NrZXQuZ2V0bmFtZWluZm8oX19uYW1lX18sMCkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLmdldHJlZmNvdW50KF9fbmFtZV9fKSwgb3JpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvY2tldC5nZXRuYW1laW5mbyBsb3NlcyBhIHJlZmVyZW5jZSIpCiAKICAgICBkZWYgdGVzdEludGVycHJldGVyQ3Jhc2goc2VsZik6CiAgICAgICAgICMgTWFraW5nIHN1cmUgZ2V0bmFtZWluZm8gZG9lc24ndCBjcmFzaCB0aGUgaW50ZXJwcmV0ZXIKQEAgLTQxNCw3ICs0MzIsNyBAQAogICAgICAgICAjIFRyeSBzYW1lIGNhbGwgd2l0aCBvcHRpb25hbCBwcm90b2NvbCBvbWl0dGVkCiAgICAgICAgIHBvcnQyID0gc29ja2V0LmdldHNlcnZieW5hbWUoc2VydmljZSkKICAgICAgICAgZXEocG9ydCwgcG9ydDIpCi0gICAgICAgICMgVHJ5IHVkcCwgYnV0IGRvbid0IGJhcmYgaXQgaXQgZG9lc24ndCBleGlzdAorICAgICAgICAjIFRyeSB1ZHAsIGJ1dCBkb24ndCBiYXJmIGlmIGl0IGRvZXNuJ3QgZXhpc3QKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgdWRwcG9ydCA9IHNvY2tldC5nZXRzZXJ2YnluYW1lKHNlcnZpY2UsICd1ZHAnKQogICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgpAQCAtNDU4LDE3ICs0NzYsMTcgQEAKICAgICAgICAgIyBDaGVjayB0aGF0IHNldHRpbmcgaXQgdG8gYW4gaW52YWxpZCB0eXBlIHJhaXNlcyBUeXBlRXJyb3IKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQsICJzcGFtIikKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIoc29ja2V0LCAnaW5ldF9hdG9uJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QgbmVlZHMgc29ja2V0LmluZXRfYXRvbigpJykKICAgICBkZWYgdGVzdElQdjRfaW5ldF9hdG9uX2ZvdXJieXRlcyhzZWxmKToKLSAgICAgICAgaWYgbm90IGhhc2F0dHIoc29ja2V0LCAnaW5ldF9hdG9uJyk6Ci0gICAgICAgICAgICByZXR1cm4gICMgTm8gaW5ldF9hdG9uLCBub3RoaW5nIHRvIGNoZWNrCiAgICAgICAgICMgVGVzdCB0aGF0IGlzc3VlMTAwODA4NiBhbmQgaXNzdWU3NjcxNTAgYXJlIGZpeGVkLgogICAgICAgICAjIEl0IG11c3QgcmV0dXJuIDQgYnl0ZXMuCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1x4MDAnKjQsIHNvY2tldC5pbmV0X2F0b24oJzAuMC4wLjAnKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnXHhmZicqNCwgc29ja2V0LmluZXRfYXRvbignMjU1LjI1NS4yNTUuMjU1JykpCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKHNvY2tldCwgJ2luZXRfcHRvbicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0IG5lZWRzIHNvY2tldC5pbmV0X3B0b24oKScpCiAgICAgZGVmIHRlc3RJUHY0dG9TdHJpbmcoc2VsZik6Ci0gICAgICAgIGlmIG5vdCBoYXNhdHRyKHNvY2tldCwgJ2luZXRfcHRvbicpOgotICAgICAgICAgICAgcmV0dXJuICMgTm8gaW5ldF9wdG9uKCkgb24gdGhpcyBwbGF0Zm9ybQogICAgICAgICBmcm9tIHNvY2tldCBpbXBvcnQgaW5ldF9hdG9uIGFzIGYsIGluZXRfcHRvbiwgQUZfSU5FVAogICAgICAgICBnID0gbGFtYmRhIGE6IGluZXRfcHRvbihBRl9JTkVULCBhKQogCkBAIC00ODMsMTUgKzUwMSwxNSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdceGFhXHhhYVx4YWFceGFhJywgZygnMTcwLjE3MC4xNzAuMTcwJykpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1x4ZmZceGZmXHhmZlx4ZmYnLCBnKCcyNTUuMjU1LjI1NS4yNTUnKSkKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIoc29ja2V0LCAnaW5ldF9wdG9uJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QgbmVlZHMgc29ja2V0LmluZXRfcHRvbigpJykKICAgICBkZWYgdGVzdElQdjZ0b1N0cmluZyhzZWxmKToKLSAgICAgICAgaWYgbm90IGhhc2F0dHIoc29ja2V0LCAnaW5ldF9wdG9uJyk6Ci0gICAgICAgICAgICByZXR1cm4gIyBObyBpbmV0X3B0b24oKSBvbiB0aGlzIHBsYXRmb3JtCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGZyb20gc29ja2V0IGltcG9ydCBpbmV0X3B0b24sIEFGX0lORVQ2LCBoYXNfaXB2NgogICAgICAgICAgICAgaWYgbm90IGhhc19pcHY2OgotICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ0lQdjYgbm90IGF2YWlsYWJsZScpCiAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgnY291bGQgbm90IGltcG9ydCBuZWVkZWQgc3ltYm9scyBmcm9tIHNvY2tldCcpCiAgICAgICAgIGYgPSBsYW1iZGEgYTogaW5ldF9wdG9uKEFGX0lORVQ2LCBhKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1x4MDAnICogMTYsIGYoJzo6JykpCkBAIC01MDIsOSArNTIwLDkgQEAKICAgICAgICAgICAgIGYoJzQ1ZWY6NzZjYjoxYTo1NmVmOmFmZWI6YmFjOjE5MjQ6YWVhZScpCiAgICAgICAgICkKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIoc29ja2V0LCAnaW5ldF9udG9wJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QgbmVlZHMgc29ja2V0LmluZXRfbnRvcCgpJykKICAgICBkZWYgdGVzdFN0cmluZ1RvSVB2NChzZWxmKToKLSAgICAgICAgaWYgbm90IGhhc2F0dHIoc29ja2V0LCAnaW5ldF9udG9wJyk6Ci0gICAgICAgICAgICByZXR1cm4gIyBObyBpbmV0X250b3AoKSBvbiB0aGlzIHBsYXRmb3JtCiAgICAgICAgIGZyb20gc29ja2V0IGltcG9ydCBpbmV0X250b2EgYXMgZiwgaW5ldF9udG9wLCBBRl9JTkVUCiAgICAgICAgIGcgPSBsYW1iZGEgYTogaW5ldF9udG9wKEFGX0lORVQsIGEpCiAKQEAgLTUxNywxNSArNTM1LDE1IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJzE3MC44NS4xNzAuODUnLCBnKCdceGFhXHg1NVx4YWFceDU1JykpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJzI1NS4yNTUuMjU1LjI1NScsIGcoJ1x4ZmZceGZmXHhmZlx4ZmYnKSkKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIoc29ja2V0LCAnaW5ldF9udG9wJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QgbmVlZHMgc29ja2V0LmluZXRfbnRvcCgpJykKICAgICBkZWYgdGVzdFN0cmluZ1RvSVB2NihzZWxmKToKLSAgICAgICAgaWYgbm90IGhhc2F0dHIoc29ja2V0LCAnaW5ldF9udG9wJyk6Ci0gICAgICAgICAgICByZXR1cm4gIyBObyBpbmV0X250b3AoKSBvbiB0aGlzIHBsYXRmb3JtCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGZyb20gc29ja2V0IGltcG9ydCBpbmV0X250b3AsIEFGX0lORVQ2LCBoYXNfaXB2NgogICAgICAgICAgICAgaWYgbm90IGhhc19pcHY2OgotICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ0lQdjYgbm90IGF2YWlsYWJsZScpCiAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgnY291bGQgbm90IGltcG9ydCBuZWVkZWQgc3ltYm9scyBmcm9tIHNvY2tldCcpCiAgICAgICAgIGYgPSBsYW1iZGEgYTogaW5ldF9udG9wKEFGX0lORVQ2LCBhKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJzo6JywgZignXHgwMCcgKiAxNikpCkBAIC01NjUsNyArNTgzLDcgQEAKICAgICAgICAgICAgIG15X2lwX2FkZHIgPSBzb2NrZXQuZ2V0aG9zdGJ5bmFtZShzb2NrZXQuZ2V0aG9zdG5hbWUoKSkKICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKICAgICAgICAgICAgICMgUHJvYmFibHkgbmFtZSBsb29rdXAgd2Fzbid0IHNldCB1cCByaWdodDsgc2tpcCB0aGlzIHRlc3QKLSAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgnbmFtZSBsb29rdXAgZmFpbHVyZScpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4obmFtZVswXSwgKCIwLjAuMC4wIiwgbXlfaXBfYWRkciksICclcyBpbnZhbGlkJyAlIG5hbWVbMF0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZVsxXSwgcG9ydCkKIApAQCAtNjAxLDE3ICs2MTksMjQgQEAKICAgICAgICAgc29jay5jbG9zZSgpCiAKICAgICBkZWYgdGVzdF9nZXRzb2NrYWRkcmFyZyhzZWxmKToKLSAgICAgICAgaG9zdCA9ICcwLjAuMC4wJwotICAgICAgICBwb3J0ID0gc2VsZi5fZ2V0X3VudXNlZF9wb3J0KGJpbmRfYWRkcmVzcz1ob3N0KQorICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldCgpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzb2NrLmNsb3NlKQorICAgICAgICBwb3J0ID0gdGVzdF9zdXBwb3J0LmZpbmRfdW51c2VkX3BvcnQoKQogICAgICAgICBiaWdfcG9ydCA9IHBvcnQgKyA2NTUzNgogICAgICAgICBuZWdfcG9ydCA9IHBvcnQgLSA2NTUzNgotICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldCgpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHNvY2suYmluZCwgKGhvc3QsIGJpZ19wb3J0KSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHNvY2suYmluZCwgKGhvc3QsIG5lZ19wb3J0KSkKLSAgICAgICAgICAgIHNvY2suYmluZCgoaG9zdCwgcG9ydCkpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBzb2NrLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgc29jay5iaW5kLCAoSE9TVCwgYmlnX3BvcnQpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBzb2NrLmJpbmQsIChIT1NULCBuZWdfcG9ydCkpCisgICAgICAgICMgU2luY2UgZmluZF91bnVzZWRfcG9ydCgpIGlzIGluaGVyZW50bHkgc3ViamVjdCB0byByYWNlIGNvbmRpdGlvbnMsIHdlCisgICAgICAgICMgY2FsbCBpdCBhIGNvdXBsZSB0aW1lcyBpZiBuZWNlc3NhcnkuCisgICAgICAgIGZvciBpIGluIGl0ZXJ0b29scy5jb3VudCgpOgorICAgICAgICAgICAgcG9ydCA9IHRlc3Rfc3VwcG9ydC5maW5kX3VudXNlZF9wb3J0KCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzb2NrLmJpbmQoKEhPU1QsIHBvcnQpKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVBRERSSU5VU0Ugb3IgaSA9PSA1OgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBicmVhawogCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Mob3MubmFtZSA9PSAibnQiLCAiV2luZG93cyBzcGVjaWZpYyIpCiAgICAgZGVmIHRlc3Rfc29ja19pb2N0bChzZWxmKToKQEAgLTY0NCw5ICs2NjksMTAgQEAKICAgICAgICAgaWYgU1VQUE9SVFNfSVBWNjoKICAgICAgICAgICAgIHNvY2tldC5nZXRhZGRyaW5mbygnOjoxJywgODApCiAgICAgICAgICMgcG9ydCBjYW4gYmUgYSBzdHJpbmcgc2VydmljZSBuYW1lIHN1Y2ggYXMgImh0dHAiLCBhIG51bWVyaWMKLSAgICAgICAgIyBwb3J0IG51bWJlciBvciBOb25lCisgICAgICAgICMgcG9ydCBudW1iZXIgKGludCBvciBsb25nKSwgb3IgTm9uZQogICAgICAgICBzb2NrZXQuZ2V0YWRkcmluZm8oSE9TVCwgImh0dHAiKQogICAgICAgICBzb2NrZXQuZ2V0YWRkcmluZm8oSE9TVCwgODApCisgICAgICAgIHNvY2tldC5nZXRhZGRyaW5mbyhIT1NULCA4MEwpCiAgICAgICAgIHNvY2tldC5nZXRhZGRyaW5mbyhIT1NULCBOb25lKQogICAgICAgICAjIHRlc3QgZmFtaWx5IGFuZCBzb2NrdHlwZSBmaWx0ZXJzCiAgICAgICAgIGluZm9zID0gc29ja2V0LmdldGFkZHJpbmZvKEhPU1QsIE5vbmUsIHNvY2tldC5BRl9JTkVUKQpAQCAtNjYzLDYgKzY4OSwxNSBAQAogICAgICAgICBzb2NrZXQuZ2V0YWRkcmluZm8oTm9uZSwgMCwgc29ja2V0LkFGX1VOU1BFQywgc29ja2V0LlNPQ0tfU1RSRUFNLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LkFJX1BBU1NJVkUpCiAKKyAgICAgICAgIyBJc3N1ZSAxNzI2OTogdGVzdCB3b3JrYXJvdW5kIGZvciBPUyBYIHBsYXRmb3JtIGJ1ZyBzZWdmYXVsdAorICAgICAgICBpZiBoYXNhdHRyKHNvY2tldCwgJ0FJX05VTUVSSUNTRVJWJyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBUaGUgYXJndW1lbnRzIGhlcmUgYXJlIHVuZGVmaW5lZCBhbmQgdGhlIGNhbGwgbWF5IHN1Y2NlZWQKKyAgICAgICAgICAgICAgICAjIG9yIGZhaWwuICBBbGwgd2UgY2FyZSBoZXJlIGlzIHRoYXQgaXQgZG9lc24ndCBzZWdmYXVsdC4KKyAgICAgICAgICAgICAgICBzb2NrZXQuZ2V0YWRkcmluZm8oImxvY2FsaG9zdCIsIE5vbmUsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5BSV9OVU1FUklDU0VSVikKKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZ2FpZXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcwogCiAgICAgZGVmIGNoZWNrX3NlbmRhbGxfaW50ZXJydXB0ZWQoc2VsZiwgd2l0aF90aW1lb3V0KToKICAgICAgICAgIyBzb2NrZXRwYWlyKCkgaXMgbm90IHN0cmljbHkgcmVxdWlyZWQsIGJ1dCBpdCBtYWtlcyB0aGluZ3MgZWFzaWVyLgpAQCAtNjgzLDExICs3MTgsMTIgQEAKICAgICAgICAgICAgICAgICBjLnNldHRpbWVvdXQoMS41KQogICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvcik6CiAgICAgICAgICAgICAgICAgc2lnbmFsLmFsYXJtKDEpCi0gICAgICAgICAgICAgICAgYy5zZW5kYWxsKGIieCIgKiAoMTAyNCoqMikpCisgICAgICAgICAgICAgICAgYy5zZW5kYWxsKGIieCIgKiB0ZXN0X3N1cHBvcnQuU09DS19NQVhfU0laRSkKICAgICAgICAgICAgIGlmIHdpdGhfdGltZW91dDoKICAgICAgICAgICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBva19oYW5kbGVyKQogICAgICAgICAgICAgICAgIHNpZ25hbC5hbGFybSgxKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC50aW1lb3V0LCBjLnNlbmRhbGwsIGIieCIgKiAoMTAyNCoqMikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc29ja2V0LnRpbWVvdXQsIGMuc2VuZGFsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiIngiICogdGVzdF9zdXBwb3J0LlNPQ0tfTUFYX1NJWkUpCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBvbGRfYWxhcm0pCiAgICAgICAgICAgICBjLmNsb3NlKCkKQEAgLTY5OSwxMyArNzM1LDMyIEBACiAgICAgZGVmIHRlc3Rfc2VuZGFsbF9pbnRlcnJ1cHRlZF93aXRoX3RpbWVvdXQoc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tfc2VuZGFsbF9pbnRlcnJ1cHRlZChUcnVlKQogCi0gICAgZGVmIHRlc3RMaXN0ZW5CYWNrbG9nMChzZWxmKToKKyAgICBkZWYgdGVzdF9saXN0ZW5fYmFja2xvZyhzZWxmKToKKyAgICAgICAgZm9yIGJhY2tsb2cgaW4gMCwgLTE6CisgICAgICAgICAgICBzcnYgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgICAgICBzcnYuYmluZCgoSE9TVCwgMCkpCisgICAgICAgICAgICBzcnYubGlzdGVuKGJhY2tsb2cpCisgICAgICAgICAgICBzcnYuY2xvc2UoKQorCisgICAgQHRlc3Rfc3VwcG9ydC5jcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdF9saXN0ZW5fYmFja2xvZ19vdmVyZmxvdyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAxNTk4OQorICAgICAgICBpbXBvcnQgX3Rlc3RjYXBpCiAgICAgICAgIHNydiA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKICAgICAgICAgc3J2LmJpbmQoKEhPU1QsIDApKQotICAgICAgICAjIGJhY2tsb2cgPSAwCi0gICAgICAgIHNydi5saXN0ZW4oMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgc3J2Lmxpc3RlbiwgX3Rlc3RjYXBpLklOVF9NQVggKyAxKQogICAgICAgICBzcnYuY2xvc2UoKQogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoU1VQUE9SVFNfSVBWNiwgJ0lQdjYgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorICAgIGRlZiB0ZXN0X2Zsb3dpbmZvKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBzb2NrZXQuZ2V0bmFtZWluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICgnOjoxJywwLCAweGZmZmZmZmZmKSwgMCkKKyAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQ2LCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHMuYmluZCwgKCc6OjEnLCAwLCAtMTApKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgcy5jbG9zZSgpCisKIAogQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKIGNsYXNzIEJhc2ljVENQVGVzdChTb2NrZXRDb25uZWN0ZWRUZXN0KToKQEAgLTc2MywxMCArODE4LDEwIEBACiAgICAgICAgIGJpZ19jaHVuayA9ICdmJyAqIDIwNDgKICAgICAgICAgc2VsZi5zZXJ2X2Nvbm4uc2VuZGFsbChiaWdfY2h1bmspCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKHNvY2tldCwgJ2Zyb21mZCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdzb2NrZXQuZnJvbWZkIG5vdCBhdmFpbGJsZScpCiAgICAgZGVmIHRlc3RGcm9tRmQoc2VsZik6CiAgICAgICAgICMgVGVzdGluZyBmcm9tZmQoKQotICAgICAgICBpZiBub3QgaGFzYXR0cihzb2NrZXQsICJmcm9tZmQiKToKLSAgICAgICAgICAgIHJldHVybiAjIE9uIFdpbmRvd3MsIHRoaXMgZG9lc24ndCBleGlzdAogICAgICAgICBmZCA9IHNlbGYuY2xpX2Nvbm4uZmlsZW5vKCkKICAgICAgICAgc29jayA9IHNvY2tldC5mcm9tZmQoZmQsIHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCiAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzb2NrLmNsb3NlKQpAQCAtNzk5LDYgKzg1NCwxOSBAQAogICAgICAgICBzZWxmLnNlcnZfY29ubi5zZW5kKE1TRykKICAgICAgICAgc2VsZi5zZXJ2X2Nvbm4uc2h1dGRvd24oMikKIAorICAgIHRlc3RTaHV0ZG93bl9vdmVyZmxvdyA9IHRlc3Rfc3VwcG9ydC5jcHl0aG9uX29ubHkodGVzdFNodXRkb3duKQorCisgICAgQHRlc3Rfc3VwcG9ydC5jcHl0aG9uX29ubHkKKyAgICBkZWYgX3Rlc3RTaHV0ZG93bl9vdmVyZmxvdyhzZWxmKToKKyAgICAgICAgaW1wb3J0IF90ZXN0Y2FwaQorICAgICAgICBzZWxmLnNlcnZfY29ubi5zZW5kKE1TRykKKyAgICAgICAgIyBJc3N1ZSAxNTk4OQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBzZWxmLnNlcnZfY29ubi5zaHV0ZG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX3Rlc3RjYXBpLklOVF9NQVggKyAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBzZWxmLnNlcnZfY29ubi5zaHV0ZG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMiArIChfdGVzdGNhcGkuVUlOVF9NQVggKyAxKSkKKyAgICAgICAgc2VsZi5zZXJ2X2Nvbm4uc2h1dGRvd24oMikKKwogQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKIGNsYXNzIEJhc2ljVURQVGVzdChUaHJlYWRlZFVEUFNvY2tldFRlc3QpOgogCkBAIC04NDQsNiArOTEyLDggQEAKICAgICAgICAgc2VsZi5jbGkuY29ubmVjdCgoSE9TVCwgc2VsZi5wb3J0KSkKICAgICAgICAgdGltZS5zbGVlcCgxLjApCiAKK0B1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIoc29ja2V0LCAnc29ja2V0cGFpcicpLAorICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QgbmVlZHMgc29ja2V0LnNvY2tldHBhaXIoKScpCiBAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWQsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQogY2xhc3MgQmFzaWNTb2NrZXRQYWlyVGVzdChTb2NrZXRQYWlyVGVzdCk6CiAKQEAgLTg3Miw3ICs5NDIsMTAgQEAKIAogICAgIGRlZiB0ZXN0U2V0QmxvY2tpbmcoc2VsZik6CiAgICAgICAgICMgVGVzdGluZyB3aGV0aGVyIHNldCBibG9ja2luZyB3b3JrcwotICAgICAgICBzZWxmLnNlcnYuc2V0YmxvY2tpbmcoMCkKKyAgICAgICAgc2VsZi5zZXJ2LnNldGJsb2NraW5nKFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNlbGYuc2Vydi5nZXR0aW1lb3V0KCkpCisgICAgICAgIHNlbGYuc2Vydi5zZXRibG9ja2luZyhGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNlcnYuZ2V0dGltZW91dCgpLCAwLjApCiAgICAgICAgIHN0YXJ0ID0gdGltZS50aW1lKCkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc2VsZi5zZXJ2LmFjY2VwdCgpCkBAIC04ODQsNiArOTU3LDE5IEBACiAgICAgZGVmIF90ZXN0U2V0QmxvY2tpbmcoc2VsZik6CiAgICAgICAgIHBhc3MKIAorICAgIEB0ZXN0X3N1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3RTZXRCbG9ja2luZ19vdmVyZmxvdyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAxNTk4OQorICAgICAgICBpbXBvcnQgX3Rlc3RjYXBpCisgICAgICAgIGlmIF90ZXN0Y2FwaS5VSU5UX01BWCA+PSBfdGVzdGNhcGkuVUxPTkdfTUFYOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgnbmVlZHMgVUlOVF9NQVggPCBVTE9OR19NQVgnKQorICAgICAgICBzZWxmLnNlcnYuc2V0YmxvY2tpbmcoRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXJ2LmdldHRpbWVvdXQoKSwgMC4wKQorICAgICAgICBzZWxmLnNlcnYuc2V0YmxvY2tpbmcoX3Rlc3RjYXBpLlVJTlRfTUFYICsgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc2VsZi5zZXJ2LmdldHRpbWVvdXQoKSkKKworICAgIF90ZXN0U2V0QmxvY2tpbmdfb3ZlcmZsb3cgPSB0ZXN0X3N1cHBvcnQuY3B5dGhvbl9vbmx5KF90ZXN0U2V0QmxvY2tpbmcpCisKICAgICBkZWYgdGVzdEFjY2VwdChzZWxmKToKICAgICAgICAgIyBUZXN0aW5nIG5vbi1ibG9ja2luZyBhY2NlcHQKICAgICAgICAgc2VsZi5zZXJ2LnNldGJsb2NraW5nKDApCkBAIC05NTEsOCArMTAzNyw4IEBACiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzZWxmLnNlcnZfZmlsZS5jbG9zZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnNlcnZfZmlsZS5jbG9zZWQpCi0gICAgICAgIHNlbGYuc2Vydl9maWxlID0gTm9uZQogICAgICAgICBTb2NrZXRDb25uZWN0ZWRUZXN0LnRlYXJEb3duKHNlbGYpCisgICAgICAgIHNlbGYuc2Vydl9maWxlID0gTm9uZQogCiAgICAgZGVmIGNsaWVudFNldFVwKHNlbGYpOgogICAgICAgICBTb2NrZXRDb25uZWN0ZWRUZXN0LmNsaWVudFNldFVwKHNlbGYpCkBAIC0xMTQwLDYgKzEyMjYsNjQgQEAKIAogICAgIGJ1ZnNpemUgPSAxICMgRGVmYXVsdC1idWZmZXJlZCBmb3IgcmVhZGluZzsgbGluZS1idWZmZXJlZCBmb3Igd3JpdGluZwogCisgICAgY2xhc3MgU29ja2V0TWVtbyhvYmplY3QpOgorICAgICAgICAiIiJBIHdyYXBwZXIgdG8ga2VlcCB0cmFjayBvZiBzZW50IGRhdGEsIG5lZWRlZCB0byBleGFtaW5lIHdyaXRlIGJlaGF2aW91ciIiIgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgc29jayk6CisgICAgICAgICAgICBzZWxmLl9zb2NrID0gc29jaworICAgICAgICAgICAgc2VsZi5zZW50ID0gW10KKworICAgICAgICBkZWYgc2VuZChzZWxmLCBkYXRhLCBmbGFncz0wKToKKyAgICAgICAgICAgIG4gPSBzZWxmLl9zb2NrLnNlbmQoZGF0YSwgZmxhZ3MpCisgICAgICAgICAgICBzZWxmLnNlbnQuYXBwZW5kKGRhdGFbOm5dKQorICAgICAgICAgICAgcmV0dXJuIG4KKworICAgICAgICBkZWYgc2VuZGFsbChzZWxmLCBkYXRhLCBmbGFncz0wKToKKyAgICAgICAgICAgIHNlbGYuX3NvY2suc2VuZGFsbChkYXRhLCBmbGFncykKKyAgICAgICAgICAgIHNlbGYuc2VudC5hcHBlbmQoZGF0YSkKKworICAgICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CisgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9zb2NrLCBhdHRyKQorCisgICAgICAgIGRlZiBnZXRzZW50KHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIFtlLnRvYnl0ZXMoKSBpZiBpc2luc3RhbmNlKGUsIG1lbW9yeXZpZXcpIGVsc2UgZSBmb3IgZSBpbiBzZWxmLnNlbnRdCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIEZpbGVPYmplY3RDbGFzc1Rlc3RDYXNlLnNldFVwKHNlbGYpCisgICAgICAgIHNlbGYuc2Vydl9maWxlLl9zb2NrID0gc2VsZi5Tb2NrZXRNZW1vKHNlbGYuc2Vydl9maWxlLl9zb2NrKQorCisgICAgZGVmIHRlc3RMaW5lYnVmZmVyZWRXcml0ZShzZWxmKToKKyAgICAgICAgIyBXcml0ZSB0d28gbGluZXMsIGluIHNtYWxsIGNodW5rcworICAgICAgICBtc2cgPSBNU0cuc3RyaXAoKQorICAgICAgICBwcmludCA+PiBzZWxmLnNlcnZfZmlsZSwgbXNnLAorICAgICAgICBwcmludCA+PiBzZWxmLnNlcnZfZmlsZSwgbXNnCisKKyAgICAgICAgIyBzZWNvbmQgbGluZToKKyAgICAgICAgcHJpbnQgPj4gc2VsZi5zZXJ2X2ZpbGUsIG1zZywKKyAgICAgICAgcHJpbnQgPj4gc2VsZi5zZXJ2X2ZpbGUsIG1zZywKKyAgICAgICAgcHJpbnQgPj4gc2VsZi5zZXJ2X2ZpbGUsIG1zZworCisgICAgICAgICMgdGhpcmQgbGluZQorICAgICAgICBwcmludCA+PiBzZWxmLnNlcnZfZmlsZSwgJycKKworICAgICAgICBzZWxmLnNlcnZfZmlsZS5mbHVzaCgpCisKKyAgICAgICAgbXNnMSA9ICIlcyAlc1xuIiUobXNnLCBtc2cpCisgICAgICAgIG1zZzIgPSAgIiVzICVzICVzXG4iJShtc2csIG1zZywgbXNnKQorICAgICAgICBtc2czID0gICJcbiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNlcnZfZmlsZS5fc29jay5nZXRzZW50KCksIFttc2cxLCBtc2cyLCBtc2czXSkKKworICAgIGRlZiBfdGVzdExpbmVidWZmZXJlZFdyaXRlKHNlbGYpOgorICAgICAgICBtc2cgPSBNU0cuc3RyaXAoKQorICAgICAgICBtc2cxID0gIiVzICVzXG4iJShtc2csIG1zZykKKyAgICAgICAgbXNnMiA9ICAiJXMgJXMgJXNcbiIlKG1zZywgbXNnLCBtc2cpCisgICAgICAgIG1zZzMgPSAgIlxuIgorICAgICAgICBsMSA9IHNlbGYuY2xpX2ZpbGUucmVhZGxpbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwxLCBtc2cxKQorICAgICAgICBsMiA9IHNlbGYuY2xpX2ZpbGUucmVhZGxpbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwyLCBtc2cyKQorICAgICAgICBsMyA9IHNlbGYuY2xpX2ZpbGUucmVhZGxpbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwzLCBtc2czKQorCiAKIGNsYXNzIFNtYWxsQnVmZmVyZWRGaWxlT2JqZWN0Q2xhc3NUZXN0Q2FzZShGaWxlT2JqZWN0Q2xhc3NUZXN0Q2FzZSk6CiAKQEAgLTExODcsNyArMTMzMSwyNiBAQAogICAgICAgICBwb3J0ID0gdGVzdF9zdXBwb3J0LmZpbmRfdW51c2VkX3BvcnQoKQogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC5lcnJvcikgYXMgY206CiAgICAgICAgICAgICBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oKEhPU1QsIHBvcnQpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtLmV4Y2VwdGlvbi5lcnJubywgZXJybm8uRUNPTk5SRUZVU0VEKQorCisgICAgICAgICMgSXNzdWUgIzE2MjU3OiBjcmVhdGVfY29ubmVjdGlvbigpIGNhbGxzIGdldGFkZHJpbmZvKCkgYWdhaW5zdAorICAgICAgICAjICdsb2NhbGhvc3QnLiAgVGhpcyBtYXkgcmVzdWx0IGluIGFuIElQVjYgYWRkciBiZWluZyByZXR1cm5lZAorICAgICAgICAjIGFzIHdlbGwgYXMgYW4gSVBWNCBvbmU6CisgICAgICAgICMgICA+Pj4gc29ja2V0LmdldGFkZHJpbmZvKCdsb2NhbGhvc3QnLCBwb3J0LCAwLCBTT0NLX1NUUkVBTSkKKyAgICAgICAgIyAgID4+PiBbKDIsICAyLCAwLCAnJywgKCcxMjcuMC4wLjEnLCA0MTIzMCkpLAorICAgICAgICAjICAgICAgICAoMjYsIDIsIDAsICcnLCAoJzo6MScsIDQxMjMwLCAwLCAwKSldCisgICAgICAgICMKKyAgICAgICAgIyBjcmVhdGVfY29ubmVjdGlvbigpIGVudW1lcmF0ZXMgdGhyb3VnaCBhbGwgdGhlIGFkZHJlc3NlcyByZXR1cm5lZAorICAgICAgICAjIGFuZCBpZiBpdCBkb2Vzbid0IHN1Y2Nlc3NmdWxseSBiaW5kIHRvIGFueSBvZiB0aGVtLCBpdCBwcm9wYWdhdGVzCisgICAgICAgICMgdGhlIGxhc3QgZXhjZXB0aW9uIGl0IGVuY291bnRlcmVkLgorICAgICAgICAjCisgICAgICAgICMgT24gU29sYXJpcywgRU5FVFVOUkVBQ0ggaXMgcmV0dXJuZWQgaW4gdGhpcyBjaXJjdW1zdGFuY2UgaW5zdGVhZAorICAgICAgICAjIG9mIEVDT05OUkVGVVNFRC4gIFNvLCBpZiB0aGF0IGVycm5vIGV4aXN0cywgYWRkIGl0IHRvIG91ciBsaXN0IG9mCisgICAgICAgICMgZXhwZWN0ZWQgZXJybm9zLgorICAgICAgICBleHBlY3RlZF9lcnJub3MgPSBbIGVycm5vLkVDT05OUkVGVVNFRCwgXQorICAgICAgICBpZiBoYXNhdHRyKGVycm5vLCAnRU5FVFVOUkVBQ0gnKToKKyAgICAgICAgICAgIGV4cGVjdGVkX2Vycm5vcy5hcHBlbmQoZXJybm8uRU5FVFVOUkVBQ0gpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJbihjbS5leGNlcHRpb24uZXJybm8sIGV4cGVjdGVkX2Vycm5vcykKIAogICAgIGRlZiB0ZXN0X2NyZWF0ZV9jb25uZWN0aW9uX3RpbWVvdXQoc2VsZik6CiAgICAgICAgICMgSXNzdWUgIzk3OTI6IGNyZWF0ZV9jb25uZWN0aW9uKCkgc2hvdWxkIG5vdCByZWNhc3QgdGltZW91dCBlcnJvcnMKQEAgLTEzNDUsMTIgKzE1MDgsMTIgQEAKICAgICAgICAgaWYgbm90IG9rOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJhY2NlcHQoKSByZXR1cm5lZCBzdWNjZXNzIHdoZW4gd2UgZGlkIG5vdCBleHBlY3QgaXQiKQogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihzaWduYWwsICdhbGFybScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0IG5lZWRzIHNpZ25hbC5hbGFybSgpJykKICAgICBkZWYgdGVzdEludGVycnVwdGVkVGltZW91dChzZWxmKToKICAgICAgICAgIyBYWFggSSBkb24ndCBrbm93IGhvdyB0byBkbyB0aGlzIHRlc3Qgb24gTVNXaW5kb3dzIG9yIGFueSBvdGhlcgogICAgICAgICAjIHBsYWZvcm0gdGhhdCBkb2Vzbid0IHN1cHBvcnQgc2lnbmFsLmFsYXJtKCkgb3Igb3Mua2lsbCgpLCB0aG91Z2gKICAgICAgICAgIyB0aGUgYnVnIHNob3VsZCBoYXZlIGV4aXN0ZWQgb24gYWxsIHBsYXRmb3Jtcy4KLSAgICAgICAgaWYgbm90IGhhc2F0dHIoc2lnbmFsLCAiYWxhcm0iKToKLSAgICAgICAgICAgIHJldHVybiAgICAgICAgICAgICAgICAgICMgY2FuIG9ubHkgdGVzdCBvbiAqbml4CiAgICAgICAgIHNlbGYuc2Vydi5zZXR0aW1lb3V0KDUuMCkgICAjIG11c3QgYmUgbG9uZ2VyIHRoYW4gYWxhcm0KICAgICAgICAgY2xhc3MgQWxhcm0oRXhjZXB0aW9uKToKICAgICAgICAgICAgIHBhc3MKQEAgLTE0MTAsNiArMTU3Myw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNvY2tldC5nYWllcnJvciwgc29ja2V0LmVycm9yKSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc29ja2V0LnRpbWVvdXQsIHNvY2tldC5lcnJvcikpCiAKK0B1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAnbGludXgnLCAnTGludXggc3BlY2lmaWMgdGVzdCcpCiBjbGFzcyBUZXN0TGludXhBYnN0cmFjdE5hbWVzcGFjZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBVTklYX1BBVEhfTUFYID0gMTA4CkBAIC0xNTA1LDYgKzE2NjksMjMgQEAKIAogICAgIF90ZXN0UmVjdkZyb21JbnRvTWVtb3J5dmlldyA9IF90ZXN0UmVjdkZyb21JbnRvQXJyYXkKIAorICAgIGRlZiB0ZXN0UmVjdkZyb21JbnRvU21hbGxCdWZmZXIoc2VsZik6CisgICAgICAgICMgU2VlIGlzc3VlICMyMDI0Ni4KKyAgICAgICAgYnVmID0gYnl0ZWFycmF5KDgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuY2xpX2Nvbm4ucmVjdmZyb21faW50bywgYnVmLCAxMDI0KQorCisgICAgZGVmIF90ZXN0UmVjdkZyb21JbnRvU21hbGxCdWZmZXIoc2VsZik6CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIGJ1ZiA9IGJ1ZmZlcihNU0cpCisgICAgICAgIHNlbGYuc2Vydl9jb25uLnNlbmQoYnVmKQorCisgICAgZGVmIHRlc3RSZWN2RnJvbUludG9FbXB0eUJ1ZmZlcihzZWxmKToKKyAgICAgICAgYnVmID0gYnl0ZWFycmF5KCkKKyAgICAgICAgc2VsZi5jbGlfY29ubi5yZWN2ZnJvbV9pbnRvKGJ1ZikKKyAgICAgICAgc2VsZi5jbGlfY29ubi5yZWN2ZnJvbV9pbnRvKGJ1ZiwgMCkKKworICAgIF90ZXN0UmVjdkZyb21JbnRvRW1wdHlCdWZmZXIgPSBfdGVzdFJlY3ZGcm9tSW50b0FycmF5CisKIAogVElQQ19TVFlQRSA9IDIwMDAKIFRJUENfTE9XRVIgPSAyMDAKQEAgLTE1MjQsMTEgKzE3MDUsMTEgQEAKICAgICAgICAgZm9yIGxpbmUgaW4gZjoKICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgidGlwYyAiKToKICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQotICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgotICAgICAgICBwcmludCAiVElQQyBtb2R1bGUgaXMgbm90IGxvYWRlZCwgcGxlYXNlICdzdWRvIG1vZHByb2JlIHRpcGMnIgogICAgIHJldHVybiBGYWxzZQogCi1jbGFzcyBUSVBDVGVzdCAodW5pdHRlc3QuVGVzdENhc2UpOgorQHVuaXR0ZXN0LnNraXBVbmxlc3MoaXNUaXBjQXZhaWxhYmxlKCksCisgICAgICAgICAgICAgICAgICAgICAiVElQQyBtb2R1bGUgaXMgbm90IGxvYWRlZCwgcGxlYXNlICdzdWRvIG1vZHByb2JlIHRpcGMnIikKK2NsYXNzIFRJUENUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdFJETShzZWxmKToKICAgICAgICAgc3J2ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfVElQQywgc29ja2V0LlNPQ0tfUkRNKQogICAgICAgICBjbGkgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9USVBDLCBzb2NrZXQuU09DS19SRE0pCkBAIC0xNTQ4LDcgKzE3MjksOSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgTVNHKQogCiAKLWNsYXNzIFRJUENUaHJlYWRhYmxlVGVzdCAodW5pdHRlc3QuVGVzdENhc2UsIFRocmVhZGFibGVUZXN0KToKK0B1bml0dGVzdC5za2lwVW5sZXNzKGlzVGlwY0F2YWlsYWJsZSgpLAorICAgICAgICAgICAgICAgICAgICAgIlRJUEMgbW9kdWxlIGlzIG5vdCBsb2FkZWQsIHBsZWFzZSAnc3VkbyBtb2Rwcm9iZSB0aXBjJyIpCitjbGFzcyBUSVBDVGhyZWFkYWJsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UsIFRocmVhZGFibGVUZXN0KToKICAgICBkZWYgX19pbml0X18oc2VsZiwgbWV0aG9kTmFtZSA9ICdydW5UZXN0Jyk6CiAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlLl9faW5pdF9fKHNlbGYsIG1ldGhvZE5hbWUgPSBtZXRob2ROYW1lKQogICAgICAgICBUaHJlYWRhYmxlVGVzdC5fX2luaXRfXyhzZWxmKQpAQCAtMTYwMSwxMyArMTc4NCw5IEBACiAgICAgICAgIE5ldHdvcmtDb25uZWN0aW9uQXR0cmlidXRlc1Rlc3QsCiAgICAgICAgIE5ldHdvcmtDb25uZWN0aW9uQmVoYXZpb3VyVGVzdCwKICAgICBdKQotICAgIGlmIGhhc2F0dHIoc29ja2V0LCAic29ja2V0cGFpciIpOgotICAgICAgICB0ZXN0cy5hcHBlbmQoQmFzaWNTb2NrZXRQYWlyVGVzdCkKLSAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2xpbnV4Mic6Ci0gICAgICAgIHRlc3RzLmFwcGVuZChUZXN0TGludXhBYnN0cmFjdE5hbWVzcGFjZSkKLSAgICBpZiBpc1RpcGNBdmFpbGFibGUoKToKLSAgICAgICAgdGVzdHMuYXBwZW5kKFRJUENUZXN0KQotICAgICAgICB0ZXN0cy5hcHBlbmQoVElQQ1RocmVhZGFibGVUZXN0KQorICAgIHRlc3RzLmFwcGVuZChCYXNpY1NvY2tldFBhaXJUZXN0KQorICAgIHRlc3RzLmFwcGVuZChUZXN0TGludXhBYnN0cmFjdE5hbWVzcGFjZSkKKyAgICB0ZXN0cy5leHRlbmQoW1RJUENUZXN0LCBUSVBDVGhyZWFkYWJsZVRlc3RdKQogCiAgICAgdGhyZWFkX2luZm8gPSB0ZXN0X3N1cHBvcnQudGhyZWFkaW5nX3NldHVwKCkKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0cykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc29ja2V0c2VydmVyLnB5IGIvTGliL3Rlc3QvdGVzdF9zb2NrZXRzZXJ2ZXIucHkKaW5kZXggMDhmYjAzMy4uODNmNWUzZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zb2NrZXRzZXJ2ZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zb2NrZXRzZXJ2ZXIucHkKQEAgLTgsNiArOCw4IEBACiBpbXBvcnQgc2VsZWN0CiBpbXBvcnQgc2lnbmFsCiBpbXBvcnQgc29ja2V0CitpbXBvcnQgc2VsZWN0CitpbXBvcnQgZXJybm8KIGltcG9ydCB0ZW1wZmlsZQogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgU29ja2V0U2VydmVyCkBAIC0yNSwxNSArMjcsMjEgQEAKIEhPU1QgPSB0ZXN0LnRlc3Rfc3VwcG9ydC5IT1NUCiAKIEhBVkVfVU5JWF9TT0NLRVRTID0gaGFzYXR0cihzb2NrZXQsICJBRl9VTklYIikKK3JlcXVpcmVzX3VuaXhfc29ja2V0cyA9IHVuaXR0ZXN0LnNraXBVbmxlc3MoSEFWRV9VTklYX1NPQ0tFVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXF1aXJlcyBVbml4IHNvY2tldHMnKQogSEFWRV9GT1JLSU5HID0gaGFzYXR0cihvcywgImZvcmsiKSBhbmQgb3MubmFtZSAhPSAib3MyIgorcmVxdWlyZXNfZm9ya2luZyA9IHVuaXR0ZXN0LnNraXBVbmxlc3MoSEFWRV9GT1JLSU5HLCAncmVxdWlyZXMgZm9ya2luZycpCiAKIGRlZiBzaWduYWxfYWxhcm0obik6CiAgICAgIiIiQ2FsbCBzaWduYWwuYWxhcm0gd2hlbiBpdCBleGlzdHMgKGkuZS4gbm90IG9uIFdpbmRvd3MpLiIiIgogICAgIGlmIGhhc2F0dHIoc2lnbmFsLCAnYWxhcm0nKToKICAgICAgICAgc2lnbmFsLmFsYXJtKG4pCiAKKyMgUmVtZW1iZXIgcmVhbCBzZWxlY3QoKSB0byBhdm9pZCBpbnRlcmZlcmVuY2VzIHdpdGggbW9ja2luZworX3JlYWxfc2VsZWN0ID0gc2VsZWN0LnNlbGVjdAorCiBkZWYgcmVjZWl2ZShzb2NrLCBuLCB0aW1lb3V0PTIwKToKLSAgICByLCB3LCB4ID0gc2VsZWN0LnNlbGVjdChbc29ja10sIFtdLCBbXSwgdGltZW91dCkKKyAgICByLCB3LCB4ID0gX3JlYWxfc2VsZWN0KFtzb2NrXSwgW10sIFtdLCB0aW1lb3V0KQogICAgIGlmIHNvY2sgaW4gcjoKICAgICAgICAgcmV0dXJuIHNvY2sucmVjdihuKQogICAgIGVsc2U6CkBAIC01Myw3ICs2MSw3IEBACiBkZWYgc2ltcGxlX3N1YnByb2Nlc3ModGVzdGNhc2UpOgogICAgIHBpZCA9IG9zLmZvcmsoKQogICAgIGlmIHBpZCA9PSAwOgotICAgICAgICAjIERvbid0IHRocm93IGFuIGV4Y2VwdGlvbjsgaXQgd291bGQgYmUgY2F1Z2h0IGJ5IHRoZSB0ZXN0IGhhcm5lc3MuCisgICAgICAgICMgRG9uJ3QgcmFpc2UgYW4gZXhjZXB0aW9uOyBpdCB3b3VsZCBiZSBjYXVnaHQgYnkgdGhlIHRlc3QgaGFybmVzcy4KICAgICAgICAgb3MuX2V4aXQoNzIpCiAgICAgeWllbGQgTm9uZQogICAgIHBpZDIsIHN0YXR1cyA9IG9zLndhaXRwaWQocGlkLCAwKQpAQCAtMTgzLDMxICsxOTEsMzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldFNlcnZlci5TdHJlYW1SZXF1ZXN0SGFuZGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtX2V4YW1pbmUpCiAKLSAgICBpZiBIQVZFX0ZPUktJTkc6Ci0gICAgICAgIGRlZiB0ZXN0X0ZvcmtpbmdUQ1BTZXJ2ZXIoc2VsZik6Ci0gICAgICAgICAgICB3aXRoIHNpbXBsZV9zdWJwcm9jZXNzKHNlbGYpOgotICAgICAgICAgICAgICAgIHNlbGYucnVuX3NlcnZlcihTb2NrZXRTZXJ2ZXIuRm9ya2luZ1RDUFNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0U2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbV9leGFtaW5lKQotCi0gICAgaWYgSEFWRV9VTklYX1NPQ0tFVFM6Ci0gICAgICAgIGRlZiB0ZXN0X1VuaXhTdHJlYW1TZXJ2ZXIoc2VsZik6Ci0gICAgICAgICAgICBzZWxmLnJ1bl9zZXJ2ZXIoU29ja2V0U2VydmVyLlVuaXhTdHJlYW1TZXJ2ZXIsCisgICAgQHJlcXVpcmVzX2ZvcmtpbmcKKyAgICBkZWYgdGVzdF9Gb3JraW5nVENQU2VydmVyKHNlbGYpOgorICAgICAgICB3aXRoIHNpbXBsZV9zdWJwcm9jZXNzKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5ydW5fc2VydmVyKFNvY2tldFNlcnZlci5Gb3JraW5nVENQU2VydmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldFNlcnZlci5TdHJlYW1SZXF1ZXN0SGFuZGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbV9leGFtaW5lKQogCi0gICAgICAgIGRlZiB0ZXN0X1RocmVhZGluZ1VuaXhTdHJlYW1TZXJ2ZXIoc2VsZik6Ci0gICAgICAgICAgICBzZWxmLnJ1bl9zZXJ2ZXIoU29ja2V0U2VydmVyLlRocmVhZGluZ1VuaXhTdHJlYW1TZXJ2ZXIsCisgICAgQHJlcXVpcmVzX3VuaXhfc29ja2V0cworICAgIGRlZiB0ZXN0X1VuaXhTdHJlYW1TZXJ2ZXIoc2VsZik6CisgICAgICAgIHNlbGYucnVuX3NlcnZlcihTb2NrZXRTZXJ2ZXIuVW5peFN0cmVhbVNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldFNlcnZlci5TdHJlYW1SZXF1ZXN0SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtX2V4YW1pbmUpCisKKyAgICBAcmVxdWlyZXNfdW5peF9zb2NrZXRzCisgICAgZGVmIHRlc3RfVGhyZWFkaW5nVW5peFN0cmVhbVNlcnZlcihzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fc2VydmVyKFNvY2tldFNlcnZlci5UaHJlYWRpbmdVbml4U3RyZWFtU2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0U2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW1fZXhhbWluZSkKKworICAgIEByZXF1aXJlc191bml4X3NvY2tldHMKKyAgICBAcmVxdWlyZXNfZm9ya2luZworICAgIGRlZiB0ZXN0X0ZvcmtpbmdVbml4U3RyZWFtU2VydmVyKHNlbGYpOgorICAgICAgICB3aXRoIHNpbXBsZV9zdWJwcm9jZXNzKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5ydW5fc2VydmVyKEZvcmtpbmdVbml4U3RyZWFtU2VydmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldFNlcnZlci5TdHJlYW1SZXF1ZXN0SGFuZGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbV9leGFtaW5lKQogCi0gICAgICAgIGlmIEhBVkVfRk9SS0lORzoKLSAgICAgICAgICAgIGRlZiB0ZXN0X0ZvcmtpbmdVbml4U3RyZWFtU2VydmVyKHNlbGYpOgotICAgICAgICAgICAgICAgIHdpdGggc2ltcGxlX3N1YnByb2Nlc3Moc2VsZik6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYucnVuX3NlcnZlcihGb3JraW5nVW5peFN0cmVhbVNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldFNlcnZlci5TdHJlYW1SZXF1ZXN0SGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtX2V4YW1pbmUpCi0KICAgICBkZWYgdGVzdF9VRFBTZXJ2ZXIoc2VsZik6CiAgICAgICAgIHNlbGYucnVuX3NlcnZlcihTb2NrZXRTZXJ2ZXIuVURQU2VydmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0U2VydmVyLkRhdGFncmFtUmVxdWVzdEhhbmRsZXIsCkBAIC0yMTgsMzIgKzIyOCw2NiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0U2VydmVyLkRhdGFncmFtUmVxdWVzdEhhbmRsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRncmFtX2V4YW1pbmUpCiAKLSAgICBpZiBIQVZFX0ZPUktJTkc6Ci0gICAgICAgIGRlZiB0ZXN0X0ZvcmtpbmdVRFBTZXJ2ZXIoc2VsZik6Ci0gICAgICAgICAgICB3aXRoIHNpbXBsZV9zdWJwcm9jZXNzKHNlbGYpOgotICAgICAgICAgICAgICAgIHNlbGYucnVuX3NlcnZlcihTb2NrZXRTZXJ2ZXIuRm9ya2luZ1VEUFNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0U2VydmVyLkRhdGFncmFtUmVxdWVzdEhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGdyYW1fZXhhbWluZSkKKyAgICBAcmVxdWlyZXNfZm9ya2luZworICAgIGRlZiB0ZXN0X0ZvcmtpbmdVRFBTZXJ2ZXIoc2VsZik6CisgICAgICAgIHdpdGggc2ltcGxlX3N1YnByb2Nlc3Moc2VsZik6CisgICAgICAgICAgICBzZWxmLnJ1bl9zZXJ2ZXIoU29ja2V0U2VydmVyLkZvcmtpbmdVRFBTZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0U2VydmVyLkRhdGFncmFtUmVxdWVzdEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kZ3JhbV9leGFtaW5lKQorCisgICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKKyAgICBkZWYgbW9ja2VkX3NlbGVjdF9tb2R1bGUoc2VsZik6CisgICAgICAgICIiIk1vY2tzIHRoZSBzZWxlY3Quc2VsZWN0KCkgY2FsbCB0byByYWlzZSBFSU5UUiBmb3IgZmlyc3QgY2FsbCIiIgorICAgICAgICBvbGRfc2VsZWN0ID0gc2VsZWN0LnNlbGVjdAorCisgICAgICAgIGNsYXNzIE1vY2tTZWxlY3Q6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5jYWxsZWQgPSAwCisKKyAgICAgICAgICAgIGRlZiBfX2NhbGxfXyhzZWxmLCAqYXJncyk6CisgICAgICAgICAgICAgICAgc2VsZi5jYWxsZWQgKz0gMQorICAgICAgICAgICAgICAgIGlmIHNlbGYuY2FsbGVkID09IDE6CisgICAgICAgICAgICAgICAgICAgICMgcmFpc2UgdGhlIGV4Y2VwdGlvbiBvbiBmaXJzdCBjYWxsCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIHNlbGVjdC5lcnJvcihlcnJuby5FSU5UUiwgb3Muc3RyZXJyb3IoZXJybm8uRUlOVFIpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgUmV0dXJuIHJlYWwgc2VsZWN0IHZhbHVlIGZvciBjb25zZWN1dGl2ZSBjYWxscworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2xkX3NlbGVjdCgqYXJncykKKworICAgICAgICBzZWxlY3Quc2VsZWN0ID0gTW9ja1NlbGVjdCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHlpZWxkIHNlbGVjdC5zZWxlY3QKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGVjdC5zZWxlY3QgPSBvbGRfc2VsZWN0CisKKyAgICBkZWYgdGVzdF9JbnRlcnJ1cHRTZXJ2ZXJTZWxlY3RDYWxsKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYubW9ja2VkX3NlbGVjdF9tb2R1bGUoKSBhcyBtb2NrX3NlbGVjdDoKKyAgICAgICAgICAgIHBpZCA9IHNlbGYucnVuX3NlcnZlcihTb2NrZXRTZXJ2ZXIuVENQU2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldFNlcnZlci5TdHJlYW1SZXF1ZXN0SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbV9leGFtaW5lKQorICAgICAgICAgICAgIyBNYWtlIHN1cmUgc2VsZWN0IHdhcyBjYWxsZWQgYWdhaW46CisgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIobW9ja19zZWxlY3QuY2FsbGVkLCAxKQogCiAgICAgIyBBbGFzLCBvbiBMaW51eCAoYXQgbGVhc3QpIHJlY3Zmcm9tKCkgZG9lc24ndCByZXR1cm4gYSBtZWFuaW5nZnVsCiAgICAgIyBjbGllbnQgYWRkcmVzcyBzbyB0aGlzIGNhbm5vdCB3b3JrOgogCi0gICAgIyBpZiBIQVZFX1VOSVhfU09DS0VUUzoKLSAgICAjICAgICBkZWYgdGVzdF9Vbml4RGF0YWdyYW1TZXJ2ZXIoc2VsZik6Ci0gICAgIyAgICAgICAgIHNlbGYucnVuX3NlcnZlcihTb2NrZXRTZXJ2ZXIuVW5peERhdGFncmFtU2VydmVyLAotICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0U2VydmVyLkRhdGFncmFtUmVxdWVzdEhhbmRsZXIsCi0gICAgIyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRncmFtX2V4YW1pbmUpCisgICAgIyBAcmVxdWlyZXNfdW5peF9zb2NrZXRzCisgICAgIyBkZWYgdGVzdF9Vbml4RGF0YWdyYW1TZXJ2ZXIoc2VsZik6CisgICAgIyAgICAgc2VsZi5ydW5fc2VydmVyKFNvY2tldFNlcnZlci5Vbml4RGF0YWdyYW1TZXJ2ZXIsCisgICAgIyAgICAgICAgICAgICAgICAgICAgIFNvY2tldFNlcnZlci5EYXRhZ3JhbVJlcXVlc3RIYW5kbGVyLAorICAgICMgICAgICAgICAgICAgICAgICAgICBzZWxmLmRncmFtX2V4YW1pbmUpCiAgICAgIwotICAgICMgICAgIGRlZiB0ZXN0X1RocmVhZGluZ1VuaXhEYXRhZ3JhbVNlcnZlcihzZWxmKToKLSAgICAjICAgICAgICAgc2VsZi5ydW5fc2VydmVyKFNvY2tldFNlcnZlci5UaHJlYWRpbmdVbml4RGF0YWdyYW1TZXJ2ZXIsCi0gICAgIyAgICAgICAgICAgICAgICAgICAgICAgICBTb2NrZXRTZXJ2ZXIuRGF0YWdyYW1SZXF1ZXN0SGFuZGxlciwKLSAgICAjICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGdyYW1fZXhhbWluZSkKKyAgICAjIEByZXF1aXJlc191bml4X3NvY2tldHMKKyAgICAjIGRlZiB0ZXN0X1RocmVhZGluZ1VuaXhEYXRhZ3JhbVNlcnZlcihzZWxmKToKKyAgICAjICAgICBzZWxmLnJ1bl9zZXJ2ZXIoU29ja2V0U2VydmVyLlRocmVhZGluZ1VuaXhEYXRhZ3JhbVNlcnZlciwKKyAgICAjICAgICAgICAgICAgICAgICAgICAgU29ja2V0U2VydmVyLkRhdGFncmFtUmVxdWVzdEhhbmRsZXIsCisgICAgIyAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGdyYW1fZXhhbWluZSkKICAgICAjCi0gICAgIyAgICAgaWYgSEFWRV9GT1JLSU5HOgotICAgICMgICAgICAgICBkZWYgdGVzdF9Gb3JraW5nVW5peERhdGFncmFtU2VydmVyKHNlbGYpOgotICAgICMgICAgICAgICAgICAgc2VsZi5ydW5fc2VydmVyKFNvY2tldFNlcnZlci5Gb3JraW5nVW5peERhdGFncmFtU2VydmVyLAotICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldFNlcnZlci5EYXRhZ3JhbVJlcXVlc3RIYW5kbGVyLAotICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGdyYW1fZXhhbWluZSkKKyAgICAjIEByZXF1aXJlc191bml4X3NvY2tldHMKKyAgICAjIEByZXF1aXJlc19mb3JraW5nCisgICAgIyBkZWYgdGVzdF9Gb3JraW5nVW5peERhdGFncmFtU2VydmVyKHNlbGYpOgorICAgICMgICAgIHNlbGYucnVuX3NlcnZlcihTb2NrZXRTZXJ2ZXIuRm9ya2luZ1VuaXhEYXRhZ3JhbVNlcnZlciwKKyAgICAjICAgICAgICAgICAgICAgICAgICAgU29ja2V0U2VydmVyLkRhdGFncmFtUmVxdWVzdEhhbmRsZXIsCisgICAgIyAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGdyYW1fZXhhbWluZSkKIAogICAgIEByZWFwX3RocmVhZHMKICAgICBkZWYgdGVzdF9zaHV0ZG93bihzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3B3ZC5weSBiL0xpYi90ZXN0L3Rlc3Rfc3B3ZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjM3ZGEyCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9zcHdkLnB5CkBAIC0wLDAgKzEsNjIgQEAKK2ltcG9ydCBvcworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitzcHdkID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ3Nwd2QnKQorCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdnZXRldWlkJykgYW5kIG9zLmdldGV1aWQoKSA9PSAwLAorICAgICAgICAgICAgICAgICAgICAgJ3Jvb3QgcHJpdmlsZWdlcyByZXF1aXJlZCcpCitjbGFzcyBUZXN0U3B3ZFJvb3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZ2V0c3BhbGwoc2VsZik6CisgICAgICAgIGVudHJpZXMgPSBzcHdkLmdldHNwYWxsKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGVudHJpZXMsIGxpc3QpCisgICAgICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGVudHJ5LCBzcHdkLnN0cnVjdF9zcHdkKQorCisgICAgZGVmIHRlc3RfZ2V0c3BuYW0oc2VsZik6CisgICAgICAgIGVudHJpZXMgPSBzcHdkLmdldHNwYWxsKCkKKyAgICAgICAgaWYgbm90IGVudHJpZXM6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCdlbXB0eSBzaGFkb3cgcGFzc3dvcmQgZGF0YWJhc2UnKQorICAgICAgICByYW5kb21fbmFtZSA9IGVudHJpZXNbMF0uc3BfbmFtCisgICAgICAgIGVudHJ5ID0gc3B3ZC5nZXRzcG5hbShyYW5kb21fbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGVudHJ5LCBzcHdkLnN0cnVjdF9zcHdkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudHJ5LnNwX25hbSwgcmFuZG9tX25hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW50cnkuc3BfbmFtLCBlbnRyeVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGVudHJ5LnNwX3B3ZCwgc3RyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudHJ5LnNwX3B3ZCwgZW50cnlbMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShlbnRyeS5zcF9sc3RjaGcsIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbnRyeS5zcF9sc3RjaGcsIGVudHJ5WzJdKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZW50cnkuc3BfbWluLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW50cnkuc3BfbWluLCBlbnRyeVszXSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGVudHJ5LnNwX21heCwgaW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudHJ5LnNwX21heCwgZW50cnlbNF0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShlbnRyeS5zcF93YXJuLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW50cnkuc3Bfd2FybiwgZW50cnlbNV0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShlbnRyeS5zcF9pbmFjdCwgaW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudHJ5LnNwX2luYWN0LCBlbnRyeVs2XSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGVudHJ5LnNwX2V4cGlyZSwgaW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudHJ5LnNwX2V4cGlyZSwgZW50cnlbN10pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShlbnRyeS5zcF9mbGFnLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW50cnkuc3BfZmxhZywgZW50cnlbOF0pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpIGFzIGN4OgorICAgICAgICAgICAgc3B3ZC5nZXRzcG5hbSgnaW52YWxpZCB1c2VyIG5hbWUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjeC5leGNlcHRpb24pLCAiJ2dldHNwbmFtKCk6IG5hbWUgbm90IGZvdW5kJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3B3ZC5nZXRzcG5hbSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzcHdkLmdldHNwbmFtLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNwd2QuZ2V0c3BuYW0sIHJhbmRvbV9uYW1lLCAwKQorICAgICAgICBpZiB0ZXN0X3N1cHBvcnQuaGF2ZV91bmljb2RlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHVuaWNvZGVfbmFtZSA9IHVuaWNvZGUocmFuZG9tX25hbWUpCisgICAgICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcHdkLmdldHNwbmFtKHVuaWNvZGVfbmFtZSksIGVudHJ5KQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RTcHdkUm9vdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zc2wucHkgYi9MaWIvdGVzdC90ZXN0X3NzbC5weQppbmRleCBiYTFkODY4Li45MWI4MDI5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NzbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NzbC5weQpAQCAtMjUsNiArMjUsNyBAQAogSE9TVCA9IHRlc3Rfc3VwcG9ydC5IT1NUCiBDRVJURklMRSA9IE5vbmUKIFNWTl9QWVRIT05fT1JHX1JPT1RfQ0VSVCA9IE5vbmUKK05VTExCWVRFQ0VSVCA9IE5vbmUKIAogZGVmIGhhbmRsZV9lcnJvcihwcmVmaXgpOgogICAgIGV4Y19mb3JtYXQgPSAnICcuam9pbih0cmFjZWJhY2suZm9ybWF0X2V4Y2VwdGlvbigqc3lzLmV4Y19pbmZvKCkpKQpAQCAtOTUsMTIgKzk2LDggQEAKICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIlxuIFJBTkRfc3RhdHVzIGlzICVkICglcylcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAodiwgKHYgYW5kICJzdWZmaWNpZW50IHJhbmRvbW5lc3MiKSBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdWZmaWNpZW50IHJhbmRvbW5lc3MiKSkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc3NsLlJBTkRfZWdkKDEpCi0gICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcmludCAiZGlkbid0IHJhaXNlIFR5cGVFcnJvciIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzc2wuUkFORF9lZ2QsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3NsLlJBTkRfZWdkLCAnZm9vJywgMSkKICAgICAgICAgc3NsLlJBTkRfYWRkKCJ0aGlzIGlzIGEgcmFuZG9tIHN0cmluZyIsIDc1LjApCiAKICAgICBkZWYgdGVzdF9wYXJzZV9jZXJ0KHNlbGYpOgpAQCAtMTExLDEzICsxMDgsMTIgQEAKICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CiAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJcbiIgKyBwcHJpbnQucGZvcm1hdChwKSArICJcbiIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFsnc3ViamVjdCddLAotICAgICAgICAgICAgICAgICAgICAgICAgICgoKCdjb3VudHJ5TmFtZScsIHUnVVMnKSwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAoKCdzdGF0ZU9yUHJvdmluY2VOYW1lJywgdSdEZWxhd2FyZScpLCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgoJ2xvY2FsaXR5TmFtZScsIHUnV2lsbWluZ3RvbicpLCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgoJ29yZ2FuaXphdGlvbk5hbWUnLCB1J1B5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uJyksKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgnb3JnYW5pemF0aW9uYWxVbml0TmFtZScsIHUnU1NMJyksKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgnY29tbW9uTmFtZScsIHUnc29tZW1hY2hpbmUucHl0aG9uLm9yZycpLCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgoKCdjb3VudHJ5TmFtZScsICdYWScpLCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgoJ2xvY2FsaXR5TmFtZScsICdDYXN0bGUgQW50aHJheCcpLCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgoJ29yZ2FuaXphdGlvbk5hbWUnLCAnUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24nKSwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKCdjb21tb25OYW1lJywgJ2xvY2FsaG9zdCcpLCkpCiAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFsnc3ViamVjdEFsdE5hbWUnXSwgKCgnRE5TJywgJ2xvY2FsaG9zdCcpLCkpCiAgICAgICAgICMgSXNzdWUgIzEzMDM0OiB0aGUgc3ViamVjdEFsdE5hbWUgaW4gc29tZSBjZXJ0aWZpY2F0ZXMKICAgICAgICAgIyAobm90YWJseSBwcm9qZWN0cy5kZXZlbG9wZXIubm9raWEuY29tOjQ0Mykgd2Fzbid0IHBhcnNlZAogICAgICAgICBwID0gc3NsLl9zc2wuX3Rlc3RfZGVjb2RlX2NlcnQoTk9LSUFDRVJUKQpAQCAtMTI4LDYgKzEyNCwzNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAoJ0ROUycsICdwcm9qZWN0cy5mb3J1bS5ub2tpYS5jb20nKSkKICAgICAgICAgICAgICAgICAgICAgICAgICkKIAorICAgIGRlZiB0ZXN0X3BhcnNlX2NlcnRfQ1ZFXzIwMTNfNDIzOChzZWxmKToKKyAgICAgICAgcCA9IHNzbC5fc3NsLl90ZXN0X2RlY29kZV9jZXJ0KE5VTExCWVRFQ0VSVCkKKyAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJcbiIgKyBwcHJpbnQucGZvcm1hdChwKSArICJcbiIpCisgICAgICAgIHN1YmplY3QgPSAoKCgnY291bnRyeU5hbWUnLCAnVVMnKSwpLAorICAgICAgICAgICAgICAgICAgICgoJ3N0YXRlT3JQcm92aW5jZU5hbWUnLCAnT3JlZ29uJyksKSwKKyAgICAgICAgICAgICAgICAgICAoKCdsb2NhbGl0eU5hbWUnLCAnQmVhdmVydG9uJyksKSwKKyAgICAgICAgICAgICAgICAgICAoKCdvcmdhbml6YXRpb25OYW1lJywgJ1B5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uJyksKSwKKyAgICAgICAgICAgICAgICAgICAoKCdvcmdhbml6YXRpb25hbFVuaXROYW1lJywgJ1B5dGhvbiBDb3JlIERldmVsb3BtZW50JyksKSwKKyAgICAgICAgICAgICAgICAgICAoKCdjb21tb25OYW1lJywgJ251bGwucHl0aG9uLm9yZ1x4MDBleGFtcGxlLm9yZycpLCksCisgICAgICAgICAgICAgICAgICAgKCgnZW1haWxBZGRyZXNzJywgJ3B5dGhvbi1kZXZAcHl0aG9uLm9yZycpLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFsnc3ViamVjdCddLCBzdWJqZWN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbJ2lzc3VlciddLCBzdWJqZWN0KQorICAgICAgICBpZiBzc2wuT1BFTlNTTF9WRVJTSU9OX0lORk8gPj0gKDAsIDksIDgpOgorICAgICAgICAgICAgc2FuID0gKCgnRE5TJywgJ2FsdG51bGwucHl0aG9uLm9yZ1x4MDBleGFtcGxlLmNvbScpLAorICAgICAgICAgICAgICAgICAgICgnZW1haWwnLCAnbnVsbEBweXRob24ub3JnXHgwMHVzZXJAZXhhbXBsZS5vcmcnKSwKKyAgICAgICAgICAgICAgICAgICAoJ1VSSScsICdodHRwOi8vbnVsbC5weXRob24ub3JnXHgwMGh0dHA6Ly9leGFtcGxlLm9yZycpLAorICAgICAgICAgICAgICAgICAgICgnSVAgQWRkcmVzcycsICcxOTIuMC4yLjEnKSwKKyAgICAgICAgICAgICAgICAgICAoJ0lQIEFkZHJlc3MnLCAnMjAwMTpEQjg6MDowOjA6MDowOjFcbicpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBPcGVuU1NMIDAuOS43IGRvZXNuJ3Qgc3VwcG9ydCBJUHY2IGFkZHJlc3NlcyBpbiBzdWJqZWN0QWx0TmFtZQorICAgICAgICAgICAgc2FuID0gKCgnRE5TJywgJ2FsdG51bGwucHl0aG9uLm9yZ1x4MDBleGFtcGxlLmNvbScpLAorICAgICAgICAgICAgICAgICAgICgnZW1haWwnLCAnbnVsbEBweXRob24ub3JnXHgwMHVzZXJAZXhhbXBsZS5vcmcnKSwKKyAgICAgICAgICAgICAgICAgICAoJ1VSSScsICdodHRwOi8vbnVsbC5weXRob24ub3JnXHgwMGh0dHA6Ly9leGFtcGxlLm9yZycpLAorICAgICAgICAgICAgICAgICAgICgnSVAgQWRkcmVzcycsICcxOTIuMC4yLjEnKSwKKyAgICAgICAgICAgICAgICAgICAoJ0lQIEFkZHJlc3MnLCAnPGludmFsaWQ+JykpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWydzdWJqZWN0QWx0TmFtZSddLCBzYW4pCisKICAgICBkZWYgdGVzdF9ERVJfdG9fUEVNKHNlbGYpOgogICAgICAgICB3aXRoIG9wZW4oU1ZOX1BZVEhPTl9PUkdfUk9PVF9DRVJULCAncicpIGFzIGY6CiAgICAgICAgICAgICBwZW0gPSBmLnJlYWQoKQpAQCAtMTUwLDExICsxNzUsMTEgQEAKICAgICAgICAgIyBTb21lIHNhbml0eSBjaGVja3MgZm9sbG93CiAgICAgICAgICMgPj0gMC45CiAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKG4sIDB4OTAwMDAwKQotICAgICAgICAjIDwgMi4wCi0gICAgICAgIHNlbGYuYXNzZXJ0TGVzcyhuLCAweDIwMDAwMDAwKQorICAgICAgICAjIDwgMy4wCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzcyhuLCAweDMwMDAwMDAwKQogICAgICAgICBtYWpvciwgbWlub3IsIGZpeCwgcGF0Y2gsIHN0YXR1cyA9IHQKICAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwobWFqb3IsIDApCi0gICAgICAgIHNlbGYuYXNzZXJ0TGVzcyhtYWpvciwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzKG1ham9yLCAzKQogICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChtaW5vciwgMCkKICAgICAgICAgc2VsZi5hc3NlcnRMZXNzKG1pbm9yLCAyNTYpCiAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKGZpeCwgMCkKQEAgLTE2MywxMyArMTg4LDE2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKHBhdGNoLCAyNikKICAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwoc3RhdHVzLCAwKQogICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbChzdGF0dXMsIDE1KQotICAgICAgICAjIFZlcnNpb24gc3RyaW5nIGFzIHJldHVybmVkIGJ5IE9wZW5TU0wsIHRoZSBmb3JtYXQgbWlnaHQgY2hhbmdlCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnN0YXJ0c3dpdGgoIk9wZW5TU0wgezpkfS57OmR9Lns6ZH0iLmZvcm1hdChtYWpvciwgbWlub3IsIGZpeCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgKHMsIHQpKQorICAgICAgICAjIFZlcnNpb24gc3RyaW5nIGFzIHJldHVybmVkIGJ5IHtPcGVuLExpYnJlfVNTTCwgdGhlIGZvcm1hdCBtaWdodCBjaGFuZ2UKKyAgICAgICAgaWYgIkxpYnJlU1NMIiBpbiBzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuc3RhcnRzd2l0aCgiTGlicmVTU0wgezpkfS57OmR9Ii5mb3JtYXQobWFqb3IsIG1pbm9yKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMsIHQpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuc3RhcnRzd2l0aCgiT3BlblNTTCB7OmR9Lns6ZH0uezpkfSIuZm9ybWF0KG1ham9yLCBtaW5vciwgZml4KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMsIHQpKQogCisgICAgQHRlc3Rfc3VwcG9ydC5yZXF1aXJlc19yZXNvdXJjZSgnbmV0d29yaycpCiAgICAgZGVmIHRlc3RfY2lwaGVycyhzZWxmKToKLSAgICAgICAgaWYgbm90IHRlc3Rfc3VwcG9ydC5pc19yZXNvdXJjZV9lbmFibGVkKCduZXR3b3JrJyk6Ci0gICAgICAgICAgICByZXR1cm4KICAgICAgICAgcmVtb3RlID0gKCJzdm4ucHl0aG9uLm9yZyIsIDQ0MykKICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KHJlbW90ZVswXSk6CiAgICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLApAQCAtMjA4LDYgKzIzNiwxMyBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQuZXJyb3IsIHNzLnNlbmQsIGIneCcpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC5lcnJvciwgc3Muc2VuZHRvLCBiJ3gnLCAoJzAuMC4wLjAnLCAwKSkKIAorICAgIGRlZiB0ZXN0X3Vuc3VwcG9ydGVkX2R0bHMoc2VsZik6CisgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19ER1JBTSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHMuY2xvc2UpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvcikgYXMgY3g6CisgICAgICAgICAgICBzc2wud3JhcF9zb2NrZXQocywgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGN4LmV4Y2VwdGlvbiksICJvbmx5IHN0cmVhbSBzb2NrZXRzIGFyZSBzdXBwb3J0ZWQiKQorCiAKIGNsYXNzIE5ldHdvcmtlZFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtMjg0LDYgKzMxOSwzNCBAQAogICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICBzLmNsb3NlKCkKIAorICAgIGRlZiB0ZXN0X3RpbWVvdXRfY29ubmVjdF9leChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTIwNjU6IG9uIGEgdGltZW91dCwgY29ubmVjdF9leCgpIHNob3VsZCByZXR1cm4gdGhlIG9yaWdpbmFsCisgICAgICAgICMgZXJybm8gKG1pbWlja2luZyB0aGUgYmVoYXZpb3VyIG9mIG5vbi1TU0wgc29ja2V0cykuCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldCgic3ZuLnB5dGhvbi5vcmciKToKKyAgICAgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9U1ZOX1BZVEhPTl9PUkdfUk9PVF9DRVJULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19oYW5kc2hha2Vfb25fY29ubmVjdD1GYWxzZSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzLnNldHRpbWVvdXQoMC4wMDAwMDAxKQorICAgICAgICAgICAgICAgIHJjID0gcy5jb25uZWN0X2V4KCgnc3ZuLnB5dGhvbi5vcmcnLCA0NDMpKQorICAgICAgICAgICAgICAgIGlmIHJjID09IDA6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoInN2bi5weXRob24ub3JnIHJlc3BvbmRlZCB0b28gcXVpY2tseSIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihyYywgKGVycm5vLkVBR0FJTiwgZXJybm8uRVdPVUxEQkxPQ0spKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2Nvbm5lY3RfZXhfZXJyb3Ioc2VsZik6CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldCgic3ZuLnB5dGhvbi5vcmciKToKKyAgICAgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9U1ZOX1BZVEhPTl9PUkdfUk9PVF9DRVJUKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJybm8uRUNPTk5SRUZVU0VELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jb25uZWN0X2V4KCgic3ZuLnB5dGhvbi5vcmciLCA0NDQpKSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcy5jbG9zZSgpCisKICAgICBAdW5pdHRlc3Quc2tpcElmKG9zLm5hbWUgPT0gIm50IiwgIkNhbid0IHVzZSBhIHNvY2tldCBhcyBhIGZpbGUgdW5kZXIgV2luZG93cyIpCiAgICAgZGVmIHRlc3RfbWFrZWZpbGVfY2xvc2Uoc2VsZik6CiAgICAgICAgICMgSXNzdWUgIzUyMzg6IGNyZWF0aW5nIGEgZmlsZS1saWtlIG9iamVjdCB3aXRoIG1ha2VmaWxlKCkgc2hvdWxkbid0CkBAIC0zMzEsMTkgKzM5NCwyNCBAQAogCiAgICAgZGVmIHRlc3RfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZShzZWxmKToKICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KCJzdm4ucHl0aG9uLm9yZyIpOgotICAgICAgICAgICAgcGVtID0gc3NsLmdldF9zZXJ2ZXJfY2VydGlmaWNhdGUoKCJzdm4ucHl0aG9uLm9yZyIsIDQ0MykpCisgICAgICAgICAgICBwZW0gPSBzc2wuZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZSgoInN2bi5weXRob24ub3JnIiwgNDQzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbC5QUk9UT0NPTF9TU0x2MjMpCiAgICAgICAgICAgICBpZiBub3QgcGVtOgogICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiTm8gc2VydmVyIGNlcnRpZmljYXRlIG9uIHN2bi5weXRob24ub3JnOjQ0MyEiKQogCiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcGVtID0gc3NsLmdldF9zZXJ2ZXJfY2VydGlmaWNhdGUoKCJzdm4ucHl0aG9uLm9yZyIsIDQ0MyksIGNhX2NlcnRzPUNFUlRGSUxFKQorICAgICAgICAgICAgICAgIHBlbSA9IHNzbC5nZXRfc2VydmVyX2NlcnRpZmljYXRlKCgic3ZuLnB5dGhvbi5vcmciLCA0NDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbC5QUk9UT0NPTF9TU0x2MjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9Q0VSVEZJTEUpCiAgICAgICAgICAgICBleGNlcHQgc3NsLlNTTEVycm9yOgogICAgICAgICAgICAgICAgICNzaG91bGQgZmFpbAogICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJHb3Qgc2VydmVyIGNlcnRpZmljYXRlICVzIGZvciBzdm4ucHl0aG9uLm9yZyEiICUgcGVtKQogCi0gICAgICAgICAgICBwZW0gPSBzc2wuZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZSgoInN2bi5weXRob24ub3JnIiwgNDQzKSwgY2FfY2VydHM9U1ZOX1BZVEhPTl9PUkdfUk9PVF9DRVJUKQorICAgICAgICAgICAgcGVtID0gc3NsLmdldF9zZXJ2ZXJfY2VydGlmaWNhdGUoKCJzdm4ucHl0aG9uLm9yZyIsIDQ0MyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2wuUFJPVE9DT0xfU1NMdjIzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9U1ZOX1BZVEhPTl9PUkdfUk9PVF9DRVJUKQogICAgICAgICAgICAgaWYgbm90IHBlbToKICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIk5vIHNlcnZlciBjZXJ0aWZpY2F0ZSBvbiBzdm4ucHl0aG9uLm9yZzo0NDMhIikKICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgpAQCAtMzU1LDcgKzQyMyw4IEBACiAgICAgICAgICMgU0hBMjU2IHdhcyBhZGRlZCBpbiBPcGVuU1NMIDAuOS44CiAgICAgICAgIGlmIHNzbC5PUEVOU1NMX1ZFUlNJT05fSU5GTyA8ICgwLCA5LCA4LCAwLCAxNSk6CiAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJTSEEyNTYgbm90IGF2YWlsYWJsZSBvbiAlciIgJSBzc2wuT1BFTlNTTF9WRVJTSU9OKQotICAgICAgICAjIE5PVEU6IGh0dHBzOi8vc2hhMjU2LnRicy1pbnRlcm5ldC5jb20gaXMgYW5vdGhlciBwb3NzaWJsZSB0ZXN0IGhvc3QKKyAgICAgICAgc2VsZi5za2lwVGVzdCgicmVtb3RlIGhvc3QgbmVlZHMgU05JLCBvbmx5IGF2YWlsYWJsZSBvbiBQeXRob24gMy4yKyIpCisgICAgICAgICMgTk9URTogaHR0cHM6Ly9zaGEyLmhib2Vjay5kZSBpcyBhbm90aGVyIHBvc3NpYmxlIHRlc3QgaG9zdAogICAgICAgICByZW1vdGUgPSAoInNoYTI1Ni50YnMtaW50ZXJuZXQuY29tIiwgNDQzKQogICAgICAgICBzaGEyNTZfY2VydCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAic2hhMjU2LnBlbSIpCiAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldCgic2hhMjU2LnRicy1pbnRlcm5ldC5jb20iKToKQEAgLTQxNywxMCArNDg2LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1zZWxmLnNlcnZlci5jYWNlcnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNlbGYuc2VydmVyLmNlcnRyZXFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVycz1zZWxmLnNlcnZlci5jaXBoZXJzKQotICAgICAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMRXJyb3I6CisgICAgICAgICAgICAgICAgZXhjZXB0IHNzbC5TU0xFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgICAjIFhYWCBWYXJpb3VzIGVycm9ycyBjYW4gaGF2ZSBoYXBwZW5lZCBoZXJlLCBmb3IgZXhhbXBsZQogICAgICAgICAgICAgICAgICAgICAjIGEgbWlzbWF0Y2hpbmcgcHJvdG9jb2wgdmVyc2lvbiwgYW4gaW52YWxpZCBjZXJ0aWZpY2F0ZSwKICAgICAgICAgICAgICAgICAgICAgIyBvciBhIGxvdy1sZXZlbCBidWcuIFRoaXMgc2hvdWxkIGJlIG1hZGUgbW9yZSBkaXNjcmltaW5hdGluZy4KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuY29ubl9lcnJvcnMuYXBwZW5kKGUpCiAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuc2VydmVyLmNoYXR0eToKICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV9lcnJvcigiXG4gc2VydmVyOiAgYmFkIGNvbm5lY3Rpb24gYXR0ZW1wdCBmcm9tICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cihzZWxmLnNvY2suZ2V0cGVlcm5hbWUoKSkgKyAiOlxuIikKQEAgLTUyOSw5ICs1OTksMTkgQEAKICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgnIHNlcnZlcjogIHdyYXBwZWQgc2VydmVyIHNvY2tldCBhcyAlc1xuJyAlIHN0cihzZWxmLnNvY2spKQogICAgICAgICAgICAgc2VsZi5wb3J0ID0gdGVzdF9zdXBwb3J0LmJpbmRfcG9ydChzZWxmLnNvY2spCiAgICAgICAgICAgICBzZWxmLmFjdGl2ZSA9IEZhbHNlCisgICAgICAgICAgICBzZWxmLmNvbm5fZXJyb3JzID0gW10KICAgICAgICAgICAgIHRocmVhZGluZy5UaHJlYWQuX19pbml0X18oc2VsZikKICAgICAgICAgICAgIHNlbGYuZGFlbW9uID0gVHJ1ZQogCisgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgICAgICBzZWxmLnN0YXJ0KHRocmVhZGluZy5FdmVudCgpKQorICAgICAgICAgICAgc2VsZi5mbGFnLndhaXQoKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgc2VsZi5zdG9wKCkKKyAgICAgICAgICAgIHNlbGYuam9pbigpCisKICAgICAgICAgZGVmIHN0YXJ0KHNlbGYsIGZsYWc9Tm9uZSk6CiAgICAgICAgICAgICBzZWxmLmZsYWcgPSBmbGFnCiAgICAgICAgICAgICB0aHJlYWRpbmcuVGhyZWFkLnN0YXJ0KHNlbGYpCkBAIC01NTEsNiArNjMxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHIoY29ubmFkZHIpICsgJ1xuJykKICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciA9IHNlbGYuQ29ubmVjdGlvbkhhbmRsZXIoc2VsZiwgbmV3Y29ubikKICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5zdGFydCgpCisgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuam9pbigpCiAgICAgICAgICAgICAgICAgZXhjZXB0IHNvY2tldC50aW1lb3V0OgogICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgpAQCAtNjM4LDYgKzcxOSwyMSBAQAogICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAgICAgIHJldHVybiAiPCVzICVzPiIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuc2VydmVyKQogCisgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgICAgICBzZWxmLnN0YXJ0KHRocmVhZGluZy5FdmVudCgpKQorICAgICAgICAgICAgc2VsZi5mbGFnLndhaXQoKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiIGNsZWFudXA6IHN0b3BwaW5nIHNlcnZlci5cbiIpCisgICAgICAgICAgICBzZWxmLnN0b3AoKQorICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiIGNsZWFudXA6IGpvaW5pbmcgc2VydmVyIHRocmVhZC5cbiIpCisgICAgICAgICAgICBzZWxmLmpvaW4oKQorICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiIGNsZWFudXA6IHN1Y2Nlc3NmdWxseSBqb2luZWQuXG4iKQorCiAgICAgICAgIGRlZiBzdGFydChzZWxmLCBmbGFnPU5vbmUpOgogICAgICAgICAgICAgc2VsZi5mbGFnID0gZmxhZwogICAgICAgICAgICAgdGhyZWFkaW5nLlRocmVhZC5zdGFydChzZWxmKQpAQCAtNzUyLDEyICs4NDgsNyBAQAogICAgICAgICBzZXJ2ZXIgPSBUaHJlYWRlZEVjaG9TZXJ2ZXIoQ0VSVEZJTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0cmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2VydHM9Q0VSVEZJTEUsIGNoYXR0eT1GYWxzZSkKLSAgICAgICAgZmxhZyA9IHRocmVhZGluZy5FdmVudCgpCi0gICAgICAgIHNlcnZlci5zdGFydChmbGFnKQotICAgICAgICAjIHdhaXQgZm9yIGl0IHRvIHN0YXJ0Ci0gICAgICAgIGZsYWcud2FpdCgpCi0gICAgICAgICMgdHJ5IHRvIGNvbm5lY3QKLSAgICAgICAgdHJ5OgorICAgICAgICB3aXRoIHNlcnZlcjoKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRmaWxlPWNlcnRmaWxlLApAQCAtNzcxLDkgKzg2Miw2IEBACiAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIlxuc29ja2V0LmVycm9yIGlzICVzXG4iICUgeFsxXSkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIlVzZSBvZiBpbnZhbGlkIGNlcnQgc2hvdWxkIGhhdmUgZmFpbGVkISIpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBzZXJ2ZXIuc3RvcCgpCi0gICAgICAgICAgICBzZXJ2ZXIuam9pbigpCiAKICAgICBkZWYgc2VydmVyX3BhcmFtc190ZXN0KGNlcnRmaWxlLCBwcm90b2NvbCwgY2VydHJlcXMsIGNhY2VydHNmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2NlcnRmaWxlLCBjbGllbnRfcHJvdG9jb2w9Tm9uZSwgaW5kYXRhPSJGT09cbiIsCkBAIC03OTEsMTQgKzg3OSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhdHR5PWNoYXR0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25jaGF0dHk9Y29ubmVjdGlvbmNoYXR0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBfYWNjZXB0aW5nX3NvY2tldD13cmFwX2FjY2VwdGluZ19zb2NrZXQpCi0gICAgICAgIGZsYWcgPSB0aHJlYWRpbmcuRXZlbnQoKQotICAgICAgICBzZXJ2ZXIuc3RhcnQoZmxhZykKLSAgICAgICAgIyB3YWl0IGZvciBpdCB0byBzdGFydAotICAgICAgICBmbGFnLndhaXQoKQotICAgICAgICAjIHRyeSB0byBjb25uZWN0Ci0gICAgICAgIGlmIGNsaWVudF9wcm90b2NvbCBpcyBOb25lOgotICAgICAgICAgICAgY2xpZW50X3Byb3RvY29sID0gcHJvdG9jb2wKLSAgICAgICAgdHJ5OgorICAgICAgICB3aXRoIHNlcnZlcjoKKyAgICAgICAgICAgICMgdHJ5IHRvIGNvbm5lY3QKKyAgICAgICAgICAgIGlmIGNsaWVudF9wcm90b2NvbCBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNsaWVudF9wcm90b2NvbCA9IHByb3RvY29sCiAgICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydGZpbGU9Y2xpZW50X2NlcnRmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1jYWNlcnRzZmlsZSwKQEAgLTgyNiw5ICs5MTAsNiBAQAogICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgogICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCIgY2xpZW50OiAgY2xvc2luZyBjb25uZWN0aW9uLlxuIikKICAgICAgICAgICAgIHMuY2xvc2UoKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgc2VydmVyLnN0b3AoKQotICAgICAgICAgICAgc2VydmVyLmpvaW4oKQogCiAgICAgZGVmIHRyeV9wcm90b2NvbF9jb21ibyhzZXJ2ZXJfcHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRfcHJvdG9jb2wsCkBAIC05MzAsMTIgKzEwMTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9TU0x2MjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjZXJ0cz1DRVJURklMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGF0dHk9RmFsc2UpCi0gICAgICAgICAgICBmbGFnID0gdGhyZWFkaW5nLkV2ZW50KCkKLSAgICAgICAgICAgIHNlcnZlci5zdGFydChmbGFnKQotICAgICAgICAgICAgIyB3YWl0IGZvciBpdCB0byBzdGFydAotICAgICAgICAgICAgZmxhZy53YWl0KCkKLSAgICAgICAgICAgICMgdHJ5IHRvIGNvbm5lY3QKLSAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggc2VydmVyOgogICAgICAgICAgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydGZpbGU9Q0VSVEZJTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1DRVJURklMRSwKQEAgLTk1Nyw5ICsxMDMzLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzaW5nIG9yIGludmFsaWQgJ29yZ2FuaXphdGlvbk5hbWUnIGZpZWxkIGluIGNlcnRpZmljYXRlIHN1YmplY3Q7ICIKICAgICAgICAgICAgICAgICAgICAgICAgICJzaG91bGQgYmUgJ1B5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uJy4iKQogICAgICAgICAgICAgICAgIHMuY2xvc2UoKQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBzZXJ2ZXIuc3RvcCgpCi0gICAgICAgICAgICAgICAgc2VydmVyLmpvaW4oKQogCiAgICAgICAgIGRlZiB0ZXN0X2VtcHR5X2NlcnQoc2VsZik6CiAgICAgICAgICAgICAiIiJDb25uZWN0aW5nIHdpdGggYW4gZW1wdHkgY2VydCBmaWxlIiIiCkBAIC05ODgsNyArMTA2MSw3IEBACiAgICAgICAgICAgICB0cnlfcHJvdG9jb2xfY29tYm8oc3NsLlBST1RPQ09MX1NTTHYyLCBzc2wuUFJPVE9DT0xfU1NMdjIsIFRydWUpCiAgICAgICAgICAgICB0cnlfcHJvdG9jb2xfY29tYm8oc3NsLlBST1RPQ09MX1NTTHYyLCBzc2wuUFJPVE9DT0xfU1NMdjIsIFRydWUsIHNzbC5DRVJUX09QVElPTkFMKQogICAgICAgICAgICAgdHJ5X3Byb3RvY29sX2NvbWJvKHNzbC5QUk9UT0NPTF9TU0x2Miwgc3NsLlBST1RPQ09MX1NTTHYyLCBUcnVlLCBzc2wuQ0VSVF9SRVFVSVJFRCkKLSAgICAgICAgICAgIHRyeV9wcm90b2NvbF9jb21ibyhzc2wuUFJPVE9DT0xfU1NMdjIsIHNzbC5QUk9UT0NPTF9TU0x2MjMsIFRydWUpCisgICAgICAgICAgICB0cnlfcHJvdG9jb2xfY29tYm8oc3NsLlBST1RPQ09MX1NTTHYyLCBzc2wuUFJPVE9DT0xfU1NMdjIzLCBGYWxzZSkKICAgICAgICAgICAgIHRyeV9wcm90b2NvbF9jb21ibyhzc2wuUFJPVE9DT0xfU1NMdjIsIHNzbC5QUk9UT0NPTF9TU0x2MywgRmFsc2UpCiAgICAgICAgICAgICB0cnlfcHJvdG9jb2xfY29tYm8oc3NsLlBST1RPQ09MX1NTTHYyLCBzc2wuUFJPVE9DT0xfVExTdjEsIEZhbHNlKQogCkBAIC0xMDQyLDEzICsxMTE1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydHRsc19zZXJ2ZXI9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGF0dHk9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uY2hhdHR5PVRydWUpCi0gICAgICAgICAgICBmbGFnID0gdGhyZWFkaW5nLkV2ZW50KCkKLSAgICAgICAgICAgIHNlcnZlci5zdGFydChmbGFnKQotICAgICAgICAgICAgIyB3YWl0IGZvciBpdCB0byBzdGFydAotICAgICAgICAgICAgZmxhZy53YWl0KCkKLSAgICAgICAgICAgICMgdHJ5IHRvIGNvbm5lY3QKICAgICAgICAgICAgIHdyYXBwZWQgPSBGYWxzZQotICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBzZXJ2ZXI6CiAgICAgICAgICAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoKQogICAgICAgICAgICAgICAgIHMuc2V0YmxvY2tpbmcoMSkKICAgICAgICAgICAgICAgICBzLmNvbm5lY3QoKEhPU1QsIHNlcnZlci5wb3J0KSkKQEAgLTEwOTMsOSArMTE2MSw2IEBACiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgcy5zZW5kKCJvdmVyXG4iKQogICAgICAgICAgICAgICAgIHMuY2xvc2UoKQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBzZXJ2ZXIuc3RvcCgpCi0gICAgICAgICAgICAgICAgc2VydmVyLmpvaW4oKQogCiAgICAgICAgIGRlZiB0ZXN0X3NvY2tldHNlcnZlcihzZWxmKToKICAgICAgICAgICAgICIiIlVzaW5nIGEgU29ja2V0U2VydmVyIHRvIGNyZWF0ZSBhbmQgbWFuYWdlIFNTTCBjb25uZWN0aW9ucy4iIiIKQEAgLTExNDUsMTIgKzEyMTAsNyBAQAogICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CiAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG4iKQogICAgICAgICAgICAgc2VydmVyID0gQXN5bmNvcmVFY2hvU2VydmVyKENFUlRGSUxFKQotICAgICAgICAgICAgZmxhZyA9IHRocmVhZGluZy5FdmVudCgpCi0gICAgICAgICAgICBzZXJ2ZXIuc3RhcnQoZmxhZykKLSAgICAgICAgICAgICMgd2FpdCBmb3IgaXQgdG8gc3RhcnQKLSAgICAgICAgICAgIGZsYWcud2FpdCgpCi0gICAgICAgICAgICAjIHRyeSB0byBjb25uZWN0Ci0gICAgICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIHNlcnZlcjoKICAgICAgICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoKSkKICAgICAgICAgICAgICAgICBzLmNvbm5lY3QoKCcxMjcuMC4wLjEnLCBzZXJ2ZXIucG9ydCkpCiAgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CkBAIC0xMTY5LDEwICsxMjI5LDYgQEAKICAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiIGNsaWVudDogIGNsb3NpbmcgY29ubmVjdGlvbi5cbiIpCiAgICAgICAgICAgICAgICAgcy5jbG9zZSgpCi0gICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgIHNlcnZlci5zdG9wKCkKLSAgICAgICAgICAgICAgICAjIHdhaXQgZm9yIHNlcnZlciB0aHJlYWQgdG8gZW5kCi0gICAgICAgICAgICAgICAgc2VydmVyLmpvaW4oKQogCiAgICAgICAgIGRlZiB0ZXN0X3JlY3Zfc2VuZChzZWxmKToKICAgICAgICAgICAgICIiIlRlc3QgcmVjdigpLCBzZW5kKCkgYW5kIGZyaWVuZHMuIiIiCkBAIC0xMTg1LDE5ICsxMjQxLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjZXJ0cz1DRVJURklMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGF0dHk9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uY2hhdHR5PUZhbHNlKQotICAgICAgICAgICAgZmxhZyA9IHRocmVhZGluZy5FdmVudCgpCi0gICAgICAgICAgICBzZXJ2ZXIuc3RhcnQoZmxhZykKLSAgICAgICAgICAgICMgd2FpdCBmb3IgaXQgdG8gc3RhcnQKLSAgICAgICAgICAgIGZsYWcud2FpdCgpCi0gICAgICAgICAgICAjIHRyeSB0byBjb25uZWN0Ci0gICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX3NpZGU9RmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRmaWxlPUNFUlRGSUxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1DRVJURklMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9UTFN2MSkKLSAgICAgICAgICAgIHMuY29ubmVjdCgoSE9TVCwgc2VydmVyLnBvcnQpKQotICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBzZXJ2ZXI6CisgICAgICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfc2lkZT1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRmaWxlPUNFUlRGSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9Q0VSVEZJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9UTFN2MSkKKyAgICAgICAgICAgICAgICBzLmNvbm5lY3QoKEhPU1QsIHNlcnZlci5wb3J0KSkKICAgICAgICAgICAgICAgICAjIGhlbHBlciBtZXRob2RzIGZvciBzdGFuZGFyZGlzaW5nIHJlY3YqIG1ldGhvZCBzaWduYXR1cmVzCiAgICAgICAgICAgICAgICAgZGVmIF9yZWN2X2ludG8oKToKICAgICAgICAgICAgICAgICAgICAgYiA9IGJ5dGVhcnJheSgiXDAiKjEwMCkKQEAgLTEyODUsOSArMTMzNiw2IEBACiAKICAgICAgICAgICAgICAgICBzLndyaXRlKCJvdmVyXG4iLmVuY29kZSgiQVNDSUkiLCAic3RyaWN0IikpCiAgICAgICAgICAgICAgICAgcy5jbG9zZSgpCi0gICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgIHNlcnZlci5zdG9wKCkKLSAgICAgICAgICAgICAgICBzZXJ2ZXIuam9pbigpCiAKICAgICAgICAgZGVmIHRlc3RfaGFuZHNoYWtlX3RpbWVvdXQoc2VsZik6CiAgICAgICAgICAgICAjIElzc3VlICM1MTAzOiBTU0wgaGFuZHNoYWtlIG11c3QgcmVzcGVjdCB0aGUgc29ja2V0IHRpbWVvdXQKQEAgLTEzMzYsOSArMTM4NCwyOCBAQAogICAgICAgICAgICAgICAgIHQuam9pbigpCiAgICAgICAgICAgICAgICAgc2VydmVyLmNsb3NlKCkKIAorICAgICAgICBkZWYgdGVzdF9kZWZhdWx0X2NpcGhlcnMoc2VsZik6CisgICAgICAgICAgICB3aXRoIFRocmVhZGVkRWNob1NlcnZlcihDRVJURklMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9TU0x2MjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGF0dHk9RmFsc2UpIGFzIHNlcnZlcjoKKyAgICAgICAgICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldCgpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAjIEZvcmNlIGEgc2V0IG9mIHdlYWsgY2lwaGVycyBvbiBvdXIgY2xpZW50IHNvY2tldAorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9TU0x2MjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpcGhlcnM9IkRFUyIpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJubyBERVMgY2lwaGVyIGF2YWlsYWJsZSIpCisgICAgICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoKE9TRXJyb3IsIHNzbC5TU0xFcnJvcikpOgorICAgICAgICAgICAgICAgICAgICAgICAgcy5jb25uZWN0KChIT1NULCBzZXJ2ZXIucG9ydCkpCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgc29jay5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJubyBzaGFyZWQgY2lwaGVyIiwgc3RyKHNlcnZlci5jb25uX2Vycm9yc1swXSkpCisKIAogZGVmIHRlc3RfbWFpbih2ZXJib3NlPUZhbHNlKToKLSAgICBnbG9iYWwgQ0VSVEZJTEUsIFNWTl9QWVRIT05fT1JHX1JPT1RfQ0VSVCwgTk9LSUFDRVJUCisgICAgZ2xvYmFsIENFUlRGSUxFLCBTVk5fUFlUSE9OX09SR19ST09UX0NFUlQsIE5PS0lBQ0VSVCwgTlVMTEJZVEVDRVJUCiAgICAgQ0VSVEZJTEUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSBvciBvcy5jdXJkaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImtleWNlcnQucGVtIikKICAgICBTVk5fUFlUSE9OX09SR19ST09UX0NFUlQgPSBvcy5wYXRoLmpvaW4oCkBAIC0xMzQ2LDEwICsxNDEzLDEzIEBACiAgICAgICAgICJodHRwc19zdm5fcHl0aG9uX29yZ19yb290LnBlbSIpCiAgICAgTk9LSUFDRVJUID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykgb3Igb3MuY3VyZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9raWEucGVtIikKKyAgICBOVUxMQllURUNFUlQgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSBvciBvcy5jdXJkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJudWxsYnl0ZWNlcnQucGVtIikKIAogICAgIGlmIChub3Qgb3MucGF0aC5leGlzdHMoQ0VSVEZJTEUpIG9yCiAgICAgICAgIG5vdCBvcy5wYXRoLmV4aXN0cyhTVk5fUFlUSE9OX09SR19ST09UX0NFUlQpIG9yCi0gICAgICAgIG5vdCBvcy5wYXRoLmV4aXN0cyhOT0tJQUNFUlQpKToKKyAgICAgICAgbm90IG9zLnBhdGguZXhpc3RzKE5PS0lBQ0VSVCkgb3IKKyAgICAgICAgbm90IG9zLnBhdGguZXhpc3RzKE5VTExCWVRFQ0VSVCkpOgogICAgICAgICByYWlzZSB0ZXN0X3N1cHBvcnQuVGVzdEZhaWxlZCgiQ2FuJ3QgcmVhZCBjZXJ0aWZpY2F0ZSBmaWxlcyEiKQogCiAgICAgdGVzdHMgPSBbQmFzaWNUZXN0cywgQmFzaWNTb2NrZXRUZXN0c10KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3RhdC5weSBiL0xpYi90ZXN0L3Rlc3Rfc3RhdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzFmNTk5Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9zdGF0LnB5CkBAIC0wLDAgKzEsMTc1IEBACitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBvcworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCBydW5fdW5pdHRlc3QKK2ltcG9ydCBzdGF0CisKK2NsYXNzIFRlc3RGaWxlbW9kZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZmlsZV9mbGFncyA9IHsnU0ZfQVBQRU5EJywgJ1NGX0FSQ0hJVkVEJywgJ1NGX0lNTVVUQUJMRScsICdTRl9OT1VOTElOSycsCisgICAgICAgICAgICAgICAgICAnU0ZfU05BUFNIT1QnLCAnVUZfQVBQRU5EJywgJ1VGX0NPTVBSRVNTRUQnLCAnVUZfSElEREVOJywKKyAgICAgICAgICAgICAgICAgICdVRl9JTU1VVEFCTEUnLCAnVUZfTk9EVU1QJywgJ1VGX05PVU5MSU5LJywgJ1VGX09QQVFVRSd9CisKKyAgICBmb3JtYXRzID0geydTX0lGQkxLJywgJ1NfSUZDSFInLCAnU19JRkRJUicsICdTX0lGSUZPJywgJ1NfSUZMTksnLAorICAgICAgICAgICAgICAgJ1NfSUZSRUcnLCAnU19JRlNPQ0snfQorCisgICAgZm9ybWF0X2Z1bmNzID0geydTX0lTQkxLJywgJ1NfSVNDSFInLCAnU19JU0RJUicsICdTX0lTRklGTycsICdTX0lTTE5LJywKKyAgICAgICAgICAgICAgICAgICAgJ1NfSVNSRUcnLCAnU19JU1NPQ0snfQorCisgICAgc3RhdF9zdHJ1Y3QgPSB7CisgICAgICAgICdTVF9NT0RFJzogMCwKKyAgICAgICAgJ1NUX0lOTyc6IDEsCisgICAgICAgICdTVF9ERVYnOiAyLAorICAgICAgICAnU1RfTkxJTksnOiAzLAorICAgICAgICAnU1RfVUlEJzogNCwKKyAgICAgICAgJ1NUX0dJRCc6IDUsCisgICAgICAgICdTVF9TSVpFJzogNiwKKyAgICAgICAgJ1NUX0FUSU1FJzogNywKKyAgICAgICAgJ1NUX01USU1FJzogOCwKKyAgICAgICAgJ1NUX0NUSU1FJzogOX0KKworICAgICMgcGVybWlzc2lvbiBiaXQgdmFsdWUgYXJlIGRlZmluZWQgYnkgUE9TSVgKKyAgICBwZXJtaXNzaW9uX2JpdHMgPSB7CisgICAgICAgICdTX0lTVUlEJzogMG80MDAwLAorICAgICAgICAnU19JU0dJRCc6IDBvMjAwMCwKKyAgICAgICAgJ1NfRU5GTVQnOiAwbzIwMDAsCisgICAgICAgICdTX0lTVlRYJzogMG8xMDAwLAorICAgICAgICAnU19JUldYVSc6IDBvNzAwLAorICAgICAgICAnU19JUlVTUic6IDBvNDAwLAorICAgICAgICAnU19JUkVBRCc6IDBvNDAwLAorICAgICAgICAnU19JV1VTUic6IDBvMjAwLAorICAgICAgICAnU19JV1JJVEUnOiAwbzIwMCwKKyAgICAgICAgJ1NfSVhVU1InOiAwbzEwMCwKKyAgICAgICAgJ1NfSUVYRUMnOiAwbzEwMCwKKyAgICAgICAgJ1NfSVJXWEcnOiAwbzA3MCwKKyAgICAgICAgJ1NfSVJHUlAnOiAwbzA0MCwKKyAgICAgICAgJ1NfSVdHUlAnOiAwbzAyMCwKKyAgICAgICAgJ1NfSVhHUlAnOiAwbzAxMCwKKyAgICAgICAgJ1NfSVJXWE8nOiAwbzAwNywKKyAgICAgICAgJ1NfSVJPVEgnOiAwbzAwNCwKKyAgICAgICAgJ1NfSVdPVEgnOiAwbzAwMiwKKyAgICAgICAgJ1NfSVhPVEgnOiAwbzAwMX0KKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MucmVtb3ZlKFRFU1RGTikKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3Mucm1kaXIoVEVTVEZOKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgIHRlYXJEb3duID0gc2V0VXAKKworICAgIGRlZiBnZXRfbW9kZShzZWxmLCBmbmFtZT1URVNURk4sIGxzdGF0PVRydWUpOgorICAgICAgICBpZiBsc3RhdDoKKyAgICAgICAgICAgIHN0X21vZGUgPSBvcy5sc3RhdChmbmFtZSkuc3RfbW9kZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RfbW9kZSA9IG9zLnN0YXQoZm5hbWUpLnN0X21vZGUKKyAgICAgICAgcmV0dXJuIHN0X21vZGUKKworICAgIGRlZiBhc3NlcnRTX0lTKHNlbGYsIG5hbWUsIG1vZGUpOgorICAgICAgICAjIHRlc3QgZm9ybWF0LCBsc3RyaXAgaXMgZm9yIFNfSUZJRk8KKyAgICAgICAgZm10ID0gZ2V0YXR0cihzdGF0LCAiU19JRiIgKyBuYW1lLmxzdHJpcCgiRiIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXQuU19JRk1UKG1vZGUpLCBmbXQpCisgICAgICAgICMgdGVzdCB0aGF0IGp1c3Qgb25lIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZQorICAgICAgICB0ZXN0bmFtZSA9ICJTX0lTIiArIG5hbWUKKyAgICAgICAgZm9yIGZ1bmNuYW1lIGluIHNlbGYuZm9ybWF0X2Z1bmNzOgorICAgICAgICAgICAgZnVuYyA9IGdldGF0dHIoc3RhdCwgZnVuY25hbWUsIE5vbmUpCisgICAgICAgICAgICBpZiBmdW5jIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgaWYgZnVuY25hbWUgPT0gdGVzdG5hbWU6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZnVuY25hbWUpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGZ1bmNuYW1lID09IHRlc3RuYW1lOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmdW5jKG1vZGUpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGZ1bmMobW9kZSkpCisKKyAgICBkZWYgdGVzdF9tb2RlKHNlbGYpOgorICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAndycpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6CisgICAgICAgICAgICBvcy5jaG1vZChURVNURk4sIDBvNzAwKQorICAgICAgICAgICAgc3RfbW9kZSA9IHNlbGYuZ2V0X21vZGUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRTX0lTKCJSRUciLCBzdF9tb2RlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0LlNfSU1PREUoc3RfbW9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXQuU19JUldYVSkKKworICAgICAgICAgICAgb3MuY2htb2QoVEVTVEZOLCAwbzA3MCkKKyAgICAgICAgICAgIHN0X21vZGUgPSBzZWxmLmdldF9tb2RlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0U19JUygiUkVHIiwgc3RfbW9kZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdC5TX0lNT0RFKHN0X21vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0LlNfSVJXWEcpCisKKyAgICAgICAgICAgIG9zLmNobW9kKFRFU1RGTiwgMG8wMDcpCisgICAgICAgICAgICBzdF9tb2RlID0gc2VsZi5nZXRfbW9kZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFNfSVMoIlJFRyIsIHN0X21vZGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXQuU19JTU9ERShzdF9tb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdC5TX0lSV1hPKQorCisgICAgICAgICAgICBvcy5jaG1vZChURVNURk4sIDBvNDQ0KQorICAgICAgICAgICAgc3RfbW9kZSA9IHNlbGYuZ2V0X21vZGUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRTX0lTKCJSRUciLCBzdF9tb2RlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0LlNfSU1PREUoc3RfbW9kZSksIDBvNDQ0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3MuY2htb2QoVEVTVEZOLCAwbzcwMCkKKyAgICAgICAgICAgIHN0X21vZGUgPSBzZWxmLmdldF9tb2RlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0U19JUygiUkVHIiwgc3RfbW9kZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdC5TX0lGTVQoc3RfbW9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXQuU19JRlJFRykKKworICAgIGRlZiB0ZXN0X2RpcmVjdG9yeShzZWxmKToKKyAgICAgICAgb3MubWtkaXIoVEVTVEZOKQorICAgICAgICBvcy5jaG1vZChURVNURk4sIDBvNzAwKQorICAgICAgICBzdF9tb2RlID0gc2VsZi5nZXRfbW9kZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0U19JUygiRElSIiwgc3RfbW9kZSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdzeW1saW5rJyksICdvcy5zeW1saW5rIG5vdCBhdmFpbGFibGUnKQorICAgIGRlZiB0ZXN0X2xpbmsoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnN5bWxpbmsob3MuZ2V0Y3dkKCksIFRFU1RGTikKKyAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBOb3RJbXBsZW1lbnRlZEVycm9yKSBhcyBlcnI6CisgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdChzdHIoZXJyKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN0X21vZGUgPSBzZWxmLmdldF9tb2RlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0U19JUygiTE5LIiwgc3RfbW9kZSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdta2ZpZm8nKSwgJ29zLm1rZmlmbyBub3QgYXZhaWxhYmxlJykKKyAgICBkZWYgdGVzdF9maWZvKHNlbGYpOgorICAgICAgICBvcy5ta2ZpZm8oVEVTVEZOLCAwbzcwMCkKKyAgICAgICAgc3RfbW9kZSA9IHNlbGYuZ2V0X21vZGUoKQorICAgICAgICBzZWxmLmFzc2VydFNfSVMoIkZJRk8iLCBzdF9tb2RlKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Mob3MubmFtZSA9PSAncG9zaXgnLCAncmVxdWlyZXMgUG9zaXgnKQorICAgIGRlZiB0ZXN0X2RldmljZXMoc2VsZik6CisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLmRldm51bGwpOgorICAgICAgICAgICAgc3RfbW9kZSA9IHNlbGYuZ2V0X21vZGUob3MuZGV2bnVsbCwgbHN0YXQ9RmFsc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydFNfSVMoIkNIUiIsIHN0X21vZGUpCisgICAgICAgICMgTGludXggYmxvY2sgZGV2aWNlcywgQlNEIGhhcyBubyBibG9jayBkZXZpY2VzIGFueW1vcmUKKyAgICAgICAgZm9yIGJsb2NrZGV2IGluICgiL2Rldi9zZGEiLCAiL2Rldi9oZGEiKToKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGJsb2NrZGV2KToKKyAgICAgICAgICAgICAgICBzdF9tb2RlID0gc2VsZi5nZXRfbW9kZShibG9ja2RldiwgbHN0YXQ9RmFsc2UpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRTX0lTKCJCTEsiLCBzdF9tb2RlKQorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICBkZWYgdGVzdF9tb2R1bGVfYXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5zdGF0X3N0cnVjdC5pdGVtcygpOgorICAgICAgICAgICAgbW9kdmFsdWUgPSBnZXRhdHRyKHN0YXQsIGtleSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWUsIG1vZHZhbHVlLCBrZXkpCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYucGVybWlzc2lvbl9iaXRzLml0ZW1zKCk6CisgICAgICAgICAgICBtb2R2YWx1ZSA9IGdldGF0dHIoc3RhdCwga2V5KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZSwgbW9kdmFsdWUsIGtleSkKKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLmZpbGVfZmxhZ3M6CisgICAgICAgICAgICBtb2R2YWx1ZSA9IGdldGF0dHIoc3RhdCwga2V5KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1vZHZhbHVlLCBpbnQpCisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5mb3JtYXRzOgorICAgICAgICAgICAgbW9kdmFsdWUgPSBnZXRhdHRyKHN0YXQsIGtleSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtb2R2YWx1ZSwgaW50KQorICAgICAgICBmb3Iga2V5IGluIHNlbGYuZm9ybWF0X2Z1bmNzOgorICAgICAgICAgICAgZnVuYyA9IGdldGF0dHIoc3RhdCwga2V5KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNhbGxhYmxlKGZ1bmMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKDApLCAwKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoVGVzdEZpbGVtb2RlKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N0ci5weSBiL0xpYi90ZXN0L3Rlc3Rfc3RyLnB5CmluZGV4IDJlY2YzMjcuLjJjZDc5NjYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3RyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3RyLnB5CkBAIC0xLDQgKzEsNCBAQAotCitpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBzdHJ1Y3QKIGltcG9ydCBzeXMKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0LCBzdHJpbmdfdGVzdHMKQEAgLTM1LDYgKzM1LDE4IEBACiAgICAgICAgIHN0cmluZ190ZXN0cy5NaXhpblN0clVuaWNvZGVVc2VyU3RyaW5nVGVzdC50ZXN0X2Zvcm1hdHRpbmcoc2VsZikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgJyVjJy5fX21vZF9fLCAweDEyMzQpCiAKKyAgICBAdGVzdF9zdXBwb3J0LmNweXRob25fb25seQorICAgIGRlZiB0ZXN0X2Zvcm1hdHRpbmdfaHVnZV9wcmVjaXNpb24oc2VsZik6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBJTlRfTUFYCisgICAgICAgIGZvcm1hdF9zdHJpbmcgPSAiJS57fWYiLmZvcm1hdChJTlRfTUFYICsgMSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIHJlc3VsdCA9IGZvcm1hdF9zdHJpbmcgJSAyLjM0CisKKyAgICBkZWYgdGVzdF9mb3JtYXR0aW5nX2h1Z2Vfd2lkdGgoc2VsZik6CisgICAgICAgIGZvcm1hdF9zdHJpbmcgPSAiJXt9ZiIuZm9ybWF0KHN5cy5tYXhzaXplICsgMSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIHJlc3VsdCA9IGZvcm1hdF9zdHJpbmcgJSAyLjM0CisKICAgICBkZWYgdGVzdF9jb252ZXJzaW9uKHNlbGYpOgogICAgICAgICAjIE1ha2Ugc3VyZSBfX3N0cl9fKCkgYmVoYXZlcyBwcm9wZXJseQogICAgICAgICBjbGFzcyBGb28wOgpAQCAtOTgsMTIgKzExMCwxMiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihGb285KCJmb28iKSksICJzdHJpbmciKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoRm9vOSgiZm9vIikpLCB1Im5vdCB1bmljb2RlIikKIAorICAgICMgVGhpcyB0ZXN0IG9ubHkgYWZmZWN0cyAzMi1iaXQgcGxhdGZvcm1zIGJlY2F1c2UgZXhwYW5kdGFicyBjYW4gb25seSB0YWtlCisgICAgIyBhbiBpbnQgYXMgdGhlIG1heCB2YWx1ZSwgbm90IGEgNjQtYml0IEMgbG9uZy4gIElmIGV4cGFuZHRhYnMgaXMgY2hhbmdlZAorICAgICMgdG8gdGFrZSBhIDY0LWJpdCBsb25nLCB0aGlzIHRlc3Qgc2hvdWxkIGFwcGx5IHRvIGFsbCBwbGF0Zm9ybXMuCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMubWF4aW50ID4gKDEgPDwgMzIpIG9yIHN0cnVjdC5jYWxjc2l6ZSgnUCcpICE9IDQsCisgICAgICAgICAgICAgICAgICAgICAnb25seSBhcHBsaWVzIHRvIDMyLWJpdCBwbGF0Zm9ybXMnKQogICAgIGRlZiB0ZXN0X2V4cGFuZHRhYnNfb3ZlcmZsb3dzX2dyYWNlZnVsbHkoc2VsZik6Ci0gICAgICAgICMgVGhpcyB0ZXN0IG9ubHkgYWZmZWN0cyAzMi1iaXQgcGxhdGZvcm1zIGJlY2F1c2UgZXhwYW5kdGFicyBjYW4gb25seSB0YWtlCi0gICAgICAgICMgYW4gaW50IGFzIHRoZSBtYXggdmFsdWUsIG5vdCBhIDY0LWJpdCBDIGxvbmcuICBJZiBleHBhbmR0YWJzIGlzIGNoYW5nZWQKLSAgICAgICAgIyB0byB0YWtlIGEgNjQtYml0IGxvbmcsIHRoaXMgdGVzdCBzaG91bGQgYXBwbHkgdG8gYWxsIHBsYXRmb3Jtcy4KLSAgICAgICAgaWYgc3lzLm1heGludCA+ICgxIDw8IDMyKSBvciBzdHJ1Y3QuY2FsY3NpemUoJ1AnKSAhPSA0OgotICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsICd0XHR0XHQnLmV4cGFuZHRhYnMsIHN5cy5tYXhpbnQpCiAKICAgICBkZWYgdGVzdF9fZm9ybWF0X18oc2VsZik6CkBAIC0zNzEsNiArMzgzLDIxIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZvcm1hdCwgIiIsICItIikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgInswOj1zfSIuZm9ybWF0LCAnJykKIAorICAgIGRlZiB0ZXN0X2Zvcm1hdF9odWdlX3ByZWNpc2lvbihzZWxmKToKKyAgICAgICAgZm9ybWF0X3N0cmluZyA9ICIue31mIi5mb3JtYXQoc3lzLm1heHNpemUgKyAxKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgcmVzdWx0ID0gZm9ybWF0KDIuMzQsIGZvcm1hdF9zdHJpbmcpCisKKyAgICBkZWYgdGVzdF9mb3JtYXRfaHVnZV93aWR0aChzZWxmKToKKyAgICAgICAgZm9ybWF0X3N0cmluZyA9ICJ7fWYiLmZvcm1hdChzeXMubWF4c2l6ZSArIDEpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICByZXN1bHQgPSBmb3JtYXQoMi4zNCwgZm9ybWF0X3N0cmluZykKKworICAgIGRlZiB0ZXN0X2Zvcm1hdF9odWdlX2l0ZW1fbnVtYmVyKHNlbGYpOgorICAgICAgICBmb3JtYXRfc3RyaW5nID0gInt7e306LjZmfX0iLmZvcm1hdChzeXMubWF4c2l6ZSArIDEpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICByZXN1bHQgPSBmb3JtYXRfc3RyaW5nLmZvcm1hdCgyLjM0KQorCiAgICAgZGVmIHRlc3RfZm9ybWF0X2F1dG9fbnVtYmVyaW5nKHNlbGYpOgogICAgICAgICBjbGFzcyBDOgogICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHg9MTAwKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3Ryb3AucHkgYi9MaWIvdGVzdC90ZXN0X3N0cm9wLnB5CmluZGV4IDhjZTI5ZWYuLjQ1YzkwYTYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3Ryb3AucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zdHJvcC5weQpAQCAtNCw2ICs0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHIndGVzdC50ZXN0X3N0cm9wfHVuaXR0ZXN0JykKIGltcG9ydCBzdHJvcAogaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3lzCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogCiAKQEAgLTExNSw2ICsxMTYsMTEgQEAKICAgICAgICAgc3Ryb3AudXBwZXJjYXNlCiAgICAgICAgIHN0cm9wLndoaXRlc3BhY2UKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5tYXhzaXplID09IDIxNDc0ODM2NDcsICJvbmx5IGZvciAzMi1iaXQiKQorICAgIGRlZiB0ZXN0X2V4cGFuZHRhYnNfb3ZlcmZsb3coc2VsZik6CisgICAgICAgIHMgPSAnXHRcbicgKiAweDEwMDAwICsgJ0EnICogMHgxMDAwMDAwCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHN0cm9wLmV4cGFuZHRhYnMsIHMsIDB4MTAwMDEpCisKICAgICBAdGVzdF9zdXBwb3J0LnByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT10ZXN0X3N1cHBvcnQuXzJHIC0gMSwgbWVtdXNlPTUpCiAgICAgZGVmIHRlc3Rfc3Ryb3Bqb2luX2h1Z2VfbGlzdChzZWxmLCBzaXplKToKICAgICAgICAgYSA9ICJBIiAqIHNpemUKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3RycHRpbWUucHkgYi9MaWIvdGVzdC90ZXN0X3N0cnB0aW1lLnB5CmluZGV4IDYzNzYwYzMuLjY2YjlhYjMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3RycHRpbWUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zdHJwdGltZS5weQpAQCAtMzgsOSArMzgsOSBAQAogICAgICAgICBjb21wYXJpc29uID0gdGVzdGluZ1tzZWxmLnRpbWVfdHVwbGVbdHVwbGVfcG9zaXRpb25dXQogICAgICAgICBzZWxmLmFzc2VydEluKHN0cmZ0aW1lX291dHB1dCwgdGVzdGluZywKICAgICAgICAgICAgICAgICAgICAgICAiJXM6IG5vdCBmb3VuZCBpbiB0dXBsZSIgJSBlcnJvcl9tc2cpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb21wYXJpc29uID09IHN0cmZ0aW1lX291dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICIlczogcG9zaXRpb24gd2l0aGluIHR1cGxlIGluY29ycmVjdDsgJXMgIT0gJXMiICUKLSAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcl9tc2csIGNvbXBhcmlzb24sIHN0cmZ0aW1lX291dHB1dCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGFyaXNvbiwgc3RyZnRpbWVfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICIlczogcG9zaXRpb24gd2l0aGluIHR1cGxlIGluY29ycmVjdDsgJXMgIT0gJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3JfbXNnLCBjb21wYXJpc29uLCBzdHJmdGltZV9vdXRwdXQpKQogCiAgICAgZGVmIHRlc3Rfd2Vla2RheShzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCBmdWxsIGFuZCBhYmJyZXZpYXRlZCB3ZWVrZGF5IG5hbWVzIGFyZSBjb3JyZWN0IGluCkBAIC02NSw4ICs2NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgIkFNL1BNIHJlcHJlc2VudGF0aW9uIG5vdCBpbiB0dXBsZSIpCiAgICAgICAgIGlmIHNlbGYudGltZV90dXBsZVszXSA8IDEyOiBwb3NpdGlvbiA9IDAKICAgICAgICAgZWxzZTogcG9zaXRpb24gPSAxCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJmdGltZV9vdXRwdXQgPT0gc2VsZi5MVF9pbnMuYW1fcG1bcG9zaXRpb25dLAotICAgICAgICAgICAgICAgICAgICAgICAgIkFNL1BNIHJlcHJlc2VudGF0aW9uIGluIHRoZSB3cm9uZyBwb3NpdGlvbiB3aXRoaW4gdGhlIHR1cGxlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLkxUX2lucy5hbV9wbVtwb3NpdGlvbl0sIHN0cmZ0aW1lX291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiQU0vUE0gcmVwcmVzZW50YXRpb24gaW4gdGhlIHdyb25nIHBvc2l0aW9uIHdpdGhpbiB0aGUgdHVwbGUiKQogCiAgICAgZGVmIHRlc3RfdGltZXpvbmUoc2VsZik6CiAgICAgICAgICMgTWFrZSBzdXJlIHRpbWV6b25lIGlzIGNvcnJlY3QKQEAgLTg2LDE3ICs4NiwxNCBAQAogICAgICAgICAjICBvdXRwdXQuCiAgICAgICAgIG1hZ2ljX2RhdGUgPSAoMTk5OSwgMywgMTcsIDIyLCA0NCwgNTUsIDIsIDc2LCAwKQogICAgICAgICBzdHJmdGltZV9vdXRwdXQgPSB0aW1lLnN0cmZ0aW1lKCIlYyIsIG1hZ2ljX2RhdGUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJmdGltZV9vdXRwdXQgPT0gdGltZS5zdHJmdGltZShzZWxmLkxUX2lucy5MQ19kYXRlX3RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWdpY19kYXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJMQ19kYXRlX3RpbWUgaW5jb3JyZWN0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lLnN0cmZ0aW1lKHNlbGYuTFRfaW5zLkxDX2RhdGVfdGltZSwgbWFnaWNfZGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZnRpbWVfb3V0cHV0LCAiTENfZGF0ZV90aW1lIGluY29ycmVjdCIpCiAgICAgICAgIHN0cmZ0aW1lX291dHB1dCA9IHRpbWUuc3RyZnRpbWUoIiV4IiwgbWFnaWNfZGF0ZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cmZ0aW1lX291dHB1dCA9PSB0aW1lLnN0cmZ0aW1lKHNlbGYuTFRfaW5zLkxDX2RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWdpY19kYXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJMQ19kYXRlIGluY29ycmVjdCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZS5zdHJmdGltZShzZWxmLkxUX2lucy5MQ19kYXRlLCBtYWdpY19kYXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJmdGltZV9vdXRwdXQsICJMQ19kYXRlIGluY29ycmVjdCIpCiAgICAgICAgIHN0cmZ0aW1lX291dHB1dCA9IHRpbWUuc3RyZnRpbWUoIiVYIiwgbWFnaWNfZGF0ZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cmZ0aW1lX291dHB1dCA9PSB0aW1lLnN0cmZ0aW1lKHNlbGYuTFRfaW5zLkxDX3RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWdpY19kYXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJMQ190aW1lIGluY29ycmVjdCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZS5zdHJmdGltZShzZWxmLkxUX2lucy5MQ190aW1lLCBtYWdpY19kYXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJmdGltZV9vdXRwdXQsICJMQ190aW1lIGluY29ycmVjdCIpCiAgICAgICAgIExUID0gX3N0cnB0aW1lLkxvY2FsZVRpbWUoKQogICAgICAgICBMVC5hbV9wbSA9ICgnJywgJycpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShMVC5MQ190aW1lLCAiTG9jYWxlVGltZSdzIExDIGRpcmVjdGl2ZXMgY2Fubm90IGhhbmRsZSAiCkBAIC0xNjgsOCArMTY1LDggQEAKICAgICAgICAgIyBGaXhlcyBidWcgIzY2MTM1NAogICAgICAgICB0ZXN0X2xvY2FsZSA9IF9zdHJwdGltZS5Mb2NhbGVUaW1lKCkKICAgICAgICAgdGVzdF9sb2NhbGUudGltZXpvbmUgPSAoZnJvemVuc2V0KCksIGZyb3plbnNldCgpKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoX3N0cnB0aW1lLlRpbWVSRSh0ZXN0X2xvY2FsZSkucGF0dGVybigiJVoiKSA9PSAnJywKLSAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoIHRpbWV6b25lID09ICgnJywnJyksIFRpbWVSRSgpLnBhdHRlcm4oJyVaJykgIT0gJyciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKF9zdHJwdGltZS5UaW1lUkUodGVzdF9sb2NhbGUpLnBhdHRlcm4oIiVaIiksICcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoIHRpbWV6b25lID09ICgnJywnJyksIFRpbWVSRSgpLnBhdHRlcm4oJyVaJykgIT0gJyciKQogCiAgICAgZGVmIHRlc3RfbWF0Y2hpbmdfd2l0aF9lc2NhcGVzKHNlbGYpOgogICAgICAgICAjIE1ha2Ugc3VyZSBhIGZvcm1hdCB0aGF0IHJlcXVpcmVzIGVzY2FwaW5nIG9mIGNoYXJhY3RlcnMgd29ya3MKQEAgLTE5NSw3ICsxOTIsNyBAQAogICAgICAgICAjIHNvIGFzIHRvIG5vdCBhbGxvdyB0byBzdWJwYXR0ZXJucyB0byBlbmQgdXAgbmV4dCB0byBlYWNoIG90aGVyIGFuZAogICAgICAgICAjICJzdGVhbCIgY2hhcmFjdGVycyBmcm9tIGVhY2ggb3RoZXIuCiAgICAgICAgIHBhdHRlcm4gPSBzZWxmLnRpbWVfcmUucGF0dGVybignJWogJUgnKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHJlLm1hdGNoKHBhdHRlcm4sICIxODAiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZS5tYXRjaChwYXR0ZXJuLCAiMTgwIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChwYXR0ZXJuLCAiMTggMCIpKQogCiAKQEAgLTMxNiw3ICszMTMsNyBAQAogICAgICAgICAjIHdoZW4gdGltZS50em5hbWVbMF0gPT0gdGltZS50em5hbWVbMV0gYW5kIHRpbWUuZGF5bGlnaHQKICAgICAgICAgdHpfbmFtZSA9IHRpbWUudHpuYW1lWzBdCiAgICAgICAgIGlmIHR6X25hbWUudXBwZXIoKSBpbiAoIlVUQyIsICJHTVQiKToKLSAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgnbmVlZCBub24tVVRDL0dNVCB0aW1lem9uZScpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG9yaWdpbmFsX3R6bmFtZSA9IHRpbWUudHpuYW1lCiAgICAgICAgICAgICBvcmlnaW5hbF9kYXlsaWdodCA9IHRpbWUuZGF5bGlnaHQKQEAgLTM4MSw2ICszNzgsMTQgQEAKICAgICAgICAgbmVlZF9lc2NhcGluZyA9ICIuXiQqKz97fVxbXXwpKCIKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKF9zdHJwdGltZS5fc3RycHRpbWVfdGltZShuZWVkX2VzY2FwaW5nLCBuZWVkX2VzY2FwaW5nKSkKIAorICAgIGRlZiB0ZXN0X2ZlYjI5X29uX2xlYXBfeWVhcl93aXRob3V0X3llYXIoc2VsZik6CisgICAgICAgIHRpbWUuc3RycHRpbWUoIkZlYiAyOSIsICIlYiAlZCIpCisKKyAgICBkZWYgdGVzdF9tYXIxX2NvbWVzX2FmdGVyX2ZlYjI5X2V2ZW5fd2hlbl9vbWl0dGluZ190aGVfeWVhcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzKAorICAgICAgICAgICAgICAgIHRpbWUuc3RycHRpbWUoIkZlYiAyOSIsICIlYiAlZCIpLAorICAgICAgICAgICAgICAgIHRpbWUuc3RycHRpbWUoIk1hciAxIiwgIiViICVkIikpCisKIGNsYXNzIFN0cnB0aW1lMTJBTVBNVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgICIiIlRlc3QgYSBfc3RycHRpbWUgcmVncmVzc2lvbiBpbiAnJUkgJXAnIGF0IDEyIG5vb24gKDEyIFBNKSIiIgogCkBAIC01MjEsNyArNTI2LDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfVElNRSwgKCdlbl9VUycsICdVVEY4JykpCiAgICAgICAgIGV4Y2VwdCBsb2NhbGUuRXJyb3I6Ci0gICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ3Rlc3QgbmVlZHMgZW5fVVMuVVRGOCBsb2NhbGUnKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoJzEwJywgJyVkJykKICAgICAgICAgICAgICMgR2V0IGlkIG9mIGN1cnJlbnQgY2FjaGUgb2JqZWN0LgpAQCAtNTM4LDcgKzU0Myw3IEBACiAgICAgICAgICAgICAjIElmIHRoaXMgaXMgdGhlIGNhc2UganVzdCBzdXBwcmVzcyB0aGUgZXhjZXB0aW9uIGFuZCBmYWxsLXRocm91Z2gKICAgICAgICAgICAgICMgdG8gdGhlIHJlc2V0dGluZyB0byB0aGUgb3JpZ2luYWwgbG9jYWxlLgogICAgICAgICAgICAgZXhjZXB0IGxvY2FsZS5FcnJvcjoKLSAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgndGVzdCBuZWVkcyBkZV9ERS5VVEY4IGxvY2FsZScpCiAgICAgICAgICMgTWFrZSBzdXJlIHdlIGRvbid0IHRyYW1wbGUgb24gdGhlIGxvY2FsZSBzZXR0aW5nIG9uY2Ugd2UgbGVhdmUgdGhlCiAgICAgICAgICMgdGVzdC4KICAgICAgICAgZmluYWxseToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3RydG9kLnB5IGIvTGliL3Rlc3QvdGVzdF9zdHJ0b2QucHkKaW5kZXggN2JjNTk1ZC4uOGNjMjM3NyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdHJ0b2QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zdHJ0b2QucHkKQEAgLTI0OSw2ICsyNDksMzggQEAKICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBGYWxzZSwgImV4cGVjdGVkIFZhbHVlRXJyb3IiCiAKKyAgICBAdGVzdF9zdXBwb3J0LnByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT10ZXN0X3N1cHBvcnQuXzJHLCBtZW11c2U9MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJ5X3J1bj1GYWxzZSkKKyAgICBkZWYgdGVzdF9vdmVyc2l6ZWRfZGlnaXRfc3RyaW5ncyhzZWxmLCBtYXhzaXplKToKKyAgICAgICAgIyBJbnB1dCBzdHJpbmcgd2hvc2UgbGVuZ3RoIGRvZXNuJ3QgZml0IGluIGFuIElOVC4KKyAgICAgICAgcyA9ICIxLiIgKyAiMSIgKiBpbnQoMi4yZTkpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICBmbG9hdChzKQorICAgICAgICBkZWwgcworCisgICAgICAgIHMgPSAiMC4iICsgIjAiICogaW50KDIuMmU5KSArICIxIgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgZmxvYXQocykKKyAgICAgICAgZGVsIHMKKworICAgIGRlZiB0ZXN0X2xhcmdlX2V4cG9uZW50cyhzZWxmKToKKyAgICAgICAgIyBWZXJpZnkgdGhhdCB0aGUgY2xpcHBpbmcgb2YgdGhlIGV4cG9uZW50IGluIHN0cnRvZCBkb2Vzbid0IGFmZmVjdCB0aGUKKyAgICAgICAgIyBvdXRwdXQgdmFsdWVzLgorICAgICAgICBkZWYgcG9zaXRpdmVfZXhwKG4pOgorICAgICAgICAgICAgIiIiIExvbmcgc3RyaW5nIHdpdGggdmFsdWUgMS4wIGFuZCBleHBvbmVudCBuIiIiCisgICAgICAgICAgICByZXR1cm4gJzAue30xZSt7fScuZm9ybWF0KCcwJyoobi0xKSwgbikKKworICAgICAgICBkZWYgbmVnYXRpdmVfZXhwKG4pOgorICAgICAgICAgICAgIiIiIExvbmcgc3RyaW5nIHdpdGggdmFsdWUgMS4wIGFuZCBleHBvbmVudCAtbiIiIgorICAgICAgICAgICAgcmV0dXJuICcxe31lLXt9Jy5mb3JtYXQoJzAnKm4sIG4pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdChwb3NpdGl2ZV9leHAoMTAwMDApKSwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KHBvc2l0aXZlX2V4cCgyMDAwMCkpLCAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQocG9zaXRpdmVfZXhwKDMwMDAwKSksIDEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdChuZWdhdGl2ZV9leHAoMTAwMDApKSwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KG5lZ2F0aXZlX2V4cCgyMDAwMCkpLCAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQobmVnYXRpdmVfZXhwKDMwMDAwKSksIDEuMCkKKwogICAgIGRlZiB0ZXN0X3BhcnRpY3VsYXIoc2VsZik6CiAgICAgICAgICMgaW5wdXRzIHRoYXQgcHJvZHVjZWQgY3Jhc2hlcyBvciBpbmNvcnJlY3RseSByb3VuZGVkIHJlc3VsdHMgd2l0aAogICAgICAgICAjIHByZXZpb3VzIHZlcnNpb25zIG9mIGR0b2EuYywgZm9yIHZhcmlvdXMgcmVhc29ucwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdHJ1Y3QucHkgYi9MaWIvdGVzdC90ZXN0X3N0cnVjdC5weQppbmRleCA1YTYzMTM1Li40ODExOTc0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N0cnVjdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N0cnVjdC5weQpAQCAtMyw3ICszLDggQEAKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHN0cnVjdAogaW1wb3J0IGluc3BlY3QKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgY2hlY2tfd2FybmluZ3MsIGNoZWNrX3B5M2tfd2FybmluZ3MKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0IGFzIHN1cHBvcnQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IChjaGVja193YXJuaW5ncywgY2hlY2tfcHkza193YXJuaW5ncykKIAogaW1wb3J0IHN5cwogSVNCSUdFTkRJQU4gPSBzeXMuYnl0ZW9yZGVyID09ICJiaWciCkBAIC00OTUsNiArNDk2LDE0IEBACiAKICAgICAgICAgICAgIHNlbGYudGVzdF91bnBhY2tfZnJvbShjbHM9YnVmZmVyKQogCisgICAgZGVmIHRlc3RfdW5wYWNrX3dpdGhfbWVtb3J5dmlldyhzZWxmKToKKyAgICAgICAgIyBCdWcgMTAyMTI6IHN0cnVjdC51bnBhY2sgZG9lc24ndCBzdXBwb3J0IG5ldyBidWZmZXIgcHJvdG9jb2wgb2JqZWN0cworICAgICAgICBkYXRhMSA9IG1lbW9yeXZpZXcoJ1x4MTJceDM0XHg1Nlx4NzgnKQorICAgICAgICBmb3IgZGF0YSBpbiBbZGF0YTEsXToKKyAgICAgICAgICAgIHZhbHVlLCA9IHN0cnVjdC51bnBhY2soJz5JJywgZGF0YSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWUsIDB4MTIzNDU2NzgpCisgICAgICAgIHNlbGYudGVzdF91bnBhY2tfZnJvbShjbHM9bWVtb3J5dmlldykKKwogICAgIGRlZiB0ZXN0X2Jvb2woc2VsZik6CiAgICAgICAgIGNsYXNzIEV4cGxvZGluZ0Jvb2wob2JqZWN0KToKICAgICAgICAgICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKToKQEAgLTU0NCw4ICs1NTMsNDEgQEAKICAgICAgICAgaHVnZWNvdW50MiA9ICd7fWJ7fUgnLmZvcm1hdChzeXMubWF4c2l6ZS8vMiwgc3lzLm1heHNpemUvLzIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHN0cnVjdC5lcnJvciwgc3RydWN0LmNhbGNzaXplLCBodWdlY291bnQyKQogCisgICAgZGVmIGNoZWNrX3NpemVvZihzZWxmLCBmb3JtYXRfc3RyLCBudW1iZXJfb2ZfY29kZXMpOgorICAgICAgICAjIFRoZSBzaXplIG9mICdQeVN0cnVjdE9iamVjdCcKKyAgICAgICAgdG90YWxzaXplID0gc3VwcG9ydC5jYWxjb2Jqc2l6ZSgnNVAnKQorICAgICAgICAjIFRoZSBzaXplIHRha2VuIHVwIGJ5IHRoZSAnZm9ybWF0Y29kZScgZHluYW1pYyBhcnJheQorICAgICAgICB0b3RhbHNpemUgKz0gc3RydWN0LmNhbGNzaXplKCczUCcpICogKG51bWJlcl9vZl9jb2RlcyArIDEpCisgICAgICAgIHN1cHBvcnQuY2hlY2tfc2l6ZW9mKHNlbGYsIHN0cnVjdC5TdHJ1Y3QoZm9ybWF0X3N0ciksIHRvdGFsc2l6ZSkKKworICAgIEBzdXBwb3J0LmNweXRob25fb25seQorICAgIGRlZiB0ZXN0X19zaXplb2ZfXyhzZWxmKToKKyAgICAgICAgZm9yIGNvZGUgaW4gaW50ZWdlcl9jb2RlczoKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfc2l6ZW9mKGNvZGUsIDEpCisgICAgICAgIHNlbGYuY2hlY2tfc2l6ZW9mKCdCSElMZmRzcFAnLCA5KQorICAgICAgICBzZWxmLmNoZWNrX3NpemVvZignQicgKiAxMjM0LCAxMjM0KQorICAgICAgICBzZWxmLmNoZWNrX3NpemVvZignZmQnLCAyKQorICAgICAgICBzZWxmLmNoZWNrX3NpemVvZigneHh4eHh4eHh4eHh4eHgnLCAwKQorICAgICAgICBzZWxmLmNoZWNrX3NpemVvZignMTAwSCcsIDEwMCkKKyAgICAgICAgc2VsZi5jaGVja19zaXplb2YoJzE4N3MnLCAxKQorICAgICAgICBzZWxmLmNoZWNrX3NpemVvZignMjBwJywgMSkKKyAgICAgICAgc2VsZi5jaGVja19zaXplb2YoJzBzJywgMSkKKyAgICAgICAgc2VsZi5jaGVja19zaXplb2YoJzBjJywgMCkKKworICAgIGRlZiB0ZXN0X3VuaWNvZGVfZm9ybWF0KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB1bmljb2RlCisgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCdubyB1bmljb2RlIHN1cHBvcnQnKQorICAgICAgICAjIElzc3VlICMxOTA5OQorICAgICAgICBzID0gc3RydWN0LlN0cnVjdCh1bmljaHIob3JkKCdJJykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZm9ybWF0LCAnSScpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShzLmZvcm1hdCksIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc3RydWN0LlN0cnVjdCwgdW5pY2hyKDB4ODApKQorCisKIGRlZiB0ZXN0X21haW4oKToKLSAgICBydW5fdW5pdHRlc3QoU3RydWN0VGVzdCkKKyAgICBzdXBwb3J0LnJ1bl91bml0dGVzdChTdHJ1Y3RUZXN0KQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N0cnVjdG1lbWJlcnMucHkgYi9MaWIvdGVzdC90ZXN0X3N0cnVjdG1lbWJlcnMucHkKaW5kZXggMGNjNThjMy4uM2UyYjI2MSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdHJ1Y3RtZW1iZXJzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3RydWN0bWVtYmVycy5weQpAQCAtMSwzICsxLDggQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworIyBTa2lwIHRoaXMgdGVzdCBpZiB0aGUgX3Rlc3RjYXBpIG1vZHVsZSBpc24ndCBhdmFpbGFibGUuCit0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnX3Rlc3RjYXBpJykKIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBfdGVzdF9zdHJ1Y3RtZW1iZXJzVHlwZSwgXAogICAgIENIQVJfTUFYLCBDSEFSX01JTiwgVUNIQVJfTUFYLCBcCiAgICAgU0hSVF9NQVgsIFNIUlRfTUlOLCBVU0hSVF9NQVgsIFwKQEAgLTUsOSArMTAsNiBAQAogICAgIExPTkdfTUFYLCBMT05HX01JTiwgVUxPTkdfTUFYLCBcCiAgICAgTExPTkdfTUFYLCBMTE9OR19NSU4sIFVMTE9OR19NQVgKIAotaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAotCiB0cz1fdGVzdF9zdHJ1Y3RtZW1iZXJzVHlwZShGYWxzZSwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgOS45OTk5OSwgMTAuMTAxMDEwMTAxMCwgImhpIikKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5IGIvTGliL3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5CmluZGV4IGI2NjM1NmQuLjBlZmNkYmYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3VicHJvY2Vzcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHkKQEAgLTE0LDYgKzE0LDEwIEBACiAgICAgaW1wb3J0IHJlc291cmNlCiBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgcmVzb3VyY2UgPSBOb25lCit0cnk6CisgICAgaW1wb3J0IHRocmVhZGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHRocmVhZGluZyA9IE5vbmUKIAogbXN3aW5kb3dzID0gKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiKQogCkBAIC01OCw2ICs2MiwxOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1zZykKIAogCitjbGFzcyBQb3BlblRlc3RFeGNlcHRpb24oRXhjZXB0aW9uKToKKyAgICBwYXNzCisKKworY2xhc3MgUG9wZW5FeGVjdXRlQ2hpbGRSYWlzZXMoc3VicHJvY2Vzcy5Qb3Blbik6CisgICAgIiIiUG9wZW4gc3ViY2xhc3MgZm9yIHRlc3RpbmcgY2xlYW51cCBvZiBzdWJwcm9jZXNzLlBJUEUgZmlsZWhhbmRsZXMgd2hlbgorICAgIF9leGVjdXRlX2NoaWxkIGZhaWxzLgorICAgICIiIgorICAgIGRlZiBfZXhlY3V0ZV9jaGlsZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByYWlzZSBQb3BlblRlc3RFeGNlcHRpb24oIkZvcmNlZCBFeGNlcHRpb24gZm9yIFRlc3QiKQorCisKIGNsYXNzIFByb2Nlc3NUZXN0Q2FzZShCYXNlVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfY2FsbF9zZXEoc2VsZik6CkBAIC0xMzgsMTYgKzE1NCwyNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3RkaW4sIE5vbmUpCiAKICAgICBkZWYgdGVzdF9zdGRvdXRfbm9uZShzZWxmKToKLSAgICAgICAgIyAuc3Rkb3V0IGlzIE5vbmUgd2hlbiBub3QgcmVkaXJlY3RlZAotICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcmludCAiICAgIHRoaXMgYml0IG9mIG91dHB1dCBpcyBmcm9tIGEgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdCBvZiBzdGRvdXQgaW4gYSBkaWZmZXJlbnQgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvY2VzcyAuLi4iJ10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKLSAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkaW4uY2xvc2UpCisgICAgICAgICMgLnN0ZG91dCBpcyBOb25lIHdoZW4gbm90IHJlZGlyZWN0ZWQsIGFuZCB0aGUgY2hpbGQncyBzdGRvdXQgd2lsbAorICAgICAgICAjIGJlIGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQuICBJbiBvcmRlciB0byB0ZXN0IHRoaXMgd2UgcnVuIGEKKyAgICAgICAgIyBzdWJwcm9jZXNzIGluIGEgc3VicHJvY2VzczoKKyAgICAgICAgIyB0aGlzX3Rlc3QKKyAgICAgICAgIyAgIFwtLSBzdWJwcm9jZXNzIGNyZWF0ZWQgYnkgdGhpcyB0ZXN0IChwYXJlbnQpCisgICAgICAgICMgICAgICAgICAgXC0tIHN1YnByb2Nlc3MgY3JlYXRlZCBieSB0aGUgcGFyZW50IHN1YnByb2Nlc3MgKGNoaWxkKQorICAgICAgICAjIFRoZSBwYXJlbnQgZG9lc24ndCBzcGVjaWZ5IHN0ZG91dCwgc28gdGhlIGNoaWxkIHdpbGwgdXNlIHRoZQorICAgICAgICAjIHBhcmVudCdzIHN0ZG91dC4gIFRoaXMgdGVzdCBjaGVja3MgdGhhdCB0aGUgbWVzc2FnZSBwcmludGVkIGJ5IHRoZQorICAgICAgICAjIGNoaWxkIGdvZXMgdG8gdGhlIHBhcmVudCBzdGRvdXQuICBUaGUgcGFyZW50IGFsc28gY2hlY2tzIHRoYXQgdGhlCisgICAgICAgICMgY2hpbGQncyBzdGRvdXQgaXMgTm9uZS4gIFNlZSAjMTE5NjMuCisgICAgICAgIGNvZGUgPSAoJ2ltcG9ydCBzeXM7IGZyb20gc3VicHJvY2VzcyBpbXBvcnQgUG9wZW4sIFBJUEU7JworICAgICAgICAgICAgICAgICdwID0gUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLCAicHJpbnQgXCd0ZXN0X3N0ZG91dF9ub25lXCciXSwnCisgICAgICAgICAgICAgICAgJyAgICAgICAgICBzdGRpbj1QSVBFLCBzdGRlcnI9UElQRSk7JworICAgICAgICAgICAgICAgICdwLndhaXQoKTsgYXNzZXJ0IHAuc3Rkb3V0IGlzIE5vbmU7JykKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLCBjb2RlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQogICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRlcnIuY2xvc2UpCi0gICAgICAgIHAud2FpdCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQsIE5vbmUpCisgICAgICAgIG91dCwgZXJyID0gcC5jb21tdW5pY2F0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5yZXR1cm5jb2RlLCAwLCBlcnIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LnJzdHJpcCgpLCAndGVzdF9zdGRvdXRfbm9uZScpCiAKICAgICBkZWYgdGVzdF9zdGRlcnJfbm9uZShzZWxmKToKICAgICAgICAgIyAuc3RkZXJyIGlzIE5vbmUgd2hlbiBub3QgcmVkaXJlY3RlZApAQCAtMjk2LDkgKzMyMywyMiBAQAogCiAgICAgZGVmIHRlc3Rfc3Rkb3V0X2ZpbGVkZXNfb2Zfc3Rkb3V0KHNlbGYpOgogICAgICAgICAjIHN0ZG91dCBpcyBzZXQgdG8gMSAoIzE1MzE4NjIpLgotICAgICAgICBjbWQgPSByImltcG9ydCBzeXMsIG9zOyBzeXMuZXhpdChvcy53cml0ZShzeXMuc3Rkb3V0LmZpbGVubygpLCAnLlxuJykpIgotICAgICAgICByYyA9IHN1YnByb2Nlc3MuY2FsbChbc3lzLmV4ZWN1dGFibGUsICItYyIsIGNtZF0sIHN0ZG91dD0xKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJjLCAyKQorICAgICAgICAjIFRvIGF2b2lkIHByaW50aW5nIHRoZSB0ZXh0IG9uIHN0ZG91dCwgd2UgZG8gc29tZXRoaW5nIHNpbWlsYXIgdG8KKyAgICAgICAgIyB0ZXN0X3N0ZG91dF9ub25lIChzZWUgYWJvdmUpLiAgVGhlIHBhcmVudCBzdWJwcm9jZXNzIGNhbGxzIHRoZSBjaGlsZAorICAgICAgICAjIHN1YnByb2Nlc3MgcGFzc2luZyBzdGRvdXQ9MSwgYW5kIHRoaXMgdGVzdCB1c2VzIHN0ZG91dD1QSVBFIGluCisgICAgICAgICMgb3JkZXIgdG8gY2FwdHVyZSBhbmQgY2hlY2sgdGhlIG91dHB1dCBvZiB0aGUgcGFyZW50LiBTZWUgIzExOTYzLgorICAgICAgICBjb2RlID0gKCdpbXBvcnQgc3lzLCBzdWJwcm9jZXNzOyAnCisgICAgICAgICAgICAgICAgJ3JjID0gc3VicHJvY2Vzcy5jYWxsKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgJworICAgICAgICAgICAgICAgICcgICAgImltcG9ydCBvcywgc3lzOyBzeXMuZXhpdChvcy53cml0ZShzeXMuc3Rkb3V0LmZpbGVubygpLCAnCisgICAgICAgICAgICAgICAgICAgICAnXCd0ZXN0IHdpdGggc3Rkb3V0PTFcJykpIl0sIHN0ZG91dD0xKTsgJworICAgICAgICAgICAgICAgICdhc3NlcnQgcmMgPT0gMTgnKQorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsIGNvZGVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZGVyci5jbG9zZSkKKyAgICAgICAgb3V0LCBlcnIgPSBwLmNvbW11bmljYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnJldHVybmNvZGUsIDAsIGVycikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXQucnN0cmlwKCksICd0ZXN0IHdpdGggc3Rkb3V0PTEnKQogCiAgICAgZGVmIHRlc3RfY3dkKHNlbGYpOgogICAgICAgICB0bXBkaXIgPSB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkKQEAgLTUyNiw2ICs1NjYsNyBAQAogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgZm9yIGggaW4gaGFuZGxlczoKICAgICAgICAgICAgICAgICBvcy5jbG9zZShoKQorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQogCiAgICAgZGVmIHRlc3RfbGlzdDJjbWRsaW5lKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1YnByb2Nlc3MubGlzdDJjbWRsaW5lKFsnYSBiIGMnLCAnZCcsICdlJ10pLApAQCAtNTkyLDYgKzYzMywzNiBAQAogICAgICAgICAgICAgaWYgYy5leGNlcHRpb24uZXJybm8gbm90IGluIChlcnJuby5FTk9FTlQsIGVycm5vLkVBQ0NFUyk6CiAgICAgICAgICAgICAgICAgcmFpc2UgYy5leGNlcHRpb24KIAorICAgIEB1bml0dGVzdC5za2lwSWYodGhyZWFkaW5nIGlzIE5vbmUsICJ0aHJlYWRpbmcgcmVxdWlyZWQiKQorICAgIGRlZiB0ZXN0X2RvdWJsZV9jbG9zZV9vbl9lcnJvcihzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTg4NTEKKyAgICAgICAgZmRzID0gW10KKyAgICAgICAgZGVmIG9wZW5fZmRzKCk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgyMCk6CisgICAgICAgICAgICAgICAgZmRzLmV4dGVuZChvcy5waXBlKCkpCisgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjAwMSkKKyAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PW9wZW5fZmRzKQorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhFbnZpcm9ubWVudEVycm9yKToKKyAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLlBvcGVuKFsnbm9uZXhpc3RpbmdfaV9ob3BlJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHQuam9pbigpCisgICAgICAgICAgICBleGMgPSBOb25lCisgICAgICAgICAgICBmb3IgZmQgaW4gZmRzOgorICAgICAgICAgICAgICAgICMgSWYgYSBkb3VibGUgY2xvc2Ugb2NjdXJyZWQsIHNvbWUgb2YgdGhvc2UgZmRzIHdpbGwKKyAgICAgICAgICAgICAgICAjIGFscmVhZHkgaGF2ZSBiZWVuIGNsb3NlZCBieSBtaXN0YWtlLCBhbmQgb3MuY2xvc2UoKQorICAgICAgICAgICAgICAgICMgaGVyZSB3aWxsIHJhaXNlLgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoZmQpCisgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICAgICAgZXhjID0gZQorICAgICAgICAgICAgaWYgZXhjIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJhaXNlIGV4YworCiAgICAgZGVmIHRlc3RfaGFuZGxlc19jbG9zZWRfb25fZXhjZXB0aW9uKHNlbGYpOgogICAgICAgICAjIElmIENyZWF0ZVByb2Nlc3MgZXhpdHMgd2l0aCBhbiBlcnJvciwgZW5zdXJlIHRoZQogICAgICAgICAjIGR1cGxpY2F0ZSBvdXRwdXQgaGFuZGxlcyBhcmUgcmVsZWFzZWQKQEAgLTYzMSw2ICs3MDIsMjcgQEAKICAgICAgICAgdGltZS5zbGVlcCgyKQogICAgICAgICBwLmNvbW11bmljYXRlKCJ4IiAqIDIqKjIwKQogCisgICAgIyBUaGlzIHRlc3QgaXMgTGludXgtaXNoIHNwZWNpZmljIGZvciBzaW1wbGljaXR5IHRvIGF0IGxlYXN0IGhhdmUKKyAgICAjIHNvbWUgY292ZXJhZ2UuICBJdCBpcyBub3QgYSBwbGF0Zm9ybSBzcGVjaWZpYyBidWcuCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Mob3MucGF0aC5pc2RpcignL3Byb2MvJWQvZmQnICUgb3MuZ2V0cGlkKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJMaW51eCBzcGVjaWZpYyIpCisgICAgZGVmIHRlc3RfZmFpbGVkX2NoaWxkX2V4ZWN1dGVfZmRfbGVhayhzZWxmKToKKyAgICAgICAgIiIiVGVzdCBmb3IgdGhlIGZvcmsoKSBmYWlsdXJlIGZkIGxlYWsgcmVwb3J0ZWQgaW4gaXNzdWUxNjMyNy4iIiIKKyAgICAgICAgZmRfZGlyZWN0b3J5ID0gJy9wcm9jLyVkL2ZkJyAlIG9zLmdldHBpZCgpCisgICAgICAgIGZkc19iZWZvcmVfcG9wZW4gPSBvcy5saXN0ZGlyKGZkX2RpcmVjdG9yeSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhQb3BlblRlc3RFeGNlcHRpb24pOgorICAgICAgICAgICAgUG9wZW5FeGVjdXRlQ2hpbGRSYWlzZXMoCisgICAgICAgICAgICAgICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgJy1jJywgJ3Bhc3MnXSwgc3RkaW49c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorCisgICAgICAgICMgTk9URTogVGhpcyB0ZXN0IGRvZXNuJ3QgdmVyaWZ5IHRoYXQgdGhlIHJlYWwgX2V4ZWN1dGVfY2hpbGQKKyAgICAgICAgIyBkb2VzIG5vdCBjbG9zZSB0aGUgZmlsZSBkZXNjcmlwdG9ycyBpdHNlbGYgb24gdGhlIHdheSBvdXQKKyAgICAgICAgIyBkdXJpbmcgYW4gZXhjZXB0aW9uLiAgQ29kZSBpbnNwZWN0aW9uIGhhcyBjb25maXJtZWQgdGhhdC4KKworICAgICAgICBmZHNfYWZ0ZXJfZXhjZXB0aW9uID0gb3MubGlzdGRpcihmZF9kaXJlY3RvcnkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmRzX2JlZm9yZV9wb3BlbiwgZmRzX2FmdGVyX2V4Y2VwdGlvbikKKworCiAjIGNvbnRleHQgbWFuYWdlcgogY2xhc3MgX1N1cHByZXNzQ29yZUZpbGVzKG9iamVjdCk6CiAgICAgIiIiVHJ5IHRvIHByZXZlbnQgY29yZSBmaWxlcyBmcm9tIGJlaW5nIGNyZWF0ZWQuIiIiCkBAIC03MTcsNiArODA5LDUzIEBACiAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnN0ZG91dC5yZWFkKCksICJhcHBsZSIpCiAKKyAgICBjbGFzcyBfVGVzdEV4ZWN1dGVDaGlsZFBvcGVuKHN1YnByb2Nlc3MuUG9wZW4pOgorICAgICAgICAiIiJVc2VkIHRvIHRlc3QgYmVoYXZpb3IgYXQgdGhlIGVuZCBvZiBfZXhlY3V0ZV9jaGlsZC4iIiIKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RjYXNlLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgc2VsZi5fdGVzdGNhc2UgPSB0ZXN0Y2FzZQorICAgICAgICAgICAgc3VicHJvY2Vzcy5Qb3Blbi5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICAgICAgZGVmIF9leGVjdXRlX2NoaWxkKAorICAgICAgICAgICAgICAgIHNlbGYsIGFyZ3MsIGV4ZWN1dGFibGUsIHByZWV4ZWNfZm4sIGNsb3NlX2ZkcywgY3dkLCBlbnYsCisgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzLCBzdGFydHVwaW5mbywgY3JlYXRpb25mbGFncywgc2hlbGwsIHRvX2Nsb3NlLAorICAgICAgICAgICAgICAgIHAyY3JlYWQsIHAyY3dyaXRlLAorICAgICAgICAgICAgICAgIGMycHJlYWQsIGMycHdyaXRlLAorICAgICAgICAgICAgICAgIGVycnJlYWQsIGVycndyaXRlKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLlBvcGVuLl9leGVjdXRlX2NoaWxkKAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgYXJncywgZXhlY3V0YWJsZSwgcHJlZXhlY19mbiwgY2xvc2VfZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgY3dkLCBlbnYsIHVuaXZlcnNhbF9uZXdsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0dXBpbmZvLCBjcmVhdGlvbmZsYWdzLCBzaGVsbCwgdG9fY2xvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBwMmNyZWFkLCBwMmN3cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGMycHJlYWQsIGMycHdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgZXJycmVhZCwgZXJyd3JpdGUpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICMgT3BlbiBhIGJ1bmNoIG9mIGZpbGUgZGVzY3JpcHRvcnMgYW5kIHZlcmlmeSB0aGF0CisgICAgICAgICAgICAgICAgIyBub25lIG9mIHRoZW0gYXJlIHRoZSBzYW1lIGFzIHRoZSBvbmVzIHRoZSBQb3BlbgorICAgICAgICAgICAgICAgICMgaW5zdGFuY2UgaXMgdXNpbmcgZm9yIHN0ZGluL3N0ZG91dC9zdGRlcnIuCisgICAgICAgICAgICAgICAgZGV2emVyb19mZHMgPSBbb3Mub3BlbigiL2Rldi96ZXJvIiwgb3MuT19SRE9OTFkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2UoOCldCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmb3IgZmQgaW4gZGV2emVyb19mZHM6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZXN0Y2FzZS5hc3NlcnROb3RJbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQsIChwMmN3cml0ZSwgYzJwcmVhZCwgZXJycmVhZCkpCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgZm9yIGZkIGluIGRldnplcm9fZmRzOgorICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoZmQpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKG5vdCBvcy5wYXRoLmV4aXN0cygiL2Rldi96ZXJvIiksICIvZGV2L3plcm8gcmVxdWlyZWQuIikKKyAgICBkZWYgdGVzdF9wcmVleGVjX2VycnBpcGVfZG9lc19ub3RfZG91YmxlX2Nsb3NlX3BpcGVzKHNlbGYpOgorICAgICAgICAiIiJJc3N1ZTE2MTQwOiBEb24ndCBkb3VibGUgY2xvc2UgcGlwZXMgb24gcHJlZXhlYyBlcnJvci4iIiIKKworICAgICAgICBkZWYgcmFpc2VfaXQoKToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiZm9yY2UgdGhlIF9leGVjdXRlX2NoaWxkKCkgZXJycGlwZV9kYXRhIHBhdGguIikKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6CisgICAgICAgICAgICBzZWxmLl9UZXN0RXhlY3V0ZUNoaWxkUG9wZW4oCisgICAgICAgICAgICAgICAgICAgIHNlbGYsIFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgInBhc3MiXSwKKyAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFLCBwcmVleGVjX2ZuPXJhaXNlX2l0KQorCiAgICAgZGVmIHRlc3RfYXJnc19zdHJpbmcoc2VsZik6CiAgICAgICAgICMgYXJncyBpcyBhIHN0cmluZwogICAgICAgICBmLCBmbmFtZSA9IG1rc3RlbXAoKQpAQCAtODEyLDYgKzk1MSwyOSBAQAogICAgICAgICBnZXRhdHRyKHAsIG1ldGhvZCkoKmFyZ3MpCiAgICAgICAgIHJldHVybiBwCiAKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCgnbmV0YnNkJywgJ29wZW5ic2QnKSksCisgICAgICAgICAgICAgICAgICAgICAiRHVlIHRvIGtub3duIE9TIGJ1ZyAoaXNzdWUgIzE2NzYyKSIpCisgICAgZGVmIF9raWxsX2RlYWRfcHJvY2VzcyhzZWxmLCBtZXRob2QsICphcmdzKToKKyAgICAgICAgIyBEbyBub3QgaW5oZXJpdCBmaWxlIGhhbmRsZXMgZnJvbSB0aGUgcGFyZW50LgorICAgICAgICAjIEl0IHNob3VsZCBmaXggZmFpbHVyZXMgb24gc29tZSBwbGF0Zm9ybXMuCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgIiIiaWYgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHN5cywgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCd4XFxuJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlX2Zkcz1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgICMgV2FpdCBmb3IgdGhlIGludGVycHJldGVyIHRvIGJlIGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQgYmVmb3JlCisgICAgICAgICMgc2VuZGluZyBhbnkgc2lnbmFsLgorICAgICAgICBwLnN0ZG91dC5yZWFkKDEpCisgICAgICAgICMgVGhlIHByb2Nlc3Mgc2hvdWxkIGVuZCBhZnRlciB0aGlzCisgICAgICAgIHRpbWUuc2xlZXAoMSkKKyAgICAgICAgIyBUaGlzIHNob3VsZG4ndCByYWlzZSBldmVuIHRob3VnaCB0aGUgY2hpbGQgaXMgbm93IGRlYWQKKyAgICAgICAgZ2V0YXR0cihwLCBtZXRob2QpKCphcmdzKQorICAgICAgICBwLmNvbW11bmljYXRlKCkKKwogICAgIGRlZiB0ZXN0X3NlbmRfc2lnbmFsKHNlbGYpOgogICAgICAgICBwID0gc2VsZi5fa2lsbF9wcm9jZXNzKCdzZW5kX3NpZ25hbCcsIHNpZ25hbC5TSUdJTlQpCiAgICAgICAgIF8sIHN0ZGVyciA9IHAuY29tbXVuaWNhdGUoKQpAQCAtODMwLDYgKzk5MiwxOCBAQAogICAgICAgICBzZWxmLmFzc2VydFN0ZGVyckVxdWFsKHN0ZGVyciwgJycpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC53YWl0KCksIC1zaWduYWwuU0lHVEVSTSkKIAorICAgIGRlZiB0ZXN0X3NlbmRfc2lnbmFsX2RlYWQoc2VsZik6CisgICAgICAgICMgU2VuZGluZyBhIHNpZ25hbCB0byBhIGRlYWQgcHJvY2VzcworICAgICAgICBzZWxmLl9raWxsX2RlYWRfcHJvY2Vzcygnc2VuZF9zaWduYWwnLCBzaWduYWwuU0lHSU5UKQorCisgICAgZGVmIHRlc3Rfa2lsbF9kZWFkKHNlbGYpOgorICAgICAgICAjIEtpbGxpbmcgYSBkZWFkIHByb2Nlc3MKKyAgICAgICAgc2VsZi5fa2lsbF9kZWFkX3Byb2Nlc3MoJ2tpbGwnKQorCisgICAgZGVmIHRlc3RfdGVybWluYXRlX2RlYWQoc2VsZik6CisgICAgICAgICMgVGVybWluYXRpbmcgYSBkZWFkIHByb2Nlc3MKKyAgICAgICAgc2VsZi5fa2lsbF9kZWFkX3Byb2Nlc3MoJ3Rlcm1pbmF0ZScpCisKICAgICBkZWYgY2hlY2tfY2xvc2Vfc3RkX2ZkcyhzZWxmLCBmZHMpOgogICAgICAgICAjIElzc3VlICM5OTA1OiB0ZXN0IHRoYXQgc3VicHJvY2VzcyBwaXBlcyBzdGlsbCB3b3JrIHByb3Blcmx5IHdpdGgKICAgICAgICAgIyBzb21lIHN0YW5kYXJkIGZkcyBjbG9zZWQKQEAgLTExMjYsNiArMTMwMCwzMSBAQAogICAgICAgICByZXR1cm5jb2RlID0gcC53YWl0KCkKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyZXR1cm5jb2RlLCAwKQogCisgICAgZGVmIF9raWxsX2RlYWRfcHJvY2VzcyhzZWxmLCBtZXRob2QsICphcmdzKToKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLCAiIiJpZiAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgc3lzLCB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJ3hcXG4nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLmV4aXQoNDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRlcnIuY2xvc2UpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZGluLmNsb3NlKQorICAgICAgICAjIFdhaXQgZm9yIHRoZSBpbnRlcnByZXRlciB0byBiZSBjb21wbGV0ZWx5IGluaXRpYWxpemVkIGJlZm9yZQorICAgICAgICAjIHNlbmRpbmcgYW55IHNpZ25hbC4KKyAgICAgICAgcC5zdGRvdXQucmVhZCgxKQorICAgICAgICAjIFRoZSBwcm9jZXNzIHNob3VsZCBlbmQgYWZ0ZXIgdGhpcworICAgICAgICB0aW1lLnNsZWVwKDEpCisgICAgICAgICMgVGhpcyBzaG91bGRuJ3QgcmFpc2UgZXZlbiB0aG91Z2ggdGhlIGNoaWxkIGlzIG5vdyBkZWFkCisgICAgICAgIGdldGF0dHIocCwgbWV0aG9kKSgqYXJncykKKyAgICAgICAgXywgc3RkZXJyID0gcC5jb21tdW5pY2F0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0U3RkZXJyRXF1YWwoc3RkZXJyLCBiJycpCisgICAgICAgIHJjID0gcC53YWl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYywgNDIpCisKICAgICBkZWYgdGVzdF9zZW5kX3NpZ25hbChzZWxmKToKICAgICAgICAgc2VsZi5fa2lsbF9wcm9jZXNzKCdzZW5kX3NpZ25hbCcsIHNpZ25hbC5TSUdURVJNKQogCkBAIC0xMTM1LDYgKzEzMzQsMTUgQEAKICAgICBkZWYgdGVzdF90ZXJtaW5hdGUoc2VsZik6CiAgICAgICAgIHNlbGYuX2tpbGxfcHJvY2VzcygndGVybWluYXRlJykKIAorICAgIGRlZiB0ZXN0X3NlbmRfc2lnbmFsX2RlYWQoc2VsZik6CisgICAgICAgIHNlbGYuX2tpbGxfZGVhZF9wcm9jZXNzKCdzZW5kX3NpZ25hbCcsIHNpZ25hbC5TSUdURVJNKQorCisgICAgZGVmIHRlc3Rfa2lsbF9kZWFkKHNlbGYpOgorICAgICAgICBzZWxmLl9raWxsX2RlYWRfcHJvY2Vzcygna2lsbCcpCisKKyAgICBkZWYgdGVzdF90ZXJtaW5hdGVfZGVhZChzZWxmKToKKyAgICAgICAgc2VsZi5fa2lsbF9kZWFkX3Byb2Nlc3MoJ3Rlcm1pbmF0ZScpCisKIAogQHVuaXR0ZXN0LnNraXBVbmxlc3MoZ2V0YXR0cihzdWJwcm9jZXNzLCAnX2hhc19wb2xsJywgRmFsc2UpLAogICAgICAgICAgICAgICAgICAgICAgInBvbGwgc3lzdGVtIGNhbGwgbm90IHN1cHBvcnRlZCIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N1bmF1LnB5IGIvTGliL3Rlc3QvdGVzdF9zdW5hdS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjgyODY4Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9zdW5hdS5weQpAQCAtMCwwICsxLDEwMCBAQAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCBydW5fdW5pdHRlc3QKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCBhdWRpb3Rlc3RzCitpbXBvcnQgc3lzCitpbXBvcnQgc3VuYXUKKworCitjbGFzcyBTdW5hdVRlc3QoYXVkaW90ZXN0cy5BdWRpb1dyaXRlVGVzdHMsCisgICAgICAgICAgICAgICAgYXVkaW90ZXN0cy5BdWRpb1Rlc3RzV2l0aFNvdXJjZUZpbGUpOgorICAgIG1vZHVsZSA9IHN1bmF1CisKKworY2xhc3MgU3VuYXVQQ004VGVzdChTdW5hdVRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBzbmRmaWxlbmFtZSA9ICdwbHVjay1wY204LmF1JworICAgIHNuZGZpbGVuZnJhbWVzID0gMzMwNworICAgIG5jaGFubmVscyA9IDIKKyAgICBzYW1wd2lkdGggPSAxCisgICAgZnJhbWVyYXRlID0gMTEwMjUKKyAgICBuZnJhbWVzID0gNDgKKyAgICBjb21wdHlwZSA9ICdOT05FJworICAgIGNvbXBuYW1lID0gJ25vdCBjb21wcmVzc2VkJworICAgIGZyYW1lcyA9IGF1ZGlvdGVzdHMuZnJvbWhleCgiIiJcCisgICAgICAwMkZGIDRCMDAgMzEwNCA4MDA4IENCMDYgNDgwMyBCRjAxIDAzRkUgQjhGQSBCNEYzIDI5RUIgMUFFNiBcCisgICAgICBFREU0IEM2RTIgMEVFMCBFRkUwIDU3RTIgRkJFOCAxM0VGIEQ4RjcgOTdGQiBGNUZDIDA4RkIgREZGQiBcCisgICAgICAxMUZBIDNFRkIgQkNGQyA2NkZGIENGMDQgNDMwOSBDMTBFIDUxMTIgRUUxNyA4MjE2IDdGMTQgODAxMiBcCisgICAgICA0OTBFIDUyMEQgRUYwRiBDRTBGIEU0MEMgNjMwQSAwODBBIDJCMEIgNTEwRSA4QjExIEI2MEUgNDQwQSBcCisgICAgICAiIiIpCisKKworY2xhc3MgU3VuYXVQQ00xNlRlc3QoU3VuYXVUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgc25kZmlsZW5hbWUgPSAncGx1Y2stcGNtMTYuYXUnCisgICAgc25kZmlsZW5mcmFtZXMgPSAzMzA3CisgICAgbmNoYW5uZWxzID0gMgorICAgIHNhbXB3aWR0aCA9IDIKKyAgICBmcmFtZXJhdGUgPSAxMTAyNQorICAgIG5mcmFtZXMgPSA0OAorICAgIGNvbXB0eXBlID0gJ05PTkUnCisgICAgY29tcG5hbWUgPSAnbm90IGNvbXByZXNzZWQnCisgICAgZnJhbWVzID0gYXVkaW90ZXN0cy5mcm9taGV4KCIiIlwKKyAgICAgIDAyMkVGRkVBIDRCNUMwMEY5IDMxMTQwNEVGIDgwREIwODQ0IENCRTAwNkIwIDQ4QUIwM0YzIEJGRTYwMUI1IDAzNjdGRTgwIFwKKyAgICAgIEI4NTNGQTQyIEI0QUZGMzUxIDI5OTdFQkNEIDFBNUFFNkRDIEVERjlFNDkyIEM2MjdFMjc3IDBFMDZFMEI3IEVGMjlFMDI5IFwKKyAgICAgIDU3NTlFMjcxIEZCMzRFODNGIDEzNzdFRjg1IEQ4MkNGNzI3IDk3OEVGQjc5IEY1RjdGQzEyIDA4NjRGQjlFIERGMzBGQjQwIFwKKyAgICAgIDExODNGQTMwIDNFRUFGQjU5IEJDNzhGQ0I0IDY2RDVGRjYwIENGMTMwNDE1IDQzMUEwOTdEIEMxQkEwRUM3IDUxMjMxMkEwIFwKKyAgICAgIEVFRTExNzU0IDgyMDcxNjY2IDdGRkUxNDQ4IDgwMDAxMjk4IDQ5OTkwRUI3IDUyQjQwREMxIEVGQUQwRjY1IENFM0EwRkJFIFwKKyAgICAgIEU0QjcwQ0U2IDYzNDkwQTU3IDA4Q0MwQTFEIDJCQkMwQjA5IDUxNDgwRTQ2IDhCQ0IxMTNDIEI2RjYwRUU5IDQ0MTUwQTVBIFwKKyAgICAgICIiIikKKworCitjbGFzcyBTdW5hdVBDTTMyVGVzdChTdW5hdVRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBzbmRmaWxlbmFtZSA9ICdwbHVjay1wY20zMi5hdScKKyAgICBzbmRmaWxlbmZyYW1lcyA9IDMzMDcKKyAgICBuY2hhbm5lbHMgPSAyCisgICAgc2FtcHdpZHRoID0gNAorICAgIGZyYW1lcmF0ZSA9IDExMDI1CisgICAgbmZyYW1lcyA9IDQ4CisgICAgY29tcHR5cGUgPSAnTk9ORScKKyAgICBjb21wbmFtZSA9ICdub3QgY29tcHJlc3NlZCcKKyAgICBmcmFtZXMgPSBhdWRpb3Rlc3RzLmZyb21oZXgoIiIiXAorICAgICAgMDIyRDY1QkNGRkVCOUQ5MiA0QjVBMEY4MDAwRkE1NDlDIDMxMTNDMzQwMDRFRTJCQzAgODBEQ0Q2ODAwODQzMDNFMCBcCisgICAgICBDQkRFQzBDMDA2QjI2MTQwIDQ4QTk5ODAwMDNGMkY4RkMgQkZFODI0ODAwMUIwN0Q5MiAwMzZCRkI2MEZFN0I1RDM0IFwKKyAgICAgIEI4NTc1NjAwRkEzRUM5MjAgQjRCMDU1MDBGMzUwMkJDMCAyOTk4MzAwMEVCQ0I2MjQwIDFBNUNBN0EwRTZEOTlBNjAgXAorICAgICAgRURGQTNFODBFNDkxQkQ0MCBDNjI1RUI4MEUyNzg4NEEwIDBFMDVBOUEwRTBCNkNGRTAgRUYyOTI5NDBFMDI5MjI4MCBcCisgICAgICA1NzU4RDgwMEUyNzA2NzAwIEZCMzU1N0Q4RTgzRTE2NDAgMTM3N0JGMDBFRjg0MDI4MCBEODJDNUI4MEY3MjcyQTgwIFwKKyAgICAgIDk3OEYxNjAwRkI3NzQ1NjAgRjVGODY1MTBGQzEwMTM2NCAwODY2MzVBMEZCOUM0RTIwIERGMzBGQzQwRkI0MEVFMjggXAorICAgICAgMTE3RkUwQTBGQTM0MzhCMCAzRUU2Qjg0MEZCNUFDM0YwIEJDNzdBMzgwRkNCMkY0NTQgNjZENkRBODBGRjVGMzJCNCBcCisgICAgICBDRjEzQjk4MDA0MTI3NUIwIDQzMUQ2OTgwMDk3QThDMDAgQzFCQjYwMDAwRUM3NEUwMCA1MTIwQjk4MDEyQTJCQUEwIFwKKyAgICAgIEVFREY2NEMwMTc1NEMwNjAgODIwNzAwMDAxNjY0Qjc4MCA3RkZGRkZGRjE0NDUzRjQwIDgwMDAwMDAwMTI5NEU2RTAgXAorICAgICAgNDk5QzFCMDAwRUIzQjI3MCA1MkI3M0UwMDBEQkNBMDIwIEVGQjJCMkUwMEY1RkQ4ODAgQ0UzQ0RCNDAwRkJFMTI3MCBcCisgICAgICBFNEI0OUNDMDBDRUEyRDkwIDYzNDRBODgwMEE1QTdDQTAgMDhDOEZFODAwQTFGRkVFMCAyQkI5ODZDMDBCMEEwRTAwIFwKKyAgICAgIDUxNDg2RjgwMEU0NEUxOTAgOEJDQzY0ODAxMTNCMDU4MCBCNkY0RUMwMDBFRUIzNjMwIDQ0MTMxNzgwMEE1QjQ4QTAgXAorICAgICAgIiIiKQorCisKK2NsYXNzIFN1bmF1VUxBV1Rlc3QoU3VuYXVUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgc25kZmlsZW5hbWUgPSAncGx1Y2stdWxhdy5hdScKKyAgICBzbmRmaWxlbmZyYW1lcyA9IDMzMDcKKyAgICBuY2hhbm5lbHMgPSAyCisgICAgc2FtcHdpZHRoID0gMgorICAgIGZyYW1lcmF0ZSA9IDExMDI1CisgICAgbmZyYW1lcyA9IDQ4CisgICAgY29tcHR5cGUgPSAnVUxBVycKKyAgICBjb21wbmFtZSA9ICdDQ0lUVCBHLjcxMSB1LWxhdycKKyAgICBmcmFtZXMgPSBhdWRpb3Rlc3RzLmZyb21oZXgoIiIiXAorICAgICAgMDIyQ0ZGRTggNDk3QzAwRjQgMzA3QzA0REMgODI4NDA4M0MgQ0I4NDA2OUMgNDk3QzAzREMgQkU4NDAxQUMgMDM2Q0ZFNzQgXAorICAgICAgQjY4NEZBMjQgQjY4NEYzNDQgMkE3Q0VDMDQgMTlGQ0U3MDQgRUUwNEU1MDQgQzU4NEUyMDQgMEUzQ0UxMDQgRUYwNERGODQgXAorICAgICAgNTU3Q0UyMDQgRkIyNEU4MDQgMTJGQ0VGMDQgRDc4NEY3NDQgOTY4NEZCNjQgRjVDNEZDMjQgMDgzQ0ZCQTQgREY4NEZCMjQgXAorICAgICAgMTFGQ0ZBMjQgM0U3Q0ZCNjQgQkE4NEZDQjQgNjU3Q0ZGNUMgQ0Y4NDA0MUMgNDE3QzA5QkMgQzE4NDBFQkMgNTE3QzEyRkMgXAorICAgICAgRUYwNDE2RkMgODI4NDE1RkMgN0Q3QzEzRkMgODI4NDEyRkMgNDk3QzBFQkMgNTE3QzBEQkMgRjAwNDBGM0MgQ0Q4NDBGRkMgXAorICAgICAgRTUwNDBDQkMgNjE3QzBBM0MgMDhCQzBBM0MgMkM3QzBCM0MgNTE3QzBFM0MgOEE4NDEwRkMgQjY4NDBFQkMgNDU3QzBBM0MgXAorICAgICAgIiIiKQorICAgIGlmIHN5cy5ieXRlb3JkZXIgIT0gJ2JpZyc6CisgICAgICAgIGZyYW1lcyA9IGF1ZGlvdGVzdHMuYnl0ZXN3YXAyKGZyYW1lcykKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFN1bmF1UENNOFRlc3QsIFN1bmF1UENNMTZUZXN0LCBTdW5hdVBDTTE2VGVzdCwKKyAgICAgICAgICAgICAgICAgU3VuYXVQQ00zMlRlc3QsIFN1bmF1VUxBV1Rlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3VuZHJ5LnB5IGIvTGliL3Rlc3QvdGVzdF9zdW5kcnkucHkKaW5kZXggNmUyYjc5Ny4uNDZjYmFiNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdW5kcnkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zdW5kcnkucHkKQEAgLTQ5LDExICs0OSw5IEBACiAgICAgICAgICAgICBpbXBvcnQgZ2V0cGFzcwogICAgICAgICAgICAgaW1wb3J0IGh0bWxlbnRpdHlkZWZzCiAgICAgICAgICAgICBpbXBvcnQgaWhvb2tzCi0gICAgICAgICAgICBpbXBvcnQgaW1naGRyCiAgICAgICAgICAgICBpbXBvcnQgaW1wdXRpbAogICAgICAgICAgICAgaW1wb3J0IGtleXdvcmQKICAgICAgICAgICAgIGltcG9ydCBsaW5lY2FjaGUKLSAgICAgICAgICAgIGltcG9ydCBtYWN1cmwycGF0aAogICAgICAgICAgICAgaW1wb3J0IG1haWxjYXAKICAgICAgICAgICAgIGltcG9ydCBtaW1pZnkKICAgICAgICAgICAgIGltcG9ydCBubnRwbGliCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N1cHBvcnQucHkgYi9MaWIvdGVzdC90ZXN0X3N1cHBvcnQucHkKaW5kZXggYTAzY2YxNC4uNjk1YWM5NSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3VwcG9ydC5weQpAQCAtMTgsNiArMTgsOCBAQAogaW1wb3J0IFVzZXJEaWN0CiBpbXBvcnQgcmUKIGltcG9ydCB0aW1lCitpbXBvcnQgc3RydWN0CitpbXBvcnQgc3lzY29uZmlnCiB0cnk6CiAgICAgaW1wb3J0IHRocmVhZAogZXhjZXB0IEltcG9ydEVycm9yOgpAQCAtMzYsOCArMzgsOCBAQAogICAgICAgICAgICAiQmFzaWNUZXN0UnVubmVyIiwgInJ1bl91bml0dGVzdCIsICJydW5fZG9jdGVzdCIsICJ0aHJlYWRpbmdfc2V0dXAiLAogICAgICAgICAgICAidGhyZWFkaW5nX2NsZWFudXAiLCAicmVhcF9jaGlsZHJlbiIsICJjcHl0aG9uX29ubHkiLAogICAgICAgICAgICAiY2hlY2tfaW1wbF9kZXRhaWwiLCAiZ2V0X2F0dHJpYnV0ZSIsICJweTNrX2J5dGVzIiwKLSAgICAgICAgICAgImltcG9ydF9mcmVzaF9tb2R1bGUiXQotCisgICAgICAgICAgICJpbXBvcnRfZnJlc2hfbW9kdWxlIiwgInRocmVhZGluZ19jbGVhbnVwIiwgInJlYXBfY2hpbGRyZW4iLAorICAgICAgICAgICAic3RyaXBfcHl0aG9uX3N0ZGVyciJdCiAKIGNsYXNzIEVycm9yKEV4Y2VwdGlvbik6CiAgICAgIiIiQmFzZSBjbGFzcyBmb3IgcmVncmVzc2lvbiB0ZXN0IGV4Y2VwdGlvbnMuIiIiCkBAIC0xNzksMTUgKzE4MSw3OSBAQAogICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgcGFzcwogCitpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgid2luIik6CisgICAgZGVmIF93YWl0Zm9yKGZ1bmMsIHBhdGhuYW1lLCB3YWl0YWxsPUZhbHNlKToKKyAgICAgICAgIyBQZXJmb3JtIHRoZSBvcGVyYXRpb24KKyAgICAgICAgZnVuYyhwYXRobmFtZSkKKyAgICAgICAgIyBOb3cgc2V0dXAgdGhlIHdhaXQgbG9vcAorICAgICAgICBpZiB3YWl0YWxsOgorICAgICAgICAgICAgZGlybmFtZSA9IHBhdGhuYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkaXJuYW1lLCBuYW1lID0gb3MucGF0aC5zcGxpdChwYXRobmFtZSkKKyAgICAgICAgICAgIGRpcm5hbWUgPSBkaXJuYW1lIG9yICcuJworICAgICAgICAjIENoZWNrIGZvciBgcGF0aG5hbWVgIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KKyAgICAgICAgIyBUaGUgZXhwb25lbnRpYWwgYmFja29mZiBvZiB0aGUgdGltZW91dCBhbW91bnRzIHRvIGEgdG90YWwKKyAgICAgICAgIyBvZiB+MSBzZWNvbmQgYWZ0ZXIgd2hpY2ggdGhlIGRlbGV0aW9uIGlzIHByb2JhYmx5IGFuIGVycm9yCisgICAgICAgICMgYW55d2F5LgorICAgICAgICAjIFRlc3Rpbmcgb24gYSBpN0A0LjNHSHogc2hvd3MgdGhhdCB1c3VhbGx5IG9ubHkgMSBpdGVyYXRpb24gaXMKKyAgICAgICAgIyByZXF1aXJlZCB3aGVuIGNvbnRlbnRpb24gb2NjdXJzLgorICAgICAgICB0aW1lb3V0ID0gMC4wMDEKKyAgICAgICAgd2hpbGUgdGltZW91dCA8IDEuMDoKKyAgICAgICAgICAgICMgTm90ZSB3ZSBhcmUgb25seSB0ZXN0aW5nIGZvciB0aGUgZXhpc3RlbmNlIG9mIHRoZSBmaWxlKHMpIGluCisgICAgICAgICAgICAjIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0b3J5IHJlZ2FyZGxlc3Mgb2YgYW55IHNlY3VyaXR5IG9yCisgICAgICAgICAgICAjIGFjY2VzcyByaWdodHMuICBJZiB3ZSBoYXZlIG1hZGUgaXQgdGhpcyBmYXIsIHdlIGhhdmUgc3VmZmljaWVudAorICAgICAgICAgICAgIyBwZXJtaXNzaW9ucyB0byBkbyB0aGF0IG11Y2ggdXNpbmcgUHl0aG9uJ3MgZXF1aXZhbGVudCBvZiB0aGUKKyAgICAgICAgICAgICMgV2luZG93cyBBUEkgRmluZEZpcnN0RmlsZS4KKyAgICAgICAgICAgICMgT3RoZXIgV2luZG93cyBBUElzIGNhbiBmYWlsIG9yIGdpdmUgaW5jb3JyZWN0IHJlc3VsdHMgd2hlbgorICAgICAgICAgICAgIyBkZWFsaW5nIHdpdGggZmlsZXMgdGhhdCBhcmUgcGVuZGluZyBkZWxldGlvbi4KKyAgICAgICAgICAgIEwgPSBvcy5saXN0ZGlyKGRpcm5hbWUpCisgICAgICAgICAgICBpZiBub3QgKEwgaWYgd2FpdGFsbCBlbHNlIG5hbWUgaW4gTCk6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAjIEluY3JlYXNlIHRoZSB0aW1lb3V0IGFuZCB0cnkgYWdhaW4KKyAgICAgICAgICAgIHRpbWUuc2xlZXAodGltZW91dCkKKyAgICAgICAgICAgIHRpbWVvdXQgKj0gMgorICAgICAgICB3YXJuaW5ncy53YXJuKCd0ZXN0cyBtYXkgZmFpbCwgZGVsZXRlIHN0aWxsIHBlbmRpbmcgZm9yICcgKyBwYXRobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBSdW50aW1lV2FybmluZywgc3RhY2tsZXZlbD00KQorCisgICAgZGVmIF91bmxpbmsoZmlsZW5hbWUpOgorICAgICAgICBfd2FpdGZvcihvcy51bmxpbmssIGZpbGVuYW1lKQorCisgICAgZGVmIF9ybWRpcihkaXJuYW1lKToKKyAgICAgICAgX3dhaXRmb3Iob3Mucm1kaXIsIGRpcm5hbWUpCisKKyAgICBkZWYgX3JtdHJlZShwYXRoKToKKyAgICAgICAgZGVmIF9ybXRyZWVfaW5uZXIocGF0aCk6CisgICAgICAgICAgICBmb3IgbmFtZSBpbiBvcy5saXN0ZGlyKHBhdGgpOgorICAgICAgICAgICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKHBhdGgsIG5hbWUpCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmdWxsbmFtZSk6CisgICAgICAgICAgICAgICAgICAgIF93YWl0Zm9yKF9ybXRyZWVfaW5uZXIsIGZ1bGxuYW1lLCB3YWl0YWxsPVRydWUpCisgICAgICAgICAgICAgICAgICAgIG9zLnJtZGlyKGZ1bGxuYW1lKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhmdWxsbmFtZSkKKyAgICAgICAgX3dhaXRmb3IoX3JtdHJlZV9pbm5lciwgcGF0aCwgd2FpdGFsbD1UcnVlKQorICAgICAgICBfd2FpdGZvcihvcy5ybWRpciwgcGF0aCkKK2Vsc2U6CisgICAgX3VubGluayA9IG9zLnVubGluaworICAgIF9ybWRpciA9IG9zLnJtZGlyCisgICAgX3JtdHJlZSA9IHNodXRpbC5ybXRyZWUKKwogZGVmIHVubGluayhmaWxlbmFtZSk6CiAgICAgdHJ5OgotICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUpCisgICAgICAgIF91bmxpbmsoZmlsZW5hbWUpCiAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgIHBhc3MKIAorZGVmIHJtZGlyKGRpcm5hbWUpOgorICAgIHRyeToKKyAgICAgICAgX3JtZGlyKGRpcm5hbWUpCisgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXJyb3I6CisgICAgICAgICMgVGhlIGRpcmVjdG9yeSBuZWVkIG5vdCBleGlzdC4KKyAgICAgICAgaWYgZXJyb3IuZXJybm8gIT0gZXJybm8uRU5PRU5UOgorICAgICAgICAgICAgcmFpc2UKKwogZGVmIHJtdHJlZShwYXRoKToKICAgICB0cnk6Ci0gICAgICAgIHNodXRpbC5ybXRyZWUocGF0aCkKKyAgICAgICAgX3JtdHJlZShwYXRoKQogICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgogICAgICAgICAjIFVuaXggcmV0dXJucyBFTk9FTlQsIFdpbmRvd3MgcmV0dXJucyBFU1JDSC4KICAgICAgICAgaWYgZS5lcnJubyBub3QgaW4gKGVycm5vLkVOT0VOVCwgZXJybm8uRVNSQ0gpOgpAQCAtMjA0LDI2ICsyNzAsMTA0IEBACiAgICAgICAgICMgaXMgZXhpdGVkKSBidXQgdGhlcmUgaXMgYSAucHlvIGZpbGUuCiAgICAgICAgIHVubGluayhvcy5wYXRoLmpvaW4oZGlybmFtZSwgbW9kbmFtZSArIG9zLmV4dHNlcCArICdweW8nKSkKIAorIyBDaGVjayB3aGV0aGVyIGEgZ3VpIGlzIGFjdHVhbGx5IGF2YWlsYWJsZQorZGVmIF9pc19ndWlfYXZhaWxhYmxlKCk6CisgICAgaWYgaGFzYXR0cihfaXNfZ3VpX2F2YWlsYWJsZSwgJ3Jlc3VsdCcpOgorICAgICAgICByZXR1cm4gX2lzX2d1aV9hdmFpbGFibGUucmVzdWx0CisgICAgcmVhc29uID0gTm9uZQorICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCd3aW4nKToKKyAgICAgICAgIyBpZiBQeXRob24gaXMgcnVubmluZyBhcyBhIHNlcnZpY2UgKHN1Y2ggYXMgdGhlIGJ1aWxkYm90IHNlcnZpY2UpLAorICAgICAgICAjIGd1aSBpbnRlcmFjdGlvbiBtYXkgYmUgZGlzYWxsb3dlZAorICAgICAgICBpbXBvcnQgY3R5cGVzCisgICAgICAgIGltcG9ydCBjdHlwZXMud2ludHlwZXMKKyAgICAgICAgVU9JX0ZMQUdTID0gMQorICAgICAgICBXU0ZfVklTSUJMRSA9IDB4MDAwMQorICAgICAgICBjbGFzcyBVU0VST0JKRUNURkxBR1MoY3R5cGVzLlN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImZJbmhlcml0IiwgY3R5cGVzLndpbnR5cGVzLkJPT0wpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJmUmVzZXJ2ZWQiLCBjdHlwZXMud2ludHlwZXMuQk9PTCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImR3RmxhZ3MiLCBjdHlwZXMud2ludHlwZXMuRFdPUkQpXQorICAgICAgICBkbGwgPSBjdHlwZXMud2luZGxsLnVzZXIzMgorICAgICAgICBoID0gZGxsLkdldFByb2Nlc3NXaW5kb3dTdGF0aW9uKCkKKyAgICAgICAgaWYgbm90IGg6CisgICAgICAgICAgICByYWlzZSBjdHlwZXMuV2luRXJyb3IoKQorICAgICAgICB1b2YgPSBVU0VST0JKRUNURkxBR1MoKQorICAgICAgICBuZWVkZWQgPSBjdHlwZXMud2ludHlwZXMuRFdPUkQoKQorICAgICAgICByZXMgPSBkbGwuR2V0VXNlck9iamVjdEluZm9ybWF0aW9uVyhoLAorICAgICAgICAgICAgVU9JX0ZMQUdTLAorICAgICAgICAgICAgY3R5cGVzLmJ5cmVmKHVvZiksCisgICAgICAgICAgICBjdHlwZXMuc2l6ZW9mKHVvZiksCisgICAgICAgICAgICBjdHlwZXMuYnlyZWYobmVlZGVkKSkKKyAgICAgICAgaWYgbm90IHJlczoKKyAgICAgICAgICAgIHJhaXNlIGN0eXBlcy5XaW5FcnJvcigpCisgICAgICAgIGlmIG5vdCBib29sKHVvZi5kd0ZsYWdzICYgV1NGX1ZJU0lCTEUpOgorICAgICAgICAgICAgcmVhc29uID0gImd1aSBub3QgYXZhaWxhYmxlIChXU0ZfVklTSUJMRSBmbGFnIG5vdCBzZXQpIgorICAgIGVsaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgICAjIFRoZSBBcXVhIFRrIGltcGxlbWVudGF0aW9ucyBvbiBPUyBYIGNhbiBhYm9ydCB0aGUgcHJvY2VzcyBpZgorICAgICAgICAjIGJlaW5nIGNhbGxlZCBpbiBhbiBlbnZpcm9ubWVudCB3aGVyZSBhIHdpbmRvdyBzZXJ2ZXIgY29ubmVjdGlvbgorICAgICAgICAjIGNhbm5vdCBiZSBtYWRlLCBmb3IgaW5zdGFuY2Ugd2hlbiBpbnZva2VkIGJ5IGEgYnVpbGRib3Qgb3Igc3NoCisgICAgICAgICMgcHJvY2VzcyBub3QgcnVubmluZyB1bmRlciB0aGUgc2FtZSB1c2VyIGlkIGFzIHRoZSBjdXJyZW50IGNvbnNvbGUKKyAgICAgICAgIyB1c2VyLiAgVG8gYXZvaWQgdGhhdCwgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZSB3aW5kb3cgbWFuYWdlcgorICAgICAgICAjIGNvbm5lY3Rpb24gaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNkbGwsIGNfaW50LCBwb2ludGVyLCBTdHJ1Y3R1cmUKKyAgICAgICAgZnJvbSBjdHlwZXMudXRpbCBpbXBvcnQgZmluZF9saWJyYXJ5CisKKyAgICAgICAgYXBwX3NlcnZpY2VzID0gY2RsbC5Mb2FkTGlicmFyeShmaW5kX2xpYnJhcnkoIkFwcGxpY2F0aW9uU2VydmljZXMiKSkKKworICAgICAgICBpZiBhcHBfc2VydmljZXMuQ0dNYWluRGlzcGxheUlEKCkgPT0gMDoKKyAgICAgICAgICAgIHJlYXNvbiA9ICJndWkgdGVzdHMgY2Fubm90IHJ1biB3aXRob3V0IE9TIFggd2luZG93IG1hbmFnZXIiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjbGFzcyBQcm9jZXNzU2VyaWFsTnVtYmVyKFN0cnVjdHVyZSk6CisgICAgICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJoaWdoTG9uZ09mUFNOIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgibG93TG9uZ09mUFNOIiwgY19pbnQpXQorICAgICAgICAgICAgcHNuID0gUHJvY2Vzc1NlcmlhbE51bWJlcigpCisgICAgICAgICAgICBwc25fcCA9IHBvaW50ZXIocHNuKQorICAgICAgICAgICAgaWYgKCAgKGFwcF9zZXJ2aWNlcy5HZXRDdXJyZW50UHJvY2Vzcyhwc25fcCkgPCAwKSBvcgorICAgICAgICAgICAgICAgICAgKGFwcF9zZXJ2aWNlcy5TZXRGcm9udFByb2Nlc3MocHNuX3ApIDwgMCkgKToKKyAgICAgICAgICAgICAgICByZWFzb24gPSAiY2Fubm90IHJ1biB3aXRob3V0IE9TIFggZ3VpIHByb2Nlc3MiCisKKyAgICAjIGNoZWNrIG9uIGV2ZXJ5IHBsYXRmb3JtIHdoZXRoZXIgdGtpbnRlciBjYW4gYWN0dWFsbHkgZG8gYW55dGhpbmcKKyAgICAjIGJ1dCBza2lwIHRoZSB0ZXN0IG9uIE9TIFggYmVjYXVzZSBpdCBjYW4gY2F1c2Ugc2VnZmF1bHRzIGluIENvY29hIFRrCisgICAgIyB3aGVuIHJ1bm5pbmcgcmVncnRlc3Qgd2l0aCB0aGUgLWogb3B0aW9uIChtdWx0aXBsZSB0aHJlYWRzL3N1YnByb2Nlc3NlcykKKyAgICBpZiAobm90IHJlYXNvbikgYW5kIChzeXMucGxhdGZvcm0gIT0gJ2RhcndpbicpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIFRraW50ZXIgaW1wb3J0IFRrCisgICAgICAgICAgICByb290ID0gVGsoKQorICAgICAgICAgICAgcm9vdC5kZXN0cm95KCkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgZXJyX3N0cmluZyA9IHN0cihlKQorICAgICAgICAgICAgaWYgbGVuKGVycl9zdHJpbmcpID4gNTA6CisgICAgICAgICAgICAgICAgZXJyX3N0cmluZyA9IGVycl9zdHJpbmdbOjUwXSArICcgWy4uLl0nCisgICAgICAgICAgICByZWFzb24gPSAnVGsgdW5hdmFpbGFibGUgZHVlIHRvIHt9OiB7fScuZm9ybWF0KHR5cGUoZSkuX19uYW1lX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycl9zdHJpbmcpCisKKyAgICBfaXNfZ3VpX2F2YWlsYWJsZS5yZWFzb24gPSByZWFzb24KKyAgICBfaXNfZ3VpX2F2YWlsYWJsZS5yZXN1bHQgPSBub3QgcmVhc29uCisKKyAgICByZXR1cm4gX2lzX2d1aV9hdmFpbGFibGUucmVzdWx0CisKIGRlZiBpc19yZXNvdXJjZV9lbmFibGVkKHJlc291cmNlKToKLSAgICAiIiJUZXN0IHdoZXRoZXIgYSByZXNvdXJjZSBpcyBlbmFibGVkLiAgS25vd24gcmVzb3VyY2VzIGFyZSBzZXQgYnkKLSAgICByZWdydGVzdC5weS4iIiIKLSAgICByZXR1cm4gdXNlX3Jlc291cmNlcyBpcyBub3QgTm9uZSBhbmQgcmVzb3VyY2UgaW4gdXNlX3Jlc291cmNlcworICAgICIiIlRlc3Qgd2hldGhlciBhIHJlc291cmNlIGlzIGVuYWJsZWQuCisKKyAgICBLbm93biByZXNvdXJjZXMgYXJlIHNldCBieSByZWdydGVzdC5weS4gIElmIG5vdCBydW5uaW5nIHVuZGVyIHJlZ3J0ZXN0LnB5LAorICAgIGFsbCByZXNvdXJjZXMgYXJlIGFzc3VtZWQgZW5hYmxlZCB1bmxlc3MgdXNlX3Jlc291cmNlcyBoYXMgYmVlbiBzZXQuCisgICAgIiIiCisgICAgcmV0dXJuIHVzZV9yZXNvdXJjZXMgaXMgTm9uZSBvciByZXNvdXJjZSBpbiB1c2VfcmVzb3VyY2VzCiAKIGRlZiByZXF1aXJlcyhyZXNvdXJjZSwgbXNnPU5vbmUpOgotICAgICIiIlJhaXNlIFJlc291cmNlRGVuaWVkIGlmIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgaXMgbm90IGF2YWlsYWJsZS4KLQotICAgIElmIHRoZSBjYWxsZXIncyBtb2R1bGUgaXMgX19tYWluX18gdGhlbiBhdXRvbWF0aWNhbGx5IHJldHVybiBUcnVlLiAgVGhlCi0gICAgcG9zc2liaWxpdHkgb2YgRmFsc2UgYmVpbmcgcmV0dXJuZWQgb2NjdXJzIHdoZW4gcmVncnRlc3QucHkgaXMgZXhlY3V0aW5nLiIiIgotICAgICMgc2VlIGlmIHRoZSBjYWxsZXIncyBtb2R1bGUgaXMgX19tYWluX18gLSBpZiBzbywgdHJlYXQgYXMgaWYKLSAgICAjIHRoZSByZXNvdXJjZSB3YXMgc2V0Ci0gICAgaWYgc3lzLl9nZXRmcmFtZSgxKS5mX2dsb2JhbHMuZ2V0KCJfX25hbWVfXyIpID09ICJfX21haW5fXyI6Ci0gICAgICAgIHJldHVybgorICAgICIiIlJhaXNlIFJlc291cmNlRGVuaWVkIGlmIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgaXMgbm90IGF2YWlsYWJsZS4iIiIKKyAgICBpZiByZXNvdXJjZSA9PSAnZ3VpJyBhbmQgbm90IF9pc19ndWlfYXZhaWxhYmxlKCk6CisgICAgICAgIHJhaXNlIFJlc291cmNlRGVuaWVkKF9pc19ndWlfYXZhaWxhYmxlLnJlYXNvbikKICAgICBpZiBub3QgaXNfcmVzb3VyY2VfZW5hYmxlZChyZXNvdXJjZSk6CiAgICAgICAgIGlmIG1zZyBpcyBOb25lOgogICAgICAgICAgICAgbXNnID0gIlVzZSBvZiB0aGUgYCVzJyByZXNvdXJjZSBub3QgZW5hYmxlZCIgJSByZXNvdXJjZQogICAgICAgICByYWlzZSBSZXNvdXJjZURlbmllZChtc2cpCiAKLUhPU1QgPSAnbG9jYWxob3N0JworCisjIERvbid0IHVzZSAibG9jYWxob3N0Iiwgc2luY2UgcmVzb2x2aW5nIGl0IHVzZXMgdGhlIEROUyB1bmRlciByZWNlbnQKKyMgV2luZG93cyB2ZXJzaW9ucyAoc2VlIGlzc3VlICMxODc5MikuCitIT1NUID0gIjEyNy4wLjAuMSIKK0hPU1R2NiA9ICI6OjEiCisKIAogZGVmIGZpbmRfdW51c2VkX3BvcnQoZmFtaWx5PXNvY2tldC5BRl9JTkVULCBzb2NrdHlwZT1zb2NrZXQuU09DS19TVFJFQU0pOgogICAgICIiIlJldHVybnMgYW4gdW51c2VkIHBvcnQgdGhhdCBzaG91bGQgYmUgc3VpdGFibGUgZm9yIGJpbmRpbmcuICBUaGlzIGlzCkBAIC0zMDUsOSArNDQ5LDE1IEBACiAgICAgICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCgidGVzdHMgc2hvdWxkIG5ldmVyIHNldCB0aGUgU09fUkVVU0VBRERSICIgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic29ja2V0IG9wdGlvbiBvbiBUQ1AvSVAgc29ja2V0cyEiKQogICAgICAgICBpZiBoYXNhdHRyKHNvY2tldCwgJ1NPX1JFVVNFUE9SVCcpOgotICAgICAgICAgICAgaWYgc29jay5nZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fUkVVU0VQT1JUKSA9PSAxOgotICAgICAgICAgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoInRlc3RzIHNob3VsZCBuZXZlciBzZXQgdGhlIFNPX1JFVVNFUE9SVCAiICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvY2tldCBvcHRpb24gb24gVENQL0lQIHNvY2tldHMhIikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiBzb2NrLmdldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19SRVVTRVBPUlQpID09IDE6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoInRlc3RzIHNob3VsZCBuZXZlciBzZXQgdGhlIFNPX1JFVVNFUE9SVCAiICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb2NrZXQgb3B0aW9uIG9uIFRDUC9JUCBzb2NrZXRzISIpCisgICAgICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvcjoKKyAgICAgICAgICAgICAgICAjIFB5dGhvbidzIHNvY2tldCBtb2R1bGUgd2FzIGNvbXBpbGVkIHVzaW5nIG1vZGVybiBoZWFkZXJzCisgICAgICAgICAgICAgICAgIyB0aHVzIGRlZmluaW5nIFNPX1JFVVNFUE9SVCBidXQgdGhpcyBwcm9jZXNzIGlzIHJ1bm5pbmcKKyAgICAgICAgICAgICAgICAjIHVuZGVyIGFuIG9sZGVyIGtlcm5lbCB0aGF0IGRvZXMgbm90IHN1cHBvcnQgU09fUkVVU0VQT1JULgorICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgaWYgaGFzYXR0cihzb2NrZXQsICdTT19FWENMVVNJVkVBRERSVVNFJyk6CiAgICAgICAgICAgICBzb2NrLnNldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19FWENMVVNJVkVBRERSVVNFLCAxKQogCkBAIC0zMzMsMTMgKzQ4Myw3OSBAQAogICAgICAgICByZXR1cm4gKGxlbih4KSA+IGxlbih5KSkgLSAobGVuKHgpIDwgbGVuKHkpKQogICAgIHJldHVybiAoeCA+IHkpIC0gKHggPCB5KQogCisKKyMgQSBjb25zdGFudCBsaWtlbHkgbGFyZ2VyIHRoYW4gdGhlIHVuZGVybHlpbmcgT1MgcGlwZSBidWZmZXIgc2l6ZSwgdG8KKyMgbWFrZSB3cml0ZXMgYmxvY2tpbmcuCisjIFdpbmRvd3MgbGltaXQgc2VlbXMgdG8gYmUgYXJvdW5kIDUxMiBCLCBhbmQgbWFueSBVbml4IGtlcm5lbHMgaGF2ZSBhCisjIDY0IEtpQiBwaXBlIGJ1ZmZlciBzaXplIG9yIDE2ICogUEFHRV9TSVpFOiB0YWtlIGEgZmV3IG1lZ3MgdG8gYmUgc3VyZS4KKyMgKHNlZSBpc3N1ZSAjMTc4MzUgZm9yIGEgZGlzY3Vzc2lvbiBvZiB0aGlzIG51bWJlcikuCitQSVBFX01BWF9TSVpFID0gNCAqIDEwMjQgKiAxMDI0ICsgMQorCisjIEEgY29uc3RhbnQgbGlrZWx5IGxhcmdlciB0aGFuIHRoZSB1bmRlcmx5aW5nIE9TIHNvY2tldCBidWZmZXIgc2l6ZSwgdG8gbWFrZQorIyB3cml0ZXMgYmxvY2tpbmcuCisjIFRoZSBzb2NrZXQgYnVmZmVyIHNpemVzIGNhbiB1c3VhbGx5IGJlIHR1bmVkIHN5c3RlbS13aWRlIChlLmcuIHRocm91Z2ggc3lzY3RsCisjIG9uIExpbnV4KSwgb3Igb24gYSBwZXItc29ja2V0IGJhc2lzIChTT19TTkRCVUYvU09fUkNWQlVGKS4gU2VlIGlzc3VlICMxODY0MworIyBmb3IgYSBkaXNjdXNzaW9uIG9mIHRoaXMgbnVtYmVyKS4KK1NPQ0tfTUFYX1NJWkUgPSAxNiAqIDEwMjQgKiAxMDI0ICsgMQorCitpc19qeXRob24gPSBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpCisKIHRyeToKICAgICB1bmljb2RlCiAgICAgaGF2ZV91bmljb2RlID0gVHJ1ZQogZXhjZXB0IE5hbWVFcnJvcjoKICAgICBoYXZlX3VuaWNvZGUgPSBGYWxzZQogCi1pc19qeXRob24gPSBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpCityZXF1aXJlc191bmljb2RlID0gdW5pdHRlc3Quc2tpcFVubGVzcyhoYXZlX3VuaWNvZGUsICdubyB1bmljb2RlIHN1cHBvcnQnKQorCitkZWYgdShzKToKKyAgICByZXR1cm4gdW5pY29kZShzLCAndW5pY29kZS1lc2NhcGUnKQorCisjIEZTX05PTkFTQ0lJOiBub24tQVNDSUkgVW5pY29kZSBjaGFyYWN0ZXIgZW5jb2RhYmxlIGJ5CisjIHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSwgb3IgTm9uZSBpZiB0aGVyZSBpcyBubyBzdWNoIGNoYXJhY3Rlci4KK0ZTX05PTkFTQ0lJID0gTm9uZQoraWYgaGF2ZV91bmljb2RlOgorICAgIGZvciBjaGFyYWN0ZXIgaW4gKAorICAgICAgICAjIEZpcnN0IHRyeSBwcmludGFibGUgYW5kIGNvbW1vbiBjaGFyYWN0ZXJzIHRvIGhhdmUgYSByZWFkYWJsZSBmaWxlbmFtZS4KKyAgICAgICAgIyBGb3IgZWFjaCBjaGFyYWN0ZXIsIHRoZSBlbmNvZGluZyBsaXN0IGFyZSBqdXN0IGV4YW1wbGUgb2YgZW5jb2RpbmdzIGFibGUKKyAgICAgICAgIyB0byBlbmNvZGUgdGhlIGNoYXJhY3RlciAodGhlIGxpc3QgaXMgbm90IGV4aGF1c3RpdmUpLgorCisgICAgICAgICMgVSswMEU2IChMYXRpbiBTbWFsbCBMZXR0ZXIgQWUpOiBjcDEyNTIsIGlzby04ODU5LTEKKyAgICAgICAgdW5pY2hyKDB4MDBFNiksCisgICAgICAgICMgVSswMTMwIChMYXRpbiBDYXBpdGFsIExldHRlciBJIFdpdGggRG90IEFib3ZlKTogY3AxMjU0LCBpc284ODU5XzMKKyAgICAgICAgdW5pY2hyKDB4MDEzMCksCisgICAgICAgICMgVSswMTQxIChMYXRpbiBDYXBpdGFsIExldHRlciBMIFdpdGggU3Ryb2tlKTogY3AxMjUwLCBjcDEyNTcKKyAgICAgICAgdW5pY2hyKDB4MDE0MSksCisgICAgICAgICMgVSswM0M2IChHcmVlayBTbWFsbCBMZXR0ZXIgUGhpKTogY3AxMjUzCisgICAgICAgIHVuaWNocigweDAzQzYpLAorICAgICAgICAjIFUrMDQxQSAoQ3lyaWxsaWMgQ2FwaXRhbCBMZXR0ZXIgS2EpOiBjcDEyNTEKKyAgICAgICAgdW5pY2hyKDB4MDQxQSksCisgICAgICAgICMgVSswNUQwIChIZWJyZXcgTGV0dGVyIEFsZWYpOiBFbmNvZGFibGUgdG8gY3A0MjQKKyAgICAgICAgdW5pY2hyKDB4MDVEMCksCisgICAgICAgICMgVSswNjBDIChBcmFiaWMgQ29tbWEpOiBjcDg2NCwgY3AxMDA2LCBpc284ODU5XzYsIG1hY19hcmFiaWMKKyAgICAgICAgdW5pY2hyKDB4MDYwQyksCisgICAgICAgICMgVSswNjJBIChBcmFiaWMgTGV0dGVyIFRlaCk6IGNwNzIwCisgICAgICAgIHVuaWNocigweDA2MkEpLAorICAgICAgICAjIFUrMEUwMSAoVGhhaSBDaGFyYWN0ZXIgS28gS2FpKTogY3A4NzQKKyAgICAgICAgdW5pY2hyKDB4MEUwMSksCisKKyAgICAgICAgIyBUaGVuIHRyeSBtb3JlICJzcGVjaWFsIiBjaGFyYWN0ZXJzLiAic3BlY2lhbCIgYmVjYXVzZSB0aGV5IG1heSBiZQorICAgICAgICAjIGludGVycHJldGVkIG9yIGRpc3BsYXllZCBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24gdGhlIGV4YWN0IGxvY2FsZQorICAgICAgICAjIGVuY29kaW5nIGFuZCB0aGUgZm9udC4KKworICAgICAgICAjIFUrMDBBMCAoTm8tQnJlYWsgU3BhY2UpCisgICAgICAgIHVuaWNocigweDAwQTApLAorICAgICAgICAjIFUrMjBBQyAoRXVybyBTaWduKQorICAgICAgICB1bmljaHIoMHgyMEFDKSwKKyAgICApOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjaGFyYWN0ZXIuZW5jb2RlKHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSlcCisgICAgICAgICAgICAgICAgICAgICAuZGVjb2RlKHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSkKKyAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEZTX05PTkFTQ0lJID0gY2hhcmFjdGVyCisgICAgICAgICAgICBicmVhawogCiAjIEZpbGVuYW1lIHVzZWQgZm9yIHRlc3RpbmcKIGlmIG9zLm5hbWUgPT0gJ2phdmEnOgpAQCAtNDA1LDcgKzYyMSw3IEBACiAgICAgdGhlIENXRCwgYW4gZXJyb3IgaXMgcmFpc2VkLiAgSWYgaXQncyBUcnVlLCBvbmx5IGEgd2FybmluZyBpcyByYWlzZWQKICAgICBhbmQgdGhlIG9yaWdpbmFsIENXRCBpcyB1c2VkLgogICAgICIiIgotICAgIGlmIGlzaW5zdGFuY2UobmFtZSwgdW5pY29kZSk6CisgICAgaWYgaGF2ZV91bmljb2RlIGFuZCBpc2luc3RhbmNlKG5hbWUsIHVuaWNvZGUpOgogICAgICAgICB0cnk6CiAgICAgICAgICAgICBuYW1lID0gbmFtZS5lbmNvZGUoc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpIG9yICdhc2NpaScpCiAgICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CkBAIC03NjcsNiArOTgzLDkgQEAKICAgICAgICAgKCdFQUlfRkFJTCcsIC00KSwKICAgICAgICAgKCdFQUlfTk9OQU1FJywgLTIpLAogICAgICAgICAoJ0VBSV9OT0RBVEEnLCAtNSksCisgICAgICAgICMgV2luZG93cyBkZWZpbmVzIEVBSV9OT0RBVEEgYXMgMTEwMDEgYnV0IGlkaW90aWMgZ2V0YWRkcmluZm8oKQorICAgICAgICAjIGltcGxlbWVudGF0aW9uIGFjdHVhbGx5IHJldHVybnMgV1NBTk9fREFUQSBpLmUuIDExMDA0LgorICAgICAgICAoJ1dTQU5PX0RBVEEnLCAxMTAwNCksCiAgICAgXQogCiAgICAgZGVuaWVkID0gUmVzb3VyY2VEZW5pZWQoIlJlc291cmNlICclcycgaXMgbm90IGF2YWlsYWJsZSIgJSByZXNvdXJjZV9uYW1lKQpAQCAtODU4LDYgKzEwNzcsMzMgQEAKICAgICBnYy5jb2xsZWN0KCkKIAogCitfaGVhZGVyID0gJzJQJworaWYgaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50Iik6CisgICAgX2hlYWRlciA9ICcyUCcgKyBfaGVhZGVyCitfdmhlYWRlciA9IF9oZWFkZXIgKyAnUCcKKworZGVmIGNhbGNvYmpzaXplKGZtdCk6CisgICAgcmV0dXJuIHN0cnVjdC5jYWxjc2l6ZShfaGVhZGVyICsgZm10ICsgJzBQJykKKworZGVmIGNhbGN2b2Jqc2l6ZShmbXQpOgorICAgIHJldHVybiBzdHJ1Y3QuY2FsY3NpemUoX3ZoZWFkZXIgKyBmbXQgKyAnMFAnKQorCisKK19UUEZMQUdTX0hBVkVfR0MgPSAxPDwxNAorX1RQRkxBR1NfSEVBUFRZUEUgPSAxPDw5CisKK2RlZiBjaGVja19zaXplb2YodGVzdCwgbywgc2l6ZSk6CisgICAgaW1wb3J0IF90ZXN0Y2FwaQorICAgIHJlc3VsdCA9IHN5cy5nZXRzaXplb2YobykKKyAgICAjIGFkZCBHQyBoZWFkZXIgc2l6ZQorICAgIGlmICgodHlwZShvKSA9PSB0eXBlKSBhbmQgKG8uX19mbGFnc19fICYgX1RQRkxBR1NfSEVBUFRZUEUpIG9yXAorICAgICAgICAoKHR5cGUobykgIT0gdHlwZSkgYW5kICh0eXBlKG8pLl9fZmxhZ3NfXyAmIF9UUEZMQUdTX0hBVkVfR0MpKSk6CisgICAgICAgIHNpemUgKz0gX3Rlc3RjYXBpLlNJWkVPRl9QWUdDX0hFQUQKKyAgICBtc2cgPSAnd3Jvbmcgc2l6ZSBmb3IgJXM6IGdvdCAlZCwgZXhwZWN0ZWQgJWQnIFwKKyAgICAgICAgICAgICUgKHR5cGUobyksIHJlc3VsdCwgc2l6ZSkKKyAgICB0ZXN0LmFzc2VydEVxdWFsKHJlc3VsdCwgc2l6ZSwgbXNnKQorCisKICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIyBEZWNvcmF0b3IgZm9yIHJ1bm5pbmcgYSBmdW5jdGlvbiBpbiBhIGRpZmZlcmVudCBsb2NhbGUsIGNvcnJlY3RseSByZXNldHRpbmcKICMgaXQgYWZ0ZXJ3YXJkcy4KQEAgLTk2Niw3ICsxMjEyLDcgQEAKICAgICAgICAgcmV0dXJuIHdyYXBwZXIKICAgICByZXR1cm4gZGVjb3JhdG9yCiAKLWRlZiBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemUsIG1lbXVzZSwgb3ZlcmhlYWQ9NSpfMU0pOgorZGVmIHByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZSwgbWVtdXNlLCBvdmVyaGVhZD01Kl8xTSwgZHJ5X3J1bj1UcnVlKToKICAgICBkZWYgZGVjb3JhdG9yKGYpOgogICAgICAgICBkZWYgd3JhcHBlcihzZWxmKToKICAgICAgICAgICAgIGlmIG5vdCByZWFsX21heF9tZW11c2U6CkBAIC05NzQsMTEgKzEyMjAsMTIgQEAKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgbWF4c2l6ZSA9IHNpemUKIAotICAgICAgICAgICAgICAgIGlmIHJlYWxfbWF4X21lbXVzZSBhbmQgcmVhbF9tYXhfbWVtdXNlIDwgbWF4c2l6ZSAqIG1lbXVzZToKLSAgICAgICAgICAgICAgICAgICAgaWYgdmVyYm9zZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIlNraXBwaW5nICVzIGJlY2F1c2Ugb2YgbWVtb3J5ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnN0cmFpbnRcbiIgJSAoZi5fX25hbWVfXywpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmICgocmVhbF9tYXhfbWVtdXNlIG9yIG5vdCBkcnlfcnVuKQorICAgICAgICAgICAgICAgIGFuZCByZWFsX21heF9tZW11c2UgPCBtYXhzaXplICogbWVtdXNlKToKKyAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJTa2lwcGluZyAlcyBiZWNhdXNlIG9mIG1lbW9yeSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnN0cmFpbnRcbiIgJSAoZi5fX25hbWVfXywpKQorICAgICAgICAgICAgICAgIHJldHVybgogCiAgICAgICAgICAgICByZXR1cm4gZihzZWxmLCBtYXhzaXplKQogICAgICAgICB3cmFwcGVyLnNpemUgPSBzaXplCkBAIC0xMDExLDYgKzEyNTgsOCBAQAogICAgIHJldHVybiBvYmoKIAogZGVmIHJlcXVpcmVzX3Jlc291cmNlKHJlc291cmNlKToKKyAgICBpZiByZXNvdXJjZSA9PSAnZ3VpJyBhbmQgbm90IF9pc19ndWlfYXZhaWxhYmxlKCk6CisgICAgICAgIHJldHVybiB1bml0dGVzdC5za2lwKF9pc19ndWlfYXZhaWxhYmxlLnJlYXNvbikKICAgICBpZiBpc19yZXNvdXJjZV9lbmFibGVkKHJlc291cmNlKToKICAgICAgICAgcmV0dXJuIF9pZAogICAgIGVsc2U6CkBAIC0xMDkzLDYgKzEzNDIsMTYgQEAKICAgICAgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKGNscykpCiAgICAgX3J1bl9zdWl0ZShzdWl0ZSkKIAorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIENoZWNrIGZvciB0aGUgcHJlc2VuY2Ugb2YgZG9jc3RyaW5ncy4KKworSEFWRV9ET0NTVFJJTkdTID0gKGNoZWNrX2ltcGxfZGV0YWlsKGNweXRob249RmFsc2UpIG9yCisgICAgICAgICAgICAgICAgICAgc3lzLnBsYXRmb3JtID09ICd3aW4zMicgb3IKKyAgICAgICAgICAgICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1dJVEhfRE9DX1NUUklOR1MnKSkKKworcmVxdWlyZXNfZG9jc3RyaW5ncyA9IHVuaXR0ZXN0LnNraXBVbmxlc3MoSEFWRV9ET0NTVFJJTkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QgcmVxdWlyZXMgZG9jc3RyaW5ncyIpCisKIAogIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjIGRvY3Rlc3QgZHJpdmVyLgpAQCAtMTE5Miw2ICsxNDUxLDMzIEBACiAgICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICAgYnJlYWsKIAorQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKK2RlZiBzd2FwX2F0dHIob2JqLCBhdHRyLCBuZXdfdmFsKToKKyAgICAiIiJUZW1wb3Jhcnkgc3dhcCBvdXQgYW4gYXR0cmlidXRlIHdpdGggYSBuZXcgb2JqZWN0LgorCisgICAgVXNhZ2U6CisgICAgICAgIHdpdGggc3dhcF9hdHRyKG9iaiwgImF0dHIiLCA1KToKKyAgICAgICAgICAgIC4uLgorCisgICAgICAgIFRoaXMgd2lsbCBzZXQgb2JqLmF0dHIgdG8gNSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB3aXRoOiBibG9jaywKKyAgICAgICAgcmVzdG9yaW5nIHRoZSBvbGQgdmFsdWUgYXQgdGhlIGVuZCBvZiB0aGUgYmxvY2suIElmIGBhdHRyYCBkb2Vzbid0CisgICAgICAgIGV4aXN0IG9uIGBvYmpgLCBpdCB3aWxsIGJlIGNyZWF0ZWQgYW5kIHRoZW4gZGVsZXRlZCBhdCB0aGUgZW5kIG9mIHRoZQorICAgICAgICBibG9jay4KKyAgICAiIiIKKyAgICBpZiBoYXNhdHRyKG9iaiwgYXR0cik6CisgICAgICAgIHJlYWxfdmFsID0gZ2V0YXR0cihvYmosIGF0dHIpCisgICAgICAgIHNldGF0dHIob2JqLCBhdHRyLCBuZXdfdmFsKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB5aWVsZAorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2V0YXR0cihvYmosIGF0dHIsIHJlYWxfdmFsKQorICAgIGVsc2U6CisgICAgICAgIHNldGF0dHIob2JqLCBhdHRyLCBuZXdfdmFsKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB5aWVsZAorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGVsYXR0cihvYmosIGF0dHIpCisKIGRlZiBweTNrX2J5dGVzKGIpOgogICAgICIiIkVtdWxhdGUgdGhlIHB5M2sgYnl0ZXMoKSBjb25zdHJ1Y3Rvci4KIApAQCAtMTIxMCwyMiArMTQ5Niw4IEBACiBkZWYgYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCk6CiAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHJlcHJvZHVjaW5nIHRoZSBjdXJyZW50CiAgICAgc2V0dGluZ3MgaW4gc3lzLmZsYWdzLiIiIgotICAgIGZsYWdfb3B0X21hcCA9IHsKLSAgICAgICAgJ2J5dGVzX3dhcm5pbmcnOiAnYicsCi0gICAgICAgICdkb250X3dyaXRlX2J5dGVjb2RlJzogJ0InLAotICAgICAgICAnaWdub3JlX2Vudmlyb25tZW50JzogJ0UnLAotICAgICAgICAnbm9fdXNlcl9zaXRlJzogJ3MnLAotICAgICAgICAnbm9fc2l0ZSc6ICdTJywKLSAgICAgICAgJ29wdGltaXplJzogJ08nLAotICAgICAgICAncHkza193YXJuaW5nJzogJzMnLAotICAgICAgICAndmVyYm9zZSc6ICd2JywKLSAgICB9Ci0gICAgYXJncyA9IFtdCi0gICAgZm9yIGZsYWcsIG9wdCBpbiBmbGFnX29wdF9tYXAuaXRlbXMoKToKLSAgICAgICAgdiA9IGdldGF0dHIoc3lzLmZsYWdzLCBmbGFnKQotICAgICAgICBpZiB2ID4gMDoKLSAgICAgICAgICAgIGFyZ3MuYXBwZW5kKCctJyArIG9wdCAqIHYpCi0gICAgcmV0dXJuIGFyZ3MKKyAgICBpbXBvcnQgc3VicHJvY2VzcworICAgIHJldHVybiBzdWJwcm9jZXNzLl9hcmdzX2Zyb21faW50ZXJwcmV0ZXJfZmxhZ3MoKQogCiBkZWYgc3RyaXBfcHl0aG9uX3N0ZGVycihzdGRlcnIpOgogICAgICIiIlN0cmlwIHRoZSBzdGRlcnIgb2YgYSBQeXRob24gcHJvY2VzcyBmcm9tIHBvdGVudGlhbCBkZWJ1ZyBvdXRwdXQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3ltdGFibGUucHkgYi9MaWIvdGVzdC90ZXN0X3N5bXRhYmxlLnB5CmluZGV4IDcxOTk0YWQuLmM0MzdlODYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3ltdGFibGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zeW10YWJsZS5weQpAQCAtODgsMTAgKzg4LDEwIEBACiAKICAgICBkZWYgdGVzdF9mdW5jdGlvbl9pbmZvKHNlbGYpOgogICAgICAgICBmdW5jID0gc2VsZi5zcGFtCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYy5nZXRfcGFyYW1ldGVycygpLCAoImEiLCAiYiIsICJrdyIsICJ2YXIiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jLmdldF9sb2NhbHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoImEiLCAiYiIsICJpbnRlcm5hbCIsICJrdyIsICJ2YXIiLCAieCIpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMuZ2V0X2dsb2JhbHMoKSwgKCJiYXIiLCAiZ2xvYiIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZChmdW5jLmdldF9wYXJhbWV0ZXJzKCkpLCBbImEiLCAiYiIsICJrdyIsICJ2YXIiXSkKKyAgICAgICAgZXhwZWN0ZWQgPSBbImEiLCAiYiIsICJpbnRlcm5hbCIsICJrdyIsICJ2YXIiLCAieCJdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGZ1bmMuZ2V0X2xvY2FscygpKSwgZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGZ1bmMuZ2V0X2dsb2JhbHMoKSksIFsiYmFyIiwgImdsb2IiXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmludGVybmFsLmdldF9mcmVlcygpLCAoIngiLCkpCiAKICAgICBkZWYgdGVzdF9nbG9iYWxzKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zeXMucHkgYi9MaWIvdGVzdC90ZXN0X3N5cy5weQppbmRleCA2YzVmYzI0Li43NDVlNGFkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N5cy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N5cy5weQpAQCAtMSw1ICsxLDYgQEAKICMgLSotIGNvZGluZzogaXNvLTg4NTktMSAtKi0KIGltcG9ydCB1bml0dGVzdCwgdGVzdC50ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdC5zY3JpcHRfaGVscGVyIGltcG9ydCBhc3NlcnRfcHl0aG9uX29rLCBhc3NlcnRfcHl0aG9uX2ZhaWx1cmUKIGltcG9ydCBzeXMsIG9zLCBjU3RyaW5nSU8KIGltcG9ydCBzdHJ1Y3QKIGltcG9ydCBvcGVyYXRvcgpAQCAtMTE0LDkwICsxMTUsNjkgQEAKICAgICAgICAgY2xlYXJfY2hlY2soZXhjKQogCiAgICAgZGVmIHRlc3RfZXhpdChzZWxmKToKKyAgICAgICAgIyBjYWxsIHdpdGggdHdvIGFyZ3VtZW50cwogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN5cy5leGl0LCA0MiwgNDIpCiAKICAgICAgICAgIyBjYWxsIHdpdGhvdXQgYXJndW1lbnQKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc3lzLmV4aXQoMCkKLSAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQsIGV4YzoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhjLmNvZGUsIDApCi0gICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgZXhjZXB0aW9uIikKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbCgibm8gZXhjZXB0aW9uIikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhTeXN0ZW1FeGl0KSBhcyBjbToKKyAgICAgICAgICAgIHN5cy5leGl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoY20uZXhjZXB0aW9uLmNvZGUpCisKKyAgICAgICAgcmMsIG91dCwgZXJyID0gYXNzZXJ0X3B5dGhvbl9vaygnLWMnLCAnaW1wb3J0IHN5czsgc3lzLmV4aXQoKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmMsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LCBiJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLCBiJycpCisKKyAgICAgICAgIyBjYWxsIHdpdGggaW50ZWdlciBhcmd1bWVudAorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUV4aXQpIGFzIGNtOgorICAgICAgICAgICAgc3lzLmV4aXQoNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY20uZXhjZXB0aW9uLmNvZGUsIDQyKQogCiAgICAgICAgICMgY2FsbCB3aXRoIHR1cGxlIGFyZ3VtZW50IHdpdGggb25lIGVudHJ5CiAgICAgICAgICMgZW50cnkgd2lsbCBiZSB1bnBhY2tlZAotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzeXMuZXhpdCg0MikKLSAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQsIGV4YzoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhjLmNvZGUsIDQyKQotICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICBzZWxmLmZhaWwoIndyb25nIGV4Y2VwdGlvbiIpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmZhaWwoIm5vIGV4Y2VwdGlvbiIpCi0KLSAgICAgICAgIyBjYWxsIHdpdGggaW50ZWdlciBhcmd1bWVudAotICAgICAgICB0cnk6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoU3lzdGVtRXhpdCkgYXMgY206CiAgICAgICAgICAgICBzeXMuZXhpdCgoNDIsKSkKLSAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQsIGV4YzoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhjLmNvZGUsIDQyKQotICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICBzZWxmLmZhaWwoIndyb25nIGV4Y2VwdGlvbiIpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmZhaWwoIm5vIGV4Y2VwdGlvbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY20uZXhjZXB0aW9uLmNvZGUsIDQyKQogCiAgICAgICAgICMgY2FsbCB3aXRoIHN0cmluZyBhcmd1bWVudAotICAgICAgICB0cnk6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoU3lzdGVtRXhpdCkgYXMgY206CiAgICAgICAgICAgICBzeXMuZXhpdCgiZXhpdCIpCi0gICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0LCBleGM6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Yy5jb2RlLCAiZXhpdCIpCi0gICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgZXhjZXB0aW9uIikKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbCgibm8gZXhjZXB0aW9uIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbS5leGNlcHRpb24uY29kZSwgImV4aXQiKQogCiAgICAgICAgICMgY2FsbCB3aXRoIHR1cGxlIGFyZ3VtZW50IHdpdGggdHdvIGVudHJpZXMKLSAgICAgICAgdHJ5OgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUV4aXQpIGFzIGNtOgogICAgICAgICAgICAgc3lzLmV4aXQoKDE3LCAyMykpCi0gICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0LCBleGM6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Yy5jb2RlLCAoMTcsIDIzKSkKLSAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgc2VsZi5mYWlsKCJ3cm9uZyBleGNlcHRpb24iKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5mYWlsKCJubyBleGNlcHRpb24iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtLmV4Y2VwdGlvbi5jb2RlLCAoMTcsIDIzKSkKIAogICAgICAgICAjIHRlc3QgdGhhdCB0aGUgZXhpdCBtYWNoaW5lcnkgaGFuZGxlcyBTeXN0ZW1FeGl0cyBwcm9wZXJseQotICAgICAgICBpbXBvcnQgc3VicHJvY2VzcwogICAgICAgICAjIGJvdGggdW5ub3JtYWxpemVkLi4uCi0gICAgICAgIHJjID0gc3VicHJvY2Vzcy5jYWxsKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyYWlzZSBTeXN0ZW1FeGl0LCA0NiJdKQorICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX2ZhaWx1cmUoJy1jJywgJ3JhaXNlIFN5c3RlbUV4aXQsIDQ2JykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYywgNDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LCBiJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLCBiJycpCiAgICAgICAgICMgLi4uIGFuZCBub3JtYWxpemVkCi0gICAgICAgIHJjID0gc3VicHJvY2Vzcy5jYWxsKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyYWlzZSBTeXN0ZW1FeGl0KDQ3KSJdKQorICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX2ZhaWx1cmUoJy1jJywgJ3JhaXNlIFN5c3RlbUV4aXQoNDcpJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYywgNDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LCBiJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLCBiJycpCiAKLSAgICAgICAgZGVmIGNoZWNrX2V4aXRfbWVzc2FnZShjb2RlLCBleHBlY3RlZCwgZW52PU5vbmUpOgotICAgICAgICAgICAgcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLCBjb2RlXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsIGVudj1lbnYpCi0gICAgICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHByb2Nlc3MuY29tbXVuaWNhdGUoKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm9jZXNzLnJldHVybmNvZGUsIDEpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RkZXJyLnN0YXJ0c3dpdGgoZXhwZWN0ZWQpLAotICAgICAgICAgICAgICAgICIlcyBkb2Vzbid0IHN0YXJ0IHdpdGggJXMiICUgKHJlcHIoc3RkZXJyKSwgcmVwcihleHBlY3RlZCkpKQorICAgICAgICBkZWYgY2hlY2tfZXhpdF9tZXNzYWdlKGNvZGUsIGV4cGVjdGVkLCAqKmVudl92YXJzKToKKyAgICAgICAgICAgIHJjLCBvdXQsIGVyciA9IGFzc2VydF9weXRob25fZmFpbHVyZSgnLWMnLCBjb2RlLCAqKmVudl92YXJzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYywgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LCBiJycpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZXJyLnN0YXJ0c3dpdGgoZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICIlcyBkb2Vzbid0IHN0YXJ0IHdpdGggJXMiICUgKHJlcHIoZXJyKSwgcmVwcihleHBlY3RlZCkpKQogCi0gICAgICAgICMgdGVzdCB0aGF0IHN0ZGVyciBidWZmZXIgaWYgZmx1c2hlZCBiZWZvcmUgdGhlIGV4aXQgbWVzc2FnZSBpcyB3cml0dGVuCisgICAgICAgICMgdGVzdCB0aGF0IHN0ZGVyciBidWZmZXIgaXMgZmx1c2hlZCBiZWZvcmUgdGhlIGV4aXQgbWVzc2FnZSBpcyB3cml0dGVuCiAgICAgICAgICMgaW50byBzdGRlcnIKICAgICAgICAgY2hlY2tfZXhpdF9tZXNzYWdlKAogICAgICAgICAgICAgcidpbXBvcnQgc3lzOyBzeXMuc3RkZXJyLndyaXRlKCJ1bmZsdXNoZWQsIik7IHN5cy5leGl0KCJtZXNzYWdlIiknLAogICAgICAgICAgICAgYiJ1bmZsdXNoZWQsbWVzc2FnZSIpCiAKICAgICAgICAgIyB0ZXN0IHRoYXQgdGhlIHVuaWNvZGUgbWVzc2FnZSBpcyBlbmNvZGVkIHRvIHRoZSBzdGRlcnIgZW5jb2RpbmcKLSAgICAgICAgZW52ID0gb3MuZW52aXJvbi5jb3B5KCkKLSAgICAgICAgZW52WydQWVRIT05JT0VOQ09ESU5HJ10gPSAnbGF0aW4tMScKICAgICAgICAgY2hlY2tfZXhpdF9tZXNzYWdlKAogICAgICAgICAgICAgcidpbXBvcnQgc3lzOyBzeXMuZXhpdCh1ImhceGU5IiknLAotICAgICAgICAgICAgYiJoXHhlOSIsIGVudj1lbnYpCisgICAgICAgICAgICBiImhceGU5IiwgUFlUSE9OSU9FTkNPRElORz0nbGF0aW4tMScpCiAKICAgICBkZWYgdGVzdF9nZXRkZWZhdWx0ZW5jb2Rpbmcoc2VsZik6CiAgICAgICAgIGlmIHRlc3QudGVzdF9zdXBwb3J0LmhhdmVfdW5pY29kZToKQEAgLTI2NiwxNSArMjQ2LDE2IEBACiAgICAgICAgICMgIHN0aWxsIGhhcyA1IGVsZW1lbnRzCiAgICAgICAgIG1haiwgbWluLCBidWlsZG5vLCBwbGF0LCBjc2QgPSBzeXMuZ2V0d2luZG93c3ZlcnNpb24oKQogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihzeXMsICJzZXRkbG9wZW5mbGFncyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0IG5lZWRzIHN5cy5zZXRkbG9wZW5mbGFncygpJykKICAgICBkZWYgdGVzdF9kbG9wZW5mbGFncyhzZWxmKToKLSAgICAgICAgaWYgaGFzYXR0cihzeXMsICJzZXRkbG9wZW5mbGFncyIpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoc3lzLCAiZ2V0ZGxvcGVuZmxhZ3MiKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3lzLmdldGRsb3BlbmZsYWdzLCA0MikKLSAgICAgICAgICAgIG9sZGZsYWdzID0gc3lzLmdldGRsb3BlbmZsYWdzKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3lzLnNldGRsb3BlbmZsYWdzKQotICAgICAgICAgICAgc3lzLnNldGRsb3BlbmZsYWdzKG9sZGZsYWdzKzEpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5nZXRkbG9wZW5mbGFncygpLCBvbGRmbGFncysxKQotICAgICAgICAgICAgc3lzLnNldGRsb3BlbmZsYWdzKG9sZGZsYWdzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihzeXMsICJnZXRkbG9wZW5mbGFncyIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN5cy5nZXRkbG9wZW5mbGFncywgNDIpCisgICAgICAgIG9sZGZsYWdzID0gc3lzLmdldGRsb3BlbmZsYWdzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzeXMuc2V0ZGxvcGVuZmxhZ3MpCisgICAgICAgIHN5cy5zZXRkbG9wZW5mbGFncyhvbGRmbGFncysxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5nZXRkbG9wZW5mbGFncygpLCBvbGRmbGFncysxKQorICAgICAgICBzeXMuc2V0ZGxvcGVuZmxhZ3Mob2xkZmxhZ3MpCiAKICAgICBkZWYgdGVzdF9yZWZjb3VudChzZWxmKToKICAgICAgICAgIyBuIGhlcmUgbXVzdCBiZSBhIGdsb2JhbCBpbiBvcmRlciBmb3IgdGhpcyB0ZXN0IHRvIHBhc3Mgd2hpbGUKQEAgLTQzOCw3ICs0MTksNyBAQAogICAgICAgICBhdHRycyA9ICgiZGVidWciLCAicHkza193YXJuaW5nIiwgImRpdmlzaW9uX3dhcm5pbmciLCAiZGl2aXNpb25fbmV3IiwKICAgICAgICAgICAgICAgICAgImluc3BlY3QiLCAiaW50ZXJhY3RpdmUiLCAib3B0aW1pemUiLCAiZG9udF93cml0ZV9ieXRlY29kZSIsCiAgICAgICAgICAgICAgICAgICJub19zaXRlIiwgImlnbm9yZV9lbnZpcm9ubWVudCIsICJ0YWJjaGVjayIsICJ2ZXJib3NlIiwKLSAgICAgICAgICAgICAgICAgInVuaWNvZGUiLCAiYnl0ZXNfd2FybmluZyIpCisgICAgICAgICAgICAgICAgICJ1bmljb2RlIiwgImJ5dGVzX3dhcm5pbmciLCAiaGFzaF9yYW5kb21pemF0aW9uIikKICAgICAgICAgZm9yIGF0dHIgaW4gYXR0cnM6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihzeXMuZmxhZ3MsIGF0dHIpLCBhdHRyKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGdldGF0dHIoc3lzLmZsYWdzLCBhdHRyKSksIGludCwgYXR0cikKQEAgLTQ3MSw2ICs0NTIsOSBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN5cy5jYWxsX3RyYWNpbmcsIHN0ciwgMikKIAogICAgIGRlZiB0ZXN0X2V4ZWN1dGFibGUoc2VsZik6CisgICAgICAgICMgc3lzLmV4ZWN1dGFibGUgc2hvdWxkIGJlIGFic29sdXRlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MucGF0aC5hYnNwYXRoKHN5cy5leGVjdXRhYmxlKSwgc3lzLmV4ZWN1dGFibGUpCisKICAgICAgICAgIyBJc3N1ZSAjNzc3NDogRW5zdXJlIHRoYXQgc3lzLmV4ZWN1dGFibGUgaXMgYW4gZW1wdHkgc3RyaW5nIGlmIGFyZ3ZbMF0KICAgICAgICAgIyBoYXMgYmVlbiBzZXQgdG8gYW4gbm9uIGV4aXN0ZW50IHByb2dyYW0gbmFtZSBhbmQgUHl0aG9uIGlzIHVuYWJsZSB0bwogICAgICAgICAjIHJldHJpZXZlIHRoZSByZWFsIHByb2dyYW0gbmFtZQpAQCAtNDg1LDI0ICs0NjksMTEgQEAKICAgICAgICAgcC53YWl0KCkKICAgICAgICAgc2VsZi5hc3NlcnRJbihleGVjdXRhYmxlLCBbIicnIiwgcmVwcihzeXMuZXhlY3V0YWJsZSldKQogCitAdGVzdC50ZXN0X3N1cHBvcnQuY3B5dGhvbl9vbmx5CiBjbGFzcyBTaXplb2ZUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAotICAgIFRQRkxBR1NfSEFWRV9HQyA9IDE8PDE0Ci0gICAgVFBGTEFHU19IRUFQVFlQRSA9IDFMPDw5Ci0KICAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYuYyA9IGxlbihzdHJ1Y3QucGFjaygnYycsICcgJykpCi0gICAgICAgIHNlbGYuSCA9IGxlbihzdHJ1Y3QucGFjaygnSCcsIDApKQotICAgICAgICBzZWxmLmkgPSBsZW4oc3RydWN0LnBhY2soJ2knLCAwKSkKLSAgICAgICAgc2VsZi5sID0gbGVuKHN0cnVjdC5wYWNrKCdsJywgMCkpCi0gICAgICAgIHNlbGYuUCA9IGxlbihzdHJ1Y3QucGFjaygnUCcsIDApKQotICAgICAgICAjIGR1ZSB0byBtaXNzaW5nIHNpemVfdCBpbmZvcm1hdGlvbiBmcm9tIHN0cnVjdCwgaXQgaXMgYXNzdW1lZCB0aGF0Ci0gICAgICAgICMgc2l6ZW9mKFB5X3NzaXplX3QpID0gc2l6ZW9mKHZvaWQqKQotICAgICAgICBzZWxmLmhlYWRlciA9ICdQUCcKLSAgICAgICAgc2VsZi52aGVhZGVyID0gc2VsZi5oZWFkZXIgKyAnUCcKLSAgICAgICAgaWYgaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50Iik6Ci0gICAgICAgICAgICBzZWxmLmhlYWRlciArPSAnMlAnCi0gICAgICAgICAgICBzZWxmLnZoZWFkZXIgKz0gJzJQJworICAgICAgICBzZWxmLlAgPSBzdHJ1Y3QuY2FsY3NpemUoJ1AnKQogICAgICAgICBzZWxmLmxvbmdkaWdpdCA9IHN5cy5sb25nX2luZm8uc2l6ZW9mX2RpZ2l0CiAgICAgICAgIGltcG9ydCBfdGVzdGNhcGkKICAgICAgICAgc2VsZi5nY19oZWFkc2l6ZSA9IF90ZXN0Y2FwaS5TSVpFT0ZfUFlHQ19IRUFECkBAIC01MTIsMTI4ICs0ODMsMTA5IEBACiAgICAgICAgIHNlbGYuZmlsZS5jbG9zZSgpCiAgICAgICAgIHRlc3QudGVzdF9zdXBwb3J0LnVubGluayh0ZXN0LnRlc3Rfc3VwcG9ydC5URVNURk4pCiAKLSAgICBkZWYgY2hlY2tfc2l6ZW9mKHNlbGYsIG8sIHNpemUpOgotICAgICAgICByZXN1bHQgPSBzeXMuZ2V0c2l6ZW9mKG8pCi0gICAgICAgIGlmICgodHlwZShvKSA9PSB0eXBlKSBhbmQgKG8uX19mbGFnc19fICYgc2VsZi5UUEZMQUdTX0hFQVBUWVBFKSBvclwKLSAgICAgICAgICAgKCh0eXBlKG8pICE9IHR5cGUpIGFuZCAodHlwZShvKS5fX2ZsYWdzX18gJiBzZWxmLlRQRkxBR1NfSEFWRV9HQykpKToKLSAgICAgICAgICAgIHNpemUgKz0gc2VsZi5nY19oZWFkc2l6ZQotICAgICAgICBtc2cgPSAnd3Jvbmcgc2l6ZSBmb3IgJXM6IGdvdCAlZCwgZXhwZWN0ZWQgJWQnIFwKLSAgICAgICAgICAgICAgICAlICh0eXBlKG8pLCByZXN1bHQsIHNpemUpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBzaXplLCBtc2cpCi0KLSAgICBkZWYgY2FsY3NpemUoc2VsZiwgZm10KToKLSAgICAgICAgIiIiV3JhcHBlciBhcm91bmQgc3RydWN0LmNhbGNzaXplIHdoaWNoIGVuZm9yY2VzIHRoZSBhbGlnbm1lbnQgb2YgdGhlCi0gICAgICAgIGVuZCBvZiBhIHN0cnVjdHVyZSB0byB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50IG9mIHBvaW50ZXIuCi0KLSAgICAgICAgTm90ZTogVGhpcyB3cmFwcGVyIHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgYSBwb2ludGVyIG1lbWJlciBpcyBpbmNsdWRlZAotICAgICAgICBhbmQgbm8gbWVtYmVyIHdpdGggYSBzaXplIGxhcmdlciB0aGFuIGEgcG9pbnRlciBleGlzdHMuCi0gICAgICAgICIiIgotICAgICAgICByZXR1cm4gc3RydWN0LmNhbGNzaXplKGZtdCArICcwUCcpCisgICAgY2hlY2tfc2l6ZW9mID0gdGVzdC50ZXN0X3N1cHBvcnQuY2hlY2tfc2l6ZW9mCiAKICAgICBkZWYgdGVzdF9nY19oZWFkX3NpemUoc2VsZik6CiAgICAgICAgICMgQ2hlY2sgdGhhdCB0aGUgZ2MgaGVhZGVyIHNpemUgaXMgYWRkZWQgdG8gb2JqZWN0cyB0cmFja2VkIGJ5IHRoZSBnYy4KLSAgICAgICAgaCA9IHNlbGYuaGVhZGVyCi0gICAgICAgIHNpemUgPSBzZWxmLmNhbGNzaXplCisgICAgICAgIHNpemUgPSB0ZXN0LnRlc3Rfc3VwcG9ydC5jYWxjb2Jqc2l6ZQogICAgICAgICBnY19oZWFkZXJfc2l6ZSA9IHNlbGYuZ2NfaGVhZHNpemUKICAgICAgICAgIyBib29sIG9iamVjdHMgYXJlIG5vdCBnYyB0cmFja2VkCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLmdldHNpemVvZihUcnVlKSwgc2l6ZShoICsgJ2wnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzeXMuZ2V0c2l6ZW9mKFRydWUpLCBzaXplKCdsJykpCiAgICAgICAgICMgYnV0IGxpc3RzIGFyZQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5nZXRzaXplb2YoW10pLCBzaXplKGggKyAnUCBQUCcpICsgZ2NfaGVhZGVyX3NpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLmdldHNpemVvZihbXSksIHNpemUoJ1AgUFAnKSArIGdjX2hlYWRlcl9zaXplKQogCiAgICAgZGVmIHRlc3RfZGVmYXVsdChzZWxmKToKLSAgICAgICAgaCA9IHNlbGYuaGVhZGVyCi0gICAgICAgIHNpemUgPSBzZWxmLmNhbGNzaXplCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLmdldHNpemVvZihUcnVlLCAtMSksIHNpemUoaCArICdsJykpCisgICAgICAgIHNpemUgPSB0ZXN0LnRlc3Rfc3VwcG9ydC5jYWxjb2Jqc2l6ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5nZXRzaXplb2YoVHJ1ZSwgLTEpLCBzaXplKCdsJykpCiAKICAgICBkZWYgdGVzdF9vYmplY3R0eXBlcyhzZWxmKToKICAgICAgICAgIyBjaGVjayBhbGwgdHlwZXMgZGVmaW5lZCBpbiBPYmplY3RzLwotICAgICAgICBoID0gc2VsZi5oZWFkZXIKLSAgICAgICAgdmggPSBzZWxmLnZoZWFkZXIKLSAgICAgICAgc2l6ZSA9IHNlbGYuY2FsY3NpemUKKyAgICAgICAgc2l6ZSA9IHRlc3QudGVzdF9zdXBwb3J0LmNhbGNvYmpzaXplCisgICAgICAgIHZzaXplID0gdGVzdC50ZXN0X3N1cHBvcnQuY2FsY3ZvYmpzaXplCiAgICAgICAgIGNoZWNrID0gc2VsZi5jaGVja19zaXplb2YKICAgICAgICAgIyBib29sCi0gICAgICAgIGNoZWNrKFRydWUsIHNpemUoaCArICdsJykpCisgICAgICAgIGNoZWNrKFRydWUsIHNpemUoJ2wnKSkKICAgICAgICAgIyBidWZmZXIKICAgICAgICAgd2l0aCB0ZXN0LnRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICBjaGVjayhidWZmZXIoJycpLCBzaXplKGggKyAnMlAyUGlsJykpCisgICAgICAgICAgICBjaGVjayhidWZmZXIoJycpLCBzaXplKCcyUDJQaWwnKSkKICAgICAgICAgIyBidWlsdGluX2Z1bmN0aW9uX29yX21ldGhvZAotICAgICAgICBjaGVjayhsZW4sIHNpemUoaCArICczUCcpKQorICAgICAgICBjaGVjayhsZW4sIHNpemUoJzNQJykpCiAgICAgICAgICMgYnl0ZWFycmF5CiAgICAgICAgIHNhbXBsZXMgPSBbJycsICd1JyoxMDAwMDBdCiAgICAgICAgIGZvciBzYW1wbGUgaW4gc2FtcGxlczoKICAgICAgICAgICAgIHggPSBieXRlYXJyYXkoc2FtcGxlKQotICAgICAgICAgICAgY2hlY2soeCwgc2l6ZSh2aCArICdpUFAnKSArIHguX19hbGxvY19fKCkgKiBzZWxmLmMpCisgICAgICAgICAgICBjaGVjayh4LCB2c2l6ZSgnaVBQJykgKyB4Ll9fYWxsb2NfXygpKQogICAgICAgICAjIGJ5dGVhcnJheV9pdGVyYXRvcgotICAgICAgICBjaGVjayhpdGVyKGJ5dGVhcnJheSgpKSwgc2l6ZShoICsgJ1BQJykpCisgICAgICAgIGNoZWNrKGl0ZXIoYnl0ZWFycmF5KCkpLCBzaXplKCdQUCcpKQogICAgICAgICAjIGNlbGwKICAgICAgICAgZGVmIGdldF9jZWxsKCk6CiAgICAgICAgICAgICB4ID0gNDIKICAgICAgICAgICAgIGRlZiBpbm5lcigpOgogICAgICAgICAgICAgICAgIHJldHVybiB4CiAgICAgICAgICAgICByZXR1cm4gaW5uZXIKLSAgICAgICAgY2hlY2soZ2V0X2NlbGwoKS5mdW5jX2Nsb3N1cmVbMF0sIHNpemUoaCArICdQJykpCisgICAgICAgIGNoZWNrKGdldF9jZWxsKCkuZnVuY19jbG9zdXJlWzBdLCBzaXplKCdQJykpCiAgICAgICAgICMgY2xhc3NvYmogKG9sZC1zdHlsZSBjbGFzcykKICAgICAgICAgY2xhc3MgY2xhc3Nfb2xkc3R5bGUoKToKICAgICAgICAgICAgIGRlZiBtZXRob2QoKToKICAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgIGNoZWNrKGNsYXNzX29sZHN0eWxlLCBzaXplKGggKyAnN1AnKSkKKyAgICAgICAgY2hlY2soY2xhc3Nfb2xkc3R5bGUsIHNpemUoJzdQJykpCiAgICAgICAgICMgaW5zdGFuY2UgKG9sZC1zdHlsZSBjbGFzcykKLSAgICAgICAgY2hlY2soY2xhc3Nfb2xkc3R5bGUoKSwgc2l6ZShoICsgJzNQJykpCisgICAgICAgIGNoZWNrKGNsYXNzX29sZHN0eWxlKCksIHNpemUoJzNQJykpCiAgICAgICAgICMgaW5zdGFuY2VtZXRob2QgKG9sZC1zdHlsZSBjbGFzcykKLSAgICAgICAgY2hlY2soY2xhc3Nfb2xkc3R5bGUoKS5tZXRob2QsIHNpemUoaCArICc0UCcpKQorICAgICAgICBjaGVjayhjbGFzc19vbGRzdHlsZSgpLm1ldGhvZCwgc2l6ZSgnNFAnKSkKICAgICAgICAgIyBjb21wbGV4Ci0gICAgICAgIGNoZWNrKGNvbXBsZXgoMCwxKSwgc2l6ZShoICsgJzJkJykpCisgICAgICAgIGNoZWNrKGNvbXBsZXgoMCwxKSwgc2l6ZSgnMmQnKSkKICAgICAgICAgIyBjb2RlCi0gICAgICAgIGNoZWNrKGdldF9jZWxsKCkuZnVuY19jb2RlLCBzaXplKGggKyAnNGk4UGkzUCcpKQorICAgICAgICBjaGVjayhnZXRfY2VsbCgpLmZ1bmNfY29kZSwgc2l6ZSgnNGk4UGkzUCcpKQogICAgICAgICAjIEJhc2VFeGNlcHRpb24KLSAgICAgICAgY2hlY2soQmFzZUV4Y2VwdGlvbigpLCBzaXplKGggKyAnM1AnKSkKKyAgICAgICAgY2hlY2soQmFzZUV4Y2VwdGlvbigpLCBzaXplKCczUCcpKQogICAgICAgICAjIFVuaWNvZGVFbmNvZGVFcnJvcgotICAgICAgICBjaGVjayhVbmljb2RlRW5jb2RlRXJyb3IoIiIsIHUiIiwgMCwgMCwgIiIpLCBzaXplKGggKyAnNVAyUFAnKSkKKyAgICAgICAgY2hlY2soVW5pY29kZUVuY29kZUVycm9yKCIiLCB1IiIsIDAsIDAsICIiKSwgc2l6ZSgnNVAyUFAnKSkKICAgICAgICAgIyBVbmljb2RlRGVjb2RlRXJyb3IKLSAgICAgICAgY2hlY2soVW5pY29kZURlY29kZUVycm9yKCIiLCAiIiwgMCwgMCwgIiIpLCBzaXplKGggKyAnNVAyUFAnKSkKKyAgICAgICAgY2hlY2soVW5pY29kZURlY29kZUVycm9yKCIiLCAiIiwgMCwgMCwgIiIpLCBzaXplKCc1UDJQUCcpKQogICAgICAgICAjIFVuaWNvZGVUcmFuc2xhdGVFcnJvcgotICAgICAgICBjaGVjayhVbmljb2RlVHJhbnNsYXRlRXJyb3IodSIiLCAwLCAxLCAiIiksIHNpemUoaCArICc1UDJQUCcpKQorICAgICAgICBjaGVjayhVbmljb2RlVHJhbnNsYXRlRXJyb3IodSIiLCAwLCAxLCAiIiksIHNpemUoJzVQMlBQJykpCiAgICAgICAgICMgbWV0aG9kX2Rlc2NyaXB0b3IgKGRlc2NyaXB0b3Igb2JqZWN0KQotICAgICAgICBjaGVjayhzdHIubG93ZXIsIHNpemUoaCArICcyUFAnKSkKKyAgICAgICAgY2hlY2soc3RyLmxvd2VyLCBzaXplKCcyUFAnKSkKICAgICAgICAgIyBjbGFzc21ldGhvZF9kZXNjcmlwdG9yIChkZXNjcmlwdG9yIG9iamVjdCkKICAgICAgICAgIyBYWFgKICAgICAgICAgIyBtZW1iZXJfZGVzY3JpcHRvciAoZGVzY3JpcHRvciBvYmplY3QpCiAgICAgICAgIGltcG9ydCBkYXRldGltZQotICAgICAgICBjaGVjayhkYXRldGltZS50aW1lZGVsdGEuZGF5cywgc2l6ZShoICsgJzJQUCcpKQorICAgICAgICBjaGVjayhkYXRldGltZS50aW1lZGVsdGEuZGF5cywgc2l6ZSgnMlBQJykpCiAgICAgICAgICMgZ2V0c2V0X2Rlc2NyaXB0b3IgKGRlc2NyaXB0b3Igb2JqZWN0KQogICAgICAgICBpbXBvcnQgX19idWlsdGluX18KLSAgICAgICAgY2hlY2soX19idWlsdGluX18uZmlsZS5jbG9zZWQsIHNpemUoaCArICcyUFAnKSkKKyAgICAgICAgY2hlY2soX19idWlsdGluX18uZmlsZS5jbG9zZWQsIHNpemUoJzJQUCcpKQogICAgICAgICAjIHdyYXBwZXJfZGVzY3JpcHRvciAoZGVzY3JpcHRvciBvYmplY3QpCi0gICAgICAgIGNoZWNrKGludC5fX2FkZF9fLCBzaXplKGggKyAnMlAyUCcpKQorICAgICAgICBjaGVjayhpbnQuX19hZGRfXywgc2l6ZSgnMlAyUCcpKQogICAgICAgICAjIGRpY3Rwcm94eQogICAgICAgICBjbGFzcyBDKG9iamVjdCk6IHBhc3MKLSAgICAgICAgY2hlY2soQy5fX2RpY3RfXywgc2l6ZShoICsgJ1AnKSkKKyAgICAgICAgY2hlY2soQy5fX2RpY3RfXywgc2l6ZSgnUCcpKQogICAgICAgICAjIG1ldGhvZC13cmFwcGVyIChkZXNjcmlwdG9yIG9iamVjdCkKLSAgICAgICAgY2hlY2soe30uX19pdGVyX18sIHNpemUoaCArICcyUCcpKQorICAgICAgICBjaGVjayh7fS5fX2l0ZXJfXywgc2l6ZSgnMlAnKSkKICAgICAgICAgIyBkaWN0Ci0gICAgICAgIGNoZWNrKHt9LCBzaXplKGggKyAnM1AyUCcgKyA4KidQMlAnKSkKKyAgICAgICAgY2hlY2soe30sIHNpemUoJzNQMlAnICsgOConUDJQJykpCiAgICAgICAgIHggPSB7MToxLCAyOjIsIDM6MywgNDo0LCA1OjUsIDY6NiwgNzo3LCA4Ojh9Ci0gICAgICAgIGNoZWNrKHgsIHNpemUoaCArICczUDJQJyArIDgqJ1AyUCcpICsgMTYqc2l6ZSgnUDJQJykpCisgICAgICAgIGNoZWNrKHgsIHNpemUoJzNQMlAnICsgOConUDJQJykgKyAxNipzdHJ1Y3QuY2FsY3NpemUoJ1AyUCcpKQogICAgICAgICAjIGRpY3Rpb25hcnkta2V5aXRlcmF0b3IKLSAgICAgICAgY2hlY2soe30uaXRlcmtleXMoKSwgc2l6ZShoICsgJ1AyUFBQJykpCisgICAgICAgIGNoZWNrKHt9Lml0ZXJrZXlzKCksIHNpemUoJ1AyUFBQJykpCiAgICAgICAgICMgZGljdGlvbmFyeS12YWx1ZWl0ZXJhdG9yCi0gICAgICAgIGNoZWNrKHt9Lml0ZXJ2YWx1ZXMoKSwgc2l6ZShoICsgJ1AyUFBQJykpCisgICAgICAgIGNoZWNrKHt9Lml0ZXJ2YWx1ZXMoKSwgc2l6ZSgnUDJQUFAnKSkKICAgICAgICAgIyBkaWN0aW9uYXJ5LWl0ZW1pdGVyYXRvcgotICAgICAgICBjaGVjayh7fS5pdGVyaXRlbXMoKSwgc2l6ZShoICsgJ1AyUFBQJykpCisgICAgICAgIGNoZWNrKHt9Lml0ZXJpdGVtcygpLCBzaXplKCdQMlBQUCcpKQogICAgICAgICAjIGVsbGlwc2VzCi0gICAgICAgIGNoZWNrKEVsbGlwc2lzLCBzaXplKGggKyAnJykpCisgICAgICAgIGNoZWNrKEVsbGlwc2lzLCBzaXplKCcnKSkKICAgICAgICAgIyBFbmNvZGluZ01hcAogICAgICAgICBpbXBvcnQgY29kZWNzLCBlbmNvZGluZ3MuaXNvODg1OV8zCiAgICAgICAgIHggPSBjb2RlY3MuY2hhcm1hcF9idWlsZChlbmNvZGluZ3MuaXNvODg1OV8zLmRlY29kaW5nX3RhYmxlKQotICAgICAgICBjaGVjayh4LCBzaXplKGggKyAnMzJCMmlCJykpCisgICAgICAgIGNoZWNrKHgsIHNpemUoJzMyQjJpQicpKQogICAgICAgICAjIGVudW1lcmF0ZQotICAgICAgICBjaGVjayhlbnVtZXJhdGUoW10pLCBzaXplKGggKyAnbDNQJykpCisgICAgICAgIGNoZWNrKGVudW1lcmF0ZShbXSksIHNpemUoJ2wzUCcpKQogICAgICAgICAjIGZpbGUKLSAgICAgICAgY2hlY2soc2VsZi5maWxlLCBzaXplKGggKyAnNFAyaTRQM2kzUDNpJykpCisgICAgICAgIGNoZWNrKHNlbGYuZmlsZSwgc2l6ZSgnNFAyaTRQM2kzUDNpJykpCiAgICAgICAgICMgZmxvYXQKLSAgICAgICAgY2hlY2soZmxvYXQoMCksIHNpemUoaCArICdkJykpCisgICAgICAgIGNoZWNrKGZsb2F0KDApLCBzaXplKCdkJykpCiAgICAgICAgICMgc3lzLmZsb2F0aW5mbwotICAgICAgICBjaGVjayhzeXMuZmxvYXRfaW5mbywgc2l6ZSh2aCkgKyBzZWxmLlAgKiBsZW4oc3lzLmZsb2F0X2luZm8pKQorICAgICAgICBjaGVjayhzeXMuZmxvYXRfaW5mbywgdnNpemUoJycpICsgc2VsZi5QICogbGVuKHN5cy5mbG9hdF9pbmZvKSkKICAgICAgICAgIyBmcmFtZQogICAgICAgICBpbXBvcnQgaW5zcGVjdAogICAgICAgICBDT19NQVhCTE9DS1MgPSAyMApAQCAtNjQyLDEwICs1OTQsMTAgQEAKICAgICAgICAgbmZyZWVzID0gbGVuKHguZl9jb2RlLmNvX2ZyZWV2YXJzKQogICAgICAgICBleHRyYXMgPSB4LmZfY29kZS5jb19zdGFja3NpemUgKyB4LmZfY29kZS5jb19ubG9jYWxzICtcCiAgICAgICAgICAgICAgICAgIG5jZWxscyArIG5mcmVlcyAtIDEKLSAgICAgICAgY2hlY2soeCwgc2l6ZSh2aCArICcxMlAzaScgKyBDT19NQVhCTE9DS1MqJzNpJyArICdQJyArIGV4dHJhcyonUCcpKQorICAgICAgICBjaGVjayh4LCB2c2l6ZSgnMTJQM2knICsgQ09fTUFYQkxPQ0tTKiczaScgKyAnUCcgKyBleHRyYXMqJ1AnKSkKICAgICAgICAgIyBmdW5jdGlvbgogICAgICAgICBkZWYgZnVuYygpOiBwYXNzCi0gICAgICAgIGNoZWNrKGZ1bmMsIHNpemUoaCArICc5UCcpKQorICAgICAgICBjaGVjayhmdW5jLCBzaXplKCc5UCcpKQogICAgICAgICBjbGFzcyBjKCk6CiAgICAgICAgICAgICBAc3RhdGljbWV0aG9kCiAgICAgICAgICAgICBkZWYgZm9vKCk6CkBAIC02NTQsNjUgKzYwNiw2NSBAQAogICAgICAgICAgICAgZGVmIGJhcihjbHMpOgogICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICMgc3RhdGljbWV0aG9kCi0gICAgICAgICAgICBjaGVjayhmb28sIHNpemUoaCArICdQJykpCisgICAgICAgICAgICBjaGVjayhmb28sIHNpemUoJ1AnKSkKICAgICAgICAgICAgICMgY2xhc3NtZXRob2QKLSAgICAgICAgICAgIGNoZWNrKGJhciwgc2l6ZShoICsgJ1AnKSkKKyAgICAgICAgICAgIGNoZWNrKGJhciwgc2l6ZSgnUCcpKQogICAgICAgICAjIGdlbmVyYXRvcgogICAgICAgICBkZWYgZ2V0X2dlbigpOiB5aWVsZCAxCi0gICAgICAgIGNoZWNrKGdldF9nZW4oKSwgc2l6ZShoICsgJ1BpMlAnKSkKKyAgICAgICAgY2hlY2soZ2V0X2dlbigpLCBzaXplKCdQaTJQJykpCiAgICAgICAgICMgaW50ZWdlcgotICAgICAgICBjaGVjaygxLCBzaXplKGggKyAnbCcpKQotICAgICAgICBjaGVjaygxMDAsIHNpemUoaCArICdsJykpCisgICAgICAgIGNoZWNrKDEsIHNpemUoJ2wnKSkKKyAgICAgICAgY2hlY2soMTAwLCBzaXplKCdsJykpCiAgICAgICAgICMgaXRlcmF0b3IKLSAgICAgICAgY2hlY2soaXRlcignYWJjJyksIHNpemUoaCArICdsUCcpKQorICAgICAgICBjaGVjayhpdGVyKCdhYmMnKSwgc2l6ZSgnbFAnKSkKICAgICAgICAgIyBjYWxsYWJsZS1pdGVyYXRvcgogICAgICAgICBpbXBvcnQgcmUKLSAgICAgICAgY2hlY2socmUuZmluZGl0ZXIoJycsJycpLCBzaXplKGggKyAnMlAnKSkKKyAgICAgICAgY2hlY2socmUuZmluZGl0ZXIoJycsJycpLCBzaXplKCcyUCcpKQogICAgICAgICAjIGxpc3QKICAgICAgICAgc2FtcGxlcyA9IFtbXSwgWzEsMiwzXSwgWycxJywgJzInLCAnMyddXQogICAgICAgICBmb3Igc2FtcGxlIGluIHNhbXBsZXM6Ci0gICAgICAgICAgICBjaGVjayhzYW1wbGUsIHNpemUodmggKyAnUFAnKSArIGxlbihzYW1wbGUpKnNlbGYuUCkKKyAgICAgICAgICAgIGNoZWNrKHNhbXBsZSwgdnNpemUoJ1BQJykgKyBsZW4oc2FtcGxlKSpzZWxmLlApCiAgICAgICAgICMgc29ydHdyYXBwZXIgKGxpc3QpCiAgICAgICAgICMgWFhYCiAgICAgICAgICMgY21wd3JhcHBlciAobGlzdCkKICAgICAgICAgIyBYWFgKICAgICAgICAgIyBsaXN0aXRlcmF0b3IgKGxpc3QpCi0gICAgICAgIGNoZWNrKGl0ZXIoW10pLCBzaXplKGggKyAnbFAnKSkKKyAgICAgICAgY2hlY2soaXRlcihbXSksIHNpemUoJ2xQJykpCiAgICAgICAgICMgbGlzdHJldmVyc2VpdGVyYXRvciAobGlzdCkKLSAgICAgICAgY2hlY2socmV2ZXJzZWQoW10pLCBzaXplKGggKyAnbFAnKSkKKyAgICAgICAgY2hlY2socmV2ZXJzZWQoW10pLCBzaXplKCdsUCcpKQogICAgICAgICAjIGxvbmcKLSAgICAgICAgY2hlY2soMEwsIHNpemUodmgpKQotICAgICAgICBjaGVjaygxTCwgc2l6ZSh2aCkgKyBzZWxmLmxvbmdkaWdpdCkKLSAgICAgICAgY2hlY2soLTFMLCBzaXplKHZoKSArIHNlbGYubG9uZ2RpZ2l0KQorICAgICAgICBjaGVjaygwTCwgdnNpemUoJycpKQorICAgICAgICBjaGVjaygxTCwgdnNpemUoJycpICsgc2VsZi5sb25nZGlnaXQpCisgICAgICAgIGNoZWNrKC0xTCwgdnNpemUoJycpICsgc2VsZi5sb25nZGlnaXQpCiAgICAgICAgIFB5TG9uZ19CQVNFID0gMioqc3lzLmxvbmdfaW5mby5iaXRzX3Blcl9kaWdpdAotICAgICAgICBjaGVjayhsb25nKFB5TG9uZ19CQVNFKSwgc2l6ZSh2aCkgKyAyKnNlbGYubG9uZ2RpZ2l0KQotICAgICAgICBjaGVjayhsb25nKFB5TG9uZ19CQVNFKioyLTEpLCBzaXplKHZoKSArIDIqc2VsZi5sb25nZGlnaXQpCi0gICAgICAgIGNoZWNrKGxvbmcoUHlMb25nX0JBU0UqKjIpLCBzaXplKHZoKSArIDMqc2VsZi5sb25nZGlnaXQpCisgICAgICAgIGNoZWNrKGxvbmcoUHlMb25nX0JBU0UpLCB2c2l6ZSgnJykgKyAyKnNlbGYubG9uZ2RpZ2l0KQorICAgICAgICBjaGVjayhsb25nKFB5TG9uZ19CQVNFKioyLTEpLCB2c2l6ZSgnJykgKyAyKnNlbGYubG9uZ2RpZ2l0KQorICAgICAgICBjaGVjayhsb25nKFB5TG9uZ19CQVNFKioyKSwgdnNpemUoJycpICsgMypzZWxmLmxvbmdkaWdpdCkKICAgICAgICAgIyBtb2R1bGUKLSAgICAgICAgY2hlY2sodW5pdHRlc3QsIHNpemUoaCArICdQJykpCisgICAgICAgIGNoZWNrKHVuaXR0ZXN0LCBzaXplKCdQJykpCiAgICAgICAgICMgTm9uZQotICAgICAgICBjaGVjayhOb25lLCBzaXplKGggKyAnJykpCisgICAgICAgIGNoZWNrKE5vbmUsIHNpemUoJycpKQogICAgICAgICAjIG9iamVjdAotICAgICAgICBjaGVjayhvYmplY3QoKSwgc2l6ZShoICsgJycpKQorICAgICAgICBjaGVjayhvYmplY3QoKSwgc2l6ZSgnJykpCiAgICAgICAgICMgcHJvcGVydHkgKGRlc2NyaXB0b3Igb2JqZWN0KQogICAgICAgICBjbGFzcyBDKG9iamVjdCk6CiAgICAgICAgICAgICBkZWYgZ2V0eChzZWxmKTogcmV0dXJuIHNlbGYuX194CiAgICAgICAgICAgICBkZWYgc2V0eChzZWxmLCB2YWx1ZSk6IHNlbGYuX194ID0gdmFsdWUKICAgICAgICAgICAgIGRlZiBkZWx4KHNlbGYpOiBkZWwgc2VsZi5fX3gKICAgICAgICAgICAgIHggPSBwcm9wZXJ0eShnZXR4LCBzZXR4LCBkZWx4LCAiIikKLSAgICAgICAgICAgIGNoZWNrKHgsIHNpemUoaCArICc0UGknKSkKKyAgICAgICAgICAgIGNoZWNrKHgsIHNpemUoJzRQaScpKQogICAgICAgICAjIFB5Q09iamVjdAogICAgICAgICAjIFB5Q2Fwc3VsZQogICAgICAgICAjIFhYWAogICAgICAgICAjIHJhbmdlaXRlcmF0b3IKLSAgICAgICAgY2hlY2soaXRlcih4cmFuZ2UoMSkpLCBzaXplKGggKyAnNGwnKSkKKyAgICAgICAgY2hlY2soaXRlcih4cmFuZ2UoMSkpLCBzaXplKCc0bCcpKQogICAgICAgICAjIHJldmVyc2UKLSAgICAgICAgY2hlY2socmV2ZXJzZWQoJycpLCBzaXplKGggKyAnUFAnKSkKKyAgICAgICAgY2hlY2socmV2ZXJzZWQoJycpLCBzaXplKCdQUCcpKQogICAgICAgICAjIHNldAogICAgICAgICAjIGZyb3plbnNldAogICAgICAgICBQeVNldF9NSU5TSVpFID0gOAogICAgICAgICBzYW1wbGVzID0gW1tdLCByYW5nZSgxMCksIHJhbmdlKDUwKV0KLSAgICAgICAgcyA9IHNpemUoaCArICczUDJQJyArIFB5U2V0X01JTlNJWkUqJ2xQJyArICdsUCcpCisgICAgICAgIHMgPSBzaXplKCczUDJQJyArIFB5U2V0X01JTlNJWkUqJ2xQJyArICdsUCcpCiAgICAgICAgIGZvciBzYW1wbGUgaW4gc2FtcGxlczoKICAgICAgICAgICAgIG1pbnVzZWQgPSBsZW4oc2FtcGxlKQogICAgICAgICAgICAgaWYgbWludXNlZCA9PSAwOiB0bXAgPSAxCkBAIC03MjksMjMgKzY4MSwyNCBAQAogICAgICAgICAgICAgICAgIGNoZWNrKHNldChzYW1wbGUpLCBzICsgbmV3c2l6ZSpzdHJ1Y3QuY2FsY3NpemUoJ2xQJykpCiAgICAgICAgICAgICAgICAgY2hlY2soZnJvemVuc2V0KHNhbXBsZSksIHMgKyBuZXdzaXplKnN0cnVjdC5jYWxjc2l6ZSgnbFAnKSkKICAgICAgICAgIyBzZXRpdGVyYXRvcgotICAgICAgICBjaGVjayhpdGVyKHNldCgpKSwgc2l6ZShoICsgJ1AzUCcpKQorICAgICAgICBjaGVjayhpdGVyKHNldCgpKSwgc2l6ZSgnUDNQJykpCiAgICAgICAgICMgc2xpY2UKLSAgICAgICAgY2hlY2soc2xpY2UoMSksIHNpemUoaCArICczUCcpKQorICAgICAgICBjaGVjayhzbGljZSgxKSwgc2l6ZSgnM1AnKSkKICAgICAgICAgIyBzdHIKLSAgICAgICAgY2hlY2soJycsIHN0cnVjdC5jYWxjc2l6ZSh2aCArICdsaScpICsgMSkKLSAgICAgICAgY2hlY2soJ2FiYycsIHN0cnVjdC5jYWxjc2l6ZSh2aCArICdsaScpICsgMSArIDMqc2VsZi5jKQorICAgICAgICB2aCA9IHRlc3QudGVzdF9zdXBwb3J0Ll92aGVhZGVyCisgICAgICAgIGNoZWNrKCcnLCBzdHJ1Y3QuY2FsY3NpemUodmggKyAnbGljJykpCisgICAgICAgIGNoZWNrKCdhYmMnLCBzdHJ1Y3QuY2FsY3NpemUodmggKyAnbGljJykgKyAzKQogICAgICAgICAjIHN1cGVyCi0gICAgICAgIGNoZWNrKHN1cGVyKGludCksIHNpemUoaCArICczUCcpKQorICAgICAgICBjaGVjayhzdXBlcihpbnQpLCBzaXplKCczUCcpKQogICAgICAgICAjIHR1cGxlCi0gICAgICAgIGNoZWNrKCgpLCBzaXplKHZoKSkKLSAgICAgICAgY2hlY2soKDEsMiwzKSwgc2l6ZSh2aCkgKyAzKnNlbGYuUCkKKyAgICAgICAgY2hlY2soKCksIHZzaXplKCcnKSkKKyAgICAgICAgY2hlY2soKDEsMiwzKSwgdnNpemUoJycpICsgMypzZWxmLlApCiAgICAgICAgICMgdHVwbGVpdGVyYXRvcgotICAgICAgICBjaGVjayhpdGVyKCgpKSwgc2l6ZShoICsgJ2xQJykpCisgICAgICAgIGNoZWNrKGl0ZXIoKCkpLCBzaXplKCdsUCcpKQogICAgICAgICAjIHR5cGUKICAgICAgICAgIyAoUHlUeXBlT2JqZWN0ICsgUHlOdW1iZXJNZXRob2RzICsgIFB5TWFwcGluZ01ldGhvZHMgKwogICAgICAgICAjICBQeVNlcXVlbmNlTWV0aG9kcyArIFB5QnVmZmVyUHJvY3MpCi0gICAgICAgIHMgPSBzaXplKHZoICsgJ1AyUDE1UGw0UFA5UFAxMVBJJykgKyBzaXplKCc0MVAgMTBQIDNQIDZQJykKKyAgICAgICAgcyA9IHZzaXplKCdQMlAxNVBsNFBQOVBQMTFQSScpICsgc3RydWN0LmNhbGNzaXplKCc0MVAgMTBQIDNQIDZQJykKICAgICAgICAgY2xhc3MgbmV3c3R5bGVjbGFzcyhvYmplY3QpOgogICAgICAgICAgICAgcGFzcwogICAgICAgICBjaGVjayhuZXdzdHlsZWNsYXNzLCBzKQpAQCAtNzYwLDQxICs3MTMsNDAgQEAKICAgICAgICAgIyB3ZSBuZWVkIHRvIHRlc3QgZm9yIGJvdGggc2l6ZXMsIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGUgc3RyaW5nCiAgICAgICAgICMgaGFzIGJlZW4gY2FjaGVkCiAgICAgICAgIGZvciBzIGluIHNhbXBsZXM6Ci0gICAgICAgICAgICBjaGVjayhzLCBzaXplKGggKyAnUFBsUCcpICsgdXNpemUgKiAobGVuKHMpICsgMSkpCisgICAgICAgICAgICBjaGVjayhzLCBzaXplKCdQUGxQJykgKyB1c2l6ZSAqIChsZW4ocykgKyAxKSkKICAgICAgICAgIyB3ZWFrcmVmCiAgICAgICAgIGltcG9ydCB3ZWFrcmVmCi0gICAgICAgIGNoZWNrKHdlYWtyZWYucmVmKGludCksIHNpemUoaCArICcyUGwyUCcpKQorICAgICAgICBjaGVjayh3ZWFrcmVmLnJlZihpbnQpLCBzaXplKCcyUGwyUCcpKQogICAgICAgICAjIHdlYWtwcm94eQogICAgICAgICAjIFhYWAogICAgICAgICAjIHdlYWtjYWxsYWJsZXByb3h5Ci0gICAgICAgIGNoZWNrKHdlYWtyZWYucHJveHkoaW50KSwgc2l6ZShoICsgJzJQbDJQJykpCisgICAgICAgIGNoZWNrKHdlYWtyZWYucHJveHkoaW50KSwgc2l6ZSgnMlBsMlAnKSkKICAgICAgICAgIyB4cmFuZ2UKLSAgICAgICAgY2hlY2soeHJhbmdlKDEpLCBzaXplKGggKyAnM2wnKSkKLSAgICAgICAgY2hlY2soeHJhbmdlKDY2MDAwKSwgc2l6ZShoICsgJzNsJykpCisgICAgICAgIGNoZWNrKHhyYW5nZSgxKSwgc2l6ZSgnM2wnKSkKKyAgICAgICAgY2hlY2soeHJhbmdlKDY2MDAwKSwgc2l6ZSgnM2wnKSkKIAogICAgIGRlZiB0ZXN0X3B5dGhvbnR5cGVzKHNlbGYpOgogICAgICAgICAjIGNoZWNrIGFsbCB0eXBlcyBkZWZpbmVkIGluIFB5dGhvbi8KLSAgICAgICAgaCA9IHNlbGYuaGVhZGVyCi0gICAgICAgIHZoID0gc2VsZi52aGVhZGVyCi0gICAgICAgIHNpemUgPSBzZWxmLmNhbGNzaXplCisgICAgICAgIHNpemUgPSB0ZXN0LnRlc3Rfc3VwcG9ydC5jYWxjb2Jqc2l6ZQorICAgICAgICB2c2l6ZSA9IHRlc3QudGVzdF9zdXBwb3J0LmNhbGN2b2Jqc2l6ZQogICAgICAgICBjaGVjayA9IHNlbGYuY2hlY2tfc2l6ZW9mCiAgICAgICAgICMgX2FzdC5BU1QKICAgICAgICAgaW1wb3J0IF9hc3QKLSAgICAgICAgY2hlY2soX2FzdC5BU1QoKSwgc2l6ZShoICsgJycpKQorICAgICAgICBjaGVjayhfYXN0LkFTVCgpLCBzaXplKCcnKSkKICAgICAgICAgIyBpbXAuTnVsbEltcG9ydGVyCiAgICAgICAgIGltcG9ydCBpbXAKLSAgICAgICAgY2hlY2soaW1wLk51bGxJbXBvcnRlcihzZWxmLmZpbGUubmFtZSksIHNpemUoaCArICcnKSkKKyAgICAgICAgY2hlY2soaW1wLk51bGxJbXBvcnRlcihzZWxmLmZpbGUubmFtZSksIHNpemUoJycpKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IKICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgIHRiID0gc3lzLmV4Y19pbmZvKClbMl0KICAgICAgICAgICAgICMgdHJhY2ViYWNrCiAgICAgICAgICAgICBpZiB0YiAhPSBOb25lOgotICAgICAgICAgICAgICAgIGNoZWNrKHRiLCBzaXplKGggKyAnMlAyaScpKQorICAgICAgICAgICAgICAgIGNoZWNrKHRiLCBzaXplKCcyUDJpJykpCiAgICAgICAgICMgc3ltdGFibGUgZW50cnkKICAgICAgICAgIyBYWFgKICAgICAgICAgIyBzeXMuZmxhZ3MKLSAgICAgICAgY2hlY2soc3lzLmZsYWdzLCBzaXplKHZoKSArIHNlbGYuUCAqIGxlbihzeXMuZmxhZ3MpKQorICAgICAgICBjaGVjayhzeXMuZmxhZ3MsIHZzaXplKCcnKSArIHNlbGYuUCAqIGxlbihzeXMuZmxhZ3MpKQogCiAKIGRlZiB0ZXN0X21haW4oKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3lzX3NldHRyYWNlLnB5IGIvTGliL3Rlc3QvdGVzdF9zeXNfc2V0dHJhY2UucHkKaW5kZXggMWY3N2Y5Yi4uOWM3YmNlZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zeXNfc2V0dHJhY2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zeXNfc2V0dHJhY2UucHkKQEAgLTQxNyw3ICs0MTcsNyBAQAogICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleGNlcHRpb24gbm90IHRocm93biEiKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImV4Y2VwdGlvbiBub3QgcmFpc2VkISIpCiAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CiAgICAgICAgICAgICBzZWxmLmZhaWwoInJlY3Vyc2lvbiBjb3VudGVyIG5vdCByZXNldCIpCiAKQEAgLTY3MCw2ICs2NzAsMTQgQEAKIG5vX2p1bXBfdG9fbm9uX2ludGVnZXJzLmp1bXAgPSAoMiwgIlNwYW0iKQogbm9fanVtcF90b19ub25faW50ZWdlcnMub3V0cHV0ID0gW1RydWVdCiAKK2RlZiBqdW1wX2Fjcm9zc193aXRoKG91dHB1dCk6CisgICAgd2l0aCBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpIGFzIGZwOgorICAgICAgICBwYXNzCisgICAgd2l0aCBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpIGFzIGZwOgorICAgICAgICBwYXNzCitqdW1wX2Fjcm9zc193aXRoLmp1bXAgPSAoMSwgMykKK2p1bXBfYWNyb3NzX3dpdGgub3V0cHV0ID0gW10KKwogIyBUaGlzIHZlcmlmaWVzIHRoYXQgeW91IGNhbid0IHNldCBmX2xpbmVubyB2aWEgX2dldGZyYW1lIG9yIHNpbWlsYXIKICMgdHJpY2tlcnkuCiBkZWYgbm9fanVtcF93aXRob3V0X3RyYWNlX2Z1bmN0aW9uKCk6CkBAIC03MzksNiArNzQ3LDkgQEAKICAgICAgICAgc2VsZi5ydW5fdGVzdChub19qdW1wX3RvX25vbl9pbnRlZ2VycykKICAgICBkZWYgdGVzdF8xOV9ub19qdW1wX3dpdGhvdXRfdHJhY2VfZnVuY3Rpb24oc2VsZik6CiAgICAgICAgIG5vX2p1bXBfd2l0aG91dF90cmFjZV9mdW5jdGlvbigpCisgICAgZGVmIHRlc3RfanVtcF9hY3Jvc3Nfd2l0aChzZWxmKToKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHRlc3Rfc3VwcG9ydC51bmxpbmssIHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYucnVuX3Rlc3QoanVtcF9hY3Jvc3Nfd2l0aCkKIAogICAgIGRlZiB0ZXN0XzIwX2xhcmdlX2Z1bmN0aW9uKHNlbGYpOgogICAgICAgICBkID0ge30KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3lzY29uZmlnLnB5IGIvTGliL3Rlc3QvdGVzdF9zeXNjb25maWcucHkKaW5kZXggNzE2ZmE1ZS4uNzU1ZjM1ZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zeXNjb25maWcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zeXNjb25maWcucHkKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3BhdGgsIGdldF9wYXRoX25hbWVzLCBfSU5TVEFMTF9TQ0hFTUVTLAogICAgICAgICAgICAgICAgICAgICAgICBfZ2V0X2RlZmF1bHRfc2NoZW1lLCBfZXhwYW5kX3ZhcnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGdldF9zY2hlbWVfbmFtZXMsIGdldF9jb25maWdfdmFyKQoraW1wb3J0IF9vc3hfc3VwcG9ydAogCiBjbGFzcyBUZXN0U3lzQ29uZmlnKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtMTM3LDYgKzEzOCw3IEBACiAgICAgICAgICAgICAgICAgICAgKCdEYXJ3aW4gS2VybmVsIFZlcnNpb24gOC4xMS4xOiAnCiAgICAgICAgICAgICAgICAgICAgICdXZWQgT2N0IDEwIDE4OjIzOjI4IFBEVCAyMDA3OyAnCiAgICAgICAgICAgICAgICAgICAgICdyb290OnhudS03OTIuMjUuMjB+MS9SRUxFQVNFX0kzODYnKSwgJ1Bvd2VyUEMnKSkKKyAgICAgICAgX29zeF9zdXBwb3J0Ll9yZW1vdmVfb3JpZ2luYWxfdmFsdWVzKGdldF9jb25maWdfdmFycygpKQogICAgICAgICBnZXRfY29uZmlnX3ZhcnMoKVsnTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJ10gPSAnMTAuMycKIAogICAgICAgICBnZXRfY29uZmlnX3ZhcnMoKVsnQ0ZMQUdTJ10gPSAoJy1mbm8tc3RyaWN0LWFsaWFzaW5nIC1ETkRFQlVHIC1nICcKQEAgLTE1Niw2ICsxNTgsNyBAQAogICAgICAgICAgICAgICAgICAgICgnRGFyd2luIEtlcm5lbCBWZXJzaW9uIDguMTEuMTogJwogICAgICAgICAgICAgICAgICAgICAnV2VkIE9jdCAxMCAxODoyMzoyOCBQRFQgMjAwNzsgJwogICAgICAgICAgICAgICAgICAgICAncm9vdDp4bnUtNzkyLjI1LjIwfjEvUkVMRUFTRV9JMzg2JyksICdpMzg2JykpCisgICAgICAgIF9vc3hfc3VwcG9ydC5fcmVtb3ZlX29yaWdpbmFsX3ZhbHVlcyhnZXRfY29uZmlnX3ZhcnMoKSkKICAgICAgICAgZ2V0X2NvbmZpZ192YXJzKClbJ01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCddID0gJzEwLjMnCiAKICAgICAgICAgZ2V0X2NvbmZpZ192YXJzKClbJ0NGTEFHUyddID0gKCctZm5vLXN0cmljdC1hbGlhc2luZyAtRE5ERUJVRyAtZyAnCkBAIC0xNzEsNiArMTc0LDcgQEAKICAgICAgICAgICAgIHN5cy5tYXhpbnQgPSBtYXhpbnQKIAogICAgICAgICAjIG1hY2Jvb2sgd2l0aCBmYXQgYmluYXJpZXMgKGZhdCwgdW5pdmVyc2FsIG9yIGZhdDY0KQorICAgICAgICBfb3N4X3N1cHBvcnQuX3JlbW92ZV9vcmlnaW5hbF92YWx1ZXMoZ2V0X2NvbmZpZ192YXJzKCkpCiAgICAgICAgIGdldF9jb25maWdfdmFycygpWydNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQnXSA9ICcxMC40JwogICAgICAgICBnZXRfY29uZmlnX3ZhcnMoKVsnQ0ZMQUdTJ10gPSAoJy1hcmNoIHBwYyAtYXJjaCBpMzg2IC1pc3lzcm9vdCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkayAgJwpAQCAtMTc5LDYgKzE4Myw3IEBACiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfcGxhdGZvcm0oKSwgJ21hY29zeC0xMC40LWZhdCcpCiAKKyAgICAgICAgX29zeF9zdXBwb3J0Ll9yZW1vdmVfb3JpZ2luYWxfdmFsdWVzKGdldF9jb25maWdfdmFycygpKQogICAgICAgICBnZXRfY29uZmlnX3ZhcnMoKVsnQ0ZMQUdTJ10gPSAoJy1hcmNoIHg4Nl82NCAtYXJjaCBpMzg2IC1pc3lzcm9vdCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkayAgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uICcKQEAgLTE4NiwxOCArMTkxLDIxIEBACiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfcGxhdGZvcm0oKSwgJ21hY29zeC0xMC40LWludGVsJykKIAorICAgICAgICBfb3N4X3N1cHBvcnQuX3JlbW92ZV9vcmlnaW5hbF92YWx1ZXMoZ2V0X2NvbmZpZ192YXJzKCkpCiAgICAgICAgIGdldF9jb25maWdfdmFycygpWydDRkxBR1MnXSA9ICgnLWFyY2ggeDg2XzY0IC1hcmNoIHBwYyAtYXJjaCBpMzg2IC1pc3lzcm9vdCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkayAgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctZHluYW1pYyAtRE5ERUJVRyAtZyAtTzMnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9wbGF0Zm9ybSgpLCAnbWFjb3N4LTEwLjQtZmF0MycpCiAKKyAgICAgICAgX29zeF9zdXBwb3J0Ll9yZW1vdmVfb3JpZ2luYWxfdmFsdWVzKGdldF9jb25maWdfdmFycygpKQogICAgICAgICBnZXRfY29uZmlnX3ZhcnMoKVsnQ0ZMQUdTJ10gPSAoJy1hcmNoIHBwYzY0IC1hcmNoIHg4Nl82NCAtYXJjaCBwcGMgLWFyY2ggaTM4NiAtaXN5c3Jvb3QgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGsgICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLWR5bmFtaWMgLUROREVCVUcgLWcgLU8zJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfcGxhdGZvcm0oKSwgJ21hY29zeC0xMC40LXVuaXZlcnNhbCcpCiAKKyAgICAgICAgX29zeF9zdXBwb3J0Ll9yZW1vdmVfb3JpZ2luYWxfdmFsdWVzKGdldF9jb25maWdfdmFycygpKQogICAgICAgICBnZXRfY29uZmlnX3ZhcnMoKVsnQ0ZMQUdTJ10gPSAoJy1hcmNoIHg4Nl82NCAtYXJjaCBwcGM2NCAtaXN5c3Jvb3QgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGsgICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAnCkBAIC0yMDYsNiArMjE0LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfcGxhdGZvcm0oKSwgJ21hY29zeC0xMC40LWZhdDY0JykKIAogICAgICAgICBmb3IgYXJjaCBpbiAoJ3BwYycsICdpMzg2JywgJ3g4Nl82NCcsICdwcGM2NCcpOgorICAgICAgICAgICAgX29zeF9zdXBwb3J0Ll9yZW1vdmVfb3JpZ2luYWxfdmFsdWVzKGdldF9jb25maWdfdmFycygpKQogICAgICAgICAgICAgZ2V0X2NvbmZpZ192YXJzKClbJ0NGTEFHUyddID0gKCctYXJjaCAlcyAtaXN5c3Jvb3QgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrICAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uICcKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weSBiL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weQppbmRleCA0OWQyZDA3Li5mZjMyNjVmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RhcmZpbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5CkBAIC0xNTQsNiArMTU0LDgzIEBACiAgICAgZGVmIHRlc3RfZmlsZW9ial9zeW1saW5rMihzZWxmKToKICAgICAgICAgc2VsZi5fdGVzdF9maWxlb2JqX2xpbmsoIi4vdXN0YXIvbGlua3Rlc3QyL3N5bXR5cGUiLCAidXN0YXIvbGlua3Rlc3QxL3JlZ3R5cGUiKQogCisgICAgZGVmIHRlc3RfaXNzdWUxNDE2MChzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9maWxlb2JqX2xpbmsoInN5bXR5cGUyIiwgInVzdGFyL3JlZ3R5cGUiKQorCisKK2NsYXNzIExpc3RUZXN0KFJlYWRUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAjIE92ZXJyaWRlIHNldFVwIHRvIHVzZSBkZWZhdWx0IGVuY29kaW5nIChVVEYtOCkKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYudGFyID0gdGFyZmlsZS5vcGVuKHNlbGYudGFybmFtZSwgbW9kZT1zZWxmLm1vZGUpCisKKyAgICBkZWYgdGVzdF9saXN0KHNlbGYpOgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jYXB0dXJlZF9zdGRvdXQoKSBhcyB0OgorICAgICAgICAgICAgc2VsZi50YXIubGlzdCh2ZXJib3NlPUZhbHNlKQorICAgICAgICBvdXQgPSB0LmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigndXN0YXIvY29udHR5cGUnLCBvdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3VzdGFyL3JlZ3R5cGUnLCBvdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3VzdGFyL2xua3R5cGUnLCBvdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3VzdGFyJyArICgnLzEyMzQ1JyAqIDQwKSArICc2Ny9sb25nbmFtZScsIG91dCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignLi91c3Rhci9saW5rdGVzdDIvc3ltdHlwZScsIG91dCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignLi91c3Rhci9saW5rdGVzdDIvbG5rdHlwZScsIG91dCkKKyAgICAgICAgIyBNYWtlIHN1cmUgaXQgcHV0cyB0cmFpbGluZyBzbGFzaCBmb3IgZGlyZWN0b3J5CisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3VzdGFyL2RpcnR5cGUvJywgb3V0KQorICAgICAgICBzZWxmLmFzc2VydEluKCd1c3Rhci9kaXJ0eXBlLXdpdGgtc2l6ZS8nLCBvdXQpCisgICAgICAgICMgTWFrZSBzdXJlIGl0IGlzIGFibGUgdG8gcHJpbnQgbm9uLUFTQ0lJIGNoYXJhY3RlcnMKKyAgICAgICAgc2VsZi5hc3NlcnRJbigndXN0YXIvdW1sYXV0cy0nCisgICAgICAgICAgICAgICAgICAgICAgJ1x4YzRceGQ2XHhkY1x4ZTRceGY2XHhmY1x4ZGYnLCBvdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ21pc2MvcmVndHlwZS1ocHV4LXNpZ25lZC1jaGtzdW0tJworICAgICAgICAgICAgICAgICAgICAgICdceGM0XHhkNlx4ZGNceGU0XHhmNlx4ZmNceGRmJywgb3V0KQorICAgICAgICBzZWxmLmFzc2VydEluKCdtaXNjL3JlZ3R5cGUtb2xkLXY3LXNpZ25lZC1jaGtzdW0tJworICAgICAgICAgICAgICAgICAgICAgICdceGM0XHhkNlx4ZGNceGU0XHhmNlx4ZmNceGRmJywgb3V0KQorICAgICAgICAjIE1ha2Ugc3VyZSBpdCBwcmludHMgZmlsZXMgc2VwYXJhdGVkIGJ5IG9uZSBuZXdsaW5lIHdpdGhvdXQgYW55CisgICAgICAgICMgJ2xzIC1sJy1saWtlIGFjY2Vzc29yaWVzIGlmIHZlcmJvc2UgZmxhZyBpcyBub3QgYmVpbmcgdXNlZAorICAgICAgICAjIC4uLgorICAgICAgICAjIHVzdGFyL2NvbnR0eXBlCisgICAgICAgICMgdXN0YXIvcmVndHlwZQorICAgICAgICAjIC4uLgorICAgICAgICBzZWxmLmFzc2VydFJlZ2V4cE1hdGNoZXMob3V0LCByJ3VzdGFyL2NvbnR0eXBlID9ccj9cbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcid1c3Rhci9yZWd0eXBlID9ccj9cbicpCisgICAgICAgICMgTWFrZSBzdXJlIGl0IGRvZXMgbm90IHByaW50IHRoZSBzb3VyY2Ugb2YgbGluayB3aXRob3V0IHZlcmJvc2UgZmxhZworICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdsaW5rIHRvJywgb3V0KQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCctPicsIG91dCkKKworICAgIGRlZiB0ZXN0X2xpc3RfdmVyYm9zZShzZWxmKToKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2FwdHVyZWRfc3Rkb3V0KCkgYXMgdDoKKyAgICAgICAgICAgIHNlbGYudGFyLmxpc3QodmVyYm9zZT1UcnVlKQorICAgICAgICBvdXQgPSB0LmdldHZhbHVlKCkKKyAgICAgICAgIyBNYWtlIHN1cmUgaXQgcHJpbnRzIGZpbGVzIHNlcGFyYXRlZCBieSBvbmUgbmV3bGluZSB3aXRoICdscyAtbCctbGlrZQorICAgICAgICAjIGFjY2Vzc29yaWVzIGlmIHZlcmJvc2UgZmxhZyBpcyBiZWluZyB1c2VkCisgICAgICAgICMgLi4uCisgICAgICAgICMgP3J3LXItLXItLSB0YXJmaWxlL3RhcmZpbGUgICAgIDcwMTEgMjAwMy0wMS0wNiAwNzoxOTo0MyB1c3Rhci9jb250dHlwZQorICAgICAgICAjID9ydy1yLS1yLS0gdGFyZmlsZS90YXJmaWxlICAgICA3MDExIDIwMDMtMDEtMDYgMDc6MTk6NDMgdXN0YXIvcmVndHlwZQorICAgICAgICAjIC4uLgorICAgICAgICBzZWxmLmFzc2VydFJlZ2V4cE1hdGNoZXMob3V0LCAocictcnctci0tci0tIHRhcmZpbGUvdGFyZmlsZVxzKzcwMTEgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidcZHs0fS1cZFxkLVxkXGRccytcZFxkOlxkXGQ6XGRcZCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ3VzdGFyL1x3K3R5cGUgP1xyP1xuJykgKiAyKQorICAgICAgICAjIE1ha2Ugc3VyZSBpdCBwcmludHMgdGhlIHNvdXJjZSBvZiBsaW5rIHdpdGggdmVyYm9zZSBmbGFnCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3VzdGFyL3N5bXR5cGUgLT4gcmVndHlwZScsIG91dCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignLi91c3Rhci9saW5rdGVzdDIvc3ltdHlwZSAtPiAuLi9saW5rdGVzdDEvcmVndHlwZScsIG91dCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignLi91c3Rhci9saW5rdGVzdDIvbG5rdHlwZSBsaW5rIHRvICcKKyAgICAgICAgICAgICAgICAgICAgICAnLi91c3Rhci9saW5rdGVzdDEvcmVndHlwZScsIG91dCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignZ251JyArICgnLzEyMycgKiAxMjUpICsgJy9sb25nbGluayBsaW5rIHRvIGdudScgKworICAgICAgICAgICAgICAgICAgICAgICgnLzEyMycgKiAxMjUpICsgJy9sb25nbmFtZScsIG91dCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigncGF4JyArICgnLzEyMycgKiAxMjUpICsgJy9sb25nbGluayBsaW5rIHRvIHBheCcgKworICAgICAgICAgICAgICAgICAgICAgICgnLzEyMycgKiAxMjUpICsgJy9sb25nbmFtZScsIG91dCkKKworCitjbGFzcyBHemlwTGlzdFRlc3QoTGlzdFRlc3QpOgorICAgIHRhcm5hbWUgPSBnemlwbmFtZQorICAgIG1vZGUgPSAicjpneiIKKyAgICB0YXJvcGVuID0gdGFyZmlsZS5UYXJGaWxlLmd6b3BlbgorCisKK2NsYXNzIEJ6Mkxpc3RUZXN0KExpc3RUZXN0KToKKyAgICB0YXJuYW1lID0gYnoybmFtZQorICAgIG1vZGUgPSAicjpiejIiCisgICAgdGFyb3BlbiA9IHRhcmZpbGUuVGFyRmlsZS5iejJvcGVuCisKIAogY2xhc3MgQ29tbW9uUmVhZFRlc3QoUmVhZFRlc3QpOgogCkBAIC0xNzgsNiArMjU1LDE0IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIHRtcG5hbWUsIHNlbGYubW9kZSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgdG1wbmFtZSkKIAorICAgIGRlZiB0ZXN0X25vbl9leGlzdGVudF90YXJmaWxlKHNlbGYpOgorICAgICAgICAjIFRlc3QgZm9yIGlzc3VlMTE1MTM6IHByZXZlbnQgbm9uLWV4aXN0ZW50IGd6aXBwZWQgdGFyZmlsZXMgcmFpc2luZworICAgICAgICAjIG11bHRpcGxlIGV4Y2VwdGlvbnMuCisgICAgICAgIGV4Y3R5cGUgPSBPU0Vycm9yIGlmICd8JyBpbiBzZWxmLm1vZGUgZWxzZSBJT0Vycm9yCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoZXhjdHlwZSwgInh4eCIpIGFzIGV4OgorICAgICAgICAgICAgdGFyZmlsZS5vcGVuKCJ4eHgiLCBzZWxmLm1vZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXguZXhjZXB0aW9uLmVycm5vLCBlcnJuby5FTk9FTlQpCisKICAgICBkZWYgdGVzdF9pZ25vcmVfemVyb3Moc2VsZik6CiAgICAgICAgICMgVGVzdCBUYXJGaWxlJ3MgaWdub3JlX3plcm9zIG9wdGlvbi4KICAgICAgICAgaWYgc2VsZi5tb2RlLmVuZHN3aXRoKCI6Z3oiKToKQEAgLTIwMiw2ICsyODcsNyBAQAogCiAKIGNsYXNzIE1pc2NSZWFkVGVzdChDb21tb25SZWFkVGVzdCk6CisgICAgdGFyb3BlbiA9IHRhcmZpbGUuVGFyRmlsZS50YXJvcGVuCiAKICAgICBkZWYgdGVzdF9ub19uYW1lX2FyZ3VtZW50KHNlbGYpOgogICAgICAgICBmb2JqID0gb3BlbihzZWxmLnRhcm5hbWUsICJyYiIpCkBAIC0yMjIsNiArMzA4LDE3IEBACiAgICAgICAgIHRhciA9IHRhcmZpbGUub3BlbihmaWxlb2JqPWZvYmosIG1vZGU9c2VsZi5tb2RlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhci5uYW1lLCBOb25lKQogCisgICAgZGVmIHRlc3RfaWxsZWdhbF9tb2RlX2FyZyhzZWxmKToKKyAgICAgICAgd2l0aCBvcGVuKHRtcG5hbWUsICd3YicpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFkZENsZWFudXAob3MudW5saW5rLCB0bXBuYW1lKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFZhbHVlRXJyb3IsICdtb2RlIG11c3QgYmUgJyk6CisgICAgICAgICAgICB0YXIgPSBzZWxmLnRhcm9wZW4odG1wbmFtZSwgJ3EnKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFZhbHVlRXJyb3IsICdtb2RlIG11c3QgYmUgJyk6CisgICAgICAgICAgICB0YXIgPSBzZWxmLnRhcm9wZW4odG1wbmFtZSwgJ3J3JykKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChWYWx1ZUVycm9yLCAnbW9kZSBtdXN0IGJlICcpOgorICAgICAgICAgICAgdGFyID0gc2VsZi50YXJvcGVuKHRtcG5hbWUsICcnKQorCiAgICAgZGVmIHRlc3RfZmlsZW9ial93aXRoX29mZnNldChzZWxmKToKICAgICAgICAgIyBTa2lwIHRoZSBmaXJzdCBtZW1iZXIgYW5kIHN0b3JlIHZhbHVlcyBmcm9tIHRoZSBzZWNvbmQgbWVtYmVyCiAgICAgICAgICMgb2YgdGhlIHRlc3R0YXIuCkBAIC0yNTcsNyArMzU0LDcgQEAKICAgICBkZWYgdGVzdF9mYWlsX2NvbXAoc2VsZik6CiAgICAgICAgICMgRm9yIEd6aXAgYW5kIEJ6MiBUZXN0czogZmFpbCB3aXRoIGEgUmVhZEVycm9yIG9uIGFuIHVuY29tcHJlc3NlZCBmaWxlLgogICAgICAgICBpZiBzZWxmLm1vZGUgPT0gInI6IjoKLSAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgnbmVlZHMgYSBneiBvciBiejIgbW9kZScpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIHRhcm5hbWUsIHNlbGYubW9kZSkKICAgICAgICAgZm9iaiA9IG9wZW4odGFybmFtZSwgInJiIikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgZmlsZW9iaj1mb2JqLCBtb2RlPXNlbGYubW9kZSkKQEAgLTI5NCwyNiArMzkxLDIxIEBACiAKICAgICBkZWYgdGVzdF9leHRyYWN0X2hhcmRsaW5rKHNlbGYpOgogICAgICAgICAjIFRlc3QgaGFyZGxpbmsgZXh0cmFjdGlvbiAoZS5nLiBidWcgIzg1NzI5NykuCi0gICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0YXJuYW1lLCBlcnJvcmxldmVsPTEsIGVuY29kaW5nPSJpc284ODU5LTEiKQorICAgICAgICB3aXRoIHRhcmZpbGUub3Blbih0YXJuYW1lLCBlcnJvcmxldmVsPTEsIGVuY29kaW5nPSJpc284ODU5LTEiKSBhcyB0YXI6CisgICAgICAgICAgICB0YXIuZXh0cmFjdCgidXN0YXIvcmVndHlwZSIsIFRFTVBESVIpCisgICAgICAgICAgICBzZWxmLmFkZENsZWFudXAob3MucmVtb3ZlLCBvcy5wYXRoLmpvaW4oVEVNUERJUiwgInVzdGFyL3JlZ3R5cGUiKSkKIAotICAgICAgICB0YXIuZXh0cmFjdCgidXN0YXIvcmVndHlwZSIsIFRFTVBESVIpCi0gICAgICAgIHRyeToKICAgICAgICAgICAgIHRhci5leHRyYWN0KCJ1c3Rhci9sbmt0eXBlIiwgVEVNUERJUikKLSAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IsIGU6Ci0gICAgICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVOT0VOVDoKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImhhcmRsaW5rIG5vdCBleHRyYWN0ZWQgcHJvcGVybHkiKQorICAgICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKG9zLnJlbW92ZSwgb3MucGF0aC5qb2luKFRFTVBESVIsICJ1c3Rhci9sbmt0eXBlIikpCisgICAgICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKFRFTVBESVIsICJ1c3Rhci9sbmt0eXBlIiksICJyYiIpIGFzIGY6CisgICAgICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1kNXN1bShkYXRhKSwgbWQ1X3JlZ3R5cGUpCiAKLSAgICAgICAgZGF0YSA9IG9wZW4ob3MucGF0aC5qb2luKFRFTVBESVIsICJ1c3Rhci9sbmt0eXBlIiksICJyYiIpLnJlYWQoKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1kNXN1bShkYXRhKSwgbWQ1X3JlZ3R5cGUpCi0KLSAgICAgICAgdHJ5OgogICAgICAgICAgICAgdGFyLmV4dHJhY3QoInVzdGFyL3N5bXR5cGUiLCBURU1QRElSKQotICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvciwgZToKLSAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRU5PRU5UOgotICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgic3ltbGluayBub3QgZXh0cmFjdGVkIHByb3Blcmx5IikKLQotICAgICAgICBkYXRhID0gb3Blbihvcy5wYXRoLmpvaW4oVEVNUERJUiwgInVzdGFyL3N5bXR5cGUiKSwgInJiIikucmVhZCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWQ1c3VtKGRhdGEpLCBtZDVfcmVndHlwZSkKKyAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy5yZW1vdmUsIG9zLnBhdGguam9pbihURU1QRElSLCAidXN0YXIvc3ltdHlwZSIpKQorICAgICAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihURU1QRElSLCAidXN0YXIvc3ltdHlwZSIpLCAicmIiKSBhcyBmOgorICAgICAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZDVzdW0oZGF0YSksIG1kNV9yZWd0eXBlKQogCiAgICAgZGVmIHRlc3RfZXh0cmFjdGFsbChzZWxmKToKICAgICAgICAgIyBUZXN0IGlmIGV4dHJhY3RhbGwoKSBjb3JyZWN0bHkgcmVzdG9yZXMgZGlyZWN0b3J5IHBlcm1pc3Npb25zCkBAIC0zNDcsNiArNDM5LDE0IEBACiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBvcy5yZW1vdmUoZW1wdHkpCiAKKyAgICBkZWYgdGVzdF9wYXJhbGxlbF9pdGVyYXRpb24oc2VsZik6CisgICAgICAgICMgSXNzdWUgIzE2NjAxOiBSZXN0YXJ0aW5nIGl0ZXJhdGlvbiBvdmVyIHRhcmZpbGUgY29udGludWVkCisgICAgICAgICMgZnJvbSB3aGVyZSBpdCBsZWZ0IG9mZi4KKyAgICAgICAgd2l0aCB0YXJmaWxlLm9wZW4oc2VsZi50YXJuYW1lKSBhcyB0YXI6CisgICAgICAgICAgICBmb3IgbTEsIG0yIGluIHppcCh0YXIsIHRhcik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtMS5vZmZzZXQsIG0yLm9mZnNldCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0xLm5hbWUsIG0yLm5hbWUpCisKIAogY2xhc3MgU3RyZWFtUmVhZFRlc3QoQ29tbW9uUmVhZFRlc3QpOgogCkBAIC00NDAsMTQgKzU0MCwxMiBAQAogICAgIGRlZiB0ZXN0X2RldGVjdF9maWxlb2JqKHNlbGYpOgogICAgICAgICBzZWxmLl90ZXN0X21vZGVzKHNlbGYuX3Rlc3RmdW5jX2ZpbGVvYmopCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhiejIsICdyZXF1aXJlcyBiejInKQogICAgIGRlZiB0ZXN0X2RldGVjdF9zdHJlYW1fYnoyKHNlbGYpOgogICAgICAgICAjIE9yaWdpbmFsbHksIHRhcmZpbGUncyBzdHJlYW0gZGV0ZWN0aW9uIGxvb2tlZCBmb3IgdGhlIHN0cmluZwogICAgICAgICAjICJCWmg5MSIgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiBUaGlzIGlzIGluY29ycmVjdCBiZWNhdXNlCiAgICAgICAgICMgdGhlICc5JyByZXByZXNlbnRzIHRoZSBibG9ja3NpemUgKDkwMGtCKS4gSWYgdGhlIGZpbGUgd2FzCiAgICAgICAgICMgY29tcHJlc3NlZCB1c2luZyBhbm90aGVyIGJsb2Nrc2l6ZSBhdXRvZGV0ZWN0aW9uIGZhaWxzLgotICAgICAgICBpZiBub3QgYnoyOgotICAgICAgICAgICAgcmV0dXJuCi0KICAgICAgICAgd2l0aCBvcGVuKHRhcm5hbWUsICJyYiIpIGFzIGZvYmo6CiAgICAgICAgICAgICBkYXRhID0gZm9iai5yZWFkKCkKIApAQCAtNjMzLDYgKzczMSwxMiBAQAogICAgICAgICB0YXIuYWRkZmlsZSh0YXJmaWxlLlRhckluZm8oImZvbyIpKQogICAgICAgICB0YXIuY2xvc2UoKQogICAgICAgICBzZWxmLmFzc2VydFRydWUoZm9iai5jbG9zZWQgaXMgRmFsc2UsICJleHRlcm5hbCBmaWxlb2JqcyBtdXN0IG5ldmVyIGNsb3NlZCIpCisgICAgICAgICMgSXNzdWUgIzIwMjM4OiBJbmNvbXBsZXRlIGd6aXAgb3V0cHV0IHdpdGggbW9kZT0idzpneiIKKyAgICAgICAgZGF0YSA9IGZvYmouZ2V0dmFsdWUoKQorICAgICAgICBkZWwgdGFyCisgICAgICAgIHRlc3Rfc3VwcG9ydC5nY19jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmb2JqLmNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBmb2JqLmdldHZhbHVlKCkpCiAKIAogY2xhc3MgV3JpdGVUZXN0KFdyaXRlVGVzdEJhc2UpOgpAQCAtODU1LDcgKzk1OSw3IEBACiAKICAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAiciIpCiAgICAgICAgICAgICBmb3IgdCBpbiB0YXI6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHQubmFtZSA9PSAiLiIgb3IgdC5uYW1lLnN0YXJ0c3dpdGgoIi4vIikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQubmFtZSA9PSAiLiIgb3IgdC5uYW1lLnN0YXJ0c3dpdGgoIi4vIikpCiAgICAgICAgICAgICB0YXIuY2xvc2UoKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgb3MuY2hkaXIoY3dkKQpAQCAtOTQ5LDYgKzEwNTMsMjIgQEAKICAgICAgICAgICAgIG9zLnVubGluayh0ZW1wYXJjaGl2ZSkKICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUodGVtcGRpcikKIAorICAgIGRlZiB0ZXN0X29wZW5fbm9ud3JpdGFibGVfZmlsZW9iaihzZWxmKToKKyAgICAgICAgZm9yIGV4Y3R5cGUgaW4gSU9FcnJvciwgRU9GRXJyb3IsIFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgIGNsYXNzIEJhZEZpbGUoU3RyaW5nSU8uU3RyaW5nSU8pOgorICAgICAgICAgICAgICAgIGZpcnN0ID0gVHJ1ZQorICAgICAgICAgICAgICAgIGRlZiB3cml0ZShzZWxmLCBkYXRhKToKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5maXJzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyc3QgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXhjdHlwZQorCisgICAgICAgICAgICBmID0gQmFkRmlsZSgpCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKGV4Y3R5cGUpOgorICAgICAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUsIGZpbGVvYmo9ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0PXRhcmZpbGUuUEFYX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF4X2hlYWRlcnM9eydub24nOiAnZW1wdHknfSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5jbG9zZWQpCisKIGNsYXNzIFN0cmVhbVdyaXRlVGVzdChXcml0ZVRlc3RCYXNlKToKIAogICAgIG1vZGUgPSAid3wiCkBAIC05NzYsMTIgKzEwOTYsMTEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRhdGEuY291bnQoIlwwIikgPT0gdGFyZmlsZS5SRUNPUkRTSVpFLAogICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNvcnJlY3QgemVybyBwYWRkaW5nIikKIAorICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09ICd3aW4zMicsICdub3QgYXBwcm9wcmlhdGUgZm9yIFdpbmRvd3MnKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICd1bWFzaycpLCAncmVxdWlyZXMgb3MudW1hc2snKQogICAgIGRlZiB0ZXN0X2ZpbGVfbW9kZShzZWxmKToKICAgICAgICAgIyBUZXN0IGZvciBpc3N1ZSAjODQ2NDogQ3JlYXRlIGZpbGVzIHdpdGggY29ycmVjdAogICAgICAgICAjIHBlcm1pc3Npb25zLgotICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIiBvciBub3QgaGFzYXR0cihvcywgInVtYXNrIik6Ci0gICAgICAgICAgICByZXR1cm4KLQogICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyh0bXBuYW1lKToKICAgICAgICAgICAgIG9zLnJlbW92ZSh0bXBuYW1lKQogCkBAIC05OTQsNiArMTExMywxMyBAQAogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgb3MudW1hc2sob3JpZ2luYWxfdW1hc2spCiAKKyAgICBkZWYgdGVzdF9pc3N1ZTEzNjM5KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIHRhcmZpbGUub3Blbih1bmljb2RlKHRtcG5hbWUsIHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSksIHNlbGYubW9kZSk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJfU3RyZWFtIGZhaWxlZCB0byB3cml0ZSB1bmljb2RlIGZpbGVuYW1lIikKKwogCiBjbGFzcyBHTlVXcml0ZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgICMgVGhpcyB0ZXN0Y2FzZSBjaGVja3MgZm9yIGNvcnJlY3QgY3JlYXRpb24gb2YgR05VIExvbmduYW1lCkBAIC0xMzQ3LDE1ICsxNDczLDEzIEBACiAgICAgICAgIHNlbGYuX2FkZF90ZXN0ZmlsZSgpCiAgICAgICAgIHNlbGYuX3Rlc3QobmFtZXM9WyJmb28iLCAiYmFyIl0pCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhnemlwLCAncmVxdWlyZXMgZ3ppcCcpCiAgICAgZGVmIHRlc3RfYXBwZW5kX2d6KHNlbGYpOgotICAgICAgICBpZiBnemlwIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KICAgICAgICAgc2VsZi5fY3JlYXRlX3Rlc3R0YXIoInc6Z3oiKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCB0bXBuYW1lLCAiYSIpCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhiejIsICdyZXF1aXJlcyBiejInKQogICAgIGRlZiB0ZXN0X2FwcGVuZF9iejIoc2VsZik6Ci0gICAgICAgIGlmIGJ6MiBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIHNlbGYuX2NyZWF0ZV90ZXN0dGFyKCJ3OmJ6MiIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIHRtcG5hbWUsICJhIikKIApAQCAtMTUyNyw2ICsxNjUxLDcgQEAKIGNsYXNzIEd6aXBNaXNjUmVhZFRlc3QoTWlzY1JlYWRUZXN0KToKICAgICB0YXJuYW1lID0gZ3ppcG5hbWUKICAgICBtb2RlID0gInI6Z3oiCisgICAgdGFyb3BlbiA9IHRhcmZpbGUuVGFyRmlsZS5nem9wZW4KIGNsYXNzIEd6aXBVc3RhclJlYWRUZXN0KFVzdGFyUmVhZFRlc3QpOgogICAgIHRhcm5hbWUgPSBnemlwbmFtZQogICAgIG1vZGUgPSAicjpneiIKQEAgLTE1NDIsNiArMTY2Nyw3IEBACiBjbGFzcyBCejJNaXNjUmVhZFRlc3QoTWlzY1JlYWRUZXN0KToKICAgICB0YXJuYW1lID0gYnoybmFtZQogICAgIG1vZGUgPSAicjpiejIiCisgICAgdGFyb3BlbiA9IHRhcmZpbGUuVGFyRmlsZS5iejJvcGVuCiBjbGFzcyBCejJVc3RhclJlYWRUZXN0KFVzdGFyUmVhZFRlc3QpOgogICAgIHRhcm5hbWUgPSBiejJuYW1lCiAgICAgbW9kZSA9ICJyOmJ6MiIKQEAgLTE1OTQsNiArMTcyMCw3IEBACiAgICAgICAgIE1lbWJlclJlYWRUZXN0LAogICAgICAgICBHTlVSZWFkVGVzdCwKICAgICAgICAgUGF4UmVhZFRlc3QsCisgICAgICAgIExpc3RUZXN0LAogICAgICAgICBXcml0ZVRlc3QsCiAgICAgICAgIFN0cmVhbVdyaXRlVGVzdCwKICAgICAgICAgR05VV3JpdGVUZXN0LApAQCAtMTYyNSw2ICsxNzUyLDcgQEAKICAgICAgICAgICAgIEd6aXBNaXNjUmVhZFRlc3QsCiAgICAgICAgICAgICBHemlwVXN0YXJSZWFkVGVzdCwKICAgICAgICAgICAgIEd6aXBTdHJlYW1SZWFkVGVzdCwKKyAgICAgICAgICAgIEd6aXBMaXN0VGVzdCwKICAgICAgICAgICAgIEd6aXBXcml0ZVRlc3QsCiAgICAgICAgICAgICBHemlwU3RyZWFtV3JpdGVUZXN0LAogICAgICAgICBdCkBAIC0xNjM5LDYgKzE3NjcsNyBAQAogICAgICAgICAgICAgQnoyTWlzY1JlYWRUZXN0LAogICAgICAgICAgICAgQnoyVXN0YXJSZWFkVGVzdCwKICAgICAgICAgICAgIEJ6MlN0cmVhbVJlYWRUZXN0LAorICAgICAgICAgICAgQnoyTGlzdFRlc3QsCiAgICAgICAgICAgICBCejJXcml0ZVRlc3QsCiAgICAgICAgICAgICBCejJTdHJlYW1Xcml0ZVRlc3QsCiAgICAgICAgICAgICBCejJQYXJ0aWFsUmVhZFRlc3QsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RjbC5weSBiL0xpYi90ZXN0L3Rlc3RfdGNsLnB5CmluZGV4IGU4YmE1OGYuLmZjYmFmYzUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGNsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdGNsLnB5CkBAIC0xLDggKzEsOCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0KIGltcG9ydCB1bml0dGVzdAoraW1wb3J0IHN5cwogaW1wb3J0IG9zCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSBzdWJwcm9jZXNzIGltcG9ydCBQb3BlbiwgUElQRQogCiAjIFNraXAgdGhpcyB0ZXN0IGlmIHRoZSBfdGtpbnRlciBtb2R1bGUgd2Fzbid0IGJ1aWx0LgogX3RraW50ZXIgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnX3RraW50ZXInKQpAQCAtMTAsNiArMTAsMzQgQEAKIGZyb20gVGtpbnRlciBpbXBvcnQgVGNsCiBmcm9tIF90a2ludGVyIGltcG9ydCBUY2xFcnJvcgogCit0cnk6CisgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IElOVF9NQVgsIFBZX1NTSVpFX1RfTUFYCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgSU5UX01BWCA9IFBZX1NTSVpFX1RfTUFYID0gc3lzLm1heHNpemUKKwordGNsX3ZlcnNpb24gPSBfdGtpbnRlci5UQ0xfVkVSU0lPTi5zcGxpdCgnLicpCit0cnk6CisgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHRjbF92ZXJzaW9uKSk6CisgICAgICAgIHRjbF92ZXJzaW9uW2ldID0gaW50KHRjbF92ZXJzaW9uW2ldKQorZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgcGFzcwordGNsX3ZlcnNpb24gPSB0dXBsZSh0Y2xfdmVyc2lvbikKKworX3RrX3BhdGNobGV2ZWwgPSBOb25lCitkZWYgZ2V0X3RrX3BhdGNobGV2ZWwoKToKKyAgICBnbG9iYWwgX3RrX3BhdGNobGV2ZWwKKyAgICBpZiBfdGtfcGF0Y2hsZXZlbCBpcyBOb25lOgorICAgICAgICB0Y2wgPSBUY2woKQorICAgICAgICBwYXRjaGxldmVsID0gW10KKyAgICAgICAgZm9yIHggaW4gdGNsLmNhbGwoJ2luZm8nLCAncGF0Y2hsZXZlbCcpLnNwbGl0KCcuJyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgeCA9IGludCh4LCAxMCkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHggPSAtMQorICAgICAgICAgICAgcGF0Y2hsZXZlbC5hcHBlbmQoeCkKKyAgICAgICAgX3RrX3BhdGNobGV2ZWwgPSB0dXBsZShwYXRjaGxldmVsKQorICAgIHJldHVybiBfdGtfcGF0Y2hsZXZlbAorCiAKIGNsYXNzIFRraW50ZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtMjIsNiArNTAsNyBAQAogCiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLmludGVycCA9IFRjbCgpCisgICAgICAgIHNlbGYud2FudG9iamVjdHMgPSBzZWxmLmludGVycC50ay53YW50b2JqZWN0cygpCiAKICAgICBkZWYgdGVzdEV2YWwoc2VsZik6CiAgICAgICAgIHRjbCA9IHNlbGYuaW50ZXJwCkBAIC05OCw2ICsxMjcsNTMgQEAKICAgICAgICAgdGNsID0gc2VsZi5pbnRlcnAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGNsRXJyb3IsdGNsLnVuc2V0dmFyLCdhJykKIAorICAgIGRlZiB0ZXN0X2dldGludChzZWxmKToKKyAgICAgICAgdGNsID0gc2VsZi5pbnRlcnAudGsKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Y2wuZ2V0aW50KCcgNDIgJyksIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRjbC5nZXRpbnQoNDIpLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0Y2wuZ2V0aW50KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHRjbC5nZXRpbnQsICc0MicsICcxMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdGNsLmdldGludCwgNDIuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGNsRXJyb3IsIHRjbC5nZXRpbnQsICdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKFR5cGVFcnJvciwgVmFsdWVFcnJvciwgVGNsRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2wuZ2V0aW50LCAnNDJcMCcpCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC5oYXZlX3VuaWNvZGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRjbC5nZXRpbnQodW5pY29kZSgnNDInKSksIDQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKFVuaWNvZGVFbmNvZGVFcnJvciwgVmFsdWVFcnJvciwgVGNsRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNsLmdldGludCwgJzQyJyArIHVuaWNocigweGQ4MDApKQorCisgICAgZGVmIHRlc3RfZ2V0ZG91YmxlKHNlbGYpOgorICAgICAgICB0Y2wgPSBzZWxmLmludGVycC50aworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRjbC5nZXRkb3VibGUoJyA0MiAnKSwgNDIuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Y2wuZ2V0ZG91YmxlKCcgNDIuNSAnKSwgNDIuNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Y2wuZ2V0ZG91YmxlKDQyLjUpLCA0Mi41KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHRjbC5nZXRkb3VibGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdGNsLmdldGRvdWJsZSwgJzQyLjUnLCAnMTAnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHRjbC5nZXRkb3VibGUsIDQyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUY2xFcnJvciwgdGNsLmdldGRvdWJsZSwgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoVHlwZUVycm9yLCBWYWx1ZUVycm9yLCBUY2xFcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRjbC5nZXRkb3VibGUsICc0Mi41XDAnKQorICAgICAgICBpZiB0ZXN0X3N1cHBvcnQuaGF2ZV91bmljb2RlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Y2wuZ2V0ZG91YmxlKHVuaWNvZGUoJzQyLjUnKSksIDQyLjUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoVW5pY29kZUVuY29kZUVycm9yLCBWYWx1ZUVycm9yLCBUY2xFcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2wuZ2V0ZG91YmxlLCAnNDIuNScgKyB1bmljaHIoMHhkODAwKSkKKworICAgIGRlZiB0ZXN0X2dldGJvb2xlYW4oc2VsZik6CisgICAgICAgIHRjbCA9IHNlbGYuaW50ZXJwLnRrCisgICAgICAgIHNlbGYuYXNzZXJ0SXModGNsLmdldGJvb2xlYW4oJ29uJyksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModGNsLmdldGJvb2xlYW4oJzEnKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Y2wuZ2V0Ym9vbGVhbig0MiksIDQyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHRjbC5nZXRib29sZWFuKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHRjbC5nZXRib29sZWFuLCAnb24nLCAnMScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdGNsLmdldGJvb2xlYW4sIDEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGNsRXJyb3IsIHRjbC5nZXRib29sZWFuLCAnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIFZhbHVlRXJyb3IsIFRjbEVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGNsLmdldGJvb2xlYW4sICdvblwwJykKKyAgICAgICAgaWYgdGVzdF9zdXBwb3J0LmhhdmVfdW5pY29kZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModGNsLmdldGJvb2xlYW4odW5pY29kZSgnb24nKSksIFRydWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoVW5pY29kZUVuY29kZUVycm9yLCBWYWx1ZUVycm9yLCBUY2xFcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2wuZ2V0Ym9vbGVhbiwgJ29uJyArIHVuaWNocigweGQ4MDApKQorCiAgICAgZGVmIHRlc3RFdmFsRmlsZShzZWxmKToKICAgICAgICAgdGNsID0gc2VsZi5pbnRlcnAKICAgICAgICAgZmlsZW5hbWUgPSAidGVzdEV2YWxGaWxlLnRjbCIKQEAgLTExNCw2ICsxOTAsMTggQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Y2wuZXZhbCgnc2V0IGInKSwnMicpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGNsLmV2YWwoJ3NldCBjJyksJzMnKQogCisgICAgZGVmIHRlc3RfZXZhbGZpbGVfbnVsbF9pbl9yZXN1bHQoc2VsZik6CisgICAgICAgIHRjbCA9IHNlbGYuaW50ZXJwCisgICAgICAgIHdpdGggb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAnd2InKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHRlc3Rfc3VwcG9ydC51bmxpbmssIHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICAgICBmLndyaXRlKCIiIgorICAgICAgICAgICAgc2V0IGEgImFcMGIiCisgICAgICAgICAgICBzZXQgYiAiYVxcMGIiCisgICAgICAgICAgICAiIiIpCisgICAgICAgIHRjbC5ldmFsZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRjbC5ldmFsKCdzZXQgYScpLCAnYVx4YzBceDgwYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGNsLmV2YWwoJ3NldCBiJyksICdhXHhjMFx4ODBiJykKKwogICAgIGRlZiB0ZXN0RXZhbEZpbGVFeGNlcHRpb24oc2VsZik6CiAgICAgICAgIHRjbCA9IHNlbGYuaW50ZXJwCiAgICAgICAgIGZpbGVuYW1lID0gImRvZXNub3RleGlzdHMiCkBAIC0xMjcsMzQgKzIxNSw0MjkgQEAKICAgICAgICAgdGNsID0gc2VsZi5pbnRlcnAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGNsRXJyb3IsdGNsLmV2YWwsJ3BhY2thZ2UgcmVxdWlyZSBETkUnKQogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICd3aW4zMicsICJvbmx5IGFwcGxpZXMgdG8gV2luZG93cyIpCiAgICAgZGVmIHRlc3RMb2FkV2l0aFVOQyhzZWxmKToKLSAgICAgICAgaW1wb3J0IHN5cwotICAgICAgICBpZiBzeXMucGxhdGZvcm0gIT0gJ3dpbjMyJzoKLSAgICAgICAgICAgIHJldHVybgotCiAgICAgICAgICMgQnVpbGQgYSBVTkMgcGF0aCBmcm9tIHRoZSByZWd1bGFyIHBhdGguCiAgICAgICAgICMgU29tZXRoaW5nIGxpa2UKICAgICAgICAgIyAgIFxcJUNPTVBVVEVSTkFNRSVcYyRccHl0aG9uMjdccHl0aG9uLmV4ZQogCiAgICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5hYnNwYXRoKHN5cy5leGVjdXRhYmxlKQogICAgICAgICBpZiBmdWxsbmFtZVsxXSAhPSAnOic6Ci0gICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ3VudXNhYmxlIHBhdGg6ICVyJyAlIGZ1bGxuYW1lKQogICAgICAgICB1bmNfbmFtZSA9IHInXFwlc1wlcyRcJXMnICUgKG9zLmVudmlyb25bJ0NPTVBVVEVSTkFNRSddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbG5hbWVbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsbmFtZVszOl0pCiAKICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuRW52aXJvbm1lbnRWYXJHdWFyZCgpIGFzIGVudjoKICAgICAgICAgICAgIGVudi51bnNldCgiVENMX0xJQlJBUlkiKQotICAgICAgICAgICAgZiA9IG9zLnBvcGVuKCclcyAtYyAiaW1wb3J0IFRraW50ZXI7IHByaW50IFRraW50ZXIiJyAlICh1bmNfbmFtZSwpKQorICAgICAgICAgICAgY21kID0gJyVzIC1jICJpbXBvcnQgVGtpbnRlcjsgcHJpbnQgVGtpbnRlciInICUgKHVuY19uYW1lLCkKIAotICAgICAgICBzZWxmLmFzc2VydFRydWUoJ1RraW50ZXIucHknIGluIGYucmVhZCgpKQotICAgICAgICAjIGV4aXQgY29kZSBtdXN0IGJlIHplcm8KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmNsb3NlKCksIE5vbmUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcCA9IFBvcGVuKGNtZCwgc3Rkb3V0PVBJUEUsIHN0ZGVycj1QSVBFKQorICAgICAgICAgICAgZXhjZXB0IFdpbmRvd3NFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgIGlmIGUud2luZXJyb3IgPT0gNToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgnTm90IHBlcm1pdHRlZCB0byBzdGFydCB0aGUgY2hpbGQgcHJvY2VzcycpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKIAorICAgICAgICAgICAgb3V0X2RhdGEsIGVycl9kYXRhID0gcC5jb21tdW5pY2F0ZSgpCisKKyAgICAgICAgICAgIG1zZyA9ICdcblxuJy5qb2luKFsnIlRraW50ZXIucHkiIG5vdCBpbiBvdXRwdXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb21tYW5kOicsIGNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3Rkb3V0OicsIG91dF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdGRlcnI6JywgZXJyX2RhdGFdKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCdUa2ludGVyLnB5Jywgb3V0X2RhdGEsIG1zZykKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLndhaXQoKSwgMCwgJ05vbi16ZXJvIGV4aXQgY29kZScpCisKKworICAgIGRlZiB0ZXN0X2V4cHJzdHJpbmcoc2VsZik6CisgICAgICAgIHRjbCA9IHNlbGYuaW50ZXJwCisgICAgICAgIHRjbC5jYWxsKCdzZXQnLCAnYScsIDMpCisgICAgICAgIHRjbC5jYWxsKCdzZXQnLCAnYicsIDYpCisgICAgICAgIGRlZiBjaGVjayhleHByLCBleHBlY3RlZCk6CisgICAgICAgICAgICByZXN1bHQgPSB0Y2wuZXhwcnN0cmluZyhleHByKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGV4cGVjdGVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHJlc3VsdCwgc3RyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdGNsLmV4cHJzdHJpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdGNsLmV4cHJzdHJpbmcsICc4LjInLCAnKzYnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUY2xFcnJvciwgdGNsLmV4cHJzdHJpbmcsICdzcGFtJykKKyAgICAgICAgY2hlY2soJycsICcwJykKKyAgICAgICAgY2hlY2soJzguMiArIDYnLCAnMTQuMicpCisgICAgICAgIGNoZWNrKCczLjEgKyAkYScsICc2LjEnKQorICAgICAgICBjaGVjaygnMiArICIkYS4kYiInLCAnNS42JykKKyAgICAgICAgY2hlY2soJzQqW2xsZW5ndGggIjYgMiJdJywgJzgnKQorICAgICAgICBjaGVjaygne3dvcmQgb25lfSA8ICJ3b3JkICRhIicsICcwJykKKyAgICAgICAgY2hlY2soJzQqMiA8IDcnLCAnMCcpCisgICAgICAgIGNoZWNrKCdoeXBvdCgkYSwgNCknLCAnNS4wJykKKyAgICAgICAgY2hlY2soJzUgLyA0JywgJzEnKQorICAgICAgICBjaGVjaygnNSAvIDQuMCcsICcxLjI1JykKKyAgICAgICAgY2hlY2soJzUgLyAoIFtzdHJpbmcgbGVuZ3RoICJhYmNkIl0gKyAwLjAgKScsICcxLjI1JykKKyAgICAgICAgY2hlY2soJzIwLjAvNS4wJywgJzQuMCcpCisgICAgICAgIGNoZWNrKCciMHgwMyIgPiAiMiInLCAnMScpCisgICAgICAgIGNoZWNrKCdbc3RyaW5nIGxlbmd0aCAiYVx4YzJceGJkXHhlMlx4ODJceGFjIl0nLCAnMycpCisgICAgICAgIGNoZWNrKHInW3N0cmluZyBsZW5ndGggImFceGJkXHUyMGFjIl0nLCAnMycpCisgICAgICAgIGNoZWNrKCciYWJjIicsICdhYmMnKQorICAgICAgICBjaGVjaygnImFceGMyXHhiZFx4ZTJceDgyXHhhYyInLCAnYVx4YzJceGJkXHhlMlx4ODJceGFjJykKKyAgICAgICAgY2hlY2sociciYVx4YmRcdTIwYWMiJywgJ2FceGMyXHhiZFx4ZTJceDgyXHhhYycpCisgICAgICAgIGNoZWNrKHInImFcMGIiJywgJ2FceGMwXHg4MGInKQorICAgICAgICBpZiB0Y2xfdmVyc2lvbiA+PSAoOCwgNSk6CisgICAgICAgICAgICBjaGVjaygnMioqNjQnLCBzdHIoMioqNjQpKQorCisgICAgZGVmIHRlc3RfZXhwcmRvdWJsZShzZWxmKToKKyAgICAgICAgdGNsID0gc2VsZi5pbnRlcnAKKyAgICAgICAgdGNsLmNhbGwoJ3NldCcsICdhJywgMykKKyAgICAgICAgdGNsLmNhbGwoJ3NldCcsICdiJywgNikKKyAgICAgICAgZGVmIGNoZWNrKGV4cHIsIGV4cGVjdGVkKToKKyAgICAgICAgICAgIHJlc3VsdCA9IHRjbC5leHByZG91YmxlKGV4cHIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZXhwZWN0ZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UocmVzdWx0LCBmbG9hdCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHRjbC5leHByZG91YmxlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHRjbC5leHByZG91YmxlLCAnOC4yJywgJys2JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGNsRXJyb3IsIHRjbC5leHByZG91YmxlLCAnc3BhbScpCisgICAgICAgIGNoZWNrKCcnLCAwLjApCisgICAgICAgIGNoZWNrKCc4LjIgKyA2JywgMTQuMikKKyAgICAgICAgY2hlY2soJzMuMSArICRhJywgNi4xKQorICAgICAgICBjaGVjaygnMiArICIkYS4kYiInLCA1LjYpCisgICAgICAgIGNoZWNrKCc0KltsbGVuZ3RoICI2IDIiXScsIDguMCkKKyAgICAgICAgY2hlY2soJ3t3b3JkIG9uZX0gPCAid29yZCAkYSInLCAwLjApCisgICAgICAgIGNoZWNrKCc0KjIgPCA3JywgMC4wKQorICAgICAgICBjaGVjaygnaHlwb3QoJGEsIDQpJywgNS4wKQorICAgICAgICBjaGVjaygnNSAvIDQnLCAxLjApCisgICAgICAgIGNoZWNrKCc1IC8gNC4wJywgMS4yNSkKKyAgICAgICAgY2hlY2soJzUgLyAoIFtzdHJpbmcgbGVuZ3RoICJhYmNkIl0gKyAwLjAgKScsIDEuMjUpCisgICAgICAgIGNoZWNrKCcyMC4wLzUuMCcsIDQuMCkKKyAgICAgICAgY2hlY2soJyIweDAzIiA+ICIyIicsIDEuMCkKKyAgICAgICAgY2hlY2soJ1tzdHJpbmcgbGVuZ3RoICJhXHhjMlx4YmRceGUyXHg4Mlx4YWMiXScsIDMuMCkKKyAgICAgICAgY2hlY2socidbc3RyaW5nIGxlbmd0aCAiYVx4YmRcdTIwYWMiXScsIDMuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGNsRXJyb3IsIHRjbC5leHByZG91YmxlLCAnImFiYyInKQorICAgICAgICBpZiB0Y2xfdmVyc2lvbiA+PSAoOCwgNSk6CisgICAgICAgICAgICBjaGVjaygnMioqNjQnLCBmbG9hdCgyKio2NCkpCisKKyAgICBkZWYgdGVzdF9leHBybG9uZyhzZWxmKToKKyAgICAgICAgdGNsID0gc2VsZi5pbnRlcnAKKyAgICAgICAgdGNsLmNhbGwoJ3NldCcsICdhJywgMykKKyAgICAgICAgdGNsLmNhbGwoJ3NldCcsICdiJywgNikKKyAgICAgICAgZGVmIGNoZWNrKGV4cHIsIGV4cGVjdGVkKToKKyAgICAgICAgICAgIHJlc3VsdCA9IHRjbC5leHBybG9uZyhleHByKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGV4cGVjdGVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHJlc3VsdCwgaW50KQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdGNsLmV4cHJsb25nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHRjbC5leHBybG9uZywgJzguMicsICcrNicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRjbEVycm9yLCB0Y2wuZXhwcmxvbmcsICdzcGFtJykKKyAgICAgICAgY2hlY2soJycsIDApCisgICAgICAgIGNoZWNrKCc4LjIgKyA2JywgMTQpCisgICAgICAgIGNoZWNrKCczLjEgKyAkYScsIDYpCisgICAgICAgIGNoZWNrKCcyICsgIiRhLiRiIicsIDUpCisgICAgICAgIGNoZWNrKCc0KltsbGVuZ3RoICI2IDIiXScsIDgpCisgICAgICAgIGNoZWNrKCd7d29yZCBvbmV9IDwgIndvcmQgJGEiJywgMCkKKyAgICAgICAgY2hlY2soJzQqMiA8IDcnLCAwKQorICAgICAgICBjaGVjaygnaHlwb3QoJGEsIDQpJywgNSkKKyAgICAgICAgY2hlY2soJzUgLyA0JywgMSkKKyAgICAgICAgY2hlY2soJzUgLyA0LjAnLCAxKQorICAgICAgICBjaGVjaygnNSAvICggW3N0cmluZyBsZW5ndGggImFiY2QiXSArIDAuMCApJywgMSkKKyAgICAgICAgY2hlY2soJzIwLjAvNS4wJywgNCkKKyAgICAgICAgY2hlY2soJyIweDAzIiA+ICIyIicsIDEpCisgICAgICAgIGNoZWNrKCdbc3RyaW5nIGxlbmd0aCAiYVx4YzJceGJkXHhlMlx4ODJceGFjIl0nLCAzKQorICAgICAgICBjaGVjayhyJ1tzdHJpbmcgbGVuZ3RoICJhXHhiZFx1MjBhYyJdJywgMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGNsRXJyb3IsIHRjbC5leHBybG9uZywgJyJhYmMiJykKKyAgICAgICAgaWYgdGNsX3ZlcnNpb24gPj0gKDgsIDUpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGNsRXJyb3IsIHRjbC5leHBybG9uZywgJzIqKjY0JykKKworICAgIGRlZiB0ZXN0X2V4cHJib29sZWFuKHNlbGYpOgorICAgICAgICB0Y2wgPSBzZWxmLmludGVycAorICAgICAgICB0Y2wuY2FsbCgnc2V0JywgJ2EnLCAzKQorICAgICAgICB0Y2wuY2FsbCgnc2V0JywgJ2InLCA2KQorICAgICAgICBkZWYgY2hlY2soZXhwciwgZXhwZWN0ZWQpOgorICAgICAgICAgICAgcmVzdWx0ID0gdGNsLmV4cHJib29sZWFuKGV4cHIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZXhwZWN0ZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UocmVzdWx0LCBpbnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdElzSW5zdGFuY2UocmVzdWx0LCBib29sKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdGNsLmV4cHJib29sZWFuKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHRjbC5leHByYm9vbGVhbiwgJzguMicsICcrNicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRjbEVycm9yLCB0Y2wuZXhwcmJvb2xlYW4sICdzcGFtJykKKyAgICAgICAgY2hlY2soJycsIEZhbHNlKQorICAgICAgICBmb3IgdmFsdWUgaW4gKCcwJywgJ2ZhbHNlJywgJ25vJywgJ29mZicpOgorICAgICAgICAgICAgY2hlY2sodmFsdWUsIEZhbHNlKQorICAgICAgICAgICAgY2hlY2soJyIlcyInICUgdmFsdWUsIEZhbHNlKQorICAgICAgICAgICAgY2hlY2soJ3slc30nICUgdmFsdWUsIEZhbHNlKQorICAgICAgICBmb3IgdmFsdWUgaW4gKCcxJywgJ3RydWUnLCAneWVzJywgJ29uJyk6CisgICAgICAgICAgICBjaGVjayh2YWx1ZSwgVHJ1ZSkKKyAgICAgICAgICAgIGNoZWNrKCciJXMiJyAlIHZhbHVlLCBUcnVlKQorICAgICAgICAgICAgY2hlY2soJ3slc30nICUgdmFsdWUsIFRydWUpCisgICAgICAgIGNoZWNrKCc4LjIgKyA2JywgVHJ1ZSkKKyAgICAgICAgY2hlY2soJzMuMSArICRhJywgVHJ1ZSkKKyAgICAgICAgY2hlY2soJzIgKyAiJGEuJGIiJywgVHJ1ZSkKKyAgICAgICAgY2hlY2soJzQqW2xsZW5ndGggIjYgMiJdJywgVHJ1ZSkKKyAgICAgICAgY2hlY2soJ3t3b3JkIG9uZX0gPCAid29yZCAkYSInLCBGYWxzZSkKKyAgICAgICAgY2hlY2soJzQqMiA8IDcnLCBGYWxzZSkKKyAgICAgICAgY2hlY2soJ2h5cG90KCRhLCA0KScsIFRydWUpCisgICAgICAgIGNoZWNrKCc1IC8gNCcsIFRydWUpCisgICAgICAgIGNoZWNrKCc1IC8gNC4wJywgVHJ1ZSkKKyAgICAgICAgY2hlY2soJzUgLyAoIFtzdHJpbmcgbGVuZ3RoICJhYmNkIl0gKyAwLjAgKScsIFRydWUpCisgICAgICAgIGNoZWNrKCcyMC4wLzUuMCcsIFRydWUpCisgICAgICAgIGNoZWNrKCciMHgwMyIgPiAiMiInLCBUcnVlKQorICAgICAgICBjaGVjaygnW3N0cmluZyBsZW5ndGggImFceGMyXHhiZFx4ZTJceDgyXHhhYyJdJywgVHJ1ZSkKKyAgICAgICAgY2hlY2socidbc3RyaW5nIGxlbmd0aCAiYVx4YmRcdTIwYWMiXScsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRjbEVycm9yLCB0Y2wuZXhwcmJvb2xlYW4sICciYWJjIicpCisgICAgICAgIGlmIHRjbF92ZXJzaW9uID49ICg4LCA1KToKKyAgICAgICAgICAgIGNoZWNrKCcyKio2NCcsIFRydWUpCisKKyAgICBkZWYgdGVzdF9wYXNzaW5nX3ZhbHVlcyhzZWxmKToKKyAgICAgICAgZGVmIHBhc3NWYWx1ZSh2YWx1ZSk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5pbnRlcnAuY2FsbCgnc2V0JywgJ18nLCB2YWx1ZSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhc3NWYWx1ZShUcnVlKSwgVHJ1ZSBpZiBzZWxmLndhbnRvYmplY3RzIGVsc2UgJzEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhc3NWYWx1ZShGYWxzZSksIEZhbHNlIGlmIHNlbGYud2FudG9iamVjdHMgZWxzZSAnMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFzc1ZhbHVlKCdzdHJpbmcnKSwgJ3N0cmluZycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFzc1ZhbHVlKCdzdHJpbmdceGJkJyksICdzdHJpbmdceGJkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXNzVmFsdWUoJ3N0cmluZ1x4ZTJceDgyXHhhYycpLCB1J3N0cmluZ1x1MjBhYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFzc1ZhbHVlKHUnc3RyaW5nJyksIHUnc3RyaW5nJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXNzVmFsdWUodSdzdHJpbmdceGJkJyksIHUnc3RyaW5nXHhiZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFzc1ZhbHVlKHUnc3RyaW5nXHUyMGFjJyksIHUnc3RyaW5nXHUyMGFjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXNzVmFsdWUoJ3N0clx4MDBpbmcnKSwgJ3N0clx4MDBpbmcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhc3NWYWx1ZSgnc3RyXHhjMFx4ODBpbmcnKSwgJ3N0clx4MDBpbmcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhc3NWYWx1ZSh1J3N0clx4MDBpbmcnKSwgdSdzdHJceDAwaW5nJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXNzVmFsdWUodSdzdHJceDAwaW5nXHhiZCcpLCB1J3N0clx4MDBpbmdceGJkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXNzVmFsdWUodSdzdHJceDAwaW5nXHUyMGFjJyksIHUnc3RyXHgwMGluZ1x1MjBhYycpCisgICAgICAgIGZvciBpIGluICgwLCAxLCAtMSwgaW50KDIqKjMxLTEpLCBpbnQoLTIqKjMxKSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhc3NWYWx1ZShpKSwgaSBpZiBzZWxmLndhbnRvYmplY3RzIGVsc2Ugc3RyKGkpKQorICAgICAgICBmb3IgZiBpbiAoMC4wLCAxLjAsIC0xLjAsIDEvLzMsIDEvMy4wLAorICAgICAgICAgICAgICAgICAgc3lzLmZsb2F0X2luZm8ubWluLCBzeXMuZmxvYXRfaW5mby5tYXgsCisgICAgICAgICAgICAgICAgICAtc3lzLmZsb2F0X2luZm8ubWluLCAtc3lzLmZsb2F0X2luZm8ubWF4KToKKyAgICAgICAgICAgIGlmIHNlbGYud2FudG9iamVjdHM6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXNzVmFsdWUoZiksIGYpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQocGFzc1ZhbHVlKGYpKSwgZikKKyAgICAgICAgaWYgc2VsZi53YW50b2JqZWN0czoKKyAgICAgICAgICAgIGYgPSBwYXNzVmFsdWUoZmxvYXQoJ25hbicpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChmLCBmKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXNzVmFsdWUoZmxvYXQoJ2luZicpKSwgZmxvYXQoJ2luZicpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXNzVmFsdWUoLWZsb2F0KCdpbmYnKSksIC1mbG9hdCgnaW5mJykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KHBhc3NWYWx1ZShmbG9hdCgnaW5mJykpKSwgZmxvYXQoJ2luZicpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdChwYXNzVmFsdWUoLWZsb2F0KCdpbmYnKSkpLCAtZmxvYXQoJ2luZicpKQorICAgICAgICAgICAgIyBYWFggTmFOIHJlcHJlc2VudGF0aW9uIGNhbiBiZSBub3QgcGFyc2FibGUgYnkgZmxvYXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhc3NWYWx1ZSgoMSwgJzInLCAoMy40LCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoMSwgJzInLCAoMy40LCkpIGlmIHNlbGYud2FudG9iamVjdHMgZWxzZSAnMSAyIDMuNCcpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJhaXgiKSwgJ0lzc3VlICMyMTk1MTogY3Jhc2hlcyBvbiBBSVgnKQorICAgIGRlZiB0ZXN0X3VzZXJfY29tbWFuZChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgZGVmIHRlc3RmdW5jKGFyZyk6CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGFyZykKKyAgICAgICAgICAgIHJldHVybiBhcmcKKyAgICAgICAgc2VsZi5pbnRlcnAuY3JlYXRlY29tbWFuZCgndGVzdGZ1bmMnLCB0ZXN0ZnVuYykKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNlbGYuaW50ZXJwLnRrLmRlbGV0ZWNvbW1hbmQsICd0ZXN0ZnVuYycpCisgICAgICAgIGRlZiBjaGVjayh2YWx1ZSwgZXhwZWN0ZWQsIGV4cGVjdGVkMj1Ob25lLCBlcT1zZWxmLmFzc2VydEVxdWFsKToKKyAgICAgICAgICAgIGlmIGV4cGVjdGVkMiBpcyBOb25lOgorICAgICAgICAgICAgICAgIGV4cGVjdGVkMiA9IGV4cGVjdGVkCisgICAgICAgICAgICBkZWwgcmVzdWx0WzpdCisgICAgICAgICAgICByID0gc2VsZi5pbnRlcnAuY2FsbCgndGVzdGZ1bmMnLCB2YWx1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdCksIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UocmVzdWx0WzBdLCAoc3RyLCB1bmljb2RlKSkKKyAgICAgICAgICAgIGVxKHJlc3VsdFswXSwgZXhwZWN0ZWQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHIsIChzdHIsIHVuaWNvZGUpKQorICAgICAgICAgICAgZXEociwgZXhwZWN0ZWQyKQorICAgICAgICBkZWYgZmxvYXRfZXEoYWN0dWFsLCBleHBlY3RlZCk6CisgICAgICAgICAgICBleHBlY3RlZCA9IGZsb2F0KGV4cGVjdGVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChmbG9hdChhY3R1YWwpLCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGE9YWJzKGV4cGVjdGVkKSAqIDFlLTEwKQorCisgICAgICAgIGNoZWNrKFRydWUsICcxJykKKyAgICAgICAgY2hlY2soRmFsc2UsICcwJykKKyAgICAgICAgY2hlY2soJ3N0cmluZycsICdzdHJpbmcnKQorICAgICAgICBjaGVjaygnc3RyaW5nXHhiZCcsICdzdHJpbmdceGJkJykKKyAgICAgICAgY2hlY2soJ3N0cmluZ1x4ZTJceDgyXHhhYycsICdzdHJpbmdceGUyXHg4Mlx4YWMnLCB1J3N0cmluZ1x1MjBhYycpCisgICAgICAgIGNoZWNrKHUnc3RyaW5nJywgdSdzdHJpbmcnKQorICAgICAgICBjaGVjayh1J3N0cmluZ1x4YmQnLCAnc3RyaW5nXHhjMlx4YmQnLCB1J3N0cmluZ1x4YmQnKQorICAgICAgICBjaGVjayh1J3N0cmluZ1x1MjBhYycsICdzdHJpbmdceGUyXHg4Mlx4YWMnLCB1J3N0cmluZ1x1MjBhYycpCisgICAgICAgIGNoZWNrKCdzdHJceGMwXHg4MGluZycsICdzdHJceGMwXHg4MGluZycsIHUnc3RyXHgwMGluZycpCisgICAgICAgIGNoZWNrKCdzdHJceGMwXHg4MGluZ1x4ZTJceDgyXHhhYycsICdzdHJceGMwXHg4MGluZ1x4ZTJceDgyXHhhYycsIHUnc3RyXHgwMGluZ1x1MjBhYycpCisgICAgICAgIGNoZWNrKHUnc3RyXHgwMGluZycsICdzdHJceGMwXHg4MGluZycsIHUnc3RyXHgwMGluZycpCisgICAgICAgIGNoZWNrKHUnc3RyXHgwMGluZ1x4YmQnLCAnc3RyXHhjMFx4ODBpbmdceGMyXHhiZCcsIHUnc3RyXHgwMGluZ1x4YmQnKQorICAgICAgICBjaGVjayh1J3N0clx4MDBpbmdcdTIwYWMnLCAnc3RyXHhjMFx4ODBpbmdceGUyXHg4Mlx4YWMnLCB1J3N0clx4MDBpbmdcdTIwYWMnKQorICAgICAgICBmb3IgaSBpbiAoMCwgMSwgLTEsIDIqKjMxLTEsIC0yKiozMSk6CisgICAgICAgICAgICBjaGVjayhpLCBzdHIoaSkpCisgICAgICAgIGZvciBmIGluICgwLjAsIDEuMCwgLTEuMCk6CisgICAgICAgICAgICBjaGVjayhmLCByZXByKGYpKQorICAgICAgICBmb3IgZiBpbiAoMS8zLjAsIHN5cy5mbG9hdF9pbmZvLm1pbiwgc3lzLmZsb2F0X2luZm8ubWF4LAorICAgICAgICAgICAgICAgICAgLXN5cy5mbG9hdF9pbmZvLm1pbiwgLXN5cy5mbG9hdF9pbmZvLm1heCk6CisgICAgICAgICAgICBjaGVjayhmLCBmLCBlcT1mbG9hdF9lcSkKKyAgICAgICAgY2hlY2soZmxvYXQoJ2luZicpLCAnSW5mJywgZXE9ZmxvYXRfZXEpCisgICAgICAgIGNoZWNrKC1mbG9hdCgnaW5mJyksICctSW5mJywgZXE9ZmxvYXRfZXEpCisgICAgICAgICMgWFhYIE5hTiByZXByZXNlbnRhdGlvbiBjYW4gYmUgbm90IHBhcnNhYmxlIGJ5IGZsb2F0KCkKKyAgICAgICAgY2hlY2soKCksICcnKQorICAgICAgICBjaGVjaygoMSwgKDIsKSwgKDMsIDQpLCAnNSA2JywgKCkpLCAnMSAyIHszIDR9IHs1IDZ9IHt9JykKKworICAgIGRlZiB0ZXN0X3NwbGl0bGlzdChzZWxmKToKKyAgICAgICAgc3BsaXRsaXN0ID0gc2VsZi5pbnRlcnAudGsuc3BsaXRsaXN0CisgICAgICAgIGNhbGwgPSBzZWxmLmludGVycC50ay5jYWxsCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3BsaXRsaXN0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNwbGl0bGlzdCwgJ2EnLCAnYicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3BsaXRsaXN0LCAyKQorICAgICAgICB0ZXN0Y2FzZXMgPSBbCisgICAgICAgICAgICAoJzInLCAoJzInLCkpLAorICAgICAgICAgICAgKCcnLCAoKSksCisgICAgICAgICAgICAoJ3t9JywgKCcnLCkpLAorICAgICAgICAgICAgKCciIicsICgnJywpKSwKKyAgICAgICAgICAgICgnYVxuIGJcdFxyIGNcbiAnLCAoJ2EnLCAnYicsICdjJykpLAorICAgICAgICAgICAgKHUnYVxuIGJcdFxyIGNcbiAnLCAoJ2EnLCAnYicsICdjJykpLAorICAgICAgICAgICAgKCdhIFx4ZTJceDgyXHhhYycsICgnYScsICdceGUyXHg4Mlx4YWMnKSksCisgICAgICAgICAgICAodSdhIFx1MjBhYycsICgnYScsICdceGUyXHg4Mlx4YWMnKSksCisgICAgICAgICAgICAoJ2FceGMwXHg4MGIgY1x4YzBceDgwZCcsICgnYVx4YzBceDgwYicsICdjXHhjMFx4ODBkJykpLAorICAgICAgICAgICAgKCdhIHtiIGN9JywgKCdhJywgJ2IgYycpKSwKKyAgICAgICAgICAgIChyJ2EgYlwgYycsICgnYScsICdiIGMnKSksCisgICAgICAgICAgICAoKCdhJywgJ2IgYycpLCAoJ2EnLCAnYiBjJykpLAorICAgICAgICAgICAgKCdhIDInLCAoJ2EnLCAnMicpKSwKKyAgICAgICAgICAgICgoJ2EnLCAyKSwgKCdhJywgMikpLAorICAgICAgICAgICAgKCdhIDMuNCcsICgnYScsICczLjQnKSksCisgICAgICAgICAgICAoKCdhJywgMy40KSwgKCdhJywgMy40KSksCisgICAgICAgICAgICAoKCksICgpKSwKKyAgICAgICAgICAgIChjYWxsKCdsaXN0JywgMSwgJzInLCAoMy40LCkpLAorICAgICAgICAgICAgICAgICgxLCAnMicsICgzLjQsKSkgaWYgc2VsZi53YW50b2JqZWN0cyBlbHNlCisgICAgICAgICAgICAgICAgKCcxJywgJzInLCAnMy40JykpLAorICAgICAgICBdCisgICAgICAgIGlmIHRjbF92ZXJzaW9uID49ICg4LCA1KToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLndhbnRvYmplY3RzOgorICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gKCcxMicsICdceGUyXHg4Mlx4YWMnLCAnXHhlMlx4ODJceGFjJywgJzMuNCcpCisgICAgICAgICAgICBlbGlmIGdldF90a19wYXRjaGxldmVsKCkgPCAoOCwgNSwgNSk6CisgICAgICAgICAgICAgICAgIyBCZWZvcmUgOC41LjUgZGljdHMgd2VyZSBjb252ZXJ0ZWQgdG8gbGlzdHMgdGhyb3VnaCBzdHJpbmcKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9ICgnMTInLCB1J1x1MjBhYycsIHUnXHUyMGFjJywgJzMuNCcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gKDEyLCB1J1x1MjBhYycsIHUnXHUyMGFjJywgKDMuNCwpKQorICAgICAgICAgICAgdGVzdGNhc2VzICs9IFsKKyAgICAgICAgICAgICAgICAoY2FsbCgnZGljdCcsICdjcmVhdGUnLCAxMiwgdSdcdTIwYWMnLCAnXHhlMlx4ODJceGFjJywgKDMuNCwpKSwKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQpLAorICAgICAgICAgICAgXQorICAgICAgICBmb3IgYXJnLCByZXMgaW4gdGVzdGNhc2VzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdGxpc3QoYXJnKSwgcmVzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUY2xFcnJvciwgc3BsaXRsaXN0LCAneycpCisKKyAgICBkZWYgdGVzdF9zcGxpdChzZWxmKToKKyAgICAgICAgc3BsaXQgPSBzZWxmLmludGVycC50ay5zcGxpdAorICAgICAgICBjYWxsID0gc2VsZi5pbnRlcnAudGsuY2FsbAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNwbGl0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNwbGl0LCAnYScsICdiJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzcGxpdCwgMikKKyAgICAgICAgdGVzdGNhc2VzID0gWworICAgICAgICAgICAgKCcyJywgJzInKSwKKyAgICAgICAgICAgICgnJywgJycpLAorICAgICAgICAgICAgKCd7fScsICcnKSwKKyAgICAgICAgICAgICgnIiInLCAnJyksCisgICAgICAgICAgICAoJ3snLCAneycpLAorICAgICAgICAgICAgKCdhXG4gYlx0XHIgY1xuICcsICgnYScsICdiJywgJ2MnKSksCisgICAgICAgICAgICAodSdhXG4gYlx0XHIgY1xuICcsICgnYScsICdiJywgJ2MnKSksCisgICAgICAgICAgICAoJ2EgXHhlMlx4ODJceGFjJywgKCdhJywgJ1x4ZTJceDgyXHhhYycpKSwKKyAgICAgICAgICAgICh1J2EgXHUyMGFjJywgKCdhJywgJ1x4ZTJceDgyXHhhYycpKSwKKyAgICAgICAgICAgICgnYVx4YzBceDgwYicsICdhXHhjMFx4ODBiJyksCisgICAgICAgICAgICAoJ2FceGMwXHg4MGIgY1x4YzBceDgwZCcsICgnYVx4YzBceDgwYicsICdjXHhjMFx4ODBkJykpLAorICAgICAgICAgICAgKCdhIHtiIGN9JywgKCdhJywgKCdiJywgJ2MnKSkpLAorICAgICAgICAgICAgKHInYSBiXCBjJywgKCdhJywgKCdiJywgJ2MnKSkpLAorICAgICAgICAgICAgKCgnYScsICdiIGMnKSwgKCdhJywgKCdiJywgJ2MnKSkpLAorICAgICAgICAgICAgKCgnYScsIHUnYiBjJyksICgnYScsICgnYicsICdjJykpKSwKKyAgICAgICAgICAgICgnYSAyJywgKCdhJywgJzInKSksCisgICAgICAgICAgICAoKCdhJywgMiksICgnYScsIDIpKSwKKyAgICAgICAgICAgICgnYSAzLjQnLCAoJ2EnLCAnMy40JykpLAorICAgICAgICAgICAgKCgnYScsIDMuNCksICgnYScsIDMuNCkpLAorICAgICAgICAgICAgKCgnYScsICgyLCAzLjQpKSwgKCdhJywgKDIsIDMuNCkpKSwKKyAgICAgICAgICAgICgoKSwgKCkpLAorICAgICAgICAgICAgKGNhbGwoJ2xpc3QnLCAxLCAnMicsICgzLjQsKSksCisgICAgICAgICAgICAgICAgKDEsICcyJywgKDMuNCwpKSBpZiBzZWxmLndhbnRvYmplY3RzIGVsc2UKKyAgICAgICAgICAgICAgICAoJzEnLCAnMicsICczLjQnKSksCisgICAgICAgIF0KKyAgICAgICAgaWYgdGNsX3ZlcnNpb24gPj0gKDgsIDUpOgorICAgICAgICAgICAgaWYgbm90IHNlbGYud2FudG9iamVjdHM6CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSAoJzEyJywgJ1x4ZTJceDgyXHhhYycsICdceGUyXHg4Mlx4YWMnLCAnMy40JykKKyAgICAgICAgICAgIGVsaWYgZ2V0X3RrX3BhdGNobGV2ZWwoKSA8ICg4LCA1LCA1KToKKyAgICAgICAgICAgICAgICAjIEJlZm9yZSA4LjUuNSBkaWN0cyB3ZXJlIGNvbnZlcnRlZCB0byBsaXN0cyB0aHJvdWdoIHN0cmluZworICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gKCcxMicsIHUnXHUyMGFjJywgdSdcdTIwYWMnLCAnMy40JykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSAoMTIsIHUnXHUyMGFjJywgdSdcdTIwYWMnLCAoMy40LCkpCisgICAgICAgICAgICB0ZXN0Y2FzZXMgKz0gWworICAgICAgICAgICAgICAgIChjYWxsKCdkaWN0JywgJ2NyZWF0ZScsIDEyLCB1J1x1MjBhYycsICdceGUyXHg4Mlx4YWMnLCAoMy40LCkpLAorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCksCisgICAgICAgICAgICBdCisgICAgICAgIGZvciBhcmcsIHJlcyBpbiB0ZXN0Y2FzZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0KGFyZyksIHJlcykKKworY2hhcmFjdGVyX3NpemUgPSA0IGlmIHN5cy5tYXh1bmljb2RlID4gMHhGRkZGIGVsc2UgMgorCitjbGFzcyBCaWdtZW1UY2xUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5pbnRlcnAgPSBUY2woKQorCisgICAgQHRlc3Rfc3VwcG9ydC5jcHl0aG9uX29ubHkKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhJTlRfTUFYIDwgUFlfU1NJWkVfVF9NQVgsICJuZWVkcyBVSU5UX01BWCA8IFNJWkVfTUFYIikKKyAgICBAdGVzdF9zdXBwb3J0LnByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1JTlRfTUFYICsgMSwgbWVtdXNlPTUsIGRyeV9ydW49RmFsc2UpCisgICAgZGVmIHRlc3RfaHVnZV9zdHJpbmdfY2FsbChzZWxmLCBzaXplKToKKyAgICAgICAgdmFsdWUgPSAnICcgKiBzaXplCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHNlbGYuaW50ZXJwLmNhbGwsICdzZXQnLCAnXycsIHZhbHVlKQorCisgICAgQHRlc3Rfc3VwcG9ydC5jcHl0aG9uX29ubHkKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh0ZXN0X3N1cHBvcnQuaGF2ZV91bmljb2RlLCAncmVxdWlyZXMgdW5pY29kZSBzdXBwb3J0JykKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhJTlRfTUFYIDwgUFlfU1NJWkVfVF9NQVgsICJuZWVkcyBVSU5UX01BWCA8IFNJWkVfTUFYIikKKyAgICBAdGVzdF9zdXBwb3J0LnByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1JTlRfTUFYICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtdXNlPTIqY2hhcmFjdGVyX3NpemUgKyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcnlfcnVuPUZhbHNlKQorICAgIGRlZiB0ZXN0X2h1Z2VfdW5pY29kZV9jYWxsKHNlbGYsIHNpemUpOgorICAgICAgICB2YWx1ZSA9IHVuaWNvZGUoJyAnKSAqIHNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgc2VsZi5pbnRlcnAuY2FsbCwgJ3NldCcsICdfJywgdmFsdWUpCisKKworICAgIEB0ZXN0X3N1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoSU5UX01BWCA8IFBZX1NTSVpFX1RfTUFYLCAibmVlZHMgVUlOVF9NQVggPCBTSVpFX01BWCIpCisgICAgQHRlc3Rfc3VwcG9ydC5wcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9SU5UX01BWCArIDEsIG1lbXVzZT05LCBkcnlfcnVuPUZhbHNlKQorICAgIGRlZiB0ZXN0X2h1Z2Vfc3RyaW5nX2J1aWx0aW5zKHNlbGYsIHNpemUpOgorICAgICAgICB2YWx1ZSA9ICcxJyArICcgJyAqIHNpemUKKyAgICAgICAgc2VsZi5jaGVja19odWdlX3N0cmluZ19idWlsdGlucyh2YWx1ZSkKKworICAgIEB0ZXN0X3N1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3ModGVzdF9zdXBwb3J0LmhhdmVfdW5pY29kZSwgJ3JlcXVpcmVzIHVuaWNvZGUgc3VwcG9ydCcpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoSU5UX01BWCA8IFBZX1NTSVpFX1RfTUFYLCAibmVlZHMgVUlOVF9NQVggPCBTSVpFX01BWCIpCisgICAgQHRlc3Rfc3VwcG9ydC5wcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9SU5UX01BWCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXVzZT0yKmNoYXJhY3Rlcl9zaXplICsgNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJ5X3J1bj1GYWxzZSkKKyAgICBkZWYgdGVzdF9odWdlX3VuaWNvZGVfYnVpbHRpbnMoc2VsZiwgc2l6ZSk6CisgICAgICAgIHZhbHVlID0gdW5pY29kZSgnMScgKyAnICcgKiBzaXplKQorICAgICAgICBzZWxmLmNoZWNrX2h1Z2Vfc3RyaW5nX2J1aWx0aW5zKHZhbHVlKQorCisgICAgZGVmIGNoZWNrX2h1Z2Vfc3RyaW5nX2J1aWx0aW5zKHNlbGYsIHZhbHVlKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgc2VsZi5pbnRlcnAudGsuZ2V0aW50LCB2YWx1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgc2VsZi5pbnRlcnAudGsuZ2V0ZG91YmxlLCB2YWx1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgc2VsZi5pbnRlcnAudGsuZ2V0Ym9vbGVhbiwgdmFsdWUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHNlbGYuaW50ZXJwLmV2YWwsIHZhbHVlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBzZWxmLmludGVycC5ldmFsZmlsZSwgdmFsdWUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHNlbGYuaW50ZXJwLnJlY29yZCwgdmFsdWUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHNlbGYuaW50ZXJwLmFkZGVycm9yaW5mbywgdmFsdWUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHNlbGYuaW50ZXJwLnNldHZhciwgdmFsdWUsICd4JywgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBzZWxmLmludGVycC5zZXR2YXIsICd4JywgdmFsdWUsICdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgc2VsZi5pbnRlcnAudW5zZXR2YXIsIHZhbHVlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBzZWxmLmludGVycC51bnNldHZhciwgJ3gnLCB2YWx1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgc2VsZi5pbnRlcnAuYWRkZXJyb3JpbmZvLCB2YWx1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgc2VsZi5pbnRlcnAuZXhwcnN0cmluZywgdmFsdWUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHNlbGYuaW50ZXJwLmV4cHJsb25nLCB2YWx1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgc2VsZi5pbnRlcnAuZXhwcmJvb2xlYW4sIHZhbHVlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBzZWxmLmludGVycC5zcGxpdGxpc3QsIHZhbHVlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBzZWxmLmludGVycC5zcGxpdCwgdmFsdWUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHNlbGYuaW50ZXJwLmNyZWF0ZWNvbW1hbmQsIHZhbHVlLCBtYXgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHNlbGYuaW50ZXJwLmRlbGV0ZWNvbW1hbmQsIHZhbHVlKQorCisKK2RlZiBzZXRVcE1vZHVsZSgpOgorICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICB0Y2wgPSBUY2woKQorICAgICAgICBwcmludCAncGF0Y2hsZXZlbCA9JywgdGNsLmNhbGwoJ2luZm8nLCAncGF0Y2hsZXZlbCcpCiAKIAogZGVmIHRlc3RfbWFpbigpOgotICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGNsVGVzdCwgVGtpbnRlclRlc3QpCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUY2xUZXN0LCBUa2ludGVyVGVzdCwgQmlnbWVtVGNsVGVzdCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90ZWxuZXRsaWIucHkgYi9MaWIvdGVzdC90ZXN0X3RlbG5ldGxpYi5weQppbmRleCAxNTA2NGM1Li42YzEyMmQ3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RlbG5ldGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RlbG5ldGxpYi5weQpAQCAtMyw2ICszLDcgQEAKIGltcG9ydCB0aW1lCiBpbXBvcnQgUXVldWUKIAoraW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0Q2FzZQogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIHRocmVhZGluZyA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCd0aHJlYWRpbmcnKQpAQCAtOTEsMTEgKzkyLDE5IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVsbmV0LnNvY2suZ2V0dGltZW91dCgpLCAzMCkKICAgICAgICAgdGVsbmV0LnNvY2suY2xvc2UoKQogCisgICAgZGVmIHRlc3RHZXR0ZXJzKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGVsbmV0IGdldHRlciBtZXRob2RzCisgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0LCB0aW1lb3V0PTMwKQorICAgICAgICB0X3NvY2sgPSB0ZWxuZXQuc29jaworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlbG5ldC5nZXRfc29ja2V0KCksIHRfc29jaykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZWxuZXQuZmlsZW5vKCksIHRfc29jay5maWxlbm8oKSkKKyAgICAgICAgdGVsbmV0LnNvY2suY2xvc2UoKQorCiBkZWYgX3JlYWRfc2V0VXAoc2VsZik6CiAgICAgc2VsZi5ldnQgPSB0aHJlYWRpbmcuRXZlbnQoKQogICAgIHNlbGYuZGF0YXEgPSBRdWV1ZS5RdWV1ZSgpCiAgICAgc2VsZi5zb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQotICAgIHNlbGYuc29jay5zZXR0aW1lb3V0KDMpCisgICAgc2VsZi5zb2NrLnNldHRpbWVvdXQoMTApCiAgICAgc2VsZi5wb3J0ID0gdGVzdF9zdXBwb3J0LmJpbmRfcG9ydChzZWxmLnNvY2spCiAgICAgc2VsZi50aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZXJ2ZXIsIGFyZ3M9KHNlbGYuZXZ0LHNlbGYuc29jaywgc2VsZi5kYXRhcSkpCiAgICAgc2VsZi50aHJlYWQuc3RhcnQoKQpAQCAtMTM1LDYgKzE0NCwyOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIHdhbnRbMF0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVsbmV0LnJlYWRfYWxsKCksICdub3Qgc2VlbicpCiAKKyAgICBkZWYgdGVzdF9yZWFkX3VudGlsX3dpdGhfcG9sbChzZWxmKToKKyAgICAgICAgIiIiVXNlIHNlbGVjdC5wb2xsKCkgdG8gaW1wbGVtZW50IHRlbG5ldC5yZWFkX3VudGlsKCkuIiIiCisgICAgICAgIHdhbnQgPSBbJ3gnICogMTAsICdtYXRjaCcsICd5JyAqIDEwLCBFT0Zfc2lnaWxdCisgICAgICAgIHNlbGYuZGF0YXEucHV0KHdhbnQpCisgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0KQorICAgICAgICBpZiBub3QgdGVsbmV0Ll9oYXNfcG9sbDoKKyAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCdzZWxlY3QucG9sbCgpIGlzIHJlcXVpcmVkJykKKyAgICAgICAgdGVsbmV0Ll9oYXNfcG9sbCA9IFRydWUKKyAgICAgICAgc2VsZi5kYXRhcS5qb2luKCkKKyAgICAgICAgZGF0YSA9IHRlbG5ldC5yZWFkX3VudGlsKCdtYXRjaCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgJycuam9pbih3YW50WzotMl0pKQorCisgICAgZGVmIHRlc3RfcmVhZF91bnRpbF93aXRoX3NlbGVjdChzZWxmKToKKyAgICAgICAgIiIiVXNlIHNlbGVjdC5zZWxlY3QoKSB0byBpbXBsZW1lbnQgdGVsbmV0LnJlYWRfdW50aWwoKS4iIiIKKyAgICAgICAgd2FudCA9IFsneCcgKiAxMCwgJ21hdGNoJywgJ3knICogMTAsIEVPRl9zaWdpbF0KKyAgICAgICAgc2VsZi5kYXRhcS5wdXQod2FudCkKKyAgICAgICAgdGVsbmV0ID0gdGVsbmV0bGliLlRlbG5ldChIT1NULCBzZWxmLnBvcnQpCisgICAgICAgIHRlbG5ldC5faGFzX3BvbGwgPSBGYWxzZQorICAgICAgICBzZWxmLmRhdGFxLmpvaW4oKQorICAgICAgICBkYXRhID0gdGVsbmV0LnJlYWRfdW50aWwoJ21hdGNoJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCAnJy5qb2luKHdhbnRbOi0yXSkpCisKICAgICBkZWYgdGVzdF9yZWFkX2FsbF9BKHNlbGYpOgogICAgICAgICAiIiIKICAgICAgICAgcmVhZF9hbGwoKQpAQCAtMTQ2LDcgKzE3Nyw2IEBACiAgICAgICAgIHNlbGYuZGF0YXEuam9pbigpCiAgICAgICAgIGRhdGEgPSB0ZWxuZXQucmVhZF9hbGwoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsICcnLmpvaW4od2FudFs6LTFdKSkKLSAgICAgICAgcmV0dXJuCiAKICAgICBkZWYgX3Rlc3RfYmxvY2tpbmcoc2VsZiwgZnVuYyk6CiAgICAgICAgIHNlbGYuZGF0YXEucHV0KFtzZWxmLmJsb2NrX2xvbmcsIEVPRl9zaWdpbF0pCkBAIC0zNTcsOCArMzg3LDc1IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycsIHRlbG5ldC5yZWFkX3NiX2RhdGEoKSkKICAgICAgICAgbmVnby5zYl9nZXR0ZXIgPSBOb25lICMgYnJlYWsgdGhlIG5lZ28gPT4gdGVsbmV0IGN5Y2xlCiAKKworY2xhc3MgRXhwZWN0VGVzdHMoVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5ldnQgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICBzZWxmLmRhdGFxID0gUXVldWUuUXVldWUoKQorICAgICAgICBzZWxmLnNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNlbGYuc29jay5zZXR0aW1lb3V0KDEwKQorICAgICAgICBzZWxmLnBvcnQgPSB0ZXN0X3N1cHBvcnQuYmluZF9wb3J0KHNlbGYuc29jaykKKyAgICAgICAgc2VsZi50aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZXJ2ZXIsIGFyZ3M9KHNlbGYuZXZ0LHNlbGYuc29jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YXEpKQorICAgICAgICBzZWxmLnRocmVhZC5zdGFydCgpCisgICAgICAgIHNlbGYuZXZ0LndhaXQoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLnRocmVhZC5qb2luKCkKKworICAgICMgdXNlIGEgc2ltaWxhciBhcHByb2FjaCB0byB0ZXN0aW5nIHRpbWVvdXRzIGFzIHRlc3RfdGltZW91dC5weQorICAgICMgdGhlc2Ugd2lsbCBuZXZlciBwYXNzIDEwMCUgYnV0IG1ha2UgdGhlIGZ1enogYmlnIGVub3VnaCB0aGF0IGl0IGlzIHJhcmUKKyAgICBibG9ja19sb25nID0gMC42CisgICAgYmxvY2tfc2hvcnQgPSAwLjMKKyAgICBkZWYgdGVzdF9leHBlY3RfQShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIGV4cGVjdChleHBlY3RlZCwgW3RpbWVvdXRdKQorICAgICAgICAgIFJlYWQgdW50aWwgdGhlIGV4cGVjdGVkIHN0cmluZyBoYXMgYmVlbiBzZWVuLCBvciBhIHRpbWVvdXQgaXMKKyAgICAgICAgICBoaXQgKGRlZmF1bHQgaXMgbm8gdGltZW91dCk7IG1heSBibG9jay4KKyAgICAgICAgIiIiCisgICAgICAgIHdhbnQgPSBbJ3gnICogMTAsICdtYXRjaCcsICd5JyAqIDEwLCBFT0Zfc2lnaWxdCisgICAgICAgIHNlbGYuZGF0YXEucHV0KHdhbnQpCisgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0KQorICAgICAgICBzZWxmLmRhdGFxLmpvaW4oKQorICAgICAgICAoXyxfLGRhdGEpID0gdGVsbmV0LmV4cGVjdChbJ21hdGNoJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgJycuam9pbih3YW50WzotMl0pKQorCisgICAgZGVmIHRlc3RfZXhwZWN0X0Ioc2VsZik6CisgICAgICAgICMgdGVzdCB0aGUgdGltZW91dCAtIGl0IGRvZXMgTk9UIHJhaXNlIHNvY2tldC50aW1lb3V0CisgICAgICAgIHdhbnQgPSBbJ2hlbGxvJywgc2VsZi5ibG9ja19sb25nLCAnbm90IHNlZW4nLCBFT0Zfc2lnaWxdCisgICAgICAgIHNlbGYuZGF0YXEucHV0KHdhbnQpCisgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0KQorICAgICAgICBzZWxmLmRhdGFxLmpvaW4oKQorICAgICAgICAoXyxfLGRhdGEpID0gdGVsbmV0LmV4cGVjdChbJ25vdCBzZWVuJ10sIHNlbGYuYmxvY2tfc2hvcnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgd2FudFswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZWxuZXQucmVhZF9hbGwoKSwgJ25vdCBzZWVuJykKKworICAgIGRlZiB0ZXN0X2V4cGVjdF93aXRoX3BvbGwoc2VsZik6CisgICAgICAgICIiIlVzZSBzZWxlY3QucG9sbCgpIHRvIGltcGxlbWVudCB0ZWxuZXQuZXhwZWN0KCkuIiIiCisgICAgICAgIHdhbnQgPSBbJ3gnICogMTAsICdtYXRjaCcsICd5JyAqIDEwLCBFT0Zfc2lnaWxdCisgICAgICAgIHNlbGYuZGF0YXEucHV0KHdhbnQpCisgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0KQorICAgICAgICBpZiBub3QgdGVsbmV0Ll9oYXNfcG9sbDoKKyAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCdzZWxlY3QucG9sbCgpIGlzIHJlcXVpcmVkJykKKyAgICAgICAgdGVsbmV0Ll9oYXNfcG9sbCA9IFRydWUKKyAgICAgICAgc2VsZi5kYXRhcS5qb2luKCkKKyAgICAgICAgKF8sXyxkYXRhKSA9IHRlbG5ldC5leHBlY3QoWydtYXRjaCddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsICcnLmpvaW4od2FudFs6LTJdKSkKKworICAgIGRlZiB0ZXN0X2V4cGVjdF93aXRoX3NlbGVjdChzZWxmKToKKyAgICAgICAgIiIiVXNlIHNlbGVjdC5zZWxlY3QoKSB0byBpbXBsZW1lbnQgdGVsbmV0LmV4cGVjdCgpLiIiIgorICAgICAgICB3YW50ID0gWyd4JyAqIDEwLCAnbWF0Y2gnLCAneScgKiAxMCwgRU9GX3NpZ2lsXQorICAgICAgICBzZWxmLmRhdGFxLnB1dCh3YW50KQorICAgICAgICB0ZWxuZXQgPSB0ZWxuZXRsaWIuVGVsbmV0KEhPU1QsIHNlbGYucG9ydCkKKyAgICAgICAgdGVsbmV0Ll9oYXNfcG9sbCA9IEZhbHNlCisgICAgICAgIHNlbGYuZGF0YXEuam9pbigpCisgICAgICAgIChfLF8sZGF0YSkgPSB0ZWxuZXQuZXhwZWN0KFsnbWF0Y2gnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCAnJy5qb2luKHdhbnRbOi0yXSkpCisKKwogZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgotICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoR2VuZXJhbFRlc3RzLCBSZWFkVGVzdHMsIE9wdGlvblRlc3RzKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoR2VuZXJhbFRlc3RzLCBSZWFkVGVzdHMsIE9wdGlvblRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZWN0VGVzdHMpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGVtcGZpbGUucHkgYi9MaWIvdGVzdC90ZXN0X3RlbXBmaWxlLnB5CmluZGV4IDJkZGMwNGMuLjQ2NWJjZGEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGVtcGZpbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90ZW1wZmlsZS5weQpAQCAtMSwxMyArMSwxNyBAQAogIyB0ZW1wZmlsZS5weSB1bml0IHRlc3RzLgogaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgZXJybm8KK2ltcG9ydCBpbwogaW1wb3J0IG9zCiBpbXBvcnQgc2lnbmFsCitpbXBvcnQgc2h1dGlsCiBpbXBvcnQgc3lzCiBpbXBvcnQgcmUKIGltcG9ydCB3YXJuaW5ncworaW1wb3J0IGNvbnRleHRsaWIKIAogaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQgYXMgc3VwcG9ydAogCiB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PVJ1bnRpbWVXYXJuaW5nLApAQCAtMTc3LDcgKzE4MSw3IEBACiAgICAgICAgICMgX2NhbmRpZGF0ZV90ZW1wZGlyX2xpc3QgY29udGFpbnMgdGhlIGV4cGVjdGVkIGRpcmVjdG9yaWVzCiAKICAgICAgICAgIyBNYWtlIHN1cmUgdGhlIGludGVyZXN0aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgYWxsIHNldC4KLSAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuRW52aXJvbm1lbnRWYXJHdWFyZCgpIGFzIGVudjoKKyAgICAgICAgd2l0aCBzdXBwb3J0LkVudmlyb25tZW50VmFyR3VhcmQoKSBhcyBlbnY6CiAgICAgICAgICAgICBmb3IgZW52bmFtZSBpbiAnVE1QRElSJywgJ1RFTVAnLCAnVE1QJzoKICAgICAgICAgICAgICAgICBkaXJuYW1lID0gb3MuZ2V0ZW52KGVudm5hbWUpCiAgICAgICAgICAgICAgICAgaWYgbm90IGRpcm5hbWU6CkBAIC0yMDIsOCArMjA2LDUxIEBACiAKIHRlc3RfY2xhc3Nlcy5hcHBlbmQodGVzdF9fY2FuZGlkYXRlX3RlbXBkaXJfbGlzdCkKIAorIyBXZSB0ZXN0IF9nZXRfZGVmYXVsdF90ZW1wZGlyIHNvbWUgbW9yZSBieSB0ZXN0aW5nIGdldHRlbXBkaXIuCiAKLSMgV2UgdGVzdCBfZ2V0X2RlZmF1bHRfdGVtcGRpciBieSB0ZXN0aW5nIGdldHRlbXBkaXIuCitjbGFzcyBUZXN0R2V0RGVmYXVsdFRlbXBkaXIoVEMpOgorICAgICIiIlRlc3QgX2dldF9kZWZhdWx0X3RlbXBkaXIoKS4iIiIKKworICAgIGRlZiB0ZXN0X25vX2ZpbGVzX2xlZnRfYmVoaW5kKHNlbGYpOgorICAgICAgICAjIHVzZSBhIHByaXZhdGUgZW1wdHkgZGlyZWN0b3J5CisgICAgICAgIG91cl90ZW1wX2RpcmVjdG9yeSA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIGZvcmNlIF9nZXRfZGVmYXVsdF90ZW1wZGlyKCkgdG8gY29uc2lkZXIgb3VyIGVtcHR5IGRpcmVjdG9yeQorICAgICAgICAgICAgZGVmIG91cl9jYW5kaWRhdGVfbGlzdCgpOgorICAgICAgICAgICAgICAgIHJldHVybiBbb3VyX3RlbXBfZGlyZWN0b3J5XQorCisgICAgICAgICAgICB3aXRoIHN1cHBvcnQuc3dhcF9hdHRyKHRlbXBmaWxlLCAiX2NhbmRpZGF0ZV90ZW1wZGlyX2xpc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXJfY2FuZGlkYXRlX2xpc3QpOgorICAgICAgICAgICAgICAgICMgdmVyaWZ5IG91ciBkaXJlY3RvcnkgaXMgZW1wdHkgYWZ0ZXIgX2dldF9kZWZhdWx0X3RlbXBkaXIoKQorICAgICAgICAgICAgICAgIHRlbXBmaWxlLl9nZXRfZGVmYXVsdF90ZW1wZGlyKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLmxpc3RkaXIob3VyX3RlbXBfZGlyZWN0b3J5KSwgW10pCisKKyAgICAgICAgICAgICAgICBkZWYgcmFpc2VfT1NFcnJvcigqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBPU0Vycm9yKC0xKQorCisgICAgICAgICAgICAgICAgd2l0aCBzdXBwb3J0LnN3YXBfYXR0cihpbywgIm9wZW4iLCByYWlzZV9PU0Vycm9yKToKKyAgICAgICAgICAgICAgICAgICAgIyB0ZXN0IGFnYWluIHdpdGggZmFpbGluZyBpby5vcGVuKCkKKyAgICAgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yKSBhcyBjbToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBmaWxlLl9nZXRfZGVmYXVsdF90ZW1wZGlyKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbS5leGNlcHRpb24uZXJybm8sIGVycm5vLkVOT0VOVCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5saXN0ZGlyKG91cl90ZW1wX2RpcmVjdG9yeSksIFtdKQorCisgICAgICAgICAgICAgICAgb3BlbiA9IGlvLm9wZW4KKyAgICAgICAgICAgICAgICBkZWYgYmFkX3dyaXRlcigqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgICAgICAgICBmcCA9IG9wZW4oKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICAgICAgICAgICAgICBmcC53cml0ZSA9IHJhaXNlX09TRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZwCisKKyAgICAgICAgICAgICAgICB3aXRoIHN1cHBvcnQuc3dhcF9hdHRyKGlvLCAib3BlbiIsIGJhZF93cml0ZXIpOgorICAgICAgICAgICAgICAgICAgICAjIHRlc3QgYWdhaW4gd2l0aCBmYWlsaW5nIHdyaXRlKCkKKyAgICAgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yKSBhcyBjbToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBmaWxlLl9nZXRfZGVmYXVsdF90ZW1wZGlyKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbS5leGNlcHRpb24uZXJybm8sIGVycm5vLkVOT0VOVCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5saXN0ZGlyKG91cl90ZW1wX2RpcmVjdG9yeSksIFtdKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShvdXJfdGVtcF9kaXJlY3RvcnkpCisKK3Rlc3RfY2xhc3Nlcy5hcHBlbmQoVGVzdEdldERlZmF1bHRUZW1wZGlyKQogCiAKIGNsYXNzIHRlc3RfX2dldF9jYW5kaWRhdGVfbmFtZXMoVEMpOgpAQCAtMjI0LDYgKzI3MSwyMiBAQAogdGVzdF9jbGFzc2VzLmFwcGVuZCh0ZXN0X19nZXRfY2FuZGlkYXRlX25hbWVzKQogCiAKK0Bjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCitkZWYgX2luc2lkZV9lbXB0eV90ZW1wX2RpcigpOgorICAgIGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgIHRyeToKKyAgICAgICAgd2l0aCBzdXBwb3J0LnN3YXBfYXR0cih0ZW1wZmlsZSwgJ3RlbXBkaXInLCBkaXIpOgorICAgICAgICAgICAgeWllbGQKKyAgICBmaW5hbGx5OgorICAgICAgICBzdXBwb3J0LnJtdHJlZShkaXIpCisKKworZGVmIF9tb2NrX2NhbmRpZGF0ZV9uYW1lcygqbmFtZXMpOgorICAgIHJldHVybiBzdXBwb3J0LnN3YXBfYXR0cih0ZW1wZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19nZXRfY2FuZGlkYXRlX25hbWVzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBpdGVyKG5hbWVzKSkKKworCiBjbGFzcyB0ZXN0X19ta3N0ZW1wX2lubmVyKFRDKToKICAgICAiIiJUZXN0IHRoZSBpbnRlcm5hbCBmdW5jdGlvbiBfbWtzdGVtcF9pbm5lci4iIiIKIApAQCAtMjc5LDEwICszNDIsOSBAQAogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgb3Mucm1kaXIoZGlyKQogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzX3N0YXQsICdvcy5zdGF0IG5vdCBhdmFpbGFibGUnKQogICAgIGRlZiB0ZXN0X2ZpbGVfbW9kZShzZWxmKToKICAgICAgICAgIyBfbWtzdGVtcF9pbm5lciBjcmVhdGVzIGZpbGVzIHdpdGggdGhlIHByb3BlciBtb2RlCi0gICAgICAgIGlmIG5vdCBoYXNfc3RhdDoKLSAgICAgICAgICAgIHJldHVybiAgICAgICAgICAgICMgdWdoLCBjYW4ndCB1c2UgU2tpcFRlc3QuCiAKICAgICAgICAgZmlsZSA9IHNlbGYuZG9fY3JlYXRlKCkKICAgICAgICAgbW9kZSA9IHN0YXQuU19JTU9ERShvcy5zdGF0KGZpbGUubmFtZSkuc3RfbW9kZSkKQEAgLTI5NCwxMiArMzU2LDExIEBACiAgICAgICAgICAgICBleHBlY3RlZCA9IHVzZXIgKiAoMSArIDggKyA2NCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2RlLCBleHBlY3RlZCkKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc19zcGF3bmwsICdvcy5zcGF3bmwgbm90IGF2YWlsYWJsZScpCiAgICAgZGVmIHRlc3Rfbm9pbmhlcml0KHNlbGYpOgogICAgICAgICAjIF9ta3N0ZW1wX2lubmVyIGZpbGUgaGFuZGxlcyBhcmUgbm90IGluaGVyaXRlZCBieSBjaGlsZCBwcm9jZXNzZXMKLSAgICAgICAgaWYgbm90IGhhc19zcGF3bmw6Ci0gICAgICAgICAgICByZXR1cm4gICAgICAgICAgICAjIHVnaCwgY2FuJ3QgdXNlIFNraXBUZXN0LgogCi0gICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICBpZiBzdXBwb3J0LnZlcmJvc2U6CiAgICAgICAgICAgICB2PSJ2IgogICAgICAgICBlbHNlOgogICAgICAgICAgICAgdj0icSIKQEAgLTMzMiwxNCArMzkzLDQ0IEBACiAgICAgICAgICAgICAgICAgICAgICJjaGlsZCBwcm9jZXNzIGNhdWdodCBmYXRhbCBzaWduYWwgJWQiICUgLXJldHZhbCkKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZXR2YWwgPiAwLCAiY2hpbGQgcHJvY2VzcyByZXBvcnRzIGZhaWx1cmUgJWQiJXJldHZhbCkKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc190ZXh0bW9kZSwgInRleHQgbW9kZSBub3QgYXZhaWxhYmxlIikKICAgICBkZWYgdGVzdF90ZXh0bW9kZShzZWxmKToKICAgICAgICAgIyBfbWtzdGVtcF9pbm5lciBjYW4gY3JlYXRlIGZpbGVzIGluIHRleHQgbW9kZQotICAgICAgICBpZiBub3QgaGFzX3RleHRtb2RlOgotICAgICAgICAgICAgcmV0dXJuICAgICAgICAgICAgIyB1Z2gsIGNhbid0IHVzZSBTa2lwVGVzdC4KIAogICAgICAgICBzZWxmLmRvX2NyZWF0ZShiaW49MCkud3JpdGUoImJsYXRcbiIpCiAgICAgICAgICMgWFhYIHNob3VsZCB0ZXN0IHRoYXQgdGhlIGZpbGUgcmVhbGx5IGlzIGEgdGV4dCBmaWxlCiAKKyAgICBkZWYgZGVmYXVsdF9ta3N0ZW1wX2lubmVyKHNlbGYpOgorICAgICAgICByZXR1cm4gdGVtcGZpbGUuX21rc3RlbXBfaW5uZXIodGVtcGZpbGUuZ2V0dGVtcGRpcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGZpbGUudGVtcGxhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBmaWxlLl9iaW5fb3BlbmZsYWdzKQorCisgICAgZGVmIHRlc3RfY29sbGlzaW9uX3dpdGhfZXhpc3RpbmdfZmlsZShzZWxmKToKKyAgICAgICAgIyBfbWtzdGVtcF9pbm5lciB0cmllcyBhbm90aGVyIG5hbWUgd2hlbiBhIGZpbGUgd2l0aAorICAgICAgICAjIHRoZSBjaG9zZW4gbmFtZSBhbHJlYWR5IGV4aXN0cworICAgICAgICB3aXRoIF9pbnNpZGVfZW1wdHlfdGVtcF9kaXIoKSwgXAorICAgICAgICAgICAgIF9tb2NrX2NhbmRpZGF0ZV9uYW1lcygnYWFhJywgJ2FhYScsICdiYmInKToKKyAgICAgICAgICAgIChmZDEsIG5hbWUxKSA9IHNlbGYuZGVmYXVsdF9ta3N0ZW1wX2lubmVyKCkKKyAgICAgICAgICAgIG9zLmNsb3NlKGZkMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuYW1lMS5lbmRzd2l0aCgnYWFhJykpCisKKyAgICAgICAgICAgIChmZDIsIG5hbWUyKSA9IHNlbGYuZGVmYXVsdF9ta3N0ZW1wX2lubmVyKCkKKyAgICAgICAgICAgIG9zLmNsb3NlKGZkMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuYW1lMi5lbmRzd2l0aCgnYmJiJykpCisKKyAgICBkZWYgdGVzdF9jb2xsaXNpb25fd2l0aF9leGlzdGluZ19kaXJlY3Rvcnkoc2VsZik6CisgICAgICAgICMgX21rc3RlbXBfaW5uZXIgdHJpZXMgYW5vdGhlciBuYW1lIHdoZW4gYSBkaXJlY3Rvcnkgd2l0aAorICAgICAgICAjIHRoZSBjaG9zZW4gbmFtZSBhbHJlYWR5IGV4aXN0cworICAgICAgICB3aXRoIF9pbnNpZGVfZW1wdHlfdGVtcF9kaXIoKSwgXAorICAgICAgICAgICAgIF9tb2NrX2NhbmRpZGF0ZV9uYW1lcygnYWFhJywgJ2FhYScsICdiYmInKToKKyAgICAgICAgICAgIGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpci5lbmRzd2l0aCgnYWFhJykpCisKKyAgICAgICAgICAgIChmZCwgbmFtZSkgPSBzZWxmLmRlZmF1bHRfbWtzdGVtcF9pbm5lcigpCisgICAgICAgICAgICBvcy5jbG9zZShmZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuYW1lLmVuZHN3aXRoKCdiYmInKSkKKwogdGVzdF9jbGFzc2VzLmFwcGVuZCh0ZXN0X19ta3N0ZW1wX2lubmVyKQogCiAKQEAgLTQ5NiwxMCArNTg3LDkgQEAKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIG9zLnJtZGlyKGRpcikKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc19zdGF0LCAnb3Muc3RhdCBub3QgYXZhaWxhYmxlJykKICAgICBkZWYgdGVzdF9tb2RlKHNlbGYpOgogICAgICAgICAjIG1rZHRlbXAgY3JlYXRlcyBkaXJlY3RvcmllcyB3aXRoIHRoZSBwcm9wZXIgbW9kZQotICAgICAgICBpZiBub3QgaGFzX3N0YXQ6Ci0gICAgICAgICAgICByZXR1cm4gICAgICAgICAgICAjIHVnaCwgY2FuJ3QgdXNlIFNraXBUZXN0LgogCiAgICAgICAgIGRpciA9IHNlbGYuZG9fY3JlYXRlKCkKICAgICAgICAgdHJ5OgpAQCAtNTE1LDYgKzYwNSwyNyBAQAogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgb3Mucm1kaXIoZGlyKQogCisgICAgZGVmIHRlc3RfY29sbGlzaW9uX3dpdGhfZXhpc3RpbmdfZmlsZShzZWxmKToKKyAgICAgICAgIyBta2R0ZW1wIHRyaWVzIGFub3RoZXIgbmFtZSB3aGVuIGEgZmlsZSB3aXRoCisgICAgICAgICMgdGhlIGNob3NlbiBuYW1lIGFscmVhZHkgZXhpc3RzCisgICAgICAgIHdpdGggX2luc2lkZV9lbXB0eV90ZW1wX2RpcigpLCBcCisgICAgICAgICAgICAgX21vY2tfY2FuZGlkYXRlX25hbWVzKCdhYWEnLCAnYWFhJywgJ2JiYicpOgorICAgICAgICAgICAgZmlsZSA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZShkZWxldGU9RmFsc2UpCisgICAgICAgICAgICBmaWxlLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmaWxlLm5hbWUuZW5kc3dpdGgoJ2FhYScpKQorICAgICAgICAgICAgZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZGlyLmVuZHN3aXRoKCdiYmInKSkKKworICAgIGRlZiB0ZXN0X2NvbGxpc2lvbl93aXRoX2V4aXN0aW5nX2RpcmVjdG9yeShzZWxmKToKKyAgICAgICAgIyBta2R0ZW1wIHRyaWVzIGFub3RoZXIgbmFtZSB3aGVuIGEgZGlyZWN0b3J5IHdpdGgKKyAgICAgICAgIyB0aGUgY2hvc2VuIG5hbWUgYWxyZWFkeSBleGlzdHMKKyAgICAgICAgd2l0aCBfaW5zaWRlX2VtcHR5X3RlbXBfZGlyKCksIFwKKyAgICAgICAgICAgICBfbW9ja19jYW5kaWRhdGVfbmFtZXMoJ2FhYScsICdhYWEnLCAnYmJiJyk6CisgICAgICAgICAgICBkaXIxID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZGlyMS5lbmRzd2l0aCgnYWFhJykpCisgICAgICAgICAgICBkaXIyID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZGlyMi5lbmRzd2l0aCgnYmJiJykpCisKIHRlc3RfY2xhc3Nlcy5hcHBlbmQodGVzdF9ta2R0ZW1wKQogCiAKQEAgLTY2MCw2ICs3NzEsMjQgQEAKICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHVzZV9jbG9zZWQpCiAKKyAgICBkZWYgdGVzdF9ub19sZWFrX2ZkKHNlbGYpOgorICAgICAgICAjIElzc3VlICMyMTA1ODogZG9uJ3QgbGVhayBmaWxlIGRlc2NyaXB0b3Igd2hlbiBmZG9wZW4oKSBmYWlscworICAgICAgICBvbGRfY2xvc2UgPSBvcy5jbG9zZQorICAgICAgICBvbGRfZmRvcGVuID0gb3MuZmRvcGVuCisgICAgICAgIGNsb3NlZCA9IFtdCisgICAgICAgIGRlZiBjbG9zZShmZCk6CisgICAgICAgICAgICBjbG9zZWQuYXBwZW5kKGZkKQorICAgICAgICBkZWYgZmRvcGVuKCphcmdzKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoKQorICAgICAgICBvcy5jbG9zZSA9IGNsb3NlCisgICAgICAgIG9zLmZkb3BlbiA9IGZkb3BlbgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjbG9zZWQpLCAxKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuY2xvc2UgPSBvbGRfY2xvc2UKKyAgICAgICAgICAgIG9zLmZkb3BlbiA9IG9sZF9mZG9wZW4KKwogICAgICMgSG93IHRvIHRlc3QgdGhlIG1vZGUgYW5kIGJ1ZnNpemUgcGFyYW1ldGVycz8KIAogdGVzdF9jbGFzc2VzLmFwcGVuZCh0ZXN0X05hbWVkVGVtcG9yYXJ5RmlsZSkKQEAgLTczOCw2ICs4NjcsMTcgQEAKICAgICAgICAgZi53cml0ZShiJ3gnKQogICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5fcm9sbGVkKQogCisgICAgZGVmIHRlc3RfeHJlYWRsaW5lcyhzZWxmKToKKyAgICAgICAgZiA9IHNlbGYuZG9fY3JlYXRlKG1heF9zaXplPTIwKQorICAgICAgICBmLndyaXRlKGInYWJjXG4nICogNSkKKyAgICAgICAgZi5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5fcm9sbGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZi54cmVhZGxpbmVzKCkpLCBbYidhYmNcbiddICogNSkKKyAgICAgICAgZi53cml0ZShiJ3hcbnknKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5fcm9sbGVkKQorICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGYueHJlYWRsaW5lcygpKSwgW2InYWJjXG4nXSAqIDUgKyBbYid4XG4nLCBiJ3knXSkKKwogICAgIGRlZiB0ZXN0X3NwYXJzZShzZWxmKToKICAgICAgICAgIyBBIFNwb29sZWRUZW1wb3JhcnlGaWxlIHRoYXQgaXMgd3JpdHRlbiBsYXRlIGluIHRoZSBmaWxlIHdpbGwgZXh0ZW5kCiAgICAgICAgICMgd2hlbiB0aGF0IG9jY3VycwpAQCAtNzkzLDYgKzkzMywyNiBAQAogICAgICAgICBzZWVrKDAsIDApCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWFkKDcwKSA9PSAnYScqMzUgKyAnYicqMzUpCiAKKyAgICBkZWYgdGVzdF9wcm9wZXJ0aWVzKHNlbGYpOgorICAgICAgICBmID0gdGVtcGZpbGUuU3Bvb2xlZFRlbXBvcmFyeUZpbGUobWF4X3NpemU9MTApCisgICAgICAgIGYud3JpdGUoYid4JyAqIDEwKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuX3JvbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLm1vZGUsICd3K2InKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShmLm5hbWUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IpOgorICAgICAgICAgICAgZi5uZXdsaW5lcworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgICAgIGYuZW5jb2RpbmcKKworICAgICAgICBmLndyaXRlKGIneCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLl9yb2xsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5tb2RlLCAndytiJykKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUoZi5uYW1lKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgICAgIGYubmV3bGluZXMKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgICAgICBmLmVuY29kaW5nCisKICAgICBkZWYgdGVzdF9jb250ZXh0X21hbmFnZXJfYmVmb3JlX3JvbGxvdmVyKHNlbGYpOgogICAgICAgICAjIEEgU3Bvb2xlZFRlbXBvcmFyeUZpbGUgY2FuIGJlIHVzZWQgYXMgYSBjb250ZXh0IG1hbmFnZXIKICAgICAgICAgd2l0aCB0ZW1wZmlsZS5TcG9vbGVkVGVtcG9yYXJ5RmlsZShtYXhfc2l6ZT0xKSBhcyBmOgpAQCAtODgyLDcgKzEwNDIsNyBAQAogICAgIHRlc3RfY2xhc3Nlcy5hcHBlbmQodGVzdF9UZW1wb3JhcnlGaWxlKQogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQorICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGV4dHdyYXAucHkgYi9MaWIvdGVzdC90ZXN0X3RleHR3cmFwLnB5CmluZGV4IDYzYTU0ZDkuLjdiNzI2NzIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGV4dHdyYXAucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90ZXh0d3JhcC5weQpAQCAtNjYsNiArNjYsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAiSSdtIGdsYWQgdG8gaGVhciBpdCEiXSkKICAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDgwLCBbdGV4dF0pCiAKKyAgICBkZWYgdGVzdF9lbXB0eV9zdHJpbmcoc2VsZik6CisgICAgICAgICMgQ2hlY2sgdGhhdCB3cmFwcGluZyB0aGUgZW1wdHkgc3RyaW5nIHJldHVybnMgYW4gZW1wdHkgbGlzdC4KKyAgICAgICAgc2VsZi5jaGVja193cmFwKCIiLCA2LCBbXSkKKyAgICAgICAgc2VsZi5jaGVja193cmFwKCIiLCA2LCBbXSwgZHJvcF93aGl0ZXNwYWNlPUZhbHNlKQorCisgICAgZGVmIHRlc3RfZW1wdHlfc3RyaW5nX3dpdGhfaW5pdGlhbF9pbmRlbnQoc2VsZik6CisgICAgICAgICMgQ2hlY2sgdGhhdCB0aGUgZW1wdHkgc3RyaW5nIGlzIG5vdCBpbmRlbnRlZC4KKyAgICAgICAgc2VsZi5jaGVja193cmFwKCIiLCA2LCBbXSwgaW5pdGlhbF9pbmRlbnQ9IisrIikKKyAgICAgICAgc2VsZi5jaGVja193cmFwKCIiLCA2LCBbXSwgaW5pdGlhbF9pbmRlbnQ9IisrIiwgZHJvcF93aGl0ZXNwYWNlPUZhbHNlKQogCiAgICAgZGVmIHRlc3Rfd2hpdGVzcGFjZShzZWxmKToKICAgICAgICAgIyBXaGl0ZXNwYWNlIG11bmdpbmcgYW5kIGVuZC1vZi1zZW50ZW5jZSBkZXRlY3Rpb24KQEAgLTMyMyw3ICszMzIsMzIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBbImJsYWgiLCAiICIsICIoZGluZyIsICIgIiwgImRvbmcpLCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIiwgInd1YmJhIl0pCiAKLSAgICBkZWYgdGVzdF9pbml0aWFsX3doaXRlc3BhY2Uoc2VsZik6CisgICAgZGVmIHRlc3RfZHJvcF93aGl0ZXNwYWNlX2ZhbHNlKHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgZHJvcF93aGl0ZXNwYWNlPUZhbHNlIHByZXNlcnZlcyB3aGl0ZXNwYWNlLgorICAgICAgICAjIFNGIHBhdGNoICMxNTgxMDczCisgICAgICAgIHRleHQgPSAiIFRoaXMgaXMgYSAgICBzZW50ZW5jZSB3aXRoICAgICBtdWNoIHdoaXRlc3BhY2UuIgorICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgMTAsCisgICAgICAgICAgICAgICAgICAgICAgICBbIiBUaGlzIGlzIGEiLCAiICAgICIsICJzZW50ZW5jZSAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoICAgICAiLCAibXVjaCB3aGl0ZSIsICJzcGFjZS4iXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRyb3Bfd2hpdGVzcGFjZT1GYWxzZSkKKworICAgIGRlZiB0ZXN0X2Ryb3Bfd2hpdGVzcGFjZV9mYWxzZV93aGl0ZXNwYWNlX29ubHkoc2VsZik6CisgICAgICAgICMgQ2hlY2sgdGhhdCBkcm9wX3doaXRlc3BhY2U9RmFsc2UgcHJlc2VydmVzIGEgd2hpdGVzcGFjZS1vbmx5IHN0cmluZy4KKyAgICAgICAgc2VsZi5jaGVja193cmFwKCIgICAiLCA2LCBbIiAgICJdLCBkcm9wX3doaXRlc3BhY2U9RmFsc2UpCisKKyAgICBkZWYgdGVzdF9kcm9wX3doaXRlc3BhY2VfZmFsc2Vfd2hpdGVzcGFjZV9vbmx5X3dpdGhfaW5kZW50KHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgYSB3aGl0ZXNwYWNlLW9ubHkgc3RyaW5nIGdldHMgaW5kZW50ZWQgKHdoZW4KKyAgICAgICAgIyBkcm9wX3doaXRlc3BhY2UgaXMgRmFsc2UpLgorICAgICAgICBzZWxmLmNoZWNrX3dyYXAoIiAgICIsIDYsIFsiICAgICAiXSwgZHJvcF93aGl0ZXNwYWNlPUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF9pbmRlbnQ9IiAgIikKKworICAgIGRlZiB0ZXN0X2Ryb3Bfd2hpdGVzcGFjZV93aGl0ZXNwYWNlX29ubHkoc2VsZik6CisgICAgICAgICMgQ2hlY2sgZHJvcF93aGl0ZXNwYWNlIG9uIGEgd2hpdGVzcGFjZS1vbmx5IHN0cmluZy4KKyAgICAgICAgc2VsZi5jaGVja193cmFwKCIgICIsIDYsIFtdKQorCisgICAgZGVmIHRlc3RfZHJvcF93aGl0ZXNwYWNlX2xlYWRpbmdfd2hpdGVzcGFjZShzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IGRyb3Bfd2hpdGVzcGFjZSBkb2VzIG5vdCBkcm9wIGxlYWRpbmcgd2hpdGVzcGFjZSAoaWYKKyAgICAgICAgIyBmb2xsb3dlZCBieSBub24td2hpdGVzcGFjZSkuCiAgICAgICAgICMgU0YgYnVnICM2MjI4NDkgcmVwb3J0ZWQgaW5jb25zaXN0ZW50IGhhbmRsaW5nIG9mIGxlYWRpbmcKICAgICAgICAgIyB3aGl0ZXNwYWNlOyBsZXQncyB0ZXN0IHRoYXQgYSBiaXQsIHNoYWxsIHdlPwogICAgICAgICB0ZXh0ID0gIiBUaGlzIGlzIGEgc2VudGVuY2Ugd2l0aCBsZWFkaW5nIHdoaXRlc3BhY2UuIgpAQCAtMzMyLDEzICszNjYsMjcgQEAKICAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgWyIgVGhpcyBpcyBhIHNlbnRlbmNlIHdpdGgiLCAibGVhZGluZyB3aGl0ZXNwYWNlLiJdKQogCi0gICAgZGVmIHRlc3Rfbm9fZHJvcF93aGl0ZXNwYWNlKHNlbGYpOgotICAgICAgICAjIFNGIHBhdGNoICMxNTgxMDczCi0gICAgICAgIHRleHQgPSAiIFRoaXMgaXMgYSAgICBzZW50ZW5jZSB3aXRoICAgICBtdWNoIHdoaXRlc3BhY2UuIgotICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgMTAsCi0gICAgICAgICAgICAgICAgICAgICAgICBbIiBUaGlzIGlzIGEiLCAiICAgICIsICJzZW50ZW5jZSAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoICAgICAiLCAibXVjaCB3aGl0ZSIsICJzcGFjZS4iXSwKKyAgICBkZWYgdGVzdF9kcm9wX3doaXRlc3BhY2Vfd2hpdGVzcGFjZV9saW5lKHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgZHJvcF93aGl0ZXNwYWNlIHNraXBzIHRoZSB3aG9sZSBsaW5lIGlmIGEgbm9uLWxlYWRpbmcKKyAgICAgICAgIyBsaW5lIGNvbnNpc3RzIG9ubHkgb2Ygd2hpdGVzcGFjZS4KKyAgICAgICAgdGV4dCA9ICJhYmNkICAgIGVmZ2giCisgICAgICAgICMgSW5jbHVkZSB0aGUgcmVzdWx0IGZvciBkcm9wX3doaXRlc3BhY2U9RmFsc2UgZm9yIGNvbXBhcmlzb24uCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCA2LCBbImFiY2QiLCAiICAgICIsICJlZmdoIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wX3doaXRlc3BhY2U9RmFsc2UpCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCA2LCBbImFiY2QiLCAiZWZnaCJdKQorCisgICAgZGVmIHRlc3RfZHJvcF93aGl0ZXNwYWNlX3doaXRlc3BhY2Vfb25seV93aXRoX2luZGVudChzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IGluaXRpYWxfaW5kZW50IGlzIG5vdCBhcHBsaWVkIHRvIGEgd2hpdGVzcGFjZS1vbmx5CisgICAgICAgICMgc3RyaW5nLiAgVGhpcyBjaGVja3MgYSBzcGVjaWFsIGNhc2Ugb2YgdGhlIGZhY3QgdGhhdCBkcm9wcGluZworICAgICAgICAjIHdoaXRlc3BhY2Ugb2NjdXJzIGJlZm9yZSBpbmRlbnRpbmcuCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCgiICAiLCA2LCBbXSwgaW5pdGlhbF9pbmRlbnQ9IisrIikKKworICAgIGRlZiB0ZXN0X2Ryb3Bfd2hpdGVzcGFjZV93aGl0ZXNwYWNlX2luZGVudChzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IGRyb3Bfd2hpdGVzcGFjZSBkb2VzIG5vdCBkcm9wIHdoaXRlc3BhY2UgaW5kZW50cy4KKyAgICAgICAgIyBUaGlzIGNoZWNrcyBhIHNwZWNpYWwgY2FzZSBvZiB0aGUgZmFjdCB0aGF0IGRyb3BwaW5nIHdoaXRlc3BhY2UKKyAgICAgICAgIyBvY2N1cnMgYmVmb3JlIGluZGVudGluZy4KKyAgICAgICAgc2VsZi5jaGVja193cmFwKCJhYmNkIGVmZ2giLCA2LCBbIiAgYWJjZCIsICIgIGVmZ2giXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfaW5kZW50PSIgICIsIHN1YnNlcXVlbnRfaW5kZW50PSIgICIpCiAKICAgICBpZiB0ZXN0X3N1cHBvcnQuaGF2ZV91bmljb2RlOgogICAgICAgICBkZWYgdGVzdF91bmljb2RlKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90aHJlYWQucHkgYi9MaWIvdGVzdC90ZXN0X3RocmVhZC5weQppbmRleCA1NDRlNzBkLi5iMDU2MDM5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RocmVhZC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RocmVhZC5weQpAQCAtNzAsMzkgKzcwLDM1IEBACiAgICAgICAgIHRocmVhZC5zdGFja19zaXplKDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGhyZWFkLnN0YWNrX3NpemUoKSwgMCwgInN0YWNrX3NpemUgbm90IHJlc2V0IHRvIGRlZmF1bHQiKQogCi0gICAgICAgIGlmIG9zLm5hbWUgbm90IGluICgibnQiLCAib3MyIiwgInBvc2l4Iik6Ci0gICAgICAgICAgICByZXR1cm4KLQotICAgICAgICB0c3Nfc3VwcG9ydGVkID0gVHJ1ZQorICAgIEB1bml0dGVzdC5za2lwSWYob3MubmFtZSBub3QgaW4gKCJudCIsICJvczIiLCAicG9zaXgiKSwgJ3Rlc3QgbWVhbnQgZm9yIG50LCBvczIsIGFuZCBwb3NpeCcpCisgICAgZGVmIHRlc3RfbnRfYW5kX3Bvc2l4X3N0YWNrX3NpemUoc2VsZik6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHRocmVhZC5zdGFja19zaXplKDQwOTYpCiAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgdmVyYm9zZV9wcmludCgiY2F1Z2h0IGV4cGVjdGVkIFZhbHVlRXJyb3Igc2V0dGluZyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YWNrX3NpemUoNDA5NikiKQogICAgICAgICBleGNlcHQgdGhyZWFkLmVycm9yOgotICAgICAgICAgICAgdHNzX3N1cHBvcnRlZCA9IEZhbHNlCi0gICAgICAgICAgICB2ZXJib3NlX3ByaW50KCJwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IGNoYW5naW5nIHRocmVhZCBzdGFjayAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpemUiKQorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgicGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBjaGFuZ2luZyB0aHJlYWQgc3RhY2sgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAic2l6ZSIpCiAKLSAgICAgICAgaWYgdHNzX3N1cHBvcnRlZDoKLSAgICAgICAgICAgIGZhaWxfbXNnID0gInN0YWNrX3NpemUoJWQpIGZhaWxlZCAtIHNob3VsZCBzdWNjZWVkIgotICAgICAgICAgICAgZm9yIHRzcyBpbiAoMjYyMTQ0LCAweDEwMDAwMCwgMCk6Ci0gICAgICAgICAgICAgICAgdGhyZWFkLnN0YWNrX3NpemUodHNzKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGhyZWFkLnN0YWNrX3NpemUoKSwgdHNzLCBmYWlsX21zZyAlIHRzcykKLSAgICAgICAgICAgICAgICB2ZXJib3NlX3ByaW50KCJzdWNjZXNzZnVsbHkgc2V0IHN0YWNrX3NpemUoJWQpIiAlIHRzcykKKyAgICAgICAgZmFpbF9tc2cgPSAic3RhY2tfc2l6ZSglZCkgZmFpbGVkIC0gc2hvdWxkIHN1Y2NlZWQiCisgICAgICAgIGZvciB0c3MgaW4gKDI2MjE0NCwgMHgxMDAwMDAsIDApOgorICAgICAgICAgICAgdGhyZWFkLnN0YWNrX3NpemUodHNzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aHJlYWQuc3RhY2tfc2l6ZSgpLCB0c3MsIGZhaWxfbXNnICUgdHNzKQorICAgICAgICAgICAgdmVyYm9zZV9wcmludCgic3VjY2Vzc2Z1bGx5IHNldCBzdGFja19zaXplKCVkKSIgJSB0c3MpCiAKLSAgICAgICAgICAgIGZvciB0c3MgaW4gKDI2MjE0NCwgMHgxMDAwMDApOgotICAgICAgICAgICAgICAgIHZlcmJvc2VfcHJpbnQoInRyeWluZyBzdGFja19zaXplID0gKCVkKSIgJSB0c3MpCi0gICAgICAgICAgICAgICAgc2VsZi5uZXh0X2lkZW50ID0gMAotICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlZCA9IDAKLSAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShOVU1UQVNLUyk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYubmV3dGFzaygpCisgICAgICAgIGZvciB0c3MgaW4gKDI2MjE0NCwgMHgxMDAwMDApOgorICAgICAgICAgICAgdmVyYm9zZV9wcmludCgidHJ5aW5nIHN0YWNrX3NpemUgPSAoJWQpIiAlIHRzcykKKyAgICAgICAgICAgIHNlbGYubmV4dF9pZGVudCA9IDAKKyAgICAgICAgICAgIHNlbGYuY3JlYXRlZCA9IDAKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKE5VTVRBU0tTKToKKyAgICAgICAgICAgICAgICBzZWxmLm5ld3Rhc2soKQogCi0gICAgICAgICAgICAgICAgdmVyYm9zZV9wcmludCgid2FpdGluZyBmb3IgYWxsIHRhc2tzIHRvIGNvbXBsZXRlIikKLSAgICAgICAgICAgICAgICBzZWxmLmRvbmVfbXV0ZXguYWNxdWlyZSgpCi0gICAgICAgICAgICAgICAgdmVyYm9zZV9wcmludCgiYWxsIHRhc2tzIGRvbmUiKQorICAgICAgICAgICAgdmVyYm9zZV9wcmludCgid2FpdGluZyBmb3IgYWxsIHRhc2tzIHRvIGNvbXBsZXRlIikKKyAgICAgICAgICAgIHNlbGYuZG9uZV9tdXRleC5hY3F1aXJlKCkKKyAgICAgICAgICAgIHZlcmJvc2VfcHJpbnQoImFsbCB0YXNrcyBkb25lIikKIAotICAgICAgICAgICAgdGhyZWFkLnN0YWNrX3NpemUoMCkKKyAgICAgICAgdGhyZWFkLnN0YWNrX3NpemUoMCkKIAogICAgIGRlZiB0ZXN0X19jb3VudChzZWxmKToKICAgICAgICAgIyBUZXN0IHRoZSBfY291bnQoKSBmdW5jdGlvbi4KQEAgLTEzMCw2ICsxMjYsMjkgQEAKICAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aHJlYWQuX2NvdW50KCksIG9yaWcpCiAKKyAgICBkZWYgdGVzdF9zYXZlX2V4Y2VwdGlvbl9zdGF0ZV9vbl9lcnJvcihzZWxmKToKKyAgICAgICAgIyBTZWUgaXNzdWUgIzE0NDc0CisgICAgICAgIGRlZiB0YXNrKCk6CisgICAgICAgICAgICBzdGFydGVkLnJlbGVhc2UoKQorICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IKKyAgICAgICAgZGVmIG15d3JpdGUoc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHJlYWxfd3JpdGUoc2VsZiwgKmFyZ3MpCisgICAgICAgIGMgPSB0aHJlYWQuX2NvdW50KCkKKyAgICAgICAgc3RhcnRlZCA9IHRocmVhZC5hbGxvY2F0ZV9sb2NrKCkKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2FwdHVyZWRfb3V0cHV0KCJzdGRlcnIiKSBhcyBzdGRlcnI6CisgICAgICAgICAgICByZWFsX3dyaXRlID0gc3RkZXJyLndyaXRlCisgICAgICAgICAgICBzdGRlcnIud3JpdGUgPSBteXdyaXRlCisgICAgICAgICAgICBzdGFydGVkLmFjcXVpcmUoKQorICAgICAgICAgICAgdGhyZWFkLnN0YXJ0X25ld190aHJlYWQodGFzaywgKCkpCisgICAgICAgICAgICBzdGFydGVkLmFjcXVpcmUoKQorICAgICAgICAgICAgd2hpbGUgdGhyZWFkLl9jb3VudCgpID4gYzoKKyAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMDEpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIlRyYWNlYmFjayIsIHN0ZGVyci5nZXR2YWx1ZSgpKQorCiAKIGNsYXNzIEJhcnJpZXI6CiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG51bV90aHJlYWRzKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGhyZWFkaW5nLnB5IGIvTGliL3Rlc3QvdGVzdF90aHJlYWRpbmcucHkKaW5kZXggYmRiN2YxNC4uODZjOTUzZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90aHJlYWRpbmcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90aHJlYWRpbmcucHkKQEAgLTEsNyArMSw5IEBACiAjIFZlcnkgcnVkaW1lbnRhcnkgdGVzdCBvZiB0aHJlYWRpbmcgbW9kdWxlCiAKIGltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZQorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZSwgY3B5dGhvbl9vbmx5Citmcm9tIHRlc3Quc2NyaXB0X2hlbHBlciBpbXBvcnQgYXNzZXJ0X3B5dGhvbl9vaworCiBpbXBvcnQgcmFuZG9tCiBpbXBvcnQgcmUKIGltcG9ydCBzeXMKQEAgLTEyLDYgKzE0LDEwIEBACiBpbXBvcnQgd2Vha3JlZgogaW1wb3J0IG9zCiBpbXBvcnQgc3VicHJvY2VzcwordHJ5OgorICAgIGltcG9ydCBfdGVzdGNhcGkKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBfdGVzdGNhcGkgPSBOb25lCiAKIGZyb20gdGVzdCBpbXBvcnQgbG9ja190ZXN0cwogCkBAIC0xMjMsOSArMTI5LDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgdGhyZWFkaW5nLnN0YWNrX3NpemUoMjYyMTQ0KQogICAgICAgICBleGNlcHQgdGhyZWFkLmVycm9yOgotICAgICAgICAgICAgaWYgdmVyYm9zZToKLSAgICAgICAgICAgICAgICBwcmludCAncGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBjaGFuZ2luZyB0aHJlYWQgc3RhY2sgc2l6ZScKLSAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgncGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBjaGFuZ2luZyB0aHJlYWQgc3RhY2sgc2l6ZScpCiAgICAgICAgIHNlbGYudGVzdF92YXJpb3VzX29wcygpCiAgICAgICAgIHRocmVhZGluZy5zdGFja19zaXplKDApCiAKQEAgLTEzNiw5ICsxNDAsNyBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICB0aHJlYWRpbmcuc3RhY2tfc2l6ZSgweDEwMDAwMCkKICAgICAgICAgZXhjZXB0IHRocmVhZC5lcnJvcjoKLSAgICAgICAgICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgICAgICAgICAgcHJpbnQgJ3BsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgY2hhbmdpbmcgdGhyZWFkIHN0YWNrIHNpemUnCi0gICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ3BsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgY2hhbmdpbmcgdGhyZWFkIHN0YWNrIHNpemUnKQogICAgICAgICBzZWxmLnRlc3RfdmFyaW91c19vcHMoKQogICAgICAgICB0aHJlYWRpbmcuc3RhY2tfc2l6ZSgwKQogCkBAIC0xNjUsOSArMTY3LDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaW1wb3J0IGN0eXBlcwogICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgICAgICBpZiB2ZXJib3NlOgotICAgICAgICAgICAgICAgIHByaW50ICJ0ZXN0X1B5VGhyZWFkU3RhdGVfU2V0QXN5bmNFeGMgY2FuJ3QgaW1wb3J0IGN0eXBlcyIKLSAgICAgICAgICAgIHJldHVybiAgIyBjYW4ndCBkbyBhbnl0aGluZworICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgncmVxdWlyZXMgY3R5cGVzJykKIAogICAgICAgICBzZXRfYXN5bmNfZXhjID0gY3R5cGVzLnB5dGhvbmFwaS5QeVRocmVhZFN0YXRlX1NldEFzeW5jRXhjCiAKQEAgLTI3Myw5ICsyNzMsNyBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBpbXBvcnQgY3R5cGVzCiAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgICAgICAgICAgcHJpbnQoInRlc3RfZmluYWxpemVfd2l0aF9ydW5ubmluZ190aHJlYWQgY2FuJ3QgaW1wb3J0IGN0eXBlcyIpCi0gICAgICAgICAgICByZXR1cm4gICMgY2FuJ3QgZG8gYW55dGhpbmcKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ3JlcXVpcmVzIGN0eXBlcycpCiAKICAgICAgICAgcmMgPSBzdWJwcm9jZXNzLmNhbGwoW3N5cy5leGVjdXRhYmxlLCAiLWMiLCAiIiJpZiAxOgogICAgICAgICAgICAgaW1wb3J0IGN0eXBlcywgc3lzLCB0aW1lLCB0aHJlYWQKQEAgLTQxNCw2ICs0MTIsNzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBtc2c9KCclZCByZWZlcmVuY2VzIHN0aWxsIGFyb3VuZCcgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLmdldHJlZmNvdW50KHdlYWtfcmFpc2luZ19jeWNsaWNfb2JqZWN0KCkpKSkKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdmb3JrJyksICd0ZXN0IG5lZWRzIGZvcmsoKScpCisgICAgZGVmIHRlc3RfZHVtbXlfdGhyZWFkX2FmdGVyX2Zvcmsoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzE0MzA4OiBhIGR1bW15IHRocmVhZCBpbiB0aGUgYWN0aXZlIGxpc3QgZG9lc24ndCBtZXNzIHVwCisgICAgICAgICMgdGhlIGFmdGVyLWZvcmsgbWVjaGFuaXNtLgorICAgICAgICBjb2RlID0gIiIiaWYgMToKKyAgICAgICAgICAgIGltcG9ydCB0aHJlYWQsIHRocmVhZGluZywgb3MsIHRpbWUKKworICAgICAgICAgICAgZGVmIGJhY2tncm91bmRfdGhyZWFkKGV2dCk6CisgICAgICAgICAgICAgICAgIyBDcmVhdGVzIGFuZCByZWdpc3RlcnMgdGhlIF9EdW1teVRocmVhZCBpbnN0YW5jZQorICAgICAgICAgICAgICAgIHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpCisgICAgICAgICAgICAgICAgZXZ0LnNldCgpCisgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgxMCkKKworICAgICAgICAgICAgZXZ0ID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgICAgIHRocmVhZC5zdGFydF9uZXdfdGhyZWFkKGJhY2tncm91bmRfdGhyZWFkLCAoZXZ0LCkpCisgICAgICAgICAgICBldnQud2FpdCgpCisgICAgICAgICAgICBhc3NlcnQgdGhyZWFkaW5nLmFjdGl2ZV9jb3VudCgpID09IDIsIHRocmVhZGluZy5hY3RpdmVfY291bnQoKQorICAgICAgICAgICAgaWYgb3MuZm9yaygpID09IDA6CisgICAgICAgICAgICAgICAgYXNzZXJ0IHRocmVhZGluZy5hY3RpdmVfY291bnQoKSA9PSAxLCB0aHJlYWRpbmcuYWN0aXZlX2NvdW50KCkKKyAgICAgICAgICAgICAgICBvcy5fZXhpdCgwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvcy53YWl0KCkKKyAgICAgICAgIiIiCisgICAgICAgIF8sIG91dCwgZXJyID0gYXNzZXJ0X3B5dGhvbl9vaygiLWMiLCBjb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dCwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLCAnJykKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdmb3JrJyksICJuZWVkcyBvcy5mb3JrKCkiKQorICAgIGRlZiB0ZXN0X2lzX2FsaXZlX2FmdGVyX2Zvcmsoc2VsZik6CisgICAgICAgICMgVHJ5IGhhcmQgdG8gdHJpZ2dlciAjMTg0MTg6IGlzX2FsaXZlKCkgY291bGQgc29tZXRpbWVzIGJlIFRydWUgb24KKyAgICAgICAgIyB0aHJlYWRzIHRoYXQgdmFuaXNoZWQgYWZ0ZXIgYSBmb3JrLgorICAgICAgICBvbGRfaW50ZXJ2YWwgPSBzeXMuZ2V0Y2hlY2tpbnRlcnZhbCgpCisKKyAgICAgICAgIyBNYWtlIHRoZSBidWcgbW9yZSBsaWtlbHkgdG8gbWFuaWZlc3QuCisgICAgICAgIHN5cy5zZXRjaGVja2ludGVydmFsKDEwKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDIwKToKKyAgICAgICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9bGFtYmRhOiBOb25lKQorICAgICAgICAgICAgICAgIHQuc3RhcnQoKQorICAgICAgICAgICAgICAgIHBpZCA9IG9zLmZvcmsoKQorICAgICAgICAgICAgICAgIGlmIHBpZCA9PSAwOgorICAgICAgICAgICAgICAgICAgICBvcy5fZXhpdCgxIGlmIHQuaXNfYWxpdmUoKSBlbHNlIDApCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdC5qb2luKCkKKyAgICAgICAgICAgICAgICAgICAgcGlkLCBzdGF0dXMgPSBvcy53YWl0cGlkKHBpZCwgMCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzdGF0dXMpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMuc2V0Y2hlY2tpbnRlcnZhbChvbGRfaW50ZXJ2YWwpCisKKyAgICBkZWYgdGVzdF9Cb3VuZGVkU2VtYXBob3JlX2xpbWl0KHNlbGYpOgorICAgICAgICAjIEJvdW5kZWRTZW1hcGhvcmUgc2hvdWxkIHJhaXNlIFZhbHVlRXJyb3IgaWYgcmVsZWFzZWQgdG9vIG9mdGVuLgorICAgICAgICBmb3IgbGltaXQgaW4gcmFuZ2UoMSwgMTApOgorICAgICAgICAgICAgYnMgPSB0aHJlYWRpbmcuQm91bmRlZFNlbWFwaG9yZShsaW1pdCkKKyAgICAgICAgICAgIHRocmVhZHMgPSBbdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9YnMuYWNxdWlyZSkKKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2UobGltaXQpXQorICAgICAgICAgICAgZm9yIHQgaW4gdGhyZWFkczoKKyAgICAgICAgICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgICAgIGZvciB0IGluIHRocmVhZHM6CisgICAgICAgICAgICAgICAgdC5qb2luKCkKKyAgICAgICAgICAgIHRocmVhZHMgPSBbdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9YnMucmVsZWFzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2UobGltaXQpXQorICAgICAgICAgICAgZm9yIHQgaW4gdGhyZWFkczoKKyAgICAgICAgICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgICAgIGZvciB0IGluIHRocmVhZHM6CisgICAgICAgICAgICAgICAgdC5qb2luKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJzLnJlbGVhc2UpCiAKIGNsYXNzIFRocmVhZEpvaW5PblNodXRkb3duKEJhc2VUZXN0Q2FzZSk6CiAKQEAgLTYzNSw2ICs3MDAsMTEzIEBACiAgICAgICAgIG91dHB1dCA9ICJlbmQgb2Ygd29ya2VyIHRocmVhZFxuZW5kIG9mIG1haW4gdGhyZWFkXG4iCiAgICAgICAgIHNlbGYuYXNzZXJ0U2NyaXB0SGFzT3V0cHV0KHNjcmlwdCwgb3V0cHV0KQogCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gaW4gcGxhdGZvcm1zX3RvX3NraXAsICJkdWUgdG8ga25vd24gT1MgYnVnIikKKyAgICBkZWYgdGVzdF82X2RhZW1vbl90aHJlYWRzKHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgYSBkYWVtb24gdGhyZWFkIGNhbm5vdCBjcmFzaCB0aGUgaW50ZXJwcmV0ZXIgb24gc2h1dGRvd24KKyAgICAgICAgIyBieSBtYW5pcHVsYXRpbmcgaW50ZXJuYWwgc3RydWN0dXJlcyB0aGF0IGFyZSBiZWluZyBkaXNwb3NlZCBvZiBpbgorICAgICAgICAjIHRoZSBtYWluIHRocmVhZC4KKyAgICAgICAgc2NyaXB0ID0gIiIiaWYgVHJ1ZToKKyAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgaW1wb3J0IHJhbmRvbQorICAgICAgICAgICAgaW1wb3J0IHN5cworICAgICAgICAgICAgaW1wb3J0IHRpbWUKKyAgICAgICAgICAgIGltcG9ydCB0aHJlYWRpbmcKKworICAgICAgICAgICAgdGhyZWFkX2hhc19ydW4gPSBzZXQoKQorCisgICAgICAgICAgICBkZWYgcmFuZG9tX2lvKCk6CisgICAgICAgICAgICAgICAgJycnTG9vcCBmb3IgYSB3aGlsZSBzbGVlcGluZyByYW5kb20gdGlueSBhbW91bnRzIGFuZCBkb2luZyBzb21lIEkvTy4nJycKKyAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICBpbl9mID0gb3Blbihvcy5fX2ZpbGVfXywgJ3JiJykKKyAgICAgICAgICAgICAgICAgICAgc3R1ZmYgPSBpbl9mLnJlYWQoMjAwKQorICAgICAgICAgICAgICAgICAgICBudWxsX2YgPSBvcGVuKG9zLmRldm51bGwsICd3YicpCisgICAgICAgICAgICAgICAgICAgIG51bGxfZi53cml0ZShzdHVmZikKKyAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcChyYW5kb20ucmFuZG9tKCkgLyAxOTk1KQorICAgICAgICAgICAgICAgICAgICBudWxsX2YuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICBpbl9mLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkX2hhc19ydW4uYWRkKHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpKQorCisgICAgICAgICAgICBkZWYgbWFpbigpOgorICAgICAgICAgICAgICAgIGNvdW50ID0gMAorICAgICAgICAgICAgICAgIGZvciBfIGluIHJhbmdlKDQwKToKKyAgICAgICAgICAgICAgICAgICAgbmV3X3RocmVhZCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJhbmRvbV9pbykKKyAgICAgICAgICAgICAgICAgICAgbmV3X3RocmVhZC5kYWVtb24gPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIG5ld190aHJlYWQuc3RhcnQoKQorICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxCisgICAgICAgICAgICAgICAgd2hpbGUgbGVuKHRocmVhZF9oYXNfcnVuKSA8IGNvdW50OgorICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMDAxKQorICAgICAgICAgICAgICAgICMgVHJpZ2dlciBwcm9jZXNzIHNodXRkb3duCisgICAgICAgICAgICAgICAgc3lzLmV4aXQoMCkKKworICAgICAgICAgICAgbWFpbigpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgcmMsIG91dCwgZXJyID0gYXNzZXJ0X3B5dGhvbl9vaygnLWMnLCBzY3JpcHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZXJyKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2ZvcmsnKSwgIm5lZWRzIG9zLmZvcmsoKSIpCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gaW4gcGxhdGZvcm1zX3RvX3NraXAsICJkdWUgdG8ga25vd24gT1MgYnVnIikKKyAgICBkZWYgdGVzdF9yZWluaXRfdGxzX2FmdGVyX2Zvcmsoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzEzODE3OiBmb3JrKCkgd291bGQgZGVhZGxvY2sgaW4gYSBtdWx0aXRocmVhZGVkIHByb2dyYW0gd2l0aAorICAgICAgICAjIHRoZSBhZC1ob2MgVExTIGltcGxlbWVudGF0aW9uLgorCisgICAgICAgIGRlZiBkb19mb3JrX2FuZF93YWl0KCk6CisgICAgICAgICAgICAjIGp1c3QgZm9yayBhIGNoaWxkIHByb2Nlc3MgYW5kIHdhaXQgaXQKKyAgICAgICAgICAgIHBpZCA9IG9zLmZvcmsoKQorICAgICAgICAgICAgaWYgcGlkID4gMDoKKyAgICAgICAgICAgICAgICBvcy53YWl0cGlkKHBpZCwgMCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb3MuX2V4aXQoMCkKKworICAgICAgICAjIHN0YXJ0IGEgYnVuY2ggb2YgdGhyZWFkcyB0aGF0IHdpbGwgZm9yaygpIGNoaWxkIHByb2Nlc3NlcworICAgICAgICB0aHJlYWRzID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTYpOgorICAgICAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PWRvX2ZvcmtfYW5kX3dhaXQpCisgICAgICAgICAgICB0aHJlYWRzLmFwcGVuZCh0KQorICAgICAgICAgICAgdC5zdGFydCgpCisKKyAgICAgICAgZm9yIHQgaW4gdGhyZWFkczoKKyAgICAgICAgICAgIHQuam9pbigpCisKKyAgICBAY3B5dGhvbl9vbmx5CisgICAgQHVuaXR0ZXN0LnNraXBJZihfdGVzdGNhcGkgaXMgTm9uZSwgIm5lZWQgX3Rlc3RjYXBpIG1vZHVsZSIpCisgICAgZGVmIHRlc3RfZnJhbWVfdHN0YXRlX3RyYWNpbmcoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzE0NDMyOiBDcmFzaCB3aGVuIGEgZ2VuZXJhdG9yIGlzIGNyZWF0ZWQgaW4gYSBDIHRocmVhZCB0aGF0IGlzCisgICAgICAgICMgZGVzdHJveWVkIHdoaWxlIHRoZSBnZW5lcmF0b3IgaXMgc3RpbGwgdXNlZC4gVGhlIGlzc3VlIHdhcyB0aGF0IGEKKyAgICAgICAgIyBnZW5lcmF0b3IgY29udGFpbnMgYSBmcmFtZSwgYW5kIHRoZSBmcmFtZSBrZXB0IGEgcmVmZXJlbmNlIHRvIHRoZQorICAgICAgICAjIFB5dGhvbiBzdGF0ZSBvZiB0aGUgZGVzdHJveWVkIEMgdGhyZWFkLiBUaGUgY3Jhc2ggb2NjdXJzIHdoZW4gYSB0cmFjZQorICAgICAgICAjIGZ1bmN0aW9uIGlzIHNldHVwLgorCisgICAgICAgIGRlZiBub29wX3RyYWNlKGZyYW1lLCBldmVudCwgYXJnKToKKyAgICAgICAgICAgICMgbm8gb3BlcmF0aW9uCisgICAgICAgICAgICByZXR1cm4gbm9vcF90cmFjZQorCisgICAgICAgIGRlZiBnZW5lcmF0b3IoKToKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgeWllbGQgImdlbmVyZWF0b3IiCisKKyAgICAgICAgZGVmIGNhbGxiYWNrKCk6CisgICAgICAgICAgICBpZiBjYWxsYmFjay5nZW4gaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5nZW4gPSBnZW5lcmF0b3IoKQorICAgICAgICAgICAgcmV0dXJuIG5leHQoY2FsbGJhY2suZ2VuKQorICAgICAgICBjYWxsYmFjay5nZW4gPSBOb25lCisKKyAgICAgICAgb2xkX3RyYWNlID0gc3lzLmdldHRyYWNlKCkKKyAgICAgICAgc3lzLnNldHRyYWNlKG5vb3BfdHJhY2UpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgSW5zdGFsbCBhIHRyYWNlIGZ1bmN0aW9uCisgICAgICAgICAgICB0aHJlYWRpbmcuc2V0dHJhY2Uobm9vcF90cmFjZSkKKworICAgICAgICAgICAgIyBDcmVhdGUgYSBnZW5lcmF0b3IgaW4gYSBDIHRocmVhZCB3aGljaCBleGl0cyBhZnRlciB0aGUgY2FsbAorICAgICAgICAgICAgX3Rlc3RjYXBpLmNhbGxfaW5fdGVtcG9yYXJ5X2NfdGhyZWFkKGNhbGxiYWNrKQorCisgICAgICAgICAgICAjIENhbGwgdGhlIGdlbmVyYXRvciBpbiBhIGRpZmZlcmVudCBQeXRob24gdGhyZWFkLCBjaGVjayB0aGF0IHRoZQorICAgICAgICAgICAgIyBnZW5lcmF0b3IgZGlkbid0IGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIGRlc3Ryb3llZCB0aHJlYWQgc3RhdGUKKyAgICAgICAgICAgIGZvciB0ZXN0IGluIHJhbmdlKDMpOgorICAgICAgICAgICAgICAgICMgVGhlIHRyYWNlIGZ1bmN0aW9uIGlzIHN0aWxsIGNhbGxlZCBoZXJlCisgICAgICAgICAgICAgICAgY2FsbGJhY2soKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnNldHRyYWNlKG9sZF90cmFjZSkKKwogCiBjbGFzcyBUaHJlYWRpbmdFeGNlcHRpb25UZXN0cyhCYXNlVGVzdENhc2UpOgogICAgICMgQSBSdW50aW1lRXJyb3Igc2hvdWxkIGJlIHJhaXNlZCBpZiBUaHJlYWQuc3RhcnQoKSBpcyBjYWxsZWQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGltZS5weSBiL0xpYi90ZXN0L3Rlc3RfdGltZS5weQppbmRleCAyODkxN2NhLi40NTcxYzEwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RpbWUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90aW1lLnB5CkBAIC0xMDYsNyArMTA2LDcgQEAKIAogICAgIGRlZiB0ZXN0X3N0cnB0aW1lKHNlbGYpOgogICAgICAgICAjIFNob3VsZCBiZSBhYmxlIHRvIGdvIHJvdW5kLXRyaXAgZnJvbSBzdHJmdGltZSB0byBzdHJwdGltZSB3aXRob3V0Ci0gICAgICAgICMgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLgorICAgICAgICAjIHJhaXNpbmcgYW4gZXhjZXB0aW9uLgogICAgICAgICB0dCA9IHRpbWUuZ210aW1lKHNlbGYudCkKICAgICAgICAgZm9yIGRpcmVjdGl2ZSBpbiAoJ2EnLCAnQScsICdiJywgJ0InLCAnYycsICdkJywgJ0gnLCAnSScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdqJywgJ20nLCAnTScsICdwJywgJ1MnLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90aW1lb3V0LnB5IGIvTGliL3Rlc3QvdGVzdF90aW1lb3V0LnB5CmluZGV4IDRiYzEyNWUuLmJiOTI1MmQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGltZW91dC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RpbWVvdXQucHkKQEAgLTE3OCwxNiArMTc4LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAidGltZW91dCAoJWcpIGlzICVnIHNlY29uZHMgbW9yZSB0aGFuIGV4cGVjdGVkICglZykiCiAgICAgICAgICAgICAgICAgICAgICAlKF9kZWx0YSwgc2VsZi5mdXp6LCBfdGltZW91dCkpCiAKKyAgICBAdW5pdHRlc3Quc2tpcCgndGVzdCBub3QgaW1wbGVtZW50ZWQnKQogICAgIGRlZiB0ZXN0U2VuZChzZWxmKToKICAgICAgICAgIyBUZXN0IHNlbmQoKSB0aW1lb3V0CiAgICAgICAgICMgY291bGRuJ3QgZmlndXJlIG91dCBob3cgdG8gdGVzdCBpdAogICAgICAgICBwYXNzCiAKKyAgICBAdW5pdHRlc3Quc2tpcCgndGVzdCBub3QgaW1wbGVtZW50ZWQnKQogICAgIGRlZiB0ZXN0U2VuZHRvKHNlbGYpOgogICAgICAgICAjIFRlc3Qgc2VuZHRvKCkgdGltZW91dAogICAgICAgICAjIGNvdWxkbid0IGZpZ3VyZSBvdXQgaG93IHRvIHRlc3QgaXQKICAgICAgICAgcGFzcwogCisgICAgQHVuaXR0ZXN0LnNraXAoJ3Rlc3Qgbm90IGltcGxlbWVudGVkJykKICAgICBkZWYgdGVzdFNlbmRhbGwoc2VsZik6CiAgICAgICAgICMgVGVzdCBzZW5kYWxsKCkgdGltZW91dAogICAgICAgICAjIGNvdWxkbid0IGZpZ3VyZSBvdXQgaG93IHRvIHRlc3QgaXQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGsucHkgYi9MaWIvdGVzdC90ZXN0X3RrLnB5CmluZGV4IDg2MjVkYjIuLmYzZTI2NGIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGsucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90ay5weQpAQCAtMSw4ICsxLDkgQEAKIGltcG9ydCBvcwogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIAotIyBTa2lwIHRlc3QgaWYgX3RraW50ZXIgd2Fzbid0IGJ1aWx0LgorIyBTa2lwIHRlc3QgaWYgX3RraW50ZXIgd2Fzbid0IGJ1aWx0IG9yIGd1aSByZXNvdXJjZSBpcyBub3QgYXZhaWxhYmxlLgogdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ190a2ludGVyJykKK3Rlc3Rfc3VwcG9ydC5yZXF1aXJlcygnZ3VpJykKIAogdGhpc19kaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSkKIGxpYl90a190ZXN0ID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbih0aGlzX2Rpciwgb3MucGF0aC5wYXJkaXIsCkBAIC0xMSwxOSArMTIsMTAgQEAKIHdpdGggdGVzdF9zdXBwb3J0LkRpcnNPblN5c1BhdGgobGliX3RrX3Rlc3QpOgogICAgIGltcG9ydCBydW50a3Rlc3RzCiAKLSMgU2tpcCB0ZXN0IGlmIHRrIGNhbm5vdCBiZSBpbml0aWFsaXplZC4KLXJ1bnRrdGVzdHMuY2hlY2tfdGtfYXZhaWxhYmlsaXR5KCkKLQotZGVmIHRlc3RfbWFpbihlbmFibGVfZ3VpPUZhbHNlKToKLSAgICBpZiBlbmFibGVfZ3VpOgotICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudXNlX3Jlc291cmNlcyBpcyBOb25lOgotICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVzZV9yZXNvdXJjZXMgPSBbJ2d1aSddCi0gICAgICAgIGVsaWYgJ2d1aScgbm90IGluIHRlc3Rfc3VwcG9ydC51c2VfcmVzb3VyY2VzOgotICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVzZV9yZXNvdXJjZXMuYXBwZW5kKCdndWknKQotCitkZWYgdGVzdF9tYWluKCk6CiAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuRGlyc09uU3lzUGF0aChsaWJfdGtfdGVzdCk6CiAgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCiAgICAgICAgICAgICAqcnVudGt0ZXN0cy5nZXRfdGVzdHModGV4dD1GYWxzZSwgcGFja2FnZXM9Wyd0ZXN0X3RraW50ZXInXSkpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgdGVzdF9tYWluKGVuYWJsZV9ndWk9VHJ1ZSkKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90b2tlbml6ZS5weSBiL0xpYi90ZXN0L3Rlc3RfdG9rZW5pemUucHkKaW5kZXggMzhkYTEwNi4uODUwYWE5YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90b2tlbml6ZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3Rva2VuaXplLnB5CkBAIC00LDcgKzQsNyBAQAogICAgID4+PiBpbXBvcnQgZ2xvYiwgcmFuZG9tLCBzeXMKIAogVGhlIHRlc3RzIGNhbiBiZSByZWFsbHkgc2ltcGxlLiBHaXZlbiBhIHNtYWxsIGZyYWdtZW50IG9mIHNvdXJjZQotY29kZSwgcHJpbnQgb3V0IGEgdGFibGUgd2l0aCB0b2tlbnMuIFRoZSBFTkRNQVJLIGlzIG9taXR0ZWQgZm9yCitjb2RlLCBwcmludCBvdXQgYSB0YWJsZSB3aXRoIHRva2Vucy4gVGhlIEVORE1BUktFUiBpcyBvbWl0dGVkIGZvcgogYnJldml0eS4KIAogICAgID4+PiBkdW1wX3Rva2VucygiMSArIDEiKQpAQCAtMjc4LDYgKzI3OCwzMSBAQAogICAgIE9QICAgICAgICAgJysnICAgICAgICAgICAoMSwgMzIpICgxLCAzMykKICAgICBTVFJJTkcgICAgICdVUiJBQkMiJyAgICAgKDEsIDM0KSAoMSwgNDEpCiAKKyAgICA+Pj4gZHVtcF90b2tlbnMoImInYWJjJyArIEInYWJjJyIpCisgICAgU1RSSU5HICAgICAiYidhYmMnIiAgICAgICgxLCAwKSAoMSwgNikKKyAgICBPUCAgICAgICAgICcrJyAgICAgICAgICAgKDEsIDcpICgxLCA4KQorICAgIFNUUklORyAgICAgIkInYWJjJyIgICAgICAoMSwgOSkgKDEsIDE1KQorICAgID4+PiBkdW1wX3Rva2VucygnYiJhYmMiICsgQiJhYmMiJykKKyAgICBTVFJJTkcgICAgICdiImFiYyInICAgICAgKDEsIDApICgxLCA2KQorICAgIE9QICAgICAgICAgJysnICAgICAgICAgICAoMSwgNykgKDEsIDgpCisgICAgU1RSSU5HICAgICAnQiJhYmMiJyAgICAgICgxLCA5KSAoMSwgMTUpCisgICAgPj4+IGR1bXBfdG9rZW5zKCJicidhYmMnICsgYlInYWJjJyArIEJyJ2FiYycgKyBCUidhYmMnIikKKyAgICBTVFJJTkcgICAgICJicidhYmMnIiAgICAgKDEsIDApICgxLCA3KQorICAgIE9QICAgICAgICAgJysnICAgICAgICAgICAoMSwgOCkgKDEsIDkpCisgICAgU1RSSU5HICAgICAiYlInYWJjJyIgICAgICgxLCAxMCkgKDEsIDE3KQorICAgIE9QICAgICAgICAgJysnICAgICAgICAgICAoMSwgMTgpICgxLCAxOSkKKyAgICBTVFJJTkcgICAgICJCcidhYmMnIiAgICAgKDEsIDIwKSAoMSwgMjcpCisgICAgT1AgICAgICAgICAnKycgICAgICAgICAgICgxLCAyOCkgKDEsIDI5KQorICAgIFNUUklORyAgICAgIkJSJ2FiYyciICAgICAoMSwgMzApICgxLCAzNykKKyAgICA+Pj4gZHVtcF90b2tlbnMoJ2JyImFiYyIgKyBiUiJhYmMiICsgQnIiYWJjIiArIEJSImFiYyInKQorICAgIFNUUklORyAgICAgJ2JyImFiYyInICAgICAoMSwgMCkgKDEsIDcpCisgICAgT1AgICAgICAgICAnKycgICAgICAgICAgICgxLCA4KSAoMSwgOSkKKyAgICBTVFJJTkcgICAgICdiUiJhYmMiJyAgICAgKDEsIDEwKSAoMSwgMTcpCisgICAgT1AgICAgICAgICAnKycgICAgICAgICAgICgxLCAxOCkgKDEsIDE5KQorICAgIFNUUklORyAgICAgJ0JyImFiYyInICAgICAoMSwgMjApICgxLCAyNykKKyAgICBPUCAgICAgICAgICcrJyAgICAgICAgICAgKDEsIDI4KSAoMSwgMjkpCisgICAgU1RSSU5HICAgICAnQlIiYWJjIicgICAgICgxLCAzMCkgKDEsIDM3KQorCiBPcGVyYXRvcnMKIAogICAgID4+PiBkdW1wX3Rva2VucygiZGVmIGQyMihhLCBiLCBjPTIsIGQ9MiwgKmspOiBwYXNzIikKQEAgLTUyNSwxNCArNTUwLDE5IEBACiAgICAgTkFNRSAgICAgICAncGFzcycgICAgICAgICgzLCA5KSAoMywgMTMpCiAgICAgREVERU5UICAgICAnJyAgICAgICAgICAgICg0LCAwKSAoNCwgMCkKICAgICBERURFTlQgICAgICcnICAgICAgICAgICAgKDQsIDApICg0LCAwKQorCitQYXRob2xvZ2ljYWwgd2hpdGVzcGFjZSAoaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTE2MTUyKQorICAgID4+PiBkdW1wX3Rva2VucygiQCAgICAgICAgICAiKQorICAgIE9QICAgICAgICAgJ0AnICAgICAgICAgICAoMSwgMCkgKDEsIDEpCiAiIiIKIAogCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogZnJvbSB0b2tlbml6ZSBpbXBvcnQgKHVudG9rZW5pemUsIGdlbmVyYXRlX3Rva2VucywgTlVNQkVSLCBOQU1FLCBPUCwKLSAgICAgICAgICAgICAgICAgICAgIFNUUklORywgRU5ETUFSS0VSLCB0b2tfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgIFNUUklORywgRU5ETUFSS0VSLCB0b2tfbmFtZSwgVW50b2tlbml6ZXIpCiBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwogaW1wb3J0IG9zCitmcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0Q2FzZQogCiBkZWYgZHVtcF90b2tlbnMocyk6CiAgICAgIiIiUHJpbnQgb3V0IHRoZSB0b2tlbnMgaW4gcyBpbiBhIHRhYmxlIGZvcm1hdC4KQEAgLTU4NSwxMiArNjE1LDQ3IEBACiAgICAgcmV0dXJuIHVudG9rZW5pemUocmVzdWx0KQogCiAKLV9fdGVzdF9fID0geyJkb2N0ZXN0cyIgOiBkb2N0ZXN0cywgJ2RlY2lzdG10JzogZGVjaXN0bXR9CitjbGFzcyBVbnRva2VuaXplVGVzdChUZXN0Q2FzZSk6CiAKKyAgICBkZWYgdGVzdF9iYWRfaW5wdXRfb3JkZXIoc2VsZik6CisgICAgICAgICMgcmFpc2UgaWYgcHJldmlvdXMgcm93CisgICAgICAgIHUgPSBVbnRva2VuaXplcigpCisgICAgICAgIHUucHJldl9yb3cgPSAyCisgICAgICAgIHUucHJldl9jb2wgPSAyCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcikgYXMgY206CisgICAgICAgICAgICB1LmFkZF93aGl0ZXNwYWNlKCgxLDMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtLmV4Y2VwdGlvbi5hcmdzWzBdLAorICAgICAgICAgICAgICAgICdzdGFydCAoMSwzKSBwcmVjZWRlcyBwcmV2aW91cyBlbmQgKDIsMiknKQorICAgICAgICAjIHJhaXNlIGlmIHByZXZpb3VzIGNvbHVtbiBpbiByb3cKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdS5hZGRfd2hpdGVzcGFjZSwgKDIsMSkpCisKKyAgICBkZWYgdGVzdF9iYWNrc2xhc2hfY29udGludWF0aW9uKHNlbGYpOgorICAgICAgICAjIFRoZSBwcm9ibGVtIGlzIHRoYXQgPHdoaXRlc3BhY2U+XDxuZXdsaW5lPiBsZWF2ZXMgbm8gdG9rZW4KKyAgICAgICAgdSA9IFVudG9rZW5pemVyKCkKKyAgICAgICAgdS5wcmV2X3JvdyA9IDEKKyAgICAgICAgdS5wcmV2X2NvbCA9ICAxCisgICAgICAgIHUudG9rZW5zID0gW10KKyAgICAgICAgdS5hZGRfd2hpdGVzcGFjZSgoMiwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS50b2tlbnMsIFsnXFxcbiddKQorICAgICAgICB1LnByZXZfcm93ID0gMgorICAgICAgICB1LmFkZF93aGl0ZXNwYWNlKCg0LCA0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LnRva2VucywgWydcXFxuJywgJ1xcXG5cXFxuJywgJyAgICAnXSkKKworICAgIGRlZiB0ZXN0X2l0ZXJfY29tcGF0KHNlbGYpOgorICAgICAgICB1ID0gVW50b2tlbml6ZXIoKQorICAgICAgICB0b2tlbiA9IChOQU1FLCAnSGVsbG8nKQorICAgICAgICB1LmNvbXBhdCh0b2tlbiwgaXRlcihbXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS50b2tlbnMsIFsiSGVsbG8gIl0pCisgICAgICAgIHUgPSBVbnRva2VuaXplcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS51bnRva2VuaXplKGl0ZXIoW3Rva2VuXSkpLCAnSGVsbG8gJykKKworCitfX3Rlc3RfXyA9IHsiZG9jdGVzdHMiIDogZG9jdGVzdHMsICdkZWNpc3RtdCc6IGRlY2lzdG10fQogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3Rva2VuaXplCiAgICAgdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3RfdG9rZW5pemUsIFRydWUpCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChVbnRva2VuaXplVGVzdCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90b29scy5weSBiL0xpYi90ZXN0L3Rlc3RfdG9vbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYwYjRjNwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L3Rlc3RfdG9vbHMucHkKQEAgLTAsMCArMSwzNjggQEAKKyIiIlRlc3RzIGZvciBzY3JpcHRzIGluIHRoZSBUb29scyBkaXJlY3RvcnkuCisKK1RoaXMgZmlsZSBjb250YWlucyByZWdyZXNzaW9uIHRlc3RzIGZvciBzb21lIG9mIHRoZSBzY3JpcHRzIGZvdW5kIGluIHRoZQorVG9vbHMgZGlyZWN0b3J5IG9mIGEgUHl0aG9uIGNoZWNrb3V0IG9yIHRhcmJhbGwsIHN1Y2ggYXMgcmVpbmRlbnQucHkuCisiIiIKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzY29uZmlnCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB0ZXh0d3JhcAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdC5zY3JpcHRfaGVscGVyIGltcG9ydCBhc3NlcnRfcHl0aG9uX29rLCB0ZW1wX2RpcgorCitpZiBub3Qgc3lzY29uZmlnLmlzX3B5dGhvbl9idWlsZCgpOgorICAgICMgWFhYIHNvbWUgaW5zdGFsbGVycyBkbyBjb250YWluIHRoZSB0b29scywgc2hvdWxkIHdlIGRldGVjdCB0aGF0CisgICAgIyBhbmQgcnVuIHRoZSB0ZXN0cyBpbiB0aGF0IGNhc2UgdG9vPworICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCd0ZXN0IGlycmVsZXZhbnQgZm9yIGFuIGluc3RhbGxlZCBQeXRob24nKQorCitiYXNlcGF0aCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdUb29scycpCitzY3JpcHRzZGlyID0gb3MucGF0aC5qb2luKGJhc2VwYXRoLCAnc2NyaXB0cycpCisKKworY2xhc3MgUmVpbmRlbnRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgc2NyaXB0ID0gb3MucGF0aC5qb2luKHNjcmlwdHNkaXIsICdyZWluZGVudC5weScpCisKKyAgICBkZWYgdGVzdF9ub2FyZ3Moc2VsZik6CisgICAgICAgIGFzc2VydF9weXRob25fb2soc2VsZi5zY3JpcHQpCisKKyAgICBkZWYgdGVzdF9oZWxwKHNlbGYpOgorICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX29rKHNlbGYuc2NyaXB0LCAnLWgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dCwgYicnKQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIoZXJyLCBiJycpCisKKworY2xhc3MgUGluZGVudFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBzY3JpcHQgPSBvcy5wYXRoLmpvaW4oc2NyaXB0c2RpciwgJ3BpbmRlbnQucHknKQorCisgICAgZGVmIGFzc2VydEZpbGVFcXVhbChzZWxmLCBmbjEsIGZuMik6CisgICAgICAgIHdpdGggb3BlbihmbjEpIGFzIGYxLCBvcGVuKGZuMikgYXMgZjI6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYxLnJlYWRsaW5lcygpLCBmMi5yZWFkbGluZXMoKSkKKworICAgIGRlZiBwaW5kZW50KHNlbGYsIHNvdXJjZSwgKmFyZ3MpOgorICAgICAgICBwcm9jID0gc3VicHJvY2Vzcy5Qb3BlbigKKyAgICAgICAgICAgICAgICAoc3lzLmV4ZWN1dGFibGUsIHNlbGYuc2NyaXB0KSArIGFyZ3MsCisgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlKQorICAgICAgICBvdXQsIGVyciA9IHByb2MuY29tbXVuaWNhdGUoc291cmNlKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShlcnIpCisgICAgICAgIHJldHVybiBvdXQKKworICAgIGRlZiBsc3RyaXBsaW5lcyhzZWxmLCBkYXRhKToKKyAgICAgICAgcmV0dXJuICdcbicuam9pbihsaW5lLmxzdHJpcCgpIGZvciBsaW5lIGluIGRhdGEuc3BsaXRsaW5lcygpKSArICdcbicKKworICAgIGRlZiB0ZXN0X3NlbGZ0ZXN0KHNlbGYpOgorICAgICAgICBzZWxmLm1heERpZmYgPSBOb25lCisgICAgICAgIHdpdGggdGVtcF9kaXIoKSBhcyBkaXJlY3Rvcnk6CisgICAgICAgICAgICBkYXRhX3BhdGggPSBvcy5wYXRoLmpvaW4oZGlyZWN0b3J5LCAnX3Rlc3QucHknKQorICAgICAgICAgICAgd2l0aCBvcGVuKHNlbGYuc2NyaXB0KSBhcyBmOgorICAgICAgICAgICAgICAgIGNsb3NlZCA9IGYucmVhZCgpCisgICAgICAgICAgICB3aXRoIG9wZW4oZGF0YV9wYXRoLCAndycpIGFzIGY6CisgICAgICAgICAgICAgICAgZi53cml0ZShjbG9zZWQpCisKKyAgICAgICAgICAgIHJjLCBvdXQsIGVyciA9IGFzc2VydF9weXRob25fb2soc2VsZi5zY3JpcHQsICctZCcsIGRhdGFfcGF0aCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LCBiJycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyciwgYicnKQorICAgICAgICAgICAgYmFja3VwID0gZGF0YV9wYXRoICsgJ34nCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoYmFja3VwKSkKKyAgICAgICAgICAgIHdpdGggb3BlbihiYWNrdXApIGFzIGY6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgY2xvc2VkKQorICAgICAgICAgICAgd2l0aCBvcGVuKGRhdGFfcGF0aCkgYXMgZjoKKyAgICAgICAgICAgICAgICBjbGVhbiA9IGYucmVhZCgpCisgICAgICAgICAgICBjb21waWxlKGNsZWFuLCAnX3Rlc3QucHknLCAnZXhlYycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGluZGVudChjbGVhbiwgJy1jJyksIGNsb3NlZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5waW5kZW50KGNsb3NlZCwgJy1kJyksIGNsZWFuKQorCisgICAgICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX29rKHNlbGYuc2NyaXB0LCAnLWMnLCBkYXRhX3BhdGgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dCwgYicnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIsIGInJykKKyAgICAgICAgICAgIHdpdGggb3BlbihiYWNrdXApIGFzIGY6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgY2xlYW4pCisgICAgICAgICAgICB3aXRoIG9wZW4oZGF0YV9wYXRoKSBhcyBmOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksIGNsb3NlZCkKKworICAgICAgICAgICAgYnJva2VuID0gc2VsZi5sc3RyaXBsaW5lcyhjbG9zZWQpCisgICAgICAgICAgICB3aXRoIG9wZW4oZGF0YV9wYXRoLCAndycpIGFzIGY6CisgICAgICAgICAgICAgICAgZi53cml0ZShicm9rZW4pCisgICAgICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX29rKHNlbGYuc2NyaXB0LCAnLXInLCBkYXRhX3BhdGgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dCwgYicnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIsIGInJykKKyAgICAgICAgICAgIHdpdGggb3BlbihiYWNrdXApIGFzIGY6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgYnJva2VuKQorICAgICAgICAgICAgd2l0aCBvcGVuKGRhdGFfcGF0aCkgYXMgZjoKKyAgICAgICAgICAgICAgICBpbmRlbnRlZCA9IGYucmVhZCgpCisgICAgICAgICAgICBjb21waWxlKGluZGVudGVkLCAnX3Rlc3QucHknLCAnZXhlYycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGluZGVudChicm9rZW4sICctcicpLCBpbmRlbnRlZCkKKworICAgIGRlZiBwaW5kZW50X3Rlc3Qoc2VsZiwgY2xlYW4sIGNsb3NlZCk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5waW5kZW50KGNsZWFuLCAnLWMnKSwgY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGluZGVudChjbG9zZWQsICctZCcpLCBjbGVhbikKKyAgICAgICAgYnJva2VuID0gc2VsZi5sc3RyaXBsaW5lcyhjbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5waW5kZW50KGJyb2tlbiwgJy1yJywgJy1lJywgJy1zJywgJzQnKSwgY2xvc2VkKQorCisgICAgZGVmIHRlc3Rfc3RhdGVtZW50cyhzZWxmKToKKyAgICAgICAgY2xlYW4gPSB0ZXh0d3JhcC5kZWRlbnQoIiIiXAorICAgICAgICAgICAgaWYgYToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGlmIGE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGlmIGE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxpZjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgd2hpbGUgYToKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICB3aGlsZSBhOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgZm9yIGkgaW4gYToKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICBmb3IgaSBpbiBhOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIHdpdGggYToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIikKKworICAgICAgICBjbG9zZWQgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiXAorICAgICAgICAgICAgaWYgYToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAjIGVuZCBpZgorCisgICAgICAgICAgICBpZiBhOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIyBlbmQgaWYKKworICAgICAgICAgICAgaWYgYToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbGlmOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIyBlbmQgaWYKKworICAgICAgICAgICAgd2hpbGUgYToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgIyBlbmQgd2hpbGUKKworICAgICAgICAgICAgd2hpbGUgYToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAjIGVuZCB3aGlsZQorCisgICAgICAgICAgICBmb3IgaSBpbiBhOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAjIGVuZCBmb3IKKworICAgICAgICAgICAgZm9yIGkgaW4gYToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAjIGVuZCBmb3IKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIyBlbmQgdHJ5CisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIyBlbmQgdHJ5CisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIyBlbmQgdHJ5CisKKyAgICAgICAgICAgIHdpdGggYToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAjIGVuZCB3aXRoCisKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIyBlbmQgY2xhc3MgQQorCisgICAgICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICMgZW5kIGRlZiBmCisgICAgICAgICAgICAiIiIpCisgICAgICAgIHNlbGYucGluZGVudF90ZXN0KGNsZWFuLCBjbG9zZWQpCisKKyAgICBkZWYgdGVzdF9tdWx0aWxldmVsKHNlbGYpOgorICAgICAgICBjbGVhbiA9IHRleHR3cmFwLmRlZGVudCgiIiJcCisgICAgICAgICAgICBkZWYgZm9vYmFyKGEsIGIpOgorICAgICAgICAgICAgICAgIGlmIGEgPT0gYjoKKyAgICAgICAgICAgICAgICAgICAgYSA9IGErMQorICAgICAgICAgICAgICAgIGVsaWYgYSA8IGI6CisgICAgICAgICAgICAgICAgICAgIGIgPSBiLTEKKyAgICAgICAgICAgICAgICAgICAgaWYgYiA+IGE6IGEgPSBhLTEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAnb29wcyEnCisgICAgICAgICAgICAiIiIpCisgICAgICAgIGNsb3NlZCA9IHRleHR3cmFwLmRlZGVudCgiIiJcCisgICAgICAgICAgICBkZWYgZm9vYmFyKGEsIGIpOgorICAgICAgICAgICAgICAgIGlmIGEgPT0gYjoKKyAgICAgICAgICAgICAgICAgICAgYSA9IGErMQorICAgICAgICAgICAgICAgIGVsaWYgYSA8IGI6CisgICAgICAgICAgICAgICAgICAgIGIgPSBiLTEKKyAgICAgICAgICAgICAgICAgICAgaWYgYiA+IGE6IGEgPSBhLTEKKyAgICAgICAgICAgICAgICAgICAgIyBlbmQgaWYKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAnb29wcyEnCisgICAgICAgICAgICAgICAgIyBlbmQgaWYKKyAgICAgICAgICAgICMgZW5kIGRlZiBmb29iYXIKKyAgICAgICAgICAgICIiIikKKyAgICAgICAgc2VsZi5waW5kZW50X3Rlc3QoY2xlYW4sIGNsb3NlZCkKKworICAgIGRlZiB0ZXN0X3ByZXNlcnZlX2luZGVudHMoc2VsZik6CisgICAgICAgIGNsZWFuID0gdGV4dHdyYXAuZGVkZW50KCIiIlwKKyAgICAgICAgICAgIGlmIGE6CisgICAgICAgICAgICAgICAgICAgICBpZiBiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiKQorICAgICAgICBjbG9zZWQgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiXAorICAgICAgICAgICAgaWYgYToKKyAgICAgICAgICAgICAgICAgICAgIGlmIGI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgICAgICAjIGVuZCBpZgorICAgICAgICAgICAgIyBlbmQgaWYKKyAgICAgICAgICAgICIiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBpbmRlbnQoY2xlYW4sICctYycpLCBjbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5waW5kZW50KGNsb3NlZCwgJy1kJyksIGNsZWFuKQorICAgICAgICBicm9rZW4gPSBzZWxmLmxzdHJpcGxpbmVzKGNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBpbmRlbnQoYnJva2VuLCAnLXInLCAnLWUnLCAnLXMnLCAnOScpLCBjbG9zZWQpCisgICAgICAgIGNsZWFuID0gdGV4dHdyYXAuZGVkZW50KCIiIlwKKyAgICAgICAgICAgIGlmIGE6CisgICAgICAgICAgICBcdGlmIGI6CisgICAgICAgICAgICBcdFx0cGFzcworICAgICAgICAgICAgIiIiKQorICAgICAgICBjbG9zZWQgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiXAorICAgICAgICAgICAgaWYgYToKKyAgICAgICAgICAgIFx0aWYgYjoKKyAgICAgICAgICAgIFx0XHRwYXNzCisgICAgICAgICAgICBcdCMgZW5kIGlmCisgICAgICAgICAgICAjIGVuZCBpZgorICAgICAgICAgICAgIiIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGluZGVudChjbGVhbiwgJy1jJyksIGNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBpbmRlbnQoY2xvc2VkLCAnLWQnKSwgY2xlYW4pCisgICAgICAgIGJyb2tlbiA9IHNlbGYubHN0cmlwbGluZXMoY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGluZGVudChicm9rZW4sICctcicpLCBjbG9zZWQpCisKKyAgICBkZWYgdGVzdF9lc2NhcGVkX25ld2xpbmUoc2VsZik6CisgICAgICAgIGNsZWFuID0gdGV4dHdyYXAuZGVkZW50KCIiIlwKKyAgICAgICAgICAgIGNsYXNzXFwKKyAgICAgICAgICAgIFxcCisgICAgICAgICAgICAgQToKKyAgICAgICAgICAgICAgIGRlZlwKKyAgICAgICAgICAgIFxcCisgICAgICAgICAgICBmOgorICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiKQorICAgICAgICBjbG9zZWQgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiXAorICAgICAgICAgICAgY2xhc3NcXAorICAgICAgICAgICAgXFwKKyAgICAgICAgICAgICBBOgorICAgICAgICAgICAgICAgZGVmXAorICAgICAgICAgICAgXFwKKyAgICAgICAgICAgIGY6CisgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAjIGVuZCBkZWYgZgorICAgICAgICAgICAgIyBlbmQgY2xhc3MgQQorICAgICAgICAgICAgIiIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGluZGVudChjbGVhbiwgJy1jJyksIGNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBpbmRlbnQoY2xvc2VkLCAnLWQnKSwgY2xlYW4pCisKKyAgICBkZWYgdGVzdF9lbXB0eV9saW5lKHNlbGYpOgorICAgICAgICBjbGVhbiA9IHRleHR3cmFwLmRlZGVudCgiIiJcCisgICAgICAgICAgICBpZiBhOgorCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiKQorICAgICAgICBjbG9zZWQgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiXAorICAgICAgICAgICAgaWYgYToKKworICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICMgZW5kIGlmCisgICAgICAgICAgICAiIiIpCisgICAgICAgIHNlbGYucGluZGVudF90ZXN0KGNsZWFuLCBjbG9zZWQpCisKKyAgICBkZWYgdGVzdF9vbmVsaW5lKHNlbGYpOgorICAgICAgICBjbGVhbiA9IHRleHR3cmFwLmRlZGVudCgiIiJcCisgICAgICAgICAgICBpZiBhOiBwYXNzCisgICAgICAgICAgICAiIiIpCisgICAgICAgIGNsb3NlZCA9IHRleHR3cmFwLmRlZGVudCgiIiJcCisgICAgICAgICAgICBpZiBhOiBwYXNzCisgICAgICAgICAgICAjIGVuZCBpZgorICAgICAgICAgICAgIiIiKQorICAgICAgICBzZWxmLnBpbmRlbnRfdGVzdChjbGVhbiwgY2xvc2VkKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCpbb2JqIGZvciBvYmogaW4gZ2xvYmFscygpLnZhbHVlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG9iaiwgdHlwZSldKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RyYWNlYmFjay5weSBiL0xpYi90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5CmluZGV4IDgwNzZiZTguLjhiMDMyMmIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5CkBAIC0xLDExICsxLDEwIEBACiAiIiJUZXN0IGNhc2VzIGZvciB0cmFjZWJhY2sgbW9kdWxlIiIiCiAKLWZyb20gX3Rlc3RjYXBpIGltcG9ydCB0cmFjZWJhY2tfcHJpbnQKIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCiBpbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gaW1wIGltcG9ydCByZWxvYWQKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgaXNfanl0aG9uLCBFcnJvcgorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBpc19qeXRob24sIEVycm9yLCBjcHl0aG9uX29ubHkKIAogaW1wb3J0IHRyYWNlYmFjawogCkBAIC0zNSw2ICszNCw5IEBACiAgICAgZGVmIHN5bnRheF9lcnJvcl9iYWRfaW5kZW50YXRpb24oc2VsZik6CiAgICAgICAgIGNvbXBpbGUoImRlZiBzcGFtKCk6XG4gIHByaW50IDFcbiBwcmludCAyIiwgIj8iLCAiZXhlYyIpCiAKKyAgICBkZWYgc3ludGF4X2Vycm9yX2JhZF9pbmRlbnRhdGlvbjIoc2VsZik6CisgICAgICAgIGNvbXBpbGUoIiBwcmludCgyKSIsICI/IiwgImV4ZWMiKQorCiAgICAgZGVmIHRlc3RfY2FyZXQoc2VsZik6CiAgICAgICAgIGVyciA9IHNlbGYuZ2V0X2V4Y2VwdGlvbl9mb3JtYXQoc2VsZi5zeW50YXhfZXJyb3Jfd2l0aF9jYXJldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhFcnJvcikKQEAgLTExMSw2ICsxMTMsMTMgQEAKICAgICAgICAgICAgICAgICBvcy51bmxpbmsob3MucGF0aC5qb2luKHRlc3RkaXIsIGYpKQogICAgICAgICAgICAgb3Mucm1kaXIodGVzdGRpcikKIAorICAgICAgICBlcnIgPSBzZWxmLmdldF9leGNlcHRpb25fZm9ybWF0KHNlbGYuc3ludGF4X2Vycm9yX2JhZF9pbmRlbnRhdGlvbjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZW50YXRpb25FcnJvcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZXJyKSwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnJbMV0uc3RyaXAoKSwgInByaW50KDIpIikKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiXiIsIGVyclsyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnJbMV0uZmluZCgicCIpLCBlcnJbMl0uZmluZCgiXiIpKQorCiAgICAgZGVmIHRlc3RfYmFzZV9leGNlcHRpb24oc2VsZik6CiAgICAgICAgICMgVGVzdCB0aGF0IGV4Y2VwdGlvbnMgZGVyaXZlZCBmcm9tIEJhc2VFeGNlcHRpb24gYXJlIGZvcm1hdHRlZCByaWdodAogICAgICAgICBlID0gS2V5Ym9hcmRJbnRlcnJ1cHQoKQpAQCAtMTcxLDcgKzE4MCw5IEBACiAKIGNsYXNzIFRyYWNlYmFja0Zvcm1hdFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAorICAgIEBjcHl0aG9uX29ubHkKICAgICBkZWYgdGVzdF90cmFjZWJhY2tfZm9ybWF0KHNlbGYpOgorICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgdHJhY2ViYWNrX3ByaW50CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdibGFoJykKICAgICAgICAgZXhjZXB0IEtleUVycm9yOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90dGtfZ3Vpb25seS5weSBiL0xpYi90ZXN0L3Rlc3RfdHRrX2d1aW9ubHkucHkKaW5kZXggZTAzNjhiZS4uY2FhNjkzMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90dGtfZ3Vpb25seS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3R0a19ndWlvbmx5LnB5CkBAIC0yLDggKzIsOSBAQAogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogCi0jIFNraXAgdGhpcyB0ZXN0IGlmIF90a2ludGVyIHdhc24ndCBidWlsdC4KKyMgU2tpcCB0aGlzIHRlc3QgaWYgX3RraW50ZXIgd2Fzbid0IGJ1aWx0IG9yIGd1aSByZXNvdXJjZSBpcyBub3QgYXZhaWxhYmxlLgogdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ190a2ludGVyJykKK3Rlc3Rfc3VwcG9ydC5yZXF1aXJlcygnZ3VpJykKIAogdGhpc19kaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSkKIGxpYl90a190ZXN0ID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbih0aGlzX2Rpciwgb3MucGF0aC5wYXJkaXIsCkBAIC0xMiw5ICsxMyw2IEBACiB3aXRoIHRlc3Rfc3VwcG9ydC5EaXJzT25TeXNQYXRoKGxpYl90a190ZXN0KToKICAgICBpbXBvcnQgcnVudGt0ZXN0cwogCi0jIFNraXAgdGVzdCBpZiB0ayBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQuCi1ydW50a3Rlc3RzLmNoZWNrX3RrX2F2YWlsYWJpbGl0eSgpCi0KIGltcG9ydCB0dGsKIGZyb20gX3RraW50ZXIgaW1wb3J0IFRjbEVycm9yCiAKQEAgLTI0LDEzICsyMiw3IEBACiAgICAgIyBhc3N1bWluZyB0dGsgaXMgbm90IGF2YWlsYWJsZQogICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJ0dGsgbm90IGF2YWlsYWJsZTogJXMiICUgbXNnKQogCi1kZWYgdGVzdF9tYWluKGVuYWJsZV9ndWk9RmFsc2UpOgotICAgIGlmIGVuYWJsZV9ndWk6Ci0gICAgICAgIGlmIHRlc3Rfc3VwcG9ydC51c2VfcmVzb3VyY2VzIGlzIE5vbmU6Ci0gICAgICAgICAgICB0ZXN0X3N1cHBvcnQudXNlX3Jlc291cmNlcyA9IFsnZ3VpJ10KLSAgICAgICAgZWxpZiAnZ3VpJyBub3QgaW4gdGVzdF9zdXBwb3J0LnVzZV9yZXNvdXJjZXM6Ci0gICAgICAgICAgICB0ZXN0X3N1cHBvcnQudXNlX3Jlc291cmNlcy5hcHBlbmQoJ2d1aScpCi0KK2RlZiB0ZXN0X21haW4oKToKICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5EaXJzT25TeXNQYXRoKGxpYl90a190ZXN0KToKICAgICAgICAgZnJvbSB0ZXN0X3R0ay5zdXBwb3J0IGltcG9ydCBnZXRfdGtfcm9vdAogICAgICAgICB0cnk6CkBAIC00MCw0ICszMiw0IEBACiAgICAgICAgICAgICBnZXRfdGtfcm9vdCgpLmRlc3Ryb3koKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIHRlc3RfbWFpbihlbmFibGVfZ3VpPVRydWUpCisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdWNuLnB5IGIvTGliL3Rlc3QvdGVzdF91Y24ucHkKaW5kZXggNzc1MDQ0Yi4uNDQwOWRlYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91Y24ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91Y24ucHkKQEAgLTgsOSArOCwxNSBAQAogIiIiIyIKIAogaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3lzCiAKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiAKK3RyeToKKyAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgSU5UX01BWCwgUFlfU1NJWkVfVF9NQVgsIFVJTlRfTUFYCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgSU5UX01BWCA9IFBZX1NTSVpFX1RfTUFYID0gVUlOVF9NQVggPSAyKio2NCAtIDEKKwogY2xhc3MgVW5pY29kZU5hbWVzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgY2hlY2tsZXR0ZXIoc2VsZiwgbmFtZSwgY29kZSk6CkBAIC0xMzcsNiArMTQzLDI1IEBACiAgICAgICAgICAgICB1bmljb2RlLCAiXFxOU1BBQ0UiLCAndW5pY29kZS1lc2NhcGUnLCAnc3RyaWN0JwogICAgICAgICApCiAKKyAgICBAdGVzdF9zdXBwb3J0LmNweXRob25fb25seQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKElOVF9NQVggPCBQWV9TU0laRV9UX01BWCwgIm5lZWRzIFVJTlRfTUFYIDwgU0laRV9NQVgiKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKFVJTlRfTUFYIDwgc3lzLm1heGludCwgIm5lZWRzIFVJTlRfTUFYIDwgc3lzLm1heGludCIpCisgICAgQHRlc3Rfc3VwcG9ydC5iaWdtZW10ZXN0KG1pbnNpemU9VUlOVF9NQVggKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW11c2U9MiArIDQgLy8gbGVuKHUnXFUwMDAxMDAwMCcpKQorICAgIGRlZiB0ZXN0X2lzc3VlMTYzMzUoc2VsZiwgc2l6ZSk6CisgICAgICAgIGZ1bmMgPSBzZWxmLnRlc3RfaXNzdWUxNjMzNQorICAgICAgICBpZiBzaXplIDwgZnVuYy5taW5zaXplOgorICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoIm5vdCBlbm91Z2ggbWVtb3J5OiAlLjFmRyBtaW5pbXVtIG5lZWRlZCIgJQorICAgICAgICAgICAgICAgICAgICAoZnVuYy5taW5zaXplICogZnVuYy5tZW11c2UgLyBmbG9hdCgxMDI0KiozKSwpKQorICAgICAgICAjIHZlcnkgdmVyeSBsb25nIGJvZ3VzIGNoYXJhY3RlciBuYW1lCisgICAgICAgIHggPSBiJ1xcTntTUEFDRScgKyBiJ3gnICogaW50KFVJTlRfTUFYICsgMSkgKyBiJ30nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHgpLCBsZW4oYidcXE57U1BBQ0V9JykgKyAoVUlOVF9NQVggKyAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVW5pY29kZUVycm9yLAorICAgICAgICAgICAgJ3Vua25vd24gVW5pY29kZSBjaGFyYWN0ZXIgbmFtZScsCisgICAgICAgICAgICB4LmRlY29kZSwgJ3VuaWNvZGUtZXNjYXBlJworICAgICAgICApCisKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVW5pY29kZU5hbWVzVGVzdCkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91bmljb2RlLnB5IGIvTGliL3Rlc3QvdGVzdF91bmljb2RlLnB5CmluZGV4IGZkYTQ0ZGEuLmJhZmQwNjYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdW5pY29kZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VuaWNvZGUucHkKQEAgLTY0NCw2ICs2NDQsMjMgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gdSdcdTEyMzQnCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJyVzJyAlIFdyYXBwZXIoKSwgdSdcdTEyMzQnKQogCisgICAgZGVmIHRlc3RfZm9ybWF0dGluZ19odWdlX3ByZWNpc2lvbihzZWxmKToKKyAgICAgICAgZm9ybWF0X3N0cmluZyA9IHUiJS57fWYiLmZvcm1hdChzeXMubWF4c2l6ZSArIDEpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICByZXN1bHQgPSBmb3JtYXRfc3RyaW5nICUgMi4zNAorCisgICAgQHRlc3Rfc3VwcG9ydC5jcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdF9mb3JtYXR0aW5nX2h1Z2VfcHJlY2lzaW9uX2NfbGltaXRzKHNlbGYpOgorICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgSU5UX01BWAorICAgICAgICBmb3JtYXRfc3RyaW5nID0gdSIlLnt9ZiIuZm9ybWF0KElOVF9NQVggKyAxKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgcmVzdWx0ID0gZm9ybWF0X3N0cmluZyAlIDIuMzQKKworICAgIGRlZiB0ZXN0X2Zvcm1hdHRpbmdfaHVnZV93aWR0aChzZWxmKToKKyAgICAgICAgZm9ybWF0X3N0cmluZyA9IHUiJXt9ZiIuZm9ybWF0KHN5cy5tYXhzaXplICsgMSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIHJlc3VsdCA9IGZvcm1hdF9zdHJpbmcgJSAyLjM0CisKICAgICBkZWYgdGVzdF9zdGFydHN3aXRoX2VuZHN3aXRoX2Vycm9ycyhzZWxmKToKICAgICAgICAgZm9yIG1ldGggaW4gKHUnZm9vJy5zdGFydHN3aXRoLCB1J2ZvbycuZW5kc3dpdGgpOgogICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IpOgpAQCAtMTI2NiwxMiArMTI4MywxMiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoczEoKSksICdcXG4nKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoczIoKSksICdcXG4nKQogCisgICAgIyBUaGlzIHRlc3Qgb25seSBhZmZlY3RzIDMyLWJpdCBwbGF0Zm9ybXMgYmVjYXVzZSBleHBhbmR0YWJzIGNhbiBvbmx5IHRha2UKKyAgICAjIGFuIGludCBhcyB0aGUgbWF4IHZhbHVlLCBub3QgYSA2NC1iaXQgQyBsb25nLiAgSWYgZXhwYW5kdGFicyBpcyBjaGFuZ2VkCisgICAgIyB0byB0YWtlIGEgNjQtYml0IGxvbmcsIHRoaXMgdGVzdCBzaG91bGQgYXBwbHkgdG8gYWxsIHBsYXRmb3Jtcy4KKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5tYXhpbnQgPiAoMSA8PCAzMikgb3Igc3RydWN0LmNhbGNzaXplKCdQJykgIT0gNCwKKyAgICAgICAgICAgICAgICAgICAgICdvbmx5IGFwcGxpZXMgdG8gMzItYml0IHBsYXRmb3JtcycpCiAgICAgZGVmIHRlc3RfZXhwYW5kdGFic19vdmVyZmxvd3NfZ3JhY2VmdWxseShzZWxmKToKLSAgICAgICAgIyBUaGlzIHRlc3Qgb25seSBhZmZlY3RzIDMyLWJpdCBwbGF0Zm9ybXMgYmVjYXVzZSBleHBhbmR0YWJzIGNhbiBvbmx5IHRha2UKLSAgICAgICAgIyBhbiBpbnQgYXMgdGhlIG1heCB2YWx1ZSwgbm90IGEgNjQtYml0IEMgbG9uZy4gIElmIGV4cGFuZHRhYnMgaXMgY2hhbmdlZAotICAgICAgICAjIHRvIHRha2UgYSA2NC1iaXQgbG9uZywgdGhpcyB0ZXN0IHNob3VsZCBhcHBseSB0byBhbGwgcGxhdGZvcm1zLgotICAgICAgICBpZiBzeXMubWF4aW50ID4gKDEgPDwgMzIpIG9yIHN0cnVjdC5jYWxjc2l6ZSgnUCcpICE9IDQ6Ci0gICAgICAgICAgICByZXR1cm4KICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgdSd0XHR0XHQnLmV4cGFuZHRhYnMsIHN5cy5tYXhpbnQpCiAKICAgICBkZWYgdGVzdF9fZm9ybWF0X18oc2VsZik6CkBAIC0xNDQ2LDYgKzE0NjMsMjcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swOjEwMDAwfScuZm9ybWF0KHUnJyksIHUnICcgKiAxMDAwMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swOjEwMDAwMDAwfScuZm9ybWF0KHUnJyksIHUnICcgKiAxMDAwMDAwMCkKIAorICAgICAgICAjIGlzc3VlIDEyNTQ2OiB1c2UgXHgwMCBhcyBhIGZpbGwgY2hhcmFjdGVyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOlx4MDA8NnN9Jy5mb3JtYXQoJ2ZvbycpLCAnZm9vXHgwMFx4MDBceDAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6XHgwMTw2c30nLmZvcm1hdCgnZm9vJyksICdmb29ceDAxXHgwMVx4MDEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDpceDAwXjZzfScuZm9ybWF0KCdmb28nKSwgJ1x4MDBmb29ceDAwXHgwMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOl42c30nLmZvcm1hdCgnZm9vJyksICcgZm9vICAnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOlx4MDA8Nn0nLmZvcm1hdCgzKSwgJzNceDAwXHgwMFx4MDBceDAwXHgwMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOlx4MDE8Nn0nLmZvcm1hdCgzKSwgJzNceDAxXHgwMVx4MDFceDAxXHgwMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOlx4MDBeNn0nLmZvcm1hdCgzKSwgJ1x4MDBceDAwM1x4MDBceDAwXHgwMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOjw2fScuZm9ybWF0KDMpLCAnMyAgICAgJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDpceDAwPDZ9Jy5mb3JtYXQoMy4xNCksICczLjE0XHgwMFx4MDAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDpceDAxPDZ9Jy5mb3JtYXQoMy4xNCksICczLjE0XHgwMVx4MDEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDpceDAwXjZ9Jy5mb3JtYXQoMy4xNCksICdceDAwMy4xNFx4MDAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDpeNn0nLmZvcm1hdCgzLjE0KSwgJyAzLjE0ICcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6XHgwMDwxMn0nLmZvcm1hdCgzKzIuMGopLCAnKDMrMmopXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6XHgwMTwxMn0nLmZvcm1hdCgzKzIuMGopLCAnKDMrMmopXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6XHgwMF4xMn0nLmZvcm1hdCgzKzIuMGopLCAnXHgwMFx4MDBceDAwKDMrMmopXHgwMFx4MDBceDAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6XjEyfScuZm9ybWF0KDMrMi4waiksICcgICAoMysyaikgICAnKQorCiAgICAgICAgICMgZm9ybWF0IHNwZWNpZmllcnMgZm9yIHVzZXIgZGVmaW5lZCB0eXBlCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MDphYmN9Jy5mb3JtYXQoQygpKSwgdSdhYmMnKQogCkBAIC0xNTU2LDYgKzE1OTQsMjEgQEAKICAgICAgICAgIyAgd2lsbCBmYWlsCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFbmNvZGVFcnJvciwgImZvb3swfSIuZm9ybWF0LCB1J1x1MTAwMGJhcicpCiAKKyAgICBkZWYgdGVzdF9mb3JtYXRfaHVnZV9wcmVjaXNpb24oc2VsZik6CisgICAgICAgIGZvcm1hdF9zdHJpbmcgPSB1Ii57fWYiLmZvcm1hdChzeXMubWF4c2l6ZSArIDEpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICByZXN1bHQgPSBmb3JtYXQoMi4zNCwgZm9ybWF0X3N0cmluZykKKworICAgIGRlZiB0ZXN0X2Zvcm1hdF9odWdlX3dpZHRoKHNlbGYpOgorICAgICAgICBmb3JtYXRfc3RyaW5nID0gdSJ7fWYiLmZvcm1hdChzeXMubWF4c2l6ZSArIDEpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICByZXN1bHQgPSBmb3JtYXQoMi4zNCwgZm9ybWF0X3N0cmluZykKKworICAgIGRlZiB0ZXN0X2Zvcm1hdF9odWdlX2l0ZW1fbnVtYmVyKHNlbGYpOgorICAgICAgICBmb3JtYXRfc3RyaW5nID0gdSJ7e3t9Oi42Zn19Ii5mb3JtYXQoc3lzLm1heHNpemUgKyAxKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgcmVzdWx0ID0gZm9ybWF0X3N0cmluZy5mb3JtYXQoMi4zNCkKKwogICAgIGRlZiB0ZXN0X2Zvcm1hdF9hdXRvX251bWJlcmluZyhzZWxmKToKICAgICAgICAgY2xhc3MgQzoKICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4PTEwMCk6CkBAIC0xNjA2LDYgKzE2NTksMTE5IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIiVzIiAlIHUsIHUnX191bmljb2RlX18gb3ZlcnJpZGRlbicpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInt9Ii5mb3JtYXQodSksICdfX3VuaWNvZGVfXyBvdmVycmlkZGVuJykKIAorICAgICMgVGVzdCBQeVVuaWNvZGVfRnJvbUZvcm1hdCgpCisgICAgZGVmIHRlc3RfZnJvbV9mb3JtYXQoc2VsZik6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdjdHlwZXMnKQorICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgKAorICAgICAgICAgICAgcHl0aG9uYXBpLCBweV9vYmplY3QsIHNpemVvZiwKKyAgICAgICAgICAgIGNfaW50LCBjX2xvbmcsIGNfbG9uZ2xvbmcsIGNfc3NpemVfdCwKKyAgICAgICAgICAgIGNfdWludCwgY191bG9uZywgY191bG9uZ2xvbmcsIGNfc2l6ZV90LCBjX3ZvaWRfcCkKKyAgICAgICAgaWYgc3lzLm1heHVuaWNvZGUgPT0gMHhmZmZmOgorICAgICAgICAgICAgbmFtZSA9ICJQeVVuaWNvZGVVQ1MyX0Zyb21Gb3JtYXQiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuYW1lID0gIlB5VW5pY29kZVVDUzRfRnJvbUZvcm1hdCIKKyAgICAgICAgX1B5VW5pY29kZV9Gcm9tRm9ybWF0ID0gZ2V0YXR0cihweXRob25hcGksIG5hbWUpCisgICAgICAgIF9QeVVuaWNvZGVfRnJvbUZvcm1hdC5yZXN0eXBlID0gcHlfb2JqZWN0CisKKyAgICAgICAgZGVmIFB5VW5pY29kZV9Gcm9tRm9ybWF0KGZvcm1hdCwgKmFyZ3MpOgorICAgICAgICAgICAgY2FyZ3MgPSB0dXBsZSgKKyAgICAgICAgICAgICAgICBweV9vYmplY3QoYXJnKSBpZiBpc2luc3RhbmNlKGFyZywgdW5pY29kZSkgZWxzZSBhcmcKKyAgICAgICAgICAgICAgICBmb3IgYXJnIGluIGFyZ3MpCisgICAgICAgICAgICByZXR1cm4gX1B5VW5pY29kZV9Gcm9tRm9ybWF0KGZvcm1hdCwgKmNhcmdzKQorCisgICAgICAgIGRlZiBjaGVja19mb3JtYXQoZXhwZWN0ZWQsIGZvcm1hdCwgKmFyZ3MpOgorICAgICAgICAgICAgdGV4dCA9IFB5VW5pY29kZV9Gcm9tRm9ybWF0KGZvcm1hdCwgKmFyZ3MpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCB0ZXh0KQorCisgICAgICAgICMgYXNjaWkgZm9ybWF0LCBub24tYXNjaWkgYXJndW1lbnQKKyAgICAgICAgY2hlY2tfZm9ybWF0KHUnYXNjaWlceDdmPXVuaWNvZGVceGU5JywKKyAgICAgICAgICAgICAgICAgICAgIGInYXNjaWlceDdmPSVVJywgdSd1bmljb2RlXHhlOScpCisKKyAgICAgICAgIyBub24tYXNjaWkgZm9ybWF0LCBhc2NpaSBhcmd1bWVudDogZW5zdXJlIHRoYXQgUHlVbmljb2RlX0Zyb21Gb3JtYXRWKCkKKyAgICAgICAgIyByYWlzZXMgYW4gZXJyb3IKKyAgICAgICAgI3NlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVmFsdWVFcnJvciwKKyAgICAgICAgIyAgICAnXlB5VW5pY29kZV9Gcm9tRm9ybWF0VlwoXCkgZXhwZWN0cyBhbiBBU0NJSS1lbmNvZGVkIGZvcm1hdCAnCisgICAgICAgICMgICAgJ3N0cmluZywgZ290IGEgbm9uLUFTQ0lJIGJ5dGU6IDB4ZTkkJywKKyAgICAgICAgIyAgICBQeVVuaWNvZGVfRnJvbUZvcm1hdCwgYid1bmljb2RlXHhlOT0lcycsIHUnYXNjaWknKQorCisgICAgICAgICMgdGVzdCAiJWMiCisgICAgICAgIGNoZWNrX2Zvcm1hdCh1J1x1YWJjZCcsCisgICAgICAgICAgICAgICAgICAgICBiJyVjJywgY19pbnQoMHhhYmNkKSkKKyAgICAgICAgaWYgc3lzLm1heHVuaWNvZGUgPiAweGZmZmY6CisgICAgICAgICAgICBjaGVja19mb3JtYXQodSdcVTAwMTBmZmZmJywKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJyVjJywgY19pbnQoMHgxMGZmZmYpKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IpOgorICAgICAgICAgICAgUHlVbmljb2RlX0Zyb21Gb3JtYXQoYiclYycsIGNfaW50KDB4MTEwMDAwKSkKKyAgICAgICAgIyBJc3N1ZSAjMTgxODMKKyAgICAgICAgaWYgc3lzLm1heHVuaWNvZGUgPiAweGZmZmY6CisgICAgICAgICAgICBjaGVja19mb3JtYXQodSdcVTAwMDEwMDAwXFUwMDEwMDAwMCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgYiclYyVjJywgY19pbnQoMHgxMDAwMCksIGNfaW50KDB4MTAwMDAwKSkKKworICAgICAgICAjIHRlc3QgIiUiCisgICAgICAgIGNoZWNrX2Zvcm1hdCh1JyUnLAorICAgICAgICAgICAgICAgICAgICAgYiclJykKKyAgICAgICAgY2hlY2tfZm9ybWF0KHUnJScsCisgICAgICAgICAgICAgICAgICAgICBiJyUlJykKKyAgICAgICAgY2hlY2tfZm9ybWF0KHUnJXMnLAorICAgICAgICAgICAgICAgICAgICAgYiclJXMnKQorICAgICAgICBjaGVja19mb3JtYXQodSdbJV0nLAorICAgICAgICAgICAgICAgICAgICAgYidbJSVdJykKKyAgICAgICAgY2hlY2tfZm9ybWF0KHUnJWFiYycsCisgICAgICAgICAgICAgICAgICAgICBiJyUlJXMnLCBiJ2FiYycpCisKKyAgICAgICAgIyB0ZXN0ICVTCisgICAgICAgIGNoZWNrX2Zvcm1hdCh1InJlcHI9YWJjIiwKKyAgICAgICAgICAgICAgICAgICAgIGIncmVwcj0lUycsIHUnYWJjJykKKworICAgICAgICAjIHRlc3QgJVIKKyAgICAgICAgY2hlY2tfZm9ybWF0KHUicmVwcj11J2FiYyciLAorICAgICAgICAgICAgICAgICAgICAgYidyZXByPSVSJywgdSdhYmMnKQorCisgICAgICAgICMgdGVzdCBpbnRlZ2VyIGZvcm1hdHMgKCVpLCAlZCwgJXUpCisgICAgICAgIGNoZWNrX2Zvcm1hdCh1JzAxMCcsCisgICAgICAgICAgICAgICAgICAgICBiJyUwM2knLCBjX2ludCgxMCkpCisgICAgICAgIGNoZWNrX2Zvcm1hdCh1JzAwMTAnLAorICAgICAgICAgICAgICAgICAgICAgYiclMC40aScsIGNfaW50KDEwKSkKKyAgICAgICAgY2hlY2tfZm9ybWF0KHUnLTEyMycsCisgICAgICAgICAgICAgICAgICAgICBiJyVpJywgY19pbnQoLTEyMykpCisKKyAgICAgICAgY2hlY2tfZm9ybWF0KHUnLTEyMycsCisgICAgICAgICAgICAgICAgICAgICBiJyVkJywgY19pbnQoLTEyMykpCisgICAgICAgIGNoZWNrX2Zvcm1hdCh1Jy0xMjMnLAorICAgICAgICAgICAgICAgICAgICAgYiclbGQnLCBjX2xvbmcoLTEyMykpCisgICAgICAgIGNoZWNrX2Zvcm1hdCh1Jy0xMjMnLAorICAgICAgICAgICAgICAgICAgICAgYiclemQnLCBjX3NzaXplX3QoLTEyMykpCisKKyAgICAgICAgY2hlY2tfZm9ybWF0KHUnMTIzJywKKyAgICAgICAgICAgICAgICAgICAgIGInJXUnLCBjX3VpbnQoMTIzKSkKKyAgICAgICAgY2hlY2tfZm9ybWF0KHUnMTIzJywKKyAgICAgICAgICAgICAgICAgICAgIGInJWx1JywgY191bG9uZygxMjMpKQorICAgICAgICBjaGVja19mb3JtYXQodScxMjMnLAorICAgICAgICAgICAgICAgICAgICAgYiclenUnLCBjX3NpemVfdCgxMjMpKQorCisgICAgICAgICMgdGVzdCBsb25nIG91dHB1dAorICAgICAgICBQeVVuaWNvZGVfRnJvbUZvcm1hdChiJyVwJywgY192b2lkX3AoLTEpKQorCisgICAgICAgICMgdGVzdCAlVgorICAgICAgICBjaGVja19mb3JtYXQodSdyZXByPWFiYycsCisgICAgICAgICAgICAgICAgICAgICBiJ3JlcHI9JVYnLCB1J2FiYycsIGIneHl6JykKKyAgICAgICAgY2hlY2tfZm9ybWF0KHUncmVwcj1ceGU0XHhiYVx4YmFceGU2XHhiMFx4OTEnLAorICAgICAgICAgICAgICAgICAgICAgYidyZXByPSVWJywgTm9uZSwgYidceGU0XHhiYVx4YmFceGU2XHhiMFx4OTEnKQorICAgICAgICBjaGVja19mb3JtYXQodSdyZXByPWFiY1x4ZmYnLAorICAgICAgICAgICAgICAgICAgICAgYidyZXByPSVWJywgTm9uZSwgYidhYmNceGZmJykKKworICAgICAgICAjIG5vdCBzdXBwb3J0ZWQ6IGNvcHkgdGhlIHJhdyBmb3JtYXQgc3RyaW5nLiB0aGVzZSB0ZXN0cyBhcmUganVzdCBoZXJlCisgICAgICAgICMgdG8gY2hlY2sgZm9yIGNyYXNocyBhbmQgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGFzIHNwZWNpZmljYXRpb25zCisgICAgICAgIGNoZWNrX2Zvcm1hdCh1JyVzJywKKyAgICAgICAgICAgICAgICAgICAgIGInJTElcycsIGInYWJjJykKKyAgICAgICAgY2hlY2tfZm9ybWF0KHUnJTFhYmMnLAorICAgICAgICAgICAgICAgICAgICAgYiclMWFiYycpCisgICAgICAgIGNoZWNrX2Zvcm1hdCh1JyUraScsCisgICAgICAgICAgICAgICAgICAgICBiJyUraScsIGNfaW50KDEwKSkKKyAgICAgICAgY2hlY2tfZm9ybWF0KHUnJXMnLAorICAgICAgICAgICAgICAgICAgICAgYiclLiVzJywgYidhYmMnKQorCisgICAgQHRlc3Rfc3VwcG9ydC5jcHl0aG9uX29ubHkKICAgICBkZWYgdGVzdF9lbmNvZGVfZGVjaW1hbChzZWxmKToKICAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IHVuaWNvZGVfZW5jb2RlZGVjaW1hbAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGVfZW5jb2RlZGVjaW1hbCh1JzEyMycpLApAQCAtMTYzMSw2ICsxNzk3LDE5IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZV9lbmNvZGVkZWNpbWFsKHUiMTIzXHUyMGFjXHUwNjYwIiwgInJlcGxhY2UiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBiJzEyMz8wJykKIAorICAgIEB0ZXN0X3N1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3RfZW5jb2RlX2RlY2ltYWxfd2l0aF9zdXJyb2dhdGVzKHNlbGYpOgorICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgdW5pY29kZV9lbmNvZGVkZWNpbWFsCisgICAgICAgIHRlc3RzID0gWyh1J1xVMDAwMWY0OWQnLCAnJiMxMjgxNTc7JyksCisgICAgICAgICAgICAgICAgICh1J1x1ZDgzZCcsICcmIzU1MzU3OycpLAorICAgICAgICAgICAgICAgICAodSdcdWRjOWQnLCAnJiM1NjQ3NzsnKSwKKyAgICAgICAgICAgICAgICBdCisgICAgICAgIGlmIHUnXHVkODNkXHVkYzlkJyAhPSB1J1xVMDAwMWY0OWQnOgorICAgICAgICAgICAgdGVzdHMgKz0gWyh1J1x1ZDgzZFx1ZGM5ZCcsICcmIzU1MzU3OyYjNTY0Nzc7JyldCisgICAgICAgIGZvciBzLCBleHAgaW4gdGVzdHM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgICAgICB1bmljb2RlX2VuY29kZWRlY2ltYWwodSIxMjMiICsgcywgInhtbGNoYXJyZWZyZXBsYWNlIiksCisgICAgICAgICAgICAgICAgICAgICcxMjMnICsgZXhwKQogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXJsbGliLnB5IGIvTGliL3Rlc3QvdGVzdF91cmxsaWIucHkKaW5kZXggZGI5MDgzOS4uMDAzMjg2NSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91cmxsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91cmxsaWIucHkKQEAgLTMsMTMgKzMsMTYgQEAKIGltcG9ydCB1cmxsaWIKIGltcG9ydCBodHRwbGliCiBpbXBvcnQgdW5pdHRlc3QKLWZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiBpbXBvcnQgb3MKIGltcG9ydCBzeXMKIGltcG9ydCBtaW1ldG9vbHMKIGltcG9ydCB0ZW1wZmlsZQogaW1wb3J0IFN0cmluZ0lPCiAKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIGJhc2U2NCBpbXBvcnQgYjY0ZW5jb2RlCisKKwogZGVmIGhleGVzY2FwZShjaGFyKToKICAgICAiIiJFc2NhcGUgY2hhciBhcyBSRkMgMjM5NiBzcGVjaWZpZXMiIiIKICAgICBoZXhfcmVwciA9IGhleChvcmQoY2hhcikpWzI6XS51cHBlcigpCkBAIC0yMiw4ICsyNSw5IEBACiAgICAgZGVmIGZha2VodHRwKHNlbGYsIGZha2VkYXRhKToKICAgICAgICAgY2xhc3MgRmFrZVNvY2tldChTdHJpbmdJTy5TdHJpbmdJTyk6CiAKLSAgICAgICAgICAgIGRlZiBzZW5kYWxsKHNlbGYsIHN0cik6Ci0gICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZGVmIHNlbmRhbGwoc2VsZiwgZGF0YSk6CisgICAgICAgICAgICAgICAgRmFrZUhUVFBDb25uZWN0aW9uLmJ1ZiA9IGRhdGEKKwogICAgICAgICAgICAgZGVmIG1ha2VmaWxlKHNlbGYsICphcmdzLCAqKmt3ZHMpOgogICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCiAKQEAgLTM4LDkgKzQyLDE1IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZ0lPLlN0cmluZ0lPLnJlYWRsaW5lKHNlbGYsIGxlbmd0aCkKIAogICAgICAgICBjbGFzcyBGYWtlSFRUUENvbm5lY3Rpb24oaHR0cGxpYi5IVFRQQ29ubmVjdGlvbik6CisKKyAgICAgICAgICAgICMgYnVmZmVyIHRvIHN0b3JlIGRhdGEgZm9yIHZlcmlmaWNhdGlvbiBpbiB1cmxvcGVuIHRlc3RzLgorICAgICAgICAgICAgYnVmID0gIiIKKwogICAgICAgICAgICAgZGVmIGNvbm5lY3Qoc2VsZik6CiAgICAgICAgICAgICAgICAgc2VsZi5zb2NrID0gRmFrZVNvY2tldChmYWtlZGF0YSkKKwogICAgICAgICBhc3NlcnQgaHR0cGxpYi5IVFRQLl9jb25uZWN0aW9uX2NsYXNzID09IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24KKwogICAgICAgICBodHRwbGliLkhUVFAuX2Nvbm5lY3Rpb25fY2xhc3MgPSBGYWtlSFRUUENvbm5lY3Rpb24KIAogICAgIGRlZiB1bmZha2VodHRwKHNlbGYpOgpAQCAtMTI0LDYgKzEzNCw5IEBACiAgICAgICAgIGZvciBsaW5lIGluIHNlbGYucmV0dXJuZWRfb2JqLl9faXRlcl9fKCk6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUsIHNlbGYudGV4dCkKIAorICAgIGRlZiB0ZXN0X3JlbGF0aXZlbG9jYWxmaWxlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLHVybGxpYi51cmxvcGVuLCcuLycgKyBzZWxmLnBhdGhuYW1lKQorCiBjbGFzcyBQcm94eVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiBzZXRVcChzZWxmKToKQEAgLTIwOSw2ICsyMjIsNjIgQEAKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIHNlbGYudW5mYWtlaHR0cCgpCiAKKyAgICBkZWYgdGVzdF9taXNzaW5nX2xvY2FsZmlsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgdXJsbGliLnVybG9wZW4sCisgICAgICAgICAgICAgICAgJ2ZpbGU6Ly9sb2NhbGhvc3QvYS9taXNzaW5nL2ZpbGUucHknKQorICAgICAgICBmZCwgdG1wX2ZpbGUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgdG1wX2ZpbGV1cmwgPSAnZmlsZTovL2xvY2FsaG9zdC8nICsgdG1wX2ZpbGUucmVwbGFjZShvcy5wYXRoLnNlcCwgJy8nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHModG1wX2ZpbGUpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcCA9IHVybGxpYi51cmxvcGVuKHRtcF9maWxldXJsKQorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuY2xvc2UoZmQpCisgICAgICAgICAgICBvcy51bmxpbmsodG1wX2ZpbGUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcy5wYXRoLmV4aXN0cyh0bXBfZmlsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIHVybGxpYi51cmxvcGVuLCB0bXBfZmlsZXVybCkKKworICAgIGRlZiB0ZXN0X2Z0cF9ub25leGlzdGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgdXJsbGliLnVybG9wZW4sCisgICAgICAgICAgICAgICAgJ2Z0cDovL2xvY2FsaG9zdC9ub3QvZXhpc3RpbmcvZmlsZS5weScpCisKKworICAgIGRlZiB0ZXN0X3VzZXJwYXNzX2ludXJsKHNlbGYpOgorICAgICAgICBzZWxmLmZha2VodHRwKCdIZWxsbyEnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmYWtlaHR0cF93cmFwcGVyID0gaHR0cGxpYi5IVFRQLl9jb25uZWN0aW9uX2NsYXNzCisgICAgICAgICAgICBmcCA9IHVybGxpYi51cmxvcGVuKCJodHRwOi8vdXNlcjpwYXNzQHB5dGhvbi5vcmcvIikKKyAgICAgICAgICAgIGF1dGhvcml6YXRpb24gPSAoIkF1dGhvcml6YXRpb246IEJhc2ljICVzXHJcbiIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI2NGVuY29kZSgndXNlcjpwYXNzJykpCisgICAgICAgICAgICAjIFRoZSBhdXRob3JpemF0aW9uIGhlYWRlciBtdXN0IGJlIGluIHBsYWNlCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGF1dGhvcml6YXRpb24sIGZha2VodHRwX3dyYXBwZXIuYnVmKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcC5yZWFkbGluZSgpLCAiSGVsbG8hIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnAucmVhZGxpbmUoKSwgIiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZwLmdldHVybCgpLCAnaHR0cDovL3VzZXI6cGFzc0BweXRob24ub3JnLycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZwLmdldGNvZGUoKSwgMjAwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi51bmZha2VodHRwKCkKKworICAgIGRlZiB0ZXN0X3VzZXJwYXNzX3dpdGhfc3BhY2VzX2ludXJsKHNlbGYpOgorICAgICAgICBzZWxmLmZha2VodHRwKCdIZWxsbyEnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB1cmwgPSAiaHR0cDovL2EgYjpjIGRAcHl0aG9uLm9yZy8iCisgICAgICAgICAgICBmYWtlaHR0cF93cmFwcGVyID0gaHR0cGxpYi5IVFRQLl9jb25uZWN0aW9uX2NsYXNzCisgICAgICAgICAgICBhdXRob3JpemF0aW9uID0gKCJBdXRob3JpemF0aW9uOiBCYXNpYyAlc1xyXG4iICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYjY0ZW5jb2RlKCdhIGI6YyBkJykpCisgICAgICAgICAgICBmcCA9IHVybGxpYi51cmxvcGVuKHVybCkKKyAgICAgICAgICAgICMgVGhlIGF1dGhvcml6YXRpb24gaGVhZGVyIG11c3QgYmUgaW4gcGxhY2UKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYXV0aG9yaXphdGlvbiwgZmFrZWh0dHBfd3JhcHBlci5idWYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZwLnJlYWRsaW5lKCksICJIZWxsbyEiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcC5yZWFkbGluZSgpLCAiIikKKyAgICAgICAgICAgICMgdGhlIHNwYWNlcyBhcmUgcXVvdGVkIGluIFVSTCBzbyBubyBtYXRjaAorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChmcC5nZXR1cmwoKSwgdXJsKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcC5nZXRjb2RlKCksIDIwMCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYudW5mYWtlaHR0cCgpCisKKwogY2xhc3MgdXJscmV0cmlldmVfRmlsZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAiIiJUZXN0IHVybGxpYi51cmxyZXRyaWV2ZSgpIG9uIGxvY2FsIGZpbGVzIiIiCiAKQEAgLTcxNiw2ICs3ODUsMjkgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoJ3VzZXInLCAnYVxmYicpLHVybGxpYi5zcGxpdHBhc3N3ZCgndXNlcjphXGZiJykpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKCd1c2VyJywgJ2FcdmInKSx1cmxsaWIuc3BsaXRwYXNzd2QoJ3VzZXI6YVx2YicpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgndXNlcicsICdhOmInKSx1cmxsaWIuc3BsaXRwYXNzd2QoJ3VzZXI6YTpiJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKCd1c2VyJywgJ2EgYicpLHVybGxpYi5zcGxpdHBhc3N3ZCgndXNlcjphIGInKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoJ3VzZXIgMicsICdhYicpLHVybGxpYi5zcGxpdHBhc3N3ZCgndXNlciAyOmFiJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKCd1c2VyKzEnLCAnYStiJyksdXJsbGliLnNwbGl0cGFzc3dkKCd1c2VyKzE6YStiJykpCisKKyAgICBkZWYgdGVzdF9zcGxpdHBvcnQoc2VsZik6CisgICAgICAgIHNwbGl0cG9ydCA9IHVybGxpYi5zcGxpdHBvcnQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdHBvcnQoJ3BhcnJvdDo4OCcpLCAoJ3BhcnJvdCcsICc4OCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0cG9ydCgncGFycm90JyksICgncGFycm90JywgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRwb3J0KCdwYXJyb3Q6JyksICgncGFycm90JywgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRwb3J0KCcxMjcuMC4wLjEnKSwgKCcxMjcuMC4wLjEnLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdHBvcnQoJ3BhcnJvdDpjaGVlc2UnKSwgKCdwYXJyb3Q6Y2hlZXNlJywgTm9uZSkpCisKKyAgICBkZWYgdGVzdF9zcGxpdG5wb3J0KHNlbGYpOgorICAgICAgICBzcGxpdG5wb3J0ID0gdXJsbGliLnNwbGl0bnBvcnQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdG5wb3J0KCdwYXJyb3Q6ODgnKSwgKCdwYXJyb3QnLCA4OCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRucG9ydCgncGFycm90JyksICgncGFycm90JywgLTEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0bnBvcnQoJ3BhcnJvdCcsIDU1KSwgKCdwYXJyb3QnLCA1NSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRucG9ydCgncGFycm90OicpLCAoJ3BhcnJvdCcsIC0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdG5wb3J0KCdwYXJyb3Q6JywgNTUpLCAoJ3BhcnJvdCcsIDU1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdG5wb3J0KCcxMjcuMC4wLjEnKSwgKCcxMjcuMC4wLjEnLCAtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRucG9ydCgnMTI3LjAuMC4xJywgNTUpLCAoJzEyNy4wLjAuMScsIDU1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdG5wb3J0KCdwYXJyb3Q6Y2hlZXNlJyksICgncGFycm90JywgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRucG9ydCgncGFycm90OmNoZWVzZScsIDU1KSwgKCdwYXJyb3QnLCBOb25lKSkKIAogCiBjbGFzcyBVUkxvcGVuZXJfVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtNzQwLDcgKzgzMiw3IEBACiAjIEV2ZXJ5d2hlcmUgZWxzZSB0aGV5IHdvcmsgb2ssIGJ1dCBvbiB0aG9zZSBtYWNoaW5lcywgc29tZXRpbWVzCiAjIGZhaWwgaW4gb25lIG9mIHRoZSB0ZXN0cywgc29tZXRpbWVzIGluIG90aGVyLiBJIGhhdmUgYSBsaW51eCwgYW5kCiAjIHRoZSB0ZXN0cyBnbyBvay4KLSMgSWYgYW55Ym9keSBoYXMgb25lIG9mIHRoZSBwcm9ibGVtYXRpYyBlbnZpcm9tZW50cywgcGxlYXNlIGhlbHAhCisjIElmIGFueWJvZHkgaGFzIG9uZSBvZiB0aGUgcHJvYmxlbWF0aWMgZW52aXJvbm1lbnRzLCBwbGVhc2UgaGVscCEKICMgLiAgIEZhY3VuZG8KICMKICMgZGVmIHNlcnZlcihldnQpOgpAQCAtNzg2LDcgKzg3OCw3IEBACiAjICAgICBkZWYgdGVzdFRpbWVvdXROb25lKHNlbGYpOgogIyAgICAgICAgICMgZ2xvYmFsIGRlZmF1bHQgdGltZW91dCBpcyBpZ25vcmVkCiAjICAgICAgICAgaW1wb3J0IHNvY2tldAotIyAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorIyAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpKQogIyAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCgzMCkKICMgICAgICAgICB0cnk6CiAjICAgICAgICAgICAgIGZ0cCA9IHVybGxpYi5mdHB3cmFwcGVyKCJteXVzZXIiLCAibXlwYXNzIiwgImxvY2FsaG9zdCIsIDkwOTMsIFtdKQpAQCAtNzk4LDcgKzg5MCw3IEBACiAjICAgICBkZWYgdGVzdFRpbWVvdXREZWZhdWx0KHNlbGYpOgogIyAgICAgICAgICMgZ2xvYmFsIGRlZmF1bHQgdGltZW91dCBpcyB1c2VkCiAjICAgICAgICAgaW1wb3J0IHNvY2tldAotIyAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorIyAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpKQogIyAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCgzMCkKICMgICAgICAgICB0cnk6CiAjICAgICAgICAgICAgIGZ0cCA9IHVybGxpYi5mdHB3cmFwcGVyKCJteXVzZXIiLCAibXlwYXNzIiwgImxvY2FsaG9zdCIsIDkwOTMsIFtdKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91cmxsaWIyLnB5IGIvTGliL3Rlc3QvdGVzdF91cmxsaWIyLnB5CmluZGV4IDdmMjMwZTIuLjM5YTAxMzIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXJsbGliMi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VybGxpYjIucHkKQEAgLTU5MSw4ICs1OTEsOCBAQAogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShhcmdzWzBdLCBSZXF1ZXN0KQogICAgICAgICAgICAgICAgICMgcmVzcG9uc2UgZnJvbSBvcGVuZXIub3BlbiBpcyBOb25lLCBiZWNhdXNlIHRoZXJlJ3Mgbm8KICAgICAgICAgICAgICAgICAjIGhhbmRsZXIgdGhhdCBkZWZpbmVzIGh0dHBfb3BlbiB0byBoYW5kbGUgaXQKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYXJnc1sxXSBpcyBOb25lIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UoYXJnc1sxXSwgTW9ja1Jlc3BvbnNlKSkKKyAgICAgICAgICAgICAgICBpZiBhcmdzWzFdIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoYXJnc1sxXSwgTW9ja1Jlc3BvbnNlKQogCiAKIGRlZiBzYW5lcGF0aG5hbWUydXJsKHBhdGgpOgpAQCAtOTI0LDcgKzkyNCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2NrSGVhZGVycyh7ImxvY2F0aW9uIjogdG9fdXJsfSkpCiAgICAgICAgICAgICAgICAgZXhjZXB0IHVybGxpYjIuSFRUUEVycm9yOgogICAgICAgICAgICAgICAgICAgICAjIDMwNyBpbiByZXNwb25zZSB0byBQT1NUIHJlcXVpcmVzIHVzZXIgT0sKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvZGUgPT0gMzA3IGFuZCBkYXRhIGlzIG5vdCBOb25lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvZGUsIDMwNykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUoZGF0YSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8ucmVxLmdldF9mdWxsX3VybCgpLCB0b191cmwpCiAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8ucmVxLmdldF9tZXRob2QoKSwgIkdFVCIpCkBAIC0xMTA2LDEyICsxMTA3LDMwIEBACiAgICAgICAgIHNlbGYuX3Rlc3RfYmFzaWNfYXV0aChvcGVuZXIsIGF1dGhfaGFuZGxlciwgIkF1dGhvcml6YXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbG0sIGh0dHBfaGFuZGxlciwgcGFzc3dvcmRfbWFuYWdlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vYWNtZS5leGFtcGxlLmNvbS9wcm90ZWN0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9hY21lLmV4YW1wbGUuY29tL3Byb3RlY3RlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2FjbWUuZXhhbXBsZS5jb20vcHJvdGVjdGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAKICAgICBkZWYgdGVzdF9iYXNpY19hdXRoX3dpdGhfc2luZ2xlX3F1b3RlZF9yZWFsbShzZWxmKToKICAgICAgICAgc2VsZi50ZXN0X2Jhc2ljX2F1dGgocXVvdGVfY2hhcj0iJyIpCiAKKyAgICBkZWYgdGVzdF9iYXNpY19hdXRoX3dpdGhfdW5xdW90ZWRfcmVhbG0oc2VsZik6CisgICAgICAgIG9wZW5lciA9IE9wZW5lckRpcmVjdG9yKCkKKyAgICAgICAgcGFzc3dvcmRfbWFuYWdlciA9IE1vY2tQYXNzd29yZE1hbmFnZXIoKQorICAgICAgICBhdXRoX2hhbmRsZXIgPSB1cmxsaWIyLkhUVFBCYXNpY0F1dGhIYW5kbGVyKHBhc3N3b3JkX21hbmFnZXIpCisgICAgICAgIHJlYWxtID0gIkFDTUUgV2lkZ2V0IFN0b3JlIgorICAgICAgICBodHRwX2hhbmRsZXIgPSBNb2NrSFRUUEhhbmRsZXIoCisgICAgICAgICAgICA0MDEsICdXV1ctQXV0aGVudGljYXRlOiBCYXNpYyByZWFsbT0lc1xyXG5cclxuJyAlIHJlYWxtKQorICAgICAgICBvcGVuZXIuYWRkX2hhbmRsZXIoYXV0aF9oYW5kbGVyKQorICAgICAgICBvcGVuZXIuYWRkX2hhbmRsZXIoaHR0cF9oYW5kbGVyKQorICAgICAgICBtc2cgPSAiQmFzaWMgQXV0aCBSZWFsbSB3YXMgdW5xdW90ZWQiCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKChtc2csIFVzZXJXYXJuaW5nKSk6CisgICAgICAgICAgICBzZWxmLl90ZXN0X2Jhc2ljX2F1dGgob3BlbmVyLCBhdXRoX2hhbmRsZXIsICJBdXRob3JpemF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsbSwgaHR0cF9oYW5kbGVyLCBwYXNzd29yZF9tYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vYWNtZS5leGFtcGxlLmNvbS9wcm90ZWN0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vYWNtZS5leGFtcGxlLmNvbS9wcm90ZWN0ZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisKKwogICAgIGRlZiB0ZXN0X3Byb3h5X2Jhc2ljX2F1dGgoc2VsZik6CiAgICAgICAgIG9wZW5lciA9IE9wZW5lckRpcmVjdG9yKCkKICAgICAgICAgcGggPSB1cmxsaWIyLlByb3h5SGFuZGxlcihkaWN0KGh0dHA9InByb3h5LmV4YW1wbGUuY29tOjMxMjgiKSkKQEAgLTExMzAsNyArMTE0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAKICAgICBkZWYgdGVzdF9iYXNpY19hbmRfZGlnZXN0X2F1dGhfaGFuZGxlcnMoc2VsZik6Ci0gICAgICAgICMgSFRUUERpZ2VzdEF1dGhIYW5kbGVyIHRocmV3IGFuIGV4Y2VwdGlvbiBpZiBpdCBjb3VsZG4ndCBoYW5kbGUgYSA0MCoKKyAgICAgICAgIyBIVFRQRGlnZXN0QXV0aEhhbmRsZXIgcmFpc2VkIGFuIGV4Y2VwdGlvbiBpZiBpdCBjb3VsZG4ndCBoYW5kbGUgYSA0MCoKICAgICAgICAgIyByZXNwb25zZSAoaHR0cDovL3B5dGhvbi5vcmcvc2YvMTQ3OTMwMiksIHdoZXJlIGl0IHNob3VsZCBpbnN0ZWFkCiAgICAgICAgICMgcmV0dXJuIE5vbmUgdG8gYWxsb3cgYW5vdGhlciBoYW5kbGVyIChlc3BlY2lhbGx5CiAgICAgICAgICMgSFRUUEJhc2ljQXV0aEhhbmRsZXIpIHRvIGhhbmRsZSB0aGUgcmVzcG9uc2UuCkBAIC0xMzE4LDE2ICsxMzM3LDMyIEBACiAgICAgICAgIHJlcSA9IFJlcXVlc3QodXJsKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5nZXRfZnVsbF91cmwoKSwgdXJsKQogCi1kZWYgdGVzdF9IVFRQRXJyb3JfaW50ZXJmYWNlKCk6Ci0gICAgIiIiCi0gICAgSXNzdWUgMTMyMTEgcmV2ZWFscyB0aGF0IEhUVFBFcnJvciBkaWRuJ3QgaW1wbGVtZW50IHRoZSBVUkxFcnJvcgotICAgIGludGVyZmFjZSBldmVuIHRob3VnaCBIVFRQRXJyb3IgaXMgYSBzdWJjbGFzcyBvZiBVUkxFcnJvci4KKyAgICBkZWYgdGVzdF9IVFRQRXJyb3JfaW50ZXJmYWNlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgSXNzdWUgMTMyMTEgcmV2ZWFscyB0aGF0IEhUVFBFcnJvciBkaWRuJ3QgaW1wbGVtZW50IHRoZSBVUkxFcnJvcgorICAgICAgICBpbnRlcmZhY2UgZXZlbiB0aG91Z2ggSFRUUEVycm9yIGlzIGEgc3ViY2xhc3Mgb2YgVVJMRXJyb3IuCiAKLSAgICA+Pj4gZXJyID0gdXJsbGliMi5IVFRQRXJyb3IobXNnPSdzb21ldGhpbmcgYmFkIGhhcHBlbmVkJywgdXJsPU5vbmUsIGNvZGU9Tm9uZSwgaGRycz1Ob25lLCBmcD1Ob25lKQotICAgID4+PiBhc3NlcnQgaGFzYXR0cihlcnIsICdyZWFzb24nKQotICAgID4+PiBlcnIucmVhc29uCi0gICAgJ3NvbWV0aGluZyBiYWQgaGFwcGVuZWQnCi0gICAgIiIiCisgICAgICAgID4+PiBlcnIgPSB1cmxsaWIyLkhUVFBFcnJvcihtc2c9J3NvbWV0aGluZyBiYWQgaGFwcGVuZWQnLCB1cmw9Tm9uZSwgY29kZT1Ob25lLCBoZHJzPU5vbmUsIGZwPU5vbmUpCisgICAgICAgID4+PiBhc3NlcnQgaGFzYXR0cihlcnIsICdyZWFzb24nKQorICAgICAgICA+Pj4gZXJyLnJlYXNvbgorICAgICAgICAnc29tZXRoaW5nIGJhZCBoYXBwZW5lZCcKKyAgICAgICAgIiIiCisKKyAgICBkZWYgdGVzdF9IVFRQRXJyb3JfaW50ZXJmYWNlX2NhbGwoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBJc3N1ZSAxNTcwMT0gLSBIVFRQRXJyb3IgaW50ZXJmYWNlIGhhcyBpbmZvIG1ldGhvZCBhdmFpbGFibGUgZnJvbSBVUkxFcnJvci4KKyAgICAgICAgIiIiCisgICAgICAgIGVyciA9IHVybGxpYjIuSFRUUEVycm9yKG1zZz0nc29tZXRoaW5nIGJhZCBoYXBwZW5lZCcsIHVybD1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlPU5vbmUsIGhkcnM9J0NvbnRlbnQtTGVuZ3RoOjQyJywgZnA9Tm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoZXJyLCAncmVhc29uJykpCisgICAgICAgIGFzc2VydCBoYXNhdHRyKGVyciwgJ3JlYXNvbicpCisgICAgICAgIGFzc2VydCBoYXNhdHRyKGVyciwgJ2luZm8nKQorICAgICAgICBhc3NlcnQgY2FsbGFibGUoZXJyLmluZm8pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGVyci5pbmZvKCkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJlcnIuaW5mbygpIGZhaWxlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLmluZm8oKSwgIkNvbnRlbnQtTGVuZ3RoOjQyIikKIAogZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgogICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF91cmxsaWIyCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VybGxpYjJfbG9jYWxuZXQucHkgYi9MaWIvdGVzdC90ZXN0X3VybGxpYjJfbG9jYWxuZXQucHkKaW5kZXggMGZkYTc3MC4uMmU4N2YxMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91cmxsaWIyX2xvY2FsbmV0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXJsbGliMl9sb2NhbG5ldC5weQpAQCAtMSwxMSArMSwxMSBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0KIGltcG9ydCB1cmxwYXJzZQogaW1wb3J0IHVybGxpYjIKIGltcG9ydCBCYXNlSFRUUFNlcnZlcgogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgaGFzaGxpYgorCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCiBtaW1ldG9vbHMgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnbWltZXRvb2xzJywgZGVwcmVjYXRlZD1UcnVlKQogdGhyZWFkaW5nID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ3RocmVhZGluZycpCiAKQEAgLTM0Niw2ICszNDYsMTIgQEAKICAgICBmb3IgdHJhbnNwYXJlbnQgcmVkaXJlY3Rpb24gaGF2ZSBiZWVuIHdyaXR0ZW4uCiAgICAgIiIiCiAKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHByb3h5X2hhbmRsZXIgPSB1cmxsaWIyLlByb3h5SGFuZGxlcih7fSkKKyAgICAgICAgb3BlbmVyID0gdXJsbGliMi5idWlsZF9vcGVuZXIocHJveHlfaGFuZGxlcikKKyAgICAgICAgdXJsbGliMi5pbnN0YWxsX29wZW5lcihvcGVuZXIpCisgICAgICAgIHN1cGVyKFRlc3RVcmxvcGVuLCBzZWxmKS5zZXRVcCgpCisKICAgICBkZWYgc3RhcnRfc2VydmVyKHNlbGYsIHJlc3BvbnNlcyk6CiAgICAgICAgIGhhbmRsZXIgPSBHZXRSZXF1ZXN0SGFuZGxlcihyZXNwb25zZXMpCiAKQEAgLTQ4MSw2ICs0ODcsMTEgQEAKICAgICBkZWYgdGVzdF9iYWRfYWRkcmVzcyhzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgcHJvcGVyIGV4Y2VwdGlvbiBpcyByYWlzZWQgd2hlbiBjb25uZWN0aW5nIHRvIGEgYm9ndXMKICAgICAgICAgIyBhZGRyZXNzLgorCisgICAgICAgICMgYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb21tZW50IGJlbG93LCB0aGlzIG1pZ2h0IGZhaWwgd2l0aCBzb21lIElTUCwKKyAgICAgICAgIyBzbyB3ZSBydW4gdGhlIHRlc3Qgb25seSB3aGVuIC11bmV0d29yay8tdWFsbCBpcyBzcGVjaWZpZWQgdG8KKyAgICAgICAgIyBtaXRpZ2F0ZSB0aGUgcHJvYmxlbSBhIGJpdCAoc2VlICMxNzU2NCkKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJlcXVpcmVzKCduZXR3b3JrJykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBHaXZlbiB0aGF0IGJvdGggVmVyaVNpZ24gYW5kIHZhcmlvdXMgSVNQcyBoYXZlIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIHBhc3Qgb3IgYXJlIHByZXNlbnRseSBoaWphY2tpbmcgdmFyaW91cyBpbnZhbGlkCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VybGxpYjJuZXQucHkgYi9MaWIvdGVzdC90ZXN0X3VybGxpYjJuZXQucHkKaW5kZXggYmQyYzQ2Ny4uOTFhMDc0MyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91cmxsaWIybmV0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXJsbGliMm5ldC5weQpAQCAtMSw1ICsxLDMgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiBmcm9tIHRlc3QudGVzdF91cmxsaWIyIGltcG9ydCBzYW5lcGF0aG5hbWUydXJsCkBAIC04MCwxMyArNzgsMTMgQEAKICAgICAgICAgIyB1bmRlcmx5aW5nIHNvY2tldAogCiAgICAgICAgICMgZGVsdmUgZGVlcCBpbnRvIHJlc3BvbnNlIHRvIGZldGNoIHNvY2tldC5fc29ja2V0b2JqZWN0Ci0gICAgICAgIHJlc3BvbnNlID0gX3VybG9wZW5fd2l0aF9yZXRyeSgiaHR0cDovL3d3dy5weXRob24ub3JnLyIpCisgICAgICAgIHJlc3BvbnNlID0gX3VybG9wZW5fd2l0aF9yZXRyeSgiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iKQogICAgICAgICBhYnVzZWRfZmlsZW9iamVjdCA9IHJlc3BvbnNlLmZwCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhYnVzZWRfZmlsZW9iamVjdC5fX2NsYXNzX18gaXMgc29ja2V0Ll9maWxlb2JqZWN0KQorICAgICAgICBzZWxmLmFzc2VydElzKGFidXNlZF9maWxlb2JqZWN0Ll9fY2xhc3NfXywgc29ja2V0Ll9maWxlb2JqZWN0KQogICAgICAgICBodHRwcmVzcG9uc2UgPSBhYnVzZWRfZmlsZW9iamVjdC5fc29jawotICAgICAgICBzZWxmLmFzc2VydFRydWUoaHR0cHJlc3BvbnNlLl9fY2xhc3NfXyBpcyBodHRwbGliLkhUVFBSZXNwb25zZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhodHRwcmVzcG9uc2UuX19jbGFzc19fLCBodHRwbGliLkhUVFBSZXNwb25zZSkKICAgICAgICAgZmlsZW9iamVjdCA9IGh0dHByZXNwb25zZS5mcAotICAgICAgICBzZWxmLmFzc2VydFRydWUoZmlsZW9iamVjdC5fX2NsYXNzX18gaXMgc29ja2V0Ll9maWxlb2JqZWN0KQorICAgICAgICBzZWxmLmFzc2VydElzKGZpbGVvYmplY3QuX19jbGFzc19fLCBzb2NrZXQuX2ZpbGVvYmplY3QpCiAKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBmaWxlb2JqZWN0LmNsb3NlZCkKICAgICAgICAgcmVzcG9uc2UuY2xvc2UoKQpAQCAtMTI2LDYgKzEyNCw4IEBACiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBvcy5yZW1vdmUoVEVTVEZOKQogCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHVybGxpYjIudXJsb3BlbiwnLi9yZWxhdGl2ZV9wYXRoL3RvL2ZpbGUnKQorCiAgICAgIyBYWFggRm9sbG93aW5nIHRlc3QgZGVwZW5kcyBvbiBtYWNoaW5lIGNvbmZpZ3VyYXRpb25zIHRoYXQgYXJlIGludGVybmFsCiAgICAgIyB0byBDTlJJLiAgTmVlZCB0byBzZXQgdXAgYSBwdWJsaWMgc2VydmVyIHdpdGggdGhlIHJpZ2h0IGF1dGhlbnRpY2F0aW9uCiAgICAgIyBjb25maWd1cmF0aW9uIGZvciB0ZXN0IHB1cnBvc2VzLgpAQCAtMTU1LDE1ICsxNTUsMTUgQEAKICMjICAgICAgICAgICAgIHNlbGYuX3Rlc3RfdXJscyh1cmxzLCBzZWxmLl9leHRyYV9oYW5kbGVycygpK1tiYXV0aCwgZGF1dGhdKQogCiAgICAgZGVmIHRlc3RfdXJsd2l0aGZyYWcoc2VsZik6Ci0gICAgICAgIHVybHdpdGhfZnJhZyA9ICJodHRwOi8vZG9jcy5weXRob24ub3JnL2dsb3NzYXJ5Lmh0bWwjZ2xvc3NhcnkiCisgICAgICAgIHVybHdpdGhfZnJhZyA9ICJodHRwczovL2RvY3MucHl0aG9uLm9yZy8yL2dsb3NzYXJ5Lmh0bWwjZ2xvc3NhcnkiCiAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldCh1cmx3aXRoX2ZyYWcpOgogICAgICAgICAgICAgcmVxID0gdXJsbGliMi5SZXF1ZXN0KHVybHdpdGhfZnJhZykKICAgICAgICAgICAgIHJlcyA9IHVybGxpYjIudXJsb3BlbihyZXEpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5nZXR1cmwoKSwKLSAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvZ2xvc3NhcnkuaHRtbCNnbG9zc2FyeSIpCisgICAgICAgICAgICAgICAgICAgICJodHRwczovL2RvY3MucHl0aG9uLm9yZy8yL2dsb3NzYXJ5Lmh0bWwjZ2xvc3NhcnkiKQogCiAgICAgZGVmIHRlc3RfZmlsZW5vKHNlbGYpOgotICAgICAgICByZXEgPSB1cmxsaWIyLlJlcXVlc3QoImh0dHA6Ly93d3cucHl0aG9uLm9yZyIpCisgICAgICAgIHJlcSA9IHVybGxpYjIuUmVxdWVzdCgiaHR0cDovL3d3dy5leGFtcGxlLmNvbSIpCiAgICAgICAgIG9wZW5lciA9IHVybGxpYjIuYnVpbGRfb3BlbmVyKCkKICAgICAgICAgcmVzID0gb3BlbmVyLm9wZW4ocmVxKQogICAgICAgICB0cnk6CkBAIC0yNTAsMTUgKzI1MCwxNSBAQAogCiBjbGFzcyBUaW1lb3V0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfaHR0cF9iYXNpYyhzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCi0gICAgICAgIHVybCA9ICJodHRwOi8vd3d3LnB5dGhvbi5vcmciCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpKQorICAgICAgICB1cmwgPSAiaHR0cDovL3d3dy5leGFtcGxlLmNvbSIKICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KHVybCwgdGltZW91dD1Ob25lKToKICAgICAgICAgICAgIHUgPSBfdXJsb3Blbl93aXRoX3JldHJ5KHVybCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1LmZwLl9zb2NrLmZwLl9zb2NrLmdldHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUodS5mcC5fc29jay5mcC5fc29jay5nZXR0aW1lb3V0KCkpCiAKICAgICBkZWYgdGVzdF9odHRwX2RlZmF1bHRfdGltZW91dChzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCi0gICAgICAgIHVybCA9ICJodHRwOi8vd3d3LnB5dGhvbi5vcmciCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpKQorICAgICAgICB1cmwgPSAiaHR0cDovL3d3dy5leGFtcGxlLmNvbSIKICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KHVybCk6CiAgICAgICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoNjApCiAgICAgICAgICAgICB0cnk6CkBAIC0yNjgsMTggKzI2OCwxOCBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LmZwLl9zb2NrLmZwLl9zb2NrLmdldHRpbWVvdXQoKSwgNjApCiAKICAgICBkZWYgdGVzdF9odHRwX25vX3RpbWVvdXQoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQotICAgICAgICB1cmwgPSAiaHR0cDovL3d3dy5weXRob24ub3JnIgorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSkKKyAgICAgICAgdXJsID0gImh0dHA6Ly93d3cuZXhhbXBsZS5jb20iCiAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldCh1cmwpOgogICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDYwKQogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHUgPSBfdXJsb3Blbl93aXRoX3JldHJ5KHVybCwgdGltZW91dD1Ob25lKQogICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoTm9uZSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1LmZwLl9zb2NrLmZwLl9zb2NrLmdldHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUodS5mcC5fc29jay5mcC5fc29jay5nZXR0aW1lb3V0KCkpCiAKICAgICBkZWYgdGVzdF9odHRwX3RpbWVvdXQoc2VsZik6Ci0gICAgICAgIHVybCA9ICJodHRwOi8vd3d3LnB5dGhvbi5vcmciCisgICAgICAgIHVybCA9ICJodHRwOi8vd3d3LmV4YW1wbGUuY29tIgogICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQodXJsKToKICAgICAgICAgICAgIHUgPSBfdXJsb3Blbl93aXRoX3JldHJ5KHVybCwgdGltZW91dD0xMjApCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUuZnAuX3NvY2suZnAuX3NvY2suZ2V0dGltZW91dCgpLCAxMjApCkBAIC0yODcsMTMgKzI4NywxMyBAQAogICAgIEZUUF9IT1NUID0gImZ0cDovL2Z0cC5taXJyb3IubmwvcHViL2dudS8iCiAKICAgICBkZWYgdGVzdF9mdHBfYmFzaWMoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSkKICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KHNlbGYuRlRQX0hPU1QsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgICAgICB1ID0gX3VybG9wZW5fd2l0aF9yZXRyeShzZWxmLkZUUF9IT1NUKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUuZnAuZnAuX3NvY2suZ2V0dGltZW91dCgpIGlzIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZSh1LmZwLmZwLl9zb2NrLmdldHRpbWVvdXQoKSkKIAogICAgIGRlZiB0ZXN0X2Z0cF9kZWZhdWx0X3RpbWVvdXQoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSkKICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KHNlbGYuRlRQX0hPU1QpOgogICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDYwKQogICAgICAgICAgICAgdHJ5OgpAQCAtMzAzLDE0ICszMDMsMTQgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5mcC5mcC5fc29jay5nZXR0aW1lb3V0KCksIDYwKQogCiAgICAgZGVmIHRlc3RfZnRwX25vX3RpbWVvdXQoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSwpCiAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChzZWxmLkZUUF9IT1NUKToKICAgICAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCg2MCkKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICB1ID0gX3VybG9wZW5fd2l0aF9yZXRyeShzZWxmLkZUUF9IT1NULCB0aW1lb3V0PU5vbmUpCiAgICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChOb25lKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUuZnAuZnAuX3NvY2suZ2V0dGltZW91dCgpIGlzIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZSh1LmZwLmZwLl9zb2NrLmdldHRpbWVvdXQoKSkKIAogICAgIGRlZiB0ZXN0X2Z0cF90aW1lb3V0KHNlbGYpOgogICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoc2VsZi5GVFBfSE9TVCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VybGxpYm5ldC5weSBiL0xpYi90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5CmluZGV4IDFkODgzMzEuLjlmMjRiN2EgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5CkBAIC0xLDUgKzEsMyBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0KIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIApAQCAtMzYsNyArMzQsNyBAQAogICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoTm9uZSkKIAogICAgIGRlZiB0ZXN0VVJMcmVhZChzZWxmKToKLSAgICAgICAgZiA9IF9vcGVuX3dpdGhfcmV0cnkodXJsbGliLnVybG9wZW4sICJodHRwOi8vd3d3LnB5dGhvbi5vcmcvIikKKyAgICAgICAgZiA9IF9vcGVuX3dpdGhfcmV0cnkodXJsbGliLnVybG9wZW4sICJodHRwOi8vd3d3LmV4YW1wbGUuY29tLyIpCiAgICAgICAgIHggPSBmLnJlYWQoKQogCiBjbGFzcyB1cmxvcGVuTmV0d29ya1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTQ4LDcgKzQ2LDcgQEAKICAgICBmb3IgdHJhbnNwYXJlbnQgcmVkaXJlY3Rpb24gaGF2ZSBiZWVuIHdyaXR0ZW4uCiAKICAgICBzZXRVcCBpcyBub3QgdXNlZCBmb3IgYWx3YXlzIGNvbnN0cnVjdGluZyBhIGNvbm5lY3Rpb24gdG8KLSAgICBodHRwOi8vd3d3LnB5dGhvbi5vcmcvIHNpbmNlIHRoZXJlIGEgZmV3IHRlc3RzIHRoYXQgZG9uJ3QgdXNlIHRoYXQgYWRkcmVzcworICAgIGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vIHNpbmNlIHRoZXJlIGEgZmV3IHRlc3RzIHRoYXQgZG9uJ3QgdXNlIHRoYXQgYWRkcmVzcwogICAgIGFuZCBtYWtpbmcgYSBjb25uZWN0aW9uIGlzIGV4cGVuc2l2ZSBlbm91Z2ggdG8gd2FycmFudCBtaW5pbWl6aW5nIHVubmVlZGVkCiAgICAgY29ubmVjdGlvbnMuCiAKQEAgLTU5LDcgKzU3LDcgQEAKIAogICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgogICAgICAgICAjIFNpbXBsZSB0ZXN0IGV4cGVjdGVkIHRvIHBhc3MuCi0gICAgICAgIG9wZW5fdXJsID0gc2VsZi51cmxvcGVuKCJodHRwOi8vd3d3LnB5dGhvbi5vcmcvIikKKyAgICAgICAgb3Blbl91cmwgPSBzZWxmLnVybG9wZW4oImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vIikKICAgICAgICAgZm9yIGF0dHIgaW4gKCJyZWFkIiwgInJlYWRsaW5lIiwgInJlYWRsaW5lcyIsICJmaWxlbm8iLCAiY2xvc2UiLAogICAgICAgICAgICAgICAgICAgICAgImluZm8iLCAiZ2V0dXJsIik6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihvcGVuX3VybCwgYXR0ciksICJvYmplY3QgcmV0dXJuZWQgZnJvbSAiCkBAIC03MSw3ICs2OSw3IEBACiAKICAgICBkZWYgdGVzdF9yZWFkbGluZXMoc2VsZik6CiAgICAgICAgICMgVGVzdCBib3RoIHJlYWRsaW5lIGFuZCByZWFkbGluZXMuCi0gICAgICAgIG9wZW5fdXJsID0gc2VsZi51cmxvcGVuKCJodHRwOi8vd3d3LnB5dGhvbi5vcmcvIikKKyAgICAgICAgb3Blbl91cmwgPSBzZWxmLnVybG9wZW4oImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vIikKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG9wZW5fdXJsLnJlYWRsaW5lKCksIGJhc2VzdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRsaW5lIGRpZCBub3QgcmV0dXJuIGEgc3RyaW5nIikKQEAgLTgyLDcgKzgwLDcgQEAKIAogICAgIGRlZiB0ZXN0X2luZm8oc2VsZik6CiAgICAgICAgICMgVGVzdCAnaW5mbycuCi0gICAgICAgIG9wZW5fdXJsID0gc2VsZi51cmxvcGVuKCJodHRwOi8vd3d3LnB5dGhvbi5vcmcvIikKKyAgICAgICAgb3Blbl91cmwgPSBzZWxmLnVybG9wZW4oImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vIikKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaW5mb19vYmogPSBvcGVuX3VybC5pbmZvKCkKICAgICAgICAgZmluYWxseToKQEAgLTk0LDcgKzkyLDcgQEAKIAogICAgIGRlZiB0ZXN0X2dldHVybChzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgc2FtZSBVUkwgYXMgb3BlbmVkIGlzIHJldHVybmVkIGJ5IGdldHVybC4KLSAgICAgICAgVVJMID0gImh0dHA6Ly93d3cucHl0aG9uLm9yZy8iCisgICAgICAgIFVSTCA9ICJodHRwOi8vd3d3LmV4YW1wbGUuY29tLyIKICAgICAgICAgb3Blbl91cmwgPSBzZWxmLnVybG9wZW4oVVJMKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBnb3R0ZW5fdXJsID0gb3Blbl91cmwuZ2V0dXJsKCkKQEAgLTEwNCw3ICsxMDIsNyBAQAogCiAgICAgZGVmIHRlc3RfZ2V0Y29kZShzZWxmKToKICAgICAgICAgIyB0ZXN0IGdldGNvZGUoKSB3aXRoIHRoZSBmYW5jeSBvcGVuZXIgdG8gZ2V0IDQwNCBlcnJvciBjb2RlcwotICAgICAgICBVUkwgPSAiaHR0cDovL3d3dy5weXRob24ub3JnL1hYWGludmFsaWRYWFgiCisgICAgICAgIFVSTCA9ICJodHRwOi8vd3d3LmV4YW1wbGUuY29tL1hYWGludmFsaWRYWFgiCiAgICAgICAgIG9wZW5fdXJsID0gdXJsbGliLkZhbmN5VVJMb3BlbmVyKCkub3BlbihVUkwpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGNvZGUgPSBvcGVuX3VybC5nZXRjb2RlKCkKQEAgLTExMiwxNCArMTEwLDExIEBACiAgICAgICAgICAgICBvcGVuX3VybC5jbG9zZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29kZSwgNDA0KQogCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gaW4gKCd3aW4zMicsKSwgJ25vdCBhcHByb3ByaWF0ZSBmb3IgV2luZG93cycpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2Zkb3BlbicpLCAnb3MuZmRvcGVuIG5vdCBhdmFpbGFibGUnKQogICAgIGRlZiB0ZXN0X2ZpbGVubyhzZWxmKToKLSAgICAgICAgaWYgKHN5cy5wbGF0Zm9ybSBpbiAoJ3dpbjMyJywpIG9yCi0gICAgICAgICAgICAgICAgbm90IGhhc2F0dHIob3MsICdmZG9wZW4nKSk6Ci0gICAgICAgICAgICAjIE9uIFdpbmRvd3MsIHNvY2tldCBoYW5kbGVzIGFyZSBub3QgZmlsZSBkZXNjcmlwdG9yczsgdGhpcwotICAgICAgICAgICAgIyB0ZXN0IGNhbid0IHBhc3Mgb24gV2luZG93cy4KLSAgICAgICAgICAgIHJldHVybgogICAgICAgICAjIE1ha2Ugc3VyZSBmZCByZXR1cm5lZCBieSBmaWxlbm8gaXMgdmFsaWQuCi0gICAgICAgIG9wZW5fdXJsID0gc2VsZi51cmxvcGVuKCJodHRwOi8vd3d3LnB5dGhvbi5vcmcvIikKKyAgICAgICAgb3Blbl91cmwgPSBzZWxmLnVybG9wZW4oImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vIikKICAgICAgICAgZmQgPSBvcGVuX3VybC5maWxlbm8oKQogICAgICAgICBGSUxFID0gb3MuZmRvcGVuKGZkKQogICAgICAgICB0cnk6CkBAIC0xNTcsNyArMTUyLDcgQEAKIAogICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgogICAgICAgICAjIFRlc3QgYmFzaWMgZnVuY3Rpb25hbGl0eS4KLSAgICAgICAgZmlsZV9sb2NhdGlvbixpbmZvID0gc2VsZi51cmxyZXRyaWV2ZSgiaHR0cDovL3d3dy5weXRob24ub3JnLyIpCisgICAgICAgIGZpbGVfbG9jYXRpb24saW5mbyA9IHNlbGYudXJscmV0cmlldmUoImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vIikKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGZpbGVfbG9jYXRpb24pLCAiZmlsZSBsb2NhdGlvbiByZXR1cm5lZCBieSIKICAgICAgICAgICAgICAgICAgICAgICAgICIgdXJscmV0cmlldmUgaXMgbm90IGEgdmFsaWQgcGF0aCIpCiAgICAgICAgIEZJTEUgPSBmaWxlKGZpbGVfbG9jYXRpb24pCkBAIC0xNzAsNyArMTY1LDcgQEAKIAogICAgIGRlZiB0ZXN0X3NwZWNpZmllZF9wYXRoKHNlbGYpOgogICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHNwZWNpZnlpbmcgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaWxlIHRvIHdyaXRlIHRvIHdvcmtzLgotICAgICAgICBmaWxlX2xvY2F0aW9uLGluZm8gPSBzZWxmLnVybHJldHJpZXZlKCJodHRwOi8vd3d3LnB5dGhvbi5vcmcvIiwKKyAgICAgICAgZmlsZV9sb2NhdGlvbixpbmZvID0gc2VsZi51cmxyZXRyaWV2ZSgiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5URVNURk4pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9sb2NhdGlvbiwgdGVzdF9zdXBwb3J0LlRFU1RGTikKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGZpbGVfbG9jYXRpb24pKQpAQCAtMTgzLDEzICsxNzgsMTMgQEAKIAogICAgIGRlZiB0ZXN0X2hlYWRlcihzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgaGVhZGVyIHJldHVybmVkIGFzIDJuZCB2YWx1ZSBmcm9tIHVybHJldHJpZXZlIGlzIGdvb2QuCi0gICAgICAgIGZpbGVfbG9jYXRpb24sIGhlYWRlciA9IHNlbGYudXJscmV0cmlldmUoImh0dHA6Ly93d3cucHl0aG9uLm9yZy8iKQorICAgICAgICBmaWxlX2xvY2F0aW9uLCBoZWFkZXIgPSBzZWxmLnVybHJldHJpZXZlKCJodHRwOi8vd3d3LmV4YW1wbGUuY29tLyIpCiAgICAgICAgIG9zLnVubGluayhmaWxlX2xvY2F0aW9uKQogICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoaGVhZGVyLCBtaW1ldG9vbHMuTWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZWFkZXIgaXMgbm90IGFuIGluc3RhbmNlIG9mIG1pbWV0b29scy5NZXNzYWdlIikKIAogICAgIGRlZiB0ZXN0X2RhdGFfaGVhZGVyKHNlbGYpOgotICAgICAgICBsb2dvID0gImh0dHA6Ly93d3cucHl0aG9uLm9yZy9jb21tdW5pdHkvbG9nb3MvcHl0aG9uLWxvZ28tbWFzdGVyLXYzLVRNLnBuZyIKKyAgICAgICAgbG9nbyA9ICJodHRwOi8vd3d3LmV4YW1wbGUuY29tLyIKICAgICAgICAgZmlsZV9sb2NhdGlvbiwgZmlsZWhlYWRlcnMgPSBzZWxmLnVybHJldHJpZXZlKGxvZ28pCiAgICAgICAgIG9zLnVubGluayhmaWxlX2xvY2F0aW9uKQogICAgICAgICBkYXRldmFsdWUgPSBmaWxlaGVhZGVycy5nZXRoZWFkZXIoJ0RhdGUnKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91cmxwYXJzZS5weSBiL0xpYi90ZXN0L3Rlc3RfdXJscGFyc2UucHkKaW5kZXggMzlhODk3YS4uYjNhZDdjZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91cmxwYXJzZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VybHBhcnNlLnB5CkBAIC0xLDUgKzEsMyBAQAotIyEgL3Vzci9iaW4vZW52IHB5dGhvbgotCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgdXJscGFyc2UKQEAgLTM2NCw2ICszNjIsMTYgQEAKICAgICAgICAgICAgICgnaHR0cDovL1s6OjEyLjM0LjU2Ljc4XS9mb28vJywgJzo6MTIuMzQuNTYuNzgnLCBOb25lKSwKICAgICAgICAgICAgICgnaHR0cDovL1s6OmZmZmY6MTIuMzQuNTYuNzhdL2Zvby8nLAogICAgICAgICAgICAgICc6OmZmZmY6MTIuMzQuNTYuNzgnLCBOb25lKSwKKyAgICAgICAgICAgICgnaHR0cDovL1Rlc3QucHl0aG9uLm9yZzovZm9vLycsICd0ZXN0LnB5dGhvbi5vcmcnLCBOb25lKSwKKyAgICAgICAgICAgICgnaHR0cDovLzEyLjM0LjU2Ljc4Oi9mb28vJywgJzEyLjM0LjU2Ljc4JywgTm9uZSksCisgICAgICAgICAgICAoJ2h0dHA6Ly9bOjoxXTovZm9vLycsICc6OjEnLCBOb25lKSwKKyAgICAgICAgICAgICgnaHR0cDovL1tkZWFkOmJlZWY6OjFdOi9mb28vJywgJ2RlYWQ6YmVlZjo6MScsIE5vbmUpLAorICAgICAgICAgICAgKCdodHRwOi8vW2RlYWQ6YmVlZjo6XTovZm9vLycsICdkZWFkOmJlZWY6OicsIE5vbmUpLAorICAgICAgICAgICAgKCdodHRwOi8vW2RlYWQ6YmVlZjpjYWZlOjU0MTc6YWZmZTo4RkEzOmRlYWY6ZmVlZF06L2Zvby8nLAorICAgICAgICAgICAgICdkZWFkOmJlZWY6Y2FmZTo1NDE3OmFmZmU6OGZhMzpkZWFmOmZlZWQnLCBOb25lKSwKKyAgICAgICAgICAgICgnaHR0cDovL1s6OjEyLjM0LjU2Ljc4XTovZm9vLycsICc6OjEyLjM0LjU2Ljc4JywgTm9uZSksCisgICAgICAgICAgICAoJ2h0dHA6Ly9bOjpmZmZmOjEyLjM0LjU2Ljc4XTovZm9vLycsCisgICAgICAgICAgICAgJzo6ZmZmZjoxMi4zNC41Ni43OCcsIE5vbmUpLAogICAgICAgICAgICAgXToKICAgICAgICAgICAgIHVybHBhcnNlZCA9IHVybHBhcnNlLnVybHBhcnNlKHVybCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHVybHBhcnNlZC5ob3N0bmFtZSwgdXJscGFyc2VkLnBvcnQpICwgKGhvc3RuYW1lLCBwb3J0KSkKQEAgLTQzNyw2ICs0NDUsNTEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvcnQsIDgwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuZ2V0dXJsKCksIHVybCkKIAorICAgICAgICAjIFZlcmlmeSBhbiBpbGxlZ2FsIHBvcnQgb2YgdmFsdWUgZ3JlYXRlciB0aGFuIDY1NTM1IGlzIHNldCBhcyBOb25lCisgICAgICAgIHVybCA9ICJodHRwOi8vd3d3LnB5dGhvbi5vcmc6NjU1MzYiCisgICAgICAgIHAgPSB1cmxwYXJzZS51cmxzcGxpdCh1cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wb3J0LCBOb25lKQorCisgICAgZGVmIHRlc3RfaXNzdWUxNDA3MihzZWxmKToKKyAgICAgICAgcDEgPSB1cmxwYXJzZS51cmxzcGxpdCgndGVsOiszMS02NDEwNDQxNTMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAxLnNjaGVtZSwgJ3RlbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocDEucGF0aCwgJyszMS02NDEwNDQxNTMnKQorCisgICAgICAgIHAyID0gdXJscGFyc2UudXJsc3BsaXQoJ3RlbDorMzE2NDEwNDQxNTMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAyLnNjaGVtZSwgJ3RlbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocDIucGF0aCwgJyszMTY0MTA0NDE1MycpCisKKyAgICAgICAgIyBBc3NlcnQgZm9yIHVybHBhcnNlCisgICAgICAgIHAxID0gdXJscGFyc2UudXJscGFyc2UoJ3RlbDorMzEtNjQxMDQ0MTUzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMS5zY2hlbWUsICd0ZWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAxLnBhdGgsICcrMzEtNjQxMDQ0MTUzJykKKworICAgICAgICBwMiA9IHVybHBhcnNlLnVybHBhcnNlKCd0ZWw6KzMxNjQxMDQ0MTUzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMi5zY2hlbWUsICd0ZWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAyLnBhdGgsICcrMzE2NDEwNDQxNTMnKQorCisKKyAgICBkZWYgdGVzdF90ZWx1cmxfcGFyYW1zKHNlbGYpOgorICAgICAgICBwMSA9IHVybHBhcnNlLnVybHBhcnNlKCd0ZWw6MTIzLTQ7cGhvbmUtY29udGV4dD0rMS02NTAtNTE2JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMS5zY2hlbWUsICd0ZWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAxLnBhdGgsICcxMjMtNCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocDEucGFyYW1zLCAncGhvbmUtY29udGV4dD0rMS02NTAtNTE2JykKKworICAgICAgICBwMSA9IHVybHBhcnNlLnVybHBhcnNlKCd0ZWw6KzEtMjAxLTU1NS0wMTIzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMS5zY2hlbWUsICd0ZWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAxLnBhdGgsICcrMS0yMDEtNTU1LTAxMjMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAxLnBhcmFtcywgJycpCisKKyAgICAgICAgcDEgPSB1cmxwYXJzZS51cmxwYXJzZSgndGVsOjcwNDI7cGhvbmUtY29udGV4dD1leGFtcGxlLmNvbScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocDEuc2NoZW1lLCAndGVsJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMS5wYXRoLCAnNzA0MicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocDEucGFyYW1zLCAncGhvbmUtY29udGV4dD1leGFtcGxlLmNvbScpCisKKyAgICAgICAgcDEgPSB1cmxwYXJzZS51cmxwYXJzZSgndGVsOjg2My0xMjM0O3Bob25lLWNvbnRleHQ9KzEtOTE0LTU1NScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocDEuc2NoZW1lLCAndGVsJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMS5wYXRoLCAnODYzLTEyMzQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAxLnBhcmFtcywgJ3Bob25lLWNvbnRleHQ9KzEtOTE0LTU1NScpCisKIAogICAgIGRlZiB0ZXN0X2F0dHJpYnV0ZXNfYmFkX3BvcnQoc2VsZik6CiAgICAgICAgICIiIkNoZWNrIGhhbmRsaW5nIG9mIG5vbi1pbnRlZ2VyIHBvcnRzLiIiIgpAQCAtNDkzLDYgKzU0NiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICgnczMnLCdmb28uY29tJywnL3N0dWZmJywnJywnJywnJykpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJscGFyc2UudXJscGFyc2UoIngtbmV3c2NoZW1lOi8vZm9vLmNvbS9zdHVmZiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICgneC1uZXdzY2hlbWUnLCdmb28uY29tJywnL3N0dWZmJywnJywnJywnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJscGFyc2UudXJscGFyc2UoIngtbmV3c2NoZW1lOi8vZm9vLmNvbS9zdHVmZj9xdWVyeSNmcmFnbWVudCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgneC1uZXdzY2hlbWUnLCdmb28uY29tJywnL3N0dWZmJywnJywncXVlcnknLCdmcmFnbWVudCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVybHBhcnNlLnVybHBhcnNlKCJ4LW5ld3NjaGVtZTovL2Zvby5jb20vc3R1ZmY/cXVlcnkiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJ3gtbmV3c2NoZW1lJywnZm9vLmNvbScsJy9zdHVmZicsJycsJ3F1ZXJ5JywnJykpCiAKICAgICBkZWYgdGVzdF93aXRob3V0c2NoZW1lKHNlbGYpOgogICAgICAgICAjIFRlc3QgdXJscGFyc2Ugd2l0aG91dCBzY2hlbWUKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXNlcnN0cmluZy5weSBiL0xpYi90ZXN0L3Rlc3RfdXNlcnN0cmluZy5weQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDI2MjU5ODUuLjUxZDhlOGIKLS0tIGEvTGliL3Rlc3QvdGVzdF91c2Vyc3RyaW5nLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXNlcnN0cmluZy5weQpAQCAtMSw0ICsxLDMgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgogIyBVc2VyU3RyaW5nIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIG5hdGl2ZSBidWlsdGluIHN0cmluZyB0eXBlLgogIyBVc2VyU3RyaW5nIGluc3RhbmNlcyBzaG91bGQgYmVoYXZlIHNpbWlsYXIgdG8gYnVpbHRpbiBzdHJpbmcgb2JqZWN0cy4KIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91dS5weSBiL0xpYi90ZXN0L3Rlc3RfdXUucHkKaW5kZXggOTVjOTU1Mi4uMzEwNDZiMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91dS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3V1LnB5CkBAIC00OCw3ICs0OCw3IEBACiAgICAgICAgIG91dCA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHV1LmRlY29kZShpbnAsIG91dCkKLSAgICAgICAgICAgIHNlbGYuZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpCisgICAgICAgICAgICBzZWxmLmZhaWwoIk5vIGV4Y2VwdGlvbiByYWlzZWQiKQogICAgICAgICBleGNlcHQgdXUuRXJyb3IsIGU6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlKSwgIlRydW5jYXRlZCBpbnB1dCBmaWxlIikKIApAQCAtNTcsNyArNTcsNyBAQAogICAgICAgICBvdXQgPSBjU3RyaW5nSU8uU3RyaW5nSU8oKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICB1dS5kZWNvZGUoaW5wLCBvdXQpCi0gICAgICAgICAgICBzZWxmLmZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJObyBleGNlcHRpb24gcmFpc2VkIikKICAgICAgICAgZXhjZXB0IHV1LkVycm9yLCBlOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZSksICJObyB2YWxpZCBiZWdpbiBsaW5lIGZvdW5kIGluIGlucHV0IGZpbGUiKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3V1aWQucHkgYi9MaWIvdGVzdC90ZXN0X3V1aWQucHkKaW5kZXggZTUwMzA4NC4uNWJhNjg0NSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91dWlkLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXVpZC5weQpAQCAtMSw1ICsxLDcgQEAKLWZyb20gdW5pdHRlc3QgaW1wb3J0IFRlc3RDYXNlCitpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgaW8KK2ltcG9ydCBvcwogaW1wb3J0IHV1aWQKIAogZGVmIGltcG9ydGFibGUobmFtZSk6CkBAIC05LDcgKzExLDcgQEAKICAgICBleGNlcHQ6CiAgICAgICAgIHJldHVybiBGYWxzZQogCi1jbGFzcyBUZXN0VVVJRChUZXN0Q2FzZSk6CitjbGFzcyBUZXN0VVVJRCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgbGFzdF9ub2RlID0gTm9uZQogICAgIHNvdXJjZTJub2RlID0ge30KIApAQCAtMjk5LDI0ICszMDEsMjIgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIFRlc3RVVUlELmxhc3Rfbm9kZSA9IG5vZGUKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKG9zLm5hbWUgPT0gJ3Bvc2l4JywgJ3JlcXVpcmVzIFBvc2l4JykKICAgICBkZWYgdGVzdF9pZmNvbmZpZ19nZXRub2RlKHNlbGYpOgotICAgICAgICBpbXBvcnQgc3lzCi0gICAgICAgIGltcG9ydCBvcwotICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6Ci0gICAgICAgICAgICBub2RlID0gdXVpZC5faWZjb25maWdfZ2V0bm9kZSgpCi0gICAgICAgICAgICBpZiBub2RlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfbm9kZShub2RlLCAnaWZjb25maWcnKQorICAgICAgICBub2RlID0gdXVpZC5faWZjb25maWdfZ2V0bm9kZSgpCisgICAgICAgIGlmIG5vZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmNoZWNrX25vZGUobm9kZSwgJ2lmY29uZmlnJykKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKG9zLm5hbWUgPT0gJ250JywgJ3JlcXVpcmVzIFdpbmRvd3MnKQogICAgIGRlZiB0ZXN0X2lwY29uZmlnX2dldG5vZGUoc2VsZik6Ci0gICAgICAgIGltcG9ydCBvcwotICAgICAgICBpZiBvcy5uYW1lID09ICdudCc6Ci0gICAgICAgICAgICBub2RlID0gdXVpZC5faXBjb25maWdfZ2V0bm9kZSgpCi0gICAgICAgICAgICBpZiBub2RlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfbm9kZShub2RlLCAnaXBjb25maWcnKQorICAgICAgICBub2RlID0gdXVpZC5faXBjb25maWdfZ2V0bm9kZSgpCisgICAgICAgIGlmIG5vZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmNoZWNrX25vZGUobm9kZSwgJ2lwY29uZmlnJykKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGltcG9ydGFibGUoJ3dpbjMyd25ldCcpLCAncmVxdWlyZXMgd2luMzJ3bmV0JykKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhpbXBvcnRhYmxlKCduZXRiaW9zJyksICdyZXF1aXJlcyBuZXRiaW9zJykKICAgICBkZWYgdGVzdF9uZXRiaW9zX2dldG5vZGUoc2VsZik6Ci0gICAgICAgIGlmIGltcG9ydGFibGUoJ3dpbjMyd25ldCcpIGFuZCBpbXBvcnRhYmxlKCduZXRiaW9zJyk6Ci0gICAgICAgICAgICBzZWxmLmNoZWNrX25vZGUodXVpZC5fbmV0Ymlvc19nZXRub2RlKCksICduZXRiaW9zJykKKyAgICAgICAgc2VsZi5jaGVja19ub2RlKHV1aWQuX25ldGJpb3NfZ2V0bm9kZSgpLCAnbmV0YmlvcycpCiAKICAgICBkZWYgdGVzdF9yYW5kb21fZ2V0bm9kZShzZWxmKToKICAgICAgICAgbm9kZSA9IHV1aWQuX3JhbmRvbV9nZXRub2RlKCkKQEAgLTMyNCwyMiArMzI0LDIwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub2RlICYgMHgwMTAwMDAwMDAwMDApCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub2RlIDwgKDFMIDw8IDQ4KSkKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKG9zLm5hbWUgPT0gJ3Bvc2l4JywgJ3JlcXVpcmVzIFBvc2l4JykKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhpbXBvcnRhYmxlKCdjdHlwZXMnKSwgJ3JlcXVpcmVzIGN0eXBlcycpCiAgICAgZGVmIHRlc3RfdW5peGRsbF9nZXRub2RlKHNlbGYpOgotICAgICAgICBpbXBvcnQgc3lzCi0gICAgICAgIGltcG9ydCBvcwotICAgICAgICBpZiBpbXBvcnRhYmxlKCdjdHlwZXMnKSBhbmQgb3MubmFtZSA9PSAncG9zaXgnOgotICAgICAgICAgICAgdHJ5OiAjIElzc3VlcyAxNDgxLCAzNTgxOiBfdXVpZF9nZW5lcmF0ZV90aW1lKCkgbWlnaHQgYmUgTm9uZS4KLSAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX25vZGUodXVpZC5fdW5peGRsbF9nZXRub2RlKCksICd1bml4ZGxsJykKLSAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6Ci0gICAgICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6ICMgSXNzdWVzIDE0ODEsIDM1ODE6IF91dWlkX2dlbmVyYXRlX3RpbWUoKSBtaWdodCBiZSBOb25lLgorICAgICAgICAgICAgc2VsZi5jaGVja19ub2RlKHV1aWQuX3VuaXhkbGxfZ2V0bm9kZSgpLCAndW5peGRsbCcpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhvcy5uYW1lID09ICdudCcsICdyZXF1aXJlcyBXaW5kb3dzJykKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhpbXBvcnRhYmxlKCdjdHlwZXMnKSwgJ3JlcXVpcmVzIGN0eXBlcycpCiAgICAgZGVmIHRlc3Rfd2luZGxsX2dldG5vZGUoc2VsZik6Ci0gICAgICAgIGltcG9ydCBvcwotICAgICAgICBpZiBpbXBvcnRhYmxlKCdjdHlwZXMnKSBhbmQgb3MubmFtZSA9PSAnbnQnOgotICAgICAgICAgICAgc2VsZi5jaGVja19ub2RlKHV1aWQuX3dpbmRsbF9nZXRub2RlKCksICd3aW5kbGwnKQorICAgICAgICBzZWxmLmNoZWNrX25vZGUodXVpZC5fd2luZGxsX2dldG5vZGUoKSwgJ3dpbmRsbCcpCiAKICAgICBkZWYgdGVzdF9nZXRub2RlKHNlbGYpOgotICAgICAgICBpbXBvcnQgc3lzCiAgICAgICAgIG5vZGUxID0gdXVpZC5nZXRub2RlKCkKICAgICAgICAgc2VsZi5jaGVja19ub2RlKG5vZGUxLCAiZ2V0bm9kZTEiKQogCkBAIC0zNDksMTMgKzM0NywzOSBAQAogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm9kZTEsIG5vZGUyKQogCi0gICAgZGVmIHRlc3RfdXVpZDEoc2VsZik6Ci0gICAgICAgICMgdXVpZDEgcmVxdWlyZXMgY3R5cGVzLgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBpbXBvcnQgY3R5cGVzCi0gICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgIHJldHVybgorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKG9zLm5hbWUgPT0gJ3Bvc2l4JywgJ3JlcXVpcmVzIFBvc2l4JykKKyAgICBkZWYgdGVzdF9maW5kX21hYyhzZWxmKToKKyAgICAgICAgZGF0YSA9ICcnJ1wKIAorZmFrZSBod2FkZHIKK2NzY290dW4wICBMaW5rIGVuY2FwOlVOU1BFQyAgSFdhZGRyIDAwLTAwLTAwLTAwLTAwLTAwLTAwLTAwLTAwLTAwLTAwLTAwLTAwLTAwLTAwLTAwCitldGgwICAgICAgTGluayBlbmNhcDpFdGhlcm5ldCAgSFdhZGRyIDEyOjM0OjU2Ojc4OjkwOmFiCisnJycKKyAgICAgICAgZGVmIG1vY2tfcG9wZW4oY21kKToKKyAgICAgICAgICAgIHJldHVybiBpby5CeXRlc0lPKGRhdGEpCisKKyAgICAgICAgcGF0aCA9IG9zLmVudmlyb24uZ2V0KCJQQVRIIiwgb3MuZGVmcGF0aCkuc3BsaXQob3MucGF0aHNlcCkKKyAgICAgICAgcGF0aC5leHRlbmQoKCcvc2JpbicsICcvdXNyL3NiaW4nKSkKKyAgICAgICAgZm9yIGRpciBpbiBwYXRoOgorICAgICAgICAgICAgZXhlY3V0YWJsZSA9IG9zLnBhdGguam9pbihkaXIsICdpZmNvbmZpZycpCisgICAgICAgICAgICBpZiAob3MucGF0aC5leGlzdHMoZXhlY3V0YWJsZSkgYW5kCisgICAgICAgICAgICAgICAgb3MuYWNjZXNzKGV4ZWN1dGFibGUsIG9zLkZfT0sgfCBvcy5YX09LKSBhbmQKKyAgICAgICAgICAgICAgICBub3Qgb3MucGF0aC5pc2RpcihleGVjdXRhYmxlKSk6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ3JlcXVpcmVzIGlmY29uZmlnJykKKworICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5zd2FwX2F0dHIob3MsICdwb3BlbicsIG1vY2tfcG9wZW4pOgorICAgICAgICAgICAgbWFjID0gdXVpZC5fZmluZF9tYWMoCisgICAgICAgICAgICAgICAgY29tbWFuZD0naWZjb25maWcnLAorICAgICAgICAgICAgICAgIGFyZ3M9JycsCisgICAgICAgICAgICAgICAgaHdfaWRlbnRpZmllcnM9Wydod2FkZHInXSwKKyAgICAgICAgICAgICAgICBnZXRfaW5kZXg9bGFtYmRhIHg6IHggKyAxLAorICAgICAgICAgICAgKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYWMsIDB4MTIzNDU2Nzg5MGFiKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaW1wb3J0YWJsZSgnY3R5cGVzJyksICdyZXF1aXJlcyBjdHlwZXMnKQorICAgIGRlZiB0ZXN0X3V1aWQxKHNlbGYpOgogICAgICAgICBlcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKIAogICAgICAgICAjIE1ha2Ugc3VyZSB1dWlkMSgpIGdlbmVyYXRlcyBVVUlEcyB0aGF0IGFyZSBhY3R1YWxseSB2ZXJzaW9uIDEuCkBAIC00MDgsMTMgKzQzMiw4IEBACiAgICAgICAgICAgICBlcXVhbCh1LCB1dWlkLlVVSUQodikpCiAgICAgICAgICAgICBlcXVhbChzdHIodSksIHYpCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhpbXBvcnRhYmxlKCdjdHlwZXMnKSwgJ3JlcXVpcmVzIGN0eXBlcycpCiAgICAgZGVmIHRlc3RfdXVpZDQoc2VsZik6Ci0gICAgICAgICMgdXVpZDQgcmVxdWlyZXMgY3R5cGVzLgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBpbXBvcnQgY3R5cGVzCi0gICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgIHJldHVybgotCiAgICAgICAgIGVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAogCiAgICAgICAgICMgTWFrZSBzdXJlIHV1aWQ0KCkgZ2VuZXJhdGVzIFVVSURzIHRoYXQgYXJlIGFjdHVhbGx5IHZlcnNpb24gNC4KQEAgLTQ0NiwxMiArNDY1LDggQEAKICAgICAgICAgICAgIGVxdWFsKHUsIHV1aWQuVVVJRCh2KSkKICAgICAgICAgICAgIGVxdWFsKHN0cih1KSwgdikKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKG9zLm5hbWUgPT0gJ3Bvc2l4JywgJ3JlcXVpcmVzIFBvc2l4JykKICAgICBkZWYgdGVzdElzc3VlODYyMShzZWxmKToKLSAgICAgICAgaW1wb3J0IG9zCi0gICAgICAgIGltcG9ydCBzeXMKLSAgICAgICAgaWYgb3MubmFtZSAhPSAncG9zaXgnOgotICAgICAgICAgICAgcmV0dXJuCi0KICAgICAgICAgIyBPbiBhdCBsZWFzdCBzb21lIHZlcnNpb25zIG9mIE9TWCB1dWlkLnV1aWQ0IGdlbmVyYXRlcwogICAgICAgICAjIHRoZSBzYW1lIHNlcXVlbmNlIG9mIFVVSURzIGluIHRoZSBwYXJlbnQgYW5kIGFueQogICAgICAgICAjIGNoaWxkcmVuIHN0YXJ0ZWQgdXNpbmcgZm9yay4KQEAgLTQ2NSw2ICs0ODAsNyBAQAogCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBvcy5jbG9zZShmZHNbMV0pCisgICAgICAgICAgICBzZWxmLmFkZENsZWFudXAob3MuY2xvc2UsIGZkc1swXSkKICAgICAgICAgICAgIHBhcmVudF92YWx1ZSA9IHV1aWQudXVpZDQoKS5oZXgKICAgICAgICAgICAgIG9zLndhaXRwaWQocGlkLCAwKQogICAgICAgICAgICAgY2hpbGRfdmFsdWUgPSBvcy5yZWFkKGZkc1swXSwgMTAwKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93YWl0NC5weSBiL0xpYi90ZXN0L3Rlc3Rfd2FpdDQucHkKaW5kZXggZDA0YTExYi4uNTQ1ODBhOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF93YWl0NC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dhaXQ0LnB5CkBAIC0zLDYgKzMsNyBAQAogCiBpbXBvcnQgb3MKIGltcG9ydCB0aW1lCitpbXBvcnQgc3lzCiBmcm9tIHRlc3QuZm9ya193YWl0IGltcG9ydCBGb3JrV2FpdAogZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCByZWFwX2NoaWxkcmVuLCBnZXRfYXR0cmlidXRlCiAKQEAgLTEzLDEwICsxNCwxNSBAQAogCiBjbGFzcyBXYWl0NFRlc3QoRm9ya1dhaXQpOgogICAgIGRlZiB3YWl0X2ltcGwoc2VsZiwgY3BpZCk6CisgICAgICAgIG9wdGlvbiA9IG9zLldOT0hBTkcKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2FpeCcpOgorICAgICAgICAgICAgIyBJc3N1ZSAjMTExODU6IHdhaXQ0IGlzIGJyb2tlbiBvbiBBSVggYW5kIHdpbGwgYWx3YXlzIHJldHVybiAwCisgICAgICAgICAgICAjIHdpdGggV05PSEFORy4KKyAgICAgICAgICAgIG9wdGlvbiA9IDAKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgogICAgICAgICAgICAgIyB3YWl0NCgpIHNob3VsZG4ndCBoYW5nLCBidXQgc29tZSBvZiB0aGUgYnVpbGRib3RzIHNlZW0gdG8gaGFuZwogICAgICAgICAgICAgIyBpbiB0aGUgZm9ya2luZyB0ZXN0cy4gIFRoaXMgaXMgYW4gYXR0ZW1wdCB0byBmaXggdGhlIHByb2JsZW0uCi0gICAgICAgICAgICBzcGlkLCBzdGF0dXMsIHJ1c2FnZSA9IG9zLndhaXQ0KGNwaWQsIG9zLldOT0hBTkcpCisgICAgICAgICAgICBzcGlkLCBzdGF0dXMsIHJ1c2FnZSA9IG9zLndhaXQ0KGNwaWQsIG9wdGlvbikKICAgICAgICAgICAgIGlmIHNwaWQgPT0gY3BpZDoKICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgdGltZS5zbGVlcCgxLjApCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3dhcm5pbmdzLnB5IGIvTGliL3Rlc3QvdGVzdF93YXJuaW5ncy5weQppbmRleCBlNTAyZWQ4Li5hNzcwYmEyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3dhcm5pbmdzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfd2FybmluZ3MucHkKQEAgLTI1OSwxMSArMjU5LDEwIEBACiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICB3YXJuaW5nX3Rlc3RzLl9fZmlsZV9fID0gZmlsZW5hbWUKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIoc3lzLCAnYXJndicpLCAndGVzdCBuZWVkcyBzeXMuYXJndicpCiAgICAgZGVmIHRlc3RfbWlzc2luZ19maWxlbmFtZV9tYWluX3dpdGhfYXJndihzZWxmKToKICAgICAgICAgIyBJZiBfX2ZpbGVfXyBpcyBub3Qgc3BlY2lmaWVkIGFuZCB0aGUgY2FsbGVyIGlzIF9fbWFpbl9fIGFuZCBzeXMuYXJndgogICAgICAgICAjIGV4aXN0cywgdGhlbiB1c2Ugc3lzLmFyZ3ZbMF0gYXMgdGhlIGZpbGUuCi0gICAgICAgIGlmIG5vdCBoYXNhdHRyKHN5cywgJ2FyZ3YnKToKLSAgICAgICAgICAgIHJldHVybgogICAgICAgICBmaWxlbmFtZSA9IHdhcm5pbmdfdGVzdHMuX19maWxlX18KICAgICAgICAgbW9kdWxlX25hbWUgPSB3YXJuaW5nX3Rlc3RzLl9fbmFtZV9fCiAgICAgICAgIHRyeToKQEAgLTY2OSw3ICs2NjgsNyBAQAogICAgICAgICAjIEV4cGxpY2l0IHRlc3RzIGZvciB0aGUgdGVzdF9zdXBwb3J0IGNvbnZlbmllbmNlIHdyYXBwZXIKICAgICAgICAgd21vZCA9IHNlbGYubW9kdWxlCiAgICAgICAgIGlmIHdtb2QgaXMgbm90IHN5cy5tb2R1bGVzWyd3YXJuaW5ncyddOgotICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCdtb2R1bGUgdG8gdGVzdCBpcyBub3QgbG9hZGVkIHdhcm5pbmdzIG1vZHVsZScpCiAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKHF1aWV0PUZhbHNlKSBhcyB3OgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Lndhcm5pbmdzLCBbXSkKICAgICAgICAgICAgIHdtb2Quc2ltcGxlZmlsdGVyKCJhbHdheXMiKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93YXZlLnB5IGIvTGliL3Rlc3QvdGVzdF93YXZlLnB5CmluZGV4IDAyZjVmYWUuLjk1MTNkZjQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2F2ZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dhdmUucHkKQEAgLTEsNDUgKzEsMTIzIEBACiBmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBURVNURk4sIHJ1bl91bml0dGVzdAotaW1wb3J0IG9zCi1pbXBvcnQgd2F2ZQogaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IGF1ZGlvdGVzdHMKK2ltcG9ydCBzeXMKK2ltcG9ydCB3YXZlCiAKLW5jaGFubmVscyA9IDIKLXNhbXB3aWR0aCA9IDIKLWZyYW1lcmF0ZSA9IDgwMDAKLW5mcmFtZXMgPSAxMDAKIAotY2xhc3MgVGVzdFdhdmUodW5pdHRlc3QuVGVzdENhc2UpOgorY2xhc3MgV2F2ZVRlc3QoYXVkaW90ZXN0cy5BdWRpb1dyaXRlVGVzdHMsCisgICAgICAgICAgICAgICBhdWRpb3Rlc3RzLkF1ZGlvVGVzdHNXaXRoU291cmNlRmlsZSk6CisgICAgbW9kdWxlID0gd2F2ZQorICAgIHRlc3RfdW5zZWVrYWJsZV93cml0ZSA9IE5vbmUKKyAgICB0ZXN0X3Vuc2Vla2FibGVfb3ZlcmZsb3dlZF93cml0ZSA9IE5vbmUKKyAgICB0ZXN0X3Vuc2Vla2FibGVfaW5jb21wbGV0ZWRfd3JpdGUgPSBOb25lCiAKLSAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYuZiA9IE5vbmUKIAotICAgIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAgICAgaWYgc2VsZi5mIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2VsZi5mLmNsb3NlKCkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgb3MucmVtb3ZlKFRFU1RGTikKLSAgICAgICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCitjbGFzcyBXYXZlUENNOFRlc3QoV2F2ZVRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBzbmRmaWxlbmFtZSA9ICdwbHVjay1wY204LndhdicKKyAgICBzbmRmaWxlbmZyYW1lcyA9IDMzMDcKKyAgICBuY2hhbm5lbHMgPSAyCisgICAgc2FtcHdpZHRoID0gMQorICAgIGZyYW1lcmF0ZSA9IDExMDI1CisgICAgbmZyYW1lcyA9IDQ4CisgICAgY29tcHR5cGUgPSAnTk9ORScKKyAgICBjb21wbmFtZSA9ICdub3QgY29tcHJlc3NlZCcKKyAgICBmcmFtZXMgPSBhdWRpb3Rlc3RzLmZyb21oZXgoIiIiXAorICAgICAgODI3RiBDQjgwIEIxODQgMDA4OCA0Qjg2IEM4ODMgM0Y4MSA4MzdFIDM4N0EgMzQ3MyBBOTZCIDlBNjYgXAorICAgICAgNkQ2NCA0NjYyIDhFNjAgNkY2MCBENzYyIDdCNjggOTM2RiA1ODc3IDE3N0IgNzU3QyA4ODdCIDVGN0IgXAorICAgICAgOTE3QSBCRTdCIDNDN0MgRTY3RiA0Rjg0IEMzODkgNDE4RSBEMTkyIDZFOTcgMDI5NiBGRjk0IDAwOTIgXAorICAgICAgQzk4RSBEMjhEIDZGOEYgNEU4RiA2NDhDIEUzOEEgODg4QSBBQjhCIEQxOEUgMEI5MSAzNjhFIEM0OEEgXAorICAgICAgIiIiKQogCi0gICAgZGVmIHRlc3RfaXQoc2VsZik6Ci0gICAgICAgIHNlbGYuZiA9IHdhdmUub3BlbihURVNURk4sICd3YicpCi0gICAgICAgIHNlbGYuZi5zZXRuY2hhbm5lbHMobmNoYW5uZWxzKQotICAgICAgICBzZWxmLmYuc2V0c2FtcHdpZHRoKHNhbXB3aWR0aCkKLSAgICAgICAgc2VsZi5mLnNldGZyYW1lcmF0ZShmcmFtZXJhdGUpCi0gICAgICAgIHNlbGYuZi5zZXRuZnJhbWVzKG5mcmFtZXMpCi0gICAgICAgIG91dHB1dCA9ICdcMCcgKiBuZnJhbWVzICogbmNoYW5uZWxzICogc2FtcHdpZHRoCi0gICAgICAgIHNlbGYuZi53cml0ZWZyYW1lcyhvdXRwdXQpCi0gICAgICAgIHNlbGYuZi5jbG9zZSgpCiAKLSAgICAgICAgc2VsZi5mID0gd2F2ZS5vcGVuKFRFU1RGTiwgJ3JiJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuY2hhbm5lbHMsIHNlbGYuZi5nZXRuY2hhbm5lbHMoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzYW1wd2lkdGgsIHNlbGYuZi5nZXRzYW1wd2lkdGgoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcmFtZXJhdGUsIHNlbGYuZi5nZXRmcmFtZXJhdGUoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZnJhbWVzLCBzZWxmLmYuZ2V0bmZyYW1lcygpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZi5yZWFkZnJhbWVzKG5mcmFtZXMpLCBvdXRwdXQpCitjbGFzcyBXYXZlUENNMTZUZXN0KFdhdmVUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgc25kZmlsZW5hbWUgPSAncGx1Y2stcGNtMTYud2F2JworICAgIHNuZGZpbGVuZnJhbWVzID0gMzMwNworICAgIG5jaGFubmVscyA9IDIKKyAgICBzYW1wd2lkdGggPSAyCisgICAgZnJhbWVyYXRlID0gMTEwMjUKKyAgICBuZnJhbWVzID0gNDgKKyAgICBjb21wdHlwZSA9ICdOT05FJworICAgIGNvbXBuYW1lID0gJ25vdCBjb21wcmVzc2VkJworICAgIGZyYW1lcyA9IGF1ZGlvdGVzdHMuZnJvbWhleCgiIiJcCisgICAgICAwMjJFRkZFQSA0QjVDMDBGOSAzMTE0MDRFRiA4MERDMDg0MyBDQkRGMDZCMiA0OEFBMDNGMyBCRkU3MDFCMiAwMzZCRkU3QyBcCisgICAgICBCODU3RkEzRSBCNEIyRjM0RiAyOTk5RUJDQSAxQTVGRTZENyBFREZDRTQ5MSBDNjI2RTI3OSAwRTA1RTBCOCBFRjI3RTAyRCBcCisgICAgICA1NzU0RTI3NSBGQjMxRTg0MyAxMzczRUY4OSBEODI3RjcyQyA5NzhCRkI3QSBGNUY3RkMxMSAwODY2RkI5QyBERjMwRkI0MiBcCisgICAgICAxMTdGRkEzNiAzRUU0RkI1RCBCQzc1RkNCNiA2NkQ1RkY1RiBDRjE2MDQwRSA0MzIyMDk3OCBDMUJDMEVDOCA1MTFGMTJBNCBcCisgICAgICBFRURGMTc1NSA4MjA2MTY2NiA3RkZGMTQ0NiA4MDAwMTI5NiA0OTlDMEVCMiA1MkJBMERCOSBFRkI3MEY1QyBDRTQwMEZCQyBcCisgICAgICBFNEI1MENFQiA2MzQ0MEE1QSAwOENBMEExRiAyQkJBMEIwQiA1MTQ2MEU0NyA4QkNCMTEzQyBCNkY1MEVFQSA0NDE1MEE1OSBcCisgICAgICAiIiIpCisgICAgaWYgc3lzLmJ5dGVvcmRlciAhPSAnYmlnJzoKKyAgICAgICAgZnJhbWVzID0gYXVkaW90ZXN0cy5ieXRlc3dhcDIoZnJhbWVzKQorCisgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAnYmlnJzoKKyAgICAgICAgQHVuaXR0ZXN0LmV4cGVjdGVkRmFpbHVyZQorICAgICAgICBkZWYgdGVzdF91bnNlZWthYmxlX2luY29tcGxldGVkX3dyaXRlKHNlbGYpOgorICAgICAgICAgICAgc3VwZXIoKS50ZXN0X3Vuc2Vla2FibGVfaW5jb21wbGV0ZWRfd3JpdGUoKQorCisKKworY2xhc3MgV2F2ZVBDTTI0VGVzdChXYXZlVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIHNuZGZpbGVuYW1lID0gJ3BsdWNrLXBjbTI0LndhdicKKyAgICBzbmRmaWxlbmZyYW1lcyA9IDMzMDcKKyAgICBuY2hhbm5lbHMgPSAyCisgICAgc2FtcHdpZHRoID0gMworICAgIGZyYW1lcmF0ZSA9IDExMDI1CisgICAgbmZyYW1lcyA9IDQ4CisgICAgY29tcHR5cGUgPSAnTk9ORScKKyAgICBjb21wbmFtZSA9ICdub3QgY29tcHJlc3NlZCcKKyAgICBmcmFtZXMgPSBhdWRpb3Rlc3RzLmZyb21oZXgoIiIiXAorICAgICAgMDIyRDY1RkZFQjlEIDRCNUEwRjAwRkE1NCAzMTEzQzMwNEVFMkIgODBEQ0Q2MDg0MzAzIFwKKyAgICAgIENCREVDMDA2QjI2MSA0OEE5OTgwM0YyRjggQkZFODI0MDFCMDdEIDAzNkJGQkZFN0I1RCBcCisgICAgICBCODU3NTZGQTNFQzkgQjRCMDU1RjM1MDJCIDI5OTgzMEVCQ0I2MiAxQTVDQTdFNkQ5OUEgXAorICAgICAgRURGQTNFRTQ5MUJEIEM2MjVFQkUyNzg4NCAwRTA1QTlFMEI2Q0YgRUYyOTI5RTAyOTIyIFwKKyAgICAgIDU3NThEOEUyNzA2NyBGQjM1NTdFODNFMTYgMTM3N0JGRUY4NDAyIEQ4MkM1QkY3MjcyQSBcCisgICAgICA5NzhGMTZGQjc3NDUgRjVGODY1RkMxMDEzIDA4NjYzNUZCOUM0RSBERjMwRkNGQjQwRUUgXAorICAgICAgMTE3RkUwRkEzNDM4IDNFRTZCOEZCNUFDMyBCQzc3QTNGQ0IyRjQgNjZENkRBRkY1RjMyIFwKKyAgICAgIENGMTNCOTA0MTI3NSA0MzFENjkwOTdBOEMgQzFCQjYwMEVDNzRFIDUxMjBCOTEyQTJCQSBcCisgICAgICBFRURGNjQxNzU0QzAgODIwNzAwMTY2NEI3IDdGRkZGRjE0NDUzRiA4MDAwMDAxMjk0RTYgXAorICAgICAgNDk5QzFCMEVCM0IyIDUyQjczRTBEQkNBMCBFRkIyQjIwRjVGRDggQ0UzQ0RCMEZCRTEyIFwKKyAgICAgIEU0QjQ5QzBDRUEyRCA2MzQ0QTgwQTVBN0MgMDhDOEZFMEExRkZFIDJCQjk4NjBCMEEwRSBcCisgICAgICA1MTQ4NkYwRTQ0RTEgOEJDQzY0MTEzQjA1IEI2RjRFQzBFRUIzNiA0NDEzMTcwQTVCNDggXAorICAgICAgIiIiKQorICAgIGlmIHN5cy5ieXRlb3JkZXIgIT0gJ2JpZyc6CisgICAgICAgIGZyYW1lcyA9IGF1ZGlvdGVzdHMuYnl0ZXN3YXAzKGZyYW1lcykKKworCitjbGFzcyBXYXZlUENNMzJUZXN0KFdhdmVUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgc25kZmlsZW5hbWUgPSAncGx1Y2stcGNtMzIud2F2JworICAgIHNuZGZpbGVuZnJhbWVzID0gMzMwNworICAgIG5jaGFubmVscyA9IDIKKyAgICBzYW1wd2lkdGggPSA0CisgICAgZnJhbWVyYXRlID0gMTEwMjUKKyAgICBuZnJhbWVzID0gNDgKKyAgICBjb21wdHlwZSA9ICdOT05FJworICAgIGNvbXBuYW1lID0gJ25vdCBjb21wcmVzc2VkJworICAgIGZyYW1lcyA9IGF1ZGlvdGVzdHMuZnJvbWhleCgiIiJcCisgICAgICAwMjJENjVCQ0ZGRUI5RDkyIDRCNUEwRjgwMDBGQTU0OUMgMzExM0MzNDAwNEVFMkJDMCA4MERDRDY4MDA4NDMwM0UwIFwKKyAgICAgIENCREVDMEMwMDZCMjYxNDAgNDhBOTk4MDAwM0YyRjhGQyBCRkU4MjQ4MDAxQjA3RDkyIDAzNkJGQjYwRkU3QjVEMzQgXAorICAgICAgQjg1NzU2MDBGQTNFQzkyMCBCNEIwNTUwMEYzNTAyQkMwIDI5OTgzMDAwRUJDQjYyNDAgMUE1Q0E3QTBFNkQ5OUE2MCBcCisgICAgICBFREZBM0U4MEU0OTFCRDQwIEM2MjVFQjgwRTI3ODg0QTAgMEUwNUE5QTBFMEI2Q0ZFMCBFRjI5Mjk0MEUwMjkyMjgwIFwKKyAgICAgIDU3NThEODAwRTI3MDY3MDAgRkIzNTU3RDhFODNFMTY0MCAxMzc3QkYwMEVGODQwMjgwIEQ4MkM1QjgwRjcyNzJBODAgXAorICAgICAgOTc4RjE2MDBGQjc3NDU2MCBGNUY4NjUxMEZDMTAxMzY0IDA4NjYzNUEwRkI5QzRFMjAgREYzMEZDNDBGQjQwRUUyOCBcCisgICAgICAxMTdGRTBBMEZBMzQzOEIwIDNFRTZCODQwRkI1QUMzRjAgQkM3N0EzODBGQ0IyRjQ1NCA2NkQ2REE4MEZGNUYzMkI0IFwKKyAgICAgIENGMTNCOTgwMDQxMjc1QjAgNDMxRDY5ODAwOTdBOEMwMCBDMUJCNjAwMDBFQzc0RTAwIDUxMjBCOTgwMTJBMkJBQTAgXAorICAgICAgRUVERjY0QzAxNzU0QzA2MCA4MjA3MDAwMDE2NjRCNzgwIDdGRkZGRkZGMTQ0NTNGNDAgODAwMDAwMDAxMjk0RTZFMCBcCisgICAgICA0OTlDMUIwMDBFQjNCMjcwIDUyQjczRTAwMERCQ0EwMjAgRUZCMkIyRTAwRjVGRDg4MCBDRTNDREI0MDBGQkUxMjcwIFwKKyAgICAgIEU0QjQ5Q0MwMENFQTJEOTAgNjM0NEE4ODAwQTVBN0NBMCAwOEM4RkU4MDBBMUZGRUUwIDJCQjk4NkMwMEIwQTBFMDAgXAorICAgICAgNTE0ODZGODAwRTQ0RTE5MCA4QkNDNjQ4MDExM0IwNTgwIEI2RjRFQzAwMEVFQjM2MzAgNDQxMzE3ODAwQTVCNDhBMCBcCisgICAgICAiIiIpCisgICAgaWYgc3lzLmJ5dGVvcmRlciAhPSAnYmlnJzoKKyAgICAgICAgZnJhbWVzID0gYXVkaW90ZXN0cy5ieXRlc3dhcDQoZnJhbWVzKQorCisgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAnYmlnJzoKKyAgICAgICAgQHVuaXR0ZXN0LmV4cGVjdGVkRmFpbHVyZQorICAgICAgICBkZWYgdGVzdF91bnNlZWthYmxlX2luY29tcGxldGVkX3dyaXRlKHNlbGYpOgorICAgICAgICAgICAgc3VwZXIoKS50ZXN0X3Vuc2Vla2FibGVfaW5jb21wbGV0ZWRfd3JpdGUoKQorCiAKIGRlZiB0ZXN0X21haW4oKToKLSAgICBydW5fdW5pdHRlc3QoVGVzdFdhdmUpCisgICAgcnVuX3VuaXR0ZXN0KFdhdmVQQ004VGVzdCwgV2F2ZVBDTTE2VGVzdCwgV2F2ZVBDTTI0VGVzdCwgV2F2ZVBDTTMyVGVzdCkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93ZWFrcmVmLnB5IGIvTGliL3Rlc3QvdGVzdF93ZWFrcmVmLnB5CmluZGV4IGJjMjk4MmYuLjQwZTE0NzMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2Vha3JlZi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dlYWtyZWYucHkKQEAgLTQsNiArNCw4IEBACiBpbXBvcnQgVXNlckxpc3QKIGltcG9ydCB3ZWFrcmVmCiBpbXBvcnQgb3BlcmF0b3IKK2ltcG9ydCBjb250ZXh0bGliCitpbXBvcnQgY29weQogCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogCkBAIC0zMyw2ICszNSwyNyBAQAogICAgIHJldHVybiBDLm1ldGhvZAogCiAKK2NsYXNzIE9iamVjdDoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5hcmcgPSBhcmcKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiPE9iamVjdCAlcj4iICUgc2VsZi5hcmcKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgT2JqZWN0KToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmFyZyA9PSBvdGhlci5hcmcKKyAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIE9iamVjdCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5hcmcgIT0gb3RoZXIuYXJnCisgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5hcmcpCisKK2NsYXNzIFJlZkN5Y2xlOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5jeWNsZSA9IHNlbGYKKworCiBjbGFzcyBUZXN0QmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgc2V0VXAoc2VsZik6CkBAIC03MCwxMSArOTMsOSBAQAogICAgICAgICByZWYxID0gd2Vha3JlZi5yZWYobywgc2VsZi5jYWxsYmFjaykKICAgICAgICAgcmVmMiA9IHdlYWtyZWYucmVmKG8sIHNlbGYuY2FsbGJhY2spCiAgICAgICAgIGRlbCBvCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWYxKCkgaXMgTm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCByZWZlcmVuY2UgdG8gYmUgaW52YWxpZGF0ZWQiKQotICAgICAgICBzZWxmLmFzc2VydFRydWUocmVmMigpIGlzIE5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgcmVmZXJlbmNlIHRvIGJlIGludmFsaWRhdGVkIikKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuY2JjYWxsZWQgPT0gMiwKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmVmMSgpLCAiZXhwZWN0ZWQgcmVmZXJlbmNlIHRvIGJlIGludmFsaWRhdGVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmVmMigpLCAiZXhwZWN0ZWQgcmVmZXJlbmNlIHRvIGJlIGludmFsaWRhdGVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNiY2FsbGVkLCAyLAogICAgICAgICAgICAgICAgICAgICAgImNhbGxiYWNrIG5vdCBjYWxsZWQgdGhlIHJpZ2h0IG51bWJlciBvZiB0aW1lcyIpCiAKICAgICBkZWYgdGVzdF9tdWx0aXBsZV9zZWxmcmVmX2NhbGxiYWNrcyhzZWxmKToKQEAgLTEwOCwxNSArMTI5LDE1IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHdlYWtyZWYuUmVmZXJlbmNlRXJyb3IsIGNoZWNrLCByZWYxKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh3ZWFrcmVmLlJlZmVyZW5jZUVycm9yLCBjaGVjaywgcmVmMikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMod2Vha3JlZi5SZWZlcmVuY2VFcnJvciwgYm9vbCwgd2Vha3JlZi5wcm94eShDKCkpKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5jYmNhbGxlZCA9PSAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2JjYWxsZWQsIDIpCiAKICAgICBkZWYgY2hlY2tfYmFzaWNfcmVmKHNlbGYsIGZhY3RvcnkpOgogICAgICAgICBvID0gZmFjdG9yeSgpCiAgICAgICAgIHJlZiA9IHdlYWtyZWYucmVmKG8pCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWYoKSBpcyBub3QgTm9uZSwKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUocmVmKCksCiAgICAgICAgICAgICAgICAgICAgICAid2VhayByZWZlcmVuY2UgdG8gbGl2ZSBvYmplY3Qgc2hvdWxkIGJlIGxpdmUiKQogICAgICAgICBvMiA9IHJlZigpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvIGlzIG8yLAorICAgICAgICBzZWxmLmFzc2VydElzKG8sIG8yLAogICAgICAgICAgICAgICAgICAgICAgIjxyZWY+KCkgc2hvdWxkIHJldHVybiBvcmlnaW5hbCBvYmplY3QgaWYgbGl2ZSIpCiAKICAgICBkZWYgY2hlY2tfYmFzaWNfY2FsbGJhY2soc2VsZiwgZmFjdG9yeSk6CkBAIC0xMjQsOSArMTQ1LDkgQEAKICAgICAgICAgbyA9IGZhY3RvcnkoKQogICAgICAgICByZWYgPSB3ZWFrcmVmLnJlZihvLCBzZWxmLmNhbGxiYWNrKQogICAgICAgICBkZWwgbwotICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5jYmNhbGxlZCA9PSAxLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2JjYWxsZWQsIDEsCiAgICAgICAgICAgICAgICAgICAgICAiY2FsbGJhY2sgZGlkIG5vdCBwcm9wZXJseSBzZXQgJ2NiY2FsbGVkJyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWYoKSBpcyBOb25lLAorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZWYoKSwKICAgICAgICAgICAgICAgICAgICAgICJyZWYyIHNob3VsZCBiZSBkZWFkIGFmdGVyIGRlbGV0aW5nIG9iamVjdCByZWZlcmVuY2UiKQogCiAgICAgZGVmIHRlc3RfcmVmX3JldXNlKHNlbGYpOgpAQCAtMTM2LDE5ICsxNTcsMTkgQEAKICAgICAgICAgIyBiZXR3ZWVuIHRoZXNlIHR3bzsgaXQgc2hvdWxkIG1ha2Ugbm8gZGlmZmVyZW5jZQogICAgICAgICBwcm94eSA9IHdlYWtyZWYucHJveHkobykKICAgICAgICAgcmVmMiA9IHdlYWtyZWYucmVmKG8pCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWYxIGlzIHJlZjIsCisgICAgICAgIHNlbGYuYXNzZXJ0SXMocmVmMSwgcmVmMiwKICAgICAgICAgICAgICAgICAgICAgICJyZWZlcmVuY2Ugb2JqZWN0IHcvb3V0IGNhbGxiYWNrIHNob3VsZCBiZSByZS11c2VkIikKIAogICAgICAgICBvID0gQygpCiAgICAgICAgIHByb3h5ID0gd2Vha3JlZi5wcm94eShvKQogICAgICAgICByZWYxID0gd2Vha3JlZi5yZWYobykKICAgICAgICAgcmVmMiA9IHdlYWtyZWYucmVmKG8pCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWYxIGlzIHJlZjIsCisgICAgICAgIHNlbGYuYXNzZXJ0SXMocmVmMSwgcmVmMiwKICAgICAgICAgICAgICAgICAgICAgICJyZWZlcmVuY2Ugb2JqZWN0IHcvb3V0IGNhbGxiYWNrIHNob3VsZCBiZSByZS11c2VkIikKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdlYWtyZWYuZ2V0d2Vha3JlZmNvdW50KG8pID09IDIsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2Vha3JlZi5nZXR3ZWFrcmVmY291bnQobyksIDIsCiAgICAgICAgICAgICAgICAgICAgICAid3Jvbmcgd2VhayByZWYgY291bnQgZm9yIG9iamVjdCIpCiAgICAgICAgIGRlbCBwcm94eQotICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha3JlZi5nZXR3ZWFrcmVmY291bnQobykgPT0gMSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3ZWFrcmVmLmdldHdlYWtyZWZjb3VudChvKSwgMSwKICAgICAgICAgICAgICAgICAgICAgICJ3cm9uZyB3ZWFrIHJlZiBjb3VudCBmb3Igb2JqZWN0IGFmdGVyIGRlbGV0aW5nIHByb3h5IikKIAogICAgIGRlZiB0ZXN0X3Byb3h5X3JldXNlKHNlbGYpOgpAQCAtMTU2LDcgKzE3Nyw3IEBACiAgICAgICAgIHByb3h5MSA9IHdlYWtyZWYucHJveHkobykKICAgICAgICAgcmVmID0gd2Vha3JlZi5yZWYobykKICAgICAgICAgcHJveHkyID0gd2Vha3JlZi5wcm94eShvKQotICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkxIGlzIHByb3h5MiwKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhwcm94eTEsIHByb3h5MiwKICAgICAgICAgICAgICAgICAgICAgICJwcm94eSBvYmplY3Qgdy9vdXQgY2FsbGJhY2sgc2hvdWxkIGhhdmUgYmVlbiByZS11c2VkIikKIAogICAgIGRlZiB0ZXN0X2Jhc2ljX3Byb3h5KHNlbGYpOgpAQCAtMjM4LDE5ICsyNTksMTkgQEAKICAgICAgICAgbyA9IE9iamVjdCgxKQogICAgICAgICBwMSA9IG1ha2VyZWYobywgTm9uZSkKICAgICAgICAgcDIgPSBtYWtlcmVmKG8sIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwMSBpcyBwMiwgImJvdGggY2FsbGJhY2tzIHdlcmUgTm9uZSBpbiB0aGUgQyBBUEkiKQorICAgICAgICBzZWxmLmFzc2VydElzKHAxLCBwMiwgImJvdGggY2FsbGJhY2tzIHdlcmUgTm9uZSBpbiB0aGUgQyBBUEkiKQogICAgICAgICBkZWwgcDEsIHAyCiAgICAgICAgIHAxID0gbWFrZXJlZihvKQogICAgICAgICBwMiA9IG1ha2VyZWYobywgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHAxIGlzIHAyLCAiY2FsbGJhY2tzIHdlcmUgTlVMTCwgTm9uZSBpbiB0aGUgQyBBUEkiKQorICAgICAgICBzZWxmLmFzc2VydElzKHAxLCBwMiwgImNhbGxiYWNrcyB3ZXJlIE5VTEwsIE5vbmUgaW4gdGhlIEMgQVBJIikKICAgICAgICAgZGVsIHAxLCBwMgogICAgICAgICBwMSA9IG1ha2VyZWYobykKICAgICAgICAgcDIgPSBtYWtlcmVmKG8pCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwMSBpcyBwMiwgImJvdGggY2FsbGJhY2tzIHdlcmUgTlVMTCBpbiB0aGUgQyBBUEkiKQorICAgICAgICBzZWxmLmFzc2VydElzKHAxLCBwMiwgImJvdGggY2FsbGJhY2tzIHdlcmUgTlVMTCBpbiB0aGUgQyBBUEkiKQogICAgICAgICBkZWwgcDEsIHAyCiAgICAgICAgIHAxID0gbWFrZXJlZihvLCBOb25lKQogICAgICAgICBwMiA9IG1ha2VyZWYobykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHAxIGlzIHAyLCAiY2FsbGJhY2tzIHdlcmUgTm9uZSwgTlVMTCBpbiB0aGUgQyBBUEkiKQorICAgICAgICBzZWxmLmFzc2VydElzKHAxLCBwMiwgImNhbGxiYWNrcyB3ZXJlIE5vbmUsIE5VTEwgaW4gdGhlIEMgQVBJIikKIAogICAgIGRlZiB0ZXN0X2NhbGxhYmxlX3Byb3h5KHNlbGYpOgogICAgICAgICBvID0gQ2FsbGFibGUoKQpAQCAtMjU4LDEzICsyNzksMTMgQEAKIAogICAgICAgICBzZWxmLmNoZWNrX3Byb3h5KG8sIHJlZjEpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUocmVmMSkgaXMgd2Vha3JlZi5DYWxsYWJsZVByb3h5VHlwZSwKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKHJlZjEpLCB3ZWFrcmVmLkNhbGxhYmxlUHJveHlUeXBlLAogICAgICAgICAgICAgICAgICAgICAgInByb3h5IGlzIG5vdCBvZiBjYWxsYWJsZSB0eXBlIikKICAgICAgICAgcmVmMSgndHdpbmtpZXMhJykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG8uYmFyID09ICd0d2lua2llcyEnLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8uYmFyLCAndHdpbmtpZXMhJywKICAgICAgICAgICAgICAgICAgICAgICJjYWxsIHRocm91Z2ggcHJveHkgbm90IHBhc3NlZCB0aHJvdWdoIHRvIG9yaWdpbmFsIikKICAgICAgICAgcmVmMSh4PSdTcGxhdC4nKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoby5iYXIgPT0gJ1NwbGF0LicsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoby5iYXIsICdTcGxhdC4nLAogICAgICAgICAgICAgICAgICAgICAgImNhbGwgdGhyb3VnaCBwcm94eSBub3QgcGFzc2VkIHRocm91Z2ggdG8gb3JpZ2luYWwiKQogCiAgICAgICAgICMgZXhwZWN0IGR1ZSB0byB0b28gZmV3IGFyZ3MKQEAgLTI3NSwyNCArMjk2LDIzIEBACiAKICAgICBkZWYgY2hlY2tfcHJveHkoc2VsZiwgbywgcHJveHkpOgogICAgICAgICBvLmZvbyA9IDEKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb3h5LmZvbyA9PSAxLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3h5LmZvbywgMSwKICAgICAgICAgICAgICAgICAgICAgICJwcm94eSBkb2VzIG5vdCByZWZsZWN0IGF0dHJpYnV0ZSBhZGRpdGlvbiIpCiAgICAgICAgIG8uZm9vID0gMgotICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkuZm9vID09IDIsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJveHkuZm9vLCAyLAogICAgICAgICAgICAgICAgICAgICAgInByb3h5IGRvZXMgbm90IHJlZmxlY3QgYXR0cmlidXRlIG1vZGlmaWNhdGlvbiIpCiAgICAgICAgIGRlbCBvLmZvbwotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGhhc2F0dHIocHJveHksICdmb28nKSwKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKHByb3h5LCAnZm9vJyksCiAgICAgICAgICAgICAgICAgICAgICAicHJveHkgZG9lcyBub3QgcmVmbGVjdCBhdHRyaWJ1dGUgcmVtb3ZhbCIpCiAKICAgICAgICAgcHJveHkuZm9vID0gMQotICAgICAgICBzZWxmLmFzc2VydFRydWUoby5mb28gPT0gMSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvLmZvbywgMSwKICAgICAgICAgICAgICAgICAgICAgICJvYmplY3QgZG9lcyBub3QgcmVmbGVjdCBhdHRyaWJ1dGUgYWRkaXRpb24gdmlhIHByb3h5IikKICAgICAgICAgcHJveHkuZm9vID0gMgotICAgICAgICBzZWxmLmFzc2VydFRydWUoCi0gICAgICAgICAgICBvLmZvbyA9PSAyLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8uZm9vLCAyLAogICAgICAgICAgICAgIm9iamVjdCBkb2VzIG5vdCByZWZsZWN0IGF0dHJpYnV0ZSBtb2RpZmljYXRpb24gdmlhIHByb3h5IikKICAgICAgICAgZGVsIHByb3h5LmZvbwotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGhhc2F0dHIobywgJ2ZvbycpLAorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIobywgJ2ZvbycpLAogICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCBkb2VzIG5vdCByZWZsZWN0IGF0dHJpYnV0ZSByZW1vdmFsIHZpYSBwcm94eSIpCiAKICAgICBkZWYgdGVzdF9wcm94eV9kZWxldGlvbihzZWxmKToKQEAgLTMxNiwyMSArMzM2LDIxIEBACiAgICAgICAgIG8gPSBDKCkKICAgICAgICAgcmVmMSA9IHdlYWtyZWYucmVmKG8pCiAgICAgICAgIHJlZjIgPSB3ZWFrcmVmLnJlZihvLCBzZWxmLmNhbGxiYWNrKQotICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha3JlZi5nZXR3ZWFrcmVmY291bnQobykgPT0gMiwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3ZWFrcmVmLmdldHdlYWtyZWZjb3VudChvKSwgMiwKICAgICAgICAgICAgICAgICAgICAgICJnb3Qgd3JvbmcgbnVtYmVyIG9mIHdlYWsgcmVmZXJlbmNlIG9iamVjdHMiKQogCiAgICAgICAgIHByb3h5MSA9IHdlYWtyZWYucHJveHkobykKICAgICAgICAgcHJveHkyID0gd2Vha3JlZi5wcm94eShvLCBzZWxmLmNhbGxiYWNrKQotICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha3JlZi5nZXR3ZWFrcmVmY291bnQobykgPT0gNCwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3ZWFrcmVmLmdldHdlYWtyZWZjb3VudChvKSwgNCwKICAgICAgICAgICAgICAgICAgICAgICJnb3Qgd3JvbmcgbnVtYmVyIG9mIHdlYWsgcmVmZXJlbmNlIG9iamVjdHMiKQogCiAgICAgICAgIGRlbCByZWYxLCByZWYyLCBwcm94eTEsIHByb3h5MgotICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha3JlZi5nZXR3ZWFrcmVmY291bnQobykgPT0gMCwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3ZWFrcmVmLmdldHdlYWtyZWZjb3VudChvKSwgMCwKICAgICAgICAgICAgICAgICAgICAgICJ3ZWFrIHJlZmVyZW5jZSBvYmplY3RzIG5vdCB1bmxpbmtlZCBmcm9tIgogICAgICAgICAgICAgICAgICAgICAgIiByZWZlcmVudCB3aGVuIGRpc2NhcmRlZC4iKQogCiAgICAgICAgICMgYXNzdW1lcyBpbnRzIGRvIG5vdCBzdXBwb3J0IHdlYWtyZWZzCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrcmVmLmdldHdlYWtyZWZjb3VudCgxKSA9PSAwLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdlYWtyZWYuZ2V0d2Vha3JlZmNvdW50KDEpLCAwLAogICAgICAgICAgICAgICAgICAgICAgImdvdCB3cm9uZyBudW1iZXIgb2Ygd2VhayByZWZlcmVuY2Ugb2JqZWN0cyBmb3IgaW50IikKIAogICAgIGRlZiB0ZXN0X2dldHdlYWtyZWZzKHNlbGYpOgpAQCAtMzM4LDIyICszNTgsMjIgQEAKICAgICAgICAgcmVmMSA9IHdlYWtyZWYucmVmKG8sIHNlbGYuY2FsbGJhY2spCiAgICAgICAgIHJlZjIgPSB3ZWFrcmVmLnJlZihvLCBzZWxmLmNhbGxiYWNrKQogICAgICAgICBkZWwgcmVmMQotICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha3JlZi5nZXR3ZWFrcmVmcyhvKSA9PSBbcmVmMl0sCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2Vha3JlZi5nZXR3ZWFrcmVmcyhvKSwgW3JlZjJdLAogICAgICAgICAgICAgICAgICAgICAgImxpc3Qgb2YgcmVmcyBkb2VzIG5vdCBtYXRjaCIpCiAKICAgICAgICAgbyA9IEMoKQogICAgICAgICByZWYxID0gd2Vha3JlZi5yZWYobywgc2VsZi5jYWxsYmFjaykKICAgICAgICAgcmVmMiA9IHdlYWtyZWYucmVmKG8sIHNlbGYuY2FsbGJhY2spCiAgICAgICAgIGRlbCByZWYyCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrcmVmLmdldHdlYWtyZWZzKG8pID09IFtyZWYxXSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3ZWFrcmVmLmdldHdlYWtyZWZzKG8pLCBbcmVmMV0sCiAgICAgICAgICAgICAgICAgICAgICAibGlzdCBvZiByZWZzIGRvZXMgbm90IG1hdGNoIikKIAogICAgICAgICBkZWwgcmVmMQotICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha3JlZi5nZXR3ZWFrcmVmcyhvKSA9PSBbXSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3ZWFrcmVmLmdldHdlYWtyZWZzKG8pLCBbXSwKICAgICAgICAgICAgICAgICAgICAgICJsaXN0IG9mIHJlZnMgbm90IGNsZWFyZWQiKQogCiAgICAgICAgICMgYXNzdW1lcyBpbnRzIGRvIG5vdCBzdXBwb3J0IHdlYWtyZWZzCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrcmVmLmdldHdlYWtyZWZzKDEpID09IFtdLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdlYWtyZWYuZ2V0d2Vha3JlZnMoMSksIFtdLAogICAgICAgICAgICAgICAgICAgICAgImxpc3Qgb2YgcmVmcyBkb2VzIG5vdCBtYXRjaCBmb3IgaW50IikKIAogICAgIGRlZiB0ZXN0X25ld3N0eWxlX251bWJlcl9vcHMoc2VsZik6CkBAIC0zNjEsOCArMzgxLDggQEAKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgZiA9IEYoMi4wKQogICAgICAgICBwID0gd2Vha3JlZi5wcm94eShmKQotICAgICAgICBzZWxmLmFzc2VydFRydWUocCArIDEuMCA9PSAzLjApCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgxLjAgKyBwID09IDMuMCkgICMgdGhpcyB1c2VkIHRvIFNFR1YKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwICsgMS4wLCAzLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMS4wICsgcCwgMy4wKSAgIyB0aGlzIHVzZWQgdG8gU0VHVgogCiAgICAgZGVmIHRlc3RfY2FsbGJhY2tzX3Byb3RlY3RlZChzZWxmKToKICAgICAgICAgIyBDYWxsYmFja3MgcHJvdGVjdGVkIGZyb20gYWxyZWFkeS1zZXQgZXhjZXB0aW9ucz8KQEAgLTYxNSw3ICs2MzUsNyBAQAogICAgICAgICBjLndyID0gd2Vha3JlZi5yZWYoZCwgY2FsbGJhY2spICAgICAjIHRoaXMgd29uJ3QgdHJpZ2dlcgogICAgICAgICBkLndyID0gd2Vha3JlZi5yZWYoY2FsbGJhY2ssIGQuY2IpICAjIGRpdHRvCiAgICAgICAgIGV4dGVybmFsX3dyID0gd2Vha3JlZi5yZWYoY2FsbGJhY2ssIHNhZmVfY2FsbGJhY2spICAjIGJ1dCB0aGlzIHdpbGwKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV4dGVybmFsX3dyKCkgaXMgY2FsbGJhY2spCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZXh0ZXJuYWxfd3IoKSwgY2FsbGJhY2spCiAKICAgICAgICAgIyBUaGUgd2Vha3JlZnMgYXR0YWNoZWQgdG8gYyBhbmQgZCBzaG91bGQgZ2V0IGNsZWFyZWQsIHNvIHRoYXQKICAgICAgICAgIyBDLmNiIGlzIG5ldmVyIGNhbGxlZC4gIEJ1dCBleHRlcm5hbF93ciBpc24ndCBwYXJ0IG9mIHRoZSBjeWNsaWMKQEAgLTcwNSw2ICs3MjUsNzUgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiKCksIE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobCwgW2EsIGJdKQogCisgICAgZGVmIHRlc3RfZXF1YWxpdHkoc2VsZik6CisgICAgICAgICMgQWxpdmUgd2Vha3JlZnMgZGVmZXIgZXF1YWxpdHkgdGVzdGluZyB0byB0aGVpciB1bmRlcmx5aW5nIG9iamVjdC4KKyAgICAgICAgeCA9IE9iamVjdCgxKQorICAgICAgICB5ID0gT2JqZWN0KDEpCisgICAgICAgIHogPSBPYmplY3QoMikKKyAgICAgICAgYSA9IHdlYWtyZWYucmVmKHgpCisgICAgICAgIGIgPSB3ZWFrcmVmLnJlZih5KQorICAgICAgICBjID0gd2Vha3JlZi5yZWYoeikKKyAgICAgICAgZCA9IHdlYWtyZWYucmVmKHgpCisgICAgICAgICMgTm90ZSBob3cgd2UgZGlyZWN0bHkgdGVzdCB0aGUgb3BlcmF0b3JzIGhlcmUsIHRvIHN0cmVzcyBib3RoCisgICAgICAgICMgX19lcV9fIGFuZCBfX25lX18uCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhID09IGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoYSAhPSBiKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGEgPT0gYykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgIT0gYykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgPT0gZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShhICE9IGQpCisgICAgICAgIGRlbCB4LCB5LCB6CisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBmb3IgciBpbiBhLCBiLCBjOgorICAgICAgICAgICAgIyBTYW5pdHkgY2hlY2sKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMocigpLCBOb25lKQorICAgICAgICAjIERlYWQgd2Vha3JlZnMgY29tcGFyZSBieSBpZGVudGl0eTogd2hldGhlciBgYWAgYW5kIGBkYCBhcmUgdGhlCisgICAgICAgICMgc2FtZSB3ZWFrcmVmIG9iamVjdCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwsIHNpbmNlIHRoZXkgcG9pbnRlZAorICAgICAgICAjIHRvIHRoZSBzYW1lIG9yaWdpbmFsIG9iamVjdCBhbmQgZGlkbid0IGhhdmUgYSBjYWxsYmFjay4KKyAgICAgICAgIyAoc2VlIGlzc3VlICMxNjQ1MykuCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoYSA9PSBiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSAhPSBiKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGEgPT0gYykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgIT0gYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhID09IGQsIGEgaXMgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhICE9IGQsIGEgaXMgbm90IGQpCisKKyAgICBkZWYgdGVzdF9oYXNoaW5nKHNlbGYpOgorICAgICAgICAjIEFsaXZlIHdlYWtyZWZzIGhhc2ggdGhlIHNhbWUgYXMgdGhlIHVuZGVybHlpbmcgb2JqZWN0CisgICAgICAgIHggPSBPYmplY3QoNDIpCisgICAgICAgIHkgPSBPYmplY3QoNDIpCisgICAgICAgIGEgPSB3ZWFrcmVmLnJlZih4KQorICAgICAgICBiID0gd2Vha3JlZi5yZWYoeSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGEpLCBoYXNoKDQyKSkKKyAgICAgICAgZGVsIHgsIHkKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgICMgRGVhZCB3ZWFrcmVmczoKKyAgICAgICAgIyAtIHJldGFpbiB0aGVpciBoYXNoIGlzIHRoZXkgd2VyZSBoYXNoZWQgd2hlbiBhbGl2ZTsKKyAgICAgICAgIyAtIG90aGVyd2lzZSwgY2Fubm90IGJlIGhhc2hlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGEpLCBoYXNoKDQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBoYXNoLCBiKQorCisgICAgZGVmIHRlc3RfdHJhc2hjYW5fMTY2MDIoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzE2NjAyOiB3aGVuIGEgd2Vha3JlZidzIHRhcmdldCB3YXMgcGFydCBvZiBhIGxvbmcKKyAgICAgICAgIyBkZWFsbG9jYXRpb24gY2hhaW4sIHRoZSB0cmFzaGNhbiBtZWNoYW5pc20gY291bGQgZGVsYXkgY2xlYXJpbmcKKyAgICAgICAgIyBvZiB0aGUgd2Vha3JlZiBhbmQgbWFrZSB0aGUgdGFyZ2V0IG9iamVjdCB2aXNpYmxlIGZyb20gb3V0c2lkZQorICAgICAgICAjIGNvZGUgZXZlbiB0aG91Z2ggaXRzIHJlZmNvdW50IGhhZCBkcm9wcGVkIHRvIDAuICBBIGNyYXNoIGVuc3VlZC4KKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCk6CisgICAgICAgICAgICAgICAgaWYgbm90IHBhcmVudDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgd3NlbGYgPSB3ZWFrcmVmLnJlZihzZWxmKQorICAgICAgICAgICAgICAgIGRlZiBjYih3cGFyZW50KToKKyAgICAgICAgICAgICAgICAgICAgbyA9IHdzZWxmKCkKKyAgICAgICAgICAgICAgICBzZWxmLndwYXJlbnQgPSB3ZWFrcmVmLnJlZihwYXJlbnQsIGNiKQorCisgICAgICAgIGQgPSB3ZWFrcmVmLldlYWtLZXlEaWN0aW9uYXJ5KCkKKyAgICAgICAgcm9vdCA9IGMgPSBDKE5vbmUpCisgICAgICAgIGZvciBuIGluIHJhbmdlKDEwMCk6CisgICAgICAgICAgICBkW2NdID0gYyA9IEMoYykKKyAgICAgICAgZGVsIHJvb3QKKyAgICAgICAgZ2MuY29sbGVjdCgpCisKIAogY2xhc3MgU3ViY2xhc3NhYmxlV2Vha3JlZlRlc3RDYXNlKFRlc3RCYXNlKToKIApAQCAtNzE4LDExICs4MDcsMTEgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIoTXlSZWYsIHNlbGYpLl9fY2FsbF9fKCkKICAgICAgICAgbyA9IE9iamVjdCgiZm9vIikKICAgICAgICAgbXIgPSBNeVJlZihvLCB2YWx1ZT0yNCkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1yKCkgaXMgbykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhtcigpLCBvKQogICAgICAgICBzZWxmLmFzc2VydFRydWUobXIuY2FsbGVkKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1yLnZhbHVlLCAyNCkKICAgICAgICAgZGVsIG8KLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1yKCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUobXIoKSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1yLmNhbGxlZCkKIAogICAgIGRlZiB0ZXN0X3N1YmNsYXNzX3JlZnNfZG9udF9yZXBsYWNlX3N0YW5kYXJkX3JlZnMoc2VsZik6CkBAIC03MzEsMTQgKzgyMCwxNCBAQAogICAgICAgICBvID0gT2JqZWN0KDQyKQogICAgICAgICByMSA9IE15UmVmKG8pCiAgICAgICAgIHIyID0gd2Vha3JlZi5yZWYobykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHIxIGlzIG5vdCByMikKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChyMSwgcjIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2Vha3JlZi5nZXR3ZWFrcmVmcyhvKSwgW3IyLCByMV0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2Vha3JlZi5nZXR3ZWFrcmVmY291bnQobyksIDIpCiAgICAgICAgIHIzID0gTXlSZWYobykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3ZWFrcmVmLmdldHdlYWtyZWZjb3VudChvKSwgMykKICAgICAgICAgcmVmcyA9IHdlYWtyZWYuZ2V0d2Vha3JlZnMobykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVmcyksIDMpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyMiBpcyByZWZzWzBdKQorICAgICAgICBzZWxmLmFzc2VydElzKHIyLCByZWZzWzBdKQogICAgICAgICBzZWxmLmFzc2VydEluKHIxLCByZWZzWzE6XSkKICAgICAgICAgc2VsZi5hc3NlcnRJbihyMywgcmVmc1sxOl0pCiAKQEAgLTc0OCw3ICs4MzcsNyBAQAogICAgICAgICBvID0gT2JqZWN0KDQyKQogICAgICAgICByMSA9IE15UmVmKG8sIGlkKQogICAgICAgICByMiA9IE15UmVmKG8sIHN0cikKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHIxIGlzIG5vdCByMikKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChyMSwgcjIpCiAgICAgICAgIHJlZnMgPSB3ZWFrcmVmLmdldHdlYWtyZWZzKG8pCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4ocjEsIHJlZnMpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4ocjIsIHJlZnMpCkBAIC04MDksNDAgKzg5OCw5NCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2JjYWxsZWQsIDApCiAKIAotY2xhc3MgT2JqZWN0OgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmcpOgotICAgICAgICBzZWxmLmFyZyA9IGFyZwotICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuICI8T2JqZWN0ICVyPiIgJSBzZWxmLmFyZwotCi0KIGNsYXNzIE1hcHBpbmdUZXN0Q2FzZShUZXN0QmFzZSk6CiAKICAgICBDT1VOVCA9IDEwCiAKKyAgICBkZWYgY2hlY2tfbGVuX2N5Y2xlcyhzZWxmLCBkaWN0X3R5cGUsIGNvbnMpOgorICAgICAgICBOID0gMjAKKyAgICAgICAgaXRlbXMgPSBbUmVmQ3ljbGUoKSBmb3IgaSBpbiByYW5nZShOKV0KKyAgICAgICAgZGN0ID0gZGljdF90eXBlKGNvbnMoaSwgbykgZm9yIGksIG8gaW4gZW51bWVyYXRlKGl0ZW1zKSkKKyAgICAgICAgIyBLZWVwIGFuIGl0ZXJhdG9yIGFsaXZlCisgICAgICAgIGl0ID0gZGN0Lml0ZXJpdGVtcygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5leHQoaXQpCisgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgcGFzcworICAgICAgICBkZWwgaXRlbXMKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIG4xID0gbGVuKGRjdCkKKyAgICAgICAgbGlzdChpdCkKKyAgICAgICAgZGVsIGl0CisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBuMiA9IGxlbihkY3QpCisgICAgICAgICMgaXRlcmF0aW9uIHNob3VsZCBwcmV2ZW50IGdhcmJhZ2UgY29sbGVjdGlvbiBoZXJlCisgICAgICAgICMgTm90ZSB0aGF0IHRoaXMgaXMgYSB0ZXN0IG9uIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4gIFRoZSByZXF1aXJlbWVudAorICAgICAgICAjIGlzIG9ubHkgdG8gcHJvdmlkZSBzdGFibGUgaXRlcmF0aW9uLCBub3QgdGhhdCB0aGUgc2l6ZSBvZiB0aGUgY29udGFpbmVyCisgICAgICAgICMgc3RheSBmaXhlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMSwgMjApCisgICAgICAgICNzZWxmLmFzc2VydEluKG4xLCAoMCwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjIsIDApCisKKyAgICBkZWYgdGVzdF93ZWFrX2tleWVkX2xlbl9jeWNsZXMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfbGVuX2N5Y2xlcyh3ZWFrcmVmLldlYWtLZXlEaWN0aW9uYXJ5LCBsYW1iZGEgbiwgazogKGssIG4pKQorCisgICAgZGVmIHRlc3Rfd2Vha192YWx1ZWRfbGVuX2N5Y2xlcyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19sZW5fY3ljbGVzKHdlYWtyZWYuV2Vha1ZhbHVlRGljdGlvbmFyeSwgbGFtYmRhIG4sIGs6IChuLCBrKSkKKworICAgIGRlZiBjaGVja19sZW5fcmFjZShzZWxmLCBkaWN0X3R5cGUsIGNvbnMpOgorICAgICAgICAjIEV4dGVuZGVkIHNhbml0eSBjaGVja3MgZm9yIGxlbigpIGluIHRoZSBmYWNlIG9mIGN5Y2xpYyBjb2xsZWN0aW9uCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChnYy5zZXRfdGhyZXNob2xkLCAqZ2MuZ2V0X3RocmVzaG9sZCgpKQorICAgICAgICBmb3IgdGggaW4gcmFuZ2UoMSwgMTAwKToKKyAgICAgICAgICAgIE4gPSAyMAorICAgICAgICAgICAgZ2MuY29sbGVjdCgwKQorICAgICAgICAgICAgZ2Muc2V0X3RocmVzaG9sZCh0aCwgdGgsIHRoKQorICAgICAgICAgICAgaXRlbXMgPSBbUmVmQ3ljbGUoKSBmb3IgaSBpbiByYW5nZShOKV0KKyAgICAgICAgICAgIGRjdCA9IGRpY3RfdHlwZShjb25zKG8pIGZvciBvIGluIGl0ZW1zKQorICAgICAgICAgICAgZGVsIGl0ZW1zCisgICAgICAgICAgICAjIEFsbCBpdGVtcyB3aWxsIGJlIGNvbGxlY3RlZCBhdCBuZXh0IGdhcmJhZ2UgY29sbGVjdGlvbiBwYXNzCisgICAgICAgICAgICBpdCA9IGRjdC5pdGVyaXRlbXMoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG5leHQoaXQpCisgICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBuMSA9IGxlbihkY3QpCisgICAgICAgICAgICBkZWwgaXQKKyAgICAgICAgICAgIG4yID0gbGVuKGRjdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKG4xLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwobjEsIE4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChuMiwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKG4yLCBuMSkKKworICAgIGRlZiB0ZXN0X3dlYWtfa2V5ZWRfbGVuX3JhY2Uoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfbGVuX3JhY2Uod2Vha3JlZi5XZWFrS2V5RGljdGlvbmFyeSwgbGFtYmRhIGs6IChrLCAxKSkKKworICAgIGRlZiB0ZXN0X3dlYWtfdmFsdWVkX2xlbl9yYWNlKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2xlbl9yYWNlKHdlYWtyZWYuV2Vha1ZhbHVlRGljdGlvbmFyeSwgbGFtYmRhIGs6ICgxLCBrKSkKKwogICAgIGRlZiB0ZXN0X3dlYWtfdmFsdWVzKHNlbGYpOgogICAgICAgICAjCiAgICAgICAgICMgIFRoaXMgZXhlcmNpc2VzIGQuY29weSgpLCBkLml0ZW1zKCksIGRbXSwgZGVsIGRbXSwgbGVuKGQpLgogICAgICAgICAjCiAgICAgICAgIGRpY3QsIG9iamVjdHMgPSBzZWxmLm1ha2Vfd2Vha192YWx1ZWRfZGljdCgpCiAgICAgICAgIGZvciBvIGluIG9iamVjdHM6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha3JlZi5nZXR3ZWFrcmVmY291bnQobykgPT0gMSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2Vha3JlZi5nZXR3ZWFrcmVmY291bnQobyksIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIndyb25nIG51bWJlciBvZiB3ZWFrIHJlZmVyZW5jZXMgdG8gJXIhIiAlIG8pCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobyBpcyBkaWN0W28uYXJnXSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMobywgZGljdFtvLmFyZ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIndyb25nIG9iamVjdCByZXR1cm5lZCBieSB3ZWFrIGRpY3QhIikKICAgICAgICAgaXRlbXMxID0gZGljdC5pdGVtcygpCiAgICAgICAgIGl0ZW1zMiA9IGRpY3QuY29weSgpLml0ZW1zKCkKICAgICAgICAgaXRlbXMxLnNvcnQoKQogICAgICAgICBpdGVtczIuc29ydCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpdGVtczEgPT0gaXRlbXMyLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGl0ZW1zMSwgaXRlbXMyLAogICAgICAgICAgICAgICAgICAgICAgImNsb25pbmcgb2Ygd2Vhay12YWx1ZWQgZGljdGlvbmFyeSBkaWQgbm90IHdvcmshIikKICAgICAgICAgZGVsIGl0ZW1zMSwgaXRlbXMyCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZGljdCkgPT0gc2VsZi5DT1VOVCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZGljdCksIHNlbGYuQ09VTlQpCiAgICAgICAgIGRlbCBvYmplY3RzWzBdCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZGljdCkgPT0gKHNlbGYuQ09VTlQgLSAxKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZGljdCksIChzZWxmLkNPVU5UIC0gMSksCiAgICAgICAgICAgICAgICAgICAgICAiZGVsZXRpbmcgb2JqZWN0IGRpZCBub3QgY2F1c2UgZGljdGlvbmFyeSB1cGRhdGUiKQogICAgICAgICBkZWwgb2JqZWN0cywgbwotICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGRpY3QpID09IDAsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRpY3QpLCAwLAogICAgICAgICAgICAgICAgICAgICAgImRlbGV0aW5nIHRoZSB2YWx1ZXMgZGlkIG5vdCBjbGVhciB0aGUgZGljdGlvbmFyeSIpCiAgICAgICAgICMgcmVncmVzc2lvbiBvbiBTRiBidWcgIzQ0NzE1MjoKICAgICAgICAgZGljdCA9IHdlYWtyZWYuV2Vha1ZhbHVlRGljdGlvbmFyeSgpCkBAIC04NTcsMjEgKzEwMDAsMjEgQEAKICAgICAgICAgIwogICAgICAgICBkaWN0LCBvYmplY3RzID0gc2VsZi5tYWtlX3dlYWtfa2V5ZWRfZGljdCgpCiAgICAgICAgIGZvciBvIGluIG9iamVjdHM6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha3JlZi5nZXR3ZWFrcmVmY291bnQobykgPT0gMSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2Vha3JlZi5nZXR3ZWFrcmVmY291bnQobyksIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIndyb25nIG51bWJlciBvZiB3ZWFrIHJlZmVyZW5jZXMgdG8gJXIhIiAlIG8pCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoby5hcmcgaXMgZGljdFtvXSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoby5hcmcsIGRpY3Rbb10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIndyb25nIG9iamVjdCByZXR1cm5lZCBieSB3ZWFrIGRpY3QhIikKICAgICAgICAgaXRlbXMxID0gZGljdC5pdGVtcygpCiAgICAgICAgIGl0ZW1zMiA9IGRpY3QuY29weSgpLml0ZW1zKCkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNldChpdGVtczEpID09IHNldChpdGVtczIpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChpdGVtczEpLCBzZXQoaXRlbXMyKSwKICAgICAgICAgICAgICAgICAgICAgICJjbG9uaW5nIG9mIHdlYWsta2V5ZWQgZGljdGlvbmFyeSBkaWQgbm90IHdvcmshIikKICAgICAgICAgZGVsIGl0ZW1zMSwgaXRlbXMyCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZGljdCkgPT0gc2VsZi5DT1VOVCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZGljdCksIHNlbGYuQ09VTlQpCiAgICAgICAgIGRlbCBvYmplY3RzWzBdCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZGljdCkgPT0gKHNlbGYuQ09VTlQgLSAxKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZGljdCksIChzZWxmLkNPVU5UIC0gMSksCiAgICAgICAgICAgICAgICAgICAgICAiZGVsZXRpbmcgb2JqZWN0IGRpZCBub3QgY2F1c2UgZGljdGlvbmFyeSB1cGRhdGUiKQogICAgICAgICBkZWwgb2JqZWN0cywgbwotICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGRpY3QpID09IDAsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRpY3QpLCAwLAogICAgICAgICAgICAgICAgICAgICAgImRlbGV0aW5nIHRoZSBrZXlzIGRpZCBub3QgY2xlYXIgdGhlIGRpY3Rpb25hcnkiKQogICAgICAgICBvID0gT2JqZWN0KDQyKQogICAgICAgICBkaWN0W29dID0gIldoYXQgaXMgdGhlIG1lYW5pbmcgb2YgdGhlIHVuaXZlcnNlPyIKQEAgLTkzMywzNyArMTA3NiwxMTcgQEAKICAgICAgICAgaXRlbXMgPSBkaWN0Lml0ZW1zKCkKICAgICAgICAgZm9yIGl0ZW0gaW4gZGljdC5pdGVyaXRlbXMoKToKICAgICAgICAgICAgIGl0ZW1zLnJlbW92ZShpdGVtKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGl0ZW1zKSA9PSAwLCAiaXRlcml0ZW1zKCkgZGlkIG5vdCB0b3VjaCBhbGwgaXRlbXMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihpdGVtcyksIDAsICJpdGVyaXRlbXMoKSBkaWQgbm90IHRvdWNoIGFsbCBpdGVtcyIpCiAKICAgICAgICAgIyBrZXkgaXRlcmF0b3IsIHZpYSBfX2l0ZXJfXygpOgogICAgICAgICBrZXlzID0gZGljdC5rZXlzKCkKICAgICAgICAgZm9yIGsgaW4gZGljdDoKICAgICAgICAgICAgIGtleXMucmVtb3ZlKGspCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oa2V5cykgPT0gMCwgIl9faXRlcl9fKCkgZGlkIG5vdCB0b3VjaCBhbGwga2V5cyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGtleXMpLCAwLCAiX19pdGVyX18oKSBkaWQgbm90IHRvdWNoIGFsbCBrZXlzIikKIAogICAgICAgICAjIGtleSBpdGVyYXRvciwgdmlhIGl0ZXJrZXlzKCk6CiAgICAgICAgIGtleXMgPSBkaWN0LmtleXMoKQogICAgICAgICBmb3IgayBpbiBkaWN0Lml0ZXJrZXlzKCk6CiAgICAgICAgICAgICBrZXlzLnJlbW92ZShrKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGtleXMpID09IDAsICJpdGVya2V5cygpIGRpZCBub3QgdG91Y2ggYWxsIGtleXMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihrZXlzKSwgMCwgIml0ZXJrZXlzKCkgZGlkIG5vdCB0b3VjaCBhbGwga2V5cyIpCiAKICAgICAgICAgIyB2YWx1ZSBpdGVyYXRvcjoKICAgICAgICAgdmFsdWVzID0gZGljdC52YWx1ZXMoKQogICAgICAgICBmb3IgdiBpbiBkaWN0Lml0ZXJ2YWx1ZXMoKToKICAgICAgICAgICAgIHZhbHVlcy5yZW1vdmUodikKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbih2YWx1ZXMpID09IDAsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHZhbHVlcyksIDAsCiAgICAgICAgICAgICAgICAgICAgICAiaXRlcnZhbHVlcygpIGRpZCBub3QgdG91Y2ggYWxsIHZhbHVlcyIpCiAKKyAgICBkZWYgY2hlY2tfd2Vha19kZXN0cm95X3doaWxlX2l0ZXJhdGluZyhzZWxmLCBkaWN0LCBvYmplY3RzLCBpdGVyX25hbWUpOgorICAgICAgICBuID0gbGVuKGRpY3QpCisgICAgICAgIGl0ID0gaXRlcihnZXRhdHRyKGRpY3QsIGl0ZXJfbmFtZSkoKSkKKyAgICAgICAgbmV4dChpdCkgICAgICAgICAgICAgIyBUcmlnZ2VyIGludGVybmFsIGl0ZXJhdGlvbgorICAgICAgICAjIERlc3Ryb3kgYW4gb2JqZWN0CisgICAgICAgIGRlbCBvYmplY3RzWy0xXQorICAgICAgICBnYy5jb2xsZWN0KCkgICAgIyBqdXN0IGluIGNhc2UKKyAgICAgICAgIyBXZSBoYXZlIHJlbW92ZWQgZWl0aGVyIHRoZSBmaXJzdCBjb25zdW1lZCBvYmplY3QsIG9yIGFub3RoZXIgb25lCisgICAgICAgIHNlbGYuYXNzZXJ0SW4obGVuKGxpc3QoaXQpKSwgW2xlbihvYmplY3RzKSwgbGVuKG9iamVjdHMpIC0gMV0pCisgICAgICAgIGRlbCBpdAorICAgICAgICAjIFRoZSByZW1vdmFsIGhhcyBiZWVuIGNvbW1pdHRlZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkaWN0KSwgbiAtIDEpCisKKyAgICBkZWYgY2hlY2tfd2Vha19kZXN0cm95X2FuZF9tdXRhdGVfd2hpbGVfaXRlcmF0aW5nKHNlbGYsIGRpY3QsIHRlc3Rjb250ZXh0KToKKyAgICAgICAgIyBDaGVjayB0aGF0IHdlIGNhbiBleHBsaWNpdGx5IG11dGF0ZSB0aGUgd2VhayBkaWN0IHdpdGhvdXQKKyAgICAgICAgIyBpbnRlcmZlcmluZyB3aXRoIGRlbGF5ZWQgcmVtb3ZhbC4KKyAgICAgICAgIyBgdGVzdGNvbnRleHRgIHNob3VsZCBjcmVhdGUgYW4gaXRlcmF0b3IsIGRlc3Ryb3kgb25lIG9mIHRoZQorICAgICAgICAjIHdlYWtyZWYnZWQgb2JqZWN0cyBhbmQgdGhlbiByZXR1cm4gYSBuZXcga2V5L3ZhbHVlIHBhaXIgY29ycmVzcG9uZGluZworICAgICAgICAjIHRvIHRoZSBkZXN0cm95ZWQgb2JqZWN0LgorICAgICAgICB3aXRoIHRlc3Rjb250ZXh0KCkgYXMgKGssIHYpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShrIGluIGRpY3QpCisgICAgICAgIHdpdGggdGVzdGNvbnRleHQoKSBhcyAoaywgdik6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZGljdC5fX2RlbGl0ZW1fXywgaykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShrIGluIGRpY3QpCisgICAgICAgIHdpdGggdGVzdGNvbnRleHQoKSBhcyAoaywgdik6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZGljdC5wb3AsIGspCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoayBpbiBkaWN0KQorICAgICAgICB3aXRoIHRlc3Rjb250ZXh0KCkgYXMgKGssIHYpOgorICAgICAgICAgICAgZGljdFtrXSA9IHYKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWN0W2tdLCB2KQorICAgICAgICBkZGljdCA9IGNvcHkuY29weShkaWN0KQorICAgICAgICB3aXRoIHRlc3Rjb250ZXh0KCkgYXMgKGssIHYpOgorICAgICAgICAgICAgZGljdC51cGRhdGUoZGRpY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljdCwgZGRpY3QpCisgICAgICAgIHdpdGggdGVzdGNvbnRleHQoKSBhcyAoaywgdik6CisgICAgICAgICAgICBkaWN0LmNsZWFyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZGljdCksIDApCisKKyAgICBkZWYgdGVzdF93ZWFrX2tleXNfZGVzdHJveV93aGlsZV9pdGVyYXRpbmcoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzcxMDU6IGl0ZXJhdG9ycyBzaG91bGRuJ3QgY3Jhc2ggd2hlbiBhIGtleSBpcyBpbXBsaWNpdGx5IHJlbW92ZWQKKyAgICAgICAgZGljdCwgb2JqZWN0cyA9IHNlbGYubWFrZV93ZWFrX2tleWVkX2RpY3QoKQorICAgICAgICBzZWxmLmNoZWNrX3dlYWtfZGVzdHJveV93aGlsZV9pdGVyYXRpbmcoZGljdCwgb2JqZWN0cywgJ2l0ZXJrZXlzJykKKyAgICAgICAgc2VsZi5jaGVja193ZWFrX2Rlc3Ryb3lfd2hpbGVfaXRlcmF0aW5nKGRpY3QsIG9iamVjdHMsICdpdGVyaXRlbXMnKQorICAgICAgICBzZWxmLmNoZWNrX3dlYWtfZGVzdHJveV93aGlsZV9pdGVyYXRpbmcoZGljdCwgb2JqZWN0cywgJ2l0ZXJ2YWx1ZXMnKQorICAgICAgICBzZWxmLmNoZWNrX3dlYWtfZGVzdHJveV93aGlsZV9pdGVyYXRpbmcoZGljdCwgb2JqZWN0cywgJ2l0ZXJrZXlyZWZzJykKKyAgICAgICAgZGljdCwgb2JqZWN0cyA9IHNlbGYubWFrZV93ZWFrX2tleWVkX2RpY3QoKQorICAgICAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorICAgICAgICBkZWYgdGVzdGNvbnRleHQoKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpdCA9IGl0ZXIoZGljdC5pdGVyaXRlbXMoKSkKKyAgICAgICAgICAgICAgICBuZXh0KGl0KQorICAgICAgICAgICAgICAgICMgU2NoZWR1bGUgYSBrZXkvdmFsdWUgZm9yIHJlbW92YWwgYW5kIHJlY3JlYXRlIGl0CisgICAgICAgICAgICAgICAgdiA9IG9iamVjdHMucG9wKCkuYXJnCisgICAgICAgICAgICAgICAgZ2MuY29sbGVjdCgpICAgICAgIyBqdXN0IGluIGNhc2UKKyAgICAgICAgICAgICAgICB5aWVsZCBPYmplY3QodiksIHYKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgaXQgPSBOb25lICAgICAgICAgICAjIHNob3VsZCBjb21taXQgYWxsIHJlbW92YWxzCisgICAgICAgIHNlbGYuY2hlY2tfd2Vha19kZXN0cm95X2FuZF9tdXRhdGVfd2hpbGVfaXRlcmF0aW5nKGRpY3QsIHRlc3Rjb250ZXh0KQorCisgICAgZGVmIHRlc3Rfd2Vha192YWx1ZXNfZGVzdHJveV93aGlsZV9pdGVyYXRpbmcoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzcxMDU6IGl0ZXJhdG9ycyBzaG91bGRuJ3QgY3Jhc2ggd2hlbiBhIGtleSBpcyBpbXBsaWNpdGx5IHJlbW92ZWQKKyAgICAgICAgZGljdCwgb2JqZWN0cyA9IHNlbGYubWFrZV93ZWFrX3ZhbHVlZF9kaWN0KCkKKyAgICAgICAgc2VsZi5jaGVja193ZWFrX2Rlc3Ryb3lfd2hpbGVfaXRlcmF0aW5nKGRpY3QsIG9iamVjdHMsICdpdGVya2V5cycpCisgICAgICAgIHNlbGYuY2hlY2tfd2Vha19kZXN0cm95X3doaWxlX2l0ZXJhdGluZyhkaWN0LCBvYmplY3RzLCAnaXRlcml0ZW1zJykKKyAgICAgICAgc2VsZi5jaGVja193ZWFrX2Rlc3Ryb3lfd2hpbGVfaXRlcmF0aW5nKGRpY3QsIG9iamVjdHMsICdpdGVydmFsdWVzJykKKyAgICAgICAgc2VsZi5jaGVja193ZWFrX2Rlc3Ryb3lfd2hpbGVfaXRlcmF0aW5nKGRpY3QsIG9iamVjdHMsICdpdGVydmFsdWVyZWZzJykKKyAgICAgICAgZGljdCwgb2JqZWN0cyA9IHNlbGYubWFrZV93ZWFrX3ZhbHVlZF9kaWN0KCkKKyAgICAgICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKKyAgICAgICAgZGVmIHRlc3Rjb250ZXh0KCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaXQgPSBpdGVyKGRpY3QuaXRlcml0ZW1zKCkpCisgICAgICAgICAgICAgICAgbmV4dChpdCkKKyAgICAgICAgICAgICAgICAjIFNjaGVkdWxlIGEga2V5L3ZhbHVlIGZvciByZW1vdmFsIGFuZCByZWNyZWF0ZSBpdAorICAgICAgICAgICAgICAgIGsgPSBvYmplY3RzLnBvcCgpLmFyZworICAgICAgICAgICAgICAgIGdjLmNvbGxlY3QoKSAgICAgICMganVzdCBpbiBjYXNlCisgICAgICAgICAgICAgICAgeWllbGQgaywgT2JqZWN0KGspCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGl0ID0gTm9uZSAgICAgICAgICAgIyBzaG91bGQgY29tbWl0IGFsbCByZW1vdmFscworICAgICAgICBzZWxmLmNoZWNrX3dlYWtfZGVzdHJveV9hbmRfbXV0YXRlX3doaWxlX2l0ZXJhdGluZyhkaWN0LCB0ZXN0Y29udGV4dCkKKwogICAgIGRlZiB0ZXN0X21ha2Vfd2Vha19rZXllZF9kaWN0X2Zyb21fZGljdChzZWxmKToKICAgICAgICAgbyA9IE9iamVjdCgzKQogICAgICAgICBkaWN0ID0gd2Vha3JlZi5XZWFrS2V5RGljdGlvbmFyeSh7bzozNjR9KQotICAgICAgICBzZWxmLmFzc2VydFRydWUoZGljdFtvXSA9PSAzNjQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljdFtvXSwgMzY0KQogCiAgICAgZGVmIHRlc3RfbWFrZV93ZWFrX2tleWVkX2RpY3RfZnJvbV93ZWFrX2tleWVkX2RpY3Qoc2VsZik6CiAgICAgICAgIG8gPSBPYmplY3QoMykKICAgICAgICAgZGljdCA9IHdlYWtyZWYuV2Vha0tleURpY3Rpb25hcnkoe286MzY0fSkKICAgICAgICAgZGljdDIgPSB3ZWFrcmVmLldlYWtLZXlEaWN0aW9uYXJ5KGRpY3QpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaWN0W29dID09IDM2NCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWN0W29dLCAzNjQpCiAKICAgICBkZWYgbWFrZV93ZWFrX2tleWVkX2RpY3Qoc2VsZik6CiAgICAgICAgIGRpY3QgPSB3ZWFrcmVmLldlYWtLZXlEaWN0aW9uYXJ5KCkKQEAgLTk4MywxOSArMTIwNiwxOSBAQAogICAgICAgICB3ZWFrZGljdCA9IGtsYXNzKCkKICAgICAgICAgd2Vha2RpY3Rba2V5MV0gPSB2YWx1ZTEKICAgICAgICAgd2Vha2RpY3Rba2V5Ml0gPSB2YWx1ZTIKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbih3ZWFrZGljdCkgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4od2Vha2RpY3QpLCAyKQogICAgICAgICBrLCB2ID0gd2Vha2RpY3QucG9waXRlbSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4od2Vha2RpY3QpID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHdlYWtkaWN0KSwgMSkKICAgICAgICAgaWYgayBpcyBrZXkxOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYgaXMgdmFsdWUxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh2LCB2YWx1ZTEpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodiBpcyB2YWx1ZTIpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHYsIHZhbHVlMikKICAgICAgICAgaywgdiA9IHdlYWtkaWN0LnBvcGl0ZW0oKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHdlYWtkaWN0KSA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3ZWFrZGljdCksIDApCiAgICAgICAgIGlmIGsgaXMga2V5MToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2IGlzIHZhbHVlMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModiwgdmFsdWUxKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYgaXMgdmFsdWUyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh2LCB2YWx1ZTIpCiAKICAgICBkZWYgdGVzdF93ZWFrX3ZhbHVlZF9kaWN0X3BvcGl0ZW0oc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tfcG9waXRlbSh3ZWFrcmVmLldlYWtWYWx1ZURpY3Rpb25hcnksCkBAIC0xMDA2LDcgKzEyMjksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQygpLCAidmFsdWUgMSIsIEMoKSwgInZhbHVlIDIiKQogCiAgICAgZGVmIGNoZWNrX3NldGRlZmF1bHQoc2VsZiwga2xhc3MsIGtleSwgdmFsdWUxLCB2YWx1ZTIpOgotICAgICAgICBzZWxmLmFzc2VydFRydWUodmFsdWUxIGlzIG5vdCB2YWx1ZTIsCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QodmFsdWUxLCB2YWx1ZTIsCiAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCB0ZXN0IgogICAgICAgICAgICAgICAgICAgICAgIiAtLSB2YWx1ZSBwYXJhbWV0ZXJzIG11c3QgYmUgZGlzdGluY3Qgb2JqZWN0cyIpCiAgICAgICAgIHdlYWtkaWN0ID0ga2xhc3MoKQpAQCAtMTA2NSwxMCArMTI4OCwxMCBAQAogICAgICAgICBvMiA9IE9iamVjdCgnMicpCiAgICAgICAgIGRbbzFdID0gJ3NvbWV0aGluZycKICAgICAgICAgZFtvMl0gPSAnc29tZXRoaW5nJwotICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGQpID09IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCAyKQogICAgICAgICBkZWwgZFtvMV0KLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihkKSA9PSAxKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5rZXlzKCkgPT0gW28yXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5rZXlzKCksIFtvMl0pCiAKICAgICBkZWYgdGVzdF93ZWFrX3ZhbHVlZF9kZWxpdGVtKHNlbGYpOgogICAgICAgICBkID0gd2Vha3JlZi5XZWFrVmFsdWVEaWN0aW9uYXJ5KCkKQEAgLTEwNzYsMTAgKzEyOTksMTAgQEAKICAgICAgICAgbzIgPSBPYmplY3QoJzInKQogICAgICAgICBkWydzb21ldGhpbmcnXSA9IG8xCiAgICAgICAgIGRbJ3NvbWV0aGluZyBlbHNlJ10gPSBvMgotICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGQpID09IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCAyKQogICAgICAgICBkZWwgZFsnc29tZXRoaW5nJ10KLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihkKSA9PSAxKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5pdGVtcygpID09IFsoJ3NvbWV0aGluZyBlbHNlJywgbzIpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5pdGVtcygpLCBbKCdzb21ldGhpbmcgZWxzZScsIG8yKV0pCiAKICAgICBkZWYgdGVzdF93ZWFrX2tleWVkX2JhZF9kZWxpdGVtKHNlbGYpOgogICAgICAgICBkID0gd2Vha3JlZi5XZWFrS2V5RGljdGlvbmFyeSgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3dlYWtzZXQucHkgYi9MaWIvdGVzdC90ZXN0X3dlYWtzZXQucHkKaW5kZXggODljMjgyMi4uZDczNWQ5YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF93ZWFrc2V0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfd2Vha3NldC5weQpAQCAtMTEsNiArMTEsNyBAQAogaW1wb3J0IGNvbGxlY3Rpb25zCiBpbXBvcnQgZ2MKIGltcG9ydCBjb250ZXh0bGliCitmcm9tIFVzZXJTdHJpbmcgaW1wb3J0IFVzZXJTdHJpbmcgYXMgdXN0cgogCiAKIGNsYXNzIEZvbzoKQEAgLTMwLDYgKzMxLDEwIEBACiAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgICByZXR1cm4gaGFzaCgoU29tZUNsYXNzLCBzZWxmLnZhbHVlKSkKIAorY2xhc3MgUmVmQ3ljbGUob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuY3ljbGUgPSBzZWxmCisKIGNsYXNzIFRlc3RXZWFrU2V0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiBzZXRVcChzZWxmKToKQEAgLTM3LDYgKzQyLDEyIEBACiAgICAgICAgIHNlbGYuaXRlbXMgPSBbU29tZUNsYXNzKGMpIGZvciBjIGluICgnYScsICdiJywgJ2MnKV0KICAgICAgICAgc2VsZi5pdGVtczIgPSBbU29tZUNsYXNzKGMpIGZvciBjIGluICgneCcsICd5JywgJ3onKV0KICAgICAgICAgc2VsZi5sZXR0ZXJzID0gW1NvbWVDbGFzcyhjKSBmb3IgYyBpbiBzdHJpbmcuYXNjaWlfbGV0dGVyc10KKyAgICAgICAgc2VsZi5hYl9pdGVtcyA9IFtTb21lQ2xhc3MoYykgZm9yIGMgaW4gJ2FiJ10KKyAgICAgICAgc2VsZi5hYmNkZV9pdGVtcyA9IFtTb21lQ2xhc3MoYykgZm9yIGMgaW4gJ2FiY2RlJ10KKyAgICAgICAgc2VsZi5kZWZfaXRlbXMgPSBbU29tZUNsYXNzKGMpIGZvciBjIGluICdkZWYnXQorICAgICAgICBzZWxmLmFiX3dlYWtzZXQgPSBXZWFrU2V0KHNlbGYuYWJfaXRlbXMpCisgICAgICAgIHNlbGYuYWJjZGVfd2Vha3NldCA9IFdlYWtTZXQoc2VsZi5hYmNkZV9pdGVtcykKKyAgICAgICAgc2VsZi5kZWZfd2Vha3NldCA9IFdlYWtTZXQoc2VsZi5kZWZfaXRlbXMpCiAgICAgICAgIHNlbGYucyA9IFdlYWtTZXQoc2VsZi5pdGVtcykKICAgICAgICAgc2VsZi5kID0gZGljdC5mcm9ta2V5cyhzZWxmLml0ZW1zKQogICAgICAgICBzZWxmLm9iaiA9IFNvbWVDbGFzcygnRicpCkBAIC03OSw2ICs5MCwxMSBAQAogICAgICAgICAgICAgeCA9IFdlYWtTZXQoc2VsZi5pdGVtcyArIHNlbGYuaXRlbXMyKQogICAgICAgICAgICAgYyA9IEMoc2VsZi5pdGVtczIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucy51bmlvbihjKSwgeCkKKyAgICAgICAgICAgIGRlbCBjCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHUpLCBsZW4oc2VsZi5pdGVtcykgKyBsZW4oc2VsZi5pdGVtczIpKQorICAgICAgICBzZWxmLml0ZW1zMi5wb3AoKQorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odSksIGxlbihzZWxmLml0ZW1zKSArIGxlbihzZWxmLml0ZW1zMikpCiAKICAgICBkZWYgdGVzdF9vcihzZWxmKToKICAgICAgICAgaSA9IHNlbGYucy51bmlvbihzZWxmLml0ZW1zMikKQEAgLTg2LDE0ICsxMDIsMTkgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnMgfCBmcm96ZW5zZXQoc2VsZi5pdGVtczIpLCBpKQogCiAgICAgZGVmIHRlc3RfaW50ZXJzZWN0aW9uKHNlbGYpOgotICAgICAgICBpID0gc2VsZi5zLmludGVyc2VjdGlvbihzZWxmLml0ZW1zMikKKyAgICAgICAgcyA9IFdlYWtTZXQoc2VsZi5sZXR0ZXJzKQorICAgICAgICBpID0gcy5pbnRlcnNlY3Rpb24oc2VsZi5pdGVtczIpCiAgICAgICAgIGZvciBjIGluIHNlbGYubGV0dGVyczoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYyBpbiBpLCBjIGluIHNlbGYuZCBhbmQgYyBpbiBzZWxmLml0ZW1zMikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnMsIFdlYWtTZXQoc2VsZi5pdGVtcykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMgaW4gaSwgYyBpbiBzZWxmLml0ZW1zMiBhbmQgYyBpbiBzZWxmLmxldHRlcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgV2Vha1NldChzZWxmLmxldHRlcnMpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoaSksIFdlYWtTZXQpCiAgICAgICAgIGZvciBDIGluIHNldCwgZnJvemVuc2V0LCBkaWN0LmZyb21rZXlzLCBsaXN0LCB0dXBsZToKICAgICAgICAgICAgIHggPSBXZWFrU2V0KFtdKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnMuaW50ZXJzZWN0aW9uKEMoc2VsZi5pdGVtczIpKSwgeCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaS5pbnRlcnNlY3Rpb24oQyhzZWxmLml0ZW1zKSksIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGkpLCBsZW4oc2VsZi5pdGVtczIpKQorICAgICAgICBzZWxmLml0ZW1zMi5wb3AoKQorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaSksIGxlbihzZWxmLml0ZW1zMikpCiAKICAgICBkZWYgdGVzdF9pc2Rpc2pvaW50KHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5zLmlzZGlzam9pbnQoV2Vha1NldChzZWxmLml0ZW1zMikpKQpAQCAtMTI0LDYgKzE0NSwxMCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucywgV2Vha1NldChzZWxmLml0ZW1zKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGkpLCBXZWFrU2V0KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYucy5zeW1tZXRyaWNfZGlmZmVyZW5jZSwgW1tdXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaSksIGxlbihzZWxmLml0ZW1zKSArIGxlbihzZWxmLml0ZW1zMikpCisgICAgICAgIHNlbGYuaXRlbXMyLnBvcCgpCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihpKSwgbGVuKHNlbGYuaXRlbXMpICsgbGVuKHNlbGYuaXRlbXMyKSkKIAogICAgIGRlZiB0ZXN0X3hvcihzZWxmKToKICAgICAgICAgaSA9IHNlbGYucy5zeW1tZXRyaWNfZGlmZmVyZW5jZShzZWxmLml0ZW1zMikKQEAgLTEzMSwyMiArMTU2LDI4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zIF4gZnJvemVuc2V0KHNlbGYuaXRlbXMyKSwgaSkKIAogICAgIGRlZiB0ZXN0X3N1Yl9hbmRfc3VwZXIoc2VsZik6Ci0gICAgICAgIHBsLCBxbCwgcmwgPSBtYXAobGFtYmRhIHM6IFtTb21lQ2xhc3MoYykgZm9yIGMgaW4gc10sIFsnYWInLCAnYWJjZGUnLCAnZGVmJ10pCi0gICAgICAgIHAsIHEsIHIgPSBtYXAoV2Vha1NldCwgKHBsLCBxbCwgcmwpKQotICAgICAgICBzZWxmLmFzc2VydFRydWUocCA8IHEpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwIDw9IHEpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxIDw9IHEpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxID4gcCkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHEgPj0gcCkKLSAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShxIDwgcikKLSAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShxIDw9IHIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocSA+IHIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocSA+PSByKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5hYl93ZWFrc2V0IDw9IHNlbGYuYWJjZGVfd2Vha3NldCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuYWJjZGVfd2Vha3NldCA8PSBzZWxmLmFiY2RlX3dlYWtzZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmFiY2RlX3dlYWtzZXQgPj0gc2VsZi5hYl93ZWFrc2V0KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuYWJjZGVfd2Vha3NldCA8PSBzZWxmLmRlZl93ZWFrc2V0KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuYWJjZGVfd2Vha3NldCA+PSBzZWxmLmRlZl93ZWFrc2V0KQogICAgICAgICBzZWxmLmFzc2VydFRydWUoc2V0KCdhJykuaXNzdWJzZXQoJ2FiYycpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUoc2V0KCdhYmMnKS5pc3N1cGVyc2V0KCdhJykpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2V0KCdhJykuaXNzdWJzZXQoJ2NicycpKQogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNldCgnY2JzJykuaXNzdXBlcnNldCgnYScpKQogCisgICAgZGVmIHRlc3RfbHQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmFiX3dlYWtzZXQgPCBzZWxmLmFiY2RlX3dlYWtzZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5hYmNkZV93ZWFrc2V0IDwgc2VsZi5kZWZfd2Vha3NldCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmFiX3dlYWtzZXQgPCBzZWxmLmFiX3dlYWtzZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoV2Vha1NldCgpIDwgV2Vha1NldCgpKQorCisgICAgZGVmIHRlc3RfZ3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmFiY2RlX3dlYWtzZXQgPiBzZWxmLmFiX3dlYWtzZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5hYmNkZV93ZWFrc2V0ID4gc2VsZi5kZWZfd2Vha3NldCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmFiX3dlYWtzZXQgPiBzZWxmLmFiX3dlYWtzZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoV2Vha1NldCgpID4gV2Vha1NldCgpKQorCiAgICAgZGVmIHRlc3RfZ2Moc2VsZik6CiAgICAgICAgICMgQ3JlYXRlIGEgbmVzdCBvZiBjeWNsZXMgdG8gZXhlcmNpc2Ugb3ZlcmFsbCByZWYgY291bnQgY2hlY2sKICAgICAgICAgcyA9IFdlYWtTZXQoRm9vKCkgZm9yIGkgaW4gcmFuZ2UoMTAwMCkpCkBAIC0zMjEsNiArMzUyLDEyIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5zID09IHR1cGxlKHNlbGYuaXRlbXMpKQogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYucyA9PSAxKQogCisgICAgZGVmIHRlc3RfbmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnMgIT0gc2V0KHNlbGYuaXRlbXMpKQorICAgICAgICBzMSA9IFdlYWtTZXQoKQorICAgICAgICBzMiA9IFdlYWtTZXQoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHMxICE9IHMyKQorCiAgICAgZGVmIHRlc3Rfd2Vha19kZXN0cm95X3doaWxlX2l0ZXJhdGluZyhzZWxmKToKICAgICAgICAgIyBJc3N1ZSAjNzEwNTogaXRlcmF0b3JzIHNob3VsZG4ndCBjcmFzaCB3aGVuIGEga2V5IGlzIGltcGxpY2l0bHkgcmVtb3ZlZAogICAgICAgICAjIENyZWF0ZSBuZXcgaXRlbXMgdG8gYmUgc3VyZSBuby1vbmUgZWxzZSBob2xkcyBhIHJlZmVyZW5jZQpAQCAtMzY5LDYgKzQwNiwxMDIgQEAKICAgICAgICAgICAgIHMuY2xlYXIoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgMCkKIAorICAgIGRlZiB0ZXN0X2xlbl9jeWNsZXMoc2VsZik6CisgICAgICAgIE4gPSAyMAorICAgICAgICBpdGVtcyA9IFtSZWZDeWNsZSgpIGZvciBpIGluIHJhbmdlKE4pXQorICAgICAgICBzID0gV2Vha1NldChpdGVtcykKKyAgICAgICAgZGVsIGl0ZW1zCisgICAgICAgIGl0ID0gaXRlcihzKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBuZXh0KGl0KQorICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIG4xID0gbGVuKHMpCisgICAgICAgIGRlbCBpdAorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgbjIgPSBsZW4ocykKKyAgICAgICAgIyBvbmUgaXRlbSBtYXkgYmUga2VwdCBhbGl2ZSBpbnNpZGUgdGhlIGl0ZXJhdG9yCisgICAgICAgIHNlbGYuYXNzZXJ0SW4objEsICgwLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMiwgMCkKKworICAgIGRlZiB0ZXN0X2xlbl9yYWNlKHNlbGYpOgorICAgICAgICAjIEV4dGVuZGVkIHNhbml0eSBjaGVja3MgZm9yIGxlbigpIGluIHRoZSBmYWNlIG9mIGN5Y2xpYyBjb2xsZWN0aW9uCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChnYy5zZXRfdGhyZXNob2xkLCAqZ2MuZ2V0X3RocmVzaG9sZCgpKQorICAgICAgICBmb3IgdGggaW4gcmFuZ2UoMSwgMTAwKToKKyAgICAgICAgICAgIE4gPSAyMAorICAgICAgICAgICAgZ2MuY29sbGVjdCgwKQorICAgICAgICAgICAgZ2Muc2V0X3RocmVzaG9sZCh0aCwgdGgsIHRoKQorICAgICAgICAgICAgaXRlbXMgPSBbUmVmQ3ljbGUoKSBmb3IgaSBpbiByYW5nZShOKV0KKyAgICAgICAgICAgIHMgPSBXZWFrU2V0KGl0ZW1zKQorICAgICAgICAgICAgZGVsIGl0ZW1zCisgICAgICAgICAgICAjIEFsbCBpdGVtcyB3aWxsIGJlIGNvbGxlY3RlZCBhdCBuZXh0IGdhcmJhZ2UgY29sbGVjdGlvbiBwYXNzCisgICAgICAgICAgICBpdCA9IGl0ZXIocykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBuZXh0KGl0KQorICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgbjEgPSBsZW4ocykKKyAgICAgICAgICAgIGRlbCBpdAorICAgICAgICAgICAgbjIgPSBsZW4ocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKG4xLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwobjEsIE4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChuMiwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKG4yLCBuMSkKKworICAgIGRlZiB0ZXN0X3dlYWtfZGVzdHJveV93aGlsZV9pdGVyYXRpbmcoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzcxMDU6IGl0ZXJhdG9ycyBzaG91bGRuJ3QgY3Jhc2ggd2hlbiBhIGtleSBpcyBpbXBsaWNpdGx5IHJlbW92ZWQKKyAgICAgICAgIyBDcmVhdGUgbmV3IGl0ZW1zIHRvIGJlIHN1cmUgbm8tb25lIGVsc2UgaG9sZHMgYSByZWZlcmVuY2UKKyAgICAgICAgaXRlbXMgPSBbdXN0cihjKSBmb3IgYyBpbiAoJ2EnLCAnYicsICdjJyldCisgICAgICAgIHMgPSBXZWFrU2V0KGl0ZW1zKQorICAgICAgICBpdCA9IGl0ZXIocykKKyAgICAgICAgbmV4dChpdCkgICAgICAgICAgICAgIyBUcmlnZ2VyIGludGVybmFsIGl0ZXJhdGlvbgorICAgICAgICAjIERlc3Ryb3kgYW4gaXRlbQorICAgICAgICBkZWwgaXRlbXNbLTFdCisgICAgICAgIGdjLmNvbGxlY3QoKSAgICAjIGp1c3QgaW4gY2FzZQorICAgICAgICAjIFdlIGhhdmUgcmVtb3ZlZCBlaXRoZXIgdGhlIGZpcnN0IGNvbnN1bWVkIGl0ZW1zLCBvciBhbm90aGVyIG9uZQorICAgICAgICBzZWxmLmFzc2VydEluKGxlbihsaXN0KGl0KSksIFtsZW4oaXRlbXMpLCBsZW4oaXRlbXMpIC0gMV0pCisgICAgICAgIGRlbCBpdAorICAgICAgICAjIFRoZSByZW1vdmFsIGhhcyBiZWVuIGNvbW1pdHRlZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgbGVuKGl0ZW1zKSkKKworICAgIGRlZiB0ZXN0X3dlYWtfZGVzdHJveV9hbmRfbXV0YXRlX3doaWxlX2l0ZXJhdGluZyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjNzEwNTogaXRlcmF0b3JzIHNob3VsZG4ndCBjcmFzaCB3aGVuIGEga2V5IGlzIGltcGxpY2l0bHkgcmVtb3ZlZAorICAgICAgICBpdGVtcyA9IFt1c3RyKGMpIGZvciBjIGluIHN0cmluZy5hc2NpaV9sZXR0ZXJzXQorICAgICAgICBzID0gV2Vha1NldChpdGVtcykKKyAgICAgICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKKyAgICAgICAgZGVmIHRlc3Rjb250ZXh0KCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaXQgPSBpdGVyKHMpCisgICAgICAgICAgICAgICAgIyBTdGFydCBpdGVyYXRvcgorICAgICAgICAgICAgICAgIHlpZWxkZWQgPSB1c3RyKHN0cihuZXh0KGl0KSkpCisgICAgICAgICAgICAgICAgIyBTY2hlZHVsZSBhbiBpdGVtIGZvciByZW1vdmFsIGFuZCByZWNyZWF0ZSBpdAorICAgICAgICAgICAgICAgIHUgPSB1c3RyKHN0cihpdGVtcy5wb3AoKSkpCisgICAgICAgICAgICAgICAgaWYgeWllbGRlZCA9PSB1OgorICAgICAgICAgICAgICAgICAgICAjIFRoZSBpdGVyYXRvciBzdGlsbCBoYXMgYSByZWZlcmVuY2UgdG8gdGhlIHJlbW92ZWQgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgIyBhZHZhbmNlIGl0IChpc3N1ZSAjMjAwMDYpLgorICAgICAgICAgICAgICAgICAgICBuZXh0KGl0KQorICAgICAgICAgICAgICAgIGdjLmNvbGxlY3QoKSAgICAgICMganVzdCBpbiBjYXNlCisgICAgICAgICAgICAgICAgeWllbGQgdQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBpdCA9IE5vbmUgICAgICAgICAgICMgc2hvdWxkIGNvbW1pdCBhbGwgcmVtb3ZhbHMKKworICAgICAgICB3aXRoIHRlc3Rjb250ZXh0KCkgYXMgdToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodSBpbiBzKQorICAgICAgICB3aXRoIHRlc3Rjb250ZXh0KCkgYXMgdToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBzLnJlbW92ZSwgdSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh1IGluIHMpCisgICAgICAgIHdpdGggdGVzdGNvbnRleHQoKSBhcyB1OgorICAgICAgICAgICAgcy5hZGQodSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUgaW4gcykKKyAgICAgICAgdCA9IHMuY29weSgpCisgICAgICAgIHdpdGggdGVzdGNvbnRleHQoKSBhcyB1OgorICAgICAgICAgICAgcy51cGRhdGUodCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIGxlbih0KSkKKyAgICAgICAgd2l0aCB0ZXN0Y29udGV4dCgpIGFzIHU6CisgICAgICAgICAgICBzLmNsZWFyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIDApCisKIAogZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdFdlYWtTZXQpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3doaWNoZGIucHkgYi9MaWIvdGVzdC90ZXN0X3doaWNoZGIucHkKaW5kZXggNDI3ZTMyMy4uOTFhYjdmOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF93aGljaGRiLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfd2hpY2hkYi5weQpAQCAtMSw0ICsxLDMgQEAKLSMhIC91c3IvYmluL2VudiBweXRob24KICIiIlRlc3Qgc2NyaXB0IGZvciB0aGUgd2hpY2hkYiBtb2R1bGUKICAgIGJhc2VkIG9uIHRlc3RfYW55ZGJtLnB5CiAiIiIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd2lucmVnLnB5IGIvTGliL3Rlc3QvdGVzdF93aW5yZWcucHkKaW5kZXggMTJhYjNiYS4uOGUzY2RmMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF93aW5yZWcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF93aW5yZWcucHkKQEAgLTEsNyArMSw3IEBACiAjIFRlc3QgdGhlIHdpbmRvd3Mgc3BlY2lmaWMgd2luMzJyZWcgbW9kdWxlLgogIyBPbmx5IHdpbjMycmVnIGZ1bmN0aW9ucyBub3QgaGl0IGhlcmU6IEZsdXNoS2V5LCBMb2FkS2V5IGFuZCBTYXZlS2V5CiAKLWltcG9ydCBvcywgc3lzCitpbXBvcnQgb3MsIHN5cywgZXJybm8KIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIHRocmVhZGluZyA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCJ0aHJlYWRpbmciKQpAQCAtMjgsOSArMjgsMTIgQEAKICMgdGVzdHMgYXJlIG9ubHkgdmFsaWQgdXAgdW50aWwgNi4xCiBIQVNfUkVGTEVDVElPTiA9IFRydWUgaWYgV0lOX1ZFUiA8ICg2LCAxKSBlbHNlIEZhbHNlCiAKLXRlc3Rfa2V5X25hbWUgPSAiU09GVFdBUkVcXFB5dGhvbiBSZWdpc3RyeSBUZXN0IEtleSAtIERlbGV0ZSBNZSIKKyMgVXNlIGEgcGVyLXByb2Nlc3Mga2V5IHRvIHByZXZlbnQgY29uY3VycmVudCB0ZXN0IHJ1bnMgKGJ1aWxkYm90ISkgZnJvbQorIyBzdG9tcGluZyBvbiBlYWNoIG90aGVyLgordGVzdF9rZXlfYmFzZSA9ICJQeXRob24gVGVzdCBLZXkgWyVkXSAtIERlbGV0ZSBNZSIgJSAob3MuZ2V0cGlkKCksKQordGVzdF9rZXlfbmFtZSA9ICJTT0ZUV0FSRVxcIiArIHRlc3Rfa2V5X2Jhc2UKICMgT24gT1MnZXMgdGhhdCBzdXBwb3J0IHJlZmxlY3Rpb24gd2Ugc2hvdWxkIHRlc3Qgd2l0aCBhIHJlZmxlY3RlZCBrZXkKLXRlc3RfcmVmbGVjdF9rZXlfbmFtZSA9ICJTT0ZUV0FSRVxcQ2xhc3Nlc1xcUHl0aG9uIFRlc3QgS2V5IC0gRGVsZXRlIE1lIgordGVzdF9yZWZsZWN0X2tleV9uYW1lID0gIlNPRlRXQVJFXFxDbGFzc2VzXFwiICsgdGVzdF9rZXlfYmFzZQogCiB0ZXN0X2RhdGEgPSBbCiAgICAgKCJJbnQgVmFsdWUiLCAgICAgNDUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfRFdPUkQpLApAQCAtMjM0LDcgKzIzNyw3IEBACiAKICAgICBkZWYgdGVzdF9jaGFuZ2luZ192YWx1ZShzZWxmKToKICAgICAgICAgIyBJc3N1ZTI4MTA6IEEgcmFjZSBjb25kaXRpb24gaW4gMi42IGFuZCAzLjEgbWF5IGNhdXNlCi0gICAgICAgICMgRW51bVZhbHVlIG9yIFF1ZXJ5VmFsdWUgdG8gdGhyb3cgIldpbmRvd3NFcnJvcjogTW9yZSBkYXRhIGlzCisgICAgICAgICMgRW51bVZhbHVlIG9yIFF1ZXJ5VmFsdWUgdG8gcmFpc2UgIldpbmRvd3NFcnJvcjogTW9yZSBkYXRhIGlzCiAgICAgICAgICMgYXZhaWxhYmxlIgogICAgICAgICBkb25lID0gRmFsc2UKIApAQCAtMjY3LDcgKzI3MCw3IEBACiAKICAgICBkZWYgdGVzdF9sb25nX2tleShzZWxmKToKICAgICAgICAgIyBJc3N1ZTI4MTAsIGluIDIuNiBhbmQgMy4xIHdoZW4gdGhlIGtleSBuYW1lIHdhcyBleGFjdGx5IDI1NgotICAgICAgICAjIGNoYXJhY3RlcnMsIEVudW1LZXkgdGhyZXcgIldpbmRvd3NFcnJvcjogTW9yZSBkYXRhIGlzCisgICAgICAgICMgY2hhcmFjdGVycywgRW51bUtleSByYWlzZWQgIldpbmRvd3NFcnJvcjogTW9yZSBkYXRhIGlzCiAgICAgICAgICMgYXZhaWxhYmxlIgogICAgICAgICBuYW1lID0gJ3gnKjI1NgogICAgICAgICB0cnk6CkBAIC0yODIsOCArMjg1LDE0IEBACiAKICAgICBkZWYgdGVzdF9keW5hbWljX2tleShzZWxmKToKICAgICAgICAgIyBJc3N1ZTI4MTAsIHdoZW4gdGhlIHZhbHVlIGlzIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCwgdGhlc2UKLSAgICAgICAgIyB0aHJvdyAiV2luZG93c0Vycm9yOiBNb3JlIGRhdGEgaXMgYXZhaWxhYmxlIiBpbiAyLjYgYW5kIDMuMQotICAgICAgICBFbnVtVmFsdWUoSEtFWV9QRVJGT1JNQU5DRV9EQVRBLCAwKQorICAgICAgICAjIHJhaXNlICJXaW5kb3dzRXJyb3I6IE1vcmUgZGF0YSBpcyBhdmFpbGFibGUiIGluIDIuNiBhbmQgMy4xCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIEVudW1WYWx1ZShIS0VZX1BFUkZPUk1BTkNFX0RBVEEsIDApCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICAgICAgICBpZiBlLmVycm5vIGluIChlcnJuby5FUEVSTSwgZXJybm8uRUFDQ0VTKToKKyAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJhY2Nlc3MgZGVuaWVkIHRvIHJlZ2lzdHJ5IGtleSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGFyZSB5b3UgcnVubmluZyBpbiBhIG5vbi1pbnRlcmFjdGl2ZSBzZXNzaW9uPykiKQorICAgICAgICAgICAgcmFpc2UKICAgICAgICAgUXVlcnlWYWx1ZUV4KEhLRVlfUEVSRk9STUFOQ0VfREFUQSwgTm9uZSkKIAogICAgICMgUmVmbGVjdGlvbiByZXF1aXJlcyBYUCB4NjQvVmlzdGEgYXQgYSBtaW5pbXVtLiBYUCBkb2Vzbid0IGhhdmUgdGhpcyBzdHVmZgpAQCAtMzA4LDYgKzMxNyw1NyBAQAogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgRGVsZXRlS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCB0ZXN0X2tleV9uYW1lKQogCisgICAgZGVmIHRlc3Rfc2V0dmFsdWVleF92YWx1ZV9yYW5nZShzZWxmKToKKyAgICAgICAgIyBUZXN0IGZvciBJc3N1ZSAjMTQ0MjAsIGFjY2VwdCBwcm9wZXIgcmFuZ2VzIGZvciBTZXRWYWx1ZUV4LgorICAgICAgICAjIFB5MlJlZywgd2hpY2ggZ2V0cyBjYWxsZWQgYnkgU2V0VmFsdWVFeCwgd2FzIHVzaW5nIFB5TG9uZ19Bc0xvbmcsCisgICAgICAgICMgdGh1cyByYWlzaW5nIE92ZXJmbG93RXJyb3IuIFRoZSBpbXBsZW1lbnRhdGlvbiBub3cgdXNlcworICAgICAgICAjIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyB0byBtYXRjaCBEV09SRCdzIHNpemUuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggQ3JlYXRlS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCB0ZXN0X2tleV9uYW1lKSBhcyBjazoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGNrLmhhbmRsZSwgMCkKKyAgICAgICAgICAgICAgICBTZXRWYWx1ZUV4KGNrLCAidGVzdF9uYW1lIiwgTm9uZSwgUkVHX0RXT1JELCAweDgwMDAwMDAwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgRGVsZXRlS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCB0ZXN0X2tleV9uYW1lKQorCisgICAgZGVmIHRlc3Rfc2V0dmFsdWVleF93aXRoX21lbW9yeXZpZXcoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggQ3JlYXRlS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCB0ZXN0X2tleV9uYW1lKSBhcyBjazoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGNrLmhhbmRsZSwgMCkKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICAgICAgICAgIFNldFZhbHVlRXgoY2ssICJ0ZXN0X25hbWUiLCBOb25lLCBSRUdfQklOQVJZLCBtZW1vcnl2aWV3KCd2YWwnKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIERlbGV0ZUtleShIS0VZX0NVUlJFTlRfVVNFUiwgdGVzdF9rZXlfbmFtZSkKKworICAgIGRlZiB0ZXN0X3F1ZXJ5dmFsdWVleF9yZXR1cm5fdmFsdWUoc2VsZik6CisgICAgICAgICMgVGVzdCBmb3IgSXNzdWUgIzE2NzU5LCByZXR1cm4gdW5zaWduZWQgaW50IGZyb20gUXVlcnlWYWx1ZUV4LgorICAgICAgICAjIFJlZzJQeSwgd2hpY2ggZ2V0cyBjYWxsZWQgYnkgUXVlcnlWYWx1ZUV4LCB3YXMgcmV0dXJuaW5nIGEgdmFsdWUKKyAgICAgICAgIyBnZW5lcmF0ZWQgYnkgUHlMb25nX0Zyb21Mb25nLiBUaGUgaW1wbGVtZW50YXRpb24gbm93IHVzZXMKKyAgICAgICAgIyBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyB0byBtYXRjaCBEV09SRCdzIHNpemUuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggQ3JlYXRlS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCB0ZXN0X2tleV9uYW1lKSBhcyBjazoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGNrLmhhbmRsZSwgMCkKKyAgICAgICAgICAgICAgICB0ZXN0X3ZhbCA9IDB4ODAwMDAwMDAKKyAgICAgICAgICAgICAgICBTZXRWYWx1ZUV4KGNrLCAidGVzdF9uYW1lIiwgTm9uZSwgUkVHX0RXT1JELCB0ZXN0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXRfdmFsLCByZXRfdHlwZSA9IFF1ZXJ5VmFsdWVFeChjaywgInRlc3RfbmFtZSIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXRfdHlwZSwgUkVHX0RXT1JEKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmV0X3ZhbCwgdGVzdF92YWwpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBEZWxldGVLZXkoSEtFWV9DVVJSRU5UX1VTRVIsIHRlc3Rfa2V5X25hbWUpCisKKyAgICBkZWYgdGVzdF9zZXR2YWx1ZWV4X2NyYXNoX3dpdGhfbm9uZV9hcmcoc2VsZik6CisgICAgICAgICMgVGVzdCBmb3IgSXNzdWUgIzIxMTUxLCBzZWdmYXVsdCB3aGVuIE5vbmUgaXMgcGFzc2VkIHRvIFNldFZhbHVlRXgKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBDcmVhdGVLZXkoSEtFWV9DVVJSRU5UX1VTRVIsIHRlc3Rfa2V5X25hbWUpIGFzIGNrOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoY2suaGFuZGxlLCAwKQorICAgICAgICAgICAgICAgIHRlc3RfdmFsID0gTm9uZQorICAgICAgICAgICAgICAgIFNldFZhbHVlRXgoY2ssICJ0ZXN0X25hbWUiLCAwLCBSRUdfQklOQVJZLCB0ZXN0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXRfdmFsLCByZXRfdHlwZSA9IFF1ZXJ5VmFsdWVFeChjaywgInRlc3RfbmFtZSIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXRfdHlwZSwgUkVHX0JJTkFSWSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJldF92YWwsIHRlc3RfdmFsKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgRGVsZXRlS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCB0ZXN0X2tleV9uYW1lKQorCisKIAogQHVuaXR0ZXN0LnNraXBVbmxlc3MoUkVNT1RFX05BTUUsICJTa2lwcGluZyByZW1vdGUgcmVnaXN0cnkgdGVzdHMiKQogY2xhc3MgUmVtb3RlV2lucmVnVGVzdHMoQmFzZVdpbnJlZ1Rlc3RzKToKQEAgLTQwNCw2ICs0NjQsMTEgQEAKICAgICAgICAgICAgIERlbGV0ZUtleUV4KEhLRVlfQ1VSUkVOVF9VU0VSLCB0ZXN0X3JlZmxlY3Rfa2V5X25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfV09XNjRfMzJLRVksIDApCiAKKyAgICBkZWYgdGVzdF9leGNlcHRpb25fbnVtYmVycyhzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhXaW5kb3dzRXJyb3IpIGFzIGN0eDoKKyAgICAgICAgICAgIFF1ZXJ5VmFsdWUoSEtFWV9DTEFTU0VTX1JPT1QsICdzb21lX3ZhbHVlX3RoYXRfZG9lc19ub3RfZXhpc3QnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3R4LmV4Y2VwdGlvbi5lcnJubywgMikKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoTG9jYWxXaW5yZWdUZXN0cywgUmVtb3RlV2lucmVnVGVzdHMsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3dpbnNvdW5kLnB5IGIvTGliL3Rlc3QvdGVzdF93aW5zb3VuZC5weQppbmRleCA4MjFkNjg0Li40MjA4ZmU3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3dpbnNvdW5kLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfd2luc291bmQucHkKQEAgLTIsNiArMiw3IEBACiAKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK3Rlc3Rfc3VwcG9ydC5yZXF1aXJlcygnYXVkaW8nKQogaW1wb3J0IHRpbWUKIGltcG9ydCBvcwogaW1wb3J0IHN1YnByb2Nlc3MKQEAgLTE1OCwxOCArMTU5LDE1IEBACiAgICAgICAgICAgICApCiAKICAgICBkZWYgdGVzdF9hbGlhc19mYWxsYmFjayhzZWxmKToKLSAgICAgICAgIyBUaGlzIHRlc3QgY2FuJ3QgYmUgZXhwZWN0ZWQgdG8gd29yayBvbiBhbGwgc3lzdGVtcy4gIFRoZSBNUwotICAgICAgICAjIFBsYXlTb3VuZCgpIGRvY3Mgc2F5OgotICAgICAgICAjCi0gICAgICAgICMgICAgIElmIGl0IGNhbm5vdCBmaW5kIHRoZSBzcGVjaWZpZWQgc291bmQsIFBsYXlTb3VuZCB1c2VzIHRoZQotICAgICAgICAjICAgICBkZWZhdWx0IHN5c3RlbSBldmVudCBzb3VuZCBlbnRyeSBpbnN0ZWFkLiAgSWYgdGhlIGZ1bmN0aW9uCi0gICAgICAgICMgICAgIGNhbiBmaW5kIG5laXRoZXIgdGhlIHN5c3RlbSBkZWZhdWx0IGVudHJ5IG5vciB0aGUgZGVmYXVsdAotICAgICAgICAjICAgICBzb3VuZCwgaXQgbWFrZXMgbm8gc291bmQgYW5kIHJldHVybnMgRkFMU0UuCi0gICAgICAgICMKLSAgICAgICAgIyBJdCdzIGtub3duIHRvIHJldHVybiBGQUxTRSBvbiBzb21lIHJlYWwgc3lzdGVtcy4KLQotICAgICAgICAjIHdpbnNvdW5kLlBsYXlTb3VuZCgnISIkJSYvKCMrKicsIHdpbnNvdW5kLlNORF9BTElBUykKLSAgICAgICAgcmV0dXJuCisgICAgICAgICMgSW4gdGhlIGFic2Vuc2Ugb2YgdGhlIGFiaWxpdHkgdG8gdGVsbCBpZiBhIHNvdW5kIHdhcyBhY3R1YWxseQorICAgICAgICAjIHBsYXllZCwgdGhpcyB0ZXN0IGhhcyB0d28gYWNjZXB0YWJsZSBvdXRjb21lczogc3VjY2VzcyAobm8gZXJyb3IsCisgICAgICAgICMgc291bmQgd2FzIHRoZW9yZXRpY2FsbHkgcGxheWVkOyBhbHRob3VnaCBhcyBpc3N1ZSAjMTk5ODcgc2hvd3MKKyAgICAgICAgIyBhIGJveCB3aXRob3V0IGEgc291bmRjYXJkIGNhbiAic3VjY2VlZCIpIG9yIFJ1bnRpbWVFcnJvci4gIEFueQorICAgICAgICAjIG90aGVyIGVycm9yIGlzIGEgZmFpbHVyZS4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kKCchIiQlJi8oIysqJywgd2luc291bmQuU05EX0FMSUFTKQorICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgcGFzcwogCiAgICAgZGVmIHRlc3RfYWxpYXNfbm9mYWxsYmFjayhzZWxmKToKICAgICAgICAgaWYgX2hhdmVfc291bmRjYXJkKCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3dpdGgucHkgYi9MaWIvdGVzdC90ZXN0X3dpdGgucHkKaW5kZXggNDk2NDUxODMuLmU3ZGQwMDEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2l0aC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dpdGgucHkKQEAgLTEsNSArMSwzIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLQogIiIiVW5pdCB0ZXN0cyBmb3IgdGhlIHdpdGggc3RhdGVtZW50IHNwZWNpZmllZCBpbiBQRVAgMzQzLiIiIgogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd3NnaXJlZi5weSBiL0xpYi90ZXN0L3Rlc3Rfd3NnaXJlZi5weQppbmRleCA0NWNhNjIwLi40MDFkNzg0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3dzZ2lyZWYucHkKKysrIGIvTGliL3Rlc3QvdGVzdF93c2dpcmVmLnB5CkBAIC0zOSw5ICszOSw2IEBACiAgICAgICAgIHBhc3MKIAogCi0KLQotCiBkZWYgaGVsbG9fYXBwKGVudmlyb24sc3RhcnRfcmVzcG9uc2UpOgogICAgIHN0YXJ0X3Jlc3BvbnNlKCIyMDAgT0siLCBbCiAgICAgICAgICgnQ29udGVudC1UeXBlJywndGV4dC9wbGFpbicpLApAQCAtNjIsMjcgKzU5LDYgQEAKICAgICByZXR1cm4gb3V0LmdldHZhbHVlKCksIGVyci5nZXR2YWx1ZSgpCiAKIAotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQogZGVmIGNvbXBhcmVfZ2VuZXJpY19pdGVyKG1ha2VfaXQsbWF0Y2gpOgogICAgICIiIlV0aWxpdHkgdG8gY29tcGFyZSBhIGdlbmVyaWMgMi4xLzIuMisgaXRlcmF0b3Igd2l0aCBhbiBpdGVyYWJsZQogCkBAIC0xMjAsMTAgKzk2LDYgQEAKICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJUb28gbWFueSBpdGVtcyBmcm9tIC5uZXh0KCkiLGl0KQogCiAKLQotCi0KLQogY2xhc3MgSW50ZWdyYXRpb25UZXN0cyhUZXN0Q2FzZSk6CiAKICAgICBkZWYgY2hlY2tfaGVsbG8oc2VsZiwgb3V0LCBoYXNfbGVuZ3RoPVRydWUpOgpAQCAtMTYxLDEwICsxMzMsNiBAQAogICAgICAgICApCiAKIAotCi0KLQotCiBjbGFzcyBVdGlsaXR5VGVzdHMoVGVzdENhc2UpOgogCiAgICAgZGVmIGNoZWNrU2hpZnQoc2VsZixzbl9pbixwaV9pbixwYXJ0LHNuX291dCxwaV9vdXQpOgpAQCAtMTg3LDcgKzE1NSw3IEBACiAgICAgICAgICMgQ2hlY2sgZXhpc3RpbmcgdmFsdWUKICAgICAgICAgZW52ID0ge2tleTphbHR9CiAgICAgICAgIHV0aWwuc2V0dXBfdGVzdGluZ19kZWZhdWx0cyhlbnYpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbnZba2V5XSBpcyBhbHQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZW52W2tleV0sIGFsdCkKIAogICAgIGRlZiBjaGVja0Nyb3NzRGVmYXVsdChzZWxmLGtleSx2YWx1ZSwqKmt3KToKICAgICAgICAgdXRpbC5zZXR1cF90ZXN0aW5nX2RlZmF1bHRzKGt3KQpAQCAtMjAxLDExICsxNjksNiBAQAogICAgICAgICB1dGlsLnNldHVwX3Rlc3RpbmdfZGVmYXVsdHMoa3cpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbC5yZXF1ZXN0X3VyaShrdyxxdWVyeSksdXJpKQogCi0KLQotCi0KLQogICAgIGRlZiBjaGVja0ZXKHNlbGYsdGV4dCxzaXplLG1hdGNoKToKIAogICAgICAgICBkZWYgbWFrZV9pdCh0ZXh0PXRleHQsc2l6ZT1zaXplKToKQEAgLTIyNCw3ICsxODcsNiBAQAogICAgICAgICBpdC5jbG9zZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpdC5maWxlbGlrZS5jbG9zZWQpCiAKLQogICAgIGRlZiB0ZXN0U2ltcGxlU2hpZnRzKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJycsJy8nLCAnJywgJy8nLCAnJykKICAgICAgICAgc2VsZi5jaGVja1NoaWZ0KCcnLCcveCcsICd4JywgJy94JywgJycpCkBAIC0yMzIsNyArMTk0LDYgQEAKICAgICAgICAgc2VsZi5jaGVja1NoaWZ0KCcvYScsJy94L3knLCAneCcsICcvYS94JywgJy95JykKICAgICAgICAgc2VsZi5jaGVja1NoaWZ0KCcvYScsJy94LycsICAneCcsICcvYS94JywgJy8nKQogCi0KICAgICBkZWYgdGVzdE5vcm1hbGl6ZWRTaGlmdHMoc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnL2EvYicsICcvLi4veScsICcuLicsICcvYScsICcveScpCiAgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnJywgJy8uLi95JywgJy4uJywgJycsICcveScpCkBAIC0yNDYsNyArMjA3LDYgQEAKICAgICAgICAgc2VsZi5jaGVja1NoaWZ0KCcvYS9iJywgJy94Ly8nLCAneCcsICcvYS9iL3gnLCAnLycpCiAgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnL2EvYicsICcvLicsIE5vbmUsICcvYS9iJywgJycpCiAKLQogICAgIGRlZiB0ZXN0RGVmYXVsdHMoc2VsZik6CiAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIFsKICAgICAgICAgICAgICgnU0VSVkVSX05BTUUnLCcxMjcuMC4wLjEnKSwKQEAgLTI2Niw3ICsyMjYsNiBAQAogICAgICAgICBdOgogICAgICAgICAgICAgc2VsZi5jaGVja0RlZmF1bHQoa2V5LHZhbHVlKQogCi0KICAgICBkZWYgdGVzdENyb3NzRGVmYXVsdHMoc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tDcm9zc0RlZmF1bHQoJ0hUVFBfSE9TVCcsImZvby5iYXIiLFNFUlZFUl9OQU1FPSJmb28uYmFyIikKICAgICAgICAgc2VsZi5jaGVja0Nyb3NzRGVmYXVsdCgnd3NnaS51cmxfc2NoZW1lJywiaHR0cHMiLEhUVFBTPSJvbiIpCkBAIC0yNzYsNyArMjM1LDYgQEAKICAgICAgICAgc2VsZi5jaGVja0Nyb3NzRGVmYXVsdCgnU0VSVkVSX1BPUlQnLCI4MCIsSFRUUFM9ImZvbyIpCiAgICAgICAgIHNlbGYuY2hlY2tDcm9zc0RlZmF1bHQoJ1NFUlZFUl9QT1JUJywiNDQzIixIVFRQUz0ib24iKQogCi0KICAgICBkZWYgdGVzdEd1ZXNzU2NoZW1lKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWwuZ3Vlc3Nfc2NoZW1lKHt9KSwgImh0dHAiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWwuZ3Vlc3Nfc2NoZW1lKHsnSFRUUFMnOiJmb28ifSksICJodHRwIikKQEAgLTI4NCwxMyArMjQyLDEwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbC5ndWVzc19zY2hlbWUoeydIVFRQUyc6InllcyJ9KSwgImh0dHBzIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlsLmd1ZXNzX3NjaGVtZSh7J0hUVFBTJzoiMSJ9KSwgImh0dHBzIikKIAotCi0KLQotCiAgICAgZGVmIHRlc3RBcHBVUklzKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrQXBwVVJJKCJodHRwOi8vMTI3LjAuMC4xLyIpCiAgICAgICAgIHNlbGYuY2hlY2tBcHBVUkkoImh0dHA6Ly8xMjcuMC4wLjEvc3BhbSIsIFNDUklQVF9OQU1FPSIvc3BhbSIpCisgICAgICAgIHNlbGYuY2hlY2tBcHBVUkkoImh0dHA6Ly8xMjcuMC4wLjEvc3AlRTRtIiwgU0NSSVBUX05BTUU9Ii9zcFx4ZTRtIikKICAgICAgICAgc2VsZi5jaGVja0FwcFVSSSgiaHR0cDovL3NwYW0uZXhhbXBsZS5jb206MjA3MS8iLAogICAgICAgICAgICAgSFRUUF9IT1NUPSJzcGFtLmV4YW1wbGUuY29tOjIwNzEiLCBTRVJWRVJfUE9SVD0iMjA3MSIpCiAgICAgICAgIHNlbGYuY2hlY2tBcHBVUkkoImh0dHA6Ly9zcGFtLmV4YW1wbGUuY29tLyIsCkBAIC0zMDQsMTQgKzI1OSwxOSBAQAogICAgIGRlZiB0ZXN0UmVxVVJJcyhzZWxmKToKICAgICAgICAgc2VsZi5jaGVja1JlcVVSSSgiaHR0cDovLzEyNy4wLjAuMS8iKQogICAgICAgICBzZWxmLmNoZWNrUmVxVVJJKCJodHRwOi8vMTI3LjAuMC4xL3NwYW0iLCBTQ1JJUFRfTkFNRT0iL3NwYW0iKQorICAgICAgICBzZWxmLmNoZWNrUmVxVVJJKCJodHRwOi8vMTI3LjAuMC4xL3NwJUU0bSIsIFNDUklQVF9OQU1FPSIvc3BceGU0bSIpCiAgICAgICAgIHNlbGYuY2hlY2tSZXFVUkkoImh0dHA6Ly8xMjcuMC4wLjEvc3BhbW1pdHkvc3BhbSIsCiAgICAgICAgICAgICBTQ1JJUFRfTkFNRT0iL3NwYW1taXR5IiwgUEFUSF9JTkZPPSIvc3BhbSIpCisgICAgICAgIHNlbGYuY2hlY2tSZXFVUkkoImh0dHA6Ly8xMjcuMC4wLjEvc3BhbW1pdHkvc3AlRTRtIiwKKyAgICAgICAgICAgIFNDUklQVF9OQU1FPSIvc3BhbW1pdHkiLCBQQVRIX0lORk89Ii9zcFx4ZTRtIikKICAgICAgICAgc2VsZi5jaGVja1JlcVVSSSgiaHR0cDovLzEyNy4wLjAuMS9zcGFtbWl0eS9zcGFtO2hhbSIsCiAgICAgICAgICAgICBTQ1JJUFRfTkFNRT0iL3NwYW1taXR5IiwgUEFUSF9JTkZPPSIvc3BhbTtoYW0iKQogICAgICAgICBzZWxmLmNoZWNrUmVxVVJJKCJodHRwOi8vMTI3LjAuMC4xL3NwYW1taXR5L3NwYW07Y29va2llPTEyMzQsNTY3OCIsCiAgICAgICAgICAgICBTQ1JJUFRfTkFNRT0iL3NwYW1taXR5IiwgUEFUSF9JTkZPPSIvc3BhbTtjb29raWU9MTIzNCw1Njc4IikKICAgICAgICAgc2VsZi5jaGVja1JlcVVSSSgiaHR0cDovLzEyNy4wLjAuMS9zcGFtbWl0eS9zcGFtP3NheT1uaSIsCiAgICAgICAgICAgICBTQ1JJUFRfTkFNRT0iL3NwYW1taXR5IiwgUEFUSF9JTkZPPSIvc3BhbSIsUVVFUllfU1RSSU5HPSJzYXk9bmkiKQorICAgICAgICBzZWxmLmNoZWNrUmVxVVJJKCJodHRwOi8vMTI3LjAuMC4xL3NwYW1taXR5L3NwYW0/cyVFNHk9bmkiLAorICAgICAgICAgICAgU0NSSVBUX05BTUU9Ii9zcGFtbWl0eSIsIFBBVEhfSU5GTz0iL3NwYW0iLFFVRVJZX1NUUklORz0icyVFNHk9bmkiKQogICAgICAgICBzZWxmLmNoZWNrUmVxVVJJKCJodHRwOi8vMTI3LjAuMC4xL3NwYW1taXR5L3NwYW0iLCAwLAogICAgICAgICAgICAgU0NSSVBUX05BTUU9Ii9zcGFtbWl0eSIsIFBBVEhfSU5GTz0iL3NwYW0iLFFVRVJZX1NUUklORz0ic2F5PW5pIikKIApAQCAtMzQyLDcgKzMwMiw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoSGVhZGVycyh0ZXN0WzpdKS5rZXlzKCksIFsneCddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEhlYWRlcnModGVzdFs6XSkudmFsdWVzKCksIFsneSddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEhlYWRlcnModGVzdFs6XSkuaXRlbXMoKSwgdGVzdCkKLSAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShIZWFkZXJzKHRlc3QpLml0ZW1zKCkgaXMgdGVzdCkgICMgbXVzdCBiZSBjb3B5IQorICAgICAgICBzZWxmLmFzc2VydElzTm90KEhlYWRlcnModGVzdCkuaXRlbXMoKSwgdGVzdCkgICMgbXVzdCBiZSBjb3B5IQogCiAgICAgICAgIGg9SGVhZGVycyhbXSkKICAgICAgICAgZGVsIGhbJ2ZvbyddICAgIyBzaG91bGQgbm90IHJhaXNlIGFuIGVycm9yCkBAIC00MTEsMTUgKzM3MSw2IEBACiAgICAgICAgIHJhaXNlICAgIyBmb3IgdGVzdGluZywgd2Ugd2FudCB0byBzZWUgd2hhdCdzIGhhcHBlbmluZwogCiAKLQotCi0KLQotCi0KLQotCi0KIGNsYXNzIEhhbmRsZXJUZXN0cyhUZXN0Q2FzZSk6CiAKICAgICBkZWYgY2hlY2tFbnZpcm9uQXR0cnMoc2VsZiwgaGFuZGxlcik6CkBAIC00NjAsNyArNDExLDYgQEAKICAgICAgICAgaD1UZXN0SGFuZGxlcigpOyBoLnNldHVwX2Vudmlyb24oKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguZW52aXJvblsnd3NnaS51cmxfc2NoZW1lJ10sJ2h0dHAnKQogCi0KICAgICBkZWYgdGVzdEFic3RyYWN0TWV0aG9kcyhzZWxmKToKICAgICAgICAgaCA9IEJhc2VIYW5kbGVyKCkKICAgICAgICAgZm9yIG5hbWUgaW4gWwpAQCAtNDY5LDcgKzQxOSw2IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBnZXRhdHRyKGgsbmFtZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIGguX3dyaXRlLCAidGVzdCIpCiAKLQogICAgIGRlZiB0ZXN0Q29udGVudExlbmd0aChzZWxmKToKICAgICAgICAgIyBEZW1vIG9uZSByZWFzb24gaXRlcmF0aW9uIGlzIGJldHRlciB0aGFuIHdyaXRlKCkuLi4gIDspCiAKQEAgLTU0OSw3ICs0OTgsNiBAQAogICAgICAgICAgICAgIlxyXG4iK01TRykKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChoLnN0ZGVyci5nZXR2YWx1ZSgpLmZpbmQoIkFzc2VydGlvbkVycm9yIiksIC0xKQogCi0KICAgICBkZWYgdGVzdEhlYWRlckZvcm1hdHMoc2VsZik6CiAKICAgICAgICAgZGVmIG5vbl9lcnJvcl9hcHAoZSxzKToKQEAgLTU5MSw0MCArNTM5LDI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0ZHBhdCUodmVyc2lvbixzdyksIGguc3Rkb3V0LmdldHZhbHVlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICApCiAKLSMgVGhpcyBlcGlsb2d1ZSBpcyBuZWVkZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgUHl0aG9uIDIuNSByZWdydGVzdCBtb2R1bGUKKyAgICBkZWYgdGVzdENsb3NlT25FcnJvcihzZWxmKToKKyAgICAgICAgc2lkZV9lZmZlY3RzID0geydjbG9zZV9jYWxsZWQnOiBGYWxzZX0KKyAgICAgICAgTVNHID0gYiJTb21lIG91dHB1dCBoYXMgYmVlbiBzZW50IgorICAgICAgICBkZWYgZXJyb3JfYXBwKGUscyk6CisgICAgICAgICAgICBzKCIyMDAgT0siLFtdKShNU0cpCisgICAgICAgICAgICBjbGFzcyBDcmFzaHlJdGVyYWJsZShvYmplY3QpOgorICAgICAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGInYmxhaCcKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJUaGlzIHNob3VsZCBiZSBjYXVnaHQgYnkgaGFuZGxlciIpCisKKyAgICAgICAgICAgICAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHNpZGVfZWZmZWN0c1snY2xvc2VfY2FsbGVkJ10gPSBUcnVlCisgICAgICAgICAgICByZXR1cm4gQ3Jhc2h5SXRlcmFibGUoKQorCisgICAgICAgIGggPSBFcnJvckhhbmRsZXIoKQorICAgICAgICBoLnJ1bihlcnJvcl9hcHApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2lkZV9lZmZlY3RzWydjbG9zZV9jYWxsZWQnXSwgVHJ1ZSkKKwogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLSMgdGhlIGFib3ZlIGxpbmVzIGludGVudGlvbmFsbHkgbGVmdCBibGFuawpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF94bWxfZXRyZWUucHkgYi9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZS5weQppbmRleCBmMWE3NzRhLi45ZmI2Yzk5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZS5weQpAQCAtNzEzLDE0ICs3MTMsMjEgQEAKICAgICBlbmQge25hbWVzcGFjZX1yb290CiAgICAgZW5kLW5zIE5vbmUKIAorICAgID4+PiBpbXBvcnQgU3RyaW5nSU8KKworICAgID4+PiBldmVudHMgPSAoJ3N0YXJ0LW5zJywgJ2VuZC1ucycpCisgICAgPj4+IGNvbnRleHQgPSBFVC5pdGVycGFyc2UoU3RyaW5nSU8uU3RyaW5nSU8ociI8cm9vdCB4bWxucz0nJy8+IiksIGV2ZW50cykKKyAgICA+Pj4gZm9yIGFjdGlvbiwgZWxlbSBpbiBjb250ZXh0OgorICAgIC4uLiAgIHByaW50IGFjdGlvbiwgZWxlbQorICAgIHN0YXJ0LW5zICgnJywgJycpCisgICAgZW5kLW5zIE5vbmUKKwogICAgID4+PiBldmVudHMgPSAoInN0YXJ0IiwgImVuZCIsICJib2d1cyIpCiAgICAgPj4+IHdpdGggb3BlbihTSU1QTEVfWE1MRklMRSwgInJiIikgYXMgZjoKICAgICAuLi4gICAgIGl0ZXJwYXJzZShmLCBldmVudHMpCiAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgIFZhbHVlRXJyb3I6IHVua25vd24gZXZlbnQgJ2JvZ3VzJwogCi0gICAgPj4+IGltcG9ydCBTdHJpbmdJTwotCiAgICAgPj4+IHNvdXJjZSA9IFN0cmluZ0lPLlN0cmluZ0lPKAogICAgIC4uLiAgICAgIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J2lzby04ODU5LTEnPz5cXG4iCiAgICAgLi4uICAgICAiPGJvZHkgeG1sbnM9J2h0dHA6Ly8mIzIzMztmZmJvdC5vcmcvbnMnXFxuIgpAQCAtODgzLDYgKzg5MCwxMiBAQAogICAgID4+PiBjaGVja19lbmNvZGluZygiaXNvLTg4NTktMTUiKQogICAgID4+PiBjaGVja19lbmNvZGluZygiY3A0MzciKQogICAgID4+PiBjaGVja19lbmNvZGluZygibWFjLXJvbWFuIikKKyAgICA+Pj4gY2hlY2tfZW5jb2RpbmcoImdiayIpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIFZhbHVlRXJyb3I6IG11bHRpLWJ5dGUgZW5jb2RpbmdzIGFyZSBub3Qgc3VwcG9ydGVkCisgICAgPj4+IGNoZWNrX2VuY29kaW5nKCJjcDAzNyIpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIFBhcnNlRXJyb3I6IHVua25vd24gZW5jb2Rpbmc6IGxpbmUgMSwgY29sdW1uIDMwCiAgICAgIiIiCiAgICAgRVQuWE1MKCI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSclcyc/Pjx4bWwgLz4iICUgZW5jb2RpbmcpCiAKQEAgLTE3NjksNiArMTc4MiwxNiBAQAogCiAgICAgIiIiCiAKK2RlZiBidWdfMTgzNDcoKToKKyAgICAiIiIKKworICAgID4+PiBlID0gRVQuWE1MKCc8aHRtbD48Q2FtZWxDYXNlPnRleHQ8L0NhbWVsQ2FzZT48L2h0bWw+JykKKyAgICA+Pj4gc2VyaWFsaXplKGUpCisgICAgJzxodG1sPjxDYW1lbENhc2U+dGV4dDwvQ2FtZWxDYXNlPjwvaHRtbD4nCisgICAgPj4+IHNlcmlhbGl6ZShlLCBtZXRob2Q9Imh0bWwiKQorICAgICc8aHRtbD48Q2FtZWxDYXNlPnRleHQ8L0NhbWVsQ2FzZT48L2h0bWw+JworICAgICIiIgorCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIHJlcG9ydGVkIG9uIGJ1Z3MucHl0aG9uLm9yZwogCkBAIC0xODIyLDYgKzE4NDUsMjYgQEAKIAogICAgICIiIgogCitkZWYgY2hlY2tfaHRtbF9lbXB0eV9lbGVtc19zZXJpYWxpemF0aW9uKHNlbGYpOgorICAgICMgaXNzdWUgMTU5NzAKKyAgICAjIGZyb20gaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQwMS9pbmRleC9lbGVtZW50cy5odG1sCisgICAgIiIiCisKKyAgICA+Pj4gZW1wdHlfZWxlbXMgPSBbJ0FSRUEnLCAnQkFTRScsICdCQVNFRk9OVCcsICdCUicsICdDT0wnLCAnRlJBTUUnLCAnSFInLAorICAgIC4uLiAgICAgICAgICAgICAgICAnSU1HJywgJ0lOUFVUJywgJ0lTSU5ERVgnLCAnTElOSycsICdNRVRBJywgJ1BBUkFNJ10KKyAgICA+Pj4gZWxlbXMgPSAnJy5qb2luKCc8JXMgLz4nICUgZWxlbSBmb3IgZWxlbSBpbiBlbXB0eV9lbGVtcykKKyAgICA+Pj4gc2VyaWFsaXplKEVULlhNTCgnPGh0bWw+JXM8L2h0bWw+JyAlIGVsZW1zKSwgbWV0aG9kPSdodG1sJykKKyAgICAnPGh0bWw+PEFSRUE+PEJBU0U+PEJBU0VGT05UPjxCUj48Q09MPjxGUkFNRT48SFI+PElNRz48SU5QVVQ+PElTSU5ERVg+PExJTks+PE1FVEE+PFBBUkFNPjwvaHRtbD4nCisgICAgPj4+IHNlcmlhbGl6ZShFVC5YTUwoJzxodG1sPiVzPC9odG1sPicgJSBlbGVtcy5sb3dlcigpKSwgbWV0aG9kPSdodG1sJykKKyAgICAnPGh0bWw+PGFyZWE+PGJhc2U+PGJhc2Vmb250Pjxicj48Y29sPjxmcmFtZT48aHI+PGltZz48aW5wdXQ+PGlzaW5kZXg+PGxpbms+PG1ldGE+PHBhcmFtPjwvaHRtbD4nCisgICAgPj4+IGVsZW1zID0gJycuam9pbignPCVzPjwvJXM+JyAlIChlbGVtLCBlbGVtKSBmb3IgZWxlbSBpbiBlbXB0eV9lbGVtcykKKyAgICA+Pj4gc2VyaWFsaXplKEVULlhNTCgnPGh0bWw+JXM8L2h0bWw+JyAlIGVsZW1zKSwgbWV0aG9kPSdodG1sJykKKyAgICAnPGh0bWw+PEFSRUE+PEJBU0U+PEJBU0VGT05UPjxCUj48Q09MPjxGUkFNRT48SFI+PElNRz48SU5QVVQ+PElTSU5ERVg+PExJTks+PE1FVEE+PFBBUkFNPjwvaHRtbD4nCisgICAgPj4+IHNlcmlhbGl6ZShFVC5YTUwoJzxodG1sPiVzPC9odG1sPicgJSBlbGVtcy5sb3dlcigpKSwgbWV0aG9kPSdodG1sJykKKyAgICAnPGh0bWw+PGFyZWE+PGJhc2U+PGJhc2Vmb250Pjxicj48Y29sPjxmcmFtZT48aHI+PGltZz48aW5wdXQ+PGlzaW5kZXg+PGxpbms+PG1ldGE+PHBhcmFtPjwvaHRtbD4nCisKKyAgICAiIiIKKwogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfeG1scnBjLnB5IGIvTGliL3Rlc3QvdGVzdF94bWxycGMucHkKaW5kZXggYzg4YTFlZS4uMDkyMzVmZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF94bWxycGMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF94bWxycGMucHkKQEAgLTE5LDYgKzE5LDExIEBACiAgICAgdGhyZWFkaW5nID0gTm9uZQogCiB0cnk6CisgICAgaW1wb3J0IGd6aXAKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBnemlwID0gTm9uZQorCit0cnk6CiAgICAgdW5pY29kZQogZXhjZXB0IE5hbWVFcnJvcjoKICAgICBoYXZlX3VuaWNvZGUgPSBGYWxzZQpAQCAtNTg5LDYgKzU5NCwxMiBAQAogICAgICAgICAjIFRoaXMgYXZvaWRzIHdhaXRpbmcgZm9yIHRoZSBzb2NrZXQgdGltZW91dC4KICAgICAgICAgc2VsZi50ZXN0X3NpbXBsZTEoKQogCisgICAgZGVmIHRlc3RfcGFydGlhbF9wb3N0KHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgYSBwYXJ0aWFsIFBPU1QgZG9lc24ndCBtYWtlIHRoZSBzZXJ2ZXIgbG9vcDogaXNzdWUgIzE0MDAxLgorICAgICAgICBjb25uID0gaHR0cGxpYi5IVFRQQ29ubmVjdGlvbihBRERSLCBQT1JUKQorICAgICAgICBjb25uLnJlcXVlc3QoJ1BPU1QnLCAnL1JQQzIgSFRUUC8xLjBcclxuQ29udGVudC1MZW5ndGg6IDEwMFxyXG5cclxuYnllJykKKyAgICAgICAgY29ubi5jbG9zZSgpCisKIGNsYXNzIE11bHRpUGF0aFNlcnZlclRlc3RDYXNlKEJhc2VTZXJ2ZXJUZXN0Q2FzZSk6CiAgICAgdGhyZWFkRnVuYyA9IHN0YXRpY21ldGhvZChodHRwX211bHRpX3NlcnZlcikKICAgICByZXF1ZXN0X2NvdW50ID0gMgpAQCAtNjc1LDYgKzY4Niw3IEBACiAKICNBIHRlc3QgY2FzZSB0aGF0IHZlcmlmaWVzIHRoYXQgZ3ppcCBlbmNvZGluZyB3b3JrcyBpbiBib3RoIGRpcmVjdGlvbnMKICMoZm9yIGEgcmVxdWVzdCBhbmQgdGhlIHJlc3BvbnNlKQorQHVuaXR0ZXN0LnNraXBVbmxlc3MoZ3ppcCwgJ2d6aXAgbm90IGF2YWlsYWJsZScpCiBjbGFzcyBHemlwU2VydmVyVGVzdENhc2UoQmFzZVNlcnZlclRlc3RDYXNlKToKICAgICAjYSByZXF1ZXN0IGhhbmRsZXIgdGhhdCBzdXBwb3J0cyBrZWVwLWFsaXZlIGFuZCBsb2dzIHJlcXVlc3RzIGludG8gYQogICAgICNjbGFzcyB2YXJpYWJsZQpAQCAtMTAwNSwxMSArMTAxNyw3IEBACiAgICAgeG1scnBjX3Rlc3RzLmFwcGVuZChTaW1wbGVTZXJ2ZXJUZXN0Q2FzZSkKICAgICB4bWxycGNfdGVzdHMuYXBwZW5kKEtlZXBhbGl2ZVNlcnZlclRlc3RDYXNlMSkKICAgICB4bWxycGNfdGVzdHMuYXBwZW5kKEtlZXBhbGl2ZVNlcnZlclRlc3RDYXNlMikKLSAgICB0cnk6Ci0gICAgICAgIGltcG9ydCBnemlwCi0gICAgICAgIHhtbHJwY190ZXN0cy5hcHBlbmQoR3ppcFNlcnZlclRlc3RDYXNlKQotICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgcGFzcyAjZ3ppcCBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnVpbGQKKyAgICB4bWxycGNfdGVzdHMuYXBwZW5kKEd6aXBTZXJ2ZXJUZXN0Q2FzZSkKICAgICB4bWxycGNfdGVzdHMuYXBwZW5kKE11bHRpUGF0aFNlcnZlclRlc3RDYXNlKQogICAgIHhtbHJwY190ZXN0cy5hcHBlbmQoU2VydmVyUHJveHlUZXN0Q2FzZSkKICAgICB4bWxycGNfdGVzdHMuYXBwZW5kKEZhaWxpbmdTZXJ2ZXJUZXN0Q2FzZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfeHJhbmdlLnB5IGIvTGliL3Rlc3QvdGVzdF94cmFuZ2UucHkKaW5kZXggZTNjNzk5ZS4uODNjMGU0MSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF94cmFuZ2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF94cmFuZ2UucHkKQEAgLTQ2LDYgKzQ2LDI4IEBACiAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCd7fTogd3JvbmcgZWxlbWVudCBhdCBwb3NpdGlvbiB7fTsnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdleHBlY3RlZCB7fSwgZ290IHt9Jy5mb3JtYXQodGVzdF9pZCwgaSwgeSwgeCkpCiAKKyAgICBkZWYgYXNzZXJ0X3hyYW5nZXNfZXF1aXZhbGVudChzZWxmLCB4LCB5KToKKyAgICAgICAgIyBDaGVjayB0aGF0IHR3byB4cmFuZ2Ugb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgaW4gdGhlIHNlbnNlIG9mIHRoZQorICAgICAgICAjIGFzc29jaWF0ZWQgc2VxdWVuY2VzIGJlaW5nIHRoZSBzYW1lLiAgV2Ugd2FudCB0byB1c2UgdGhpcyBmb3IgbGFyZ2UKKyAgICAgICAgIyB4cmFuZ2Ugb2JqZWN0cywgc28gaW5zdGVhZCBvZiBjb252ZXJ0aW5nIHRvIGxpc3RzIGFuZCBjb21wYXJpbmcKKyAgICAgICAgIyBkaXJlY3RseSB3ZSBkbyBhIG51bWJlciBvZiBpbmRpcmVjdCBjaGVja3MuCisgICAgICAgIGlmIGxlbih4KSAhPSBsZW4oeSk6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ3t9IGFuZCB7fSBoYXZlIGRpZmZlcmVudCAnCisgICAgICAgICAgICAgICAgICAgICAgJ2xlbmd0aHM6IHt9IGFuZCB7fSAnLmZvcm1hdCh4LCB5LCBsZW4oeCksIGxlbih5KSkpCisgICAgICAgIGlmIGxlbih4KSA+PSAxOgorICAgICAgICAgICAgaWYgeFswXSAhPSB5WzBdOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgne30gYW5kIHt9IGhhdmUgZGlmZmVyZW50IGluaXRpYWwgJworICAgICAgICAgICAgICAgICAgICAgICAgICAnZWxlbWVudHM6IHt9IGFuZCB7fSAnLmZvcm1hdCh4LCB5LCB4WzBdLCB5WzBdKSkKKyAgICAgICAgICAgIGlmIHhbLTFdICE9IHlbLTFdOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgne30gYW5kIHt9IGhhdmUgZGlmZmVyZW50IGZpbmFsICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsZW1lbnRzOiB7fSBhbmQge30gJy5mb3JtYXQoeCwgeSwgeFstMV0sIHlbLTFdKSkKKyAgICAgICAgaWYgbGVuKHgpID49IDI6CisgICAgICAgICAgICB4X3N0ZXAgPSB4WzFdIC0geFswXQorICAgICAgICAgICAgeV9zdGVwID0geVsxXSAtIHlbMF0KKyAgICAgICAgICAgIGlmIHhfc3RlcCAhPSB5X3N0ZXA6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCd7fSBhbmQge30gaGF2ZSBkaWZmZXJlbnQgc3RlcDogJworICAgICAgICAgICAgICAgICAgICAgICAgICAne30gYW5kIHt9ICcuZm9ybWF0KHgsIHksIHhfc3RlcCwgeV9zdGVwKSkKKwogICAgIGRlZiB0ZXN0X3hyYW5nZShzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHhyYW5nZSgzKSksIFswLCAxLCAyXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHhyYW5nZSgxLCA1KSksIFsxLCAyLCAzLCA0XSkKQEAgLTEwNCw2ICsxMjYsNTkgQEAKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyhyLCBwcm90bykpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QocikpCiAKKyAgICAgICAgTSA9IG1pbihzeXMubWF4aW50LCBzeXMubWF4c2l6ZSkKKyAgICAgICAgbGFyZ2VfdGVzdGNhc2VzID0gdGVzdGNhc2VzICsgWworICAgICAgICAgICAgKDAsIE0sIDEpLAorICAgICAgICAgICAgKE0sIDAsIC0xKSwKKyAgICAgICAgICAgICgwLCBNLCBNIC0gMSksCisgICAgICAgICAgICAoTSAvLyAyLCBNLCAxKSwKKyAgICAgICAgICAgICgwLCAtTSwgLTEpLAorICAgICAgICAgICAgKDAsIC1NLCAxIC0gTSksCisgICAgICAgICAgICAoLU0sIE0sIDIpLAorICAgICAgICAgICAgKC1NLCBNLCAxMDI0KSwKKyAgICAgICAgICAgICgtTSwgTSwgMTA1ODUpLAorICAgICAgICAgICAgKE0sIC1NLCAtMiksCisgICAgICAgICAgICAoTSwgLU0sIC0xMDI0KSwKKyAgICAgICAgICAgIChNLCAtTSwgLTEwNTg1KSwKKyAgICAgICAgICAgIF0KKyAgICAgICAgZm9yIHByb3RvIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6CisgICAgICAgICAgICBmb3IgdCBpbiBsYXJnZV90ZXN0Y2FzZXM6CisgICAgICAgICAgICAgICAgciA9IHhyYW5nZSgqdCkKKyAgICAgICAgICAgICAgICByX291dCA9IHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMociwgcHJvdG8pKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0X3hyYW5nZXNfZXF1aXZhbGVudChyX291dCwgcikKKworICAgIGRlZiB0ZXN0X3JlcHIoc2VsZik6CisgICAgICAgICMgQ2hlY2sgdGhhdCByZXByIG9mIGFuIHhyYW5nZSBpcyBhIHZhbGlkIHJlcHJlc2VudGF0aW9uCisgICAgICAgICMgb2YgdGhhdCB4cmFuZ2UuCisKKyAgICAgICAgIyBWYWxpZCB4cmFuZ2VzIGhhdmUgYXQgbW9zdCBtaW4oc3lzLm1heGludCwgc3lzLm1heHNpemUpIGVsZW1lbnRzLgorICAgICAgICBNID0gbWluKHN5cy5tYXhpbnQsIHN5cy5tYXhzaXplKQorCisgICAgICAgIHRlc3RjYXNlcyA9IFsKKyAgICAgICAgICAgICgxMywpLAorICAgICAgICAgICAgKDAsIDExKSwKKyAgICAgICAgICAgICgtMjIsIDEwKSwKKyAgICAgICAgICAgICgyMCwgMywgLTEpLAorICAgICAgICAgICAgKDEzLCAyMSwgMyksCisgICAgICAgICAgICAoLTIsIDIsIDIpLAorICAgICAgICAgICAgKDAsIE0sIDEpLAorICAgICAgICAgICAgKE0sIDAsIC0xKSwKKyAgICAgICAgICAgICgwLCBNLCBNIC0gMSksCisgICAgICAgICAgICAoTSAvLyAyLCBNLCAxKSwKKyAgICAgICAgICAgICgwLCAtTSwgLTEpLAorICAgICAgICAgICAgKDAsIC1NLCAxIC0gTSksCisgICAgICAgICAgICAoLU0sIE0sIDIpLAorICAgICAgICAgICAgKC1NLCBNLCAxMDI0KSwKKyAgICAgICAgICAgICgtTSwgTSwgMTA1ODUpLAorICAgICAgICAgICAgKE0sIC1NLCAtMiksCisgICAgICAgICAgICAoTSwgLU0sIC0xMDI0KSwKKyAgICAgICAgICAgIChNLCAtTSwgLTEwNTg1KSwKKyAgICAgICAgICAgIF0KKyAgICAgICAgZm9yIHQgaW4gdGVzdGNhc2VzOgorICAgICAgICAgICAgciA9IHhyYW5nZSgqdCkKKyAgICAgICAgICAgIHJfb3V0ID0gZXZhbChyZXByKHIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfeHJhbmdlc19lcXVpdmFsZW50KHIsIHJfb3V0KQorCiAgICAgZGVmIHRlc3RfcmFuZ2VfaXRlcmF0b3JzKHNlbGYpOgogICAgICAgICAjIHNlZSBpc3N1ZSA3Mjk4CiAgICAgICAgIGxpbWl0cyA9IFtiYXNlICsgamlnZ2xlCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3ppcGZpbGUucHkgYi9MaWIvdGVzdC90ZXN0X3ppcGZpbGUucHkKaW5kZXggN2ViYjY2My4uMGJhY2MxYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF96aXBmaWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfemlwZmlsZS5weQpAQCAtOCw3ICs4LDYgQEAKIGltcG9ydCBpbwogaW1wb3J0IHN5cwogaW1wb3J0IHRpbWUKLWltcG9ydCBzaHV0aWwKIGltcG9ydCBzdHJ1Y3QKIGltcG9ydCB6aXBmaWxlCiBpbXBvcnQgdW5pdHRlc3QKQEAgLTE4LDcgKzE3LDE0IEBACiBmcm9tIHJhbmRvbSBpbXBvcnQgcmFuZGludCwgcmFuZG9tCiBmcm9tIHVuaXR0ZXN0IGltcG9ydCBza2lwVW5sZXNzCiAKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRFU1RGTiwgcnVuX3VuaXR0ZXN0LCBmaW5kZmlsZSwgdW5saW5rCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBURVNURk4sIFRFU1RGTl9VTklDT0RFLCBURVNURk5fRU5DT0RJTkcsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl91bml0dGVzdCwgZmluZGZpbGUsIHVubGluaywgcm10cmVlLCBjaGVja193YXJuaW5ncwordHJ5OgorICAgIFRFU1RGTl9VTklDT0RFLmVuY29kZShURVNURk5fRU5DT0RJTkcpCitleGNlcHQgKFVuaWNvZGVFcnJvciwgVHlwZUVycm9yKToKKyAgICAjIEVpdGhlciB0aGUgZmlsZSBzeXN0ZW0gZW5jb2RpbmcgaXMgTm9uZSwgb3IgdGhlIGZpbGUgbmFtZQorICAgICMgY2Fubm90IGJlIGVuY29kZWQgaW4gdGhlIGZpbGUgc3lzdGVtIGVuY29kaW5nLgorICAgIFRFU1RGTl9VTklDT0RFID0gTm9uZQogCiBURVNURk4yID0gVEVTVEZOICsgIjIiCiBURVNURk5ESVIgPSBURVNURk4gKyAiZCIKQEAgLTI2LDcgKzMyLDcgQEAKIAogU01BTExfVEVTVF9EQVRBID0gWygnX3ppcHRlc3QxJywgJzFxMnczZTRyNXQnKSwKICAgICAgICAgICAgICAgICAgICAoJ3ppcHRlc3QyZGlyL196aXB0ZXN0MicsICdxYXdzZWRyZnRnJyksCi0gICAgICAgICAgICAgICAgICAgKCcvemlwdGVzdDJkaXIvemlwdGVzdDNkaXIvX3ppcHRlc3QzJywgJ2F6c3hkY2Z2Z2InKSwKKyAgICAgICAgICAgICAgICAgICAoJ3ppcHRlc3QyZGlyL3ppcHRlc3QzZGlyL196aXB0ZXN0MycsICdhenN4ZGNmdmdiJyksCiAgICAgICAgICAgICAgICAgICAgKCd6aXB0ZXN0MmRpci96aXB0ZXN0M2Rpci96aXB0ZXN0NGRpci9femlwdGVzdDMnLCAnNnk3dThpOW8wcCcpXQogCiAKQEAgLTE0MSw3ICsxNDcsOSBAQAogICAgICAgICAjIENyZWF0ZSB0aGUgWklQIGFyY2hpdmUKICAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgInciLCB6aXBmaWxlLlpJUF9TVE9SRUQpIGFzIHppcGZwOgogICAgICAgICAgICAgemlwZnAud3JpdGVzdHIoIm5hbWUiLCAiZm9vIikKLSAgICAgICAgICAgIHppcGZwLndyaXRlc3RyKCJuYW1lIiwgImJhciIpCisgICAgICAgICAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKCgnJywgVXNlcldhcm5pbmcpKToKKyAgICAgICAgICAgICAgICB6aXBmcC53cml0ZXN0cigibmFtZSIsICJiYXIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmcC5uYW1lbGlzdCgpLCBbIm5hbWUiXSAqIDIpCiAKICAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgInIiKSBhcyB6aXBmcDoKICAgICAgICAgICAgIGluZm9zID0gemlwZnAuaW5mb2xpc3QoKQpAQCAtMzU4LDcgKzM2Niw4IEBACiAgICAgICAgIHByb2R1Y2VzIHRoZSBleHBlY3RlZCByZXN1bHQuIiIiCiAgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICJ3IikgYXMgemlwZnA6CiAgICAgICAgICAgICB6aXBmcC53cml0ZShURVNURk4pCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGZwLnJlYWQoVEVTVEZOKSwgb3BlbihURVNURk4pLnJlYWQoKSkKKyAgICAgICAgICAgIHdpdGggb3BlbihURVNURk4sJ3InKSBhcyBmaWQ6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmcC5yZWFkKFRFU1RGTiksIGZpZC5yZWFkKCkpCiAKICAgICBAc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCiAgICAgZGVmIHRlc3RfcGVyX2ZpbGVfY29tcHJlc3Npb24oc2VsZik6CkBAIC0zOTEsMjAgKzQwMCwxOCBAQAogICAgICAgICAgICAgICAgIHdyaXR0ZW5maWxlID0gemlwZnAuZXh0cmFjdChmcGF0aCkKIAogICAgICAgICAgICAgICAgICMgbWFrZSBzdXJlIGl0IHdhcyB3cml0dGVuIHRvIHRoZSByaWdodCBwbGFjZQotICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNhYnMoZnBhdGgpOgotICAgICAgICAgICAgICAgICAgICBjb3JyZWN0ZmlsZSA9IG9zLnBhdGguam9pbihvcy5nZXRjd2QoKSwgZnBhdGhbMTpdKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIGNvcnJlY3RmaWxlID0gb3MucGF0aC5qb2luKG9zLmdldGN3ZCgpLCBmcGF0aCkKKyAgICAgICAgICAgICAgICBjb3JyZWN0ZmlsZSA9IG9zLnBhdGguam9pbihvcy5nZXRjd2QoKSwgZnBhdGgpCiAgICAgICAgICAgICAgICAgY29ycmVjdGZpbGUgPSBvcy5wYXRoLm5vcm1wYXRoKGNvcnJlY3RmaWxlKQogCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cml0dGVuZmlsZSwgY29ycmVjdGZpbGUpCiAKICAgICAgICAgICAgICAgICAjIG1ha2Ugc3VyZSBjb3JyZWN0IGRhdGEgaXMgaW4gY29ycmVjdCBmaWxlCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmZGF0YSwgb3Blbih3cml0dGVuZmlsZSwgInJiIikucmVhZCgpKQorICAgICAgICAgICAgICAgIHdpdGggb3Blbih3cml0dGVuZmlsZSwgInJiIikgYXMgZmlkOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZkYXRhLCBmaWQucmVhZCgpKQogICAgICAgICAgICAgICAgIG9zLnJlbW92ZSh3cml0dGVuZmlsZSkKIAogICAgICAgICAjIHJlbW92ZSB0aGUgdGVzdCBmaWxlIHN1YmRpcmVjdG9yaWVzCi0gICAgICAgIHNodXRpbC5ybXRyZWUob3MucGF0aC5qb2luKG9zLmdldGN3ZCgpLCAnemlwdGVzdDJkaXInKSkKKyAgICAgICAgcm10cmVlKG9zLnBhdGguam9pbihvcy5nZXRjd2QoKSwgJ3ppcHRlc3QyZGlyJykpCiAKICAgICBkZWYgdGVzdF9leHRyYWN0X2FsbChzZWxmKToKICAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgInciLCB6aXBmaWxlLlpJUF9TVE9SRUQpIGFzIHppcGZwOgpAQCAtNDE0LDE2ICs0MjEsMTIwIEBACiAgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICJyIikgYXMgemlwZnA6CiAgICAgICAgICAgICB6aXBmcC5leHRyYWN0YWxsKCkKICAgICAgICAgICAgIGZvciBmcGF0aCwgZmRhdGEgaW4gU01BTExfVEVTVF9EQVRBOgotICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNhYnMoZnBhdGgpOgotICAgICAgICAgICAgICAgICAgICBvdXRmaWxlID0gb3MucGF0aC5qb2luKG9zLmdldGN3ZCgpLCBmcGF0aFsxOl0pCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZSA9IG9zLnBhdGguam9pbihvcy5nZXRjd2QoKSwgZnBhdGgpCisgICAgICAgICAgICAgICAgb3V0ZmlsZSA9IG9zLnBhdGguam9pbihvcy5nZXRjd2QoKSwgZnBhdGgpCiAKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZkYXRhLCBvcGVuKG91dGZpbGUsICJyYiIpLnJlYWQoKSkKKyAgICAgICAgICAgICAgICB3aXRoIG9wZW4ob3V0ZmlsZSwgInJiIikgYXMgZmlkOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZkYXRhLCBmaWQucmVhZCgpKQogICAgICAgICAgICAgICAgIG9zLnJlbW92ZShvdXRmaWxlKQogCiAgICAgICAgICMgcmVtb3ZlIHRoZSB0ZXN0IGZpbGUgc3ViZGlyZWN0b3JpZXMKLSAgICAgICAgc2h1dGlsLnJtdHJlZShvcy5wYXRoLmpvaW4ob3MuZ2V0Y3dkKCksICd6aXB0ZXN0MmRpcicpKQorICAgICAgICBybXRyZWUob3MucGF0aC5qb2luKG9zLmdldGN3ZCgpLCAnemlwdGVzdDJkaXInKSkKKworICAgIGRlZiBjaGVja19maWxlKHNlbGYsIGZpbGVuYW1lLCBjb250ZW50KToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNmaWxlKGZpbGVuYW1lKSkKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAncmInKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgY29udGVudCkKKworICAgIEBza2lwVW5sZXNzKFRFU1RGTl9VTklDT0RFLCAiTm8gVW5pY29kZSBmaWxlc3lzdGVtIHNlbWFudGljcyBvbiB0aGlzIHBsYXRmb3JtLiIpCisgICAgZGVmIHRlc3RfZXh0cmFjdF91bmljb2RlX2ZpbGVuYW1lcyhzZWxmKToKKyAgICAgICAgZm5hbWVzID0gW3UnZm9vLnR4dCcsIG9zLnBhdGguYmFzZW5hbWUoVEVTVEZOX1VOSUNPREUpXQorICAgICAgICBjb250ZW50ID0gJ1Rlc3QgZm9yIHVuaWNvZGUgZmlsZW5hbWUnCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICJ3IiwgemlwZmlsZS5aSVBfU1RPUkVEKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIGZvciBmbmFtZSBpbiBmbmFtZXM6CisgICAgICAgICAgICAgICAgemlwZnAud3JpdGVzdHIoZm5hbWUsIGNvbnRlbnQpCisKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgInIiKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIGZvciBmbmFtZSBpbiBmbmFtZXM6CisgICAgICAgICAgICAgICAgd3JpdHRlbmZpbGUgPSB6aXBmcC5leHRyYWN0KGZuYW1lKQorCisgICAgICAgICAgICAgICAgIyBtYWtlIHN1cmUgaXQgd2FzIHdyaXR0ZW4gdG8gdGhlIHJpZ2h0IHBsYWNlCisgICAgICAgICAgICAgICAgY29ycmVjdGZpbGUgPSBvcy5wYXRoLmpvaW4ob3MuZ2V0Y3dkKCksIGZuYW1lKQorICAgICAgICAgICAgICAgIGNvcnJlY3RmaWxlID0gb3MucGF0aC5ub3JtcGF0aChjb3JyZWN0ZmlsZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyaXR0ZW5maWxlLCBjb3JyZWN0ZmlsZSkKKworICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfZmlsZSh3cml0dGVuZmlsZSwgY29udGVudCkKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUod3JpdHRlbmZpbGUpCisKKyAgICBkZWYgdGVzdF9leHRyYWN0X2hhY2tlcnNfYXJjbmFtZXMoc2VsZik6CisgICAgICAgIGhhY2tuYW1lcyA9IFsKKyAgICAgICAgICAgICgnLi4vZm9vL2JhcicsICdmb28vYmFyJyksCisgICAgICAgICAgICAoJ2Zvby8uLi9iYXInLCAnZm9vL2JhcicpLAorICAgICAgICAgICAgKCdmb28vLi4vLi4vYmFyJywgJ2Zvby9iYXInKSwKKyAgICAgICAgICAgICgnZm9vL2Jhci8uLicsICdmb28vYmFyJyksCisgICAgICAgICAgICAoJy4vLi4vZm9vL2JhcicsICdmb28vYmFyJyksCisgICAgICAgICAgICAoJy9mb28vYmFyJywgJ2Zvby9iYXInKSwKKyAgICAgICAgICAgICgnL2Zvby8uLi9iYXInLCAnZm9vL2JhcicpLAorICAgICAgICAgICAgKCcvZm9vLy4uLy4uL2JhcicsICdmb28vYmFyJyksCisgICAgICAgIF0KKyAgICAgICAgaWYgb3MucGF0aC5zZXAgPT0gJ1xcJzoKKyAgICAgICAgICAgIGhhY2tuYW1lcy5leHRlbmQoWworICAgICAgICAgICAgICAgIChyJy4uXGZvb1xiYXInLCAnZm9vL2JhcicpLAorICAgICAgICAgICAgICAgIChyJy4uXC9mb29cL2JhcicsICdmb28vYmFyJyksCisgICAgICAgICAgICAgICAgKHInZm9vL1wuLlwvYmFyJywgJ2Zvby9iYXInKSwKKyAgICAgICAgICAgICAgICAocidmb29cLy4uL1xiYXInLCAnZm9vL2JhcicpLAorICAgICAgICAgICAgICAgIChyJ0M6Zm9vL2JhcicsICdmb28vYmFyJyksCisgICAgICAgICAgICAgICAgKHInQzovZm9vL2JhcicsICdmb28vYmFyJyksCisgICAgICAgICAgICAgICAgKHInQzovL2Zvby9iYXInLCAnZm9vL2JhcicpLAorICAgICAgICAgICAgICAgIChyJ0M6XGZvb1xiYXInLCAnZm9vL2JhcicpLAorICAgICAgICAgICAgICAgIChyJy8vY29ua3kvbW91bnRwb2ludC9mb28vYmFyJywgJ2Zvby9iYXInKSwKKyAgICAgICAgICAgICAgICAocidcXGNvbmt5XG1vdW50cG9pbnRcZm9vXGJhcicsICdmb28vYmFyJyksCisgICAgICAgICAgICAgICAgKHInLy8vY29ua3kvbW91bnRwb2ludC9mb28vYmFyJywgJ2Nvbmt5L21vdW50cG9pbnQvZm9vL2JhcicpLAorICAgICAgICAgICAgICAgIChyJ1xcXGNvbmt5XG1vdW50cG9pbnRcZm9vXGJhcicsICdjb25reS9tb3VudHBvaW50L2Zvby9iYXInKSwKKyAgICAgICAgICAgICAgICAocicvL2Nvbmt5Ly9tb3VudHBvaW50L2Zvby9iYXInLCAnY29ua3kvbW91bnRwb2ludC9mb28vYmFyJyksCisgICAgICAgICAgICAgICAgKHInXFxjb25reVxcbW91bnRwb2ludFxmb29cYmFyJywgJ2Nvbmt5L21vdW50cG9pbnQvZm9vL2JhcicpLAorICAgICAgICAgICAgICAgIChyJy8vPy9DOi9mb28vYmFyJywgJ2Zvby9iYXInKSwKKyAgICAgICAgICAgICAgICAocidcXD9cQzpcZm9vXGJhcicsICdmb28vYmFyJyksCisgICAgICAgICAgICAgICAgKHInQzovLi4vQzovZm9vL2JhcicsICdDXy9mb28vYmFyJyksCisgICAgICAgICAgICAgICAgKHInYTpiXGM8ZD5lfGYiZz9oKmknLCAnYi9jX2RfZV9mX2dfaF9pJyksCisgICAgICAgICAgICAgICAgKCcuLi8uLi9mb28uLi8uLi9iYS4ucicsICdmb28vYmEuLnInKSwKKyAgICAgICAgICAgIF0pCisgICAgICAgIGVsc2U6ICAjIFVuaXgKKyAgICAgICAgICAgIGhhY2tuYW1lcy5leHRlbmQoWworICAgICAgICAgICAgICAgICgnLy9mb28vYmFyJywgJ2Zvby9iYXInKSwKKyAgICAgICAgICAgICAgICAoJy4uLy4uL2Zvby4uLy4uL2JhLi5yJywgJ2Zvby4uL2JhLi5yJyksCisgICAgICAgICAgICAgICAgKHInZm9vLy4uXGJhcicsIHInZm9vLy4uXGJhcicpLAorICAgICAgICAgICAgXSkKKworICAgICAgICBmb3IgYXJjbmFtZSwgZml4ZWRuYW1lIGluIGhhY2tuYW1lczoKKyAgICAgICAgICAgIGNvbnRlbnQgPSBiJ2Zvb2JhcicgKyBhcmNuYW1lLmVuY29kZSgpCisgICAgICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAndycsIHppcGZpbGUuWklQX1NUT1JFRCkgYXMgemlwZnA6CisgICAgICAgICAgICAgICAgemluZm8gPSB6aXBmaWxlLlppcEluZm8oKQorICAgICAgICAgICAgICAgICMgcHJlc2VydmUgYmFja3NsYXNoZXMKKyAgICAgICAgICAgICAgICB6aW5mby5maWxlbmFtZSA9IGFyY25hbWUKKyAgICAgICAgICAgICAgICB6aW5mby5leHRlcm5hbF9hdHRyID0gMG82MDAgPDwgMTYKKyAgICAgICAgICAgICAgICB6aXBmcC53cml0ZXN0cih6aW5mbywgY29udGVudCkKKworICAgICAgICAgICAgYXJjbmFtZSA9IGFyY25hbWUucmVwbGFjZShvcy5zZXAsICIvIikKKyAgICAgICAgICAgIHRhcmdldHBhdGggPSBvcy5wYXRoLmpvaW4oJ3RhcmdldCcsICdzdWJkaXInLCAnc3Vic3ViJykKKyAgICAgICAgICAgIGNvcnJlY3RmaWxlID0gb3MucGF0aC5qb2luKHRhcmdldHBhdGgsICpmaXhlZG5hbWUuc3BsaXQoJy8nKSkKKworICAgICAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgJ3InKSBhcyB6aXBmcDoKKyAgICAgICAgICAgICAgICB3cml0dGVuZmlsZSA9IHppcGZwLmV4dHJhY3QoYXJjbmFtZSwgdGFyZ2V0cGF0aCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyaXR0ZW5maWxlLCBjb3JyZWN0ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZz0iZXh0cmFjdCAlciIgJSBhcmNuYW1lKQorICAgICAgICAgICAgc2VsZi5jaGVja19maWxlKGNvcnJlY3RmaWxlLCBjb250ZW50KQorICAgICAgICAgICAgcm10cmVlKCd0YXJnZXQnKQorCisgICAgICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAncicpIGFzIHppcGZwOgorICAgICAgICAgICAgICAgIHppcGZwLmV4dHJhY3RhbGwodGFyZ2V0cGF0aCkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfZmlsZShjb3JyZWN0ZmlsZSwgY29udGVudCkKKyAgICAgICAgICAgIHJtdHJlZSgndGFyZ2V0JykKKworICAgICAgICAgICAgY29ycmVjdGZpbGUgPSBvcy5wYXRoLmpvaW4ob3MuZ2V0Y3dkKCksICpmaXhlZG5hbWUuc3BsaXQoJy8nKSkKKworICAgICAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgJ3InKSBhcyB6aXBmcDoKKyAgICAgICAgICAgICAgICB3cml0dGVuZmlsZSA9IHppcGZwLmV4dHJhY3QoYXJjbmFtZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyaXR0ZW5maWxlLCBjb3JyZWN0ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZz0iZXh0cmFjdCAlciIgJSBhcmNuYW1lKQorICAgICAgICAgICAgc2VsZi5jaGVja19maWxlKGNvcnJlY3RmaWxlLCBjb250ZW50KQorICAgICAgICAgICAgcm10cmVlKGZpeGVkbmFtZS5zcGxpdCgnLycpWzBdKQorCisgICAgICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAncicpIGFzIHppcGZwOgorICAgICAgICAgICAgICAgIHppcGZwLmV4dHJhY3RhbGwoKQorICAgICAgICAgICAgc2VsZi5jaGVja19maWxlKGNvcnJlY3RmaWxlLCBjb250ZW50KQorICAgICAgICAgICAgcm10cmVlKGZpeGVkbmFtZS5zcGxpdCgnLycpWzBdKQorCisgICAgICAgICAgICBvcy5yZW1vdmUoVEVTVEZOMikKIAogICAgIGRlZiB0ZXN0X3dyaXRlc3RyX2NvbXByZXNzaW9uKHNlbGYpOgogICAgICAgICB6aXBmcCA9IHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAidyIpCkBAIC02NjYsMTEgKzc3NywxMiBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbignbW9kMi50eHQnLCBuYW1lcykKIAogICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShURVNURk4yKQorICAgICAgICAgICAgcm10cmVlKFRFU1RGTjIpCiAKICAgICBkZWYgdGVzdF93cml0ZV9ub25fcHlmaWxlKHNlbGYpOgogICAgICAgICB3aXRoIHppcGZpbGUuUHlaaXBGaWxlKFRlbXBvcmFyeUZpbGUoKSwgInciKSBhcyB6aXBmcDoKLSAgICAgICAgICAgIG9wZW4oVEVTVEZOLCAndycpLndyaXRlKCdtb3N0IGRlZmluaXRlbHkgbm90IGEgcHl0aG9uIGZpbGUnKQorICAgICAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgJ3cnKSBhcyBmaWQ6CisgICAgICAgICAgICAgICAgZmlkLndyaXRlKCdtb3N0IGRlZmluaXRlbHkgbm90IGEgcHl0aG9uIGZpbGUnKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCB6aXBmcC53cml0ZXB5LCBURVNURk4pCiAgICAgICAgICAgICBvcy5yZW1vdmUoVEVTVEZOKQogCkBAIC03NjAsNiArODcyLDIwIEBACiAgICAgICAgIGNoayA9IHppcGZpbGUuaXNfemlwZmlsZShmcCkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjaGspCiAKKyAgICBkZWYgdGVzdF9kYW1hZ2VkX3ppcGZpbGUoc2VsZik6CisgICAgICAgICIiIkNoZWNrIHRoYXQgemlwZmlsZXMgd2l0aCBtaXNzaW5nIGJ5dGVzIGF0IHRoZSBlbmQgcmFpc2UgQmFkWmlwRmlsZS4iIiIKKyAgICAgICAgIyAtIENyZWF0ZSBhIHZhbGlkIHppcCBmaWxlCisgICAgICAgIGZwID0gaW8uQnl0ZXNJTygpCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGZwLCBtb2RlPSJ3IikgYXMgemlwZjoKKyAgICAgICAgICAgIHppcGYud3JpdGVzdHIoImZvby50eHQiLCBiIk8sIGZvciBhIE11c2Ugb2YgRmlyZSEiKQorICAgICAgICB6aXBmaWxlZGF0YSA9IGZwLmdldHZhbHVlKCkKKworICAgICAgICAjIC0gTm93IGNyZWF0ZSBjb3BpZXMgb2YgaXQgbWlzc2luZyB0aGUgbGFzdCBOIGJ5dGVzIGFuZCBtYWtlIHN1cmUKKyAgICAgICAgIyAgIGEgQmFkWmlwRmlsZSBleGNlcHRpb24gaXMgcmFpc2VkIHdoZW4gd2UgdHJ5IHRvIG9wZW4gaXQKKyAgICAgICAgZm9yIE4gaW4gcmFuZ2UobGVuKHppcGZpbGVkYXRhKSk6CisgICAgICAgICAgICBmcCA9IGlvLkJ5dGVzSU8oemlwZmlsZWRhdGFbOk5dKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoemlwZmlsZS5CYWRaaXBmaWxlLCB6aXBmaWxlLlppcEZpbGUsIGZwKQorCiAgICAgZGVmIHRlc3RfaXNfemlwX3ZhbGlkX2ZpbGUoc2VsZik6CiAgICAgICAgICIiIkNoZWNrIHRoYXQgaXNfemlwZmlsZSgpIGNvcnJlY3RseSBpZGVudGlmaWVzIHppcCBmaWxlcy4iIiIKICAgICAgICAgIyAtIHBhc3NpbmcgYSBmaWxlbmFtZQpAQCAtODExLDcgKzkzNyw3IEBACiAgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGRhdGEsIG1vZGU9InciKSBhcyB6aXBmOgogICAgICAgICAgICAgemlwZi53cml0ZXN0cigiZm9vLnR4dCIsICJPLCBmb3IgYSBNdXNlIG9mIEZpcmUhIikKIAotICAgICAgICAjIFRoaXMgaXMgY29ycmVjdDsgY2FsbGluZyAucmVhZCBvbiBhIGNsb3NlZCBaaXBGaWxlIHNob3VsZCB0aHJvdworICAgICAgICAjIFRoaXMgaXMgY29ycmVjdDsgY2FsbGluZyAucmVhZCBvbiBhIGNsb3NlZCBaaXBGaWxlIHNob3VsZCByYWlzZQogICAgICAgICAjIGEgUnVudGltZUVycm9yLCBhbmQgc28gc2hvdWxkIGNhbGxpbmcgLnRlc3R6aXAuICBBbiBlYXJsaWVyCiAgICAgICAgICMgdmVyc2lvbiBvZiAudGVzdHppcCB3b3VsZCBzd2FsbG93IHRoaXMgZXhjZXB0aW9uIChhbmQgYW55IG90aGVyKQogICAgICAgICAjIGFuZCByZXBvcnQgdGhhdCB0aGUgZmlyc3QgZmlsZSBpbiB0aGUgYXJjaGl2ZSB3YXMgY29ycnVwdC4KQEAgLTgxOSw4ICs5NDUsOSBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHppcGYub3BlbiwgImZvby50eHQiKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHppcGYudGVzdHppcCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCB6aXBmLndyaXRlc3RyLCAiYm9ndXMudHh0IiwgImJvZ3VzIikKLSAgICAgICAgb3BlbihURVNURk4sICd3Jykud3JpdGUoJ3ppcGZpbGUgdGVzdCBkYXRhJykKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCB6aXBmLndyaXRlLCBURVNURk4pCisgICAgICAgIHdpdGggb3BlbihURVNURk4sICd3JykgYXMgZmlkOgorICAgICAgICAgICAgZmlkLndyaXRlKCd6aXBmaWxlIHRlc3QgZGF0YScpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHppcGYud3JpdGUsIFRFU1RGTikKIAogICAgIGRlZiB0ZXN0X2JhZF9jb25zdHJ1Y3Rvcl9tb2RlKHNlbGYpOgogICAgICAgICAiIiJDaGVjayB0aGF0IGJhZCBtb2RlcyBwYXNzZWQgdG8gWmlwRmlsZSBjb25zdHJ1Y3RvciBhcmUgY2F1Z2h0LiIiIgpAQCAtODU5LDYgKzk4NiwxNyBAQAogICAgICAgICBjYXVnaHQuIiIiCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgemlwZmlsZS5aaXBGaWxlLCBURVNURk4sICJ3IiwgLTEpCiAKKyAgICBkZWYgdGVzdF91bnN1cHBvcnRlZF9jb21wcmVzc2lvbihzZWxmKToKKyAgICAgICAgIyBkYXRhIGlzIGRlY2xhcmVkIGFzIHNocnVuaywgYnV0IGFjdHVhbGx5IGRlZmxhdGVkCisgICAgICAgIGRhdGEgPSAoYidQS1x4MDNceDA0Llx4MDBceDAwXHgwMFx4MDFceDAwXHhlNENceGExQFx4MDBceDAwXHgwMCcKKyAgICAgICAgYidceDAwXHgwMlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAxXHgwMFx4MDBceDAweFx4MDNceDAwUEtceDAxJworICAgICAgICBiJ1x4MDIuXHgwMy5ceDAwXHgwMFx4MDBceDAxXHgwMFx4ZTRDXHhhMUBceDAwXHgwMFx4MDBceDAwXHgwMlx4MDBceDAwJworICAgICAgICBiJ1x4MDBceDAwXHgwMFx4MDBceDAwXHgwMVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwJworICAgICAgICBiJ1x4ODBceDAxXHgwMFx4MDBceDAwXHgwMHhQS1x4MDVceDA2XHgwMFx4MDBceDAwXHgwMFx4MDFceDAwXHgwMVx4MDAnCisgICAgICAgIGInL1x4MDBceDAwXHgwMCFceDAwXHgwMFx4MDBceDAwXHgwMCcpCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGlvLkJ5dGVzSU8oZGF0YSksICdyJykgYXMgemlwZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIHppcGYub3BlbiwgJ3gnKQorCiAgICAgZGVmIHRlc3RfbnVsbF9ieXRlX2luX2ZpbGVuYW1lKHNlbGYpOgogICAgICAgICAiIiJDaGVjayB0aGF0IGEgZmlsZW5hbWUgY29udGFpbmluZyBhIG51bGwgYnl0ZSBpcyBwcm9wZXJseQogICAgICAgICB0ZXJtaW5hdGVkLiIiIgpAQCAtOTAzLDExICsxMDQxLDI4IEBACiAKICAgICAgICAgIyBjaGVjayBhIGNvbW1lbnQgdGhhdCBpcyB0b28gbG9uZyBpcyB0cnVuY2F0ZWQKICAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOLCBtb2RlPSJ3IikgYXMgemlwZjoKLSAgICAgICAgICAgIHppcGYuY29tbWVudCA9IGNvbW1lbnQyICsgJ29vcHMnCisgICAgICAgICAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKCgnJywgVXNlcldhcm5pbmcpKToKKyAgICAgICAgICAgICAgICB6aXBmLmNvbW1lbnQgPSBjb21tZW50MiArICdvb3BzJwogICAgICAgICAgICAgemlwZi53cml0ZXN0cigiZm9vLnR4dCIsICJPLCBmb3IgYSBNdXNlIG9mIEZpcmUhIikKICAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOLCBtb2RlPSJyIikgYXMgemlwZjoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZi5jb21tZW50LCBjb21tZW50MikKIAorICAgIGRlZiB0ZXN0X2NoYW5nZV9jb21tZW50X2luX2VtcHR5X2FyY2hpdmUoc2VsZik6CisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgImEiLCB6aXBmaWxlLlpJUF9TVE9SRUQpIGFzIHppcGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHppcGYuZmlsZWxpc3QpCisgICAgICAgICAgICB6aXBmLmNvbW1lbnQgPSBiInRoaXMgaXMgYSBjb21tZW50IgorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4sICJyIikgYXMgemlwZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZi5jb21tZW50LCBiInRoaXMgaXMgYSBjb21tZW50IikKKworICAgIGRlZiB0ZXN0X2NoYW5nZV9jb21tZW50X2luX25vbmVtcHR5X2FyY2hpdmUoc2VsZik6CisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgInciLCB6aXBmaWxlLlpJUF9TVE9SRUQpIGFzIHppcGY6CisgICAgICAgICAgICB6aXBmLndyaXRlc3RyKCJmb28udHh0IiwgIk8sIGZvciBhIE11c2Ugb2YgRmlyZSEiKQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4sICJhIiwgemlwZmlsZS5aSVBfU1RPUkVEKSBhcyB6aXBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHppcGYuZmlsZWxpc3QpCisgICAgICAgICAgICB6aXBmLmNvbW1lbnQgPSBiInRoaXMgaXMgYSBjb21tZW50IgorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4sICJyIikgYXMgemlwZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZi5jb21tZW50LCBiInRoaXMgaXMgYSBjb21tZW50IikKKwogICAgIGRlZiBjaGVja190ZXN0emlwX3dpdGhfYmFkX2NyYyhzZWxmLCBjb21wcmVzc2lvbik6CiAgICAgICAgICIiIlRlc3RzIHRoYXQgZmlsZXMgd2l0aCBiYWQgQ1JDcyByZXR1cm4gdGhlaXIgbmFtZSBmcm9tIHRlc3R6aXAuIiIiCiAgICAgICAgIHppcGRhdGEgPSBzZWxmLnppcHNfd2l0aF9iYWRfY3JjW2NvbXByZXNzaW9uXQpAQCAtOTc4LDYgKzExMzMsNyBAQAogICAgICAgICAgICAgcGFzcwogICAgICAgICB0cnk6CiAgICAgICAgICAgICB6aXBmID0gemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgbW9kZT0iciIpCisgICAgICAgICAgICB6aXBmLmNsb3NlKCkKICAgICAgICAgZXhjZXB0IHppcGZpbGUuQmFkWmlwZmlsZToKICAgICAgICAgICAgIHNlbGYuZmFpbCgiVW5hYmxlIHRvIGNyZWF0ZSBlbXB0eSBaSVAgZmlsZSBpbiAndycgbW9kZSIpCiAKQEAgLTk4NSw2ICsxMTQxLDcgQEAKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgemlwZiA9IHppcGZpbGUuWmlwRmlsZShURVNURk4sIG1vZGU9InIiKQorICAgICAgICAgICAgemlwZi5jbG9zZSgpCiAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgIHNlbGYuZmFpbCgiVW5hYmxlIHRvIGNyZWF0ZSBlbXB0eSBaSVAgZmlsZSBpbiAnYScgbW9kZSIpCiAKQEAgLTEwMDAsNiArMTE1NywyMSBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLlppcEluZm8sICdzZXZlbnRpZXMnLCAoMTk3OSwgMSwgMSwgMCwgMCwgMCkpCiAKKyAgICBkZWYgdGVzdF96aXBmaWxlX3dpdGhfc2hvcnRfZXh0cmFfZmllbGQoc2VsZik6CisgICAgICAgICIiIklmIGFuIGV4dHJhIGZpZWxkIGluIHRoZSBoZWFkZXIgaXMgbGVzcyB0aGFuIDQgYnl0ZXMsIHNraXAgaXQuIiIiCisgICAgICAgIHppcGRhdGEgPSAoCisgICAgICAgICAgICBiJ1BLXHgwM1x4MDRceDE0XHgwMFx4MDBceDAwXHgwMFx4MDBceDkzXHg5Ylx4YWRAXHg4Ylx4OWUnCisgICAgICAgICAgICBiJ1x4ZDlceGQzXHgwMVx4MDBceDAwXHgwMFx4MDFceDAwXHgwMFx4MDBceDAzXHgwMFx4MDNceDAwYWInCisgICAgICAgICAgICBiJ2NceDAwXHgwMFx4MDBBUEtceDAxXHgwMlx4MTRceDAzXHgxNFx4MDBceDAwXHgwMFx4MDAnCisgICAgICAgICAgICBiJ1x4MDBceDkzXHg5Ylx4YWRAXHg4Ylx4OWVceGQ5XHhkM1x4MDFceDAwXHgwMFx4MDBceDAxXHgwMFx4MDAnCisgICAgICAgICAgICBiJ1x4MDBceDAzXHgwMFx4MDJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceGE0XHg4MVx4MDAnCisgICAgICAgICAgICBiJ1x4MDBceDAwXHgwMGFiY1x4MDBceDAwUEtceDA1XHgwNlx4MDBceDAwXHgwMFx4MDAnCisgICAgICAgICAgICBiJ1x4MDFceDAwXHgwMVx4MDAzXHgwMFx4MDBceDAwJVx4MDBceDAwXHgwMFx4MDBceDAwJworICAgICAgICApCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGlvLkJ5dGVzSU8oemlwZGF0YSksICdyJykgYXMgemlwZjoKKyAgICAgICAgICAgICMgdGVzdHppcCByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmaXJzdCBjb3JydXB0IGZpbGUsIG9yIE5vbmUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHppcGYudGVzdHppcCgpKQorCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICB1bmxpbmsoVEVTVEZOKQogICAgICAgICB1bmxpbmsoVEVTVEZOMikKQEAgLTExODEsMTIgKzEzNTMsMTEgQEAKICAgICAgICAgIyBWZXJpZnkgdGhhdCAod2hlbiB0aGUgWmlwRmlsZSBpcyBpbiBjb250cm9sIG9mIGNyZWF0aW5nIGZpbGUgb2JqZWN0cykKICAgICAgICAgIyBtdWx0aXBsZSBvcGVuKCkgY2FsbHMgY2FuIGJlIG1hZGUgd2l0aG91dCBpbnRlcmZlcmluZyB3aXRoIGVhY2ggb3RoZXIuCiAgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsIG1vZGU9InIiKSBhcyB6aXBmOgotICAgICAgICAgICAgem9wZW4xID0gemlwZi5vcGVuKCdvbmVzJykKLSAgICAgICAgICAgIHpvcGVuMiA9IHppcGYub3Blbignb25lcycpCi0gICAgICAgICAgICBkYXRhMSA9IHpvcGVuMS5yZWFkKDUwMCkKLSAgICAgICAgICAgIGRhdGEyID0gem9wZW4yLnJlYWQoNTAwKQotICAgICAgICAgICAgZGF0YTEgKz0gem9wZW4xLnJlYWQoNTAwKQotICAgICAgICAgICAgZGF0YTIgKz0gem9wZW4yLnJlYWQoNTAwKQorICAgICAgICAgICAgd2l0aCB6aXBmLm9wZW4oJ29uZXMnKSBhcyB6b3BlbjEsIHppcGYub3Blbignb25lcycpIGFzIHpvcGVuMjoKKyAgICAgICAgICAgICAgICBkYXRhMSA9IHpvcGVuMS5yZWFkKDUwMCkKKyAgICAgICAgICAgICAgICBkYXRhMiA9IHpvcGVuMi5yZWFkKDUwMCkKKyAgICAgICAgICAgICAgICBkYXRhMSArPSB6b3BlbjEucmVhZCg1MDApCisgICAgICAgICAgICAgICAgZGF0YTIgKz0gem9wZW4yLnJlYWQoNTAwKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhMSwgZGF0YTIpCiAKICAgICBkZWYgdGVzdF9kaWZmZXJlbnRfZmlsZShzZWxmKToKQEAgLTEyMTMsNiArMTM4NCwxNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhMSwgJzEnKkZJWEVEVEVTVF9TSVpFKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhMiwgJzInKkZJWEVEVEVTVF9TSVpFKQogCisgICAgZGVmIHRlc3RfbWFueV9vcGVucyhzZWxmKToKKyAgICAgICAgIyBWZXJpZnkgdGhhdCByZWFkKCkgYW5kIG9wZW4oKSBwcm9tcHRseSBjbG9zZSB0aGUgZmlsZSBkZXNjcmlwdG9yLAorICAgICAgICAjIGFuZCBkb24ndCByZWx5IG9uIHRoZSBnYXJiYWdlIGNvbGxlY3RvciB0byBmcmVlIHJlc291cmNlcy4KKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgbW9kZT0iciIpIGFzIHppcGY6CisgICAgICAgICAgICBmb3IgeCBpbiByYW5nZSgxMDApOgorICAgICAgICAgICAgICAgIHppcGYucmVhZCgnb25lcycpCisgICAgICAgICAgICAgICAgd2l0aCB6aXBmLm9wZW4oJ29uZXMnKSBhcyB6b3BlbjE6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgd2l0aCBvcGVuKG9zLmRldm51bGwpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydExlc3MoZi5maWxlbm8oKSwgMTAwKQorCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICB1bmxpbmsoVEVTVEZOMikKIApAQCAtMTIzNSwxMiArMTQxNywxMiBAQAogCiAgICAgZGVmIHRlc3Rfc3RvcmVfZGlyKHNlbGYpOgogICAgICAgICBvcy5ta2Rpcihvcy5wYXRoLmpvaW4oVEVTVEZOMiwgIngiKSkKLSAgICAgICAgemlwZiA9IHppcGZpbGUuWmlwRmlsZShURVNURk4sICJ3IikKLSAgICAgICAgemlwZi53cml0ZShvcy5wYXRoLmpvaW4oVEVTVEZOMiwgIngiKSwgIngiKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoemlwZi5maWxlbGlzdFswXS5maWxlbmFtZS5lbmRzd2l0aCgieC8iKSkKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOLCAidyIpIGFzIHppcGY6CisgICAgICAgICAgICB6aXBmLndyaXRlKG9zLnBhdGguam9pbihURVNURk4yLCAieCIpLCAieCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoemlwZi5maWxlbGlzdFswXS5maWxlbmFtZS5lbmRzd2l0aCgieC8iKSkKIAogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAgICAgc2h1dGlsLnJtdHJlZShURVNURk4yKQorICAgICAgICBybXRyZWUoVEVTVEZOMikKICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoVEVTVEZOKToKICAgICAgICAgICAgIHVubGluayhURVNURk4pCiAKQEAgLTEyNTQsNyArMTQzNiw4IEBACiAgICAgICAgIGZvciBuLCBzIGluIGVudW1lcmF0ZShzZWxmLnNlcHMpOgogICAgICAgICAgICAgc2VsZi5hcmNkYXRhW3NdID0gcy5qb2luKHNlbGYubGluZV9nZW4pICsgcwogICAgICAgICAgICAgc2VsZi5hcmNmaWxlc1tzXSA9ICclcy0lZCcgJSAoVEVTVEZOLCBuKQotICAgICAgICAgICAgb3BlbihzZWxmLmFyY2ZpbGVzW3NdLCAid2IiKS53cml0ZShzZWxmLmFyY2RhdGFbc10pCisgICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5hcmNmaWxlc1tzXSwgIndiIikgYXMgZmlkOgorICAgICAgICAgICAgICAgIGZpZC53cml0ZShzZWxmLmFyY2RhdGFbc10pCiAKICAgICBkZWYgbWFrZV90ZXN0X2FyY2hpdmUoc2VsZiwgZiwgY29tcHJlc3Npb24pOgogICAgICAgICAjIENyZWF0ZSB0aGUgWklQIGFyY2hpdmUKQEAgLTEzMjMsOCArMTUwNiw5IEBACiAgICAgICAgICMgUmVhZCB0aGUgWklQIGFyY2hpdmUKICAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInIiKSBhcyB6aXBmcDoKICAgICAgICAgICAgIGZvciBzZXAsIGZuIGluIHNlbGYuYXJjZmlsZXMuaXRlbXMoKToKLSAgICAgICAgICAgICAgICBmb3IgbGluZSwgemlwbGluZSBpbiB6aXAoc2VsZi5saW5lX2dlbiwgemlwZnAub3BlbihmbiwgInJVIikpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGxpbmUsIGxpbmUgKyAnXG4nKQorICAgICAgICAgICAgICAgIHdpdGggemlwZnAub3BlbihmbiwgInJVIikgYXMgZmlkOgorICAgICAgICAgICAgICAgICAgICBmb3IgbGluZSwgemlwbGluZSBpbiB6aXAoc2VsZi5saW5lX2dlbiwgZmlkKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwbGluZSwgbGluZSArICdcbicpCiAKICAgICBkZWYgdGVzdF9yZWFkX3N0b3JlZChzZWxmKToKICAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgU3RyaW5nSU8oKSk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydF9zdXBwb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnRfc3VwcG9ydC5weQppbmRleCA0ZjQxNTE4Li4xYjYxN2FiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydF9zdXBwb3J0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfemlwaW1wb3J0X3N1cHBvcnQucHkKQEAgLTI5LDcgKzI5LDggQEAKICMgIHRlc3RfY21kX2xpbmVfc2NyaXB0IChjb3ZlcnMgdGhlIHppcGltcG9ydCBzdXBwb3J0IGluIHJ1bnB5KQogCiAjIFJldHJpZXZlIHNvbWUgaGVscGVycyBmcm9tIG90aGVyIHRlc3QgY2FzZXMKLWZyb20gdGVzdCBpbXBvcnQgdGVzdF9kb2N0ZXN0LCBzYW1wbGVfZG9jdGVzdAorZnJvbSB0ZXN0IGltcG9ydCAodGVzdF9kb2N0ZXN0LCBzYW1wbGVfZG9jdGVzdCwgc2FtcGxlX2RvY3Rlc3Rfbm9fZG9jdGVzdHMsCisgICAgICAgICAgICAgICAgICBzYW1wbGVfZG9jdGVzdF9ub19kb2NzdHJpbmdzKQogZnJvbSB0ZXN0LnRlc3RfaW1wb3J0aG9va3MgaW1wb3J0IEltcG9ydEhvb2tzQmFzZVRlc3RDYXNlCiAKIApAQCAtOTksMTYgKzEwMCwyNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3RfemlwcGVkX2RvY3Rlc3QiKQogICAgICAgICB0ZXN0X3NyYyA9IHRlc3Rfc3JjLnJlcGxhY2UoInRlc3Quc2FtcGxlX2RvY3Rlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhbXBsZV96aXBwZWRfZG9jdGVzdCIpCi0gICAgICAgIHNhbXBsZV9zcmMgPSBpbnNwZWN0LmdldHNvdXJjZShzYW1wbGVfZG9jdGVzdCkKLSAgICAgICAgc2FtcGxlX3NyYyA9IHNhbXBsZV9zcmMucmVwbGFjZSgidGVzdC50ZXN0X2RvY3Rlc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0X3ppcHBlZF9kb2N0ZXN0IikKKyAgICAgICAgIyBUaGUgc2FtcGxlIGRvY3Rlc3QgZmlsZXMgcmV3cml0dGVuIHRvIGluY2x1ZGUgaW4gdGhlIHppcHBlZCB2ZXJzaW9uLgorICAgICAgICBzYW1wbGVfc291cmNlcyA9IHt9CisgICAgICAgIGZvciBtb2QgaW4gW3NhbXBsZV9kb2N0ZXN0LCBzYW1wbGVfZG9jdGVzdF9ub19kb2N0ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlX2RvY3Rlc3Rfbm9fZG9jc3RyaW5nc106CisgICAgICAgICAgICBzcmMgPSBpbnNwZWN0LmdldHNvdXJjZShtb2QpCisgICAgICAgICAgICBzcmMgPSBzcmMucmVwbGFjZSgidGVzdC50ZXN0X2RvY3Rlc3QiLCAidGVzdF96aXBwZWRfZG9jdGVzdCIpCisgICAgICAgICAgICAjIFJld3JpdGUgdGhlIG1vZHVsZSBuYW1lIHNvIHRoYXQsIGZvciBleGFtcGxlLAorICAgICAgICAgICAgIyAidGVzdC5zYW1wbGVfZG9jdGVzdCIgYmVjb21lcyAic2FtcGxlX3ppcHBlZF9kb2N0ZXN0Ii4KKyAgICAgICAgICAgIG1vZF9uYW1lID0gbW9kLl9fbmFtZV9fLnNwbGl0KCIuIilbLTFdCisgICAgICAgICAgICBtb2RfbmFtZSA9IG1vZF9uYW1lLnJlcGxhY2UoInNhbXBsZV8iLCAic2FtcGxlX3ppcHBlZF8iKQorICAgICAgICAgICAgc2FtcGxlX3NvdXJjZXNbbW9kX25hbWVdID0gc3JjCisKICAgICAgICAgd2l0aCB0ZW1wX2RpcigpIGFzIGQ6CiAgICAgICAgICAgICBzY3JpcHRfbmFtZSA9IG1ha2Vfc2NyaXB0KGQsICd0ZXN0X3ppcHBlZF9kb2N0ZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9zcmMpCiAgICAgICAgICAgICB6aXBfbmFtZSwgcnVuX25hbWUgPSBtYWtlX3ppcF9zY3JpcHQoZCwgJ3Rlc3RfemlwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdF9uYW1lKQogICAgICAgICAgICAgeiA9IHppcGZpbGUuWmlwRmlsZSh6aXBfbmFtZSwgJ2EnKQotICAgICAgICAgICAgei53cml0ZXN0cigic2FtcGxlX3ppcHBlZF9kb2N0ZXN0LnB5Iiwgc2FtcGxlX3NyYykKKyAgICAgICAgICAgIGZvciBtb2RfbmFtZSwgc3JjIGluIHNhbXBsZV9zb3VyY2VzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgei53cml0ZXN0cihtb2RfbmFtZSArICIucHkiLCBzcmMpCiAgICAgICAgICAgICB6LmNsb3NlKCkKICAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICAgemlwX2ZpbGUgPSB6aXBmaWxlLlppcEZpbGUoemlwX25hbWUsICdyJykKQEAgLTE2OCw5ICsxNzksMTAgQEAKICAgICAgICAgICAgICAgICB0ZXN0X3ppcHBlZF9kb2N0ZXN0LnRlc3RfdW5pdHRlc3RfcmVwb3J0ZmxhZ3MsCiAgICAgICAgICAgICBdCiAgICAgICAgICAgICAjIE5lZWRlZCBmb3IgdGVzdF9Eb2NUZXN0UGFyc2VyIGFuZCB0ZXN0X2RlYnVnCi0gICAgICAgICAgICBkZXByZWNhdGlvbnMgPSBbCisgICAgICAgICAgICBkZXByZWNhdGlvbnMgPSBbXQorICAgICAgICAgICAgaWYgX19kZWJ1Z19fOgogICAgICAgICAgICAgICAgICMgSWdub3JlIGFsbCB3YXJuaW5ncyBhYm91dCB0aGUgdXNlIG9mIGNsYXNzIFRlc3RlciBpbiB0aGlzIG1vZHVsZS4KLSAgICAgICAgICAgICAgICAoImNsYXNzIFRlc3RlciBpcyBkZXByZWNhdGVkIiwgRGVwcmVjYXRpb25XYXJuaW5nKV0KKyAgICAgICAgICAgICAgICBkZXByZWNhdGlvbnMuYXBwZW5kKCgiY2xhc3MgVGVzdGVyIGlzIGRlcHJlY2F0ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpKQogICAgICAgICAgICAgaWYgc3lzLnB5M2t3YXJuaW5nOgogICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9ucyArPSBbCiAgICAgICAgICAgICAgICAgICAgICgiYmFja3F1b3RlIG5vdCBzdXBwb3J0ZWQiLCBTeW50YXhXYXJuaW5nKSwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfemxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfemxpYi5weQppbmRleCA3ZjYzMTQzLi5mYjYyMDgxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3psaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF96bGliLnB5CkBAIC0xMiw2ICsxMiwxMyBAQAogCiB6bGliID0gaW1wb3J0X21vZHVsZSgnemxpYicpCiAKK3JlcXVpcmVzX0NvbXByZXNzX2NvcHkgPSB1bml0dGVzdC5za2lwVW5sZXNzKAorICAgICAgICBoYXNhdHRyKHpsaWIuY29tcHJlc3NvYmooKSwgImNvcHkiKSwKKyAgICAgICAgJ3JlcXVpcmVzIENvbXByZXNzLmNvcHkoKScpCityZXF1aXJlc19EZWNvbXByZXNzX2NvcHkgPSB1bml0dGVzdC5za2lwVW5sZXNzKAorICAgICAgICBoYXNhdHRyKHpsaWIuZGVjb21wcmVzc29iaigpLCAiY29weSIpLAorICAgICAgICAncmVxdWlyZXMgRGVjb21wcmVzcy5jb3B5KCknKQorCiAKIGNsYXNzIENoZWNrc3VtVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgICMgY2hlY2tzdW0gdGVzdCBjYXNlcwpAQCAtMzM5LDM5ICszNDYsMzkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9kZT0laSwgbGV2ZWw9JWkiKSAlIChzeW5jLCBsZXZlbCkpCiAgICAgICAgICAgICAgICAgZGVsIG9iagogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cih6bGliLCAnWl9TWU5DX0ZMVVNIJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcXVpcmVzIHpsaWIuWl9TWU5DX0ZMVVNIJykKICAgICBkZWYgdGVzdF9vZGRfZmx1c2goc2VsZik6CiAgICAgICAgICMgVGVzdCBmb3Igb2RkIGZsdXNoaW5nIGJ1Z3Mgbm90ZWQgaW4gMi4wLCBhbmQgaG9wZWZ1bGx5IGZpeGVkIGluIDIuMQogICAgICAgICBpbXBvcnQgcmFuZG9tCisgICAgICAgICMgVGVzdGluZyBvbiAxN0sgb2YgInJhbmRvbSIgZGF0YQogCi0gICAgICAgIGlmIGhhc2F0dHIoemxpYiwgJ1pfU1lOQ19GTFVTSCcpOgotICAgICAgICAgICAgIyBUZXN0aW5nIG9uIDE3SyBvZiAicmFuZG9tIiBkYXRhCisgICAgICAgICMgQ3JlYXRlIGNvbXByZXNzb3IgYW5kIGRlY29tcHJlc3NvciBvYmplY3RzCisgICAgICAgIGNvID0gemxpYi5jb21wcmVzc29iaih6bGliLlpfQkVTVF9DT01QUkVTU0lPTikKKyAgICAgICAgZGNvID0gemxpYi5kZWNvbXByZXNzb2JqKCkKIAotICAgICAgICAgICAgIyBDcmVhdGUgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIG9iamVjdHMKLSAgICAgICAgICAgIGNvID0gemxpYi5jb21wcmVzc29iaih6bGliLlpfQkVTVF9DT01QUkVTU0lPTikKLSAgICAgICAgICAgIGRjbyA9IHpsaWIuZGVjb21wcmVzc29iaigpCi0KLSAgICAgICAgICAgICMgVHJ5IDE3SyBvZiBkYXRhCi0gICAgICAgICAgICAjIGdlbmVyYXRlIHJhbmRvbSBkYXRhIHN0cmVhbQorICAgICAgICAjIFRyeSAxN0sgb2YgZGF0YQorICAgICAgICAjIGdlbmVyYXRlIHJhbmRvbSBkYXRhIHN0cmVhbQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIEluIDIuMyBhbmQgbGF0ZXIsIFdpY2htYW5uSGlsbCBpcyB0aGUgUk5HIG9mIHRoZSBidWcgcmVwb3J0CisgICAgICAgICAgICBnZW4gPSByYW5kb20uV2ljaG1hbm5IaWxsKCkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICMgSW4gMi4zIGFuZCBsYXRlciwgV2ljaG1hbm5IaWxsIGlzIHRoZSBSTkcgb2YgdGhlIGJ1ZyByZXBvcnQKLSAgICAgICAgICAgICAgICBnZW4gPSByYW5kb20uV2ljaG1hbm5IaWxsKCkKKyAgICAgICAgICAgICAgICAjIDIuMiBjYWxsZWQgaXQgUmFuZG9tCisgICAgICAgICAgICAgICAgZ2VuID0gcmFuZG9tLlJhbmRvbSgpCiAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAjIDIuMiBjYWxsZWQgaXQgUmFuZG9tCi0gICAgICAgICAgICAgICAgICAgIGdlbiA9IHJhbmRvbS5SYW5kb20oKQotICAgICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgIyBvdGhlcnMgbWlnaHQgc2ltcGx5IGhhdmUgYSBzaW5nbGUgUk5HCi0gICAgICAgICAgICAgICAgICAgIGdlbiA9IHJhbmRvbQotICAgICAgICAgICAgZ2VuLnNlZWQoMSkKLSAgICAgICAgICAgIGRhdGEgPSBnZW5ibG9jaygxLCAxNyAqIDEwMjQsIGdlbmVyYXRvcj1nZW4pCisgICAgICAgICAgICAgICAgIyBvdGhlcnMgbWlnaHQgc2ltcGx5IGhhdmUgYSBzaW5nbGUgUk5HCisgICAgICAgICAgICAgICAgZ2VuID0gcmFuZG9tCisgICAgICAgIGdlbi5zZWVkKDEpCisgICAgICAgIGRhdGEgPSBnZW5ibG9jaygxLCAxNyAqIDEwMjQsIGdlbmVyYXRvcj1nZW4pCiAKLSAgICAgICAgICAgICMgY29tcHJlc3MsIHN5bmMtZmx1c2gsIGFuZCBkZWNvbXByZXNzCi0gICAgICAgICAgICBmaXJzdCA9IGNvLmNvbXByZXNzKGRhdGEpCi0gICAgICAgICAgICBzZWNvbmQgPSBjby5mbHVzaCh6bGliLlpfU1lOQ19GTFVTSCkKLSAgICAgICAgICAgIGV4cGFuZGVkID0gZGNvLmRlY29tcHJlc3MoZmlyc3QgKyBzZWNvbmQpCisgICAgICAgICMgY29tcHJlc3MsIHN5bmMtZmx1c2gsIGFuZCBkZWNvbXByZXNzCisgICAgICAgIGZpcnN0ID0gY28uY29tcHJlc3MoZGF0YSkKKyAgICAgICAgc2Vjb25kID0gY28uZmx1c2goemxpYi5aX1NZTkNfRkxVU0gpCisgICAgICAgIGV4cGFuZGVkID0gZGNvLmRlY29tcHJlc3MoZmlyc3QgKyBzZWNvbmQpCiAKLSAgICAgICAgICAgICMgaWYgZGVjb21wcmVzc2VkIGRhdGEgaXMgZGlmZmVyZW50IGZyb20gdGhlIGlucHV0IGRhdGEsIGNob2tlLgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBhbmRlZCwgZGF0YSwgIjE3SyByYW5kb20gc291cmNlIGRvZXNuJ3QgbWF0Y2giKQorICAgICAgICAjIGlmIGRlY29tcHJlc3NlZCBkYXRhIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBpbnB1dCBkYXRhLCBjaG9rZS4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBhbmRlZCwgZGF0YSwgIjE3SyByYW5kb20gc291cmNlIGRvZXNuJ3QgbWF0Y2giKQogCiAgICAgZGVmIHRlc3RfZW1wdHlfZmx1c2goc2VsZik6CiAgICAgICAgICMgVGVzdCB0aGF0IGNhbGxpbmcgLmZsdXNoKCkgb24gdW51c2VkIG9iamVjdHMgd29ya3MuCkBAIC0zOTYsNjUgKzQwMywxMDQgQEAKICAgICAgICAgeSArPSBkY28uZmx1c2goKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksICdmb28nKQogCi0gICAgaWYgaGFzYXR0cih6bGliLmNvbXByZXNzb2JqKCksICJjb3B5Iik6Ci0gICAgICAgIGRlZiB0ZXN0X2NvbXByZXNzY29weShzZWxmKToKLSAgICAgICAgICAgICMgVGVzdCBjb3B5aW5nIGEgY29tcHJlc3Npb24gb2JqZWN0Ci0gICAgICAgICAgICBkYXRhMCA9IEhBTUxFVF9TQ0VORQotICAgICAgICAgICAgZGF0YTEgPSBIQU1MRVRfU0NFTkUuc3dhcGNhc2UoKQotICAgICAgICAgICAgYzAgPSB6bGliLmNvbXByZXNzb2JqKHpsaWIuWl9CRVNUX0NPTVBSRVNTSU9OKQotICAgICAgICAgICAgYnVmczAgPSBbXQotICAgICAgICAgICAgYnVmczAuYXBwZW5kKGMwLmNvbXByZXNzKGRhdGEwKSkKKyAgICBkZWYgdGVzdF9mbHVzaF93aXRoX2ZyZWVkX2lucHV0KHNlbGYpOgorICAgICAgICAjIElzc3VlICMxNjQxMTogZGVjb21wcmVzc29yIGFjY2Vzc2VzIGlucHV0IHRvIGxhc3QgZGVjb21wcmVzcygpIGNhbGwKKyAgICAgICAgIyBpbiBmbHVzaCgpLCBldmVuIGlmIHRoaXMgb2JqZWN0IGhhcyBiZWVuIGZyZWVkIGluIHRoZSBtZWFud2hpbGUuCisgICAgICAgIGlucHV0MSA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKKyAgICAgICAgaW5wdXQyID0gJ1FXRVJUWVVJT1BBU0RGR0hKS0xaWENWQk5NJworICAgICAgICBkYXRhID0gemxpYi5jb21wcmVzcyhpbnB1dDEpCisgICAgICAgIGRjbyA9IHpsaWIuZGVjb21wcmVzc29iaigpCisgICAgICAgIGRjby5kZWNvbXByZXNzKGRhdGEsIDEpCisgICAgICAgIGRlbCBkYXRhCisgICAgICAgIGRhdGEgPSB6bGliLmNvbXByZXNzKGlucHV0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkY28uZmx1c2goKSwgaW5wdXQxWzE6XSkKIAotICAgICAgICAgICAgYzEgPSBjMC5jb3B5KCkKLSAgICAgICAgICAgIGJ1ZnMxID0gYnVmczBbOl0KKyAgICBAcmVxdWlyZXNfQ29tcHJlc3NfY29weQorICAgIGRlZiB0ZXN0X2NvbXByZXNzY29weShzZWxmKToKKyAgICAgICAgIyBUZXN0IGNvcHlpbmcgYSBjb21wcmVzc2lvbiBvYmplY3QKKyAgICAgICAgZGF0YTAgPSBIQU1MRVRfU0NFTkUKKyAgICAgICAgZGF0YTEgPSBIQU1MRVRfU0NFTkUuc3dhcGNhc2UoKQorICAgICAgICBjMCA9IHpsaWIuY29tcHJlc3NvYmooemxpYi5aX0JFU1RfQ09NUFJFU1NJT04pCisgICAgICAgIGJ1ZnMwID0gW10KKyAgICAgICAgYnVmczAuYXBwZW5kKGMwLmNvbXByZXNzKGRhdGEwKSkKIAotICAgICAgICAgICAgYnVmczAuYXBwZW5kKGMwLmNvbXByZXNzKGRhdGEwKSkKLSAgICAgICAgICAgIGJ1ZnMwLmFwcGVuZChjMC5mbHVzaCgpKQotICAgICAgICAgICAgczAgPSAnJy5qb2luKGJ1ZnMwKQorICAgICAgICBjMSA9IGMwLmNvcHkoKQorICAgICAgICBidWZzMSA9IGJ1ZnMwWzpdCiAKLSAgICAgICAgICAgIGJ1ZnMxLmFwcGVuZChjMS5jb21wcmVzcyhkYXRhMSkpCi0gICAgICAgICAgICBidWZzMS5hcHBlbmQoYzEuZmx1c2goKSkKLSAgICAgICAgICAgIHMxID0gJycuam9pbihidWZzMSkKKyAgICAgICAgYnVmczAuYXBwZW5kKGMwLmNvbXByZXNzKGRhdGEwKSkKKyAgICAgICAgYnVmczAuYXBwZW5kKGMwLmZsdXNoKCkpCisgICAgICAgIHMwID0gJycuam9pbihidWZzMCkKIAotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmRlY29tcHJlc3MoczApLGRhdGEwK2RhdGEwKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmRlY29tcHJlc3MoczEpLGRhdGEwK2RhdGExKQorICAgICAgICBidWZzMS5hcHBlbmQoYzEuY29tcHJlc3MoZGF0YTEpKQorICAgICAgICBidWZzMS5hcHBlbmQoYzEuZmx1c2goKSkKKyAgICAgICAgczEgPSAnJy5qb2luKGJ1ZnMxKQogCi0gICAgICAgIGRlZiB0ZXN0X2JhZGNvbXByZXNzY29weShzZWxmKToKLSAgICAgICAgICAgICMgVGVzdCBjb3B5aW5nIGEgY29tcHJlc3Npb24gb2JqZWN0IGluIGFuIGluY29uc2lzdGVudCBzdGF0ZQotICAgICAgICAgICAgYyA9IHpsaWIuY29tcHJlc3NvYmooKQotICAgICAgICAgICAgYy5jb21wcmVzcyhIQU1MRVRfU0NFTkUpCi0gICAgICAgICAgICBjLmZsdXNoKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGMuY29weSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmRlY29tcHJlc3MoczApLGRhdGEwK2RhdGEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpsaWIuZGVjb21wcmVzcyhzMSksZGF0YTArZGF0YTEpCiAKLSAgICBpZiBoYXNhdHRyKHpsaWIuZGVjb21wcmVzc29iaigpLCAiY29weSIpOgotICAgICAgICBkZWYgdGVzdF9kZWNvbXByZXNzY29weShzZWxmKToKLSAgICAgICAgICAgICMgVGVzdCBjb3B5aW5nIGEgZGVjb21wcmVzc2lvbiBvYmplY3QKLSAgICAgICAgICAgIGRhdGEgPSBIQU1MRVRfU0NFTkUKLSAgICAgICAgICAgIGNvbXAgPSB6bGliLmNvbXByZXNzKGRhdGEpCisgICAgQHJlcXVpcmVzX0NvbXByZXNzX2NvcHkKKyAgICBkZWYgdGVzdF9iYWRjb21wcmVzc2NvcHkoc2VsZik6CisgICAgICAgICMgVGVzdCBjb3B5aW5nIGEgY29tcHJlc3Npb24gb2JqZWN0IGluIGFuIGluY29uc2lzdGVudCBzdGF0ZQorICAgICAgICBjID0gemxpYi5jb21wcmVzc29iaigpCisgICAgICAgIGMuY29tcHJlc3MoSEFNTEVUX1NDRU5FKQorICAgICAgICBjLmZsdXNoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYy5jb3B5KQogCi0gICAgICAgICAgICBkMCA9IHpsaWIuZGVjb21wcmVzc29iaigpCi0gICAgICAgICAgICBidWZzMCA9IFtdCi0gICAgICAgICAgICBidWZzMC5hcHBlbmQoZDAuZGVjb21wcmVzcyhjb21wWzozMl0pKQorICAgIGRlZiB0ZXN0X2RlY29tcHJlc3NfdW51c2VkX2RhdGEoc2VsZik6CisgICAgICAgICMgUmVwZWF0ZWQgY2FsbHMgdG8gZGVjb21wcmVzcygpIGFmdGVyIEVPRiBzaG91bGQgYWNjdW11bGF0ZSBkYXRhIGluCisgICAgICAgICMgZGNvLnVudXNlZF9kYXRhLCBpbnN0ZWFkIG9mIGp1c3Qgc3RvcmluZyB0aGUgYXJnIHRvIHRoZSBsYXN0IGNhbGwuCisgICAgICAgIHNvdXJjZSA9IGInYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCisgICAgICAgIHJlbWFpbmRlciA9IGInMDEyMzQ1Njc4OScKKyAgICAgICAgeSA9IHpsaWIuY29tcHJlc3Moc291cmNlKQorICAgICAgICB4ID0geSArIHJlbWFpbmRlcgorICAgICAgICBmb3IgbWF4bGVuIGluIDAsIDEwMDA6CisgICAgICAgICAgICBmb3Igc3RlcCBpbiAxLCAyLCBsZW4oeSksIGxlbih4KToKKyAgICAgICAgICAgICAgICBkY28gPSB6bGliLmRlY29tcHJlc3NvYmooKQorICAgICAgICAgICAgICAgIGRhdGEgPSBiJycKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4oeCksIHN0ZXApOgorICAgICAgICAgICAgICAgICAgICBpZiBpIDwgbGVuKHkpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkY28udW51c2VkX2RhdGEsIGInJykKKyAgICAgICAgICAgICAgICAgICAgaWYgbWF4bGVuID09IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICs9IGRjby5kZWNvbXByZXNzKHhbaSA6IGkgKyBzdGVwXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGNvLnVuY29uc3VtZWRfdGFpbCwgYicnKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSArPSBkY28uZGVjb21wcmVzcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNvLnVuY29uc3VtZWRfdGFpbCArIHhbaSA6IGkgKyBzdGVwXSwgbWF4bGVuKQorICAgICAgICAgICAgICAgIGRhdGEgKz0gZGNvLmZsdXNoKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIHNvdXJjZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRjby51bmNvbnN1bWVkX3RhaWwsIGInJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRjby51bnVzZWRfZGF0YSwgcmVtYWluZGVyKQogCi0gICAgICAgICAgICBkMSA9IGQwLmNvcHkoKQotICAgICAgICAgICAgYnVmczEgPSBidWZzMFs6XQorICAgIEByZXF1aXJlc19EZWNvbXByZXNzX2NvcHkKKyAgICBkZWYgdGVzdF9kZWNvbXByZXNzY29weShzZWxmKToKKyAgICAgICAgIyBUZXN0IGNvcHlpbmcgYSBkZWNvbXByZXNzaW9uIG9iamVjdAorICAgICAgICBkYXRhID0gSEFNTEVUX1NDRU5FCisgICAgICAgIGNvbXAgPSB6bGliLmNvbXByZXNzKGRhdGEpCiAKLSAgICAgICAgICAgIGJ1ZnMwLmFwcGVuZChkMC5kZWNvbXByZXNzKGNvbXBbMzI6XSkpCi0gICAgICAgICAgICBzMCA9ICcnLmpvaW4oYnVmczApCisgICAgICAgIGQwID0gemxpYi5kZWNvbXByZXNzb2JqKCkKKyAgICAgICAgYnVmczAgPSBbXQorICAgICAgICBidWZzMC5hcHBlbmQoZDAuZGVjb21wcmVzcyhjb21wWzozMl0pKQogCi0gICAgICAgICAgICBidWZzMS5hcHBlbmQoZDEuZGVjb21wcmVzcyhjb21wWzMyOl0pKQotICAgICAgICAgICAgczEgPSAnJy5qb2luKGJ1ZnMxKQorICAgICAgICBkMSA9IGQwLmNvcHkoKQorICAgICAgICBidWZzMSA9IGJ1ZnMwWzpdCiAKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoczAsczEpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMwLGRhdGEpCisgICAgICAgIGJ1ZnMwLmFwcGVuZChkMC5kZWNvbXByZXNzKGNvbXBbMzI6XSkpCisgICAgICAgIHMwID0gJycuam9pbihidWZzMCkKIAotICAgICAgICBkZWYgdGVzdF9iYWRkZWNvbXByZXNzY29weShzZWxmKToKLSAgICAgICAgICAgICMgVGVzdCBjb3B5aW5nIGEgY29tcHJlc3Npb24gb2JqZWN0IGluIGFuIGluY29uc2lzdGVudCBzdGF0ZQotICAgICAgICAgICAgZGF0YSA9IHpsaWIuY29tcHJlc3MoSEFNTEVUX1NDRU5FKQotICAgICAgICAgICAgZCA9IHpsaWIuZGVjb21wcmVzc29iaigpCi0gICAgICAgICAgICBkLmRlY29tcHJlc3MoZGF0YSkKLSAgICAgICAgICAgIGQuZmx1c2goKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZC5jb3B5KQorICAgICAgICBidWZzMS5hcHBlbmQoZDEuZGVjb21wcmVzcyhjb21wWzMyOl0pKQorICAgICAgICBzMSA9ICcnLmpvaW4oYnVmczEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzMCxzMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzMCxkYXRhKQorCisgICAgQHJlcXVpcmVzX0RlY29tcHJlc3NfY29weQorICAgIGRlZiB0ZXN0X2JhZGRlY29tcHJlc3Njb3B5KHNlbGYpOgorICAgICAgICAjIFRlc3QgY29weWluZyBhIGNvbXByZXNzaW9uIG9iamVjdCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUKKyAgICAgICAgZGF0YSA9IHpsaWIuY29tcHJlc3MoSEFNTEVUX1NDRU5FKQorICAgICAgICBkID0gemxpYi5kZWNvbXByZXNzb2JqKCkKKyAgICAgICAgZC5kZWNvbXByZXNzKGRhdGEpCisgICAgICAgIGQuZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBkLmNvcHkpCiAKICAgICAjIE1lbW9yeSB1c2Ugb2YgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgdGFrZXMgaW50byBhY2NvdW50IG92ZXJhbGxvY2F0aW9uCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3R0YXIudGFyIGIvTGliL3Rlc3QvdGVzdHRhci50YXIKaW5kZXggYmFjMGUyNi4uNDQwMTgyYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdHRhci50YXIKKysrIGIvTGliL3Rlc3QvdGVzdHRhci50YXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTGliL3RleHR3cmFwLnB5IGIvTGliL3RleHR3cmFwLnB5CmluZGV4IDk1ODJhMWMuLjYyZWEwYjQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXh0d3JhcC5weQorKysgYi9MaWIvdGV4dHdyYXAucHkKQEAgLTksNiArOSwxNCBAQAogCiBpbXBvcnQgc3RyaW5nLCByZQogCit0cnk6CisgICAgX3VuaWNvZGUgPSB1bmljb2RlCitleGNlcHQgTmFtZUVycm9yOgorICAgICMgSWYgUHl0aG9uIGlzIGJ1aWx0IHdpdGhvdXQgVW5pY29kZSBzdXBwb3J0LCB0aGUgdW5pY29kZSB0eXBlCisgICAgIyB3aWxsIG5vdCBleGlzdC4gRmFrZSBvbmUuCisgICAgY2xhc3MgX3VuaWNvZGUob2JqZWN0KToKKyAgICAgICAgcGFzcworCiAjIERvIHRoZSByaWdodCB0aGluZyB3aXRoIGJvb2xlYW4gdmFsdWVzIGZvciBhbGwga25vd24gUHl0aG9uIHZlcnNpb25zCiAjIChzbyB0aGlzIG1vZHVsZSBjYW4gYmUgY29waWVkIHRvIHByb2plY3RzIHRoYXQgZG9uJ3QgZGVwZW5kIG9uIFB5dGhvbgogIyAyLjMsIGUuZy4gT3B0aWsgYW5kIERvY3V0aWxzKSBieSB1bmNvbW1lbnRpbmcgdGhlIGJsb2NrIG9mIGNvZGUgYmVsb3cuCkBAIC0xNDcsNyArMTU1LDcgQEAKICAgICAgICAgaWYgc2VsZi5yZXBsYWNlX3doaXRlc3BhY2U6CiAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRleHQsIHN0cik6CiAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQudHJhbnNsYXRlKHNlbGYud2hpdGVzcGFjZV90cmFucykKLSAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh0ZXh0LCB1bmljb2RlKToKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh0ZXh0LCBfdW5pY29kZSk6CiAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQudHJhbnNsYXRlKHNlbGYudW5pY29kZV93aGl0ZXNwYWNlX3RyYW5zKQogICAgICAgICByZXR1cm4gdGV4dAogCkBAIC0xNjcsNyArMTc1LDcgQEAKICAgICAgICAgICAndXNlJywgJyAnLCAndGhlJywgJyAnLCAnLWInLCAnICcsIG9wdGlvbiEnCiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgICAgIiIiCi0gICAgICAgIGlmIGlzaW5zdGFuY2UodGV4dCwgdW5pY29kZSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UodGV4dCwgX3VuaWNvZGUpOgogICAgICAgICAgICAgaWYgc2VsZi5icmVha19vbl9oeXBoZW5zOgogICAgICAgICAgICAgICAgIHBhdCA9IHNlbGYud29yZHNlcF9yZV91bmkKICAgICAgICAgICAgIGVsc2U6CmRpZmYgLS1naXQgYS9MaWIvdGhyZWFkaW5nLnB5IGIvTGliL3RocmVhZGluZy5weQppbmRleCA2YTA2ZmViLi5lODE0NzFiIDEwMDY0NAotLS0gYS9MaWIvdGhyZWFkaW5nLnB5CisrKyBiL0xpYi90aHJlYWRpbmcucHkKQEAgLTEwLDkgKzEwLDkgQEAKIAogaW1wb3J0IHdhcm5pbmdzCiAKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlIGFzIF9kZXF1ZQogZnJvbSB0aW1lIGltcG9ydCB0aW1lIGFzIF90aW1lLCBzbGVlcCBhcyBfc2xlZXAKIGZyb20gdHJhY2ViYWNrIGltcG9ydCBmb3JtYXRfZXhjIGFzIF9mb3JtYXRfZXhjCi1mcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQogCiAjIE5vdGUgcmVnYXJkaW5nIFBFUCA4IGNvbXBsaWFudCBhbGlhc2VzCiAjICBUaGlzIHRocmVhZGluZyBtb2RlbCB3YXMgb3JpZ2luYWxseSBpbnNwaXJlZCBieSBKYXZhLCBhbmQgaW5oZXJpdGVkCkBAIC04NywxMCArODcsMjIgQEAKIF90cmFjZV9ob29rID0gTm9uZQogCiBkZWYgc2V0cHJvZmlsZShmdW5jKToKKyAgICAiIiJTZXQgYSBwcm9maWxlIGZ1bmN0aW9uIGZvciBhbGwgdGhyZWFkcyBzdGFydGVkIGZyb20gdGhlIHRocmVhZGluZyBtb2R1bGUuCisKKyAgICBUaGUgZnVuYyB3aWxsIGJlIHBhc3NlZCB0byBzeXMuc2V0cHJvZmlsZSgpIGZvciBlYWNoIHRocmVhZCwgYmVmb3JlIGl0cworICAgIHJ1bigpIG1ldGhvZCBpcyBjYWxsZWQuCisKKyAgICAiIiIKICAgICBnbG9iYWwgX3Byb2ZpbGVfaG9vawogICAgIF9wcm9maWxlX2hvb2sgPSBmdW5jCiAKIGRlZiBzZXR0cmFjZShmdW5jKToKKyAgICAiIiJTZXQgYSB0cmFjZSBmdW5jdGlvbiBmb3IgYWxsIHRocmVhZHMgc3RhcnRlZCBmcm9tIHRoZSB0aHJlYWRpbmcgbW9kdWxlLgorCisgICAgVGhlIGZ1bmMgd2lsbCBiZSBwYXNzZWQgdG8gc3lzLnNldHRyYWNlKCkgZm9yIGVhY2ggdGhyZWFkLCBiZWZvcmUgaXRzIHJ1bigpCisgICAgbWV0aG9kIGlzIGNhbGxlZC4KKworICAgICIiIgogICAgIGdsb2JhbCBfdHJhY2VfaG9vawogICAgIF90cmFjZV9ob29rID0gZnVuYwogCkBAIC05OSw5ICsxMTEsMjIgQEAKIExvY2sgPSBfYWxsb2NhdGVfbG9jawogCiBkZWYgUkxvY2soKmFyZ3MsICoqa3dhcmdzKToKKyAgICAiIiJGYWN0b3J5IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIG5ldyByZWVudHJhbnQgbG9jay4KKworICAgIEEgcmVlbnRyYW50IGxvY2sgbXVzdCBiZSByZWxlYXNlZCBieSB0aGUgdGhyZWFkIHRoYXQgYWNxdWlyZWQgaXQuIE9uY2UgYQorICAgIHRocmVhZCBoYXMgYWNxdWlyZWQgYSByZWVudHJhbnQgbG9jaywgdGhlIHNhbWUgdGhyZWFkIG1heSBhY3F1aXJlIGl0IGFnYWluCisgICAgd2l0aG91dCBibG9ja2luZzsgdGhlIHRocmVhZCBtdXN0IHJlbGVhc2UgaXQgb25jZSBmb3IgZWFjaCB0aW1lIGl0IGhhcworICAgIGFjcXVpcmVkIGl0LgorCisgICAgIiIiCiAgICAgcmV0dXJuIF9STG9jaygqYXJncywgKiprd2FyZ3MpCiAKIGNsYXNzIF9STG9jayhfVmVyYm9zZSk6CisgICAgIiIiQSByZWVudHJhbnQgbG9jayBtdXN0IGJlIHJlbGVhc2VkIGJ5IHRoZSB0aHJlYWQgdGhhdCBhY3F1aXJlZCBpdC4gT25jZSBhCisgICAgICAgdGhyZWFkIGhhcyBhY3F1aXJlZCBhIHJlZW50cmFudCBsb2NrLCB0aGUgc2FtZSB0aHJlYWQgbWF5IGFjcXVpcmUgaXQKKyAgICAgICBhZ2FpbiB3aXRob3V0IGJsb2NraW5nOyB0aGUgdGhyZWFkIG11c3QgcmVsZWFzZSBpdCBvbmNlIGZvciBlYWNoIHRpbWUgaXQKKyAgICAgICBoYXMgYWNxdWlyZWQgaXQuCisgICAgIiIiCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgdmVyYm9zZT1Ob25lKToKICAgICAgICAgX1ZlcmJvc2UuX19pbml0X18oc2VsZiwgdmVyYm9zZSkKQEAgLTExOSw2ICsxNDQsMjYgQEAKICAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgb3duZXIsIHNlbGYuX19jb3VudCkKIAogICAgIGRlZiBhY3F1aXJlKHNlbGYsIGJsb2NraW5nPTEpOgorICAgICAgICAiIiJBY3F1aXJlIGEgbG9jaywgYmxvY2tpbmcgb3Igbm9uLWJsb2NraW5nLgorCisgICAgICAgIFdoZW4gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50czogaWYgdGhpcyB0aHJlYWQgYWxyZWFkeSBvd25zIHRoZSBsb2NrLAorICAgICAgICBpbmNyZW1lbnQgdGhlIHJlY3Vyc2lvbiBsZXZlbCBieSBvbmUsIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkuIE90aGVyd2lzZSwKKyAgICAgICAgaWYgYW5vdGhlciB0aHJlYWQgb3ducyB0aGUgbG9jaywgYmxvY2sgdW50aWwgdGhlIGxvY2sgaXMgdW5sb2NrZWQuIE9uY2UKKyAgICAgICAgdGhlIGxvY2sgaXMgdW5sb2NrZWQgKG5vdCBvd25lZCBieSBhbnkgdGhyZWFkKSwgdGhlbiBncmFiIG93bmVyc2hpcCwgc2V0CisgICAgICAgIHRoZSByZWN1cnNpb24gbGV2ZWwgdG8gb25lLCBhbmQgcmV0dXJuLiBJZiBtb3JlIHRoYW4gb25lIHRocmVhZCBpcworICAgICAgICBibG9ja2VkIHdhaXRpbmcgdW50aWwgdGhlIGxvY2sgaXMgdW5sb2NrZWQsIG9ubHkgb25lIGF0IGEgdGltZSB3aWxsIGJlCisgICAgICAgIGFibGUgdG8gZ3JhYiBvd25lcnNoaXAgb2YgdGhlIGxvY2suIFRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZSBpbiB0aGlzCisgICAgICAgIGNhc2UuCisKKyAgICAgICAgV2hlbiBpbnZva2VkIHdpdGggdGhlIGJsb2NraW5nIGFyZ3VtZW50IHNldCB0byB0cnVlLCBkbyB0aGUgc2FtZSB0aGluZworICAgICAgICBhcyB3aGVuIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50cywgYW5kIHJldHVybiB0cnVlLgorCisgICAgICAgIFdoZW4gaW52b2tlZCB3aXRoIHRoZSBibG9ja2luZyBhcmd1bWVudCBzZXQgdG8gZmFsc2UsIGRvIG5vdCBibG9jay4gSWYgYQorICAgICAgICBjYWxsIHdpdGhvdXQgYW4gYXJndW1lbnQgd291bGQgYmxvY2ssIHJldHVybiBmYWxzZSBpbW1lZGlhdGVseTsKKyAgICAgICAgb3RoZXJ3aXNlLCBkbyB0aGUgc2FtZSB0aGluZyBhcyB3aGVuIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50cywgYW5kCisgICAgICAgIHJldHVybiB0cnVlLgorCisgICAgICAgICIiIgogICAgICAgICBtZSA9IF9nZXRfaWRlbnQoKQogICAgICAgICBpZiBzZWxmLl9fb3duZXIgPT0gbWU6CiAgICAgICAgICAgICBzZWxmLl9fY291bnQgPSBzZWxmLl9fY291bnQgKyAxCkBAIC0xMzksNiArMTg0LDIxIEBACiAgICAgX19lbnRlcl9fID0gYWNxdWlyZQogCiAgICAgZGVmIHJlbGVhc2Uoc2VsZik6CisgICAgICAgICIiIlJlbGVhc2UgYSBsb2NrLCBkZWNyZW1lbnRpbmcgdGhlIHJlY3Vyc2lvbiBsZXZlbC4KKworICAgICAgICBJZiBhZnRlciB0aGUgZGVjcmVtZW50IGl0IGlzIHplcm8sIHJlc2V0IHRoZSBsb2NrIHRvIHVubG9ja2VkIChub3Qgb3duZWQKKyAgICAgICAgYnkgYW55IHRocmVhZCksIGFuZCBpZiBhbnkgb3RoZXIgdGhyZWFkcyBhcmUgYmxvY2tlZCB3YWl0aW5nIGZvciB0aGUKKyAgICAgICAgbG9jayB0byBiZWNvbWUgdW5sb2NrZWQsIGFsbG93IGV4YWN0bHkgb25lIG9mIHRoZW0gdG8gcHJvY2VlZC4gSWYgYWZ0ZXIKKyAgICAgICAgdGhlIGRlY3JlbWVudCB0aGUgcmVjdXJzaW9uIGxldmVsIGlzIHN0aWxsIG5vbnplcm8sIHRoZSBsb2NrIHJlbWFpbnMKKyAgICAgICAgbG9ja2VkIGFuZCBvd25lZCBieSB0aGUgY2FsbGluZyB0aHJlYWQuCisKKyAgICAgICAgT25seSBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gdGhlIGNhbGxpbmcgdGhyZWFkIG93bnMgdGhlIGxvY2suIEEKKyAgICAgICAgUnVudGltZUVycm9yIGlzIHJhaXNlZCBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgbG9jayBpcworICAgICAgICB1bmxvY2tlZC4KKworICAgICAgICBUaGVyZSBpcyBubyByZXR1cm4gdmFsdWUuCisKKyAgICAgICAgIiIiCiAgICAgICAgIGlmIHNlbGYuX19vd25lciAhPSBfZ2V0X2lkZW50KCk6CiAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoImNhbm5vdCByZWxlYXNlIHVuLWFjcXVpcmVkIGxvY2siKQogICAgICAgICBzZWxmLl9fY291bnQgPSBjb3VudCA9IHNlbGYuX19jb3VudCAtIDEKQEAgLTE3OSw5ICsyMzksMjIgQEAKIAogCiBkZWYgQ29uZGl0aW9uKCphcmdzLCAqKmt3YXJncyk6CisgICAgIiIiRmFjdG9yeSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBuZXcgY29uZGl0aW9uIHZhcmlhYmxlIG9iamVjdC4KKworICAgIEEgY29uZGl0aW9uIHZhcmlhYmxlIGFsbG93cyBvbmUgb3IgbW9yZSB0aHJlYWRzIHRvIHdhaXQgdW50aWwgdGhleSBhcmUKKyAgICBub3RpZmllZCBieSBhbm90aGVyIHRocmVhZC4KKworICAgIElmIHRoZSBsb2NrIGFyZ3VtZW50IGlzIGdpdmVuIGFuZCBub3QgTm9uZSwgaXQgbXVzdCBiZSBhIExvY2sgb3IgUkxvY2sKKyAgICBvYmplY3QsIGFuZCBpdCBpcyB1c2VkIGFzIHRoZSB1bmRlcmx5aW5nIGxvY2suIE90aGVyd2lzZSwgYSBuZXcgUkxvY2sgb2JqZWN0CisgICAgaXMgY3JlYXRlZCBhbmQgdXNlZCBhcyB0aGUgdW5kZXJseWluZyBsb2NrLgorCisgICAgIiIiCiAgICAgcmV0dXJuIF9Db25kaXRpb24oKmFyZ3MsICoqa3dhcmdzKQogCiBjbGFzcyBfQ29uZGl0aW9uKF9WZXJib3NlKToKKyAgICAiIiJDb25kaXRpb24gdmFyaWFibGVzIGFsbG93IG9uZSBvciBtb3JlIHRocmVhZHMgdG8gd2FpdCB1bnRpbCB0aGV5IGFyZQorICAgICAgIG5vdGlmaWVkIGJ5IGFub3RoZXIgdGhyZWFkLgorICAgICIiIgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxvY2s9Tm9uZSwgdmVyYm9zZT1Ob25lKToKICAgICAgICAgX1ZlcmJvc2UuX19pbml0X18oc2VsZiwgdmVyYm9zZSkKQEAgLTIzMyw2ICszMDYsMjggQEAKICAgICAgICAgICAgIHJldHVybiBUcnVlCiAKICAgICBkZWYgd2FpdChzZWxmLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICAiIiJXYWl0IHVudGlsIG5vdGlmaWVkIG9yIHVudGlsIGEgdGltZW91dCBvY2N1cnMuCisKKyAgICAgICAgSWYgdGhlIGNhbGxpbmcgdGhyZWFkIGhhcyBub3QgYWNxdWlyZWQgdGhlIGxvY2sgd2hlbiB0aGlzIG1ldGhvZCBpcworICAgICAgICBjYWxsZWQsIGEgUnVudGltZUVycm9yIGlzIHJhaXNlZC4KKworICAgICAgICBUaGlzIG1ldGhvZCByZWxlYXNlcyB0aGUgdW5kZXJseWluZyBsb2NrLCBhbmQgdGhlbiBibG9ja3MgdW50aWwgaXQgaXMKKyAgICAgICAgYXdha2VuZWQgYnkgYSBub3RpZnkoKSBvciBub3RpZnlBbGwoKSBjYWxsIGZvciB0aGUgc2FtZSBjb25kaXRpb24KKyAgICAgICAgdmFyaWFibGUgaW4gYW5vdGhlciB0aHJlYWQsIG9yIHVudGlsIHRoZSBvcHRpb25hbCB0aW1lb3V0IG9jY3Vycy4gT25jZQorICAgICAgICBhd2FrZW5lZCBvciB0aW1lZCBvdXQsIGl0IHJlLWFjcXVpcmVzIHRoZSBsb2NrIGFuZCByZXR1cm5zLgorCisgICAgICAgIFdoZW4gdGhlIHRpbWVvdXQgYXJndW1lbnQgaXMgcHJlc2VudCBhbmQgbm90IE5vbmUsIGl0IHNob3VsZCBiZSBhCisgICAgICAgIGZsb2F0aW5nIHBvaW50IG51bWJlciBzcGVjaWZ5aW5nIGEgdGltZW91dCBmb3IgdGhlIG9wZXJhdGlvbiBpbiBzZWNvbmRzCisgICAgICAgIChvciBmcmFjdGlvbnMgdGhlcmVvZikuCisKKyAgICAgICAgV2hlbiB0aGUgdW5kZXJseWluZyBsb2NrIGlzIGFuIFJMb2NrLCBpdCBpcyBub3QgcmVsZWFzZWQgdXNpbmcgaXRzCisgICAgICAgIHJlbGVhc2UoKSBtZXRob2QsIHNpbmNlIHRoaXMgbWF5IG5vdCBhY3R1YWxseSB1bmxvY2sgdGhlIGxvY2sgd2hlbiBpdAorICAgICAgICB3YXMgYWNxdWlyZWQgbXVsdGlwbGUgdGltZXMgcmVjdXJzaXZlbHkuIEluc3RlYWQsIGFuIGludGVybmFsIGludGVyZmFjZQorICAgICAgICBvZiB0aGUgUkxvY2sgY2xhc3MgaXMgdXNlZCwgd2hpY2ggcmVhbGx5IHVubG9ja3MgaXQgZXZlbiB3aGVuIGl0IGhhcworICAgICAgICBiZWVuIHJlY3Vyc2l2ZWx5IGFjcXVpcmVkIHNldmVyYWwgdGltZXMuIEFub3RoZXIgaW50ZXJuYWwgaW50ZXJmYWNlIGlzCisgICAgICAgIHRoZW4gdXNlZCB0byByZXN0b3JlIHRoZSByZWN1cnNpb24gbGV2ZWwgd2hlbiB0aGUgbG9jayBpcyByZWFjcXVpcmVkLgorCisgICAgICAgICIiIgogICAgICAgICBpZiBub3Qgc2VsZi5faXNfb3duZWQoKToKICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiY2Fubm90IHdhaXQgb24gdW4tYWNxdWlyZWQgbG9jayIpCiAgICAgICAgIHdhaXRlciA9IF9hbGxvY2F0ZV9sb2NrKCkKQEAgLTI3NSw2ICszNzAsMTUgQEAKICAgICAgICAgICAgIHNlbGYuX2FjcXVpcmVfcmVzdG9yZShzYXZlZF9zdGF0ZSkKIAogICAgIGRlZiBub3RpZnkoc2VsZiwgbj0xKToKKyAgICAgICAgIiIiV2FrZSB1cCBvbmUgb3IgbW9yZSB0aHJlYWRzIHdhaXRpbmcgb24gdGhpcyBjb25kaXRpb24sIGlmIGFueS4KKworICAgICAgICBJZiB0aGUgY2FsbGluZyB0aHJlYWQgaGFzIG5vdCBhY3F1aXJlZCB0aGUgbG9jayB3aGVuIHRoaXMgbWV0aG9kIGlzCisgICAgICAgIGNhbGxlZCwgYSBSdW50aW1lRXJyb3IgaXMgcmFpc2VkLgorCisgICAgICAgIFRoaXMgbWV0aG9kIHdha2VzIHVwIGF0IG1vc3QgbiBvZiB0aGUgdGhyZWFkcyB3YWl0aW5nIGZvciB0aGUgY29uZGl0aW9uCisgICAgICAgIHZhcmlhYmxlOyBpdCBpcyBhIG5vLW9wIGlmIG5vIHRocmVhZHMgYXJlIHdhaXRpbmcuCisKKyAgICAgICAgIiIiCiAgICAgICAgIGlmIG5vdCBzZWxmLl9pc19vd25lZCgpOgogICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJjYW5ub3Qgbm90aWZ5IG9uIHVuLWFjcXVpcmVkIGxvY2siKQogICAgICAgICBfX3dhaXRlcnMgPSBzZWxmLl9fd2FpdGVycwpAQCAtMjkzLDE1ICszOTcsMzUgQEAKICAgICAgICAgICAgICAgICBwYXNzCiAKICAgICBkZWYgbm90aWZ5QWxsKHNlbGYpOgorICAgICAgICAiIiJXYWtlIHVwIGFsbCB0aHJlYWRzIHdhaXRpbmcgb24gdGhpcyBjb25kaXRpb24uCisKKyAgICAgICAgSWYgdGhlIGNhbGxpbmcgdGhyZWFkIGhhcyBub3QgYWNxdWlyZWQgdGhlIGxvY2sgd2hlbiB0aGlzIG1ldGhvZAorICAgICAgICBpcyBjYWxsZWQsIGEgUnVudGltZUVycm9yIGlzIHJhaXNlZC4KKworICAgICAgICAiIiIKICAgICAgICAgc2VsZi5ub3RpZnkobGVuKHNlbGYuX193YWl0ZXJzKSkKIAogICAgIG5vdGlmeV9hbGwgPSBub3RpZnlBbGwKIAogCiBkZWYgU2VtYXBob3JlKCphcmdzLCAqKmt3YXJncyk6CisgICAgIiIiQSBmYWN0b3J5IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIG5ldyBzZW1hcGhvcmUuCisKKyAgICBTZW1hcGhvcmVzIG1hbmFnZSBhIGNvdW50ZXIgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgcmVsZWFzZSgpIGNhbGxzIG1pbnVzCisgICAgdGhlIG51bWJlciBvZiBhY3F1aXJlKCkgY2FsbHMsIHBsdXMgYW4gaW5pdGlhbCB2YWx1ZS4gVGhlIGFjcXVpcmUoKSBtZXRob2QKKyAgICBibG9ja3MgaWYgbmVjZXNzYXJ5IHVudGlsIGl0IGNhbiByZXR1cm4gd2l0aG91dCBtYWtpbmcgdGhlIGNvdW50ZXIKKyAgICBuZWdhdGl2ZS4gSWYgbm90IGdpdmVuLCB2YWx1ZSBkZWZhdWx0cyB0byAxLgorCisgICAgIiIiCiAgICAgcmV0dXJuIF9TZW1hcGhvcmUoKmFyZ3MsICoqa3dhcmdzKQogCiBjbGFzcyBfU2VtYXBob3JlKF9WZXJib3NlKToKKyAgICAiIiJTZW1hcGhvcmVzIG1hbmFnZSBhIGNvdW50ZXIgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgcmVsZWFzZSgpIGNhbGxzCisgICAgICAgbWludXMgdGhlIG51bWJlciBvZiBhY3F1aXJlKCkgY2FsbHMsIHBsdXMgYW4gaW5pdGlhbCB2YWx1ZS4gVGhlIGFjcXVpcmUoKQorICAgICAgIG1ldGhvZCBibG9ja3MgaWYgbmVjZXNzYXJ5IHVudGlsIGl0IGNhbiByZXR1cm4gd2l0aG91dCBtYWtpbmcgdGhlIGNvdW50ZXIKKyAgICAgICBuZWdhdGl2ZS4gSWYgbm90IGdpdmVuLCB2YWx1ZSBkZWZhdWx0cyB0byAxLgorCisgICAgIiIiCiAKICAgICAjIEFmdGVyIFRpbSBQZXRlcnMnIHNlbWFwaG9yZSBjbGFzcywgYnV0IG5vdCBxdWl0ZSB0aGUgc2FtZSAobm8gbWF4aW11bSkKIApAQCAtMzEzLDU4ICs0MzcsMTIzIEBACiAgICAgICAgIHNlbGYuX192YWx1ZSA9IHZhbHVlCiAKICAgICBkZWYgYWNxdWlyZShzZWxmLCBibG9ja2luZz0xKToKKyAgICAgICAgIiIiQWNxdWlyZSBhIHNlbWFwaG9yZSwgZGVjcmVtZW50aW5nIHRoZSBpbnRlcm5hbCBjb3VudGVyIGJ5IG9uZS4KKworICAgICAgICBXaGVuIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHM6IGlmIHRoZSBpbnRlcm5hbCBjb3VudGVyIGlzIGxhcmdlciB0aGFuCisgICAgICAgIHplcm8gb24gZW50cnksIGRlY3JlbWVudCBpdCBieSBvbmUgYW5kIHJldHVybiBpbW1lZGlhdGVseS4gSWYgaXQgaXMgemVybworICAgICAgICBvbiBlbnRyeSwgYmxvY2ssIHdhaXRpbmcgdW50aWwgc29tZSBvdGhlciB0aHJlYWQgaGFzIGNhbGxlZCByZWxlYXNlKCkgdG8KKyAgICAgICAgbWFrZSBpdCBsYXJnZXIgdGhhbiB6ZXJvLiBUaGlzIGlzIGRvbmUgd2l0aCBwcm9wZXIgaW50ZXJsb2NraW5nIHNvIHRoYXQKKyAgICAgICAgaWYgbXVsdGlwbGUgYWNxdWlyZSgpIGNhbGxzIGFyZSBibG9ja2VkLCByZWxlYXNlKCkgd2lsbCB3YWtlIGV4YWN0bHkgb25lCisgICAgICAgIG9mIHRoZW0gdXAuIFRoZSBpbXBsZW1lbnRhdGlvbiBtYXkgcGljayBvbmUgYXQgcmFuZG9tLCBzbyB0aGUgb3JkZXIgaW4KKyAgICAgICAgd2hpY2ggYmxvY2tlZCB0aHJlYWRzIGFyZSBhd2FrZW5lZCBzaG91bGQgbm90IGJlIHJlbGllZCBvbi4gVGhlcmUgaXMgbm8KKyAgICAgICAgcmV0dXJuIHZhbHVlIGluIHRoaXMgY2FzZS4KKworICAgICAgICBXaGVuIGludm9rZWQgd2l0aCBibG9ja2luZyBzZXQgdG8gdHJ1ZSwgZG8gdGhlIHNhbWUgdGhpbmcgYXMgd2hlbiBjYWxsZWQKKyAgICAgICAgd2l0aG91dCBhcmd1bWVudHMsIGFuZCByZXR1cm4gdHJ1ZS4KKworICAgICAgICBXaGVuIGludm9rZWQgd2l0aCBibG9ja2luZyBzZXQgdG8gZmFsc2UsIGRvIG5vdCBibG9jay4gSWYgYSBjYWxsIHdpdGhvdXQKKyAgICAgICAgYW4gYXJndW1lbnQgd291bGQgYmxvY2ssIHJldHVybiBmYWxzZSBpbW1lZGlhdGVseTsgb3RoZXJ3aXNlLCBkbyB0aGUKKyAgICAgICAgc2FtZSB0aGluZyBhcyB3aGVuIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50cywgYW5kIHJldHVybiB0cnVlLgorCisgICAgICAgICIiIgogICAgICAgICByYyA9IEZhbHNlCi0gICAgICAgIHNlbGYuX19jb25kLmFjcXVpcmUoKQotICAgICAgICB3aGlsZSBzZWxmLl9fdmFsdWUgPT0gMDoKLSAgICAgICAgICAgIGlmIG5vdCBibG9ja2luZzoKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgaWYgX19kZWJ1Z19fOgotICAgICAgICAgICAgICAgIHNlbGYuX25vdGUoIiVzLmFjcXVpcmUoJXMpOiBibG9ja2VkIHdhaXRpbmcsIHZhbHVlPSVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsIGJsb2NraW5nLCBzZWxmLl9fdmFsdWUpCi0gICAgICAgICAgICBzZWxmLl9fY29uZC53YWl0KCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuX192YWx1ZSA9IHNlbGYuX192YWx1ZSAtIDEKLSAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKLSAgICAgICAgICAgICAgICBzZWxmLl9ub3RlKCIlcy5hY3F1aXJlOiBzdWNjZXNzLCB2YWx1ZT0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBzZWxmLl9fdmFsdWUpCi0gICAgICAgICAgICByYyA9IFRydWUKLSAgICAgICAgc2VsZi5fX2NvbmQucmVsZWFzZSgpCisgICAgICAgIHdpdGggc2VsZi5fX2NvbmQ6CisgICAgICAgICAgICB3aGlsZSBzZWxmLl9fdmFsdWUgPT0gMDoKKyAgICAgICAgICAgICAgICBpZiBub3QgYmxvY2tpbmc6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9ub3RlKCIlcy5hY3F1aXJlKCVzKTogYmxvY2tlZCB3YWl0aW5nLCB2YWx1ZT0lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgYmxvY2tpbmcsIHNlbGYuX192YWx1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLl9fY29uZC53YWl0KCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fX3ZhbHVlID0gc2VsZi5fX3ZhbHVlIC0gMQorICAgICAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fbm90ZSgiJXMuYWNxdWlyZTogc3VjY2VzcywgdmFsdWU9JXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsIHNlbGYuX192YWx1ZSkKKyAgICAgICAgICAgICAgICByYyA9IFRydWUKICAgICAgICAgcmV0dXJuIHJjCiAKICAgICBfX2VudGVyX18gPSBhY3F1aXJlCiAKICAgICBkZWYgcmVsZWFzZShzZWxmKToKLSAgICAgICAgc2VsZi5fX2NvbmQuYWNxdWlyZSgpCi0gICAgICAgIHNlbGYuX192YWx1ZSA9IHNlbGYuX192YWx1ZSArIDEKLSAgICAgICAgaWYgX19kZWJ1Z19fOgotICAgICAgICAgICAgc2VsZi5fbm90ZSgiJXMucmVsZWFzZTogc3VjY2VzcywgdmFsdWU9JXMiLAotICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBzZWxmLl9fdmFsdWUpCi0gICAgICAgIHNlbGYuX19jb25kLm5vdGlmeSgpCi0gICAgICAgIHNlbGYuX19jb25kLnJlbGVhc2UoKQorICAgICAgICAiIiJSZWxlYXNlIGEgc2VtYXBob3JlLCBpbmNyZW1lbnRpbmcgdGhlIGludGVybmFsIGNvdW50ZXIgYnkgb25lLgorCisgICAgICAgIFdoZW4gdGhlIGNvdW50ZXIgaXMgemVybyBvbiBlbnRyeSBhbmQgYW5vdGhlciB0aHJlYWQgaXMgd2FpdGluZyBmb3IgaXQKKyAgICAgICAgdG8gYmVjb21lIGxhcmdlciB0aGFuIHplcm8gYWdhaW4sIHdha2UgdXAgdGhhdCB0aHJlYWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIHdpdGggc2VsZi5fX2NvbmQ6CisgICAgICAgICAgICBzZWxmLl9fdmFsdWUgPSBzZWxmLl9fdmFsdWUgKyAxCisgICAgICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICAgICAgc2VsZi5fbm90ZSgiJXMucmVsZWFzZTogc3VjY2VzcywgdmFsdWU9JXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgc2VsZi5fX3ZhbHVlKQorICAgICAgICAgICAgc2VsZi5fX2NvbmQubm90aWZ5KCkKIAogICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0LCB2LCB0Yik6CiAgICAgICAgIHNlbGYucmVsZWFzZSgpCiAKIAogZGVmIEJvdW5kZWRTZW1hcGhvcmUoKmFyZ3MsICoqa3dhcmdzKToKKyAgICAiIiJBIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgbmV3IGJvdW5kZWQgc2VtYXBob3JlLgorCisgICAgQSBib3VuZGVkIHNlbWFwaG9yZSBjaGVja3MgdG8gbWFrZSBzdXJlIGl0cyBjdXJyZW50IHZhbHVlIGRvZXNuJ3QgZXhjZWVkIGl0cworICAgIGluaXRpYWwgdmFsdWUuIElmIGl0IGRvZXMsIFZhbHVlRXJyb3IgaXMgcmFpc2VkLiBJbiBtb3N0IHNpdHVhdGlvbnMKKyAgICBzZW1hcGhvcmVzIGFyZSB1c2VkIHRvIGd1YXJkIHJlc291cmNlcyB3aXRoIGxpbWl0ZWQgY2FwYWNpdHkuCisKKyAgICBJZiB0aGUgc2VtYXBob3JlIGlzIHJlbGVhc2VkIHRvbyBtYW55IHRpbWVzIGl0J3MgYSBzaWduIG9mIGEgYnVnLiBJZiBub3QKKyAgICBnaXZlbiwgdmFsdWUgZGVmYXVsdHMgdG8gMS4KKworICAgIExpa2UgcmVndWxhciBzZW1hcGhvcmVzLCBib3VuZGVkIHNlbWFwaG9yZXMgbWFuYWdlIGEgY291bnRlciByZXByZXNlbnRpbmcKKyAgICB0aGUgbnVtYmVyIG9mIHJlbGVhc2UoKSBjYWxscyBtaW51cyB0aGUgbnVtYmVyIG9mIGFjcXVpcmUoKSBjYWxscywgcGx1cyBhbgorICAgIGluaXRpYWwgdmFsdWUuIFRoZSBhY3F1aXJlKCkgbWV0aG9kIGJsb2NrcyBpZiBuZWNlc3NhcnkgdW50aWwgaXQgY2FuIHJldHVybgorICAgIHdpdGhvdXQgbWFraW5nIHRoZSBjb3VudGVyIG5lZ2F0aXZlLiBJZiBub3QgZ2l2ZW4sIHZhbHVlIGRlZmF1bHRzIHRvIDEuCisKKyAgICAiIiIKICAgICByZXR1cm4gX0JvdW5kZWRTZW1hcGhvcmUoKmFyZ3MsICoqa3dhcmdzKQogCiBjbGFzcyBfQm91bmRlZFNlbWFwaG9yZShfU2VtYXBob3JlKToKLSAgICAiIiJTZW1hcGhvcmUgdGhhdCBjaGVja3MgdGhhdCAjIHJlbGVhc2VzIGlzIDw9ICMgYWNxdWlyZXMiIiIKKyAgICAiIiJBIGJvdW5kZWQgc2VtYXBob3JlIGNoZWNrcyB0byBtYWtlIHN1cmUgaXRzIGN1cnJlbnQgdmFsdWUgZG9lc24ndCBleGNlZWQKKyAgICAgICBpdHMgaW5pdGlhbCB2YWx1ZS4gSWYgaXQgZG9lcywgVmFsdWVFcnJvciBpcyByYWlzZWQuIEluIG1vc3Qgc2l0dWF0aW9ucworICAgICAgIHNlbWFwaG9yZXMgYXJlIHVzZWQgdG8gZ3VhcmQgcmVzb3VyY2VzIHdpdGggbGltaXRlZCBjYXBhY2l0eS4KKyAgICAiIiIKKwogICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZT0xLCB2ZXJib3NlPU5vbmUpOgogICAgICAgICBfU2VtYXBob3JlLl9faW5pdF9fKHNlbGYsIHZhbHVlLCB2ZXJib3NlKQogICAgICAgICBzZWxmLl9pbml0aWFsX3ZhbHVlID0gdmFsdWUKIAogICAgIGRlZiByZWxlYXNlKHNlbGYpOgotICAgICAgICBpZiBzZWxmLl9TZW1hcGhvcmVfX3ZhbHVlID49IHNlbGYuX2luaXRpYWxfdmFsdWU6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiU2VtYXBob3JlIHJlbGVhc2VkIHRvbyBtYW55IHRpbWVzIgotICAgICAgICByZXR1cm4gX1NlbWFwaG9yZS5yZWxlYXNlKHNlbGYpCisgICAgICAgICIiIlJlbGVhc2UgYSBzZW1hcGhvcmUsIGluY3JlbWVudGluZyB0aGUgaW50ZXJuYWwgY291bnRlciBieSBvbmUuCisKKyAgICAgICAgV2hlbiB0aGUgY291bnRlciBpcyB6ZXJvIG9uIGVudHJ5IGFuZCBhbm90aGVyIHRocmVhZCBpcyB3YWl0aW5nIGZvciBpdAorICAgICAgICB0byBiZWNvbWUgbGFyZ2VyIHRoYW4gemVybyBhZ2Fpbiwgd2FrZSB1cCB0aGF0IHRocmVhZC4KKworICAgICAgICBJZiB0aGUgbnVtYmVyIG9mIHJlbGVhc2VzIGV4Y2VlZHMgdGhlIG51bWJlciBvZiBhY3F1aXJlcywKKyAgICAgICAgcmFpc2UgYSBWYWx1ZUVycm9yLgorCisgICAgICAgICIiIgorICAgICAgICB3aXRoIHNlbGYuX1NlbWFwaG9yZV9fY29uZDoKKyAgICAgICAgICAgIGlmIHNlbGYuX1NlbWFwaG9yZV9fdmFsdWUgPj0gc2VsZi5faW5pdGlhbF92YWx1ZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJTZW1hcGhvcmUgcmVsZWFzZWQgdG9vIG1hbnkgdGltZXMiKQorICAgICAgICAgICAgc2VsZi5fU2VtYXBob3JlX192YWx1ZSArPSAxCisgICAgICAgICAgICBzZWxmLl9TZW1hcGhvcmVfX2NvbmQubm90aWZ5KCkKIAogCiBkZWYgRXZlbnQoKmFyZ3MsICoqa3dhcmdzKToKKyAgICAiIiJBIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgbmV3IGV2ZW50LgorCisgICAgRXZlbnRzIG1hbmFnZSBhIGZsYWcgdGhhdCBjYW4gYmUgc2V0IHRvIHRydWUgd2l0aCB0aGUgc2V0KCkgbWV0aG9kIGFuZCByZXNldAorICAgIHRvIGZhbHNlIHdpdGggdGhlIGNsZWFyKCkgbWV0aG9kLiBUaGUgd2FpdCgpIG1ldGhvZCBibG9ja3MgdW50aWwgdGhlIGZsYWcgaXMKKyAgICB0cnVlLgorCisgICAgIiIiCiAgICAgcmV0dXJuIF9FdmVudCgqYXJncywgKiprd2FyZ3MpCiAKIGNsYXNzIF9FdmVudChfVmVyYm9zZSk6CisgICAgIiIiQSBmYWN0b3J5IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIG5ldyBldmVudCBvYmplY3QuIEFuIGV2ZW50IG1hbmFnZXMgYQorICAgICAgIGZsYWcgdGhhdCBjYW4gYmUgc2V0IHRvIHRydWUgd2l0aCB0aGUgc2V0KCkgbWV0aG9kIGFuZCByZXNldCB0byBmYWxzZQorICAgICAgIHdpdGggdGhlIGNsZWFyKCkgbWV0aG9kLiBUaGUgd2FpdCgpIG1ldGhvZCBibG9ja3MgdW50aWwgdGhlIGZsYWcgaXMgdHJ1ZS4KKworICAgICIiIgogCiAgICAgIyBBZnRlciBUaW0gUGV0ZXJzJyBldmVudCBjbGFzcyAod2l0aG91dCBpc19wb3N0ZWQoKSkKIApAQCAtMzc4LDExICs1NjcsMTggQEAKICAgICAgICAgc2VsZi5fX2NvbmQuX19pbml0X18oKQogCiAgICAgZGVmIGlzU2V0KHNlbGYpOgorICAgICAgICAnUmV0dXJuIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGludGVybmFsIGZsYWcgaXMgdHJ1ZS4nCiAgICAgICAgIHJldHVybiBzZWxmLl9fZmxhZwogCiAgICAgaXNfc2V0ID0gaXNTZXQKIAogICAgIGRlZiBzZXQoc2VsZik6CisgICAgICAgICIiIlNldCB0aGUgaW50ZXJuYWwgZmxhZyB0byB0cnVlLgorCisgICAgICAgIEFsbCB0aHJlYWRzIHdhaXRpbmcgZm9yIHRoZSBmbGFnIHRvIGJlY29tZSB0cnVlIGFyZSBhd2FrZW5lZC4gVGhyZWFkcworICAgICAgICB0aGF0IGNhbGwgd2FpdCgpIG9uY2UgdGhlIGZsYWcgaXMgdHJ1ZSB3aWxsIG5vdCBibG9jayBhdCBhbGwuCisKKyAgICAgICAgIiIiCiAgICAgICAgIHNlbGYuX19jb25kLmFjcXVpcmUoKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzZWxmLl9fZmxhZyA9IFRydWUKQEAgLTM5MSw2ICs1ODcsMTIgQEAKICAgICAgICAgICAgIHNlbGYuX19jb25kLnJlbGVhc2UoKQogCiAgICAgZGVmIGNsZWFyKHNlbGYpOgorICAgICAgICAiIiJSZXNldCB0aGUgaW50ZXJuYWwgZmxhZyB0byBmYWxzZS4KKworICAgICAgICBTdWJzZXF1ZW50bHksIHRocmVhZHMgY2FsbGluZyB3YWl0KCkgd2lsbCBibG9jayB1bnRpbCBzZXQoKSBpcyBjYWxsZWQgdG8KKyAgICAgICAgc2V0IHRoZSBpbnRlcm5hbCBmbGFnIHRvIHRydWUgYWdhaW4uCisKKyAgICAgICAgIiIiCiAgICAgICAgIHNlbGYuX19jb25kLmFjcXVpcmUoKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzZWxmLl9fZmxhZyA9IEZhbHNlCkBAIC0zOTgsNiArNjAwLDIwIEBACiAgICAgICAgICAgICBzZWxmLl9fY29uZC5yZWxlYXNlKCkKIAogICAgIGRlZiB3YWl0KHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgICIiIkJsb2NrIHVudGlsIHRoZSBpbnRlcm5hbCBmbGFnIGlzIHRydWUuCisKKyAgICAgICAgSWYgdGhlIGludGVybmFsIGZsYWcgaXMgdHJ1ZSBvbiBlbnRyeSwgcmV0dXJuIGltbWVkaWF0ZWx5LiBPdGhlcndpc2UsCisgICAgICAgIGJsb2NrIHVudGlsIGFub3RoZXIgdGhyZWFkIGNhbGxzIHNldCgpIHRvIHNldCB0aGUgZmxhZyB0byB0cnVlLCBvciB1bnRpbAorICAgICAgICB0aGUgb3B0aW9uYWwgdGltZW91dCBvY2N1cnMuCisKKyAgICAgICAgV2hlbiB0aGUgdGltZW91dCBhcmd1bWVudCBpcyBwcmVzZW50IGFuZCBub3QgTm9uZSwgaXQgc2hvdWxkIGJlIGEKKyAgICAgICAgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHNwZWNpZnlpbmcgYSB0aW1lb3V0IGZvciB0aGUgb3BlcmF0aW9uIGluIHNlY29uZHMKKyAgICAgICAgKG9yIGZyYWN0aW9ucyB0aGVyZW9mKS4KKworICAgICAgICBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbnRlcm5hbCBmbGFnIG9uIGV4aXQsIHNvIGl0IHdpbGwgYWx3YXlzIHJldHVybgorICAgICAgICBUcnVlIGV4Y2VwdCBpZiBhIHRpbWVvdXQgaXMgZ2l2ZW4gYW5kIHRoZSBvcGVyYXRpb24gdGltZXMgb3V0LgorCisgICAgICAgICIiIgogICAgICAgICBzZWxmLl9fY29uZC5hY3F1aXJlKCkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaWYgbm90IHNlbGYuX19mbGFnOgpAQCAtNDIyLDcgKzYzOCwxMSBAQAogIyBNYWluIGNsYXNzIGZvciB0aHJlYWRzCiAKIGNsYXNzIFRocmVhZChfVmVyYm9zZSk6CisgICAgIiIiQSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgYSB0aHJlYWQgb2YgY29udHJvbC4KIAorICAgIFRoaXMgY2xhc3MgY2FuIGJlIHNhZmVseSBzdWJjbGFzc2VkIGluIGEgbGltaXRlZCBmYXNoaW9uLgorCisgICAgIiIiCiAgICAgX19pbml0aWFsaXplZCA9IEZhbHNlCiAgICAgIyBOZWVkIHRvIHN0b3JlIGEgcmVmZXJlbmNlIHRvIHN5cy5leGNfaW5mbyBmb3IgcHJpbnRpbmcKICAgICAjIG91dCBleGNlcHRpb25zIHdoZW4gYSB0aHJlYWQgdHJpZXMgdG8gdXNlIGEgZ2xvYmFsIHZhci4gZHVyaW5nIGludGVycC4KQEAgLTQzNSw2ICs2NTUsMjcgQEAKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBncm91cD1Ob25lLCB0YXJnZXQ9Tm9uZSwgbmFtZT1Ob25lLAogICAgICAgICAgICAgICAgICBhcmdzPSgpLCBrd2FyZ3M9Tm9uZSwgdmVyYm9zZT1Ob25lKToKKyAgICAgICAgIiIiVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYWx3YXlzIGJlIGNhbGxlZCB3aXRoIGtleXdvcmQgYXJndW1lbnRzLiBBcmd1bWVudHMgYXJlOgorCisgICAgICAgICpncm91cCogc2hvdWxkIGJlIE5vbmU7IHJlc2VydmVkIGZvciBmdXR1cmUgZXh0ZW5zaW9uIHdoZW4gYSBUaHJlYWRHcm91cAorICAgICAgICBjbGFzcyBpcyBpbXBsZW1lbnRlZC4KKworICAgICAgICAqdGFyZ2V0KiBpcyB0aGUgY2FsbGFibGUgb2JqZWN0IHRvIGJlIGludm9rZWQgYnkgdGhlIHJ1bigpCisgICAgICAgIG1ldGhvZC4gRGVmYXVsdHMgdG8gTm9uZSwgbWVhbmluZyBub3RoaW5nIGlzIGNhbGxlZC4KKworICAgICAgICAqbmFtZSogaXMgdGhlIHRocmVhZCBuYW1lLiBCeSBkZWZhdWx0LCBhIHVuaXF1ZSBuYW1lIGlzIGNvbnN0cnVjdGVkIG9mCisgICAgICAgIHRoZSBmb3JtICJUaHJlYWQtTiIgd2hlcmUgTiBpcyBhIHNtYWxsIGRlY2ltYWwgbnVtYmVyLgorCisgICAgICAgICphcmdzKiBpcyB0aGUgYXJndW1lbnQgdHVwbGUgZm9yIHRoZSB0YXJnZXQgaW52b2NhdGlvbi4gRGVmYXVsdHMgdG8gKCkuCisKKyAgICAgICAgKmt3YXJncyogaXMgYSBkaWN0aW9uYXJ5IG9mIGtleXdvcmQgYXJndW1lbnRzIGZvciB0aGUgdGFyZ2V0CisgICAgICAgIGludm9jYXRpb24uIERlZmF1bHRzIHRvIHt9LgorCisgICAgICAgIElmIGEgc3ViY2xhc3Mgb3ZlcnJpZGVzIHRoZSBjb25zdHJ1Y3RvciwgaXQgbXVzdCBtYWtlIHN1cmUgdG8gaW52b2tlCisgICAgICAgIHRoZSBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yIChUaHJlYWQuX19pbml0X18oKSkgYmVmb3JlIGRvaW5nIGFueXRoaW5nCisgICAgICAgIGVsc2UgdG8gdGhlIHRocmVhZC4KKworIiIiCiAgICAgICAgIGFzc2VydCBncm91cCBpcyBOb25lLCAiZ3JvdXAgYXJndW1lbnQgbXVzdCBiZSBOb25lIGZvciBub3ciCiAgICAgICAgIF9WZXJib3NlLl9faW5pdF9fKHNlbGYsIHZlcmJvc2UpCiAgICAgICAgIGlmIGt3YXJncyBpcyBOb25lOgpAQCAtNDgzLDYgKzcyNCwxNSBAQAogICAgICAgICByZXR1cm4gIjwlcyglcywgJXMpPiIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuX19uYW1lLCBzdGF0dXMpCiAKICAgICBkZWYgc3RhcnQoc2VsZik6CisgICAgICAgICIiIlN0YXJ0IHRoZSB0aHJlYWQncyBhY3Rpdml0eS4KKworICAgICAgICBJdCBtdXN0IGJlIGNhbGxlZCBhdCBtb3N0IG9uY2UgcGVyIHRocmVhZCBvYmplY3QuIEl0IGFycmFuZ2VzIGZvciB0aGUKKyAgICAgICAgb2JqZWN0J3MgcnVuKCkgbWV0aG9kIHRvIGJlIGludm9rZWQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQgb2YgY29udHJvbC4KKworICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIHJhaXNlIGEgUnVudGltZUVycm9yIGlmIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUKKyAgICAgICAgc2FtZSB0aHJlYWQgb2JqZWN0LgorCisgICAgICAgICIiIgogICAgICAgICBpZiBub3Qgc2VsZi5fX2luaXRpYWxpemVkOgogICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJ0aHJlYWQuX19pbml0X18oKSBub3QgY2FsbGVkIikKICAgICAgICAgaWYgc2VsZi5fX3N0YXJ0ZWQuaXNfc2V0KCk6CkBAIC01MDAsNiArNzUwLDE0IEBACiAgICAgICAgIHNlbGYuX19zdGFydGVkLndhaXQoKQogCiAgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgIiIiTWV0aG9kIHJlcHJlc2VudGluZyB0aGUgdGhyZWFkJ3MgYWN0aXZpdHkuCisKKyAgICAgICAgWW91IG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBpbiBhIHN1YmNsYXNzLiBUaGUgc3RhbmRhcmQgcnVuKCkgbWV0aG9kCisgICAgICAgIGludm9rZXMgdGhlIGNhbGxhYmxlIG9iamVjdCBwYXNzZWQgdG8gdGhlIG9iamVjdCdzIGNvbnN0cnVjdG9yIGFzIHRoZQorICAgICAgICB0YXJnZXQgYXJndW1lbnQsIGlmIGFueSwgd2l0aCBzZXF1ZW50aWFsIGFuZCBrZXl3b3JkIGFyZ3VtZW50cyB0YWtlbgorICAgICAgICBmcm9tIHRoZSBhcmdzIGFuZCBrd2FyZ3MgYXJndW1lbnRzLCByZXNwZWN0aXZlbHkuCisKKyAgICAgICAgIiIiCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGlmIHNlbGYuX190YXJnZXQ6CiAgICAgICAgICAgICAgICAgc2VsZi5fX3RhcmdldCgqc2VsZi5fX2FyZ3MsICoqc2VsZi5fX2t3YXJncykKQEAgLTYwNiw2ICs4NjQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgcGFzcwogCiAgICAgZGVmIF9fc3RvcChzZWxmKToKKyAgICAgICAgIyBEdW1teVRocmVhZHMgZGVsZXRlIHNlbGYuX19ibG9jaywgYnV0IHRoZXkgaGF2ZSBubyB3YWl0ZXJzIHRvCisgICAgICAgICMgbm90aWZ5IGFueXdheSAoam9pbigpIGlzIGZvcmJpZGRlbiBvbiB0aGVtKS4KKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgJ19UaHJlYWRfX2Jsb2NrJyk6CisgICAgICAgICAgICByZXR1cm4KICAgICAgICAgc2VsZi5fX2Jsb2NrLmFjcXVpcmUoKQogICAgICAgICBzZWxmLl9fc3RvcHBlZCA9IFRydWUKICAgICAgICAgc2VsZi5fX2Jsb2NrLm5vdGlmeV9hbGwoKQpAQCAtNjQ3LDYgKzkwOSwyOSBAQAogICAgICAgICAgICAgICAgIHJhaXNlCiAKICAgICBkZWYgam9pbihzZWxmLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICAiIiJXYWl0IHVudGlsIHRoZSB0aHJlYWQgdGVybWluYXRlcy4KKworICAgICAgICBUaGlzIGJsb2NrcyB0aGUgY2FsbGluZyB0aHJlYWQgdW50aWwgdGhlIHRocmVhZCB3aG9zZSBqb2luKCkgbWV0aG9kIGlzCisgICAgICAgIGNhbGxlZCB0ZXJtaW5hdGVzIC0tIGVpdGhlciBub3JtYWxseSBvciB0aHJvdWdoIGFuIHVuaGFuZGxlZCBleGNlcHRpb24KKyAgICAgICAgb3IgdW50aWwgdGhlIG9wdGlvbmFsIHRpbWVvdXQgb2NjdXJzLgorCisgICAgICAgIFdoZW4gdGhlIHRpbWVvdXQgYXJndW1lbnQgaXMgcHJlc2VudCBhbmQgbm90IE5vbmUsIGl0IHNob3VsZCBiZSBhCisgICAgICAgIGZsb2F0aW5nIHBvaW50IG51bWJlciBzcGVjaWZ5aW5nIGEgdGltZW91dCBmb3IgdGhlIG9wZXJhdGlvbiBpbiBzZWNvbmRzCisgICAgICAgIChvciBmcmFjdGlvbnMgdGhlcmVvZikuIEFzIGpvaW4oKSBhbHdheXMgcmV0dXJucyBOb25lLCB5b3UgbXVzdCBjYWxsCisgICAgICAgIGlzQWxpdmUoKSBhZnRlciBqb2luKCkgdG8gZGVjaWRlIHdoZXRoZXIgYSB0aW1lb3V0IGhhcHBlbmVkIC0tIGlmIHRoZQorICAgICAgICB0aHJlYWQgaXMgc3RpbGwgYWxpdmUsIHRoZSBqb2luKCkgY2FsbCB0aW1lZCBvdXQuCisKKyAgICAgICAgV2hlbiB0aGUgdGltZW91dCBhcmd1bWVudCBpcyBub3QgcHJlc2VudCBvciBOb25lLCB0aGUgb3BlcmF0aW9uIHdpbGwKKyAgICAgICAgYmxvY2sgdW50aWwgdGhlIHRocmVhZCB0ZXJtaW5hdGVzLgorCisgICAgICAgIEEgdGhyZWFkIGNhbiBiZSBqb2luKCllZCBtYW55IHRpbWVzLgorCisgICAgICAgIGpvaW4oKSByYWlzZXMgYSBSdW50aW1lRXJyb3IgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGpvaW4gdGhlIGN1cnJlbnQKKyAgICAgICAgdGhyZWFkIGFzIHRoYXQgd291bGQgY2F1c2UgYSBkZWFkbG9jay4gSXQgaXMgYWxzbyBhbiBlcnJvciB0byBqb2luKCkgYQorICAgICAgICB0aHJlYWQgYmVmb3JlIGl0IGhhcyBiZWVuIHN0YXJ0ZWQgYW5kIGF0dGVtcHRzIHRvIGRvIHNvIHJhaXNlcyB0aGUgc2FtZQorICAgICAgICBleGNlcHRpb24uCisKKyAgICAgICAgIiIiCiAgICAgICAgIGlmIG5vdCBzZWxmLl9faW5pdGlhbGl6ZWQ6CiAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIlRocmVhZC5fX2luaXRfXygpIG5vdCBjYWxsZWQiKQogICAgICAgICBpZiBub3Qgc2VsZi5fX3N0YXJ0ZWQuaXNfc2V0KCk6CkBAIC02ODEsNiArOTY2LDEyIEBACiAKICAgICBAcHJvcGVydHkKICAgICBkZWYgbmFtZShzZWxmKToKKyAgICAgICAgIiIiQSBzdHJpbmcgdXNlZCBmb3IgaWRlbnRpZmljYXRpb24gcHVycG9zZXMgb25seS4KKworICAgICAgICBJdCBoYXMgbm8gc2VtYW50aWNzLiBNdWx0aXBsZSB0aHJlYWRzIG1heSBiZSBnaXZlbiB0aGUgc2FtZSBuYW1lLiBUaGUKKyAgICAgICAgaW5pdGlhbCBuYW1lIGlzIHNldCBieSB0aGUgY29uc3RydWN0b3IuCisKKyAgICAgICAgIiIiCiAgICAgICAgIGFzc2VydCBzZWxmLl9faW5pdGlhbGl6ZWQsICJUaHJlYWQuX19pbml0X18oKSBub3QgY2FsbGVkIgogICAgICAgICByZXR1cm4gc2VsZi5fX25hbWUKIApAQCAtNjkxLDEwICs5ODIsMjQgQEAKIAogICAgIEBwcm9wZXJ0eQogICAgIGRlZiBpZGVudChzZWxmKToKKyAgICAgICAgIiIiVGhyZWFkIGlkZW50aWZpZXIgb2YgdGhpcyB0aHJlYWQgb3IgTm9uZSBpZiBpdCBoYXMgbm90IGJlZW4gc3RhcnRlZC4KKworICAgICAgICBUaGlzIGlzIGEgbm9uemVybyBpbnRlZ2VyLiBTZWUgdGhlIHRocmVhZC5nZXRfaWRlbnQoKSBmdW5jdGlvbi4gVGhyZWFkCisgICAgICAgIGlkZW50aWZpZXJzIG1heSBiZSByZWN5Y2xlZCB3aGVuIGEgdGhyZWFkIGV4aXRzIGFuZCBhbm90aGVyIHRocmVhZCBpcworICAgICAgICBjcmVhdGVkLiBUaGUgaWRlbnRpZmllciBpcyBhdmFpbGFibGUgZXZlbiBhZnRlciB0aGUgdGhyZWFkIGhhcyBleGl0ZWQuCisKKyAgICAgICAgIiIiCiAgICAgICAgIGFzc2VydCBzZWxmLl9faW5pdGlhbGl6ZWQsICJUaHJlYWQuX19pbml0X18oKSBub3QgY2FsbGVkIgogICAgICAgICByZXR1cm4gc2VsZi5fX2lkZW50CiAKICAgICBkZWYgaXNBbGl2ZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHdoZXRoZXIgdGhlIHRocmVhZCBpcyBhbGl2ZS4KKworICAgICAgICBUaGlzIG1ldGhvZCByZXR1cm5zIFRydWUganVzdCBiZWZvcmUgdGhlIHJ1bigpIG1ldGhvZCBzdGFydHMgdW50aWwganVzdAorICAgICAgICBhZnRlciB0aGUgcnVuKCkgbWV0aG9kIHRlcm1pbmF0ZXMuIFRoZSBtb2R1bGUgZnVuY3Rpb24gZW51bWVyYXRlKCkKKyAgICAgICAgcmV0dXJucyBhIGxpc3Qgb2YgYWxsIGFsaXZlIHRocmVhZHMuCisKKyAgICAgICAgIiIiCiAgICAgICAgIGFzc2VydCBzZWxmLl9faW5pdGlhbGl6ZWQsICJUaHJlYWQuX19pbml0X18oKSBub3QgY2FsbGVkIgogICAgICAgICByZXR1cm4gc2VsZi5fX3N0YXJ0ZWQuaXNfc2V0KCkgYW5kIG5vdCBzZWxmLl9fc3RvcHBlZAogCkBAIC03MDIsNiArMTAwNywxNyBAQAogCiAgICAgQHByb3BlcnR5CiAgICAgZGVmIGRhZW1vbihzZWxmKToKKyAgICAgICAgIiIiQSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHRocmVhZCBpcyBhIGRhZW1vbiB0aHJlYWQgKFRydWUpIG9yIG5vdCAoRmFsc2UpLgorCisgICAgICAgIFRoaXMgbXVzdCBiZSBzZXQgYmVmb3JlIHN0YXJ0KCkgaXMgY2FsbGVkLCBvdGhlcndpc2UgUnVudGltZUVycm9yIGlzCisgICAgICAgIHJhaXNlZC4gSXRzIGluaXRpYWwgdmFsdWUgaXMgaW5oZXJpdGVkIGZyb20gdGhlIGNyZWF0aW5nIHRocmVhZDsgdGhlCisgICAgICAgIG1haW4gdGhyZWFkIGlzIG5vdCBhIGRhZW1vbiB0aHJlYWQgYW5kIHRoZXJlZm9yZSBhbGwgdGhyZWFkcyBjcmVhdGVkIGluCisgICAgICAgIHRoZSBtYWluIHRocmVhZCBkZWZhdWx0IHRvIGRhZW1vbiA9IEZhbHNlLgorCisgICAgICAgIFRoZSBlbnRpcmUgUHl0aG9uIHByb2dyYW0gZXhpdHMgd2hlbiBubyBhbGl2ZSBub24tZGFlbW9uIHRocmVhZHMgYXJlCisgICAgICAgIGxlZnQuCisKKyAgICAgICAgIiIiCiAgICAgICAgIGFzc2VydCBzZWxmLl9faW5pdGlhbGl6ZWQsICJUaHJlYWQuX19pbml0X18oKSBub3QgY2FsbGVkIgogICAgICAgICByZXR1cm4gc2VsZi5fX2RhZW1vbmljCiAKQEAgLTcyOCwxNCArMTA0NCwyNCBAQAogIyBUaGUgdGltZXIgY2xhc3Mgd2FzIGNvbnRyaWJ1dGVkIGJ5IEl0YW1hciBTaHR1bGwtVHJhdXJpbmcKIAogZGVmIFRpbWVyKCphcmdzLCAqKmt3YXJncyk6CisgICAgIiIiRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBUaW1lciBvYmplY3QuCisKKyAgICBUaW1lcnMgY2FsbCBhIGZ1bmN0aW9uIGFmdGVyIGEgc3BlY2lmaWVkIG51bWJlciBvZiBzZWNvbmRzOgorCisgICAgICAgIHQgPSBUaW1lcigzMC4wLCBmLCBhcmdzPVtdLCBrd2FyZ3M9e30pCisgICAgICAgIHQuc3RhcnQoKQorICAgICAgICB0LmNhbmNlbCgpICAgICAjIHN0b3AgdGhlIHRpbWVyJ3MgYWN0aW9uIGlmIGl0J3Mgc3RpbGwgd2FpdGluZworCisgICAgIiIiCiAgICAgcmV0dXJuIF9UaW1lcigqYXJncywgKiprd2FyZ3MpCiAKIGNsYXNzIF9UaW1lcihUaHJlYWQpOgogICAgICIiIkNhbGwgYSBmdW5jdGlvbiBhZnRlciBhIHNwZWNpZmllZCBudW1iZXIgb2Ygc2Vjb25kczoKIAotICAgIHQgPSBUaW1lcigzMC4wLCBmLCBhcmdzPVtdLCBrd2FyZ3M9e30pCi0gICAgdC5zdGFydCgpCi0gICAgdC5jYW5jZWwoKSAjIHN0b3AgdGhlIHRpbWVyJ3MgYWN0aW9uIGlmIGl0J3Mgc3RpbGwgd2FpdGluZworICAgICAgICAgICAgdCA9IFRpbWVyKDMwLjAsIGYsIGFyZ3M9W10sIGt3YXJncz17fSkKKyAgICAgICAgICAgIHQuc3RhcnQoKQorICAgICAgICAgICAgdC5jYW5jZWwoKSAgICAgIyBzdG9wIHRoZSB0aW1lcidzIGFjdGlvbiBpZiBpdCdzIHN0aWxsIHdhaXRpbmcKKwogICAgICIiIgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGludGVydmFsLCBmdW5jdGlvbiwgYXJncz1bXSwga3dhcmdzPXt9KToKQEAgLTgyNCw2ICsxMTUwLDEyIEBACiAjIEdsb2JhbCBBUEkgZnVuY3Rpb25zCiAKIGRlZiBjdXJyZW50VGhyZWFkKCk6CisgICAgIiIiUmV0dXJuIHRoZSBjdXJyZW50IFRocmVhZCBvYmplY3QsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNhbGxlcidzIHRocmVhZCBvZiBjb250cm9sLgorCisgICAgSWYgdGhlIGNhbGxlcidzIHRocmVhZCBvZiBjb250cm9sIHdhcyBub3QgY3JlYXRlZCB0aHJvdWdoIHRoZSB0aHJlYWRpbmcKKyAgICBtb2R1bGUsIGEgZHVtbXkgdGhyZWFkIG9iamVjdCB3aXRoIGxpbWl0ZWQgZnVuY3Rpb25hbGl0eSBpcyByZXR1cm5lZC4KKworICAgICIiIgogICAgIHRyeToKICAgICAgICAgcmV0dXJuIF9hY3RpdmVbX2dldF9pZGVudCgpXQogICAgIGV4Y2VwdCBLZXlFcnJvcjoKQEAgLTgzMyw2ICsxMTY1LDEyIEBACiBjdXJyZW50X3RocmVhZCA9IGN1cnJlbnRUaHJlYWQKIAogZGVmIGFjdGl2ZUNvdW50KCk6CisgICAgIiIiUmV0dXJuIHRoZSBudW1iZXIgb2YgVGhyZWFkIG9iamVjdHMgY3VycmVudGx5IGFsaXZlLgorCisgICAgVGhlIHJldHVybmVkIGNvdW50IGlzIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgcmV0dXJuZWQgYnkKKyAgICBlbnVtZXJhdGUoKS4KKworICAgICIiIgogICAgIHdpdGggX2FjdGl2ZV9saW1ib19sb2NrOgogICAgICAgICByZXR1cm4gbGVuKF9hY3RpdmUpICsgbGVuKF9saW1ibykKIApAQCAtODQzLDYgKzExODEsMTMgQEAKICAgICByZXR1cm4gX2FjdGl2ZS52YWx1ZXMoKSArIF9saW1iby52YWx1ZXMoKQogCiBkZWYgZW51bWVyYXRlKCk6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgVGhyZWFkIG9iamVjdHMgY3VycmVudGx5IGFsaXZlLgorCisgICAgVGhlIGxpc3QgaW5jbHVkZXMgZGFlbW9uaWMgdGhyZWFkcywgZHVtbXkgdGhyZWFkIG9iamVjdHMgY3JlYXRlZCBieQorICAgIGN1cnJlbnRfdGhyZWFkKCksIGFuZCB0aGUgbWFpbiB0aHJlYWQuIEl0IGV4Y2x1ZGVzIHRlcm1pbmF0ZWQgdGhyZWFkcyBhbmQKKyAgICB0aHJlYWRzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gc3RhcnRlZC4KKworICAgICIiIgogICAgIHdpdGggX2FjdGl2ZV9saW1ib19sb2NrOgogICAgICAgICByZXR1cm4gX2FjdGl2ZS52YWx1ZXMoKSArIF9saW1iby52YWx1ZXMoKQogCkBAIC04NzcsMjMgKzEyMjIsMjAgQEAKICAgICBuZXdfYWN0aXZlID0ge30KICAgICBjdXJyZW50ID0gY3VycmVudF90aHJlYWQoKQogICAgIHdpdGggX2FjdGl2ZV9saW1ib19sb2NrOgotICAgICAgICBmb3IgdGhyZWFkIGluIF9hY3RpdmUuaXRlcnZhbHVlcygpOgorICAgICAgICBmb3IgdGhyZWFkIGluIF9lbnVtZXJhdGUoKToKKyAgICAgICAgICAgICMgQW55IGxvY2svY29uZGl0aW9uIHZhcmlhYmxlIG1heSBiZSBjdXJyZW50bHkgbG9ja2VkIG9yIGluIGFuCisgICAgICAgICAgICAjIGludmFsaWQgc3RhdGUsIHNvIHdlIHJlaW5pdGlhbGl6ZSB0aGVtLgorICAgICAgICAgICAgaWYgaGFzYXR0cih0aHJlYWQsICdfcmVzZXRfaW50ZXJuYWxfbG9ja3MnKToKKyAgICAgICAgICAgICAgICB0aHJlYWQuX3Jlc2V0X2ludGVybmFsX2xvY2tzKCkKICAgICAgICAgICAgIGlmIHRocmVhZCBpcyBjdXJyZW50OgogICAgICAgICAgICAgICAgICMgVGhlcmUgaXMgb25seSBvbmUgYWN0aXZlIHRocmVhZC4gV2UgcmVzZXQgdGhlIGlkZW50IHRvCiAgICAgICAgICAgICAgICAgIyBpdHMgbmV3IHZhbHVlIHNpbmNlIGl0IGNhbiBoYXZlIGNoYW5nZWQuCiAgICAgICAgICAgICAgICAgaWRlbnQgPSBfZ2V0X2lkZW50KCkKICAgICAgICAgICAgICAgICB0aHJlYWQuX1RocmVhZF9faWRlbnQgPSBpZGVudAotICAgICAgICAgICAgICAgICMgQW55IGNvbmRpdGlvbiB2YXJpYWJsZXMgaGFuZ2luZyBvZmYgb2YgdGhlIGFjdGl2ZSB0aHJlYWQgbWF5Ci0gICAgICAgICAgICAgICAgIyBiZSBpbiBhbiBpbnZhbGlkIHN0YXRlLCBzbyB3ZSByZWluaXRpYWxpemUgdGhlbS4KLSAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKHRocmVhZCwgJ19yZXNldF9pbnRlcm5hbF9sb2NrcycpOgotICAgICAgICAgICAgICAgICAgICB0aHJlYWQuX3Jlc2V0X2ludGVybmFsX2xvY2tzKCkKICAgICAgICAgICAgICAgICBuZXdfYWN0aXZlW2lkZW50XSA9IHRocmVhZAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAjIEFsbCB0aGUgb3RoZXJzIGFyZSBhbHJlYWR5IHN0b3BwZWQuCi0gICAgICAgICAgICAgICAgIyBXZSBkb24ndCBjYWxsIF9UaHJlYWRfX3N0b3AoKSBiZWNhdXNlIGl0IHRyaWVzIHRvIGFjcXVpcmUKLSAgICAgICAgICAgICAgICAjIHRocmVhZC5fVGhyZWFkX19ibG9jayB3aGljaCBjb3VsZCBhbHNvIGhhdmUgYmVlbiBoZWxkIHdoaWxlCi0gICAgICAgICAgICAgICAgIyB3ZSBmb3JrZWQuCi0gICAgICAgICAgICAgICAgdGhyZWFkLl9UaHJlYWRfX3N0b3BwZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgdGhyZWFkLl9UaHJlYWRfX3N0b3AoKQogCiAgICAgICAgIF9saW1iby5jbGVhcigpCiAgICAgICAgIF9hY3RpdmUuY2xlYXIoKQpAQCAtOTEzLDcgKzEyNTUsNyBAQAogICAgICAgICAgICAgc2VsZi5yYyA9IENvbmRpdGlvbihzZWxmLm1vbikKICAgICAgICAgICAgIHNlbGYud2MgPSBDb25kaXRpb24oc2VsZi5tb24pCiAgICAgICAgICAgICBzZWxmLmxpbWl0ID0gbGltaXQKLSAgICAgICAgICAgIHNlbGYucXVldWUgPSBkZXF1ZSgpCisgICAgICAgICAgICBzZWxmLnF1ZXVlID0gX2RlcXVlKCkKIAogICAgICAgICBkZWYgcHV0KHNlbGYsIGl0ZW0pOgogICAgICAgICAgICAgc2VsZi5tb24uYWNxdWlyZSgpCmRpZmYgLS1naXQgYS9MaWIvdGltZWl0LnB5IGIvTGliL3RpbWVpdC5weQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmRpZmYgLS1naXQgYS9MaWIvdG9rZW4ucHkgYi9MaWIvdG9rZW4ucHkKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA4ZDVjZGFhLi40NTgyNWI0Ci0tLSBhL0xpYi90b2tlbi5weQorKysgYi9MaWIvdG9rZW4ucHkKQEAgLTEsNSArMSwzIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCi0KICIiIlRva2VuIGNvbnN0YW50cyAoZnJvbSAidG9rZW4uaCIpLiIiIgogCiAjICBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQ7IHBsZWFzZSBkb24ndCBtdWNrIGl0IHVwIQpAQCAtNyw3ICs1LDcgQEAKICMgIFRvIHVwZGF0ZSB0aGUgc3ltYm9scyBpbiB0aGlzIGZpbGUsICdjZCcgdG8gdGhlIHRvcCBkaXJlY3Rvcnkgb2YKICMgIHRoZSBweXRob24gc291cmNlIHRyZWUgYWZ0ZXIgYnVpbGRpbmcgdGhlIGludGVycHJldGVyIGFuZCBydW46CiAjCi0jICAgIHB5dGhvbiBMaWIvdG9rZW4ucHkKKyMgICAgLi9weXRob24gTGliL3Rva2VuLnB5CiAKICMtLXN0YXJ0IGNvbnN0YW50cy0tCiBFTkRNQVJLRVIgPSAwCmRpZmYgLS1naXQgYS9MaWIvdG9rZW5pemUucHkgYi9MaWIvdG9rZW5pemUucHkKaW5kZXggYWUzZGU1NC4uNjYxZGRlYiAxMDA2NDQKLS0tIGEvTGliL3Rva2VuaXplLnB5CisrKyBiL0xpYi90b2tlbml6ZS5weQpAQCAtMjYsNiArMjYsNyBAQAogX19jcmVkaXRzX18gPSAoJ0d2UiwgRVNSLCBUaW0gUGV0ZXJzLCBUaG9tYXMgV291dGVycywgRnJlZCBEcmFrZSwgJwogICAgICAgICAgICAgICAgJ1NraXAgTW9udGFuYXJvLCBSYXltb25kIEhldHRpbmdlcicpCiAKK2Zyb20gaXRlcnRvb2xzIGltcG9ydCBjaGFpbgogaW1wb3J0IHN0cmluZywgcmUKIGZyb20gdG9rZW4gaW1wb3J0ICoKIApAQCAtNzAsMTAgKzcxLDEwIEBACiBTaW5nbGUzID0gciJbXidcXF0qKD86KD86XFwufCcoPyEnJykpW14nXFxdKikqJycnIgogIyBUYWlsIGVuZCBvZiAiIiIgc3RyaW5nLgogRG91YmxlMyA9IHInW14iXFxdKig/Oig/OlxcLnwiKD8hIiIpKVteIlxcXSopKiIiIicKLVRyaXBsZSA9IGdyb3VwKCJbdVVdP1tyUl0/JycnIiwgJ1t1VV0/W3JSXT8iIiInKQorVHJpcGxlID0gZ3JvdXAoIlt1VWJCXT9bclJdPycnJyIsICdbdVViQl0/W3JSXT8iIiInKQogIyBTaW5nbGUtbGluZSAnIG9yICIgc3RyaW5nLgotU3RyaW5nID0gZ3JvdXAociJbdVVdP1tyUl0/J1teXG4nXFxdKig/OlxcLlteXG4nXFxdKikqJyIsCi0gICAgICAgICAgICAgICByJ1t1VV0/W3JSXT8iW15cbiJcXF0qKD86XFwuW15cbiJcXF0qKSoiJykKK1N0cmluZyA9IGdyb3VwKHIiW3VVYkJdP1tyUl0/J1teXG4nXFxdKig/OlxcLlteXG4nXFxdKikqJyIsCisgICAgICAgICAgICAgICByJ1t1VWJCXT9bclJdPyJbXlxuIlxcXSooPzpcXC5bXlxuIlxcXSopKiInKQogCiAjIEJlY2F1c2Ugb2YgbGVmdG1vc3QtdGhlbi1sb25nZXN0IG1hdGNoIHNlbWFudGljcywgYmUgc3VyZSB0byBwdXQgdGhlCiAjIGxvbmdlc3Qgb3BlcmF0b3JzIGZpcnN0IChlLmcuLCBpZiA9IGNhbWUgYmVmb3JlID09LCA9PSB3b3VsZCBnZXQKQEAgLTkxLDExICs5MiwxMSBAQAogVG9rZW4gPSBJZ25vcmUgKyBQbGFpblRva2VuCiAKICMgRmlyc3QgKG9yIG9ubHkpIGxpbmUgb2YgJyBvciAiIHN0cmluZy4KLUNvbnRTdHIgPSBncm91cChyIlt1VV0/W3JSXT8nW15cbidcXF0qKD86XFwuW15cbidcXF0qKSoiICsKK0NvbnRTdHIgPSBncm91cChyIlt1VWJCXT9bclJdPydbXlxuJ1xcXSooPzpcXC5bXlxuJ1xcXSopKiIgKwogICAgICAgICAgICAgICAgIGdyb3VwKCInIiwgcidcXFxyP1xuJyksCi0gICAgICAgICAgICAgICAgcidbdVVdP1tyUl0/IlteXG4iXFxdKig/OlxcLlteXG4iXFxdKikqJyArCisgICAgICAgICAgICAgICAgcidbdVViQl0/W3JSXT8iW15cbiJcXF0qKD86XFwuW15cbiJcXF0qKSonICsKICAgICAgICAgICAgICAgICBncm91cCgnIicsIHInXFxccj9cbicpKQotUHNldWRvRXh0cmFzID0gZ3JvdXAocidcXFxyP1xuJywgQ29tbWVudCwgVHJpcGxlKQorUHNldWRvRXh0cmFzID0gZ3JvdXAocidcXFxyP1xufFxaJywgQ29tbWVudCwgVHJpcGxlKQogUHNldWRvVG9rZW4gPSBXaGl0ZXNwYWNlICsgZ3JvdXAoUHNldWRvRXh0cmFzLCBOdW1iZXIsIEZ1bm55LCBDb250U3RyLCBOYW1lKQogCiB0b2tlbnByb2csIHBzZXVkb3Byb2csIHNpbmdsZTNwcm9nLCBkb3VibGUzcHJvZyA9IG1hcCgKQEAgLTE4NCwxNyArMTg1LDI2IEBACiAKICAgICBkZWYgYWRkX3doaXRlc3BhY2Uoc2VsZiwgc3RhcnQpOgogICAgICAgICByb3csIGNvbCA9IHN0YXJ0Ci0gICAgICAgIGFzc2VydCByb3cgPD0gc2VsZi5wcmV2X3JvdworICAgICAgICBpZiByb3cgPCBzZWxmLnByZXZfcm93IG9yIHJvdyA9PSBzZWxmLnByZXZfcm93IGFuZCBjb2wgPCBzZWxmLnByZXZfY29sOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigic3RhcnQgKHt9LHt9KSBwcmVjZWRlcyBwcmV2aW91cyBlbmQgKHt9LHt9KSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvcm1hdChyb3csIGNvbCwgc2VsZi5wcmV2X3Jvdywgc2VsZi5wcmV2X2NvbCkpCisgICAgICAgIHJvd19vZmZzZXQgPSByb3cgLSBzZWxmLnByZXZfcm93CisgICAgICAgIGlmIHJvd19vZmZzZXQ6CisgICAgICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQoIlxcXG4iICogcm93X29mZnNldCkKKyAgICAgICAgICAgIHNlbGYucHJldl9jb2wgPSAwCiAgICAgICAgIGNvbF9vZmZzZXQgPSBjb2wgLSBzZWxmLnByZXZfY29sCiAgICAgICAgIGlmIGNvbF9vZmZzZXQ6CiAgICAgICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQoIiAiICogY29sX29mZnNldCkKIAogICAgIGRlZiB1bnRva2VuaXplKHNlbGYsIGl0ZXJhYmxlKToKLSAgICAgICAgZm9yIHQgaW4gaXRlcmFibGU6CisgICAgICAgIGl0ID0gaXRlcihpdGVyYWJsZSkKKyAgICAgICAgZm9yIHQgaW4gaXQ6CiAgICAgICAgICAgICBpZiBsZW4odCkgPT0gMjoKLSAgICAgICAgICAgICAgICBzZWxmLmNvbXBhdCh0LCBpdGVyYWJsZSkKKyAgICAgICAgICAgICAgICBzZWxmLmNvbXBhdCh0LCBpdCkKICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgdG9rX3R5cGUsIHRva2VuLCBzdGFydCwgZW5kLCBsaW5lID0gdAorICAgICAgICAgICAgaWYgdG9rX3R5cGUgPT0gRU5ETUFSS0VSOgorICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICBzZWxmLmFkZF93aGl0ZXNwYWNlKHN0YXJ0KQogICAgICAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKHRva2VuKQogICAgICAgICAgICAgc2VsZi5wcmV2X3Jvdywgc2VsZi5wcmV2X2NvbCA9IGVuZApAQCAtMjA0LDE2ICsyMTQsMTIgQEAKICAgICAgICAgcmV0dXJuICIiLmpvaW4oc2VsZi50b2tlbnMpCiAKICAgICBkZWYgY29tcGF0KHNlbGYsIHRva2VuLCBpdGVyYWJsZSk6Ci0gICAgICAgIHN0YXJ0bGluZSA9IEZhbHNlCiAgICAgICAgIGluZGVudHMgPSBbXQogICAgICAgICB0b2tzX2FwcGVuZCA9IHNlbGYudG9rZW5zLmFwcGVuZAotICAgICAgICB0b2tudW0sIHRva3ZhbCA9IHRva2VuCi0gICAgICAgIGlmIHRva251bSBpbiAoTkFNRSwgTlVNQkVSKToKLSAgICAgICAgICAgIHRva3ZhbCArPSAnICcKLSAgICAgICAgaWYgdG9rbnVtIGluIChORVdMSU5FLCBOTCk6Ci0gICAgICAgICAgICBzdGFydGxpbmUgPSBUcnVlCisgICAgICAgIHN0YXJ0bGluZSA9IHRva2VuWzBdIGluIChORVdMSU5FLCBOTCkKICAgICAgICAgcHJldnN0cmluZyA9IEZhbHNlCi0gICAgICAgIGZvciB0b2sgaW4gaXRlcmFibGU6CisKKyAgICAgICAgZm9yIHRvayBpbiBjaGFpbihbdG9rZW5dLCBpdGVyYWJsZSk6CiAgICAgICAgICAgICB0b2tudW0sIHRva3ZhbCA9IHRva1s6Ml0KIAogICAgICAgICAgICAgaWYgdG9rbnVtIGluIChOQU1FLCBOVU1CRVIpOgpAQCAtMjYzLDcgKzI2OSw3IEBACiAKIGRlZiBnZW5lcmF0ZV90b2tlbnMocmVhZGxpbmUpOgogICAgICIiIgotICAgIFRoZSBnZW5lcmF0ZV90b2tlbnMoKSBnZW5lcmF0b3IgcmVxdWlyZXMgb25lIGFyZ21lbnQsIHJlYWRsaW5lLCB3aGljaAorICAgIFRoZSBnZW5lcmF0ZV90b2tlbnMoKSBnZW5lcmF0b3IgcmVxdWlyZXMgb25lIGFyZ3VtZW50LCByZWFkbGluZSwgd2hpY2gKICAgICBtdXN0IGJlIGEgY2FsbGFibGUgb2JqZWN0IHdoaWNoIHByb3ZpZGVzIHRoZSBzYW1lIGludGVyZmFjZSBhcyB0aGUKICAgICByZWFkbGluZSgpIG1ldGhvZCBvZiBidWlsdC1pbiBmaWxlIG9iamVjdHMuIEVhY2ggY2FsbCB0byB0aGUgZnVuY3Rpb24KICAgICBzaG91bGQgcmV0dXJuIG9uZSBsaW5lIG9mIGlucHV0IGFzIGEgc3RyaW5nLiAgQWx0ZXJuYXRlbHksIHJlYWRsaW5lCkBAIC0zNjIsNiArMzY4LDggQEAKICAgICAgICAgICAgIGlmIHBzZXVkb21hdGNoOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzY2FuIGZvciB0b2tlbnMKICAgICAgICAgICAgICAgICBzdGFydCwgZW5kID0gcHNldWRvbWF0Y2guc3BhbigxKQogICAgICAgICAgICAgICAgIHNwb3MsIGVwb3MsIHBvcyA9IChsbnVtLCBzdGFydCksIChsbnVtLCBlbmQpLCBlbmQKKyAgICAgICAgICAgICAgICBpZiBzdGFydCA9PSBlbmQ6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgdG9rZW4sIGluaXRpYWwgPSBsaW5lW3N0YXJ0OmVuZF0sIGxpbmVbc3RhcnRdCiAKICAgICAgICAgICAgICAgICBpZiBpbml0aWFsIGluIG51bWNoYXJzIG9yIFwKZGlmZiAtLWdpdCBhL0xpYi90cmFjZS5weSBiL0xpYi90cmFjZS5weQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmRpZmYgLS1naXQgYS9MaWIvdHJhY2ViYWNrLnB5IGIvTGliL3RyYWNlYmFjay5weQppbmRleCA4Y2I5ZTI4Li4wYTNkZDExIDEwMDY0NAotLS0gYS9MaWIvdHJhY2ViYWNrLnB5CisrKyBiL0xpYi90cmFjZWJhY2sucHkKQEAgLTcyLDcgKzcyLDcgQEAKICAgICAgICAgbiA9IG4rMQogCiBkZWYgZm9ybWF0X3RiKHRiLCBsaW1pdCA9IE5vbmUpOgotICAgICIiIkEgc2hvcnRoYW5kIGZvciAnZm9ybWF0X2xpc3QoZXh0cmFjdF9zdGFjayhmLCBsaW1pdCkpLiIiIgorICAgICIiIkEgc2hvcnRoYW5kIGZvciAnZm9ybWF0X2xpc3QoZXh0cmFjdF90Yih0YiwgbGltaXQpKScuIiIiCiAgICAgcmV0dXJuIGZvcm1hdF9saXN0KGV4dHJhY3RfdGIodGIsIGxpbWl0KSkKIAogZGVmIGV4dHJhY3RfdGIodGIsIGxpbWl0ID0gTm9uZSk6CkBAIC0xNjYsNyArMTY2LDcgQEAKICAgICAjID4+PiByYWlzZSBzdHJpbmcxLCBzdHJpbmcyICAjIGRlcHJlY2F0ZWQKICAgICAjCiAgICAgIyBDbGVhciB0aGVzZSBvdXQgZmlyc3QgYmVjYXVzZSBpc3N1YnR5cGUoc3RyaW5nMSwgU3ludGF4RXJyb3IpCi0gICAgIyB3b3VsZCB0aHJvdyBhbm90aGVyIGV4Y2VwdGlvbiBhbmQgbWFzayB0aGUgb3JpZ2luYWwgcHJvYmxlbS4KKyAgICAjIHdvdWxkIHJhaXNlIGFub3RoZXIgZXhjZXB0aW9uIGFuZCBtYXNrIHRoZSBvcmlnaW5hbCBwcm9ibGVtLgogICAgIGlmIChpc2luc3RhbmNlKGV0eXBlLCBCYXNlRXhjZXB0aW9uKSBvcgogICAgICAgICBpc2luc3RhbmNlKGV0eXBlLCB0eXBlcy5JbnN0YW5jZVR5cGUpIG9yCiAgICAgICAgIGV0eXBlIGlzIE5vbmUgb3IgdHlwZShldHlwZSkgaXMgc3RyKToKQEAgLTE4OSwxMSArMTg5LDEyIEBACiAgICAgICAgIGlmIGJhZGxpbmUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoJyAgICAlc1xuJyAlIGJhZGxpbmUuc3RyaXAoKSkKICAgICAgICAgICAgIGlmIG9mZnNldCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICBjYXJldHNwYWNlID0gYmFkbGluZS5yc3RyaXAoJ1xuJylbOm9mZnNldF0ubHN0cmlwKCkKKyAgICAgICAgICAgICAgICBjYXJldHNwYWNlID0gYmFkbGluZS5yc3RyaXAoJ1xuJykKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBtaW4obGVuKGNhcmV0c3BhY2UpLCBvZmZzZXQpIC0gMQorICAgICAgICAgICAgICAgIGNhcmV0c3BhY2UgPSBjYXJldHNwYWNlWzpvZmZzZXRdLmxzdHJpcCgpCiAgICAgICAgICAgICAgICAgIyBub24tc3BhY2Ugd2hpdGVzcGFjZSAobGlrZXMgdGFicykgbXVzdCBiZSBrZXB0IGZvciBhbGlnbm1lbnQKICAgICAgICAgICAgICAgICBjYXJldHNwYWNlID0gKChjLmlzc3BhY2UoKSBhbmQgYyBvciAnICcpIGZvciBjIGluIGNhcmV0c3BhY2UpCi0gICAgICAgICAgICAgICAgIyBvbmx5IHRocmVlIHNwYWNlcyB0byBhY2NvdW50IGZvciBvZmZzZXQxID09IHBvcyAwCi0gICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKCcgICAlc15cbicgJSAnJy5qb2luKGNhcmV0c3BhY2UpKQorICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgnICAgICVzXlxuJyAlICcnLmpvaW4oY2FyZXRzcGFjZSkpCiAgICAgICAgIHZhbHVlID0gbXNnCiAKICAgICBsaW5lcy5hcHBlbmQoX2Zvcm1hdF9maW5hbF9leGNfbGluZShzdHlwZSwgdmFsdWUpKQpkaWZmIC0tZ2l0IGEvTGliL3VuaXR0ZXN0L19faW5pdF9fLnB5IGIvTGliL3VuaXR0ZXN0L19faW5pdF9fLnB5CmluZGV4IDIwMWEzZjAuLmE1ZDUwYWYgMTAwNjQ0Ci0tLSBhL0xpYi91bml0dGVzdC9fX2luaXRfXy5weQorKysgYi9MaWIvdW5pdHRlc3QvX19pbml0X18ucHkKQEAgLTExLDcgKzExLDcgQEAKIAogICAgIGltcG9ydCB1bml0dGVzdAogCi0gICAgY2xhc3MgSW50ZWdlckFyaXRobWVudGljVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGNsYXNzIEludGVnZXJBcml0aG1ldGljVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgICAgICBkZWYgdGVzdEFkZChzZWxmKTogICMjIHRlc3QgbWV0aG9kIG5hbWVzIGJlZ2luICd0ZXN0KicKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDEgKyAyKSwgMykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCArIDEsIDEpCmRpZmYgLS1naXQgYS9MaWIvdW5pdHRlc3QvY2FzZS5weSBiL0xpYi91bml0dGVzdC9jYXNlLnB5CmluZGV4IDRiMzgzOWUuLjY0NGZlNWIgMTAwNjQ0Ci0tLSBhL0xpYi91bml0dGVzdC9jYXNlLnB5CisrKyBiL0xpYi91bml0dGVzdC9jYXNlLnB5CkBAIC02LDYgKzYsNyBAQAogaW1wb3J0IGRpZmZsaWIKIGltcG9ydCBwcHJpbnQKIGltcG9ydCByZQoraW1wb3J0IHR5cGVzCiBpbXBvcnQgd2FybmluZ3MKIAogZnJvbSAuIGltcG9ydCByZXN1bHQKQEAgLTI1LDcgKzI2LDcgQEAKICAgICAiIiIKICAgICBSYWlzZSB0aGlzIGV4Y2VwdGlvbiBpbiBhIHRlc3QgdG8gc2tpcCBpdC4KIAotICAgIFVzdWFsbHkgeW91IGNhbiB1c2UgVGVzdFJlc3VsdC5za2lwKCkgb3Igb25lIG9mIHRoZSBza2lwcGluZyBkZWNvcmF0b3JzCisgICAgVXN1YWxseSB5b3UgY2FuIHVzZSBUZXN0Q2FzZS5za2lwVGVzdCgpIG9yIG9uZSBvZiB0aGUgc2tpcHBpbmcgZGVjb3JhdG9ycwogICAgIGluc3RlYWQgb2YgcmFpc2luZyB0aGlzIGRpcmVjdGx5LgogICAgICIiIgogICAgIHBhc3MKQEAgLTU1LDcgKzU2LDcgQEAKICAgICBVbmNvbmRpdGlvbmFsbHkgc2tpcCBhIHRlc3QuCiAgICAgIiIiCiAgICAgZGVmIGRlY29yYXRvcih0ZXN0X2l0ZW0pOgotICAgICAgICBpZiBub3QgKGlzaW5zdGFuY2UodGVzdF9pdGVtLCB0eXBlKSBhbmQgaXNzdWJjbGFzcyh0ZXN0X2l0ZW0sIFRlc3RDYXNlKSk6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHRlc3RfaXRlbSwgKHR5cGUsIHR5cGVzLkNsYXNzVHlwZSkpOgogICAgICAgICAgICAgQGZ1bmN0b29scy53cmFwcyh0ZXN0X2l0ZW0pCiAgICAgICAgICAgICBkZWYgc2tpcF93cmFwcGVyKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgICAgICAgcmFpc2UgU2tpcFRlc3QocmVhc29uKQpAQCAtMTIxLDggKzEyMiw2IEBACiAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogCiAgICAgICAgIGV4cGVjdGVkX3JlZ2V4cCA9IHNlbGYuZXhwZWN0ZWRfcmVnZXhwCi0gICAgICAgIGlmIGlzaW5zdGFuY2UoZXhwZWN0ZWRfcmVnZXhwLCBiYXNlc3RyaW5nKToKLSAgICAgICAgICAgIGV4cGVjdGVkX3JlZ2V4cCA9IHJlLmNvbXBpbGUoZXhwZWN0ZWRfcmVnZXhwKQogICAgICAgICBpZiBub3QgZXhwZWN0ZWRfcmVnZXhwLnNlYXJjaChzdHIoZXhjX3ZhbHVlKSk6CiAgICAgICAgICAgICByYWlzZSBzZWxmLmZhaWx1cmVFeGNlcHRpb24oJyIlcyIgZG9lcyBub3QgbWF0Y2ggIiVzIicgJQogICAgICAgICAgICAgICAgICAgICAgKGV4cGVjdGVkX3JlZ2V4cC5wYXR0ZXJuLCBzdHIoZXhjX3ZhbHVlKSkpCkBAIC0xNDksMjQgKzE0OCwyMyBAQAogICAgIHNob3VsZCBub3QgY2hhbmdlIHRoZSBzaWduYXR1cmUgb2YgdGhlaXIgX19pbml0X18gbWV0aG9kLCBzaW5jZSBpbnN0YW5jZXMKICAgICBvZiB0aGUgY2xhc3NlcyBhcmUgaW5zdGFudGlhdGVkIGF1dG9tYXRpY2FsbHkgYnkgcGFydHMgb2YgdGhlIGZyYW1ld29yawogICAgIGluIG9yZGVyIHRvIGJlIHJ1bi4KLSAgICAiIiIKIAotICAgICMgVGhpcyBhdHRyaWJ1dGUgZGV0ZXJtaW5lcyB3aGljaCBleGNlcHRpb24gd2lsbCBiZSByYWlzZWQgd2hlbgotICAgICMgdGhlIGluc3RhbmNlJ3MgYXNzZXJ0aW9uIG1ldGhvZHMgZmFpbDsgdGVzdCBtZXRob2RzIHJhaXNpbmcgdGhpcwotICAgICMgZXhjZXB0aW9uIHdpbGwgYmUgZGVlbWVkIHRvIGhhdmUgJ2ZhaWxlZCcgcmF0aGVyIHRoYW4gJ2Vycm9yZWQnCisgICAgV2hlbiBzdWJjbGFzc2luZyBUZXN0Q2FzZSwgeW91IGNhbiBzZXQgdGhlc2UgYXR0cmlidXRlczoKKyAgICAqIGZhaWx1cmVFeGNlcHRpb246IGRldGVybWluZXMgd2hpY2ggZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkIHdoZW4KKyAgICAgICAgdGhlIGluc3RhbmNlJ3MgYXNzZXJ0aW9uIG1ldGhvZHMgZmFpbDsgdGVzdCBtZXRob2RzIHJhaXNpbmcgdGhpcworICAgICAgICBleGNlcHRpb24gd2lsbCBiZSBkZWVtZWQgdG8gaGF2ZSAnZmFpbGVkJyByYXRoZXIgdGhhbiAnZXJyb3JlZCcuCisgICAgKiBsb25nTWVzc2FnZTogZGV0ZXJtaW5lcyB3aGV0aGVyIGxvbmcgbWVzc2FnZXMgKGluY2x1ZGluZyByZXByIG9mCisgICAgICAgIG9iamVjdHMgdXNlZCBpbiBhc3NlcnQgbWV0aG9kcykgd2lsbCBiZSBwcmludGVkIG9uIGZhaWx1cmUgaW4gKmFkZGl0aW9uKgorICAgICAgICB0byBhbnkgZXhwbGljaXQgbWVzc2FnZSBwYXNzZWQuCisgICAgKiBtYXhEaWZmOiBzZXRzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGRpZmYgaW4gZmFpbHVyZSBtZXNzYWdlcworICAgICAgICBieSBhc3NlcnQgbWV0aG9kcyB1c2luZyBkaWZmbGliLiBJdCBpcyBsb29rZWQgdXAgYXMgYW4gaW5zdGFuY2UKKyAgICAgICAgYXR0cmlidXRlIHNvIGNhbiBiZSBjb25maWd1cmVkIGJ5IGluZGl2aWR1YWwgdGVzdHMgaWYgcmVxdWlyZWQuCisgICAgIiIiCiAKICAgICBmYWlsdXJlRXhjZXB0aW9uID0gQXNzZXJ0aW9uRXJyb3IKIAotICAgICMgVGhpcyBhdHRyaWJ1dGUgZGV0ZXJtaW5lcyB3aGV0aGVyIGxvbmcgbWVzc2FnZXMgKGluY2x1ZGluZyByZXByIG9mCi0gICAgIyBvYmplY3RzIHVzZWQgaW4gYXNzZXJ0IG1ldGhvZHMpIHdpbGwgYmUgcHJpbnRlZCBvbiBmYWlsdXJlIGluICphZGRpdGlvbioKLSAgICAjIHRvIGFueSBleHBsaWNpdCBtZXNzYWdlIHBhc3NlZC4KLQogICAgIGxvbmdNZXNzYWdlID0gRmFsc2UKIAotICAgICMgVGhpcyBhdHRyaWJ1dGUgc2V0cyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBkaWZmIGluIGZhaWx1cmUgbWVzc2FnZXMKLSAgICAjIGJ5IGFzc2VydCBtZXRob2RzIHVzaW5nIGRpZmZsaWIuIEl0IGlzIGxvb2tlZCB1cCBhcyBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUKLSAgICAjIHNvIGNhbiBiZSBjb25maWd1cmVkIGJ5IGluZGl2aWR1YWwgdGVzdHMgaWYgcmVxdWlyZWQuCi0KICAgICBtYXhEaWZmID0gODAqOAogCiAgICAgIyBJZiBhIHN0cmluZyBpcyBsb25nZXIgdGhhbiBfZGlmZlRocmVzaG9sZCwgdXNlIG5vcm1hbCBjb21wYXJpc29uIGluc3RlYWQKQEAgLTIwMSw3ICsxOTksMTEgQEAKICAgICAgICAgc2VsZi5hZGRUeXBlRXF1YWxpdHlGdW5jKHR1cGxlLCAnYXNzZXJ0VHVwbGVFcXVhbCcpCiAgICAgICAgIHNlbGYuYWRkVHlwZUVxdWFsaXR5RnVuYyhzZXQsICdhc3NlcnRTZXRFcXVhbCcpCiAgICAgICAgIHNlbGYuYWRkVHlwZUVxdWFsaXR5RnVuYyhmcm96ZW5zZXQsICdhc3NlcnRTZXRFcXVhbCcpCi0gICAgICAgIHNlbGYuYWRkVHlwZUVxdWFsaXR5RnVuYyh1bmljb2RlLCAnYXNzZXJ0TXVsdGlMaW5lRXF1YWwnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFkZFR5cGVFcXVhbGl0eUZ1bmModW5pY29kZSwgJ2Fzc2VydE11bHRpTGluZUVxdWFsJykKKyAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgICAgICMgTm8gdW5pY29kZSBzdXBwb3J0IGluIHRoaXMgYnVpbGQKKyAgICAgICAgICAgIHBhc3MKIAogICAgIGRlZiBhZGRUeXBlRXF1YWxpdHlGdW5jKHNlbGYsIHR5cGVvYmosIGZ1bmN0aW9uKToKICAgICAgICAgIiIiQWRkIGEgdHlwZSBzcGVjaWZpYyBhc3NlcnRFcXVhbCBzdHlsZSBmdW5jdGlvbiB0byBjb21wYXJlIGEgdHlwZS4KQEAgLTQ0MiwxMCArNDQ0LDEwIEBACiAKIAogICAgIGRlZiBhc3NlcnRSYWlzZXMoc2VsZiwgZXhjQ2xhc3MsIGNhbGxhYmxlT2JqPU5vbmUsICphcmdzLCAqKmt3YXJncyk6Ci0gICAgICAgICIiIkZhaWwgdW5sZXNzIGFuIGV4Y2VwdGlvbiBvZiBjbGFzcyBleGNDbGFzcyBpcyB0aHJvd24KKyAgICAgICAgIiIiRmFpbCB1bmxlc3MgYW4gZXhjZXB0aW9uIG9mIGNsYXNzIGV4Y0NsYXNzIGlzIHJhaXNlZAogICAgICAgICAgICBieSBjYWxsYWJsZU9iaiB3aGVuIGludm9rZWQgd2l0aCBhcmd1bWVudHMgYXJncyBhbmQga2V5d29yZAogICAgICAgICAgICBhcmd1bWVudHMga3dhcmdzLiBJZiBhIGRpZmZlcmVudCB0eXBlIG9mIGV4Y2VwdGlvbiBpcwotICAgICAgICAgICB0aHJvd24sIGl0IHdpbGwgbm90IGJlIGNhdWdodCwgYW5kIHRoZSB0ZXN0IGNhc2Ugd2lsbCBiZQorICAgICAgICAgICByYWlzZWQsIGl0IHdpbGwgbm90IGJlIGNhdWdodCwgYW5kIHRoZSB0ZXN0IGNhc2Ugd2lsbCBiZQogICAgICAgICAgICBkZWVtZWQgdG8gaGF2ZSBzdWZmZXJlZCBhbiBlcnJvciwgZXhhY3RseSBhcyBmb3IgYW4KICAgICAgICAgICAgdW5leHBlY3RlZCBleGNlcHRpb24uCiAKQEAgLTUxMSw3ICs1MTMsNyBAQAogICAgICAgICBhc3NlcnRpb25fZnVuYyhmaXJzdCwgc2Vjb25kLCBtc2c9bXNnKQogCiAgICAgZGVmIGFzc2VydE5vdEVxdWFsKHNlbGYsIGZpcnN0LCBzZWNvbmQsIG1zZz1Ob25lKToKLSAgICAgICAgIiIiRmFpbCBpZiB0aGUgdHdvIG9iamVjdHMgYXJlIGVxdWFsIGFzIGRldGVybWluZWQgYnkgdGhlICc9PScKKyAgICAgICAgIiIiRmFpbCBpZiB0aGUgdHdvIG9iamVjdHMgYXJlIGVxdWFsIGFzIGRldGVybWluZWQgYnkgdGhlICchPScKICAgICAgICAgICAgb3BlcmF0b3IuCiAgICAgICAgICIiIgogICAgICAgICBpZiBub3QgZmlyc3QgIT0gc2Vjb25kOgpAQCAtODcxLDcgKzg3Myw3IEBACiAgICAgICAgICAgICAtIFswLCAxLCAxXSBhbmQgWzEsIDAsIDFdIGNvbXBhcmUgZXF1YWwuCiAgICAgICAgICAgICAtIFswLCAwLCAxXSBhbmQgWzAsIDFdIGNvbXBhcmUgdW5lcXVhbC4KICAgICAgICAgIiIiCi0gICAgICAgIGZpcnN0X3NlcSwgc2Vjb25kX3NlcSA9IGxpc3QoYWN0dWFsX3NlcSksIGxpc3QoZXhwZWN0ZWRfc2VxKQorICAgICAgICBmaXJzdF9zZXEsIHNlY29uZF9zZXEgPSBsaXN0KGV4cGVjdGVkX3NlcSksIGxpc3QoYWN0dWFsX3NlcSkKICAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgogICAgICAgICAgICAgaWYgc3lzLnB5M2t3YXJuaW5nOgogICAgICAgICAgICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcgcmFpc2VkIGR1cmluZyB0aGUgc29ydGluZwpAQCAtOTgyLDYgKzk4NCw4IEBACiAgICAgICAgICAgICBhcmdzOiBFeHRyYSBhcmdzLgogICAgICAgICAgICAga3dhcmdzOiBFeHRyYSBrd2FyZ3MuCiAgICAgICAgICIiIgorICAgICAgICBpZiBleHBlY3RlZF9yZWdleHAgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBleHBlY3RlZF9yZWdleHAgPSByZS5jb21waWxlKGV4cGVjdGVkX3JlZ2V4cCkKICAgICAgICAgY29udGV4dCA9IF9Bc3NlcnRSYWlzZXNDb250ZXh0KGV4cGVjdGVkX2V4Y2VwdGlvbiwgc2VsZiwgZXhwZWN0ZWRfcmVnZXhwKQogICAgICAgICBpZiBjYWxsYWJsZV9vYmogaXMgTm9uZToKICAgICAgICAgICAgIHJldHVybiBjb250ZXh0CmRpZmYgLS1naXQgYS9MaWIvdW5pdHRlc3QvbG9hZGVyLnB5IGIvTGliL3VuaXR0ZXN0L2xvYWRlci5weQppbmRleCBlODhmNTM2Li45MTYzYTFhIDEwMDY0NAotLS0gYS9MaWIvdW5pdHRlc3QvbG9hZGVyLnB5CisrKyBiL0xpYi91bml0dGVzdC9sb2FkZXIucHkKQEAgLTEwNiw3ICsxMDYsOSBAQAogICAgICAgICBlbGlmIChpc2luc3RhbmNlKG9iaiwgdHlwZXMuVW5ib3VuZE1ldGhvZFR5cGUpIGFuZAogICAgICAgICAgICAgICBpc2luc3RhbmNlKHBhcmVudCwgdHlwZSkgYW5kCiAgICAgICAgICAgICAgIGlzc3ViY2xhc3MocGFyZW50LCBjYXNlLlRlc3RDYXNlKSk6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5zdWl0ZUNsYXNzKFtwYXJlbnQob2JqLl9fbmFtZV9fKV0pCisgICAgICAgICAgICBuYW1lID0gcGFydHNbLTFdCisgICAgICAgICAgICBpbnN0ID0gcGFyZW50KG5hbWUpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5zdWl0ZUNsYXNzKFtpbnN0XSkKICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG9iaiwgc3VpdGUuVGVzdFN1aXRlKToKICAgICAgICAgICAgIHJldHVybiBvYmoKICAgICAgICAgZWxpZiBoYXNhdHRyKG9iaiwgJ19fY2FsbF9fJyk6CkBAIC0yNTQsOCArMjU2LDggQEAKICAgICAgICAgICAgICAgICAgICAgeWllbGQgX21ha2VfZmFpbGVkX2ltcG9ydF90ZXN0KG5hbWUsIHNlbGYuc3VpdGVDbGFzcykKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICBtb2RfZmlsZSA9IG9zLnBhdGguYWJzcGF0aChnZXRhdHRyKG1vZHVsZSwgJ19fZmlsZV9fJywgZnVsbF9wYXRoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhbHBhdGggPSBvcy5wYXRoLnNwbGl0ZXh0KG1vZF9maWxlKVswXQotICAgICAgICAgICAgICAgICAgICBmdWxscGF0aF9ub2V4dCA9IG9zLnBhdGguc3BsaXRleHQoZnVsbF9wYXRoKVswXQorICAgICAgICAgICAgICAgICAgICByZWFscGF0aCA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5yZWFscGF0aChtb2RfZmlsZSkpWzBdCisgICAgICAgICAgICAgICAgICAgIGZ1bGxwYXRoX25vZXh0ID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLnJlYWxwYXRoKGZ1bGxfcGF0aCkpWzBdCiAgICAgICAgICAgICAgICAgICAgIGlmIHJlYWxwYXRoLmxvd2VyKCkgIT0gZnVsbHBhdGhfbm9leHQubG93ZXIoKToKICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZV9kaXIgPSBvcy5wYXRoLmRpcm5hbWUocmVhbHBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICBtb2RfbmFtZSA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShmdWxsX3BhdGgpKVswXQpkaWZmIC0tZ2l0IGEvTGliL3VuaXR0ZXN0L21haW4ucHkgYi9MaWIvdW5pdHRlc3QvbWFpbi5weQppbmRleCAzMzk2YmIwLi5iMjUzNjc5IDEwMDY0NAotLS0gYS9MaWIvdW5pdHRlc3QvbWFpbi5weQorKysgYi9MaWIvdW5pdHRlc3QvbWFpbi5weQpAQCAtMTU3LDcgKzE1NywxMCBAQAogICAgICAgICAgICAgc2VsZi50ZXN0ID0gc2VsZi50ZXN0TG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lcyhzZWxmLnRlc3ROYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUpCiAKLSAgICBkZWYgX2RvX2Rpc2NvdmVyeShzZWxmLCBhcmd2LCBMb2FkZXI9bG9hZGVyLlRlc3RMb2FkZXIpOgorICAgIGRlZiBfZG9fZGlzY292ZXJ5KHNlbGYsIGFyZ3YsIExvYWRlcj1Ob25lKToKKyAgICAgICAgaWYgTG9hZGVyIGlzIE5vbmU6CisgICAgICAgICAgICBMb2FkZXIgPSBsYW1iZGE6IHNlbGYudGVzdExvYWRlcgorCiAgICAgICAgICMgaGFuZGxlIGNvbW1hbmQgbGluZSBhcmdzIGZvciB0ZXN0IGRpc2NvdmVyeQogICAgICAgICBzZWxmLnByb2dOYW1lID0gJyVzIGRpc2NvdmVyJyAlIHNlbGYucHJvZ05hbWUKICAgICAgICAgaW1wb3J0IG9wdHBhcnNlCmRpZmYgLS1naXQgYS9MaWIvdW5pdHRlc3QvcnVubmVyLnB5IGIvTGliL3VuaXR0ZXN0L3J1bm5lci5weQppbmRleCAxNzE2ODkxLi43NjMyZmU5IDEwMDY0NAotLS0gYS9MaWIvdW5pdHRlc3QvcnVubmVyLnB5CisrKyBiL0xpYi91bml0dGVzdC9ydW5uZXIucHkKQEAgLTM0LDcgKzM0LDcgQEAKICAgICBzZXBhcmF0b3IyID0gJy0nICogNzAKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGRlc2NyaXB0aW9ucywgdmVyYm9zaXR5KToKLSAgICAgICAgc3VwZXIoVGV4dFRlc3RSZXN1bHQsIHNlbGYpLl9faW5pdF9fKCkKKyAgICAgICAgc3VwZXIoVGV4dFRlc3RSZXN1bHQsIHNlbGYpLl9faW5pdF9fKHN0cmVhbSwgZGVzY3JpcHRpb25zLCB2ZXJib3NpdHkpCiAgICAgICAgIHNlbGYuc3RyZWFtID0gc3RyZWFtCiAgICAgICAgIHNlbGYuc2hvd0FsbCA9IHZlcmJvc2l0eSA+IDEKICAgICAgICAgc2VsZi5kb3RzID0gdmVyYm9zaXR5ID09IDEKZGlmZiAtLWdpdCBhL0xpYi91bml0dGVzdC9zaWduYWxzLnB5IGIvTGliL3VuaXR0ZXN0L3NpZ25hbHMucHkKaW5kZXggZmMzMTA0My4uZTZhNWZjNSAxMDA2NDQKLS0tIGEvTGliL3VuaXR0ZXN0L3NpZ25hbHMucHkKKysrIGIvTGliL3VuaXR0ZXN0L3NpZ25hbHMucHkKQEAgLTksNiArOSwyMCBAQAogY2xhc3MgX0ludGVycnVwdEhhbmRsZXIob2JqZWN0KToKICAgICBkZWYgX19pbml0X18oc2VsZiwgZGVmYXVsdF9oYW5kbGVyKToKICAgICAgICAgc2VsZi5jYWxsZWQgPSBGYWxzZQorICAgICAgICBzZWxmLm9yaWdpbmFsX2hhbmRsZXIgPSBkZWZhdWx0X2hhbmRsZXIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShkZWZhdWx0X2hhbmRsZXIsIGludCk6CisgICAgICAgICAgICBpZiBkZWZhdWx0X2hhbmRsZXIgPT0gc2lnbmFsLlNJR19ERkw6CisgICAgICAgICAgICAgICAgIyBQcmV0ZW5kIGl0J3Mgc2lnbmFsLmRlZmF1bHRfaW50X2hhbmRsZXIgaW5zdGVhZC4KKyAgICAgICAgICAgICAgICBkZWZhdWx0X2hhbmRsZXIgPSBzaWduYWwuZGVmYXVsdF9pbnRfaGFuZGxlcgorICAgICAgICAgICAgZWxpZiBkZWZhdWx0X2hhbmRsZXIgPT0gc2lnbmFsLlNJR19JR046CisgICAgICAgICAgICAgICAgIyBOb3QgcXVpdGUgdGhlIHNhbWUgdGhpbmcgYXMgU0lHX0lHTiwgYnV0IHRoZSBjbG9zZXN0IHdlCisgICAgICAgICAgICAgICAgIyBjYW4gbWFrZSBpdDogZG8gbm90aGluZy4KKyAgICAgICAgICAgICAgICBkZWYgZGVmYXVsdF9oYW5kbGVyKHVudXNlZF9zaWdudW0sIHVudXNlZF9mcmFtZSk6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJleHBlY3RlZCBTSUdJTlQgc2lnbmFsIGhhbmRsZXIgdG8gYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2lnbmFsLlNJR19JR04sIHNpZ25hbC5TSUdfREZMLCBvciBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbGxhYmxlIG9iamVjdCIpCiAgICAgICAgIHNlbGYuZGVmYXVsdF9oYW5kbGVyID0gZGVmYXVsdF9oYW5kbGVyCiAKICAgICBkZWYgX19jYWxsX18oc2VsZiwgc2lnbnVtLCBmcmFtZSk6CkBAIC01NCw0ICs2OCw0IEBACiAKICAgICBnbG9iYWwgX2ludGVycnVwdF9oYW5kbGVyCiAgICAgaWYgX2ludGVycnVwdF9oYW5kbGVyIGlzIG5vdCBOb25lOgotICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdJTlQsIF9pbnRlcnJ1cHRfaGFuZGxlci5kZWZhdWx0X2hhbmRsZXIpCisgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0lOVCwgX2ludGVycnVwdF9oYW5kbGVyLm9yaWdpbmFsX2hhbmRsZXIpCmRpZmYgLS1naXQgYS9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0X2Fzc2VydGlvbnMucHkgYi9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0X2Fzc2VydGlvbnMucHkKaW5kZXggZTFiYTYxNC4uZThmMGY2NCAxMDA2NDQKLS0tIGEvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdF9hc3NlcnRpb25zLnB5CisrKyBiL0xpYi91bml0dGVzdC90ZXN0L3Rlc3RfYXNzZXJ0aW9ucy5weQpAQCAtMzMsNiArMzMsMTAgQEAKICAgICAgICAgc2VsZi5hc3NlcnROb3RBbG1vc3RFcXVhbCgxLjEsIDEuMCwgZGVsdGE9MC4wNSkKICAgICAgICAgc2VsZi5hc3NlcnROb3RBbG1vc3RFcXVhbCgxLjAsIDEuMSwgZGVsdGE9MC4wNSkKIAorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKDEuMCwgMS4wLCBkZWx0YT0wLjUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnROb3RBbG1vc3RFcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wLCAxLjAsIGRlbHRhPTAuNSkKKwogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMSwgMS4wLCBkZWx0YT0wLjA1KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0Tm90QWxtb3N0RXF1YWwsCmRpZmYgLS1naXQgYS9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0X2JyZWFrLnB5IGIvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdF9icmVhay5weQppbmRleCA1NjAwMDExLi5kYWI5MWMxIDEwMDY0NAotLS0gYS9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0X2JyZWFrLnB5CisrKyBiL0xpYi91bml0dGVzdC90ZXN0L3Rlc3RfYnJlYWsucHkKQEAgLTE1LDkgKzE1LDEyIEBACiBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSA9PSAnZnJlZWJzZDYnLCAiVGVzdCBraWxscyByZWdydGVzdCBvbiBmcmVlYnNkNiAiCiAgICAgImlmIHRocmVhZHMgaGF2ZSBiZWVuIHVzZWQiKQogY2xhc3MgVGVzdEJyZWFrKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBpbnRfaGFuZGxlciA9IE5vbmUKIAogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc2VsZi5fZGVmYXVsdF9oYW5kbGVyID0gc2lnbmFsLmdldHNpZ25hbChzaWduYWwuU0lHSU5UKQorICAgICAgICBpZiBzZWxmLmludF9oYW5kbGVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHSU5ULCBzZWxmLmludF9oYW5kbGVyKQogCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdJTlQsIHNlbGYuX2RlZmF1bHRfaGFuZGxlcikKQEAgLTc0LDYgKzc3LDEwIEBACiAKIAogICAgIGRlZiB0ZXN0U2Vjb25kSW50ZXJydXB0KHNlbGYpOgorICAgICAgICAjIENhbid0IHVzZSBza2lwSWYgZGVjb3JhdG9yIGJlY2F1c2UgdGhlIHNpZ25hbCBoYW5kbGVyIG1heSBoYXZlCisgICAgICAgICMgYmVlbiBjaGFuZ2VkIGFmdGVyIGRlZmluaW5nIHRoaXMgbWV0aG9kLgorICAgICAgICBpZiBzaWduYWwuZ2V0c2lnbmFsKHNpZ25hbC5TSUdJTlQpID09IHNpZ25hbC5TSUdfSUdOOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgidGVzdCByZXF1aXJlcyBTSUdJTlQgdG8gbm90IGJlIGlnbm9yZWQiKQogICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKICAgICAgICAgdW5pdHRlc3QuaW5zdGFsbEhhbmRsZXIoKQogICAgICAgICB1bml0dGVzdC5yZWdpc3RlclJlc3VsdChyZXN1bHQpCkBAIC0xMjMsNiArMTMwLDEwIEBACiAKIAogICAgIGRlZiB0ZXN0SGFuZGxlclJlcGxhY2VkQnV0Q2FsbGVkKHNlbGYpOgorICAgICAgICAjIENhbid0IHVzZSBza2lwSWYgZGVjb3JhdG9yIGJlY2F1c2UgdGhlIHNpZ25hbCBoYW5kbGVyIG1heSBoYXZlCisgICAgICAgICMgYmVlbiBjaGFuZ2VkIGFmdGVyIGRlZmluaW5nIHRoaXMgbWV0aG9kLgorICAgICAgICBpZiBzaWduYWwuZ2V0c2lnbmFsKHNpZ25hbC5TSUdJTlQpID09IHNpZ25hbC5TSUdfSUdOOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgidGVzdCByZXF1aXJlcyBTSUdJTlQgdG8gbm90IGJlIGlnbm9yZWQiKQogICAgICAgICAjIElmIG91ciBoYW5kbGVyIGhhcyBiZWVuIHJlcGxhY2VkIChpcyBubyBsb25nZXIgaW5zdGFsbGVkKSBidXQgaXMKICAgICAgICAgIyBjYWxsZWQgYnkgdGhlICpuZXcqIGhhbmRsZXIsIHRoZW4gaXQgaXNuJ3Qgc2FmZSB0byBkZWxheSB0aGUKICAgICAgICAgIyBTSUdJTlQgYW5kIHdlIHNob3VsZCBpbW1lZGlhdGVseSBkZWxlZ2F0ZSB0byB0aGUgZGVmYXVsdCBoYW5kbGVyCkBAIC0yNTAsMyArMjYxLDI0IEBACiAKICAgICAgICAgdGVzdCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2lnbmFsLmdldHNpZ25hbChzaWduYWwuU0lHSU5UKSwgZGVmYXVsdF9oYW5kbGVyKQorCitAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAna2lsbCcpLCAiVGVzdCByZXF1aXJlcyBvcy5raWxsIikKK0B1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09IndpbjMyIiwgIlRlc3QgY2Fubm90IHJ1biBvbiBXaW5kb3dzIikKK0B1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09ICdmcmVlYnNkNicsICJUZXN0IGtpbGxzIHJlZ3J0ZXN0IG9uIGZyZWVic2Q2ICIKKyAgICAiaWYgdGhyZWFkcyBoYXZlIGJlZW4gdXNlZCIpCitjbGFzcyBUZXN0QnJlYWtEZWZhdWx0SW50SGFuZGxlcihUZXN0QnJlYWspOgorICAgIGludF9oYW5kbGVyID0gc2lnbmFsLmRlZmF1bHRfaW50X2hhbmRsZXIKKworQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2tpbGwnKSwgIlRlc3QgcmVxdWlyZXMgb3Mua2lsbCIpCitAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSA9PSJ3aW4zMiIsICJUZXN0IGNhbm5vdCBydW4gb24gV2luZG93cyIpCitAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSA9PSAnZnJlZWJzZDYnLCAiVGVzdCBraWxscyByZWdydGVzdCBvbiBmcmVlYnNkNiAiCisgICAgImlmIHRocmVhZHMgaGF2ZSBiZWVuIHVzZWQiKQorY2xhc3MgVGVzdEJyZWFrU2lnbmFsSWdub3JlZChUZXN0QnJlYWspOgorICAgIGludF9oYW5kbGVyID0gc2lnbmFsLlNJR19JR04KKworQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2tpbGwnKSwgIlRlc3QgcmVxdWlyZXMgb3Mua2lsbCIpCitAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSA9PSJ3aW4zMiIsICJUZXN0IGNhbm5vdCBydW4gb24gV2luZG93cyIpCitAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSA9PSAnZnJlZWJzZDYnLCAiVGVzdCBraWxscyByZWdydGVzdCBvbiBmcmVlYnNkNiAiCisgICAgImlmIHRocmVhZHMgaGF2ZSBiZWVuIHVzZWQiKQorY2xhc3MgVGVzdEJyZWFrU2lnbmFsRGVmYXVsdChUZXN0QnJlYWspOgorICAgIGludF9oYW5kbGVyID0gc2lnbmFsLlNJR19ERkwKZGlmZiAtLWdpdCBhL0xpYi91bml0dGVzdC90ZXN0L3Rlc3RfY2FzZS5weSBiL0xpYi91bml0dGVzdC90ZXN0L3Rlc3RfY2FzZS5weQppbmRleCBlOTJiMDE5Li5iNjlmZGIzIDEwMDY0NAotLS0gYS9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0X2Nhc2UucHkKKysrIGIvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdF9jYXNlLnB5CkBAIC0yOTMsNyArMjkzLDcgQEAKICAgICAgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgogICAgICAgICAgICAgICAgIHBhc3MKIAotICAgICAgICBzZWxmLmFzc2VydFRydWUoRm9vKCd0ZXN0JykuZmFpbHVyZUV4Y2VwdGlvbiBpcyBBc3NlcnRpb25FcnJvcikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhGb28oJ3Rlc3QnKS5mYWlsdXJlRXhjZXB0aW9uLCBBc3NlcnRpb25FcnJvcikKIAogICAgICMgIlRoaXMgY2xhc3MgYXR0cmlidXRlIGdpdmVzIHRoZSBleGNlcHRpb24gcmFpc2VkIGJ5IHRoZSB0ZXN0KCkgbWV0aG9kLgogICAgICMgSWYgYSB0ZXN0IGZyYW1ld29yayBuZWVkcyB0byB1c2UgYSBzcGVjaWFsaXplZCBleGNlcHRpb24sIHBvc3NpYmx5IHRvCkBAIC0zMTEsNyArMzExLDcgQEAKIAogICAgICAgICAgICAgZmFpbHVyZUV4Y2VwdGlvbiA9IFJ1bnRpbWVFcnJvcgogCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShGb28oJ3Rlc3QnKS5mYWlsdXJlRXhjZXB0aW9uIGlzIFJ1bnRpbWVFcnJvcikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhGb28oJ3Rlc3QnKS5mYWlsdXJlRXhjZXB0aW9uLCBSdW50aW1lRXJyb3IpCiAKIAogICAgICAgICBGb28oJ3Rlc3QnKS5ydW4ocmVzdWx0KQpAQCAtMzM0LDcgKzMzNCw3IEBACiAKICAgICAgICAgICAgIGZhaWx1cmVFeGNlcHRpb24gPSBSdW50aW1lRXJyb3IKIAotICAgICAgICBzZWxmLmFzc2VydFRydWUoRm9vKCd0ZXN0JykuZmFpbHVyZUV4Y2VwdGlvbiBpcyBSdW50aW1lRXJyb3IpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoRm9vKCd0ZXN0JykuZmFpbHVyZUV4Y2VwdGlvbiwgUnVudGltZUVycm9yKQogCiAKICAgICAgICAgRm9vKCd0ZXN0JykucnVuKHJlc3VsdCkKQEAgLTYwNyw3ICs2MDcsNyBAQAogICAgICAgICAgICAgbXNnID0gZS5hcmdzWzBdCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwoJ2Fzc2VydFNlcXVlbmNlRXF1YWwgZGlkIG5vdCBmYWlsLicpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4obXNnKSA8IGxlbihkaWZmKSkKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzKGxlbihtc2cpLCBsZW4oZGlmZikpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4ob21pdHRlZCwgbXNnKQogCiAgICAgICAgIHNlbGYubWF4RGlmZiA9IGxlbihkaWZmKSAqIDIKQEAgLTYxNyw3ICs2MTcsNyBAQAogICAgICAgICAgICAgbXNnID0gZS5hcmdzWzBdCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwoJ2Fzc2VydFNlcXVlbmNlRXF1YWwgZGlkIG5vdCBmYWlsLicpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4obXNnKSA+IGxlbihkaWZmKSkKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKGxlbihtc2cpLCBsZW4oZGlmZikpCiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4ob21pdHRlZCwgbXNnKQogCiAgICAgICAgIHNlbGYubWF4RGlmZiA9IE5vbmUKQEAgLTYyNyw3ICs2MjcsNyBAQAogICAgICAgICAgICAgbXNnID0gZS5hcmdzWzBdCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwoJ2Fzc2VydFNlcXVlbmNlRXF1YWwgZGlkIG5vdCBmYWlsLicpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4obXNnKSA+IGxlbihkaWZmKSkKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKGxlbihtc2cpLCBsZW4oZGlmZikpCiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4ob21pdHRlZCwgbXNnKQogCiAgICAgZGVmIHRlc3RUcnVuY2F0ZU1lc3NhZ2Uoc2VsZik6CkBAIC05NzksNiArOTc5LDEyIEBACiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAsIEV4Y2VwdGlvbiwgdSd4JywKICAgICAgICAgICAgICAgICBsYW1iZGE6IE5vbmUpCiAKKyAgICBkZWYgdGVzdEFzc2VydFJhaXNlc1JlZ2V4cEludmFsaWRSZWdleHAoc2VsZik6CisgICAgICAgICMgSXNzdWUgMjAxNDUuCisgICAgICAgIGNsYXNzIE15RXhjKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAsIE15RXhjLCBsYW1iZGE6IFRydWUpCisKICAgICBkZWYgdGVzdEFzc2VydFJhaXNlc1JlZ2V4cE1pc21hdGNoKHNlbGYpOgogICAgICAgICBkZWYgU3R1YigpOgogICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdVbmV4cGVjdGVkJykKZGlmZiAtLWdpdCBhL0xpYi91bml0dGVzdC90ZXN0L3Rlc3RfZGlzY292ZXJ5LnB5IGIvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdF9kaXNjb3ZlcnkucHkKaW5kZXggMTE1NWRlMS4uZTAyNzdkNSAxMDA2NDQKLS0tIGEvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdF9kaXNjb3ZlcnkucHkKKysrIGIvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdF9kaXNjb3ZlcnkucHkKQEAgLTIyMCwxMiArMjIwLDI2IEBACiAKICAgICAgICAgcHJvZ3JhbSA9IG9iamVjdC5fX25ld19fKHVuaXR0ZXN0LlRlc3RQcm9ncmFtKQogICAgICAgICBwcm9ncmFtLnVzYWdlRXhpdCA9IHVzYWdlRXhpdAorICAgICAgICBwcm9ncmFtLnRlc3RMb2FkZXIgPSBOb25lCiAKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhTdG9wKToKICAgICAgICAgICAgICMgdG9vIG1hbnkgYXJncwogICAgICAgICAgICAgcHJvZ3JhbS5fZG9fZGlzY292ZXJ5KFsnb25lJywgJ3R3bycsICd0aHJlZScsICdmb3VyJ10pCiAKIAorICAgIGRlZiB0ZXN0X2NvbW1hbmRfbGluZV9oYW5kbGluZ19kb19kaXNjb3ZlcnlfdXNlc19kZWZhdWx0X2xvYWRlcihzZWxmKToKKyAgICAgICAgcHJvZ3JhbSA9IG9iamVjdC5fX25ld19fKHVuaXR0ZXN0LlRlc3RQcm9ncmFtKQorCisgICAgICAgIGNsYXNzIExvYWRlcihvYmplY3QpOgorICAgICAgICAgICAgYXJncyA9IFtdCisgICAgICAgICAgICBkZWYgZGlzY292ZXIoc2VsZiwgc3RhcnRfZGlyLCBwYXR0ZXJuLCB0b3BfbGV2ZWxfZGlyKToKKyAgICAgICAgICAgICAgICBzZWxmLmFyZ3MuYXBwZW5kKChzdGFydF9kaXIsIHBhdHRlcm4sIHRvcF9sZXZlbF9kaXIpKQorICAgICAgICAgICAgICAgIHJldHVybiAndGVzdHMnCisKKyAgICAgICAgcHJvZ3JhbS50ZXN0TG9hZGVyID0gTG9hZGVyKCkKKyAgICAgICAgcHJvZ3JhbS5fZG9fZGlzY292ZXJ5KFsnLXYnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMb2FkZXIuYXJncywgWygnLicsICd0ZXN0Ki5weScsIE5vbmUpXSkKKwogICAgIGRlZiB0ZXN0X2NvbW1hbmRfbGluZV9oYW5kbGluZ19kb19kaXNjb3ZlcnlfY2FsbHNfbG9hZGVyKHNlbGYpOgogICAgICAgICBwcm9ncmFtID0gb2JqZWN0Ll9fbmV3X18odW5pdHRlc3QuVGVzdFByb2dyYW0pCiAKQEAgLTMwMCw3ICszMTQsNyBAQAogICAgICAgICBzZWxmLmFzc2VydFRydWUocHJvZ3JhbS5mYWlsZmFzdCkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb2dyYW0uY2F0Y2hicmVhaykKIAotICAgIGRlZiB0ZXN0X2RldGVjdF9tb2R1bGVfY2xhc2goc2VsZik6CisgICAgZGVmIHNldHVwX21vZHVsZV9jbGFzaChzZWxmKToKICAgICAgICAgY2xhc3MgTW9kdWxlKG9iamVjdCk6CiAgICAgICAgICAgICBfX2ZpbGVfXyA9ICdiYXIvZm9vLnB5JwogICAgICAgICBzeXMubW9kdWxlc1snZm9vJ10gPSBNb2R1bGUKQEAgLTMyNyw3ICszNDEsMTAgQEAKICAgICAgICAgb3MubGlzdGRpciA9IGxpc3RkaXIKICAgICAgICAgb3MucGF0aC5pc2ZpbGUgPSBpc2ZpbGUKICAgICAgICAgb3MucGF0aC5pc2RpciA9IGlzZGlyCisgICAgICAgIHJldHVybiBmdWxsX3BhdGgKIAorICAgIGRlZiB0ZXN0X2RldGVjdF9tb2R1bGVfY2xhc2goc2VsZik6CisgICAgICAgIGZ1bGxfcGF0aCA9IHNlbGYuc2V0dXBfbW9kdWxlX2NsYXNoKCkKICAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCiAKICAgICAgICAgbW9kX2RpciA9IG9zLnBhdGguYWJzcGF0aCgnYmFyJykKQEAgLTM0MCw2ICszNTcsMjUgQEAKICAgICAgICAgKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5wYXRoWzBdLCBmdWxsX3BhdGgpCiAKKyAgICBkZWYgdGVzdF9tb2R1bGVfc3ltbGlua19vayhzZWxmKToKKyAgICAgICAgZnVsbF9wYXRoID0gc2VsZi5zZXR1cF9tb2R1bGVfY2xhc2goKQorCisgICAgICAgIG9yaWdpbmFsX3JlYWxwYXRoID0gb3MucGF0aC5yZWFscGF0aAorCisgICAgICAgIG1vZF9kaXIgPSBvcy5wYXRoLmFic3BhdGgoJ2JhcicpCisgICAgICAgIGV4cGVjdGVkX2RpciA9IG9zLnBhdGguYWJzcGF0aCgnZm9vJykKKworICAgICAgICBkZWYgY2xlYW51cCgpOgorICAgICAgICAgICAgb3MucGF0aC5yZWFscGF0aCA9IG9yaWdpbmFsX3JlYWxwYXRoCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChjbGVhbnVwKQorCisgICAgICAgIGRlZiByZWFscGF0aChwYXRoKToKKyAgICAgICAgICAgIGlmIHBhdGggPT0gb3MucGF0aC5qb2luKG1vZF9kaXIsICdmb28ucHknKToKKyAgICAgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKGV4cGVjdGVkX2RpciwgJ2Zvby5weScpCisgICAgICAgICAgICByZXR1cm4gcGF0aAorICAgICAgICBvcy5wYXRoLnJlYWxwYXRoID0gcmVhbHBhdGgKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIGxvYWRlci5kaXNjb3ZlcihzdGFydF9kaXI9J2ZvbycsIHBhdHRlcm49J2Zvby5weScpCiAKICAgICBkZWYgdGVzdF9kaXNjb3ZlcnlfZnJvbV9kb3R0ZWRfcGF0aChzZWxmKToKICAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCmRpZmYgLS1naXQgYS9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0X2xvYWRlci5weSBiL0xpYi91bml0dGVzdC90ZXN0L3Rlc3RfbG9hZGVyLnB5CmluZGV4IDM1NDRhMjAuLjY4ZTg3MWMgMTAwNjQ0Ci0tLSBhL0xpYi91bml0dGVzdC90ZXN0L3Rlc3RfbG9hZGVyLnB5CisrKyBiL0xpYi91bml0dGVzdC90ZXN0L3Rlc3RfbG9hZGVyLnB5CkBAIC0zMjQsNyArMzI0LDcgQEAKICAgICAjIERvZXMgbG9hZFRlc3RzRnJvbU5hbWUgcmFpc2UgVHlwZUVycm9yIHdoZW4gdGhlIGBtb2R1bGVgIGFyZ3VtZW50CiAgICAgIyBpc24ndCBhIG1vZHVsZSBvYmplY3Q/CiAgICAgIwotICAgICMgWFhYIEFjY2VwdHMgdGhlIG5vdC1hLW1vZHVsZSBvYmplY3QsIGlnbm9ybmluZyB0aGUgb2JqZWN0J3MgdHlwZQorICAgICMgWFhYIEFjY2VwdHMgdGhlIG5vdC1hLW1vZHVsZSBvYmplY3QsIGlnbm9yaW5nIHRoZSBvYmplY3QncyB0eXBlCiAgICAgIyBUaGlzIHNob3VsZCByYWlzZSBhbiBleGNlcHRpb24gb3IgdGhlIG1ldGhvZCBuYW1lIHNob3VsZCBiZSBjaGFuZ2VkCiAgICAgIwogICAgICMgWFhYIFNvbWUgcGVvcGxlIGFyZSByZWx5aW5nIG9uIHRoaXMsIHNvIGtlZXAgaXQgZm9yIG5vdwpAQCAtMTI3OSw4ICsxMjc5LDIzIEBACiAgICAgIyAiVGhlIGRlZmF1bHQgdmFsdWUgaXMgdGhlIFRlc3RTdWl0ZSBjbGFzcyIKICAgICBkZWYgdGVzdF9zdWl0ZUNsYXNzX19kZWZhdWx0X3ZhbHVlKHNlbGYpOgogICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxvYWRlci5zdWl0ZUNsYXNzIGlzIHVuaXR0ZXN0LlRlc3RTdWl0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhsb2FkZXIuc3VpdGVDbGFzcywgdW5pdHRlc3QuVGVzdFN1aXRlKQogCisgICAgIyBNYWtlIHN1cmUgdGhlIGRvdHRlZCBuYW1lIHJlc29sdXRpb24gd29ya3MgZXZlbiBpZiB0aGUgYWN0dWFsCisgICAgIyBmdW5jdGlvbiBkb2Vzbid0IGhhdmUgdGhlIHNhbWUgbmFtZSBhcyBpcyB1c2VkIHRvIGZpbmQgaXQuCisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU5hbWVfX2Z1bmN0aW9uX3dpdGhfZGlmZmVyZW50X25hbWVfdGhhbl9tZXRob2Qoc2VsZik6CisgICAgICAgICMgbGFtYmRhcyBoYXZlIHRoZSBuYW1lICc8bGFtYmRhPicuCisgICAgICAgIG0gPSB0eXBlcy5Nb2R1bGVUeXBlKCdtJykKKyAgICAgICAgY2xhc3MgTXlUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICB0ZXN0ID0gbGFtYmRhOiAxCisgICAgICAgIG0udGVzdGNhc2VfMSA9IE15VGVzdENhc2UKKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgc3VpdGUgPSBsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWVzKFsndGVzdGNhc2VfMS50ZXN0J10sIG0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdWl0ZSwgbG9hZGVyLnN1aXRlQ2xhc3MpCisKKyAgICAgICAgcmVmX3N1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKFtNeVRlc3RDYXNlKCd0ZXN0JyldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc3VpdGUpLCBbcmVmX3N1aXRlXSkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi91bml0dGVzdC90ZXN0L3Rlc3RfcmVzdWx0LnB5IGIvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdF9yZXN1bHQucHkKaW5kZXggZWI2OGMxZC4uMmE1OTZjZCAxMDA2NDQKLS0tIGEvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdF9yZXN1bHQucHkKKysrIGIvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdF9yZXN1bHQucHkKQEAgLTE3Niw3ICsxNzYsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5zaG91bGRTdG9wLCBGYWxzZSkKIAogICAgICAgICB0ZXN0X2Nhc2UsIGZvcm1hdHRlZF9leGMgPSByZXN1bHQuZmFpbHVyZXNbMF0KLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRlc3RfY2FzZSBpcyB0ZXN0KQorICAgICAgICBzZWxmLmFzc2VydElzKHRlc3RfY2FzZSwgdGVzdCkKICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGZvcm1hdHRlZF9leGMsIHN0cikKIAogICAgICMgImFkZEVycm9yKHRlc3QsIGVycikiCkBAIC0yMjQsNyArMjI0LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuc2hvdWxkU3RvcCwgRmFsc2UpCiAKICAgICAgICAgdGVzdF9jYXNlLCBmb3JtYXR0ZWRfZXhjID0gcmVzdWx0LmVycm9yc1swXQotICAgICAgICBzZWxmLmFzc2VydFRydWUodGVzdF9jYXNlIGlzIHRlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModGVzdF9jYXNlLCB0ZXN0KQogICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZm9ybWF0dGVkX2V4Yywgc3RyKQogCiAgICAgZGVmIHRlc3RHZXREZXNjcmlwdGlvbldpdGhvdXREb2NzdHJpbmcoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0X3J1bm5lci5weSBiL0xpYi91bml0dGVzdC90ZXN0L3Rlc3RfcnVubmVyLnB5CmluZGV4IDZkZjZhOWMuLjNiNjYxZDMgMTAwNjQ0Ci0tLSBhL0xpYi91bml0dGVzdC90ZXN0L3Rlc3RfcnVubmVyLnB5CisrKyBiL0xpYi91bml0dGVzdC90ZXN0L3Rlc3RfcnVubmVyLnB5CkBAIC0xNDksNiArMTQ5LDE5IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnVubmVyLnJlc3VsdGNsYXNzLCB1bml0dGVzdC5UZXh0VGVzdFJlc3VsdCkKIAogCisgICAgZGVmIHRlc3RfbXVsdGlwbGVfaW5oZXJpdGFuY2Uoc2VsZik6CisgICAgICAgIGNsYXNzIEFSZXN1bHQodW5pdHRlc3QuVGVzdFJlc3VsdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBkZXNjcmlwdGlvbnMsIHZlcmJvc2l0eSk6CisgICAgICAgICAgICAgICAgc3VwZXIoQVJlc3VsdCwgc2VsZikuX19pbml0X18oc3RyZWFtLCBkZXNjcmlwdGlvbnMsIHZlcmJvc2l0eSkKKworICAgICAgICBjbGFzcyBBVGV4dFJlc3VsdCh1bml0dGVzdC5UZXh0VGVzdFJlc3VsdCwgQVJlc3VsdCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgIyBUaGlzIHVzZWQgdG8gcmFpc2UgYW4gZXhjZXB0aW9uIGR1ZSB0byBUZXh0VGVzdFJlc3VsdCBub3QgcGFzc2luZworICAgICAgICAjIG9uIGFyZ3VtZW50cyBpbiBpdHMgX19pbml0X18gc3VwZXIgY2FsbAorICAgICAgICBBVGV4dFJlc3VsdChOb25lLCBOb25lLCAxKQorCisKICAgICBkZWYgdGVzdEJ1ZmZlckFuZEZhaWxmYXN0KHNlbGYpOgogICAgICAgICBjbGFzcyBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAgICAgICAgIGRlZiB0ZXN0Rm9vKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdF9za2lwcGluZy5weSBiL0xpYi91bml0dGVzdC90ZXN0L3Rlc3Rfc2tpcHBpbmcucHkKaW5kZXggMDU5NThkNi4uZDY2MzlkMSAxMDA2NDQKLS0tIGEvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdF9za2lwcGluZy5weQorKysgYi9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0X3NraXBwaW5nLnB5CkBAIC02Niw2ICs2NiwzNiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5za2lwcGVkLCBbKHRlc3QsICJ0ZXN0aW5nIildKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlY29yZCwgW10pCiAKKyAgICBkZWYgdGVzdF9za2lwX25vbl91bml0dGVzdF9jbGFzc19vbGRfc3R5bGUoc2VsZik6CisgICAgICAgIEB1bml0dGVzdC5za2lwKCJ0ZXN0aW5nIikKKyAgICAgICAgY2xhc3MgTWl4aW46CisgICAgICAgICAgICBkZWYgdGVzdF8xKHNlbGYpOgorICAgICAgICAgICAgICAgIHJlY29yZC5hcHBlbmQoMSkKKyAgICAgICAgY2xhc3MgRm9vKE1peGluLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHJlY29yZCA9IFtdCisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorICAgICAgICB0ZXN0ID0gRm9vKCJ0ZXN0XzEiKQorICAgICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZShbdGVzdF0pCisgICAgICAgIHN1aXRlLnJ1bihyZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnNraXBwZWQsIFsodGVzdCwgInRlc3RpbmciKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVjb3JkLCBbXSkKKworICAgIGRlZiB0ZXN0X3NraXBfbm9uX3VuaXR0ZXN0X2NsYXNzX25ld19zdHlsZShzZWxmKToKKyAgICAgICAgQHVuaXR0ZXN0LnNraXAoInRlc3RpbmciKQorICAgICAgICBjbGFzcyBNaXhpbihvYmplY3QpOgorICAgICAgICAgICAgZGVmIHRlc3RfMShzZWxmKToKKyAgICAgICAgICAgICAgICByZWNvcmQuYXBwZW5kKDEpCisgICAgICAgIGNsYXNzIEZvbyhNaXhpbiwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgcGFzcworICAgICAgICByZWNvcmQgPSBbXQorICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKyAgICAgICAgdGVzdCA9IEZvbygidGVzdF8xIikKKyAgICAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoW3Rlc3RdKQorICAgICAgICBzdWl0ZS5ydW4ocmVzdWx0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5za2lwcGVkLCBbKHRlc3QsICJ0ZXN0aW5nIildKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlY29yZCwgW10pCisKICAgICBkZWYgdGVzdF9leHBlY3RlZF9mYWlsdXJlKHNlbGYpOgogICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgogICAgICAgICAgICAgQHVuaXR0ZXN0LmV4cGVjdGVkRmFpbHVyZQpkaWZmIC0tZ2l0IGEvTGliL3VybGxpYi5weSBiL0xpYi91cmxsaWIucHkKaW5kZXggMDQzMmNjYy4uYWM1ZDc5NyAxMDA2NDQKLS0tIGEvTGliL3VybGxpYi5weQorKysgYi9MaWIvdXJsbGliLnB5CkBAIC0yNyw2ICsyNyw5IEBACiBpbXBvcnQgb3MKIGltcG9ydCB0aW1lCiBpbXBvcnQgc3lzCitpbXBvcnQgYmFzZTY0CitpbXBvcnQgcmUKKwogZnJvbSB1cmxwYXJzZSBpbXBvcnQgdXJsam9pbiBhcyBiYXNlam9pbgogCiBfX2FsbF9fID0gWyJ1cmxvcGVuIiwgIlVSTG9wZW5lciIsICJGYW5jeVVSTG9wZW5lciIsICJ1cmxyZXRyaWV2ZSIsCkBAIC0zMTgsMTMgKzMyMSwxMyBAQAogICAgICAgICBpZiBub3QgaG9zdDogcmFpc2UgSU9FcnJvciwgKCdodHRwIGVycm9yJywgJ25vIGhvc3QgZ2l2ZW4nKQogCiAgICAgICAgIGlmIHByb3h5X3Bhc3N3ZDoKLSAgICAgICAgICAgIGltcG9ydCBiYXNlNjQKKyAgICAgICAgICAgIHByb3h5X3Bhc3N3ZCA9IHVucXVvdGUocHJveHlfcGFzc3dkKQogICAgICAgICAgICAgcHJveHlfYXV0aCA9IGJhc2U2NC5iNjRlbmNvZGUocHJveHlfcGFzc3dkKS5zdHJpcCgpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBwcm94eV9hdXRoID0gTm9uZQogCiAgICAgICAgIGlmIHVzZXJfcGFzc3dkOgotICAgICAgICAgICAgaW1wb3J0IGJhc2U2NAorICAgICAgICAgICAgdXNlcl9wYXNzd2QgPSB1bnF1b3RlKHVzZXJfcGFzc3dkKQogICAgICAgICAgICAgYXV0aCA9IGJhc2U2NC5iNjRlbmNvZGUodXNlcl9wYXNzd2QpLnN0cmlwKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGF1dGggPSBOb25lCkBAIC0zNzQsNyArMzc3LDYgQEAKIAogICAgIGRlZiBodHRwX2Vycm9yX2RlZmF1bHQoc2VsZiwgdXJsLCBmcCwgZXJyY29kZSwgZXJybXNnLCBoZWFkZXJzKToKICAgICAgICAgIiIiRGVmYXVsdCBlcnJvciBoYW5kbGVyOiBjbG9zZSB0aGUgY29ubmVjdGlvbiBhbmQgcmFpc2UgSU9FcnJvci4iIiIKLSAgICAgICAgdm9pZCA9IGZwLnJlYWQoKQogICAgICAgICBmcC5jbG9zZSgpCiAgICAgICAgIHJhaXNlIElPRXJyb3IsICgnaHR0cCBlcnJvcicsIGVycmNvZGUsIGVycm1zZywgaGVhZGVycykKIApAQCAtNDA5LDEyICs0MTEsMTIgQEAKICAgICAgICAgICAgICAgICAjcHJpbnQgInByb3h5IHZpYSBodHRwczoiLCBob3N0LCBzZWxlY3RvcgogICAgICAgICAgICAgaWYgbm90IGhvc3Q6IHJhaXNlIElPRXJyb3IsICgnaHR0cHMgZXJyb3InLCAnbm8gaG9zdCBnaXZlbicpCiAgICAgICAgICAgICBpZiBwcm94eV9wYXNzd2Q6Ci0gICAgICAgICAgICAgICAgaW1wb3J0IGJhc2U2NAorICAgICAgICAgICAgICAgIHByb3h5X3Bhc3N3ZCA9IHVucXVvdGUocHJveHlfcGFzc3dkKQogICAgICAgICAgICAgICAgIHByb3h5X2F1dGggPSBiYXNlNjQuYjY0ZW5jb2RlKHByb3h5X3Bhc3N3ZCkuc3RyaXAoKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBwcm94eV9hdXRoID0gTm9uZQogICAgICAgICAgICAgaWYgdXNlcl9wYXNzd2Q6Ci0gICAgICAgICAgICAgICAgaW1wb3J0IGJhc2U2NAorICAgICAgICAgICAgICAgIHVzZXJfcGFzc3dkID0gdW5xdW90ZSh1c2VyX3Bhc3N3ZCkKICAgICAgICAgICAgICAgICBhdXRoID0gYmFzZTY0LmI2NGVuY29kZSh1c2VyX3Bhc3N3ZCkuc3RyaXAoKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBhdXRoID0gTm9uZQpAQCAtNDgzLDYgKzQ4NSw4IEBACiAgICAgICAgICAgICB1cmxmaWxlID0gZmlsZQogICAgICAgICAgICAgaWYgZmlsZVs6MV0gPT0gJy8nOgogICAgICAgICAgICAgICAgIHVybGZpbGUgPSAnZmlsZTovLycgKyBmaWxlCisgICAgICAgICAgICBlbGlmIGZpbGVbOjJdID09ICcuLyc6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibG9jYWwgZmlsZSB1cmwgbWF5IHN0YXJ0IHdpdGggLyBvciBmaWxlOi4gVW5rbm93biB1cmwgb2YgdHlwZTogJXMiICUgdXJsKQogICAgICAgICAgICAgcmV0dXJuIGFkZGluZm91cmwob3Blbihsb2NhbG5hbWUsICdyYicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycywgdXJsZmlsZSkKICAgICAgICAgaG9zdCwgcG9ydCA9IHNwbGl0cG9ydChob3N0KQpAQCAtNTkwLDcgKzU5NCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUuZ210aW1lKHRpbWUudGltZSgpKSkpCiAgICAgICAgIG1zZy5hcHBlbmQoJ0NvbnRlbnQtdHlwZTogJXMnICUgdHlwZSkKICAgICAgICAgaWYgZW5jb2RpbmcgPT0gJ2Jhc2U2NCc6Ci0gICAgICAgICAgICBpbXBvcnQgYmFzZTY0CiAgICAgICAgICAgICBkYXRhID0gYmFzZTY0LmRlY29kZXN0cmluZyhkYXRhKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgZGF0YSA9IHVucXVvdGUoZGF0YSkKQEAgLTY0MCw3ICs2NDMsNiBAQAogICAgICAgICAgICAgbmV3dXJsID0gaGVhZGVyc1sndXJpJ10KICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJldHVybgotICAgICAgICB2b2lkID0gZnAucmVhZCgpCiAgICAgICAgIGZwLmNsb3NlKCkKICAgICAgICAgIyBJbiBjYXNlIHRoZSBzZXJ2ZXIgc2VudCBhIHJlbGF0aXZlIFVSTCwgam9pbiB3aXRoIG9yaWdpbmFsOgogICAgICAgICBuZXd1cmwgPSBiYXNlam9pbihzZWxmLnR5cGUgKyAiOiIgKyB1cmwsIG5ld3VybCkKQEAgLTgxNyw3ICs4MTksMTAgQEAKICAgICAiIiJSZXR1cm4gdGhlIElQIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgaG9zdC4iIiIKICAgICBnbG9iYWwgX3RoaXNob3N0CiAgICAgaWYgX3RoaXNob3N0IGlzIE5vbmU6Ci0gICAgICAgIF90aGlzaG9zdCA9IHNvY2tldC5nZXRob3N0YnluYW1lKHNvY2tldC5nZXRob3N0bmFtZSgpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBfdGhpc2hvc3QgPSBzb2NrZXQuZ2V0aG9zdGJ5bmFtZShzb2NrZXQuZ2V0aG9zdG5hbWUoKSkKKyAgICAgICAgZXhjZXB0IHNvY2tldC5nYWllcnJvcjoKKyAgICAgICAgICAgIF90aGlzaG9zdCA9IHNvY2tldC5nZXRob3N0YnluYW1lKCdsb2NhbGhvc3QnKQogICAgIHJldHVybiBfdGhpc2hvc3QKIAogX2Z0cGVycm9ycyA9IE5vbmUKQEAgLTg2OCw4ICs4NzMsOCBAQAogICAgICAgICBzZWxmLmZ0cCA9IGZ0cGxpYi5GVFAoKQogICAgICAgICBzZWxmLmZ0cC5jb25uZWN0KHNlbGYuaG9zdCwgc2VsZi5wb3J0LCBzZWxmLnRpbWVvdXQpCiAgICAgICAgIHNlbGYuZnRwLmxvZ2luKHNlbGYudXNlciwgc2VsZi5wYXNzd2QpCi0gICAgICAgIGZvciBkaXIgaW4gc2VsZi5kaXJzOgotICAgICAgICAgICAgc2VsZi5mdHAuY3dkKGRpcikKKyAgICAgICAgX3RhcmdldCA9ICcvJy5qb2luKHNlbGYuZGlycykKKyAgICAgICAgc2VsZi5mdHAuY3dkKF90YXJnZXQpCiAKICAgICBkZWYgcmV0cmZpbGUoc2VsZiwgZmlsZSwgdHlwZSk6CiAgICAgICAgIGltcG9ydCBmdHBsaWIKQEAgLTk3OSwxMSArOTg0LDExIEBACiAgICAgICAgIHNlbGYuaG9va2FyZ3MgPSBob29rYXJncwogCiAgICAgZGVmIGNsb3NlKHNlbGYpOgotICAgICAgICBhZGRiYXNlLmNsb3NlKHNlbGYpCiAgICAgICAgIGlmIHNlbGYuY2xvc2Vob29rOgogICAgICAgICAgICAgc2VsZi5jbG9zZWhvb2soKnNlbGYuaG9va2FyZ3MpCiAgICAgICAgICAgICBzZWxmLmNsb3NlaG9vayA9IE5vbmUKICAgICAgICAgICAgIHNlbGYuaG9va2FyZ3MgPSBOb25lCisgICAgICAgIGFkZGJhc2UuY2xvc2Uoc2VsZikKIAogY2xhc3MgYWRkaW5mbyhhZGRiYXNlKToKICAgICAiIiJjbGFzcyB0byBhZGQgYW4gaW5mbygpIG1ldGhvZCB0byBhbiBvcGVuIGZpbGUuIiIiCkBAIC0xMTIwLDEwICsxMTI1LDEzIEBACiAgICAgZ2xvYmFsIF9wb3J0cHJvZwogICAgIGlmIF9wb3J0cHJvZyBpcyBOb25lOgogICAgICAgICBpbXBvcnQgcmUKLSAgICAgICAgX3BvcnRwcm9nID0gcmUuY29tcGlsZSgnXiguKik6KFswLTldKykkJykKKyAgICAgICAgX3BvcnRwcm9nID0gcmUuY29tcGlsZSgnXiguKik6KFswLTldKikkJykKIAogICAgIG1hdGNoID0gX3BvcnRwcm9nLm1hdGNoKGhvc3QpCi0gICAgaWYgbWF0Y2g6IHJldHVybiBtYXRjaC5ncm91cCgxLCAyKQorICAgIGlmIG1hdGNoOgorICAgICAgICBob3N0LCBwb3J0ID0gbWF0Y2guZ3JvdXBzKCkKKyAgICAgICAgaWYgcG9ydDoKKyAgICAgICAgICAgIHJldHVybiBob3N0LCBwb3J0CiAgICAgcmV0dXJuIGhvc3QsIE5vbmUKIAogX25wb3J0cHJvZyA9IE5vbmUKQEAgLTExNDAsMTIgKzExNDgsMTIgQEAKICAgICBtYXRjaCA9IF9ucG9ydHByb2cubWF0Y2goaG9zdCkKICAgICBpZiBtYXRjaDoKICAgICAgICAgaG9zdCwgcG9ydCA9IG1hdGNoLmdyb3VwKDEsIDIpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGlmIG5vdCBwb3J0OiByYWlzZSBWYWx1ZUVycm9yLCAibm8gZGlnaXRzIgotICAgICAgICAgICAgbnBvcnQgPSBpbnQocG9ydCkKLSAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICBucG9ydCA9IE5vbmUKLSAgICAgICAgcmV0dXJuIGhvc3QsIG5wb3J0CisgICAgICAgIGlmIHBvcnQ6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbnBvcnQgPSBpbnQocG9ydCkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIG5wb3J0ID0gTm9uZQorICAgICAgICAgICAgcmV0dXJuIGhvc3QsIG5wb3J0CiAgICAgcmV0dXJuIGhvc3QsIGRlZnBvcnQKIAogX3F1ZXJ5cHJvZyA9IE5vbmUKQEAgLTExOTcsMjIgKzEyMDUsMzUgQEAKIF9oZXhkaWcgPSAnMDEyMzQ1Njc4OUFCQ0RFRmFiY2RlZicKIF9oZXh0b2NociA9IGRpY3QoKGEgKyBiLCBjaHIoaW50KGEgKyBiLCAxNikpKQogICAgICAgICAgICAgICAgICBmb3IgYSBpbiBfaGV4ZGlnIGZvciBiIGluIF9oZXhkaWcpCitfYXNjaWlyZSA9IHJlLmNvbXBpbGUoJyhbXHgwMC1ceDdmXSspJykKIAogZGVmIHVucXVvdGUocyk6CiAgICAgIiIidW5xdW90ZSgnYWJjJTIwZGVmJykgLT4gJ2FiYyBkZWYnLiIiIgotICAgIHJlcyA9IHMuc3BsaXQoJyUnKQorICAgIGlmIF9pc191bmljb2RlKHMpOgorICAgICAgICBpZiAnJScgbm90IGluIHM6CisgICAgICAgICAgICByZXR1cm4gcworICAgICAgICBiaXRzID0gX2FzY2lpcmUuc3BsaXQocykKKyAgICAgICAgcmVzID0gW2JpdHNbMF1dCisgICAgICAgIGFwcGVuZCA9IHJlcy5hcHBlbmQKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKGJpdHMpLCAyKToKKyAgICAgICAgICAgIGFwcGVuZCh1bnF1b3RlKHN0cihiaXRzW2ldKSkuZGVjb2RlKCdsYXRpbjEnKSkKKyAgICAgICAgICAgIGFwcGVuZChiaXRzW2kgKyAxXSkKKyAgICAgICAgcmV0dXJuICcnLmpvaW4ocmVzKQorCisgICAgYml0cyA9IHMuc3BsaXQoJyUnKQogICAgICMgZmFzdHBhdGgKLSAgICBpZiBsZW4ocmVzKSA9PSAxOgorICAgIGlmIGxlbihiaXRzKSA9PSAxOgogICAgICAgICByZXR1cm4gcwotICAgIHMgPSByZXNbMF0KLSAgICBmb3IgaXRlbSBpbiByZXNbMTpdOgorICAgIHJlcyA9IFtiaXRzWzBdXQorICAgIGFwcGVuZCA9IHJlcy5hcHBlbmQKKyAgICBmb3IgaXRlbSBpbiBiaXRzWzE6XToKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgcyArPSBfaGV4dG9jaHJbaXRlbVs6Ml1dICsgaXRlbVsyOl0KKyAgICAgICAgICAgIGFwcGVuZChfaGV4dG9jaHJbaXRlbVs6Ml1dKQorICAgICAgICAgICAgYXBwZW5kKGl0ZW1bMjpdKQogICAgICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgICAgICBzICs9ICclJyArIGl0ZW0KLSAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKLSAgICAgICAgICAgIHMgKz0gdW5pY2hyKGludChpdGVtWzoyXSwgMTYpKSArIGl0ZW1bMjpdCi0gICAgcmV0dXJuIHMKKyAgICAgICAgICAgIGFwcGVuZCgnJScpCisgICAgICAgICAgICBhcHBlbmQoaXRlbSkKKyAgICByZXR1cm4gJycuam9pbihyZXMpCiAKIGRlZiB1bnF1b3RlX3BsdXMocyk6CiAgICAgIiIidW5xdW90ZSgnJTdlL2FiYytkZWYnKSAtPiAnfi9hYmMgZGVmJyIiIgpkaWZmIC0tZ2l0IGEvTGliL3VybGxpYjIucHkgYi9MaWIvdXJsbGliMi5weQppbmRleCA1NDcxYWNkLi5hYWRlYjczIDEwMDY0NAotLS0gYS9MaWIvdXJsbGliMi5weQorKysgYi9MaWIvdXJsbGliMi5weQpAQCAtMTAyLDYgKzEwMiw3IEBACiBpbXBvcnQgdGltZQogaW1wb3J0IHVybHBhcnNlCiBpbXBvcnQgYmlzZWN0CitpbXBvcnQgd2FybmluZ3MKIAogdHJ5OgogICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwpAQCAtMTA5LDcgKzExMCw3IEBACiAgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KIAogZnJvbSB1cmxsaWIgaW1wb3J0ICh1bndyYXAsIHVucXVvdGUsIHNwbGl0dHlwZSwgc3BsaXRob3N0LCBxdW90ZSwKLSAgICAgYWRkaW5mb3VybCwgc3BsaXRwb3J0LCBzcGxpdHRhZywKKyAgICAgYWRkaW5mb3VybCwgc3BsaXRwb3J0LCBzcGxpdHRhZywgdG9CeXRlcywKICAgICAgc3BsaXRhdHRyLCBmdHB3cmFwcGVyLCBzcGxpdHVzZXIsIHNwbGl0cGFzc3dkLCBzcGxpdHZhbHVlKQogCiAjIHN1cHBvcnQgZm9yIEZpbGVIYW5kbGVyLCBwcm94aWVzIHZpYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKQEAgLTE3Miw2ICsxNzMsOSBAQAogICAgIGRlZiByZWFzb24oc2VsZik6CiAgICAgICAgIHJldHVybiBzZWxmLm1zZwogCisgICAgZGVmIGluZm8oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmhkcnMKKwogIyBjb3BpZWQgZnJvbSBjb29raWVsaWIucHkKIF9jdXRfcG9ydF9yZSA9IHJlLmNvbXBpbGUociI6XGQrJCIpCiBkZWYgcmVxdWVzdF9ob3N0KHJlcXVlc3QpOgpAQCAtODI4LDcgKzgzMiw3IEBACiAgICAgIyBhbGxvdyBmb3IgZG91YmxlLSBhbmQgc2luZ2xlLXF1b3RlZCByZWFsbSB2YWx1ZXMKICAgICAjIChzaW5nbGUgcXVvdGVzIGFyZSBhIHZpb2xhdGlvbiBvZiB0aGUgUkZDLCBidXQgYXBwZWFyIGluIHRoZSB3aWxkKQogICAgIHJ4ID0gcmUuY29tcGlsZSgnKD86LiosKSpbIFx0XSooW14gXHRdKylbIFx0XSsnCi0gICAgICAgICAgICAgICAgICAgICdyZWFsbT0oWyJcJ10pKC4qPylcXDInLCByZS5JKQorICAgICAgICAgICAgICAgICAgICAncmVhbG09KFsiXCddPykoW14iXCddKilcXDInLCByZS5JKQogCiAgICAgIyBYWFggY291bGQgcHJlLWVtcHRpdmVseSBzZW5kIGF1dGggaW5mbyBhbHJlYWR5IGFjY2VwdGVkIChSRkMgMjYxNywKICAgICAjIGVuZCBvZiBzZWN0aW9uIDIsIGFuZCBzZWN0aW9uIDEuMiBpbW1lZGlhdGVseSBhZnRlciAiY3JlZGVudGlhbHMiCkBAIC04NjEsNiArODY1LDkgQEAKICAgICAgICAgICAgIG1vID0gQWJzdHJhY3RCYXNpY0F1dGhIYW5kbGVyLnJ4LnNlYXJjaChhdXRocmVxKQogICAgICAgICAgICAgaWYgbW86CiAgICAgICAgICAgICAgICAgc2NoZW1lLCBxdW90ZSwgcmVhbG0gPSBtby5ncm91cHMoKQorICAgICAgICAgICAgICAgIGlmIHF1b3RlIG5vdCBpbiBbJyInLCAiJyJdOgorICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJCYXNpYyBBdXRoIFJlYWxtIHdhcyB1bnF1b3RlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcldhcm5pbmcsIDIpCiAgICAgICAgICAgICAgICAgaWYgc2NoZW1lLmxvd2VyKCkgPT0gJ2Jhc2ljJzoKICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnJldHJ5X2h0dHBfYmFzaWNfYXV0aChob3N0LCByZXEsIHJlYWxtKQogICAgICAgICAgICAgICAgICAgICBpZiByZXNwb25zZSBhbmQgcmVzcG9uc2UuY29kZSAhPSA0MDE6CmRpZmYgLS1naXQgYS9MaWIvdXJscGFyc2UucHkgYi9MaWIvdXJscGFyc2UucHkKaW5kZXggYjQyZTBmNC4uNGNkM2Q2NyAxMDA2NDQKLS0tIGEvTGliL3VybHBhcnNlLnB5CisrKyBiL0xpYi91cmxwYXJzZS5weQpAQCAtMjgsNiArMjgsOCBAQAogCiAiIiIKIAoraW1wb3J0IHJlCisKIF9fYWxsX18gPSBbInVybHBhcnNlIiwgInVybHVucGFyc2UiLCAidXJsam9pbiIsICJ1cmxkZWZyYWciLAogICAgICAgICAgICAidXJsc3BsaXQiLCAidXJsdW5zcGxpdCIsICJwYXJzZV9xcyIsICJwYXJzZV9xc2wiXQogCkBAIC00MCwxMSArNDIsMTQgQEAKICAgICAgICAgICAgICAgICdpbWFwJywgJ3dhaXMnLCAnZmlsZScsICdtbXMnLCAnaHR0cHMnLCAnc2h0dHAnLAogICAgICAgICAgICAgICAgJ3NuZXdzJywgJ3Byb3NwZXJvJywgJ3J0c3AnLCAncnRzcHUnLCAncnN5bmMnLCAnJywKICAgICAgICAgICAgICAgICdzdm4nLCAnc3ZuK3NzaCcsICdzZnRwJywnbmZzJywnZ2l0JywgJ2dpdCtzc2gnXQotbm9uX2hpZXJhcmNoaWNhbCA9IFsnZ29waGVyJywgJ2hkbCcsICdtYWlsdG8nLCAnbmV3cycsCi0gICAgICAgICAgICAgICAgICAgICd0ZWxuZXQnLCAnd2FpcycsICdpbWFwJywgJ3NuZXdzJywgJ3NpcCcsICdzaXBzJ10KIHVzZXNfcGFyYW1zID0gWydmdHAnLCAnaGRsJywgJ3Byb3NwZXJvJywgJ2h0dHAnLCAnaW1hcCcsCiAgICAgICAgICAgICAgICAnaHR0cHMnLCAnc2h0dHAnLCAncnRzcCcsICdydHNwdScsICdzaXAnLCAnc2lwcycsCi0gICAgICAgICAgICAgICAnbW1zJywgJycsICdzZnRwJ10KKyAgICAgICAgICAgICAgICdtbXMnLCAnJywgJ3NmdHAnLCAndGVsJ10KKworIyBUaGVzZSBhcmUgbm90IGFjdHVhbGx5IHVzZWQgYW55bW9yZSwgYnV0IHNob3VsZCBzdGF5IGZvciBiYWNrd2FyZHMKKyMgY29tcGF0aWJpbGl0eS4gIChUaGV5IGFyZSB1bmRvY3VtZW50ZWQsIGJ1dCBoYXZlIGEgcHVibGljLWxvb2tpbmcgbmFtZS4pCitub25faGllcmFyY2hpY2FsID0gWydnb3BoZXInLCAnaGRsJywgJ21haWx0bycsICduZXdzJywKKyAgICAgICAgICAgICAgICAgICAgJ3RlbG5ldCcsICd3YWlzJywgJ2ltYXAnLCAnc25ld3MnLCAnc2lwJywgJ3NpcHMnXQogdXNlc19xdWVyeSA9IFsnaHR0cCcsICd3YWlzJywgJ2ltYXAnLCAnaHR0cHMnLCAnc2h0dHAnLCAnbW1zJywKICAgICAgICAgICAgICAgJ2dvcGhlcicsICdydHNwJywgJ3J0c3B1JywgJ3NpcCcsICdzaXBzJywgJyddCiB1c2VzX2ZyYWdtZW50ID0gWydmdHAnLCAnaGRsJywgJ2h0dHAnLCAnZ29waGVyJywgJ25ld3MnLApAQCAtMTA0LDkgKzEwOSwxMiBAQAogICAgICAgICBuZXRsb2MgPSBzZWxmLm5ldGxvYy5zcGxpdCgnQCcpWy0xXS5zcGxpdCgnXScpWy0xXQogICAgICAgICBpZiAnOicgaW4gbmV0bG9jOgogICAgICAgICAgICAgcG9ydCA9IG5ldGxvYy5zcGxpdCgnOicpWzFdCi0gICAgICAgICAgICByZXR1cm4gaW50KHBvcnQsIDEwKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIGlmIHBvcnQ6CisgICAgICAgICAgICAgICAgcG9ydCA9IGludChwb3J0LCAxMCkKKyAgICAgICAgICAgICAgICAjIHZlcmlmeSBsZWdhbCBwb3J0CisgICAgICAgICAgICAgICAgaWYgKDAgPD0gcG9ydCA8PSA2NTUzNSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwb3J0CisgICAgICAgIHJldHVybiBOb25lCiAKIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKIApAQCAtMTkyLDIxICsyMDAsMjEgQEAKICAgICAgICAgICAgIGlmIGMgbm90IGluIHNjaGVtZV9jaGFyczoKICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICBlbHNlOgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICMgbWFrZSBzdXJlICJ1cmwiIGlzIG5vdCBhY3R1YWxseSBhIHBvcnQgbnVtYmVyIChpbiB3aGljaCBjYXNlCi0gICAgICAgICAgICAgICAgIyAic2NoZW1lIiBpcyByZWFsbHkgcGFydCBvZiB0aGUgcGF0aAotICAgICAgICAgICAgICAgIF90ZXN0cG9ydG51bSA9IGludCh1cmxbaSsxOl0pCi0gICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgICAgICBzY2hlbWUsIHVybCA9IHVybFs6aV0ubG93ZXIoKSwgdXJsW2krMTpdCisgICAgICAgICAgICAjIG1ha2Ugc3VyZSAidXJsIiBpcyBub3QgYWN0dWFsbHkgYSBwb3J0IG51bWJlciAoaW4gd2hpY2ggY2FzZQorICAgICAgICAgICAgIyAic2NoZW1lIiBpcyByZWFsbHkgcGFydCBvZiB0aGUgcGF0aCkKKyAgICAgICAgICAgIHJlc3QgPSB1cmxbaSsxOl0KKyAgICAgICAgICAgIGlmIG5vdCByZXN0IG9yIGFueShjIG5vdCBpbiAnMDEyMzQ1Njc4OScgZm9yIGMgaW4gcmVzdCk6CisgICAgICAgICAgICAgICAgIyBub3QgYSBwb3J0IG51bWJlcgorICAgICAgICAgICAgICAgIHNjaGVtZSwgdXJsID0gdXJsWzppXS5sb3dlcigpLCByZXN0CiAKICAgICBpZiB1cmxbOjJdID09ICcvLyc6CiAgICAgICAgIG5ldGxvYywgdXJsID0gX3NwbGl0bmV0bG9jKHVybCwgMikKICAgICAgICAgaWYgKCgnWycgaW4gbmV0bG9jIGFuZCAnXScgbm90IGluIG5ldGxvYykgb3IKICAgICAgICAgICAgICAgICAoJ10nIGluIG5ldGxvYyBhbmQgJ1snIG5vdCBpbiBuZXRsb2MpKToKICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgSVB2NiBVUkwiKQotICAgIGlmIGFsbG93X2ZyYWdtZW50cyBhbmQgc2NoZW1lIGluIHVzZXNfZnJhZ21lbnQgYW5kICcjJyBpbiB1cmw6CisgICAgaWYgYWxsb3dfZnJhZ21lbnRzIGFuZCAnIycgaW4gdXJsOgogICAgICAgICB1cmwsIGZyYWdtZW50ID0gdXJsLnNwbGl0KCcjJywgMSkKLSAgICBpZiBzY2hlbWUgaW4gdXNlc19xdWVyeSBhbmQgJz8nIGluIHVybDoKKyAgICBpZiAnPycgaW4gdXJsOgogICAgICAgICB1cmwsIHF1ZXJ5ID0gdXJsLnNwbGl0KCc/JywgMSkKICAgICB2ID0gU3BsaXRSZXN1bHQoc2NoZW1lLCBuZXRsb2MsIHVybCwgcXVlcnksIGZyYWdtZW50KQogICAgIF9wYXJzZV9jYWNoZVtrZXldID0gdgpAQCAtMzA2LDYgKzMxNCwxNSBAQAogICAgIGVsc2U6CiAgICAgICAgIHJldHVybiB1cmwsICcnCiAKK3RyeToKKyAgICB1bmljb2RlCitleGNlcHQgTmFtZUVycm9yOgorICAgIGRlZiBfaXNfdW5pY29kZSh4KToKKyAgICAgICAgcmV0dXJuIDAKK2Vsc2U6CisgICAgZGVmIF9pc191bmljb2RlKHgpOgorICAgICAgICByZXR1cm4gaXNpbnN0YW5jZSh4LCB1bmljb2RlKQorCiAjIHVucXVvdGUgbWV0aG9kIGZvciBwYXJzZV9xcyBhbmQgcGFyc2VfcXNsCiAjIENhbm5vdCB1c2UgZGlyZWN0bHkgZnJvbSB1cmxsaWIgYXMgaXQgd291bGQgY3JlYXRlIGEgY2lyY3VsYXIgcmVmZXJlbmNlCiAjIGJlY2F1c2UgdXJsbGliIHVzZXMgdXJscGFyc2UgbWV0aG9kcyAodXJsam9pbikuICBJZiB5b3UgdXBkYXRlIHRoaXMgZnVuY3Rpb24sCkBAIC0zMTQsMjIgKzMzMSwzNSBAQAogX2hleGRpZyA9ICcwMTIzNDU2Nzg5QUJDREVGYWJjZGVmJwogX2hleHRvY2hyID0gZGljdCgoYStiLCBjaHIoaW50KGErYiwxNikpKQogICAgICAgICAgICAgICAgICBmb3IgYSBpbiBfaGV4ZGlnIGZvciBiIGluIF9oZXhkaWcpCitfYXNjaWlyZSA9IHJlLmNvbXBpbGUoJyhbXHgwMC1ceDdmXSspJykKIAogZGVmIHVucXVvdGUocyk6CiAgICAgIiIidW5xdW90ZSgnYWJjJTIwZGVmJykgLT4gJ2FiYyBkZWYnLiIiIgotICAgIHJlcyA9IHMuc3BsaXQoJyUnKQorICAgIGlmIF9pc191bmljb2RlKHMpOgorICAgICAgICBpZiAnJScgbm90IGluIHM6CisgICAgICAgICAgICByZXR1cm4gcworICAgICAgICBiaXRzID0gX2FzY2lpcmUuc3BsaXQocykKKyAgICAgICAgcmVzID0gW2JpdHNbMF1dCisgICAgICAgIGFwcGVuZCA9IHJlcy5hcHBlbmQKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKGJpdHMpLCAyKToKKyAgICAgICAgICAgIGFwcGVuZCh1bnF1b3RlKHN0cihiaXRzW2ldKSkuZGVjb2RlKCdsYXRpbjEnKSkKKyAgICAgICAgICAgIGFwcGVuZChiaXRzW2kgKyAxXSkKKyAgICAgICAgcmV0dXJuICcnLmpvaW4ocmVzKQorCisgICAgYml0cyA9IHMuc3BsaXQoJyUnKQogICAgICMgZmFzdHBhdGgKLSAgICBpZiBsZW4ocmVzKSA9PSAxOgorICAgIGlmIGxlbihiaXRzKSA9PSAxOgogICAgICAgICByZXR1cm4gcwotICAgIHMgPSByZXNbMF0KLSAgICBmb3IgaXRlbSBpbiByZXNbMTpdOgorICAgIHJlcyA9IFtiaXRzWzBdXQorICAgIGFwcGVuZCA9IHJlcy5hcHBlbmQKKyAgICBmb3IgaXRlbSBpbiBiaXRzWzE6XToKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgcyArPSBfaGV4dG9jaHJbaXRlbVs6Ml1dICsgaXRlbVsyOl0KKyAgICAgICAgICAgIGFwcGVuZChfaGV4dG9jaHJbaXRlbVs6Ml1dKQorICAgICAgICAgICAgYXBwZW5kKGl0ZW1bMjpdKQogICAgICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgICAgICBzICs9ICclJyArIGl0ZW0KLSAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKLSAgICAgICAgICAgIHMgKz0gdW5pY2hyKGludChpdGVtWzoyXSwgMTYpKSArIGl0ZW1bMjpdCi0gICAgcmV0dXJuIHMKKyAgICAgICAgICAgIGFwcGVuZCgnJScpCisgICAgICAgICAgICBhcHBlbmQoaXRlbSkKKyAgICByZXR1cm4gJycuam9pbihyZXMpCiAKIGRlZiBwYXJzZV9xcyhxcywga2VlcF9ibGFua192YWx1ZXM9MCwgc3RyaWN0X3BhcnNpbmc9MCk6CiAgICAgIiIiUGFyc2UgYSBxdWVyeSBnaXZlbiBhcyBhIHN0cmluZyBhcmd1bWVudC4KZGlmZiAtLWdpdCBhL0xpYi91dWlkLnB5IGIvTGliL3V1aWQucHkKaW5kZXggZmRkMGM1Yy4uNjNjYjNhZSAxMDA2NDQKLS0tIGEvTGliL3V1aWQucHkKKysrIGIvTGliL3V1aWQucHkKQEAgLTI5MywyNSArMjkzLDM4IEBACiAKIGRlZiBfZmluZF9tYWMoY29tbWFuZCwgYXJncywgaHdfaWRlbnRpZmllcnMsIGdldF9pbmRleCk6CiAgICAgaW1wb3J0IG9zCi0gICAgZm9yIGRpciBpbiBbJycsICcvc2Jpbi8nLCAnL3Vzci9zYmluJ106CisgICAgcGF0aCA9IG9zLmVudmlyb24uZ2V0KCJQQVRIIiwgb3MuZGVmcGF0aCkuc3BsaXQob3MucGF0aHNlcCkKKyAgICBwYXRoLmV4dGVuZCgoJy9zYmluJywgJy91c3Ivc2JpbicpKQorICAgIGZvciBkaXIgaW4gcGF0aDoKICAgICAgICAgZXhlY3V0YWJsZSA9IG9zLnBhdGguam9pbihkaXIsIGNvbW1hbmQpCi0gICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhleGVjdXRhYmxlKToKLSAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIChvcy5wYXRoLmV4aXN0cyhleGVjdXRhYmxlKSBhbmQKKyAgICAgICAgICAgIG9zLmFjY2VzcyhleGVjdXRhYmxlLCBvcy5GX09LIHwgb3MuWF9PSykgYW5kCisgICAgICAgICAgICBub3Qgb3MucGF0aC5pc2RpcihleGVjdXRhYmxlKSk6CisgICAgICAgICAgICBicmVhaworICAgIGVsc2U6CisgICAgICAgIHJldHVybiBOb25lCiAKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgIyBMQ19BTEwgdG8gZ2V0IEVuZ2xpc2ggb3V0cHV0LCAyPi9kZXYvbnVsbCB0bwotICAgICAgICAgICAgIyBwcmV2ZW50IG91dHB1dCBvbiBzdGRlcnIKLSAgICAgICAgICAgIGNtZCA9ICdMQ19BTEw9QyAlcyAlcyAyPi9kZXYvbnVsbCcgJSAoZXhlY3V0YWJsZSwgYXJncykKLSAgICAgICAgICAgIHdpdGggb3MucG9wZW4oY21kKSBhcyBwaXBlOgotICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHBpcGU6Ci0gICAgICAgICAgICAgICAgICAgIHdvcmRzID0gbGluZS5sb3dlcigpLnNwbGl0KCkKLSAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHdvcmRzKSk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiB3b3Jkc1tpXSBpbiBod19pZGVudGlmaWVyczoKKyAgICB0cnk6CisgICAgICAgICMgTENfQUxMIHRvIGVuc3VyZSBFbmdsaXNoIG91dHB1dCwgMj4vZGV2L251bGwgdG8KKyAgICAgICAgIyBwcmV2ZW50IG91dHB1dCBvbiBzdGRlcnIKKyAgICAgICAgY21kID0gJ0xDX0FMTD1DICVzICVzIDI+L2Rldi9udWxsJyAlIChleGVjdXRhYmxlLCBhcmdzKQorICAgICAgICB3aXRoIG9zLnBvcGVuKGNtZCkgYXMgcGlwZToKKyAgICAgICAgICAgIGZvciBsaW5lIGluIHBpcGU6CisgICAgICAgICAgICAgICAgd29yZHMgPSBsaW5lLmxvd2VyKCkuc3BsaXQoKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbih3b3JkcykpOgorICAgICAgICAgICAgICAgICAgICBpZiB3b3Jkc1tpXSBpbiBod19pZGVudGlmaWVyczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW50KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jkc1tnZXRfaW5kZXgoaSldLnJlcGxhY2UoJzonLCAnJyksIDE2KQotICAgICAgICBleGNlcHQgSU9FcnJvcjoKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgSW5kZXhFcnJvcik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBWaXJ0dWFsIGludGVyZmFjZXMsIHN1Y2ggYXMgdGhvc2UgcHJvdmlkZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFZQTnMsIGRvIG5vdCBoYXZlIGEgY29sb24tZGVsaW1pdGVkIE1BQyBhZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcyBleHBlY3RlZCwgYnV0IGEgMTYtYnl0ZSBIV0FkZHIgc2VwYXJhdGVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkYXNoZXMuIFRoZXNlIHNob3VsZCBiZSBpZ25vcmVkIGluIGZhdm9yIG9mIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlYWwgTUFDIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgIHBhc3MKIAogZGVmIF9pZmNvbmZpZ19nZXRub2RlKCk6CiAgICAgIiIiR2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzIG9uIFVuaXggYnkgcnVubmluZyBpZmNvbmZpZy4iIiIKQEAgLTQwOCw2ICs0MjEsOCBAQAogICAgICAgICAgICAgX3V1aWRfZ2VuZXJhdGVfcmFuZG9tID0gbGliLnV1aWRfZ2VuZXJhdGVfcmFuZG9tCiAgICAgICAgIGlmIGhhc2F0dHIobGliLCAndXVpZF9nZW5lcmF0ZV90aW1lJyk6CiAgICAgICAgICAgICBfdXVpZF9nZW5lcmF0ZV90aW1lID0gbGliLnV1aWRfZ2VuZXJhdGVfdGltZQorICAgICAgICAgICAgaWYgX3V1aWRfZ2VuZXJhdGVfcmFuZG9tIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGJyZWFrICAjIGZvdW5kIGV2ZXJ5dGhpbmcgd2Ugd2VyZSBsb29raW5nIGZvcgogCiAgICAgIyBUaGUgdXVpZF9nZW5lcmF0ZV8qIGZ1bmN0aW9ucyBhcmUgYnJva2VuIG9uIE1hY09TIFggMTAuNSwgYXMgbm90ZWQKICAgICAjIGluIGlzc3VlICM4NjIxIHRoZSBmdW5jdGlvbiBnZW5lcmF0ZXMgdGhlIHNhbWUgc2VxdWVuY2Ugb2YgdmFsdWVzCmRpZmYgLS1naXQgYS9MaWIvd2F2ZS5weSBiL0xpYi93YXZlLnB5CmluZGV4IDIwMTZhMmEuLjhmZjkzYzMgMTAwNjQ0Ci0tLSBhL0xpYi93YXZlLnB5CisrKyBiL0xpYi93YXZlLnB5CkBAIC04MCwxNyArODAsMTggQEAKIAogV0FWRV9GT1JNQVRfUENNID0gMHgwMDAxCiAKLV9hcnJheV9mbXRzID0gTm9uZSwgJ2InLCAnaCcsIE5vbmUsICdsJworX2FycmF5X2ZtdHMgPSBOb25lLCAnYicsICdoJywgTm9uZSwgJ2knCiAKLSMgRGV0ZXJtaW5lIGVuZGlhbi1uZXNzCiBpbXBvcnQgc3RydWN0Ci1pZiBzdHJ1Y3QucGFjaygiaCIsIDEpID09ICJcMDAwXDAwMSI6Ci0gICAgYmlnX2VuZGlhbiA9IDEKLWVsc2U6Ci0gICAgYmlnX2VuZGlhbiA9IDAKLQoraW1wb3J0IHN5cwogZnJvbSBjaHVuayBpbXBvcnQgQ2h1bmsKIAorZGVmIF9ieXRlc3dhcDMoZGF0YSk6CisgICAgYmEgPSBieXRlYXJyYXkoZGF0YSkKKyAgICBiYVs6OjNdID0gZGF0YVsyOjozXQorICAgIGJhWzI6OjNdID0gZGF0YVs6OjNdCisgICAgcmV0dXJuIGJ5dGVzKGJhKQorCiBjbGFzcyBXYXZlX3JlYWQ6CiAgICAgIiIiVmFyaWFibGVzIHVzZWQgaW4gdGhpcyBjbGFzczoKIApAQCAtMjMxLDEzICsyMzIsMTQgQEAKICAgICAgICAgICAgIHNlbGYuX2RhdGFfc2Vla19uZWVkZWQgPSAwCiAgICAgICAgIGlmIG5mcmFtZXMgPT0gMDoKICAgICAgICAgICAgIHJldHVybiAnJwotICAgICAgICBpZiBzZWxmLl9zYW1wd2lkdGggPiAxIGFuZCBiaWdfZW5kaWFuOgorICAgICAgICBpZiBzZWxmLl9zYW1wd2lkdGggaW4gKDIsIDQpIGFuZCBzeXMuYnl0ZW9yZGVyID09ICdiaWcnOgogICAgICAgICAgICAgIyB1bmZvcnR1bmF0ZWx5IHRoZSBmcm9tZmlsZSgpIG1ldGhvZCBkb2VzIG5vdCB0YWtlCiAgICAgICAgICAgICAjIHNvbWV0aGluZyB0aGF0IG9ubHkgbG9va3MgbGlrZSBhIGZpbGUgb2JqZWN0LCBzbwogICAgICAgICAgICAgIyB3ZSBoYXZlIHRvIHJlYWNoIGludG8gdGhlIGlubmFyZHMgb2YgdGhlIGNodW5rIG9iamVjdAogICAgICAgICAgICAgaW1wb3J0IGFycmF5CiAgICAgICAgICAgICBjaHVuayA9IHNlbGYuX2RhdGFfY2h1bmsKICAgICAgICAgICAgIGRhdGEgPSBhcnJheS5hcnJheShfYXJyYXlfZm10c1tzZWxmLl9zYW1wd2lkdGhdKQorICAgICAgICAgICAgYXNzZXJ0IGRhdGEuaXRlbXNpemUgPT0gc2VsZi5fc2FtcHdpZHRoCiAgICAgICAgICAgICBuaXRlbXMgPSBuZnJhbWVzICogc2VsZi5fbmNoYW5uZWxzCiAgICAgICAgICAgICBpZiBuaXRlbXMgKiBzZWxmLl9zYW1wd2lkdGggPiBjaHVuay5jaHVua3NpemUgLSBjaHVuay5zaXplX3JlYWQ6CiAgICAgICAgICAgICAgICAgbml0ZW1zID0gKGNodW5rLmNodW5rc2l6ZSAtIGNodW5rLnNpemVfcmVhZCkgLyBzZWxmLl9zYW1wd2lkdGgKQEAgLTI1MSw2ICsyNTMsOCBAQAogICAgICAgICAgICAgZGF0YSA9IGRhdGEudG9zdHJpbmcoKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2RhdGFfY2h1bmsucmVhZChuZnJhbWVzICogc2VsZi5fZnJhbWVzaXplKQorICAgICAgICAgICAgaWYgc2VsZi5fc2FtcHdpZHRoID09IDMgYW5kIHN5cy5ieXRlb3JkZXIgPT0gJ2JpZyc6CisgICAgICAgICAgICAgICAgZGF0YSA9IF9ieXRlc3dhcDMoZGF0YSkKICAgICAgICAgaWYgc2VsZi5fY29udmVydCBhbmQgZGF0YToKICAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9jb252ZXJ0KGRhdGEpCiAgICAgICAgIHNlbGYuX3NvdW5kcG9zID0gc2VsZi5fc291bmRwb3MgKyBsZW4oZGF0YSkgLy8gKHNlbGYuX25jaGFubmVscyAqIHNlbGYuX3NhbXB3aWR0aCkKQEAgLTI2MSw5ICsyNjUsOSBAQAogICAgICMKIAogICAgIGRlZiBfcmVhZF9mbXRfY2h1bmsoc2VsZiwgY2h1bmspOgotICAgICAgICB3Rm9ybWF0VGFnLCBzZWxmLl9uY2hhbm5lbHMsIHNlbGYuX2ZyYW1lcmF0ZSwgZHdBdmdCeXRlc1BlclNlYywgd0Jsb2NrQWxpZ24gPSBzdHJ1Y3QudW5wYWNrKCc8aGhsbGgnLCBjaHVuay5yZWFkKDE0KSkKKyAgICAgICAgd0Zvcm1hdFRhZywgc2VsZi5fbmNoYW5uZWxzLCBzZWxmLl9mcmFtZXJhdGUsIGR3QXZnQnl0ZXNQZXJTZWMsIHdCbG9ja0FsaWduID0gc3RydWN0LnVucGFjaygnPEhITExIJywgY2h1bmsucmVhZCgxNCkpCiAgICAgICAgIGlmIHdGb3JtYXRUYWcgPT0gV0FWRV9GT1JNQVRfUENNOgotICAgICAgICAgICAgc2FtcHdpZHRoID0gc3RydWN0LnVucGFjaygnPGgnLCBjaHVuay5yZWFkKDIpKVswXQorICAgICAgICAgICAgc2FtcHdpZHRoID0gc3RydWN0LnVucGFjaygnPEgnLCBjaHVuay5yZWFkKDIpKVswXQogICAgICAgICAgICAgc2VsZi5fc2FtcHdpZHRoID0gKHNhbXB3aWR0aCArIDcpIC8vIDgKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAndW5rbm93biBmb3JtYXQ6ICVyJyAlICh3Rm9ybWF0VGFnLCkKQEAgLTQxOCwxMyArNDIyLDE4IEBACiAgICAgICAgIG5mcmFtZXMgPSBsZW4oZGF0YSkgLy8gKHNlbGYuX3NhbXB3aWR0aCAqIHNlbGYuX25jaGFubmVscykKICAgICAgICAgaWYgc2VsZi5fY29udmVydDoKICAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9jb252ZXJ0KGRhdGEpCi0gICAgICAgIGlmIHNlbGYuX3NhbXB3aWR0aCA+IDEgYW5kIGJpZ19lbmRpYW46CisgICAgICAgIGlmIHNlbGYuX3NhbXB3aWR0aCBpbiAoMiwgNCkgYW5kIHN5cy5ieXRlb3JkZXIgPT0gJ2JpZyc6CiAgICAgICAgICAgICBpbXBvcnQgYXJyYXkKLSAgICAgICAgICAgIGRhdGEgPSBhcnJheS5hcnJheShfYXJyYXlfZm10c1tzZWxmLl9zYW1wd2lkdGhdLCBkYXRhKQorICAgICAgICAgICAgYSA9IGFycmF5LmFycmF5KF9hcnJheV9mbXRzW3NlbGYuX3NhbXB3aWR0aF0pCisgICAgICAgICAgICBhLmZyb21zdHJpbmcoZGF0YSkKKyAgICAgICAgICAgIGRhdGEgPSBhCisgICAgICAgICAgICBhc3NlcnQgZGF0YS5pdGVtc2l6ZSA9PSBzZWxmLl9zYW1wd2lkdGgKICAgICAgICAgICAgIGRhdGEuYnl0ZXN3YXAoKQogICAgICAgICAgICAgZGF0YS50b2ZpbGUoc2VsZi5fZmlsZSkKICAgICAgICAgICAgIHNlbGYuX2RhdGF3cml0dGVuID0gc2VsZi5fZGF0YXdyaXR0ZW4gKyBsZW4oZGF0YSkgKiBzZWxmLl9zYW1wd2lkdGgKICAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlbGYuX3NhbXB3aWR0aCA9PSAzIGFuZCBzeXMuYnl0ZW9yZGVyID09ICdiaWcnOgorICAgICAgICAgICAgICAgIGRhdGEgPSBfYnl0ZXN3YXAzKGRhdGEpCiAgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKGRhdGEpCiAgICAgICAgICAgICBzZWxmLl9kYXRhd3JpdHRlbiA9IHNlbGYuX2RhdGF3cml0dGVuICsgbGVuKGRhdGEpCiAgICAgICAgIHNlbGYuX25mcmFtZXN3cml0dGVuID0gc2VsZi5fbmZyYW1lc3dyaXR0ZW4gKyBuZnJhbWVzCkBAIC00MzYsMTEgKzQ0NSwxMyBAQAogCiAgICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICBpZiBzZWxmLl9maWxlOgotICAgICAgICAgICAgc2VsZi5fZW5zdXJlX2hlYWRlcl93cml0dGVuKDApCi0gICAgICAgICAgICBpZiBzZWxmLl9kYXRhbGVuZ3RoICE9IHNlbGYuX2RhdGF3cml0dGVuOgotICAgICAgICAgICAgICAgIHNlbGYuX3BhdGNoaGVhZGVyKCkKLSAgICAgICAgICAgIHNlbGYuX2ZpbGUuZmx1c2goKQotICAgICAgICAgICAgc2VsZi5fZmlsZSA9IE5vbmUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLl9lbnN1cmVfaGVhZGVyX3dyaXR0ZW4oMCkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9kYXRhbGVuZ3RoICE9IHNlbGYuX2RhdGF3cml0dGVuOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYXRjaGhlYWRlcigpCisgICAgICAgICAgICAgICAgc2VsZi5fZmlsZS5mbHVzaCgpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUgPSBOb25lCiAgICAgICAgIGlmIHNlbGYuX2lfb3BlbmVkX3RoZV9maWxlOgogICAgICAgICAgICAgc2VsZi5faV9vcGVuZWRfdGhlX2ZpbGUuY2xvc2UoKQogICAgICAgICAgICAgc2VsZi5faV9vcGVuZWRfdGhlX2ZpbGUgPSBOb25lCkBAIC00NjYsMTQgKzQ3NywxNCBAQAogICAgICAgICAgICAgc2VsZi5fbmZyYW1lcyA9IGluaXRsZW5ndGggLyAoc2VsZi5fbmNoYW5uZWxzICogc2VsZi5fc2FtcHdpZHRoKQogICAgICAgICBzZWxmLl9kYXRhbGVuZ3RoID0gc2VsZi5fbmZyYW1lcyAqIHNlbGYuX25jaGFubmVscyAqIHNlbGYuX3NhbXB3aWR0aAogICAgICAgICBzZWxmLl9mb3JtX2xlbmd0aF9wb3MgPSBzZWxmLl9maWxlLnRlbGwoKQotICAgICAgICBzZWxmLl9maWxlLndyaXRlKHN0cnVjdC5wYWNrKCc8bDRzNHNsaGhsbGhoNHMnLAorICAgICAgICBzZWxmLl9maWxlLndyaXRlKHN0cnVjdC5wYWNrKCc8TDRzNHNMSEhMTEhINHMnLAogICAgICAgICAgICAgMzYgKyBzZWxmLl9kYXRhbGVuZ3RoLCAnV0FWRScsICdmbXQgJywgMTYsCiAgICAgICAgICAgICBXQVZFX0ZPUk1BVF9QQ00sIHNlbGYuX25jaGFubmVscywgc2VsZi5fZnJhbWVyYXRlLAogICAgICAgICAgICAgc2VsZi5fbmNoYW5uZWxzICogc2VsZi5fZnJhbWVyYXRlICogc2VsZi5fc2FtcHdpZHRoLAogICAgICAgICAgICAgc2VsZi5fbmNoYW5uZWxzICogc2VsZi5fc2FtcHdpZHRoLAogICAgICAgICAgICAgc2VsZi5fc2FtcHdpZHRoICogOCwgJ2RhdGEnKSkKICAgICAgICAgc2VsZi5fZGF0YV9sZW5ndGhfcG9zID0gc2VsZi5fZmlsZS50ZWxsKCkKLSAgICAgICAgc2VsZi5fZmlsZS53cml0ZShzdHJ1Y3QucGFjaygnPGwnLCBzZWxmLl9kYXRhbGVuZ3RoKSkKKyAgICAgICAgc2VsZi5fZmlsZS53cml0ZShzdHJ1Y3QucGFjaygnPEwnLCBzZWxmLl9kYXRhbGVuZ3RoKSkKICAgICAgICAgc2VsZi5faGVhZGVyd3JpdHRlbiA9IFRydWUKIAogICAgIGRlZiBfcGF0Y2hoZWFkZXIoc2VsZik6CkBAIC00ODIsOSArNDkzLDkgQEAKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBjdXJwb3MgPSBzZWxmLl9maWxlLnRlbGwoKQogICAgICAgICBzZWxmLl9maWxlLnNlZWsoc2VsZi5fZm9ybV9sZW5ndGhfcG9zLCAwKQotICAgICAgICBzZWxmLl9maWxlLndyaXRlKHN0cnVjdC5wYWNrKCc8bCcsIDM2ICsgc2VsZi5fZGF0YXdyaXR0ZW4pKQorICAgICAgICBzZWxmLl9maWxlLndyaXRlKHN0cnVjdC5wYWNrKCc8TCcsIDM2ICsgc2VsZi5fZGF0YXdyaXR0ZW4pKQogICAgICAgICBzZWxmLl9maWxlLnNlZWsoc2VsZi5fZGF0YV9sZW5ndGhfcG9zLCAwKQotICAgICAgICBzZWxmLl9maWxlLndyaXRlKHN0cnVjdC5wYWNrKCc8bCcsIHNlbGYuX2RhdGF3cml0dGVuKSkKKyAgICAgICAgc2VsZi5fZmlsZS53cml0ZShzdHJ1Y3QucGFjaygnPEwnLCBzZWxmLl9kYXRhd3JpdHRlbikpCiAgICAgICAgIHNlbGYuX2ZpbGUuc2VlayhjdXJwb3MsIDApCiAgICAgICAgIHNlbGYuX2RhdGFsZW5ndGggPSBzZWxmLl9kYXRhd3JpdHRlbgogCmRpZmYgLS1naXQgYS9MaWIvd2Vha3JlZi5weSBiL0xpYi93ZWFrcmVmLnB5CmluZGV4IDg4YzYwZTcuLjc4N2M4ODUgMTAwNjQ0Ci0tLSBhL0xpYi93ZWFrcmVmLnB5CisrKyBiL0xpYi93ZWFrcmVmLnB5CkBAIC0yMCw3ICsyMCw3IEBACiAgICAgIFByb3h5VHlwZSwKICAgICAgUmVmZXJlbmNlVHlwZSkKIAotZnJvbSBfd2Vha3JlZnNldCBpbXBvcnQgV2Vha1NldAorZnJvbSBfd2Vha3JlZnNldCBpbXBvcnQgV2Vha1NldCwgX0l0ZXJhdGlvbkd1YXJkCiAKIGZyb20gZXhjZXB0aW9ucyBpbXBvcnQgUmVmZXJlbmNlRXJyb3IKIApAQCAtNDgsMTAgKzQ4LDI0IEBACiAgICAgICAgIGRlZiByZW1vdmUod3IsIHNlbGZyZWY9cmVmKHNlbGYpKToKICAgICAgICAgICAgIHNlbGYgPSBzZWxmcmVmKCkKICAgICAgICAgICAgIGlmIHNlbGYgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgZGVsIHNlbGYuZGF0YVt3ci5rZXldCisgICAgICAgICAgICAgICAgaWYgc2VsZi5faXRlcmF0aW5nOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9wZW5kaW5nX3JlbW92YWxzLmFwcGVuZCh3ci5rZXkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZGVsIHNlbGYuZGF0YVt3ci5rZXldCiAgICAgICAgIHNlbGYuX3JlbW92ZSA9IHJlbW92ZQorICAgICAgICAjIEEgbGlzdCBvZiBrZXlzIHRvIGJlIHJlbW92ZWQKKyAgICAgICAgc2VsZi5fcGVuZGluZ19yZW1vdmFscyA9IFtdCisgICAgICAgIHNlbGYuX2l0ZXJhdGluZyA9IHNldCgpCiAgICAgICAgIFVzZXJEaWN0LlVzZXJEaWN0Ll9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KQogCisgICAgZGVmIF9jb21taXRfcmVtb3ZhbHMoc2VsZik6CisgICAgICAgIGwgPSBzZWxmLl9wZW5kaW5nX3JlbW92YWxzCisgICAgICAgIGQgPSBzZWxmLmRhdGEKKyAgICAgICAgIyBXZSBzaG91bGRuJ3QgZW5jb3VudGVyIGFueSBLZXlFcnJvciwgYmVjYXVzZSB0aGlzIG1ldGhvZCBzaG91bGQKKyAgICAgICAgIyBhbHdheXMgYmUgY2FsbGVkICpiZWZvcmUqIG11dGF0aW5nIHRoZSBkaWN0LgorICAgICAgICB3aGlsZSBsOgorICAgICAgICAgICAgZGVsIGRbbC5wb3AoKV0KKwogICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgICBvID0gc2VsZi5kYXRhW2tleV0oKQogICAgICAgICBpZiBvIGlzIE5vbmU6CkBAIC01OSw2ICs3MywxMSBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmV0dXJuIG8KIAorICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICBpZiBzZWxmLl9wZW5kaW5nX3JlbW92YWxzOgorICAgICAgICAgICAgc2VsZi5fY29tbWl0X3JlbW92YWxzKCkKKyAgICAgICAgZGVsIHNlbGYuZGF0YVtrZXldCisKICAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG8gPSBzZWxmLmRhdGFba2V5XSgpCkBAIC03Nyw4ICs5NiwxNSBAQAogICAgICAgICByZXR1cm4gIjxXZWFrVmFsdWVEaWN0aW9uYXJ5IGF0ICVzPiIgJSBpZChzZWxmKQogCiAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICBpZiBzZWxmLl9wZW5kaW5nX3JlbW92YWxzOgorICAgICAgICAgICAgc2VsZi5fY29tbWl0X3JlbW92YWxzKCkKICAgICAgICAgc2VsZi5kYXRhW2tleV0gPSBLZXllZFJlZih2YWx1ZSwgc2VsZi5fcmVtb3ZlLCBrZXkpCiAKKyAgICBkZWYgY2xlYXIoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3BlbmRpbmdfcmVtb3ZhbHM6CisgICAgICAgICAgICBzZWxmLl9jb21taXRfcmVtb3ZhbHMoKQorICAgICAgICBzZWxmLmRhdGEuY2xlYXIoKQorCiAgICAgZGVmIGNvcHkoc2VsZik6CiAgICAgICAgIG5ldyA9IFdlYWtWYWx1ZURpY3Rpb25hcnkoKQogICAgICAgICBmb3Iga2V5LCB3ciBpbiBzZWxmLmRhdGEuaXRlbXMoKToKQEAgLTEyMCwxNiArMTQ2LDE4IEBACiAgICAgICAgIHJldHVybiBMCiAKICAgICBkZWYgaXRlcml0ZW1zKHNlbGYpOgotICAgICAgICBmb3Igd3IgaW4gc2VsZi5kYXRhLml0ZXJ2YWx1ZXMoKToKLSAgICAgICAgICAgIHZhbHVlID0gd3IoKQotICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgeWllbGQgd3Iua2V5LCB2YWx1ZQorICAgICAgICB3aXRoIF9JdGVyYXRpb25HdWFyZChzZWxmKToKKyAgICAgICAgICAgIGZvciB3ciBpbiBzZWxmLmRhdGEuaXRlcnZhbHVlcygpOgorICAgICAgICAgICAgICAgIHZhbHVlID0gd3IoKQorICAgICAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCB3ci5rZXksIHZhbHVlCiAKICAgICBkZWYgaXRlcmtleXMoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLmRhdGEuaXRlcmtleXMoKQorICAgICAgICB3aXRoIF9JdGVyYXRpb25HdWFyZChzZWxmKToKKyAgICAgICAgICAgIGZvciBrIGluIHNlbGYuZGF0YS5pdGVya2V5cygpOgorICAgICAgICAgICAgICAgIHlpZWxkIGsKIAotICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5pdGVya2V5cygpCisgICAgX19pdGVyX18gPSBpdGVya2V5cwogCiAgICAgZGVmIGl0ZXJ2YWx1ZXJlZnMoc2VsZik6CiAgICAgICAgICIiIlJldHVybiBhbiBpdGVyYXRvciB0aGF0IHlpZWxkcyB0aGUgd2VhayByZWZlcmVuY2VzIHRvIHRoZSB2YWx1ZXMuCkBAIC0xNDEsMTUgKzE2OSwyMCBAQAogICAgICAgICBrZWVwIHRoZSB2YWx1ZXMgYXJvdW5kIGxvbmdlciB0aGFuIG5lZWRlZC4KIAogICAgICAgICAiIiIKLSAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5pdGVydmFsdWVzKCkKKyAgICAgICAgd2l0aCBfSXRlcmF0aW9uR3VhcmQoc2VsZik6CisgICAgICAgICAgICBmb3Igd3IgaW4gc2VsZi5kYXRhLml0ZXJ2YWx1ZXMoKToKKyAgICAgICAgICAgICAgICB5aWVsZCB3cgogCiAgICAgZGVmIGl0ZXJ2YWx1ZXMoc2VsZik6Ci0gICAgICAgIGZvciB3ciBpbiBzZWxmLmRhdGEuaXRlcnZhbHVlcygpOgotICAgICAgICAgICAgb2JqID0gd3IoKQotICAgICAgICAgICAgaWYgb2JqIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHlpZWxkIG9iagorICAgICAgICB3aXRoIF9JdGVyYXRpb25HdWFyZChzZWxmKToKKyAgICAgICAgICAgIGZvciB3ciBpbiBzZWxmLmRhdGEuaXRlcnZhbHVlcygpOgorICAgICAgICAgICAgICAgIG9iaiA9IHdyKCkKKyAgICAgICAgICAgICAgICBpZiBvYmogaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIG9iagogCiAgICAgZGVmIHBvcGl0ZW0oc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3BlbmRpbmdfcmVtb3ZhbHM6CisgICAgICAgICAgICBzZWxmLl9jb21taXRfcmVtb3ZhbHMoKQogICAgICAgICB3aGlsZSAxOgogICAgICAgICAgICAga2V5LCB3ciA9IHNlbGYuZGF0YS5wb3BpdGVtKCkKICAgICAgICAgICAgIG8gPSB3cigpCkBAIC0xNTcsNiArMTkwLDggQEAKICAgICAgICAgICAgICAgICByZXR1cm4ga2V5LCBvCiAKICAgICBkZWYgcG9wKHNlbGYsIGtleSwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLl9wZW5kaW5nX3JlbW92YWxzOgorICAgICAgICAgICAgc2VsZi5fY29tbWl0X3JlbW92YWxzKCkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgbyA9IHNlbGYuZGF0YS5wb3Aoa2V5KSgpCiAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKQEAgLTE3MiwxMiArMjA3LDE2IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHdyID0gc2VsZi5kYXRhW2tleV0KICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgaWYgc2VsZi5fcGVuZGluZ19yZW1vdmFsczoKKyAgICAgICAgICAgICAgICBzZWxmLl9jb21taXRfcmVtb3ZhbHMoKQogICAgICAgICAgICAgc2VsZi5kYXRhW2tleV0gPSBLZXllZFJlZihkZWZhdWx0LCBzZWxmLl9yZW1vdmUsIGtleSkKICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0CiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByZXR1cm4gd3IoKQogCiAgICAgZGVmIHVwZGF0ZShzZWxmLCBkaWN0PU5vbmUsICoqa3dhcmdzKToKKyAgICAgICAgaWYgc2VsZi5fcGVuZGluZ19yZW1vdmFsczoKKyAgICAgICAgICAgIHNlbGYuX2NvbW1pdF9yZW1vdmFscygpCiAgICAgICAgIGQgPSBzZWxmLmRhdGEKICAgICAgICAgaWYgZGljdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRyKGRpY3QsICJpdGVtcyIpOgpAQCAtMjQ1LDkgKzI4NCwyOSBAQAogICAgICAgICBkZWYgcmVtb3ZlKGssIHNlbGZyZWY9cmVmKHNlbGYpKToKICAgICAgICAgICAgIHNlbGYgPSBzZWxmcmVmKCkKICAgICAgICAgICAgIGlmIHNlbGYgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgZGVsIHNlbGYuZGF0YVtrXQorICAgICAgICAgICAgICAgIGlmIHNlbGYuX2l0ZXJhdGluZzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGVuZGluZ19yZW1vdmFscy5hcHBlbmQoaykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBkZWwgc2VsZi5kYXRhW2tdCiAgICAgICAgIHNlbGYuX3JlbW92ZSA9IHJlbW92ZQotICAgICAgICBpZiBkaWN0IGlzIG5vdCBOb25lOiBzZWxmLnVwZGF0ZShkaWN0KQorICAgICAgICAjIEEgbGlzdCBvZiBkZWFkIHdlYWtyZWZzIChrZXlzIHRvIGJlIHJlbW92ZWQpCisgICAgICAgIHNlbGYuX3BlbmRpbmdfcmVtb3ZhbHMgPSBbXQorICAgICAgICBzZWxmLl9pdGVyYXRpbmcgPSBzZXQoKQorICAgICAgICBpZiBkaWN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi51cGRhdGUoZGljdCkKKworICAgIGRlZiBfY29tbWl0X3JlbW92YWxzKHNlbGYpOgorICAgICAgICAjIE5PVEU6IFdlIGRvbid0IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBiZWZvcmUgbXV0YXRpbmcgdGhlIGRpY3QsCisgICAgICAgICMgYmVjYXVzZSBhIGRlYWQgd2Vha3JlZiBuZXZlciBjb21wYXJlcyBlcXVhbCB0byBhIGxpdmUgd2Vha3JlZiwKKyAgICAgICAgIyBldmVuIGlmIHRoZXkgaGFwcGVuZWQgdG8gcmVmZXIgdG8gZXF1YWwgb2JqZWN0cy4KKyAgICAgICAgIyBIb3dldmVyLCBpdCBtZWFucyBrZXlzIG1heSBhbHJlYWR5IGhhdmUgYmVlbiByZW1vdmVkLgorICAgICAgICBsID0gc2VsZi5fcGVuZGluZ19yZW1vdmFscworICAgICAgICBkID0gc2VsZi5kYXRhCisgICAgICAgIHdoaWxlIGw6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGVsIGRbbC5wb3AoKV0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCiAKICAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKICAgICAgICAgZGVsIHNlbGYuZGF0YVtyZWYoa2V5KV0KQEAgLTMwNiwxMCArMzY1LDExIEBACiAgICAgICAgIHJldHVybiBMCiAKICAgICBkZWYgaXRlcml0ZW1zKHNlbGYpOgotICAgICAgICBmb3Igd3IsIHZhbHVlIGluIHNlbGYuZGF0YS5pdGVyaXRlbXMoKToKLSAgICAgICAgICAgIGtleSA9IHdyKCkKLSAgICAgICAgICAgIGlmIGtleSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICB5aWVsZCBrZXksIHZhbHVlCisgICAgICAgIHdpdGggX0l0ZXJhdGlvbkd1YXJkKHNlbGYpOgorICAgICAgICAgICAgZm9yIHdyLCB2YWx1ZSBpbiBzZWxmLmRhdGEuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICAgICAga2V5ID0gd3IoKQorICAgICAgICAgICAgICAgIGlmIGtleSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQga2V5LCB2YWx1ZQogCiAgICAgZGVmIGl0ZXJrZXlyZWZzKHNlbGYpOgogICAgICAgICAiIiJSZXR1cm4gYW4gaXRlcmF0b3IgdGhhdCB5aWVsZHMgdGhlIHdlYWsgcmVmZXJlbmNlcyB0byB0aGUga2V5cy4KQEAgLTMyMSwxOSArMzgxLDIzIEBACiAgICAgICAgIGtlZXAgdGhlIGtleXMgYXJvdW5kIGxvbmdlciB0aGFuIG5lZWRlZC4KIAogICAgICAgICAiIiIKLSAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5pdGVya2V5cygpCisgICAgICAgIHdpdGggX0l0ZXJhdGlvbkd1YXJkKHNlbGYpOgorICAgICAgICAgICAgZm9yIHdyIGluIHNlbGYuZGF0YS5pdGVya2V5cygpOgorICAgICAgICAgICAgICAgIHlpZWxkIHdyCiAKICAgICBkZWYgaXRlcmtleXMoc2VsZik6Ci0gICAgICAgIGZvciB3ciBpbiBzZWxmLmRhdGEuaXRlcmtleXMoKToKLSAgICAgICAgICAgIG9iaiA9IHdyKCkKLSAgICAgICAgICAgIGlmIG9iaiBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICB5aWVsZCBvYmoKKyAgICAgICAgd2l0aCBfSXRlcmF0aW9uR3VhcmQoc2VsZik6CisgICAgICAgICAgICBmb3Igd3IgaW4gc2VsZi5kYXRhLml0ZXJrZXlzKCk6CisgICAgICAgICAgICAgICAgb2JqID0gd3IoKQorICAgICAgICAgICAgICAgIGlmIG9iaiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgb2JqCiAKLSAgICBkZWYgX19pdGVyX18oc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLml0ZXJrZXlzKCkKKyAgICBfX2l0ZXJfXyA9IGl0ZXJrZXlzCiAKICAgICBkZWYgaXRlcnZhbHVlcyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5pdGVydmFsdWVzKCkKKyAgICAgICAgd2l0aCBfSXRlcmF0aW9uR3VhcmQoc2VsZik6CisgICAgICAgICAgICBmb3IgdmFsdWUgaW4gc2VsZi5kYXRhLml0ZXJ2YWx1ZXMoKToKKyAgICAgICAgICAgICAgICB5aWVsZCB2YWx1ZQogCiAgICAgZGVmIGtleXJlZnMoc2VsZik6CiAgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2Ygd2VhayByZWZlcmVuY2VzIHRvIHRoZSBrZXlzLgpkaWZmIC0tZ2l0IGEvTGliL3dlYmJyb3dzZXIucHkgYi9MaWIvd2ViYnJvd3Nlci5weQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGYzYzUzZDQuLmQzMjcyYTAKLS0tIGEvTGliL3dlYmJyb3dzZXIucHkKKysrIGIvTGliL3dlYmJyb3dzZXIucHkKQEAgLTMwNCw2ICszMDQsMTggQEAKICAgICBiYWNrZ3JvdW5kID0gVHJ1ZQogCiAKK2NsYXNzIENocm9tZShVbml4QnJvd3Nlcik6CisgICAgIkxhdW5jaGVyIGNsYXNzIGZvciBHb29nbGUgQ2hyb21lIGJyb3dzZXIuIgorCisgICAgcmVtb3RlX2FyZ3MgPSBbJyVhY3Rpb24nLCAnJXMnXQorICAgIHJlbW90ZV9hY3Rpb24gPSAiIgorICAgIHJlbW90ZV9hY3Rpb25fbmV3d2luID0gIi0tbmV3LXdpbmRvdyIKKyAgICByZW1vdGVfYWN0aW9uX25ld3RhYiA9ICIiCisgICAgYmFja2dyb3VuZCA9IFRydWUKKworQ2hyb21pdW0gPSBDaHJvbWUKKworCiBjbGFzcyBPcGVyYShVbml4QnJvd3Nlcik6CiAgICAgIkxhdW5jaGVyIGNsYXNzIGZvciBPcGVyYSBicm93c2VyLiIKIApAQCAtNDQxLDYgKzQ1MywxNCBAQAogCiBkZWYgcmVnaXN0ZXJfWF9icm93c2VycygpOgogCisgICAgIyB1c2UgeGRnLW9wZW4gaWYgYXJvdW5kCisgICAgaWYgX2lzY29tbWFuZCgieGRnLW9wZW4iKToKKyAgICAgICAgcmVnaXN0ZXIoInhkZy1vcGVuIiwgTm9uZSwgQmFja2dyb3VuZEJyb3dzZXIoInhkZy1vcGVuIikpCisKKyAgICAjIFRoZSBkZWZhdWx0IEdOT01FMyBicm93c2VyCisgICAgaWYgIkdOT01FX0RFU0tUT1BfU0VTU0lPTl9JRCIgaW4gb3MuZW52aXJvbiBhbmQgX2lzY29tbWFuZCgiZ3Zmcy1vcGVuIik6CisgICAgICAgIHJlZ2lzdGVyKCJndmZzLW9wZW4iLCBOb25lLCBCYWNrZ3JvdW5kQnJvd3NlcigiZ3Zmcy1vcGVuIikpCisKICAgICAjIFRoZSBkZWZhdWx0IEdOT01FIGJyb3dzZXIKICAgICBpZiAiR05PTUVfREVTS1RPUF9TRVNTSU9OX0lEIiBpbiBvcy5lbnZpcm9uIGFuZCBfaXNjb21tYW5kKCJnbm9tZS1vcGVuIik6CiAgICAgICAgIHJlZ2lzdGVyKCJnbm9tZS1vcGVuIiwgTm9uZSwgQmFja2dyb3VuZEJyb3dzZXIoImdub21lLW9wZW4iKSkKQEAgLTQ0OSw5ICs0NjksMTMgQEAKICAgICBpZiAiS0RFX0ZVTExfU0VTU0lPTiIgaW4gb3MuZW52aXJvbiBhbmQgX2lzY29tbWFuZCgia2ZtY2xpZW50Iik6CiAgICAgICAgIHJlZ2lzdGVyKCJrZm1jbGllbnQiLCBLb25xdWVyb3IsIEtvbnF1ZXJvcigia2ZtY2xpZW50IikpCiAKKyAgICBpZiBfaXNjb21tYW5kKCJ4LXd3dy1icm93c2VyIik6CisgICAgICAgIHJlZ2lzdGVyKCJ4LXd3dy1icm93c2VyIiwgTm9uZSwgQmFja2dyb3VuZEJyb3dzZXIoIngtd3d3LWJyb3dzZXIiKSkKKwogICAgICMgVGhlIE1vemlsbGEvTmV0c2NhcGUgYnJvd3NlcnMKICAgICBmb3IgYnJvd3NlciBpbiAoIm1vemlsbGEtZmlyZWZveCIsICJmaXJlZm94IiwKICAgICAgICAgICAgICAgICAgICAgIm1vemlsbGEtZmlyZWJpcmQiLCAiZmlyZWJpcmQiLAorICAgICAgICAgICAgICAgICAgICAiaWNld2Vhc2VsIiwgImljZWFwZSIsCiAgICAgICAgICAgICAgICAgICAgICJzZWFtb25rZXkiLCAibW96aWxsYSIsICJuZXRzY2FwZSIpOgogICAgICAgICBpZiBfaXNjb21tYW5kKGJyb3dzZXIpOgogICAgICAgICAgICAgcmVnaXN0ZXIoYnJvd3NlciwgTm9uZSwgTW96aWxsYShicm93c2VyKSkKQEAgLTQ3MSw2ICs0OTUsMTEgQEAKICAgICBpZiBfaXNjb21tYW5kKCJza2lwc3RvbmUiKToKICAgICAgICAgcmVnaXN0ZXIoInNraXBzdG9uZSIsIE5vbmUsIEJhY2tncm91bmRCcm93c2VyKCJza2lwc3RvbmUiKSkKIAorICAgICMgR29vZ2xlIENocm9tZS9DaHJvbWl1bSBicm93c2VycworICAgIGZvciBicm93c2VyIGluICgiZ29vZ2xlLWNocm9tZSIsICJjaHJvbWUiLCAiY2hyb21pdW0iLCAiY2hyb21pdW0tYnJvd3NlciIpOgorICAgICAgICBpZiBfaXNjb21tYW5kKGJyb3dzZXIpOgorICAgICAgICAgICAgcmVnaXN0ZXIoYnJvd3NlciwgTm9uZSwgQ2hyb21lKGJyb3dzZXIpKQorCiAgICAgIyBPcGVyYSwgcXVpdGUgcG9wdWxhcgogICAgIGlmIF9pc2NvbW1hbmQoIm9wZXJhIik6CiAgICAgICAgIHJlZ2lzdGVyKCJvcGVyYSIsIE5vbmUsIE9wZXJhKCJvcGVyYSIpKQpAQCAtNDg5LDYgKzUxOCw4IEBACiAKICMgQWxzbyB0cnkgY29uc29sZSBicm93c2VycwogaWYgb3MuZW52aXJvbi5nZXQoIlRFUk0iKToKKyAgICBpZiBfaXNjb21tYW5kKCJ3d3ctYnJvd3NlciIpOgorICAgICAgICByZWdpc3Rlcigid3d3LWJyb3dzZXIiLCBOb25lLCBHZW5lcmljQnJvd3Nlcigid3d3LWJyb3dzZXIiKSkKICAgICAjIFRoZSBMaW5rcy9lbGlua3MgYnJvd3NlcnMgPGh0dHA6Ly9hcnRheC5rYXJsaW4ubWZmLmN1bmkuY3ovfm1pa3VsYXMvbGlua3MvPgogICAgIGlmIF9pc2NvbW1hbmQoImxpbmtzIik6CiAgICAgICAgIHJlZ2lzdGVyKCJsaW5rcyIsIE5vbmUsIEdlbmVyaWNCcm93c2VyKCJsaW5rcyIpKQpkaWZmIC0tZ2l0IGEvTGliL3dzZ2lyZWYvaGFuZGxlcnMucHkgYi9MaWIvd3NnaXJlZi9oYW5kbGVycy5weQppbmRleCBhZTFlOGNjLi44Y2I1N2UyIDEwMDY0NAotLS0gYS9MaWIvd3NnaXJlZi9oYW5kbGVycy5weQorKysgYi9MaWIvd3NnaXJlZi9oYW5kbGVycy5weQpAQCAtMTIyLDExICsxMjIsMTMgQEAKICAgICAgICAgaW4gdGhlIGV2ZW50IGxvb3AgdG8gaXRlcmF0ZSBvdmVyIHRoZSBkYXRhLCBhbmQgdG8gY2FsbAogICAgICAgICAnc2VsZi5jbG9zZSgpJyBvbmNlIHRoZSByZXNwb25zZSBpcyBmaW5pc2hlZC4KICAgICAgICAgIiIiCi0gICAgICAgIGlmIG5vdCBzZWxmLnJlc3VsdF9pc19maWxlKCkgb3Igbm90IHNlbGYuc2VuZGZpbGUoKToKLSAgICAgICAgICAgIGZvciBkYXRhIGluIHNlbGYucmVzdWx0OgotICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoZGF0YSkKLSAgICAgICAgICAgIHNlbGYuZmluaXNoX2NvbnRlbnQoKQotICAgICAgICBzZWxmLmNsb3NlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgbm90IHNlbGYucmVzdWx0X2lzX2ZpbGUoKSBvciBub3Qgc2VsZi5zZW5kZmlsZSgpOgorICAgICAgICAgICAgICAgIGZvciBkYXRhIGluIHNlbGYucmVzdWx0OgorICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKGRhdGEpCisgICAgICAgICAgICAgICAgc2VsZi5maW5pc2hfY29udGVudCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmNsb3NlKCkKIAogCiAgICAgZGVmIGdldF9zY2hlbWUoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvd3NnaXJlZi9zaW1wbGVfc2VydmVyLnB5IGIvTGliL3dzZ2lyZWYvc2ltcGxlX3NlcnZlci5weQppbmRleCBlNmEzODViLi4xMjExOWVhIDEwMDY0NAotLS0gYS9MaWIvd3NnaXJlZi9zaW1wbGVfc2VydmVyLnB5CisrKyBiL0xpYi93c2dpcmVmL3NpbXBsZV9zZXJ2ZXIucHkKQEAgLTE1MywzICsxNTMsNCBAQAogICAgIGltcG9ydCB3ZWJicm93c2VyCiAgICAgd2ViYnJvd3Nlci5vcGVuKCdodHRwOi8vbG9jYWxob3N0OjgwMDAveHl6P2FiYycpCiAgICAgaHR0cGQuaGFuZGxlX3JlcXVlc3QoKSAgIyBzZXJ2ZSBvbmUgcmVxdWVzdCwgdGhlbiBleGl0CisgICAgaHR0cGQuc2VydmVyX2Nsb3NlKCkKZGlmZiAtLWdpdCBhL0xpYi93c2dpcmVmL3ZhbGlkYXRlLnB5IGIvTGliL3dzZ2lyZWYvdmFsaWRhdGUucHkKaW5kZXggNDM3ODRmOS4uMDRhODkzZCAxMDA2NDQKLS0tIGEvTGliL3dzZ2lyZWYvdmFsaWRhdGUucHkKKysrIGIvTGliL3dzZ2lyZWYvdmFsaWRhdGUucHkKQEAgLTEzNCw5ICsxMzQsOSBAQAogICAgIFdoZW4gYXBwbGllZCBiZXR3ZWVuIGEgV1NHSSBzZXJ2ZXIgYW5kIGEgV1NHSSBhcHBsaWNhdGlvbiwgdGhpcwogICAgIG1pZGRsZXdhcmUgd2lsbCBjaGVjayBmb3IgV1NHSSBjb21wbGlhbmN5IG9uIGEgbnVtYmVyIG9mIGxldmVscy4KICAgICBUaGlzIG1pZGRsZXdhcmUgZG9lcyBub3QgbW9kaWZ5IHRoZSByZXF1ZXN0IG9yIHJlc3BvbnNlIGluIGFueQotICAgIHdheSwgYnV0IHdpbGwgdGhyb3cgYW4gQXNzZXJ0aW9uRXJyb3IgaWYgYW55dGhpbmcgc2VlbXMgb2ZmCisgICAgd2F5LCBidXQgd2lsbCByYWlzZSBhbiBBc3NlcnRpb25FcnJvciBpZiBhbnl0aGluZyBzZWVtcyBvZmYKICAgICAoZXhjZXB0IGZvciBhIGZhaWx1cmUgdG8gY2xvc2UgdGhlIGFwcGxpY2F0aW9uIGl0ZXJhdG9yLCB3aGljaAotICAgIHdpbGwgYmUgcHJpbnRlZCB0byBzdGRlcnIgLS0gdGhlcmUncyBubyB3YXkgdG8gdGhyb3cgYW4gZXhjZXB0aW9uCisgICAgd2lsbCBiZSBwcmludGVkIHRvIHN0ZGVyciAtLSB0aGVyZSdzIG5vIHdheSB0byByYWlzZSBhbiBleGNlcHRpb24KICAgICBhdCB0aGF0IHBvaW50KS4KICAgICAiIiIKIApkaWZmIC0tZ2l0IGEvTGliL3htbC9kb20vbWluaWRvbS5weSBiL0xpYi94bWwvZG9tL21pbmlkb20ucHkKaW5kZXggN2UyODk4Yy4uYzMwZTI0NiAxMDA2NDQKLS0tIGEvTGliL3htbC9kb20vbWluaWRvbS5weQorKysgYi9MaWIveG1sL2RvbS9taW5pZG9tLnB5CkBAIC0xLDUgKzEsNiBAQAotIiIiXAotbWluaWRvbS5weSAtLSBhIGxpZ2h0d2VpZ2h0IERPTSBpbXBsZW1lbnRhdGlvbi4KKyIiIlNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTGV2ZWwgMSBET00uCisKK05hbWVzcGFjZXMgYW5kIG90aGVyIG1pbm9yIExldmVsIDIgZmVhdHVyZXMgYXJlIGFsc28gc3VwcG9ydGVkLgogCiBwYXJzZSgiZm9vLnhtbCIpCiAKQEAgLTM1Nyw5ICszNTgsNiBAQAogICAgIGRlZiBfZ2V0X2xvY2FsTmFtZShzZWxmKToKICAgICAgICAgcmV0dXJuIHNlbGYubm9kZU5hbWUuc3BsaXQoIjoiLCAxKVstMV0KIAotICAgIGRlZiBfZ2V0X25hbWUoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLm5hbWUKLQogICAgIGRlZiBfZ2V0X3NwZWNpZmllZChzZWxmKToKICAgICAgICAgcmV0dXJuIHNlbGYuc3BlY2lmaWVkCiAKZGlmZiAtLWdpdCBhL0xpYi94bWwvZXRyZWUvRWxlbWVudEluY2x1ZGUucHkgYi9MaWIveG1sL2V0cmVlL0VsZW1lbnRJbmNsdWRlLnB5CmluZGV4IDg0ZmQ3NTQuLjdlMjkxMTkgMTAwNjQ0Ci0tLSBhL0xpYi94bWwvZXRyZWUvRWxlbWVudEluY2x1ZGUucHkKKysrIGIvTGliL3htbC9ldHJlZS9FbGVtZW50SW5jbHVkZS5weQpAQCAtNzUsMTQgKzc1LDEzIEBACiAjIEB0aHJvd3MgSU9FcnJvciBJZiB0aGUgbG9hZGVyIGZhaWxzIHRvIGxvYWQgdGhlIHJlc291cmNlLgogCiBkZWYgZGVmYXVsdF9sb2FkZXIoaHJlZiwgcGFyc2UsIGVuY29kaW5nPU5vbmUpOgotICAgIGZpbGUgPSBvcGVuKGhyZWYpCi0gICAgaWYgcGFyc2UgPT0gInhtbCI6Ci0gICAgICAgIGRhdGEgPSBFbGVtZW50VHJlZS5wYXJzZShmaWxlKS5nZXRyb290KCkKLSAgICBlbHNlOgotICAgICAgICBkYXRhID0gZmlsZS5yZWFkKCkKLSAgICAgICAgaWYgZW5jb2Rpbmc6Ci0gICAgICAgICAgICBkYXRhID0gZGF0YS5kZWNvZGUoZW5jb2RpbmcpCi0gICAgZmlsZS5jbG9zZSgpCisgICAgd2l0aCBvcGVuKGhyZWYpIGFzIGZpbGU6CisgICAgICAgIGlmIHBhcnNlID09ICJ4bWwiOgorICAgICAgICAgICAgZGF0YSA9IEVsZW1lbnRUcmVlLnBhcnNlKGZpbGUpLmdldHJvb3QoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGF0YSA9IGZpbGUucmVhZCgpCisgICAgICAgICAgICBpZiBlbmNvZGluZzoKKyAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5kZWNvZGUoZW5jb2RpbmcpCiAgICAgcmV0dXJuIGRhdGEKIAogIyMKZGlmZiAtLWdpdCBhL0xpYi94bWwvZXRyZWUvRWxlbWVudFRyZWUucHkgYi9MaWIveG1sL2V0cmVlL0VsZW1lbnRUcmVlLnB5CmluZGV4IDJiMGNmMGMuLjlmM2U3NWQgMTAwNjQ0Ci0tLSBhL0xpYi94bWwvZXRyZWUvRWxlbWVudFRyZWUucHkKKysrIGIvTGliL3htbC9ldHJlZS9FbGVtZW50VHJlZS5weQpAQCAtNjgzLDggKzY4Myw4IEBACiAgICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcih0YWcpKQogCiAgICAgIyMKLSAgICAjIEZpbmRzIHRoZSBmaXJzdCB0b3BsZXZlbCBlbGVtZW50IHdpdGggZ2l2ZW4gdGFnLgotICAgICMgU2FtZSBhcyBnZXRyb290KCkuZmluZChwYXRoKS4KKyAgICAjIFNhbWUgYXMgZ2V0cm9vdCgpLmZpbmQocGF0aCksIHN0YXJ0aW5nIGF0IHRoZSByb290IG9mIHRoZQorICAgICMgdHJlZS4KICAgICAjCiAgICAgIyBAcGFyYW0gcGF0aCBXaGF0IGVsZW1lbnQgdG8gbG9vayBmb3IuCiAgICAgIyBAa2V5cGFyYW0gbmFtZXNwYWNlcyBPcHRpb25hbCBuYW1lc3BhY2UgcHJlZml4IG1hcC4KQEAgLTcwNCwxMCArNzA0LDkgQEAKICAgICAgICAgcmV0dXJuIHNlbGYuX3Jvb3QuZmluZChwYXRoLCBuYW1lc3BhY2VzKQogCiAgICAgIyMKLSAgICAjIEZpbmRzIHRoZSBlbGVtZW50IHRleHQgZm9yIHRoZSBmaXJzdCB0b3BsZXZlbCBlbGVtZW50IHdpdGggZ2l2ZW4KLSAgICAjIHRhZy4gIFNhbWUgYXMgZ2V0cm9vdCgpLmZpbmR0ZXh0KHBhdGgpLgorICAgICMgU2FtZSBhcyBnZXRyb290KCkuZmluZHRleHQocGF0aCksIHN0YXJ0aW5nIGF0IHRoZSByb290IG9mIHRoZSB0cmVlLgogICAgICMKLSAgICAjIEBwYXJhbSBwYXRoIFdoYXQgdG9wbGV2ZWwgZWxlbWVudCB0byBsb29rIGZvci4KKyAgICAjIEBwYXJhbSBwYXRoIFdoYXQgZWxlbWVudCB0byBsb29rIGZvci4KICAgICAjIEBwYXJhbSBkZWZhdWx0IFdoYXQgdG8gcmV0dXJuIGlmIHRoZSBlbGVtZW50IHdhcyBub3QgZm91bmQuCiAgICAgIyBAa2V5cGFyYW0gbmFtZXNwYWNlcyBPcHRpb25hbCBuYW1lc3BhY2UgcHJlZml4IG1hcC4KICAgICAjIEByZXR1cm4gVGhlIHRleHQgY29udGVudCBvZiB0aGUgZmlyc3QgbWF0Y2hpbmcgZWxlbWVudCwgb3IgdGhlCkBAIC03MjksOCArNzI4LDcgQEAKICAgICAgICAgcmV0dXJuIHNlbGYuX3Jvb3QuZmluZHRleHQocGF0aCwgZGVmYXVsdCwgbmFtZXNwYWNlcykKIAogICAgICMjCi0gICAgIyBGaW5kcyBhbGwgdG9wbGV2ZWwgZWxlbWVudHMgd2l0aCB0aGUgZ2l2ZW4gdGFnLgotICAgICMgU2FtZSBhcyBnZXRyb290KCkuZmluZGFsbChwYXRoKS4KKyAgICAjIFNhbWUgYXMgZ2V0cm9vdCgpLmZpbmRhbGwocGF0aCksIHN0YXJ0aW5nIGF0IHRoZSByb290IG9mIHRoZSB0cmVlLgogICAgICMKICAgICAjIEBwYXJhbSBwYXRoIFdoYXQgZWxlbWVudCB0byBsb29rIGZvci4KICAgICAjIEBrZXlwYXJhbSBuYW1lc3BhY2VzIE9wdGlvbmFsIG5hbWVzcGFjZSBwcmVmaXggbWFwLgpAQCAtNzc5LDExICs3NzcsMTIgQEAKICAgICAjIEBwYXJhbSBmaWxlIEEgZmlsZSBuYW1lLCBvciBhIGZpbGUgb2JqZWN0IG9wZW5lZCBmb3Igd3JpdGluZy4KICAgICAjIEBwYXJhbSAqKm9wdGlvbnMgT3B0aW9ucywgZ2l2ZW4gYXMga2V5d29yZCBhcmd1bWVudHMuCiAgICAgIyBAa2V5cGFyYW0gZW5jb2RpbmcgT3B0aW9uYWwgb3V0cHV0IGVuY29kaW5nIChkZWZhdWx0IGlzIFVTLUFTQ0lJKS4KLSAgICAjIEBrZXlwYXJhbSBtZXRob2QgT3B0aW9uYWwgb3V0cHV0IG1ldGhvZCAoInhtbCIsICJodG1sIiwgInRleHQiIG9yCi0gICAgIyAgICAgImMxNG4iOyBkZWZhdWx0IGlzICJ4bWwiKS4KICAgICAjIEBrZXlwYXJhbSB4bWxfZGVjbGFyYXRpb24gQ29udHJvbHMgaWYgYW4gWE1MIGRlY2xhcmF0aW9uIHNob3VsZAogICAgICMgICAgIGJlIGFkZGVkIHRvIHRoZSBmaWxlLiAgVXNlIEZhbHNlIGZvciBuZXZlciwgVHJ1ZSBmb3IgYWx3YXlzLAogICAgICMgICAgIE5vbmUgZm9yIG9ubHkgaWYgbm90IFVTLUFTQ0lJIG9yIFVURi04LiAgTm9uZSBpcyBkZWZhdWx0LgorICAgICMgQGtleXBhcmFtIGRlZmF1bHRfbmFtZXNwYWNlIFNldHMgdGhlIGRlZmF1bHQgWE1MIG5hbWVzcGFjZSAoZm9yICJ4bWxucyIpLgorICAgICMgQGtleXBhcmFtIG1ldGhvZCBPcHRpb25hbCBvdXRwdXQgbWV0aG9kICgieG1sIiwgImh0bWwiLCAidGV4dCIgb3IKKyAgICAjICAgICAiYzE0biI7IGRlZmF1bHQgaXMgInhtbCIpLgogCiAgICAgZGVmIHdyaXRlKHNlbGYsIGZpbGVfb3JfZmlsZW5hbWUsCiAgICAgICAgICAgICAgICMga2V5d29yZCBhcmd1bWVudHMKQEAgLTk0NSw3ICs5NDQsNyBAQAogICAgICAgICB3cml0ZShfZXNjYXBlX2NkYXRhKGVsZW0udGFpbCwgZW5jb2RpbmcpKQogCiBIVE1MX0VNUFRZID0gKCJhcmVhIiwgImJhc2UiLCAiYmFzZWZvbnQiLCAiYnIiLCAiY29sIiwgImZyYW1lIiwgImhyIiwKLSAgICAgICAgICAgICAgImltZyIsICJpbnB1dCIsICJpc2luZGV4IiwgImxpbmsiLCAibWV0YSIgInBhcmFtIikKKyAgICAgICAgICAgICAgImltZyIsICJpbnB1dCIsICJpc2luZGV4IiwgImxpbmsiLCAibWV0YSIsICJwYXJhbSIpCiAKIHRyeToKICAgICBIVE1MX0VNUFRZID0gc2V0KEhUTUxfRU1QVFkpCkBAIC05ODksMTUgKzk4OCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAjIEZJWE1FOiBoYW5kbGUgYm9vbGVhbiBhdHRyaWJ1dGVzCiAgICAgICAgICAgICAgICAgICAgIHdyaXRlKCIgJXM9XCIlc1wiIiAlIChxbmFtZXNba10sIHYpKQogICAgICAgICAgICAgd3JpdGUoIj4iKQotICAgICAgICAgICAgdGFnID0gdGFnLmxvd2VyKCkKKyAgICAgICAgICAgIGx0YWcgPSB0YWcubG93ZXIoKQogICAgICAgICAgICAgaWYgdGV4dDoKLSAgICAgICAgICAgICAgICBpZiB0YWcgPT0gInNjcmlwdCIgb3IgdGFnID09ICJzdHlsZSI6CisgICAgICAgICAgICAgICAgaWYgbHRhZyA9PSAic2NyaXB0IiBvciBsdGFnID09ICJzdHlsZSI6CiAgICAgICAgICAgICAgICAgICAgIHdyaXRlKF9lbmNvZGUodGV4dCwgZW5jb2RpbmcpKQogICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIHdyaXRlKF9lc2NhcGVfY2RhdGEodGV4dCwgZW5jb2RpbmcpKQogICAgICAgICAgICAgZm9yIGUgaW4gZWxlbToKICAgICAgICAgICAgICAgICBfc2VyaWFsaXplX2h0bWwod3JpdGUsIGUsIGVuY29kaW5nLCBxbmFtZXMsIE5vbmUpCi0gICAgICAgICAgICBpZiB0YWcgbm90IGluIEhUTUxfRU1QVFk6CisgICAgICAgICAgICBpZiBsdGFnIG5vdCBpbiBIVE1MX0VNUFRZOgogICAgICAgICAgICAgICAgIHdyaXRlKCI8LyIgKyB0YWcgKyAiPiIpCiAgICAgaWYgZWxlbS50YWlsOgogICAgICAgICB3cml0ZShfZXNjYXBlX2NkYXRhKGVsZW0udGFpbCwgZW5jb2RpbmcpKQpkaWZmIC0tZ2l0IGEvTGliL3htbC9zYXgvX2V4Y2VwdGlvbnMucHkgYi9MaWIveG1sL3NheC9fZXhjZXB0aW9ucy5weQppbmRleCBmZGQ2MTRhLi5hOWIyYmEzIDEwMDY0NAotLS0gYS9MaWIveG1sL3NheC9fZXhjZXB0aW9ucy5weQorKysgYi9MaWIveG1sL3NheC9fZXhjZXB0aW9ucy5weQpAQCAtMTIsNyArMTIsNyBAQAogICAgIHRoZSBhcHBsaWNhdGlvbjogeW91IGNhbiBzdWJjbGFzcyBpdCB0byBwcm92aWRlIGFkZGl0aW9uYWwKICAgICBmdW5jdGlvbmFsaXR5LCBvciB0byBhZGQgbG9jYWxpemF0aW9uLiBOb3RlIHRoYXQgYWx0aG91Z2ggeW91IHdpbGwKICAgICByZWNlaXZlIGEgU0FYRXhjZXB0aW9uIGFzIHRoZSBhcmd1bWVudCB0byB0aGUgaGFuZGxlcnMgaW4gdGhlCi0gICAgRXJyb3JIYW5kbGVyIGludGVyZmFjZSwgeW91IGFyZSBub3QgYWN0dWFsbHkgcmVxdWlyZWQgdG8gdGhyb3cKKyAgICBFcnJvckhhbmRsZXIgaW50ZXJmYWNlLCB5b3UgYXJlIG5vdCBhY3R1YWxseSByZXF1aXJlZCB0byByYWlzZQogICAgIHRoZSBleGNlcHRpb247IGluc3RlYWQsIHlvdSBjYW4gc2ltcGx5IHJlYWQgdGhlIGluZm9ybWF0aW9uIGluCiAgICAgaXQuIiIiCiAKQEAgLTUwLDcgKzUwLDcgQEAKICAgICB0aGUgb3JpZ2luYWwgWE1MIGRvY3VtZW50LiBOb3RlIHRoYXQgYWx0aG91Z2ggdGhlIGFwcGxpY2F0aW9uIHdpbGwKICAgICByZWNlaXZlIGEgU0FYUGFyc2VFeGNlcHRpb24gYXMgdGhlIGFyZ3VtZW50IHRvIHRoZSBoYW5kbGVycyBpbiB0aGUKICAgICBFcnJvckhhbmRsZXIgaW50ZXJmYWNlLCB0aGUgYXBwbGljYXRpb24gaXMgbm90IGFjdHVhbGx5IHJlcXVpcmVkCi0gICAgdG8gdGhyb3cgdGhlIGV4Y2VwdGlvbjsgaW5zdGVhZCwgaXQgY2FuIHNpbXBseSByZWFkIHRoZQorICAgIHRvIHJhaXNlIHRoZSBleGNlcHRpb247IGluc3RlYWQsIGl0IGNhbiBzaW1wbHkgcmVhZCB0aGUKICAgICBpbmZvcm1hdGlvbiBpbiBpdCBhbmQgdGFrZSBhIGRpZmZlcmVudCBhY3Rpb24uCiAKICAgICBTaW5jZSB0aGlzIGV4Y2VwdGlvbiBpcyBhIHN1YmNsYXNzIG9mIFNBWEV4Y2VwdGlvbiwgaXQgaW5oZXJpdHMKQEAgLTYyLDcgKzYyLDcgQEAKICAgICAgICAgc2VsZi5fbG9jYXRvciA9IGxvY2F0b3IKIAogICAgICAgICAjIFdlIG5lZWQgdG8gY2FjaGUgdGhpcyBzdHVmZiBhdCBjb25zdHJ1Y3Rpb24gdGltZS4KLSAgICAgICAgIyBJZiB0aGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoZSBvYmplY3RzIHRocm91Z2ggd2hpY2ggd2UgbXVzdAorICAgICAgICAjIElmIHRoaXMgZXhjZXB0aW9uIGlzIHJhaXNlZCwgdGhlIG9iamVjdHMgdGhyb3VnaCB3aGljaCB3ZSBtdXN0CiAgICAgICAgICMgdHJhdmVyc2UgdG8gZ2V0IHRoaXMgaW5mb3JtYXRpb24gbWF5IGJlIGRlbGV0ZWQgYnkgdGhlIHRpbWUKICAgICAgICAgIyBpdCBnZXRzIGNhdWdodC4KICAgICAgICAgc2VsZi5fc3lzdGVtSWQgPSBzZWxmLl9sb2NhdG9yLmdldFN5c3RlbUlkKCkKZGlmZiAtLWdpdCBhL0xpYi94bWwvc2F4L2V4cGF0cmVhZGVyLnB5IGIvTGliL3htbC9zYXgvZXhwYXRyZWFkZXIucHkKaW5kZXggOTJhNzljMS4uOWRlM2U3MiAxMDA2NDQKLS0tIGEvTGliL3htbC9zYXgvZXhwYXRyZWFkZXIucHkKKysrIGIvTGliL3htbC9zYXgvZXhwYXRyZWFkZXIucHkKQEAgLTEwOCw3ICsxMDgsMTAgQEAKIAogICAgIGRlZiBwcmVwYXJlUGFyc2VyKHNlbGYsIHNvdXJjZSk6CiAgICAgICAgIGlmIHNvdXJjZS5nZXRTeXN0ZW1JZCgpIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2VsZi5fcGFyc2VyLlNldEJhc2Uoc291cmNlLmdldFN5c3RlbUlkKCkpCisgICAgICAgICAgICBiYXNlID0gc291cmNlLmdldFN5c3RlbUlkKCkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYmFzZSwgdW5pY29kZSk6CisgICAgICAgICAgICAgICAgYmFzZSA9IGJhc2UuZW5jb2RlKCd1dGYtOCcpCisgICAgICAgICAgICBzZWxmLl9wYXJzZXIuU2V0QmFzZShiYXNlKQogCiAgICAgIyBSZWRlZmluZWQgc2V0Q29udGVudEhhbmRsZXIgdG8gYWxsb3cgY2hhbmdpbmcgaGFuZGxlcnMgZHVyaW5nIHBhcnNpbmcKIApkaWZmIC0tZ2l0IGEvTGliL3htbC9zYXgvc2F4dXRpbHMucHkgYi9MaWIveG1sL3NheC9zYXh1dGlscy5weQppbmRleCA5N2Q2NWQ4Li4xYjg5ZTMxIDEwMDY0NAotLS0gYS9MaWIveG1sL3NheC9zYXh1dGlscy5weQorKysgYi9MaWIveG1sL3NheC9zYXh1dGlscy5weQpAQCAtNCw2ICs0LDggQEAKICIiIgogCiBpbXBvcnQgb3MsIHVybHBhcnNlLCB1cmxsaWIsIHR5cGVzCitpbXBvcnQgaW8KK2ltcG9ydCBzeXMKIGltcG9ydCBoYW5kbGVyCiBpbXBvcnQgeG1scmVhZGVyCiAKQEAgLTEyLDE1ICsxNCw2IEBACiBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgX1N0cmluZ1R5cGVzID0gW3R5cGVzLlN0cmluZ1R5cGVdCiAKLSMgU2VlIHdoZXRoZXIgdGhlIHhtbGNoYXJyZWZyZXBsYWNlIGVycm9yIGhhbmRsZXIgaXMKLSMgc3VwcG9ydGVkCi10cnk6Ci0gICAgZnJvbSBjb2RlY3MgaW1wb3J0IHhtbGNoYXJyZWZyZXBsYWNlX2Vycm9ycwotICAgIF9lcnJvcl9oYW5kbGluZyA9ICJ4bWxjaGFycmVmcmVwbGFjZSIKLSAgICBkZWwgeG1sY2hhcnJlZnJlcGxhY2VfZXJyb3JzCi1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgX2Vycm9yX2hhbmRsaW5nID0gInN0cmljdCIKLQogZGVmIF9fZGljdF9yZXBsYWNlKHMsIGQpOgogICAgICIiIlJlcGxhY2Ugc3Vic3RyaW5ncyBvZiBhIHN0cmluZyB1c2luZyBhIGRpY3Rpb25hcnkuIiIiCiAgICAgZm9yIGtleSwgdmFsdWUgaW4gZC5pdGVtcygpOgpAQCAtODEsMjUgKzc0LDUzIEBACiAgICAgcmV0dXJuIGRhdGEKIAogCitkZWYgX2dldHRleHR3cml0ZXIob3V0LCBlbmNvZGluZyk6CisgICAgaWYgb3V0IGlzIE5vbmU6CisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgb3V0ID0gc3lzLnN0ZG91dAorCisgICAgaWYgaXNpbnN0YW5jZShvdXQsIGlvLlJhd0lPQmFzZSk6CisgICAgICAgIGJ1ZmZlciA9IGlvLkJ1ZmZlcmVkSU9CYXNlKG91dCkKKyAgICAgICAgIyBLZWVwIHRoZSBvcmlnaW5hbCBmaWxlIG9wZW4gd2hlbiB0aGUgVGV4dElPV3JhcHBlciBpcworICAgICAgICAjIGRlc3Ryb3llZAorICAgICAgICBidWZmZXIuY2xvc2UgPSBsYW1iZGE6IE5vbmUKKyAgICBlbHNlOgorICAgICAgICAjIFRoaXMgaXMgdG8gaGFuZGxlIHBhc3NlZCBvYmplY3RzIHRoYXQgYXJlbid0IGluIHRoZQorICAgICAgICAjIElPQmFzZSBoaWVyYXJjaHksIGJ1dCBqdXN0IGhhdmUgYSB3cml0ZSBtZXRob2QKKyAgICAgICAgYnVmZmVyID0gaW8uQnVmZmVyZWRJT0Jhc2UoKQorICAgICAgICBidWZmZXIud3JpdGFibGUgPSBsYW1iZGE6IFRydWUKKyAgICAgICAgYnVmZmVyLndyaXRlID0gb3V0LndyaXRlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgVGV4dElPV3JhcHBlciB1c2VzIHRoaXMgbWV0aG9kcyB0byBkZXRlcm1pbmUKKyAgICAgICAgICAgICMgaWYgQk9NIChmb3IgVVRGLTE2LCBldGMpIHNob3VsZCBiZSBhZGRlZAorICAgICAgICAgICAgYnVmZmVyLnNlZWthYmxlID0gb3V0LnNlZWthYmxlCisgICAgICAgICAgICBidWZmZXIudGVsbCA9IG91dC50ZWxsCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAjIHdyYXAgYSBiaW5hcnkgd3JpdGVyIHdpdGggVGV4dElPV3JhcHBlcgorICAgIHJldHVybiBfVW5idWZmZXJlZFRleHRJT1dyYXBwZXIoYnVmZmVyLCBlbmNvZGluZz1lbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzPSd4bWxjaGFycmVmcmVwbGFjZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2xpbmU9J1xuJykKKworCitjbGFzcyBfVW5idWZmZXJlZFRleHRJT1dyYXBwZXIoaW8uVGV4dElPV3JhcHBlcik6CisgICAgZGVmIHdyaXRlKHNlbGYsIHMpOgorICAgICAgICBzdXBlcihfVW5idWZmZXJlZFRleHRJT1dyYXBwZXIsIHNlbGYpLndyaXRlKHMpCisgICAgICAgIHNlbGYuZmx1c2goKQorCisKIGNsYXNzIFhNTEdlbmVyYXRvcihoYW5kbGVyLkNvbnRlbnRIYW5kbGVyKToKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvdXQ9Tm9uZSwgZW5jb2Rpbmc9Imlzby04ODU5LTEiKToKLSAgICAgICAgaWYgb3V0IGlzIE5vbmU6Ci0gICAgICAgICAgICBpbXBvcnQgc3lzCi0gICAgICAgICAgICBvdXQgPSBzeXMuc3Rkb3V0CiAgICAgICAgIGhhbmRsZXIuQ29udGVudEhhbmRsZXIuX19pbml0X18oc2VsZikKLSAgICAgICAgc2VsZi5fb3V0ID0gb3V0CisgICAgICAgIG91dCA9IF9nZXR0ZXh0d3JpdGVyKG91dCwgZW5jb2RpbmcpCisgICAgICAgIHNlbGYuX3dyaXRlID0gb3V0LndyaXRlCisgICAgICAgIHNlbGYuX2ZsdXNoID0gb3V0LmZsdXNoCiAgICAgICAgIHNlbGYuX25zX2NvbnRleHRzID0gW3t9XSAjIGNvbnRhaW5zIHVyaSAtPiBwcmVmaXggZGljdHMKICAgICAgICAgc2VsZi5fY3VycmVudF9jb250ZXh0ID0gc2VsZi5fbnNfY29udGV4dHNbLTFdCiAgICAgICAgIHNlbGYuX3VuZGVjbGFyZWRfbnNfbWFwcyA9IFtdCiAgICAgICAgIHNlbGYuX2VuY29kaW5nID0gZW5jb2RpbmcKIAotICAgIGRlZiBfd3JpdGUoc2VsZiwgdGV4dCk6Ci0gICAgICAgIGlmIGlzaW5zdGFuY2UodGV4dCwgc3RyKToKLSAgICAgICAgICAgIHNlbGYuX291dC53cml0ZSh0ZXh0KQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5fb3V0LndyaXRlKHRleHQuZW5jb2RlKHNlbGYuX2VuY29kaW5nLCBfZXJyb3JfaGFuZGxpbmcpKQotCiAgICAgZGVmIF9xbmFtZShzZWxmLCBuYW1lKToKICAgICAgICAgIiIiQnVpbGRzIGEgcXVhbGlmaWVkIG5hbWUgZnJvbSBhIChuc191cmwsIGxvY2FsbmFtZSkgcGFpciIiIgogICAgICAgICBpZiBuYW1lWzBdOgpAQCAtMTIwLDkgKzE0MSwxMiBAQAogICAgICMgQ29udGVudEhhbmRsZXIgbWV0aG9kcwogCiAgICAgZGVmIHN0YXJ0RG9jdW1lbnQoc2VsZik6Ci0gICAgICAgIHNlbGYuX3dyaXRlKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSIlcyI/PlxuJyAlCisgICAgICAgIHNlbGYuX3dyaXRlKHUnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iJXMiPz5cbicgJQogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZW5jb2RpbmcpCiAKKyAgICBkZWYgZW5kRG9jdW1lbnQoc2VsZik6CisgICAgICAgIHNlbGYuX2ZsdXNoKCkKKwogICAgIGRlZiBzdGFydFByZWZpeE1hcHBpbmcoc2VsZiwgcHJlZml4LCB1cmkpOgogICAgICAgICBzZWxmLl9uc19jb250ZXh0cy5hcHBlbmQoc2VsZi5fY3VycmVudF9jb250ZXh0LmNvcHkoKSkKICAgICAgICAgc2VsZi5fY3VycmVudF9jb250ZXh0W3VyaV0gPSBwcmVmaXgKQEAgLTEzMywzOSArMTU3LDQzIEBACiAgICAgICAgIGRlbCBzZWxmLl9uc19jb250ZXh0c1stMV0KIAogICAgIGRlZiBzdGFydEVsZW1lbnQoc2VsZiwgbmFtZSwgYXR0cnMpOgotICAgICAgICBzZWxmLl93cml0ZSgnPCcgKyBuYW1lKQorICAgICAgICBzZWxmLl93cml0ZSh1JzwnICsgbmFtZSkKICAgICAgICAgZm9yIChuYW1lLCB2YWx1ZSkgaW4gYXR0cnMuaXRlbXMoKToKLSAgICAgICAgICAgIHNlbGYuX3dyaXRlKCcgJXM9JXMnICUgKG5hbWUsIHF1b3RlYXR0cih2YWx1ZSkpKQotICAgICAgICBzZWxmLl93cml0ZSgnPicpCisgICAgICAgICAgICBzZWxmLl93cml0ZSh1JyAlcz0lcycgJSAobmFtZSwgcXVvdGVhdHRyKHZhbHVlKSkpCisgICAgICAgIHNlbGYuX3dyaXRlKHUnPicpCiAKICAgICBkZWYgZW5kRWxlbWVudChzZWxmLCBuYW1lKToKLSAgICAgICAgc2VsZi5fd3JpdGUoJzwvJXM+JyAlIG5hbWUpCisgICAgICAgIHNlbGYuX3dyaXRlKHUnPC8lcz4nICUgbmFtZSkKIAogICAgIGRlZiBzdGFydEVsZW1lbnROUyhzZWxmLCBuYW1lLCBxbmFtZSwgYXR0cnMpOgotICAgICAgICBzZWxmLl93cml0ZSgnPCcgKyBzZWxmLl9xbmFtZShuYW1lKSkKKyAgICAgICAgc2VsZi5fd3JpdGUodSc8JyArIHNlbGYuX3FuYW1lKG5hbWUpKQogCiAgICAgICAgIGZvciBwcmVmaXgsIHVyaSBpbiBzZWxmLl91bmRlY2xhcmVkX25zX21hcHM6CiAgICAgICAgICAgICBpZiBwcmVmaXg6Ci0gICAgICAgICAgICAgICAgc2VsZi5fb3V0LndyaXRlKCcgeG1sbnM6JXM9IiVzIicgJSAocHJlZml4LCB1cmkpKQorICAgICAgICAgICAgICAgIHNlbGYuX3dyaXRlKHUnIHhtbG5zOiVzPSIlcyInICUgKHByZWZpeCwgdXJpKSkKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5fb3V0LndyaXRlKCcgeG1sbnM9IiVzIicgJSB1cmkpCisgICAgICAgICAgICAgICAgc2VsZi5fd3JpdGUodScgeG1sbnM9IiVzIicgJSB1cmkpCiAgICAgICAgIHNlbGYuX3VuZGVjbGFyZWRfbnNfbWFwcyA9IFtdCiAKICAgICAgICAgZm9yIChuYW1lLCB2YWx1ZSkgaW4gYXR0cnMuaXRlbXMoKToKLSAgICAgICAgICAgIHNlbGYuX3dyaXRlKCcgJXM9JXMnICUgKHNlbGYuX3FuYW1lKG5hbWUpLCBxdW90ZWF0dHIodmFsdWUpKSkKLSAgICAgICAgc2VsZi5fd3JpdGUoJz4nKQorICAgICAgICAgICAgc2VsZi5fd3JpdGUodScgJXM9JXMnICUgKHNlbGYuX3FuYW1lKG5hbWUpLCBxdW90ZWF0dHIodmFsdWUpKSkKKyAgICAgICAgc2VsZi5fd3JpdGUodSc+JykKIAogICAgIGRlZiBlbmRFbGVtZW50TlMoc2VsZiwgbmFtZSwgcW5hbWUpOgotICAgICAgICBzZWxmLl93cml0ZSgnPC8lcz4nICUgc2VsZi5fcW5hbWUobmFtZSkpCisgICAgICAgIHNlbGYuX3dyaXRlKHUnPC8lcz4nICUgc2VsZi5fcW5hbWUobmFtZSkpCiAKICAgICBkZWYgY2hhcmFjdGVycyhzZWxmLCBjb250ZW50KToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY29udGVudCwgdW5pY29kZSk6CisgICAgICAgICAgICBjb250ZW50ID0gdW5pY29kZShjb250ZW50LCBzZWxmLl9lbmNvZGluZykKICAgICAgICAgc2VsZi5fd3JpdGUoZXNjYXBlKGNvbnRlbnQpKQogCiAgICAgZGVmIGlnbm9yYWJsZVdoaXRlc3BhY2Uoc2VsZiwgY29udGVudCk6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGNvbnRlbnQsIHVuaWNvZGUpOgorICAgICAgICAgICAgY29udGVudCA9IHVuaWNvZGUoY29udGVudCwgc2VsZi5fZW5jb2RpbmcpCiAgICAgICAgIHNlbGYuX3dyaXRlKGNvbnRlbnQpCiAKICAgICBkZWYgcHJvY2Vzc2luZ0luc3RydWN0aW9uKHNlbGYsIHRhcmdldCwgZGF0YSk6Ci0gICAgICAgIHNlbGYuX3dyaXRlKCc8PyVzICVzPz4nICUgKHRhcmdldCwgZGF0YSkpCisgICAgICAgIHNlbGYuX3dyaXRlKHUnPD8lcyAlcz8+JyAlICh0YXJnZXQsIGRhdGEpKQogCiAKIGNsYXNzIFhNTEZpbHRlckJhc2UoeG1scmVhZGVyLlhNTFJlYWRlcik6CkBAIC0yOTMsMTQgKzMyMSwzMSBAQAogICAgICAgICAgICAgc291cmNlLnNldFN5c3RlbUlkKGYubmFtZSkKIAogICAgIGlmIHNvdXJjZS5nZXRCeXRlU3RyZWFtKCkgaXMgTm9uZToKLSAgICAgICAgc3lzaWQgPSBzb3VyY2UuZ2V0U3lzdGVtSWQoKQotICAgICAgICBiYXNlaGVhZCA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLm5vcm1wYXRoKGJhc2UpKQotICAgICAgICBzeXNpZGZpbGVuYW1lID0gb3MucGF0aC5qb2luKGJhc2VoZWFkLCBzeXNpZCkKLSAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoc3lzaWRmaWxlbmFtZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5c2lkID0gc291cmNlLmdldFN5c3RlbUlkKCkKKyAgICAgICAgICAgIGJhc2VoZWFkID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGgubm9ybXBhdGgoYmFzZSkpCisgICAgICAgICAgICBlbmNvZGluZyA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzeXNpZCwgdW5pY29kZSk6CisgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYmFzZWhlYWQsIHVuaWNvZGUpOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlaGVhZCA9IGJhc2VoZWFkLmRlY29kZShlbmNvZGluZykKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5c2lkID0gc3lzaWQuZW5jb2RlKGVuY29kaW5nKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGJhc2VoZWFkLCB1bmljb2RlKToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgc3lzaWQgPSBzeXNpZC5kZWNvZGUoZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlaGVhZCA9IGJhc2VoZWFkLmVuY29kZShlbmNvZGluZykKKyAgICAgICAgICAgIHN5c2lkZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oYmFzZWhlYWQsIHN5c2lkKQorICAgICAgICAgICAgaXNmaWxlID0gb3MucGF0aC5pc2ZpbGUoc3lzaWRmaWxlbmFtZSkKKyAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKKyAgICAgICAgICAgIGlzZmlsZSA9IEZhbHNlCisgICAgICAgIGlmIGlzZmlsZToKICAgICAgICAgICAgIHNvdXJjZS5zZXRTeXN0ZW1JZChzeXNpZGZpbGVuYW1lKQogICAgICAgICAgICAgZiA9IG9wZW4oc3lzaWRmaWxlbmFtZSwgInJiIikKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNvdXJjZS5zZXRTeXN0ZW1JZCh1cmxwYXJzZS51cmxqb2luKGJhc2UsIHN5c2lkKSkKKyAgICAgICAgICAgIHNvdXJjZS5zZXRTeXN0ZW1JZCh1cmxwYXJzZS51cmxqb2luKGJhc2UsIHNvdXJjZS5nZXRTeXN0ZW1JZCgpKSkKICAgICAgICAgICAgIGYgPSB1cmxsaWIudXJsb3Blbihzb3VyY2UuZ2V0U3lzdGVtSWQoKSkKIAogICAgICAgICBzb3VyY2Uuc2V0Qnl0ZVN0cmVhbShmKQpkaWZmIC0tZ2l0IGEvTGliL3htbC9zYXgveG1scmVhZGVyLnB5IGIvTGliL3htbC9zYXgveG1scmVhZGVyLnB5CmluZGV4IDQ2ZWUwMmIuLjc0YWEzOWEgMTAwNjQ0Ci0tLSBhL0xpYi94bWwvc2F4L3htbHJlYWRlci5weQorKysgYi9MaWIveG1sL3NheC94bWxyZWFkZXIucHkKQEAgLTY4LDcgKzY4LDcgQEAKIAogICAgICAgICBTQVggcGFyc2VycyBhcmUgbm90IHJlcXVpcmVkIHRvIHByb3ZpZGUgbG9jYWxpemF0aW9uIGZvciBlcnJvcnMKICAgICAgICAgYW5kIHdhcm5pbmdzOyBpZiB0aGV5IGNhbm5vdCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgbG9jYWxlLAotICAgICAgICBob3dldmVyLCB0aGV5IG11c3QgdGhyb3cgYSBTQVggZXhjZXB0aW9uLiBBcHBsaWNhdGlvbnMgbWF5CisgICAgICAgIGhvd2V2ZXIsIHRoZXkgbXVzdCByYWlzZSBhIFNBWCBleGNlcHRpb24uIEFwcGxpY2F0aW9ucyBtYXkKICAgICAgICAgcmVxdWVzdCBhIGxvY2FsZSBjaGFuZ2UgaW4gdGhlIG1pZGRsZSBvZiBhIHBhcnNlLiIiIgogICAgICAgICByYWlzZSBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIkxvY2FsZSBzdXBwb3J0IG5vdCBpbXBsZW1lbnRlZCIpCiAKZGlmZiAtLWdpdCBhL0xpYi94bWxycGNsaWIucHkgYi9MaWIveG1scnBjbGliLnB5CmluZGV4IDY1M2M0MjQuLjFhOGIzZmIgMTAwNjQ0Ci0tLSBhL0xpYi94bWxycGNsaWIucHkKKysrIGIvTGliL3htbHJwY2xpYi5weQpAQCAtOTQ1LDcgKzk0NSw3IEBACiAKIGNsYXNzIE11bHRpQ2FsbEl0ZXJhdG9yOgogICAgICIiIkl0ZXJhdGVzIG92ZXIgdGhlIHJlc3VsdHMgb2YgYSBtdWx0aWNhbGwuIEV4Y2VwdGlvbnMgYXJlCi0gICAgdGhyb3duIGluIHJlc3BvbnNlIHRvIHhtbHJwYyBmYXVsdHMuIiIiCisgICAgcmFpc2VkIGluIHJlc3BvbnNlIHRvIHhtbHJwYyBmYXVsdHMuIiIiCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgcmVzdWx0cyk6CiAgICAgICAgIHNlbGYucmVzdWx0cyA9IHJlc3VsdHMKQEAgLTE2MTcsMjEgKzE2MTcsMTQgQEAKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKIAotICAgICMgc2ltcGxlIHRlc3QgcHJvZ3JhbSAoZnJvbSB0aGUgWE1MLVJQQyBzcGVjaWZpY2F0aW9uKQotCi0gICAgIyBzZXJ2ZXIgPSBTZXJ2ZXJQcm94eSgiaHR0cDovL2xvY2FsaG9zdDo4MDAwIikgIyBsb2NhbCBzZXJ2ZXIKLSAgICBzZXJ2ZXIgPSBTZXJ2ZXJQcm94eSgiaHR0cDovL3RpbWUueG1scnBjLmNvbS9SUEMyIikKKyAgICBzZXJ2ZXIgPSBTZXJ2ZXJQcm94eSgiaHR0cDovL2xvY2FsaG9zdDo4MDAwIikKIAogICAgIHByaW50IHNlcnZlcgogCi0gICAgdHJ5OgotICAgICAgICBwcmludCBzZXJ2ZXIuY3VycmVudFRpbWUuZ2V0Q3VycmVudFRpbWUoKQotICAgIGV4Y2VwdCBFcnJvciwgdjoKLSAgICAgICAgcHJpbnQgIkVSUk9SIiwgdgotCiAgICAgbXVsdGkgPSBNdWx0aUNhbGwoc2VydmVyKQotICAgIG11bHRpLmN1cnJlbnRUaW1lLmdldEN1cnJlbnRUaW1lKCkKLSAgICBtdWx0aS5jdXJyZW50VGltZS5nZXRDdXJyZW50VGltZSgpCisgICAgbXVsdGkucG93KDIsIDkpCisgICAgbXVsdGkuYWRkKDUsIDEpCisgICAgbXVsdGkuYWRkKDI0LCAxMSkKICAgICB0cnk6CiAgICAgICAgIGZvciByZXNwb25zZSBpbiBtdWx0aSgpOgogICAgICAgICAgICAgcHJpbnQgcmVzcG9uc2UKZGlmZiAtLWdpdCBhL0xpYi96aXBmaWxlLnB5IGIvTGliL3ppcGZpbGUucHkKaW5kZXggZDkxODFmMi4uYTBiZWFlMiAxMDA2NDQKLS0tIGEvTGliL3ppcGZpbGUucHkKKysrIGIvTGliL3ppcGZpbGUucHkKQEAgLTUsNiArNSw3IEBACiBpbXBvcnQgYmluYXNjaWksIGNTdHJpbmdJTywgc3RhdAogaW1wb3J0IGlvCiBpbXBvcnQgcmUKK2ltcG9ydCBzdHJpbmcKIAogdHJ5OgogICAgIGltcG9ydCB6bGliICMgV2UgbWF5IG5lZWQgaXRzIGNvbXByZXNzaW9uIG1ldGhvZApAQCAtMTY2LDYgKzE2Nyw4IEBACiAgICAgICAgIHJldHVybiBlbmRyZWMKIAogICAgIGRhdGEgPSBmcGluLnJlYWQoc2l6ZUVuZENlbnREaXI2NExvY2F0b3IpCisgICAgaWYgbGVuKGRhdGEpICE9IHNpemVFbmRDZW50RGlyNjRMb2NhdG9yOgorICAgICAgICByZXR1cm4gZW5kcmVjCiAgICAgc2lnLCBkaXNrbm8sIHJlbG9mZiwgZGlza3MgPSBzdHJ1Y3QudW5wYWNrKHN0cnVjdEVuZEFyY2hpdmU2NExvY2F0b3IsIGRhdGEpCiAgICAgaWYgc2lnICE9IHN0cmluZ0VuZEFyY2hpdmU2NExvY2F0b3I6CiAgICAgICAgIHJldHVybiBlbmRyZWMKQEAgLTE3Niw2ICsxNzksOCBAQAogICAgICMgQXNzdW1lIG5vICd6aXA2NCBleHRlbnNpYmxlIGRhdGEnCiAgICAgZnBpbi5zZWVrKG9mZnNldCAtIHNpemVFbmRDZW50RGlyNjRMb2NhdG9yIC0gc2l6ZUVuZENlbnREaXI2NCwgMikKICAgICBkYXRhID0gZnBpbi5yZWFkKHNpemVFbmRDZW50RGlyNjQpCisgICAgaWYgbGVuKGRhdGEpICE9IHNpemVFbmRDZW50RGlyNjQ6CisgICAgICAgIHJldHVybiBlbmRyZWMKICAgICBzaWcsIHN6LCBjcmVhdGVfdmVyc2lvbiwgcmVhZF92ZXJzaW9uLCBkaXNrX251bSwgZGlza19kaXIsIFwKICAgICAgICAgICAgIGRpcmNvdW50LCBkaXJjb3VudDIsIGRpcnNpemUsIGRpcm9mZnNldCA9IFwKICAgICAgICAgICAgIHN0cnVjdC51bnBhY2soc3RydWN0RW5kQXJjaGl2ZTY0LCBkYXRhKQpAQCAtMjExLDcgKzIxNiw5IEBACiAgICAgZXhjZXB0IElPRXJyb3I6CiAgICAgICAgIHJldHVybiBOb25lCiAgICAgZGF0YSA9IGZwaW4ucmVhZCgpCi0gICAgaWYgZGF0YVswOjRdID09IHN0cmluZ0VuZEFyY2hpdmUgYW5kIGRhdGFbLTI6XSA9PSAiXDAwMFwwMDAiOgorICAgIGlmIChsZW4oZGF0YSkgPT0gc2l6ZUVuZENlbnREaXIgYW5kCisgICAgICAgIGRhdGFbMDo0XSA9PSBzdHJpbmdFbmRBcmNoaXZlIGFuZAorICAgICAgICBkYXRhWy0yOl0gPT0gYiJcMDAwXDAwMCIpOgogICAgICAgICAjIHRoZSBzaWduYXR1cmUgaXMgY29ycmVjdCBhbmQgdGhlcmUncyBubyBjb21tZW50LCB1bnBhY2sgc3RydWN0dXJlCiAgICAgICAgIGVuZHJlYyA9IHN0cnVjdC51bnBhY2soc3RydWN0RW5kQXJjaGl2ZSwgZGF0YSkKICAgICAgICAgZW5kcmVjPWxpc3QoZW5kcmVjKQpAQCAtMjM1LDYgKzI0Miw5IEBACiAgICAgaWYgc3RhcnQgPj0gMDoKICAgICAgICAgIyBmb3VuZCB0aGUgbWFnaWMgbnVtYmVyOyBhdHRlbXB0IHRvIHVucGFjayBhbmQgaW50ZXJwcmV0CiAgICAgICAgIHJlY0RhdGEgPSBkYXRhW3N0YXJ0OnN0YXJ0K3NpemVFbmRDZW50RGlyXQorICAgICAgICBpZiBsZW4ocmVjRGF0YSkgIT0gc2l6ZUVuZENlbnREaXI6CisgICAgICAgICAgICAjIFppcCBmaWxlIGlzIGNvcnJ1cHRlZC4KKyAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgIGVuZHJlYyA9IGxpc3Qoc3RydWN0LnVucGFjayhzdHJ1Y3RFbmRBcmNoaXZlLCByZWNEYXRhKSkKICAgICAgICAgY29tbWVudFNpemUgPSBlbmRyZWNbX0VDRF9DT01NRU5UX1NJWkVdICNhcyBjbGFpbWVkIGJ5IHRoZSB6aXAgZmlsZQogICAgICAgICBjb21tZW50ID0gZGF0YVtzdGFydCtzaXplRW5kQ2VudERpcjpzdGFydCtzaXplRW5kQ2VudERpcitjb21tZW50U2l6ZV0KQEAgLTI0Niw3ICsyNTYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRyZWMpCiAKICAgICAjIFVuYWJsZSB0byBmaW5kIGEgdmFsaWQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IHN0cnVjdHVyZQotICAgIHJldHVybgorICAgIHJldHVybiBOb25lCiAKIAogY2xhc3MgWmlwSW5mbyAob2JqZWN0KToKQEAgLTMxNiw3ICszMjYsNyBAQAogICAgICAgICAjIGNvbXByZXNzX3NpemUgICAgICAgICBTaXplIG9mIHRoZSBjb21wcmVzc2VkIGZpbGUKICAgICAgICAgIyBmaWxlX3NpemUgICAgICAgICAgICAgU2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGZpbGUKIAotICAgIGRlZiBGaWxlSGVhZGVyKHNlbGYpOgorICAgIGRlZiBGaWxlSGVhZGVyKHNlbGYsIHppcDY0PU5vbmUpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIHBlci1maWxlIGhlYWRlciBhcyBhIHN0cmluZy4iIiIKICAgICAgICAgZHQgPSBzZWxmLmRhdGVfdGltZQogICAgICAgICBkb3NkYXRlID0gKGR0WzBdIC0gMTk4MCkgPDwgOSB8IGR0WzFdIDw8IDUgfCBkdFsyXQpAQCAtMzMxLDEyICszNDEsMTcgQEAKIAogICAgICAgICBleHRyYSA9IHNlbGYuZXh0cmEKIAotICAgICAgICBpZiBmaWxlX3NpemUgPiBaSVA2NF9MSU1JVCBvciBjb21wcmVzc19zaXplID4gWklQNjRfTElNSVQ6Ci0gICAgICAgICAgICAjIEZpbGUgaXMgbGFyZ2VyIHRoYW4gd2hhdCBmaXRzIGludG8gYSA0IGJ5dGUgaW50ZWdlciwKLSAgICAgICAgICAgICMgZmFsbCBiYWNrIHRvIHRoZSBaSVA2NCBleHRlbnNpb24KKyAgICAgICAgaWYgemlwNjQgaXMgTm9uZToKKyAgICAgICAgICAgIHppcDY0ID0gZmlsZV9zaXplID4gWklQNjRfTElNSVQgb3IgY29tcHJlc3Nfc2l6ZSA+IFpJUDY0X0xJTUlUCisgICAgICAgIGlmIHppcDY0OgogICAgICAgICAgICAgZm10ID0gJzxISFFRJwogICAgICAgICAgICAgZXh0cmEgPSBleHRyYSArIHN0cnVjdC5wYWNrKGZtdCwKICAgICAgICAgICAgICAgICAgICAgMSwgc3RydWN0LmNhbGNzaXplKGZtdCktNCwgZmlsZV9zaXplLCBjb21wcmVzc19zaXplKQorICAgICAgICBpZiBmaWxlX3NpemUgPiBaSVA2NF9MSU1JVCBvciBjb21wcmVzc19zaXplID4gWklQNjRfTElNSVQ6CisgICAgICAgICAgICBpZiBub3QgemlwNjQ6CisgICAgICAgICAgICAgICAgcmFpc2UgTGFyZ2VaaXBGaWxlKCJGaWxlc2l6ZSB3b3VsZCByZXF1aXJlIFpJUDY0IGV4dGVuc2lvbnMiKQorICAgICAgICAgICAgIyBGaWxlIGlzIGxhcmdlciB0aGFuIHdoYXQgZml0cyBpbnRvIGEgNCBieXRlIGludGVnZXIsCisgICAgICAgICAgICAjIGZhbGwgYmFjayB0byB0aGUgWklQNjQgZXh0ZW5zaW9uCiAgICAgICAgICAgICBmaWxlX3NpemUgPSAweGZmZmZmZmZmCiAgICAgICAgICAgICBjb21wcmVzc19zaXplID0gMHhmZmZmZmZmZgogICAgICAgICAgICAgc2VsZi5leHRyYWN0X3ZlcnNpb24gPSBtYXgoNDUsIHNlbGYuZXh0cmFjdF92ZXJzaW9uKQpAQCAtMzY5LDcgKzM4NCw3IEBACiAgICAgICAgICMgVHJ5IHRvIGRlY29kZSB0aGUgZXh0cmEgZmllbGQuCiAgICAgICAgIGV4dHJhID0gc2VsZi5leHRyYQogICAgICAgICB1bnBhY2sgPSBzdHJ1Y3QudW5wYWNrCi0gICAgICAgIHdoaWxlIGV4dHJhOgorICAgICAgICB3aGlsZSBsZW4oZXh0cmEpID49IDQ6CiAgICAgICAgICAgICB0cCwgbG4gPSB1bnBhY2soJzxISCcsIGV4dHJhWzo0XSkKICAgICAgICAgICAgIGlmIHRwID09IDE6CiAgICAgICAgICAgICAgICAgaWYgbG4gPj0gMjQ6CkBAIC00NjEsNiArNDc2LDI4IEBACiAgICAgICAgIHNlbGYuX1VwZGF0ZUtleXMoYykKICAgICAgICAgcmV0dXJuIGMKIAorCitjb21wcmVzc29yX25hbWVzID0geworICAgIDA6ICdzdG9yZScsCisgICAgMTogJ3NocmluaycsCisgICAgMjogJ3JlZHVjZScsCisgICAgMzogJ3JlZHVjZScsCisgICAgNDogJ3JlZHVjZScsCisgICAgNTogJ3JlZHVjZScsCisgICAgNjogJ2ltcGxvZGUnLAorICAgIDc6ICd0b2tlbml6ZScsCisgICAgODogJ2RlZmxhdGUnLAorICAgIDk6ICdkZWZsYXRlNjQnLAorICAgIDEwOiAnaW1wbG9kZScsCisgICAgMTI6ICdiemlwMicsCisgICAgMTQ6ICdsem1hJywKKyAgICAxODogJ3RlcnNlJywKKyAgICAxOTogJ2x6NzcnLAorICAgIDk3OiAnd2F2cGFjaycsCisgICAgOTg6ICdwcG1kJywKK30KKworCiBjbGFzcyBaaXBFeHRGaWxlKGlvLkJ1ZmZlcmVkSU9CYXNlKToKICAgICAiIiJGaWxlLWxpa2Ugb2JqZWN0IGZvciByZWFkaW5nIGFuIGFyY2hpdmUgbWVtYmVyLgogICAgICAgIElzIHJldHVybmVkIGJ5IFppcEZpbGUub3BlbigpLgpAQCAtNDc1LDkgKzUxMiwxMSBAQAogICAgICMgU2VhcmNoIGZvciB1bml2ZXJzYWwgbmV3bGluZXMgb3IgbGluZSBjaHVua3MuCiAgICAgUEFUVEVSTiA9IHJlLmNvbXBpbGUocideKD9QPGNodW5rPlteXHJcbl0rKXwoP1A8bmV3bGluZT5cbnxcclxuPyknKQogCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVvYmosIG1vZGUsIHppcGluZm8sIGRlY3J5cHRlcj1Ob25lKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW9iaiwgbW9kZSwgemlwaW5mbywgZGVjcnlwdGVyPU5vbmUsCisgICAgICAgICAgICBjbG9zZV9maWxlb2JqPUZhbHNlKToKICAgICAgICAgc2VsZi5fZmlsZW9iaiA9IGZpbGVvYmoKICAgICAgICAgc2VsZi5fZGVjcnlwdGVyID0gZGVjcnlwdGVyCisgICAgICAgIHNlbGYuX2Nsb3NlX2ZpbGVvYmogPSBjbG9zZV9maWxlb2JqCiAKICAgICAgICAgc2VsZi5fY29tcHJlc3NfdHlwZSA9IHppcGluZm8uY29tcHJlc3NfdHlwZQogICAgICAgICBzZWxmLl9jb21wcmVzc19zaXplID0gemlwaW5mby5jb21wcmVzc19zaXplCkBAIC00ODUsNiArNTI0LDEyIEBACiAKICAgICAgICAgaWYgc2VsZi5fY29tcHJlc3NfdHlwZSA9PSBaSVBfREVGTEFURUQ6CiAgICAgICAgICAgICBzZWxmLl9kZWNvbXByZXNzb3IgPSB6bGliLmRlY29tcHJlc3NvYmooLTE1KQorICAgICAgICBlbGlmIHNlbGYuX2NvbXByZXNzX3R5cGUgIT0gWklQX1NUT1JFRDoKKyAgICAgICAgICAgIGRlc2NyID0gY29tcHJlc3Nvcl9uYW1lcy5nZXQoc2VsZi5fY29tcHJlc3NfdHlwZSkKKyAgICAgICAgICAgIGlmIGRlc2NyOgorICAgICAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoImNvbXByZXNzaW9uIHR5cGUgJWQgKCVzKSIgJSAoc2VsZi5fY29tcHJlc3NfdHlwZSwgZGVzY3IpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCJjb21wcmVzc2lvbiB0eXBlICVkIiAlIChzZWxmLl9jb21wcmVzc190eXBlLCkpCiAgICAgICAgIHNlbGYuX3VuY29uc3VtZWQgPSAnJwogCiAgICAgICAgIHNlbGYuX3JlYWRidWZmZXIgPSAnJwpAQCAtNTYxLDcgKzYwNiwxMSBAQAogICAgICAgICAiIiJSZXR1cm5zIGJ1ZmZlcmVkIGJ5dGVzIHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBwb3NpdGlvbi4iIiIKICAgICAgICAgaWYgbiA+IGxlbihzZWxmLl9yZWFkYnVmZmVyKSAtIHNlbGYuX29mZnNldDoKICAgICAgICAgICAgIGNodW5rID0gc2VsZi5yZWFkKG4pCi0gICAgICAgICAgICBzZWxmLl9vZmZzZXQgLT0gbGVuKGNodW5rKQorICAgICAgICAgICAgaWYgbGVuKGNodW5rKSA+IHNlbGYuX29mZnNldDoKKyAgICAgICAgICAgICAgICBzZWxmLl9yZWFkYnVmZmVyID0gY2h1bmsgKyBzZWxmLl9yZWFkYnVmZmVyW3NlbGYuX29mZnNldDpdCisgICAgICAgICAgICAgICAgc2VsZi5fb2Zmc2V0ID0gMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9vZmZzZXQgLT0gbGVuKGNodW5rKQogCiAgICAgICAgICMgUmV0dXJuIHVwIHRvIDUxMiBieXRlcyB0byByZWR1Y2UgYWxsb2NhdGlvbiBvdmVyaGVhZCBmb3IgdGlnaHQgbG9vcHMuCiAgICAgICAgIHJldHVybiBzZWxmLl9yZWFkYnVmZmVyW3NlbGYuX29mZnNldDogc2VsZi5fb2Zmc2V0ICsgNTEyXQpAQCAtNjQ5LDkgKzY5OCwxNSBAQAogICAgICAgICBzZWxmLl9vZmZzZXQgKz0gbGVuKGRhdGEpCiAgICAgICAgIHJldHVybiBkYXRhCiAKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHRyeSA6CisgICAgICAgICAgICBpZiBzZWxmLl9jbG9zZV9maWxlb2JqOgorICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGVvYmouY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3VwZXIoWmlwRXh0RmlsZSwgc2VsZikuY2xvc2UoKQogCiAKLWNsYXNzIFppcEZpbGU6CitjbGFzcyBaaXBGaWxlKG9iamVjdCk6CiAgICAgIiIiIENsYXNzIHdpdGggbWV0aG9kcyB0byBvcGVuLCByZWFkLCB3cml0ZSwgY2xvc2UsIGxpc3QgemlwIGZpbGVzLgogCiAgICAgeiA9IFppcEZpbGUoZmlsZSwgbW9kZT0iciIsIGNvbXByZXNzaW9uPVpJUF9TVE9SRUQsIGFsbG93WmlwNjQ9RmFsc2UpCkBAIC02OTAsNyArNzQ1LDcgQEAKICAgICAgICAgc2VsZi5jb21wcmVzc2lvbiA9IGNvbXByZXNzaW9uICAjIE1ldGhvZCBvZiBjb21wcmVzc2lvbgogICAgICAgICBzZWxmLm1vZGUgPSBrZXkgPSBtb2RlLnJlcGxhY2UoJ2InLCAnJylbMF0KICAgICAgICAgc2VsZi5wd2QgPSBOb25lCi0gICAgICAgIHNlbGYuY29tbWVudCA9ICcnCisgICAgICAgIHNlbGYuX2NvbW1lbnQgPSAnJwogCiAgICAgICAgICMgQ2hlY2sgaWYgd2Ugd2VyZSBwYXNzZWQgYSBmaWxlLWxpa2Ugb2JqZWN0CiAgICAgICAgIGlmIGlzaW5zdGFuY2UoZmlsZSwgYmFzZXN0cmluZyk6CkBAIC03MTAsMzAgKzc2NSwzNCBAQAogICAgICAgICAgICAgc2VsZi5mcCA9IGZpbGUKICAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBnZXRhdHRyKGZpbGUsICduYW1lJywgTm9uZSkKIAotICAgICAgICBpZiBrZXkgPT0gJ3InOgotICAgICAgICAgICAgc2VsZi5fR2V0Q29udGVudHMoKQotICAgICAgICBlbGlmIGtleSA9PSAndyc6Ci0gICAgICAgICAgICAjIHNldCB0aGUgbW9kaWZpZWQgZmxhZyBzbyBjZW50cmFsIGRpcmVjdG9yeSBnZXRzIHdyaXR0ZW4KLSAgICAgICAgICAgICMgZXZlbiBpZiBubyBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIGFyY2hpdmUKLSAgICAgICAgICAgIHNlbGYuX2RpZE1vZGlmeSA9IFRydWUKLSAgICAgICAgZWxpZiBrZXkgPT0gJ2EnOgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICMgU2VlIGlmIGZpbGUgaXMgYSB6aXAgZmlsZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBrZXkgPT0gJ3InOgogICAgICAgICAgICAgICAgIHNlbGYuX1JlYWxHZXRDb250ZW50cygpCi0gICAgICAgICAgICAgICAgIyBzZWVrIHRvIHN0YXJ0IG9mIGRpcmVjdG9yeSBhbmQgb3ZlcndyaXRlCi0gICAgICAgICAgICAgICAgc2VsZi5mcC5zZWVrKHNlbGYuc3RhcnRfZGlyLCAwKQotICAgICAgICAgICAgZXhjZXB0IEJhZFppcGZpbGU6Ci0gICAgICAgICAgICAgICAgIyBmaWxlIGlzIG5vdCBhIHppcCBmaWxlLCBqdXN0IGFwcGVuZAotICAgICAgICAgICAgICAgIHNlbGYuZnAuc2VlaygwLCAyKQotCisgICAgICAgICAgICBlbGlmIGtleSA9PSAndyc6CiAgICAgICAgICAgICAgICAgIyBzZXQgdGhlIG1vZGlmaWVkIGZsYWcgc28gY2VudHJhbCBkaXJlY3RvcnkgZ2V0cyB3cml0dGVuCiAgICAgICAgICAgICAgICAgIyBldmVuIGlmIG5vIGZpbGVzIGFyZSBhZGRlZCB0byB0aGUgYXJjaGl2ZQogICAgICAgICAgICAgICAgIHNlbGYuX2RpZE1vZGlmeSA9IFRydWUKLSAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVsaWYga2V5ID09ICdhJzoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICMgU2VlIGlmIGZpbGUgaXMgYSB6aXAgZmlsZQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9SZWFsR2V0Q29udGVudHMoKQorICAgICAgICAgICAgICAgICAgICAjIHNlZWsgdG8gc3RhcnQgb2YgZGlyZWN0b3J5IGFuZCBvdmVyd3JpdGUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mcC5zZWVrKHNlbGYuc3RhcnRfZGlyLCAwKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBCYWRaaXBmaWxlOgorICAgICAgICAgICAgICAgICAgICAjIGZpbGUgaXMgbm90IGEgemlwIGZpbGUsIGp1c3QgYXBwZW5kCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZnAuc2VlaygwLCAyKQorCisgICAgICAgICAgICAgICAgICAgICMgc2V0IHRoZSBtb2RpZmllZCBmbGFnIHNvIGNlbnRyYWwgZGlyZWN0b3J5IGdldHMgd3JpdHRlbgorICAgICAgICAgICAgICAgICAgICAjIGV2ZW4gaWYgbm8gZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSBhcmNoaXZlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2RpZE1vZGlmeSA9IFRydWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdNb2RlIG11c3QgYmUgInIiLCAidyIgb3IgImEiJykKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgZnAgPSBzZWxmLmZwCisgICAgICAgICAgICBzZWxmLmZwID0gTm9uZQogICAgICAgICAgICAgaWYgbm90IHNlbGYuX2ZpbGVQYXNzZWQ6Ci0gICAgICAgICAgICAgICAgc2VsZi5mcC5jbG9zZSgpCi0gICAgICAgICAgICAgICAgc2VsZi5mcCA9IE5vbmUKLSAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgJ01vZGUgbXVzdCBiZSAiciIsICJ3IiBvciAiYSInCisgICAgICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICAgICAgcmFpc2UKIAogICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgIHJldHVybiBzZWxmCkBAIC03NDEsMTcgKzgwMCw2IEBACiAgICAgZGVmIF9fZXhpdF9fKHNlbGYsIHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOgogICAgICAgICBzZWxmLmNsb3NlKCkKIAotICAgIGRlZiBfR2V0Q29udGVudHMoc2VsZik6Ci0gICAgICAgICIiIlJlYWQgdGhlIGRpcmVjdG9yeSwgbWFraW5nIHN1cmUgd2UgY2xvc2UgdGhlIGZpbGUgaWYgdGhlIGZvcm1hdAotICAgICAgICBpcyBiYWQuIiIiCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuX1JlYWxHZXRDb250ZW50cygpCi0gICAgICAgIGV4Y2VwdCBCYWRaaXBmaWxlOgotICAgICAgICAgICAgaWYgbm90IHNlbGYuX2ZpbGVQYXNzZWQ6Ci0gICAgICAgICAgICAgICAgc2VsZi5mcC5jbG9zZSgpCi0gICAgICAgICAgICAgICAgc2VsZi5mcCA9IE5vbmUKLSAgICAgICAgICAgIHJhaXNlCi0KICAgICBkZWYgX1JlYWxHZXRDb250ZW50cyhzZWxmKToKICAgICAgICAgIiIiUmVhZCBpbiB0aGUgdGFibGUgb2YgY29udGVudHMgZm9yIHRoZSBaSVAgZmlsZS4iIiIKICAgICAgICAgZnAgPSBzZWxmLmZwCkBAIC03NjUsNyArODEzLDcgQEAKICAgICAgICAgICAgIHByaW50IGVuZHJlYwogICAgICAgICBzaXplX2NkID0gZW5kcmVjW19FQ0RfU0laRV0gICAgICAgICAgICAgIyBieXRlcyBpbiBjZW50cmFsIGRpcmVjdG9yeQogICAgICAgICBvZmZzZXRfY2QgPSBlbmRyZWNbX0VDRF9PRkZTRVRdICAgICAgICAgIyBvZmZzZXQgb2YgY2VudHJhbCBkaXJlY3RvcnkKLSAgICAgICAgc2VsZi5jb21tZW50ID0gZW5kcmVjW19FQ0RfQ09NTUVOVF0gICAgICMgYXJjaGl2ZSBjb21tZW50CisgICAgICAgIHNlbGYuX2NvbW1lbnQgPSBlbmRyZWNbX0VDRF9DT01NRU5UXSAgICAjIGFyY2hpdmUgY29tbWVudAogCiAgICAgICAgICMgImNvbmNhdCIgaXMgemVybywgdW5sZXNzIHppcCB3YXMgY29uY2F0ZW5hdGVkIHRvIGFub3RoZXIgZmlsZQogICAgICAgICBjb25jYXQgPSBlbmRyZWNbX0VDRF9MT0NBVElPTl0gLSBzaXplX2NkIC0gb2Zmc2V0X2NkCkBAIC03ODQsOSArODMyLDExIEBACiAgICAgICAgIHRvdGFsID0gMAogICAgICAgICB3aGlsZSB0b3RhbCA8IHNpemVfY2Q6CiAgICAgICAgICAgICBjZW50ZGlyID0gZnAucmVhZChzaXplQ2VudHJhbERpcikKLSAgICAgICAgICAgIGlmIGNlbnRkaXJbMDo0XSAhPSBzdHJpbmdDZW50cmFsRGlyOgotICAgICAgICAgICAgICAgIHJhaXNlIEJhZFppcGZpbGUsICJCYWQgbWFnaWMgbnVtYmVyIGZvciBjZW50cmFsIGRpcmVjdG9yeSIKKyAgICAgICAgICAgIGlmIGxlbihjZW50ZGlyKSAhPSBzaXplQ2VudHJhbERpcjoKKyAgICAgICAgICAgICAgICByYWlzZSBCYWRaaXBmaWxlKCJUcnVuY2F0ZWQgY2VudHJhbCBkaXJlY3RvcnkiKQogICAgICAgICAgICAgY2VudGRpciA9IHN0cnVjdC51bnBhY2soc3RydWN0Q2VudHJhbERpciwgY2VudGRpcikKKyAgICAgICAgICAgIGlmIGNlbnRkaXJbX0NEX1NJR05BVFVSRV0gIT0gc3RyaW5nQ2VudHJhbERpcjoKKyAgICAgICAgICAgICAgICByYWlzZSBCYWRaaXBmaWxlKCJCYWQgbWFnaWMgbnVtYmVyIGZvciBjZW50cmFsIGRpcmVjdG9yeSIpCiAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnID4gMjoKICAgICAgICAgICAgICAgICBwcmludCBjZW50ZGlyCiAgICAgICAgICAgICBmaWxlbmFtZSA9IGZwLnJlYWQoY2VudGRpcltfQ0RfRklMRU5BTUVfTEVOR1RIXSkKQEAgLTg0NSw5ICs4OTUsOSBAQAogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICMgUmVhZCBieSBjaHVua3MsIHRvIGF2b2lkIGFuIE92ZXJmbG93RXJyb3Igb3IgYQogICAgICAgICAgICAgICAgICMgTWVtb3J5RXJyb3Igd2l0aCB2ZXJ5IGxhcmdlIGVtYmVkZGVkIGZpbGVzLgotICAgICAgICAgICAgICAgIGYgPSBzZWxmLm9wZW4oemluZm8uZmlsZW5hbWUsICJyIikKLSAgICAgICAgICAgICAgICB3aGlsZSBmLnJlYWQoY2h1bmtfc2l6ZSk6ICAgICAjIENoZWNrIENSQy0zMgotICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLm9wZW4oemluZm8uZmlsZW5hbWUsICJyIikgYXMgZjoKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgZi5yZWFkKGNodW5rX3NpemUpOiAgICAgIyBDaGVjayBDUkMtMzIKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgIGV4Y2VwdCBCYWRaaXBmaWxlOgogICAgICAgICAgICAgICAgIHJldHVybiB6aW5mby5maWxlbmFtZQogCkBAIC04NjQsNiArOTE0LDIyIEBACiAgICAgICAgICIiIlNldCBkZWZhdWx0IHBhc3N3b3JkIGZvciBlbmNyeXB0ZWQgZmlsZXMuIiIiCiAgICAgICAgIHNlbGYucHdkID0gcHdkCiAKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY29tbWVudChzZWxmKToKKyAgICAgICAgIiIiVGhlIGNvbW1lbnQgdGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIFpJUCBmaWxlLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fY29tbWVudAorCisgICAgQGNvbW1lbnQuc2V0dGVyCisgICAgZGVmIGNvbW1lbnQoc2VsZiwgY29tbWVudCk6CisgICAgICAgICMgY2hlY2sgZm9yIHZhbGlkIGNvbW1lbnQgbGVuZ3RoCisgICAgICAgIGlmIGxlbihjb21tZW50KSA+IFpJUF9NQVhfQ09NTUVOVDoKKyAgICAgICAgICAgIGltcG9ydCB3YXJuaW5ncworICAgICAgICAgICAgd2FybmluZ3Mud2FybignQXJjaGl2ZSBjb21tZW50IGlzIHRvbyBsb25nOyB0cnVuY2F0aW5nIHRvICVkIGJ5dGVzJworICAgICAgICAgICAgICAgICAgICAgICAgICAlIFpJUF9NQVhfQ09NTUVOVCwgc3RhY2tsZXZlbD0yKQorICAgICAgICAgICAgY29tbWVudCA9IGNvbW1lbnRbOlpJUF9NQVhfQ09NTUVOVF0KKyAgICAgICAgc2VsZi5fY29tbWVudCA9IGNvbW1lbnQKKyAgICAgICAgc2VsZi5fZGlkTW9kaWZ5ID0gVHJ1ZQorCiAgICAgZGVmIHJlYWQoc2VsZiwgbmFtZSwgcHdkPU5vbmUpOgogICAgICAgICAiIiJSZXR1cm4gZmlsZSBieXRlcyAoYXMgYSBzdHJpbmcpIGZvciBuYW1lLiIiIgogICAgICAgICByZXR1cm4gc2VsZi5vcGVuKG5hbWUsICJyIiwgcHdkKS5yZWFkKCkKQEAgLTg4MCw2MiArOTQ2LDcyIEBACiAgICAgICAgICMgZ2l2ZW4gYSBmaWxlIG9iamVjdCBpbiB0aGUgY29uc3RydWN0b3IKICAgICAgICAgaWYgc2VsZi5fZmlsZVBhc3NlZDoKICAgICAgICAgICAgIHplZl9maWxlID0gc2VsZi5mcAorICAgICAgICAgICAgc2hvdWxkX2Nsb3NlID0gRmFsc2UKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHplZl9maWxlID0gb3BlbihzZWxmLmZpbGVuYW1lLCAncmInKQorICAgICAgICAgICAgc2hvdWxkX2Nsb3NlID0gVHJ1ZQogCi0gICAgICAgICMgTWFrZSBzdXJlIHdlIGhhdmUgYW4gaW5mbyBvYmplY3QKLSAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lLCBaaXBJbmZvKToKLSAgICAgICAgICAgICMgJ25hbWUnIGlzIGFscmVhZHkgYW4gaW5mbyBvYmplY3QKLSAgICAgICAgICAgIHppbmZvID0gbmFtZQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgIyBHZXQgaW5mbyBvYmplY3QgZm9yIG5hbWUKLSAgICAgICAgICAgIHppbmZvID0gc2VsZi5nZXRpbmZvKG5hbWUpCi0KLSAgICAgICAgemVmX2ZpbGUuc2Vlayh6aW5mby5oZWFkZXJfb2Zmc2V0LCAwKQotCi0gICAgICAgICMgU2tpcCB0aGUgZmlsZSBoZWFkZXI6Ci0gICAgICAgIGZoZWFkZXIgPSB6ZWZfZmlsZS5yZWFkKHNpemVGaWxlSGVhZGVyKQotICAgICAgICBpZiBmaGVhZGVyWzA6NF0gIT0gc3RyaW5nRmlsZUhlYWRlcjoKLSAgICAgICAgICAgIHJhaXNlIEJhZFppcGZpbGUsICJCYWQgbWFnaWMgbnVtYmVyIGZvciBmaWxlIGhlYWRlciIKLQotICAgICAgICBmaGVhZGVyID0gc3RydWN0LnVucGFjayhzdHJ1Y3RGaWxlSGVhZGVyLCBmaGVhZGVyKQotICAgICAgICBmbmFtZSA9IHplZl9maWxlLnJlYWQoZmhlYWRlcltfRkhfRklMRU5BTUVfTEVOR1RIXSkKLSAgICAgICAgaWYgZmhlYWRlcltfRkhfRVhUUkFfRklFTERfTEVOR1RIXToKLSAgICAgICAgICAgIHplZl9maWxlLnJlYWQoZmhlYWRlcltfRkhfRVhUUkFfRklFTERfTEVOR1RIXSkKLQotICAgICAgICBpZiBmbmFtZSAhPSB6aW5mby5vcmlnX2ZpbGVuYW1lOgotICAgICAgICAgICAgcmFpc2UgQmFkWmlwZmlsZSwgXAotICAgICAgICAgICAgICAgICAgICAgICdGaWxlIG5hbWUgaW4gZGlyZWN0b3J5ICIlcyIgYW5kIGhlYWRlciAiJXMiIGRpZmZlci4nICUgKAotICAgICAgICAgICAgICAgICAgICAgICAgICB6aW5mby5vcmlnX2ZpbGVuYW1lLCBmbmFtZSkKLQotICAgICAgICAjIGNoZWNrIGZvciBlbmNyeXB0ZWQgZmxhZyAmIGhhbmRsZSBwYXNzd29yZAotICAgICAgICBpc19lbmNyeXB0ZWQgPSB6aW5mby5mbGFnX2JpdHMgJiAweDEKLSAgICAgICAgemQgPSBOb25lCi0gICAgICAgIGlmIGlzX2VuY3J5cHRlZDoKLSAgICAgICAgICAgIGlmIG5vdCBwd2Q6Ci0gICAgICAgICAgICAgICAgcHdkID0gc2VsZi5wd2QKLSAgICAgICAgICAgIGlmIG5vdCBwd2Q6Ci0gICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiRmlsZSAlcyBpcyBlbmNyeXB0ZWQsICIgXAotICAgICAgICAgICAgICAgICAgICAgICJwYXNzd29yZCByZXF1aXJlZCBmb3IgZXh0cmFjdGlvbiIgJSBuYW1lCi0KLSAgICAgICAgICAgIHpkID0gX1ppcERlY3J5cHRlcihwd2QpCi0gICAgICAgICAgICAjIFRoZSBmaXJzdCAxMiBieXRlcyBpbiB0aGUgY3lwaGVyIHN0cmVhbSBpcyBhbiBlbmNyeXB0aW9uIGhlYWRlcgotICAgICAgICAgICAgIyAgdXNlZCB0byBzdHJlbmd0aGVuIHRoZSBhbGdvcml0aG0uIFRoZSBmaXJzdCAxMSBieXRlcyBhcmUKLSAgICAgICAgICAgICMgIGNvbXBsZXRlbHkgcmFuZG9tLCB3aGlsZSB0aGUgMTJ0aCBjb250YWlucyB0aGUgTVNCIG9mIHRoZSBDUkMsCi0gICAgICAgICAgICAjICBvciB0aGUgTVNCIG9mIHRoZSBmaWxlIHRpbWUgZGVwZW5kaW5nIG9uIHRoZSBoZWFkZXIgdHlwZQotICAgICAgICAgICAgIyAgYW5kIGlzIHVzZWQgdG8gY2hlY2sgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBwYXNzd29yZC4KLSAgICAgICAgICAgIGJ5dGVzID0gemVmX2ZpbGUucmVhZCgxMikKLSAgICAgICAgICAgIGggPSBtYXAoemQsIGJ5dGVzWzA6MTJdKQotICAgICAgICAgICAgaWYgemluZm8uZmxhZ19iaXRzICYgMHg4OgotICAgICAgICAgICAgICAgICMgY29tcGFyZSBhZ2FpbnN0IHRoZSBmaWxlIHR5cGUgZnJvbSBleHRlbmRlZCBsb2NhbCBoZWFkZXJzCi0gICAgICAgICAgICAgICAgY2hlY2tfYnl0ZSA9ICh6aW5mby5fcmF3X3RpbWUgPj4gOCkgJiAweGZmCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgTWFrZSBzdXJlIHdlIGhhdmUgYW4gaW5mbyBvYmplY3QKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobmFtZSwgWmlwSW5mbyk6CisgICAgICAgICAgICAgICAgIyAnbmFtZScgaXMgYWxyZWFkeSBhbiBpbmZvIG9iamVjdAorICAgICAgICAgICAgICAgIHppbmZvID0gbmFtZQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAjIGNvbXBhcmUgYWdhaW5zdCB0aGUgQ1JDIG90aGVyd2lzZQotICAgICAgICAgICAgICAgIGNoZWNrX2J5dGUgPSAoemluZm8uQ1JDID4+IDI0KSAmIDB4ZmYKLSAgICAgICAgICAgIGlmIG9yZChoWzExXSkgIT0gY2hlY2tfYnl0ZToKLSAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkJhZCBwYXNzd29yZCBmb3IgZmlsZSIsIG5hbWUpCisgICAgICAgICAgICAgICAgIyBHZXQgaW5mbyBvYmplY3QgZm9yIG5hbWUKKyAgICAgICAgICAgICAgICB6aW5mbyA9IHNlbGYuZ2V0aW5mbyhuYW1lKQogCi0gICAgICAgIHJldHVybiAgWmlwRXh0RmlsZSh6ZWZfZmlsZSwgbW9kZSwgemluZm8sIHpkKQorICAgICAgICAgICAgemVmX2ZpbGUuc2Vlayh6aW5mby5oZWFkZXJfb2Zmc2V0LCAwKQorCisgICAgICAgICAgICAjIFNraXAgdGhlIGZpbGUgaGVhZGVyOgorICAgICAgICAgICAgZmhlYWRlciA9IHplZl9maWxlLnJlYWQoc2l6ZUZpbGVIZWFkZXIpCisgICAgICAgICAgICBpZiBsZW4oZmhlYWRlcikgIT0gc2l6ZUZpbGVIZWFkZXI6CisgICAgICAgICAgICAgICAgcmFpc2UgQmFkWmlwZmlsZSgiVHJ1bmNhdGVkIGZpbGUgaGVhZGVyIikKKyAgICAgICAgICAgIGZoZWFkZXIgPSBzdHJ1Y3QudW5wYWNrKHN0cnVjdEZpbGVIZWFkZXIsIGZoZWFkZXIpCisgICAgICAgICAgICBpZiBmaGVhZGVyW19GSF9TSUdOQVRVUkVdICE9IHN0cmluZ0ZpbGVIZWFkZXI6CisgICAgICAgICAgICAgICAgcmFpc2UgQmFkWmlwZmlsZSgiQmFkIG1hZ2ljIG51bWJlciBmb3IgZmlsZSBoZWFkZXIiKQorCisgICAgICAgICAgICBmbmFtZSA9IHplZl9maWxlLnJlYWQoZmhlYWRlcltfRkhfRklMRU5BTUVfTEVOR1RIXSkKKyAgICAgICAgICAgIGlmIGZoZWFkZXJbX0ZIX0VYVFJBX0ZJRUxEX0xFTkdUSF06CisgICAgICAgICAgICAgICAgemVmX2ZpbGUucmVhZChmaGVhZGVyW19GSF9FWFRSQV9GSUVMRF9MRU5HVEhdKQorCisgICAgICAgICAgICBpZiBmbmFtZSAhPSB6aW5mby5vcmlnX2ZpbGVuYW1lOgorICAgICAgICAgICAgICAgIHJhaXNlIEJhZFppcGZpbGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICdGaWxlIG5hbWUgaW4gZGlyZWN0b3J5ICIlcyIgYW5kIGhlYWRlciAiJXMiIGRpZmZlci4nICUgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppbmZvLm9yaWdfZmlsZW5hbWUsIGZuYW1lKQorCisgICAgICAgICAgICAjIGNoZWNrIGZvciBlbmNyeXB0ZWQgZmxhZyAmIGhhbmRsZSBwYXNzd29yZAorICAgICAgICAgICAgaXNfZW5jcnlwdGVkID0gemluZm8uZmxhZ19iaXRzICYgMHgxCisgICAgICAgICAgICB6ZCA9IE5vbmUKKyAgICAgICAgICAgIGlmIGlzX2VuY3J5cHRlZDoKKyAgICAgICAgICAgICAgICBpZiBub3QgcHdkOgorICAgICAgICAgICAgICAgICAgICBwd2QgPSBzZWxmLnB3ZAorICAgICAgICAgICAgICAgIGlmIG5vdCBwd2Q6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIkZpbGUgJXMgaXMgZW5jcnlwdGVkLCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwYXNzd29yZCByZXF1aXJlZCBmb3IgZXh0cmFjdGlvbiIgJSBuYW1lCisKKyAgICAgICAgICAgICAgICB6ZCA9IF9aaXBEZWNyeXB0ZXIocHdkKQorICAgICAgICAgICAgICAgICMgVGhlIGZpcnN0IDEyIGJ5dGVzIGluIHRoZSBjeXBoZXIgc3RyZWFtIGlzIGFuIGVuY3J5cHRpb24gaGVhZGVyCisgICAgICAgICAgICAgICAgIyAgdXNlZCB0byBzdHJlbmd0aGVuIHRoZSBhbGdvcml0aG0uIFRoZSBmaXJzdCAxMSBieXRlcyBhcmUKKyAgICAgICAgICAgICAgICAjICBjb21wbGV0ZWx5IHJhbmRvbSwgd2hpbGUgdGhlIDEydGggY29udGFpbnMgdGhlIE1TQiBvZiB0aGUgQ1JDLAorICAgICAgICAgICAgICAgICMgIG9yIHRoZSBNU0Igb2YgdGhlIGZpbGUgdGltZSBkZXBlbmRpbmcgb24gdGhlIGhlYWRlciB0eXBlCisgICAgICAgICAgICAgICAgIyAgYW5kIGlzIHVzZWQgdG8gY2hlY2sgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBwYXNzd29yZC4KKyAgICAgICAgICAgICAgICBieXRlcyA9IHplZl9maWxlLnJlYWQoMTIpCisgICAgICAgICAgICAgICAgaCA9IG1hcCh6ZCwgYnl0ZXNbMDoxMl0pCisgICAgICAgICAgICAgICAgaWYgemluZm8uZmxhZ19iaXRzICYgMHg4OgorICAgICAgICAgICAgICAgICAgICAjIGNvbXBhcmUgYWdhaW5zdCB0aGUgZmlsZSB0eXBlIGZyb20gZXh0ZW5kZWQgbG9jYWwgaGVhZGVycworICAgICAgICAgICAgICAgICAgICBjaGVja19ieXRlID0gKHppbmZvLl9yYXdfdGltZSA+PiA4KSAmIDB4ZmYKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIGNvbXBhcmUgYWdhaW5zdCB0aGUgQ1JDIG90aGVyd2lzZQorICAgICAgICAgICAgICAgICAgICBjaGVja19ieXRlID0gKHppbmZvLkNSQyA+PiAyNCkgJiAweGZmCisgICAgICAgICAgICAgICAgaWYgb3JkKGhbMTFdKSAhPSBjaGVja19ieXRlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkJhZCBwYXNzd29yZCBmb3IgZmlsZSIsIG5hbWUpCisKKyAgICAgICAgICAgIHJldHVybiBaaXBFeHRGaWxlKHplZl9maWxlLCBtb2RlLCB6aW5mbywgemQsCisgICAgICAgICAgICAgICAgICAgIGNsb3NlX2ZpbGVvYmo9c2hvdWxkX2Nsb3NlKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBpZiBzaG91bGRfY2xvc2U6CisgICAgICAgICAgICAgICAgemVmX2ZpbGUuY2xvc2UoKQorICAgICAgICAgICAgcmFpc2UKIAogICAgIGRlZiBleHRyYWN0KHNlbGYsIG1lbWJlciwgcGF0aD1Ob25lLCBwd2Q9Tm9uZSk6CiAgICAgICAgICIiIkV4dHJhY3QgYSBtZW1iZXIgZnJvbSB0aGUgYXJjaGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwKQEAgLTk2OSwxNyArMTA0NSwyOCBAQAogICAgICAgICAiIiIKICAgICAgICAgIyBidWlsZCB0aGUgZGVzdGluYXRpb24gcGF0aG5hbWUsIHJlcGxhY2luZwogICAgICAgICAjIGZvcndhcmQgc2xhc2hlcyB0byBwbGF0Zm9ybSBzcGVjaWZpYyBzZXBhcmF0b3JzLgotICAgICAgICAjIFN0cmlwIHRyYWlsaW5nIHBhdGggc2VwYXJhdG9yLCB1bmxlc3MgaXQgcmVwcmVzZW50cyB0aGUgcm9vdC4KLSAgICAgICAgaWYgKHRhcmdldHBhdGhbLTE6XSBpbiAob3MucGF0aC5zZXAsIG9zLnBhdGguYWx0c2VwKQotICAgICAgICAgICAgYW5kIGxlbihvcy5wYXRoLnNwbGl0ZHJpdmUodGFyZ2V0cGF0aClbMV0pID4gMSk6Ci0gICAgICAgICAgICB0YXJnZXRwYXRoID0gdGFyZ2V0cGF0aFs6LTFdCisgICAgICAgIGFyY25hbWUgPSBtZW1iZXIuZmlsZW5hbWUucmVwbGFjZSgnLycsIG9zLnBhdGguc2VwKQogCi0gICAgICAgICMgZG9uJ3QgaW5jbHVkZSBsZWFkaW5nICIvIiBmcm9tIGZpbGUgbmFtZSBpZiBwcmVzZW50Ci0gICAgICAgIGlmIG1lbWJlci5maWxlbmFtZVswXSA9PSAnLyc6Ci0gICAgICAgICAgICB0YXJnZXRwYXRoID0gb3MucGF0aC5qb2luKHRhcmdldHBhdGgsIG1lbWJlci5maWxlbmFtZVsxOl0pCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB0YXJnZXRwYXRoID0gb3MucGF0aC5qb2luKHRhcmdldHBhdGgsIG1lbWJlci5maWxlbmFtZSkKKyAgICAgICAgaWYgb3MucGF0aC5hbHRzZXA6CisgICAgICAgICAgICBhcmNuYW1lID0gYXJjbmFtZS5yZXBsYWNlKG9zLnBhdGguYWx0c2VwLCBvcy5wYXRoLnNlcCkKKyAgICAgICAgIyBpbnRlcnByZXQgYWJzb2x1dGUgcGF0aG5hbWUgYXMgcmVsYXRpdmUsIHJlbW92ZSBkcml2ZSBsZXR0ZXIgb3IKKyAgICAgICAgIyBVTkMgcGF0aCwgcmVkdW5kYW50IHNlcGFyYXRvcnMsICIuIiBhbmQgIi4uIiBjb21wb25lbnRzLgorICAgICAgICBhcmNuYW1lID0gb3MucGF0aC5zcGxpdGRyaXZlKGFyY25hbWUpWzFdCisgICAgICAgIGFyY25hbWUgPSBvcy5wYXRoLnNlcC5qb2luKHggZm9yIHggaW4gYXJjbmFtZS5zcGxpdChvcy5wYXRoLnNlcCkKKyAgICAgICAgICAgICAgICAgICAgaWYgeCBub3QgaW4gKCcnLCBvcy5wYXRoLmN1cmRpciwgb3MucGF0aC5wYXJkaXIpKQorICAgICAgICBpZiBvcy5wYXRoLnNlcCA9PSAnXFwnOgorICAgICAgICAgICAgIyBmaWx0ZXIgaWxsZWdhbCBjaGFyYWN0ZXJzIG9uIFdpbmRvd3MKKyAgICAgICAgICAgIGlsbGVnYWwgPSAnOjw+fCI/KicKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJjbmFtZSwgdW5pY29kZSk6CisgICAgICAgICAgICAgICAgdGFibGUgPSB7b3JkKGMpOiBvcmQoJ18nKSBmb3IgYyBpbiBpbGxlZ2FsfQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0YWJsZSA9IHN0cmluZy5tYWtldHJhbnMoaWxsZWdhbCwgJ18nICogbGVuKGlsbGVnYWwpKQorICAgICAgICAgICAgYXJjbmFtZSA9IGFyY25hbWUudHJhbnNsYXRlKHRhYmxlKQorICAgICAgICAgICAgIyByZW1vdmUgdHJhaWxpbmcgZG90cworICAgICAgICAgICAgYXJjbmFtZSA9ICh4LnJzdHJpcCgnLicpIGZvciB4IGluIGFyY25hbWUuc3BsaXQob3MucGF0aC5zZXApKQorICAgICAgICAgICAgYXJjbmFtZSA9IG9zLnBhdGguc2VwLmpvaW4oeCBmb3IgeCBpbiBhcmNuYW1lIGlmIHgpCiAKKyAgICAgICAgdGFyZ2V0cGF0aCA9IG9zLnBhdGguam9pbih0YXJnZXRwYXRoLCBhcmNuYW1lKQogICAgICAgICB0YXJnZXRwYXRoID0gb3MucGF0aC5ub3JtcGF0aCh0YXJnZXRwYXRoKQogCiAgICAgICAgICMgQ3JlYXRlIGFsbCB1cHBlciBkaXJlY3RvcmllcyBpZiBuZWNlc3NhcnkuCkBAIC05OTIsMTkgKzEwNzksMTcgQEAKICAgICAgICAgICAgICAgICBvcy5ta2Rpcih0YXJnZXRwYXRoKQogICAgICAgICAgICAgcmV0dXJuIHRhcmdldHBhdGgKIAotICAgICAgICBzb3VyY2UgPSBzZWxmLm9wZW4obWVtYmVyLCBwd2Q9cHdkKQotICAgICAgICB0YXJnZXQgPSBmaWxlKHRhcmdldHBhdGgsICJ3YiIpCi0gICAgICAgIHNodXRpbC5jb3B5ZmlsZW9iaihzb3VyY2UsIHRhcmdldCkKLSAgICAgICAgc291cmNlLmNsb3NlKCkKLSAgICAgICAgdGFyZ2V0LmNsb3NlKCkKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4obWVtYmVyLCBwd2Q9cHdkKSBhcyBzb3VyY2UsIFwKKyAgICAgICAgICAgICBmaWxlKHRhcmdldHBhdGgsICJ3YiIpIGFzIHRhcmdldDoKKyAgICAgICAgICAgIHNodXRpbC5jb3B5ZmlsZW9iaihzb3VyY2UsIHRhcmdldCkKIAogICAgICAgICByZXR1cm4gdGFyZ2V0cGF0aAogCiAgICAgZGVmIF93cml0ZWNoZWNrKHNlbGYsIHppbmZvKToKICAgICAgICAgIiIiQ2hlY2sgZm9yIGVycm9ycyBiZWZvcmUgd3JpdGluZyBhIGZpbGUgdG8gdGhlIGFyY2hpdmUuIiIiCiAgICAgICAgIGlmIHppbmZvLmZpbGVuYW1lIGluIHNlbGYuTmFtZVRvSW5mbzoKLSAgICAgICAgICAgIGlmIHNlbGYuZGVidWc6ICAgICAgIyBXYXJuaW5nIGZvciBkdXBsaWNhdGUgbmFtZXMKLSAgICAgICAgICAgICAgICBwcmludCAiRHVwbGljYXRlIG5hbWU6IiwgemluZm8uZmlsZW5hbWUKKyAgICAgICAgICAgIGltcG9ydCB3YXJuaW5ncworICAgICAgICAgICAgd2FybmluZ3Mud2FybignRHVwbGljYXRlIG5hbWU6ICVyJyAlIHppbmZvLmZpbGVuYW1lLCBzdGFja2xldmVsPTMpCiAgICAgICAgIGlmIHNlbGYubW9kZSBub3QgaW4gKCJ3IiwgImEiKToKICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgJ3dyaXRlKCkgcmVxdWlyZXMgbW9kZSAidyIgb3IgImEiJwogICAgICAgICBpZiBub3Qgc2VsZi5mcDoKQEAgLTEwNjIsMjAgKzExNDcsMjMgQEAKICAgICAgICAgICAgIHppbmZvLkNSQyA9IDAKICAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKHppbmZvKQogICAgICAgICAgICAgc2VsZi5OYW1lVG9JbmZvW3ppbmZvLmZpbGVuYW1lXSA9IHppbmZvCi0gICAgICAgICAgICBzZWxmLmZwLndyaXRlKHppbmZvLkZpbGVIZWFkZXIoKSkKKyAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoemluZm8uRmlsZUhlYWRlcihGYWxzZSkpCiAgICAgICAgICAgICByZXR1cm4KIAogICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJyYiIpIGFzIGZwOgogICAgICAgICAgICAgIyBNdXN0IG92ZXJ3cml0ZSBDUkMgYW5kIHNpemVzIHdpdGggY29ycmVjdCBkYXRhIGxhdGVyCiAgICAgICAgICAgICB6aW5mby5DUkMgPSBDUkMgPSAwCiAgICAgICAgICAgICB6aW5mby5jb21wcmVzc19zaXplID0gY29tcHJlc3Nfc2l6ZSA9IDAKLSAgICAgICAgICAgIHppbmZvLmZpbGVfc2l6ZSA9IGZpbGVfc2l6ZSA9IDAKLSAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoemluZm8uRmlsZUhlYWRlcigpKQorICAgICAgICAgICAgIyBDb21wcmVzc2VkIHNpemUgY2FuIGJlIGxhcmdlciB0aGFuIHVuY29tcHJlc3NlZCBzaXplCisgICAgICAgICAgICB6aXA2NCA9IHNlbGYuX2FsbG93WmlwNjQgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgemluZm8uZmlsZV9zaXplICogMS4wNSA+IFpJUDY0X0xJTUlUCisgICAgICAgICAgICBzZWxmLmZwLndyaXRlKHppbmZvLkZpbGVIZWFkZXIoemlwNjQpKQogICAgICAgICAgICAgaWYgemluZm8uY29tcHJlc3NfdHlwZSA9PSBaSVBfREVGTEFURUQ6CiAgICAgICAgICAgICAgICAgY21wciA9IHpsaWIuY29tcHJlc3NvYmooemxpYi5aX0RFRkFVTFRfQ09NUFJFU1NJT04sCiAgICAgICAgICAgICAgICAgICAgICB6bGliLkRFRkxBVEVELCAtMTUpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIGNtcHIgPSBOb25lCisgICAgICAgICAgICBmaWxlX3NpemUgPSAwCiAgICAgICAgICAgICB3aGlsZSAxOgogICAgICAgICAgICAgICAgIGJ1ZiA9IGZwLnJlYWQoMTAyNCAqIDgpCiAgICAgICAgICAgICAgICAgaWYgbm90IGJ1ZjoKQEAgLTEwOTUsMTEgKzExODMsMTYgQEAKICAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3NpemUgPSBmaWxlX3NpemUKICAgICAgICAgemluZm8uQ1JDID0gQ1JDCiAgICAgICAgIHppbmZvLmZpbGVfc2l6ZSA9IGZpbGVfc2l6ZQotICAgICAgICAjIFNlZWsgYmFja3dhcmRzIGFuZCB3cml0ZSBDUkMgYW5kIGZpbGUgc2l6ZXMKKyAgICAgICAgaWYgbm90IHppcDY0IGFuZCBzZWxmLl9hbGxvd1ppcDY0OgorICAgICAgICAgICAgaWYgZmlsZV9zaXplID4gWklQNjRfTElNSVQ6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdGaWxlIHNpemUgaGFzIGluY3JlYXNlZCBkdXJpbmcgY29tcHJlc3NpbmcnKQorICAgICAgICAgICAgaWYgY29tcHJlc3Nfc2l6ZSA+IFpJUDY0X0xJTUlUOgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignQ29tcHJlc3NlZCBzaXplIGxhcmdlciB0aGFuIHVuY29tcHJlc3NlZCBzaXplJykKKyAgICAgICAgIyBTZWVrIGJhY2t3YXJkcyBhbmQgd3JpdGUgZmlsZSBoZWFkZXIgKHdoaWNoIHdpbGwgbm93IGluY2x1ZGUKKyAgICAgICAgIyBjb3JyZWN0IENSQyBhbmQgZmlsZSBzaXplcykKICAgICAgICAgcG9zaXRpb24gPSBzZWxmLmZwLnRlbGwoKSAgICAgICAjIFByZXNlcnZlIGN1cnJlbnQgcG9zaXRpb24gaW4gZmlsZQotICAgICAgICBzZWxmLmZwLnNlZWsoemluZm8uaGVhZGVyX29mZnNldCArIDE0LCAwKQotICAgICAgICBzZWxmLmZwLndyaXRlKHN0cnVjdC5wYWNrKCI8TExMIiwgemluZm8uQ1JDLCB6aW5mby5jb21wcmVzc19zaXplLAotICAgICAgICAgICAgICB6aW5mby5maWxlX3NpemUpKQorICAgICAgICBzZWxmLmZwLnNlZWsoemluZm8uaGVhZGVyX29mZnNldCwgMCkKKyAgICAgICAgc2VsZi5mcC53cml0ZSh6aW5mby5GaWxlSGVhZGVyKHppcDY0KSkKICAgICAgICAgc2VsZi5mcC5zZWVrKHBvc2l0aW9uLCAwKQogICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZCh6aW5mbykKICAgICAgICAgc2VsZi5OYW1lVG9JbmZvW3ppbmZvLmZpbGVuYW1lXSA9IHppbmZvCkBAIC0xMTM2LDE0ICsxMjI5LDE4IEBACiAgICAgICAgICAgICB6aW5mby5jb21wcmVzc19zaXplID0gbGVuKGJ5dGVzKSAgICAjIENvbXByZXNzZWQgc2l6ZQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgemluZm8uY29tcHJlc3Nfc2l6ZSA9IHppbmZvLmZpbGVfc2l6ZQotICAgICAgICB6aW5mby5oZWFkZXJfb2Zmc2V0ID0gc2VsZi5mcC50ZWxsKCkgICAgIyBTdGFydCBvZiBoZWFkZXIgYnl0ZXMKLSAgICAgICAgc2VsZi5mcC53cml0ZSh6aW5mby5GaWxlSGVhZGVyKCkpCisgICAgICAgIHppcDY0ID0gemluZm8uZmlsZV9zaXplID4gWklQNjRfTElNSVQgb3IgXAorICAgICAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3NpemUgPiBaSVA2NF9MSU1JVAorICAgICAgICBpZiB6aXA2NCBhbmQgbm90IHNlbGYuX2FsbG93WmlwNjQ6CisgICAgICAgICAgICByYWlzZSBMYXJnZVppcEZpbGUoIkZpbGVzaXplIHdvdWxkIHJlcXVpcmUgWklQNjQgZXh0ZW5zaW9ucyIpCisgICAgICAgIHNlbGYuZnAud3JpdGUoemluZm8uRmlsZUhlYWRlcih6aXA2NCkpCiAgICAgICAgIHNlbGYuZnAud3JpdGUoYnl0ZXMpCi0gICAgICAgIHNlbGYuZnAuZmx1c2goKQogICAgICAgICBpZiB6aW5mby5mbGFnX2JpdHMgJiAweDA4OgogICAgICAgICAgICAgIyBXcml0ZSBDUkMgYW5kIGZpbGUgc2l6ZXMgYWZ0ZXIgdGhlIGZpbGUgZGF0YQotICAgICAgICAgICAgc2VsZi5mcC53cml0ZShzdHJ1Y3QucGFjaygiPExMTCIsIHppbmZvLkNSQywgemluZm8uY29tcHJlc3Nfc2l6ZSwKKyAgICAgICAgICAgIGZtdCA9ICc8TFFRJyBpZiB6aXA2NCBlbHNlICc8TExMJworICAgICAgICAgICAgc2VsZi5mcC53cml0ZShzdHJ1Y3QucGFjayhmbXQsIHppbmZvLkNSQywgemluZm8uY29tcHJlc3Nfc2l6ZSwKICAgICAgICAgICAgICAgICAgIHppbmZvLmZpbGVfc2l6ZSkpCisgICAgICAgIHNlbGYuZnAuZmx1c2goKQogICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZCh6aW5mbykKICAgICAgICAgc2VsZi5OYW1lVG9JbmZvW3ppbmZvLmZpbGVuYW1lXSA9IHppbmZvCiAKQEAgLTExNTcsMTA5ICsxMjU0LDEwNCBAQAogICAgICAgICBpZiBzZWxmLmZwIGlzIE5vbmU6CiAgICAgICAgICAgICByZXR1cm4KIAotICAgICAgICBpZiBzZWxmLm1vZGUgaW4gKCJ3IiwgImEiKSBhbmQgc2VsZi5fZGlkTW9kaWZ5OiAjIHdyaXRlIGVuZGluZyByZWNvcmRzCi0gICAgICAgICAgICBjb3VudCA9IDAKLSAgICAgICAgICAgIHBvczEgPSBzZWxmLmZwLnRlbGwoKQotICAgICAgICAgICAgZm9yIHppbmZvIGluIHNlbGYuZmlsZWxpc3Q6ICAgICAgICAgIyB3cml0ZSBjZW50cmFsIGRpcmVjdG9yeQotICAgICAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxCi0gICAgICAgICAgICAgICAgZHQgPSB6aW5mby5kYXRlX3RpbWUKLSAgICAgICAgICAgICAgICBkb3NkYXRlID0gKGR0WzBdIC0gMTk4MCkgPDwgOSB8IGR0WzFdIDw8IDUgfCBkdFsyXQotICAgICAgICAgICAgICAgIGRvc3RpbWUgPSBkdFszXSA8PCAxMSB8IGR0WzRdIDw8IDUgfCAoZHRbNV0gLy8gMikKLSAgICAgICAgICAgICAgICBleHRyYSA9IFtdCi0gICAgICAgICAgICAgICAgaWYgemluZm8uZmlsZV9zaXplID4gWklQNjRfTElNSVQgXAotICAgICAgICAgICAgICAgICAgICAgICAgb3IgemluZm8uY29tcHJlc3Nfc2l6ZSA+IFpJUDY0X0xJTUlUOgotICAgICAgICAgICAgICAgICAgICBleHRyYS5hcHBlbmQoemluZm8uZmlsZV9zaXplKQotICAgICAgICAgICAgICAgICAgICBleHRyYS5hcHBlbmQoemluZm8uY29tcHJlc3Nfc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgZmlsZV9zaXplID0gMHhmZmZmZmZmZgotICAgICAgICAgICAgICAgICAgICBjb21wcmVzc19zaXplID0gMHhmZmZmZmZmZgotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVfc2l6ZSA9IHppbmZvLmZpbGVfc2l6ZQotICAgICAgICAgICAgICAgICAgICBjb21wcmVzc19zaXplID0gemluZm8uY29tcHJlc3Nfc2l6ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLm1vZGUgaW4gKCJ3IiwgImEiKSBhbmQgc2VsZi5fZGlkTW9kaWZ5OiAjIHdyaXRlIGVuZGluZyByZWNvcmRzCisgICAgICAgICAgICAgICAgY291bnQgPSAwCisgICAgICAgICAgICAgICAgcG9zMSA9IHNlbGYuZnAudGVsbCgpCisgICAgICAgICAgICAgICAgZm9yIHppbmZvIGluIHNlbGYuZmlsZWxpc3Q6ICAgICAgICAgIyB3cml0ZSBjZW50cmFsIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMQorICAgICAgICAgICAgICAgICAgICBkdCA9IHppbmZvLmRhdGVfdGltZQorICAgICAgICAgICAgICAgICAgICBkb3NkYXRlID0gKGR0WzBdIC0gMTk4MCkgPDwgOSB8IGR0WzFdIDw8IDUgfCBkdFsyXQorICAgICAgICAgICAgICAgICAgICBkb3N0aW1lID0gZHRbM10gPDwgMTEgfCBkdFs0XSA8PCA1IHwgKGR0WzVdIC8vIDIpCisgICAgICAgICAgICAgICAgICAgIGV4dHJhID0gW10KKyAgICAgICAgICAgICAgICAgICAgaWYgemluZm8uZmlsZV9zaXplID4gWklQNjRfTElNSVQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHppbmZvLmNvbXByZXNzX3NpemUgPiBaSVA2NF9MSU1JVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhLmFwcGVuZCh6aW5mby5maWxlX3NpemUpCisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYS5hcHBlbmQoemluZm8uY29tcHJlc3Nfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfc2l6ZSA9IDB4ZmZmZmZmZmYKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzX3NpemUgPSAweGZmZmZmZmZmCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3NpemUgPSB6aW5mby5maWxlX3NpemUKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzX3NpemUgPSB6aW5mby5jb21wcmVzc19zaXplCiAKLSAgICAgICAgICAgICAgICBpZiB6aW5mby5oZWFkZXJfb2Zmc2V0ID4gWklQNjRfTElNSVQ6Ci0gICAgICAgICAgICAgICAgICAgIGV4dHJhLmFwcGVuZCh6aW5mby5oZWFkZXJfb2Zmc2V0KQotICAgICAgICAgICAgICAgICAgICBoZWFkZXJfb2Zmc2V0ID0gMHhmZmZmZmZmZkwKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBoZWFkZXJfb2Zmc2V0ID0gemluZm8uaGVhZGVyX29mZnNldAorICAgICAgICAgICAgICAgICAgICBpZiB6aW5mby5oZWFkZXJfb2Zmc2V0ID4gWklQNjRfTElNSVQ6CisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYS5hcHBlbmQoemluZm8uaGVhZGVyX29mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9vZmZzZXQgPSAweGZmZmZmZmZmTAorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX29mZnNldCA9IHppbmZvLmhlYWRlcl9vZmZzZXQKIAotICAgICAgICAgICAgICAgIGV4dHJhX2RhdGEgPSB6aW5mby5leHRyYQotICAgICAgICAgICAgICAgIGlmIGV4dHJhOgotICAgICAgICAgICAgICAgICAgICAjIEFwcGVuZCBhIFpJUDY0IGZpZWxkIHRvIHRoZSBleHRyYSdzCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhX2RhdGEgPSBzdHJ1Y3QucGFjaygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPEhIJyArICdRJypsZW4oZXh0cmEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDgqbGVuKGV4dHJhKSwgKmV4dHJhKSArIGV4dHJhX2RhdGEKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFfZGF0YSA9IHppbmZvLmV4dHJhCisgICAgICAgICAgICAgICAgICAgIGlmIGV4dHJhOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBBcHBlbmQgYSBaSVA2NCBmaWVsZCB0byB0aGUgZXh0cmEncworICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfZGF0YSA9IHN0cnVjdC5wYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPEhIJyArICdRJypsZW4oZXh0cmEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCA4KmxlbihleHRyYSksICpleHRyYSkgKyBleHRyYV9kYXRhCiAKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFjdF92ZXJzaW9uID0gbWF4KDQ1LCB6aW5mby5leHRyYWN0X3ZlcnNpb24pCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZV92ZXJzaW9uID0gbWF4KDQ1LCB6aW5mby5jcmVhdGVfdmVyc2lvbikKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBleHRyYWN0X3ZlcnNpb24gPSB6aW5mby5leHRyYWN0X3ZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlX3ZlcnNpb24gPSB6aW5mby5jcmVhdGVfdmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdF92ZXJzaW9uID0gbWF4KDQ1LCB6aW5mby5leHRyYWN0X3ZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVfdmVyc2lvbiA9IG1heCg0NSwgemluZm8uY3JlYXRlX3ZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0X3ZlcnNpb24gPSB6aW5mby5leHRyYWN0X3ZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZV92ZXJzaW9uID0gemluZm8uY3JlYXRlX3ZlcnNpb24KIAotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIGZsYWdfYml0cyA9IHppbmZvLl9lbmNvZGVGaWxlbmFtZUZsYWdzKCkKLSAgICAgICAgICAgICAgICAgICAgY2VudGRpciA9IHN0cnVjdC5wYWNrKHN0cnVjdENlbnRyYWxEaXIsCi0gICAgICAgICAgICAgICAgICAgICBzdHJpbmdDZW50cmFsRGlyLCBjcmVhdGVfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgIHppbmZvLmNyZWF0ZV9zeXN0ZW0sIGV4dHJhY3RfdmVyc2lvbiwgemluZm8ucmVzZXJ2ZWQsCi0gICAgICAgICAgICAgICAgICAgICBmbGFnX2JpdHMsIHppbmZvLmNvbXByZXNzX3R5cGUsIGRvc3RpbWUsIGRvc2RhdGUsCi0gICAgICAgICAgICAgICAgICAgICB6aW5mby5DUkMsIGNvbXByZXNzX3NpemUsIGZpbGVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIGxlbihmaWxlbmFtZSksIGxlbihleHRyYV9kYXRhKSwgbGVuKHppbmZvLmNvbW1lbnQpLAotICAgICAgICAgICAgICAgICAgICAgMCwgemluZm8uaW50ZXJuYWxfYXR0ciwgemluZm8uZXh0ZXJuYWxfYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9vZmZzZXQpCi0gICAgICAgICAgICAgICAgZXhjZXB0IERlcHJlY2F0aW9uV2FybmluZzoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAoc3RydWN0Q2VudHJhbERpciwKLSAgICAgICAgICAgICAgICAgICAgIHN0cmluZ0NlbnRyYWxEaXIsIGNyZWF0ZV92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgemluZm8uY3JlYXRlX3N5c3RlbSwgZXh0cmFjdF92ZXJzaW9uLCB6aW5mby5yZXNlcnZlZCwKLSAgICAgICAgICAgICAgICAgICAgIHppbmZvLmZsYWdfYml0cywgemluZm8uY29tcHJlc3NfdHlwZSwgZG9zdGltZSwgZG9zZGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgIHppbmZvLkNSQywgY29tcHJlc3Nfc2l6ZSwgZmlsZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgbGVuKHppbmZvLmZpbGVuYW1lKSwgbGVuKGV4dHJhX2RhdGEpLCBsZW4oemluZm8uY29tbWVudCksCi0gICAgICAgICAgICAgICAgICAgICAwLCB6aW5mby5pbnRlcm5hbF9hdHRyLCB6aW5mby5leHRlcm5hbF9hdHRyLAotICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX29mZnNldCkKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UKLSAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKGNlbnRkaXIpCi0gICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZShmaWxlbmFtZSkKLSAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKGV4dHJhX2RhdGEpCi0gICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSh6aW5mby5jb21tZW50KQorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgZmxhZ19iaXRzID0gemluZm8uX2VuY29kZUZpbGVuYW1lRmxhZ3MoKQorICAgICAgICAgICAgICAgICAgICAgICAgY2VudGRpciA9IHN0cnVjdC5wYWNrKHN0cnVjdENlbnRyYWxEaXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdDZW50cmFsRGlyLCBjcmVhdGVfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHppbmZvLmNyZWF0ZV9zeXN0ZW0sIGV4dHJhY3RfdmVyc2lvbiwgemluZm8ucmVzZXJ2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBmbGFnX2JpdHMsIHppbmZvLmNvbXByZXNzX3R5cGUsIGRvc3RpbWUsIGRvc2RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICB6aW5mby5DUkMsIGNvbXByZXNzX3NpemUsIGZpbGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbihmaWxlbmFtZSksIGxlbihleHRyYV9kYXRhKSwgbGVuKHppbmZvLmNvbW1lbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgemluZm8uaW50ZXJuYWxfYXR0ciwgemluZm8uZXh0ZXJuYWxfYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9vZmZzZXQpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBEZXByZWNhdGlvbldhcm5pbmc6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsIChzdHJ1Y3RDZW50cmFsRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nQ2VudHJhbERpciwgY3JlYXRlX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICB6aW5mby5jcmVhdGVfc3lzdGVtLCBleHRyYWN0X3ZlcnNpb24sIHppbmZvLnJlc2VydmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgemluZm8uZmxhZ19iaXRzLCB6aW5mby5jb21wcmVzc190eXBlLCBkb3N0aW1lLCBkb3NkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgemluZm8uQ1JDLCBjb21wcmVzc19zaXplLCBmaWxlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBsZW4oemluZm8uZmlsZW5hbWUpLCBsZW4oZXh0cmFfZGF0YSksIGxlbih6aW5mby5jb21tZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIHppbmZvLmludGVybmFsX2F0dHIsIHppbmZvLmV4dGVybmFsX2F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfb2Zmc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZShjZW50ZGlyKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKGZpbGVuYW1lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKGV4dHJhX2RhdGEpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoemluZm8uY29tbWVudCkKIAotICAgICAgICAgICAgcG9zMiA9IHNlbGYuZnAudGVsbCgpCi0gICAgICAgICAgICAjIFdyaXRlIGVuZC1vZi16aXAtYXJjaGl2ZSByZWNvcmQKLSAgICAgICAgICAgIGNlbnREaXJDb3VudCA9IGNvdW50Ci0gICAgICAgICAgICBjZW50RGlyU2l6ZSA9IHBvczIgLSBwb3MxCi0gICAgICAgICAgICBjZW50RGlyT2Zmc2V0ID0gcG9zMQotICAgICAgICAgICAgaWYgKGNlbnREaXJDb3VudCA+PSBaSVBfRklMRUNPVU5UX0xJTUlUIG9yCi0gICAgICAgICAgICAgICAgY2VudERpck9mZnNldCA+IFpJUDY0X0xJTUlUIG9yCi0gICAgICAgICAgICAgICAgY2VudERpclNpemUgPiBaSVA2NF9MSU1JVCk6Ci0gICAgICAgICAgICAgICAgIyBOZWVkIHRvIHdyaXRlIHRoZSBaSVA2NCBlbmQtb2YtYXJjaGl2ZSByZWNvcmRzCi0gICAgICAgICAgICAgICAgemlwNjRlbmRyZWMgPSBzdHJ1Y3QucGFjaygKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdEVuZEFyY2hpdmU2NCwgc3RyaW5nRW5kQXJjaGl2ZTY0LAotICAgICAgICAgICAgICAgICAgICAgICAgNDQsIDQ1LCA0NSwgMCwgMCwgY2VudERpckNvdW50LCBjZW50RGlyQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjZW50RGlyU2l6ZSwgY2VudERpck9mZnNldCkKLSAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKHppcDY0ZW5kcmVjKQorICAgICAgICAgICAgICAgIHBvczIgPSBzZWxmLmZwLnRlbGwoKQorICAgICAgICAgICAgICAgICMgV3JpdGUgZW5kLW9mLXppcC1hcmNoaXZlIHJlY29yZAorICAgICAgICAgICAgICAgIGNlbnREaXJDb3VudCA9IGNvdW50CisgICAgICAgICAgICAgICAgY2VudERpclNpemUgPSBwb3MyIC0gcG9zMQorICAgICAgICAgICAgICAgIGNlbnREaXJPZmZzZXQgPSBwb3MxCisgICAgICAgICAgICAgICAgaWYgKGNlbnREaXJDb3VudCA+PSBaSVBfRklMRUNPVU5UX0xJTUlUIG9yCisgICAgICAgICAgICAgICAgICAgIGNlbnREaXJPZmZzZXQgPiBaSVA2NF9MSU1JVCBvcgorICAgICAgICAgICAgICAgICAgICBjZW50RGlyU2l6ZSA+IFpJUDY0X0xJTUlUKToKKyAgICAgICAgICAgICAgICAgICAgIyBOZWVkIHRvIHdyaXRlIHRoZSBaSVA2NCBlbmQtb2YtYXJjaGl2ZSByZWNvcmRzCisgICAgICAgICAgICAgICAgICAgIHppcDY0ZW5kcmVjID0gc3RydWN0LnBhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0RW5kQXJjaGl2ZTY0LCBzdHJpbmdFbmRBcmNoaXZlNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQsIDQ1LCA0NSwgMCwgMCwgY2VudERpckNvdW50LCBjZW50RGlyQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudERpclNpemUsIGNlbnREaXJPZmZzZXQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoemlwNjRlbmRyZWMpCiAKLSAgICAgICAgICAgICAgICB6aXA2NGxvY3JlYyA9IHN0cnVjdC5wYWNrKAotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0RW5kQXJjaGl2ZTY0TG9jYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ0VuZEFyY2hpdmU2NExvY2F0b3IsIDAsIHBvczIsIDEpCi0gICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSh6aXA2NGxvY3JlYykKLSAgICAgICAgICAgICAgICBjZW50RGlyQ291bnQgPSBtaW4oY2VudERpckNvdW50LCAweEZGRkYpCi0gICAgICAgICAgICAgICAgY2VudERpclNpemUgPSBtaW4oY2VudERpclNpemUsIDB4RkZGRkZGRkYpCi0gICAgICAgICAgICAgICAgY2VudERpck9mZnNldCA9IG1pbihjZW50RGlyT2Zmc2V0LCAweEZGRkZGRkZGKQorICAgICAgICAgICAgICAgICAgICB6aXA2NGxvY3JlYyA9IHN0cnVjdC5wYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdEVuZEFyY2hpdmU2NExvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nRW5kQXJjaGl2ZTY0TG9jYXRvciwgMCwgcG9zMiwgMSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSh6aXA2NGxvY3JlYykKKyAgICAgICAgICAgICAgICAgICAgY2VudERpckNvdW50ID0gbWluKGNlbnREaXJDb3VudCwgMHhGRkZGKQorICAgICAgICAgICAgICAgICAgICBjZW50RGlyU2l6ZSA9IG1pbihjZW50RGlyU2l6ZSwgMHhGRkZGRkZGRikKKyAgICAgICAgICAgICAgICAgICAgY2VudERpck9mZnNldCA9IG1pbihjZW50RGlyT2Zmc2V0LCAweEZGRkZGRkZGKQogCi0gICAgICAgICAgICAjIGNoZWNrIGZvciB2YWxpZCBjb21tZW50IGxlbmd0aAotICAgICAgICAgICAgaWYgbGVuKHNlbGYuY29tbWVudCkgPj0gWklQX01BWF9DT01NRU5UOgotICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPiAwOgotICAgICAgICAgICAgICAgICAgICBtc2cgPSAnQXJjaGl2ZSBjb21tZW50IGlzIHRvbyBsb25nOyB0cnVuY2F0aW5nIHRvICVkIGJ5dGVzJyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICUgWklQX01BWF9DT01NRU5UCi0gICAgICAgICAgICAgICAgc2VsZi5jb21tZW50ID0gc2VsZi5jb21tZW50WzpaSVBfTUFYX0NPTU1FTlRdCi0KLSAgICAgICAgICAgIGVuZHJlYyA9IHN0cnVjdC5wYWNrKHN0cnVjdEVuZEFyY2hpdmUsIHN0cmluZ0VuZEFyY2hpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBjZW50RGlyQ291bnQsIGNlbnREaXJDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnREaXJTaXplLCBjZW50RGlyT2Zmc2V0LCBsZW4oc2VsZi5jb21tZW50KSkKLSAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoZW5kcmVjKQotICAgICAgICAgICAgc2VsZi5mcC53cml0ZShzZWxmLmNvbW1lbnQpCi0gICAgICAgICAgICBzZWxmLmZwLmZsdXNoKCkKLQotICAgICAgICBpZiBub3Qgc2VsZi5fZmlsZVBhc3NlZDoKLSAgICAgICAgICAgIHNlbGYuZnAuY2xvc2UoKQotICAgICAgICBzZWxmLmZwID0gTm9uZQorICAgICAgICAgICAgICAgIGVuZHJlYyA9IHN0cnVjdC5wYWNrKHN0cnVjdEVuZEFyY2hpdmUsIHN0cmluZ0VuZEFyY2hpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBjZW50RGlyQ291bnQsIGNlbnREaXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnREaXJTaXplLCBjZW50RGlyT2Zmc2V0LCBsZW4oc2VsZi5fY29tbWVudCkpCisgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZShlbmRyZWMpCisgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZShzZWxmLl9jb21tZW50KQorICAgICAgICAgICAgICAgIHNlbGYuZnAuZmx1c2goKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAgPSBzZWxmLmZwCisgICAgICAgICAgICBzZWxmLmZwID0gTm9uZQorICAgICAgICAgICAgaWYgbm90IHNlbGYuX2ZpbGVQYXNzZWQ6CisgICAgICAgICAgICAgICAgZnAuY2xvc2UoKQogCiAKIGNsYXNzIFB5WmlwRmlsZShaaXBGaWxlKToKQEAgLTEzODEsMTYgKzE0NzMsMTUgQEAKICAgICAgICAgaWYgbGVuKGFyZ3MpICE9IDI6CiAgICAgICAgICAgICBwcmludCBVU0FHRQogICAgICAgICAgICAgc3lzLmV4aXQoMSkKLSAgICAgICAgemYgPSBaaXBGaWxlKGFyZ3NbMV0sICdyJykKLSAgICAgICAgemYucHJpbnRkaXIoKQotICAgICAgICB6Zi5jbG9zZSgpCisgICAgICAgIHdpdGggWmlwRmlsZShhcmdzWzFdLCAncicpIGFzIHpmOgorICAgICAgICAgICAgemYucHJpbnRkaXIoKQogCiAgICAgZWxpZiBhcmdzWzBdID09ICctdCc6CiAgICAgICAgIGlmIGxlbihhcmdzKSAhPSAyOgogICAgICAgICAgICAgcHJpbnQgVVNBR0UKICAgICAgICAgICAgIHN5cy5leGl0KDEpCi0gICAgICAgIHpmID0gWmlwRmlsZShhcmdzWzFdLCAncicpCi0gICAgICAgIGJhZGZpbGUgPSB6Zi50ZXN0emlwKCkKKyAgICAgICAgd2l0aCBaaXBGaWxlKGFyZ3NbMV0sICdyJykgYXMgemY6CisgICAgICAgICAgICBiYWRmaWxlID0gemYudGVzdHppcCgpCiAgICAgICAgIGlmIGJhZGZpbGU6CiAgICAgICAgICAgICBwcmludCgiVGhlIGZvbGxvd2luZyBlbmNsb3NlZCBmaWxlIGlzIGNvcnJ1cHRlZDogeyFyfSIuZm9ybWF0KGJhZGZpbGUpKQogICAgICAgICBwcmludCAiRG9uZSB0ZXN0aW5nIgpAQCAtMTQwMCwyMCArMTQ5MSwxOSBAQAogICAgICAgICAgICAgcHJpbnQgVVNBR0UKICAgICAgICAgICAgIHN5cy5leGl0KDEpCiAKLSAgICAgICAgemYgPSBaaXBGaWxlKGFyZ3NbMV0sICdyJykKLSAgICAgICAgb3V0ID0gYXJnc1syXQotICAgICAgICBmb3IgcGF0aCBpbiB6Zi5uYW1lbGlzdCgpOgotICAgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKCcuLycpOgotICAgICAgICAgICAgICAgIHRndCA9IG9zLnBhdGguam9pbihvdXQsIHBhdGhbMjpdKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICB0Z3QgPSBvcy5wYXRoLmpvaW4ob3V0LCBwYXRoKQorICAgICAgICB3aXRoIFppcEZpbGUoYXJnc1sxXSwgJ3InKSBhcyB6ZjoKKyAgICAgICAgICAgIG91dCA9IGFyZ3NbMl0KKyAgICAgICAgICAgIGZvciBwYXRoIGluIHpmLm5hbWVsaXN0KCk6CisgICAgICAgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKCcuLycpOgorICAgICAgICAgICAgICAgICAgICB0Z3QgPSBvcy5wYXRoLmpvaW4ob3V0LCBwYXRoWzI6XSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB0Z3QgPSBvcy5wYXRoLmpvaW4ob3V0LCBwYXRoKQogCi0gICAgICAgICAgICB0Z3RkaXIgPSBvcy5wYXRoLmRpcm5hbWUodGd0KQotICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHRndGRpcik6Ci0gICAgICAgICAgICAgICAgb3MubWFrZWRpcnModGd0ZGlyKQotICAgICAgICAgICAgd2l0aCBvcGVuKHRndCwgJ3diJykgYXMgZnA6Ci0gICAgICAgICAgICAgICAgZnAud3JpdGUoemYucmVhZChwYXRoKSkKLSAgICAgICAgemYuY2xvc2UoKQorICAgICAgICAgICAgICAgIHRndGRpciA9IG9zLnBhdGguZGlybmFtZSh0Z3QpCisgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHRndGRpcik6CisgICAgICAgICAgICAgICAgICAgIG9zLm1ha2VkaXJzKHRndGRpcikKKyAgICAgICAgICAgICAgICB3aXRoIG9wZW4odGd0LCAnd2InKSBhcyBmcDoKKyAgICAgICAgICAgICAgICAgICAgZnAud3JpdGUoemYucmVhZChwYXRoKSkKIAogICAgIGVsaWYgYXJnc1swXSA9PSAnLWMnOgogICAgICAgICBpZiBsZW4oYXJncykgPCAzOgpAQCAtMTQyOSwxMSArMTUxOSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHBhdGgsIG5tKSwgb3MucGF0aC5qb2luKHppcHBhdGgsIG5tKSkKICAgICAgICAgICAgICMgZWxzZTogaWdub3JlCiAKLSAgICAgICAgemYgPSBaaXBGaWxlKGFyZ3NbMV0sICd3JywgYWxsb3daaXA2ND1UcnVlKQotICAgICAgICBmb3Igc3JjIGluIGFyZ3NbMjpdOgotICAgICAgICAgICAgYWRkVG9aaXAoemYsIHNyYywgb3MucGF0aC5iYXNlbmFtZShzcmMpKQotCi0gICAgICAgIHpmLmNsb3NlKCkKKyAgICAgICAgd2l0aCBaaXBGaWxlKGFyZ3NbMV0sICd3JywgYWxsb3daaXA2ND1UcnVlKSBhcyB6ZjoKKyAgICAgICAgICAgIGZvciBzcmMgaW4gYXJnc1syOl06CisgICAgICAgICAgICAgICAgYWRkVG9aaXAoemYsIHNyYywgb3MucGF0aC5iYXNlbmFtZShzcmMpKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL0J1aWxkU2NyaXB0L1JFQURNRS50eHQgYi9NYWMvQnVpbGRTY3JpcHQvUkVBRE1FLnR4dAppbmRleCBkZTJmNWNiLi43YzJhMGJiIDEwMDY0NAotLS0gYS9NYWMvQnVpbGRTY3JpcHQvUkVBRE1FLnR4dAorKysgYi9NYWMvQnVpbGRTY3JpcHQvUkVBRE1FLnR4dApAQCAtOCw3MCArOCwxMjIgQEAKIGFuIEluc3RhbGxlciBwYWNrYWdlIGZyb20gdGhlIGluc3RhbGxhdGlvbiBwbHVzIG90aGVyIGZpbGVzIGluIGBgcmVzb3VyY2VzYGAgCiBhbmQgYGBzY3JpcHRzYGAgYW5kIHBsYWNlZCB0aGF0IG9uIGEgYGAuZG1nYGAgZGlzayBpbWFnZS4KIAotQXMgb2YgUHl0aG9uIDIuNy54IGFuZCAzLjIsIFBTRiBwcmFjdGljZSBpcyB0byBidWlsZCB0d28gaW5zdGFsbGVyIHZhcmlhbnRzCi1mb3IgZWFjaCByZWxlYXNlOgorRm9yIFB5dGhvbiAyLjcueCBhbmQgMy54LCBQU0YgcHJhY3RpY2UgaXMgdG8gYnVpbGQgdHdvIGluc3RhbGxlciB2YXJpYW50cworZm9yIGVhY2ggcmVsZWFzZS4KIAotMS4gIDMyLWJpdC1vbmx5LCBpMzg2IGFuZCBQUEMgdW5pdmVyc2FsLCBjYXBhYmxlIG9uIHJ1bm5pbmcgb24gYWxsIG1hY2hpbmVzCi0gICAgc3VwcG9ydGVkIGJ5IE1hYyBPUyBYIDEwLjMuOSB0aHJvdWdoIChhdCBsZWFzdCkgMTAuNjo6CitCZWdpbm5pbmcgd2l0aCBQeXRob24gMi43LjgsIHdlIHBsYW4gdG8gZHJvcCBiaW5hcnkgaW5zdGFsbGVyIHN1cHBvcnQgZm9yCitNYWMgT1MgWCAxMC4zLjkgYW5kIDEwLjQueCBzeXN0ZW1zLiAgVG8gZWFzZSB0aGUgdHJhbnNpdGlvbiwgZm9yIFB5dGhvbiAyLjcuNworb25seSB0aGVyZSB3aWxsIGJlIHRocmVlIGluc3RhbGxlcnMgcHJvdmlkZWQ6CiAKLSAgICAgICAgcHl0aG9uIGJ1aWxkLWluc3RhbGxlci5weSBcCisxLiAgREVQUkVDQVRFRCAtIDMyLWJpdC1vbmx5LCBpMzg2IGFuZCBQUEMgdW5pdmVyc2FsLCBjYXBhYmxlIG9uIHJ1bm5pbmcgb24gYWxsCisgICAgbWFjaGluZXMgc3VwcG9ydGVkIGJ5IE1hYyBPUyBYIDEwLjMuOSB0aHJvdWdoIChhdCBsZWFzdCkgMTAuOTo6CisKKyAgICAgICAgL3Vzci9iaW4vcHl0aG9uIGJ1aWxkLWluc3RhbGxlci5weSBcCiAgICAgICAgICAgICAtLXNkay1wYXRoPS9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGsgXAogICAgICAgICAgICAgLS11bml2ZXJzYWwtYXJjaHM9MzItYml0IFwKICAgICAgICAgICAgIC0tZGVwLXRhcmdldD0xMC4zIAotICAgICAgICAgICAgIyBUaGVzZSBhcmUgdGhlIGN1cnJlbnQgZGVmYXVsdCBvcHRpb25zCiAKICAgICAtIGJ1aWxkcyB0aGUgZm9sbG93aW5nIHRoaXJkLXBhcnR5IGxpYnJhcmllcwogCiAgICAgICAgICogQnppcDIKLSAgICAgICAgKiBabGliIDEuMi4zCi0gICAgICAgICogR05VIFJlYWRsaW5lIChHUEwpCi0gICAgICAgICogU1FMaXRlIDMKICAgICAgICAgKiBOQ3Vyc2VzCisgICAgICAgICogR05VIFJlYWRsaW5lIChHUEwpCisgICAgICAgICogU1FMaXRlIDMuNy4xMworICAgICAgICAqIFpsaWIgMS4yLjMKICAgICAgICAgKiBPcmFjbGUgU2xlZXB5Y2F0IERCIDQuOCAoUHl0aG9uIDIueCBvbmx5KQogCiAgICAgLSByZXF1aXJlcyBBY3RpdmVTdGF0ZSBgYFRjbC9UayA4LjRgYCAoY3VycmVudGx5IDguNC4xOSkgdG8gYmUgaW5zdGFsbGVkIGZvciBidWlsZGluZwogCi0gICAgLSBjdXJyZW50IHRhcmdldCBidWlsZCBlbnZpcm9ubWVudDoKKyAgICAtIHJlY29tbWVuZGVkIGJ1aWxkIGVudmlyb25tZW50OgogICAgICAgICAKICAgICAgICAgKiBNYWMgT1MgWCAxMC41LjggUFBDIG9yIEludGVsCi0gICAgICAgICogWGNvZGUgMy4xLjQgKG9yIGxhdGVyKQorICAgICAgICAqIFhjb2RlIDMuMS40CiAgICAgICAgICogYGBNYWNPU1gxMC40dWBgIFNESyAobGF0ZXIgU0RLcyBkbyBub3Qgc3VwcG9ydCBQUEMgRzMgcHJvY2Vzc29ycykKICAgICAgICAgKiBgYE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVD0xMC4zYGAKICAgICAgICAgKiBBcHBsZSBgYGdjYy00LjBgYAotICAgICAgICAqIFB5dGhvbiAyLm4gKG4gPj0gNCkgZm9yIGRvY3VtZW50YXRpb24gYnVpbGQgd2l0aCBTcGhpbngKKyAgICAgICAgKiBzeXN0ZW0gUHl0aG9uIDIuNSBmb3IgZG9jdW1lbnRhdGlvbiBidWlsZCB3aXRoIFNwaGlueAogCiAgICAgLSBhbHRlcm5hdGUgYnVpbGQgZW52aXJvbm1lbnRzOgogCi0gICAgICAgICogTWFjIE9TIFggMTAuNC4xMSB3aXRoIFhjb2RlIDIuNQotICAgICAgICAqIE1hYyBPUyBYIDEwLjYuNiB3aXRoIFhjb2RlIDMuMi41CisgICAgICAgICogTWFjIE9TIFggMTAuNi44IHdpdGggWGNvZGUgMy4yLjYKICAgICAgICAgICAgIC0gbmVlZCB0byBjaGFuZ2UgYGAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy97VGNsLFRrfS5mcmFtZXdvcmsvVmVyc2lvbi9DdXJyZW50YGAgdG8gYGA4LjRgYAorICAgICAgICAqIE5vdGUgWGNvZGUgNC4qIGRvZXMgbm90IHN1cHBvcnQgYnVpbGRpbmcgZm9yIFBQQyBzbyBjYW5ub3QgYmUgdXNlZCBmb3IgdGhpcyBidWlsZAogCi0yLiAgNjQtYml0IC8gMzItYml0LCB4ODZfNjQgYW5kIGkzODYgdW5pdmVyc2FsLCBmb3IgT1MgWCAxMC42IChhbmQgbGF0ZXIpOjoKKzIuICAzMi1iaXQtb25seSwgaTM4NiBhbmQgUFBDIHVuaXZlcnNhbCwgY2FwYWJsZSBvbiBydW5uaW5nIG9uIGFsbCBtYWNoaW5lcworICAgIHN1cHBvcnRlZCBieSBNYWMgT1MgWCAxMC41IHRocm91Z2ggKGF0IGxlYXN0KSAxMC45OjoKIAotICAgICAgICBweXRob24gYnVpbGQtaW5zdGFsbGVyLnB5IFwKKyAgICAgICAgL3Vzci9iaW4vcHl0aG9uICBidWlsZC1pbnN0YWxsZXIucHkgXAorICAgICAgICAgICAgLS1zZGstcGF0aD0vRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNS5zZGsgXAorICAgICAgICAgICAgLS11bml2ZXJzYWwtYXJjaHM9MzItYml0IFwKKyAgICAgICAgICAgIC0tZGVwLXRhcmdldD0xMC41CisKKyAgICAtIGJ1aWxkcyB0aGUgZm9sbG93aW5nIHRoaXJkLXBhcnR5IGxpYnJhcmllcworCisgICAgICAgICogTkN1cnNlcyA1LjkKKyAgICAgICAgKiBTUUxpdGUgMy43LjEzCisgICAgICAgICogT3JhY2xlIFNsZWVweWNhdCBEQiA0LjggKFB5dGhvbiAyLnggb25seSkKKworICAgIC0gdXNlcyBzeXN0ZW0tc3VwcGxpZWQgdmVyc2lvbnMgb2YgdGhpcmQtcGFydHkgbGlicmFyaWVzCisKKyAgICAgICAgKiByZWFkbGluZSBtb2R1bGUgbGlua3Mgd2l0aCBBcHBsZSBCU0QgZWRpdGxpbmUgKGxpYmVkaXQpCisKKyAgICAtIHJlcXVpcmVzIEFjdGl2ZVN0YXRlIGBgVGNsL1RrIDguNGBgIChjdXJyZW50bHkgOC40LjIwKSB0byBiZSBpbnN0YWxsZWQgZm9yIGJ1aWxkaW5nCisKKyAgICAtIHJlY29tbWVuZGVkIGJ1aWxkIGVudmlyb25tZW50OgorCisgICAgICAgICogTWFjIE9TIFggMTAuNS44IEludGVsIG9yIFBQQworICAgICAgICAqIFhjb2RlIDMuMS40CisgICAgICAgICogYGBNYWNPU1gxMC41YGAgU0RLCisgICAgICAgICogYGBNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQ9MTAuNWBgCisgICAgICAgICogQXBwbGUgYGBnY2MtNC4yYGAKKyAgICAgICAgKiBzeXN0ZW0gUHl0aG9uIDIuNSsgZm9yIGRvY3VtZW50YXRpb24gYnVpbGQgd2l0aCBTcGhpbngKKworICAgIC0gYWx0ZXJuYXRlIGJ1aWxkIGVudmlyb25tZW50czoKKworICAgICAgICAqIE1hYyBPUyBYIDEwLjYuOCB3aXRoIFhjb2RlIDMuMi42CisgICAgICAgICAgICAtIG5lZWQgdG8gY2hhbmdlIGBgL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3Mve1RjbCxUa30uZnJhbWV3b3JrL1ZlcnNpb24vQ3VycmVudGBgIHRvIGBgOC40YGAKKyAgICAgICAgKiBOb3RlIFhjb2RlIDQuKiBkb2VzIG5vdCBzdXBwb3J0IGJ1aWxkaW5nIGZvciBQUEMgc28gY2Fubm90IGJlIHVzZWQgZm9yIHRoaXMgYnVpbGQKKworMy4gIDY0LWJpdCAvIDMyLWJpdCwgeDg2XzY0IGFuZCBpMzg2IHVuaXZlcnNhbCwgZm9yIE9TIFggMTAuNiAoYW5kIGxhdGVyKTo6CisKKyAgICAgICAgL3Vzci9iaW4vcHl0aG9uIGJ1aWxkLWluc3RhbGxlci5weSBcCiAgICAgICAgICAgICAtLXNkay1wYXRoPS9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC42LnNkayBcCiAgICAgICAgICAgICAtLXVuaXZlcnNhbC1hcmNocz1pbnRlbCBcCiAgICAgICAgICAgICAtLWRlcC10YXJnZXQ9MTAuNgogCisgICAgLSBidWlsZHMgdGhlIGZvbGxvd2luZyB0aGlyZC1wYXJ0eSBsaWJyYXJpZXMKKworICAgICAgICAqIE5DdXJzZXMgNS45IChodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTUwMzcpCisgICAgICAgICogU1FMaXRlIDMuNy4xMworICAgICAgICAqIE9yYWNsZSBTbGVlcHljYXQgREIgNC44IChQeXRob24gMi54IG9ubHkpCisKICAgICAtIHVzZXMgc3lzdGVtLXN1cHBsaWVkIHZlcnNpb25zIG9mIHRoaXJkLXBhcnR5IGxpYnJhcmllcwotICAgIAorCiAgICAgICAgICogcmVhZGxpbmUgbW9kdWxlIGxpbmtzIHdpdGggQXBwbGUgQlNEIGVkaXRsaW5lIChsaWJlZGl0KQotICAgICAgICAqIGJ1aWxkcyBPcmFjbGUgU2xlZXB5Y2F0IERCIDQuOCAoUHl0aG9uIDIueCBvbmx5KQogCi0gICAgLSByZXF1aXJlcyBBY3RpdmVTdGF0ZSBUY2wvVGsgOC41LjkgKG9yIGxhdGVyKSB0byBiZSBpbnN0YWxsZWQgZm9yIGJ1aWxkaW5nCisgICAgLSByZXF1aXJlcyBBY3RpdmVTdGF0ZSBUY2wvVGsgOC41LjE1IChvciBsYXRlcikgdG8gYmUgaW5zdGFsbGVkIGZvciBidWlsZGluZwogCi0gICAgLSBjdXJyZW50IHRhcmdldCBidWlsZCBlbnZpcm9ubWVudDoKLSAgICAgICAgCi0gICAgICAgICogTWFjIE9TIFggMTAuNi42IChvciBsYXRlcikKLSAgICAgICAgKiBYY29kZSAzLjIuNSAob3IgbGF0ZXIpCisgICAgLSByZWNvbW1lbmRlZCBidWlsZCBlbnZpcm9ubWVudDoKKworICAgICAgICAqIE1hYyBPUyBYIDEwLjYuOCAob3IgbGF0ZXIpCisgICAgICAgICogWGNvZGUgMy4yLjYKICAgICAgICAgKiBgYE1hY09TWDEwLjZgYCBTREsKICAgICAgICAgKiBgYE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVD0xMC42YGAKICAgICAgICAgKiBBcHBsZSBgYGdjYy00LjJgYAotICAgICAgICAqIFB5dGhvbiAyLm4gKG4gPj0gNCkgZm9yIGRvY3VtZW50YXRpb24gYnVpbGQgd2l0aCBTcGhpbngKKyAgICAgICAgKiBzeXN0ZW0gUHl0aG9uIDIuNiBmb3IgZG9jdW1lbnRhdGlvbiBidWlsZCB3aXRoIFNwaGlueAogCiAgICAgLSBhbHRlcm5hdGUgYnVpbGQgZW52aXJvbm1lbnRzOgogCi0gICAgICAgICogbm9uZQorICAgICAgICAqIG5vbmUuICBYY29kZSA0LnggY3VycmVudGx5IHN1cHBsaWVzIHR3byBDIGNvbXBpbGVycy4KKyAgICAgICAgICBgYGxsdm0tZ2NjLTQuMi4xYGAgaGFzIGJlZW4gZm91bmQgdG8gbWlzY29tcGlsZSBQeXRob24gMy4zLnggYW5kCisgICAgICAgICAgcHJvZHVjZSBhIG5vbi1mdW5jdGlvbmFsIFB5dGhvbiBleGVjdXRhYmxlLiAgQXMgaXQgYXBwZWFycyB0byBiZQorICAgICAgICAgIGNvbnNpZGVyZWQgYSBtaWdyYXRpb24gYWlkIGJ5IEFwcGxlIGFuZCBpcyBub3QgbGlrZWx5IHRvIGJlIGZpeGVkLAorICAgICAgICAgIGl0cyB1c2Ugc2hvdWxkIGJlIGF2b2lkZWQuICBUaGUgb3RoZXIgY29tcGlsZXIsIGBgY2xhbmdgYCwgaGFzIGJlZW4KKyAgICAgICAgICB1bmRlcmdvaW5nIHJhcGlkIGRldmVsb3BtZW50LiAgV2hpbGUgaXQgYXBwZWFycyB0byBoYXZlIGJlY29tZQorICAgICAgICAgIHByb2R1Y3Rpb24tcmVhZHkgaW4gdGhlIG1vc3QgcmVjZW50IFhjb2RlIDUgcmVsZWFzZXMsIHRoZSB2ZXJzaW9ucworICAgICAgICAgIGF2YWlsYWJsZSBvbiB0aGUgZGVwcmVjYXRlZCBYY29kZSA0LnggZm9yIDEwLjYgd2VyZSBlYXJseSByZWxlYXNlcworICAgICAgICAgIGFuZCBkaWQgbm90IHJlY2VpdmUgdGhlIGxldmVsIG9mIGV4cG9zdXJlIGluIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzCisgICAgICAgICAgdGhhdCB0aGUgWGNvZGUgMyBnY2MtNC4yIGNvbXBpbGVyIGhhcyBoYWQuCiAKIAogR2VuZXJhbCBQcmVyZXF1aXNpdGVzCkBAIC04Nyw2ICsxMzksMTEgQEAKICogSXQgaXMgc2FmZXN0IHRvIHN0YXJ0IGVhY2ggdmFyaWFudCBidWlsZCB3aXRoIGFuIGVtcHR5IHNvdXJjZSBkaXJlY3RvcnkKICAgcG9wdWxhdGVkIHdpdGggYSBmcmVzaCBjb3B5IG9mIHRoZSB1bnRhcnJlZCBzb3VyY2UuCiAKKyogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgcmVtb3ZlIGFueSBleGlzdGluZyBpbnN0YWxsZWQgdmVyc2lvbiBvZiB0aGUKKyAgUHl0aG9uIGJlaW5nIGJ1aWx0OjoKKworICAgICAgc3VkbyBybSAtcmYgL0xpYnJhcnkvRnJhbWV3b3Jrcy9QeXRob24uZnJhbWV3b3JrL1ZlcnNpb25zL24ubgorCiAKIFRoZSBSZWNpcGUKIC0tLS0tLS0tLS0KQEAgLTEwNyw5ICsxNjQsOSBAQAogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KIAogSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBidWlsZCBhIDQtd2F5IHVuaXZlcnNhbCBpbnN0YWxsZXIgdGhhdCBydW5zIG9uIAotT1MgWCBMZW9wYXJkIG9yIGxhdGVyOjoKK09TIFggMTAuNSBMZW9wYXJkIG9yIGxhdGVyOjoKIAotICBweXRob24gMi42IC9idWlsZC1pbnN0YWxsZXIucHkgXAorICAgIC91c3IvYmluL3B5dGhvbiAvYnVpbGQtaW5zdGFsbGVyLnB5IFwKICAgICAgICAgLS1kZXAtdGFyZ2V0PTEwLjUKICAgICAgICAgLS11bml2ZXJzYWwtYXJjaHM9YWxsCiAgICAgICAgIC0tc2RrLXBhdGg9L0RldmVsb3Blci9TREtzL01hY09TWDEwLjUuc2RrCkBAIC0xMjAsNyArMTc3LDggQEAKIHZhcmlhbnRzIGNhbiBvbmx5IGJlIHJ1biBvbiBHNSBtYWNoaW5lcyBydW5uaW5nIDEwLjUuICBOb3RlIHRoYXQsCiB3aGlsZSBPUyBYIDEwLjYgaXMgb25seSBzdXBwb3J0ZWQgb24gSW50ZWwtYmFzZWQgbWFjaGluZXMsIGl0IGlzIHBvc3NpYmxlCiB0byBydW4gYGBwcGNgYCAoMzItYml0KSBleGVjdXRhYmxlcyB1bm1vZGlmaWVkIHRoYW5rcyB0byB0aGUgUm9zZXR0YSBwcGMKLWVtdWxhdGlvbiBpbiBPUyBYIDEwLjUgYW5kIDEwLjYuCitlbXVsYXRpb24gaW4gT1MgWCAxMC41IGFuZCAxMC42LiAgVGhlIDQtd2F5IGluc3RhbGxlciB2YXJpYW50IG11c3QgYmUKK2J1aWx0IHdpdGggWGNvZGUgMy4gIEl0IGlzIG5vdCByZWd1bGFybHkgYnVpbHQgb3IgdGVzdGVkLgogCiBPdGhlciBgYC0tdW5pdmVyc2FsLWFyY2hzYGAgb3B0aW9ucyBhcmUgYGA2NC1iaXRgYCAoYGB4ODZfNjRgYCwgYGBwcGM2NGBgKSwKIGFuZCBgYDMtd2F5YGAgKGBgcHBjYGAsIGBgaTM4NmBgLCBgYHg4Nl82NGBgKS4gIE5vbmUgb2YgdGhlc2Ugb3B0aW9ucwpAQCAtMTMzLDE1ICsxOTEsMjEgQEAKIElkZWFsbHksIHRoZSByZXN1bHRpbmcgYmluYXJpZXMgc2hvdWxkIGJlIGluc3RhbGxlZCBhbmQgdGhlIHRlc3Qgc3VpdGUgcnVuCiBvbiBhbGwgc3VwcG9ydGVkIE9TIFggcmVsZWFzZXMgYW5kIGFyY2hpdGVjdHVyZXMuICBBcyBhIHByYWN0aWNhbCBtYXR0ZXIsCiB0aGF0IGlzIGdlbmVyYWxseSBub3QgcG9zc2libGUuICBBdCBhIG1pbmltdW0sIHZhcmlhbnQgMSBzaG91bGQgYmUgcnVuIG9uCi1hdCBsZWFzdCBvbmUgSW50ZWwsIG9uZSBQUEMgRzQsIGFuZCBvbmUgUFBDIEczIHN5c3RlbSBhbmQgb25lIGVhY2ggb2YgCi1PUyBYIDEwLjYsIDEwLjUsIDEwLjQsIGFuZCAxMC4zLjkuICBOb3QgYWxsIHRlc3RzIHJ1biBvbiAxMC4zLjkuCi1WYXJpYW50IDIgc2hvdWxkIGJlIHJ1biBvbiAxMC42IGluIGJvdGggMzItYml0IGFuZCA2NC1iaXQgbW9kZXMuOjoKK2EgUFBDIEc0IHN5c3RlbSB3aXRoIE9TIFggMTAuNSBhbmQgYXQgbGVhc3Qgb25lIEludGVsIHN5c3RlbSBydW5uaW5nIE9TIFgKKzEwLjgsIDEwLjcsIDEwLjYsIG9yIDEwLjUuICBWYXJpYW50IDIgc2hvdWxkIGJlIHJ1biBvbiAxMC44LCAxMC43LCBhbmQgMTAuNgorc3lzdGVtcyBpbiBib3RoIDMyLWJpdCBhbmQgNjQtYml0IG1vZGVzLjo6CiAKLSAgICBhcmNoIC1pMzg2IC91c3IvbG9jYWwvYmluL3B5dGhvbm4ubiAtbSB0ZXN0LnJlZ3J0ZXN0IC13IC11IGFsbCAKLSAgICBhcmNoIC1YODZfNjQgL3Vzci9sb2NhbC9iaW4vcHl0aG9ubi5uIC1tIHRlc3QucmVncnRlc3QgLXcgLXUgYWxsCisgICAgL3Vzci9sb2NhbC9iaW4vcHl0aG9ubi5uIC1tIHRlc3QgLXcgLXUgYWxsLC1sYXJnZWZpbGUKKyAgICAvdXNyL2xvY2FsL2Jpbi9weXRob25uLm4tMzIgLW0gdGVzdCAtdyAtdSBhbGwKICAgICAKIENlcnRhaW4gdGVzdHMgd2lsbCBiZSBza2lwcGVkIGFuZCBzb21lIGNhdXNlIHRoZSBpbnRlcnByZXRlciB0byBmYWlsCiB3aGljaCB3aWxsIGxpa2VseSBnZW5lcmF0ZSBgYFB5dGhvbiBxdWl0IHVuZXhwZWN0ZWRseWBgIGFsZXJ0IG1lc3NhZ2VzCi10byBiZSBnZW5lcmF0ZWQgYXQgc2V2ZXJhbCBwb2ludHMgZHVyaW5nIGEgdGVzdCBydW4uICBUaGVzZSBjYW4KLWJlIGlnbm9yZWQuCit0byBiZSBnZW5lcmF0ZWQgYXQgc2V2ZXJhbCBwb2ludHMgZHVyaW5nIGEgdGVzdCBydW4uICBUaGVzZSBhcmUgbm9ybWFsCitkdXJpbmcgdGVzdGluZyBhbmQgY2FuIGJlIGlnbm9yZWQuCisKK0l0IGlzIGFsc28gcmVjb21tZW5kIHRvIGxhdW5jaCBJRExFIGFuZCB2ZXJpZnkgdGhhdCBpdCBpcyBhdCBsZWFzdAorZnVuY3Rpb25hbC4gIERvdWJsZS1jbGljayBvbiB0aGUgSURMRSBhcHAgaWNvbiBpbiBgYC9BcHBsaWNhdGlvbnMvUHl0aG9ubi5uYGAuCitJdCBzaG91bGQgYWxzbyBiZSB0ZXN0ZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lOjoKKworICAgIC91c3IvbG9jYWwvYmluL2lkbGVuLm4KIApkaWZmIC0tZ2l0IGEvTWFjL0J1aWxkU2NyaXB0L2J1aWxkLWluc3RhbGxlci5weSBiL01hYy9CdWlsZFNjcmlwdC9idWlsZC1pbnN0YWxsZXIucHkKaW5kZXggYmE5MjAxMi4uMTk5YjU2MCAxMDA3NTUKLS0tIGEvTWFjL0J1aWxkU2NyaXB0L2J1aWxkLWluc3RhbGxlci5weQorKysgYi9NYWMvQnVpbGRTY3JpcHQvYnVpbGQtaW5zdGFsbGVyLnB5CkBAIC0xLDI3ICsxLDUyIEBACi0jIS91c3IvYmluL3B5dGhvbgorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiAiIiIKIFRoaXMgc2NyaXB0IGlzIHVzZWQgdG8gYnVpbGQgIm9mZmljaWFsIiB1bml2ZXJzYWwgaW5zdGFsbGVycyBvbiBNYWMgT1MgWC4KLUl0IHJlcXVpcmVzIGF0IGxlYXN0IE1hYyBPUyBYIDEwLjQsIFhjb2RlIDIuMiBhbmQgdGhlIDEwLjR1IFNESyBmb3IKK0l0IHJlcXVpcmVzIGF0IGxlYXN0IE1hYyBPUyBYIDEwLjUsIFhjb2RlIDMsIGFuZCB0aGUgMTAuNHUgU0RLIGZvcgogMzItYml0IGJ1aWxkcy4gIDY0LWJpdCBvciBmb3VyLXdheSB1bml2ZXJzYWwgYnVpbGRzIHJlcXVpcmUgYXQgbGVhc3QKIE9TIFggMTAuNSBhbmQgdGhlIDEwLjUgU0RLLgogCiBQbGVhc2UgZW5zdXJlIHRoYXQgdGhpcyBzY3JpcHQga2VlcHMgd29ya2luZyB3aXRoIFB5dGhvbiAyLjUsIHRvIGF2b2lkCiBib290c3RyYXAgaXNzdWVzICgvdXNyL2Jpbi9weXRob24gaXMgUHl0aG9uIDIuNSBvbiBPU1ggMTAuNSkuICBTcGhpbngsCiB3aGljaCBpcyB1c2VkIHRvIGJ1aWxkIHRoZSBkb2N1bWVudGF0aW9uLCBjdXJyZW50bHkgcmVxdWlyZXMgYXQgbGVhc3QKLVB5dGhvbiAyLjQuCitQeXRob24gMi40LiAgSG93ZXZlciwgYXMgb2YgUHl0aG9uIDMuNC4xLCBEb2MgYnVpbGRzIHJlcXVpcmUgYW4gZXh0ZXJuYWwKK3NwaGlueC1idWlsZCBhbmQgdGhlIGN1cnJlbnQgdmVyc2lvbnMgb2YgU3BoaW54IG5vdyByZXF1aXJlIGF0IGxlYXN0CitQeXRob24gMi42LgorCitJbiBhZGRpdGlvbiB0byB3aGF0IGlzIHN1cHBsaWVkIHdpdGggT1MgWCAxMC41KyBhbmQgWGNvZGUgMyssIHRoZSBzY3JpcHQKK3JlcXVpcmVzIGFuIGluc3RhbGxlZCB2ZXJzaW9uIG9mIGhnIGFuZCBhIHRoaXJkLXBhcnR5IHZlcnNpb24gb2YKK1RjbC9UayA4LjQgKGZvciBPUyBYIDEwLjQgYW5kIDEwLjUgZGVwbG95bWVudCB0YXJnZXRzKSBvciBUY2wvVEsgOC41CisoZm9yIDEwLjYgb3IgbGF0ZXIpIGluc3RhbGxlZCBpbiAvTGlicmFyeS9GcmFtZXdvcmtzLiAgV2hlbiBpbnN0YWxsZWQsCit0aGUgUHl0aG9uIGJ1aWx0IGJ5IHRoaXMgc2NyaXB0IHdpbGwgYXR0ZW1wdCB0byBkeW5hbWljYWxseSBsaW5rIGZpcnN0IHRvCitUY2wgYW5kIFRrIGZyYW1ld29ya3MgaW4gL0xpYnJhcnkvRnJhbWV3b3JrcyBpZiBhdmFpbGFibGUgb3RoZXJ3aXNlIGZhbGwKK2JhY2sgdG8gdGhlIG9uZXMgaW4gL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29yay4gIEZvciB0aGUgYnVpbGQsIHdlIHJlY29tbWVuZAoraW5zdGFsbGluZyB0aGUgbW9zdCByZWNlbnQgQWN0aXZlVGNsIDguNCBvciA4LjUgdmVyc2lvbi4KKworMzItYml0LW9ubHkgaW5zdGFsbGVyIGJ1aWxkcyBhcmUgc3RpbGwgcG9zc2libGUgb24gT1MgWCAxMC40IHdpdGggWGNvZGUgMi41CithbmQgdGhlIGluc3RhbGxhdGlvbiBvZiBhZGRpdGlvbmFsIGNvbXBvbmVudHMsIHN1Y2ggYXMgYSBuZXdlciBQeXRob24KKygyLjUgaXMgbmVlZGVkIGZvciBQeXRob24gcGFyc2VyIHVwZGF0ZXMpLCBoZywgYW5kIGZvciB0aGUgZG9jdW1lbnRhdGlvbgorYnVpbGQgZWl0aGVyIHN2biAocHJlLTMuNC4xKSBvciBzcGhpbngtYnVpbGQgKDMuNC4xIGFuZCBsYXRlcikuCiAKIFVzYWdlOiBzZWUgVVNBR0UgdmFyaWFibGUgaW4gdGhlIHNjcmlwdC4KICIiIgotaW1wb3J0IHBsYXRmb3JtLCBvcywgc3lzLCBnZXRvcHQsIHRleHR3cmFwLCBzaHV0aWwsIHVybGxpYjIsIHN0YXQsIHRpbWUsIHB3ZAotaW1wb3J0IGdycAoraW1wb3J0IHBsYXRmb3JtLCBvcywgc3lzLCBnZXRvcHQsIHRleHR3cmFwLCBzaHV0aWwsIHN0YXQsIHRpbWUsIHB3ZCwgZ3JwCit0cnk6CisgICAgaW1wb3J0IHVybGxpYjIgYXMgdXJsbGliX3JlcXVlc3QKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBpbXBvcnQgdXJsbGliLnJlcXVlc3QgYXMgdXJsbGliX3JlcXVlc3QKKworU1RBVF8wbzc1NSA9ICggc3RhdC5TX0lSVVNSIHwgc3RhdC5TX0lXVVNSIHwgc3RhdC5TX0lYVVNSCisgICAgICAgICAgICAgfCBzdGF0LlNfSVJHUlAgfCAgICAgICAgICAgICAgICBzdGF0LlNfSVhHUlAKKyAgICAgICAgICAgICB8IHN0YXQuU19JUk9USCB8ICAgICAgICAgICAgICAgIHN0YXQuU19JWE9USCApCisKK1NUQVRfMG83NzUgPSAoIHN0YXQuU19JUlVTUiB8IHN0YXQuU19JV1VTUiB8IHN0YXQuU19JWFVTUgorICAgICAgICAgICAgIHwgc3RhdC5TX0lSR1JQIHwgc3RhdC5TX0lXR1JQIHwgc3RhdC5TX0lYR1JQCisgICAgICAgICAgICAgfCBzdGF0LlNfSVJPVEggfCAgICAgICAgICAgICAgICBzdGF0LlNfSVhPVEggKQogCiBJTkNMVURFX1RJTUVTVEFNUCA9IDEKIFZFUkJPU0UgPSAxCiAKIGZyb20gcGxpc3RsaWIgaW1wb3J0IFBsaXN0CiAKLWltcG9ydCBNYWNPUwotCiB0cnk6CiAgICAgZnJvbSBwbGlzdGxpYiBpbXBvcnQgd3JpdGVQbGlzdAogZXhjZXB0IEltcG9ydEVycm9yOgpAQCAtNDIsMjAgKzY3LDM1IEBACiAgICAgICAgIGlmIGxuLnN0YXJ0c3dpdGgodmFyaWFibGUpOgogICAgICAgICAgICAgdmFsdWUgPSBsbltsZW4odmFyaWFibGUpOl0uc3RyaXAoKQogICAgICAgICAgICAgcmV0dXJuIHZhbHVlWzE6LTFdCi0gICAgcmFpc2UgUnVudGltZUVycm9yLCAiQ2Fubm90IGZpbmQgdmFyaWFibGUgJXMiICUgdmFyaWFibGVbOi0xXQorICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiQ2Fubm90IGZpbmQgdmFyaWFibGUgJXMiICUgdmFyaWFibGVbOi0xXSkKKworX2NhY2hlX2dldFZlcnNpb24gPSBOb25lCiAKIGRlZiBnZXRWZXJzaW9uKCk6Ci0gICAgcmV0dXJuIGdyZXBWYWx1ZShvcy5wYXRoLmpvaW4oU1JDRElSLCAnY29uZmlndXJlJyksICdQQUNLQUdFX1ZFUlNJT04nKQorICAgIGdsb2JhbCBfY2FjaGVfZ2V0VmVyc2lvbgorICAgIGlmIF9jYWNoZV9nZXRWZXJzaW9uIGlzIE5vbmU6CisgICAgICAgIF9jYWNoZV9nZXRWZXJzaW9uID0gZ3JlcFZhbHVlKAorICAgICAgICAgICAgb3MucGF0aC5qb2luKFNSQ0RJUiwgJ2NvbmZpZ3VyZScpLCAnUEFDS0FHRV9WRVJTSU9OJykKKyAgICByZXR1cm4gX2NhY2hlX2dldFZlcnNpb24KIAogZGVmIGdldFZlcnNpb25UdXBsZSgpOgogICAgIHJldHVybiB0dXBsZShbaW50KG4pIGZvciBuIGluIGdldFZlcnNpb24oKS5zcGxpdCgnLicpXSkKIAorZGVmIGdldFZlcnNpb25NYWpvck1pbm9yKCk6CisgICAgcmV0dXJuIHR1cGxlKFtpbnQobikgZm9yIG4gaW4gZ2V0VmVyc2lvbigpLnNwbGl0KCcuJywgMildKQorCitfY2FjaGVfZ2V0RnVsbFZlcnNpb24gPSBOb25lCisKIGRlZiBnZXRGdWxsVmVyc2lvbigpOgorICAgIGdsb2JhbCBfY2FjaGVfZ2V0RnVsbFZlcnNpb24KKyAgICBpZiBfY2FjaGVfZ2V0RnVsbFZlcnNpb24gaXMgbm90IE5vbmU6CisgICAgICAgIHJldHVybiBfY2FjaGVfZ2V0RnVsbFZlcnNpb24KICAgICBmbiA9IG9zLnBhdGguam9pbihTUkNESVIsICdJbmNsdWRlJywgJ3BhdGNobGV2ZWwuaCcpCiAgICAgZm9yIGxuIGluIG9wZW4oZm4pOgogICAgICAgICBpZiAnUFlfVkVSU0lPTicgaW4gbG46Ci0gICAgICAgICAgICByZXR1cm4gbG4uc3BsaXQoKVstMV1bMTotMV0KLSAgICByYWlzZSBSdW50aW1lRXJyb3IsICJDYW5ub3QgZmluZCBmdWxsIHZlcnNpb24/PyIKKyAgICAgICAgICAgIF9jYWNoZV9nZXRGdWxsVmVyc2lvbiA9IGxuLnNwbGl0KClbLTFdWzE6LTFdCisgICAgICAgICAgICByZXR1cm4gX2NhY2hlX2dldEZ1bGxWZXJzaW9uCisgICAgcmFpc2UgUnVudGltZUVycm9yKCJDYW5ub3QgZmluZCBmdWxsIHZlcnNpb24/PyIpCiAKICMgVGhlIGRpcmVjdG9yeSB3ZSdsbCB1c2UgdG8gY3JlYXRlIHRoZSBidWlsZCAod2lsbCBiZSBlcmFzZWQgYW5kIHJlY3JlYXRlZCkKIFdPUktESVIgPSAiL3RtcC9fcHkiCkBAIC03MCw3ICsxMTAsNyBAQAogIyMjIFRoZXJlIGFyZSBzb21lIGlzc3VlcyB3aXRoIHRoZSBTREsgc2VsZWN0aW9uIGJlbG93IGhlcmUsCiAjIyMgVGhlIHJlc3VsdGluZyBiaW5hcnkgZG9lc24ndCB3b3JrIG9uIGFsbCBwbGF0Zm9ybXMgdGhhdAogIyMjIGl0IHNob3VsZC4gQWx3YXlzIGRlZmF1bHQgdG8gdGhlIDEwLjR1IFNESyB1bnRpbCB0aGF0Ci0jIyMgaXN1ZSBpcyByZXNvbHZlZC4KKyMjIyBpc3N1ZSBpcyByZXNvbHZlZC4KICMjIwogIyNpZiBpbnQob3MudW5hbWUoKVsyXS5zcGxpdCgnLicpWzBdKSA9PSA4OgogIyMgICAgIyBFeHBsaWNpdGx5IHVzZSB0aGUgMTAuNHUgKHVuaXZlcnNhbCkgU0RLIHdoZW4KQEAgLTExMCwxNCArMTUwLDE5IEBACiAjICRNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgLT4gbWluaW11bSBPUyBYIGxldmVsCiBERVBUQVJHRVQgPSAnMTAuMycKIAotdGFyZ2V0X2NjX21hcCA9IHsKLSAgICAgICAgJzEwLjMnOiAnZ2NjLTQuMCcsCi0gICAgICAgICcxMC40JzogJ2djYy00LjAnLAotICAgICAgICAnMTAuNSc6ICdnY2MtNC4wJywKLSAgICAgICAgJzEwLjYnOiAnZ2NjLTQuMicsCi19CitkZWYgZ2V0RGVwdGFyZ2V0VHVwbGUoKToKKyAgICByZXR1cm4gdHVwbGUoW2ludChuKSBmb3IgbiBpbiBERVBUQVJHRVQuc3BsaXQoJy4nKVswOjJdXSkKIAotQ0MgPSB0YXJnZXRfY2NfbWFwW0RFUFRBUkdFVF0KK2RlZiBnZXRUYXJnZXRDb21waWxlcnMoKToKKyAgICB0YXJnZXRfY2NfbWFwID0geworICAgICAgICAnMTAuMyc6ICgnZ2NjLTQuMCcsICdnKystNC4wJyksCisgICAgICAgICcxMC40JzogKCdnY2MtNC4wJywgJ2crKy00LjAnKSwKKyAgICAgICAgJzEwLjUnOiAoJ2djYy00LjInLCAnZysrLTQuMicpLAorICAgICAgICAnMTAuNic6ICgnZ2NjLTQuMicsICdnKystNC4yJyksCisgICAgfQorICAgIHJldHVybiB0YXJnZXRfY2NfbWFwLmdldChERVBUQVJHRVQsICgnY2xhbmcnLCAnY2xhbmcrKycpICkKKworQ0MsIENYWCA9IGdldFRhcmdldENvbXBpbGVycygpCiAKIFBZVEhPTl8zID0gZ2V0VmVyc2lvblR1cGxlKCkgPj0gKDMsIDApCiAKQEAgLTEzNSw2ICsxODAsMTMgQEAKICAgICAtLXVuaXZlcnNhbC1hcmNocz14ICB1bml2ZXJzYWwgYXJjaGl0ZWN0dXJlcyAob3B0aW9uczogJShVTklWRVJTQUxPUFRTKXIsIGRlZmF1bHQ6ICUoVU5JVkVSU0FMQVJDSFMpcikKICIiIiklIGdsb2JhbHMoKQogCisjIERpY3Qgb2Ygb2JqZWN0IGZpbGUgbmFtZXMgd2l0aCBzaGFyZWQgbGlicmFyeSBuYW1lcyB0byBjaGVjayBhZnRlciBidWlsZGluZy4KKyMgVGhpcyBpcyB0byBlbnN1cmUgdGhhdCB3ZSBlbmRlZCB1cCBkeW5hbWljYWxseSBsaW5raW5nIHdpdGggdGhlIHNoYXJlZAorIyBsaWJyYXJ5IHBhdGhzIGFuZCB2ZXJzaW9ucyB3ZSBleHBlY3RlZC4gIEZvciBleGFtcGxlOgorIyAgIEVYUEVDVEVEX1NIQVJFRF9MSUJTWydfdGtpbnRlci5zbyddID0gWworIyAgICAgICAgICAgICAgICAgICAgICAgJy9MaWJyYXJ5L0ZyYW1ld29ya3MvVGNsLmZyYW1ld29yay9WZXJzaW9ucy84LjUvVGNsJywKKyMgICAgICAgICAgICAgICAgICAgICAgICcvTGlicmFyeS9GcmFtZXdvcmtzL1RrLmZyYW1ld29yay9WZXJzaW9ucy84LjUvVGsnXQorRVhQRUNURURfU0hBUkVEX0xJQlMgPSB7fQogCiAjIEluc3RydWN0aW9ucyBmb3IgYnVpbGRpbmcgbGlicmFyaWVzIHRoYXQgYXJlIG5lY2Vzc2FyeSBmb3IgYnVpbGRpbmcgYQogIyBiYXR0ZXJpZXMgaW5jbHVkZWQgcHl0aG9uLgpAQCAtMTQzLDE1ICsxOTUsMTI2IEBACiBkZWYgbGlicmFyeV9yZWNpcGVzKCk6CiAgICAgcmVzdWx0ID0gW10KIAotICAgIGlmIERFUFRBUkdFVCA8ICcxMC41JzoKKyAgICBMVF8xMF81ID0gYm9vbChnZXREZXB0YXJnZXRUdXBsZSgpIDwgKDEwLCA1KSkKKworIyAgIERpc2FibGUgZm9yIG5vdworICAgIGlmIEZhbHNlOiAgICMgaWYgKGdldERlcHRhcmdldFR1cGxlKCkgPiAoMTAsIDUpKSBhbmQgKGdldFZlcnNpb25UdXBsZSgpID49ICgzLCA1KSk6CisgICAgICAgIHJlc3VsdC5leHRlbmQoWworICAgICAgICAgIGRpY3QoCisgICAgICAgICAgICAgIG5hbWU9IlRjbCA4LjUuMTUiLAorICAgICAgICAgICAgICB1cmw9ImZ0cDovL2Z0cC50Y2wudGsvcHViL3RjbC8vdGNsOF81L3RjbDguNS4xNS1zcmMudGFyLmd6IiwKKyAgICAgICAgICAgICAgY2hlY2tzdW09J2YzZGYxNjJmOTJjNjliMjU0MDc5YzRkMGFmN2E2OTBmJywKKyAgICAgICAgICAgICAgYnVpbGREaXI9InVuaXgiLAorICAgICAgICAgICAgICBjb25maWd1cmVfcHJlPVsKKyAgICAgICAgICAgICAgICAgICAgJy0tZW5hYmxlLXNoYXJlZCcsCisgICAgICAgICAgICAgICAgICAgICctLWVuYWJsZS10aHJlYWRzJywKKyAgICAgICAgICAgICAgICAgICAgJy0tbGliZGlyPS9MaWJyYXJ5L0ZyYW1ld29ya3MvUHl0aG9uLmZyYW1ld29yay9WZXJzaW9ucy8lcy9saWInJShnZXRWZXJzaW9uKCksKSwKKyAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgdXNlTERGbGFncz1GYWxzZSwKKyAgICAgICAgICAgICAgaW5zdGFsbD0nbWFrZSBUQ0xfTElCUkFSWT0lKFRDTF9MSUJSQVJZKXMgJiYgbWFrZSBpbnN0YWxsIFRDTF9MSUJSQVJZPSUoVENMX0xJQlJBUlkpcyBERVNURElSPSUoREVTVERJUilzJyV7CisgICAgICAgICAgICAgICAgICAiREVTVERJUiI6IHNoZWxsUXVvdGUob3MucGF0aC5qb2luKFdPUktESVIsICdsaWJyYXJpZXMnKSksCisgICAgICAgICAgICAgICAgICAiVENMX0xJQlJBUlkiOiBzaGVsbFF1b3RlKCcvTGlicmFyeS9GcmFtZXdvcmtzL1B5dGhvbi5mcmFtZXdvcmsvVmVyc2lvbnMvJXMvbGliL3RjbDguNSclKGdldFZlcnNpb24oKSkpLAorICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICBkaWN0KAorICAgICAgICAgICAgICBuYW1lPSJUayA4LjUuMTUiLAorICAgICAgICAgICAgICB1cmw9ImZ0cDovL2Z0cC50Y2wudGsvcHViL3RjbC8vdGNsOF81L3RrOC41LjE1LXNyYy50YXIuZ3oiLAorICAgICAgICAgICAgICBjaGVja3N1bT0nNTViOGUzM2Y5MDMyMTBhNGUxYzhiY2UwZjgyMDY1N2YnLAorICAgICAgICAgICAgICBwYXRjaGVzPVsKKyAgICAgICAgICAgICAgICAgICJpc3N1ZTE5MzczX3RrXzhfNV8xNV9zb3VyY2UucGF0Y2giLAorICAgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgIGJ1aWxkRGlyPSJ1bml4IiwKKyAgICAgICAgICAgICAgY29uZmlndXJlX3ByZT1bCisgICAgICAgICAgICAgICAgICAgICctLWVuYWJsZS1hcXVhJywKKyAgICAgICAgICAgICAgICAgICAgJy0tZW5hYmxlLXNoYXJlZCcsCisgICAgICAgICAgICAgICAgICAgICctLWVuYWJsZS10aHJlYWRzJywKKyAgICAgICAgICAgICAgICAgICAgJy0tbGliZGlyPS9MaWJyYXJ5L0ZyYW1ld29ya3MvUHl0aG9uLmZyYW1ld29yay9WZXJzaW9ucy8lcy9saWInJShnZXRWZXJzaW9uKCksKSwKKyAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgdXNlTERGbGFncz1GYWxzZSwKKyAgICAgICAgICAgICAgaW5zdGFsbD0nbWFrZSBUQ0xfTElCUkFSWT0lKFRDTF9MSUJSQVJZKXMgVEtfTElCUkFSWT0lKFRLX0xJQlJBUlkpcyAmJiBtYWtlIGluc3RhbGwgVENMX0xJQlJBUlk9JShUQ0xfTElCUkFSWSlzIFRLX0xJQlJBUlk9JShUS19MSUJSQVJZKXMgREVTVERJUj0lKERFU1RESVIpcycleworICAgICAgICAgICAgICAgICAgIkRFU1RESVIiOiBzaGVsbFF1b3RlKG9zLnBhdGguam9pbihXT1JLRElSLCAnbGlicmFyaWVzJykpLAorICAgICAgICAgICAgICAgICAgIlRDTF9MSUJSQVJZIjogc2hlbGxRdW90ZSgnL0xpYnJhcnkvRnJhbWV3b3Jrcy9QeXRob24uZnJhbWV3b3JrL1ZlcnNpb25zLyVzL2xpYi90Y2w4LjUnJShnZXRWZXJzaW9uKCkpKSwKKyAgICAgICAgICAgICAgICAgICJUS19MSUJSQVJZIjogc2hlbGxRdW90ZSgnL0xpYnJhcnkvRnJhbWV3b3Jrcy9QeXRob24uZnJhbWV3b3JrL1ZlcnNpb25zLyVzL2xpYi90azguNSclKGdldFZlcnNpb24oKSkpLAorICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICBdKQorCisgICAgaWYgZ2V0VmVyc2lvblR1cGxlKCkgPj0gKDMsIDMpOgorICAgICAgICByZXN1bHQuZXh0ZW5kKFsKKyAgICAgICAgICBkaWN0KAorICAgICAgICAgICAgICBuYW1lPSJYWiA1LjAuNSIsCisgICAgICAgICAgICAgIHVybD0iaHR0cDovL3R1a2Fhbmkub3JnL3h6L3h6LTUuMC41LnRhci5neiIsCisgICAgICAgICAgICAgIGNoZWNrc3VtPScxOWQ5MjRlMDY2YjZmZmYwYmM5ZDE5ODFiNGU1MzE5NicsCisgICAgICAgICAgICAgIGNvbmZpZ3VyZV9wcmU9WworICAgICAgICAgICAgICAgICAgICAnLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcnLAorICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICksCisgICAgICAgIF0pCisKKyAgICByZXN1bHQuZXh0ZW5kKFsKKyAgICAgICAgICBkaWN0KAorICAgICAgICAgICAgICBuYW1lPSJOQ3Vyc2VzIDUuOSIsCisgICAgICAgICAgICAgIHVybD0iaHR0cDovL2Z0cC5nbnUub3JnL3B1Yi9nbnUvbmN1cnNlcy9uY3Vyc2VzLTUuOS50YXIuZ3oiLAorICAgICAgICAgICAgICBjaGVja3N1bT0nOGNiOWM0MTJlNWYyZDk2YmM2ZjQ1OWFhOGM2MjgyYTEnLAorICAgICAgICAgICAgICBjb25maWd1cmVfcHJlPVsKKyAgICAgICAgICAgICAgICAgICItLWVuYWJsZS13aWRlYyIsCisgICAgICAgICAgICAgICAgICAiLS13aXRob3V0LWN4eCIsCisgICAgICAgICAgICAgICAgICAiLS13aXRob3V0LWN4eC1iaW5kaW5nIiwKKyAgICAgICAgICAgICAgICAgICItLXdpdGhvdXQtYWRhIiwKKyAgICAgICAgICAgICAgICAgICItLXdpdGhvdXQtY3Vyc2VzLWgiLAorICAgICAgICAgICAgICAgICAgIi0tZW5hYmxlLXNoYXJlZCIsCisgICAgICAgICAgICAgICAgICAiLS13aXRoLXNoYXJlZCIsCisgICAgICAgICAgICAgICAgICAiLS13aXRob3V0LWRlYnVnIiwKKyAgICAgICAgICAgICAgICAgICItLXdpdGhvdXQtbm9ybWFsIiwKKyAgICAgICAgICAgICAgICAgICItLXdpdGhvdXQtdGVzdHMiLAorICAgICAgICAgICAgICAgICAgIi0td2l0aG91dC1tYW5wYWdlcyIsCisgICAgICAgICAgICAgICAgICAiLS1kYXRhZGlyPS91c3Ivc2hhcmUiLAorICAgICAgICAgICAgICAgICAgIi0tc3lzY29uZmRpcj0vZXRjIiwKKyAgICAgICAgICAgICAgICAgICItLXNoYXJlZHN0YXRlZGlyPS91c3IvY29tIiwKKyAgICAgICAgICAgICAgICAgICItLXdpdGgtdGVybWluZm8tZGlycz0vdXNyL3NoYXJlL3Rlcm1pbmZvIiwKKyAgICAgICAgICAgICAgICAgICItLXdpdGgtZGVmYXVsdC10ZXJtaW5mby1kaXI9L3Vzci9zaGFyZS90ZXJtaW5mbyIsCisgICAgICAgICAgICAgICAgICAiLS1saWJkaXI9L0xpYnJhcnkvRnJhbWV3b3Jrcy9QeXRob24uZnJhbWV3b3JrL1ZlcnNpb25zLyVzL2xpYiIlKGdldFZlcnNpb24oKSwpLAorICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICBwYXRjaHNjcmlwdHM9WworICAgICAgICAgICAgICAgICAgKCJmdHA6Ly9pbnZpc2libGUtaXNsYW5kLm5ldC9uY3Vyc2VzLy81LjkvbmN1cnNlcy01LjktMjAxMjA2MTYtcGF0Y2guc2guYnoyIiwKKyAgICAgICAgICAgICAgICAgICAiZjU0YmYwMmEzNDlmOTZhN2M0ZjBkMDA5MjJmM2EwZDQiKSwKKyAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICB1c2VMREZsYWdzPUZhbHNlLAorICAgICAgICAgICAgICBpbnN0YWxsPSdtYWtlICYmIG1ha2UgaW5zdGFsbCBERVNURElSPSVzICYmIGNkICVzL3Vzci9sb2NhbC9saWIgJiYgbG4gLWZzIC4uLy4uLy4uL0xpYnJhcnkvRnJhbWV3b3Jrcy9QeXRob24uZnJhbWV3b3JrL1ZlcnNpb25zLyVzL2xpYi9saWIqIC4nJSgKKyAgICAgICAgICAgICAgICAgIHNoZWxsUXVvdGUob3MucGF0aC5qb2luKFdPUktESVIsICdsaWJyYXJpZXMnKSksCisgICAgICAgICAgICAgICAgICBzaGVsbFF1b3RlKG9zLnBhdGguam9pbihXT1JLRElSLCAnbGlicmFyaWVzJykpLAorICAgICAgICAgICAgICAgICAgZ2V0VmVyc2lvbigpLAorICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICApLAorICAgICAgICAgIGRpY3QoCisgICAgICAgICAgICAgIG5hbWU9IlNRTGl0ZSAzLjguMy4xIiwKKyAgICAgICAgICAgICAgdXJsPSJodHRwOi8vd3d3LnNxbGl0ZS5vcmcvMjAxNC9zcWxpdGUtYXV0b2NvbmYtMzA4MDMwMS50YXIuZ3oiLAorICAgICAgICAgICAgICBjaGVja3N1bT0nNTA5ZmY5OGQ4ZGM5NzI5YjYxOGI3ZTk2NjEyMDc5YzYnLAorICAgICAgICAgICAgICBleHRyYV9jZmxhZ3M9KCctT3MgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICctRFNRTElURV9FTkFCTEVfRlRTNCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1EU1FMSVRFX0VOQUJMRV9GVFMzX1BBUkVOVEhFU0lTICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLURTUUxJVEVfRU5BQkxFX1JUUkVFICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLURTUUxJVEVfVENMPTAgJworICAgICAgICAgICAgICAgICAnJXMnICUgKCcnLCctRFNRTElURV9XSVRIT1VUX1pPTkVNQUxMT0MgJylbTFRfMTBfNV0pLAorICAgICAgICAgICAgICBjb25maWd1cmVfcHJlPVsKKyAgICAgICAgICAgICAgICAgICctLWVuYWJsZS10aHJlYWRzYWZlJywKKyAgICAgICAgICAgICAgICAgICctLWVuYWJsZS1zaGFyZWQ9bm8nLAorICAgICAgICAgICAgICAgICAgJy0tZW5hYmxlLXN0YXRpYz15ZXMnLAorICAgICAgICAgICAgICAgICAgJy0tZGlzYWJsZS1yZWFkbGluZScsCisgICAgICAgICAgICAgICAgICAnLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcnLAorICAgICAgICAgICAgICBdCisgICAgICAgICAgKSwKKyAgICAgICAgXSkKKworICAgIGlmIGdldERlcHRhcmdldFR1cGxlKCkgPCAoMTAsIDUpOgogICAgICAgICByZXN1bHQuZXh0ZW5kKFsKICAgICAgICAgICBkaWN0KAogICAgICAgICAgICAgICBuYW1lPSJCemlwMiAxLjAuNiIsCiAgICAgICAgICAgICAgIHVybD0iaHR0cDovL2J6aXAub3JnLzEuMC42L2J6aXAyLTEuMC42LnRhci5neiIsCiAgICAgICAgICAgICAgIGNoZWNrc3VtPScwMGI1MTZmNDcwNGQ0YTdjYjUwYTFkOTdlNmU4ZTE1YicsCiAgICAgICAgICAgICAgIGNvbmZpZ3VyZT1Ob25lLAotICAgICAgICAgICAgICBpbnN0YWxsPSdtYWtlIGluc3RhbGwgQ0M9JXMgUFJFRklYPSVzL3Vzci9sb2NhbC8gQ0ZMQUdTPSItYXJjaCAlcyAtaXN5c3Jvb3QgJXMiJyUoCi0gICAgICAgICAgICAgICAgICBDQywKKyAgICAgICAgICAgICAgaW5zdGFsbD0nbWFrZSBpbnN0YWxsIENDPSVzIENYWD0lcywgUFJFRklYPSVzL3Vzci9sb2NhbC8gQ0ZMQUdTPSItYXJjaCAlcyAtaXN5c3Jvb3QgJXMiJyUoCisgICAgICAgICAgICAgICAgICBDQywgQ1hYLAogICAgICAgICAgICAgICAgICAgc2hlbGxRdW90ZShvcy5wYXRoLmpvaW4oV09SS0RJUiwgJ2xpYnJhcmllcycpKSwKICAgICAgICAgICAgICAgICAgICcgLWFyY2ggJy5qb2luKEFSQ0hMSVNUKSwKICAgICAgICAgICAgICAgICAgIFNES1BBVEgsCkBAIC0xNjIsOCArMzI1LDggQEAKICAgICAgICAgICAgICAgdXJsPSJodHRwOi8vd3d3Lmd6aXAub3JnL3psaWIvemxpYi0xLjIuMy50YXIuZ3oiLAogICAgICAgICAgICAgICBjaGVja3N1bT0nZGViYzYyNzU4NzE2YTE2OWRmOWY2MmU2YWIyYmM2MzQnLAogICAgICAgICAgICAgICBjb25maWd1cmU9Tm9uZSwKLSAgICAgICAgICAgICAgaW5zdGFsbD0nbWFrZSBpbnN0YWxsIENDPSVzIHByZWZpeD0lcy91c3IvbG9jYWwvIENGTEFHUz0iLWFyY2ggJXMgLWlzeXNyb290ICVzIiclKAotICAgICAgICAgICAgICAgICAgQ0MsCisgICAgICAgICAgICAgIGluc3RhbGw9J21ha2UgaW5zdGFsbCBDQz0lcyBDWFg9JXMsIHByZWZpeD0lcy91c3IvbG9jYWwvIENGTEFHUz0iLWFyY2ggJXMgLWlzeXNyb290ICVzIiclKAorICAgICAgICAgICAgICAgICAgQ0MsIENYWCwKICAgICAgICAgICAgICAgICAgIHNoZWxsUXVvdGUob3MucGF0aC5qb2luKFdPUktESVIsICdsaWJyYXJpZXMnKSksCiAgICAgICAgICAgICAgICAgICAnIC1hcmNoICcuam9pbihBUkNITElTVCksCiAgICAgICAgICAgICAgICAgICBTREtQQVRILApAQCAtMTc4LDU4ICszNDEsMTIgQEAKICAgICAgICAgICAgICAgcGF0Y2hlcz1bCiAgICAgICAgICAgICAgICAgICAjIFRoZSByZWFkbGluZSBtYWludGFpbmVycyBkb24ndCBkbyBhY3R1YWwgbWljcm8gcmVsZWFzZXMsIGJ1dAogICAgICAgICAgICAgICAgICAgIyBqdXN0IHNoaXAgYSBzZXQgb2YgcGF0Y2hlcy4KLSAgICAgICAgICAgICAgICAgICdodHRwOi8vZnRwLmdudS5vcmcvcHViL2dudS9yZWFkbGluZS9yZWFkbGluZS02LjEtcGF0Y2hlcy9yZWFkbGluZTYxLTAwMScsCi0gICAgICAgICAgICAgICAgICAnaHR0cDovL2Z0cC5nbnUub3JnL3B1Yi9nbnUvcmVhZGxpbmUvcmVhZGxpbmUtNi4xLXBhdGNoZXMvcmVhZGxpbmU2MS0wMDInLAorICAgICAgICAgICAgICAgICAgKCdodHRwOi8vZnRwLmdudS5vcmcvcHViL2dudS9yZWFkbGluZS9yZWFkbGluZS02LjEtcGF0Y2hlcy9yZWFkbGluZTYxLTAwMScsCisgICAgICAgICAgICAgICAgICAgJ2M2NDJmMmU4NGQ4MjA4ODRiMGJmOWZkMTc2YmM2YzNmJyksCisgICAgICAgICAgICAgICAgICAoJ2h0dHA6Ly9mdHAuZ251Lm9yZy9wdWIvZ251L3JlYWRsaW5lL3JlYWRsaW5lLTYuMS1wYXRjaGVzL3JlYWRsaW5lNjEtMDAyJywKKyAgICAgICAgICAgICAgICAgICAnMWE3Njc4MWExZWE3MzRlODMxNTg4Mjg1ZGI3ZWM5YjEnKSwKICAgICAgICAgICAgICAgXQogICAgICAgICAgICksCi0gICAgICAgICAgZGljdCgKLSAgICAgICAgICAgICAgbmFtZT0iU1FMaXRlIDMuNy40IiwKLSAgICAgICAgICAgICAgdXJsPSJodHRwOi8vd3d3LnNxbGl0ZS5vcmcvc3FsaXRlLWF1dG9jb25mLTMwNzA0MDAudGFyLmd6IiwKLSAgICAgICAgICAgICAgY2hlY2tzdW09JzhmMGM2OTBiZmIzM2MzY2JiYzI0NzFjM2Q5YmEwMTU4JywKLSAgICAgICAgICAgICAgY29uZmlndXJlX2Vudj0oJ0NGTEFHUz0iLU9zJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgLURTUUxJVEVfRU5BQkxFX0ZUUzMnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAtRFNRTElURV9FTkFCTEVfRlRTM19QQVJFTlRIRVNJUycKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIC1EU1FMSVRFX0VOQUJMRV9SVFJFRScKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIC1EU1FMSVRFX1RDTD0wJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICciJyksCi0gICAgICAgICAgICAgIGNvbmZpZ3VyZV9wcmU9WwotICAgICAgICAgICAgICAgICAgJy0tZW5hYmxlLXRocmVhZHNhZmUnLAotICAgICAgICAgICAgICAgICAgJy0tZW5hYmxlLXNoYXJlZD1ubycsCi0gICAgICAgICAgICAgICAgICAnLS1lbmFibGUtc3RhdGljPXllcycsCi0gICAgICAgICAgICAgICAgICAnLS1kaXNhYmxlLXJlYWRsaW5lJywKLSAgICAgICAgICAgICAgICAgICctLWRpc2FibGUtZGVwZW5kZW5jeS10cmFja2luZycsCi0gICAgICAgICAgICAgIF0KLSAgICAgICAgICApLAotICAgICAgICAgIGRpY3QoCi0gICAgICAgICAgICAgIG5hbWU9Ik5DdXJzZXMgNS41IiwKLSAgICAgICAgICAgICAgdXJsPSJodHRwOi8vZnRwLmdudS5vcmcvcHViL2dudS9uY3Vyc2VzL25jdXJzZXMtNS41LnRhci5neiIsCi0gICAgICAgICAgICAgIGNoZWNrc3VtPSdlNzNjMWFjMTBiNGJmYzQ2ZGI0M2IyZGRmZDYyNDRlZicsCi0gICAgICAgICAgICAgIGNvbmZpZ3VyZV9wcmU9WwotICAgICAgICAgICAgICAgICAgIi0tZW5hYmxlLXdpZGVjIiwKLSAgICAgICAgICAgICAgICAgICItLXdpdGhvdXQtY3h4IiwKLSAgICAgICAgICAgICAgICAgICItLXdpdGhvdXQtYWRhIiwKLSAgICAgICAgICAgICAgICAgICItLXdpdGhvdXQtcHJvZ3MiLAotICAgICAgICAgICAgICAgICAgIi0td2l0aG91dC1jdXJzZXMtaCIsCi0gICAgICAgICAgICAgICAgICAiLS1lbmFibGUtc2hhcmVkIiwKLSAgICAgICAgICAgICAgICAgICItLXdpdGgtc2hhcmVkIiwKLSAgICAgICAgICAgICAgICAgICItLWRhdGFkaXI9L3Vzci9zaGFyZSIsCi0gICAgICAgICAgICAgICAgICAiLS1zeXNjb25mZGlyPS9ldGMiLAotICAgICAgICAgICAgICAgICAgIi0tc2hhcmVkc3RhdGVkaXI9L3Vzci9jb20iLAotICAgICAgICAgICAgICAgICAgIi0td2l0aC10ZXJtaW5mby1kaXJzPS91c3Ivc2hhcmUvdGVybWluZm8iLAotICAgICAgICAgICAgICAgICAgIi0td2l0aC1kZWZhdWx0LXRlcm1pbmZvLWRpcj0vdXNyL3NoYXJlL3Rlcm1pbmZvIiwKLSAgICAgICAgICAgICAgICAgICItLWxpYmRpcj0vTGlicmFyeS9GcmFtZXdvcmtzL1B5dGhvbi5mcmFtZXdvcmsvVmVyc2lvbnMvJXMvbGliIiUoZ2V0VmVyc2lvbigpLCksCi0gICAgICAgICAgICAgICAgICAiLS1lbmFibGUtdGVybWNhcCIsCi0gICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAgIHBhdGNoZXM9WwotICAgICAgICAgICAgICAgICAgIm5jdXJzZXMtNS41LnBhdGNoIiwKLSAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICAgdXNlTERGbGFncz1GYWxzZSwKLSAgICAgICAgICAgICAgaW5zdGFsbD0nbWFrZSAmJiBtYWtlIGluc3RhbGwgREVTVERJUj0lcyAmJiBjZCAlcy91c3IvbG9jYWwvbGliICYmIGxuIC1mcyAuLi8uLi8uLi9MaWJyYXJ5L0ZyYW1ld29ya3MvUHl0aG9uLmZyYW1ld29yay9WZXJzaW9ucy8lcy9saWIvbGliKiAuJyUoCi0gICAgICAgICAgICAgICAgICBzaGVsbFF1b3RlKG9zLnBhdGguam9pbihXT1JLRElSLCAnbGlicmFyaWVzJykpLAotICAgICAgICAgICAgICAgICAgc2hlbGxRdW90ZShvcy5wYXRoLmpvaW4oV09SS0RJUiwgJ2xpYnJhcmllcycpKSwKLSAgICAgICAgICAgICAgICAgIGdldFZlcnNpb24oKSwKLSAgICAgICAgICAgICAgICAgICksCi0gICAgICAgICAgKSwKICAgICAgICAgXSkKIAogICAgIGlmIG5vdCBQWVRIT05fMzoKQEAgLTI1Miw2ICszNjksOCBAQAogIyBJbnN0cnVjdGlvbnMgZm9yIGJ1aWxkaW5nIHBhY2thZ2VzIGluc2lkZSB0aGUgLm1wa2cuCiBkZWYgcGtnX3JlY2lwZXMoKToKICAgICB1bnNlbGVjdGVkX2Zvcl9weXRob24zID0gKCdzZWxlY3RlZCcsICd1bnNlbGVjdGVkJylbUFlUSE9OXzNdCisgICAgIyB1bnNlbGVjdGVkIGlmIDMuMCB0aHJvdWdoIDMuMywgc2VsZWN0ZWQgb3RoZXJ3aXNlICgyLnggb3IgPj0gMy40KQorICAgIHVuc2VsZWN0ZWRfZm9yX2x0X3B5dGhvbjM0ID0gKCdzZWxlY3RlZCcsICd1bnNlbGVjdGVkJylbKDMsIDApIDw9IGdldFZlcnNpb25UdXBsZSgpIDwgKDMsIDQpXQogICAgIHJlc3VsdCA9IFsKICAgICAgICAgZGljdCgKICAgICAgICAgICAgIG5hbWU9IlB5dGhvbkZyYW1ld29yayIsCkBAIC0yOTgsOSArNDE3LDcgQEAKICAgICAgICAgICAgIHNvdXJjZT0iL3B5ZG9jcyIsCiAgICAgICAgICAgICByZWFkbWU9IiIiXAogICAgICAgICAgICAgICAgIFRoaXMgcGFja2FnZSBpbnN0YWxscyB0aGUgcHl0aG9uIGRvY3VtZW50YXRpb24gYXQgYSBsb2NhdGlvbgotICAgICAgICAgICAgICAgIHRoYXQgaXMgdXNlYWJsZSBmb3IgcHlkb2MgYW5kIElETEUuIElmIHlvdSBoYXZlIGluc3RhbGxlZCBYY29kZQotICAgICAgICAgICAgICAgIGl0IHdpbGwgYWxzbyBpbnN0YWxsIGEgbGluayB0byB0aGUgZG9jdW1lbnRhdGlvbiBpbgotICAgICAgICAgICAgICAgIC9EZXZlbG9wZXIvRG9jdW1lbnRhdGlvbi9QeXRob24KKyAgICAgICAgICAgICAgICB0aGF0IGlzIHVzZWFibGUgZm9yIHB5ZG9jIGFuZCBJRExFLgogICAgICAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgIHBvc3RmbGlnaHQ9InNjcmlwdHMvcG9zdGZsaWdodC5kb2N1bWVudGF0aW9uIiwKICAgICAgICAgICAgIHJlcXVpcmVkPUZhbHNlLApAQCAtMzIyLDExICs0MzksMjggQEAKICAgICAgICAgICAgIHRvcGRpcj0iL0xpYnJhcnkvRnJhbWV3b3Jrcy9QeXRob24uZnJhbWV3b3JrIiwKICAgICAgICAgICAgIHNvdXJjZT0iL2VtcHR5LWRpciIsCiAgICAgICAgICAgICByZXF1aXJlZD1GYWxzZSwKLSAgICAgICAgICAgIHNlbGVjdGVkPXVuc2VsZWN0ZWRfZm9yX3B5dGhvbjMsCisgICAgICAgICAgICBzZWxlY3RlZD11bnNlbGVjdGVkX2Zvcl9sdF9weXRob24zNCwKICAgICAgICAgKSwKICAgICBdCiAKLSAgICBpZiBERVBUQVJHRVQgPCAnMTAuNCc6CisgICAgaWYgZ2V0VmVyc2lvblR1cGxlKCkgPj0gKDMsIDQpOgorICAgICAgICByZXN1bHQuYXBwZW5kKAorICAgICAgICAgICAgZGljdCgKKyAgICAgICAgICAgICAgICBuYW1lPSJQeXRob25JbnN0YWxsUGlwIiwKKyAgICAgICAgICAgICAgICBsb25nX25hbWU9Ikluc3RhbGwgb3IgdXBncmFkZSBwaXAiLAorICAgICAgICAgICAgICAgIHJlYWRtZT0iIiJcCisgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFja2FnZSBpbnN0YWxscyAob3IgdXBncmFkZXMgZnJvbSBhbiBlYXJsaWVyIHZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgIHBpcCwgYSB0b29sIGZvciBpbnN0YWxsaW5nIGFuZCBtYW5hZ2luZyBQeXRob24gcGFja2FnZXMuCisgICAgICAgICAgICAgICAgICAgICIiIiwKKyAgICAgICAgICAgICAgICBwb3N0ZmxpZ2h0PSJzY3JpcHRzL3Bvc3RmbGlnaHQuZW5zdXJlcGlwIiwKKyAgICAgICAgICAgICAgICB0b3BkaXI9Ii9MaWJyYXJ5L0ZyYW1ld29ya3MvUHl0aG9uLmZyYW1ld29yayIsCisgICAgICAgICAgICAgICAgc291cmNlPSIvZW1wdHktZGlyIiwKKyAgICAgICAgICAgICAgICByZXF1aXJlZD1GYWxzZSwKKyAgICAgICAgICAgICAgICBzZWxlY3RlZD0nc2VsZWN0ZWQnLAorICAgICAgICAgICAgKQorICAgICAgICApCisKKyAgICBpZiBnZXREZXB0YXJnZXRUdXBsZSgpIDwgKDEwLCA0KSBhbmQgbm90IFBZVEhPTl8zOgogICAgICAgICByZXN1bHQuYXBwZW5kKAogICAgICAgICAgICAgZGljdCgKICAgICAgICAgICAgICAgICBuYW1lPSJQeXRob25TeXN0ZW1GaXhlcyIsCkBAIC0zNDMsNiArNDc3LDcgQEAKICAgICAgICAgICAgICAgICBzZWxlY3RlZD11bnNlbGVjdGVkX2Zvcl9weXRob24zLAogICAgICAgICAgICAgKQogICAgICAgICApCisKICAgICByZXR1cm4gcmVzdWx0CiAKIGRlZiBmYXRhbChtc2cpOgpAQCAtMzU4LDcgKzQ5Myw3IEBACiAgICAgIiIiCiAgICAgUmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgbmFtZWQgZmlsZQogICAgICIiIgotICAgIHJldHVybiBvcGVuKGZuLCAncmInKS5yZWFkKCkKKyAgICByZXR1cm4gb3BlbihmbiwgJ3InKS5yZWFkKCkKIAogZGVmIHJ1bkNvbW1hbmQoY29tbWFuZGxpbmUpOgogICAgICIiIgpAQCAtMzcwLDcgKzUwNSw3IEBACiAgICAgeGl0ID0gZmQuY2xvc2UoKQogICAgIGlmIHhpdCBpcyBub3QgTm9uZToKICAgICAgICAgc3lzLnN0ZG91dC53cml0ZShkYXRhKQotICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJjb21tYW5kIGZhaWxlZDogJXMiJShjb21tYW5kbGluZSwpCisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiY29tbWFuZCBmYWlsZWQ6ICVzIiUoY29tbWFuZGxpbmUsKSkKIAogICAgIGlmIFZFUkJPU0U6CiAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoZGF0YSk7IHN5cy5zdGRvdXQuZmx1c2goKQpAQCAtMzgxLDcgKzUxNiw3IEBACiAgICAgeGl0ID0gZmQuY2xvc2UoKQogICAgIGlmIHhpdCBpcyBub3QgTm9uZToKICAgICAgICAgc3lzLnN0ZG91dC53cml0ZShkYXRhKQotICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJjb21tYW5kIGZhaWxlZDogJXMiJShjb21tYW5kbGluZSwpCisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiY29tbWFuZCBmYWlsZWQ6ICVzIiUoY29tbWFuZGxpbmUsKSkKIAogICAgIHJldHVybiBkYXRhCiAKQEAgLTQyMyw0NyArNTU4LDcyIEBACiAgICAgIyBCZWNhdXNlIHdlIG9ubHkgc3VwcG9ydCBkeW5hbWljIGxvYWQgb2Ygb25seSBvbmUgbWFqb3IvbWlub3IgdmVyc2lvbiBvZgogICAgICMgVGNsL1RrLCBlbnN1cmU6CiAgICAgIyAxLiB0aGVyZSBhcmUgbm8gdXNlci1pbnN0YWxsZWQgZnJhbWV3b3JrcyBvZiBUY2wvVGsgd2l0aCB2ZXJzaW9uCi0gICAgIyAgICAgICBoaWdoZXIgdGhhbiB0aGUgQXBwbGUtc3VwcGxpZWQgc3lzdGVtIHZlcnNpb24KLSAgICAjIDIuIHRoZXJlIGlzIGEgdXNlci1pbnN0YWxsZWQgZnJhbWV3b3JrIGluIC9MaWJyYXJ5L0ZyYW1ld29ya3Mgd2l0aCB0aGUKLSAgICAjICAgICAgIHNhbWUgdmVyc2lvbiBhcyB0aGUgc3lzdGVtIHZlcnNpb24uICBUaGlzIGFsbG93cyB1c2VycyB0byBjaG9vc2UKLSAgICAjICAgICAgIHRvIGluc3RhbGwgYSBuZXdlciBwYXRjaCBsZXZlbC4KKyAgICAjICAgICAgIGhpZ2hlciB0aGFuIHRoZSBBcHBsZS1zdXBwbGllZCBzeXN0ZW0gdmVyc2lvbiBpbgorICAgICMgICAgICAgU0RLUk9PVC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzCisgICAgIyAyLiB0aGVyZSBpcyBhIHVzZXItaW5zdGFsbGVkIGZyYW1ld29yayAodXN1YWxseSBBY3RpdmVUY2wpIGluIChvciBsaW5rZWQKKyAgICAjICAgICAgIGluKSBTREtST09UL0xpYnJhcnkvRnJhbWV3b3JrcyB3aXRoIHRoZSBzYW1lIHZlcnNpb24gYXMgdGhlIHN5c3RlbQorICAgICMgICAgICAgdmVyc2lvbi4gVGhpcyBhbGxvd3MgdXNlcnMgdG8gY2hvb3NlIHRvIGluc3RhbGwgYSBuZXdlciBwYXRjaCBsZXZlbC4KIAorICAgIGZyYW1ld29ya3MgPSB7fQogICAgIGZvciBmcmFtZXdvcmsgaW4gWydUY2wnLCAnVGsnXToKLSAgICAgICAgI2Z3ID0gZGljdChsb3dlcj1mcmFtZXdvcmsubG93ZXIoKSwKLSAgICAgICAgIyAgICAgICAgICAgIHVwcGVyPWZyYW1ld29yay51cHBlcigpLAotICAgICAgICAjICAgICAgICAgICAgY2FwPWZyYW1ld29yay5jYXBpdGFsaXplKCkpCi0gICAgICAgICNmd3B0aCA9ICJMaWJyYXJ5L0ZyYW1ld29ya3MvJShjYXApcy5mcmFtZXdvcmsvJShsb3dlcilzQ29uZmlnLnNoIiAlIGZ3Ci0gICAgICAgIGZ3cHRoID0gJ0xpYnJhcnkvRnJhbWV3b3Jrcy9UY2wuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQnCisgICAgICAgIGZ3cHRoID0gJ0xpYnJhcnkvRnJhbWV3b3Jrcy8lcy5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudCcgJSBmcmFtZXdvcmsKICAgICAgICAgc3lzZncgPSBvcy5wYXRoLmpvaW4oU0RLUEFUSCwgJ1N5c3RlbScsIGZ3cHRoKQotICAgICAgICBsaWJmdyA9IG9zLnBhdGguam9pbignLycsIGZ3cHRoKQorICAgICAgICBsaWJmdyA9IG9zLnBhdGguam9pbihTREtQQVRILCBmd3B0aCkKICAgICAgICAgdXNyZncgPSBvcy5wYXRoLmpvaW4ob3MuZ2V0ZW52KCdIT01FJyksIGZ3cHRoKQotICAgICAgICAjdmVyc2lvbiA9ICIlKHVwcGVyKXNfVkVSU0lPTiIgJSBmdworICAgICAgICBmcmFtZXdvcmtzW2ZyYW1ld29ya10gPSBvcy5yZWFkbGluayhzeXNmdykKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGxpYmZ3KToKKyAgICAgICAgICAgIGZhdGFsKCJQbGVhc2UgaW5zdGFsbCBhIGxpbmsgdG8gYSBjdXJyZW50ICVzICVzIGFzICVzIHNvICIKKyAgICAgICAgICAgICAgICAgICAgInRoZSB1c2VyIGNhbiBvdmVycmlkZSB0aGUgc3lzdGVtIGZyYW1ld29yay4iCisgICAgICAgICAgICAgICAgICAgICUgKGZyYW1ld29yaywgZnJhbWV3b3Jrc1tmcmFtZXdvcmtdLCBsaWJmdykpCiAgICAgICAgIGlmIG9zLnJlYWRsaW5rKGxpYmZ3KSAhPSBvcy5yZWFkbGluayhzeXNmdyk6CiAgICAgICAgICAgICBmYXRhbCgiVmVyc2lvbiBvZiAlcyBtdXN0IG1hdGNoICVzIiAlIChsaWJmdywgc3lzZncpICkKICAgICAgICAgaWYgb3MucGF0aC5leGlzdHModXNyZncpOgogICAgICAgICAgICAgZmF0YWwoIlBsZWFzZSByZW5hbWUgJXMgdG8gYXZvaWQgcG9zc2libGUgZHluYW1pYyBsb2FkIGlzc3Vlcy4iCiAgICAgICAgICAgICAgICAgICAgICUgdXNyZncpCiAKKyAgICBpZiBmcmFtZXdvcmtzWydUY2wnXSAhPSBmcmFtZXdvcmtzWydUayddOgorICAgICAgICBmYXRhbCgiVGhlIFRjbCBhbmQgVGsgZnJhbWV3b3JrcyBhcmUgbm90IHRoZSBzYW1lIHZlcnNpb24uIikKKworICAgICMgYWRkIGZpbGVzIHRvIGNoZWNrIGFmdGVyIGJ1aWxkCisgICAgRVhQRUNURURfU0hBUkVEX0xJQlNbJ190a2ludGVyLnNvJ10gPSBbCisgICAgICAgICAgICAiL0xpYnJhcnkvRnJhbWV3b3Jrcy9UY2wuZnJhbWV3b3JrL1ZlcnNpb25zLyVzL1RjbCIKKyAgICAgICAgICAgICAgICAlIGZyYW1ld29ya3NbJ1RjbCddLAorICAgICAgICAgICAgIi9MaWJyYXJ5L0ZyYW1ld29ya3MvVGsuZnJhbWV3b3JrL1ZlcnNpb25zLyVzL1RrIgorICAgICAgICAgICAgICAgICUgZnJhbWV3b3Jrc1snVGsnXSwKKyAgICAgICAgICAgIF0KKwogICAgICMgUmVtb3ZlIGluaGVyaXRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2hpY2ggbWlnaHQgaW5mbHVlbmNlIGJ1aWxkCiAgICAgZW52aXJvbl92YXJfcHJlZml4ZXMgPSBbJ0NQQVRIJywgJ0NfSU5DTFVERV8nLCAnRFlMRF8nLCAnTEFORycsICdMQ18nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMRF8nLCAnTElCUkFSWV8nLCAnUEFUSCcsICdQWVRIT04nXQogICAgIGZvciBldiBpbiBsaXN0KG9zLmVudmlyb24pOgogICAgICAgICBmb3IgcHJlZml4IGluIGVudmlyb25fdmFyX3ByZWZpeGVzOgogICAgICAgICAgICAgaWYgZXYuc3RhcnRzd2l0aChwcmVmaXgpIDoKLSAgICAgICAgICAgICAgICBwcmludCAiSU5GTzogZGVsZXRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgJXM9JXMiICUgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LCBvcy5lbnZpcm9uW2V2XSkKKyAgICAgICAgICAgICAgICBwcmludCgiSU5GTzogZGVsZXRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgJXM9JXMiICUgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LCBvcy5lbnZpcm9uW2V2XSkpCiAgICAgICAgICAgICAgICAgZGVsIG9zLmVudmlyb25bZXZdCiAKLSAgICBvcy5lbnZpcm9uWydQQVRIJ10gPSAnL2Jpbjovc2JpbjovdXNyL2JpbjovdXNyL3NiaW4nCi0gICAgcHJpbnQgIlNldHRpbmcgZGVmYXVsdCBQQVRIOiAlcyIlKG9zLmVudmlyb25bJ1BBVEgnXSkKLQorICAgIGJhc2VfcGF0aCA9ICcvYmluOi9zYmluOi91c3IvYmluOi91c3Ivc2JpbicKKyAgICBpZiAnU0RLX1RPT0xTX0JJTicgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgYmFzZV9wYXRoID0gb3MuZW52aXJvblsnU0RLX1RPT0xTX0JJTiddICsgJzonICsgYmFzZV9wYXRoCisgICAgIyBYY29kZSAyLjUgb24gT1MgWCAxMC40IGRvZXMgbm90IGluY2x1ZGUgU2V0RmlsZSBpbiBpdHMgdXNyL2JpbjsKKyAgICAjIGFkZCBpdHMgZml4ZWQgbG9jYXRpb24gaGVyZSBpZiBpdCBleGlzdHMKKyAgICBPTERfREVWRUxPUEVSX1RPT0xTID0gJy9EZXZlbG9wZXIvVG9vbHMnCisgICAgaWYgb3MucGF0aC5pc2RpcihPTERfREVWRUxPUEVSX1RPT0xTKToKKyAgICAgICAgYmFzZV9wYXRoID0gYmFzZV9wYXRoICsgJzonICsgT0xEX0RFVkVMT1BFUl9UT09MUworICAgIG9zLmVudmlyb25bJ1BBVEgnXSA9IGJhc2VfcGF0aAorICAgIHByaW50KCJTZXR0aW5nIGRlZmF1bHQgUEFUSDogJXMiJShvcy5lbnZpcm9uWydQQVRIJ10pKQorICAgICMgRW5zdXJlIHdzIGhhdmUgYWNjZXNzIHRvIGhnIGFuZCB0byBzcGhpbngtYnVpbGQuCisgICAgIyBZb3UgbWF5IGhhdmUgdG8gY3JlYXRlIGxpbmtzIGluIC91c3IvYmluIGZvciB0aGVtLgorICAgIHJ1bkNvbW1hbmQoJ2hnIC0tdmVyc2lvbicpCisgICAgaWYgZ2V0VmVyc2lvblR1cGxlKCkgPj0gKDMsIDQpOgorICAgICAgICBydW5Db21tYW5kKCdzcGhpbngtYnVpbGQgLS12ZXJzaW9uJykKIAogZGVmIHBhcnNlT3B0aW9ucyhhcmdzPU5vbmUpOgogICAgICIiIgogICAgIFBhcnNlIGFyZ3VtZW50cyBhbmQgdXBkYXRlIGdsb2JhbCBzZXR0aW5ncy4KICAgICAiIiIKICAgICBnbG9iYWwgV09SS0RJUiwgREVQU1JDLCBTREtQQVRILCBTUkNESVIsIERFUFRBUkdFVAotICAgIGdsb2JhbCBVTklWRVJTQUxPUFRTLCBVTklWRVJTQUxBUkNIUywgQVJDSExJU1QsIENDCisgICAgZ2xvYmFsIFVOSVZFUlNBTE9QVFMsIFVOSVZFUlNBTEFSQ0hTLCBBUkNITElTVCwgQ0MsIENYWAogCiAgICAgaWYgYXJncyBpcyBOb25lOgogICAgICAgICBhcmdzID0gc3lzLmFyZ3ZbMTpdCkBAIC00NzIsMTggKzYzMiwxOCBAQAogICAgICAgICBvcHRpb25zLCBhcmdzID0gZ2V0b3B0LmdldG9wdChhcmdzLCAnP2hiJywKICAgICAgICAgICAgICAgICBbICdidWlsZC1kaXI9JywgJ3RoaXJkLXBhcnR5PScsICdzZGstcGF0aD0nICwgJ3NyYy1kaXI9JywKICAgICAgICAgICAgICAgICAgICdkZXAtdGFyZ2V0PScsICd1bml2ZXJzYWwtYXJjaHM9JywgJ2hlbHAnIF0pCi0gICAgZXhjZXB0IGdldG9wdC5lcnJvciwgbXNnOgotICAgICAgICBwcmludCBtc2cKKyAgICBleGNlcHQgZ2V0b3B0LkdldG9wdEVycm9yOgorICAgICAgICBwcmludChzeXMuZXhjX2luZm8oKVsxXSkKICAgICAgICAgc3lzLmV4aXQoMSkKIAogICAgIGlmIGFyZ3M6Ci0gICAgICAgIHByaW50ICJBZGRpdGlvbmFsIGFyZ3VtZW50cyIKKyAgICAgICAgcHJpbnQoIkFkZGl0aW9uYWwgYXJndW1lbnRzIikKICAgICAgICAgc3lzLmV4aXQoMSkKIAogICAgIGRlcHRhcmdldCA9IE5vbmUKICAgICBmb3IgaywgdiBpbiBvcHRpb25zOgogICAgICAgICBpZiBrIGluICgnLWgnLCAnLT8nLCAnLS1oZWxwJyk6Ci0gICAgICAgICAgICBwcmludCBVU0FHRQorICAgICAgICAgICAgcHJpbnQoVVNBR0UpCiAgICAgICAgICAgICBzeXMuZXhpdCgwKQogCiAgICAgICAgIGVsaWYgayBpbiAoJy1kJywgJy0tYnVpbGQtZGlyJyk6CkBAIC01MTEsMjcgKzY3MSwyOCBAQAogICAgICAgICAgICAgICAgICAgICAjIHRhcmdldAogICAgICAgICAgICAgICAgICAgICBERVBUQVJHRVQgPSBkZWZhdWx0X3RhcmdldF9tYXAuZ2V0KHYsICcxMC4zJykKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwgdgorICAgICAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IodikKIAogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwgaworICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihrKQogCiAgICAgU1JDRElSPW9zLnBhdGguYWJzcGF0aChTUkNESVIpCiAgICAgV09SS0RJUj1vcy5wYXRoLmFic3BhdGgoV09SS0RJUikKICAgICBTREtQQVRIPW9zLnBhdGguYWJzcGF0aChTREtQQVRIKQogICAgIERFUFNSQz1vcy5wYXRoLmFic3BhdGgoREVQU1JDKQogCi0gICAgQ0M9dGFyZ2V0X2NjX21hcFtERVBUQVJHRVRdCisgICAgQ0MsIENYWCA9IGdldFRhcmdldENvbXBpbGVycygpCiAKLSAgICBwcmludCAiU2V0dGluZ3M6IgotICAgIHByaW50ICIgKiBTb3VyY2UgZGlyZWN0b3J5OiIsIFNSQ0RJUgotICAgIHByaW50ICIgKiBCdWlsZCBkaXJlY3Rvcnk6ICIsIFdPUktESVIKLSAgICBwcmludCAiICogU0RLIGxvY2F0aW9uOiAgICAiLCBTREtQQVRICi0gICAgcHJpbnQgIiAqIFRoaXJkLXBhcnR5IHNvdXJjZToiLCBERVBTUkMKLSAgICBwcmludCAiICogRGVwbG95bWVudCB0YXJnZXQ6IiwgREVQVEFSR0VUCi0gICAgcHJpbnQgIiAqIFVuaXZlcnNhbCBhcmNoaXRlY3R1cmVzOiIsIEFSQ0hMSVNUCi0gICAgcHJpbnQgIiAqIEMgY29tcGlsZXI6IiwgQ0MKLSAgICBwcmludCAiIgorICAgIHByaW50KCJTZXR0aW5nczoiKQorICAgIHByaW50KCIgKiBTb3VyY2UgZGlyZWN0b3J5OiIsIFNSQ0RJUikKKyAgICBwcmludCgiICogQnVpbGQgZGlyZWN0b3J5OiAiLCBXT1JLRElSKQorICAgIHByaW50KCIgKiBTREsgbG9jYXRpb246ICAgICIsIFNES1BBVEgpCisgICAgcHJpbnQoIiAqIFRoaXJkLXBhcnR5IHNvdXJjZToiLCBERVBTUkMpCisgICAgcHJpbnQoIiAqIERlcGxveW1lbnQgdGFyZ2V0OiIsIERFUFRBUkdFVCkKKyAgICBwcmludCgiICogVW5pdmVyc2FsIGFyY2hpdGVjdHVyZXM6IiwgQVJDSExJU1QpCisgICAgcHJpbnQoIiAqIEMgY29tcGlsZXI6IiwgQ0MpCisgICAgcHJpbnQoIiAqIEMrKyBjb21waWxlcjoiLCBDWFgpCisgICAgcHJpbnQoIiIpCiAKIAogCkBAIC01NDMsMTMgKzcwNCwxOSBAQAogCiAgICAgWFhYOiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBhcmNoaXZlcyBjb250YWluIGEgdG9wbGV2ZWwgZGlyZWN0b3J5CiAgICAgdGhhdCBpcyBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgYmFzZW5hbWUgb2YgdGhlIGFyY2hpdmUuIFRoaXMgaXMKLSAgICBzYXZlIGVub3VnaCBmb3IgYW55dGhpbmcgd2UgdXNlLgorICAgIHNhZmUgZW5vdWdoIGZvciBhbG1vc3QgYW55dGhpbmcgd2UgdXNlLiAgVW5mb3J0dW5hdGVseSwgaXQgZG9lcyBub3QKKyAgICB3b3JrIGZvciBjdXJyZW50IFRjbCBhbmQgVGsgc291cmNlIHJlbGVhc2VzIHdoZXJlIHRoZSBiYXNlbmFtZSBvZgorICAgIHRoZSBhcmNoaXZlIGVuZHMgd2l0aCAiLXNyYyIgYnV0IHRoZSB1bmNvbXByZXNzZWQgZGlyZWN0b3J5IGRvZXMgbm90LgorICAgIEZvciBub3csIGp1c3Qgc3BlY2lhbCBjYXNlIFRjbCBhbmQgVGsgdGFyLmd6IGRvd25sb2Fkcy4KICAgICAiIiIKICAgICBjdXJkaXIgPSBvcy5nZXRjd2QoKQogICAgIHRyeToKICAgICAgICAgb3MuY2hkaXIoYnVpbGRkaXIpCiAgICAgICAgIGlmIGFyY2hpdmVOYW1lLmVuZHN3aXRoKCcudGFyLmd6Jyk6CiAgICAgICAgICAgICByZXR2YWwgPSBvcy5wYXRoLmJhc2VuYW1lKGFyY2hpdmVOYW1lWzotN10pCisgICAgICAgICAgICBpZiAoKHJldHZhbC5zdGFydHN3aXRoKCd0Y2wnKSBvciByZXR2YWwuc3RhcnRzd2l0aCgndGsnKSkKKyAgICAgICAgICAgICAgICAgICAgYW5kIHJldHZhbC5lbmRzd2l0aCgnLXNyYycpKToKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByZXR2YWxbOi00XQogICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocmV0dmFsKToKICAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKHJldHZhbCkKICAgICAgICAgICAgIGZwID0gb3MucG9wZW4oInRhciB6eGYgJXMgMj4mMSIlKHNoZWxsUXVvdGUoYXJjaGl2ZU5hbWUpLCksICdyJykKQEAgLTU3NiwzMSArNzQzLDE4IEBACiAgICAgICAgIHhpdCA9IGZwLmNsb3NlKCkKICAgICAgICAgaWYgeGl0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZShkYXRhKQotICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiQ2Fubm90IGV4dHJhY3QgJXMiJShhcmNoaXZlTmFtZSwpCisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkNhbm5vdCBleHRyYWN0ICVzIiUoYXJjaGl2ZU5hbWUsKSkKIAogICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKGJ1aWxkZGlyLCByZXR2YWwpCiAKICAgICBmaW5hbGx5OgogICAgICAgICBvcy5jaGRpcihjdXJkaXIpCiAKLUtOT1dOU0laRVMgPSB7Ci0gICAgImh0dHA6Ly9mdHAuZ251Lm9yZy9wdWIvZ251L3JlYWRsaW5lL3JlYWRsaW5lLTUuMS50YXIuZ3oiOiA3OTUyNzQyLAotICAgICJodHRwOi8vZG93bmxvYWRzLnNsZWVweWNhdC5jb20vZGItNC40LjIwLnRhci5neiI6IDIwMzAyNzYsCi19Ci0KIGRlZiBkb3dubG9hZFVSTCh1cmwsIGZuYW1lKToKICAgICAiIiIKICAgICBEb3dubG9hZCB0aGUgY29udGVudHMgb2YgdGhlIHVybCBpbnRvIHRoZSBmaWxlLgogICAgICIiIgotICAgIHRyeToKLSAgICAgICAgc2l6ZSA9IG9zLnBhdGguZ2V0c2l6ZShmbmFtZSkKLSAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgcGFzcwotICAgIGVsc2U6Ci0gICAgICAgIGlmIEtOT1dOU0laRVMuZ2V0KHVybCkgPT0gc2l6ZToKLSAgICAgICAgICAgIHByaW50ICJVc2luZyBleGlzdGluZyBmaWxlIGZvciIsIHVybAotICAgICAgICAgICAgcmV0dXJuCi0gICAgZnBJbiA9IHVybGxpYjIudXJsb3Blbih1cmwpCisgICAgZnBJbiA9IHVybGxpYl9yZXF1ZXN0LnVybG9wZW4odXJsKQogICAgIGZwT3V0ID0gb3BlbihmbmFtZSwgJ3diJykKICAgICBibG9jayA9IGZwSW4ucmVhZCgxMDI0MCkKICAgICB0cnk6CkBAIC02MTUsNiArNzY5LDI0IEBACiAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgIHBhc3MKIAorZGVmIHZlcmlmeVRoaXJkUGFydHlGaWxlKHVybCwgY2hlY2tzdW0sIGZuYW1lKToKKyAgICAiIiIKKyAgICBEb3dubG9hZCBmaWxlIGZyb20gdXJsIHRvIGZpbGVuYW1lIGZuYW1lIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCisgICAgQWJvcnQgaWYgZmlsZSBjb250ZW50cyBkb2VzIG5vdCBtYXRjaCBzdXBwbGllZCBtZDUgY2hlY2tzdW0uCisgICAgIiIiCisgICAgbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoZm5hbWUpCisgICAgaWYgb3MucGF0aC5leGlzdHMoZm5hbWUpOgorICAgICAgICBwcmludCgiVXNpbmcgbG9jYWwgY29weSBvZiAlcyIlKG5hbWUsKSkKKyAgICBlbHNlOgorICAgICAgICBwcmludCgiRGlkIG5vdCBmaW5kIGxvY2FsIGNvcHkgb2YgJXMiJShuYW1lLCkpCisgICAgICAgIHByaW50KCJEb3dubG9hZGluZyAlcyIlKG5hbWUsKSkKKyAgICAgICAgZG93bmxvYWRVUkwodXJsLCBmbmFtZSkKKyAgICAgICAgcHJpbnQoIkFyY2hpdmUgZm9yICVzIHN0b3JlZCBhcyAlcyIlKG5hbWUsIGZuYW1lKSkKKyAgICBpZiBvcy5zeXN0ZW0oCisgICAgICAgICAgICAnTUQ1PSQob3BlbnNzbCBtZDUgJXMpIDsgdGVzdCAiJHtNRDUjIyo9IH0iID0gIiVzIicKKyAgICAgICAgICAgICAgICAlIChzaGVsbFF1b3RlKGZuYW1lKSwgY2hlY2tzdW0pICk6CisgICAgICAgIGZhdGFsKCdNRDUgY2hlY2tzdW0gbWlzbWF0Y2ggZm9yIGZpbGUgJXMnICUgZm5hbWUpCisKIGRlZiBidWlsZFJlY2lwZShyZWNpcGUsIGJhc2VkaXIsIGFyY2hMaXN0KToKICAgICAiIiIKICAgICBCdWlsZCBzb2Z0d2FyZSB1c2luZyBhIHJlY2lwZS4gVGhpcyBmdW5jdGlvbiBkb2VzIHRoZQpAQCAtNjM1LDM4ICs4MDcsNDMgQEAKICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoREVQU1JDKToKICAgICAgICAgb3MubWtkaXIoREVQU1JDKQogCi0KLSAgICBpZiBvcy5wYXRoLmV4aXN0cyhzb3VyY2VBcmNoaXZlKToKLSAgICAgICAgcHJpbnQgIlVzaW5nIGxvY2FsIGNvcHkgb2YgJXMiJShuYW1lLCkKLQotICAgIGVsc2U6Ci0gICAgICAgIHByaW50ICJEaWQgbm90IGZpbmQgbG9jYWwgY29weSBvZiAlcyIlKG5hbWUsKQotICAgICAgICBwcmludCAiRG93bmxvYWRpbmcgJXMiJShuYW1lLCkKLSAgICAgICAgZG93bmxvYWRVUkwodXJsLCBzb3VyY2VBcmNoaXZlKQotICAgICAgICBwcmludCAiQXJjaGl2ZSBmb3IgJXMgc3RvcmVkIGFzICVzIiUobmFtZSwgc291cmNlQXJjaGl2ZSkKLQotICAgIHByaW50ICJFeHRyYWN0aW5nIGFyY2hpdmUgZm9yICVzIiUobmFtZSwpCisgICAgdmVyaWZ5VGhpcmRQYXJ0eUZpbGUodXJsLCByZWNpcGVbJ2NoZWNrc3VtJ10sIHNvdXJjZUFyY2hpdmUpCisgICAgcHJpbnQoIkV4dHJhY3RpbmcgYXJjaGl2ZSBmb3IgJXMiJShuYW1lLCkpCiAgICAgYnVpbGREaXI9b3MucGF0aC5qb2luKFdPUktESVIsICdfYmxkJykKICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoYnVpbGREaXIpOgogICAgICAgICBvcy5ta2RpcihidWlsZERpcikKIAogICAgIHdvcmtEaXIgPSBleHRyYWN0QXJjaGl2ZShidWlsZERpciwgc291cmNlQXJjaGl2ZSkKICAgICBvcy5jaGRpcih3b3JrRGlyKQotICAgIGlmICdidWlsZERpcicgaW4gcmVjaXBlOgotICAgICAgICBvcy5jaGRpcihyZWNpcGVbJ2J1aWxkRGlyJ10pCiAKLQotICAgIGZvciBmbiBpbiByZWNpcGUuZ2V0KCdwYXRjaGVzJywgKCkpOgotICAgICAgICBpZiBmbi5zdGFydHN3aXRoKCdodHRwOi8vJyk6Ci0gICAgICAgICAgICAjIERvd25sb2FkIHRoZSBwYXRjaCBiZWZvcmUgYXBwbHlpbmcgaXQuCi0gICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKERFUFNSQywgb3MucGF0aC5iYXNlbmFtZShmbikpCi0gICAgICAgICAgICBkb3dubG9hZFVSTChmbiwgcGF0aCkKLSAgICAgICAgICAgIGZuID0gcGF0aAotCi0gICAgICAgIGZuID0gb3MucGF0aC5qb2luKGN1cmRpciwgZm4pCisgICAgZm9yIHBhdGNoIGluIHJlY2lwZS5nZXQoJ3BhdGNoZXMnLCAoKSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UocGF0Y2gsIHR1cGxlKToKKyAgICAgICAgICAgIHVybCwgY2hlY2tzdW0gPSBwYXRjaAorICAgICAgICAgICAgZm4gPSBvcy5wYXRoLmpvaW4oREVQU1JDLCBvcy5wYXRoLmJhc2VuYW1lKHVybCkpCisgICAgICAgICAgICB2ZXJpZnlUaGlyZFBhcnR5RmlsZSh1cmwsIGNoZWNrc3VtLCBmbikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgcGF0Y2ggaXMgYSBmaWxlIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5CisgICAgICAgICAgICBmbiA9IG9zLnBhdGguam9pbihjdXJkaXIsIHBhdGNoKQogICAgICAgICBydW5Db21tYW5kKCdwYXRjaCAtcCVzIDwgJXMnJShyZWNpcGUuZ2V0KCdwYXRjaGxldmVsJywgMSksCiAgICAgICAgICAgICBzaGVsbFF1b3RlKGZuKSwpKQogCisgICAgZm9yIHBhdGNoc2NyaXB0IGluIHJlY2lwZS5nZXQoJ3BhdGNoc2NyaXB0cycsICgpKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShwYXRjaHNjcmlwdCwgdHVwbGUpOgorICAgICAgICAgICAgdXJsLCBjaGVja3N1bSA9IHBhdGNoc2NyaXB0CisgICAgICAgICAgICBmbiA9IG9zLnBhdGguam9pbihERVBTUkMsIG9zLnBhdGguYmFzZW5hbWUodXJsKSkKKyAgICAgICAgICAgIHZlcmlmeVRoaXJkUGFydHlGaWxlKHVybCwgY2hlY2tzdW0sIGZuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBwYXRjaCBpcyBhIGZpbGUgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkKKyAgICAgICAgICAgIGZuID0gb3MucGF0aC5qb2luKGN1cmRpciwgcGF0Y2hzY3JpcHQpCisgICAgICAgIGlmIGZuLmVuZHN3aXRoKCcuYnoyJyk6CisgICAgICAgICAgICBydW5Db21tYW5kKCdidW56aXAyIC1mayAlcycgJSBzaGVsbFF1b3RlKGZuKSkKKyAgICAgICAgICAgIGZuID0gZm5bOi00XQorICAgICAgICBydW5Db21tYW5kKCdzaCAlcycgJSBzaGVsbFF1b3RlKGZuKSkKKyAgICAgICAgb3MudW5saW5rKGZuKQorCisgICAgaWYgJ2J1aWxkRGlyJyBpbiByZWNpcGU6CisgICAgICAgIG9zLmNoZGlyKHJlY2lwZVsnYnVpbGREaXInXSkKKwogICAgIGlmIGNvbmZpZ3VyZSBpcyBub3QgTm9uZToKICAgICAgICAgY29uZmlndXJlX2FyZ3MgPSBbCiAgICAgICAgICAgICAiLS1wcmVmaXg9L3Vzci9sb2NhbCIsCkBAIC02ODUsNDAgKzg2Miw0NCBAQAogCiAgICAgICAgIGlmIHJlY2lwZS5nZXQoJ3VzZUxERmxhZ3MnLCAxKToKICAgICAgICAgICAgIGNvbmZpZ3VyZV9hcmdzLmV4dGVuZChbCi0gICAgICAgICAgICAgICAgIkNGTEFHUz0tYXJjaCAlcyAtaXN5c3Jvb3QgJXMgLUklcy91c3IvbG9jYWwvaW5jbHVkZSIlKAorICAgICAgICAgICAgICAgICJDRkxBR1M9JXMtbW1hY29zeC12ZXJzaW9uLW1pbj0lcyAtYXJjaCAlcyAtaXN5c3Jvb3QgJXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICItSSVzL3Vzci9sb2NhbC9pbmNsdWRlIiUoCisgICAgICAgICAgICAgICAgICAgICAgICByZWNpcGUuZ2V0KCdleHRyYV9jZmxhZ3MnLCAnJyksCisgICAgICAgICAgICAgICAgICAgICAgICBERVBUQVJHRVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAnIC1hcmNoICcuam9pbihhcmNoTGlzdCksCiAgICAgICAgICAgICAgICAgICAgICAgICBzaGVsbFF1b3RlKFNES1BBVEgpWzE6LTFdLAogICAgICAgICAgICAgICAgICAgICAgICAgc2hlbGxRdW90ZShiYXNlZGlyKVsxOi0xXSwpLAotICAgICAgICAgICAgICAgICJMREZMQUdTPS1zeXNsaWJyb290LCVzIC1MJXMvdXNyL2xvY2FsL2xpYiAtYXJjaCAlcyIlKAorICAgICAgICAgICAgICAgICJMREZMQUdTPS1tbWFjb3N4LXZlcnNpb24tbWluPSVzIC1pc3lzcm9vdCAlcyAtTCVzL3Vzci9sb2NhbC9saWIgLWFyY2ggJXMiJSgKKyAgICAgICAgICAgICAgICAgICAgREVQVEFSR0VULAogICAgICAgICAgICAgICAgICAgICBzaGVsbFF1b3RlKFNES1BBVEgpWzE6LTFdLAogICAgICAgICAgICAgICAgICAgICBzaGVsbFF1b3RlKGJhc2VkaXIpWzE6LTFdLAogICAgICAgICAgICAgICAgICAgICAnIC1hcmNoICcuam9pbihhcmNoTGlzdCkpLAogICAgICAgICAgICAgXSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGNvbmZpZ3VyZV9hcmdzLmV4dGVuZChbCi0gICAgICAgICAgICAgICAgIkNGTEFHUz0tYXJjaCAlcyAtaXN5c3Jvb3QgJXMgLUklcy91c3IvbG9jYWwvaW5jbHVkZSIlKAorICAgICAgICAgICAgICAgICJDRkxBR1M9JXMtbW1hY29zeC12ZXJzaW9uLW1pbj0lcyAtYXJjaCAlcyAtaXN5c3Jvb3QgJXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICItSSVzL3Vzci9sb2NhbC9pbmNsdWRlIiUoCisgICAgICAgICAgICAgICAgICAgICAgICByZWNpcGUuZ2V0KCdleHRyYV9jZmxhZ3MnLCAnJyksCisgICAgICAgICAgICAgICAgICAgICAgICBERVBUQVJHRVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAnIC1hcmNoICcuam9pbihhcmNoTGlzdCksCiAgICAgICAgICAgICAgICAgICAgICAgICBzaGVsbFF1b3RlKFNES1BBVEgpWzE6LTFdLAogICAgICAgICAgICAgICAgICAgICAgICAgc2hlbGxRdW90ZShiYXNlZGlyKVsxOi0xXSwpLAogICAgICAgICAgICAgXSkKIAogICAgICAgICBpZiAnY29uZmlndXJlX3Bvc3QnIGluIHJlY2lwZToKLSAgICAgICAgICAgIGNvbmZpZ3VyZV9hcmdzID0gY29uZmlndXJlX2FyZ3MgPSBsaXN0KHJlY2lwZVsnY29uZmlndXJlX3Bvc3QnXSkKKyAgICAgICAgICAgIGNvbmZpZ3VyZV9hcmdzID0gY29uZmlndXJlX2FyZ3MgKyBsaXN0KHJlY2lwZVsnY29uZmlndXJlX3Bvc3QnXSkKIAogICAgICAgICBjb25maWd1cmVfYXJncy5pbnNlcnQoMCwgY29uZmlndXJlKQogICAgICAgICBjb25maWd1cmVfYXJncyA9IFsgc2hlbGxRdW90ZShhKSBmb3IgYSBpbiBjb25maWd1cmVfYXJncyBdCiAKLSAgICAgICAgaWYgJ2NvbmZpZ3VyZV9lbnYnIGluIHJlY2lwZToKLSAgICAgICAgICAgIGNvbmZpZ3VyZV9hcmdzLmluc2VydCgwLCByZWNpcGVbJ2NvbmZpZ3VyZV9lbnYnXSkKLQotICAgICAgICBwcmludCAiUnVubmluZyBjb25maWd1cmUgZm9yICVzIiUobmFtZSwpCisgICAgICAgIHByaW50KCJSdW5uaW5nIGNvbmZpZ3VyZSBmb3IgJXMiJShuYW1lLCkpCiAgICAgICAgIHJ1bkNvbW1hbmQoJyAnLmpvaW4oY29uZmlndXJlX2FyZ3MpICsgJyAyPiYxJykKIAotICAgIHByaW50ICJSdW5uaW5nIGluc3RhbGwgZm9yICVzIiUobmFtZSwpCisgICAgcHJpbnQoIlJ1bm5pbmcgaW5zdGFsbCBmb3IgJXMiJShuYW1lLCkpCiAgICAgcnVuQ29tbWFuZCgneyAnICsgaW5zdGFsbCArICcgO30gMj4mMScpCiAKLSAgICBwcmludCAiRG9uZSAlcyIlKG5hbWUsKQotICAgIHByaW50ICIiCisgICAgcHJpbnQoIkRvbmUgJXMiJShuYW1lLCkpCisgICAgcHJpbnQoIiIpCiAKICAgICBvcy5jaGRpcihjdXJkaXIpCiAKQEAgLTcyNiw5ICs5MDcsOSBAQAogICAgICIiIgogICAgIEJ1aWxkIG91ciBkZXBlbmRlbmNpZXMgaW50byAkV09SS0RJUi9saWJyYXJpZXMvdXNyL2xvY2FsCiAgICAgIiIiCi0gICAgcHJpbnQgIiIKLSAgICBwcmludCAiQnVpbGRpbmcgcmVxdWlyZWQgbGlicmFyaWVzIgotICAgIHByaW50ICIiCisgICAgcHJpbnQoIiIpCisgICAgcHJpbnQoIkJ1aWxkaW5nIHJlcXVpcmVkIGxpYnJhcmllcyIpCisgICAgcHJpbnQoIiIpCiAgICAgdW5pdmVyc2FsID0gb3MucGF0aC5qb2luKFdPUktESVIsICdsaWJyYXJpZXMnKQogICAgIG9zLm1rZGlyKHVuaXZlcnNhbCkKICAgICBvcy5tYWtlZGlycyhvcy5wYXRoLmpvaW4odW5pdmVyc2FsLCAndXNyJywgJ2xvY2FsJywgJ2xpYicpKQpAQCAtNzQyLDE0ICs5MjMsMjEgQEAKIGRlZiBidWlsZFB5dGhvbkRvY3MoKToKICAgICAjIFRoaXMgc3RvcmVzIHRoZSBkb2N1bWVudGF0aW9uIGFzIFJlc291cmNlcy9FbmdsaXNoLmxwcm9qL0RvY3VtZW50YXRpb24KICAgICAjIGluc2lkZSB0aGUgZnJhbXdvcmsuIHB5ZG9jIGFuZCBJRExFIHdpbGwgcGljayBpdCB1cCB0aGVyZS4KLSAgICBwcmludCAiSW5zdGFsbCBweXRob24gZG9jdW1lbnRhdGlvbiIKKyAgICBwcmludCgiSW5zdGFsbCBweXRob24gZG9jdW1lbnRhdGlvbiIpCiAgICAgcm9vdERpciA9IG9zLnBhdGguam9pbihXT1JLRElSLCAnX3Jvb3QnKQogICAgIGJ1aWxkRGlyID0gb3MucGF0aC5qb2luKCcuLi8uLi9Eb2MnKQogICAgIGRvY2RpciA9IG9zLnBhdGguam9pbihyb290RGlyLCAncHlkb2NzJykKICAgICBjdXJEaXIgPSBvcy5nZXRjd2QoKQogICAgIG9zLmNoZGlyKGJ1aWxkRGlyKQotICAgIHJ1bkNvbW1hbmQoJ21ha2UgdXBkYXRlJykKLSAgICBydW5Db21tYW5kKCJtYWtlIGh0bWwgUFlUSE9OPSclcyciICUgb3MucGF0aC5hYnNwYXRoKHN5cy5leGVjdXRhYmxlKSkKKyAgICAjIFRoZSBEb2MgYnVpbGQgY2hhbmdlZCBmb3IgMy40ICh0ZWNobmljYWxseSwgZm9yIDMuNC4xKQorICAgIGlmIGdldFZlcnNpb25UdXBsZSgpIDwgKDMsIDQpOgorICAgICAgICAjIFRoaXMgc3RlcCBkb2VzIGFuIHN2biBjaGVja291dCBvZiBzcGhpbnggYW5kIGl0cyBkZXBlbmRlbmNpZXMKKyAgICAgICAgcnVuQ29tbWFuZCgnbWFrZSB1cGRhdGUnKQorICAgICAgICBydW5Db21tYW5kKCJtYWtlIGh0bWwgUFlUSE9OPSclcyciICUgb3MucGF0aC5hYnNwYXRoKHN5cy5leGVjdXRhYmxlKSkKKyAgICBlbHNlOgorICAgICAgICBydW5Db21tYW5kKCdtYWtlIGNsZWFuJykKKyAgICAgICAgIyBBc3N1bWUgc3BoaW54LWJ1aWxkIGlzIG9uIG91ciBQQVRILCBjaGVja2VkIGluIGNoZWNrRW52aXJvbm1lbnQKKyAgICAgICAgcnVuQ29tbWFuZCgnbWFrZSBodG1sJykKICAgICBvcy5jaGRpcihjdXJEaXIpCiAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGRvY2Rpcik6CiAgICAgICAgIG9zLm1rZGlyKGRvY2RpcikKQEAgLTc1Nyw3ICs5NDUsNyBAQAogCiAKIGRlZiBidWlsZFB5dGhvbigpOgotICAgIHByaW50ICJCdWlsZGluZyBhIHVuaXZlcnNhbCBweXRob24gZm9yICVzIGFyY2hpdGVjdHVyZXMiICUgVU5JVkVSU0FMQVJDSFMKKyAgICBwcmludCgiQnVpbGRpbmcgYSB1bml2ZXJzYWwgcHl0aG9uIGZvciAlcyBhcmNoaXRlY3R1cmVzIiAlIFVOSVZFUlNBTEFSQ0hTKQogCiAgICAgYnVpbGREaXIgPSBvcy5wYXRoLmpvaW4oV09SS0RJUiwgJ19ibGQnLCAncHl0aG9uJykKICAgICByb290RGlyID0gb3MucGF0aC5qb2luKFdPUktESVIsICdfcm9vdCcpCkBAIC03ODUsMzEgKzk3MywzNiBAQAogICAgICMgd2lsbCBmaW5kIHRoZW0gZHVyaW5nIGl0cyBleHRlbnNpb24gaW1wb3J0IHNhbml0eSBjaGVja3MuCiAgICAgb3MuZW52aXJvblsnRFlMRF9MSUJSQVJZX1BBVEgnXSA9IG9zLnBhdGguam9pbihXT1JLRElSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaWJyYXJpZXMnLCAndXNyJywgJ2xvY2FsJywgJ2xpYicpCi0gICAgcHJpbnQgIlJ1bm5pbmcgY29uZmlndXJlLi4uIgorICAgIHByaW50KCJSdW5uaW5nIGNvbmZpZ3VyZS4uLiIpCiAgICAgcnVuQ29tbWFuZCgiJXMgLUMgLS1lbmFibGUtZnJhbWV3b3JrIC0tZW5hYmxlLXVuaXZlcnNhbHNkaz0lcyAiCiAgICAgICAgICAgICAgICAiLS13aXRoLXVuaXZlcnNhbC1hcmNocz0lcyAiCiAgICAgICAgICAgICAgICAiJXMgIgorICAgICAgICAgICAgICAgIiVzICIKICAgICAgICAgICAgICAgICJMREZMQUdTPSctZyAtTCVzL2xpYnJhcmllcy91c3IvbG9jYWwvbGliJyAiCi0gICAgICAgICAgICAgICAiT1BUPSctZyAtTzMgLUklcy9saWJyYXJpZXMvdXNyL2xvY2FsL2luY2x1ZGUnIDI+JjEiJSgKKyAgICAgICAgICAgICAgICJDRkxBR1M9Jy1nIC1JJXMvbGlicmFyaWVzL3Vzci9sb2NhbC9pbmNsdWRlJyAyPiYxIiUoCiAgICAgICAgIHNoZWxsUXVvdGUob3MucGF0aC5qb2luKFNSQ0RJUiwgJ2NvbmZpZ3VyZScpKSwgc2hlbGxRdW90ZShTREtQQVRIKSwKICAgICAgICAgVU5JVkVSU0FMQVJDSFMsCiAgICAgICAgICgnICcsICctLXdpdGgtY29tcHV0ZWQtZ290b3MgJylbUFlUSE9OXzNdLAorICAgICAgICAoJyAnLCAnLS13aXRob3V0LWVuc3VyZXBpcCAnKVtnZXRWZXJzaW9uVHVwbGUoKSA+PSAoMywgNCldLAogICAgICAgICBzaGVsbFF1b3RlKFdPUktESVIpWzE6LTFdLAogICAgICAgICBzaGVsbFF1b3RlKFdPUktESVIpWzE6LTFdKSkKIAotICAgIHByaW50ICJSdW5uaW5nIG1ha2UiCisgICAgcHJpbnQoIlJ1bm5pbmcgbWFrZSB0b3VjaCIpCisgICAgcnVuQ29tbWFuZCgibWFrZSB0b3VjaCIpCisKKyAgICBwcmludCgiUnVubmluZyBtYWtlIikKICAgICBydW5Db21tYW5kKCJtYWtlIikKIAotICAgIHByaW50ICJSdW5uaW5nIG1ha2UgaW5zdGFsbCIKKyAgICBwcmludCgiUnVubmluZyBtYWtlIGluc3RhbGwiKQogICAgIHJ1bkNvbW1hbmQoIm1ha2UgaW5zdGFsbCBERVNURElSPSVzIiUoCiAgICAgICAgIHNoZWxsUXVvdGUocm9vdERpcikpKQogCi0gICAgcHJpbnQgIlJ1bm5pbmcgbWFrZSBmcmFtZXdvcmtpbnN0YWxsZXh0cmFzIgorICAgIHByaW50KCJSdW5uaW5nIG1ha2UgZnJhbWV3b3JraW5zdGFsbGV4dHJhcyIpCiAgICAgcnVuQ29tbWFuZCgibWFrZSBmcmFtZXdvcmtpbnN0YWxsZXh0cmFzIERFU1RESVI9JXMiJSgKICAgICAgICAgc2hlbGxRdW90ZShyb290RGlyKSkpCiAKICAgICBkZWwgb3MuZW52aXJvblsnRFlMRF9MSUJSQVJZX1BBVEgnXQotICAgIHByaW50ICJDb3B5aW5nIHJlcXVpcmVkIHNoYXJlZCBsaWJyYXJpZXMiCisgICAgcHJpbnQoIkNvcHlpbmcgcmVxdWlyZWQgc2hhcmVkIGxpYnJhcmllcyIpCiAgICAgaWYgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKFdPUktESVIsICdsaWJyYXJpZXMnLCAnTGlicmFyeScpKToKICAgICAgICAgcnVuQ29tbWFuZCgibXYgJXMvKiAlcyIlKAogICAgICAgICAgICAgc2hlbGxRdW90ZShvcy5wYXRoLmpvaW4oCkBAIC04MjAsMTYgKzEwMTMsMjAgQEAKICAgICAgICAgICAgICAgICAnUHl0aG9uLmZyYW1ld29yaycsICdWZXJzaW9ucycsIGdldFZlcnNpb24oKSwKICAgICAgICAgICAgICAgICAnbGliJykpKSkKIAotICAgIHByaW50ICJGaXggZmlsZSBtb2RlcyIKKyAgICBwYXRoX3RvX2xpYiA9IG9zLnBhdGguam9pbihyb290RGlyLCAnTGlicmFyeScsICdGcmFtZXdvcmtzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1B5dGhvbi5mcmFtZXdvcmsnLCAnVmVyc2lvbnMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLCAnbGliJywgJ3B5dGhvbiVzJyUodmVyc2lvbiwpKQorCisgICAgcHJpbnQoIkZpeCBmaWxlIG1vZGVzIikKICAgICBmcm1EaXIgPSBvcy5wYXRoLmpvaW4ocm9vdERpciwgJ0xpYnJhcnknLCAnRnJhbWV3b3JrcycsICdQeXRob24uZnJhbWV3b3JrJykKICAgICBnaWQgPSBncnAuZ2V0Z3JuYW0oJ2FkbWluJykuZ3JfZ2lkCiAKKyAgICBzaGFyZWRfbGliX2Vycm9yID0gRmFsc2UKICAgICBmb3IgZGlycGF0aCwgZGlybmFtZXMsIGZpbGVuYW1lcyBpbiBvcy53YWxrKGZybURpcik6CiAgICAgICAgIGZvciBkbiBpbiBkaXJuYW1lczoKLSAgICAgICAgICAgIG9zLmNobW9kKG9zLnBhdGguam9pbihkaXJwYXRoLCBkbiksIDA3NzUpCisgICAgICAgICAgICBvcy5jaG1vZChvcy5wYXRoLmpvaW4oZGlycGF0aCwgZG4pLCBTVEFUXzBvNzc1KQogICAgICAgICAgICAgb3MuY2hvd24ob3MucGF0aC5qb2luKGRpcnBhdGgsIGRuKSwgLTEsIGdpZCkKIAotCiAgICAgICAgIGZvciBmbiBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzbGluayhmbik6CiAgICAgICAgICAgICAgICAgY29udGludWUKQEAgLTg0MCw2ICsxMDM3LDE5IEBACiAgICAgICAgICAgICBvcy5jaG1vZChwLCBzdGF0LlNfSU1PREUoc3Quc3RfbW9kZSkgfCBzdGF0LlNfSVdHUlApCiAgICAgICAgICAgICBvcy5jaG93bihwLCAtMSwgZ2lkKQogCisgICAgICAgICAgICBpZiBmbiBpbiBFWFBFQ1RFRF9TSEFSRURfTElCUzoKKyAgICAgICAgICAgICAgICAjIGNoZWNrIHRvIHNlZSB0aGF0IHRoaXMgZmlsZSB3YXMgbGlua2VkIHdpdGggdGhlCisgICAgICAgICAgICAgICAgIyBleHBlY3RlZCBsaWJyYXJ5IHBhdGggYW5kIHZlcnNpb24KKyAgICAgICAgICAgICAgICBkYXRhID0gY2FwdHVyZUNvbW1hbmQoIm90b29sIC1MICVzIiAlIHNoZWxsUXVvdGUocCkpCisgICAgICAgICAgICAgICAgZm9yIHNsIGluIEVYUEVDVEVEX1NIQVJFRF9MSUJTW2ZuXToKKyAgICAgICAgICAgICAgICAgICAgaWYgKCJcdCVzICIgJSBzbCkgbm90IGluIGRhdGE6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCgiRXhwZWN0ZWQgc2hhcmVkIGxpYiAlcyB3YXMgbm90IGxpbmtlZCB3aXRoICVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChzbCwgcCkpCisgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfbGliX2Vycm9yID0gVHJ1ZQorCisgICAgaWYgc2hhcmVkX2xpYl9lcnJvcjoKKyAgICAgICAgZmF0YWwoIlVuZXhwZWN0ZWQgc2hhcmVkIGxpYnJhcnkgZXJyb3JzLiIpCisKICAgICBpZiBQWVRIT05fMzoKICAgICAgICAgTERWRVJTSU9OPU5vbmUKICAgICAgICAgVkVSU0lPTj1Ob25lCkBAIC04NjMsMjAgKzEwNzMsNjMgQEAKIAogICAgICMgV2UgYWRkZWQgc29tZSBkaXJlY3RvcmllcyB0byB0aGUgc2VhcmNoIHBhdGggZHVyaW5nIHRoZSBjb25maWd1cmUKICAgICAjIHBoYXNlLiBSZW1vdmUgdGhvc2UgYmVjYXVzZSB0aG9zZSBkaXJlY3RvcmllcyB3b24ndCBiZSB0aGVyZSBvbgotICAgICMgdGhlIGVuZC11c2VycyBzeXN0ZW0uCi0gICAgcGF0aCA9b3MucGF0aC5qb2luKHJvb3REaXIsICdMaWJyYXJ5JywgJ0ZyYW1ld29ya3MnLCAnUHl0aG9uLmZyYW1ld29yaycsCi0gICAgICAgICAgICAgICAgJ1ZlcnNpb25zJywgdmVyc2lvbiwgJ2xpYicsICdweXRob24lcyclKHZlcnNpb24sKSwKLSAgICAgICAgICAgICAgICAnY29uZmlnJyArIGNvbmZpZ19zdWZmaXgsICdNYWtlZmlsZScpCisgICAgIyB0aGUgZW5kLXVzZXJzIHN5c3RlbS4gQWxzbyByZW1vdmUgdGhlIGRpcmVjdG9yaWVzIGZyb20gX3N5c2NvbmZpZ2RhdGEucHkKKyAgICAjIChhZGRlZCBpbiAzLjMpIGlmIGl0IGV4aXN0cy4KKworICAgIGluY2x1ZGVfcGF0aCA9ICctSSVzL2xpYnJhcmllcy91c3IvbG9jYWwvaW5jbHVkZScgJSAoV09SS0RJUiwpCisgICAgbGliX3BhdGggPSAnLUwlcy9saWJyYXJpZXMvdXNyL2xvY2FsL2xpYicgJSAoV09SS0RJUiwpCisKKyAgICAjIGZpeCBNYWtlZmlsZQorICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aF90b19saWIsICdjb25maWcnICsgY29uZmlnX3N1ZmZpeCwgJ01ha2VmaWxlJykKICAgICBmcCA9IG9wZW4ocGF0aCwgJ3InKQogICAgIGRhdGEgPSBmcC5yZWFkKCkKICAgICBmcC5jbG9zZSgpCiAKLSAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCctTCVzL2xpYnJhcmllcy91c3IvbG9jYWwvbGliJyUoV09SS0RJUiwpLCAnJykKLSAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCctSSVzL2xpYnJhcmllcy91c3IvbG9jYWwvaW5jbHVkZSclKFdPUktESVIsKSwgJycpCisgICAgZm9yIHAgaW4gKGluY2x1ZGVfcGF0aCwgbGliX3BhdGgpOgorICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCIgIiArIHAsICcnKQorICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKHAgKyAiICIsICcnKQorCiAgICAgZnAgPSBvcGVuKHBhdGgsICd3JykKICAgICBmcC53cml0ZShkYXRhKQogICAgIGZwLmNsb3NlKCkKIAorICAgICMgZml4IF9zeXNjb25maWdkYXRhIGlmIGl0IGV4aXN0cworICAgICMKKyAgICAjIFRPRE86IG1ha2UgdGhpcyBtb3JlIHJvYnVzdCEgIHRlc3Rfc3lzY29uZmlnX21vZHVsZSBvZgorICAgICMgZGlzdHV0aWxzLnRlc3RzLnRlc3Rfc3lzY29uZmlnLlN5c2NvbmZpZ1Rlc3RDYXNlIHRlc3RzIHRoYXQKKyAgICAjIHRoZSBvdXRwdXQgZnJvbSBnZXRfY29uZmlnX3ZhciBpbiBib3RoIHN5c2NvbmZpZyBhbmQKKyAgICAjIGRpc3R1dGlscy5zeXNjb25maWcgaXMgZXhhY3RseSB0aGUgc2FtZSBmb3IgYm90aCBDRkxBR1MgYW5kCisgICAgIyBMREZMQUdTLiAgVGhlIGZpeGluZyB1cCBpcyBub3cgY29tcGxpY2F0ZWQgYnkgdGhlIHByZXR0eQorICAgICMgcHJpbnRpbmcgaW4gX3N5c2NvbmZpZ2RhdGEucHkuICBBbHNvLCB3ZSBhcmUgdXNpbmcgdGhlCisgICAgIyBwcHJpbnQgZnJvbSB0aGUgUHl0aG9uIHJ1bm5pbmcgdGhlIGluc3RhbGxlciBidWlsZCB3aGljaAorICAgICMgbWF5IG5vdCBjb3NtZXRpY2FsbHkgZm9ybWF0IHRoZSBzYW1lIGFzIHRoZSBwcHJpbnQgaW4gdGhlIFB5dGhvbgorICAgICMgYmVpbmcgYnVpbHQgKGFuZCB3aGljaCBpcyB1c2VkIHRvIG9yaWdpbmFsbHkgZ2VuZXJhdGUKKyAgICAjIF9zeXNjb25maWdkYXRhLnB5KS4KKworICAgIGltcG9ydCBwcHJpbnQKKyAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGhfdG9fbGliLCAnX3N5c2NvbmZpZ2RhdGEucHknKQorICAgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgorICAgICAgICBmcCA9IG9wZW4ocGF0aCwgJ3InKQorICAgICAgICBkYXRhID0gZnAucmVhZCgpCisgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgIyBjcmVhdGUgYnVpbGRfdGltZV92YXJzIGRpY3QKKyAgICAgICAgZXhlYyhkYXRhKQorICAgICAgICB2YXJzID0ge30KKyAgICAgICAgZm9yIGssIHYgaW4gYnVpbGRfdGltZV92YXJzLml0ZW1zKCk6CisgICAgICAgICAgICBpZiB0eXBlKHYpID09IHR5cGUoJycpOgorICAgICAgICAgICAgICAgIGZvciBwIGluIChpbmNsdWRlX3BhdGgsIGxpYl9wYXRoKToKKyAgICAgICAgICAgICAgICAgICAgdiA9IHYucmVwbGFjZSgnICcgKyBwLCAnJykKKyAgICAgICAgICAgICAgICAgICAgdiA9IHYucmVwbGFjZShwICsgJyAnLCAnJykKKyAgICAgICAgICAgIHZhcnNba10gPSB2CisKKyAgICAgICAgZnAgPSBvcGVuKHBhdGgsICd3JykKKyAgICAgICAgIyBkdXBsaWNhdGVkIGZyb20gc3lzY29uZmlnLl9nZW5lcmF0ZV9wb3NpeF92YXJzKCkKKyAgICAgICAgZnAud3JpdGUoJyMgc3lzdGVtIGNvbmZpZ3VyYXRpb24gZ2VuZXJhdGVkIGFuZCB1c2VkIGJ5JworICAgICAgICAgICAgICAgICAgICAnIHRoZSBzeXNjb25maWcgbW9kdWxlXG4nKQorICAgICAgICBmcC53cml0ZSgnYnVpbGRfdGltZV92YXJzID0gJykKKyAgICAgICAgcHByaW50LnBwcmludCh2YXJzLCBzdHJlYW09ZnApCisgICAgICAgIGZwLmNsb3NlKCkKKwogICAgICMgQWRkIHN5bWxpbmtzIGluIC91c3IvbG9jYWwvYmluLCB1c2luZyByZWxhdGl2ZSBsaW5rcwogICAgIHVzcl9sb2NhbF9iaW4gPSBvcy5wYXRoLmpvaW4ocm9vdERpciwgJ3VzcicsICdsb2NhbCcsICdiaW4nKQogICAgIHRvX2ZyYW1ld29yayA9IG9zLnBhdGguam9pbignLi4nLCAnLi4nLCAnLi4nLCAnTGlicmFyeScsICdGcmFtZXdvcmtzJywKQEAgLTg5Miw3ICsxMTQ1LDcgQEAKICAgICBvcy5jaGRpcihjdXJkaXIpCiAKICAgICBpZiBQWVRIT05fMzoKLSAgICAgICAgIyBSZW1vdmUgdGhlICdDdXJyZW50JyBsaW5rLCB0aGF0IHdheSB3ZSBkb24ndCBhY2NpZGVudGx5IG1lc3MKKyAgICAgICAgIyBSZW1vdmUgdGhlICdDdXJyZW50JyBsaW5rLCB0aGF0IHdheSB3ZSBkb24ndCBhY2NpZGVudGFsbHkgbWVzcwogICAgICAgICAjIHdpdGggYW4gYWxyZWFkeSBpbnN0YWxsZWQgdmVyc2lvbiBvZiBweXRob24gMgogICAgICAgICBvcy51bmxpbmsob3MucGF0aC5qb2luKHJvb3REaXIsICdMaWJyYXJ5JywgJ0ZyYW1ld29ya3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQeXRob24uZnJhbWV3b3JrJywgJ1ZlcnNpb25zJywgJ0N1cnJlbnQnKSkKQEAgLTkwNywxNyArMTE2MCwxNyBAQAogCiAgICAgIyBUaGlzIG9uZSBpcyBub3QgaGFuZHkgYXMgYSB0ZW1wbGF0ZSB2YXJpYWJsZQogICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoJyRQWVRIT05GUkFNRVdPUktJTlNUQUxMRElSJywgJy9MaWJyYXJ5L0ZyYW1ld29ya3MvUHl0aG9uLmZyYW1ld29yaycpCi0gICAgZnAgPSBvcGVuKG91dFBhdGgsICd3YicpCisgICAgZnAgPSBvcGVuKG91dFBhdGgsICd3JykKICAgICBmcC53cml0ZShkYXRhKQogICAgIGZwLmNsb3NlKCkKIAogZGVmIHBhdGNoU2NyaXB0KGluUGF0aCwgb3V0UGF0aCk6CiAgICAgZGF0YSA9IGZpbGVDb250ZW50cyhpblBhdGgpCiAgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgnQFBZVkVSQCcsIGdldFZlcnNpb24oKSkKLSAgICBmcCA9IG9wZW4ob3V0UGF0aCwgJ3diJykKKyAgICBmcCA9IG9wZW4ob3V0UGF0aCwgJ3cnKQogICAgIGZwLndyaXRlKGRhdGEpCiAgICAgZnAuY2xvc2UoKQotICAgIG9zLmNobW9kKG91dFBhdGgsIDA3NTUpCisgICAgb3MuY2htb2Qob3V0UGF0aCwgU1RBVF8wbzc1NSkKIAogCiAKQEAgLTkzNCw3ICsxMTg3LDcgQEAKICAgICAgICAgcmVhZG1lID0gdGV4dHdyYXAuZGVkZW50KHJlY2lwZVsncmVhZG1lJ10pCiAgICAgICAgIGlzUmVxdWlyZWQgPSByZWNpcGUuZ2V0KCdyZXF1aXJlZCcsIFRydWUpCiAKLSAgICAgICAgcHJpbnQgIi0gYnVpbGRpbmcgcGFja2FnZSAlcyIlKHBrZ25hbWUsKQorICAgICAgICBwcmludCgiLSBidWlsZGluZyBwYWNrYWdlICVzIiUocGtnbmFtZSwpKQogCiAgICAgICAgICMgU3Vic3RpdHV0ZSBzb21lIHZhcmlhYmxlcwogICAgICAgICB0ZXh0dmFycyA9IGRpY3QoCkBAIC05NzksNyArMTIzMiw3IEBACiAgICAgICAgICAgICBwYXRjaFNjcmlwdChwb3N0ZmxpZ2h0LCBvcy5wYXRoLmpvaW4ocnNyY0RpciwgJ3Bvc3RmbGlnaHQnKSkKIAogICAgICAgICB2ZXJzID0gZ2V0RnVsbFZlcnNpb24oKQotICAgICAgICBtYWpvciwgbWlub3IgPSBtYXAoaW50LCBnZXRWZXJzaW9uKCkuc3BsaXQoJy4nLCAyKSkKKyAgICAgICAgbWFqb3IsIG1pbm9yID0gZ2V0VmVyc2lvbk1ham9yTWlub3IoKQogICAgICAgICBwbCA9IFBsaXN0KAogICAgICAgICAgICAgICAgIENGQnVuZGxlR2V0SW5mb1N0cmluZz0iUHl0aG9uLiVzICVzIiUocGtnbmFtZSwgdmVycywpLAogICAgICAgICAgICAgICAgIENGQnVuZGxlSWRlbnRpZmllcj0nb3JnLnB5dGhvbi5QeXRob24uJXMnJShwa2duYW1lLCksCkBAIC0xMDE2LDcgKzEyNjksNyBAQAogZGVmIG1ha2VNcGtnUGxpc3QocGF0aCk6CiAKICAgICB2ZXJzID0gZ2V0RnVsbFZlcnNpb24oKQotICAgIG1ham9yLCBtaW5vciA9IG1hcChpbnQsIGdldFZlcnNpb24oKS5zcGxpdCgnLicsIDIpKQorICAgIG1ham9yLCBtaW5vciA9IGdldFZlcnNpb25NYWpvck1pbm9yKCkKIAogICAgIHBsID0gUGxpc3QoCiAgICAgICAgICAgICBDRkJ1bmRsZUdldEluZm9TdHJpbmc9IlB5dGhvbiAlcyIlKHZlcnMsKSwKQEAgLTExMjcsNyArMTM4MCw3IEBACiAgICAgIyBDdXN0b20gaWNvbiBmb3IgdGhlIERNRywgc2hvd24gd2hlbiB0aGUgRE1HIGlzIG1vdW50ZWQuCiAgICAgc2h1dGlsLmNvcHkoIi4uL0ljb25zL0Rpc2sgSW1hZ2UuaWNucyIsCiAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oV09SS0RJUiwgIm1udCIsIHZvbG5hbWUsICIuVm9sdW1lSWNvbi5pY25zIikpCi0gICAgcnVuQ29tbWFuZCgiL0RldmVsb3Blci9Ub29scy9TZXRGaWxlIC1hIEMgJXMvIiUoCisgICAgcnVuQ29tbWFuZCgiU2V0RmlsZSAtYSBDICVzLyIlKAogICAgICAgICAgICAgc2hlbGxRdW90ZShvcy5wYXRoLmpvaW4oV09SS0RJUiwgIm1udCIsIHZvbG5hbWUpKSwpKQogCiAgICAgcnVuQ29tbWFuZCgiaGRpdXRpbCBkZXRhY2ggJXMiJShzaGVsbFF1b3RlKG9zLnBhdGguam9pbihXT1JLRElSLCAibW50Iiwgdm9sbmFtZSkpKSkKQEAgLTExNjgsNiArMTQyMSw3IEBACiAKICAgICBvcy5lbnZpcm9uWydNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQnXSA9IERFUFRBUkdFVAogICAgIG9zLmVudmlyb25bJ0NDJ10gPSBDQworICAgIG9zLmVudmlyb25bJ0NYWCddID0gQ1hYCiAKICAgICBpZiBvcy5wYXRoLmV4aXN0cyhXT1JLRElSKToKICAgICAgICAgc2h1dGlsLnJtdHJlZShXT1JLRElSKQpAQCAtMTE5OCw3ICsxNDUyLDcgQEAKIAogICAgIGZvbGRlciA9IG9zLnBhdGguam9pbihXT1JLRElSLCAiX3Jvb3QiLCAiQXBwbGljYXRpb25zIiwgIlB5dGhvbiAlcyIlKAogICAgICAgICBnZXRWZXJzaW9uKCksKSkKLSAgICBvcy5jaG1vZChmb2xkZXIsIDA3NTUpCisgICAgb3MuY2htb2QoZm9sZGVyLCBTVEFUXzBvNzU1KQogICAgIHNldEljb24oZm9sZGVyLCAiLi4vSWNvbnMvUHl0aG9uIEZvbGRlci5pY25zIikKIAogICAgICMgQ3JlYXRlIHRoZSBpbnN0YWxsZXIKQEAgLTEyMTEsOSArMTQ2NSw5IEBACiAgICAgc2h1dGlsLmNvcHkoJy4uLy4uL0xJQ0VOU0UnLCBvcy5wYXRoLmpvaW4oV09SS0RJUiwgJ2luc3RhbGxlcicsICdMaWNlbnNlLnR4dCcpKQogCiAgICAgZnAgPSBvcGVuKG9zLnBhdGguam9pbihXT1JLRElSLCAnaW5zdGFsbGVyJywgJ0J1aWxkLnR4dCcpLCAndycpCi0gICAgcHJpbnQgPj4gZnAsICIjIEJVSUxEIElORk8iCi0gICAgcHJpbnQgPj4gZnAsICIjIERhdGU6IiwgdGltZS5jdGltZSgpCi0gICAgcHJpbnQgPj4gZnAsICIjIEJ5OiIsIHB3ZC5nZXRwd3VpZChvcy5nZXR1aWQoKSkucHdfZ2Vjb3MKKyAgICBmcC53cml0ZSgiIyBCVUlMRCBJTkZPXG4iKQorICAgIGZwLndyaXRlKCIjIERhdGU6ICVzXG4iICUgdGltZS5jdGltZSgpKQorICAgIGZwLndyaXRlKCIjIEJ5OiAlc1xuIiAlIHB3ZC5nZXRwd3VpZChvcy5nZXR1aWQoKSkucHdfZ2Vjb3MpCiAgICAgZnAuY2xvc2UoKQogCiAgICAgIyBBbmQgY29weSBpdCB0byBhIERNRwpkaWZmIC0tZ2l0IGEvTWFjL0J1aWxkU2NyaXB0L2lzc3VlMTkzNzNfdGtfOF81XzE1X3NvdXJjZS5wYXRjaCBiL01hYy9CdWlsZFNjcmlwdC9pc3N1ZTE5MzczX3RrXzhfNV8xNV9zb3VyY2UucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU1ZDA4ZQotLS0gL2Rldi9udWxsCisrKyBiL01hYy9CdWlsZFNjcmlwdC9pc3N1ZTE5MzczX3RrXzhfNV8xNV9zb3VyY2UucGF0Y2gKQEAgLTAsMCArMSwxMyBAQAorSXNzdWUgIzE5MzczOiBQYXRjaCB0byBUayA4LjUuMTUgdG8gY29ycmVjdCByZWZyZXNoIHByb2JsZW0gb24gT1MgeCAxMC45LgorRnJvbSB1cHN0cmVhbSBjaGVja2luIGh0dHBzOi8vY29yZS50Y2wudGsvdGsvaW5mby81YTVhYmY3MWY5CisKKy0tLSB0azguNS4xNS9tYWNvc3gvdGtNYWNPU1hEcmF3LmMJMjAxMy0wOS0xNiAwOTo0MToyMS4wMDAwMDAwMDAgLTA3MDAKKysrKyBUa19Tb3VyY2VfQ29kZS01YTVhYmY3MWY5ZmRiMGRhL21hY29zeC90a01hY09TWERyYXcuYwkyMDEzLTEwLTI3IDEzOjI3OjAwLjAwMDAwMDAwMCAtMDcwMAorQEAgLTE2ODgsNiArMTY4OCw3IEBACisgeworICAgICBpZiAoZGNQdHItPmNvbnRleHQpIHsKKyAJQ0dDb250ZXh0U3luY2hyb25pemUoZGNQdHItPmNvbnRleHQpOworKwlbW2RjUHRyLT52aWV3IHdpbmRvd10gc2V0Vmlld3NOZWVkRGlzcGxheTpZRVNdOworIAlbW2RjUHRyLT52aWV3IHdpbmRvd10gZW5hYmxlRmx1c2hXaW5kb3ddOworIAlpZiAoZGNQdHItPmZvY3VzTG9ja2VkKSB7CisgCSAgICBbZGNQdHItPnZpZXcgdW5sb2NrRm9jdXNdOwpkaWZmIC0tZ2l0IGEvTWFjL0J1aWxkU2NyaXB0L25jdXJzZXMtNS41LnBhdGNoIGIvTWFjL0J1aWxkU2NyaXB0L25jdXJzZXMtNS41LnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFiM2QzLi4wMDAwMDAwCi0tLSBhL01hYy9CdWlsZFNjcmlwdC9uY3Vyc2VzLTUuNS5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLWRpZmYgLXIgLXUgbmN1cnNlcy01LjUtb3JpZy90ZXN0L01ha2VmaWxlLmluIG5jdXJzZXMtNS41L3Rlc3QvTWFrZWZpbGUuaW4KLS0tLSBuY3Vyc2VzLTUuNS1vcmlnL3Rlc3QvTWFrZWZpbGUuaW4JMjAwNi0wMy0yNCAxMjo0Nzo0MC4wMDAwMDAwMDAgKzAxMDAKLSsrKyBuY3Vyc2VzLTUuNS90ZXN0L01ha2VmaWxlLmluCTIwMDYtMDMtMjQgMTI6NDc6NTAuMDAwMDAwMDAwICswMTAwCi1AQCAtNzUsNyArNzUsNyBAQAotIE1BVEhfTElCCT0gQE1BVEhfTElCQAotIAotIExECQk9IEBMREAKLS1MSU5LCQk9IEBMSU5LX1RFU1RTQCAkKExJQlRPT0xfTElOSykgJChDQykgJChDRkxBR1MpCi0rTElOSwkJPSBATElOS19URVNUU0AgJChMSUJUT09MX0xJTkspICQoQ0MpIAotIAotIHVzRkxBR1MJCT0gQExEX01PREVMQCBATE9DQUxfTERGTEFHU0AgQExERkxBR1NACi0gCi1kaWZmIC1ydSBuY3Vyc2VzLTUuNS1vcmlnL25jdXJzZXMvdGluZm8vcmVhZF9lbnRyeS5jIG5jdXJzZXMtNS41L25jdXJzZXMvdGluZm8vcmVhZF9lbnRyeS5jCi0tLS0gbmN1cnNlcy01LjUtb3JpZy9uY3Vyc2VzL3RpbmZvL3JlYWRfZW50cnkuYyAyMDA0LTAxLTExIDAyOjU3OjA1LjAwMDAwMDAwMCArMDEwMAotKysrIG5jdXJzZXMtNS41L25jdXJzZXMvdGluZm8vcmVhZF9lbnRyeS5jICAgICAgMjAwNi0wMy0yNSAyMjo0OTozOS4wMDAwMDAwMDAgKzAxMDAKLUBAIC00NzQsNyArNDc0LDcgQEAKLSAgICAgfQotIAotICAgICAvKiB0cnVuY2F0ZSB0aGUgdGVybWluYWwgbmFtZSB0byBwcmV2ZW50IGJ1ZmZlciBvdmVyZmxvdyAqLwotLSAgICAodm9pZCkgc3ByaW50Zih0dG4sICIlYy8lLipzIiwgKnRuLCAoaW50KSBzaXplb2YodHRuKSAtIDMsIHRuKTsKLSsgICAgKHZvaWQpIHNwcmludGYodHRuLCAiJXgvJS4qcyIsICp0biwgKGludCkgc2l6ZW9mKHR0bikgLSAzLCB0bik7Ci0gCi0gICAgIC8qIFRoaXMgaXMgU3lzdGVtIFYgYmVoYXZpb3IsIGluIGNvbmp1bmN0aW9uIHdpdGggb3VyIHJlcXVpcmVtZW50cyBmb3IKLSAgICAgICogd3JpdGluZyB0ZXJtaW5mbyBlbnRyaWVzLgotZGlmZiAtcnUgbmN1cnNlcy01LjUtb3JpZy9jb25maWd1cmUgbmN1cnNlcy01LjUvY29uZmlndXJlCi0tLS0gbmN1cnNlcy01LjUtb3JpZy9jb25maWd1cmUJMjAwNS0wOS0yNCAyMzo1MDo1MC4wMDAwMDAwMDAgKzAyMDAKLSsrKyBuY3Vyc2VzLTUuNS9jb25maWd1cmUJMjAwNi0wMy0yNiAyMjoyNDo1OS4wMDAwMDAwMDAgKzAyMDAKLUBAIC01MDI3LDcgKzUwMjcsNyBAQAotIAlkYXJ3aW4qKQotIAkJRVhUUkFfQ0ZMQUdTPSItbm8tY3BwLXByZWNvbXAiCi0gCQlDQ19TSEFSRURfT1BUUz0iLWR5bmFtaWMiCi0tCQlNS19TSEFSRURfTElCPSckKENDKSAtZHluYW1pY2xpYiAtaW5zdGFsbF9uYW1lICQoREVTVERJUikkKGxpYmRpcikvYGJhc2VuYW1lICRAYCAtY29tcGF0aWJpbGl0eV92ZXJzaW9uICQoQUJJX1ZFUlNJT04pIC1jdXJyZW50X3ZlcnNpb24gJChBQklfVkVSU0lPTikgLW8gJEAnCi0rCQlNS19TSEFSRURfTElCPSckKENDKSAkKENGTEFHUykgLWR5bmFtaWNsaWIgLWluc3RhbGxfbmFtZSAkKERFU1RESVIpJChsaWJkaXIpL2BiYXNlbmFtZSAkQGAgLWNvbXBhdGliaWxpdHlfdmVyc2lvbiAkKEFCSV9WRVJTSU9OKSAtY3VycmVudF92ZXJzaW9uICQoQUJJX1ZFUlNJT04pIC1vICRAJwotIAkJdGVzdCAiJGNmX2N2X3NobGliX3ZlcnNpb24iID0gYXV0byAmJiBjZl9jdl9zaGxpYl92ZXJzaW9uPWFiaQotIAkJY2ZfY3Zfc2hsaWJfdmVyc2lvbl9pbmZpeD15ZXMKLSAJCTs7CmRpZmYgLS1naXQgYS9NYWMvQnVpbGRTY3JpcHQvcmVzb3VyY2VzL1JlYWRNZS50eHQgYi9NYWMvQnVpbGRTY3JpcHQvcmVzb3VyY2VzL1JlYWRNZS50eHQKaW5kZXggNzYxY2ZmYi4uYTlkNTg3OSAxMDA2NDQKLS0tIGEvTWFjL0J1aWxkU2NyaXB0L3Jlc291cmNlcy9SZWFkTWUudHh0CisrKyBiL01hYy9CdWlsZFNjcmlwdC9yZXNvdXJjZXMvUmVhZE1lLnR4dApAQCAtMiwxMSArMiw2MSBAQAogJE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCBmb3IgdGhlIGZvbGxvd2luZyBhcmNoaXRlY3R1cmUocyk6CiAkQVJDSElURUNUVVJFUy4KIAotSW5zdGFsbGF0aW9uIHJlcXVpcmVzIGFwcHJveGltYXRlbHkgJElOU1RBTExfU0laRSBNQiBvZiBkaXNrIHNwYWNlLAotaWdub3JlIHRoZSBtZXNzYWdlIHRoYXQgaXQgd2lsbCB0YWtlIHplcm8gYnl0ZXMuCisgICAgICAgICAgICAgICAqKioqIElNUE9SVEFOVCAqKioqCiAKLVlvdSBtdXN0IGluc3RhbGwgb250byB5b3VyIGN1cnJlbnQgYm9vdCBkaXNrLCBldmVuIHRob3VnaCB0aGUKLWluc3RhbGxlciBkb2VzIG5vdCBlbmZvcmNlIHRoaXMsIG90aGVyd2lzZSB0aGluZ3Mgd2lsbCBub3Qgd29yay4KK0luc3RhbGxpbmcgb24gT1MgWCAxMC44IChNb3VudGFpbiBMaW9uKSBvciBsYXRlciBzeXN0ZW1zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJZiB5b3UgYXJlIGF0dGVtcHRpbmcgdG8gaW5zdGFsbCBvbiBhbiBPUyBYIDEwLjgrIHN5c3RlbSwgeW91IG1heQorc2VlIGEgbWVzc2FnZSB0aGF0IFB5dGhvbiBjYW4ndCBiZSBpbnN0YWxsZWQgYmVjYXVzZSBpdCBpcyBmcm9tIGFuCit1bmlkZW50aWZpZWQgZGV2ZWxvcGVyLiAgVGhpcyBpcyBiZWNhdXNlIHRoaXMgUHl0aG9uIGluc3RhbGxlcgorcGFja2FnZSBpcyBub3QgeWV0IGNvbXBhdGlibGUgd2l0aCB0aGUgR2F0ZWtlZXBlciBzZWN1cml0eSBmZWF0dXJlCitpbnRyb2R1Y2VkIGluIE9TIFggMTAuOC4gIFRvIGFsbG93IFB5dGhvbiB0byBiZSBpbnN0YWxsZWQsIHlvdQorY2FuIG92ZXJyaWRlIHRoZSBHYXRla2VlcGVyIHBvbGljeSBmb3IgdGhpcyBpbnN0YWxsLiAgSW4gdGhlIEZpbmRlciwKK2luc3RlYWQgb2YgZG91YmxlLWNsaWNraW5nLCBjb250cm9sLWNsaWNrIG9yIHJpZ2h0IGNsaWNrIHRoZSAiUHl0aG9uIgoraW5zdGFsbGVyIHBhY2thZ2UgaWNvbi4gIFRoZW4gc2VsZWN0ICJPcGVuIHVzaW5nIC4uLiBJbnN0YWxsZXIiIGZyb20KK3RoZSBjb250ZXh0dWFsIG1lbnUgdGhhdCBhcHBlYXJzLgorCisgICAgICAgICAgICAgICAqKioqIElNUE9SVEFOVCAqKioqCisKK1VwZGF0ZSB5b3VyIHZlcnNpb24gb2YgVGNsL1RrIHRvIHVzZSBJRExFIG9yIG90aGVyIFRrIGFwcGxpY2F0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RvIHVzZSBJRExFIG9yIG90aGVyIHByb2dyYW1zIHRoYXQgdXNlIHRoZSBUa2ludGVyIGdyYXBoaWNhbCB1c2VyCitpbnRlcmZhY2UgdG9vbGtpdCwgeW91IG1heSBuZWVkIHRvIGluc3RhbGwgYSBuZXdlciB0aGlyZC1wYXJ0eSB2ZXJzaW9uCitvZiB0aGUgVGNsL1RrIGZyYW1ld29ya3MuICBWaXNpdCBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG93bmxvYWQvbWFjL3RjbHRrLworZm9yIGN1cnJlbnQgaW5mb3JtYXRpb24gYWJvdXQgc3VwcG9ydGVkIGFuZCByZWNvbW1lbmRlZCB2ZXJzaW9ucyBvZgorVGNsL1RrIGZvciB0aGlzIHZlcnNpb24gb2YgUHl0aG9uIGFuZCBvZiBNYWMgT1MgWC4KKworICAgICAgICAgICAgICAgKioqKiBJTVBPUlRBTlQgKioqKgorCitCaW5hcnkgaW5zdGFsbGVyIHN1cHBvcnQgZm9yIDEwLjQgYW5kIDEwLjMuOSB0byBiZSBkaXNjb250aW51ZWQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitQeXRob24gMi43LjcgaXMgdGhlIGxhc3QgcmVsZWFzZSBmb3Igd2hpY2ggYmluYXJ5IGluc3RhbGxlcnMgd2lsbCBiZQorcmVsZWFzZWQgb24gcHl0aG9uLm9yZyB0aGF0IHN1cHBvcnQgT1MgWCAxMC4zLjkgKFBhbnRoZXIpIGFuZCAxMC40LngKKyhUaWdlcikgc3lzdGVtcy4gIFRoZXNlIHN5c3RlbXMgd2VyZSBsYXN0IHVwZGF0ZWQgYnkgQXBwbGUgaW4gMjAwNQorYW5kIDIwMDcuICBBcyBvZiAyLjcuOCwgdGhlIDMyLWJpdC1vbmx5IGluc3RhbGxlciB3aWxsIHN1cHBvcnQgUFBDCithbmQgSW50ZWwgTWFjcyBydW5uaW5nIE9TIFggMTAuNSAoTGVvcGFyZCkgYW5kIGxhdGVyLiAgMTAuNSB3YXMgdGhlCitsYXN0IE9TIFggcmVsZWFzZSBmb3IgUFBDIG1hY2hpbmVzIChHNCBhbmQgRzUpLiAgKFRoZSA2NC0vMzItYml0CitpbnN0YWxsZXIgY29uZmlndXJhdGlvbiB3aWxsIHJlbWFpbiB1bmNoYW5nZWQuKSAgVGhpcyBhbGlnbnMgUHl0aG9uCisyLjcueCBpbnN0YWxsZXIgY29uZmlndXJhdGlvbnMgd2l0aCB0aG9zZSBjdXJyZW50bHkgcHJvdmlkZWQgd2l0aAorUHl0aG9uIDMueC4gIFNvbWUgb2YgdGhlIHJlYXNvbnMgZm9yIG1ha2luZyB0aGlzIGNoYW5nZSBhcmU6Cit0aGVyZSB3ZXJlIHNpZ25pZmljYW50IGFkZGl0aW9ucyBhbmQgY29tcGF0aWJpbGl0eSBpbXByb3ZlbWVudHMgdG8KK3RoZSBPUyBYIFBPU0lYIHN5c3RlbSBBUElzIGluIE9TIFggMTAuNSB0aGF0IFB5dGhvbiB1c2VycyBjYW4gbm93Cit0YWtlIGFkdmFudGFnZSBvZjsgaXQgaXMgaW5jcmVhc2luZ2x5IGRpZmZpY3VsdCB0byBidWlsZCBhbmQgdGVzdAorb24gb2Jzb2xldGUgMTAuMyBhbmQgMTAuNCBzeXN0ZW1zIGFuZCB3aXRoIHRoZSAxMC4zIEFCSTsgYW5kIGl0IGlzCithc3N1bWVkIHRoYXQgbW9zdCByZW1haW5pbmcgbGVnYWN5IFBQQyBzeXN0ZW1zIGhhdmUgdXBncmFkZWQgdG8gMTAuNS4KK1RvIGVhc2UgdGhlIHRyYW5zaXRpb24sIGZvciBQeXRob24gMi43Ljcgb25seSB3ZSBhcmUgcHJvdmlkaW5nIHRocmVlCitiaW5hcnkgaW5zdGFsbGVyczogKDEpIHRoZSBsZWdhY3kgZGVwcmVjYXRlZCAzMi1iaXQtb25seSAxMC4zKworUFBDL0ludGVsIGZvcm1hdCwgKDIpIHRoZSBuZXdlciAzMi1iaXQtb25seSAxMC41KyBQUEMvSW50ZWwgZm9ybWF0LAorYW5kICgzKSB0aGUgY3VycmVudCA2NC1iaXQvMzItYml0IDEwLjYrIEludGVsLW9ubHkgZm9ybWF0LiAgV2hpbGUKK2Z1dHVyZSByZWxlYXNlcyB3aWxsIG5vdCBwcm92aWRlIHRoZSBkZXByZWNhdGVkIGluc3RhbGxlciwgaXQgd2lsbAorc3RpbGwgYmUgcG9zc2libGUgdG8gYnVpbGQgUHl0aG9uIGZyb20gc291cmNlIG9uIDEwLjMuOSBhbmQgMTAuNAorc3lzdGVtcyBpZiBuZWVkZWQuCisKK1VzaW5nIHRoaXMgdmVyc2lvbiBvZiBQeXRob24gb24gT1MgWAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIFB5dGhvbiBjb25zaXN0cyBvZiB0aGUgUHl0aG9uIHByb2dyYW1taW5nIGxhbmd1YWdlIGludGVycHJldGVyLCBwbHVzCiBhIHNldCBvZiBwcm9ncmFtcyB0byBhbGxvdyBlYXN5IGFjY2VzcyB0byBpdCBmb3IgTWFjIHVzZXJzIGluY2x1ZGluZwpAQCAtMTQsMTcgKzY0LDggQEAKIGV4dGVuc2lvbiBtb2R1bGVzIHRoYXQgb3BlbiB1cCBzcGVjaWZpYyBNYWNpbnRvc2ggdGVjaG5vbG9naWVzIHRvCiBQeXRob24gcHJvZ3JhbXMuCiAKLSAgICAgICAgICAgICAgICAgICAgKioqKiBJTVBPUlRBTlQgKioqKgotICAgICAgICAgICAgICAgICAgICAKLUJlZm9yZSB1c2luZyBJRExFIG9yIG90aGVyIHByb2dyYW1zIHVzaW5nIHRoZSB0a2ludGVyIGdyYXBoaWNhbCB1c2VyCi1pbnRlcmZhY2UgdG9vbGtpdCwgdmlzaXQgaHR0cDovL3d3dy5weXRob24ub3JnL2Rvd25sb2FkL21hYy90Y2x0ay8KLWZvciBjdXJyZW50IGluZm9ybWF0aW9uIGFib3V0IHN1cHBvcnRlZCBhbmQgcmVjb21tZW5kZWQgdmVyc2lvbnMKLW9mIFRjbC9UayBmb3IgdGhpcyB2ZXJzaW9uIG9mIFB5dGhvbiBhbmQgTWFjIE9TIFguCi0KLSAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKgotCiBUaGUgaW5zdGFsbGVyIHB1dHMgYXBwbGljYXRpb25zLCBhbiAiVXBkYXRlIFNoZWxsIFByb2ZpbGUiIGNvbW1hbmQsCi1hbmQgYW4gRXh0cmFzIGZvbGRlciBjb250YWluaW5nIGRlbW8gcHJvZ3JhbXMgYW5kIHRvb2xzIGludG8gdGhlCithbmQgYSBsaW5rIHRvIHRoZSBvcHRpb25hbGx5IGluc3RhbGxlZCBQeXRob24gRG9jdW1lbnRhdGlvbiBpbnRvIHRoZQogIlB5dGhvbiAkVkVSU0lPTiIgc3ViZm9sZGVyIG9mIHRoZSBzeXN0ZW0gQXBwbGljYXRpb25zIGZvbGRlciwKIGFuZCBwdXRzIHRoZSB1bmRlcmx5aW5nIG1hY2hpbmVyeSBpbnRvIHRoZSBmb2xkZXIKICRQWVRIT05GUkFNRVdPUktJTlNUQUxMRElSLiBJdCBjYW4KQEAgLTMyLDUgKzczLDE2IEBACiB3ZWxsLiBEb3VibGUtY2xpY2sgb24gdGhlICJVcGRhdGUgU2hlbGwgUHJvZmlsZSIgY29tbWFuZCB0byBhZGQgdGhlCiAiYmluIiBkaXJlY3RvcnkgaW5zaWRlIHRoZSBmcmFtZXdvcmsgdG8geW91ciBzaGVsbCdzIHNlYXJjaCBwYXRoLgogCitZb3UgbXVzdCBpbnN0YWxsIG9udG8geW91ciBjdXJyZW50IGJvb3QgZGlzaywgZXZlbiB0aG91Z2ggdGhlCitpbnN0YWxsZXIgbWF5IG5vdCBlbmZvcmNlIHRoaXMsIG90aGVyd2lzZSB0aGluZ3Mgd2lsbCBub3Qgd29yay4KKworWW91IGNhbiB2ZXJpZnkgdGhlIGludGVncml0eSBvZiB0aGUgZGlzayBpbWFnZSBmaWxlIGNvbnRhaW5pbmcgdGhlCitpbnN0YWxsZXIgcGFja2FnZSBhbmQgdGhpcyBSZWFkTWUgZmlsZSBieSBjb21wYXJpbmcgaXRzIG1kNSBjaGVja3N1bQorYW5kIHNpemUgd2l0aCB0aGUgdmFsdWVzIHB1Ymxpc2hlZCBvbiB0aGUgcmVsZWFzZSBwYWdlIGxpbmtlZCBhdAoraHR0cDovL3d3dy5weXRob24ub3JnL2Rvd25sb2FkLworCitJbnN0YWxsYXRpb24gcmVxdWlyZXMgYXBwcm94aW1hdGVseSAkSU5TVEFMTF9TSVpFIE1CIG9mIGRpc2sgc3BhY2UsCitpZ25vcmUgdGhlIG1lc3NhZ2UgdGhhdCBpdCB3aWxsIHRha2UgemVybyBieXRlcy4KKwogTW9yZSBpbmZvcm1hdGlvbiBvbiBQeXRob24gaW4gZ2VuZXJhbCBjYW4gYmUgZm91bmQgYXQKIGh0dHA6Ly93d3cucHl0aG9uLm9yZy4KZGlmZiAtLWdpdCBhL01hYy9CdWlsZFNjcmlwdC9yZXNvdXJjZXMvV2VsY29tZS5ydGYgYi9NYWMvQnVpbGRTY3JpcHQvcmVzb3VyY2VzL1dlbGNvbWUucnRmCmluZGV4IDFmYjdjZDQuLmUxNDg3NzIgMTAwNjQ0Ci0tLSBhL01hYy9CdWlsZFNjcmlwdC9yZXNvdXJjZXMvV2VsY29tZS5ydGYKKysrIGIvTWFjL0J1aWxkU2NyaXB0L3Jlc291cmNlcy9XZWxjb21lLnJ0ZgpAQCAtMSw4ICsxLDggQEAKLXtccnRmMVxhbnNpXGFuc2ljcGcxMjUyXGNvY29hcnRmMTAzOFxjb2NvYXN1YnJ0ZjM1MAote1xmb250dGJsXGYwXGZzd2lzc1xmY2hhcnNldDAgSGVsdmV0aWNhO30KK3tccnRmMVxhbnNpXGFuc2ljcGcxMjUyXGNvY29hcnRmMTI2NVxjb2NvYXN1YnJ0ZjIwMAorXGNvY29hc2NyZWVuZm9udHMxe1xmb250dGJsXGYwXGZzd2lzc1xmY2hhcnNldDAgSGVsdmV0aWNhO30KIHtcY29sb3J0Ymw7XHJlZDI1NVxncmVlbjI1NVxibHVlMjU1O30KLVxwYXBlcncxMTkwNFxwYXBlcmgxNjgzNlxtYXJnbDE0NDBcbWFyZ3IxNDQwXHZpZXd3OTY0MFx2aWV3aDEwNjIwXHZpZXdraW5kMAotXHBhcmRcdHg3MjBcdHgxNDQwXHR4MjE2MFx0eDI4ODBcdHgzNjAwXHR4NDMyMFx0eDUwNDBcdHg1NzYwXHR4NjQ4MFx0eDcyMDBcdHg3OTIwXHR4ODY0MFxxbFxxbmF0dXJhbAorXHBhcGVydzExOTA1XHBhcGVyaDE2ODM3XG1hcmdsMTQ0MFxtYXJncjE0NDBcdmlld3c5NjQwXHZpZXdoMTA2MjBcdmlld2tpbmQwCitccGFyZFx0eDcyMFx0eDE0NDBcdHgyMTYwXHR4Mjg4MFx0eDM2MDBcdHg0MzIwXHR4NTA0MFx0eDU3NjBcdHg2NDgwXHR4NzIwMFx0eDc5MjBcdHg4NjQwCiAKIFxmMFxmczI0IFxjZjAgVGhpcyBwYWNrYWdlIHdpbGwgaW5zdGFsbCAKIFxiIFB5dGhvbiAkRlVMTF9WRVJTSU9OCkBAIC0xNiw3ICsxNiw3IEBACiBcYiBJRExFCiBcYjAgIGFuZCBhIHNldCBvZiBwcmUtYnVpbHQgZXh0ZW5zaW9uIG1vZHVsZXMgdGhhdCBvcGVuIHVwIHNwZWNpZmljIE1hY2ludG9zaCB0ZWNobm9sb2dpZXMgdG8gUHl0aG9uIHByb2dyYW1zLlwKIFwKLVNlZSB0aGUgUmVhZE1lIGZpbGUgYW5kIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cCitTZWUgdGhlIFJlYWRNZSBmaWxlIGFuZCB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24gZm9yIGltcG9ydGFudCBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIHRoZSBkcm9wcGluZyBvZiBzdXBwb3J0IGZvciBPUyBYIDEwLjMuOSBhbmQgMTAuNCBpbiBmdXR1cmUgUHl0aG9uIDIuNy54IGJpbmFyeSBpbnN0YWxsZXJzLlwKIFwKIAogXGIgSU1QT1JUQU5UOgpkaWZmIC0tZ2l0IGEvTWFjL0J1aWxkU2NyaXB0L3NjcmlwdHMvcG9zdGZsaWdodC5kb2N1bWVudGF0aW9uIGIvTWFjL0J1aWxkU2NyaXB0L3NjcmlwdHMvcG9zdGZsaWdodC5kb2N1bWVudGF0aW9uCmluZGV4IDMxZmJmMmYuLmI5ZjI4YTUgMTAwNzU1Ci0tLSBhL01hYy9CdWlsZFNjcmlwdC9zY3JpcHRzL3Bvc3RmbGlnaHQuZG9jdW1lbnRhdGlvbgorKysgYi9NYWMvQnVpbGRTY3JpcHQvc2NyaXB0cy9wb3N0ZmxpZ2h0LmRvY3VtZW50YXRpb24KQEAgLTUsMTkgKzUsMTAgQEAKIEZXS19ET0NESVJfU1VCUEFUSD0iUmVzb3VyY2VzL0VuZ2xpc2gubHByb2ovRG9jdW1lbnRhdGlvbiIKIEZXS19ET0NESVI9IiR7RldLfS8ke0ZXS19ET0NESVJfU1VCUEFUSH0iCiBBUFBESVI9Ii9BcHBsaWNhdGlvbnMvUHl0aG9uICR7UFlWRVJ9IgotREVWX0RPQ0RJUj0iL0RldmVsb3Blci9Eb2N1bWVudGF0aW9uIgogU0hBUkVfRElSPSIke0ZXS30vc2hhcmUiCiBTSEFSRV9ET0NESVI9IiR7U0hBUkVfRElSfS9kb2MvcHl0aG9uJHtQWVZFUn0iCiBTSEFSRV9ET0NESVJfVE9fRldLPSIuLi8uLi8uLiIKIAotIyBtYWtlIGxpbmsgaW4gL0RldmVsb3Blci9Eb2N1bWVudGF0aW9uLyBmb3IgWGNvZGUgdXNlcnMKLWlmIFsgLWQgIiR7REVWX0RPQ0RJUn0iIF07IHRoZW4KLSAgICBpZiBbICEgLWQgIiR7REVWX0RPQ0RJUn0vUHl0aG9uIiBdOyB0aGVuCi0gICAgICAgIG1rZGlyIC1wICIke0RFVl9ET0NESVJ9L1B5dGhvbiIKLSAgICBmaQotICAgIGxuIC1maHMgIiR7RldLX0RPQ0RJUn0iICIke0RFVl9ET0NESVJ9L1B5dGhvbi9SZWZlcmVuY2UgRG9jdW1lbnRhdGlvbiAke1BZVkVSfSIKLWZpCi0KICMgbWFrZSBsaW5rIGluIC9BcHBsaWNhdGlvbnMvUHl0aG9uIG0ubi8gZm9yIEZpbmRlciB1c2VycwogaWYgWyAtZCAiJHtBUFBESVJ9IiBdOyB0aGVuCiAgICAgbG4gLWZocyAiJHtGV0tfRE9DRElSfS9pbmRleC5odG1sIiAiJHtBUFBESVJ9L1B5dGhvbiBEb2N1bWVudGF0aW9uLmh0bWwiCkBAIC0yNSw3ICsxNiw3IEBACiAKICMgbWFrZSBzaGFyZS9kb2MgbGluayBpbiBmcmFtZXdvcmsgZm9yIGNvbW1hbmQgbGluZSB1c2VycwogaWYgWyAtZCAiJHtTSEFSRV9ESVJ9IiBdOyB0aGVuCi0gICAgbWtkaXIgLXAgIiR7U0hBUkVfRE9DRElSfSIKKyAgICBta2RpciAtbSA3NzUgLXAgIiR7U0hBUkVfRE9DRElSfSIKICAgICAjIG1ha2UgcmVsYXRpdmUgbGluayB0byBodG1sIGRvYyBkaXJlY3RvcnkKICAgICBsbiAtZmhzICIke1NIQVJFX0RPQ0RJUl9UT19GV0t9LyR7RldLX0RPQ0RJUl9TVUJQQVRIfSIgIiR7U0hBUkVfRE9DRElSfS9odG1sIgogZmkKZGlmZiAtLWdpdCBhL01hYy9CdWlsZFNjcmlwdC9zY3JpcHRzL3Bvc3RmbGlnaHQuZnJhbWV3b3JrIGIvTWFjL0J1aWxkU2NyaXB0L3NjcmlwdHMvcG9zdGZsaWdodC5mcmFtZXdvcmsKaW5kZXggNGM4ZjZkMy4uZWRkNTAzOCAxMDA3NTUKLS0tIGEvTWFjL0J1aWxkU2NyaXB0L3NjcmlwdHMvcG9zdGZsaWdodC5mcmFtZXdvcmsKKysrIGIvTWFjL0J1aWxkU2NyaXB0L3NjcmlwdHMvcG9zdGZsaWdodC5mcmFtZXdvcmsKQEAgLTgsMTQgKzgsMjQgQEAKIAogIiR7RldLfS9iaW4vcHl0aG9uQFBZVkVSQCIgLVdpIC10dCBcCiAgICAgIiR7RldLfS9saWIvcHl0aG9uJHtQWVZFUn0vY29tcGlsZWFsbC5weSIgXAotICAgIC14IGJhZHN5bnRheCAteCBzaXRlLXBhY2thZ2VzIFwKKyAgICAtZiAteCAnYmFkX2NvZGluZ3xiYWRzeW50YXh8c2l0ZS1wYWNrYWdlc3xsaWIydG8zL3Rlc3RzL2RhdGEnIFwKICAgICAiJHtGV0t9L2xpYi9weXRob24ke1BZVkVSfSIKIAogIiR7RldLfS9iaW4vcHl0aG9uQFBZVkVSQCIgLVdpIC10dCAtTyBcCiAgICAgIiR7RldLfS9saWIvcHl0aG9uJHtQWVZFUn0vY29tcGlsZWFsbC5weSIgXAotICAgIC14IGJhZHN5bnRheCAteCBzaXRlLXBhY2thZ2VzIFwKKyAgICAtZiAteCAnYmFkX2NvZGluZ3xiYWRzeW50YXh8c2l0ZS1wYWNrYWdlc3xsaWIydG8zL3Rlc3RzL2RhdGEnIFwKICAgICAiJHtGV0t9L2xpYi9weXRob24ke1BZVkVSfSIKIAorIiR7RldLfS9iaW4vcHl0aG9uQFBZVkVSQCIgLVdpIFwKKyAgICAiJHtGV0t9L2xpYi9weXRob24ke1BZVkVSfS9jb21waWxlYWxsLnB5IiBcCisgICAgLWYgLXggYmFkc3ludGF4IFwKKyAgICAiJHtGV0t9L2xpYi9weXRob24ke1BZVkVSfS9zaXRlLXBhY2thZ2VzIgorCisiJHtGV0t9L2Jpbi9weXRob25AUFlWRVJAIiAtV2kgLU8gXAorICAgICIke0ZXS30vbGliL3B5dGhvbiR7UFlWRVJ9L2NvbXBpbGVhbGwucHkiIFwKKyAgICAtZiAteCBiYWRzeW50YXggXAorICAgICIke0ZXS30vbGliL3B5dGhvbiR7UFlWRVJ9L3NpdGUtcGFja2FnZXMiCisKIGNoZ3JwIC1SIGFkbWluICIke0ZXS30iCiBjaG1vZCAtUiBnK3cgIiR7RldLfSIKIApkaWZmIC0tZ2l0IGEvTWFjL0lETEUvSW5mby5wbGlzdC5pbiBiL01hYy9JRExFL0luZm8ucGxpc3QuaW4KaW5kZXggYTcxMTY5MC4uOWExOGIyNyAxMDA2NDQKLS0tIGEvTWFjL0lETEUvSW5mby5wbGlzdC5pbgorKysgYi9NYWMvSURMRS9JbmZvLnBsaXN0LmluCkBAIC0zNiw3ICszNiw3IEBACiAJPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KIAk8c3RyaW5nPklETEU8L3N0cmluZz4KIAk8a2V5PkNGQnVuZGxlR2V0SW5mb1N0cmluZzwva2V5PgotCTxzdHJpbmc+JVZFUlNJT04lLCDCqSAyMDAxLTIwMTEgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb248L3N0cmluZz4KKwk8c3RyaW5nPiVWRVJTSU9OJSwgwqkgMjAwMS0yMDE0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9zdHJpbmc+CiAJPGtleT5DRkJ1bmRsZUljb25GaWxlPC9rZXk+CiAJPHN0cmluZz5JRExFLmljbnM8L3N0cmluZz4KIAk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgpAQCAtNTEsNiArNTEsOCBAQAogCTxzdHJpbmc+JVZFUlNJT04lPC9zdHJpbmc+CiAJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KIAk8c3RyaW5nPiVWRVJTSU9OJTwvc3RyaW5nPgorCTxrZXk+TlNIaWdoUmVzb2x1dGlvbkNhcGFibGU8L2tleT4KKwk8dHJ1ZS8+CiA8IS0tCiAJPGtleT5MU01pbmltdW1TeXN0ZW1WZXJzaW9uQnlBcmNoaXRlY3R1cmU8L2tleT4KIAk8ZGljdD4KZGlmZiAtLWdpdCBhL01hYy9NYWtlZmlsZS5pbiBiL01hYy9NYWtlZmlsZS5pbgppbmRleCAwZTRlMDcwLi5hM2UwMGIyIDEwMDY0NAotLS0gYS9NYWMvTWFrZWZpbGUuaW4KKysrIGIvTWFjL01ha2VmaWxlLmluCkBAIC0zOCwxMCArMzgsMTAgQEAKIElOU1RBTExfREFUQT1ASU5TVEFMTF9EQVRBQAogTE49QExOQAogU1RSSVBGTEFHPS1zCi1DUE1BQz0vRGV2ZWxvcGVyL1Rvb2xzL0NwTWFjCitDUE1BQz1DcE1hYwogCiBBUFBURU1QTEFURT0kKHNyY2RpcikvUmVzb3VyY2VzL2FwcAotQVBQU1VCRElSUz1NYWNPUyBSZXNvdXJjZXMgCitBUFBTVUJESVJTPU1hY09TIFJlc291cmNlcwogQ0FDSEVSU1JDPSQoc3JjZGlyKS9zY3JpcHRzL2NhY2hlcnNyYy5weQogY29tcGlsZWFsbD0kKHNyY2RpcikvLi4vTGliL2NvbXBpbGVhbGwucHkKIApAQCAtNTIsMTMgKzUyLDE3IEBACiBpbnN0YWxsX3B5dGhvbnc6IHB5dGhvbncKIAkkKElOU1RBTExfUFJPR1JBTSkgJChTVFJJUEZMQUcpIHB5dGhvbncgIiQoREVTVERJUikkKHByZWZpeCkvYmluL3B5dGhvbnckKFZFUlNJT04pIgogCSQoSU5TVEFMTF9QUk9HUkFNKSAkKFNUUklQRkxBRykgcHl0aG9udyAiJChERVNURElSKSQocHJlZml4KS9iaW4vcHl0aG9uJChWRVJTSU9OKSIKLQlsbiAtc2YgcHl0aG9uJChWRVJTSU9OKSAiJChERVNURElSKSQocHJlZml4KS9iaW4vcHl0aG9uIgotCWxuIC1zZiBweXRob253JChWRVJTSU9OKSAiJChERVNURElSKSQocHJlZml4KS9iaW4vcHl0aG9udyIKKwlsbiAtc2YgcHl0aG9uJChWRVJTSU9OKSAiJChERVNURElSKSQocHJlZml4KS9iaW4vcHl0aG9uMiIKKwlsbiAtc2YgcHl0aG9uMiAiJChERVNURElSKSQocHJlZml4KS9iaW4vcHl0aG9uIgorCWxuIC1zZiBweXRob253JChWRVJTSU9OKSAiJChERVNURElSKSQocHJlZml4KS9iaW4vcHl0aG9udzIiCisJbG4gLXNmIHB5dGhvbncyICIkKERFU1RESVIpJChwcmVmaXgpL2Jpbi9weXRob253IgogaWZuZXEgKCQoTElQT18zMkJJVF9GTEFHUyksKQogCWxpcG8gJChMSVBPXzMyQklUX0ZMQUdTKSAtb3V0cHV0ICQoREVTVERJUikkKHByZWZpeCkvYmluL3B5dGhvbiQoVkVSU0lPTiktMzIgcHl0aG9udwogCWxpcG8gJChMSVBPXzMyQklUX0ZMQUdTKSAtb3V0cHV0ICQoREVTVERJUikkKHByZWZpeCkvYmluL3B5dGhvbnckKFZFUlNJT04pLTMyIHB5dGhvbncKLQlsbiAtc2YgcHl0aG9uJChWRVJTSU9OKS0zMiAiJChERVNURElSKSQocHJlZml4KS9iaW4vcHl0aG9uLTMyIgotCWxuIC1zZiBweXRob253JChWRVJTSU9OKS0zMiAiJChERVNURElSKSQocHJlZml4KS9iaW4vcHl0aG9udy0zMiIKKwlsbiAtc2YgcHl0aG9uJChWRVJTSU9OKS0zMiAiJChERVNURElSKSQocHJlZml4KS9iaW4vcHl0aG9uMi0zMiIKKwlsbiAtc2YgcHl0aG9uMi0zMiAiJChERVNURElSKSQocHJlZml4KS9iaW4vcHl0aG9uLTMyIgorCWxuIC1zZiBweXRob253JChWRVJTSU9OKS0zMiAiJChERVNURElSKSQocHJlZml4KS9iaW4vcHl0aG9udzItMzIiCisJbG4gLXNmIHB5dGhvbncyLTMyICIkKERFU1RESVIpJChwcmVmaXgpL2Jpbi9weXRob253LTMyIgogZW5kaWYKIAogCkBAIC03MSw2ICs3NSw5IEBACiAJCSQoSU5TVEFMTCkgLWQgLW0gJChESVJNT0RFKSAiJChERVNURElSKSQoRlJBTUVXT1JLVU5JWFRPT0xTUFJFRklYKS9iaW4iIDtcCiAJZmkKIAlmb3IgZm4gaW4gcHl0aG9uIHB5dGhvbncgaWRsZSBweWRvYyBweXRob24tY29uZmlnIHNtdHBkLnB5IDJ0bzMgXAorCQkgIHB5dGhvbjIgcHl0aG9udzIgaWRsZTIgXAorCQkgIHB5ZG9jMiBweXRob24yLWNvbmZpZyBzbXRwZDIucHkgXAorCQkgIDJ0bzMtMiBcCiAJCSAgcHl0aG9uJChWRVJTSU9OKSBweXRob253JChWRVJTSU9OKSBpZGxlJChWRVJTSU9OKSBcCiAJCSAgcHlkb2MkKFZFUlNJT04pIHB5dGhvbiQoVkVSU0lPTiktY29uZmlnIHNtdHBkJChWRVJTSU9OKS5weSBcCiAJCSAgMnRvMy0kKFZFUlNJT04pIDtcCkBAIC03OSw2ICs4Niw3IEBACiAJZG9uZQogaWZuZXEgKCQoTElQT18zMkJJVF9GTEFHUyksKQogCWZvciBmbiBpbiBweXRob24tMzIgcHl0aG9udy0zMiBcCisJCSAgcHl0aG9uMi0zMiBweXRob253Mi0zMiBcCiAJCSAgcHl0aG9uJChWRVJTSU9OKS0zMiBweXRob253JChWRVJTSU9OKS0zMiA7XAogCWRvIFwKIAkJbG4gLWZzICIkKHByZWZpeCkvYmluLyQke2ZufSIgIiQoREVTVERJUikkKEZSQU1FV09SS1VOSVhUT09MU1BSRUZJWCkvYmluLyQke2ZufSIgO1wKQEAgLTExNywxOSArMTI1LDE4IEBACiAJCQljb250aW51ZSA7XAogCQlmaSA7XAogCQltdiAiJChERVNURElSKSQocHJlZml4KS9iaW4vJCR7Zm59IiAiJChERVNURElSKSQocHJlZml4KS9iaW4vJCR7Zm59JChWRVJTSU9OKSIgIDtcCi0JCWxuIC1zZiAiJCR7Zm59JChWRVJTSU9OKSIgIiQoREVTVERJUikkKHByZWZpeCkvYmluLyQke2ZufSIgO1wKKwkJbG4gLXNmICIkJHtmbn0kKFZFUlNJT04pIiAiJChERVNURElSKSQocHJlZml4KS9iaW4vJCR7Zm59MiIgO1wKKwkJbG4gLXNmICIkJHtmbn0yIiAiJChERVNURElSKSQocHJlZml4KS9iaW4vJCR7Zm59IiA7XAogCWRvbmUKLQlpZiBbICEgLWggIiQoREVTVERJUikkKHByZWZpeCkvYmluL3B5dGhvbi1jb25maWciIF07IHRoZW4gXAotCQltdiAiJChERVNURElSKSQocHJlZml4KS9iaW4vcHl0aG9uLWNvbmZpZyIgIiQoREVTVERJUikkKHByZWZpeCkvYmluL3B5dGhvbiQoVkVSU0lPTiktY29uZmlnIiA7XAotCQlsbiAtc2YgInB5dGhvbiQoVkVSU0lPTiktY29uZmlnIiAiJChERVNURElSKSQocHJlZml4KS9iaW4vcHl0aG9uLWNvbmZpZyIgOyBcCi0JZmkKIAlpZiBbICEgLWggIiQoREVTVERJUikkKHByZWZpeCkvYmluL3NtdHBkLnB5IiBdOyB0aGVuIFwKIAkJbXYgIiQoREVTVERJUikkKHByZWZpeCkvYmluL3NtdHBkLnB5IiAiJChERVNURElSKSQocHJlZml4KS9iaW4vc210cGQkKFZFUlNJT04pLnB5IiAgO1wKLQkJbG4gLXNmICJzbXRwZCQoVkVSU0lPTikucHkiICIkKERFU1RESVIpJChwcmVmaXgpL2Jpbi9zbXRwZC5weSIgO1wKKwkJbG4gLXNmICJzbXRwZCQoVkVSU0lPTikucHkiICIkKERFU1RESVIpJChwcmVmaXgpL2Jpbi9zbXRwZDIucHkiIDtcCisJCWxuIC1zZiAic210cGQyLnB5IiAiJChERVNURElSKSQocHJlZml4KS9iaW4vc210cGQucHkiIDtcCiAJZmkKIAlpZiBbICEgLWggIiQoREVTVERJUikkKHByZWZpeCkvYmluLzJ0bzMiIF07IHRoZW4gXAogCQltdiAiJChERVNURElSKSQocHJlZml4KS9iaW4vMnRvMyIgIiQoREVTVERJUikkKHByZWZpeCkvYmluLzJ0bzMtJChWRVJTSU9OKSIgIDtcCi0JCWxuIC1zZiAiMnRvMy0kKFZFUlNJT04pIiAiJChERVNURElSKSQocHJlZml4KS9iaW4vMnRvMyIgO1wKKwkJbG4gLXNmICIydG8zLSQoVkVSU0lPTikiICIkKERFU1RESVIpJChwcmVmaXgpL2Jpbi8ydG8zLTIiIDtcCisJCWxuIC1zZiAiMnRvMy0yIiAiJChERVNURElSKSQocHJlZml4KS9iaW4vMnRvMyIgO1wKIAlmaQogCiAKQEAgLTE5NSwxNSArMjAyLDIyIEBACiAJY2QgSURMRSAmJiBtYWtlIGluc3RhbGwKIAogaW5zdGFsbF9CdWlsZEFwcGxldDoKLQkkKFJVTlNIQVJFRCkgQEFSQ0hfUlVOXzMyQklUQCAkKEJVSUxEUFlUSE9OKSAkKHNyY2Rpcikvc2NyaXB0cy9CdWlsZEFwcGxldC5weSBcCi0JCS0tZGVzdHJvb3QgIiQoREVTVERJUikiIFwKLQkJLS1weXRob249JChwcmVmaXgpL1Jlc291cmNlcy9QeXRob24uYXBwL0NvbnRlbnRzL01hY09TL1B5dGhvbiBcCi0JCS0tb3V0cHV0ICIkKERFU1RESVIpJChQWVRIT05BUFBTRElSKS9CdWlsZCBBcHBsZXQuYXBwIiBcCi0JCSQoc3JjZGlyKS9zY3JpcHRzL0J1aWxkQXBwbGV0LnB5Ci1pZm5lcSAoJChMSVBPXzMyQklUX0ZMQUdTKSwpCi0Jcm0gIiQoREVTVERJUikkKFBZVEhPTkFQUFNESVIpL0J1aWxkIEFwcGxldC5hcHAvQ29udGVudHMvTWFjT1MvUHl0aG9uIgotCWxpcG8gJChMSVBPXzMyQklUX0ZMQUdTKSAtb3V0cHV0ICIkKERFU1RESVIpJChQWVRIT05BUFBTRElSKS9CdWlsZCBBcHBsZXQuYXBwL0NvbnRlbnRzL01hY09TL1B5dGhvbiIgJChCVUlMRFBZVEhPTikKLWVuZGlmICAgCisJaWYgISAkKFJVTlNIQVJFRCkgQEFSQ0hfUlVOXzMyQklUQCAkKEJVSUxEUFlUSE9OKSBcCisJCQktYyAnaW1wb3J0IEVhc3lEaWFsb2dzJyAyPi9kZXYvbnVsbCA7IHRoZW4gXAorCQllY2hvICJFYXN5RGlhbG9ncyBub3QgYXZhaWxhYmxlIGluIHRoaXMgUHl0aG9uIC0gc2tpcHBpbmcgQnVpbGQgQXBwbGV0LmFwcCIgOyBcCisJZWxzZSBcCisJCSQoUlVOU0hBUkVEKSBAQVJDSF9SVU5fMzJCSVRAICQoQlVJTERQWVRIT04pICQoc3JjZGlyKS9zY3JpcHRzL0J1aWxkQXBwbGV0LnB5IFwKKwkJCS0tZGVzdHJvb3QgIiQoREVTVERJUikiIFwKKwkJCS0tcHl0aG9uPSQocHJlZml4KS9SZXNvdXJjZXMvUHl0aG9uLmFwcC9Db250ZW50cy9NYWNPUy9QeXRob24gXAorCQkJLS1vdXRwdXQgIiQoREVTVERJUikkKFBZVEhPTkFQUFNESVIpL0J1aWxkIEFwcGxldC5hcHAiIFwKKwkJCSQoc3JjZGlyKS9zY3JpcHRzL0J1aWxkQXBwbGV0LnB5ICYmIFwKKwkJaWYgWyAtbiAiJChMSVBPXzMyQklUX0ZMQUdTKSIgXSA7IHRoZW4gXAorCQkJcm0gIiQoREVTVERJUikkKFBZVEhPTkFQUFNESVIpL0J1aWxkIEFwcGxldC5hcHAvQ29udGVudHMvTWFjT1MvUHl0aG9uIiAmJiBcCisJCQlsaXBvICQoTElQT18zMkJJVF9GTEFHUykgXAorCQkJCS1vdXRwdXQgIiQoREVTVERJUikkKFBZVEhPTkFQUFNESVIpL0J1aWxkIEFwcGxldC5hcHAvQ29udGVudHMvTWFjT1MvUHl0aG9uIiBcCisJCQkJJChCVUlMRFBZVEhPTikgOyBcCisJCWZpIFwKKwlmaQogCiBNQUNMSUJERVNUPSQoTElCREVTVCkvcGxhdC1tYWMKIE1BQ1RPT0xTREVTVD0kKHByZWZpeCkvTWFjL1Rvb2xzCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9jYXJib25ldnQvX0NhcmJvbkV2dG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvY2FyYm9uZXZ0L19DYXJib25FdnRtb2R1bGUuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDYyM2EzZTUuLjMwZDQwYzkKLS0tIGEvTWFjL01vZHVsZXMvY2FyYm9uZXZ0L19DYXJib25FdnRtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9jYXJib25ldnQvX0NhcmJvbkV2dG1vZHVsZS5jCkBAIC0xMDUxLDggKzEwNTEsNyBAQAogICAgIF9lcnIgPSBSZW1vdmVFdmVudEhhbmRsZXIoX3NlbGYtPm9iX2l0c2VsZik7CiAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKICAgICBfc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKLSAgICBQeV9ERUNSRUYoX3NlbGYtPm9iX2NhbGxiYWNrKTsKLSAgICBfc2VsZi0+b2JfY2FsbGJhY2sgPSBOVUxMOworICAgIFB5X0NMRUFSKF9zZWxmLT5vYl9jYWxsYmFjayk7CiAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgIF9yZXMgPSBQeV9Ob25lOwogICAgIHJldHVybiBfcmVzOwpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvY2cvQ0ZNTGF0ZUltcG9ydC5jIGIvTWFjL01vZHVsZXMvY2cvQ0ZNTGF0ZUltcG9ydC5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2NnL0NGTUxhdGVJbXBvcnQuaCBiL01hYy9Nb2R1bGVzL2NnL0NGTUxhdGVJbXBvcnQuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9jZy9DR1N0dWJMaWIuZXhwIGIvTWFjL01vZHVsZXMvY2cvQ0dTdHViTGliLmV4cApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9jZy9DR1N0dWJMaWIucmVhZG1lIGIvTWFjL01vZHVsZXMvY2cvQ0dTdHViTGliLnJlYWRtZQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9jZy9fQ0dtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2NnL19DR21vZHVsZS5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2ZtL19GbW1vZHVsZS5jIGIvTWFjL01vZHVsZXMvZm0vX0ZtbW9kdWxlLmMKaW5kZXggYWRjNDdhYS4uYzUxNmYyNCAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvZm0vX0ZtbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvZm0vX0ZtbW9kdWxlLmMKQEAgLTIsOCArMiw5IEBACiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gTW9kdWxlIF9GbSA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAogI2luY2x1ZGUgIlB5dGhvbi5oIgorI2luY2x1ZGUgPENhcmJvbi9DYXJib24uaD4KIAotI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKF9fTFA2NF9fKSAmJiAhZGVmaW5lZChNQUNfT1NfWF9WRVJTSU9OXzEwXzcpCiAKIAogI2luY2x1ZGUgInB5bWFjdG9vbGJveC5oIgpAQCAtMTYsNyArMTcsNiBAQAogICAgIH19IHdoaWxlKDApCiAKIAotI2luY2x1ZGUgPENhcmJvbi9DYXJib24uaD4KIAogCiAvKgpAQCAtMzQ3LDcgKzM0Nyw3IEBACiB2b2lkIGluaXRfRm0odm9pZCkKIHsKICAgICBQeU9iamVjdCAqbTsKLSNpZm5kZWYgX19MUDY0X18KKyNpZiAhZGVmaW5lZChfX0xQNjRfXykgJiYgIWRlZmluZWQoTUFDX09TX1hfVkVSU0lPTl8xMF83KQogICAgIFB5T2JqZWN0ICpkOwogI2VuZGlmICAvKiBfX0xQNjRfXyAqLwogCkBAIC0zNTUsNyArMzU1LDcgQEAKIAogCiAgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9GbSIsIEZtX21ldGhvZHMpOwotI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKF9fTFA2NF9fKSAmJiAhZGVmaW5lZChNQUNfT1NfWF9WRVJTSU9OXzEwXzcpCiAgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CiAgICAgRm1fRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwogICAgIGlmIChGbV9FcnJvciA9PSBOVUxMIHx8CmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9saXN0L19MaXN0bW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9saXN0L19MaXN0bW9kdWxlLmMKaW5kZXggM2Y0M2IwNi4uOWU2MzY4NiAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvbGlzdC9fTGlzdG1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2xpc3QvX0xpc3Rtb2R1bGUuYwpAQCAtNzYsOCArNzYsNyBAQAogCiBzdGF0aWMgdm9pZCBMaXN0T2JqX2RlYWxsb2MoTGlzdE9iamVjdCAqc2VsZikKIHsKLSAgICBQeV9YREVDUkVGKHNlbGYtPm9iX2xkZWZfZnVuYyk7Ci0gICAgc2VsZi0+b2JfbGRlZl9mdW5jID0gTlVMTDsKKyAgICBQeV9DTEVBUihzZWxmLT5vYl9sZGVmX2Z1bmMpOwogICAgIFNldExpc3RSZWZDb24oc2VsZi0+b2JfaXRzZWxmLCAobG9uZykwKTsKICAgICBpZiAoc2VsZi0+b2JfbXVzdF9iZV9kaXNwb3NlZCAmJiBzZWxmLT5vYl9pdHNlbGYpIExEaXNwb3NlKHNlbGYtPm9iX2l0c2VsZik7CiAgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3FkL19RZG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvcWQvX1FkbW9kdWxlLmMKaW5kZXggYzc1OTRiOS4uZDIxZjM2MSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvcWQvX1FkbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvcWQvX1FkbW9kdWxlLmMKQEAgLTMsOCArMyw5IEBACiAKICNpbmNsdWRlICJQeXRob24uaCIKIAorI2luY2x1ZGUgPENhcmJvbi9DYXJib24uaD4KIAotI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKF9fTFA2NF9fKSAmJiAhZGVmaW5lZChNQUNfT1NfWF9WRVJTSU9OXzEwXzcpCiAKICNpbmNsdWRlICJweW1hY3Rvb2xib3guaCIKIApAQCAtMTYsNyArMTcsNiBAQAogICAgIH19IHdoaWxlKDApCiAKIAotI2luY2x1ZGUgPENhcmJvbi9DYXJib24uaD4KIAogI2lmZGVmIFVTRV9UT09MQk9YX09CSkVDVF9HTFVFCiBleHRlcm4gUHlPYmplY3QgKl9HcmFmT2JqX05ldyhHcmFmUHRyKTsKQEAgLTY1NDgsNyArNjU0OCw3IEBACiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIFFkX21ldGhvZHNbXSA9IHsKLSNpZm5kZWYgX19MUDY0X18KKyNpZiAhZGVmaW5lZChfX0xQNjRfXykgJiYgIWRlZmluZWQoTUFDX09TX1hfVkVSU0lPTl8xMF83KQogICAgIHsiR2V0UG9ydCIsIChQeUNGdW5jdGlvbilRZF9HZXRQb3J0LCAxLAogICAgICBQeURvY19TVFIoIigpIC0+IChHcmFmUHRyIHBvcnQpIil9LAogICAgIHsiR3JhZkRldmljZSIsIChQeUNGdW5jdGlvbilRZF9HcmFmRGV2aWNlLCAxLApAQCAtNzA4OCw3ICs3MDg4LDcgQEAKIH07CiAKIAotI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKF9fTFA2NF9fKSAmJiAhZGVmaW5lZChNQUNfT1NfWF9WRVJTSU9OXzEwXzcpCiAKIC8qIExpa2UgQk1PYmpfTmV3LCBidXQgdGhlIG9yaWdpbmFsIGJpdG1hcCBkYXRhIHN0cnVjdHVyZSBpcyBjb3BpZWQgKGFuZAogKiogcmVsZWFzZWQgd2hlbiB0aGUgb2JqZWN0IGlzIHJlbGVhc2VkKQpAQCAtNzExMiw3ICs3MTEyLDcgQEAKIHZvaWQgaW5pdF9RZCh2b2lkKQogewogICAgIFB5T2JqZWN0ICptOwotI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKF9fTFA2NF9fKSAmJiAhZGVmaW5lZChNQUNfT1NfWF9WRVJTSU9OXzEwXzcpCiAgICAgUHlPYmplY3QgKmQ7CiAKIApAQCAtNzEyNyw3ICs3MTI3LDcgQEAKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiAgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9RZCIsIFFkX21ldGhvZHMpOwotI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKF9fTFA2NF9fKSAmJiAhZGVmaW5lZChNQUNfT1NfWF9WRVJTSU9OXzEwXzcpCiAgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CiAgICAgUWRfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwogICAgIGlmIChRZF9FcnJvciA9PSBOVUxMIHx8CmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9xZG9mZnMvX1Fkb2Zmc21vZHVsZS5jIGIvTWFjL01vZHVsZXMvcWRvZmZzL19RZG9mZnNtb2R1bGUuYwppbmRleCA2ODZlY2E0Li5lNTU2MmNiIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9xZG9mZnMvX1Fkb2Zmc21vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL3Fkb2Zmcy9fUWRvZmZzbW9kdWxlLmMKQEAgLTQsNyArNCw4IEBACiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAKIAotI2lmbmRlZiBfX0xQNjRfXworI2luY2x1ZGUgPENhcmJvbi9DYXJib24uaD4KKyNpZiAhZGVmaW5lZChfX0xQNjRfXykgJiYgIWRlZmluZWQoTUFDX09TX1hfVkVSU0lPTl8xMF83KQogCiAjaW5jbHVkZSAicHltYWN0b29sYm94LmgiCiAKQEAgLTE2LDcgKzE3LDYgQEAKICAgICB9fSB3aGlsZSgwKQogCiAKLSNpbmNsdWRlIDxDYXJib24vQ2FyYm9uLmg+CiAKICNpZmRlZiBVU0VfVE9PTEJPWF9PQkpFQ1RfR0xVRQogZXh0ZXJuIFB5T2JqZWN0ICpfR1dvcmxkT2JqX05ldyhHV29ybGRQdHIpOwpAQCAtNjM0LDcgKzYzNCw3IEBACiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIFFkb2Zmc19tZXRob2RzW10gPSB7Ci0jaWZuZGVmIF9fTFA2NF9fCisjaWYgIWRlZmluZWQoX19MUDY0X18pICYmICFkZWZpbmVkKE1BQ19PU19YX1ZFUlNJT05fMTBfNykKICAgICB7Ik5ld0dXb3JsZCIsIChQeUNGdW5jdGlvbilRZG9mZnNfTmV3R1dvcmxkLCAxLAogICAgICBQeURvY19TVFIoIihzaG9ydCBQaXhlbERlcHRoLCBSZWN0IGJvdW5kc1JlY3QsIENUYWJIYW5kbGUgY1RhYmxlLCBHREhhbmRsZSBhR0RldmljZSwgR1dvcmxkRmxhZ3MgZmxhZ3MpIC0+IChHV29ybGRQdHIgb2Zmc2NyZWVuR1dvcmxkKSIpfSwKICAgICB7IkxvY2tQaXhlbHMiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX0xvY2tQaXhlbHMsIDEsCkBAIC02OTEsNyArNjkxLDcgQEAKIHZvaWQgaW5pdF9RZG9mZnModm9pZCkKIHsKICAgICBQeU9iamVjdCAqbTsKLSNpZm5kZWYgX19MUDY0X18KKyNpZiAhZGVmaW5lZChfX0xQNjRfXykgJiYgIWRlZmluZWQoTUFDX09TX1hfVkVSU0lPTl8xMF83KQogICAgIFB5T2JqZWN0ICpkOwogCiAKQEAgLTcwMiw3ICs3MDIsNyBAQAogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKICAgICBtID0gUHlfSW5pdE1vZHVsZSgiX1Fkb2ZmcyIsIFFkb2Zmc19tZXRob2RzKTsKLSNpZm5kZWYgX19MUDY0X18KKyNpZiAhZGVmaW5lZChfX0xQNjRfXykgJiYgIWRlZmluZWQoTUFDX09TX1hfVkVSU0lPTl8xMF83KQogICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwogICAgIFFkb2Zmc19FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CiAgICAgaWYgKFFkb2Zmc19FcnJvciA9PSBOVUxMIHx8CmRpZmYgLS1naXQgYS9NYWMvUHl0aG9uTGF1bmNoZXIvRmlsZVNldHRpbmdzLmggYi9NYWMvUHl0aG9uTGF1bmNoZXIvRmlsZVNldHRpbmdzLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBkODA3YmFlLi43Yjc0YTliCi0tLSBhL01hYy9QeXRob25MYXVuY2hlci9GaWxlU2V0dGluZ3MuaAorKysgYi9NYWMvUHl0aG9uTGF1bmNoZXIvRmlsZVNldHRpbmdzLmgKQEAgLTQ1LDE4ICs0NSwxMyBAQAogKyAoaWQpZ2V0RmFjdG9yeVNldHRpbmdzRm9yRmlsZVR5cGU6IChOU1N0cmluZyAqKWZpbGV0eXBlOwogKyAoaWQpbmV3U2V0dGluZ3NGb3JGaWxlVHlwZTogKE5TU3RyaW5nICopZmlsZXR5cGU7CiAKLS8vLSAoaWQpaW5pdDsKIC0gKGlkKWluaXRGb3JGaWxlVHlwZTogKE5TU3RyaW5nICopZmlsZXR5cGU7CiAtIChpZClpbml0Rm9yRlNEZWZhdWx0RmlsZVR5cGU6IChOU1N0cmluZyAqKWZpbGV0eXBlOwogLSAoaWQpaW5pdEZvckRlZmF1bHRGaWxlVHlwZTogKE5TU3RyaW5nICopZmlsZXR5cGU7Ci0vLy0gKGlkKWluaXRXaXRoRmlsZVNldHRpbmdzOiAoRmlsZVNldHRpbmdzICopc291cmNlOwogCiAtICh2b2lkKXVwZGF0ZUZyb21Tb3VyY2U6IChpZCA8RmlsZVNldHRpbmdzU291cmNlPilzb3VyY2U7CiAtIChOU1N0cmluZyAqKWNvbW1hbmRMaW5lRm9yU2NyaXB0OiAoTlNTdHJpbmcgKilzY3JpcHQ7CiAKLS8vLSAodm9pZClhcHBseUZhY3RvcnlTZXR0aW5nc0ZvckZpbGVUeXBlOiAoTlNTdHJpbmcgKilmaWxldHlwZTsKLS8vLSAodm9pZClzYXZlRGVmYXVsdHM7Ci0vLy0gKHZvaWQpYXBwbHlVc2VyRGVmYXVsdHM6IChOU1N0cmluZyAqKWZpbGV0eXBlOwogLSAodm9pZClhcHBseVZhbHVlc0Zyb21EaWN0OiAoTlNEaWN0aW9uYXJ5ICopZGljdDsKIC0gKHZvaWQpcmVzZXQ7CiAtIChOU0FycmF5ICopIGludGVycHJldGVyczsKZGlmZiAtLWdpdCBhL01hYy9QeXRob25MYXVuY2hlci9GaWxlU2V0dGluZ3MubSBiL01hYy9QeXRob25MYXVuY2hlci9GaWxlU2V0dGluZ3MubQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDY2YjRmZGMuLjM0Mzg4NzAKLS0tIGEvTWFjL1B5dGhvbkxhdW5jaGVyL0ZpbGVTZXR0aW5ncy5tCisrKyBiL01hYy9QeXRob25MYXVuY2hlci9GaWxlU2V0dGluZ3MubQpAQCAtMTQsNyArMTQsNyBAQAogewogICAgIHN0YXRpYyBGaWxlU2V0dGluZ3MgKmZzZGVmYXVsdF9weSwgKmZzZGVmYXVsdF9weXcsICpmc2RlZmF1bHRfcHljOwogICAgIEZpbGVTZXR0aW5ncyAqKmN1cmRlZmF1bHQ7Ci0gICAgCisKICAgICBpZiAoW2ZpbGV0eXBlIGlzRXF1YWxUb1N0cmluZzogQCJQeXRob24gU2NyaXB0Il0pIHsKICAgICAgICAgY3VyZGVmYXVsdCA9ICZmc2RlZmF1bHRfcHk7CiAgICAgfSBlbHNlIGlmIChbZmlsZXR5cGUgaXNFcXVhbFRvU3RyaW5nOiBAIlB5dGhvbiBHVUkgU2NyaXB0Il0pIHsKQEAgLTM2LDcgKzM2LDcgQEAKIHsKICAgICBzdGF0aWMgRmlsZVNldHRpbmdzICpkZWZhdWx0X3B5LCAqZGVmYXVsdF9weXcsICpkZWZhdWx0X3B5YzsKICAgICBGaWxlU2V0dGluZ3MgKipjdXJkZWZhdWx0OwotICAgIAorCiAgICAgaWYgKFtmaWxldHlwZSBpc0VxdWFsVG9TdHJpbmc6IEAiUHl0aG9uIFNjcmlwdCJdKSB7CiAgICAgICAgIGN1cmRlZmF1bHQgPSAmZGVmYXVsdF9weTsKICAgICB9IGVsc2UgaWYgKFtmaWxldHlwZSBpc0VxdWFsVG9TdHJpbmc6IEAiUHl0aG9uIEdVSSBTY3JpcHQiXSkgewpAQCAtNTcsNyArNTcsNyBAQAogKyAoaWQpbmV3U2V0dGluZ3NGb3JGaWxlVHlwZTogKE5TU3RyaW5nICopZmlsZXR5cGUKIHsKICAgICBGaWxlU2V0dGluZ3MgKmN1cjsKLSAgICAKKwogICAgIGN1ciA9IFtGaWxlU2V0dGluZ3MgbmV3XTsKICAgICBbY3VyIGluaXRGb3JGaWxlVHlwZTogZmlsZXR5cGVdOwogICAgIHJldHVybiBbY3VyIHJldGFpbl07CkBAIC02Nyw3ICs2Nyw3IEBACiB7CiAgICAgc2VsZiA9IFtzdXBlciBpbml0XTsKICAgICBpZiAoIXNlbGYpIHJldHVybiBzZWxmOwotICAgIAorCiAgICAgaW50ZXJwcmV0ZXIgPSBbc291cmNlLT5pbnRlcnByZXRlciByZXRhaW5dOwogICAgIGhvbm91cmhhc2hiYW5nID0gc291cmNlLT5ob25vdXJoYXNoYmFuZzsKICAgICBkZWJ1ZyA9IHNvdXJjZS0+ZGVidWc7CkBAIC04MSwzNiArODEsMzAgQEAKICAgICB3aXRoX3Rlcm1pbmFsID0gc291cmNlLT53aXRoX3Rlcm1pbmFsOwogICAgIHByZWZza2V5ID0gc291cmNlLT5wcmVmc2tleTsKICAgICBpZiAocHJlZnNrZXkpIFtwcmVmc2tleSByZXRhaW5dOwotICAgIAorCiAgICAgcmV0dXJuIHNlbGY7CiB9CiAKIC0gKGlkKWluaXRGb3JGaWxlVHlwZTogKE5TU3RyaW5nICopZmlsZXR5cGUKIHsKICAgICBGaWxlU2V0dGluZ3MgKmRlZmF1bHRzOwotICAgIAorCiAgICAgZGVmYXVsdHMgPSBbRmlsZVNldHRpbmdzIGdldERlZmF1bHRzRm9yRmlsZVR5cGU6IGZpbGV0eXBlXTsKICAgICBzZWxmID0gW3NlbGYgaW5pdFdpdGhGaWxlU2V0dGluZ3M6IGRlZmF1bHRzXTsKICAgICBvcmlnc291cmNlID0gW2RlZmF1bHRzIHJldGFpbl07CiAgICAgcmV0dXJuIHNlbGY7CiB9CiAKLS8vLSAoaWQpaW5pdAotLy97Ci0vLyAgICBzZWxmID0gW3NlbGYgaW5pdEZvckZpbGVUeXBlOiBAIlB5dGhvbiBTY3JpcHQiXTsKLS8vICAgIHJldHVybiBzZWxmOwotLy99Ci0KIC0gKGlkKWluaXRGb3JGU0RlZmF1bHRGaWxlVHlwZTogKE5TU3RyaW5nICopZmlsZXR5cGUKIHsKICAgICBpbnQgaTsKICAgICBOU1N0cmluZyAqZmlsZW5hbWU7CiAgICAgTlNEaWN0aW9uYXJ5ICpkaWN0OwogICAgIHN0YXRpYyBOU0RpY3Rpb25hcnkgKmZhY3RvcnlTZXR0aW5nczsKLSAgICAKKwogICAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CiAgICAgaWYgKCFzZWxmKSByZXR1cm4gc2VsZjsKLSAgICAKKwogICAgIGlmIChmYWN0b3J5U2V0dGluZ3MgPT0gTlVMTCkgewogICAgICAgICBOU0J1bmRsZSAqYmRsID0gW05TQnVuZGxlIG1haW5CdW5kbGVdOwogICAgICAgICBOU1N0cmluZyAqcGF0aCA9IFsgYmRsIHBhdGhGb3JSZXNvdXJjZTogQCJmYWN0b3J5U2V0dGluZ3MiCkBAIC0xNDksMTggKzE0MywxOCBAQAogewogICAgIE5TVXNlckRlZmF1bHRzICpkZWZhdWx0czsKICAgICBOU0RpY3Rpb25hcnkgKmRpY3Q7Ci0gICAgCisKICAgICBkZWZhdWx0cyA9IFtOU1VzZXJEZWZhdWx0cyBzdGFuZGFyZFVzZXJEZWZhdWx0c107CiAgICAgZGljdCA9IFtkZWZhdWx0cyBkaWN0aW9uYXJ5Rm9yS2V5OiBmaWxldHlwZV07CiAgICAgaWYgKCFkaWN0KQogICAgICAgICByZXR1cm47CiAgICAgW3NlbGYgYXBwbHlWYWx1ZXNGcm9tRGljdDogZGljdF07CiB9Ci0gICAgCisKIC0gKGlkKWluaXRGb3JEZWZhdWx0RmlsZVR5cGU6IChOU1N0cmluZyAqKWZpbGV0eXBlCiB7CiAgICAgRmlsZVNldHRpbmdzICpmc2RlZmF1bHRzOwotICAgIAorCiAgICAgZnNkZWZhdWx0cyA9IFtGaWxlU2V0dGluZ3MgZ2V0RmFjdG9yeVNldHRpbmdzRm9yRmlsZVR5cGU6IGZpbGV0eXBlXTsKICAgICBzZWxmID0gW3NlbGYgaW5pdFdpdGhGaWxlU2V0dGluZ3M6IGZzZGVmYXVsdHNdOwogICAgIGlmICghc2VsZikgcmV0dXJuIHNlbGY7CkBAIC0yMjAsNyArMjE0LDcgQEAKIC0gKHZvaWQpYXBwbHlWYWx1ZXNGcm9tRGljdDogKE5TRGljdGlvbmFyeSAqKWRpY3QKIHsKICAgICBpZCB2YWx1ZTsKLSAgICAKKwogICAgIHZhbHVlID0gW2RpY3Qgb2JqZWN0Rm9yS2V5OiBAImludGVycHJldGVyIl07CiAgICAgaWYgKHZhbHVlKSBpbnRlcnByZXRlciA9IFt2YWx1ZSByZXRhaW5dOwogICAgIHZhbHVlID0gW2RpY3Qgb2JqZWN0Rm9yS2V5OiBAImhvbm91cmhhc2hiYW5nIl07CkBAIC0yNDcsMTIgKzI0MSwxMiBAQAogCiAtIChOU1N0cmluZyopX3JlcGxhY2VTaW5nbGVRdW90ZXM6IChOU1N0cmluZyopc3RyaW5nCiB7Ci0JLyogUmVwbGFjZSBhbGwgc2luZ2xlLXF1b3RlcyBieSAnIiciJywgdGhhdCB3YXkgc2hlbGxxdW90aW5nIHdpbGwKLQkgKiBiZSBjb3JyZWN0IHdoZW4gdGhlIHJlc3VsdCB2YWx1ZSBpcyBkZWxpbWl0ZWQgIHVzaW5nIHNpbmdsZSBxdW90ZXMuCi0JICovCi0JTlNBcnJheSogY29tcG9uZW50cyA9IFtzdHJpbmcgY29tcG9uZW50c1NlcGFyYXRlZEJ5U3RyaW5nOkAiJyJdOworICAgIC8qIFJlcGxhY2UgYWxsIHNpbmdsZS1xdW90ZXMgYnkgJyInIicsIHRoYXQgd2F5IHNoZWxscXVvdGluZyB3aWxsCisgICAgICogYmUgY29ycmVjdCB3aGVuIHRoZSByZXN1bHQgdmFsdWUgaXMgZGVsaW1pdGVkICB1c2luZyBzaW5nbGUgcXVvdGVzLgorICAgICAqLworICAgIE5TQXJyYXkqIGNvbXBvbmVudHMgPSBbc3RyaW5nIGNvbXBvbmVudHNTZXBhcmF0ZWRCeVN0cmluZzpAIiciXTsKIAotCXJldHVybiBbY29tcG9uZW50cyBjb21wb25lbnRzSm9pbmVkQnlTdHJpbmc6QCInXCInXCInIl07CisgICAgcmV0dXJuIFtjb21wb25lbnRzIGNvbXBvbmVudHNKb2luZWRCeVN0cmluZzpAIidcIidcIiciXTsKIH0KIAogLSAoTlNTdHJpbmcgKiljb21tYW5kTGluZUZvclNjcmlwdDogKE5TU3RyaW5nICopc2NyaXB0CkBAIC0yNjUsNyArMjU5LDcgQEAKIAogICAgIHNjcmlwdF9kaXIgPSBbc2NyaXB0IHN1YnN0cmluZ1RvSW5kZXg6CiAJICAgIFtzY3JpcHQgbGVuZ3RoXS1bW3NjcmlwdCBsYXN0UGF0aENvbXBvbmVudF0gbGVuZ3RoXV07Ci0gICAgCisKICAgICBpZiAoaG9ub3VyaGFzaGJhbmcgJiYKICAgICAgICAoZnA9Zm9wZW4oW3NjcmlwdCBmaWxlU3lzdGVtUmVwcmVzZW50YXRpb25dLCAiciIpKSAmJgogICAgICAgIGZnZXRzKGhhc2hiYW5nYnVmLCBzaXplb2YoaGFzaGJhbmdidWYpLCBmcCkgJiYKQEAgLTI3OCw3ICsyNzIsNyBAQAogICAgIH0KICAgICBpZiAoIWN1cl9pbnRlcnApCiAgICAgICAgIGN1cl9pbnRlcnAgPSBpbnRlcnByZXRlcjsKLSAgICAgICAgCisKICAgICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6CiAgICAgICAgIEAiY2QgJyVAJyAmJiAnJUAnJXMlcyVzJXMlcyVzICVAICclQCcgJUAgJXMiLAogICAgIAlbc2VsZiBfcmVwbGFjZVNpbmdsZVF1b3RlczpzY3JpcHRfZGlyXSwKQEAgLTI5Nyw3ICsyOTEsNyBAQAogCiAtIChOU0FycmF5ICopIGludGVycHJldGVycyB7IHJldHVybiBpbnRlcnByZXRlcnM7fTsKIAotLy8gRmlsZVNldHRpbmdzU291cmNlIHByb3RvY29sIAorLy8gRmlsZVNldHRpbmdzU291cmNlIHByb3RvY29sCiAtIChOU1N0cmluZyAqKSBpbnRlcnByZXRlciB7IHJldHVybiBpbnRlcnByZXRlcjt9OwogLSAoQk9PTCkgaG9ub3VyaGFzaGJhbmcgeyByZXR1cm4gaG9ub3VyaGFzaGJhbmc7IH07CiAtIChCT09MKSBkZWJ1ZyB7IHJldHVybiBkZWJ1Zzt9OwpkaWZmIC0tZ2l0IGEvTWFjL1B5dGhvbkxhdW5jaGVyL0luZm8ucGxpc3QuaW4gYi9NYWMvUHl0aG9uTGF1bmNoZXIvSW5mby5wbGlzdC5pbgppbmRleCA0MzlmOGI4Li4wYTVhNDM5IDEwMDY0NAotLS0gYS9NYWMvUHl0aG9uTGF1bmNoZXIvSW5mby5wbGlzdC5pbgorKysgYi9NYWMvUHl0aG9uTGF1bmNoZXIvSW5mby5wbGlzdC5pbgpAQCAtNDAsNyArNDAsNyBAQAogCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CiAJPHN0cmluZz5QeXRob25MYXVuY2hlcjwvc3RyaW5nPgogCTxrZXk+Q0ZCdW5kbGVHZXRJbmZvU3RyaW5nPC9rZXk+Ci0JPHN0cmluZz4lVkVSU0lPTiUsIMKpIDIwMDEtMjAxMSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbjwvc3RyaW5nPgorCTxzdHJpbmc+JVZFUlNJT04lLCDCqSAyMDAxLTIwMTQgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb248L3N0cmluZz4KIAk8a2V5PkNGQnVuZGxlSWNvbkZpbGU8L2tleT4KIAk8c3RyaW5nPlB5dGhvbkxhdW5jaGVyLmljbnM8L3N0cmluZz4KIAk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgpkaWZmIC0tZ2l0IGEvTWFjL1B5dGhvbkxhdW5jaGVyL015QXBwRGVsZWdhdGUubSBiL01hYy9QeXRob25MYXVuY2hlci9NeUFwcERlbGVnYXRlLm0KaW5kZXggYTViYTc1MS4uZTc1ZmIwNiAxMDA2NDQKLS0tIGEvTWFjL1B5dGhvbkxhdW5jaGVyL015QXBwRGVsZWdhdGUubQorKysgYi9NYWMvUHl0aG9uTGF1bmNoZXIvTXlBcHBEZWxlZ2F0ZS5tCkBAIC0zMyw3ICszMyw3IEBACiAKIC0gKEJPT0wpc2hvdWxkU2hvd1VJCiB7Ci0gICAgLy8gaWYgdGhpcyBjYWxsIGNvbWVzIGJlZm9yZSBhcHBsaWNhdGlvbkRpZEZpbmlzaExhdW5jaGluZzogd2UgCisgICAgLy8gaWYgdGhpcyBjYWxsIGNvbWVzIGJlZm9yZSBhcHBsaWNhdGlvbkRpZEZpbmlzaExhdW5jaGluZzogd2UKICAgICAvLyBzaG91bGQgdGVybWluYXRlIGltbWVkZWF0ZWx5IGFmdGVyIHN0YXJ0aW5nIHRoZSBzY3JpcHQuCiAgICAgaWYgKCFpbml0aWFsX2FjdGlvbl9kb25lKQogICAgICAgICBzaG91bGRfdGVybWluYXRlID0gWUVTOwpAQCAtNjIsNyArNjIsNyBAQAogICAgIHN0YXRpYyBOU1N0cmluZyAqZXh0ZW5zaW9uc1tdID0geyBAInB5IiwgQCJweXciLCBAInB5YyIsIE5VTEx9OwogICAgIE5TU3RyaW5nICoqZXh0X3A7CiAgICAgaW50IGk7Ci0gICAgCisKICAgICBpZiAoW1tOU1VzZXJEZWZhdWx0cyBzdGFuZGFyZFVzZXJEZWZhdWx0c10gYm9vbEZvcktleTogQCJTa2lwRmlsZUJpbmRpbmdUZXN0Il0pCiAgICAgICAgIHJldHVybjsKICAgICBvdXJVcmwgPSBbTlNVUkwgZmlsZVVSTFdpdGhQYXRoOiBbW05TQnVuZGxlIG1haW5CdW5kbGVdIGJ1bmRsZVBhdGhdXTsKQEAgLTkyLDUgKzkyLDUgQEAKICAgICAgICAgfQogICAgIH0KIH0KLSAgICAgICAgCisKIEBlbmQKZGlmZiAtLWdpdCBhL01hYy9QeXRob25MYXVuY2hlci9NeURvY3VtZW50LmggYi9NYWMvUHl0aG9uTGF1bmNoZXIvTXlEb2N1bWVudC5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL01hYy9QeXRob25MYXVuY2hlci9NeURvY3VtZW50Lm0gYi9NYWMvUHl0aG9uTGF1bmNoZXIvTXlEb2N1bWVudC5tCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggODYxMTJjNC4uOTBjNWRiOQotLS0gYS9NYWMvUHl0aG9uTGF1bmNoZXIvTXlEb2N1bWVudC5tCisrKyBiL01hYy9QeXRob25MYXVuY2hlci9NeURvY3VtZW50Lm0KQEAgLTE2LDcgKzE2LDcgQEAKIHsKICAgICBzZWxmID0gW3N1cGVyIGluaXRdOwogICAgIGlmIChzZWxmKSB7Ci0gICAgCisKICAgICAgICAgLy8gQWRkIHlvdXIgc3ViY2xhc3Mtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gaGVyZS4KICAgICAgICAgLy8gSWYgYW4gZXJyb3Igb2NjdXJzIGhlcmUsIHNlbmQgYSBbc2VsZiBkZWFsbG9jXSBtZXNzYWdlIGFuZCByZXR1cm4gbmlsLgogICAgICAgICBzY3JpcHQgPSBbQCI8bm8gc2NyaXB0Pi5weSIgcmV0YWluXTsKQEAgLTM3LDIwICszNywxNyBAQAogewogICAgIE5TQXBwbGljYXRpb24gKmFwcCA9IFtOU0FwcGxpY2F0aW9uIHNoYXJlZEFwcGxpY2F0aW9uXTsKICAgICBbc3VwZXIgY2xvc2VdOwotICAgIGlmIChbW2FwcCBkZWxlZ2F0ZV0gc2hvdWxkVGVybWluYXRlXSkKKyAgICBpZiAoWyhNeUFwcERlbGVnYXRlKilbYXBwIGRlbGVnYXRlXSBzaG91bGRUZXJtaW5hdGVdKQogICAgICAgICBbYXBwIHRlcm1pbmF0ZTogc2VsZl07CiB9CiAKIC0gKHZvaWQpbG9hZF9kZWZhdWx0cwogewotLy8gICAgaWYgKHNldHRpbmdzKSBbc2V0dGluZ3MgcmVsZWFzZV07CiAgICAgc2V0dGluZ3MgPSBbRmlsZVNldHRpbmdzIG5ld1NldHRpbmdzRm9yRmlsZVR5cGU6IGZpbGV0eXBlXTsKIH0KIAogLSAodm9pZCl1cGRhdGVfZGlzcGxheQogewotLy8gICAgW1tzZWxmIHdpbmRvd10gc2V0VGl0bGU6IHNjcmlwdF07Ci0gICAgCiAgICAgW2ludGVycHJldGVyIHNldFN0cmluZ1ZhbHVlOiBbc2V0dGluZ3MgaW50ZXJwcmV0ZXJdXTsKICAgICBbaG9ub3VyaGFzaGJhbmcgc2V0U3RhdGU6IFtzZXR0aW5ncyBob25vdXJoYXNoYmFuZ11dOwogICAgIFtkZWJ1ZyBzZXRTdGF0ZTogW3NldHRpbmdzIGRlYnVnXV07CkBAIC02Miw3ICs1OSw3IEBACiAgICAgW290aGVycyBzZXRTdHJpbmdWYWx1ZTogW3NldHRpbmdzIG90aGVyc11dOwogICAgIFtzY3JpcHRhcmdzIHNldFN0cmluZ1ZhbHVlOiBbc2V0dGluZ3Mgc2NyaXB0YXJnc11dOwogICAgIFt3aXRoX3Rlcm1pbmFsIHNldFN0YXRlOiBbc2V0dGluZ3Mgd2l0aF90ZXJtaW5hbF1dOwotICAgIAorCiAgICAgW2NvbW1hbmRsaW5lIHNldFN0cmluZ1ZhbHVlOiBbc2V0dGluZ3MgY29tbWFuZExpbmVGb3JTY3JpcHQ6IHNjcmlwdF1dOwogfQogCkBAIC03NSw4ICs3Miw4IEBACiB7CiAgICAgY29uc3QgY2hhciAqY21kbGluZTsKICAgICBpbnQgc3RzOwotICAgIAotICAgICBjbWRsaW5lID0gW1tzZXR0aW5ncyBjb21tYW5kTGluZUZvclNjcmlwdDogc2NyaXB0XSBjU3RyaW5nXTsKKworICAgICBjbWRsaW5lID0gW1tzZXR0aW5ncyBjb21tYW5kTGluZUZvclNjcmlwdDogc2NyaXB0XSBVVEY4U3RyaW5nXTsKICAgIGlmIChbc2V0dGluZ3Mgd2l0aF90ZXJtaW5hbF0pIHsKICAgICAgICAgc3RzID0gZG9zY3JpcHQoY21kbGluZSk7CiAgICAgfSBlbHNlIHsKQEAgLTEwNywxNCArMTA0LDEzIEBACiB7CiAgICAgLy8gSW5zZXJ0IGNvZGUgaGVyZSB0byByZWFkIHlvdXIgZG9jdW1lbnQgZnJvbSB0aGUgZ2l2ZW4gZGF0YS4gIFlvdSBjYW4gYWxzbyBjaG9vc2UgdG8gb3ZlcnJpZGUgLWxvYWRGaWxlV3JhcHBlclJlcHJlc2VudGF0aW9uOm9mVHlwZTogb3IgLXJlYWRGcm9tRmlsZTpvZlR5cGU6IGluc3RlYWQuCiAgICAgQk9PTCBzaG93X3VpOwotICAgIAotICAgIC8vIGFzayB0aGUgYXBwIGRlbGVnYXRlIHdoZXRoZXIgd2Ugc2hvdWxkIHNob3cgdGhlIFVJIG9yIG5vdC4gCi0gICAgc2hvd191aSA9IFtbW05TQXBwbGljYXRpb24gc2hhcmVkQXBwbGljYXRpb25dIGRlbGVnYXRlXSBzaG91bGRTaG93VUldOworCisgICAgLy8gYXNrIHRoZSBhcHAgZGVsZWdhdGUgd2hldGhlciB3ZSBzaG91bGQgc2hvdyB0aGUgVUkgb3Igbm90LgorICAgIHNob3dfdWkgPSBbKE15QXBwRGVsZWdhdGUqKVtbTlNBcHBsaWNhdGlvbiBzaGFyZWRBcHBsaWNhdGlvbl0gZGVsZWdhdGVdIHNob3VsZFNob3dVSV07CiAgICAgW3NjcmlwdCByZWxlYXNlXTsKICAgICBzY3JpcHQgPSBbZmlsZU5hbWUgcmV0YWluXTsKICAgICBbZmlsZXR5cGUgcmVsZWFzZV07CiAgICAgZmlsZXR5cGUgPSBbdHlwZSByZXRhaW5dOwotLy8gICAgaWYgKHNldHRpbmdzKSBbc2V0dGluZ3MgcmVsZWFzZV07CiAgICAgc2V0dGluZ3MgPSBbRmlsZVNldHRpbmdzIG5ld1NldHRpbmdzRm9yRmlsZVR5cGU6IGZpbGV0eXBlXTsKICAgICBpZiAoc2hvd191aSkgewogICAgICAgICBbc2VsZiB1cGRhdGVfZGlzcGxheV07CkBAIC0xNTIsNyArMTQ4LDcgQEAKICAgICBbc2VsZiB1cGRhdGVfZGlzcGxheV07CiB9CiAKLS8vIEZpbGVTZXR0aW5nc1NvdXJjZSBwcm90b2NvbCAKKy8vIEZpbGVTZXR0aW5nc1NvdXJjZSBwcm90b2NvbAogLSAoTlNTdHJpbmcgKikgaW50ZXJwcmV0ZXIgeyByZXR1cm4gW2ludGVycHJldGVyIHN0cmluZ1ZhbHVlXTt9OwogLSAoQk9PTCkgaG9ub3VyaGFzaGJhbmcgeyByZXR1cm4gW2hvbm91cmhhc2hiYW5nIHN0YXRlXTt9OwogLSAoQk9PTCkgZGVidWcgeyByZXR1cm4gW2RlYnVnIHN0YXRlXTt9OwpkaWZmIC0tZ2l0IGEvTWFjL1B5dGhvbkxhdW5jaGVyL1ByZWZlcmVuY2VzV2luZG93Q29udHJvbGxlci5tIGIvTWFjL1B5dGhvbkxhdW5jaGVyL1ByZWZlcmVuY2VzV2luZG93Q29udHJvbGxlci5tCmluZGV4IDMxMWMzNzUuLmVjNWJiZTggMTAwNjQ0Ci0tLSBhL01hYy9QeXRob25MYXVuY2hlci9QcmVmZXJlbmNlc1dpbmRvd0NvbnRyb2xsZXIubQorKysgYi9NYWMvUHl0aG9uTGF1bmNoZXIvUHJlZmVyZW5jZXNXaW5kb3dDb250cm9sbGVyLm0KQEAgLTUsNyArNSw3IEBACiArIGdldFByZWZlcmVuY2VzV2luZG93CiB7CiAgICAgc3RhdGljIFByZWZlcmVuY2VzV2luZG93Q29udHJvbGxlciAqX3NpbmdsZXRvbjsKLSAgICAKKwogICAgIGlmICghX3NpbmdsZXRvbikKICAgICAgICAgX3NpbmdsZXRvbiA9IFtbUHJlZmVyZW5jZXNXaW5kb3dDb250cm9sbGVyIGFsbG9jXSBpbml0XTsKICAgICBbX3NpbmdsZXRvbiBzaG93V2luZG93OiBfc2luZ2xldG9uXTsKQEAgLTIxLDE1ICsyMSwxMyBAQAogLSAodm9pZClsb2FkX2RlZmF1bHRzCiB7CiAgICAgTlNTdHJpbmcgKnRpdGxlID0gW2ZpbGV0eXBlIHRpdGxlT2ZTZWxlY3RlZEl0ZW1dOwotICAgIAorCiAgICAgc2V0dGluZ3MgPSBbRmlsZVNldHRpbmdzIGdldERlZmF1bHRzRm9yRmlsZVR5cGU6IHRpdGxlXTsKIH0KIAogLSAodm9pZCl1cGRhdGVfZGlzcGxheQogewotLy8gICAgW1tzZWxmIHdpbmRvd10gc2V0VGl0bGU6IHNjcmlwdF07Ci0gICAgCi0JW2ludGVycHJldGVyIHJlbG9hZERhdGFdOworICAgIFtpbnRlcnByZXRlciByZWxvYWREYXRhXTsKICAgICBbaW50ZXJwcmV0ZXIgc2V0U3RyaW5nVmFsdWU6IFtzZXR0aW5ncyBpbnRlcnByZXRlcl1dOwogICAgIFtob25vdXJoYXNoYmFuZyBzZXRTdGF0ZTogW3NldHRpbmdzIGhvbm91cmhhc2hiYW5nXV07CiAgICAgW2RlYnVnIHNldFN0YXRlOiBbc2V0dGluZ3MgZGVidWddXTsKQEAgLTQxLDcgKzM5LDYgQEAKICAgICBbb3RoZXJzIHNldFN0cmluZ1ZhbHVlOiBbc2V0dGluZ3Mgb3RoZXJzXV07CiAgICAgW3dpdGhfdGVybWluYWwgc2V0U3RhdGU6IFtzZXR0aW5ncyB3aXRoX3Rlcm1pbmFsXV07CiAgICAgLy8gTm90IHNjcmlwdGFyZ3MsIGl0IGlzbid0IGZvciBwcmVmZXJlbmNlcwotICAgIAogICAgIFtjb21tYW5kbGluZSBzZXRTdHJpbmdWYWx1ZTogW3NldHRpbmdzIGNvbW1hbmRMaW5lRm9yU2NyaXB0OiBAIjx5b3VyIHNjcmlwdCBoZXJlPiJdXTsKIH0KIApAQCAtNzUsNyArNzIsNyBAQAogICAgIFtzZWxmIHVwZGF0ZV9kaXNwbGF5XTsKIH0KIAotLy8gRmlsZVNldHRpbmdzU291cmNlIHByb3RvY29sIAorLy8gRmlsZVNldHRpbmdzU291cmNlIHByb3RvY29sCiAtIChOU1N0cmluZyAqKSBpbnRlcnByZXRlciB7IHJldHVybiBbaW50ZXJwcmV0ZXIgc3RyaW5nVmFsdWVdO307CiAtIChCT09MKSBob25vdXJoYXNoYmFuZyB7IHJldHVybiBbaG9ub3VyaGFzaGJhbmcgc3RhdGVdOyB9OwogLSAoQk9PTCkgZGVidWcgeyByZXR1cm4gW2RlYnVnIHN0YXRlXTt9OwpAQCAtOTgsMjMgKzk1LDIzIEBACiAvLyBOU0NvbWJvQm94RGF0YVNvdXJjZSBwcm90b2NvbAogLSAodW5zaWduZWQgaW50KWNvbWJvQm94OihOU0NvbWJvQm94ICopYUNvbWJvQm94IGluZGV4T2ZJdGVtV2l0aFN0cmluZ1ZhbHVlOihOU1N0cmluZyAqKWFTdHJpbmcKIHsKLQlOU0FycmF5ICppbnRlcnBfbGlzdCA9IFtzZXR0aW5ncyBpbnRlcnByZXRlcnNdOworICAgIE5TQXJyYXkgKmludGVycF9saXN0ID0gW3NldHRpbmdzIGludGVycHJldGVyc107CiAgICAgdW5zaWduZWQgaW50IHJ2ID0gW2ludGVycF9saXN0IGluZGV4T2ZPYmplY3RJZGVudGljYWxUbzogYVN0cmluZ107Ci0JcmV0dXJuIHJ2OworICAgIHJldHVybiBydjsKIH0KIAogLSAoaWQpY29tYm9Cb3g6KE5TQ29tYm9Cb3ggKilhQ29tYm9Cb3ggb2JqZWN0VmFsdWVGb3JJdGVtQXRJbmRleDooaW50KWluZGV4CiB7Ci0JTlNBcnJheSAqaW50ZXJwX2xpc3QgPSBbc2V0dGluZ3MgaW50ZXJwcmV0ZXJzXTsKKyAgICBOU0FycmF5ICppbnRlcnBfbGlzdCA9IFtzZXR0aW5ncyBpbnRlcnByZXRlcnNdOwogICAgIGlkIHJ2ID0gW2ludGVycF9saXN0IG9iamVjdEF0SW5kZXg6IGluZGV4XTsKLQlyZXR1cm4gcnY7CisgICAgcmV0dXJuIHJ2OwogfQogCiAtIChpbnQpbnVtYmVyT2ZJdGVtc0luQ29tYm9Cb3g6KE5TQ29tYm9Cb3ggKilhQ29tYm9Cb3gKIHsKLQlOU0FycmF5ICppbnRlcnBfbGlzdCA9IFtzZXR0aW5ncyBpbnRlcnByZXRlcnNdOworICAgIE5TQXJyYXkgKmludGVycF9saXN0ID0gW3NldHRpbmdzIGludGVycHJldGVyc107CiAgICAgaW50IHJ2ID0gW2ludGVycF9saXN0IGNvdW50XTsKLQlyZXR1cm4gcnY7CisgICAgcmV0dXJuIHJ2OwogfQogCiAKZGlmZiAtLWdpdCBhL01hYy9QeXRob25MYXVuY2hlci9kb3NjcmlwdC5oIGIvTWFjL1B5dGhvbkxhdW5jaGVyL2Rvc2NyaXB0LmgKaW5kZXggZWVmMGI1Ni4uM2ZkMzE4NyAxMDA2NDQKLS0tIGEvTWFjL1B5dGhvbkxhdW5jaGVyL2Rvc2NyaXB0LmgKKysrIGIvTWFjL1B5dGhvbkxhdW5jaGVyL2Rvc2NyaXB0LmgKQEAgLTksNCArOSw0IEBACiAKICNpbmNsdWRlIDxDYXJib24vQ2FyYm9uLmg+CiAKLWV4dGVybiBpbnQgZG9zY3JpcHQoY29uc3QgY2hhciAqY29tbWFuZCk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZXh0ZXJuIGludCBkb3NjcmlwdChjb25zdCBjaGFyICpjb21tYW5kKTsKZGlmZiAtLWdpdCBhL01hYy9QeXRob25MYXVuY2hlci9kb3NjcmlwdC5tIGIvTWFjL1B5dGhvbkxhdW5jaGVyL2Rvc2NyaXB0Lm0KaW5kZXggMDI0Yjg4My4uY2JiNzgzYiAxMDA2NDQKLS0tIGEvTWFjL1B5dGhvbkxhdW5jaGVyL2Rvc2NyaXB0Lm0KKysrIGIvTWFjL1B5dGhvbkxhdW5jaGVyL2Rvc2NyaXB0Lm0KQEAgLTExLDQ5ICsxMSw0OSBAQAogI2ltcG9ydCA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+CiAjaW1wb3J0ICJkb3NjcmlwdC5oIgogCi1leHRlcm4gaW50IAorZXh0ZXJuIGludAogZG9zY3JpcHQoY29uc3QgY2hhciAqY29tbWFuZCkKIHsKLQljaGFyICpidW5kbGVJRCA9ICJjb20uYXBwbGUuVGVybWluYWwiOwotCUFwcGxlRXZlbnQgZXZ0LCByZXM7Ci0JQUVEZXNjIGRlc2M7Ci0JT1NTdGF0dXMgZXJyOworICAgIGNoYXIgKmJ1bmRsZUlEID0gImNvbS5hcHBsZS5UZXJtaW5hbCI7CisgICAgQXBwbGVFdmVudCBldnQsIHJlczsKKyAgICBBRURlc2MgZGVzYzsKKyAgICBPU1N0YXR1cyBlcnI7CiAKLQlbW05TV29ya3NwYWNlIHNoYXJlZFdvcmtzcGFjZV0gbGF1bmNoQXBwbGljYXRpb246QCIvQXBwbGljYXRpb25zL1V0aWxpdGllcy9UZXJtaW5hbC5hcHAvIl07CisgICAgW1tOU1dvcmtzcGFjZSBzaGFyZWRXb3Jrc3BhY2VdIGxhdW5jaEFwcGxpY2F0aW9uOkAiL0FwcGxpY2F0aW9ucy9VdGlsaXRpZXMvVGVybWluYWwuYXBwLyJdOwogCi0JLy8gQnVpbGQgZXZlbnQKLQllcnIgPSBBRUJ1aWxkQXBwbGVFdmVudChrQUVDb3JlU3VpdGUsIGtBRURvU2NyaXB0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQXBwbGljYXRpb25CdW5kbGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlSUQsIHN0cmxlbihidW5kbGVJRCksCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGtBdXRvR2VuZXJhdGVSZXR1cm5JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAga0FueVRyYW5zYWN0aW9uSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZldnQsIE5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICInLS0tLSc6dXRmOChAKSIsIHN0cmxlbihjb21tYW5kKSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCk7Ci0JaWYgKGVycikgewotCQlOU0xvZyhAIkFFQnVpbGRBcHBsZUV2ZW50IGZhaWxlZDogJWRcbiIsIGVycik7Ci0JCXJldHVybiBlcnI7Ci0JfQorICAgIC8vIEJ1aWxkIGV2ZW50CisgICAgZXJyID0gQUVCdWlsZEFwcGxlRXZlbnQoa0FFQ29yZVN1aXRlLCBrQUVEb1NjcmlwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFwcGxpY2F0aW9uQnVuZGxlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZUlELCBzdHJsZW4oYnVuZGxlSUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQXV0b0dlbmVyYXRlUmV0dXJuSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBbnlUcmFuc2FjdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZ0LCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJy0tLS0nOnV0ZjgoQCkiLCBzdHJsZW4oY29tbWFuZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQpOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgTlNMb2coQCJBRUJ1aWxkQXBwbGVFdmVudCBmYWlsZWQ6ICVsZFxuIiwgKGxvbmcpZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CiAKLQkvLyBTZW5kIGV2ZW50IGFuZCBjaGVjayBmb3IgYW55IEFwcGxlIEV2ZW50IE1hbmFnZXIgZXJyb3JzCi0JZXJyID0gQUVTZW5kTWVzc2FnZSgmZXZ0LCAmcmVzLCBrQUVXYWl0UmVwbHksIGtBRURlZmF1bHRUaW1lb3V0KTsKLQlBRURpc3Bvc2VEZXNjKCZldnQpOwotCWlmIChlcnIpIHsKLQkJTlNMb2coQCJBRVNlbmRNZXNzYWdlIGZhaWxlZDogJWRcbiIsIGVycik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCS8vIENoZWNrIGZvciBhbnkgYXBwbGljYXRpb24gZXJyb3JzCi0JZXJyID0gQUVHZXRQYXJhbURlc2MoJnJlcywga2V5RXJyb3JOdW1iZXIsIHR5cGVTSW50MzIsICZkZXNjKTsKLQlBRURpc3Bvc2VEZXNjKCZyZXMpOwotCWlmICghZXJyKSB7Ci0JCUFFR2V0RGVzY0RhdGEoJmRlc2MsICZlcnIsIHNpemVvZihlcnIpKTsKLQkJTlNMb2coQCJUZXJtaW5hbCByZXR1cm5lZCBhbiBlcnJvcjogJWQiLCBlcnIpOwotCQlBRURpc3Bvc2VEZXNjKCZkZXNjKTsKLQl9IGVsc2UgaWYgKGVyciA9PSBlcnJBRURlc2NOb3RGb3VuZCkgewotCQllcnIgPSBub0VycjsKLQl9IGVsc2UgewotCQlOU0xvZyhAIkFFR2V0UEFybURlc2MgcmV0dXJuZWQgYW4gZXJyb3I6ICVkIiwgZXJyKTsKLQl9CisgICAgLy8gU2VuZCBldmVudCBhbmQgY2hlY2sgZm9yIGFueSBBcHBsZSBFdmVudCBNYW5hZ2VyIGVycm9ycworICAgIGVyciA9IEFFU2VuZE1lc3NhZ2UoJmV2dCwgJnJlcywga0FFV2FpdFJlcGx5LCBrQUVEZWZhdWx0VGltZW91dCk7CisgICAgQUVEaXNwb3NlRGVzYygmZXZ0KTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIE5TTG9nKEAiQUVTZW5kTWVzc2FnZSBmYWlsZWQ6ICVsZFxuIiwgKGxvbmcpZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgLy8gQ2hlY2sgZm9yIGFueSBhcHBsaWNhdGlvbiBlcnJvcnMKKyAgICBlcnIgPSBBRUdldFBhcmFtRGVzYygmcmVzLCBrZXlFcnJvck51bWJlciwgdHlwZVNJbnQzMiwgJmRlc2MpOworICAgIEFFRGlzcG9zZURlc2MoJnJlcyk7CisgICAgaWYgKCFlcnIpIHsKKyAgICAgICAgQUVHZXREZXNjRGF0YSgmZGVzYywgJmVyciwgc2l6ZW9mKGVycikpOworICAgICAgICBOU0xvZyhAIlRlcm1pbmFsIHJldHVybmVkIGFuIGVycm9yOiAlbGQiLCAobG9uZyllcnIpOworICAgICAgICBBRURpc3Bvc2VEZXNjKCZkZXNjKTsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBlcnJBRURlc2NOb3RGb3VuZCkgeworICAgICAgICBlcnIgPSBub0VycjsKKyAgICB9IGVsc2UgeworICAgICAgICBOU0xvZyhAIkFFR2V0UEFybURlc2MgcmV0dXJuZWQgYW4gZXJyb3I6ICVsZCIsIChsb25nKWVycik7CisgICAgfQogCi0JcmV0dXJuIGVycjsKKyAgICByZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvTWFjL1B5dGhvbkxhdW5jaGVyL21haW4ubSBiL01hYy9QeXRob25MYXVuY2hlci9tYWluLm0Kb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA2ODQxNDMzLi4wNGI0ZDczCi0tLSBhL01hYy9QeXRob25MYXVuY2hlci9tYWluLm0KKysrIGIvTWFjL1B5dGhvbkxhdW5jaGVyL21haW4ubQpAQCAtMTEsNyArMTEsNyBAQAogCiBpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKQogewotCWNoYXIgKmhvbWUgPSBnZXRlbnYoIkhPTUUiKTsKLQlpZiAoaG9tZSkgY2hkaXIoaG9tZSk7CisgICAgY2hhciAqaG9tZSA9IGdldGVudigiSE9NRSIpOworICAgIGlmIChob21lKSBjaGRpcihob21lKTsKICAgICByZXR1cm4gTlNBcHBsaWNhdGlvbk1haW4oYXJnYywgYXJndik7CiB9CmRpZmYgLS1naXQgYS9NYWMvUkVBRE1FIGIvTWFjL1JFQURNRQppbmRleCA1MjI5MDNhLi4wNGMwMmEzIDEwMDY0NAotLS0gYS9NYWMvUkVBRE1FCisrKyBiL01hYy9SRUFETUUKQEAgLTEsMTIgKzEsMTkgQEAKLT09PT09PT09PT09PQotTWFjT1NYIE5vdGVzCi09PT09PT09PT09PT0KKz09PT09PT09PT09PT09PT09PT09PT09PT0KK1B5dGhvbiBvbiBNYWMgT1MgWCBSRUFETUUKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworOkF1dGhvcnM6CisgICAgSmFjayBKYW5zZW4gKDIwMDQtMDcpLAorICAgIFJvbmFsZCBPdXNzb3JlbiAoMjAxMC0wNCksCisgICAgTmVkIERlaWx5ICgyMDE0LTA1KQorCis6VmVyc2lvbjogMi43LjcKIAogVGhpcyBkb2N1bWVudCBwcm92aWRlcyBhIHF1aWNrIG92ZXJ2aWV3IG9mIHNvbWUgTWFjIE9TIFggc3BlY2lmaWMgZmVhdHVyZXMgaW4KIHRoZSBQeXRob24gZGlzdHJpYnV0aW9uLgogCi1NYWMtc3BlY2lmaWMgYXJndW1lbnRzIHRvIGNvbmZpZ3VyZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK09TIFggc3BlY2lmaWMgYXJndW1lbnRzIHRvIGNvbmZpZ3VyZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKICogYGAtLWVuYWJsZS1mcmFtZXdvcmtbPURJUl1gYAogCkBAIC0xNSwxMSArMjIsMTEgQEAKICAgX2BCdWlsZGluZyBhbmQgdXNpbmcgYSBmcmFtZXdvcmstYmFzZWQgUHl0aG9uIG9uIE1hYyBPUyBYYCBmb3IgbW9yZSAKICAgaW5mb3JtYXRpb24gb24gZnJhbWV3b3Jrcy4KIAotICBJZiB0aGUgb3B0aW9uYWwgZGlyZWN0b3J5IGFyZ3VtZW50IGlzIHNwZWNpZmllZCB0aGUgZnJhbWV3b3JrIGl0IGluc3RhbGxlZAorICBJZiB0aGUgb3B0aW9uYWwgZGlyZWN0b3J5IGFyZ3VtZW50IGlzIHNwZWNpZmllZCB0aGUgZnJhbWV3b3JrIGlzIGluc3RhbGxlZAogICBpbnRvIHRoYXQgZGlyZWN0b3J5LiBUaGlzIGNhbiBiZSB1c2VkIHRvIGluc3RhbGwgYSBweXRob24gZnJhbWV3b3JrIGludG8KICAgeW91ciBob21lIGRpcmVjdG9yeTo6CiAKLSAgICAgJCBjb25maWd1cmUgLS1lbmFibGUtZnJhbWV3b3JrPS9Vc2Vycy9yb25hbGQvTGlicmFyeS9GcmFtZXdvcmtzCisgICAgICQgLi9jb25maWd1cmUgLS1lbmFibGUtZnJhbWV3b3JrPS9Vc2Vycy9yb25hbGQvTGlicmFyeS9GcmFtZXdvcmtzCiAgICAgICQgbWFrZSAmJiBtYWtlIGluc3RhbGwKIAogICBUaGlzIHdpbGwgaW5zdGFsbCB0aGUgZnJhbWV3b3JrIGl0c2VsZiBpbiBgYC9Vc2Vycy9yb25hbGQvTGlicmFyeS9GcmFtZXdvcmtzYGAsCkBAIC0zMywxMiArNDAsMTMgQEAKIAogKiBgYC0tZW5hYmxlLXVuaXZlcnNhbHNka1s9UEFUSF1gYAogCi0gIENyZWF0ZSBhIHVuaXZlcnNhbCBiaW5hcnkgYnVpbGQgb2Ygb2YgUHl0aG9uLiBUaGlzIGNhbiBiZSB1c2VkIHdpdGggYm90aAorICBDcmVhdGUgYSB1bml2ZXJzYWwgYmluYXJ5IGJ1aWxkIG9mIFB5dGhvbi4gVGhpcyBjYW4gYmUgdXNlZCB3aXRoIGJvdGgKICAgcmVndWxhciBhbmQgZnJhbWV3b3JrIGJ1aWxkcy4KIAotICBUaGUgb3B0aW9uYWwgYXJndW1lbnQgc3BlY2lmaWVzIHdoaWNoIE9TWCBTREsgc2hvdWxkIGJlIHVzZWQgdG8gcGVyZm9ybSB0aGUKLSAgYnVpbGQuIFRoaXMgZGVmYXVsdHMgdG8gYGAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYLjEwLjR1LnNka2BgLCBzcGVjaWZ5IAotICBgYC9gYCB3aGVuIGJ1aWxkaW5nIG9uIGEgMTAuNSBzeXN0ZW0sIGVzcGVjaWFsbHkgd2hlbiBidWlsZGluZyA2NC1iaXQgY29kZS4KKyAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50IHNwZWNpZmllcyB3aGljaCBPUyBYIFNESyBzaG91bGQgYmUgdXNlZCB0byBwZXJmb3JtIHRoZQorICBidWlsZC4gVGhpcyBkZWZhdWx0cyB0byBgYC9EZXZlbG9wZXIvU0RLcy9NYWNPU1guMTAuNHUuc2RrYGAuICBXaGVuIGJ1aWxkaW5nCisgIG9uIE9TIFggMTAuNSBvciBsYXRlciwgeW91IGNhbiBzcGVjaWZ5IGBgL2BgIHRvIHVzZSB0aGUgaW5zdGFsbGVkIHN5c3RlbQorICBoZWFkZXJzIHJhdGhlciB0aGFuIGFuIFNESy4KIAogICBTZWUgdGhlIHNlY3Rpb24gX2BCdWlsZGluZyBhbmQgdXNpbmcgYSB1bml2ZXJzYWwgYmluYXJ5IG9mIFB5dGhvbiBvbiBNYWMgT1MgWGAKICAgZm9yIG1vcmUgaW5mb3JtYXRpb24uCkBAIC01Niw5ICs2NCwxNCBAQAogMS4gV2hhdCBpcyBhIHVuaXZlcnNhbCBiaW5hcnkKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUEgdW5pdmVyc2FsIGJpbmFyeSBidWlsZCBvZiBQeXRob24gY29udGFpbnMgb2JqZWN0IGNvZGUgZm9yIGJvdGggUFBDIGFuZCBpMzg2Ci1hbmQgY2FuIHRoZXJlZm9yZSBydW4gYXQgbmF0aXZlIHNwZWVkIG9uIGJvdGggY2xhc3NpYyBwb3dlcnBjIGJhc2VkIG1hY3MgYW5kCi10aGUgbmV3ZXIgaW50ZWwgYmFzZWQgbWFjcy4KK0EgdW5pdmVyc2FsIGJpbmFyeSBidWlsZCBvZiBQeXRob24gY29udGFpbnMgb2JqZWN0IGNvZGUgZm9yIG1vcmUgdGhhbiBvbmUKK0NQVSBhcmNoaXRlY3R1cmUuICBBIHVuaXZlcnNhbCBPUyBYIGV4ZWN1dGFibGUgZmlsZSBvciBsaWJyYXJ5IGNvbWJpbmVzIHRoZQorYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGNvZGUgaW50byBvbmUgZmlsZSBhbmQgY2FuIHRoZXJlZm9yZSBydW4gYXQgbmF0aXZlCitzcGVlZCBvbiBhbGwgc3VwcG9ydGVkIGFyY2hpdGVjdHVyZXMuICBVbml2ZXJzYWwgZmlsZXMgd2VyZSBpbnRyb2R1Y2VkIGluCitPUyBYIDEwLjQgdG8gYWRkIHN1cHBvcnQgZm9yIEludGVsLWJhc2VkIE1hY3MgdG8gdGhlIGV4aXN0aW5nIFBvd2VyUEMgKFBQQykKK21hY2hpbmVzLiAgSW4gT1MgWCAxMC41IHN1cHBvcnQgd2FzIGV4dGVuZGVkIHRvIDY0LWJpdCBJbnRlbCBhbmQgNjQtYml0IFBQQworYXJjaGl0ZWN0dXJlcy4gIEl0IGlzIHBvc3NpYmxlIHRvIGJ1aWxkIFB5dGhvbiB3aXRoIHZhcmlvdXMgY29tYmluYXRpb25zCitvZiBhcmNoaXRlY3R1cmVzIGRlcGVuZGluZyBvbiB0aGUgYnVpbGQgdG9vbHMgYW5kIE9TIFggdmVyc2lvbiBpbiB1c2UuCiAKIDIuIEhvdyBkbyBJIGJ1aWxkIGEgdW5pdmVyc2FsIGJpbmFyeQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC03MCw0NSArODMsNjkgQEAKICAgJCBtYWtlCiAgICQgbWFrZSBpbnN0YWxsCiAKLVRoaXMgZmxhZyBjYW4gYmUgdXNlZCBhIGZyYW1ld29yayBidWlsZCBvZiBweXRob24sIGJ1dCBhbHNvIHdpdGggYSBjbGFzc2ljCi11bml4IGJ1aWxkLiBFaXRoZXIgd2F5IHlvdSB3aWxsIGhhdmUgdG8gYnVpbGQgcHl0aG9uIG9uIE1hYyBPUyBYIDEwLjQgKG9yIGxhdGVyKQotd2l0aCBYY29kZSAyLjEgKG9yIGxhdGVyKS4gWW91IGFsc28gaGF2ZSB0byBpbnN0YWxsIHRoZSAxMC40dSBTREsgd2hlbiAKLWluc3RhbGxpbmcgWGNvZGUuCitUaGlzIGZsYWcgY2FuIGJlIHVzZWQgd2l0aCBhIGZyYW1ld29yayBidWlsZCBvZiBweXRob24sIGJ1dCBhbHNvIHdpdGggYSBjbGFzc2ljCit1bml4IGJ1aWxkLiBVbml2ZXJzYWwgYnVpbGRzIHdlcmUgZmlyc3Qgc3VwcG9ydGVkIHdpdGggT1MgWCAxMC40IHdpdGggWGNvZGUgMi4xCithbmQgdGhlIDEwLjR1IFNESy4gIFN0YXJ0aW5nIHdpdGggWGNvZGUgMyBhbmQgT1MgWCAxMC41LCBtb3JlIGNvbmZpZ3VyYXRpb25zIGFyZQorYXZhaWxhYmxlLgogCiBUaGUgb3B0aW9uIGBgLS1lbmFibGUtdW5pdmVyc2Fsc2RrYGAgaGFzIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRvIHNwZWNpZnkgYW4KLVNESywgd2hpY2ggZGVmYXVsdHMgdG8gdGhlIDEwLjR1IFNESy4gV2hlbiB5b3UgYnVpbGQgb24gT1NYIDEwLjUgb3IgbGF0ZXIgCitTREssIHdoaWNoIGRlZmF1bHRzIHRvIHRoZSAxMC40dSBTREsuIFdoZW4geW91IGJ1aWxkIG9uIE9TIFggMTAuNSBvciBsYXRlcgogeW91IGNhbiB1c2UgdGhlIHN5c3RlbSBoZWFkZXJzIGluc3RlYWQgb2YgYW4gU0RLOjoKIAogICAkIC4vY29uZmlndXJlIC0tZW5hYmxlLXVuaXZlcnNhbHNkaz0vCiAKLTIuMSBGbGF2b3VycyBvZiB1bml2ZXJzYWwgYmluYXJpZXMKLS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KK0luIGdlbmVyYWwsIHVuaXZlcnNhbCBidWlsZHMgZGVwZW5kIG9uIHNwZWNpZmljIGZlYXR1cmVzIHByb3ZpZGVkIGJ5IHRoZQorQXBwbGUtc3VwcGxpZWQgY29tcGlsZXJzIGFuZCBvdGhlciBidWlsZCB0b29scyBpbmNsdWRlZCBpbiBBcHBsZSdzIFhjb2RlCitkZXZlbG9wbWVudCB0b29scy4gIFlvdSBzaG91bGQgaW5zdGFsbCBYY29kZSBhbmQgdGhlIGNvbW1hbmQgbGluZSB0b29scworY29tcG9uZW50IGFwcHJvcHJpYXRlIGZvciB0aGUgT1MgWCByZWxlYXNlIHlvdSBhcmUgcnVubmluZyBvbi4gIFNlZSB0aGUKK1B5dGhvbiBEZXZlbG9wZXIncyBHdWlkZSAoaHR0cDovL2RvY3MucHl0aG9uLm9yZy9kZXZndWlkZS9zZXR1cC5odG1sKQorZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAKLUl0IGlzIHBvc3NpYmxlIHRvIGJ1aWxkIGEgbnVtYmVyIG9mIGZsYXZvdXJzIG9mIHRoZSB1bml2ZXJzYWwgYmluYXJ5IGJ1aWxkLAotdGhlIGRlZmF1bHQgaXMgYSAzMi1iaXQgb25seSBiaW5hcnkgKGkzODYgYW5kIHBwYykuIFRoZSBmbGF2b3VyIGNhbiBiZQorMi4xIEZsYXZvcnMgb2YgdW5pdmVyc2FsIGJpbmFyaWVzCisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKworSXQgaXMgcG9zc2libGUgdG8gYnVpbGQgYSBudW1iZXIgb2YgZmxhdm9ycyBvZiB0aGUgdW5pdmVyc2FsIGJpbmFyeSBidWlsZCwKK3RoZSBkZWZhdWx0IGlzIGEgMzItYml0IG9ubHkgYmluYXJ5IChpMzg2IGFuZCBwcGMpLiBOb3RlIHRoYXQgc3RhcnRpbmcgd2l0aAorWGNvZGUgNCwgdGhlIGJ1aWxkIHRvb2xzIG5vIGxvbmdlciBzdXBwb3J0IHBwYy4gVGhlIGZsYXZvciBjYW4gYmUKIHNwZWNpZmllZCB1c2luZyB0aGUgb3B0aW9uIGBgLS13aXRoLXVuaXZlcnNhbC1hcmNocz1WQUxVRWBgLiBUaGUgZm9sbG93aW5nCiB2YWx1ZXMgYXJlIGF2YWlsYWJsZToKIAorICAqIGBgaW50ZWxgYDoJICBgYGkzODZgYCwgYGB4ODZfNjRgYAorCiAgICogYGAzMi1iaXRgYDogICBgYHBwY2BgLCBgYGkzODZgYAogCisgICogYGAzLXdheWBgOgkgIGBgaTM4NmBgLCBgYHg4Nl82NGBgLCBgYHBwY2BgCisKICAgKiBgYDY0LWJpdGBgOiAgIGBgcHBjNjRgYCwgYGB4ODZfNjRgYAogCiAgICogYGBhbGxgYDogICAgICBgYHBwY2BgLCBgYHBwYzY0YGAsIGBgaTM4NmBgLCBgYHg4Nl82NGBgCiAKLSAgKiBgYDMtd2F5YGA6CSAgYGBwcGNgYCwgYGBpMzg2YGAgYW5kIGBgeDg2XzY0YGAKLQotICAqIGBgaW50ZWxgYDoJICBgYGkzODZgYCwgYGB4ODZfNjRgYAotCiBUbyBidWlsZCBhIHVuaXZlcnNhbCBiaW5hcnkgdGhhdCBpbmNsdWRlcyBhIDY0LWJpdCBhcmNoaXRlY3R1cmUsIHlvdSBtdXN0IGJ1aWxkCi1vbiBhIHN5c3RlbSBydW5uaW5nIE9TWCAxMC41IG9yIGxhdGVyLiBUaGUgYGBhbGxgYCBmbGF2b3VyIGNhbiBvbmx5IGJlIGJ1aWx0IG9uCi1PU1ggMTAuNS4KK29uIGEgc3lzdGVtIHJ1bm5pbmcgT1MgWCAxMC41IG9yIGxhdGVyLiAgVGhlIGBgYWxsYGAgYW5kIGBgNjQtYml0YGAgZmxhdm9ycyBjYW4KK29ubHkgYmUgYnVpbHQgd2l0aCBhbiAxMC41IFNESyBiZWNhdXNlIGBgcHBjNjRgYCBzdXBwb3J0IHdhcyBvbmx5IGluY2x1ZGVkIHdpdGgKK09TIFggMTAuNS4gIEFsdGhvdWdoIGxlZ2FjeSBgYHBwY2BgIHN1cHBvcnQgd2FzIGluY2x1ZGVkIHdpdGggWGNvZGUgMyBvbiBPUyBYCisxMC42LCBpdCB3YXMgcmVtb3ZlZCBpbiBYY29kZSA0LCB2ZXJzaW9ucyBvZiB3aGljaCB3ZXJlIHJlbGVhc2VkIG9uIE9TIFggMTAuNgorYW5kIHdoaWNoIGlzIHRoZSBzdGFuZGFyZCBmb3IgT1MgWCAxMC43LiAgVG8gc3VtbWFyaXplLCB0aGUKK2ZvbGxvd2luZyBjb21iaW5hdGlvbnMgb2YgU0RLcyBhbmQgdW5pdmVyc2FsLWFyY2hzIGZsYXZvcnMgYXJlIGF2YWlsYWJsZToKIAotVGhlIG1ha2VmaWxlIGZvciBhIGZyYW1ld29yayBidWlsZCB3aWxsIGluc3RhbGwgYGBweXRob24zMmBgIGFuZCBgYHB5dGhvbnczMmBgIAotYmluYXJpZXMgd2hlbiB0aGUgdW5pdmVyc2FsIGFyY2hpdGVjdXJlcyBpbmNsdWRlcyBhdCBsZWFzdCBvbmUgMzItYml0IGFyY2hpdGVjdHVyZQotKHRoYXQgaXMsIGZvciBhbGwgZmxhdm91cnMgYnV0IGBgNjQtYml0YGApLgorICAqIDEwLjR1IFNESyB3aXRoIFhjb2RlIDIgc3VwcG9ydHMgYGAzMi1iaXRgYCBvbmx5CiAKLVJ1bm5pbmcgYSBzcGVjaWZpYyBhcmNoaWN0dXJlCi0uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAqIDEwLjUgU0RLIHdpdGggWGNvZGUgMy4xLnggc3VwcG9ydHMgYWxsIGZsYXZvcnMKKworICAqIDEwLjYgU0RLIHdpdGggWGNvZGUgMy4yLnggc3VwcG9ydHMgYGBpbnRlbGBgLCBgYDMtd2F5YGAsIGFuZCBgYDMyLWJpdGBgCisKKyAgKiAxMC42IFNESyB3aXRoIFhjb2RlIDQgc3VwcG9ydHMgYGBpbnRlbGBgIG9ubHkKKworICAqIDEwLjcgYW5kIDEwLjggU0RLcyB3aXRoIFhjb2RlIDQgc3VwcG9ydCBgYGludGVsYGAgb25seQorCisgICogMTAuOCBhbmQgMTAuOSBTREtzIHdpdGggWGNvZGUgNSBzdXBwb3J0IGBgaW50ZWxgYCBvbmx5CisKK1RoZSBtYWtlZmlsZSBmb3IgYSBmcmFtZXdvcmsgYnVpbGQgd2lsbCBhbHNvIGluc3RhbGwgYGBweXRob24yLjctMzJgYAorYmluYXJpZXMgd2hlbiB0aGUgdW5pdmVyc2FsIGFyY2hpdGVjdHVyZSBpbmNsdWRlcyBhdCBsZWFzdCBvbmUgMzItYml0CithcmNoaXRlY3R1cmUgKHRoYXQgaXMsIGZvciBhbGwgZmxhdm9ycyBidXQgYGA2NC1iaXRgYCkuCisKK1J1bm5pbmcgYSBzcGVjaWZpYyBhcmNoaXRlY3R1cmUKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KIAogWW91IGNhbiBydW4gY29kZSB1c2luZyBhIHNwZWNpZmljIGFyY2hpdGVjdHVyZSB1c2luZyB0aGUgYGBhcmNoYGAgY29tbWFuZDo6CiAKQEAgLTEyMyw2ICsxNjAsMTMgQEAKIHdyYXBwZXIgdG9vbHMgdGhhdCBleGVjdXRlIHRoZSByZWFsIGludGVycHJldGVyIHdpdGhvdXQgZW5zdXJpbmcgdGhhdCB0aGUKIHJlYWwgaW50ZXJwcmV0ZXIgcnVucyB3aXRoIHRoZSBzYW1lIGFyY2hpdGVjdHVyZS4KIAorVXNpbmcgYGBhcmNoYGAgaXMgbm90IGEgcGVyZmVjdCBzb2x1dGlvbiBhcyB0aGUgc2VsZWN0ZWQgYXJjaGl0ZWN0dXJlIHdpbGwKK25vdCBhdXRvbWF0aWNhbGx5IGNhcnJ5IHRocm91Z2ggdG8gc3VicHJvY2Vzc2VzIGxhdW5jaGVkIGJ5IHByb2dyYW1zIGFuZCB0ZXN0cwordW5kZXIgdGhhdCBQeXRob24uICBJZiB5b3Ugd2FudCB0byBlbnN1cmUgdGhhdCBQeXRob24gaW50ZXJwcmV0ZXJzIGxhdW5jaGVkIGluCitzdWJwcm9jZXNzZXMgYWxzbyBydW4gaW4gMzItYml0LW1vZGUgaWYgdGhlIG1haW4gaW50ZXJwcmV0ZXIgZG9lcywgdXNlCithIGBgcHl0aG9uMi43LTMyYGAgYmluYXJ5IGFuZCB1c2UgdGhlIHZhbHVlIG9mIGBgc3lzLmV4ZWN1dGFibGVgYCBhcyB0aGUKK2Bgc3VicHJvY2Vzc2BgIGBgUG9wZW5gYCBleGVjdXRhYmxlIHZhbHVlLgorCiBCdWlsZGluZyBhbmQgdXNpbmcgYSBmcmFtZXdvcmstYmFzZWQgUHl0aG9uIG9uIE1hYyBPUyBYLgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMTMyLDE2ICsxNzYsMTcgQEAKIAogVGhlIG1haW4gcmVhc29uIGlzIGJlY2F1c2UgeW91IHdhbnQgdG8gY3JlYXRlIEdVSSBwcm9ncmFtcyBpbiBQeXRob24uIFdpdGggdGhlCiBleGNlcHRpb24gb2YgWDExL1hEYXJ3aW4tYmFzZWQgR1VJIHRvb2xraXRzIGFsbCBHVUkgcHJvZ3JhbXMgbmVlZCB0byBiZSBydW4gCi1mcm9tIGEgZnVsbGJsb3duIE1hY09TWCBhcHBsaWNhdGlvbiAoYSAiLmFwcCIgYnVuZGxlKS4KK2Zyb20gYSBNYWMgT1MgWCBhcHBsaWNhdGlvbiBidW5kbGUgKCIuYXBwIikuCiAKIFdoaWxlIGl0IGlzIHRlY2huaWNhbGx5IHBvc3NpYmxlIHRvIGNyZWF0ZSBhIC5hcHAgd2l0aG91dCB1c2luZyBmcmFtZXdvcmtzIHlvdQogd2lsbCBoYXZlIHRvIGRvIHRoZSB3b3JrIHlvdXJzZWxmIGlmIHlvdSByZWFsbHkgd2FudCB0aGlzLgogCiBBIHNlY29uZCByZWFzb24gZm9yIHVzaW5nIGZyYW1ld29ya3MgaXMgdGhhdCB0aGV5IHB1dCBQeXRob24tcmVsYXRlZCBpdGVtcyBpbgogb25seSB0d28gcGxhY2VzOiAiL0xpYnJhcnkvRnJhbWV3b3JrL1B5dGhvbi5mcmFtZXdvcmsiIGFuZCAKLSIvQXBwbGljYXRpb25zL01hY1B5dGhvbiAyLjYiLiAgVGhpcyBzaW1wbGlmaWVzIG1hdHRlcnMgZm9yIHVzZXJzIGluc3RhbGxpbmcgCisiL0FwcGxpY2F0aW9ucy9QeXRob24gPFZFUlNJT04+IiB3aGVyZSBgYDxWRVJTSU9OPmBgIGNhbiBiZSBlLmcuICIzLjQiLAorIjIuNyIsIGV0Yy4gIFRoaXMgc2ltcGxpZmllcyBtYXR0ZXJzIGZvciB1c2VycyBpbnN0YWxsaW5nCiBQeXRob24gZnJvbSBhIGJpbmFyeSBkaXN0cmlidXRpb24gaWYgdGhleSB3YW50IHRvIGdldCByaWQgb2YgaXQgYWdhaW4uIE1vcmVvdmVyLAotZHVlIHRvIHRoZSB3YXkgZnJhbWV3b3JrcyB3b3JrIGEgdXNlciB3aXRob3V0IGFkbWluIHByaXZpbGVnZXMgY2FuIGluc3RhbGwgYSAKK2R1ZSB0byB0aGUgd2F5IGZyYW1ld29ya3Mgd29yaywgYSB1c2VyIHdpdGhvdXQgYWRtaW4gcHJpdmlsZWdlcyBjYW4gaW5zdGFsbCBhCiBiaW5hcnkgZGlzdHJpYnV0aW9uIGluIGhpcyBvciBoZXIgaG9tZSBkaXJlY3Rvcnkgd2l0aG91dCByZWNvbXBpbGF0aW9uLgogCiAyLiBIb3cgZG9lcyBhIGZyYW1ld29yayBQeXRob24gZGlmZmVyIGZyb20gYSBub3JtYWwgc3RhdGljIFB5dGhvbj8KQEAgLTE1Niw0MyArMjAxLDU1IEBACiAzLiBEbyBJIG5lZWQgZXh0cmEgcGFja2FnZXM/CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVllcywgcHJvYmFibHkuICBJZiB5b3Ugd2FudCBUa2ludGVyIHN1cHBvcnQgeW91IG5lZWQgdG8gZ2V0IHRoZSBPU1ggQXF1YVRrIAotZGlzdHJpYnV0aW9uLCB0aGlzIGlzIGluc3RhbGxlZCBieSBkZWZhdWx0IG9uIE1hYyBPUyBYIDEwLjQgb3IgbGF0ZXIuIElmCi15b3Ugd2FudCB3eFB5dGhvbiB5b3UgbmVlZCB0byBnZXQgdGhhdC4gSWYgeW91IHdhbnQgQ29jb2EgeW91IG5lZWQgdG8gZ2V0Ci1QeU9iakMuIAorWWVzLCBwcm9iYWJseS4gIElmIHlvdSB3YW50IFRraW50ZXIgc3VwcG9ydCB5b3UgbmVlZCB0byBnZXQgdGhlIE9TIFggQXF1YVRrCitkaXN0cmlidXRpb24sIHRoaXMgaXMgaW5zdGFsbGVkIGJ5IGRlZmF1bHQgb24gTWFjIE9TIFggMTAuNCBvciBsYXRlci4gIEJlCithd2FyZSwgdGhvdWdoLCB0aGF0IHRoZSBDb2NvYS1iYXNlZCBBcXVhVGsncyBzdXBwbGllZCBzdGFydGluZyB3aXRoIE9TIFgKKzEwLjYgaGF2ZSBwcm92ZW4gdG8gYmUgdW5zdGFibGUuICBJZiBwb3NzaWJsZSwgeW91IHNob3VsZCBjb25zaWRlcgoraW5zdGFsbGluZyBhIG5ld2VyIHZlcnNpb24gYmVmb3JlIGJ1aWxkaW5nIG9uIE9TIFggMTAuNiBvciBsYXRlciwgc3VjaCBhcwordGhlIEFjdGl2ZVRjbCA4LjUuICBTZWUgaHR0cDovL3d3dy5weXRob24ub3JnL2Rvd25sb2FkL21hYy90Y2x0ay8uICBJZiB5b3UKK2FyZSBidWlsZGluZyB3aXRoIGFuIFNESywgZW5zdXJlIHRoYXQgdGhlIG5ld2VyIFRjbCBhbmQgVGsgZnJhbWV3b3JrcyBhcmUKK3NlZW4gaW4gdGhlIFNESydzIGBgTGlicmFyeS9GcmFtZXdvcmtzYGAgZGlyZWN0b3J5OyB5b3UgbWF5IG5lZWQgdG8KK21hbnVhbGx5IGNyZWF0ZSBzeW1saW5rcyB0byB0aGVpciBpbnN0YWxsZWQgbG9jYXRpb24sIGBgL0xpYnJhcnkvRnJhbWV3b3Jrc2BgLgorSWYgeW91IHdhbnQgd3hQeXRob24geW91IG5lZWQgdG8gZ2V0IHRoYXQuCitJZiB5b3Ugd2FudCBDb2NvYSB5b3UgbmVlZCB0byBnZXQgUHlPYmpDLgogCiA0LiBIb3cgZG8gSSBidWlsZCBhIGZyYW1ld29yayBQeXRob24/CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGEgTWFrZWZpbGUgdGhhdCB3aWxsIGNyZWF0ZSBhIGNvdXBsZSBvZiBweXRob24tcmVsYXRlZAotYXBwbGljYXRpb25zIChmdWxsYmxvd24gT1NYIC5hcHAgYXBwbGljYXRpb25zLCB0aGF0IGlzKSBpbgotIi9BcHBsaWNhdGlvbnMvTWFjUHl0aG9uIDIuNiIsIGFuZCBhIGhpZGRlbiBoZWxwZXIgYXBwbGljYXRpb24gUHl0aG9uLmFwcCAKLWluc2lkZSB0aGUgUHl0aG9uLmZyYW1ld29yaywgYW5kIHVuaXggdG9vbHMgInB5dGhvbiIgYW5kICJweXRob253IiBpbnRvIAotL3Vzci9sb2NhbC9iaW4uICBJbiBhZGRpdGlvbiBpdCBoYXMgYSB0YXJnZXQgImluc3RhbGxtYWNzdWJ0cmVlIiB0aGF0IGluc3RhbGxzIAorYXBwbGljYXRpb25zIChmdWxsLWJsb3duIE9TIFggLmFwcCBhcHBsaWNhdGlvbnMsIHRoYXQgaXMpIGluCisiL0FwcGxpY2F0aW9ucy9QeXRob24gPFZFUlNJT04+IiwgYW5kIGEgaGlkZGVuIGhlbHBlciBhcHBsaWNhdGlvbiBQeXRob24uYXBwCitpbnNpZGUgdGhlIFB5dGhvbi5mcmFtZXdvcmssIGFuZCB1bml4IHRvb2xzICJweXRob24iIGFuZCAicHl0aG9udyIgaW50bworL3Vzci9sb2NhbC9iaW4uICBJbiBhZGRpdGlvbiBpdCBoYXMgYSB0YXJnZXQgImluc3RhbGxtYWNzdWJ0cmVlIiB0aGF0IGluc3RhbGxzCiB0aGUgcmVsZXZhbnQgcG9ydGlvbnMgb2YgdGhlIE1hYyBzdWJ0cmVlIGludG8gdGhlIFB5dGhvbi5mcmFtZXdvcmsuCiAKIEl0IGlzIG5vcm1hbGx5IGludm9rZWQgaW5kaXJlY3RseSB0aHJvdWdoIHRoZSBtYWluIE1ha2VmaWxlLCBhcyB0aGUgbGFzdCBzdGVwCi1pbiB0aGUgc2VxdWVuY2U6OgoraW4gdGhlIHNlcXVlbmNlCiAKLSAkIC4vY29uZmlndXJlIC0tZW5hYmxlLWZyYW1ld29yawotICQgbWFrZQotICQgbWFrZSBpbnN0YWxsCisgMS4gLi9jb25maWd1cmUgLS1lbmFibGUtZnJhbWV3b3JrCiAKLVRoaXMgc2VxdWVuY2Ugd2lsbCBwdXQgdGhlIGZyYW1ld29yayBpbiAvTGlicmFyeS9GcmFtZXdvcmsvUHl0aG9uLmZyYW1ld29yaywKLXRoZSBhcHBsaWNhdGlvbnMgaW4gIi9BcHBsaWNhdGlvbnMvTWFjUHl0aG9uIDIuNiIgYW5kIHRoZSB1bml4IHRvb2xzIGluIAotL3Vzci9sb2NhbC9iaW4uCisgMi4gbWFrZQorIAorIDMuIG1ha2UgaW5zdGFsbAogCi1JdCBpcyBwb3NzaWJsZSB0byBzZWxlY3QgYSBkaWZmZXJlbnQgbmFtZSBmb3IgdGhlIGZyYW1ld29yayB1c2luZyB0aGUgY29uZmlndXJlIAotb3B0aW9uIGBgLS13aXRoLWZyYW1ld29yay1uYW1lPU5BTUVgYC4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBoYXZlIHNldmVyYWwKLXBhcmFsbGVsIGluc3RhbGxzIG9mIGEgUHl0aG9uIGZyYW1ld29yay4KK1RoaXMgc2VxdWVuY2Ugd2lsbCBwdXQgdGhlIGZyYW1ld29yayBpbiBgYC9MaWJyYXJ5L0ZyYW1ld29yay9QeXRob24uZnJhbWV3b3JrYGAsCit0aGUgYXBwbGljYXRpb25zIGluIGBgL0FwcGxpY2F0aW9ucy9QeXRob24gPFZFUlNJT04+YGAgYW5kIHRoZSB1bml4IHRvb2xzIGluIAorYGAvdXNyL2xvY2FsL2JpbmBgLgogCi1JbnN0YWxsaW5nIGluIGFub3RoZXIgcGxhY2UsIGZvciBpbnN0YW5jZSAkSE9NRS9MaWJyYXJ5L0ZyYW1ld29ya3MgaWYgeW91IGhhdmUKLW5vIGFkbWluIHByaXZpbGVnZXMgb24geW91ciBtYWNoaW5lLCBoYXMgb25seSBiZWVuIHRlc3RlZCB2ZXJ5IGxpZ2h0bHkuIFRoaXMKLWNhbiBiZSBkb25lIGJ5IGNvbmZpZ3VyaW5nIHdpdGggLS1lbmFibGUtZnJhbWV3b3JrPSRIT01FL0xpYnJhcnkvRnJhbWV3b3Jrcy4KLVRoZSBvdGhlciB0d28gZGlyZWN0b3JpZXMsICIvQXBwbGljYXRpb25zL01hY1B5dGhvbi0yLjYiIGFuZCAvdXNyL2xvY2FsL2JpbiwgCi13aWxsIHRoZW4gYWxzbyBiZSBkZXBvc2l0ZWQgaW4gJEhPTUUuIFRoaXMgaXMgc3ViLW9wdGltYWwgZm9yIHRoZSB1bml4IHRvb2xzLCAKLXdoaWNoIHlvdSB3b3VsZCB3YW50IGluICRIT01FL2JpbiwgYnV0IHRoZXJlIGlzIG5vIGVhc3kgd2F5IHRvIGZpeCB0aGlzIHJpZ2h0IAotbm93LgorSW5zdGFsbGluZyBpbiBhbm90aGVyIHBsYWNlLCBmb3IgaW5zdGFuY2UgYGAkSE9NRS9MaWJyYXJ5L0ZyYW1ld29ya3NgYCBpZiB5b3UKK2hhdmUgbm8gYWRtaW4gcHJpdmlsZWdlcyBvbiB5b3VyIG1hY2hpbmUsIGlzIHBvc3NpYmxlLiBUaGlzIGNhbiBiZSBhY2NvbXBsaXNoZWQKK2J5IGNvbmZpZ3VyaW5nIHdpdGggYGAtLWVuYWJsZS1mcmFtZXdvcms9JEhPTUUvTGlicmFyeS9GcmFtZXdvcmtzYGAuCitUaGUgb3RoZXIgdHdvIGRpcmVjdG9yaWVzIHdpbGwgdGhlbiBhbHNvIGJlIGluc3RhbGxlZCBpbiB5b3VyIGhvbWUgZGlyZWN0b3J5LAorYXQgYGAkSE9NRS9BcHBsaWNhdGlvbnMvUHl0aG9uLTxWRVJTSU9OPmBgIGFuZCBgYCRIT01FL2JpbmBgLgorCitJZiB5b3Ugd2FudCB0byBpbnN0YWxsIHNvbWUgcGFydCwgYnV0IG5vdCBhbGwsIHJlYWQgdGhlIG1haW4gTWFrZWZpbGUuIFRoZQorZnJhbWV3b3JraW5zdGFsbCBpcyBjb21wb3NlZCBvZiBhIGNvdXBsZSBvZiBzdWItdGFyZ2V0cyB0aGF0IGluc3RhbGwgdGhlCitmcmFtZXdvcmsgaXRzZWxmLCB0aGUgTWFjIHN1YnRyZWUsIHRoZSBhcHBsaWNhdGlvbnMgYW5kIHRoZSB1bml4IHRvb2xzLgorCitUaGVyZSBpcyBhbiBleHRyYSB0YXJnZXQgZnJhbWV3b3JraW5zdGFsbGV4dHJhcyB0aGF0IGlzIG5vdCBwYXJ0IG9mIHRoZQorbm9ybWFsIGZyYW1ld29ya2luc3RhbGwgd2hpY2ggaW5zdGFsbHMgdGhlIFRvb2xzIGRpcmVjdG9yeSBpbnRvCisiL0FwcGxpY2F0aW9ucy9QeXRob24gPFZFUlNJT04+IiwgdGhpcyBpcyB1c2VmdWwgZm9yIGJpbmFyeQorZGlzdHJpYnV0aW9ucy4KIAogV2hhdCBkbyBhbGwgdGhlc2UgcHJvZ3JhbXMgZG8/CiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0yMDAsMzMgKzI1Nyw1NCBAQAogIklETEUuYXBwIiBpcyBhbiBpbnRlZ3JhdGVkIGRldmVsb3BtZW50IGVudmlyb25tZW50IGZvciBQeXRob246IGVkaXRvciwKIGRlYnVnZ2VyLCBldGMuCiAKLSJQeXRob25MYXVuY2hlci5hcHAiIGlzIGEgaGVscGVyIGFwcGxpY2F0aW9uIHRoYXQgd2lsbCBoYW5kbGUgdGhpbmdzIHdoZW4geW91CisiUHl0aG9uIExhdW5jaGVyLmFwcCIgaXMgYSBoZWxwZXIgYXBwbGljYXRpb24gdGhhdCB3aWxsIGhhbmRsZSB0aGluZ3Mgd2hlbiB5b3UKIGRvdWJsZS1jbGljayBhIC5weSwgLnB5YyBvciAucHl3IGZpbGUuIEZvciB0aGUgZmlyc3QgdHdvIGl0IGNyZWF0ZXMgYSBUZXJtaW5hbAogd2luZG93IGFuZCBydW5zIHRoZSBzY3JpcHRzIHdpdGggdGhlIG5vcm1hbCBjb21tYW5kLWxpbmUgUHl0aG9uLiBGb3IgdGhlCiBsYXR0ZXIgaXQgcnVucyB0aGUgc2NyaXB0IGluIHRoZSBQeXRob24uYXBwIGludGVycHJldGVyIHNvIHRoZSBzY3JpcHQgY2FuIGRvCi1HVUktdGhpbmdzLiBLZWVwIHRoZSAiYWx0IiBrZXkgZGVwcmVzc2VkIHdoaWxlIGRyYWdnaW5nIG9yIGRvdWJsZS1jbGlja2luZyBhCi1zY3JpcHQgdG8gc2V0IHJ1bnRpbWUgb3B0aW9ucy4gVGhlc2Ugb3B0aW9ucyBjYW4gYmUgc2V0IG9uY2UgYW5kIGZvciBhbGwKLXRocm91Z2ggUHl0aG9uTGF1bmNoZXIncyBwcmVmZXJlbmNlcyBkaWFsb2cuCitHVUktdGhpbmdzLiBLZWVwIHRoZSBgYE9wdGlvbmBgIGtleSBkZXByZXNzZWQgd2hpbGUgZHJhZ2dpbmcgb3IgZG91YmxlLWNsaWNraW5nCithIHNjcmlwdCB0byBzZXQgcnVudGltZSBvcHRpb25zLiBUaGVzZSBvcHRpb25zIGNhbiBiZSBzZXQgcGVyc2lzdGVudGx5Cit0aHJvdWdoIFB5dGhvbiBMYXVuY2hlcidzIHByZWZlcmVuY2VzIGRpYWxvZy4KIAotIkJ1aWxkQXBwbGV0LmFwcCIgY3JlYXRlcyBhbiBhcHBsZXQgZnJvbSBhIFB5dGhvbiBzY3JpcHQuIERyb3AgdGhlIHNjcmlwdCBvbiBpdAotYW5kIG91dCBjb21lcyBhIGZ1bGwtZmVhdHVyZWQgTWFjT1MgYXBwbGljYXRpb24uIFRoZXJlIGlzIG11Y2ggbW9yZSB0byB0aGlzLAotdG8gYmUgc3VwcGxpZWQgbGF0ZXIuIFNvbWUgdXNlZnVsIChidXQgb3V0ZGF0ZWQpIGluZm8gY2FuIGJlIGZvdW5kIGluCi1NYWMvRGVtby4KKyJCdWlsZCBBcHBsZXQuYXBwIiBjcmVhdGVzIGFuIGFwcGxldCBmcm9tIGEgUHl0aG9uIHNjcmlwdC4gRHJvcCB0aGUgc2NyaXB0IG9uIGl0CithbmQgb3V0IGNvbWVzIGEgZnVsbC1mZWF0dXJlZCBNYWMgT1MgWCBhcHBsaWNhdGlvbi4gICJCdWlsZCBBcHBsZXQuYXBwIiBpcyBub3cKK2RlcHJlY2F0ZWQgYW5kIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuICBBcyBvZiBPUyBYIDEwLjgsIFhjb2RlIDQgbm8KK2xvbmdlciBzdXBwbGllcyB0aGUgaGVhZGVycyBmb3IgdGhlIGRlcHJlY2F0ZWQgUXVpY2tEcmF3IEFQSXMgdXNlZCBieQordGhlIEVhc3lEaWFsb2dzIG1vZHVsZSBtYWtpbmcgQnVpbGRBcHBsZXQgdW51c2FibGUgYXMgYW4gYXBwLiAgSXQgd2lsbAorbm90IGJlIGJ1aWx0IGJ5IHRoZSBNYWMvTWFrZWZpbGUgaW4gdGhpcyBjYXNlLgogCi1UaGUgY29tbWFuZGxpbmUgc2NyaXB0cyAvdXNyL2xvY2FsL2Jpbi9weXRob24gYW5kIHB5dGhvbncgY2FuIGJlIHVzZWQgdG8gcnVuCi1ub24tR1VJIGFuZCBHVUkgcHl0aG9uIHNjcmlwdHMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCByZXNwZWN0aXZlbHkuCitUaGUgcHJvZ3JhbSBgYHB5dGhvbngueGBgIHJ1bnMgcHl0aG9uIHNjcmlwdHMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLiAgVmFyaW91cworY29tcGF0aWJpbGl0eSBhbGlhc2VzIGFyZSBhbHNvIGluc3RhbGxlZCwgaW5jbHVkaW5nIGBgcHl0aG9ud3gueGBgIHdoaWNoCitpbiBlYXJseSByZWxlYXNlcyBvZiBQeXRob24gb24gT1MgWCB3YXMgcmVxdWlyZWQgdG8gcnVuIEdVSSBwcm9ncmFtcy4gIEluCitjdXJyZW50IHJlbGVhc2VzLCB0aGUgYGBweXRob254LnhgYCBhbmQgYGBweXRob253eC54YGAgY29tbWFuZHMgYXJlIGlkZW50aWNhbAorYW5kIHRoZSB1c2Ugb2YgYGBweXRob253eC54YGAgc2hvdWxkIGJlIGF2b2lkZWQgYXMgaXQgaGFzIGJlZW4gcmVtb3ZlZCBpbgorY3VycmVudCB2ZXJzaW9ucyBvZiBQeXRob24gMy4KIAogSG93IGRvIEkgY3JlYXRlIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbj8KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLUdvIHRvIHRoZSBkaXJlY3RvcnkgIk1hYy9PU1gvQnVpbGRTY3JpcHQiLiBUaGVyZSB5b3UnbGwgZmluZCBhIHNjcmlwdCAKLSJidWlsZC1pbnN0YWxsZXIucHkiIHRoYXQgZG9lcyBhbGwgdGhlIHdvcmsuIFRoaXMgd2lsbCBkb3dubG9hZCBhbmQgYnVpbGQKLWEgbnVtYmVyIG9mIDN0aC1wYXJ0eSBsaWJhcmllcywgY29uZmlndXJlcyBhbmQgYnVpbGRzIGEgZnJhbWV3b3JrIFB5dGhvbiwKLWluc3RhbGxzIGl0LCBjcmVhdGVzIHRoZSBpbnN0YWxsZXIgcGFjYWtnZSBmaWxlcyBhbmQgdGhlbiBwYWNrcyB0aGlzIGluIGEgCi1ETUcgaW1hZ2UuCitEb3dubG9hZCBhbmQgdW5wYWNrIHRoZSBzb3VyY2UgcmVsZWFzZSBmcm9tIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb3dubG9hZC8uCitHbyB0byB0aGUgZGlyZWN0b3J5IGBgTWFjL0J1aWxkU2NyaXB0YGAuIFRoZXJlIHlvdSB3aWxsIGZpbmQgYSBzY3JpcHQKK2BgYnVpbGQtaW5zdGFsbGVyLnB5YGAgdGhhdCBkb2VzIGFsbCB0aGUgd29yay4gVGhpcyB3aWxsIGRvd25sb2FkIGFuZCBidWlsZAorYSBudW1iZXIgb2YgM3JkLXBhcnR5IGxpYmFyaWVzLCBjb25maWd1cmVzIGFuZCBidWlsZHMgYSBmcmFtZXdvcmsgUHl0aG9uLAoraW5zdGFsbHMgaXQsIGNyZWF0ZXMgdGhlIGluc3RhbGxlciBwYWNrYWdlIGZpbGVzIGFuZCB0aGVuIHBhY2tzIHRoaXMgaW4gYQorRE1HIGltYWdlLiAgVGhlIHNjcmlwdCBhbHNvIGJ1aWxkcyBhbiBIVE1MIGNvcHkgb2YgdGhlIGN1cnJlbnQgUHl0aG9uCitkb2N1bWVudGF0aW9uIHNldCBmb3IgdGhpcyByZWxlYXNlIGZvciBpbmNsdXNpb24gaW4gdGhlIGZyYW1ld29yay4gIFRoZQoraW5zdGFsbGVyIHBhY2thZ2Ugd2lsbCBjcmVhdGUgbGlua3MgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yIHVzZSBieSBJRExFLAorcHlkb2MsIHNoZWxsIHVzZXJzLCBhbmQgRmluZGVyIHVzZXIuCiAKLVRoZSBzY3JpcHQgd2lsbCBidWlsZCBhIHVuaXZlcnNhbCBiaW5hcnksIHlvdSdsbCB0aGVyZWZvcmUgaGF2ZSB0byBydW4gdGhpcworVGhlIHNjcmlwdCB3aWxsIGJ1aWxkIGEgdW5pdmVyc2FsIGJpbmFyeSBzbyB5b3UnbGwgdGhlcmVmb3JlIGhhdmUgdG8gcnVuIHRoaXMKIHNjcmlwdCBvbiBNYWMgT1MgWCAxMC40IG9yIGxhdGVyIGFuZCB3aXRoIFhjb2RlIDIuMSBvciBsYXRlciBpbnN0YWxsZWQuCitIb3dldmVyLCB0aGUgUHl0aG9uIGJ1aWxkIHByb2Nlc3MgaXRzZWxmIGhhcyBzZXZlcmFsIGJ1aWxkIGRlcGVuZGVuY2llcyBub3QKK2F2YWlsYWJsZSBvdXQgb2YgdGhlIGJveCB3aXRoIE9TIFggMTAuNCBzbyB5b3UgbWF5IGhhdmUgdG8gaW5zdGFsbAorYWRkaXRpb25hbCBzb2Z0d2FyZSBiZXlvbmQgd2hhdCBpcyBwcm92aWRlZCB3aXRoIFhjb2RlIDIuICBPUyBYIDEwLjUKK3Byb3ZpZGVzIGEgcmVjZW50IGVub3VnaCBzeXN0ZW0gUHl0aG9uIChpbiBgYC91c3IvYmluYGApIHRvIGJ1aWxkCit0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24gc2V0LiAgSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHVzZSBTREtzIGFuZC9vciBvbGRlcgordmVyc2lvbnMgb2YgWGNvZGUgdG8gYnVpbGQgaW5zdGFsbGVycyB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGggb2xkZXIgc3lzdGVtcworb24gYSBuZXdlciBzeXN0ZW0gYnV0IHRoaXMgbWF5IG5vdCBiZSBjb21wbGV0ZWx5IGZvb2xwcm9vZiBzbyB0aGUgcmVzdWx0aW5nCitleGVjdXRhYmxlcywgc2hhcmVkIGxpYnJhcmllcywgYW5kIGBgLnNvYGAgYnVuZGxlcyBzaG91bGQgYmUgY2FyZWZ1bGx5CitleGFtaW5lZCBhbmQgdGVzdGVkIG9uIGFsbCBzdXBwb3J0ZWQgc3lzdGVtcyBmb3IgcHJvcGVyIGR5bmFtaWMgbGlua2luZworZGVwZW5kZW5jaWVzLiAgSXQgaXMgc2FmZXN0IHRvIGJ1aWxkIHRoZSBkaXN0cmlidXRpb24gb24gYSBzeXN0ZW0gcnVubmluZyB0aGUKK21pbmltdW0gT1MgWCB2ZXJzaW9uIHN1cHBvcnRlZC4KIAogQWxsIG9mIHRoaXMgaXMgbm9ybWFsbHkgZG9uZSBjb21wbGV0ZWx5IGlzb2xhdGVkIGluIC90bXAvX3B5LCBzbyBpdCBkb2VzIG5vdAogdXNlIHlvdXIgbm9ybWFsIGJ1aWxkIGRpcmVjdG9yeSBub3IgZG9lcyBpdCBpbnN0YWxsIGludG8gLy4KQEAgLTI1MSwxNiArMzI5LDE2IEBACiAgICBjb25maWd1cmU6IFdBUk5JTkc6ICAgICAjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwogCiBUaGlzIGFsbW9zdCBhbHdheXMgbWVhbnMgeW91IGFyZSB0cnlpbmcgdG8gYnVpbGQgYSB1bml2ZXJzYWwgYmluYXJ5IGZvcgotUHl0aG9uIGFuZCBoYXZlIGxpYmFyaWVzIGluIGBgL3Vzci9sb2NhbGBgIHRoYXQgZG9uJ3QgY29udGFpbiB0aGUgcmVxdWlyZWQKK1B5dGhvbiBhbmQgaGF2ZSBsaWJyYXJpZXMgaW4gYGAvdXNyL2xvY2FsYGAgdGhhdCBkb24ndCBjb250YWluIHRoZSByZXF1aXJlZAogYXJjaGl0ZWN0dXJlcy4gVGVtcG9yYXJpbHkgbW92ZSBgYC91c3IvbG9jYWxgYCBhc2lkZSB0byBmaW5pc2ggdGhlIGJ1aWxkLgogCiAKIFVuaW5zdGFsbGluZyBhIGZyYW1ld29yayBpbnN0YWxsLCBpbmNsdWRpbmcgdGhlIGJpbmFyeSBpbnN0YWxsZXIKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotVW5pbnN0YWxsaW5nIGEgZnJhbWV3b3JrIGNhbiBiZSBkb25lIGJ5IG1hbnVhbGx5IHJlbW92aW5nIGFsbCBiaXRzIHRoYXQgZ290IGluc3RhbGxlZCwKLXRoYXQncyB0cnVlIGZvciBib3RoIGluc3RhbGxhdGlvbnMgZnJvbSBzb3VyY2UgYW5kIGluc3RhbGxhdGlvbnMgdXNpbmcgdGhlIGJpbmFyeSBpbnN0YWxsZXIuCi1TYWRseSBlbm91Z2ggT1NYIGRvZXMgbm90IGhhdmUgYSBjZW50cmFsIHVuaW5zdGFsbGVyLgorVW5pbnN0YWxsaW5nIGEgZnJhbWV3b3JrIGNhbiBiZSBkb25lIGJ5IG1hbnVhbGx5IHJlbW92aW5nIGFsbCBiaXRzIHRoYXQgZ290IGluc3RhbGxlZC4KK1RoYXQncyB0cnVlIGZvciBib3RoIGluc3RhbGxhdGlvbnMgZnJvbSBzb3VyY2UgYW5kIGluc3RhbGxhdGlvbnMgdXNpbmcgdGhlIGJpbmFyeSBpbnN0YWxsZXIuCitPUyBYIGRvZXMgbm90IHByb3ZpZGUgYSBjZW50cmFsIHVuaW5zdGFsbGVyLgogCiBUaGUgbWFpbiBiaXQgb2YgYSBmcmFtZXdvcmsgaW5zdGFsbCBpcyB0aGUgZnJhbWV3b3JrIGl0c2VsZiwgaW5zdGFsbGVkIGluCiBgYC9MaWJyYXJ5L0ZyYW1ld29ya3MvUHl0aG9uLmZyYW1ld29ya2BgLiBUaGlzIGNhbiBjb250YWluIG11bHRpcGxlIHZlcnNpb25zCkBAIC0yNzQsMTQgKzM1MiwxMiBAQAogQW5kIGxhc3RseSBhIGZyYW1ld29yayBpbnN0YWxsYXRpb24gaW5zdGFsbHMgZmlsZXMgaW4gYGAvdXNyL2xvY2FsL2JpbmBgLCBhbGwgb2YKIHRoZW0gc3ltYm9saWMgbGlua3MgdG8gZmlsZXMgaW4gYGAvTGlicmFyeS9GcmFtZXdvcmtzL1B5dGhvbi5mcmFtZXdvcmsvVmVyc2lvbnMvWC5ZL2JpbmBgLgogCi1PZGRzIGFuZCBlbmRzCi09PT09PT09PT09PT09CiAKLVNvbWV0aGluZyB0byB0YWtlIG5vdGUgb2YgaXMgdGhhdCB0aGUgIi5yc3JjIiBmaWxlcyBpbiB0aGUgZGlzdHJpYnV0aW9uIGFyZQotbm90IGFjdHVhbGx5IHJlc291cmNlIGZpbGVzLCB0aGV5J3JlIEFwcGxlU2luZ2xlIGVuY29kZWQgcmVzb3VyY2UgZmlsZXMuIFRoZQotbWFjcmVzb3VyY2UgbW9kdWxlIGFuZCB0aGUgTWFjL09TWC9NYWtlZmlsZSBjYXRlciBmb3IgdGhpcywgYW5kIGNyZWF0ZQotIi5yc3JjLmRmLnJzcmMiIGZpbGVzIG9uIHRoZSBmbHkgdGhhdCBhcmUgbm9ybWFsIGRhdGFmb3JrLWJhc2VkIHJlc291cmNlCi1maWxlcy4KK1Jlc291cmNlcworPT09PT09PT09CiAKLQlKYWNrIEphbnNlbiwgSmFjay5KYW5zZW5AY3dpLm5sLCAxNS1KdWwtMjAwNC4KLQlSb25hbGQgT3Vzc29yZW4sIFJvbmFsZE91c3NvcmVuQG1hYy5jb20sIDMwLUFwcmlsLTIwMTAKKyAgKiAgaHR0cDovL3d3dy5weXRob24ub3JnL2Rvd25sb2FkL21hYy8KKworICAqICBodHRwOi8vd3d3LnB5dGhvbi5vcmcvY29tbXVuaXR5L3NpZ3MvY3VycmVudC9weXRob25tYWMtc2lnLworCisgICogIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvZGV2Z3VpZGUvCmRpZmYgLS1naXQgYS9NYWMvUmVzb3VyY2VzL2FwcC9JbmZvLnBsaXN0LmluIGIvTWFjL1Jlc291cmNlcy9hcHAvSW5mby5wbGlzdC5pbgppbmRleCBiNTg2YmEwLi45M2IxYzQ0IDEwMDY0NAotLS0gYS9NYWMvUmVzb3VyY2VzL2FwcC9JbmZvLnBsaXN0LmluCisrKyBiL01hYy9SZXNvdXJjZXMvYXBwL0luZm8ucGxpc3QuaW4KQEAgLTIwLDcgKzIwLDcgQEAKIAk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgogCTxzdHJpbmc+UHl0aG9uPC9zdHJpbmc+CiAJPGtleT5DRkJ1bmRsZUdldEluZm9TdHJpbmc8L2tleT4KLQk8c3RyaW5nPiV2ZXJzaW9uJSwgKGMpIDIwMDQtMjAxMSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi48L3N0cmluZz4KKwk8c3RyaW5nPiV2ZXJzaW9uJSwgKGMpIDIwMDQtMjAxNCBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi48L3N0cmluZz4KIAk8a2V5PkNGQnVuZGxlSGVscEJvb2tGb2xkZXI8L2tleT4KIAk8YXJyYXk+CiAJCTxzdHJpbmc+RG9jdW1lbnRhdGlvbjwvc3RyaW5nPgpAQCAtMzcsNyArMzcsNyBAQAogCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KIAk8c3RyaW5nPjYuMDwvc3RyaW5nPgogCTxrZXk+Q0ZCdW5kbGVMb25nVmVyc2lvblN0cmluZzwva2V5PgotCTxzdHJpbmc+JXZlcnNpb24lLCAoYykgMjAwNC0yMDExIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLjwvc3RyaW5nPgorCTxzdHJpbmc+JXZlcnNpb24lLCAoYykgMjAwNC0yMDE0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLjwvc3RyaW5nPgogCTxrZXk+Q0ZCdW5kbGVOYW1lPC9rZXk+CiAJPHN0cmluZz5QeXRob248L3N0cmluZz4KIAk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KQEAgLTU1LDYgKzU1LDggQEAKIAk8a2V5Pk5TQXBwbGVTY3JpcHRFbmFibGVkPC9rZXk+CiAJPHRydWUvPgogCTxrZXk+TlNIdW1hblJlYWRhYmxlQ29weXJpZ2h0PC9rZXk+Ci0JPHN0cmluZz4oYykgMjAxMSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi48L3N0cmluZz4KKwk8c3RyaW5nPihjKSAyMDE0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLjwvc3RyaW5nPgorCTxrZXk+TlNIaWdoUmVzb2x1dGlvbkNhcGFibGU8L2tleT4KKwk8dHJ1ZS8+CiA8L2RpY3Q+CiA8L3BsaXN0PgpkaWZmIC0tZ2l0IGEvTWFjL1Jlc291cmNlcy9mcmFtZXdvcmsvSW5mby5wbGlzdC5pbiBiL01hYy9SZXNvdXJjZXMvZnJhbWV3b3JrL0luZm8ucGxpc3QuaW4KaW5kZXggYjViMTlkNC4uNDNhNTc0MCAxMDA2NDQKLS0tIGEvTWFjL1Jlc291cmNlcy9mcmFtZXdvcmsvSW5mby5wbGlzdC5pbgorKysgYi9NYWMvUmVzb3VyY2VzL2ZyYW1ld29yay9JbmZvLnBsaXN0LmluCkBAIC0xNyw5ICsxNyw5IEBACiAJPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+CiAJPHN0cmluZz5GTVdLPC9zdHJpbmc+CiAJPGtleT5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZzwva2V5PgotCTxzdHJpbmc+JVZFUlNJT04lLCAoYykgMjAwNC0yMDExIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLjwvc3RyaW5nPgorCTxzdHJpbmc+JVZFUlNJT04lLCAoYykgMjAwNC0yMDE0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLjwvc3RyaW5nPgogCTxrZXk+Q0ZCdW5kbGVMb25nVmVyc2lvblN0cmluZzwva2V5PgotCTxzdHJpbmc+JVZFUlNJT04lLCAoYykgMjAwNC0yMDExIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLjwvc3RyaW5nPgorCTxzdHJpbmc+JVZFUlNJT04lLCAoYykgMjAwNC0yMDE0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLjwvc3RyaW5nPgogCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KIAk8c3RyaW5nPj8/Pz88L3N0cmluZz4KIAk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgpkaWZmIC0tZ2l0IGEvTWFjL1Rvb2xzL2ZpeGFwcGxlcHl0aG9uMjMucHkgYi9NYWMvVG9vbHMvZml4YXBwbGVweXRob24yMy5weQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmRpZmYgLS1naXQgYS9NYWMvc2NyaXB0cy9idWlsZHBrZy5weSBiL01hYy9zY3JpcHRzL2J1aWxkcGtnLnB5Cm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKZGlmZiAtLWdpdCBhL01hYy9zY3JpcHRzL21rZXN0cnJlcy1tYWNlcnJvcnMuaCBiL01hYy9zY3JpcHRzL21rZXN0cnJlcy1tYWNlcnJvcnMuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9NYWMvc2NyaXB0cy96YXBweWNmaWxlcy5weSBiL01hYy9zY3JpcHRzL3phcHB5Y2ZpbGVzLnB5Cm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKZGlmZiAtLWdpdCBhL01ha2VmaWxlLnByZS5pbiBiL01ha2VmaWxlLnByZS5pbgppbmRleCBjNDRiZjFiLi5iY2Q4M2JmIDEwMDY0NAotLS0gYS9NYWtlZmlsZS5wcmUuaW4KKysrIGIvTWFrZWZpbGUucHJlLmluCkBAIC0yNyw2ICsyNywxMCBAQAogVkVSU0lPTj0JQFZFUlNJT05ACiBzcmNkaXI9CQlAc3JjZGlyQAogVlBBVEg9CQlAc3JjZGlyQAorYWJzX3NyY2Rpcj0JQGFic19zcmNkaXJACithYnNfYnVpbGRkaXI9CUBhYnNfYnVpbGRkaXJACitidWlsZD0JCUBidWlsZEAKK2hvc3Q9CQlAaG9zdEAKIAogQ0M9CQlAQ0NACiBDWFg9CQlAQ1hYQApAQCAtNTcsNiArNjEsOCBAQAogIyBBbHNvLCBtYWtpbmcgdGhlbSByZWFkLW9ubHkgc2VlbXMgdG8gYmUgYSBnb29kIGlkZWEuLi4KIElOU1RBTExfU0hBUkVEPSAke0lOU1RBTEx9IC1tIDU1NQogCitNS0RJUl9QPQlATUtESVJfUEAKKwogTUFLRVNFVFVQPSAgICAgICQoc3JjZGlyKS9Nb2R1bGVzL21ha2VzZXR1cAogCiAjIENvbXBpbGVyIG9wdGlvbnMKQEAgLTgyLDYgKzg4LDkgQEAKICMgTWFjaGluZS1kZXBlbmRlbnQgc3ViZGlyZWN0b3JpZXMKIE1BQ0hERVA9CUBNQUNIREVQQAogCisjIE11bHRpYXJjaCBkaXJlY3RvcnkgKG1heSBiZSBlbXB0eSkKK01VTFRJQVJDSD0JQE1VTFRJQVJDSEAKKwogIyBJbnN0YWxsIHByZWZpeCBmb3IgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzCiBwcmVmaXg9CQlAcHJlZml4QAogCkBAIC0xNTIsNyArMTYxLDcgQEAKIFNVQkRJUlNUT089CUluY2x1ZGUgTGliIE1pc2MgRGVtbwogCiAjIEZpbGVzIGFuZCBkaXJlY3RvcmllcyB0byBiZSBkaXN0cmlidXRlZAotQ09ORklHRklMRVM9CWNvbmZpZ3VyZSBjb25maWd1cmUuaW4gYWNjb25maWcuaCBweWNvbmZpZy5oLmluIE1ha2VmaWxlLnByZS5pbgorQ09ORklHRklMRVM9CWNvbmZpZ3VyZSBjb25maWd1cmUuYWMgYWNjb25maWcuaCBweWNvbmZpZy5oLmluIE1ha2VmaWxlLnByZS5pbgogRElTVEZJTEVTPQlSRUFETUUgQ2hhbmdlTG9nICQoQ09ORklHRklMRVMpCiBESVNURElSUz0JJChTVUJESVJTKSAkKFNVQkRJUlNUT08pIEV4dC1kdW1teQogRElTVD0JCSQoRElTVEZJTEVTKSAkKERJU1RESVJTKQpAQCAtMTgzLDYgKzE5MiwxNCBAQAogUFlUSE9OPQkJcHl0aG9uJChFWEUpCiBCVUlMRFBZVEhPTj0JcHl0aG9uJChCVUlMREVYRSkKIAorUFlUSE9OX0ZPUl9CVUlMRD1AUFlUSE9OX0ZPUl9CVUlMREAKK19QWVRIT05fSE9TVF9QTEFURk9STT1AX1BZVEhPTl9IT1NUX1BMQVRGT1JNQAorSE9TVF9HTlVfVFlQRT0gIEBob3N0QAorCisjIFRjbCBhbmQgVGsgY29uZmlnIGluZm8gZnJvbSAtLXdpdGgtdGNsdGstaW5jbHVkZXMgYW5kIC1saWJzIG9wdGlvbnMKK1RDTFRLX0lOQ0xVREVTPQlAVENMVEtfSU5DTFVERVNACitUQ0xUS19MSUJTPQlAVENMVEtfTElCU0AKKwogIyBUaGUgdGFzayB0byBydW4gd2hpbGUgaW5zdHJ1bWVudCB3aGVuIGJ1aWxkaW5nIHRoZSBwcm9maWxlLW9wdCB0YXJnZXQKIFBST0ZJTEVfVEFTSz0JJChzcmNkaXIpL1Rvb2xzL3B5YmVuY2gvcHliZW5jaC5weSAtbiAyIC0td2l0aC1nYyAtLXdpdGgtc3lzY2hlY2sKICNQUk9GSUxFX1RBU0s9CSQoc3JjZGlyKS9MaWIvdGVzdC9yZWdydGVzdC5weQpAQCAtMjA0LDggKzIyMSw4IEBACiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIEdyYW1tYXIKLUdSQU1NQVJfSD0JJChzcmNkaXIpL0luY2x1ZGUvZ3JhbWluaXQuaAotR1JBTU1BUl9DPQkkKHNyY2RpcikvUHl0aG9uL2dyYW1pbml0LmMKK0dSQU1NQVJfSD0JSW5jbHVkZS9ncmFtaW5pdC5oCitHUkFNTUFSX0M9CVB5dGhvbi9ncmFtaW5pdC5jCiBHUkFNTUFSX0lOUFVUPQkkKHNyY2RpcikvR3JhbW1hci9HcmFtbWFyCiAKIApAQCAtMjE1LDYgKzIzMiwxOSBAQAogIyBQYXJzZXIKIFBHRU49CQlQYXJzZXIvcGdlbiQoRVhFKQogCitQU1JDUz0JCVwKKwkJUGFyc2VyL2FjY2VsZXIuYyBcCisJCVBhcnNlci9ncmFtbWFyMS5jIFwKKwkJUGFyc2VyL2xpc3Rub2RlLmMgXAorCQlQYXJzZXIvbm9kZS5jIFwKKwkJUGFyc2VyL3BhcnNlci5jIFwKKwkJUGFyc2VyL3BhcnNldG9rLmMgXAorCQlQYXJzZXIvYml0c2V0LmMgXAorCQlQYXJzZXIvbWV0YWdyYW1tYXIuYyBcCisJCVBhcnNlci9maXJzdHNldHMuYyBcCisJCVBhcnNlci9ncmFtbWFyLmMgXAorCQlQYXJzZXIvcGdlbi5jCisKIFBPQkpTPQkJXAogCQlQYXJzZXIvYWNjZWxlci5vIFwKIAkJUGFyc2VyL2dyYW1tYXIxLm8gXApAQCAtMjMwLDYgKzI2MCwxNCBAQAogCiBQQVJTRVJfT0JKUz0JJChQT0JKUykgUGFyc2VyL215cmVhZGxpbmUubyBQYXJzZXIvdG9rZW5pemVyLm8KIAorUEdTUkNTPQkJXAorCQlPYmplY3RzL29ibWFsbG9jLmMgXAorCQlQeXRob24vbXlzbnByaW50Zi5jIFwKKwkJUHl0aG9uL3B5Y3R5cGUuYyBcCisJCVBhcnNlci90b2tlbml6ZXJfcGdlbi5jIFwKKwkJUGFyc2VyL3ByaW50Z3JhbW1hci5jIFwKKwkJUGFyc2VyL3BnZW5tYWluLmMKKwogUEdPQkpTPQkJXAogCQlPYmplY3RzL29ibWFsbG9jLm8gXAogCQlQeXRob24vbXlzbnByaW50Zi5vIFwKQEAgLTI0MiwxMyArMjgwLDE0IEBACiAJCVBhcnNlci9wYXJzZXIuaCBcCiAJCVBhcnNlci90b2tlbml6ZXIuaAogCi1QR0VOT0JKUz0JJChQR0VOTUFJTikgJChQT0JKUykgJChQR09CSlMpCitQR0VOU1JDUz0JJChQU1JDUykgJChQR1NSQ1MpCitQR0VOT0JKUz0JJChQT0JKUykgJChQR09CSlMpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIEFTVAotQVNUX0hfRElSPQkkKHNyY2RpcikvSW5jbHVkZQorQVNUX0hfRElSPQlJbmNsdWRlCiBBU1RfSD0JCSQoQVNUX0hfRElSKS9QeXRob24tYXN0LmgKLUFTVF9DX0RJUj0JJChzcmNkaXIpL1B5dGhvbgorQVNUX0NfRElSPQlQeXRob24KIEFTVF9DPQkJJChBU1RfQ19ESVIpL1B5dGhvbi1hc3QuYwogQVNUX0FTREw9CSQoc3JjZGlyKS9QYXJzZXIvUHl0aG9uLmFzZGwKIApAQCAtMjkwLDYgKzMyOSw3IEBACiAJCVB5dGhvbi9weW1hdGgubyBcCiAJCVB5dGhvbi9weXN0YXRlLm8gXAogCQlQeXRob24vcHl0aG9ucnVuLm8gXAorICAgICAgICAgICAgICAgIFB5dGhvbi9yYW5kb20ubyBcCiAJCVB5dGhvbi9zdHJ1Y3RtZW1iZXIubyBcCiAJCVB5dGhvbi9zeW10YWJsZS5vIFwKIAkJUHl0aG9uL3N5c21vZHVsZS5vIFwKQEAgLTM4Myw2ICs0MjMsNyBAQAogCSQoTUFLRSkgYWxsIENGTEFHUz0iJChDRkxBR1MpIC1mcHJvZmlsZS1nZW5lcmF0ZSIgTElCUz0iJChMSUJTKSAtbGdjb3YiCiAKIHJ1bl9wcm9maWxlX3Rhc2s6CisJOiAjIEZJWE1FOiBjYW4ndCBydW4gZm9yIGEgY3Jvc3MgYnVpbGQKIAkuLyQoQlVJTERQWVRIT04pICQoUFJPRklMRV9UQVNLKQogCiBidWlsZF9hbGxfdXNlX3Byb2ZpbGU6CkBAIC00MDAsMTYgKzQ0MSwyNyBAQAogCQkJTW9kdWxlcy9weXRob24ubyBcCiAJCQkkKEJMRExJQlJBUlkpICQoTElCUykgJChNT0RMSUJTKSAkKFNZU0xJQlMpICQoTERMQVNUKQogCi1wbGF0Zm9ybTogJChCVUlMRFBZVEhPTikKLQkkKFJVTlNIQVJFRCkgLi8kKEJVSUxEUFlUSE9OKSAtRSAtYyAnaW1wb3J0IHN5cyA7IGZyb20gc3lzY29uZmlnIGltcG9ydCBnZXRfcGxhdGZvcm0gOyBwcmludCBnZXRfcGxhdGZvcm0oKSsiLSIrc3lzLnZlcnNpb25bMDozXScgPnBsYXRmb3JtCitwbGF0Zm9ybTogJChCVUlMRFBZVEhPTikgcHlidWlsZGRpci50eHQKKwkkKFJVTlNIQVJFRCkgJChQWVRIT05fRk9SX0JVSUxEKSAtYyAnaW1wb3J0IHN5cyA7IGZyb20gc3lzY29uZmlnIGltcG9ydCBnZXRfcGxhdGZvcm0gOyBwcmludCBnZXRfcGxhdGZvcm0oKSsiLSIrc3lzLnZlcnNpb25bMDozXScgPnBsYXRmb3JtCiAKKyMgQ3JlYXRlIGJ1aWxkIGRpcmVjdG9yeSBhbmQgZ2VuZXJhdGUgdGhlIHN5c2NvbmZpZyBidWlsZC10aW1lIGRhdGEgdGhlcmUuCisjIHB5YnVpbGRkaXIudHh0IGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBidWlsZCBkaXIgYW5kIGlzIHVzZWQgZm9yCisjIHN5cy5wYXRoIGZpeHVwIC0tIHNlZSBNb2R1bGVzL2dldHBhdGguYy4KK3B5YnVpbGRkaXIudHh0OiAkKEJVSUxEUFlUSE9OKQorCQkkKFJVTlNIQVJFRCkgJChQWVRIT05fRk9SX0JVSUxEKSAtUyAtbSBzeXNjb25maWcgLS1nZW5lcmF0ZS1wb3NpeC12YXJzCiAKICMgQnVpbGQgdGhlIHNoYXJlZCBtb2R1bGVzCi1zaGFyZWRtb2RzOiAkKEJVSUxEUFlUSE9OKQotCUBjYXNlICQkTUFLRUZMQUdTIGluIFwKLQkqcyopICQoUlVOU0hBUkVEKSBDQz0nJChDQyknIExEU0hBUkVEPSckKEJMRFNIQVJFRCknIE9QVD0nJChPUFQpJyAuLyQoQlVJTERQWVRIT04pIC1FICQoc3JjZGlyKS9zZXR1cC5weSAtcSBidWlsZDs7IFwKLQkqKSAkKFJVTlNIQVJFRCkgQ0M9JyQoQ0MpJyBMRFNIQVJFRD0nJChCTERTSEFSRUQpJyBPUFQ9JyQoT1BUKScgLi8kKEJVSUxEUFlUSE9OKSAtRSAkKHNyY2Rpcikvc2V0dXAucHkgYnVpbGQ7OyBcCi0JZXNhYworIyBVbmRlciBHTlUgbWFrZSwgTUFLRUZMQUdTIGFyZSBzb3J0ZWQgYW5kIG5vcm1hbGl6ZWQ7IHRoZSAncycgZm9yCisjIC1zLCAtLXNpbGVudCBvciAtLXF1aWV0IGlzIGFsd2F5cyB0aGUgZmlyc3QgY2hhci4KKyMgVW5kZXIgQlNEIG1ha2UsIE1BS0VGTEFHUyBtaWdodCBiZSAiIC1zIC12IHg9eSIuCitzaGFyZWRtb2RzOiAkKEJVSUxEUFlUSE9OKSBweWJ1aWxkZGlyLnR4dAorCUBjYXNlICIkJE1BS0VGTEFHUyIgaW4gXAorCSAgICAqXCAtcyp8cyopIHF1aWV0PSItcSI7OyBcCisJICAgICopIHF1aWV0PSIiOzsgXAorCWVzYWM7IFwKKwkkKFJVTlNIQVJFRCkgQ0M9JyQoQ0MpJyBMRFNIQVJFRD0nJChCTERTSEFSRUQpJyBPUFQ9JyQoT1BUKScgXAorCQlfVENMVEtfSU5DTFVERVM9JyQoVENMVEtfSU5DTFVERVMpJyBfVENMVEtfTElCUz0nJChUQ0xUS19MSUJTKScgXAorCQkkKFBZVEhPTl9GT1JfQlVJTEQpICQoc3JjZGlyKS9zZXR1cC5weSAkJHF1aWV0IGJ1aWxkCiAKICMgQnVpbGQgc3RhdGljIGxpYnJhcnkKICMgYXZvaWQgbG9uZyBjb21tYW5kIGxpbmVzLCBzYW1lIGFzIExJQlJBUllfT0JKUwpAQCAtNDMzLDcgKzQ4NSw3IEBACiAKIGxpYnB5dGhvbiQoVkVSU0lPTikuZHlsaWI6ICQoTElCUkFSWV9PQkpTKQogCSAkKENDKSAtZHluYW1pY2xpYiAtV2wsLXNpbmdsZV9tb2R1bGUgJChMREZMQUdTKSAtdW5kZWZpbmVkIGR5bmFtaWNfbG9va3VwIC1XbCwtaW5zdGFsbF9uYW1lLCQocHJlZml4KS9saWIvbGlicHl0aG9uJChWRVJTSU9OKS5keWxpYiAtV2wsLWNvbXBhdGliaWxpdHlfdmVyc2lvbiwkKFZFUlNJT04pIC1XbCwtY3VycmVudF92ZXJzaW9uLCQoVkVSU0lPTikgLW8gJEAgJChMSUJSQVJZX09CSlMpICQoU0hMSUJTKSAkKExJQkMpICQoTElCTSkgJChMRExBU1QpOyBcCi0JCSAKKwogCiBsaWJweXRob24kKFZFUlNJT04pLnNsOiAkKExJQlJBUllfT0JKUykKIAkkKExEU0hBUkVEKSAtbyAkQCAkKExJQlJBUllfT0JKUykgJChNT0RMSUJTKSAkKFNITElCUykgJChMSUJDKSAkKExJQk0pICQoTERMQVNUKQpAQCAtNTM3LDEzICs1ODksMTkgQEAKIE1vZHVsZXMvcHl0aG9uLm86ICQoc3JjZGlyKS9Nb2R1bGVzL3B5dGhvbi5jCiAJJChNQUlOQ0MpIC1jICQoUFlfQ0ZMQUdTKSAtbyAkQCAkKHNyY2RpcikvTW9kdWxlcy9weXRob24uYwogCitNb2R1bGVzL3Bvc2l4bW9kdWxlLm86ICQoc3JjZGlyKS9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmMgJChzcmNkaXIpL01vZHVsZXMvcG9zaXhtb2R1bGUuaAogCi0jIFVzZSBhIHN0YW1wIGZpbGUgdG8gcHJldmVudCBtYWtlIC1qIGludm9raW5nIHBnZW4gdHdpY2UKLSQoR1JBTU1BUl9IKSAkKEdSQU1NQVJfQyk6IFBhcnNlci9wZ2VuLnN0YW1wCi1QYXJzZXIvcGdlbi5zdGFtcDogJChQR0VOKSAkKEdSQU1NQVJfSU5QVVQpCi0JCS1AJChJTlNUQUxMKSAtZCBJbmNsdWRlCitNb2R1bGVzL2dycG1vZHVsZS5vOiAkKHNyY2RpcikvTW9kdWxlcy9ncnBtb2R1bGUuYyAkKHNyY2RpcikvTW9kdWxlcy9wb3NpeG1vZHVsZS5oCisKK01vZHVsZXMvcHdkbW9kdWxlLm86ICQoc3JjZGlyKS9Nb2R1bGVzL3B3ZG1vZHVsZS5jICQoc3JjZGlyKS9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmgKKworJChHUkFNTUFSX0gpOiAkKEdSQU1NQVJfSU5QVVQpICQoUEdFTlNSQ1MpCisJCUAkKE1LRElSX1ApIEluY2x1ZGUKKwkJJChNQUtFKSAkKFBHRU4pCiAJCSQoUEdFTikgJChHUkFNTUFSX0lOUFVUKSAkKEdSQU1NQVJfSCkgJChHUkFNTUFSX0MpCi0JCS10b3VjaCBQYXJzZXIvcGdlbi5zdGFtcAorJChHUkFNTUFSX0MpOiAkKEdSQU1NQVJfSCkgJChHUkFNTUFSX0lOUFVUKSAkKFBHRU5TUkNTKQorCQkkKE1BS0UpICQoR1JBTU1BUl9IKQorCQl0b3VjaCAkKEdSQU1NQVJfQykKIAogJChQR0VOKToJJChQR0VOT0JKUykKIAkJJChDQykgJChPUFQpICQoTERGTEFHUykgJChQR0VOT0JKUykgJChMSUJTKSAtbyAkKFBHRU4pCkBAIC01NTgsOSArNjE2LDExIEBACiBQYXJzZXIvcGdlbm1haW4ubzoJJChzcmNkaXIpL0luY2x1ZGUvcGFyc2V0b2suaAogCiAkKEFTVF9IKTogJChBU1RfQVNETCkgJChBU0RMR0VOX0ZJTEVTKQorCSQoTUtESVJfUCkgJChBU1RfSF9ESVIpCiAJJChBU0RMR0VOKSAtaCAkKEFTVF9IX0RJUikgJChBU1RfQVNETCkKIAogJChBU1RfQyk6ICQoQVNUX0FTREwpICQoQVNETEdFTl9GSUxFUykKKwkkKE1LRElSX1ApICQoQVNUX0NfRElSKQogCSQoQVNETEdFTikgLWMgJChBU1RfQ19ESVIpICQoQVNUX0FTREwpCiAKIFB5dGhvbi9jb21waWxlLm8gUHl0aG9uL3N5bXRhYmxlLm8gUHl0aG9uL2FzdC5vOiAkKEdSQU1NQVJfSCkgJChBU1RfSCkKQEAgLTY5MCw3ICs3NTAsOCBAQAogCQlJbmNsdWRlL3dhcm5pbmdzLmggXAogCQlJbmNsdWRlL3dlYWtyZWZvYmplY3QuaCBcCiAJCXB5Y29uZmlnLmggXAotCQkkKFBBUlNFUl9IRUFERVJTKQorCQkkKFBBUlNFUl9IRUFERVJTKSBcCisJCSQoQVNUX0gpCiAKICQoTElCUkFSWV9PQkpTKSAkKE1PRE9CSlMpIE1vZHVsZXMvcHl0aG9uLm86ICQoUFlUSE9OX0hFQURFUlMpCiAKQEAgLTczOSw3ICs4MDAsNyBAQAogCQktQGlmIHdoaWNoIHB5YnVpbGRib3QuaWRlbnRpZnkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKIAkJCXB5YnVpbGRib3QuaWRlbnRpZnkgIkNDPSckKENDKSciICJDWFg9JyQoQ1hYKSciOyBcCiAJCWZpCi0JCSQoVEVTVFBZVEhPTikgJChURVNUUFJPRykgLXVhbGwgLXJ3VyAkKFRFU1RPUFRTKQorCQkkKFRFU1RQWVRIT04pIC1SICQoVEVTVFBST0cpIC11YWxsIC1yd1cgJChURVNUT1BUUykKIAogUVVJQ0tURVNUT1BUUz0JJChURVNUT1BUUykgLXggdGVzdF9zdWJwcm9jZXNzIHRlc3RfaW8gdGVzdF9saWIydG8zIFwKIAkJdGVzdF9tdWx0aWJ5dGVjb2RlYyB0ZXN0X3VybGxpYjJfbG9jYWxuZXQgdGVzdF9pdGVydG9vbHMgXApAQCAtNzYxLDcgKzgyMiw4IEBACiBpbnN0YWxsOglARlJBTUVXT1JLSU5TVEFMTEZJUlNUQCBhbHRpbnN0YWxsIGJpbmluc3RhbGwgbWFuaW5zdGFsbCBARlJBTUVXT1JLSU5TVEFMTExBU1RACiAKICMgSW5zdGFsbCBhbG1vc3QgZXZlcnl0aGluZyB3aXRob3V0IGRpc3R1cmJpbmcgcHJldmlvdXMgdmVyc2lvbnMKLWFsdGluc3RhbGw6CUBGUkFNRVdPUktBTFRJTlNUQUxMRklSU1RAIGFsdGJpbmluc3RhbGwgbGliaW5zdGFsbCBpbmNsaW5zdGFsbCBsaWJhaW5zdGFsbCBcCithbHRpbnN0YWxsOglARlJBTUVXT1JLQUxUSU5TVEFMTEZJUlNUQCBhbHRiaW5pbnN0YWxsIGxpYmluc3RhbGwgaW5jbGluc3RhbGwgXAorCQkJCWxpYmFpbnN0YWxsIGFsdG1hbmluc3RhbGwgXAogICAgICAgICAgICAgICAgIHNoYXJlZGluc3RhbGwgb2xkc2hhcmVkaW5zdGFsbCBARlJBTUVXT1JLQUxUSU5TVEFMTExBU1RACiAKICMgSW5zdGFsbCBzaGFyZWQgbGlicmFyaWVzIGVuYWJsZWQgYnkgU2V0dXAKQEAgLTc4NiwxOCArODQ4LDI2IEBACiAJCWRvbmUKIAogCi0jIEluc3RhbGwgdGhlIGludGVycHJldGVyIChieSBjcmVhdGluZyBhIGhhcmQgbGluayB0byBweXRob24kKFZFUlNJT04pKQorIyBJbnN0YWxsIHRoZSBpbnRlcnByZXRlciBieSBjcmVhdGluZyBhIHN5bWxpbmsgY2hhaW46CisjICAkKFBZVEhPTikgLT4gcHl0aG9uMiAtPiBweXRob24kKFZFUlNJT04pKQorIyBBbHNvIGNyZWF0ZSBlcXVpdmFsZW50IGNoYWlucyBmb3Igb3RoZXIgaW5zdGFsbGVkIGZpbGVzCiBiaW5pbnN0YWxsOglhbHRiaW5pbnN0YWxsCiAJLWlmIHRlc3QgLWYgJChERVNURElSKSQoQklORElSKS8kKFBZVEhPTikgLW8gLWggJChERVNURElSKSQoQklORElSKS8kKFBZVEhPTik7IFwKIAl0aGVuIHJtIC1mICQoREVTVERJUikkKEJJTkRJUikvJChQWVRIT04pOyBcCiAJZWxzZSB0cnVlOyBcCiAJZmkKLQkoY2QgJChERVNURElSKSQoQklORElSKTsgJChMTikgcHl0aG9uJChWRVJTSU9OKSQoRVhFKSAkKFBZVEhPTikpCisJKGNkICQoREVTVERJUikkKEJJTkRJUik7ICQoTE4pIC1zIHB5dGhvbjIkKEVYRSkgJChQWVRIT04pKQorCS1ybSAtZiAkKERFU1RESVIpJChCSU5ESVIpL3B5dGhvbjIkKEVYRSkKKwkoY2QgJChERVNURElSKSQoQklORElSKTsgJChMTikgLXMgcHl0aG9uJChWRVJTSU9OKSQoRVhFKSBweXRob24yJChFWEUpKQorCS1ybSAtZiAkKERFU1RESVIpJChCSU5ESVIpL3B5dGhvbjItY29uZmlnCisJKGNkICQoREVTVERJUikkKEJJTkRJUik7ICQoTE4pIC1zIHB5dGhvbiQoVkVSU0lPTiktY29uZmlnIHB5dGhvbjItY29uZmlnKQogCS1ybSAtZiAkKERFU1RESVIpJChCSU5ESVIpL3B5dGhvbi1jb25maWcKLQkoY2QgJChERVNURElSKSQoQklORElSKTsgJChMTikgLXMgcHl0aG9uJChWRVJTSU9OKS1jb25maWcgcHl0aG9uLWNvbmZpZykKKwkoY2QgJChERVNURElSKSQoQklORElSKTsgJChMTikgLXMgcHl0aG9uMi1jb25maWcgcHl0aG9uLWNvbmZpZykKIAktdGVzdCAtZCAkKERFU1RESVIpJChMSUJQQykgfHwgJChJTlNUQUxMKSAtZCAtbSAkKERJUk1PREUpICQoREVTVERJUikkKExJQlBDKQorCS1ybSAtZiAkKERFU1RESVIpJChMSUJQQykvcHl0aG9uMi5wYworCShjZCAkKERFU1RESVIpJChMSUJQQyk7ICQoTE4pIC1zIHB5dGhvbi0kKFZFUlNJT04pLnBjIHB5dGhvbjIucGMpCiAJLXJtIC1mICQoREVTVERJUikkKExJQlBDKS9weXRob24ucGMKLQkoY2QgJChERVNURElSKSQoTElCUEMpOyAkKExOKSAtcyBweXRob24tJChWRVJTSU9OKS5wYyBweXRob24ucGMpCisJKGNkICQoREVTVERJUikkKExJQlBDKTsgJChMTikgLXMgcHl0aG9uMi5wYyBweXRob24ucGMpCiAKICMgSW5zdGFsbCB0aGUgaW50ZXJwcmV0ZXIgd2l0aCAkKFZFUlNJT04pIGFmZml4ZWQKICMgVGhpcyBnb2VzIGludG8gJChleGVjX3ByZWZpeCkKQEAgLTgyMyw4ICs4OTMsOCBAQAogCWVsc2UJdHJ1ZTsgXAogCWZpCiAKLSMgSW5zdGFsbCB0aGUgbWFudWFsIHBhZ2UKLW1hbmluc3RhbGw6CisjIEluc3RhbGwgdGhlIHZlcnNpb25lZCBtYW51YWwgcGFnZQorYWx0bWFuaW5zdGFsbDoKIAlAZm9yIGkgaW4gJChNQU5ESVIpICQoTUFORElSKS9tYW4xOyBcCiAJZG8gXAogCQlpZiB0ZXN0ICEgLWQgJChERVNURElSKSQkaTsgdGhlbiBcCkBAIC04MzYsNiArOTA2LDEzIEBACiAJJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9NaXNjL3B5dGhvbi5tYW4gXAogCQkkKERFU1RESVIpJChNQU5ESVIpL21hbjEvcHl0aG9uJChWRVJTSU9OKS4xCiAKKyMgSW5zdGFsbCB0aGUgdW52ZXJzaW9uZWQgbWFudWFsIHBhZ2VzCittYW5pbnN0YWxsOglhbHRtYW5pbnN0YWxsCisJLXJtIC1mICQoREVTVERJUikkKE1BTkRJUikvbWFuMS9weXRob24yLjEKKwkoY2QgJChERVNURElSKSQoTUFORElSKS9tYW4xOyAkKExOKSAtcyBweXRob24kKFZFUlNJT04pLjEgcHl0aG9uMi4xKQorCS1ybSAtZiAkKERFU1RESVIpJChNQU5ESVIpL21hbjEvcHl0aG9uLjEKKwkoY2QgJChERVNURElSKSQoTUFORElSKS9tYW4xOyAkKExOKSAtcyBweXRob24yLjEgcHl0aG9uLjEpCisKICMgSW5zdGFsbCB0aGUgbGlicmFyeQogUExBVERJUj0JcGxhdC0kKE1BQ0hERVApCiBFWFRSQVBMQVRESVI9IEBFWFRSQVBMQVRESVJACkBAIC04NTAsMTEgKzkyNywxMyBAQAogCXBsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZSBcCiAJcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcyBcCiAJcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cyBcCi0JcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1Rlcm1pbmFsIAorCXBsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9UZXJtaW5hbAogUExBVE1BQ1BBVEg9OnBsYXQtbWFjOnBsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcwogTElCU1VCRElSUz0JbGliLXRrIGxpYi10ay90ZXN0IGxpYi10ay90ZXN0L3Rlc3RfdGtpbnRlciBcCi0JCWxpYi10ay90ZXN0L3Rlc3RfdHRrIHNpdGUtcGFja2FnZXMgdGVzdCB0ZXN0L2RhdGEgXAotCQl0ZXN0L2Nqa2VuY29kaW5ncyB0ZXN0L2RlY2ltYWx0ZXN0ZGF0YSB0ZXN0L3htbHRlc3RkYXRhIHRlc3Qvc3VicHJvY2Vzc2RhdGEgXAorCQlsaWItdGsvdGVzdC90ZXN0X3R0ayBzaXRlLXBhY2thZ2VzIHRlc3QgdGVzdC9hdWRpb2RhdGEgdGVzdC9kYXRhIFwKKwkJdGVzdC9jamtlbmNvZGluZ3MgdGVzdC9kZWNpbWFsdGVzdGRhdGEgdGVzdC94bWx0ZXN0ZGF0YSBcCisJCXRlc3QvaW1naGRyZGF0YSBcCisJCXRlc3Qvc3VicHJvY2Vzc2RhdGEgXAogCQl0ZXN0L3RyYWNlZG1vZHVsZXMgXAogCQllbmNvZGluZ3MgY29tcGlsZXIgaG90c2hvdCBcCiAJCWVtYWlsIGVtYWlsL21pbWUgZW1haWwvdGVzdCBlbWFpbC90ZXN0L2RhdGEgXApAQCAtODYzLDcgKzk0Miw4IEBACiAJCWxvZ2dpbmcgYnNkZGIgYnNkZGIvdGVzdCBjc3YgaW1wb3J0bGliIHdzZ2lyZWYgXAogCQlsaWIydG8zIGxpYjJ0bzMvZml4ZXMgbGliMnRvMy9wZ2VuMiBsaWIydG8zL3Rlc3RzIFwKIAkJbGliMnRvMy90ZXN0cy9kYXRhIGxpYjJ0bzMvdGVzdHMvZGF0YS9maXhlcnMgbGliMnRvMy90ZXN0cy9kYXRhL2ZpeGVycy9teWZpeGVzIFwKLQkJY3R5cGVzIGN0eXBlcy90ZXN0IGN0eXBlcy9tYWNob2xpYiBpZGxlbGliIGlkbGVsaWIvSWNvbnMgXAorCQljdHlwZXMgY3R5cGVzL3Rlc3QgY3R5cGVzL21hY2hvbGliIFwKKwkJaWRsZWxpYiBpZGxlbGliL0ljb25zIGlkbGVsaWIvaWRsZV90ZXN0IFwKIAkJZGlzdHV0aWxzIGRpc3R1dGlscy9jb21tYW5kIGRpc3R1dGlscy90ZXN0cyAkKFhNTExJQlNVQkRJUlMpIFwKIAkJbXVsdGlwcm9jZXNzaW5nIG11bHRpcHJvY2Vzc2luZy9kdW1teSBcCiAJCXVuaXR0ZXN0IHVuaXR0ZXN0L3Rlc3QgXApAQCAtODg5LDcgKzk2OSw3IEBACiAJCWVsc2UJdHJ1ZTsgXAogCQlmaTsgXAogCWRvbmUKLQlAZm9yIGkgaW4gJChzcmNkaXIpL0xpYi8qLnB5ICQoc3JjZGlyKS9MaWIvKi5kb2MgJChzcmNkaXIpL0xpYi8qLmVnZy1pbmZvIDsgXAorCUBmb3IgaSBpbiAkKHNyY2RpcikvTGliLyoucHkgYGNhdCBweWJ1aWxkZGlyLnR4dGAvX3N5c2NvbmZpZ2RhdGEucHkgJChzcmNkaXIpL0xpYi8qLmRvYyAkKHNyY2RpcikvTGliLyouZWdnLWluZm8gOyBcCiAJZG8gXAogCQlpZiB0ZXN0IC14ICQkaTsgdGhlbiBcCiAJCQkkKElOU1RBTExfU0NSSVBUKSAkJGkgJChERVNURElSKSQoTElCREVTVCk7IFwKQEAgLTkzMCwzNCArMTAxMCw0MyBAQAogCQkJJChERVNURElSKSQoTElCREVTVCkvZGlzdHV0aWxzL3Rlc3RzIDsgXAogCWZpCiAJUFlUSE9OUEFUSD0kKERFU1RESVIpJChMSUJERVNUKSAgJChSVU5TSEFSRUQpIFwKLQkJLi8kKEJVSUxEUFlUSE9OKSAtV2kgLXR0ICQoREVTVERJUikkKExJQkRFU1QpL2NvbXBpbGVhbGwucHkgXAorCQkkKFBZVEhPTl9GT1JfQlVJTEQpIC1XaSAtdHQgJChERVNURElSKSQoTElCREVTVCkvY29tcGlsZWFsbC5weSBcCiAJCS1kICQoTElCREVTVCkgLWYgXAogCQkteCAnYmFkX2NvZGluZ3xiYWRzeW50YXh8c2l0ZS1wYWNrYWdlc3xsaWIydG8zL3Rlc3RzL2RhdGEnIFwKIAkJJChERVNURElSKSQoTElCREVTVCkKIAlQWVRIT05QQVRIPSQoREVTVERJUikkKExJQkRFU1QpICQoUlVOU0hBUkVEKSBcCi0JCS4vJChCVUlMRFBZVEhPTikgLVdpIC10dCAtTyAkKERFU1RESVIpJChMSUJERVNUKS9jb21waWxlYWxsLnB5IFwKKwkJJChQWVRIT05fRk9SX0JVSUxEKSAtV2kgLXR0IC1PICQoREVTVERJUikkKExJQkRFU1QpL2NvbXBpbGVhbGwucHkgXAogCQktZCAkKExJQkRFU1QpIC1mIFwKIAkJLXggJ2JhZF9jb2Rpbmd8YmFkc3ludGF4fHNpdGUtcGFja2FnZXN8bGliMnRvMy90ZXN0cy9kYXRhJyBcCiAJCSQoREVTVERJUikkKExJQkRFU1QpCiAJLVBZVEhPTlBBVEg9JChERVNURElSKSQoTElCREVTVCkgICQoUlVOU0hBUkVEKSBcCi0JCS4vJChCVUlMRFBZVEhPTikgLVdpIC10ICQoREVTVERJUikkKExJQkRFU1QpL2NvbXBpbGVhbGwucHkgXAorCQkkKFBZVEhPTl9GT1JfQlVJTEQpIC1XaSAtdCAkKERFU1RESVIpJChMSUJERVNUKS9jb21waWxlYWxsLnB5IFwKIAkJLWQgJChMSUJERVNUKS9zaXRlLXBhY2thZ2VzIC1mIFwKIAkJLXggYmFkc3ludGF4ICQoREVTVERJUikkKExJQkRFU1QpL3NpdGUtcGFja2FnZXMKIAktUFlUSE9OUEFUSD0kKERFU1RESVIpJChMSUJERVNUKSAkKFJVTlNIQVJFRCkgXAotCQkuLyQoQlVJTERQWVRIT04pIC1XaSAtdCAtTyAkKERFU1RESVIpJChMSUJERVNUKS9jb21waWxlYWxsLnB5IFwKKwkJJChQWVRIT05fRk9SX0JVSUxEKSAtV2kgLXQgLU8gJChERVNURElSKSQoTElCREVTVCkvY29tcGlsZWFsbC5weSBcCiAJCS1kICQoTElCREVTVCkvc2l0ZS1wYWNrYWdlcyAtZiBcCiAJCS14IGJhZHN5bnRheCAkKERFU1RESVIpJChMSUJERVNUKS9zaXRlLXBhY2thZ2VzCiAJLVBZVEhPTlBBVEg9JChERVNURElSKSQoTElCREVTVCkgJChSVU5TSEFSRUQpIFwKLQkJLi8kKEJVSUxEUFlUSE9OKSAtV2kgLXQgLWMgImltcG9ydCBsaWIydG8zLnB5Z3JhbSwgbGliMnRvMy5wYXRjb21wO2xpYjJ0bzMucGF0Y29tcC5QYXR0ZXJuQ29tcGlsZXIoKSIKKwkJJChQWVRIT05fRk9SX0JVSUxEKSAtbSBsaWIydG8zLnBnZW4yLmRyaXZlciAkKERFU1RESVIpJChMSUJERVNUKS9saWIydG8zL0dyYW1tYXIudHh0CisJLVBZVEhPTlBBVEg9JChERVNURElSKSQoTElCREVTVCkgJChSVU5TSEFSRUQpIFwKKwkJJChQWVRIT05fRk9SX0JVSUxEKSAtbSBsaWIydG8zLnBnZW4yLmRyaXZlciAkKERFU1RESVIpJChMSUJERVNUKS9saWIydG8zL1BhdHRlcm5HcmFtbWFyLnR4dAogCiAjIENyZWF0ZSB0aGUgUExBVERJUiBzb3VyY2UgZGlyZWN0b3J5LCBpZiBvbmUgd2Fzbid0IGRpc3RyaWJ1dGVkLi4KICQoc3JjZGlyKS9MaWIvJChQTEFURElSKToKIAlta2RpciAkKHNyY2RpcikvTGliLyQoUExBVERJUikKIAljcCAkKHNyY2RpcikvTGliL3BsYXQtZ2VuZXJpYy9yZWdlbiAkKHNyY2RpcikvTGliLyQoUExBVERJUikvcmVnZW4KIAlleHBvcnQgUEFUSDsgUEFUSD0iYHB3ZGA6JCRQQVRIIjsgXAotCWV4cG9ydCBQWVRIT05QQVRIOyBQWVRIT05QQVRIPSJgcHdkYC9MaWIiOyBcCisJZXhwb3J0IFBZVEhPTlBBVEg7IFBZVEhPTlBBVEg9IiQoc3JjZGlyKS9MaWI6JChhYnNfYnVpbGRkaXIpL2BjYXQgcHlidWlsZGRpci50eHRgIjsgXAogCWV4cG9ydCBEWUxEX0ZSQU1FV09SS19QQVRIOyBEWUxEX0ZSQU1FV09SS19QQVRIPSJgcHdkYCI7IFwKIAlleHBvcnQgRVhFOyBFWEU9IiQoQlVJTERFWEUpIjsgXAorCWlmIFsgLW4gIiQoTVVMVElBUkNIKSIgXTsgdGhlbiBleHBvcnQgTVVMVElBUkNIOyBNVUxUSUFSQ0g9JChNVUxUSUFSQ0gpOyBmaTsgXAorCWV4cG9ydCBQWVRIT05fRk9SX0JVSUxEOyBcCisJaWYgWyAiJChidWlsZCkiID0gIiQoaG9zdCkiIF07IHRoZW4gXAorCSAgUFlUSE9OX0ZPUl9CVUlMRD0iJChCVUlMRFBZVEhPTikiOyBcCisJZWxzZSBcCisJICBQWVRIT05fRk9SX0JVSUxEPSIkKFBZVEhPTl9GT1JfQlVJTEQpIjsgXAorCWZpOyBcCiAJY2QgJChzcmNkaXIpL0xpYi8kKFBMQVRESVIpOyAkKFJVTlNIQVJFRCkgLi9yZWdlbgogCiBweXRob24tY29uZmlnOiAkKHNyY2RpcikvTWlzYy9weXRob24tY29uZmlnLmluCkBAIC0xMDUzLDExICsxMTQyLDEyIEBACiAjIEluc3RhbGwgdGhlIGR5bmFtaWNhbGx5IGxvYWRhYmxlIG1vZHVsZXMKICMgVGhpcyBnb2VzIGludG8gJChleGVjX3ByZWZpeCkKIHNoYXJlZGluc3RhbGw6IHNoYXJlZG1vZHMKLQkkKFJVTlNIQVJFRCkgLi8kKEJVSUxEUFlUSE9OKSAtRSAkKHNyY2Rpcikvc2V0dXAucHkgaW5zdGFsbCBcCisJJChSVU5TSEFSRUQpICQoUFlUSE9OX0ZPUl9CVUlMRCkgJChzcmNkaXIpL3NldHVwLnB5IGluc3RhbGwgXAogCSAgIAktLXByZWZpeD0kKHByZWZpeCkgXAogCQktLWluc3RhbGwtc2NyaXB0cz0kKEJJTkRJUikgXAogCQktLWluc3RhbGwtcGxhdGxpYj0kKERFU1RTSEFSRUQpIFwKIAkJLS1yb290PSQoREVTVERJUikvCisJLXJtICQoREVTVERJUikkKERFU1RTSEFSRUQpL19zeXNjb25maWdkYXRhLnB5KgogCiAjIEhlcmUgYXJlIGEgY291cGxlIG9mIHRhcmdldHMgZm9yIE1hY09TWCBhZ2FpbiwgdG8gaW5zdGFsbCBhIGZ1bGwKICMgZnJhbWV3b3JrLWJhc2VkIFB5dGhvbi4gZnJhbWV3b3JraW5zdGFsbCBpbnN0YWxscyBldmVyeXRoaW5nLCB0aGUKQEAgLTExMjYsNyArMTIxNiw3IEBACiAjIFRoaXMgaW5zdGFsbHMgYSBmZXcgb2YgdGhlIHVzZWZ1bCBzY3JpcHRzIGluIFRvb2xzL3NjcmlwdHMKIHNjcmlwdHNpbnN0YWxsOgogCVNSQ0RJUj0kKHNyY2RpcikgJChSVU5TSEFSRUQpIFwKLQkuLyQoQlVJTERQWVRIT04pICQoc3JjZGlyKS9Ub29scy9zY3JpcHRzL3NldHVwLnB5IGluc3RhbGwgXAorCSQoUFlUSE9OX0ZPUl9CVUlMRCkgJChzcmNkaXIpL1Rvb2xzL3NjcmlwdHMvc2V0dXAucHkgaW5zdGFsbCBcCiAJLS1wcmVmaXg9JChwcmVmaXgpIFwKIAktLWluc3RhbGwtc2NyaXB0cz0kKEJJTkRJUikgXAogCS0tcm9vdD0kKERFU1RESVIpLwpAQCAtMTE1Niw3ICsxMjQ2LDcgQEAKIAkkKFNIRUxMKSBjb25maWcuc3RhdHVzIC0tcmVjaGVjawogCSQoU0hFTEwpIGNvbmZpZy5zdGF0dXMKIAotIyBSZWJ1aWxkIHRoZSBjb25maWd1cmUgc2NyaXB0IGZyb20gY29uZmlndXJlLmluOyBhbHNvIHJlYnVpbGQgcHljb25maWcuaC5pbgorIyBSZWJ1aWxkIHRoZSBjb25maWd1cmUgc2NyaXB0IGZyb20gY29uZmlndXJlLmFjOyBhbHNvIHJlYnVpbGQgcHljb25maWcuaC5pbgogYXV0b2NvbmY6CiAJKGNkICQoc3JjZGlyKTsgYXV0b2NvbmYpCiAJKGNkICQoc3JjZGlyKTsgYXV0b2hlYWRlcikKQEAgLTExNzUsNiArMTI2NSwxMSBAQAogCWV0YWdzIEluY2x1ZGUvKi5oOyBcCiAJZm9yIGkgaW4gJChTUkNESVJTKTsgZG8gZXRhZ3MgLWEgJCRpLyouW2NoXTsgZG9uZQogCisjIFRvdWNoIGdlbmVyYXRlZCBmaWxlcwordG91Y2g6CisJY2QgJChzcmNkaXIpOyBcCisJdG91Y2ggSW5jbHVkZS9QeXRob24tYXN0LmggUHl0aG9uL1B5dGhvbi1hc3QuYworCiAjIFNhbml0YXRpb24gdGFyZ2V0cyAtLSBjbGVhbiBsZWF2ZXMgbGlicmFyaWVzLCBleGVjdXRhYmxlcyBhbmQgdGFncwogIyBmaWxlcywgd2hpY2ggY2xvYmJlciByZW1vdmVzIGFzIHdlbGwKIHB5Y3JlbW92YWw6CkBAIC0xMTkzLDcgKzEyODgsNyBAQAogCiBjbG9iYmVyOiBjbGVhbiBwcm9maWxlLXJlbW92YWwKIAktcm0gLWYgJChCVUlMRFBZVEhPTikgJChQR0VOKSAkKExJQlJBUlkpICQoTERMSUJSQVJZKSAkKERMTExJQlJBUlkpIFwKLQkJdGFncyBUQUdTIFBhcnNlci9wZ2VuLnN0YW1wIFwKKwkJdGFncyBUQUdTIFwKIAkJY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgcHljb25maWcuaCBNb2R1bGVzL2NvbmZpZy5jCiAJLXJtIC1yZiBidWlsZCBwbGF0Zm9ybQogCS1ybSAtcmYgJChQWVRIT05GUkFNRVdPUktESVIpCkBAIC0xMjA5LDExICsxMzA0LDEyIEBACiAJCU1vZHVsZXMvU2V0dXAgTW9kdWxlcy9TZXR1cC5sb2NhbCBNb2R1bGVzL1NldHVwLmNvbmZpZyBcCiAJCU1vZHVsZXMvbGRfc29fYWl4IE1vZHVsZXMvcHl0aG9uLmV4cCBNaXNjL3B5dGhvbi5wYwogCS1ybSAtZiBweXRob24qLWdkYi5weQotCWZpbmQgJChzcmNkaXIpICcoJyAtbmFtZSAnKi5mZGMnIC1vIC1uYW1lICcqficgXAotCQkJICAgLW8gLW5hbWUgJ1tALCNdKicgLW8gLW5hbWUgJyoub2xkJyBcCi0JCQkgICAtbyAtbmFtZSAnKi5vcmlnJyAtbyAtbmFtZSAnKi5yZWonIFwKLQkJCSAgIC1vIC1uYW1lICcqLmJhaycgJyknIFwKLQkJCSAgIC1leGVjIHJtIC1mIHt9ICc7JworCS1ybSAtZiBweWJ1aWxkZGlyLnR4dAorCWZpbmQgJChzcmNkaXIpL1thLXpBLVpdKiAnKCcgLW5hbWUgJyouZmRjJyAtbyAtbmFtZSAnKn4nIFwKKwkJCQkgICAgIC1vIC1uYW1lICdbQCwjXSonIC1vIC1uYW1lICcqLm9sZCcgXAorCQkJCSAgICAgLW8gLW5hbWUgJyoub3JpZycgLW8gLW5hbWUgJyoucmVqJyBcCisJCQkJICAgICAtbyAtbmFtZSAnKi5iYWsnICcpJyBcCisJCQkJICAgICAtZXhlYyBybSAtZiB7fSAnOycKIAogIyBDaGVjayBmb3Igc21lbGx5IGV4cG9ydGVkIHN5bWJvbHMgKG5vdCBzdGFydGluZyB3aXRoIFB5L19QeSkKIHNtZWxseTogYWxsCkBAIC0xMjYzLDggKzEzNTksOCBAQAogLlBIT05ZOiBtYW5pbnN0YWxsIGxpYmluc3RhbGwgaW5jbGluc3RhbGwgbGliYWluc3RhbGwgc2hhcmVkaW5zdGFsbAogLlBIT05ZOiBmcmFtZXdvcmtpbnN0YWxsIGZyYW1ld29ya2luc3RhbGxmcmFtZXdvcmsgZnJhbWV3b3JraW5zdGFsbHN0cnVjdHVyZQogLlBIT05ZOiBmcmFtZXdvcmtpbnN0YWxsbWFjbGliIGZyYW1ld29ya2luc3RhbGxhcHBzIGZyYW1ld29ya2luc3RhbGx1bml4dG9vbHMKLS5QSE9OWTogZnJhbWV3b3JrYWx0aW5zdGFsbHVuaXh0b29scyByZWNoZWNrIGF1dG9jb25mIGNsZWFuIGNsb2JiZXIgZGlzdGNsZWFuIAotLlBIT05ZOiBzbWVsbHkgZnVubnkgcGF0Y2hjaGVjaworLlBIT05ZOiBmcmFtZXdvcmthbHRpbnN0YWxsdW5peHRvb2xzIHJlY2hlY2sgYXV0b2NvbmYgY2xlYW4gY2xvYmJlciBkaXN0Y2xlYW4KKy5QSE9OWTogc21lbGx5IGZ1bm55IHBhdGNoY2hlY2sgdG91Y2ggYWx0bWFuaW5zdGFsbAogLlBIT05ZOiBnZGJob29rcwogCiAjIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVkKZGlmZiAtLWdpdCBhL01pc2MvQUNLUyBiL01pc2MvQUNLUwppbmRleCA0NGU5MmMxLi4zNzUxZmQ3IDEwMDY0NAotLS0gYS9NaXNjL0FDS1MKKysrIGIvTWlzYy9BQ0tTCkBAIC0xMSw3MyArMTEsMTI2IEBACiBQUzogSW4gdGhlIHN0YW5kYXJkIFB5dGhvbiBkaXN0cmlidXRpb24sIHRoaXMgZmlsZSBpcyBlbmNvZGVkIGluIFVURi04CiBhbmQgdGhlIGxpc3QgaXMgaW4gcm91Z2ggYWxwaGFiZXRpY2FsIG9yZGVyIGJ5IGxhc3QgbmFtZXMuCiAKK0FhaHoKK01pY2hhZWwgQWJib3R0CitSYWppdiBBYnJhaGFtCiBEYXZpZCBBYnJhaGFtcworTWFyYyBBYnJhbW93aXR6CitSb24gQWRhbQorQW50b24gQWZhbmFzeWV2CitBbGkgQWZzaGFyCitOaXRpa2EgQWdhcndhbAogSmltIEFobHN0cm9tCiBGYXJoYW4gQWhtYWQKK01hdHRoZXcgQWhyZW5zCiBOaXIgQWlkZXMKIFlhbml2IEFrbmluCiBKeXJraSBBbGFrdWlqYWxhCitTdGV2ZSBBbGV4YW5kZXIKK0ZyZWQgQWxsZW4KK0plZmYgQWxsZW4KK1JheSBBbGxlbgogQmlsbHkgRy4gQWxsaWUKIEtldmluIEFsdGlzCiBKb2UgQW1lbnRhCitBLiBBbW9yb3NvCiBNYXJrIEFuYWNrZXIKK1NoYXNod2F0IEFuYW5kCiBBbmRlcnMgQW5kZXJzZW4KIEpvaG4gQW5kZXJzb24KK1BlaHIgQW5kZXJzb24KIEVyaWsgQW5kZXJzw6luCiBPbGl2ZXIgQW5kcmljaAogUm9zcyBBbmRydXMKK0p1YW5jYXJsbyBBw7FlegorQ2hyaXMgQW5nZWxpY28KK0rDqXLDqW15IEFuZ2VyCitBbmt1ciBBbmthbgorSm9uIEFuZ2xpbgorSGVpZGkgQW5uZXhzdGFkCitSYW1jaGFuZHJhIEFwdGUKIMOJcmljIEFyYXVqbworQWxpY2lhIEFybGVuCitKZWZmcmV5IEFybXN0cm9uZwogSmFzb24gQXNiYWhyCiBEYXZpZCBBc2NoZXIKIENocmlzIEF0TGVlCitBeW1lcmljIEF1Z3VzdGluCiBKb2huIEF5Y29jawotSmFuLUhlaW4gQsO8aHJtYW4KIERvbm92YW4gQmFhcmRhCitBcm5lIEJhYmVuaGF1c2VyaGVpZGUKIEF0dGlsYSBCYWJvCi1BbGZvbnNvIEJhY2llcm8KK01hdHQgQmFjaG1hbm4KIE1hcmNpbiBCYWNocnkKK0FsZm9uc28gQmFjaWVybwogRHdheW5lIEJhaWxleQogU3RpZyBCYWtrZW4KIEdyZWcgQmFsbAogTHVpZ2kgQmFsbGFiaW8KIEplZmYgQmFsb2doCitNYW51ZWwgQmFsc2VyYQogTWF0dCBCYW5keQorRG1pIEJhcmFub3YKIE1pY2hhZWwgSi4gQmFyYmVyCitEYW5pZWwgQmFyY2xheQorTmljb2xhcyBCYXJlaWwKIENocmlzIEJhcmtlcgorQW50b24gQmFya292c2t5CiBOaWNrIEJhcm5lcwogUXVlbnRpbiBCYXJuZXMKK0RhdmlkIEJhcm5ldHQKK01hdHRoZXcgQmFybmV0dAogUmljaGFyZCBCYXJyYW4KIENlc2FyIEVkdWFyZG8gQmFycm9zCiBEZXMgQmFycnkKIFVsZiBCYXJ0ZWx0CitEb24gQmFzaGZvcmQKK1Bpb3IgQmFzdGlkYQogTmljayBCYXN0aW4KK05lZCBCYXRjaGVsZGVyCiBKZWZmIEJhdWVyCi1NaWtlIEJheWVyCiBNaWNoYWVsIFIgQmF4CiBBbnRob255IEJheHRlcgorTWlrZSBCYXllcgogU2FtdWVsIEwuIEJheWVyCiBEb25hbGQgQmVhdWRyeQogRGF2aWQgQmVhemxleQotUm9iaW4gQmVja2VyCiBOZWFsIEJlY2tlcgorUm9iaW4gQmVja2VyCiBUb3JzdGVuIEJlY2tlcgogQmlsbCBCZWRmb3JkCitJYW4gQmVlcgorU3RlZmFuIEJlaG5lbAogUmVpbWVyIEJlaHJlbmRzCiBCZW4gQmVsbAogVGhvbWFzIEJlbGxtYW4KIEFsZXhhbmRlciDigJzQodCw0YjQsOKAnSBCZWxvcG9sc2t5CitFbGkgQmVuZGVyc2t5CitEYXZpZCBCZW5qYW1pbgorT3NjYXIgQmVuamFtaW4KIEFuZHJldyBCZW5uZXR0cwogQW5keSBCZW5za3kKK0Jlbm5ldHQgQmVuc29uCitFenJhIEJlcmNoCiBNaWNoZWwgVmFuIGRlbiBCZXJnaAorSnVsaWFuIEJlcm1hbgorQnJpY2UgQmVybmEKK09saXZpZXIgQmVybmFyZAogRXJpYyBCZXNlcgogU3RldmVuIEJldGhhcmQKIFN0ZXBoZW4gQmV2YW4KIFJvbiBCaWNrZXJzCitOYXRhbGlhIEIuIEJpZGFydAorQWRyaWFuIHZvbiBCaWRkZXIKIERhdmlkIEJpbmdlcgogRG9taW5pYyBCaW5rcwogUGhpbGlwcGUgQmlvbmRpCitNaWNoYWVsIEJpcnR3ZWxsCiBTdHVhcnQgQmlzaG9wCiBSb3kgQml4bGVyCitEYW5pZWwgQmxhY2sKK0pvbmF0aGFuIEJsYWNrCitSZW5hdWQgQmxhbmNoCiBNaWtlIEJsYW5kCiBNYXJ0aW4gQmxlc3MKIFBhYmxvIEJsZXllcgpAQCAtODYsODMgKzEzOSwxMzUgQEAKIEZpbm4gQm9jawogUGF1bCBCb2RkaWUKIE1hdHRoZXcgQm9lZGlja2VyCitSb2JpbiBCb2VyZGlqawogRGF2aWQgQm9sZW4KK1dvdXRlciBCb2xzdGVybGVlCiBHYXdhaW4gQm9sdG9uCitGb3Jlc3QgQm9uZAogR3JlZ29yeSBCb25kCitNYXRpYXMgQm9yZGVzZQorSm9uYXMgQm9yZ3N0csO2bQogSnVyamVuIEJvcwogUGV0ZXIgQm9zY2gKK0RhbiBCb3N3ZWxsCiBFcmljIEJvdWNrCiBUaGllcnJ5IEJvdXNjaAogU2ViYXN0aWFuIEJvdmluZworTWljaGFsIEJvem9uCiBKZWZmIEJyYWRiZXJyeQorQWFyb24gQnJhbmNvdHRpCiBNb250eSBCcmFuZGVuYmVyZwogR2VvcmcgQnJhbmRsCiBDaHJpc3RvcGhlciBCcmFubm9uCiBUZXJyZW5jZSBCcmFubm9uCitHZXJtw6FuIE0uIEJyYXZvCitTdmVuIEJyYXVjaAorRXJpayBCcmF5CitCcmlhbiBCcmF6aWwKK0RlbWlhbiBCcmVjaHQKIERhdmUgQnJlbm5hbgogVG9tIEJyaWRnbWFuCitBbnRob255IEJyaWdncworS2VpdGggQnJpZ2dzCitUb2JpYXMgQnJpbmsKIFJpY2hhcmQgQnJvZGllCiBNaWNoYWVsIEJyb2dodG9uCitBbW1hciBCcm9oaQogRGFuaWVsIEJyb3Rza3kKIEplYW4gQnJvdXdlcnMKIEdhcnkgUy4gQnJvd24KK1RpdHVzIEJyb3duCiBPbGVnIEJyb3l0bWFubgogRGF2ZSBCcnVlY2sKK0ZyYW5jaXNjbyBNYXJ0w61uIEJydWd1w6kKK0lhbiBCcnVudGxldHQKK0Zsb3JpcyBCcnV5bm9vZ2hlCitNYXR0IEJyeWFudAogU3RhbiBCdWJyb3Vza2kKIEVyaWsgZGUgQnVlZ2VyCitKYW4tSGVpbiBCw7xocm1hbgorTGFycyBCdWl0aW5jawogRGljayBCdWx0ZXJtYW4KIEJpbGwgQnVtZ2FybmVyCiBKaW1teSBCdXJnZXR0CitFZG1vbmQgQnVybmV0dAogVG9tbXkgQnVybmV0dGUKIFJvZ2VyIEJ1cm5oYW0KIEFsYXN0YWlyIEJ1cnQKIFRhcm4gV2Vpc25lciBCdXJ0b24KIExlZSBCdXNieQorS2F0aGVyaW5lIEJ1c2NoCiBSYWxwaCBCdXRsZXIKK1phY2ggQnlybmUKK05pY29sYXMgQ2Fkb3UKIEpwIENhbGRlcm9uZQorQXJuYXVkIENhbG1ldHRlcwogRGFuaWVsIENhbHZlbG8KIFRvbnkgQ2FtcGJlbGwKIEJyZXR0IENhbm5vbgogTWlrZSBDYXJsdG9uCitQaWVycmUgQ2FycmllcgogVGVycnkgQ2Fycm9sbAorRWR3YXJkIENhdG11cgogTG9yZW56byBNLiBDYXR1Y2NpCiBEb25uIENhdmUKIENoYXJsZXMgQ2F6YWJvbgorSmVzw7pzIENlYSBBdmnDs24KIFBlciBDZWRlcnF2aXN0CitNYXRlaiBDZXBsCitDYXJsIENlcmVja2UKIE9jdGF2aWFuIENlcm5hCitEYXZlIENoYW1iZXJzCiBQYXNjYWwgQ2hhbWJvbgogSm9obiBDaGFuZGxlcgogSHllLVNoaWsgQ2hhbmcKIEplZmZyZXkgQ2hhbmcKLU1pdGNoIENoYXBtYW4KLUdyZWcgQ2hhcG1hbgorR29kZWZyb2lkIENoYXBlbGxlCiBCcmFkIENoYXBtYW4KK0dyZWcgQ2hhcG1hbgorTWl0Y2ggQ2hhcG1hbgorWW9nZXNoIENoYXVkaGFyaQogRGF2aWQgQ2hhdW0KIE5pY29sYXMgQ2hhdXZhdAorSmVycnkgQ2hlbgogTWljaGFlbCBDaGVybXNpZGUKK0luZ3JpZCBDaGV1bmcKIEFsYmVydCBDaGluLUEtWW91bmcKIEFkYWwgQ2hpcmlsaXVjCiBNYXR0IENoaXNob2xtCitMaXRhIENobwogQW5kZXJzIENocmlnc3Ryw7ZtCiBUb20gQ2hyaXN0aWFuc2VuCitSZW5lZSBDaHUKIFZhZGltIENodWd1bm92CitNYXVybyBDaWNvZ25pbmkKIERhdmlkIENpbmVnZQogQ3JhaWcgQ2l0cm8KK0dpbGxlcyBDaXZhcmlvCitDaHJpcyBDbGFyaworTGF1cmllIENsYXJrLU1pY2hhbGVrCiBNaWtlIENsYXJrc29uCiBBbmRyZXcgQ2xlZ2cKIEJyYWQgQ2xlbWVudHMKK1JvYmJpZSBDbGVtb25zCiBTdGV2ZSBDbGlmdAorSGVydsOpIENvYXRhbmhheQogTmljayBDb2dobGFuCiBKb3NoIENvZ2xpYXRpCiBEYXZlIENvbGUKK1RlcnJlbmNlIENvbGUKIEJlbmphbWluIENvbGxhcgogSmVmZmVyeSBDb2xsaW5zCiBSb2JlcnQgQ29sbGlucwogUGF1bCBDb2xvbWlldHMKK0NocmlzdG9waGUgQ29tYmVsbGVzCiBHZXJlbXkgQ29uZHJhCitEZW52ZXIgQ29uZXliZWFyZQorUGhpbCBDb25uZWxsCiBKdWFuIEpvc8OpIENvbnRpCiBNYXR0IENvbndheQogRGF2aWQgTS4gQ29va2UKK0phc29uIFIuIENvb21icwogR2FycmV0dCBDb29wZXIKIEdyZWcgQ29wZWxhbmQKIEFsZG8gQ29ydGVzaQpAQCAtMTcwLDU2ICsyNzUsNzggQEAKIFNjb3R0IENvdHRvbgogR3JlZyBDb3VjaAogRGF2aWQgQ291cm5hcGVhdQorSnVsaWVuIENvdXJ0ZWF1CiBTdGV2ZSBDb3VzaW5zCiBBbGV4IENvdmVudHJ5CiBNYXR0aGV3IERpeG9uIENvd2xlcwogUnlhbiBDb3luZXIKIENocmlzdG9waGVyIEEuIENyYWlnCitKZXJlbXkgQ3JhdmVuCiBMYXVyYSBDcmVpZ2h0b24KIFNpbW9uIENyb3NzCitGZWxpcGUgQ3J1egogRHJldyBDc2lsbGFnCiBKb2FxdWluIEN1ZW5jYSBBYmVsYQogSm9obiBDdWdpbmkKIFRvbSBDdWxsaXRvbgorQW50b25pbyBDdW5pCiBCcmlhbiBDdXJ0aW4KIExpc2FuZHJvIERhbGNpbgorRGFycmVuIERhbGUKIEFuZHJldyBEYWxrZQogTGFycyBEYW1lcm93CiBFdmFuIERhbmRyZWEKIEVyaWMgRGFuaWVsCiBTY290dCBEYXZpZCBEYW5pZWxzCiBCZW4gRGFybmVsbAorS3VzaGFsIERhcwogSm9uYXRoYW4gRGFzdGVlbAorUGllcnJlLVl2ZXMgRGF2aWQKK0EuIEplc3NlIEppcnl1IERhdmlzCitNZXJsaWpuIHZhbiBEZWVuCiBKb2huIERlR29vZAogTmVkIERlaWx5CiBWaW5jZW50IERlbGZ0CiBBcm5hdWQgRGVsb2JlbGxlCitLb25yYWQgRGVsb25nCiBFcmlrIERlbWFpbmUKK01hcnRpbiBEZW5nbGVyCiBKb2huIERlbm5pcworTC4gUGV0ZXIgRGV1dHNjaAogUm9nZXIgRGV2CitQaGlsaXBwZSBEZXZhbGtlbmVlcgogUmFnaHVyYW0gRGV2YXJha29uZGEKK0NhbGViIERldmVyYXV4CiBDYXRoZXJpbmUgRGV2bGluCiBTY290dCBEaWFsCiBUb2J5IERpY2tlbnNvbgogTWFyayBEaWNraW5zb24KIEphY2sgRGllZGVyaWNoCiBEYW5pZWwgRGluaXoKK0h1bWJlcnRvIERpb2dlbmVzCiBZdmVzIERpb25uZQogRGFuaWVsIERpdHRtYXIKK0pvc2lwIERqb2xvbmdhCiBKYXJvbWlyIERvbGVjZWsKIElzbWFpbCBEb25tZXoKK1JvYmVydCBEb25vaHVlCiBNYXJjb3MgRG9ub2xvCiBEaW1hIERvcmZtYW4KK1l2ZXMgRG9yZnNtYW4KIENlc2FyIERvdWFkeQogRGVhbiBEcmFheWVyCiBGcmVkIEwuIERyYWtlLCBKci4KK0RlcmsgRHJ1a2tlcgogSm9obiBEdUJvaXMKIFBhdWwgRHVib2lzCitKYWNxdWVzIER1Y2Fzc2UKK0FuZHJlaSBEb3JpYW4gRHVtYQogR3JhaGFtIER1bXBsZXRvbgogUXVpbm4gRHVua2FuCiBSb2JpbiBEdW5uCiBMdWtlIER1bnN0YW4KIFZpcmdpbCBEdXByYXMKK0JydW5vIER1cHVpcwogQW5keSBEdXN0bWFuCiBHYXJ5IER1emFuCiBFdWdlbmUgRHZ1cmVjaGVuc2tpCkBAIC0yMjcsNTQgKzM1NCw4MyBAQAogTWF4aW0gRHp1bWFuZW5rbwogV2FsdGVyIETDtnJ3YWxkCiBIYW5zIEVja2FyZHQKK1JvZG9scGhvIEVja2hhcmR0CitVbHJpY2ggRWNraGFyZHQKK0RhdmlkIEVkZWxzb2huCitKb2huIEVkbW9uZHMKIEdyYW50IEVkd2FyZHMKIEpvaG4gRWhyZXNtYW4KK1RhbCBFaW5hdAogRXJpYyBFaXNuZXIKIEFuZHJldyBFbGFuZAorSnVsaWVuIMOJbGllCiBMYW5jZSBFbGxpbmdoYXVzCitEYW5pZWwgRWxsaXMKK1BoaWwgRWxzb24KIERhdmlkIEVseQogSmVmZiBFcGxlcgogVG9tIEVwcGVybHkKK0fDtmtjZW4gRXJhc2xhbgogU3RvZmZlbCBFcmFzbXVzCiBKw7xyZ2VuIEEuIEVyaGFyZAogTWljaGFlbCBFcm5zdAogQmVuIEVzY290bwogQW5keSBFc2tpbHNzb24KK0FuZHLDqSBFc3BhemUKIFN0ZWZhbiBFc3NlcgotU3RlcGhlbiBEIEV2YW5zCitOaWNvbGFzIEVzdGliYWxzCiBDYXJleSBFdmFucworU3RlcGhlbiBEIEV2YW5zCiBUaW0gRXZlcmV0dAogUGF1bCBFdmVyaXR0CiBEYXZpZCBFdmVybHkKIERhbmllbCBFdmVycworV2luc3RvbiBFd2VydAogR3JlZyBFd2luZwogTWFydGlqbiBGYWFzc2VuCiBDbG92aXMgRmFicmljaW8KIEFuZHJlYXMgRmFlcmJlcgogQmlsbCBGYW5jaGVyCitNaWNoYWVsIEZhcnJlbGwKIFRyb3kgSi4gRmFycmVsbAogTWFyayBGYXZhcworQm9yaXMgRmVsZAorVGhvbWFzIEZlbnpsCiBOaWVscyBGZXJndXNvbgogU2ViYXN0aWFuIEZlcm5hbmRlegorRmxvcmlhbiBGZXN0aQorSm9obiBGZXVlcnN0ZWluCitDYXJsIEZleW5tYW4KIFZpbmNlbnQgRmlhY2sKIFRvbWVyIEZpbGliYQogSmVmZnJleSBGaW5rZWxzdGVpbgogUnVzc2VsbCBGaW5uCitEYW4gRmlubmllCiBOaWxzIEZpc2NoYmVjawogRnJlZGVyaWsgRml4CiBNYXR0IEZsZW1pbmcKIEhlcm7DoW4gTWFydMOtbmV6IEZvZmZhbmkKK0FydGVtIEZva2luCitBcm5hdWQgRm9udGFpbmUKIE1pY2hhZWwgRm9vcmQKIEFtYXVyeSBGb3JnZW90IGQnQXJjCiBEb3VnIEZvcnQKK0NocmlzIEZvc3RlcgogSm9obiBGb3VoeQorQW5kcmV3IEZyYW5jaXMKK1N0ZWZhbiBGcmFua2UKIE1hcnRpbiBGcmFua2xpbgorS2VudCBGcmF6aWVyCitCcnVjZSBGcmVkZXJpa3NlbgogUm9iaW4gRnJpZWRyaWNoCitCcmFkbGV5IEZyb2VobGUKIEl2YW4gRnJvaG5lCitNYXR0aGlhcyBGdWNocwogSmltIEZ1bHRvbgogVGFkYXlvc2hpIEZ1bmFiYQogR3lybyBGdW5jaAogUGV0ZXIgRnVuaworRXRoYW4gRnVybWFuCiBHZW9mZiBGdXJuaXNoCiBVbGlzc2VzIEZ1cnF1aW0KIEhhZ2VuIEbDvHJzdGVuYXUKQEAgLTI4NCw3ICs0NDAsOSBAQAogTGVsZSBHYWlmYXgKIFNhbnRpYWdvIEdhbGEKIFlpdHpjaGFrIEdhbGUKK01hdHRoZXcgR2FsbGFnaGVyCiBRdWVudGluIEdhbGxldC1HaWxsZXMKK1JpY2NhcmRvIEF0dGlsaW8gR2FsbGkKIFJheW11bmQgR2FsdmluCiBOaXRpbiBHYW5hdHJhCiBGcmVkIEdhbnNldmxlcwpAQCAtMjkyLDM5ICs0NTAsNjMgQEAKIERhbiBHYXNzCiBBbmRyZXcgR2F1bAogU3RlcGhlbiBNLiBHYXZhCitYYXZpZXIgZGUgR2F5ZQogSGFycnkgSGVucnkgR2ViZWwKIE1hcml1cyBHZWRtaW5hcwogVGhvbWFzIEdlbGxla3VtCiBHYWJyaWVsIEdlbmVsbGluYQogQ2hyaXN0b3MgR2Vvcmdpb3UKK0VsYXphciBHZXJzaHVuaQogQmVuIEdlcnR6ZmllbGQKK05hZGltIEdoYXpuYXZpCiBEaW51IEdoZXJtYW4KIEpvbmF0aGFuIEdpZGR5CiBKb2hhbm5lcyBHaWpzYmVycwogTWljaGFlbCBHaWxmaXgKK0p1bGlhbiBHaW5kaQorWWFubmljayBHaW5ncmFzCitNYXR0IEdpdWNhCitXaW0gR2xlbm4KK01pY2hhZWwgR29kZXJiYXVlcgorSmVyb2VuIFZhbiBHb2V5CiBDaHJpc3RvcGggR29obGtlCiBUaW0gR29sZGVuCitHdWlsaGVybWUgR29uw6dhbHZlcworVGlhZ28gR29uw6dhbHZlcwogQ2hyaXMgR29ubmVybWFuCitTaGVsbGV5IEdvb2NoCiBEYXZpZCBHb29kZ2VyCiBIYW5zIGRlIEdyYWFmZgorTmF0aGFuaWVsIEdyYXkKIEVkZHkgRGUgR3JlZWYKK0dyYW50IEdyaWZmaW4KK0FuZHJlYSBHcmlmZmluaQogRHVuY2FuIEdyaXNieQogRmFiaWFuIEdyb2ZmZW4KLUpvaG4gUy4gR3J1YmVyCitFcmljIEdyb28KIERhZyBHcnVuZWF1CiBGaWxpcCBHcnVzemN6ecWEc2tpCitUaG9tYXMgR3VldHRsZXIKK0FudWogR3VwdGEKIE1pY2hhZWwgR3VyYXZhZ2UKIExhcnMgR3VzdMOkYmVsCiBUaG9tYXMgR8O8dHRsZXIKK0pvbmFzIEguCiBCYXJyeSBIYWRkb3cKK1BoaWxpcHAgSGFnZW1laXN0ZXIKIFBhdWwgdGVuIEhhZ2VuCiBSYXNtdXMgSGFobgogUGV0ZXIgSGFpZ2h0CiBWw6FjbGF2IEhhaXNtYW4KK1piaWduaWV3IEhhbGFzCitXYWxrZXIgSGFsZSBJVgogQm9iIEhhbGxleQogSmVzc2UgSGFsbGlvCiBKdW4gSGFtYW5vCitBbGV4YW5kcmUgSGFtZWxpbgorQW5kZXJzIEhhbW1hcnF1aXN0CiBNYXJrIEhhbW1vbmQKK0hhcmFsZCBIYW5jaGUtT2xzZW4KIE1hbnVzIEhhbmQKIE1pbHRvbiBMLiBIYW5raW5zCiBTdGVwaGVuIEhhbnNlbgpAQCAtMzMyLDI2ICs1MTQsMzggQEAKIEx5bmRhIEhhcmRtYW4KIERlcmVrIEhhcmxhbmQKIEphc29uIEhhcnBlcgorRGF2aWQgSGFycmlnYW4KK0JyaWFuIEhhcnJpbmcKK0pvbmF0aGFuIEhhcnRsZXkKK1RyYXZpcyBCLiBIYXJ0d2VsbAogTGFycnkgSGFzdGluZ3MKK1RpbSBIYXRjaAogU2hhbmUgSGF0aGF3YXkKK0phbmtvIEhhdXNlcgogUnljaGFyZGUgSGF3a2VzCitCZW4gSGF5ZGVuCiBKb2NoZW4gSGF5ZWsKK1RpbSBIZWFuZXkKK0hlbnJpayBIZWltYnVlcmdlcgogQ2hyaXN0aWFuIEhlaW1lcwogVGhvbWFzIEhlbGxlcgogTWFsdGUgSGVsbWVydAogTGFuY2UgRmlubiBIZWxzdGVuCiBKb25hdGhhbiBIZW5kcnkKK01pY2hhZWwgSGVucnkKIEphbWVzIEhlbnN0cmlkZ2UKIEthc3VuIEhlcmF0aAogQ2hyaXMgSGVyYm9ydGgKIEl2YW4gSGVybWFuCiBKw7xyZ2VuIEhlcm1hbm4KIEdhcnkgSGVycm9uCitFcm5pZSBIZXJzaGV5CiBUaG9tYXMgSGVydmUKIEJlcm5oYXJkIEhlcnpvZwogTWFnbnVzIEwuIEhldGxhbmQKIFJheW1vbmQgSGV0dGluZ2VyCiBLZXZhbiBIZXlkb24KK0tlbHNleSBIaWdodG93ZXIKIEphc29uIEhpbGRlYnJhbmQKIFJpY2hpZSBIaW5kbGUKIEtvbnJhZCBIaW5zZW4KQEAgLTM2MCwxMiArNTU0LDE4IEBACiBKb2VyZy1DeXJpbCBIb2VobGUKIEdyZWdvciBIb2ZmbGVpdAogQ2hyaXMgSG9mZm1hbgorU3RlZmFuIEhvZmZtZWlzdGVyCiBBbGJlcnQgSG9ma2FtcAogVG9tYXMgSG9nZXIKIEpvbmF0aGFuIEhvZ2cKK0thbWlsbGEgSG9sYW5kYQorU3RldmUgSG9sZGVuCitBa2ludGF5byBIb2xkZXIKK1Rob21hcyBIb2xlbnN0ZWluCiBHZXJyaXQgSG9sbAogU2hhbmUgSG9sbG93YXkKIFJ1bmUgSG9sbQorVGhvbWFzIEhvbG1lcwogUGhpbGlwIEhvbWJ1cmcKIE5hb2Z1bWkgSG9uZGEKIEplZmZyZXkgSG9uaWcKQEAgLTM3NCw3OCArNTc0LDEyNyBAQAogQnJpYW4gSG9vcGVyCiBSYW5kYWxsIEhvcHBlcgogTmFkYXYgSG9yZXNoCitBbG9uIEhvcmV2CiBKYW4gSG9zYW5nCitBbGFuIEhvdXJpaGFuZQogS2VuIEhvd2FyZAogQnJhZCBIb3dlcworTWlrZSBIb3kKIENoaWgtSGFvIEh1YW5nCitDaHJpc3RpYW4gSHVkb24KIExhd3JlbmNlIEh1ZHNvbgogTWljaGFlbCBIdWRzb24KIEppbSBIdWd1bmluCiBHcmVnIEh1bXBocmV5cwogRXJpYyBIdXNzCitOZWhhbCBIdXNzYWluCitUYWloeXVuIEh3YW5nCiBKZXJlbXkgSHlsdG9uCitMdWR3aWcgSMOkaG5lCiBHZXJoYXJkIEjDpHJpbmcKIEZyZWRyaWsgSMOlw6VyZAogQ2F0YWxpbiBJYWNvYgogTWloYWkgSWJhbmVzY3UKK0FsaSBJa2luY2kKK0Fhcm9uIElsZXMKIExhcnMgSW1taXNjaAogQm9iYnkgSW1wb2xsb25pYQogTWVhZG9yIEluZ2UKK1BldGVyIEluZ2VicmV0c29uCiBUb255IEluZ3JhbGRpCiBKb2huIEludGVycmFudGUKK1ZsYWRpbWlyIElvZmlrCiBCb2IgSXBwb2xpdG8KK1JvZ2VyIElyd2luCiBBdHN1byBJc2hpbW90bwotUGF1bCBKYWNrc29uCitBZGFtIEphY2tzb24KIEJlbiBKYWNrc29uCitQYXVsIEphY2tzb24KK01hbnVlbCBKYWNvYgogRGF2aWQgSmFjb2JzCiBLZXZpbiBKYWNvYnMKIEtqZXRpbCBKYWNvYnNlbgorQmVydHJhbmQgSmFuaW4KIEdlZXJ0IEphbnNlbgogSmFjayBKYW5zZW4KIEJpbGwgSmFuc3NlbgogVGhvbWFzIEphcm9zY2gKK0p1aGFuYSBKYXVoaWFpbmVuCitSYWphZ29wYWxhc2FybWEgSmF5YWtyaXNobmFuCitaYmlnbmlldyBKxJlkcnplamV3c2tpLVN6bWVrCitKdWxpZW4gSmVoYW5uZXQKIERyZXcgSmVua2lucwogRmxlbW1pbmcgS2rDpnIgSmVuc2VuCi1KaWJhCitQaGlsaXAgSC4gSmVuc2VuCitQaGlsaXAgSmVudmV5CitNdW5TaWMgSmVvbmcKK0NocmlzIEplcmRvbmVrCitEbWl0cnkgSmVyZW1vdgorSmltIEpld2V0dAorUGVkcm8gRGlheiBKaW1lbmV6CiBPcmphbiBKb2hhbnNlbgogRnJlZHJpayBKb2hhbnNzb24KIEdyZWdvcnkgSy4gSm9obnNvbgorS2VudCBKb2huc29uCitNaWNoYWVsIEpvaG5zb24KIFNpbW9uIEpvaG5zdG9uCitNYXR0IEpvaW5lcgorVGhvbWFzIEpvbGxhbnMKIE5pY29sYXMgSm9seQorQnJpYW4gSy4gSm9uZXMKIEV2YW4gSm9uZXMKIEplcmVteSBKb25lcwogUmljaGFyZCBKb25lcwogSXJtZW4gZGUgSm9uZwogTHVjYXMgZGUgSm9uZ2UKLUpvaG4gSm9yZ2Vuc2VuCitLcmlzdGrDoW4gVmFsdXIgSsOzbnNzb24KK1JvYmVydCBKb3JkZW5zCiBKZW5zIEIuIEpvcmdlbnNlbgorSm9obiBKb3JnZW5zZW4KIFNpamluIEpvc2VwaAogQW5kcmVhcyBKdW5nCiBUYXR0b28gTWFib256byBLLgorU2FyYWggSy4KK1N1bm55IEsKK0JvaHVzbGF2IEthYnJkYQorQWxleGV5IEthY2hheWV2CiBCb2IgS2FobgogS3VydCBCLiBLYWlzZXIKIFRhbWl0byBLYWppeWFtYQorSmFuIEthbGlzemV3c2tpCiBQZXRlciB2YW4gS2FtcGVuCitKYW4gS2FuaXMKK1JhZmUgS2FwbGFuCiBKYWNvYiBLYXBsYW4tTW9zcwotUGlvdHIgS2FzcHJ6eWsKK0phbm5lIEthcmlsYQorUGVyIMOYeXZpbmQgS2FybHNlbgorQW50b24gS2FzeWFub3YKIExvdSBLYXRlcwogSGlyb2FraSBLYXdhaQorQnJpYW4gS2Vhcm5zCiBTZWJhc3RpZW4gS2VpbQogUnlhbiBLZWxseQotUm9iZXJ0IEtlcm4KK0RhbiBLZW5pZ3NiZXJnCiBSYW5kYWxsIEtlcm4KK1JvYmVydCBLZXJuCitKaW0gS2VycgogTWFnbnVzIEtlc3NsZXIKIExhd3JlbmNlIEtlc3RlbG9vdAotUmFmZSBLZXR0bGVyCiBWaXZlayBLaGVyYQotQWtpcmEgS2l0YWRhCitEaGlydSBLaG9saWEKIE1hZHMgS2lpbGVyaWNoCitKYXNvbiBLaWxsZW4KK0phbiBLaW0KIFRhZWsgSm9vIEtpbQorU2FtIEtpbWJyZWwKIFcuIFRyZXZvciBLaW5nCiBQYXVsIEtpcHBlcwogU3RldmUgS2lyc2NoCiBTZWJhc3RpYW4gS2lyc2NoZQorS2FtaWwgS2lzaWVsCitBa2lyYSBLaXRhZGEKIFJvbiBLbGF0Y2hrbworUmVpZCBLbGVja25lcgogQmFzdGlhbiBLbGVpbmVpZGFtCiBCb2IgS2xpbmUKIE1hdHRoaWFzIEtsb3NlCkBAIC00NTQsMTUxICs3MDMsMjU3IEBACiBLaW0gS25hcHAKIExlbm55IEtuZWxlcgogUGF0IEtuaWdodAorSmVmZiBLbnVwcAorS3ViaWxheSBLb2NhawogR3JlZyBLb2NoYW5za2kKIERhbW9uIEtvaGxlcgorTWFya28gS29odGFsYQorVmFqcmFza3kgS29rCitHdWlkbyBLb2xsZXJpZQorSmFjZWsgS29uaWVjem55CivQnNCw0YDQuiDQmtC+0YDQtdC90LHQtdGA0LMKK0Fya2FkeSBLb3BseWFyb3YKK1BldGVyIEEuIEtvcmVuCitWbGFkIEtvcm9sZXYKIEpvc2VwaCBLb3NoeQorRGFuaWVsIEtvemFuCitKZXJ6eSBLb3plcmEKIE1ha3NpbSBLb3p5YXJjaHVrCiBTdGVmYW4gS3JhaAogQm9iIEtyYXMKK1NlYmFzdGlhbiBLcmVmdAogSG9sZ2VyIEtyZWtlbAogTWljaGFlbCBLcmVtZXIKIEZhYmlhbiBLcmV1dHoKK0PDqWRyaWMgS3JpZXIKK1BlZHJvIEtyb2dlcgogSGFubnUgS3Jvc2luZwogQW5kcmVqIEtycGljCiBJdmFuIEtyc3RpxIcKK1N0ZXZlbiBLcnlza2FsbGEKIEFuZHJldyBLdWNobGluZwotUmFsZiBXLiBHcm9zc2UtS3Vuc3RsZXZlCitEYXZlIEt1aGxtYW4KK0pvbiBLdWhuCitUb3NoaW8gS3VyYXRvbWkKIFZsYWRpbWlyIEt1c2huaXIKLUtpcmlsbCBLdXptaW55a2ggKNCa0LjRgNC40LvQuyDQmtGD0LfRjNC80LjQvdGL0YUpCitFcm5vIEt1dXNlbGEKIFJvc3MgTGFnZXJ3YWxsCiBDYW1lcm9uIExhaXJkCitEYXZpZCBMYW0KK1Rob21hcyBMYW1iCitWYWxlcmllIExhbWJlcnQKK0plYW4tQmFwdGlzdGUgIkppYmEiIExhbXkKK1JvbmFuIExhbXkKK1RvcnN0ZW4gTGFuZHNjaG9mZgogxYF1a2FzeiBMYW5nYQogVGlubyBMYW5nZQorR2xlbm4gTGFuZ2ZvcmQKIEFuZHJldyBMYW5nbWVhZAogRGV0bGVmIExhbm5lcnQKIFNvcmVuIExhcnNlbgorQW1vcyBMYXR0ZWllcgogUGllcnMgTGF1ZGVyCiBCZW4gTGF1cmllCiBTaW1vbiBMYXcKK0p1bGlhIExhd2FsbAogQ2hyaXMgTGF3cmVuY2UKIEJyaWFuIExlYWlyCi1Kb2huIEouIExlZQotSW55ZW9sIExlZQotVGhvbWFzIExlZQorTWF0aGlldSBMZWR1Yy1IYW1lbAorQW1hbmRpbmUgTGVlCiBDaHJpc3RvcGhlciBMZWUKK0lueWVvbCBMZWUKK0phbWVzIExlZQorSm9obiBKLiBMZWUKK1Rob21hcyBMZWUKK1Rlbm5lc3NlZSBMZWV1d2VuYnVyZwogTHVjIExlZmVidnJlCitQaWVycmUgUGF1bCBMZWZlYnZyZQorR2x5cGggTGVma293aXR6CiBWaW5jZW50IExlZ29sbAogS2lwIExlaG1hbgogSm9lcmcgTGVobWFubgogUm9iZXJ0IExlaG1hbm4KK1BldHJpIExlaHRpbmVuCiBMdWtlIEtlbm5ldGggQ2Fzc29uIExlaWdodG9uCi1NYXJjLUFuZHJlIExlbWJ1cmcKK1RzaGVwYW5nIExla2hvbmtob2JlCitNYXJjLUFuZHLDqSBMZW1idXJnCitNYXRldXN6IExlbmlrCiBKb2huIExlbnRvbgorS29zdHlhbnR5biBMZXNjaGVua28KK0Jlbm5vIExlc2xpZQogQ2hyaXN0b3BoZXIgVHVyIExlc25pZXdza2ktTGFhcworQWxhaW4gTGV1ZnJveQogTWFyayBMZXZpbnNvbgorTWFyayBMZXZpdHQKIFdpbGxpYW0gTGV3aXMKK0FraXJhIExpCiBYdWFuamkgTGkKIFJvYmVydCB2YW4gTGllcmUKIFJvc3MgTGlnaHQKIFNoYXduIExpZ29ja2kKIE1hcnRpbiBMaWdyCitHZWRpbWluYXMgTGlrdGFyYXMKK0dyYW50IExpbWJlcmcKIENocmlzdG9waGVyIExpbmRibGFkCitVbGYgQS4gTGluZGdyZW4KIEJqw7ZybiBMaW5kcXZpc3QKIFBlciBMaW5kcXZpc3QKIEVyaWMgTGluZHZhbGwKIEdyZWdvciBMaW5nbAorRXZlcmV0dCBMaXBtYW4KK01pcmtvIExpc3MKIE5pY2sgTG9ja3dvb2QKIFN0ZXBoYW5pZSBMb2Nrd29vZAorSHVnbyBMb3BlcyBUYXZhcmVzCiBBbm5lIExvcmQKIFRvbSBMb3JlZG8KIEp1c3RpbiBMb3ZlCitOZWQgSmFja3NvbiBMb3ZlbHkKIEphc29uIExvd2UKIFRvbnkgTG93bmRzCiBSYXkgTG95emFnYQorS2FuZy1IYW8gKEtlbm55KSBMdQogTHVrYXMgTHVlZwogTG9yZW4gTHVrZQogRnJlZHJpayBMdW5kaAorWmhvbmd5dWUgTHVvCiBNYXJrIEx1dHoKK1RhcmFzIEx5YXB1bgogSmltIEx5bmNoCiBNaWthZWwgTHluZ3ZpZwogTWFydGluIHZvbiBMw7Z3aXMKK0d1aWxsZXJtbyBMw7NwZXotQW5nbGFkYQorSmVmZiBNYWNEb25hbGQKK0pvaG4gTWFjaGluCiBBbmRyZXcgSSBNYWNJbnR5cmUKIFRpbSBNYWNLZW56aWUKIE5pY2sgTWFjbGFyZW4KK0RvbiBNYWNNaWxsZW4KK1RvbWFzeiBNYcSHa293aWFrCitXb2xmZ2FuZyBNYWllcgogU3RldmUgTWFqZXdza2kKK01hcmVrIE1hamtvd3NraQogR3J6ZWdvcnogTWFrYXJld2ljegogRGF2aWQgTWFsY29sbQorR3JlZyBNYWxjb2xtCitXaWxsaWFtIE1hbGxhcmQKIEtlbiBNYW5oZWltZXIKIFZsYWRpbWlyIE1hcmFuZ296b3YKK0NvbGluIE1hcmMKK1ZpbmNlbnQgTWFyY2hldHRpCiBEYXZpZCBNYXJlawogRG91ZyBNYXJpZW4KK1N2ZW4gTWFybmFjaAogQWxleCBNYXJ0ZWxsaQogQW50aG9ueSBNYXJ0aW4KK093ZW4gTWFydGluCitXZXN0bGV5IE1hcnTDrW5legogU8OpYmFzdGllbiBNYXJ0aW5pCitTaWRuZXkgU2FuIE1hcnTDrW4KIFJvZ2VyIE1hc3NlCiBOaWNrIE1hdGhld3NvbgorU2ltb24gTWF0aGlldQorTGF1cmEgTWF0c29uCiBHcmFoYW0gTWF0dGhld3MKK01hcnRpbiBNYXR1c2lhawogRGlldGVyIE1hdXJlcgorRGFuaWVsIE1heQorTWFkaXNvbiBNYXkKK0x1Y2FzIE1heXN0cmUKIEFybmF1ZCBNYXppbgorTWF0dCBNY0NsdXJlCitSZWJlY2NhIE1jQ3JlYXJ5CiBLaXJrIE1jRG9uYWxkCiBDaHJpcyBNY0Rvbm91Z2gKIEdyZWcgTWNGYXJsYW5lCiBBbGFuIE1jSW50eXJlCitKZXNzaWNhIE1jS2VsbGFyCiBNaWNoYWVsIE1jTGF5CitCcmVuZGFuIE1jTG91Z2hsaW4KIE1hcmsgTWMgTWFob24KIEdvcmRvbiBNY01pbGxhbgotQ2FvbGFuIE1jTmFtYXJhCiBBbmRyZXcgTWNOYW1hcmEKK0Nhb2xhbiBNY05hbWFyYQorSmVmZiBNY05laWwKIENyYWlnIE1jUGhlZXRlcnMKIExhbWJlcnQgTWVlcnRlbnMKIEJpbGwgdmFuIE1lbGxlCiBMdWNhcyBQcmFkbyBNZWxvCiBFemlvIE1lbG90dGkKK0RvdWcgTWVubmVsbGEKIEJyaWFuIE1lcnJlbGwKIEx1a2UgTWV3YnVybgogQ2FybCBNZXllcgogTWlrZSBNZXllcgorUGlvdHIgTWV5ZXIKK0FsZXhpcyBNw6l0YWlyZWF1CiBTdGV2ZW4gTWlhbGUKIFRyZW50IE1pY2sKK0phc29uIE1pY2hhbHNraQorRnJhbmNrIE1pY2hlYQorVG9tIE1pZGRsZXRvbgorVGhvbWFzIE1pZWRlbWEKIFN0YW4gTWloYWkKK1N0ZWZhbiBNaWhhaWxhCiBBcmlzdG90ZWxpcyBNaWtyb3BvdWxvcwotRGFtaWVuIE1pbGxlcgorUGFvbG8gTWlsYW5pCiBDaGFkIE1pbGxlcgorRGFtaWVuIE1pbGxlcgogSmFzb24gVi4gTWlsbGVyCiBKYXkgVC4gTWlsbGVyCitLYXRpZSBNaWxsZXIKIFJvbWFuIE1pbG5lcgorSnVsaWVuIE1pb3R0ZQogQW5kcmlpIFYuIE1pc2hrb3Zza3lpCi1EdXN0aW4gSi4gTWl0Y2hlbGwKIERvbSBNaXRjaGVsbAorRHVzdGluIEouIE1pdGNoZWxsCitadWJpbiBNaXRocmEKK0Zsb3JpYW4gTWxhZGl0c2NoCiBEb3VnIE1vZW4KIFRoZSBEcmFnb24gRGUgTW9uc3luZQorQmFzdGllbiBNb250YWduZQogU2tpcCBNb250YW5hcm8KK1BldGVyIE1vb2R5CiBQYXVsIE1vb3JlCitSb3NzIE1vb3JlCitCZW4gTW9yZ2FuCiBEZXJlayBNb3JyCiBKYW1lcyBBIE1vcnJpc29uCitNYXJ0aW4gTW9ycmlzb24KK0RlcmVrIE1jVGF2aXNoIE1vdW5jZQorQWxlc3NhbmRybyBNb3VyYQogUGFibG8gTW91em8KK01oZXIgTW92c2lzeWFuCiBSdXNsYW4gTXN0b2kKLVNqb2VyZCBNdWxsZW5kZXIKK1ZhbGVudGluYSBNdWtoYW1lZHpoYW5vdmEKK01pY2hhZWwgTXVsaWNoCiBTYXBlIE11bGxlbmRlcgorU2pvZXJkIE11bGxlbmRlcgogTWljaGFlbCBNdWxsZXIKIE5laWwgTXVsbGVyCitMb3VpcyBNdW5ybwogUi4gRGF2aWQgTXVycmF5Ci1QaW90ciBNZXllcgorTWF0dGkgTcOka2kKK0rDtnJnIE3DvGxsZXIKK0RhbGUgTmFnYXRhCiBKb2huIE5hZ2xlCiBUYWthaGlybyBOYWtheWFtYQogVHJhdmVycyBOYXJhbgogQ2hhcmxlcy1GcmFuw6dvaXMgTmF0YWxpCitWaWxtb3MgTmViZWhhagogRnJlZHJpayBOZWhyCi1UcmVudCBOZWxzb24KIFRvbnkgTmVsc29uCitUcmVudCBOZWxzb24KIENoYWQgTmV0emVyCiBNYXggTmV1bmjDtmZmZXIKIEdlb3JnZSBOZXZpbGxlLU5laWwKK0hpZXUgTmd1eWVuCiBKb2hhbm5lcyBOaWNvbGFpCiBTYW11ZWwgTmljb2xhcnkKK0pvbmF0aGFuIE5pZWhvZgogR3VzdGF2byBOaWVtZXllcgogT3NjYXIgTmllcnN0cmFzegotSHJ2b2plIE5pa3NpYworSHJ2b2plIE5pa8WhacSHCiBHcmVnb3J5IE5vZmkKIEplc3NlIE5vbGxlcgogQmlsbCBOb29uCkBAIC02MDYsNDYgKzk2MSw3NyBAQAogVGltIE5vcnRob3ZlcgogSm9lIE5vcnRvbgogTmVhbCBOb3J3aXR6CitNaWtoYWlsIE5vdmlrb3YKIE1pY2hhbCBOb3dpa293c2tpCiBTdGVmZmVuIERhb2RlIE51cnBtZXNvCiBOaWdlbCBPJ0JyaWFuCitKb2huIE8nQ29ubm9yCiBLZXZpbiBPJ0Nvbm5vcgogVGltIE8nTWFsbGV5Citab29rbyBPJ1doaWVsYWNyb254CitBYXJvbiBPYWtsZXkKK0phbWVzIE9ha2xleQorRWxlbmEgT2F0CitKb24gT2JlcmhlaWRlCitNaWxhbiBPYmVya2lyY2gKIFBhc2NhbCBPYmVybmRvZXJmZXIKIEplZmZyZXkgT2xsaWUKIEFkYW0gT2xzZW4KIEdyYW50IE9sc29uCitLb3JheSBPbmVyCiBQaWV0IHZhbiBPb3N0cnVtCitUb21hcyBPcHBlbHN0cnVwCiBKYXNvbiBPcmVuZG9yZmYKIERvdWdsYXMgT3JyCitXaWxsaWFtIE9ycgogTWljaGVsZSBPcnLDuQogT2xlZyBPc2hteWFuCiBEZW5pcyBTLiBPdGtpZGFjaAorUGV0ZXIgT3R0ZW4KIE1pY2hhZWwgT3R0ZW5lZGVyCiBSLiBNLiBPdWRrZXJrCiBSdXNzZWwgT3dlbgorSm9vbmFzIFBhYWxhc21hYQorTWFydGluIFBhY2ttYW4KK1NocmlwaGFuaSBQYWxha29kZXR5CiBPbmRyZWogUGFsa292c2t5CiBNaWtlIFBhbGwKIFRvZGQgUi4gUGFsbWVyCiBKdWFuIERhdmlkIEliw6HDsWV6IFBhbG9tYXIKIEphbiBQYWx1cworTWF0aGlhcyBQYW56ZW5iw7ZjawogTS4gUGFwaWxsb24KIFBldGVyIFBhcmVudGUKIEFsZXhhbmRyZSBQYXJlbnRlYXUKIERhbiBQYXJpc2llbgorV2lsbGlhbSBQYXJrCitIZWlra2kgUGFydGFuZW4KIEhhcnJpIFBhc2FuZW4KK0dhw6tsIFBhc2dyaW1hdWQKK0FzaGlzaCBOaXRpbiBQYXRpbAogUmFuZHkgUGF1c2NoCiBTYW11ZWxlIFBlZHJvbmkKK0p1c3RpbiBQZWVsCiBNYXJjZWwgdmFuIGRlciBQZWlqbAorQmVya2VyIFBla3NhZworQW5kcmVhcyBQZWxtZQogU3RldmVuIFBlbWJlcnRvbgorQm8gUGVuZwogU2FudGlhZ28gUGVyZXPDs24KK0dlb3JnZSBQZXJpc3RlcmFraXMKK01hdGhpZXUgUGVycmVhdWx0CiBNYXJrIFBlcnJlZ28KIFRyZXZvciBQZXJyaW4KIEdhYnJpZWwgZGUgUGVydGh1aXMKIFRpbSBQZXRlcnMKIEJlbmphbWluIFBldGVyc29uCitKb2UgUGV0ZXJzb24KIENocmlzIFBldHJpbGxpCitSb3VtZW4gUGV0cm92CiBCam9ybiBQZXR0ZXJzZW4KK0p1c3RpbiBELiBQZXR0aXQKK0VzYSBQZXVoYQorUm9ubnkgUGZhbm5zY2htaWR0CiBHZW9mZiBQaGlsYnJpY2sKIEdhdnJpZSBQaGlsaXBzb24KIEFkcmlhbiBQaGlsbGlwcwpAQCAtNjU0LDIzNCArMTA0MCwzODMgQEAKIEppbSBTdC4gUGllcnJlCiBEYW4gUGllcnNvbgogTWFydGlqbiBQaWV0ZXJzCitBbmFuZCBCLiBQaWxsYWkKIEZyYW7Dp29pcyBQaW5hcmQKK1RvbSBQaW5ja25leQogWmFjaCBQaW5jdXMKK1plcm8gUGlyYWV1cwogTWljaGFlbCBQaW90cm93c2tpCiBBbnRvaW5lIFBpdHJvdQogSmVhbi1GcmFuw6dvaXMgUGnDqXJvbm5lCitPbGVnIFBsYWtob3RueXVrCitSZW1pIFBvaW50ZWwKK0FyaWVsIFBvbGlhawogR3VpbGhlcm1lIFBvbG8KK0lsbGlhIFBvbG9zdWtoaW4KIE1pY2hhZWwgUG9tcmFuaW5nCitNYXJ0aW4gUG9vbAogSXVzdGluIFBvcAorQ2xhdWRpdSBQb3BhCiBKb2huIFBvcHBsZXdlbGwKK0d1aWxsYXVtZSBQcmF0dGUKIEFtcml0IFByZW0KIFBhdWwgUHJlc2NvZAogRG9ub3ZhbiBQcmVzdG9uCitQYXVsIFByaWNlCitJdWxpaWEgUHJvc2t1cm5pYQorSnlya2kgUHVsbGlhaW5lbgogU3RldmUgUHVyY2VsbAotRmVybmFuZG8gUMOpcmV6CiBFZHVhcmRvIFDDqXJlegorRmVybmFuZG8gUMOpcmV6CitQaWVycmUgUXVlbnRlbAogQnJpYW4gUXVpbmxhbgorS2V2aW4gSmluZyBRaXUKIEFuZGVycyBRdmlzdAorVGhvbWFzIFJhY2hlbAorUmFtIFJhY2h1bQorSsOpcsO0bWUgUmFkaXgKIEJ1cnRvbiBSYWRvbnMKK0plZmYgUmFtbmFuaQogQnJvZGllIFJhbworU2Vua28gUmFzaWMKIEFudHRpIFJhc2luZW4KK05pa29sYXVzIFJhdGgKIFNyaWRoYXIgUmF0bmFrdW1hcgotRXJpYyBSYXltb25kCitZc2ogUmF5CitFcmljIFMuIFJheW1vbmQKIEVkd2FyZCBLLiBSZWFtCiBDaHJpcyBSZWJlcnQKIE1hcmMgUmVjaHQKIEpvaG4gUmVkZm9yZAotVGVycnkgUmVlZHkKK1RlcnJ5IEouIFJlZWR5CiBHYXJldGggUmVlcwogU3RldmUgUmVldmVzCiBMZW5uYXJ0IFJlZ2Vicm8KK0pvaG4gUmVnZWhyCitGZWRlcmljbyBSZWdoZW56YW5pCiBPZmlyIFJlaWNoZW5iZXJnCiBTZWFuIFJlaWZzY2huZWlkZXIKIE1pY2hhZWwgUC4gUmVpbGx5CiBCZXJuaGFyZCBSZWl0ZXIKIFN0ZXZlbiBSZWl6CiBSb2VsYW5kIFJlbmdlbGluawotVGltIFJpY2UKK0FudG9pbmUgUmV2ZXJzYXQKK0Zsw6F2aW8gUmliZWlybwogRnJhbmNlc2NvIFJpY2NpYXJkaQorVGltIFJpY2UKIEphbiBQaWV0ZXIgUmllZ2VsCiBBcm1pbiBSaWdvCitBcmMgUmlsZXkKIE5pY2hvbGFzIFJpbGV5CiBKZWFuLUNsYXVkZSBSaW1iYXVsdAogVmxhZCBSaXNjdXRpYQorV2VzIFJpc2hlbAorRGFuaWVsIFJpdGkKIEp1YW4gTS4gQmVsbG8gUml2YXMKIERhdmlkZSBSaXp6bwogQW50aG9ueSBSb2FjaAorQ2FybCBSb2JiZW4KIE1hcmsgUm9iZXJ0cwotSmltIFJvYmluc29uCiBBbmR5IFJvYmluc29uCitKaW0gUm9iaW5zb24KK01hcmsgUm9kZHkKIEtldmluIFJvZGdlcnMKK1NlYW4gUm9kbWFuCiBHaWFtcGFvbG8gUm9kb2xhCitFbHNvbiBSb2RyaWd1ZXoKK0FkaSBSb2liYW4KK0x1aXMgUm9qYXMKIE1pa2UgUm9tYmVyZwogQXJtaW4gUm9uYWNoZXIKIENhc2UgUm9vbGUKIFRpbW90aHkgUm9zY29lCitFcmlrIFJvc2UKIEppbSBSb3NraW5kCitCcmlhbiBSb3NuZXIKK0d1aWRvIHZhbiBSb3NzdW0KIEp1c3QgdmFuIFJvc3N1bQogSHVnbyB2YW4gUm9zc3VtCiBTYXNraWEgdmFuIFJvc3N1bQogRG9uYWxkIFdhbGxhY2UgUm91c2UgSUkKIExpYW0gUm91dHQKK1RvZGQgUm92aXRvCiBDcmFpZyBSb3dsYW5kCiBDbGludG9uIFJveQogUGF1bCBSdWJpbgogU2FtIFJ1YnkKK0RlbXVyIFJ1bWVkCiBBdWR1biBTLiBSdW5kZQorRXJhbiBSdW5kc3RlaW4KIFJhdWxpIFJ1b2hvbmVuCiBKZWZmIFJ1c2gKIFNhbSBSdXNoaW5nCiBNYXJrIFJ1c3NlbGwKK1J1c3R5IFJ1c3NlbGwKIE5pY2sgUnVzc28KK0NocmlzIFJ5bGFuZAorQ29uc3RhbnRpbmEgUy4KK1BhdHJpY2sgU2FiaW4KIFPDqWJhc3RpZW4gU2FibMOpCiBTdW1hbiBTYWhhCiBIYWppbWUgU2FpdG91CiBHZW9yZ2UgU2Fra2lzCiBSaWNoIFNhbHoKIEtldmluIFNhbWJvcm4KK0FkcmlhbiBTYW1wc29uCitKYW1lcyBTYW5kZXJzCiBJbHlhIFNhbmRsZXIKK1JhZmFlbCBTYW50b3MKK1NpbW9uIFNhcGluCiBNYXJrIFNhcGlybwogVHkgU2FybmEKK0h1Z2ggU2Fzc2UKK0JvYiBTYXZhZ2UKIEJlbiBTYXllcgogc2J0CitNYXJjbyBTY2F0YWdsaW5pCitBbmRyZXcgU2NoYWFmCiBNaWNoYWVsIFNjaGFyZgorQW5kcmVhcyBTY2hhd28KIE5laWwgU2NoZW1lbmF1ZXIKIERhdmlkIFNjaGVyZXIKK1dvbGZnYW5nIFNjaGVyZXIKK0h5bmVrIFNjaGxhd2FjaworQm9iIFNjaG1lcnR6CiBHcmVnb3IgU2NobWlkCiBSYWxmIFNjaG1pdHQKIE1pY2hhZWwgU2NobmVpZGVyCiBQZXRlciBTY2huZWlkZXItS2FtcAogQXJ2aW4gU2NobmVsbAorU2NvdHQgU2NocmFtCitSb2JpbiBTY2hyZWliZXIKIENoYWQgSi4gU2Nocm9lZGVyCitDaHJpc3RpYW4gU2NodWJlcnQKIFNhbSBTY2h1bGVuYnVyZwogU3RlZmFuIFNjaHdhcnplcgogRGlldG1hciBTY2h3ZXJ0YmVyZ2VyCiBGZWRlcmljbyBTY2h3aW5kdAotU3RldmVuIFNjb3R0CiBCYXJyeSBTY290dAorU3RldmVuIFNjb3R0CiBOaWNrIFNlaWRlbm1hbgotxb1pZ2EgU2VpbG5hY2gKK8W9aWdhIFNlaWxuYWNodAorWXVyeSBTZWxpdmFub3YKIEZyZWQgU2VsbHMKIEppd29uIFNlbworScOxaWdvIFNlcm5hCitKb2FraW0gU2VybmJyYW50CitSb2dlciBELiBTZXJ3eQogSmVycnkgU2V1dHRlcgorUGV0ZSBTZXZhbmRlcgogRGVuaXMgU2V2ZXJzb24KIElhbiBTZXllcgorRGFuaWVsIFNoYWhhZgogSGEgU2hhbworTWFyayBTaGFubm9uCiBSaWNoYXJkIFNoYXBpcm8KK1ZhcnVuIFNoYXJtYQorVmxhZCBTaGNoZXJiaW5hCitKdXN0aW4gU2hlZWh5CitDaGFybGllIFNoZXBoZXJkCiBCcnVjZSBTaGVyd29vZAogQWxleGFuZGVyIFNoaWdpbgogUGV0ZSBTaGlubmVycwogTWljaGFlbCBTaGlwbGV0dAogSm9obiBXLiBTaGlwbWFuCiBKb2VsIFNocHJlbnR6Ci1JdGFtYXIgU2h0dWxsLVRyYXVyaW5nCitZdWUgU2h1YWlqaWUKK1RlcnJlbCBTaHVtd2F5CiBFcmljIFNpZWdlcm1hbgogUGF1bCBTaWpiZW4KK1NpbGVudEdob3N0CitUaW0gU2lsaworTWljaGFlbCBTaW1jaWNoCitJb25lbCBTaW1pb25lc2N1CiBLaXJpbGwgU2ltb25vdgogTmF0aGFuIFBhdWwgU2ltb25zCitHdWlsaGVybWUgU2ltw7VlcworQWRhbSBTaW1wa2lucworUmF2aSBTaW5oYQogSmFubmUgU2lua2tvbmVuCitOZyBQaGVuZyBTaW9uZwogR2VvcmdlIFNpcGUKIEouIFNpcHByZWxsCiBLcmFnZW4gU2l0YWtlcgotRXJpYyBWLiBTbWl0aAorTWljaGFlbCBTbG9hbgorTmljayBTbG9hbgorVsOhY2xhdiDFoG1pbGF1ZXIKIENocmlzdG9waGVyIFNtaXRoCitFcmljIFYuIFNtaXRoCiBHcmVnb3J5IFAuIFNtaXRoCitNYXJrIFNtaXRoCitSb3kgU21pdGgKK1J5YW4gU21pdGgtUm9iZXJ0cwogUmFmYWwgU21vdHJ6eWsKK0VyaWMgU25vdwogRGlyayBTb2VkZQogUGF1bCBTb2tvbG92c2t5CitFdmdlbnkgU29sb2d1Ym92CiBDb2R5IFNvbWVydmlsbGUKK0Vkb2FyZG8gU3BhZG9saW5pCiBDbGF5IFNwZW5jZQogU3RlZmFuIFNwZXJsaW5nCitOaWNob2xhcyBTcGllcwogUGVyIFNwaWxsaW5nCiBKb3NodWEgU3BvZXJyaQogTm9haCBTcHVycmllcgogTmF0aGFuIFNyZWJybwogUmFqR29wYWwgU3Jpbml2YXNhbgorVGFnZSBTdGFiZWxsLUt1bG8KIFF1ZW50aW4gU3RhZmZvcmQtRnJhc2VyCiBGcmFuayBTdGFqYW5vCitKb2VsIFN0YW5sZXkKK0FudGhvbnkgU3RhcmtzCiBPbGl2ZXIgU3RlZWxlCiBHcmVnIFN0ZWluCitCYXJ1Y2ggU3RlcmluCiBDaHJpcyBTdGVybgorQWxleCBTdGV3YXJ0CiBWaWN0b3IgU3Rpbm5lcgogUmljaGFyZCBTdG9ha2xleQogUGV0ZXIgU3RvZWhyCiBDYXNwZXIgU3RvZWwKIE1pY2hhZWwgU3RvbmUKK1NlcmhpeSBTdG9yY2hha2EKIEtlbiBTdG94Ci1QYXRyaWNrIFN0cmF3ZGVybWFuCiBEYW4gU3Ryb21iZXJnCitEb25hbGQgU3R1ZmZ0CiBEYW5pZWwgU3R1dHpiYWNoCiBBbmRyZWFzIFN0w7xocmsKK0NvbGluIFN1CitQYWwgU3ViYmlhaAogTmF0aGFuIFN1bGxpdmFuCiBNYXJrIFN1bW1lcmZpZWxkCitSZXViZW4gU3VtbmVyCitNYXJlayDFoHVwcGEKIEhpc2FvIFN1enVraQotQW5kcmV3IFN2ZXRsb3YKIEthbGxlIFN2ZW5zc29uCitBbmRyZXcgU3ZldGxvdgogUGF1bCBTd2FydHoKIFRoZW5hdWx0IFN5bHZhaW4KIFDDqXRlciBTemFiw7MKK0pvaG4gU3pha21laXN0ZXIKK0FtaXIgU3pla2VseQogQXJmcmV2ZXIgRnJlaHRlcyBUYWlmZXJzYXIgQXJhaGVzaXMKK0hpZGVha2kgVGFrYWhhc2hpCitJbmRyYSBUYWxpcAorTmVpbCBUYWxsaW0KIEdlb2ZmIFRhbHZvbGEKK011c2FzaGkgVGFtdXJhCiBXaWxsaWFtIFRhbmtzbGV5CiBDaHJpc3RpYW4gVGFuemVyCiBTdGV2ZW4gVGFzY2h1awotTW9udHkgVGF5bG9yCiBBbXkgVGF5bG9yCitNb250eSBUYXlsb3IKIEFuYXRvbHkgVGVjaHRvbmlrCiBNaWtoYWlsIFRlcmVraG92CitWaWN0b3IgVGVycsOzbgogUmljaGFyZCBNLiBUZXcKIFRvYmlhcyBUaGVsZW4KK0bDqXZyeSBUaGliYXVsdAorTG93ZSBUaGlkZXJtYW4KIE5pY29sYXMgTS4gVGhpw6lyeQogSmFtZXMgVGhvbWFzCiBSb2JpbiBUaG9tYXMKK0JyaWFuIFRob3JuZQogU3RlcGhlbiBUaG9ybmUKK0plcmVteSBUaHVyZ29vZAogRXJpYyBUaWVkZW1hbm4KK0p1bHkgVGlraG9ub3YKIFRyYWN5IFRpbXMKIE9yZW4gVGlyb3NoCiBKYXNvbiBUaXNobGVyCiBDaHJpc3RpYW4gVGlzbWVyCitKaW0gVGl0dHNsZXIKIEZyYW5rIEouIFRvYmluCi1SIExpbmRzYXkgVG9kZAogQmVubmV0dCBUb2RkCitSIExpbmRzYXkgVG9kZAorRXVnZW5lIFRvZGVyCitFcmlrIFRvbGxlcnVkCitTdGVwaGVuIFRvbmtpbgogTWF0aWFzIFRvcmNoaW5za3kKIFNhbmRybyBUb3NpCiBSaWNoYXJkIFRvd25zZW5kCitEYXZpZCBUb3duc2hlbmQKK05hdGhhbiBUcmFwdXp6YW5vCiBMYXVyZW5jZSBUcmF0dAorQWxiZXJ0byBUcmV2aW5vCitNYXR0aGlhcyBUcm9mZmFlcworVG9tIFRyb21leQogSm9obiBUcm9tcAorRGlhbmUgVHJvdXQKIEphc29uIFRyb3dicmlkZ2UKK0JyZW50IFR1YmJzCiBBbnRob255IFR1aW5pbmdhCitFcm5vIFR1a2lhCitEYXZpZCBUdXJuZXIKIFN0ZXBoZW4gVHVybmVyCitJdGFtYXIgVHVybmVyLVRyYXVyaW5nCiBUaGVvZG9yZSBUdXJvY3kKIEJpbGwgVHV0dAorRnJhc2VyIFR3ZWVkYWxlCiBEb29iZWUgUi4gVHplY2sKIEVyZW4gVMO8cmtheQogTGlvbmVsIFVsbWVyCiBSb2dlciBVcG9sZQorRGFuaWVsIFVyYmFuCiBNaWNoYWVsIFVybWFuCiBIZWN0b3IgVXJ0dWJpYQorVmlsbGUgVmFpbmlvCiBBbmRpIFZhamRhCiBDYXNlIFZhbiBIb3JzZW4KIEt5bGUgVmFuZGVyQmVlaworQW5kcmV3IFZhbnQKIEF0dWwgVmFybWEKIERtaXRyeSBWYXNpbGlldgorU2ViYXN0aWFuIE9ydGl6IFZhc3F1ZXoKIEFsZXhhbmRyZSBWYXNzYWxvdHRpCitOYWRlZW0gVmF3ZGEKIEZyYW5rIFZlcmNydWVzc2UKIE1pa2UgVmVyZG9uZQogSmFhcCBWZXJtZXVsZW4KK05pa2l0YSBWZXRvc2hraW4KIEFsIFZlenphCiBKYWNxdWVzIEEuIFZpZHJpbmUKIEpvaG4gVmllZ2EKK0Rpbm8gVmllaGxhbmQKIEthbm5hbiBWaWpheWFuCiBLdXJ0IFZpbGUKIE5vcm1hbiBWaW5lCitQYXVsaSBWaXJ0YW5lbgogRnJhbmsgVmlzc2VyCitKb2hhbm5lcyBWb2dlbAorQWxleCBWb2xrb3YKK0d1aWRvIFZyYW5rZW4KK01hcnRpam4gVnJpZXMKK1Nqb2VyZCBkZSBWcmllcwogTmlraSBXLiBXYWliZWwKIFdvanRlayBXYWxjemFrCiBDaGFybGVzIFdhbGRtYW4KIFJpY2hhcmQgV2Fsa2VyCiBMYXJyeSBXYWxsCiBLZXZpbiBXYWx6ZXIKK1JvZHJpZ28gU3RlaW5tdWxsZXIgV2FuZGVybGV5CitLZSBXYW5nCiBHcmVnIFdhcmQKK1RvbSBXYXJkaWxsCitaYWNoYXJ5IFdhcmUKK0pvbmFzIFdhZ25lcgogQmFycnkgV2Fyc2F3CiBTdGV2ZSBXYXRlcmJ1cnkKIEJvYiBXYXRzb24KK0RhdmlkIFdhdHNvbgogQWFyb24gV2F0dGVycwogSGVucmlrIFdlYmVyCiBDb3JyYW4gV2Vic3RlcgorR2x5biBXZWJzdGVyCitQaGlsIFdlYnN0ZXIKIFN0ZWZhbiBXZWhyCiBaYWNrIFdlaW5iZXJnCitCb2IgV2VpbmVyCiBFZHdhcmQgV2VsYm91cm5lCiBDbGlmZiBXZWxscwogUmlja2FyZCBXZXN0bWFuCkBAIC04OTMsMTMgKzE0MjgsMjEgQEAKIEZlbGl4IFdpZW1hbm4KIEdlcnJ5IFdpZW5lcgogRnJhbmsgV2llcnpiaWNraQorU2FudG9zbyBXaWpheWEKIEJyeWNlICJab29rbyIgV2lsY294LU8nSGVhcm4KK1RpbW90aHkgV2lsZAorSmFrdWIgV2lsaworR2VyYWxkIFMuIFdpbGxpYW1zCiBKYXNvbiBXaWxsaWFtcwogSm9obiBXaWxsaWFtcwogU3VlIFdpbGxpYW1zCi1HZXJhbGQgUy4gV2lsbGlhbXMKK0Nhcm9sIFdpbGxpbmcKK1N0ZXZlbiBXaWxsaXMKIEZyYW5rIFdpbGxpc29uCitHZW9mZiBXaWxzb24KIEdyZWcgVi4gV2lsc29uCitKIERlcmVrIFdpbHNvbgorUGF1bCBXaW5rbGVyCiBKb2R5IFdpbnN0b24KIENvbGxpbiBXaW50ZXIKIERpayBXaW50ZXIKQEAgLTkwOSwyMSArMTQ1MiwzMCBAQAogSm9obiBXaXNlbWFuCiBDaHJpcyBXaXRoZXJzCiBTdGVmYW4gV2l0emVsCitJcmVrIFdsaXpsbwogRGF2aWQgV29sZXZlcgogS2xhdXMtSnVlcmdlbiBXb2xmCiBEYW4gV29sZmUKIFJpY2hhcmQgV29sZmYKLURhcnJlbiBXb3JyYWxsCitBZGFtIFdvb2RiZWNrCitTdGV2ZW4gV29yawogR29yZG9uIFdvcmxleQorRGFycmVuIFdvcnJhbGwKIFRob21hcyBXb3V0ZXJzCitEYW5pZWwgV296bmlhawogSGVpa28gV3VuZHJhbQogRG91ZyBXeWF0dAorUm9iZXJ0IFhpYW8KIEZsb3JlbnQgWGljbHVuYQogSGlyb2thenUgWWFtYW1vdG8KIEthLVBpbmcgWWVlCitKYXNvbiBZZW8KK0V1bmdKdW4gWWkKIEJvYiBZb2Rsb3dza2kKIERhbm55IFlvbworUm9yeSBZb3JrZQogR2VvcmdlIFlvc2hpZGEKK0thenVoaXJvIFlvc2hpZGEKIE1hc2F6dW1pIFlvc2hpa2F3YQogQXJuYXVkIFlzbWFsCiBCZXJuYXJkIFl1ZQpAQCAtOTMxLDcgKzE0ODMsMTMgQEAKIE1pbGFuIFphbWF6YWwKIEFydHVyIFphcHJ6YWxhCiBNaWtlIFphcm5zdG9yZmYKK1l1cnkgVi4gWmF5dHNldgogU2llYnJlbiB2YW4gZGVyIFplZQorTmlja29sYWkgWmVsZG92aWNoCitZdXhpYW8gWmVuZwogVXdlIFplc3NpbgorQ2hlbmcgWmhhbmcKK0thaSBaaHUKIFRhcmVrIFppYWTDqQorR2VubmFkaXkgWmxvYmluCiBQZXRlciDDhXN0cmFuZApkaWZmIC0tZ2l0IGEvTWlzYy9ORVdTIGIvTWlzYy9ORVdTCmluZGV4IDE4MTk2NTMuLjI3YTYzMjIgMTAwNjQ0Ci0tLSBhL01pc2MvTkVXUworKysgYi9NaXNjL05FV1MKQEAgLTEsMjIgKzEsMjQzNyBAQAorKysrKysrKysrKysKIFB5dGhvbiBOZXdzCiArKysrKysrKysrKwogCi1XaGF0J3MgTmV3IGluIFB5dGhvbiAyLjcuMz8KLT09PT09PT09PT09PT09PT09PT09PT09PT09PQorV2hhdCdzIE5ldyBpbiBQeXRob24gMi43Ljk/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PQogCiAqUmVsZWFzZSBkYXRlOiBYWFhYLVhYLVhYKgogCiBDb3JlIGFuZCBCdWlsdGlucwogLS0tLS0tLS0tLS0tLS0tLS0KIAorLSBJc3N1ZSAjMjIwMjM6IEZpeCBgYCVTYGAsIGBgJVJgYCBhbmQgYGAlVmBgIGZvcm1hdHMgb2YKKyAgOmM6ZnVuYzpgUHlVbmljb2RlX0Zyb21Gb3JtYXRgLgorCistIElzc3VlICMyMTU5MTogQ29ycmVjdGx5IGhhbmRsZSBxdWFsaWZpZWQgZXhlYyBzdGF0ZW1lbnRzIGluIHR1cGxlIGZvcm0gYnkKKyAgbW92aW5nIGNvbXBhdGliaWxpdHkgbGF5ZXIgZnJvbSBydW4tdGltZSB0byBBU1QgdHJhbnNmb3JtYXRpb24uCisKK0xpYnJhcnkKKy0tLS0tLS0KKworLSBJc3N1ZSAjMjE1ODA6IE5vdyBUa2ludGVyIGNvcnJlY3RseSBoYW5kbGVzIGJpbmFyeSAiZGF0YSIgYW5kICJtYXNrZGF0YSIKKyAgY29uZmlndXJlIG9wdGlvbnMgb2YgdGtpbnRlci5QaG90b0ltYWdlLgorCistIElzc3VlICMxOTYxMjogc3VicHJvY2Vzcy5jb21tdW5pY2F0ZSgpIG5vdyBhbHNvIGlnbm9yZXMgRUlOVkFMIHdoZW4gdXNpbmcgYXQKKyAgbGVhc3QgdHdvIHBpcGVzLgorCistIEZpeCByZXByKF9zb2NrZXQuc29ja2V0KSBvbiBXaW5kb3dzIDY0LWJpdDogZG9uJ3QgZmFpbCB3aXRoIE92ZXJmbG93RXJyb3IKKyAgb24gY2xvc2VkIHNvY2tldC4KKworLSBJc3N1ZSAjMTYxMzM6IFRoZSBhc3luY2hhdC5hc3luY19jaGF0LmhhbmRsZV9yZWFkKCkgbWV0aG9kIG5vdyBpZ25vcmVzCisgIHNvY2tldC5lcnJvcigpIGV4Y2VwdGlvbnMgd2l0aCBibG9ja2luZyBJL08gZXJyb3JzOiBFQUdBSU4sIEVBTFJFQURZLAorICBFSU5QUk9HUkVTUywgb3IgRVdPVUxEQkxPQ0suCisKKy0gSXNzdWUgIzIxOTkwOiBDbGVhbi11cCB1bm5lY2Vzc2FyeSBhbmQgc2xvdyBpbm5lciBjbGFzcyBkZWZpbml0aW9uIGluCisgIHNheHV0aWxzIChDb250cmlidXRlZCBieSBBbGV4IEdheW5vcikuCisKKy0gSXNzdWUgIzE3MzAxMzY6IEZpeCB0aGUgY29tcGFyaXNvbiBiZXR3ZWVuIGEgdGtGb250LkZvbnQgYW5kIGFuIG9iamVjdCBvZgorICBhbm90aGVyIGtpbmQuCisKKy0gSXNzdWUgIzE5ODg0OiByZWFkbGluZTogRGlzYWJsZSB0aGUgbWV0YSBtb2RpZmllciBrZXkgaWYgc3Rkb3V0IGlzIG5vdAorICBhIHRlcm1pbmFsIHRvIG5vdCB3cml0ZSB0aGUgQU5TSSBzZXF1ZW5jZSAiXDAzM1sxMDM0aCIgaW50byBzdGRvdXQuIFRoaXMKKyAgc2VxdWVuY2UgaXMgdXNlZCBvbiBzb21lIHRlcm1pbmFsIChleDogVEVSTT14dGVybS0yNTZjb2xvciIpIHRvIGVuYWJsZQorICBzdXBwb3J0IG9mIDggYml0IGNoYXJhY3RlcnMuCisKKy0gSXNzdWUgIzIyMDE3OiBDb3JyZWN0IHJlZmVyZW5jZSBjb3VudGluZyBlcnJyb3IgaW4gdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZQorICBfd2FybmluZ3MgbW9kdWxlLgorCistIElzc3VlICMyMTg2ODogUHJldmVudCB0dXJ0bGUgY3Jhc2ggd2hlbiB1bmRvIGJ1ZmZlciBzZXQgdG8gYSB2YWx1ZSBsZXNzCisgIHRoYW4gb25lLgorCistIElzc3VlICMyMTE1MTogRml4ZWQgYSBzZWdmYXVsdCBpbiB0aGUgX3dpbnJlZyBtb2R1bGUgd2hlbiBgYE5vbmVgYCBpcyBwYXNzZWQKKyAgYXMgYSBgYFJFR19CSU5BUllgYCB2YWx1ZSB0byBTZXRWYWx1ZUV4LiAgUGF0Y2ggYnkgSm9obiBFaHJlc21hbi4KKworLSBJc3N1ZSAjMjEwOTA6IGlvLkZpbGVJTy5yZWFkYWxsKCkgZG9lcyBub3QgaWdub3JlIEkvTyBlcnJvcnMgYW55bW9yZS4gQmVmb3JlLAorICBpdCBpZ25vcmVkIEkvTyBlcnJvcnMgaWYgYXQgbGVhc3QgdGhlIGZpcnN0IEMgY2FsbCByZWFkKCkgc3VjY2VlZC4KKworLSBJc3N1ZSAjMTk4NzA6IEJhc2VDb29raWUgbm93IHBhcnNlcyAnc2VjdXJlJyBhbmQgJ2h0dHBvbmx5JyBmbGFncy4KKyAgQmFja3BvcnQgb2YgaXNzdWUgIzE2NjExLgorCistIElzc3VlICMyMTkyMzogUHJldmVudCBBdHRyaWJ1dGVFcnJvciBpbiBkaXN0dXRpbHMuc3lzY29uZmlnLmN1c3RvbWl6ZV9jb21waWxlcgorICBkdWUgdG8gcG9zc2libGUgdW5pbml0aWFsaXplZCBfY29uZmlnX3ZhcnMuCisKKy0gSXNzdWUgIzIxMzIzOiBGaXggQ0dJSFRUUFNlcnZlciB0byBhZ2FpbiBoYW5kbGUgc2NyaXB0cyBpbiBDR0kgc3ViZGlyZWN0b3JpZXMsCisgIGJyb2tlbiBieSB0aGUgZml4IGZvciBzZWN1cml0eSBpc3N1ZSAjMTk0MzUuICBQYXRjaCBieSBaYWNoIEJ5cm5lLgorCitUZXN0cworLS0tLS0KKworLSBJc3N1ZSAjMjE5NzY6IEZpeCB0ZXN0X3NzbCB0byBhY2NlcHQgTGlicmVTU0wgdmVyc2lvbiBzdHJpbmdzLiAgVGhhbmtzCisgIHRvIFdpbGxpYW0gT3JyLgorCitCdWlsZAorLS0tLS0KKworLSBJc3N1ZSAjMjE5NTg6IERlZmluZSBIQVZFX1JPVU5EIHdoZW4gYnVpbGRpbmcgd2l0aCBWaXN1YWwgU3R1ZGlvIDIwMTMgYW5kCisgIGFib3ZlLiAgUGF0Y2ggYnkgWmFjaGFyeSBUdXJuZXIuCisKKy0gSXNzdWUgIzE1NzU5OiAibWFrZSBzdXNwaWNpb3VzIiwgIm1ha2UgbGlua2NoZWNrIiBhbmQgIm1ha2UgZG9jdGVzdCIgaW4gRG9jLworICBub3cgZGlzcGxheSBzcGVjaWFsIG1lc3NhZ2Ugd2hlbiBhbmQgb25seSB3aGVuIHRoZXJlIGFyZSBmYWlsdXJlcy4KKworCitXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjcuOD8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAyMDE0LTA2LTI5KgorCitDb3JlIGFuZCBCdWlsdGlucworLS0tLS0tLS0tLS0tLS0tLS0KKworLSBJc3N1ZSAjNDM0NjogSW4gUHlPYmplY3RfQ2FsbE1ldGhvZCBhbmQgUHlPYmplY3RfQ2FsbE1ldGhvZE9iakFyZ3MsIGRvbid0CisgIG92ZXJ3cml0ZSB0aGUgZXJyb3Igc2V0IGluIFB5T2JqZWN0X0dldEF0dHIuCisKKy0gSXNzdWUgIzIxODMxOiBBdm9pZCBpbnRlZ2VyIG92ZXJmbG93IHdoZW4gbGFyZ2Ugc2l6ZXMgYW5kIG9mZnNldHMgYXJlIGdpdmVuIHRvCisgIHRoZSBidWZmZXIgdHlwZS4KKworLSBJc3N1ZSAjMTg1NjogQXZvaWQgY3Jhc2hlcyBhbmQgbG9ja3VwcyB3aGVuIGRhZW1vbiB0aHJlYWRzIHJ1biB3aGlsZSB0aGUKKyAgaW50ZXJwcmV0ZXIgaXMgc2h1dHRpbmcgZG93bjsgaW5zdGVhZCwgdGhlc2UgdGhyZWFkcyBhcmUgbm93IGtpbGxlZCB3aGVuIHRoZXkKKyAgdHJ5IHRvIHRha2UgdGhlIEdJTC4KKworLSBJc3N1ZSAjMTk2NTY6IFJ1bm5pbmcgUHl0aG9uIHdpdGggdGhlIC0zIG9wdGlvbiBub3cgYWxzbyB3YXJucyBhYm91dAorICBub24tYXNjaWkgYnl0ZXMgbGl0ZXJhbHMuCisKKy0gSXNzdWUgIzIxNjQyOiBJZiB0aGUgY29uZGl0aW9uYWwgaWYtZWxzZSBleHByZXNzaW9uLCBhbGxvdyBhbiBpbnRlZ2VyIHdyaXR0ZW4KKyAgd2l0aCBubyBzcGFjZSBiZXR3ZWVuIGl0c2VsZiBhbmQgdGhlIGBgZWxzZWBgIGtleXdvcmQgKGUuZy4gYGBUcnVlIGlmIDQyZWxzZQorICBGYWxzZWBgKSB0byBiZSB2YWxpZCBzeW50YXguCisKKy0gSXNzdWUgIzIxNTIzOiBGaXggb3Zlci1wZXNzaW1pc3RpYyBjb21wdXRhdGlvbiBvZiB0aGUgc3RhY2sgZWZmZWN0IG9mCisgIHNvbWUgb3Bjb2RlcyBpbiB0aGUgY29tcGlsZXIuICBUaGlzIGFsc28gZml4ZXMgYSBxdWFkcmF0aWMgY29tcGlsYXRpb24KKyAgdGltZSBpc3N1ZSBub3RpY2VhYmxlIHdoZW4gY29tcGlsaW5nIGNvZGUgd2l0aCBhIGxhcmdlIG51bWJlciBvZiAiYW5kIgorICBhbmQgIm9yIiBvcGVyYXRvcnMuCisKK0xpYnJhcnkKKy0tLS0tLS0KKworLSBJc3N1ZSAjMjE2NTI6IFByZXZlbnQgbWltZXR5cGVzLnR5cGVfbWFwIGZyb20gY29udGFpbmluZyB1bmljb2RlIGtleXMgb24KKyAgV2luZG93cy4KKworLSBJc3N1ZSAjMjE3Mjk6IFVzZWQgdGhlICJ3aXRoIiBzdGF0ZW1lbnQgaW4gdGhlIGRibS5kdW1iIG1vZHVsZSB0byBlbnN1cmUKKyAgZmlsZXMgY2xvc2luZy4KKworLSBJc3N1ZSAjMjE2NzI6IEZpeCB0aGUgYmVoYXZpb3Igb2YgbnRwYXRoLmpvaW4gb24gVU5DLXN0eWxlIHBhdGhzLgorCistIElzc3VlICMxOTE0NTogIFRoZSB0aW1lcyBhcmd1bWVudCBmb3IgaXRlcnRvb2xzLnJlcGVhdCBub3cgaGFuZGxlcworICBuZWdhdGl2ZSB2YWx1ZXMgdGhlIHNhbWUgd2F5IGZvciBrZXl3b3JkIGFyZ3VtZW50cyBhcyBpdCBkb2VzIGZvcgorICBwb3NpdGlvbmFsIGFyZ3VtZW50cy4KKworLSBJc3N1ZSAjMjE4MzI6ICBSZXF1aXJlIG5hbWVkIHR1cGxlIGlucHV0cyB0byBiZSBleGFjdCBzdHJpbmdzLgorCistIElzc3VlICM4MzQzOiAgTmFtZWQgZ3JvdXAgZXJyb3IgbWVzc2FnZXMgaW4gdGhlIHJlIG1vZHVsZSBkaWQgbm90IHNob3cKKyAgdGhlIG5hbWUgb2YgdGhlIGVycm9uZW91cyBncm91cC4KKworLSBJc3N1ZSAjMjE0OTE6IFNvY2tldFNlcnZlcjogRml4IGEgcmFjZSBjb25kaXRpb24gaW4gY2hpbGQgcHJvY2Vzc2VzIHJlYXBpbmcuCisKKy0gSXNzdWUgIzIxNjM1OiAgVGhlIGRpZmZsaWIgU2VxdWVuY2VNYXRjaGVyLmdldF9tYXRjaGluZ19ibG9ja3MoKSBtZXRob2QKKyAgY2FjaGUgZGlkbid0IG1hdGNoIHRoZSBhY3R1YWwgcmVzdWx0LiAgVGhlIGZvcm1lciB3YXMgYSBsaXN0IG9mIHR1cGxlcworICBhbmQgdGhlIGxhdHRlciB3YXMgYSBsaXN0IG9mIG5hbWVkIHR1cGxlcy4KKworLSBJc3N1ZSAjMjE3MjI6IFRoZSBkaXN0dXRpbHMgInVwbG9hZCIgY29tbWFuZCBub3cgZXhpdHMgd2l0aCBhIG5vbi16ZXJvCisgIHJldHVybiBjb2RlIHdoZW4gdXBsb2FkaW5nIGZhaWxzLiAgUGF0Y2ggYnkgTWFydGluIERlbmdsZXIuCisKKy0gSXNzdWUgIzIxNzY2OiBQcmV2ZW50IGEgc2VjdXJpdHkgaG9sZSBpbiBDR0lIVFRQU2VydmVyIGJ5IFVSTCB1bnF1b3RpbmcgcGF0aHMKKyAgYmVmb3JlIGNoZWNraW5nIGZvciBhIENHSSBzY3JpcHQgYXQgdGhhdCBwYXRoLgorCistIElzc3VlICMyMTMxMDogRml4ZWQgcG9zc2libGUgcmVzb3VyY2UgbGVhayBpbiBmYWlsZWQgb3BlbigpLgorCistIElzc3VlICMyMTMwNDogQmFja3BvcnQgdGhlIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uIGhhc2hsaWIucGJrZGYyX2htYWMgZnJvbQorICBQeXRob24gMyBwZXIgUEVQIDQ2Ni4KKworLSBJc3N1ZSAjMTE3MDk6IEZpeCB0aGUgcHlkb2MuaGVscCBmdW5jdGlvbiB0byBub3QgZmFpbCB3aGVuIHN5cy5zdGRpbiBpcyBub3QgYQorICB2YWxpZCBmaWxlLgorCistIElzc3VlICMxMzIyMzogRml4IHB5ZG9jLndyaXRlZG9jIHNvIHRoYXQgdGhlIEhUTUwgZG9jdW1lbnRhdGlvbiBmb3IgbWV0aG9kcworICB0aGF0IHVzZSAnc2VsZicgaW4gdGhlIGV4YW1wbGUgY29kZSBpcyBnZW5lcmF0ZWQgY29ycmVjdGx5LgorCistIElzc3VlICMyMTU1MjogRml4ZWQgcG9zc2libGUgaW50ZWdlciBvdmVyZmxvdyBvZiB0b28gbG9uZyBzdHJpbmcgbGVuZ3RocyBpbgorICB0aGUgdGtpbnRlciBtb2R1bGUgb24gNjQtYml0IHBsYXRmb3Jtcy4KKworLSBJc3N1ZSAjMTQzMTU6IFRoZSB6aXBmaWxlIG1vZHVsZSBub3cgaWdub3JlcyBleHRyYSBmaWVsZHMgaW4gdGhlIGNlbnRyYWwKKyAgZGlyZWN0b3J5IHRoYXQgYXJlIHRvbyBzaG9ydCB0byBiZSBwYXJzZWQgaW5zdGVhZCBvZiBsZXR0aW5nIGEgc3RydWN0LnVucGFjaworICBlcnJvciBidWJibGUgdXAgYXMgdGhpcyAiYmFkIGRhdGEiIGFwcGVhcnMgaW4gbWFueSByZWFsIHdvcmxkIHppcCBmaWxlcyBpbgorICB0aGUgd2lsZCBhbmQgaXMgaWdub3JlZCBieSBvdGhlciB6aXAgdG9vbHMuCisKKy0gSXNzdWUgIzIxNDAyOiBUa2ludGVyLnR0ayBub3cgd29ya3Mgd2hlbiBkZWZhdWx0IHJvb3Qgd2luZG93IGlzIG5vdCBzZXQuCisKKy0gSXNzdWUgIzEwMjAzOiBzcWxpdGUzLlJvdyBub3cgdHJ1bHkgc3VwcG9ydHMgc2VxdWVuY2UgcHJvdG9jb2wuICBJbiBwYXJ0aWN1bHIKKyAgaXQgc3VwcG9ydHMgcmV2ZXJzZSgpIGFuZCBuZWdhdGl2ZSBpbmRpY2VzLiAgT3JpZ2luYWwgcGF0Y2ggYnkgQ2xhdWRpdSBQb3BhLgorCistIElzc3VlICM4NzQzOiBGaXggaW50ZXJvcGVyYWJpbGl0eSBiZXR3ZWVuIHNldCBvYmplY3RzIGFuZCB0aGUKKyAgY29sbGVjdGlvbnMuU2V0KCkgYWJzdHJhY3QgYmFzZSBjbGFzcy4KKworLSBJc3N1ZSAjMjE0ODE6ICBBcmdwYXJzZSBlcXVhbGl0eSBhbmQgaW5lcXVhbGl0eSB0ZXN0cyBub3cgcmV0dXJuCisgIE5vdEltcGxlbWVudGVkIHdoZW4gY29tcGFyaW5nIHRvIGFuIHVua25vd24gdHlwZS4KKworSURMRQorLS0tLQorCistIElzc3VlICMyMTk0MDogQWRkIHVuaXR0ZXN0IGZvciBXaWRnZXRSZWRpcmVjdG9yLiBJbml0aWFsIHBhdGNoIGJ5IFNhaW1hZGhhdgorICBIZWJsaWthci4KKworLSBJc3N1ZSAjMTg1OTI6IEFkZCB1bml0dGVzdCBmb3IgU2VhcmNoRGlhbG9nQmFzZS4gUGF0Y2ggYnkgUGhpbCBXZWJzdGVyLgorCistIElzc3VlICMyMTY5NDogQWRkIHVuaXR0ZXN0IGZvciBQYXJlbk1hdGNoLiBQYXRjaCBieSBTYWltYWRoYXYgSGVibGlrYXIuCisKKy0gSXNzdWUgIzIxNjg2OiBhZGQgdW5pdHRlc3QgZm9yIEh5cGVyUGFyc2VyLiBPcmlnaW5hbCBwYXRjaCBieSBTYWltYWRoYXYKKyAgSGVibGlrYXIuCisKKy0gSXNzdWUgIzEyMzg3OiBBZGQgbWlzc2luZyB1cHBlcihsb3dlciljYXNlIHZlcnNpb25zIG9mIGRlZmF1bHQgV2luZG93cyBrZXkKKyAgYmluZGluZ3MgZm9yIElkbGUgc28gQ2FwcyBMb2NrIGRvZXMgbm90IGRpc2FibGUgdGhlbS4gUGF0Y2ggYnkgUm9nZXIgU2Vyd3kuCisKKy0gSXNzdWUgIzIxNjk1OiBDbG9zaW5nIGEgRmluZC1pbi1maWxlcyBvdXRwdXQgd2luZG93IHdoaWxlIHRoZSBzZWFyY2ggaXMKKyAgc3RpbGwgaW4gcHJvZ3Jlc3Mgbm8gbG9uZ2VyIGNsb3NlcyBJZGxlLgorCistIElzc3VlICMxODkxMDogQWRkIHVuaXR0ZXN0IGZvciB0ZXh0Vmlldy4gUGF0Y2ggYnkgUGhpbCBXZWJzdGVyLgorCistIElzc3VlICMxODI5MjogQWRkIHVuaXR0ZXN0IGZvciBBdXRvRXhwYW5kLiBQYXRjaCBieSBTYWloYWRoYXYgSGVibGlrYXIuCisKKy0gSXNzdWUgIzE4NDA5OiBBZGQgdW5pdHRlc3QgZm9yIEF1dG9Db21wbGV0ZS4gUGF0Y2ggYnkgUGhpbCBXZWJzdGVyLgorCitUZXN0cworLS0tLS0KKworLSBJc3N1ZSAjMjAxNTU6IENoYW5nZWQgSFRUUCBtZXRob2QgbmFtZXMgaW4gZmFpbGluZyB0ZXN0cyBpbiB0ZXN0X2h0dHBzZXJ2ZXJzCisgIHNvIHRoYXQgcGFja2V0IGZpbHRlcmluZyBzb2Z0d2FyZSAoc3BlY2lmaWNhbGx5IFdpbmRvd3MgQmFzZSBGaWx0ZXJpbmcgRW5naW5lKQorICBkb2VzIG5vdCBpbnRlcmZlcmUgd2l0aCB0aGUgdHJhbnNhY3Rpb24gc2VtYW50aWNzIGV4cGVjdGVkIGJ5IHRoZSB0ZXN0cy4KKworLSBJc3N1ZSAjMTk0OTM6IFJlZmFjdG9yZWQgdGhlIGN0eXBlcyB0ZXN0IHBhY2thZ2UgdG8gc2tpcCB0ZXN0cyBleHBsaWNpdGx5CisgIHJhdGhlciB0aGFuIHNpbGVudGx5LgorCistIElzc3VlICMxODQ5MjogQWxsIHJlc291cmNlcyBhcmUgbm93IGFsbG93ZWQgd2hlbiB0ZXN0cyBhcmUgbm90IHJ1biBieQorICByZWdydGVzdC5weS4KKworLSBJc3N1ZSAjMjE2MDU6IEFkZGVkIHRlc3RzIGZvciBUa2ludGVyIGltYWdlcy4KKworLSBJc3N1ZSAjMjE0OTM6IEFkZGVkIHRlc3QgZm9yIG50cGF0aC5leHBhbmR1c2VyKCkuICBPcmlnaW5hbCBwYXRjaCBieQorICBDbGF1ZGl1IFBvcGEuCisKKy0gSXNzdWUgIzE5OTI1OiBBZGRlZCB0ZXN0cyBmb3IgdGhlIHNwd2QgbW9kdWxlLiBPcmlnaW5hbCBwYXRjaCBieSBWYWpyYXNreSBLb2suCisKKy0gSXNzdWUgIzEzMzU1OiByYW5kb20udHJpYW5ndWxhcigpIG5vIGxvbmdlciBmYWlscyB3aXRoIGEgWmVyb0RpdmlzaW9uRXJyb3IKKyAgd2hlbiBsb3cgZXF1YWxzIGhpZ2guCisKKy0gSXNzdWUgIzIxNTIyOiBBZGRlZCBUa2ludGVyIHRlc3RzIGZvciBMaXN0Ym94Lml0ZW1jb25maWd1cmUoKSwKKyAgUGFuZWRXaW5kb3cucGFuZWNvbmZpZ3VyZSgpLCBhbmQgTWVudS5lbnRyeWNvbmZpZ3VyZSgpLgorCistIElzc3VlICMyMDYzNTogQWRkZWQgdGVzdHMgZm9yIFRrIGdlb21ldHJ5IG1hbmFnZXJzLgorCitCdWlsZAorLS0tLS0KKworLSBJc3N1ZSAjMjE4MTE6IEFudGljaXBhdGVkIGZpeGVzIHRvIHN1cHBvcnQgT1MgWCB2ZXJzaW9ucyA+IDEwLjkuCisKK1dpbmRvd3MKKy0tLS0tLS0KKworLSBJc3N1ZSAjMjE2NzEsIENWRS0yMDE0LTAyMjQ6IFRoZSBidW5kbGVkIHZlcnNpb24gb2YgT3BlblNTTCBoYXMgYmVlbgorICB1cGRhdGVkIHRvIDEuMC4xaC4KKworV2hhdCdzIE5ldyBpbiBQeXRob24gMi43LjcKKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDIwMTQtMDUtMzEqCisKK0J1aWxkCistLS0tLQorCistIElzc3VlICMyMTQ2MjogQnVpbGQgdGhlIFdpbmRvd3MgaW5zdGFsbGVycyB3aXRoIE9wZW5TU0wgMS4wLjFnLgorCistIElzc3VlICMxOTg2NjogSW5jbHVkZSBzb21lIHRlc3QgZGF0YSBpbiB0aGUgV2luZG93cyBpbnN0YWxsZXJzLCBzbyB0ZXN0cyBkb24ndAorICBmYWlsLgorCisKK1doYXQncyBOZXcgaW4gUHl0aG9uIDIuNy43IHJlbGVhc2UgY2FuZGlkYXRlIDE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAyMDE0LTA1LTE3KgorCitDb3JlIGFuZCBCdWlsdGlucworLS0tLS0tLS0tLS0tLS0tLS0KKworLSBJc3N1ZSAjMjEzNTA6IEZpeCBmaWxlLndyaXRlbGluZXMoKSB0byBhY2NlcHQgYXJiaXRyYXJ5IGJ1ZmZlciBvYmplY3RzLAorICBhcyBhZHZlcnRpc2VkLiAgUGF0Y2ggYnkgQnJpYW4gS2Vhcm5zLgorCistIElzc3VlICMyMDQzNzogRml4ZWQgNDMgcG90ZW50aWFsIGJ1Z3Mgd2hlbiBkZWxldGluZyBvYmplY3RzIHJlZmVyZW5jZXMuCisKKy0gSXNzdWUgIzIxMTM0OiBGaXggc2VnZmF1bHQgd2hlbiBzdHIgaXMgY2FsbGVkIG9uIGFuIHVuaW5pdGlhbGl6ZWQKKyAgVW5pY29kZUVuY29kZUVycm9yLCBVbmljb2RlRGVjb2RlRXJyb3IsIG9yIFVuaWNvZGVUcmFuc2xhdGVFcnJvciBvYmplY3QuCisKKy0gSXNzdWUgIzIwNDk0OiBFbnN1cmUgdGhhdCBmcmVlKClkIG1lbW9yeSBhcmVuYXMgYXJlIHJlYWxseSByZWxlYXNlZCBvbiBQT1NJWAorICBzeXN0ZW1zIHN1cHBvcnRpbmcgYW5vbnltb3VzIG1lbW9yeSBtYXBwaW5ncy4gIFBhdGNoIGJ5IENoYXJsZXMtRnJhbsOnb2lzCisgIE5hdGFsaS4KKworLSBJc3N1ZSAjMTc4MjU6IEN1cnNvciAiXiIgaXMgY29ycmVjdGx5IHBvc2l0aW9uZWQgZm9yIFN5bnRheEVycm9yIGFuZAorICBJbmRlbnRhdGlvbkVycm9yLgorCistIFJhaXNlIGEgYmV0dGVyIGVycm9yIHdoZW4gbm9uLXVuaWNvZGUgY29kZWNzIGFyZSB1c2VkIGZvciBhIGZpbGUncyBjb2RpbmcKKyAgY29va2llLgorCistIElzc3VlICMxNzk3NjogRml4ZWQgcG90ZW50aWFsIHByb2JsZW0gd2l0aCBmaWxlLndyaXRlKCkgbm90IGRldGVjdGluZyBJTyBlcnJvcgorICBieSBpbnNwZWN0aW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgZndyaXRlKCkuICBCYXNlZCBvbiBwYXRjaGVzIGJ5IEphYWtrbyBNb2lzaW8KKyAgYW5kIFZpY3RvciBTdGlubmVyLgorCistIElzc3VlICMxNDQzMjogR2VuZXJhdG9yIG5vdyBjbGVhcnMgdGhlIGJvcnJvd2VkIHJlZmVyZW5jZSB0byB0aGUgdGhyZWFkCisgIHN0YXRlLiBGaXggYSBjcmFzaCB3aGVuIGEgZ2VuZXJhdG9yIGlzIGNyZWF0ZWQgaW4gYSBDIHRocmVhZCB0aGF0IGlzCisgIGRlc3Ryb3llZCB3aGlsZSB0aGUgZ2VuZXJhdG9yIGlzIHN0aWxsIHVzZWQuIFRoZSBpc3N1ZSB3YXMgdGhhdCBhIGdlbmVyYXRvcgorICBjb250YWlucyBhIGZyYW1lLCBhbmQgdGhlIGZyYW1lIGtlcHQgYSByZWZlcmVuY2UgdG8gdGhlIFB5dGhvbiBzdGF0ZSBvZiB0aGUKKyAgZGVzdHJveWVkIEMgdGhyZWFkLiBUaGUgY3Jhc2ggb2NjdXJzIHdoZW4gYSB0cmFjZSBmdW5jdGlvbiBpcyBzZXR1cC4KKworLSBJc3N1ZSAjMTk5MzI6IEZpeCB0eXBvIGluIGltcG9ydC5oLCBtaXNzaW5nIHdoaXRlc3BhY2VzIGluIGZ1bmN0aW9uIHByb3RvdHlwZXMuCisKKy0gSXNzdWUgIzE5NjM4OiBGaXggcG9zc2libGUgY3Jhc2ggLyB1bmRlZmluZWQgYmVoYXZpb3VyIGZyb20gaHVnZSAobW9yZSB0aGFuIDIKKyAgYmlsbGlvbiBjaGFyYWN0ZXJzKSBpbnB1dCBzdHJpbmdzIGluIF9QeV9kZ19zdHJ0b2QuCisKKy0gSXNzdWUgIzEyNTQ2OiBBbGxvdyBceDAwIHRvIGJlIHVzZWQgYXMgYSBmaWxsIGNoYXJhY3RlciB3aGVuIHVzaW5nIHN0ciwgaW50LAorICBmbG9hdCwgYW5kIGNvbXBsZXggX19mb3JtYXRfXyBtZXRob2RzLgorCitMaWJyYXJ5CistLS0tLS0tCisKKy0gSXNzdWUgIzEwNzQ0OiBGaXggUEVQIDMxMTggZm9ybWF0IHN0cmluZ3Mgb24gY3R5cGVzIG9iamVjdHMgd2l0aCBhIG5vbnRyaXZpYWwKKyAgc2hhcGUuCisKKy0gSXNzdWUgIzc3NzY6IEJhY2twb3J0IEZpeCBgYEhvc3Q6JycgaGVhZGVyIGFuZCByZWNvbm5lY3Rpb24gd2hlbiB1c2luZworICBodHRwLmNsaWVudC5IVFRQQ29ubmVjdGlvbi5zZXRfdHVubmVsKCkgZnJvbSBQeXRob24gMy4gIFBhdGNoIGJ5IE5pa29sYXVzCisgIFJhdGguCisKKy0gSXNzdWUgIzIxMzA2OiBCYWNrcG9ydCBobWFjLmNvbXBhcmVfZGlnZXN0IGZyb20gUHl0aG9uIDMuIFRoaXMgaXMgcGFydCBvZiBQRVAKKyAgNDY2LgorCistIElzc3VlICMyMTQ3MDogRG8gYSBiZXR0ZXIgam9iIHNlZWRpbmcgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGJ5CisgIHVzaW5nIGVub3VnaCBieXRlcyB0byBzcGFuIHRoZSBmdWxsIHN0YXRlIHNwYWNlIG9mIHRoZSBNZXJzZW5uZSBUd2lzdGVyLgorCistIElzc3VlICMyMTQ2OTogIFJlZHVjZWQgdGhlIHJpc2sgb2YgZmFsc2UgcG9zaXRpdmVzIGluIHJvYm90cGFyc2VyIGJ5CisgIGNoZWNraW5nIHRvIG1ha2Ugc3VyZSB0aGF0IHJvYm90cy50eHQgaGFzIGJlZW4gcmVhZCBvciBkb2VzIG5vdCBleGlzdAorICBwcmlvciB0byByZXR1cm5pbmcgVHJ1ZSBpbiBjYW5fZmV0Y2goKS4KKworLSBJc3N1ZSAjMjEzMjE6IGl0ZXJ0b29scy5pc2xpY2UoKSBub3cgcmVsZWFzZXMgdGhlIHJlZmVyZW5jZSB0byB0aGUgc291cmNlCisgIGl0ZXJhdG9yIHdoZW4gdGhlIHNsaWNlIGlzIGV4aGF1c3RlZC4gIFBhdGNoIGJ5IEFudG9uIEFmYW5hc3lldi4KKworLSBJc3N1ZSAjOTI5MTogRG8gbm90IGF0dGVtcHQgdG8gcmUtZW5jb2RlIG1pbWV0eXBlIGRhdGEgcmVhZCBmcm9tIHJlZ2lzdHJ5IGluCisgIEFOU0kgbW9kZS4gSW5pdGlhbCBwYXRjaGVzIGJ5IERtaXRyeSBKZW1lcm92ICYgVmxhZGltaXIgSW9maWsuCisKKy0gSXNzdWUgIzIxMzQ5OiBQYXNzaW5nIGEgbWVtb3J5dmlldyB0byBfd2lucmVnLlNldFZhbHVlRXggbm93IGNvcnJlY3RseSByYWlzZXMKKyAgYSBUeXBlRXJyb3Igd2hlcmUgaXQgcHJldmlvdXNseSBjcmFzaGVkIHRoZSBpbnRlcnByZXRlci4gUGF0Y2ggYnkgQnJpYW4gS2Vhcm5zCisKKy0gRml4IGFyYml0cmFyeSBtZW1vcnkgYWNjZXNzIGluIEpTT05EZWNvZGVyLnJhd19kZWNvZGUgd2l0aCBhIG5lZ2F0aXZlIHNlY29uZAorICBwYXJhbWV0ZXIuIEJ1ZyByZXBvcnRlZCBieSBHdWlkbyBWcmFua2VuLgorCistIElzc3VlICMyMTE3MjogaXNpbnN0YW5jZSBjaGVjayByZWxheGVkIGZyb20gZGljdCB0byBjb2xsZWN0aW9ucy5NYXBwaW5nLgorCistIElzc3VlICMyMTE5MTogSW4gb3MuZmRvcGVuLCBuZXZlciBjbG9zZSB0aGUgZmlsZSBkZXNjcmlwdG9yIHdoZW4gYW4gZXhjZXB0aW9uCisgIGhhcHBlbnMuCisKKy0gSXNzdWUgIzIxMTQ5OiBJbXByb3ZlZCB0aHJlYWQtc2FmZXR5IGluIGxvZ2dpbmcgY2xlYW51cCBkdXJpbmcgaW50ZXJwcmV0ZXIKKyAgc2h1dGRvd24uIFRoYW5rcyB0byBEZXZpbiBKZWFucGllcnJlIGZvciB0aGUgcGF0Y2guCisKKy0gRml4IHBvc3NpYmxlIG92ZXJmbG93IGJ1ZyBpbiBzdHJvcC5leHBhbmR0YWJzLiBZb3Ugc2hvdWxkbid0IGJlIHVzaW5nIHRoaXMKKyAgbW9kdWxlIQorCistIElzc3VlICMyMDE0NTogYGFzc2VydFJhaXNlc1JlZ2V4YCBub3cgcmFpc2VzIGEgVHlwZUVycm9yIGlmIHRoZSBzZWNvbmQKKyAgYXJndW1lbnQgaXMgbm90IGEgc3RyaW5nIG9yIGNvbXBpbGVkIHJlZ2V4LgorCistIElzc3VlICMyMTA1ODogRml4IGEgbGVhayBvZiBmaWxlIGRlc2NyaXB0b3IgaW4gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCksCisgIGNsb3NlIHRoZSBmaWxlIGRlc2NyaXB0b3IgaWYgb3MuZmRvcGVuKCkgZmFpbHMKKworLSBJc3N1ZSAjMjAyODM6IFJFIHBhdHRlcm4gbWV0aG9kcyBub3cgYWNjZXB0IHRoZSBzdHJpbmcga2V5d29yZCBwYXJhbWV0ZXJzCisgIGFzIGRvY3VtZW50ZWQuICBUaGUgcGF0dGVybiBhbmQgc291cmNlIGtleXdvcmQgcGFyYW1ldGVycyBhcmUgbGVmdCBhcworICBkZXByZWNhdGVkIGFsaWFzZXMuCisKKy0gSXNzdWUgIzExNTk5OiBXaGVuIGFuIGV4dGVybmFsIGNvbW1hbmQgKGUuZy4gY29tcGlsZXIpIGZhaWxzLCBkaXN0dXRpbHMgbm93CisgIHByaW50cyBvdXQgdGhlIHdob2xlIGNvbW1hbmQgbGluZSAoaW5zdGVhZCBvZiBqdXN0IHRoZSBjb21tYW5kIG5hbWUpIGlmIHRoZQorICBlbnZpcm9ubWVudCB2YXJpYWJsZSBESVNUVVRJTFNfREVCVUcgaXMgc2V0LgorCistIElzc3VlICM0OTMxOiBkaXN0dXRpbHMgc2hvdWxkIG5vdCBwcm9kdWNlIHVuaGVscGZ1bCAiZXJyb3I6IE5vbmUiIG1lc3NhZ2VzCisgIGFueW1vcmUuICBkaXN0dXRpbHMudXRpbC5ncm9rX2Vudmlyb25tZW50X2Vycm9yIGlzIGtlcHQgYnV0IGRvYy1kZXByZWNhdGVkLgorCistIEltcHJvdmUgdGhlIHJhbmRvbSBtb2R1bGUncyBkZWZhdWx0IHNlZWRpbmcgdG8gdXNlIDI1NiBiaXRzIG9mIGVudHJvcHkKKyAgZnJvbSBvcy51cmFuZG9tKCkuICBUaGlzIHdhcyBhbHJlYWR5IGRvbmUgZm9yIFB5dGhvbiAzLCBtaWxkbHkgaW1wcm92aW5nCisgIHNlY3VyaXR5IHdpdGggYSBiaWdnZXIgc2VlZCBzcGFjZS4KKworLSBJc3N1ZSAjMTU2MTg6IE1ha2UgdHVydGxlLnB5IGNvbXBhdGlibGUgd2l0aCAnZnJvbSBfX2Z1dHVyZV9fIGltcG9ydAorICB1bmljb2RlX2xpdGVyYWxzJy4gIEluaXRpYWwgcGF0Y2ggYnkgSnVhbmNhcmxvIEHDsWV6LgorCistIElzc3VlICMyMDUwMTogZmlsZWlucHV0IG1vZHVsZSBubyBsb25nZXIgcmVhZHMgd2hvbGUgZmlsZSBpbnRvIG1lbW9yeSB3aGVuIHVzaW5nCisgIGZpbGVpbnB1dC5ob29rX2VuY29kZWQuCisKKy0gSXNzdWUgIzY4MTU6IG9zLnBhdGguZXhwYW5kdmFycygpIG5vdyBzdXBwb3J0cyBub24tQVNDSUkgVW5pY29kZSBlbnZpcm9ubWVudAorICB2YXJpYWJsZXMgbmFtZXMgYW5kIHZhbHVlcy4KKworLSBJc3N1ZSAjMjA2MzU6IEZpeGVkIGdyaWRfY29sdW1uY29uZmlndXJlKCkgYW5kIGdyaWRfcm93Y29uZmlndXJlKCkgbWV0aG9kcyBvZgorICBUa2ludGVyIHdpZGdldHMgdG8gd29yayBpbiB3YW50b2JqZWN0cz1UcnVlIG1vZGUuCisKKy0gSXNzdWUgIzE3NjcxOiBGaXhlZCBhIGNyYXNoIHdoZW4gdXNlIG5vbi1pbml0aWFsaXplZCBpby5CdWZmZXJlZFJXUGFpci4KKyAgQmFzZWQgb24gcGF0Y2ggYnkgU3RlcGhlbiBUdS4KKworLSBJc3N1ZSAjODQ3ODogVW50b2tlbml6ZXIuY29tcGF0IHByb2Nlc3NlcyBmaXJzdCB0b2tlbiBmcm9tIGl0ZXJhdG9yIGlucHV0LgorICBQYXRjaCBiYXNlZCBvbiBsaW5lcyBmcm9tIEdlb3JnIEJyYW5kbCwgRXJpYyBTbm93LCBhbmQgR2FyZXRoIFJlZXMuCisKKy0gSXNzdWUgIzIwNTk0OiBBdm9pZCBuYW1lIGNsYXNoIHdpdGggdGhlIGxpYmMgZnVuY3Rpb24gcG9zaXhfY2xvc2UuCisKKy0gSXNzdWUgIzE5ODU2OiBzaHV0aWwubW92ZSgpIGZhaWxlZCB0byBtb3ZlIGEgZGlyZWN0b3J5IHRvIG90aGVyIGRpcmVjdG9yeQorICBvbiBXaW5kb3dzIGlmIHNvdXJjZSBuYW1lIGVuZHMgd2l0aCBvcy5hbHRzZXAuCisKKy0gSXNzdWUgIzE0OTgzOiBlbWFpbC5nZW5lcmF0b3Igbm93IGFsd2F5cyBhZGRzIGEgbGluZSBlbmQgYWZ0ZXIgZWFjaCBNSU1FCisgIGJvdW5kYXJ5IG1hcmtlciwgaW5zdGVhZCBvZiBkb2luZyBzbyBvbmx5IHdoZW4gdGhlcmUgaXMgYW4gZXBpbG9ndWUuICBUaGlzCisgIGZpeGVzIGFuIFJGQyBjb21wbGlhbmNlIGJ1ZyBhbmQgc29sdmVzIGFuIGlzc3VlIHdpdGggc2lnbmVkIE1JTUUgcGFydHMuCisKKy0gSXNzdWUgIzIwMDEzOiBTb21lIGltYXAgc2VydmVycyBkaXNjb25uZWN0IGlmIHRoZSBjdXJyZW50IG1haWxib3ggaXMKKyAgZGVsZXRlZCwgYW5kIGltYXBsaWIgZGlkIG5vdCBoYW5kbGUgdGhhdCBjYXNlIGdyYWNlZnVsbHkuICBOb3cgaXQKKyAgaGFuZGxlcyB0aGUgJ2J5ZScgY29ycmVjdGx5LgorCistIElzc3VlICMyMDQyNjogV2hlbiBwYXNzaW5nIHRoZSByZS5ERUJVRyBmbGFnLCByZS5jb21waWxlKCkgZGlzcGxheXMgdGhlCisgIGRlYnVnIG91dHB1dCBldmVyeSB0aW1lIGl0IGlzIGNhbGxlZCwgcmVnYXJkbGVzcyBvZiB0aGUgY29tcGlsYXRpb24gY2FjaGUuCisKKy0gSXNzdWUgIzIwMzY4OiBUaGUgbnVsbCBjaGFyYWN0ZXIgbm93IGNvcnJlY3RseSBwYXNzZWQgZnJvbSBUY2wgdG8gUHl0aG9uIChpbgorICB1bmljb2RlIHN0cmluZ3Mgb25seSkuICBJbXByb3ZlZCBlcnJvciBoYW5kbGluZyBpbiB2YXJpYWJsZXMtcmVsYXRlZCBjb21tYW5kcy4KKworLSBJc3N1ZSAjMjA0MzU6IEZpeCBfcHlpby5TdHJpbmdJTy5nZXR2YWx1ZSgpIHRvIHRha2UgaW50byBhY2NvdW50IG5ld2xpbmUKKyAgdHJhbnNsYXRpb24gc2V0dGluZ3MuCisKKy0gSXNzdWUgIzIwMjg4OiBmaXggaGFuZGxpbmcgb2YgaW52YWxpZCBudW1lcmljIGNoYXJyZWZzIGluIEhUTUxQYXJzZXIuCisKKy0gSXNzdWUgIzE5NDU2OiBudHBhdGguam9pbigpIG5vdyBqb2lucyByZWxhdGl2ZSBwYXRocyBjb3JyZWN0bHkgd2hlbiBhIGRyaXZlCisgIGlzIHByZXNlbnQuCisKKy0gSXNzdWUgIzgyNjA6IFRoZSByZWFkKCksIHJlYWRsaW5lKCkgYW5kIHJlYWRsaW5lcygpIG1ldGhvZHMgb2YKKyAgY29kZWNzLlN0cmVhbVJlYWRlciByZXR1cm5lZCBpbmNvbXBsZXRlIGRhdGEgd2hlbiB3ZXJlIGNhbGxlZCBhZnRlcgorICByZWFkbGluZSgpIG9yIHJlYWQoc2l6ZSkuICBCYXNlZCBvbiBwYXRjaCBieSBBbWF1cnkgRm9yZ2VvdCBkJ0FyYy4KKworLSBJc3N1ZSAjMjAzNzQ6IEZpeCBidWlsZCB3aXRoIEdOVSByZWFkbGluZSA+PSA2LjMuCisKKy0gSXNzdWUgIzE0NTQ4OiBNYWtlIG11bHRpcHJvY2Vzc2luZyBmaW5hbGl6ZXJzIGNoZWNrIHBpZCBiZWZvcmUKKyAgcnVubmluZyB0byBjb3BlIHdpdGggcG9zc2liaWxpdHkgb2YgZ2MgcnVubmluZyBqdXN0IGFmdGVyIGZvcmsuCisgIChCYWNrcG9ydCBmcm9tIDMueC4pCisKKy0gSXNzdWUgIzIwMjYyOiBXYXJuaW5ncyBhcmUgcmFpc2VkIG5vdyB3aGVuIGR1cGxpY2F0ZSBuYW1lcyBhcmUgYWRkZWQgaW4gdGhlCisgIFpJUCBmaWxlIG9yIHRvbyBsb25nIFpJUCBmaWxlIGNvbW1lbnQgaXMgdHJ1bmNhdGVkLgorCistIElzc3VlICMyMDI3MDogdXJsbGliIGFuZCB1cmxwYXJzZSBub3cgc3VwcG9ydCBlbXB0eSBwb3J0cy4KKworLSBJc3N1ZSAjMjAyNDM6IFRhckZpbGUgbm8gbG9uZ2VyIHJhaXNlIFJlYWRFcnJvciB3aGVuIG9wZW5lZCBpbiB3cml0ZSBtb2RlLgorCistIElzc3VlICMyMDI0NTogVGhlIG9wZW4gZnVuY3Rpb25zIGluIHRoZSB0YXJmaWxlIG1vZHVsZSBub3cgY29ycmVjdGx5IGhhbmRsZQorICBlbXB0eSBtb2RlLgorCistIElzc3VlICMyMDA4NjogUmVzdG9yZWQgdGhlIHVzZSBvZiBsb2NhbGUtaW5kZXBlbmRlbnQgbWFwcGluZyBpbnN0ZWFkIG9mCisgIGxvY2FsZS1kZXBlbmRlbnQgc3RyLmxvd2VyKCkgaW4gbG9jYWxlLm5vcm1hbGl6ZSgpLgorCistIElzc3VlICMyMDI0NjogRml4IGJ1ZmZlciBvdmVyZmxvdyBpbiBzb2NrZXQucmVjdmZyb21faW50by4KKworLSBJc3N1ZSAjMTkwODI6IFdvcmtpbmcgU2ltcGxlWE1MUlBDU2VydmVyIGFuZCB4bWxycGNsaWIgZXhhbXBsZXMsIGJvdGggaW4KKyAgbW9kdWxlcyBhbmQgZG9jdW1lbnRhdGlvbi4KKworLSBJc3N1ZSAjMTMxMDc6IGFyZ3BhcnNlIGFuZCBvcHRwYXJzZSBubyBsb25nZXIgcmFpc2VzIGFuIGV4Y2VwdGlvbiB3aGVuIG91dHB1dAorICBhIGhlbHAgb24gZW52aXJvbm1lbnQgd2l0aCB0b28gc21hbGwgQ09MVU1OUy4gIEJhc2VkIG9uIHBhdGNoIGJ5CisgIEVsYXphciBHZXJzaHVuaS4KKworLSBJc3N1ZSAjMjAyMDc6IEFsd2F5cyBkaXNhYmxlIFNTTHYyIGV4Y2VwdCB3aGVuIFBST1RPQ09MX1NTTHYyIGlzIGV4cGxpY2l0bHkKKyAgYXNrZWQgZm9yLgorCistIElzc3VlICMyMDA3MjogRml4ZWQgbXVsdGlwbGUgZXJyb3JzIGluIHRraW50ZXIgd2l0aCB3YW50b2JqZWN0cyBpcyBGYWxzZS4KKworLSBJc3N1ZSAjMTA2NTk4NjogcHlkb2MgY2FuIG5vdyBoYW5kbGUgdW5pY29kZSBzdHJpbmdzLgorCistIElzc3VlICMxNjAzOTogQ1ZFLTIwMTMtMTc1MjogQ2hhbmdlIHVzZSBvZiByZWFkbGluZSBpbiBpbWFwbGliIG1vZHVsZSB0bworICBsaW1pdCBsaW5lIGxlbmd0aC4gIFBhdGNoIGJ5IEVtaWwgTGluZC4KKworLSBJc3N1ZSAjMTk0MjI6IEV4cGxpY2l0bHkgZGlzYWxsb3cgbm9uLVNPQ0tfU1RSRUFNIHNvY2tldHMgaW4gdGhlIHNzbAorICBtb2R1bGUsIHJhdGhlciB0aGFuIHNpbGVudGx5IGxldCB0aGVtIGVtaXQgY2xlYXIgdGV4dCBkYXRhLgorCistIElzc3VlICMyMDAyNzogRml4ZWQgbG9jYWxlIGFsaWFzZXMgZm9yIGRldmFuYWdhcmkgbG9jYWxlcy4KKworLSBJc3N1ZSAjMjAwNjc6IFRraW50ZXIgdmFyaWFibGVzIG5vdyB3b3JrIHdoZW4gd2FudG9iamVjdHMgaXMgZmFsc2UuCisKKy0gSXNzdWUgIzE5MDIwOiBUa2ludGVyIG5vdyB1c2VzIHNwbGl0bGlzdCgpIGluc3RlYWQgb2Ygc3BsaXQoKSBpbiBjb25maWd1cmUKKyAgbWV0aG9kcy4KKworLSBJc3N1ZSAjMTIyMjY6IEhUVFBTIGlzIG5vdyB1c2VkIGJ5IGRlZmF1bHQgd2hlbiBjb25uZWN0aW5nIHRvIFB5UEkuCisKKy0gSXNzdWUgIzIwMDQ4OiBGaXhlZCBaaXBFeHRGaWxlLnBlZWsoKSB3aGVuIGl0IGlzIGNhbGxlZCBvbiB0aGUgYm91bmRhcnkgb2YKKyAgdGhlIHVuY29tcHJlc3MgYnVmZmVyIGFuZCByZWFkKCkgZ29lcyB0aHJvdWdoIG1vcmUgdGhhbiBvbmUgcmVhZGJ1ZmZlci4KKworLSBJc3N1ZSAjMjAwMzQ6IFVwZGF0ZWQgYWxpYXMgbWFwcGluZyB0byBtb3N0IHJlY2VudCBsb2NhbGUuYWxpYXMgZmlsZQorICBmcm9tIFgub3JnIGRpc3RyaWJ1dGlvbiB1c2luZyBtYWtlbG9jYWxlYWxpYXMucHkuCisKKy0gSXNzdWUgIzU4MTU6IEZpeGVkIHN1cHBvcnQgZm9yIGxvY2FsZXMgd2l0aCBtb2RpZmllcnMuICBGaXhlZCBzdXBwb3J0IGZvcgorICBsb2NhbGUgZW5jb2RpbmdzIHdpdGggaHlwaGVucy4KKworLSBJc3N1ZSAjMjAwMjY6IEZpeCB0aGUgc3FsaXRlIG1vZHVsZSB0byBoYW5kbGUgY29ycmVjdGx5IGludmFsaWQgaXNvbGF0aW9uCisgIGxldmVsICh3cm9uZyB0eXBlKS4KKworLSBJc3N1ZSAjMTg4Mjk6IGNzdi5EaWFsZWN0KCkgbm93IGNoZWNrcyB0eXBlIGZvciBkZWxpbWl0ZXIsIGVzY2FwZWNoYXIgYW5kCisgIHF1b3RlY2hhciBmaWVsZHMuICBPcmlnaW5hbCBwYXRjaCBieSBWYWpyYXNreSBLb2suCisKKy0gSXNzdWUgIzE5ODU1OiB1dWlkLmdldG5vZGUoKSBvbiBVbml4IG5vdyBsb29rcyBvbiB0aGUgUEFUSCBmb3IgdGhlCisgIGV4ZWN1dGFibGVzIHVzZWQgdG8gZmluZCB0aGUgbWFjIGFkZHJlc3MsIHdpdGggL3NiaW4gYW5kIC91c3Ivc2JpbiBhcworICBmYWxsYmFja3MuCisKKy0gSXNzdWUgIzIwMDA3OiBIVFRQUmVzcG9uc2UucmVhZCgwKSBubyBtb3JlIHByZW1hdHVyZWx5IGNsb3NlcyBjb25uZWN0aW9uLgorICBPcmlnaW5hbCBwYXRjaCBieSBTaW1vbiBTYXBpbi4KKworLSBJc3N1ZSAjMTk5MTI6IEZpeGVkIG51bWVyb3VzIGJ1Z3MgaW4gbnRwYXRoLnNwbGl0dW5jKCkuCisKKy0gSXNzdWUgIzE5NjIzOiBGaXhlZCB3cml0aW5nIHRvIHVuc2Vla2FibGUgZmlsZXMgaW4gdGhlIGFpZmMgbW9kdWxlLgorICBGaXhlZCB3cml0aW5nICd1bGF3JyAobG93ZXIgY2FzZSkgY29tcHJlc3NlZCBBSUZDIGZpbGVzLgorCistIElzc3VlICMxNzkxOTogc2VsZWN0LnBvbGwucmVnaXN0ZXIoKSBhZ2FpbiB3b3JrcyB3aXRoIHBvbGwuUE9MTE5WQUwgb24gQUlYLgorICBGaXhlZCBpbnRlZ2VyIG92ZXJmbG93IGluIHRoZSBldmVudG1hc2sgcGFyYW1ldGVyLgorCistIElzc3VlICMxNzIwMDogdGVsbmV0bGliJ3MgcmVhZF91bnRpbCBhbmQgZXhwZWN0IHRpbWVvdXQgd2FzIGJyb2tlbiBieSB0aGUKKyAgZml4IHRvIElzc3VlICMxNDYzNSBpbiBQeXRob24gMi43LjQgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgbWlsbGlzZWNvbmRzCisgIGluc3RlYWQgb2Ygc2Vjb25kcyB3aGVuIHRoZSBwbGF0Zm9ybSBzdXBwb3J0cyBzZWxlY3QucG9sbCAoaWU6IGV2ZXJ5d2hlcmUpLgorICBJdCBpcyBub3cgdHJlYXRlZCBhcyBzZWNvbmRzIG9uY2UgYWdhaW4uCisKKy0gSXNzdWUgIzE5MDk5OiBUaGUgc3RydWN0IG1vZHVsZSBub3cgc3VwcG9ydHMgVW5pY29kZSBmb3JtYXQgc3RyaW5ncy4KKworLSBJc3N1ZSAjMTk4Nzg6IEZpeCBzZWdmYXVsdCBpbiBiejIgbW9kdWxlIGFmdGVyIGNhbGxpbmcgX19pbml0X18gdHdpY2Ugd2l0aAorICBub24tZXhpc3RlbnQgZmlsZW5hbWUuIEluaXRpYWwgcGF0Y2ggYnkgVmFqcmFza3kgS29rLgorCistIElzc3VlICMxNjM3MzogUHJldmVudCBpbmZpbml0ZSByZWN1cnNpb24gZm9yIEFCQyBTZXQgY2xhc3MgY29tcGFyaXNvbnMuCisKKy0gSXNzdWUgIzE5MTM4OiBkb2N0ZXN0J3MgSUdOT1JFX0VYQ0VQVElPTl9ERVRBSUwgbm93IGFsbG93cyBhIG1hdGNoIHdoZW4KKyAgbm8gZXhjZXB0aW9uIGRldGFpbCBleGlzdHMgKG5vIGNvbG9uIGZvbGxvd2luZyB0aGUgZXhjZXB0aW9uJ3MgbmFtZSwgb3IKKyAgYSBjb2xvbiBkb2VzIGZvbGxvdyBidXQgbm8gdGV4dCBmb2xsb3dzIHRoZSBjb2xvbikuCisKKy0gSXNzdWUgIzE2MjMxOiBGaXhlZCBwaWNrbGUuUGlja2xlciB0byBvbmx5IGZhbGxiYWNrIHRvIGl0cyBkZWZhdWx0IHBpY2tsaW5nCisgIGJlaGF2aW91ciB3aGVuIFBpY2tsZXIucGVyc2lzdGVudF9pZCByZXR1cm5zIE5vbmUsIGJ1dCBub3QgZm9yIGFueSBvdGhlcgorICBmYWxzZSB2YWx1ZXMuICBUaGlzIGFsbG93cyBmYWxzZSB2YWx1ZXMgb3RoZXIgdGhhbiBOb25lIHRvIGJlIHVzZWQgYXMKKyAgcGVyc2lzdGVudCBJRHMuICBUaGlzIGJlaGF2aW91ciBpcyBjb25zaXN0ZW50IHdpdGggY1BpY2tsZS4KKworLSBJc3N1ZSAjMTE1MDg6IEZpeGVkIHV1aWQuZ2V0bm9kZSgpIGFuZCB1dWlkLnV1aWQxKCkgb24gZW52aXJvbm1lbnQgd2l0aAorICB2aXJ0dWFsIGludGVyZmFjZS4gIE9yaWdpbmFsIHBhdGNoIGJ5IEtlbnQgRnJhemllci4KKworLSBJc3N1ZSAjMTE0ODk6IEpTT04gZGVjb2RlciBub3cgYWNjZXB0cyBsb25lIHN1cnJvZ2F0ZXMuCisKKy0gRml4IHRlc3QudGVzdF9zdXBwb3J0LmJpbmRfcG9ydCgpIHRvIG5vdCBjYXVzZSBhbiBlcnJvciB3aGVuIFB5dGhvbiB3YXMKKyAgY29tcGlsZWQgb24gYSBzeXN0ZW0gd2l0aCBTT19SRVVTRVBPUlQgZGVmaW5lZCBpbiB0aGUgaGVhZGVycyBidXQgcnVuIG9uCisgIGEgc3lzdGVtIHdpdGggYW4gT1Mga2VybmVsIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGF0IG5ldyBzb2NrZXQgb3B0aW9uLgorCistIElzc3VlICMxOTYzMzogRml4ZWQgd3JpdGluZyBub3QgY29tcHJlc3NlZCAxNi0gYW5kIDMyLWJpdCB3YXZlIGZpbGVzIG9uCisgIGJpZy1lbmRpYW4gcGxhdGZvcm1zLgorCistIElzc3VlICMxOTQ0OTogaW4gY3N2J3Mgd3JpdGVyb3csIGhhbmRsZSBub24tc3RyaW5nIGtleXMgd2hlbiBnZW5lcmF0aW5nIHRoZQorICBlcnJvciBtZXNzYWdlIHRoYXQgY2VydGFpbiBrZXlzIGFyZSBub3QgaW4gdGhlICdmaWVsZG5hbWVzJyBsaXN0LgorCistIElzc3VlICMxMjg1MzogRml4IE5hbWVFcnJvciBpbiBkaXN0dXRpbHMuY29tbWFuZC51cGxvYWQuCisKKy0gSXNzdWUgIzE5NTIzOiBDbG9zZWQgRmlsZUhhbmRsZXIgbGVhayB3aGljaCBvY2N1cnJlZCB3aGVuIGRlbGF5IHdhcyBzZXQuCisKKy0gSXNzdWUgIzE1NzUwMjA6IEZpeGVkIHN1cHBvcnQgb2YgMjQtYml0IHdhdmUgZmlsZXMgb24gYmlnLWVuZGlhbiBwbGF0Zm9ybXMuCisKKy0gSXNzdWUgIzE5NDgwOiBIVE1MUGFyc2VyIG5vdyBhY2NlcHRzIGFsbCB2YWxpZCBzdGFydC10YWcgbmFtZXMgYXMgZGVmaW5lZAorICBieSB0aGUgSFRNTDUgc3RhbmRhcmQuCisKKy0gSXNzdWUgIzE3ODI3OiBBZGQgdGhlIG1pc3NpbmcgZG9jdW1lbnRhdGlvbiBmb3IgYGBjb2RlY3MuZW5jb2RlYGAgYW5kCisgIGBgY29kZWNzLmRlY29kZWBgLgorCistIElzc3VlICM2MTU3OiBGaXhlZCBUa2ludGVyLlRleHQuZGVidWcoKS4gIE9yaWdpbmFsIHBhdGNoIGJ5IEd1aWxoZXJtZSBQb2xvLgorCistIElzc3VlICM2MTYwOiBUaGUgYmJveCgpIG1ldGhvZCBvZiB0a2ludGVyLlNwaW5ib3ggbm93IHJldHVybnMgYSB0dXBsZSBvZgorICBpbnRlZ2VycyBpbnN0ZWFkIG9mIGEgc3RyaW5nLiAgQmFzZWQgb24gcGF0Y2ggYnkgR3VpbGhlcm1lIFBvbG8uCisKKy0gSXNzdWUgIzE5Mjg2OiBEaXJlY3RvcmllcyBpbiBgYHBhY2thZ2VfZGF0YWBgIGFyZSBubyBsb25nZXIgYWRkZWQgdG8KKyAgdGhlIGZpbGVsaXN0LCBwcmV2ZW50aW5nIGZhaWx1cmUgb3V0bGluZWQgaW4gdGhlIHRpY2tldC4KKworLSBJc3N1ZSAjNjY3NjogRW5zdXJlIGEgbWVhbmluZ2Z1bCBleGNlcHRpb24gaXMgcmFpc2VkIHdoZW4gYXR0ZW1wdGluZworICB0byBwYXJzZSBtb3JlIHRoYW4gb25lIFhNTCBkb2N1bWVudCBwZXIgcHlleHBhdCB4bWxwYXJzZXIgaW5zdGFuY2UuCisgIChPcmlnaW5hbCBwYXRjaGVzIGJ5IEhpcm9rYXp1IFlhbWFtb3RvIGFuZCBBbWF1cnkgRm9yZ2VvdCBkJ0FyYywgd2l0aAorICBzdWdnZXN0ZWQgd29yZGluZyBieSBEYXZpZCBHdXR0ZXJpZGdlKQorCistIElzc3VlICMyMTMxMTogQXZvaWQgZXhjZXB0aW9uIGluIF9vc3hfc3VwcG9ydCB3aXRoIG5vbi1zdGFuZGFyZCBjb21waWxlcgorICBjb25maWd1cmF0aW9ucy4gIFBhdGNoIGJ5IEpvaG4gU3pha21laXN0ZXIuCisKK1Rvb2xzL0RlbW9zCistLS0tLS0tLS0tLQorCistIElzc3VlICMzNTYxOiBUaGUgV2luZG93cyBpbnN0YWxsZXIgbm93IGhhcyBhbiBvcHRpb24sIG9mZiBieSBkZWZhdWx0LCBmb3IKKyAgcGxhY2luZyB0aGUgUHl0aG9uIGluc3RhbGxhdGlvbiBpbnRvIHRoZSBzeXN0ZW0gIlBhdGgiIGVudmlyb25tZW50IHZhcmlhYmxlLgorICBUaGlzIHdhcyBiYWNrcG9ydGVkIGZyb20gUHl0aG9uIDMuMy4KKworLSBBZGQgc3VwcG9ydCBmb3IgYGB5aWVsZCBmcm9tYGAgdG8gMnRvMy4KKworLSBBZGQgc3VwcG9ydCBmb3IgdGhlIFBFUCA0NjUgbWF0cml4IG11bHRpcGxpY2F0aW9uIG9wZXJhdG9yIHRvIDJ0bzMuCisKKy0gSXNzdWUgIzE5OTM2OiBBZGRlZCBleGVjdXRhYmxlIGJpdHMgb3Igc2hlYmFuZyBsaW5lcyB0byBQeXRob24gc2NyaXB0cyB3aGljaAorICByZXF1aXJlcyB0aGVtLiAgRGlzYWJsZSBleGVjdXRhYmxlIGJpdHMgYW5kIHNoZWJhbmcgbGluZXMgaW4gdGVzdCBhbmQKKyAgYmVuY2htYXJrIGZpbGVzIGluIG9yZGVyIHRvIHByZXZlbnQgdXNpbmcgYSByYW5kb20gc3lzdGVtIHB5dGhvbiwgYW5kIGluCisgIHNvdXJjZSBmaWxlcyBvZiBtb2R1bGVzIHdoaWNoIGRvbid0IHByb3ZpZGUgY29tbWFuZCBsaW5lIGludGVyZmFjZS4KKworSURMRQorLS0tLQorCistIElzc3VlICMxODEwNDogQWRkIGlkbGVsaWIvaWRsZV90ZXN0L2h0ZXN0LnB5IHdpdGggYSBmZXcgc2FtcGxlIHRlc3RzIHRvIGJlZ2luCisgIGNvbnNvbGlkYXRpbmcgYW5kIGltcHJvdmluZyBodW1hbi12YWxpZGF0ZWQgdGVzdHMgb2YgSWRsZS4gQ2hhbmdlIG90aGVyIGZpbGVzCisgIGFzIG5lZWRlZCB0byB3b3JrIHdpdGggaHRlc3QuICBSdW5uaW5nIHRoZSBtb2R1bGUgYXMgX19tYWluX18gcnVucyBhbGwgdGVzdHMuCisKKy0gSXNzdWUgIzIxMTM5OiBDaGFuZ2UgZGVmYXVsdCBwYXJhZ3JhcGggd2lkdGggdG8gNzIsIHRoZSBQRVAgOCByZWNvbW1lbmRhdGlvbi4KKworLSBJc3N1ZSAjMjEyODQ6IFBhcmFncmFwaCByZWZvcm1hdCB0ZXN0IHBhc3NlcyBhZnRlciB1c2VyIGNoYW5nZXMgcmVmb3JtYXQgd2lkdGguCisKKy0gSXNzdWUgIzIwNDA2OiBVc2UgUHl0aG9uIGFwcGxpY2F0aW9uIGljb25zIGZvciBJZGxlIHdpbmRvdyB0aXRsZSBiYXJzLgorICBQYXRjaCBtb3N0bHkgYnkgU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMjEwMjk6IE9jY3VycmVuY2VzIG9mICJwcmludCIgYXJlIG5vdyBjb25zaXN0ZW50bHkgY29sb3JlZCBhcworICBiZWluZyBhIGtleXdvcmQgKHRoZSBjb2xvcml6ZXIgZG9lc24ndCBrbm93IGlmIHByaW50IGZ1bmN0aW9ucyBhcmUKKyAgZW5hYmxlZCBpbiB0aGUgc291cmNlKS4KKworLSBJc3N1ZSAjMTc3MjE6IFJlbW92ZSBub24tZnVuY3Rpb25hbCBjb25maWd1cmF0aW9uIGRpYWxvZyBoZWxwIGJ1dHRvbiB1bnRpbCB3ZQorICBtYWtlIGl0IGFjdHVhbGx5IGdpdmVzIHNvbWUgaGVscCB3aGVuIGNsaWNrZWQuIFBhdGNoIGJ5IEd1aWxoZXJtZSBTaW3DtWVzLgorCistIElzc3VlICMxNzM5MDogQWRkIFB5dGhvbiB2ZXJzaW9uIHRvIElkbGUgZWRpdG9yIHdpbmRvdyB0aXRsZSBiYXIuCisgIE9yaWdpbmFsIHBhdGNoZXMgYnkgRWRtb25kIEJ1cm5ldHQgYW5kIEtlbnQgSm9obnNvbi4KKworLSBJc3N1ZSAjMjAwNTg6IHN5cy5zdGRpbi5yZWFkbGluZSgpIGluIElETEUgbm93IGFsd2F5cyByZXR1cm5zIG9ubHkgb25lIGxpbmUuCisKKy0gSXNzdWUgIzE5NDgxOiBwcmludCgpIG9mIHVuaWNvZGUsIHN0ciBvciBieXRlYXJyYXkgc3ViY2xhc3MgaW5zdGFuY2UgaW4gSURMRQorICBubyBtb3JlIGhhbmdzLgorCistIElzc3VlICMxODI3MDogUHJldmVudCBwb3NzaWJsZSBJRExFIEF0dHJpYnV0ZUVycm9yIG9uIE9TIFggd2hlbiBubyBpbml0aWFsCisgIHNoZWxsIHdpbmRvdyBpcyBwcmVzZW50LgorCistIElzc3VlICMxNzY1NDogRW5zdXJlIElETEUgbWVudXMgYXJlIGN1c3RvbWl6ZWQgcHJvcGVybHkgb24gT1MgWCBmb3IKKyAgbm9uLWZyYW1ld29yayBidWlsZHMgYW5kIGZvciBhbGwgdmFyaWFudHMgb2YgVGsuCisKK1Rlc3RzCistLS0tLQorCistIElzc3VlICMxNzc1MjogRml4IGRpc3R1dGlscyB0ZXN0cyB3aGVuIHJ1biBmcm9tIHRoZSBpbnN0YWxsZWQgbG9jYXRpb24uCisKKy0gSXNzdWUgIzE4NjA0OiBDb25zb2xpZGF0ZWQgY2hlY2tzIGZvciBHVUkgYXZhaWxhYmlsaXR5LiAgQWxsIHBsYXRmb3JtcyBub3cKKyAgYXQgbGVhc3QgY2hlY2sgd2hldGhlciBUayBjYW4gYmUgaW5zdGFudGlhdGVkIHdoZW4gdGhlIEdVSSByZXNvdXJjZSBpcworICByZXF1ZXN0ZWQuCisKKy0gSXNzdWUgIzIwOTQ2OiBDb3JyZWN0IGFsaWdubWVudCBhc3N1bXB0aW9ucyBvZiBzb21lIGN0eXBlcyB0ZXN0cy4KKworLSBJc3N1ZSAjMjA3NDM6IEZpeCBhIHJlZmVyZW5jZSBsZWFrIGluIHRlc3RfdGNsLgorCistIElzc3VlICMyMDUxMDogUmV3cm90ZSB0ZXN0X2V4aXQgaW4gdGVzdF9zeXMgdG8gbWF0Y2ggZXhpc3RpbmcgY29tbWVudHMsCisgIHVzZSBtb2Rlcm4gdW5pdHRlc3QgZmVhdHVyZXMsIGFuZCB1c2UgaGVscGVycyBmcm9tIHRlc3Quc2NyaXB0X2hlbHBlcgorICBpbnN0ZWFkIG9mIHVzaW5nIHN1YnByb2Nlc3MgZGlyZWN0bHkuICBJbml0aWFsIHBhdGNoIGJ5IEdhcmV0aCBSZWVzLgorCistIElzc3VlICMyMDUzMjogVGVzdHMgd2hpY2ggdXNlIF90ZXN0Y2FwaSBub3cgYXJlIG1hcmtlZCBhcyBDUHl0aG9uIG9ubHkuCisKKy0gSXNzdWUgIzE5OTIwOiBBZGRlZCB0ZXN0cyBmb3IgVGFyRmlsZS5saXN0KCkuICBCYXNlZCBvbiBwYXRjaCBieSBWYWpyYXNreSBLb2suCisKKy0gSXNzdWUgIzE5OTkwOiBBZGRlZCB0ZXN0cyBmb3IgdGhlIGltZ2hkciBtb2R1bGUuICBCYXNlZCBvbiBwYXRjaCBieQorICBDbGF1ZGl1IFBvcGEuCisKKy0gSXNzdWUgIzE5ODA0OiBUaGUgdGVzdF9maW5kX21hYyB0ZXN0IGluIHRlc3RfdXVpZCBpcyBub3cgc2tpcHBlZCBpZiB0aGUKKyAgaWZjb25maWcgZXhlY3V0YWJsZSBpcyBub3QgYXZhaWxhYmxlLgorCistIElzc3VlICMxOTg4NjogVXNlIGJldHRlciBlc3RpbWF0ZWQgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgYmlnbWVtIHRlc3RzLgorCistIEJhY2twb3J0ZWQgdGVzdHMgZm9yIFRraW50ZXIgdmFyaWFibGVzLgorCistIElzc3VlICMxOTMyMDogdGVzdF90Y2wgbm8gbG9uZ2VyIGZhaWxzIHdoZW4gd2FudG9iamVjdHMgaXMgZmFsc2UuCisKKy0gSXNzdWUgIzE5NjgzOiBSZW1vdmVkIGVtcHR5IHRlc3RzIGZyb20gdGVzdF9taW5pZG9tLiAgSW5pdGlhbCBwYXRjaCBieQorICBBaml0ZXNoIEd1cHRhLgorCistIElzc3VlICMxOTkyODogSW1wbGVtZW50ZWQgYSB0ZXN0IGZvciByZXByKCkgb2YgY2VsbCBvYmplY3RzLgorCistIElzc3VlICMxOTU5NSwgIzE5OTg3OiBSZS1lbmFibGVkIGEgbG9uZy1kaXNhYmxlZCB0ZXN0IGluIHRlc3Rfd2luc291bmQuCisKKy0gSXNzdWUgIzE5NTg4OiBGaXhlZCB0ZXN0cyBpbiB0ZXN0X3JhbmRvbSB0aGF0IHdlcmUgc2lsZW50bHkgc2tpcHBlZCBtb3N0CisgIG9mIHRoZSB0aW1lLiAgUGF0Y2ggYnkgSnVsaWFuIEdpbmRpLgorCistIElzc3VlICMxNzg4MzogVHdlYWsgdGVzdF90Y2wgdGVzdExvYWRXaXRoVU5DIHRvIHNraXAgdGhlIHRlc3QgaW4gdGhlCisgIGV2ZW50IG9mIGEgcGVybWlzc2lvbiBlcnJvciBvbiBXaW5kb3dzIGFuZCB0byBwcm9wZXJseSByZXBvcnQgb3RoZXIKKyAgc2tpcCBjb25kaXRpb25zLgorCistIElzc3VlICMxNzg4MzogQmFja3BvcnRlZCBfaXNfZ3VpX2F2YWlsYWJsZSgpIGluIHRlc3QudGVzdF9zdXBwb3J0IHRvCisgIGF2b2lkIGhhbmdpbmcgV2luZG93cyBidWlsZGJvdHMgb24gdGVzdF90dGtfZ3Vpb25seS4KKworLSBJc3N1ZSAjMTg3MDIsICMxOTU3MjogQWxsIHNraXBwZWQgdGVzdHMgbm93IHJlcG9ydGVkIGFzIHNraXBwZWQuCisKKy0gSXNzdWUgIzE5MDg1OiBBZGRlZCBiYXNpYyB0ZXN0cyBmb3IgYWxsIHRraW50ZXIgd2lkZ2V0IG9wdGlvbnMuCisKKy0gSXNzdWUgIzIwNjA1OiBNYWtlIHRlc3Rfc29ja2V0IGdldGFkZHJpbmZvIE9TIFggc2VnZmF1bHQgdGVzdCBtb3JlIHJvYnVzdC4KKworLSBJc3N1ZSAjMjA5Mzk6IEF2b2lkIHZhcmlvdXMgbmV0d29yayB0ZXN0IGZhaWx1cmVzIGR1ZSB0byBuZXcKKyAgcmVkaXJlY3Qgb2YgaHR0cDovL3d3dy5weXRob24ub3JnLyB0byBodHRwczovL3d3dy5weXRob24ub3JnOgorICB1c2UgaHR0cDovL3d3dy5leGFtcGxlLmNvbSBpbnN0ZWFkLgorCistIElzc3VlICMyMTA5MzogUHJldmVudCBmYWlsdXJlcyBvZiBjdHlwZXMgdGVzdF9tYWNob2xpYiBvbiBPUyBYIGlmIGEKKyAgY29weSBvZiBsaWJ6IGV4aXN0cyBpbiAkSE9NRS9saWIgb3IgL3Vzci9sb2NhbC9saWIuCisKK0J1aWxkCistLS0tLQorCistIElzc3VlICMyMTI4NTogUmVmYWN0b3IgYW5kIGZpeCBjdXJzZXMgY29uZmlndXJlIGNoZWNrIHRvIGFsd2F5cyBzZWFyY2gKKyAgaW4gYSBuY3Vyc2VzdyBkaXJlY3RvcnkuCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0KKworLSBJc3N1ZSAjMjAyNTU6IFVwZGF0ZSB0aGUgYWJvdXQgYW5kIGJ1Z3MgcGFnZXMuCisKKy0gSXNzdWUgIzE4ODQwOiBJbnRyb2R1Y2UgdGhlIGpzb24gbW9kdWxlIGluIHRoZSB0dXRvcmlhbCwgYW5kIGRlLWVtcGhhc2l6ZQorICB0aGUgcGlja2xlIG1vZHVsZS4KKworLSBJc3N1ZSAjMTk3OTU6IEltcHJvdmVkIG1hcmt1cCBvZiBUcnVlL0ZhbHNlIGNvbnN0YW50cy4KKworV2luZG93cworLS0tLS0tLQorCistIElzc3VlICMyMTMwMywgIzIwNTY1OiBVcGRhdGVkIHRoZSB2ZXJzaW9uIG9mIFRjbC9UayBpbmNsdWRlZCBpbiB0aGUKKyAgaW5zdGFsbGVyIGZyb20gOC41LjIgdG8gOC41LjE1LgorCitNYWMgT1MgWAorLS0tLS0tLS0KKworLSBBcyBvZiAyLjcuOCwgdGhlIDMyLWJpdC1vbmx5IGluc3RhbGxlciB3aWxsIHN1cHBvcnQgT1MgWCAxMC41CisgIGFuZCBsYXRlciBzeXN0ZW1zIGFzIGlzIGN1cnJlbnRseSBkb25lIGZvciBQeXRob24gMy54IGluc3RhbGxlcnMuCisgIEZvciAyLjcuNyBvbmx5LCB3ZSB3aWxsIHByb3ZpZGUgdGhyZWUgaW5zdGFsbGVyczoKKyAgdGhlIGxlZ2FjeSBkZXByZWNhdGVkIDEwLjMrIDMyLWJpdC1vbmx5IGZvcm1hdDsKKyAgdGhlIG5ld2VyIDEwLjUrIDMyLWJpdC1vbmx5IGZvcm1hdDsKKyAgYW5kIHRoZSB1bmNoYW5nZWQgMTAuNisgNjQtLzMyLWJpdCBmb3JtYXQuCisgIEFsdGhvdWdoIGJpbmFyeSBpbnN0YWxsZXJzIHdpbGwgbm8gbG9uZ2VyIGJlIGF2YWlsYWJsZSBmcm9tCisgIHB5dGhvbi5vcmcgYXMgb2YgMi43LjgsIGl0IHdpbGwgc3RpbGwgYmUgcG9zc2libGUgdG8gYnVpbGQgZnJvbQorICBzb3VyY2Ugb24gMTAuMy45IGFuZCAxMC40IHN5c3RlbXMgaWYgbmVjZXNzYXJ5LgorICBTZWUgTWFjL0J1aWxkU2NyaXB0L1JFQURNRS50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKworV2hhdHMnIE5ldyBpbiBQeXRob24gMi43LjY/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMjAxMy0xMS0xMCoKKworTGlicmFyeQorLS0tLS0tLQorCistIElzc3VlICMxOTQzNTogRml4IGRpcmVjdG9yeSB0cmF2ZXJzYWwgYXR0YWNrIG9uIENHSUh0dHBSZXF1ZXN0SGFuZGxlci4KKworSURMRQorLS0tLQorCistIElzc3VlICMxOTQyNjogRml4ZWQgdGhlIG9wZW5pbmcgb2YgUHl0aG9uIHNvdXJjZSBmaWxlIHdpdGggc3BlY2lmaWVkIGVuY29kaW5nLgorCitUZXN0cworLS0tLS0KKworLSBJc3N1ZSAjMTk0NTc6IEZpeGVkIHhtbGNoYXJyZWZyZXBsYWNlIHRlc3RzIG9uIHdpZGUgYnVpbGQgd2hlbiB0ZXN0cyBhcmUKKyAgbG9hZGVkIGZyb20gLnB5W2NvXSBmaWxlcy4KKworQnVpbGQKKy0tLS0tCisKKy0gSXNzdWUgIzE1NjYzOiBSZXZlcnQgT1MgWCBpbnN0YWxsZXIgYnVpbHQtaW4gVGNsL1RrIHN1cHBvcnQgZm9yIDIuNy42LgorICBTb21lIHRoaXJkLXBhcnR5IHByb2plY3RzLCBzdWNoIGFzIE1hdHBsb3RsaWIgYW5kIFBJTC9QaWxsb3csCisgIGRlcGVuZGVkIG9uIGJlaW5nIGFibGUgdG8gYnVpbGQgd2l0aCBUY2wgYW5kIFRrIGZyYW1ld29ya3MgaW4KKyAgL0xpYnJhcnkvRnJhbWV3b3Jrcy4KKworCitXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjcuNiByZWxlYXNlIGNhbmRpZGF0ZSAxPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMjAxMy0xMC0yNioKKworQ29yZSBhbmQgQnVpbHRpbnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gSXNzdWUgIzE4NjAzOiBFbnN1cmUgdGhhdCBQeU9TX215c3RyaWNtcCBhbmQgUHlPU19teXN0cm5pY21wIGFyZSBpbiB0aGUKKyAgUHl0aG9uIGV4ZWN1dGFibGUgYW5kIG5vdCByZW1vdmVkIGJ5IHRoZSBsaW5rZXIncyBvcHRpbWl6ZXIuCisKKy0gSXNzdWUgIzE5Mjc5OiBVVEYtNyBkZWNvZGVyIG5vIG1vcmUgcHJvZHVjZXMgaWxsZWdhbCB1bmljb2RlIHN0cmluZ3MuCisKKy0gSXNzdWUgIzE4NzM5OiBGaXggYW4gaW5jb25zaXN0ZW5jeSBiZXR3ZWVuIG1hdGgubG9nKG4pIGFuZCBtYXRoLmxvZyhsb25nKG4pKTsKKyAgdGhlIHJlc3VsdHMgY291bGQgYmUgb2ZmIGZyb20gb25lIGFub3RoZXIgYnkgYSB1bHAgb3IgdHdvLgorCistIElzc3VlICMxMzQ2MTogRml4IGEgY3Jhc2ggaW4gdGhlICJyZXBsYWNlIiBlcnJvciBoYW5kbGVyIG9uIDY0LWJpdCBwbGF0Zm9ybXMuCisgIFBhdGNoIGJ5IFlvZ2VzaCBDaGF1ZGhhcmkuCisKKy0gSXNzdWUgIzE1ODY2OiBUaGUgeG1sY2hhcnJlZnJlcGxhY2UgZXJyb3IgaGFuZGxlciBubyBtb3JlIHByb2R1Y2VzIHR3byBYTUwKKyAgZW50aXRpZXMgZm9yIGEgbm9uLUJNUCBjaGFyYWN0ZXIgb24gbmFycm93IGJ1aWxkLgorCistIElzc3VlICMxODE4NDogUHlVbmljb2RlX0Zyb21Gb3JtYXQoKSBhbmQgUHlVbmljb2RlX0Zyb21Gb3JtYXRWKCkgbm93IHJhaXNlCisgIE92ZXJmbG93RXJyb3Igd2hlbiBhbiBhcmd1bWVudCBvZiAlYyBmb3JtYXQgaXMgb3V0IG9mIHJhbmdlLgorCistIElzc3VlICMxODEzNzogRGV0ZWN0IGludGVnZXIgb3ZlcmZsb3cgb24gcHJlY2lzaW9uIGluIGZsb2F0Ll9fZm9ybWF0X18oKQorICBhbmQgY29tcGxleC5fX2Zvcm1hdF9fKCkuCisKKy0gSXNzdWUgIzE4MDM4OiBTeW50YXhFcnJvciByYWlzZWQgZHVyaW5nIGNvbXBpbGF0aW9uIHNvdXJjZXMgd2l0aCBpbGxlZ2FsCisgIGVuY29kaW5nIG5vdyBhbHdheXMgY29udGFpbnMgYW4gZW5jb2RpbmcgbmFtZS4KKworLSBJc3N1ZSAjMTgwMTk6IEZpeCBjcmFzaCBpbiB0aGUgcmVwciBvZiBkaWN0aW9uYXJpZXMgY29udGFpbmluZyB0aGVpciBvd24KKyAgdmlld3MuCisKKy0gSXNzdWUgIzE4NDI3OiBzdHIucmVwbGFjZSBjb3VsZCBjcmFzaCB0aGUgaW50ZXJwcmV0ZXIgd2l0aCBodWdlIHN0cmluZ3MuCisKK0xpYnJhcnkKKy0tLS0tLS0KKworLSBJc3N1ZSAjMTkzOTM6IEZpeCBzeW10YWJsZS5zeW10YWJsZSBmdW5jdGlvbiB0byBub3QgYmUgY29uZnVzZWQgd2hlbiB0aGVyZSBhcmUKKyAgZnVuY3Rpb25zIG9yIGNsYXNzZXMgbmFtZWQgInRvcCIuCisKKy0gSXNzdWUgIzE5MzI3OiBGaXhlZCB0aGUgd29ya2luZyBvZiByZWd1bGFyIGV4cHJlc3Npb25zIHdpdGggdG9vIGJpZyBjaGFyc2V0LgorCistIElzc3VlICMxOTM1MDogSW5jcmVhc2luZyB0aGUgdGVzdCBjb3ZlcmFnZSBvZiBtYWN1cmwycGF0aC4gUGF0Y2ggYnkgQ29saW4KKyAgV2lsbGlhbXMuCisKKy0gSXNzdWUgIzE5MzUyOiBGaXggdW5pdHRlc3QgZGlzY292ZXJ5IHdoZW4gYSBtb2R1bGUgY2FuIGJlIHJlYWNoZWQKKyAgdGhyb3VnaCBzZXZlcmFsIHBhdGhzIChlLmcuIHVuZGVyIERlYmlhbi9VYnVudHUgd2l0aCB2aXJ0dWFsZW52KS4KKworLSBJc3N1ZSAjMTUyMDc6IEZpeCBtaW1ldHlwZXMgdG8gcmVhZCBmcm9tIGNvcnJlY3QgcGFydCBvZiBXaW5kb3dzIHJlZ2lzdHJ5CisgIE9yaWdpbmFsIHBhdGNoIGJ5IERhdmUgQ2hhbWJlcnMKKworLSBJc3N1ZSAjODk2NDogZml4IHBsYXRmb3JtLl9zeXNfdmVyc2lvbiB0byBoYW5kbGUgSXJvblB5dGhvbiAyLjYrLgorICBQYXRjaCBieSBNYXJ0aW4gTWF0dXNpYWsuCisKKy0gSXNzdWUgIzE2MDM4OiBDVkUtMjAxMy0xNzUyOiBmdHBsaWI6IExpbWl0IGFtb3VudCBvZiBkYXRhIHJlYWQgYnkKKyAgbGltaXRpbmcgdGhlIGNhbGwgdG8gcmVhZGxpbmUoKS4gIE9yaWdpbmFsIHBhdGNoIGJ5IE1pY2hhxYIKKyAgSmFzdHJ6xJlic2tpIGFuZCBHaWFtcGFvbG8gUm9kb2xhLgorCistIElzc3VlICMxOTI3NjogRml4ZWQgdGhlIHdhdmUgbW9kdWxlIG9uIDY0LWJpdCBiaWctZW5kaWFuIHBsYXRmb3Jtcy4KKworLSBJc3N1ZSAjMTg0NTg6IFByZXZlbnQgY3Jhc2hlcyB3aXRoIG5ld2VyIHZlcnNpb25zIG9mIGxpYmVkaXQuICBJdHMgcmVhZGxpbmUKKyAgZW11bGF0aW9uIGhhcyBjaGFuZ2VkIGZyb20gMC1iYXNlZCBpbmRleGluZyB0byAxLWJhc2VkIGxpa2UgZ251IHJlYWRsaW5lLgorICBPcmlnaW5hbCBwYXRjaCBieSBSb25hbGQgT3Vzc29yZW4uCisKKy0gSXNzdWUgIzE4OTE5OiBJZiB0aGUgY2xvc2UoKSBtZXRob2Qgb2YgYSB3cml0ZXIgaW4gdGhlIHN1bmF1IG9yIHdhdmUgbW9kdWxlCisgIGZhaWxlZCwgc2Vjb25kIGludm9jYXRpb24gb2YgY2xvc2UoKSBhbmQgZGVzdHJ1Y3RvciBubyBtb3JlIHJhaXNlIGFuCisgIGV4Y2VwdGlvbi4gIFNlY29uZCBpbnZvY2F0aW9uIG9mIGNsb3NlKCkgb24gc3VuYXUgd3JpdGVyIG5vdyBoYXMgbm8gZWZmZWN0cy4KKyAgVGhlIGFpZmMgbW9kdWxlIG5vdyBhY2NlcHRzIGxvd2VyIGNhc2Ugb2YgbmFtZXMgb2YgdGhlICd1bGF3JyBhbmQgJ2FsYXcnCisgIGNvZGVjcy4KKworLSBJc3N1ZSAjMTkxMzE6IFRoZSBhaWZjIG1vZHVsZSBub3cgY29ycmVjdGx5IHJlYWRzIGFuZCB3cml0ZXMgc2FtcHdpZHRoIG9mCisgIGNvbXByZXNzZWQgc3RyZWFtcy4KKworLSBJc3N1ZSAjMTkxNTg6ICBhIHJhcmUgcmFjZSBpbiBCb3VuZGVkU2VtYXBob3JlIGNvdWxkIGFsbG93IC5yZWxlYXNlKCkgdG9vCisgIG9mdGVuLgorCistIElzc3VlICMxODAzNzogMnRvMyBub3cgZXNjYXBlcyAnXHUnIGFuZCAnXFUnIGluIG5hdGl2ZSBzdHJpbmdzLgorCistIElzc3VlICMxOTEzNzogVGhlIHBwcmludCBtb2R1bGUgbm93IGNvcnJlY3RseSBmb3JtYXRzIGVtcHR5IHNldCBhbmQgZnJvemVuc2V0CisgIGFuZCBpbnN0YW5jZXMgb2Ygc2V0IGFuZCBmcm96ZW5zZXQgc3ViY2xhc3Nlcy4KKworLSBJc3N1ZSAjMTYwNDA6IENWRS0yMDEzLTE3NTI6IG5udHBsaWI6IExpbWl0IG1heGltdW0gbGluZSBsZW5ndGhzIHRvIDIwNDggdG8KKyAgcHJldmVudCByZWFkbGluZSgpIGNhbGxzIGZyb20gY29uc3VtaW5nIHRvbyBtdWNoIG1lbW9yeS4gIFBhdGNoIGJ5IEp5cmtpCisgIFB1bGxpYWluZW4uCisKKy0gSXNzdWUgIzEyNjQxOiBBdm9pZCBwYXNzaW5nICItbW5vLWN5Z3dpbiIgdG8gdGhlIG1pbmd3MzIgY29tcGlsZXIsIGV4Y2VwdAorICB3aGVuIG5lY2Vzc2FyeS4gIFBhdGNoIGJ5IE9zY2FyIEJlbmphbWluLgorCistIFByb3Blcmx5IGluaXRpYWxpemUgYWxsIGZpZWxkcyBvZiBhIFNTTCBvYmplY3QgYWZ0ZXIgYWxsb2NhdGlvbi4KKworLSBJc3N1ZSAjNDM2NjogRml4IGJ1aWxkaW5nIGV4dGVuc2lvbnMgb24gYWxsIHBsYXRmb3JtcyB3aGVuIC0tZW5hYmxlLXNoYXJlZAorICBpcyB1c2VkLgorCistIElzc3VlICMxODk1MDogRml4IG1pc2NlbGxhbmVvdXMgYnVncyBpbiB0aGUgc3VuYXUgbW9kdWxlLgorICBBdV9yZWFkLnJlYWRmcmFtZXMoKSBub3cgdXBkYXRlcyBjdXJyZW50IGZpbGUgcG9zaXRpb24gYW5kIHJlYWRzIGNvcnJlY3QKKyAgbnVtYmVyIG9mIGZyYW1lcyBmcm9tIG11bHRpY2hhbm5lbCBzdHJlYW0uICBBdV93cml0ZS53cml0ZWZyYW1lc3JhdygpIG5vdworICBjb3JyZWN0bHkgdXBkYXRlcyBjdXJyZW50IGZpbGUgcG9zaXRpb24uICBBdV9yZWFkIGFuZCBBdV93cml0ZSBub3cgY29ycmVjdGx5CisgIHdvcmsgd2l0aCBmaWxlIG9iamVjdCBpZiBzdGFydCBmaWxlIHBvc2l0aW9uIGlzIG5vdCBhIHplcm8uCisKKy0gSXNzdWUgIzE4MDUwOiBGaXhlZCBhbiBpbmNvbXBhdGliaWxpdHkgb2YgdGhlIHJlIG1vZHVsZSB3aXRoIFB5dGhvbiAyLjcuMworICBhbmQgb2xkZXIgYmluYXJpZXMuCisKKy0gSXNzdWUgIzE5MDM3OiBUaGUgbWFpbGJveCBtb2R1bGUgbm93IG1ha2VzIGFsbCBjaGFuZ2VzIHRvIG1haWxkaXIgZmlsZXMKKyAgYmVmb3JlIG1vdmluZyB0aGVtIGludG8gcGxhY2UsIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucyB3aXRoIG90aGVyIHByb2dyYW1zCisgIHRoYXQgbWF5IGJlIGFjY2Vzc2luZyB0aGUgbWFpbGRpciBkaXJlY3RvcnkuCisKKy0gSXNzdWUgIzE0OTg0OiBPbiBQT1NJWCBzeXN0ZW1zLCB3aGVuIG5ldHJjIGlzIGNhbGxlZCB3aXRob3V0IGEgZmlsZW5hbWUKKyAgYXJndW1lbnQgKGFuZCB0aGVyZWZvcmUgaXMgcmVhZGluZyB0aGUgdXNlcidzICRIT01FLy5uZXRyYyBmaWxlKSwgaXQgbm93CisgIGVuZm9yY2VzIHRoZSBzYW1lIHNlY3VyaXR5IHJ1bGVzIGFzIHR5cGljYWwgZnRwIGNsaWVudHM6IHRoZSAubmV0cmMgZmlsZSBtdXN0CisgIGJlIG93bmVkIGJ5IHRoZSB1c2VyIHRoYXQgb3ducyB0aGUgcHJvY2VzcyBhbmQgbXVzdCBub3QgYmUgcmVhZGFibGUgYnkgYW55CisgIG90aGVyIHVzZXIuCisKKy0gSXNzdWUgIzE3MzI0OiBGaXggaHR0cC5zZXJ2ZXIncyByZXF1ZXN0IGhhbmRsaW5nIGNhc2Ugb24gdHJhaWxpbmcgJy8nLiBQYXRjaAorICBjb250cmlidXRlZCBieSBWYWpyYXNreSBLb2suCisKKy0gSXNzdWUgIzE5MDE4OiBUaGUgaGVhcHEubWVyZ2UoKSBmdW5jdGlvbiBubyBsb25nZXIgc3VwcHJlc3NlcyBJbmRleEVycm9yCisgIGluIHRoZSB1bmRlcmx5aW5nIGl0ZXJhYmxlcy4KKworLSBJc3N1ZSAjMTg3ODQ6IFRoZSB1dWlkIG1vZHVsZSBubyBtb3JlIGF0dGVtcHRzIHRvIGxvYWQgbGliYyB2aWEgY3R5cGVzLkNETEwsCisgIGlmIGFsbCBuZWNlc3NhcnkgZnVuY3Rpb25zIGFyZSBhbHJlYWR5IGZvdW5kIGluIGxpYnV1aWQuCisgIFBhdGNoIGJ5IEV2Z2VueSBTb2xvZ3Vib3YuCisKKy0gSXNzdWUgIzE0OTcxOiB1bml0dGVzdCB0ZXN0IGRpc2NvdmVyeSBubyBsb25nZXIgZ2V0cyBjb25mdXNlZCB3aGVuIGEgZnVuY3Rpb24KKyAgaGFzIGEgZGlmZmVyZW50IF9fbmFtZV9fIHRoYW4gaXRzIG5hbWUgaW4gdGhlIFRlc3RDYXNlIGNsYXNzIGRpY3Rpb25hcnkuCisKKy0gSXNzdWUgIzE4NjcyOiBGaXhlZCBmb3JtYXQgc3BlY2lmaWVycyBmb3IgUHlfc3NpemVfdCBpbiBkZWJ1Z2dpbmcgb3V0cHV0IGluCisgIHRoZSBfc3JlIG1vZHVsZS4KKworLSBJc3N1ZSAjMTg4MzA6IGluc3BlY3QuZ2V0Y2xhc3N0cmVlKCkgbm8gbW9yZSBwcm9kdWNlcyBkdXBsaWNhdGVkIGVudHJpZXMgZXZlbgorICB3aGVuIGlucHV0IGxpc3QgY29udGFpbnMgZHVwbGljYXRlcy4KKworLSBJc3N1ZSAjMTg5MDk6IEZpeCBfdGtpbnRlci50a2FwcC5pbnRlcnBhZGRyKCkgb24gV2luZG93cyA2NC1iaXQsIGRvbid0IGNhc3QKKyAgNjQtYml0IHBvaW50ZXIgdG8gbG9uZyAoMzIgYml0cykuCisKKy0gSXNzdWUgIzE4ODc2OiBUaGUgRmlsZUlPLm1vZGUgYXR0cmlidXRlIG5vdyBiZXR0ZXIgcmVmbGVjdHMgdGhlIGFjdHVhbCBtb2RlCisgIHVuZGVyIHdoaWNoIHRoZSBmaWxlIHdhcyBvcGVuZWQuICBQYXRjaCBieSBFcmlrIEJyYXkuCisKKy0gSXNzdWUgIzE4ODUxOiBBdm9pZCBhIGRvdWJsZSBjbG9zZSBvZiBzdWJwcm9jZXNzIHBpcGVzIHdoZW4gdGhlIGNoaWxkCisgIHByb2Nlc3MgZmFpbHMgc3RhcnRpbmcuCisKKy0gSXNzdWUgIzE4NDE4OiBBZnRlciBmb3JrKCksIHJlaW5pdCBhbGwgdGhyZWFkcyBzdGF0ZXMsIG5vdCBvbmx5IGFjdGl2ZSBvbmVzLgorICBQYXRjaCBieSBBLiBKZXNzZSBKaXJ5dSBEYXZpcy4KKworLSBJc3N1ZSAjMTE5NzM6IEZpeCBhIHByb2JsZW0gaW4ga2V2ZW50LiBUaGUgZmxhZ3MgYW5kIGZmbGFncyBmaWVsZHMgYXJlIG5vdworICBwcm9wZXJseSBoYW5kbGVkIGFzIHVuc2lnbmVkLgorCistIElzc3VlICMxNjgwOTogRml4ZWQgc29tZSB0a2ludGVyIGluY29tcGFiaWxpdGllcyB3aXRoIFRjbC9UayA4LjYuCisKKy0gSXNzdWUgIzE2ODA5OiBUa2ludGVyJ3Mgc3BsaXRsaXN0KCkgYW5kIHNwbGl0KCkgbWV0aG9kcyBub3cgYWNjZXB0IFRjbF9PYmoKKyAgYXJndW1lbnQuCisKKy0gSXNzdWUgIzE3MTE5OiBGaXhlZCBpbnRlZ2VyIG92ZXJmbG93cyB3aGVuIHByb2Nlc3NpbmcgbGFyZ2UgVW5pY29kZSBzdHJpbmdzCisgIGFuZCB0dXBsZXMgaW4gdGhlIHRraW50ZXIgbW9kdWxlLgorCistIElzc3VlICMxNTIzMzogUHl0aG9uIG5vdyBndWFyYW50ZWVzIHRoYXQgY2FsbGFibGVzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgYXRleGl0CisgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpbiBhIGRldGVybWluaXN0aWMgb3JkZXIuCisKKy0gSXNzdWUgIzE4NzQ3OiBSZS1zZWVkIE9wZW5TU0wncyBwc2V1ZG8tcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgYWZ0ZXIgZm9yay4KKyAgQSBwdGhyZWFkX2F0Zm9yaygpIHBhcmVudCBoYW5kbGVyIGlzIHVzZWQgdG8gc2VlZCB0aGUgUFJORyB3aXRoIHBpZCwgdGltZQorICBhbmQgc29tZSBzdGFjayBkYXRhLgorCistIElzc3VlICM4ODY1OiBDb25jdXJyZW50IGludm9jYXRpb24gb2Ygc2VsZWN0LnBvbGwucG9sbCgpIG5vdyByYWlzZXMgYQorICBSdW50aW1lRXJyb3IgZXhjZXB0aW9uLiAgUGF0Y2ggYnkgQ2hyaXN0aWFuIFNjaHViZXJ0LgorCistIElzc3VlICMxMzQ2MTogRml4IGEgY3Jhc2ggaW4gdGhlIFRleHRJT1dyYXBwZXIudGVsbCBtZXRob2Qgb24gNjQtYml0CisgIHBsYXRmb3Jtcy4gIFBhdGNoIGJ5IFlvZ2VzaCBDaGF1ZGhhcmkuCisKKy0gSXNzdWUgIzE4Nzc3OiBUaGUgc3NsIG1vZHVsZSBub3cgdXNlcyB0aGUgbmV3IENSWVBUT19USFJFQURJRCBBUEkgb2YKKyAgT3BlblNTTCAxLjAuMCsgaW5zdGVhZCBvZiB0aGUgZGVwcmVjYXRlZCBDUllQVE8gaWQgY2FsbGJhY2sgZnVuY3Rpb24uCisKKy0gSXNzdWUgIzE4NzY4OiBDb3JyZWN0IGRvYyBzdHJpbmcgb2YgUkFORF9lZGcoKS4gUGF0Y2ggYnkgVmFqcmFza3kgS29rLgorCistIElzc3VlICMxODE3ODogRml4IGN0eXBlcyBvbiBCU0QuIGRsbWFsbG9jLmMgd2FzIGNvbXBpbGVkIHR3aWNlIHdoaWNoIGJyb2tlCisgIG1hbGxvYyB3ZWFrIHN5bWJvbHMuCisKKy0gSXNzdWUgIzE4NzA5OiBGaXggQ1ZFLTIwMTMtNDIzOC4gVGhlIFNTTCBtb2R1bGUgbm93IGhhbmRsZXMgTlVMTCBieXRlcworICBpbnNpZGUgc3ViamVjdEFsdE5hbWUgY29ycmVjdGx5LiBGb3JtZXJseSB0aGUgbW9kdWxlIGhhcyB1c2VkIE9wZW5TU0wncworICBHRU5FUkFMX05BTUVfcHJpbnQoKSBmdW5jdGlvbiB0byBnZXQgdGhlIHN0cmluZyByZXByZXNlbnRpb24gb2YgQVNOLjEKKyAgc3RyaW5ncyBmb3IgYGByZmM4MjJOYW1lYGAgKGVtYWlsKSwgYGBkTlNOYW1lYGAgKEROUykgYW5kCisgIGBgdW5pZm9ybVJlc291cmNlSWRlbnRpZmllcmBgIChVUkkpLgorCistIElzc3VlICMxODc1NjogSW1wcm92ZSBlcnJvciByZXBvcnRpbmcgaW4gb3MudXJhbmRvbSgpIHdoZW4gdGhlIGZhaWx1cmUKKyAgaXMgZHVlIHRvIHNvbWV0aGluZyBlbHNlIHRoYW4gL2Rldi91cmFuZG9tIG5vdCBleGlzdGluZyAoZm9yIGV4YW1wbGUsCisgIGV4aGF1c3RpbmcgdGhlIGZpbGUgZGVzY3JpcHRvciBsaW1pdCkuCisKKy0gRml4IHRraW50ZXIgcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGJ5IHRoZSBzZWN1cml0eSBmaXggaW4gaXNzdWUgIzE2MjQ4LgorCistIElzc3VlICMxODY3NjogQ2hhbmdlICdwb3NpdGl2ZScgdG8gJ25vbi1uZWdhdGl2ZScgaW4gcXVldWUucHkgcHV0IGFuZCBnZXQKKyAgZG9jc3RyaW5ncyBhbmQgVmFsdWVFcnJvciBtZXNzYWdlcy4gUGF0Y2ggYnkgWmhvbmd5dWUgTHVvCisKKy0gSXNzdWUgIzE3OTk4OiBGaXggYW4gaW50ZXJuYWwgZXJyb3IgaW4gcmVndWxhciBleHByZXNzaW9uIGVuZ2luZS4KKworLSBJc3N1ZSAjMTc1NTc6IEZpeCBvcy5nZXRncm91cHMoKSB0byB3b3JrIHdpdGggdGhlIG1vZGlmaWVkIGJlaGF2aW9yIG9mCisgIGdldGdyb3VwcygyKSBvbiBPUyBYIDEwLjguICBPcmlnaW5hbCBwYXRjaCBieSBNYXRldXN6IExlbmlrLgorCistIElzc3VlICMxODQ1NTogbXVsdGlwcm9jZXNzaW5nIHNob3VsZCBub3QgcmV0cnkgY29ubmVjdCgpIHdpdGggc2FtZSBzb2NrZXQuCisKKy0gSXNzdWUgIzE4NTEzOiBGaXggYmVoYXZpb3VyIG9mIGNtYXRoLnJlY3Qgdy5yLnQuIHNpZ25lZCB6ZXJvcyBvbiBPUyBYIDEwLjggKworICBnY2MuCisKKy0gSXNzdWUgIzE4MTAxOiBUY2wuc3BsaXQoKSBub3cgcHJvY2VzcyBVbmljb2RlIHN0cmluZ3MgbmVzdGVkIGluIGEgdHVwbGUgYXMgaXQKKyAgZG8gd2l0aCBieXRlIHN0cmluZ3MuCisKKy0gSXNzdWUgIzE4MzQ3OiBFbGVtZW50VHJlZSdzIGh0bWwgc2VyaWFsaXplciBub3cgcHJlc2VydmVzIHRoZSBjYXNlIG9mCisgIGNsb3NpbmcgdGFncy4KKworLSBJc3N1ZSAjMTcyNjE6IEVuc3VyZSBtdWx0aXByb2Nlc3NpbmcncyBwcm94aWVzIHVzZSBwcm9wZXIgYWRkcmVzcy4KKworLSBJc3N1ZSAjMTcwOTc6IE1ha2UgbXVsdGlwcm9jZXNzaW5nIGlnbm9yZSBFSU5UUi4KKworLSBJc3N1ZSAjMTgxNTU6IFRoZSBjc3YgbW9kdWxlIG5vdyBjb3JyZWN0bHkgaGFuZGxlcyBjc3YgZmlsZXMgdGhhdCB1c2UKKyAgYSBkZWxpbWl0ZXIgY2hhcmFjdGVyIHRoYXQgaGFzIGEgc3BlY2lhbCBtZWFuaW5nIGluIHJlZ2V4ZXMsIGluc3RlYWQgb2YKKyAgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLgorCistIElzc3VlICMxODEzNTogc3NsLlNTTFNvY2tldC53cml0ZSgpIG5vdyByYWlzZXMgYW4gT3ZlcmZsb3dFcnJvciBpZiB0aGUgaW5wdXQKKyAgc3RyaW5nIGluIGxvbmdlciB0aGFuIDIgZ2lnYWJ5dGVzLiBUaGUgc3NsIG1vZHVsZSBkb2VzIG5vdCBzdXBwb3J0IHBhcnRpYWwKKyAgd3JpdGUuCisKKy0gSXNzdWUgIzE4MTY3OiBjZ2kuRmllbGRTdG9yYWdlIG5vIGxvbmdlciBmYWlscyB0byBoYW5kbGUgbXVsdGlwYXJ0L2Zvcm0tZGF0YQorICB3aGVuIFxyXG4gYXBwZWFycyBhdCBlbmQgb2YgNjU1MzUgYnl0ZXMgd2l0aG91dCBvdGhlciBuZXdsaW5lcy4KKworLSBJc3N1ZSAjMTc0MDM6IHVybGxpYi5wYXJzZS5yb2JvdHBhcnNlciBub3JtYWxpemVzIHRoZSB1cmxzIGJlZm9yZSBhZGRpbmcgdG8KKyAgcnVsZWxpbmUuIFRoaXMgaGVscHMgaW4gaGFuZGxpbmcgY2VydGFpbiB0eXBlcyBpbnZhbGlkIHVybHMgaW4gYSBjb25zZXJ2YXRpdmUKKyAgbWFubmVyLiBQYXRjaCBjb250cmlidXRlZCBieSBNaGVyIE1vdnNpc3lhbi4KKworLSBJbXBsZW1lbnQgaW5lcXVhbGl0eSBvbiB3ZWFrcmVmLldlYWtTZXQuCisKKy0gSXNzdWUgIzE3OTgxOiBDbG9zZWQgc29ja2V0IG9uIGVycm9yIGluIFN5c0xvZ0hhbmRsZXIuCisKKy0gSXNzdWUgIzE4MDE1OiBGaXggdW5waWNrbGluZyBvZiAyLjcuMyBhbmQgMi43LjQgbmFtZWR0dXBsZXMuCisKKy0gSXNzdWUgIzE3NzU0OiBNYWtlIGN0eXBlcy51dGlsLmZpbmRfbGlicmFyeSgpIGluZGVwZW5kZW50IG9mIHRoZSBsb2NhbGUuCisKKy0gRml4IHR5cG9zIGluIHRoZSBtdWx0aXByb2Nlc3NpbmcgbW9kdWxlLgorCistIElzc3VlICMxNzI2OTogV29ya2Fyb3VuZCBmb3Igc29ja2V0LmdldGFkZHJpbmZvIGNyYXNoIG9uIE1hY09TIFgKKyAgd2l0aCBwb3J0IE5vbmUgb3IgIjAiIGFuZCBmbGFncyBBSV9OVU1FUklDU0VSVi4KKworLSBJc3N1ZSAjMTgwODA6IFdoZW4gYnVpbGRpbmcgYSBDIGV4dGVuc2lvbiBtb2R1bGUgb24gT1MgWCwgaWYgdGhlIGNvbXBpbGVyCisgIGlzIG92ZXJyaWRlbiB3aXRoIHRoZSBDQyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdXNlIHRoZSBuZXcgY29tcGlsZXIgYXMKKyAgdGhlIGRlZmF1bHQgZm9yIGxpbmtpbmcgaWYgTERTSEFSRUQgaXMgbm90IGFsc28gb3ZlcnJpZGVuLiAgVGhpcyByZXN0b3JlcworICBEaXN0dXRpbHMgYmVoYXZpb3IgaW50cm9kdWNlZCBpbiAyLjcuMyBhbmQgaW5hZHZlcnRlbnRseSBkcm9wcGVkIGluIDIuNy40LgorCistIElzc3VlICMxODA3MTogQyBleHRlbnNpb24gbW9kdWxlIGJ1aWxkcyBvbiBPUyBYIGNvdWxkIGZhaWwgd2l0aCBUeXBlRXJyb3IKKyAgaWYgdGhlIFhjb2RlIGNvbW1hbmQgbGluZSB0b29scyB3ZXJlIG5vdCBpbnN0YWxsZWQuCisKKy0gSXNzdWUgIzE4MTEzOiBGaXhlZCBhIHJlZmNvdW50IGxlYWsgaW4gdGhlIGN1cnNlcy5wYW5lbCBtb2R1bGUncworICBzZXRfdXNlcnB0cigpIG1ldGhvZC4gIFJlcG9ydGVkIGJ5IEF0c3VvIElzaGltb3RvLgorCistIElzc3VlICMxODg0OTogRml4ZWQgYSBXaW5kb3dzLXNwZWNpZmljIHRlbXBmaWxlIGJ1ZyB3aGVyZSBjb2xsaXNpb24gd2l0aCBhbgorICBleGlzdGluZyBkaXJlY3RvcnkgY2F1c2VkIG1rc3RlbXAgYW5kIHJlbGF0ZWQgQVBJcyB0byBmYWlsIGluc3RlYWQgb2YKKyAgcmV0cnlpbmcuIFJlcG9ydCBhbmQgZml4IGJ5IFZsYWQgU2hjaGVyYmluYS4KKworLSBJc3N1ZSAjMTk0MDA6IFByZXZlbnQgZXh0ZW5zaW9uIG1vZHVsZSBidWlsZCBmYWlsdXJlcyB3aXRoIFhjb2RlIDUgb24gT1MgWAorICAxMC44KyB3aGVuIHVzaW5nIGEgdW5pdmVyc2FsIFB5dGhvbiB0aGF0IGluY2x1ZGVkIGEgUFBDIGFyY2hpdGVjdHVyZSwKKyAgc3VjaCBhcyB3aXRoIGEgcHl0aG9uLm9yZyAzMi1iaXQtb25seSBiaW5hcnkgaW5zdGFsbGVyLgorCitUb29scy9EZW1vcworLS0tLS0tLS0tLS0KKworLSBJc3N1ZSAjMTg4NzM6IDJ0bzMgYW5kIHRoZSBmaW5kbm9jb2RpbmcucHkgc2NyaXB0IG5vdyBkZXRlY3QgUHl0aG9uIHNvdXJjZQorICBjb2RlIGVuY29kaW5nIG9ubHkgaW4gY29tbWVudCBsaW5lcy4KKworLSBJc3N1ZSAjMTg4MTc6IEZpeCBhIHJlc291cmNlIHdhcm5pbmcgaW4gTGliL2FpZmMucHkgZGVtby4KKworLSBJc3N1ZSAjMTg0Mzk6IE1ha2UgcGF0Y2hjaGVjayB3b3JrIG9uIFdpbmRvd3MgZm9yIEFDS1MsIE5FV1MuCisKKy0gSXNzdWUgIzE4NDQ4OiBGaXggYSB0eXBvIGluIERlbW8vbmV3bWV0YWNsYXNzZXMvRWlmZmVsLnB5LgorCistIElzc3VlICMxMjk5MDogVGhlICJQeXRob24gTGF1bmNoZXIiIG9uIE9TWCBjb3VsZCBub3QgbGF1bmNoIHB5dGhvbiBzY3JpcHRzCisgIHRoYXQgaGF2ZSBwYXRocyB0aGF0IGluY2x1ZGUgd2lkZSBjaGFyYWN0ZXJzLgorCitCdWlsZAorLS0tLS0KKworLSBJc3N1ZSAjMTYwNjc6IEFkZCBkZXNjcmlwdGlvbiBpbnRvIE1TSSBmaWxlIHRvIHJlcGxhY2UgaW5zdGFsbGVyJ3MgdGVtcG9yYXJ5IG5hbWUuCisKKy0gSXNzdWUgIzE4MjU2OiBDb21waWxhdGlvbiBmaXggZm9yIHJlY2VudCBBSVggcmVsZWFzZXMuICBQYXRjaCBieQorICBEYXZpZCBFZGVsc29obi4KKworLSBJc3N1ZSAjMTgwOTg6IFRoZSBkZXByZWNhdGVkIE9TIFggQnVpbGQgQXBwbGV0LmFwcCBmYWlscyB0byBidWlsZCBvbgorICBPUyBYIDEwLjggc3lzdGVtcyBiZWNhdXNlIHRoZSBBcHBsZS1kZXByZWNhdGVkIFF1aWNrRHJhdyBoZWFkZXJzIGhhdmUKKyAgYmVlbiByZW1vdmVkIGZyb20gWGNvZGUgNC4gIFNraXAgYnVpbGRpbmcgaXQgaW4gdGhpcyBjYXNlLgorCistIElzc3VlICMxNTg0OiBQcm92aWRlIG9wdGlvbnMgdG8gb3ZlcnJpZGUgZGVmYXVsdCBzZWFyY2ggcGF0aHMgZm9yCisgIFRjbCBhbmQgVGsgd2hlbiBidWlsZGluZyBfdGtpbnRlci4KKworLSBJc3N1ZSAjMTU2NjM6IFRjbC9UayA4LjUuMTUgaXMgbm93IGluY2x1ZGVkIHdpdGggdGhlIE9TIFggMTAuNisKKyAgNjQtYml0LzMyLWJpdCBpbnN0YWxsZXIgZm9yIDEwLjYrLiAgSXQgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeQorICB0byBpbnN0YWxsIGEgdGhpcmQtcGFydHkgdmVyc2lvbiBvZiBUY2wvVGsgOC41IHRvIHdvcmsgYXJvdW5kIHRoZQorICBwcm9ibGVtcyBpbiB0aGUgQXBwbGUtc3VwcGxpZWQgVGNsL1RrIDguNSBzaGlwcGVkIGluIE9TIFggMTAuNgorICBhbmQgbGF0ZXIgcmVsZWFzZXMuCisKKy0gSXNzdWUgIzE5MDE5OiBDaGFuZ2UgdGhlIE9TIFggaW5zdGFsbGVyIGJ1aWxkIHNjcmlwdCB0byB1c2UgQ0ZMQUdTIGluc3RlYWQKKyAgb2YgT1BUIGZvciBzcGVjaWFsIGJ1aWxkIG9wdGlvbnMuICBCeSBzZXR0aW5nIE9QVCwgc29tZSBjb21waWxlci1zcGVjaWZpYworICBvcHRpb25zIGxpa2UgLWZ3cmFwdiB3ZXJlIG92ZXJyaWRkZW4gYW5kIHRodXMgbm90IHVzZWQsIHdoaWNoIGNvdWxkIHJlc3VsdAorICBpbiBicm9rZW4gaW50ZXJwcmV0ZXJzIHdoZW4gYnVpbGRpbmcgd2l0aCBjbGFuZy4KKworSURMRQorLS0tLQorCistIElzc3VlICMxODg3MzogSURMRSBub3cgZGV0ZWN0cyBQeXRob24gc291cmNlIGNvZGUgZW5jb2Rpbmcgb25seSBpbiBjb21tZW50CisgIGxpbmVzLgorCistIElzc3VlICMxODk4ODogVGhlICJUYWIiIGtleSBub3cgd29ya3Mgd2hlbiBhIHdvcmQgaXMgYWxyZWFkeSBhdXRvY29tcGxldGVkLgorCistIElzc3VlICMxODQ4OTogQWRkIHRlc3RzIGZvciBTZWFyY2hFbmdpbmUuIE9yaWdpbmFsIHBhdGNoIGJ5IFBoaWwgV2Vic3Rlci4KKworLSBJc3N1ZSAjMTg0Mjk6IEZvcm1hdCAvIEZvcm1hdCBQYXJhZ3JhcGgsIG5vdyB3b3JrcyB3aGVuIGNvbW1lbnQgYmxvY2tzCisgIGFyZSBzZWxlY3RlZC4gQXMgd2l0aCB0ZXh0IGJsb2NrcywgdGhpcyB3b3JrcyBiZXN0IHdoZW4gdGhlIHNlbGVjdGlvbgorICBvbmx5IGluY2x1ZGVzIGNvbXBsZXRlIGxpbmVzLgorCistIElzc3VlICMxODIyNjogQWRkIGRvY3N0cmluZ3MgYW5kIHVuaXR0ZXN0cyBmb3IgRm9ybWF0UGFyYWdyYXBoLnB5LgorICBPcmlnaW5hbCBwYXRjaGVzIGJ5IFRvZGQgUm92aXRvIGFuZCBQaGlsIFdlYnN0ZXIuCisKKy0gSXNzdWUgIzE4Mjc5OiBGb3JtYXQgLSBTdHJpcCB0cmFpbGluZyB3aGl0ZXNwYWNlIG5vIGxvbmdlciBtYXJrcyBhIGZpbGUgYXMKKyAgY2hhbmdlZCB3aGVuIGl0IGhhcyBub3QgYmVlbiBjaGFuZ2VkLiBUaGlzIGZpeCBmb2xsb3dlZCB0aGUgYWRkaXRpb24gb2YgYQorICB0ZXN0IGZpbGUgb3JpZ2luYWxseSB3cml0dGVuIGJ5IFBoaWwgV2Vic3RlciAodGhlIGlzc3VlJ3MgbWFpbiBnb2FsKS4KKworLSBJc3N1ZSAjMTg1Mzk6IENhbGx0aXBzIG5vdyB3b3JrIGZvciBmbG9hdCBkZWZhdWx0IGFyZ3VtZW50cy4KKworLSBJc3N1ZSAjNzEzNjogSW4gdGhlIElkbGUgRmlsZSBtZW51LCAiTmV3IFdpbmRvdyIgaXMgcmVuYW1lZCAiTmV3IEZpbGUiLgorICBQYXRjaCBieSBUYWwgRWluYXQsIFJvZ2V0IFNlcnd5LCBhbmQgVG9kZCBSb3ZpdG8uCisKKy0gSXNzdWUgIzg1MTU6IFNldCBfX2ZpbGVfXyB3aGVuIHJ1biBmaWxlIGluIElETEUuCisgIEluaXRpYWwgcGF0Y2ggYnkgQnJ1Y2UgRnJlZGVyaWtzZW4uCisKKy0gSXNzdWUgIzU0OTI6IEF2b2lkIHRyYWNlYmFjayB3aGVuIGV4aXRpbmcgSURMRSBjYXVzZWQgYnkgYSByYWNlIGNvbmRpdGlvbi4KKworLSBJc3N1ZSAjMTc1MTE6IEtlZXAgSURMRSBmaW5kIGRpYWxvZyBvcGVuIGFmdGVyIGNsaWNraW5nICJGaW5kIE5leHQiLgorICBPcmlnaW5hbCBwYXRjaCBieSBTYXJhaCBLLgorCistIElzc3VlICMxNTM5MjogQ3JlYXRlIGEgdW5pdHRlc3QgZnJhbWV3b3JrIGZvciBJRExFLgorICBQcmVsaW1pbmFyeSBwYXRjaCBieSBSYWphZ29wYWxhc2FybWEgSmF5YWtyaXNobmFuCisgIFNlZSBMaWIvaWRsZWxpYi9pZGxlX3Rlc3QvUkVBRE1FLnR4dCBmb3IgaG93IHRvIHJ1biBJZGxlIHRlc3RzLgorCistIElzc3VlICMxNDE0NjogSGlnaGxpZ2h0IHNvdXJjZSBsaW5lIHdoaWxlIGRlYnVnZ2luZyBvbiBXaW5kb3dzLgorCistIElzc3VlICMxNzUzMjogQWx3YXlzIGluY2x1ZGUgT3B0aW9ucyBtZW51IGZvciBJRExFIG9uIE9TIFguCisgIFBhdGNoIGJ5IEd1aWxoZXJtZSBTaW3DtWVzLgorCitUZXN0cworLS0tLS0KKworLSBJc3N1ZSAjMTg5MTk6IEFkZGVkIHRlc3RzIGZvciB0aGUgc3VuYXUgbW9kdWxlLiAgVW5pZmllZCBhbmQgZXh0ZW5kZWQgdGVzdHMKKyAgZm9yIGF1ZGlvIG1vZHVsZXM6IGFpZmMsIHN1bmF1IGFuZCB3YXZlLgorCistIElzc3VlICMxODc5MjogVXNlICIxMjcuMC4wLjEiIG9yICI6OjEiIGluc3RlYWQgb2YgImxvY2FsaG9zdCIgYXMgbXVjaCBhcworICBwb3NzaWJsZSwgc2luY2UgImxvY2FsaG9zdCIgZ29lcyB0aHJvdWdoIGEgRE5TIGxvb2t1cCB1bmRlciByZWNlbnQgV2luZG93cworICB2ZXJzaW9ucy4KKworLSBJc3N1ZSAjMTgzNTc6IGFkZCB0ZXN0cyBmb3IgZGljdHZpZXcgc2V0IGRpZmZlcmVuY2UuCisgIFBhdGNoIGJ5IEZyYXNlciBUd2VlZGFsZS4KKworLSBJc3N1ZSAjMTExODU6IEZpeCB0ZXN0X3dhaXQ0IHVuZGVyIEFJWC4gIFBhdGNoIGJ5IFPDqWJhc3RpZW4gU2FibMOpLgorCistIElzc3VlICMxODA5NDogdGVzdF91dWlkIG5vIG1vcmUgcmVwb3J0cyBza2lwcGVkIHRlc3RzIGFzIHBhc3NlZC4KKworLSBJc3N1ZSAjMTE5OTU6IHRlc3RfcHlkb2MgZG9lc24ndCBpbXBvcnQgYWxsIHN5cy5wYXRoIG1vZHVsZXMgYW55bW9yZS4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLQorCistIElzc3VlICMxODc1ODogRml4ZWQgYW5kIGltcHJvdmVkIGNyb3NzLXJlZmVyZW5jZXMuCisKKy0gSXNzdWUgIzE4NzE4OiBkYXRldGltZSBkb2N1bWVudGF0aW9uIGNvbnRyYWRpY3Rvcnkgb24gbGVhcCBzZWNvbmQgc3VwcG9ydC4KKworLSBJc3N1ZSAjMTc3MDE6IEltcHJvdmluZyBzdHJmdGltZSBkb2N1bWVudGF0aW9uLgorCistIElzc3VlICMxNzg0NDogUmVmYWN0b3IgYSBkb2N1bWVudGF0aW9uIG9mIFB5dGhvbiBzcGVjaWZpYyBlbmNvZGluZ3MuCisgIEFkZCBsaW5rcyB0byBlbmNvZGVycyBhbmQgZGVjb2RlcnMgZm9yIGJpbmFyeS10by1iaW5hcnkgY29kZWNzLgorCisKK1doYXQncyBOZXcgaW4gUHl0aG9uIDIuNy41PworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDIwMTMtMDUtMTIqCisKK0NvcmUgYW5kIEJ1aWx0aW5zCistLS0tLS0tLS0tLS0tLS0tLQorCistIElzc3VlICMxNTUzNTogRml4ZWQgcmVncmVzc2lvbiBpbiB0aGUgcGlja2xpbmcgb2YgbmFtZWQgdHVwbGVzIGJ5CisgIHJlbW92aW5nIHRoZSBfX2RpY3RfXyBwcm9wZXJ0eSBpbnRyb2R1Y2VkIGluIDIuNy40LgorCistIElzc3VlICMxNzg1NzogUHJldmVudCBidWlsZCBmYWlsdXJlcyB3aXRoIHByZS0zLjUuMCB2ZXJzaW9ucyBvZiBzcWxpdGUzLAorICBzdWNoIGFzIHdhcyBzaGlwcGVkIHdpdGggQ2VudG9zIDUgYW5kIE1hYyBPUyBYIDEwLjQuCisKKy0gSXNzdWUgIzE3NzAzOiBGaXggYSByZWdyZXNzaW9uIHdoZXJlIGFuIGlsbGVnYWwgdXNlIG9mIFB5X0RFQ1JFRigpIGFmdGVyCisgIGludGVycHJldGVyIGZpbmFsaXphdGlvbiBjYW4gY2F1c2UgYSBjcmFzaC4KKworLSBJc3N1ZSAjMTY0NDc6IEZpeGVkIHBvdGVudGlhbCBzZWdtZW50YXRpb24gZmF1bHQgd2hlbiBzZXR0aW5nIF9fbmFtZV9fIG9uIGEKKyAgY2xhc3MuCisKKy0gSXNzdWUgIzE3NjEwOiBEb24ndCByZWx5IG9uIG5vbi1zdGFuZGFyZCBiZWhhdmlvciBvZiB0aGUgQyBxc29ydCgpIGZ1bmN0aW9uLgorCitMaWJyYXJ5CistLS0tLS0tCisKKy0gSXNzdWUgIzE3OTc5OiBGaXhlZCB0aGUgcmUgbW9kdWxlIGluIGJ1aWxkIHdpdGggLS1kaXNhYmxlLXVuaWNvZGUuCisKKy0gSXNzdWUgIzE3NjA2OiBGaXhlZCBzdXBwb3J0IG9mIGVuY29kZWQgYnl0ZSBzdHJpbmdzIGluIHRoZSBYTUxHZW5lcmF0b3IKKyAuY2hhcmFjdGVycygpIGFuZCBpZ25vcmFibGVXaGl0ZXNwYWNlKCkgbWV0aG9kcy4gIE9yaWdpbmFsIHBhdGNoIGJ5IFNlYmFzdGlhbgorICBPcnRpeiBWYXNxdWV6LgorCistIElzc3VlICMxNjYwMTogUmVzdGFydGluZyBpdGVyYXRpb24gb3ZlciB0YXJmaWxlIG5vIG1vcmUgY29udGludWVzIGZyb20gd2hlcmUKKyAgaXQgbGVmdCBvZmYuICBQYXRjaCBieSBNaWNoYWVsIEJpcnR3ZWxsLgorCistIElzc3VlIDE2NTg0OiBpbiBmaWxlY29tcC5fY21wLCBjYXRjaCBJT0Vycm9yIGFzIHdlbGwgYXMgb3MuZXJyb3IuCisgIFBhdGNoIGJ5IFRpbGwgTWFhcy4KKworLSBJc3N1ZSAjMTc5MjY6IEZpeCBkYm0uX19jb250YWluc19fIG9uIDY0LWJpdCBiaWctZW5kaWFuIG1hY2hpbmVzLgorCistIElzc3VlICMxOTI2NzogRml4IHN1cHBvcnQgb2YgbXVsdGlieXRlIGVuY29kaW5nIChleDogVVRGLTE2KSBpbiB0aGUgbG9nZ2luZworICBtb2R1bGUuCisKKy0gSXNzdWUgIzE3OTE4OiBXaGVuIHVzaW5nIFNTTFNvY2tldC5hY2NlcHQoKSwgaWYgdGhlIFNTTCBoYW5kc2hha2UgZmFpbGVkCisgIG9uIHRoZSBuZXcgc29ja2V0LCB0aGUgc29ja2V0IHdvdWxkIGxpbmdlciBpbmRlZmluaXRlbHkuICBUaGFua3MgdG8KKyAgUGV0ZXIgU2F2ZWxpZXYgZm9yIHJlcG9ydGluZy4KKworLSBJc3N1ZSAjMTcyODk6IFRoZSByZWFkbGluZSBtb2R1bGUgbm93IHBsYXlzIG5pY2VyIHdpdGggZXh0ZXJuYWwgbW9kdWxlcworICBvciBhcHBsaWNhdGlvbnMgY2hhbmdpbmcgdGhlIHJsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMgZ2xvYmFsCisgIHZhcmlhYmxlLiAgSW5pdGlhbCBwYXRjaCBieSBCcmFkbGV5IEZyb2VobGUuCisKKy0gSXNzdWUgIzEyMTgxOiBzZWxlY3QgbW9kdWxlOiBGaXggc3RydWN0IGtldmVudCBkZWZpbml0aW9uIG9uIE9wZW5CU0QgNjQtYml0CisgIHBsYXRmb3Jtcy4gUGF0Y2ggYnkgRmVkZXJpY28gU2Nod2luZHQuCisKKy0gSXNzdWUgIzE0MTczOiBBdm9pZCBjcmFzaGluZyB3aGVuIHJlYWRpbmcgYSBzaWduYWwgaGFuZGxlciBkdXJpbmcKKyAgaW50ZXJwcmV0ZXIgc2h1dGRvd24uCisKKy0gSXNzdWUgIzE2MzE2OiBtaW1ldHlwZXMgbm93IHJlY29nbml6ZXMgdGhlIC54eiBhbmQgLnR4eiAoLnRhci54eikgZXh0ZW5zaW9ucy4KKworLSBJc3N1ZSAjMTcxOTI6IFJlc3RvcmUgdGhlIHBhdGNoIGZvciBJc3N1ZSAjMTAzMDkgd2hpY2ggd2FzIG9tbWl0dGVkCisgIGluIDIuNy40IHdoZW4gdXBkYXRpbmcgdGhlIGJ1bmRsZWQgdmVyc2lvbiBvZiBsaWJmZmkgdXNlZCBieSBjdHlwZXMuCisKKy0gSXNzdWUgIzE3ODQzOiBSZW1vdmVkIHRlc3QgZGF0YSBmaWxlIHRoYXQgd2FzIHRyaWdnZXJpbmcgZmFsc2UtcG9zaXRpdmUgdmlydXMKKyAgd2FybmluZ3Mgd2l0aCBjZXJ0YWluIGFudGl2aXJ1cyBzb2Z0d2FyZS4KKworLSBJc3N1ZSAjMTczNTM6IFBsaXN0bGliIGVtaXR0ZWQgZW1wdHkgZGF0YSB0YWdzIHdpdGggZGVlcGx5IG5lc3RlZCBkYXRhc3RydWN0dXJlcworCistIElzc3VlICMxMTcxNDogVXNlICd3aXRoJyBzdGF0ZW1lbnRzIHRvIGFzc3VyZSBhIFNlbWFwaG9yZSByZWxlYXNlcyBhCisgIGNvbmRpdGlvbiB2YXJpYWJsZS4gIE9yaWdpbmFsIHBhdGNoIGJ5IFRob21hcyBSYWNoZWwuCisKKy0gSXNzdWUgIzE3Nzk1OiBSZXZlcnRlZCBiYWNrd2FyZHMtaW5jb21wYXRpYmxlIGNoYW5nZSBpbiBTeXNMb2dIYW5kbGVyIHdpdGgKKyAgVW5peCBkb21haW4gc29ja2V0cy4KKworLSBJc3N1ZSAjMTc1NTU6IEZpeCBGb3JrQXdhcmVUaHJlYWRMb2NrIHNvIHRoYXQgc2l6ZSBvZiBhZnRlciBmb3JrCisgIHJlZ2lzdHJ5IGRvZXMgbm90IGdyb3cgZXhwb25lbnRpYWxseSB3aXRoIGdlbmVyYXRpb24gb2YgcHJvY2Vzcy4KKworLSBJc3N1ZSAjMTc3MTA6IEZpeCBjUGlja2xlIHJhaXNpbmcgYSBTeXN0ZW1FcnJvciBvbiBib2d1cyBpbnB1dC4KKworLSBJc3N1ZSAjMTczNDE6IEluY2x1ZGUgdGhlIGludmFsaWQgbmFtZSBpbiB0aGUgZXJyb3IgbWVzc2FnZXMgZnJvbSByZSBhYm91dAorICBpbnZhbGlkIGdyb3VwIG5hbWVzLgorCistIElzc3VlICMxNzAxNjogR2V0IHJpZCBvZiBwb3NzaWJsZSBwb2ludGVyIHdyYXBhcm91bmRzIGFuZCBpbnRlZ2VyIG92ZXJmbG93cworICBpbiB0aGUgcmUgbW9kdWxlLiAgUGF0Y2ggYnkgTmlja29sYWkgWmVsZG92aWNoLgorCistIElzc3VlICMxNzUzNjogQWRkIHRvIHdlYmJyb3dzZXIncyBicm93c2VyIGxpc3Q6IHhkZy1vcGVuLCBndmZzLW9wZW4sCisgIHd3dy1icm93c2VyLCB4LXd3dy1icm93c2VyLCBjaHJvbWl1bSBicm93c2VycywgaWNld2Vhc2VsLCBpY2VhcGUuCisKKy0gSXNzdWUgIzE3NjU2OiBGaXggZXh0cmFjdGlvbiBvZiB6aXAgZmlsZXMgd2l0aCB1bmljb2RlIG1lbWJlciBwYXRocy4KKworLSBJc3N1ZSAjMTc2NjY6IEZpeCByZWFkaW5nIGd6aXAgZmlsZXMgd2l0aCBhbiBleHRyYSBmaWVsZC4KKworLSBJc3N1ZSAjMTMxNTAsICMxNzUxMjogc3lzY29uZmlnIG5vIGxvbmdlciBwYXJzZXMgdGhlIE1ha2VmaWxlIGFuZCBjb25maWcuaAorICBmaWxlcyB3aGVuIGltcG9ydGVkLCBpbnN0ZWFkIGRvaW5nIGl0IGF0IGJ1aWxkIHRpbWUuICBUaGlzIG1ha2VzIGltcG9ydGluZworICBzeXNjb25maWcgZmFzdGVyIGFuZCByZWR1Y2VzIFB5dGhvbiBzdGFydHVwIHRpbWUgYnkgMjAlLgorCistIElzc3VlICMxMzE2MzogUmVuYW1lIG9wZXJhbmRzIGluIHNtdHBsaWIuU01UUC5fZ2V0X3NvY2tldCB0byBjb3JyZWN0IG5hbWVzOworICBmaXhlcyBvdGhlcndpc2UgbWlzbGVhZGluZyBvdXRwdXQgaW4gdHJhY2ViYWNrcyBhbmQgd2hlbiB3aGVuIGRlYnVnIGlzIG9uLgorCistIElzc3VlICMxNzUyNjogZml4IGFuIEluZGV4RXJyb3IgcmFpc2VkIHdoaWxlIHBhc3NpbmcgY29kZSB3aXRob3V0IGZpbGVuYW1lIHRvCisgIGluc3BlY3QuZmluZHNvdXJjZSgpLiAgSW5pdGlhbCBwYXRjaCBieSBUeWxlciBEb3lsZS4KKworQnVpbGQKKy0tLS0tCisKKy0gSXNzdWUgIzE3NTQ3OiBJbiBjb25maWd1cmUsIGV4cGxpY2l0bHkgcGFzcyAtV2Zvcm1hdCBmb3IgdGhlIGJlbmVmaXQgZm9yIEdDQworICA0LjguCisKKy0gSXNzdWUgIzE3NjgyOiBBZGQgdGhlIF9pbyBtb2R1bGUgdG8gTW9kdWxlcy9TZXR1cC5kaXN0IChjb21tZW50ZWQgb3V0KS4KKworLSBJc3N1ZSAjMTcwODY6IFNlYXJjaCB0aGUgaW5jbHVkZSBhbmQgbGlicmFyeSBkaXJlY3RvcmllcyBwcm92aWRlZCBieSB0aGUKKyAgY29tcGlsZXIuCisKK1Rlc3RzCistLS0tLQorCistIElzc3VlICMxNzkyODogRml4IHRlc3Rfc3RydWN0bWVtYmVycyBvbiA2NC1iaXQgYmlnLWVuZGlhbiBtYWNoaW5lcy4KKworLSBJc3N1ZSAjMTc4ODM6IEZpeCBidWlsZGJvdCB0ZXN0aW5nIG9mIFRraW50ZXIgb24gV2luZG93cy4KKyAgUGF0Y2ggYnkgWmFjaGFyeSBXYXJlLgorCistIElzc3VlICM3ODU1OiBBZGQgdGVzdHMgZm9yIGN0eXBlcy93aW5yZWcgZm9yIGlzc3VlcyBmb3VuZCBpbiBJcm9uUHl0aG9uLgorICBJbml0aWFsIHBhdGNoIGJ5IERpbm8gVmllaGxhbmQuCisKKy0gSXNzdWUgIzE3NzEyOiBGaXggdGVzdF9nZGIgZmFpbHVyZXMgb24gVWJ1bnR1IDEzLjA0LgorCistIElzc3VlICMxNzA2NTogVXNlIHByb2Nlc3MtdW5pcXVlIGtleSBmb3Igd2lucmVnIHRlc3RzIHRvIGF2b2lkIGZhaWx1cmVzIGlmCisgIHRlc3QgaXMgcnVuIG11bHRpcGxlIHRpbWVzIGluIHBhcmFsbGVsIChlZzogb24gYSBidWlsZGJvdCBob3N0KS4KKworSURMRQorLS0tLQorCistIElzc3VlICMxNzgzODogQWxsb3cgc3lzLnN0ZGluIHRvIGJlIHJlYXNzaWduZWQuCisKKy0gSXNzdWUgIzE0NzM1OiBVcGRhdGUgSURMRSBkb2NzIHRvIG9taXQgIkNvbnRyb2wteiBvbiBXaW5kb3dzIi4KKworLSBJc3N1ZSAjMTc1ODU6IEZpeGVkIElETEUgcmVncmVzc2lvbi4gTm93IGNsb3NlcyB3aGVuIHVzaW5nIGV4aXQoKSBvciBxdWl0KCkuCisKKy0gSXNzdWUgIzE3NjU3OiBTaG93IGZ1bGwgVGsgdmVyc2lvbiBpbiBJRExFJ3MgYWJvdXQgZGlhbG9nLgorICBQYXRjaCBieSBUb2RkIFJvdml0by4KKworLSBJc3N1ZSAjMTc2MTM6IFByZXZlbnQgdHJhY2ViYWNrIHdoZW4gcmVtb3Zpbmcgc3ludGF4IGNvbG9yaXplciBpbiBJRExFLgorCistIElzc3VlICMxMjA3NTg5OiBCYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBwYXRjaCBmb3IgcmlnaHQtY2xpY2sgbWVudSBpbiBJRExFLgorCistIElzc3VlICMxNjg4NzogSURMRSBub3cgYWNjZXB0cyBDYW5jZWwgaW4gdGFiaWZ5L3VudGFiaWZ5IGRpYWxvZyBib3guCisKKy0gSXNzdWUgIzE0MjU0OiBJRExFIG5vdyBoYW5kbGVzIHJlYWRsaW5lIGNvcnJlY3RseSBhY3Jvc3Mgc2hlbGwgcmVzdGFydHMuCisKKy0gSXNzdWUgIzE3NjE0OiBJRExFIG5vIGxvbmdlciByYWlzZXMgZXhjZXB0aW9uIHdoZW4gcXVpY2tseSBjbG9zaW5nIGEgZmlsZS4KKworLSBJc3N1ZSAjNjY5ODogSURMRSBub3cgb3BlbnMganVzdCBhbiBlZGl0b3Igd2luZG93IHdoZW4gY29uZmlndXJlZCB0byBkbyBzby4KKworLSBJc3N1ZSAjODkwMDogVXNpbmcga2V5Ym9hcmQgc2hvcnRjdXRzIGluIElETEUgdG8gb3BlbiBhIGZpbGUgbm8gbG9uZ2VyCisgIHJhaXNlcyBhbiBleGNlcHRpb24uCisKKy0gSXNzdWUgIzY2NDk6IEZpeGVkIG1pc3NpbmcgZXhpdCBzdGF0dXMgaW4gSURMRS4gUGF0Y2ggYnkgR3VpbGhlcm1lIFBvbG8uCisKKy0gSXNzdWUgIzE3MzkwOiBEaXNwbGF5IFB5dGhvbiB2ZXJzaW9uIG9uIElkbGUgdGl0bGUgYmFyLgorICBJbml0aWFsIHBhdGNoIGJ5IEVkbW9uZCBCdXJuZXR0LgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tCisKKy0gSXNzdWUgIzE1OTQwOiBTcGVjaWZ5IGVmZmVjdCBvZiBsb2NhbGUgb24gdGltZSBmdW5jdGlvbnMuCisKKy0gSXNzdWUgIzY2OTY6IGFkZCBkb2N1bWVudGF0aW9uIGZvciB0aGUgUHJvZmlsZSBvYmplY3RzLCBhbmQgaW1wcm92ZQorICBwcm9maWxlL2NQcm9maWxlIGRvY3MuICBQYXRjaCBieSBUb20gUGluY2tuZXkuCisKKworV2hhdCdzIE5ldyBpbiBQeXRob24gMi43LjQ/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMjAxMy0wNC0wNioKKworQnVpbGQKKy0tLS0tCisKKy0gSXNzdWUgIzE3NTUwOiBGaXggdGhlIC0tZW5hYmxlLXByb2ZpbGluZyBjb25maWd1cmUgc3dpdGNoLgorCitDb3JlIGFuZCBCdWlsdGlucworLS0tLS0tLS0tLS0tLS0tLS0KKworLSBJc3N1ZSAjMTU4MDEgKGFnYWluKTogV2l0aCBzdHJpbmcgJSBmb3JtYXR0aW5nLCByZWxheCB0aGUgdHlwZSBjaGVjayBmb3IgYQorICBtYXBwaW5nIHN1Y2ggdGhhdCBhbnkgdHlwZSB3aXRoIGEgX19nZXRpdGVtX18gY2FuIGJlIHVzZWQgb24gdGhlIHJpZ2h0IGhhbmQKKyAgc2lkZS4KKworSURMRQorLS0tLQorCistIElzc3VlICMxNzYyNTogSW4gSURMRSwgY2xvc2UgdGhlIHJlcGxhY2UgZGlhbG9nIGFmdGVyIGl0IGlzIHVzZWQuCisKK1Rlc3RzCistLS0tLQorCistIElzc3VlICMxNzgzNTogRml4IHRlc3RfaW8gd2hlbiB0aGUgZGVmYXVsdCBPUyBwaXBlIGJ1ZmZlciBzaXplIGlzIGxhcmdlcgorICB0aGFuIG9uZSBtaWxsaW9uIGJ5dGVzLgorCistIElzc3VlICMxNzUzMTogRml4IHRlc3RzIHRoYXQgdGhvdWdodCBncm91cCBhbmQgdXNlciBpZHMgd2VyZSBhbHdheXMgdGhlIGludAorICB0eXBlLiBBbHNvLCBhbHdheXMgYWxsb3cgLTEgYXMgYSB2YWxpZCBncm91cCBhbmQgdXNlciBpZC4KKworLSBJc3N1ZSAjMTc1MzM6IEZpeCB0ZXN0X3hwaWNrbGUgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBQeXRob24gMi41LgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tCisKKy0gSXNzdWUgMTc1Mzg6IERvY3VtZW50IFhNTCB2dWxuZXJhYmlsdGllcworCisKK1doYXQncyBOZXcgaW4gUHl0aG9uIDIuNy40IHJlbGVhc2UgY2FuZGlkYXRlIDEKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMjAxMy0wMy0yMyoKKworQ29yZSBhbmQgQnVpbHRpbnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gSXNzdWUgIzEwMjExOiBCdWZmZXIgb2JqZWN0cyBleHBvc2UgdGhlIG5ldyBidWZmZXIgaW50ZXJmYWNlIGludGVybmFsbHkKKworLSBJc3N1ZSAjMTY0NDU6IEZpeGVkIHBvdGVudGlhbCBzZWdtZW50YXRpb24gZmF1bHQgd2hlbiBkZWxldGluZyBhbiBleGNlcHRpb24KKyAgbWVzc2FnZS4KKworLSBJc3N1ZSAjMTcyNzU6IENvcnJlY3RlZCBjbGFzcyBuYW1lIGluIGluaXQgZXJyb3IgbWVzc2FnZXMgb2YgdGhlIEMgdmVyc2lvbiBvZgorICBCdWZmZXJlZFdyaXRlciBhbmQgQnVmZmVyZWRSYW5kb20uCisKKy0gSXNzdWUgIzc5NjM6IEZpeGVkIG1pc2xlYWRpbmcgZXJyb3IgbWVzc2FnZSB0aGF0IGlzc3VlZCB3aGVuIG9iamVjdCBpcworICBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMuCisKKy0gSXNzdWUgIzUzMDg6IFJhaXNlIFZhbHVlRXJyb3Igd2hlbiBtYXJzaGFsbGluZyB0b28gbGFyZ2Ugb2JqZWN0IChhIHNlcXVlbmNlCisgIHdpdGggc2l6ZSA+PSAyKiozMSksIGluc3RlYWQgb2YgcHJvZHVjaW5nIGlsbGVnYWwgbWFyc2hhbCBkYXRhLgorCistIElzc3VlICMxNzA0MzogVGhlIHVuaWNvZGUtaW50ZXJuYWwgZGVjb2RlciBubyBsb25nZXIgcmVhZCBwYXN0IHRoZSBlbmQgb2YKKyAgaW5wdXQgYnVmZmVyLgorCistIElzc3VlICMxNjk3OTogRml4IGVycm9yIGhhbmRsaW5nIGJ1Z3MgaW4gdGhlIHVuaWNvZGUtZXNjYXBlLWRlY29kZSBkZWNvZGVyLgorCistIElzc3VlICMxMDE1NjogSW4gdGhlIGludGVycHJldGVyJ3MgaW5pdGlhbGl6YXRpb24gcGhhc2UsIHVuaWNvZGUgZ2xvYmFscworICBhcmUgbm93IGluaXRpYWxpemVkIGR5bmFtaWNhbGx5IGFzIG5lZWRlZC4KKworLSBJc3N1ZSAjMTY5NzU6IEZpeCBlcnJvciBoYW5kbGluZyBidWcgaW4gdGhlIGVzY2FwZS1kZWNvZGUgZGVjb2Rlci4KKworLSBJc3N1ZSAjMTQ4NTA6IE5vdyBhIGNoYXJtYXAgZGVjb2RlciB0cmVhdHMgVStGRkZFIGFzICJ1bmRlZmluZWQgbWFwcGluZyIKKyAgaW4gYW55IG1hcHBpbmcsIG5vdCBvbmx5IGluIGEgVW5pY29kZSBzdHJpbmcuCisKKy0gSXNzdWUgIzExNDYxOiBGaXggdGhlIGluY3JlbWVudGFsIFVURi0xNiBkZWNvZGVyLiBPcmlnaW5hbCBwYXRjaCBieQorICBBbWF1cnkgRm9yZ2VvdCBkJ0FyYy4KKworLSBJc3N1ZSAjMTYzNjc6IEZpeCBGaWxlSU8ucmVhZGFsbCgpIG9uIFdpbmRvd3MgZm9yIGZpbGVzIGxhcmdlciB0aGFuIDIgR0IuCisKKy0gSXNzdWUgIzE1NTE2OiBGaXggYSBidWcgaW4gUHlTdHJpbmdfRnJvbUZvcm1hdCB3aGVyZSBpdCBmYWlsZWQgdG8gcHJvcGVybHkKKyAgaWdub3JlIGVycm9ycyBmcm9tIGEgX19pbnRfXygpIG1ldGhvZC4KKworLSBJc3N1ZSAjMTY4Mzk6IEZpeCBhIHNlZ2ZhdWx0IHdoZW4gY2FsbGluZyB1bmljb2RlKCkgb24gYSBjbGFzc2ljIGNsYXNzIGVhcmx5CisgIGluIGludGVycHJldGVyIGluaXRpYWxpemF0aW9uLgorCistIElzc3VlICMxNjc2MTogQ2FsbGluZyBgYGludCgpYGAgYW5kIGBgbG9uZygpYGAgd2l0aCAqYmFzZSogYXJndW1lbnQgb25seQorICBub3cgcmFpc2VzIFR5cGVFcnJvci4KKworLSBJc3N1ZSAjMTY3NTk6IFN1cHBvcnQgdGhlIGZ1bGwgRFdPUkQgKHVuc2lnbmVkIGxvbmcpIHJhbmdlIGluIFJlZzJQeQorICB3aGVuIHJldHJpZXZpbmcgYSBSRUdfRFdPUkQgdmFsdWUuIFRoaXMgY29ycmVjdHMgZnVuY3Rpb25zIGxpa2UKKyAgd2lucmVnLlF1ZXJ5VmFsdWVFeCB0aGF0IG1heSBoYXZlIGJlZW4gcmV0dXJuaW5nIHRydW5jYXRlZCB2YWx1ZXMuCisKKy0gSXNzdWUgIzE0NDIwOiBTdXBwb3J0IHRoZSBmdWxsIERXT1JEICh1bnNpZ25lZCBsb25nKSByYW5nZSBpbiBQeTJSZWcKKyAgd2hlbiBwYXNzZWQgYSBSRUdfRFdPUkQgdmFsdWUuIEZpeGVzIFZhbHVlRXJyb3IgaW4gd2lucmVnLlNldFZhbHVlRXggd2hlbgorICBnaXZlbiBhIGxvbmcuCisKKy0gSXNzdWUgIzEzODYzOiBXb3JrIGFyb3VuZCBidWdneSAnZnN0YXQnIGltcGxlbWVudGF0aW9uIG9uIFdpbmRvd3MgLyBOVEZTIHRoYXQKKyAgbGVhZCB0byBpbmNvcnJlY3QgdGltZXN0YW1wcyAob2ZmIGJ5IG9uZSBob3VyKSBiZWluZyBzdG9yZWQgaW4gLnB5YyBmaWxlcyBvbgorICBzb21lIHN5c3RlbXMuCisKKy0gSXNzdWUgIzE2NjAyOiBXaGVuIGEgd2Vha3JlZidzIHRhcmdldCB3YXMgcGFydCBvZiBhIGxvbmcgZGVhbGxvY2F0aW9uCisgIGNoYWluLCB0aGUgb2JqZWN0IGNvdWxkIHJlbWFpbiByZWFjaGFibGUgdGhyb3VnaCBpdHMgd2Vha3JlZiBldmVuIHRob3VnaAorICBpdHMgcmVmY291bnQgaGFkIGRyb3BwZWQgdG8gemVyby4KKworLSBJc3N1ZSAjOTAxMTogRml4IGhhY2t5IEFTVCBjb2RlIHRoYXQgbW9kaWZpZWQgdGhlIENTVCB3aGVuIGNvbXBpbGluZworICBhIG5lZ2F0ZWQgbnVtZXJpYyBsaXRlcmFsLgorCistIElzc3VlICMxNjMwNjogRml4IG11bHRpcGxlIGVycm9yIG1lc3NhZ2VzIHdoZW4gdW5rbm93biBjb21tYW5kIGxpbmUKKyAgcGFyYW1ldGVycyB3aGVyZSBwYXNzZWQgdG8gdGhlIGludGVycHJldGVyLiAgUGF0Y2ggYnkgSGlldSBOZ3V5ZW4uCisKKy0gSXNzdWUgIzE1Mzc5OiBGaXggcGFzc2luZyBvZiBub24tQk1QIGNoYXJhY3RlcnMgYXMgaW50ZWdlcnMgZm9yIHRoZSBjaGFybWFwCisgIGRlY29kZXIgKGFscmVhZHkgd29ya2luZyBhcyB1bmljb2RlIHN0cmluZ3MpLiAgUGF0Y2ggYnkgU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMTY0NTM6IEZpeCBlcXVhbGl0eSB0ZXN0aW5nIG9mIGRlYWQgd2Vha3JlZiBvYmplY3RzLgorCistIElzc3VlICM5NTM1OiBGaXggcGVuZGluZyBzaWduYWxzIHRoYXQgaGF2ZSBiZWVuIHJlY2VpdmVkIGJ1dCBub3QgeWV0CisgIGhhbmRsZWQgYnkgUHl0aG9uIHRvIG5vdCBwZXJzaXN0IGFmdGVyIG9zLmZvcmsoKSBpbiB0aGUgY2hpbGQgcHJvY2Vzcy4KKworLSBJc3N1ZSAjMTUwMDE6IGZpeCBzZWdmYXVsdCBvbiAiZGVsIHN5cy5tb2R1bGVzWydfX21haW5fXyddIi4gUGF0Y2ggYnkgVmljdG9yCisgIFN0aW5uZXIuCisKKy0gSXNzdWUgIzUwNTc6IHRoZSBwZWVwaG9sZXIgbm8gbG9uZ2VyIG9wdGltaXplcyBzdWJzY3JpcHRpb24gb24gdW5pY29kZQorICBsaXRlcmFscyAoZS5nLiB1J2ZvbydbMF0pIGluIG9yZGVyIHRvIHByb2R1Y2UgY29tcGF0aWJsZSBweWMgZmlsZXMgYmV0d2VlbgorICBuYXJyb3cgYW5kIHdpZGUgYnVpbGRzLgorCistIElzc3VlICM4NDAxOiBhc3NpZ25pbmcgYW4gaW50IHRvIGEgYnl0ZWFycmF5IHNsaWNlIChlLmcuIGJbMzo0XSA9IDUpIG5vdworICByYWlzZXMgYW4gZXJyb3IuCisKKy0gSXNzdWUgIzE0NzAwOiBGaXggYnVnZ3kgb3ZlcmZsb3cgY2hlY2tzIGZvciBsYXJnZSB3aWR0aCBhbmQgcHJlY2lzaW9uCisgIGluIHN0cmluZyBmb3JtYXR0aW5nIG9wZXJhdGlvbnMuCisKKy0gSXNzdWUgIzE2MzQ1OiBGaXggYW4gaW5maW5pdGUgbG9vcCB3aGVuIGBgZnJvbWtleXNgYCBvbiBhIGRpY3Qgc3ViY2xhc3MKKyAgcmVjZWl2ZWQgYSBub25lbXB0eSBkaWN0IGZyb20gdGhlIGNvbnN0cnVjdG9yLgorCistIElzc3VlICM2MDc0OiBFbnN1cmUgY2FjaGVkIGJ5dGVjb2RlIGZpbGVzIGNhbiBhbHdheXMgYmUgdXBkYXRlZCBieSB0aGUKKyAgdXNlciB0aGF0IGNyZWF0ZWQgdGhlbSwgZXZlbiB3aGVuIHRoZSBzb3VyY2UgZmlsZSBpcyByZWFkLW9ubHkuCisKKy0gSXNzdWUgIzE0NzgzOiBJbXByb3ZlIGludCgpIGFuZCBsb25nKCkgZG9jc3RyaW5ncyBhbmQgc3dpdGNoIGRvY3N0cmluZ3MgZm9yCisgIHVuaWNvZGUoKSwgc2xpY2UoKSwgcmFuZ2UoKSwgYW5kIHhyYW5nZSgpIHRvIHVzZSBtdWx0aS1saW5lIHNpZ25hdHVyZXMuCisKKy0gSXNzdWUgIzE2MDMwOiBGaXggb3ZlcmZsb3cgYnVnIGluIGNvbXB1dGluZyB0aGUgYHJlcHJgIG9mIGFuIHhyYW5nZSBvYmplY3QKKyAgd2l0aCBsYXJnZSBzdGFydCwgc3RlcCBvciBsZW5ndGguCisKKy0gSXNzdWUgIzE2MDI5OiBGaXggb3ZlcmZsb3cgYnVnIG9jY3VycmluZyB3aGVuIHBpY2tsaW5nIHhyYW5nZXMgd2l0aCBsYXJnZQorICBzdGFydCwgc3RlcCBvciBsZW5ndGguCisKKy0gSXNzdWUgIzE2MDM3OiBMaW1pdCBodHRwbGliJ3MgX3JlYWRfc3RhdHVzKCkgZnVuY3Rpb24gdG8gd29yayBhcm91bmQgYnJva2VuCisgIEhUVFAgc2VydmVycyBhbmQgcmVkdWNlIG1lbW9yeSB1c2FnZS4gSXQncyBhY3R1YWxseSBhIGJhY2twb3J0IG9mIGEgUHl0aG9uCisgIDMuMiBmaXguIFRoYW5rcyB0byBBZHJpZW4gS3VueXN6LgorCistIElzc3VlICMxNjU4ODogU2lsZW5jZSB1bnVzZWQtYnV0LXNldCB3YXJuaW5ncyBpbiBQeXRob24vdGhyZWFkX3B0aHJlYWQKKworLSBJc3N1ZSAjMTM5OTI6IFRoZSB0cmFzaGNhbiBtZWNoYW5pc20gaXMgbm93IHRocmVhZC1zYWZlLiAgVGhpcyBlbGltaW5hdGVzCisgIHNwb3JhZGljIGNyYXNoZXMgaW4gbXVsdGktdGhyZWFkIHByb2dyYW1zIHdoZW4gc2V2ZXJhbCBsb25nIGRlYWxsb2NhdG9yCisgIGNoYWlucyByYW4gY29uY3VycmVudGx5IGFuZCBpbnZvbHZlZCBzdWJjbGFzc2VzIG9mIGJ1aWx0LWluIGNvbnRhaW5lcgorICB0eXBlcy4KKworLSBJc3N1ZSAjMTU4MDE6IE1ha2Ugc3VyZSBtYXBwaW5ncyBwYXNzZWQgdG8gJyUnIGZvcm1hdHRpbmcgYXJlIGFjdHVhbGx5CisgIHN1YnNjcmlwdGFibGUuCisKKy0gSXNzdWUgIzE1NjA0OiBVcGRhdGUgdXNlcyBvZiBQeU9iamVjdF9Jc1RydWUoKSB0byBjaGVjayBmb3IgYW5kIGhhbmRsZQorICBlcnJvcnMgY29ycmVjdGx5LiAgUGF0Y2ggYnkgU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMTQ1Nzk6IEZpeCBlcnJvciBoYW5kbGluZyBidWcgaW4gdGhlIHV0Zi0xNiBkZWNvZGVyLiAgUGF0Y2ggYnkKKyAgU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMTUzNjg6IEFuIGlzc3VlIHRoYXQgY2F1c2VkIGJ5dGVjb2RlIGdlbmVyYXRpb24gdG8gYmUKKyAgbm9uLWRldGVybWluaXN0aWMgd2hlbiB1c2luZyByYW5kb21pemVkIGhhc2hpbmcgKC1SKSBoYXMgYmVlbiBmaXhlZC4KKworLSBJc3N1ZSAjMTU4OTc6IHppcGltcG9ydC5jIGRvZXNuJ3QgY2hlY2sgcmV0dXJuIHZhbHVlIG9mIGZzZWVrKCkuCisgIFBhdGNoIGJ5IEZlbGlwZSBDcnV6LgorCistIElzc3VlICMxNjM2OTogR2xvYmFsIFB5VHlwZU9iamVjdHMgbm90IGluaXRpYWxpemVkIHdpdGggUHlUeXBlX1JlYWR5KC4uLikuCisKKy0gSXNzdWUgIzE1MDMzOiBGaXggdGhlIGV4aXQgc3RhdHVzIGJ1ZyB3aGVuIG1vZHVsZXMgaW52b2tlZCB1c2luZyAtbSBzd2l0Y2gsCisgIHJldHVybiB0aGUgcHJvcGVyIGZhaWx1cmUgcmV0dXJuIHZhbHVlICgxKS4gUGF0Y2ggY29udHJpYnV0ZWQgYnkgSmVmZiBLbnVwcC4KKworLSBJc3N1ZSAjMTIyNjg6IEZpbGUgcmVhZGxpbmUsIHJlYWRsaW5lcyBhbmQgcmVhZCgpIG1ldGhvZHMgbm8gbG9uZ2VyIGxvc2UKKyAgZGF0YSB3aGVuIGFuIHVuZGVybHlpbmcgcmVhZCBzeXN0ZW0gY2FsbCBpcyBpbnRlcnJ1cHRlZC4gIElPRXJyb3IgaXMgbm8KKyAgbG9uZ2VyIHJhaXNlZCBkdWUgdG8gYSByZWFkIHN5c3RlbSBjYWxsIHJldHVybmluZyBFSU5UUiBmcm9tIHdpdGhpbiB0aGVzZQorICBtZXRob2RzLgorCistIElzc3VlICMxMzUxMjogQ3JlYXRlIH4vLnB5cGlyYyBzZWN1cmVseSAoQ1ZFLTIwMTEtNDk0NCkuICBJbml0aWFsIHBhdGNoIGJ5CisgIFBoaWxpcCBKZW52ZXksIHRlc3RlZCBieSBNYWdlaWEgYW5kIERlYmlhbi4KKworLSBJc3N1ZSAjNzcxOTogTWFrZSBkaXN0dXRpbHMgaWdub3JlIGBgLm5mcypgYCBmaWxlcyBpbnN0ZWFkIG9mIGNob2tpbmcgbGF0ZXIKKyAgb24uICBJbml0aWFsIHBhdGNoIGJ5IFNpbGVudEdob3N0IGFuZCBKZWZmIFJhbW5hbmkuCisKKy0gSXNzdWUgIzEwMDUzOiBEb24ndCBjbG9zZSBGRHMgd2hlbiBGaWxlSU8uX19pbml0X18gZmFpbHMuIExvb3NlbHkgYmFzZWQgb24KKyAgdGhlIHdvcmsgYnkgSGlyb2thenUgWWFtYW1vdG8uCisKKy0gSXNzdWUgIzE0Nzc1OiBGaXggYSBwb3RlbnRpYWwgcXVhZHJhdGljIGRpY3QgYnVpbGQtdXAgZHVlIHRvIHRoZSBnYXJiYWdlCisgIGNvbGxlY3RvciByZXBlYXRlZGx5IHRyeWluZyB0byB1bnRyYWNrIGRpY3RzLgorCistIElzc3VlICMxNDQ5NDogRml4IF9fZnV0dXJlX18ucHkgYW5kIGl0cyBkb2N1bWVudGF0aW9uIHRvIG5vdGUgdGhhdAorICBhYnNvbHV0ZSBpbXBvcnRzIGFyZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBpbiAzLjAgaW5zdGVhZCBvZiAyLjcuCisgIFBhdGNoIGJ5IFN2ZW4gTWFybmFjaC4KKworLSBJc3N1ZSAjMTQ3NjE6IEZpeCBwb3RlbnRpYWwgbGVhayBvbiBhbiBlcnJvciBjYXNlIGluIHRoZSBpbXBvcnQgbWFjaGluZXJ5LgorCistIElzc3VlICMxNDY5OTogRml4IGNhbGxpbmcgdGhlIGNsYXNzbWV0aG9kIGRlc2NyaXB0b3IgZGlyZWN0bHkuCisKKy0gSXNzdWUgIzExNjAzIChhZ2Fpbik6IFNldHRpbmcgX19yZXByX18gdG8gX19zdHJfXyBub3cgcmFpc2VzIGEgUnVudGltZUVycm9yCisgIHdoZW4gcmVwcigpIG9yIHN0cigpIGlzIGNhbGxlZCBvbiBzdWNoIGFuIG9iamVjdC4KKworLSBJc3N1ZSAjMTQ2NTg6IEZpeCBiaW5kaW5nIGEgc3BlY2lhbCBtZXRob2QgdG8gYSBidWlsdGluIGltcGxlbWVudGF0aW9uIG9mIGEKKyAgc3BlY2lhbCBtZXRob2Qgd2l0aCBhIGRpZmZlcmVudCBuYW1lLgorCistIElzc3VlICMxNDYxMjogRml4IGp1bXBpbmcgYXJvdW5kIHdpdGggYmxvY2tzIGJ5IHNldHRpbmcgZl9saW5lbm8uCisKKy0gSXNzdWUgIzEzODg5OiBDaGVjayBhbmQgKGlmIG5lY2Vzc2FyeSkgc2V0IEZQVSBjb250cm9sIHdvcmQgYmVmb3JlIGNhbGxpbmcKKyAgYW55IG9mIHRoZSBkdG9hLmMgc3RyaW5nIDwtPiBmbG9hdCBjb252ZXJzaW9uIGZ1bmN0aW9ucywgb24gTVNWQyBidWlsZHMgb2YKKyAgUHl0aG9uLiAgVGhpcyBmaXhlcyBpc3N1ZXMgd2hlbiBlbWJlZGRpbmcgUHl0aG9uIGluIGEgRGVscGhpIGFwcC4KKworLSBJc3N1ZSAjMTQ1MDU6IEZpeCBmaWxlIGRlc2NyaXB0b3IgbGVhayB3aGVuIGRlYWxsb2NhdGluZyBmaWxlIG9iamVjdHMKKyAgY3JlYXRlZCB3aXRoIFB5RmlsZV9Gcm9tU3RyaW5nKCkuCisKKy0gSXNzdWUgIzE0NDc0OiBTYXZlIGFuZCByZXN0b3JlIGV4Y2VwdGlvbiBzdGF0ZSBpbiB0aHJlYWQuc3RhcnRfbmV3X3RocmVhZCgpCisgIHdoaWxlIHdyaXRpbmcgZXJyb3IgbWVzc2FnZSBpZiB0aGUgdGhyZWFkIGxlYXZlcyBhIHVuaGFuZGxlZCBleGNlcHRpb24uCisKKy0gSXNzdWUgIzEzMDE5OiBGaXggcG90ZW50aWFsIHJlZmVyZW5jZSBsZWFrcyBpbiBieXRlYXJyYXkuZXh0ZW5kKCkuICBQYXRjaAorICBieSBTdW1hbiBTYWhhLgorCistIElzc3VlICMxNDM3ODogRml4IGNvbXBpbGluZyBhc3QuSW1wb3J0RnJvbSBub2RlcyB3aXRoIGEgIl9fZnV0dXJlX18iIHN0cmluZyBhcworICB0aGUgbW9kdWxlIG5hbWUgdGhhdCB3YXMgbm90IGludGVybmVkLgorCistIElzc3VlICMxNDMzMTogVXNlIHNpZ25pZmljYW50bHkgbGVzcyBzdGFjayBzcGFjZSB3aGVuIGltcG9ydGluZyBtb2R1bGVzIGJ5CisgIGFsbG9jYXRpbmcgcGF0aCBidWZmZXJzIG9uIHRoZSBoZWFwIGluc3RlYWQgb2YgdGhlIHN0YWNrLgorCistIElzc3VlICMxNDMzNDogUHJldmVudCBpbiBhIHNlZ2ZhdWx0IGluIHR5cGUuX19nZXRhdHRyaWJ1dGVfXyB3aGVuIGl0IHdhcyBub3QKKyAgcGFzc2VkIHN0cmluZ3MuIEFsc28gZml4IHNlZ2ZhdWx0cyBpbiB0aGUgX19nZXRhdHRyaWJ1dGVfXyBhbmQgX19zZXRhdHRyX18KKyAgbWV0aG9kcyBvZiBvbGQtc3R5bGUgY2xhc3Nlcy4KKworLSBJc3N1ZSAjMTQxNjE6IGZpeCB0aGUgX19yZXByX18gb2YgZmlsZSBvYmplY3RzIHRvIGVzY2FwZSB0aGUgZmlsZSBuYW1lLgorCistIElzc3VlICMxNDY5NjI5OiBBbGxvdyBjeWNsZXMgdGhyb3VnaCBhbiBvYmplY3QncyBfX2RpY3RfXyBzbG90IHRvIGJlCisgIGNvbGxlY3RlZC4gKEZvciBleGFtcGxlIGlmIGBgeC5fX2RpY3RfXyBpcyB4YGApLgorCistIElzc3VlICMxMzUyMTogZGljdC5zZXRkZWZhdWx0KCkgbm93IGRvZXMgb25seSBvbmUgbG9va3VwIGZvciB0aGUgZ2l2ZW4ga2V5LAorICBtYWtpbmcgaXQgImF0b21pYyIgZm9yIG1hbnkgcHVycG9zZXMuICBQYXRjaCBieSBGaWxpcCBHcnVzemN6ecWEc2tpLgorCistIElzc3VlICMxNjAyMTMzOiBvbiBNYWMgT1MgWCBhIHNoYXJlZCBsaWJyYXJ5IGJ1aWxkIChgYC0tZW5hYmxlLXNoYXJlZGBgKQorICBub3cgZmlsbHMgdGhlIGBgb3MuZW52aXJvbmBgIHZhcmlhYmxlIGNvcnJlY3RseS4KKworLSBJc3N1ZSAjMTA1Mzg6IFdoZW4gdXNpbmcgdGhlICJzKiIgY29kZSB3aXRoIFB5QXJnX1BhcnNlVHVwbGUoKSB0byBmaWxsIGEKKyAgUHlfYnVmZmVyIHN0cnVjdHVyZSB3aXRoIGRhdGEgZnJvbSBhbiBvYmplY3Qgc3VwcG9ydGluZyBvbmx5IHRoZSBvbGQKKyAgUHlCdWZmZXIgaW50ZXJmYWNlLCBhIHJlZmVyZW5jZSB0byB0aGUgc291cmNlIG9iamVjdHMgaXMgbm93IHByb3Blcmx5IGFkZGVkCisgIHRvIHRoZSBQeV9idWZmZXIub2JqIG1lbWJlci4KKworTGlicmFyeQorLS0tLS0tLQorCistIElzc3VlICMxMjcxODogRml4IGludGVyYWN0aW9uIHdpdGggd2lucGRiIG92ZXJyaWRpbmcgX19pbXBvcnRfXyBieSBzZXR0aW5nCisgIGltcG9ydGVyIGF0dHJpYnV0ZSBvbiBCYXNlQ29uZmlndXJhdG9yIGluc3RhbmNlLgorCistIElzc3VlICMxNzUyMTogQ29ycmVjdGVkIG5vbi1lbmFibGluZyBvZiBsb2dnZXIgZm9sbG93aW5nIHR3byBjYWxscyB0bworICBmaWxlQ29uZmlnKCkuCisKKy0gSXNzdWUgIzE3NTA4OiBDb3JyZWN0ZWQgTWVtb3J5SGFuZGxlciBjb25maWd1cmF0aW9uIGluIGRpY3RDb25maWcoKSB3aGVyZQorICB0aGUgdGFyZ2V0IGhhbmRsZXIgd2Fzbid0IGNvbmZpZ3VyZWQgZmlyc3QuCisKKy0gSXNzdWUgIzEwMjEyOiBjU3RyaW5nSU8gYW5kIHN0cnVjdC51bnBhY2sgc3VwcG9ydCBuZXcgYnVmZmVyIG9iamVjdHMuCisKKy0gSXNzdWUgIzEyMDk4OiBtdWx0aXByb2Nlc3Npbmcgb24gV2luZG93cyBub3cgc3RhcnRzIGNoaWxkIHByb2Nlc3NlcworICB1c2luZyB0aGUgc2FtZSBzeXMuZmxhZ3MgYXMgdGhlIGN1cnJlbnQgcHJvY2Vzcy4gIEluaXRpYWwgcGF0Y2ggYnkKKyAgU2VyZ2V5IE1lemVudHNldi4KKworLSBJc3N1ZSAjODg2MjogRml4ZWQgY3Vyc2VzIGNsZWFudXAgd2hlbiBnZXRrZXkgaXMgaW50ZXJycHV0ZWQgYnkgYSBzaWduYWwuCisKKy0gSXNzdWUgIzkwOTA6IFdoZW4gYSBzb2NrZXQgd2l0aCBhIHRpbWVvdXQgZmFpbHMgd2l0aCBFV09VTERCTE9DSyBvciBFQUdBSU4sCisgIHJldHJ5IHRoZSBzZWxlY3QoKSBsb29wIGluc3RlYWQgb2YgYmFpbGluZyBvdXQuICBUaGlzIGlzIGJlY2F1c2Ugc2VsZWN0KCkKKyAgY2FuIGluY29ycmVjdGx5IHJlcG9ydCBhIHNvY2tldCBhcyByZWFkeSBmb3IgcmVhZGluZyAoZm9yIGV4YW1wbGUsIGlmIGl0CisgIHJlY2VpdmVkIHNvbWUgZGF0YSB3aXRoIGFuIGludmFsaWQgY2hlY2tzdW0pLgorCistIElzc3VlICMxMjg1MDg2OiBHZXQgcmlkIG9mIHRoZSByZWZjb3VudGluZyBoYWNrIGFuZCBzcGVlZCB1cCB1cmxsaWIudW5xdW90ZSgpLgorCistIElzc3VlICMxNzM2ODogRml4IGFuIG9mZi1ieS1vbmUgZXJyb3IgaW4gdGhlIFB5dGhvbiBKU09OIGRlY29kZXIgdGhhdCBjYXVzZWQKKyAgYSBmYWlsdXJlIHdoaWxlIGRlY29kaW5nIGVtcHR5IG9iamVjdCBsaXRlcmFscyB3aGVuIG9iamVjdF9wYWlyc19ob29rIHdhcworICBzcGVjaWZpZWQuCisKKy0gSXNzdWUgIzE3Mjc4OiBGaXggYSBjcmFzaCBpbiBoZWFwcS5oZWFwcHVzaCgpIGFuZCBoZWFwcS5oZWFwcG9wKCkgd2hlbgorICB0aGUgbGlzdCBpcyBiZWluZyByZXNpemVkIGNvbmN1cnJlbnRseS4KKworLSBJc3N1ZSAjMTcwMTg6IE1ha2UgUHJvY2Vzcy5qb2luKCkgcmV0cnkgaWYgb3Mud2FpdHBpZCgpIGZhaWxzIHdpdGggRUlOVFIuCisKKy0gSXNzdWUgIzE0NzIwOiBzcWxpdGUzOiBDb252ZXJ0IGRhdGV0aW1lIG1pY3Jvc2Vjb25kcyBjb3JyZWN0bHkuCisgIFBhdGNoIGJ5IExvd2UgVGhpZGVybWFuLgorCistIElzc3VlICMxNzIyNTogSlNPTiBkZWNvZGVyIG5vdyBjb3VudHMgY29sdW1ucyBpbiB0aGUgZmlyc3QgbGluZSBzdGFydGluZworICB3aXRoIDEsIGFzIGluIG90aGVyIGxpbmVzLgorCistIElzc3VlICM3ODQyOiBiYWNrcG9ydGVkIGZpeCBmb3IgcHlfY29tcGlsZS5jb21waWxlKCkgc3ludGF4IGVycm9yIGhhbmRsaW5nLgorCistIElzc3VlICMxMzE1MzogVGtpbnRlciBmdW5jdGlvbnMgbm93IHJhaXNlIFRjbEVycm9yIGluc3RlYWQgb2YgVmFsdWVFcnJvciB3aGVuCisgIGEgdW5pY29kZSBhcmd1bWVudCBjb250YWlucyBub24tQk1QIGNoYXJhY3Rlci4KKworLSBJc3N1ZSAjOTY2OTogUHJvdGVjdCByZSBhZ2FpbnN0IGluZmluaXRlIGxvb3BzIG9uIHplcm8td2lkdGggbWF0Y2hpbmcgaW4KKyAgbm9uLWdyZWVkeSByZXBlYXQuICBQYXRjaCBieSBNYXR0aGV3IEJhcm5ldHQuCisKKy0gSXNzdWUgIzEzMTY5OiBUaGUgbWF4aW1hbCByZXBldGl0aW9uIG51bWJlciBpbiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBoYXMgYmVlbgorICBpbmNyZWFzZWQgZnJvbSA2NTUzNCB0byAyMTQ3NDgzNjQ3IChvbiAzMi1iaXQgcGxhdGZvcm0pIG9yIDQyOTQ5NjcyOTQgKG9uCisgIDY0LWJpdCkuCisKKy0gSXNzdWUgIzE2NzQzOiBGaXggbW1hcCBvdmVyZmxvdyBjaGVjayBvbiAzMiBiaXQgV2luZG93cy4KKworLSBJc3N1ZSAjMTEzMTE6IFN0cmluZ0lPLnJlYWRsaW5lKDApIG5vdyByZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBhcyBhbGwgb3RoZXIKKyAgZmlsZS1saWtlIG9iamVjdHMuCisKKy0gSXNzdWUgIzE2ODAwOiB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkgbm8gbG9uZ2VyIGxlZnQgdGVtcG9yYXJ5IGZpbGVzIHdoZW4KKyAgdGhlIGRpc2sgaXMgZnVsbC4gIE9yaWdpbmFsIHBhdGNoIGJ5IEFtaXIgU3pla2VseS4KKworLSBJc3N1ZSAjMTM1NTU6IGNQaWNrbGUgbm93IHN1cHBvcnRzIGZpbGVzIGxhcmdlciB0aGFuIDIgR2lCLgorCistIElzc3VlICMxNzA1MjogdW5pdHRlc3QgZGlzY292ZXJ5IHNob3VsZCB1c2Ugc2VsZi50ZXN0TG9hZGVyLgorCistIElzc3VlICM0NTkxOiBVaWQgYW5kIGdpZCB2YWx1ZXMgbGFyZ2VyIHRoYW4gMioqMzEgYXJlIHN1cHBvcnRlZCBub3cuCisKKy0gSXNzdWUgIzE3MTQxOiByYW5kb20udm9ubWlzZXN2YXJpYXRlKCkgbm8gbW9yZSBoYW5ncyBmb3IgbGFyZ2Uga2FwcGFzLgorCistIElzc3VlICMxNzE0OTogRml4IHJhbmRvbS52b25taXNlc3ZhcmlhdGUgdG8gYWx3YXlzIHJldHVybiByZXN1bHRzIGluCisgIHRoZSByYW5nZSBbMCwgMiptYXRoLnBpXS4KKworLSBJc3N1ZSAjMTQ3MDU0ODogWE1MR2VuZXJhdG9yIG5vdyB3b3JrcyB3aXRoIFVURi0xNiBhbmQgVVRGLTMyIGVuY29kaW5ncy4KKworLSBJc3N1ZSAjNjk3NTogb3MucGF0aC5yZWFscGF0aCgpIG5vdyBjb3JyZWN0bHkgcmVzb2x2ZXMgbXVsdGlwbGUgbmVzdGVkCisgIHN5bWxpbmtzIG9uIFBPU0lYIHBsYXRmb3Jtcy4KKworLSBJc3N1ZSAjNzM1ODogY1N0cmluZ0lPLlN0cmluZ0lPIG5vdyBzdXBwb3J0cyB3cml0aW5nIHRvIGFuZCByZWFkaW5nIGZyb20KKyAgYSBzdHJlYW0gbGFyZ2VyIHRoYW4gMiBHaUIgb24gNjQtYml0IHN5c3RlbXMuCisKKy0gSXNzdWUgIzEwMzU1OiBJbiBTcG9vbGVkVGVtcG9yYXJ5RmlsZSBjbGFzcyBtb2RlIGFuZCBuYW1lIHByb3BlcnRpZXMgYW5kCisgIHhyZWFkbGluZXMgbWV0aG9kIG5vdyB3b3JrIGZvciB1bnJvbGxlZCBmaWxlcy4gIGVuY29kaW5nIGFuZCBuZXdsaW5lcworICBwcm9wZXJ0aWVzIG5vdyByZW1vdmVkIGFzIHRoZXkgaGF2ZSBubyBzZW5zZSBhbmQgYWx3YXlzIHByb2R1Y2VkCisgIEF0dHJpYnV0ZUVycm9yLgorCistIElzc3VlICMxNjY4NjogRml4ZWQgYSBsb3Qgb2YgYnVncyBpbiBhdWRpb29wIG1vZHVsZS4gIEZpeGVkIGNyYXNoZXMgaW4KKyAgYXZncHAoKSwgbWF4cHAoKSBhbmQgcmF0ZWN2KCkuICBGaXhlZCBhbiBpbnRlZ2VyIG92ZXJmbG93IGluIGFkZCgpLCBiaWFzKCksCisgIGFuZCByYXRlY3YoKS4gIHJldmVyc2UoKSwgbGluMmxpbigpIGFuZCByYXRlY3YoKSBubyBtb3JlIGxvc2UgcHJlY2lzaW9uIGZvcgorICAzMi1iaXQgc2FtcGxlcy4gIG1heCgpIGFuZCBybXMoKSBubyBtb3JlIHJldHVybnMgYSBuZWdhdGl2ZSByZXN1bHQgYW5kCisgIHZhcmlvdXMgb3RoZXIgZnVuY3Rpb25zIG5vdyB3b3JrIGNvcnJlY3RseSB3aXRoIDMyLWJpdCBzYW1wbGUgLTB4ODAwMDAwMDAuCisKKy0gSXNzdWUgIzE3MDczOiBGaXggc29tZSBpbnRlZ2VyIG92ZXJmbG93cyBpbiBzcWxpdGUzIG1vZHVsZS4KKworLSBJc3N1ZSAjNjA4MzogRml4IG11bHRpcGxlIHNlZ21lbnRhdGlvbiBmYXVsdHMgb2NjdXJlZCB3aGVuIFB5QXJnX1BhcnNlVHVwbGUKKyAgcGFyc2VzIG5lc3RlZCBtdXRhdGluZyBzZXF1ZW5jZS4KKworLSBJc3N1ZSAjNTI4OTogRml4IGN0eXBlcy51dGlsLmZpbmRfbGlicmFyeSBvbiBTb2xhcmlzLgorCistIElzc3VlICMxNzEwNjogRml4IGEgc2VnbWVudGF0aW9uIGZhdWx0IGluIGlvLlRleHRJT1dyYXBwZXIgd2hlbiBhbiB1bmRlcmx5aW5nCisgIHN0cmVhbSBvciBhIGRlY29kZXIgcHJvZHVjZXMgZGF0YSBvZiBhbiB1bmV4cGVjdGVkIHR5cGUgKGkuZS4gd2hlbgorICBpby5UZXh0SU9XcmFwcGVyIGluaXRpYWxpemVkIHdpdGggdGV4dCBzdHJlYW0gb3IgdXNlIGJ5dGVzLXRvLWJ5dGVzIGNvZGVjKS4KKworLSBJc3N1ZSAjMTM5OTQ6IEFkZCBjb21wYXRpYmlsaXR5IGFsaWFzIGluIGRpc3R1dGlscy5jY29tcGlsZXIgZm9yCisgIGRpc3R1dGlscy5zeXNjb25maWcuY3VzdG9taXplX2NvbXBpbGVyLgorCistIElzc3VlICMxNTYzMzogaHR0cGxpYi5IVFRQUmVzcG9uc2UgaXMgbm93IG1hcmsgY2xvc2VkIHdoZW4gdGhlIHNlcnZlcgorICBzZW5kcyBsZXNzIHRoYW4gdGhlIGFkdmVydGlzZWQgQ29udGVudC1MZW5ndGguCisKKy0gSXNzdWUgIzE1ODgxOiBGaXhlZCBhdGV4aXQgaG9vayBpbiBtdWx0aXByb2Nlc3NpbmcuCisKKy0gSXNzdWUgIzE0MzQwOiBVcGdyYWRlIHRoZSBlbWJlZGRlZCBleHBhdCBsaWJyYXJ5IHRvIHZlcnNpb24gMi4xLjAuCisKKy0gSXNzdWUgIzExMTU5OiBTQVggcGFyc2VyIG5vdyBzdXBwb3J0cyB1bmljb2RlIGZpbGUgbmFtZXMuCisKKy0gSXNzdWUgIzY5NzI6IFRoZSB6aXBmaWxlIG1vZHVsZSBubyBsb25nZXIgb3ZlcndyaXRlcyBmaWxlcyBvdXRzaWRlIG9mCisgIGl0cyBkZXN0aW5hdGlvbiBwYXRoIHdoZW4gZXh0cmFjdGluZyBtYWxpY2lvdXMgemlwIGZpbGVzLgorCistIElzc3VlICMxNzA0OTogTG9jYWxpemVkIGNhbGVuZGFyIG1ldGhvZHMgbm93IHJldHVybiB1bmljb2RlIGlmIGEgbG9jYWxlCisgIGluY2x1ZGVzIGFuIGVuY29kaW5nIGFuZCB0aGUgcmVzdWx0IHN0cmluZyBjb250YWlucyBtb250aCBvciB3ZWVrZGF5ICh3YXMKKyAgcmVncmVzc2lvbiBmcm9tIFB5dGhvbiAyLjYpLgorCistIElzc3VlICM0ODQ0OiBaaXBGaWxlIG5vdyByYWlzZXMgQmFkWmlwZmlsZSB3aGVuIG9wZW5zIGEgWklQIGZpbGUgd2l0aCBhbgorICBpbmNvbXBsZXRlICJFbmQgb2YgQ2VudHJhbCBEaXJlY3RvcnkiIHJlY29yZC4gIE9yaWdpbmFsIHBhdGNoIGJ5IEd1aWxoZXJtZQorICBQb2xvIGFuZCBBbGFuIE1jSW50eXJlLgorCistIElzc3VlICMxNTUwNTogYHVuaXR0ZXN0Lmluc3RhbGxIYW5kbGVyYCBubyBsb25nZXIgYXNzdW1lcyBTSUdJTlQgaGFuZGxlciBpcworICBzZXQgdG8gYSBjYWxsYWJsZSBvYmplY3QuCisKKy0gSXNzdWUgIzE3MDUxOiBGaXggYSBtZW1vcnkgbGVhayBpbiBvcy5wYXRoLmlzZGlyKCkgb24gV2luZG93cy4gUGF0Y2ggYnkKKyAgUm9iZXJ0IFhpYW8uCisKKy0gSXNzdWUgIzEzNDU0OiBGaXggYSBjcmFzaCB3aGVuIGRlbGV0aW5nIGFuIGl0ZXJhdG9yIGNyZWF0ZWQgYnkgaXRlcnRvb2xzLnRlZSgpCisgIGlmIGFsbCBvdGhlciBpdGVyYXRvcnMgd2VyZSB2ZXJ5IGFkdmFuY2VkIGJlZm9yZS4KKworLSBJc3N1ZSAjMTY5OTI6IE9uIFdpbmRvd3MgaW4gc2lnbmFsLnNldF93YWtldXBfZmQsIHZhbGlkYXRlIHRoZSBmaWxlCisgIGRlc2NyaXB0b3IgYXJndW1lbnQuCisKKy0gSXNzdWUgIzE1ODYxOiB0a2ludGVyIG5vdyBjb3JyZWN0bHkgd29ya3Mgd2l0aCBsaXN0cyBhbmQgdHVwbGVzIGNvbnRhaW5pbmcKKyAgc3RyaW5ncyB3aXRoIHdoaXRlc3BhY2VzLCBiYWNrc2xhc2hlcyBvciB1bmJhbGFuY2VkIGJyYWNlcy4KKworLSBJc3N1ZSAjMTA1Mjc6IFVzZSBwb2xsKCkgaW5zdGVhZCBvZiBzZWxlY3QoKSBmb3IgbXVsdGlwcm9jZXNzaW5nIHBpcGVzLgorCistIElzc3VlICM5NzIwOiB6aXBmaWxlIG5vdyB3cml0ZXMgY29ycmVjdCBsb2NhbCBoZWFkZXJzIGZvciBmaWxlcyBsYXJnZXIgdGhhbgorICA0IEdpQi4KKworLSBJc3N1ZSAjMTM4OTk6IFxBLCBcWiwgYW5kIFxCIG5vdyBjb3JyZWN0bHkgbWF0Y2ggdGhlIEEsIFosIGFuZCBCIGxpdGVyYWxzCisgIHdoZW4gdXNlZCBpbnNpZGUgY2hhcmFjdGVyIGNsYXNzZXMgKGUuZy4gJ1tcQV0nKS4gIFBhdGNoIGJ5IE1hdHRoZXcgQmFybmV0dC4KKworLSBJc3N1ZSAjMTYzOTg6IE9wdGltaXplIGRlcXVlLnJvdGF0ZSgpIHNvIHRoYXQgaXQgb25seSBtb3ZlcyBwb2ludGVycworICBhbmQgZG9lc24ndCB0b3VjaCB0aGUgdW5kZXJseWluZyBkYXRhIHdpdGggaW5jcmVmcyBhbmQgZGVjcmVmcy4KKworLSBJc3N1ZSAjMTUxMDk6IEZpeCByZWdyZXNzaW9uIGluIHNxbGl0ZTMncyBpdGVyZHVtcCBtZXRob2Qgd2hlcmUgaXQgd291bGQKKyAgZGllIHdpdGggYW4gZW5jb2RpbmcgZXJyb3IgaWYgdGhlIGRhdGFiYXNlIGNvbnRhaW5lZCBzdHJpbmcgdmFsdWVzCisgIGNvbnRhaW5pbmcgbm9uLUFTQ0lJLiAgKFJlZ3Jlc3Npb24gd2FzIGludHJvZHVjZWQgYnkgZml4IGZvciA5NzUwKS4KKworLSBJc3N1ZSAjMTU1NDU6IEZpeCByZWdyZXNzaW9uIGluIHNxbGl0ZTMncyBpdGVyZHVtcCBtZXRob2Qgd2hlcmUgaXQgd2FzCisgIGZhaWxpbmcgaWYgdGhlIGNvbm5lY3Rpb24gdXNlZCBhIHJvdyBmYWN0b3J5IChzdWNoIGFzIHNxbGl0ZTMuUm93KSB0aGF0CisgIHByb2R1Y2VkIHVuc29ydGFibGUgb2JqZWN0cy4gKFJlZ3Jlc3Npb24gd2FzIGludHJvZHVjZWQgYnkgZml4IGZvciA5NzUwKS4KKworLSBJc3N1ZSAjMTY4Mjg6IEZpeCBlcnJvciBpbmNvcnJlY3RseSByYWlzZWQgYnkgYnoyLmNvbXByZXNzKCcnKS4gUGF0Y2ggYnkKKyAgTWFydGluIFBhY2ttYW4uCisKKy0gSXNzdWUgIzk1ODY6IFJlZGVmaW5lIFNFTV9GQUlMRUQgb24gTWFjT1NYIHRvIGtlZXAgY29tcGlsZXIgaGFwcHkuCisKKy0gSXNzdWUgIzEwNTI3OiBtYWtlIG11bHRpcHJvY2Vzc2luZyB1c2UgcG9sbCgpIGluc3RlYWQgb2Ygc2VsZWN0KCkgaWYgYXZhaWxhYmxlLgorCistIElzc3VlICMxNjQ4NTogTm93IGZpbGUgZGVzY3JpcHRvcnMgYXJlIGNsb3NlZCBpZiBmaWxlIGhlYWRlciBwYXRjaGluZyBmYWlsZWQKKyAgb24gY2xvc2luZyBhbiBhaWZjIGZpbGUuCisKKy0gSXNzdWUgIzEyMDY1OiBjb25uZWN0X2V4KCkgb24gYW4gU1NMIHNvY2tldCBub3cgcmV0dXJucyB0aGUgb3JpZ2luYWwgZXJybm8KKyAgd2hlbiB0aGUgc29ja2V0J3MgdGltZW91dCBleHBpcmVzIChpdCB1c2VkIHRvIHJldHVybiBOb25lKS4KKworLSBJc3N1ZSAjMTY3MTM6IEZpeCB0aGUgcGFyc2luZyBvZiB0ZWwgdXJsIHdpdGggcGFyYW1zIHVzaW5nIHVybHBhcnNlIG1vZHVsZS4KKworLSBJc3N1ZSAjMTY0NDM6IEFkZCBkb2NzdHJpbmdzIHRvIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaCBvYmplY3RzLgorICBQYXRjaCBieSBBbnRvbiBLYXN5YW5vdi4KKworLSBJc3N1ZSAjODg1MzogQWxsb3cgcG9ydCB0byBiZSBvZiB0eXBlIGxvbmcgZm9yIHNvY2tldC5nZXRhZGRyaW5mbygpLgorCistIElzc3VlICMxNjU5NzogSW4gYnVmZmVyZWQgYW5kIHRleHQgSU8sIGNhbGwgY2xvc2UoKSBvbiB0aGUgdW5kZXJseWluZyBzdHJlYW0KKyAgaWYgaW52b2tpbmcgZmx1c2goKSBmYWlscy4KKworLSBJc3N1ZSAjMTU3MDE6IEZpeCBIVFRQRXJyb3IgaW5mbyBtZXRob2QgY2FsbCB0byByZXR1cm4gdGhlIGhlYWRlcnMgaW5mb3JtYXRpb24uCisKKy0gSXNzdWUgIzE2NjQ2OiBmdHBsaWIuRlRQLm1ha2Vwb3J0KCkgbWlnaHQgbG9zZSBzb2NrZXQgZXJyb3IgZGV0YWlscy4KKyAgKHBhdGNoIGJ5IFNlcmhpeSBTdG9yY2hha2EpCisKKy0gSXNzdWUgIzE2NjI2OiBGaXggaW5maW5pdGUgcmVjdXJzaW9uIGluIGdsb2IuZ2xvYigpIG9uIFdpbmRvd3Mgd2hlbiB0aGUKKyAgcGF0dGVybiBjb250YWlucyBhIHdpbGRjYXJkIGluIHRoZSBkcml2ZSBvciBVTkMgcGF0aC4gIFBhdGNoIGJ5IFNlcmhpeQorICBTdG9yY2hha2EuCisKKy0gSXNzdWUgIzE2Mjk4OiBJbiBIVFRQUmVzcG9uc2UucmVhZCgpLCBjbG9zZSB0aGUgc29ja2V0IHdoZW4gdGhlcmUgaXMgbm8KKyAgQ29udGVudC1MZW5ndGggYW5kIHRoZSBpbmNvbWluZyBzdHJlYW0gaXMgZmluaXNoZWQuICBQYXRjaCBieSBFcmFuCisgIFJ1bmRzdGVpbi4KKworLSBJc3N1ZSAjMTYyNDg6IERpc2FibGUgY29kZSBleGVjdXRpb24gZnJvbSB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5IGJ5CisgIHRraW50ZXIgd2hlbiB0aGUgLUUgZmxhZyBpcyBwYXNzZWQgdG8gUHl0aG9uLiAgUGF0Y2ggYnkgWmFjaGFyeSBXYXJlLgorCistIElzc3VlICMxNjYyODogRml4IGEgbWVtb3J5IGxlYWsgaW4gY3R5cGVzLnJlc2l6ZSgpLgorCistIElzc3VlICMxMzYxNDogRml4IHNldHVwLnB5IHJlZ2lzdGVyIGZhaWx1cmUgd2l0aCBpbnZhbGlkIHJzdCBpbiBkZXNjcmlwdGlvbi4KKyAgUGF0Y2ggYnkgSnVsaWVuIENvdXJ0ZWF1IGFuZCBQaWVycmUgUGF1bCBMZWZlYnZyZS4KKworLSBJc3N1ZSAjMTAxODI6IFRoZSByZSBtb2R1bGUgZG9lc24ndCB0cnVuY2F0ZSBpbmRpY2VzIHRvIDMyIGJpdHMgYW55bW9yZS4KKyAgUGF0Y2ggYnkgU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMTY1NzM6IEluIDJ0bzMsIHRyZWF0IGVudW1lcmF0ZSgpIGxpa2UgYSBjb25zdW1pbmcgY2FsbCwgc28gc3VwZXJmbHVvdXMKKyAgbGlzdCgpIGNhbGxzIGFyZW4ndCBhZGRlZCB0byBmaWx0ZXIoKSwgbWFwKCksIGFuZCB6aXAoKSB3aGljaCBhcmUgZGlyZWN0bHkKKyAgcGFzc2VkIGVudW1lcmF0ZSgpLgorCistIElzc3VlICMxMTYwOiBGaXggY29tcGlsaW5nIGxhcmdlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgb24gVUNTMiBidWlsZHMuCisgIFBhdGNoIGJ5IFNlcmhpeSBTdG9yY2hha2EuCisKKy0gSXNzdWUgIzE0MzEzOiB6aXBmaWxlIG5vdyByYWlzZXMgTm90SW1wbGVtZW50ZWRFcnJvciB3aGVuIHRoZSBjb21wcmVzc2lvbgorICB0eXBlIGlzIHVua25vd24uCisKKy0gSXNzdWUgIzE2NDA4OiBGaXggZmlsZSBkZXNjcmlwdG9ycyBub3QgYmVpbmcgY2xvc2VkIGluIGVycm9yIGNvbmRpdGlvbnMKKyAgaW4gdGhlIHppcGZpbGUgbW9kdWxlLiAgUGF0Y2ggYnkgU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMTYzMjc6IFRoZSBzdWJwcm9jZXNzIG1vZHVsZSBubyBsb25nZXIgbGVha3MgZmlsZSBkZXNjcmlwdG9ycworICB1c2VkIGZvciBzdGRpbi9zdGRvdXQvc3RkZXJyIHBpcGVzIHRvIHRoZSBjaGlsZCB3aGVuIGZvcmsoKSBmYWlscy4KKworLSBJc3N1ZSAjMTQzOTY6IEhhbmRsZSB0aGUgb2RkIHJhcmUgY2FzZSBvZiB3YWl0cGlkIHJldHVybmluZyAwIHdoZW4gbm90CisgIGV4cGVjdGVkIGluIHN1YnByb2Nlc3MuUG9wZW4ud2FpdCgpLgorCistIElzc3VlICMxNjQxMTogRml4IGEgYnVnIHdoZXJlIHpsaWIuZGVjb21wcmVzc29iaigpLmZsdXNoKCkgbWlnaHQgdHJ5IHRvIGFjY2VzcworICBwcmV2aW91c2x5LWZyZWVkIG1lbW9yeS4gUGF0Y2ggYnkgU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMTYzNTA6IHpsaWIuZGVjb21wcmVzc29iaigpLmRlY29tcHJlc3MoKSBub3cgYWNjdW11bGF0ZXMgZGF0YSBmcm9tCisgIHN1Y2Nlc3NpdmUgY2FsbHMgYWZ0ZXIgRU9GIGluIHVudXNlZF9kYXRhLCBpbnN0ZWFkIG9mIG9ubHkgc2F2aW5nIHRoZSBhcmd1bWVudAorICB0byB0aGUgbGFzdCBjYWxsLiBkZWNvbXByZXNzb2JqKCkuZmx1c2goKSBub3cgY29ycmVjdGx5IHNldHMgdW51c2VkX2RhdGEgYW5kCisgIHVuY29uc3VtZWRfdGFpbC4gQSBidWcgaW4gdGhlIGhhbmRsaW5nIG9mIE1lbW9yeUVycm9yIHdoZW4gc2V0dGluZyB0aGUKKyAgdW5jb25zdW1lZF90YWlsIGF0dHJpYnV0ZSBoYXMgYWxzbyBiZWVuIGZpeGVkLiBQYXRjaCBieSBTZXJoaXkgU3RvcmNoYWthLgorCistIElzc3VlICMxMjc1OTogc3JlX3BhcnNlIG5vdyByYWlzZXMgYSBwcm9wZXIgZXJyb3Igd2hlbiB0aGUgbmFtZSBvZiB0aGUgZ3JvdXAKKyAgaXMgbWlzc2luZy4gIEluaXRpYWwgcGF0Y2ggYnkgU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMTYxNTI6IGZpeCB0b2tlbml6ZSB0byBpZ25vcmUgd2hpdGVzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSBjb2RlIHdoZW4KKyAgbm8gbmV3bGluZSBpcyBmb3VuZC4gIFBhdGNoIGJ5IE5lZCBCYXRjaGVsZGVyLgorCistIElzc3VlICMxNjIzMDogRml4IGEgY3Jhc2ggaW4gc2VsZWN0LnNlbGVjdCgpIHdoZW4gb25lIHRoZSBsaXN0cyBjaGFuZ2VzCisgIHNpemUgd2hpbGUgaXRlcmF0ZWQgb24uICBQYXRjaCBieSBTZXJoaXkgU3RvcmNoYWthLgorCistIElzc3VlICMxNjIyODogRml4IGEgY3Jhc2ggaW4gdGhlIGpzb24gbW9kdWxlIHdoZXJlIGEgbGlzdCBjaGFuZ2VzIHNpemUKKyAgd2hpbGUgaXQgaXMgYmVpbmcgZW5jb2RlZC4gIFBhdGNoIGJ5IFNlcmhpeSBTdG9yY2hha2EuCisKKy0gSXNzdWUgIzE0ODk3OiBFbmhhbmNlIGVycm9yIG1lc3NhZ2VzIG9mIHN0cnVjdC5wYWNrIGFuZAorICBzdHJ1Y3QucGFja19pbnRvLiBQYXRjaCBieSBNYXR0aSBNw6RraS4KKworLSBJc3N1ZSAjMTI4OTA6IGNnaXRiIG5vIGxvbmdlciBwcmludHMgc3B1cmlvdXMgPHA+IHRhZ3MgaW4gdGV4dAorICBtb2RlIHdoZW4gdGhlIGxvZ2RpciBvcHRpb24gaXMgc3BlY2lmaWVkLgorCistIElzc3VlICMxNDM5ODogRml4IHNpemUgdHJ1bmNhdGlvbiBhbmQgb3ZlcmZsb3cgYnVncyBpbiB0aGUgYnoyIG1vZHVsZS4KKworLSBJc3N1ZSAjNTE0ODogSWdub3JlICdVJyBpbiBtb2RlIGdpdmVuIHRvIGd6aXAub3BlbigpIGFuZCBnemlwLkd6aXBGaWxlKCkuCisKKy0gSXNzdWUgIzE2MjIwOiB3c2dpcmVmIG5vdyBhbHdheXMgY2FsbHMgY2xvc2UoKSBvbiBhbiBpdGVyYWJsZSByZXNwb25zZS4KKyAgUGF0Y2ggYnkgQnJlbnQgVHViYnMuCisKKy0gSXNzdWUgIzE2NDYxOiBXYXZlIGxpYnJhcnkgc2hvdWxkIGJlIGFibGUgdG8gZGVhbCB3aXRoIDRHQiB3YXYgZmlsZXMsCisgIGFuZCBzYW1wbGUgcmF0ZSBvZiA0NDEwMCBIei4KKworLSBJc3N1ZSAjMTYxNzY6IFByb3Blcmx5IGlkZW50aWZ5IFdpbmRvd3MgOCB2aWEgcGxhdGZvcm0ucGxhdGZvcm0oKQorCistIElzc3VlICMxNTc1Njogc3VicHJvY2Vzcy5wb2xsKCkgbm93IHByb3Blcmx5IGhhbmRsZXMgZXJybm8uRUNISUxEIHRvCisgIHJldHVybiBhIHJldHVybmNvZGUgb2YgMCB3aGVuIHRoZSBjaGlsZCBoYXMgYWxyZWFkeSBleGl0ZWQgb3IgY2Fubm90CisgIGJlIHdhaXRlZCBvbi4KKworLSBJc3N1ZSAjMTIzNzY6IFBhc3Mgb24gcGFyYW1ldGVycyBpbiBUZXh0VGVzdFJlc3VsdC5fX2luaXRfXyBzdXBlciBjYWxsCisKKy0gSXNzdWUgIzE1MjIyOiBJbnNlcnQgYmxhbmsgbGluZSBhZnRlciBlYWNoIG1lc3NhZ2UgaW4gbWJveCBtYWlsYm94ZXMKKworLSBJc3N1ZSAjMTYwMTM6IEZpeCBDU1YgUmVhZGVyIHBhcnNpbmcgaXNzdWUgd2l0aCBlbmRpbmcgcXVvdGUgY2hhcmFjdGVycy4KKyAgUGF0Y2ggYnkgU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMTU0MjE6IGZpeCBhbiBPdmVyZmxvd0Vycm9yIGluIENhbGVuZGFyLml0ZXJtb250aGRhdGVzKCkgYWZ0ZXIKKyAgZGF0ZXRpbWUuTUFYWUVBUi4gIFBhdGNoIGJ5IEPDqWRyaWMgS3JpZXIuCisKKy0gSXNzdWUgIzE1OTcwOiB4bWwuZXRyZWUuRWxlbWVudFRyZWUgbm93IHNlcmlhbGl6ZXMgY29ycmVjdGx5IHRoZSBlbXB0eSBIVE1MCisgIGVsZW1lbnRzICdtZXRhJyBhbmQgJ3BhcmFtJy4KKworLSBJc3N1ZSAjMTU2NzY6IE5vdyAibW1hcCIgY2hlY2sgZm9yIGVtcHR5IGZpbGVzIGJlZm9yZSBkb2luZyB0aGUKKyAgb2Zmc2V0IGNoZWNrLiAgUGF0Y2ggYnkgU3RldmVuIFdpbGxpcy4KKworLSBJc3N1ZSAjMTUzNDA6IEZpeCBpbXBvcnRpbmcgdGhlIHJhbmRvbSBtb2R1bGUgd2hlbiAvZGV2L3VyYW5kb20gY2Fubm90CisgIGJlIG9wZW5lZC4gIFRoaXMgd2FzIGEgcmVncmVzc2lvbiBjYXVzZWQgYnkgdGhlIGhhc2ggcmFuZG9taXphdGlvbiBwYXRjaC4KKworLSBJc3N1ZSAjMTU4NDE6IFRoZSByZWFkYWJsZSgpLCB3cml0YWJsZSgpIGFuZCBzZWVrYWJsZSgpIG1ldGhvZHMgb2YKKyAgaW8uQnl0ZXNJTyBhbmQgaW8uU3RyaW5nSU8gb2JqZWN0cyBub3cgcmFpc2UgVmFsdWVFcnJvciB3aGVuIHRoZSBvYmplY3QgaGFzCisgIGJlZW4gY2xvc2VkLiAgUGF0Y2ggYnkgQWxlc3NhbmRybyBNb3VyYS4KKworLSBJc3N1ZSAjMTYxMTI6IHBsYXRmb3JtLmFyY2hpdGVjdHVyZSBkb2VzIG5vdCBjb3JyZWN0bHkgZXNjYXBlIGFyZ3VtZW50IHRvCisgIC91c3IvYmluL2ZpbGUuICBQYXRjaCBieSBEYXZpZCBCZW5qYW1pbi4KKworLSBJc3N1ZSAjMTI3NzYsIzExODM5OiBjYWxsIGFyZ3BhcnNlIHR5cGUgZnVuY3Rpb24gKHNwZWNpZmllZCBieSBhZGRfYXJndW1lbnQpCisgIG9ubHkgb25jZS4gQmVmb3JlLCB0aGUgdHlwZSBmdW5jdGlvbiB3YXMgY2FsbGVkIHR3aWNlIGluIHRoZSBjYXNlIHdoZXJlIHRoZQorICBkZWZhdWx0IHdhcyBzcGVjaWZpZWQgYW5kIHRoZSBhcmd1bWVudCB3YXMgZ2l2ZW4gYXMgd2VsbC4gIFRoaXMgd2FzCisgIGVzcGVjaWFsbHkgcHJvYmxlbWF0aWMgZm9yIHRoZSBGaWxlVHlwZSB0eXBlLCBhcyBhIGRlZmF1bHQgZmlsZSB3b3VsZCBhbHdheXMKKyAgYmUgb3BlbmVkLCBldmVuIGlmIGEgZmlsZSBhcmd1bWVudCB3YXMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCisKKy0gSXNzdWUgIzE1OTA2OiBGaXggYSByZWdyZXNzaW9uIGluIGFyZ3BhcnNlIGNhdXNlZCBieSB0aGUgcHJlY2VkaW5nIGNoYW5nZSwKKyAgd2hlbiBhY3Rpb249J2FwcGVuZCcsIHR5cGU9J3N0cicgYW5kIGRlZmF1bHQ9W10uCisKKy0gSXNzdWUgIzEzMzcwOiBFbnN1cmUgdGhhdCBjdHlwZXMgd29ya3Mgb24gTWFjIE9TIFggd2hlbiBQeXRob24gaXMKKyAgY29tcGlsZWQgdXNpbmcgdGhlIGNsYW5nIGNvbXBpbGVyCisKKy0gSXNzdWUgIzE1NTQ0OiBGaXggRGVjaW1hbC5fX2Zsb2F0X18gdG8gd29yayB3aXRoIHBheWxvYWQtY2FycnlpbmcgTmFOcy4KKworLSBJc3N1ZSAjMTUxOTk6IEZpeCBKYXZhU2NyaXB0J3MgZGVmYXVsdCBNSU1FIHR5cGUgdG8gYXBwbGljYXRpb24vamF2YXNjcmlwdC4KKyAgUGF0Y2ggYnkgQm9odXNsYXYgS2FicmRhLgorCistIElzc3VlICMxNTQ3NzogSW4gY21hdGggYW5kIG1hdGggbW9kdWxlcywgYWRkIHdvcmthcm91bmQgZm9yIHBsYXRmb3JtcyB3aG9zZQorICBzeXN0ZW0tc3VwcGxpZWQgbG9nMXAgZnVuY3Rpb24gZG9lc24ndCByZXNwZWN0IHNpZ25zIG9mIHplcm9zLgorCistIElzc3VlICMxMTA2MjogRml4IGFkZGluZyBhIG1lc3NhZ2UgZnJvbSBmaWxlIHRvIEJhYnlsIG1haWxib3guCisKKy0gSXNzdWUgIzE1NjQ2OiBQcmV2ZW50IGVxdWl2YWxlbnQgb2YgYSBmb3JrIGJvbWIgd2hlbiB1c2luZworICBtdWx0aXByb2Nlc3Npbmcgb24gV2luZG93cyB3aXRob3V0IHRoZSAiaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJyIKKyAgaWRpb20uCisKKy0gSXNzdWUgIzE1NTY3OiBGaXggTmFtZUVycm9yIHdoZW4gcnVubmluZyB0aHJlYWRpbmcuX3Rlc3QKKworLSBJc3N1ZSAjMTU0MjQ6IEFkZCBhIF9fc2l6ZW9mX18gaW1wbGVtZW50YXRpb24gZm9yIGFycmF5IG9iamVjdHMuCisgIFBhdGNoIGJ5IEx1ZHdpZyBIw6RobmUuCisKKy0gSXNzdWUgIzE1NTM4OiBGaXggY29tcGlsYXRpb24gb2YgdGhlIGdldG5hbWVpbmZvKCkgLyBnZXRhZGRyaW5mbygpCisgIGVtdWxhdGlvbiBjb2RlLiAgUGF0Y2ggYnkgUGhpbGlwcCBIYWdlbWVpc3Rlci4KKworLSBJc3N1ZSAjMTIyODg6IENvbnNpZGVyICcwJyBhbmQgJzAuMCcgYXMgdmFsaWQgaW5pdGlhbHZhbHVlCisgIGZvciB0a2ludGVyIFNpbXBsZURpYWxvZy4KKworLSBJc3N1ZSAjMTU0ODk6IEFkZCBhIF9fc2l6ZW9mX18gaW1wbGVtZW50YXRpb24gZm9yIEJ5dGVzSU8gb2JqZWN0cy4KKyAgUGF0Y2ggYnkgU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMTU0Njk6IEFkZCBhIF9fc2l6ZW9mX18gaW1wbGVtZW50YXRpb24gZm9yIGRlcXVlIG9iamVjdHMuCisgIFBhdGNoIGJ5IFNlcmhpeSBTdG9yY2hha2EuCisKKy0gSXNzdWUgIzE1NDg3OiBBZGQgYSBfX3NpemVvZl9fIGltcGxlbWVudGF0aW9uIGZvciBidWZmZXJlZCBJL08gb2JqZWN0cy4KKyAgUGF0Y2ggYnkgU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMTU1MTI6IEFkZCBhIF9fc2l6ZW9mX18gaW1wbGVtZW50YXRpb24gZm9yIHBhcnNlci4KKyAgUGF0Y2ggYnkgU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMTU0MDI6IEFuIGlzc3VlIGluIHRoZSBzdHJ1Y3QgbW9kdWxlIHRoYXQgY2F1c2VkIHN5cy5nZXRzaXplb2YgdG8KKyAgcmV0dXJuIGluY29ycmVjdCByZXN1bHRzIGZvciBzdHJ1Y3QuU3RydWN0IGluc3RhbmNlcyBoYXMgYmVlbiBmaXhlZC4KKyAgSW5pdGlhbCBwYXRjaCBieSBTZXJoaXkgU3RvcmNoYWthLgorCistIElzc3VlICMxNTIzMjogd2hlbiBtYW5nbGVfZnJvbSBpcyBUcnVlLCBlbWFpbC5HZW5lcmF0b3Igbm93IGNvcnJlY3RseSBtYW5nbGVzCisgIGxpbmVzIHRoYXQgc3RhcnQgd2l0aCAnRnJvbSAnIHRoYXQgb2NjdXIgaW4gYSBNSU1FIHByZWFtYmxlIG9yIGVwaWxvZy4KKworLSBJc3N1ZSAjMTM5MjI6IGFyZ3BhcnNlIG5vIGxvbmdlciBpbmNvcnJlY3RseSBzdHJpcHMgJy0tJ3MgdGhhdCBhcHBlYXIKKyAgYWZ0ZXIgdGhlIGZpcnN0IG9uZS4KKworLSBJc3N1ZSAjMTIzNTM6IGFyZ3BhcnNlIG5vdyBjb3JyZWN0bHkgaGFuZGxlcyBudWxsIGFyZ3VtZW50IHZhbHVlcy4KKworLSBJc3N1ZSAjNjQ5MzogQW4gaXNzdWUgaW4gY3R5cGVzIG9uIFdpbmRvd3MgdGhhdCBjYXVzZWQgc3RydWN0dXJlIGJpdGZpZWxkcworICBvZiB0eXBlIGN0eXBlcy5jX3VpbnQzMiBhbmQgd2lkdGggMzIgdG8gaW5jb3JyZWN0bHkgYmUgc2V0IGhhcyBiZWVuIGZpeGVkLgorCistIElzc3VlICMxNDYzNTogdGVsbmV0bGliIHdpbGwgdXNlIHBvbGwoKSByYXRoZXIgdGhhbiBzZWxlY3QoKSB3aGVuIHBvc3NpYmxlCisgIHRvIGF2b2lkIGZhaWxpbmcgZHVlIHRvIHRoZSBzZWxlY3QoKSBmaWxlIGRlc2NyaXB0b3IgbGltaXQuCisKKy0gSXNzdWUgIzE1MjQ3OiBGaWxlSU8gbm93IHJhaXNlcyBhbiBlcnJvciB3aGVuIGdpdmVuIGEgZmlsZSBkZXNjcmlwdG9yCisgIHBvaW50aW5nIHRvIGEgZGlyZWN0b3J5LgorCistIElzc3VlICMxNDU5MTogRml4IGJ1ZyBpbiBSYW5kb20uanVtcGFoZWFkIHRoYXQgY291bGQgcHJvZHVjZSBhbiBpbnZhbGlkCisgIE1lcnNlbm5lIFR3aXN0ZXIgc3RhdGUgb24gNjQtYml0IG1hY2hpbmVzLgorCistIElzc3VlICM1MzQ2OiBQcmVzZXJ2ZSBwZXJtaXNzaW9ucyBvZiBtYm94LCBNTURGIGFuZCBCYWJ5bCBtYWlsYm94CisgIGZpbGVzIG9uIGZsdXNoKCkuCisKKy0gSXNzdWUgIzE1MjE5OiBGaXggYSByZWZlcmVuY2UgbGVhayB3aGVuIGhhc2hsaWIubmV3KCkgaXMgY2FsbGVkIHdpdGgKKyAgaW52YWxpZCBwYXJhbWV0ZXJzLgorCistIElzc3VlICM5NTU5OiBJZiBtZXNzYWdlcyB3ZXJlIG9ubHkgYWRkZWQsIGEgbmV3IGZpbGUgaXMgbm8gbG9uZ2VyCisgIGNyZWF0ZWQgYW5kIHJlbmFtZWQgb3ZlciB0aGUgb2xkIGZpbGUgd2hlbiBmbHVzaCgpIGlzIGNhbGxlZCBvbiBhbgorICBtYm94LCBNTURGIG9yIEJhYnlsIG1haWxib3guCisKKy0gSXNzdWUgIzE0NjUzOiBlbWFpbC51dGlscy5ta3RpbWVfdHooKSBubyBsb25nZXIgcmVsaWVzIG9uIHN5c3RlbQorICBta3RpbWUoKSB3aGVuIHRpbWV6b25lIG9mZmVzdCBpcyBzdXBwbGllZC4KKworLSBJc3N1ZSAjNjA1NjogTWFrZSBtdWx0aXByb2Nlc3NpbmcgdXNlIHNldGJsb2NraW5nKFRydWUpIG9uIHRoZQorICBzb2NrZXRzIGl0IHVzZXMuICBPcmlnaW5hbCBwYXRjaCBieSBKIERlcmVrIFdpbHNvbi4KKworLSBJc3N1ZSAjMTUxMDE6IE1ha2UgcG9vbCBmaW5hbGl6ZXIgYXZvaWQgam9pbmluZyBjdXJyZW50IHRocmVhZC4KKworLSBJc3N1ZSAjMTUwNTQ6IEEgYnVnIGluIHRva2VuaXplLnRva2VuaXplIHRoYXQgY2F1c2VkIHN0cmluZyBsaXRlcmFscworICB3aXRoICdiJyBhbmQgJ2JyJyBwcmVmaXhlcyB0byBiZSBpbmNvcnJlY3RseSB0b2tlbml6ZWQgaGFzIGJlZW4gZml4ZWQuCisgIFBhdGNoIGJ5IFNlcmhpeSBTdG9yY2hha2EuCisKKy0gSXNzdWUgIzE1MDM2OiBNYWlsYm94IG5vIGxvbmdlciB0aHJvd3MgYW4gZXJyb3IgaWYgYSBmbHVzaCBpcyBkb25lCisgIGJldHdlZW4gb3BlcmF0aW9ucyB3aGVuIHJlbW92aW5nIG9yIGNoYW5naW5nIG11bHRpcGxlIGl0ZW1zIGluIG1ib3gsCisgIE1NREYsIG9yIEJhYnlsIG1haWxib3hlcy4KKworLSBJc3N1ZSAjMTAxMzM6IE1ha2UgbXVsdGlwcm9jZXNzaW5nIGRlYWxsb2NhdGUgYnVmZmVyIGlmIHNvY2tldCByZWFkCisgIGZhaWxzLiAgUGF0Y2ggYnkgSGFsbHZhcmQgQiBGdXJ1c2V0aC4KKworLSBJc3N1ZSAjMTM4NTQ6IE1ha2UgbXVsdGlwcm9jZXNzaW5nIHByb3Blcmx5IGhhbmRsZSBub24taW50ZWdlcgorICBub24tc3RyaW5nIGFyZ3VtZW50IHRvIFN5c3RlbUV4aXQuCisKKy0gSXNzdWUgIzEyMTU3OiBNYWtlIHBvb2wubWFwKCkgZW1wdHkgaXRlcmFibGVzIGNvcnJlY3RseS4gIEluaXRpYWwKKyAgcGF0Y2ggYnkgbW91YWQuCisKKy0gSXNzdWUgIzE0MDM2OiBBZGQgYW4gYWRkaXRpb25hbCBjaGVjayB0byB2YWxpZGF0ZSB0aGF0IHBvcnQgaW4gdXJscGFyc2UgZG9lcworICBub3QgZ28gaW4gaWxsZWdhbCByYW5nZSBhbmQgcmV0dXJucyBOb25lLgorCistIElzc3VlICMxNDg4ODogRml4IG1pc2JlaGF2aW91ciBvZiB0aGUgX21kNSBtb2R1bGUgd2hlbiBjYWxsZWQgb24gZGF0YQorICBsYXJnZXIgdGhhbiAyKiozMiBieXRlcy4KKworLSBJc3N1ZSAjMTU5MDg6IEZpeCBtaXNiZWhhdmlvdXIgb2YgdGhlIHNoYTEgbW9kdWxlIHdoZW4gY2FsbGVkIG9uIGRhdGEKKyAgbGFyZ2VyIHRoYW4gMioqMzIgYnl0ZXMuCisKKy0gSXNzdWUgIzE1OTEwOiBGaXggbWlzYmVoYXZpb3VyIG9mIF9tZDUgYW5kIHNoYTEgbW9kdWxlcyB3aGVuICJ1cGRhdGluZyIKKyAgb24gZGF0YSBsYXJnZXIgdGhhbiAyKiozMiBieXRlcy4KKworLSBJc3N1ZSAjMTQ4NzU6IFVzZSBmbG9hdCgnaW5mJykgaW5zdGVhZCBvZiBmbG9hdCgnMWU2NjY2NicpIGluIHRoZSBqc29uIG1vZHVsZS4KKworLSBJc3N1ZSAjMTQ1NzI6IFByZXZlbnQgYnVpbGQgZmFpbHVyZXMgd2l0aCBwcmUtMy41LjAgdmVyc2lvbnMgb2YKKyAgc3FsaXRlMywgc3VjaCBhcyB3YXMgc2hpcHBlZCB3aXRoIENlbnRvcyA1IGFuZCBNYWMgT1MgWCAxMC40LgorCistIElzc3VlICMxNDQyNjogQ29ycmVjdCB0aGUgRGF0ZSBmb3JtYXQgaW4gRXhwaXJlcyBhdHRyaWJ1dGUgb2YgU2V0LUNvb2tpZQorICBIZWFkZXIgaW4gQ29va2llLnB5LgorCistIElzc3VlICMxNDcyMTogU2VuZCBwcm9wZXIgaGVhZGVyLCBDb250ZW50LWxlbmd0aDogMCB3aGVuIHRoZSBib2R5IGlzIGFuIGVtcHR5CisgIHN0cmluZyAnJy4gSW5pdGlhbCBQYXRjaCBjb250cmlidXRlZCBieSBBcnZlIEtudWRzZW4uCisKKy0gSXNzdWUgIzE0MDcyOiBGaXggcGFyc2luZyBvZiAndGVsJyBVUklzIGluIHVybHBhcnNlIGJ5IG1ha2luZyB0aGUgY2hlY2sgZm9yCisgIHBvcnRzIHN0cmljdGVyLgorCistIElzc3VlICM5Mzc0OiBHZW5lcmljIHBhcnNpbmcgb2YgcXVlcnkgYW5kIGZyYWdtZW50IHBvcnRpb25zIG9mIHVybCBmb3IgYW55CisgIHNjaGVtZS4gU3VwcG9ydGVkIGJvdGggYnkgUkZDMzk4NiBhbmQgUkZDMjM5Ni4KKworLSBJc3N1ZSAjMTQ3OTg6IEZpeCB0aGUgZnVuY3Rpb25zIGluIHB5Y2xiciB0byByYWlzZSBhbiBJbXBvcnRFcnJvcgorICB3aGVuIHRoZSBmaXJzdCBwYXJ0IG9mIGEgZG90dGVkIG5hbWUgaXMgbm90IGEgcGFja2FnZS4gUGF0Y2ggYnkKKyAgWGF2aWVyIGRlIEdheWUuCisKKy0gSXNzdWUgIzE0ODMyOiBmaXhlZCB0aGUgb3JkZXIgb2YgdGhlIGFyZ3VtZW50IHJlZmVyZW5jZXMgaW4gdGhlIGVycm9yCisgIG1lc3NhZ2UgcHJvZHVjZWQgYnkgdW5pdHRlc3QncyBhc3NlcnRJdGVtc0VxdWFsLgorCistIElzc3VlICMxNDgyOTogRml4IGJpc2VjdCBpc3N1ZXMgdW5kZXIgNjQtYml0IFdpbmRvd3MuCisKKy0gSXNzdWUgIzE0Nzc3OiB0a2ludGVyIG1heSByZXR1cm4gdW5kZWNvZGVkIFVURi04IGJ5dGVzIGFzIGEgc3RyaW5nIHdoZW4KKyAgYWNjZXNzaW5nIHRoZSBUayBjbGlwYm9hcmQuICBNb2RpZnkgY2xpcGJvYWRfZ2V0KCkgdG8gZmlyc3QgcmVxdWVzdCB0eXBlCisgIFVURjhfU1RSSU5HIHdoZW4gbm8gc3BlY2lmaWMgdHlwZSBpcyByZXF1ZXN0ZWQgaW4gYW4gWDExIHdpbmRvd2luZworICBlbnZpcm9ubWVudCwgZmFsbGluZyBiYWNrIHRvIHRoZSBjdXJyZW50IGRlZmF1bHQgdHlwZSBTVFJJTkcgaWYgdGhhdCBmYWlscy4KKyAgT3JpZ2luYWwgcGF0Y2ggYnkgVGhvbWFzIEtsdXl2ZXIuCisKKy0gSXNzdWUgIzEyNTQxOiBCZSBsZW5pZW50IHdpdGggcXVvdGVzIGFyb3VuZCBSZWFsbSBmaWVsZCB3aXRoIEhUVFAgQmFzaWMKKyAgQXV0aGVudGF0aW9uIGluIHVybGxpYjIuCisKKy0gSXNzdWUgIzE0NjYyOiBQcmV2ZW50IHNodXRpbCBmYWlsdXJlcyBvbiBPUyBYIHdoZW4gZGVzdGluYXRpb24gZG9lcyBub3QKKyAgc3VwcG9ydCBjaGZsYWcgb3BlcmF0aW9ucy4gIFBhdGNoIGJ5IEh5bmVrIFNjaGxhd2Fjay4KKworLSBJc3N1ZSAjMTQxNTc6IEZpeCB0aW1lLnN0cnB0aW1lIGZhaWxpbmcgd2l0aG91dCBhIHllYXIgb24gRmVicnVhcnkgMjl0aC4KKyAgUGF0Y2ggYnkgSHluZWsgU2NobGF3YWNrLgorCistIElzc3VlICMxNDc2ODogb3MucGF0aC5leHBhbmR1c2VyKCd+L2EnKSBkb2Vzbid0IHdvcmtzIGNvcnJlY3RseSB3aGVuIEhPTUUgaXMgJy8nLgorCistIElzc3VlICMxMzE4MzogRml4IHBkYiBza2lwcGluZyBmcmFtZXMgYWZ0ZXIgaGl0dGluZyBhIGJyZWFrcG9pbnQgYW5kIHJ1bm5pbmcKKyAgc3RlcC4gIFBhdGNoIGJ5IFhhdmllciBkZSBHYXllLgorCistIElzc3VlICMxNDY2NDogSXQgaXMgbm93IHBvc3NpYmxlIHRvIHVzZSBAdW5pdHRlc3Quc2tpcHtJZixVbmxlc3N9IG9uIGEKKyAgdGVzdCBjbGFzcyB0aGF0IGRvZXNuJ3QgaW5oZXJpdCBmcm9tIFRlc3RDYXNlIChpLmUuIGEgbWl4aW4pLgorCistIElzc3VlICMxNDE2MDogVGFyRmlsZS5leHRyYWN0ZmlsZSgpIGZhaWxlZCB0byByZXNvbHZlIHN5bWJvbGljIGxpbmtzIHdoZW4KKyAgdGhlIGxpbmtzIHdlcmUgbm90IGxvY2F0ZWQgaW4gYW4gYXJjaGl2ZSBzdWJkaXJlY3RvcnkuCisKKy0gSXNzdWUgIzE0NjM4OiBweWRvYyBub3cgdHJlYXRzIG5vbi1zdHJpbmcgX19uYW1lX18gdmFsdWVzIGFzIGlmIHRoZXkKKyAgd2VyZSBtaXNzaW5nLCBpbnN0ZWFkIG9mIHJhaXNpbmcgYW4gZXJyb3IuCisKKy0gSXNzdWUgIzEzNjg0OiBGaXggaHR0cGxpYiB0dW5uZWwgaXNzdWUgb2YgaW5maW5pdGUgbG9vcHMgZm9yIGNlcnRhaW4gc2l0ZXMKKyAgd2hpY2ggc2VuZCBFT0Ygd2l0aG91dCB0cmFpbGluZyBcclxuLgorCistIElzc3VlICMxNDMwODogRml4IGFuIGV4Y2VwdGlvbiB3aGVuIGEgImR1bW15IiB0aHJlYWQgaXMgaW4gdGhlIHRocmVhZGluZworICBtb2R1bGUncyBhY3RpdmUgbGlzdCBhZnRlciBhIGZvcmsoKS4KKworLSBJc3N1ZSAjMTQ1Mzg6IEhUTUxQYXJzZXIgY2FuIG5vdyBwYXJzZSBjb3JyZWN0bHkgc3RhcnQgdGFncyB0aGF0IGNvbnRhaW4KKyAgYSBiYXJlICcvJy4KKworLSBJc3N1ZSAjMTQ0NTI6IFN5c0xvZ0hhbmRsZXIgbm8gbG9uZ2VyIGluc2VydHMgYSBVVEYtOCBCT00gaW50byB0aGUgbWVzc2FnZS4KKworLSBJc3N1ZSAjMTM0OTY6IEZpeCBwb3RlbnRpYWwgb3ZlcmZsb3cgaW4gYmlzZWN0LmJpc2VjdCBhbGdvcml0aG0gd2hlbiBhcHBsaWVkCisgIHRvIGEgY29sbGVjdGlvbiBvZiBzaXplID4gc3lzLm1heHNpemUgLyAyLgorCistIElzc3VlICMxNDM5OTogemlwZmlsZSBub3cgcmVjb2duaXplcyB0aGF0IHRoZSBhcmNoaXZlIGhhcyBiZWVuIG1vZGlmaWVkIGV2ZW4KKyAgaWYgb25seSB0aGUgY29tbWVudCBpcyBjaGFuZ2VkLiAgQXMgYSBjb25zZXF1ZW5jZSBvZiB0aGlzIGZpeCwgWmlwRmlsZSBpcyBub3cKKyAgYSBuZXcgc3R5bGUgY2xhc3MuCisKKy0gSXNzdWUgIzc5Nzg6IFNvY2tldFNlcnZlciBub3cgcmVzdGFydHMgdGhlIHNlbGVjdCgpIGNhbGwgd2hlbiBFSU5UUiBpcworICByZXR1cm5lZC4gIFRoaXMgYXZvaWRzIGNyYXNoaW5nIHRoZSBzZXJ2ZXIgbG9vcCB3aGVuIGEgc2lnbmFsIGlzIHJlY2VpdmVkLgorICBQYXRjaCBieSBKZXJ6eSBLb3plcmEuCisKKy0gSXNzdWUgIzEwMzQwOiBhc3luY29yZSAtIHByb3Blcmx5IGhhbmRsZSBFSU5WQUwgaW4gZGlzcGF0Y2hlciBjb25zdHJ1Y3RvciBvbgorICBPU1g7IGF2b2lkIHRvIGNhbGwgaGFuZGxlX2Nvbm5lY3QgaW4gY2FzZSBvZiBhIGRpc2Nvbm5lY3RlZCBzb2NrZXQgd2hpY2gKKyAgd2FzIG5vdCBtZWFudCB0byBjb25uZWN0LgorCistIElzc3VlICMxMjc1NzogRml4IHRoZSBza2lwcGluZyBvZiBkb2N0ZXN0cyB3aGVuIHB5dGhvbiBpcyBydW4gd2l0aCAtT08gc28KKyAgdGhhdCBpdCB3b3JrcyBpbiB1bml0dGVzdCdzIHZlcmJvc2UgbW9kZSBhcyB3ZWxsIGFzIG5vbi12ZXJib3NlIG1vZGUuCisKKy0gSXNzdWUgIzEzNjk0OiBhc3luY2hyb25vdXMgY29ubmVjdCBpbiBhc3luY29yZS5kaXNwYXRjaGVyIGRvZXMgbm90IHNldCBhZGRyCisgIGF0dHJpYnV0ZS4KKworLSBJc3N1ZSAjMTA0ODQ6IEZpeCB0aGUgQ0dJSFRUUFNlcnZlcidzIFBBVEhfSU5GTyBoYW5kbGluZyBwcm9ibGVtLgorCistIElzc3VlICMxMTE5OTogRml4IHRoZSB3aXRoIHVybGxpYiB3aGljaCBoYW5ncyBvbiBwYXJ0aWN1bGFyIGZ0cCB1cmxzLgorCistIElzc3VlICMxNDI1MjogRml4IHN1YnByb2Nlc3MuUG9wZW4udGVybWluYXRlKCkgdG8gbm90IHJhaXNlIGFuIGVycm9yIHVuZGVyCisgIFdpbmRvd3Mgd2hlbiB0aGUgY2hpbGQgcHJvY2VzcyBoYXMgYWxyZWFkeSBleGl0ZWQuCisKKy0gSXNzdWUgIzE0MTk1OiBBbiBpc3N1ZSB0aGF0IGNhdXNlZCB3ZWFrcmVmLldlYWtTZXQgaW5zdGFuY2VzIHRvIGluY29ycmVjdGx5CisgIHJldHVybiBUcnVlIGZvciBhIFdlYWtTZXQgaW5zdGFuY2UgJ2EnIGluIGJvdGggJ2EgPCBhJyBhbmQgJ2EgPiBhJyBoYXMgYmVlbgorICBmaXhlZC4KKworLSBJc3N1ZSAjMTQxNTk6IEZpeCB0aGUgbGVuKCkgb2Ygd2VhayBzZXRzIHRvIHJldHVybiBhIGJldHRlciBhcHByb3hpbWF0aW9uCisgIHdoZW4gc29tZSBvYmplY3RzIGFyZSBkZWFkIG9yIGR5aW5nLiAgTW9yZW92ZXIsIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBub3cKKyAgTygxKSByYXRoZXIgdGhhbiBPKG4pLgorCistIElzc3VlICMyOTQ1OiBNYWtlIHRoZSBkaXN0dXRpbHMgdXBsb2FkIGNvbW1hbmQgYXdhcmUgb2YgYmRpc3RfcnBtIHByb2R1Y3RzLgorCistIElzc3VlICM2ODg0OiBGaXggbG9uZy1zdGFuZGluZyBidWdzIHdpdGggTUFOSUZFU1QuaW4gcGFyc2luZyBpbiBkaXN0dXRpbHMKKyAgb24gV2luZG93cy4KKworLSBJc3N1ZSAjMTY0NDE6IEF2b2lkIGV4Y2Vzc2l2ZSBtZW1vcnkgdXNhZ2Ugd29ya2luZyB3aXRoIGxhcmdlIGd6aXAKKyAgZmlsZXMgdXNpbmcgdGhlIGd6aXAgbW9kdWxlLgorCistIElzc3VlICMxNTc4MjogUHJldmVudCBjb21waWxlIGVycm9ycyBvZiBPUyBYIENhcmJvbiBtb2R1bGVzIF9GbSwgX1FkLCBhbmQKKyAgX1Fkb2ZmcyB3aGVuIGNvbXBpbGluZyB3aXRoIGFuIFNESyBvZiAxMC43IG9yIGxhdGVyLiAgVGhlIE9TIFggQVBJcyB0aGV5CisgIHdyYXAgaGF2ZSBsb25nIGJlZW4gZGVwcmVjYXRlZCBhbmQgaGF2ZSBub3cgYmVlbiByZW1vdmVkIHdpdGggMTAuNy4KKyAgVGhlc2UgbW9kdWxlcyB3ZXJlIGFscmVhZHkgZW1wdHkgZm9yIDY0LWJpdCBidWlsZHMgYW5kIGhhdmUgYmVlbiByZW1vdmVkCisgIGluIFB5dGhvbiAzLgorCitFeHRlbnNpb24gTW9kdWxlcworLS0tLS0tLS0tLS0tLS0tLS0KKworLSBJc3N1ZSAjMTc0Nzc6IFVwZGF0ZSB0aGUgYnNkZGIgbW9kdWxlIHRvIHB5YnNkZGIgNS4zLjAsIHN1cHBvcnRpbmcKKyAgZGItNS54LCBhbmQgZHJvcHBpbmcgc3VwcG9ydCBmb3IgZGItNC4xIGFuZCBkYi00LjIuCisKKy0gSXNzdWUgIzE3MTkyOiBVcGRhdGUgdGhlIGN0eXBlcyBtb2R1bGUncyBsaWJmZmkgdG8gdjMuMC4xMy4gIFRoaXMKKyAgc3BlY2lmaWNhbGx5IGFkZHJlc3NlcyBhIHN0YWNrIG1pc2FsaWdubWVudCBpc3N1ZSBvbiB4ODYgYW5kIGlzc3VlcyBvbgorICBzb21lIG1vcmUgcmVjZW50IHBsYXRmb3Jtcy4KKworLSBJc3N1ZSAjMTIyNjg6IFRoZSBpbyBtb2R1bGUgZmlsZSBvYmplY3Qgd3JpdGUgbWV0aG9kcyBubyBsb25nZXIgYWJvcnQgZWFybHkKKyAgd2hlbiBhIHdyaXRlIHN5c3RlbSBjYWxscyBpcyBpbnRlcnJ1cHRlZCAoRUlOVFIpLgorCistIEZpeCB0aGUgbGVhayBvZiBhIGRpY3QgaW4gdGhlIHRpbWUgbW9kdWxlIHdoZW4gdXNlZCBpbiBhbiBlbWJlZGRlZAorICBpbnRlcnByZXRlciB0aGF0IGlzIHJlcGVhdGVkbHkgaW5pdGlhbGl6ZWQgYW5kIHNodXRkb3duIGFuZCByZWluaXRpYWxpemVkLgorCistIElzc3VlICMxMjI2ODogRmlsZSByZWFkbGluZSwgcmVhZGxpbmVzIGFuZCByZWFkIG9yIHJlYWRhbGwgbWV0aG9kcworICBubyBsb25nZXIgbG9zZSBkYXRhIHdoZW4gYW4gdW5kZXJseWluZyByZWFkIHN5c3RlbSBjYWxsIGlzIGludGVycnVwdGVkCisgIHdpdGhpbiBhbiBpbyBtb2R1bGUgb2JqZWN0LiAgSU9FcnJvciBpcyBubyBsb25nZXIgcmFpc2VkIGR1ZSB0byBhIHJlYWQKKyAgc3lzdGVtIGNhbGwgcmV0dXJuaW5nIEVJTlRSIGZyb20gd2l0aGluIHRoZXNlIG1ldGhvZHMuCisKKy0gSXNzdWUgIzE2MDEyOiBGaXggYSByZWdyZXNzaW9uIGluIHB5ZXhwYXQuIFRoZSBwYXJzZXIncyBVc2VGb3JlaWduRFREKCkKKyAgbWV0aG9kIGRvZXNuJ3QgcmVxdWlyZSBhbiBhcmd1bWVudCBhZ2Fpbi4KKworLSBJc3N1ZSAjMTM1OTA6IE9TIFggWGNvZGUgNCAtIGltcHJvdmUgc3VwcG9ydCBmb3IgdW5pdmVyc2FsIGV4dGVuc2lvbiBtb2R1bGVzCisgIEluIHBhcnRpY3VsYXIsIGZpeCBleHRlbnNpb24gbW9kdWxlIGJ1aWxkIGZhaWx1cmVzIHdoZW4gdHJ5aW5nIHRvIHVzZQorICAzMi1iaXQtb25seSBpbnN0YWxsZXIgUHl0aG9ucyBvbiBzeXN0ZW1zIHdpdGggWGNvZGUgNCAoY3VycmVudGx5CisgIE9TIFggMTAuOCwgMTAuNywgYW5kIG9wdGlvbmFsbHkgMTAuNikuCisgICogQmFja3BvcnQgMy4zLjAgZml4ZXMgdG8gMi43IGJyYW5jaCAoZm9yIHJlbGVhc2UgaW4gMi43LjQpCisgICogU2luY2UgWGNvZGUgNCByZW1vdmVzIHBwYyBzdXBwb3J0LCBleHRlbnNpb24gbW9kdWxlIGJ1aWxkcyBub3cKKyAgICBjaGVjayBmb3IgcHBjIGNvbXBpbGVyIHN1cHBvcnQgYW5kIGJ5IGRlZmF1bHQgcmVtb3ZlIHBwYyBhbmQKKyAgICBwcGM2NCBhcmNocyB3aGVuIHRoZXkgYXJlIG5vdCBhdmFpbGFibGUuCisgICogRXh0ZW5zaW9uIG1vZHVsZSBidWlsZHMgbm93IHJldmVydCB0byB1c2luZyBzeXN0ZW0gaW5zdGFsbGVkCisgICAgaGVhZGVycyBhbmQgbGlicyAoL3VzciBhbmQgL1N5c3RlbS9MaWJyYXJ5KSBpZiB0aGUgU0RLIHVzZWQKKyAgICB0byBidWlsZCB0aGUgaW50ZXJwcmV0ZXIgaXMgbm90IGluc3RhbGxlZCBvciBoYXMgbW92ZWQuCisgICogVHJ5IHRvIGF2b2lkIGJ1aWxkaW5nIGV4dGVuc2lvbiBtb2R1bGVzIHdpdGggZGVwcmVjYXRlZAorICAgIGFuZCBwcm9ibGVtYXRpYyBBcHBsZSBsbHZtLWdjYyBjb21waWxlci4gIElmIG9yaWdpbmFsIGNvbXBpbGVyCisgICAgaXMgbm90IGF2YWlsYWJsZSwgdXNlIGNsYW5nIGluc3RlYWQgYnkgZGVmYXVsdC4KKworSURMRQorLS0tLQorCistIElETEUgd2FzIGRpc3BsYXlpbmcgc3B1cmlvdXMgU3lzdGVtRXhpdCB0cmFjZWJhY2tzIHdoZW4gcnVubmluZyBzY3JpcHRzCisgIHRoYXQgdGVybWluYXRlZCBieSByYWlzaW5nIFN5c3RlbUV4aXQgKGkuZS4gdW5pdHRlc3QgYW5kIHR1cnRsZWRlbW8pLgorCistIElzc3VlICM5MjkwOiBJbiBJRExFIHRoZSBzeXMuc3RkKiBzdHJlYW1zIG5vdyBpbXBsZW1lbnQgaW8uVGV4dElPQmFzZQorICBpbnRlcmZhY2UgYW5kIHN1cHBvcnQgYWxsIG1hbmRhdG9yeSBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzLgorCistIElzc3VlICMxNjgyOTogSURMRSBwcmludGluZyBubyBsb25nZXIgZmFpbHMgaWYgdGhlcmUgYXJlIHNwYWNlcyBvciBvdGhlcgorICBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gdGhlIGZpbGUgcGF0aC4KKworLSBJc3N1ZSAjMTY4MTk6IElETEUgbWV0aG9kIGNvbXBsZXRpb24gbm93IGNvcnJlY3RseSB3b3JrcyBmb3IgdW5pY29kZSBsaXRlcmFscy4KKworLSBJc3N1ZSAjMTY1MDQ6IElETEUgbm93IGNhdGNoZXMgU3ludGF4RXJyb3JzIHJhaXNlZCBieSB0b2tlbml6ZXIuIFBhdGNoIGJ5CisgIFJvZ2VyIFNlcnd5LgorCistIElzc3VlICMxMjA3NTg5OiBBZGQgQ3V0L0NvcHkvUGFzdGUgaXRlbXMgdG8gSURMRSByaWdodCBjbGljayBDb250ZXh0IE1lbnUKKyAgUGF0Y2ggYnkgVG9kZCBSb3ZpdG8uCisKKy0gSXNzdWUgIzEzMDUyOiBGaXggSURMRSBjcmFzaGluZyB3aGVuIHJlcGxhY2Ugc3RyaW5nIGluIFNlYXJjaC9SZXBsYWNlIGRpYWxvZworICBlbmRlZCB3aXRoICdcJy4gUGF0Y2ggYnkgUm9nZXIgU2Vyd3kuCisKKy0gSXNzdWUgIzk4MDM6IERvbid0IGNsb3NlIElETEUgb24gc2F2aW5nIGlmIGJyZWFrcG9pbnQgaXMgb3Blbi4KKyAgUGF0Y2ggYnkgUm9nZXIgU2Vyd3kuCisKKy0gSXNzdWUgIzE0OTU4OiBDaGFuZ2UgSURMRSBzeXN0YXggaGlnaGxpZ2h0aW5nIHRvIHJlY29nbml6ZSBhbGwgc3RyaW5nIGFuZCBieXRlCisgIGxpdGVyYWxzIGN1cnJlbnRseSBzdXBwb3J0ZWQgaW4gUHl0aG9uIDIuNy4KKworLSBJc3N1ZSAjMTQ5NjI6IFVwZGF0ZSB0ZXh0IGNvbG9yaW5nIGluIElETEUgc2hlbGwgd2luZG93IGFmdGVyIGNoYW5naW5nCisgIG9wdGlvbnMuICBQYXRjaCBieSBSb2dlciBTZXJ3eS4KKworLSBJc3N1ZSAjMTA5OTc6IFByZXZlbnQgYSBkdXBsaWNhdGUgZW50cnkgaW4gSURMRSdzICJSZWNlbnQgRmlsZXMiIG1lbnUuCisKKy0gSXNzdWUgIzEyNTEwOiBBdHRlbXB0aW5nIHRvIGdldCBpbnZhbGlkIHRvb2x0aXAgbm8gbG9uZ2VyIGNsb3NlcyBJRExFLgorICBPcmlnaW5hbCBwYXRjaCBieSBSb2dlciBTZXJ3eS4KKworLSBJc3N1ZSAjMTAzNjU6IEZpbGUgb3BlbiBkaWFsb2cgbm93IHdvcmtzIGluc3RlYWQgb2YgY3Jhc2hpbmcKKyAgZXZlbiB3aGVuIHBhcmVudCB3aW5kb3cgaXMgY2xvc2VkLiBQYXRjaCBieSBSb2dlciBTZXJ3eS4KKworLSBJc3N1ZSAjMTQ4NzY6IFVzZSB1c2VyLXNlbGVjdGVkIGZvbnQgZm9yIGhpZ2hsaWdodCBjb25maWd1cmF0aW9uLgorICBQYXRjaCBieSBSb2dlciBTZXJ3eS4KKworLSBJc3N1ZSAjMTQ0MDk6IElETEUgbm93IHByb3Blcmx5IGV4ZWN1dGVzIGNvbW1hbmRzIGluIHRoZSBTaGVsbCB3aW5kb3cKKyAgd2hlbiBpdCBjYW5ub3QgcmVhZCB0aGUgbm9ybWFsIGNvbmZpZyBmaWxlcyBvbiBzdGFydHVwIGFuZAorICBoYXMgdG8gdXNlIHRoZSBidWlsdC1pbiBkZWZhdWx0IGtleSBiaW5kaW5ncy4KKyAgVGhlcmUgd2FzIHByZXZpb3VzbHkgYSBidWcgaW4gb25lIG9mIHRoZSBkZWZhdWx0cy4KKworLSBJc3N1ZSAjMzU3MzogSURMRSBoYW5ncyB3aGVuIHBhc3NpbmcgaW52YWxpZCBjb21tYW5kIGxpbmUgYXJncworICAoZGlyZWN0b3J5KGllcykgaW5zdGVhZCBvZiBmaWxlKHMpKSAoUGF0Y2ggYnkgR3VpbGhlcm1lIFBvbG8pCisKKy0gSXNzdWUgIzUyMTk6IFByZXZlbnQgZXZlbnQgaGFuZGxlciBjYXNjYWRlIGluIElETEUuCisKKy0gSXNzdWUgIzE1MzE4OiBQcmV2ZW50IHdyaXRpbmcgdG8gc3lzLnN0ZGluLgorCistIElzc3VlICMxMzUzMiwgIzE1MzE5OiBDaGVjayB0aGF0IGFyZ3VtZW50cyB0byBzeXMuc3Rkb3V0LndyaXRlIGFyZSBzdHJpbmdzLgorCistIElzc3VlICMxMDM2NTogRmlsZSBvcGVuIGRpYWxvZyBub3cgd29ya3MgaW5zdGVhZCBvZiBjcmFzaGluZyBldmVuIHdoZW4KKyAgcGFyZW50IHdpbmRvdyBpcyBjbG9zZWQgd2hpbGUgZGlhbG9nIGlzIG9wZW4uCisKKy0gSXNzdWUgIzE0MDE4OiBVcGRhdGUgY2hlY2tzIGZvciB1bnN0YWJsZSBzeXN0ZW0gVGNsL1RrIHZlcnNpb25zIG9uIE9TIFgKKyAgdG8gaW5jbHVkZSB2ZXJzaW9ucyBzaGlwcGVkIHdpdGggT1MgWCAxMC43IGFuZCAxMC44IGluIGFkZGl0aW9uIHRvIDEwLjYuCisKKy0gSXNzdWUgIzE1ODUzOiBQcmV2ZW50IElETEUgY3Jhc2ggb24gT1MgWCB3aGVuIG9wZW5pbmcgUHJlZmVyZW5jZXMgbWVudQorICB3aXRoIGNlcnRhaW4gdmVyc2lvbnMgb2YgVGsgOC41LiAgSW5pdGlhbCBwYXRjaCBieSBLZXZpbiBXYWx6ZXIuCisKK1Rlc3RzCistLS0tLQorCistIElzc3VlICMxNjcwMjogdGVzdF91cmxsaWIyX2xvY2FsbmV0IHRlc3RzIG5vdyBjb3JyZWN0bHkgaWdub3JlcyBwcm94aWVzIGZvcgorICBsb2NhbGhvc3QgdGVzdHMuCisKKy0gSXNzdWUgIzEzNDQ3OiBBZGQgYSB0ZXN0IGZpbGUgdG8gaG9zdCByZWdyZXNzaW9uIHRlc3RzIGZvciBidWdzIGluIHRoZQorICBzY3JpcHRzIGZvdW5kIGluIHRoZSBUb29scyBkaXJlY3RvcnkuCisKKy0gSXNzdWUgIzExNDIwOiBtYWtlIHRlc3Qgc3VpdGUgcGFzcyB3aXRoIC1CL0RPTlRXUklURUJZVEVDT0RFIHNldC4KKyAgSW5pdGlhbCBwYXRjaCBieSBUaG9tYXMgV291dGVycy4KKworLSBJc3N1ZSAjMTcyOTk6IEFkZCB0ZXN0IGNvdmVyYWdlIGZvciBjUGlja2xlIHdpdGggZmlsZSBvYmplY3RzIGFuZCBnZW5lcmFsIElPCisgIG9iamVjdHMuICBPcmlnaW5hbCBwYXRjaCBieSBBbWFuIFNoYWguCisKKy0gSXNzdWUgIzExOTYzOiByZW1vdmUgaHVtYW4gdmVyaWZpY2F0aW9uIGZyb20gdGVzdF9wYXJzZXIgYW5kIHRlc3Rfc3VicHJvY2Vzcy4KKworLSBJc3N1ZSAjMTcyNDk6IGNvbnZlcnQgYSB0ZXN0IGluIHRlc3RfY2FwaSB0byB1c2UgdW5pdHRlc3QgYW5kIHJlYXAgdGhyZWFkcy4KKworLSBXZSBub3cgcnVuIGJvdGggdGVzdF9lbWFpbC5weSBhbmQgdGVzdF9lbWFpbF9yZW5hbWVkLnB5IHdoZW4gcnVubmluZyB0aGUKKyAgdGVzdF9lbWFpbCByZWdyZXNzaW9uIHRlc3QuICB0ZXN0X2VtYWlsX3JlbmFtZWQgY29udGFpbnMgc29tZSB0ZXN0cyB0aGF0CisgIHRlc3RfZW1haWwgZG9lcyBub3QuCisKKy0gSXNzdWUgIzE3MDQxOiBGaXggdGVzdGluZyB3aGVuIFB5dGhvbiBpcyBjb25maWd1cmVkIHdpdGggdGhlCisgIC0td2l0aG91dC1kb2Mtc3RyaW5ncyBvcHRpb24uCisKKy0gSXNzdWUgIzE1NTM5OiBBZGRlZCByZWdyZXNzaW9uIHRlc3RzIGZvciBUb29scy9zY3JpcHRzL3BpbmRlbnQucHkuCisKKy0gSXNzdWUgIzE1MzI0OiBGaXggcmVncnRlc3QgcGFyc2luZyBvZiAtLWZyb21maWxlIGFuZCAtLXJhbmRvbWl6ZSBvcHRpb25zLgorCistIElzc3VlICMxNjYxODogQWRkIG1vcmUgcmVncmVzc2lvbiB0ZXN0cyBmb3IgZ2xvYi4KKyAgUGF0Y2ggYnkgU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMTY2NjQ6IEFkZCByZWdyZXNzaW9uIHRlc3RzIGZvciBnbG9iJ3MgYmVoYXZpb3VyIGNvbmNlcm5pbmcgZW50cmllcworICBzdGFydGluZyB3aXRoIGEgIi4iLiAgUGF0Y2ggYnkgU2ViYXN0aWFuIEtyZWZ0LgorCistIElzc3VlICMxNTc0NzogWkZTIGFsd2F5cyByZXR1cm5zIEVPUE5PVFNVUFAgd2hlbiBhdHRlbXB0aW5nIHRvIHNldCB0aGUKKyAgVUZfSU1NVVRBQkxFIGZsYWcgKHZpYSBlaXRoZXIgY2hmbGFncyBvciBsY2hmbGFncyk7IHJlZmFjdG9yIGFmZmVjdGVkCisgIHRlc3RzIGluIHRlc3RfcG9zaXgucHkgdG8gYWNjb3VudCBmb3IgdGhpcy4KKworLSBJc3N1ZSAjMTY1NDk6IEFkZCB0ZXN0cyBmb3IganNvbi50b29scy4gIEluaXRpYWwgcGF0Y2ggYnkgQmVya2VyIFBla3NhZworICBhbmQgU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMTY1NTk6IEFkZCBtb3JlIHRlc3RzIGZvciB0aGUganNvbiBtb2R1bGUsIGluY2x1ZGluZyBzb21lIGZyb20gdGhlCisgIG9mZmljaWFsIHRlc3Qgc3VpdGUgYXQganNvbi5vcmcuICBQYXRjaCBieSBTZXJoaXkgU3RvcmNoYWthLgorCistIElzc3VlICMxNjI3NDogRml4IHRlc3RfYXN5bmNvcmUgb24gU29sYXJpcy4gIFBhdGNoIGJ5IEdpYW1wYW9sbyBSb2RvbGEnLgorCistIElzc3VlICMxNTA0MDogQ2xvc2UgZmlsZXMgaW4gbWFpbGJveCB0ZXN0cyBmb3IgUHlQeSBjb21wYXRpYmlsaXR5LgorICBPcmlnaW5hbCBwYXRjaCBieSBNYXR0aSBQaWN1cy4KKworLSBJc3N1ZSAjMTU4MDI6IEZpeCB0ZXN0IGxvZ2ljIGluIFRlc3RNYWlsZGlyLnRlc3RfY3JlYXRlX3RtcC4gUGF0Y2gKKyAgYnkgU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMTU3NjU6IEV4dGVuZCBhIHByZXZpb3VzIGZpeCB0byBTb2xhcmlzIGFuZCBPcGVuQlNEIGZvciBxdWlya3kKKyAgZ2V0Y3dkKCkgYmVoYXZpb3VyIChpc3N1ZSAjOTE4NSkgdG8gTmV0QlNEIGFzIHdlbGwuCisKKy0gSXNzdWUgIzE1NjE1OiBBZGQgc29tZSB0ZXN0cyBmb3IgdGhlIGpzb24gbW9kdWxlJ3MgaGFuZGxpbmcgb2YgaW52YWxpZAorICBpbnB1dCBkYXRhLiAgUGF0Y2ggYnkgS3VzaGFsIERhcy4KKworLSBJc3N1ZSAjMTU0OTY6IEFkZCBkaXJlY3RvcnkgcmVtb3ZhbCBoZWxwZXJzIGZvciB0ZXN0cyBvbiBXaW5kb3dzLgorICBQYXRjaCBieSBKZXJlbXkgS2xvdGguCisKKy0gSXNzdWUgIzE1MDQzOiB0ZXN0X2dkYiBpcyBub3cgc2tpcHBlZCBlbnRpcmVseSBpZiBnZGIgc2VjdXJpdHkgc2V0dGluZ3MKKyAgYmxvY2sgbG9hZGluZyBvZiB0aGUgZ2RiIGhvb2tzCisKKy0gSXNzdWUgIzE0NTg5OiBVcGRhdGUgY2VydGlmaWNhdGUgY2hhaW4gZm9yIHNoYTI1Ni50YnMtaW50ZXJuZXQuY29tLCBmaXhpbmcKKyAgYSB0ZXN0IGZhaWx1cmUgaW4gdGVzdF9zc2wuCisKKy0gSXNzdWUgIzE2Njk4OiBTa2lwIHBvc2l4IHRlc3RfZ2V0Z3JvdXBzIHdoZW4gYnVpbHQgd2l0aCBPUyBYCisgIGRlcGxveW1lbnQgdGFyZ2V0IHByaW9yIHRvIDEwLjYuCisKKy0gSXNzdWUgIzE3MTExOiBQcmV2ZW50IHRlc3Rfc3Vycm9nYXRlcyAodGVzdF9maWxlaW8pIGZhaWx1cmUgb24gT1MgWCAxMC40LgorCitCdWlsZAorLS0tLS0KKworLSBJc3N1ZSAjMTc0MjU6IEJ1aWxkIGFnYWluc3Qgb3BlbnNzbCAwLjkuOHkgb24gV2luZG93cy4KKworLSBJc3N1ZSAjMTYwMDQ6IEFkZCBgbWFrZSB0b3VjaGAuCisKKy0gSXNzdWUgIzUwMzM6IEZpeCBidWlsZGluZyBvZiB0aGUgc3FsaXRlMyBleHRlbnNpb24gbW9kdWxlIHdoZW4gdGhlCisgIFNRTGl0ZSBsaWJyYXJ5IHZlcnNpb24gaGFzICJiZXRhIiBpbiBpdC4gUGF0Y2ggYnkgQW5kcmVhcyBQZWxtZS4KKworLSBJc3N1ZSAjMTcyMjg6IEZpeCBidWlsZGluZyB3aXRob3V0IHB5bWFsbG9jLgorCistIElzc3VlICMxNzA4NjogQmFja3BvcnQgdGhlIHBhdGNoZXMgZnJvbSB0aGUgMy4zIGJyYW5jaCB0byBjcm9zcy1idWlsZAorICB0aGUgcGFja2FnZS4KKworLSBJc3N1ZSAjMzc1NDogZml4IHR5cG8gaW4gcHRocmVhZCBBQ19DQUNIRV9WQUwuCisKKy0gSXNzdWUgIzE3MDI5OiBMZXQgaDJweSBzZWFyY2ggdGhlIG11bHRpYXJjaCBzeXN0ZW0gaW5jbHVkZSBkaXJlY3RvcnkuCisKKy0gSXNzdWUgIzE2OTUzOiBGaXggc29ja2V0IG1vZHVsZSBjb21waWxhdGlvbiBvbiBwbGF0Zm9ybXMgd2l0aAorICBIQVZFX0JST0tFTl9QT0xMLiBQYXRjaCBieSBKZWZmcmV5IEFybXN0cm9uZy4KKworLSBJc3N1ZSAjMTY4MzY6IEVuYWJsZSBJUHY2IHN1cHBvcnQgZXZlbiBpZiBJUHY2IGlzIGRpc2FibGVkIG9uIHRoZSBidWlsZCBob3N0LgorCistIElzc3VlICMxNTkyMzogZml4IGEgbWlzdGFrZSBpbiBhc2RsX2MucHkgdGhhdCByZXN1bHRlZCBpbiBhIFR5cGVFcnJvciBhZnRlcgorICAyODAxYmY4NzVhMjQgKHNlZSAjMTU4MDEpLgorCistIElzc3VlICMxMTcxNTogRml4IG11bHRpYXJjaCBkZXRlY3Rpb24gd2l0aG91dCBoYXZpbmcgRGViaWFuIGRldmVsb3BtZW50CisgIHRvb2xzIChkcGtnLWRldikgaW5zdGFsbGVkLgorCistIElzc3VlICMxNTgxOTogTWFrZSBzdXJlIHdlIGNhbiBidWlsZCBQeXRob24gb3V0LW9mLXRyZWUgZnJvbSBhIHJlYWRvbmx5CisgIHNvdXJjZSBkaXJlY3RvcnkuICAoU29tZXdoYXQgcmVsYXRlZCB0byBJc3N1ZSAjOTg2MC4pCisKKy0gSXNzdWUgIzE1ODIyOiBFbnN1cmUgMnRvMyBncmFtbWFyIHBpY2tsZXMgYXJlIHByb3Blcmx5IGluc3RhbGxlZC4KKworLSBJc3N1ZSAjMTU1NjA6IEZpeCBidWlsZGluZyBfc3FsaXRlMyBleHRlbnNpb24gb24gT1MgWCB3aXRoIGFuIFNESy4KKworLSBJc3N1ZSAjODg0NzogRGlzYWJsZSBDT01EQVQgZm9sZGluZyBpbiBXaW5kb3dzIFBHTyBidWlsZHMuCisKKy0gSXNzdWUgIzE0MDE4OiBGaXggT1MgWCBUY2wvVGsgZnJhbWV3b3JrIGNoZWNraW5nIHdoZW4gdXNpbmcgT1MgWCBTREtzLgorCistIElzc3VlICMxNjI1NjogT1MgWCBpbnN0YWxsZXIgbm93IHNldHMgY29ycmVjdCBwZXJtaXNzaW9ucyBmb3IgZG9jIGRpcmVjdG9yeS4KKworLSBJc3N1ZSAjODc2NzogUmVzdG9yZSBidWlsZGluZyB3aXRoIC0tZGlzYWJsZS11bmljb2RlLgorICBQYXRjaCBieSBTdGVmYW5vIFRhc2NoaW5pLgorCistIEJ1aWxkIGFnYWluc3QgYnppcDIgMS4wLjYgYW5kIG9wZW5zc2wgMC45Ljh4IG9uIFdpbmRvd3MuCisKKy0gSXNzdWUgIzE0NTU3OiBGaXggZXh0ZW5zaW9ucyBidWlsZCBvbiBIUC1VWC4gUGF0Y2ggYnkgQWRpIFJvaWJhbi4KKworLSBJc3N1ZSAjMTQ0Mzc6IEZpeCBidWlsZGluZyB0aGUgX2lvIG1vZHVsZSB1bmRlciBDeWd3aW4uCisKKy0gSXNzdWUgIzE1NTg3OiBFbmFibGUgVGsgaGlnaC1yZXNvbHV0aW9uIHRleHQgcmVuZGVyaW5nIG9uIE1hY3Mgd2l0aAorICBSZXRpbmEgZGlzcGxheXMuICBBcHBsaWVzIHRvIFRraW50ZXIgYXBwcywgc3VjaCBhcyBJRExFLCBvbiBPUyBYCisgIGZyYW1ld29yayBidWlsZHMgbGlua2VkIHdpdGggQ29jb2EgVGsgOC41LgorCistIElzc3VlICMxNzE2MTogbWFrZSBpbnN0YWxsIG5vdyBhbHNvIGluc3RhbGxzIGEgcHl0aG9uMiBhbmQgcHl0aG9uIG1hbiBwYWdlLgorCistIElzc3VlICMxNjg0ODogcHl0aG9uLWNvbmZpZyBub3cgcmV0dXJucyBwcm9wZXIgLS1sZGZsYWdzIHZhbHVlcyBmb3IgT1MgWAorICBmcmFtZXdvcmsgYnVpbGRzLgorCitUb29scy9EZW1vcworLS0tLS0tLS0tLS0KKworLSBJc3N1ZSAjMTcxNTY6IHB5Z2V0dGV4dC5weSBub3cgY29ycmVjdGx5IGVzY2FwZXMgbm9uLWFzY2lpIGNoYXJhY3RlcnMuCisKKy0gSXNzdWUgIzE1NTM5OiBGaXggYSBudW1iZXIgb2YgYnVncyBpbiBUb29scy9zY3JpcHRzL3BpbmRlbnQucHkuICBOb3cKKyAgcGluZGVudC5weSB3b3JrcyB3aXRoIGEgIndpdGgiIHN0YXRlbWVudC4gIHBpbmRlbnQucHkgbm8gbG9uZ2VyIHByb2R1Y2VzCisgIGltcHJvcGVyIGluZGVudGF0aW9uLiAgcGluZGVudC5weSBub3cgd29ya3Mgd2l0aCBjb250aW51ZWQgbGluZXMgYnJva2VuIGFmdGVyCisgICJjbGFzcyIgb3IgImRlZiIga2V5d29yZHMgYW5kIHdpdGggY29udGludWF0aW9ucyBhdCB0aGUgc3RhcnQgb2YgbGluZS4KKworLSBJc3N1ZSAjMTY0NzY6IEZpeCBqc29uLnRvb2wgdG8gYXZvaWQgaW5jbHVkaW5nIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisKKy0gSXNzdWUgIzEzMzAxOiB1c2UgYXN0LmxpdGVyYWxfZXZhbCgpIGluc3RlYWQgb2YgZXZhbCgpIGluIFRvb2xzL2kxOG4vbXNnZm10LnB5CisgIFBhdGNoIGJ5IFNlcmhpeSBTdG9yY2hha2EuCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0KKworLSBJc3N1ZSAjMTUwNDE6IFVwZGF0ZSAic2VlIGFsc28iIGxpc3QgaW4gdGtpbnRlciBkb2N1bWVudGF0aW9uLgorCistIElzc3VlICMxNzQxMjogdXBkYXRlIDIuNyBEb2MvbWFrZS5iYXQgdG8gYWxzbyB1c2Ugc3BoaW54LTEuMC43LgorCistIElzc3VlICMxNzA0NzogcmVtb3ZlIGRvdWJsZWQgd29yZHMgaW4gZG9jcyBhbmQgZG9jc3RyaW5ncworICByZXBvcnRlZCBieSBTZXJoaXkgU3RvcmNoYWthIGFuZCBNYXR0aGV3IEJhcm5ldHQuCisKKy0gSXNzdWUgIzE2NDA2OiBjb21iaW5lIHRoZSBwYWdlcyBmb3IgdXBsb2FkaW5nIGFuZCByZWdpc3RlcmluZyB0byBQeVBJLgorCistIElzc3VlICMxNjQwMzogRG9jdW1lbnQgaG93IGRpc3R1dGlscyB1c2VzIHRoZSBtYWludGFpbmVyIGZpZWxkIGluCisgIFBLRy1JTkZPLiBQYXRjaCBieSBKeXJraSBQdWxsaWFpbmVuLgorCistIElzc3VlICMxNjY5NTogRG9jdW1lbnQgaG93IGdsb2IgaGFuZGxlcyBmaWxlbmFtZXMgc3RhcnRpbmcgd2l0aCBhCisgIGRvdC4gSW5pdGlhbCBwYXRjaCBieSBKeXJraSBQdWxsaWFpbmVuLgorCistIElzc3VlICM4ODkwOiBTdG9wIGFkdmVydGlzaW5nIGFuIGluc2VjdXJlIHByYWN0aWNlIGJ5IHJlcGxhY2luZyB1c2VzCisgIG9mIHRoZSAvdG1wIGRpcmVjdG9yeSB3aXRoIGJldHRlciBhbHRlcm5hdGl2ZXMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisgIFBhdGNoIGJ5IEdlb2ZmIFdpbHNvbi4KKworLSBJc3N1ZSAjMTcyMDM6IGFkZCBsb25nIG9wdGlvbiBuYW1lcyB0byB1bml0dGVzdCBkaXNjb3ZlcnkgZG9jcy4KKworLSBJc3N1ZSAjMTMwOTQ6IGFkZCAiV2h5IGRvIGxhbWJkYXMgZGVmaW5lZCBpbiBhIGxvb3Agd2l0aCBkaWZmZXJlbnQgdmFsdWVzCisgIGFsbCByZXR1cm4gdGhlIHNhbWUgcmVzdWx0PyIgcHJvZ3JhbW1pbmcgRkFRLgorCistIElzc3VlICMxNDkwMTogVXBkYXRlIHBvcnRpb25zIG9mIHRoZSBXaW5kb3dzIEZBUS4KKyAgUGF0Y2ggYnkgQXNoaXNoIE5pdGluIFBhdGlsLgorCistIElzc3VlICMxNTk5MDogSW1wcm92ZSBhcmd1bWVudC9wYXJhbWV0ZXIgZG9jdW1lbnRhdGlvbi4KKworLSBJc3N1ZSAjMTY0MDA6IFVwZGF0ZSB0aGUgZGVzY3JpcHRpb24gb2Ygd2hpY2ggdmVyc2lvbnMgb2YgYSBnaXZlbiBwYWNrYWdlCisgIFB5UEkgZGlzcGxheXMuCisKKy0gSXNzdWUgIzE1Njc3OiBEb2N1bWVudCB0aGF0IHpsaWIgYW5kIGd6aXAgYWNjZXB0IGEgY29tcHJlc3Npb24gbGV2ZWwgb2YgMCB0bworICBtZWFuICdubyBjb21wcmVzc2lvbicuIFBhdGNoIGJ5IEJyaWFuIEJyYXppbC4KKworLSBJc3N1ZSAjODA0MDogYWRkZWQgYSB2ZXJzaW9uIHN3aXRjaGVyIHRvIHRoZSBkb2N1bWVudGF0aW9uLiAgUGF0Y2ggYnkKKyAgWXVyeSBTZWxpdmFub3YuCisKKy0gSXNzdWUgIzE2MTE1OiBJbXByb3ZlIHN1YnByb2Nlc3MuUG9wZW4oKSBkb2N1bWVudGF0aW9uIGFyb3VuZCBhcmdzLCBzaGVsbCwKKyAgYW5kIGV4ZWN1dGFibGUgYXJndW1lbnRzLgorCistIElzc3VlICMxNTk3OTogSW1wcm92ZSB0aW1laXQgZG9jdW1lbnRhdGlvbi4KKworLSBJc3N1ZSAjMTYwMzY6IEltcHJvdmUgZG9jdW1lbnRhdGlvbiBvZiBidWlsdC1pbiBpbnQoKSdzIHNpZ25hdHVyZSBhbmQKKyAgYXJndW1lbnRzLgorCistIElzc3VlICMxNTkzNTogQ2xhcmlmaWNhdGlvbiBvZiBhcmdwYXJzZSBkb2NzLCByZTogYWRkX2FyZ3VtZW50KCkgdHlwZSBhbmQKKyAgZGVmYXVsdCBhcmd1bWVudHMuICBQYXRjaCBjb250cmlidXRlZCBieSBDaHJpcyBKZXJkb25lay4KKworLSBJc3N1ZSAjMTM3Njk6IERvY3VtZW50IHRoZSBlZmZlY3Qgb2YgZW5zdXJlX2FzY2lpIHRvIHRoZSByZXR1cm4gdHlwZQorICBvZiBKU09OIGRlY29kaW5nIGZ1bmN0aW9ucy4KKworLSBJc3N1ZSAjMTQ4ODA6IEZpeCBrd2FyZ3Mgbm90YXRpb24gaW4gY3N2LnJlYWRlciwgLndyaXRlciAmIC5yZWdpc3Rlcl9kaWFsZWN0LgorICBQYXRjaCBieSBDaHJpcyBSZWJlcnQuCisKKy0gSXNzdWUgIzE0Njc0OiBBZGQgYSBkaXNjdXNzaW9uIG9mIHRoZSBqc29uIG1vZHVsZSdzIHN0YW5kYXJkIGNvbXBsaWFuY2UuCisgIFBhdGNoIGJ5IENocmlzIFJlYmVydC4KKworLSBJc3N1ZSAjMTU2MzA6IEFkZCBhbiBleGFtcGxlIGZvciAiY29udGludWUiIHN0bXQgaW4gdGhlIHR1dG9yaWFsLiBQYXRjaCBieQorICBEYW5pZWwgRWxsaXMuCisKKy0gSXNzdWUgIzEzNTU3OiBDbGFyaWZ5IGVmZmVjdCBvZiBnaXZpbmcgdHdvIGRpZmZlcmVudCBuYW1lc3BhY2VzIHRvIGV4ZWMgb3IKKyAgZXhlY2ZpbGUoKS4KKworLSBJc3N1ZSAjMTQwMzQ6IGFkZGVkIHRoZSBhcmdwYXJzZSB0dXRvcmlhbC4KKworLSBJc3N1ZSAjMTUyNTA6IERvY3VtZW50IHRoYXQgZmlsZWNtcC5kaXJjbXAgY29tcGFyZXMgZmlsZXMgc2hhbGxvd2x5LiBQYXRjaAorICBjb250cmlidXRlZCBieSBDaHJpcyBKZXJkb25lay4KKworLSBJc3N1ZSAjMTUxMTY6IFJlbW92ZSByZWZlcmVuY2VzIHRvIGFwcHNjcmlwdCBhcyBpdCBpcyBubyBsb25nZXIgYmVpbmcKKyAgc3VwcG9ydGVkLgorCisKK1doYXQncyBOZXcgaW4gUHl0aG9uIDIuNy4zIHJlbGVhc2UgY2FuZGlkYXRlIDI/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAyMDEyLTAzLTE3KgorCitMaWJyYXJ5CistLS0tLS0tCisKKy0gSXNzdWUgIzE0MjM0OiBDVkUtMjAxMi0wODc2OiBSYW5kb21pemUgaGFzaGVzIG9mIHhtbCBhdHRyaWJ1dGVzIGluIHRoZSBoYXNoCisgIHRhYmxlIGludGVybmFsIHRvIHRoZSBweWV4cGF0IG1vZHVsZSdzIGNvcHkgb2YgdGhlIGV4cGF0IGxpYnJhcnkgdG8gYXZvaWQgYQorICBkZW5pYWwgb2Ygc2VydmljZSBkdWUgdG8gaGFzaCBjb2xsaXNpb25zLiAgUGF0Y2ggYnkgRGF2aWQgTWFsY29sbSB3aXRoIHNvbWUKKyAgbW9kaWZpY2F0aW9ucyBieSB0aGUgZXhwYXQgcHJvamVjdC4KKworCitXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjcuMyByZWxlYXNlIGNhbmRpZGF0ZSAxPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMjAxMi0wMi0yMyoKKworQ29yZSBhbmQgQnVpbHRpbnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gSXNzdWUgIzEzMDIwOiBGaXggYSByZWZlcmVuY2UgbGVhayB3aGVuIGFsbG9jYXRpbmcgYSBzdHJ1Y3RzZXF1ZW5jZSBvYmplY3QKKyAgZmFpbHMuICBQYXRjaCBieSBTdW1hbiBTYWhhLgorCistIElzc3VlICMxMzcwMzogb0NFUlQtMjAxMS0wMDM6IGFkZCAtUiBjb21tYW5kLWxpbmUgb3B0aW9uIGFuZCBQWVRIT05IQVNIU0VFRAorICBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdG8gcHJvdmlkZSBhbiBvcHQtaW4gd2F5IHRvIHByb3RlY3QgYWdhaW5zdCBkZW5pYWwgb2YKKyAgc2VydmljZSBhdHRhY2tzIGR1ZSB0byBoYXNoIGNvbGxpc2lvbnMgd2l0aGluIHRoZSBkaWN0IGFuZCBzZXQgdHlwZXMuICBQYXRjaAorICBieSBEYXZpZCBNYWxjb2xtLCBiYXNlZCBvbiB3b3JrIGJ5IFZpY3RvciBTdGlubmVyLgorCistIElzc3VlICMxMTIzNTogRml4IE92ZXJmbG93RXJyb3Igd2hlbiB0cnlpbmcgdG8gaW1wb3J0IGEgc291cmNlIGZpbGUgd2hvc2UKKyAgbW9kaWZpY2F0aW9uIHRpbWUgZG9lc24ndCBmaXQgaW4gYSAzMi1iaXQgdGltZXN0YW1wLgorCistIElzc3VlICMxMTYzODogVW5pY29kZSBzdHJpbmdzIGluICduYW1lJyBhbmQgJ3ZlcnNpb24nIG5vIGxvbmdlciBjYXVzZQorICBVbmljb2RlRGVjb2RlRXJyb3JzLgorCistIEZpeCB0aGUgZml4IGZvciBpc3N1ZSAjMTIxNDk6IGl0IHdhcyBpbmNvcnJlY3QsIGFsdGhvdWdoIGl0IGhhZCB0aGUgc2lkZQorICBlZmZlY3Qgb2YgYXBwZWFyaW5nIHRvIHJlc29sdmUgdGhlIGlzc3VlLiAgVGhhbmtzIHRvIE1hcmsgU2hhbm5vbiBmb3IKKyAgbm90aWNpbmcuCisKIC0gSXNzdWUgIzEzNTQ2OiBGaXhlZCBhbiBvdmVyZmxvdyBpc3N1ZSB0aGF0IGNvdWxkIGNyYXNoIHRoZSBpbnRlcHJldGVyIHdoZW4KICAgY2FsbGluZyBzeXMuc2V0cmVjdXJzaW9ubGltaXQoKDE8PDMxKS0xKS4KIAogLSBJc3N1ZSAjMTMzMzM6IFRoZSBVVEYtNyBkZWNvZGVyIG5vdyBhY2NlcHRzIGxvbmUgc3Vycm9nYXRlcyAodGhlIGVuY29kZXIKICAgYWxyZWFkeSBhY2NlcHRzIHRoZW0pLgogCi0tIFJlbW92ZSBQeTNrIHdhcm5pbmcgZm9yIGNhbGxhYmxlLgotCiAtIElzc3VlICMxMDUxOTogQXZvaWQgdW5uZWNlc3NhcnkgcmVjdXJzaXZlIGZ1bmN0aW9uIGNhbGxzIGluCiAgIHNldG9iamVjdC5jLgogCkBAIC02Myw4ICsyNDc4LDggQEAKICAgZGVhbGxvY2F0b3IgY2FsbHMgb25lIG9mIHRoZSBtZXRob2RzIG9uIHRoZSB0eXBlIChlLmcuIHdoZW4gc3ViY2xhc3NpbmcKICAgSU9CYXNlKS4gIERpYWdub3NpcyBhbmQgcGF0Y2ggYnkgRGF2aWRlIFJpenpvLgogCi0tIElzc3VlICMxMjUwMTogQWRqdXN0IGNhbGxhYmxlKCkgd2FybmluZzogY2FsbGFibGUoKSBpcyBvbmx5IG5vdCBzdXBwb3J0ZWQgaW4KLSAgUHl0aG9uIDMuMS4gY2FsbGFibGUoKSBpcyBhZ2FpbiBzdXBwb3J0ZWQgaW4gUHl0aG9uIDMuMi4KKy0gSXNzdWUgIzEyNTAxOiBSZW1vdmUgUHkzayB3YXJuaW5nIGZvciBjYWxsYWJsZS4gY2FsbGFibGUoKSBpcyBzdXBwb3J0ZWQKKyAgYWdhaW4gaW4gUHl0aG9uIDMuMi4KIAogLSBJc3N1ZSAjOTYxMSwgIzkwMTU6IEZpbGVJTy5yZWFkKCksIEZpbGVJTy5yZWFkaW50bygpLCBGaWxlSU8ud3JpdGUoKSBhbmQKICAgb3Mud3JpdGUoKSBjbGFtcCB0aGUgbGVuZ3RoIHRvIElOVF9NQVggb24gV2luZG93cy4KQEAgLTgyLDYgKzI0OTcsMTA2IEBACiBMaWJyYXJ5CiAtLS0tLS0tCiAKKy0gSXNzdWUgIzgwMzM6IHNxbGl0ZTM6IEZpeCA2NC1iaXQgaW50ZWdlciBoYW5kbGluZyBpbiB1c2VyIGZ1bmN0aW9ucworICBvbiAzMi1iaXQgYXJjaGl0ZWN0dXJlcy4gSW5pdGlhbCBwYXRjaCBieSBQaGlsaXBwZSBEZXZhbGtlbmVlci4KKworLSBIVE1MUGFyc2VyIGlzIG5vdyBhYmxlIHRvIGhhbmRsZSBzbGFzaGVzIGluIHRoZSBzdGFydCB0YWcuCisKKy0gSXNzdWUgIzE0MDAxOiBDVkUtMjAxMi0wODQ1OiB4bWxycGM6IEZpeCBhbiBlbmRsZXNzIGxvb3AgaW4KKyAgU2ltcGxlWE1MUlBDU2VydmVyIHVwb24gbWFsZm9ybWVkIFBPU1QgcmVxdWVzdC4KKworLSBJc3N1ZSAjMjQ4OTogcHR5LnNwYXduIGNvdWxkIGNvbnN1bWUgMTAwJSBjcHUgd2hlbiBpdCBlbmNvdW50ZXJlZCBhbiBFT0YuCisKKy0gSXNzdWUgIzEzMDE0OiBGaXggYSBwb3NzaWJsZSByZWZlcmVuY2UgbGVhayBpbiBTU0xTb2NrZXQuZ2V0cGVlcmNlcnQoKS4KKworLSBJc3N1ZSAjMTM5ODc6IEhUTUxQYXJzZXIgaXMgbm93IGFibGUgdG8gaGFuZGxlIEVPRnMgaW4gdGhlIG1pZGRsZSBvZiBhCisgIGNvbnN0cnVjdCBhbmQgbWFsZm9ybWVkIHN0YXJ0IHRhZ3MuCisKKy0gSXNzdWUgIzEzMDE1OiBGaXggYSBwb3NzaWJsZSByZWZlcmVuY2UgbGVhayBpbiBkZWZhdWx0ZGljdC5fX3JlcHJfXy4KKyAgUGF0Y2ggYnkgU3VtYW4gU2FoYS4KKworLSBJc3N1ZSAjMTM5Nzk6IEEgYnVnIGluIGN0eXBlcy51dGlsLmZpbmRfbGlicmFyeSB0aGF0IGNhdXNlZAorICB0aGUgd3JvbmcgbGlicmFyeSBuYW1lIHRvIGJlIHJldHVybmVkIGhhcyBiZWVuIGZpeGVkLgorCistIElzc3VlICMxMzI2MTEzOiBkaXN0dXRpbHMnIGJ1aWxkX2V4dCBjb21tYW5kIC0tbGlicmFyaWVzIG9wdGlvbiBub3cKKyAgY29ycmVjdGx5IHBhcnNlcyBtdWx0aXBsZSB2YWx1ZXMgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2Ugb3IgY29tbWFzLgorCistIElzc3VlICMxMzk5MzogSFRNTFBhcnNlciBpcyBub3cgYWJsZSB0byBoYW5kbGUgYnJva2VuIGVuZCB0YWdzLgorCistIElzc3VlICMxMzk2MDogSFRNTFBhcnNlciBpcyBub3cgYWJsZSB0byBoYW5kbGUgYnJva2VuIGNvbW1lbnRzLgorCistIElzc3VlICM5NzUwOiBGaXggc3FsaXRlMy5Db25uZWN0aW9uLml0ZXJkdW1wIG9uIHRhYmxlcyBhbmQgZmllbGRzCisgIHdpdGggYSBuYW1lIHRoYXQgaXMgYSBrZXl3b3JkIG9yIGNvbnRhaW5zIHF1b3Rlcy4gUGF0Y2ggYnkgTWFya28KKyAgS29odGFsYS4KKworLSBJc3N1ZSAjMTM5OTQ6IEVhcmxpZXIgcGFydGlhbCByZXZlcnQgb2YgRGlzdHV0aWxzIGVuaGFuY2VtZW50cyBpbiAyLjcKKyAgaGFzIGxlZnQgdHdvIHZlcnNpb25zIG9mIGN1c3RvbWl6ZV9jb21waWxlciwgdGhlIG9yaWdpbmFsIGluCisgIGRpc3R1dGlscy5zeXNjb25maWcgYW5kIGFub3RoZXIgY29weSBpbiBkaXN0dXRpbHMuY2NvbXBpbGVyLCB3aXRoIHNvbWUKKyAgcGFydHMgb2YgZGlzdHV0aWxzIGNhbGxpbmcgb25lIGFuZCBvdGhlcnMgdXNpbmcgdGhlIG90aGVyLgorICBDb21wbGV0ZSB0aGUgcmV2ZXJ0IGJhY2sgdG8gb25seSBoYXZpbmcgb25lIGluIGRpc3R1dGlscy5zeXNjb25maWcgYXMKKyAgaXMgdGhlIGNhc2UgaW4gMy54LgorCistIElzc3VlICMxMzU5MDogT24gT1MgWCAxMC43IGFuZCAxMC42IHdpdGggWGNvZGUgNC4yLCBidWlsZGluZworICBEaXN0dXRpbHMtYmFzZWQgcGFja2FnZXMgd2l0aCBDIGV4dGVuc2lvbiBtb2R1bGVzIG1heSBmYWlsIGJlY2F1c2UKKyAgQXBwbGUgaGFzIHJlbW92ZWQgZ2NjLTQuMiwgdGhlIHZlcnNpb24gdXNlZCB0byBidWlsZCBweXRob24ub3JnCisgIDY0LWJpdC8zMi1iaXQgUHl0aG9ucy4gIElmIHRoZSB1c2VyIGRvZXMgbm90IGV4cGxpY2l0bHkgb3ZlcnJpZGUKKyAgdGhlIGRlZmF1bHQgQyBjb21waWxlciBieSBzZXR0aW5nIHRoZSBDQyBlbnZpcm9ubWVudCB2YXJpYWJsZSwKKyAgRGlzdHV0aWxzIHdpbGwgbm93IGF0dGVtcHQgdG8gY29tcGlsZSBleHRlbnNpb24gbW9kdWxlcyB3aXRoIGNsYW5nCisgIGlmIGdjYy00LjIgaXMgcmVxdWlyZWQgYnV0IG5vdCBmb3VuZC4gQWxzbyBhcyBhIGNvbnZlbmllbmNlLCBpZgorICB0aGUgdXNlciBkb2VzIGV4cGxpY2l0bHkgc2V0IENDLCBzdWJzdGl0dXRlIGl0cyB2YWx1ZSBhcyB0aGUgZGVmYXVsdAorICBjb21waWxlciBpbiB0aGUgRGlzdHV0aWxzIExEU0hBUkVEIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgZm9yIE9TIFguCisgIChOb3RlLCB0aGUgcHl0aG9uLm9yZyAzMi1iaXQtb25seSBQeXRob25zIHVzZSBnY2MtNC4wIGFuZCB0aGUgMTAuNHUKKyAgU0RLLCBuZWl0aGVyIG9mIHdoaWNoIGFyZSBhdmFpbGFibGUgaW4gWGNvZGUgNC4gIFRoaXMgY2hhbmdlIGRvZXMgbm90CisgIGF0dGVtcHQgdG8gb3ZlcnJpZGUgc2V0dGluZ3MgdG8gc3VwcG9ydCB0aGVpciB1c2Ugd2l0aCBYY29kZSA0LikKKworLSBJc3N1ZSAjOTAyMTogQWRkIGFuIGludHJvZHVjdGlvbiB0byB0aGUgY29weSBtb2R1bGUgZG9jdW1lbnRhdGlvbi4KKworLSBJc3N1ZSAjNjAwNTogRXhhbXBsZXMgaW4gdGhlIHNvY2tldCBsaWJyYXJ5IGRvY3VtZW50YXRpb24gdXNlIHNlbmRhbGwsIHdoZXJlCisgIHJlbGV2YW50LCBpbnN0ZWFkIHNlbmQgbWV0aG9kLgorCistIElzc3VlICMxMDgxMTogRml4IHJlY3Vyc2l2ZSB1c2FnZSBvZiBjdXJzb3JzLiBJbnN0ZWFkIG9mIGNyYXNoaW5nLAorICByYWlzZSBhIFByb2dyYW1taW5nRXJyb3Igbm93LgorCistIElzc3VlICMxMzY3NjogSGFuZGxlIHN0cmluZ3Mgd2l0aCBlbWJlZGRlZCB6ZXJvcyBjb3JyZWN0bHkgaW4gc3FsaXRlMy4KKworLSBJc3N1ZSAjMTM4MDY6IFRoZSBzaXplIGNoZWNrIGluIGF1ZGlvb3AgZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMgd2FzIHRvbworICBzdHJpY3QgYW5kIGNvdWxkIHJlamVjdCB2YWxpZCBjb21wcmVzc2VkIGRhdGEuICBQYXRjaCBieSBPbGVnIFBsYWtob3RueXVrLgorCistIElzc3VlICMxMzg4NTogQ1ZFLTIwMTEtMzM4OTogdGhlIF9zc2wgbW9kdWxlIHdvdWxkIGFsd2F5cyBkaXNhYmxlIHRoZSBDQkMKKyAgSVYgYXR0YWNrIGNvdW50ZXJtZWFzdXJlLgorCistIElzc3VlICM2NjMxOiBEaXNhbGxvdyByZWxhdGl2ZSBmaWxlIHBhdGhzIGluIHVybGxpYiB1cmxvcGVuIG1ldGhvZHMuCisKKy0gSXNzdWUgIzEzNzgxOiBQcmV2ZW50IGd6aXAuR3ppcEZpbGUgZnJvbSB1c2luZyB0aGUgZHVtbXkgZmlsZW5hbWUgcHJvdmlkZWQgYnkKKyAgZmlsZSBvYmplY3RzIG9wZW5lZCB3aXRoIG9zLmZkb3BlbigpLgorCistIElzc3VlICMxMzU4OTogRml4IHNvbWUgc2VyaWFsaXphdGlvbiBwcmltaXRpdmVzIGluIHRoZSBhaWZjIG1vZHVsZS4KKyAgUGF0Y2ggYnkgT2xlZyBQbGFraG90bnl1ay4KKworLSBJc3N1ZSAjMTM4MDM6IFVuZGVyIFNvbGFyaXMsIGRpc3R1dGlscyBkb2Vzbid0IGluY2x1ZGUgYml0bmVzcworICBpbiB0aGUgZGlyZWN0b3J5IG5hbWUuCisKKy0gSXNzdWUgIzEzNjQyOiBVbnF1b3RlIGJlZm9yZSBiNjRlbmNvZGluZyB1c2VyOnBhc3N3b3JkIGR1cmluZyBCYXNpYworICBBdXRoZW50aWNhdGlvbi4gUGF0Y2ggY29udHJpYnV0ZWQgYnkgSm9vbmFzIEt1b3JpbGVodG8gYW5kIE1pY2hlbGUgT3Jyw7kuCisKKy0gSXNzdWUgIzEzNjM2OiBXZWFrIGNpcGhlcnMgYXJlIG5vdyBkaXNhYmxlZCBieSBkZWZhdWx0IGluIHRoZSBzc2wgbW9kdWxlCisgIChleGNlcHQgd2hlbiBTU0x2MiBpcyBleHBsaWNpdGx5IGFza2VkIGZvcikuCisKKy0gSXNzdWUgIzEyNzk4OiBVcGRhdGVkIHRoZSBtaW1ldHlwZXMgZG9jdW1lbnRhdGlvbi4KKworLSBJc3N1ZSAjMTM2Mzk6IEFjY2VwdCB1bmljb2RlIGZpbGVuYW1lcyBpbiB0YXJmaWxlLm9wZW4obW9kZT0id3xneiIpLgorCistIElzc3VlICMxNzg1OiBGaXggaW5zcGVjdCBhbmQgcHlkb2Mgd2l0aCBtaXNiZWhhdmluZyBkZXNjcmlwdG9ycy4KKworLSBJc3N1ZSAjNzUwMjogRml4IGVxdWFsaXR5IGNvbXBhcmlzb24gZm9yIERvY1Rlc3RDYXNlIGluc3RhbmNlcy4gIFBhdGNoIGJ5CisgIEPDqWRyaWMgS3JpZXIuCisKKy0gSXNzdWUgIzExODcwOiB0aHJlYWRpbmc6IFByb3Blcmx5IHJlaW5pdGlhbGl6ZSB0aHJlYWRzIGludGVybmFsIGxvY2tzIGFuZAorICBjb25kaXRpb24gdmFyaWFibGVzIHRvIGF2b2lkIGRlYWRsb2NrcyBpbiBjaGlsZCBwcm9jZXNzZXMuCisKKy0gSXNzdWUgIzgwMzU6IHVybGxpYjogRml4IGEgYnVnIHdoZXJlIHRoZSBjbGllbnQgY291bGQgcmVtYWluIHN0dWNrIGFmdGVyIGEKKyAgcmVkaXJlY3Rpb24gb3IgYW4gZXJyb3IuCisKIC0gdGFyZmlsZS5weTogQ29ycmVjdGx5IGRldGVjdCBiemlwMiBjb21wcmVzc2VkIHN0cmVhbXMgd2l0aCBibG9ja3NpemVzCiAgIG90aGVyIHRoYW4gOTAway4KIApAQCAtMTExLDE1ICsyNjI2LDkgQEAKICAgbm9kZSB3aGVuIGl0IGlzIHRoZSBvbmx5IGNoaWxkIG9mIGFuIGVsZW1lbnQuICBJbml0aWFsIHBhdGNoIGJ5IERhbgogICBLZW5pZ3NiZXJnLgogCi0tIElzc3VlICM4NzkzOiBQcmV2ZW50IElETEUgY3Jhc2ggd2hlbiBnaXZlbiBzdHJpbmdzIHdpdGggaW52YWxpZCBoZXggZXNjYXBlCi0gIHNlcXVlbmNlcy4KLQogLSBJc3N1ZXMgIzE3NDU3NjEsICM3NTU2NzAsICMxMzM1NywgIzEyNjI5LCAjMTIwMDMxMzogSFRNTFBhcnNlciBub3cgY29ycmVjdGx5CiAgIGhhbmRsZXMgbm9uLXZhbGlkIGF0dHJpYnV0ZXMsIGluY2x1ZGluZyBhZGphY2VudCBhbmQgdW5xdW90ZWQgYXR0cmlidXRlcy4KIAotLSBJc3N1ZSAjMTMxOTM6IEZpeCBkaXN0dXRpbHMuZmlsZWxpc3QuRmlsZUxpc3QgdW5kZXIgV2luZG93cy4gIFRoZQotICAicmVjdXJzaXZlLWluY2x1ZGUiIGRpcmVjdGl2ZSBub3cgcmVjb2duaXplcyBib3RoIGxlZ2FsIHBhdGggc2VwYXJhdG9ycy4KLQogLSBJc3N1ZSAjMTMzNzM6IG11bHRpcHJvY2Vzc2luZy5RdWV1ZS5nZXQoKSBjb3VsZCBzb21ldGltZXMgYmxvY2sgaW5kZWZpbml0ZWx5CiAgIHdoZW4gY2FsbGVkIHdpdGggYSB0aW1lb3V0LiAgUGF0Y2ggYnkgQXJuYXVkIFlzbWFsLgogCkBAIC0xMzksOSArMjY0OCw2IEBACiAtIElzc3VlICMxMDgxNzogRml4IHVybHJldHJpZXZlIGZ1bmN0aW9uIHRvIHJhaXNlIENvbnRlbnRUb29TaG9ydEVycm9yIGV2ZW4KICAgd2hlbiByZXBvcnRob29rIGlzIE5vbmUuIFBhdGNoIGJ5IEp5cmtpIFB1bGxpYWluZW4uCiAKLS0gSXNzdWUgIzEzMjk2OiBGaXggSURMRSB0byBjbGVhciBjb21waWxlIF9fZnV0dXJlX18gZmxhZ3Mgb24gc2hlbGwgcmVzdGFydC4KLSAgKFBhdGNoIGJ5IFJvZ2VyIFNlcnd5KQotCiAtIElzc3VlICM3MzM0OiBjbG9zZSBzb3VyY2UgZmlsZXMgb24gRWxlbWVudFRyZWUucGFyc2UgYW5kIGl0ZXJwYXJzZS4KIAogLSBJc3N1ZSAjMTMyMzI6IGxvZ2dpbmc6IEltcHJvdmVkIGxvZ2dpbmcgb2YgZXhjZXB0aW9ucyBpbiB0aGUgcHJlc2VuY2Ugb2YKQEAgLTI5NSw3ICsyODAxLDcgQEAKICAgY2hlY2sgb3Igc2V0IHRoZSBNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yIHRoZQogICBpbnRlcnByZXRlciBwcm9jZXNzLiAgVGhpcyBjb3VsZCBjYXVzZSBmYWlsdXJlcyBpbiBub24tRGlzdHV0aWxzIHN1YnByb2Nlc3NlcwogICBhbmQgd2FzIHVucmVsaWFibGUgc2luY2UgdGVzdHMgb3IgdXNlciBwcm9ncmFtcyBjb3VsZCBtb2RpZnkgdGhlIGludGVycHJldGVyCi0gIGVudmlyb25tZW50IGFmdGVyIERpc3R1dGlscyBzZXQgaXQuICBJbnN0ZWFkLCBoYXZlIERpc3R1dGlscyBzZXQgdGhlIHRoZQorICBlbnZpcm9ubWVudCBhZnRlciBEaXN0dXRpbHMgc2V0IGl0LiAgSW5zdGVhZCwgaGF2ZSBEaXN0dXRpbHMgc2V0IHRoZQogICBkZXBsb3ltZW50IHRhcmdldCBvbmx5IGluIHRoZSBlbnZpcm9ubWVudCBvZiBlYWNoIGJ1aWxkIHN1YnByb2Nlc3MuICBJdCBpcwogICBzdGlsbCBwb3NzaWJsZSB0byBnbG9iYWxseSBvdmVycmlkZSB0aGUgZGVmYXVsdCBieSBzZXR0aW5nCiAgIE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCBiZWZvcmUgbGF1bmNoaW5nIHRoZSBpbnRlcnByZXRlcjsgaXRzIHZhbHVlIG11c3QgYmUKQEAgLTM0Miw2ICsyODQ4LDE5IEBACiBFeHRlbnNpb24gTW9kdWxlcwogLS0tLS0tLS0tLS0tLS0tLS0KIAorLSBJc3N1ZSAjOTA0MTogQW4gaXNzdWUgaW4gY3R5cGVzLmNfbG9uZ2RvdWJsZSwgY3R5cGVzLmNfZG91YmxlLCBhbmQKKyAgY3R5cGVzLmNfZmxvYXQgdGhhdCBjYXVzZWQgYW4gaW5jb3JyZWN0IGV4Y2VwdGlvbiB0byBiZSByZXR1cm5lZCBpbiB0aGUKKyAgY2FzZSBvZiBvdmVyZmxvdyBoYXMgYmVlbiBmaXhlZC4KKworLSBic2RkYiBtb2R1bGU6IEVycmF0aWMgYmVoYXZpb3VyIG9mICJEQkVudi0+cmVwX2VsZWN0KCkiIGJlY2F1c2UgYSB0eXBvLgorICBQb3NzaWJsZSBjcmFzaC4KKworLSBJc3N1ZSAjMTM3NzQ6IGpzb246IEZpeCBhIFN5c3RlbUVycm9yIHdoZW4gYSBib2d1cyBlbmNvZGluZyBpcyBwYXNzZWQgdG8KKyAganNvbi5sb2FkcygpLgorCistIElzc3VlICM5OTc1OiBzb2NrZXQ6IEZpeCBpbmNvcnJlY3QgdXNlIG9mIGZsb3dpbmZvIGFuZCBzY29wZV9pZC4gUGF0Y2ggYnkKKyAgVmlsbW9zIE5lYmVoYWouCisKIC0gSXNzdWUgIzEzMTU5OiBGaWxlSU8sIEJaMkZpbGUsIGFuZCB0aGUgYnVpbHQtaW4gZmlsZSBjbGFzcyBub3cgdXNlIGEKICAgbGluZWFyLXRpbWUgYnVmZmVyIGdyb3d0aCBzdHJhdGVneSBpbnN0ZWFkIG9mIGEgcXVhZHJhdGljIG9uZS4KIApAQCAtMzczLDkgKzI4OTIsNDUgQEAKICAgc2lnbmF0dXJlLiAgV2l0aG91dCB0aGlzLCBhcmNoaXRlY3R1cmVzIHdoZXJlIHNpemVvZiB2b2lkKiAhPSBzaXplb2YgaW50IGFyZQogICBicm9rZW4uICBQYXRjaCBnaXZlbiBieSBIYWxsdmFyZCBCIEZ1cnVzZXRoLgogCitJRExFCistLS0tCisKKy0gSXNzdWUgIzk2NDQzNyBNYWtlIElETEUgaGVscCB3aW5kb3cgbm9uLW1vZGFsLgorICBQYXRjaCBieSBHdWlsaGVybWUgUG9sbyBhbmQgUm9nZXIgU2Vyd3kuCisKKy0gSXNzdWUgIzEzOTMzOiBJRExFIGF1dG8tY29tcGxldGUgZGlkIG5vdCB3b3JrIHdpdGggc29tZSBpbXBvcnRlZAorICBtb2R1bGUsIGxpa2UgaGFzaGxpYi4gIChQYXRjaCBieSBSb2dlciBTZXJ3eSkKKworLSBJc3N1ZSAjMTM1MDY6IEFkZCAnJyB0byBwYXRoIGZvciBJRExFIFNoZWxsIHdoZW4gc3RhcnRlZCBhbmQgcmVzdGFydGVkIHdpdGggUmVzdGFydCBTaGVsbC4KKyAgT3JpZ2luYWwgcGF0Y2hlcyBieSBNYXJjbyBTY2F0YWdsaW5pIGFuZCBSb2dlciBTZXJ3eS4KKworLSBJc3N1ZSAjNDYyNTogSWYgSURMRSBjYW5ub3Qgd3JpdGUgdG8gaXRzIHJlY2VudCBmaWxlIG9yIGJyZWFrcG9pbnQKKyAgZmlsZXMsIGRpc3BsYXkgYSBtZXNzYWdlIHBvcHVwIGFuZCBjb250aW51ZSByYXRoZXIgdGhhbiBjcmFzaC4KKyAgKG9yaWdpbmFsIHBhdGNoIGJ5IFJvZ2VyIFNlcnd5KQorCistIElzc3VlICM4NzkzOiBQcmV2ZW50IElETEUgY3Jhc2ggd2hlbiBnaXZlbiBzdHJpbmdzIHdpdGggaW52YWxpZCBoZXggZXNjYXBlCisgIHNlcXVlbmNlcy4KKworLSBJc3N1ZSAjMTMyOTY6IEZpeCBJRExFIHRvIGNsZWFyIGNvbXBpbGUgX19mdXR1cmVfXyBmbGFncyBvbiBzaGVsbCByZXN0YXJ0LgorICAoUGF0Y2ggYnkgUm9nZXIgU2Vyd3kpCisKKy0gSXNzdWUgIzE0NDA5OiBJRExFIG5vdyBwcm9wZXJseSBleGVjdXRlcyBjb21tYW5kcyBpbiB0aGUgU2hlbGwgd2luZG93CisgIHdoZW4gaXQgY2Fubm90IHJlYWQgdGhlIG5vcm1hbCBjb25maWcgZmlsZXMgb24gc3RhcnR1cCBhbmQKKyAgaGFzIHRvIHVzZSB0aGUgYnVpbHQtaW4gZGVmYXVsdCBrZXkgYmluZGluZ3MuCisgIFRoZXJlIHdhcyBwcmV2aW91c2x5IGEgYnVnIGluIG9uZSBvZiB0aGUgZGVmYXVsdHMuCisKKy0gSXNzdWUgIzM1NzM6IElETEUgaGFuZ3Mgd2hlbiBwYXNzaW5nIGludmFsaWQgY29tbWFuZCBsaW5lIGFyZ3MKKyAgKGRpcmVjdG9yeShpZXMpIGluc3RlYWQgb2YgZmlsZShzKSkuCisKIEJ1aWxkCiAtLS0tLQogCistIElzc3VlICM2ODA3OiBSdW4gbXNpc3VwcG9ydC5tYWsgZWFybGllci4KKworLSBJc3N1ZSAjMTA1ODA6IE1pbm9yIGdyYW1tYXIgY2hhbmdlIGluIFdpbmRvd3MgaW5zdGFsbGVyLgorCistIElzc3VlICMxMjYyNzogSW1wbGVtZW50IFBFUCAzOTQgZm9yIFB5dGhvbiAyLjcgKCJweXRob24yIikuCisKIC0gSXNzdWUgIzg3NDY6IENvcnJlY3QgZmF1bHR5IGNvbmZpZ3VyZSBjaGVja3Mgc28gdGhhdCBvcy5jaGZsYWdzKCkgYW5kCiAgIG9zLmxjaGZsYWdzKCkgYXJlIG9uY2UgYWdhaW4gYnVpbHQgb24gc3lzdGVtcyB0aGF0IHN1cHBvcnQgdGhlc2UKICAgZnVuY3Rpb25zICgqQlNEIGFuZCBPUyBYKS4gIEFsc28gYWRkIG5ldyBzdGF0IGZpbGUgZmxhZ3MgZm9yIE9TIFgKQEAgLTM4NCwxMiArMjkzOSwzMyBAQAogVG9vbHMvRGVtb3MKIC0tLS0tLS0tLS0tCiAKKy0gSXNzdWUgIzE0MDUzOiBwYXRjaGNoZWNrLnB5ICgibWFrZSBwYXRjaGNoZWNrIikgbm93IHdvcmtzIHdpdGggTVEgcGF0Y2hlcy4KKyAgUGF0Y2ggYnkgRnJhbmNpc2NvIE1hcnTDrW4gQnJ1Z3XDqS4KKworLSBJc3N1ZSAjMTM5MzA6IDJ0bzMgaXMgbm93IGFibGUgdG8gd3JpdGUgaXRzIGNvbnZlcnRlZCBvdXRwdXQgZmlsZXMgdG8gYW5vdGhlcgorICBkaXJlY3RvcnkgdHJlZSBhcyB3ZWxsIGFzIGNvcHlpbmcgdW5jaGFuZ2VkIGZpbGVzIGFuZCBhbHRlcmluZyB0aGUgZmlsZQorICBzdWZmaXguICBTZWUgaXRzIG5ldyAtbywgLVcgYW5kIC0tYWRkLXN1ZmZpeCBvcHRpb25zLiAgVGhpcyBtYWtlcyBpdCBtb3JlCisgIHVzZWZ1bCBpbiBtYW55IGF1dG9tYXRlZCBjb2RlIHRyYW5zbGF0aW9uIHdvcmtmbG93cy4KKwogLSBJc3N1ZSAjMTA2Mzk6IHJlaW5kZW50LnB5IG5vIGxvbmdlciBjb252ZXJ0cyBuZXdsaW5lcyBhbmQgd2lsbCByYWlzZQogICBhbiBlcnJvciBpZiBhdHRlbXB0aW5nIHRvIGNvbnZlcnQgYSBmaWxlIHdpdGggbWl4ZWQgbmV3bGluZXMuCiAKKy0gSXNzdWUgIzEzNjI4OiBweXRob24tZ2RiLnB5IGlzIG5vdyBhYmxlIHRvIHJldHJpZXZlIG1vcmUgZnJhbWVzIGluIHRoZSBQeXRob24KKyAgdHJhY2ViYWNrIGlmIFB5dGhvbiBpcyBvcHRpbWl6ZWQuCisKIFRlc3RzCiAtLS0tLQogCistIElzc3VlICMxNTQ2NzogTW92ZSBoZWxwZXJzIGZvciBfX3NpemVvZl9fIHRlc3RzIGludG8gdGVzdF9zdXBwb3J0LgorICBQYXRjaCBieSBTZXJoaXkgU3RvcmNoYWthLgorCistIElzc3VlICMxMTY4OTogRml4IGEgdmFyaWFibGUgc2NvcGluZyBlcnJvciBpbiBhbiBzcWxpdGUzIHRlc3QuCisgIEluaXRpYWwgcGF0Y2ggYnkgVG9yc3RlbiBMYW5kc2Nob2ZmLgorCistIElzc3VlICMxMDg4MTogRml4IHRlc3Rfc2l0ZSBmYWlsdXJlcyB3aXRoIE9TIFggZnJhbWV3b3JrIGJ1aWxkcy4KKworLSBJc3N1ZSAjMTM5MDE6IFByZXZlbnQgdGVzdF9kaXN0dXRpbHMgZmFpbHVyZXMgb24gT1MgWCB3aXRoIC0tZW5hYmxlLXNoYXJlZC4KKwogLSBJc3N1ZSAjMTMzMDQ6IFNraXAgdGVzdCBjYXNlIGlmIHVzZXIgc2l0ZS1wYWNrYWdlcyBkaXNhYmxlZCAoLXMgb3IKICAgUFlUSE9OTk9VU0VSU0lURSkuICAoUGF0Y2ggYnkgQ2FybCBNZXllcikKIApAQCAtNDM5LDYgKzMwMTUsMTYgQEAKIERvY3VtZW50YXRpb24KIC0tLS0tLS0tLS0tLS0KIAorLSBJc3N1ZXMgIzEzNDkxIGFuZCAjMTM5OTU6IEZpeCBtYW55IGVycm9ycyBpbiBzcWxpdGUzIGRvY3VtZW50YXRpb24uCisgIEluaXRpYWwgcGF0Y2ggZm9yICMxMzQ5MSBieSBKb2hhbm5lcyBWb2dlbC4KKworLSBJc3N1ZSAjMTM0MDI6IERvY3VtZW50IGFic29sdXRlbmVzcyBvZiBzeXMuZXhlY3V0YWJsZS4KKworLSBJc3N1ZSAjMTM4ODM6IFBZVEhPTkNBU0VPSyBhbHNvIHdvcmtzIG9uIE9TIFgsIE9TLzIsIGFuZCBSaXNjT1MuCisKKy0gSXNzdWUgIzIxMzQ6IFRoZSB0b2tlbml6ZSBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIGNsYXJpZmllZCB0byBleHBsYWluIHdoeQorICBhbGwgb3BlcmF0b3IgYW5kIGRlbGltaXRlciB0b2tlbnMgYXJlIHRyZWF0ZWQgYXMgdG9rZW4uT1AgdG9rZW5zLgorCiAtIElzc3VlICMxMzUxMzogRml4IGlvLklPQmFzZSBkb2N1bWVudGF0aW9uIHRvIGNvcnJlY3RseSBsaW5rIHRvIHRoZQogICBpby5JT0Jhc2UucmVhZGxpbmUgbWV0aG9kIGluc3RlYWQgb2YgdGhlIHJlYWRsaW5lIG1vZHVsZS4KIApAQCAtNTM3LDcgKzMxMjMsNyBAQAogICByYXRoZXIgdGhhbiB0aGUgUHlfSXNJbml0aWFsaXplZCBmbGFnLCBhdm9pZGluZyBhIEZhdGFsIFB5dGhvbgogICBlcnJvciBpbiBjZXJ0YWluIGNpcmN1bXN0YW5jZXMgd2hlbiBhbiBpbXBvcnQgaXMgZG9uZSBpbiBfX2RlbF9fLgogCi0tIGlzc3VlICMxMTgyODogc3RhcnRzd2l0aCBhbmQgZW5kc3dpdGggZG9uJ3QgYWNjZXB0IE5vbmUgYXMgc2xpY2UgaW5kZXguCistIElzc3VlICMxMTgyODogc3RhcnRzd2l0aCBhbmQgZW5kc3dpdGggZG9uJ3QgYWNjZXB0IE5vbmUgYXMgc2xpY2UgaW5kZXguCiAgIFBhdGNoIGJ5IFRvcnN0ZW4gQmVja2VyLgogCiAtIElzc3VlICMxMDY3NDogUmVtb3ZlIHVudXNlZCAnZGljdG1ha2VyJyBydWxlIGZyb20gZ3JhbW1hci4KQEAgLTU1Miw5ICszMTM4LDYgQEAKIExpYnJhcnkKIC0tLS0tLS0KIAotLSBJc3N1ZSAjMTI1OTA6IElETEUgZWRpdG9yIHdpbmRvdyBub3cgYWx3YXlzIGRpc3BsYXlzIHRoZSBmaXJzdCBsaW5lCi0gIHdoZW4gb3BlbmluZyBhIGxvbmcgZmlsZS4gIFdpdGggVGsgOC41LCB0aGUgZmlyc3QgbGluZSB3YXMgaGlkZGVuLgotCiAtIElzc3VlICMxMjE2MTogQ2F1c2UgU3RyaW5nSU8uZ2V0dmFsdWUoKSB0byByYWlzZSBhIFZhbHVlRXJyb3Igd2hlbiB1c2VkIG9uIGEKICAgY2xvc2VkIFN0cmluZ0lPIGluc3RhbmNlLgogCkBAIC01NzYsOSArMzE1OSw2IEBACiAtIElzc3VlICMxMjEyNDogemlwaW1wb3J0IGRvZXNuJ3Qga2VlcCBhIHJlZmVyZW5jZSB0byB6bGliLmRlY29tcHJlc3MoKSBhbnltb3JlCiAgIHRvIGJlIGFibGUgdG8gdW5sb2FkIHRoZSBtb2R1bGUuCiAKLS0gSXNzdWUgIzExMDg4OiBkb24ndCBjcmFzaCB3aGVuIHVzaW5nIEY1IHRvIHJ1biBhIHNjcmlwdCBpbiBJRExFIG9uIE1hY09TWAotICB3aXRoIFRrIDguNS4KLQogLSBJc3N1ZSAjMTAxNTQsICMxMDA5MDogY2hhbmdlIHRoZSBub3JtYWxpemF0aW9uIG9mIFVURi04IHRvICJVVEYtOCIgaW5zdGVhZAogICBvZiAiVVRGOCIgaW4gdGhlIGxvY2FsZSBtb2R1bGUgYXMgdGhlIGxhdHRlciBpcyBub3Qgc3VwcG9ydGVkIE1hY09TWCBhbmQgT3BlbkJTRC4KIApAQCAtNTk4LDEyICszMTc4LDEwIEBACiAKIC0gSXNzdWUgIzEyMDEyOiBzc2wuUFJPVE9DT0xfU1NMdjIgYmVjb21lcyBvcHRpb25hbC4KIAotLSBJc3N1ZSAjMTExNjQ6IFJlbW92ZSBvYnNvbGV0ZSBhbGxub2RlcyB0ZXN0IGZyb20gbWluaWRvbSB0ZXN0LgotCiAtIElzc3VlICMxMTkyNzogU01UUF9TU0wgbm93IHVzZXMgcG9ydCA0NjUgYnkgZGVmYXVsdCBhcyBkb2N1bWVudGVkLiAgUGF0Y2gKICAgYnkgS2FzdW4gSGVyYXRoLgogCi0tIElzc3VlIDExOTk5OiBmaXhlZCBzcG9yYWRpYyBzeW5jIGZhaWx1cmUgbWFpbGJveC5NYWlsZGlyIGR1ZSB0byBpdHMgdHJ5aW5nIHRvCistIElzc3VlICMxMTk5OTogZml4ZWQgc3BvcmFkaWMgc3luYyBmYWlsdXJlIG1haWxib3guTWFpbGRpciBkdWUgdG8gaXRzIHRyeWluZyB0bwogICBkZXRlY3QgbXRpbWUgY2hhbmdlcyBieSBjb21wYXJpbmcgdG8gdGhlIHN5c3RlbSBjbG9jayBpbnN0ZWFkIG9mIHRvIHRoZQogICBwcmV2aW91cyB2YWx1ZSBvZiB0aGUgbXRpbWUuCiAKQEAgLTc1MSwxNyArMzMyOSw2IEBACiAtIElzc3VlICM4Mjc1OiBGaXggcGFzc2luZyBvZiBjYWxsYmFjayBhcmd1bWVudHMgd2l0aCBjdHlwZXMgdW5kZXIgV2luNjQuCiAgIFBhdGNoIGJ5IFN0YW4gTWloYWkuCiAKLS0gSXNzdWUgIzEwOTQwOiBXb3JrYXJvdW5kIGFuIElETEUgaGFuZyBvbiBNYWMgT1MgWCAxMC42IHdoZW4gdXNpbmcgdGhlCi0gIG1lbnUgYWNjZWxlcmF0b3JzIGZvciBPcGVuIE1vZHVsZSwgR28gdG8gTGluZSwgYW5kIE5ldyBJbmRlbnQgV2lkdGguCi0gIFRoZSBhY2NlbGVyYXRvcnMgc3RpbGwgd29yayBidXQgbm8gbG9uZ2VyIGFwcGVhciBpbiB0aGUgbWVudSBpdGVtcy4KLQotLSBJc3N1ZSAjMTA5MDc6IFdhcm4gT1MgWCAxMC42IElETEUgdXNlcnMgdG8gdXNlIEFjdGl2ZVN0YXRlIFRjbC9UayA4LjUsIHJhdGhlcgotICB0aGFuIHRoZSBjdXJyZW50bHkgcHJvYmxlbWF0aWMgQXBwbGUtc3VwcGxpZWQgb25lLCB3aGVuIHJ1bm5pbmcgd2l0aCB0aGUKLSAgNjQtLzMyLWJpdCBpbnN0YWxsZXIgdmFyaWFudC4KLQotLSBJc3N1ZSAjMTEwNTI6IENvcnJlY3QgSURMRSBtZW51IGFjY2VsZXJhdG9ycyBvbiBNYWMgT1MgWCBmb3IgU2F2ZQotICBjb21tYW5kcy4KLQogLSBJc3N1ZSAjMTA5NDk6IEltcHJvdmVkIHJvYnVzdG5lc3Mgb2Ygcm90YXRpbmcgZmlsZSBoYW5kbGVycy4KIAogLSBJc3N1ZSAjMTA5NTU6IEZpeCBhIHBvdGVudGlhbCBjcmFzaCB3aGVuIHRyeWluZyB0byBtbWFwKCkgYSBmaWxlIHBhc3QgaXRzCkBAIC03NzAsOSArMzMzNyw2IEBACiAtIElzc3VlICMxMDg5ODogQWxsb3cgY29tcGlsaW5nIHRoZSBwb3NpeCBtb2R1bGUgd2hlbiB0aGUgQyBsaWJyYXJ5IGRlZmluZXMKICAgYSBzeW1ib2wgbmFtZWQgRlNUQVQuCiAKLS0gSXNzdWUgIzYwNzU6IElETEUgb24gTWFjIE9TIFggbm93IHdvcmtzIHdpdGggYm90aCBDYXJib24gQXF1YVRrIGFuZAotICBDb2NvYSBBcXVhVGsuCi0KIC0gSXNzdWUgIzEwOTE2OiBtbWFwIHNob3VsZCBub3Qgc2VnZmF1bHQgd2hlbiBhIGZpbGUgaXMgbWFwcGVkIHVzaW5nIDAgYXMKICAgbGVuZ3RoIGFuZCBhIG5vbi16ZXJvIG9mZnNldCwgYW5kIGFuIGF0dGVtcHQgdG8gcmVhZCBwYXN0IHRoZSBlbmQgb2YgZmlsZQogICBpcyBtYWRlIChJbmRleEVycm9yIGlzIHJhaXNlZCBpbnN0ZWFkKS4gIFBhdGNoIGJ5IFJvc3MgTGFnZXJ3YWxsLgpAQCAtODMxLDggKzMzOTUsNiBAQAogLSBJc3N1ZSAjNjc5MTogTGltaXQgaGVhZGVyIGxpbmUgbGVuZ3RoICh0byA2NTUzNSBieXRlcykgaW4gaHR0cC5jbGllbnQsCiAgIHRvIGF2b2lkIGRlbmlhbCBvZiBzZXJ2aWNlcyBmcm9tIHRoZSBvdGhlciBwYXJ0eS4KIAotLSBJc3N1ZSAjMTA0MDQ6IFVzZSBjdGwtYnV0dG9uLTEgb24gT1NYIGZvciB0aGUgY29udGV4dCBtZW51IGluIElkbGUuCi0KIC0gSXNzdWUgIzk5MDc6IEZpeCB0YWIgaGFuZGxpbmcgb24gT1NYIHdoZW4gdXNpbmcgZWRpdGxpbmUgYnkgY2FsbGluZwogICBybF9pbml0aWFsaXplIGZpcnN0LCB0aGVuIHNldHRpbmcgb3VyIGN1c3RvbSBkZWZhdWx0cywgdGhlbiByZWFkaW5nIC5lZGl0cmMuCiAKQEAgLTg1MCwxMSArMzQxMiw2IEBACiAtIElzc3VlICMxMDY5NTogcGFzc2luZyB0aGUgcG9ydCBhcyBhIHN0cmluZyB2YWx1ZSB0byB0ZWxuZXRsaWIgbm8gbG9uZ2VyCiAgIGNhdXNlcyBkZWJ1ZyBtb2RlIHRvIGZhaWwuCiAKLS0gSXNzdWUgIzEwMTA3OiBXYXJuIGFib3V0IHVuc2F2ZWQgZmlsZXMgaW4gSURMRSBvbiBPU1guCi0KLS0gSXNzdWUgIzEwNDA2OiBFbmFibGUgUnN0cmlwIElETEUgZXh0ZW5zaW9uIG9uIE9TWCAoanVzdCBsaWtlIG9uIG90aGVyCi0gIHBsYXRmb3JtcykuCi0KIC0gSXNzdWUgIzEwNDc4OiBSZWVudHJhbnQgY2FsbHMgaW5zaWRlIGJ1ZmZlcmVkIElPIG9iamVjdHMgKGZvciBleGFtcGxlIGJ5CiAgIHdheSBvZiBhIHNpZ25hbCBoYW5kbGVyKSBub3cgcmFpc2UgYSBSdW50aW1lRXJyb3IgaW5zdGVhZCBvZiBmcmVlemluZyB0aGUKICAgY3VycmVudCBwcm9jZXNzLgpAQCAtOTAxLDYgKzM0NTgsNDggQEAKIAogLSBJc3N1ZSAjNjc4MjUwOiBNYWtlIG1tYXAgZmx1c2ggYSBub29wIG9uIEFDQ0VTU19SRUFEIGFuZCBBQ0NFU1NfQ09QWS4KIAorSURMRQorLS0tLQorCistIElzc3VlICMxMTcxODogSURMRSdzIG9wZW4gbW9kdWxlIGRpYWxvZyBjb3VsZG4ndCBmaW5kIHRoZSBfX2luaXRfXy5weQorICBmaWxlIGluIGEgcGFja2FnZS4KKworLSBJc3N1ZSAjMTI1OTA6IElETEUgZWRpdG9yIHdpbmRvdyBub3cgYWx3YXlzIGRpc3BsYXlzIHRoZSBmaXJzdCBsaW5lCisgIHdoZW4gb3BlbmluZyBhIGxvbmcgZmlsZS4gIFdpdGggVGsgOC41LCB0aGUgZmlyc3QgbGluZSB3YXMgaGlkZGVuLgorCistIElzc3VlICMxMTA4ODogZG9uJ3QgY3Jhc2ggd2hlbiB1c2luZyBGNSB0byBydW4gYSBzY3JpcHQgaW4gSURMRSBvbiBNYWNPU1gKKyAgd2l0aCBUayA4LjUuCisKKy0gSXNzdWUgIzEwOTQwOiBXb3JrYXJvdW5kIGFuIElETEUgaGFuZyBvbiBNYWMgT1MgWCAxMC42IHdoZW4gdXNpbmcgdGhlCisgIG1lbnUgYWNjZWxlcmF0b3JzIGZvciBPcGVuIE1vZHVsZSwgR28gdG8gTGluZSwgYW5kIE5ldyBJbmRlbnQgV2lkdGguCisgIFRoZSBhY2NlbGVyYXRvcnMgc3RpbGwgd29yayBidXQgbm8gbG9uZ2VyIGFwcGVhciBpbiB0aGUgbWVudSBpdGVtcy4KKworLSBJc3N1ZSAjMTA5MDc6IFdhcm4gT1MgWCAxMC42IElETEUgdXNlcnMgdG8gdXNlIEFjdGl2ZVN0YXRlIFRjbC9UayA4LjUsIHJhdGhlcgorICB0aGFuIHRoZSBjdXJyZW50bHkgcHJvYmxlbWF0aWMgQXBwbGUtc3VwcGxpZWQgb25lLCB3aGVuIHJ1bm5pbmcgd2l0aCB0aGUKKyAgNjQtLzMyLWJpdCBpbnN0YWxsZXIgdmFyaWFudC4KKworLSBJc3N1ZSAjMTEwNTI6IENvcnJlY3QgSURMRSBtZW51IGFjY2VsZXJhdG9ycyBvbiBNYWMgT1MgWCBmb3IgU2F2ZQorICBjb21tYW5kcy4KKworLSBJc3N1ZSAjNjA3NTogSURMRSBvbiBNYWMgT1MgWCBub3cgd29ya3Mgd2l0aCBib3RoIENhcmJvbiBBcXVhVGsgYW5kCisgIENvY29hIEFxdWFUay4KKworLSBJc3N1ZSAjMTA0MDQ6IFVzZSBjdGwtYnV0dG9uLTEgb24gT1NYIGZvciB0aGUgY29udGV4dCBtZW51IGluIElkbGUuCisKKy0gSXNzdWUgIzEwMTA3OiBXYXJuIGFib3V0IHVuc2F2ZWQgZmlsZXMgaW4gSURMRSBvbiBPU1guCisKKy0gSXNzdWUgIzEwNDA2OiBFbmFibGUgUnN0cmlwIElETEUgZXh0ZW5zaW9uIG9uIE9TWCAoanVzdCBsaWtlIG9uIG90aGVyCisgIHBsYXRmb3JtcykuCisKKy0gSXNzdWUgIzYzNzg6IEZ1cnRoZXIgYWRqdXN0IGlkbGUuYmF0IHRvIHN0YXJ0IGFzc29jaWF0ZWQgUHl0aG9uCisKKy0gSXNzdWUgIzExODk2OiBTYXZlIG9uIENsb3NlIGZhaWxlZCBkZXNwaXRlIHNlbGVjdGluZyAiWWVzIiBpbiBkaWFsb2cuCisKKy0gSXNzdWUgIzQ2NzY6IDxIb21lPiB0b2dnbGUgZmFpbGluZyBvbiBUayA4LjUsIGNhdXNpbmcgSURMRSBleGl0cyBhbmQKKyAgc3RyYW5nZSBzZWxlY3Rpb24gYmVoYXZpb3IuICBJbXByb3ZlIHNlbGVjdGlvbiBleHRlbnNpb24gYmVoYXZpb3VyLgorCistIElzc3VlICMzODUxIDxIb21lPiB0b2dnbGUgbm9uLWZ1bmN0aW9uYWwgd2hlbiBOdW1Mb2NrIHNldCBvbiBXaW5kb3dzLgorCiBCdWlsZAogLS0tLS0KIApAQCAtOTQ2LDE1ICszNTQ1LDExIEBACiAtIElzc3VlICMxMDk5OiBGaXggdGhlIGJ1aWxkIG9uIE1hY09TWCB3aGVuIGJ1aWxkaW5nIGEgZnJhbWV3b3JrIHdpdGggcHlkZWJ1ZwogICB1c2luZyBHQ0MgNC4wLgogCi1JRExFCi0tLS0tCi0KLS0gSXNzdWUgIzExNzE4OiBJRExFJ3Mgb3BlbiBtb2R1bGUgZGlhbG9nIGNvdWxkbid0IGZpbmQgdGhlIF9faW5pdF9fLnB5Ci0gIGZpbGUgaW4gYSBwYWNrYWdlLgotCiBUZXN0cwogLS0tLS0KIAorLSBJc3N1ZSAjMTExNjQ6IFJlbW92ZSBvYnNvbGV0ZSBhbGxub2RlcyB0ZXN0IGZyb20gbWluaWRvbSB0ZXN0LgorCiAtIElzc3VlICMxMjIwNTogRml4IHRlc3Rfc3VicHJvY2VzcyBmYWlsdXJlIGR1ZSB0byB1bmluc3RhbGxlZCB0ZXN0IGRhdGEuCiAKIC0gSXNzdWUgIzU3MjM6IEltcHJvdmUganNvbiB0ZXN0cyB0byBiZSBleGVjdXRlZCB3aXRoIGFuZCB3aXRob3V0IGFjY2VsZXJhdGlvbnMuCkBAIC0xMDIzLDkgKzM2MTgsNiBAQAogLSBJc3N1ZSAjNDQ5MzogdXJsbGliMiBhZGRzICcvJyBpbiBmcm9udCBvZiBwYXRoIGNvbXBvbmVudHMgd2hpY2ggZG9lcyBub3QKICAgc3RhcnQgd2l0aCAnLy4gQ29tbW9uIGJlaGF2aW9yIGV4aGliaXRlZCBieSBicm93c2VycyBhbmQgb3RoZXIgY2xpZW50cy4KIAotLSBJc3N1ZSAjNjM3ODogaWRsZS5iYXQgbm93IHJ1bnMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgUHl0aG9uIHZlcnNpb24gcmF0aGVyIHRoYW4KLSAgdGhlIHN5c3RlbSBkZWZhdWx0LiBQYXRjaCBieSBTcmlkaGFyIFJhdG5ha3VtYXIuCi0KIC0gSXNzdWUgIzEwNDA3OiBGaXggb25lIE5hbWVFcnJvciBpbiBkaXN0dXRpbHMuCiAKIC0gSXNzdWUgIzEwMTk4OiBmaXggZHVwbGljYXRlIGhlYWRlciB3cml0dGVuIHRvIHdhdmUgZmlsZXMgd2hlbiB3cml0ZWZyYW1lcygpCkBAIC0xMDM2LDYgKzM2MjgsMTIgQEAKIAogLSBJc3N1ZSAjNTExMTogSVB2NiBIb3N0IGluIHRoZSBIZWFkZXIgaXMgd3JhcHBlZCBpbnNpZGUgWyBdLiBQYXRjaCBieSBDaGFuZHJ1LgogCitJRExFCistLS0tCisKKy0gSXNzdWUgIzYzNzg6IGlkbGUuYmF0IG5vdyBydW5zIHdpdGggdGhlIGFwcHJvcHJpYXRlIFB5dGhvbiB2ZXJzaW9uIHJhdGhlciB0aGFuCisgIHRoZSBzeXN0ZW0gZGVmYXVsdC4gUGF0Y2ggYnkgU3JpZGhhciBSYXRuYWt1bWFyLgorCiBCdWlsZAogLS0tLS0KIApAQCAtMTUxMCw3ICs0MTA4LDYgQEAKIAogLSBJc3N1ZSAjNzU2NzogRG9uJ3QgY2FsbCBgc2V0dXB0ZXJtJyB0d2ljZS4KIAotCiBUb29scy9EZW1vcwogLS0tLS0tLS0tLS0KIApAQCAtMTgwMSw3ICs0Mzk4LDcgQEAKIC0gSXNzdWUgIzEyODUwODY6IFNwZWVkIHVwIGBgdXJsbGliLnF1b3RlKClgYCBhbmQgdXJsbGliLnVucXVvdGUgZm9yIHNpbXBsZQogICBjYXNlcy4KIAotLSBJc3N1ZSAjODY4ODogRGlzdHV0aWxzIG5vdyByZWNhbGN1bGF0ZXMgTUFOSUZFU1QgZXZlcnl0aW1lLgorLSBJc3N1ZSAjODY4ODogRGlzdHV0aWxzIG5vdyByZWNhbGN1bGF0ZXMgTUFOSUZFU1QgZXZlcnkgdGltZS4KIAogLSBJc3N1ZSAjNTA5OTogVGhlIGBgX19kZWxfXygpYGAgbWV0aG9kIG9mIGBgc3VicHJvY2Vzcy5Qb3BlbmBgIChhbmQgdGhlIG1ldGhvZHMKICAgaXQgY2FsbHMpIHJlZmVyZW5jZWQgZ2xvYmFsIG9iamVjdHMsIGNhdXNpbmcgZXJyb3JzIHRvIHBvcCB1cCBkdXJpbmcKQEAgLTI2NzksNyArNTI3Niw3IEBACiBUZXN0cwogLS0tLS0KIAotLSBpc3N1ZSAjNzcyODogdGVzdF90aW1lb3V0IHdhcyBjaGFuZ2VkIHRvIHVzZSBgYHRlc3Rfc3VwcG9ydC5iaW5kX3BvcnQoKWBgCistIElzc3VlICM3NzI4OiB0ZXN0X3RpbWVvdXQgd2FzIGNoYW5nZWQgdG8gdXNlIGBgdGVzdF9zdXBwb3J0LmJpbmRfcG9ydCgpYGAKICAgaW5zdGVhZCBvZiBhIGhhcmQgY29kZWQgcG9ydC4KIAogRG9jdW1lbnRhdGlvbgpAQCAtMjc0OCw3ICs1MzQ1LDYgQEAKIC0gSXNzdWUgIzc0NjY6IFNlZ21lbnRhdGlvbiBmYXVsdCB3aGVuIHRoZSBnYXJiYWdlIGNvbGxlY3RvciBpcyBjYWxsZWQgaW4gdGhlCiAgIG1pZGRsZSBvZiBwb3B1bGF0aW5nIGEgdHVwbGUuICBQYXRjaCBieSBGbG9yZW50IFhpY2x1bmEuCiAKLQogTGlicmFyeQogLS0tLS0tLQogCkBAIC0zNjg1LDkgKzYyODEsNiBAQAogCiAtIElzc3VlICM2MDQ4OiBOb3cgRGlzdHV0aWxzIHVzZXMgdGhlIHRhcmZpbGUgbW9kdWxlIGluIGFyY2hpdmVfdXRpbC4KIAotLSBJc3N1ZSAjNTE1MDogSURMRSdzIGZvcm1hdCBtZW51IG5vdyBoYXMgYW4gb3B0aW9uIHRvIHN0cmlwIHRyYWlsaW5nCi0gIHdoaXRlc3BhY2UuCi0KIC0gSXNzdWUgIzYxMjE6IHB5ZG9jIG5vdyBpZ25vcmVzIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcyBpbiB0aGUgYXJndW1lbnQgdG8KICAgdGhlICdoZWxwJyBmdW5jdGlvbi4KIApAQCAtNDE3Nyw3ICs2NzcwLDcgQEAKIC0gUmVzdG9yZSBQeXRob24gMi4zIGNvbXBhdGliaWxpdHkgZm9yIGRlY2ltYWwucHkuCiAKIC0gSXNzdWUgIzE3MDI1NTE6IGRpc3R1dGlscyBzZGlzdCB3YXMgbm90IGV4Y2x1ZGluZyBWQ1MgZGlyZWN0b3JpZXMgdW5kZXIKLSAgV2luZG93cy4gSW5pdGFsIHNvbHV0aW9uIGJ5IEd1eSBEYWxiZXJ0by4KKyAgV2luZG93cy4gSW5pdGlhbCBzb2x1dGlvbiBieSBHdXkgRGFsYmVydG8uCiAKIC0gVGhlIF90a2ludGVyIG1vZHVsZSBmdW5jdGlvbnMgImNyZWF0ZWZpbGVoYW5kbGVyIiwgImRlbGV0ZWZpbGVoYW5kbGVyIiwKICAgImNyZWF0ZXRpbWVyaGFuZGxlciIsICJtYWlubG9vcCIsICJkb29uZWV2ZW50IiBhbmQgInF1aXQiIGhhdmUgYmVlbiBkZXByZWNhdGVkCkBAIC00MjQ1LDcgKzY4MzgsNyBAQAogICBiYWNrcG9ydGluZyB0byBtYWludGVuYW5jZSBicmFuY2hlcy4gIE9yaWdpbmFsIHBhdGNoIGJ5IEFsZXhhbmRlciBCZWxvcG9sc2t5LgogCiAtIElzc3VlICM0MTYzOiBVc2UgdW5pY29kZS1mcmllbmRseSB3b3JkIHNwbGl0dGluZyBpbiB0aGUgdGV4dHdyYXAgZnVuY3Rpb25zCi0gIHdoZW4gZ2l2ZW4gYW4gdW5pY29kZSBzdHJpbmcuCisgIHdoZW4gZ2l2ZW4gYSBVbmljb2RlIHN0cmluZy4KIAogLSBJc3N1ZSAjNDYxNjogVGFyRmlsZS51dGltZSgpOiBSZXN0b3JlIGRpcmVjdG9yeSB0aW1lcyBvbiBXaW5kb3dzLgogCkBAIC00MzQ2LDYgKzY5MzksMzUgQEAKIAogLSBXaW5kb3dzIGxvY2FsZSBtYXBwaW5nIHVwZGF0ZWQgdG8gVmlzdGEuCiAKK0lETEUKKy0tLS0KKworLSBJc3N1ZSAjNTE1MDogSURMRSdzIGZvcm1hdCBtZW51IG5vdyBoYXMgYW4gb3B0aW9uIHRvIHN0cmlwIHRyYWlsaW5nCisgIHdoaXRlc3BhY2UuCisKKy0gSXNzdWUgIzU4NDc6IFJlbW92ZSAtbiBzd2l0Y2ggb24gIkVkaXQgd2l0aCBJRExFIiBtZW51IGl0ZW0uCisKKy0gaWRsZS5weSBtb2RpZmllZCBhbmQgc2ltcGxpZmllZCB0byBiZXR0ZXIgc3VwcG9ydCBkZXZlbG9waW5nIGV4cGVyaW1lbnRhbAorICB2ZXJzaW9ucyBvZiBJRExFIHdoaWNoIGFyZSBub3QgaW5zdGFsbGVkIGluIHRoZSBzdGFuZGFyZCBsb2NhdGlvbi4KKworLSBJc3N1ZSAjNTU1OTogT3V0cHV0V2luZG93L1B5U2hlbGwgcmlnaHQgY2xpY2sgbWVudSAiR28gdG8gZmlsZS9saW5lIgorICB3YXNuJ3Qgd29ya2luZyB3aXRoIGZpbGUgcGF0aHMgY29udGFpbmluZyBzcGFjZXMuCisKKy0gSXNzdWUgIzU3ODM6IFdpbmRvd3M6IFZlcnNpb24gc3RyaW5nIGZvciB0aGUgLmNobSBoZWxwIGZpbGUgY2hhbmdlZCwKKyAgZmlsZSBub3QgYmVpbmcgYWNjZXNzZWQgIFBhdGNoIGJ5IEd1aWxoZXJtZSBQb2xvLworCistIElzc3VlICMxNTI5MTQyOiBBbGxvdyBtdWx0aXBsZSBJRExFIEdVSS9zdWJwcm9jZXNzIHBhaXJzIHRvIGV4aXN0CisgIHNpbXVsdGFuZW91c2x5LiBUaGFua3MgdG8gRGF2aWQgU2NoZXJlciBmb3Igc3VnZ2VzdGluZyB0aGUgdXNlIG9mIGFuCisgIGVwaGVtZXJhbCBwb3J0IGZvciB0aGUgR1VJLiAgUGF0Y2ggYnkgV2VlYmxlLgorCistIFJlbW92ZSBwb3J0IHNwZWMgZnJvbSBydW4ucHkgYW5kIGZpeCBidWcgd2hlcmUgc3VicHJvY2VzcyBmYWlscyB0bworICBleHRyYWN0IHBvcnQgZnJvbSBjb21tYW5kIGxpbmUgd2hlbiB3YXJuaW5ncyBhcmUgcHJlc2VudC4KKworLSBJc3N1ZSAjNTEyOTogVGsgOC41IFRleHQgd2lkZ2V0IHJlcXVpcmVzICd3b3JkcHJvY2Vzc29yJyB0YWJzdHlsZSBhdHRyCisgIHRvIGhhbmRsZSBtaXhlZCBzcGFjZS90YWIgcHJvcGVybHkuIFBhdGNoIGJ5IEd1aWxoZXJtZSBQb2xvLgorCistIElzc3VlICMzNTQ5OiBPbiBNYWNPUyB0aGUgcHJlZmVyZW5jZXMgbWVudSB3YXMgbm90IHByZXNlbnQKKwogVG9vbHMvRGVtb3MKIC0tLS0tLS0tLS0tCiAKQEAgLTQzNzksOCArNzAwMSw2IEBACiAKIC0gSXNzdWUgIzYwOTQ6IEJ1aWxkIGNvcnJlY3RseSB3aXRoIFN1YnZlcnNpb24gMS43LgogCi0tIElzc3VlICM1ODQ3OiBSZW1vdmUgLW4gc3dpdGNoIG9uICJFZGl0IHdpdGggSURMRSIgbWVudSBpdGVtLgotCiAtIElzc3VlICM1NzI2OiBNYWtlIE1vZHVsZXMvbGRfc29fYWl4IHJldHVybiB0aGUgYWN0dWFsIGV4aXQgY29kZSBvZiB0aGUgbGlua2VyLAogICByYXRoZXIgdGhhbiBhbHdheXMgZXhpdCBzdWNjZXNzZnVsbHkuICBQYXRjaCBieSBGbG9yaXMgQnJ1eW5vb2doZS4KIApAQCAtNDY1NCw3ICs3Mjc0LDcgQEAKIC0gSXNzdWUgIzM1NDc6IEZpeGVkIGN0eXBlcyBzdHJ1Y3R1cmVzIGJpdGZpZWxkcyBvZiB2YXJ5aW5nIGludGVnZXIKICAgc2l6ZXMuCiAKLS0gSXNzdWUgIzM4Nzk6IEEgcmVncmVzc2lvbiBpbiB1cmxsaWIuZ2V0cHJveGllc19lbnZpcm9tZW50IHdhcyBmaXhlZC4KKy0gSXNzdWUgIzM4Nzk6IEEgcmVncmVzc2lvbiBpbiB1cmxsaWIuZ2V0cHJveGllc19lbnZpcm9ubWVudCB3YXMgZml4ZWQuCiAKIC0gSXNzdWUgIzM4NjM6IERpc2FibGVkIGEgdW5pdCB0ZXN0IG9mIGZvcmsgYmVpbmcgY2FsbGVkIGZyb20gYSB0aHJlYWQKICAgd2hlbiBydW5uaW5nIG9uIHBsYXRmb3JtcyBrbm93biB0byBleGhpYml0IE9TIGJ1Z3Mgd2hlbiBhdHRlbXB0aW5nIHRoYXQuCkBAIC01MjE5LDcgKzc4MzksNiBAQAogCiAtIElzc3VlICMzMjE1OiBCdWlsZCBzcWxpdGUzIGFzIHNxbGl0ZTMuZGxsLCBub3Qgc3FsaXRlMy5weWQuCiAKLQogRG9jdW1lbnRhdGlvbgogLS0tLS0tLS0tLS0tLQogCkBAIC01Mjg1LDcgKzc5MDQsNiBAQAogICBvbmx5IGF2YWlsYWJsZSBpZiBhc3NlcnRzIGFyZSBsZWZ0IGluIHRoZSBjb2RlLCBpbiBjYXNlcyB3aGVyZSB0aGV5CiAgIGNhbid0IGJlIHRyaWdnZXJlZCBmcm9tIFB5dGhvbiBjb2RlLgogCi0KIEV4dGVuc2lvbiBNb2R1bGVzCiAtLS0tLS0tLS0tLS0tLS0tLQogLSBJc3N1ZSAjMTE3OTogW0NWRS0yMDA3LTQ5NjVdIEludGVnZXIgb3ZlcmZsb3cgaW4gaW1hZ2VvcCBtb2R1bGUuCkBAIC01NTkzLDcgKzgyMTEsNiBAQAogCiAgIE5PVEU6IDY0LWJpdCBhbmQgNC13YXkgYnVpbGRzIGFyZSBvbmx5IHN1cHBwb3J0ZWQgb24gTWFjIE9TIFggMTAuNSAob3IgbGF0ZXIpLgogCi0KIEMgQVBJCiAtLS0tLQogCkBAIC02NDY5LDcgKzkwODYsNiBAQAogICB0aHJlYWRpbmcuZW51bWVyYXRlKCkgbGlzdCBhZnRlciB0aGUgam9pbigpIGZvciBhIGJyaWVmIHBlcmlvZCB1bnRpbAogICBpdCBhY3R1YWxseSBleGl0ZWQuCiAKLQogTGlicmFyeQogLS0tLS0tLQogCkBAIC03MjAwLDkgKzk4MTYsNiBAQAogICBBbGxvd3MgdGhlIGRlbW8yIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIG9uIGl0cyBvd24gaW5zdGVhZCBvZiBvbmx5CiAgIHdoZW4gdGhlIG1vZHVsZSBpcyBydW4gYXMgYSBzY3JpcHQuCiAKLS0gQnVnICM4MTMzNDI6IFN0YXJ0IHRoZSBJRExFIHN1YnByb2Nlc3Mgd2l0aCAtUW5ldyBpZiB0aGUgcGFyZW50IGlzCi0gIHN0YXJ0ZWQgd2l0aCB0aGF0IG9wdGlvbi4KLQogLSBCdWcgIzE1NjUxNTA6IEZpeCBzdWJzZWNvbmQgcHJvY2Vzc2luZyBmb3Igb3MudXRpbWUgb24gV2luZG93cy4KIAogLSBTdXBwb3J0IGZvciBNU1ZDIDggd2FzIGFkZGVkIHRvIGJkaXN0X3dpbmluc3QuCkBAIC03MjUxLDkgKzk4NjQsNiBAQAogCiAtIEJ1ZyAjMTUzMTg2MjogRG8gbm90IGNsb3NlIHN0YW5kYXJkIGZpbGUgZGVzY3JpcHRvcnMgaW4gc3VicHJvY2Vzcy4KIAotLSBpZGxlOiBIb25vciB0aGUgIkNhbmNlbCIgYWN0aW9uIGluIHRoZSBzYXZlIGRpYWxvZyAoRGViaWFuIGJ1ZwotICAjMjk5MDkyKS4KLQogLSBGaXggdXRmLTgtc2lnIGluY3JlbWVudGFsIGRlY29kZXIsIHdoaWNoIGRpZG4ndCByZWNvZ25pc2UgYSBCT00gd2hlbgogICB0aGUgZmlyc3QgY2h1bmsgZmVkIHRvIHRoZSBkZWNvZGVyIHN0YXJ0ZWQgd2l0aCBhIEJPTSwgYnV0IHdhcwogICBsb25nZXIgdGhhbiAzIGJ5dGVzLgpAQCAtNzQ5Niw2ICsxMDEwNiwxNSBAQAogCiAtIFRoZSBzcWxpdGUzIG1vZHVsZSB3YXMgdXBkYXRlZCB0byBweXNxbGl0ZSAyLjQuMS4KIAorSURMRQorLS0tLQorCistIEJ1ZyAjODEzMzQyOiBTdGFydCB0aGUgSURMRSBzdWJwcm9jZXNzIHdpdGggLVFuZXcgaWYgdGhlIHBhcmVudCBpcworICBzdGFydGVkIHdpdGggdGhhdCBvcHRpb24uCisKKy0gSURMRTogSG9ub3IgdGhlICJDYW5jZWwiIGFjdGlvbiBpbiB0aGUgc2F2ZSBkaWFsb2cgKERlYmlhbiBidWcKKyAgIzI5OTA5MikuCisKIFRlc3RzCiAtLS0tLQogCkBAIC03NTU5LDcgKzEwMTc4LDYgQEAKICAgcGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uKCk7IHRoaXMgd2lsbCBub3cgYmUgc2F2ZWQgaW4gdGhlCiAgIGJlbmNobWFyayBwaWNrbGUuCiAKLQogRG9jdW1lbnRhdGlvbgogLS0tLS0tLS0tLS0tLQogCkBAIC03NjEwLDcgKzEwMjI4LDYgQEAKICAgYXBwbGllZCB0byBhIG5ld2x5IGNyZWF0ZWQgbGlzdCBvYmplY3QgYW5kIGFkZCBub3RlcyB0aGF0IHRoaXMgaXNuJ3QKICAgYSBnb29kIGlkZWEuCiAKLQogVG9vbHMvRGVtb3MKIC0tLS0tLS0tLS0tCiAKQEAgLTc2MjMsNyArMTAyNDAsNiBAQAogLSBCdWcgIzE1NDYzNzI6IEZpeGVkIHNtYWxsIGJ1Z2dsZXQgaW4gcHliZW5jaCB0aGF0IGNhdXNlZCBhIG1pc3NpbmcKICAgZmlsZSBub3QgdG8gZ2V0IHJlcG9ydGVkIHByb3Blcmx5LgogCi0KIEJ1aWxkCiAtLS0tLQogCkBAIC03NzA2LDcgKzEwMzIyLDYgQEAKICAgcHlidWlsZGJvdC5pZGVudGlmeSB0byBpbmNsdWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJ1aWxkCiAgIGVudmlyb25tZW50LgogCi0KIEMgQVBJCiAtLS0tLQogCkBAIC03NzY5LDcgKzEwMzg0LDYgQEAKIC0gQnVnICMxNTQyNjkzOiByZW1vdmUgc2VtaS1jb2xvbiBhdCBlbmQgb2YgUHlJbXBvcnRfSW1wb3J0TW9kdWxlRXgKICAgbWFjcm8gc28gaXQgY2FuIGJlIHVzZWQgYXMgYW4gZXhwcmVzc2lvbi4KIAotCiBXaW5kb3dzCiAtLS0tLS0tCiAKQEAgLTc3ODMsNyArMTAzOTcsNiBAQAogCiAtIEJ1ZyAjMTIxNjogUmVzdG9yZSBzdXBwb3J0IGZvciBWaXN1YWwgU3R1ZGlvIDIwMDIuCiAKLQogTWFjCiAtLS0KIApkaWZmIC0tZ2l0IGEvTWlzYy9SRUFETUUuT3BlbkJTRCBiL01pc2MvUkVBRE1FLk9wZW5CU0QKaW5kZXggYjQxN2VjYy4uYjllNTk3NiAxMDA2NDQKLS0tIGEvTWlzYy9SRUFETUUuT3BlbkJTRAorKysgYi9NaXNjL1JFQURNRS5PcGVuQlNECkBAIC0yOSw3ICsyOSw3IEBACiAKIElmIHlvdXIgdmVyc2lvbiBpcyBub3QgaW4gdGhhdCBsaXN0LCBlLmcuLCAzLjksIGFkZCB0aGUgdmVyc2lvbgogbnVtYmVyLiAgSW4gdGhpcyBjYXNlLCB5b3Ugd291bGQganVzdCBuZWVkIHRvIGFkZCBhIDkgYWZ0ZXIgdGhlIDguCi1JZiB5b3UgbW9kaWZ5IGNvbmZpZ3VyZS5pbiwgeW91IHdpbGwgbmVlZCB0byByZWdlbmVyYXRlIGNvbmZpZ3VyZQorSWYgeW91IG1vZGlmeSBjb25maWd1cmUuYWMsIHlvdSB3aWxsIG5lZWQgdG8gcmVnZW5lcmF0ZSBjb25maWd1cmUKIHdpdGggYXV0b2NvbmYuCiAKIElmIHlvdXIgdmVyc2lvbiBpcyBhbHJlYWR5IGluIHRoZSBsaXN0LCB0aGlzIGlzIG5vdCBhIGtub3duIHByb2JsZW0uCmRpZmYgLS1naXQgYS9NaXNjL1JQTS9weXRob24tMi43LnNwZWMgYi9NaXNjL1JQTS9weXRob24tMi43LnNwZWMKaW5kZXggZDA5NTQ2NS4uOTg4YzNjYyAxMDA2NDQKLS0tIGEvTWlzYy9SUE0vcHl0aG9uLTIuNy5zcGVjCisrKyBiL01pc2MvUlBNL3B5dGhvbi0yLjcuc3BlYwpAQCAtMzksNyArMzksNyBAQAogCiAlZGVmaW5lIG5hbWUgcHl0aG9uCiAjLS1zdGFydCBjb25zdGFudHMtLQotJWRlZmluZSB2ZXJzaW9uIDIuNy4yCislZGVmaW5lIHZlcnNpb24gMi43LjgKICVkZWZpbmUgbGlidmVycyAyLjcKICMtLWVuZCBjb25zdGFudHMtLQogJWRlZmluZSByZWxlYXNlIDFweWRvdG9yZwpkaWZmIC0tZ2l0IGEvTWlzYy9idWlsZC5zaCBiL01pc2MvYnVpbGQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJmN2JmZjEuLjAwMDAwMDAKLS0tIGEvTWlzYy9idWlsZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0jIS9iaW4vc2gKLQotIyMgU2NyaXB0IHRvIGJ1aWxkIGFuZCB0ZXN0IHRoZSBsYXRlc3QgcHl0aG9uIGZyb20gc3ZuLiAgSXQgYmFzaWNhbGx5Ci0jIyBkb2VzIHRoaXM6Ci0jIyAgIHN2biB1cCA7IC4vY29uZmlndXJlIDsgbWFrZSA7IG1ha2UgdGVzdCA7IG1ha2UgaW5zdGFsbCA7IGNkIERvYyA7IG1ha2UKLSMjCi0jIyBMb2dzIGFyZSBrZXB0IGFuZCByc3luYydlZCB0byB0aGUgd2ViaG9zdC4gIElmIHRoZXJlIGFyZSB0ZXN0IGZhaWx1cmUocyksCi0jIyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmFpbHVyZShzKSBpcyBtYWlsZWQuCi0jIwotIyMgVGhlIHVzZXIgbXVzdCBiZSBhIG1lbWJlciBvZiB0aGUgd2VibWFzdGVyIGdyb3VwIGxvY2FsbHkgYW5kIG9uIHdlYmhvc3QuCi0jIwotIyMgVGhpcyBzY3JpcHQgaXMgcnVuIG9uIHRoZSBQU0YncyBtYWNoaW5lIGFzIHVzZXIgbmVhbCB2aWEgY3JvbnRhYi4KLSMjCi0jIyBZZXMsIHRoaXMgc2NyaXB0IHdvdWxkIHByb2JhYmx5IGJlIGVhc2llciBpbiBweXRob24sIGJ1dCB0aGVuCi0jIyB0aGVyZSdzIGEgYm9vdHN0cmFwIHByb2JsZW0uICBXaGF0IGlmIFB5dGhvbiBkb2Vzbid0IGJ1aWxkPwotIyMKLSMjIFRoaXMgc2NyaXB0IHNob3VsZCBiZSBmYWlybHkgY2xlYW4gQm91cm5lIHNoZWxsLCBpZSBub3QgdG9vIG1hbnkKLSMjIGJhc2gtaXNtcy4gIFdlIHNob3VsZCB0cnkgdG8ga2VlcCBpdCBwb3J0YWJsZSB0byBvdGhlciBVbml4ZXMuCi0jIyBFdmVuIHRob3VnaCBpdCB3aWxsIHByb2JhYmx5IG9ubHkgcnVuIG9uIExpbnV4LiAgSSdtIHN1cmUgdGhlcmUgYXJlCi0jIyBzZXZlcmFsIEdOVS1pc21zIGN1cnJlbnRseSAoZGF0ZSArJXMgYW5kIHJlYWRsaW5rKS4KLSMjCi0jIyBQZXJoYXBzIHRoaXMgc2NyaXB0IHNob3VsZCBiZSBicm9rZW4gdXAgaW50byAyIChvciBtb3JlKSBjb21wb25lbnRzLgotIyMgQnVpbGRpbmcgZG9jIGlzIG9ydGhvZ29uYWwgdG8gdGhlIHJlc3Qgb2YgdGhlIHB5dGhvbiBidWlsZC90ZXN0LgotIyMKLQotIyMgRklYTUU6IHdlIHNob3VsZCBkZXRlY3QgdGVzdCBoYW5ncyAoZWcsIGlmIHRoZXkgdGFrZSBtb3JlIHRoYW4gNDUgbWludXRlcykKLQotIyMgRklYTUU6IHdlIHNob3VsZCBydW4gdmFsZ3JpbmQKLSMjIEZJWE1FOiB3ZSBzaG91bGQgcnVuIGNvZGUgY292ZXJhZ2UKLQotIyMgVXRpbGl0aWVzIGludm9rZWQgaW4gdGhpcyBzY3JpcHQgaW5jbHVkZToKLSMjICAgIGJhc2VuYW1lLCBkYXRlLCBkaXJuYW1lLCBleHByLCBncmVwLCByZWFkbGluaywgdW5hbWUKLSMjICAgIGNrc3VtLCBtYWtlLCBtdXR0LCByc3luYywgc3ZuCi0KLSMjIHJlbWVtYmVyIHdoZXJlIGRpZCB3ZSBzdGFydGVkIGZyb20KLURJUj1gZGlybmFtZSAkMGAKLWlmIFsgIiRESVIiID0gIiIgXTsgdGhlbgotICAgRElSPSIuIgotZmkKLQotIyMgbWFrZSBkaXJlY3RvcnkgYWJzb2x1dGUKLURJUj1gcmVhZGxpbmsgLWYgJERJUmAKLUZVTExQQVRITkFNRT0iJERJUi9gYmFzZW5hbWUgJDBgIgotIyMgd2Ugd2FudCBNaXNjLy4uCi1ESVI9YGRpcm5hbWUgJERJUmAKLQotIyMgQ29uZmlndXJhYmxlIG9wdGlvbnMKLQotRkFJTFVSRV9TVUJKRUNUPSJQeXRob24gUmVncmVzc2lvbiBUZXN0IEZhaWx1cmVzIgotI0ZBSUxVUkVfTUFJTFRPPSJZT1VSX0FDQ09VTlRAZ21haWwuY29tIgotRkFJTFVSRV9NQUlMVE89InB5dGhvbi1jaGVja2luc0BweXRob24ub3JnIgotI0ZBSUxVUkVfQ0M9Im9wdGlvbmFsLS11bmNvbW1lbnQgYW5kIHNldCB0byBkZXNpcmVkIGFkZHJlc3MiCi0KLVJFTU9URV9TWVNURU09Im5lYWxAZGluc2RhbGUucHl0aG9uLm9yZyIKLVJFTU9URV9ESVI9Ii9kYXRhL2Z0cC5weXRob24ub3JnL3B1Yi9kb2NzLnB5dGhvbi5vcmcvZGV2LyIKLVJFU1VMVF9GSUxFPSIkRElSL2J1aWxkL2luZGV4Lmh0bWwiCi1JTlNUQUxMX0RJUj0iL3RtcC9weXRob24tdGVzdC9sb2NhbCIKLVJTWU5DX09QVFM9Ii1DIC1lIHNzaCAtcmxvZ0QiCi0KLSMgQWx3YXlzIHJ1biB0aGUgaW5zdGFsbGVkIHZlcnNpb24gb2YgUHl0aG9uLgotUFlUSE9OPSRJTlNUQUxMX0RJUi9iaW4vcHl0aG9uCi0KLSMgUHl0aG9uIG9wdGlvbnMgYW5kIHJlZ3Jlc3Npb24gdGVzdCBwcm9ncmFtIHRoYXQgc2hvdWxkIGFsd2F5cyBiZSBydW4uCi1SRUdSVEVTVF9BUkdTPSItRSAtdHQgJElOU1RBTExfRElSL2xpYi9weXRob24yLjcvdGVzdC9yZWdydGVzdC5weSIKLQotUkVGTE9HPSJidWlsZC9yZWZsb2cudHh0Lm91dCIKLSMgVGhlc2UgdGVzdHMgYXJlIG5vdCBzdGFibGUgYW5kIGZhbHNlbHkgcmVwb3J0IGxlYWtzIHNvbWV0aW1lcy4KLSMgVGhlIGVudGlyZSBsZWFrIHJlcG9ydCB3aWxsIGJlIG1haWxlZCBpZiBhbnkgdGVzdCBub3QgaW4gdGhpcyBsaXN0IGxlYWtzLgotIyBOb3RlOiB0ZXN0X1hYWCAobm9uZSBjdXJyZW50bHkpIHJlYWxseSBsZWFrLCBidXQgYXJlIGRpc2FibGVkCi0jIHNvIHdlIGRvbid0IHNlbmQgc3BhbS4gIEFueSB0ZXN0IHdoaWNoIHJlYWxseSBsZWFrcyBzaG91bGQgb25seSAKLSMgYmUgbGlzdGVkIGhlcmUgaWYgdGhlcmUgYXJlIGFsc28gdGVzdCBjYXNlcyB1bmRlciBMaWIvdGVzdC9sZWFrZXJzLgotTEVBS1lfVEVTVFM9InRlc3RfKGFzeW5jaGF0fGNtZF9saW5lfGRvY3htbHJwY3xkdW1iZGJtfGZpbGV8ZnRwbGlifGh0dHBzZXJ2ZXJzfGltYXBsaWJ8cG9wZW4yfHNvY2tldHxzbXRwbGlifHN5c3x0ZWxuZXRsaWJ8dGhyZWFkZWR0ZW1wZmlsZXx0aHJlYWRpbmd8dGhyZWFkc2lnbmFsc3x4bWxycGMpIgotCi0jIFNraXAgdGhlc2UgdGVzdHMgYWx0b2dldGhlciB3aGVuIGxvb2tpbmcgZm9yIGxlYWtzLiAgVGhlc2UgdGVzdHMKLSMgZG8gbm90IG5lZWQgdG8gYmUgc3RvcmVkIGFib3ZlIGluIExFQUtZX1RFU1RTIHRvby4KLSMgdGVzdF9jb21waWxlciBhbG1vc3QgbmV2ZXIgZmluaXNoZXMgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgcmVmcwotIyBzaW5jZSBpdCBkZXBlbmRzIG9uIG90aGVyIG1vZHVsZXMsIHNraXAgaXQuCi0jIHRlc3RfbG9nZ2luZyBjYXVzZXMgaGFuZ3MsIHNraXAgaXQuCi0jIEtCSyAyMUFwcjA5OiB0ZXN0X2h0dHBzZXJ2ZXJzIGNhdXNlcyBoYW5ncywgc2tpcCBmb3Igbm93LgotTEVBS1lfU0tJUFM9Ii14IHRlc3RfY29tcGlsZXIgdGVzdF9sb2dnaW5nIHRlc3RfaHR0cHNlcnZlcnMiCi0KLSMgQ2hhbmdlIHRoaXMgZmxhZyB0byAieWVzIiBmb3Igb2xkIHJlbGVhc2VzIHRvIG9ubHkgdXBkYXRlL2J1aWxkIHRoZSBkb2NzLgotQlVJTERfRElTQUJMRUQ9Im5vIgotCi0jIyB1dGlsaXR5IGZ1bmN0aW9ucwotY3VycmVudF90aW1lKCkgewotICAgIGRhdGUgKyVzCi19Ci0KLXVwZGF0ZV9zdGF0dXMoKSB7Ci0gICAgbm93PWBjdXJyZW50X3RpbWVgCi0gICAgdGltZT1gZXhwciAkbm93IC0gJDNgCi0gICAgZWNobyAiPGxpPjxhIGhyZWY9XCIkMlwiPiQxPC9hPiA8Zm9udCBzaXplPVwiLTFcIj4oJHRpbWUgc2Vjb25kcyk8L2ZvbnQ+PC9saT4iID4+ICRSRVNVTFRfRklMRQotfQotCi1wbGFjZV9zdW1tYXJ5X2ZpcnN0KCkgewotICAgIHRlc3RmPSQxCi0gICAgc2VkIC1uICcvXlswLTldWzAtOV0qIHRlc3RzIE9LXC4vLCRwJyA8ICR0ZXN0ZiBcCi0gICAgICAgIHwgZWdyZXAgLXYgJ1xbWzAtOV0rIHJlZnNcXScgPiAkdGVzdGYudG1wCi0gICAgZWNobyAiIiA+PiAkdGVzdGYudG1wCi0gICAgY2F0ICR0ZXN0ZiA+PiAkdGVzdGYudG1wCi0gICAgbXYgJHRlc3RmLnRtcCAkdGVzdGYKLX0KLQotY291bnRfZmFpbHVyZXMgKCkgewotICAgIHRlc3RmPSQxCi0gICAgbj1gZ3JlcCAtaWMgIiBmYWlsZWQ6IiAkdGVzdGZgCi0gICAgaWYgWyAkbiAtZXEgMSBdIDsgdGhlbgotICAgICAgICBuPWBncmVwICIgZmFpbGVkOiIgJHRlc3RmIHwgc2VkIC1lICdzLyAuKi8vJ2AKLSAgICBmaQotICAgIGVjaG8gJG4KLX0KLQotbWFpbF9vbl9mYWlsdXJlKCkgewotICAgIGlmIFsgIiROVU1fRkFJTFVSRVMiICE9ICIwIiBdOyB0aGVuCi0gICAgICAgIGRlc3Q9JEZBSUxVUkVfTUFJTFRPCi0gICAgICAgICMgRkFJTFVSRV9DQyBpcyBvcHRpb25hbC4KLSAgICAgICAgaWYgWyAiJEZBSUxVUkVfQ0MiICE9ICIiIF07IHRoZW4KLSAgICAgICAgICAgIGRlc3Q9IiRkZXN0IC1jICRGQUlMVVJFX0NDIgotICAgICAgICBmaQotICAgICAgICBpZiBbICJ4JDMiICE9ICJ4IiBdIDsgdGhlbgotICAgICAgICAgICAgKGVjaG8gIk1vcmUgaW1wb3J0YW50IGlzc3VlczoiCi0gICAgICAgICAgICAgZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKLSAgICAgICAgICAgICBlZ3JlcCAtdiAiJDMiIDwgJDIKLSAgICAgICAgICAgICBlY2hvICIiCi0gICAgICAgICAgICAgZWNobyAiTGVzcyBpbXBvcnRhbnQgaXNzdWVzOiIKLSAgICAgICAgICAgICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgotICAgICAgICAgICAgIGVncmVwICIkMyIgPCAkMikKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY2F0ICQyCi0gICAgICAgIGZpIHwgbXV0dCAtcyAiJEZBSUxVUkVfU1VCSkVDVCAkMSAoJE5VTV9GQUlMVVJFUykiICRkZXN0Ci0gICAgZmkKLX0KLQotIyMgc2V0dXAKLWNkICRESVIKLW1ha2UgY2xvYmJlciA+IC9kZXYvbnVsbCAyPiYxCi1jcCAtcCBNb2R1bGVzL1NldHVwLmRpc3QgTW9kdWxlcy9TZXR1cAotIyBCdXQgbWF5YmUgdGhlcmUgd2FzIG5vIE1ha2VmaWxlIC0gd2UgYXJlIG9ubHkgYnVpbGRpbmcgZG9jcy4gQ2xlYXIgYnVpbGQ6Ci1ybSAtcmYgYnVpbGQvCi1ta2RpciAtcCBidWlsZAotcm0gLXJmICRJTlNUQUxMX0RJUgotIyMgZ2V0IHRoZSBwYXRoIHdlIGFyZSBidWlsZGluZwotcmVwb19wYXRoPSQoZ3JlcCAidXJsPSIgLnN2bi9lbnRyaWVzIHwgc2VkIC1lIHMvXFxXKnVybD0vLyAtZSBzL1wiLy9nKQotCi0jIyBjcmVhdGUgcmVzdWx0cyBmaWxlCi1USVRMRT0iQXV0b21hdGVkIFB5dGhvbiBCdWlsZCBSZXN1bHRzIgotZWNobyAiPGh0bWw+IiA+PiAkUkVTVUxUX0ZJTEUKLWVjaG8gIiAgPGhlYWQ+IiA+PiAkUkVTVUxUX0ZJTEUKLWVjaG8gIiAgICA8dGl0bGU+JFRJVExFPC90aXRsZT4iID4+ICRSRVNVTFRfRklMRQotZWNobyAiICAgIDxtZXRhIGh0dHAtZXF1aXY9XCJyZWZyZXNoXCIgY29udGVudD1cIjQzMjAwXCI+IiA+PiAkUkVTVUxUX0ZJTEUKLWVjaG8gIiAgPC9oZWFkPiIgPj4gJFJFU1VMVF9GSUxFCi1lY2hvICI8Ym9keT4iID4+ICRSRVNVTFRfRklMRQotZWNobyAiPGgyPkF1dG9tYXRlZCBQeXRob24gQnVpbGQgUmVzdWx0czwvaDI+IiA+PiAkUkVTVUxUX0ZJTEUKLWVjaG8gIjx0YWJsZT4iID4+ICRSRVNVTFRfRklMRQotZWNobyAiICA8dHI+IiA+PiAkUkVTVUxUX0ZJTEUKLWVjaG8gIiAgICA8dGQ+QnVpbHQgb246PC90ZD48dGQ+YGRhdGVgPC90ZD4iID4+ICRSRVNVTFRfRklMRQotZWNobyAiICA8L3RyPjx0cj4iID4+ICRSRVNVTFRfRklMRQotZWNobyAiICAgIDx0ZD5Ib3N0bmFtZTo8L3RkPjx0ZD5gdW5hbWUgLW5gPC90ZD4iID4+ICRSRVNVTFRfRklMRQotZWNobyAiICA8L3RyPjx0cj4iID4+ICRSRVNVTFRfRklMRQotZWNobyAiICAgIDx0ZD5QbGF0Zm9ybTo8L3RkPjx0ZD5gdW5hbWUgLXNybXBvYDwvdGQ+IiA+PiAkUkVTVUxUX0ZJTEUKLWVjaG8gIiAgPC90cj48dHI+IiA+PiAkUkVTVUxUX0ZJTEUKLWVjaG8gIiAgICA8dGQ+VVJMOjwvdGQ+PHRkPiRyZXBvX3BhdGg8L3RkPiIgPj4gJFJFU1VMVF9GSUxFCi1lY2hvICIgIDwvdHI+IiA+PiAkUkVTVUxUX0ZJTEUKLWVjaG8gIjwvdGFibGU+IiA+PiAkUkVTVUxUX0ZJTEUKLWVjaG8gIjx1bD4iID4+ICRSRVNVTFRfRklMRQotCi0jIyB1cGRhdGUsIGJ1aWxkLCBhbmQgdGVzdAotT1JJR19DSEVDS1NVTT1gY2tzdW0gJEZVTExQQVRITkFNRWAKLUY9c3ZuLXVwZGF0ZS5vdXQKLXN0YXJ0PWBjdXJyZW50X3RpbWVgCi1zdm4gdXBkYXRlID4mIGJ1aWxkLyRGCi1lcnI9JD8KLXVwZGF0ZV9zdGF0dXMgIlVwZGF0aW5nIiAiJEYiICRzdGFydAotaWYgWyAkZXJyID0gMCAtYSAiJEJVSUxEX0RJU0FCTEVEIiAhPSAieWVzIiBdOyB0aGVuCi0gICAgIyMgRklYTUU6IHdlIHNob3VsZCBjaGVjayBpZiB0aGlzIGZpbGUgaGFzIGNoYW5nZWQuCi0gICAgIyMgIElmIGl0IGhhcyBjaGFuZ2VkLCB3ZSBzaG91bGQgcmUtcnVuIHRoZSBzY3JpcHQgdG8gcGljayB1cCBjaGFuZ2VzLgotICAgIGlmIFsgIiRPUklHX0NIRUNLU1VNIiAhPSAiJE9SSUdfQ0hFQ0tTVU0iIF07IHRoZW4KLSAgICAgICAgZXhlYyAkRlVMTFBBVEhOQU1FICRACi0gICAgZmkKLQotICAgIEY9c3ZuLXN0YXQub3V0Ci0gICAgc3RhcnQ9YGN1cnJlbnRfdGltZWAKLSAgICBzdm4gc3RhdCA+JiBidWlsZC8kRgotICAgICMjIGlnbm9yZSBzb21lIG9mIHRoZSBkaWZmcwotICAgIE5VTV9ESUZGUz1gZWdyZXAgLXZjICdeLiAgICAgIChAdGVzdHxkYl9ob21lfExpYi90ZXN0LyhyZWdydGVzdFwucHl8ZGJfaG9tZSkpJCcgYnVpbGQvJEZgCi0gICAgdXBkYXRlX3N0YXR1cyAic3ZuIHN0YXQgKCROVU1fRElGRlMgcG9zc2libHkgaW1wb3J0YW50IGRpZmZzKSIgIiRGIiAkc3RhcnQKLQotICAgIEY9Y29uZmlndXJlLm91dAotICAgIHN0YXJ0PWBjdXJyZW50X3RpbWVgCi0gICAgLi9jb25maWd1cmUgLS1wcmVmaXg9JElOU1RBTExfRElSIC0td2l0aC1weWRlYnVnID4mIGJ1aWxkLyRGCi0gICAgZXJyPSQ/Ci0gICAgdXBkYXRlX3N0YXR1cyAiQ29uZmlndXJpbmciICIkRiIgJHN0YXJ0Ci0gICAgaWYgWyAkZXJyID0gMCBdOyB0aGVuCi0gICAgICAgIEY9bWFrZS5vdXQKLSAgICAgICAgc3RhcnQ9YGN1cnJlbnRfdGltZWAKLSAgICAgICAgbWFrZSA+JiBidWlsZC8kRgotICAgICAgICBlcnI9JD8KLSAgICAgICAgd2FybmluZ3M9YGdyZXAgd2FybmluZyBidWlsZC8kRiB8IGVncmVwIC12YyAidGU/bXBuYW0oX3J8KScgaXMgZGFuZ2Vyb3VzLCJgCi0gICAgICAgIHVwZGF0ZV9zdGF0dXMgIkJ1aWxkaW5nICgkd2FybmluZ3Mgd2FybmluZ3MpIiAiJEYiICRzdGFydAotICAgICAgICBpZiBbICRlcnIgPSAwIF07IHRoZW4KLSAgICAgICAgICAgICMjIG1ha2UgaW5zdGFsbAotICAgICAgICAgICAgRj1tYWtlLWluc3RhbGwub3V0Ci0gICAgICAgICAgICBzdGFydD1gY3VycmVudF90aW1lYAotICAgICAgICAgICAgbWFrZSBpbnN0YWxsID4mIGJ1aWxkLyRGCi0gICAgICAgICAgICB1cGRhdGVfc3RhdHVzICJJbnN0YWxsaW5nIiAiJEYiICRzdGFydAotCi0gICAgICAgICAgICBpZiBbICEgLXggJFBZVEhPTiBdOyB0aGVuCi0gICAgICAgICAgICAgICAgbG4gLXMgJHtQWVRIT059Mi4qICRQWVRIT04KLSAgICAgICAgICAgIGZpCi0KLSAgICAgICAgICAgICMjIG1ha2UgYW5kIHJ1biBiYXNpYyB0ZXN0cwotICAgICAgICAgICAgRj1tYWtlLXRlc3Qub3V0Ci0gICAgICAgICAgICBzdGFydD1gY3VycmVudF90aW1lYAotICAgICAgICAgICAgJFBZVEhPTiAkUkVHUlRFU1RfQVJHUyAtVyAtdSB1cmxmZXRjaCA+JiBidWlsZC8kRgotICAgICAgICAgICAgTlVNX0ZBSUxVUkVTPWBjb3VudF9mYWlsdXJlcyBidWlsZC8kRmAKLSAgICAgICAgICAgIHBsYWNlX3N1bW1hcnlfZmlyc3QgYnVpbGQvJEYKLSAgICAgICAgICAgIHVwZGF0ZV9zdGF0dXMgIlRlc3RpbmcgYmFzaWNzICgkTlVNX0ZBSUxVUkVTIGZhaWx1cmVzKSIgIiRGIiAkc3RhcnQKLSAgICAgICAgICAgIG1haWxfb25fZmFpbHVyZSAiYmFzaWNzIiBidWlsZC8kRgotCi0gICAgICAgICAgICBGPW1ha2UtdGVzdC1vcHQub3V0Ci0gICAgICAgICAgICBzdGFydD1gY3VycmVudF90aW1lYAotICAgICAgICAgICAgJFBZVEhPTiAtTyAkUkVHUlRFU1RfQVJHUyAtVyAtdSB1cmxmZXRjaCA+JiBidWlsZC8kRgotICAgICAgICAgICAgTlVNX0ZBSUxVUkVTPWBjb3VudF9mYWlsdXJlcyBidWlsZC8kRmAKLSAgICAgICAgICAgIHBsYWNlX3N1bW1hcnlfZmlyc3QgYnVpbGQvJEYKLSAgICAgICAgICAgIHVwZGF0ZV9zdGF0dXMgIlRlc3Rpbmcgb3B0ICgkTlVNX0ZBSUxVUkVTIGZhaWx1cmVzKSIgIiRGIiAkc3RhcnQKLSAgICAgICAgICAgIG1haWxfb25fZmFpbHVyZSAib3B0IiBidWlsZC8kRgotCi0gICAgICAgICAgICAjIyBydW4gdGhlIHRlc3RzIGxvb2tpbmcgZm9yIGxlYWtzCi0gICAgICAgICAgICBGPW1ha2UtdGVzdC1yZWZsZWFrLm91dAotICAgICAgICAgICAgc3RhcnQ9YGN1cnJlbnRfdGltZWAKLSAgICAgICAgICAgICMjIGVuc3VyZSB0aGF0IHRoZSByZWZsb2cgZXhpc3RzIHNvIHRoZSBncmVwIGRvZXNuJ3QgZmFpbAotICAgICAgICAgICAgdG91Y2ggJFJFRkxPRwotICAgICAgICAgICAgJFBZVEhPTiAkUkVHUlRFU1RfQVJHUyAtUiA0OjM6JFJFRkxPRyAtdSBuZXR3b3JrICRMRUFLWV9TS0lQUyA+JiBidWlsZC8kRgotICAgICAgICAgICAgTEVBS19QQVQ9IigkTEVBS1lfVEVTVFN8c3VtPTApIgotICAgICAgICAgICAgTlVNX0ZBSUxVUkVTPWBlZ3JlcCAtdmMgIiRMRUFLX1BBVCIgJFJFRkxPR2AKLSAgICAgICAgICAgIHBsYWNlX3N1bW1hcnlfZmlyc3QgYnVpbGQvJEYKLSAgICAgICAgICAgIHVwZGF0ZV9zdGF0dXMgIlRlc3RpbmcgcmVmbGVha3MgKCROVU1fRkFJTFVSRVMgZmFpbHVyZXMpIiAiJEYiICRzdGFydAotICAgICAgICAgICAgbWFpbF9vbl9mYWlsdXJlICJyZWZsZWFrIiAkUkVGTE9HICIkTEVBS19QQVQiCi0KLSAgICAgICAgICAgICMjIG5vdyB0cnkgdG8gcnVuIGFsbCB0aGUgdGVzdHMKLSAgICAgICAgICAgIEY9bWFrZS10ZXN0YWxsLm91dAotICAgICAgICAgICAgc3RhcnQ9YGN1cnJlbnRfdGltZWAKLSAgICAgICAgICAgICMjIHNraXAgY3Vyc2VzIHdoZW4gcnVubmluZyBmcm9tIGNyb24gc2luY2UgdGhlcmUncyBubyB0ZXJtaW5hbAotICAgICAgICAgICAgIyMgc2tpcCBzb3VuZCBzaW5jZSBpdCdzIG5vdCBzZXR1cCBvbiB0aGUgUFNGIGJveCAoL2Rldi9kc3ApCi0gICAgICAgICAgICAkUFlUSE9OICRSRUdSVEVTVF9BUkdTIC1XIC11YWxsIC14IHRlc3RfY3Vyc2VzIHRlc3RfbGludXhhdWRpb2RldiB0ZXN0X29zc2F1ZGlvZGV2ID4mIGJ1aWxkLyRGCi0gICAgICAgICAgICBOVU1fRkFJTFVSRVM9YGNvdW50X2ZhaWx1cmVzIGJ1aWxkLyRGYAotICAgICAgICAgICAgcGxhY2Vfc3VtbWFyeV9maXJzdCBidWlsZC8kRgotICAgICAgICAgICAgdXBkYXRlX3N0YXR1cyAiVGVzdGluZyBhbGwgZXhjZXB0IGN1cnNlcyBhbmQgc291bmQgKCROVU1fRkFJTFVSRVMgZmFpbHVyZXMpIiAiJEYiICRzdGFydAotICAgICAgICAgICAgbWFpbF9vbl9mYWlsdXJlICJhbGwiIGJ1aWxkLyRGCi0gICAgICAgIGZpCi0gICAgZmkKLWZpCi0KLQotIyMgbWFrZSBkb2MKLWNkICRESVIvRG9jCi1GPSJtYWtlLWRvYy5vdXQiCi1zdGFydD1gY3VycmVudF90aW1lYAotbWFrZSBjbGVhbiA+IC4uL2J1aWxkLyRGIDI+JjEKLW1ha2UgY2hlY2tvdXQgaHRtbCA+PiAuLi9idWlsZC8kRiAyPiYxCi1lcnI9JD8KLXVwZGF0ZV9zdGF0dXMgIk1ha2luZyBkb2MiICIkRiIgJHN0YXJ0Ci1pZiBbICRlcnIgIT0gMCBdOyB0aGVuCi0gICAgTlVNX0ZBSUxVUkVTPTEKLSAgICBtYWlsX29uX2ZhaWx1cmUgImRvYyIgLi4vYnVpbGQvJEYKLWZpCi0KLWVjaG8gIjwvdWw+IiA+PiAkUkVTVUxUX0ZJTEUKLWVjaG8gIjwvYm9keT4iID4+ICRSRVNVTFRfRklMRQotZWNobyAiPC9odG1sPiIgPj4gJFJFU1VMVF9GSUxFCi0KLSMjIGNvcHkgcmVzdWx0cwotIyMgKG5vdCB1c2VkIGFueW1vcmUsIHRoZSBkYWlseSBidWlsZCBpcyBub3cgZG9uZSBkaXJlY3RseSBvbiB0aGUgc2VydmVyKQotI2NoZ3JwIC1SIHdlYm1hc3RlciBidWlsZC9odG1sCi0jY2htb2QgLVIgZyt3IGJ1aWxkL2h0bWwKLSNyc3luYyAkUlNZTkNfT1BUUyBidWlsZC9odG1sLyogJFJFTU9URV9TWVNURU06JFJFTU9URV9ESVIKLSNjZCAuLi9idWlsZAotI3JzeW5jICRSU1lOQ19PUFRTIGluZGV4Lmh0bWwgKi5vdXQgJFJFTU9URV9TWVNURU06JFJFTU9URV9ESVIvcmVzdWx0cy8KZGlmZiAtLWdpdCBhL01pc2MvcHl0aG9uLWNvbmZpZy5pbiBiL01pc2MvcHl0aG9uLWNvbmZpZy5pbgppbmRleCA1NTJiYmQ1Li5jYTk4NTdhIDEwMDY0NAotLS0gYS9NaXNjL3B5dGhvbi1jb25maWcuaW4KKysrIGIvTWlzYy9weXRob24tY29uZmlnLmluCkBAIC01MSw2ICs1MSw3IEBACiAgICAgICAgIGlmIG9wdCA9PSAnLS1sZGZsYWdzJzoKICAgICAgICAgICAgIGlmIG5vdCBnZXR2YXIoJ1B5X0VOQUJMRV9TSEFSRUQnKToKICAgICAgICAgICAgICAgICBsaWJzLmluc2VydCgwLCAnLUwnICsgZ2V0dmFyKCdMSUJQTCcpKQotICAgICAgICAgICAgbGlicy5leHRlbmQoZ2V0dmFyKCdMSU5LRk9SU0hBUkVEJykuc3BsaXQoKSkKKyAgICAgICAgICAgIGlmIG5vdCBnZXR2YXIoJ1BZVEhPTkZSQU1FV09SSycpOgorICAgICAgICAgICAgICAgIGxpYnMuZXh0ZW5kKGdldHZhcignTElOS0ZPUlNIQVJFRCcpLnNwbGl0KCkpCiAgICAgICAgIHByaW50ICcgJy5qb2luKGxpYnMpCiAKZGlmZiAtLWdpdCBhL01pc2MvcHl0aG9uLm1hbiBiL01pc2MvcHl0aG9uLm1hbgppbmRleCA5MzA4Nzg3Li4zOWVkYmNhIDEwMDY0NAotLS0gYS9NaXNjL3B5dGhvbi5tYW4KKysrIGIvTWlzYy9weXRob24ubWFuCkBAIC0zNCw2ICszNCw5IEBACiAuQiBcLU9PCiBdCiBbCisuQiBcLVIKK10KK1sKIC5CIC1RCiAuSSBhcmd1bWVudAogXQpAQCAtMTUxLDYgKzE1NCwxOCBAQAogLkIgXC1PTwogRGlzY2FyZCBkb2NzdHJpbmdzIGluIGFkZGl0aW9uIHRvIHRoZSBcZkItT1xmUCBvcHRpbWl6YXRpb25zLgogLlRQCisuQiBcLVIKK1R1cm4gb24gImhhc2ggcmFuZG9taXphdGlvbiIsIHNvIHRoYXQgdGhlIGhhc2goKSB2YWx1ZXMgb2Ygc3RyLCBieXRlcyBhbmQKK2RhdGV0aW1lIG9iamVjdHMgYXJlICJzYWx0ZWQiIHdpdGggYW4gdW5wcmVkaWN0YWJsZSBwc2V1ZG8tcmFuZG9tIHZhbHVlLgorQWx0aG91Z2ggdGhleSByZW1haW4gY29uc3RhbnQgd2l0aGluIGFuIGluZGl2aWR1YWwgUHl0aG9uIHByb2Nlc3MsIHRoZXkgYXJlCitub3QgcHJlZGljdGFibGUgYmV0d2VlbiByZXBlYXRlZCBpbnZvY2F0aW9ucyBvZiBQeXRob24uCisuSVAKK1RoaXMgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBwcm90ZWN0aW9uIGFnYWluc3QgYSBkZW5pYWwgb2Ygc2VydmljZQorY2F1c2VkIGJ5IGNhcmVmdWxseS1jaG9zZW4gaW5wdXRzIHRoYXQgZXhwbG9pdCB0aGUgd29yc3QgY2FzZSBwZXJmb3JtYW5jZQorb2YgYSBkaWN0IGNvbnN0cnVjdGlvbiwgTyhuXjIpIGNvbXBsZXhpdHkuICBTZWUKK2h0dHA6Ly93d3cub2NlcnQub3JnL2Fkdmlzb3JpZXMvb2NlcnQtMjAxMS0wMDMuaHRtbAorZm9yIGRldGFpbHMuCisuVFAKIC5CSSAiXC1RICIgYXJndW1lbnQKIERpdmlzaW9uIGNvbnRyb2w7IHNlZSBQRVAgMjM4LiAgVGhlIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mICJvbGQiICh0aGUKIGRlZmF1bHQsIGludC9pbnQgYW5kIGxvbmcvbG9uZyByZXR1cm4gYW4gaW50IG9yIGxvbmcpLCAibmV3IiAobmV3CkBAIC00MjMsNiArNDM4LDIwIEBACiAuSVAgUFlUSE9OV0FSTklOR1MKIElmIHRoaXMgaXMgc2V0IHRvIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZyBpdCBpcyBlcXVpdmFsZW50IHRvCiBzcGVjaWZ5aW5nIHRoZSBcZkJcLVdcZlAgb3B0aW9uIGZvciBlYWNoIHNlcGFyYXRlIHZhbHVlLgorLklQIFBZVEhPTkhBU0hTRUVECitJZiB0aGlzIHZhcmlhYmxlIGlzIHNldCB0byAicmFuZG9tIiwgdGhlIGVmZmVjdCBpcyB0aGUgc2FtZSBhcyBzcGVjaWZ5aW5nCit0aGUgXGZCLVJcZlAgb3B0aW9uOiBhIHJhbmRvbSB2YWx1ZSBpcyB1c2VkIHRvIHNlZWQgdGhlIGhhc2hlcyBvZiBzdHIsCitieXRlcyBhbmQgZGF0ZXRpbWUgb2JqZWN0cy4KKworSWYgUFlUSE9OSEFTSFNFRUQgaXMgc2V0IHRvIGFuIGludGVnZXIgdmFsdWUsIGl0IGlzIHVzZWQgYXMgYSBmaXhlZCBzZWVkIGZvcgorZ2VuZXJhdGluZyB0aGUgaGFzaCgpIG9mIHRoZSB0eXBlcyBjb3ZlcmVkIGJ5IHRoZSBoYXNoIHJhbmRvbWl6YXRpb24uICBJdHMKK3B1cnBvc2UgaXMgdG8gYWxsb3cgcmVwZWF0YWJsZSBoYXNoaW5nLCBzdWNoIGFzIGZvciBzZWxmdGVzdHMgZm9yIHRoZQoraW50ZXJwcmV0ZXIgaXRzZWxmLCBvciB0byBhbGxvdyBhIGNsdXN0ZXIgb2YgcHl0aG9uIHByb2Nlc3NlcyB0byBzaGFyZSBoYXNoCit2YWx1ZXMuCisKK1RoZSBpbnRlZ2VyIG11c3QgYmUgYSBkZWNpbWFsIG51bWJlciBpbiB0aGUgcmFuZ2UgWzAsNDI5NDk2NzI5NV0uICBTcGVjaWZ5aW5nCit0aGUgdmFsdWUgMCB3aWxsIGxlYWQgdG8gdGhlIHNhbWUgaGFzaCB2YWx1ZXMgYXMgd2hlbiBoYXNoIHJhbmRvbWl6YXRpb24gaXMKK2Rpc2FibGVkLgogLlNIIEFVVEhPUgogVGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uOiBodHRwOi8vd3d3LnB5dGhvbi5vcmcvcHNmCiAuU0ggSU5URVJORVQgUkVTT1VSQ0VTCkBAIC00MzAsNyArNDU5LDcgQEAKIC5icgogRG9jdW1lbnRhdGlvbjogIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvCiAuYnIKLURldmVsb3BlciByZXNvdXJjZXM6ICBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZGV2LworRGV2ZWxvcGVyIHJlc291cmNlczogIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvZGV2Z3VpZGUvCiAuYnIKIERvd25sb2FkczogIGh0dHA6Ly9weXRob24ub3JnL2Rvd25sb2FkLwogLmJyCmRpZmYgLS1naXQgYS9Nb2R1bGVzL1NldHVwLmRpc3QgYi9Nb2R1bGVzL1NldHVwLmRpc3QKaW5kZXggZTAyZmQ3Ny4uMmFkMWFhMyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9TZXR1cC5kaXN0CisrKyBiL01vZHVsZXMvU2V0dXAuZGlzdApAQCAtMTc3LDYgKzE3Nyw3IEBACiAjX3Rlc3RjYXBpIF90ZXN0Y2FwaW1vZHVsZS5jICAgICMgUHl0aG9uIEMgQVBJIHRlc3QgbW9kdWxlCiAjX3JhbmRvbSBfcmFuZG9tbW9kdWxlLmMJIyBSYW5kb20gbnVtYmVyIGdlbmVyYXRvcgogI19jb2xsZWN0aW9ucyBfY29sbGVjdGlvbnNtb2R1bGUuYyAjIENvbnRhaW5lciB0eXBlcworI19oZWFwcSBfaGVhcHFtb2R1bGUuYwkJIyBIZWFwcSB0eXBlCiAjaXRlcnRvb2xzIGl0ZXJ0b29sc21vZHVsZS5jCSMgRnVuY3Rpb25zIGNyZWF0aW5nIGl0ZXJhdG9ycyBmb3IgZWZmaWNpZW50IGxvb3BpbmcgCiAjc3Ryb3Agc3Ryb3Btb2R1bGUuYwkJIyBTdHJpbmcgbWFuaXB1bGF0aW9ucwogI19mdW5jdG9vbHMgX2Z1bmN0b29sc21vZHVsZS5jCSMgVG9vbHMgZm9yIHdvcmtpbmcgd2l0aCBmdW5jdGlvbnMgYW5kIGNhbGxhYmxlIG9iamVjdHMKQEAgLTE5MCw2ICsxOTEsOSBAQAogIyBhY2Nlc3MgdG8gSVNPIEMgbG9jYWxlIHN1cHBvcnQKICNfbG9jYWxlIF9sb2NhbGVtb2R1bGUuYyAgIyAtbGludGwKIAorIyBTdGFuZGFyZCBJL08gYmFzZWxpbmUKKyNfaW8gLUkkKHNyY2RpcikvTW9kdWxlcy9faW8gX2lvL2J1ZmZlcmVkaW8uYyBfaW8vYnl0ZXNpby5jIF9pby9maWxlaW8uYyBfaW8vaW9iYXNlLmMgX2lvL19pb21vZHVsZS5jIF9pby9zdHJpbmdpby5jIF9pby90ZXh0aW8uYworCiAKICMgTW9kdWxlcyB3aXRoIHNvbWUgVU5JWCBkZXBlbmRlbmNpZXMgLS0gb24gYnkgZGVmYXVsdDoKICMgKElmIHlvdSBoYXZlIGEgcmVhbGx5IGJhY2t3YXJkIFVOSVgsIHNlbGVjdCBhbmQgc29ja2V0IG1heSBub3QgYmUKQEAgLTIwNyw3ICsyMTEsNyBAQAogI19jc3YgX2Nzdi5jCiAKICMgU29ja2V0IG1vZHVsZSBoZWxwZXIgZm9yIHNvY2tldCgyKQotI19zb2NrZXQgc29ja2V0bW9kdWxlLmMKKyNfc29ja2V0IHNvY2tldG1vZHVsZS5jIHRpbWVtb2R1bGUuYwogCiAjIFNvY2tldCBtb2R1bGUgaGVscGVyIGZvciBTU0wgc3VwcG9ydDsgeW91IG11c3QgY29tbWVudCBvdXQgdGhlIG90aGVyCiAjIHNvY2tldCBsaW5lIGFib3ZlLCBhbmQgcG9zc2libHkgZWRpdCB0aGUgU1NMIHZhcmlhYmxlOgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fYmlzZWN0bW9kdWxlLmMgYi9Nb2R1bGVzL19iaXNlY3Rtb2R1bGUuYwppbmRleCBlODk3NmIyLi5iNjY1MmMwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19iaXNlY3Rtb2R1bGUuYworKysgYi9Nb2R1bGVzL19iaXNlY3Rtb2R1bGUuYwpAQCAtMjEsNyArMjEsMTAgQEAKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgd2hpbGUgKGxvIDwgaGkpIHsKLSAgICAgICAgbWlkID0gKGxvICsgaGkpIC8gMjsKKyAgICAgICAgLyogVGhlIChzaXplX3QpY2FzdCBlbnN1cmVzIHRoYXQgdGhlIGFkZGl0aW9uIGFuZCBzdWJzZXF1ZW50IGRpdmlzaW9uCisgICAgICAgICAgIGFyZSBwZXJmb3JtZWQgYXMgdW5zaWduZWQgb3BlcmF0aW9ucywgYXZvaWRpbmcgZGlmZmljdWx0aWVzIGZyb20KKyAgICAgICAgICAgc2lnbmVkIG92ZXJmbG93LiAgKFNlZSBpc3N1ZSAxMzQ5Ni4pICovCisgICAgICAgIG1pZCA9ICgoc2l6ZV90KWxvICsgaGkpIC8gMjsKICAgICAgICAgbGl0ZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0obGlzdCwgbWlkKTsKICAgICAgICAgaWYgKGxpdGVtID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm4gLTE7CkBAIC01Niw3ICs1OSw4IEBACiB9CiAKIFB5RG9jX1NUUlZBUihiaXNlY3RfcmlnaHRfZG9jLAotImJpc2VjdF9yaWdodChhLCB4WywgbG9bLCBoaV1dKSAtPiBpbmRleFxuXAorImJpc2VjdChhLCB4WywgbG9bLCBoaV1dKSAtPiBpbmRleFxuXAorYmlzZWN0X3JpZ2h0KGEsIHhbLCBsb1ssIGhpXV0pIC0+IGluZGV4XG5cCiBcblwKIFJldHVybiB0aGUgaW5kZXggd2hlcmUgdG8gaW5zZXJ0IGl0ZW0geCBpbiBsaXN0IGEsIGFzc3VtaW5nIGEgaXMgc29ydGVkLlxuXAogXG5cCkBAIC05Nyw3ICsxMDEsOCBAQAogfQogCiBQeURvY19TVFJWQVIoaW5zb3J0X3JpZ2h0X2RvYywKLSJpbnNvcnRfcmlnaHQoYSwgeFssIGxvWywgaGldXSlcblwKKyJpbnNvcnQoYSwgeFssIGxvWywgaGldXSlcblwKK2luc29ydF9yaWdodChhLCB4WywgbG9bLCBoaV1dKVxuXAogXG5cCiBJbnNlcnQgaXRlbSB4IGluIGxpc3QgYSwgYW5kIGtlZXAgaXQgc29ydGVkIGFzc3VtaW5nIGEgaXMgc29ydGVkLlxuXAogXG5cCkBAIC0xMjIsNyArMTI3LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIHdoaWxlIChsbyA8IGhpKSB7Ci0gICAgICAgIG1pZCA9IChsbyArIGhpKSAvIDI7CisgICAgICAgIC8qIFRoZSAoc2l6ZV90KWNhc3QgZW5zdXJlcyB0aGF0IHRoZSBhZGRpdGlvbiBhbmQgc3Vic2VxdWVudCBkaXZpc2lvbgorICAgICAgICAgICBhcmUgcGVyZm9ybWVkIGFzIHVuc2lnbmVkIG9wZXJhdGlvbnMsIGF2b2lkaW5nIGRpZmZpY3VsdGllcyBmcm9tCisgICAgICAgICAgIHNpZ25lZCBvdmVyZmxvdy4gIChTZWUgaXNzdWUgMTM0OTYuKSAqLworICAgICAgICBtaWQgPSAoKHNpemVfdClsbyArIGhpKSAvIDI7CiAgICAgICAgIGxpdGVtID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGxpc3QsIG1pZCk7CiAgICAgICAgIGlmIChsaXRlbSA9PSBOVUxMKQogICAgICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMTg3LDcgKzE5NSw3IEBACiAgICAgICAgIGlmIChQeUxpc3RfSW5zZXJ0KGxpc3QsIGluZGV4LCBpdGVtKSA8IDApCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGxpc3QsICJpbnNlcnQiLCAiaU8iLAorICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGxpc3QsICJpbnNlcnQiLCAibk8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBpdGVtKTsKICAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yMDcsMTggKzIxNSwxNSBAQAogT3B0aW9uYWwgYXJncyBsbyAoZGVmYXVsdCAwKSBhbmQgaGkgKGRlZmF1bHQgbGVuKGEpKSBib3VuZCB0aGVcblwKIHNsaWNlIG9mIGEgdG8gYmUgc2VhcmNoZWQuXG4iKTsKIAotUHlEb2NfU1RSVkFSKGJpc2VjdF9kb2MsICJBbGlhcyBmb3IgYmlzZWN0X3JpZ2h0KCkuXG4iKTsKLVB5RG9jX1NUUlZBUihpbnNvcnRfZG9jLCAiQWxpYXMgZm9yIGluc29ydF9yaWdodCgpLlxuIik7Ci0KIHN0YXRpYyBQeU1ldGhvZERlZiBiaXNlY3RfbWV0aG9kc1tdID0gewogICAgIHsiYmlzZWN0X3JpZ2h0IiwgKFB5Q0Z1bmN0aW9uKWJpc2VjdF9yaWdodCwKICAgICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIGJpc2VjdF9yaWdodF9kb2N9LAogICAgIHsiYmlzZWN0IiwgKFB5Q0Z1bmN0aW9uKWJpc2VjdF9yaWdodCwKLSAgICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIGJpc2VjdF9kb2N9LAorICAgICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgYmlzZWN0X3JpZ2h0X2RvY30sCiAgICAgeyJpbnNvcnRfcmlnaHQiLCAoUHlDRnVuY3Rpb24paW5zb3J0X3JpZ2h0LAogICAgICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgaW5zb3J0X3JpZ2h0X2RvY30sCiAgICAgeyJpbnNvcnQiLCAoUHlDRnVuY3Rpb24paW5zb3J0X3JpZ2h0LAotICAgICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgaW5zb3J0X2RvY30sCisgICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBpbnNvcnRfcmlnaHRfZG9jfSwKICAgICB7ImJpc2VjdF9sZWZ0IiwgKFB5Q0Z1bmN0aW9uKWJpc2VjdF9sZWZ0LAogICAgICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgYmlzZWN0X2xlZnRfZG9jfSwKICAgICB7Imluc29ydF9sZWZ0IiwgKFB5Q0Z1bmN0aW9uKWluc29ydF9sZWZ0LApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fYnNkZGIuYyBiL01vZHVsZXMvX2JzZGRiLmMKaW5kZXggZDk5ZGY0Yi4uMjAzYmJhMiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fYnNkZGIuYworKysgYi9Nb2R1bGVzL19ic2RkYi5jCkBAIC02NCw3ICs2NCw3IEBACiAgKgogICogaHR0cDovL3d3dy5weXRob24ub3JnL3BlcHMvcGVwLTAyOTEuaHRtbAogICoKLSAqIFRoaXMgbW9kdWxlIGNvbnRhaW5zIDYgdHlwZXM6CisgKiBUaGlzIG1vZHVsZSBjb250YWlucyA3IHR5cGVzOgogICoKICAqIERCICAgICAgICAgICAoRGF0YWJhc2UpCiAgKiBEQkN1cnNvciAgICAgKERhdGFiYXNlIEN1cnNvcikKQEAgLTcyLDYgKzcyLDcgQEAKICAqIERCVHhuICAgICAgICAoQW4gZXhwbGljaXQgZGF0YWJhc2UgdHJhbnNhY3Rpb24pCiAgKiBEQkxvY2sgICAgICAgKEEgbG9jayBoYW5kbGUpCiAgKiBEQlNlcXVlbmNlICAgKFNlcXVlbmNlKQorICogREJTaXRlICAgICAgIChTaXRlKQogICoKICAqIE1vcmUgZGF0YXR5cGVzIGFkZGVkOgogICoKQEAgLTEzNSwzNCArMTM2LDExIEBACiAjZGVmaW5lIE1ZREJfQkVHSU5fQUxMT1dfVEhSRUFEUyBQeV9CRUdJTl9BTExPV19USFJFQURTOwogI2RlZmluZSBNWURCX0VORF9BTExPV19USFJFQURTIFB5X0VORF9BTExPV19USFJFQURTOwogCi0vKiBGb3IgMi4zLCB1c2UgdGhlIFB5R0lMU3RhdGVfIGNhbGxzICovCi0jaWYgKFBZX1ZFUlNJT05fSEVYID49IDB4MDIwMzAwMDApCi0jZGVmaW5lIE1ZREJfVVNFX0dJTFNUQVRFCi0jZW5kaWYKLQogLyogYW5kIHRoZXNlIGFyZSBmb3IgY2FsbGluZyBDIC0tPiBQeXRob24gKi8KLSNpZiBkZWZpbmVkKE1ZREJfVVNFX0dJTFNUQVRFKQogI2RlZmluZSBNWURCX0JFR0lOX0JMT0NLX1RIUkVBRFMgXAogICAgICAgICAgICAgICAgIFB5R0lMU3RhdGVfU1RBVEUgX19zYXZlc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOwogI2RlZmluZSBNWURCX0VORF9CTE9DS19USFJFQURTIFwKICAgICAgICAgICAgICAgICBQeUdJTFN0YXRlX1JlbGVhc2UoX19zYXZlc3RhdGUpOwotI2Vsc2UgLyogTVlEQl9VU0VfR0lMU1RBVEUgKi8KLS8qIFByZSBHSUxTdGF0ZSBBUEkgLSBkbyBpdCB0aGUgbG9uZyBvbGQgd2F5ICovCi1zdGF0aWMgUHlJbnRlcnByZXRlclN0YXRlKiBfZGJfaW50ZXJwcmV0ZXJTdGF0ZSA9IE5VTEw7Ci0jZGVmaW5lIE1ZREJfQkVHSU5fQkxPQ0tfVEhSRUFEUyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBQeVRocmVhZFN0YXRlKiBwcmV2U3RhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgUHlUaHJlYWRTdGF0ZSogbmV3U3RhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIFB5RXZhbF9BY3F1aXJlTG9jaygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuZXdTdGF0ZSAgPSBQeVRocmVhZFN0YXRlX05ldyhfZGJfaW50ZXJwcmV0ZXJTdGF0ZSk7ICAgIFwKLSAgICAgICAgcHJldlN0YXRlID0gUHlUaHJlYWRTdGF0ZV9Td2FwKG5ld1N0YXRlKTsKLQotI2RlZmluZSBNWURCX0VORF9CTE9DS19USFJFQURTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgbmV3U3RhdGUgPSBQeVRocmVhZFN0YXRlX1N3YXAocHJldlN0YXRlKTsgICAgICAgICAgICAgICBcCi0gICAgICAgIFB5VGhyZWFkU3RhdGVfQ2xlYXIobmV3U3RhdGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBQeUV2YWxfUmVsZWFzZUxvY2soKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgUHlUaHJlYWRTdGF0ZV9EZWxldGUobmV3U3RhdGUpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0KLSNlbmRpZiAvKiBNWURCX1VTRV9HSUxTVEFURSAqLwogCiAjZWxzZQogLyogQ29tcGlsZWQgd2l0aG91dCB0aHJlYWRzIC0gYXZvaWQgYWxsIHRoaXMgY3J1ZnQgKi8KQEAgLTE4NywyNCArMTY1LDI0IEBACiBzdGF0aWMgUHlPYmplY3QqIERCUnVuUmVjb3ZlcnlFcnJvcjsgICAgLyogREJfUlVOUkVDT1ZFUlkgKi8KIHN0YXRpYyBQeU9iamVjdCogREJWZXJpZnlCYWRFcnJvcjsgICAgICAvKiBEQl9WRVJJRllfQkFEICovCiBzdGF0aWMgUHlPYmplY3QqIERCTm9TZXJ2ZXJFcnJvcjsgICAgICAgLyogREJfTk9TRVJWRVIgKi8KKyNpZiAoREJWRVIgPCA1MikKIHN0YXRpYyBQeU9iamVjdCogREJOb1NlcnZlckhvbWVFcnJvcjsgICAvKiBEQl9OT1NFUlZFUl9IT01FICovCiBzdGF0aWMgUHlPYmplY3QqIERCTm9TZXJ2ZXJJREVycm9yOyAgICAgLyogREJfTk9TRVJWRVJfSUQgKi8KKyNlbmRpZgogc3RhdGljIFB5T2JqZWN0KiBEQlBhZ2VOb3RGb3VuZEVycm9yOyAgIC8qIERCX1BBR0VfTk9URk9VTkQgKi8KIHN0YXRpYyBQeU9iamVjdCogREJTZWNvbmRhcnlCYWRFcnJvcjsgICAvKiBEQl9TRUNPTkRBUllfQkFEICovCiAKIHN0YXRpYyBQeU9iamVjdCogREJJbnZhbGlkQXJnRXJyb3I7ICAgICAvKiBFSU5WQUwgKi8KIHN0YXRpYyBQeU9iamVjdCogREJBY2Nlc3NFcnJvcjsgICAgICAgICAvKiBFQUNDRVMgKi8KIHN0YXRpYyBQeU9iamVjdCogREJOb1NwYWNlRXJyb3I7ICAgICAgICAvKiBFTk9TUEMgKi8KLXN0YXRpYyBQeU9iamVjdCogREJOb01lbW9yeUVycm9yOyAgICAgICAvKiBEQl9CVUZGRVJfU01BTEwgKEVOT01FTSB3aGVuIDwgNC4zKSAqLworc3RhdGljIFB5T2JqZWN0KiBEQk5vTWVtb3J5RXJyb3I7ICAgICAgIC8qIERCX0JVRkZFUl9TTUFMTCAqLwogc3RhdGljIFB5T2JqZWN0KiBEQkFnYWluRXJyb3I7ICAgICAgICAgIC8qIEVBR0FJTiAqLwogc3RhdGljIFB5T2JqZWN0KiBEQkJ1c3lFcnJvcjsgICAgICAgICAgIC8qIEVCVVNZICAqLwogc3RhdGljIFB5T2JqZWN0KiBEQkZpbGVFeGlzdHNFcnJvcjsgICAgIC8qIEVFWElTVCAqLwogc3RhdGljIFB5T2JqZWN0KiBEQk5vU3VjaEZpbGVFcnJvcjsgICAgIC8qIEVOT0VOVCAqLwogc3RhdGljIFB5T2JqZWN0KiBEQlBlcm1pc3Npb25zRXJyb3I7ICAgIC8qIEVQRVJNICAqLwogCi0jaWYgKERCVkVSID49IDQyKQogc3RhdGljIFB5T2JqZWN0KiBEQlJlcEhhbmRsZURlYWRFcnJvcjsgIC8qIERCX1JFUF9IQU5ETEVfREVBRCAqLwotI2VuZGlmCiAjaWYgKERCVkVSID49IDQ0KQogc3RhdGljIFB5T2JqZWN0KiBEQlJlcExvY2tvdXRFcnJvcjsgICAgIC8qIERCX1JFUF9MT0NLT1VUICovCiAjZW5kaWYKQEAgLTIyMCwxMCArMTk4LDYgQEAKIAogc3RhdGljIFB5T2JqZWN0KiBEQlJlcFVuYXZhaWxFcnJvcjsgICAgIC8qIERCX1JFUF9VTkFWQUlMICovCiAKLSNpZiAoREJWRVIgPCA0MykKLSNkZWZpbmUgREJfQlVGRkVSX1NNQUxMICAgICAgICAgRU5PTUVNCi0jZW5kaWYKLQogI2lmIChEQlZFUiA8IDQ4KQogI2RlZmluZSBEQl9HSURfU0laRSBEQl9YSUREQVRBU0laRQogI2VuZGlmCkBAIC0yNTIsOCArMjI2LDkgQEAKIAogc3RhdGljZm9yd2FyZCBQeVR5cGVPYmplY3QgREJfVHlwZSwgREJDdXJzb3JfVHlwZSwgREJFbnZfVHlwZSwgREJUeG5fVHlwZSwKICAgICAgICAgICAgICAgREJMb2NrX1R5cGUsIERCTG9nQ3Vyc29yX1R5cGU7Ci0jaWYgKERCVkVSID49IDQzKQogc3RhdGljZm9yd2FyZCBQeVR5cGVPYmplY3QgREJTZXF1ZW5jZV9UeXBlOworI2lmIChEQlZFUiA+PSA1MikKK3N0YXRpY2ZvcndhcmQgUHlUeXBlT2JqZWN0IERCU2l0ZV9UeXBlOwogI2VuZGlmCiAKICNpZm5kZWYgUHlfVFlQRQpAQCAtMjY3LDggKzI0Miw5IEBACiAjZGVmaW5lIERCRW52T2JqZWN0X0NoZWNrKHYpICAgICAgICAoUHlfVFlQRSh2KSA9PSAmREJFbnZfVHlwZSkKICNkZWZpbmUgREJUeG5PYmplY3RfQ2hlY2sodikgICAgICAgIChQeV9UWVBFKHYpID09ICZEQlR4bl9UeXBlKQogI2RlZmluZSBEQkxvY2tPYmplY3RfQ2hlY2sodikgICAgICAgKFB5X1RZUEUodikgPT0gJkRCTG9ja19UeXBlKQotI2lmIChEQlZFUiA+PSA0MykKICNkZWZpbmUgREJTZXF1ZW5jZU9iamVjdF9DaGVjayh2KSAgIChQeV9UWVBFKHYpID09ICZEQlNlcXVlbmNlX1R5cGUpCisjaWYgKERCVkVSID49IDUyKQorI2RlZmluZSBEQlNpdGVPYmplY3RfQ2hlY2sodikgICAgICAgKFB5X1RZUEUodikgPT0gJkRCU2l0ZV9UeXBlKQogI2VuZGlmCiAKICNpZiAoREJWRVIgPCA0NikKQEAgLTM3Miw5ICszNDgsMTIgQEAKICNkZWZpbmUgQ0hFQ0tfTE9HQ1VSU09SX05PVF9DTE9TRUQobG9nY3VycykgXAogICAgICAgICBfQ0hFQ0tfT0JKRUNUX05PVF9DTE9TRUQobG9nY3Vycy0+bG9nYywgREJDdXJzb3JDbG9zZWRFcnJvciwgREJMb2dDdXJzb3IpCiAKLSNpZiAoREJWRVIgPj0gNDMpCiAjZGVmaW5lIENIRUNLX1NFUVVFTkNFX05PVF9DTE9TRUQoY3VycykgXAogICAgICAgICBfQ0hFQ0tfT0JKRUNUX05PVF9DTE9TRUQoY3Vycy0+c2VxdWVuY2UsIERCRXJyb3IsIERCU2VxdWVuY2UpCisKKyNpZiAoREJWRVIgPj0gNTIpCisjZGVmaW5lIENIRUNLX1NJVEVfTk9UX0NMT1NFRChkYl9zaXRlKSBcCisgICAgICAgICBfQ0hFQ0tfT0JKRUNUX05PVF9DTE9TRUQoZGJfc2l0ZS0+c2l0ZSwgREJFcnJvciwgREJTaXRlKQogI2VuZGlmCiAKICNkZWZpbmUgQ0hFQ0tfREJGTEFHKG15ZGIsIGZsYWcpICAgICgoKG15ZGIpLT5mbGFncyAmIChmbGFnKSkgfHwgXApAQCAtNTY3LDEyICs1NDYsOCBAQAogLyogQ2FsbGJhY2sgdXNlZCB0byBzYXZlIGF3YXkgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBlcnJvcnMgZnJvbSB0aGUgREIKICAqIGxpYnJhcnkuICovCiBzdGF0aWMgY2hhciBfZGJfZXJybXNnWzEwMjRdOwotI2lmIChEQlZFUiA8PSA0MikKLXN0YXRpYyB2b2lkIF9kYl9lcnJvckNhbGxiYWNrKGNvbnN0IGNoYXIqIHByZWZpeCwgY2hhciogbXNnKQotI2Vsc2UKIHN0YXRpYyB2b2lkIF9kYl9lcnJvckNhbGxiYWNrKGNvbnN0IERCX0VOViAqZGJfZW52LAogICAgICAgICBjb25zdCBjaGFyKiBwcmVmaXgsIGNvbnN0IGNoYXIqIG1zZykKLSNlbmRpZgogewogICAgIG91cl9zdHJsY3B5KF9kYl9lcnJtc2csIG1zZywgc2l6ZW9mKF9kYl9lcnJtc2cpKTsKIH0KQEAgLTYyNiwxMSArNjAxLDcgQEAKICAgICAgIHJldHVybiBOVUxMOwogICB9CiAKLSNpZiAoUFlfVkVSU0lPTl9IRVggPj0gMHgwMjA0MDAwMCkKICAgciA9IFB5VHVwbGVfUGFjaygyLCBhLCBiKSA7Ci0jZWxzZQotICByID0gUHlfQnVpbGRWYWx1ZSgiT08iLCBhLCBiKTsKLSNlbmRpZgogICBQeV9ERUNSRUYoYSk7CiAgIFB5X0RFQ1JFRihiKTsKICAgcmV0dXJuIHI7CkBAIC02OTYsMTYgKzY2NywxNSBAQAogICAgICAgICBjYXNlIERCX1JVTlJFQ09WRVJZOiAgICAgICAgZXJyT2JqID0gREJSdW5SZWNvdmVyeUVycm9yOyAgICBicmVhazsKICAgICAgICAgY2FzZSBEQl9WRVJJRllfQkFEOiAgICAgICAgIGVyck9iaiA9IERCVmVyaWZ5QmFkRXJyb3I7ICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgREJfTk9TRVJWRVI6ICAgICAgICAgICBlcnJPYmogPSBEQk5vU2VydmVyRXJyb3I7ICAgICAgIGJyZWFrOworI2lmIChEQlZFUiA8IDUyKQogICAgICAgICBjYXNlIERCX05PU0VSVkVSX0hPTUU6ICAgICAgZXJyT2JqID0gREJOb1NlcnZlckhvbWVFcnJvcjsgICBicmVhazsKICAgICAgICAgY2FzZSBEQl9OT1NFUlZFUl9JRDogICAgICAgIGVyck9iaiA9IERCTm9TZXJ2ZXJJREVycm9yOyAgICAgYnJlYWs7CisjZW5kaWYKICAgICAgICAgY2FzZSBEQl9QQUdFX05PVEZPVU5EOiAgICAgIGVyck9iaiA9IERCUGFnZU5vdEZvdW5kRXJyb3I7ICAgYnJlYWs7CiAgICAgICAgIGNhc2UgREJfU0VDT05EQVJZX0JBRDogICAgICBlcnJPYmogPSBEQlNlY29uZGFyeUJhZEVycm9yOyAgIGJyZWFrOwogICAgICAgICBjYXNlIERCX0JVRkZFUl9TTUFMTDogICAgICAgZXJyT2JqID0gREJOb01lbW9yeUVycm9yOyAgICAgICBicmVhazsKIAotI2lmIChEQlZFUiA+PSA0MykKLSAgICAgICAgLyogRU5PTUVNIGFuZCBEQl9CVUZGRVJfU01BTEwgd2VyZSBvbmUgYW5kIHRoZSBzYW1lIHVudGlsIDQuMyAqLwogICAgICAgICBjYXNlIEVOT01FTTogIGVyck9iaiA9IFB5RXhjX01lbW9yeUVycm9yOyAgIGJyZWFrOwotI2VuZGlmCiAgICAgICAgIGNhc2UgRUlOVkFMOiAgZXJyT2JqID0gREJJbnZhbGlkQXJnRXJyb3I7ICAgYnJlYWs7CiAgICAgICAgIGNhc2UgRUFDQ0VTOiAgZXJyT2JqID0gREJBY2Nlc3NFcnJvcjsgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgRU5PU1BDOiAgZXJyT2JqID0gREJOb1NwYWNlRXJyb3I7ICAgICAgYnJlYWs7CkBAIC03MTUsOSArNjg1LDcgQEAKICAgICAgICAgY2FzZSBFTk9FTlQ6ICBlcnJPYmogPSBEQk5vU3VjaEZpbGVFcnJvcjsgICBicmVhazsKICAgICAgICAgY2FzZSBFUEVSTSA6ICBlcnJPYmogPSBEQlBlcm1pc3Npb25zRXJyb3I7ICBicmVhazsKIAotI2lmIChEQlZFUiA+PSA0MikKICAgICAgICAgY2FzZSBEQl9SRVBfSEFORExFX0RFQUQgOiBlcnJPYmogPSBEQlJlcEhhbmRsZURlYWRFcnJvcjsgYnJlYWs7Ci0jZW5kaWYKICNpZiAoREJWRVIgPj0gNDQpCiAgICAgICAgIGNhc2UgREJfUkVQX0xPQ0tPVVQgOiBlcnJPYmogPSBEQlJlcExvY2tvdXRFcnJvcjsgYnJlYWs7CiAjZW5kaWYKQEAgLTkwMiw3ICs4NzAsNiBAQAogICAgIFB5X1hERUNSRUYodik7CiB9CiAKLSNpZiAoREJWRVIgPj0gNDMpCiAvKiBhZGQgYW4gZGJfc2VxX3QgdG8gYSBkaWN0aW9uYXJ5IHVzaW5nIHRoZSBnaXZlbiBuYW1lIGFzIGEga2V5ICovCiBzdGF0aWMgdm9pZCBfYWRkRGJfc2VxX3RUb0RpY3QoUHlPYmplY3QqIGRpY3QsIGNoYXIgKm5hbWUsIGRiX3NlcV90IHZhbHVlKQogewpAQCAtOTEyLDcgKzg3OSw2IEBACiAKICAgICBQeV9YREVDUkVGKHYpOwogfQotI2VuZGlmCiAKIHN0YXRpYyB2b2lkIF9hZGREQl9sc25Ub0RpY3QoUHlPYmplY3QqIGRpY3QsIGNoYXIgKm5hbWUsIERCX0xTTiB2YWx1ZSkKIHsKQEAgLTk0MiwxMSArOTA4LDEwIEBACiAgICAgc2VsZi0+bXllbnZvYmogPSBOVUxMOwogICAgIHNlbGYtPmRiID0gTlVMTDsKICAgICBzZWxmLT5jaGlsZHJlbl9jdXJzb3JzID0gTlVMTDsKLSNpZiAoREJWRVIgPj00MykKICAgICBzZWxmLT5jaGlsZHJlbl9zZXF1ZW5jZXMgPSBOVUxMOwotI2VuZGlmCiAgICAgc2VsZi0+YXNzb2NpYXRlQ2FsbGJhY2sgPSBOVUxMOwogICAgIHNlbGYtPmJ0Q29tcGFyZUNhbGxiYWNrID0gTlVMTDsKKyAgICBzZWxmLT5kdXBDb21wYXJlQ2FsbGJhY2sgPSBOVUxMOwogICAgIHNlbGYtPnByaW1hcnlEQlR5cGUgPSAwOwogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICBzZWxmLT5wcml2YXRlX29iaiA9IFB5X05vbmU7CkBAIC05ODQsOCArOTQ5LDcgQEAKICAgICAgKiBEQlR4bnMgYW5kIGNsb3NpbmcgYW55IG9wZW4gREJzIGZpcnN0LiAqLwogICAgIGlmIChtYWtlREJFcnJvcihlcnIpKSB7CiAgICAgICAgIGlmIChzZWxmLT5teWVudm9iaikgewotICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYtPm15ZW52b2JqKTsKLSAgICAgICAgICAgIHNlbGYtPm15ZW52b2JqID0gTlVMTDsKKyAgICAgICAgICAgIFB5X0NMRUFSKHNlbGYtPm15ZW52b2JqKTsKICAgICAgICAgfQogICAgICAgICBQeV9ERUNSRUYoc2VsZik7CiAgICAgICAgIHNlbGYgPSBOVUxMOwpAQCAtMTAxNywxNiArOTgxLDE2IEBACiAgICAgICAgIFB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoKFB5T2JqZWN0ICopIHNlbGYpOwogICAgIH0KICAgICBpZiAoc2VsZi0+bXllbnZvYmopIHsKLSAgICAgICAgUHlfREVDUkVGKHNlbGYtPm15ZW52b2JqKTsKLSAgICAgICAgc2VsZi0+bXllbnZvYmogPSBOVUxMOworICAgICAgICBQeV9DTEVBUihzZWxmLT5teWVudm9iaik7CiAgICAgfQogICAgIGlmIChzZWxmLT5hc3NvY2lhdGVDYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzZWxmLT5hc3NvY2lhdGVDYWxsYmFjayk7Ci0gICAgICAgIHNlbGYtPmFzc29jaWF0ZUNhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgUHlfQ0xFQVIoc2VsZi0+YXNzb2NpYXRlQ2FsbGJhY2spOwogICAgIH0KICAgICBpZiAoc2VsZi0+YnRDb21wYXJlQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICBQeV9ERUNSRUYoc2VsZi0+YnRDb21wYXJlQ2FsbGJhY2spOwotICAgICAgICBzZWxmLT5idENvbXBhcmVDYWxsYmFjayA9IE5VTEw7CisgICAgICAgIFB5X0NMRUFSKHNlbGYtPmJ0Q29tcGFyZUNhbGxiYWNrKTsKKyAgICB9CisgICAgaWYgKHNlbGYtPmR1cENvbXBhcmVDYWxsYmFjayAhPSBOVUxMKSB7CisgICAgICAgIFB5X0NMRUFSKHNlbGYtPmR1cENvbXBhcmVDYWxsYmFjayk7CiAgICAgfQogICAgIFB5X0RFQ1JFRihzZWxmLT5wcml2YXRlX29iaik7CiAgICAgUHlPYmplY3RfRGVsKHNlbGYpOwpAQCAtMTE0Nyw2ICsxMTExLDkgQEAKICAgICBzZWxmLT5jaGlsZHJlbl9kYnMgPSBOVUxMOwogICAgIHNlbGYtPmNoaWxkcmVuX3R4bnMgPSBOVUxMOwogICAgIHNlbGYtPmNoaWxkcmVuX2xvZ2N1cnNvcnMgPSBOVUxMIDsKKyNpZiAoREJWRVIgPj0gNTIpCisgICAgc2VsZi0+Y2hpbGRyZW5fc2l0ZXMgPSBOVUxMOworI2VuZGlmCiAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgIHNlbGYtPnByaXZhdGVfb2JqID0gUHlfTm9uZTsKICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CkBAIC0xMTg4LDggKzExNTUsNyBAQAogICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICB9CiAKLSAgICBQeV9YREVDUkVGKHNlbGYtPmV2ZW50X25vdGlmeUNhbGxiYWNrKTsKLSAgICBzZWxmLT5ldmVudF9ub3RpZnlDYWxsYmFjayA9IE5VTEw7CisgICAgUHlfQ0xFQVIoc2VsZi0+ZXZlbnRfbm90aWZ5Q2FsbGJhY2spOwogCiAgICAgaWYgKHNlbGYtPmluX3dlYWtyZWZsaXN0ICE9IE5VTEwpIHsKICAgICAgICAgUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QgKikgc2VsZik7CkBAIC0xMzQwLDcgKzEzMDYsNiBAQAogfQogCiAKLSNpZiAoREJWRVIgPj0gNDMpCiBzdGF0aWMgREJTZXF1ZW5jZU9iamVjdCoKIG5ld0RCU2VxdWVuY2VPYmplY3QoREJPYmplY3QqIG15ZGIsICBpbnQgZmxhZ3MpCiB7CkBAIC0xMzk2LDYgKzEzNjEsNTMgQEAKICAgICBQeV9ERUNSRUYoc2VsZi0+bXlkYik7CiAgICAgUHlPYmplY3RfRGVsKHNlbGYpOwogfQorCisjaWYgKERCVkVSID49IDUyKQorc3RhdGljIERCU2l0ZU9iamVjdCoKK25ld0RCU2l0ZU9iamVjdChEQl9TSVRFKiBzaXRlcCwgREJFbnZPYmplY3QqIGVudikKK3sKKyAgICBEQlNpdGVPYmplY3QqIHNlbGY7CisKKyAgICBzZWxmID0gUHlPYmplY3RfTmV3KERCU2l0ZU9iamVjdCwgJkRCU2l0ZV9UeXBlKTsKKworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgc2VsZi0+c2l0ZSA9IHNpdGVwOworICAgIHNlbGYtPmVudiA9IGVudjsKKworICAgIElOU0VSVF9JTl9ET1VCTEVfTElOS0VEX0xJU1Qoc2VsZi0+ZW52LT5jaGlsZHJlbl9zaXRlcywgc2VsZik7CisKKyAgICBzZWxmLT5pbl93ZWFrcmVmbGlzdCA9IE5VTEw7CisgICAgUHlfSU5DUkVGKHNlbGYtPmVudik7CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3N0YXRpYyBQeU9iamVjdCAqREJTaXRlX2Nsb3NlX2ludGVybmFsKERCU2l0ZU9iamVjdCogc2VsZik7CisKK3N0YXRpYyB2b2lkCitEQlNpdGVfZGVhbGxvYyhEQlNpdGVPYmplY3QqIHNlbGYpCit7CisgICAgUHlPYmplY3QgKmR1bW15OworCisgICAgaWYgKHNlbGYtPnNpdGUgIT0gTlVMTCkgeworICAgICAgICBkdW1teSA9IERCU2l0ZV9jbG9zZV9pbnRlcm5hbChzZWxmKTsKKyAgICAgICAgLyoKKyAgICAgICAgKiogUmFpc2luZyBleGNlcHRpb25zIHdoaWxlIGRvaW5nCisgICAgICAgICoqIGdhcmJhZ2UgY29sbGVjdGlvbiBpcyBhIGZhdGFsIGVycm9yLgorICAgICAgICAqLworICAgICAgICBpZiAoZHVtbXkpCisgICAgICAgICAgICBQeV9ERUNSRUYoZHVtbXkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgICBpZiAoc2VsZi0+aW5fd2Vha3JlZmxpc3QgIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSBzZWxmKTsKKyAgICB9CisgICAgUHlfREVDUkVGKHNlbGYtPmVudik7CisgICAgUHlPYmplY3RfRGVsKHNlbGYpOworfQogI2VuZGlmCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTYyMiw4ICsxNjM0LDcgQEAKICAgICBNWURCX0VORF9BTExPV19USFJFQURTOwogCiAgICAgaWYgKGVycikgewotICAgICAgICBQeV9YREVDUkVGKHNlY29uZGFyeURCLT5hc3NvY2lhdGVDYWxsYmFjayk7Ci0gICAgICAgIHNlY29uZGFyeURCLT5hc3NvY2lhdGVDYWxsYmFjayA9IE5VTEw7CisgICAgICAgIFB5X0NMRUFSKHNlY29uZGFyeURCLT5hc3NvY2lhdGVDYWxsYmFjayk7CiAgICAgICAgIHNlY29uZGFyeURCLT5wcmltYXJ5REJUeXBlID0gMDsKICAgICB9CiAKQEAgLTE2NTIsMTIgKzE2NjMsMTAgQEAKICAgICAgICAgICBQeV9YREVDUkVGKGR1bW15KTsKICAgICAgICAgfQogCi0jaWYgKERCVkVSID49IDQzKQogICAgICAgICB3aGlsZShzZWxmLT5jaGlsZHJlbl9zZXF1ZW5jZXMpIHsKICAgICAgICAgICAgIGR1bW15PURCU2VxdWVuY2VfY2xvc2VfaW50ZXJuYWwoc2VsZi0+Y2hpbGRyZW5fc2VxdWVuY2VzLDAsMCk7CiAgICAgICAgICAgICBQeV9YREVDUkVGKGR1bW15KTsKICAgICAgICAgfQotI2VuZGlmCiAKICAgICAgICAgLyoKICAgICAgICAgKiogImRvX25vdF9jbG9zZSIgaXMgdXNlZCB0byBkaXNwb3NlIGFsbCByZWxhdGVkIG9iamVjdHMgaW4gdGhlCkBAIC0yMDc0LDIwICsyMDgzLDEyIEBACiAgICAgICAgICAgICAgICAga2V5T2JqID0gTlVNQkVSX0Zyb21Mb25nKCooaW50ICopa2V5LmRhdGEpOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIGtleU9iaiA9IEJ1aWxkX1B5U3RyaW5nKGtleS5kYXRhLCBrZXkuc2l6ZSk7Ci0jaWYgKFBZX1ZFUlNJT05fSEVYID49IDB4MDIwNDAwMDApCiAgICAgICAgICAgICByZXR2YWwgPSBQeVR1cGxlX1BhY2soMywga2V5T2JqLCBwa2V5T2JqLCBkYXRhT2JqKTsKLSNlbHNlCi0gICAgICAgICAgICByZXR2YWwgPSBQeV9CdWlsZFZhbHVlKCJPT08iLCBrZXlPYmosIHBrZXlPYmosIGRhdGFPYmopOwotI2VuZGlmCiAgICAgICAgICAgICBQeV9ERUNSRUYoa2V5T2JqKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIC8qIHJldHVybiBqdXN0IHRoZSBwa2V5IGFuZCBkYXRhICovCiAgICAgICAgIHsKLSNpZiAoUFlfVkVSU0lPTl9IRVggPj0gMHgwMjA0MDAwMCkKICAgICAgICAgICAgIHJldHZhbCA9IFB5VHVwbGVfUGFjaygyLCBwa2V5T2JqLCBkYXRhT2JqKTsKLSNlbHNlCi0gICAgICAgICAgICByZXR2YWwgPSBQeV9CdWlsZFZhbHVlKCJPTyIsIHBrZXlPYmosIGRhdGFPYmopOwotI2VuZGlmCiAgICAgICAgIH0KICAgICAgICAgUHlfREVDUkVGKGRhdGFPYmopOwogICAgICAgICBQeV9ERUNSRUYocGtleU9iaik7CkBAIC0yMTMyLDcgKzIxMzMsNyBAQAogICAgIE1ZREJfQkVHSU5fQUxMT1dfVEhSRUFEUzsKICAgICBlcnIgPSBzZWxmLT5kYi0+Z2V0KHNlbGYtPmRiLCB0eG4sICZrZXksICZkYXRhLCBmbGFncyk7CiAgICAgTVlEQl9FTkRfQUxMT1dfVEhSRUFEUzsKLSAgICBpZiAoZXJyID09IERCX0JVRkZFUl9TTUFMTCkgeworICAgIGlmICgoZXJyID09IERCX0JVRkZFUl9TTUFMTCkgfHwgKGVyciA9PSAwKSkgewogICAgICAgICByZXR2YWwgPSBOVU1CRVJfRnJvbUxvbmcoKGxvbmcpZGF0YS5zaXplKTsKICAgICAgICAgZXJyID0gMDsKICAgICB9CkBAIC0yMzg1LDkgKzIzODYsNyBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSNpZiAoREJWRVIgPj0gNDIpCiAgICAgc2VsZi0+ZGItPmdldF9mbGFncyhzZWxmLT5kYiwgJnNlbGYtPnNldGZsYWdzKTsKLSNlbmRpZgogCiAgICAgc2VsZi0+ZmxhZ3MgPSBmbGFnczsKIApAQCAtMjUzOSw2ICsyNTM4LDM3IEBACiAjZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0KgorREJfZ2V0X2RibmFtZShEQk9iamVjdCogc2VsZikKK3sKKyAgICBpbnQgZXJyOworICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCAqZGJuYW1lOworCisgICAgQ0hFQ0tfREJfTk9UX0NMT1NFRChzZWxmKTsKKworICAgIE1ZREJfQkVHSU5fQUxMT1dfVEhSRUFEUzsKKyAgICBlcnIgPSBzZWxmLT5kYi0+Z2V0X2RibmFtZShzZWxmLT5kYiwgJmZpbGVuYW1lLCAmZGJuYW1lKTsKKyAgICBNWURCX0VORF9BTExPV19USFJFQURTOworICAgIFJFVFVSTl9JRl9FUlIoKTsKKyAgICAvKiBJZiAiZGJuYW1lPT1OVUxMIiwgaXQgaXMgY29ycmVjdGx5IGNvbnZlcnRlZCB0byAiTm9uZSIgKi8KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKHNzKSIsIGZpbGVuYW1lLCBkYm5hbWUpOworfQorCitzdGF0aWMgUHlPYmplY3QqCitEQl9nZXRfb3Blbl9mbGFncyhEQk9iamVjdCogc2VsZikKK3sKKyAgICBpbnQgZXJyOworICAgIHVuc2lnbmVkIGludCBmbGFnczsKKworICAgIENIRUNLX0RCX05PVF9DTE9TRUQoc2VsZik7CisKKyAgICBNWURCX0JFR0lOX0FMTE9XX1RIUkVBRFM7CisgICAgZXJyID0gc2VsZi0+ZGItPmdldF9vcGVuX2ZsYWdzKHNlbGYtPmRiLCAmZmxhZ3MpOworICAgIE1ZREJfRU5EX0FMTE9XX1RIUkVBRFM7CisgICAgUkVUVVJOX0lGX0VSUigpOworICAgIHJldHVybiBOVU1CRVJfRnJvbUxvbmcoZmxhZ3MpOworfQorCitzdGF0aWMgUHlPYmplY3QqCiBEQl9zZXRfcV9leHRlbnRzaXplKERCT2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKIHsKICAgICBpbnQgZXJyOwpAQCAtMjU1NSw3ICsyNTg1LDYgQEAKICAgICBSRVRVUk5fTk9ORSgpOwogfQogCi0jaWYgKERCVkVSID49IDQyKQogc3RhdGljIFB5T2JqZWN0KgogREJfZ2V0X3FfZXh0ZW50c2l6ZShEQk9iamVjdCogc2VsZikKIHsKQEAgLTI1NzAsNyArMjU5OSw2IEBACiAgICAgUkVUVVJOX0lGX0VSUigpOwogICAgIHJldHVybiBOVU1CRVJfRnJvbUxvbmcoZXh0ZW50c2l6ZSk7CiB9Ci0jZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0KgogREJfc2V0X2J0X21pbmtleShEQk9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCkBAIC0yNTg4LDcgKzI2MTYsNiBAQAogICAgIFJFVFVSTl9OT05FKCk7CiB9CiAKLSNpZiAoREJWRVIgPj0gNDIpCiBzdGF0aWMgUHlPYmplY3QqCiBEQl9nZXRfYnRfbWlua2V5KERCT2JqZWN0KiBzZWxmKQogewpAQCAtMjYwMyw3ICsyNjMwLDYgQEAKICAgICBSRVRVUk5fSUZfRVJSKCk7CiAgICAgcmV0dXJuIE5VTUJFUl9Gcm9tTG9uZyhidF9taW5rZXkpOwogfQotI2VuZGlmCiAKIHN0YXRpYyBpbnQKIF9kZWZhdWx0X2NtcChjb25zdCBEQlQgKmxlZnRLZXksCkBAIC0yNzQwLDYgKzI3NjYsMTIwIEBACiAgICAgUkVUVVJOX05PTkUoKTsKIH0KIAorc3RhdGljIGludAorX2RiX2R1cENvbXBhcmVDYWxsYmFjayhEQiogZGIsCisJCSAgICBjb25zdCBEQlQgKmxlZnRLZXksCisJCSAgICBjb25zdCBEQlQgKnJpZ2h0S2V5KQoreworICAgIGludCByZXMgPSAwOworICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIERCT2JqZWN0ICpzZWxmID0gKERCT2JqZWN0ICopZGItPmFwcF9wcml2YXRlOworCisgICAgaWYgKHNlbGYgPT0gTlVMTCB8fCBzZWxmLT5kdXBDb21wYXJlQ2FsbGJhY2sgPT0gTlVMTCkgeworCU1ZREJfQkVHSU5fQkxPQ0tfVEhSRUFEUzsKKwlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorCQkJKHNlbGYgPT0gMAorCQkJID8gIkRCX2R1cF9jb21wYXJlIGRiIGlzIE5VTEwuIgorCQkJIDogIkRCX2R1cF9jb21wYXJlIGNhbGxiYWNrIGlzIE5VTEwuIikpOworCS8qIHdlJ3JlIGluIGEgY2FsbGJhY2sgd2l0aGluIHRoZSBEQiBjb2RlLCB3ZSBjYW4ndCByYWlzZSAqLworCVB5RXJyX1ByaW50KCk7CisJcmVzID0gX2RlZmF1bHRfY21wKGxlZnRLZXksIHJpZ2h0S2V5KTsKKwlNWURCX0VORF9CTE9DS19USFJFQURTOworICAgIH0gZWxzZSB7CisJTVlEQl9CRUdJTl9CTE9DS19USFJFQURTOworCisJYXJncyA9IEJ1aWxkVmFsdWVfU1MobGVmdEtleS0+ZGF0YSwgbGVmdEtleS0+c2l6ZSwgcmlnaHRLZXktPmRhdGEsIHJpZ2h0S2V5LT5zaXplKTsKKwlpZiAoYXJncyAhPSBOVUxMKSB7CisJCXJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KHNlbGYtPmR1cENvbXBhcmVDYWxsYmFjaywgYXJncyk7CisJfQorCWlmIChhcmdzID09IE5VTEwgfHwgcmVzdWx0ID09IE5VTEwpIHsKKwkgICAgLyogd2UncmUgaW4gYSBjYWxsYmFjayB3aXRoaW4gdGhlIERCIGNvZGUsIHdlIGNhbid0IHJhaXNlICovCisJICAgIFB5RXJyX1ByaW50KCk7CisJICAgIHJlcyA9IF9kZWZhdWx0X2NtcChsZWZ0S2V5LCByaWdodEtleSk7CisJfSBlbHNlIGlmIChOVU1CRVJfQ2hlY2socmVzdWx0KSkgeworCSAgICByZXMgPSBOVU1CRVJfQXNMb25nKHJlc3VsdCk7CisJfSBlbHNlIHsKKwkgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKwkJCSAgICAiREJfZHVwX2NvbXBhcmUgY2FsbGJhY2sgTVVTVCByZXR1cm4gYW4gaW50LiIpOworCSAgICAvKiB3ZSdyZSBpbiBhIGNhbGxiYWNrIHdpdGhpbiB0aGUgREIgY29kZSwgd2UgY2FuJ3QgcmFpc2UgKi8KKwkgICAgUHlFcnJfUHJpbnQoKTsKKwkgICAgcmVzID0gX2RlZmF1bHRfY21wKGxlZnRLZXksIHJpZ2h0S2V5KTsKKwl9CisKKwlQeV9YREVDUkVGKGFyZ3MpOworCVB5X1hERUNSRUYocmVzdWx0KTsKKworCU1ZREJfRU5EX0JMT0NLX1RIUkVBRFM7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBQeU9iamVjdCoKK0RCX3NldF9kdXBfY29tcGFyZShEQk9iamVjdCogc2VsZiwgUHlPYmplY3QqIGNvbXBhcmF0b3IpCit7CisgICAgaW50IGVycjsKKyAgICBQeU9iamVjdCAqdHVwbGUsICpyZXN1bHQ7CisKKyAgICBDSEVDS19EQl9OT1RfQ0xPU0VEKHNlbGYpOworCisgICAgaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGNvbXBhcmF0b3IpKSB7CisJbWFrZVR5cGVFcnJvcigiQ2FsbGFibGUiLCBjb21wYXJhdG9yKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFBlcmZvcm0gYSB0ZXN0IGNhbGwgb2YgdGhlIGNvbXBhcmF0b3IgZnVuY3Rpb24gd2l0aCB0d28gZW1wdHkKKyAgICAgKiBzdHJpbmcgb2JqZWN0cyBoZXJlLiAgdmVyaWZ5IHRoYXQgaXQgcmV0dXJucyBhbiBpbnQgKDApLgorICAgICAqIGVyciBpZiBub3QuCisgICAgICovCisgICAgdHVwbGUgPSBQeV9CdWlsZFZhbHVlKCIoc3MpIiwgIiIsICIiKTsKKyAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChjb21wYXJhdG9yLCB0dXBsZSk7CisgICAgUHlfREVDUkVGKHR1cGxlKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghTlVNQkVSX0NoZWNrKHJlc3VsdCkpIHsKKwlQeV9ERUNSRUYocmVzdWx0KTsKKwlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorCQkgICAgICAgICJjYWxsYmFjayBNVVNUIHJldHVybiBhbiBpbnQiKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgaWYgKE5VTUJFUl9Bc0xvbmcocmVzdWx0KSAhPSAwKSB7CisJUHlfREVDUkVGKHJlc3VsdCk7CisJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKwkJICAgICAgICAiY2FsbGJhY2sgZmFpbGVkIHRvIHJldHVybiAwIG9uIHR3byBlbXB0eSBzdHJpbmdzIik7CisJcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0RFQ1JFRihyZXN1bHQpOworCisgICAgLyogV2UgZG9uJ3QgYWNjZXB0IG11bHRpcGxlIHNldF9kdXBfY29tcGFyZSBvcGVyYXRpb25zLCBpbiBvcmRlciB0bworICAgICAqIHNpbXBsaWZ5IHRoZSBjb2RlLiBUaGlzIHdvdWxkIGhhdmUgbm8gcmVhbCB1c2UsIGFzIG9uZSBjYW5ub3QKKyAgICAgKiBjaGFuZ2UgdGhlIGZ1bmN0aW9uIG9uY2UgdGhlIGRiIGlzIG9wZW5lZCBhbnl3YXkgKi8KKyAgICBpZiAoc2VsZi0+ZHVwQ29tcGFyZUNhbGxiYWNrICE9IE5VTEwpIHsKKwlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAic2V0X2R1cF9jb21wYXJlKCkgY2Fubm90IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSIpOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIFB5X0lOQ1JFRihjb21wYXJhdG9yKTsKKyAgICBzZWxmLT5kdXBDb21wYXJlQ2FsbGJhY2sgPSBjb21wYXJhdG9yOworCisgICAgLyogVGhpcyBpcyB0byB3b3JrYXJvdW5kIGEgcHJvYmxlbSB3aXRoIHVuLWluaXRpYWxpemVkIHRocmVhZHMgKHNlZQorICAgICAgIGNvbW1lbnQgaW4gREJfYXNzb2NpYXRlKSAqLworI2lmZGVmIFdJVEhfVEhSRUFECisgICAgUHlFdmFsX0luaXRUaHJlYWRzKCk7CisjZW5kaWYKKworICAgIGVyciA9IHNlbGYtPmRiLT5zZXRfZHVwX2NvbXBhcmUoc2VsZi0+ZGIsIF9kYl9kdXBDb21wYXJlQ2FsbGJhY2spOworCisgICAgaWYgKGVycikgeworCS8qIHJlc3RvcmUgdGhlIG9sZCBzdGF0ZSBpbiBjYXNlIG9mIGVycm9yICovCisJUHlfREVDUkVGKGNvbXBhcmF0b3IpOworCXNlbGYtPmR1cENvbXBhcmVDYWxsYmFjayA9IE5VTEw7CisgICAgfQorCisgICAgUkVUVVJOX0lGX0VSUigpOworICAgIFJFVFVSTl9OT05FKCk7Cit9CisKIAogc3RhdGljIFB5T2JqZWN0KgogREJfc2V0X2NhY2hlc2l6ZShEQk9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCkBAIC0yNzU5LDcgKzI4OTksNiBAQAogICAgIFJFVFVSTl9OT05FKCk7CiB9CiAKLSNpZiAoREJWRVIgPj0gNDIpCiBzdGF0aWMgUHlPYmplY3QqCiBEQl9nZXRfY2FjaGVzaXplKERCT2JqZWN0KiBzZWxmKQogewpAQCAtMjc3Nyw3ICsyOTE2LDYgQEAKIAogICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoaWlpKSIsIGdieXRlcywgYnl0ZXMsIG5jYWNoZSk7CiB9Ci0jZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0KgogREJfc2V0X2ZsYWdzKERCT2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKQEAgLTI3OTcsNyArMjkzNSw2IEBACiAgICAgUkVUVVJOX05PTkUoKTsKIH0KIAotI2lmIChEQlZFUiA+PSA0MikKIHN0YXRpYyBQeU9iamVjdCoKIERCX2dldF9mbGFncyhEQk9iamVjdCogc2VsZikKIHsKQEAgLTI4MTIsNyArMjk0OSwzNCBAQAogICAgIFJFVFVSTl9JRl9FUlIoKTsKICAgICByZXR1cm4gTlVNQkVSX0Zyb21Mb25nKGZsYWdzKTsKIH0KLSNlbmRpZgorCitzdGF0aWMgUHlPYmplY3QqCitEQl9nZXRfdHJhbnNhY3Rpb25hbChEQk9iamVjdCogc2VsZikKK3sKKyAgICBpbnQgZXJyOworCisgICAgQ0hFQ0tfREJfTk9UX0NMT1NFRChzZWxmKTsKKworICAgIE1ZREJfQkVHSU5fQUxMT1dfVEhSRUFEUzsKKyAgICBlcnIgPSBzZWxmLT5kYi0+Z2V0X3RyYW5zYWN0aW9uYWwoc2VsZi0+ZGIpOworICAgIE1ZREJfRU5EX0FMTE9XX1RIUkVBRFM7CisKKyAgICBpZihlcnIgPT0gMCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfRmFsc2UpOworICAgICAgICByZXR1cm4gUHlfRmFsc2U7CisgICAgfSBlbHNlIGlmKGVyciA9PSAxKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9UcnVlKTsKKyAgICAgICAgcmV0dXJuIFB5X1RydWU7CisgICAgfQorCisgICAgLyoKKyAgICAqKiBJZiB3ZSByZWFjaCB0aGVyZSwgdGhlcmUgd2FzIGFuIGVycm9yLiBUaGUKKyAgICAqKiAicmV0dXJuIiBzaG91bGQgYmUgdW5yZWFjaGFibGUuCisgICAgKi8KKyAgICBSRVRVUk5fSUZfRVJSKCk7CisgICAgYXNzZXJ0KDApOyAgLyogVGhpcyBjb2RlIFNIT1VMRCBiZSB1bnJlYWNoYWJsZSAqLworICAgIHJldHVybiBOVUxMOworfQogCiBzdGF0aWMgUHlPYmplY3QqCiBEQl9zZXRfaF9mZmFjdG9yKERCT2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKQEAgLTI4MzAsNyArMjk5NCw2IEBACiAgICAgUkVUVVJOX05PTkUoKTsKIH0KIAotI2lmIChEQlZFUiA+PSA0MikKIHN0YXRpYyBQeU9iamVjdCoKIERCX2dldF9oX2ZmYWN0b3IoREJPYmplY3QqIHNlbGYpCiB7CkBAIC0yODQ1LDcgKzMwMDgsNiBAQAogICAgIFJFVFVSTl9JRl9FUlIoKTsKICAgICByZXR1cm4gTlVNQkVSX0Zyb21Mb25nKGZmYWN0b3IpOwogfQotI2VuZGlmCiAKIHN0YXRpYyBQeU9iamVjdCoKIERCX3NldF9oX25lbGVtKERCT2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKQEAgLTI4NjMsNyArMzAyNSw2IEBACiAgICAgUkVUVVJOX05PTkUoKTsKIH0KIAotI2lmIChEQlZFUiA+PSA0MikKIHN0YXRpYyBQeU9iamVjdCoKIERCX2dldF9oX25lbGVtKERCT2JqZWN0KiBzZWxmKQogewpAQCAtMjg3OCw3ICszMDM5LDYgQEAKICAgICBSRVRVUk5fSUZfRVJSKCk7CiAgICAgcmV0dXJuIE5VTUJFUl9Gcm9tTG9uZyhuZWxlbSk7CiB9Ci0jZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0KgogREJfc2V0X2xvcmRlcihEQk9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCkBAIC0yODk2LDcgKzMwNTYsNiBAQAogICAgIFJFVFVSTl9OT05FKCk7CiB9CiAKLSNpZiAoREJWRVIgPj0gNDIpCiBzdGF0aWMgUHlPYmplY3QqCiBEQl9nZXRfbG9yZGVyKERCT2JqZWN0KiBzZWxmKQogewpAQCAtMjkxMSw3ICszMDcwLDYgQEAKICAgICBSRVRVUk5fSUZfRVJSKCk7CiAgICAgcmV0dXJuIE5VTUJFUl9Gcm9tTG9uZyhsb3JkZXIpOwogfQotI2VuZGlmCiAKIHN0YXRpYyBQeU9iamVjdCoKIERCX3NldF9wYWdlc2l6ZShEQk9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCkBAIC0yOTI5LDcgKzMwODcsNiBAQAogICAgIFJFVFVSTl9OT05FKCk7CiB9CiAKLSNpZiAoREJWRVIgPj0gNDIpCiBzdGF0aWMgUHlPYmplY3QqCiBEQl9nZXRfcGFnZXNpemUoREJPYmplY3QqIHNlbGYpCiB7CkBAIC0yOTQ0LDcgKzMxMDEsNiBAQAogICAgIFJFVFVSTl9JRl9FUlIoKTsKICAgICByZXR1cm4gTlVNQkVSX0Zyb21Mb25nKHBhZ2VzaXplKTsKIH0KLSNlbmRpZgogCiBzdGF0aWMgUHlPYmplY3QqCiBEQl9zZXRfcmVfZGVsaW0oREJPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQpAQCAtMjk2Nyw3ICszMTIzLDYgQEAKICAgICBSRVRVUk5fTk9ORSgpOwogfQogCi0jaWYgKERCVkVSID49IDQyKQogc3RhdGljIFB5T2JqZWN0KgogREJfZ2V0X3JlX2RlbGltKERCT2JqZWN0KiBzZWxmKQogewpAQCAtMjk4MSw3ICszMTM2LDYgQEAKICAgICBSRVRVUk5fSUZfRVJSKCk7CiAgICAgcmV0dXJuIE5VTUJFUl9Gcm9tTG9uZyhyZV9kZWxpbSk7CiB9Ci0jZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0KgogREJfc2V0X3JlX2xlbihEQk9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCkBAIC0yOTk5LDcgKzMxNTMsNiBAQAogICAgIFJFVFVSTl9OT05FKCk7CiB9CiAKLSNpZiAoREJWRVIgPj0gNDIpCiBzdGF0aWMgUHlPYmplY3QqCiBEQl9nZXRfcmVfbGVuKERCT2JqZWN0KiBzZWxmKQogewpAQCAtMzAxNCw3ICszMTY3LDYgQEAKICAgICBSRVRVUk5fSUZfRVJSKCk7CiAgICAgcmV0dXJuIE5VTUJFUl9Gcm9tTG9uZyhyZV9sZW4pOwogfQotI2VuZGlmCiAKIHN0YXRpYyBQeU9iamVjdCoKIERCX3NldF9yZV9wYWQoREJPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQpAQCAtMzAzNiw3ICszMTg4LDYgQEAKICAgICBSRVRVUk5fTk9ORSgpOwogfQogCi0jaWYgKERCVkVSID49IDQyKQogc3RhdGljIFB5T2JqZWN0KgogREJfZ2V0X3JlX3BhZChEQk9iamVjdCogc2VsZikKIHsKQEAgLTMwNTAsNyArMzIwMSw2IEBACiAgICAgUkVUVVJOX0lGX0VSUigpOwogICAgIHJldHVybiBOVU1CRVJfRnJvbUxvbmcocmVfcGFkKTsKIH0KLSNlbmRpZgogCiBzdGF0aWMgUHlPYmplY3QqCiBEQl9zZXRfcmVfc291cmNlKERCT2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKQEAgLTMwNjksNyArMzIxOSw2IEBACiAgICAgUkVUVVJOX05PTkUoKTsKIH0KIAotI2lmIChEQlZFUiA+PSA0MikKIHN0YXRpYyBQeU9iamVjdCoKIERCX2dldF9yZV9zb3VyY2UoREJPYmplY3QqIHNlbGYpCiB7CkBAIC0zMDg0LDcgKzMyMzMsNiBAQAogICAgIFJFVFVSTl9JRl9FUlIoKTsKICAgICByZXR1cm4gUHlCeXRlc19Gcm9tU3RyaW5nKHNvdXJjZSk7CiB9Ci0jZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0KgogREJfc3RhdChEQk9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCkBAIC0zMDkyLDMyICszMjQwLDE5IEBACiAgICAgaW50IGVyciwgZmxhZ3MgPSAwLCB0eXBlOwogICAgIHZvaWQqIHNwOwogICAgIFB5T2JqZWN0KiBkOwotI2lmIChEQlZFUiA+PSA0MykKICAgICBQeU9iamVjdCogdHhub2JqID0gTlVMTDsKICAgICBEQl9UWE4gKnR4biA9IE5VTEw7CiAgICAgc3RhdGljIGNoYXIqIGt3bmFtZXNbXSA9IHsgImZsYWdzIiwgInR4biIsIE5VTEwgfTsKLSNlbHNlCi0gICAgc3RhdGljIGNoYXIqIGt3bmFtZXNbXSA9IHsgImZsYWdzIiwgTlVMTCB9OwotI2VuZGlmCiAKLSNpZiAoREJWRVIgPj0gNDMpCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifGlPOnN0YXQiLCBrd25hbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywgJnR4bm9iaikpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGlmICghY2hlY2tUeG5PYmoodHhub2JqLCAmdHhuKSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0jZWxzZQotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxpOnN0YXQiLCBrd25hbWVzLCAmZmxhZ3MpKQotICAgICAgICByZXR1cm4gTlVMTDsKLSNlbmRpZgogICAgIENIRUNLX0RCX05PVF9DTE9TRUQoc2VsZik7CiAKICAgICBNWURCX0JFR0lOX0FMTE9XX1RIUkVBRFM7Ci0jaWYgKERCVkVSID49IDQzKQogICAgIGVyciA9IHNlbGYtPmRiLT5zdGF0KHNlbGYtPmRiLCB0eG4sICZzcCwgZmxhZ3MpOwotI2Vsc2UKLSAgICBlcnIgPSBzZWxmLT5kYi0+c3RhdChzZWxmLT5kYiwgJnNwLCBmbGFncyk7Ci0jZW5kaWYKICAgICBNWURCX0VORF9BTExPV19USFJFQURTOwogICAgIFJFVFVSTl9JRl9FUlIoKTsKIApAQCAtMzE3Miw5ICszMzA3LDcgQEAKICAgICAgICAgTUFLRV9CVF9FTlRSWShsZWFmX3BnKTsKICAgICAgICAgTUFLRV9CVF9FTlRSWShkdXBfcGcpOwogICAgICAgICBNQUtFX0JUX0VOVFJZKG92ZXJfcGcpOwotI2lmIChEQlZFUiA+PSA0MykKICAgICAgICAgTUFLRV9CVF9FTlRSWShlbXB0eV9wZyk7Ci0jZW5kaWYKICAgICAgICAgTUFLRV9CVF9FTlRSWShmcmVlKTsKICAgICAgICAgTUFLRV9CVF9FTlRSWShpbnRfcGdmcmVlKTsKICAgICAgICAgTUFLRV9CVF9FTlRSWShsZWFmX3BnZnJlZSk7CkBAIC0zMjE0LDcgKzMzNDcsNiBAQAogICAgIHJldHVybiBkOwogfQogCi0jaWYgKERCVkVSID49IDQzKQogc3RhdGljIFB5T2JqZWN0KgogREJfc3RhdF9wcmludChEQk9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CkBAIC0zMjM0LDcgKzMzNjYsNiBAQAogICAgIFJFVFVSTl9JRl9FUlIoKTsKICAgICBSRVRVUk5fTk9ORSgpOwogfQotI2VuZGlmCiAKIAogc3RhdGljIFB5T2JqZWN0KgpAQCAtMzM4MSw3ICszNTEyLDYgQEAKICAgICBSRVRVUk5fTk9ORSgpOwogfQogCi0jaWYgKERCVkVSID49IDQyKQogc3RhdGljIFB5T2JqZWN0KgogREJfZ2V0X2VuY3J5cHRfZmxhZ3MoREJPYmplY3QqIHNlbGYpCiB7CkBAIC0zMzk2LDcgKzM1MjYsNiBAQAogCiAgICAgcmV0dXJuIE5VTUJFUl9Gcm9tTG9uZyhmbGFncyk7CiB9Ci0jZW5kaWYKIAogCiAKQEAgLTM0MjAsMTEgKzM1NDksNyBAQAogICAgIH0KIAogICAgIE1ZREJfQkVHSU5fQUxMT1dfVEhSRUFEUzsKLSNpZiAoREJWRVIgPj0gNDMpCiAgICAgZXJyID0gc2VsZi0+ZGItPnN0YXQoc2VsZi0+ZGIsIC8qdHhuaWQqLyBOVUxMLCAmc3AsIDApOwotI2Vsc2UKLSAgICBlcnIgPSBzZWxmLT5kYi0+c3RhdChzZWxmLT5kYiwgJnNwLCAwKTsKLSNlbmRpZgogICAgIE1ZREJfRU5EX0FMTE9XX1RIUkVBRFM7CiAKICAgICAvKiBBbGwgdGhlIHN0YXQgc3RydWN0dXJlcyBoYXZlIG1hdGNoaW5nIGZpZWxkcyB1cHRvIHRoZSBuZGF0YSBmaWVsZCwKQEAgLTM4NjgsNiArMzk5MywxMzYgQEAKIH0KIAogCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIERCU2l0ZSBtZXRob2RzICovCisKKworI2lmIChEQlZFUiA+PSA1MikKK3N0YXRpYyBQeU9iamVjdCoKK0RCU2l0ZV9jbG9zZV9pbnRlcm5hbChEQlNpdGVPYmplY3QqIHNlbGYpCit7CisgICAgaW50IGVyciA9IDA7CisKKyAgICBpZiAoc2VsZi0+c2l0ZSAhPSBOVUxMKSB7CisgICAgICAgIEVYVFJBQ1RfRlJPTV9ET1VCTEVfTElOS0VEX0xJU1Qoc2VsZik7CisKKyAgICAgICAgTVlEQl9CRUdJTl9BTExPV19USFJFQURTOworICAgICAgICBlcnIgPSBzZWxmLT5zaXRlLT5jbG9zZShzZWxmLT5zaXRlKTsKKyAgICAgICAgTVlEQl9FTkRfQUxMT1dfVEhSRUFEUzsKKyAgICAgICAgc2VsZi0+c2l0ZSA9IE5VTEw7CisgICAgfQorICAgIFJFVFVSTl9JRl9FUlIoKTsKKyAgICBSRVRVUk5fTk9ORSgpOworfQorCitzdGF0aWMgUHlPYmplY3QqCitEQlNpdGVfY2xvc2UoREJTaXRlT2JqZWN0KiBzZWxmKQoreworICAgIHJldHVybiBEQlNpdGVfY2xvc2VfaW50ZXJuYWwoc2VsZik7Cit9CisKK3N0YXRpYyBQeU9iamVjdCoKK0RCU2l0ZV9yZW1vdmUoREJTaXRlT2JqZWN0KiBzZWxmKQoreworICAgIGludCBlcnIgPSAwOworCisgICAgQ0hFQ0tfU0lURV9OT1RfQ0xPU0VEKHNlbGYpOworCisgICAgTVlEQl9CRUdJTl9BTExPV19USFJFQURTOworICAgIGVyciA9IHNlbGYtPnNpdGUtPnJlbW92ZShzZWxmLT5zaXRlKTsKKyAgICBNWURCX0VORF9BTExPV19USFJFQURTOworCisgICAgUkVUVVJOX0lGX0VSUigpOworICAgIFJFVFVSTl9OT05FKCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCoKK0RCU2l0ZV9nZXRfZWlkKERCU2l0ZU9iamVjdCogc2VsZikKK3sKKyAgICBpbnQgZXJyID0gMDsKKyAgICBpbnQgZWlkOworCisgICAgQ0hFQ0tfU0lURV9OT1RfQ0xPU0VEKHNlbGYpOworCisgICAgTVlEQl9CRUdJTl9BTExPV19USFJFQURTOworICAgIGVyciA9IHNlbGYtPnNpdGUtPmdldF9laWQoc2VsZi0+c2l0ZSwgJmVpZCk7CisgICAgTVlEQl9FTkRfQUxMT1dfVEhSRUFEUzsKKworICAgIFJFVFVSTl9JRl9FUlIoKTsKKyAgICByZXR1cm4gTlVNQkVSX0Zyb21Mb25nKGVpZCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCoKK0RCU2l0ZV9nZXRfYWRkcmVzcyhEQlNpdGVPYmplY3QqIHNlbGYpCit7CisgICAgaW50IGVyciA9IDA7CisgICAgY29uc3QgY2hhciAqaG9zdDsKKyAgICB1X2ludCBwb3J0OworCisgICAgQ0hFQ0tfU0lURV9OT1RfQ0xPU0VEKHNlbGYpOworCisgICAgTVlEQl9CRUdJTl9BTExPV19USFJFQURTOworICAgIGVyciA9IHNlbGYtPnNpdGUtPmdldF9hZGRyZXNzKHNlbGYtPnNpdGUsICZob3N0LCAmcG9ydCk7CisgICAgTVlEQl9FTkRfQUxMT1dfVEhSRUFEUzsKKworICAgIFJFVFVSTl9JRl9FUlIoKTsKKworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoc0kpIiwgaG9zdCwgcG9ydCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCoKK0RCU2l0ZV9nZXRfY29uZmlnKERCU2l0ZU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCit7CisgICAgaW50IGVyciA9IDA7CisgICAgdV9pbnQzMl90IHdoaWNoLCB2YWx1ZTsKKyAgICBzdGF0aWMgY2hhcioga3duYW1lc1tdID0geyAid2hpY2giLCBOVUxMIH07CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpOmdldF9jb25maWciLCBrd25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGljaCkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgQ0hFQ0tfU0lURV9OT1RfQ0xPU0VEKHNlbGYpOworCisgICAgTVlEQl9CRUdJTl9BTExPV19USFJFQURTOworICAgIGVyciA9IHNlbGYtPnNpdGUtPmdldF9jb25maWcoc2VsZi0+c2l0ZSwgd2hpY2gsICZ2YWx1ZSk7CisgICAgTVlEQl9FTkRfQUxMT1dfVEhSRUFEUzsKKworICAgIFJFVFVSTl9JRl9FUlIoKTsKKworICAgIGlmICh2YWx1ZSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfVHJ1ZSk7CisgICAgICAgIHJldHVybiBQeV9UcnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9GYWxzZSk7CisgICAgICAgIHJldHVybiBQeV9GYWxzZTsKKyAgICB9Cit9CisKK3N0YXRpYyBQeU9iamVjdCoKK0RCU2l0ZV9zZXRfY29uZmlnKERCU2l0ZU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCit7CisgICAgaW50IGVyciA9IDA7CisgICAgdV9pbnQzMl90IHdoaWNoLCB2YWx1ZTsKKyAgICBQeU9iamVjdCAqdmFsdWVPOworICAgIHN0YXRpYyBjaGFyKiBrd25hbWVzW10gPSB7ICJ3aGljaCIsICJ2YWx1ZSIsIE5VTEwgfTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImlPOnNldF9jb25maWciLCBrd25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGljaCwgJnZhbHVlTykpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgQ0hFQ0tfU0lURV9OT1RfQ0xPU0VEKHNlbGYpOworCisgICAgdmFsdWUgPSBQeU9iamVjdF9Jc1RydWUodmFsdWVPKTsKKworICAgIE1ZREJfQkVHSU5fQUxMT1dfVEhSRUFEUzsKKyAgICBlcnIgPSBzZWxmLT5zaXRlLT5zZXRfY29uZmlnKHNlbGYtPnNpdGUsIHdoaWNoLCB2YWx1ZSk7CisgICAgTVlEQl9FTkRfQUxMT1dfVEhSRUFEUzsKKworICAgIFJFVFVSTl9JRl9FUlIoKTsKKyAgICBSRVRVUk5fTk9ORSgpOworfQorI2VuZGlmCisKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBEQkN1cnNvciBtZXRob2RzICovCkBAIC00MTI3LDIxICs0MzgyLDEzIEBACiAgICAgICAgICAgICAgICAga2V5T2JqID0gTlVNQkVSX0Zyb21Mb25nKCooaW50ICopa2V5LmRhdGEpOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIGtleU9iaiA9IEJ1aWxkX1B5U3RyaW5nKGtleS5kYXRhLCBrZXkuc2l6ZSk7Ci0jaWYgKFBZX1ZFUlNJT05fSEVYID49IDB4MDIwNDAwMDApCiAgICAgICAgICAgICByZXR2YWwgPSBQeVR1cGxlX1BhY2soMywga2V5T2JqLCBwa2V5T2JqLCBkYXRhT2JqKTsKLSNlbHNlCi0gICAgICAgICAgICByZXR2YWwgPSBQeV9CdWlsZFZhbHVlKCJPT08iLCBrZXlPYmosIHBrZXlPYmosIGRhdGFPYmopOwotI2VuZGlmCiAgICAgICAgICAgICBQeV9ERUNSRUYoa2V5T2JqKTsKICAgICAgICAgICAgIEZSRUVfREJUKGtleSk7ICAvKiAnbWFrZV9rZXlfZGJ0JyBjb3VsZCBkbyBhICdtYWxsb2MnICovCiAgICAgICAgIH0KICAgICAgICAgZWxzZSAvKiByZXR1cm4ganVzdCB0aGUgcGtleSBhbmQgZGF0YSAqLwogICAgICAgICB7Ci0jaWYgKFBZX1ZFUlNJT05fSEVYID49IDB4MDIwNDAwMDApCiAgICAgICAgICAgICByZXR2YWwgPSBQeVR1cGxlX1BhY2soMiwgcGtleU9iaiwgZGF0YU9iaik7Ci0jZWxzZQotICAgICAgICAgICAgcmV0dmFsID0gUHlfQnVpbGRWYWx1ZSgiT08iLCBwa2V5T2JqLCBkYXRhT2JqKTsKLSNlbmRpZgogICAgICAgICB9CiAgICAgICAgIFB5X0RFQ1JFRihkYXRhT2JqKTsKICAgICAgICAgUHlfREVDUkVGKHBrZXlPYmopOwpAQCAtNDY1Niw2ICs0OTAzLDEyIEBACiAgICAgICAgICAgICBkdW1teSA9IERCTG9nQ3Vyc29yX2Nsb3NlX2ludGVybmFsKHNlbGYtPmNoaWxkcmVuX2xvZ2N1cnNvcnMpOwogICAgICAgICAgICAgUHlfWERFQ1JFRihkdW1teSk7CiAgICAgICAgIH0KKyNpZiAoREJWRVIgPj0gNTIpCisgICAgICAgIHdoaWxlKHNlbGYtPmNoaWxkcmVuX3NpdGVzKSB7CisgICAgICAgICAgICBkdW1teSA9IERCU2l0ZV9jbG9zZV9pbnRlcm5hbChzZWxmLT5jaGlsZHJlbl9zaXRlcyk7CisgICAgICAgICAgICBQeV9YREVDUkVGKGR1bW15KTsKKyAgICAgICAgfQorI2VuZGlmCiAgICAgfQogCiAgICAgc2VsZi0+Y2xvc2VkID0gMTsKQEAgLTQ3MzUsMTcgKzQ5ODgsMTYgQEAKICNkZWZpbmUgTUFLRV9FTlRSWShuYW1lKSAgX2FkZEludFRvRGljdChkLCAjbmFtZSwgZ3NwLT5zdF8jI25hbWUpCiAKICAgICBNQUtFX0VOVFJZKGdieXRlcyk7CisgICAgTUFLRV9FTlRSWShieXRlcyk7CiAgICAgTUFLRV9FTlRSWShuY2FjaGUpOwogI2lmIChEQlZFUiA+PSA0NikKICAgICBNQUtFX0VOVFJZKG1heF9uY2FjaGUpOwogI2VuZGlmCiAgICAgTUFLRV9FTlRSWShyZWdzaXplKTsKLSNpZiAoREJWRVIgPj0gNDMpCiAgICAgTUFLRV9FTlRSWShtbWFwc2l6ZSk7CiAgICAgTUFLRV9FTlRSWShtYXhvcGVuZmQpOwogICAgIE1BS0VfRU5UUlkobWF4d3JpdGUpOwogICAgIE1BS0VfRU5UUlkobWF4d3JpdGVfc2xlZXApOwotI2VuZGlmCiAgICAgTUFLRV9FTlRSWShtYXApOwogICAgIE1BS0VfRU5UUlkoY2FjaGVfaGl0KTsKICAgICBNQUtFX0VOVFJZKGNhY2hlX21pc3MpOwpAQCAtNDgyOCwxMyArNTA4MCwxMiBAQAogI3VuZGVmIE1BS0VfRU5UUlkKICAgICBmcmVlKGZzcCk7CiAKLSAgICByID0gUHlfQnVpbGRWYWx1ZSgiKE9PKSIsIGQsIGQyKTsKKyAgICByID0gUHlUdXBsZV9QYWNrKDIsIGQsIGQyKTsKICAgICBQeV9ERUNSRUYoZCk7CiAgICAgUHlfREVDUkVGKGQyKTsKICAgICByZXR1cm4gcjsKIH0KIAotI2lmIChEQlZFUiA+PSA0MykKIHN0YXRpYyBQeU9iamVjdCoKIERCRW52X21lbXBfc3RhdF9wcmludChEQkVudk9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CkBAIC00ODU0LDcgKzUxMDUsNiBAQAogICAgIFJFVFVSTl9JRl9FUlIoKTsKICAgICBSRVRVUk5fTk9ORSgpOwogfQotI2VuZGlmCiAKIAogc3RhdGljIFB5T2JqZWN0KgpAQCAtNDk4Nyw3ICs1MjM3LDYgQEAKICAgICBSRVRVUk5fTk9ORSgpOwogfQogCi0jaWYgKERCVkVSID49IDQyKQogc3RhdGljIFB5T2JqZWN0KgogREJFbnZfZ2V0X2VuY3J5cHRfZmxhZ3MoREJFbnZPYmplY3QqIHNlbGYpCiB7CkBAIC01MDI1LDcgKzUyNzQsNiBAQAogICAgIFJFVFVSTl9JRl9FUlIoKTsKICAgICByZXR1cm4gTlVNQkVSX0Zyb21Mb25nKHRpbWVvdXQpOwogfQotI2VuZGlmCiAKIAogc3RhdGljIFB5T2JqZWN0KgpAQCAtNTA2NCw3ICs1MzEyLDYgQEAKICAgICBSRVRVUk5fTk9ORSgpOwogfQogCi0jaWYgKERCVkVSID49IDQyKQogc3RhdGljIFB5T2JqZWN0KgogREJFbnZfZ2V0X3NobV9rZXkoREJFbnZPYmplY3QqIHNlbGYpCiB7CkBAIC01MDgxLDcgKzUzMjgsNiBAQAogCiAgICAgcmV0dXJuIE5VTUJFUl9Gcm9tTG9uZyhzaG1fa2V5KTsKIH0KLSNlbmRpZgogCiAjaWYgKERCVkVSID49IDQ2KQogc3RhdGljIFB5T2JqZWN0KgpAQCAtNTE3MCw3ICs1NDE2LDYgQEAKICAgICBSRVRVUk5fTk9ORSgpOwogfQogCi0jaWYgKERCVkVSID49IDQyKQogc3RhdGljIFB5T2JqZWN0KgogREJFbnZfZ2V0X2NhY2hlc2l6ZShEQkVudk9iamVjdCogc2VsZikKIHsKQEAgLTUxODgsNyArNTQzMyw2IEBACiAKICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGlpaSkiLCBnYnl0ZXMsIGJ5dGVzLCBuY2FjaGUpOwogfQotI2VuZGlmCiAKIAogc3RhdGljIFB5T2JqZWN0KgpAQCAtNTIwOCw3ICs1NDUyLDYgQEAKICAgICBSRVRVUk5fTk9ORSgpOwogfQogCi0jaWYgKERCVkVSID49IDQyKQogc3RhdGljIFB5T2JqZWN0KgogREJFbnZfZ2V0X2ZsYWdzKERCRW52T2JqZWN0KiBzZWxmKQogewpAQCAtNTIyMyw3ICs1NDY2LDYgQEAKICAgICBSRVRVUk5fSUZfRVJSKCk7CiAgICAgcmV0dXJuIE5VTUJFUl9Gcm9tTG9uZyhmbGFncyk7CiB9Ci0jZW5kaWYKIAogI2lmIChEQlZFUiA+PSA0NykKIHN0YXRpYyBQeU9iamVjdCoKQEAgLTU0MjMsNyArNTY2NSw2IEBACiAgICAgUkVUVVJOX05PTkUoKTsKIH0KIAotI2lmIChEQlZFUiA+PSA0MikKIHN0YXRpYyBQeU9iamVjdCoKIERCRW52X2dldF9kYXRhX2RpcnMoREJFbnZPYmplY3QqIHNlbGYpCiB7CkBAIC01NDYzLDcgKzU3MDQsNiBAQAogICAgIH0KICAgICByZXR1cm4gdHVwbGU7CiB9Ci0jZW5kaWYKIAogI2lmIChEQlZFUiA+PSA0NCkKIHN0YXRpYyBQeU9iamVjdCoKQEAgLTU1MTMsNyArNTc1Myw2IEBACiAgICAgUkVUVVJOX05PTkUoKTsKIH0KIAotI2lmIChEQlZFUiA+PSA0MikKIHN0YXRpYyBQeU9iamVjdCoKIERCRW52X2dldF9sZ19ic2l6ZShEQkVudk9iamVjdCogc2VsZikKIHsKQEAgLTU1MjgsNyArNTc2Nyw2IEBACiAgICAgUkVUVVJOX0lGX0VSUigpOwogICAgIHJldHVybiBOVU1CRVJfRnJvbUxvbmcobGdfYnNpemUpOwogfQotI2VuZGlmCiAKIHN0YXRpYyBQeU9iamVjdCoKIERCRW52X3NldF9sZ19kaXIoREJFbnZPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQpAQCAtNTU0Nyw3ICs1Nzg1LDYgQEAKICAgICBSRVRVUk5fTk9ORSgpOwogfQogCi0jaWYgKERCVkVSID49IDQyKQogc3RhdGljIFB5T2JqZWN0KgogREJFbnZfZ2V0X2xnX2RpcihEQkVudk9iamVjdCogc2VsZikKIHsKQEAgLTU1NjIsNyArNTc5OSw2IEBACiAgICAgUkVUVVJOX0lGX0VSUigpOwogICAgIHJldHVybiBQeUJ5dGVzX0Zyb21TdHJpbmcoZGlycCk7CiB9Ci0jZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0KgogREJFbnZfc2V0X2xnX21heChEQkVudk9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCkBAIC01NTgwLDcgKzU4MTYsNiBAQAogICAgIFJFVFVSTl9OT05FKCk7CiB9CiAKLSNpZiAoREJWRVIgPj0gNDIpCiBzdGF0aWMgUHlPYmplY3QqCiBEQkVudl9nZXRfbGdfbWF4KERCRW52T2JqZWN0KiBzZWxmKQogewpAQCAtNTU5NSw4ICs1ODMwLDYgQEAKICAgICBSRVRVUk5fSUZfRVJSKCk7CiAgICAgcmV0dXJuIE5VTUJFUl9Gcm9tTG9uZyhsZ19tYXgpOwogfQotI2VuZGlmCi0KIAogc3RhdGljIFB5T2JqZWN0KgogREJFbnZfc2V0X2xnX3JlZ2lvbm1heChEQkVudk9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCkBAIC01NjE0LDcgKzU4NDcsNiBAQAogICAgIFJFVFVSTl9OT05FKCk7CiB9CiAKLSNpZiAoREJWRVIgPj0gNDIpCiBzdGF0aWMgUHlPYmplY3QqCiBEQkVudl9nZXRfbGdfcmVnaW9ubWF4KERCRW52T2JqZWN0KiBzZWxmKQogewpAQCAtNTYyOSw3ICs1ODYxLDYgQEAKICAgICBSRVRVUk5fSUZfRVJSKCk7CiAgICAgcmV0dXJuIE5VTUJFUl9Gcm9tTG9uZyhsZ19yZWdpb25tYXgpOwogfQotI2VuZGlmCiAKICNpZiAoREJWRVIgPj0gNDcpCiBzdGF0aWMgUHlPYmplY3QqCkBAIC01NjgwLDcgKzU5MTEsNiBAQAogICAgIFJFVFVSTl9OT05FKCk7CiB9CiAKLSNpZiAoREJWRVIgPj0gNDIpCiBzdGF0aWMgUHlPYmplY3QqCiBEQkVudl9nZXRfbGtfZGV0ZWN0KERCRW52T2JqZWN0KiBzZWxmKQogewpAQCAtNTY5NSw4ICs1OTI1LDYgQEAKICAgICBSRVRVUk5fSUZfRVJSKCk7CiAgICAgcmV0dXJuIE5VTUJFUl9Gcm9tTG9uZyhsa19kZXRlY3QpOwogfQotI2VuZGlmCi0KIAogI2lmIChEQlZFUiA8IDQ1KQogc3RhdGljIFB5T2JqZWN0KgpAQCAtNTczNCw3ICs1OTYyLDYgQEAKICAgICBSRVRVUk5fTk9ORSgpOwogfQogCi0jaWYgKERCVkVSID49IDQyKQogc3RhdGljIFB5T2JqZWN0KgogREJFbnZfZ2V0X2xrX21heF9sb2NrcyhEQkVudk9iamVjdCogc2VsZikKIHsKQEAgLTU3NDksNyArNTk3Niw2IEBACiAgICAgUkVUVVJOX0lGX0VSUigpOwogICAgIHJldHVybiBOVU1CRVJfRnJvbUxvbmcobGtfbWF4KTsKIH0KLSNlbmRpZgogCiBzdGF0aWMgUHlPYmplY3QqCiBEQkVudl9zZXRfbGtfbWF4X2xvY2tlcnMoREJFbnZPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQpAQCAtNTc2Nyw3ICs1OTkzLDYgQEAKICAgICBSRVRVUk5fTk9ORSgpOwogfQogCi0jaWYgKERCVkVSID49IDQyKQogc3RhdGljIFB5T2JqZWN0KgogREJFbnZfZ2V0X2xrX21heF9sb2NrZXJzKERCRW52T2JqZWN0KiBzZWxmKQogewpAQCAtNTc4Miw3ICs2MDA3LDYgQEAKICAgICBSRVRVUk5fSUZfRVJSKCk7CiAgICAgcmV0dXJuIE5VTUJFUl9Gcm9tTG9uZyhsa19tYXgpOwogfQotI2VuZGlmCiAKIHN0YXRpYyBQeU9iamVjdCoKIERCRW52X3NldF9sa19tYXhfb2JqZWN0cyhEQkVudk9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCkBAIC01ODAwLDcgKzYwMjQsNiBAQAogICAgIFJFVFVSTl9OT05FKCk7CiB9CiAKLSNpZiAoREJWRVIgPj0gNDIpCiBzdGF0aWMgUHlPYmplY3QqCiBEQkVudl9nZXRfbGtfbWF4X29iamVjdHMoREJFbnZPYmplY3QqIHNlbGYpCiB7CkBAIC01ODE1LDkgKzYwMzgsNyBAQAogICAgIFJFVFVSTl9JRl9FUlIoKTsKICAgICByZXR1cm4gTlVNQkVSX0Zyb21Mb25nKGxrX21heCk7CiB9Ci0jZW5kaWYKIAotI2lmIChEQlZFUiA+PSA0MikKIHN0YXRpYyBQeU9iamVjdCoKIERCRW52X2dldF9tcF9tbWFwc2l6ZShEQkVudk9iamVjdCogc2VsZikKIHsKQEAgLTU4MzIsOCArNjA1Myw2IEBACiAgICAgUkVUVVJOX0lGX0VSUigpOwogICAgIHJldHVybiBOVU1CRVJfRnJvbUxvbmcobW1hcHNpemUpOwogfQotI2VuZGlmCi0KIAogc3RhdGljIFB5T2JqZWN0KgogREJFbnZfc2V0X21wX21tYXBzaXplKERCRW52T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKQEAgLTU4NjksOCArNjA4OCw2IEBACiAgICAgUkVUVVJOX05PTkUoKTsKIH0KIAotCi0jaWYgKERCVkVSID49IDQyKQogc3RhdGljIFB5T2JqZWN0KgogREJFbnZfZ2V0X3RtcF9kaXIoREJFbnZPYmplY3QqIHNlbGYpCiB7CkBAIC01ODg3LDggKzYxMDQsNiBAQAogCiAgICAgcmV0dXJuIFB5Qnl0ZXNfRnJvbVN0cmluZyhkaXJwcCk7CiB9Ci0jZW5kaWYKLQogCiBzdGF0aWMgUHlPYmplY3QqCiBEQkVudl90eG5fcmVjb3ZlcihEQkVudk9iamVjdCogc2VsZikKQEAgLTU4OTksNyArNjExNCw3IEBACiAgICAgREJUeG5PYmplY3QgKnR4bjsKICNkZWZpbmUgUFJFUExJU1RfTEVOIDE2CiAgICAgREJfUFJFUExJU1QgcHJlcGxpc3RbUFJFUExJU1RfTEVOXTsKLSNpZiAoREJWRVIgPCA0OCkKKyNpZiAoREJWRVIgPCA0OCkgfHwgKERCVkVSID49IDUyKQogICAgIGxvbmcgcmV0cDsKICNlbHNlCiAgICAgdV9pbnQzMl90IHJldHA7CkBAIC02MDAzLDggKzYyMTgsNiBAQAogICAgIFJFVFVSTl9OT05FKCk7CiB9CiAKLQotI2lmIChEQlZFUiA+PSA0MikKIHN0YXRpYyBQeU9iamVjdCoKIERCRW52X2dldF90eF9tYXgoREJFbnZPYmplY3QqIHNlbGYpCiB7CkBAIC02MDE5LDggKzYyMzIsNiBAQAogICAgIFJFVFVSTl9JRl9FUlIoKTsKICAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcobWF4KTsKIH0KLSNlbmRpZgotCiAKIHN0YXRpYyBQeU9iamVjdCoKIERCRW52X3NldF90eF9tYXgoREJFbnZPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQpAQCAtNjAzOCw4ICs2MjQ5LDYgQEAKICAgICBSRVRVUk5fTk9ORSgpOwogfQogCi0KLSNpZiAoREJWRVIgPj0gNDIpCiBzdGF0aWMgUHlPYmplY3QqCiBEQkVudl9nZXRfdHhfdGltZXN0YW1wKERCRW52T2JqZWN0KiBzZWxmKQogewpAQCAtNjA1NCw3ICs2MjYzLDYgQEAKICAgICBSRVRVUk5fSUZfRVJSKCk7CiAgICAgcmV0dXJuIE5VTUJFUl9Gcm9tTG9uZyh0aW1lc3RhbXApOwogfQotI2VuZGlmCiAKIHN0YXRpYyBQeU9iamVjdCoKIERCRW52X3NldF90eF90aW1lc3RhbXAoREJFbnZPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQpAQCAtNjIwNCw3ICs2NDEyLDYgQEAKICNlbmRpZiAvKiBEQlZFUiA+PSA0LjQgKi8KIAogCi0jaWYgKERCVkVSID49IDQzKQogc3RhdGljIFB5T2JqZWN0KgogREJFbnZfc3RhdF9wcmludChEQkVudk9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CkBAIC02MjI0LDcgKzY0MzEsNiBAQAogICAgIFJFVFVSTl9JRl9FUlIoKTsKICAgICBSRVRVUk5fTk9ORSgpOwogfQotI2VuZGlmCiAKIAogc3RhdGljIFB5T2JqZWN0KgpAQCAtNjI4OCw3ICs2NDk0LDYgQEAKIH0gLyogREJFbnZfbG9nX3N0YXQgKi8KIAogCi0jaWYgKERCVkVSID49IDQzKQogc3RhdGljIFB5T2JqZWN0KgogREJFbnZfbG9nX3N0YXRfcHJpbnQoREJFbnZPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewpAQCAtNjMwOCw3ICs2NTEzLDYgQEAKICAgICBSRVRVUk5fSUZfRVJSKCk7CiAgICAgUkVUVVJOX05PTkUoKTsKIH0KLSNlbmRpZgogCiAKIHN0YXRpYyBQeU9iamVjdCoKQEAgLTYzOTAsNyArNjU5NCw2IEBACiAgICAgcmV0dXJuIGQ7CiB9CiAKLSNpZiAoREJWRVIgPj0gNDMpCiBzdGF0aWMgUHlPYmplY3QqCiBEQkVudl9sb2NrX3N0YXRfcHJpbnQoREJFbnZPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewpAQCAtNjQxMCw3ICs2NjEzLDYgQEAKICAgICBSRVRVUk5fSUZfRVJSKCk7CiAgICAgUkVUVVJOX05PTkUoKTsKIH0KLSNlbmRpZgogCiAKIHN0YXRpYyBQeU9iamVjdCoKQEAgLTY1NzIsNiArNjc3NCw1MiBAQAogfQogCiAKKyNpZiAoREJWRVIgPj0gNTIpCitzdGF0aWMgUHlPYmplY3QqCitEQkVudl9yZXBtZ3Jfc2l0ZShEQkVudk9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCit7CisgICAgaW50IGVycjsKKyAgICBEQl9TSVRFKiBzaXRlOworICAgIGNoYXIgKmhvc3Q7CisgICAgdV9pbnQgcG9ydDsKKyAgICBzdGF0aWMgY2hhcioga3duYW1lc1tdID0geyJob3N0IiwgInBvcnQiLCBOVUxMfTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInNpOnJlcG1ncl9zaXRlIiwga3duYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaG9zdCwgJnBvcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIENIRUNLX0VOVl9OT1RfQ0xPU0VEKHNlbGYpOworCisgICAgTVlEQl9CRUdJTl9BTExPV19USFJFQURTOworICAgIGVyciA9IHNlbGYtPmRiX2Vudi0+cmVwbWdyX3NpdGUoc2VsZi0+ZGJfZW52LCBob3N0LCBwb3J0LCAmc2l0ZSwgMCk7CisgICAgTVlEQl9FTkRfQUxMT1dfVEhSRUFEUzsKKyAgICBSRVRVUk5fSUZfRVJSKCk7CisgICAgcmV0dXJuIChQeU9iamVjdCopIG5ld0RCU2l0ZU9iamVjdChzaXRlLCBzZWxmKTsKK30KKworc3RhdGljIFB5T2JqZWN0KgorREJFbnZfcmVwbWdyX3NpdGVfYnlfZWlkKERCRW52T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QgKmt3YXJncykKK3sKKyAgICBpbnQgZXJyOworICAgIERCX1NJVEUqIHNpdGU7CisgICAgaW50IGVpZDsKKyAgICBzdGF0aWMgY2hhcioga3duYW1lc1tdID0geyJlaWQiLCBOVUxMfTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6cmVwbWdyX3NpdGVfYnlfZWlkIiwKKyAgICAgICAgICAgICAgICBrd25hbWVzLCAmZWlkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBDSEVDS19FTlZfTk9UX0NMT1NFRChzZWxmKTsKKworICAgIE1ZREJfQkVHSU5fQUxMT1dfVEhSRUFEUzsKKyAgICBlcnIgPSBzZWxmLT5kYl9lbnYtPnJlcG1ncl9zaXRlX2J5X2VpZChzZWxmLT5kYl9lbnYsIGVpZCwgJnNpdGUpOworICAgIE1ZREJfRU5EX0FMTE9XX1RIUkVBRFM7CisgICAgUkVUVVJOX0lGX0VSUigpOworICAgIHJldHVybiAoUHlPYmplY3QqKSBuZXdEQlNpdGVPYmplY3Qoc2l0ZSwgc2VsZik7Cit9CisjZW5kaWYKKworCiAjaWYgKERCVkVSID49IDQ0KQogc3RhdGljIFB5T2JqZWN0KgogREJFbnZfbXV0ZXhfc3RhdChEQkVudk9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCkBAIC02NjQwLDcgKzY4ODgsNiBAQAogI2VuZGlmCiAKIAotI2lmIChEQlZFUiA+PSA0MykKIHN0YXRpYyBQeU9iamVjdCoKIERCRW52X3R4bl9zdGF0X3ByaW50KERCRW52T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKQEAgLTY2NjIsNyArNjkwOSw2IEBACiAgICAgUkVUVVJOX0lGX0VSUigpOwogICAgIFJFVFVSTl9OT05FKCk7CiB9Ci0jZW5kaWYKIAogCiBzdGF0aWMgUHlPYmplY3QqCkBAIC02NzU2LDYgKzcwMDIsNzYgQEAKICAgICBSRVRVUk5fTk9ORSgpOwogfQogCisjaWYgKERCVkVSID49IDQ3KQorc3RhdGljIFB5T2JqZWN0KgorREJFbnZfc2V0X2ludGVybWVkaWF0ZV9kaXJfbW9kZShEQkVudk9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCit7CisgICAgaW50IGVycjsKKyAgICBjb25zdCBjaGFyICptb2RlOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsInM6c2V0X2ludGVybWVkaWF0ZV9kaXJfbW9kZSIsICZtb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBDSEVDS19FTlZfTk9UX0NMT1NFRChzZWxmKTsKKworICAgIE1ZREJfQkVHSU5fQUxMT1dfVEhSRUFEUzsKKyAgICBlcnIgPSBzZWxmLT5kYl9lbnYtPnNldF9pbnRlcm1lZGlhdGVfZGlyX21vZGUoc2VsZi0+ZGJfZW52LCBtb2RlKTsKKyAgICBNWURCX0VORF9BTExPV19USFJFQURTOworICAgIFJFVFVSTl9JRl9FUlIoKTsKKyAgICBSRVRVUk5fTk9ORSgpOworfQorCitzdGF0aWMgUHlPYmplY3QqCitEQkVudl9nZXRfaW50ZXJtZWRpYXRlX2Rpcl9tb2RlKERCRW52T2JqZWN0KiBzZWxmKQoreworICAgIGludCBlcnI7CisgICAgY29uc3QgY2hhciAqbW9kZTsKKworICAgIENIRUNLX0VOVl9OT1RfQ0xPU0VEKHNlbGYpOworCisgICAgTVlEQl9CRUdJTl9BTExPV19USFJFQURTOworICAgIGVyciA9IHNlbGYtPmRiX2Vudi0+Z2V0X2ludGVybWVkaWF0ZV9kaXJfbW9kZShzZWxmLT5kYl9lbnYsICZtb2RlKTsKKyAgICBNWURCX0VORF9BTExPV19USFJFQURTOworICAgIFJFVFVSTl9JRl9FUlIoKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgicyIsIG1vZGUpOworfQorI2VuZGlmCisKKyNpZiAoREJWRVIgPCA0NykKK3N0YXRpYyBQeU9iamVjdCoKK0RCRW52X3NldF9pbnRlcm1lZGlhdGVfZGlyKERCRW52T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKK3sKKyAgICBpbnQgZXJyOworICAgIGludCBtb2RlOworICAgIHVfaW50MzJfdCBmbGFnczsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaUk6c2V0X2ludGVybWVkaWF0ZV9kaXIiLCAmbW9kZSwgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBDSEVDS19FTlZfTk9UX0NMT1NFRChzZWxmKTsKKworICAgIE1ZREJfQkVHSU5fQUxMT1dfVEhSRUFEUzsKKyAgICBlcnIgPSBzZWxmLT5kYl9lbnYtPnNldF9pbnRlcm1lZGlhdGVfZGlyKHNlbGYtPmRiX2VudiwgbW9kZSwgZmxhZ3MpOworICAgIE1ZREJfRU5EX0FMTE9XX1RIUkVBRFM7CisgICAgUkVUVVJOX0lGX0VSUigpOworICAgIFJFVFVSTl9OT05FKCk7Cit9CisjZW5kaWYKKworc3RhdGljIFB5T2JqZWN0KgorREJFbnZfZ2V0X29wZW5fZmxhZ3MoREJFbnZPYmplY3QqIHNlbGYpCit7CisgICAgaW50IGVycjsKKyAgICB1bnNpZ25lZCBpbnQgZmxhZ3M7CisKKyAgICBDSEVDS19FTlZfTk9UX0NMT1NFRChzZWxmKTsKKworICAgIE1ZREJfQkVHSU5fQUxMT1dfVEhSRUFEUzsKKyAgICBlcnIgPSBzZWxmLT5kYl9lbnYtPmdldF9vcGVuX2ZsYWdzKHNlbGYtPmRiX2VudiwgJmZsYWdzKTsKKyAgICBNWURCX0VORF9BTExPV19USFJFQURTOworICAgIFJFVFVSTl9JRl9FUlIoKTsKKyAgICByZXR1cm4gTlVNQkVSX0Zyb21Mb25nKGZsYWdzKTsKK30KIAogI2lmIChEQlZFUiA8IDQ4KQogc3RhdGljIFB5T2JqZWN0KgpAQCAtNjc4MSw3ICs3MDk3LDYgQEAKIH0KICNlbmRpZgogCi0jaWYgKERCVkVSID49IDQzKQogc3RhdGljIFB5T2JqZWN0KgogREJFbnZfc2V0X21wX21heF9vcGVuZmQoREJFbnZPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewpAQCAtNjg1NSw3ICs3MTcwLDYgQEAKIAogICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoaWkpIiwgbWF4d3JpdGUsIChpbnQpbWF4d3JpdGVfc2xlZXApOwogfQotI2VuZGlmCiAKIAogc3RhdGljIFB5T2JqZWN0KgpAQCAtNjg3NSw3ICs3MTg5LDYgQEAKICAgICBSRVRVUk5fTk9ORSgpOwogfQogCi0jaWYgKERCVkVSID49IDQyKQogc3RhdGljIFB5T2JqZWN0KgogREJFbnZfZ2V0X3ZlcmJvc2UoREJFbnZPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewpAQCAtNjg5Myw3ICs3MjA2LDYgQEAKICAgICBSRVRVUk5fSUZfRVJSKCk7CiAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyh2ZXJib3NlKTsKIH0KLSNlbmRpZgogCiAjaWYgKERCVkVSID49IDQ1KQogc3RhdGljIHZvaWQKQEAgLTY5NzUsOSArNzI4Nyw3IEBACiAgICAgUHlPYmplY3QgKmNvbnRyb2xfcHksICpyZWNfcHk7CiAgICAgREJUIGNvbnRyb2wsIHJlYzsKICAgICBpbnQgZW52aWQ7Ci0jaWYgKERCVkVSID49IDQyKQogICAgIERCX0xTTiBsc247Ci0jZW5kaWYKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT09pOnJlcF9wcm9jZXNzX21lc3NhZ2UiLCAmY29udHJvbF9weSwKICAgICAgICAgICAgICAgICAmcmVjX3B5LCAmZW52aWQpKQpAQCAtNjk5NCwxMyArNzMwNCw4IEBACiAgICAgZXJyID0gc2VsZi0+ZGJfZW52LT5yZXBfcHJvY2Vzc19tZXNzYWdlKHNlbGYtPmRiX2VudiwgJmNvbnRyb2wsICZyZWMsCiAgICAgICAgICAgICBlbnZpZCwgJmxzbik7CiAjZWxzZQotI2lmIChEQlZFUiA+PSA0MikKICAgICBlcnIgPSBzZWxmLT5kYl9lbnYtPnJlcF9wcm9jZXNzX21lc3NhZ2Uoc2VsZi0+ZGJfZW52LCAmY29udHJvbCwgJnJlYywKICAgICAgICAgICAgICZlbnZpZCwgJmxzbik7Ci0jZWxzZQotICAgIGVyciA9IHNlbGYtPmRiX2Vudi0+cmVwX3Byb2Nlc3NfbWVzc2FnZShzZWxmLT5kYl9lbnYsICZjb250cm9sLCAmcmVjLAotICAgICAgICAgICAgJmVudmlkKTsKLSNlbmRpZgogI2VuZGlmCiAgICAgTVlEQl9FTkRfQUxMT1dfVEhSRUFEUzsKICAgICBzd2l0Y2ggKGVycikgewpAQCAtNzAyOSwxNSArNzMzNCwxMyBAQAogICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotI2lmIChEQlZFUiA+PSA0MikKICAgICAgICAgY2FzZSBEQl9SRVBfTk9UUEVSTSA6CiAgICAgICAgIGNhc2UgREJfUkVQX0lTUEVSTSA6CiAgICAgICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGkobGwpKSIsIGVyciwgbHNuLmZpbGUsIGxzbi5vZmZzZXQpOwogICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKICAgICB9CiAgICAgUkVUVVJOX0lGX0VSUigpOwotICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoT08pIiwgUHlfTm9uZSwgUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5VHVwbGVfUGFjaygyLCBQeV9Ob25lLCBQeV9Ob25lKTsKIH0KIAogc3RhdGljIGludApAQCAtNzA2MiwxMSArNzM2NSw3IEBACiAgICAgYiA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUocmVjLT5kYXRhLCByZWMtPnNpemUpOwogCiAgICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoCi0jaWYgKFBZX1ZFUlNJT05fSEVYID49IDB4MDIwNDAwMDApCiAgICAgICAgICAgICAiKE9PTyhsbClpSSkiLAotI2Vsc2UKLSAgICAgICAgICAgICIoT09PKGxsKWlpKSIsCi0jZW5kaWYKICAgICAgICAgICAgIGRiZW52LAogICAgICAgICAgICAgYSwgYiwKICAgICAgICAgICAgIGxzbi0+ZmlsZSwgbHNuLT5vZmZzZXQsIGVudmlkLCBmbGFncyk7CkBAIC03MDg2LDIwICs3Mzg1LDYgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi0jaWYgKERCVkVSIDw9IDQxKQotc3RhdGljIGludAotX0RCRW52X3JlcF90cmFuc3BvcnRDYWxsYmFja09MRChEQl9FTlYqIGRiX2VudiwgY29uc3QgREJUKiBjb250cm9sLCBjb25zdCBEQlQqIHJlYywKLSAgICAgICAgaW50IGVudmlkLCB1X2ludDMyX3QgZmxhZ3MpCi17Ci0gICAgREJfTFNOIGxzbjsKLQotICAgIGxzbi5maWxlID0gLTE7ICAvKiBEdW1teSB2YWx1ZXMgKi8KLSAgICBsc24ub2Zmc2V0ID0gLTE7Ci0gICAgcmV0dXJuIF9EQkVudl9yZXBfdHJhbnNwb3J0Q2FsbGJhY2soZGJfZW52LCBjb250cm9sLCByZWMsICZsc24sIGVudmlkLAotICAgICAgICAgICAgZmxhZ3MpOwotfQotI2VuZGlmCi0KIHN0YXRpYyBQeU9iamVjdCoKIERCRW52X3JlcF9zZXRfdHJhbnNwb3J0KERCRW52T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKIHsKQEAgLTcxMjAsMTMgKzc0MDUsOCBAQAogICAgIGVyciA9IHNlbGYtPmRiX2Vudi0+cmVwX3NldF90cmFuc3BvcnQoc2VsZi0+ZGJfZW52LCBlbnZpZCwKICAgICAgICAgICAgICZfREJFbnZfcmVwX3RyYW5zcG9ydENhbGxiYWNrKTsKICNlbHNlCi0jaWYgKERCVkVSID49IDQyKQogICAgIGVyciA9IHNlbGYtPmRiX2Vudi0+c2V0X3JlcF90cmFuc3BvcnQoc2VsZi0+ZGJfZW52LCBlbnZpZCwKICAgICAgICAgICAgICZfREJFbnZfcmVwX3RyYW5zcG9ydENhbGxiYWNrKTsKLSNlbHNlCi0gICAgZXJyID0gc2VsZi0+ZGJfZW52LT5zZXRfcmVwX3RyYW5zcG9ydChzZWxmLT5kYl9lbnYsIGVudmlkLAotICAgICAgICAgICAgJl9EQkVudl9yZXBfdHJhbnNwb3J0Q2FsbGJhY2tPTEQpOwotI2VuZGlmCiAjZW5kaWYKICAgICBNWURCX0VORF9BTExPV19USFJFQURTOwogICAgIFJFVFVSTl9JRl9FUlIoKTsKQEAgLTcxNjYsMTEgKzc0NDYsNyBAQAogICAgIGVyciA9IHNlbGYtPmRiX2Vudi0+cmVwX2dldF9yZXF1ZXN0KHNlbGYtPmRiX2VudiwgJm1pbmltdW0sICZtYXhpbXVtKTsKICAgICBNWURCX0VORF9BTExPV19USFJFQURTOwogICAgIFJFVFVSTl9JRl9FUlIoKTsKLSNpZiAoUFlfVkVSU0lPTl9IRVggPj0gMHgwMjA0MDAwMCkKICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiSUkiLCBtaW5pbXVtLCBtYXhpbXVtKTsKLSNlbHNlCi0gICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpIiwgbWluaW11bSwgbWF4aW11bSk7Ci0jZW5kaWYKIH0KICNlbmRpZgogCkBAIC03MjU3LDcgKzc1MzMsNyBAQAogICAgIH0KICAgICBDSEVDS19FTlZfTk9UX0NMT1NFRChzZWxmKTsKICAgICBNWURCX0JFR0lOX0FMTE9XX1RIUkVBRFM7Ci0gICAgZXJyID0gc2VsZi0+ZGJfZW52LT5yZXBfZWxlY3Qoc2VsZi0+ZGJfZW52LCBudm90ZXMsIG52b3RlcywgMCk7CisgICAgZXJyID0gc2VsZi0+ZGJfZW52LT5yZXBfZWxlY3Qoc2VsZi0+ZGJfZW52LCBuc2l0ZXMsIG52b3RlcywgMCk7CiAgICAgTVlEQl9FTkRfQUxMT1dfVEhSRUFEUzsKICAgICBSRVRVUk5fSUZfRVJSKCk7CiAgICAgUkVUVVJOX05PTkUoKTsKQEAgLTc0MjIsMTMgKzc2OTgsOCBAQAogICAgIGludCBlcnI7CiAgICAgdW5zaWduZWQgaW50IGZhc3QsIHNsb3c7CiAKLSNpZiAoUFlfVkVSU0lPTl9IRVggPj0gMHgwMjA0MDAwMCkKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywiSUk6cmVwX3NldF9jbG9ja3NrZXciLCAmZmFzdCwgJnNsb3cpKQogICAgICAgICByZXR1cm4gTlVMTDsKLSNlbHNlCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsImlpOnJlcF9zZXRfY2xvY2tza2V3IiwgJmZhc3QsICZzbG93KSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0jZW5kaWYKIAogICAgIENIRUNLX0VOVl9OT1RfQ0xPU0VEKHNlbGYpOwogCkBAIC03NDUwLDE1ICs3NzIxLDEwIEBACiAgICAgZXJyID0gc2VsZi0+ZGJfZW52LT5yZXBfZ2V0X2Nsb2Nrc2tldyhzZWxmLT5kYl9lbnYsICZmYXN0LCAmc2xvdyk7CiAgICAgTVlEQl9FTkRfQUxMT1dfVEhSRUFEUzsKICAgICBSRVRVUk5fSUZfRVJSKCk7Ci0jaWYgKFBZX1ZFUlNJT05fSEVYID49IDB4MDIwNDAwMDApCiAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihJSSkiLCBmYXN0LCBzbG93KTsKLSNlbHNlCi0gICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpaSkiLCBmYXN0LCBzbG93KTsKLSNlbmRpZgogfQogI2VuZGlmCiAKLSNpZiAoREJWRVIgPj0gNDMpCiBzdGF0aWMgUHlPYmplY3QqCiBEQkVudl9yZXBfc3RhdF9wcmludChEQkVudk9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CkBAIC03NDc4LDcgKzc3NDQsNiBAQAogICAgIFJFVFVSTl9JRl9FUlIoKTsKICAgICBSRVRVUk5fTk9ORSgpOwogfQotI2VuZGlmCiAKIHN0YXRpYyBQeU9iamVjdCoKIERCRW52X3JlcF9zdGF0KERCRW52T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QgKmt3YXJncykKQEAgLTc1MTksNyArNzc4NCw2IEBACiAgICAgTUFLRV9FTlRSWShjbGllbnRfc3ZjX3JlcSk7CiAjZW5kaWYKICAgICBNQUtFX0VOVFJZKGR1cG1hc3RlcnMpOwotI2lmIChEQlZFUiA+PSA0MykKICAgICBNQUtFX0VOVFJZKGVnZW4pOwogICAgIE1BS0VfRU5UUlkoZWxlY3Rpb25fbnZvdGVzKTsKICAgICBNQUtFX0VOVFJZKHN0YXJ0dXBfY29tcGxldGUpOwpAQCAtNzUyOCw3ICs3NzkyLDYgQEAKICAgICBNQUtFX0VOVFJZKHBnX3JlcXVlc3RlZCk7CiAgICAgTUFLRV9FTlRSWShuZXh0X3BnKTsKICAgICBNQUtFX0VOVFJZKHdhaXRpbmdfcGcpOwotI2VuZGlmCiAgICAgTUFLRV9FTlRSWShlbGVjdGlvbl9jdXJfd2lubmVyKTsKICAgICBNQUtFX0VOVFJZKGVsZWN0aW9uX2dlbik7CiAgICAgTUFLRV9EQl9MU05fRU5UUlkoZWxlY3Rpb25fbHNuKTsKQEAgLTc2MDgsNiArNzg3MSw3IEBACiAgICAgUkVUVVJOX05PTkUoKTsKIH0KIAorI2lmIChEQlZFUiA8IDUyKQogc3RhdGljIFB5T2JqZWN0KgogREJFbnZfcmVwbWdyX3NldF9sb2NhbF9zaXRlKERCRW52T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqCiAgICAgICAgIGt3YXJncykKQEAgLTc2NTQsNiArNzkxOCw3IEBACiAgICAgUkVUVVJOX0lGX0VSUigpOwogICAgIHJldHVybiBOVU1CRVJfRnJvbUxvbmcoZWlkcCk7CiB9CisjZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0KgogREJFbnZfcmVwbWdyX3NldF9hY2tfcG9saWN5KERCRW52T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKQEAgLTc3MTQsMTMgKzc5NzksOCBAQAogICAgICAgICAgICAgZnJlZShsaXN0cCk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotI2lmIChQWV9WRVJTSU9OX0hFWCA+PSAweDAyMDQwMDAwKQogICAgICAgICB0dXBsZT1QeV9CdWlsZFZhbHVlKCIoc0lJKSIsIGxpc3RwW2NvdW50cF0uaG9zdCwKICAgICAgICAgICAgICAgICBsaXN0cFtjb3VudHBdLnBvcnQsIGxpc3RwW2NvdW50cF0uc3RhdHVzKTsKLSNlbHNlCi0gICAgICAgIHR1cGxlPVB5X0J1aWxkVmFsdWUoIihzaWkpIiwgbGlzdHBbY291bnRwXS5ob3N0LAotICAgICAgICAgICAgICAgIGxpc3RwW2NvdW50cF0ucG9ydCwgbGlzdHBbY291bnRwXS5zdGF0dXMpOwotI2VuZGlmCiAgICAgICAgIGlmKCF0dXBsZSkgewogICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CiAgICAgICAgICAgICBQeV9ERUNSRUYoc3RhdHMpOwpAQCAtNzgyNCw5ICs4MDg0LDcgQEAKIHN0YXRpYyB2b2lkIF9wcm9tb3RlX3RyYW5zYWN0aW9uX2Ric19hbmRfc2VxdWVuY2VzKERCVHhuT2JqZWN0ICp0eG4pCiB7CiAgICAgREJPYmplY3QgKmRiOwotI2lmIChEQlZFUiA+PSA0MykKICAgICBEQlNlcXVlbmNlT2JqZWN0ICpkYnM7Ci0jZW5kaWYKIAogICAgIHdoaWxlICh0eG4tPmNoaWxkcmVuX2RicykgewogICAgICAgICBkYj10eG4tPmNoaWxkcmVuX2RiczsKQEAgLTc4NDIsNyArODEwMCw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSNpZiAoREJWRVIgPj0gNDMpCiAgICAgd2hpbGUgKHR4bi0+Y2hpbGRyZW5fc2VxdWVuY2VzKSB7CiAgICAgICAgIGRicz10eG4tPmNoaWxkcmVuX3NlcXVlbmNlczsKICAgICAgICAgRVhUUkFDVF9GUk9NX0RPVUJMRV9MSU5LRURfTElTVF9UWE4oZGJzKTsKQEAgLTc4NTYsNyArODExMyw2IEBACiAgICAgICAgICAgICBkYnMtPnR4bj1OVUxMOwogICAgICAgICB9CiAgICAgfQotI2VuZGlmCiB9CiAKIApAQCAtNzk1MywxMiArODIwOSwxMCBAQAogICAgIHNlbGYtPnR4biA9IE5VTEw7ICAgLyogdGhpcyBEQl9UWE4gaXMgbm8gbG9uZ2VyIHZhbGlkIGFmdGVyIHRoaXMgY2FsbCAqLwogCiAgICAgX2Nsb3NlX3RyYW5zYWN0aW9uX2N1cnNvcnMoc2VsZik7Ci0jaWYgKERCVkVSID49IDQzKQogICAgIHdoaWxlIChzZWxmLT5jaGlsZHJlbl9zZXF1ZW5jZXMpIHsKICAgICAgICAgZHVtbXk9REJTZXF1ZW5jZV9jbG9zZV9pbnRlcm5hbChzZWxmLT5jaGlsZHJlbl9zZXF1ZW5jZXMsMCwwKTsKICAgICAgICAgUHlfWERFQ1JFRihkdW1teSk7CiAgICAgfQotI2VuZGlmCiAgICAgd2hpbGUgKHNlbGYtPmNoaWxkcmVuX2RicykgewogICAgICAgICBkdW1teT1EQl9jbG9zZV9pbnRlcm5hbChzZWxmLT5jaGlsZHJlbl9kYnMsIDAsIDApOwogICAgICAgICBQeV9YREVDUkVGKGR1bW15KTsKQEAgLTgwOTQsNyArODM0OCw2IEBACiAjZW5kaWYKIAogCi0jaWYgKERCVkVSID49IDQzKQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBEQlNlcXVlbmNlIG1ldGhvZHMgKi8KIApAQCAtODQ0NCw3ICs4Njk3LDYgQEAKICAgICBmcmVlKHNwKTsKICAgICByZXR1cm4gZGljdF9zdGF0OwogfQotI2VuZGlmCiAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC04NDgyLDcwICs4NzM0LDQ1IEBACiAgICAgeyJyZW1vdmUiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pREJfcmVtb3ZlLCAgICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTfSwKICAgICB7InJlbmFtZSIsICAgICAgICAgIChQeUNGdW5jdGlvbilEQl9yZW5hbWUsICAgICAgICAgTUVUSF9WQVJBUkdTfSwKICAgICB7InNldF9idF9taW5rZXkiLCAgIChQeUNGdW5jdGlvbilEQl9zZXRfYnRfbWlua2V5LCAgTUVUSF9WQVJBUkdTfSwKLSNpZiAoREJWRVIgPj0gNDIpCiAgICAgeyJnZXRfYnRfbWlua2V5IiwgICAoUHlDRnVuY3Rpb24pREJfZ2V0X2J0X21pbmtleSwgIE1FVEhfTk9BUkdTfSwKLSNlbmRpZgogICAgIHsic2V0X2J0X2NvbXBhcmUiLCAgKFB5Q0Z1bmN0aW9uKURCX3NldF9idF9jb21wYXJlLCBNRVRIX099LAogICAgIHsic2V0X2NhY2hlc2l6ZSIsICAgKFB5Q0Z1bmN0aW9uKURCX3NldF9jYWNoZXNpemUsICBNRVRIX1ZBUkFSR1N9LAotI2lmIChEQlZFUiA+PSA0MikKICAgICB7ImdldF9jYWNoZXNpemUiLCAgIChQeUNGdW5jdGlvbilEQl9nZXRfY2FjaGVzaXplLCAgTUVUSF9OT0FSR1N9LAotI2VuZGlmCisgICAgeyJzZXRfZHVwX2NvbXBhcmUiLCAoUHlDRnVuY3Rpb24pREJfc2V0X2R1cF9jb21wYXJlLCBNRVRIX099LAogICAgIHsic2V0X2VuY3J5cHQiLCAgICAgKFB5Q0Z1bmN0aW9uKURCX3NldF9lbmNyeXB0LCAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEU30sCi0jaWYgKERCVkVSID49IDQyKQogICAgIHsiZ2V0X2VuY3J5cHRfZmxhZ3MiLCAoUHlDRnVuY3Rpb24pREJfZ2V0X2VuY3J5cHRfZmxhZ3MsIE1FVEhfTk9BUkdTfSwKLSNlbmRpZgotCiAgICAgeyJzZXRfZmxhZ3MiLCAgICAgICAoUHlDRnVuY3Rpb24pREJfc2V0X2ZsYWdzLCAgICAgIE1FVEhfVkFSQVJHU30sCi0jaWYgKERCVkVSID49IDQyKQogICAgIHsiZ2V0X2ZsYWdzIiwgICAgICAgKFB5Q0Z1bmN0aW9uKURCX2dldF9mbGFncywgICAgICBNRVRIX05PQVJHU30sCi0jZW5kaWYKKyAgICB7ImdldF90cmFuc2FjdGlvbmFsIiwgKFB5Q0Z1bmN0aW9uKURCX2dldF90cmFuc2FjdGlvbmFsLCBNRVRIX05PQVJHU30sCiAgICAgeyJzZXRfaF9mZmFjdG9yIiwgICAoUHlDRnVuY3Rpb24pREJfc2V0X2hfZmZhY3RvciwgIE1FVEhfVkFSQVJHU30sCi0jaWYgKERCVkVSID49IDQyKQogICAgIHsiZ2V0X2hfZmZhY3RvciIsICAgKFB5Q0Z1bmN0aW9uKURCX2dldF9oX2ZmYWN0b3IsICBNRVRIX05PQVJHU30sCi0jZW5kaWYKICAgICB7InNldF9oX25lbGVtIiwgICAgIChQeUNGdW5jdGlvbilEQl9zZXRfaF9uZWxlbSwgICAgTUVUSF9WQVJBUkdTfSwKLSNpZiAoREJWRVIgPj0gNDIpCiAgICAgeyJnZXRfaF9uZWxlbSIsICAgICAoUHlDRnVuY3Rpb24pREJfZ2V0X2hfbmVsZW0sICAgIE1FVEhfTk9BUkdTfSwKLSNlbmRpZgogICAgIHsic2V0X2xvcmRlciIsICAgICAgKFB5Q0Z1bmN0aW9uKURCX3NldF9sb3JkZXIsICAgICBNRVRIX1ZBUkFSR1N9LAotI2lmIChEQlZFUiA+PSA0MikKICAgICB7ImdldF9sb3JkZXIiLCAgICAgIChQeUNGdW5jdGlvbilEQl9nZXRfbG9yZGVyLCAgICAgTUVUSF9OT0FSR1N9LAotI2VuZGlmCiAgICAgeyJzZXRfcGFnZXNpemUiLCAgICAoUHlDRnVuY3Rpb24pREJfc2V0X3BhZ2VzaXplLCAgIE1FVEhfVkFSQVJHU30sCi0jaWYgKERCVkVSID49IDQyKQogICAgIHsiZ2V0X3BhZ2VzaXplIiwgICAgKFB5Q0Z1bmN0aW9uKURCX2dldF9wYWdlc2l6ZSwgICBNRVRIX05PQVJHU30sCi0jZW5kaWYKICAgICB7InNldF9yZV9kZWxpbSIsICAgIChQeUNGdW5jdGlvbilEQl9zZXRfcmVfZGVsaW0sICAgTUVUSF9WQVJBUkdTfSwKLSNpZiAoREJWRVIgPj0gNDIpCiAgICAgeyJnZXRfcmVfZGVsaW0iLCAgICAoUHlDRnVuY3Rpb24pREJfZ2V0X3JlX2RlbGltLCAgIE1FVEhfTk9BUkdTfSwKLSNlbmRpZgogICAgIHsic2V0X3JlX2xlbiIsICAgICAgKFB5Q0Z1bmN0aW9uKURCX3NldF9yZV9sZW4sICAgICBNRVRIX1ZBUkFSR1N9LAotI2lmIChEQlZFUiA+PSA0MikKICAgICB7ImdldF9yZV9sZW4iLCAgICAgIChQeUNGdW5jdGlvbilEQl9nZXRfcmVfbGVuLCAgICAgTUVUSF9OT0FSR1N9LAotI2VuZGlmCiAgICAgeyJzZXRfcmVfcGFkIiwgICAgICAoUHlDRnVuY3Rpb24pREJfc2V0X3JlX3BhZCwgICAgIE1FVEhfVkFSQVJHU30sCi0jaWYgKERCVkVSID49IDQyKQogICAgIHsiZ2V0X3JlX3BhZCIsICAgICAgKFB5Q0Z1bmN0aW9uKURCX2dldF9yZV9wYWQsICAgICBNRVRIX05PQVJHU30sCi0jZW5kaWYKICAgICB7InNldF9yZV9zb3VyY2UiLCAgIChQeUNGdW5jdGlvbilEQl9zZXRfcmVfc291cmNlLCAgTUVUSF9WQVJBUkdTfSwKLSNpZiAoREJWRVIgPj0gNDIpCiAgICAgeyJnZXRfcmVfc291cmNlIiwgICAoUHlDRnVuY3Rpb24pREJfZ2V0X3JlX3NvdXJjZSwgIE1FVEhfTk9BUkdTfSwKLSNlbmRpZgogICAgIHsic2V0X3FfZXh0ZW50c2l6ZSIsKFB5Q0Z1bmN0aW9uKURCX3NldF9xX2V4dGVudHNpemUsIE1FVEhfVkFSQVJHU30sCi0jaWYgKERCVkVSID49IDQyKQogICAgIHsiZ2V0X3FfZXh0ZW50c2l6ZSIsKFB5Q0Z1bmN0aW9uKURCX2dldF9xX2V4dGVudHNpemUsIE1FVEhfTk9BUkdTfSwKLSNlbmRpZgogICAgIHsic2V0X3ByaXZhdGUiLCAgICAgKFB5Q0Z1bmN0aW9uKURCX3NldF9wcml2YXRlLCAgICBNRVRIX099LAogICAgIHsiZ2V0X3ByaXZhdGUiLCAgICAgKFB5Q0Z1bmN0aW9uKURCX2dldF9wcml2YXRlLCAgICBNRVRIX05PQVJHU30sCiAjaWYgKERCVkVSID49IDQ2KQogICAgIHsic2V0X3ByaW9yaXR5IiwgICAgKFB5Q0Z1bmN0aW9uKURCX3NldF9wcmlvcml0eSwgICBNRVRIX1ZBUkFSR1N9LAogICAgIHsiZ2V0X3ByaW9yaXR5IiwgICAgKFB5Q0Z1bmN0aW9uKURCX2dldF9wcmlvcml0eSwgICBNRVRIX05PQVJHU30sCiAjZW5kaWYKKyAgICB7ImdldF9kYm5hbWUiLCAgICAgIChQeUNGdW5jdGlvbilEQl9nZXRfZGJuYW1lLCAgICAgTUVUSF9OT0FSR1N9LAorICAgIHsiZ2V0X29wZW5fZmxhZ3MiLCAgKFB5Q0Z1bmN0aW9uKURCX2dldF9vcGVuX2ZsYWdzLCBNRVRIX05PQVJHU30sCiAgICAgeyJzdGF0IiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pREJfc3RhdCwgICAgICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTfSwKLSNpZiAoREJWRVIgPj0gNDMpCiAgICAgeyJzdGF0X3ByaW50IiwgICAgICAoUHlDRnVuY3Rpb24pREJfc3RhdF9wcmludCwKICAgICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFN9LAotI2VuZGlmCiAgICAgeyJzeW5jIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pREJfc3luYywgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCiAgICAgeyJ0cnVuY2F0ZSIsICAgICAgICAoUHlDRnVuY3Rpb24pREJfdHJ1bmNhdGUsICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTfSwKICAgICB7InR5cGUiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilEQl9nZXRfdHlwZSwgICAgICAgTUVUSF9OT0FSR1N9LApAQCAtODYyNyw2ICs4ODU0LDE5IEBACiAgICAge05VTEwsICAgICAgTlVMTH0gICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKKyNpZiAoREJWRVIgPj0gNTIpCitzdGF0aWMgUHlNZXRob2REZWYgREJTaXRlX21ldGhvZHNbXSA9IHsKKyAgICB7ImdldF9jb25maWciLCAgKFB5Q0Z1bmN0aW9uKURCU2l0ZV9nZXRfY29uZmlnLAorICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTfSwKKyAgICB7InNldF9jb25maWciLCAgKFB5Q0Z1bmN0aW9uKURCU2l0ZV9zZXRfY29uZmlnLAorICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTfSwKKyAgICB7InJlbW92ZSIsICAgICAgKFB5Q0Z1bmN0aW9uKURCU2l0ZV9yZW1vdmUsICAgICBNRVRIX05PQVJHU30sCisgICAgeyJnZXRfZWlkIiwgICAgIChQeUNGdW5jdGlvbilEQlNpdGVfZ2V0X2VpZCwgICAgTUVUSF9OT0FSR1N9LAorICAgIHsiZ2V0X2FkZHJlc3MiLCAoUHlDRnVuY3Rpb24pREJTaXRlX2dldF9hZGRyZXNzLCAgICBNRVRIX05PQVJHU30sCisgICAgeyJjbG9zZSIsICAgICAgIChQeUNGdW5jdGlvbilEQlNpdGVfY2xvc2UsICAgICAgTUVUSF9OT0FSR1N9LAorICAgIHtOVUxMLCAgICAgIE5VTEx9ICAgICAgIC8qIHNlbnRpbmVsICovCit9OworI2VuZGlmCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBEQkVudl9tZXRob2RzW10gPSB7CiAgICAgeyJjbG9zZSIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pREJFbnZfY2xvc2UsICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKQEAgLTg2MzksMzIgKzg4NzksMjQgQEAKICAgICB7ImdldF90aHJlYWRfY291bnQiLCAoUHlDRnVuY3Rpb24pREJFbnZfZ2V0X3RocmVhZF9jb3VudCwgTUVUSF9OT0FSR1N9LAogI2VuZGlmCiAgICAgeyJzZXRfZW5jcnlwdCIsICAgICAoUHlDRnVuY3Rpb24pREJFbnZfc2V0X2VuY3J5cHQsICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFN9LAotI2lmIChEQlZFUiA+PSA0MikKICAgICB7ImdldF9lbmNyeXB0X2ZsYWdzIiwgKFB5Q0Z1bmN0aW9uKURCRW52X2dldF9lbmNyeXB0X2ZsYWdzLCBNRVRIX05PQVJHU30sCiAgICAgeyJnZXRfdGltZW91dCIsICAgICAoUHlDRnVuY3Rpb24pREJFbnZfZ2V0X3RpbWVvdXQsCiAgICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTfSwKLSNlbmRpZgogICAgIHsic2V0X3RpbWVvdXQiLCAgICAgKFB5Q0Z1bmN0aW9uKURCRW52X3NldF90aW1lb3V0LCAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFN9LAogICAgIHsic2V0X3NobV9rZXkiLCAgICAgKFB5Q0Z1bmN0aW9uKURCRW52X3NldF9zaG1fa2V5LCAgICAgTUVUSF9WQVJBUkdTfSwKLSNpZiAoREJWRVIgPj0gNDIpCiAgICAgeyJnZXRfc2htX2tleSIsICAgICAoUHlDRnVuY3Rpb24pREJFbnZfZ2V0X3NobV9rZXksICAgICBNRVRIX05PQVJHU30sCi0jZW5kaWYKICNpZiAoREJWRVIgPj0gNDYpCiAgICAgeyJzZXRfY2FjaGVfbWF4IiwgICAoUHlDRnVuY3Rpb24pREJFbnZfc2V0X2NhY2hlX21heCwgICBNRVRIX1ZBUkFSR1N9LAogICAgIHsiZ2V0X2NhY2hlX21heCIsICAgKFB5Q0Z1bmN0aW9uKURCRW52X2dldF9jYWNoZV9tYXgsICAgTUVUSF9OT0FSR1N9LAogI2VuZGlmCiAgICAgeyJzZXRfY2FjaGVzaXplIiwgICAoUHlDRnVuY3Rpb24pREJFbnZfc2V0X2NhY2hlc2l6ZSwgICBNRVRIX1ZBUkFSR1N9LAotI2lmIChEQlZFUiA+PSA0MikKICAgICB7ImdldF9jYWNoZXNpemUiLCAgIChQeUNGdW5jdGlvbilEQkVudl9nZXRfY2FjaGVzaXplLCAgIE1FVEhfTk9BUkdTfSwKLSNlbmRpZgogICAgIHsibWVtcF90cmlja2xlIiwgICAgKFB5Q0Z1bmN0aW9uKURCRW52X21lbXBfdHJpY2tsZSwgICAgTUVUSF9WQVJBUkdTfSwKICAgICB7Im1lbXBfc3luYyIsICAgICAgIChQeUNGdW5jdGlvbilEQkVudl9tZW1wX3N5bmMsICAgICAgIE1FVEhfVkFSQVJHU30sCiAgICAgeyJtZW1wX3N0YXQiLCAgICAgICAoUHlDRnVuY3Rpb24pREJFbnZfbWVtcF9zdGF0LAogICAgICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEU30sCi0jaWYgKERCVkVSID49IDQzKQogICAgIHsibWVtcF9zdGF0X3ByaW50IiwgKFB5Q0Z1bmN0aW9uKURCRW52X21lbXBfc3RhdF9wcmludCwKICAgICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFN9LAotI2VuZGlmCiAjaWYgKERCVkVSID49IDQ0KQogICAgIHsibXV0ZXhfc2V0X21heCIsICAgKFB5Q0Z1bmN0aW9uKURCRW52X211dGV4X3NldF9tYXgsICAgTUVUSF9WQVJBUkdTfSwKICAgICB7Im11dGV4X2dldF9tYXgiLCAgIChQeUNGdW5jdGlvbilEQkVudl9tdXRleF9nZXRfbWF4LCAgIE1FVEhfTk9BUkdTfSwKQEAgLTg2ODUsMzMgKzg5MTcsMjEgQEAKICNlbmRpZgogI2VuZGlmCiAgICAgeyJzZXRfZGF0YV9kaXIiLCAgICAoUHlDRnVuY3Rpb24pREJFbnZfc2V0X2RhdGFfZGlyLCAgICBNRVRIX1ZBUkFSR1N9LAotI2lmIChEQlZFUiA+PSA0MikKICAgICB7ImdldF9kYXRhX2RpcnMiLCAgIChQeUNGdW5jdGlvbilEQkVudl9nZXRfZGF0YV9kaXJzLCAgIE1FVEhfTk9BUkdTfSwKLSNlbmRpZgotI2lmIChEQlZFUiA+PSA0MikKICAgICB7ImdldF9mbGFncyIsICAgICAgIChQeUNGdW5jdGlvbilEQkVudl9nZXRfZmxhZ3MsICAgICAgIE1FVEhfTk9BUkdTfSwKLSNlbmRpZgogICAgIHsic2V0X2ZsYWdzIiwgICAgICAgKFB5Q0Z1bmN0aW9uKURCRW52X3NldF9mbGFncywgICAgICAgTUVUSF9WQVJBUkdTfSwKICNpZiAoREJWRVIgPj0gNDcpCiAgICAgeyJsb2dfc2V0X2NvbmZpZyIsICAoUHlDRnVuY3Rpb24pREJFbnZfbG9nX3NldF9jb25maWcsICBNRVRIX1ZBUkFSR1N9LAogICAgIHsibG9nX2dldF9jb25maWciLCAgKFB5Q0Z1bmN0aW9uKURCRW52X2xvZ19nZXRfY29uZmlnLCAgTUVUSF9WQVJBUkdTfSwKICNlbmRpZgogICAgIHsic2V0X2xnX2JzaXplIiwgICAgKFB5Q0Z1bmN0aW9uKURCRW52X3NldF9sZ19ic2l6ZSwgICAgTUVUSF9WQVJBUkdTfSwKLSNpZiAoREJWRVIgPj0gNDIpCiAgICAgeyJnZXRfbGdfYnNpemUiLCAgICAoUHlDRnVuY3Rpb24pREJFbnZfZ2V0X2xnX2JzaXplLCAgICBNRVRIX05PQVJHU30sCi0jZW5kaWYKICAgICB7InNldF9sZ19kaXIiLCAgICAgIChQeUNGdW5jdGlvbilEQkVudl9zZXRfbGdfZGlyLCAgICAgIE1FVEhfVkFSQVJHU30sCi0jaWYgKERCVkVSID49IDQyKQogICAgIHsiZ2V0X2xnX2RpciIsICAgICAgKFB5Q0Z1bmN0aW9uKURCRW52X2dldF9sZ19kaXIsICAgICAgTUVUSF9OT0FSR1N9LAotI2VuZGlmCiAgICAgeyJzZXRfbGdfbWF4IiwgICAgICAoUHlDRnVuY3Rpb24pREJFbnZfc2V0X2xnX21heCwgICAgICBNRVRIX1ZBUkFSR1N9LAotI2lmIChEQlZFUiA+PSA0MikKICAgICB7ImdldF9sZ19tYXgiLCAgICAgIChQeUNGdW5jdGlvbilEQkVudl9nZXRfbGdfbWF4LCAgICAgIE1FVEhfTk9BUkdTfSwKLSNlbmRpZgogICAgIHsic2V0X2xnX3JlZ2lvbm1heCIsKFB5Q0Z1bmN0aW9uKURCRW52X3NldF9sZ19yZWdpb25tYXgsIE1FVEhfVkFSQVJHU30sCi0jaWYgKERCVkVSID49IDQyKQogICAgIHsiZ2V0X2xnX3JlZ2lvbm1heCIsKFB5Q0Z1bmN0aW9uKURCRW52X2dldF9sZ19yZWdpb25tYXgsIE1FVEhfTk9BUkdTfSwKLSNlbmRpZgogI2lmIChEQlZFUiA+PSA0NCkKICAgICB7InNldF9sZ19maWxlbW9kZSIsIChQeUNGdW5jdGlvbilEQkVudl9zZXRfbGdfZmlsZW1vZGUsIE1FVEhfVkFSQVJHU30sCiAgICAgeyJnZXRfbGdfZmlsZW1vZGUiLCAoUHlDRnVuY3Rpb24pREJFbnZfZ2V0X2xnX2ZpbGVtb2RlLCBNRVRIX05PQVJHU30sCkBAIC04NzIxLDQ3ICs4OTQxLDI5IEBACiAgICAgeyJnZXRfbGtfcGFydGl0aW9ucyIsIChQeUNGdW5jdGlvbilEQkVudl9nZXRfbGtfcGFydGl0aW9ucywgTUVUSF9OT0FSR1N9LAogI2VuZGlmCiAgICAgeyJzZXRfbGtfZGV0ZWN0IiwgICAoUHlDRnVuY3Rpb24pREJFbnZfc2V0X2xrX2RldGVjdCwgICBNRVRIX1ZBUkFSR1N9LAotI2lmIChEQlZFUiA+PSA0MikKICAgICB7ImdldF9sa19kZXRlY3QiLCAgIChQeUNGdW5jdGlvbilEQkVudl9nZXRfbGtfZGV0ZWN0LCAgIE1FVEhfTk9BUkdTfSwKLSNlbmRpZgogI2lmIChEQlZFUiA8IDQ1KQogICAgIHsic2V0X2xrX21heCIsICAgICAgKFB5Q0Z1bmN0aW9uKURCRW52X3NldF9sa19tYXgsICAgICAgTUVUSF9WQVJBUkdTfSwKICNlbmRpZgogICAgIHsic2V0X2xrX21heF9sb2NrcyIsIChQeUNGdW5jdGlvbilEQkVudl9zZXRfbGtfbWF4X2xvY2tzLCBNRVRIX1ZBUkFSR1N9LAotI2lmIChEQlZFUiA+PSA0MikKICAgICB7ImdldF9sa19tYXhfbG9ja3MiLCAoUHlDRnVuY3Rpb24pREJFbnZfZ2V0X2xrX21heF9sb2NrcywgTUVUSF9OT0FSR1N9LAotI2VuZGlmCiAgICAgeyJzZXRfbGtfbWF4X2xvY2tlcnMiLCAoUHlDRnVuY3Rpb24pREJFbnZfc2V0X2xrX21heF9sb2NrZXJzLCBNRVRIX1ZBUkFSR1N9LAotI2lmIChEQlZFUiA+PSA0MikKICAgICB7ImdldF9sa19tYXhfbG9ja2VycyIsIChQeUNGdW5jdGlvbilEQkVudl9nZXRfbGtfbWF4X2xvY2tlcnMsIE1FVEhfTk9BUkdTfSwKLSNlbmRpZgogICAgIHsic2V0X2xrX21heF9vYmplY3RzIiwgKFB5Q0Z1bmN0aW9uKURCRW52X3NldF9sa19tYXhfb2JqZWN0cywgTUVUSF9WQVJBUkdTfSwKLSNpZiAoREJWRVIgPj0gNDIpCiAgICAgeyJnZXRfbGtfbWF4X29iamVjdHMiLCAoUHlDRnVuY3Rpb24pREJFbnZfZ2V0X2xrX21heF9vYmplY3RzLCBNRVRIX05PQVJHU30sCi0jZW5kaWYKLSNpZiAoREJWRVIgPj0gNDMpCiAgICAgeyJzdGF0X3ByaW50IiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKURCRW52X3N0YXRfcHJpbnQsCiAgICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTfSwKLSNlbmRpZgogICAgIHsic2V0X21wX21tYXBzaXplIiwgKFB5Q0Z1bmN0aW9uKURCRW52X3NldF9tcF9tbWFwc2l6ZSwgTUVUSF9WQVJBUkdTfSwKLSNpZiAoREJWRVIgPj0gNDIpCiAgICAgeyJnZXRfbXBfbW1hcHNpemUiLCAoUHlDRnVuY3Rpb24pREJFbnZfZ2V0X21wX21tYXBzaXplLCBNRVRIX05PQVJHU30sCi0jZW5kaWYKICAgICB7InNldF90bXBfZGlyIiwgICAgIChQeUNGdW5jdGlvbilEQkVudl9zZXRfdG1wX2RpciwgICAgIE1FVEhfVkFSQVJHU30sCi0jaWYgKERCVkVSID49IDQyKQogICAgIHsiZ2V0X3RtcF9kaXIiLCAgICAgKFB5Q0Z1bmN0aW9uKURCRW52X2dldF90bXBfZGlyLCAgICAgTUVUSF9OT0FSR1N9LAotI2VuZGlmCiAgICAgeyJ0eG5fYmVnaW4iLCAgICAgICAoUHlDRnVuY3Rpb24pREJFbnZfdHhuX2JlZ2luLCAgICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEU30sCiAgICAgeyJ0eG5fY2hlY2twb2ludCIsICAoUHlDRnVuY3Rpb24pREJFbnZfdHhuX2NoZWNrcG9pbnQsICBNRVRIX1ZBUkFSR1N9LAogICAgIHsidHhuX3N0YXQiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKURCRW52X3R4bl9zdGF0LCAgICAgICAgTUVUSF9WQVJBUkdTfSwKLSNpZiAoREJWRVIgPj0gNDMpCiAgICAgeyJ0eG5fc3RhdF9wcmludCIsICAoUHlDRnVuY3Rpb24pREJFbnZfdHhuX3N0YXRfcHJpbnQsCiAgICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTfSwKLSNlbmRpZgotI2lmIChEQlZFUiA+PSA0MikKICAgICB7ImdldF90eF9tYXgiLCAgICAgIChQeUNGdW5jdGlvbilEQkVudl9nZXRfdHhfbWF4LCAgICAgIE1FVEhfTk9BUkdTfSwKICAgICB7ImdldF90eF90aW1lc3RhbXAiLCAoUHlDRnVuY3Rpb24pREJFbnZfZ2V0X3R4X3RpbWVzdGFtcCwgTUVUSF9OT0FSR1N9LAotI2VuZGlmCiAgICAgeyJzZXRfdHhfbWF4IiwgICAgICAoUHlDRnVuY3Rpb24pREJFbnZfc2V0X3R4X21heCwgICAgICBNRVRIX1ZBUkFSR1N9LAogICAgIHsic2V0X3R4X3RpbWVzdGFtcCIsIChQeUNGdW5jdGlvbilEQkVudl9zZXRfdHhfdGltZXN0YW1wLCBNRVRIX1ZBUkFSR1N9LAogICAgIHsibG9ja19kZXRlY3QiLCAgICAgKFB5Q0Z1bmN0aW9uKURCRW52X2xvY2tfZGV0ZWN0LCAgICAgTUVUSF9WQVJBUkdTfSwKQEAgLTg3NzAsMTAgKzg5NzIsOCBAQAogICAgIHsibG9ja19pZF9mcmVlIiwgICAgKFB5Q0Z1bmN0aW9uKURCRW52X2xvY2tfaWRfZnJlZSwgICAgTUVUSF9WQVJBUkdTfSwKICAgICB7ImxvY2tfcHV0IiwgICAgICAgIChQeUNGdW5jdGlvbilEQkVudl9sb2NrX3B1dCwgICAgICAgIE1FVEhfVkFSQVJHU30sCiAgICAgeyJsb2NrX3N0YXQiLCAgICAgICAoUHlDRnVuY3Rpb24pREJFbnZfbG9ja19zdGF0LCAgICAgICBNRVRIX1ZBUkFSR1N9LAotI2lmIChEQlZFUiA+PSA0MykKICAgICB7ImxvY2tfc3RhdF9wcmludCIsIChQeUNGdW5jdGlvbilEQkVudl9sb2NrX3N0YXRfcHJpbnQsCiAgICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTfSwKLSNlbmRpZgogICAgIHsibG9nX2N1cnNvciIsICAgICAgKFB5Q0Z1bmN0aW9uKURCRW52X2xvZ19jdXJzb3IsICAgICAgTUVUSF9OT0FSR1N9LAogICAgIHsibG9nX2ZpbGUiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKURCRW52X2xvZ19maWxlLCAgICAgICAgTUVUSF9WQVJBUkdTfSwKICNpZiAoREJWRVIgPj0gNDQpCkBAIC04NzgzLDEwICs4OTgzLDggQEAKICAgICB7ImxvZ19hcmNoaXZlIiwgICAgIChQeUNGdW5jdGlvbilEQkVudl9sb2dfYXJjaGl2ZSwgICAgIE1FVEhfVkFSQVJHU30sCiAgICAgeyJsb2dfZmx1c2giLCAgICAgICAoUHlDRnVuY3Rpb24pREJFbnZfbG9nX2ZsdXNoLCAgICAgICBNRVRIX05PQVJHU30sCiAgICAgeyJsb2dfc3RhdCIsICAgICAgICAoUHlDRnVuY3Rpb24pREJFbnZfbG9nX3N0YXQsICAgICAgICBNRVRIX1ZBUkFSR1N9LAotI2lmIChEQlZFUiA+PSA0MykKICAgICB7ImxvZ19zdGF0X3ByaW50IiwgIChQeUNGdW5jdGlvbilEQkVudl9sb2dfc3RhdF9wcmludCwKICAgICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFN9LAotI2VuZGlmCiAjaWYgKERCVkVSID49IDQ0KQogICAgIHsiZmlsZWlkX3Jlc2V0IiwgICAgKFB5Q0Z1bmN0aW9uKURCRW52X2ZpbGVpZF9yZXNldCwgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFN9LAogICAgIHsibHNuX3Jlc2V0IiwgICAgICAgKFB5Q0Z1bmN0aW9uKURCRW52X2xzbl9yZXNldCwgICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFN9LApAQCAtODc5NywxOCArODk5NSwyNSBAQAogICAgIHsic2V0X3JwY19zZXJ2ZXIiLCAgKFB5Q0Z1bmN0aW9uKURCRW52X3NldF9ycGNfc2VydmVyLAogICAgICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEU30sCiAjZW5kaWYKLSNpZiAoREJWRVIgPj0gNDMpCiAgICAgeyJzZXRfbXBfbWF4X29wZW5mZCIsIChQeUNGdW5jdGlvbilEQkVudl9zZXRfbXBfbWF4X29wZW5mZCwgTUVUSF9WQVJBUkdTfSwKICAgICB7ImdldF9tcF9tYXhfb3BlbmZkIiwgKFB5Q0Z1bmN0aW9uKURCRW52X2dldF9tcF9tYXhfb3BlbmZkLCBNRVRIX05PQVJHU30sCiAgICAgeyJzZXRfbXBfbWF4X3dyaXRlIiwgKFB5Q0Z1bmN0aW9uKURCRW52X3NldF9tcF9tYXhfd3JpdGUsIE1FVEhfVkFSQVJHU30sCiAgICAgeyJnZXRfbXBfbWF4X3dyaXRlIiwgKFB5Q0Z1bmN0aW9uKURCRW52X2dldF9tcF9tYXhfd3JpdGUsIE1FVEhfTk9BUkdTfSwKLSNlbmRpZgogICAgIHsic2V0X3ZlcmJvc2UiLCAgICAgKFB5Q0Z1bmN0aW9uKURCRW52X3NldF92ZXJib3NlLCAgICAgTUVUSF9WQVJBUkdTfSwKLSNpZiAoREJWRVIgPj0gNDIpCi0gICAgeyJnZXRfdmVyYm9zZSIsICAgICAoUHlDRnVuY3Rpb24pREJFbnZfZ2V0X3ZlcmJvc2UsICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRfdmVyYm9zZSIsICAgICAoUHlDRnVuY3Rpb24pREJFbnZfZ2V0X3ZlcmJvc2UsICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsic2V0X3ByaXZhdGUiLCAgICAgKFB5Q0Z1bmN0aW9uKURCRW52X3NldF9wcml2YXRlLCAgICAgTUVUSF9PfSwKKyAgICB7ImdldF9wcml2YXRlIiwgICAgIChQeUNGdW5jdGlvbilEQkVudl9nZXRfcHJpdmF0ZSwgICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7ImdldF9vcGVuX2ZsYWdzIiwgIChQeUNGdW5jdGlvbilEQkVudl9nZXRfb3Blbl9mbGFncywgIE1FVEhfTk9BUkdTfSwKKyNpZiAoREJWRVIgPj0gNDcpCisgICAgeyJzZXRfaW50ZXJtZWRpYXRlX2Rpcl9tb2RlIiwgKFB5Q0Z1bmN0aW9uKURCRW52X3NldF9pbnRlcm1lZGlhdGVfZGlyX21vZGUsCisgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRfaW50ZXJtZWRpYXRlX2Rpcl9tb2RlIiwgKFB5Q0Z1bmN0aW9uKURCRW52X2dldF9pbnRlcm1lZGlhdGVfZGlyX21vZGUsCisgICAgICAgIE1FVEhfTk9BUkdTfSwKICNlbmRpZgotICAgIHsic2V0X3ByaXZhdGUiLCAgICAgKFB5Q0Z1bmN0aW9uKURCRW52X3NldF9wcml2YXRlLCAgICAgICBNRVRIX099LAotICAgIHsiZ2V0X3ByaXZhdGUiLCAgICAgKFB5Q0Z1bmN0aW9uKURCRW52X2dldF9wcml2YXRlLCAgICAgICBNRVRIX05PQVJHU30sCisjaWYgKERCVkVSIDwgNDcpCisgICAgeyJzZXRfaW50ZXJtZWRpYXRlX2RpciIsIChQeUNGdW5jdGlvbilEQkVudl9zZXRfaW50ZXJtZWRpYXRlX2RpciwKKyAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyNlbmRpZgogICAgIHsicmVwX3N0YXJ0IiwgICAgICAgKFB5Q0Z1bmN0aW9uKURCRW52X3JlcF9zdGFydCwKICAgICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFN9LAogICAgIHsicmVwX3NldF90cmFuc3BvcnQiLCAoUHlDRnVuY3Rpb24pREJFbnZfcmVwX3NldF90cmFuc3BvcnQsIE1FVEhfVkFSQVJHU30sCkBAIC04ODQ3LDE4ICs5MDUyLDE4IEBACiAjZW5kaWYKICAgICB7InJlcF9zdGF0IiwgKFB5Q0Z1bmN0aW9uKURCRW52X3JlcF9zdGF0LAogICAgICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEU30sCi0jaWYgKERCVkVSID49IDQzKQogICAgIHsicmVwX3N0YXRfcHJpbnQiLCAoUHlDRnVuY3Rpb24pREJFbnZfcmVwX3N0YXRfcHJpbnQsCiAgICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTfSwKLSNlbmRpZgogCiAjaWYgKERCVkVSID49IDQ1KQogICAgIHsicmVwbWdyX3N0YXJ0IiwgKFB5Q0Z1bmN0aW9uKURCRW52X3JlcG1ncl9zdGFydCwKICAgICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFN9LAorI2lmIChEQlZFUiA8IDUyKQogICAgIHsicmVwbWdyX3NldF9sb2NhbF9zaXRlIiwgKFB5Q0Z1bmN0aW9uKURCRW52X3JlcG1ncl9zZXRfbG9jYWxfc2l0ZSwKICAgICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFN9LAogICAgIHsicmVwbWdyX2FkZF9yZW1vdGVfc2l0ZSIsIChQeUNGdW5jdGlvbilEQkVudl9yZXBtZ3JfYWRkX3JlbW90ZV9zaXRlLAogICAgICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEU30sCisjZW5kaWYKICAgICB7InJlcG1ncl9zZXRfYWNrX3BvbGljeSIsIChQeUNGdW5jdGlvbilEQkVudl9yZXBtZ3Jfc2V0X2Fja19wb2xpY3ksCiAgICAgICAgIE1FVEhfVkFSQVJHU30sCiAgICAgeyJyZXBtZ3JfZ2V0X2Fja19wb2xpY3kiLCAoUHlDRnVuY3Rpb24pREJFbnZfcmVwbWdyX2dldF9hY2tfcG9saWN5LApAQCAtODg3Miw2ICs5MDc3LDEyIEBACiAgICAgeyJyZXBtZ3Jfc3RhdF9wcmludCIsIChQeUNGdW5jdGlvbilEQkVudl9yZXBtZ3Jfc3RhdF9wcmludCwKICAgICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFN9LAogI2VuZGlmCisjaWYgKERCVkVSID49IDUyKQorICAgIHsicmVwbWdyX3NpdGUiLCAoUHlDRnVuY3Rpb24pREJFbnZfcmVwbWdyX3NpdGUsCisgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFN9LAorICAgIHsicmVwbWdyX3NpdGVfYnlfZWlkIiwgIChQeUNGdW5jdGlvbilEQkVudl9yZXBtZ3Jfc2l0ZV9ieV9laWQsCisgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFN9LAorI2VuZGlmCiAgICAge05VTEwsICAgICAgTlVMTH0gICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKQEAgLTg4OTIsNyArOTEwMyw2IEBACiB9OwogCiAKLSNpZiAoREJWRVIgPj0gNDMpCiBzdGF0aWMgUHlNZXRob2REZWYgREJTZXF1ZW5jZV9tZXRob2RzW10gPSB7CiAgICAgeyJjbG9zZSIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pREJTZXF1ZW5jZV9jbG9zZSwgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKICAgICB7ImdldCIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilEQlNlcXVlbmNlX2dldCwgICAgICAgICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEU30sCkBAIC04OTEyLDcgKzkxMjIsNiBAQAogICAgICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEU30sCiAgICAge05VTEwsICAgICAgTlVMTH0gICAgICAgLyogc2VudGluZWwgKi8KIH07Ci0jZW5kaWYKIAogCiBzdGF0aWMgUHlPYmplY3QqCkBAIC04OTIyLDEzICs5MTMxLDkgQEAKIAogICAgIENIRUNLX0VOVl9OT1RfQ0xPU0VEKHNlbGYpOwogCi0jaWYgKERCVkVSID49IDQyKQogICAgIE1ZREJfQkVHSU5fQUxMT1dfVEhSRUFEUzsKICAgICBzZWxmLT5kYl9lbnYtPmdldF9ob21lKHNlbGYtPmRiX2VudiwgJmhvbWUpOwogICAgIE1ZREJfRU5EX0FMTE9XX1RIUkVBRFM7Ci0jZWxzZQotICAgIGhvbWU9c2VsZi0+ZGJfZW52LT5kYl9ob21lOwotI2VuZGlmCiAKICAgICBpZiAoaG9tZSA9PSBOVUxMKSB7CiAgICAgICAgIFJFVFVSTl9OT05FKCk7CkBAIC05MDcwLDYgKzkyNzUsNDkgQEAKICAgICAwLCAgICAgICAgICAvKnRwX21lbWJlcnMqLwogfTsKIAorI2lmIChEQlZFUiA+PSA1MikKK3N0YXRpY2hlcmUgUHlUeXBlT2JqZWN0IERCU2l0ZV9UeXBlID0geworI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDMwMDAwMDApCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworI2Vsc2UKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyNlbmRpZgorICAgICJEQlNpdGUiLCAgICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKERCU2l0ZU9iamVjdCksICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKURCU2l0ZV9kZWFsbG9jLC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAvKnRwX2hhc2gqLworICAgIDAsICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAzMDAwMDAwKQorICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUywgICAgICAvKiB0cF9mbGFncyAqLworI2Vsc2UKKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgLyogdHBfZmxhZ3MgKi8KKyNlbmRpZgorICAgIDAsICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIG9mZnNldG9mKERCU2l0ZU9iamVjdCwgaW5fd2Vha3JlZmxpc3QpLCAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgLyp0cF9pdGVyKi8KKyAgICAwLCAgICAgICAgICAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBEQlNpdGVfbWV0aG9kcywgLyp0cF9tZXRob2RzKi8KKyAgICAwLCAgICAgICAgICAvKnRwX21lbWJlcnMqLworfTsKKyNlbmRpZgogCiBzdGF0aWNoZXJlIFB5VHlwZU9iamVjdCBEQkVudl9UeXBlID0gewogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDMwMDAwMDApCkBAIC05MTk1LDcgKzk0NDMsNiBAQAogICAgIG9mZnNldG9mKERCTG9ja09iamVjdCwgaW5fd2Vha3JlZmxpc3QpLCAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiB9OwogCi0jaWYgKERCVkVSID49IDQzKQogc3RhdGljaGVyZSBQeVR5cGVPYmplY3QgREJTZXF1ZW5jZV9UeXBlID0gewogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDMwMDAwMDApCiAgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCkBAIC05MjM3LDcgKzk0ODQsNiBAQAogICAgIERCU2VxdWVuY2VfbWV0aG9kcywgLyp0cF9tZXRob2RzKi8KICAgICAwLCAgICAgICAgICAvKnRwX21lbWJlcnMqLwogfTsKLSNlbmRpZgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIE1vZHVsZS1sZXZlbCBmdW5jdGlvbnMgKi8KQEAgLTkyNzEsNyArOTUxNyw2IEBACiAgICAgcmV0dXJuIChQeU9iamVjdCogKW5ld0RCRW52T2JqZWN0KGZsYWdzKTsKIH0KIAotI2lmIChEQlZFUiA+PSA0MykKIHN0YXRpYyBQeU9iamVjdCoKIERCU2VxdWVuY2VfY29uc3RydWN0KFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKIHsKQEAgLTkyODcsNyArOTUzMiw2IEBACiAgICAgfQogICAgIHJldHVybiAoUHlPYmplY3QqICluZXdEQlNlcXVlbmNlT2JqZWN0KChEQk9iamVjdCopZGJvYmosIGZsYWdzKTsKIH0KLSNlbmRpZgogCiBzdGF0aWMgY2hhciBic2RkYl92ZXJzaW9uX2RvY1tdID0KICJSZXR1cm5zIGEgdHVwbGUgb2YgbWFqb3IsIG1pbm9yLCBhbmQgcGF0Y2ggcmVsZWFzZSBudW1iZXJzIG9mIHRoZVxuXApAQCAtOTI5OCwxOSArOTU0MiwzNSBAQAogewogICAgIGludCBtYWpvciwgbWlub3IsIHBhdGNoOwogCisgICAgLyogVGhpcyBzaG91bGQgYmUgaW5zdGFudGFuZW91cywgbm8gbmVlZCB0byByZWxlYXNlIHRoZSBHSUwgKi8KICAgICBkYl92ZXJzaW9uKCZtYWpvciwgJm1pbm9yLCAmcGF0Y2gpOwogICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoaWlpKSIsIG1ham9yLCBtaW5vciwgcGF0Y2gpOwogfQogCisjaWYgKERCVkVSID49IDUwKQorc3RhdGljIFB5T2JqZWN0KgorYnNkZGJfdmVyc2lvbl9mdWxsKFB5T2JqZWN0KiBzZWxmKQoreworICAgIGNoYXIgKnZlcnNpb25fc3RyaW5nOworICAgIGludCBmYW1pbHksIHJlbGVhc2UsIG1ham9yLCBtaW5vciwgcGF0Y2g7CisKKyAgICAvKiBUaGlzIHNob3VsZCBiZSBpbnN0YW50YW5lb3VzLCBubyBuZWVkIHRvIHJlbGVhc2UgdGhlIEdJTCAqLworICAgIHZlcnNpb25fc3RyaW5nID0gZGJfZnVsbF92ZXJzaW9uKCZmYW1pbHksICZyZWxlYXNlLCAmbWFqb3IsICZtaW5vciwgJnBhdGNoKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKHNpaWlpaSkiLAorICAgICAgICAgICAgdmVyc2lvbl9zdHJpbmcsIGZhbWlseSwgcmVsZWFzZSwgbWFqb3IsIG1pbm9yLCBwYXRjaCk7Cit9CisjZW5kaWYKKwogCiAvKiBMaXN0IG9mIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoZSBtb2R1bGUgKi8KIHN0YXRpYyBQeU1ldGhvZERlZiBic2RkYl9tZXRob2RzW10gPSB7CiAgICAgeyJEQiIsICAgICAgICAgIChQeUNGdW5jdGlvbilEQl9jb25zdHJ1Y3QsICAgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMgfSwKICAgICB7IkRCRW52IiwgICAgICAgKFB5Q0Z1bmN0aW9uKURCRW52X2NvbnN0cnVjdCwgICAgICAgTUVUSF9WQVJBUkdTfSwKLSNpZiAoREJWRVIgPj0gNDMpCiAgICAgeyJEQlNlcXVlbmNlIiwgIChQeUNGdW5jdGlvbilEQlNlcXVlbmNlX2NvbnN0cnVjdCwgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMgfSwKLSNlbmRpZgogICAgIHsidmVyc2lvbiIsICAgICAoUHlDRnVuY3Rpb24pYnNkZGJfdmVyc2lvbiwgICAgICAgICBNRVRIX05PQVJHUywgYnNkZGJfdmVyc2lvbl9kb2N9LAorI2lmIChEQlZFUiA+PSA1MCkKKyAgICB7ImZ1bGxfdmVyc2lvbiIsIChQeUNGdW5jdGlvbilic2RkYl92ZXJzaW9uX2Z1bGwsIE1FVEhfTk9BUkdTfSwKKyNlbmRpZgogICAgIHtOVUxMLCAgICAgIE5VTEx9ICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCkBAIC05MzI4LDYgKzk1ODgsMTEgQEAKICAqLwogI2RlZmluZSBBRERfSU5UKGRpY3QsIE5BTUUpICAgICAgICAgX2FkZEludFRvRGljdChkaWN0LCAjTkFNRSwgTkFNRSkKIAorLyoKKyoqIFdlIGNhbiByZW5hbWUgdGhlIG1vZHVsZSBhdCBpbXBvcnQgdGltZSwgc28gdGhlIHN0cmluZyBhbGxvY2F0ZWQKKyoqIG11c3QgYmUgYmlnIGVub3VnaCwgYW5kIGFueSB1c2Ugb2YgdGhlIG5hbWUgbXVzdCB1c2UgdGhpcyBwYXJ0aWN1bGFyCisqKiBzdHJpbmcuCisqLwogI2RlZmluZSBNT0RVTEVfTkFNRV9NQVhfTEVOICAgICAxMQogc3RhdGljIGNoYXIgX2JzZGRiTW9kdWxlTmFtZVtNT0RVTEVfTkFNRV9NQVhfTEVOKzFdID0gIl9ic2RkYiI7CiAKQEAgLTkzNzgsOCArOTY0Myw5IEBACiAgICAgICAgIHx8IChQeVR5cGVfUmVhZHkoJkRCRW52X1R5cGUpIDwgMCkKICAgICAgICAgfHwgKFB5VHlwZV9SZWFkeSgmREJUeG5fVHlwZSkgPCAwKQogICAgICAgICB8fCAoUHlUeXBlX1JlYWR5KCZEQkxvY2tfVHlwZSkgPCAwKQotI2lmIChEQlZFUiA+PSA0MykKICAgICAgICAgfHwgKFB5VHlwZV9SZWFkeSgmREJTZXF1ZW5jZV9UeXBlKSA8IDApCisjaWYgKERCVkVSID49IDUyKQorICAgICAgICB8fCAoUHlUeXBlX1JlYWR5KCZEQlNpdGVfVHlwZSkgPCAwKQogI2VuZGlmCiAgICAgICAgICkgewogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDMwMDAwMDApCkBAIC05Mzg5LDExICs5NjU1LDYgQEAKICNlbmRpZgogICAgIH0KIAotI2lmIGRlZmluZWQoV0lUSF9USFJFQUQpICYmICFkZWZpbmVkKE1ZREJfVVNFX0dJTFNUQVRFKQotICAgIC8qIFNhdmUgdGhlIGN1cnJlbnQgaW50ZXJwcmV0ZXIsIHNvIGNhbGxiYWNrcyBjYW4gZG8gdGhlIHJpZ2h0IHRoaW5nLiAqLwotICAgIF9kYl9pbnRlcnByZXRlclN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKS0+aW50ZXJwOwotI2VuZGlmCi0KICAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KICNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAzMDAwMDAwKQogICAgIG0gPSBQeV9Jbml0TW9kdWxlKF9ic2RkYk1vZHVsZU5hbWUsIGJzZGRiX21ldGhvZHMpOwpAQCAtOTQyOCwxMyArOTY4OSw3IEBACiAgICAgQUREX0lOVChkLCBEQl9NQVhfUkVDT1JEUyk7CiAKICNpZiAoREJWRVIgPCA0OCkKLSNpZiAoREJWRVIgPj0gNDIpCiAgICAgQUREX0lOVChkLCBEQl9SUENDTElFTlQpOwotI2Vsc2UKLSAgICBBRERfSU5UKGQsIERCX0NMSUVOVCk7Ci0gICAgLyogYWxsb3cgYXBwcyB0byBiZSB3cml0dGVuIHVzaW5nIERCX1JQQ0NMSUVOVCBvbiBvbGRlciBCZXJrZWxleSBEQiAqLwotICAgIF9hZGRJbnRUb0RpY3QoZCwgIkRCX1JQQ0NMSUVOVCIsIERCX0NMSUVOVCk7Ci0jZW5kaWYKICNlbmRpZgogCiAjaWYgKERCVkVSIDwgNDgpCkBAIC05NDc3LDYgKzk3MzIsMTQgQEAKICAgICBBRERfSU5UKGQsIERCX1RYTl9TWU5DKTsKICAgICBBRERfSU5UKGQsIERCX1RYTl9OT1dBSVQpOwogCisjaWYgKERCVkVSID49IDUxKQorICAgIEFERF9JTlQoZCwgREJfVFhOX0JVTEspOworI2VuZGlmCisKKyNpZiAoREJWRVIgPj0gNDgpCisgICAgQUREX0lOVChkLCBEQl9DVVJTT1JfQlVMSyk7CisjZW5kaWYKKwogI2lmIChEQlZFUiA+PSA0NikKICAgICBBRERfSU5UKGQsIERCX1RYTl9XQUlUKTsKICNlbmRpZgpAQCAtOTUxMSw5ICs5Nzc0LDcgQEAKICAgICBBRERfSU5UKGQsIERCX0xPQ0tfTUlOV1JJVEUpOwogCiAgICAgQUREX0lOVChkLCBEQl9MT0NLX0VYUElSRSk7Ci0jaWYgKERCVkVSID49IDQzKQogICAgIEFERF9JTlQoZCwgREJfTE9DS19NQVhXUklURSk7Ci0jZW5kaWYKIAogICAgIF9hZGRJbnRUb0RpY3QoZCwgIkRCX0xPQ0tfQ09ORkxJQ1QiLCAwKTsKIApAQCAtOTU0OSw5ICs5ODEwLDYgQEAKICAgICBBRERfSU5UKGQsIERCX0xPQ0tfVVBHUkFERSk7CiAKICAgICBBRERfSU5UKGQsIERCX0xTVEFUX0FCT1JURUQpOwotI2lmIChEQlZFUiA8IDQzKQotICAgIEFERF9JTlQoZCwgREJfTFNUQVRfRVJSKTsKLSNlbmRpZgogICAgIEFERF9JTlQoZCwgREJfTFNUQVRfRlJFRSk7CiAgICAgQUREX0lOVChkLCBEQl9MU1RBVF9IRUxEKTsKIApAQCAtOTU2MSw5ICs5ODE5LDcgQEAKICAgICBBRERfSU5UKGQsIERCX0FSQ0hfQUJTKTsKICAgICBBRERfSU5UKGQsIERCX0FSQ0hfREFUQSk7CiAgICAgQUREX0lOVChkLCBEQl9BUkNIX0xPRyk7Ci0jaWYgKERCVkVSID49IDQyKQogICAgIEFERF9JTlQoZCwgREJfQVJDSF9SRU1PVkUpOwotI2VuZGlmCiAKICAgICBBRERfSU5UKGQsIERCX0JUUkVFKTsKICAgICBBRERfSU5UKGQsIERCX0hBU0gpOwpAQCAtOTU3OCw5ICs5ODM0LDcgQEAKICAgICBBRERfSU5UKGQsIERCX1JFVlNQTElUT0ZGKTsKICAgICBBRERfSU5UKGQsIERCX1NOQVBTSE9UKTsKIAotI2lmIChEQlZFUiA+PSA0MykKICAgICBBRERfSU5UKGQsIERCX0lOT1JERVIpOwotI2VuZGlmCiAKICAgICBBRERfSU5UKGQsIERCX0pPSU5fTk9TT1JUKTsKIApAQCAtOTU5MSw5ICs5ODQ1LDYgQEAKICAgICBBRERfSU5UKGQsIERCX0NBQ0hFRF9DT1VOVFMpOwogI2VuZGlmCiAKLSNpZiAoREJWRVIgPD0gNDEpCi0gICAgQUREX0lOVChkLCBEQl9DT01NSVQpOwotI2VuZGlmCiAgICAgQUREX0lOVChkLCBEQl9DT05TVU1FKTsKICAgICBBRERfSU5UKGQsIERCX0NPTlNVTUVfV0FJVCk7CiAgICAgQUREX0lOVChkLCBEQl9DVVJSRU5UKTsKQEAgLTk2NTEsOCArOTkwMiwxMCBAQAogICAgIEFERF9JTlQoZCwgREJfTE9DS19ERUFETE9DSyk7CiAgICAgQUREX0lOVChkLCBEQl9MT0NLX05PVEdSQU5URUQpOwogICAgIEFERF9JTlQoZCwgREJfTk9TRVJWRVIpOworI2lmIChEQlZFUiA8IDUyKQogICAgIEFERF9JTlQoZCwgREJfTk9TRVJWRVJfSE9NRSk7CiAgICAgQUREX0lOVChkLCBEQl9OT1NFUlZFUl9JRCk7CisjZW5kaWYKICAgICBBRERfSU5UKGQsIERCX05PVEZPVU5EKTsKICAgICBBRERfSU5UKGQsIERCX09MRF9WRVJTSU9OKTsKICAgICBBRERfSU5UKGQsIERCX1JVTlJFQ09WRVJZKTsKQEAgLTk2NjUsMTMgKzk5MTgsMTQgQEAKICAgICBBRERfSU5UKGQsIERCX1lJRUxEQ1BVKTsKICAgICBBRERfSU5UKGQsIERCX1BBTklDX0VOVklST05NRU5UKTsKICAgICBBRERfSU5UKGQsIERCX05PUEFOSUMpOwotCiAgICAgQUREX0lOVChkLCBEQl9PVkVSV1JJVEUpOwogCi0jaWYgKERCVkVSID49IDQzKQogICAgIEFERF9JTlQoZCwgREJfU1RBVF9TVUJTWVNURU0pOwogICAgIEFERF9JTlQoZCwgREJfU1RBVF9NRU1QX0hBU0gpOwotI2VuZGlmCisgICAgQUREX0lOVChkLCBEQl9TVEFUX0xPQ0tfQ09ORik7CisgICAgQUREX0lOVChkLCBEQl9TVEFUX0xPQ0tfTE9DS0VSUyk7CisgICAgQUREX0lOVChkLCBEQl9TVEFUX0xPQ0tfT0JKRUNUUyk7CisgICAgQUREX0lOVChkLCBEQl9TVEFUX0xPQ0tfUEFSQU1TKTsKIAogI2lmIChEQlZFUiA+PSA0OCkKICAgICBBRERfSU5UKGQsIERCX09WRVJXUklURV9EVVApOwpAQCAtOTY5MCw3ICs5OTQ0LDYgQEAKICAgICBBRERfSU5UKGQsIERCX0VJRF9JTlZBTElEKTsKICAgICBBRERfSU5UKGQsIERCX0VJRF9CUk9BRENBU1QpOwogCi0jaWYgKERCVkVSID49IDQyKQogICAgIEFERF9JTlQoZCwgREJfVElNRV9OT1RHUkFOVEVEKTsKICAgICBBRERfSU5UKGQsIERCX1RYTl9OT1RfRFVSQUJMRSk7CiAgICAgQUREX0lOVChkLCBEQl9UWE5fV1JJVEVfTk9TWU5DKTsKQEAgLTk2OTgsOSArOTk1MSw4IEBACiAgICAgQUREX0lOVChkLCBEQl9JTklUX1JFUCk7CiAgICAgQUREX0lOVChkLCBEQl9FTkNSWVBUKTsKICAgICBBRERfSU5UKGQsIERCX0NIS1NVTSk7Ci0jZW5kaWYKIAotI2lmIChEQlZFUiA+PSA0MikgJiYgKERCVkVSIDwgNDcpCisjaWYgKERCVkVSIDwgNDcpCiAgICAgQUREX0lOVChkLCBEQl9MT0dfQVVUT1JFTU9WRSk7CiAgICAgQUREX0lOVChkLCBEQl9ESVJFQ1RfTE9HKTsKICNlbmRpZgpAQCAtOTczMyw2ICs5OTg1LDIwIEBACiAgICAgQUREX0lOVChkLCBEQl9WRVJCX1JFUExJQ0FUSU9OKTsKICAgICBBRERfSU5UKGQsIERCX1ZFUkJfV0FJVFNGT1IpOwogCisjaWYgKERCVkVSID49IDUwKQorICAgIEFERF9JTlQoZCwgREJfVkVSQl9SRVBfU1lTVEVNKTsKKyNlbmRpZgorCisjaWYgKERCVkVSID49IDQ3KQorICAgIEFERF9JTlQoZCwgREJfVkVSQl9SRVBfRUxFQ1QpOworICAgIEFERF9JTlQoZCwgREJfVkVSQl9SRVBfTEVBU0UpOworICAgIEFERF9JTlQoZCwgREJfVkVSQl9SRVBfTUlTQyk7CisgICAgQUREX0lOVChkLCBEQl9WRVJCX1JFUF9NU0dTKTsKKyAgICBBRERfSU5UKGQsIERCX1ZFUkJfUkVQX1NZTkMpOworICAgIEFERF9JTlQoZCwgREJfVkVSQl9SRVBNR1JfQ09OTkZBSUwpOworICAgIEFERF9JTlQoZCwgREJfVkVSQl9SRVBNR1JfTUlTQyk7CisjZW5kaWYKKwogI2lmIChEQlZFUiA+PSA0NSkKICAgICBBRERfSU5UKGQsIERCX0VWRU5UX1BBTklDKTsKICAgICBBRERfSU5UKGQsIERCX0VWRU5UX1JFUF9DTElFTlQpOwpAQCAtOTc0OCwxNiArMTAwMTQsNDggQEAKICAgICBBRERfSU5UKGQsIERCX0VWRU5UX1dSSVRFX0ZBSUxFRCk7CiAjZW5kaWYKIAorI2lmIChEQlZFUiA+PSA1MCkKKyAgICBBRERfSU5UKGQsIERCX1JFUE1HUl9DT05GX0VMRUNUSU9OUyk7CisgICAgQUREX0lOVChkLCBEQl9FVkVOVF9SRVBfTUFTVEVSX0ZBSUxVUkUpOworICAgIEFERF9JTlQoZCwgREJfRVZFTlRfUkVQX0RVUE1BU1RFUik7CisgICAgQUREX0lOVChkLCBEQl9FVkVOVF9SRVBfRUxFQ1RJT05fRkFJTEVEKTsKKyNlbmRpZgorI2lmIChEQlZFUiA+PSA0OCkKKyAgICBBRERfSU5UKGQsIERCX0VWRU5UX1JFR19BTElWRSk7CisgICAgQUREX0lOVChkLCBEQl9FVkVOVF9SRUdfUEFOSUMpOworI2VuZGlmCisKKyNpZiAoREJWRVIgPj01MikKKyAgICBBRERfSU5UKGQsIERCX0VWRU5UX1JFUF9TSVRFX0FEREVEKTsKKyAgICBBRERfSU5UKGQsIERCX0VWRU5UX1JFUF9TSVRFX1JFTU9WRUQpOworICAgIEFERF9JTlQoZCwgREJfRVZFTlRfUkVQX0xPQ0FMX1NJVEVfUkVNT1ZFRCk7CisgICAgQUREX0lOVChkLCBEQl9FVkVOVF9SRVBfQ09OTkVDVF9CUk9LRU4pOworICAgIEFERF9JTlQoZCwgREJfRVZFTlRfUkVQX0NPTk5FQ1RfRVNURCk7CisgICAgQUREX0lOVChkLCBEQl9FVkVOVF9SRVBfQ09OTkVDVF9UUllfRkFJTEVEKTsKKyAgICBBRERfSU5UKGQsIERCX0VWRU5UX1JFUF9JTklUX0RPTkUpOworCisgICAgQUREX0lOVChkLCBEQl9NRU1fTE9DSyk7CisgICAgQUREX0lOVChkLCBEQl9NRU1fTE9DS09CSkVDVCk7CisgICAgQUREX0lOVChkLCBEQl9NRU1fTE9DS0VSKTsKKyAgICBBRERfSU5UKGQsIERCX01FTV9MT0dJRCk7CisgICAgQUREX0lOVChkLCBEQl9NRU1fVFJBTlNBQ1RJT04pOworICAgIEFERF9JTlQoZCwgREJfTUVNX1RIUkVBRCk7CisKKyAgICBBRERfSU5UKGQsIERCX0JPT1RTVFJBUF9IRUxQRVIpOworICAgIEFERF9JTlQoZCwgREJfR1JPVVBfQ1JFQVRPUik7CisgICAgQUREX0lOVChkLCBEQl9MRUdBQ1kpOworICAgIEFERF9JTlQoZCwgREJfTE9DQUxfU0lURSk7CisgICAgQUREX0lOVChkLCBEQl9SRVBNR1JfUEVFUik7CisjZW5kaWYKKwogICAgIEFERF9JTlQoZCwgREJfUkVQX0RVUE1BU1RFUik7CiAgICAgQUREX0lOVChkLCBEQl9SRVBfSE9MREVMRUNUSU9OKTsKICNpZiAoREJWRVIgPj0gNDQpCiAgICAgQUREX0lOVChkLCBEQl9SRVBfSUdOT1JFKTsKICAgICBBRERfSU5UKGQsIERCX1JFUF9KT0lOX0ZBSUxVUkUpOwogI2VuZGlmCi0jaWYgKERCVkVSID49IDQyKQogICAgIEFERF9JTlQoZCwgREJfUkVQX0lTUEVSTSk7CiAgICAgQUREX0lOVChkLCBEQl9SRVBfTk9UUEVSTSk7Ci0jZW5kaWYKICAgICBBRERfSU5UKGQsIERCX1JFUF9ORVdTSVRFKTsKIAogICAgIEFERF9JTlQoZCwgREJfUkVQX01BU1RFUik7CkBAIC05NzY2LDcgKzEwMDY0LDEzIEBACiAgICAgQUREX0lOVChkLCBEQl9SRVBfUEVSTUFORU5UKTsKIAogI2lmIChEQlZFUiA+PSA0NCkKKyNpZiAoREJWRVIgPj0gNTApCisgICAgQUREX0lOVChkLCBEQl9SRVBfQ09ORl9BVVRPSU5JVCk7CisjZWxzZQogICAgIEFERF9JTlQoZCwgREJfUkVQX0NPTkZfTk9BVVRPSU5JVCk7CisjZW5kaWYgLyogNS4wICovCisjZW5kaWYgLyogNC40ICovCisjaWYgKERCVkVSID49IDQ0KQogICAgIEFERF9JTlQoZCwgREJfUkVQX0NPTkZfREVMQVlDTElFTlQpOwogICAgIEFERF9JTlQoZCwgREJfUkVQX0NPTkZfQlVMSyk7CiAgICAgQUREX0lOVChkLCBEQl9SRVBfQ09ORl9OT1dBSVQpOwpAQCAtOTc3NCw5ICsxMDA3OCw3IEBACiAgICAgQUREX0lOVChkLCBEQl9SRVBfUkVSRVFVRVNUKTsKICNlbmRpZgogCi0jaWYgKERCVkVSID49IDQyKQogICAgIEFERF9JTlQoZCwgREJfUkVQX05PQlVGRkVSKTsKLSNlbmRpZgogCiAjaWYgKERCVkVSID49IDQ2KQogICAgIEFERF9JTlQoZCwgREJfUkVQX0xFQVNFX0VYUElSRUQpOwpAQCAtOTgxOSwxNCArMTAxMjEsMzQgQEAKICAgICBBRERfSU5UKGQsIERCX1NUQVRfQUxMKTsKICNlbmRpZgogCi0jaWYgKERCVkVSID49IDQzKQorI2lmIChEQlZFUiA+PSA1MSkKKyAgICBBRERfSU5UKGQsIERCX1JFUE1HUl9BQ0tTX0FMTF9BVkFJTEFCTEUpOworI2VuZGlmCisKKyNpZiAoREJWRVIgPj0gNDgpCisgICAgQUREX0lOVChkLCBEQl9SRVBfQ09ORl9JTk1FTSk7CisjZW5kaWYKKworICAgIEFERF9JTlQoZCwgREJfVElNRU9VVCk7CisKKyNpZiAoREJWRVIgPj0gNTApCisgICAgQUREX0lOVChkLCBEQl9GT1JDRVNZTkMpOworI2VuZGlmCisKKyNpZiAoREJWRVIgPj0gNDgpCisgICAgQUREX0lOVChkLCBEQl9GQUlMQ0hLKTsKKyNlbmRpZgorCisjaWYgKERCVkVSID49IDUxKQorICAgIEFERF9JTlQoZCwgREJfSE9UQkFDS1VQX0lOX1BST0dSRVNTKTsKKyNlbmRpZgorCiAgICAgQUREX0lOVChkLCBEQl9CVUZGRVJfU01BTEwpOwogICAgIEFERF9JTlQoZCwgREJfU0VRX0RFQyk7CiAgICAgQUREX0lOVChkLCBEQl9TRVFfSU5DKTsKICAgICBBRERfSU5UKGQsIERCX1NFUV9XUkFQKTsKLSNlbmRpZgogCi0jaWYgKERCVkVSID49IDQzKSAmJiAoREJWRVIgPCA0NykKKyNpZiAoREJWRVIgPCA0NykKICAgICBBRERfSU5UKGQsIERCX0xPR19JTk1FTU9SWSk7CiAgICAgQUREX0lOVChkLCBEQl9EU1lOQ19MT0cpOwogI2VuZGlmCkBAIC05ODU2LDYgKzEwMTc4LDEwIEBACiAgICAgQUREX0lOVChkLCBEQl9TRVRfTE9DS19USU1FT1VUKTsKICAgICBBRERfSU5UKGQsIERCX1NFVF9UWE5fVElNRU9VVCk7CiAKKyNpZiAoREJWRVIgPj0gNDgpCisgICAgQUREX0lOVChkLCBEQl9TRVRfUkVHX1RJTUVPVVQpOworI2VuZGlmCisKICAgICAvKiBUaGUgZXhjZXB0aW9uIG5hbWUgbXVzdCBiZSBjb3JyZWN0IGZvciBwaWNrbGVkIGV4Y2VwdGlvbiAqCiAgICAgICogb2JqZWN0cyB0byB1bnBpY2tsZSBwcm9wZXJseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNpZmRlZiBQWUJTRERCX1NUQU5EQUxPTkUgIC8qIGRpZmZlcmVudCB2YWx1ZSBuZWVkZWQgZm9yIHN0YW5kYWxvbmUgcHlic2RkYiAqLwpAQCAtOTkxMiw4ICsxMDIzOCwxMCBAQAogICAgIE1BS0VfRVgoREJSdW5SZWNvdmVyeUVycm9yKTsKICAgICBNQUtFX0VYKERCVmVyaWZ5QmFkRXJyb3IpOwogICAgIE1BS0VfRVgoREJOb1NlcnZlckVycm9yKTsKKyNpZiAoREJWRVIgPCA1MikKICAgICBNQUtFX0VYKERCTm9TZXJ2ZXJIb21lRXJyb3IpOwogICAgIE1BS0VfRVgoREJOb1NlcnZlcklERXJyb3IpOworI2VuZGlmCiAgICAgTUFLRV9FWChEQlBhZ2VOb3RGb3VuZEVycm9yKTsKICAgICBNQUtFX0VYKERCU2Vjb25kYXJ5QmFkRXJyb3IpOwogCkBAIC05OTI3LDkgKzEwMjU1LDcgQEAKICAgICBNQUtFX0VYKERCTm9TdWNoRmlsZUVycm9yKTsKICAgICBNQUtFX0VYKERCUGVybWlzc2lvbnNFcnJvcik7CiAKLSNpZiAoREJWRVIgPj0gNDIpCiAgICAgTUFLRV9FWChEQlJlcEhhbmRsZURlYWRFcnJvcik7Ci0jZW5kaWYKICNpZiAoREJWRVIgPj0gNDQpCiAgICAgTUFLRV9FWChEQlJlcExvY2tvdXRFcnJvcik7CiAjZW5kaWYKQEAgLTk5NDcsMjcgKzEwMjczLDMwIEBACiAjdW5kZWYgTUFLRV9FWAogCiAgICAgLyogSW5pdGlhbGlzZSB0aGUgQyBBUEkgc3RydWN0dXJlIGFuZCBhZGQgaXQgdG8gdGhlIG1vZHVsZSAqLworICAgIGJzZGRiX2FwaS5hcGlfdmVyc2lvbiAgICAgID0gUFlCU0REQl9BUElfVkVSU0lPTjsKICAgICBic2RkYl9hcGkuZGJfdHlwZSAgICAgICAgICA9ICZEQl9UeXBlOwogICAgIGJzZGRiX2FwaS5kYmN1cnNvcl90eXBlICAgID0gJkRCQ3Vyc29yX1R5cGU7CiAgICAgYnNkZGJfYXBpLmRibG9nY3Vyc29yX3R5cGUgPSAmREJMb2dDdXJzb3JfVHlwZTsKICAgICBic2RkYl9hcGkuZGJlbnZfdHlwZSAgICAgICA9ICZEQkVudl9UeXBlOwogICAgIGJzZGRiX2FwaS5kYnR4bl90eXBlICAgICAgID0gJkRCVHhuX1R5cGU7CiAgICAgYnNkZGJfYXBpLmRibG9ja190eXBlICAgICAgPSAmREJMb2NrX1R5cGU7Ci0jaWYgKERCVkVSID49IDQzKQogICAgIGJzZGRiX2FwaS5kYnNlcXVlbmNlX3R5cGUgID0gJkRCU2VxdWVuY2VfVHlwZTsKLSNlbmRpZgogICAgIGJzZGRiX2FwaS5tYWtlREJFcnJvciAgICAgID0gbWFrZURCRXJyb3I7CiAKICAgICAvKgotICAgICoqIENhcHN1bGVzIGV4aXN0IGZyb20gUHl0aG9uIDMuMSwgYnV0IEkKLSAgICAqKiBkb24ndCB3YW50IHRvIGJyZWFrIHRoZSBBUEkgY29tcGF0aWJpbGl0eQotICAgICoqIGZvciBhbHJlYWR5IHB1Ymxpc2hlZCBQeXRob24gdmVyc2lvbnMuCisgICAgKiogQ2Fwc3VsZXMgZXhpc3QgZnJvbSBQeXRob24gMi43IGFuZCAzLjEuCisgICAgKiogV2UgZG9uJ3Qgc3VwcG9ydCBQeXRob24gMy4wIGFueW1vcmUsIHNvLi4uCisgICAgKiogI2lmIChQWV9WRVJTSU9OX0hFWCA8ICgoUFlfTUFKT1JfVkVSU0lPTiA8IDMpID8gMHgwMjA3MDAwMCA6IDB4MDMwMjAwMDApKQogICAgICovCi0jaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMzAyMDAwMCkKKyNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDcwMDAwKQogICAgIHB5X2FwaSA9IFB5Q09iamVjdF9Gcm9tVm9pZFB0cigodm9pZCopJmJzZGRiX2FwaSwgTlVMTCk7CiAjZWxzZQogICAgIHsKLSAgICAgICAgY2hhciBweV9hcGlfbmFtZVsyNTBdOworICAgICAgICAvKgorICAgICAgICAqKiBUaGUgZGF0YSBtdXN0IG91dGxpdmUgdGhlIGNhbGwhIS4gU28sIHRoZSBzdGF0aWMgZGVmaW5pdGlvbi4KKyAgICAgICAgKiogVGhlIGJ1ZmZlciBtdXN0IGJlIGJpZyBlbm91Z2guLi4KKyAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGNoYXIgcHlfYXBpX25hbWVbTU9EVUxFX05BTUVfTUFYX0xFTisxMF07CiAKICAgICAgICAgc3RyY3B5KHB5X2FwaV9uYW1lLCBfYnNkZGJNb2R1bGVOYW1lKTsKICAgICAgICAgc3RyY2F0KHB5X2FwaV9uYW1lLCAiLmFwaSIpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY29sbGVjdGlvbnNtb2R1bGUuYyBiL01vZHVsZXMvX2NvbGxlY3Rpb25zbW9kdWxlLmMKaW5kZXggZWE1Zjc3OS4uYmNkZmZjYiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY29sbGVjdGlvbnNtb2R1bGUuYworKysgYi9Nb2R1bGVzL19jb2xsZWN0aW9uc21vZHVsZS5jCkBAIC04LDkgKzgsMTMgQEAKICovCiAKIC8qIFRoZSBibG9jayBsZW5ndGggbWF5IGJlIHNldCB0byBhbnkgbnVtYmVyIG92ZXIgMS4gIExhcmdlciBudW1iZXJzCi0gKiByZWR1Y2UgdGhlIG51bWJlciBvZiBjYWxscyB0byB0aGUgbWVtb3J5IGFsbG9jYXRvciBidXQgdGFrZSBtb3JlCi0gKiBtZW1vcnkuICBJZGVhbGx5LCBCTE9DS0xFTiBzaG91bGQgYmUgc2V0IHdpdGggYW4gZXllIHRvIHRoZQotICogbGVuZ3RoIG9mIGEgY2FjaGUgbGluZS4KKyAqIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvIHRoZSBtZW1vcnkgYWxsb2NhdG9yLCBnaXZlIGZhc3RlcgorICogaW5kZXhpbmcgYW5kIHJvdGF0aW9uLCBhbmQgcmVkdWNlIHRoZSBsaW5rOjpkYXRhIG92ZXJoZWFkIHJhdGlvLgorICoKKyAqIElkZWFsbHksIHRoZSBibG9jayBsZW5ndGggd2lsbCBiZSBzZXQgdG8gdHdvIGxlc3MgdGhhbiBzb21lCisgKiBtdWx0aXBsZSBvZiB0aGUgY2FjaGUtbGluZSBsZW5ndGggKHNvIHRoYXQgdGhlIGZ1bGwgYmxvY2sKKyAqIGluY2x1ZGluZyB0aGUgbGVmdGxpbmsgYW5kIHJpZ2h0bGluayB3aWxsIGZpdCBuZWF0bHkgaW50bworICogY2FjaGUgbGluZXMpLgogICovCiAKICNkZWZpbmUgQkxPQ0tMRU4gNjIKQEAgLTQ2LDkgKzUwLDkgQEAKICAqLwogCiB0eXBlZGVmIHN0cnVjdCBCTE9DSyB7Ci0gICAgc3RydWN0IEJMT0NLICpsZWZ0bGluazsKLSAgICBzdHJ1Y3QgQkxPQ0sgKnJpZ2h0bGluazsKICAgICBQeU9iamVjdCAqZGF0YVtCTE9DS0xFTl07CisgICAgc3RydWN0IEJMT0NLICpyaWdodGxpbms7CisgICAgc3RydWN0IEJMT0NLICpsZWZ0bGluazsKIH0gYmxvY2s7CiAKICNkZWZpbmUgTUFYRlJFRUJMT0NLUyAxMApAQCAtNTgsMTMgKzYyLDggQEAKIHN0YXRpYyBibG9jayAqCiBuZXdibG9jayhibG9jayAqbGVmdGxpbmssIGJsb2NrICpyaWdodGxpbmssIFB5X3NzaXplX3QgbGVuKSB7CiAgICAgYmxvY2sgKmI7Ci0gICAgLyogVG8gcHJldmVudCBsZW4gZnJvbSBvdmVyZmxvd2luZyBQWV9TU0laRV9UX01BWCBvbiA2NC1iaXQgbWFjaGluZXMsIHdlCi0gICAgICogcmVmdXNlIHRvIGFsbG9jYXRlIG5ldyBibG9ja3MgaWYgdGhlIGN1cnJlbnQgbGVuIGlzIGRhbmdlcm91c2x5Ci0gICAgICogY2xvc2UuICBUaGVyZSBpcyBzb21lIGV4dHJhIG1hcmdpbiB0byBwcmV2ZW50IHNwdXJpb3VzIGFyaXRobWV0aWMKLSAgICAgKiBvdmVyZmxvd3MgYXQgdmFyaW91cyBwbGFjZXMuICBUaGUgZm9sbG93aW5nIGNoZWNrIGVuc3VyZXMgdGhhdAotICAgICAqIHRoZSBibG9ja3MgYWxsb2NhdGVkIHRvIHRoZSBkZXF1ZSwgaW4gdGhlIHdvcnN0IGNhc2UsIGNhbiBvbmx5Ci0gICAgICogaGF2ZSBQWV9TU0laRV9UX01BWC0yIGVudHJpZXMgaW4gdG90YWwuCi0gICAgICovCisgICAgLyogVG8gcHJldmVudCBsZW4gZnJvbSBvdmVyZmxvd2luZyBQWV9TU0laRV9UX01BWCBvbiAzMi1iaXQgbWFjaGluZXMsIHdlCisgICAgICogcmVmdXNlIHRvIGFsbG9jYXRlIG5ldyBibG9ja3MgaWYgdGhlIGN1cnJlbnQgbGVuIGlzIG5lYXJpbmcgb3ZlcmZsb3cuICovCiAgICAgaWYgKGxlbiA+PSBQWV9TU0laRV9UX01BWCAtIDIqQkxPQ0tMRU4pIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGFkZCBtb3JlIGJsb2NrcyB0byB0aGUgZGVxdWUiKTsKQEAgLTEwMyw4ICsxMDIsOCBAQAogICAgIFB5X3NzaXplX3QgbGVmdGluZGV4OyAgICAgICAvKiBpbiByYW5nZShCTE9DS0xFTikgKi8KICAgICBQeV9zc2l6ZV90IHJpZ2h0aW5kZXg7ICAgICAgLyogaW4gcmFuZ2UoQkxPQ0tMRU4pICovCiAgICAgUHlfc3NpemVfdCBsZW47Ci0gICAgUHlfc3NpemVfdCBtYXhsZW47CiAgICAgbG9uZyBzdGF0ZTsgICAgICAgICAvKiBpbmNyZW1lbnRlZCB3aGVuZXZlciB0aGUgaW5kaWNlcyBtb3ZlICovCisgICAgUHlfc3NpemVfdCBtYXhsZW47CiAgICAgUHlPYmplY3QgKndlYWtyZWZsaXN0OyAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLwogfSBkZXF1ZW9iamVjdDsKIApAQCAtNDEzLDEwICs0MTIsOSBAQAogc3RhdGljIGludAogX2RlcXVlX3JvdGF0ZShkZXF1ZW9iamVjdCAqZGVxdWUsIFB5X3NzaXplX3QgbikKIHsKLSAgICBQeV9zc2l6ZV90IGksIGxlbj1kZXF1ZS0+bGVuLCBoYWxmbGVuPShsZW4rMSk+PjE7Ci0gICAgUHlPYmplY3QgKml0ZW0sICpydjsKKyAgICBQeV9zc2l6ZV90IG0sIGxlbj1kZXF1ZS0+bGVuLCBoYWxmbGVuPWxlbj4+MTsKIAotICAgIGlmIChsZW4gPT0gMCkKKyAgICBpZiAobGVuIDw9IDEpCiAgICAgICAgIHJldHVybiAwOwogICAgIGlmIChuID4gaGFsZmxlbiB8fCBuIDwgLWhhbGZsZW4pIHsKICAgICAgICAgbiAlPSBsZW47CkBAIC00MjUsMjQgKzQyMyw3OSBAQAogICAgICAgICBlbHNlIGlmIChuIDwgLWhhbGZsZW4pCiAgICAgICAgICAgICBuICs9IGxlbjsKICAgICB9CisgICAgYXNzZXJ0KGxlbiA+IDEpOworICAgIGFzc2VydCgtaGFsZmxlbiA8PSBuICYmIG4gPD0gaGFsZmxlbik7CiAKLSAgICBmb3IgKGk9MCA7IGk8biA7IGkrKykgewotICAgICAgICBpdGVtID0gZGVxdWVfcG9wKGRlcXVlLCBOVUxMKTsKLSAgICAgICAgYXNzZXJ0IChpdGVtICE9IE5VTEwpOwotICAgICAgICBydiA9IGRlcXVlX2FwcGVuZGxlZnQoZGVxdWUsIGl0ZW0pOwotICAgICAgICBQeV9ERUNSRUYoaXRlbSk7Ci0gICAgICAgIGlmIChydiA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBQeV9ERUNSRUYocnYpOworICAgIGRlcXVlLT5zdGF0ZSsrOworICAgIHdoaWxlIChuID4gMCkgeworICAgICAgICBpZiAoZGVxdWUtPmxlZnRpbmRleCA9PSAwKSB7CisgICAgICAgICAgICBibG9jayAqYiA9IG5ld2Jsb2NrKE5VTEwsIGRlcXVlLT5sZWZ0YmxvY2ssIGxlbik7CisgICAgICAgICAgICBpZiAoYiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGFzc2VydChkZXF1ZS0+bGVmdGJsb2NrLT5sZWZ0bGluayA9PSBOVUxMKTsKKyAgICAgICAgICAgIGRlcXVlLT5sZWZ0YmxvY2stPmxlZnRsaW5rID0gYjsKKyAgICAgICAgICAgIGRlcXVlLT5sZWZ0YmxvY2sgPSBiOworICAgICAgICAgICAgZGVxdWUtPmxlZnRpbmRleCA9IEJMT0NLTEVOOworICAgICAgICB9CisgICAgICAgIGFzc2VydChkZXF1ZS0+bGVmdGluZGV4ID4gMCk7CisKKyAgICAgICAgbSA9IG47CisgICAgICAgIGlmIChtID4gZGVxdWUtPnJpZ2h0aW5kZXggKyAxKQorICAgICAgICAgICAgbSA9IGRlcXVlLT5yaWdodGluZGV4ICsgMTsKKyAgICAgICAgaWYgKG0gPiBkZXF1ZS0+bGVmdGluZGV4KQorICAgICAgICAgICAgbSA9IGRlcXVlLT5sZWZ0aW5kZXg7CisgICAgICAgIGFzc2VydCAobSA+IDAgJiYgbSA8PSBsZW4pOworICAgICAgICBtZW1jcHkoJmRlcXVlLT5sZWZ0YmxvY2stPmRhdGFbZGVxdWUtPmxlZnRpbmRleCAtIG1dLAorICAgICAgICAgICAgICAgJmRlcXVlLT5yaWdodGJsb2NrLT5kYXRhW2RlcXVlLT5yaWdodGluZGV4ICsgMSAtIG1dLAorICAgICAgICAgICAgICAgbSAqIHNpemVvZihQeU9iamVjdCAqKSk7CisgICAgICAgIGRlcXVlLT5yaWdodGluZGV4IC09IG07CisgICAgICAgIGRlcXVlLT5sZWZ0aW5kZXggLT0gbTsKKyAgICAgICAgbiAtPSBtOworCisgICAgICAgIGlmIChkZXF1ZS0+cmlnaHRpbmRleCA9PSAtMSkgeworICAgICAgICAgICAgYmxvY2sgKnByZXZibG9jayA9IGRlcXVlLT5yaWdodGJsb2NrLT5sZWZ0bGluazsKKyAgICAgICAgICAgIGFzc2VydChkZXF1ZS0+cmlnaHRibG9jayAhPSBOVUxMKTsKKyAgICAgICAgICAgIGFzc2VydChkZXF1ZS0+bGVmdGJsb2NrICE9IGRlcXVlLT5yaWdodGJsb2NrKTsKKyAgICAgICAgICAgIGZyZWVibG9jayhkZXF1ZS0+cmlnaHRibG9jayk7CisgICAgICAgICAgICBwcmV2YmxvY2stPnJpZ2h0bGluayA9IE5VTEw7CisgICAgICAgICAgICBkZXF1ZS0+cmlnaHRibG9jayA9IHByZXZibG9jazsKKyAgICAgICAgICAgIGRlcXVlLT5yaWdodGluZGV4ID0gQkxPQ0tMRU4gLSAxOworICAgICAgICB9CiAgICAgfQotICAgIGZvciAoaT0wIDsgaT5uIDsgaS0tKSB7Ci0gICAgICAgIGl0ZW0gPSBkZXF1ZV9wb3BsZWZ0KGRlcXVlLCBOVUxMKTsKLSAgICAgICAgYXNzZXJ0IChpdGVtICE9IE5VTEwpOwotICAgICAgICBydiA9IGRlcXVlX2FwcGVuZChkZXF1ZSwgaXRlbSk7Ci0gICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKLSAgICAgICAgaWYgKHJ2ID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgd2hpbGUgKG4gPCAwKSB7CisgICAgICAgIGlmIChkZXF1ZS0+cmlnaHRpbmRleCA9PSBCTE9DS0xFTiAtIDEpIHsKKyAgICAgICAgICAgIGJsb2NrICpiID0gbmV3YmxvY2soZGVxdWUtPnJpZ2h0YmxvY2ssIE5VTEwsIGxlbik7CisgICAgICAgICAgICBpZiAoYiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGFzc2VydChkZXF1ZS0+cmlnaHRibG9jay0+cmlnaHRsaW5rID09IE5VTEwpOworICAgICAgICAgICAgZGVxdWUtPnJpZ2h0YmxvY2stPnJpZ2h0bGluayA9IGI7CisgICAgICAgICAgICBkZXF1ZS0+cmlnaHRibG9jayA9IGI7CisgICAgICAgICAgICBkZXF1ZS0+cmlnaHRpbmRleCA9IC0xOworICAgICAgICB9CisgICAgICAgIGFzc2VydCAoZGVxdWUtPnJpZ2h0aW5kZXggPCBCTE9DS0xFTiAtIDEpOworCisgICAgICAgIG0gPSAtbjsKKyAgICAgICAgaWYgKG0gPiBCTE9DS0xFTiAtIGRlcXVlLT5sZWZ0aW5kZXgpCisgICAgICAgICAgICBtID0gQkxPQ0tMRU4gLSBkZXF1ZS0+bGVmdGluZGV4OworICAgICAgICBpZiAobSA+IEJMT0NLTEVOIC0gMSAtIGRlcXVlLT5yaWdodGluZGV4KQorICAgICAgICAgICAgbSA9IEJMT0NLTEVOIC0gMSAtIGRlcXVlLT5yaWdodGluZGV4OworICAgICAgICBhc3NlcnQgKG0gPiAwICYmIG0gPD0gbGVuKTsKKyAgICAgICAgbWVtY3B5KCZkZXF1ZS0+cmlnaHRibG9jay0+ZGF0YVtkZXF1ZS0+cmlnaHRpbmRleCArIDFdLAorICAgICAgICAgICAgICAgJmRlcXVlLT5sZWZ0YmxvY2stPmRhdGFbZGVxdWUtPmxlZnRpbmRleF0sCisgICAgICAgICAgICAgICBtICogc2l6ZW9mKFB5T2JqZWN0ICopKTsKKyAgICAgICAgZGVxdWUtPmxlZnRpbmRleCArPSBtOworICAgICAgICBkZXF1ZS0+cmlnaHRpbmRleCArPSBtOworICAgICAgICBuICs9IG07CisKKyAgICAgICAgaWYgKGRlcXVlLT5sZWZ0aW5kZXggPT0gQkxPQ0tMRU4pIHsKKyAgICAgICAgICAgIGJsb2NrICpuZXh0YmxvY2sgPSBkZXF1ZS0+bGVmdGJsb2NrLT5yaWdodGxpbms7CisgICAgICAgICAgICBhc3NlcnQoZGVxdWUtPmxlZnRibG9jayAhPSBkZXF1ZS0+cmlnaHRibG9jayk7CisgICAgICAgICAgICBmcmVlYmxvY2soZGVxdWUtPmxlZnRibG9jayk7CisgICAgICAgICAgICBhc3NlcnQobmV4dGJsb2NrICE9IE5VTEwpOworICAgICAgICAgICAgbmV4dGJsb2NrLT5sZWZ0bGluayA9IE5VTEw7CisgICAgICAgICAgICBkZXF1ZS0+bGVmdGJsb2NrID0gbmV4dGJsb2NrOworICAgICAgICAgICAgZGVxdWUtPmxlZnRpbmRleCA9IDA7CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CkBAIC01ODgsNyArNjQxLDcgQEAKIFB5RG9jX1NUUlZBUihyZW1vdmVfZG9jLAogIkQucmVtb3ZlKHZhbHVlKSAtLSByZW1vdmUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB2YWx1ZS4iKTsKIAotc3RhdGljIGludAorc3RhdGljIHZvaWQKIGRlcXVlX2NsZWFyKGRlcXVlb2JqZWN0ICpkZXF1ZSkKIHsKICAgICBQeU9iamVjdCAqaXRlbTsKQEAgLTYwMSw3ICs2NTQsNiBAQAogICAgIGFzc2VydChkZXF1ZS0+bGVmdGJsb2NrID09IGRlcXVlLT5yaWdodGJsb2NrICYmCiAgICAgICAgICAgIGRlcXVlLT5sZWZ0aW5kZXggLSAxID09IGRlcXVlLT5yaWdodGluZGV4ICYmCiAgICAgICAgICAgIGRlcXVlLT5sZW4gPT0gMCk7Ci0gICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC03MDQsMTAgKzc1Niw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGVxdWVfY2xlYXJtZXRob2QoZGVxdWVvYmplY3QgKmRlcXVlKQogewotICAgIGludCBydjsKLQotICAgIHJ2ID0gZGVxdWVfY2xlYXIoZGVxdWUpOwotICAgIGFzc2VydCAocnYgIT0gLTEpOworICAgIGRlcXVlX2NsZWFyKGRlcXVlKTsKICAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIApAQCAtOTkxLDYgKzEwNDAsMjMgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKK2RlcXVlX3NpemVvZihkZXF1ZW9iamVjdCAqZGVxdWUsIHZvaWQgKnVudXNlZCkKK3sKKyAgICBQeV9zc2l6ZV90IHJlczsKKyAgICBQeV9zc2l6ZV90IGJsb2NrczsKKworICAgIHJlcyA9IHNpemVvZihkZXF1ZW9iamVjdCk7CisgICAgYmxvY2tzID0gKGRlcXVlLT5sZWZ0aW5kZXggKyBkZXF1ZS0+bGVuICsgQkxPQ0tMRU4gLSAxKSAvIEJMT0NLTEVOOworICAgIGFzc2VydChkZXF1ZS0+bGVmdGluZGV4ICsgZGVxdWUtPmxlbiAtIDEgPT0KKyAgICAgICAgICAgKGJsb2NrcyAtIDEpICogQkxPQ0tMRU4gKyBkZXF1ZS0+cmlnaHRpbmRleCk7CisgICAgcmVzICs9IGJsb2NrcyAqIHNpemVvZihibG9jayk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChyZXMpOworfQorCitQeURvY19TVFJWQVIoc2l6ZW9mX2RvYywKKyJELl9fc2l6ZW9mX18oKSAtLSBzaXplIG9mIEQgaW4gbWVtb3J5LCBpbiBieXRlcyIpOworCitzdGF0aWMgUHlPYmplY3QgKgogZGVxdWVfZ2V0X21heGxlbihkZXF1ZW9iamVjdCAqZGVxdWUpCiB7CiAgICAgaWYgKGRlcXVlLT5tYXhsZW4gPT0gLTEpCkBAIC0xMDUzLDEyICsxMTE5LDE0IEBACiAgICAgeyJyZXZlcnNlIiwgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilkZXF1ZV9yZXZlcnNlLAogICAgICAgICBNRVRIX05PQVJHUywgICAgICAgICAgICAgcmV2ZXJzZV9kb2N9LAogICAgIHsicm90YXRlIiwgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGVxdWVfcm90YXRlLAotICAgICAgICBNRVRIX1ZBUkFSR1MsICAgICAgICAgICByb3RhdGVfZG9jfSwKKyAgICAgICAgTUVUSF9WQVJBUkdTLCAgICAgICAgICAgIHJvdGF0ZV9kb2N9LAorICAgIHsiX19zaXplb2ZfXyIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGVxdWVfc2l6ZW9mLAorICAgICAgICBNRVRIX05PQVJHUywgICAgICAgICAgICAgc2l6ZW9mX2RvY30sCiAgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBQeURvY19TVFJWQVIoZGVxdWVfZG9jLAotImRlcXVlKGl0ZXJhYmxlWywgbWF4bGVuXSkgLS0+IGRlcXVlIG9iamVjdFxuXAorImRlcXVlKFtpdGVyYWJsZVssIG1heGxlbl1dKSAtLT4gZGVxdWUgb2JqZWN0XG5cCiBcblwKIEJ1aWxkIGFuIG9yZGVyZWQgY29sbGVjdGlvbiB3aXRoIG9wdGltaXplZCBhY2Nlc3MgZnJvbSBpdHMgZW5kcG9pbnRzLiIpOwogCkBAIC0xNDc1LDggKzE1NDMsMTAgQEAKICAgICB7CiAgICAgICAgIGludCBzdGF0dXMgPSBQeV9SZXByRW50ZXIoZGQtPmRlZmF1bHRfZmFjdG9yeSk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gMCkgewotICAgICAgICAgICAgaWYgKHN0YXR1cyA8IDApCisgICAgICAgICAgICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihiYXNlcmVwcik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBkZWZyZXByID0gUHlTdHJpbmdfRnJvbVN0cmluZygiLi4uIik7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQpAQCAtMTU0MiwxMSArMTYxMiwxMyBAQAogfQogCiBQeURvY19TVFJWQVIoZGVmZGljdF9kb2MsCi0iZGVmYXVsdGRpY3QoZGVmYXVsdF9mYWN0b3J5KSAtLT4gZGljdCB3aXRoIGRlZmF1bHQgZmFjdG9yeVxuXAorImRlZmF1bHRkaWN0KGRlZmF1bHRfZmFjdG9yeVssIC4uLl0pIC0tPiBkaWN0IHdpdGggZGVmYXVsdCBmYWN0b3J5XG5cCiBcblwKIFRoZSBkZWZhdWx0IGZhY3RvcnkgaXMgY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzIHRvIHByb2R1Y2VcblwKIGEgbmV3IHZhbHVlIHdoZW4gYSBrZXkgaXMgbm90IHByZXNlbnQsIGluIF9fZ2V0aXRlbV9fIG9ubHkuXG5cCiBBIGRlZmF1bHRkaWN0IGNvbXBhcmVzIGVxdWFsIHRvIGEgZGljdCB3aXRoIHRoZSBzYW1lIGl0ZW1zLlxuXAorQWxsIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgaWYgdGhleSB3ZXJlXG5cCitwYXNzZWQgdG8gdGhlIGRpY3QgY29uc3RydWN0b3IsIGluY2x1ZGluZyBrZXl3b3JkIGFyZ3VtZW50cy5cblwKICIpOwogCiAvKiBTZWUgY29tbWVudCBpbiB4eHN1YnR5cGUuYyAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3N2LmMgYi9Nb2R1bGVzL19jc3YuYwppbmRleCBlYTNhZGQyLi4wMGY1ZDAwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jc3YuYworKysgYi9Nb2R1bGVzL19jc3YuYwpAQCAtMjA4LDggKzIwOCwxMiBAQAogewogICAgIGlmIChzcmMgPT0gTlVMTCkKICAgICAgICAgKnRhcmdldCA9IGRmbHQ7Ci0gICAgZWxzZQotICAgICAgICAqdGFyZ2V0ID0gUHlPYmplY3RfSXNUcnVlKHNyYyk7CisgICAgZWxzZSB7CisgICAgICAgIGludCBiID0gUHlPYmplY3RfSXNUcnVlKHNyYyk7CisgICAgICAgIGlmIChiIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgKnRhcmdldCA9IGI7CisgICAgfQogICAgIHJldHVybiAwOwogfQogCkBAIC0yMzUsMTkgKzIzOSwyNCBAQAogICAgIGlmIChzcmMgPT0gTlVMTCkKICAgICAgICAgKnRhcmdldCA9IGRmbHQ7CiAgICAgZWxzZSB7Ci0gICAgICAgIGlmIChzcmMgPT0gUHlfTm9uZSB8fCBQeVN0cmluZ19TaXplKHNyYykgPT0gMCkKLSAgICAgICAgICAgICp0YXJnZXQgPSAnXDAnOwotICAgICAgICBlbHNlIGlmICghUHlTdHJpbmdfQ2hlY2soc3JjKSB8fCBQeVN0cmluZ19TaXplKHNyYykgIT0gMSkgewotICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiXCIlc1wiIG11c3QgYmUgYW4gMS1jaGFyYWN0ZXIgc3RyaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNoYXIgKnMgPSBQeVN0cmluZ19Bc1N0cmluZyhzcmMpOwotICAgICAgICAgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgKnRhcmdldCA9ICdcMCc7CisgICAgICAgIGlmIChzcmMgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgUHlfc3NpemVfdCBsZW47CisgICAgICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHNyYykpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiXCIlc1wiIG11c3QgYmUgc3RyaW5nLCBub3QgJS4yMDBzIiwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgc3JjLT5vYl90eXBlLT50cF9uYW1lKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAqdGFyZ2V0ID0gc1swXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNyYyk7CisgICAgICAgICAgICBpZiAobGVuID4gMSkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJcIiVzXCIgbXVzdCBiZSBhbiAxLWNoYXJhY3RlciBzdHJpbmciLAorICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGVuID4gMCkKKyAgICAgICAgICAgICAgICAqdGFyZ2V0ID0gKlB5U3RyaW5nX0FTX1NUUklORyhzcmMpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiAwOwpAQCAtMjYzLDcgKzI3Miw3IEBACiAgICAgICAgICAgICAqdGFyZ2V0ID0gTlVMTDsKICAgICAgICAgZWxzZSBpZiAoIUlTX0JBU0VTVFJJTkcoc3JjKSkgewogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiXCIlc1wiIG11c3QgYmUgYW4gc3RyaW5nIiwgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIlwiJXNcIiBtdXN0IGJlIGEgc3RyaW5nIiwgbmFtZSk7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CkBAIC00MjIsNyArNDMxLDggQEAKICAgICBpZiAoZGlhbGVjdF9jaGVja19xdW90aW5nKHNlbGYtPnF1b3RpbmcpKQogICAgICAgICBnb3RvIGVycjsKICAgICBpZiAoc2VsZi0+ZGVsaW1pdGVyID09IDApIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImRlbGltaXRlciBtdXN0IGJlIHNldCIpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlwiZGVsaW1pdGVyXCIgbXVzdCBiZSBhbiAxLWNoYXJhY3RlciBzdHJpbmciKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIGlmIChxdW90ZWNoYXIgPT0gUHlfTm9uZSAmJiBxdW90aW5nID09IE5VTEwpCkBAIC03ODQsOSArNzk0LDEzIEBACiAgICAgICAgIGxpbmVvYmogPSBQeUl0ZXJfTmV4dChzZWxmLT5pbnB1dF9pdGVyKTsKICAgICAgICAgaWYgKGxpbmVvYmogPT0gTlVMTCkgewogICAgICAgICAgICAgLyogRW5kIG9mIGlucHV0IE9SIGV4Y2VwdGlvbiAqLwotICAgICAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpICYmIHNlbGYtPmZpZWxkX2xlbiAhPSAwKQotICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChlcnJvcl9vYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdsaW5lIGluc2lkZSBzdHJpbmciKTsKKyAgICAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSAmJiAoc2VsZi0+ZmllbGRfbGVuICE9IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RhdGUgPT0gSU5fUVVPVEVEX0ZJRUxEKSkgeworICAgICAgICAgICAgICAgIGlmIChzZWxmLT5kaWFsZWN0LT5zdHJpY3QpCisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhlcnJvcl9vYmosICJ1bmV4cGVjdGVkIGVuZCBvZiBkYXRhIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFyc2Vfc2F2ZV9maWVsZChzZWxmKSA+PSAwICkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgICAgICArK3NlbGYtPmxpbmVfbnVtOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXMuYyBiL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzLmMKaW5kZXggNGFlMmM0MS4uMTcwMGFmZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXMuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlcy5jCkBAIC0xOTQsMTAgKzE5NCw4IEBACiAgICAgICAgIGlmICgtMSA9PSBQeURpY3RfRGVsSXRlbShzZWxmLT5kaWN0LCBzZWxmLT5rZXkpKQogICAgICAgICAgICAgLyogWFhYIEVycm9yIGNvbnRleHQgKi8KICAgICAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShQeV9Ob25lKTsKLSAgICAgICAgUHlfREVDUkVGKHNlbGYtPmtleSk7Ci0gICAgICAgIHNlbGYtPmtleSA9IE5VTEw7Ci0gICAgICAgIFB5X0RFQ1JFRihzZWxmLT5kaWN0KTsKLSAgICAgICAgc2VsZi0+ZGljdCA9IE5VTEw7CisgICAgICAgIFB5X0NMRUFSKHNlbGYtPmtleSk7CisgICAgICAgIFB5X0NMRUFSKHNlbGYtPmRpY3QpOwogICAgIH0KICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgcmV0dXJuIFB5X05vbmU7CkBAIC0zMjQsNiArMzIyLDQ4IEBACiB9CiAKIC8qCisgIEFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrIGZvciBhIHBlcDMxMTggZm9ybWF0IHN0cmluZywgYWRkaW5nCisgIHRoZSBnaXZlbiBwcmVmaXggKGlmIG5vbi1udWxsKSwgYW4gYWRkaXRpb25hbCBzaGFwZSBwcmVmaXgsIGFuZCBhIHN1ZmZpeC4KKyAgUmV0dXJucyBOVUxMIG9uIGZhaWx1cmUsIHdpdGggdGhlIGVycm9yIGluZGljYXRvciBzZXQuICBJZiBjYWxsZWQgd2l0aAorICBhIHN1ZmZpeCBvZiBOVUxMIHRoZSBlcnJvciBpbmRpY2F0b3IgbXVzdCBhbHJlYWR5IGJlIHNldC4KKyAqLworY2hhciAqCitfY3R5cGVzX2FsbG9jX2Zvcm1hdF9zdHJpbmdfd2l0aF9zaGFwZShpbnQgbmRpbSwgY29uc3QgUHlfc3NpemVfdCAqc2hhcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKnN1ZmZpeCkKK3sKKyAgICBjaGFyICpuZXdfcHJlZml4OworICAgIGNoYXIgKnJlc3VsdDsKKyAgICBjaGFyIGJ1ZlszMl07CisgICAgaW50IHByZWZpeF9sZW47CisgICAgaW50IGs7CisKKyAgICBwcmVmaXhfbGVuID0gMzIgKiBuZGltICsgMzsKKyAgICBpZiAocHJlZml4KQorICAgICAgICBwcmVmaXhfbGVuICs9IHN0cmxlbihwcmVmaXgpOworICAgIG5ld19wcmVmaXggPSBQeU1lbV9NYWxsb2MocHJlZml4X2xlbik7CisgICAgaWYgKG5ld19wcmVmaXggPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbmV3X3ByZWZpeFswXSA9ICdcMCc7CisgICAgaWYgKHByZWZpeCkKKyAgICAgICAgc3RyY3B5KG5ld19wcmVmaXgsIHByZWZpeCk7CisgICAgaWYgKG5kaW0gPiAwKSB7CisgICAgICAgIC8qIEFkZCB0aGUgcHJlZml4ICIoc2hhcGVbMF0sc2hhcGVbMV0sLi4uLHNoYXBlW25kaW0tMV0pIiAqLworICAgICAgICBzdHJjYXQobmV3X3ByZWZpeCwgIigiKTsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IG5kaW07ICsraykgeworICAgICAgICAgICAgaWYgKGsgPCBuZGltLTEpIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGJ1ZiwgIiUiUFlfRk9STUFUX1NJWkVfVCJkLCIsIHNoYXBlW2tdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3ByaW50ZihidWYsICIlIlBZX0ZPUk1BVF9TSVpFX1QiZCkiLCBzaGFwZVtrXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJjYXQobmV3X3ByZWZpeCwgYnVmKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXN1bHQgPSBfY3R5cGVzX2FsbG9jX2Zvcm1hdF9zdHJpbmcobmV3X3ByZWZpeCwgc3VmZml4KTsKKyAgICBQeU1lbV9GcmVlKG5ld19wcmVmaXgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qCiAgIFB5Q1N0cnVjdFR5cGVfVHlwZSAtIGEgbWV0YSB0eXBlL2NsYXNzLiAgQ3JlYXRpbmcgYSBuZXcgY2xhc3MgdXNpbmcgdGhpcyBvbmUgYXMKICAgX19tZXRhY2xhc3NfXyB3aWxsIGNhbGwgdGhlIGNvbnRydWN0b3IgU3RydWN0VW5pb25UeXBlX25ldy4gIEl0IHJlcGxhY2VzIHRoZQogICB0cF9kaWN0IG1lbWJlciB3aXRoIGEgbmV3IGluc3RhbmNlIG9mIFN0Z0RpY3QsIGFuZCBpbml0aWFsaXplcyB0aGUgQwpAQCAtOTE5LDE0ICs5NTksMjEgQEAKIAogICAgIGlmIChwcm90bykgewogICAgICAgICBTdGdEaWN0T2JqZWN0ICppdGVtZGljdCA9IFB5VHlwZV9zdGdkaWN0KHByb3RvKTsKKyAgICAgICAgY29uc3QgY2hhciAqY3VycmVudF9mb3JtYXQ7CiAgICAgICAgIGFzc2VydChpdGVtZGljdCk7CiAgICAgICAgIC8qIElmIGl0ZW1kaWN0LT5mb3JtYXQgaXMgTlVMTCwgdGhlbiB0aGlzIGlzIGEgcG9pbnRlciB0byBhbgogICAgICAgICAgICBpbmNvbXBsZXRlIHR5cGUuICBXZSBjcmVhdGUgYSBnZW5lcmljIGZvcm1hdCBzdHJpbmcKICAgICAgICAgICAgJ3BvaW50ZXIgdG8gYnl0ZXMnIGluIHRoaXMgY2FzZS4gIFhYWCBCZXR0ZXIgd291bGQgYmUgdG8KICAgICAgICAgICAgZml4IHRoZSBmb3JtYXQgc3RyaW5nIGxhdGVyLi4uCiAgICAgICAgICovCi0gICAgICAgIHN0Z2RpY3QtPmZvcm1hdCA9IF9jdHlwZXNfYWxsb2NfZm9ybWF0X3N0cmluZygiJiIsCi0gICAgICAgICAgICAgICAgICAgICAgaXRlbWRpY3QtPmZvcm1hdCA/IGl0ZW1kaWN0LT5mb3JtYXQgOiAiQiIpOworICAgICAgICBjdXJyZW50X2Zvcm1hdCA9IGl0ZW1kaWN0LT5mb3JtYXQgPyBpdGVtZGljdC0+Zm9ybWF0IDogIkIiOworICAgICAgICBpZiAoaXRlbWRpY3QtPnNoYXBlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYW4gYXJyYXk6IHRoZSBzaGFwZSBuZWVkcyB0byBiZSBwcmVmaXhlZCAqLworICAgICAgICAgICAgc3RnZGljdC0+Zm9ybWF0ID0gX2N0eXBlc19hbGxvY19mb3JtYXRfc3RyaW5nX3dpdGhfc2hhcGUoCisgICAgICAgICAgICAgICAgaXRlbWRpY3QtPm5kaW0sIGl0ZW1kaWN0LT5zaGFwZSwgIiYiLCBjdXJyZW50X2Zvcm1hdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGdkaWN0LT5mb3JtYXQgPSBfY3R5cGVzX2FsbG9jX2Zvcm1hdF9zdHJpbmcoIiYiLCBjdXJyZW50X2Zvcm1hdCk7CisgICAgICAgIH0KICAgICAgICAgaWYgKHN0Z2RpY3QtPmZvcm1hdCA9PSBOVUxMKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTEzMjgsNyArMTM3NSw2IEBACiAgICAgbG9uZyBsZW5ndGg7CiAKICAgICBQeV9zc2l6ZV90IGl0ZW1zaXplLCBpdGVtYWxpZ247Ci0gICAgY2hhciBidWZbMzJdOwogCiAgICAgdHlwZWRpY3QgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMik7CiAgICAgaWYgKCF0eXBlZGljdCkKQEAgLTEzNjQsMTMgKzE0MTAsNyBAQAogICAgIH0KIAogICAgIGFzc2VydChpdGVtZGljdC0+Zm9ybWF0KTsKLSAgICBpZiAoaXRlbWRpY3QtPmZvcm1hdFswXSA9PSAnKCcpIHsKLSAgICAgICAgc3ByaW50ZihidWYsICIoJWxkLCIsIGxlbmd0aCk7Ci0gICAgICAgIHN0Z2RpY3QtPmZvcm1hdCA9IF9jdHlwZXNfYWxsb2NfZm9ybWF0X3N0cmluZyhidWYsIGl0ZW1kaWN0LT5mb3JtYXQrMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3ByaW50ZihidWYsICIoJWxkKSIsIGxlbmd0aCk7Ci0gICAgICAgIHN0Z2RpY3QtPmZvcm1hdCA9IF9jdHlwZXNfYWxsb2NfZm9ybWF0X3N0cmluZyhidWYsIGl0ZW1kaWN0LT5mb3JtYXQpOwotICAgIH0KKyAgICBzdGdkaWN0LT5mb3JtYXQgPSBfY3R5cGVzX2FsbG9jX2Zvcm1hdF9zdHJpbmcoTlVMTCwgaXRlbWRpY3QtPmZvcm1hdCk7CiAgICAgaWYgKHN0Z2RpY3QtPmZvcm1hdCA9PSBOVUxMKSB7CiAgICAgICAgIFB5X0RFQ1JFRigoUHlPYmplY3QgKilzdGdkaWN0KTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yNTI2LDExICsyNTY2LDkgQEAKIHN0YXRpYyBpbnQKIFB5Q0RhdGFfY2xlYXIoQ0RhdGFPYmplY3QgKnNlbGYpCiB7Ci0gICAgU3RnRGljdE9iamVjdCAqZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7Ci0gICAgYXNzZXJ0KGRpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgQ0RhdGFPYmplY3QgaW5zdGFuY2VzICovCiAgICAgUHlfQ0xFQVIoc2VsZi0+Yl9vYmplY3RzKTsKICAgICBpZiAoKHNlbGYtPmJfbmVlZHNmcmVlKQotICAgICAgICAmJiAoKHNpemVfdClkaWN0LT5zaXplID4gc2l6ZW9mKHNlbGYtPmJfdmFsdWUpKSkKKyAgICAgICAgJiYgX0NEYXRhT2JqZWN0X0hhc0V4dGVybmFsQnVmZmVyKHNlbGYpKQogICAgICAgICBQeU1lbV9GcmVlKHNlbGYtPmJfcHRyKTsKICAgICBzZWxmLT5iX3B0ciA9IE5VTEw7CiAgICAgUHlfQ0xFQVIoc2VsZi0+Yl9iYXNlKTsKQEAgLTMwNDIsMTAgKzMwODAsOCBAQAogUHlDRnVuY1B0cl9zZXRfcmVzdHlwZShQeUNGdW5jUHRyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb2IpCiB7CiAgICAgaWYgKG9iID09IE5VTEwpIHsKLSAgICAgICAgUHlfWERFQ1JFRihzZWxmLT5yZXN0eXBlKTsKLSAgICAgICAgc2VsZi0+cmVzdHlwZSA9IE5VTEw7Ci0gICAgICAgIFB5X1hERUNSRUYoc2VsZi0+Y2hlY2tlcik7Ci0gICAgICAgIHNlbGYtPmNoZWNrZXIgPSBOVUxMOworICAgICAgICBQeV9DTEVBUihzZWxmLT5yZXN0eXBlKTsKKyAgICAgICAgUHlfQ0xFQVIoc2VsZi0+Y2hlY2tlcik7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBpZiAob2IgIT0gUHlfTm9uZSAmJiAhUHlUeXBlX3N0Z2RpY3Qob2IpICYmICFQeUNhbGxhYmxlX0NoZWNrKG9iKSkgewpAQCAtMzA4OCwxMCArMzEyNCw4IEBACiAgICAgUHlPYmplY3QgKmNvbnZlcnRlcnM7CiAKICAgICBpZiAob2IgPT0gTlVMTCB8fCBvYiA9PSBQeV9Ob25lKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc2VsZi0+Y29udmVydGVycyk7Ci0gICAgICAgIHNlbGYtPmNvbnZlcnRlcnMgPSBOVUxMOwotICAgICAgICBQeV9YREVDUkVGKHNlbGYtPmFyZ3R5cGVzKTsKLSAgICAgICAgc2VsZi0+YXJndHlwZXMgPSBOVUxMOworICAgICAgICBQeV9DTEVBUihzZWxmLT5jb252ZXJ0ZXJzKTsKKyAgICAgICAgUHlfQ0xFQVIoc2VsZi0+YXJndHlwZXMpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGNvbnZlcnRlcnMgPSBjb252ZXJ0ZXJzX2Zyb21fYXJndHlwZXMob2IpOwogICAgICAgICBpZiAoIWNvbnZlcnRlcnMpCkBAIC0zMjk2LDIzICszMzMwLDM3IEBACiB7CiAgICAgY2hhciAqbmFtZTsKICAgICBpbnQgKCogYWRkcmVzcykodm9pZCk7CisgICAgUHlPYmplY3QgKmZ0dXBsZTsKICAgICBQeU9iamVjdCAqZGxsOwogICAgIFB5T2JqZWN0ICpvYmo7CiAgICAgUHlDRnVuY1B0ck9iamVjdCAqc2VsZjsKICAgICB2b2lkICpoYW5kbGU7CiAgICAgUHlPYmplY3QgKnBhcmFtZmxhZ3MgPSBOVUxMOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIoTyZPKXxPIiwgX2dldF9uYW1lLCAmbmFtZSwgJmRsbCwgJnBhcmFtZmxhZ3MpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPIiwgJmZ0dXBsZSwgJnBhcmFtZmxhZ3MpKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBpZiAocGFyYW1mbGFncyA9PSBQeV9Ob25lKQogICAgICAgICBwYXJhbWZsYWdzID0gTlVMTDsKIAotICAgIG9iaiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZGxsLCAiX2hhbmRsZSIpOwotICAgIGlmICghb2JqKQorICAgIGZ0dXBsZSA9IFB5U2VxdWVuY2VfVHVwbGUoZnR1cGxlKTsKKyAgICBpZiAoIWZ0dXBsZSkKKyAgICAgICAgLyogSGVyZSBmdHVwbGUgaXMgYSBib3Jyb3dlZCByZWZlcmVuY2UgKi8KICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoZnR1cGxlLCAiTyZPIiwgX2dldF9uYW1lLCAmbmFtZSwgJmRsbCkpIHsKKyAgICAgICAgUHlfREVDUkVGKGZ0dXBsZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG9iaiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZGxsLCAiX2hhbmRsZSIpOworICAgIGlmICghb2JqKSB7CisgICAgICAgIFB5X0RFQ1JFRihmdHVwbGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgICAgaWYgKCFQeUludF9DaGVjayhvYmopICYmICFQeUxvbmdfQ2hlY2sob2JqKSkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBfaGFuZGxlIGF0dHJpYnV0ZSBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYW4gaW50ZWdlciIpOworICAgICAgICBQeV9ERUNSRUYoZnR1cGxlKTsKICAgICAgICAgUHlfREVDUkVGKG9iaik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTMzMjEsNiArMzM2OSw3IEBACiAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGNvbnZlcnQgdGhlIF9oYW5kbGUgYXR0cmlidXRlIHRvIGEgcG9pbnRlciIpOworICAgICAgICBQeV9ERUNSRUYoZnR1cGxlKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC0zMzM1LDYgKzMzODQsNyBAQAogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiBvcmRpbmFsICVkIG5vdCBmb3VuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgKFdPUkQpKHNpemVfdCluYW1lKTsKKyAgICAgICAgUHlfREVDUkVGKGZ0dXBsZSk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICNlbHNlCkBAIC0zMzQ4LDkgKzMzOTgsMTIgQEAKICNlbHNlCiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgY3R5cGVzX2RsZXJyb3IoKSk7CiAjZW5kaWYKKyAgICAgICAgUHlfREVDUkVGKGZ0dXBsZSk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICNlbmRpZgorICAgIFB5X0lOQ1JFRihkbGwpOyAvKiBmb3IgS2VlcFJlZiAqLworICAgIFB5X0RFQ1JFRihmdHVwbGUpOwogICAgIGlmICghX3ZhbGlkYXRlX3BhcmFtZmxhZ3ModHlwZSwgcGFyYW1mbGFncykpCiAgICAgICAgIHJldHVybiBOVUxMOwogCkBAIC0zMzYzLDcgKzM0MTYsNiBAQAogCiAgICAgKih2b2lkICoqKXNlbGYtPmJfcHRyID0gYWRkcmVzczsKIAotICAgIFB5X0lOQ1JFRigoUHlPYmplY3QgKilkbGwpOyAvKiBmb3IgS2VlcFJlZiAqLwogICAgIGlmICgtMSA9PSBLZWVwUmVmKChDRGF0YU9iamVjdCAqKXNlbGYsIDAsIGRsbCkpIHsKICAgICAgICAgUHlfREVDUkVGKChQeU9iamVjdCAqKXNlbGYpOwogICAgICAgICByZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9jYWxscHJvYy5jIGIvTW9kdWxlcy9fY3R5cGVzL2NhbGxwcm9jLmMKaW5kZXggNzhjNmRjMC4uNjY0MmRjMyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2NhbGxwcm9jLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2NhbGxwcm9jLmMKQEAgLTI1LDggKzI1LDggQEAKIAogICAyLiBBZnRlciBzZXZlcmFsIGNoZWNrcywgX2J1aWxkX2NhbGxhcmdzKCkgaXMgY2FsbGVkIHdoaWNoIHJldHVybnMgYW5vdGhlcgogICB0dXBsZSAnY2FsbGFyZ3MnLiAgVGhpcyBtYXkgYmUgdGhlIHNhbWUgdHVwbGUgYXMgJ2luYXJncycsIGEgc2xpY2Ugb2YKLSAgJ2luYXJncycsIG9yIGEgY29tcGxldGVseSBmcmVzaCB0dXBsZSwgZGVwZW5kaW5nIG9uIHNldmVyYWwgdGhpbmdzIChpcyBpcyBhCi0gIENPTSBtZXRob2QsIGFyZSAncGFyYW1mbGFncycgYXZhaWxhYmxlKS4KKyAgJ2luYXJncycsIG9yIGEgY29tcGxldGVseSBmcmVzaCB0dXBsZSwgZGVwZW5kaW5nIG9uIHNldmVyYWwgdGhpbmdzIChpcyBpdCBhCisgIENPTSBtZXRob2Q/LCBhcmUgJ3BhcmFtZmxhZ3MnIGF2YWlsYWJsZT8pLgogCiAgIDMuIF9idWlsZF9jYWxsYXJncyBhbHNvIGNhbGN1bGF0ZXMgYml0YXJyYXlzIGNvbnRhaW5pbmcgaW5kZXhlcyBpbnRvCiAgIHRoZSBjYWxsYXJncyB0dXBsZSwgc3BlY2lmeWluZyBob3cgdG8gYnVpbGQgdGhlIHJldHVybiB2YWx1ZShzKSBvZgpAQCAtNzUsNiArNzUsMTAgQEAKIAogI2luY2x1ZGUgPGZmaS5oPgogI2luY2x1ZGUgImN0eXBlcy5oIgorI2lmZGVmIEhBVkVfQUxMT0NBX0gKKy8qIEFJWCBuZWVkcyBhbGxvY2EuaCBmb3IgYWxsb2NhKCkgKi8KKyNpbmNsdWRlIDxhbGxvY2EuaD4KKyNlbmRpZgogCiAjaWYgZGVmaW5lZChfREVCVUcpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pCiAvKiBEb24ndCB1c2Ugc3RydWN0dXJlZCBleGNlcHRpb24gaGFuZGxpbmcgb24gV2luZG93cyBpZiB0aGlzIGlzIGRlZmluZWQuCkBAIC00MDEsNiArNDA1LDExIEBACiB7CiAgICAgKnBkdyA9IHB0cnMtPkV4Y2VwdGlvblJlY29yZC0+RXhjZXB0aW9uQ29kZTsKICAgICAqcmVjb3JkID0gKnB0cnMtPkV4Y2VwdGlvblJlY29yZDsKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGNhdGNoIGJyZWFrcG9pbnQgZXhjZXB0aW9ucywgdGhleSBhcmUgdXNlZCB0byBhdHRhY2gKKyAgICAgKiBhIGRlYnVnZ2VyIHRvIHRoZSBwcm9jZXNzLgorICAgICAqLworICAgIGlmICgqcGR3ID09IEVYQ0VQVElPTl9CUkVBS1BPSU5UKQorICAgICAgICByZXR1cm4gRVhDRVBUSU9OX0NPTlRJTlVFX1NFQVJDSDsKICAgICByZXR1cm4gRVhDRVBUSU9OX0VYRUNVVEVfSEFORExFUjsKIH0KICNlbmRpZgpAQCAtODQ0LDExICs4NTMsMTEgQEAKICAgICAgICAgc3BhY2VbMF0gPSBlcnJubzsKICAgICAgICAgZXJybm8gPSB0ZW1wOwogICAgIH0KLSAgICBQeV9YREVDUkVGKGVycm9yX29iamVjdCk7CiAjaWZkZWYgV0lUSF9USFJFQUQKICAgICBpZiAoKGZsYWdzICYgRlVOQ0ZMQUdfUFlUSE9OQVBJKSA9PSAwKQogICAgICAgICBQeV9CTE9DS19USFJFQURTCiAjZW5kaWYKKyAgICBQeV9YREVDUkVGKGVycm9yX29iamVjdCk7CiAjaWZkZWYgTVNfV0lOMzIKICNpZm5kZWYgRE9OVF9VU0VfU0VICiAgICAgaWYgKGR3RXhjZXB0aW9uQ29kZSkgewpAQCAtMTc0MCw3ICsxNzQ5LDcgQEAKICAgICAgICAgb2JqLT5iX3NpemUgPSBzaXplOwogICAgICAgICBnb3RvIGRvbmU7CiAgICAgfQotICAgIGlmIChvYmotPmJfc2l6ZSA8PSBzaXplb2Yob2JqLT5iX3ZhbHVlKSkgeworICAgIGlmICghX0NEYXRhT2JqZWN0X0hhc0V4dGVybmFsQnVmZmVyKG9iaikpIHsKICAgICAgICAgLyogV2UgYXJlIGN1cnJlbnRseSB1c2luZyB0aGUgb2JqZWN0cyBkZWZhdWx0IGJ1ZmZlciwgYnV0IGl0CiAgICAgICAgICAgIGlzbid0IGxhcmdlIGVub3VnaCBhbnkgbW9yZS4gKi8KICAgICAgICAgdm9pZCAqcHRyID0gUHlNZW1fTWFsbG9jKHNpemUpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2NmaWVsZC5jIGIvTW9kdWxlcy9fY3R5cGVzL2NmaWVsZC5jCmluZGV4IGM3MDUzZWYuLjc2YzcyZjggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9jZmllbGQuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvY2ZpZWxkLmMKQEAgLTQzMSwxMiArNDMxLDggQEAKICNkZWZpbmUgTE9XX0JJVCh4KSAgKCh4KSAmIDB4RkZGRikKICNkZWZpbmUgTlVNX0JJVFMoeCkgKCh4KSA+PiAxNikKIAotLyogVGhpcyBzZWVtcyBub3JlIGEgY29tcGlsZXIgaXNzdWUgdGhhbiBhIFdpbmRvd3Mvbm9uLVdpbmRvd3Mgb25lICovCi0jaWZkZWYgTVNfV0lOMzIKLSMgIGRlZmluZSBCSVRfTUFTSyhzaXplKSAoKDEgPDwgTlVNX0JJVFMoc2l6ZSkpLTEpCi0jZWxzZQotIyAgZGVmaW5lIEJJVF9NQVNLKHNpemUpICgoMUxMIDw8IE5VTV9CSVRTKHNpemUpKS0xKQotI2VuZGlmCisvKiBEb2Vzbid0IHdvcmsgaWYgTlVNX0JJVFMoc2l6ZSkgPT0gMCwgYnV0IGl0IG5ldmVyIGhhcHBlbnMgaW4gU0VUKCkgY2FsbC4gKi8KKyNkZWZpbmUgQklUX01BU0sodHlwZSwgc2l6ZSkgKCgoKCh0eXBlKTEgPDwgKE5VTV9CSVRTKHNpemUpIC0gMSkpIC0gMSkgPDwgMSkgKyAxKQogCiAvKiBUaGlzIG1hY3JvIENIQU5HRVMgdGhlIGZpcnN0IHBhcmFtZXRlciBJTiBQTEFDRS4gRm9yIHByb3BlciBzaWduIGhhbmRsaW5nLAogICAgd2UgbXVzdCBmaXJzdCBzaGlmdCBsZWZ0LCB0aGVuIHJpZ2h0LgpAQCAtNDQ4LDEwICs0NDQsMTAgQEAKICAgICB9CiAKIC8qIFRoaXMgbWFjcm8gUkVUVVJOUyB0aGUgZmlyc3QgcGFyYW1ldGVyIHdpdGggdGhlIGJpdCBmaWVsZCBDSEFOR0VELiAqLwotI2RlZmluZSBTRVQoeCwgdiwgc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBTRVQodHlwZSwgeCwgdiwgc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIChOVU1fQklUUyhzaXplKSA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAoICggeCAmIH4oQklUX01BU0soc2l6ZSkgPDwgTE9XX0JJVChzaXplKSkgKSB8ICggKHYgJiBCSVRfTUFTSyhzaXplKSkgPDwgTE9XX0JJVChzaXplKSApICkgXAotICAgICA6IHYpCisgICAgICggKCAodHlwZSl4ICYgfihCSVRfTUFTSyh0eXBlLCBzaXplKSA8PCBMT1dfQklUKHNpemUpKSApIHwgKCAoKHR5cGUpdiAmIEJJVF9NQVNLKHR5cGUsIHNpemUpKSA8PCBMT1dfQklUKHNpemUpICkgKSBcCisgICAgIDogKHR5cGUpdikKIAogLyogYnl0ZSBzd2FwcGluZyBtYWNyb3MgKi8KICNkZWZpbmUgU1dBUF8yKHYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTUyMyw3ICs1MTksNyBAQAogICAgIGxvbmcgdmFsOwogICAgIGlmIChnZXRfbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAqKHNpZ25lZCBjaGFyICopcHRyID0gKHNpZ25lZCBjaGFyKVNFVCgqKHNpZ25lZCBjaGFyICopcHRyLCAoc2lnbmVkIGNoYXIpdmFsLCBzaXplKTsKKyAgICAqKHNpZ25lZCBjaGFyICopcHRyID0gU0VUKHNpZ25lZCBjaGFyLCAqKHNpZ25lZCBjaGFyICopcHRyLCB2YWwsIHNpemUpOwogICAgIF9SRVQodmFsdWUpOwogfQogCkBAIC01NDIsOCArNTM4LDcgQEAKICAgICB1bnNpZ25lZCBsb25nIHZhbDsKICAgICBpZiAoZ2V0X3Vsb25nKHZhbHVlLCAmdmFsKSA8IDApCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgICoodW5zaWduZWQgY2hhciAqKXB0ciA9ICh1bnNpZ25lZCBjaGFyKVNFVCgqKHVuc2lnbmVkIGNoYXIqKXB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIHNob3J0KXZhbCwgc2l6ZSk7CisgICAgKih1bnNpZ25lZCBjaGFyICopcHRyID0gU0VUKHVuc2lnbmVkIGNoYXIsICoodW5zaWduZWQgY2hhciopcHRyLCB2YWwsIHNpemUpOwogICAgIF9SRVQodmFsdWUpOwogfQogCkBAIC01NjQsNyArNTU5LDcgQEAKICAgICBpZiAoZ2V0X2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7Ci0gICAgeCA9IFNFVCh4LCAoc2hvcnQpdmFsLCBzaXplKTsKKyAgICB4ID0gU0VUKHNob3J0LCB4LCB2YWwsIHNpemUpOwogICAgIG1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOwogICAgIF9SRVQodmFsdWUpOwogfQpAQCAtNTc5LDcgKzU3NCw3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIG1lbWNweSgmZmllbGQsIHB0ciwgc2l6ZW9mKGZpZWxkKSk7CiAgICAgZmllbGQgPSBTV0FQXzIoZmllbGQpOwotICAgIGZpZWxkID0gU0VUKGZpZWxkLCAoc2hvcnQpdmFsLCBzaXplKTsKKyAgICBmaWVsZCA9IFNFVChzaG9ydCwgZmllbGQsIHZhbCwgc2l6ZSk7CiAgICAgZmllbGQgPSBTV0FQXzIoZmllbGQpOwogICAgIG1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CiAgICAgX1JFVCh2YWx1ZSk7CkBAIC02MTIsNyArNjA3LDcgQEAKICAgICBpZiAoZ2V0X3Vsb25nKHZhbHVlLCAmdmFsKSA8IDApCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIG1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOwotICAgIHggPSBTRVQoeCwgKHVuc2lnbmVkIHNob3J0KXZhbCwgc2l6ZSk7CisgICAgeCA9IFNFVCh1bnNpZ25lZCBzaG9ydCwgeCwgdmFsLCBzaXplKTsKICAgICBtZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKICAgICBfUkVUKHZhbHVlKTsKIH0KQEAgLTYyNiw3ICs2MjEsNyBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBtZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOwogICAgIGZpZWxkID0gU1dBUF8yKGZpZWxkKTsKLSAgICBmaWVsZCA9IFNFVChmaWVsZCwgKHVuc2lnbmVkIHNob3J0KXZhbCwgc2l6ZSk7CisgICAgZmllbGQgPSBTRVQodW5zaWduZWQgc2hvcnQsIGZpZWxkLCB2YWwsIHNpemUpOwogICAgIGZpZWxkID0gU1dBUF8yKGZpZWxkKTsKICAgICBtZW1jcHkocHRyLCAmZmllbGQsIHNpemVvZihmaWVsZCkpOwogICAgIF9SRVQodmFsdWUpOwpAQCAtNjYwLDcgKzY1NSw3IEBACiAgICAgaWYgKGdldF9sb25nKHZhbHVlLCAmdmFsKSA8IDApCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIG1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOwotICAgIHggPSBTRVQoeCwgKGludCl2YWwsIHNpemUpOworICAgIHggPSBTRVQoaW50LCB4LCB2YWwsIHNpemUpOwogICAgIG1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOwogICAgIF9SRVQodmFsdWUpOwogfQpAQCAtNjc0LDcgKzY2OSw3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIG1lbWNweSgmZmllbGQsIHB0ciwgc2l6ZW9mKGZpZWxkKSk7CiAgICAgZmllbGQgPSBTV0FQX0lOVChmaWVsZCk7Ci0gICAgZmllbGQgPSBTRVQoZmllbGQsIChpbnQpdmFsLCBzaXplKTsKKyAgICBmaWVsZCA9IFNFVChpbnQsIGZpZWxkLCB2YWwsIHNpemUpOwogICAgIGZpZWxkID0gU1dBUF9JTlQoZmllbGQpOwogICAgIG1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CiAgICAgX1JFVCh2YWx1ZSk7CkBAIC03NjEsNyArNzU2LDcgQEAKICAgICBpZiAoZ2V0X3Vsb25nKHZhbHVlLCAmdmFsKSA8IDApCiAgICAgICAgIHJldHVybiAgTlVMTDsKICAgICBtZW1jcHkoJngsIHB0ciwgc2l6ZW9mKHgpKTsKLSAgICB4ID0gU0VUKHgsICh1bnNpZ25lZCBpbnQpdmFsLCBzaXplKTsKKyAgICB4ID0gU0VUKHVuc2lnbmVkIGludCwgeCwgdmFsLCBzaXplKTsKICAgICBtZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKICAgICBfUkVUKHZhbHVlKTsKIH0KQEAgLTc3NCw3ICs3NjksNyBAQAogICAgIGlmIChnZXRfdWxvbmcodmFsdWUsICZ2YWwpIDwgMCkKICAgICAgICAgcmV0dXJuICBOVUxMOwogICAgIG1lbWNweSgmZmllbGQsIHB0ciwgc2l6ZW9mKGZpZWxkKSk7Ci0gICAgZmllbGQgPSAodW5zaWduZWQgaW50KVNFVChmaWVsZCwgKHVuc2lnbmVkIGludCl2YWwsIHNpemUpOworICAgIGZpZWxkID0gU0VUKHVuc2lnbmVkIGludCwgZmllbGQsICh1bnNpZ25lZCBpbnQpdmFsLCBzaXplKTsKICAgICBmaWVsZCA9IFNXQVBfSU5UKGZpZWxkKTsKICAgICBtZW1jcHkocHRyLCAmZmllbGQsIHNpemVvZihmaWVsZCkpOwogICAgIF9SRVQodmFsdWUpOwpAQCAtODA4LDcgKzgwMyw3IEBACiAgICAgaWYgKGdldF9sb25nKHZhbHVlLCAmdmFsKSA8IDApCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIG1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOwotICAgIHggPSBTRVQoeCwgdmFsLCBzaXplKTsKKyAgICB4ID0gU0VUKGxvbmcsIHgsIHZhbCwgc2l6ZSk7CiAgICAgbWVtY3B5KHB0ciwgJngsIHNpemVvZih4KSk7CiAgICAgX1JFVCh2YWx1ZSk7CiB9CkBAIC04MjIsNyArODE3LDcgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgbWVtY3B5KCZmaWVsZCwgcHRyLCBzaXplb2YoZmllbGQpKTsKICAgICBmaWVsZCA9IFNXQVBfTE9ORyhmaWVsZCk7Ci0gICAgZmllbGQgPSAobG9uZylTRVQoZmllbGQsIHZhbCwgc2l6ZSk7CisgICAgZmllbGQgPSBTRVQobG9uZywgZmllbGQsIHZhbCwgc2l6ZSk7CiAgICAgZmllbGQgPSBTV0FQX0xPTkcoZmllbGQpOwogICAgIG1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CiAgICAgX1JFVCh2YWx1ZSk7CkBAIC04NTYsNyArODUxLDcgQEAKICAgICBpZiAoZ2V0X3Vsb25nKHZhbHVlLCAmdmFsKSA8IDApCiAgICAgICAgIHJldHVybiAgTlVMTDsKICAgICBtZW1jcHkoJngsIHB0ciwgc2l6ZW9mKHgpKTsKLSAgICB4ID0gU0VUKHgsIHZhbCwgc2l6ZSk7CisgICAgeCA9IFNFVCh1bnNpZ25lZCBsb25nLCB4LCB2YWwsIHNpemUpOwogICAgIG1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOwogICAgIF9SRVQodmFsdWUpOwogfQpAQCAtODcwLDcgKzg2NSw3IEBACiAgICAgICAgIHJldHVybiAgTlVMTDsKICAgICBtZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOwogICAgIGZpZWxkID0gU1dBUF9MT05HKGZpZWxkKTsKLSAgICBmaWVsZCA9ICh1bnNpZ25lZCBsb25nKVNFVChmaWVsZCwgdmFsLCBzaXplKTsKKyAgICBmaWVsZCA9IFNFVCh1bnNpZ25lZCBsb25nLCBmaWVsZCwgdmFsLCBzaXplKTsKICAgICBmaWVsZCA9IFNXQVBfTE9ORyhmaWVsZCk7CiAgICAgbWVtY3B5KHB0ciwgJmZpZWxkLCBzaXplb2YoZmllbGQpKTsKICAgICBfUkVUKHZhbHVlKTsKQEAgLTkwNSw3ICs5MDAsNyBAQAogICAgIGlmIChnZXRfbG9uZ2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7Ci0gICAgeCA9IFNFVCh4LCB2YWwsIHNpemUpOworICAgIHggPSBTRVQoUFlfTE9OR19MT05HLCB4LCB2YWwsIHNpemUpOwogICAgIG1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOwogICAgIF9SRVQodmFsdWUpOwogfQpAQCAtOTE5LDcgKzkxNCw3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIG1lbWNweSgmZmllbGQsIHB0ciwgc2l6ZW9mKGZpZWxkKSk7CiAgICAgZmllbGQgPSBTV0FQXzgoZmllbGQpOwotICAgIGZpZWxkID0gKFBZX0xPTkdfTE9ORylTRVQoZmllbGQsIHZhbCwgc2l6ZSk7CisgICAgZmllbGQgPSBTRVQoUFlfTE9OR19MT05HLCBmaWVsZCwgdmFsLCBzaXplKTsKICAgICBmaWVsZCA9IFNXQVBfOChmaWVsZCk7CiAgICAgbWVtY3B5KHB0ciwgJmZpZWxkLCBzaXplb2YoZmllbGQpKTsKICAgICBfUkVUKHZhbHVlKTsKQEAgLTk1Miw3ICs5NDcsNyBAQAogICAgIGlmIChnZXRfdWxvbmdsb25nKHZhbHVlLCAmdmFsKSA8IDApCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIG1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOwotICAgIHggPSBTRVQoeCwgdmFsLCBzaXplKTsKKyAgICB4ID0gU0VUKFBZX0xPTkdfTE9ORywgeCwgdmFsLCBzaXplKTsKICAgICBtZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKICAgICBfUkVUKHZhbHVlKTsKIH0KQEAgLTk2Niw3ICs5NjEsNyBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBtZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOwogICAgIGZpZWxkID0gU1dBUF84KGZpZWxkKTsKLSAgICBmaWVsZCA9ICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpU0VUKGZpZWxkLCB2YWwsIHNpemUpOworICAgIGZpZWxkID0gU0VUKHVuc2lnbmVkIFBZX0xPTkdfTE9ORywgZmllbGQsIHZhbCwgc2l6ZSk7CiAgICAgZmllbGQgPSBTV0FQXzgoZmllbGQpOwogICAgIG1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CiAgICAgX1JFVCh2YWx1ZSk7CkBAIC0xMDAzLDEyICs5OTgsOCBAQAogICAgIGxvbmcgZG91YmxlIHg7CiAKICAgICB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2YWx1ZSk7Ci0gICAgaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgIiBmbG9hdCBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICBpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAgICAgbWVtY3B5KHB0ciwgJngsIHNpemVvZihsb25nIGRvdWJsZSkpOwogICAgIF9SRVQodmFsdWUpOwogfQpAQCAtMTAyNywxMiArMTAxOCw4IEBACiAgICAgZG91YmxlIHg7CiAKICAgICB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2YWx1ZSk7Ci0gICAgaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgIiBmbG9hdCBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICBpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAgICAgbWVtY3B5KHB0ciwgJngsIHNpemVvZihkb3VibGUpKTsKICAgICBfUkVUKHZhbHVlKTsKIH0KQEAgLTEwNTEsMTIgKzEwMzgsOCBAQAogICAgIGRvdWJsZSB4OwogCiAgICAgeCA9IFB5RmxvYXRfQXNEb3VibGUodmFsdWUpOwotICAgIGlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICIgZmxvYXQgZXhwZWN0ZWQgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQogI2lmZGVmIFdPUkRTX0JJR0VORElBTgogICAgIGlmIChfUHlGbG9hdF9QYWNrOCh4LCAodW5zaWduZWQgY2hhciAqKXB0ciwgMSkpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTA4MywxMiArMTA2Niw4IEBACiAgICAgZmxvYXQgeDsKIAogICAgIHggPSAoZmxvYXQpUHlGbG9hdF9Bc0RvdWJsZSh2YWx1ZSk7Ci0gICAgaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgIiBmbG9hdCBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICBpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAgICAgbWVtY3B5KHB0ciwgJngsIHNpemVvZih4KSk7CiAgICAgX1JFVCh2YWx1ZSk7CiB9CkBAIC0xMTA3LDEyICsxMDg2LDggQEAKICAgICBmbG9hdCB4OwogCiAgICAgeCA9IChmbG9hdClQeUZsb2F0X0FzRG91YmxlKHZhbHVlKTsKLSAgICBpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiIGZsb2F0IGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgdmFsdWUtPm9iX3R5cGUtPnRwX25hbWUpOworICAgIGlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KICNpZmRlZiBXT1JEU19CSUdFTkRJQU4KICAgICBpZiAoX1B5RmxvYXRfUGFjazQoeCwgKHVuc2lnbmVkIGNoYXIgKilwdHIsIDEpKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTE3MTIsOSArMTY4Nyw5IEBACiAvKgogI2RlZmluZSBDSEFSX0FMSUdOIChzaXplb2Yoc19jaGFyKSAtIHNpemVvZihjaGFyKSkKICNkZWZpbmUgU0hPUlRfQUxJR04gKHNpemVvZihzX3Nob3J0KSAtIHNpemVvZihzaG9ydCkpCi0jZGVmaW5lIElOVF9BTElHTiAoc2l6ZW9mKHNfaW50KSAtIHNpemVvZihpbnQpKQogI2RlZmluZSBMT05HX0FMSUdOIChzaXplb2Yoc19sb25nKSAtIHNpemVvZihsb25nKSkKICovCisjZGVmaW5lIElOVF9BTElHTiAoc2l6ZW9mKHNfaW50KSAtIHNpemVvZihpbnQpKQogI2RlZmluZSBGTE9BVF9BTElHTiAoc2l6ZW9mKHNfZmxvYXQpIC0gc2l6ZW9mKGZsb2F0KSkKICNkZWZpbmUgRE9VQkxFX0FMSUdOIChzaXplb2Yoc19kb3VibGUpIC0gc2l6ZW9mKGRvdWJsZSkpCiAjZGVmaW5lIExPTkdET1VCTEVfQUxJR04gKHNpemVvZihzX2xvbmdfZG91YmxlKSAtIHNpemVvZihsb25nIGRvdWJsZSkpCkBAIC0xNzU2LDggKzE3MzEsOCBAQAogZmZpX3R5cGUgZmZpX3R5cGVfdWludDE2ID0geyAyLCAyLCBGRklfVFlQRV9VSU5UMTYgfTsKIGZmaV90eXBlIGZmaV90eXBlX3NpbnQxNiA9IHsgMiwgMiwgRkZJX1RZUEVfU0lOVDE2IH07CiAKLWZmaV90eXBlIGZmaV90eXBlX3VpbnQzMiA9IHsgNCwgNCwgRkZJX1RZUEVfVUlOVDMyIH07Ci1mZmlfdHlwZSBmZmlfdHlwZV9zaW50MzIgPSB7IDQsIDQsIEZGSV9UWVBFX1NJTlQzMiB9OworZmZpX3R5cGUgZmZpX3R5cGVfdWludDMyID0geyA0LCBJTlRfQUxJR04sIEZGSV9UWVBFX1VJTlQzMiB9OworZmZpX3R5cGUgZmZpX3R5cGVfc2ludDMyID0geyA0LCBJTlRfQUxJR04sIEZGSV9UWVBFX1NJTlQzMiB9OwogCiBmZmlfdHlwZSBmZmlfdHlwZV91aW50NjQgPSB7IDgsIExPTkdfTE9OR19BTElHTiwgRkZJX1RZUEVfVUlOVDY0IH07CiBmZmlfdHlwZSBmZmlfdHlwZV9zaW50NjQgPSB7IDgsIExPTkdfTE9OR19BTElHTiwgRkZJX1RZUEVfU0lOVDY0IH07CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvY3R5cGVzLmggYi9Nb2R1bGVzL19jdHlwZXMvY3R5cGVzLmgKaW5kZXggNTk2NDBjYy4uYjg4Y2Y0ZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2N0eXBlcy5oCisrKyBiL01vZHVsZXMvX2N0eXBlcy9jdHlwZXMuaApAQCAtMTUzLDYgKzE1Myw3IEBACiBleHRlcm4gUHlUeXBlT2JqZWN0IFB5Q0RhdGFfVHlwZTsKICNkZWZpbmUgQ0RhdGFPYmplY3RfQ2hlY2tFeGFjdCh2KSAgICAgICAoKHYpLT5vYl90eXBlID09ICZQeUNEYXRhX1R5cGUpCiAjZGVmaW5lIENEYXRhT2JqZWN0X0NoZWNrKHYpICAgICAgICAgICAgUHlPYmplY3RfVHlwZUNoZWNrKHYsICZQeUNEYXRhX1R5cGUpCisjZGVmaW5lIF9DRGF0YU9iamVjdF9IYXNFeHRlcm5hbEJ1ZmZlcih2KSAgKCh2KS0+Yl9wdHIgIT0gKGNoYXIgKikmKHYpLT5iX3ZhbHVlKQogCiBleHRlcm4gUHlUeXBlT2JqZWN0IFB5Q1NpbXBsZVR5cGVfVHlwZTsKICNkZWZpbmUgUHlDU2ltcGxlVHlwZU9iamVjdF9DaGVja0V4YWN0KHYpICAgICAgICgodiktPm9iX3R5cGUgPT0gJlB5Q1NpbXBsZVR5cGVfVHlwZSkKQEAgLTQzMyw2ICs0MzQsOSBAQAogCiBleHRlcm4gUHlPYmplY3QgKlB5Q0RhdGFfRnJvbUJhc2VPYmooUHlPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpiYXNlLCBQeV9zc2l6ZV90IGluZGV4LCBjaGFyICphZHIpOwogZXh0ZXJuIGNoYXIgKl9jdHlwZXNfYWxsb2NfZm9ybWF0X3N0cmluZyhjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKnN1ZmZpeCk7CitleHRlcm4gY2hhciAqX2N0eXBlc19hbGxvY19mb3JtYXRfc3RyaW5nX3dpdGhfc2hhcGUoaW50IG5kaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQeV9zc2l6ZV90ICpzaGFwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqc3VmZml4KTsKIAogZXh0ZXJuIGludCBfY3R5cGVzX3NpbXBsZV9pbnN0YW5jZShQeU9iamVjdCAqb2JqKTsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS5kaWZmIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS5kaWZmCmluZGV4IDdhZmEwZWQuLjgyOGEyNzcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkuZGlmZgorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpLmRpZmYKQEAgLTEsMjQgKzEsMjYgQEAKLWRpZmYgLXVyTiBsaWJmZmkub3JpZy9jb25maWd1cmUgbGliZmZpL2NvbmZpZ3VyZQotLS0tIGxpYmZmaS5vcmlnL2NvbmZpZ3VyZQkyMDEwLTAzLTE5IDE4OjI5OjU0LjU4ODQ5OTg2MiArMDEwMAotKysrIGxpYmZmaS9jb25maWd1cmUJMjAxMC0wMy0xOSAxODozMjowOS4xMTM0OTk0NzkgKzAxMDAKLUBAIC0xMTIyOCw2ICsxMTIyOCw5IEBACi0gICBpPzg2LSotc29sYXJpczIuMVswLTldKikKLSAJVEFSR0VUPVg4Nl82NDsgVEFSR0VURElSPXg4NgorZGlmZiAtciAtTiAtdSBsaWJmZmkub3JpZy9hdXRvbTR0ZS5jYWNoZS9vdXRwdXQuMCBsaWJmZmkvYXV0b200dGUuY2FjaGUvb3V0cHV0LjAKK2RpZmYgLXIgLU4gLXUgbGliZmZpLm9yaWcvY29uZmlndXJlIGxpYmZmaS9jb25maWd1cmUKKy0tLSBsaWJmZmkub3JpZy9jb25maWd1cmUJMjAxMy0wMy0xNyAxNTozNzo1MC4wMDAwMDAwMDAgLTA3MDAKKysrKyBsaWJmZmkvY29uZmlndXJlCTIwMTMtMDMtMTggMTU6MTE6MzkuNjExNTc1MTYzIC0wNzAwCitAQCAtMTMzNjgsNiArMTMzNjgsMTAgQEAKKyAJZmkKICAJOzsKKyAKICsgIGkqODYtKi1udG8tcW54KikKICsgICAgICAgIFRBUkdFVD1YODY7IFRBUkdFVERJUj14ODYKICsgICAgICAgIDs7Ci0gICBpPzg2LSotKikKLSAJVEFSR0VUPVg4NjsgVEFSR0VURElSPXg4NgorKworICAgeDg2XzY0LSotZGFyd2luKikKKyAJVEFSR0VUPVg4Nl9EQVJXSU47IFRBUkdFVERJUj14ODYKICAJOzsKLUBAIC0xMTI0NSwxMiArMTEyNDgsMTIgQEAKK0BAIC0xMzQyNiwxMiArMTM0MzAsMTIgQEAKICAJOzsKICAKLSAgIG1pcHMtc2dpLWlyaXg1LiogfCBtaXBzLXNnaS1pcml4Ni4qKQorICAgbWlwcy1zZ2ktaXJpeDUuKiB8IG1pcHMtc2dpLWlyaXg2LiogfCBtaXBzKi0qLXJ0ZW1zKikKIC0JVEFSR0VUPU1JUFM7IFRBUkdFVERJUj1taXBzCiArCVRBUkdFVD1NSVBTX0lSSVg7IFRBUkdFVERJUj1taXBzCiAgCTs7Ci0gICBtaXBzKi0qLWxpbnV4KikKKyAgIG1pcHMqLSotbGludXgqIHwgbWlwcyotKi1vcGVuYnNkKikKICAJIyBTdXBwb3J0IDEyOC1iaXQgbG9uZyBkb3VibGUgZm9yIE5ld0FCSS4KICAJSEFWRV9MT05HX0RPVUJMRT0nZGVmaW5lZChfX21pcHM2NCknCiAtCVRBUkdFVD1NSVBTOyBUQVJHRVRESVI9bWlwcwpAQCAtMjYsOCArMjgsOCBAQAogIAk7OwogIAogICAgcG93ZXJwYyotKi1saW51eCogfCBwb3dlcnBjLSotc3lzdiopCi1AQCAtMTEzMDcsNyArMTEzMTAsNyBAQAotICAgYXNfZm5fZXJyb3IgIlwibGliZmZpIGhhcyBub3QgYmVlbiBwb3J0ZWQgdG8gJGhvc3QuXCIiICIkTElORU5PIiA1CitAQCAtMTM0OTEsNyArMTM0OTUsNyBAQAorICAgYXNfZm5fZXJyb3IgJD8gIlwibGliZmZpIGhhcyBub3QgYmVlbiBwb3J0ZWQgdG8gJGhvc3QuXCIiICIkTElORU5PIiA1CiAgZmkKICAKIC0gaWYgdGVzdCB4JFRBUkdFVCA9IHhNSVBTOyB0aGVuCkBAIC0zNSw3ICszNyw3IEBACiAgICBNSVBTX1RSVUU9CiAgICBNSVBTX0ZBTFNFPScjJwogIGVsc2UKLUBAIC0xMjQyMiw2ICsxMjQyNSwxMiBAQAorQEAgLTE0ODYyLDYgKzE0ODY2LDEyIEBACiAgYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIGluY2x1ZGUvTWFrZWZpbGUgaW5jbHVkZS9mZmkuaCBNYWtlZmlsZSB0ZXN0c3VpdGUvTWFrZWZpbGUgbWFuL01ha2VmaWxlIGxpYmZmaS5wYyIKICAKICAKQEAgLTQ4LDQ0ICs1MCw0NSBAQAogIGNhdCA+Y29uZmNhY2hlIDw8XF9BQ0VPRgogICMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQogICMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotQEAgLTEzNTIxLDYgKzEzNTMwLDggQEAKK0BAIC0xNjA0Nyw2ICsxNjA1Nyw4IEBACiAgICAgICJ0ZXN0c3VpdGUvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdGVzdHN1aXRlL01ha2VmaWxlIiA7OwogICAgICAibWFuL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIG1hbi9NYWtlZmlsZSIgOzsKICAgICAgImxpYmZmaS5wYyIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBsaWJmZmkucGMiIDs7CiArICAgICJpbmNsdWRlL2ZmaV9jb21tb24uaCIpIENPTkZJR19MSU5LUz0iJENPTkZJR19MSU5LUyBpbmNsdWRlL2ZmaV9jb21tb24uaDppbmNsdWRlL2ZmaV9jb21tb24uaCIgOzsKICsgICAgImZmaWNvbmZpZy5weSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBmZmljb25maWcucHkiIDs7CiAgCi0gICAqKSBhc19mbl9lcnJvciAiaW52YWxpZCBhcmd1bWVudDogXGAkYWNfY29uZmlnX3RhcmdldCciICIkTElORU5PIiA1OzsKKyAgICopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIGFyZ3VtZW50OiBcYCRhY19jb25maWdfdGFyZ2V0JyIgIiRMSU5FTk8iIDU7OwogICAgZXNhYwotZGlmZiAtdXJOIGxpYmZmaS5vcmlnL2NvbmZpZ3VyZS5hYyBsaWJmZmkvY29uZmlndXJlLmFjCi0tLS0gbGliZmZpLm9yaWcvY29uZmlndXJlLmFjCTIwMTAtMDMtMTkgMTg6Mjc6NDQuOTg4NDk4NTg1ICswMTAwCi0rKysgbGliZmZpL2NvbmZpZ3VyZS5hYwkyMDEwLTAzLTE5IDE4OjMxOjI5LjI1MjUwNTE3OCArMDEwMAorZGlmZiAtciAtTiAtdSBsaWJmZmkub3JpZy9jb25maWd1cmUuYWMgbGliZmZpL2NvbmZpZ3VyZS5hYworLS0tIGxpYmZmaS5vcmlnL2NvbmZpZ3VyZS5hYwkyMDEzLTAzLTE3IDE1OjM3OjUwLjAwMDAwMDAwMCAtMDcwMAorKysrIGxpYmZmaS9jb25maWd1cmUuYWMJMjAxMy0wMy0xOCAxNToxMToxMS4zOTI5ODkxMzYgLTA3MDAKIEBAIC0xLDQgKzEsNyBAQAogIGRubCBQcm9jZXNzIHRoaXMgd2l0aCBhdXRvY29uZiB0byBjcmVhdGUgY29uZmlndXJlCiArIwotKyMgZmlsZSBmcm9tIGxpYmZmaSAtIHNsaWdodGx5IHBhdGNoZWQgZm9yIGN0eXBlcworKyMgZmlsZSBmcm9tIGxpYmZmaSAtIHNsaWdodGx5IHBhdGNoZWQgZm9yIFB5dGhvbidzIGN0eXBlcwogKyMKICAKLSBBQ19QUkVSRVEoMi42MykKKyBBQ19QUkVSRVEoMi42OCkKICAKLUBAIC05MSw2ICs5NCw5IEBACi0gICBpPzg2LSotc29sYXJpczIuMVtbMC05XV0qKQotIAlUQVJHRVQ9WDg2XzY0OyBUQVJHRVRESVI9eDg2CitAQCAtMTQ2LDYgKzE0OSwxMCBAQAorIAlmaQkgIAogIAk7OworIAogKyAgaSo4Ni0qLW50by1xbngqKSAKICsgICAgICAgIFRBUkdFVD1YODY7IFRBUkdFVERJUj14ODYKICsgICAgICAgIDs7Ci0gICBpPzg2LSotKikKLSAJVEFSR0VUPVg4NjsgVEFSR0VURElSPXg4NgorKworICAgeDg2XzY0LSotZGFyd2luKikKKyAJVEFSR0VUPVg4Nl9EQVJXSU47IFRBUkdFVERJUj14ODYKICAJOzsKLUBAIC0xMDgsMTIgKzExNCwxMiBAQAorQEAgLTIwNCwxMiArMjExLDEyIEBACiAgCTs7CiAgCi0gICBtaXBzLXNnaS1pcml4NS4qIHwgbWlwcy1zZ2ktaXJpeDYuKikKKyAgIG1pcHMtc2dpLWlyaXg1LiogfCBtaXBzLXNnaS1pcml4Ni4qIHwgbWlwcyotKi1ydGVtcyopCiAtCVRBUkdFVD1NSVBTOyBUQVJHRVRESVI9bWlwcwogKwlUQVJHRVQ9TUlQU19JUklYOyBUQVJHRVRESVI9bWlwcwogIAk7OwotICAgbWlwcyotKi1saW51eCopCisgICBtaXBzKi0qLWxpbnV4KiB8IG1pcHMqLSotb3BlbmJzZCopCiAgCSMgU3VwcG9ydCAxMjgtYml0IGxvbmcgZG91YmxlIGZvciBOZXdBQkkuCiAgCUhBVkVfTE9OR19ET1VCTEU9J2RlZmluZWQoX19taXBzNjQpJwogLQlUQVJHRVQ9TUlQUzsgVEFSR0VURElSPW1pcHMKQEAgLTkzLDE2ICs5NiwxNiBAQAogIAk7OwogIAogICAgcG93ZXJwYyotKi1saW51eCogfCBwb3dlcnBjLSotc3lzdiopCi1AQCAtMTcwLDcgKzE3Niw3IEBACitAQCAtMjY5LDcgKzI3Niw3IEBACiAgICBBQ19NU0dfRVJST1IoWyJsaWJmZmkgaGFzIG5vdCBiZWVuIHBvcnRlZCB0byAkaG9zdC4iXSkKICBmaQogIAogLUFNX0NPTkRJVElPTkFMKE1JUFMsIHRlc3QgeCRUQVJHRVQgPSB4TUlQUykKICtBTV9DT05ESVRJT05BTChNSVBTLFtleHByIHgkVEFSR0VUIDogJ3hNSVBTJyA+IC9kZXYvbnVsbF0pCisgQU1fQ09ORElUSU9OQUwoQkZJTiwgdGVzdCB4JFRBUkdFVCA9IHhCRklOKQogIEFNX0NPTkRJVElPTkFMKFNQQVJDLCB0ZXN0IHgkVEFSR0VUID0geFNQQVJDKQogIEFNX0NPTkRJVElPTkFMKFg4NiwgdGVzdCB4JFRBUkdFVCA9IHhYODYpCi0gQU1fQ09ORElUSU9OQUwoWDg2X0ZSRUVCU0QsIHRlc3QgeCRUQVJHRVQgPSB4WDg2X0ZSRUVCU0QpCi1AQCAtNDAxLDQgKzQwNyw4IEBACitAQCAtNTY3LDQgKzU3NCw4IEBACiAgCiAgQUNfQ09ORklHX0ZJTEVTKGluY2x1ZGUvTWFrZWZpbGUgaW5jbHVkZS9mZmkuaCBNYWtlZmlsZSB0ZXN0c3VpdGUvTWFrZWZpbGUgbWFuL01ha2VmaWxlIGxpYmZmaS5wYykKICAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvLmdpdGlnbm9yZSBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWY3NmFjCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMjEgQEAKKy5saWJzCisuZGVwcworKi5vCisqLmxvCisuZGlyc3RhbXAKKyoubGEKK01ha2VmaWxlCitjb25maWcubG9nCitjb25maWcuc3RhdHVzCisqfgorZmZpY29uZmlnLmgKK2luY2x1ZGUvZmZpLmgKK2luY2x1ZGUvZmZpdGFyZ2V0LmgKK2xpYmZmaS5wYworbGlidG9vbAorc3RhbXAtaDEKK2xpYmZmaSpnegorYXV0b200dGUuY2FjaGUKK2xpYmZmaS54Y29kZXByb2oveGN1c2VyZGF0YQorbGliZmZpLnhjb2RlcHJvai9wcm9qZWN0Lnhjd29ya3NwYWNlCitpb3MvCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpLy50cmF2aXMueW1sIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS8udHJhdmlzLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTZhNDI1Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS8udHJhdmlzLnltbApAQCAtMCwwICsxLDggQEAKK2xhbmd1YWdlOiBjCitjb21waWxlcjoKKyAgLSBnY2MKKyAgLSBjbGFuZworCitiZWZvcmVfc2NyaXB0OiBzdWRvIGFwdC1nZXQgaW5zdGFsbCBkZWphZ251CisKK3NjcmlwdDogLi9jb25maWd1cmUgJiYgbWFrZSAmJiBtYWtlIGNoZWNrCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL0NoYW5nZUxvZyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvQ2hhbmdlTG9nCmluZGV4IDAwYmE3ZWYuLmUwYjA1N2MgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvQ2hhbmdlTG9nCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvQ2hhbmdlTG9nCkBAIC0xLDggKzEsMTM2MCBAQAorMjAxMy0wMy0xNyAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQG1veGllbG9naWMuY29tPgorCisJKiBSRUFETUU6IFVwZGF0ZSBmb3IgMy4wLjEzLgorCSogY29uZmlndXJlLmFjOiBEaXR0by4KKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKwkqIGRvYy8qOiBVcGRhdGUgdmVyc2lvbi4KKworMjAxMy0wMy0xNyAgRGF2ZSBLb3JuICA8ZGF2ZS5rb3JuLmN5Z3dpbkBnbWFpbC5jb20+CisKKwkqIHNyYy9jbG9zdXJlcy5jIChpc19lbXV0cmFtcF9lbmFibGVkCisJWyFGRklfTU1BUF9FWEVDX0VNVVRSQU1QX1BBWF0pOiBNb3ZlIGRlZmF1bHQgZGVmaW5pdGlvbiBvdXRzaWRlCisJZW5jbG9zaW5nICNpZiBzY29wZS4KKworMjAxMy0wMy0xNyAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQG1veGllbG9naWMuY29tPgorCisJKiBjb25maWd1cmUuYWM6IE9ubHkgbW9kaWZ5IHRvb2xleGVjZGlyIGluIGNlcnRhaW4gY2FzZXMuCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisKKzIwMTMtMDMtMTYgIEdpbGxlcyBUYWxpcyAgPGdpbGxlcy50YWxpc0BnbWFpbC5jb20+CisKKwkqIHNyYy9wb3dlcnBjL2ZmaS5jIChmZmlfcHJlcF9hcmdzX1NZU1YpOiBEb24ndCB1c2UKKwlmcGFyZ19jb3VudCxldGMgb24gX19OT19GUFJTX18gdGFyZ2V0cy4KKworMjAxMy0wMy0xNiAgQWxhbiBIb3VyaWhhbmUgIDxhbGFuaEBmYWlybGl0ZS5jby51az4KKworCSogc3JjL202OGsvc3lzdi5TIChlcGlsb2d1ZSk6IERvbid0IHVzZSBleHRiIGluc3RydWN0aW9uIG9uCisJbTY4MDAwMCBtYWNoaW5lcy4KKworMjAxMy0wMy0xNiAgQWxleCBHYXlub3IgPGFsZXguZ2F5bm9yQGdtYWlsLmNvbT4KKworCSogc3JjL3g4Ni9mZmkuYyAoZmZpX3ByZXBfY2lmX21hY2hkZXApOiBBbHdheXMgYWxpZ24gc3RhY2suCisKKzIwMTMtMDMtMTMgIE1hcmtvcyBDaGFuZHJhcyA8bWFya29zLmNoYW5kcmFzQGltZ3RlYy5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogQWRkIHN1cHBvcnQgZm9yIEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcyBNZXRhLgorCSogTWFrZWZpbGUuYW06IExpa2V3aXNlLgorCSogUkVBRE1FOiBBZGQgSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzIE1ldGEgZGV0YWlscy4KKwkqIHNyYy9tZXRhZy9mZmkuYzogTmV3LgorCSogc3JjL21ldGFnL2ZmaXRhcmdldC5oOiBMaWtld2lzZS4KKwkqIHNyYy9tZXRhZy9zeXN2LlM6IExpa2V3aXNlLgorCisyMDEzLTAyLTI0ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBsaW51eC1tNjhrLm9yZz4KKworCSogZG9jL2xpYmZmaS50ZXhpIChTdHJ1Y3R1cmVzKTogRml4IG1pc3NpbmcgY2F0ZWdvcnkgYXJndW1lbnQgb2YKKwlAZGVmdHAuCisKKzIwMTMtMDItMTEgIEFudGhvbnkgR3JlZW4gPGdyZWVuQG1veGllbG9naWMuY29tPgorCisJKiBjb25maWd1cmUuYWM6IFVwZGF0ZSByZWxlYXNlIG51bWJlciB0byAzLjAuMTIuCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisJKiBSRUFETUU6IFVwZGF0ZSByZWxlYXNlIGluZm8uCisKKzIwMTMtMDItMTAgIEFudGhvbnkgR3JlZW4gPGdyZWVuQG1veGllbG9naWMuY29tPgorCisJKiBSRUFETUU6IEFkZCBNb3hpZS4KKwkqIHNyYy9tb3hpZS9mZmkuYzogQ3JlYXRlZC4KKwkqIHNyYy9tb3hpZS9lYWJpLlM6IENyZWF0ZWQuCisJKiBzcmMvbW94aWUvZmZpdGFyZ2V0Lmg6IENyZWF0ZWQuCisJKiBNYWtlZmlsZS5hbSAobm9kaXN0X2xpYmZmaV9sYV9TT1VSQ0VTKTogQWRkIE1veGllLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCisJKiBjb25maWd1cmUuYWM6IEFkZCBNb3hpZS4KKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9odWdlX3N0cnVjdC5jOiBEaXNhYmxlIGZvcm1hdCBzdHJpbmcKKwl3YXJuaW5ncyBmb3IgbW94aWUqLSotZWxmIHRlc3RzLgorCisyMDEzLTAyLTEwICBBbnRob255IEdyZWVuIDxncmVlbkBtb3hpZWxvZ2ljLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKExUTERGTEFHUyk6IEZpeCByZWZlcmVuY2UuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsdC4KKworMjAxMy0wMi0xMCAgQW50aG9ueSBHcmVlbiA8Z3JlZW5AbW94aWVsb2dpYy5jb20+CisKKwkqIFJFQURNRTogVXBkYXRlIHN1cHBvcnRlZCBwbGF0Zm9ybXMuICBVcGRhdGUgdGVzdCByZXN1bHRzIGxpbmsuCisKKzIwMTMtMDItMDkgIEFudGhvbnkgR3JlZW4gPGdyZWVuQG1veGllbG9naWMuY29tPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVnaW50LmM6IFJlbW92ZSBmb3JjZWQgLU8yLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL21hbnkyLmMgKGZvbyk6IFJlbW92ZSBHQ0Npc20uCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmZpdGVzdC5oOiBBZGQgZGVmYXVsdCBQUkl1UFRSIGRlZmluaXRpb24uCisKKwkqIHNyYy9zcGFyYy92OC5TIChmZmlfY2xvc3VyZV92OCk6IEltcG9ydCBhbmNpZW50IHVsb25nbG9uZworCWNsb3N1cmUgcmV0dXJuIHR5cGUgZml4IGRldmVsb3BlZCBieSBNYXJ0aW4gdi4gTMO2d2lzIGZvciBjcHl0aG9uCisJZm9yay4KKworMjAxMy0wMi0wOCAgQW5kcmVhcyBUb2JsZXIgIDxhbmRyZWFzdEBmZ3puZXQuY2g+CisKKwkqIHNyYy9wb3dlcnBjL2ZmaS5jIChmZmlfcHJlcF9jaWZfbWFjaGRlcCk6IEZpeCBzbWFsbCBzdHJ1Y3QKKwlzdXBwb3J0LgorCSogc3JjL3Bvd2VycGMvc3lzdi5TOiBEaXR0by4KKworMjAxMy0wMi0wOCAgQW50aG9ueSBHcmVlbiA8Z3JlZW5AbW94aWVsb2dpYy5jb20+CisKKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbG9uZ2RvdWJsZS5jOiBSZW1vdmUgeGZhaWwgZm9yCisJYXJtKi0qLSouCisKKzIwMTMtMDItMDggIEFudGhvbnkgR3JlZW4gPGdyZWVuQG1veGllbG9naWMuY29tPgorCisJKiBzcmMvc3BhcmMvZmZpLmMgKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKTogRml4IGNhY2hlIGZsdXNoaW5nIGZvciBHQ0MuCisKKzIwMTMtMDItMDggIE1hdHRoaWFzIEtsb3NlICA8ZG9rb0B1YnVudHUuY29tPgorCisJKiBtYW4vZmZpX3ByZXBfY2lmLjM6IENsZWFuIHVwIGZvciBkZWJpYW4gbGludGVyLgorCisyMDEzLTAyLTA4ICBQZXRlciBCZXJnbmVyICA8YmVyZ25lckB2bmV0LmlibS5jb20+CisKKwkqIHNyYy9wb3dlcnBjL2ZmaS5jIChmZmlfcHJlcF9hcmdzX1NZU1YpOiBBY2NvdW50IGZvciBGUCBhcmdzIHB1c2hlZAorCW9uIHRoZSBzdGFjay4KKworMjAxMy0wMi0wOCAgQW50aG9ueSBHcmVlbiA8Z3JlZW5AbW94aWVsb2dpYy5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIG1pc3NpbmcgZmlsZXMuCisJKiB0ZXN0c3VpdGUvTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBEaXR0by4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0LgorCisyMDEzLTAyLTA4ICBBbnRob255IEdyZWVuIDxncmVlbkBtb3hpZWxvZ2ljLmNvbT4KKworCSogY29uZmlndXJlLmFjOiBNb3ZlIHNwYXJjIGFzbSBjb25maWcgY2hlY2tzIHRvIHdpdGhpbiBmdW5jdGlvbnMKKwlmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHN1biB0b29scy4KKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKwkqIHNyYy9zcGFyYy9mZmkuYyAoZmZpX3ByZXBfY2xvc3VyZV9sb2MpOiBGbHVzaCBjYWNoZSBvbiB2OQorCXN5c3RlbXMuCisJKiBzcmMvc3BhcmMvdjguUyAoZmZpX2ZsdXNoX2ljYWNoZSk6IEltcGxlbWVudCBhIHNwYXJjIHY5IGNhY2hlCisJZmx1c2hlci4KKworMjAxMy0wMi0wOCAgTmF0aGFuIFJvc3NpIDxuYXRoYW4ucm9zc2lAeGlsaW54LmNvbT4KKworCSogc3JjL21pY3JvYmxhemUvZmZpLmMgKGZmaV9jbG9zdXJlX2NhbGxfU1lTVik6IEZpeCBoYW5kbGluZyBvZgorCXNtYWxsIGJpZy1lbmRpYW4gc3RydWN0dXJlcy4KKwkoZmZpX3ByZXBfYXJncyk6IERpdHRvLgorCisyMDEzLTAyLTA3ICBBbnRob255IEdyZWVuIDxncmVlbkBtb3hpZWxvZ2ljLmNvbT4KKworCSogc3JjL3NwYXJjL3Y4LlMgKGZmaV9jYWxsX3Y4KTogRml4IHR5cG8gZnJvbSBsYXN0IHBhdGNoCisJKGVmZmVjdGl2ZWx5IGhpZGluZyBmZmlfY2FsbF92OCkuCisKKzIwMTMtMDItMDcgIEFudGhvbnkgR3JlZW4gPGdyZWVuQG1veGllbG9naWMuY29tPgorCisJKiBjb25maWd1cmUuYWM6IFVwZGF0ZSBidWcgcmVwb3J0aW5nIGFkZHJlc3MuCisJKiBjb25maWd1cmUuaW46IFJlYnVpbGQuCisKKwkqIHNyYy9zcGFyYy92OC5TIChmZmlfZmx1c2hfaWNhY2hlKTogT3V0LW9mLWxpbmUgY2FjaGUgZmx1c2hlciBmb3IKKwlTdW4gY29tcGlsZXIuCisJKiBzcmMvc3BhcmMvZmZpLmMgKGZmaV9jYWxsKTogUmVtb3ZlIHdhcm5pbmcuCisJQ2FsbCBmZmlfZmx1c2hfaWNhY2hlIGZvciBub24tR0NDIGJ1aWxkcy4KKwkoZmZpX3ByZXBfY2xvc3VyZV9sb2MpOiBVc2UgZmZpX2ZsdXNoX2ljYWNoZS4KKworCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgbGlidG9vbC1sZGZsYWdzLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCisJKiBsaWJ0b29sLWxkZmxhZ3M6IE5ldyBmaWxlLgorCisyMDEzLTAyLTA3ICBEYW5pZWwgU2NoZXBsZXIgPGRzY2hlcGxlckBnbWFpbC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogQ29ycmVjdGx5IGlkZW50aWZ5IHgzMiBzeXN0ZW1zIGFzIDY0LWJpdC4KKwkqIG00L2xpYnRvb2wubTQ6IFJlbW92ZSBsaWJ0b29sIGV4cHIgZXJyb3IuCisJKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbHQuCisKKzIwMTMtMDItMDcgIEFudGhvbnkgR3JlZW4gPGdyZWVuQG1veGllbG9naWMuY29tPgorCisJKiBjb25maWd1cmUuYWM6IEZpeCBHQ0MgdXNhZ2UgdGVzdC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKwkqIFJFQURNRTogTWVudGlvbiBMTFZNL0dDQyB4ODZfNjQgaXNzdWUuCisJKiB0ZXN0c3VpdGUvTWFrZWZpbGUuaW46IFJlYnVpbHQuCisKKzIwMTMtMDItMDcgIEFudGhvbnkgR3JlZW4gPGdyZWVuQG1veGllbG9naWMuY29tPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2RvdWJsZV92YS5jIChtYWluKTogUmVwbGFjZSAvLyBzdHlsZQorCWNvbW1lbnRzIHdpdGggLyogKi8gZm9yIHhsYyBjb21waWxlci4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJldF9sYXJnZS5jIChtYWluKTogRGl0dG8uCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RyZXRfbGFyZ2UyLmMgKG1haW4pOiBEaXR0by4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0MS5jIChtYWluKTogRGl0dG8uCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvaHVnZV9zdHJ1Y3QuYyAobWFpbik6IERpdHRvLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Zsb2F0X3ZhLmMgKG1haW4pOiBEaXR0by4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfc3RydWN0X3ZhMS5jIChtYWluKTogRGl0dG8uCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3BvaW50ZXJfc3RhY2suYyAobWFpbik6IERpdHRvLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19wb2ludGVyLmMgKG1haW4pOiBEaXR0by4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbG9uZ2RvdWJsZV92YS5jIChtYWluKTogRGl0dG8uCisKKzIwMTMtMDItMDYgIEFudGhvbnkgR3JlZW4gPGdyZWVuQG1veGllbG9naWMuY29tPgorCisJKiBtYW4vZmZpX3ByZXBfY2lmLjM6IENsZWFuIHVwIGZvciBkZWJpYW4gbGludGlhbiBjaGVja2VyLgorCisyMDEzLTAyLTA2ICBBbnRob255IEdyZWVuIDxncmVlbkBtb3hpZWxvZ2ljLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKHBrZ2NvbmZpZ2Rpcik6IEFkZCBtaXNzaW5nIHBrZ2NvbmZpZyBpbnN0YWxsIGJpdHMuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworMjAxMy0wMi0wMiAgTWFyayBIIFdlYXZlciA8bWh3QG5ldHJpcy5vcmc+CisKKwkqIHNyYy94ODYvZmZpNjQuYyAoZmZpX2NhbGwpOiBTaWduLWV4dGVuZCBpbnRlZ2VyIGFyZ3VtZW50cyBwYXNzZWQKKwl2aWEgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycy4KKworMjAxMy0wMS0yMSAgTmF0aGFuIFJvc3NpIDxuYXRoYW4ucm9zc2lAeGlsaW54LmNvbT4KKworCSogUkVBRE1FOiBBZGQgTWljcm9CbGF6ZSBkZXRhaWxzLgorCSogTWFrZWZpbGUuYW06IEFkZCBNaWNyb0JsYXplIHN1cHBvcnQuCisJKiBjb25maWd1cmUuYWM6IExpa2V3aXNlLgorCSogc3JjL21pY3JvYmxhemUvZmZpLmM6IE5ldy4KKwkqIHNyYy9taWNyb2JsYXplL2ZmaXRhcmdldC5oOiBMaWtld2lzZS4KKwkqIHNyYy9taWNyb2JsYXplL3N5c3YuUzogTGlrZXdpc2UuCisKKzIwMTMtMDEtMjEgIE5hdGhhbiBSb3NzaSA8bmF0aGFuLnJvc3NpQHhpbGlueC5jb20+CisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvcmV0dXJuX3VjLmM6IEZpeGVkIGlzc3VlLgorCisyMDEzLTAxLTIxICBDaHJpcyBaYW5rZWwgICA8Y2hyaXNAemFua2VsLm5ldD4KKworCSogUkVBRE1FOiBBZGQgWHRlbnNhIHN1cHBvcnQuCisJKiBNYWtlZmlsZS5hbTogTGlrZXdpc2UuCisJKiBjb25maWd1cmUuYWM6IExpa2V3aXNlLgorCSogTWFrZWZpbGUuaW4gUmVnZW5lcmF0ZS4KKwkqIGNvbmZpZ3VyZTogTGlrZXdpc2UuCisJKiBzcmMvcHJlcF9jaWYuYzogSGFuZGxlIFh0ZW5zYS4KKwkqIHNyYy94dGVuc2E6IE5ldyBkaXJlY3RvcnkuCisJKiBzcmMveHRlbnNhL2ZmaS5jOiBOZXcgZmlsZS4KKwkqIHNyYy94dGVuc2EvZmZpdGFyZ2V0Lmg6IERpdHRvLgorCSogc3JjL3h0ZW5zYS9zeXN2LlM6IERpdHRvLgorCisyMDEzLTAxLTExICBBbnRob255IEdyZWVuICA8Z3JlZW5AbW94aWVsb2dpYy5jb20+CisKKwkqIHNyYy9wb3dlcnBjL2ZmaV9kYXJ3aW4uYyAoZmZpX3ByZXBfYXJncyk6IFJlcGxhY2UgLy8gc3R5bGUKKwljb21tZW50cyB3aXRoIC8qICovIGZvciB4bGMgY29tcGlsZXIuCisJKiBzcmMvcG93ZXJwYy9haXguUyAoZmZpX2NhbGxfQUlYKTogRGl0dG8uCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmZpdGVzdC5oIChhbGxvY2F0ZV9tbWFwKTogRGVsZXRlCisJZGVwcmVjYXRlZCBpbmxpbmUgZnVuY3Rpb24uCisJKiB0ZXN0c3VpdGUvbGliZmZpLnNwZWNpYWwvZmZpdGVzdGN4eC5oOiBEaXR0by4KKwkqIFJFQURNRTogQWRkIHVwZGF0ZSBmb3IgQUlYIHN1cHBvcnQuCisKKzIwMTMtMDEtMTEgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBtb3hpZWxvZ2ljLmNvbT4KKworCSogY29uZmlndXJlLmFjOiBSb2J1c3RpZnkgcGMgcmVsYXRpdmUgcmVsb2MgY2hlY2suCisJKiBtNC9heF9jY19tYXhvcHQubTQ6IERvbid0IC1tYWxpZ24tZG91YmxlLiAgVGhpcyBpcyBhbiBBQkkKKwljaGFuZ2luZyBvcHRpb24gZm9yIDMyLWJpdCB4ODYuCisJKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbHQuCisJKiBSRUFETUU6IFVwZGF0ZSBzdXBwb3J0ZWQgdGFyZ2V0IGxpc3QuCisKKzIwMTMtMDEtMTAgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBtb3hpZWxvZ2ljLmNvbT4KKworCSogUkVBRE1FICh0ZXN0ZWQpOiBBZGQgQ29tcGlsZXIgY29sdW1uIHRvIHRhYmxlLgorCisyMDEzLTAxLTEwICBBbnRob255IEdyZWVuICA8Z3JlZW5AbW94aWVsb2dpYy5jb20+CisKKwkqIHNyYy94ODYvZmZpNjQuYyAoc3RydWN0IHJlZ2lzdGVyX2FyZ3MpOiBNYWtlIHNzZSBhcnJheSBhbmQgYXJyYXkKKwlvZiB1bmlvbnMgZm9yIHN1bnBybyBjb21waWxlciBjb21wYXRpYmlsaXR5LgorCisyMDEzLTAxLTEwICBBbnRob255IEdyZWVuICA8Z3JlZW5AbW94aWVsb2dpYy5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogVGVzdCB0YXJnZXQgcGxhdGZvcm0gc2l6ZV90IHNpemUuICBIYW5kbGUgYm90aCAzMgorCWFuZCA2NC1iaXQgYnVpbGRzIGZvciB4ODZfNjQtKiBhbmQgaT84Ni0qIHRhcmdldHMgKGFsbG93aW5nIGZvcgorCUNGTEFHIG9wdGlvbiB0byBjaGFuZ2UgZGVmYXVsdCBzZXR0aW5ncykuCisJKiBjb25maWd1cmUsIGFjbG9jYWwubTQ6IFJlYnVpbHQuCisKKzIwMTMtMDEtMTAgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBtb3hpZWxvZ2ljLmNvbT4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5zcGVjaWFsL3NwZWNpYWwuZXhwOiBPbmx5IHJ1biBleGNlcHRpb24KKwloYW5kbGluZyB0ZXN0cyB3aGVuIHVzaW5nIEdOVSBjb21waWxlci4KKworCSogbTQvYXhfY29tcGlsZXJfdmVuZG9yLm00OiBOZXcgZmlsZS4KKwkqIGNvbmZpZ3VyZS5hYzogVGVzdCBmb3IgY29tcGlsZXIgdmVuZG9yIGFuZCBkb24ndCB1c2UKKwlBWF9DRkxBR1NfV0FSTl9BTEwgd2l0aCB0aGUgc3VuIGNvbXBpbGVyLgorCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWx0LgorCisyMDEzLTAxLTEwICBBbnRob255IEdyZWVuICA8Z3JlZW5AbW94aWVsb2dpYy5jb20+CisKKwkqIGluY2x1ZGUvZmZpX2NvbW1vbi5oOiBEb24ndCB1c2UgR0NDaXNtcyB0byBkZWZpbmUgdHlwZXMgd2hlbgorCWJ1aWxkaW5nIHdpdGggdGhlIFNVTlBSTyBjb21waWxlci4KKworMjAxMy0wMS0xMCAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQG1veGllbG9naWMuY29tPgorCisJKiBjb25maWd1cmUuYWM6IFB1dCBsb2NhbC5leHAgaW4gdGhlIHJpZ2h0IHBsYWNlLgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCisJKiBzcmMveDg2L2ZmaS5jOiBVcGRhdGUgY29tbWVudCBhYm91dCByZWdwYXJtIGZ1bmN0aW9uIGF0dHJpYnV0ZXMuCisJKiBzcmMveDg2L3N5c3YuUyAoZmZpX2Nsb3N1cmVfU1lTVik6IFRoZSBTVU5QUk8gY29tcGlsZXIgcmVxdWlyZXMKKwl0aGF0IGFsbCBmdW5jdGlvbiBhcmd1bWVudHMgYmUgcGFzc2VkIG9uIHRoZSBzdGFjayAobm8gcmVncGFybQorCXN1cHBvcnQpLgorCisyMDEzLTAxLTA4ICBBbnRob255IEdyZWVuICA8Z3JlZW5AbW94aWVsb2dpYy5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogR2VuZXJhdGUgbG9jYWwuZXhwLiAgVGhpcyBzZXRzIENDX0ZPUl9UQVJHRVQKKwl3aGVuIHdlIGFyZSB1c2luZyB0aGUgdmVuZG9yIGNvbXBpbGVyLgorCSogdGVzdHN1aXRlL01ha2VmaWxlLmFtIChFWFRSQV9ERUpBR05VX1NJVEVfQ09ORklHKTogUG9pbnQgdG8KKwkuLi9sb2NhbC5leHAuCisJKiBjb25maWd1cmUsIHRlc3RzdWl0ZS9NYWtlZmlsZS5pbjogUmVidWlsdC4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2NhbGwuZXhwOiBSdW4gdGVzdHMgd2l0aCBkaWZmZXJlbnQKKwlvcHRpb25zLCBkZXBlbmRpbmcgb24gd2hldGhlciBvciBub3Qgd2UgYXJlIHVzaW5nIGdjYyBvciB0aGUKKwl2ZW5kb3IgY29tcGlsZXIuCisJKiB0ZXN0c3VpdGUvbGliL2xpYmZmaS5leHAgKGxpYmZmaS1pbml0KTogU2V0IHVzaW5nX2djYyBiYXNlZCBvbgorCXdoZXRoZXIgb3Igbm90IHdlIGFyZSBidWlsZGluZy90ZXN0aW5nIHdpdGggZ2NjLgorCisyMDEzLTAxLTA4ICBBbnRob255IEdyZWVuICA8Z3JlZW5AbW94aWVsb2dpYy5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogU3dpdGNoIHg4NiBzb2xhcmlzIHRhcmdldCB0byBYODYgYnkgZGVmYXVsdC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKworMjAxMy0wMS0wOCAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQG1veGllbG9naWMuY29tPgorCisJKiBjb25maWd1cmUuYWM6IEZpeCB0ZXN0IGZvciByZWFkLW9ubHkgZWhfZnJhbWUuCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisKKzIwMTMtMDEtMDggIEFudGhvbnkgR3JlZW4gIDxncmVlbkBtb3hpZWxvZ2ljLmNvbT4KKworCSogc3JjL3g4Ni9zeXN2LlMsIHNyYy94ODYvdW5peDY0LlM6IE9ubHkgZW1pdCBEV0FSRiB1bndpbmQgaW5mbworCXdoZW4gYnVpbGRpbmcgd2l0aCB0aGUgR05VIHRvb2xjaGFpbi4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9mZml0ZXN0LmggKENIRUNLKTogRml4IGZvciBTb2xhcmlzIHZlbmRvcgorCWNvbXBpbGVyLgorCisyMDEzLTAxLTA3ICBUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+CisKKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdWNoYXJfdmEuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3VzaG9ydF92YS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC92YV8xLmM6IFRlc3RzdWl0ZSBmaXhlcy4KKworMjAxMy0wMS0wNyAgVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgorCisJKiBzcmMvbTY4ay9mZmkuYyAoQ0lGX0ZMQUdTX1NJTlQ4LCBDSUZfRkxBR1NfU0lOVDE2KTogRGVmaW5lLgorCShmZmlfcHJlcF9jaWZfbWFjaGRlcCk6IEZpeCA4LWJpdCBhbmQgMTYtYml0IHNpZ25lZCBjYWxscy4KKwkqIHNyYy9tNjhrL3N5c3YuUyAoZmZpX2NhbGxfU1lTViwgZmZpX2Nsb3N1cmVfU1lTVik6IERpdHRvLgorCisyMDEzLTAxLTA0ICBBbnRob255IEdyZWVuICA8Z3JlZW5AbW94aWVsb2dpYy5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChBTV9DRkxBR1MpOiBEb24ndCBhdXRvbWF0aWNhbGx5IGFkZCAtZmV4Y2VwdGlvbnMKKwlhbmQgLVdhbGwuICBUaGlzIGlzIHNldCBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCBhZnRlciB0ZXN0aW5nIGZvcgorCUdDQy4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0LgorCisyMDEzLTAxLTAyICByb2ZsMHIgPGh0dHBzOi8vZ2l0aHViLmNvbS9yb2ZsMHI+CisKKwkqIHNyYy9wb3dlcnBjL2ZmaS5jIChmZmlfcHJlcF9jaWZfbWFjaGRlcCk6IEZpeCBidWlsZCBlcnJvciBvbiBwcGMKKwl3aGVuIGxvbmcgZG91YmxlID09IGRvdWJsZS4KKworMjAxMy0wMS0wMiAgUmVpbmkgVXJiYW4gIDxydXJiYW5AeC1yYXkuYXQ+CisKKwkqIE1ha2VmaWxlLmFtIChsaWJmZmlfbGFfTERGTEFHUyk6IEFkZCAtbm8tdW5kZWZpbmVkIHRvIExERkxBR1MKKwkocmVxdWlyZWQgZm9yIHNoYXJlZCBsaWJzIG9uIGN5Z3dpbi9taW5ndykuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsdC4KKworMjAxMi0xMC0zMSAgQWxhbiBNb2RyYSAgPGFtb2RyYUBnbWFpbC5jb20+CisKKwkqIHNyYy9wb3dlcnBjL2xpbnV4NjRfY2xvc3VyZS5TOiBBZGQgbmV3IEFCSSBzdXBwb3J0LgorCSogc3JjL3Bvd2VycGMvbGludXg2NC5TOiBMaWtld2lzZS4KKworMjAxMi0xMC0zMCAgTWFnbnVzIEdyYW5iZXJnICA8em9ycnlAZ2VudG9vLm9yZz4KKwkgICAgUGF2ZWwgTGFidXNoZXYgIDxwYXZlbC5sYWJ1c2hldkBydW5ib3gucnU+CisKKwkqIGNvbmZpZ3VyZS5hYzogTmV3IG9wdGlvbnMgcGF4X2VtdXRyYW1wCisJKiBjb25maWd1cmUsIGZmaWNvbmZpZy5oLmluOiBSZWdlbmVyYXRlZAorCSogc3JjL2Nsb3N1cmVzLmM6IE5ldyBmdW5jdGlvbiBlbXV0cmFtcF9lbmFibGVkX2NoZWNrKCkgYW5kCisJY2hlY2tzLgorCisyMDEyLTEwLTMwICBGcmVkZXJpY2sgQ2hldW5nICA8ZnJlZGVyaWNrLmNoZXVuZ0BnbWFpbC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogRW5hYmxlIEZGSV9NQVBfRVhFQ19XUklUIGZvciBEYXJ3aW4gMTIgKG1vdW50YWluCisJbGlvbikgYW5kIGZ1dHVyZSB2ZXJzaW9uLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCisyMDEyLTEwLTMwICBKYW1lcyBHcmVlbmhhbGdoICA8amFtZXMuZ3JlZW5oYWxnaCBhdCBhcm0uY29tPgorICAgICAgICAgICAgTWFyY3VzIFNoYXdjcm9mdCAgPG1hcmN1cy5zaGF3Y3JvZnQgYXQgYXJtLmNvbT4KKworICAgICAgICAqIFJFQURNRTogQWRkIGRldGFpbHMgb2YgYWFyY2g2NCBwb3J0LgorICAgICAgICAqIHNyYy9hYXJjaDY0L2ZmaS5jOiBOZXcuCisgICAgICAgICogc3JjL2FhcmNoNjQvZmZpdGFyZ2V0Lmg6IExpa2V3aXNlLgorICAgICAgICAqIHNyYy9hYXJjaDY0L3N5c3YuUzogTGlrZXdpc2UuCisJKiBNYWtlZmlsZS5hbTogU3VwcG9ydCBhYXJjaDY0LgorCSogY29uZmlndXJlLmFjOiBTdXBwb3J0IGFhcmNoNjQuCisJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlOiBSZWJ1aWx0LgorCisyMDEyLTEwLTMwICBKYW1lcyBHcmVlbmhhbGdoICA8amFtZXMuZ3JlZW5oYWxnaCBhdCBhcm0uY29tPgorICAgICAgICAgICAgTWFyY3VzIFNoYXdjcm9mdCAgPG1hcmN1cy5zaGF3Y3JvZnQgYXQgYXJtLmNvbT4KKworICAgICAgICAqIHRlc3RzdWl0ZS9saWIvbGliZmZpLmV4cDogQWRkIHN1cHBvcnQgZm9yIGFhcmNoNjQuCisgICAgICAgICogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19zdHJ1Y3RfdmExLmM6IE5ldy4KKyAgICAgICAgKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3VjaGFyX3ZhLmM6IExpa2V3aXNlLgorICAgICAgICAqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdWludF92YS5jOiBMaWtld2lzZS4KKyAgICAgICAgKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3Vsb25nX3ZhLmM6IExpa2V3aXNlLgorICAgICAgICAqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdXNob3J0X3ZhLmM6IExpa2V3aXNlLgorICAgICAgICAqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0MTEuYzogTGlrZXdpc2UuCisgICAgICAgICogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3VuaW5pdGlhbGl6ZWQuYzogTGlrZXdpc2UuCisgICAgICAgICogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3ZhXzEuYzogTGlrZXdpc2UuCisgICAgICAgICogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3ZhX3N0cnVjdDEuYzogTGlrZXdpc2UuCisgICAgICAgICogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3ZhX3N0cnVjdDIuYzogTGlrZXdpc2UuCisgICAgICAgICogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3ZhX3N0cnVjdDMuYzogTGlrZXdpc2UuCisKKzIwMTItMTAtMTIgIFdhbHRlciBMZWUgIDx3YWx0QHRpbGVyYS5jb20+CisKKyAgICAgICAgKiBNYWtlZmlsZS5hbTogQWRkIFRJTEUtR3gvVElMRVBybyBzdXBwb3J0LgorICAgICAgICAqIGNvbmZpZ3VyZS5hYzogTGlrZXdpc2UuCisgICAgICAgICogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisgICAgICAgICogY29uZmlndXJlOiBMaWtld2lzZS4KKyAgICAgICAgKiBzcmMvcHJlcF9jaWYuYyAoZmZpX3ByZXBfY2lmX2NvcmUpOiBIYW5kbGUgVElMRS1HeC9USUxFUHJvLgorICAgICAgICAqIHNyYy90aWxlOiBOZXcgZGlyZWN0b3J5LgorICAgICAgICAqIHNyYy90aWxlL2ZmaS5jOiBOZXcgZmlsZS4KKyAgICAgICAgKiBzcmMvdGlsZS9mZml0YXJnZXQuaDogRGl0dG8uCisgICAgICAgICogc3JjL3RpbGUvdGlsZS5TOiBEaXR0by4KKworMjAxMi0xMC0xMiAgTWF0dGhpYXMgS2xvc2UgIDxkb2tvQHVidW50dS5jb20+CisKKwkqIGdlbmVyYXRlLW9zeC1zb3VyY2UtYW5kLWhlYWRlcnMucHk6IE5vcm1hbGl6ZSB3aGl0ZXNwYWNlLgorCisyMDEyLTA5LTE0ICBEYXZpZCBFZGVsc29obiAgPGRqZS5nY2NAZ21haWwuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCisyMDEyLTA4LTI2ICBBbmRyZXcgUGluc2tpICA8YXBpbnNraUBjYXZpdW0uY29tPgorCisJUFIgbGliZmZpLzUzMDE0CisJKiBzcmMvbWlwcy9mZmkuYyAoZmZpX3ByZXBfY2xvc3VyZV9sb2MpOiBBbGxvdyBuMzIgd2l0aCBzb2Z0LWZsb2F0IGFuZCBuNjQgd2l0aAorCXNvZnQtZmxvYXQuCisKKzIwMTItMDgtMDggIFVyb3MgQml6amFrICA8dWJpempha0BnbWFpbC5jb20+CisKKwkqIHNyYy9zMzkwL2ZmaS5jIChmZmlfcHJlcF9jbG9zdXJlX2xvYyk6IERvbid0IEFTU0VSVCBBQkkgdGVzdCwKKwlqdXN0IHJldHVybiBGRklfQkFEX0FCSSB3aGVuIHRoaW5ncyBhcmUgd3JvbmcuCisKKzIwMTItMDctMTggIEguSi4gTHUgIDxob25naml1Lmx1QGludGVsLmNvbT4KKworCVBSIGxpYmZmaS81Mzk4MgorCVBSIGxpYmZmaS81Mzk3MworCSogc3JjL3g4Ni9mZml0YXJnZXQuaDogQ2hlY2sgX19JTFAzMl9fIGluc3RlYWQgb2YgX19MUDY0X18gZm9yIHgzMi4KKwkoRkZJX1NJWkVPRl9KQVZBX1JBVyk6IERlZmluZWQgdG8gNCBmb3IgeDMyLgorCisyMDEyLTA1LTE2ICBILkouIEx1ICA8aG9uZ2ppdS5sdUBpbnRlbC5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKKzIwMTItMDUtMDUgIE5pY29sYXMgTGVsb25nCisKKwkqIGxpYmZmaS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOiBGaXhlcy4KKwkqIFJFQURNRTogVXBkYXRlIGZvciBpT1MgYnVpbGRzLgorCisyMDEyLTA0LTIzICBBbGV4YW5kcmUgS2V1bmVja2UgSS4gZGUgTWVuZG9uY2EgPGFsZXhhbmRyZS5rZXVuZWNrZUBnbWFpbC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogQWRkIEJsYWNrZmluL3N5c3Ygc3VwcG9ydAorCSogTWFrZWZpbGUuYW06IEFkZCBCbGFja2Zpbi9zeXN2IHN1cHBvcnQKKwkqIHNyYy9iZmluL2ZmaS5jOiAgQWRkIEJsYWNrZmluL3N5c3Ygc3VwcG9ydAorCSogc3JjL2JmaW4vZmZpdGFyZ2V0Lmg6IEFkZCBCbGFja2Zpbi9zeXN2IHN1cHBvcnQKKworMjAxMi0wNC0xMSAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQG1veGllbG9naWMuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEFkZCBuZXcgc2NyaXB0LgorCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCisKKzIwMTItMDQtMTEgIFphY2hhcnkgV2FsZG93c2tpICA8endhbGRvd3NraUBnbWFpbC5jb20+CisKKwkqIGdlbmVyYXRlLWlvcy1zb3VyY2UtYW5kLWhlYWRlcnMucHksCisJbGliZmZpLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6IFN1cHBvcnQgYSBNYWMgc3RhdGljIGxpYnJhcnkgdmlhCisJWGNvZGUuIFNldCBpT1MgY29tcGF0aWJpbGl0eSB0byA0LjAuICBNb3ZlIGlPUyB0cmFtcG9saW5lCisJZ2VuZXJhdGlvbiBpbnRvIGFuIFhjb2RlICJydW4gc2NyaXB0IiBwaGFzZS4gIEluY2x1ZGUgYm90aCBhcworCVhjb2RlIGJ1aWxkIHNjcmlwdHMuIERvbid0IGFsd2F5cyByZWdlbmVyYXRlIGNvbmZpZyBmaWxlcy4KKworMjAxMi0wNC0xMCAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQG1veGllbG9naWMuY29tPgorCisJKiBzcmMvcG93ZXJwYy9mZmlfZGFyd2luLmMgKGZmaV9wcmVwX2FyZ3MpOiBBZGQgbWlzc2luZyBzZW1pY29sb24uCisKKzIwMTItMDQtMDYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBtb3hpZWxvZ2ljLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgbmV3IGlPUy94Y29kZSBmaWxlcy4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0LgorCisyMDEyLTA0LTA2ICBNaWtlIExld2lzICA8bWlrZWxpa2VzcGllQGdtYWlsLmNvbT4KKworCSogZ2VuZXJhdGUtaW9zLXNvdXJjZS1hbmQtaGVhZGVycy5weTogTmV3IGZpbGUuCisJKiBsaWJmZmkueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajogTmV3IGZpbGUuCisJKiBSRUFETUU6IFVwZGF0ZSBpbnN0cnVjdGlvbnMgb24gYnVpbGRpbmcgaU9TIGJpbmFyeS4KKwkqIGJ1aWxkLWlvcy5zaDogRGVsZXRlLgorCisyMDEyLTA0LTA2ICBBbnRob255IEdyZWVuICA8Z3JlZW5AbW94aWVsb2dpYy5jb20+CisKKwkqIHNyYy94ODYvZmZpNjQuYyAoVUlOVDEyOCk6IERlZmluZSBkaWZmZXJlbnRseSBmb3IgSW50ZWwgYW5kIEdOVQorCWNvbXBpbGVycywgdGhlbiB1c2UgaXQuCisKKzIwMTItMDQtMDYgIEguSi4gTHUgIDxob25naml1Lmx1QGludGVsLmNvbT4KKworCSogbTQvbGlidG9vbC5tNCAoX0xUX0VOQUJMRV9MT0NLKTogU3VwcG9ydCB4MzIuCisKKzIwMTItMDQtMDYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBtb3hpZWxvZ2ljLmNvbT4KKworCSogdGVzdHN1aXRlL01ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIG1pc3NpbmcgdGVzdCBjYXNlcy4KKwkqIHRlc3RzdWl0ZS9NYWtlZmlsZS5pbjogUmVidWlsdC4KKworMjAxMi0wNC0wNSAgWmFjaGFyeSBXYWxkb3dza2kgIDx6d2FsZG93c2tpQGdtYWlsLmNvbT4KKworCSogaW5jbHVkZS9mZmkuaC5pbjogQWRkIG1pc3NpbmcgdHJhbXBvbGluZSB0YWJsZSBmaWVsZHMuCisJKiBzcmMvYXJtL3N5c3YuUzogRml4IEVOVFJZIGRlZmluaXRpb24sIGFuZCB3cmFwIHN5bWJvbCByZWZlcmVuY2VzCisJaW4gQ05BTUUuCisJKiBzcmMveDg2L2ZmaS5jOiBXcmFwIFdpbmRvd3Mgc3BlY2lmaWMgY29kZSBpbiBpZmRlZnMuCisKKzIwMTItMDQtMDIgIFBldGVyIEJlcmduZXIgIDxiZXJnbmVyQHZuZXQuaWJtLmNvbT4KKworCSogc3JjL3Bvd2VycGMvZmZpLmMgKGZmaV9wcmVwX2FyZ3NfU1lTVik6IERlY2xhcmUgZG91YmxlX3RtcC4KKwlTaWxlbmNlIGNhc3RpbmcgcG9pbnRlciB0byBpbnRlZ2VyIG9mIGRpZmZlcmVudCBzaXplIHdhcm5pbmcuCisJRGVsZXRlIGdvdG8gdG8gcHJldmlvdXNseSBkZWxldGVkIGxhYmVsLgorCShmZmlfY2FsbCk6IFNpbGVuY2UgcG9zc2libHkgdW5kZWZpbmVkIHdhcm5pbmcuCisJKGZmaV9jbG9zdXJlX2hlbHBlcl9TWVNWKTogRGVjbGFyZSB2YXJpYWJsZSB0eXBlLgorCisyMDEyLTA0LTAyICBQZXRlciBSb3NpbiAgPHBlZGFAbHlzYXRvci5saXUuc2U+CisKKwkqIHNyYy94ODYvd2luMzIuUyAoZmZpX2NhbGxfd2luMzIpOiBTaWduL3plcm8gZXh0ZW5kIHRoZSByZXR1cm4KKwl2YWx1ZSBpbiB0aGUgSW50ZWwgdmVyc2lvbiBhcyBpcyBhbHJlYWR5IGRvbmUgZm9yIHRoZSBBVCZUIHZlcnNpb24uCisJKGZmaV9jbG9zdXJlX1NZU1YpOiBMaWtld2lzZS4KKwkoZmZpX2Nsb3N1cmVfcmF3X1NZU1YpOiBMaWtld2lzZS4KKwkoZmZpX2Nsb3N1cmVfU1REQ0FMTCk6IExpa2V3aXNlLgorCisyMDEyLTAzLTI5ICBQZXRlciBSb3NpbiAgPHBlZGFAbHlzYXRvci5saXUuc2U+CisKKwkqIHNyYy94ODYvd2luMzIuUyAoZmZpX2Nsb3N1cmVfcmF3X1RISVNDQUxMKTogVW5pZnkgdGhlIGZyYW1lCisJZ2VuZXJhdGlvbiwgZml4IHRoZSBFTkRQIGxhYmVsIGFuZCByZW1vdmUgdGhlIHN1cnBsdXMgdGhpcmQgYXJnCisJZnJvbSB0aGUgJ2xlYScgaW5zbi4KKworMjAxMi0wMy0yOSAgUGV0ZXIgUm9zaW4gIDxwZWRhQGx5c2F0b3IubGl1LnNlPgorCisJKiBzcmMveDg2L3dpbjMyLlMgKGZmaV9jbG9zdXJlX3Jhd19TWVNWKTogTWFrZSB0aGUgJ3N0dWJyYXcnIGxhYmVsCisJdmlzaWJsZSBvdXRzaWRlIHRoZSBQUk9DLCBzbyB0aGF0IGZmaV9jbG9zdXJlX3Jhd19USElTQ0FMTCBjYW4gc2VlCisJaXQuICBBbHNvIGluc3RydWN0IHRoZSBhc3NlbWJsZXIgdG8gYWRkIGEgZnJhbWUgdG8gdGhlIGZ1bmN0aW9uLgorCisyMDEyLTAzLTIzICBQZXRlciBSb3NpbiAgPHBlZGFAbHlzYXRvci5saXUuc2U+CisKKwkqIE1ha2VmaWxlLmFtIChBTV9DUFBGTEFHUyk6IEFkZCAtREZGSV9CVUlMRElORy4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0LgorCSogaW5jbHVkZS9mZmkuaC5pbiBbTVNWQ106IEFkZCBfX2RlY2xzcGVjKGRsbGltcG9ydCkgZGVjb3JhdGlvbnMKKwl0byBhbGwgZGF0YSBleHBvcnRzLCB3aGVuIGNvbXBpbGluZyBsaWJmZmkgY2xpZW50cyB1c2luZyBNU1ZDLgorCisyMDEyLTAzLTI5ICBQZXRlciBSb3NpbiAgPHBlZGFAbHlzYXRvci5saXUuc2U+CisKKwkqIHNyYy94ODYvZmZpdGFyZ2V0LmggKGZmaV9hYmkpOiBBZGQgbmV3IEFCSSBGRklfTVNfQ0RFQ0wgYW5kCisJbWFrZSBpdCB0aGUgZGVmYXVsdCBmb3IgTVNWQy4KKwkoRkZJX1RZUEVfTVNfU1RSVUNUKTogTmV3IHN0cnVjdHVyZSByZXR1cm4gY29udmVudGlvbi4KKwkqIHNyYy94ODYvZmZpLmMgKGZmaV9wcmVwX2NpZl9tYWNoZGVwKTogVHdlYWsgdGhlIHN0cnVjdHVyZQorCXJldHVybiBjb252ZW50aW9uIGZvciBGRklfTVNfQ0RFQ0wgdG8gYmUgRkZJX1RZUEVfTVNfU1RSVUNUCisJaW5zdGVhZCBvZiBhbiBvcmRpbmFyeSBGRklfVFlQRV9TVFJVQ1QuCisJKGZmaV9wcmVwX2FyZ3MpOiBUcmVhdCBGRklfVFlQRV9NU19TVFJVQ1QgYXMgRkZJX1RZUEVfU1RSVUNULgorCShmZmlfY2FsbCk6IExpa2V3aXNlLgorCShmZmlfcHJlcF9pbmNvbWluZ19hcmdzX1NZU1YpOiBMaWtld2lzZS4KKwkoZmZpX3Jhd19jYWxsKTogTGlrZXdpc2UuCisJKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKTogVHJlYXQgRkZJX01TX0NERUNMIGFzIEZGSV9TWVNWLgorCSogc3JjL3g4Ni93aW4zMi5TIChmZmlfY2xvc3VyZV9TWVNWKTogRm9yIEZGSV9UWVBFX01TX1NUUlVDVCwKKwlyZXR1cm4gYSBwb2ludGVyIHRvIHRoZSByZXN1bHQgc3RydWN0dXJlIGluIGVheCBhbmQgZG9uJ3QgcG9wCisJdGhhdCBwb2ludGVyIGZyb20gdGhlIHN0YWNrLCB0aGUgY2FsbGVyIHRha2VzIGNhcmUgb2YgaXQuCisJKGZmaV9jYWxsX3dpbjMyKTogVHJlYXQgRkZJX1RZUEVfTVNfU1RSVUNUIGFzIEZGSV9UWVBFX1NUUlVDVC4KKwkoZmZpX2Nsb3N1cmVfcmF3X1NZU1YpOiBMaWtld2lzZS4KKworMjAxMi0wMy0yMiAgUGV0ZXIgUm9zaW4gIDxwZWRhQGx5c2F0b3IubGl1LnNlPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9zdGRjYWxsLmMgW01TVkNdOiBBZGQgaW5saW5lCisJYXNzZW1ibHkgdmVyc2lvbiB3aXRoIEludGVsIHN5bnRheC4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX3RoaXNjYWxsLmMgW01TVkNdOiBMaWtld2lzZS4KKworMjAxMi0wMy0yMyAgUGV0ZXIgUm9zaW4gIDxwZWRhQGx5c2F0b3IubGl1LnNlPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmZpdGVzdC5oOiBQcm92aWRlIGFic3RyYXRpb24gb2YKKwlfX2F0dHJpYnV0ZV9fKChmYXN0Y2FsbCkpIGluIHRoZSBmb3JtIG9mIGEgX19GQVNUQ0FMTF9fCisJZGVmaW5lLiAgRGVmaW5lIGl0IHRvIF9fZmFzdGNhbGwgZm9yIE1TVkMuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmFzdHRoaXMxX3dpbjMyLmM6IFVzZSB0aGUgYWJvdmUuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmFzdHRoaXMyX3dpbjMyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Zhc3R0aGlzM193aW4zMi5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJsZW4yX3dpbjMyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cnVjdDFfd2luMzIuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0Ml93aW4zMi5jOiBMaWtld2lzZS4KKworMjAxMi0wMy0yMiAgUGV0ZXIgUm9zaW4gIDxwZWRhQGx5c2F0b3IubGl1LnNlPgorCisJKiBzcmMveDg2L3dpbjMyLlMgW01TVkNdIChmZmlfY2xvc3VyZV9USElTQ0FMTCk6IFJlbW92ZSB0aGUgbWFudWFsCisJZnJhbWUgb24gZnVuY3Rpb24gZW50cnksIE1BU00gYWRkcyBvbmUgYXV0b21hdGljYWxseS4KKworMjAxMi0wMy0yMiAgUGV0ZXIgUm9zaW4gIDxwZWRhQGx5c2F0b3IubGl1LnNlPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmZpdGVzdC5oIFtNU1ZDXTogQWRkIGtsdWRnZSBmb3IgbWlzc2luZworCWJpdHMgaW4gdGhlIE1TVkMgaGVhZGVycy4KKworMjAxMi0wMy0yMiAgUGV0ZXIgUm9zaW4gIDxwZWRhQGx5c2F0b3IubGl1LnNlPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzEyYnl0ZS5jOiBBZGp1c3QgdG8gdGhlIEM4OSBzdHlsZQorCXdpdGggbm8gZGVjbGFyYXRpb25zIGFmdGVyIHN0YXRlbWVudHMuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzE2Ynl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMThieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xOWJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzFfMWJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzIwYnl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMjBieXRlMS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMjRieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18yYnl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfM18xYnl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfM2J5dGUxLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18zYnl0ZTIuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzRfMWJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzRieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc181XzFfYnl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNWJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzY0Ynl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNl8xX2J5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzZieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc183XzFfYnl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfN2J5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzhieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc185Ynl0ZTEuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzlieXRlMi5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fZG91YmxlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9mbG9hdC5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZV9zcGxpdC5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZV9zcGxpdDIuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3BvaW50ZXIuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3NpbnQxNi5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDMyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9zaW50NjQuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3VpbnQxNi5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fdWludDMyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl91aW50NjQuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2RibHNfc3RydWN0LmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19wb2ludGVyX3N0YWNrLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Vycl9iYWRfdHlwZWRlZi5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9odWdlX3N0cnVjdC5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0LmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QxLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QxMC5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0Mi5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0My5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0NC5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0NS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0Ni5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0Ny5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0OC5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0OS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJldF9sYXJnZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJldF9sYXJnZTIuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RyZXRfbWVkaXVtLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cmV0X21lZGl1bTIuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0MS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3QxX3dpbjMyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cnVjdDIuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0Ml93aW4zMi5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3QzLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cnVjdDQuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0NS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3Q2LmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cnVjdDcuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0OC5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3Q5LmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3Rlc3RjbG9zdXJlLmM6IExpa2V3aXNlLgorCisyMDEyLTAzLTIxICBQZXRlciBSb3NpbgkgPHBlZGFAbHlzYXRvci5saXUuc2U+CisKKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9mbG9hdF92YS5jIChmbG9hdF92YV9mbik6IFVzZSAlZiB3aGVuCisJcHJpbnRpbmcgZG91YmxlcyAoJWxmIGlzIGZvciBsb25nIGRvdWJsZXMpLgorCShtYWluKTogTGlrZXdpc2UuCisKKzIwMTItMDMtMjEgIFBldGVyIFJvc2luICA8cGVkYUBseXNhdG9yLmxpdS5zZT4KKworCSogdGVzdHN1aXRlL2xpYi90YXJnZXQtbGlicGF0aC5leHAgWyotKi1jeWd3aW4qLCAqLSotbWluZ3cqXQorCShzZXRfbGRfbGlicmFyeV9wYXRoX2Vudl92YXJzKTogQWRkIHRoZSBsaWJyYXJ5IHNlYXJjaCBkaXIgdG8gUEFUSAorCShhbmQgc2F2ZSBQQVRIIGZvciBsYXRlcikuCisJKHJlc3RvcmVfbGRfbGlicmFyeV9wYXRoX2Vudl92YXJzKTogUmVzdG9yZSBQQVRILgorCisyMDEyLTAzLTIxICBQZXRlciBSb3NpbiAgPHBlZGFAbHlzYXRvci5saXUuc2U+CisKKwkqIHRlc3RzdWl0ZS9saWIvdGFyZ2V0LWxpYnBhdGguZXhwIFsqLSotY3lnd2luKiwgKi0qLW1pbmd3Kl0KKwkoc2V0X2xkX2xpYnJhcnlfcGF0aF9lbnZfdmFycyk6IEFkZCB0aGUgbGlicmFyeSBzZWFyY2ggZGlyIHRvIFBBVEgKKwkoYW5kIHNhdmUgUEFUSCBmb3IgbGF0ZXIpLgorCShyZXN0b3JlX2xkX2xpYnJhcnlfcGF0aF9lbnZfdmFycyk6IFJlc3RvcmUgUEFUSC4KKworMjAxMi0wMy0yMCAgUGV0ZXIgUm9zaW4gIDxwZWRhQGx5c2F0b3IubGl1LnNlPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RybGVuMl93aW4zMi5jIChtYWluKTogUmVtb3ZlIGJ1Zy4KKwkqIHNyYy94ODYvd2luMzIuUyBbTVNWQ10gKGZmaV9jbG9zdXJlX1NZU1YpOiBNYWtlIHRoZSAnc3R1YicgbGFiZWwKKwl2aXNpYmxlIG91dHNpZGUgdGhlIFBST0MsIHNvIHRoYXQgZmZpX2Nsb3N1cmVfVEhJU0NBTEwgY2FuIHNlZSBpdC4KKworMjAxMi0wMy0yMCAgUGV0ZXIgUm9zaW4gIDxwZWRhQGx5c2F0b3IubGl1LnNlPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RybGVuMl93aW4zMi5jIChtYWluKTogUmVtb3ZlIGJ1Zy4KKwkqIHNyYy94ODYvd2luMzIuUyBbTVNWQ10gKGZmaV9jbG9zdXJlX1NZU1YpOiBNYWtlIHRoZSAnc3R1YicgbGFiZWwKKwl2aXNpYmxlIG91dHNpZGUgdGhlIFBST0MsIHNvIHRoYXQgZmZpX2Nsb3N1cmVfVEhJU0NBTEwgY2FuIHNlZSBpdC4KKworMjAxMi0wMy0xOSAgQWxhbiBIb3VyaWhhbmUgIDxhbGFuaEBmYWlybGl0ZS5jby51az4KKworCSogc3JjL202OGsvZmZpLmM6IEFkZCBNSU5UIHN1cHBvcnQuCisJKiBzcmMvbTY4ay9zeXN2LlM6IERpdHRvLgorCisyMDEyLTAzLTA2ICBDaHVuZy1MaW4gVGFuZyAgPGNsdGFuZ0Bjb2Rlc291cmNlcnkuY29tPgorCisJKiBzcmMvYXJtL2ZmaS5jIChmZmlfY2FsbCk6IEFkZCBfX0FSTV9FQUJJX18gZ3VhcmQgYXJvdW5kIGNhbGwgdG8KKwlmZmlfY2FsbF9WRlAoKS4KKwkoZmZpX3ByZXBfY2xvc3VyZV9sb2MpOiBBZGQgX19BUk1fRUFCSV9fIGd1YXJkIGFyb3VuZCB1c2Ugb2YKKwlmZmlfY2xvc3VyZV9WRlAuCisJKiBzcmMvYXJtL3N5c3YuUzogQWRkIF9fQVJNX0VBQklfXyBndWFyZCBhcm91bmQgVkZQIGNvZGUuCisKKzIwMTItMDMtMTkgIGNoZW5uYW0gIDxjc2l0QGF4d2F5LmNvbT4KKworCSogc3JjL3Bvd2VycGMvZmZpX2Rhcndpbi5jIChmZmlfcHJlcF9jbG9zdXJlX2xvYyk6IEZpeCBBSVggY2xvc3VyZQorCXN1cHBvcnQuCisKKzIwMTItMDMtMTMgIEtheiBLb2ppbWEgIDxra29qaW1hQGdjYy5nbnUub3JnPgorCisJKiBzcmMvc2gvZmZpLmMgKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKTogRG9uJ3QgQVNTRVJUIEFCSSB0ZXN0LAorCWp1c3QgcmV0dXJuIEZGSV9CQURfQUJJIHdoZW4gdGhpbmdzIGFyZSB3cm9uZy4KKwkqIHNyYy9zaDY0L2ZmaS5jIChmZmlfcHJlcF9jbG9zdXJlX2xvYyk6IERpdHRvLgorCisyMDEyLTAzLTA5ICBEYXZpZCBFZGVsc29obiAgPGRqZS5nY2NAZ21haWwuY29tPgorCisJKiBzcmMvcG93ZXJwYy9haXhfY2xvc3VyZS5TIChmZmlfY2xvc3VyZV9BU00pOiBBZGp1c3QgZm9yIERhcndpbjY0CisJY2hhbmdlIHRvIHJldHVybiB2YWx1ZSBvZiBmZmlfY2xvc3VyZV9oZWxwZXJfREFSV0lOIGFuZCBsb2FkIHR5cGUKKwlmcm9tIHJldHVybiB0eXBlLgorCisyMDEyLTAzLTAzICBILkouIEx1ICA8aG9uZ2ppdS5sdUBpbnRlbC5jb20+CisKKwkqIHNyYy94ODYvZmZpNjQuYyAoZmZpX2NhbGwpOiBDYXN0IHRoZSByZXR1cm4gdmFsdWUgdG8gdW5zaWduZWQKKwlsb25nLgorCShmZmlfcHJlcF9jbG9zdXJlX2xvYyk6IENhc3QgdG8gNjRiaXQgYWRkcmVzcyBpbiB0cmFtcG9saW5lLgorCShmZmlfY2xvc3VyZV91bml4NjRfaW5uZXIpOiBDYXN0IHJldHVybiBwb2ludGVyIHRvIHVuc2lnbmVkIGxvbmcKKwlmaXJzdC4KKworCSogc3JjL3g4Ni9mZml0YXJnZXQuaCAoRkZJX1NJWkVPRl9BUkcpOiBEZWZpbmVkIHRvIDggZm9yIHgzMi4KKwkoZmZpX2FyZyk6IFNldCB0byB1bnNpZ25lZCBsb25nIGxvbmcgZm9yIHgzMi4KKwkoZmZpX3NhcmcpOiBTZXQgdG8gbG9uZyBsb25nIGZvciB4MzIuCisKKzIwMTItMDMtMDMgIEguSi4gTHUgIDxob25naml1Lmx1QGludGVsLmNvbT4KKworCSogc3JjL3ByZXBfY2lmLmMgKGZmaV9wcmVwX2NpZl9jb3JlKTogUHJvcGVybHkgY2hlY2sgYmFkIEFCSS4KKworMjAxMi0wMy0wMyAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5ICA8eWxhdHV5YUBnbWFpbC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogQWRkIC1uby11bmRlZmluZWQgZm9yIGJvdGggMzItIGFuZCA2NC1iaXQgeDg2CisJd2luZG93cy1saWtlIGhvc3RzLgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCisyMDEyLTAyLTI3ICBNaWthZWwgUGV0dGVyc3NvbiAgPG1pa3BlQGl0LnV1LnNlPgorCisJUFIgbGliZmZpLzUyMjIzCisJKiBNYWtlZmlsZS5hbSAoRkxBR1NfVE9fUEFTUyk6IERlZmluZS4KKwkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCisyMDEyLTAyLTIzICBBbnRob255IEdyZWVuICA8Z3JlZW5AbW94aWVsb2dpYy5jb20+CisKKwkqIHNyYy8qL2ZmaXRhcmdldC5oOiBFbnN1cmUgdGhhdCB1c2VycyBuZXZlciBpbmNsdWRlIGZmaXRhcmdldC5oCisJZGlyZWN0bHkuCisKKzIwMTItMDItMjMgIEthaSBUaWV0eiAgPGt0aWV0ekByZWRoYXQuY29tPgorCisJUFIgbGliZmZpLzUyMjIxCisJKiBzcmMveDg2L2ZmaS5jIChmZmlfY2xvc3VyZV9yYXdfVEhJU0NBTEwpOiBOZXcKKwlwcm90b3R5cGUuCisJKGZmaV9wcmVwX3Jhd19jbG9zdXJlX2xvYyk6IFVzZSBmZmlfY2xvc3VyZV9yYXdfVEhJU0NBTEwgZm9yCisJdGhpc2NhbGwtY29udmVudGlvbi4KKwkoZmZpX3Jhd19jYWxsKTogVXNlIGZmaV9wcmVwX2FyZ3NfcmF3LgorCSogc3JjL3g4Ni93aW4zMi5TIChmZmlfY2xvc3VyZV9yYXdfVEhJU0NBTEwpOiBBZGQKKwlpbXBsZW1lbnRhdGlvbiBmb3Igc3R1Yi4KKworMjAxMi0wMi0xMCAgS2FpIFRpZXR6ICA8a3RpZXR6QHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYyAoQU1fTFRMREZMQUdTKTogQWRkIC1uby11bmRlZmluZSBmb3IgeDY0CisJd2luZG93cyB0YXJnZXQuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCisyMDEyLTAyLTA4ICBLYWkgVGlldHogIDxrdGlldHpAcmVkaGF0LmNvbT4KKworCSogc3JjL3ByZXBfY2lmLmMgKGZmaV9wcmVwX2NpZik6IEFsbG93IGZvciBYODZfV0lOMzIKKwlhbHNvIEZGSV9USElTQ0FMTC4KKwkqIHNyYy94ODYvZmZpLmMgKGZmaV9jbG9zdXJlX1RISVNDQUxMKTogQWRkIHByb3RvdHlwZS4KKwkoRkZJX0lOSVRfVFJBTVBPTElORV9USElTQ0FMTCk6IE5ldyB0cmFtcG9saW5lIGNvZGUuCisJKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKTogQWRkIEZGSV9USElTQ0FMTCBzdXBwb3J0LgorCSogc3JjL3g4Ni9mZml0YXJnZXQuaCAoRkZJX1RSQU1QT0xJTkVfU0laRSk6IEFkanVzdCBzaXplLgorCSogc3JjL3g4Ni93aW4zMi5TIChmZmlfY2xvc3VyZV9USElTQ0FMTCk6IE5ldyBjbG9zdXJlIGNvZGUKKwlmb3IgdGhpc2NhbGwtY2FsbGluZyBjb252ZW50aW9uLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfdGhpc2NhbGwuYzogTmV3IHRlc3QuCisKKzIwMTItMDEtMjggIEthaSBUaWV0eiAgPGt0aWV0ekByZWRoYXQuY29tPgorCisJKiBzcmMvbGliZmZpL3NyYy94ODYvZmZpLmMgKGZmaV9jYWxsX3dpbjMyKTogQWRkIG5ldworCWFyZ3VtZW50IHRvIHByb3RvdHlwZSBmb3Igc3BlY2lmeSBjYWxsaW5nLWNvbnZlbnRpb24uCisJKGZmaV9jYWxsKTogQWRkIHN1cHBvcnQgZm9yIHN0ZGNhbGwvdGhpc2NhbGwgY29udmVudGlvbi4KKwkoZmZpX3ByZXBfYXJncyk6IExpa2V3aXNlLgorCShmZmlfcmF3X2NhbGwpOiBMaWtld2lzZS4KKwkqIHNyYy94ODYvZmZpdGFyZ2V0LmggKGZmaV9hYmkpOiBBZGQgRkZJX1RISVNDQUxMIGFuZAorCUZGSV9GQVNUQ0FMTC4KKwkqIHNyYy94ODYvd2luMzIuUyAoX2ZmaV9jYWxsX3dpbjMyKTogQWRkIHN1cHBvcnQgZm9yCisJZmFzdGNhbGwvdGhpc2NhbGwgY2FsbGluZy1jb252ZW50aW9uIGNhbGxzLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Zhc3R0aGlzMV93aW4zMi5jOiBOZXcgdGVzdC4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9mYXN0dGhpczJfd2luMzIuYzogTmV3IHRlc3QuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmFzdHRoaXMzX3dpbjMyLmM6IE5ldyB0ZXN0LgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cmxlbjJfd2luMzIuYzogTmV3IHRlc3QuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbWFueTJfd2luMzIuYzogTmV3IHRlc3QuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0MV93aW4zMi5jOiBOZXcgdGVzdC4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3QyX3dpbjMyLmM6IE5ldyB0ZXN0LgorCisyMDEyLTAxLTIzICBVcm9zIEJpemphayAgPHViaXpqYWtAZ21haWwuY29tPgorCisJKiBzcmMvYWxwaGEvZmZpLmMgKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKTogQ2hlY2sgZm9yIGJhZCBBQkkuCisKKzIwMTItMDEtMjMgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBtb3hpZWxvZ2ljLmNvbT4KKwkgICAgQ2hyaXMgWW91bmcgIDxjZHlvdW5nQG50bHdvcmxkLmNvbT4KKworCSogY29uZmlndXJlLmFjOiBBZGQgQW1pZ2Egc3VwcG9ydC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKworMjAxMi0wMS0yMyAgRG1pdHJ5IE5hZGV6aGluICA8ZG1pdHJ5Lm5hZGV6aGluQGdtYWlsLmNvbT4KKworCSogaW5jbHVkZS9mZmlfY29tbW9uLmggKExJS0VMWSwgVU5MSUtFTFkpOiBGaXggZGVmaW5pdGlvbnMuCisKKzIwMTItMDEtMjMgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGxpbnV4LW02OGsub3JnPgorCisJKiBzcmMvbTY4ay9zeXN2LlMgKGZmaV9jYWxsX1NZU1YpOiBQcm9wZXJseSB0ZXN0IGZvciBwbGFpbgorCW1jNjgwMDAuICBUZXN0IGZvciBfX0hBVkVfNjg4ODFfXyBpbiBhZGRpdGlvbiB0byBfX01DNjg4ODFfXy4KKworMjAxMi0wMS0xOSAgSmFrdWIgSmVsaW5layAgPGpha3ViQHJlZGhhdC5jb20+CisKKwlQUiBydGwtb3B0aW1pemF0aW9uLzQ4NDk2CisJKiBzcmMvaWE2NC9mZmkuYyAoZmZpX2NhbGwpOiBGaXggdXAgYWxpYXNpbmcgdmlvbGF0aW9ucy4KKworMjAxMi0wMS0wOSAgUmFpbmVyIE9ydGggIDxyb0BDZUJpVGVjLlVuaS1CaWVsZWZlbGQuREU+CisKKwkqIGNvbmZpZ3VyZS5hYyAoaT84Ni0qLSopOiBTZXQgVEFSR0VUIHRvIFg4Nl82NC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworMjAxMS0xMi0wNyAgQW5kcmV3IFBpbnNraSAgPGFwaW5za2lAY2F2aXVtLmNvbT4KKworCVBSIGxpYmZmaS81MDA1MQorCSogc3JjL21pcHMvbjMyLlM6IEFkZCAiLnNldCBtaXBzNCIuCisKKzIwMTEtMTEtMjEgIEFuZHJlYXMgVG9ibGVyICA8YW5kcmVhc3RAZmd6bmV0LmNoPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKKzIwMTEtMTEtMTIgIERhdmlkIEdpbGJlcnQgPGRhdmlkLmdpbGJlcnRAbGluYXJvLm9yZz4KKworCSogZG9jL2xpYmZmaS50ZXhpLCBpbmNsdWRlL2ZmaS5oLmluLCBpbmNsdWRlL2ZmaV9jb21tb24uaCwKKwltYW4vTWFrZWZpbGUuYW0sIG1hbi9mZmkuMywgbWFuL2ZmaV9wcmVwX2NpZi4zLAorCW1hbi9mZmlfcHJlcF9jaWZfdmFyLjMsIHNyYy9hcm0vZmZpLmMsIHNyYy9hcm0vZmZpdGFyZ2V0LmgsCisJc3JjL2NyaXMvZmZpLmMsIHNyYy9wcmVwX2NpZi5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZG91YmxlX3ZhLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19sb25nZG91YmxlX3ZhLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Zsb2F0X3ZhLmM6IE1hbnkgY2hhbmdlcyB0byBzdXBwb3J0IHZhcmlhZGljCisJZnVuY3Rpb24gY2FsbHMuCisKKzIwMTEtMTEtMTIgIEt5bGUgTW9mZmV0dCA8S3lsZS5ELk1vZmZldHRAYm9laW5nLmNvbT4KKworCSogc3JjL3Bvd2VycGMvZmZpLmMsIHNyYy9wb3dlcnBjL2ZmaXRhcmdldC5oLAorCXNyYy9wb3dlcnBjL3BwY19jbG9zdXJlLlMsIHNyYy9wb3dlcnBjL3N5c3YuUzogTWFueSBjaGFuZ2VzIGZvcgorCXNvZnRmbG9hdCBwb3dlcnBjIHZhcmlhbnRzLgorCisyMDExLTExLTEyICBQZXRyIFNhbGluZ2VyIDxQZXRyLlNhbGluZ2VyQHNlem5hbS5jej4KKworCSogY29uZmlndXJlLmFjIChGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFKTogRml4IGtmcmVlYnNkIHN1cHBvcnQuCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisKKzIwMTEtMTEtMTIgIFRpbW90aHkgV2FsbCAgPHR3YWxsQHVzZXJzLnNmLm5ldD4KKworCSogc3JjL2FybS9mZmkuYyAoZmZpX3ByZXBfYXJncywgZmZpX3ByZXBfaW5jb21pbmdfYXJnc19TWVNWKTogTWF4CisJYWxpZ25tZW50IG9mIDQgZm9yIHdpbmNlIG9uIEFSTS4KKworMjAxMS0xMS0xMiAgS3lsZSBNb2ZmZXR0IDxLeWxlLkQuTW9mZmV0dEBib2VpbmcuY29tPgorCSAgICBBbnRob255IEdyZWVuIDxncmVlbkBtb3hpZWxvZ2ljLmNvbT4KKworCSogc3JjL3BwYy9zeXN2LlMsIHNyYy9wcGMvZmZpLmM6IFJlbW92ZSB1c2Ugb2YgcHBjIHN0cmluZworCWluc3RydWN0aW9ucyAobm90IGF2YWlsYWJsZSBvbiBzb21lIGNvcmVzLCBsaWtlIHRoZSBQUEM0NDApLgorCisyMDExLTExLTEyICBLaW11cmEgV2F0YXJ1ICA8a2ltdXJhd0BpLm5pZnR5LmpwPgorCisJKiBtNC9heF9lbmFibGVfYnVpbGRkaXI6IENoYW5nZSBmcm9tIHN0cmluZyBjb21wYXJpc29uIHRvIG51bWVyaWMKKwljb21wYXJpc29uIGZvciB3YyBvdXRwdXQuCisJKiBjb25maWd1cmUuYWM6IEVuYWJsZSBGRklfTU1BUF9FWEVDX1dSSVQgZm9yIGRhcndpbjExIGFrYSBNYWMgT1MKKwlYIDEwLjcuCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisKKzIwMTEtMTEtMTIgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBtb3hpZWxvZ2ljLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKEFNX0NDQVNGTEFHUyk6IEFkZCAtZyBvcHRpb24gdG8gYnVpbGQgYXNzZW1ibHkKKwlmaWxlcyB3aXRoIGRlYnVnIGluZm8uCisJKiBNYWtlZmlsZS5pbjogUmVidWlsdC4KKworMjAxMS0xMS0xMiAgSmFzcGVyIExpZXZpc3NlIEFkcmlhYW5zZSA8amFzcGVyQG9wZW5ic2Qub3JnPgorCisJKiBSRUFETUU6IFVwZGF0ZSBsaXN0IG9mIHN1cHBvcnRlZCBPcGVuQlNEIHN5c3RlbXMuCisKKzIwMTEtMTEtMTIgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBtb3hpZWxvZ2ljLmNvbT4KKworCSogbGlidG9vbC12ZXJzaW9uOiBVcGRhdGUuCisJKiBNYWtlZmlsZS5hbSAobm9kaXN0X2xpYmZmaV9sYV9TT1VSQ0VTKTogQWRkIHNyYy9kZWJ1Zy5jIGlmCisJRkZJX0RFQlVHLgorCShsaWJmZmlfbGFfU09VUkNFUyk6IFJlbW92ZSBzcmMvZGVidWcuYworCShFWFRSQV9ESVNUKTogQWRkIHNyYy9kZWJ1Zy5jCisJKiBNYWtlZmlsZS5pbjogUmVidWlsdC4KKwkqIFJFQURNRTogVXBkYXRlIGZvciAzLjAuMTEuCisKKzIwMTEtMTEtMTAgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYyAoR0NDX0FTX0NGSV9QU0VVRE9fT1ApOiBVc2UgaXQgaW5zdGVhZCBvZiBpbmxpbmUgY2hlY2suCisJKiBjb25maWd1cmUsIGFjbG9jYWwubTQ6IFJlYnVpbGQuCisKKzIwMTEtMDktMDQgIElhaW4gU2FuZG9lICA8aWFpbnNAZ2NjLmdudS5vcmc+CisKKwlQUiBsaWJmZmkvNDk1OTQKKwkqIHNyYy9wb3dlcnBjL2Rhcndpbl9jbG9zdXJlLlMgKHN0dWJzKTogTWFrZSB0aGUgc3R1YiBiaW5kaW5nCisJaGVscGVyIHJlZmVyZW5jZSB0cmFjayB0aGUgYXJjaGl0ZWN0dXJlIHBvaW50ZXIgc2l6ZS4KKworMjAxMS0wOC0yNSAgQW5kcmV3IEhhbGV5ICA8YXBoQHJlZGhhdC5jb20+CisKKwkqIHNyYy9hcm0vZmZpLmMgKEZGSV9JTklUX1RSQU1QT0xJTkUpOiBSZW1vdmUgaGFyZC1jb2RlZCBhc3NlbWJseQorCWluc3RydWN0aW9ucy4KKwkqIHNyYy9hcm0vc3lzdi5TIChmZmlfYXJtX3RyYW1wb2xpbmUpOiBQdXQgdGhlbSBoZXJlIGluc3RlYWQuCisKKzIwMTEtMDctMTEgIEFuZHJldyBIYWxleSAgPGFwaEByZWRoYXQuY29tPgorCisgICAgICAgICogc3JjL2FybS9mZmkuYyAoRkZJX0lOSVRfVFJBTVBPTElORSk6IENsZWFyIGljYWNoZS4KKworMjAxMS0wNi0yOSAgUmFpbmVyIE9ydGggIDxyb0BDZUJpVGVjLlVuaS1CaWVsZWZlbGQuREU+CisKKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZG91YmxlX3ZhLmM6IE1vdmUgUFIgbnVtYmVyIHRvIGNvbW1lbnQuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2xvbmdkb3VibGVfdmEuYzogTGlrZXdpc2UuCisKKzIwMTEtMDYtMjkgIFJhaW5lciBPcnRoICA8cm9AQ2VCaVRlYy5VbmktQmllbGVmZWxkLkRFPgorCisJUFIgbGliZmZpLzQ2NjYwCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2RvdWJsZV92YS5jOiB4ZmFpbCBkZy1vdXRwdXQgb24KKwltaXBzLXNnaS1pcml4NiouCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2xvbmdkb3VibGVfdmEuYzogTGlrZXdpc2UuCisKKzIwMTEtMDYtMTQgIFJhaW5lciBPcnRoICA8cm9AQ2VCaVRlYy5VbmktQmllbGVmZWxkLkRFPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvaHVnZV9zdHJ1Y3QuYyAodGVzdF9sYXJnZV9mbik6IFVzZSBQUkl1OCwKKwlQUklkOCBpbnN0ZWFkIG9mICVoaHUsICVoaGQuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmZpdGVzdC5oIFtfX2FscGhhX18gJiYgX19vc2ZfX10gKFBSSWQ4LAorCVBSSXU4KTogRGVmaW5lLgorCVtfX3NnaV9fXSAoUFJJZDgsIFBSSXU4KTogRGVmaW5lLgorCisyMDExLTA0LTI5ICBSYWluZXIgT3J0aCAgPHJvQENlQmlUZWMuVW5pLUJpZWxlZmVsZC5ERT4KKworCSogc3JjL2FscGhhL29zZi5TIChVQV9TSSwgRkRFX0VOQ09ESU5HLCBGREVfRU5DT0RFLCBGREVfQVJBTkdFKToKKwlEZWZpbmUuCisJVXNlIHRoZW0gdG8gaGFuZGxlIEVMRiB2cy4gRUNPRkYgZGlmZmVyZW5jZXMuCisJW19fb3NmX19dIChfR0xPQkFMX19GX2ZmaV9jYWxsX29zZik6IERlZmluZS4KKworMjAxMS0wMy0zMCAgVGltb3RoeSBXYWxsICA8dHdhbGxAdXNlcnMuc2YubmV0PgorCisJKiBzcmMvcG93ZXJwYy9kYXJ3aW4uUzogRml4IHVua25vd24gRkRFIGVuY29kaW5nLgorCSogc3JjL3Bvd2VycGMvZGFyd2luX2Nsb3N1cmUuUzogZGl0dG8uCisKKzIwMTEtMDItMjUgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBtb3hpZWxvZ2ljLmNvbT4KKworCSogc3JjL3Bvd2VycGMvZmZpLmMgKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKTogQWxsb3cgZm9yIG1vcmUKKwkzMi1iaXQgQUJJcy4KKworMjAxMS0wMi0xNSAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQG1veGllbG9naWMuY29tPgorCisJKiBtNC9heF9jY19tYXhvcHQubTQ6IERvbid0IC1tYWxpZ24tZG91YmxlIG9yIHVzZSAtZmZhc3QtbWF0aC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKworMjAxMS0wMi0xMyAgUmFsZiBXaWxkZW5odWVzICA8UmFsZi5XaWxkZW5odWVzQGdteC5kZT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCisyMDExLTAyLTEzICBBbnRob255IEdyZWVuICA8Z3JlZW5AbW94aWVsb2dpYy5jb20+CisKKwkqIGluY2x1ZGUvZmZpX2NvbW1vbi5oIChVTkxJS0VMWSwgTElLRUxZKTogRGVmaW5lLgorCSogc3JjL3g4Ni9mZmk2NC5jIChVTkxJS0VMWSwgTElLRUxZKTogUmVtb3ZlIGRlZmluaXRpb24uCisJKiBzcmMvcHJlcF9jaWYuYyAoVU5MSUtFTFksIExJS0VMWSk6IFJlbW92ZSBkZWZpbml0aW9uLgorCisJKiBzcmMvcHJlcF9jaWYuYyAoaW5pdGlhbGl6ZV9hZ2dyZWdhdGUpOiBDb252ZXJ0IGFzc2VydGlvbiBpbnRvCisJRkZJX0JBRF9UWVBFREVGIHJldHVybi4gIEluaXRpYWxpemUgYXJnIHNpemUgYW5kIGFsaWdubWVudCB0byAwLgorCisJKiBzcmMvcGEvZmZpLmMgKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKTogRG9uJ3QgQVNTRVJUIEFCSSB0ZXN0LAorCWp1c3QgcmV0dXJuIEZGSV9CQURfQUJJIHdoZW4gdGhpbmdzIGFyZSB3cm9uZy4KKwkqIHNyYy9hcm0vZmZpLmMgKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKTogRGl0dG8uCisJKiBzcmMvcG93ZXJwYy9mZmkuYyAoZmZpX3ByZXBfY2xvc3VyZV9sb2MpOiBEaXR0by4KKwkqIHNyYy9taXBzL2ZmaS5jIChmZmlfcHJlcF9jbG9zdXJlX2xvYyk6IERpdHRvLgorCSogc3JjL2lhNjQvZmZpLmMgKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKTogRGl0dG8uCisJKiBzcmMvYXZyMzIvZmZpLmMgKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKTogRGl0dG8uCisKKzIwMTEtMDItMTEgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBtb3hpZWxvZ2ljLmNvbT4KKworCSogc3JjL3NwYXJjL2ZmaS5jIChmZmlfcHJlcF9jbG9zdXJlX2xvYyk6IERvbid0IEFTU0VSVCBBQkkgdGVzdCwKKwlqdXN0IHJldHVybiBGRklfQkFEX0FCSSB3aGVuIHRoaW5ncyBhcmUgd3JvbmcuCisKKzIwMTItMDItMTEgIEVyaWMgQm90Y2F6b3UgIDxlYm90Y2F6b3VAYWRhY29yZS5jb20+CisKKwkqIHNyYy9zcGFyYy92OS5TIChTVEFDS0ZSQU1FKTogQnVtcCB0byAxNzYuCisKKzIwMTEtMDItMDkgIFN0dWFydCBTaGVsdG9uICA8c3Jjc2hlbHRvbkBnbWFpbC5jb20+CisKKwlodHRwOi8vYnVncy5nZW50b28ub3JnL3Nob3dfYnVnLmNnaT9pZD0yODY5MTEKKwkqIHNyYy9taXBzL2ZmaXRhcmdldC5oOiBDbGVhbiB1cCBlcnJvciBtZXNzYWdlcy4KKwkqIHNyYy9qYXZhX3Jhd19hcGkuYyAoZmZpX2phdmFfdHJhbnNsYXRlX2FyZ3MpOiBDYXN0IHJhdyBhcmcgdG8KKwlmZmlfcmF3Ki4KKwkqIGluY2x1ZGUvZmZpLmguaW46IEFkZCBwcmFnbWEgZm9yIFNHSSBjb21waWxlci4KKworMjAxMS0wMi0wOSAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQG1veGllbG9naWMuY29tPgorCisJKiBjb25maWd1cmUuYWM6IEFkZCBwb3dlcnBjNjQtKi1kYXJ3aW4qIHN1cHBvcnQuCisKKzIwMTEtMDItMDkgIEFudGhvbnkgR3JlZW4gPGdyZWVuQG1veGllbG9naWMuY29tPgorCisJKiBSRUFETUU6IE1lbnRpb24gSW50ZXJpeC4KKworMjAxMS0wMi0wOSAgSm9uYXRoYW4gQ2FsbGVuICA8YWJjZEBnZW50b28ub3JnPgorCisJKiBjb25maWd1cmUuYWM6IEFkZCBJbnRlcml4IHRvIHdpbjMyL2N5Z3dpbi9taW5ndyBjYXNlLgorCSogY29uZmlndXJlOiBEaXR0by4KKwkqIHNyYy9jbG9zdXJlcy5jOiBUcmVhdCBJbnRlcml4IGxpa2UgQ3lnd2luLCBpbnN0ZWFkIG9mIGFzIGEKKwlnZW5lcmljIHdpbjMyLgorCisyMDExLTAyLTA5ICBBbnRob255IEdyZWVuIDxncmVlbkBtb3hpZWxvZ2ljLmNvbT4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Vycl9iYWRfdHlwZWRlZi5jOiBSZW1vdmUgeGZhaWwuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvZXJyX2JhZF9hYmkuYzogUmVtb3ZlIHhmYWlsLgorCSogc3JjL3g4Ni9mZmk2NC5jIChVTkxJS0VMWSwgTElLRUxZKTogRGVmaW5lLgorCShmZmlfcHJlcF9jbG9zdXJlX2xvYyk6IENoZWNrIGZvciBiYWQgQUJJLgorCSogc3JjL3ByZXBfY2lmLmMgKFVOTElLRUxZLCBMSUtFTFkpOiBEZWZpbmUuCisJKGluaXRpYWxpemVfYWdncmVnYXRlKTogQ2hlY2sgZm9yIGJhZCB0eXBlcy4KKworMjAxMS0wMi0wOSAgTGFuZG9uIEZ1bGxlciA8bGFuZG9uZkBwbGF1c2libGUuY29vcD4KKworCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgYnVpbGQtaW9zLnNoLCBzcmMvYXJtL2dlbnRyYW1wLnNoLAorCXNyYy9hcm0vdHJhbXBvbGluZS5TLgorCShub2Rpc3RfbGliZmZpX2xhX1NPVVJDRVMpOiBBZGQgc3JjL2FyYy90cmFtcG9saW5lLlMuCisJKiBjb25maWd1cmUuYWMgKEZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEUpOiBEZWZpbmUuCisJKiBzcmMvYXJtL2ZmaS5jIChmZmlfdHJhbXBvbGluZV90YWJsZSkKKwkoZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZV9wYWdlLCBmZmlfdHJhbXBvbGluZV90YWJsZV9lbnRyeSkKKwkoRkZJX1RSQU1QT0xJTkVfQ09ERUxPQ19DT05GSUcsIEZGSV9UUkFNUE9MSU5FX0NPTkZJR19QQUdFX09GRlNFVCkKKwkoRkZJX1RSQU1QT0xJTkVfQ09VTlQsIGZmaV90cmFtcG9saW5lX2xvY2ssIGZmaV90cmFtcG9saW5lX3RhYmxlcykKKwkoZmZpX3RyYW1wb2xpbmVfdGFibGVfYWxsb2MsIGZmaV9jbG9zdXJlX2FsbG9jLCBmZmlfY2xvc3VyZV9mcmVlKToKKwlEZWZpbmUgZm9yIEZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEUgY2FzZSAoaU9TKS4KKwkoZmZpX3ByZXBfY2xvc3VyZV9sb2MpOiBIYW5kbCBGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFIGNhc2UKKwlzZXBhcmF0ZWx5LgorCSogc3JjL2FybS9zeXN2LlM6IEhhbmRsZSBBcHBsZSBpT1MgaG9zdC4KKwkqIHNyYy9jbG9zdXJlcy5jOiBIYW5kbGUgRkZJX0VYRUNfVFJBTVBPTElORV9UQUJMRSBjYXNlLgorCSogYnVpbGQtaW9zLnNoOiBOZXcgZmlsZS4KKwkqIGZmaWNvbmZpZy5oLmluLCBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWx0LgorCSogUkVBRE1FOiBNZW50aW9uIEFSTSBpT1MuCisKKzIwMTEtMDItMDggIE9yZW4gSGVsZCAgPG9yZW5oZUBpbC5pYm0uY29tPgorCisJKiBzcmMvZGxtYWxsb2MuYyAoX1NUUlVDVF9NQUxMSU5GTyk6IERlZmluZSBpbiBvcmRlciB0byBhdm9pZAorCXJlZGVmaW5pdGlvbiBvZiBtYWxsaW5mbyBvbiBIUC1VWC4KKworMjAxMS0wMi0wOCAgR2lubiBDaGVuICA8Z2lubi5jaGVuQG9yYWNsZS5jb20+CisKKwkqIHNyYy9zcGFyYy9mZmkuYyAoZmZpX2NhbGwpOiBNYWtlIGNvbXBhdGlibGUgd2l0aCBTb2xhcmlzIFN0dWRpbworCWFnZ3JlZ2F0ZSByZXR1cm4gQUJJLiAgRmx1c2ggY2FjaGUuCisJKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKTogRmx1c2ggY2FjaGUuCisKKzIwMTEtMDItMTEgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBtb3hpZWxvZ2ljLmNvbT4KKworCUZyb20gVG9tIEhvbmVybWFubiA8dG9tLmhvbmVybWFubkBvcmFjbGUuY29tPjoKKwkqIHNyYy9wb3dlcnBjL2FpeC5TIChmZmlfY2FsbF9BSVgpOiBTdXBwb3J0IGZvciB4bGMgdG9vbGNoYWluIG9uCisJQUlYLiAgRGVjbGFyZSAuZmZpX3ByZXBfYXJncy4gIEluc2VydCBub3BzIGFmdGVyIGJyYW5jaAorCWluc3RydWN0aW9ucyBzbyB0aGF0IHRoZSBBSVggbGlua2VyIGNhbiBpbnNlcnQgVE9DIHJlbG9hZAorCWluc3RydWN0aW9ucy4KKwkqIHNyYy9wb3dlcnBjL2FpeF9jbG9zdXJlLlM6IERlY2xhcmUgLmZmaV9jbG9zdXJlX2hlbHBlcl9EQVJXSU4uCisKKzIwMTEtMDItMDggIEVkICA8ZWRAa2R0Yy5uZXQ+CisKKwkqIHNyYy9wb3dlcnBjL2FzbS5oOiBGaXggZ3JhbW1hciBuaXQgaW4gY29tbWVudC4KKworMjAxMS0wMi0wOCAgVWxpIExpbmsgIDx1bC5tY2FtYWZpYUBsaW5raXR1cC5kZT4KKworCSogaW5jbHVkZS9mZmkuaC5pbiAoRkZJXzY0X0JJVF9NQVgpOiBEZWZpbmUgYW5kIHVzZS4KKworMjAxMS0wMi0wOSAgUmFpbmVyIE9ydGggIDxyb0BDZUJpVGVjLlVuaS1CaWVsZWZlbGQuREU+CisKKwlQUiBsaWJmZmkvNDY2NjEKKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfcG9pbnRlci5jIChtYWluKTogQ2FzdCB2b2lkICogdG8KKwl1aW50cHRyX3QgZmlyc3QuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3BvaW50ZXJfc3RhY2suYyAobWFpbik6IExpa2V3aXNlLgorCisyMDExLTAyLTA4ICBSYWZhZWwgQXZpbGEgZGUgRXNwaW5kb2xhICA8cmVzcGluZG9sYUBtb3ppbGxhLmNvbT4KKworCSogY29uZmlndXJlLmFjOiBGaXggeDg2IHRlc3QgZm9yIHBjIHJlbGF0ZWQgcmVsb2NzLgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCisyMDExLTAyLTA3ICBKb2VsIFNoZXJyaWxsIDxqb2VsLnNoZXJyaWxsQG9hcmNvcnAuY29tPgorCisJKiBsaWJmZmkvc3JjL202OGsvZmZpLmM6IEFkZCBSVEVNUyBzdXBwb3J0IGZvciBjYWNoZSBmbHVzaGluZy4KKwlIYW5kbGUgY2FzZSB3aGVuIENQVSB2YXJpYW50IGRvZXMgbm90IGhhdmUgbG9uZyBkb3VibGUgc3VwcG9ydC4KKwkqIGxpYmZmaS9zcmMvbTY4ay9zeXN2LlM6IEFkZCBzdXBwb3J0IGZvciBtYzY4MDAwLCBDb2xkZmlyZSwKKwlhbmQgY29yZXMgd2l0aCBzb2Z0IGZsb2F0aW5nIHBvaW50LgorCisyMDExLTAyLTA3ICBKb2VsIFNoZXJyaWxsIDxqb2VsLnNoZXJyaWxsQG9hcmNvcnAuY29tPgorCisJKiBjb25maWd1cmUuYWM6IEFkZCBtaXBzKi0qLXJ0ZW1zKiBzdXBwb3J0LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCSogc3JjL21pcHMvZmZpdGFyZ2V0Lmg6IEVuc3VyZSBuZWVkZWQgY29uc3RhbnRzIGFyZSBhdmFpbGFibGUKKwlmb3IgdGFyZ2V0cyB3aGljaCBkbyBub3QgaGF2ZSBzZ2lkZWZzLmguCisKKzIwMTEtMDEtMjYgIERhdmUgS29ybiAgPGRhdmUua29ybi5jeWd3aW5AZ21haWwuY29tPgorCisJUFIgdGFyZ2V0LzQwMTI1CisJKiBjb25maWd1cmUuYWMgKEFNX0xUTERGTEFHUyk6IEFkZCAtYmluZGlyIG9wdGlvbiBmb3Igd2luZG93cyBETExzLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCisyMDEwLTEyLTE4ICBJYWluIFNhbmRvZSAgPGlhaW5zQGdjYy5nbnUub3JnPgorCisJUFIgbGliZmZpLzI5MTUyCisJUFIgbGliZmZpLzQyMzc4CisJKiBzcmMvcG93ZXJwYy9kYXJ3aW5fY2xvc3VyZS5TOiBQcm92aWRlIERhcndpbjY0IGltcGxlbWVudGF0aW9uLAorCXVwZGF0ZSBjb21tZW50cy4KKwkqIHNyYy9wb3dlcnBjL2ZmaXRhcmdldC5oIChQT1dFUlBDX0RBUldJTjY0KTogTmV3LAorCShGRklfVFJBTVBPTElORV9TSVpFKTogVXBkYXRlIGZvciBEYXJ3aW42NC4KKwkqIHNyYy9wb3dlcnBjL2Rhcndpbi5TOiBQcm92aWRlIERhcndpbjY0IGltcGxlbWVudGF0aW9uLAorCXVwZGF0ZSBjb21tZW50cy4KKwkqIHNyYy9wb3dlcnBjL2ZmaV9kYXJ3aW4uYzogTGlrZXdpc2UuCisKKzIwMTAtMTItMDYgIFJhaW5lciBPcnRoICA8cm9AQ2VCaVRlYy5VbmktQmllbGVmZWxkLkRFPgorCisJKiBjb25maWd1cmUuYWMgKGxpYmZmaV9jdl9hc19hc2NpaV9wc2V1ZG9fb3ApOiBVc2UgZG91YmxlCisJYmFja3NsYXNoZXMuCisJKGxpYmZmaV9jdl9hc19zdHJpbmdfcHNldWRvX29wKTogTGlrZXdpc2UuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKKzIwMTAtMTItMDMgIENodW5nLUxpbiBUYW5nICA8Y2x0YW5nQGNvZGVzb3VyY2VyeS5jb20+CisKKwkqIHNyYy9hcm0vc3lzdi5TIChmZmlfY2xvc3VyZV9TWVNWKTogQWRkIFVOV0lORCB0byAucGFkIGRpcmVjdGl2ZS4KKwkoZmZpX2Nsb3N1cmVfVkZQKTogU2FtZS4KKwkoZmZpX2NhbGxfVkZQKTogTW92ZSBkb3duIHRvIGJlZm9yZSBmZmlfY2xvc3VyZV9WRlAuIEFkZCAnLmZwdSB2ZnAnCisJZGlyZWN0aXZlLgorCisyMDEwLTEyLTAxICBSYWluZXIgT3J0aCAgPHJvQENlQmlUZWMuVW5pLUJpZWxlZmVsZC5ERT4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2ZmaXRlc3QuaCBbX19zZ2ldIChQUklkNjQsIFBSSXU2NCk6IERlZmluZS4KKwkoUFJJdVBUUik6IERlZmluZS4KKworMjAxMC0xMS0yOSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAcmVkaGF0LmNvbT4KKwkgICAgUmFpbmVyIE9ydGggIDxyb0BDZUJpVGVjLlVuaS1CaWVsZWZlbGQuREU+CisKKwkqIHNyYy94ODYvc3lzdi5TIChGREVfRU5DT0RJTkcsIEZERV9FTkNPREUpOiBEZWZpbmUuCisJKC5laF9mcmFtZSk6IFVzZSBGREVfRU5DT0RJTkcuCisJKC5MQVNGREUxLCAuTEFTRkRFMiwgTEFTRkRFMyk6IFNpbXBsaWZ5IHdpdGggRkRFX0VOQ09ERS4KKworMjAxMC0xMS0yMiAgSmFjZWsgQ2FiYW4gPGphY2VrQGNvZGV3ZWF2ZXJzLmNvbT4KKworCSogY29uZmlndXJlLmFjOiBDaGVjayBmb3Igc3ltYm9sIHVuZGVyc2NvcmVzIG9uIG1pbmd3LXc2NC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKwkqIHNyYy94ODYvd2luNjQuUzogQ29ycmVjdGx5IGFjY2VzcyBleHRlcm4gc3ltYm9scyBpbiByZXNwZWN0IHRvCisJdW5kZXJzY29yZXMuCisKKzIwMTAtMTEtMTUgIFJhaW5lciBPcnRoICA8cm9AQ2VCaVRlYy5VbmktQmllbGVmZWxkLkRFPgorCisJKiB0ZXN0c3VpdGUvbGliL2xpYmZmaS1kZy5leHA6IFJlbmFtZSAuLi4KKwkqIHRlc3RzdWl0ZS9saWIvbGliZmZpLmV4cDogLi4uIHRvIHRoaXMuCisJKiBsaWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2NhbGwuZXhwOiBEb24ndCBsb2FkIGxpYmZmaS1kZy5leHAuCisJKiBsaWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5zcGVjaWFsL3NwZWNpYWwuZXhwOiBMaWtld2lzZS4KKworMjAxMC0xMC0yOCAgQ2h1bmctTGluIFRhbmcgIDxjbHRhbmdAY29kZXNvdXJjZXJ5LmNvbT4KKworCSogc3JjL2FybS9mZmkuYyAoZmZpX3ByZXBfYXJncyk6IEFkZCBWRlAgcmVnaXN0ZXIgYXJndW1lbnQgaGFuZGxpbmcKKwljb2RlLCBuZXcgcGFyYW1ldGVyLCBhbmQgcmV0dXJuIHZhbHVlLiBVcGRhdGUgY29tbWVudHMuCisJKGZmaV9wcmVwX2NpZl9tYWNoZGVwKTogQWRkIGNhc2UgZm9yIFZGUCBzdHJ1Y3QgcmV0dXJuIHZhbHVlcy4gQWRkCisJY2FsbCB0byBsYXlvdXRfdmZwX2FyZ3MoKS4KKwkoZmZpX2NhbGxfU1lTVik6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KKwkoZmZpX2NhbGxfVkZQKTogTmV3IGRlY2xhcmF0aW9uLgorCShmZmlfY2FsbCk6IEFkZCBWRlAgc3RydWN0IHJldHVybiBjb25kaXRpb25zLiBDYWxsIGZmaV9jYWxsX1ZGUCgpCisJd2hlbiBBQkkgaXMgRkZJX1ZGUC4KKwkoZmZpX2Nsb3N1cmVfVkZQKTogTmV3IGRlY2xhcmF0aW9uLgorCShmZmlfY2xvc3VyZV9TWVNWX2lubmVyKTogQWRkIG5ldyB2ZnBfYXJncyBwYXJhbWV0ZXIsIHVwZGF0ZSBjYWxsIHRvCisJZmZpX3ByZXBfaW5jb21pbmdfYXJnc19TWVNWKCkuCisJKGZmaV9wcmVwX2luY29taW5nX2FyZ3NfU1lTVik6IFVwZGF0ZSBwYXJhbWV0ZXJzLiBBZGQgVkZQIGFyZ3VtZW50CisJY2FzZSBoYW5kbGluZy4KKwkoZmZpX3ByZXBfY2xvc3VyZV9sb2MpOiBQYXNzIGZmaV9jbG9zdXJlX1ZGUCB0byB0cmFtcG9saW5lCisJY29uc3RydWN0aW9uIHVuZGVyIFZGUCBoYXJkLWZsb2F0LgorCShyZWNfdmZwX3R5cGVfcCk6IE5ldyBmdW5jdGlvbi4KKwkodmZwX3R5cGVfcCk6IFNhbWUuCisJKHBsYWNlX3ZmcF9hcmcpOiBTYW1lLgorCShsYXlvdXRfdmZwX2FyZ3MpOiBTYW1lLgorCSogc3JjL2FybS9mZml0YXJnZXQuaCAoZmZpX2FiaSk6IEFkZCBGRklfVkZQLiBEZWZpbmUgRkZJX0RFRkFVTFRfQUJJCisJYmFzZWQgb24gX19BUk1fUENTX1ZGUC4KKwkoRkZJX0VYVFJBX0NJRl9GSUVMRFMpOiBEZWZpbmUgZm9yIGFkZGluZyBWRlAgaGFyZC1mbG9hdCBzcGVjaWZpYworCWZpZWxkcy4KKwkoRkZJX1RZUEVfU1RSVUNUX1ZGUF9GTE9BVCk6IERlZmluZSBpbnRlcm5hbGx5IHVzZWQgdHlwZSBjb2RlLgorCShGRklfVFlQRV9TVFJVQ1RfVkZQX0RPVUJMRSk6IFNhbWUuCisJKiBzcmMvYXJtL3N5c3YuUyAoZmZpX2NhbGxfU1lTVik6IENoYW5nZSBjYWxsIG9mIGZmaV9wcmVwX2FyZ3MoKSB0bworCWRpcmVjdCBjYWxsLiBNb3ZlIGZ1bmN0aW9uIHBvaW50ZXIgbG9hZCB1cHdhcmRzLgorCShmZmlfY2FsbF9WRlApOiBOZXcgZnVuY3Rpb24uCisJKGZmaV9jbG9zdXJlX1ZGUCk6IFNhbWUuCisKKwkqIHRlc3RzdWl0ZS9saWIvbGliZmZpLWRnLmV4cCAoY2hlY2stZmxhZ3MpOiBOZXcgZnVuY3Rpb24uCisJKGRnLXNraXAtaWYpOiBOZXcgZnVuY3Rpb24uCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2RvdWJsZV92YS5jOiBTa2lwIGlmIHRhcmdldCBpcyBhcm0qLSotKgorCWFuZCBjb21waWxlciBvcHRpb25zIGluY2x1ZGUgLW1mbG9hdC1hYmk9aGFyZC4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbG9uZ2RvdWJsZV92YS5jOiBTYW1lLgorCisyMDEwLTEwLTAxICBKYWt1YiBKZWxpbmVrICA8amFrdWJAcmVkaGF0LmNvbT4KKworCVBSIGxpYmZmaS80NTY3NworCSogc3JjL3g4Ni9mZmk2NC5jIChmZmlfcHJlcF9jaWZfbWFjaGRlcCk6IEVuc3VyZSBjaWYtPmJ5dGVzIGlzCisJYSBtdWx0aXBsZSBvZiA4LgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL21hbnkyLmM6IE5ldyB0ZXN0LgorCisyMDEwLTA4LTIwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+CisKKwkqIHNyYy9jbG9zdXJlcy5jIChvcGVuX3RlbXBfZXhlY19maWxlX21udCk6IENoZWNrIGlmIGdldG1udGVudF9yCisJcmV0dXJucyBOVUxMLgorCisyMDEwLTA4LTA5ICBBbmRyZWFzIFRvYmxlciAgPGFuZHJlYXN0QGZnem5ldC5jaD4KKworCSogY29uZmlndXJlLmFjOiBBZGQgdGFyZ2V0IHBvd2VycGM2NC0qLWZyZWVic2QqLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9sb25nZG91YmxlX3NwbGl0LmM6IFBhc3MKKwktbWxvbmctZG91YmxlLTEyOCBvbmx5IHRvIGxpbnV4IHRhcmdldHMuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2xvbmdkb3VibGVfc3BsaXQyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19sb25nZG91YmxlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2h1Z2Vfc3RydWN0LmM6IExpa2V3aXNlLgorCisyMDEwLTA4LTA1ICBEYW4gV2l0dGUgIDxkd2l0dGVAbW96aWxsYS5jb20+CisKKyAgICAgICAgKiBNYWtlZmlsZS5hbTogUGFzcyBGRklfREVCVUcgZGVmaW5lIHRvIG1zdmNjLnNoIGZvciBsaW5raW5nIHRvIHRoZQorICAgICAgICBkZWJ1ZyBDUlQgd2hlbiAtLWVuYWJsZS1kZWJ1ZyBpcyBnaXZlbi4KKyAgICAgICAgKiBjb25maWd1cmUuYWM6IERlZmluZSBpdC4KKyAgICAgICAgKiBtc3ZjYy5zaDogVHJhbnNsYXRlIC1nIGFuZCAtREZGSV9ERUJVRyBhcHByb3ByaWF0ZWx5LgorCisyMDEwLTA4LTA0ICBEYW4gV2l0dGUgIDxkd2l0dGVAbW96aWxsYS5jb20+CisKKwkqIHNyYy94ODYvZmZpdGFyZ2V0Lmg6IEFkZCBYODZfQU5ZIGRlZmluZSBmb3IgYWxsIHg4Ni94ODZfNjQKKwlwbGF0Zm9ybXMuCisJKiBzcmMveDg2L2ZmaS5jOiBSZW1vdmUgcmVkdW5kYW50IGlmZGVmIGNoZWNrcy4KKwkqIHNyYy9wcmVwX2NpZi5jOiBQdXNoIHN0YWNrIHNwYWNlIGNvbXB1dGF0aW9uIGludG8gc3JjL3g4Ni9mZmkuYworCWZvciBYODZfQU5ZIHNvIHJldHVybiB2YWx1ZSBzcGFjZSBkb2Vzbid0IGdldCBhZGRlZCB0d2ljZS4KKworMjAxMC0wOC0wMyAgTmVpbCBSYXNoYnJvb2tlIDxuZWlsQHBhcmt3YXljYy5jby51az4KKworCSogbXN2Y2Muc2g6IERvbid0IHBhc3MgLXNhZmVzZWggdG8gbWw2NCBiZWNhdXNlIGJlaGF2aW9yIGlzIGJ1Z2d5LgorCisyMDEwLTA3LTIyICBEYW4gV2l0dGUgIDxkd2l0dGVAbW96aWxsYS5jb20+CisKKwkqIHNyYy8qL2ZmaXRhcmdldC5oOiBNYWtlIEZGSV9MQVNUX0FCSSBvbmUgcGFzdCB0aGUgbGFzdCB2YWxpZCBBQkkuCisJKiBzcmMvcHJlcF9jaWYuYzogRml4IEFCSSBhc3NlcnRpb24uCisgICAgICAgICogc3JjL2NyaXMvZmZpLmM6IERpdHRvLgorCisyMDEwLTA3LTEwICBFdmFuIFBob2VuaXggIDxldmFuQGZhbGxpbmdzbm93Lm5ldD4KKworCSogc3JjL2Nsb3N1cmVzLmMgKHNlbGludXhfZW5hYmxlZF9jaGVjayk6IEZpeCBzdHJuY21wIHVzYWdlIGJ1Zy4KKworMjAxMC0wNy0wNyAgRGFuIEhvcsOhayA8ZGFuQGRhbm55LmN6PgorCisJKiBpbmNsdWRlL2ZmaS5oLmluOiBQcm90ZWN0ICNkZWZpbmUgd2l0aCAjaWZuZGVmLgorCSogc3JjL3Bvd2VycGMvZmZpdGFyZ2V0Lmg6IERpdHRvLgorCSogc3JjL3MzOTAvZmZpdGFyZ2V0Lmg6IERpdHRvLgorCSogc3JjL3NwYXJjL2ZmaXRhcmdldC5oOiBEaXR0by4KKworMjAxMC0wNy0wNyAgIE5laWwgUm9iZXJ0cyA8bmVpbEBsaW51eC5pbnRlbC5jb20+CisKKwkqIHNyYy94ODYvc3lzdi5TIChmZmlfY2FsbF9TWVNWKTogQWxpZ24gdGhlIHN0YWNrIHBvaW50ZXIgdG8KKwkxNi1ieXRlcy4KKworMjAxMC0wNy0wMiAgSmFrdWIgSmVsaW5layAgPGpha3ViQHJlZGhhdC5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChBTV9NQUtFRkxBR1MpOiBQYXNzIGFsc28gbWFuZGlyIHRvIHN1Ym1ha2VzLgorCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGVkLgorCisyMDEwLTA1LTE5ICBSYWluZXIgT3J0aCAgPHJvQENlQmlUZWMuVW5pLUJpZWxlZmVsZC5ERT4KKworCSogY29uZmlndXJlLmFjIChsaWJmZmlfY3ZfYXNfeDg2X3BjcmVsKTogQ2hlY2sgZm9yIGlsbGVnYWwgaW4gYXMKKwlvdXRwdXQsIHRvby4KKwkobGliZmZpX2N2X2FzX2FzY2lpX3BzZXVkb19vcCk6IENoZWNrIGZvciAuYXNjaWkuCisJKGxpYmZmaV9jdl9hc19zdHJpbmdfcHNldWRvX29wKTogQ2hlY2sgZm9yIC5zdHJpbmcuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisJKiBmZmljb25maWcuaC5pbjogUmVnZW5lcmF0ZS4KKwkqIHNyYy94ODYvc3lzdi5TICguZWhfZnJhbWUpOiBVc2UgLmFzY2lpLCAuc3RyaW5nIG9yIGVycm9yLgorCisyMDEwLTA1LTExICBEYW4gV2l0dGUgIDxkd2l0dGVAbW96aWxsYS5jb20+CisKKwkqIGRvYy9saWJmZmkudGV4OiBEb2N1bWVudCBwcmV2aW91cyBjaGFuZ2UuCisKKzIwMTAtMDUtMTEgIE1ha290byBLYXRvIDxtX2thdG9AZ2EyLnNvLW5ldC5uZS5qcD4KKworCSogc3JjL3g4Ni9mZmkuYyAoZmZpX2NhbGwpOiBEb24ndCBjb3B5IHN0cnVjdHMgcGFzc2VkIGJ5IHZhbHVlLgorCisyMDEwLTA1LTA1ICBNaWNoYWVsIEtvaGxlciA8bWljaGFlbGtvaGxlckBsaXZlLmNvbT4KKworCSogc3JjL2RsbWFsbG9jLmMgKGRsZnJlZSk6IEZpeCBzcGVsbGluZy4KKwkqIHNyYy9pYTY0L2ZmaS5jIChmZmlfcHJlcF9jaWZfbWFjaGRlcCk6IERpdHRvLgorCSogY29uZmlndXJlLmFjOiBEaXR0by4KKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKworMjAxMC0wNC0xMyAgRGFuIFdpdHRlICA8ZHdpdHRlQG1vemlsbGEuY29tPgorCisJKiBtc3ZjYy5zaDogQnVpbGQgd2l0aCAtVzMgaW5zdGVhZCBvZiAtV2FsbC4KKwkqIHNyYy9wb3dlcnBjL2ZmaV9kYXJ3aW4uYzogUmVtb3ZlIGJ1aWxkIHdhcm5pbmdzLgorCSogc3JjL3g4Ni9mZmkuYzogRGl0dG8uCisJKiBzcmMveDg2L2ZmaXRhcmdldC5oOiBEaXR0by4KKworMjAxMC0wNC0xMiAgRGFuIFdpdHRlICA8ZHdpdHRlQG1vemlsbGEuY29tPgorCSAgICBXYWx0ZXIgTWVpbmwgPHd1bm9AbHN2dy5kZT4KKworCSogY29uZmlndXJlLmFjOiBBZGQgT1MvMiBzdXBwb3J0LgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCSogc3JjL2Nsb3N1cmVzLmM6IERpdHRvLgorCSogc3JjL2RsbWFsbG9jLmM6IERpdHRvLgorCSogc3JjL3g4Ni93aW4zMi5TOiBEaXR0by4KKworMjAxMC0wNC0wNyAgSmFrdWIgSmVsaW5layAgPGpha3ViQHJlZGhhdC5jb20+CisKKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9lcnJfYmFkX2FiaS5jOiBSZW1vdmUgdW51c2VkIGFyZ3MgdmFyaWFibGUuCisKKzIwMTAtMDQtMDIgIFJhbGYgV2lsZGVuaHVlcyAgPFJhbGYuV2lsZGVuaHVlc0BnbXguZGU+CisKKwkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCSogYWNsb2NhbC5tNDogUmVnZW5lcmF0ZS4KKwkqIGluY2x1ZGUvTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisJKiBtYW4vTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisJKiB0ZXN0c3VpdGUvTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisKKzIwMTAtMDMtMzAgIERhbiBXaXR0ZSAgPGR3aXR0ZUBtb3ppbGxhLmNvbT4KKworCSogbXN2Y2Muc2g6IERpc2FibGUgYnVpbGQgd2FybmluZ3MuCisJKiBSRUFETUUgKHRlc3RlZCk6IENsYXJpZnkgd2luZG93cyBidWlsZCBwcm9jZWR1cmUuCisKKzIwMTAtMDMtMTUgIFJhaW5lciBPcnRoICA8cm9AQ2VCaVRlYy5VbmktQmllbGVmZWxkLkRFPgorCisJKiBjb25maWd1cmUuYWMgKGxpYmZmaV9jdl9hc194ODZfNjRfdW53aW5kX3NlY3Rpb25fdHlwZSk6IE5ldyB0ZXN0LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCSogZmZpY29uZmlnLmguaW46IFJlZ2VuZXJhdGUuCisJKiBsaWJmZmkvc3JjL3g4Ni91bml4NjQuUyAoLmVoX2ZyYW1lKQorCVtIQVZFX0FTX1g4Nl82NF9VTldJTkRfU0VDVElPTl9UWVBFXTogVXNlIEB1bndpbmQgc2VjdGlvbiB0eXBlLgorCiAyMDEwLTAzLTE0ICBNYXR0aGlhcyBLbG9zZSAgPGRva29AdWJ1bnR1LmNvbT4KIAogCSogc3JjL3g4Ni9mZmk2NC5jOiBGaXggdHlwbyBpbiBjb21tZW50LgogCSogc3JjL3g4Ni9mZmkuYzogVXNlIC8qIC4uLiAqLyBjb21tZW50IHN0eWxlLgogCisyMDEwLTAyLTI0ICBSYWluZXIgT3J0aCAgPHJvQENlQmlUZWMuVW5pLUJpZWxlZmVsZC5ERT4KKworCSogZG9jL2xpYmZmaS50ZXhpIChUaGUgQ2xvc3VyZSBBUEkpOiBGaXggdHlwby4KKwkqIGRvYy9saWJmZmkuaW5mbzogUmVtb3ZlLgorCisyMDEwLTAyLTE1ICBNYXR0aGlhcyBLbG9zZSAgPGRva29AdWJ1bnR1LmNvbT4KKworCSogc3JjL2FybS9zeXN2LlMgKF9fQVJNX0FSQ0hfXyk6IERlZmluZSBmb3IgcHJvY2Vzc29yCisJX19BUk1fQVJDSF83RU1fXy4KKworMjAxMC0wMS0xNSAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJlZGhhdC5jb20+CisKKwkqIFJFQURNRTogQWRkIG5vdGVzIG9uIGJ1aWxkaW5nIHdpdGggTWljcm9zb2Z0IFZpc3VhbCBDKysuCisKKzIwMTAtMDEtMTUgIERhbmllbCBXaXR0ZSAgPGR3aXR0ZUBtb3ppbGxhLmNvbT4KKworCSogbXN2Y2Muc2g6IE5ldyBmaWxlLgorCisJKiBzcmMveDg2L3dpbjMyLlM6IFBvcnQgYXNzZW1ibHkgcm91dGluZXMgdG8gTVNWQyBhbmQgI2lmZGVmLgorCSogc3JjL3g4Ni9mZmkuYzogVHdlYWsgZnVuY3Rpb24gZGVjbGFyYXRpb24gYW5kIHJlbW92ZSBleGNlc3MKKwlwYXJlbnMuCisJKiBpbmNsdWRlL2ZmaS5oLmluOiBBZGQgX19kZWNsc3BlYyhhbGlnbig4KSkgdG8gdHlwZWRlZiBzdHJ1Y3QKKwlmZmlfY2xvc3VyZS4KKworCSogc3JjL3g4Ni9mZmkuYzogTWVyZ2UgZmZpX2NhbGxfU1lTViBhbmQgZmZpX2NhbGxfU1REQ0FMTCBpbnRvIG5ldworCWZ1bmN0aW9uIGZmaV9jYWxsX3dpbjMyIG9uIFg4Nl9XSU4zMi4KKwkqIHNyYy94ODYvd2luMzIuUyAoZmZpX2NhbGxfU1lTVik6IFJlbmFtZSB0byBmZmlfY2FsbF93aW4zMi4KKwkoZmZpX2NhbGxfU1REQ0FMTCk6IFJlbW92ZS4KKworCSogc3JjL3ByZXBfY2lmLmMgKGZmaV9wcmVwX2NpZik6IE1vdmUgc3RhY2sgc3BhY2UgYWxsb2NhdGlvbiBjb2RlCisJdG8gZmZpX3ByZXBfY2lmX21hY2hkZXAgZm9yIHg4Ni4KKwkqIHNyYy94ODYvZmZpLmMgKGZmaV9wcmVwX2NpZl9tYWNoZGVwKTogVG8gaGVyZS4KKworMjAxMC0wMS0xNSAgT2xpdmVyIEtpZGRsZSAgPG9raWRkbGVAeWFob28uY28udWs+CisKKwkqIHNyYy94ODYvZmZpdGFyZ2V0LmggKGZmaV9hYmkpOiBDaGVjayBmb3IgX19pMzg2IGFuZCBfX2FtZDY0IGZvcgorCVN1biBTdHVkaW8gY29tcGlsZXIgY29tcGF0aWJpbGl0eS4KKworMjAxMC0wMS0xMiAgQ29ucmFkIElyd2luIDxjb25yYWQuaXJ3aW5AZ21haWwuY29tPgorCisJKiBkb2MvbGliZmZpLnRleGk6IEFkZCBjbG9zdXJlIGV4YW1wbGUuCisKIDIwMTAtMDEtMDcgIFJhaW5lciBPcnRoICA8cm9AQ2VCaVRlYy5VbmktQmllbGVmZWxkLkRFPgogCiAJUFIgbGliZmZpLzQwNzAxCkBAIC0xNDgsNiArMTUwMCwxMyBAQAogCSogc3JjL3BhL2ZmaS5jIChmZmlfY2xvc3VyZV9pbm5lcl9wYTMyKTogSGFuZGxlIEZGSV9UWVBFX0xPTkdET1VCTEUKIAl0eXBlIG9uIEhQLVVYLgogCisyMDEyLTAyLTEzICBLYWkgVGlldHogIDxrdGlldHpAcmVkaGF0LmNvbT4KKworCVBSIGxpYmZmaS81MjIyMQorCSogc3JjL3g4Ni9mZmkuYyAoZmZpX3ByZXBfcmF3X2Nsb3N1cmVfbG9jKTogQWRkIHRoaXNjYWxsCisJc3VwcG9ydCBmb3IgWDg2X1dJTjMyLgorCShGRklfSU5JVF9UUkFNUE9MSU5FX1RISVNDQUxMKTogRml4IGRpc3BsYWNlbWVudC4KKwogMjAwOS0xMi0xMSAgRXJpYyBCb3RjYXpvdSAgPGVib3RjYXpvdUBhZGFjb3JlLmNvbT4KIAogCSogc3JjL3NwYXJjL2ZmaS5jIChmZmlfY2xvc3VyZV9zcGFyY19pbm5lcl92OSk6IFByb3Blcmx5IGFsaWduICdsb25nCkBAIC0zMjIsNiArMTY4MSwxMSBAQAogCSogbWFuL01ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgogCSogdGVzdHN1aXRlL01ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgogCisyMDExLTA4LTIyICBKYXNwZXIgTGlldmlzc2UgQWRyaWFhbnNlIDxqYXNwZXJAb3BlbmJzZC5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzogQWRkIE9wZW5CU0QvaHBwYSBhbmQgT3BlbkJTRC9wb3dlcnBjIHN1cHBvcnQuCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisKIDIwMDktMDctMzAgIFJhbGYgV2lsZGVuaHVlcyAgPFJhbGYuV2lsZGVuaHVlc0BnbXguZGU+CiAKIAkqIGNvbmZpZ3VyZS5hYyAoX0FDX0FSR19WQVJfUFJFQ0lPVVMpOiBVc2UgbTRfcmVuYW1lX2ZvcmNlLgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9DaGFuZ2VMb2cubGliZmZpIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9DaGFuZ2VMb2cubGliZmZpCmluZGV4IDUyNzJmMzMuLjQ5YmE4ZGEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvQ2hhbmdlTG9nLmxpYmZmaQorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL0NoYW5nZUxvZy5saWJmZmkKQEAgLTEsMzUgKzEsNiBAQAotMjAxMC0wMS0xNSAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJlZGhhdC5jb20+CisyMDExLTAyLTA4ICBBbmRyZWFzIFRvYmxlciAgPGFuZHJlYXN0QGZnem5ldC5jaD4KIAotCSogUkVBRE1FOiBBZGQgbm90ZXMgb24gYnVpbGRpbmcgd2l0aCBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KLQotMjAxMC0wMS0xNSAgRGFuaWVsIFdpdHRlICA8ZHdpdHRlQG1vemlsbGEuY29tPgotCi0JKiBtc3ZjYy5zaDogTmV3IGZpbGUuCi0KLQkqIHNyYy94ODYvd2luMzIuUzogUG9ydCBhc3NlbWJseSByb3V0aW5lcyB0byBNU1ZDIGFuZCAjaWZkZWYuCi0JKiBzcmMveDg2L2ZmaS5jOiBUd2VhayBmdW5jdGlvbiBkZWNsYXJhdGlvbiBhbmQgcmVtb3ZlIGV4Y2VzcwotCXBhcmVucy4KLQkqIGluY2x1ZGUvZmZpLmguaW46IEFkZCBfX2RlY2xzcGVjKGFsaWduKDgpKSB0byB0eXBlZGVmIHN0cnVjdAotCWZmaV9jbG9zdXJlLgotCi0JKiBzcmMveDg2L2ZmaS5jOiBNZXJnZSBmZmlfY2FsbF9TWVNWIGFuZCBmZmlfY2FsbF9TVERDQUxMIGludG8gbmV3Ci0JZnVuY3Rpb24gZmZpX2NhbGxfd2luMzIgb24gWDg2X1dJTjMyLgotCSogc3JjL3g4Ni93aW4zMi5TIChmZmlfY2FsbF9TWVNWKTogUmVuYW1lIHRvIGZmaV9jYWxsX3dpbjMyLgotCShmZmlfY2FsbF9TVERDQUxMKTogUmVtb3ZlLgotCi0JKiBzcmMvcHJlcF9jaWYuYyAoZmZpX3ByZXBfY2lmKTogTW92ZSBzdGFjayBzcGFjZSBhbGxvY2F0aW9uIGNvZGUKLQl0byBmZmlfcHJlcF9jaWZfbWFjaGRlcCBmb3IgeDg2LgotCSogc3JjL3g4Ni9mZmkuYyAoZmZpX3ByZXBfY2lmX21hY2hkZXApOiBUbyBoZXJlLgotCi0yMDEwLTAxLTE1ICBPbGl2ZXIgS2lkZGxlICA8b2tpZGRsZUB5YWhvby5jby51az4KLQotCSogc3JjL3g4Ni9mZml0YXJnZXQuaCAoZmZpX2FiaSk6IENoZWNrIGZvciBfX2kzODYgYW5kIF9fYW1kNjQgZm9yCi0JU3VuIFN0dWRpbyBjb21waWxlciBjb21wYXRpYmlsaXR5LiAKLQotMjAxMC0wMS0xMiAgQ29ucmFkIElyd2luIDxjb25yYWQuaXJ3aW5AZ21haWwuY29tPgotCi0JKiBkb2MvbGliZmZpLnRleGk6IEFkZCBjbG9zdXJlIGV4YW1wbGUuCi0JKiBkb2MvbGliZmZpLmluZm86IFJlYnVpbHQuCisJKiB0ZXN0c3VpdGUvbGliL2xpYmZmaS5leHA6IFR3ZWFrIGZvciBzdGFuZC1hbG9uZSBtb2RlLgogCiAyMDA5LTEyLTI1ICBTYW11bGkgU3VvbWluZW4gIDxzc3VvbWluZW5AZ2VudG9vLm9yZz4KIApAQCAtNjAzLDggKzU3NCw4IEBACiAJKiBNYWtlZmlsZS5hbSwgaW5jbHVkZS9NYWtlZmlsZS5hbTogTW92ZSBoZWFkZXJzIHRvCiAJbGliZmZpX2xhX1NPVVJDRVMgZm9yIG5ldyBhdXRvbWFrZS4KIAkqIE1ha2VmaWxlLmluLCBpbmNsdWRlL01ha2VmaWxlLmluOiBSZWJ1aWx0LgotCQotCSogdGVzdHN1aXRlL2xpYi93cmFwcGVyLmV4cDogQ29waWVkIGZyb20gZ2NjIHRyZWUgdG8gYWxsb3cgZm9yIAorCisJKiB0ZXN0c3VpdGUvbGliL3dyYXBwZXIuZXhwOiBDb3BpZWQgZnJvbSBnY2MgdHJlZSB0byBhbGxvdyBmb3IKIAlleGVjdXRpb24gb3V0c2lkZSBvZiBnY2MgdHJlZS4KIAkqIHRlc3RzdWl0ZS9saWIvdGFyZ2V0LWxpYnBhdGguZXhwOiBEaXR0by4KIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9MSUNFTlNFIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9MSUNFTlNFCmluZGV4IGVjMmZkNjkuLmFhNjAzNDIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvTElDRU5TRQorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL0xJQ0VOU0UKQEAgLTEsNCArMSw0IEBACi1saWJmZmkgLSBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwOSAgQW50aG9ueSBHcmVlbiwgUmVkIEhhdCwgSW5jIGFuZCBvdGhlcnMuICAKK2xpYmZmaSAtIENvcHlyaWdodCAoYykgMTk5Ni0yMDEyICBBbnRob255IEdyZWVuLCBSZWQgSGF0LCBJbmMgYW5kIG90aGVycy4KIFNlZSBzb3VyY2UgZmlsZXMgZm9yIGRldGFpbHMuCiAKIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwpAQCAtOSw4ICs5LDggQEAKIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAotaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQoraW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiAKIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvTWFrZWZpbGUuYW0gYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL01ha2VmaWxlLmFtCmluZGV4IGY0N2RkMWEuLmJmMDE1NmYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvTWFrZWZpbGUuYW0KKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9NYWtlZmlsZS5hbQpAQCAtMiwzNyArMiw1MCBAQAogCiBBVVRPTUFLRV9PUFRJT05TID0gZm9yZWlnbiBzdWJkaXItb2JqZWN0cwogCitBQ0xPQ0FMX0FNRkxBR1MgPSAtSSBtNAorCiBTVUJESVJTID0gaW5jbHVkZSB0ZXN0c3VpdGUgbWFuCiAKLUVYVFJBX0RJU1QgPSBMSUNFTlNFIENoYW5nZUxvZy52MSBDaGFuZ2VMb2cubGliZ2NqIGNvbmZpZ3VyZS5ob3N0IFwKLQlzcmMvYWxwaGEvZmZpLmMgc3JjL2FscGhhL29zZi5TIHNyYy9hbHBoYS9mZml0YXJnZXQuaCBcCi0Jc3JjL2FybS9mZmkuYyBzcmMvYXJtL3N5c3YuUyBzcmMvYXJtL2ZmaXRhcmdldC5oIFwKLQlzcmMvYXZyMzIvZmZpLmMgc3JjL2F2cjMyL3N5c3YuUyBzcmMvYXZyMzIvZmZpdGFyZ2V0LmggXAotCXNyYy9jcmlzL2ZmaS5jIHNyYy9jcmlzL3N5c3YuUyBzcmMvY3Jpcy9mZml0YXJnZXQuaCBcCi0Jc3JjL2lhNjQvZmZpLmMgc3JjL2lhNjQvZmZpdGFyZ2V0Lmggc3JjL2lhNjQvaWE2NF9mbGFncy5oIFwKLQlzcmMvaWE2NC91bml4LlMgXAotCXNyYy9taXBzL2ZmaS5jIHNyYy9taXBzL24zMi5TIHNyYy9taXBzL28zMi5TIFwKLQlzcmMvbWlwcy9mZml0YXJnZXQuaCBcCi0Jc3JjL20zMnIvZmZpLmMgc3JjL20zMnIvc3lzdi5TIHNyYy9tMzJyL2ZmaXRhcmdldC5oIFwKLQlzcmMvbTY4ay9mZmkuYyBzcmMvbTY4ay9zeXN2LlMgc3JjL202OGsvZmZpdGFyZ2V0LmggXAotCXNyYy9wb3dlcnBjL2ZmaS5jIHNyYy9wb3dlcnBjL3N5c3YuUyBcCi0Jc3JjL3Bvd2VycGMvbGludXg2NC5TIHNyYy9wb3dlcnBjL2xpbnV4NjRfY2xvc3VyZS5TIFwKLQlzcmMvcG93ZXJwYy9wcGNfY2xvc3VyZS5TIHNyYy9wb3dlcnBjL2FzbS5oIFwKLQlzcmMvcG93ZXJwYy9haXguUyBzcmMvcG93ZXJwYy9kYXJ3aW4uUyBcCi0Jc3JjL3Bvd2VycGMvYWl4X2Nsb3N1cmUuUyBzcmMvcG93ZXJwYy9kYXJ3aW5fY2xvc3VyZS5TIFwKLQlzcmMvcG93ZXJwYy9mZmlfZGFyd2luLmMgc3JjL3Bvd2VycGMvZmZpdGFyZ2V0LmggXAotCXNyYy9zMzkwL2ZmaS5jIHNyYy9zMzkwL3N5c3YuUyBzcmMvczM5MC9mZml0YXJnZXQuaCBcCi0Jc3JjL3NoL2ZmaS5jIHNyYy9zaC9zeXN2LlMgc3JjL3NoL2ZmaXRhcmdldC5oIFwKLQlzcmMvc2g2NC9mZmkuYyBzcmMvc2g2NC9zeXN2LlMgc3JjL3NoNjQvZmZpdGFyZ2V0LmggXAotCXNyYy9zcGFyYy92OC5TIHNyYy9zcGFyYy92OS5TIHNyYy9zcGFyYy9mZml0YXJnZXQuaCBcCi0Jc3JjL3NwYXJjL2ZmaS5jIHNyYy94ODYvZGFyd2luNjQuUyBcCi0Jc3JjL3g4Ni9mZmkuYyBzcmMveDg2L3N5c3YuUyBzcmMveDg2L3dpbjMyLlMgc3JjL3g4Ni93aW42NC5TIFwKLQlzcmMveDg2L2Rhcndpbi5TIHNyYy94ODYvZnJlZWJzZC5TIFwKLQlzcmMveDg2L2ZmaTY0LmMgc3JjL3g4Ni91bml4NjQuUyBzcmMveDg2L2ZmaXRhcmdldC5oIFwKLQlzcmMvcGEvZmZpdGFyZ2V0Lmggc3JjL3BhL2ZmaS5jIHNyYy9wYS9saW51eC5TIHNyYy9wYS9ocHV4MzIuUyBcCi0Jc3JjL2Zydi9mZmkuYyBzcmMvZnJ2L2VhYmkuUyBzcmMvZnJ2L2ZmaXRhcmdldC5oIHNyYy9kbG1hbGxvYy5jIFwKLQlsaWJ0b29sLXZlcnNpb24gQ2hhbmdlTG9nLmxpYmZmaSBtNC9saWJ0b29sLm00IFwKLQltNC9sdH5vYnNvbGV0ZS5tNCBtNC9sdG9wdGlvbnMubTQgbTQvbHRzdWdhci5tNCBtNC9sdHZlcnNpb24ubTQKK0VYVFJBX0RJU1QgPSBMSUNFTlNFIENoYW5nZUxvZy52MSBDaGFuZ2VMb2cubGliZ2NqIGNvbmZpZ3VyZS5ob3N0CVwKKwkgc3JjL2FhcmNoNjQvZmZpLmMgc3JjL2FhcmNoNjQvZmZpdGFyZ2V0Lmggc3JjL2FhcmNoNjQvc3lzdi5TCVwKKwkgYnVpbGQtaW9zLnNoIHNyYy9hbHBoYS9mZmkuYyBzcmMvYWxwaGEvb3NmLlMJCQlcCisJIHNyYy9hbHBoYS9mZml0YXJnZXQuaCBzcmMvYXJtL2ZmaS5jIHNyYy9hcm0vc3lzdi5TCQlcCisJIHNyYy9hcm0vZmZpdGFyZ2V0Lmggc3JjL2F2cjMyL2ZmaS5jIHNyYy9hdnIzMi9zeXN2LlMJCVwKKwkgc3JjL2F2cjMyL2ZmaXRhcmdldC5oIHNyYy9jcmlzL2ZmaS5jIHNyYy9jcmlzL3N5c3YuUwkJXAorCSBzcmMvY3Jpcy9mZml0YXJnZXQuaCBzcmMvaWE2NC9mZmkuYyBzcmMvaWE2NC9mZml0YXJnZXQuaAlcCisJIHNyYy9pYTY0L2lhNjRfZmxhZ3MuaCBzcmMvaWE2NC91bml4LlMgc3JjL21pcHMvZmZpLmMJCVwKKwkgc3JjL21pcHMvbjMyLlMgc3JjL21pcHMvbzMyLlMgc3JjL21ldGFnL2ZmaS5jCQkJXAorCSBzcmMvbWV0YWcvZmZpdGFyZ2V0Lmggc3JjL21ldGFnL3N5c3YuUyBzcmMvbW94aWUvZmZpLmMJCVwKKwkgc3JjL21veGllL2ZmaXRhcmdldC5oIHNyYy9tb3hpZS9lYWJpLlMgc3JjL21pcHMvZmZpdGFyZ2V0LmgJXAorCSBzcmMvbTMyci9mZmkuYyBzcmMvbTMyci9zeXN2LlMgc3JjL20zMnIvZmZpdGFyZ2V0LmgJCVwKKwkgc3JjL202OGsvZmZpLmMgc3JjL202OGsvc3lzdi5TIHNyYy9tNjhrL2ZmaXRhcmdldC5oCQlcCisJIHNyYy9taWNyb2JsYXplL2ZmaS5jIHNyYy9taWNyb2JsYXplL3N5c3YuUwkJCVwKKwkgc3JjL21pY3JvYmxhemUvZmZpdGFyZ2V0Lmggc3JjL3Bvd2VycGMvZmZpLmMJCQlcCisJIHNyYy9wb3dlcnBjL3N5c3YuUyBzcmMvcG93ZXJwYy9saW51eDY0LlMJCQlcCisJIHNyYy9wb3dlcnBjL2xpbnV4NjRfY2xvc3VyZS5TIHNyYy9wb3dlcnBjL3BwY19jbG9zdXJlLlMJXAorCSBzcmMvcG93ZXJwYy9hc20uaCBzcmMvcG93ZXJwYy9haXguUyBzcmMvcG93ZXJwYy9kYXJ3aW4uUwlcCisJIHNyYy9wb3dlcnBjL2FpeF9jbG9zdXJlLlMgc3JjL3Bvd2VycGMvZGFyd2luX2Nsb3N1cmUuUwkJXAorCSBzcmMvcG93ZXJwYy9mZmlfZGFyd2luLmMgc3JjL3Bvd2VycGMvZmZpdGFyZ2V0LmgJCVwKKwkgc3JjL3MzOTAvZmZpLmMgc3JjL3MzOTAvc3lzdi5TIHNyYy9zMzkwL2ZmaXRhcmdldC5oCQlcCisJIHNyYy9zaC9mZmkuYyBzcmMvc2gvc3lzdi5TIHNyYy9zaC9mZml0YXJnZXQuaCBzcmMvc2g2NC9mZmkuYwlcCisJIHNyYy9zaDY0L3N5c3YuUyBzcmMvc2g2NC9mZml0YXJnZXQuaCBzcmMvc3BhcmMvdjguUwkJXAorCSBzcmMvc3BhcmMvdjkuUyBzcmMvc3BhcmMvZmZpdGFyZ2V0Lmggc3JjL3NwYXJjL2ZmaS5jCQlcCisJIHNyYy94ODYvZGFyd2luNjQuUyBzcmMveDg2L2ZmaS5jIHNyYy94ODYvc3lzdi5TCQlcCisJIHNyYy94ODYvd2luMzIuUyBzcmMveDg2L2Rhcndpbi5TIHNyYy94ODYvd2luNjQuUwkJXAorCSBzcmMveDg2L2ZyZWVic2QuUyBzcmMveDg2L2ZmaTY0LmMgc3JjL3g4Ni91bml4NjQuUwkJXAorCSBzcmMveDg2L2ZmaXRhcmdldC5oIHNyYy9wYS9mZml0YXJnZXQuaCBzcmMvcGEvZmZpLmMJCVwKKwkgc3JjL3BhL2xpbnV4LlMgc3JjL3BhL2hwdXgzMi5TIHNyYy9mcnYvZmZpLmMgc3JjL2JmaW4vZmZpLmMJXAorCSBzcmMvYmZpbi9mZml0YXJnZXQuaCBzcmMvYmZpbi9zeXN2LlMgc3JjL2Zydi9lYWJpLlMJCVwKKwkgc3JjL2Zydi9mZml0YXJnZXQuaCBzcmMvZGxtYWxsb2MuYyBzcmMvdGlsZS9mZmkuYwkJXAorCSBzcmMvdGlsZS9mZml0YXJnZXQuaCBzcmMvdGlsZS90aWxlLlMgbGlidG9vbC12ZXJzaW9uCQlcCisJIHNyYy94dGVuc2EvZmZpdGFyZ2V0Lmggc3JjL3h0ZW5zYS9mZmkuYyBzcmMveHRlbnNhL3N5c3YuUwlcCisJIENoYW5nZUxvZy5saWJmZmkgbTQvbGlidG9vbC5tNCBtNC9sdH5vYnNvbGV0ZS5tNAkJXAorCSBtNC9sdG9wdGlvbnMubTQgbTQvbHRzdWdhci5tNCBtNC9sdHZlcnNpb24ubTQJCQlcCisJIG00L2x0dmVyc2lvbi5tNCBzcmMvYXJtL2dlbnRyYW1wLnNoIHNyYy9kZWJ1Zy5jIG1zdmNjLnNoCVwKKwkgZ2VuZXJhdGUtaW9zLXNvdXJjZS1hbmQtaGVhZGVycy5weQkJCQlcCisJIGdlbmVyYXRlLW9zeC1zb3VyY2UtYW5kLWhlYWRlcnMucHkJCQkJXAorCSBsaWJmZmkueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBzcmMvYXJtL3RyYW1wb2xpbmUuUwkJXAorCSBsaWJ0b29sLWxkZmxhZ3MKIAogaW5mb19URVhJTkZPUyA9IGRvYy9saWJmZmkudGV4aQogCkBAIC02OSw2ICs4Miw3IEBACiAJImV4ZWNfcHJlZml4PSQoZXhlY19wcmVmaXgpIiBcCiAJImluZm9kaXI9JChpbmZvZGlyKSIgXAogCSJsaWJkaXI9JChsaWJkaXIpIiBcCisJIm1hbmRpcj0kKG1hbmRpcikiIFwKIAkicHJlZml4PSQocHJlZml4KSIgXAogCSJBUj0kKEFSKSIgXAogCSJBUz0kKEFTKSIgXApAQCAtNzksMTQgKzkzLDE1IEBACiAJIlJBTkxJQj0kKFJBTkxJQikiIFwKIAkiREVTVERJUj0kKERFU1RESVIpIgogCisjIFN1YmRpciBydWxlcyByZWx5IG9uICQoRkxBR1NfVE9fUEFTUykKK0ZMQUdTX1RPX1BBU1MgPSAkKEFNX01BS0VGTEFHUykKKwogTUFLRU9WRVJSSURFUz0KIAotQUNMT0NBTF9BTUZMQUdTPSQoQUNMT0NBTF9BTUZMQUdTKSAtSSBtNAotCi1saWJfTFRMSUJSQVJJRVMgPSBsaWJmZmkubGEKK3Rvb2xleGVjbGliX0xUTElCUkFSSUVTID0gbGliZmZpLmxhCiBub2luc3RfTFRMSUJSQVJJRVMgPSBsaWJmZmlfY29udmVuaWVuY2UubGEKIAotbGliZmZpX2xhX1NPVVJDRVMgPSBzcmMvZGVidWcuYyBzcmMvcHJlcF9jaWYuYyBzcmMvdHlwZXMuYyBcCitsaWJmZmlfbGFfU09VUkNFUyA9IHNyYy9wcmVwX2NpZi5jIHNyYy90eXBlcy5jIFwKIAkJc3JjL3Jhd19hcGkuYyBzcmMvamF2YV9yYXdfYXBpLmMgc3JjL2Nsb3N1cmVzLmMKIAogcGtnY29uZmlnZGlyID0gJChsaWJkaXIpL3BrZ2NvbmZpZwpAQCAtOTQsOSArMTA5LDE2IEBACiAKIG5vZGlzdF9saWJmZmlfbGFfU09VUkNFUyA9CiAKK2lmIEZGSV9ERUJVRworbm9kaXN0X2xpYmZmaV9sYV9TT1VSQ0VTICs9IHNyYy9kZWJ1Zy5jCitlbmRpZgorCiBpZiBNSVBTCiBub2Rpc3RfbGliZmZpX2xhX1NPVVJDRVMgKz0gc3JjL21pcHMvZmZpLmMgc3JjL21pcHMvbzMyLlMgc3JjL21pcHMvbjMyLlMKIGVuZGlmCitpZiBCRklOCitub2Rpc3RfbGliZmZpX2xhX1NPVVJDRVMgKz0gc3JjL2JmaW4vZmZpLmMgc3JjL2JmaW4vc3lzdi5TCitlbmRpZgogaWYgWDg2CiBub2Rpc3RfbGliZmZpX2xhX1NPVVJDRVMgKz0gc3JjL3g4Ni9mZmkuYyBzcmMveDg2L3N5c3YuUwogZW5kaWYKQEAgLTEyNyw2ICsxNDksMTIgQEAKIGlmIE02OEsKIG5vZGlzdF9saWJmZmlfbGFfU09VUkNFUyArPSBzcmMvbTY4ay9mZmkuYyBzcmMvbTY4ay9zeXN2LlMKIGVuZGlmCitpZiBNT1hJRQorbm9kaXN0X2xpYmZmaV9sYV9TT1VSQ0VTICs9IHNyYy9tb3hpZS9mZmkuYyBzcmMvbW94aWUvZWFiaS5TCitlbmRpZgoraWYgTUlDUk9CTEFaRQorbm9kaXN0X2xpYmZmaV9sYV9TT1VSQ0VTICs9IHNyYy9taWNyb2JsYXplL2ZmaS5jIHNyYy9taWNyb2JsYXplL3N5c3YuUworZW5kaWYKIGlmIFBPV0VSUEMKIG5vZGlzdF9saWJmZmlfbGFfU09VUkNFUyArPSBzcmMvcG93ZXJwYy9mZmkuYyBzcmMvcG93ZXJwYy9zeXN2LlMgc3JjL3Bvd2VycGMvcHBjX2Nsb3N1cmUuUyBzcmMvcG93ZXJwYy9saW51eDY0LlMgc3JjL3Bvd2VycGMvbGludXg2NF9jbG9zdXJlLlMKIGVuZGlmCkBAIC0xMzksOCArMTY3LDE0IEBACiBpZiBQT1dFUlBDX0ZSRUVCU0QKIG5vZGlzdF9saWJmZmlfbGFfU09VUkNFUyArPSBzcmMvcG93ZXJwYy9mZmkuYyBzcmMvcG93ZXJwYy9zeXN2LlMgc3JjL3Bvd2VycGMvcHBjX2Nsb3N1cmUuUwogZW5kaWYKK2lmIEFBUkNINjQKK25vZGlzdF9saWJmZmlfbGFfU09VUkNFUyArPSBzcmMvYWFyY2g2NC9zeXN2LlMgc3JjL2FhcmNoNjQvZmZpLmMKK2VuZGlmCiBpZiBBUk0KIG5vZGlzdF9saWJmZmlfbGFfU09VUkNFUyArPSBzcmMvYXJtL3N5c3YuUyBzcmMvYXJtL2ZmaS5jCitpZiBGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFCitub2Rpc3RfbGliZmZpX2xhX1NPVVJDRVMgKz0gc3JjL2FybS90cmFtcG9saW5lLlMKK2VuZGlmCiBlbmRpZgogaWYgQVZSMzIKIG5vZGlzdF9saWJmZmlfbGFfU09VUkNFUyArPSBzcmMvYXZyMzIvc3lzdi5TIHNyYy9hdnIzMi9mZmkuYwpAQCAtMTY5LDE4ICsyMDMsMjMgQEAKIGlmIFBBX0hQVVgKIG5vZGlzdF9saWJmZmlfbGFfU09VUkNFUyArPSBzcmMvcGEvaHB1eDMyLlMgc3JjL3BhL2ZmaS5jCiBlbmRpZgoraWYgVElMRQorbm9kaXN0X2xpYmZmaV9sYV9TT1VSQ0VTICs9IHNyYy90aWxlL3RpbGUuUyBzcmMvdGlsZS9mZmkuYworZW5kaWYKK2lmIFhURU5TQQorbm9kaXN0X2xpYmZmaV9sYV9TT1VSQ0VTICs9IHNyYy94dGVuc2Evc3lzdi5TIHNyYy94dGVuc2EvZmZpLmMKK2VuZGlmCitpZiBNRVRBRworbm9kaXN0X2xpYmZmaV9sYV9TT1VSQ0VTICs9IHNyYy9tZXRhZy9zeXN2LlMgc3JjL21ldGFnL2ZmaS5jCitlbmRpZgogCiBsaWJmZmlfY29udmVuaWVuY2VfbGFfU09VUkNFUyA9ICQobGliZmZpX2xhX1NPVVJDRVMpCiBub2Rpc3RfbGliZmZpX2NvbnZlbmllbmNlX2xhX1NPVVJDRVMgPSAkKG5vZGlzdF9saWJmZmlfbGFfU09VUkNFUykKIAotQU1fQ0ZMQUdTID0gLVdhbGwgLWcgLWZleGNlcHRpb25zCitMVExERkxBR1MgPSAkKHNoZWxsICQoU0hFTEwpICQodG9wX3NyY2RpcikvbGlidG9vbC1sZGZsYWdzICQoTERGTEFHUykpCiAKLWxpYmZmaV9sYV9MREZMQUdTID0gLXZlcnNpb24taW5mbyBgZ3JlcCAtdiAnXlwjJyAkKHNyY2RpcikvbGlidG9vbC12ZXJzaW9uYCAkKExUTERGTEFHUykgJChBTV9MVExERkxBR1MpCitsaWJmZmlfbGFfTERGTEFHUyA9IC1uby11bmRlZmluZWQgLXZlcnNpb24taW5mbyBgZ3JlcCAtdiAnXlwjJyAkKHNyY2RpcikvbGlidG9vbC12ZXJzaW9uYCAkKExUTERGTEFHUykgJChBTV9MVExERkxBR1MpCiAKIEFNX0NQUEZMQUdTID0gLUkuIC1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlIC1JaW5jbHVkZSAtSSQodG9wX3NyY2Rpcikvc3JjCiBBTV9DQ0FTRkxBR1MgPSAkKEFNX0NQUEZMQUdTKQogCi0jIE5vIGluc3RhbGwtaHRtbCBvciBpbnN0YWxsLXBkZiBzdXBwb3J0IGluIGF1dG9tYWtlIHlldAotLlBIT05ZOiBpbnN0YWxsLWh0bWwgaW5zdGFsbC1wZGYKLWluc3RhbGwtaHRtbDoKLWluc3RhbGwtcGRmOgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9NYWtlZmlsZS5pbiBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvTWFrZWZpbGUuaW4KaW5kZXggNDlhZmNjMS4uNGI2YWJlNSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9NYWtlZmlsZS5pbgorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL01ha2VmaWxlLmluCkBAIC0xLDkgKzEsOCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMSBmcm9tIE1ha2VmaWxlLmFtLgorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMi4yIGZyb20gTWFrZWZpbGUuYW0uCiAjIEBjb25maWd1cmVfaW5wdXRACiAKLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAotIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0jIEluYy4KKyMgQ29weXJpZ2h0IChDKSAxOTk0LTIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKICMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCiAjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCiAjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KQEAgLTE3LDYgKzE2LDIzIEBACiAKIAogVlBBVEggPSBAc3JjZGlyQAorYW1fX21ha2VfZHJ5cnVuID0gXAorICB7IFwKKyAgICBhbV9fZHJ5PW5vOyBcCisgICAgY2FzZSAkJE1BS0VGTEFHUyBpbiBcCisgICAgICAqXFxbXCBcCV0qKSBcCisgICAgICAgIGVjaG8gJ2FtLS1lY2hvOiA7IEBlY2hvICJBTSIgIE9LJyB8ICQoTUFLRSkgLWYgLSAyPi9kZXYvbnVsbCBcCisgICAgICAgICAgfCBncmVwICdeQU0gT0skJCcgPi9kZXYvbnVsbCB8fCBhbV9fZHJ5PXllczs7IFwKKyAgICAgICopIFwKKyAgICAgICAgZm9yIGFtX19mbGcgaW4gJCRNQUtFRkxBR1M7IGRvIFwKKyAgICAgICAgICBjYXNlICQkYW1fX2ZsZyBpbiBcCisgICAgICAgICAgICAqPSp8LS0qKSA7OyBcCisgICAgICAgICAgICAqbiopIGFtX19kcnk9eWVzOyBicmVhazs7IFwKKyAgICAgICAgICBlc2FjOyBcCisgICAgICAgIGRvbmU7OyBcCisgICAgZXNhYzsgXAorICAgIHRlc3QgJCRhbV9fZHJ5ID0geWVzOyBcCisgIH0KIHBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAogcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACiBwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACkBAIC0zNiwzMSArNTIsNDAgQEAKIGJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACiBob3N0X3RyaXBsZXQgPSBAaG9zdEAKIHRhcmdldF90cmlwbGV0ID0gQHRhcmdldEAKLUBNSVBTX1RSVUVAYW1fX2FwcGVuZF8xID0gc3JjL21pcHMvZmZpLmMgc3JjL21pcHMvbzMyLlMgc3JjL21pcHMvbjMyLlMKLUBYODZfVFJVRUBhbV9fYXBwZW5kXzIgPSBzcmMveDg2L2ZmaS5jIHNyYy94ODYvc3lzdi5TCi1AWDg2X0ZSRUVCU0RfVFJVRUBhbV9fYXBwZW5kXzMgPSBzcmMveDg2L2ZmaS5jIHNyYy94ODYvZnJlZWJzZC5TCi1AWDg2X1dJTjMyX1RSVUVAYW1fX2FwcGVuZF80ID0gc3JjL3g4Ni9mZmkuYyBzcmMveDg2L3dpbjMyLlMKLUBYODZfV0lONjRfVFJVRUBhbV9fYXBwZW5kXzUgPSBzcmMveDg2L2ZmaS5jIHNyYy94ODYvd2luNjQuUwotQFg4Nl9EQVJXSU5fVFJVRUBhbV9fYXBwZW5kXzYgPSBzcmMveDg2L2ZmaS5jIHNyYy94ODYvZGFyd2luLlMgc3JjL3g4Ni9mZmk2NC5jIHNyYy94ODYvZGFyd2luNjQuUwotQFNQQVJDX1RSVUVAYW1fX2FwcGVuZF83ID0gc3JjL3NwYXJjL2ZmaS5jIHNyYy9zcGFyYy92OC5TIHNyYy9zcGFyYy92OS5TCi1AQUxQSEFfVFJVRUBhbV9fYXBwZW5kXzggPSBzcmMvYWxwaGEvZmZpLmMgc3JjL2FscGhhL29zZi5TCi1ASUE2NF9UUlVFQGFtX19hcHBlbmRfOSA9IHNyYy9pYTY0L2ZmaS5jIHNyYy9pYTY0L3VuaXguUwotQE0zMlJfVFJVRUBhbV9fYXBwZW5kXzEwID0gc3JjL20zMnIvc3lzdi5TIHNyYy9tMzJyL2ZmaS5jCi1ATTY4S19UUlVFQGFtX19hcHBlbmRfMTEgPSBzcmMvbTY4ay9mZmkuYyBzcmMvbTY4ay9zeXN2LlMKLUBQT1dFUlBDX1RSVUVAYW1fX2FwcGVuZF8xMiA9IHNyYy9wb3dlcnBjL2ZmaS5jIHNyYy9wb3dlcnBjL3N5c3YuUyBzcmMvcG93ZXJwYy9wcGNfY2xvc3VyZS5TIHNyYy9wb3dlcnBjL2xpbnV4NjQuUyBzcmMvcG93ZXJwYy9saW51eDY0X2Nsb3N1cmUuUwotQFBPV0VSUENfQUlYX1RSVUVAYW1fX2FwcGVuZF8xMyA9IHNyYy9wb3dlcnBjL2ZmaV9kYXJ3aW4uYyBzcmMvcG93ZXJwYy9haXguUyBzcmMvcG93ZXJwYy9haXhfY2xvc3VyZS5TCi1AUE9XRVJQQ19EQVJXSU5fVFJVRUBhbV9fYXBwZW5kXzE0ID0gc3JjL3Bvd2VycGMvZmZpX2Rhcndpbi5jIHNyYy9wb3dlcnBjL2Rhcndpbi5TIHNyYy9wb3dlcnBjL2Rhcndpbl9jbG9zdXJlLlMKLUBQT1dFUlBDX0ZSRUVCU0RfVFJVRUBhbV9fYXBwZW5kXzE1ID0gc3JjL3Bvd2VycGMvZmZpLmMgc3JjL3Bvd2VycGMvc3lzdi5TIHNyYy9wb3dlcnBjL3BwY19jbG9zdXJlLlMKLUBBUk1fVFJVRUBhbV9fYXBwZW5kXzE2ID0gc3JjL2FybS9zeXN2LlMgc3JjL2FybS9mZmkuYwotQEFWUjMyX1RSVUVAYW1fX2FwcGVuZF8xNyA9IHNyYy9hdnIzMi9zeXN2LlMgc3JjL2F2cjMyL2ZmaS5jCi1ATElCRkZJX0NSSVNfVFJVRUBhbV9fYXBwZW5kXzE4ID0gc3JjL2NyaXMvc3lzdi5TIHNyYy9jcmlzL2ZmaS5jCi1ARlJWX1RSVUVAYW1fX2FwcGVuZF8xOSA9IHNyYy9mcnYvZWFiaS5TIHNyYy9mcnYvZmZpLmMKLUBTMzkwX1RSVUVAYW1fX2FwcGVuZF8yMCA9IHNyYy9zMzkwL3N5c3YuUyBzcmMvczM5MC9mZmkuYwotQFg4Nl82NF9UUlVFQGFtX19hcHBlbmRfMjEgPSBzcmMveDg2L2ZmaTY0LmMgc3JjL3g4Ni91bml4NjQuUyBzcmMveDg2L2ZmaS5jIHNyYy94ODYvc3lzdi5TCi1AU0hfVFJVRUBhbV9fYXBwZW5kXzIyID0gc3JjL3NoL3N5c3YuUyBzcmMvc2gvZmZpLmMKLUBTSDY0X1RSVUVAYW1fX2FwcGVuZF8yMyA9IHNyYy9zaDY0L3N5c3YuUyBzcmMvc2g2NC9mZmkuYwotQFBBX0xJTlVYX1RSVUVAYW1fX2FwcGVuZF8yNCA9IHNyYy9wYS9saW51eC5TIHNyYy9wYS9mZmkuYwotQFBBX0hQVVhfVFJVRUBhbV9fYXBwZW5kXzI1ID0gc3JjL3BhL2hwdXgzMi5TIHNyYy9wYS9mZmkuYworQEZGSV9ERUJVR19UUlVFQGFtX19hcHBlbmRfMSA9IHNyYy9kZWJ1Zy5jCitATUlQU19UUlVFQGFtX19hcHBlbmRfMiA9IHNyYy9taXBzL2ZmaS5jIHNyYy9taXBzL28zMi5TIHNyYy9taXBzL24zMi5TCitAQkZJTl9UUlVFQGFtX19hcHBlbmRfMyA9IHNyYy9iZmluL2ZmaS5jIHNyYy9iZmluL3N5c3YuUworQFg4Nl9UUlVFQGFtX19hcHBlbmRfNCA9IHNyYy94ODYvZmZpLmMgc3JjL3g4Ni9zeXN2LlMKK0BYODZfRlJFRUJTRF9UUlVFQGFtX19hcHBlbmRfNSA9IHNyYy94ODYvZmZpLmMgc3JjL3g4Ni9mcmVlYnNkLlMKK0BYODZfV0lOMzJfVFJVRUBhbV9fYXBwZW5kXzYgPSBzcmMveDg2L2ZmaS5jIHNyYy94ODYvd2luMzIuUworQFg4Nl9XSU42NF9UUlVFQGFtX19hcHBlbmRfNyA9IHNyYy94ODYvZmZpLmMgc3JjL3g4Ni93aW42NC5TCitAWDg2X0RBUldJTl9UUlVFQGFtX19hcHBlbmRfOCA9IHNyYy94ODYvZmZpLmMgc3JjL3g4Ni9kYXJ3aW4uUyBzcmMveDg2L2ZmaTY0LmMgc3JjL3g4Ni9kYXJ3aW42NC5TCitAU1BBUkNfVFJVRUBhbV9fYXBwZW5kXzkgPSBzcmMvc3BhcmMvZmZpLmMgc3JjL3NwYXJjL3Y4LlMgc3JjL3NwYXJjL3Y5LlMKK0BBTFBIQV9UUlVFQGFtX19hcHBlbmRfMTAgPSBzcmMvYWxwaGEvZmZpLmMgc3JjL2FscGhhL29zZi5TCitASUE2NF9UUlVFQGFtX19hcHBlbmRfMTEgPSBzcmMvaWE2NC9mZmkuYyBzcmMvaWE2NC91bml4LlMKK0BNMzJSX1RSVUVAYW1fX2FwcGVuZF8xMiA9IHNyYy9tMzJyL3N5c3YuUyBzcmMvbTMyci9mZmkuYworQE02OEtfVFJVRUBhbV9fYXBwZW5kXzEzID0gc3JjL202OGsvZmZpLmMgc3JjL202OGsvc3lzdi5TCitATU9YSUVfVFJVRUBhbV9fYXBwZW5kXzE0ID0gc3JjL21veGllL2ZmaS5jIHNyYy9tb3hpZS9lYWJpLlMKK0BNSUNST0JMQVpFX1RSVUVAYW1fX2FwcGVuZF8xNSA9IHNyYy9taWNyb2JsYXplL2ZmaS5jIHNyYy9taWNyb2JsYXplL3N5c3YuUworQFBPV0VSUENfVFJVRUBhbV9fYXBwZW5kXzE2ID0gc3JjL3Bvd2VycGMvZmZpLmMgc3JjL3Bvd2VycGMvc3lzdi5TIHNyYy9wb3dlcnBjL3BwY19jbG9zdXJlLlMgc3JjL3Bvd2VycGMvbGludXg2NC5TIHNyYy9wb3dlcnBjL2xpbnV4NjRfY2xvc3VyZS5TCitAUE9XRVJQQ19BSVhfVFJVRUBhbV9fYXBwZW5kXzE3ID0gc3JjL3Bvd2VycGMvZmZpX2Rhcndpbi5jIHNyYy9wb3dlcnBjL2FpeC5TIHNyYy9wb3dlcnBjL2FpeF9jbG9zdXJlLlMKK0BQT1dFUlBDX0RBUldJTl9UUlVFQGFtX19hcHBlbmRfMTggPSBzcmMvcG93ZXJwYy9mZmlfZGFyd2luLmMgc3JjL3Bvd2VycGMvZGFyd2luLlMgc3JjL3Bvd2VycGMvZGFyd2luX2Nsb3N1cmUuUworQFBPV0VSUENfRlJFRUJTRF9UUlVFQGFtX19hcHBlbmRfMTkgPSBzcmMvcG93ZXJwYy9mZmkuYyBzcmMvcG93ZXJwYy9zeXN2LlMgc3JjL3Bvd2VycGMvcHBjX2Nsb3N1cmUuUworQEFBUkNINjRfVFJVRUBhbV9fYXBwZW5kXzIwID0gc3JjL2FhcmNoNjQvc3lzdi5TIHNyYy9hYXJjaDY0L2ZmaS5jCitAQVJNX1RSVUVAYW1fX2FwcGVuZF8yMSA9IHNyYy9hcm0vc3lzdi5TIHNyYy9hcm0vZmZpLmMKK0BBUk1fVFJVRUBARkZJX0VYRUNfVFJBTVBPTElORV9UQUJMRV9UUlVFQGFtX19hcHBlbmRfMjIgPSBzcmMvYXJtL3RyYW1wb2xpbmUuUworQEFWUjMyX1RSVUVAYW1fX2FwcGVuZF8yMyA9IHNyYy9hdnIzMi9zeXN2LlMgc3JjL2F2cjMyL2ZmaS5jCitATElCRkZJX0NSSVNfVFJVRUBhbV9fYXBwZW5kXzI0ID0gc3JjL2NyaXMvc3lzdi5TIHNyYy9jcmlzL2ZmaS5jCitARlJWX1RSVUVAYW1fX2FwcGVuZF8yNSA9IHNyYy9mcnYvZWFiaS5TIHNyYy9mcnYvZmZpLmMKK0BTMzkwX1RSVUVAYW1fX2FwcGVuZF8yNiA9IHNyYy9zMzkwL3N5c3YuUyBzcmMvczM5MC9mZmkuYworQFg4Nl82NF9UUlVFQGFtX19hcHBlbmRfMjcgPSBzcmMveDg2L2ZmaTY0LmMgc3JjL3g4Ni91bml4NjQuUyBzcmMveDg2L2ZmaS5jIHNyYy94ODYvc3lzdi5TCitAU0hfVFJVRUBhbV9fYXBwZW5kXzI4ID0gc3JjL3NoL3N5c3YuUyBzcmMvc2gvZmZpLmMKK0BTSDY0X1RSVUVAYW1fX2FwcGVuZF8yOSA9IHNyYy9zaDY0L3N5c3YuUyBzcmMvc2g2NC9mZmkuYworQFBBX0xJTlVYX1RSVUVAYW1fX2FwcGVuZF8zMCA9IHNyYy9wYS9saW51eC5TIHNyYy9wYS9mZmkuYworQFBBX0hQVVhfVFJVRUBhbV9fYXBwZW5kXzMxID0gc3JjL3BhL2hwdXgzMi5TIHNyYy9wYS9mZmkuYworQFRJTEVfVFJVRUBhbV9fYXBwZW5kXzMyID0gc3JjL3RpbGUvdGlsZS5TIHNyYy90aWxlL2ZmaS5jCitAWFRFTlNBX1RSVUVAYW1fX2FwcGVuZF8zMyA9IHNyYy94dGVuc2Evc3lzdi5TIHNyYy94dGVuc2EvZmZpLmMKK0BNRVRBR19UUlVFQGFtX19hcHBlbmRfMzQgPSBzcmMvbWV0YWcvc3lzdi5TIHNyYy9tZXRhZy9mZmkuYwogc3ViZGlyID0gLgogRElTVF9DT01NT04gPSBSRUFETUUgJChhbV9fY29uZmlndXJlX2RlcHMpICQoc3JjZGlyKS9NYWtlZmlsZS5hbSBcCiAJJChzcmNkaXIpL01ha2VmaWxlLmluICQoc3JjZGlyKS9kb2Mvc3RhbXAtdnRpIFwKQEAgLTY5LDcgKzk0LDE5IEBACiAJY29tcGlsZSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBkZXBjb21wIGluc3RhbGwtc2ggbHRtYWluLnNoIFwKIAltZGF0ZS1zaCBtaXNzaW5nIHRleGluZm8udGV4CiBBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00Ci1hbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2luY2x1ZGUubTQgXAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvbTQvYXNtY2ZpLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2FwcGVuZF9mbGFnLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2NjX21heG9wdC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9jZmxhZ3Nfd2Fybl9hbGwubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYXhfY2hlY2tfY29tcGlsZV9mbGFnLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2NvbXBpbGVyX3ZlbmRvci5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9jb25maWd1cmVfYXJncy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9lbmFibGVfYnVpbGRkaXIubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYXhfZ2NjX2FyY2hmbGFnLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2djY194ODZfY3B1aWQubTQgXAorCSQodG9wX3NyY2RpcikvbTQvbGlidG9vbC5tNCAkKHRvcF9zcmNkaXIpL200L2x0b3B0aW9ucy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9sdHN1Z2FyLm00ICQodG9wX3NyY2RpcikvbTQvbHR2ZXJzaW9uLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2x0fm9ic29sZXRlLm00ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKIAkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYwogYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKIAkkKEFDTE9DQUxfTTQpCkBAIC0xMDAsNTEgKzEzNyw2NyBAQAogYW1fX2Jhc2VfbGlzdCA9IFwKICAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJyB8IFwKICAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJwotYW1fX2luc3RhbGxkaXJzID0gIiQoREVTVERJUikkKGxpYmRpcikiICIkKERFU1RESVIpJChpbmZvZGlyKSIgXAorYW1fX3VuaW5zdGFsbF9maWxlc19mcm9tX2RpciA9IHsgXAorICB0ZXN0IC16ICIkJGZpbGVzIiBcCisgICAgfHwgeyB0ZXN0ICEgLWQgIiQkZGlyIiAmJiB0ZXN0ICEgLWYgIiQkZGlyIiAmJiB0ZXN0ICEgLXIgIiQkZGlyIjsgfSBcCisgICAgfHwgeyBlY2hvICIgKCBjZCAnJCRkaXInICYmIHJtIC1mIiAkJGZpbGVzICIpIjsgXAorICAgICAgICAgJChhbV9fY2QpICIkJGRpciIgJiYgcm0gLWYgJCRmaWxlczsgfTsgXAorICB9CithbV9faW5zdGFsbGRpcnMgPSAiJChERVNURElSKSQodG9vbGV4ZWNsaWJkaXIpIiAiJChERVNURElSKSQoaW5mb2RpcikiIFwKIAkiJChERVNURElSKSQocGtnY29uZmlnZGlyKSIKLUxUTElCUkFSSUVTID0gJChsaWJfTFRMSUJSQVJJRVMpICQobm9pbnN0X0xUTElCUkFSSUVTKQorTFRMSUJSQVJJRVMgPSAkKG5vaW5zdF9MVExJQlJBUklFUykgJCh0b29sZXhlY2xpYl9MVExJQlJBUklFUykKIGxpYmZmaV9sYV9MSUJBREQgPQogYW1fX2RpcnN0YW1wID0gJChhbV9fbGVhZGluZ19kb3QpZGlyc3RhbXAKLWFtX2xpYmZmaV9sYV9PQkpFQ1RTID0gc3JjL2RlYnVnLmxvIHNyYy9wcmVwX2NpZi5sbyBzcmMvdHlwZXMubG8gXAotCXNyYy9yYXdfYXBpLmxvIHNyYy9qYXZhX3Jhd19hcGkubG8gc3JjL2Nsb3N1cmVzLmxvCi1ATUlQU19UUlVFQGFtX19vYmplY3RzXzEgPSBzcmMvbWlwcy9mZmkubG8gc3JjL21pcHMvbzMyLmxvIFwKK2FtX2xpYmZmaV9sYV9PQkpFQ1RTID0gc3JjL3ByZXBfY2lmLmxvIHNyYy90eXBlcy5sbyBzcmMvcmF3X2FwaS5sbyBcCisJc3JjL2phdmFfcmF3X2FwaS5sbyBzcmMvY2xvc3VyZXMubG8KK0BGRklfREVCVUdfVFJVRUBhbV9fb2JqZWN0c18xID0gc3JjL2RlYnVnLmxvCitATUlQU19UUlVFQGFtX19vYmplY3RzXzIgPSBzcmMvbWlwcy9mZmkubG8gc3JjL21pcHMvbzMyLmxvIFwKIEBNSVBTX1RSVUVACXNyYy9taXBzL24zMi5sbwotQFg4Nl9UUlVFQGFtX19vYmplY3RzXzIgPSBzcmMveDg2L2ZmaS5sbyBzcmMveDg2L3N5c3YubG8KLUBYODZfRlJFRUJTRF9UUlVFQGFtX19vYmplY3RzXzMgPSBzcmMveDg2L2ZmaS5sbyBzcmMveDg2L2ZyZWVic2QubG8KLUBYODZfV0lOMzJfVFJVRUBhbV9fb2JqZWN0c180ID0gc3JjL3g4Ni9mZmkubG8gc3JjL3g4Ni93aW4zMi5sbwotQFg4Nl9XSU42NF9UUlVFQGFtX19vYmplY3RzXzUgPSBzcmMveDg2L2ZmaS5sbyBzcmMveDg2L3dpbjY0LmxvCi1AWDg2X0RBUldJTl9UUlVFQGFtX19vYmplY3RzXzYgPSBzcmMveDg2L2ZmaS5sbyBzcmMveDg2L2Rhcndpbi5sbyBcCitAQkZJTl9UUlVFQGFtX19vYmplY3RzXzMgPSBzcmMvYmZpbi9mZmkubG8gc3JjL2JmaW4vc3lzdi5sbworQFg4Nl9UUlVFQGFtX19vYmplY3RzXzQgPSBzcmMveDg2L2ZmaS5sbyBzcmMveDg2L3N5c3YubG8KK0BYODZfRlJFRUJTRF9UUlVFQGFtX19vYmplY3RzXzUgPSBzcmMveDg2L2ZmaS5sbyBzcmMveDg2L2ZyZWVic2QubG8KK0BYODZfV0lOMzJfVFJVRUBhbV9fb2JqZWN0c182ID0gc3JjL3g4Ni9mZmkubG8gc3JjL3g4Ni93aW4zMi5sbworQFg4Nl9XSU42NF9UUlVFQGFtX19vYmplY3RzXzcgPSBzcmMveDg2L2ZmaS5sbyBzcmMveDg2L3dpbjY0LmxvCitAWDg2X0RBUldJTl9UUlVFQGFtX19vYmplY3RzXzggPSBzcmMveDg2L2ZmaS5sbyBzcmMveDg2L2Rhcndpbi5sbyBcCiBAWDg2X0RBUldJTl9UUlVFQAlzcmMveDg2L2ZmaTY0LmxvIHNyYy94ODYvZGFyd2luNjQubG8KLUBTUEFSQ19UUlVFQGFtX19vYmplY3RzXzcgPSBzcmMvc3BhcmMvZmZpLmxvIHNyYy9zcGFyYy92OC5sbyBcCitAU1BBUkNfVFJVRUBhbV9fb2JqZWN0c185ID0gc3JjL3NwYXJjL2ZmaS5sbyBzcmMvc3BhcmMvdjgubG8gXAogQFNQQVJDX1RSVUVACXNyYy9zcGFyYy92OS5sbwotQEFMUEhBX1RSVUVAYW1fX29iamVjdHNfOCA9IHNyYy9hbHBoYS9mZmkubG8gc3JjL2FscGhhL29zZi5sbwotQElBNjRfVFJVRUBhbV9fb2JqZWN0c185ID0gc3JjL2lhNjQvZmZpLmxvIHNyYy9pYTY0L3VuaXgubG8KLUBNMzJSX1RSVUVAYW1fX29iamVjdHNfMTAgPSBzcmMvbTMyci9zeXN2LmxvIHNyYy9tMzJyL2ZmaS5sbwotQE02OEtfVFJVRUBhbV9fb2JqZWN0c18xMSA9IHNyYy9tNjhrL2ZmaS5sbyBzcmMvbTY4ay9zeXN2LmxvCi1AUE9XRVJQQ19UUlVFQGFtX19vYmplY3RzXzEyID0gc3JjL3Bvd2VycGMvZmZpLmxvIHNyYy9wb3dlcnBjL3N5c3YubG8gXAorQEFMUEhBX1RSVUVAYW1fX29iamVjdHNfMTAgPSBzcmMvYWxwaGEvZmZpLmxvIHNyYy9hbHBoYS9vc2YubG8KK0BJQTY0X1RSVUVAYW1fX29iamVjdHNfMTEgPSBzcmMvaWE2NC9mZmkubG8gc3JjL2lhNjQvdW5peC5sbworQE0zMlJfVFJVRUBhbV9fb2JqZWN0c18xMiA9IHNyYy9tMzJyL3N5c3YubG8gc3JjL20zMnIvZmZpLmxvCitATTY4S19UUlVFQGFtX19vYmplY3RzXzEzID0gc3JjL202OGsvZmZpLmxvIHNyYy9tNjhrL3N5c3YubG8KK0BNT1hJRV9UUlVFQGFtX19vYmplY3RzXzE0ID0gc3JjL21veGllL2ZmaS5sbyBzcmMvbW94aWUvZWFiaS5sbworQE1JQ1JPQkxBWkVfVFJVRUBhbV9fb2JqZWN0c18xNSA9IHNyYy9taWNyb2JsYXplL2ZmaS5sbyBcCitATUlDUk9CTEFaRV9UUlVFQAlzcmMvbWljcm9ibGF6ZS9zeXN2LmxvCitAUE9XRVJQQ19UUlVFQGFtX19vYmplY3RzXzE2ID0gc3JjL3Bvd2VycGMvZmZpLmxvIHNyYy9wb3dlcnBjL3N5c3YubG8gXAogQFBPV0VSUENfVFJVRUAJc3JjL3Bvd2VycGMvcHBjX2Nsb3N1cmUubG8gXAogQFBPV0VSUENfVFJVRUAJc3JjL3Bvd2VycGMvbGludXg2NC5sbyBcCiBAUE9XRVJQQ19UUlVFQAlzcmMvcG93ZXJwYy9saW51eDY0X2Nsb3N1cmUubG8KLUBQT1dFUlBDX0FJWF9UUlVFQGFtX19vYmplY3RzXzEzID0gc3JjL3Bvd2VycGMvZmZpX2Rhcndpbi5sbyBcCitAUE9XRVJQQ19BSVhfVFJVRUBhbV9fb2JqZWN0c18xNyA9IHNyYy9wb3dlcnBjL2ZmaV9kYXJ3aW4ubG8gXAogQFBPV0VSUENfQUlYX1RSVUVACXNyYy9wb3dlcnBjL2FpeC5sbyBcCiBAUE9XRVJQQ19BSVhfVFJVRUAJc3JjL3Bvd2VycGMvYWl4X2Nsb3N1cmUubG8KLUBQT1dFUlBDX0RBUldJTl9UUlVFQGFtX19vYmplY3RzXzE0ID0gc3JjL3Bvd2VycGMvZmZpX2Rhcndpbi5sbyBcCitAUE9XRVJQQ19EQVJXSU5fVFJVRUBhbV9fb2JqZWN0c18xOCA9IHNyYy9wb3dlcnBjL2ZmaV9kYXJ3aW4ubG8gXAogQFBPV0VSUENfREFSV0lOX1RSVUVACXNyYy9wb3dlcnBjL2Rhcndpbi5sbyBcCiBAUE9XRVJQQ19EQVJXSU5fVFJVRUAJc3JjL3Bvd2VycGMvZGFyd2luX2Nsb3N1cmUubG8KLUBQT1dFUlBDX0ZSRUVCU0RfVFJVRUBhbV9fb2JqZWN0c18xNSA9IHNyYy9wb3dlcnBjL2ZmaS5sbyBcCitAUE9XRVJQQ19GUkVFQlNEX1RSVUVAYW1fX29iamVjdHNfMTkgPSBzcmMvcG93ZXJwYy9mZmkubG8gXAogQFBPV0VSUENfRlJFRUJTRF9UUlVFQAlzcmMvcG93ZXJwYy9zeXN2LmxvIFwKIEBQT1dFUlBDX0ZSRUVCU0RfVFJVRUAJc3JjL3Bvd2VycGMvcHBjX2Nsb3N1cmUubG8KLUBBUk1fVFJVRUBhbV9fb2JqZWN0c18xNiA9IHNyYy9hcm0vc3lzdi5sbyBzcmMvYXJtL2ZmaS5sbwotQEFWUjMyX1RSVUVAYW1fX29iamVjdHNfMTcgPSBzcmMvYXZyMzIvc3lzdi5sbyBzcmMvYXZyMzIvZmZpLmxvCi1ATElCRkZJX0NSSVNfVFJVRUBhbV9fb2JqZWN0c18xOCA9IHNyYy9jcmlzL3N5c3YubG8gc3JjL2NyaXMvZmZpLmxvCi1ARlJWX1RSVUVAYW1fX29iamVjdHNfMTkgPSBzcmMvZnJ2L2VhYmkubG8gc3JjL2Zydi9mZmkubG8KLUBTMzkwX1RSVUVAYW1fX29iamVjdHNfMjAgPSBzcmMvczM5MC9zeXN2LmxvIHNyYy9zMzkwL2ZmaS5sbwotQFg4Nl82NF9UUlVFQGFtX19vYmplY3RzXzIxID0gc3JjL3g4Ni9mZmk2NC5sbyBzcmMveDg2L3VuaXg2NC5sbyBcCitAQUFSQ0g2NF9UUlVFQGFtX19vYmplY3RzXzIwID0gc3JjL2FhcmNoNjQvc3lzdi5sbyBzcmMvYWFyY2g2NC9mZmkubG8KK0BBUk1fVFJVRUBhbV9fb2JqZWN0c18yMSA9IHNyYy9hcm0vc3lzdi5sbyBzcmMvYXJtL2ZmaS5sbworQEFSTV9UUlVFQEBGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFX1RSVUVAYW1fX29iamVjdHNfMjIgPSBzcmMvYXJtL3RyYW1wb2xpbmUubG8KK0BBVlIzMl9UUlVFQGFtX19vYmplY3RzXzIzID0gc3JjL2F2cjMyL3N5c3YubG8gc3JjL2F2cjMyL2ZmaS5sbworQExJQkZGSV9DUklTX1RSVUVAYW1fX29iamVjdHNfMjQgPSBzcmMvY3Jpcy9zeXN2LmxvIHNyYy9jcmlzL2ZmaS5sbworQEZSVl9UUlVFQGFtX19vYmplY3RzXzI1ID0gc3JjL2Zydi9lYWJpLmxvIHNyYy9mcnYvZmZpLmxvCitAUzM5MF9UUlVFQGFtX19vYmplY3RzXzI2ID0gc3JjL3MzOTAvc3lzdi5sbyBzcmMvczM5MC9mZmkubG8KK0BYODZfNjRfVFJVRUBhbV9fb2JqZWN0c18yNyA9IHNyYy94ODYvZmZpNjQubG8gc3JjL3g4Ni91bml4NjQubG8gXAogQFg4Nl82NF9UUlVFQAlzcmMveDg2L2ZmaS5sbyBzcmMveDg2L3N5c3YubG8KLUBTSF9UUlVFQGFtX19vYmplY3RzXzIyID0gc3JjL3NoL3N5c3YubG8gc3JjL3NoL2ZmaS5sbwotQFNINjRfVFJVRUBhbV9fb2JqZWN0c18yMyA9IHNyYy9zaDY0L3N5c3YubG8gc3JjL3NoNjQvZmZpLmxvCi1AUEFfTElOVVhfVFJVRUBhbV9fb2JqZWN0c18yNCA9IHNyYy9wYS9saW51eC5sbyBzcmMvcGEvZmZpLmxvCi1AUEFfSFBVWF9UUlVFQGFtX19vYmplY3RzXzI1ID0gc3JjL3BhL2hwdXgzMi5sbyBzcmMvcGEvZmZpLmxvCitAU0hfVFJVRUBhbV9fb2JqZWN0c18yOCA9IHNyYy9zaC9zeXN2LmxvIHNyYy9zaC9mZmkubG8KK0BTSDY0X1RSVUVAYW1fX29iamVjdHNfMjkgPSBzcmMvc2g2NC9zeXN2LmxvIHNyYy9zaDY0L2ZmaS5sbworQFBBX0xJTlVYX1RSVUVAYW1fX29iamVjdHNfMzAgPSBzcmMvcGEvbGludXgubG8gc3JjL3BhL2ZmaS5sbworQFBBX0hQVVhfVFJVRUBhbV9fb2JqZWN0c18zMSA9IHNyYy9wYS9ocHV4MzIubG8gc3JjL3BhL2ZmaS5sbworQFRJTEVfVFJVRUBhbV9fb2JqZWN0c18zMiA9IHNyYy90aWxlL3RpbGUubG8gc3JjL3RpbGUvZmZpLmxvCitAWFRFTlNBX1RSVUVAYW1fX29iamVjdHNfMzMgPSBzcmMveHRlbnNhL3N5c3YubG8gc3JjL3h0ZW5zYS9mZmkubG8KK0BNRVRBR19UUlVFQGFtX19vYmplY3RzXzM0ID0gc3JjL21ldGFnL3N5c3YubG8gc3JjL21ldGFnL2ZmaS5sbwogbm9kaXN0X2xpYmZmaV9sYV9PQkpFQ1RTID0gJChhbV9fb2JqZWN0c18xKSAkKGFtX19vYmplY3RzXzIpIFwKIAkkKGFtX19vYmplY3RzXzMpICQoYW1fX29iamVjdHNfNCkgJChhbV9fb2JqZWN0c181KSBcCiAJJChhbV9fb2JqZWN0c182KSAkKGFtX19vYmplY3RzXzcpICQoYW1fX29iamVjdHNfOCkgXApAQCAtMTUzLDE3ICsyMDYsMjAgQEAKIAkkKGFtX19vYmplY3RzXzE1KSAkKGFtX19vYmplY3RzXzE2KSAkKGFtX19vYmplY3RzXzE3KSBcCiAJJChhbV9fb2JqZWN0c18xOCkgJChhbV9fb2JqZWN0c18xOSkgJChhbV9fb2JqZWN0c18yMCkgXAogCSQoYW1fX29iamVjdHNfMjEpICQoYW1fX29iamVjdHNfMjIpICQoYW1fX29iamVjdHNfMjMpIFwKLQkkKGFtX19vYmplY3RzXzI0KSAkKGFtX19vYmplY3RzXzI1KQorCSQoYW1fX29iamVjdHNfMjQpICQoYW1fX29iamVjdHNfMjUpICQoYW1fX29iamVjdHNfMjYpIFwKKwkkKGFtX19vYmplY3RzXzI3KSAkKGFtX19vYmplY3RzXzI4KSAkKGFtX19vYmplY3RzXzI5KSBcCisJJChhbV9fb2JqZWN0c18zMCkgJChhbV9fb2JqZWN0c18zMSkgJChhbV9fb2JqZWN0c18zMikgXAorCSQoYW1fX29iamVjdHNfMzMpICQoYW1fX29iamVjdHNfMzQpCiBsaWJmZmlfbGFfT0JKRUNUUyA9ICQoYW1fbGliZmZpX2xhX09CSkVDVFMpIFwKIAkkKG5vZGlzdF9saWJmZmlfbGFfT0JKRUNUUykKIGxpYmZmaV9sYV9MSU5LID0gJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgXAogCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgXAogCSQobGliZmZpX2xhX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKIGxpYmZmaV9jb252ZW5pZW5jZV9sYV9MSUJBREQgPQotYW1fX29iamVjdHNfMjYgPSBzcmMvZGVidWcubG8gc3JjL3ByZXBfY2lmLmxvIHNyYy90eXBlcy5sbyBcCi0Jc3JjL3Jhd19hcGkubG8gc3JjL2phdmFfcmF3X2FwaS5sbyBzcmMvY2xvc3VyZXMubG8KLWFtX2xpYmZmaV9jb252ZW5pZW5jZV9sYV9PQkpFQ1RTID0gJChhbV9fb2JqZWN0c18yNikKLWFtX19vYmplY3RzXzI3ID0gJChhbV9fb2JqZWN0c18xKSAkKGFtX19vYmplY3RzXzIpICQoYW1fX29iamVjdHNfMykgXAorYW1fX29iamVjdHNfMzUgPSBzcmMvcHJlcF9jaWYubG8gc3JjL3R5cGVzLmxvIHNyYy9yYXdfYXBpLmxvIFwKKwlzcmMvamF2YV9yYXdfYXBpLmxvIHNyYy9jbG9zdXJlcy5sbworYW1fbGliZmZpX2NvbnZlbmllbmNlX2xhX09CSkVDVFMgPSAkKGFtX19vYmplY3RzXzM1KQorYW1fX29iamVjdHNfMzYgPSAkKGFtX19vYmplY3RzXzEpICQoYW1fX29iamVjdHNfMikgJChhbV9fb2JqZWN0c18zKSBcCiAJJChhbV9fb2JqZWN0c180KSAkKGFtX19vYmplY3RzXzUpICQoYW1fX29iamVjdHNfNikgXAogCSQoYW1fX29iamVjdHNfNykgJChhbV9fb2JqZWN0c184KSAkKGFtX19vYmplY3RzXzkpIFwKIAkkKGFtX19vYmplY3RzXzEwKSAkKGFtX19vYmplY3RzXzExKSAkKGFtX19vYmplY3RzXzEyKSBcCkBAIC0xNzEsOCArMjI3LDExIEBACiAJJChhbV9fb2JqZWN0c18xNikgJChhbV9fb2JqZWN0c18xNykgJChhbV9fb2JqZWN0c18xOCkgXAogCSQoYW1fX29iamVjdHNfMTkpICQoYW1fX29iamVjdHNfMjApICQoYW1fX29iamVjdHNfMjEpIFwKIAkkKGFtX19vYmplY3RzXzIyKSAkKGFtX19vYmplY3RzXzIzKSAkKGFtX19vYmplY3RzXzI0KSBcCi0JJChhbV9fb2JqZWN0c18yNSkKLW5vZGlzdF9saWJmZmlfY29udmVuaWVuY2VfbGFfT0JKRUNUUyA9ICQoYW1fX29iamVjdHNfMjcpCisJJChhbV9fb2JqZWN0c18yNSkgJChhbV9fb2JqZWN0c18yNikgJChhbV9fb2JqZWN0c18yNykgXAorCSQoYW1fX29iamVjdHNfMjgpICQoYW1fX29iamVjdHNfMjkpICQoYW1fX29iamVjdHNfMzApIFwKKwkkKGFtX19vYmplY3RzXzMxKSAkKGFtX19vYmplY3RzXzMyKSAkKGFtX19vYmplY3RzXzMzKSBcCisJJChhbV9fb2JqZWN0c18zNCkKK25vZGlzdF9saWJmZmlfY29udmVuaWVuY2VfbGFfT0JKRUNUUyA9ICQoYW1fX29iamVjdHNfMzYpCiBsaWJmZmlfY29udmVuaWVuY2VfbGFfT0JKRUNUUyA9ICQoYW1fbGliZmZpX2NvbnZlbmllbmNlX2xhX09CSkVDVFMpIFwKIAkkKG5vZGlzdF9saWJmZmlfY29udmVuaWVuY2VfbGFfT0JKRUNUUykKIERFRkFVTFRfSU5DTFVERVMgPSAtSS5AYW1fX2lzcmNACkBAIC0yMTYsMjIgKzI3NSwzMSBAQAogCWluc3RhbGwtcGRmLXJlY3Vyc2l2ZSBpbnN0YWxsLXBzLXJlY3Vyc2l2ZSBpbnN0YWxsLXJlY3Vyc2l2ZSBcCiAJaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgcGRmLXJlY3Vyc2l2ZSBcCiAJcHMtcmVjdXJzaXZlIHVuaW5zdGFsbC1yZWN1cnNpdmUKK2FtX19jYW5fcnVuX2luc3RhbGxpbmZvID0gXAorICBjYXNlICQkQU1fVVBEQVRFX0lORk9fRElSIGluIFwKKyAgICBufG5vfE5PKSBmYWxzZTs7IFwKKyAgICAqKSAoaW5zdGFsbC1pbmZvIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPiYxOzsgXAorICBlc2FjCiBEQVRBID0gJChwa2djb25maWdfREFUQSkKIFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTID0gbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZQlcCiAgIGRpc3RjbGVhbi1yZWN1cnNpdmUgbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKIEFNX1JFQ1VSU0lWRV9UQVJHRVRTID0gJChSRUNVUlNJVkVfVEFSR0VUUzotcmVjdXJzaXZlPSkgXAogCSQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFM6LXJlY3Vyc2l2ZT0pIHRhZ3MgVEFHUyBjdGFncyBDVEFHUyBcCi0JZGlzdGRpciBkaXN0IGRpc3QtYWxsIGRpc3RjaGVjaworCWNzY29wZSBkaXN0ZGlyIGRpc3QgZGlzdC1hbGwgZGlzdGNoZWNrCiBFVEFHUyA9IGV0YWdzCiBDVEFHUyA9IGN0YWdzCitDU0NPUEUgPSBjc2NvcGUKIERJU1RfU1VCRElSUyA9ICQoU1VCRElSUykKIERJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCiBkaXN0ZGlyID0gJChQQUNLQUdFKS0kKFZFUlNJT04pCiB0b3BfZGlzdGRpciA9ICQoZGlzdGRpcikKIGFtX19yZW1vdmVfZGlzdGRpciA9IFwKLSAgeyB0ZXN0ICEgLWQgIiQoZGlzdGRpcikiIFwKLSAgICB8fCB7IGZpbmQgIiQoZGlzdGRpcikiIC10eXBlIGQgISAtcGVybSAtMjAwIC1leGVjIGNobW9kIHUrdyB7fSAnOycgXAotICAgICAgICAgJiYgcm0gLWZyICIkKGRpc3RkaXIpIjsgfTsgfQorICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpIjsgdGhlbiBcCisgICAgZmluZCAiJChkaXN0ZGlyKSIgLXR5cGUgZCAhIC1wZXJtIC0yMDAgLWV4ZWMgY2htb2QgdSt3IHt9ICc7JyBcCisgICAgICAmJiBybSAtcmYgIiQoZGlzdGRpcikiIFwKKyAgICAgIHx8IHsgc2xlZXAgNSAmJiBybSAtcmYgIiQoZGlzdGRpcikiOyB9OyBcCisgIGVsc2UgOjsgZmkKK2FtX19wb3N0X3JlbW92ZV9kaXN0ZGlyID0gJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCiBhbV9fcmVsYXRpdml6ZSA9IFwKICAgZGlyMD1gcHdkYDsgXAogICBzZWRfZmlyc3Q9J3MsXlwoW14vXSpcKS8uKiQkLFwxLCc7IFwKQEAgLTI1OSw3ICszMjcsMTAgQEAKICAgcmVsZGlyPSIkJGRpcjIiCiBESVNUX0FSQ0hJVkVTID0gJChkaXN0ZGlyKS50YXIuZ3oKIEdaSVBfRU5WID0gLS1iZXN0CitESVNUX1RBUkdFVFMgPSBkaXN0LWd6aXAKIGRpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMgPSBmaW5kIC4gLXR5cGUgZiAtcHJpbnQKK2FtX19kaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzID0gJChkaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzKSBcCisgIHwgc2VkICdzfF5cLi98JChwcmVmaXgpL3wnIHwgZ3JlcCAtdiAnJChpbmZvZGlyKS9kaXIkJCcKIGRpc3RjbGVhbmNoZWNrX2xpc3RmaWxlcyA9IGZpbmQgLiAtdHlwZSBmIC1wcmludAogQUNMT0NBTCA9IEBBQ0xPQ0FMQAogQUxMT0NBID0gQEFMTE9DQUAKQEAgLTI4Miw2ICszNTMsNyBAQAogQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKIERFRlMgPSBAREVGU0AKIERFUERJUiA9IEBERVBESVJACitETExUT09MID0gQERMTFRPT0xACiBEU1lNVVRJTCA9IEBEU1lNVVRJTEAKIERVTVBCSU4gPSBARFVNUEJJTkAKIEVDSE9fQyA9IEBFQ0hPX0NACkBAIC0yODksNiArMzYxLDcgQEAKIEVDSE9fVCA9IEBFQ0hPX1RACiBFR1JFUCA9IEBFR1JFUEAKIEVYRUVYVCA9IEBFWEVFWFRACitGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFID0gQEZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEVACiBGR1JFUCA9IEBGR1JFUEAKIEdSRVAgPSBAR1JFUEAKIEhBVkVfTE9OR19ET1VCTEUgPSBASEFWRV9MT05HX0RPVUJMRUAKQEAgLTMwNyw2ICszODAsNyBAQAogTFRMSUJPQkpTID0gQExUTElCT0JKU0AKIE1BSU5UID0gQE1BSU5UQAogTUFLRUlORk8gPSBATUFLRUlORk9ACitNQU5JRkVTVF9UT09MID0gQE1BTklGRVNUX1RPT0xACiBNS0RJUl9QID0gQE1LRElSX1BACiBOTSA9IEBOTUAKIE5NRURJVCA9IEBOTUVESVRACkBAIC0zMTksOCArMzkzLDEwIEBACiBQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAogUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACiBQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9VUkwgPSBAUEFDS0FHRV9VUkxACiBQQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAogUEFUSF9TRVBBUkFUT1IgPSBAUEFUSF9TRVBBUkFUT1JACitQUlRESUFHID0gQFBSVERJQUdACiBSQU5MSUIgPSBAUkFOTElCQAogU0VEID0gQFNFREAKIFNFVF9NQUtFID0gQFNFVF9NQUtFQApAQCAtMzMzLDYgKzQwOSw3IEBACiBhYnNfc3JjZGlyID0gQGFic19zcmNkaXJACiBhYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACiBhYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKK2FjX2N0X0FSID0gQGFjX2N0X0FSQAogYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACiBhY19jdF9EVU1QQklOID0gQGFjX2N0X0RVTVBCSU5ACiBhbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKQEAgLTM0MCw2ICs0MTcsNyBAQAogYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKIGFtX190YXIgPSBAYW1fX3RhckAKIGFtX191bnRhciA9IEBhbV9fdW50YXJACitheF9lbmFibGVfYnVpbGRkaXJfc2VkID0gQGF4X2VuYWJsZV9idWlsZGRpcl9zZWRACiBiaW5kaXIgPSBAYmluZGlyQAogYnVpbGQgPSBAYnVpbGRACiBidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKQEAgLTM2NSw3ICs0NDMsNiBAQAogbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAogbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKIGxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLWx0X0VDSE8gPSBAbHRfRUNIT0AKIG1hbmRpciA9IEBtYW5kaXJACiBta2Rpcl9wID0gQG1rZGlyX3BACiBvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACkBAIC0zNzYsNiArNDUzLDcgQEAKIHNiaW5kaXIgPSBAc2JpbmRpckAKIHNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAogc3JjZGlyID0gQHNyY2RpckAKK3N5c19zeW1ib2xfdW5kZXJzY29yZSA9IEBzeXNfc3ltYm9sX3VuZGVyc2NvcmVACiBzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACiB0YXJnZXQgPSBAdGFyZ2V0QAogdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKQEAgLTM4OCwzNiArNDY2LDQ4IEBACiB0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAogdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAogQVVUT01BS0VfT1BUSU9OUyA9IGZvcmVpZ24gc3ViZGlyLW9iamVjdHMKK0FDTE9DQUxfQU1GTEFHUyA9IC1JIG00CiBTVUJESVJTID0gaW5jbHVkZSB0ZXN0c3VpdGUgbWFuCi1FWFRSQV9ESVNUID0gTElDRU5TRSBDaGFuZ2VMb2cudjEgQ2hhbmdlTG9nLmxpYmdjaiBjb25maWd1cmUuaG9zdCBcCi0Jc3JjL2FscGhhL2ZmaS5jIHNyYy9hbHBoYS9vc2YuUyBzcmMvYWxwaGEvZmZpdGFyZ2V0LmggXAotCXNyYy9hcm0vZmZpLmMgc3JjL2FybS9zeXN2LlMgc3JjL2FybS9mZml0YXJnZXQuaCBcCi0Jc3JjL2F2cjMyL2ZmaS5jIHNyYy9hdnIzMi9zeXN2LlMgc3JjL2F2cjMyL2ZmaXRhcmdldC5oIFwKLQlzcmMvY3Jpcy9mZmkuYyBzcmMvY3Jpcy9zeXN2LlMgc3JjL2NyaXMvZmZpdGFyZ2V0LmggXAotCXNyYy9pYTY0L2ZmaS5jIHNyYy9pYTY0L2ZmaXRhcmdldC5oIHNyYy9pYTY0L2lhNjRfZmxhZ3MuaCBcCi0Jc3JjL2lhNjQvdW5peC5TIFwKLQlzcmMvbWlwcy9mZmkuYyBzcmMvbWlwcy9uMzIuUyBzcmMvbWlwcy9vMzIuUyBcCi0Jc3JjL21pcHMvZmZpdGFyZ2V0LmggXAotCXNyYy9tMzJyL2ZmaS5jIHNyYy9tMzJyL3N5c3YuUyBzcmMvbTMyci9mZml0YXJnZXQuaCBcCi0Jc3JjL202OGsvZmZpLmMgc3JjL202OGsvc3lzdi5TIHNyYy9tNjhrL2ZmaXRhcmdldC5oIFwKLQlzcmMvcG93ZXJwYy9mZmkuYyBzcmMvcG93ZXJwYy9zeXN2LlMgXAotCXNyYy9wb3dlcnBjL2xpbnV4NjQuUyBzcmMvcG93ZXJwYy9saW51eDY0X2Nsb3N1cmUuUyBcCi0Jc3JjL3Bvd2VycGMvcHBjX2Nsb3N1cmUuUyBzcmMvcG93ZXJwYy9hc20uaCBcCi0Jc3JjL3Bvd2VycGMvYWl4LlMgc3JjL3Bvd2VycGMvZGFyd2luLlMgXAotCXNyYy9wb3dlcnBjL2FpeF9jbG9zdXJlLlMgc3JjL3Bvd2VycGMvZGFyd2luX2Nsb3N1cmUuUyBcCi0Jc3JjL3Bvd2VycGMvZmZpX2Rhcndpbi5jIHNyYy9wb3dlcnBjL2ZmaXRhcmdldC5oIFwKLQlzcmMvczM5MC9mZmkuYyBzcmMvczM5MC9zeXN2LlMgc3JjL3MzOTAvZmZpdGFyZ2V0LmggXAotCXNyYy9zaC9mZmkuYyBzcmMvc2gvc3lzdi5TIHNyYy9zaC9mZml0YXJnZXQuaCBcCi0Jc3JjL3NoNjQvZmZpLmMgc3JjL3NoNjQvc3lzdi5TIHNyYy9zaDY0L2ZmaXRhcmdldC5oIFwKLQlzcmMvc3BhcmMvdjguUyBzcmMvc3BhcmMvdjkuUyBzcmMvc3BhcmMvZmZpdGFyZ2V0LmggXAotCXNyYy9zcGFyYy9mZmkuYyBzcmMveDg2L2RhcndpbjY0LlMgXAotCXNyYy94ODYvZmZpLmMgc3JjL3g4Ni9zeXN2LlMgc3JjL3g4Ni93aW4zMi5TIHNyYy94ODYvd2luNjQuUyBcCi0Jc3JjL3g4Ni9kYXJ3aW4uUyBzcmMveDg2L2ZyZWVic2QuUyBcCi0Jc3JjL3g4Ni9mZmk2NC5jIHNyYy94ODYvdW5peDY0LlMgc3JjL3g4Ni9mZml0YXJnZXQuaCBcCi0Jc3JjL3BhL2ZmaXRhcmdldC5oIHNyYy9wYS9mZmkuYyBzcmMvcGEvbGludXguUyBzcmMvcGEvaHB1eDMyLlMgXAotCXNyYy9mcnYvZmZpLmMgc3JjL2Zydi9lYWJpLlMgc3JjL2Zydi9mZml0YXJnZXQuaCBzcmMvZGxtYWxsb2MuYyBcCi0JbGlidG9vbC12ZXJzaW9uIENoYW5nZUxvZy5saWJmZmkgbTQvbGlidG9vbC5tNCBcCi0JbTQvbHR+b2Jzb2xldGUubTQgbTQvbHRvcHRpb25zLm00IG00L2x0c3VnYXIubTQgbTQvbHR2ZXJzaW9uLm00CitFWFRSQV9ESVNUID0gTElDRU5TRSBDaGFuZ2VMb2cudjEgQ2hhbmdlTG9nLmxpYmdjaiBjb25maWd1cmUuaG9zdAlcCisJIHNyYy9hYXJjaDY0L2ZmaS5jIHNyYy9hYXJjaDY0L2ZmaXRhcmdldC5oIHNyYy9hYXJjaDY0L3N5c3YuUwlcCisJIGJ1aWxkLWlvcy5zaCBzcmMvYWxwaGEvZmZpLmMgc3JjL2FscGhhL29zZi5TCQkJXAorCSBzcmMvYWxwaGEvZmZpdGFyZ2V0Lmggc3JjL2FybS9mZmkuYyBzcmMvYXJtL3N5c3YuUwkJXAorCSBzcmMvYXJtL2ZmaXRhcmdldC5oIHNyYy9hdnIzMi9mZmkuYyBzcmMvYXZyMzIvc3lzdi5TCQlcCisJIHNyYy9hdnIzMi9mZml0YXJnZXQuaCBzcmMvY3Jpcy9mZmkuYyBzcmMvY3Jpcy9zeXN2LlMJCVwKKwkgc3JjL2NyaXMvZmZpdGFyZ2V0Lmggc3JjL2lhNjQvZmZpLmMgc3JjL2lhNjQvZmZpdGFyZ2V0LmgJXAorCSBzcmMvaWE2NC9pYTY0X2ZsYWdzLmggc3JjL2lhNjQvdW5peC5TIHNyYy9taXBzL2ZmaS5jCQlcCisJIHNyYy9taXBzL24zMi5TIHNyYy9taXBzL28zMi5TIHNyYy9tZXRhZy9mZmkuYwkJCVwKKwkgc3JjL21ldGFnL2ZmaXRhcmdldC5oIHNyYy9tZXRhZy9zeXN2LlMgc3JjL21veGllL2ZmaS5jCQlcCisJIHNyYy9tb3hpZS9mZml0YXJnZXQuaCBzcmMvbW94aWUvZWFiaS5TIHNyYy9taXBzL2ZmaXRhcmdldC5oCVwKKwkgc3JjL20zMnIvZmZpLmMgc3JjL20zMnIvc3lzdi5TIHNyYy9tMzJyL2ZmaXRhcmdldC5oCQlcCisJIHNyYy9tNjhrL2ZmaS5jIHNyYy9tNjhrL3N5c3YuUyBzcmMvbTY4ay9mZml0YXJnZXQuaAkJXAorCSBzcmMvbWljcm9ibGF6ZS9mZmkuYyBzcmMvbWljcm9ibGF6ZS9zeXN2LlMJCQlcCisJIHNyYy9taWNyb2JsYXplL2ZmaXRhcmdldC5oIHNyYy9wb3dlcnBjL2ZmaS5jCQkJXAorCSBzcmMvcG93ZXJwYy9zeXN2LlMgc3JjL3Bvd2VycGMvbGludXg2NC5TCQkJXAorCSBzcmMvcG93ZXJwYy9saW51eDY0X2Nsb3N1cmUuUyBzcmMvcG93ZXJwYy9wcGNfY2xvc3VyZS5TCVwKKwkgc3JjL3Bvd2VycGMvYXNtLmggc3JjL3Bvd2VycGMvYWl4LlMgc3JjL3Bvd2VycGMvZGFyd2luLlMJXAorCSBzcmMvcG93ZXJwYy9haXhfY2xvc3VyZS5TIHNyYy9wb3dlcnBjL2Rhcndpbl9jbG9zdXJlLlMJCVwKKwkgc3JjL3Bvd2VycGMvZmZpX2Rhcndpbi5jIHNyYy9wb3dlcnBjL2ZmaXRhcmdldC5oCQlcCisJIHNyYy9zMzkwL2ZmaS5jIHNyYy9zMzkwL3N5c3YuUyBzcmMvczM5MC9mZml0YXJnZXQuaAkJXAorCSBzcmMvc2gvZmZpLmMgc3JjL3NoL3N5c3YuUyBzcmMvc2gvZmZpdGFyZ2V0Lmggc3JjL3NoNjQvZmZpLmMJXAorCSBzcmMvc2g2NC9zeXN2LlMgc3JjL3NoNjQvZmZpdGFyZ2V0Lmggc3JjL3NwYXJjL3Y4LlMJCVwKKwkgc3JjL3NwYXJjL3Y5LlMgc3JjL3NwYXJjL2ZmaXRhcmdldC5oIHNyYy9zcGFyYy9mZmkuYwkJXAorCSBzcmMveDg2L2RhcndpbjY0LlMgc3JjL3g4Ni9mZmkuYyBzcmMveDg2L3N5c3YuUwkJXAorCSBzcmMveDg2L3dpbjMyLlMgc3JjL3g4Ni9kYXJ3aW4uUyBzcmMveDg2L3dpbjY0LlMJCVwKKwkgc3JjL3g4Ni9mcmVlYnNkLlMgc3JjL3g4Ni9mZmk2NC5jIHNyYy94ODYvdW5peDY0LlMJCVwKKwkgc3JjL3g4Ni9mZml0YXJnZXQuaCBzcmMvcGEvZmZpdGFyZ2V0Lmggc3JjL3BhL2ZmaS5jCQlcCisJIHNyYy9wYS9saW51eC5TIHNyYy9wYS9ocHV4MzIuUyBzcmMvZnJ2L2ZmaS5jIHNyYy9iZmluL2ZmaS5jCVwKKwkgc3JjL2JmaW4vZmZpdGFyZ2V0Lmggc3JjL2JmaW4vc3lzdi5TIHNyYy9mcnYvZWFiaS5TCQlcCisJIHNyYy9mcnYvZmZpdGFyZ2V0Lmggc3JjL2RsbWFsbG9jLmMgc3JjL3RpbGUvZmZpLmMJCVwKKwkgc3JjL3RpbGUvZmZpdGFyZ2V0Lmggc3JjL3RpbGUvdGlsZS5TIGxpYnRvb2wtdmVyc2lvbgkJXAorCSBzcmMveHRlbnNhL2ZmaXRhcmdldC5oIHNyYy94dGVuc2EvZmZpLmMgc3JjL3h0ZW5zYS9zeXN2LlMJXAorCSBDaGFuZ2VMb2cubGliZmZpIG00L2xpYnRvb2wubTQgbTQvbHR+b2Jzb2xldGUubTQJCVwKKwkgbTQvbHRvcHRpb25zLm00IG00L2x0c3VnYXIubTQgbTQvbHR2ZXJzaW9uLm00CQkJXAorCSBtNC9sdHZlcnNpb24ubTQgc3JjL2FybS9nZW50cmFtcC5zaCBzcmMvZGVidWcuYyBtc3ZjYy5zaAlcCisJIGdlbmVyYXRlLWlvcy1zb3VyY2UtYW5kLWhlYWRlcnMucHkJCQkJXAorCSBnZW5lcmF0ZS1vc3gtc291cmNlLWFuZC1oZWFkZXJzLnB5CQkJCVwKKwkgbGliZmZpLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2ogc3JjL2FybS90cmFtcG9saW5lLlMJCVwKKwkgbGlidG9vbC1sZGZsYWdzCiAKIGluZm9fVEVYSU5GT1MgPSBkb2MvbGliZmZpLnRleGkKIApAQCAtNDQ4LDYgKzUzOCw3IEBACiAJImV4ZWNfcHJlZml4PSQoZXhlY19wcmVmaXgpIiBcCiAJImluZm9kaXI9JChpbmZvZGlyKSIgXAogCSJsaWJkaXI9JChsaWJkaXIpIiBcCisJIm1hbmRpcj0kKG1hbmRpcikiIFwKIAkicHJlZml4PSQocHJlZml4KSIgXAogCSJBUj0kKEFSKSIgXAogCSJBUz0kKEFTKSIgXApAQCAtNDU4LDExICs1NDksMTMgQEAKIAkiUkFOTElCPSQoUkFOTElCKSIgXAogCSJERVNURElSPSQoREVTVERJUikiCiAKKworIyBTdWJkaXIgcnVsZXMgcmVseSBvbiAkKEZMQUdTX1RPX1BBU1MpCitGTEFHU19UT19QQVNTID0gJChBTV9NQUtFRkxBR1MpCiBNQUtFT1ZFUlJJREVTID0gCi1BQ0xPQ0FMX0FNRkxBR1MgPSAkKEFDTE9DQUxfQU1GTEFHUykgLUkgbTQKLWxpYl9MVExJQlJBUklFUyA9IGxpYmZmaS5sYQordG9vbGV4ZWNsaWJfTFRMSUJSQVJJRVMgPSBsaWJmZmkubGEKIG5vaW5zdF9MVExJQlJBUklFUyA9IGxpYmZmaV9jb252ZW5pZW5jZS5sYQotbGliZmZpX2xhX1NPVVJDRVMgPSBzcmMvZGVidWcuYyBzcmMvcHJlcF9jaWYuYyBzcmMvdHlwZXMuYyBcCitsaWJmZmlfbGFfU09VUkNFUyA9IHNyYy9wcmVwX2NpZi5jIHNyYy90eXBlcy5jIFwKIAkJc3JjL3Jhd19hcGkuYyBzcmMvamF2YV9yYXdfYXBpLmMgc3JjL2Nsb3N1cmVzLmMKIAogcGtnY29uZmlnZGlyID0gJChsaWJkaXIpL3BrZ2NvbmZpZwpAQCAtNDc1LDExICs1NjgsMTQgQEAKIAkkKGFtX19hcHBlbmRfMTUpICQoYW1fX2FwcGVuZF8xNikgJChhbV9fYXBwZW5kXzE3KSBcCiAJJChhbV9fYXBwZW5kXzE4KSAkKGFtX19hcHBlbmRfMTkpICQoYW1fX2FwcGVuZF8yMCkgXAogCSQoYW1fX2FwcGVuZF8yMSkgJChhbV9fYXBwZW5kXzIyKSAkKGFtX19hcHBlbmRfMjMpIFwKLQkkKGFtX19hcHBlbmRfMjQpICQoYW1fX2FwcGVuZF8yNSkKKwkkKGFtX19hcHBlbmRfMjQpICQoYW1fX2FwcGVuZF8yNSkgJChhbV9fYXBwZW5kXzI2KSBcCisJJChhbV9fYXBwZW5kXzI3KSAkKGFtX19hcHBlbmRfMjgpICQoYW1fX2FwcGVuZF8yOSkgXAorCSQoYW1fX2FwcGVuZF8zMCkgJChhbV9fYXBwZW5kXzMxKSAkKGFtX19hcHBlbmRfMzIpIFwKKwkkKGFtX19hcHBlbmRfMzMpICQoYW1fX2FwcGVuZF8zNCkKIGxpYmZmaV9jb252ZW5pZW5jZV9sYV9TT1VSQ0VTID0gJChsaWJmZmlfbGFfU09VUkNFUykKIG5vZGlzdF9saWJmZmlfY29udmVuaWVuY2VfbGFfU09VUkNFUyA9ICQobm9kaXN0X2xpYmZmaV9sYV9TT1VSQ0VTKQotQU1fQ0ZMQUdTID0gLVdhbGwgLWcgLWZleGNlcHRpb25zCi1saWJmZmlfbGFfTERGTEFHUyA9IC12ZXJzaW9uLWluZm8gYGdyZXAgLXYgJ15cIycgJChzcmNkaXIpL2xpYnRvb2wtdmVyc2lvbmAgJChBTV9MVExERkxBR1MpCitMVExERkxBR1MgPSAkKHNoZWxsICQoU0hFTEwpICQodG9wX3NyY2RpcikvbGlidG9vbC1sZGZsYWdzICQoTERGTEFHUykpCitsaWJmZmlfbGFfTERGTEFHUyA9IC1uby11bmRlZmluZWQgLXZlcnNpb24taW5mbyBgZ3JlcCAtdiAnXlwjJyAkKHNyY2RpcikvbGlidG9vbC12ZXJzaW9uYCAkKExUTERGTEFHUykgJChBTV9MVExERkxBR1MpCiBBTV9DUFBGTEFHUyA9IC1JLiAtSSQodG9wX3NyY2RpcikvaW5jbHVkZSAtSWluY2x1ZGUgLUkkKHRvcF9zcmNkaXIpL3NyYwogQU1fQ0NBU0ZMQUdTID0gJChBTV9DUFBGTEFHUykKIGFsbDogZmZpY29uZmlnLmgKQEAgLTQ4Nyw3ICs1ODMsNyBAQAogCiAuU1VGRklYRVM6CiAuU1VGRklYRVM6IC5TIC5jIC5kdmkgLmxvIC5vIC5vYmogLnBzCi1hbS0tcmVmcmVzaDoKK2FtLS1yZWZyZXNoOiBNYWtlZmlsZQogCUA6CiAkKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKIAlAZm9yIGRlcCBpbiAkPzsgZG8gXApAQCAtNTIzLDEwICs2MTksOCBAQAogJChhbV9fYWNsb2NhbF9tNF9kZXBzKToKIAogZmZpY29uZmlnLmg6IHN0YW1wLWgxCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JICBybSAtZiBzdGFtcC1oMTsgXAotCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgc3RhbXAtaDE7IFwKLQllbHNlIDo7IGZpCisJQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBybSAtZiBzdGFtcC1oMTsgZWxzZSA6OyBmaQorCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gJChNQUtFKSAkKEFNX01BS0VGTEFHUykgc3RhbXAtaDE7IGVsc2UgOjsgZmkKIAogc3RhbXAtaDE6ICQoc3JjZGlyKS9mZmljb25maWcuaC5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwogCUBybSAtZiBzdGFtcC1oMQpAQCAtNTQwLDU4ICs2MzQsNjMgQEAKIAktcm0gLWYgZmZpY29uZmlnLmggc3RhbXAtaDEKIGxpYmZmaS5wYzogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgJChzcmNkaXIpL2xpYmZmaS5wYy5pbgogCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAKLWluc3RhbGwtbGliTFRMSUJSQVJJRVM6ICQobGliX0xUTElCUkFSSUVTKQorCitjbGVhbi1ub2luc3RMVExJQlJBUklFUzoKKwktdGVzdCAteiAiJChub2luc3RfTFRMSUJSQVJJRVMpIiB8fCBybSAtZiAkKG5vaW5zdF9MVExJQlJBUklFUykKKwlAbGlzdD0nJChub2luc3RfTFRMSUJSQVJJRVMpJzsgXAorCWxvY3M9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAkJHA7IGRvbmUgfCBcCisJICAgICAgc2VkICdzfF5bXi9dKiQkfC58OyBzfC9bXi9dKiQkfHw7IHN8JCR8L3NvX2xvY2F0aW9uc3wnIHwgXAorCSAgICAgIHNvcnQgLXVgOyBcCisJdGVzdCAteiAiJCRsb2NzIiB8fCB7IFwKKwkgIGVjaG8gcm0gLWYgJCR7bG9jc307IFwKKwkgIHJtIC1mICQke2xvY3N9OyBcCisJfQoraW5zdGFsbC10b29sZXhlY2xpYkxUTElCUkFSSUVTOiAkKHRvb2xleGVjbGliX0xUTElCUkFSSUVTKQogCUAkKE5PUk1BTF9JTlNUQUxMKQotCXRlc3QgLXogIiQobGliZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQobGliZGlyKSIKLQlAbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgdGVzdCAtbiAiJChsaWJkaXIpIiB8fCBsaXN0PTsgXAorCUBsaXN0PSckKHRvb2xleGVjbGliX0xUTElCUkFSSUVTKSc7IHRlc3QgLW4gIiQodG9vbGV4ZWNsaWJkaXIpIiB8fCBsaXN0PTsgXAogCWxpc3QyPTsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCiAJICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCiAJICAgIGxpc3QyPSIkJGxpc3QyICQkcCI7IFwKIAkgIGVsc2UgOjsgZmk7IFwKIAlkb25lOyBcCiAJdGVzdCAteiAiJCRsaXN0MiIgfHwgeyBcCi0JICBlY2hvICIgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTCkgJChJTlNUQUxMX1NUUklQX0ZMQUcpICQkbGlzdDIgJyQoREVTVERJUikkKGxpYmRpciknIjsgXAotCSAgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTCkgJChJTlNUQUxMX1NUUklQX0ZMQUcpICQkbGlzdDIgIiQoREVTVERJUikkKGxpYmRpcikiOyBcCisJICBlY2hvICIgJChNS0RJUl9QKSAnJChERVNURElSKSQodG9vbGV4ZWNsaWJkaXIpJyI7IFwKKwkgICQoTUtESVJfUCkgIiQoREVTVERJUikkKHRvb2xleGVjbGliZGlyKSIgfHwgZXhpdCAxOyBcCisJICBlY2hvICIgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTCkgJChJTlNUQUxMX1NUUklQX0ZMQUcpICQkbGlzdDIgJyQoREVTVERJUikkKHRvb2xleGVjbGliZGlyKSciOyBcCisJICAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkKElOU1RBTExfU1RSSVBfRkxBRykgJCRsaXN0MiAiJChERVNURElSKSQodG9vbGV4ZWNsaWJkaXIpIjsgXAogCX0KIAotdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTOgordW5pbnN0YWxsLXRvb2xleGVjbGliTFRMSUJSQVJJRVM6CiAJQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlAbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgdGVzdCAtbiAiJChsaWJkaXIpIiB8fCBsaXN0PTsgXAorCUBsaXN0PSckKHRvb2xleGVjbGliX0xUTElCUkFSSUVTKSc7IHRlc3QgLW4gIiQodG9vbGV4ZWNsaWJkaXIpIiB8fCBsaXN0PTsgXAogCWZvciBwIGluICQkbGlzdDsgZG8gXAogCSAgJChhbV9fc3RyaXBfZGlyKSBcCi0JICBlY2hvICIgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT11bmluc3RhbGwgcm0gLWYgJyQoREVTVERJUikkKGxpYmRpcikvJCRmJyI7IFwKLQkgICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9dW5pbnN0YWxsIHJtIC1mICIkKERFU1RESVIpJChsaWJkaXIpLyQkZiI7IFwKKwkgIGVjaG8gIiAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPXVuaW5zdGFsbCBybSAtZiAnJChERVNURElSKSQodG9vbGV4ZWNsaWJkaXIpLyQkZiciOyBcCisJICAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPXVuaW5zdGFsbCBybSAtZiAiJChERVNURElSKSQodG9vbGV4ZWNsaWJkaXIpLyQkZiI7IFwKIAlkb25lCiAKLWNsZWFuLWxpYkxUTElCUkFSSUVTOgotCS10ZXN0IC16ICIkKGxpYl9MVExJQlJBUklFUykiIHx8IHJtIC1mICQobGliX0xUTElCUkFSSUVTKQotCUBsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIGRpcj0iYGVjaG8gJCRwIHwgc2VkIC1lICdzfC9bXi9dKiQkfHwnYCI7IFwKLQkgIHRlc3QgIiQkZGlyIiAhPSAiJCRwIiB8fCBkaXI9LjsgXAotCSAgZWNobyAicm0gLWYgXCIkJHtkaXJ9L3NvX2xvY2F0aW9uc1wiIjsgXAotCSAgcm0gLWYgIiQke2Rpcn0vc29fbG9jYXRpb25zIjsgXAotCWRvbmUKLQotY2xlYW4tbm9pbnN0TFRMSUJSQVJJRVM6Ci0JLXRlc3QgLXogIiQobm9pbnN0X0xUTElCUkFSSUVTKSIgfHwgcm0gLWYgJChub2luc3RfTFRMSUJSQVJJRVMpCi0JQGxpc3Q9JyQobm9pbnN0X0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgZGlyPSJgZWNobyAkJHAgfCBzZWQgLWUgJ3N8L1teL10qJCR8fCdgIjsgXAotCSAgdGVzdCAiJCRkaXIiICE9ICIkJHAiIHx8IGRpcj0uOyBcCi0JICBlY2hvICJybSAtZiBcIiQke2Rpcn0vc29fbG9jYXRpb25zXCIiOyBcCi0JICBybSAtZiAiJCR7ZGlyfS9zb19sb2NhdGlvbnMiOyBcCi0JZG9uZQorY2xlYW4tdG9vbGV4ZWNsaWJMVExJQlJBUklFUzoKKwktdGVzdCAteiAiJCh0b29sZXhlY2xpYl9MVExJQlJBUklFUykiIHx8IHJtIC1mICQodG9vbGV4ZWNsaWJfTFRMSUJSQVJJRVMpCisJQGxpc3Q9JyQodG9vbGV4ZWNsaWJfTFRMSUJSQVJJRVMpJzsgXAorCWxvY3M9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAkJHA7IGRvbmUgfCBcCisJICAgICAgc2VkICdzfF5bXi9dKiQkfC58OyBzfC9bXi9dKiQkfHw7IHN8JCR8L3NvX2xvY2F0aW9uc3wnIHwgXAorCSAgICAgIHNvcnQgLXVgOyBcCisJdGVzdCAteiAiJCRsb2NzIiB8fCB7IFwKKwkgIGVjaG8gcm0gLWYgJCR7bG9jc307IFwKKwkgIHJtIC1mICQke2xvY3N9OyBcCisJfQogc3JjLyQoYW1fX2RpcnN0YW1wKToKIAlAJChNS0RJUl9QKSBzcmMKIAlAOiA+IHNyYy8kKGFtX19kaXJzdGFtcCkKIHNyYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApOgogCUAkKE1LRElSX1ApIHNyYy8kKERFUERJUikKIAlAOiA+IHNyYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCi1zcmMvZGVidWcubG86IHNyYy8kKGFtX19kaXJzdGFtcCkgc3JjLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKIHNyYy9wcmVwX2NpZi5sbzogc3JjLyQoYW1fX2RpcnN0YW1wKSBzcmMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQogc3JjL3R5cGVzLmxvOiBzcmMvJChhbV9fZGlyc3RhbXApIHNyYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCiBzcmMvcmF3X2FwaS5sbzogc3JjLyQoYW1fX2RpcnN0YW1wKSBzcmMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQogc3JjL2phdmFfcmF3X2FwaS5sbzogc3JjLyQoYW1fX2RpcnN0YW1wKSBzcmMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQogc3JjL2Nsb3N1cmVzLmxvOiBzcmMvJChhbV9fZGlyc3RhbXApIHNyYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvZGVidWcubG86IHNyYy8kKGFtX19kaXJzdGFtcCkgc3JjLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKIHNyYy9taXBzLyQoYW1fX2RpcnN0YW1wKToKIAlAJChNS0RJUl9QKSBzcmMvbWlwcwogCUA6ID4gc3JjL21pcHMvJChhbV9fZGlyc3RhbXApCkBAIC02MDQsNiArNzAzLDE2IEBACiAJc3JjL21pcHMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQogc3JjL21pcHMvbjMyLmxvOiBzcmMvbWlwcy8kKGFtX19kaXJzdGFtcCkgXAogCXNyYy9taXBzLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy9iZmluLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBzcmMvYmZpbgorCUA6ID4gc3JjL2JmaW4vJChhbV9fZGlyc3RhbXApCitzcmMvYmZpbi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIHNyYy9iZmluLyQoREVQRElSKQorCUA6ID4gc3JjL2JmaW4vJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL2JmaW4vZmZpLmxvOiBzcmMvYmZpbi8kKGFtX19kaXJzdGFtcCkgXAorCXNyYy9iZmluLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy9iZmluL3N5c3YubG86IHNyYy9iZmluLyQoYW1fX2RpcnN0YW1wKSBcCisJc3JjL2JmaW4vJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQogc3JjL3g4Ni8kKGFtX19kaXJzdGFtcCk6CiAJQCQoTUtESVJfUCkgc3JjL3g4NgogCUA6ID4gc3JjL3g4Ni8kKGFtX19kaXJzdGFtcCkKQEAgLTY3OCw2ICs3ODcsMjYgQEAKIAlzcmMvbTY4ay8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCiBzcmMvbTY4ay9zeXN2LmxvOiBzcmMvbTY4ay8kKGFtX19kaXJzdGFtcCkgXAogCXNyYy9tNjhrLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy9tb3hpZS8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgc3JjL21veGllCisJQDogPiBzcmMvbW94aWUvJChhbV9fZGlyc3RhbXApCitzcmMvbW94aWUvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBzcmMvbW94aWUvJChERVBESVIpCisJQDogPiBzcmMvbW94aWUvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL21veGllL2ZmaS5sbzogc3JjL21veGllLyQoYW1fX2RpcnN0YW1wKSBcCisJc3JjL21veGllLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy9tb3hpZS9lYWJpLmxvOiBzcmMvbW94aWUvJChhbV9fZGlyc3RhbXApIFwKKwlzcmMvbW94aWUvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL21pY3JvYmxhemUvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIHNyYy9taWNyb2JsYXplCisJQDogPiBzcmMvbWljcm9ibGF6ZS8kKGFtX19kaXJzdGFtcCkKK3NyYy9taWNyb2JsYXplLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgc3JjL21pY3JvYmxhemUvJChERVBESVIpCisJQDogPiBzcmMvbWljcm9ibGF6ZS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvbWljcm9ibGF6ZS9mZmkubG86IHNyYy9taWNyb2JsYXplLyQoYW1fX2RpcnN0YW1wKSBcCisJc3JjL21pY3JvYmxhemUvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL21pY3JvYmxhemUvc3lzdi5sbzogc3JjL21pY3JvYmxhemUvJChhbV9fZGlyc3RhbXApIFwKKwlzcmMvbWljcm9ibGF6ZS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCiBzcmMvcG93ZXJwYy8kKGFtX19kaXJzdGFtcCk6CiAJQCQoTUtESVJfUCkgc3JjL3Bvd2VycGMKIAlAOiA+IHNyYy9wb3dlcnBjLyQoYW1fX2RpcnN0YW1wKQpAQCAtNzA0LDYgKzgzMywxNiBAQAogCXNyYy9wb3dlcnBjLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKIHNyYy9wb3dlcnBjL2Rhcndpbl9jbG9zdXJlLmxvOiBzcmMvcG93ZXJwYy8kKGFtX19kaXJzdGFtcCkgXAogCXNyYy9wb3dlcnBjLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy9hYXJjaDY0LyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBzcmMvYWFyY2g2NAorCUA6ID4gc3JjL2FhcmNoNjQvJChhbV9fZGlyc3RhbXApCitzcmMvYWFyY2g2NC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIHNyYy9hYXJjaDY0LyQoREVQRElSKQorCUA6ID4gc3JjL2FhcmNoNjQvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL2FhcmNoNjQvc3lzdi5sbzogc3JjL2FhcmNoNjQvJChhbV9fZGlyc3RhbXApIFwKKwlzcmMvYWFyY2g2NC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvYWFyY2g2NC9mZmkubG86IHNyYy9hYXJjaDY0LyQoYW1fX2RpcnN0YW1wKSBcCisJc3JjL2FhcmNoNjQvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQogc3JjL2FybS8kKGFtX19kaXJzdGFtcCk6CiAJQCQoTUtESVJfUCkgc3JjL2FybQogCUA6ID4gc3JjL2FybS8kKGFtX19kaXJzdGFtcCkKQEAgLTcxNCw2ICs4NTMsOCBAQAogCXNyYy9hcm0vJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQogc3JjL2FybS9mZmkubG86IHNyYy9hcm0vJChhbV9fZGlyc3RhbXApIFwKIAlzcmMvYXJtLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy9hcm0vdHJhbXBvbGluZS5sbzogc3JjL2FybS8kKGFtX19kaXJzdGFtcCkgXAorCXNyYy9hcm0vJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQogc3JjL2F2cjMyLyQoYW1fX2RpcnN0YW1wKToKIAlAJChNS0RJUl9QKSBzcmMvYXZyMzIKIAlAOiA+IHNyYy9hdnIzMi8kKGFtX19kaXJzdGFtcCkKQEAgLTc4NiwxMjUgKzkyNyw5MSBAQAogc3JjL3BhL2ZmaS5sbzogc3JjL3BhLyQoYW1fX2RpcnN0YW1wKSBzcmMvcGEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQogc3JjL3BhL2hwdXgzMi5sbzogc3JjL3BhLyQoYW1fX2RpcnN0YW1wKSBcCiAJc3JjL3BhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKLWxpYmZmaS5sYTogJChsaWJmZmlfbGFfT0JKRUNUUykgJChsaWJmZmlfbGFfREVQRU5ERU5DSUVTKSAKLQkkKGxpYmZmaV9sYV9MSU5LKSAtcnBhdGggJChsaWJkaXIpICQobGliZmZpX2xhX09CSkVDVFMpICQobGliZmZpX2xhX0xJQkFERCkgJChMSUJTKQotbGliZmZpX2NvbnZlbmllbmNlLmxhOiAkKGxpYmZmaV9jb252ZW5pZW5jZV9sYV9PQkpFQ1RTKSAkKGxpYmZmaV9jb252ZW5pZW5jZV9sYV9ERVBFTkRFTkNJRVMpIAorc3JjL3RpbGUvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIHNyYy90aWxlCisJQDogPiBzcmMvdGlsZS8kKGFtX19kaXJzdGFtcCkKK3NyYy90aWxlLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgc3JjL3RpbGUvJChERVBESVIpCisJQDogPiBzcmMvdGlsZS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvdGlsZS90aWxlLmxvOiBzcmMvdGlsZS8kKGFtX19kaXJzdGFtcCkgXAorCXNyYy90aWxlLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy90aWxlL2ZmaS5sbzogc3JjL3RpbGUvJChhbV9fZGlyc3RhbXApIFwKKwlzcmMvdGlsZS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMveHRlbnNhLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBzcmMveHRlbnNhCisJQDogPiBzcmMveHRlbnNhLyQoYW1fX2RpcnN0YW1wKQorc3JjL3h0ZW5zYS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIHNyYy94dGVuc2EvJChERVBESVIpCisJQDogPiBzcmMveHRlbnNhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy94dGVuc2Evc3lzdi5sbzogc3JjL3h0ZW5zYS8kKGFtX19kaXJzdGFtcCkgXAorCXNyYy94dGVuc2EvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL3h0ZW5zYS9mZmkubG86IHNyYy94dGVuc2EvJChhbV9fZGlyc3RhbXApIFwKKwlzcmMveHRlbnNhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy9tZXRhZy8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgc3JjL21ldGFnCisJQDogPiBzcmMvbWV0YWcvJChhbV9fZGlyc3RhbXApCitzcmMvbWV0YWcvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBzcmMvbWV0YWcvJChERVBESVIpCisJQDogPiBzcmMvbWV0YWcvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL21ldGFnL3N5c3YubG86IHNyYy9tZXRhZy8kKGFtX19kaXJzdGFtcCkgXAorCXNyYy9tZXRhZy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvbWV0YWcvZmZpLmxvOiBzcmMvbWV0YWcvJChhbV9fZGlyc3RhbXApIFwKKwlzcmMvbWV0YWcvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorbGliZmZpLmxhOiAkKGxpYmZmaV9sYV9PQkpFQ1RTKSAkKGxpYmZmaV9sYV9ERVBFTkRFTkNJRVMpICQoRVhUUkFfbGliZmZpX2xhX0RFUEVOREVOQ0lFUykgCisJJChsaWJmZmlfbGFfTElOSykgLXJwYXRoICQodG9vbGV4ZWNsaWJkaXIpICQobGliZmZpX2xhX09CSkVDVFMpICQobGliZmZpX2xhX0xJQkFERCkgJChMSUJTKQorbGliZmZpX2NvbnZlbmllbmNlLmxhOiAkKGxpYmZmaV9jb252ZW5pZW5jZV9sYV9PQkpFQ1RTKSAkKGxpYmZmaV9jb252ZW5pZW5jZV9sYV9ERVBFTkRFTkNJRVMpICQoRVhUUkFfbGliZmZpX2NvbnZlbmllbmNlX2xhX0RFUEVOREVOQ0lFUykgCiAJJChMSU5LKSAgJChsaWJmZmlfY29udmVuaWVuY2VfbGFfT0JKRUNUUykgJChsaWJmZmlfY29udmVuaWVuY2VfbGFfTElCQUREKSAkKExJQlMpCiAKIG1vc3RseWNsZWFuLWNvbXBpbGU6CiAJLXJtIC1mICouJChPQkpFWFQpCi0JLXJtIC1mIHNyYy9hbHBoYS9mZmkuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy9hbHBoYS9mZmkubG8KLQktcm0gLWYgc3JjL2FscGhhL29zZi4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL2FscGhhL29zZi5sbwotCS1ybSAtZiBzcmMvYXJtL2ZmaS4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL2FybS9mZmkubG8KLQktcm0gLWYgc3JjL2FybS9zeXN2LiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvYXJtL3N5c3YubG8KLQktcm0gLWYgc3JjL2F2cjMyL2ZmaS4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL2F2cjMyL2ZmaS5sbwotCS1ybSAtZiBzcmMvYXZyMzIvc3lzdi4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL2F2cjMyL3N5c3YubG8KLQktcm0gLWYgc3JjL2Nsb3N1cmVzLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvY2xvc3VyZXMubG8KLQktcm0gLWYgc3JjL2NyaXMvZmZpLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvY3Jpcy9mZmkubG8KLQktcm0gLWYgc3JjL2NyaXMvc3lzdi4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL2NyaXMvc3lzdi5sbwotCS1ybSAtZiBzcmMvZGVidWcuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy9kZWJ1Zy5sbwotCS1ybSAtZiBzcmMvZnJ2L2VhYmkuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy9mcnYvZWFiaS5sbwotCS1ybSAtZiBzcmMvZnJ2L2ZmaS4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL2Zydi9mZmkubG8KLQktcm0gLWYgc3JjL2lhNjQvZmZpLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvaWE2NC9mZmkubG8KLQktcm0gLWYgc3JjL2lhNjQvdW5peC4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL2lhNjQvdW5peC5sbwotCS1ybSAtZiBzcmMvamF2YV9yYXdfYXBpLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvamF2YV9yYXdfYXBpLmxvCi0JLXJtIC1mIHNyYy9tMzJyL2ZmaS4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL20zMnIvZmZpLmxvCi0JLXJtIC1mIHNyYy9tMzJyL3N5c3YuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy9tMzJyL3N5c3YubG8KLQktcm0gLWYgc3JjL202OGsvZmZpLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvbTY4ay9mZmkubG8KLQktcm0gLWYgc3JjL202OGsvc3lzdi4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL202OGsvc3lzdi5sbwotCS1ybSAtZiBzcmMvbWlwcy9mZmkuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy9taXBzL2ZmaS5sbwotCS1ybSAtZiBzcmMvbWlwcy9uMzIuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy9taXBzL24zMi5sbwotCS1ybSAtZiBzcmMvbWlwcy9vMzIuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy9taXBzL28zMi5sbwotCS1ybSAtZiBzcmMvcGEvZmZpLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvcGEvZmZpLmxvCi0JLXJtIC1mIHNyYy9wYS9ocHV4MzIuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy9wYS9ocHV4MzIubG8KLQktcm0gLWYgc3JjL3BhL2xpbnV4LiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvcGEvbGludXgubG8KLQktcm0gLWYgc3JjL3Bvd2VycGMvYWl4LiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvcG93ZXJwYy9haXgubG8KLQktcm0gLWYgc3JjL3Bvd2VycGMvYWl4X2Nsb3N1cmUuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy9wb3dlcnBjL2FpeF9jbG9zdXJlLmxvCi0JLXJtIC1mIHNyYy9wb3dlcnBjL2Rhcndpbi4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL3Bvd2VycGMvZGFyd2luLmxvCi0JLXJtIC1mIHNyYy9wb3dlcnBjL2Rhcndpbl9jbG9zdXJlLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvcG93ZXJwYy9kYXJ3aW5fY2xvc3VyZS5sbwotCS1ybSAtZiBzcmMvcG93ZXJwYy9mZmkuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy9wb3dlcnBjL2ZmaS5sbwotCS1ybSAtZiBzcmMvcG93ZXJwYy9mZmlfZGFyd2luLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvcG93ZXJwYy9mZmlfZGFyd2luLmxvCi0JLXJtIC1mIHNyYy9wb3dlcnBjL2xpbnV4NjQuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy9wb3dlcnBjL2xpbnV4NjQubG8KLQktcm0gLWYgc3JjL3Bvd2VycGMvbGludXg2NF9jbG9zdXJlLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvcG93ZXJwYy9saW51eDY0X2Nsb3N1cmUubG8KLQktcm0gLWYgc3JjL3Bvd2VycGMvcHBjX2Nsb3N1cmUuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy9wb3dlcnBjL3BwY19jbG9zdXJlLmxvCi0JLXJtIC1mIHNyYy9wb3dlcnBjL3N5c3YuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy9wb3dlcnBjL3N5c3YubG8KLQktcm0gLWYgc3JjL3ByZXBfY2lmLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvcHJlcF9jaWYubG8KLQktcm0gLWYgc3JjL3Jhd19hcGkuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy9yYXdfYXBpLmxvCi0JLXJtIC1mIHNyYy9zMzkwL2ZmaS4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL3MzOTAvZmZpLmxvCi0JLXJtIC1mIHNyYy9zMzkwL3N5c3YuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy9zMzkwL3N5c3YubG8KLQktcm0gLWYgc3JjL3NoL2ZmaS4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL3NoL2ZmaS5sbwotCS1ybSAtZiBzcmMvc2gvc3lzdi4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL3NoL3N5c3YubG8KLQktcm0gLWYgc3JjL3NoNjQvZmZpLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvc2g2NC9mZmkubG8KLQktcm0gLWYgc3JjL3NoNjQvc3lzdi4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL3NoNjQvc3lzdi5sbwotCS1ybSAtZiBzcmMvc3BhcmMvZmZpLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvc3BhcmMvZmZpLmxvCi0JLXJtIC1mIHNyYy9zcGFyYy92OC4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL3NwYXJjL3Y4LmxvCi0JLXJtIC1mIHNyYy9zcGFyYy92OS4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL3NwYXJjL3Y5LmxvCi0JLXJtIC1mIHNyYy90eXBlcy4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL3R5cGVzLmxvCi0JLXJtIC1mIHNyYy94ODYvZGFyd2luLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMveDg2L2Rhcndpbi5sbwotCS1ybSAtZiBzcmMveDg2L2RhcndpbjY0LiQoT0JKRVhUKQotCS1ybSAtZiBzcmMveDg2L2RhcndpbjY0LmxvCi0JLXJtIC1mIHNyYy94ODYvZmZpLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMveDg2L2ZmaS5sbwotCS1ybSAtZiBzcmMveDg2L2ZmaTY0LiQoT0JKRVhUKQotCS1ybSAtZiBzcmMveDg2L2ZmaTY0LmxvCi0JLXJtIC1mIHNyYy94ODYvZnJlZWJzZC4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL3g4Ni9mcmVlYnNkLmxvCi0JLXJtIC1mIHNyYy94ODYvc3lzdi4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL3g4Ni9zeXN2LmxvCi0JLXJtIC1mIHNyYy94ODYvdW5peDY0LiQoT0JKRVhUKQotCS1ybSAtZiBzcmMveDg2L3VuaXg2NC5sbwotCS1ybSAtZiBzcmMveDg2L3dpbjMyLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMveDg2L3dpbjMyLmxvCi0JLXJtIC1mIHNyYy94ODYvd2luNjQuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy94ODYvd2luNjQubG8KKwktcm0gLWYgc3JjLyouJChPQkpFWFQpCisJLXJtIC1mIHNyYy8qLmxvCisJLXJtIC1mIHNyYy9hYXJjaDY0LyouJChPQkpFWFQpCisJLXJtIC1mIHNyYy9hYXJjaDY0LyoubG8KKwktcm0gLWYgc3JjL2FscGhhLyouJChPQkpFWFQpCisJLXJtIC1mIHNyYy9hbHBoYS8qLmxvCisJLXJtIC1mIHNyYy9hcm0vKi4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL2FybS8qLmxvCisJLXJtIC1mIHNyYy9hdnIzMi8qLiQoT0JKRVhUKQorCS1ybSAtZiBzcmMvYXZyMzIvKi5sbworCS1ybSAtZiBzcmMvYmZpbi8qLiQoT0JKRVhUKQorCS1ybSAtZiBzcmMvYmZpbi8qLmxvCisJLXJtIC1mIHNyYy9jcmlzLyouJChPQkpFWFQpCisJLXJtIC1mIHNyYy9jcmlzLyoubG8KKwktcm0gLWYgc3JjL2Zydi8qLiQoT0JKRVhUKQorCS1ybSAtZiBzcmMvZnJ2LyoubG8KKwktcm0gLWYgc3JjL2lhNjQvKi4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL2lhNjQvKi5sbworCS1ybSAtZiBzcmMvbTMyci8qLiQoT0JKRVhUKQorCS1ybSAtZiBzcmMvbTMyci8qLmxvCisJLXJtIC1mIHNyYy9tNjhrLyouJChPQkpFWFQpCisJLXJtIC1mIHNyYy9tNjhrLyoubG8KKwktcm0gLWYgc3JjL21ldGFnLyouJChPQkpFWFQpCisJLXJtIC1mIHNyYy9tZXRhZy8qLmxvCisJLXJtIC1mIHNyYy9taWNyb2JsYXplLyouJChPQkpFWFQpCisJLXJtIC1mIHNyYy9taWNyb2JsYXplLyoubG8KKwktcm0gLWYgc3JjL21pcHMvKi4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL21pcHMvKi5sbworCS1ybSAtZiBzcmMvbW94aWUvKi4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL21veGllLyoubG8KKwktcm0gLWYgc3JjL3BhLyouJChPQkpFWFQpCisJLXJtIC1mIHNyYy9wYS8qLmxvCisJLXJtIC1mIHNyYy9wb3dlcnBjLyouJChPQkpFWFQpCisJLXJtIC1mIHNyYy9wb3dlcnBjLyoubG8KKwktcm0gLWYgc3JjL3MzOTAvKi4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL3MzOTAvKi5sbworCS1ybSAtZiBzcmMvc2gvKi4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL3NoLyoubG8KKwktcm0gLWYgc3JjL3NoNjQvKi4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL3NoNjQvKi5sbworCS1ybSAtZiBzcmMvc3BhcmMvKi4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL3NwYXJjLyoubG8KKwktcm0gLWYgc3JjL3RpbGUvKi4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL3RpbGUvKi5sbworCS1ybSAtZiBzcmMveDg2LyouJChPQkpFWFQpCisJLXJtIC1mIHNyYy94ODYvKi5sbworCS1ybSAtZiBzcmMveHRlbnNhLyouJChPQkpFWFQpCisJLXJtIC1mIHNyYy94dGVuc2EvKi5sbwogCiBkaXN0Y2xlYW4tY29tcGlsZToKIAktcm0gLWYgKi50YWIuYwpAQCAtOTE1LDEyICsxMDIyLDE3IEBACiBAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjLyQoREVQRElSKS9wcmVwX2NpZi5QbG9AYW1fX3F1b3RlQAogQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy8kKERFUERJUikvcmF3X2FwaS5QbG9AYW1fX3F1b3RlQAogQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy8kKERFUERJUikvdHlwZXMuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvYWFyY2g2NC8kKERFUERJUikvZmZpLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL2FhcmNoNjQvJChERVBESVIpL3N5c3YuUGxvQGFtX19xdW90ZUAKIEBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvYWxwaGEvJChERVBESVIpL2ZmaS5QbG9AYW1fX3F1b3RlQAogQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9hbHBoYS8kKERFUERJUikvb3NmLlBsb0BhbV9fcXVvdGVACiBAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL2FybS8kKERFUERJUikvZmZpLlBsb0BhbV9fcXVvdGVACiBAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL2FybS8kKERFUERJUikvc3lzdi5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9hcm0vJChERVBESVIpL3RyYW1wb2xpbmUuUGxvQGFtX19xdW90ZUAKIEBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvYXZyMzIvJChERVBESVIpL2ZmaS5QbG9AYW1fX3F1b3RlQAogQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9hdnIzMi8kKERFUERJUikvc3lzdi5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9iZmluLyQoREVQRElSKS9mZmkuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvYmZpbi8kKERFUERJUikvc3lzdi5QbG9AYW1fX3F1b3RlQAogQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9jcmlzLyQoREVQRElSKS9mZmkuUGxvQGFtX19xdW90ZUAKIEBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvY3Jpcy8kKERFUERJUikvc3lzdi5QbG9AYW1fX3F1b3RlQAogQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9mcnYvJChERVBESVIpL2VhYmkuUGxvQGFtX19xdW90ZUAKQEAgLTkzMSw5ICsxMDQzLDE1IEBACiBAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL20zMnIvJChERVBESVIpL3N5c3YuUGxvQGFtX19xdW90ZUAKIEBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvbTY4ay8kKERFUERJUikvZmZpLlBsb0BhbV9fcXVvdGVACiBAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL202OGsvJChERVBESVIpL3N5c3YuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvbWV0YWcvJChERVBESVIpL2ZmaS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9tZXRhZy8kKERFUERJUikvc3lzdi5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9taWNyb2JsYXplLyQoREVQRElSKS9mZmkuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvbWljcm9ibGF6ZS8kKERFUERJUikvc3lzdi5QbG9AYW1fX3F1b3RlQAogQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9taXBzLyQoREVQRElSKS9mZmkuUGxvQGFtX19xdW90ZUAKIEBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvbWlwcy8kKERFUERJUikvbjMyLlBsb0BhbV9fcXVvdGVACiBAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL21pcHMvJChERVBESVIpL28zMi5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9tb3hpZS8kKERFUERJUikvZWFiaS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9tb3hpZS8kKERFUERJUikvZmZpLlBsb0BhbV9fcXVvdGVACiBAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL3BhLyQoREVQRElSKS9mZmkuUGxvQGFtX19xdW90ZUAKIEBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvcGEvJChERVBESVIpL2hwdXgzMi5QbG9AYW1fX3F1b3RlQAogQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9wYS8kKERFUERJUikvbGludXguUGxvQGFtX19xdW90ZUAKQEAgLTk1Niw2ICsxMDc0LDggQEAKIEBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvc3BhcmMvJChERVBESVIpL2ZmaS5QbG9AYW1fX3F1b3RlQAogQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9zcGFyYy8kKERFUERJUikvdjguUGxvQGFtX19xdW90ZUAKIEBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvc3BhcmMvJChERVBESVIpL3Y5LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL3RpbGUvJChERVBESVIpL2ZmaS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy90aWxlLyQoREVQRElSKS90aWxlLlBsb0BhbV9fcXVvdGVACiBAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL3g4Ni8kKERFUERJUikvZGFyd2luLlBsb0BhbV9fcXVvdGVACiBAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL3g4Ni8kKERFUERJUikvZGFyd2luNjQuUGxvQGFtX19xdW90ZUAKIEBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMveDg2LyQoREVQRElSKS9mZmkuUGxvQGFtX19xdW90ZUAKQEAgLTk2NSw2ICsxMDg1LDggQEAKIEBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMveDg2LyQoREVQRElSKS91bml4NjQuUGxvQGFtX19xdW90ZUAKIEBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMveDg2LyQoREVQRElSKS93aW4zMi5QbG9AYW1fX3F1b3RlQAogQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy94ODYvJChERVBESVIpL3dpbjY0LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL3h0ZW5zYS8kKERFUERJUikvZmZpLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL3h0ZW5zYS8kKERFUERJUikvc3lzdi5QbG9AYW1fX3F1b3RlQAogCiAuUy5vOgogQGFtX19mYXN0ZGVwQ0NBU19UUlVFQAlkZXBiYXNlPWBlY2hvICRAIHwgc2VkICdzfFteL10qJCR8JChERVBESVIpLyZ8O3N8XC5vJCR8fCdgO1wKQEAgLTEwMjAsMjIgKzExNDIsMjkgQEAKIGNsZWFuLWxpYnRvb2w6CiAJLXJtIC1yZiAubGlicyBfbGlicwogCS1ybSAtcmYgc3JjLy5saWJzIHNyYy9fbGlicworCS1ybSAtcmYgc3JjL2FhcmNoNjQvLmxpYnMgc3JjL2FhcmNoNjQvX2xpYnMKIAktcm0gLXJmIHNyYy9hbHBoYS8ubGlicyBzcmMvYWxwaGEvX2xpYnMKIAktcm0gLXJmIHNyYy9hcm0vLmxpYnMgc3JjL2FybS9fbGlicwogCS1ybSAtcmYgc3JjL2F2cjMyLy5saWJzIHNyYy9hdnIzMi9fbGlicworCS1ybSAtcmYgc3JjL2JmaW4vLmxpYnMgc3JjL2JmaW4vX2xpYnMKIAktcm0gLXJmIHNyYy9jcmlzLy5saWJzIHNyYy9jcmlzL19saWJzCiAJLXJtIC1yZiBzcmMvZnJ2Ly5saWJzIHNyYy9mcnYvX2xpYnMKIAktcm0gLXJmIHNyYy9pYTY0Ly5saWJzIHNyYy9pYTY0L19saWJzCiAJLXJtIC1yZiBzcmMvbTMyci8ubGlicyBzcmMvbTMyci9fbGlicwogCS1ybSAtcmYgc3JjL202OGsvLmxpYnMgc3JjL202OGsvX2xpYnMKKwktcm0gLXJmIHNyYy9tZXRhZy8ubGlicyBzcmMvbWV0YWcvX2xpYnMKKwktcm0gLXJmIHNyYy9taWNyb2JsYXplLy5saWJzIHNyYy9taWNyb2JsYXplL19saWJzCiAJLXJtIC1yZiBzcmMvbWlwcy8ubGlicyBzcmMvbWlwcy9fbGlicworCS1ybSAtcmYgc3JjL21veGllLy5saWJzIHNyYy9tb3hpZS9fbGlicwogCS1ybSAtcmYgc3JjL3BhLy5saWJzIHNyYy9wYS9fbGlicwogCS1ybSAtcmYgc3JjL3Bvd2VycGMvLmxpYnMgc3JjL3Bvd2VycGMvX2xpYnMKIAktcm0gLXJmIHNyYy9zMzkwLy5saWJzIHNyYy9zMzkwL19saWJzCiAJLXJtIC1yZiBzcmMvc2gvLmxpYnMgc3JjL3NoL19saWJzCiAJLXJtIC1yZiBzcmMvc2g2NC8ubGlicyBzcmMvc2g2NC9fbGlicwogCS1ybSAtcmYgc3JjL3NwYXJjLy5saWJzIHNyYy9zcGFyYy9fbGlicworCS1ybSAtcmYgc3JjL3RpbGUvLmxpYnMgc3JjL3RpbGUvX2xpYnMKIAktcm0gLXJmIHNyYy94ODYvLmxpYnMgc3JjL3g4Ni9fbGlicworCS1ybSAtcmYgc3JjL3h0ZW5zYS8ubGlicyBzcmMveHRlbnNhL19saWJzCiAKIGRpc3RjbGVhbi1saWJ0b29sOgogCS1ybSAtZiBsaWJ0b29sIGNvbmZpZy5sdApAQCAtMTA2OCwxMiArMTE5NywxMiBAQAogZG9jL2xpYmZmaS5kdmk6IGRvYy9saWJmZmkudGV4aSAkKHNyY2RpcikvZG9jL3ZlcnNpb24udGV4aSBkb2MvJChhbV9fZGlyc3RhbXApCiAJVEVYSU5QVVRTPSIkKGFtX19URVhJTkZPX1RFWF9ESVIpJChQQVRIX1NFUEFSQVRPUikkJFRFWElOUFVUUyIgXAogCU1BS0VJTkZPPSckKE1BS0VJTkZPKSAkKEFNX01BS0VJTkZPRkxBR1MpICQoTUFLRUlORk9GTEFHUykgLUkgZG9jIC1JICQoc3JjZGlyKS9kb2MnIFwKLQkkKFRFWEkyRFZJKSAtbyAkQCBgdGVzdCAtZiAnZG9jL2xpYmZmaS50ZXhpJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bkb2MvbGliZmZpLnRleGkKKwkkKFRFWEkyRFZJKSAgLS1jbGVhbiAtbyAkQCBgdGVzdCAtZiAnZG9jL2xpYmZmaS50ZXhpJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bkb2MvbGliZmZpLnRleGkgCiAKIGRvYy9saWJmZmkucGRmOiBkb2MvbGliZmZpLnRleGkgJChzcmNkaXIpL2RvYy92ZXJzaW9uLnRleGkgZG9jLyQoYW1fX2RpcnN0YW1wKQogCVRFWElOUFVUUz0iJChhbV9fVEVYSU5GT19URVhfRElSKSQoUEFUSF9TRVBBUkFUT1IpJCRURVhJTlBVVFMiIFwKIAlNQUtFSU5GTz0nJChNQUtFSU5GTykgJChBTV9NQUtFSU5GT0ZMQUdTKSAkKE1BS0VJTkZPRkxBR1MpIC1JIGRvYyAtSSAkKHNyY2RpcikvZG9jJyBcCi0JJChURVhJMlBERikgLW8gJEAgYHRlc3QgLWYgJ2RvYy9saWJmZmkudGV4aScgfHwgZWNobyAnJChzcmNkaXIpLydgZG9jL2xpYmZmaS50ZXhpCisJJChURVhJMlBERikgIC0tY2xlYW4gLW8gJEAgYHRlc3QgLWYgJ2RvYy9saWJmZmkudGV4aScgfHwgZWNobyAnJChzcmNkaXIpLydgZG9jL2xpYmZmaS50ZXhpIAogCiBkb2MvbGliZmZpLmh0bWw6IGRvYy9saWJmZmkudGV4aSAkKHNyY2RpcikvZG9jL3ZlcnNpb24udGV4aSBkb2MvJChhbV9fZGlyc3RhbXApCiAJcm0gLXJmICQoQDouaHRtbD0uaHRwKQpAQCAtMTExMCw3ICsxMjM5LDcgQEAKIEBNQUlOVEFJTkVSX01PREVfVFJVRUAJLXJtIC1mICQoc3JjZGlyKS9kb2Mvc3RhbXAtdnRpICQoc3JjZGlyKS9kb2MvdmVyc2lvbi50ZXhpCiAuZHZpLnBzOgogCVRFWElOUFVUUz0iJChhbV9fVEVYSU5GT19URVhfRElSKSQoUEFUSF9TRVBBUkFUT1IpJCRURVhJTlBVVFMiIFwKLQkkKERWSVBTKSAtbyAkQCAkPAorCSQoRFZJUFMpICAtbyAkQCAkPAogCiB1bmluc3RhbGwtZHZpLWFtOgogCUAkKE5PUk1BTF9VTklOU1RBTEwpCkBAIC0xMTMyLDkgKzEyNjEsNyBAQAogCiB1bmluc3RhbGwtaW5mby1hbToKIAlAJChQUkVfVU5JTlNUQUxMKQotCUBpZiB0ZXN0IC1kICckKERFU1RESVIpJChpbmZvZGlyKScgJiYgXAotCSAgICAoaW5zdGFsbC1pbmZvIC0tdmVyc2lvbiAmJiBcCi0JICAgICBpbnN0YWxsLWluZm8gLS12ZXJzaW9uIDI+JjEgfCBzZWQgMXEgfCBncmVwIC1pIC12IGRlYmlhbikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKKwlAaWYgdGVzdCAtZCAnJChERVNURElSKSQoaW5mb2RpciknICYmICQoYW1fX2Nhbl9ydW5faW5zdGFsbGluZm8pOyB0aGVuIFwKIAkgIGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKIAkgIGZvciBmaWxlIGluICQkbGlzdDsgZG8gXAogCSAgICByZWxmaWxlPWBlY2hvICIkJGZpbGUiIHwgc2VkICdzfF4uKi98fCdgOyBcCkBAIC0xMjA2LDggKzEzMzMsMTEgQEAKIAlkb25lCiBpbnN0YWxsLXBrZ2NvbmZpZ0RBVEE6ICQocGtnY29uZmlnX0RBVEEpCiAJQCQoTk9STUFMX0lOU1RBTEwpCi0JdGVzdCAteiAiJChwa2djb25maWdkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChwa2djb25maWdkaXIpIgogCUBsaXN0PSckKHBrZ2NvbmZpZ19EQVRBKSc7IHRlc3QgLW4gIiQocGtnY29uZmlnZGlyKSIgfHwgbGlzdD07IFwKKwlpZiB0ZXN0IC1uICIkJGxpc3QiOyB0aGVuIFwKKwkgIGVjaG8gIiAkKE1LRElSX1ApICckKERFU1RESVIpJChwa2djb25maWdkaXIpJyI7IFwKKwkgICQoTUtESVJfUCkgIiQoREVTVERJUikkKHBrZ2NvbmZpZ2RpcikiIHx8IGV4aXQgMTsgXAorCWZpOyBcCiAJZm9yIHAgaW4gJCRsaXN0OyBkbyBcCiAJICBpZiB0ZXN0IC1mICIkJHAiOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAogCSAgZWNobyAiJCRkJCRwIjsgXApAQCAtMTIyMSwxOCArMTM1MSwxNiBAQAogCUAkKE5PUk1BTF9VTklOU1RBTEwpCiAJQGxpc3Q9JyQocGtnY29uZmlnX0RBVEEpJzsgdGVzdCAtbiAiJChwa2djb25maWdkaXIpIiB8fCBsaXN0PTsgXAogCWZpbGVzPWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRwOyBkb25lIHwgc2VkIC1lICdzfF4uKi98fCdgOyBcCi0JdGVzdCAtbiAiJCRmaWxlcyIgfHwgZXhpdCAwOyBcCi0JZWNobyAiICggY2QgJyQoREVTVERJUikkKHBrZ2NvbmZpZ2RpciknICYmIHJtIC1mIiAkJGZpbGVzICIpIjsgXAotCWNkICIkKERFU1RESVIpJChwa2djb25maWdkaXIpIiAmJiBybSAtZiAkJGZpbGVzCisJZGlyPSckKERFU1RESVIpJChwa2djb25maWdkaXIpJzsgJChhbV9fdW5pbnN0YWxsX2ZpbGVzX2Zyb21fZGlyKQogCiAjIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAotIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCi0jIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCi0jICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKLSMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7Ci0jICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgotJChSRUNVUlNJVkVfVEFSR0VUUyk6Ci0JQGZhaWxjb209J2V4aXQgMSc7IFwKKyMgaW50byB0aGVtIGFuZCBydW4gJ21ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgorIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiAnbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAorIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiAnY29uZmlnLnN0YXR1cycsIGVkaXQgJ2NvbmZpZy5zdGF0dXMnCisjICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biAnbWFrZScpOworIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgJ21ha2UnIGNvbW1hbmQgbGluZS4KKyQoUkVDVVJTSVZFX1RBUkdFVFMpICQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpOgorCUBmYWlsPSBmYWlsY29tPSdleGl0IDEnOyBcCiAJZm9yIGYgaW4geCAkJE1BS0VGTEFHUzsgZG8gXAogCSAgY2FzZSAkJGYgaW4gXAogCSAgICAqPSogfCAtLVsha10qKTs7IFwKQEAgLTEyNDEsNyArMTM2OSwxMSBAQAogCWRvbmU7IFwKIAlkb3Rfc2Vlbj1ubzsgXAogCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwljYXNlICIkQCIgaW4gXAorCSAgZGlzdGNsZWFuLSogfCBtYWludGFpbmVyLWNsZWFuLSopIGxpc3Q9JyQoRElTVF9TVUJESVJTKScgOzsgXAorCSAgKikgbGlzdD0nJChTVUJESVJTKScgOzsgXAorCWVzYWM7IFwKKwlmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAogCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAogCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKIAkgICAgZG90X3NlZW49eWVzOyBcCkBAIC0xMjU1LDM3ICsxMzg3LDYgQEAKIAlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAogCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKIAlmaTsgdGVzdCAteiAiJCRmYWlsIgotCi0kKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKToKLQlAZmFpbGNvbT0nZXhpdCAxJzsgXAotCWZvciBmIGluIHggJCRNQUtFRkxBR1M7IGRvIFwKLQkgIGNhc2UgJCRmIGluIFwKLQkgICAgKj0qIHwgLS1bIWtdKik7OyBcCi0JICAgICprKikgZmFpbGNvbT0nZmFpbD15ZXMnOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCWNhc2UgIiRAIiBpbiBcCi0JICBkaXN0Y2xlYW4tKiB8IG1haW50YWluZXItY2xlYW4tKikgbGlzdD0nJChESVNUX1NVQkRJUlMpJyA7OyBcCi0JICAqKSBsaXN0PSckKFNVQkRJUlMpJyA7OyBcCi0JZXNhYzsgXAotCXJldj0nJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKLQkgIGZpOyBcCi0JZG9uZTsgXAotCXJldj0iJCRyZXYgLiI7IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgIHx8IGV2YWwgJCRmYWlsY29tOyBcCi0JZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCiB0YWdzLXJlY3Vyc2l2ZToKIAlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKIAkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0YWdzKTsgXApAQCAtMTI5NCw2ICsxMzk1LDEwIEBACiAJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCiAJICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8ICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY3RhZ3MpOyBcCiAJZG9uZQorY3Njb3BlbGlzdC1yZWN1cnNpdmU6CisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8ICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY3Njb3BlbGlzdCk7IFwKKwlkb25lCiAKIElEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCiAJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKQEAgLTEzNTcsOCArMTQ2MiwzMiBAQAogCSAgJiYgJChhbV9fY2QpICQodG9wX3NyY2RpcikgXAogCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAiJCRoZXJlIgogCitjc2NvcGU6IGNzY29wZS5maWxlcworCXRlc3QgISAtcyBjc2NvcGUuZmlsZXMgXAorCSAgfHwgJChDU0NPUEUpIC1iIC1xICQoQU1fQ1NDT1BFRkxBR1MpICQoQ1NDT1BFRkxBR1MpIC1pIGNzY29wZS5maWxlcyAkKENTQ09QRV9BUkdTKQorCitjbGVhbi1jc2NvcGU6CisJLXJtIC1mIGNzY29wZS5maWxlcworCitjc2NvcGUuZmlsZXM6IGNsZWFuLWNzY29wZSBjc2NvcGVsaXN0LXJlY3Vyc2l2ZSBjc2NvcGVsaXN0CisKK2NzY29wZWxpc3Q6IGNzY29wZWxpc3QtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCknOyBcCisJY2FzZSAiJChzcmNkaXIpIiBpbiBcCisJICBbXFwvXSogfCA/OltcXC9dKikgc2Rpcj0iJChzcmNkaXIpIiA7OyBcCisJICAqKSBzZGlyPSQoc3ViZGlyKS8kKHNyY2RpcikgOzsgXAorCWVzYWM7IFwKKwlmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gXAorCSAgICBlY2hvICIkKHN1YmRpcikvJCRpIjsgXAorCSAgZWxzZSBcCisJICAgIGVjaG8gIiQkc2Rpci8kJGkiOyBcCisJICBmaTsgXAorCWRvbmUgPj4gJCh0b3BfYnVpbGRkaXIpL2NzY29wZS5maWxlcworCiBkaXN0Y2xlYW4tdGFnczoKIAktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncworCS1ybSAtZiBjc2NvcGUub3V0IGNzY29wZS5pbi5vdXQgY3Njb3BlLnBvLm91dCBjc2NvcGUuZmlsZXMKIAogZGlzdGRpcjogJChESVNURklMRVMpCiAJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCkBAIC0xMzk0LDEzICsxNTIzLDEwIEBACiAJZG9uZQogCUBsaXN0PSckKERJU1RfU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAogCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJHN1YmRpciIgXAotCSAgICB8fCAkKE1LRElSX1ApICIkKGRpc3RkaXIpLyQkc3ViZGlyIiBcCi0JICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi0JQGxpc3Q9JyQoRElTVF9TVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAorCSAgICAkKGFtX19tYWtlX2RyeXJ1bikgXAorCSAgICAgIHx8IHRlc3QgLWQgIiQoZGlzdGRpcikvJCRzdWJkaXIiIFwKKwkgICAgICB8fCAkKE1LRElSX1ApICIkKGRpc3RkaXIpLyQkc3ViZGlyIiBcCisJICAgICAgfHwgZXhpdCAxOyBcCiAJICAgIGRpcjE9JCRzdWJkaXI7IGRpcjI9IiQoZGlzdGRpcikvJCRzdWJkaXIiOyBcCiAJICAgICQoYW1fX3JlbGF0aXZpemUpOyBcCiAJICAgIG5ld19kaXN0ZGlyPSQkcmVsZGlyOyBcCkBAIC0xNDI0LDQzICsxNTUwLDQ0IEBACiAJICB0b3BfZGlzdGRpcj0iJCh0b3BfZGlzdGRpcikiIGRpc3RkaXI9IiQoZGlzdGRpcikiIFwKIAkgIGRpc3QtaW5mbwogCS10ZXN0IC1uICIkKGFtX19za2lwX21vZGVfZml4KSIgXAotCXx8IGZpbmQgIiQoZGlzdGRpcikiIC10eXBlIGQgISAtcGVybSAtNzc3IC1leGVjIGNobW9kIGErcnd4IHt9IFw7IC1vIFwKKwl8fCBmaW5kICIkKGRpc3RkaXIpIiAtdHlwZSBkICEgLXBlcm0gLTc1NSBcCisJCS1leGVjIGNobW9kIHUrcnd4LGdvK3J4IHt9IFw7IC1vIFwKIAkgICEgLXR5cGUgZCAhIC1wZXJtIC00NDQgLWxpbmtzIDEgLWV4ZWMgY2htb2QgYStyIHt9IFw7IC1vIFwKIAkgICEgLXR5cGUgZCAhIC1wZXJtIC00MDAgLWV4ZWMgY2htb2QgYStyIHt9IFw7IC1vIFwKIAkgICEgLXR5cGUgZCAhIC1wZXJtIC00NDQgLWV4ZWMgJChpbnN0YWxsX3NoKSAtYyAtbSBhK3Ige30ge30gXDsgXAogCXx8IGNobW9kIC1SIGErciAiJChkaXN0ZGlyKSIKIGRpc3QtZ3ppcDogZGlzdGRpcgogCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikudGFyLmd6Ci0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisJJChhbV9fcG9zdF9yZW1vdmVfZGlzdGRpcikKIAogZGlzdC1iemlwMjogZGlzdGRpcgotCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBiemlwMiAtOSAtYyA+JChkaXN0ZGlyKS50YXIuYnoyCi0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisJdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IEJaSVAyPSQke0JaSVAyLS05fSBiemlwMiAtYyA+JChkaXN0ZGlyKS50YXIuYnoyCisJJChhbV9fcG9zdF9yZW1vdmVfZGlzdGRpcikKIAotZGlzdC1sem1hOiBkaXN0ZGlyCi0JdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IGx6bWEgLTkgLWMgPiQoZGlzdGRpcikudGFyLmx6bWEKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKK2Rpc3QtbHppcDogZGlzdGRpcgorCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBsemlwIC1jICQke0xaSVBfT1BULS05fSA+JChkaXN0ZGlyKS50YXIubHoKKwkkKGFtX19wb3N0X3JlbW92ZV9kaXN0ZGlyKQogCiBkaXN0LXh6OiBkaXN0ZGlyCi0JdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IHh6IC1jID4kKGRpc3RkaXIpLnRhci54egotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBYWl9PUFQ9JCR7WFpfT1BULS1lfSB4eiAtYyA+JChkaXN0ZGlyKS50YXIueHoKKwkkKGFtX19wb3N0X3JlbW92ZV9kaXN0ZGlyKQogCiBkaXN0LXRhclo6IGRpc3RkaXIKIAl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgY29tcHJlc3MgLWMgPiQoZGlzdGRpcikudGFyLloKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKKwkkKGFtX19wb3N0X3JlbW92ZV9kaXN0ZGlyKQogCiBkaXN0LXNoYXI6IGRpc3RkaXIKIAlzaGFyICQoZGlzdGRpcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikuc2hhci5negotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCSQoYW1fX3Bvc3RfcmVtb3ZlX2Rpc3RkaXIpCiAKIGRpc3QtemlwOiBkaXN0ZGlyCiAJLXJtIC1mICQoZGlzdGRpcikuemlwCiAJemlwIC1ycSAkKGRpc3RkaXIpLnppcCAkKGRpc3RkaXIpCi0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisJJChhbV9fcG9zdF9yZW1vdmVfZGlzdGRpcikKIAotZGlzdCBkaXN0LWFsbDogZGlzdGRpcgotCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikudGFyLmd6Ci0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCitkaXN0IGRpc3QtYWxsOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQoRElTVF9UQVJHRVRTKSBhbV9fcG9zdF9yZW1vdmVfZGlzdGRpcj0nQDonCisJJChhbV9fcG9zdF9yZW1vdmVfZGlzdGRpcikKIAogIyBUaGlzIHRhcmdldCB1bnRhcnMgdGhlIGRpc3QgZmlsZSBhbmQgdHJpZXMgYSBWUEFUSCBjb25maWd1cmF0aW9uLiAgVGhlbgogIyBpdCBndWFyYW50ZWVzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBpcyBzZWxmLWNvbnRhaW5lZCBieSBtYWtpbmcgYW5vdGhlcgpAQCAtMTQ2OCwyMSArMTU5NSwyMSBAQAogZGlzdGNoZWNrOiBkaXN0CiAJY2FzZSAnJChESVNUX0FSQ0hJVkVTKScgaW4gXAogCSoudGFyLmd6KikgXAotCSAgR1pJUD0kKEdaSVBfRU5WKSBndW56aXAgLWMgJChkaXN0ZGlyKS50YXIuZ3ogfCAkKGFtX191bnRhcikgOztcCisJICBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWRjICQoZGlzdGRpcikudGFyLmd6IHwgJChhbV9fdW50YXIpIDs7XAogCSoudGFyLmJ6MiopIFwKLQkgIGJ1bnppcDIgLWMgJChkaXN0ZGlyKS50YXIuYnoyIHwgJChhbV9fdW50YXIpIDs7XAotCSoudGFyLmx6bWEqKSBcCi0JICB1bmx6bWEgLWMgJChkaXN0ZGlyKS50YXIubHptYSB8ICQoYW1fX3VudGFyKSA7O1wKKwkgIGJ6aXAyIC1kYyAkKGRpc3RkaXIpLnRhci5iejIgfCAkKGFtX191bnRhcikgOztcCisJKi50YXIubHoqKSBcCisJICBsemlwIC1kYyAkKGRpc3RkaXIpLnRhci5seiB8ICQoYW1fX3VudGFyKSA7O1wKIAkqLnRhci54eiopIFwKIAkgIHh6IC1kYyAkKGRpc3RkaXIpLnRhci54eiB8ICQoYW1fX3VudGFyKSA7O1wKIAkqLnRhci5aKikgXAogCSAgdW5jb21wcmVzcyAtYyAkKGRpc3RkaXIpLnRhci5aIHwgJChhbV9fdW50YXIpIDs7XAogCSouc2hhci5neiopIFwKLQkgIEdaSVA9JChHWklQX0VOVikgZ3VuemlwIC1jICQoZGlzdGRpcikuc2hhci5neiB8IHVuc2hhciA7O1wKKwkgIEdaSVA9JChHWklQX0VOVikgZ3ppcCAtZGMgJChkaXN0ZGlyKS5zaGFyLmd6IHwgdW5zaGFyIDs7XAogCSouemlwKikgXAogCSAgdW56aXAgJChkaXN0ZGlyKS56aXAgOztcCiAJZXNhYwotCWNobW9kIC1SIGEtdyAkKGRpc3RkaXIpOyBjaG1vZCBhK3cgJChkaXN0ZGlyKQorCWNobW9kIC1SIGEtdyAkKGRpc3RkaXIpOyBjaG1vZCB1K3cgJChkaXN0ZGlyKQogCW1rZGlyICQoZGlzdGRpcikvX2J1aWxkCiAJbWtkaXIgJChkaXN0ZGlyKS9faW5zdAogCWNobW9kIGEtdyAkKGRpc3RkaXIpCkBAIC0xNDkyLDYgKzE2MTksNyBAQAogCSAgJiYgYW1fX2N3ZD1gcHdkYCBcCiAJICAmJiAkKGFtX19jZCkgJChkaXN0ZGlyKS9fYnVpbGQgXAogCSAgJiYgLi4vY29uZmlndXJlIC0tc3JjZGlyPS4uIC0tcHJlZml4PSIkJGRjX2luc3RhbGxfYmFzZSIgXAorCSAgICAkKEFNX0RJU1RDSEVDS19DT05GSUdVUkVfRkxBR1MpIFwKIAkgICAgJChESVNUQ0hFQ0tfQ09ORklHVVJFX0ZMQUdTKSBcCiAJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCiAJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkdmkgXApAQCAtMTUxNSwxMyArMTY0MywyMSBAQAogCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdGNsZWFuY2hlY2sgXAogCSAgJiYgY2QgIiQkYW1fX2N3ZCIgXAogCSAgfHwgZXhpdCAxCi0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisJJChhbV9fcG9zdF9yZW1vdmVfZGlzdGRpcikKIAlAKGVjaG8gIiQoZGlzdGRpcikgYXJjaGl2ZXMgcmVhZHkgZm9yIGRpc3RyaWJ1dGlvbjogIjsgXAogCSAgbGlzdD0nJChESVNUX0FSQ0hJVkVTKSc7IGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUpIHwgXAogCSAgc2VkIC1lIDFoIC1lIDFzLy4vPS9nIC1lIDFwIC1lIDF4IC1lICckJHAnIC1lICckJHgnCiBkaXN0dW5pbnN0YWxsY2hlY2s6Ci0JQCQoYW1fX2NkKSAnJChkaXN0dW5pbnN0YWxsY2hlY2tfZGlyKScgXAotCSYmIHRlc3QgYCQoZGlzdHVuaW5zdGFsbGNoZWNrX2xpc3RmaWxlcykgfCB3YyAtbGAgLWxlIDEgXAorCUB0ZXN0IC1uICckKGRpc3R1bmluc3RhbGxjaGVja19kaXIpJyB8fCB7IFwKKwkgIGVjaG8gJ0VSUk9SOiB0cnlpbmcgdG8gcnVuICRAIHdpdGggYW4gZW1wdHknIFwKKwkgICAgICAgJyQkKGRpc3R1bmluc3RhbGxjaGVja19kaXIpJyA+JjI7IFwKKwkgIGV4aXQgMTsgXAorCX07IFwKKwkkKGFtX19jZCkgJyQoZGlzdHVuaW5zdGFsbGNoZWNrX2RpciknIHx8IHsgXAorCSAgZWNobyAnRVJST1I6IGNhbm5vdCBjaGRpciBpbnRvICQoZGlzdHVuaW5zdGFsbGNoZWNrX2RpciknID4mMjsgXAorCSAgZXhpdCAxOyBcCisJfTsgXAorCXRlc3QgYCQoYW1fX2Rpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMpIHwgd2MgLWxgIC1lcSAwIFwKIAkgICB8fCB7IGVjaG8gIkVSUk9SOiBmaWxlcyBsZWZ0IGFmdGVyIHVuaW5zdGFsbDoiIDsgXAogCSAgICAgICAgaWYgdGVzdCAtbiAiJChERVNURElSKSI7IHRoZW4gXAogCSAgICAgICAgICBlY2hvICIgIChjaGVjayBERVNURElSIHN1cHBvcnQpIjsgXApAQCAtMTU0Miw3ICsxNjc4LDcgQEAKIGFsbC1hbTogTWFrZWZpbGUgJChJTkZPX0RFUFMpICQoTFRMSUJSQVJJRVMpICQoREFUQSkgZmZpY29uZmlnLmgKIGluc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKIGluc3RhbGxkaXJzLWFtOgotCWZvciBkaXIgaW4gIiQoREVTVERJUikkKGxpYmRpcikiICIkKERFU1RESVIpJChpbmZvZGlyKSIgIiQoREVTVERJUikkKHBrZ2NvbmZpZ2RpcikiOyBkbyBcCisJZm9yIGRpciBpbiAiJChERVNURElSKSQodG9vbGV4ZWNsaWJkaXIpIiAiJChERVNURElSKSQoaW5mb2RpcikiICIkKERFU1RESVIpJChwa2djb25maWdkaXIpIjsgZG8gXAogCSAgdGVzdCAteiAiJCRkaXIiIHx8ICQoTUtESVJfUCkgIiQkZGlyIjsgXAogCWRvbmUKIGluc3RhbGw6IGluc3RhbGwtcmVjdXJzaXZlCkBAIC0xNTU1LDEwICsxNjkxLDE1IEBACiAKIGluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQogaW5zdGFsbC1zdHJpcDoKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCi0JICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKLQkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKKwlpZiB0ZXN0IC16ICckKFNUUklQKSc7IHRoZW4gXAorCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgICAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICAgICAgaW5zdGFsbDsgXAorCWVsc2UgXAorCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgICAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICAgICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknIiBpbnN0YWxsOyBcCisJZmkKIG1vc3RseWNsZWFuLWdlbmVyaWM6CiAKIGNsZWFuLWdlbmVyaWM6CkBAIC0xNTY5LDEyICsxNzEwLDE2IEBACiAJLXJtIC1mIGRvYy8kKGFtX19kaXJzdGFtcCkKIAktcm0gLWYgc3JjLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKIAktcm0gLWYgc3JjLyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBzcmMvYWFyY2g2NC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHNyYy9hYXJjaDY0LyQoYW1fX2RpcnN0YW1wKQogCS1ybSAtZiBzcmMvYWxwaGEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQogCS1ybSAtZiBzcmMvYWxwaGEvJChhbV9fZGlyc3RhbXApCiAJLXJtIC1mIHNyYy9hcm0vJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQogCS1ybSAtZiBzcmMvYXJtLyQoYW1fX2RpcnN0YW1wKQogCS1ybSAtZiBzcmMvYXZyMzIvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQogCS1ybSAtZiBzcmMvYXZyMzIvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHNyYy9iZmluLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgc3JjL2JmaW4vJChhbV9fZGlyc3RhbXApCiAJLXJtIC1mIHNyYy9jcmlzLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKIAktcm0gLWYgc3JjL2NyaXMvJChhbV9fZGlyc3RhbXApCiAJLXJtIC1mIHNyYy9mcnYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQpAQCAtMTU4NSw4ICsxNzMwLDE0IEBACiAJLXJtIC1mIHNyYy9tMzJyLyQoYW1fX2RpcnN0YW1wKQogCS1ybSAtZiBzcmMvbTY4ay8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCiAJLXJtIC1mIHNyYy9tNjhrLyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBzcmMvbWV0YWcvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBzcmMvbWV0YWcvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHNyYy9taWNyb2JsYXplLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgc3JjL21pY3JvYmxhemUvJChhbV9fZGlyc3RhbXApCiAJLXJtIC1mIHNyYy9taXBzLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKIAktcm0gLWYgc3JjL21pcHMvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHNyYy9tb3hpZS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHNyYy9tb3hpZS8kKGFtX19kaXJzdGFtcCkKIAktcm0gLWYgc3JjL3BhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKIAktcm0gLWYgc3JjL3BhLyQoYW1fX2RpcnN0YW1wKQogCS1ybSAtZiBzcmMvcG93ZXJwYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCkBAIC0xNTk5LDIwICsxNzUwLDI1IEBACiAJLXJtIC1mIHNyYy9zaDY0LyQoYW1fX2RpcnN0YW1wKQogCS1ybSAtZiBzcmMvc3BhcmMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQogCS1ybSAtZiBzcmMvc3BhcmMvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHNyYy90aWxlLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgc3JjL3RpbGUvJChhbV9fZGlyc3RhbXApCiAJLXJtIC1mIHNyYy94ODYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQogCS1ybSAtZiBzcmMveDg2LyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBzcmMveHRlbnNhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgc3JjL3h0ZW5zYS8kKGFtX19kaXJzdGFtcCkKIAogbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgogCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKIAlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCiBjbGVhbjogY2xlYW4tcmVjdXJzaXZlCiAKLWNsZWFuLWFtOiBjbGVhbi1hbWluZm8gY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJMVExJQlJBUklFUyBcCi0JY2xlYW4tbGlidG9vbCBjbGVhbi1ub2luc3RMVExJQlJBUklFUyBtb3N0bHljbGVhbi1hbQorY2xlYW4tYW06IGNsZWFuLWFtaW5mbyBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgXAorCWNsZWFuLW5vaW5zdExUTElCUkFSSUVTIGNsZWFuLXRvb2xleGVjbGliTFRMSUJSQVJJRVMgXAorCW1vc3RseWNsZWFuLWFtCiAKIGRpc3RjbGVhbjogZGlzdGNsZWFuLXJlY3Vyc2l2ZQogCS1ybSAtZiAkKGFtX19DT05GSUdfRElTVENMRUFOX0ZJTEVTKQotCS1ybSAtcmYgc3JjLyQoREVQRElSKSBzcmMvYWxwaGEvJChERVBESVIpIHNyYy9hcm0vJChERVBESVIpIHNyYy9hdnIzMi8kKERFUERJUikgc3JjL2NyaXMvJChERVBESVIpIHNyYy9mcnYvJChERVBESVIpIHNyYy9pYTY0LyQoREVQRElSKSBzcmMvbTMyci8kKERFUERJUikgc3JjL202OGsvJChERVBESVIpIHNyYy9taXBzLyQoREVQRElSKSBzcmMvcGEvJChERVBESVIpIHNyYy9wb3dlcnBjLyQoREVQRElSKSBzcmMvczM5MC8kKERFUERJUikgc3JjL3NoLyQoREVQRElSKSBzcmMvc2g2NC8kKERFUERJUikgc3JjL3NwYXJjLyQoREVQRElSKSBzcmMveDg2LyQoREVQRElSKQorCS1ybSAtcmYgc3JjLyQoREVQRElSKSBzcmMvYWFyY2g2NC8kKERFUERJUikgc3JjL2FscGhhLyQoREVQRElSKSBzcmMvYXJtLyQoREVQRElSKSBzcmMvYXZyMzIvJChERVBESVIpIHNyYy9iZmluLyQoREVQRElSKSBzcmMvY3Jpcy8kKERFUERJUikgc3JjL2Zydi8kKERFUERJUikgc3JjL2lhNjQvJChERVBESVIpIHNyYy9tMzJyLyQoREVQRElSKSBzcmMvbTY4ay8kKERFUERJUikgc3JjL21ldGFnLyQoREVQRElSKSBzcmMvbWljcm9ibGF6ZS8kKERFUERJUikgc3JjL21pcHMvJChERVBESVIpIHNyYy9tb3hpZS8kKERFUERJUikgc3JjL3BhLyQoREVQRElSKSBzcmMvcG93ZXJwYy8kKERFUERJUikgc3JjL3MzOTAvJChERVBESVIpIHNyYy9zaC8kKERFUERJUikgc3JjL3NoNjQvJChERVBESVIpIHNyYy9zcGFyYy8kKERFUERJUikgc3JjL3RpbGUvJChERVBESVIpIHNyYy94ODYvJChERVBESVIpIHNyYy94dGVuc2EvJChERVBESVIpCiAJLXJtIC1mIE1ha2VmaWxlCiBkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKIAlkaXN0Y2xlYW4taGRyIGRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzCkBAIC0xNjM1LDggKzE3OTEsMTEgQEAKIAogaW5zdGFsbC1kdmktYW06ICQoRFZJUykKIAlAJChOT1JNQUxfSU5TVEFMTCkKLQl0ZXN0IC16ICIkKGR2aWRpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKGR2aWRpcikiCiAJQGxpc3Q9JyQoRFZJUyknOyB0ZXN0IC1uICIkKGR2aWRpcikiIHx8IGxpc3Q9OyBcCisJaWYgdGVzdCAtbiAiJCRsaXN0IjsgdGhlbiBcCisJICBlY2hvICIgJChNS0RJUl9QKSAnJChERVNURElSKSQoZHZpZGlyKSciOyBcCisJICAkKE1LRElSX1ApICIkKERFU1RESVIpJChkdmlkaXIpIiB8fCBleGl0IDE7IFwKKwlmaTsgXAogCWZvciBwIGluICQkbGlzdDsgZG8gXAogCSAgaWYgdGVzdCAtZiAiJCRwIjsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKIAkgIGVjaG8gIiQkZCQkcCI7IFwKQEAgLTE2NDUsMjIgKzE4MDQsMjggQEAKIAkgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAnJChERVNURElSKSQoZHZpZGlyKSciOyBcCiAJICAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAiJChERVNURElSKSQoZHZpZGlyKSIgfHwgZXhpdCAkJD87IFwKIAlkb25lCi1pbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtbGliTFRMSUJSQVJJRVMKK2luc3RhbGwtZXhlYy1hbTogaW5zdGFsbC10b29sZXhlY2xpYkxUTElCUkFSSUVTCisKK2luc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLXJlY3Vyc2l2ZQogCiBpbnN0YWxsLWh0bWwtYW06ICQoSFRNTFMpCiAJQCQoTk9STUFMX0lOU1RBTEwpCi0JdGVzdCAteiAiJChodG1sZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQoaHRtbGRpcikiCiAJQGxpc3Q9JyQoSFRNTFMpJzsgbGlzdDI9OyB0ZXN0IC1uICIkKGh0bWxkaXIpIiB8fCBsaXN0PTsgXAorCWlmIHRlc3QgLW4gIiQkbGlzdCI7IHRoZW4gXAorCSAgZWNobyAiICQoTUtESVJfUCkgJyQoREVTVERJUikkKGh0bWxkaXIpJyI7IFwKKwkgICQoTUtESVJfUCkgIiQoREVTVERJUikkKGh0bWxkaXIpIiB8fCBleGl0IDE7IFwKKwlmaTsgXAogCWZvciBwIGluICQkbGlzdDsgZG8gXAogCSAgaWYgdGVzdCAtZiAiJCRwIiB8fCB0ZXN0IC1kICIkJHAiOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAogCSAgJChhbV9fc3RyaXBfZGlyKSBcCi0JICBpZiB0ZXN0IC1kICIkJGQkJHAiOyB0aGVuIFwKKwkgIGQyPSQkZCQkcDsgXAorCSAgaWYgdGVzdCAtZCAiJCRkMiI7IHRoZW4gXAogCSAgICBlY2hvICIgJChNS0RJUl9QKSAnJChERVNURElSKSQoaHRtbGRpcikvJCRmJyI7IFwKIAkgICAgJChNS0RJUl9QKSAiJChERVNURElSKSQoaHRtbGRpcikvJCRmIiB8fCBleGl0IDE7IFwKLQkgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAnJCRkJCRwJy8qICckKERFU1RESVIpJChodG1sZGlyKS8kJGYnIjsgXAotCSAgICAkKElOU1RBTExfREFUQSkgIiQkZCQkcCIvKiAiJChERVNURElSKSQoaHRtbGRpcikvJCRmIiB8fCBleGl0ICQkPzsgXAorCSAgICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICckJGQyJy8qICckKERFU1RESVIpJChodG1sZGlyKS8kJGYnIjsgXAorCSAgICAkKElOU1RBTExfREFUQSkgIiQkZDIiLyogIiQoREVTVERJUikkKGh0bWxkaXIpLyQkZiIgfHwgZXhpdCAkJD87IFwKIAkgIGVsc2UgXAotCSAgICBsaXN0Mj0iJCRsaXN0MiAkJGQkJHAiOyBcCisJICAgIGxpc3QyPSIkJGxpc3QyICQkZDIiOyBcCiAJICBmaTsgXAogCWRvbmU7IFwKIAl0ZXN0IC16ICIkJGxpc3QyIiB8fCB7IGVjaG8gIiQkbGlzdDIiIHwgJChhbV9fYmFzZV9saXN0KSB8IFwKQEAgLTE2NzIsOSArMTgzNywxMiBAQAogCiBpbnN0YWxsLWluZm8tYW06ICQoSU5GT19ERVBTKQogCUAkKE5PUk1BTF9JTlNUQUxMKQotCXRlc3QgLXogIiQoaW5mb2RpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKGluZm9kaXIpIgogCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAnc3wufC58ZydgOyBcCiAJbGlzdD0nJChJTkZPX0RFUFMpJzsgdGVzdCAtbiAiJChpbmZvZGlyKSIgfHwgbGlzdD07IFwKKwlpZiB0ZXN0IC1uICIkJGxpc3QiOyB0aGVuIFwKKwkgIGVjaG8gIiAkKE1LRElSX1ApICckKERFU1RESVIpJChpbmZvZGlyKSciOyBcCisJICAkKE1LRElSX1ApICIkKERFU1RESVIpJChpbmZvZGlyKSIgfHwgZXhpdCAxOyBcCisJZmk7IFwKIAlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKIAkgIGNhc2UgJCRmaWxlIGluIFwKIAkgICAgJChzcmNkaXIpLyopIGZpbGU9YGVjaG8gIiQkZmlsZSIgfCBzZWQgInN8XiQkc3JjZGlyc3RyaXAvfHwiYDs7IFwKQEAgLTE2OTIsOCArMTg2MCw3IEBACiAJICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgJyQoREVTVERJUikkKGluZm9kaXIpJyI7IFwKIAkgICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICIkKERFU1RESVIpJChpbmZvZGlyKSIgfHwgZXhpdCAkJD87IGRvbmUKIAlAJChQT1NUX0lOU1RBTEwpCi0JQGlmIChpbnN0YWxsLWluZm8gLS12ZXJzaW9uICYmIFwKLQkgICAgIGluc3RhbGwtaW5mbyAtLXZlcnNpb24gMj4mMSB8IHNlZCAxcSB8IGdyZXAgLWkgLXYgZGViaWFuKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAorCUBpZiAkKGFtX19jYW5fcnVuX2luc3RhbGxpbmZvKTsgdGhlbiBcCiAJICBsaXN0PSckKElORk9fREVQUyknOyB0ZXN0IC1uICIkKGluZm9kaXIpIiB8fCBsaXN0PTsgXAogCSAgZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCiAJICAgIHJlbGZpbGU9YGVjaG8gIiQkZmlsZSIgfCBzZWQgJ3N8Xi4qL3x8J2A7IFwKQEAgLTE3MDMsMTAgKzE4NzAsMTUgQEAKIAllbHNlIDogOyBmaQogaW5zdGFsbC1tYW46CiAKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1yZWN1cnNpdmUKKwogaW5zdGFsbC1wZGYtYW06ICQoUERGUykKIAlAJChOT1JNQUxfSU5TVEFMTCkKLQl0ZXN0IC16ICIkKHBkZmRpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKHBkZmRpcikiCiAJQGxpc3Q9JyQoUERGUyknOyB0ZXN0IC1uICIkKHBkZmRpcikiIHx8IGxpc3Q9OyBcCisJaWYgdGVzdCAtbiAiJCRsaXN0IjsgdGhlbiBcCisJICBlY2hvICIgJChNS0RJUl9QKSAnJChERVNURElSKSQocGRmZGlyKSciOyBcCisJICAkKE1LRElSX1ApICIkKERFU1RESVIpJChwZGZkaXIpIiB8fCBleGl0IDE7IFwKKwlmaTsgXAogCWZvciBwIGluICQkbGlzdDsgZG8gXAogCSAgaWYgdGVzdCAtZiAiJCRwIjsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKIAkgIGVjaG8gIiQkZCQkcCI7IFwKQEAgLTE3MTgsOCArMTg5MCwxMSBAQAogCiBpbnN0YWxsLXBzLWFtOiAkKFBTUykKIAlAJChOT1JNQUxfSU5TVEFMTCkKLQl0ZXN0IC16ICIkKHBzZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQocHNkaXIpIgogCUBsaXN0PSckKFBTUyknOyB0ZXN0IC1uICIkKHBzZGlyKSIgfHwgbGlzdD07IFwKKwlpZiB0ZXN0IC1uICIkJGxpc3QiOyB0aGVuIFwKKwkgIGVjaG8gIiAkKE1LRElSX1ApICckKERFU1RESVIpJChwc2RpciknIjsgXAorCSAgJChNS0RJUl9QKSAiJChERVNURElSKSQocHNkaXIpIiB8fCBleGl0IDE7IFwKKwlmaTsgXAogCWZvciBwIGluICQkbGlzdDsgZG8gXAogCSAgaWYgdGVzdCAtZiAiJCRwIjsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKIAkgIGVjaG8gIiQkZCQkcCI7IFwKQEAgLTE3MzIsNyArMTkwNyw3IEBACiBtYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQogCS1ybSAtZiAkKGFtX19DT05GSUdfRElTVENMRUFOX0ZJTEVTKQogCS1ybSAtcmYgJCh0b3Bfc3JjZGlyKS9hdXRvbTR0ZS5jYWNoZQotCS1ybSAtcmYgc3JjLyQoREVQRElSKSBzcmMvYWxwaGEvJChERVBESVIpIHNyYy9hcm0vJChERVBESVIpIHNyYy9hdnIzMi8kKERFUERJUikgc3JjL2NyaXMvJChERVBESVIpIHNyYy9mcnYvJChERVBESVIpIHNyYy9pYTY0LyQoREVQRElSKSBzcmMvbTMyci8kKERFUERJUikgc3JjL202OGsvJChERVBESVIpIHNyYy9taXBzLyQoREVQRElSKSBzcmMvcGEvJChERVBESVIpIHNyYy9wb3dlcnBjLyQoREVQRElSKSBzcmMvczM5MC8kKERFUERJUikgc3JjL3NoLyQoREVQRElSKSBzcmMvc2g2NC8kKERFUERJUikgc3JjL3NwYXJjLyQoREVQRElSKSBzcmMveDg2LyQoREVQRElSKQorCS1ybSAtcmYgc3JjLyQoREVQRElSKSBzcmMvYWFyY2g2NC8kKERFUERJUikgc3JjL2FscGhhLyQoREVQRElSKSBzcmMvYXJtLyQoREVQRElSKSBzcmMvYXZyMzIvJChERVBESVIpIHNyYy9iZmluLyQoREVQRElSKSBzcmMvY3Jpcy8kKERFUERJUikgc3JjL2Zydi8kKERFUERJUikgc3JjL2lhNjQvJChERVBESVIpIHNyYy9tMzJyLyQoREVQRElSKSBzcmMvbTY4ay8kKERFUERJUikgc3JjL21ldGFnLyQoREVQRElSKSBzcmMvbWljcm9ibGF6ZS8kKERFUERJUikgc3JjL21pcHMvJChERVBESVIpIHNyYy9tb3hpZS8kKERFUERJUikgc3JjL3BhLyQoREVQRElSKSBzcmMvcG93ZXJwYy8kKERFUERJUikgc3JjL3MzOTAvJChERVBESVIpIHNyYy9zaC8kKERFUERJUikgc3JjL3NoNjQvJChERVBESVIpIHNyYy9zcGFyYy8kKERFUERJUikgc3JjL3RpbGUvJChERVBESVIpIHNyYy94ODYvJChERVBESVIpIHNyYy94dGVuc2EvJChERVBESVIpCiAJLXJtIC1mIE1ha2VmaWxlCiBtYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1hbWluZm8gXAogCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtYWludGFpbmVyLWNsZWFuLXZ0aQpAQCAtMTc1MSw0MSArMTkyNiwzOSBAQAogcHMtYW06ICQoUFNTKQogCiB1bmluc3RhbGwtYW06IHVuaW5zdGFsbC1kdmktYW0gdW5pbnN0YWxsLWh0bWwtYW0gdW5pbnN0YWxsLWluZm8tYW0gXAotCXVuaW5zdGFsbC1saWJMVExJQlJBUklFUyB1bmluc3RhbGwtcGRmLWFtIFwKLQl1bmluc3RhbGwtcGtnY29uZmlnREFUQSB1bmluc3RhbGwtcHMtYW0KKwl1bmluc3RhbGwtcGRmLWFtIHVuaW5zdGFsbC1wa2djb25maWdEQVRBIHVuaW5zdGFsbC1wcy1hbSBcCisJdW5pbnN0YWxsLXRvb2xleGVjbGliTFRMSUJSQVJJRVMKIAogLk1BS0U6ICQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpICQoUkVDVVJTSVZFX1RBUkdFVFMpIGFsbCBcCi0JY3RhZ3MtcmVjdXJzaXZlIGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcCB0YWdzLXJlY3Vyc2l2ZQorCWNzY29wZWxpc3QtcmVjdXJzaXZlIGN0YWdzLXJlY3Vyc2l2ZSBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAgXAorCXRhZ3MtcmVjdXJzaXZlCiAKIC5QSE9OWTogJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUykgJChSRUNVUlNJVkVfVEFSR0VUUykgQ1RBR1MgR1RBR1MgXAogCWFsbCBhbGwtYW0gYW0tLXJlZnJlc2ggY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tYW1pbmZvIFwKLQljbGVhbi1nZW5lcmljIGNsZWFuLWxpYkxUTElCUkFSSUVTIGNsZWFuLWxpYnRvb2wgXAotCWNsZWFuLW5vaW5zdExUTElCUkFSSUVTIGN0YWdzIGN0YWdzLXJlY3Vyc2l2ZSBkaXN0IGRpc3QtYWxsIFwKLQlkaXN0LWJ6aXAyIGRpc3QtZ3ppcCBkaXN0LWluZm8gZGlzdC1sem1hIGRpc3Qtc2hhciBkaXN0LXRhclogXAotCWRpc3QteHogZGlzdC16aXAgZGlzdGNoZWNrIGRpc3RjbGVhbiBkaXN0Y2xlYW4tY29tcGlsZSBcCi0JZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWhkciBkaXN0Y2xlYW4tbGlidG9vbCBcCi0JZGlzdGNsZWFuLXRhZ3MgZGlzdGNsZWFuY2hlY2sgZGlzdGRpciBkaXN0dW5pbnN0YWxsY2hlY2sgZHZpIFwKLQlkdmktYW0gaHRtbCBodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gXAotCWluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gXAotCWluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBcCi0JaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBpbnN0YWxsLWxpYkxUTElCUkFSSUVTIFwKLQlpbnN0YWxsLW1hbiBpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBrZ2NvbmZpZ0RBVEEgXAotCWluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBcCi0JaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIGluc3RhbGxkaXJzLWFtIG1haW50YWluZXItY2xlYW4gXAotCW1haW50YWluZXItY2xlYW4tYW1pbmZvIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBcCi0JbWFpbnRhaW5lci1jbGVhbi12dGkgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tYW1pbmZvIFwKLQltb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbCBcCi0JbW9zdGx5Y2xlYW4tdnRpIHBkZiBwZGYtYW0gcHMgcHMtYW0gdGFncyB0YWdzLXJlY3Vyc2l2ZSBcCi0JdW5pbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwtZHZpLWFtIHVuaW5zdGFsbC1odG1sLWFtIFwKLQl1bmluc3RhbGwtaW5mby1hbSB1bmluc3RhbGwtbGliTFRMSUJSQVJJRVMgdW5pbnN0YWxsLXBkZi1hbSBcCi0JdW5pbnN0YWxsLXBrZ2NvbmZpZ0RBVEEgdW5pbnN0YWxsLXBzLWFtCisJY2xlYW4tY3Njb3BlIGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBcCisJY2xlYW4tbm9pbnN0TFRMSUJSQVJJRVMgY2xlYW4tdG9vbGV4ZWNsaWJMVExJQlJBUklFUyBjc2NvcGUgXAorCWNzY29wZWxpc3QgY3Njb3BlbGlzdC1yZWN1cnNpdmUgY3RhZ3MgY3RhZ3MtcmVjdXJzaXZlIGRpc3QgXAorCWRpc3QtYWxsIGRpc3QtYnppcDIgZGlzdC1nemlwIGRpc3QtaW5mbyBkaXN0LWx6aXAgZGlzdC1zaGFyIFwKKwlkaXN0LXRhclogZGlzdC14eiBkaXN0LXppcCBkaXN0Y2hlY2sgZGlzdGNsZWFuIFwKKwlkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4taGRyIFwKKwlkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tdGFncyBkaXN0Y2xlYW5jaGVjayBkaXN0ZGlyIFwKKwlkaXN0dW5pbnN0YWxsY2hlY2sgZHZpIGR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIFwKKwlpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBcCisJaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgXAorCWluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIFwKKwlpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBrZ2NvbmZpZ0RBVEEgaW5zdGFsbC1wcyBcCisJaW5zdGFsbC1wcy1hbSBpbnN0YWxsLXN0cmlwIGluc3RhbGwtdG9vbGV4ZWNsaWJMVExJQlJBUklFUyBcCisJaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBpbnN0YWxsZGlycy1hbSBcCisJbWFpbnRhaW5lci1jbGVhbiBtYWludGFpbmVyLWNsZWFuLWFtaW5mbyBcCisJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1haW50YWluZXItY2xlYW4tdnRpIG1vc3RseWNsZWFuIFwKKwltb3N0bHljbGVhbi1hbWluZm8gbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIFwKKwltb3N0bHljbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLXZ0aSBwZGYgcGRmLWFtIHBzIHBzLWFtIHRhZ3MgXAorCXRhZ3MtcmVjdXJzaXZlIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsLWR2aS1hbSBcCisJdW5pbnN0YWxsLWh0bWwtYW0gdW5pbnN0YWxsLWluZm8tYW0gdW5pbnN0YWxsLXBkZi1hbSBcCisJdW5pbnN0YWxsLXBrZ2NvbmZpZ0RBVEEgdW5pbnN0YWxsLXBzLWFtIFwKKwl1bmluc3RhbGwtdG9vbGV4ZWNsaWJMVExJQlJBUklFUwogCiAKLSMgTm8gaW5zdGFsbC1odG1sIG9yIGluc3RhbGwtcGRmIHN1cHBvcnQgaW4gYXV0b21ha2UgeWV0Ci0uUEhPTlk6IGluc3RhbGwtaHRtbCBpbnN0YWxsLXBkZgotaW5zdGFsbC1odG1sOgotaW5zdGFsbC1wZGY6Ci0KICMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCiAjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KIC5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvUkVBRE1FIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9SRUFETUUKaW5kZXggMTY3ZGU0Mi4uMTkxNTZmZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9SRUFETUUKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9SRUFETUUKQEAgLTEsNyArMSw3IEBACiBTdGF0dXMKID09PT09PQogCi1saWJmZmktMy4wLjEwIHdhcyByZWxlYXNlZCBvbiBYWFhYWFhYWFhYLCAyMDEwLiBDaGVjayB0aGUgbGliZmZpIHdlYgorbGliZmZpLTMuMC4xMyB3YXMgcmVsZWFzZWQgb24gTWFyY2ggMTcsIDIwMTMuICBDaGVjayB0aGUgbGliZmZpIHdlYgogcGFnZSBmb3IgdXBkYXRlczogPFVSTDpodHRwOi8vc291cmNld2FyZS5vcmcvbGliZmZpLz4uCiAKIApAQCAtNDMsNDYgKzQzLDcwIEBACiBGb3Igc3BlY2lmaWMgY29uZmlndXJhdGlvbiBkZXRhaWxzIGFuZCB0ZXN0aW5nIHN0YXR1cywgcGxlYXNlCiByZWZlciB0byB0aGUgd2lraSBwYWdlIGhlcmU6CiAKLSBodHRwOi8vd3d3Lm1veGllbG9naWMub3JnL3dpa2kvaW5kZXgucGhwP3RpdGxlPUxpYmZmaV8zLjAuMTAKKyBodHRwOi8vd3d3Lm1veGllbG9naWMub3JnL3dpa2kvaW5kZXgucGhwP3RpdGxlPUxpYmZmaV8zLjAuMTMKIAogQXQgdGhlIHRpbWUgb2YgcmVsZWFzZSwgdGhlIGZvbGxvd2luZyBiYXNpYyBjb25maWd1cmF0aW9ucyBoYXZlIGJlZW4KIHRlc3RlZDoKIAotfC0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLXwKLXwgQXJjaGl0ZWN0dXJlIHwgT3BlcmF0aW5nIFN5c3RlbSB8Ci18LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tfAotfCBBbHBoYSAgICAgICAgfCBMaW51eCAgICAgICAgICAgIHwKLXwgQWxwaGEgICAgICAgIHwgVHJ1NjQgICAgICAgICAgICB8Ci18IEFSTSAgICAgICAgICB8IExpbnV4ICAgICAgICAgICAgfAotfCBBVlIzMiAgICAgICAgfCBMaW51eCAgICAgICAgICAgIHwKLXwgSFBQQSAgICAgICAgIHwgSFBVWCAgICAgICAgICAgICB8Ci18IElBLTY0ICAgICAgICB8IExpbnV4ICAgICAgICAgICAgfAotfCBNSVBTICAgICAgICAgfCBJUklYICAgICAgICAgICAgIHwKLXwgTUlQUyAgICAgICAgIHwgTGludXggICAgICAgICAgICB8Ci18IE1JUFM2NCAgICAgICB8IExpbnV4ICAgICAgICAgICAgfAotfCBQb3dlclBDICAgICAgfCBMaW51eCAgICAgICAgICAgIHwKLXwgUG93ZXJQQyAgICAgIHwgTWFjIE9TWCAgICAgICAgICB8Ci18IFBvd2VyUEMgICAgICB8IEZyZWVCU0QgICAgICAgICAgfAotfCBQb3dlclBDNjQgICAgfCBMaW51eCAgICAgICAgICAgIHwKLXwgUzM5MCAgICAgICAgIHwgTGludXggICAgICAgICAgICB8Ci18IFMzOTBYICAgICAgICB8IExpbnV4ICAgICAgICAgICAgfAotfCBTUEFSQyAgICAgICAgfCBMaW51eCAgICAgICAgICAgIHwKLXwgU1BBUkMgICAgICAgIHwgU29sYXJpcyAgICAgICAgICB8Ci18IFNQQVJDNjQgICAgICB8IExpbnV4ICAgICAgICAgICAgfAotfCBTUEFSQzY0ICAgICAgfCBGcmVlQlNEICAgICAgICAgIHwKLXwgWDg2ICAgICAgICAgIHwgRnJlZUJTRCAgICAgICAgICB8Ci18IFg4NiAgICAgICAgICB8IGtGcmVlQlNEICAgICAgICAgfAotfCBYODYgICAgICAgICAgfCBMaW51eCAgICAgICAgICAgIHwKLXwgWDg2ICAgICAgICAgIHwgTWFjIE9TWCAgICAgICAgICB8Ci18IFg4NiAgICAgICAgICB8IE9wZW5CU0QgICAgICAgICAgfAotfCBYODYgICAgICAgICAgfCBTb2xhcmlzICAgICAgICAgIHwKLXwgWDg2ICAgICAgICAgIHwgV2luZG93cy9DeWd3aW4gICB8Ci18IFg4NiAgICAgICAgICB8IFdpbmRvd3MvTWluZ1cgICAgfAotfCBYODYtNjQgICAgICAgfCBGcmVlQlNEICAgICAgICAgIHwKLXwgWDg2LTY0ICAgICAgIHwgTGludXggICAgICAgICAgICB8Ci18IFg4Ni02NCAgICAgICB8IE9wZW5CU0QgICAgICAgICAgfAotfCBYODYtNjQgICAgICAgfCBXaW5kb3dzL01pbmdXICAgIHwKLXwtLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS18Cit8LS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IEFyY2hpdGVjdHVyZSAgICB8IE9wZXJhdGluZyBTeXN0ZW0gfCBDb21waWxlciAgICAgICAgICAgICAgICB8Cit8LS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IEFBcmNoNjQgICAgICAgICB8IExpbnV4ICAgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IEFscGhhICAgICAgICAgICB8IExpbnV4ICAgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IEFscGhhICAgICAgICAgICB8IFRydTY0ICAgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IEFSTSAgICAgICAgICAgICB8IExpbnV4ICAgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IEFSTSAgICAgICAgICAgICB8IGlPUyAgICAgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IEFWUjMyICAgICAgICAgICB8IExpbnV4ICAgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IEJsYWNrZmluICAgICAgICB8IHVDbGludXggICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IEhQUEEgICAgICAgICAgICB8IEhQVVggICAgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IElBLTY0ICAgICAgICAgICB8IExpbnV4ICAgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IE02OEsgICAgICAgICAgICB8IEZyZWVNaU5UICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IE02OEsgICAgICAgICAgICB8IExpbnV4CSAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IE02OEsgICAgICAgICAgICB8IFJURU1TICAgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IE1ldGEgICAgICAgICAgICB8IExpbnV4ICAgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IE1pY3JvQmxhemUgICAgICB8IExpbnV4ICAgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IE1JUFMgICAgICAgICAgICB8IElSSVggICAgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IE1JUFMgICAgICAgICAgICB8IExpbnV4ICAgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IE1JUFMgICAgICAgICAgICB8IFJURU1TICAgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IE1JUFM2NCAgICAgICAgICB8IExpbnV4ICAgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IE1veGllCQkgIHwgQmFyZSBtZXRhbAkgICAgIHwgR0NDCit8IFBvd2VyUEMgMzItYml0ICB8IEFJWCAgICAgICAgICAgICAgfCBJQk0gWEwgQyAgICAgICAgICAgICAgICB8Cit8IFBvd2VyUEMgNjQtYml0ICB8IEFJWCAgICAgICAgICAgICAgfCBJQk0gWEwgQyAgICAgICAgICAgICAgICB8Cit8IFBvd2VyUEMgICAgICAgICB8IEFNSUdBICAgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFBvd2VyUEMgICAgICAgICB8IExpbnV4ICAgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFBvd2VyUEMgICAgICAgICB8IE1hYyBPU1ggICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFBvd2VyUEMgICAgICAgICB8IEZyZWVCU0QgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFBvd2VyUEMgNjQtYml0ICB8IEZyZWVCU0QgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFBvd2VyUEMgNjQtYml0ICB8IExpbnV4ICAgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFMzOTAgICAgICAgICAgICB8IExpbnV4ICAgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFMzOTBYICAgICAgICAgICB8IExpbnV4ICAgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFNQQVJDICAgICAgICAgICB8IExpbnV4ICAgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFNQQVJDICAgICAgICAgICB8IFNvbGFyaXMgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFNQQVJDICAgICAgICAgICB8IFNvbGFyaXMgICAgICAgICAgfCBPcmFjbGUgU29sYXJpcyBTdHVkaW8gQyB8Cit8IFNQQVJDNjQgICAgICAgICB8IExpbnV4ICAgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFNQQVJDNjQgICAgICAgICB8IEZyZWVCU0QgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFNQQVJDNjQgICAgICAgICB8IFNvbGFyaXMgICAgICAgICAgfCBPcmFjbGUgU29sYXJpcyBTdHVkaW8gQyB8Cit8IFRJTEUtR3gvVElMRVBybyB8IExpbnV4ICAgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFg4NiAgICAgICAgICAgICB8IEZyZWVCU0QgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFg4NiAgICAgICAgICAgICB8IEdOVSBIVVJEICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFg4NiAgICAgICAgICAgICB8IEludGVyaXggICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFg4NiAgICAgICAgICAgICB8IGtGcmVlQlNEICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFg4NiAgICAgICAgICAgICB8IExpbnV4ICAgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFg4NiAgICAgICAgICAgICB8IE1hYyBPU1ggICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFg4NiAgICAgICAgICAgICB8IE9wZW5CU0QgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFg4NiAgICAgICAgICAgICB8IE9TLzIgICAgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFg4NiAgICAgICAgICAgICB8IFNvbGFyaXMgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFg4NiAgICAgICAgICAgICB8IFNvbGFyaXMgICAgICAgICAgfCBPcmFjbGUgU29sYXJpcyBTdHVkaW8gQyB8Cit8IFg4NiAgICAgICAgICAgICB8IFdpbmRvd3MvQ3lnd2luICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFg4NiAgICAgICAgICAgICB8IFdpbmRvd3MvTWluZ1cgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFg4Ni02NCAgICAgICAgICB8IEZyZWVCU0QgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFg4Ni02NCAgICAgICAgICB8IExpbnV4ICAgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFg4Ni02NCAgICAgICAgICB8IExpbnV4L3gzMiAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFg4Ni02NCAgICAgICAgICB8IE9wZW5CU0QgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFg4Ni02NCAgICAgICAgICB8IFNvbGFyaXMgICAgICAgICAgfCBPcmFjbGUgU29sYXJpcyBTdHVkaW8gQyB8Cit8IFg4Ni02NCAgICAgICAgICB8IFdpbmRvd3MvTWluZ1cgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8IFh0ZW5zYSAgICAgICAgICB8IExpbnV4ICAgICAgICAgICAgfCBHQ0MgICAgICAgICAgICAgICAgICAgICB8Cit8LS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CiAKIFBsZWFzZSBzZW5kIGFkZGl0aW9uYWwgcGxhdGZvcm0gdGVzdCByZXN1bHRzIHRvCiBsaWJmZmktZGlzY3Vzc0Bzb3VyY2V3YXJlLm9yZyBhbmQgZmVlbCBmcmVlIHRvIHVwZGF0ZSB0aGUgd2lraSBwYWdlCkBAIC0xMTMsMTQgKzEzNywyMCBAQAogTWljcm9zb2Z0J3MgVmlzdWFsIEMrKyBjb21waWxlci4gIEluIHRoaXMgY2FzZSwgdXNlIHRoZSBtc3ZjYy5zaAogd3JhcHBlciBzY3JpcHQgZHVyaW5nIGNvbmZpZ3VyYXRpb24gbGlrZSBzbzoKIAotcGF0aC90by9jb25maWd1cmUgLS1lbmFibGUtc2hhcmVkIC0tZW5hYmxlLXN0YXRpYyBcCi0JQ0M9cGF0aC90by9tc3ZjYy5zaCBMRD1saW5rIFwKLQlDUFA9XCJjbCAtbm9sb2dvIC1FUFwiCitwYXRoL3RvL2NvbmZpZ3VyZSBDQz1wYXRoL3RvL21zdmNjLnNoIExEPWxpbmsgQ1BQPVwiY2wgLW5vbG9nbyAtRVBcIgorCitGb3IgNjQtYml0IFdpbmRvd3MgYnVpbGRzLCB1c2UgQ0M9InBhdGgvdG8vbXN2Y2Muc2ggLW02NCIuCitZb3UgbWF5IGFsc28gbmVlZCB0byBzcGVjaWZ5IC0tYnVpbGQgYXBwcm9wcmlhdGVseS4gV2hlbiBidWlsZGluZyB3aXRoIE1TVkMKK3VuZGVyIGEgTWluZ1cgZW52aXJvbm1lbnQsIHlvdSBtYXkgbmVlZCB0byByZW1vdmUgdGhlIGxpbmUgaW4gY29uZmlndXJlCit0aGF0IHNldHMgJ2ZpeF9zcmNmaWxlX3BhdGgnIHRvIGEgJ2N5Z3BhdGgnIGNvbW1hbmQuICgnY3lncGF0aCcgaXMgbm90CitwcmVzZW50IGluIE1pbmdXLCBhbmQgaXMgbm90IHJlcXVpcmVkIHdoZW4gdXNpbmcgTWluZ1ctc3R5bGUgcGF0aHMuKQorCitGb3IgaU9TIGJ1aWxkcywgdGhlICdsaWJmZmkueGNvZGVwcm9qJyBYY29kZSBwcm9qZWN0IGlzIGF2YWlsYWJsZS4KIAogQ29uZmlndXJlIGhhcyBtYW55IG90aGVyIG9wdGlvbnMuIFVzZSAiY29uZmlndXJlIC0taGVscCIgdG8gc2VlIHRoZW0gYWxsLgogCiBPbmNlIGNvbmZpZ3VyZSBoYXMgZmluaXNoZWQsIHR5cGUgIm1ha2UiLiBOb3RlIHRoYXQgeW91IG11c3QgYmUgdXNpbmcKLUdOVSBtYWtlLiAgWW91IGNhbiBmdHAgR05VIG1ha2UgZnJvbSBwcmVwLmFpLm1pdC5lZHU6L3B1Yi9nbnUuCitHTlUgbWFrZS4gIFlvdSBjYW4gZnRwIEdOVSBtYWtlIGZyb20gZnRwLmdudS5vcmc6L3B1Yi9nbnUvbWFrZSAuCiAKIFRvIGVuc3VyZSB0aGF0IGxpYmZmaSBpcyB3b3JraW5nIGFzIGFkdmVydGlzZWQsIHR5cGUgIm1ha2UgY2hlY2siLgogVGhpcyB3aWxsIHJlcXVpcmUgdGhhdCB5b3UgaGF2ZSBEZWphR05VIGluc3RhbGxlZC4KQEAgLTEzMywxMSArMTYzLDUzIEBACiAKIFNlZSB0aGUgQ2hhbmdlTG9nIGZpbGVzIGZvciBkZXRhaWxzLgogCi0zLjAuMTAgPz8/LT8/LT8/Ci0gICAgICAgIEZpeCB0aGUgTjY0IGJ1aWxkIG9uIG1pcHMtc2dpLWlyaXg2LjUuCi0JVGVzdHN1aXRlIGZpeGVzIGZvciBUcnU2NCBVbml4LgorMy4wLjEzIE1hci0xNy0xMworCUFkZCBNZXRhIHN1cHBvcnQuCisJQWRkIG1pc3NpbmcgTW94aWUgYml0cy4KKwlGaXggc3RhY2sgYWxpZ25tZW50IGJ1ZyBvbiAzMi1iaXQgeDg2LgorCUJ1aWxkIGZpeCBmb3IgbTY4MDAwIHRhcmdldHMuCisJQnVpbGQgZml4IGZvciBzb2Z0LWZsb2F0IFBvd2VyIHRhcmdldHMuCisJRml4IHRoZSBpbnN0YWxsIGRpciBsb2NhdGlvbiBmb3Igc29tZSBwbGF0Zm9ybXMgd2hlbiBidWlsZGluZworCSAgd2l0aCBHQ0MgKE9TIFgsIFNvbGFyaXMpLgorCUZpeCBDeWd3aW4gcmVncmVzc2lvbi4KKworMy4wLjEyIEZlYi0xMS0xMworICAgICAgICBBZGQgTW94aWUgc3VwcG9ydC4KKwlBZGQgQUFyY2g2NCBzdXBwb3J0LgorCUFkZCBCbGFja2ZpbiBzdXBwb3J0LgorCUFkZCBUSUxFLUd4L1RJTEVQcm8gc3VwcG9ydC4KKwlBZGQgTWljcm9CbGF6ZSBzdXBwb3J0LgorCUFkZCBYdGVuc2Egc3VwcG9ydC4KKwlBZGQgc3VwcG9ydCBmb3IgUGFYIGVuYWJsZWQga2VybmVscyB3aXRoIE1QUk9URUNULgorCUFkZCBzdXBwb3J0IGZvciBuYXRpdmUgdmVuZG9yIGNvbXBpbGVycyBvbgorCSAgU29sYXJpcyBhbmQgQUlYLgorCVdvcmsgYXJvdW5kIExMVk0vR0NDIGludGVyb3BlcmFiaWxpdHkgaXNzdWUgb24geDg2XzY0LgorCiszLjAuMTEgQXByLTExLTEyCisgICAgICAgIExvdHMgb2YgYnVpbGQgZml4ZXMuCisJQWRkIEFtaWdhIG5ld2VyIE1hY09TIHN1cHBvcnQuCisJQWRkIHN1cHBvcnQgZm9yIHZhcmlhZGljIGZ1bmN0aW9ucyAoZmZpX3ByZXBfY2lmX3ZhcikuCisJQWRkIExpbnV4L3gzMiBzdXBwb3J0LgorCUFkZCB0aGlzY2FsbCwgZmFzdGNhbGwgYW5kIE1TVkMgY2RlY2wgc3VwcG9ydCBvbiBXaW5kb3dzLgorCUFkZCBBbWlnYSBhbmQgbmV3ZXIgTWFjT1Mgc3VwcG9ydC4KKwlBZGQgbTY4ayBGcmVlTWlOVCBzdXBwb3J0LgorCUludGVncmF0aW9uIHdpdGggaU9TJyB4Y29kZSBidWlsZCB0b29scy4KKwlGaXggT2N0ZW9uIGFuZCBNQzY4ODgxIHN1cHBvcnQuCisJRml4IGNvZGUgcGVzc2ltaXphdGlvbnMuCisKKzMuMC4xMCBBdWctMjMtMTEKKyAgICAgICAgQWRkIHN1cHBvcnQgZm9yIEFwcGxlJ3MgaU9TLgorCUFkZCBzdXBwb3J0IGZvciBBUk0gVkZQIEFCSS4KKyAgICAgICAgQWRkIFJURU1TIHN1cHBvcnQgZm9yIE1JUFMgYW5kIE02OEsuCisJRml4IGluc3RydWN0aW9uIGNhY2hlIGNsZWFyaW5nIHByb2JsZW1zIG9uCisJICBBUk0gYW5kIFNQQVJDLgorCUZpeCB0aGUgTjY0IGJ1aWxkIG9uIG1pcHMtc2dpLWlyaXg2LjUuCiAJRW5hYmxlIGJ1aWxkcyB3aXRoIE1pY3Jvc29mdCdzIGNvbXBpbGVyLgotCUVuYWJsZSB4ODYgYnVpbGRzIHdpdGggU3VuJ3MgY29tcGlsZXIuCisJRW5hYmxlIHg4NiBidWlsZHMgd2l0aCBPcmFjbGUncyBTb2xhcmlzIGNvbXBpbGVyLgorCUZpeCBzdXBwb3J0IGZvciBjYWxsaW5nIGNvZGUgY29tcGlsZWQgd2l0aCBPcmFjbGUncyBTcGFyYworCSAgU29sYXJpcyBjb21waWxlci4KKwlUZXN0c3VpdGUgZml4ZXMgZm9yIFRydTY0IFVuaXguCisJQWRkaXRpb25hbCBwbGF0Zm9ybSBzdXBwb3J0LgogCiAzLjAuOSBEZWMtMzEtMDkKICAgICAgICAgQWRkIEFWUjMyIGFuZCB3aW42NCBwb3J0cy4gIEFkZCBBUk0gc29mdGZwIHN1cHBvcnQuCkBAIC0yODIsMTUgKzM1NCwxOSBAQAogTWFqb3IgcHJvY2Vzc29yIGFyY2hpdGVjdHVyZSBwb3J0cyB3ZXJlIGNvbnRyaWJ1dGVkIGJ5IHRoZSBmb2xsb3dpbmcKIGRldmVsb3BlcnM6CiAKK2FhcmNoNjQJCU1hcmN1cyBTaGF3Y3JvZnQsIEphbWVzIEdyZWVuaGFsZ2gKIGFscGhhCQlSaWNoYXJkIEhlbmRlcnNvbgogYXJtCQlSYWZmYWVsZSBTZW5hCitibGFja2ZpbiAgICAgICAgQWxleGFuZHJlIEtldW5lY2tlIEkuIGRlIE1lbmRvbmNhCiBjcmlzCQlTaW1vbiBQb3NuamFrLCBIYW5zLVBldGVyIE5pbHNzb24KIGZydgkJQW50aG9ueSBHcmVlbgogaWE2NAkJSGFucyBCb2VobQogbTMycgkJS2F6dWhpcm8gSW5hb2thCiBtNjhrCQlBbmRyZWFzIFNjaHdhYgorbWljcm9ibGF6ZQlOYXRoYW4gUm9zc2kKIG1pcHMJCUFudGhvbnkgR3JlZW4sIENhc2V5IE1hcnNoYWxsCiBtaXBzNjQJCURhdmlkIERhbmV5Cittb3hpZQkJQW50aG9ueSBHcmVlbgogcGEJCVJhbmRvbHBoIENodW5nLCBEYXZlIEFuZ2xpbiwgQW5kcmVhcyBUb2JsZXIKIHBvd2VycGMJCUdlb2ZmcmV5IEtlYXRpbmcsIEFuZHJlYXMgVG9ibGVyLCAKIAkJCSBEYXZpZCBFZGVsc29obiwgSm9obiBIb3Jua3Zpc3QKQEAgLTI5OSw4ICszNzUsMTAgQEAKIHNoCQlLYXogS29qaW1hCiBzaDY0CQlLYXogS29qaW1hCiBzcGFyYwkJQW50aG9ueSBHcmVlbiwgR29yZG9uIElybGFtCit0aWxlLWd4L3RpbGVwcm8gV2FsdGVyIExlZQogeDg2CQlBbnRob255IEdyZWVuLCBKb24gQmVuaXN0b24KIHg4Ni02NAkJQm8gVGhvcnNlbgoreHRlbnNhCQlDaHJpcyBaYW5rZWwKIAogSmVzcGVyIFNrb3YgYW5kIEFuZHJldyBIYWxleSBib3RoIGRpZCBtb3JlIHRoYW4gdGhlaXIgZmFpciBzaGFyZSBvZgogc3RlcHBpbmcgdGhyb3VnaCB0aGUgY29kZSBhbmQgdHJhY2tpbmcgZG93biBidWdzLgpAQCAtMzE4LDUgKzM5Niw2IEBACiBUaGUgbGlzdCBhYm92ZSBpcyBhbG1vc3QgY2VydGFpbmx5IGluY29tcGxldGUgYW5kIGluYWNjdXJhdGUuICBJJ20KIGhhcHB5IHRvIG1ha2UgY29ycmVjdGlvbnMgb3IgYWRkaXRpb25zIHVwb24gcmVxdWVzdC4KIAotSWYgeW91IGhhdmUgYSBwcm9ibGVtLCBvciBoYXZlIGZvdW5kIGEgYnVnLCBwbGVhc2Ugc2VuZCBhIG5vdGUgdG8KLWdyZWVuQHJlZGhhdC5jb20uCitJZiB5b3UgaGF2ZSBhIHByb2JsZW0sIG9yIGhhdmUgZm91bmQgYSBidWcsIHBsZWFzZSBzZW5kIGEgbm90ZSB0byB0aGUKK2F1dGhvciBhdCBncmVlbkBtb3hpZWxvZ2ljLmNvbSwgb3IgdGhlIHByb2plY3QgbWFpbGluZyBsaXN0IGF0CitsaWJmZmktZGlzY3Vzc0Bzb3VyY2V3YXJlLm9yZy4KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvYWNsb2NhbC5tNCBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvYWNsb2NhbC5tNAppbmRleCBjOGU1MjZmLi5jM2FiMjcyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2FjbG9jYWwubTQKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9hY2xvY2FsLm00CkBAIC0xLDcgKzEsNyBAQAotIyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhY2xvY2FsIDEuMTEuMSAtKi0gQXV0b2NvbmYgLSotCisjIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS4xMi4yIC0qLSBBdXRvY29uZiAtKi0KIAotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsCi0jIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKwogIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgogIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAogIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCkBAIC0xMywyOCArMTMsODQ4IEBACiAKIG00X2lmbmRlZihbQUNfQVVUT0NPTkZfVkVSU0lPTl0sCiAgIFttNF9jb3B5KFttNF9QQUNLQUdFX1ZFUlNJT05dLCBbQUNfQVVUT0NPTkZfVkVSU0lPTl0pXSlkbmwKLW00X2lmKG00X2RlZm4oW0FDX0FVVE9DT05GX1ZFUlNJT05dKSwgWzIuNjVdLCwKLVttNF93YXJuaW5nKFt0aGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBmb3IgYXV0b2NvbmYgMi42NS4KK200X2lmKG00X2RlZm4oW0FDX0FVVE9DT05GX1ZFUlNJT05dKSwgWzIuNjldLCwKK1ttNF93YXJuaW5nKFt0aGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBmb3IgYXV0b2NvbmYgMi42OS4KIFlvdSBoYXZlIGFub3RoZXIgdmVyc2lvbiBvZiBhdXRvY29uZi4gIEl0IG1heSB3b3JrLCBidXQgaXMgbm90IGd1YXJhbnRlZWQgdG8uCiBJZiB5b3UgaGF2ZSBwcm9ibGVtcywgeW91IG1heSBuZWVkIHRvIHJlZ2VuZXJhdGUgdGhlIGJ1aWxkIHN5c3RlbSBlbnRpcmVseS4KLVRvIGRvIHNvLCB1c2UgdGhlIHByb2NlZHVyZSBkb2N1bWVudGVkIGJ5IHRoZSBwYWNrYWdlLCB0eXBpY2FsbHkgYGF1dG9yZWNvbmYnLl0pXSkKK1RvIGRvIHNvLCB1c2UgdGhlIHByb2NlZHVyZSBkb2N1bWVudGVkIGJ5IHRoZSBwYWNrYWdlLCB0eXBpY2FsbHkgJ2F1dG9yZWNvbmYnLl0pXSkKIAotIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBsdGRsLm00IC0gQ29uZmlndXJlIGx0ZGwgZm9yIHRoZSB0YXJnZXQgc3lzdGVtLiAtKi1BdXRvY29uZi0qLQorIworIyAgIENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCAyMDA3LCAyMDA4LCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyAgIFdyaXR0ZW4gYnkgVGhvbWFzIFRhbm5lciwgMTk5OQorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcworIyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDE4IExURExfSU5JVAorCisjIExUX0NPTkZJR19MVERMX0RJUihESVJFQ1RPUlksIFtMVERMLU1PREVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRElSRUNUT1JZIGNvbnRhaW5zIHRoZSBsaWJsdGRsIHNvdXJjZXMuICBJdCBpcyBva2F5IHRvIGNhbGwgdGhpcworIyBmdW5jdGlvbiBtdWx0aXBsZSB0aW1lcywgYXMgbG9uZyBhcyB0aGUgc2FtZSBESVJFQ1RPUlkgaXMgYWx3YXlzIGdpdmVuLgorQUNfREVGVU4oW0xUX0NPTkZJR19MVERMX0RJUl0sCitbQUNfQkVGT1JFKFskMF0sIFtMVERMX0lOSVRdKQorXyQwKCQqKQorXSkjIExUX0NPTkZJR19MVERMX0RJUgorCisjIFdlIGJyZWFrIHRoaXMgb3V0IGludG8gYSBzZXBhcmF0ZSBtYWNybywgc28gdGhhdCB3ZSBjYW4gY2FsbCBpdCBzYWZlbHkKKyMgaW50ZXJuYWxseSB3aXRob3V0IGJlaW5nIGNhdWdodCBhY2NpZGVudGFsbHkgYnkgdGhlIHNlZCBzY2FuIGluIGxpYnRvb2xpemUuCittNF9kZWZ1bihbX0xUX0NPTkZJR19MVERMX0RJUl0sCitbZG5sIHJlbW92ZSB0cmFpbGluZyBzbGFzaGVzCittNF9wdXNoZGVmKFtfQVJHX0RJUl0sIG00X2JwYXRzdWJzdChbJDFdLCBbLyokXSkpCittNF9jYXNlKF9MVERMX0RJUiwKKwlbXSwgW2RubCBvbmx5IHNldCBsdF9sdGRsX2RpciBpZiBfQVJHX0RJUiBpcyBub3Qgc2ltcGx5IGAuJworCSAgICAgbTRfaWYoX0FSR19ESVIsIFsuXSwKKwkgICAgICAgICAgICAgW10sCisJCSBbbTRfZGVmaW5lKFtfTFRETF9ESVJdLCBfQVJHX0RJUikKKwkgICAgICAgICAgX0xUX1NIRUxMX0lOSVQoW2x0X2x0ZGxfZGlyPSddX0FSR19ESVJbJ10pXSldLAorICAgIFttNF9pZihfQVJHX0RJUiwgX0xURExfRElSLAorCSAgICBbXSwKKwlbbTRfZmF0YWwoW211bHRpcGxlIGxpYmx0ZGwgZGlyZWN0b3JpZXM6IGBdX0xURExfRElSWycsIGBdX0FSR19ESVJbJ10pXSldKQorbTRfcG9wZGVmKFtfQVJHX0RJUl0pCitdKSMgX0xUX0NPTkZJR19MVERMX0RJUgorCisjIEluaXRpYWxpc2U6CittNF9kZWZpbmUoW19MVERMX0RJUl0sIFtdKQorCisKKyMgX0xUX0JVSUxEX1BSRUZJWAorIyAtLS0tLS0tLS0tLS0tLS0tCisjIElmIEF1dG9jb25mIGlzIG5ldyBlbm91Z2gsIGV4cGFuZCB0byBgJHt0b3BfYnVpbGRfcHJlZml4fScsIG90aGVyd2lzZQorIyB0byBgJHt0b3BfYnVpbGRkaXJ9LycuCittNF9kZWZpbmUoW19MVF9CVUlMRF9QUkVGSVhdLAorW200X2lmZGVmKFtBQ19BVVRPQ09ORl9WRVJTSU9OXSwKKyAgIFttNF9pZihtNF92ZXJzaW9uX2NvbXBhcmUobTRfZGVmbihbQUNfQVVUT0NPTkZfVkVSU0lPTl0pLCBbMi42Ml0pLAorCSAgWy0xXSwgW200X2lmZGVmKFtfQUNfSEFWRV9UT1BfQlVJTERfUFJFRklYXSwKKwkJCSAgWyR7dG9wX2J1aWxkX3ByZWZpeH1dLAorCQkJICBbJHt0b3BfYnVpbGRkaXJ9L10pXSwKKwkgIFske3RvcF9idWlsZF9wcmVmaXh9XSldLAorICAgWyR7dG9wX2J1aWxkZGlyfS9dKVtdZG5sCitdKQorCisKKyMgTFRETF9DT05WRU5JRU5DRQorIyAtLS0tLS0tLS0tLS0tLS0tCisjIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IgdGhlIGxpYmx0ZGwgY29udmVuaWVuY2UgbGlicmFyeSBhbmQKKyMgTFRETElOQ0wgdG8gdGhlIGluY2x1ZGUgZmxhZ3MgZm9yIHRoZSBsaWJsdGRsIGhlYWRlciBhbmQgYWRkcworIyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIHRvIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0CisjIEFDX0NPTkZJR19TVUJESVJTIGlzIG5vdCBjYWxsZWQgaGVyZS4gIExJQkxUREwgd2lsbCBiZSBwcmVmaXhlZCB3aXRoCisjICcke3RvcF9idWlsZF9wcmVmaXh9JyBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB3aXRoICcke3RvcF9idWlsZGRpcn0vJywKKyMgYW5kIExURExJTkNMIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCAnJHt0b3Bfc3JjZGlyfS8nIChub3RlIHRoZSBzaW5nbGUKKyMgcXVvdGVzISkuICBJZiB5b3VyIHBhY2thZ2UgaXMgbm90IGZsYXQgYW5kIHlvdSdyZSBub3QgdXNpbmcgYXV0b21ha2UsCisjIGRlZmluZSB0b3BfYnVpbGRfcHJlZml4LCB0b3BfYnVpbGRkaXIsIGFuZCB0b3Bfc3JjZGlyIGFwcHJvcHJpYXRlbHkKKyMgaW4geW91ciBNYWtlZmlsZXMuCitBQ19ERUZVTihbTFRETF9DT05WRU5JRU5DRV0sCitbQUNfQkVGT1JFKFskMF0sIFtMVERMX0lOSVRdKWRubAorZG5sIEFsdGhvdWdoIHRoZSBhcmd1bWVudCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9jdW1lbnRlZCwKK2RubCBMVERMX0NPTlZFTklFTkNFIHVzZWQgdG8gdGFrZSBhIERJUkVDVE9SWSBvcmd1bWVudCwgaWYgd2UgaGF2ZSBvbmUKK2RubCBoZXJlIG1ha2Ugc3VyZSBpdCBpcyB0aGUgc2FtZSBhcyBhbnkgb3RoZXIgZGVjbGFyYXRpb24gb2YgbGlibHRkbCdzCitkbmwgbG9jYXRpb24hICBUaGlzIGFsc28gZW5zdXJlcyBsdF9sdGRsX2RpciBpcyBzZXQgd2hlbiBjb25maWd1cmUuYWMgaXMKK2RubCBub3QgeWV0IHVzaW5nIGFuIGV4cGxpY2l0IExUX0NPTkZJR19MVERMX0RJUi4KK200X2lmdmFsKFskMV0sIFtfTFRfQ09ORklHX0xURExfRElSKFskMV0pXSlkbmwKK18kMCgpCitdKSMgTFRETF9DT05WRU5JRU5DRQorCisjIEFDX0xJQkxURExfQ09OVkVOSUVOQ0UgYWNjZXB0ZWQgYSBkaXJlY3RvcnkgYXJndW1lbnQgaW4gb2xkZXIgbGlidG9vbHMsCisjIG5vdyB3ZSBoYXZlIExUX0NPTkZJR19MVERMX0RJUjoKK0FVX0RFRlVOKFtBQ19MSUJMVERMX0NPTlZFTklFTkNFXSwKK1tfTFRfQ09ORklHX0xURExfRElSKFttNF9kZWZhdWx0KFskMV0sIFtsaWJsdGRsXSldKQorX0xURExfQ09OVkVOSUVOQ0VdKQorCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQkxURExfQ09OVkVOSUVOQ0VdLCBbXSkKKworCisjIF9MVERMX0NPTlZFTklFTkNFCisjIC0tLS0tLS0tLS0tLS0tLS0tCisjIENvZGUgc2hhcmVkIGJ5IExURExfQ09OVkVOSUVOQ0UgYW5kIExURExfSU5JVChbY29udmVuaWVuY2VdKS4KK200X2RlZnVuKFtfTFRETF9DT05WRU5JRU5DRV0sCitbY2FzZSAkZW5hYmxlX2x0ZGxfY29udmVuaWVuY2UgaW4KKyAgbm8pIEFDX01TR19FUlJPUihbdGhpcyBwYWNrYWdlIG5lZWRzIGEgY29udmVuaWVuY2UgbGlibHRkbF0pIDs7CisgICIiKSBlbmFibGVfbHRkbF9jb252ZW5pZW5jZT15ZXMKKyAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1jb252ZW5pZW5jZSIgOzsKK2VzYWMKK0xJQkxUREw9J19MVF9CVUlMRF9QUkVGSVgnIiR7bHRfbHRkbF9kaXIrJGx0X2x0ZGxfZGlyL31saWJsdGRsYy5sYSIKK0xURExERVBTPSRMSUJMVERMCitMVERMSU5DTD0nLUkke3RvcF9zcmNkaXJ9JyIke2x0X2x0ZGxfZGlyKy8kbHRfbHRkbF9kaXJ9IgorCitBQ19TVUJTVChbTElCTFRETF0pCitBQ19TVUJTVChbTFRETERFUFNdKQorQUNfU1VCU1QoW0xURExJTkNMXSkKKworIyBGb3IgYmFja3dhcmRzIG5vbi1nZXR0ZXh0IGNvbnNpc3RlbnQgY29tcGF0aWJpbGl0eS4uLgorSU5DTFRETD0iJExURExJTkNMIgorQUNfU1VCU1QoW0lOQ0xURExdKQorXSkjIF9MVERMX0NPTlZFTklFTkNFCisKKworIyBMVERMX0lOU1RBTExBQkxFCisjIC0tLS0tLS0tLS0tLS0tLS0KKyMgc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvciB0aGUgbGlibHRkbCBpbnN0YWxsYWJsZSBsaWJyYXJ5CisjIGFuZCBMVERMSU5DTCB0byB0aGUgaW5jbHVkZSBmbGFncyBmb3IgdGhlIGxpYmx0ZGwgaGVhZGVyIGFuZCBhZGRzCisjIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCB0byB0aGUgY29uZmlndXJlIGFyZ3VtZW50cy4gIE5vdGUgdGhhdAorIyBBQ19DT05GSUdfU1VCRElSUyBpcyBub3QgY2FsbGVkIGZyb20gaGVyZS4gIElmIGFuIGluc3RhbGxlZCBsaWJsdGRsCisjIGlzIG5vdCBmb3VuZCwgTElCTFRETCB3aWxsIGJlIHByZWZpeGVkIHdpdGggJyR7dG9wX2J1aWxkX3ByZWZpeH0nIGlmCisjIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHdpdGggJyR7dG9wX2J1aWxkZGlyfS8nLCBhbmQgTFRETElOQ0wgd2lsbCBiZQorIyBwcmVmaXhlZCB3aXRoICcke3RvcF9zcmNkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKS4gIElmIHlvdXIKKyMgcGFja2FnZSBpcyBub3QgZmxhdCBhbmQgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZF9wcmVmaXgsCisjIHRvcF9idWlsZGRpciwgYW5kIHRvcF9zcmNkaXIgYXBwcm9wcmlhdGVseSBpbiB5b3VyIE1ha2VmaWxlcy4KKyMgSW4gdGhlIGZ1dHVyZSwgdGhpcyBtYWNybyBtYXkgaGF2ZSB0byBiZSBjYWxsZWQgYWZ0ZXIgTFRfSU5JVC4KK0FDX0RFRlVOKFtMVERMX0lOU1RBTExBQkxFXSwKK1tBQ19CRUZPUkUoWyQwXSwgW0xURExfSU5JVF0pZG5sCitkbmwgQWx0aG91Z2ggdGhlIGFyZ3VtZW50IGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2N1bWVudGVkLAorZG5sIExURExfSU5TVEFMTEFCTEUgdXNlZCB0byB0YWtlIGEgRElSRUNUT1JZIG9yZ3VtZW50LCBpZiB3ZSBoYXZlIG9uZQorZG5sIGhlcmUgbWFrZSBzdXJlIGl0IGlzIHRoZSBzYW1lIGFzIGFueSBvdGhlciBkZWNsYXJhdGlvbiBvZiBsaWJsdGRsJ3MKK2RubCBsb2NhdGlvbiEgIFRoaXMgYWxzbyBlbnN1cmVzIGx0X2x0ZGxfZGlyIGlzIHNldCB3aGVuIGNvbmZpZ3VyZS5hYyBpcworZG5sIG5vdCB5ZXQgdXNpbmcgYW4gZXhwbGljaXQgTFRfQ09ORklHX0xURExfRElSLgorbTRfaWZ2YWwoWyQxXSwgW19MVF9DT05GSUdfTFRETF9ESVIoWyQxXSldKWRubAorXyQwKCkKK10pIyBMVERMX0lOU1RBTExBQkxFCisKKyMgQUNfTElCTFRETF9JTlNUQUxMQUJMRSBhY2NlcHRlZCBhIGRpcmVjdG9yeSBhcmd1bWVudCBpbiBvbGRlciBsaWJ0b29scywKKyMgbm93IHdlIGhhdmUgTFRfQ09ORklHX0xURExfRElSOgorQVVfREVGVU4oW0FDX0xJQkxURExfSU5TVEFMTEFCTEVdLAorW19MVF9DT05GSUdfTFRETF9ESVIoW200X2RlZmF1bHQoWyQxXSwgW2xpYmx0ZGxdKV0pCitfTFRETF9JTlNUQUxMQUJMRV0pCisKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCTFRETF9JTlNUQUxMQUJMRV0sIFtdKQorCisKKyMgX0xURExfSU5TVEFMTEFCTEUKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29kZSBzaGFyZWQgYnkgTFRETF9JTlNUQUxMQUJMRSBhbmQgTFRETF9JTklUKFtpbnN0YWxsYWJsZV0pLgorbTRfZGVmdW4oW19MVERMX0lOU1RBTExBQkxFXSwKK1tpZiB0ZXN0IC1mICRwcmVmaXgvbGliL2xpYmx0ZGwubGE7IHRoZW4KKyAgbHRfc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgTERGTEFHUz0iLUwkcHJlZml4L2xpYiAkTERGTEFHUyIKKyAgQUNfQ0hFQ0tfTElCKFtsdGRsXSwgW2x0X2RsaW5pdF0sIFtsdF9saWJfbHRkbD15ZXNdKQorICBMREZMQUdTPSIkbHRfc2F2ZV9MREZMQUdTIgorICBpZiB0ZXN0IHgiJHtsdF9saWJfbHRkbC1ub30iID0geHllczsgdGhlbgorICAgIGlmIHRlc3QgeCIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgIT0geHllczsgdGhlbgorICAgICAgIyBEb24ndCBvdmVyd3JpdGUgJHByZWZpeC9saWIvbGlibHRkbC5sYSB3aXRob3V0IC0tZW5hYmxlLWx0ZGwtaW5zdGFsbAorICAgICAgQUNfTVNHX1dBUk4oW25vdCBvdmVyd3JpdGluZyBsaWJsdGRsIGF0ICRwcmVmaXgsIGZvcmNlIHdpdGggYC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCddKQorICAgICAgZW5hYmxlX2x0ZGxfaW5zdGFsbD1ubworICAgIGZpCisgIGVsaWYgdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiA9IHhubzsgdGhlbgorICAgIEFDX01TR19XQVJOKFtsaWJsdGRsIG5vdCBpbnN0YWxsZWQsIGJ1dCBpbnN0YWxsYXRpb24gZGlzYWJsZWRdKQorICBmaQorZmkKKworIyBJZiBjb25maWd1cmUuYWMgZGVjbGFyZWQgYW4gaW5zdGFsbGFibGUgbHRkbCwgYW5kIHRoZSB1c2VyIGRpZG4ndCBvdmVycmlkZQorIyB3aXRoIC0tZGlzYWJsZS1sdGRsLWluc3RhbGwsIHdlIHdpbGwgaW5zdGFsbCB0aGUgc2hpcHBlZCBsaWJsdGRsLgorY2FzZSAkZW5hYmxlX2x0ZGxfaW5zdGFsbCBpbgorICBubykgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWluc3RhbGw9bm8iCisgICAgICBMSUJMVERMPSItbGx0ZGwiCisgICAgICBMVERMREVQUz0KKyAgICAgIExURExJTkNMPQorICAgICAgOzsKKyAgKikgIGVuYWJsZV9sdGRsX2luc3RhbGw9eWVzCisgICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCIKKyAgICAgIExJQkxUREw9J19MVF9CVUlMRF9QUkVGSVgnIiR7bHRfbHRkbF9kaXIrJGx0X2x0ZGxfZGlyL31saWJsdGRsLmxhIgorICAgICAgTFRETERFUFM9JExJQkxUREwKKyAgICAgIExURExJTkNMPSctSSR7dG9wX3NyY2Rpcn0nIiR7bHRfbHRkbF9kaXIrLyRsdF9sdGRsX2Rpcn0iCisgICAgICA7OworZXNhYworCitBQ19TVUJTVChbTElCTFRETF0pCitBQ19TVUJTVChbTFRETERFUFNdKQorQUNfU1VCU1QoW0xURExJTkNMXSkKKworIyBGb3IgYmFja3dhcmRzIG5vbi1nZXR0ZXh0IGNvbnNpc3RlbnQgY29tcGF0aWJpbGl0eS4uLgorSU5DTFRETD0iJExURExJTkNMIgorQUNfU1VCU1QoW0lOQ0xURExdKQorXSkjIExURExfSU5TVEFMTEFCTEUKKworCisjIF9MVERMX01PREVfRElTUEFUQ0gKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtfTFRETF9NT0RFX0RJU1BBVENIXSwKK1tkbmwgSWYgX0xURExfRElSIGlzIGAuJywgdGhlbiB3ZSBhcmUgY29uZmlndXJpbmcgbGlibHRkbCBpdHNlbGY6CittNF9pZihfTFRETF9ESVIsIFtdLAorCVtdLAorICAgIGRubCBpZiBfTFRETF9NT0RFIHdhcyBub3Qgc2V0IGFscmVhZHksIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGBzdWJwcm9qZWN0JzoKKyAgICBbbTRfY2FzZShtNF9kZWZhdWx0KF9MVERMX01PREUsIFtzdWJwcm9qZWN0XSksCisJICBbc3VicHJvamVjdF0sIFtBQ19DT05GSUdfU1VCRElSUyhfTFRETF9ESVIpCisJCQkgIF9MVF9TSEVMTF9JTklUKFtsdF9kbG9wZW5fZGlyPSIkbHRfbHRkbF9kaXIiXSldLAorCSAgW25vbnJlY3Vyc2l2ZV0sIFtfTFRfU0hFTExfSU5JVChbbHRfZGxvcGVuX2Rpcj0iJGx0X2x0ZGxfZGlyIjsgbHRfbGlib2JqX3ByZWZpeD0iJGx0X2x0ZGxfZGlyLyJdKV0sCisJICBbcmVjdXJzaXZlXSwgW10sCisJW200X2ZhdGFsKFt1bmtub3duIGxpYmx0ZGwgbW9kZTogXV9MVERMX01PREUpXSldKWRubAorZG5sIEJlIGNhcmVmdWwgbm90IHRvIGV4cGFuZCB0d2ljZToKK200X2RlZmluZShbJDBdLCBbXSkKK10pIyBfTFRETF9NT0RFX0RJU1BBVENICisKKworIyBfTFRfTElCT0JKKE1PRFVMRV9OQU1FKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMaWtlIEFDX0xJQk9CSiwgZXhjZXB0IHRoYXQgTU9EVUxFX05BTUUgZ29lcyBpbnRvIF9MVF9MSUJPQkpTIGluc3RlYWQKKyMgb2YgaW50byBMSUJPQkpTLgorQUNfREVGVU4oW19MVF9MSUJPQkpdLCBbCisgIG00X3BhdHRlcm5fYWxsb3coW15fTFRfTElCT0JKUyRdKQorICBfTFRfTElCT0JKUz0iJF9MVF9MSUJPQkpTICQxLiRhY19vYmpleHQiCitdKSMgX0xUX0xJQk9CSlMKKworCisjIExURExfSU5JVChbT1BUSU9OU10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENsaWVudHMgb2YgbGlibHRkbCBjYW4gdXNlIHRoaXMgbWFjcm8gdG8gYWxsb3cgdGhlIGluc3RhbGxlciB0bworIyBjaG9vc2UgYmV0d2VlbiBhIHNoaXBwZWQgY29weSBvZiB0aGUgbHRkbCBzb3VyY2VzIG9yIGEgcHJlaW5zdGFsbGVkCisjIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuICBJZiB0aGUgc2hpcHBlZCBsdGRsIHNvdXJjZXMgYXJlIG5vdCBpbiBhCisjIHN1YmRpcmVjdG9yeSBuYW1lZCBsaWJsdGRsLCB0aGUgZGlyZWN0b3J5IG5hbWUgbXVzdCBiZSBnaXZlbiBieQorIyBMVF9DT05GSUdfTFRETF9ESVIuCitBQ19ERUZVTihbTFRETF9JTklUXSwKK1tkbmwgUGFyc2UgT1BUSU9OUworX0xUX1NFVF9PUFRJT05TKFskMF0sIFskMV0pCisKK2RubCBXZSBuZWVkIHRvIGtlZXAgb3VyIG93biBsaXN0IG9mIGxpYm9ianMgc2VwYXJhdGUgZnJvbSBvdXIgcGFyZW50IHByb2plY3QsCitkbmwgYW5kIHRoZSBlYXNpZXN0IHdheSB0byBkbyB0aGF0IGlzIHJlZGVmaW5lIHRoZSBBQ19MSUJPQkpzIG1hY3JvIHdoaWxlCitkbmwgd2UgbG9vayBmb3Igb3VyIG93biBMSUJPQkpzLgorbTRfcHVzaGRlZihbQUNfTElCT0JKXSwgbTRfZGVmbihbX0xUX0xJQk9CSl0pKQorbTRfcHVzaGRlZihbQUNfTElCU09VUkNFU10pCisKK2RubCBJZiBub3Qgb3RoZXJ3aXNlIGRlZmluZWQsIGRlZmF1bHQgdG8gdGhlIDEuNS54IGNvbXBhdGlibGUgc3VicHJvamVjdCBtb2RlOgorbTRfaWYoX0xURExfTU9ERSwgW10sCisgICAgICAgIFttNF9kZWZpbmUoW19MVERMX01PREVdLCBtNF9kZWZhdWx0KFskMl0sIFtzdWJwcm9qZWN0XSkpCisgICAgICAgIG00X2lmKFstMV0sIFttNF9icmVnZXhwKF9MVERMX01PREUsIFtcKHN1YnByb2plY3RcfFwobm9uXCk/cmVjdXJzaXZlXCldKV0sCisgICAgICAgICAgICAgICAgW200X2ZhdGFsKFt1bmtub3duIGxpYmx0ZGwgbW9kZTogXV9MVERMX01PREUpXSldKQorCitBQ19BUkdfV0lUSChbaW5jbHVkZWRfbHRkbF0sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtaW5jbHVkZWQtbHRkbF0sCisgICAgICAgICAgICAgICAgICAgIFt1c2UgdGhlIEdOVSBsdGRsIHNvdXJjZXMgaW5jbHVkZWQgaGVyZV0pXSkKKworaWYgdGVzdCAieCR3aXRoX2luY2x1ZGVkX2x0ZGwiICE9IHh5ZXM7IHRoZW4KKyAgIyBXZSBhcmUgbm90IGJlaW5nIGZvcmNlZCB0byB1c2UgdGhlIGluY2x1ZGVkIGxpYmx0ZGwgc291cmNlcywgc28KKyAgIyBkZWNpZGUgd2hldGhlciB0aGVyZSBpcyBhIHVzZWZ1bCBpbnN0YWxsZWQgdmVyc2lvbiB3ZSBjYW4gdXNlLgorICBBQ19DSEVDS19IRUFERVIoW2x0ZGwuaF0sCisgICAgICBbQUNfQ0hFQ0tfREVDTChbbHRfZGxpbnRlcmZhY2VfcmVnaXN0ZXJdLAorCSAgIFtBQ19DSEVDS19MSUIoW2x0ZGxdLCBbbHRfZGxhZHZpc2VfcHJlbG9hZF0sCisJICAgICAgIFt3aXRoX2luY2x1ZGVkX2x0ZGw9bm9dLAorCSAgICAgICBbd2l0aF9pbmNsdWRlZF9sdGRsPXllc10pXSwKKwkgICBbd2l0aF9pbmNsdWRlZF9sdGRsPXllc10sCisJICAgW0FDX0lOQ0xVREVTX0RFRkFVTFQKKwkgICAgI2luY2x1ZGUgPGx0ZGwuaD5dKV0sCisgICAgICBbd2l0aF9pbmNsdWRlZF9sdGRsPXllc10sCisgICAgICBbQUNfSU5DTFVERVNfREVGQVVMVF0KKyAgKQorZmkKKworZG5sIElmIG5laXRoZXIgTFRfQ09ORklHX0xURExfRElSLCBMVERMX0NPTlZFTklFTkNFIG5vciBMVERMX0lOU1RBTExBQkxFCitkbmwgd2FzIGNhbGxlZCB5ZXQsIHRoZW4gZm9yIG9sZCB0aW1lcycgc2FrZSwgd2UgYXNzdW1lIGxpYmx0ZGwgaXMgaW4gYW4KK2RubCBlcG9ueW1vdXMgZGlyZWN0b3J5OgorQUNfUFJPVklERV9JRkVMU0UoW0xUX0NPTkZJR19MVERMX0RJUl0sIFtdLCBbX0xUX0NPTkZJR19MVERMX0RJUihbbGlibHRkbF0pXSkKKworQUNfQVJHX1dJVEgoW2x0ZGxfaW5jbHVkZV0sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtbHRkbC1pbmNsdWRlPURJUl0sCisgICAgICAgICAgICAgICAgICAgIFt1c2UgdGhlIGx0ZGwgaGVhZGVycyBpbnN0YWxsZWQgaW4gRElSXSldKQorCitpZiB0ZXN0IC1uICIkd2l0aF9sdGRsX2luY2x1ZGUiOyB0aGVuCisgIGlmIHRlc3QgLWYgIiR3aXRoX2x0ZGxfaW5jbHVkZS9sdGRsLmgiOyB0aGVuIDoKKyAgZWxzZQorICAgIEFDX01TR19FUlJPUihbaW52YWxpZCBsdGRsIGluY2x1ZGUgZGlyZWN0b3J5OiBgJHdpdGhfbHRkbF9pbmNsdWRlJ10pCisgIGZpCitlbHNlCisgIHdpdGhfbHRkbF9pbmNsdWRlPW5vCitmaQorCitBQ19BUkdfV0lUSChbbHRkbF9saWJdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLWx0ZGwtbGliPURJUl0sCisgICAgICAgICAgICAgICAgICAgIFt1c2UgdGhlIGxpYmx0ZGwubGEgaW5zdGFsbGVkIGluIERJUl0pXSkKKworaWYgdGVzdCAtbiAiJHdpdGhfbHRkbF9saWIiOyB0aGVuCisgIGlmIHRlc3QgLWYgIiR3aXRoX2x0ZGxfbGliL2xpYmx0ZGwubGEiOyB0aGVuIDoKKyAgZWxzZQorICAgIEFDX01TR19FUlJPUihbaW52YWxpZCBsdGRsIGxpYnJhcnkgZGlyZWN0b3J5OiBgJHdpdGhfbHRkbF9saWInXSkKKyAgZmkKK2Vsc2UKKyAgd2l0aF9sdGRsX2xpYj1ubworZmkKKworY2FzZSAsJHdpdGhfaW5jbHVkZWRfbHRkbCwkd2l0aF9sdGRsX2luY2x1ZGUsJHdpdGhfbHRkbF9saWIsIGluCisgICx5ZXMsbm8sbm8sKQorCW00X2Nhc2UobTRfZGVmYXVsdChfTFRETF9UWVBFLCBbY29udmVuaWVuY2VdKSwKKwkgICAgW2NvbnZlbmllbmNlXSwgW19MVERMX0NPTlZFTklFTkNFXSwKKwkgICAgW2luc3RhbGxhYmxlXSwgW19MVERMX0lOU1RBTExBQkxFXSwKKwkgIFttNF9mYXRhbChbdW5rbm93biBsaWJsdGRsIGJ1aWxkIHR5cGU6IF1fTFRETF9UWVBFKV0pCisJOzsKKyAgLG5vLG5vLG5vLCkKKwkjIElmIHRoZSBpbmNsdWRlZCBsdGRsIGlzIG5vdCB0byBiZSB1c2VkLCB0aGVuIHVzZSB0aGUKKwkjIHByZWluc3RhbGxlZCBsaWJsdGRsIHdlIGZvdW5kLgorCUFDX0RFRklORShbSEFWRV9MVERMXSwgWzFdLAorCSAgW0RlZmluZSB0aGlzIGlmIGEgbW9kZXJuIGxpYmx0ZGwgaXMgYWxyZWFkeSBpbnN0YWxsZWRdKQorCUxJQkxUREw9LWxsdGRsCisJTFRETERFUFM9CisJTFRETElOQ0w9CisJOzsKKyAgLG5vKixubywqKQorCUFDX01TR19FUlJPUihbYC0td2l0aC1sdGRsLWluY2x1ZGUnIGFuZCBgLS13aXRoLWx0ZGwtbGliJyBvcHRpb25zIG11c3QgYmUgdXNlZCB0b2dldGhlcl0pCisJOzsKKyAgKikJd2l0aF9pbmNsdWRlZF9sdGRsPW5vCisJTElCTFRETD0iLUwkd2l0aF9sdGRsX2xpYiAtbGx0ZGwiCisJTFRETERFUFM9CisJTFRETElOQ0w9Ii1JJHdpdGhfbHRkbF9pbmNsdWRlIgorCTs7Citlc2FjCitJTkNMVERMPSIkTFRETElOQ0wiCisKKyMgUmVwb3J0IG91ciBkZWNpc2lvbi4uLgorQUNfTVNHX0NIRUNLSU5HKFt3aGVyZSB0byBmaW5kIGxpYmx0ZGwgaGVhZGVyc10pCitBQ19NU0dfUkVTVUxUKFskTFRETElOQ0xdKQorQUNfTVNHX0NIRUNLSU5HKFt3aGVyZSB0byBmaW5kIGxpYmx0ZGwgbGlicmFyeV0pCitBQ19NU0dfUkVTVUxUKFskTElCTFRETF0pCisKK19MVERMX1NFVFVQCisKK2RubCByZXN0b3JlIGF1dG9jb25mIGRlZmluaXRpb24uCittNF9wb3BkZWYoW0FDX0xJQk9CSl0pCittNF9wb3BkZWYoW0FDX0xJQlNPVVJDRVNdKQorCitBQ19DT05GSUdfQ09NTUFORFNfUFJFKFsKKyAgICBfbHRkbF9saWJvYmpzPQorICAgIF9sdGRsX2x0bGlib2Jqcz0KKyAgICBpZiB0ZXN0IC1uICIkX0xUX0xJQk9CSlMiOyB0aGVuCisgICAgICAjIFJlbW92ZSB0aGUgZXh0ZW5zaW9uLgorICAgICAgX2x0X3NlZF9kcm9wX29iamV4dD0ncy9cLm8kLy87cy9cLm9iaiQvLycKKyAgICAgIGZvciBpIGluIGBmb3IgaSBpbiAkX0xUX0xJQk9CSlM7IGRvIGVjaG8gIiRpIjsgZG9uZSB8IHNlZCAiJF9sdF9zZWRfZHJvcF9vYmpleHQiIHwgc29ydCAtdWA7IGRvCisgICAgICAgIF9sdGRsX2xpYm9ianM9IiRfbHRkbF9saWJvYmpzICRsdF9saWJvYmpfcHJlZml4JGkuJGFjX29iamV4dCIKKyAgICAgICAgX2x0ZGxfbHRsaWJvYmpzPSIkX2x0ZGxfbHRsaWJvYmpzICRsdF9saWJvYmpfcHJlZml4JGkubG8iCisgICAgICBkb25lCisgICAgZmkKKyAgICBBQ19TVUJTVChbbHRkbF9MSUJPQkpTXSwgWyRfbHRkbF9saWJvYmpzXSkKKyAgICBBQ19TVUJTVChbbHRkbF9MVExJQk9CSlNdLCBbJF9sdGRsX2x0bGlib2Jqc10pCitdKQorCisjIE9ubHkgZXhwYW5kIG9uY2U6CittNF9kZWZpbmUoW0xURExfSU5JVF0pCitdKSMgTFRETF9JTklUCisKKyMgT2xkIG5hbWVzOgorQVVfREVGVU4oW0FDX0xJQl9MVERMXSwgW0xURExfSU5JVCgkQCldKQorQVVfREVGVU4oW0FDX1dJVEhfTFRETF0sIFtMVERMX0lOSVQoJEApXSkKK0FVX0RFRlVOKFtMVF9XSVRIX0xURExdLCBbTFRETF9JTklUKCRAKV0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQl9MVERMXSwgW10pCitkbmwgQUNfREVGVU4oW0FDX1dJVEhfTFRETF0sIFtdKQorZG5sIEFDX0RFRlVOKFtMVF9XSVRIX0xURExdLCBbXSkKKworCisjIF9MVERMX1NFVFVQCisjIC0tLS0tLS0tLS0tCisjIFBlcmZvcm0gYWxsIHRoZSBjaGVja3MgbmVjZXNzYXJ5IGZvciBjb21waWxhdGlvbiBvZiB0aGUgbHRkbCBvYmplY3RzCisjICAtLSBpbmNsdWRpbmcgY29tcGlsZXIgY2hlY2tzIGFuZCBoZWFkZXIgY2hlY2tzLiAgVGhpcyBpcyBhIHB1YmxpYworIyBpbnRlcmZhY2UgIG1haW5seSBmb3IgdGhlIGJlbmVmaXQgb2YgbGlibHRkbCdzIG93biBjb25maWd1cmUuYWMsIG1vc3QKKyMgb3RoZXIgdXNlcnMgc2hvdWxkIGNhbGwgTFRETF9JTklUIGluc3RlYWQuCitBQ19ERUZVTihbX0xURExfU0VUVVBdLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorQUNfUkVRVUlSRShbTFRfU1lTX01PRFVMRV9FWFRdKWRubAorQUNfUkVRVUlSRShbTFRfU1lTX01PRFVMRV9QQVRIXSlkbmwKK0FDX1JFUVVJUkUoW0xUX1NZU19ETFNFQVJDSF9QQVRIXSlkbmwKK0FDX1JFUVVJUkUoW0xUX0xJQl9ETExPQURdKWRubAorQUNfUkVRVUlSRShbTFRfU1lTX1NZTUJPTF9VU0NPUkVdKWRubAorQUNfUkVRVUlSRShbTFRfRlVOQ19ETFNZTV9VU0NPUkVdKWRubAorQUNfUkVRVUlSRShbTFRfU1lTX0RMT1BFTl9ERVBMSUJTXSlkbmwKK0FDX1JFUVVJUkUoW2dsX0ZVTkNfQVJHWl0pZG5sCisKK200X3JlcXVpcmUoW19MVF9DSEVDS19PQkpESVJdKWRubAorbTRfcmVxdWlyZShbX0xUX0hFQURFUl9ETEZDTl0pZG5sCittNF9yZXF1aXJlKFtfTFRfQ0hFQ0tfRExQUkVPUEVOXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCisKK2RubCBEb24ndCByZXF1aXJlIHRoaXMsIG9yIGl0IHdpbGwgYmUgZXhwYW5kZWQgZWFybGllciB0aGFuIHRoZSBjb2RlCitkbmwgdGhhdCBzZXRzIHRoZSB2YXJpYWJsZXMgaXQgcmVsaWVzIG9uOgorX0xUX0VOQUJMRV9JTlNUQUxMCisKK2RubCBfTFRETF9NT0RFIHNwZWNpZmljIGNvZGUgbXVzdCBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZToKK19MVERMX01PREVfRElTUEFUQ0gKKworIyBJbiBvcmRlciB0aGF0IGx0ZGwuYyBjYW4gY29tcGlsZSwgZmluZCBvdXQgdGhlIGZpcnN0IEFDX0NPTkZJR19IRUFERVJTCisjIHRoZSB1c2VyIHVzZWQuICBUaGlzIGlzIHNvIHRoYXQgbHRkbC5oIGNhbiBwaWNrIHVwIHRoZSBwYXJlbnQgcHJvamVjdHMKKyMgY29uZmlnLmggZmlsZSwgVGhlIGZpcnN0IGZpbGUgaW4gQUNfQ09ORklHX0hFQURFUlMgbXVzdCBjb250YWluIHRoZQorIyBkZWZpbml0aW9ucyByZXF1aXJlZCBieSBsdGRsLmMuCisjIEZJWE1FOiBSZW1vdmUgdXNlIG9mIHVuZG9jdW1lbnRlZCBBQ19MSVNUX0hFQURFUlMgKDIuNTkgY29tcGF0aWJpbGl0eSkuCitBQ19DT05GSUdfQ09NTUFORFNfUFJFKFtkbmwKK200X3BhdHRlcm5fYWxsb3coW15MVF9DT05GSUdfSCRdKWRubAorbTRfaWZzZXQoW0FIX0hFQURFUl0sCisgICAgW0xUX0NPTkZJR19IPUFIX0hFQURFUl0sCisgICAgW200X2lmc2V0KFtBQ19MSVNUX0hFQURFUlNdLAorCSAgICBbTFRfQ09ORklHX0g9YGVjaG8gIkFDX0xJU1RfSEVBREVSUyIgfCAkU0VEICdzLF5bWyAgICAgIF1dKiwsO3MsW1sgOl1dLiokLCwnYF0sCisJW10pXSldKQorQUNfU1VCU1QoW0xUX0NPTkZJR19IXSkKKworQUNfQ0hFQ0tfSEVBREVSUyhbdW5pc3RkLmggZGwuaCBzeXMvZGwuaCBkbGQuaCBtYWNoLW8vZHlsZC5oIGRpcmVudC5oXSwKKwlbXSwgW10sIFtBQ19JTkNMVURFU19ERUZBVUxUXSkKKworQUNfQ0hFQ0tfRlVOQ1MoW2Nsb3NlZGlyIG9wZW5kaXIgcmVhZGRpcl0sIFtdLCBbQUNfTElCT0JKKFtsdF9fZGlyZW50XSldKQorQUNfQ0hFQ0tfRlVOQ1MoW3N0cmxjYXQgc3RybGNweV0sIFtdLCBbQUNfTElCT0JKKFtsdF9fc3RybF0pXSkKKworbTRfcGF0dGVybl9hbGxvdyhbTFRfTElCRVhUXSlkbmwKK0FDX0RFRklORV9VTlFVT1RFRChbTFRfTElCRVhUXSxbIiRsaWJleHQiXSxbVGhlIGFyY2hpdmUgZXh0ZW5zaW9uXSkKKworbmFtZT0KK2V2YWwgImx0X2xpYnByZWZpeD1cIiRsaWJuYW1lX3NwZWNcIiIKK200X3BhdHRlcm5fYWxsb3coW0xUX0xJQlBSRUZJWF0pZG5sCitBQ19ERUZJTkVfVU5RVU9URUQoW0xUX0xJQlBSRUZJWF0sWyIkbHRfbGlicHJlZml4Il0sW1RoZSBhcmNoaXZlIHByZWZpeF0pCisKK25hbWU9bHRkbAorZXZhbCAiTFRETE9QRU49XCIkbGlibmFtZV9zcGVjXCIiCitBQ19TVUJTVChbTFRETE9QRU5dKQorXSkjIF9MVERMX1NFVFVQCisKKworIyBfTFRfRU5BQkxFX0lOU1RBTEwKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19MVF9FTkFCTEVfSU5TVEFMTF0sCitbQUNfQVJHX0VOQUJMRShbbHRkbC1pbnN0YWxsXSwKKyAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWx0ZGwtaW5zdGFsbF0sIFtpbnN0YWxsIGxpYmx0ZGxdKV0pCisKK2Nhc2UgLCR7ZW5hYmxlX2x0ZGxfaW5zdGFsbH0sJHtlbmFibGVfbHRkbF9jb252ZW5pZW5jZX0gaW4KKyAgKnllcyopIDs7CisgICopIGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlPXllcyA7OworZXNhYworCittNF9pZmRlZihbQU1fQ09ORElUSU9OQUxdLAorW0FNX0NPTkRJVElPTkFMKElOU1RBTExfTFRETCwgdGVzdCB4IiR7ZW5hYmxlX2x0ZGxfaW5zdGFsbC1ub30iICE9IHhubykKKyBBTV9DT05ESVRJT05BTChDT05WRU5JRU5DRV9MVERMLCB0ZXN0IHgiJHtlbmFibGVfbHRkbF9jb252ZW5pZW5jZS1ub30iICE9IHhubyldKQorXSkjIF9MVF9FTkFCTEVfSU5TVEFMTAorCisKKyMgTFRfU1lTX0RMT1BFTl9ERVBMSUJTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX1NZU19ETE9QRU5fREVQTElCU10sCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgZGVwbGlicyBhcmUgbG9hZGVkIGJ5IGRsb3Blbl0sCisgIFtsdF9jdl9zeXNfZGxvcGVuX2RlcGxpYnNdLAorICBbIyBQT1JUTUUgZG9lcyB5b3VyIHN5c3RlbSBhdXRvbWF0aWNhbGx5IGxvYWQgZGVwbGlicyBmb3IgZGxvcGVuPworICAjIG9yIGl0cyBsb2dpY2FsIGVxdWl2YWxlbnQgKGUuZy4gc2hsX2xvYWQgZm9yIEhQLVVYIDwgMTEpCisgICMgRm9yIG5vdywgd2UganVzdCBjYXRjaCBPU2VzIHdlIGtub3cgc29tZXRoaW5nIGFib3V0IC0tIGluIHRoZQorICAjIGZ1dHVyZSwgd2UnbGwgdHJ5IHRlc3QgdGhpcyBwcm9ncmFtbWF0aWNhbGx5LgorICBsdF9jdl9zeXNfZGxvcGVuX2RlcGxpYnM9dW5rbm93bgorICBjYXNlICRob3N0X29zIGluCisgIGFpeDMqfGFpeDQuMS4qfGFpeDQuMi4qKQorICAgICMgVW5rbm93biB3aGV0aGVyIHRoaXMgaXMgdHJ1ZSBmb3IgdGhlc2UgdmVyc2lvbnMgb2YgQUlYLCBidXQKKyAgICAjIHdlIHdhbnQgdGhpcyBgY2FzZScgaGVyZSB0byBleHBsaWNpdGx5IGNhdGNoIHRob3NlIHZlcnNpb25zLgorICAgIGx0X2N2X3N5c19kbG9wZW5fZGVwbGlicz11bmtub3duCisgICAgOzsKKyAgYWl4W1s0LTldXSopCisgICAgbHRfY3Zfc3lzX2Rsb3Blbl9kZXBsaWJzPXllcworICAgIDs7CisgIGFtaWdhb3MqKQorICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgcG93ZXJwYykKKyAgICAgIGx0X2N2X3N5c19kbG9wZW5fZGVwbGlicz1ubworICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgZGFyd2luKikKKyAgICAjIEFzc3VtaW5nIHRoZSB1c2VyIGhhcyBpbnN0YWxsZWQgYSBsaWJkbCBmcm9tIHNvbWV3aGVyZSwgdGhpcyBpcyB0cnVlCisgICAgIyBJZiB5b3UgYXJlIGxvb2tpbmcgZm9yIG9uZSBodHRwOi8vd3d3Lm9wZW5kYXJ3aW4ub3JnL3Byb2plY3RzL2RsY29tcGF0CisgICAgbHRfY3Zfc3lzX2Rsb3Blbl9kZXBsaWJzPXllcworICAgIDs7CisgIGZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgICBsdF9jdl9zeXNfZGxvcGVuX2RlcGxpYnM9eWVzCisgICAgOzsKKyAgZ251KiB8IGxpbnV4KiB8IGsqYnNkKi1nbnUgfCBrb3BlbnNvbGFyaXMqLWdudSkKKyAgICAjIEdOVSBhbmQgaXRzIHZhcmlhbnRzLCB1c2luZyBnbnUgbGQuc28gKEdsaWJjKQorICAgIGx0X2N2X3N5c19kbG9wZW5fZGVwbGlicz15ZXMKKyAgICA7OworICBocHV4MTAqfGhwdXgxMSopCisgICAgbHRfY3Zfc3lzX2Rsb3Blbl9kZXBsaWJzPXllcworICAgIDs7CisgIGludGVyaXgqKQorICAgIGx0X2N2X3N5c19kbG9wZW5fZGVwbGlicz15ZXMKKyAgICA7OworICBpcml4W1sxMjM0NV1dKnxpcml4Ni5bWzAxXV0qKQorICAgICMgQ2F0Y2ggYWxsIHZlcnNpb25zIG9mIElSSVggYmVmb3JlIDYuMiwgYW5kIGluZGljYXRlIHRoYXQgd2UgZG9uJ3QKKyAgICAjIGtub3cgaG93IGl0IHdvcmtlZCBmb3IgYW55IG9mIHRob3NlIHZlcnNpb25zLgorICAgIGx0X2N2X3N5c19kbG9wZW5fZGVwbGlicz11bmtub3duCisgICAgOzsKKyAgaXJpeCopCisgICAgIyBUaGUgY2FzZSBhYm92ZSBjYXRjaGVzIGFueXRoaW5nIGJlZm9yZSA2LjIsIGFuZCBpdCdzIGtub3duIHRoYXQKKyAgICAjIGF0IDYuMiBhbmQgbGF0ZXIgZGxvcGVuIGRvZXMgbG9hZCBkZXBsaWJzLgorICAgIGx0X2N2X3N5c19kbG9wZW5fZGVwbGlicz15ZXMKKyAgICA7OworICBuZXRic2QqKQorICAgIGx0X2N2X3N5c19kbG9wZW5fZGVwbGlicz15ZXMKKyAgICA7OworICBvcGVuYnNkKikKKyAgICBsdF9jdl9zeXNfZGxvcGVuX2RlcGxpYnM9eWVzCisgICAgOzsKKyAgb3NmW1sxMjM0XV0qKQorICAgICMgZGxvcGVuIGRpZCBsb2FkIGRlcGxpYnMgKGF0IGxlYXN0IGF0IDQueCksIGJ1dCB1bnRpbCB0aGUgNS54IHNlcmllcywKKyAgICAjIGl0IGRpZCAqbm90KiB1c2UgYW4gUlBBVEggaW4gYSBzaGFyZWQgbGlicmFyeSB0byBmaW5kIG9iamVjdHMgdGhlCisgICAgIyBsaWJyYXJ5IGRlcGVuZHMgb24sIHNvIHdlIGV4cGxpY2l0bHkgc2F5IGBubycuCisgICAgbHRfY3Zfc3lzX2Rsb3Blbl9kZXBsaWJzPW5vCisgICAgOzsKKyAgb3NmNS4wfG9zZjUuMGF8b3NmNS4xKQorICAgICMgZGxvcGVuICpkb2VzKiBsb2FkIGRlcGxpYnMgYW5kIHdpdGggdGhlIHJpZ2h0IGxvYWRlciBwYXRjaCBhcHBsaWVkCisgICAgIyBpdCBldmVuIHVzZXMgUlBBVEggaW4gYSBzaGFyZWQgbGlicmFyeSB0byBzZWFyY2ggZm9yIHNoYXJlZCBvYmplY3RzCisgICAgIyB0aGF0IHRoZSBsaWJyYXJ5IGRlcGVuZHMgb24sIGJ1dCB0aGVyZSdzIG5vIGVhc3kgd2F5IHRvIGtub3cgaWYgdGhhdAorICAgICMgcGF0Y2ggaXMgaW5zdGFsbGVkLiAgU2luY2UgdGhpcyBpcyB0aGUgY2FzZSwgYWxsIHdlIGNhbiByZWFsbHkKKyAgICAjIHNheSBpcyB1bmtub3duIC0tIGl0IGRlcGVuZHMgb24gdGhlIHBhdGNoIGJlaW5nIGluc3RhbGxlZC4gIElmCisgICAgIyBpdCBpcywgdGhpcyBjaGFuZ2VzIHRvIGB5ZXMnLiAgV2l0aG91dCBpdCwgaXQgd291bGQgYmUgYG5vJy4KKyAgICBsdF9jdl9zeXNfZGxvcGVuX2RlcGxpYnM9dW5rbm93bgorICAgIDs7CisgIG9zZiopCisgICAgIyB0aGUgdHdvIGNhc2VzIGFib3ZlIHNob3VsZCBjYXRjaCBhbGwgdmVyc2lvbnMgb2Ygb3NmIDw9IDUuMS4gIFJlYWQKKyAgICAjIHRoZSBjb21tZW50cyBhYm92ZSBmb3Igd2hhdCB3ZSBrbm93IGFib3V0IHRoZW0uCisgICAgIyBBdCA+IDUuMSwgZGVwbGlicyBhcmUgbG9hZGVkICphbmQqIGFueSBSUEFUSCBpbiBhIHNoYXJlZCBsaWJyYXJ5CisgICAgIyBpcyB1c2VkIHRvIGZpbmQgdGhlbSBzbyB3ZSBjYW4gZmluYWxseSBzYXkgYHllcycuCisgICAgbHRfY3Zfc3lzX2Rsb3Blbl9kZXBsaWJzPXllcworICAgIDs7CisgIHFueCopCisgICAgbHRfY3Zfc3lzX2Rsb3Blbl9kZXBsaWJzPXllcworICAgIDs7CisgIHNvbGFyaXMqKQorICAgIGx0X2N2X3N5c19kbG9wZW5fZGVwbGlicz15ZXMKKyAgICA7OworICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKKyAgICBsaWJsdGRsX2N2X3N5c19kbG9wZW5fZGVwbGlicz15ZXMKKyAgICA7OworICBlc2FjCisgIF0pCitpZiB0ZXN0ICIkbHRfY3Zfc3lzX2Rsb3Blbl9kZXBsaWJzIiAhPSB5ZXM7IHRoZW4KKyBBQ19ERUZJTkUoW0xURExfRExPUEVOX0RFUExJQlNdLCBbMV0sCisgICAgW0RlZmluZSBpZiB0aGUgT1MgbmVlZHMgaGVscCB0byBsb2FkIGRlcGVuZGVudCBsaWJyYXJpZXMgZm9yIGRsb3BlbigpLl0pCitmaQorXSkjIExUX1NZU19ETE9QRU5fREVQTElCUworCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX0xURExfU1lTX0RMT1BFTl9ERVBMSUJTXSwgW0xUX1NZU19ETE9QRU5fREVQTElCU10pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xURExfU1lTX0RMT1BFTl9ERVBMSUJTXSwgW10pCisKKworIyBMVF9TWVNfTU9EVUxFX0VYVAorIyAtLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX1NZU19NT0RVTEVfRVhUXSwKK1ttNF9yZXF1aXJlKFtfTFRfU1lTX0RZTkFNSUNfTElOS0VSXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFt3aGljaCBleHRlbnNpb24gaXMgdXNlZCBmb3IgcnVudGltZSBsb2FkYWJsZSBtb2R1bGVzXSwKKyAgW2xpYmx0ZGxfY3Zfc2hsaWJleHRdLAorWworbW9kdWxlPXllcworZXZhbCBsaWJsdGRsX2N2X3NobGliZXh0PSRzaHJleHRfY21kcworbW9kdWxlPW5vCitldmFsIGxpYmx0ZGxfY3Zfc2hyZXh0PSRzaHJleHRfY21kcworICBdKQoraWYgdGVzdCAtbiAiJGxpYmx0ZGxfY3Zfc2hsaWJleHQiOyB0aGVuCisgIG00X3BhdHRlcm5fYWxsb3coW0xUX01PRFVMRV9FWFRdKWRubAorICBBQ19ERUZJTkVfVU5RVU9URUQoW0xUX01PRFVMRV9FWFRdLCBbIiRsaWJsdGRsX2N2X3NobGliZXh0Il0sCisgICAgW0RlZmluZSB0byB0aGUgZXh0ZW5zaW9uIHVzZWQgZm9yIHJ1bnRpbWUgbG9hZGFibGUgbW9kdWxlcywgc2F5LCAiLnNvIi5dKQorZmkKK2lmIHRlc3QgIiRsaWJsdGRsX2N2X3NocmV4dCIgIT0gIiRsaWJsdGRsX2N2X3NobGliZXh0IjsgdGhlbgorICBtNF9wYXR0ZXJuX2FsbG93KFtMVF9TSEFSRURfRVhUXSlkbmwKKyAgQUNfREVGSU5FX1VOUVVPVEVEKFtMVF9TSEFSRURfRVhUXSwgWyIkbGlibHRkbF9jdl9zaHJleHQiXSwKKyAgICBbRGVmaW5lIHRvIHRoZSBzaGFyZWQgbGlicmFyeSBzdWZmaXgsIHNheSwgIi5keWxpYiIuXSkKK2ZpCitdKSMgTFRfU1lTX01PRFVMRV9FWFQKKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtBQ19MVERMX1NITElCRVhUXSwgW0xUX1NZU19NT0RVTEVfRVhUXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTFRETF9TSExJQkVYVF0sIFtdKQorCisKKyMgTFRfU1lTX01PRFVMRV9QQVRICisjIC0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX1NZU19NT0RVTEVfUEFUSF0sCitbbTRfcmVxdWlyZShbX0xUX1NZU19EWU5BTUlDX0xJTktFUl0pZG5sCitBQ19DQUNIRV9DSEVDSyhbd2hpY2ggdmFyaWFibGUgc3BlY2lmaWVzIHJ1bi10aW1lIG1vZHVsZSBzZWFyY2ggcGF0aF0sCisgIFtsdF9jdl9tb2R1bGVfcGF0aF92YXJdLCBbbHRfY3ZfbW9kdWxlX3BhdGhfdmFyPSIkc2hsaWJwYXRoX3ZhciJdKQoraWYgdGVzdCAtbiAiJGx0X2N2X21vZHVsZV9wYXRoX3ZhciI7IHRoZW4KKyAgbTRfcGF0dGVybl9hbGxvdyhbTFRfTU9EVUxFX1BBVEhfVkFSXSlkbmwKKyAgQUNfREVGSU5FX1VOUVVPVEVEKFtMVF9NT0RVTEVfUEFUSF9WQVJdLCBbIiRsdF9jdl9tb2R1bGVfcGF0aF92YXIiXSwKKyAgICBbRGVmaW5lIHRvIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB0aGF0IGRldGVybWluZXMgdGhlIHJ1bi10aW1lIG1vZHVsZSBzZWFyY2ggcGF0aC5dKQorZmkKK10pIyBMVF9TWVNfTU9EVUxFX1BBVEgKKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtBQ19MVERMX1NITElCUEFUSF0sIFtMVF9TWVNfTU9EVUxFX1BBVEhdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MVERMX1NITElCUEFUSF0sIFtdKQorCisKKyMgTFRfU1lTX0RMU0VBUkNIX1BBVEgKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtMVF9TWVNfRExTRUFSQ0hfUEFUSF0sCitbbTRfcmVxdWlyZShbX0xUX1NZU19EWU5BTUlDX0xJTktFUl0pZG5sCitBQ19DQUNIRV9DSEVDSyhbZm9yIHRoZSBkZWZhdWx0IGxpYnJhcnkgc2VhcmNoIHBhdGhdLAorICBbbHRfY3Zfc3lzX2Rsc2VhcmNoX3BhdGhdLAorICBbbHRfY3Zfc3lzX2Rsc2VhcmNoX3BhdGg9IiRzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyJdKQoraWYgdGVzdCAtbiAiJGx0X2N2X3N5c19kbHNlYXJjaF9wYXRoIjsgdGhlbgorICBzeXNfZGxzZWFyY2hfcGF0aD0KKyAgZm9yIGRpciBpbiAkbHRfY3Zfc3lzX2Rsc2VhcmNoX3BhdGg7IGRvCisgICAgaWYgdGVzdCAteiAiJHN5c19kbHNlYXJjaF9wYXRoIjsgdGhlbgorICAgICAgc3lzX2Rsc2VhcmNoX3BhdGg9IiRkaXIiCisgICAgZWxzZQorICAgICAgc3lzX2Rsc2VhcmNoX3BhdGg9IiRzeXNfZGxzZWFyY2hfcGF0aCRQQVRIX1NFUEFSQVRPUiRkaXIiCisgICAgZmkKKyAgZG9uZQorICBtNF9wYXR0ZXJuX2FsbG93KFtMVF9ETFNFQVJDSF9QQVRIXSlkbmwKKyAgQUNfREVGSU5FX1VOUVVPVEVEKFtMVF9ETFNFQVJDSF9QQVRIXSwgWyIkc3lzX2Rsc2VhcmNoX3BhdGgiXSwKKyAgICBbRGVmaW5lIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBsaWJyYXJ5IHNlYXJjaCBwYXRoLl0pCitmaQorXSkjIExUX1NZU19ETFNFQVJDSF9QQVRICisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbQUNfTFRETF9TWVNTRUFSQ0hQQVRIXSwgW0xUX1NZU19ETFNFQVJDSF9QQVRIXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTFRETF9TWVNTRUFSQ0hQQVRIXSwgW10pCisKKworIyBfTFRfQ0hFQ0tfRExQUkVPUEVOCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfQ0hFQ0tfRExQUkVPUEVOXSwKK1ttNF9yZXF1aXJlKFtfTFRfQ01EX0dMT0JBTF9TWU1CT0xTXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGxpYnRvb2wgc3VwcG9ydHMgLWRsb3Blbi8tZGxwcmVvcGVuXSwKKyAgW2xpYmx0ZGxfY3ZfcHJlbG9hZGVkX3N5bWJvbHNdLAorICBbaWYgdGVzdCAtbiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisgICAgbGlibHRkbF9jdl9wcmVsb2FkZWRfc3ltYm9scz15ZXMKKyAgZWxzZQorICAgIGxpYmx0ZGxfY3ZfcHJlbG9hZGVkX3N5bWJvbHM9bm8KKyAgZmkKKyAgXSkKK2lmIHRlc3QgeCIkbGlibHRkbF9jdl9wcmVsb2FkZWRfc3ltYm9scyIgPSB4eWVzOyB0aGVuCisgIEFDX0RFRklORShbSEFWRV9QUkVMT0FERURfU1lNQk9MU10sIFsxXSwKKyAgICBbRGVmaW5lIGlmIGxpYnRvb2wgY2FuIGV4dHJhY3Qgc3ltYm9sIGxpc3RzIGZyb20gb2JqZWN0IGZpbGVzLl0pCitmaQorXSkjIF9MVF9DSEVDS19ETFBSRU9QRU4KKworCisjIExUX0xJQl9ETExPQUQKKyMgLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX0xJQl9ETExPQURdLAorW200X3BhdHRlcm5fYWxsb3coW15MVF9ETExPQURFUlMkXSkKK0xUX0RMTE9BREVSUz0KK0FDX1NVQlNUKFtMVF9ETExPQURFUlNdKQorCitBQ19MQU5HX1BVU0goW0NdKQorCitMSUJBRERfRExPUEVOPQorQUNfU0VBUkNIX0xJQlMoW2Rsb3Blbl0sIFtkbF0sCisJW0FDX0RFRklORShbSEFWRV9MSUJETF0sIFsxXSwKKwkJICAgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbGliZGwgbGlicmFyeSBvciBlcXVpdmFsZW50Ll0pCisJaWYgdGVzdCAiJGFjX2N2X3NlYXJjaF9kbG9wZW4iICE9ICJub25lIHJlcXVpcmVkIiA7IHRoZW4KKwkgIExJQkFERF9ETE9QRU49Ii1sZGwiCisJZmkKKwlsaWJsdGRsX2N2X2xpYl9kbF9kbG9wZW49InllcyIKKwlMVF9ETExPQURFUlM9IiRMVF9ETExPQURFUlMgJHtsdF9kbG9wZW5fZGlyKyRsdF9kbG9wZW5fZGlyL31kbG9wZW4ubGEiXSwKKyAgICBbQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyNpZiBIQVZFX0RMRkNOX0gKKyMgIGluY2x1ZGUgPGRsZmNuLmg+CisjZW5kaWYKKyAgICBdXSwgW1tkbG9wZW4oMCwgMCk7XV0pXSwKKwkgICAgW0FDX0RFRklORShbSEFWRV9MSUJETF0sIFsxXSwKKwkJICAgICAgIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGxpYmRsIGxpYnJhcnkgb3IgZXF1aXZhbGVudC5dKQorCSAgICBsaWJsdGRsX2N2X2Z1bmNfZGxvcGVuPSJ5ZXMiCisJICAgIExUX0RMTE9BREVSUz0iJExUX0RMTE9BREVSUyAke2x0X2Rsb3Blbl9kaXIrJGx0X2Rsb3Blbl9kaXIvfWRsb3Blbi5sYSJdLAorCVtBQ19DSEVDS19MSUIoW3N2bGRdLCBbZGxvcGVuXSwKKwkJW0FDX0RFRklORShbSEFWRV9MSUJETF0sIFsxXSwKKwkJCSBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBsaWJkbCBsaWJyYXJ5IG9yIGVxdWl2YWxlbnQuXSkKKwkgICAgICAgIExJQkFERF9ETE9QRU49Ii1sc3ZsZCIgbGlibHRkbF9jdl9mdW5jX2Rsb3Blbj0ieWVzIgorCQlMVF9ETExPQURFUlM9IiRMVF9ETExPQURFUlMgJHtsdF9kbG9wZW5fZGlyKyRsdF9kbG9wZW5fZGlyL31kbG9wZW4ubGEiXSldKV0pCitpZiB0ZXN0IHgiJGxpYmx0ZGxfY3ZfZnVuY19kbG9wZW4iID0geHllcyB8fCB0ZXN0IHgiJGxpYmx0ZGxfY3ZfbGliX2RsX2Rsb3BlbiIgPSB4eWVzCit0aGVuCisgIGx0X3NhdmVfTElCUz0iJExJQlMiCisgIExJQlM9IiRMSUJTICRMSUJBRERfRExPUEVOIgorICBBQ19DSEVDS19GVU5DUyhbZGxlcnJvcl0pCisgIExJQlM9IiRsdF9zYXZlX0xJQlMiCitmaQorQUNfU1VCU1QoW0xJQkFERF9ETE9QRU5dKQorCitMSUJBRERfU0hMX0xPQUQ9CitBQ19DSEVDS19GVU5DKFtzaGxfbG9hZF0sCisJW0FDX0RFRklORShbSEFWRV9TSExfTE9BRF0sIFsxXSwKKwkJICAgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2hsX2xvYWQgZnVuY3Rpb24uXSkKKwlMVF9ETExPQURFUlM9IiRMVF9ETExPQURFUlMgJHtsdF9kbG9wZW5fZGlyKyRsdF9kbG9wZW5fZGlyL31zaGxfbG9hZC5sYSJdLAorICAgIFtBQ19DSEVDS19MSUIoW2RsZF0sIFtzaGxfbG9hZF0sCisJICAgIFtBQ19ERUZJTkUoW0hBVkVfU0hMX0xPQURdLCBbMV0sCisJCSAgICAgICBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzaGxfbG9hZCBmdW5jdGlvbi5dKQorCSAgICBMVF9ETExPQURFUlM9IiRMVF9ETExPQURFUlMgJHtsdF9kbG9wZW5fZGlyKyRsdF9kbG9wZW5fZGlyL31zaGxfbG9hZC5sYSIKKwkgICAgTElCQUREX1NITF9MT0FEPSItbGRsZCJdKV0pCitBQ19TVUJTVChbTElCQUREX1NITF9MT0FEXSkKKworY2FzZSAkaG9zdF9vcyBpbgorZGFyd2luW1sxNTY3XV0uKikKKyMgV2Ugb25seSB3YW50IHRoaXMgZm9yIHByZS1NYWMgT1MgWCAxMC40LgorICBBQ19DSEVDS19GVU5DKFtfZHlsZF9mdW5jX2xvb2t1cF0sCisJW0FDX0RFRklORShbSEFWRV9EWUxEXSwgWzFdLAorCQkgICBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfZHlsZF9mdW5jX2xvb2t1cCBmdW5jdGlvbi5dKQorCUxUX0RMTE9BREVSUz0iJExUX0RMTE9BREVSUyAke2x0X2Rsb3Blbl9kaXIrJGx0X2Rsb3Blbl9kaXIvfWR5bGQubGEiXSkKKyAgOzsKK2Jlb3MqKQorICBMVF9ETExPQURFUlM9IiRMVF9ETExPQURFUlMgJHtsdF9kbG9wZW5fZGlyKyRsdF9kbG9wZW5fZGlyL31sb2FkX2FkZF9vbi5sYSIKKyAgOzsKK2N5Z3dpbiogfCBtaW5ndyogfCBvczIqIHwgcHczMiopCisgIEFDX0NIRUNLX0RFQ0xTKFtjeWd3aW5fY29udl9wYXRoXSwgW10sIFtdLCBbWyNpbmNsdWRlIDxzeXMvY3lnd2luLmg+XV0pCisgIExUX0RMTE9BREVSUz0iJExUX0RMTE9BREVSUyAke2x0X2Rsb3Blbl9kaXIrJGx0X2Rsb3Blbl9kaXIvfWxvYWRsaWJyYXJ5LmxhIgorICA7OworZXNhYworCitBQ19DSEVDS19MSUIoW2RsZF0sIFtkbGRfbGlua10sCisJW0FDX0RFRklORShbSEFWRV9ETERdLCBbMV0sCisJCSAgIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEdOVSBkbGQgbGlicmFyeS5dKQorCQlMVF9ETExPQURFUlM9IiRMVF9ETExPQURFUlMgJHtsdF9kbG9wZW5fZGlyKyRsdF9kbG9wZW5fZGlyL31kbGRfbGluay5sYSJdKQorQUNfU1VCU1QoW0xJQkFERF9ETERfTElOS10pCisKK200X3BhdHRlcm5fYWxsb3coW15MVF9ETFBSRU9QRU4kXSkKK0xUX0RMUFJFT1BFTj0KK2lmIHRlc3QgLW4gIiRMVF9ETExPQURFUlMiCit0aGVuCisgIGZvciBsdF9sb2FkZXIgaW4gJExUX0RMTE9BREVSUzsgZG8KKyAgICBMVF9ETFBSRU9QRU49IiRMVF9ETFBSRU9QRU4tZGxwcmVvcGVuICRsdF9sb2FkZXIgIgorICBkb25lCisgIEFDX0RFRklORShbSEFWRV9MSUJETExPQURFUl0sIFsxXSwKKyAgICAgICAgICAgIFtEZWZpbmUgaWYgbGliZGxsb2FkZXIgd2lsbCBiZSBidWlsdCBvbiB0aGlzIHBsYXRmb3JtXSkKK2ZpCitBQ19TVUJTVChbTFRfRExQUkVPUEVOXSkKKworZG5sIFRoaXMgaXNuJ3QgdXNlZCBhbnltb3JlLCBidXQgc2V0IGl0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorTElCQUREX0RMPSIkTElCQUREX0RMT1BFTiAkTElCQUREX1NITF9MT0FEIgorQUNfU1VCU1QoW0xJQkFERF9ETF0pCisKK0FDX0xBTkdfUE9QCitdKSMgTFRfTElCX0RMTE9BRAorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX0xURExfRExMSUJdLCBbTFRfTElCX0RMTE9BRF0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xURExfRExMSUJdLCBbXSkKKworCisjIExUX1NZU19TWU1CT0xfVVNDT1JFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGRvZXMgdGhlIGNvbXBpbGVyIHByZWZpeCBnbG9iYWwgc3ltYm9scyB3aXRoIGFuIHVuZGVyc2NvcmU/CitBQ19ERUZVTihbTFRfU1lTX1NZTUJPTF9VU0NPUkVdLAorW200X3JlcXVpcmUoW19MVF9DTURfR0xPQkFMX1NZTUJPTFNdKWRubAorQUNfQ0FDSEVfQ0hFQ0soW2ZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzXSwKKyAgW2x0X2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZV0sCisgIFtsdF9jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKK3ZvaWQgbm1fdGVzdF9mdW5jKCl7fQoraW50IG1haW4oKXtubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQorX0xUX0VPRgorICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgorICAgIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCisgICAgaWYgQUNfVFJZX0VWQUwoTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KKyAgICAgICMgU2VlIHdoZXRoZXIgdGhlIHN5bWJvbHMgaGF2ZSBhIGxlYWRpbmcgdW5kZXJzY29yZS4KKyAgICAgIGlmIGdyZXAgJ14uIF9ubV90ZXN0X2Z1bmMnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgbHRfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcworICAgICAgZWxzZQorICAgICAgICBpZiBncmVwICdeLiBubV90ZXN0X2Z1bmMgJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCisJICA6CisgICAgICAgIGVsc2UKKwkgIGVjaG8gImNvbmZpZ3VyZTogY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgICBmaQorICAgICAgZmkKKyAgICBlbHNlCisgICAgICBlY2hvICJjb25maWd1cmU6IGNhbm5vdCBydW4gJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICBmaQorICBlbHNlCisgICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgY2F0IGNvbmZ0ZXN0LmMgPiZBU19NRVNTQUdFX0xPR19GRAorICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIF0pCisgIHN5c19zeW1ib2xfdW5kZXJzY29yZT0kbHRfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlCisgIEFDX1NVQlNUKFtzeXNfc3ltYm9sX3VuZGVyc2NvcmVdKQorXSkjIExUX1NZU19TWU1CT0xfVVNDT1JFCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbQUNfTFRETF9TWU1CT0xfVVNDT1JFXSwgW0xUX1NZU19TWU1CT0xfVVNDT1JFXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTFRETF9TWU1CT0xfVVNDT1JFXSwgW10pCisKKworIyBMVF9GVU5DX0RMU1lNX1VTQ09SRQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX0ZVTkNfRExTWU1fVVNDT1JFXSwKK1tBQ19SRVFVSVJFKFtMVF9TWVNfU1lNQk9MX1VTQ09SRV0pZG5sCitpZiB0ZXN0IHgiJGx0X2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSIgPSB4eWVzOyB0aGVuCisgIGlmIHRlc3QgeCIkbGlibHRkbF9jdl9mdW5jX2Rsb3BlbiIgPSB4eWVzIHx8CisgICAgIHRlc3QgeCIkbGlibHRkbF9jdl9saWJfZGxfZGxvcGVuIiA9IHh5ZXMgOyB0aGVuCisJQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgd2UgaGF2ZSB0byBhZGQgYW4gdW5kZXJzY29yZSBmb3IgZGxzeW1dLAorCSAgW2xpYmx0ZGxfY3ZfbmVlZF91c2NvcmVdLAorCSAgW2xpYmx0ZGxfY3ZfbmVlZF91c2NvcmU9dW5rbm93bgorICAgICAgICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgICAgICAgTElCUz0iJExJQlMgJExJQkFERF9ETE9QRU4iCisJICBfTFRfVFJZX0RMT1BFTl9TRUxGKAorCSAgICBbbGlibHRkbF9jdl9uZWVkX3VzY29yZT1ub10sIFtsaWJsdGRsX2N2X25lZWRfdXNjb3JlPXllc10sCisJICAgIFtdLAkJCQkgW2xpYmx0ZGxfY3ZfbmVlZF91c2NvcmU9Y3Jvc3NdKQorCSAgTElCUz0iJHNhdmVfTElCUyIKKwldKQorICBmaQorZmkKKworaWYgdGVzdCB4IiRsaWJsdGRsX2N2X25lZWRfdXNjb3JlIiA9IHh5ZXM7IHRoZW4KKyAgQUNfREVGSU5FKFtORUVEX1VTQ09SRV0sIFsxXSwKKyAgICBbRGVmaW5lIGlmIGRsc3ltKCkgcmVxdWlyZXMgYSBsZWFkaW5nIHVuZGVyc2NvcmUgaW4gc3ltYm9sIG5hbWVzLl0pCitmaQorXSkjIExUX0ZVTkNfRExTWU1fVVNDT1JFCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbQUNfTFRETF9ETFNZTV9VU0NPUkVdLCBbTFRfRlVOQ19ETFNZTV9VU0NPUkVdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MVERMX0RMU1lNX1VTQ09SRV0sIFtdKQorCisjIENvcHlyaWdodCAoQykgMjAwMi0yMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogIwogIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgogIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAogIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCiAKKyMgc2VyaWFsIDgKKwogIyBBTV9BVVRPTUFLRV9WRVJTSU9OKFZFUlNJT04pCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgQXV0b21ha2UgWC5ZIHRyYWNlcyB0aGlzIG1hY3JvIHRvIGVuc3VyZSBhY2xvY2FsLm00IGhhcyBiZWVuCiAjIGdlbmVyYXRlZCBmcm9tIHRoZSBtNCBmaWxlcyBhY2NvbXBhbnlpbmcgQXV0b21ha2UgWC5ZLgogIyAoVGhpcyBwcml2YXRlIG1hY3JvIHNob3VsZCBub3QgYmUgY2FsbGVkIG91dHNpZGUgdGhpcyBmaWxlLikKIEFDX0RFRlVOKFtBTV9BVVRPTUFLRV9WRVJTSU9OXSwKLVthbV9fYXBpX3ZlcnNpb249JzEuMTEnCitbYW1fX2FwaV92ZXJzaW9uPScxLjEyJwogZG5sIFNvbWUgdXNlcnMgZmluZCBBTV9BVVRPTUFLRV9WRVJTSU9OIGFuZCBtaXN0YWtlIGl0IGZvciBhIHdheSB0bwogZG5sIHJlcXVpcmUgc29tZSBtaW5pbXVtIHZlcnNpb24uICBQb2ludCB0aGVtIHRvIHRoZSByaWdodCBtYWNyby4KLW00X2lmKFskMV0sIFsxLjExLjFdLCBbXSwKK200X2lmKFskMV0sIFsxLjEyLjJdLCBbXSwKICAgICAgIFtBQ19GQVRBTChbRG8gbm90IGNhbGwgJDAsIHVzZSBBTV9JTklUX0FVVE9NQUtFKFskMV0pLl0pXSlkbmwKIF0pCiAKQEAgLTUwLDE0ICs4NzAsMTQgQEAKICMgQ2FsbCBBTV9BVVRPTUFLRV9WRVJTSU9OIGFuZCBBTV9BVVRPTUFLRV9WRVJTSU9OIHNvIHRoZXkgY2FuIGJlIHRyYWNlZC4KICMgVGhpcyBmdW5jdGlvbiBpcyBBQ19SRVFVSVJFZCBieSBBTV9JTklUX0FVVE9NQUtFLgogQUNfREVGVU4oW0FNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT05dLAotW0FNX0FVVE9NQUtFX1ZFUlNJT04oWzEuMTEuMV0pZG5sCitbQU1fQVVUT01BS0VfVkVSU0lPTihbMS4xMi4yXSlkbmwKIG00X2lmbmRlZihbQUNfQVVUT0NPTkZfVkVSU0lPTl0sCiAgIFttNF9jb3B5KFttNF9QQUNLQUdFX1ZFUlNJT05dLCBbQUNfQVVUT0NPTkZfVkVSU0lPTl0pXSlkbmwKIF9BTV9BVVRPQ09ORl9WRVJTSU9OKG00X2RlZm4oW0FDX0FVVE9DT05GX1ZFUlNJT05dKSldKQogCiAjIEZpZ3VyZSBvdXQgaG93IHRvIHJ1biB0aGUgYXNzZW1ibGVyLiAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCiAKLSMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAjCiAjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCiAjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCkBAIC03OSwxNSArODk5LDE3IEBACiAKICMgQU1fQVVYX0RJUl9FWFBBTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KIAotIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICMKICMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KICMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKICMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgogCisjIHNlcmlhbCAyCisKICMgRm9yIHByb2plY3RzIHVzaW5nIEFDX0NPTkZJR19BVVhfRElSKFtmb29dKSwgQXV0b2NvbmYgc2V0cwotIyAkYWNfYXV4X2RpciB0byBgJHNyY2Rpci9mb28nLiAgSW4gb3RoZXIgcHJvamVjdHMsIGl0IGlzIHNldCB0bwotIyBgJHNyY2RpcicsIGAkc3JjZGlyLy4uJywgb3IgYCRzcmNkaXIvLi4vLi4nLgorIyAkYWNfYXV4X2RpciB0byAnJHNyY2Rpci9mb28nLiAgSW4gb3RoZXIgcHJvamVjdHMsIGl0IGlzIHNldCB0bworIyAnJHNyY2RpcicsICckc3JjZGlyLy4uJywgb3IgJyRzcmNkaXIvLi4vLi4nLgogIwogIyBPZiBjb3Vyc2UsIEF1dG9tYWtlIG11c3QgaG9ub3IgdGhpcyB2YXJpYWJsZSB3aGVuZXZlciBpdCBjYWxscyBhCiAjIHRvb2wgZnJvbSB0aGUgYXV4aWxpYXJ5IGRpcmVjdG9yeS4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgJHNyY2RpciAoYW5kCkBAIC0xMDYsNyArOTI4LDcgQEAKICMKICMgVGhlIHJlYXNvbiBvZiB0aGUgbGF0dGVyIGZhaWx1cmUgaXMgdGhhdCAkdG9wX3NyY2RpciBhbmQgJGFjX2F1eF9kaXIKICMgYXJlIGJvdGggcHJlZml4ZWQgYnkgJHNyY2Rpci4gIEluIGFuIGluLXNvdXJjZSBidWlsZCB0aGlzIGlzIHVzdWFsbHkKLSMgaGFybWxlc3MgYmVjYXVzZSAkc3JjZGlyIGlzIGAuJywgYnV0IHRoaW5ncyB3aWxsIGJyb2tlIHdoZW4geW91CisjIGhhcm1sZXNzIGJlY2F1c2UgJHNyY2RpciBpcyAnLicsIGJ1dCB0aGluZ3Mgd2lsbCBicm9rZSB3aGVuIHlvdQogIyBzdGFydCBhIFZQQVRIIGJ1aWxkIG9yIHVzZSBhbiBhYnNvbHV0ZSAkc3JjZGlyLgogIwogIyBTbyB3ZSBjb3VsZCB1c2Ugc29tZXRoaW5nIHNpbWlsYXIgdG8gJHRvcF9zcmNkaXIvJGFjX2F1eF9kaXIvbWlzc2luZywKQEAgLTEzMiwyMiArOTU0LDIxIEBACiAKICMgQU1fQ09ORElUSU9OQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KIAotIyBDb3B5cmlnaHQgKEMpIDE5OTcsIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDgKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogIwogIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgogIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAogIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCiAKLSMgc2VyaWFsIDkKKyMgc2VyaWFsIDEwCiAKICMgQU1fQ09ORElUSU9OQUwoTkFNRSwgU0hFTEwtQ09ORElUSU9OKQogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIERlZmluZSBhIGNvbmRpdGlvbmFsLgogQUNfREVGVU4oW0FNX0NPTkRJVElPTkFMXSwKLVtBQ19QUkVSRVEoMi41MilkbmwKLSBpZmVsc2UoWyQxXSwgW1RSVUVdLCAgW0FDX0ZBVEFMKFskMDogaW52YWxpZCBjb25kaXRpb246ICQxXSldLAotCVskMV0sIFtGQUxTRV0sIFtBQ19GQVRBTChbJDA6IGludmFsaWQgY29uZGl0aW9uOiAkMV0pXSlkbmwKK1tBQ19QUkVSRVEoWzIuNTJdKWRubAorIG00X2lmKFskMV0sIFtUUlVFXSwgIFtBQ19GQVRBTChbJDA6IGludmFsaWQgY29uZGl0aW9uOiAkMV0pXSwKKyAgICAgICBbJDFdLCBbRkFMU0VdLCBbQUNfRkFUQUwoWyQwOiBpbnZhbGlkIGNvbmRpdGlvbjogJDFdKV0pZG5sCiBBQ19TVUJTVChbJDFfVFJVRV0pZG5sCiBBQ19TVUJTVChbJDFfRkFMU0VdKWRubAogX0FNX1NVQlNUX05PVE1BS0UoWyQxX1RSVUVdKWRubApAQCAtMTY2LDE2ICs5ODcsMTUgQEAKIFVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5Ll1dKQogZmldKV0pCiAKLSMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA5Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICMKICMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KICMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKICMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgogCi0jIHNlcmlhbCAxMAorIyBzZXJpYWwgMTcKIAotIyBUaGVyZSBhcmUgYSBmZXcgZGlydHkgaGFja3MgYmVsb3cgdG8gYXZvaWQgbGV0dGluZyBgQUNfUFJPR19DQycgYmUKKyMgVGhlcmUgYXJlIGEgZmV3IGRpcnR5IGhhY2tzIGJlbG93IHRvIGF2b2lkIGxldHRpbmcgJ0FDX1BST0dfQ0MnIGJlCiAjIHdyaXR0ZW4gaW4gY2xlYXIsIGluIHdoaWNoIGNhc2UgYXV0b21ha2UsIHdoZW4gcmVhZGluZyBhY2xvY2FsLm00LAogIyB3aWxsIHRoaW5rIGl0IHNlZXMgYSAqdXNlKiwgYW5kIHRoZXJlZm9yZSB3aWxsIHRyaWdnZXIgYWxsIGl0J3MKICMgQyBzdXBwb3J0IG1hY2hpbmVyeS4gIEFsc28gbm90ZSB0aGF0IGl0IG1lYW5zIHRoYXQgYXV0b3NjYW4sIHNlZWluZwpAQCAtMTg1LDcgKzEwMDUsNyBAQAogIyBfQU1fREVQRU5ERU5DSUVTKE5BTUUpCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgU2VlIGhvdyB0aGUgY29tcGlsZXIgaW1wbGVtZW50cyBkZXBlbmRlbmN5IGNoZWNraW5nLgotIyBOQU1FIGlzICJDQyIsICJDWFgiLCAiR0NKIiwgb3IgIk9CSkMiLgorIyBOQU1FIGlzICJDQyIsICJDWFgiLCAiT0JKQyIsICJPQkpDWFgiLCAiVVBDIiwgb3IgIkdKQyIuCiAjIFdlIHRyeSBhIGZldyB0ZWNobmlxdWVzIGFuZCB1c2UgdGhhdCB0byBzZXQgYSBzaW5nbGUgY2FjaGUgdmFyaWFibGUuCiAjCiAjIFdlIGRvbid0IEFDX1JFUVVJUkUgdGhlIGNvcnJlc3BvbmRpbmcgQUNfUFJPR19DQyBzaW5jZSB0aGUgbGF0dGVyIHdhcwpAQCAtMTk4LDEyICsxMDE4LDEzIEBACiBBQ19SRVFVSVJFKFtBTV9NQUtFX0lOQ0xVREVdKWRubAogQUNfUkVRVUlSRShbQU1fREVQX1RSQUNLXSlkbmwKIAotaWZlbHNlKFskMV0sIENDLCAgIFtkZXBjYz0iJENDIiAgIGFtX2NvbXBpbGVyX2xpc3Q9XSwKLSAgICAgICBbJDFdLCBDWFgsICBbZGVwY2M9IiRDWFgiICBhbV9jb21waWxlcl9saXN0PV0sCi0gICAgICAgWyQxXSwgT0JKQywgW2RlcGNjPSIkT0JKQyIgYW1fY29tcGlsZXJfbGlzdD0nZ2NjMyBnY2MnXSwKLSAgICAgICBbJDFdLCBVUEMsICBbZGVwY2M9IiRVUEMiICBhbV9jb21waWxlcl9saXN0PV0sCi0gICAgICAgWyQxXSwgR0NKLCAgW2RlcGNjPSIkR0NKIiAgYW1fY29tcGlsZXJfbGlzdD0nZ2NjMyBnY2MnXSwKLSAgICAgICAgICAgICAgICAgICBbZGVwY2M9IiQkMSIgICBhbV9jb21waWxlcl9saXN0PV0pCittNF9pZihbJDFdLCBbQ0NdLCAgIFtkZXBjYz0iJENDIiAgIGFtX2NvbXBpbGVyX2xpc3Q9XSwKKyAgICAgIFskMV0sIFtDWFhdLCAgW2RlcGNjPSIkQ1hYIiAgYW1fY29tcGlsZXJfbGlzdD1dLAorICAgICAgWyQxXSwgW09CSkNdLCBbZGVwY2M9IiRPQkpDIiBhbV9jb21waWxlcl9saXN0PSdnY2MzIGdjYyddLAorICAgICAgWyQxXSwgW09CSkNYWF0sIFtkZXBjYz0iJE9CSkNYWCIgYW1fY29tcGlsZXJfbGlzdD0nZ2NjMyBnY2MnXSwKKyAgICAgIFskMV0sIFtVUENdLCAgW2RlcGNjPSIkVVBDIiAgYW1fY29tcGlsZXJfbGlzdD1dLAorICAgICAgWyQxXSwgW0dDSl0sICBbZGVwY2M9IiRHQ0oiICBhbV9jb21waWxlcl9saXN0PSdnY2MzIGdjYyddLAorICAgICAgICAgICAgICAgICAgICBbZGVwY2M9IiQkMSIgICBhbV9jb21waWxlcl9saXN0PV0pCiAKIEFDX0NBQ0hFX0NIRUNLKFtkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjY10sCiAgICAgICAgICAgICAgICBbYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGVdLApAQCAtMjExLDggKzEwMzIsOSBAQAogICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCiAgICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCiAgICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCi0gICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKLSAgIyBpbiBEJy4KKyAgIyBtYWtpbmcgYSBkdW1teSBmaWxlIG5hbWVkICdEJyAtLSBiZWNhdXNlICctTUQnIG1lYW5zICJwdXQgdGhlIG91dHB1dAorICAjIGluIEQiLgorICBybSAtcmYgY29uZnRlc3QuZGlyCiAgIG1rZGlyIGNvbmZ0ZXN0LmRpcgogICAjIENvcHkgZGVwY29tcCB0byBzdWJkaXIgYmVjYXVzZSBvdGhlcndpc2Ugd2Ugd29uJ3QgZmluZCBpdCBpZiB3ZSdyZQogICAjIHVzaW5nIGEgcmVsYXRpdmUgZGlyZWN0b3J5LgpAQCAtMjUxLDE2ICsxMDczLDE2IEBACiAgICAgOiA+IHN1Yi9jb25mdGVzdC5jCiAgICAgZm9yIGkgaW4gMSAyIDMgNCA1IDY7IGRvCiAgICAgICBlY2hvICcjaW5jbHVkZSAiY29uZnRzdCckaScuaCInID4+IHN1Yi9jb25mdGVzdC5jCi0gICAgICAjIFVzaW5nIGA6ID4gc3ViL2NvbmZ0c3QkaS5oJyBjcmVhdGVzIG9ubHkgc3ViL2NvbmZ0c3QxLmggd2l0aAotICAgICAgIyBTb2xhcmlzIDgncyB7L3Vzcix9L2Jpbi9zaC4KLSAgICAgIHRvdWNoIHN1Yi9jb25mdHN0JGkuaAorICAgICAgIyBVc2luZyAiOiA+IHN1Yi9jb25mdHN0JGkuaCIgY3JlYXRlcyBvbmx5IHN1Yi9jb25mdHN0MS5oIHdpdGgKKyAgICAgICMgU29sYXJpcyAxMCAvYmluL3NoLgorICAgICAgZWNobyAnLyogZHVtbXkgKi8nID4gc3ViL2NvbmZ0c3QkaS5oCiAgICAgZG9uZQogICAgIGVjaG8gIiR7YW1fX2luY2x1ZGV9ICR7YW1fX3F1b3RlfXN1Yi9jb25mdGVzdC5QbyR7YW1fX3F1b3RlfSIgPiBjb25mbWYKIAotICAgICMgV2UgY2hlY2sgd2l0aCBgLWMnIGFuZCBgLW8nIGZvciB0aGUgc2FrZSBvZiB0aGUgImRhc2htc3Rkb3V0IgorICAgICMgV2UgY2hlY2sgd2l0aCAnLWMnIGFuZCAnLW8nIGZvciB0aGUgc2FrZSBvZiB0aGUgImRhc2htc3Rkb3V0IgogICAgICMgbW9kZS4gIEl0IHR1cm5zIG91dCB0aGF0IHRoZSBTdW5Qcm8gQysrIGNvbXBpbGVyIGRvZXMgbm90IHByb3Blcmx5Ci0gICAgIyBoYW5kbGUgYC1NIC1vJywgYW5kIHdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMuICBBbHNvLCBzb21lIEludGVsCi0gICAgIyB2ZXJzaW9ucyBoYWQgdHJvdWJsZSB3aXRoIG91dHB1dCBpbiBzdWJkaXJzCisgICAgIyBoYW5kbGUgJy1NIC1vJywgYW5kIHdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMuICBBbHNvLCBzb21lIEludGVsCisgICAgIyB2ZXJzaW9ucyBoYWQgdHJvdWJsZSB3aXRoIG91dHB1dCBpbiBzdWJkaXJzLgogICAgIGFtX19vYmo9c3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99CiAgICAgYW1fX21pbnVzX29iaj0iLW8gJGFtX19vYmoiCiAgICAgY2FzZSAkZGVwbW9kZSBpbgpAQCAtMjY5LDE2ICsxMDkxLDE2IEBACiAgICAgICB0ZXN0ICIkYW1fX3VuaXZlcnNhbCIgPSBmYWxzZSB8fCBjb250aW51ZQogICAgICAgOzsKICAgICBub3NpZGVlZmZlY3QpCi0gICAgICAjIGFmdGVyIHRoaXMgdGFnLCBtZWNoYW5pc21zIGFyZSBub3QgYnkgc2lkZS1lZmZlY3QsIHNvIHRoZXknbGwKLSAgICAgICMgb25seSBiZSB1c2VkIHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQKKyAgICAgICMgQWZ0ZXIgdGhpcyB0YWcsIG1lY2hhbmlzbXMgYXJlIG5vdCBieSBzaWRlLWVmZmVjdCwgc28gdGhleSdsbAorICAgICAgIyBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZC4KICAgICAgIGlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciID0geHllczsgdGhlbgogCWNvbnRpbnVlCiAgICAgICBlbHNlCiAJYnJlYWsKICAgICAgIGZpCiAgICAgICA7OwotICAgIG1zdmlzdWFsY3BwIHwgbXN2Y21zeXMpCi0gICAgICAjIFRoaXMgY29tcGlsZXIgd29uJ3QgZ3JvayBgLWMgLW8nLCBidXQgYWxzbywgdGhlIG1pbnVzbyB0ZXN0IGhhcworICAgIG1zdmM3IHwgbXN2Yzdtc3lzIHwgbXN2aXN1YWxjcHAgfCBtc3ZjbXN5cykKKyAgICAgICMgVGhpcyBjb21waWxlciB3b24ndCBncm9rICctYyAtbycsIGJ1dCBhbHNvLCB0aGUgbWludXNvIHRlc3QgaGFzCiAgICAgICAjIG5vdCBydW4geWV0LiAgVGhlc2UgZGVwbW9kZXMgYXJlIGxhdGUgZW5vdWdoIGluIHRoZSBnYW1lLCBhbmQKICAgICAgICMgc28gd2VhayB0aGF0IHRoZWlyIGZ1bmN0aW9uaW5nIHNob3VsZCBub3QgYmUgaW1wYWN0ZWQuCiAgICAgICBhbV9fb2JqPWNvbmZ0ZXN0LiR7T0JKRVhULW99CkBAIC0zMjYsNyArMTE0OCw3IEBACiAjIEFNX1NFVF9ERVBESVIKICMgLS0tLS0tLS0tLS0tLQogIyBDaG9vc2UgYSBkaXJlY3RvcnkgbmFtZSBmb3IgZGVwZW5kZW5jeSBmaWxlcy4KLSMgVGhpcyBtYWNybyBpcyBBQ19SRVFVSVJFZCBpbiBfQU1fREVQRU5ERU5DSUVTCisjIFRoaXMgbWFjcm8gaXMgQUNfUkVRVUlSRWQgaW4gX0FNX0RFUEVOREVOQ0lFUy4KIEFDX0RFRlVOKFtBTV9TRVRfREVQRElSXSwKIFtBQ19SRVFVSVJFKFtBTV9TRVRfTEVBRElOR19ET1RdKWRubAogQUNfU1VCU1QoW0RFUERJUl0sIFsiJHthbV9fbGVhZGluZ19kb3R9ZGVwcyJdKWRubApAQCAtMzM2LDI4ICsxMTU4LDM0IEBACiAjIEFNX0RFUF9UUkFDSwogIyAtLS0tLS0tLS0tLS0KIEFDX0RFRlVOKFtBTV9ERVBfVFJBQ0tdLAotW0FDX0FSR19FTkFCTEUoZGVwZW5kZW5jeS10cmFja2luZywKLVsgIC0tZGlzYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICBzcGVlZHMgdXAgb25lLXRpbWUgYnVpbGQKLSAgLS1lbmFibGUtZGVwZW5kZW5jeS10cmFja2luZyAgIGRvIG5vdCByZWplY3Qgc2xvdyBkZXBlbmRlbmN5IGV4dHJhY3RvcnNdKQorW0FDX0FSR19FTkFCTEUoW2RlcGVuZGVuY3ktdHJhY2tpbmddLCBbZG5sCitBU19IRUxQX1NUUklORygKKyAgWy0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmddLAorICBbZG8gbm90IHJlamVjdCBzbG93IGRlcGVuZGVuY3kgZXh0cmFjdG9yc10pCitBU19IRUxQX1NUUklORygKKyAgWy0tZGlzYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nXSwKKyAgW3NwZWVkcyB1cCBvbmUtdGltZSBidWlsZF0pXSkKIGlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubzsgdGhlbgogICBhbV9kZXBjb21wPSIkYWNfYXV4X2Rpci9kZXBjb21wIgogICBBTURFUEJBQ0tTTEFTSD0nXCcKKyAgYW1fX25vZGVwPSdfbm8nCiBmaQogQU1fQ09ORElUSU9OQUwoW0FNREVQXSwgW3Rlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhub10pCiBBQ19TVUJTVChbQU1ERVBCQUNLU0xBU0hdKWRubAogX0FNX1NVQlNUX05PVE1BS0UoW0FNREVQQkFDS1NMQVNIXSlkbmwKK0FDX1NVQlNUKFthbV9fbm9kZXBdKWRubAorX0FNX1NVQlNUX05PVE1BS0UoW2FtX19ub2RlcF0pZG5sCiBdKQogCiAjIEdlbmVyYXRlIGNvZGUgdG8gc2V0IHVwIGRlcGVuZGVuY3kgdHJhY2tpbmcuICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCiAKLSMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA4Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICMKICMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KICMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKICMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgogCi0jc2VyaWFsIDUKKyMgc2VyaWFsIDYKIAogIyBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zNzYsNyArMTIwNCw3IEBACiAgICAgIyBTdHJpcCBNRiBzbyB3ZSBlbmQgdXAgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KICAgICBtZj1gZWNobyAiJG1mIiB8IHNlZCAtZSAncy86LiokLy8nYAogICAgICMgQ2hlY2sgd2hldGhlciB0aGlzIGlzIGFuIEF1dG9tYWtlIGdlbmVyYXRlZCBNYWtlZmlsZSBvciBub3QuCi0gICAgIyBXZSB1c2VkIHRvIG1hdGNoIG9ubHkgdGhlIGZpbGVzIG5hbWVkIGBNYWtlZmlsZS5pbicsIGJ1dAorICAgICMgV2UgdXNlZCB0byBtYXRjaCBvbmx5IHRoZSBmaWxlcyBuYW1lZCAnTWFrZWZpbGUuaW4nLCBidXQKICAgICAjIHNvbWUgcGVvcGxlIHJlbmFtZSB0aGVtOyBzbyBpbnN0ZWFkIHdlIGxvb2sgYXQgdGhlIGZpbGUgY29udGVudC4KICAgICAjIEdyZXAnaW5nIHRoZSBmaXJzdCBsaW5lIGlzIG5vdCBlbm91Z2g6IHNvbWUgcGVvcGxlIHBvc3QtcHJvY2VzcwogICAgICMgZWFjaCBNYWtlZmlsZS5pbiBhbmQgYWRkIGEgbmV3IGxpbmUgb24gdG9wIG9mIGVhY2ggZmlsZSB0byBzYXkgc28uCkBAIC0zODgsMjEgKzEyMTYsMTkgQEAKICAgICAgIGNvbnRpbnVlCiAgICAgZmkKICAgICAjIEV4dHJhY3QgdGhlIGRlZmluaXRpb24gb2YgREVQRElSLCBhbV9faW5jbHVkZSwgYW5kIGFtX19xdW90ZQotICAgICMgZnJvbSB0aGUgTWFrZWZpbGUgd2l0aG91dCBydW5uaW5nIGBtYWtlJy4KKyAgICAjIGZyb20gdGhlIE1ha2VmaWxlIHdpdGhvdXQgcnVubmluZyAnbWFrZScuCiAgICAgREVQRElSPWBzZWQgLW4gJ3MvXkRFUERJUiA9IC8vcCcgPCAiJG1mImAKICAgICB0ZXN0IC16ICIkREVQRElSIiAmJiBjb250aW51ZQogICAgIGFtX19pbmNsdWRlPWBzZWQgLW4gJ3MvXmFtX19pbmNsdWRlID0gLy9wJyA8ICIkbWYiYAogICAgIHRlc3QgLXogImFtX19pbmNsdWRlIiAmJiBjb250aW51ZQogICAgIGFtX19xdW90ZT1gc2VkIC1uICdzL15hbV9fcXVvdGUgPSAvL3AnIDwgIiRtZiJgCi0gICAgIyBXaGVuIHVzaW5nIGFuc2kya25yLCBVIG1heSBiZSBlbXB0eSBvciBhbiB1bmRlcnNjb3JlOyBleHBhbmQgaXQKLSAgICBVPWBzZWQgLW4gJ3MvXlUgPSAvL3AnIDwgIiRtZiJgCiAgICAgIyBGaW5kIGFsbCBkZXBlbmRlbmN5IG91dHB1dCBmaWxlcywgdGhleSBhcmUgaW5jbHVkZWQgZmlsZXMgd2l0aAogICAgICMgJChERVBESVIpIGluIHRoZWlyIG5hbWVzLiAgV2UgaW52b2tlIHNlZCB0d2ljZSBiZWNhdXNlIGl0IGlzIHRoZQogICAgICMgc2ltcGxlc3QgYXBwcm9hY2ggdG8gY2hhbmdpbmcgJChERVBESVIpIHRvIGl0cyBhY3R1YWwgdmFsdWUgaW4gdGhlCiAgICAgIyBleHBhbnNpb24uCiAgICAgZm9yIGZpbGUgaW4gYHNlZCAtbiAiCiAgICAgICBzL14kYW1fX2luY2x1ZGUgJGFtX19xdW90ZVwoLiooREVQRElSKS4qXCkkYW1fX3F1b3RlIickL1wxL3AnIDwiJG1mIiB8IFwKLQkgc2VkIC1lICdzL1wkKERFUERJUikvJyIkREVQRElSIicvZycgLWUgJ3MvXCRVLyciJFUiJy9nJ2A7IGRvCisJIHNlZCAtZSAncy9cJChERVBESVIpLyciJERFUERJUiInL2cnYDsgZG8KICAgICAgICMgTWFrZSBzdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzLgogICAgICAgdGVzdCAtZiAiJGRpcnBhcnQvJGZpbGUiICYmIGNvbnRpbnVlCiAgICAgICBmZGlyPWBBU19ESVJOQU1FKFsiJGZpbGUiXSlgCkBAIC00MjAsNyArMTI0Niw3IEBACiAjIFRoaXMgbWFjcm8gc2hvdWxkIG9ubHkgYmUgaW52b2tlZCBvbmNlIC0tIHVzZSB2aWEgQUNfUkVRVUlSRS4KICMKICMgVGhpcyBjb2RlIGlzIG9ubHkgcmVxdWlyZWQgd2hlbiBhdXRvbWF0aWMgZGVwZW5kZW5jeSB0cmFja2luZwotIyBpcyBlbmFibGVkLiAgRklYTUUuICBUaGlzIGNyZWF0ZXMgZWFjaCBgLlAnIGZpbGUgdGhhdCB3ZSB3aWxsCisjIGlzIGVuYWJsZWQuICBGSVhNRS4gIFRoaXMgY3JlYXRlcyBlYWNoICcuUCcgZmlsZSB0aGF0IHdlIHdpbGwKICMgbmVlZCBpbiBvcmRlciB0byBib290c3RyYXAgdGhlIGRlcGVuZGVuY3kgaGFuZGxpbmcgY29kZS4KIEFDX0RFRlVOKFtBTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10sCiBbQUNfQ09ORklHX0NPTU1BTkRTKFtkZXBmaWxlc10sCkBAIC00MzAsMTQgKzEyNTYsMTMgQEAKIAogIyBEbyBhbGwgdGhlIHdvcmsgZm9yIEF1dG9tYWtlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQogCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwKLSMgMjAwNSwgMjAwNiwgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAjCiAjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCiAjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCiAjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KIAotIyBzZXJpYWwgMTYKKyMgc2VyaWFsIDE5CiAKICMgVGhpcyBtYWNybyBhY3R1YWxseSBkb2VzIHRvbyBtdWNoLiAgU29tZSBjaGVja3MgYXJlIG9ubHkgbmVlZGVkIGlmCiAjIHlvdXIgcGFja2FnZSBkb2VzIGNlcnRhaW4gdGhpbmdzLiAgQnV0IHRoaXMgaXNuJ3QgcmVhbGx5IGEgYmlnIGRlYWwuCkBAIC00ODMsMzEgKzEzMDgsNDEgQEAKICMgRGVmaW5lIHRoZSBpZGVudGl0eSBvZiB0aGUgcGFja2FnZS4KIGRubCBEaXN0aW5ndWlzaCBiZXR3ZWVuIG9sZC1zdHlsZSBhbmQgbmV3LXN0eWxlIGNhbGxzLgogbTRfaWZ2YWwoWyQyXSwKLVttNF9pZnZhbChbJDNdLCBbX0FNX1NFVF9PUFRJT04oW25vLWRlZmluZV0pXSlkbmwKK1tBQ19ESUFHTk9TRShbb2Jzb2xldGVdLAorWyQwOiB0d28tIGFuZCB0aHJlZS1hcmd1bWVudHMgZm9ybXMgYXJlIGRlcHJlY2F0ZWQuICBGb3IgbW9yZSBpbmZvLCBzZWU6CitodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b21ha2UvbWFudWFsL2F1dG9tYWtlLmh0bWwjTW9kZXJuaXplLUFNX0lOSVRfQVVUT01BS0UtaW52b2NhdGlvbl0pCittNF9pZnZhbChbJDNdLCBbX0FNX1NFVF9PUFRJT04oW25vLWRlZmluZV0pXSlkbmwKICBBQ19TVUJTVChbUEFDS0FHRV0sIFskMV0pZG5sCiAgQUNfU1VCU1QoW1ZFUlNJT05dLCBbJDJdKV0sCiBbX0FNX1NFVF9PUFRJT05TKFskMV0pZG5sCiBkbmwgRGlhZ25vc2Ugb2xkLXN0eWxlIEFDX0lOSVQgd2l0aCBuZXctc3R5bGUgQU1fQVVUT01BS0VfSU5JVC4KLW00X2lmKG00X2lmZGVmKFtBQ19QQUNLQUdFX05BTUVdLCAxKW00X2lmZGVmKFtBQ19QQUNLQUdFX1ZFUlNJT05dLCAxKSwgMTEsLAorbTRfaWYoCisgIG00X2lmZGVmKFtBQ19QQUNLQUdFX05BTUVdLCBbb2tdKTptNF9pZmRlZihbQUNfUEFDS0FHRV9WRVJTSU9OXSwgW29rXSksCisgIFtvazpva10sLAogICBbbTRfZmF0YWwoW0FDX0lOSVQgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHBhY2thZ2UgYW5kIHZlcnNpb24gYXJndW1lbnRzXSldKWRubAogIEFDX1NVQlNUKFtQQUNLQUdFXSwgWydBQ19QQUNLQUdFX1RBUk5BTUUnXSlkbmwKICBBQ19TVUJTVChbVkVSU0lPTl0sIFsnQUNfUEFDS0FHRV9WRVJTSU9OJ10pXSlkbmwKIAogX0FNX0lGX09QVElPTihbbm8tZGVmaW5lXSwsCi1bQUNfREVGSU5FX1VOUVVPVEVEKFBBQ0tBR0UsICIkUEFDS0FHRSIsIFtOYW1lIG9mIHBhY2thZ2VdKQotIEFDX0RFRklORV9VTlFVT1RFRChWRVJTSU9OLCAiJFZFUlNJT04iLCBbVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZV0pXSlkbmwKK1tBQ19ERUZJTkVfVU5RVU9URUQoW1BBQ0tBR0VdLCBbIiRQQUNLQUdFIl0sIFtOYW1lIG9mIHBhY2thZ2VdKQorIEFDX0RFRklORV9VTlFVT1RFRChbVkVSU0lPTl0sIFsiJFZFUlNJT04iXSwgW1ZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2VdKV0pZG5sCiAKICMgU29tZSB0b29scyBBdXRvbWFrZSBuZWVkcy4KIEFDX1JFUVVJUkUoW0FNX1NBTklUWV9DSEVDS10pZG5sCiBBQ19SRVFVSVJFKFtBQ19BUkdfUFJPR1JBTV0pZG5sCi1BTV9NSVNTSU5HX1BST0coQUNMT0NBTCwgYWNsb2NhbC0ke2FtX19hcGlfdmVyc2lvbn0pCi1BTV9NSVNTSU5HX1BST0coQVVUT0NPTkYsIGF1dG9jb25mKQotQU1fTUlTU0lOR19QUk9HKEFVVE9NQUtFLCBhdXRvbWFrZS0ke2FtX19hcGlfdmVyc2lvbn0pCi1BTV9NSVNTSU5HX1BST0coQVVUT0hFQURFUiwgYXV0b2hlYWRlcikKLUFNX01JU1NJTkdfUFJPRyhNQUtFSU5GTywgbWFrZWluZm8pCitBTV9NSVNTSU5HX1BST0coW0FDTE9DQUxdLCBbYWNsb2NhbC0ke2FtX19hcGlfdmVyc2lvbn1dKQorQU1fTUlTU0lOR19QUk9HKFtBVVRPQ09ORl0sIFthdXRvY29uZl0pCitBTV9NSVNTSU5HX1BST0coW0FVVE9NQUtFXSwgW2F1dG9tYWtlLSR7YW1fX2FwaV92ZXJzaW9ufV0pCitBTV9NSVNTSU5HX1BST0coW0FVVE9IRUFERVJdLCBbYXV0b2hlYWRlcl0pCitBTV9NSVNTSU5HX1BST0coW01BS0VJTkZPXSwgW21ha2VpbmZvXSkKIEFDX1JFUVVJUkUoW0FNX1BST0dfSU5TVEFMTF9TSF0pZG5sCiBBQ19SRVFVSVJFKFtBTV9QUk9HX0lOU1RBTExfU1RSSVBdKWRubAotQUNfUkVRVUlSRShbQU1fUFJPR19NS0RJUl9QXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfTUtESVJfUF0pZG5sCisjIEZvciBiZXR0ZXIgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gIFRvIGJlIHJlbW92ZWQgb25jZSBBdXRvbWFrZSAxLjkueAorIyBkaWVzIG91dCBmb3IgZ29vZC4gIEZvciBtb3JlIGJhY2tncm91bmQsIHNlZToKKyMgPGh0dHA6Ly9saXN0cy5nbnUub3JnL2FyY2hpdmUvaHRtbC9hdXRvbWFrZS8yMDEyLTA3L21zZzAwMDAxLmh0bWw+CisjIDxodHRwOi8vbGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvYXV0b21ha2UvMjAxMi0wNy9tc2cwMDAxNC5odG1sPgorQUNfU1VCU1QoW21rZGlyX3BdLCBbJyQoTUtESVJfUCknXSkKICMgV2UgbmVlZCBhd2sgZm9yIHRoZSAiY2hlY2siIHRhcmdldC4gIFRoZSBzeXN0ZW0gImF3ayIgaXMgYmFkIG9uCiAjIHNvbWUgcGxhdGZvcm1zLgogQUNfUkVRVUlSRShbQUNfUFJPR19BV0tdKWRubApAQCAtNTE4LDI4ICsxMzUzLDM1IEBACiAJCQkgICAgIFtfQU1fUFJPR19UQVIoW3Y3XSldKV0pCiBfQU1fSUZfT1BUSU9OKFtuby1kZXBlbmRlbmNpZXNdLCwKIFtBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19DQ10sCi0JCSAgW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSwKLQkJICBbZGVmaW5lKFtBQ19QUk9HX0NDXSwKLQkJCSAgZGVmbihbQUNfUFJPR19DQ10pW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSldKWRubAorCQkgIFtfQU1fREVQRU5ERU5DSUVTKFtDQ10pXSwKKwkJICBbbTRfZGVmaW5lKFtBQ19QUk9HX0NDXSwKKwkJCSAgICAgbTRfZGVmbihbQUNfUFJPR19DQ10pW19BTV9ERVBFTkRFTkNJRVMoW0NDXSldKV0pZG5sCiBBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19DWFhdLAotCQkgIFtfQU1fREVQRU5ERU5DSUVTKENYWCldLAotCQkgIFtkZWZpbmUoW0FDX1BST0dfQ1hYXSwKLQkJCSAgZGVmbihbQUNfUFJPR19DWFhdKVtfQU1fREVQRU5ERU5DSUVTKENYWCldKV0pZG5sCisJCSAgW19BTV9ERVBFTkRFTkNJRVMoW0NYWF0pXSwKKwkJICBbbTRfZGVmaW5lKFtBQ19QUk9HX0NYWF0sCisJCQkgICAgIG00X2RlZm4oW0FDX1BST0dfQ1hYXSlbX0FNX0RFUEVOREVOQ0lFUyhbQ1hYXSldKV0pZG5sCiBBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19PQkpDXSwKLQkJICBbX0FNX0RFUEVOREVOQ0lFUyhPQkpDKV0sCi0JCSAgW2RlZmluZShbQUNfUFJPR19PQkpDXSwKLQkJCSAgZGVmbihbQUNfUFJPR19PQkpDXSlbX0FNX0RFUEVOREVOQ0lFUyhPQkpDKV0pXSlkbmwKKwkJICBbX0FNX0RFUEVOREVOQ0lFUyhbT0JKQ10pXSwKKwkJICBbbTRfZGVmaW5lKFtBQ19QUk9HX09CSkNdLAorCQkJICAgICBtNF9kZWZuKFtBQ19QUk9HX09CSkNdKVtfQU1fREVQRU5ERU5DSUVTKFtPQkpDXSldKV0pZG5sCitkbmwgU3VwcG9ydCBmb3IgT2JqZWN0aXZlIEMrKyB3YXMgb25seSBpbnRyb2R1Y2VkIGluIEF1dG9jb25mIDIuNjUsCitkbmwgYnV0IHdlIHN0aWxsIGNhdGVyIHRvIEF1dG9jb25mIDIuNjIuCittNF9pZmRlZihbQUNfUFJPR19PQkpDWFhdLAorW0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX09CSkNYWF0sCisJCSAgW19BTV9ERVBFTkRFTkNJRVMoW09CSkNYWF0pXSwKKwkJICBbbTRfZGVmaW5lKFtBQ19QUk9HX09CSkNYWF0sCisJCQkgICAgIG00X2RlZm4oW0FDX1BST0dfT0JKQ1hYXSlbX0FNX0RFUEVOREVOQ0lFUyhbT0JKQ1hYXSldKV0pXSlkbmwKIF0pCiBfQU1fSUZfT1BUSU9OKFtzaWxlbnQtcnVsZXNdLCBbQUNfUkVRVUlSRShbQU1fU0lMRU5UX1JVTEVTXSldKWRubAotZG5sIFRoZSBgcGFyYWxsZWwtdGVzdHMnIGRyaXZlciBtYXkgbmVlZCB0byBrbm93IGFib3V0IEVYRUVYVCwgc28gYWRkIHRoZQotZG5sIGBhbV9fRVhFRVhUJyBjb25kaXRpb25hbCBpZiBfQU1fQ09NUElMRVJfRVhFRVhUIHdhcyBzZWVuLiAgVGhpcyBtYWNybworZG5sIFRoZSAncGFyYWxsZWwtdGVzdHMnIGRyaXZlciBtYXkgbmVlZCB0byBrbm93IGFib3V0IEVYRUVYVCwgc28gYWRkIHRoZQorZG5sICdhbV9fRVhFRVhUJyBjb25kaXRpb25hbCBpZiBfQU1fQ09NUElMRVJfRVhFRVhUIHdhcyBzZWVuLiAgVGhpcyBtYWNybwogZG5sIGlzIGhvb2tlZCBvbnRvIF9BQ19DT01QSUxFUl9FWEVFWFQgZWFybHksIHNlZSBiZWxvdy4KIEFDX0NPTkZJR19DT01NQU5EU19QUkUoZG5sCiBbbTRfcHJvdmlkZV9pZihbX0FNX0NPTVBJTEVSX0VYRUVYVF0sCiAgIFtBTV9DT05ESVRJT05BTChbYW1fX0VYRUVYVF0sIFt0ZXN0IC1uICIkRVhFRVhUIl0pXSldKWRubAogXSkKIAotZG5sIEhvb2sgaW50byBgX0FDX0NPTVBJTEVSX0VYRUVYVCcgZWFybHkgdG8gbGVhcm4gaXRzIGV4cGFuc2lvbi4gIERvIG5vdAorZG5sIEhvb2sgaW50byAnX0FDX0NPTVBJTEVSX0VYRUVYVCcgZWFybHkgdG8gbGVhcm4gaXRzIGV4cGFuc2lvbi4gIERvIG5vdAogZG5sIGFkZCB0aGUgY29uZGl0aW9uYWwgcmlnaHQgaGVyZSwgYXMgX0FDX0NPTVBJTEVSX0VYRUVYVCBtYXkgYmUgZnVydGhlcgogZG5sIG1hbmdsZWQgYnkgQXV0b2NvbmYgYW5kIHJ1biBpbiBhIHNoZWxsIGNvbmRpdGlvbmFsIHN0YXRlbWVudC4KIG00X2RlZmluZShbX0FDX0NPTVBJTEVSX0VYRUVYVF0sCkBAIC01NjcsMTIgKzE0MDksMTQgQEAKIGRvbmUKIGVjaG8gInRpbWVzdGFtcCBmb3IgJF9hbV9hcmciID5gQVNfRElSTkFNRShbIiRfYW1fYXJnIl0pYC9zdGFtcC1oW10kX2FtX3N0YW1wX2NvdW50XSkKIAotIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDUsIDIwMDggIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICMKICMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KICMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKICMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgogCisjIHNlcmlhbCA4CisKICMgQU1fUFJPR19JTlNUQUxMX1NICiAjIC0tLS0tLS0tLS0tLS0tLS0tLQogIyBEZWZpbmUgJGluc3RhbGxfc2guCkBAIC01ODYsOSArMTQzMCw5IEBACiAgICAgaW5zdGFsbF9zaD0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL2luc3RhbGwtc2giCiAgIGVzYWMKIGZpCi1BQ19TVUJTVChpbnN0YWxsX3NoKV0pCitBQ19TVUJTVChbaW5zdGFsbF9zaF0pXSkKIAotIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICMKICMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KICMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKQEAgLTYxMiwyMCArMTQ1NiwxOSBAQAogIyBBZGQgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9wdGlvbiB0byBjb25maWd1cmUuICAgICAgICAgLSotIEF1dG9jb25mIC0qLQogIyBGcm9tIEppbSBNZXllcmluZwogCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OCwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwOAotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAjCiAjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCiAjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCiAjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KIAotIyBzZXJpYWwgNQorIyBzZXJpYWwgNwogCiAjIEFNX01BSU5UQUlORVJfTU9ERShbREVGQVVMVC1NT0RFXSkKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBDb250cm9sIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzLgotIyBEZWZhdWx0IGlzIHRvIGRpc2FibGUgdGhlbSwgdW5sZXNzIGBlbmFibGUnIGlzIHBhc3NlZCBsaXRlcmFsbHkuCi0jIEZvciBzeW1tZXRyeSwgYGRpc2FibGUnIG1heSBiZSBwYXNzZWQgYXMgd2VsbC4gIEFueXdheSwgdGhlIHVzZXIKKyMgRGVmYXVsdCBpcyB0byBkaXNhYmxlIHRoZW0sIHVubGVzcyAnZW5hYmxlJyBpcyBwYXNzZWQgbGl0ZXJhbGx5LgorIyBGb3Igc3ltbWV0cnksICdkaXNhYmxlJyBtYXkgYmUgcGFzc2VkIGFzIHdlbGwuICBBbnl3YXksIHRoZSB1c2VyCiAjIGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdCB3aXRoIHRoZSAtLWVuYWJsZS8tLWRpc2FibGUgc3dpdGNoLgogQUNfREVGVU4oW0FNX01BSU5UQUlORVJfTU9ERV0sCiBbbTRfY2FzZShtNF9kZWZhdWx0KFskMV0sIFtkaXNhYmxlXSksCkBAIC02MzMsMTMgKzE0NzYsMTQgQEAKICAgICAgICBbZGlzYWJsZV0sIFttNF9kZWZpbmUoW2FtX21haW50YWluZXJfb3RoZXJdLCBbZW5hYmxlXSldLAogICAgICAgIFttNF9kZWZpbmUoW2FtX21haW50YWluZXJfb3RoZXJdLCBbZW5hYmxlXSkKICAgICAgICAgbTRfd2Fybihbc3ludGF4XSwgW3VuZXhwZWN0ZWQgYXJndW1lbnQgdG8gQU1AJnRAX01BSU5UQUlORVJfTU9ERTogJDFdKV0pCi1BQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYW1fbWFpbnRhaW5lcl9vdGhlciBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlc10pCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzXSkKICAgZG5sIG1haW50YWluZXItbW9kZSdzIGRlZmF1bHQgaXMgJ2Rpc2FibGUnIHVubGVzcyAnZW5hYmxlJyBpcyBwYXNzZWQKICAgQUNfQVJHX0VOQUJMRShbbWFpbnRhaW5lci1tb2RlXSwKLVsgIC0tXVthbV9tYWludGFpbmVyX290aGVyXVstbWFpbnRhaW5lci1tb2RlICBhbV9tYWludGFpbmVyX290aGVyIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0JCQkgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXJdLAotICAgICAgW1VTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbF0sCi0gICAgICBbVVNFX01BSU5UQUlORVJfTU9ERT1dbTRfaWYoYW1fbWFpbnRhaW5lcl9vdGhlciwgW2VuYWJsZV0sIFtub10sIFt5ZXNdKSkKKyAgICBbQVNfSEVMUF9TVFJJTkcoWy0tXWFtX21haW50YWluZXJfb3RoZXJbLW1haW50YWluZXItbW9kZV0sCisgICAgICBhbV9tYWludGFpbmVyX290aGVyWyBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAorICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlcl0pXSwKKyAgICBbVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsXSwKKyAgICBbVVNFX01BSU5UQUlORVJfTU9ERT1dbTRfaWYoYW1fbWFpbnRhaW5lcl9vdGhlciwgW2VuYWJsZV0sIFtub10sIFt5ZXNdKSkKICAgQUNfTVNHX1JFU1VMVChbJFVTRV9NQUlOVEFJTkVSX01PREVdKQogICBBTV9DT05ESVRJT05BTChbTUFJTlRBSU5FUl9NT0RFXSwgW3Rlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXNdKQogICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKQEAgLTY1MSwxMyArMTQ5NSwxMyBAQAogCiAjIENoZWNrIHRvIHNlZSBob3cgJ21ha2UnIHRyZWF0cyBpbmNsdWRlcy4JICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQogCi0jIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNSwgMjAwOSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIENvcHlyaWdodCAoQykgMjAwMS0yMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogIwogIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgogIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAogIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCiAKLSMgc2VyaWFsIDQKKyMgc2VyaWFsIDUKIAogIyBBTV9NQUtFX0lOQ0xVREUoKQogIyAtLS0tLS0tLS0tLS0tLS0tLQpAQCAtNjc2LDcgKzE1MjAsNyBAQAogX2FtX3Jlc3VsdD1ub25lCiAjIEZpcnN0IHRyeSBHTlUgbWFrZSBzdHlsZSBpbmNsdWRlLgogZWNobyAiaW5jbHVkZSBjb25maW5jIiA+IGNvbmZtZgotIyBJZ25vcmUgYWxsIGtpbmRzIG9mIGFkZGl0aW9uYWwgb3V0cHV0IGZyb20gYG1ha2UnLgorIyBJZ25vcmUgYWxsIGtpbmRzIG9mIGFkZGl0aW9uYWwgb3V0cHV0IGZyb20gJ21ha2UnLgogY2FzZSBgJGFtX21ha2UgLXMgLWYgY29uZm1mIDI+IC9kZXYvbnVsbGAgaW4gIygKICp0aGVcIGFtX19kb2l0XCB0YXJnZXQqKQogICBhbV9faW5jbHVkZT1pbmNsdWRlCkBAIC03MDEsOCArMTU0NSw3IEBACiBybSAtZiBjb25maW5jIGNvbmZtZgogXSkKIAotIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDgKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogIwogIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgogIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LApAQCAtNzM4LDE0ICsxNTgxLDEzIEBACiAKICMgRmFrZSB0aGUgZXhpc3RlbmNlIG9mIHByb2dyYW1zIHRoYXQgR05VIG1haW50YWluZXJzIHVzZS4gIC0qLSBBdXRvY29uZiAtKi0KIAotIyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDgKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogIwogIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgogIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAogIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCiAKLSMgc2VyaWFsIDYKKyMgc2VyaWFsIDcKIAogIyBBTV9NSVNTSU5HX1BST0coTkFNRSwgUFJPR1JBTSkKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC03NzUsNDUgKzE2MTcsMTkgQEAKICAgYW1fbWlzc2luZ19ydW49IiRNSVNTSU5HIC0tcnVuICIKIGVsc2UKICAgYW1fbWlzc2luZ19ydW49Ci0gIEFDX01TR19XQVJOKFtgbWlzc2luZycgc2NyaXB0IGlzIHRvbyBvbGQgb3IgbWlzc2luZ10pCisgIEFDX01TR19XQVJOKFsnbWlzc2luZycgc2NyaXB0IGlzIHRvbyBvbGQgb3IgbWlzc2luZ10pCiBmaQogXSkKIAotIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgQU1fUFJPR19NS0RJUl9QCi0jIC0tLS0tLS0tLS0tLS0tLQotIyBDaGVjayBmb3IgYG1rZGlyIC1wJy4KLUFDX0RFRlVOKFtBTV9QUk9HX01LRElSX1BdLAotW0FDX1BSRVJFUShbMi42MF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX01LRElSX1BdKWRubAotZG5sIEF1dG9tYWtlIDEuOCB0byAxLjkuNiB1c2VkIHRvIGRlZmluZSBta2Rpcl9wLiAgV2Ugbm93IHVzZSBNS0RJUl9QLAotZG5sIHdoaWxlIGtlZXBpbmcgYSBkZWZpbml0aW9uIG9mIG1rZGlyX3AgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCi1kbmwgQE1LRElSX1BAIGlzIG1hZ2ljOiBBQ19PVVRQVVQgYWRqdXN0cyBpdHMgdmFsdWUgZm9yIGVhY2ggTWFrZWZpbGUuCi1kbmwgSG93ZXZlciB3ZSBjYW5ub3QgZGVmaW5lIG1rZGlyX3AgYXMgJChNS0RJUl9QKSBmb3IgdGhlIHNha2Ugb2YKLWRubCBNYWtlZmlsZS5pbnMgdGhhdCBkbyBub3QgZGVmaW5lIE1LRElSX1AsIHNvIHdlIGRvIG91ciBvd24KLWRubCBhZGp1c3RtZW50IHVzaW5nIHRvcF9idWlsZGRpciAod2hpY2ggaXMgZGVmaW5lZCBtb3JlIG9mdGVuIHRoYW4KLWRubCBNS0RJUl9QKS4KLUFDX1NVQlNUKFtta2Rpcl9wXSwgWyIkTUtESVJfUCJdKWRubAotY2FzZSAkbWtkaXJfcCBpbgotICBbW1xcLyRdXSogfCA/OltbXFwvXV0qKSA7OwotICAqLyopIG1rZGlyX3A9IlwkKHRvcF9idWlsZGRpcikvJG1rZGlyX3AiIDs7Ci1lc2FjCi1dKQotCiAjIEhlbHBlciBmdW5jdGlvbnMgZm9yIG9wdGlvbiBoYW5kbGluZy4gICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCiAKLSMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA1LCAyMDA4ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAjCiAjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCiAjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCiAjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KIAotIyBzZXJpYWwgNAorIyBzZXJpYWwgNgogCiAjIF9BTV9NQU5HTEVfT1BUSU9OKE5BTUUpCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC04MjEsMTMgKzE2MzcsMTMgQEAKIFtbX0FNX09QVElPTl9dbTRfYnBhdHN1YnN0KCQxLCBbW15hLXpBLVowLTlfXV0sIFtfXSldKQogCiAjIF9BTV9TRVRfT1BUSU9OKE5BTUUpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBTZXQgb3B0aW9uIE5BTUUuICBQcmVzZW50bHkgdGhhdCBvbmx5IG1lYW5zIGRlZmluaW5nIGEgZmxhZyBmb3IgdGhpcyBvcHRpb24uCiBBQ19ERUZVTihbX0FNX1NFVF9PUFRJT05dLAotW200X2RlZmluZShfQU1fTUFOR0xFX09QVElPTihbJDFdKSwgMSldKQorW200X2RlZmluZShfQU1fTUFOR0xFX09QVElPTihbJDFdKSwgWzFdKV0pCiAKICMgX0FNX1NFVF9PUFRJT05TKE9QVElPTlMpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIE9QVElPTlMgaXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBBdXRvbWFrZSBvcHRpb25zLgogQUNfREVGVU4oW19BTV9TRVRfT1BUSU9OU10sCiBbbTRfZm9yZWFjaF93KFtfQU1fT3B0aW9uXSwgWyQxXSwgW19BTV9TRVRfT1BUSU9OKF9BTV9PcHRpb24pXSldKQpAQCAtODQwLDIyICsxNjU2LDE4IEBACiAKICMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuICAgIC0qLSBBdXRvY29uZiAtKi0KIAotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDUsIDIwMDgKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogIwogIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgogIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAogIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCiAKLSMgc2VyaWFsIDUKKyMgc2VyaWFsIDkKIAogIyBBTV9TQU5JVFlfQ0hFQ0sKICMgLS0tLS0tLS0tLS0tLS0tCiBBQ19ERUZVTihbQU1fU0FOSVRZX0NIRUNLXSwKIFtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCi0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdC5maWxlCiAjIFJlamVjdCB1bnNhZmUgY2hhcmFjdGVycyBpbiAkc3JjZGlyIG9yIHRoZSBhYnNvbHV0ZSB3b3JraW5nIGRpcmVjdG9yeQogIyBuYW1lLiAgQWNjZXB0IHNwYWNlIGFuZCB0YWIgb25seSBpbiB0aGUgbGF0dGVyLgogYW1fbGY9JwpAQCAtODY2LDMyICsxNjc4LDQwIEBACiBlc2FjCiBjYXNlICRzcmNkaXIgaW4KICAgKltbXFxcIlwjXCRcJlwnXGAkYW1fbGZcIFwJXV0qKQotICAgIEFDX01TR19FUlJPUihbdW5zYWZlIHNyY2RpciB2YWx1ZTogYCRzcmNkaXInXSk7OworICAgIEFDX01TR19FUlJPUihbdW5zYWZlIHNyY2RpciB2YWx1ZTogJyRzcmNkaXInXSk7OwogZXNhYwogCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCisjIERvICdzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCiAjIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKICMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKICMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCiAjIGRpcmVjdG9yeSkuCiBpZiAoCi0gICBzZXQgWCBgbHMgLUx0ICIkc3JjZGlyL2NvbmZpZ3VyZSIgY29uZnRlc3QuZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICIkWypdIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAiJHNyY2Rpci9jb25maWd1cmUiIGNvbmZ0ZXN0LmZpbGVgCi0gICBmaQotICAgcm0gLWYgY29uZnRlc3QuZmlsZQotICAgaWYgdGVzdCAiJFsqXSIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSIgXAotICAgICAgJiYgdGVzdCAiJFsqXSIgIT0gIlggY29uZnRlc3QuZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KKyAgIGFtX2hhc19zbGVwdD1ubworICAgZm9yIGFtX3RyeSBpbiAxIDI7IGRvCisgICAgIGVjaG8gInRpbWVzdGFtcCwgc2xlcHQ6ICRhbV9oYXNfc2xlcHQiID4gY29uZnRlc3QuZmlsZQorICAgICBzZXQgWCBgbHMgLUx0ICIkc3JjZGlyL2NvbmZpZ3VyZSIgY29uZnRlc3QuZmlsZSAyPiAvZGV2L251bGxgCisgICAgIGlmIHRlc3QgIiRbKl0iID0gIlgiOyB0aGVuCisJIyAtTCBkaWRuJ3Qgd29yay4KKwlzZXQgWCBgbHMgLXQgIiRzcmNkaXIvY29uZmlndXJlIiBjb25mdGVzdC5maWxlYAorICAgICBmaQorICAgICBpZiB0ZXN0ICIkWypdIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIiBcCisJJiYgdGVzdCAiJFsqXSIgIT0gIlggY29uZnRlc3QuZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KIAotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgQUNfTVNHX0VSUk9SKFtscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50XSkKLSAgIGZpCi0KKwkjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCisJIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQorCSMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKKwkjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCisJQUNfTVNHX0VSUk9SKFtscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCisgIGFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnRdKQorICAgICBmaQorICAgICBpZiB0ZXN0ICIkWzJdIiA9IGNvbmZ0ZXN0LmZpbGUgfHwgdGVzdCAkYW1fdHJ5IC1lcSAyOyB0aGVuCisgICAgICAgYnJlYWsKKyAgICAgZmkKKyAgICAgIyBKdXN0IGluIGNhc2UuCisgICAgIHNsZWVwIDEKKyAgICAgYW1faGFzX3NsZXB0PXllcworICAgZG9uZQogICAgdGVzdCAiJFsyXSIgPSBjb25mdGVzdC5maWxlCiAgICApCiB0aGVuCkBAIC05MDEsMzcgKzE3MjEsMjUgQEAKICAgIEFDX01TR19FUlJPUihbbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCiBDaGVjayB5b3VyIHN5c3RlbSBjbG9ja10pCiBmaQotQUNfTVNHX1JFU1VMVCh5ZXMpXSkKLQotIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgQU1fUFJPR19JTlNUQUxMX1NUUklQCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBPbmUgaXNzdWUgd2l0aCB2ZW5kb3IgYGluc3RhbGwnIChldmVuIEdOVSkgaXMgdGhhdCB5b3UgY2FuJ3QKLSMgc3BlY2lmeSB0aGUgcHJvZ3JhbSB1c2VkIHRvIHN0cmlwIGJpbmFyaWVzLiAgVGhpcyBpcyBlc3BlY2lhbGx5Ci0jIGFubm95aW5nIGluIGNyb3NzLWNvbXBpbGluZyBlbnZpcm9ubWVudHMsIHdoZXJlIHRoZSBidWlsZCdzIHN0cmlwCi0jIGlzIHVubGlrZWx5IHRvIGhhbmRsZSB0aGUgaG9zdCdzIGJpbmFyaWVzLgotIyBGb3J0dW5hdGVseSBpbnN0YWxsLXNoIHdpbGwgaG9ub3IgYSBTVFJJUFBST0cgdmFyaWFibGUsIHNvIHdlCi0jIGFsd2F5cyB1c2UgaW5zdGFsbC1zaCBpbiBgbWFrZSBpbnN0YWxsLXN0cmlwJywgYW5kIGluaXRpYWxpemUKLSMgU1RSSVBQUk9HIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBTVFJJUCB2YXJpYWJsZSAoc2V0IGJ5IHRoZSB1c2VyKS4KLUFDX0RFRlVOKFtBTV9QUk9HX0lOU1RBTExfU1RSSVBdLAotW0FDX1JFUVVJUkUoW0FNX1BST0dfSU5TVEFMTF9TSF0pZG5sCi0jIEluc3RhbGxlZCBiaW5hcmllcyBhcmUgdXN1YWxseSBzdHJpcHBlZCB1c2luZyBgc3RyaXAnIHdoZW4gdGhlIHVzZXIKLSMgcnVuIGBtYWtlIGluc3RhbGwtc3RyaXAnLiAgSG93ZXZlciBgc3RyaXAnIG1pZ2h0IG5vdCBiZSB0aGUgcmlnaHQKLSMgdG9vbCB0byB1c2UgaW4gY3Jvc3MtY29tcGlsYXRpb24gZW52aXJvbm1lbnRzLCB0aGVyZWZvcmUgQXV0b21ha2UKLSMgd2lsbCBob25vciB0aGUgYFNUUklQJyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvdmVycnVsZSB0aGlzIHByb2dyYW0uCi1kbmwgRG9uJ3QgdGVzdCBmb3IgJGNyb3NzX2NvbXBpbGluZyA9IHllcywgYmVjYXVzZSBpdCBtaWdodCBiZSBgbWF5YmUnLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0gbm87IHRoZW4KLSAgQUNfQ0hFQ0tfVE9PTChbU1RSSVBdLCBbc3RyaXBdLCA6KQorQUNfTVNHX1JFU1VMVChbeWVzXSkKKyMgSWYgd2UgZGlkbid0IHNsZWVwLCB3ZSBzdGlsbCBuZWVkIHRvIGVuc3VyZSB0aW1lIHN0YW1wcyBvZiBjb25maWcuc3RhdHVzIGFuZAorIyBnZW5lcmF0ZWQgZmlsZXMgYXJlIHN0cmljdGx5IG5ld2VyLgorYW1fc2xlZXBfcGlkPQoraWYgZ3JlcCAnc2xlcHQ6IG5vJyBjb25mdGVzdC5maWxlID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAoIHNsZWVwIDEgKSAmCisgIGFtX3NsZWVwX3BpZD0kIQogZmkKLUlOU1RBTExfU1RSSVBfUFJPR1JBTT0iXCQoaW5zdGFsbF9zaCkgLWMgLXMiCi1BQ19TVUJTVChbSU5TVEFMTF9TVFJJUF9QUk9HUkFNXSldKQorQUNfQ09ORklHX0NPTU1BTkRTX1BSRSgKKyAgW0FDX01TR19DSEVDS0lORyhbdGhhdCBnZW5lcmF0ZWQgZmlsZXMgYXJlIG5ld2VyIHRoYW4gY29uZmlndXJlXSkKKyAgIGlmIHRlc3QgLW4gIiRhbV9zbGVlcF9waWQiOyB0aGVuCisgICAgICMgSGlkZSB3YXJuaW5ncyBhYm91dCByZXVzZWQgUElEcy4KKyAgICAgd2FpdCAkYW1fc2xlZXBfcGlkIDI+L2Rldi9udWxsCisgICBmaQorICAgQUNfTVNHX1JFU1VMVChbZG9uZV0pXSkKK3JtIC1mIGNvbmZ0ZXN0LmZpbGUKK10pCiAKLSMgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA4ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAjCiAjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCiAjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCkBAIC05MzksNiArMTc0NywzNiBAQAogCiAjIHNlcmlhbCAyCiAKKyMgQU1fUFJPR19JTlNUQUxMX1NUUklQCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBPbmUgaXNzdWUgd2l0aCB2ZW5kb3IgJ2luc3RhbGwnIChldmVuIEdOVSkgaXMgdGhhdCB5b3UgY2FuJ3QKKyMgc3BlY2lmeSB0aGUgcHJvZ3JhbSB1c2VkIHRvIHN0cmlwIGJpbmFyaWVzLiAgVGhpcyBpcyBlc3BlY2lhbGx5CisjIGFubm95aW5nIGluIGNyb3NzLWNvbXBpbGluZyBlbnZpcm9ubWVudHMsIHdoZXJlIHRoZSBidWlsZCdzIHN0cmlwCisjIGlzIHVubGlrZWx5IHRvIGhhbmRsZSB0aGUgaG9zdCdzIGJpbmFyaWVzLgorIyBGb3J0dW5hdGVseSBpbnN0YWxsLXNoIHdpbGwgaG9ub3IgYSBTVFJJUFBST0cgdmFyaWFibGUsIHNvIHdlCisjIGFsd2F5cyB1c2UgaW5zdGFsbC1zaCBpbiAibWFrZSBpbnN0YWxsLXN0cmlwIiwgYW5kIGluaXRpYWxpemUKKyMgU1RSSVBQUk9HIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBTVFJJUCB2YXJpYWJsZSAoc2V0IGJ5IHRoZSB1c2VyKS4KK0FDX0RFRlVOKFtBTV9QUk9HX0lOU1RBTExfU1RSSVBdLAorW0FDX1JFUVVJUkUoW0FNX1BST0dfSU5TVEFMTF9TSF0pZG5sCisjIEluc3RhbGxlZCBiaW5hcmllcyBhcmUgdXN1YWxseSBzdHJpcHBlZCB1c2luZyAnc3RyaXAnIHdoZW4gdGhlIHVzZXIKKyMgcnVuICJtYWtlIGluc3RhbGwtc3RyaXAiLiAgSG93ZXZlciAnc3RyaXAnIG1pZ2h0IG5vdCBiZSB0aGUgcmlnaHQKKyMgdG9vbCB0byB1c2UgaW4gY3Jvc3MtY29tcGlsYXRpb24gZW52aXJvbm1lbnRzLCB0aGVyZWZvcmUgQXV0b21ha2UKKyMgd2lsbCBob25vciB0aGUgJ1NUUklQJyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvdmVycnVsZSB0aGlzIHByb2dyYW0uCitkbmwgRG9uJ3QgdGVzdCBmb3IgJGNyb3NzX2NvbXBpbGluZyA9IHllcywgYmVjYXVzZSBpdCBtaWdodCBiZSAnbWF5YmUnLgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0gbm87IHRoZW4KKyAgQUNfQ0hFQ0tfVE9PTChbU1RSSVBdLCBbc3RyaXBdLCA6KQorZmkKK0lOU1RBTExfU1RSSVBfUFJPR1JBTT0iXCQoaW5zdGFsbF9zaCkgLWMgLXMiCitBQ19TVUJTVChbSU5TVEFMTF9TVFJJUF9QUk9HUkFNXSldKQorCisjIENvcHlyaWdodCAoQykgMjAwNi0yMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDMKKwogIyBfQU1fU1VCU1RfTk9UTUFLRShWQVJJQUJMRSkKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIFByZXZlbnQgQXV0b21ha2UgZnJvbSBvdXRwdXR0aW5nIFZBUklBQkxFID0gQFZBUklBQkxFQCBpbiBNYWtlZmlsZS5pbi4KQEAgLTk0NiwyNCArMTc4NCwyNCBAQAogQUNfREVGVU4oW19BTV9TVUJTVF9OT1RNQUtFXSkKIAogIyBBTV9TVUJTVF9OT1RNQUtFKFZBUklBQkxFKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgUHVibGljIHNpc3RlciBvZiBfQU1fU1VCU1RfTk9UTUFLRS4KIEFDX0RFRlVOKFtBTV9TVUJTVF9OT1RNQUtFXSwgW19BTV9TVUJTVF9OT1RNQUtFKCRAKV0pCiAKICMgQ2hlY2sgaG93IHRvIGNyZWF0ZSBhIHRhcmJhbGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KIAotIyBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICMKICMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KICMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKICMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgogCi0jIHNlcmlhbCAyCisjIHNlcmlhbCAzCiAKICMgX0FNX1BST0dfVEFSKEZPUk1BVCkKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgQ2hlY2sgaG93IHRvIGNyZWF0ZSBhIHRhcmJhbGwgaW4gZm9ybWF0IEZPUk1BVC4KLSMgRk9STUFUIHNob3VsZCBiZSBvbmUgb2YgYHY3JywgYHVzdGFyJywgb3IgYHBheCcuCisjIEZPUk1BVCBzaG91bGQgYmUgb25lIG9mICd2NycsICd1c3RhcicsIG9yICdwYXgnLgogIwogIyBTdWJzdGl0dXRlIGEgdmFyaWFibGUgJChhbV9fdGFyKSB0aGF0IGlzIGEgY29tbWFuZAogIyB3cml0aW5nIHRvIHN0ZG91dCBhIEZPUk1BVC10YXJiYWxsIGNvbnRhaW5pbmcgdGhlIGRpcmVjdG9yeQpAQCAtOTc0LDEwICsxODEyLDExIEBACiAjIGEgdGFyYmFsbCByZWFkIGZyb20gc3RkaW4uCiAjICAgICAkKGFtX191bnRhcikgPCByZXN1bHQudGFyCiBBQ19ERUZVTihbX0FNX1BST0dfVEFSXSwKLVsjIEFsd2F5cyBkZWZpbmUgQU1UQVIgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCi1BTV9NSVNTSU5HX1BST0coW0FNVEFSXSwgW3Rhcl0pCitbIyBBbHdheXMgZGVmaW5lIEFNVEFSIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAgWWVzLCBpdCdzIHN0aWxsIHVzZWQKKyMgaW4gdGhlIHdpbGQgOi0oICBXZSBzaG91bGQgZmluZCBhIHByb3BlciB3YXkgdG8gZGVwcmVjYXRlIGl0IC4uLgorQUNfU1VCU1QoW0FNVEFSXSwgWyckJHtUQVItdGFyfSddKQogbTRfaWYoWyQxXSwgW3Y3XSwKLSAgICAgW2FtX190YXI9JyR7QU1UQVJ9IGNob2YgLSAiJCR0YXJkaXIiJzsgYW1fX3VudGFyPScke0FNVEFSfSB4ZiAtJ10sCisgICAgIFthbV9fdGFyPSckJHtUQVItdGFyfSBjaG9mIC0gIiQkdGFyZGlyIicgYW1fX3VudGFyPSckJHtUQVItdGFyfSB4ZiAtJ10sCiAgICAgIFttNF9jYXNlKFskMV0sIFt1c3Rhcl0sLCBbcGF4XSwsCiAgICAgICAgICAgICAgIFttNF9mYXRhbChbVW5rbm93biB0YXIgZm9ybWF0XSldKQogQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gY3JlYXRlIGEgJDEgdGFyIGFyY2hpdmVdKQpAQCAtOTg1LDcgKzE4MjQsNyBAQAogX2FtX3Rvb2xzPSdnbnV0YXIgbTRfaWYoWyQxXSwgW3VzdGFyXSwgW3BsYWludGFyXSkgcGF4IGNwaW8gbm9uZScKIF9hbV90b29scz0ke2FtX2N2X3Byb2dfdGFyXyQxLSRfYW1fdG9vbHN9CiAjIERvIG5vdCBmb2xkIHRoZSBhYm92ZSB0d28gbGluZSBpbnRvIG9uZSwgYmVjYXVzZSBUcnU2NCBzaCBhbmQKLSMgU29sYXJpcyBzaCB3aWxsIG5vdCBncm9rIHNwYWNlcyBpbiB0aGUgcmhzIG9mIGAtJy4KKyMgU29sYXJpcyBzaCB3aWxsIG5vdCBncm9rIHNwYWNlcyBpbiB0aGUgcmhzIG9mICctJy4KIGZvciBfYW1fdG9vbCBpbiAkX2FtX3Rvb2xzCiBkbwogICBjYXNlICRfYW1fdG9vbCBpbgpAQCAtMTA0Niw2ICsxODg1LDE2IEBACiBBQ19TVUJTVChbYW1fX3VudGFyXSkKIF0pICMgX0FNX1BST0dfVEFSCiAKK200X2luY2x1ZGUoW200L2FzbWNmaS5tNF0pCittNF9pbmNsdWRlKFttNC9heF9hcHBlbmRfZmxhZy5tNF0pCittNF9pbmNsdWRlKFttNC9heF9jY19tYXhvcHQubTRdKQorbTRfaW5jbHVkZShbbTQvYXhfY2ZsYWdzX3dhcm5fYWxsLm00XSkKK200X2luY2x1ZGUoW200L2F4X2NoZWNrX2NvbXBpbGVfZmxhZy5tNF0pCittNF9pbmNsdWRlKFttNC9heF9jb21waWxlcl92ZW5kb3IubTRdKQorbTRfaW5jbHVkZShbbTQvYXhfY29uZmlndXJlX2FyZ3MubTRdKQorbTRfaW5jbHVkZShbbTQvYXhfZW5hYmxlX2J1aWxkZGlyLm00XSkKK200X2luY2x1ZGUoW200L2F4X2djY19hcmNoZmxhZy5tNF0pCittNF9pbmNsdWRlKFttNC9heF9nY2NfeDg2X2NwdWlkLm00XSkKIG00X2luY2x1ZGUoW200L2xpYnRvb2wubTRdKQogbTRfaW5jbHVkZShbbTQvbHRvcHRpb25zLm00XSkKIG00X2luY2x1ZGUoW200L2x0c3VnYXIubTRdKQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9idWlsZC1pb3Muc2ggYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2J1aWxkLWlvcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZGVhMjQyCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9idWlsZC1pb3Muc2gKQEAgLTAsMCArMSw2NyBAQAorIyEvYmluL3NoCisKK1BMQVRGT1JNX0lPUz0vRGV2ZWxvcGVyL1BsYXRmb3Jtcy9pUGhvbmVPUy5wbGF0Zm9ybS8KK1BMQVRGT1JNX0lPU19TSU09L0RldmVsb3Blci9QbGF0Zm9ybXMvaVBob25lU2ltdWxhdG9yLnBsYXRmb3JtLworU0RLX0lPU19WRVJTSU9OPSI0LjIiCitNSU5fSU9TX1ZFUlNJT049IjMuMCIKK09VVFBVVF9ESVI9InVuaXZlcnNhbC1pb3MiCisKK2J1aWxkX3RhcmdldCAoKSB7CisgICAgbG9jYWwgcGxhdGZvcm09JDEKKyAgICBsb2NhbCBzZGs9JDIKKyAgICBsb2NhbCBhcmNoPSQzCisgICAgbG9jYWwgdHJpcGxlPSQ0CisgICAgbG9jYWwgYnVpbGRkaXI9JDUKKworICAgIG1rZGlyIC1wICIke2J1aWxkZGlyfSIKKyAgICBwdXNoZCAiJHtidWlsZGRpcn0iCisgICAgZXhwb3J0IENDPSIke3BsYXRmb3JtfSIvRGV2ZWxvcGVyL3Vzci9iaW4vZ2NjLTQuMgorICAgIGV4cG9ydCBDRkxBR1M9Ii1hcmNoICR7YXJjaH0gLWlzeXNyb290ICR7c2RrfSAtbWlwaG9uZW9zLXZlcnNpb24tbWluPSR7TUlOX0lPU19WRVJTSU9OfSIKKyAgICAuLi9jb25maWd1cmUgLS1ob3N0PSR7dHJpcGxlfSAmJiBtYWtlCisgICAgcG9wZAorfQorCisjIEJ1aWxkIGFsbCB0YXJnZXRzCitidWlsZF90YXJnZXQgIiR7UExBVEZPUk1fSU9TfSIgIiR7UExBVEZPUk1fSU9TfS9EZXZlbG9wZXIvU0RLcy9pUGhvbmVPUyR7U0RLX0lPU19WRVJTSU9OfS5zZGsvIiBhcm12NiBhcm0tYXBwbGUtZGFyd2luMTAgYXJtdjYtaW9zCitidWlsZF90YXJnZXQgIiR7UExBVEZPUk1fSU9TfSIgIiR7UExBVEZPUk1fSU9TfS9EZXZlbG9wZXIvU0RLcy9pUGhvbmVPUyR7U0RLX0lPU19WRVJTSU9OfS5zZGsvIiBhcm12NyBhcm0tYXBwbGUtZGFyd2luMTAgYXJtdjctaW9zCitidWlsZF90YXJnZXQgIiR7UExBVEZPUk1fSU9TX1NJTX0iICIke1BMQVRGT1JNX0lPU19TSU19L0RldmVsb3Blci9TREtzL2lQaG9uZVNpbXVsYXRvciR7U0RLX0lPU19WRVJTSU9OfS5zZGsvIiBpMzg2IGkzODYtYXBwbGUtZGFyd2luMTAgaTM4Ni1pb3Mtc2ltCisKKyMgQ3JlYXRlIHVuaXZlcnNhbCBvdXRwdXQgZGlyZWN0b3JpZXMKK21rZGlyIC1wICIke09VVFBVVF9ESVJ9IgorbWtkaXIgLXAgIiR7T1VUUFVUX0RJUn0vaW5jbHVkZSIKK21rZGlyIC1wICIke09VVFBVVF9ESVJ9L2luY2x1ZGUvYXJtdjYiCitta2RpciAtcCAiJHtPVVRQVVRfRElSfS9pbmNsdWRlL2FybXY3IgorbWtkaXIgLXAgIiR7T1VUUFVUX0RJUn0vaW5jbHVkZS9pMzg2IgorCisjIENyZWF0ZSB0aGUgdW5pdmVyc2FsIGJpbmFyeQorbGlwbyAtY3JlYXRlIGFybXY2LWlvcy8ubGlicy9saWJmZmkuYSBhcm12Ny1pb3MvLmxpYnMvbGliZmZpLmEgaTM4Ni1pb3Mtc2ltLy5saWJzL2xpYmZmaS5hIC1vdXRwdXQgIiR7T1VUUFVUX0RJUn0vbGliZmZpLmEiCisKKyMgQ29weSBpbiB0aGUgaGVhZGVycworY29weV9oZWFkZXJzICgpIHsKKyAgICBsb2NhbCBzcmM9JDEKKyAgICBsb2NhbCBkZXN0PSQyCisKKyAgICAjIEZpeCBub24tcmVsYXRpdmUgaGVhZGVyIHJlZmVyZW5jZQorICAgIHNlZCAncy88ZmZpdGFyZ2V0Lmg+LyJmZml0YXJnZXQuaCIvJyA8ICIke3NyY30vaW5jbHVkZS9mZmkuaCIgPiAiJHtkZXN0fS9mZmkuaCIKKyAgICBjcCAiJHtzcmN9L2luY2x1ZGUvZmZpdGFyZ2V0LmgiICIke2Rlc3R9IgorfQorCitjb3B5X2hlYWRlcnMgYXJtdjYtaW9zICIke09VVFBVVF9ESVJ9L2luY2x1ZGUvYXJtdjYiCitjb3B5X2hlYWRlcnMgYXJtdjctaW9zICIke09VVFBVVF9ESVJ9L2luY2x1ZGUvYXJtdjciCitjb3B5X2hlYWRlcnMgaTM4Ni1pb3Mtc2ltICIke09VVFBVVF9ESVJ9L2luY2x1ZGUvaTM4NiIKKworIyBDcmVhdGUgdG9wLWxldmVsIGhlYWRlcgorKAorY2F0IDw8IEVPRgorI2lmZGVmIF9fYXJtX18KKyAgI2luY2x1ZGUgPGFybS9hcmNoLmg+CisgICNpZmRlZiBfQVJNX0FSQ0hfNgorICAgICNpbmNsdWRlICJpbmNsdWRlL2FybXY2L2ZmaS5oIgorICAjZWxpZiBfQVJNX0FSQ0hfNworICAgICNpbmNsdWRlICJpbmNsdWRlL2FybXY3L2ZmaS5oIgorICAjZW5kaWYKKyNlbGlmIGRlZmluZWQoX19pMzg2X18pCisgICNpbmNsdWRlICJpbmNsdWRlL2kzODYvZmZpLmgiCisjZW5kaWYKK0VPRgorKSA+ICIke09VVFBVVF9ESVJ9L2ZmaS5oIgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9jb21waWxlIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9jb21waWxlCmluZGV4IDFiMWQyMzIuLmMwMDk2YTcgMTAwNzU1Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvY29tcGlsZQorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2NvbXBpbGUKQEAgLTEsOSArMSwxMCBAQAogIyEgL2Jpbi9zaAogIyBXcmFwcGVyIGZvciBjb21waWxlcnMgd2hpY2ggZG8gbm90IHVuZGVyc3RhbmQgYC1jIC1vJy4KIAotc2NyaXB0dmVyc2lvbj0yMDA1LTA1LTE0LjIyCitzY3JpcHR2ZXJzaW9uPTIwMDktMTAtMDYuMjA7ICMgVVRDCiAKLSMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAzLCAyMDA0LCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDkgIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLgogIyBXcml0dGVuIGJ5IFRvbSBUcm9tZXkgPHRyb21leUBjeWdudXMuY29tPi4KICMKICMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTE3LDggKzE4LDcgQEAKICMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICMKICMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogCiAjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKICMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCkBAIC0xMDMsMTMgKzEwMywxMyBAQAogZmkKIAogIyBOYW1lIG9mIGZpbGUgd2UgZXhwZWN0IGNvbXBpbGVyIHRvIGNyZWF0ZS4KLWNvZmlsZT1gZWNobyAiJGNmaWxlIiB8IHNlZCAtZSAnc3xeLiovfHwnIC1lICdzL1wuYyQvLm8vJ2AKK2NvZmlsZT1gZWNobyAiJGNmaWxlIiB8IHNlZCAnc3xeLipbXFwvXXx8OyBzfF5bYS16QS1aXTp8fDsgcy9cLmMkLy5vLydgCiAKICMgQ3JlYXRlIHRoZSBsb2NrIGRpcmVjdG9yeS4KLSMgTm90ZTogdXNlIGBbLy4tXScgaGVyZSB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCB1c2UgdGhlIHNhbWUgbmFtZQorIyBOb3RlOiB1c2UgYFsvXFw6Li1dJyBoZXJlIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IHVzZSB0aGUgc2FtZSBuYW1lCiAjIHRoYXQgd2UgYXJlIHVzaW5nIGZvciB0aGUgLm8gZmlsZS4gIEFsc28sIGJhc2UgdGhlIG5hbWUgb24gdGhlIGV4cGVjdGVkCiAjIG9iamVjdCBmaWxlIG5hbWUsIHNpbmNlIHRoYXQgaXMgd2hhdCBtYXR0ZXJzIHdpdGggYSBwYXJhbGxlbCBidWlsZC4KLWxvY2tkaXI9YGVjaG8gIiRjb2ZpbGUiIHwgc2VkIC1lICdzfFsvLi1dfF98ZydgLmQKK2xvY2tkaXI9YGVjaG8gIiRjb2ZpbGUiIHwgc2VkIC1lICdzfFsvXFw6Li1dfF98ZydgLmQKIHdoaWxlIHRydWU7IGRvCiAgIGlmIG1rZGlyICIkbG9ja2RpciIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgYnJlYWsKQEAgLTEyNCw5ICsxMjQsOSBAQAogcmV0PSQ/CiAKIGlmIHRlc3QgLWYgIiRjb2ZpbGUiOyB0aGVuCi0gIG12ICIkY29maWxlIiAiJG9maWxlIgorICB0ZXN0ICIkY29maWxlIiA9ICIkb2ZpbGUiIHx8IG12ICIkY29maWxlIiAiJG9maWxlIgogZWxpZiB0ZXN0IC1mICIke2NvZmlsZX1iaiI7IHRoZW4KLSAgbXYgIiR7Y29maWxlfWJqIiAiJG9maWxlIgorICB0ZXN0ICIke2NvZmlsZX1iaiIgPSAiJG9maWxlIiB8fCBtdiAiJHtjb2ZpbGV9YmoiICIkb2ZpbGUiCiBmaQogCiBybWRpciAiJGxvY2tkaXIiCkBAIC0xMzgsNSArMTM4LDYgQEAKICMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQogIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCiAjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgotIyB0aW1lLXN0YW1wLWVuZDogIiQiCisjIHRpbWUtc3RhbXAtdGltZS16b25lOiAiVVRDIgorIyB0aW1lLXN0YW1wLWVuZDogIjsgIyBVVEMiCiAjIEVuZDoKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvY29uZmlnLmd1ZXNzIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9jb25maWcuZ3Vlc3MKaW5kZXggZDUzZTMwOS4uMTgwNGU5ZiAxMDA3NTUKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9jb25maWcuZ3Vlc3MKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9jb25maWcuZ3Vlc3MKQEAgLTEsMTQgKzEsMTQgQEAKICMhIC9iaW4vc2gKICMgQXR0ZW1wdCB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZS4KICMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCi0jICAgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOQotIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyAgIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsCisjICAgMjAxMSwgMjAxMiwgMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KIAotdGltZXN0YW1wPScyMDA5LTExLTE5JwordGltZXN0YW1wPScyMDEyLTEyLTI5JwogCiAjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCiAjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAjCiAjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKQEAgLTE3LDI2ICsxNywyMiBAQAogIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAjCiAjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0jIDAyMTEwLTEzMDEsIFVTQS4KKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICMKICMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQogIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKICMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0KLSMgT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyLiAgUGxlYXNlIHNlbmQgcGF0Y2hlcyAoY29udGV4dAotIyBkaWZmIGZvcm1hdCkgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+IGFuZCBpbmNsdWRlIGEgQ2hhbmdlTG9nCi0jIGVudHJ5LgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0CisjIHByb2dyYW0uICBUaGlzIEV4Y2VwdGlvbiBpcyBhbiBhZGRpdGlvbmFsIHBlcm1pc3Npb24gdW5kZXIgc2VjdGlvbiA3CisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAzICgiR1BMdjMiKS4KICMKLSMgVGhpcyBzY3JpcHQgYXR0ZW1wdHMgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUgc2ltaWxhciB0bwotIyBjb25maWcuc3ViLiAgSWYgaXQgc3VjY2VlZHMsIGl0IHByaW50cyB0aGUgc3lzdGVtIG5hbWUgb24gc3Rkb3V0LCBhbmQKLSMgZXhpdHMgd2l0aCAwLiAgT3RoZXJ3aXNlLCBpdCBleGl0cyB3aXRoIDEuCisjIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lci4gCiAjCiAjIFlvdSBjYW4gZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIHNjcmlwdCBmcm9tOgogIyBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLmd1ZXNzO2hiPUhFQUQKKyMKKyMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB3aXRoIGEgQ2hhbmdlTG9nIGVudHJ5IHRvIGNvbmZpZy1wYXRjaGVzQGdudS5vcmcuCisKIAogbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCiAKQEAgLTU2LDggKzUyLDkgQEAKIEdOVSBjb25maWcuZ3Vlc3MgKCR0aW1lc3RhbXApCiAKIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lci4KLUNvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKLTIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsCisyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExLAorMjAxMiwgMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KIAogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KIHdhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKQEAgLTE0NCw3ICsxNDEsNyBAQAogY2FzZSAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiBpbgogICAgICo6TmV0QlNEOio6KikKIAkjIE5ldEJTRCAobmJzZCkgdGFyZ2V0cyBzaG91bGQgKHdoZXJlIGFwcGxpY2FibGUpIG1hdGNoIG9uZSBvcgotCSMgbW9yZSBvZiB0aGUgdHVwcGxlczogKi0qLW5ldGJzZGVsZiosICotKi1uZXRic2Rhb3V0KiwKKwkjIG1vcmUgb2YgdGhlIHR1cGxlczogKi0qLW5ldGJzZGVsZiosICotKi1uZXRic2Rhb3V0KiwKIAkjICotKi1uZXRic2RlY29mZiogYW5kICotKi1uZXRic2QqLiAgRm9yIHRhcmdldHMgdGhhdCByZWNlbnRseQogCSMgc3dpdGNoZWQgdG8gRUxGLCAqLSotbmV0YnNkKiB3b3VsZCBzZWxlY3QgdGhlIG9sZAogCSMgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhpcyBwcm92aWRlcyBib3RoIGZvcndhcmQKQEAgLTE4MCw3ICsxNzcsNyBAQAogCQlmaQogCQk7OwogCSAgICAqKQotCSAgICAgICAgb3M9bmV0YnNkCisJCW9zPW5ldGJzZAogCQk7OwogCWVzYWMKIAkjIFRoZSBPUyByZWxlYXNlCkBAIC0yMDEsNiArMTk4LDEwIEBACiAJIyBDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTSBpcyB1c2VkLgogCWVjaG8gIiR7bWFjaGluZX0tJHtvc30ke3JlbGVhc2V9IgogCWV4aXQgOzsKKyAgICAqOkJpdHJpZzoqOiopCisJVU5BTUVfTUFDSElORV9BUkNIPWBhcmNoIHwgc2VkICdzL0JpdHJpZy4vLydgCisJZWNobyAke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93bi1iaXRyaWcke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OwogICAgICo6T3BlbkJTRDoqOiopCiAJVU5BTUVfTUFDSElORV9BUkNIPWBhcmNoIHwgc2VkICdzL09wZW5CU0QuLy8nYAogCWVjaG8gJHtVTkFNRV9NQUNISU5FX0FSQ0h9LXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KQEAgLTIyMyw3ICsyMjQsNyBAQAogCQlVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkM30nYAogCQk7OwogCSo1LiopCi0JICAgICAgICBVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkNH0nYAorCQlVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkNH0nYAogCQk7OwogCWVzYWMKIAkjIEFjY29yZGluZyB0byBDb21wYXEsIC91c3Ivc2Jpbi9wc3JpbmZvIGhhcyBiZWVuIGF2YWlsYWJsZSBvbgpAQCAtMjY5LDcgKzI3MCwxMCBAQAogCSMgQSBYbi5uIHZlcnNpb24gaXMgYW4gdW5yZWxlYXNlZCBleHBlcmltZW50YWwgYmFzZWxldmVsLgogCSMgMS4yIHVzZXMgIjEuMiIgZm9yIHVuYW1lIC1yLgogCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtb3NmYGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9eW1BWVFhdLy8nIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAotCWV4aXQgOzsKKwkjIFJlc2V0IEVYSVQgdHJhcCBiZWZvcmUgZXhpdGluZyB0byBhdm9pZCBzcHVyaW91cyBub24temVybyBleGl0IGNvZGUuCisJZXhpdGNvZGU9JD8KKwl0cmFwICcnIDAKKwlleGl0ICRleGl0Y29kZSA7OwogICAgIEFscGhhXCAqOldpbmRvd3NfTlQqOiopCiAJIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgUE9TSVggc3Vic3lzdGVtPwogCSMgU2hvdWxkIHdlIGNoYW5nZSBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZApAQCAtMjk1LDEyICsyOTksMTIgQEAKIAllY2hvIHMzOTAtaWJtLXp2bW9lCiAJZXhpdCA7OwogICAgICo6T1M0MDA6KjoqKQotICAgICAgICBlY2hvIHBvd2VycGMtaWJtLW9zNDAwCisJZWNobyBwb3dlcnBjLWlibS1vczQwMAogCWV4aXQgOzsKICAgICBhcm06UklTQyo6MS5bMDEyXSo6Knxhcm06cmlzY2l4OjEuWzAxMl0qOiopCiAJZWNobyBhcm0tYWNvcm4tcmlzY2l4JHtVTkFNRV9SRUxFQVNFfQogCWV4aXQgOzsKLSAgICBhcm06cmlzY29zOio6Knxhcm06UklTQ09TOio6KikKKyAgICBhcm0qOnJpc2NvczoqOip8YXJtKjpSSVNDT1M6KjoqKQogCWVjaG8gYXJtLXVua25vd24tcmlzY29zCiAJZXhpdCA7OwogICAgIFNSMj8wMTpISS1VWC9NUFA6KjoqIHwgU1I4MDAwOkhJLVVYL01QUDoqOiopCkBAIC0zMzMsNiArMzM3LDkgQEAKICAgICBzdW40KjpTdW5PUzo1Lio6KiB8IHRhZHBvbGUqOlN1bk9TOjUuKjoqKQogCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCiAJZXhpdCA7OworICAgIGk4NnBjOkF1cm9yYVVYOjUuKjoqIHwgaTg2eGVuOkF1cm9yYVVYOjUuKjoqKQorCWVjaG8gaTM4Ni1wYy1hdXJvcmF1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CiAgICAgaTg2cGM6U3VuT1M6NS4qOiogfCBpODZ4ZW46U3VuT1M6NS4qOiopCiAJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAogCVNVTl9BUkNIPSJpMzg2IgpAQCAtMzkxLDIzICszOTgsMjMgQEAKICAgICAjIE1pTlQuICBCdXQgTWlOVCBpcyBkb3dud2FyZCBjb21wYXRpYmxlIHRvIFRPUywgc28gdGhpcyBzaG91bGQKICAgICAjIGJlIG5vIHByb2JsZW0uCiAgICAgYXRhcmlzdFtlXToqTWlOVDoqOiogfCBhdGFyaXN0W2VdOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQorCWVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQogCWV4aXQgOzsKICAgICBhdGFyaSo6Kk1pTlQ6KjoqIHwgYXRhcmkqOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCiAJZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgIGV4aXQgOzsKKwlleGl0IDs7CiAgICAgKmZhbGNvbio6Kk1pTlQ6KjoqIHwgKmZhbGNvbio6Km1pbnQ6KjoqIHwgKmZhbGNvbio6KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQorCWVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQogCWV4aXQgOzsKICAgICBtaWxhbio6Kk1pTlQ6KjoqIHwgbWlsYW4qOiptaW50Oio6KiB8ICptaWxhbio6KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay1taWxhbi1taW50JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBleGl0IDs7CisJZWNobyBtNjhrLW1pbGFuLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OwogICAgIGhhZGVzKjoqTWlOVDoqOiogfCBoYWRlcyo6Km1pbnQ6KjoqIHwgKmhhZGVzKjoqVE9TOio6KikKLSAgICAgICAgZWNobyBtNjhrLWhhZGVzLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgIGV4aXQgOzsKKwllY2hvIG02OGstaGFkZXMtbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CiAgICAgKjoqTWlOVDoqOiogfCAqOiptaW50Oio6KiB8ICo6KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay11bmtub3duLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgIGV4aXQgOzsKKwllY2hvIG02OGstdW5rbm93bi1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKICAgICBtNjhrOm1hY2h0ZW46KjoqKQogCWVjaG8gbTY4ay1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQogCWV4aXQgOzsKQEAgLTQ3Nyw4ICs0ODQsOCBAQAogCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MwogCWV4aXQgOzsKICAgICBBVmlpT046ZGd1eDoqOiopCi0gICAgICAgICMgREcvVVggcmV0dXJucyBBVmlpT04gZm9yIGFsbCBhcmNoaXRlY3R1cmVzCi0gICAgICAgIFVOQU1FX1BST0NFU1NPUj1gL3Vzci9iaW4vdW5hbWUgLXBgCisJIyBERy9VWCByZXR1cm5zIEFWaWlPTiBmb3IgYWxsIGFyY2hpdGVjdHVyZXMKKwlVTkFNRV9QUk9DRVNTT1I9YC91c3IvYmluL3VuYW1lIC1wYAogCWlmIFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMDAgXSB8fCBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTEwIF0KIAl0aGVuCiAJICAgIGlmIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0gbTg4a2RndXhlbGZ4IF0gfHwgXApAQCAtNDkxLDcgKzQ5OCw3IEBACiAJZWxzZQogCSAgICBlY2hvIGk1ODYtZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KIAlmaQotIAlleGl0IDs7CisJZXhpdCA7OwogICAgIE04OCo6RG9scGhpbk9TOio6KikJIyBEb2xwaGluT1MgKFNWUjMpCiAJZWNobyBtODhrLWRvbHBoaW4tc3lzdjMKIAlleGl0IDs7CkBAIC01NDgsNyArNTU1LDcgQEAKIAkJZWNobyByczYwMDAtaWJtLWFpeDMuMgogCWZpCiAJZXhpdCA7OwotICAgICo6QUlYOio6WzQ1Nl0pCisgICAgKjpBSVg6KjpbNDU2N10pCiAJSUJNX0NQVV9JRD1gL3Vzci9zYmluL2xzZGV2IC1DIC1jIHByb2Nlc3NvciAtUyBhdmFpbGFibGUgfCBzZWQgMXEgfCBhd2sgJ3sgcHJpbnQgJDEgfSdgCiAJaWYgL3Vzci9zYmluL2xzYXR0ciAtRWwgJHtJQk1fQ1BVX0lEfSB8IGdyZXAgJyBQT1dFUicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAJCUlCTV9BUkNIPXJzNjAwMApAQCAtNTkxLDUyICs1OTgsNTIgQEAKIAkgICAgOTAwMC9bNjc4XVswLTldWzAtOV0pCiAJCWlmIFsgLXggL3Vzci9iaW4vZ2V0Y29uZiBdOyB0aGVuCiAJCSAgICBzY19jcHVfdmVyc2lvbj1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19DUFVfVkVSU0lPTiAyPi9kZXYvbnVsbGAKLSAgICAgICAgICAgICAgICAgICAgc2Nfa2VybmVsX2JpdHM9YC91c3IvYmluL2dldGNvbmYgU0NfS0VSTkVMX0JJVFMgMj4vZGV2L251bGxgCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7c2NfY3B1X3ZlcnNpb259IiBpbgotICAgICAgICAgICAgICAgICAgICAgIDUyMykgSFBfQVJDSD0iaHBwYTEuMCIgOzsgIyBDUFVfUEFfUklTQzFfMAotICAgICAgICAgICAgICAgICAgICAgIDUyOCkgSFBfQVJDSD0iaHBwYTEuMSIgOzsgIyBDUFVfUEFfUklTQzFfMQotICAgICAgICAgICAgICAgICAgICAgIDUzMikgICAgICAgICAgICAgICAgICAgICAgIyBDUFVfUEFfUklTQzJfMAotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtzY19rZXJuZWxfYml0c30iIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDMyKSBIUF9BUkNIPSJocHBhMi4wbiIgOzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgNjQpIEhQX0FSQ0g9ImhwcGEyLjB3IiA7OworCQkgICAgc2Nfa2VybmVsX2JpdHM9YC91c3IvYmluL2dldGNvbmYgU0NfS0VSTkVMX0JJVFMgMj4vZGV2L251bGxgCisJCSAgICBjYXNlICIke3NjX2NwdV92ZXJzaW9ufSIgaW4KKwkJICAgICAgNTIzKSBIUF9BUkNIPSJocHBhMS4wIiA7OyAjIENQVV9QQV9SSVNDMV8wCisJCSAgICAgIDUyOCkgSFBfQVJDSD0iaHBwYTEuMSIgOzsgIyBDUFVfUEFfUklTQzFfMQorCQkgICAgICA1MzIpICAgICAgICAgICAgICAgICAgICAgICMgQ1BVX1BBX1JJU0MyXzAKKwkJCWNhc2UgIiR7c2Nfa2VybmVsX2JpdHN9IiBpbgorCQkJICAzMikgSFBfQVJDSD0iaHBwYTIuMG4iIDs7CisJCQkgIDY0KSBIUF9BUkNIPSJocHBhMi4wdyIgOzsKIAkJCSAgJycpIEhQX0FSQ0g9ImhwcGEyLjAiIDs7ICAgIyBIUC1VWCAxMC4yMAotICAgICAgICAgICAgICAgICAgICAgICAgZXNhYyA7OwotICAgICAgICAgICAgICAgICAgICBlc2FjCisJCQllc2FjIDs7CisJCSAgICBlc2FjCiAJCWZpCiAJCWlmIFsgIiR7SFBfQVJDSH0iID0gIiIgXTsgdGhlbgogCQkgICAgZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCQkgICAgc2VkICdzL14gICAgICAgICAgICAgIC8vJyA8PCBFT0YgPiRkdW1teS5jCisJCSAgICBzZWQgJ3MvXgkJLy8nIDw8IEVPRiA+JGR1bW15LmMKIAotICAgICAgICAgICAgICAjZGVmaW5lIF9IUFVYX1NPVVJDRQotICAgICAgICAgICAgICAjaW5jbHVkZSA8c3RkbGliLmg+Ci0gICAgICAgICAgICAgICNpbmNsdWRlIDx1bmlzdGQuaD4KKwkJI2RlZmluZSBfSFBVWF9TT1VSQ0UKKwkJI2luY2x1ZGUgPHN0ZGxpYi5oPgorCQkjaW5jbHVkZSA8dW5pc3RkLmg+CiAKLSAgICAgICAgICAgICAgaW50IG1haW4gKCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCi0gICAgICAgICAgICAgICAgICBsb25nIGJpdHMgPSBzeXNjb25mKF9TQ19LRVJORUxfQklUUyk7Ci0gICAgICAgICAgICAgICNlbmRpZgotICAgICAgICAgICAgICAgICAgbG9uZyBjcHUgID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKKwkJaW50IG1haW4gKCkKKwkJeworCQkjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCisJCSAgICBsb25nIGJpdHMgPSBzeXNjb25mKF9TQ19LRVJORUxfQklUUyk7CisJCSNlbmRpZgorCQkgICAgbG9uZyBjcHUgID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKIAotICAgICAgICAgICAgICAgICAgc3dpdGNoIChjcHUpCi0gICAgICAgICAgICAgIAl7Ci0gICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xIik7IGJyZWFrOwotICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzJfMDoKLSAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQotICAgICAgICAgICAgICAJICAgIHN3aXRjaCAoYml0cykKLSAgICAgICAgICAgICAgCQl7Ci0gICAgICAgICAgICAgIAkJY2FzZSA2NDogcHV0cyAoImhwcGEyLjB3Iik7IGJyZWFrOwotICAgICAgICAgICAgICAJCWNhc2UgMzI6IHB1dHMgKCJocHBhMi4wbiIpOyBicmVhazsKLSAgICAgICAgICAgICAgCQlkZWZhdWx0OiBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgCQl9IGJyZWFrOwotICAgICAgICAgICAgICAjZWxzZSAgLyogIWRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKSAqLwotICAgICAgICAgICAgICAJICAgIHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOwotICAgICAgICAgICAgICAjZW5kaWYKLSAgICAgICAgICAgICAgCWRlZmF1bHQ6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOwotICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgICAgZXhpdCAoMCk7Ci0gICAgICAgICAgICAgIH0KKwkJICAgIHN3aXRjaCAoY3B1KQorCQkJeworCQkJY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7CisJCQljYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMSIpOyBicmVhazsKKwkJCWNhc2UgQ1BVX1BBX1JJU0MyXzA6CisJCSNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKKwkJCSAgICBzd2l0Y2ggKGJpdHMpCisJCQkJeworCQkJCWNhc2UgNjQ6IHB1dHMgKCJocHBhMi4wdyIpOyBicmVhazsKKwkJCQljYXNlIDMyOiBwdXRzICgiaHBwYTIuMG4iKTsgYnJlYWs7CisJCQkJZGVmYXVsdDogcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7CisJCQkJfSBicmVhazsKKwkJI2Vsc2UgIC8qICFkZWZpbmVkKF9TQ19LRVJORUxfQklUUykgKi8KKwkJCSAgICBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKKwkJI2VuZGlmCisJCQlkZWZhdWx0OiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKKwkJCX0KKwkJICAgIGV4aXQgKDApOworCQl9CiBFT0YKIAkJICAgIChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jIDI+L2Rldi9udWxsKSAmJiBIUF9BUkNIPWAkZHVtbXlgCiAJCSAgICB0ZXN0IC16ICIkSFBfQVJDSCIgJiYgSFBfQVJDSD1ocHBhCkBAIC03MjcsMjIgKzczNCwyMiBAQAogCWV4aXQgOzsKICAgICBDMSo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMxKjoqKQogCWVjaG8gYzEtY29udmV4LWJzZAotICAgICAgICBleGl0IDs7CisJZXhpdCA7OwogICAgIEMyKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzIqOiopCiAJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCiAJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCiAJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKIAlmaQotICAgICAgICBleGl0IDs7CisJZXhpdCA7OwogICAgIEMzNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzNCo6KikKIAllY2hvIGMzNC1jb252ZXgtYnNkCi0gICAgICAgIGV4aXQgOzsKKwlleGl0IDs7CiAgICAgQzM4KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM4KjoqKQogCWVjaG8gYzM4LWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCA7OworCWV4aXQgOzsKICAgICBDNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkM0KjoqKQogCWVjaG8gYzQtY29udmV4LWJzZAotICAgICAgICBleGl0IDs7CisJZXhpdCA7OwogICAgIENSQVkqWS1NUDoqOio6KikKIAllY2hvIHltcC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJwogCWV4aXQgOzsKQEAgLTc2NiwxNCArNzczLDE0IEBACiAJZXhpdCA7OwogICAgIEYzMFswMV06VU5JWF9TeXN0ZW1fVjoqOiogfCBGNzAwOlVOSVhfU3lzdGVtX1Y6KjoqKQogCUZVSklUU1VfUFJPQz1gdW5hbWUgLW0gfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCi0gICAgICAgIEZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKLSAgICAgICAgRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy8gL18vJ2AKLSAgICAgICAgZWNobyAiJHtGVUpJVFNVX1BST0N9LWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKLSAgICAgICAgZXhpdCA7OworCUZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKKwlGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzLyAvXy8nYAorCWVjaG8gIiR7RlVKSVRTVV9QUk9DfS1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCisJZXhpdCA7OwogICAgIDUwMDA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKLSAgICAgICAgRlVKSVRTVV9TWVM9YHVuYW1lIC1wIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzL1wvLy8nYAotICAgICAgICBGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzLyAvXy8nYAotICAgICAgICBlY2hvICJzcGFyYy1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCisJRlVKSVRTVV9TWVM9YHVuYW1lIC1wIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzL1wvLy8nYAorCUZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvIC9fLydgCisJZWNobyAic3BhcmMtZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgogCWV4aXQgOzsKICAgICBpKjg2OkJTRC8zODY6KjoqIHwgaSo4NjpCU0QvT1M6KjoqIHwgKjpBc2NlbmRcIEVtYmVkZGVkL09TOio6KikKIAllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYnNkaSR7VU5BTUVfUkVMRUFTRX0KQEAgLTc4NSwzMCArNzkyLDM1IEBACiAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KIAlleGl0IDs7CiAgICAgKjpGcmVlQlNEOio6KikKLQljYXNlICR7VU5BTUVfTUFDSElORX0gaW4KLQkgICAgcGM5OCkKLQkJZWNobyBpMzg2LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKKwlVTkFNRV9QUk9DRVNTT1I9YC91c3IvYmluL3VuYW1lIC1wYAorCWNhc2UgJHtVTkFNRV9QUk9DRVNTT1J9IGluCiAJICAgIGFtZDY0KQogCQllY2hvIHg4Nl82NC11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgIDs7CiAJICAgICopCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgIDs7CisJCWVjaG8gJHtVTkFNRV9QUk9DRVNTT1J9LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKIAllc2FjCiAJZXhpdCA7OwogICAgIGkqOkNZR1dJTio6KikKIAllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtY3lnd2luCiAJZXhpdCA7OworICAgICo6TUlOR1c2NCo6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluZ3c2NAorCWV4aXQgOzsKICAgICAqOk1JTkdXKjoqKQogCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5ndzMyCiAJZXhpdCA7OworICAgIGkqOk1TWVMqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1zeXMKKwlleGl0IDs7CiAgICAgaSo6d2luZG93czMyKjoqKQotICAgIAkjIHVuYW1lIC1tIGluY2x1ZGVzICItcGMiIG9uIHRoaXMgc3lzdGVtLgotICAgIAllY2hvICR7VU5BTUVfTUFDSElORX0tbWluZ3czMgorCSMgdW5hbWUgLW0gaW5jbHVkZXMgIi1wYyIgb24gdGhpcyBzeXN0ZW0uCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LW1pbmd3MzIKIAlleGl0IDs7CiAgICAgaSo6UFcqOiopCiAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXB3MzIKIAlleGl0IDs7CiAgICAgKjpJbnRlcml4KjoqKQotICAgIAljYXNlICR7VU5BTUVfTUFDSElORX0gaW4KKwljYXNlICR7VU5BTUVfTUFDSElORX0gaW4KIAkgICAgeDg2KQogCQllY2hvIGk1ODYtcGMtaW50ZXJpeCR7VU5BTUVfUkVMRUFTRX0KIAkJZXhpdCA7OwpAQCAtODU0LDYgKzg2NiwxMyBAQAogICAgIGkqODY6TWluaXg6KjoqKQogCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5peAogCWV4aXQgOzsKKyAgICBhYXJjaDY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgYWFyY2g2NF9iZTpMaW51eDoqOiopCisJVU5BTUVfTUFDSElORT1hYXJjaDY0X2JlCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OwogICAgIGFscGhhOkxpbnV4Oio6KikKIAljYXNlIGBzZWQgLW4gJy9eY3B1IG1vZGVsL3MvXi4qOiBcKC4qXCkvXDEvcCcgPCAvcHJvYy9jcHVpbmZvYCBpbgogCSAgRVY1KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjUgOzsKQEAgLTg2Myw3ICs4ODIsNyBAQAogCSAgRVY2KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjYgOzsKIAkgIEVWNjcpICBVTkFNRV9NQUNISU5FPWFscGhhZXY2NyA7OwogCSAgRVY2OCopIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY4IDs7Ci0gICAgICAgIGVzYWMKKwllc2FjCiAJb2JqZHVtcCAtLXByaXZhdGUtaGVhZGVycyAvYmluL3NoIHwgZ3JlcCAtcSBsZC5zby4xCiAJaWYgdGVzdCAiJD8iID0gMCA7IHRoZW4gTElCQz0ibGliYzEiIDsgZWxzZSBMSUJDPSIiIDsgZmkKIAllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUke0xJQkN9CkBAIC04NzUsMjAgKzg5NCwyOSBAQAogCXRoZW4KIAkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CiAJZWxzZQotCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnVlYWJpCisJICAgIGlmIGVjaG8gX19BUk1fUENTX1ZGUCB8ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCBcCisJCXwgZ3JlcCAtcSBfX0FSTV9QQ1NfVkZQCisJICAgIHRoZW4KKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251ZWFiaQorCSAgICBlbHNlCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudWVhYmloZgorCSAgICBmaQogCWZpCiAJZXhpdCA7OwogICAgIGF2cjMyKjpMaW51eDoqOiopCiAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CiAJZXhpdCA7OwogICAgIGNyaXM6TGludXg6KjoqKQotCWVjaG8gY3Jpcy1heGlzLWxpbnV4LWdudQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1heGlzLWxpbnV4LWdudQogCWV4aXQgOzsKICAgICBjcmlzdjMyOkxpbnV4Oio6KikKLQllY2hvIGNyaXN2MzItYXhpcy1saW51eC1nbnUKKwllY2hvICR7VU5BTUVfTUFDSElORX0tYXhpcy1saW51eC1nbnUKIAlleGl0IDs7CiAgICAgZnJ2OkxpbnV4Oio6KikKLSAgICAJZWNobyBmcnYtdW5rbm93bi1saW51eC1nbnUKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgaGV4YWdvbjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CiAJZXhpdCA7OwogICAgIGkqODY6TGludXg6KjoqKQogCUxJQkM9Z251CkBAIC05MzAsNyArOTU4LDcgQEAKIAl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIHsgZWNobyAiJHtDUFV9LXVua25vd24tbGludXgtZ251IjsgZXhpdDsgfQogCTs7CiAgICAgb3IzMjpMaW51eDoqOiopCi0JZWNobyBvcjMyLXVua25vd24tbGludXgtZ251CisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CiAJZXhpdCA7OwogICAgIHBhZHJlOkxpbnV4Oio6KikKIAllY2hvIHNwYXJjLXVua25vd24tbGludXgtZ251CkBAIC05NTYsNyArOTg0LDcgQEAKIAllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWxpbnV4CiAJZXhpdCA7OwogICAgIHNoNjQqOkxpbnV4Oio6KikKLSAgICAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CiAJZXhpdCA7OwogICAgIHNoKjpMaW51eDoqOiopCiAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CkBAIC05NjQsMTQgKzk5MiwxNyBAQAogICAgIHNwYXJjOkxpbnV4Oio6KiB8IHNwYXJjNjQ6TGludXg6KjoqKQogCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQogCWV4aXQgOzsKKyAgICB0aWxlKjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OwogICAgIHZheDpMaW51eDoqOiopCiAJZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1saW51eC1nbnUKIAlleGl0IDs7CiAgICAgeDg2XzY0OkxpbnV4Oio6KikKLQllY2hvIHg4Nl82NC11bmtub3duLWxpbnV4LWdudQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQogCWV4aXQgOzsKICAgICB4dGVuc2EqOkxpbnV4Oio6KikKLSAgICAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CiAJZXhpdCA7OwogICAgIGkqODY6RFlOSVgvcHR4OjQqOiopCiAJIyBwdHggNC4wIGRvZXMgdW5hbWUgLXMgY29ycmVjdGx5LCB3aXRoIERZTklYL3B0eCBpbiB0aGVyZS4KQEAgLTk4MCwxMSArMTAxMSwxMSBAQAogCWVjaG8gaTM4Ni1zZXF1ZW50LXN5c3Y0CiAJZXhpdCA7OwogICAgIGkqODY6VU5JWF9TVjo0LjJNUDoyLiopCi0gICAgICAgICMgVW5peHdhcmUgaXMgYW4gb2Zmc2hvb3Qgb2YgU1ZSNCwgYnV0IGl0IGhhcyBpdHMgb3duIHZlcnNpb24KLSAgICAgICAgIyBudW1iZXIgc2VyaWVzIHN0YXJ0aW5nIHdpdGggMi4uLgotICAgICAgICAjIEkgYW0gbm90IHBvc2l0aXZlIHRoYXQgb3RoZXIgU1ZSNCBzeXN0ZW1zIHdvbid0IG1hdGNoIHRoaXMsCisJIyBVbml4d2FyZSBpcyBhbiBvZmZzaG9vdCBvZiBTVlI0LCBidXQgaXQgaGFzIGl0cyBvd24gdmVyc2lvbgorCSMgbnVtYmVyIHNlcmllcyBzdGFydGluZyB3aXRoIDIuLi4KKwkjIEkgYW0gbm90IHBvc2l0aXZlIHRoYXQgb3RoZXIgU1ZSNCBzeXN0ZW1zIHdvbid0IG1hdGNoIHRoaXMsCiAJIyBJIGp1c3QgaGF2ZSB0byBob3BlLiAgLS0gcm1zLgotICAgICAgICAjIFVzZSBzeXN2NC4ydXcuLi4gc28gdGhhdCBzeXN2NCogbWF0Y2hlcyBpdC4KKwkjIFVzZSBzeXN2NC4ydXcuLi4gc28gdGhhdCBzeXN2NCogbWF0Y2hlcyBpdC4KIAllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjQuMnV3JHtVTkFNRV9WRVJTSU9OfQogCWV4aXQgOzsKICAgICBpKjg2Ok9TLzI6KjoqKQpAQCAtMTAxNiw3ICsxMDQ3LDcgQEAKIAlmaQogCWV4aXQgOzsKICAgICBpKjg2Oio6NTpbNjc4XSopCi0gICAgCSMgVW5peFdhcmUgNy54LCBPcGVuVU5JWCBhbmQgT3BlblNlcnZlciA2LgorCSMgVW5peFdhcmUgNy54LCBPcGVuVU5JWCBhbmQgT3BlblNlcnZlciA2LgogCWNhc2UgYC9iaW4vdW5hbWUgLVggfCBncmVwICJeTWFjaGluZSJgIGluCiAJICAgICo0ODYqKQkgICAgIFVOQU1FX01BQ0hJTkU9aTQ4NiA7OwogCSAgICAqUGVudGl1bSkJICAgICBVTkFNRV9NQUNISU5FPWk1ODYgOzsKQEAgLTEwNDQsMTMgKzEwNzUsMTMgQEAKIAlleGl0IDs7CiAgICAgcGM6KjoqOiopCiAJIyBMZWZ0IGhlcmUgZm9yIGNvbXBhdGliaWxpdHk6Ci0gICAgICAgICMgdW5hbWUgLW0gcHJpbnRzIGZvciBESkdQUCBhbHdheXMgJ3BjJywgYnV0IGl0IHByaW50cyBub3RoaW5nIGFib3V0Ci0gICAgICAgICMgdGhlIHByb2Nlc3Nvciwgc28gd2UgcGxheSBzYWZlIGJ5IGFzc3VtaW5nIGk1ODYuCisJIyB1bmFtZSAtbSBwcmludHMgZm9yIERKR1BQIGFsd2F5cyAncGMnLCBidXQgaXQgcHJpbnRzIG5vdGhpbmcgYWJvdXQKKwkjIHRoZSBwcm9jZXNzb3IsIHNvIHdlIHBsYXkgc2FmZSBieSBhc3N1bWluZyBpNTg2LgogCSMgTm90ZTogd2hhdGV2ZXIgdGhpcyBpcywgaXQgTVVTVCBiZSB0aGUgc2FtZSBhcyB3aGF0IGNvbmZpZy5zdWIKIAkjIHByaW50cyBmb3IgdGhlICJkamdwcCIgaG9zdCwgb3IgZWxzZSBHREIgY29uZmlndXJ5IHdpbGwgZGVjaWRlIHRoYXQKIAkjIHRoaXMgaXMgYSBjcm9zcy1idWlsZC4KIAllY2hvIGk1ODYtcGMtbXNkb3NkamdwcAotICAgICAgICBleGl0IDs7CisJZXhpdCA7OwogICAgIEludGVsOk1hY2g6Myo6KikKIAllY2hvIGkzODYtcGMtbWFjaDMKIAlleGl0IDs7CkBAIC0xMDg1LDggKzExMTYsOCBAQAogCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAogCSAgJiYgeyBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0gOzsKICAgICAzWzM0XT8/Oio6NC4wOiogfCAzWzM0XT8/LCo6Kjo0LjA6KikKLSAgICAgICAgL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCi0gICAgICAgICAgJiYgeyBlY2hvIGk0ODYtbmNyLXN5c3Y0OyBleGl0OyB9IDs7CisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisJICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQ7IGV4aXQ7IH0gOzsKICAgICBOQ1IqOio6NC4yOiogfCBNUFJBUyo6Kjo0LjI6KikKIAlPU19SRUw9Jy4zJwogCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXApAQCAtMTEyOSwxMCArMTE2MCwxMCBAQAogCQllY2hvIG5zMzJrLXNuaS1zeXN2CiAJZmkKIAlleGl0IDs7Ci0gICAgUEVOVElVTToqOjQuMCo6KikgIyBVbmlzeXMgYENsZWFyUGF0aCBITVAgSVggNDAwMCcgU1ZSNC9NUCBlZmZvcnQKLSAgICAgICAgICAgICAgICAgICAgICAjIHNheXMgPFJpY2hhcmQuTS5CYXJ0ZWxAY2NNYWlsLkNlbnN1cy5HT1Y+Ci0gICAgICAgIGVjaG8gaTU4Ni11bmlzeXMtc3lzdjQKLSAgICAgICAgZXhpdCA7OworICAgIFBFTlRJVU06Kjo0LjAqOiopCSMgVW5pc3lzIGBDbGVhclBhdGggSE1QIElYIDQwMDAnIFNWUjQvTVAgZWZmb3J0CisJCQkjIHNheXMgPFJpY2hhcmQuTS5CYXJ0ZWxAY2NNYWlsLkNlbnN1cy5HT1Y+CisJZWNobyBpNTg2LXVuaXN5cy1zeXN2NAorCWV4aXQgOzsKICAgICAqOlVOSVhfU3lzdGVtX1Y6NCo6RlRYKikKIAkjIEZyb20gR2VyYWxkIEhld2VzIDxoZXdlc0BvcGVubWFya2V0LmNvbT4uCiAJIyBIb3cgYWJvdXQgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gc3RyYXR1cyBhcmNoaXRlY3R1cmVzPyAtZGptCkBAIC0xMTU4LDExICsxMTg5LDExIEBACiAJZXhpdCA7OwogICAgIFJbMzRdMDAwOipTeXN0ZW1fVio6KjoqIHwgUjQwMDA6VU5JWF9TWVNWOio6KiB8IFIqMDAwOlVOSVhfU1Y6KjoqKQogCWlmIFsgLWQgL3Vzci9uZWMgXTsgdGhlbgotCSAgICAgICAgZWNobyBtaXBzLW5lYy1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCQllY2hvIG1pcHMtbmVjLXN5c3Yke1VOQU1FX1JFTEVBU0V9CiAJZWxzZQotCSAgICAgICAgZWNobyBtaXBzLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwkJZWNobyBtaXBzLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0KIAlmaQotICAgICAgICBleGl0IDs7CisJZXhpdCA7OwogICAgIEJlQm94OkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBoYXJkd2FyZSBtYWRlIGJ5IEJlLCBQUEMgb25seS4KIAllY2hvIHBvd2VycGMtYmUtYmVvcwogCWV4aXQgOzsKQEAgLTExNzUsNiArMTIwNiw5IEBACiAgICAgQmVQQzpIYWlrdToqOiopCSMgSGFpa3UgcnVubmluZyBvbiBJbnRlbCBQQyBjb21wYXRpYmxlLgogCWVjaG8gaTU4Ni1wYy1oYWlrdQogCWV4aXQgOzsKKyAgICB4ODZfNjQ6SGFpa3U6KjoqKQorCWVjaG8geDg2XzY0LXVua25vd24taGFpa3UKKwlleGl0IDs7CiAgICAgU1gtNDpTVVBFUi1VWDoqOiopCiAJZWNobyBzeDQtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CiAJZXhpdCA7OwpAQCAtMTIyNyw3ICsxMjYxLDEwIEBACiAgICAgKjpRTlg6Kjo0KikKIAllY2hvIGkzODYtcGMtcW54CiAJZXhpdCA7OwotICAgIE5TRS0/Ok5PTlNUT1BfS0VSTkVMOio6KikKKyAgICBORU8tPzpOT05TVE9QX0tFUk5FTDoqOiopCisJZWNobyBuZW8tdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgTlNFLSo6Tk9OU1RPUF9LRVJORUw6KjoqKQogCWVjaG8gbnNlLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9CiAJZXhpdCA7OwogICAgIE5TUi0/Ok5PTlNUT1BfS0VSTkVMOio6KikKQEAgLTEyNzIsMTMgKzEzMDksMTMgQEAKIAllY2hvIHBkcDEwLXVua25vd24taXRzCiAJZXhpdCA7OwogICAgIFNFSToqOio6U0VJVVgpCi0gICAgICAgIGVjaG8gbWlwcy1zZWktc2VpdXgke1VOQU1FX1JFTEVBU0V9CisJZWNobyBtaXBzLXNlaS1zZWl1eCR7VU5BTUVfUkVMRUFTRX0KIAlleGl0IDs7CiAgICAgKjpEcmFnb25GbHk6KjoqKQogCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWRyYWdvbmZseWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AKIAlleGl0IDs7CiAgICAgKjoqVk1TOio6KikKLSAgICAJVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKwlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAogCWNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCiAJICAgIEEqKSBlY2hvIGFscGhhLWRlYy12bXMgOyBleGl0IDs7CiAJICAgIEkqKSBlY2hvIGlhNjQtZGVjLXZtcyA7IGV4aXQgOzsKQEAgLTEyOTYsMTEgKzEzMzMsMTEgQEAKICAgICBpKjg2OkFST1M6KjoqKQogCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1hcm9zCiAJZXhpdCA7OworICAgIHg4Nl82NDpWTWtlcm5lbDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZXN4CisJZXhpdCA7OwogZXNhYwogCi0jZWNobyAnKE5vIHVuYW1lIGNvbW1hbmQgb3IgdW5hbWUgb3V0cHV0IG5vdCByZWNvZ25pemVkLiknIDE+JjIKLSNlY2hvICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIDE+JjIKLQogZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAogY2F0ID4kZHVtbXkuYyA8PEVPRgogI2lmZGVmIF9TRVFVRU5UXwpAQCAtMTMxOCwxMSArMTM1NSwxMSBAQAogI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgogICBwcmludGYgKCJtNjhrLXNvbnktbmV3c29zJXNcbiIsCiAjaWZkZWYgTkVXU09TNAotICAgICAgICAgICI0IgorCSI0IgogI2Vsc2UKLQkgICIiCisJIiIKICNlbmRpZgotICAgICAgICAgKTsgZXhpdCAoMCk7CisJKTsgZXhpdCAoMCk7CiAjZW5kaWYKICNlbmRpZgogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2NvbmZpZy5zdWIgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2NvbmZpZy5zdWIKaW5kZXggMTdjOTE0NS4uODAyYTIyNCAxMDA3NTUKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9jb25maWcuc3ViCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvY29uZmlnLnN1YgpAQCAtMSwzOCArMSwzMyBAQAogIyEgL2Jpbi9zaAogIyBDb25maWd1cmF0aW9uIHZhbGlkYXRpb24gc3Vicm91dGluZSBzY3JpcHQuCiAjICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LAotIyAgIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkKLSMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgICAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLAorIyAgIDIwMTEsIDIwMTIsIDIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAKLXRpbWVzdGFtcD0nMjAwOS0xMS0wNycKK3RpbWVzdGFtcD0nMjAxMi0xMi0yOScKIAotIyBUaGlzIGZpbGUgaXMgKGluIHByaW5jaXBsZSkgY29tbW9uIHRvIEFMTCBHTlUgc29mdHdhcmUuCi0jIFRoZSBwcmVzZW5jZSBvZiBhIG1hY2hpbmUgaW4gdGhpcyBmaWxlIHN1Z2dlc3RzIHRoYXQgU09NRSBHTlUgc29mdHdhcmUKLSMgY2FuIGhhbmRsZSB0aGF0IG1hY2hpbmUuICBJdCBkb2VzIG5vdCBpbXBseSBBTEwgR05VIHNvZnR3YXJlIGNhbi4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICMKICMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSMgMDIxMTAtMTMwMSwgVVNBLgorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogIwogIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CiAjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQogIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQKKyMgcHJvZ3JhbS4gIFRoaXMgRXhjZXB0aW9uIGlzIGFuIGFkZGl0aW9uYWwgcGVybWlzc2lvbiB1bmRlciBzZWN0aW9uIDcKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDMgKCJHUEx2MyIpLgogCiAKLSMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uICBTdWJtaXQgYSBjb250ZXh0Ci0jIGRpZmYgYW5kIGEgcHJvcGVybHkgZm9ybWF0dGVkIEdOVSBDaGFuZ2VMb2cgZW50cnkuCisjIFBsZWFzZSBzZW5kIHBhdGNoZXMgd2l0aCBhIENoYW5nZUxvZyBlbnRyeSB0byBjb25maWctcGF0Y2hlc0BnbnUub3JnLgogIwogIyBDb25maWd1cmF0aW9uIHN1YnJvdXRpbmUgdG8gdmFsaWRhdGUgYW5kIGNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gdHlwZS4KICMgU3VwcGx5IHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiB0eXBlIGFzIGFuIGFyZ3VtZW50LgpAQCAtNzUsOCArNzAsOSBAQAogdmVyc2lvbj0iXAogR05VIGNvbmZpZy5zdWIgKCR0aW1lc3RhbXApCiAKLUNvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKLTIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsCisyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExLAorMjAxMiwgMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KIAogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KIHdhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKQEAgLTEyMywxMyArMTE5LDE4IEBACiAjIEhlcmUgd2UgbXVzdCByZWNvZ25pemUgYWxsIHRoZSB2YWxpZCBLRVJORUwtT1MgY29tYmluYXRpb25zLgogbWF5YmVfb3M9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wyLydgCiBjYXNlICRtYXliZV9vcyBpbgotICBudG8tcW54KiB8IGxpbnV4LWdudSogfCBsaW51eC1kaWV0bGliYyB8IGxpbnV4LW5ld2xpYiogfCBsaW51eC11Y2xpYmMqIHwgXAotICB1Y2xpbnV4LXVjbGliYyogfCB1Y2xpbnV4LWdudSogfCBrZnJlZWJzZCotZ251KiB8IGtuZXRic2QqLWdudSogfCBuZXRic2QqLWdudSogfCBcCisgIG50by1xbngqIHwgbGludXgtZ251KiB8IGxpbnV4LWFuZHJvaWQqIHwgbGludXgtZGlldGxpYmMgfCBsaW51eC1uZXdsaWIqIHwgXAorICBsaW51eC1tdXNsKiB8IGxpbnV4LXVjbGliYyogfCB1Y2xpbnV4LXVjbGliYyogfCB1Y2xpbnV4LWdudSogfCBrZnJlZWJzZCotZ251KiB8IFwKKyAga25ldGJzZCotZ251KiB8IG5ldGJzZCotZ251KiB8IFwKICAga29wZW5zb2xhcmlzKi1nbnUqIHwgXAogICBzdG9ybS1jaGFvcyogfCBvczItZW14KiB8IHJ0bWstbm92YSopCiAgICAgb3M9LSRtYXliZV9vcwogICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wxLydgCiAgICAgOzsKKyAgYW5kcm9pZC1saW51eCkKKyAgICBvcz0tbGludXgtYW5kcm9pZAorICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wxLydgLXVua25vd24KKyAgICA7OwogICAqKQogICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvLVteLV0qJC8vJ2AKICAgICBpZiBbICRiYXNpY19tYWNoaW5lICE9ICQxIF0KQEAgLTE1MiwxMiArMTUzLDEyIEBACiAJLWNvbnZlcmdlbnQqIHwgLW5jciogfCAtbmV3cyB8IC0zMiogfCAtMzYwMCogfCAtMzEwMCogfCAtaGl0YWNoaSogfFwKIAktY1sxMjNdKiB8IC1jb252ZXgqIHwgLXN1biB8IC1jcmRzIHwgLW9tcm9uKiB8IC1kZyB8IC11bHRyYSB8IC10dGkqIHwgXAogCS1oYXJyaXMgfCAtZG9scGhpbiB8IC1oaWdobGV2ZWwgfCAtZ291bGQgfCAtY2JtIHwgLW5zIHwgLW1hc3Njb21wIHwgXAotCS1hcHBsZSB8IC1heGlzIHwgLWtudXRoIHwgLWNyYXkgfCAtbWljcm9ibGF6ZSkKKwktYXBwbGUgfCAtYXhpcyB8IC1rbnV0aCB8IC1jcmF5IHwgLW1pY3JvYmxhemUqKQogCQlvcz0KIAkJYmFzaWNfbWFjaGluZT0kMQogCQk7OwotICAgICAgICAtYmx1ZWdlbmUqKQotCSAgICAgICAgb3M9LWNuaworCS1ibHVlZ2VuZSopCisJCW9zPS1jbmsKIAkJOzsKIAktc2ltIHwgLWNpc2NvIHwgLW9raSB8IC13ZWMgfCAtd2luYm9uZCkKIAkJb3M9CkBAIC0xNzMsMTAgKzE3NCwxMCBAQAogCQlvcz0tY2hvcnVzb3MKIAkJYmFzaWNfbWFjaGluZT0kMQogCQk7OwotIAktY2hvcnVzcmRiKQotIAkJb3M9LWNob3J1c3JkYgorCS1jaG9ydXNyZGIpCisJCW9zPS1jaG9ydXNyZGIKIAkJYmFzaWNfbWFjaGluZT0kMQotIAkJOzsKKwkJOzsKIAktaGl1eCopCiAJCW9zPS1oaXV4d2UyCiAJCTs7CkBAIC0yMjEsNiArMjIyLDEyIEBACiAJLWlzYyopCiAJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKIAkJOzsKKwktbHlueCoxNzgpCisJCW9zPS1seW54b3MxNzgKKwkJOzsKKwktbHlueCo1KQorCQlvcz0tbHlueG9zNQorCQk7OwogCS1seW54KikKIAkJb3M9LWx5bnhvcwogCQk7OwpAQCAtMjQ1LDIwICsyNTIsMjcgQEAKIAkjIFNvbWUgYXJlIG9taXR0ZWQgaGVyZSBiZWNhdXNlIHRoZXkgaGF2ZSBzcGVjaWFsIG1lYW5pbmdzIGJlbG93LgogCTE3NTBhIHwgNTgwIFwKIAl8IGEyOWsgXAorCXwgYWFyY2g2NCB8IGFhcmNoNjRfYmUgXAogCXwgYWxwaGEgfCBhbHBoYWV2WzQtOF0gfCBhbHBoYWV2NTYgfCBhbHBoYWV2Nls3OF0gfCBhbHBoYXBjYTVbNjddIFwKIAl8IGFscGhhNjQgfCBhbHBoYTY0ZXZbNC04XSB8IGFscGhhNjRldjU2IHwgYWxwaGE2NGV2Nls3OF0gfCBhbHBoYTY0cGNhNVs2N10gXAogCXwgYW0zM18yLjAgXAotCXwgYXJjIHwgYXJtIHwgYXJtW2JsXWUgfCBhcm1lW2xiXSB8IGFybXZbMjM0NV0gfCBhcm12WzM0NV1bbGJdIHwgYXZyIHwgYXZyMzIgXAorCXwgYXJjIFwKKwl8IGFybSB8IGFybVtibF1lIHwgYXJtZVtsYl0gfCBhcm12WzItOF0gfCBhcm12WzMtOF1bbGJdIHwgYXJtdjdbYXJtXSBcCisJfCBhdnIgfCBhdnIzMiBcCisJfCBiZTMyIHwgYmU2NCBcCiAJfCBiZmluIFwKIAl8IGM0eCB8IGNsaXBwZXIgXAogCXwgZDEwdiB8IGQzMHYgfCBkbHggfCBkc3AxNnh4IFwKKwl8IGVwaXBoYW55IFwKIAl8IGZpZG8gfCBmcjMwIHwgZnJ2IFwKIAl8IGg4MzAwIHwgaDg1MDAgfCBocHBhIHwgaHBwYTEuWzAxXSB8IGhwcGEyLjAgfCBocHBhMi4wW253XSB8IGhwcGE2NCBcCisJfCBoZXhhZ29uIFwKIAl8IGkzNzAgfCBpODYwIHwgaTk2MCB8IGlhNjQgXAogCXwgaXAyayB8IGlxMjAwMCBcCisJfCBsZTMyIHwgbGU2NCBcCiAJfCBsbTMyIFwKIAl8IG0zMmMgfCBtMzJyIHwgbTMycmxlIHwgbTY4MDAwIHwgbTY4ayB8IG04OGsgXAotCXwgbWF4cSB8IG1iIHwgbWljcm9ibGF6ZSB8IG1jb3JlIHwgbWVwIHwgbWV0YWcgXAorCXwgbWF4cSB8IG1iIHwgbWljcm9ibGF6ZSB8IG1pY3JvYmxhemVlbCB8IG1jb3JlIHwgbWVwIHwgbWV0YWcgXAogCXwgbWlwcyB8IG1pcHNiZSB8IG1pcHNlYiB8IG1pcHNlbCB8IG1pcHNsZSBcCiAJfCBtaXBzMTYgXAogCXwgbWlwczY0IHwgbWlwczY0ZWwgXApAQCAtMjgxLDI5ICsyOTUsMzkgQEAKIAl8IG1veGllIFwKIAl8IG10IFwKIAl8IG1zcDQzMCBcCisJfCBuZHMzMiB8IG5kczMybGUgfCBuZHMzMmJlIFwKIAl8IG5pb3MgfCBuaW9zMiBcCiAJfCBuczE2ayB8IG5zMzJrIFwKKwl8IG9wZW44IFwKIAl8IG9yMzIgXAogCXwgcGRwMTAgfCBwZHAxMSB8IHBqIHwgcGpsIFwKLQl8IHBvd2VycGMgfCBwb3dlcnBjNjQgfCBwb3dlcnBjNjRsZSB8IHBvd2VycGNsZSB8IHBwY2JlIFwKKwl8IHBvd2VycGMgfCBwb3dlcnBjNjQgfCBwb3dlcnBjNjRsZSB8IHBvd2VycGNsZSBcCiAJfCBweXJhbWlkIFwKLQl8IHJ4IFwKKwl8IHJsNzggfCByeCBcCiAJfCBzY29yZSBcCiAJfCBzaCB8IHNoWzEyMzRdIHwgc2hbMjRdYSB8IHNoWzI0XWFlYiB8IHNoWzIzXWUgfCBzaFszNF1lYiB8IHNoZWIgfCBzaGJlIHwgc2hsZSB8IHNoWzEyMzRdbGUgfCBzaDNlbGUgXAogCXwgc2g2NCB8IHNoNjRsZSBcCiAJfCBzcGFyYyB8IHNwYXJjNjQgfCBzcGFyYzY0YiB8IHNwYXJjNjR2IHwgc3BhcmM4NnggfCBzcGFyY2xldCB8IHNwYXJjbGl0ZSBcCiAJfCBzcGFyY3Y4IHwgc3BhcmN2OSB8IHNwYXJjdjliIHwgc3BhcmN2OXYgXAotCXwgc3B1IHwgc3Ryb25nYXJtIFwKLQl8IHRhaG9lIHwgdGh1bWIgfCB0aWM0eCB8IHRpYzgwIHwgdHJvbiBcCisJfCBzcHUgXAorCXwgdGFob2UgfCB0aWM0eCB8IHRpYzU0eCB8IHRpYzU1eCB8IHRpYzZ4IHwgdGljODAgfCB0cm9uIFwKIAl8IHViaWNvbTMyIFwKLQl8IHY4NTAgfCB2ODUwZSBcCisJfCB2ODUwIHwgdjg1MGUgfCB2ODUwZTEgfCB2ODUwZTIgfCB2ODUwZXMgfCB2ODUwZTJ2MyBcCiAJfCB3ZTMyayBcCi0JfCB4ODYgfCB4YzE2eCB8IHhzY2FsZSB8IHhzY2FsZWVbYmxdIHwgeHN0b3JteTE2IHwgeHRlbnNhIFwKKwl8IHg4NiB8IHhjMTZ4IHwgeHN0b3JteTE2IHwgeHRlbnNhIFwKIAl8IHo4ayB8IHo4MCkKIAkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCiAJCTs7Ci0JbTY4MTEgfCBtNjhoYzExIHwgbTY4MTIgfCBtNjhoYzEyIHwgcGljb2NoaXApCi0JCSMgTW90b3JvbGEgNjhIQzExLzEyLgorCWM1NHgpCisJCWJhc2ljX21hY2hpbmU9dGljNTR4LXVua25vd24KKwkJOzsKKwljNTV4KQorCQliYXNpY19tYWNoaW5lPXRpYzU1eC11bmtub3duCisJCTs7CisJYzZ4KQorCQliYXNpY19tYWNoaW5lPXRpYzZ4LXVua25vd24KKwkJOzsKKwltNjgxMSB8IG02OGhjMTEgfCBtNjgxMiB8IG02OGhjMTIgfCBtNjhoY3MxMnggfCBwaWNvY2hpcCkKIAkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCiAJCW9zPS1ub25lCiAJCTs7CkBAIC0zMTMsNiArMzM3LDIxIEBACiAJCWJhc2ljX21hY2hpbmU9bXQtdW5rbm93bgogCQk7OwogCisJc3Ryb25nYXJtIHwgdGh1bWIgfCB4c2NhbGUpCisJCWJhc2ljX21hY2hpbmU9YXJtLXVua25vd24KKwkJOzsKKwl4Z2F0ZSkKKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCW9zPS1ub25lCisJCTs7CisJeHNjYWxlZWIpCisJCWJhc2ljX21hY2hpbmU9YXJtZWItdW5rbm93bgorCQk7OworCisJeHNjYWxlZWwpCisJCWJhc2ljX21hY2hpbmU9YXJtZWwtdW5rbm93bgorCQk7OworCiAJIyBXZSB1c2UgYHBjJyByYXRoZXIgdGhhbiBgdW5rbm93bicKIAkjIGJlY2F1c2UgKDEpIHRoYXQncyB3aGF0IHRoZXkgbm9ybWFsbHkgYXJlLCBhbmQKIAkjICgyKSB0aGUgd29yZCAidW5rbm93biIgdGVuZHMgdG8gY29uZnVzZSBiZWdpbm5pbmcgdXNlcnMuCkBAIC0zMjcsMjUgKzM2NiwzMCBAQAogCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aCBjb21wYW55IG5hbWUuCiAJNTgwLSogXAogCXwgYTI5ay0qIFwKKwl8IGFhcmNoNjQtKiB8IGFhcmNoNjRfYmUtKiBcCiAJfCBhbHBoYS0qIHwgYWxwaGFldls0LThdLSogfCBhbHBoYWV2NTYtKiB8IGFscGhhZXY2Wzc4XS0qIFwKIAl8IGFscGhhNjQtKiB8IGFscGhhNjRldls0LThdLSogfCBhbHBoYTY0ZXY1Ni0qIHwgYWxwaGE2NGV2Nls3OF0tKiBcCiAJfCBhbHBoYXBjYTVbNjddLSogfCBhbHBoYTY0cGNhNVs2N10tKiB8IGFyYy0qIFwKIAl8IGFybS0qICB8IGFybWJlLSogfCBhcm1sZS0qIHwgYXJtZWItKiB8IGFybXYqLSogXAogCXwgYXZyLSogfCBhdnIzMi0qIFwKKwl8IGJlMzItKiB8IGJlNjQtKiBcCiAJfCBiZmluLSogfCBiczIwMDAtKiBcCi0JfCBjWzEyM10qIHwgYzMwLSogfCBbY2p0XTkwLSogfCBjNHgtKiB8IGM1NHgtKiB8IGM1NXgtKiB8IGM2eC0qIFwKKwl8IGNbMTIzXSogfCBjMzAtKiB8IFtjanRdOTAtKiB8IGM0eC0qIFwKIAl8IGNsaXBwZXItKiB8IGNyYXludi0qIHwgY3lkcmEtKiBcCiAJfCBkMTB2LSogfCBkMzB2LSogfCBkbHgtKiBcCiAJfCBlbHhzaS0qIFwKIAl8IGYzMFswMV0tKiB8IGY3MDAtKiB8IGZpZG8tKiB8IGZyMzAtKiB8IGZydi0qIHwgZng4MC0qIFwKIAl8IGg4MzAwLSogfCBoODUwMC0qIFwKIAl8IGhwcGEtKiB8IGhwcGExLlswMV0tKiB8IGhwcGEyLjAtKiB8IGhwcGEyLjBbbnddLSogfCBocHBhNjQtKiBcCisJfCBoZXhhZ29uLSogXAogCXwgaSo4Ni0qIHwgaTg2MC0qIHwgaTk2MC0qIHwgaWE2NC0qIFwKIAl8IGlwMmstKiB8IGlxMjAwMC0qIFwKKwl8IGxlMzItKiB8IGxlNjQtKiBcCiAJfCBsbTMyLSogXAogCXwgbTMyYy0qIHwgbTMyci0qIHwgbTMycmxlLSogXAogCXwgbTY4MDAwLSogfCBtNjgwWzAxMjM0Nl0wLSogfCBtNjgzNjAtKiB8IG02ODM/Mi0qIHwgbTY4ay0qIFwKLQl8IG04ODExMC0qIHwgbTg4ay0qIHwgbWF4cS0qIHwgbWNvcmUtKiB8IG1ldGFnLSogfCBtaWNyb2JsYXplLSogXAorCXwgbTg4MTEwLSogfCBtODhrLSogfCBtYXhxLSogfCBtY29yZS0qIHwgbWV0YWctKiBcCisJfCBtaWNyb2JsYXplLSogfCBtaWNyb2JsYXplZWwtKiBcCiAJfCBtaXBzLSogfCBtaXBzYmUtKiB8IG1pcHNlYi0qIHwgbWlwc2VsLSogfCBtaXBzbGUtKiBcCiAJfCBtaXBzMTYtKiBcCiAJfCBtaXBzNjQtKiB8IG1pcHM2NGVsLSogXApAQCAtMzY3LDI1ICs0MTEsMjkgQEAKIAl8IG1taXgtKiBcCiAJfCBtdC0qIFwKIAl8IG1zcDQzMC0qIFwKKwl8IG5kczMyLSogfCBuZHMzMmxlLSogfCBuZHMzMmJlLSogXAogCXwgbmlvcy0qIHwgbmlvczItKiBcCiAJfCBub25lLSogfCBucDEtKiB8IG5zMTZrLSogfCBuczMyay0qIFwKKwl8IG9wZW44LSogXAogCXwgb3Jpb24tKiBcCiAJfCBwZHAxMC0qIHwgcGRwMTEtKiB8IHBqLSogfCBwamwtKiB8IHBuLSogfCBwb3dlci0qIFwKLQl8IHBvd2VycGMtKiB8IHBvd2VycGM2NC0qIHwgcG93ZXJwYzY0bGUtKiB8IHBvd2VycGNsZS0qIHwgcHBjYmUtKiBcCisJfCBwb3dlcnBjLSogfCBwb3dlcnBjNjQtKiB8IHBvd2VycGM2NGxlLSogfCBwb3dlcnBjbGUtKiBcCiAJfCBweXJhbWlkLSogXAotCXwgcm9tcC0qIHwgcnM2MDAwLSogfCByeC0qIFwKKwl8IHJsNzgtKiB8IHJvbXAtKiB8IHJzNjAwMC0qIHwgcngtKiBcCiAJfCBzaC0qIHwgc2hbMTIzNF0tKiB8IHNoWzI0XWEtKiB8IHNoWzI0XWFlYi0qIHwgc2hbMjNdZS0qIHwgc2hbMzRdZWItKiB8IHNoZWItKiB8IHNoYmUtKiBcCiAJfCBzaGxlLSogfCBzaFsxMjM0XWxlLSogfCBzaDNlbGUtKiB8IHNoNjQtKiB8IHNoNjRsZS0qIFwKIAl8IHNwYXJjLSogfCBzcGFyYzY0LSogfCBzcGFyYzY0Yi0qIHwgc3BhcmM2NHYtKiB8IHNwYXJjODZ4LSogfCBzcGFyY2xldC0qIFwKIAl8IHNwYXJjbGl0ZS0qIFwKLQl8IHNwYXJjdjgtKiB8IHNwYXJjdjktKiB8IHNwYXJjdjliLSogfCBzcGFyY3Y5di0qIHwgc3Ryb25nYXJtLSogfCBzdjEtKiB8IHN4Py0qIFwKLQl8IHRhaG9lLSogfCB0aHVtYi0qIFwKLQl8IHRpYzMwLSogfCB0aWM0eC0qIHwgdGljNTR4LSogfCB0aWM1NXgtKiB8IHRpYzZ4LSogfCB0aWM4MC0qIHwgdGlsZS0qIFwKKwl8IHNwYXJjdjgtKiB8IHNwYXJjdjktKiB8IHNwYXJjdjliLSogfCBzcGFyY3Y5di0qIHwgc3YxLSogfCBzeD8tKiBcCisJfCB0YWhvZS0qIFwKKwl8IHRpYzMwLSogfCB0aWM0eC0qIHwgdGljNTR4LSogfCB0aWM1NXgtKiB8IHRpYzZ4LSogfCB0aWM4MC0qIFwKKwl8IHRpbGUqLSogXAogCXwgdHJvbi0qIFwKIAl8IHViaWNvbTMyLSogXAotCXwgdjg1MC0qIHwgdjg1MGUtKiB8IHZheC0qIFwKKwl8IHY4NTAtKiB8IHY4NTBlLSogfCB2ODUwZTEtKiB8IHY4NTBlcy0qIHwgdjg1MGUyLSogfCB2ODUwZTJ2My0qIFwKKwl8IHZheC0qIFwKIAl8IHdlMzJrLSogXAotCXwgeDg2LSogfCB4ODZfNjQtKiB8IHhjMTZ4LSogfCB4cHMxMDAtKiB8IHhzY2FsZS0qIHwgeHNjYWxlZVtibF0tKiBcCisJfCB4ODYtKiB8IHg4Nl82NC0qIHwgeGMxNngtKiB8IHhwczEwMC0qIFwKIAl8IHhzdG9ybXkxNi0qIHwgeHRlbnNhKi0qIFwKIAl8IHltcC0qIFwKIAl8IHo4ay0qIHwgejgwLSopCkBAIC00MTAsNyArNDU4LDcgQEAKIAkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAogCQlvcz0tdWRpCiAJCTs7Ci0gICAgCWFiYWN1cykKKwlhYmFjdXMpCiAJCWJhc2ljX21hY2hpbmU9YWJhY3VzLXVua25vd24KIAkJOzsKIAlhZG9iZTY4aykKQEAgLTQ4MCwxMSArNTI4LDIwIEBACiAJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1pYm0KIAkJb3M9LWNuawogCQk7OworCWM1NHgtKikKKwkJYmFzaWNfbWFjaGluZT10aWM1NHgtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwljNTV4LSopCisJCWJhc2ljX21hY2hpbmU9dGljNTV4LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJYzZ4LSopCisJCWJhc2ljX21hY2hpbmU9dGljNngtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKIAljOTApCiAJCWJhc2ljX21hY2hpbmU9YzkwLWNyYXkKIAkJb3M9LXVuaWNvcwogCQk7OwotICAgICAgICBjZWdjYykKKwljZWdjYykKIAkJYmFzaWNfbWFjaGluZT1hcm0tdW5rbm93bgogCQlvcz0tY2VnY2MKIAkJOzsKQEAgLTUxNiw3ICs1NzMsNyBAQAogCQliYXNpY19tYWNoaW5lPWNyYXludi1jcmF5CiAJCW9zPS11bmljb3NtcAogCQk7OwotCWNyMTYpCisJY3IxNiB8IGNyMTYtKikKIAkJYmFzaWNfbWFjaGluZT1jcjE2LXVua25vd24KIAkJb3M9LWVsZgogCQk7OwpAQCAtNjc0LDcgKzczMSw2IEBACiAJaTM3MC1pYm0qIHwgaWJtKikKIAkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQogCQk7OwotIyBJJ20gbm90IHN1cmUgd2hhdCAiU3lzdjMyIiBtZWFucy4gIFNob3VsZCB0aGlzIGJlIHN5c3YzLjI/CiAJaSo4NnYzMikKIAkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCiAJCW9zPS1zeXN2MzIKQEAgLTczMiw5ICs3ODgsMTMgQEAKIAkJYmFzaWNfbWFjaGluZT1uczMyay11dGVrCiAJCW9zPS1zeXN2CiAJCTs7Ci0gICAgICAgIG1pY3JvYmxhemUpCisJbWljcm9ibGF6ZSopCiAJCWJhc2ljX21hY2hpbmU9bWljcm9ibGF6ZS14aWxpbngKIAkJOzsKKwltaW5ndzY0KQorCQliYXNpY19tYWNoaW5lPXg4Nl82NC1wYworCQlvcz0tbWluZ3c2NAorCQk7OwogCW1pbmd3MzIpCiAJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYwogCQlvcz0tbWluZ3czMgpAQCAtNzcxLDEwICs4MzEsMTggQEAKIAltczEtKikKIAkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9tczEtL210LS8nYAogCQk7OworCW1zeXMpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tbXN5cworCQk7OwogCW12cykKIAkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQogCQlvcz0tbXZzCiAJCTs7CisJbmFjbCkKKwkJYmFzaWNfbWFjaGluZT1sZTMyLXVua25vd24KKwkJb3M9LW5hY2wKKwkJOzsKIAluY3IzMDAwKQogCQliYXNpY19tYWNoaW5lPWk0ODYtbmNyCiAJCW9zPS1zeXN2NApAQCAtODM5LDYgKzkwNywxMiBAQAogCW5wMSkKIAkJYmFzaWNfbWFjaGluZT1ucDEtZ291bGQKIAkJOzsKKwluZW8tdGFuZGVtKQorCQliYXNpY19tYWNoaW5lPW5lby10YW5kZW0KKwkJOzsKKwluc2UtdGFuZGVtKQorCQliYXNpY19tYWNoaW5lPW5zZS10YW5kZW0KKwkJOzsKIAluc3ItdGFuZGVtKQogCQliYXNpY19tYWNoaW5lPW5zci10YW5kZW0KIAkJOzsKQEAgLTkyMSw5ICs5OTUsMTAgQEAKIAkJOzsKIAlwb3dlcikJYmFzaWNfbWFjaGluZT1wb3dlci1pYm0KIAkJOzsKLQlwcGMpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCisJcHBjIHwgcHBjYmUpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCiAJCTs7Ci0JcHBjLSopCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCXBwYy0qIHwgcHBjYmUtKikKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCiAJCTs7CiAJcHBjbGUgfCBwb3dlcnBjbGl0dGxlIHwgcHBjLWxlIHwgcG93ZXJwYy1saXR0bGUpCiAJCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLXVua25vd24KQEAgLTk0OCw3ICsxMDIzLDExIEBACiAJCWJhc2ljX21hY2hpbmU9aTU4Ni11bmtub3duCiAJCW9zPS1wdzMyCiAJCTs7Ci0JcmRvcykKKwlyZG9zIHwgcmRvczY0KQorCQliYXNpY19tYWNoaW5lPXg4Nl82NC1wYworCQlvcz0tcmRvcworCQk7OworCXJkb3MzMikKIAkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCiAJCW9zPS1yZG9zCiAJCTs7CkBAIC0xMDE3LDYgKzEwOTYsOSBAQAogCQliYXNpY19tYWNoaW5lPWk4NjAtc3RyYXR1cwogCQlvcz0tc3lzdjQKIAkJOzsKKwlzdHJvbmdhcm0tKiB8IHRodW1iLSopCisJCWJhc2ljX21hY2hpbmU9YXJtLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CiAJc3VuMikKIAkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCiAJCTs7CkBAIC0xMDczLDIwICsxMTU1LDggQEAKIAkJYmFzaWNfbWFjaGluZT10OTAtY3JheQogCQlvcz0tdW5pY29zCiAJCTs7Ci0JdGljNTR4IHwgYzU0eCopCi0JCWJhc2ljX21hY2hpbmU9dGljNTR4LXVua25vd24KLQkJb3M9LWNvZmYKLQkJOzsKLQl0aWM1NXggfCBjNTV4KikKLQkJYmFzaWNfbWFjaGluZT10aWM1NXgtdW5rbm93bgotCQlvcz0tY29mZgotCQk7OwotCXRpYzZ4IHwgYzZ4KikKLQkJYmFzaWNfbWFjaGluZT10aWM2eC11bmtub3duCi0JCW9zPS1jb2ZmCi0JCTs7CiAJdGlsZSopCi0JCWJhc2ljX21hY2hpbmU9dGlsZS11bmtub3duCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgogCQlvcz0tbGludXgtZ251CiAJCTs7CiAJdHgzOSkKQEAgLTExNTYsNiArMTIyNiw5IEBACiAJeHBzIHwgeHBzMTAwKQogCQliYXNpY19tYWNoaW5lPXhwczEwMC1ob25leXdlbGwKIAkJOzsKKwl4c2NhbGUtKiB8IHhzY2FsZWVbYmxdLSopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXnhzY2FsZS9hcm0vJ2AKKwkJOzsKIAl5bXApCiAJCWJhc2ljX21hY2hpbmU9eW1wLWNyYXkKIAkJb3M9LXVuaWNvcwpAQCAtMTI1Myw5ICsxMzI2LDEyIEBACiBpZiBbIHgiJG9zIiAhPSB4IiIgXQogdGhlbgogY2FzZSAkb3MgaW4KLSAgICAgICAgIyBGaXJzdCBtYXRjaCBzb21lIHN5c3RlbSB0eXBlIGFsaWFzZXMKLSAgICAgICAgIyB0aGF0IG1pZ2h0IGdldCBjb25mdXNlZCB3aXRoIHZhbGlkIHN5c3RlbSB0eXBlcy4KKwkjIEZpcnN0IG1hdGNoIHNvbWUgc3lzdGVtIHR5cGUgYWxpYXNlcworCSMgdGhhdCBtaWdodCBnZXQgY29uZnVzZWQgd2l0aCB2YWxpZCBzeXN0ZW0gdHlwZXMuCiAJIyAtc29sYXJpcyogaXMgYSBiYXNpYyBzeXN0ZW0gdHlwZSwgd2l0aCB0aGlzIG9uZSBleGNlcHRpb24uCisJLWF1cm9yYXV4KQorCQlvcz0tYXVyb3JhdXgKKwkJOzsKIAktc29sYXJpczEgfCAtc29sYXJpczEuKikKIAkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNvbGFyaXMxfHN1bm9zNHwnYAogCQk7OwpAQCAtMTI3NywyMSArMTM1MywyMiBAQAogCSMgLXN5c3YqIGlzIG5vdCBoZXJlIGJlY2F1c2UgaXQgY29tZXMgbGF0ZXIsIGFmdGVyIHN5c3ZyNC4KIAktZ251KiB8IC1ic2QqIHwgLW1hY2gqIHwgLW1pbml4KiB8IC1nZW5peCogfCAtdWx0cml4KiB8IC1pcml4KiBcCiAJICAgICAgfCAtKnZtcyogfCAtc2NvKiB8IC1lc2l4KiB8IC1pc2MqIHwgLWFpeCogfCAtY25rKiB8IC1zdW5vcyB8IC1zdW5vc1szNF0qXAotCSAgICAgIHwgLWhwdXgqIHwgLXVub3MqIHwgLW9zZiogfCAtbHVuYSogfCAtZGd1eCogfCAtc29sYXJpcyogfCAtc3ltKiBcCi0JICAgICAgfCAta29wZW5zb2xhcmlzKiBcCisJICAgICAgfCAtaHB1eCogfCAtdW5vcyogfCAtb3NmKiB8IC1sdW5hKiB8IC1kZ3V4KiB8IC1hdXJvcmF1eCogfCAtc29sYXJpcyogXAorCSAgICAgIHwgLXN5bSogfCAta29wZW5zb2xhcmlzKiBcCiAJICAgICAgfCAtYW1pZ2FvcyogfCAtYW1pZ2Fkb3MqIHwgLW1zZG9zKiB8IC1uZXdzb3MqIHwgLXVuaWNvcyogfCAtYW9mKiBcCiAJICAgICAgfCAtYW9zKiB8IC1hcm9zKiBcCiAJICAgICAgfCAtbmluZHkqIHwgLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC1lYm1vbiogfCAtaG1zKiB8IC1tdnMqIFwKIAkgICAgICB8IC1jbGl4KiB8IC1yaXNjb3MqIHwgLXVuaXBsdXMqIHwgLWlyaXMqIHwgLXJ0dSogfCAteGVuaXgqIFwKIAkgICAgICB8IC1oaXV4KiB8IC0zODZic2QqIHwgLWtuZXRic2QqIHwgLW1pcmJzZCogfCAtbmV0YnNkKiBcCi0JICAgICAgfCAtb3BlbmJzZCogfCAtc29saWRic2QqIFwKKwkgICAgICB8IC1iaXRyaWcqIHwgLW9wZW5ic2QqIHwgLXNvbGlkYnNkKiBcCiAJICAgICAgfCAtZWtrb2JzZCogfCAta2ZyZWVic2QqIHwgLWZyZWVic2QqIHwgLXJpc2NpeCogfCAtbHlueG9zKiBcCiAJICAgICAgfCAtYm9zeCogfCAtbmV4dHN0ZXAqIHwgLWN4dXgqIHwgLWFvdXQqIHwgLWVsZiogfCAtb2FiaSogXAogCSAgICAgIHwgLXB0eCogfCAtY29mZiogfCAtZWNvZmYqIHwgLXdpbm50KiB8IC1kb21haW4qIHwgLXZzdGEqIFwKIAkgICAgICB8IC11ZGkqIHwgLWVhYmkqIHwgLWxpdGVzKiB8IC1pZWVlKiB8IC1nbzMyKiB8IC1hdXgqIFwKIAkgICAgICB8IC1jaG9ydXNvcyogfCAtY2hvcnVzcmRiKiB8IC1jZWdjYyogXAotCSAgICAgIHwgLWN5Z3dpbiogfCAtcGUqIHwgLXBzb3MqIHwgLW1vc3MqIHwgLXByb2VsZiogfCAtcnRlbXMqIFwKLQkgICAgICB8IC1taW5ndzMyKiB8IC1saW51eC1nbnUqIHwgLWxpbnV4LW5ld2xpYiogfCAtbGludXgtdWNsaWJjKiBcCisJICAgICAgfCAtY3lnd2luKiB8IC1tc3lzKiB8IC1wZSogfCAtcHNvcyogfCAtbW9zcyogfCAtcHJvZWxmKiB8IC1ydGVtcyogXAorCSAgICAgIHwgLW1pbmd3MzIqIHwgLW1pbmd3NjQqIHwgLWxpbnV4LWdudSogfCAtbGludXgtYW5kcm9pZCogXAorCSAgICAgIHwgLWxpbnV4LW5ld2xpYiogfCAtbGludXgtbXVzbCogfCAtbGludXgtdWNsaWJjKiBcCiAJICAgICAgfCAtdXhwdiogfCAtYmVvcyogfCAtbXBlaXgqIHwgLXVkayogXAogCSAgICAgIHwgLWludGVyaXgqIHwgLXV3aW4qIHwgLW1rcyogfCAtcmhhcHNvZHkqIHwgLWRhcndpbiogfCAtb3BlbmVkKiBcCiAJICAgICAgfCAtb3BlbnN0ZXAqIHwgLW9za2l0KiB8IC1jb25peCogfCAtcHczMiogfCAtbm9uc3RvcHV4KiBcCkBAIC0xMzM4LDcgKzE0MTUsNyBAQAogCS1vcGVuZWQqKQogCQlvcz0tb3BlbmVkaXRpb24KIAkJOzsKLSAgICAgICAgLW9zNDAwKikKKwktb3M0MDAqKQogCQlvcz0tb3M0MDAKIAkJOzsKIAktd2luY2UqKQpAQCAtMTM4Nyw3ICsxNDY0LDcgQEAKIAktc2luaXgqKQogCQlvcz0tc3lzdjQKIAkJOzsKLSAgICAgICAgLXRwZiopCisJLXRwZiopCiAJCW9zPS10cGYKIAkJOzsKIAktdHJpdG9uKikKQEAgLTE0MzIsNiArMTUwOSw4IEBACiAJLWRpY29zKikKIAkJb3M9LWRpY29zCiAJCTs7CisJLW5hY2wqKQorCQk7OwogCS1ub25lKQogCQk7OwogCSopCkBAIC0xNDU0LDEwICsxNTMzLDEwIEBACiAjIHN5c3RlbSwgYW5kIHdlJ2xsIG5ldmVyIGdldCB0byB0aGlzIHBvaW50LgogCiBjYXNlICRiYXNpY19tYWNoaW5lIGluCi0gICAgICAgIHNjb3JlLSopCisJc2NvcmUtKikKIAkJb3M9LWVsZgogCQk7OwotICAgICAgICBzcHUtKikKKwlzcHUtKikKIAkJb3M9LWVsZgogCQk7OwogCSotYWNvcm4pCkBAIC0xNDY5LDggKzE1NDgsMjAgQEAKIAlhcm0qLXNlbWkpCiAJCW9zPS1hb3V0CiAJCTs7Ci0gICAgICAgIGM0eC0qIHwgdGljNHgtKikKLSAgICAgICAgCW9zPS1jb2ZmCisJYzR4LSogfCB0aWM0eC0qKQorCQlvcz0tY29mZgorCQk7OworCWhleGFnb24tKikKKwkJb3M9LWVsZgorCQk7OworCXRpYzU0eC0qKQorCQlvcz0tY29mZgorCQk7OworCXRpYzU1eC0qKQorCQlvcz0tY29mZgorCQk7OworCXRpYzZ4LSopCisJCW9zPS1jb2ZmCiAJCTs7CiAJIyBUaGlzIG11c3QgY29tZSBiZWZvcmUgdGhlICotZGVjIGVudHJ5LgogCXBkcDEwLSopCkBAIC0xNDkwLDE0ICsxNTgxLDExIEBACiAJCTs7CiAJbTY4MDAwLXN1bikKIAkJb3M9LXN1bm9zMwotCQkjIFRoaXMgYWxzbyBleGlzdHMgaW4gdGhlIGNvbmZpZ3VyZSBwcm9ncmFtLCBidXQgd2FzIG5vdCB0aGUKLQkJIyBkZWZhdWx0LgotCQkjIG9zPS1zdW5vczQKIAkJOzsKIAltNjgqLWNpc2NvKQogCQlvcz0tYW91dAogCQk7OwotICAgICAgICBtZXAtKikKKwltZXAtKikKIAkJb3M9LWVsZgogCQk7OwogCW1pcHMqLWNpc2NvKQpAQCAtMTUyNCw3ICsxNjEyLDcgQEAKIAkqLWlibSkKIAkJb3M9LWFpeAogCQk7OwotICAgIAkqLWtudXRoKQorCSota251dGgpCiAJCW9zPS1tbWl4d2FyZQogCQk7OwogCSotd2VjKQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9jb25maWd1cmUgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2NvbmZpZ3VyZQppbmRleCBjNWM3MGIxLi44MjMwODMwIDEwMDc1NQotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2NvbmZpZ3VyZQorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2NvbmZpZ3VyZQpAQCAtMSwxMyArMSwxMSBAQAogIyEgL2Jpbi9zaAogIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjUgZm9yIGxpYmZmaSAzLjAuMTByYzAuCisjIEdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OSBmb3IgbGliZmZpIDMuMC4xMy4KICMKLSMgUmVwb3J0IGJ1Z3MgdG8gPGh0dHA6Ly9nY2MuZ251Lm9yZy9idWdzLmh0bWw+LgorIyBSZXBvcnQgYnVncyB0byA8aHR0cDovL2dpdGh1Yi5jb20vYXRncmVlbi9saWJmZmkvaXNzdWVzPi4KICMKICMKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLAotIyAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSMgSW5jLgorIyBDb3B5cmlnaHQgKEMpIDE5OTItMTk5NiwgMTk5OC0yMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogIwogIwogIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgpAQCAtOTEsNiArODksNyBAQAogSUZTPSIgIiIJJGFzX25sIgogCiAjIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgorYXNfbXlzZWxmPQogY2FzZSAkMCBpbiAjKCgKICAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OwogICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCkBAIC0xMzUsNiArMTM0LDMxIEBACiAjIENEUEFUSC4KICh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKIAorIyBVc2UgYSBwcm9wZXIgaW50ZXJuYWwgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gZW5zdXJlIHdlIGRvbid0IGZhbGwKKyAgIyBpbnRvIGFuIGluZmluaXRlIGxvb3AsIGNvbnRpbnVvdXNseSByZS1leGVjdXRpbmcgb3Vyc2VsdmVzLgorICBpZiB0ZXN0IHgiJHtfYXNfY2FuX3JlZXhlY30iICE9IHhubyAmJiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgIT0geDsgdGhlbgorICAgIF9hc19jYW5fcmVleGVjPW5vOyBleHBvcnQgX2FzX2Nhbl9yZWV4ZWM7CisgICAgIyBXZSBjYW5ub3QgeWV0IGFzc3VtZSBhIGRlY2VudCBzaGVsbCwgc28gd2UgaGF2ZSB0byBwcm92aWRlIGEKKyMgbmV1dHJhbGl6YXRpb24gdmFsdWUgZm9yIHNoZWxscyB3aXRob3V0IHVuc2V0OyBhbmQgdGhpcyBhbHNvCisjIHdvcmtzIGFyb3VuZCBzaGVsbHMgdGhhdCBjYW5ub3QgdW5zZXQgbm9uZXhpc3RlbnQgdmFyaWFibGVzLgorIyBQcmVzZXJ2ZSAtdiBhbmQgLXggdG8gdGhlIHJlcGxhY2VtZW50IHNoZWxsLgorQkFTSF9FTlY9L2Rldi9udWxsCitFTlY9L2Rldi9udWxsCisodW5zZXQgQkFTSF9FTlYpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBCQVNIX0VOViBFTlYKK2Nhc2UgJC0gaW4gIyAoKCgoCisgICp2KngqIHwgKngqdiogKSBhc19vcHRzPS12eCA7OworICAqdiogKSBhc19vcHRzPS12IDs7CisgICp4KiApIGFzX29wdHM9LXggOzsKKyAgKiApIGFzX29wdHM9IDs7Citlc2FjCitleGVjICRDT05GSUdfU0hFTEwgJGFzX29wdHMgIiRhc19teXNlbGYiICR7MSsiJEAifQorIyBBZG1pdHRlZGx5LCB0aGlzIGlzIHF1aXRlIHBhcmFub2lkLCBzaW5jZSBhbGwgdGhlIGtub3duIHNoZWxscyBiYWlsCisjIG91dCBhZnRlciBhIGZhaWxlZCBgZXhlYycuCiskYXNfZWNobyAiJDA6IGNvdWxkIG5vdCByZS1leGVjdXRlIHdpdGggJENPTkZJR19TSEVMTCIgPiYyCithc19mbl9leGl0IDI1NQorICBmaQorICAjIFdlIGRvbid0IHdhbnQgdGhpcyB0byBwcm9wYWdhdGUgdG8gb3RoZXIgc3VicHJvY2Vzc2VzLgorICAgICAgICAgIHsgX2FzX2Nhbl9yZWV4ZWM9OyB1bnNldCBfYXNfY2FuX3JlZXhlYzt9CiBpZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgPSB4OyB0aGVuCiAgIGFzX2JvdXJuZV9jb21wYXRpYmxlPSJpZiB0ZXN0IC1uIFwiXCR7WlNIX1ZFUlNJT04rc2V0fVwiICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgogICBlbXVsYXRlIHNoCkBAIC0xNjgsMTEgKzE5MiwyMCBAQAogZWxzZQogICBleGl0Y29kZT0xOyBlY2hvIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB3ZXJlIG5vdCBzYXZlZC4KIGZpCi10ZXN0IHhcJGV4aXRjb2RlID0geDAgfHwgZXhpdCAxIgordGVzdCB4XCRleGl0Y29kZSA9IHgwIHx8IGV4aXQgMQordGVzdCAteCAvIHx8IGV4aXQgMSIKICAgYXNfc3VnZ2VzdGVkPSIgIGFzX2xpbmVub18xPSI7YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQkTElORU5PO2FzX3N1Z2dlc3RlZD0kYXNfc3VnZ2VzdGVkIiBhc19saW5lbm9fMWE9XCRMSU5FTk8KICAgYXNfbGluZW5vXzI9Ijthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCRMSU5FTk87YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQiIGFzX2xpbmVub18yYT1cJExJTkVOTwogICBldmFsICd0ZXN0IFwieFwkYXNfbGluZW5vXzEnXCRhc19ydW4nXCIgIT0gXCJ4XCRhc19saW5lbm9fMidcJGFzX3J1bidcIiAmJgogICB0ZXN0IFwieFxgZXhwciBcJGFzX2xpbmVub18xJ1wkYXNfcnVuJyArIDFcYFwiID0gXCJ4XCRhc19saW5lbm9fMidcJGFzX3J1bidcIicgfHwgZXhpdCAxCisKKyAgdGVzdCAtbiBcIlwke1pTSF9WRVJTSU9OK3NldH1cJHtCQVNIX1ZFUlNJT04rc2V0fVwiIHx8ICgKKyAgICBFQ0hPPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCcKKyAgICBFQ0hPPVwkRUNIT1wkRUNIT1wkRUNIT1wkRUNIT1wkRUNITworICAgIEVDSE89XCRFQ0hPXCRFQ0hPXCRFQ0hPXCRFQ0hPXCRFQ0hPXCRFQ0hPCisgICAgUEFUSD0vZW1wdHkgRlBBVEg9L2VtcHR5OyBleHBvcnQgUEFUSCBGUEFUSAorICAgIHRlc3QgXCJYXGBwcmludGYgJXMgXCRFQ0hPXGBcIiA9IFwiWFwkRUNIT1wiIFxcCisgICAgICB8fCB0ZXN0IFwiWFxgcHJpbnQgLXIgLS0gXCRFQ0hPXGBcIiA9IFwiWFwkRUNIT1wiICkgfHwgZXhpdCAxCiB0ZXN0IFwkKCggMSArIDEgKSkgPSAyIHx8IGV4aXQgMSIKICAgaWYgKGV2YWwgIiRhc19yZXF1aXJlZCIpIDI+L2Rldi9udWxsOyB0aGVuIDoKICAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKQEAgLTIxMywxNCArMjQ2LDI1IEBACiAKIAogICAgICAgaWYgdGVzdCAieCRDT05GSUdfU0hFTEwiICE9IHg7IHRoZW4gOgotICAjIFdlIGNhbm5vdCB5ZXQgYXNzdW1lIGEgZGVjZW50IHNoZWxsLCBzbyB3ZSBoYXZlIHRvIHByb3ZpZGUgYQotCSMgbmV1dHJhbGl6YXRpb24gdmFsdWUgZm9yIHNoZWxscyB3aXRob3V0IHVuc2V0OyBhbmQgdGhpcyBhbHNvCi0JIyB3b3JrcyBhcm91bmQgc2hlbGxzIHRoYXQgY2Fubm90IHVuc2V0IG5vbmV4aXN0ZW50IHZhcmlhYmxlcy4KLQlCQVNIX0VOVj0vZGV2L251bGwKLQlFTlY9L2Rldi9udWxsCi0JKHVuc2V0IEJBU0hfRU5WKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQkFTSF9FTlYgRU5WCi0JZXhwb3J0IENPTkZJR19TSEVMTAotCWV4ZWMgIiRDT05GSUdfU0hFTEwiICIkYXNfbXlzZWxmIiAkezErIiRAIn0KKyAgZXhwb3J0IENPTkZJR19TSEVMTAorICAgICAgICAgICAgICMgV2UgY2Fubm90IHlldCBhc3N1bWUgYSBkZWNlbnQgc2hlbGwsIHNvIHdlIGhhdmUgdG8gcHJvdmlkZSBhCisjIG5ldXRyYWxpemF0aW9uIHZhbHVlIGZvciBzaGVsbHMgd2l0aG91dCB1bnNldDsgYW5kIHRoaXMgYWxzbworIyB3b3JrcyBhcm91bmQgc2hlbGxzIHRoYXQgY2Fubm90IHVuc2V0IG5vbmV4aXN0ZW50IHZhcmlhYmxlcy4KKyMgUHJlc2VydmUgLXYgYW5kIC14IHRvIHRoZSByZXBsYWNlbWVudCBzaGVsbC4KK0JBU0hfRU5WPS9kZXYvbnVsbAorRU5WPS9kZXYvbnVsbAorKHVuc2V0IEJBU0hfRU5WKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQkFTSF9FTlYgRU5WCitjYXNlICQtIGluICMgKCgoKAorICAqdip4KiB8ICp4KnYqICkgYXNfb3B0cz0tdnggOzsKKyAgKnYqICkgYXNfb3B0cz0tdiA7OworICAqeCogKSBhc19vcHRzPS14IDs7CisgICogKSBhc19vcHRzPSA7OworZXNhYworZXhlYyAkQ09ORklHX1NIRUxMICRhc19vcHRzICIkYXNfbXlzZWxmIiAkezErIiRAIn0KKyMgQWRtaXR0ZWRseSwgdGhpcyBpcyBxdWl0ZSBwYXJhbm9pZCwgc2luY2UgYWxsIHRoZSBrbm93biBzaGVsbHMgYmFpbAorIyBvdXQgYWZ0ZXIgYSBmYWlsZWQgYGV4ZWMnLgorJGFzX2VjaG8gIiQwOiBjb3VsZCBub3QgcmUtZXhlY3V0ZSB3aXRoICRDT05GSUdfU0hFTEwiID4mMgorZXhpdCAyNTUKIGZpCiAKICAgICBpZiB0ZXN0IHgkYXNfaGF2ZV9yZXF1aXJlZCA9IHhubzsgdGhlbiA6CkBAIC0yMzEsOCArMjc1LDggQEAKICAgICAkYXNfZWNobyAiJDA6IGJlIHVwZ3JhZGVkIHRvIHpzaCA0LjMuNCBvciBsYXRlci4iCiAgIGVsc2UKICAgICAkYXNfZWNobyAiJDA6IFBsZWFzZSB0ZWxsIGJ1Zy1hdXRvY29uZkBnbnUub3JnIGFuZAotJDA6IGh0dHA6Ly9nY2MuZ251Lm9yZy9idWdzLmh0bWwgYWJvdXQgeW91ciBzeXN0ZW0sCi0kMDogaW5jbHVkaW5nIGFueSBlcnJvciBwb3NzaWJseSBvdXRwdXQgYmVmb3JlIHRoaXMKKyQwOiBodHRwOi8vZ2l0aHViLmNvbS9hdGdyZWVuL2xpYmZmaS9pc3N1ZXMgYWJvdXQgeW91cgorJDA6IHN5c3RlbSwgaW5jbHVkaW5nIGFueSBlcnJvciBwb3NzaWJseSBvdXRwdXQgYmVmb3JlIHRoaXMKICQwOiBtZXNzYWdlLiBUaGVuIGluc3RhbGwgYSBtb2Rlcm4gc2hlbGwsIG9yIG1hbnVhbGx5IHJ1bgogJDA6IHRoZSBzY3JpcHQgdW5kZXIgc3VjaCBhIHNoZWxsIGlmIHlvdSBkbyBoYXZlIG9uZS4iCiAgIGZpCkBAIC0zMTksMTAgKzM2MywxOCBAQAogICAgICAgdGVzdCAtZCAiJGFzX2RpciIgJiYgYnJlYWsKICAgICBkb25lCiAgICAgdGVzdCAteiAiJGFzX2RpcnMiIHx8IGV2YWwgIm1rZGlyICRhc19kaXJzIgotICB9IHx8IHRlc3QgLWQgIiRhc19kaXIiIHx8IGFzX2ZuX2Vycm9yICJjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAkYXNfZGlyIgorICB9IHx8IHRlc3QgLWQgIiRhc19kaXIiIHx8IGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAkYXNfZGlyIgogCiAKIH0gIyBhc19mbl9ta2Rpcl9wCisKKyMgYXNfZm5fZXhlY3V0YWJsZV9wIEZJTEUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGVzdCBpZiBGSUxFIGlzIGFuIGV4ZWN1dGFibGUgcmVndWxhciBmaWxlLgorYXNfZm5fZXhlY3V0YWJsZV9wICgpCit7CisgIHRlc3QgLWYgIiQxIiAmJiB0ZXN0IC14ICIkMSIKK30gIyBhc19mbl9leGVjdXRhYmxlX3AKICMgYXNfZm5fYXBwZW5kIFZBUiBWQUxVRQogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIEFwcGVuZCB0aGUgdGV4dCBpbiBWQUxVRSB0byB0aGUgZW5kIG9mIHRoZSBkZWZpbml0aW9uIGNvbnRhaW5lZCBpbiBWQVIuIFRha2UKQEAgLTM1OSwxOSArNDExLDE5IEBACiBmaSAjIGFzX2ZuX2FyaXRoCiAKIAotIyBhc19mbl9lcnJvciBFUlJPUiBbTElORU5PIExPR19GRF0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGFzX2ZuX2Vycm9yIFNUQVRVUyBFUlJPUiBbTElORU5PIExPR19GRF0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBPdXRwdXQgImBiYXNlbmFtZSAkMGA6IGVycm9yOiBFUlJPUiIgdG8gc3RkZXJyLiBJZiBMSU5FTk8gYW5kIExPR19GRCBhcmUKICMgcHJvdmlkZWQsIGFsc28gb3V0cHV0IHRoZSBlcnJvciB0byBMT0dfRkQsIHJlZmVyZW5jaW5nIExJTkVOTy4gVGhlbiBleGl0IHRoZQotIyBzY3JpcHQgd2l0aCBzdGF0dXMgJD8sIHVzaW5nIDEgaWYgdGhhdCB3YXMgMC4KKyMgc2NyaXB0IHdpdGggU1RBVFVTLCB1c2luZyAxIGlmIHRoYXQgd2FzIDAuCiBhc19mbl9lcnJvciAoKQogewotICBhc19zdGF0dXM9JD87IHRlc3QgJGFzX3N0YXR1cyAtZXEgMCAmJiBhc19zdGF0dXM9MQotICBpZiB0ZXN0ICIkMyI7IHRoZW4KLSAgICBhc19saW5lbm89JHthc19saW5lbm8tIiQyIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6ICQxIiA+JiQzCisgIGFzX3N0YXR1cz0kMTsgdGVzdCAkYXNfc3RhdHVzIC1lcSAwICYmIGFzX3N0YXR1cz0xCisgIGlmIHRlc3QgIiQ0IjsgdGhlbgorICAgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDMifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogJDIiID4mJDQKICAgZmkKLSAgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6ICQxIiA+JjIKKyAgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6ICQyIiA+JjIKICAgYXNfZm5fZXhpdCAkYXNfc3RhdHVzCiB9ICMgYXNfZm5fZXJyb3IKIApAQCAtNDQ0LDYgKzQ5NiwxMCBAQAogICBjaG1vZCAreCAiJGFzX21lLmxpbmVubyIgfHwKICAgICB7ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiYyOyBhc19mbl9leGl0IDE7IH0KIAorICAjIElmIHdlIGhhZCB0byByZS1leGVjdXRlIHdpdGggJENPTkZJR19TSEVMTCwgd2UncmUgZW5zdXJlZCB0byBoYXZlCisgICMgYWxyZWFkeSBkb25lIHRoYXQsIHNvIGVuc3VyZSB3ZSBkb24ndCB0cnkgdG8gZG8gc28gYWdhaW4gYW5kIGZhbGwKKyAgIyBpbiBhbiBpbmZpbml0ZSBsb29wLiAgVGhpcyBoYXMgYWxyZWFkeSBoYXBwZW5lZCBpbiBwcmFjdGljZS4KKyAgX2FzX2Nhbl9yZWV4ZWM9bm87IGV4cG9ydCBfYXNfY2FuX3JlZXhlYwogICAjIERvbid0IHRyeSB0byBleGVjIGFzIGl0IGNoYW5nZXMgJFswXSwgY2F1c2luZyBhbGwgc29ydCBvZiBwcm9ibGVtcwogICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKICAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpdGl2ZSB0byB0aGlzKS4KQEAgLTQ3OCwxNiArNTM0LDE2IEBACiAgICAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKICAgICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgogICAgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgotICAgICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcCcuCisgICAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wUicuCiAgICAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAotICAgICAgYXNfbG5fcz0nY3AgLXAnCisgICAgICBhc19sbl9zPSdjcCAtcFInCiAgIGVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgYXNfbG5fcz1sbgogICBlbHNlCi0gICAgYXNfbG5fcz0nY3AgLXAnCisgICAgYXNfbG5fcz0nY3AgLXBSJwogICBmaQogZWxzZQotICBhc19sbl9zPSdjcCAtcCcKKyAgYXNfbG5fcz0nY3AgLXBSJwogZmkKIHJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKIHJtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKQEAgLTQ5OSwyOCArNTU1LDggQEAKICAgYXNfbWtkaXJfcD1mYWxzZQogZmkKIAotaWYgdGVzdCAteCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhc190ZXN0X3g9J3Rlc3QgLXgnCi1lbHNlCi0gIGlmIGxzIC1kTCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgIGFzX2xzX0xfb3B0aW9uPUwKLSAgZWxzZQotICAgIGFzX2xzX0xfb3B0aW9uPQotICBmaQotICBhc190ZXN0X3g9JwotICAgIGV2YWwgc2ggLWMgJ1wnJwotICAgICAgaWYgdGVzdCAtZCAiJDEiOyB0aGVuCi0JdGVzdCAtZCAiJDEvLiI7Ci0gICAgICBlbHNlCi0JY2FzZSAkMSBpbiAjKAotCS0qKXNldCAiLi8kMSI7OwotCWVzYWM7Ci0JY2FzZSBgbHMgLWxkJyRhc19sc19MX29wdGlvbicgIiQxIiAyPi9kZXYvbnVsbGAgaW4gIygoCi0JPz8/W3N4XSopOjs7KilmYWxzZTs7ZXNhYztmaQotICAgICdcJycgc2gKLSAgJwotZmkKLWFzX2V4ZWN1dGFibGVfcD0kYXNfdGVzdF94Cithc190ZXN0X3g9J3Rlc3QgLXgnCithc19leGVjdXRhYmxlX3A9YXNfZm5fZXhlY3V0YWJsZV9wCiAKICMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KIGFzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCkBAIC01MjgsMTYxICs1NjQsMTQgQEAKICMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCB2YXJpYWJsZSBuYW1lLgogYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKIAotCi0KLSMgQ2hlY2sgdGhhdCB3ZSBhcmUgcnVubmluZyB1bmRlciB0aGUgY29ycmVjdCBzaGVsbC4KIFNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CiAKLWNhc2UgWCRsdF9FQ0hPIGluCi1YKi0tZmFsbGJhY2stZWNobykKLSAgIyBSZW1vdmUgb25lIGxldmVsIG9mIHF1b3RhdGlvbiAod2hpY2ggd2FzIHJlcXVpcmVkIGZvciBNYWtlKS4KLSAgRUNITz1gZWNobyAiJGx0X0VDSE8iIHwgc2VkICdzLFxcXFxcJFxcJDAsJyQwJywnYAotICA7OwotZXNhYwotCi1FQ0hPPSR7bHRfRUNITy1lY2hvfQotaWYgdGVzdCAiWCQxIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgotICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KLSAgc2hpZnQKLWVsaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KLSAgIyBBdm9pZCBpbmxpbmUgZG9jdW1lbnQgaGVyZSwgaXQgbWF5IGJlIGxlZnQgb3ZlcgotICA6Ci1lbGlmIHRlc3QgIlhgeyAkRUNITyAnXHQnOyB9IDI+L2Rldi9udWxsYCIgPSAnWFx0JyA7IHRoZW4KLSAgIyBZaXBwZWUsICRFQ0hPIHdvcmtzIQotICA6Ci1lbHNlCi0gICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbC4KLSAgZXhlYyAkU0hFTEwgIiQwIiAtLW5vLXJlZXhlYyAkezErIiRAIn0KLWZpCi0KLWlmIHRlc3QgIlgkMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCi0gICMgdXNlZCBhcyBmYWxsYmFjayBlY2hvCi0gIHNoaWZ0Ci0gIGNhdCA8PF9MVF9FT0YKLSQqCi1fTFRfRU9GCi0gIGV4aXQgMAotZmkKLQotIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKLSMgaWYgQ0RQQVRIIGlzIHNldC4KLSh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKLQotaWYgdGVzdCAteiAiJGx0X0VDSE8iOyB0aGVuCi0gIGlmIHRlc3QgIlgke2VjaG9fdGVzdF9zdHJpbmcrc2V0fSIgIT0gWHNldDsgdGhlbgotICAgICMgZmluZCBhIHN0cmluZyBhcyBsYXJnZSBhcyBwb3NzaWJsZSwgYXMgbG9uZyBhcyB0aGUgc2hlbGwgY2FuIGNvcGUgd2l0aCBpdAotICAgIGZvciBjbWQgaW4gJ3NlZCA1MHEgIiQwIicgJ3NlZCAyMHEgIiQwIicgJ3NlZCAxMHEgIiQwIicgJ3NlZCAycSAiJDAiJyAnZWNobyB0ZXN0JzsgZG8KLSAgICAgICMgZXhwZWN0ZWQgc2l6ZXM6IGxlc3MgdGhhbiAyS2IsIDFLYiwgNTEyIGJ5dGVzLCAxNiBieXRlcywgLi4uCi0gICAgICBpZiB7IGVjaG9fdGVzdF9zdHJpbmc9YGV2YWwgJGNtZGA7IH0gMj4vZGV2L251bGwgJiYKLQkgeyB0ZXN0ICJYJGVjaG9fdGVzdF9zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IH0gMj4vZGV2L251bGwKLSAgICAgIHRoZW4KLSAgICAgICAgYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICBmaQotCi0gIGlmIHRlc3QgIlhgeyAkRUNITyAnXHQnOyB9IDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotICAgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWB7ICRFQ0hPICIkZWNob190ZXN0X3N0cmluZyI7IH0gMj4vZGV2L251bGxgICYmCi0gICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotICAgIDoKLSAgZWxzZQotICAgICMgVGhlIFNvbGFyaXMsIEFJWCwgYW5kIERpZ2l0YWwgVW5peCBkZWZhdWx0IGVjaG8gcHJvZ3JhbXMgdW5xdW90ZQotICAgICMgYmFja3NsYXNoZXMuICBUaGlzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gcXVvdGUgYmFja3NsYXNoZXMgdXNpbmcKLSAgICAjICAgZWNobyAiJHNvbWV0aGluZyIgfCBzZWQgJ3MvXFwvXFxcXC9nJwotICAgICMKLSAgICAjIFNvLCBmaXJzdCB3ZSBsb29rIGZvciBhIHdvcmtpbmcgZWNobyBpbiB0aGUgdXNlcidzIFBBVEguCi0KLSAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKLSAgICBmb3IgZGlyIGluICRQQVRIIC91c3IvdWNiOyBkbwotICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgICBpZiAodGVzdCAtZiAkZGlyL2VjaG8gfHwgdGVzdCAtZiAkZGlyL2VjaG8kYWNfZXhlZXh0KSAmJgotICAgICAgICAgdGVzdCAiWGAoJGRpci9lY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotICAgICAgICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRkaXIvZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKLSAgICAgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotICAgICAgICBFQ0hPPSIkZGlyL2VjaG8iCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLQotICAgIGlmIHRlc3QgIlgkRUNITyIgPSBYZWNobzsgdGhlbgotICAgICAgIyBXZSBkaWRuJ3QgZmluZCBhIGJldHRlciBlY2hvLCBzbyBsb29rIGZvciBhbHRlcm5hdGl2ZXMuCi0gICAgICBpZiB0ZXN0ICJYYHsgcHJpbnQgLXIgJ1x0JzsgfSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLSAgICAgICAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YHsgcHJpbnQgLXIgIiRlY2hvX3Rlc3Rfc3RyaW5nIjsgfSAyPi9kZXYvbnVsbGAgJiYKLSAgICAgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotICAgICAgICAjIFRoaXMgc2hlbGwgaGFzIGEgYnVpbHRpbiBwcmludCAtciB0aGF0IGRvZXMgdGhlIHRyaWNrLgotICAgICAgICBFQ0hPPSdwcmludCAtcicKLSAgICAgIGVsaWYgeyB0ZXN0IC1mIC9iaW4va3NoIHx8IHRlc3QgLWYgL2Jpbi9rc2gkYWNfZXhlZXh0OyB9ICYmCi0JICAgdGVzdCAiWCRDT05GSUdfU0hFTEwiICE9IFgvYmluL2tzaDsgdGhlbgotICAgICAgICAjIElmIHdlIGhhdmUga3NoLCB0cnkgcnVubmluZyBjb25maWd1cmUgYWdhaW4gd2l0aCBpdC4KLSAgICAgICAgT1JJR0lOQUxfQ09ORklHX1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0gICAgICAgIGV4cG9ydCBPUklHSU5BTF9DT05GSUdfU0hFTEwKLSAgICAgICAgQ09ORklHX1NIRUxMPS9iaW4va3NoCi0gICAgICAgIGV4cG9ydCBDT05GSUdfU0hFTEwKLSAgICAgICAgZXhlYyAkQ09ORklHX1NIRUxMICIkMCIgLS1uby1yZWV4ZWMgJHsxKyIkQCJ9Ci0gICAgICBlbHNlCi0gICAgICAgICMgVHJ5IHVzaW5nIHByaW50Zi4KLSAgICAgICAgRUNITz0ncHJpbnRmICVzXG4nCi0gICAgICAgIGlmIHRlc3QgIlhgeyAkRUNITyAnXHQnOyB9IDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotCSAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YHsgJEVDSE8gIiRlY2hvX3Rlc3Rfc3RyaW5nIjsgfSAyPi9kZXYvbnVsbGAgJiYKLQkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLQkgICMgQ29vbCwgcHJpbnRmIHdvcmtzCi0JICA6Ci0gICAgICAgIGVsaWYgZWNob190ZXN0aW5nX3N0cmluZz1gKCRPUklHSU5BTF9DT05GSUdfU0hFTEwgIiQwIiAtLWZhbGxiYWNrLWVjaG8gJ1x0JykgMj4vZGV2L251bGxgICYmCi0JICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gJ1hcdCcgJiYKLQkgICAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkT1JJR0lOQUxfQ09ORklHX1NIRUxMICIkMCIgLS1mYWxsYmFjay1lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgotCSAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0JICBDT05GSUdfU0hFTEw9JE9SSUdJTkFMX0NPTkZJR19TSEVMTAotCSAgZXhwb3J0IENPTkZJR19TSEVMTAotCSAgU0hFTEw9IiRDT05GSUdfU0hFTEwiCi0JICBleHBvcnQgU0hFTEwKLQkgIEVDSE89IiRDT05GSUdfU0hFTEwgJDAgLS1mYWxsYmFjay1lY2hvIgotICAgICAgICBlbGlmIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkQ09ORklHX1NIRUxMICIkMCIgLS1mYWxsYmFjay1lY2hvICdcdCcpIDI+L2Rldi9udWxsYCAmJgotCSAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICdYXHQnICYmCi0JICAgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJENPTkZJR19TSEVMTCAiJDAiIC0tZmFsbGJhY2stZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKLQkgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotCSAgRUNITz0iJENPTkZJR19TSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iCi0gICAgICAgIGVsc2UKLQkgICMgbWF5YmUgd2l0aCBhIHNtYWxsZXIgc3RyaW5nLi4uCi0JICBwcmV2PToKLQotCSAgZm9yIGNtZCBpbiAnZWNobyB0ZXN0JyAnc2VkIDJxICIkMCInICdzZWQgMTBxICIkMCInICdzZWQgMjBxICIkMCInICdzZWQgNTBxICIkMCInOyBkbwotCSAgICBpZiB7IHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWGBldmFsICRjbWRgIjsgfSAyPi9kZXYvbnVsbAotCSAgICB0aGVuCi0JICAgICAgYnJlYWsKLQkgICAgZmkKLQkgICAgcHJldj0iJGNtZCIKLQkgIGRvbmUKLQotCSAgaWYgdGVzdCAiJHByZXYiICE9ICdzZWQgNTBxICIkMCInOyB0aGVuCi0JICAgIGVjaG9fdGVzdF9zdHJpbmc9YGV2YWwgJHByZXZgCi0JICAgIGV4cG9ydCBlY2hvX3Rlc3Rfc3RyaW5nCi0JICAgIGV4ZWMgJHtPUklHSU5BTF9DT05GSUdfU0hFTEwtJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH19ICIkMCIgJHsxKyIkQCJ9Ci0JICBlbHNlCi0JICAgICMgT29wcy4gIFdlIGxvc3QgY29tcGxldGVseSwgc28ganVzdCBzdGljayB3aXRoIGVjaG8uCi0JICAgIEVDSE89ZWNobwotCSAgZmkKLSAgICAgICAgZmkKLSAgICAgIGZpCi0gICAgZmkKLSAgZmkKLWZpCi0KLSMgQ29weSBlY2hvIGFuZCBxdW90ZSB0aGUgY29weSBzdWl0YWJseSBmb3IgcGFzc2luZyB0byBsaWJ0b29sIGZyb20KLSMgdGhlIE1ha2VmaWxlLCBpbnN0ZWFkIG9mIHF1b3RpbmcgdGhlIG9yaWdpbmFsLCB3aGljaCBpcyB1c2VkIGxhdGVyLgotbHRfRUNITz0kRUNITwotaWYgdGVzdCAiWCRsdF9FQ0hPIiA9ICJYJENPTkZJR19TSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iOyB0aGVuCi0gICBsdF9FQ0hPPSIkQ09ORklHX1NIRUxMIFxcXCRcJDAgLS1mYWxsYmFjay1lY2hvIgotZmkKLQotCi0KIAogdGVzdCAtbiAiJERKRElSIiB8fCBleGVjIDc8JjAgPC9kZXYvbnVsbAogZXhlYyA2PiYxCiAKICMgTmFtZSBvZiB0aGUgaG9zdC4KLSMgaG9zdG5hbWUgb24gc29tZSBzeXN0ZW1zIChTVlIzLjIsIExpbnV4KSByZXR1cm5zIGEgYm9ndXMgZXhpdCBzdGF0dXMsCisjIGhvc3RuYW1lIG9uIHNvbWUgc3lzdGVtcyAoU1ZSMy4yLCBvbGQgR05VL0xpbnV4KSByZXR1cm5zIGEgYm9ndXMgZXhpdCBzdGF0dXMsCiAjIHNvIHVuYW1lIGdldHMgcnVuIHRvby4KIGFjX2hvc3RuYW1lPWAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAogCkBAIC03MDEsOSArNTkwLDkgQEAKICMgSWRlbnRpdHkgb2YgdGhpcyBwYWNrYWdlLgogUEFDS0FHRV9OQU1FPSdsaWJmZmknCiBQQUNLQUdFX1RBUk5BTUU9J2xpYmZmaScKLVBBQ0tBR0VfVkVSU0lPTj0nMy4wLjEwcmMwJwotUEFDS0FHRV9TVFJJTkc9J2xpYmZmaSAzLjAuMTByYzAnCi1QQUNLQUdFX0JVR1JFUE9SVD0naHR0cDovL2djYy5nbnUub3JnL2J1Z3MuaHRtbCcKK1BBQ0tBR0VfVkVSU0lPTj0nMy4wLjEzJworUEFDS0FHRV9TVFJJTkc9J2xpYmZmaSAzLjAuMTMnCitQQUNLQUdFX0JVR1JFUE9SVD0naHR0cDovL2dpdGh1Yi5jb20vYXRncmVlbi9saWJmZmkvaXNzdWVzJwogUEFDS0FHRV9VUkw9JycKIAogIyBGYWN0b3JpbmcgZGVmYXVsdCBoZWFkZXJzIGZvciBtb3N0IHRlc3RzLgpAQCAtNzQ4LDEwICs2MzcsMjAgQEAKIExJQk9CSlMKIHRvb2xleGVjbGliZGlyCiB0b29sZXhlY2RpcgorRkZJX0RFQlVHX0ZBTFNFCitGRklfREVCVUdfVFJVRQogVEFSR0VURElSCiBUQVJHRVQKK0ZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEUKK0ZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEVfRkFMU0UKK0ZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEVfVFJVRQorc3lzX3N5bWJvbF91bmRlcnNjb3JlCiBIQVZFX0xPTkdfRE9VQkxFCiBBTExPQ0EKK1hURU5TQV9GQUxTRQorWFRFTlNBX1RSVUUKK1RJTEVfRkFMU0UKK1RJTEVfVFJVRQogUEE2NF9IUFVYX0ZBTFNFCiBQQTY0X0hQVVhfVFJVRQogUEFfSFBVWF9GQUxTRQpAQCAtNzc0LDYgKzY3Myw4IEBACiBBVlIzMl9UUlVFCiBBUk1fRkFMU0UKIEFSTV9UUlVFCitBQVJDSDY0X0ZBTFNFCitBQVJDSDY0X1RSVUUKIFBPV0VSUENfRlJFRUJTRF9GQUxTRQogUE9XRVJQQ19GUkVFQlNEX1RSVUUKIFBPV0VSUENfREFSV0lOX0ZBTFNFCkBAIC03ODIsNiArNjgzLDEyIEBACiBQT1dFUlBDX0FJWF9UUlVFCiBQT1dFUlBDX0ZBTFNFCiBQT1dFUlBDX1RSVUUKK01PWElFX0ZBTFNFCitNT1hJRV9UUlVFCitNRVRBR19GQUxTRQorTUVUQUdfVFJVRQorTUlDUk9CTEFaRV9GQUxTRQorTUlDUk9CTEFaRV9UUlVFCiBNNjhLX0ZBTFNFCiBNNjhLX1RSVUUKIE0zMlJfRkFMU0UKQEAgLTgwMiw2ICs3MDksOCBAQAogWDg2X1RSVUUKIFNQQVJDX0ZBTFNFCiBTUEFSQ19UUlVFCitCRklOX0ZBTFNFCitCRklOX1RSVUUKIE1JUFNfRkFMU0UKIE1JUFNfVFJVRQogQU1fTFRMREZMQUdTCkBAIC04MTEsMTUgKzcyMCwxOCBAQAogTUFJTlQKIE1BSU5UQUlORVJfTU9ERV9GQUxTRQogTUFJTlRBSU5FUl9NT0RFX1RSVUUKK1BSVERJQUcKIENQUAogT1RPT0w2NAogT1RPT0wKIExJUE8KIE5NRURJVAogRFNZTVVUSUwKLWx0X0VDSE8KK01BTklGRVNUX1RPT0wKIFJBTkxJQgorYWNfY3RfQVIKIEFSCitETExUT09MCiBPQkpEVU1QCiBMTl9TCiBOTQpAQCAtODM5LDYgKzc1MSw3IEBACiBhbV9fZmFzdGRlcENDX0ZBTFNFCiBhbV9fZmFzdGRlcENDX1RSVUUKIENDREVQTU9ERQorYW1fX25vZGVwCiBBTURFUEJBQ0tTTEFTSAogQU1ERVBfRkFMU0UKIEFNREVQX1RSVUUKQEAgLTg3NSw2ICs3ODgsNyBAQAogSU5TVEFMTF9EQVRBCiBJTlNUQUxMX1NDUklQVAogSU5TVEFMTF9QUk9HUkFNCitheF9lbmFibGVfYnVpbGRkaXJfc2VkCiB0YXJnZXRfb3MKIHRhcmdldF92ZW5kb3IKIHRhcmdldF9jcHUKQEAgLTkyOCwxNCArODQyLDE5IEBACiBhY19zdWJzdF9maWxlcz0nJwogYWNfdXNlcl9vcHRzPScKIGVuYWJsZV9vcHRpb25fY2hlY2tpbmcKK2VuYWJsZV9idWlsZGRpcgogZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmcKIGVuYWJsZV9zaGFyZWQKIGVuYWJsZV9zdGF0aWMKIHdpdGhfcGljCiBlbmFibGVfZmFzdF9pbnN0YWxsCiB3aXRoX2dudV9sZAord2l0aF9zeXNyb290CiBlbmFibGVfbGlidG9vbF9sb2NrCitlbmFibGVfcG9ydGFibGVfYmluYXJ5Cit3aXRoX2djY19hcmNoCiBlbmFibGVfbWFpbnRhaW5lcl9tb2RlCitlbmFibGVfcGF4X2VtdXRyYW1wCiBlbmFibGVfZGVidWcKIGVuYWJsZV9zdHJ1Y3RzCiBlbmFibGVfcmF3X2FwaQpAQCAtMTAxMCw4ICs5MjksOSBAQAogICBmaQogCiAgIGNhc2UgJGFjX29wdGlvbiBpbgotICAqPSopCWFjX29wdGFyZz1gZXhwciAiWCRhY19vcHRpb24iIDogJ1tePV0qPVwoLipcKSdgIDs7Ci0gICopCWFjX29wdGFyZz15ZXMgOzsKKyAgKj0/KikgYWNfb3B0YXJnPWBleHByICJYJGFjX29wdGlvbiIgOiAnW149XSo9XCguKlwpJ2AgOzsKKyAgKj0pICAgYWNfb3B0YXJnPSA7OworICAqKSAgICBhY19vcHRhcmc9eWVzIDs7CiAgIGVzYWMKIAogICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgpAQCAtMTA1Niw3ICs5NzYsNyBAQAogICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSpkaXNhYmxlLVwoLipcKSdgCiAgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgogICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICBhc19mbl9lcnJvciAiaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IgorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgZmVhdHVyZSBuYW1lOiAkYWNfdXNlcm9wdCIKICAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKICAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCiAgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCkBAIC0xMDgyLDcgKzEwMDIsNyBAQAogICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSplbmFibGUtXChbXj1dKlwpJ2AKICAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCiAgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSAgICAgIGFzX2ZuX2Vycm9yICJpbnZhbGlkIGZlYXR1cmUgbmFtZTogJGFjX3VzZXJvcHQiCisgICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IgogICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAogICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKICAgICBjYXNlICRhY191c2VyX29wdHMgaW4KQEAgLTEyODYsNyArMTIwNiw3IEBACiAgICAgYWNfdXNlcm9wdD1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGgtXChbXj1dKlwpJ2AKICAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCiAgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSAgICAgIGFzX2ZuX2Vycm9yICJpbnZhbGlkIHBhY2thZ2UgbmFtZTogJGFjX3VzZXJvcHQiCisgICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY191c2Vyb3B0IgogICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAogICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKICAgICBjYXNlICRhY191c2VyX29wdHMgaW4KQEAgLTEzMDIsNyArMTIyMiw3IEBACiAgICAgYWNfdXNlcm9wdD1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGhvdXQtXCguKlwpJ2AKICAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCiAgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSAgICAgIGFzX2ZuX2Vycm9yICJpbnZhbGlkIHBhY2thZ2UgbmFtZTogJGFjX3VzZXJvcHQiCisgICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY191c2Vyb3B0IgogICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAogICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKICAgICBjYXNlICRhY191c2VyX29wdHMgaW4KQEAgLTEzMzIsOCArMTI1Miw4IEBACiAgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQogICAgIHhfbGlicmFyaWVzPSRhY19vcHRhcmcgOzsKIAotICAtKikgYXNfZm5fZXJyb3IgInVucmVjb2duaXplZCBvcHRpb246IFxgJGFjX29wdGlvbicKLVRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorICAtKikgYXNfZm5fZXJyb3IgJD8gInVucmVjb2duaXplZCBvcHRpb246IFxgJGFjX29wdGlvbicKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24iCiAgICAgOzsKIAogICAqPSopCkBAIC0xMzQxLDcgKzEyNjEsNyBAQAogICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KICAgICBjYXNlICRhY19lbnZ2YXIgaW4gIygKICAgICAgICcnIHwgWzAtOV0qIHwgKlshXyRhc19jcl9hbG51bV0qICkKLSAgICAgIGFzX2ZuX2Vycm9yICJpbnZhbGlkIHZhcmlhYmxlIG5hbWU6IFxgJGFjX2VudnZhciciIDs7CisgICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB2YXJpYWJsZSBuYW1lOiBcYCRhY19lbnZ2YXInIiA7OwogICAgIGVzYWMKICAgICBldmFsICRhY19lbnZ2YXI9XCRhY19vcHRhcmcKICAgICBleHBvcnQgJGFjX2VudnZhciA7OwpAQCAtMTM1MSw3ICsxMjcxLDcgQEAKICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB5b3Ugc2hvdWxkIHVzZSAtLWJ1aWxkLCAtLWhvc3QsIC0tdGFyZ2V0IiA+JjIKICAgICBleHByICJ4JGFjX29wdGlvbiIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKICAgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGludmFsaWQgaG9zdCB0eXBlOiAkYWNfb3B0aW9uIiA+JjIKLSAgICA6ICR7YnVpbGRfYWxpYXM9JGFjX29wdGlvbn0gJHtob3N0X2FsaWFzPSRhY19vcHRpb259ICR7dGFyZ2V0X2FsaWFzPSRhY19vcHRpb259CisgICAgOiAiJHtidWlsZF9hbGlhcz0kYWNfb3B0aW9ufSAke2hvc3RfYWxpYXM9JGFjX29wdGlvbn0gJHt0YXJnZXRfYWxpYXM9JGFjX29wdGlvbn0iCiAgICAgOzsKIAogICBlc2FjCkBAIC0xMzU5LDEzICsxMjc5LDEzIEBACiAKIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgogICBhY19vcHRpb249LS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgCi0gIGFzX2ZuX2Vycm9yICJtaXNzaW5nIGFyZ3VtZW50IHRvICRhY19vcHRpb24iCisgIGFzX2ZuX2Vycm9yICQ/ICJtaXNzaW5nIGFyZ3VtZW50IHRvICRhY19vcHRpb24iCiBmaQogCiBpZiB0ZXN0IC1uICIkYWNfdW5yZWNvZ25pemVkX29wdHMiOyB0aGVuCiAgIGNhc2UgJGVuYWJsZV9vcHRpb25fY2hlY2tpbmcgaW4KICAgICBubykgOzsKLSAgICBmYXRhbCkgYXNfZm5fZXJyb3IgInVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiIDs7CisgICAgZmF0YWwpIGFzX2ZuX2Vycm9yICQ/ICJ1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA7OwogICAgICopICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA+JjIgOzsKICAgZXNhYwogZmkKQEAgLTEzODgsNyArMTMwOCw3IEBACiAgICAgW1xcLyRdKiB8ID86W1xcL10qICkgIGNvbnRpbnVlOzsKICAgICBOT05FIHwgJycgKSBjYXNlICRhY192YXIgaW4gKnByZWZpeCApIGNvbnRpbnVlOzsgZXNhYzs7CiAgIGVzYWMKLSAgYXNfZm5fZXJyb3IgImV4cGVjdGVkIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIGZvciAtLSRhY192YXI6ICRhY192YWwiCisgIGFzX2ZuX2Vycm9yICQ/ICJleHBlY3RlZCBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBmb3IgLS0kYWNfdmFyOiAkYWNfdmFsIgogZG9uZQogCiAjIFRoZXJlIG1pZ2h0IGJlIHBlb3BsZSB3aG8gZGVwZW5kIG9uIHRoZSBvbGQgYnJva2VuIGJlaGF2aW9yOiBgJGhvc3QnCkBAIC0xNDAyLDggKzEzMjIsNiBAQAogaWYgdGVzdCAieCRob3N0X2FsaWFzIiAhPSB4OyB0aGVuCiAgIGlmIHRlc3QgIngkYnVpbGRfYWxpYXMiID0geDsgdGhlbgogICAgIGNyb3NzX2NvbXBpbGluZz1tYXliZQotICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IElmIHlvdSB3YW50ZWQgdG8gc2V0IHRoZSAtLWJ1aWxkIHR5cGUsIGRvbid0IHVzZSAtLWhvc3QuCi0gICAgSWYgYSBjcm9zcyBjb21waWxlciBpcyBkZXRlY3RlZCB0aGVuIGNyb3NzIGNvbXBpbGUgbW9kZSB3aWxsIGJlIHVzZWQuIiA+JjIKICAgZWxpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiAhPSAieCRob3N0X2FsaWFzIjsgdGhlbgogICAgIGNyb3NzX2NvbXBpbGluZz15ZXMKICAgZmkKQEAgLTE0MTgsOSArMTMzNiw5IEBACiBhY19wd2Q9YHB3ZGAgJiYgdGVzdCAtbiAiJGFjX3B3ZCIgJiYKIGFjX2xzX2RpPWBscyAtZGkgLmAgJiYKIGFjX3B3ZF9sc19kaT1gY2QgIiRhY19wd2QiICYmIGxzIC1kaSAuYCB8fAotICBhc19mbl9lcnJvciAid29ya2luZyBkaXJlY3RvcnkgY2Fubm90IGJlIGRldGVybWluZWQiCisgIGFzX2ZuX2Vycm9yICQ/ICJ3b3JraW5nIGRpcmVjdG9yeSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCIKIHRlc3QgIlgkYWNfbHNfZGkiID0gIlgkYWNfcHdkX2xzX2RpIiB8fAotICBhc19mbl9lcnJvciAicHdkIGRvZXMgbm90IHJlcG9ydCBuYW1lIG9mIHdvcmtpbmcgZGlyZWN0b3J5IgorICBhc19mbl9lcnJvciAkPyAicHdkIGRvZXMgbm90IHJlcG9ydCBuYW1lIG9mIHdvcmtpbmcgZGlyZWN0b3J5IgogCiAKICMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KQEAgLTE0NTksMTEgKzEzNzcsMTEgQEAKIGZpCiBpZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgogICB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXMgJiYgc3JjZGlyPSIkYWNfY29uZmRpciBvciAuLiIKLSAgYXNfZm5fZXJyb3IgImNhbm5vdCBmaW5kIHNvdXJjZXMgKCRhY191bmlxdWVfZmlsZSkgaW4gJHNyY2RpciIKKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBmaW5kIHNvdXJjZXMgKCRhY191bmlxdWVfZmlsZSkgaW4gJHNyY2RpciIKIGZpCiBhY19tc2c9InNvdXJjZXMgYXJlIGluICRzcmNkaXIsIGJ1dCBcYGNkICRzcmNkaXInIGRvZXMgbm90IHdvcmsiCiBhY19hYnNfY29uZmRpcj1gKAotCWNkICIkc3JjZGlyIiAmJiB0ZXN0IC1yICIuLyRhY191bmlxdWVfZmlsZSIgfHwgYXNfZm5fZXJyb3IgIiRhY19tc2ciCisJY2QgIiRzcmNkaXIiICYmIHRlc3QgLXIgIi4vJGFjX3VuaXF1ZV9maWxlIiB8fCBhc19mbl9lcnJvciAkPyAiJGFjX21zZyIKIAlwd2QpYAogIyBXaGVuIGJ1aWxkaW5nIGluIHBsYWNlLCBzZXQgc3JjZGlyPS4KIGlmIHRlc3QgIiRhY19hYnNfY29uZmRpciIgPSAiJGFjX3B3ZCI7IHRoZW4KQEAgLTE0ODksNyArMTQwNyw3IEBACiAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgogICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCiAgIGNhdCA8PF9BQ0VPRgotXGBjb25maWd1cmUnIGNvbmZpZ3VyZXMgbGliZmZpIDMuMC4xMHJjMCB0byBhZGFwdCB0byBtYW55IGtpbmRzIG9mIHN5c3RlbXMuCitcYGNvbmZpZ3VyZScgY29uZmlndXJlcyBsaWJmZmkgMy4wLjEzIHRvIGFkYXB0IHRvIG1hbnkga2luZHMgb2Ygc3lzdGVtcy4KIAogVXNhZ2U6ICQwIFtPUFRJT05dLi4uIFtWQVI9VkFMVUVdLi4uCiAKQEAgLTE1MDMsNyArMTQyMSw3IEBACiAgICAgICAtLWhlbHA9c2hvcnQgICAgICAgIGRpc3BsYXkgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGlzIHBhY2thZ2UKICAgICAgIC0taGVscD1yZWN1cnNpdmUgICAgZGlzcGxheSB0aGUgc2hvcnQgaGVscCBvZiBhbGwgdGhlIGluY2x1ZGVkIHBhY2thZ2VzCiAgIC1WLCAtLXZlcnNpb24gICAgICAgICAgIGRpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotICAtcSwgLS1xdWlldCwgLS1zaWxlbnQgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKyAgLXEsIC0tcXVpZXQsIC0tc2lsZW50ICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcgLi4uJyBtZXNzYWdlcwogICAgICAgLS1jYWNoZS1maWxlPUZJTEUgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRSBbZGlzYWJsZWRdCiAgIC1DLCAtLWNvbmZpZy1jYWNoZSAgICAgIGFsaWFzIGZvciBcYC0tY2FjaGUtZmlsZT1jb25maWcuY2FjaGUnCiAgIC1uLCAtLW5vLWNyZWF0ZSAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCkBAIC0xNTYwLDcgKzE0NzgsNyBAQAogCiBpZiB0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIjsgdGhlbgogICBjYXNlICRhY19pbml0X2hlbHAgaW4KLSAgICAgc2hvcnQgfCByZWN1cnNpdmUgKSBlY2hvICJDb25maWd1cmF0aW9uIG9mIGxpYmZmaSAzLjAuMTByYzA6Ijs7CisgICAgIHNob3J0IHwgcmVjdXJzaXZlICkgZWNobyAiQ29uZmlndXJhdGlvbiBvZiBsaWJmZmkgMy4wLjEzOiI7OwogICAgZXNhYwogICBjYXQgPDxcX0FDRU9GCiAKQEAgLTE1NjgsMTUgKzE0ODYsMjQgQEAKICAgLS1kaXNhYmxlLW9wdGlvbi1jaGVja2luZyAgaWdub3JlIHVucmVjb2duaXplZCAtLWVuYWJsZS8tLXdpdGggb3B0aW9ucwogICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCiAgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgIHNwZWVkcyB1cCBvbmUtdGltZSBidWlsZAotICAtLWVuYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICAgZG8gbm90IHJlamVjdCBzbG93IGRlcGVuZGVuY3kgZXh0cmFjdG9ycworICAtLWRpc2FibGUtYnVpbGRkaXIgICAgICBkaXNhYmxlIGF1dG9tYXRpYyBidWlsZCBpbiBzdWJkaXIgb2Ygc291cmNlcworCisgIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gbm90IHJlamVjdCBzbG93IGRlcGVuZGVuY3kgZXh0cmFjdG9ycworICAtLWRpc2FibGUtZGVwZW5kZW5jeS10cmFja2luZworICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZHMgdXAgb25lLXRpbWUgYnVpbGQKICAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdCiAgIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXQogICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD15ZXNdCiAgIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGF2b2lkIGxvY2tpbmcgKG1pZ2h0IGJyZWFrIHBhcmFsbGVsIGJ1aWxkcykKLSAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlICBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLQkJCSAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlcgorICAtLWVuYWJsZS1wb3J0YWJsZS1iaW5hcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZSBjb21waWxlciBvcHRpbWl6YXRpb25zIHRoYXQgd291bGQgcHJvZHVjZQorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnBvcnRhYmxlIGJpbmFyaWVzCisgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwgKGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlcgorICAtLWVuYWJsZS1wYXhfZW11dHJhbXAgICAgICAgZW5hYmxlIHBheCBlbXVsYXRlZCB0cmFtcG9saW5lcywgZm9yIHdlIGNhbid0IHVzZSBQUk9UX0VYRUMKICAgLS1lbmFibGUtZGVidWcgICAgICAgICAgZGVidWdnaW5nIG1vZGUKICAgLS1kaXNhYmxlLXN0cnVjdHMgICAgICAgb21pdCBjb2RlIGZvciBzdHJ1Y3Qgc3VwcG9ydAogICAtLWRpc2FibGUtcmF3LWFwaSAgICAgICBtYWtlIHRoZSByYXcgYXBpIHVuYXZhaWxhYmxlCkBAIC0xNTg1LDkgKzE1MTIsMTMgQEAKIE9wdGlvbmFsIFBhY2thZ2VzOgogICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KICAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXdpdGgtcGljICAgICAgICAgICAgICB0cnkgdG8gdXNlIG9ubHkgUElDL25vbi1QSUMgb2JqZWN0cyBbZGVmYXVsdD11c2UKKyAgLS13aXRoLXBpY1s9UEtHU10gICAgICAgdHJ5IHRvIHVzZSBvbmx5IFBJQy9ub24tUElDIG9iamVjdHMgW2RlZmF1bHQ9dXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdGhdCiAgIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub10KKyAgLS13aXRoLXN5c3Jvb3Q9RElSIFNlYXJjaCBmb3IgZGVwZW5kZW50IGxpYnJhcmllcyB3aXRoaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAob3IgdGhlIGNvbXBpbGVyJ3Mgc3lzcm9vdCBpZiBub3Qgc3BlY2lmaWVkKS4KKyAgLS13aXRoLWdjYy1hcmNoPTxhcmNoPiAgdXNlIGFyY2hpdGVjdHVyZSA8YXJjaD4gZm9yIGdjYyAtbWFyY2gvLW10dW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIGd1ZXNzaW5nCiAKIFNvbWUgaW5mbHVlbnRpYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzOgogICBDQyAgICAgICAgICBDIGNvbXBpbGVyIGNvbW1hbmQKQEAgLTE2MDQsNyArMTUzNSw3IEBACiBVc2UgdGhlc2UgdmFyaWFibGVzIHRvIG92ZXJyaWRlIHRoZSBjaG9pY2VzIG1hZGUgYnkgYGNvbmZpZ3VyZScgb3IgdG8gaGVscAogaXQgdG8gZmluZCBsaWJyYXJpZXMgYW5kIHByb2dyYW1zIHdpdGggbm9uc3RhbmRhcmQgbmFtZXMvbG9jYXRpb25zLgogCi1SZXBvcnQgYnVncyB0byA8aHR0cDovL2djYy5nbnUub3JnL2J1Z3MuaHRtbD4uCitSZXBvcnQgYnVncyB0byA8aHR0cDovL2dpdGh1Yi5jb20vYXRncmVlbi9saWJmZmkvaXNzdWVzPi4KIF9BQ0VPRgogYWNfc3RhdHVzPSQ/CiBmaQpAQCAtMTY2NywxMCArMTU5OCwxMCBAQAogdGVzdCAtbiAiJGFjX2luaXRfaGVscCIgJiYgZXhpdCAkYWNfc3RhdHVzCiBpZiAkYWNfaW5pdF92ZXJzaW9uOyB0aGVuCiAgIGNhdCA8PFxfQUNFT0YKLWxpYmZmaSBjb25maWd1cmUgMy4wLjEwcmMwCi1nZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjUKK2xpYmZmaSBjb25maWd1cmUgMy4wLjEzCitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjkKIAotQ29weXJpZ2h0IChDKSAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorQ29weXJpZ2h0IChDKSAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KIF9BQ0VPRgpAQCAtMTcxNCw3ICsxNjQ1LDcgQEAKIAogCWFjX3JldHZhbD0xCiBmaQotICBldmFsICRhc19saW5lbm9fc3RhY2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHggJiYgeyBhc19saW5lbm89OyB1bnNldCBhc19saW5lbm87fQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KICAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCiAKIH0gIyBhY19mbl9jX3RyeV9jb21waWxlCkBAIC0xNzQ2LDcgKzE2NzcsNyBAQAogCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7CiAJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8Ci0JICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0CisJIHRlc3QgLXggY29uZnRlc3QkYWNfZXhlZXh0CiAgICAgICAgfTsgdGhlbiA6CiAgIGFjX3JldHZhbD0wCiBlbHNlCkBAIC0xNzYwLDcgKzE2OTEsNyBAQAogICAjIGludGVyZmVyZSB3aXRoIHRoZSBuZXh0IGxpbmsgY29tbWFuZDsgYWxzbyBkZWxldGUgYSBkaXJlY3RvcnkgdGhhdCBpcwogICAjIGxlZnQgYmVoaW5kIGJ5IEFwcGxlJ3MgY29tcGlsZXIuICBXZSBkbyB0aGlzIGJlZm9yZSBleGVjdXRpbmcgdGhlIGFjdGlvbnMuCiAgIHJtIC1yZiBjb25mdGVzdC5kU1lNIGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28KLSAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyB0ZXN0ICJ4JGFzX2xpbmVub19zdGFjayIgPSB4ICYmIHsgYXNfbGluZW5vPTsgdW5zZXQgYXNfbGluZW5vO30KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCiAgIGFzX2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAogCiB9ICMgYWNfZm5fY190cnlfbGluawpAQCAtMTc3NCw3ICsxNzA1LDcgQEAKICAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawogICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KLWlmIHsgYXNfdmFyPSQzOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuIDoKK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CkBAIC0xNzkyLDcgKzE3MjMsNyBAQAogZXZhbCBhY19yZXM9XCQkMwogCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiAkYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9CisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwogCiB9ICMgYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZQogCkBAIC0xODE3LDcgKzE3NDgsNyBAQAogICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKICAgZmkKICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gPi9kZXYvbnVsbCAmJiB7CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gPiBjb25mdGVzdC5pICYmIHsKIAkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKIAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgogICAgICAgIH07IHRoZW4gOgpAQCAtMTgyOCw3ICsxNzU5LDcgQEAKIAogICAgIGFjX3JldHZhbD0xCiBmaQotICBldmFsICRhc19saW5lbm9fc3RhY2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHggJiYgeyBhc19saW5lbm89OyB1bnNldCBhc19saW5lbm87fQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KICAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCiAKIH0gIyBhY19mbl9jX3RyeV9jcHAKQEAgLTE4NzAsNyArMTgwMSw3IEBACiAgICAgICAgYWNfcmV0dmFsPSRhY19zdGF0dXMKIGZpCiAgIHJtIC1yZiBjb25mdGVzdC5kU1lNIGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28KLSAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyB0ZXN0ICJ4JGFzX2xpbmVub19zdGFjayIgPSB4ICYmIHsgYXNfbGluZW5vPTsgdW5zZXQgYXNfbGluZW5vO30KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCiAgIGFzX2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAogCiB9ICMgYWNfZm5fY190cnlfcnVuCkBAIC0xODgzLDcgKzE4MTQsNyBAQAogICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQotaWYgeyBhc192YXI9JDM7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4gOgoraWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKQEAgLTE5MzgsMTAzICsxODY5LDEwIEBACiBldmFsIGFjX3Jlcz1cJCQzCiAJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKICRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KLSAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyB0ZXN0ICJ4JGFzX2xpbmVub19zdGFjayIgPSB4ICYmIHsgYXNfbGluZW5vPTsgdW5zZXQgYXNfbGluZW5vO30KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCiAKIH0gIyBhY19mbl9jX2NoZWNrX2Z1bmMKIAotIyBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsIExJTkVOTyBIRUFERVIgVkFSIElOQ0xVREVTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVGVzdHMgd2hldGhlciBIRUFERVIgZXhpc3RzLCBnaXZpbmcgYSB3YXJuaW5nIGlmIGl0IGNhbm5vdCBiZSBjb21waWxlZCB1c2luZwotIyB0aGUgaW5jbHVkZSBmaWxlcyBpbiBJTkNMVURFUyBhbmQgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSCi0jIGFjY29yZGluZ2x5LgotYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAoKQotewotICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gIGlmIHsgYXNfdmFyPSQzOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuIDoKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9Ci1pZiB7IGFzX3Zhcj0kMzsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1maQotZXZhbCBhY19yZXM9XCQkMwotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci1lbHNlCi0gICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyAkMiB1c2FiaWxpdHkiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgJDIgdXNhYmlsaXR5Li4uICIgPiY2OyB9Ci1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kNAotI2luY2x1ZGUgPCQyPgotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKLWVsc2UKLSAgYWNfaGVhZGVyX2NvbXBpbGVyPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1Ci0kYXNfZWNobyAiJGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9Ci0KLSMgSXMgdGhlIGhlYWRlciBwcmVzZW50PwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyAkMiBwcmVzZW5jZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyAkMiBwcmVzZW5jZS4uLiAiID4mNjsgfQotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPCQyPgotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCi1lbHNlCi0gIGFjX2hlYWRlcl9wcmVwcm9jPW5vCi1maQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQotJGFzX2VjaG8gIiRhY19oZWFkZXJfcHJlcHJvYyIgPiY2OyB9Ci0KLSMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPwotY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAjKCgKLSAgeWVzOm5vOiApCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQotICAgIDs7Ci0gIG5vOnllczoqICkKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjI7fQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9Ci0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KLSggY2F0IDw8XF9BU0JPWAotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgUmVwb3J0IHRoaXMgdG8gaHR0cDovL2djYy5nbnUub3JnL2J1Z3MuaHRtbCAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotX0FTQk9YCi0gICAgICkgfCBzZWQgInMvXi8kYXNfbWU6IFdBUk5JTkc6ICAgICAvIiA+JjIKLSAgICA7OwotZXNhYwotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KLWlmIHsgYXNfdmFyPSQzOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgZXZhbCAiJDM9XCRhY19oZWFkZXJfY29tcGlsZXIiCi1maQotZXZhbCBhY19yZXM9XCQkMwotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci1maQotICBldmFsICRhc19saW5lbm9fc3RhY2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHggJiYgeyBhc19saW5lbm89OyB1bnNldCBhc19saW5lbm87fQotCi19ICMgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbAotCiAjIGFjX2ZuX2NfY29tcHV0ZV9pbnQgTElORU5PIEVYUFIgVkFSIElOQ0xVREVTCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIFRyaWVzIHRvIGZpbmQgdGhlIGNvbXBpbGUtdGltZSB2YWx1ZSBvZiBFWFBSIGluIGEgcHJvZ3JhbSB0aGF0IGluY2x1ZGVzCkBAIC0yMDUyLDcgKzE4OTAsOCBAQAogbWFpbiAoKQogewogc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKCQyKSA+PSAwKV07Ci10ZXN0X2FycmF5IFswXSA9IDAKK3Rlc3RfYXJyYXkgWzBdID0gMDsKK3JldHVybiB0ZXN0X2FycmF5IFswXTsKIAogICA7CiAgIHJldHVybiAwOwpAQCAtMjA2OCw3ICsxOTA3LDggQEAKIG1haW4gKCkKIHsKIHN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgkMikgPD0gJGFjX21pZCldOwotdGVzdF9hcnJheSBbMF0gPSAwCit0ZXN0X2FycmF5IFswXSA9IDA7CityZXR1cm4gdGVzdF9hcnJheSBbMF07CiAKICAgOwogICByZXR1cm4gMDsKQEAgLTIwOTQsNyArMTkzNCw4IEBACiBtYWluICgpCiB7CiBzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoJDIpIDwgMCldOwotdGVzdF9hcnJheSBbMF0gPSAwCit0ZXN0X2FycmF5IFswXSA9IDA7CityZXR1cm4gdGVzdF9hcnJheSBbMF07CiAKICAgOwogICByZXR1cm4gMDsKQEAgLTIxMTAsNyArMTk1MSw4IEBACiBtYWluICgpCiB7CiBzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoJDIpID49ICRhY19taWQpXTsKLXRlc3RfYXJyYXkgWzBdID0gMAordGVzdF9hcnJheSBbMF0gPSAwOworcmV0dXJuIHRlc3RfYXJyYXkgWzBdOwogCiAgIDsKICAgcmV0dXJuIDA7CkBAIC0yMTQ0LDcgKzE5ODYsOCBAQAogbWFpbiAoKQogewogc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKCQyKSA8PSAkYWNfbWlkKV07Ci10ZXN0X2FycmF5IFswXSA9IDAKK3Rlc3RfYXJyYXkgWzBdID0gMDsKK3JldHVybiB0ZXN0X2FycmF5IFswXTsKIAogICA7CiAgIHJldHVybiAwOwpAQCAtMjIwOCwxNiArMjA1MSwxNjEgQEAKIHJtIC1mIGNvbmZ0ZXN0LnZhbAogCiAgIGZpCi0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9CisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwogICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKIAogfSAjIGFjX2ZuX2NfY29tcHV0ZV9pbnQKKworIyBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsIExJTkVOTyBIRUFERVIgVkFSIElOQ0xVREVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGVzdHMgd2hldGhlciBIRUFERVIgZXhpc3RzLCBnaXZpbmcgYSB3YXJuaW5nIGlmIGl0IGNhbm5vdCBiZSBjb21waWxlZCB1c2luZworIyB0aGUgaW5jbHVkZSBmaWxlcyBpbiBJTkNMVURFUyBhbmQgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSCisjIGFjY29yZGluZ2x5LgorYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIGlmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZmkKK2V2YWwgYWNfcmVzPVwkJDMKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorZWxzZQorICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgJDIgdXNhYmlsaXR5IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nICQyIHVzYWJpbGl0eS4uLiAiID4mNjsgfQorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKKyNpbmNsdWRlIDwkMj4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCitlbHNlCisgIGFjX2hlYWRlcl9jb21waWxlcj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQorJGFzX2VjaG8gIiRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQorCisjIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgJDIgcHJlc2VuY2UiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgJDIgcHJlc2VuY2UuLi4gIiA+JjY7IH0KK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDwkMj4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworZWxzZQorICBhY19oZWFkZXJfcHJlcHJvYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQorJGFzX2VjaG8gIiRhY19oZWFkZXJfcHJlcHJvYyIgPiY2OyB9CisKKyMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPworY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAjKCgKKyAgeWVzOm5vOiApCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQorICAgIDs7CisgIG5vOnllczoqICkKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjI7fQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KKyggJGFzX2VjaG8gIiMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgUmVwb3J0IHRoaXMgdG8gaHR0cDovL2dpdGh1Yi5jb20vYXRncmVlbi9saWJmZmkvaXNzdWVzICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMiCisgICAgICkgfCBzZWQgInMvXi8kYXNfbWU6IFdBUk5JTkc6ICAgICAvIiA+JjIKKyAgICA7OworZXNhYworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBldmFsICIkMz1cJGFjX2hlYWRlcl9jb21waWxlciIKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KK2ZpCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworCit9ICMgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbAorCisjIGFjX2ZuX2NfY2hlY2tfdHlwZSBMSU5FTk8gVFlQRSBWQVIgSU5DTFVERVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cyB3aGV0aGVyIFRZUEUgZXhpc3RzIGFmdGVyIGhhdmluZyBpbmNsdWRlZCBJTkNMVURFUywgc2V0dGluZyBjYWNoZQorIyB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkuCithY19mbl9jX2NoZWNrX3R5cGUgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBldmFsICIkMz1ubyIKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKK2ludAorbWFpbiAoKQoreworaWYgKHNpemVvZiAoJDIpKQorCSByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CitpZiAoc2l6ZW9mICgoJDIpKSkKKwkgICAgcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICBldmFsICIkMz15ZXMiCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZXZhbCBhY19yZXM9XCQkMworCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworCit9ICMgYWNfZm5fY19jaGVja190eXBlCiBjYXQgPmNvbmZpZy5sb2cgPDxfQUNFT0YKIFRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCiBydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgogCi1JdCB3YXMgY3JlYXRlZCBieSBsaWJmZmkgJGFzX21lIDMuMC4xMHJjMCwgd2hpY2ggd2FzCi1nZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjUuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKK0l0IHdhcyBjcmVhdGVkIGJ5IGxpYmZmaSAkYXNfbWUgMy4wLjEzLCB3aGljaCB3YXMKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OS4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcwogCiAgICQgJDAgJEAKIApAQCAtMjMyNywxMSArMjMxNSw5IEBACiAgIHsKICAgICBlY2hvCiAKLSAgICBjYXQgPDxcX0FTQk9YCi0jIyAtLS0tLS0tLS0tLS0tLS0tICMjCisgICAgJGFzX2VjaG8gIiMjIC0tLS0tLS0tLS0tLS0tLS0gIyMKICMjIENhY2hlIHZhcmlhYmxlcy4gIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0gIyMKLV9BU0JPWAorIyMgLS0tLS0tLS0tLS0tLS0tLSAjIyIKICAgICBlY2hvCiAgICAgIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKICgKQEAgLTIzNjUsMTEgKzIzNTEsOSBAQAogKQogICAgIGVjaG8KIAotICAgIGNhdCA8PFxfQVNCT1gKLSMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCisgICAgJGFzX2VjaG8gIiMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCiAjIyBPdXRwdXQgdmFyaWFibGVzLiAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKLV9BU0JPWAorIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMiCiAgICAgZWNobwogICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X3ZhcnMKICAgICBkbwpAQCAtMjM4MiwxMSArMjM2Niw5IEBACiAgICAgZWNobwogCiAgICAgaWYgdGVzdCAtbiAiJGFjX3N1YnN0X2ZpbGVzIjsgdGhlbgotICAgICAgY2F0IDw8XF9BU0JPWAotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworICAgICAgJGFzX2VjaG8gIiMjIC0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKICMjIEZpbGUgc3Vic3RpdHV0aW9ucy4gIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLV9BU0JPWAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLSAjIyIKICAgICAgIGVjaG8KICAgICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X2ZpbGVzCiAgICAgICBkbwpAQCAtMjQwMCwxMSArMjM4Miw5IEBACiAgICAgZmkKIAogICAgIGlmIHRlc3QgLXMgY29uZmRlZnMuaDsgdGhlbgotICAgICAgY2F0IDw8XF9BU0JPWAotIyMgLS0tLS0tLS0tLS0gIyMKKyAgICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLSAjIwogIyMgY29uZmRlZnMuaC4gIyMKLSMjIC0tLS0tLS0tLS0tICMjCi1fQVNCT1gKKyMjIC0tLS0tLS0tLS0tICMjIgogICAgICAgZWNobwogICAgICAgY2F0IGNvbmZkZWZzLmgKICAgICAgIGVjaG8KQEAgLTI0NTksNyArMjQzOSwxMiBAQAogYWNfc2l0ZV9maWxlMT1OT05FCiBhY19zaXRlX2ZpbGUyPU5PTkUKIGlmIHRlc3QgLW4gIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgYWNfc2l0ZV9maWxlMT0kQ09ORklHX1NJVEUKKyAgIyBXZSBkbyBub3Qgd2FudCBhIFBBVEggc2VhcmNoIGZvciBjb25maWcuc2l0ZS4KKyAgY2FzZSAkQ09ORklHX1NJVEUgaW4gIygoCisgICAgLSopICBhY19zaXRlX2ZpbGUxPS4vJENPTkZJR19TSVRFOzsKKyAgICAqLyopIGFjX3NpdGVfZmlsZTE9JENPTkZJR19TSVRFOzsKKyAgICAqKSAgIGFjX3NpdGVfZmlsZTE9Li8kQ09ORklHX1NJVEU7OworICBlc2FjCiBlbGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgogICBhY19zaXRlX2ZpbGUxPSRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUKICAgYWNfc2l0ZV9maWxlMj0kcHJlZml4L2V0Yy9jb25maWcuc2l0ZQpAQCAtMjQ3NCw3ICsyNDU5LDExIEBACiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNQogJGFzX2VjaG8gIiRhc19tZTogbG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIiA+JjY7fQogICAgIHNlZCAncy9eL3wgLycgIiRhY19zaXRlX2ZpbGUiID4mNQotICAgIC4gIiRhY19zaXRlX2ZpbGUiCisgICAgLiAiJGFjX3NpdGVfZmlsZSIgXAorICAgICAgfHwgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiZmFpbGVkIHRvIGxvYWQgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KICAgZmkKIGRvbmUKIApAQCAtMjU1MCw3ICsyNTM5LDcgQEAKICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogY2hhbmdlcyBpbiB0aGUgZW52aXJvbm1lbnQgY2FuIGNvbXByb21pc2UgdGhlIGJ1aWxkIiA+JjUKICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mMjt9Ci0gIGFzX2ZuX2Vycm9yICJydW4gXGBtYWtlIGRpc3RjbGVhbicgYW5kL29yIFxgcm0gJGNhY2hlX2ZpbGUnIGFuZCBzdGFydCBvdmVyIiAiJExJTkVOTyIgNQorICBhc19mbl9lcnJvciAkPyAicnVuIFxgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBcYHJtICRjYWNoZV9maWxlJyBhbmQgc3RhcnQgb3ZlciIgIiRMSU5FTk8iIDUKIGZpCiAjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwogIyMgTWFpbiBib2R5IG9mIHNjcmlwdC4gIyMKQEAgLTI1NjgsMTYgKzI1NTcsMjIgQEAKIAogYWNfYXV4X2Rpcj0KIGZvciBhY19kaXIgaW4gIiRzcmNkaXIiICIkc3JjZGlyLy4uIiAiJHNyY2Rpci8uLi8uLiI7IGRvCi0gIGZvciBhY190IGluIGluc3RhbGwtc2ggaW5zdGFsbC5zaCBzaHRvb2w7IGRvCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfdCI7IHRoZW4KLSAgICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvJGFjX3QgLWMiCi0gICAgICBicmVhayAyCi0gICAgZmkKLSAgZG9uZQorICBpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwtc2giOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvaW5zdGFsbC5zaCI7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAiJGFjX2Rpci9zaHRvb2wiOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvc2h0b29sIGluc3RhbGwgLWMiCisgICAgYnJlYWsKKyAgZmkKIGRvbmUKIGlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICBhc19mbl9lcnJvciAiY2Fubm90IGZpbmQgaW5zdGFsbC1zaCwgaW5zdGFsbC5zaCwgb3Igc2h0b29sIGluIFwiJHNyY2RpclwiIFwiJHNyY2Rpci8uLlwiIFwiJHNyY2Rpci8uLi8uLlwiIiAiJExJTkVOTyIgNQorICBhc19mbl9lcnJvciAkPyAiY2Fubm90IGZpbmQgaW5zdGFsbC1zaCwgaW5zdGFsbC5zaCwgb3Igc2h0b29sIGluIFwiJHNyY2RpclwiIFwiJHNyY2Rpci8uLlwiIFwiJHNyY2Rpci8uLi8uLlwiIiAiJExJTkVOTyIgNQogZmkKIAogIyBUaGVzZSB0aHJlZSB2YXJpYWJsZXMgYXJlIHVuZG9jdW1lbnRlZCBhbmQgdW5zdXBwb3J0ZWQsCkBAIC0yNTkxLDI3ICsyNTg2LDI3IEBACiAKICMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KICRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgc3VuNCA+L2Rldi9udWxsIDI+JjEgfHwKLSAgYXNfZm5fZXJyb3IgImNhbm5vdCBydW4gJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICIkTElORU5PIiA1CisgIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgcnVuICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAiJExJTkVOTyIgNQogCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2J1aWxkK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfYnVpbGQrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBhY19idWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKIHRlc3QgIngkYWNfYnVpbGRfYWxpYXMiID0geCAmJgogICBhY19idWlsZF9hbGlhcz1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiYAogdGVzdCAieCRhY19idWlsZF9hbGlhcyIgPSB4ICYmCi0gIGFzX2ZuX2Vycm9yICJjYW5ub3QgZ3Vlc3MgYnVpbGQgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiICIkTElORU5PIiA1CisgIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZ3Vlc3MgYnVpbGQgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiICIkTElORU5PIiA1CiBhY19jdl9idWlsZD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkYWNfYnVpbGRfYWxpYXNgIHx8Ci0gIGFzX2ZuX2Vycm9yICIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkYWNfYnVpbGRfYWxpYXMgZmFpbGVkIiAiJExJTkVOTyIgNQorICBhc19mbl9lcnJvciAkPyAiJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGFjX2J1aWxkX2FsaWFzIGZhaWxlZCIgIiRMSU5FTk8iIDUKIAogZmkKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfYnVpbGQiID4mNQogJGFzX2VjaG8gIiRhY19jdl9idWlsZCIgPiY2OyB9CiBjYXNlICRhY19jdl9idWlsZCBpbgogKi0qLSopIDs7Ci0qKSBhc19mbl9lcnJvciAiaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgYnVpbGQiICIkTElORU5PIiA1OzsKKyopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBidWlsZCIgIiRMSU5FTk8iIDU7OwogZXNhYwogYnVpbGQ9JGFjX2N2X2J1aWxkCiBhY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCkBAIC0yNjI5LDE0ICsyNjI0LDE0IEBACiAKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2hvc3Qrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9ob3N0Kzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAieCRob3N0X2FsaWFzIiA9IHg7IHRoZW4KICAgYWNfY3ZfaG9zdD0kYWNfY3ZfYnVpbGQKIGVsc2UKICAgYWNfY3ZfaG9zdD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkaG9zdF9hbGlhc2AgfHwKLSAgICBhc19mbl9lcnJvciAiJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGhvc3RfYWxpYXMgZmFpbGVkIiAiJExJTkVOTyIgNQorICAgIGFzX2ZuX2Vycm9yICQ/ICIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkaG9zdF9hbGlhcyBmYWlsZWQiICIkTElORU5PIiA1CiBmaQogCiBmaQpAQCAtMjY0NCw3ICsyNjM5LDcgQEAKICRhc19lY2hvICIkYWNfY3ZfaG9zdCIgPiY2OyB9CiBjYXNlICRhY19jdl9ob3N0IGluCiAqLSotKikgOzsKLSopIGFzX2ZuX2Vycm9yICJpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBob3N0IiAiJExJTkVOTyIgNTs7CisqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgaG9zdCIgIiRMSU5FTk8iIDU7OwogZXNhYwogaG9zdD0kYWNfY3ZfaG9zdAogYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJwpAQCAtMjY2MiwxNCArMjY1NywxNCBAQAogCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfdGFyZ2V0K3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfdGFyZ2V0Kzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAieCR0YXJnZXRfYWxpYXMiID0geDsgdGhlbgogICBhY19jdl90YXJnZXQ9JGFjX2N2X2hvc3QKIGVsc2UKICAgYWNfY3ZfdGFyZ2V0PWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICR0YXJnZXRfYWxpYXNgIHx8Ci0gICAgYXNfZm5fZXJyb3IgIiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICR0YXJnZXRfYWxpYXMgZmFpbGVkIiAiJExJTkVOTyIgNQorICAgIGFzX2ZuX2Vycm9yICQ/ICIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkdGFyZ2V0X2FsaWFzIGZhaWxlZCIgIiRMSU5FTk8iIDUKIGZpCiAKIGZpCkBAIC0yNjc3LDcgKzI2NzIsNyBAQAogJGFzX2VjaG8gIiRhY19jdl90YXJnZXQiID4mNjsgfQogY2FzZSAkYWNfY3ZfdGFyZ2V0IGluCiAqLSotKikgOzsKLSopIGFzX2ZuX2Vycm9yICJpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCB0YXJnZXQiICIkTElORU5PIiA1OzsKKyopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCB0YXJnZXQiICIkTElORU5PIiA1OzsKIGVzYWMKIHRhcmdldD0kYWNfY3ZfdGFyZ2V0CiBhY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCkBAIC0yNzA0LDcgKzI2OTksMTExIEBACiAKIC4gJHtzcmNkaXJ9L2NvbmZpZ3VyZS5ob3N0CiAKLWFtX19hcGlfdmVyc2lvbj0nMS4xMScKKworICAgIyBbJF1AIGlzIHVuc2FibGUgaW4gMi42MCsgYnV0IGVhcmxpZXIgYXV0b2NvbmYgaGFkIG5vIGFjX2NvbmZpZ3VyZV9hcmdzCisgICBpZiB0ZXN0ICIke2FjX2NvbmZpZ3VyZV9hcmdzK3NldH0iICE9ICJzZXQiIDsgdGhlbgorICAgICAgYWNfY29uZmlndXJlX2FyZ3M9CisgICAgICBmb3IgYWNfYXJnIGluICR7MSsiJEAifTsgZG8KKyAgICAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIgorICAgICAgZG9uZQorICAgZmkKKworIyBleHBhbmQgJGFjX2F1eF9kaXIgdG8gYW4gYWJzb2x1dGUgcGF0aAorYW1fYXV4X2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAorCisKK2F4X2VuYWJsZV9idWlsZGRpcj0iLiIKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1idWlsZGRpciB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9idWlsZGRpcitzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2J1aWxkZGlyOyBheF9lbmFibGVfYnVpbGRkaXI9IiRlbmFibGV2YWwiCitlbHNlCisgIGF4X2VuYWJsZV9idWlsZGRpcj0iYXV0byIKK2ZpCisKK2lmIHRlc3QgIi4kYWNfc3JjZGlyX2RlZmF1bHRlZCIgIT0gIi5ubyIgOyB0aGVuCitpZiB0ZXN0ICIuJHNyY2RpciIgPSAiLi4iIDsgdGhlbgorICBpZiB0ZXN0IC1mIGNvbmZpZy5zdGF0dXMgOyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiB0b3BsZXZlbCBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkLi4uIHNraXBwaW5nIHN1YmRpciBidWlsZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiB0b3BsZXZlbCBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkLi4uIHNraXBwaW5nIHN1YmRpciBidWlsZCIgPiY2O30KKyAgZWxzZQorICAgIHRlc3QgIi4kYXhfZW5hYmxlX2J1aWxkZGlyIiA9ICIuIiAgJiYgYXhfZW5hYmxlX2J1aWxkZGlyPSIuIgorICAgIHRlc3QgIi4kYXhfZW5hYmxlX2J1aWxkZGlyIiA9ICIubm8iICAmJiBheF9lbmFibGVfYnVpbGRkaXI9Ii4iCisgICAgdGVzdCAiLiRUQVJHRVQiID0gIi4iICYmIFRBUkdFVD0iJHRhcmdldCIKKyAgICB0ZXN0ICIuJGF4X2VuYWJsZV9idWlsZGRpciIgPSAiLmF1dG8iICYmIGF4X2VuYWJsZV9idWlsZGRpcj0iJFRBUkdFVCIKKyAgICBpZiB0ZXN0ICIuJGF4X2VuYWJsZV9idWlsZGRpciIgIT0gIi4uIiA7IHRoZW4gICAgIyB3ZSBrbm93IHdoZXJlIHRvIGdvIGFuZAorICAgICAgYXNfZGlyPSRheF9lbmFibGVfYnVpbGRkaXI7IGFzX2ZuX21rZGlyX3AKKyAgICAgIGVjaG8gX18uJGF4X2VuYWJsZV9idWlsZGRpci5fXyA+ICRheF9lbmFibGVfYnVpbGRkaXIvY29uZnRlc3QudG1wCisgICAgICBjZCAkYXhfZW5hYmxlX2J1aWxkZGlyCisgICAgICBpZiBncmVwIF9fLiRheF9lbmFibGVfYnVpbGRkaXIuX18gY29uZnRlc3QudG1wID4vZGV2L251bGwgMj4vZGV2L251bGwgOyB0aGVuCisgICAgICAgIHJtIGNvbmZ0ZXN0LnRtcAorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogY29udGludWUgY29uZmlndXJlIGluIGRlZmF1bHQgYnVpbGRkaXIgXCIuLyRheF9lbmFibGVfYnVpbGRkaXJcIiIgPiY1CiskYXNfZWNobyAiY29udGludWUgY29uZmlndXJlIGluIGRlZmF1bHQgYnVpbGRkaXIgXCIuLyRheF9lbmFibGVfYnVpbGRkaXJcIiIgPiY2OyB9CisgICAgICBlbHNlCisgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY2hhbmdlIHRvIGRlZmF1bHQgYnVpbGRkaXIgXCIuLyRheF9lbmFibGVfYnVpbGRkaXJcIiIgIiRMSU5FTk8iIDUKKyAgICAgIGZpCisgICAgICBzcmNkaXI9YGVjaG8gIiRheF9lbmFibGVfYnVpbGRkaXIiIHwKKyAgICAgICAgICAgICAgc2VkIC1lICdzLF5cLi8sLDtzLFteL10kLCYvLDtzLFteL10qLywuLi8sZztzLFsvXSQsLDsnYAorICAgICAgIyBnb2luZyB0byByZXN0YXJ0IGZyb20gc3ViZGlyZWN0b3J5IGxvY2F0aW9uCisgICAgICB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLmxvZyAgICYmIG12ICRzcmNkaXIvY29uZmlnLmxvZyAgIC4KKyAgICAgIHRlc3QgLWYgJHNyY2Rpci9jb25mZGVmcy5oICAgJiYgbXYgJHNyY2Rpci9jb25mZGVmcy5oICAgLgorICAgICAgdGVzdCAtZiAkc3JjZGlyL2NvbmZ0ZXN0LmxvZyAmJiBtdiAkc3JjZGlyL2NvbmZ0ZXN0LmxvZyAuCisgICAgICB0ZXN0IC1mICRzcmNkaXIvJGNhY2hlX2ZpbGUgICYmIG12ICRzcmNkaXIvJGNhY2hlX2ZpbGUgIC4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAuLi4uZXhlYyAkU0hFTEwgJHNyY2Rpci8kMCBcIi0tc3JjZGlyPSRzcmNkaXJcIiBcIi0tZW5hYmxlLWJ1aWxkZGlyPSRheF9lbmFibGVfYnVpbGRkaXJcIiAkezErXCIkQFwifSIgPiY1CiskYXNfZWNobyAiLi4uLmV4ZWMgJFNIRUxMICRzcmNkaXIvJDAgXCItLXNyY2Rpcj0kc3JjZGlyXCIgXCItLWVuYWJsZS1idWlsZGRpcj0kYXhfZW5hYmxlX2J1aWxkZGlyXCIgJHsxK1wiJEBcIn0iID4mNjsgfQorICAgICAgY2FzZSAiJDAiIGluICMgcmVzdGFydAorICAgICAgIC9cXCopIGV2YWwgJFNIRUxMICInJDAnIiAiJy0tc3JjZGlyPSRzcmNkaXInIiAiJy0tZW5hYmxlLWJ1aWxkZGlyPSRheF9lbmFibGVfYnVpbGRkaXInIiAkYWNfY29uZmlndXJlX2FyZ3MgOzsKKyAgICAgICAqKSBldmFsICRTSEVMTCAiJyRzcmNkaXIvJDAnIiAiJy0tc3JjZGlyPSRzcmNkaXInIiAiJy0tZW5hYmxlLWJ1aWxkZGlyPSRheF9lbmFibGVfYnVpbGRkaXInIiAkYWNfY29uZmlndXJlX2FyZ3MgOzsKKyAgICAgIGVzYWMgOyBleGl0ICQ/CisgICAgZmkKKyAgZmkKK2ZpIGZpCit0ZXN0ICIuJGF4X2VuYWJsZV9idWlsZGRpciIgPSAiLmF1dG8iICYmIGF4X2VuYWJsZV9idWlsZGRpcj0iLiIKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ3NlZCBzZWQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdzZWQgc2VkOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9heF9lbmFibGVfYnVpbGRkaXJfc2VkKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkYXhfZW5hYmxlX2J1aWxkZGlyX3NlZCBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9heF9lbmFibGVfYnVpbGRkaXJfc2VkPSIkYXhfZW5hYmxlX2J1aWxkZGlyX3NlZCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3BhdGhfYXhfZW5hYmxlX2J1aWxkZGlyX3NlZD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9heF9lbmFibGVfYnVpbGRkaXJfc2VkIiAmJiBhY19jdl9wYXRoX2F4X2VuYWJsZV9idWlsZGRpcl9zZWQ9InNlZCIKKyAgOzsKK2VzYWMKK2ZpCitheF9lbmFibGVfYnVpbGRkaXJfc2VkPSRhY19jdl9wYXRoX2F4X2VuYWJsZV9idWlsZGRpcl9zZWQKK2lmIHRlc3QgLW4gIiRheF9lbmFibGVfYnVpbGRkaXJfc2VkIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGF4X2VuYWJsZV9idWlsZGRpcl9zZWQiID4mNQorJGFzX2VjaG8gIiRheF9lbmFibGVfYnVpbGRkaXJfc2VkIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2F4X2VuYWJsZV9idWlsZGRpcl9hdXhkaXI9IiRhbV9hdXhfZGlyIgorYWNfY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIGJ1aWxkaXIiCisKKworYW1fX2FwaV92ZXJzaW9uPScxLjEyJwogCiAjIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKICMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgpAQCAtMjcyMyw3ICsyODIyLDcgQEAKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsLi4uICIgPiY2OyB9CiBpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfcGF0aF9pbnN0YWxsKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgpAQCAtMjc0Myw3ICsyODQyLDcgQEAKICAgICAjIGJ5IGRlZmF1bHQuCiAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwogICAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0JaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorCWlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IHRoZW4KIAkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCiAJICAgIGdyZXAgZHNwbXNnICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KIAkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgpAQCAtMjgwMSw1NiArMjkwMCw3MSBAQAogCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuLi4gIiA+JjY7IH0KLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0LmZpbGUKICMgUmVqZWN0IHVuc2FmZSBjaGFyYWN0ZXJzIGluICRzcmNkaXIgb3IgdGhlIGFic29sdXRlIHdvcmtpbmcgZGlyZWN0b3J5CiAjIG5hbWUuICBBY2NlcHQgc3BhY2UgYW5kIHRhYiBvbmx5IGluIHRoZSBsYXR0ZXIuCiBhbV9sZj0nCiAnCiBjYXNlIGBwd2RgIGluCiAgICpbXFxcIlwjXCRcJlwnXGAkYW1fbGZdKikKLSAgICBhc19mbl9lcnJvciAidW5zYWZlIGFic29sdXRlIHdvcmtpbmcgZGlyZWN0b3J5IG5hbWUiICIkTElORU5PIiA1OzsKKyAgICBhc19mbl9lcnJvciAkPyAidW5zYWZlIGFic29sdXRlIHdvcmtpbmcgZGlyZWN0b3J5IG5hbWUiICIkTElORU5PIiA1OzsKIGVzYWMKIGNhc2UgJHNyY2RpciBpbgogICAqW1xcXCJcI1wkXCZcJ1xgJGFtX2xmXCBcCV0qKQotICAgIGFzX2ZuX2Vycm9yICJ1bnNhZmUgc3JjZGlyIHZhbHVlOiBcYCRzcmNkaXInIiAiJExJTkVOTyIgNTs7CisgICAgYXNfZm5fZXJyb3IgJD8gInVuc2FmZSBzcmNkaXIgdmFsdWU6ICckc3JjZGlyJyIgIiRMSU5FTk8iIDU7OwogZXNhYwogCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCisjIERvICdzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCiAjIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKICMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKICMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCiAjIGRpcmVjdG9yeSkuCiBpZiAoCi0gICBzZXQgWCBgbHMgLUx0ICIkc3JjZGlyL2NvbmZpZ3VyZSIgY29uZnRlc3QuZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICIkKiIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgIiRzcmNkaXIvY29uZmlndXJlIiBjb25mdGVzdC5maWxlYAotICAgZmkKLSAgIHJtIC1mIGNvbmZ0ZXN0LmZpbGUKLSAgIGlmIHRlc3QgIiQqIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3QuZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KKyAgIGFtX2hhc19zbGVwdD1ubworICAgZm9yIGFtX3RyeSBpbiAxIDI7IGRvCisgICAgIGVjaG8gInRpbWVzdGFtcCwgc2xlcHQ6ICRhbV9oYXNfc2xlcHQiID4gY29uZnRlc3QuZmlsZQorICAgICBzZXQgWCBgbHMgLUx0ICIkc3JjZGlyL2NvbmZpZ3VyZSIgY29uZnRlc3QuZmlsZSAyPiAvZGV2L251bGxgCisgICAgIGlmIHRlc3QgIiQqIiA9ICJYIjsgdGhlbgorCSMgLUwgZGlkbid0IHdvcmsuCisJc2V0IFggYGxzIC10ICIkc3JjZGlyL2NvbmZpZ3VyZSIgY29uZnRlc3QuZmlsZWAKKyAgICAgZmkKKyAgICAgaWYgdGVzdCAiJCoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0LmZpbGUiIFwKKwkmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3QuZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KIAotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgYXNfZm5fZXJyb3IgImxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiICIkTElORU5PIiA1Ci0gICBmaQotCisJIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgorCSMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKKwkjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5CisJIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgorCWFzX2ZuX2Vycm9yICQ/ICJscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCisgIGFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiICIkTElORU5PIiA1CisgICAgIGZpCisgICAgIGlmIHRlc3QgIiQyIiA9IGNvbmZ0ZXN0LmZpbGUgfHwgdGVzdCAkYW1fdHJ5IC1lcSAyOyB0aGVuCisgICAgICAgYnJlYWsKKyAgICAgZmkKKyAgICAgIyBKdXN0IGluIGNhc2UuCisgICAgIHNsZWVwIDEKKyAgICAgYW1faGFzX3NsZXB0PXllcworICAgZG9uZQogICAgdGVzdCAiJDIiID0gY29uZnRlc3QuZmlsZQogICAgKQogdGhlbgogICAgIyBPay4KICAgIDoKIGVsc2UKLSAgIGFzX2ZuX2Vycm9yICJuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKKyAgIGFzX2ZuX2Vycm9yICQ/ICJuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKIENoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiAiJExJTkVOTyIgNQogZmkKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQogJGFzX2VjaG8gInllcyIgPiY2OyB9CisjIElmIHdlIGRpZG4ndCBzbGVlcCwgd2Ugc3RpbGwgbmVlZCB0byBlbnN1cmUgdGltZSBzdGFtcHMgb2YgY29uZmlnLnN0YXR1cyBhbmQKKyMgZ2VuZXJhdGVkIGZpbGVzIGFyZSBzdHJpY3RseSBuZXdlci4KK2FtX3NsZWVwX3BpZD0KK2lmIGdyZXAgJ3NsZXB0OiBubycgY29uZnRlc3QuZmlsZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgKCBzbGVlcCAxICkgJgorICBhbV9zbGVlcF9waWQ9JCEKK2ZpCisKK3JtIC1mIGNvbmZ0ZXN0LmZpbGUKKwogdGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCiAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMmXiYkcHJvZ3JhbV9wcmVmaXgmOyRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgogIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCkBAIC0yODYxLDkgKzI5NzUsNiBAQAogYWNfc2NyaXB0PSdzL1tcXCRdLyYmL2c7cy87cyx4LHgsJC8vJwogcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1gJGFzX2VjaG8gIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiB8IHNlZCAiJGFjX3NjcmlwdCJgCiAKLSMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuIGFic29sdXRlIHBhdGgKLWFtX2F1eF9kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLQogaWYgdGVzdCB4IiR7TUlTU0lORytzZXR9IiAhPSB4c2V0OyB0aGVuCiAgIGNhc2UgJGFtX2F1eF9kaXIgaW4KICAgKlwgKiB8ICpcCSopCkBAIC0yODc3LDggKzI5ODgsOCBAQAogICBhbV9taXNzaW5nX3J1bj0iJE1JU1NJTkcgLS1ydW4gIgogZWxzZQogICBhbV9taXNzaW5nX3J1bj0KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBcYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmciID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogXGBtaXNzaW5nJyBzY3JpcHQgaXMgdG9vIG9sZCBvciBtaXNzaW5nIiA+JjI7fQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICdtaXNzaW5nJyBzY3JpcHQgaXMgdG9vIG9sZCBvciBtaXNzaW5nIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICdtaXNzaW5nJyBzY3JpcHQgaXMgdG9vIG9sZCBvciBtaXNzaW5nIiA+JjI7fQogZmkKIAogaWYgdGVzdCB4IiR7aW5zdGFsbF9zaH0iICE9IHhzZXQ7IHRoZW4KQEAgLTI4OTAsMTcgKzMwMDEsMTcgQEAKICAgZXNhYwogZmkKIAotIyBJbnN0YWxsZWQgYmluYXJpZXMgYXJlIHVzdWFsbHkgc3RyaXBwZWQgdXNpbmcgYHN0cmlwJyB3aGVuIHRoZSB1c2VyCi0jIHJ1biBgbWFrZSBpbnN0YWxsLXN0cmlwJy4gIEhvd2V2ZXIgYHN0cmlwJyBtaWdodCBub3QgYmUgdGhlIHJpZ2h0CisjIEluc3RhbGxlZCBiaW5hcmllcyBhcmUgdXN1YWxseSBzdHJpcHBlZCB1c2luZyAnc3RyaXAnIHdoZW4gdGhlIHVzZXIKKyMgcnVuICJtYWtlIGluc3RhbGwtc3RyaXAiLiAgSG93ZXZlciAnc3RyaXAnIG1pZ2h0IG5vdCBiZSB0aGUgcmlnaHQKICMgdG9vbCB0byB1c2UgaW4gY3Jvc3MtY29tcGlsYXRpb24gZW52aXJvbm1lbnRzLCB0aGVyZWZvcmUgQXV0b21ha2UKLSMgd2lsbCBob25vciB0aGUgYFNUUklQJyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvdmVycnVsZSB0aGlzIHByb2dyYW0uCisjIHdpbGwgaG9ub3IgdGhlICdTVFJJUCcgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gb3ZlcnJ1bGUgdGhpcyBwcm9ncmFtLgogaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0gbm87IHRoZW4KICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgogICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9c3RyaXA7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX1NUUklQK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfcHJvZ19TVFJJUCs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIHRlc3QgLW4gIiRTVFJJUCI7IHRoZW4KQEAgLTI5MTIsNyArMzAyMyw3IEBACiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCiAgICAgYWNfY3ZfcHJvZ19TVFJJUD0iJHthY190b29sX3ByZWZpeH1zdHJpcCIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCkBAIC0yOTQwLDcgKzMwNTEsNyBAQAogc2V0IGR1bW15IHN0cmlwOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9TVFJJUCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfU1RSSVArOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCkBAIC0yOTUyLDcgKzMwNjMsNyBAQAogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgogICAgIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9InN0cmlwIgogICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKQEAgLTI5OTMsNyArMzEwNCw3IEBACiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhIHRocmVhZC1zYWZlIG1rZGlyIC1wIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciBhIHRocmVhZC1zYWZlIG1rZGlyIC1wLi4uICIgPiY2OyB9CiBpZiB0ZXN0IC16ICIkTUtESVJfUCI7IHRoZW4KLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX21rZGlyK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgaWYgJHthY19jdl9wYXRoX21rZGlyKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgpAQCAtMzAwMyw3ICszMTE0LDcgQEAKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgICBmb3IgYWNfcHJvZyBpbiBta2RpciBnbWtkaXI7IGRvCiAJIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotCSAgIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IH0gfHwgY29udGludWUKKwkgICBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiIHx8IGNvbnRpbnVlCiAJICAgY2FzZSBgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiIC0tdmVyc2lvbiAyPiYxYCBpbiAjKAogCSAgICAgJ21rZGlyIChHTlUgY29yZXV0aWxzKSAnKiB8IFwKIAkgICAgICdta2RpciAoY29yZXV0aWxzKSAnKiB8IFwKQEAgLTMwMzIsMTkgKzMxNDMsMTMgQEAKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTUtESVJfUCIgPiY1CiAkYXNfZWNobyAiJE1LRElSX1AiID4mNjsgfQogCi1ta2Rpcl9wPSIkTUtESVJfUCIKLWNhc2UgJG1rZGlyX3AgaW4KLSAgW1xcLyRdKiB8ID86W1xcL10qKSA7OwotICAqLyopIG1rZGlyX3A9IlwkKHRvcF9idWlsZGRpcikvJG1rZGlyX3AiIDs7Ci1lc2FjCi0KIGZvciBhY19wcm9nIGluIGdhd2sgbWF3ayBuYXdrIGF3awogZG8KICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX0FXSytzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3Byb2dfQVdLKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAtbiAiJEFXSyI7IHRoZW4KQEAgLTMwNTYsNyArMzE2MSw3IEBACiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCiAgICAgYWNfY3ZfcHJvZ19BV0s9IiRhY19wcm9nIgogICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKQEAgLTMwODQsNyArMzE4OSw3IEBACiAkYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpLi4uICIgPiY2OyB9CiBzZXQgeCAke01BS0UtbWFrZX0KIGFjX21ha2U9YCRhc19lY2hvICIkMiIgfCBzZWQgJ3MvKy9wL2c7IHMvW15hLXpBLVowLTlfXS9fL2cnYAotaWYgeyBhc192YXI9YWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0OyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuIDoKK2lmIGV2YWwgXCR7YWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0Kzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgY2F0ID5jb25mdGVzdC5tYWtlIDw8XF9BQ0VPRgpAQCAtMzA5Miw3ICszMTk3LDcgQEAKIGFsbDoKIAlAZWNobyAnQEBAJSUlPSQoTUFLRSk9QEBAJSUlJwogX0FDRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KKyMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcgLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KIGNhc2UgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdC5tYWtlIDI+L2Rldi9udWxsYCBpbgogICAqQEBAJSUlPT8qPUBAQCUlJSopCiAgICAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzOzsKQEAgLTMxMjYsNyArMzIzMSw3IEBACiAgIGFtX19pc3JjPScgLUkkKHNyY2RpciknCiAgICMgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAogICBpZiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICAgIGFzX2ZuX2Vycm9yICJzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuIFwibWFrZSBkaXN0Y2xlYW5cIiB0aGVyZSBmaXJzdCIgIiRMSU5FTk8iIDUKKyAgICBhc19mbl9lcnJvciAkPyAic291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biBcIm1ha2UgZGlzdGNsZWFuXCIgdGhlcmUgZmlyc3QiICIkTElORU5PIiA1CiAgIGZpCiBmaQogCkBAIC0zMTQyLDcgKzMyNDcsNyBAQAogCiAjIERlZmluZSB0aGUgaWRlbnRpdHkgb2YgdGhlIHBhY2thZ2UuCiAgUEFDS0FHRT0nbGliZmZpJwotIFZFUlNJT049JzMuMC4xMHJjMCcKKyBWRVJTSU9OPSczLjAuMTMnCiAKIAogY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgpAQCAtMzE3MCwxMyArMzI3NSwxOSBAQAogCiBNQUtFSU5GTz0ke01BS0VJTkZPLSIke2FtX21pc3NpbmdfcnVufW1ha2VpbmZvIn0KIAorIyBGb3IgYmV0dGVyIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICBUbyBiZSByZW1vdmVkIG9uY2UgQXV0b21ha2UgMS45LngKKyMgZGllcyBvdXQgZm9yIGdvb2QuICBGb3IgbW9yZSBiYWNrZ3JvdW5kLCBzZWU6CisjIDxodHRwOi8vbGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvYXV0b21ha2UvMjAxMi0wNy9tc2cwMDAwMS5odG1sPgorIyA8aHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2F1dG9tYWtlLzIwMTItMDcvbXNnMDAwMTQuaHRtbD4KK21rZGlyX3A9JyQoTUtESVJfUCknCisKICMgV2UgbmVlZCBhd2sgZm9yIHRoZSAiY2hlY2siIHRhcmdldC4gIFRoZSBzeXN0ZW0gImF3ayIgaXMgYmFkIG9uCiAjIHNvbWUgcGxhdGZvcm1zLgotIyBBbHdheXMgZGVmaW5lIEFNVEFSIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorIyBBbHdheXMgZGVmaW5lIEFNVEFSIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAgWWVzLCBpdCdzIHN0aWxsIHVzZWQKKyMgaW4gdGhlIHdpbGQgOi0oICBXZSBzaG91bGQgZmluZCBhIHByb3BlciB3YXkgdG8gZGVwcmVjYXRlIGl0IC4uLgorQU1UQVI9JyQke1RBUi10YXJ9JwogCi1BTVRBUj0ke0FNVEFSLSIke2FtX21pc3NpbmdfcnVufXRhciJ9Ci0KLWFtX190YXI9JyR7QU1UQVJ9IGNob2YgLSAiJCR0YXJkaXIiJzsgYW1fX3VudGFyPScke0FNVEFSfSB4ZiAtJworYW1fX3Rhcj0nJCR7VEFSLXRhcn0gY2hvZiAtICIkJHRhcmRpciInIGFtX191bnRhcj0nJCR7VEFSLXRhcn0geGYgLScKIAogCiAKQEAgLTMxODcsOSArMzI5OCwxMiBAQAogIyBXZSBtdXN0IGZvcmNlIENDIHRvIC9ub3QvIGJlIHByZWNpb3VzIHZhcmlhYmxlczsgb3RoZXJ3aXNlCiAjIHRoZSB3cm9uZywgbm9uLW11bHRpbGliLWFkanVzdGVkIHZhbHVlIHdpbGwgYmUgdXNlZCBpbiBtdWx0aWxpYnMuCiAjIEFzIGEgc2lkZSBlZmZlY3QsIHdlIGhhdmUgdG8gc3Vic3QgQ0ZMQUdTIG91cnNlbHZlcy4KKyMgQWxzbyBzYXZlIGFuZCByZXN0b3JlIENGTEFHUywgc2luY2UgQUNfUFJPR19DQyB3aWxsIGNvbWUgdXAgd2l0aAorIyBkZWZhdWx0cyBvZiBpdHMgb3duIGlmIG5vbmUgYXJlIHByb3ZpZGVkLgogCiAKIAorc2F2ZV9DRkxBR1M9JENGTEFHUwogYWNfZXh0PWMKIGFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCiBhY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCkBAIC0zMjAwLDcgKzMzMTQsNyBAQAogc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Z2NjOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3Byb2dfQ0MrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCkBAIC0zMjEyLDcgKzMzMjYsNyBAQAogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgogICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Z2NjIgogICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKQEAgLTMyNDAsNyArMzM1NCw3IEBACiBzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfQ0MrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCkBAIC0zMjUyLDcgKzMzNjYsNyBAQAogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgogICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9ImdjYyIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCkBAIC0zMjkzLDcgKzM0MDcsNyBAQAogc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Y2M7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfcHJvZ19DQys6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KQEAgLTMzMDUsNyArMzQxOSw3IEBACiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCiAgICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1jYyIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCkBAIC0zMzMzLDcgKzM0NDcsNyBAQAogc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3Byb2dfQ0MrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCkBAIC0zMzQ2LDcgKzM0NjAsNyBAQAogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgogICAgIGlmIHRlc3QgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgogICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCiAgICAgICAgY29udGludWUKQEAgLTMzOTIsNyArMzUwNiw3IEBACiBzZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfcHJvZ19DQys6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KQEAgLTM0MDQsNyArMzUxOCw3IEBACiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCiAgICAgYWNfY3ZfcHJvZ19DQz0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCiAgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgpAQCAtMzQzNiw3ICszNTUwLDcgQEAKIHNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9wcm9nX2FjX2N0X0NDKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgpAQCAtMzQ0OCw3ICszNTYyLDcgQEAKICAgSUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KICAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfcHJvZyIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCkBAIC0zNDkwLDggKzM2MDQsOCBAQAogCiB0ZXN0IC16ICIkQ0MiICYmIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQogJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQotYXNfZm5fZXJyb3IgIm5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiAiJExJTkVOTyIgNTsgfQorYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CiAKICMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIHZlcnNpb24iID4mNQpAQCAtMzYwNSw5ICszNzE5LDggQEAKIAogeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci17IGFzX2ZuX3NldF9zdGF0dXMgNzcKLWFzX2ZuX2Vycm9yICJDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiAiJExJTkVOTyIgNTsgfTsgfQorYXNfZm5fZXJyb3IgNzcgIkMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KIGVsc2UKICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiAkYXNfZWNobyAieWVzIiA+JjY7IH0KQEAgLTM2NDksOCArMzc2Miw4IEBACiBlbHNlCiAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQogJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQotYXNfZm5fZXJyb3IgImNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBleGVjdXRhYmxlczogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmsKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiAiJExJTkVOTyIgNTsgfQorYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBleGVjdXRhYmxlczogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmsKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CiBmaQogcm0gLWYgY29uZnRlc3QgY29uZnRlc3QkYWNfY3ZfZXhlZXh0CiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2V4ZWV4dCIgPiY1CkBAIC0zNzA3LDkgKzM4MjAsOSBAQAogICAgIGVsc2UKIAl7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KLWFzX2ZuX2Vycm9yICJjYW5ub3QgcnVuIEMgY29tcGlsZWQgcHJvZ3JhbXMuCithc19mbl9lcnJvciAkPyAiY2Fubm90IHJ1biBDIGNvbXBpbGVkIHByb2dyYW1zLgogSWYgeW91IG1lYW50IHRvIGNyb3NzIGNvbXBpbGUsIHVzZSBcYC0taG9zdCcuCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgIiRMSU5FTk8iIDU7IH0KK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CiAgICAgZmkKICAgZmkKIGZpCkBAIC0zNzIwLDcgKzM4MzMsNyBAQAogYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zfb2JqZXh0K3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3Zfb2JqZXh0Kzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dApAQCAtMzc2MCw4ICszODczLDggQEAKIAogeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci1hc19mbl9lcnJvciAiY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIG9iamVjdCBmaWxlczogY2Fubm90IGNvbXBpbGUKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiAiJExJTkVOTyIgNTsgfQorYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQogZmkKIHJtIC1mIGNvbmZ0ZXN0LiRhY19jdl9vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKQEAgLTM3NzEsNyArMzg4NCw3IEBACiBhY19vYmpleHQ9JE9CSkVYVAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2NfY29tcGlsZXJfZ251K3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfY19jb21waWxlcl9nbnUrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CkBAIC0zODA4LDcgKzM5MjEsNyBAQAogYWNfc2F2ZV9DRkxBR1M9JENGTEFHUwogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWcuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jY19nK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfcHJvZ19jY19nKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgYWNfc2F2ZV9jX3dlcnJvcl9mbGFnPSRhY19jX3dlcnJvcl9mbGFnCkBAIC0zODg2LDcgKzM5OTksNyBAQAogZmkKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IElTTyBDODkiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IElTTyBDODkuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jY19jODkrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9wcm9nX2NjX2M4OSs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGFjX2N2X3Byb2dfY2NfYzg5PW5vCkBAIC0zODk1LDggKzQwMDgsNyBAQAogLyogZW5kIGNvbmZkZWZzLmguICAqLwogI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KK3N0cnVjdCBzdGF0OwogLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZSBzdG9sZW4gZnJvbSBSQ1MgNS43J3Mgc3JjL2NvbmYuc2guICAqLwogc3RydWN0IGJ1ZiB7IGludCB4OyB9OwogRklMRSAqICgqcmNzb3BlbikgKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KTsKQEAgLTM5OTksNyArNDExMSw3IEBACiBfYW1fcmVzdWx0PW5vbmUKICMgRmlyc3QgdHJ5IEdOVSBtYWtlIHN0eWxlIGluY2x1ZGUuCiBlY2hvICJpbmNsdWRlIGNvbmZpbmMiID4gY29uZm1mCi0jIElnbm9yZSBhbGwga2luZHMgb2YgYWRkaXRpb25hbCBvdXRwdXQgZnJvbSBgbWFrZScuCisjIElnbm9yZSBhbGwga2luZHMgb2YgYWRkaXRpb25hbCBvdXRwdXQgZnJvbSAnbWFrZScuCiBjYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAogKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCiAgIGFtX19pbmNsdWRlPWluY2x1ZGUKQEAgLTQwMzIsNiArNDE0NCw3IEBACiBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KICAgYW1fZGVwY29tcD0iJGFjX2F1eF9kaXIvZGVwY29tcCIKICAgQU1ERVBCQUNLU0xBU0g9J1wnCisgIGFtX19ub2RlcD0nX25vJwogZmkKICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KICAgQU1ERVBfVFJVRT0KQEAgLTQwNDcsMTUgKzQxNjAsMTYgQEAKIAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYyIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYy4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZStzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgogICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCiAgICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCiAgICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCi0gICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKLSAgIyBpbiBEJy4KKyAgIyBtYWtpbmcgYSBkdW1teSBmaWxlIG5hbWVkICdEJyAtLSBiZWNhdXNlICctTUQnIG1lYW5zICJwdXQgdGhlIG91dHB1dAorICAjIGluIEQiLgorICBybSAtcmYgY29uZnRlc3QuZGlyCiAgIG1rZGlyIGNvbmZ0ZXN0LmRpcgogICAjIENvcHkgZGVwY29tcCB0byBzdWJkaXIgYmVjYXVzZSBvdGhlcndpc2Ugd2Ugd29uJ3QgZmluZCBpdCBpZiB3ZSdyZQogICAjIHVzaW5nIGEgcmVsYXRpdmUgZGlyZWN0b3J5LgpAQCAtNDA4OSwxNiArNDIwMywxNiBAQAogICAgIDogPiBzdWIvY29uZnRlc3QuYwogICAgIGZvciBpIGluIDEgMiAzIDQgNSA2OyBkbwogICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0c3QnJGknLmgiJyA+PiBzdWIvY29uZnRlc3QuYwotICAgICAgIyBVc2luZyBgOiA+IHN1Yi9jb25mdHN0JGkuaCcgY3JlYXRlcyBvbmx5IHN1Yi9jb25mdHN0MS5oIHdpdGgKLSAgICAgICMgU29sYXJpcyA4J3Mgey91c3IsfS9iaW4vc2guCi0gICAgICB0b3VjaCBzdWIvY29uZnRzdCRpLmgKKyAgICAgICMgVXNpbmcgIjogPiBzdWIvY29uZnRzdCRpLmgiIGNyZWF0ZXMgb25seSBzdWIvY29uZnRzdDEuaCB3aXRoCisgICAgICAjIFNvbGFyaXMgMTAgL2Jpbi9zaC4KKyAgICAgIGVjaG8gJy8qIGR1bW15ICovJyA+IHN1Yi9jb25mdHN0JGkuaAogICAgIGRvbmUKICAgICBlY2hvICIke2FtX19pbmNsdWRlfSAke2FtX19xdW90ZX1zdWIvY29uZnRlc3QuUG8ke2FtX19xdW90ZX0iID4gY29uZm1mCiAKLSAgICAjIFdlIGNoZWNrIHdpdGggYC1jJyBhbmQgYC1vJyBmb3IgdGhlIHNha2Ugb2YgdGhlICJkYXNobXN0ZG91dCIKKyAgICAjIFdlIGNoZWNrIHdpdGggJy1jJyBhbmQgJy1vJyBmb3IgdGhlIHNha2Ugb2YgdGhlICJkYXNobXN0ZG91dCIKICAgICAjIG1vZGUuICBJdCB0dXJucyBvdXQgdGhhdCB0aGUgU3VuUHJvIEMrKyBjb21waWxlciBkb2VzIG5vdCBwcm9wZXJseQotICAgICMgaGFuZGxlIGAtTSAtbycsIGFuZCB3ZSBuZWVkIHRvIGRldGVjdCB0aGlzLiAgQWxzbywgc29tZSBJbnRlbAotICAgICMgdmVyc2lvbnMgaGFkIHRyb3VibGUgd2l0aCBvdXRwdXQgaW4gc3ViZGlycworICAgICMgaGFuZGxlICctTSAtbycsIGFuZCB3ZSBuZWVkIHRvIGRldGVjdCB0aGlzLiAgQWxzbywgc29tZSBJbnRlbAorICAgICMgdmVyc2lvbnMgaGFkIHRyb3VibGUgd2l0aCBvdXRwdXQgaW4gc3ViZGlycy4KICAgICBhbV9fb2JqPXN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfQogICAgIGFtX19taW51c19vYmo9Ii1vICRhbV9fb2JqIgogICAgIGNhc2UgJGRlcG1vZGUgaW4KQEAgLTQxMDcsMTYgKzQyMjEsMTYgQEAKICAgICAgIHRlc3QgIiRhbV9fdW5pdmVyc2FsIiA9IGZhbHNlIHx8IGNvbnRpbnVlCiAgICAgICA7OwogICAgIG5vc2lkZWVmZmVjdCkKLSAgICAgICMgYWZ0ZXIgdGhpcyB0YWcsIG1lY2hhbmlzbXMgYXJlIG5vdCBieSBzaWRlLWVmZmVjdCwgc28gdGhleSdsbAotICAgICAgIyBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZAorICAgICAgIyBBZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCisgICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkLgogICAgICAgaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgPSB4eWVzOyB0aGVuCiAJY29udGludWUKICAgICAgIGVsc2UKIAlicmVhawogICAgICAgZmkKICAgICAgIDs7Ci0gICAgbXN2aXN1YWxjcHAgfCBtc3ZjbXN5cykKLSAgICAgICMgVGhpcyBjb21waWxlciB3b24ndCBncm9rIGAtYyAtbycsIGJ1dCBhbHNvLCB0aGUgbWludXNvIHRlc3QgaGFzCisgICAgbXN2YzcgfCBtc3ZjN21zeXMgfCBtc3Zpc3VhbGNwcCB8IG1zdmNtc3lzKQorICAgICAgIyBUaGlzIGNvbXBpbGVyIHdvbid0IGdyb2sgJy1jIC1vJywgYnV0IGFsc28sIHRoZSBtaW51c28gdGVzdCBoYXMKICAgICAgICMgbm90IHJ1biB5ZXQuICBUaGVzZSBkZXBtb2RlcyBhcmUgbGF0ZSBlbm91Z2ggaW4gdGhlIGdhbWUsIGFuZAogICAgICAgIyBzbyB3ZWFrIHRoYXQgdGhlaXIgZnVuY3Rpb25pbmcgc2hvdWxkIG5vdCBiZSBpbXBhY3RlZC4KICAgICAgIGFtX19vYmo9Y29uZnRlc3QuJHtPQkpFWFQtb30KQEAgLTQxNzAsNiArNDI4NCw3IEBACiBmaQogCiAKK0NGTEFHUz0kc2F2ZV9DRkxBR1MKIAogCiAKQEAgLTQxODYsMTUgKzQzMDEsMTYgQEAKIAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYyIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYy4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthbV9jdl9DQ0FTX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YW1fY3ZfQ0NBU19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIHRlc3QgLXogIiRBTURFUF9UUlVFIiAmJiB0ZXN0IC1mICIkYW1fZGVwY29tcCI7IHRoZW4KICAgIyBXZSBtYWtlIGEgc3ViZGlyIGFuZCBkbyB0aGUgdGVzdHMgdGhlcmUuICBPdGhlcndpc2Ugd2UgY2FuIGVuZCB1cAogICAjIG1ha2luZyBib2d1cyBmaWxlcyB0aGF0IHdlIGRvbid0IGtub3cgYWJvdXQgYW5kIG5ldmVyIHJlbW92ZS4gIEZvcgogICAjIGluc3RhbmNlIGl0IHdhcyByZXBvcnRlZCB0aGF0IG9uIEhQLVVYIHRoZSBnY2MgdGVzdCB3aWxsIGVuZCB1cAotICAjIG1ha2luZyBhIGR1bW15IGZpbGUgbmFtZWQgYEQnIC0tIGJlY2F1c2UgYC1NRCcgbWVhbnMgYHB1dCB0aGUgb3V0cHV0Ci0gICMgaW4gRCcuCisgICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCAnRCcgLS0gYmVjYXVzZSAnLU1EJyBtZWFucyAicHV0IHRoZSBvdXRwdXQKKyAgIyBpbiBEIi4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgogICBta2RpciBjb25mdGVzdC5kaXIKICAgIyBDb3B5IGRlcGNvbXAgdG8gc3ViZGlyIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvbid0IGZpbmQgaXQgaWYgd2UncmUKICAgIyB1c2luZyBhIHJlbGF0aXZlIGRpcmVjdG9yeS4KQEAgLTQyMjYsMTYgKzQzNDIsMTYgQEAKICAgICA6ID4gc3ViL2NvbmZ0ZXN0LmMKICAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNjsgZG8KICAgICAgIGVjaG8gJyNpbmNsdWRlICJjb25mdHN0JyRpJy5oIicgPj4gc3ViL2NvbmZ0ZXN0LmMKLSAgICAgICMgVXNpbmcgYDogPiBzdWIvY29uZnRzdCRpLmgnIGNyZWF0ZXMgb25seSBzdWIvY29uZnRzdDEuaCB3aXRoCi0gICAgICAjIFNvbGFyaXMgOCdzIHsvdXNyLH0vYmluL3NoLgotICAgICAgdG91Y2ggc3ViL2NvbmZ0c3QkaS5oCisgICAgICAjIFVzaW5nICI6ID4gc3ViL2NvbmZ0c3QkaS5oIiBjcmVhdGVzIG9ubHkgc3ViL2NvbmZ0c3QxLmggd2l0aAorICAgICAgIyBTb2xhcmlzIDEwIC9iaW4vc2guCisgICAgICBlY2hvICcvKiBkdW1teSAqLycgPiBzdWIvY29uZnRzdCRpLmgKICAgICBkb25lCiAgICAgZWNobyAiJHthbV9faW5jbHVkZX0gJHthbV9fcXVvdGV9c3ViL2NvbmZ0ZXN0LlBvJHthbV9fcXVvdGV9IiA+IGNvbmZtZgogCi0gICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCisgICAgIyBXZSBjaGVjayB3aXRoICctYycgYW5kICctbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCiAgICAgIyBtb2RlLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlIFN1blBybyBDKysgY29tcGlsZXIgZG9lcyBub3QgcHJvcGVybHkKLSAgICAjIGhhbmRsZSBgLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4gIEFsc28sIHNvbWUgSW50ZWwKLSAgICAjIHZlcnNpb25zIGhhZCB0cm91YmxlIHdpdGggb3V0cHV0IGluIHN1YmRpcnMKKyAgICAjIGhhbmRsZSAnLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4gIEFsc28sIHNvbWUgSW50ZWwKKyAgICAjIHZlcnNpb25zIGhhZCB0cm91YmxlIHdpdGggb3V0cHV0IGluIHN1YmRpcnMuCiAgICAgYW1fX29iaj1zdWIvY29uZnRlc3QuJHtPQkpFWFQtb30KICAgICBhbV9fbWludXNfb2JqPSItbyAkYW1fX29iaiIKICAgICBjYXNlICRkZXBtb2RlIGluCkBAIC00MjQ0LDE2ICs0MzYwLDE2IEBACiAgICAgICB0ZXN0ICIkYW1fX3VuaXZlcnNhbCIgPSBmYWxzZSB8fCBjb250aW51ZQogICAgICAgOzsKICAgICBub3NpZGVlZmZlY3QpCi0gICAgICAjIGFmdGVyIHRoaXMgdGFnLCBtZWNoYW5pc21zIGFyZSBub3QgYnkgc2lkZS1lZmZlY3QsIHNvIHRoZXknbGwKLSAgICAgICMgb25seSBiZSB1c2VkIHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQKKyAgICAgICMgQWZ0ZXIgdGhpcyB0YWcsIG1lY2hhbmlzbXMgYXJlIG5vdCBieSBzaWRlLWVmZmVjdCwgc28gdGhleSdsbAorICAgICAgIyBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZC4KICAgICAgIGlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciID0geHllczsgdGhlbgogCWNvbnRpbnVlCiAgICAgICBlbHNlCiAJYnJlYWsKICAgICAgIGZpCiAgICAgICA7OwotICAgIG1zdmlzdWFsY3BwIHwgbXN2Y21zeXMpCi0gICAgICAjIFRoaXMgY29tcGlsZXIgd29uJ3QgZ3JvayBgLWMgLW8nLCBidXQgYWxzbywgdGhlIG1pbnVzbyB0ZXN0IGhhcworICAgIG1zdmM3IHwgbXN2Yzdtc3lzIHwgbXN2aXN1YWxjcHAgfCBtc3ZjbXN5cykKKyAgICAgICMgVGhpcyBjb21waWxlciB3b24ndCBncm9rICctYyAtbycsIGJ1dCBhbHNvLCB0aGUgbWludXNvIHRlc3QgaGFzCiAgICAgICAjIG5vdCBydW4geWV0LiAgVGhlc2UgZGVwbW9kZXMgYXJlIGxhdGUgZW5vdWdoIGluIHRoZSBnYW1lLCBhbmQKICAgICAgICMgc28gd2VhayB0aGF0IHRoZWlyIGZ1bmN0aW9uaW5nIHNob3VsZCBub3QgYmUgaW1wYWN0ZWQuCiAgICAgICBhbV9fb2JqPWNvbmZ0ZXN0LiR7T0JKRVhULW99CkBAIC00MzE2LDcgKzQ0MzIsNyBAQAogZmkKIHNldCBkdW1teSAkQ0M7IGFjX2NjPWAkYXNfZWNobyAiJDIiIHwKIAkJICAgICAgc2VkICdzL1teYS16QS1aMC05X10vXy9nO3MvXlswLTldL18vJ2AKLWlmIHsgYXNfdmFyPWFjX2N2X3Byb2dfY2NfJHthY19jY31fY19vOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuIDoKK2lmIGV2YWwgXCR7YWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX28rOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CkBAIC00NDQxLDggKzQ1NTcsOCBAQAogCiAKIAotbWFjcm9fdmVyc2lvbj0nMi4yLjYnCi1tYWNyb19yZXZpc2lvbj0nMS4zMDEyJworbWFjcm9fdmVyc2lvbj0nMi40LjInCittYWNyb19yZXZpc2lvbj0nMS4zMzM3JwogCiAKIApAQCAtNDQ1OCw5ICs0NTc0LDc4IEBACiAKIGx0bWFpbj0iJGFjX2F1eF9kaXIvbHRtYWluLnNoIgogCisjIEJhY2tzbGFzaGlmeSBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluCisjIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KK3NlZF9xdW90ZV9zdWJzdD0ncy9cKFsiYCRcXF1cKS9cXFwxL2cnCisKKyMgU2FtZSBhcyBhYm92ZSwgYnV0IGRvIG5vdCBxdW90ZSB2YXJpYWJsZSByZWZlcmVuY2VzLgorZG91YmxlX3F1b3RlX3N1YnN0PSdzL1woWyJgXFxdXCkvXFxcMS9nJworCisjIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2hlbGwgdmFyaWFibGUgaW4gYQorIyBkb3VibGVfcXVvdGVfc3Vic3QnZWQgc3RyaW5nLgorZGVsYXlfdmFyaWFibGVfc3Vic3Q9J3MvXFxcXFxcXFxcXFwkL1xcXFxcXCQvZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNpbmdsZSBxdW90ZS4KK2RlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdD0ncy8nXCcnLydcJ1xcXFxcXFwnXCcnL2cnCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0byBhdm9pZCBhY2NpZGVudGFsIGdsb2JiaW5nIGluIGV2YWxlZCBleHByZXNzaW9ucworbm9fZ2xvYl9zdWJzdD0ncy9cKi9cXFwqL2cnCisKK0VDSE89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCitFQ0hPPSRFQ0hPJEVDSE8kRUNITyRFQ0hPJEVDSE8KK0VDSE89JEVDSE8kRUNITyRFQ0hPJEVDSE8kRUNITyRFQ0hPCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIHByaW50IHN0cmluZ3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIHByaW50IHN0cmluZ3MuLi4gIiA+JjY7IH0KKyMgVGVzdCBwcmludCBmaXJzdCwgYmVjYXVzZSBpdCB3aWxsIGJlIGEgYnVpbHRpbiBpZiBwcmVzZW50LgoraWYgdGVzdCAiWGAoIHByaW50IC1yIC0tIC1uICkgMj4vZGV2L251bGxgIiA9IFgtbiAmJiBcCisgICB0ZXN0ICJYYHByaW50IC1yIC0tICRFQ0hPIDI+L2Rldi9udWxsYCIgPSAiWCRFQ0hPIjsgdGhlbgorICBFQ0hPPSdwcmludCAtciAtLScKK2VsaWYgdGVzdCAiWGBwcmludGYgJXMgJEVDSE8gMj4vZGV2L251bGxgIiA9ICJYJEVDSE8iOyB0aGVuCisgIEVDSE89J3ByaW50ZiAlc1xuJworZWxzZQorICAjIFVzZSB0aGlzIGZ1bmN0aW9uIGFzIGEgZmFsbGJhY2sgdGhhdCBhbHdheXMgd29ya3MuCisgIGZ1bmNfZmFsbGJhY2tfZWNobyAoKQorICB7CisgICAgZXZhbCAnY2F0IDw8X0xURUNIT19FT0YKKyQxCitfTFRFQ0hPX0VPRicKKyAgfQorICBFQ0hPPSdmdW5jX2ZhbGxiYWNrX2VjaG8nCitmaQorCisjIGZ1bmNfZWNob19hbGwgYXJnLi4uCisjIEludm9rZSAkRUNITyB3aXRoIGFsbCBhcmdzLCBzcGFjZS1zZXBhcmF0ZWQuCitmdW5jX2VjaG9fYWxsICgpCit7CisgICAgJEVDSE8gIiIKK30KKworY2FzZSAiJEVDSE8iIGluCisgIHByaW50ZiopIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBwcmludGYiID4mNQorJGFzX2VjaG8gInByaW50ZiIgPiY2OyB9IDs7CisgIHByaW50KikgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHByaW50IC1yIiA+JjUKKyRhc19lY2hvICJwcmludCAtciIgPiY2OyB9IDs7CisgICopIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBjYXQiID4mNQorJGFzX2VjaG8gImNhdCIgPiY2OyB9IDs7Citlc2FjCisKKworCisKKworCisKKworCisKKworCisKKwogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYSBzZWQgdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGEgc2VkIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0Li4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfU0VEK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfcGF0aF9TRUQrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICAgICAgICAgICAgYWNfc2NyaXB0PXMvYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEvYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiLwpAQCAtNDQ4MCw3ICs0NjY1LDcgQEAKICAgICBmb3IgYWNfcHJvZyBpbiBzZWQgZ3NlZDsgZG8KICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KICAgICAgIGFjX3BhdGhfU0VEPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgotICAgICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9TRUQiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX1NFRCI7IH0gfHwgY29udGludWUKKyAgICAgIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFjX3BhdGhfU0VEIiB8fCBjb250aW51ZQogIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfU0VEIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCiAgICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9TRUQKIGNhc2UgYCIkYWNfcGF0aF9TRUQiIC0tdmVyc2lvbiAyPiYxYCBpbgpAQCAtNDUxNSw3ICs0NzAwLDcgQEAKICAgZG9uZQogSUZTPSRhc19zYXZlX0lGUwogICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9TRUQiOyB0aGVuCi0gICAgYXNfZm5fZXJyb3IgIm5vIGFjY2VwdGFibGUgc2VkIGNvdWxkIGJlIGZvdW5kIGluIFwkUEFUSCIgIiRMSU5FTk8iIDUKKyAgICBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBzZWQgY291bGQgYmUgZm91bmQgaW4gXCRQQVRIIiAiJExJTkVOTyIgNQogICBmaQogZWxzZQogICBhY19jdl9wYXRoX1NFRD0kU0VECkBAIC00NTQyLDcgKzQ3MjcsNyBAQAogCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZSIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9HUkVQK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfcGF0aF9HUkVQKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAteiAiJEdSRVAiOyB0aGVuCkBAIC00NTU2LDcgKzQ3NDEsNyBAQAogICAgIGZvciBhY19wcm9nIGluIGdyZXAgZ2dyZXA7IGRvCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCiAgICAgICBhY19wYXRoX0dSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCi0gICAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0dSRVAiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX0dSRVAiOyB9IHx8IGNvbnRpbnVlCisgICAgICBhc19mbl9leGVjdXRhYmxlX3AgIiRhY19wYXRoX0dSRVAiIHx8IGNvbnRpbnVlCiAjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9HUkVQIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCiAgICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9HUkVQCiBjYXNlIGAiJGFjX3BhdGhfR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCkBAIC00NTkxLDcgKzQ3NzYsNyBAQAogICBkb25lCiBJRlM9JGFzX3NhdmVfSUZTCiAgIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX0dSRVAiOyB0aGVuCi0gICAgYXNfZm5fZXJyb3IgIm5vIGFjY2VwdGFibGUgZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1CisgICAgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1CiAgIGZpCiBlbHNlCiAgIGFjX2N2X3BhdGhfR1JFUD0kR1JFUApAQCAtNDYwNSw3ICs0NzkwLDcgQEAKIAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZWdyZXAiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGVncmVwLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfRUdSRVArc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9wYXRoX0VHUkVQKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgZWNobyBhIHwgJEdSRVAgLUUgJyhhfGIpJyA+L2Rldi9udWxsIDI+JjEKQEAgLTQ2MjIsNyArNDgwNyw3IEBACiAgICAgZm9yIGFjX3Byb2cgaW4gZWdyZXA7IGRvCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCiAgICAgICBhY19wYXRoX0VHUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgotICAgICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9FR1JFUCIgJiYgJGFzX3Rlc3RfeCAiJGFjX3BhdGhfRUdSRVAiOyB9IHx8IGNvbnRpbnVlCisgICAgICBhc19mbl9leGVjdXRhYmxlX3AgIiRhY19wYXRoX0VHUkVQIiB8fCBjb250aW51ZQogIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfRUdSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KICAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0VHUkVQCiBjYXNlIGAiJGFjX3BhdGhfRUdSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgpAQCAtNDY1Nyw3ICs0ODQyLDcgQEAKICAgZG9uZQogSUZTPSRhc19zYXZlX0lGUwogICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9FR1JFUCI7IHRoZW4KLSAgICBhc19mbl9lcnJvciAibm8gYWNjZXB0YWJsZSBlZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1CisgICAgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgZWdyZXAgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiAiJExJTkVOTyIgNQogICBmaQogZWxzZQogICBhY19jdl9wYXRoX0VHUkVQPSRFR1JFUApAQCAtNDY3Miw3ICs0ODU3LDcgQEAKIAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZmdyZXAiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGZncmVwLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfRkdSRVArc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9wYXRoX0ZHUkVQKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgZWNobyAnYWIqYycgfCAkR1JFUCAtRiAnYWIqYycgPi9kZXYvbnVsbCAyPiYxCkBAIC00Njg5LDcgKzQ4NzQsNyBAQAogICAgIGZvciBhY19wcm9nIGluIGZncmVwOyBkbwogICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwogICAgICAgYWNfcGF0aF9GR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKLSAgICAgIHsgdGVzdCAtZiAiJGFjX3BhdGhfRkdSRVAiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX0ZHUkVQIjsgfSB8fCBjb250aW51ZQorICAgICAgYXNfZm5fZXhlY3V0YWJsZV9wICIkYWNfcGF0aF9GR1JFUCIgfHwgY29udGludWUKICMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX0ZHUkVQIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCiAgICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9GR1JFUAogY2FzZSBgIiRhY19wYXRoX0ZHUkVQIiAtLXZlcnNpb24gMj4mMWAgaW4KQEAgLTQ3MjQsNyArNDkwOSw3IEBACiAgIGRvbmUKIElGUz0kYXNfc2F2ZV9JRlMKICAgaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfRkdSRVAiOyB0aGVuCi0gICAgYXNfZm5fZXJyb3IgIm5vIGFjY2VwdGFibGUgZmdyZXAgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiAiJExJTkVOTyIgNQorICAgIGFzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIGZncmVwIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgIiRMSU5FTk8iIDUKICAgZmkKIGVsc2UKICAgYWNfY3ZfcGF0aF9GR1JFUD0kRkdSRVAKQEAgLTQ4MDMsNyArNDk4OCw3IEBACiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQuLi4gIiA+JjY7IH0KIGZpCi1pZiB0ZXN0ICIke2x0X2N2X3BhdGhfTEQrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHtsdF9jdl9wYXRoX0xEKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgpAQCAtNDg0MCwxMCArNTAyNSwxMCBAQAogICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQogJGFzX2VjaG8gIm5vIiA+JjY7IH0KIGZpCi10ZXN0IC16ICIkTEQiICYmIGFzX2ZuX2Vycm9yICJubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgIiRMSU5FTk8iIDUKK3Rlc3QgLXogIiRMRCIgJiYgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAiJExJTkVOTyIgNQogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHtsdF9jdl9wcm9nX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2x0X2N2X3Byb2dfZ251X2xkKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGRzIG9ubHkgYWNjZXB0IC12LgpAQCAtNDg3MCw3ICs1MDU1LDcgQEAKIAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQlNELSBvciBNUy1jb21wYXRpYmxlIG5hbWUgbGlzdGVyIChubSkiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEJTRC0gb3IgTVMtY29tcGF0aWJsZSBuYW1lIGxpc3RlciAobm0pLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2x0X2N2X3BhdGhfTk0rc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHtsdF9jdl9wYXRoX05NKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAtbiAiJE5NIjsgdGhlbgpAQCAtNDkyMywxNCArNTEwOCwxNyBAQAogICBOTT0iJGx0X2N2X3BhdGhfTk0iCiBlbHNlCiAgICMgRGlkbid0IGZpbmQgYW55IEJTRCBjb21wYXRpYmxlIG5hbWUgbGlzdGVyLCBsb29rIGZvciBkdW1wYmluLgotICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gIGZvciBhY19wcm9nIGluICJkdW1wYmluIC1zeW1ib2xzIiAibGluayAtZHVtcCAtc3ltYm9scyIKKyAgaWYgdGVzdCAtbiAiJERVTVBCSU4iOyB0aGVuIDoKKyAgICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKyAgZWxzZQorICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgZm9yIGFjX3Byb2cgaW4gZHVtcGJpbiAibGluayAtZHVtcCIKICAgZG8KICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfRFVNUEJJTitzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3Byb2dfRFVNUEJJTis6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIHRlc3QgLW4gIiREVU1QQklOIjsgdGhlbgpAQCAtNDk0Miw3ICs1MTMwLDcgQEAKICAgSUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KICAgICBhY19jdl9wcm9nX0RVTVBCSU49IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgogICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKQEAgLTQ5NjgsMTMgKzUxNTYsMTMgQEAKIGZpCiBpZiB0ZXN0IC16ICIkRFVNUEJJTiI7IHRoZW4KICAgYWNfY3RfRFVNUEJJTj0kRFVNUEJJTgotICBmb3IgYWNfcHJvZyBpbiAiZHVtcGJpbiAtc3ltYm9scyIgImxpbmsgLWR1bXAgLXN5bWJvbHMiCisgIGZvciBhY19wcm9nIGluIGR1bXBiaW4gImxpbmsgLWR1bXAiCiBkbwogICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfRFVNUEJJTitzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfRFVNUEJJTis6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIHRlc3QgLW4gIiRhY19jdF9EVU1QQklOIjsgdGhlbgpAQCAtNDk4Niw3ICs1MTc0LDcgQEAKICAgSUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KICAgICBhY19jdl9wcm9nX2FjX2N0X0RVTVBCSU49IiRhY19wcm9nIgogICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKQEAgLTUwMjMsNiArNTIxMSwxNSBAQAogICBmaQogZmkKIAorICAgIGNhc2UgYCREVU1QQklOIC1zeW1ib2xzIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSdgIGluCisgICAgKkNPRkYqKQorICAgICAgRFVNUEJJTj0iJERVTVBCSU4gLXN5bWJvbHMiCisgICAgICA7OworICAgICopCisgICAgICBEVU1QQklOPToKKyAgICAgIDs7CisgICAgZXNhYworICBmaQogCiAgIGlmIHRlc3QgIiREVU1QQklOIiAhPSAiOiI7IHRoZW4KICAgICBOTT0iJERVTVBCSU4iCkBAIC01MDM3LDE4ICs1MjM0LDE4IEBACiAKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgdGhlIG5hbWUgbGlzdGVyICgkTk0pIGludGVyZmFjZSIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyB0aGUgbmFtZSBsaXN0ZXIgKCROTSkgaW50ZXJmYWNlLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2x0X2N2X25tX2ludGVyZmFjZStzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2x0X2N2X25tX2ludGVyZmFjZSs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGx0X2N2X25tX2ludGVyZmFjZT0iQlNEIG5tIgogICBlY2hvICJpbnQgc29tZV92YXJpYWJsZSA9IDA7IiA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgKGV2YWwgZWNobyAiXCJcJGFzX21lOjUwNDU6ICRhY19jb21waWxlXCIiID4mNSkKKyAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86ICRhY19jb21waWxlXCIiID4mNSkKICAgKGV2YWwgIiRhY19jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgKGV2YWwgZWNobyAiXCJcJGFzX21lOjUwNDg6ICROTSBcXFwiY29uZnRlc3QuJGFjX29iamV4dFxcXCJcIiIgPiY1KQorICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogJE5NIFxcXCJjb25mdGVzdC4kYWNfb2JqZXh0XFxcIlwiIiA+JjUpCiAgIChldmFsICIkTk0gXCJjb25mdGVzdC4kYWNfb2JqZXh0XCIiIDI+Y29uZnRlc3QuZXJyID4gY29uZnRlc3Qub3V0KQogICBjYXQgY29uZnRlc3QuZXJyID4mNQotICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6NTA1MTogb3V0cHV0XCIiID4mNSkKKyAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86IG91dHB1dFwiIiA+JjUpCiAgIGNhdCBjb25mdGVzdC5vdXQgPiY1CiAgIGlmICRHUkVQICdFeHRlcm5hbC4qc29tZV92YXJpYWJsZScgY29uZnRlc3Qub3V0ID4gL2Rldi9udWxsOyB0aGVuCiAgICAgbHRfY3Zfbm1faW50ZXJmYWNlPSJNUyBkdW1wYmluIgpAQCAtNTA3Miw3ICs1MjY5LDcgQEAKICMgZmluZCB0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cwogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyB0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHtsdF9jdl9zeXNfbWF4X2NtZF9sZW4rc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHtsdF9jdl9zeXNfbWF4X2NtZF9sZW4rOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICAgIGk9MApAQCAtNTEwNSw2ICs1MzAyLDExIEBACiAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTI7CiAgICAgOzsKIAorICBtaW50KikKKyAgICAjIE9uIE1pTlQgdGhpcyBjYW4gdGFrZSBhIGxvbmcgdGltZSBhbmQgcnVuIG91dCBvZiBtZW1vcnkuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTI7CisgICAgOzsKKwogICBhbWlnYW9zKikKICAgICAjIE9uIEFtaWdhT1Mgd2l0aCBwZGtzaCwgdGhpcyB0ZXN0IHRha2VzIGhvdXJzLCBsaXRlcmFsbHkuCiAgICAgIyBTbyB3ZSBqdXN0IHB1bnQgYW5kIHVzZSBhIG1pbmltdW0gbGluZSBsZW5ndGggb2YgODE5Mi4KQEAgLTUxMzAsNiArNTMzMiwxMSBAQAogICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xOTY2MDgKICAgICA7OwogCisgIG9zMiopCisgICAgIyBUaGUgdGVzdCB0YWtlcyBhIGxvbmcgdGltZSBvbiBPUy8yLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyCisgICAgOzsKKwogICBvc2YqKQogICAgICMgRHIuIEhhbnMgRWtrZWhhcmQgUGxlc3NlciByZXBvcnRzIHNlZWluZyBhIGtlcm5lbCBwYW5pYyBydW5uaW5nIGNvbmZpZ3VyZQogICAgICMgZHVlIHRvIHRoaXMgdGVzdCB3aGVuIGV4ZWNfZGlzYWJsZV9hcmdfbGltaXQgaXMgMSBvbiBUcnU2NC4gSXQgaXMgbm90CkBAIC01MTU2LDcgKzUzNjMsOCBAQAogICAgIDs7CiAgICopCiAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAoZ2V0Y29uZiBBUkdfTUFYKSAyPiAvZGV2L251bGxgCi0gICAgaWYgdGVzdCAtbiAiJGx0X2N2X3N5c19tYXhfY21kX2xlbiI7IHRoZW4KKyAgICBpZiB0ZXN0IC1uICIkbHRfY3Zfc3lzX21heF9jbWRfbGVuIiAmJiBcCisgICAgICB0ZXN0IHVuZGVmaW5lZCAhPSAiJGx0X2N2X3N5c19tYXhfY21kX2xlbiI7IHRoZW4KICAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDRgCiAgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcKiAzYAogICAgIGVsc2UKQEAgLTUxNjksOCArNTM3Nyw4IEBACiAgICAgICAjIElmIHRlc3QgaXMgbm90IGEgc2hlbGwgYnVpbHQtaW4sIHdlJ2xsIHByb2JhYmx5IGVuZCB1cCBjb21wdXRpbmcgYQogICAgICAgIyBtYXhpbXVtIGxlbmd0aCB0aGF0IGlzIG9ubHkgaGFsZiBvZiB0aGUgYWN0dWFsIG1heGltdW0gbGVuZ3RoLCBidXQKICAgICAgICMgd2UgY2FuJ3QgdGVsbC4KLSAgICAgIHdoaWxlIHsgdGVzdCAiWCJgJFNIRUxMICQwIC0tZmFsbGJhY2stZWNobyAiWCR0ZXN0c3RyaW5nJHRlc3RzdHJpbmciIDI+L2Rldi9udWxsYCBcCi0JICAgICAgICAgPSAiWFgkdGVzdHN0cmluZyR0ZXN0c3RyaW5nIjsgfSA+L2Rldi9udWxsIDI+JjEgJiYKKyAgICAgIHdoaWxlIHsgdGVzdCAiWCJgZW52IGVjaG8gIiR0ZXN0c3RyaW5nJHRlc3RzdHJpbmciIDI+L2Rldi9udWxsYCBcCisJICAgICAgICAgPSAiWCR0ZXN0c3RyaW5nJHRlc3RzdHJpbmciOyB9ID4vZGV2L251bGwgMj4mMSAmJgogCSAgICAgIHRlc3QgJGkgIT0gMTcgIyAxLzIgTUIgc2hvdWxkIGJlIGVub3VnaAogICAgICAgZG8KICAgICAgICAgaT1gZXhwciAkaSArIDFgCkBAIC01MjEyLDggKzU0MjAsOCBAQAogIyBUcnkgc29tZSBYU0kgZmVhdHVyZXMKIHhzaV9zaGVsbD1ubwogKCBfbHRfZHVtbXk9ImEvYi9jIgotICB0ZXN0ICIke19sdF9kdW1teSMjKi99LCR7X2x0X2R1bW15JS8qfSwiJHtfbHRfZHVtbXklIiRfbHRfZHVtbXkifSwgXAotICAgICAgPSBjLGEvYiwsIFwKKyAgdGVzdCAiJHtfbHRfZHVtbXkjIyovfSwke19sdF9kdW1teSUvKn0sJHtfbHRfZHVtbXkjPz99IiR7X2x0X2R1bW15JSIkX2x0X2R1bW15In0sIFwKKyAgICAgID0gYyxhL2IsYi9jLCBcCiAgICAgJiYgZXZhbCAndGVzdCAkKCggMSArIDEgKSkgLWVxIDIgXAogICAgICYmIHRlc3QgIiR7I19sdF9kdW1teX0iIC1lcSA1JyApID4vZGV2L251bGwgMj4mMSBcCiAgICYmIHhzaV9zaGVsbD15ZXMKQEAgLTUyNjIsOSArNTQ3MCw4MyBAQAogCiAKIAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gY29udmVydCAkYnVpbGQgZmlsZSBuYW1lcyB0byAkaG9zdCBmb3JtYXQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIGNvbnZlcnQgJGJ1aWxkIGZpbGUgbmFtZXMgdG8gJGhvc3QgZm9ybWF0Li4uICIgPiY2OyB9CitpZiAke2x0X2N2X3RvX2hvc3RfZmlsZV9jbWQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRob3N0IGluCisgICotKi1taW5ndyogKQorICAgIGNhc2UgJGJ1aWxkIGluCisgICAgICAqLSotbWluZ3cqICkgIyBhY3R1YWxseSBtc3lzCisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKyAgICAgICAgOzsKKyAgICAgICotKi1jeWd3aW4qICkKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9jeWd3aW5fdG9fdzMyCisgICAgICAgIDs7CisgICAgICAqICkgIyBvdGhlcndpc2UsIGFzc3VtZSAqbml4CisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbml4X3RvX3czMgorICAgICAgICA7OworICAgIGVzYWMKKyAgICA7OworICAqLSotY3lnd2luKiApCisgICAgY2FzZSAkYnVpbGQgaW4KKyAgICAgICotKi1taW5ndyogKSAjIGFjdHVhbGx5IG1zeXMKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX2N5Z3dpbgorICAgICAgICA7OworICAgICAgKi0qLWN5Z3dpbiogKQorICAgICAgICBsdF9jdl90b19ob3N0X2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX25vb3AKKyAgICAgICAgOzsKKyAgICAgICogKSAjIG90aGVyd2lzZSwgYXNzdW1lICpuaXgKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9uaXhfdG9fY3lnd2luCisgICAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisgICogKSAjIHVuaGFuZGxlZCBob3N0cyAoYW5kICJub3JtYWwiIG5hdGl2ZSBidWlsZHMpCisgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9ub29wCisgICAgOzsKK2VzYWMKKworZmkKKwordG9faG9zdF9maWxlX2NtZD0kbHRfY3ZfdG9faG9zdF9maWxlX2NtZAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl90b19ob3N0X2ZpbGVfY21kIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfdG9faG9zdF9maWxlX2NtZCIgPiY2OyB9CisKKworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gY29udmVydCAkYnVpbGQgZmlsZSBuYW1lcyB0byB0b29sY2hhaW4gZm9ybWF0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBjb252ZXJ0ICRidWlsZCBmaWxlIG5hbWVzIHRvIHRvb2xjaGFpbiBmb3JtYXQuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfdG9fdG9vbF9maWxlX2NtZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICNhc3N1bWUgb3JkaW5hcnkgY3Jvc3MgdG9vbHMsIG9yIG5hdGl2ZSBidWlsZC4KK2x0X2N2X3RvX3Rvb2xfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbm9vcAorY2FzZSAkaG9zdCBpbgorICAqLSotbWluZ3cqICkKKyAgICBjYXNlICRidWlsZCBpbgorICAgICAgKi0qLW1pbmd3KiApICMgYWN0dWFsbHkgbXN5cworICAgICAgICBsdF9jdl90b190b29sX2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisgICAgICAgIDs7CisgICAgZXNhYworICAgIDs7Citlc2FjCisKK2ZpCisKK3RvX3Rvb2xfZmlsZV9jbWQ9JGx0X2N2X3RvX3Rvb2xfZmlsZV9jbWQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfdG9fdG9vbF9maWxlX2NtZCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3RvX3Rvb2xfZmlsZV9jbWQiID4mNjsgfQorCisKKworCisKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlcyIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJExEIG9wdGlvbiB0byByZWxvYWQgb2JqZWN0IGZpbGVzLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2x0X2N2X2xkX3JlbG9hZF9mbGFnK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7bHRfY3ZfbGRfcmVsb2FkX2ZsYWcrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBsdF9jdl9sZF9yZWxvYWRfZmxhZz0nLXInCkBAIC01Mjc4LDYgKzU1NjAsMTEgQEAKIGVzYWMKIHJlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKIGNhc2UgJGhvc3Rfb3MgaW4KKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgorICAgICAgcmVsb2FkX2NtZHM9ZmFsc2UKKyAgICBmaQorICAgIDs7CiAgIGRhcndpbiopCiAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KICAgICAgIHJlbG9hZF9jbWRzPSckTFRDQyAkTFRDRkxBR1MgLW5vc3RkbGliICR7d2x9LXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKQEAgLTUzMDAsNyArNTU4Nyw3IEBACiBzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1vYmpkdW1wOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19PQkpEVU1QK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfcHJvZ19PQkpEVU1QKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAtbiAiJE9CSkRVTVAiOyB0aGVuCkBAIC01MzEyLDcgKzU1OTksNyBAQAogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgogICAgIGFjX2N2X3Byb2dfT0JKRFVNUD0iJHthY190b29sX3ByZWZpeH1vYmpkdW1wIgogICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKQEAgLTUzNDAsNyArNTYyNyw3IEBACiBzZXQgZHVtbXkgb2JqZHVtcDsgYWNfd29yZD0kMgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfT0JKRFVNUCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfT0JKRFVNUCs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIHRlc3QgLW4gIiRhY19jdF9PQkpEVU1QIjsgdGhlbgpAQCAtNTM1Miw3ICs1NjM5LDcgQEAKICAgSUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KICAgICBhY19jdl9wcm9nX2FjX2N0X09CSkRVTVA9Im9iamR1bXAiCiAgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgpAQCAtNTM5OSw3ICs1Njg2LDcgQEAKIAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gcmVjb2duaXplIGRlcGVuZGVudCBsaWJyYXJpZXMiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIHJlY29nbml6ZSBkZXBlbmRlbnQgbGlicmFyaWVzLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2x0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7bHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE1BR0lDX0NNRCcKQEAgLTU0NDEsMTYgKzU3MjgsMTggQEAKICAgIyBCYXNlIE1TWVMvTWluR1cgZG8gbm90IHByb3ZpZGUgdGhlICdmaWxlJyBjb21tYW5kIG5lZWRlZCBieQogICAjIGZ1bmNfd2luMzJfbGliaWQgc2hlbGwgZnVuY3Rpb24sIHNvIHVzZSBhIHdlYWtlciB0ZXN0IGJhc2VkIG9uICdvYmpkdW1wJywKICAgIyB1bmxlc3Mgd2UgZmluZCAnZmlsZScsIGZvciBleGFtcGxlIGJlY2F1c2Ugd2UgYXJlIGNyb3NzLWNvbXBpbGluZy4KLSAgaWYgKCBmaWxlIC8gKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgIyBmdW5jX3dpbjMyX2xpYmlkIGFzc3VtZXMgQlNEIG5tLCBzbyBkaXNhbGxvdyBpdCBpZiB1c2luZyBNUyBkdW1wYmluLgorICBpZiAoIHRlc3QgIiRsdF9jdl9ubV9pbnRlcmZhY2UiID0gIkJTRCBubSIgJiYgZmlsZSAvICkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgXng4NiBhcmNoaXZlIGltcG9ydHxeeDg2IERMTCcKICAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nZnVuY193aW4zMl9saWJpZCcKICAgZWxzZQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IHBlaSotaTM4NiguKmFyY2hpdGVjdHVyZTogaTM4Nik/JworICAgICMgS2VlcCB0aGlzIHBhdHRlcm4gaW4gc3luYyB3aXRoIHRoZSBvbmUgaW4gZnVuY193aW4zMl9saWJpZC4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBmaWxlIGZvcm1hdCAocGVpKi1pMzg2KC4qYXJjaGl0ZWN0dXJlOiBpMzg2KT98cGUtYXJtLXdpbmNlfHBlLXg4Ni02NCknCiAgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRPQkpEVU1QIC1mJwogICBmaQogICA7OwogCi1jZWdjYykKK2NlZ2NjKikKICAgIyB1c2UgdGhlIHdlYWtlciB0ZXN0IGJhc2VkIG9uICdvYmpkdW1wJy4gU2VlIG1pbmd3Ki4KICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgZmlsZSBmb3JtYXQgcGUtYXJtLS4qbGl0dGxlKC4qYXJjaGl0ZWN0dXJlOiBhcm0pPycKICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRPQkpEVU1QIC1mJwpAQCAtNTQ4MCw2ICs1NzY5LDEwIEBACiAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCiAgIDs7CiAKK2hhaWt1KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKwogaHB1eDEwLjIwKiB8IGhwdXgxMSopCiAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKICAgY2FzZSAkaG9zdF9jcHUgaW4KQEAgLTU0ODgsMTEgKzU3ODEsMTEgQEAKICAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9ocHV4MzIvbGliYy5zbwogICAgIDs7CiAgIGhwcGEqNjQqKQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzWzAtOV1bMC05XVswLTldfEVMRi1bMC05XVswLTldKSBzaGFyZWQgb2JqZWN0IGZpbGUgLSBQQS1SSVNDIFswLTldLlswLTldJworICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzWzAtOV1bMC05XVswLTldfEVMRlsgLV1bMC05XVswLTldKSgtYml0KT8oIFtMTV1TQik/IHNoYXJlZCBvYmplY3QoIGZpbGUpP1ssIC1dKiBQQS1SSVNDIFswLTldXC5bMC05XScKICAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9wYTIwXzY0L2xpYmMuc2wKICAgICA7OwogICAqKQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzWzAtOV1bMC05XVswLTldfFBBLVJJU0NbMC05XS5bMC05XSkgc2hhcmVkIGxpYnJhcnknCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbMC05XVswLTldWzAtOV18UEEtUklTQ1swLTldXC5bMC05XSkgc2hhcmVkIGxpYnJhcnknCiAgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvbGliYy5zbAogICAgIDs7CiAgIGVzYWMKQEAgLTU1MTMsOCArNTgwNiw4IEBACiAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCiAgIDs7CiAKLSMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KLWxpbnV4KiB8IGsqYnNkKi1nbnUpCisjIFRoaXMgbXVzdCBiZSBnbGliYy9FTEYuCitsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCiAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCiAgIDs7CiAKQEAgLTU1OTUsNiArNTg4OCwyMSBAQAogZmkKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QiID4mNQogJGFzX2VjaG8gIiRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCIgPiY2OyB9CisKK2ZpbGVfbWFnaWNfZ2xvYj0KK3dhbnRfbm9jYXNlZ2xvYj1ubworaWYgdGVzdCAiJGJ1aWxkIiA9ICIkaG9zdCI7IHRoZW4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBtaW5ndyogfCBwdzMyKikKKyAgICBpZiAoIHNob3B0IHwgZ3JlcCBub2Nhc2VnbG9iICkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICB3YW50X25vY2FzZWdsb2I9eWVzCisgICAgZWxzZQorICAgICAgZmlsZV9tYWdpY19nbG9iPWBlY2hvIGFBYkJjQ2REZUVmRmdHaEhpSWpKa0tsTG1Nbk5vT3BQcVFyUnNTdFR1VXZWd1d4WHlZelogfCAkU0VEIC1lICJzL1woLi5cKS9zXC9bXDFdXC9bXDFdXC9nOy9nImAKKyAgICBmaQorICAgIDs7CisgIGVzYWMKK2ZpCisKIGZpbGVfbWFnaWNfY21kPSRsdF9jdl9maWxlX21hZ2ljX2NtZAogZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kCiB0ZXN0IC16ICIkZGVwbGlic19jaGVja19tZXRob2QiICYmIGRlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KQEAgLTU2MTAsMTIgKzU5MTgsMTY2IEBACiAKIAogCisKKworCisKKworCisKKworCisKIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFyOyBhY193b3JkPSQyCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1kbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2w7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX0FSK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfcHJvZ19ETExUT09MKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCisgIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19ETExUT09MPSIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorRExMVE9PTD0kYWNfY3ZfcHJvZ19ETExUT09MCitpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRETExUT09MIiA+JjUKKyRhc19lY2hvICIkRExMVE9PTCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfRExMVE9PTCI7IHRoZW4KKyAgYWNfY3RfRExMVE9PTD0kRExMVE9PTAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGRsbHRvb2w7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X0RMTFRPT0wrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfRExMVE9PTCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9ETExUT09MPSIkYWNfY3RfRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0RMTFRPT0w9ImRsbHRvb2wiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfRExMVE9PTD0kYWNfY3ZfcHJvZ19hY19jdF9ETExUT09MCitpZiB0ZXN0IC1uICIkYWNfY3RfRExMVE9PTCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9ETExUT09MIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfRExMVE9PTCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0RMTFRPT0wiID0geDsgdGhlbgorICAgIERMTFRPT0w9ImZhbHNlIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIERMTFRPT0w9JGFjX2N0X0RMTFRPT0wKKyAgZmkKK2Vsc2UKKyAgRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKK2ZpCisKK3Rlc3QgLXogIiRETExUT09MIiAmJiBETExUT09MPWRsbHRvb2wKKworCisKKworCisKKworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gYXNzb2NpYXRlIHJ1bnRpbWUgYW5kIGxpbmsgbGlicmFyaWVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBhc3NvY2lhdGUgcnVudGltZSBhbmQgbGluayBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD0ndW5rbm93bicKKworY2FzZSAkaG9zdF9vcyBpbgorY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAjIHR3byBkaWZmZXJlbnQgc2hlbGwgZnVuY3Rpb25zIGRlZmluZWQgaW4gbHRtYWluLnNoCisgICMgZGVjaWRlIHdoaWNoIHRvIHVzZSBiYXNlZCBvbiBjYXBhYmlsaXRpZXMgb2YgJERMTFRPT0wKKyAgY2FzZSBgJERMTFRPT0wgLS1oZWxwIDI+JjFgIGluCisgICotLWlkZW50aWZ5LXN0cmljdCopCisgICAgbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9ZnVuY19jeWdtaW5nX2RsbF9mb3JfaW1wbGliCisgICAgOzsKKyAgKikKKyAgICBsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD1mdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWJfZmFsbGJhY2sKKyAgICA7OworICBlc2FjCisgIDs7CisqKQorICAjIGZhbGxiYWNrOiBhc3N1bWUgbGlua2xpYiBJUyBzaGFyZWRsaWIKKyAgbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9IiRFQ0hPIgorICA7OworZXNhYworCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kIiA+JjY7IH0KK3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPSRsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZAordGVzdCAteiAiJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kIiAmJiBzaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD0kRUNITworCisKKworCisKKworCisKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgZm9yIGFjX3Byb2cgaW4gYXIKKyAgZG8KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQVIrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiB0ZXN0IC1uICIkQVIiOyB0aGVuCkBAIC01NjI3LDggKzYwODksOCBAQAogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX0FSPSIke2FjX3Rvb2xfcHJlZml4fWFyIgorICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19BUj0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCiAgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgogICBmaQpAQCAtNTY0OCwxNCArNjExMCwxOCBAQAogZmkKIAogCisgICAgdGVzdCAtbiAiJEFSIiAmJiBicmVhaworICBkb25lCiBmaQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVIiOyB0aGVuCitpZiB0ZXN0IC16ICIkQVIiOyB0aGVuCiAgIGFjX2N0X0FSPSRBUgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBhcjsgYWNfd29yZD0kMgorICBmb3IgYWNfcHJvZyBpbiBhcgorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0FSK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9BUis6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIHRlc3QgLW4gIiRhY19jdF9BUiI7IHRoZW4KQEAgLTU2NjcsOCArNjEzMyw4IEBACiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfQVI9ImFyIgorICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9BUj0iJGFjX3Byb2ciCiAgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgogICBmaQpAQCAtNTY4Nyw2ICs2MTUzLDEwIEBACiAkYXNfZWNobyAibm8iID4mNjsgfQogZmkKIAorCisgIHRlc3QgLW4gIiRhY19jdF9BUiIgJiYgYnJlYWsKK2RvbmUKKwogICBpZiB0ZXN0ICJ4JGFjX2N0X0FSIiA9IHg7IHRoZW4KICAgICBBUj0iZmFsc2UiCiAgIGVsc2UKQEAgLTU2OTgsMTIgKzYxNjgsMTAgQEAKIGVzYWMKICAgICBBUj0kYWNfY3RfQVIKICAgZmkKLWVsc2UKLSAgQVI9IiRhY19jdl9wcm9nX0FSIgogZmkKIAotdGVzdCAteiAiJEFSIiAmJiBBUj1hcgotdGVzdCAteiAiJEFSX0ZMQUdTIiAmJiBBUl9GTEFHUz1jcnUKKzogJHtBUj1hcn0KKzogJHtBUl9GTEFHUz1jcnV9CiAKIAogCkBAIC01NzE1LDEyICs2MTgzLDcwIEBACiAKIAogCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhcmNoaXZlciBARklMRSBzdXBwb3J0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBhcmNoaXZlciBARklMRSBzdXBwb3J0Li4uICIgPiY2OyB9CitpZiAke2x0X2N2X2FyX2F0X2ZpbGUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9hcl9hdF9maWxlPW5vCisgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZWNobyBjb25mdGVzdC4kYWNfb2JqZXh0ID4gY29uZnRlc3QubHN0CisgICAgICBsdF9hcl90cnk9JyRBUiAkQVJfRkxBR1MgbGliY29uZnRlc3QuYSBAY29uZnRlc3QubHN0ID4mNScKKyAgICAgIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRsdF9hcl90cnlcIiI7IH0gPiY1CisgIChldmFsICRsdF9hcl90cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgICAgICBpZiB0ZXN0ICIkYWNfc3RhdHVzIiAtZXEgMDsgdGhlbgorCSMgRW5zdXJlIHRoZSBhcmNoaXZlciBmYWlscyB1cG9uIGJvZ3VzIGZpbGUgbmFtZXMuCisJcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBsaWJjb25mdGVzdC5hCisJeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGx0X2FyX3RyeVwiIjsgfSA+JjUKKyAgKGV2YWwgJGx0X2FyX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KKwlpZiB0ZXN0ICIkYWNfc3RhdHVzIiAtbmUgMDsgdGhlbgorICAgICAgICAgIGx0X2N2X2FyX2F0X2ZpbGU9QAorICAgICAgICBmaQorICAgICAgZmkKKyAgICAgIHJtIC1mIGNvbmZ0ZXN0LiogbGliY29uZnRlc3QuYQorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2FyX2F0X2ZpbGUiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9hcl9hdF9maWxlIiA+JjY7IH0KKworaWYgdGVzdCAieCRsdF9jdl9hcl9hdF9maWxlIiA9IHhubzsgdGhlbgorICBhcmNoaXZlcl9saXN0X3NwZWM9CitlbHNlCisgIGFyY2hpdmVyX2xpc3Rfc3BlYz0kbHRfY3ZfYXJfYXRfZmlsZQorZmkKKworCisKKworCisKKwogaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgogICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9c3RyaXA7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX1NUUklQK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfcHJvZ19TVFJJUCs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIHRlc3QgLW4gIiRTVFJJUCI7IHRoZW4KQEAgLTU3MzIsNyArNjI1OCw3IEBACiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCiAgICAgYWNfY3ZfcHJvZ19TVFJJUD0iJHthY190b29sX3ByZWZpeH1zdHJpcCIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCkBAIC01NzYwLDcgKzYyODYsNyBAQAogc2V0IGR1bW15IHN0cmlwOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9TVFJJUCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfU1RSSVArOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCkBAIC01NzcyLDcgKzYyOTgsNyBAQAogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgogICAgIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9InN0cmlwIgogICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKQEAgLTU4MTksNyArNjM0NSw3IEBACiBzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1yYW5saWI7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX1JBTkxJQitzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3Byb2dfUkFOTElCKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KQEAgLTU4MzEsNyArNjM1Nyw3IEBACiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCiAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIgogICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKQEAgLTU4NTksNyArNjM4NSw3IEBACiBzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9wcm9nX2FjX2N0X1JBTkxJQis6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIHRlc3QgLW4gIiRhY19jdF9SQU5MSUIiOyB0aGVuCkBAIC01ODcxLDcgKzYzOTcsNyBAQAogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgogICAgIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSJyYW5saWIiCiAgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgpAQCAtNTkyMSwxNSArNjQ0NywyNyBAQAogaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KICAgY2FzZSAkaG9zdF9vcyBpbgogICBvcGVuYnNkKikKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzflwkUkFOTElCIC10IFwkb2xkbGliIgorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSIkb2xkX3Bvc3RpbnN0YWxsX2NtZHN+XCRSQU5MSUIgLXQgXCR0b29sX29sZGxpYiIKICAgICA7OwogICAqKQotICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSIkb2xkX3Bvc3RpbnN0YWxsX2NtZHN+XCRSQU5MSUIgXCRvbGRsaWIiCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kc35cJFJBTkxJQiBcJHRvb2xfb2xkbGliIgogICAgIDs7CiAgIGVzYWMKLSAgb2xkX2FyY2hpdmVfY21kcz0iJG9sZF9hcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRvbGRsaWIiCisgIG9sZF9hcmNoaXZlX2NtZHM9IiRvbGRfYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkdG9vbF9vbGRsaWIiCiBmaQogCitjYXNlICRob3N0X29zIGluCisgIGRhcndpbiopCisgICAgbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uPXllcyA7OworICAqKQorICAgIGxvY2tfb2xkX2FyY2hpdmVfZXh0cmFjdGlvbj1ubyA7OworZXNhYworCisKKworCisKKwogCiAKIApAQCAtNTk3Niw3ICs2NTE0LDcgQEAKICMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCBmcm9tICRjb21waWxlciBvYmplY3QiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IGZyb20gJGNvbXBpbGVyIG9iamVjdC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7bHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAKQEAgLTYwMzcsOCArNjU3NSw4IEBACiBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGludCBcMSgpOy9wJyAtZSAncy9eJHN5bWNvZGUqIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgogCiAjIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBzeW1ib2wgbmFtZSBhbmQgc3ltYm9sIGFkZHJlc3MKLWx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbXiBdKlwpICQvICB7XFxcIlwxXFxcIiwgKHZvaWQgKikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbXiBdKlwpIFwoW14gXSpcKSQvICB7XCJcMlwiLCAodm9pZCAqKSBcJlwyfSwvcCciCi1sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4PSJzZWQgLW4gLWUgJ3MvXjogXChbXiBdKlwpICQvICB7XFxcIlwxXFxcIiwgKHZvaWQgKikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbXiBdKlwpIFwobGliW14gXSpcKSQvICB7XCJcMlwiLCAodm9pZCAqKSBcJlwyfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFteIF0qXCkgXChbXiBdKlwpJC8gIHtcImxpYlwyXCIsICh2b2lkICopIFwmXDJ9LC9wJyIKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbXiBdKlwpWyBdKiQvICB7XFxcIlwxXFxcIiwgKHZvaWQgKikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbXiBdKlwpIFwoW14gXSpcKSQvICB7XCJcMlwiLCAodm9pZCAqKSBcJlwyfSwvcCciCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4PSJzZWQgLW4gLWUgJ3MvXjogXChbXiBdKlwpWyBdKiQvICB7XFxcIlwxXFxcIiwgKHZvaWQgKikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbXiBdKlwpIFwobGliW14gXSpcKSQvICB7XCJcMlwiLCAodm9pZCAqKSBcJlwyfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFteIF0qXCkgXChbXiBdKlwpJC8gIHtcImxpYlwyXCIsICh2b2lkICopIFwmXDJ9LC9wJyIKIAogIyBIYW5kbGUgQ1JMRiBpbiBtaW5ndyB0b29sIGNoYWluCiBvcHRfY3I9CkBAIC02MDYyLDYgKzY2MDAsNyBAQAogICAgICMgd2hpY2ggc3RhcnQgd2l0aCBAIG9yID8uCiAgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0iJEFXSyAnIlwKICIgICAgIHtsYXN0X3NlY3Rpb249c2VjdGlvbjsgc2VjdGlvbj1cJCAzfTsiXAorIiAgICAgL15DT0ZGIFNZTUJPTCBUQUJMRS97Zm9yKGkgaW4gaGlkZSkgZGVsZXRlIGhpZGVbaV19OyJcCiAiICAgICAvU2VjdGlvbiBsZW5ndGggLiojcmVsb2NzLioocGljayBhbnkpL3toaWRlW2xhc3Rfc2VjdGlvbl09MX07IlwKICIgICAgIFwkIDAhfi9FeHRlcm5hbCAqXHwve25leHR9OyJcCiAiICAgICAvIDArIFVOREVGIC97bmV4dH07IC8gVU5ERUYgXChbXnxdXCkqKCkve25leHR9OyJcCkBAIC02MDc0LDYgKzY2MTMsNyBAQAogICBlbHNlCiAgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKlsJIF1cKCRzeW1jb2RlJHN5bWNvZGUqXClbCSBdWwkgXSokYWNfc3ltcHJmeCRzeW1wYXQkb3B0X2NyJC8kc3lteGZybS9wJyIKICAgZmkKKyAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0iJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgfCBzZWQgJy8gX19nbnVfbHRvL2QnIgogCiAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgogICBwaXBlX3dvcmtzPW5vCkBAIC02MDk5LDggKzY2MzksOCBAQAogICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCiAgICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCiAgICAgbmxpc3Q9Y29uZnRlc3Qubm0KLSAgICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkbmxpc3RcIiI7IH0gPiY1Ci0gIChldmFsICROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRubGlzdCkgMj4mNQorICAgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgXD4gJG5saXN0XCIiOyB9ID4mNQorICAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiIFw+ICRubGlzdCkgMj4mNQogICBhY19zdGF0dXM9JD8KICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgdGVzdCAtcyAiJG5saXN0IjsgdGhlbgpAQCAtNjExNSw2ICs2NjU1LDE4IEBACiAgICAgICBpZiAkR1JFUCAnIG5tX3Rlc3RfdmFyJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgogCWlmICRHUkVQICcgbm1fdGVzdF9mdW5jJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgogCSAgY2F0IDw8X0xUX0VPRiA+IGNvbmZ0ZXN0LiRhY19leHQKKy8qIEtlZXAgdGhpcyBjb2RlIGluIHN5bmMgYmV0d2VlbiBsaWJ0b29sLm00LCBsdG1haW4sIGx0X3N5c3RlbS5oLCBhbmQgdGVzdHMuICAqLworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkKKy8qIERBVEEgaW1wb3J0cyBmcm9tIERMTHMgb24gV0lOMzIgY29uJ3QgYmUgY29uc3QsIGJlY2F1c2UgcnVudGltZQorICAgcmVsb2NhdGlvbnMgYXJlIHBlcmZvcm1lZCAtLSBzZWUgbGQncyBkb2N1bWVudGF0aW9uIG9uIHBzZXVkby1yZWxvY3MuICAqLworIyBkZWZpbmUgTFRfRExTWU1fQ09OU1QKKyNlbGlmIGRlZmluZWQoX19vc2ZfXykKKy8qIFRoaXMgc3lzdGVtIGRvZXMgbm90IGNvcGUgd2VsbCB3aXRoIHJlbG9jYXRpb25zIGluIGNvbnN0IGRhdGEuICAqLworIyBkZWZpbmUgTFRfRExTWU1fQ09OU1QKKyNlbHNlCisjIGRlZmluZSBMVF9ETFNZTV9DT05TVCBjb25zdAorI2VuZGlmCisKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYKQEAgLTYxMjYsNyArNjY3OCw3IEBACiAJICBjYXQgPDxfTFRfRU9GID4+IGNvbmZ0ZXN0LiRhY19leHQKIAogLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICAqLwotY29uc3Qgc3RydWN0IHsKK0xUX0RMU1lNX0NPTlNUIHN0cnVjdCB7CiAgIGNvbnN0IGNoYXIgKm5hbWU7CiAgIHZvaWQgICAgICAgKmFkZHJlc3M7CiB9CkBAIC02MTUyLDggKzY3MDQsOCBAQAogX0xUX0VPRgogCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KIAkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRzdG0uJGFjX29iamV4dAotCSAgbHRfc2F2ZV9MSUJTPSIkTElCUyIKLQkgIGx0X3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorCSAgbHRfZ2xvYnN5bV9zYXZlX0xJQlM9JExJQlMKKwkgIGx0X2dsb2JzeW1fc2F2ZV9DRkxBR1M9JENGTEFHUwogCSAgTElCUz0iY29uZnRzdG0uJGFjX29iamV4dCIKIAkgIENGTEFHUz0iJENGTEFHUyRsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZyIKIAkgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19saW5rXCIiOyB9ID4mNQpAQCAtNjE2Myw4ICs2NzE1LDggQEAKICAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCiAJICAgIHBpcGVfd29ya3M9eWVzCiAJICBmaQotCSAgTElCUz0iJGx0X3NhdmVfTElCUyIKLQkgIENGTEFHUz0iJGx0X3NhdmVfQ0ZMQUdTIgorCSAgTElCUz0kbHRfZ2xvYnN5bV9zYXZlX0xJQlMKKwkgIENGTEFHUz0kbHRfZ2xvYnN5bV9zYXZlX0NGTEFHUwogCWVsc2UKIAkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkbmxpc3QiID4mNQogCWZpCkBAIC02MjAxLDYgKzY3NTMsMTIgQEAKICRhc19lY2hvICJvayIgPiY2OyB9CiBmaQogCisjIFJlc3BvbnNlIGZpbGUgc3VwcG9ydC4KK2lmIHRlc3QgIiRsdF9jdl9ubV9pbnRlcmZhY2UiID0gIk1TIGR1bXBiaW4iOyB0aGVuCisgIG5tX2ZpbGVfbGlzdF9zcGVjPSdAJworZWxpZiAkTk0gLS1oZWxwIDI+L2Rldi9udWxsIHwgZ3JlcCAnW0BdRklMRScgPi9kZXYvbnVsbDsgdGhlbgorICBubV9maWxlX2xpc3Rfc3BlYz0nQCcKK2ZpCiAKIAogCkBAIC02MjIzLDYgKzY3ODEsNDggQEAKIAogCiAKKworCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzeXNyb290IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzeXNyb290Li4uICIgPiY2OyB9CisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtc3lzcm9vdCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfc3lzcm9vdCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfc3lzcm9vdDsKK2Vsc2UKKyAgd2l0aF9zeXNyb290PW5vCitmaQorCisKK2x0X3N5c3Jvb3Q9CitjYXNlICR7d2l0aF9zeXNyb290fSBpbiAjKAorIHllcykKKyAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgIGx0X3N5c3Jvb3Q9YCRDQyAtLXByaW50LXN5c3Jvb3QgMj4vZGV2L251bGxgCisgICBmaQorICAgOzsgIygKKyAvKikKKyAgIGx0X3N5c3Jvb3Q9YGVjaG8gIiR3aXRoX3N5c3Jvb3QiIHwgc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgIDs7ICMoCisgbm98JycpCisgICA7OyAjKAorICopCisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHt3aXRoX3N5c3Jvb3R9IiA+JjUKKyRhc19lY2hvICIke3dpdGhfc3lzcm9vdH0iID4mNjsgfQorICAgYXNfZm5fZXJyb3IgJD8gIlRoZSBzeXNyb290IG11c3QgYmUgYW4gYWJzb2x1dGUgcGF0aC4iICIkTElORU5PIiA1CisgICA7OworZXNhYworCisgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICR7bHRfc3lzcm9vdDotbm99IiA+JjUKKyRhc19lY2hvICIke2x0X3N5c3Jvb3Q6LW5vfSIgPiY2OyB9CisKKworCisKKwogIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxpYnRvb2wtbG9jayB3YXMgZ2l2ZW4uCiBpZiB0ZXN0ICIke2VuYWJsZV9saWJ0b29sX2xvY2src2V0fSIgPSBzZXQ7IHRoZW4gOgogICBlbmFibGV2YWw9JGVuYWJsZV9saWJ0b29sX2xvY2s7CkBAIC02MjU0LDcgKzY4NTQsNyBAQAogICA7OwogKi0qLWlyaXg2KikKICAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICcjbGluZSA2MjU3ICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgZWNobyAnI2xpbmUgJyRMSU5FTk8nICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKICAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1CiAgIChldmFsICRhY19jb21waWxlKSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtNjMwNSw3ICs2OTA1LDE0IEBACiAJICAgIExEPSIke0xELWxkfSAtbSBlbGZfaTM4Nl9mYnNkIgogCSAgICA7OwogCSAgeDg2XzY0LSpsaW51eCopCi0JICAgIExEPSIke0xELWxkfSAtbSBlbGZfaTM4NiIKKwkgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCBpbgorCSAgICAgICp4ODYtNjQqKQorCSAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGYzMl94ODZfNjQiCisJICAgICAgICAgOzsKKwkgICAgICAqKQorCSAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGZfaTM4NiIKKwkgICAgICAgICA7OworCSAgICBlc2FjCiAJICAgIDs7CiAJICBwcGM2NC0qbGludXgqfHBvd2VycGM2NC0qbGludXgqKQogCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmMzJwcGNsaW51eCIKQEAgLTYzNDgsNyArNjk1NSw3IEBACiAgIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7bHRfY3ZfY2NfbmVlZHNfYmVsZitzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2x0X2N2X2NjX25lZWRzX2JlbGYrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBhY19leHQ9YwpAQCAtNjM4OSw3ICs2OTk2LDcgQEAKICAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKICAgZmkKICAgOzsKLXNwYXJjKi0qc29sYXJpcyopCisqLSpzb2xhcmlzKikKICAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgogICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAogICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKQEAgLTY0MDAsNyArNzAwNywyMCBAQAogICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AgaW4KICAgICAqNjQtYml0KikKICAgICAgIGNhc2UgJGx0X2N2X3Byb2dfZ251X2xkIGluCi0gICAgICB5ZXMqKSBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfc3BhcmMiIDs7CisgICAgICB5ZXMqKQorICAgICAgICBjYXNlICRob3N0IGluCisgICAgICAgIGk/ODYtKi1zb2xhcmlzKikKKyAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3g4Nl82NCIKKyAgICAgICAgICA7OworICAgICAgICBzcGFyYyotKi1zb2xhcmlzKikKKyAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfc3BhcmMiCisgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICAjIEdOVSBsZCAyLjIxIGludHJvZHVjZWQgX3NvbDIgZW11bGF0aW9ucy4gIFVzZSB0aGVtIGlmIGF2YWlsYWJsZS4KKyAgICAgICAgaWYgJHtMRC1sZH0gLVYgfCBncmVwIF9zb2wyID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgICAgIExEPSIke0xELWxkfV9zb2wyIgorICAgICAgICBmaQorICAgICAgICA7OwogICAgICAgKikKIAlpZiAke0xELWxkfSAtNjQgLXIgLW8gY29uZnRlc3QyLm8gY29uZnRlc3QubyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KIAkgIExEPSIke0xELWxkfSAtNjQiCkBAIC02NDE2LDYgKzcwMzYsMTIzIEBACiAKIG5lZWRfbG9ja3M9IiRlbmFibGVfbGlidG9vbF9sb2NrIgogCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1tdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1tdDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfTUFOSUZFU1RfVE9PTCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRNQU5JRkVTVF9UT09MIjsgdGhlbgorICBhY19jdl9wcm9nX01BTklGRVNUX1RPT0w9IiRNQU5JRkVTVF9UT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfTUFOSUZFU1RfVE9PTD0iJHthY190b29sX3ByZWZpeH1tdCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitNQU5JRkVTVF9UT09MPSRhY19jdl9wcm9nX01BTklGRVNUX1RPT0wKK2lmIHRlc3QgLW4gIiRNQU5JRkVTVF9UT09MIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1BTklGRVNUX1RPT0wiID4mNQorJGFzX2VjaG8gIiRNQU5JRkVTVF9UT09MIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19NQU5JRkVTVF9UT09MIjsgdGhlbgorICBhY19jdF9NQU5JRkVTVF9UT09MPSRNQU5JRkVTVF9UT09MCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG10OyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9NQU5JRkVTVF9UT09MKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X01BTklGRVNUX1RPT0wiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfTUFOSUZFU1RfVE9PTD0iJGFjX2N0X01BTklGRVNUX1RPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9NQU5JRkVTVF9UT09MPSJtdCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9NQU5JRkVTVF9UT09MPSRhY19jdl9wcm9nX2FjX2N0X01BTklGRVNUX1RPT0wKK2lmIHRlc3QgLW4gIiRhY19jdF9NQU5JRkVTVF9UT09MIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X01BTklGRVNUX1RPT0wiID4mNQorJGFzX2VjaG8gIiRhY19jdF9NQU5JRkVTVF9UT09MIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfTUFOSUZFU1RfVE9PTCIgPSB4OyB0aGVuCisgICAgTUFOSUZFU1RfVE9PTD0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBNQU5JRkVTVF9UT09MPSRhY19jdF9NQU5JRkVTVF9UT09MCisgIGZpCitlbHNlCisgIE1BTklGRVNUX1RPT0w9IiRhY19jdl9wcm9nX01BTklGRVNUX1RPT0wiCitmaQorCit0ZXN0IC16ICIkTUFOSUZFU1RfVE9PTCIgJiYgTUFOSUZFU1RfVE9PTD1tdAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkTUFOSUZFU1RfVE9PTCBpcyBhIG1hbmlmZXN0IHRvb2wiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJE1BTklGRVNUX1RPT0wgaXMgYSBtYW5pZmVzdCB0b29sLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3BhdGhfbWFpbmZlc3RfdG9vbCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3BhdGhfbWFpbmZlc3RfdG9vbD1ubworICBlY2hvICIkYXNfbWU6JExJTkVOTzogJE1BTklGRVNUX1RPT0wgJy0/JyIgPiY1CisgICRNQU5JRkVTVF9UT09MICctPycgMj5jb25mdGVzdC5lcnIgPiBjb25mdGVzdC5vdXQKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgaWYgJEdSRVAgJ01hbmlmZXN0IFRvb2wnIGNvbmZ0ZXN0Lm91dCA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGx0X2N2X3BhdGhfbWFpbmZlc3RfdG9vbD15ZXMKKyAgZmkKKyAgcm0gLWYgY29uZnRlc3QqCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2wiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2wiID4mNjsgfQoraWYgdGVzdCAieCRsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2wiICE9IHh5ZXM7IHRoZW4KKyAgTUFOSUZFU1RfVE9PTD06CitmaQorCisKKworCisKIAogICBjYXNlICRob3N0X29zIGluCiAgICAgcmhhcHNvZHkqIHwgZGFyd2luKikKQEAgLTY0MjQsNyArNzE2MSw3IEBACiBzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1kc3ltdXRpbDsgYWNfd29yZD0kMgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfRFNZTVVUSUwrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9wcm9nX0RTWU1VVElMKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAtbiAiJERTWU1VVElMIjsgdGhlbgpAQCAtNjQzNiw3ICs3MTczLDcgQEAKICAgSUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KICAgICBhY19jdl9wcm9nX0RTWU1VVElMPSIke2FjX3Rvb2xfcHJlZml4fWRzeW11dGlsIgogICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKQEAgLTY0NjQsNyArNzIwMSw3IEBACiBzZXQgZHVtbXkgZHN5bXV0aWw7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0RTWU1VVElMK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9EU1lNVVRJTCs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIHRlc3QgLW4gIiRhY19jdF9EU1lNVVRJTCI7IHRoZW4KQEAgLTY0NzYsNyArNzIxMyw3IEBACiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCiAgICAgYWNfY3ZfcHJvZ19hY19jdF9EU1lNVVRJTD0iZHN5bXV0aWwiCiAgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgpAQCAtNjUxNiw3ICs3MjUzLDcgQEAKIHNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW5tZWRpdDsgYWNfd29yZD0kMgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfTk1FRElUK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfcHJvZ19OTUVESVQrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiB0ZXN0IC1uICIkTk1FRElUIjsgdGhlbgpAQCAtNjUyOCw3ICs3MjY1LDcgQEAKICAgSUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KICAgICBhY19jdl9wcm9nX05NRURJVD0iJHthY190b29sX3ByZWZpeH1ubWVkaXQiCiAgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgpAQCAtNjU1Niw3ICs3MjkzLDcgQEAKIHNldCBkdW1teSBubWVkaXQ7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X05NRURJVCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfTk1FRElUKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAtbiAiJGFjX2N0X05NRURJVCI7IHRoZW4KQEAgLTY1NjgsNyArNzMwNSw3IEBACiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCiAgICAgYWNfY3ZfcHJvZ19hY19jdF9OTUVESVQ9Im5tZWRpdCIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCkBAIC02NjA4LDcgKzczNDUsNyBAQAogc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9bGlwbzsgYWNfd29yZD0kMgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfTElQTytzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3Byb2dfTElQTys6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIHRlc3QgLW4gIiRMSVBPIjsgdGhlbgpAQCAtNjYyMCw3ICs3MzU3LDcgQEAKICAgSUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KICAgICBhY19jdl9wcm9nX0xJUE89IiR7YWNfdG9vbF9wcmVmaXh9bGlwbyIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCkBAIC02NjQ4LDcgKzczODUsNyBAQAogc2V0IGR1bW15IGxpcG87IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0xJUE8rc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9wcm9nX2FjX2N0X0xJUE8rOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiB0ZXN0IC1uICIkYWNfY3RfTElQTyI7IHRoZW4KQEAgLTY2NjAsNyArNzM5Nyw3IEBACiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCiAgICAgYWNfY3ZfcHJvZ19hY19jdF9MSVBPPSJsaXBvIgogICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKQEAgLTY3MDAsNyArNzQzNyw3IEBACiBzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1vdG9vbDsgYWNfd29yZD0kMgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfT1RPT0wrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9wcm9nX09UT09MKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAtbiAiJE9UT09MIjsgdGhlbgpAQCAtNjcxMiw3ICs3NDQ5LDcgQEAKICAgSUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KICAgICBhY19jdl9wcm9nX09UT09MPSIke2FjX3Rvb2xfcHJlZml4fW90b29sIgogICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKQEAgLTY3NDAsNyArNzQ3Nyw3IEBACiBzZXQgZHVtbXkgb3Rvb2w7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X09UT09MK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9PVE9PTCs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIHRlc3QgLW4gIiRhY19jdF9PVE9PTCI7IHRoZW4KQEAgLTY3NTIsNyArNzQ4OSw3IEBACiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCiAgICAgYWNfY3ZfcHJvZ19hY19jdF9PVE9PTD0ib3Rvb2wiCiAgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgpAQCAtNjc5Miw3ICs3NTI5LDcgQEAKIHNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW90b29sNjQ7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX09UT09MNjQrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9wcm9nX09UT09MNjQrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiB0ZXN0IC1uICIkT1RPT0w2NCI7IHRoZW4KQEAgLTY4MDQsNyArNzU0MSw3IEBACiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCiAgICAgYWNfY3ZfcHJvZ19PVE9PTDY0PSIke2FjX3Rvb2xfcHJlZml4fW90b29sNjQiCiAgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgpAQCAtNjgzMiw3ICs3NTY5LDcgQEAKIHNldCBkdW1teSBvdG9vbDY0OyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9PVE9PTDY0K3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9PVE9PTDY0Kzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAtbiAiJGFjX2N0X09UT09MNjQiOyB0aGVuCkBAIC02ODQ0LDcgKzc1ODEsNyBAQAogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgogICAgIGFjX2N2X3Byb2dfYWNfY3RfT1RPT0w2ND0ib3Rvb2w2NCIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCkBAIC02OTA3LDcgKzc2NDQsNyBAQAogCiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgLXNpbmdsZV9tb2R1bGUgbGlua2VyIGZsYWciID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIC1zaW5nbGVfbW9kdWxlIGxpbmtlciBmbGFnLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2x0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2Qrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHtsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZD1ubwpAQCAtNjkyMyw3ICs3NjYwLDEzIEBACiAJJExUQ0MgJExUQ0ZMQUdTICRMREZMQUdTIC1vIGxpYmNvbmZ0ZXN0LmR5bGliIFwKIAkgIC1keW5hbWljbGliIC1XbCwtc2luZ2xlX21vZHVsZSBjb25mdGVzdC5jIDI+Y29uZnRlc3QuZXJyCiAgICAgICAgIF9sdF9yZXN1bHQ9JD8KLQlpZiB0ZXN0IC1mIGxpYmNvbmZ0ZXN0LmR5bGliICYmIHRlc3QgISAtcyBjb25mdGVzdC5lcnIgJiYgdGVzdCAkX2x0X3Jlc3VsdCA9IDA7IHRoZW4KKwkjIElmIHRoZXJlIGlzIGEgbm9uLWVtcHR5IGVycm9yIGxvZywgYW5kICJzaW5nbGVfbW9kdWxlIgorCSMgYXBwZWFycyBpbiBpdCwgYXNzdW1lIHRoZSBmbGFnIGNhdXNlZCBhIGxpbmtlciB3YXJuaW5nCisgICAgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyICYmICRHUkVQIHNpbmdsZV9tb2R1bGUgY29uZnRlc3QuZXJyOyB0aGVuCisJICBjYXQgY29uZnRlc3QuZXJyID4mNQorCSMgT3RoZXJ3aXNlLCBpZiB0aGUgb3V0cHV0IHdhcyBjcmVhdGVkIHdpdGggYSAwIGV4aXQgY29kZSBmcm9tCisJIyB0aGUgY29tcGlsZXIsIGl0IHdvcmtlZC4KKwllbGlmIHRlc3QgLWYgbGliY29uZnRlc3QuZHlsaWIgJiYgdGVzdCAkX2x0X3Jlc3VsdCAtZXEgMDsgdGhlbgogCSAgbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZD15ZXMKIAllbHNlCiAJICBjYXQgY29uZnRlc3QuZXJyID4mNQpAQCAtNjkzNCw5ICs3Njc3LDEwIEBACiBmaQogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kIiA+JjUKICRhc19lY2hvICIkbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZCIgPiY2OyB9CisKICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGxpbmtlciBmbGFnIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGxpbmtlciBmbGFnLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2x0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2x0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdCs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGx0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdD1ubwpAQCAtNjk2Niw2ICs3NzEwLDQxIEBACiBmaQogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3QiID4mNQogJGFzX2VjaG8gIiRsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3QiID4mNjsgfQorCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgLWZvcmNlX2xvYWQgbGlua2VyIGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIC1mb3JjZV9sb2FkIGxpbmtlciBmbGFnLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X2xkX2ZvcmNlX2xvYWQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9sZF9mb3JjZV9sb2FkPW5vCisgICAgICBjYXQgPiBjb25mdGVzdC5jIDw8IF9MVF9FT0YKK2ludCBmb3JjZWRfbG9hZGVkKCkgeyByZXR1cm4gMjt9CitfTFRfRU9GCisgICAgICBlY2hvICIkTFRDQyAkTFRDRkxBR1MgLWMgLW8gY29uZnRlc3QubyBjb25mdGVzdC5jIiA+JjUKKyAgICAgICRMVENDICRMVENGTEFHUyAtYyAtbyBjb25mdGVzdC5vIGNvbmZ0ZXN0LmMgMj4mNQorICAgICAgZWNobyAiJEFSIGNydSBsaWJjb25mdGVzdC5hIGNvbmZ0ZXN0Lm8iID4mNQorICAgICAgJEFSIGNydSBsaWJjb25mdGVzdC5hIGNvbmZ0ZXN0Lm8gMj4mNQorICAgICAgZWNobyAiJFJBTkxJQiBsaWJjb25mdGVzdC5hIiA+JjUKKyAgICAgICRSQU5MSUIgbGliY29uZnRlc3QuYSAyPiY1CisgICAgICBjYXQgPiBjb25mdGVzdC5jIDw8IF9MVF9FT0YKK2ludCBtYWluKCkgeyByZXR1cm4gMDt9CitfTFRfRU9GCisgICAgICBlY2hvICIkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAtV2wsLWZvcmNlX2xvYWQsLi9saWJjb25mdGVzdC5hIiA+JjUKKyAgICAgICRMVENDICRMVENGTEFHUyAkTERGTEFHUyAtbyBjb25mdGVzdCBjb25mdGVzdC5jIC1XbCwtZm9yY2VfbG9hZCwuL2xpYmNvbmZ0ZXN0LmEgMj5jb25mdGVzdC5lcnIKKyAgICAgIF9sdF9yZXN1bHQ9JD8KKyAgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyICYmICRHUkVQIGZvcmNlX2xvYWQgY29uZnRlc3QuZXJyOyB0aGVuCisJY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgICAgIGVsaWYgdGVzdCAtZiBjb25mdGVzdCAmJiB0ZXN0ICRfbHRfcmVzdWx0IC1lcSAwICYmICRHUkVQIGZvcmNlZF9sb2FkIGNvbmZ0ZXN0ID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwlsdF9jdl9sZF9mb3JjZV9sb2FkPXllcworICAgICAgZWxzZQorCWNhdCBjb25mdGVzdC5lcnIgPiY1CisgICAgICBmaQorICAgICAgICBybSAtZiBjb25mdGVzdC5lcnIgbGliY29uZnRlc3QuYSBjb25mdGVzdCBjb25mdGVzdC5jCisgICAgICAgIHJtIC1yZiBjb25mdGVzdC5kU1lNCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2xkX2ZvcmNlX2xvYWQiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9sZF9mb3JjZV9sb2FkIiA+JjY7IH0KICAgICBjYXNlICRob3N0X29zIGluCiAgICAgcmhhcHNvZHkqIHwgZGFyd2luMS5bMDEyXSkKICAgICAgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycgOzsKQEAgLTY5OTMsNyArNzc3Miw3IEBACiAgICAgZWxzZQogICAgICAgX2x0X2Rhcl9leHBvcnRfc3ltcz0nfiROTUVESVQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCiAgICAgZmkKLSAgICBpZiB0ZXN0ICIkRFNZTVVUSUwiICE9ICI6IjsgdGhlbgorICAgIGlmIHRlc3QgIiREU1lNVVRJTCIgIT0gIjoiICYmIHRlc3QgIiRsdF9jdl9sZF9mb3JjZV9sb2FkIiA9ICJubyI7IHRoZW4KICAgICAgIF9sdF9kc3ltdXRpbD0nfiREU1lNVVRJTCAkbGliIHx8IDonCiAgICAgZWxzZQogICAgICAgX2x0X2RzeW11dGlsPQpAQCAtNzAxMyw3ICs3NzkyLDcgQEAKICAgQ1BQPQogZmkKIGlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DUFArc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBpZiAke2FjX2N2X3Byb2dfQ1BQKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENQUCBuZWVkcyB0byBiZSBleHBhbmRlZApAQCAtNzA0Myw3ICs3ODIyLDcgQEAKICAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgogY29udGludWUKIGZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAogCiAgICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCiAgICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCkBAIC03MDU5LDExICs3ODM4LDExIEBACiBhY19wcmVwcm9jX29rPToKIGJyZWFrCiBmaQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKIAogZG9uZQogIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAogaWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgogICBicmVhawogZmkKQEAgLTcxMDIsNyArNzg4MSw3IEBACiAgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KIGNvbnRpbnVlCiBmaQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKIAogICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycwogICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgpAQCAtNzExOCwxOCArNzg5NywxOCBAQAogYWNfcHJlcHJvY19vaz06CiBicmVhawogZmkKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CiAKIGRvbmUKICMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvbmZ0ZXN0LmkgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKIGlmICRhY19wcmVwcm9jX29rOyB0aGVuIDoKIAogZWxzZQogICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KLWFzX2ZuX2Vycm9yICJDIHByZXByb2Nlc3NvciBcIiRDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiAiJExJTkVOTyIgNTsgfQorYXNfZm5fZXJyb3IgJD8gIkMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNhbml0eSBjaGVjaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KIGZpCiAKIGFjX2V4dD1jCkBAIC03MTQxLDcgKzc5MjAsNyBAQAogCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9zdGRjK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfaGVhZGVyX3N0ZGMrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CkBAIC03MjU4LDggKzgwMzcsNyBAQAogICBhc19hY19IZWFkZXI9YCRhc19lY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCiBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlICIkTElORU5PIiAiJGFjX2hlYWRlciIgIiRhc19hY19IZWFkZXIiICIkYWNfaW5jbHVkZXNfZGVmYXVsdAogIgotZXZhbCBhc192YWw9XCQkYXNfYWNfSGVhZGVyCi0gICBpZiB0ZXN0ICJ4JGFzX3ZhbCIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY19IZWFkZXIiXCIgPSB4InllcyI7IHRoZW4gOgogICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKIF9BQ0VPRgpAQCAtNzI3Myw3ICs4MDUxLDcgQEAKIGRvIDoKICAgYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgImRsZmNuLmgiICJhY19jdl9oZWFkZXJfZGxmY25faCIgIiRhY19pbmNsdWRlc19kZWZhdWx0CiAiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9kbGZjbl9oIiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9kbGZjbl9oIiA9IHh5ZXM7IHRoZW4gOgogICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIEhBVkVfRExGQ05fSCAxCiBfQUNFT0YKQEAgLTcyODQsNiArODA2Miw4IEBACiAKIAogCisKKwogIyBTZXQgb3B0aW9ucwogCiAKQEAgLTczNTksNyArODEzOSwyMiBAQAogCiAjIENoZWNrIHdoZXRoZXIgLS13aXRoLXBpYyB3YXMgZ2l2ZW4uCiBpZiB0ZXN0ICIke3dpdGhfcGljK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9waWM7IHBpY19tb2RlPSIkd2l0aHZhbCIKKyAgd2l0aHZhbD0kd2l0aF9waWM7IGx0X3A9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkd2l0aHZhbCBpbgorICAgIHllc3xubykgcGljX21vZGU9JHdpdGh2YWwgOzsKKyAgICAqKQorICAgICAgcGljX21vZGU9ZGVmYXVsdAorICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgbHRfcGtnIGluICR3aXRodmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkbHRfcGtnIiA9ICJYJGx0X3AiOyB0aGVuCisJICBwaWNfbW9kZT15ZXMKKwlmaQorICAgICAgZG9uZQorICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICA7OworICAgIGVzYWMKIGVsc2UKICAgcGljX21vZGU9ZGVmYXVsdAogZmkKQEAgLTc0MzYsNiArODIzMSwxMSBAQAogCiAKIAorCisKKworCisKIHRlc3QgLXogIiRMTl9TIiAmJiBMTl9TPSJsbiAtcyIKIAogCkBAIC03NDU3LDcgKzgyNTcsNyBAQAogCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBvYmpkaXIiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIG9iamRpci4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHtsdF9jdl9vYmpkaXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHtsdF9jdl9vYmpkaXIrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBybSAtZiAubGlicyAyPi9kZXYvbnVsbApAQCAtNzQ4NSwxOSArODI4NSw2IEBACiAKIAogCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KIGNhc2UgJGhvc3Rfb3MgaW4KIGFpeDMqKQogICAjIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKQEAgLTc1MTAsMjMgKzgyOTcsNiBAQAogICA7OwogZXNhYwogCi0jIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCi0jIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgotc2VkX3F1b3RlX3N1YnN0PSdzL1woWyJgJFxcXVwpL1xcXDEvZycKLQotIyBTYW1lIGFzIGFib3ZlLCBidXQgZG8gbm90IHF1b3RlIHZhcmlhYmxlIHJlZmVyZW5jZXMuCi1kb3VibGVfcXVvdGVfc3Vic3Q9J3MvXChbImBcXF1cKS9cXFwxL2cnCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0byBkZWxheSBleHBhbnNpb24gb2YgYW4gZXNjYXBlZCBzaGVsbCB2YXJpYWJsZSBpbiBhCi0jIGRvdWJsZV9xdW90ZV9zdWJzdCdlZCBzdHJpbmcuCi1kZWxheV92YXJpYWJsZV9zdWJzdD0ncy9cXFxcXFxcXFxcXCQvXFxcXFxcJC9nJwotCi0jIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2luZ2xlIHF1b3RlLgotZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0PSdzLydcJycvJ1wnXFxcXFxcXCdcJycvZycKLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGF2b2lkIGFjY2lkZW50YWwgZ2xvYmJpbmcgaW4gZXZhbGVkIGV4cHJlc3Npb25zCi1ub19nbG9iX3N1YnN0PSdzL1wqL1xcXCovZycKLQogIyBHbG9iYWwgdmFyaWFibGVzOgogb2ZpbGU9bGlidG9vbAogY2FuX2J1aWxkX3NoYXJlZD15ZXMKQEAgLTc1NTUsNyArODMyNSw3IEBACiAgICAgKikgYnJlYWs7OwogICBlc2FjCiBkb25lCi1jY19iYXNlbmFtZT1gJEVDSE8gIlgkY2NfdGVtcCIgfCAkWHNlZCAtZSAncyUuKi8lJScgLWUgInMlXiRob3N0X2FsaWFzLSUlImAKK2NjX2Jhc2VuYW1lPWAkRUNITyAiJGNjX3RlbXAiIHwgJFNFRCAicyUuKi8lJTsgcyVeJGhvc3RfYWxpYXMtJSUiYAogCiAKICMgT25seSBwZXJmb3JtIHRoZSBjaGVjayBmb3IgZmlsZSwgaWYgdGhlIGNoZWNrIG1ldGhvZCByZXF1aXJlcyBpdApAQCAtNzU2NSw3ICs4MzM1LDcgQEAKICAgaWYgdGVzdCAiJGZpbGVfbWFnaWNfY21kIiA9ICckTUFHSUNfQ01EJzsgdGhlbgogICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICR7YWNfdG9vbF9wcmVmaXh9ZmlsZSIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJHthY190b29sX3ByZWZpeH1maWxlLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2x0X2N2X3BhdGhfTUFHSUNfQ01EK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7bHRfY3ZfcGF0aF9NQUdJQ19DTUQrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBjYXNlICRNQUdJQ19DTUQgaW4KQEAgLTc2MzEsNyArODQwMSw3IEBACiAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBmaWxlIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciBmaWxlLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2x0X2N2X3BhdGhfTUFHSUNfQ01EK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7bHRfY3ZfcGF0aF9NQUdJQ19DTUQrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBjYXNlICRNQUdJQ19DTUQgaW4KQEAgLTc3NjQsMTEgKzg1MzQsMTYgQEAKIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPQogCiBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZz0nIC1mbm8tYnVpbHRpbicKKyAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgbnZjYyopCisgICAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWc9JyAtWGNvbXBpbGVyIC1mbm8tYnVpbHRpbicgOzsKKyAgKikKKyAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZz0nIC1mbm8tYnVpbHRpbicgOzsKKyAgZXNhYwogCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7bHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucys6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPW5vCkBAIC03Nzg0LDE1ICs4NTU5LDE1IEBACiAgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCiAgICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCiAgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAotICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOjc3ODc6ICRsdF9jb21waWxlXCIiID4mNSkKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JjUpCiAgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQogICAgYWNfc3RhdHVzPSQ/CiAgICBjYXQgY29uZnRlc3QuZXJyID4mNQotICAgZWNobyAiJGFzX21lOjc3OTE6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCiAgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCiAgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCi0gICAgICRFQ0hPICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID5jb25mdGVzdC5leHAKKyAgICAgJEVDSE8gIiRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID5jb25mdGVzdC5leHAKICAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCiAgICAgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5lcjIgfHwgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KICAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucz15ZXMKQEAgLTc4MjEsOCArODU5Niw2IEBACiBsdF9wcm9nX2NvbXBpbGVyX3BpYz0KIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPQogCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICIgPiY2OyB9CiAKICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJwpAQCAtNzg3MCw2ICs4NjQzLDEyIEBACiAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZuby1jb21tb24nCiAgICAgICA7OwogCisgICAgaGFpa3UqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIEhhaWt1LgorICAgICAgIyBUaGUgIi1zdGF0aWMiIGZsYWcgZXhpc3RzLCBidXQgaXMgYnJva2VuLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9CisgICAgICA7OworCiAgICAgaHB1eCopCiAgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgNjQtYml0IFBBIEhQLVVYLCBidXQgbm90IGZvciAzMi1iaXQKICAgICAgICMgUEEgSFAtVVguICBPbiBJQTY0IEhQLVVYLCBQSUMgaXMgdGhlIGRlZmF1bHQgYnV0IHRoZSBwaWMgZmxhZwpAQCAtNzkxMiw2ICs4NjkxLDE1IEBACiAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZQSUMnCiAgICAgICA7OwogICAgIGVzYWMKKworICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgbnZjYyopICMgQ3VkYSBDb21waWxlciBEcml2ZXIgMi4yCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctWGxpbmtlciAnCisgICAgICBpZiB0ZXN0IC1uICIkbHRfcHJvZ19jb21waWxlcl9waWMiOyB0aGVuCisgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSItWGNvbXBpbGVyICRsdF9wcm9nX2NvbXBpbGVyX3BpYyIKKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKICAgZWxzZQogICAgICMgUE9SVE1FIENoZWNrIGZvciBmbGFnIHRvIHBhc3MgbGlua2VyIGZsYWdzIHRocm91Z2ggdGhlIHN5c3RlbSBjb21waWxlci4KICAgICBjYXNlICRob3N0X29zIGluCkBAIC03OTUzLDcgKzg3NDEsNyBAQAogICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1ub25fc2hhcmVkJwogICAgICAgOzsKIAotICAgIGxpbnV4KiB8IGsqYnNkKi1nbnUpCisgICAgbGludXgqIHwgaypic2QqLWdudSB8IGtvcGVuc29sYXJpcyotZ251KQogICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KICAgICAgICMgb2xkIEludGVsIGZvciB4ODZfNjQgd2hpY2ggc3RpbGwgc3VwcG9ydGVkIC1LUElDLgogICAgICAgZWNjKikKQEAgLTc5NzQsNyArODc2MiwxMyBAQAogCWx0X3Byb2dfY29tcGlsZXJfcGljPSctLXNoYXJlZCcKIAlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLS1zdGF0aWMnCiAJOzsKLSAgICAgIHBnY2MqIHwgcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqKQorICAgICAgbmFnZm9yKikKKwkjIE5BRyBGb3J0cmFuIGNvbXBpbGVyCisJbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLC1XbCwsJworCWx0X3Byb2dfY29tcGlsZXJfcGljPSctUElDJworCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKwk7OworICAgICAgcGdjYyogfCBwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSogfCBwZ2ZvcnRyYW4qKQogICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIGNvbXBpbGVycyAoKm5vdCogdGhlIFBlbnRpdW0gZ2NjIGNvbXBpbGVyLAogCSMgd2hpY2ggbG9va3MgdG8gYmUgYSBkZWFkIHByb2plY3QpCiAJbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKQEAgLTc5ODYsMjUgKzg3ODAsNDAgQEAKICAgICAgICAgIyBBbGwgQWxwaGEgY29kZSBpcyBQSUMuCiAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctbm9uX3NoYXJlZCcKICAgICAgICAgOzsKLSAgICAgIHhsKikKLQkjIElCTSBYTCBDIDguMC9Gb3J0cmFuIDEwLjEgb24gUFBDCisgICAgICB4bCogfCBiZ3hsKiB8IGJnZiogfCBtcGl4bCopCisJIyBJQk0gWEwgQyA4LjAvRm9ydHJhbiAxMC4xLCAxMS4xIG9uIFBQQyBhbmQgQmx1ZUdlbmUKIAlsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJwogCWx0X3Byb2dfY29tcGlsZXJfcGljPSctcXBpYycKIAlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLXFzdGF0aWNsaW5rJwogCTs7CiAgICAgICAqKQogCWNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorCSpTdW5cIENlcmVzXCBGb3J0cmFuKiB8ICpTdW4qRm9ydHJhbipcIFsxLTddLiogfCAqU3VuKkZvcnRyYW4qXCA4LlswLTNdKikKKwkgICMgU3VuIEZvcnRyYW4gOC4zIHBhc3NlcyBhbGwgdW5yZWNvZ25pemVkIGZsYWdzIHRvIHRoZSBsaW5rZXIKKwkgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKKwkgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKwkgIGx0X3Byb2dfY29tcGlsZXJfd2w9JycKKwkgIDs7CisJKlN1blwgRiogfCAqU3VuKkZvcnRyYW4qKQorCSAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJworCSAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworCSAgbHRfcHJvZ19jb21waWxlcl93bD0nLVFvcHRpb24gbGQgJworCSAgOzsKIAkqU3VuXCBDKikKIAkgICMgU3VuIEMgNS45CiAJICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCiAJICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCiAJICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJwogCSAgOzsKLQkqU3VuXCBGKikKLQkgICMgU3VuIEZvcnRyYW4gOC4zIHBhc3NlcyBhbGwgdW5yZWNvZ25pemVkIGZsYWdzIHRvIHRoZSBsaW5rZXIKLQkgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKKyAgICAgICAgKkludGVsKlwgW0NGXSpDb21waWxlciopCisJICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworCSAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mUElDJworCSAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1zdGF0aWMnCisJICA7OworCSpQb3J0bGFuZFwgR3JvdXAqKQorCSAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKwkgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctZnBpYycKIAkgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKLQkgIGx0X3Byb2dfY29tcGlsZXJfd2w9JycKIAkgIDs7CiAJZXNhYwogCTs7CkBAIC04MDM2LDcgKzg4NDUsNyBAQAogICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJwogICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJwogICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIGY3NyogfCBmOTAqIHwgZjk1KikKKyAgICAgIGY3NyogfCBmOTAqIHwgZjk1KiB8IHN1bmY3NyogfCBzdW5mOTAqIHwgc3VuZjk1KikKIAlsdF9wcm9nX2NvbXBpbGVyX3dsPSctUW9wdGlvbiBsZCAnOzsKICAgICAgICopCiAJbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCc7OwpAQCAtODA5MywxMyArODkwMiwxNyBAQAogICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSIkbHRfcHJvZ19jb21waWxlcl9waWMgLURQSUMiCiAgICAgOzsKIGVzYWMKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9waWMiID4mNQotJGFzX2VjaG8gIiRsdF9wcm9nX2NvbXBpbGVyX3BpYyIgPiY2OyB9CiAKLQotCi0KLQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX3BpYys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfcGljPSRsdF9wcm9nX2NvbXBpbGVyX3BpYworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9waWMiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpYyIgPiY2OyB9CitsdF9wcm9nX2NvbXBpbGVyX3BpYz0kbHRfY3ZfcHJvZ19jb21waWxlcl9waWMKIAogIwogIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGFjdHVhbGx5IHdvcmtzLgpAQCAtODEwNyw3ICs4OTIwLDcgQEAKIGlmIHRlc3QgLW4gIiRsdF9wcm9nX2NvbXBpbGVyX3BpYyI7IHRoZW4KICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljIHdvcmtzIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkbHRfcHJvZ19jb21waWxlcl9waWMgd29ya3MuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7bHRfY3ZfcHJvZ19jb21waWxlcl9waWNfd29ya3Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3Jrcys6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGx0X2N2X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzPW5vCkBAIC04MTIzLDE1ICs4OTM2LDE1IEBACiAgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCiAgICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCiAgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAotICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOjgxMjY6ICRsdF9jb21waWxlXCIiID4mNSkKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JjUpCiAgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQogICAgYWNfc3RhdHVzPSQ/CiAgICBjYXQgY29uZnRlc3QuZXJyID4mNQotICAgZWNobyAiJGFzX21lOjgxMzA6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCiAgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCiAgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCi0gICAgICRFQ0hPICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID5jb25mdGVzdC5leHAKKyAgICAgJEVDSE8gIiRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID5jb25mdGVzdC5leHAKICAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCiAgICAgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5lcjIgfHwgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KICAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3Jrcz15ZXMKQEAgLTgxNjAsMTMgKzg5NzMsMTggQEAKIAogCiAKKworCisKKworCiAjCiAjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGljIGZsYWcgYWN0dWFsbHkgd29ya3MuCiAjCiB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIGx0X3RtcF9zdGF0aWNfZmxhZz1cIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY1wiCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2x0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7bHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBsdF9jdl9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrcz1ubwpAQCAtODE3OSw3ICs4OTk3LDcgQEAKICAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KICAgICAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgogICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICAgICAgICRFQ0hPICJYJF9sdF9saW5rZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+IGNvbmZ0ZXN0LmV4cAorICAgICAgICRFQ0hPICIkX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZSIgfCAkU0VEICcvXiQvZCcgPiBjb25mdGVzdC5leHAKICAgICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKICAgICAgICBpZiBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgogICAgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3M9eWVzCkBAIC04MjA5LDcgKzkwMjcsNyBAQAogCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0Li4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2x0X2N2X3Byb2dfY29tcGlsZXJfY19vK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7bHRfY3ZfcHJvZ19jb21waWxlcl9jX28rOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbz1ubwpAQCAtODIyOCwxNiArOTA0NiwxNiBAQAogICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAogICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAogICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKLSAgIChldmFsIGVjaG8gIlwiXCRhc19tZTo4MjMxOiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogJGx0X2NvbXBpbGVcIiIgPiY1KQogICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPm91dC9jb25mdGVzdC5lcnIpCiAgICBhY19zdGF0dXM9JD8KICAgIGNhdCBvdXQvY29uZnRlc3QuZXJyID4mNQotICAgZWNobyAiJGFzX21lOjgyMzU6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQKICAgIHRoZW4KICAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKICAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCi0gICAgICRFQ0hPICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAorICAgICAkRUNITyAiJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkU0VEICcvXiQvZCcgPiBvdXQvY29uZnRlc3QuZXhwCiAgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBvdXQvY29uZnRlc3QuZXJyID5vdXQvY29uZnRlc3QuZXIyCiAgICAgIGlmIHRlc3QgISAtcyBvdXQvY29uZnRlc3QuZXIyIHx8IGRpZmYgb3V0L2NvbmZ0ZXN0LmV4cCBvdXQvY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KICAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbz15ZXMKQEAgLTgyNjQsNyArOTA4Miw3IEBACiAKICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0IiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7bHRfY3ZfcHJvZ19jb21waWxlcl9jX28rc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbys6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vPW5vCkBAIC04MjgzLDE2ICs5MTAxLDE2IEBACiAgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCiAgICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCiAgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAotICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOjgyODY6ICRsdF9jb21waWxlXCIiID4mNSkKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JjUpCiAgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKICAgIGFjX3N0YXR1cz0kPwogICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiY1Ci0gICBlY2hvICIkYXNfbWU6ODI5MDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAogICAgdGhlbgogICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAogICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICAgJEVDSE8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBvdXQvY29uZnRlc3QuZXhwCisgICAgICRFQ0hPICIkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+IG91dC9jb25mdGVzdC5leHAKICAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIG91dC9jb25mdGVzdC5lcnIgPm91dC9jb25mdGVzdC5lcjIKICAgICAgaWYgdGVzdCAhIC1zIG91dC9jb25mdGVzdC5lcjIgfHwgZGlmZiBvdXQvY29uZnRlc3QuZXhwIG91dC9jb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgogICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vPXllcwpAQCAtODM1OCw3ICs5MTc2LDYgQEAKICAgaGFyZGNvZGVfZGlyZWN0PW5vCiAgIGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZT1ubwogICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPQotICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPQogICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPQogICBoYXJkY29kZV9taW51c19MPW5vCiAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9dW5zdXBwb3J0ZWQKQEAgLTg0MDUsNyArOTIyMiwzMyBAQAogICBlc2FjCiAKICAgbGRfc2hsaWJzPXllcworCisgICMgT24gc29tZSB0YXJnZXRzLCBHTlUgbGQgaXMgY29tcGF0aWJsZSBlbm91Z2ggd2l0aCB0aGUgbmF0aXZlIGxpbmtlcgorICAjIHRoYXQgd2UncmUgYmV0dGVyIG9mZiB1c2luZyB0aGUgbmF0aXZlIGludGVyZmFjZSBmb3IgYm90aC4KKyAgbHRfdXNlX2dudV9sZF9pbnRlcmZhY2U9bm8KICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeCopCisJIyBUaGUgQUlYIHBvcnQgb2YgR05VIGxkIGhhcyBhbHdheXMgYXNwaXJlZCB0byBjb21wYXRpYmlsaXR5CisJIyB3aXRoIHRoZSBuYXRpdmUgbGlua2VyLiAgSG93ZXZlciwgYXMgdGhlIHdhcm5pbmcgaW4gdGhlIEdOVSBsZAorCSMgYmxvY2sgc2F5cywgdmVyc2lvbnMgYmVmb3JlIDIuMTkuNSogY291bGRuJ3QgcmVhbGx5IGNyZWF0ZSB3b3JraW5nCisJIyBzaGFyZWQgbGlicmFyaWVzLCByZWdhcmRsZXNzIG9mIHRoZSBpbnRlcmZhY2UgdXNlZC4KKwljYXNlIGAkTEQgLXYgMj4mMWAgaW4KKwkgICpcIFwoR05VXCBCaW51dGlsc1wpXCAyLjE5LjUqKSA7OworCSAgKlwgXChHTlVcIEJpbnV0aWxzXClcIDIuWzItOV0qKSA7OworCSAgKlwgXChHTlVcIEJpbnV0aWxzXClcIFszLTldKikgOzsKKwkgICopCisJICAgIGx0X3VzZV9nbnVfbGRfaW50ZXJmYWNlPXllcworCSAgICA7OworCWVzYWMKKwk7OworICAgICAgKikKKwlsdF91c2VfZ251X2xkX2ludGVyZmFjZT15ZXMKKwk7OworICAgIGVzYWMKKyAgZmkKKworICBpZiB0ZXN0ICIkbHRfdXNlX2dudV9sZF9pbnRlcmZhY2UiID0geWVzOyB0aGVuCiAgICAgIyBJZiBhcmNoaXZlX2NtZHMgcnVucyBMRCwgbm90IENDLCB3bGFyYyBzaG91bGQgYmUgZW1wdHkKICAgICB3bGFyYz0nJHt3bH0nCiAKQEAgLTg0MjMsNiArOTI2Niw3IEBACiAgICAgZmkKICAgICBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9bm8KICAgICBjYXNlIGAkTEQgLXYgMj4mMWAgaW4KKyAgICAgICpHTlVcIGdvbGQqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7CiAgICAgICAqXCBbMDFdLiogfCAqXCAyLlswLTldLiogfCAqXCAyLjEwLiopIDs7ICMgY2F0Y2ggdmVyc2lvbnMgPCAyLjExCiAgICAgICAqXCAyLjExLjkzLjAuMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIFJINy4zIC4uLgogICAgICAgKlwgMi4xMS45Mi4wLjEyXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgTWFuZHJha2UgOC4yIC4uLgpAQCAtODQzOCwxMSArOTI4MiwxMiBAQAogCWxkX3NobGlicz1ubwogCWNhdCA8PF9MVF9FT0YgMT4mMgogCi0qKiogV2FybmluZzogdGhlIEdOVSBsaW5rZXIsIGF0IGxlYXN0IHVwIHRvIHJlbGVhc2UgMi45LjEsIGlzIHJlcG9ydGVkCisqKiogV2FybmluZzogdGhlIEdOVSBsaW5rZXIsIGF0IGxlYXN0IHVwIHRvIHJlbGVhc2UgMi4xOSwgaXMgcmVwb3J0ZWQKICoqKiB0byBiZSB1bmFibGUgdG8gcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gQUlYLgogKioqIFRoZXJlZm9yZSwgbGlidG9vbCBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgSWYgeW91Ci0qKiogcmVhbGx5IGNhcmUgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIHlvdSBtYXkgd2FudCB0byBtb2RpZnkgeW91ciBQQVRICi0qKiogc28gdGhhdCBhIG5vbi1HTlUgbGlua2VyIGlzIGZvdW5kLCBhbmQgdGhlbiByZXN0YXJ0LgorKioqIHJlYWxseSBjYXJlIGZvciBzaGFyZWQgbGlicmFyaWVzLCB5b3UgbWF5IHdhbnQgdG8gaW5zdGFsbCBiaW51dGlscworKioqIDIuMjAgb3IgYWJvdmUsIG9yIG1vZGlmeSB5b3VyIFBBVEggc28gdGhhdCBhIG5vbi1HTlUgbGlua2VyIGlzIGZvdW5kLgorKioqIFlvdSB3aWxsIHRoZW4gbmVlZCB0byByZXN0YXJ0IHRoZSBjb25maWd1cmF0aW9uIHByb2Nlc3MuCiAKIF9MVF9FT0YKICAgICAgIGZpCkBAIC04NDc4LDEwICs5MzIzLDEyIEBACiAgICAgICAjIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgKSBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywKICAgICAgICMgYXMgdGhlcmUgaXMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCiAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LS1leHBvcnQtYWxsLXN5bWJvbHMnCiAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAogICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPW5vCiAgICAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzPXllcwotICAgICAgZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltCQ0RHUlNdWyBdL3MvLipbIF1cKFteIF0qXCkvXDEgREFUQS8nXCcnIHwgJFNFRCAtZSAnXCcnL15bQUlUV11bIF0vcy8uKlsgXS8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICAgICAgZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltCQ0RHUlNdWyBdL3MvLipbIF1cKFteIF0qXCkvXDEgREFUQS87cy9eLipbIF1fX25tX19cKFteIF0qXClbIF1bXiBdKi9cMSBEQVRBLzsvXklbIF0vZDsvXltBSVRXXVsgXS9zLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICAgICAgZXhjbHVkZV9leHBzeW1zPSdbX10rR0xPQkFMX09GRlNFVF9UQUJMRV98W19dK0dMT0JBTF9fW0ZJRF1fLip8W19dK2hlYWRfW0EtWmEtejAtOV9dK19kbGx8W0EtWmEtejAtOV9dK19kbGxfaW5hbWUnCiAKICAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KICAgICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKQEAgLTg0OTksNiArOTM0NiwxMSBAQAogICAgICAgZmkKICAgICAgIDs7CiAKKyAgICBoYWlrdSopCisgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgbGlua19hbGxfZGVwbGlicz15ZXMKKyAgICAgIDs7CisKICAgICBpbnRlcml4WzMtOV0qKQogICAgICAgaGFyZGNvZGVfZGlyZWN0PW5vCiAgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCkBAIC04NTE0LDcgKzkzNjYsNyBAQAogICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nc2VkICJzLF4sXywiICRleHBvcnRfc3ltYm9scyA+JG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW1+JENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLXJldGFpbi1zeW1ib2xzLWZpbGUsJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW0gJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKICAgICAgIDs7CiAKLSAgICBnbnUqIHwgbGludXgqIHwgdHBmKiB8IGsqYnNkKi1nbnUpCisgICAgZ251KiB8IGxpbnV4KiB8IHRwZiogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCiAgICAgICB0bXBfZGlldD1ubwogICAgICAgaWYgdGVzdCAiJGhvc3Rfb3MiID0gbGludXgtZGlldGxpYmM7IHRoZW4KIAljYXNlICRjY19iYXNlbmFtZSBpbgpAQCAtODUyNCwxNSArOTM3NiwxNiBAQAogICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEVHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGwgXAogCSAmJiB0ZXN0ICIkdG1wX2RpZXQiID0gbm8KICAgICAgIHRoZW4KLQl0bXBfYWRkZmxhZz0KKwl0bXBfYWRkZmxhZz0nICRwaWNfZmxhZycKIAl0bXBfc2hhcmVkZmxhZz0nLXNoYXJlZCcKIAljYXNlICRjY19iYXNlbmFtZSwkaG9zdF9jcHUgaW4KICAgICAgICAgcGdjYyopCQkJCSMgUG9ydGxhbmQgR3JvdXAgQyBjb21waWxlcgotCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRFQ0hPIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKIAkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnJwogCSAgOzsKLQlwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSopCSMgUG9ydGxhbmQgR3JvdXAgZjc3IGFuZCBmOTAgY29tcGlsZXJzCi0JICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJEVDSE8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCXBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KiB8IHBnZm9ydHJhbiopCisJCQkJCSMgUG9ydGxhbmQgR3JvdXAgZjc3IGFuZCBmOTAgY29tcGlsZXJzCisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCiAJICB0bXBfYWRkZmxhZz0nICRwaWNfZmxhZyAtTW5vbWFpbicgOzsKIAllY2MqLGlhNjQqIHwgaWNjKixpYTY0KikJIyBJbnRlbCBDIGNvbXBpbGVyIG9uIGlhNjQKIAkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYycgOzsKQEAgLTg1NDMsMTMgKzkzOTYsMTcgQEAKIAlsZjk1KikJCQkJIyBMYWhleSBGb3J0cmFuIDguMQogCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9CiAJICB0bXBfc2hhcmVkZmxhZz0nLS1zaGFyZWQnIDs7Ci0JeGxbY0NdKikJCQkjIElCTSBYTCBDIDguMCBvbiBQUEMgKGRlYWwgd2l0aCB4bGYgYmVsb3cpCisJeGxbY0NdKiB8IGJneGxbY0NdKiB8IG1waXhsW2NDXSopICMgSUJNIFhMIEMgOC4wIG9uIFBQQyAoZGVhbCB3aXRoIHhsZiBiZWxvdykKIAkgIHRtcF9zaGFyZWRmbGFnPSctcW1rc2hyb2JqJwogCSAgdG1wX2FkZGZsYWc9IDs7CisJbnZjYyopCSMgQ3VkYSBDb21waWxlciBEcml2ZXIgMi4yCisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICBjb21waWxlcl9uZWVkc19vYmplY3Q9eWVzCisJICA7OwogCWVzYWMKIAljYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KIAkqU3VuXCBDKikJCQkjIFN1biBDIDUuOQotCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyR7d2x9LS13aG9sZS1hcmNoaXZlYG5ld19jb252ZW5pZW5jZT07IGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLXogXCIkY29udlwiIHx8IG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJEVDSE8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyR7d2x9LS13aG9sZS1hcmNoaXZlYG5ld19jb252ZW5pZW5jZT07IGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLXogXCIkY29udlwiIHx8IG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCiAJICBjb21waWxlcl9uZWVkc19vYmplY3Q9eWVzCiAJICB0bXBfc2hhcmVkZmxhZz0nLUcnIDs7CiAJKlN1blwgRiopCQkJIyBTdW4gRm9ydHJhbiA4LjMKQEAgLTg1NjUsMTcgKzk0MjIsMTYgQEAKICAgICAgICAgZmkKIAogCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JeGxmKikKKwl4bGYqIHwgYmdmKiB8IGJneGxmKiB8IG1waXhsZiopCiAJICAjIElCTSBYTCBGb3J0cmFuIDEwLjEgb24gUFBDIGNhbm5vdCBjcmVhdGUgc2hhcmVkIGxpYnMgaXRzZWxmCiAJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlIC0tbm8td2hvbGUtYXJjaGl2ZScKLQkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Ci0JICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPSctcnBhdGggJGxpYmRpcicKLQkgIGFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSAtbyAkbGliJworCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSAtbyAkbGliJwogCSAgaWYgdGVzdCAieCRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmciID0geHllczsgdGhlbgogCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgogCSAgICAgIGNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KIAkgICAgICBlY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KLQkgICAgICAkTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIC12ZXJzaW9uLXNjcmlwdCAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKKwkgICAgICAkTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSAtdmVyc2lvbi1zY3JpcHQgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCiAJICBmaQogCSAgOzsKIAllc2FjCkBAIC04NTg5LDggKzk0NDUsOCBAQAogCWFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLW8gJGxpYicKIAl3bGFyYz0KICAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKICAgICAgIGZpCiAgICAgICA7OwogCkBAIC04NjA4LDggKzk0NjQsOCBAQAogCiBfTFRfRU9GCiAgICAgICBlbGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKICAgICAgIGVsc2UKIAlsZF9zaGxpYnM9bm8KICAgICAgIGZpCkBAIC04NjU1LDggKzk1MTEsOCBAQAogCiAgICAgKikKICAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKICAgICAgIGVsc2UKIAlsZF9zaGxpYnM9bm8KICAgICAgIGZpCkBAIC04Njk2LDggKzk1NTIsMTAgQEAKICAgICAgIGVsc2UKIAkjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB3ZSBkb24ndCB3YW50IHRoZSAiLUMiIG9wdGlvbi4KIAkjIC1DIG1lYW5zIGRlbWFuZ2xlIHRvIEFJWCBubSwgYnV0IG1lYW5zIGRvbid0IGRlbWFuZ2xlIHdpdGggR05VIG5tCisJIyBBbHNvLCBBSVggbm0gdHJlYXRzIHdlYWsgZGVmaW5lZCBzeW1ib2xzIGxpa2Ugb3RoZXIgZ2xvYmFsCisJIyBkZWZpbmVkIHN5bWJvbHMsIHdoZXJlYXMgR05VIG5tIG1hcmtzIHRoZW0gYXMgIlciLgogCWlmICROTSAtViAyPiYxIHwgJEdSRVAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KLQkgIGV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkIDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkIDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisJICBleHBvcnRfc3ltYm9sc19jbWRzPSckTk0gLUJwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQgMiA9PSAiVCIpIHx8IChcJCAyID09ICJEIikgfHwgKFwkIDIgPT0gIkIiKSB8fCAoXCQgMiA9PSAiVyIpKSAmJiAoc3Vic3RyKFwkIDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkIDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCiAJZWxzZQogCSAgZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NIC1CQ3BnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkIDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkIDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCiAJZmkKQEAgLTg3ODQsNyArOTY0MiwxMyBAQAogCWFsbG93X3VuZGVmaW5lZF9mbGFnPSctYmVyb2snCiAgICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbgogICAgICAgICAjIGVtcHR5IGV4ZWN1dGFibGUuCi0gICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKyAgICAgICAgaWYgdGVzdCAiJHtsdF9jdl9haXhfbGlicGF0aCtzZXR9IiA9IHNldDsgdGhlbgorICBhaXhfbGlicGF0aD0kbHRfY3ZfYWl4X2xpYnBhdGgKK2Vsc2UKKyAgaWYgJHtsdF9jdl9haXhfbGlicGF0aF8rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAKIGludApAQCAtODc5NywyNSArOTY2MSwzMiBAQAogX0FDRU9GCiBpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CiAKLWx0X2FpeF9saWJwYXRoX3NlZD0nCi0gICAgL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8gewotCS9eMC8gewotCSAgICBzL14wICAqXCguKlwpJC9cMS8KLQkgICAgcAotCX0KLSAgICB9JwotYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCi0jIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCi1pZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuCi0gIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAotZmkKKyAgbHRfYWl4X2xpYnBhdGhfc2VkPScKKyAgICAgIC9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsKKwkgIC9eMC8geworCSAgICAgIHMvXjAgICpcKFteIF0qXCkgKiQvXDEvCisJICAgICAgcAorCSAgfQorICAgICAgfScKKyAgbHRfY3ZfYWl4X2xpYnBhdGhfPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorICAjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCisgIGlmIHRlc3QgLXogIiRsdF9jdl9haXhfbGlicGF0aF8iOyB0aGVuCisgICAgbHRfY3ZfYWl4X2xpYnBhdGhfPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorICBmaQogZmkKIHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1pZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKKyAgaWYgdGVzdCAteiAiJGx0X2N2X2FpeF9saWJwYXRoXyI7IHRoZW4KKyAgICBsdF9jdl9haXhfbGlicGF0aF89Ii91c3IvbGliOi9saWIiCisgIGZpCisKK2ZpCisKKyAgYWl4X2xpYnBhdGg9JGx0X2N2X2FpeF9saWJwYXRoXworZmkKIAogICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgotICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzIGBpZiB0ZXN0ICJ4JHthbGxvd191bmRlZmluZWRfZmxhZ30iICE9ICJ4IjsgdGhlbiAkRUNITyAiWCR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iIHwgJFhzZWQ7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKKyAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZnVuY19lY2hvX2FsbCAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKICAgICAgIGVsc2UKIAlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgogCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCkBAIC04ODI0LDcgKzk2OTUsMTMgQEAKIAllbHNlCiAJICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbgogCSAjIGVtcHR5IGV4ZWN1dGFibGUuCi0JIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKwkgaWYgdGVzdCAiJHtsdF9jdl9haXhfbGlicGF0aCtzZXR9IiA9IHNldDsgdGhlbgorICBhaXhfbGlicGF0aD0kbHRfY3ZfYWl4X2xpYnBhdGgKK2Vsc2UKKyAgaWYgJHtsdF9jdl9haXhfbGlicGF0aF8rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAKIGludApAQCAtODgzNywzMCArOTcxNCw0MiBAQAogX0FDRU9GCiBpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CiAKLWx0X2FpeF9saWJwYXRoX3NlZD0nCi0gICAgL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8gewotCS9eMC8gewotCSAgICBzL14wICAqXCguKlwpJC9cMS8KLQkgICAgcAotCX0KLSAgICB9JwotYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCi0jIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCi1pZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuCi0gIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAotZmkKKyAgbHRfYWl4X2xpYnBhdGhfc2VkPScKKyAgICAgIC9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsKKwkgIC9eMC8geworCSAgICAgIHMvXjAgICpcKFteIF0qXCkgKiQvXDEvCisJICAgICAgcAorCSAgfQorICAgICAgfScKKyAgbHRfY3ZfYWl4X2xpYnBhdGhfPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorICAjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCisgIGlmIHRlc3QgLXogIiRsdF9jdl9haXhfbGlicGF0aF8iOyB0aGVuCisgICAgbHRfY3ZfYWl4X2xpYnBhdGhfPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorICBmaQogZmkKIHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1pZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKKyAgaWYgdGVzdCAteiAiJGx0X2N2X2FpeF9saWJwYXRoXyI7IHRoZW4KKyAgICBsdF9jdl9haXhfbGlicGF0aF89Ii91c3IvbGliOi9saWIiCisgIGZpCisKK2ZpCisKKyAgYWl4X2xpYnBhdGg9JGx0X2N2X2FpeF9saWJwYXRoXworZmkKIAogCSBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgogCSAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKIAkgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KIAkgIG5vX3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tYmVybm90b2snCiAJICBhbGxvd191bmRlZmluZWRfZmxhZz0nICR7d2x9LWJlcm9rJwotCSAgIyBFeHBvcnRlZCBzeW1ib2xzIGNhbiBiZSBwdWxsZWQgaW50byBzaGFyZWQgb2JqZWN0cyBmcm9tIGFyY2hpdmVzCi0JICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJGNvbnZlbmllbmNlJworCSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorCSAgICAjIFdlIG9ubHkgdXNlIHRoaXMgY29kZSBmb3IgR05VIGxkcyB0aGF0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlLgorCSAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJHt3bH0tLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICBlbHNlCisJICAgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcworCSAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJGNvbnZlbmllbmNlJworCSAgZmkKIAkgIGFyY2hpdmVfY21kc19uZWVkX2xjPXllcwogCSAgIyBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcyBpdHMgc2hhcmVkIGxpYnJhcmllcy4KIAkgIGFyY2hpdmVfZXhwc3ltX2NtZHM9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAke3dsfS1ibm9lbnRyeSAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzJHthbGxvd191bmRlZmluZWRfZmxhZ31+JEFSICRBUl9GTEFHUyAkb3V0cHV0X29iamRpci8kbGlibmFtZSRyZWxlYXNlLmEgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKQEAgLTg4OTIsMjAgKzk3ODEsNjQgQEAKICAgICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCiAgICAgICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCiAgICAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgotICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nICcKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgotICAgICAgbGliZXh0PWxpYgotICAgICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5kbGwgZmlsZXMsIG5vdCAuc28gZmlsZXMuCi0gICAgICBzaHJleHRfY21kcz0iLmRsbCIKLSAgICAgICMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1vICRsaWIgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzIGAkRUNITyAiWCRkZXBsaWJzIiB8ICRYc2VkIC1lICdcJydzLyAtbGMkLy8nXCcnYCAtbGluayAtZGxsfmxpbmtuYW1lcz0nCi0gICAgICAjIFRoZSBsaW5rZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgLmxpYiBmaWxlIGlmIHdlIGJ1aWxkIGEgRExMLgotICAgICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0ndHJ1ZScKLSAgICAgICMgRklYTUU6IFNob3VsZCBsZXQgdGhlIHVzZXIgc3BlY2lmeSB0aGUgbGliIHByb2dyYW0uCi0gICAgICBvbGRfYXJjaGl2ZV9jbWRzPSdsaWIgLU9VVDokb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMnCi0gICAgICBmaXhfc3JjZmlsZV9wYXRoPSdgY3lncGF0aCAtdyAiJHNyY2ZpbGUiYCcKLSAgICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXM9eWVzCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgY2wqKQorCSMgTmF0aXZlIE1TVkMKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScgJworCWFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCisJYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcworCWZpbGVfbGlzdF9zcGVjPSdAJworCSMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCisJbGliZXh0PWxpYgorCSMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgorCXNocmV4dF9jbWRzPSIuZGxsIgorCSMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRjb21waWxlcl9mbGFncyAkZGVwbGlicyAtV2wsLWRsbH5saW5rbmFtZXM9JworCWFyY2hpdmVfZXhwc3ltX2NtZHM9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICAgIHNlZCAtbiAtZSAncy9cXFxcXFxcKC4qXFxcXFxcXCkvLWxpbmtcXFwgLUVYUE9SVDpcXFxcXFxcMS8nIC1lICcxXFxcIXAnIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHA7CisJICBlbHNlCisJICAgIHNlZCAtZSAncy9cXFxcXFxcKC4qXFxcXFxcXCkvLWxpbmtcXFwgLUVYUE9SVDpcXFxcXFxcMS8nIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHA7CisJICBmaX4KKwkgICRDQyAtbyAkdG9vbF9vdXRwdXRfb2JqZGlyJHNvbmFtZSAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgJGRlcGxpYnMgIkAkdG9vbF9vdXRwdXRfb2JqZGlyJHNvbmFtZS5leHAiIC1XbCwtRExMLC1JTVBMSUI6IiR0b29sX291dHB1dF9vYmpkaXIkbGlibmFtZS5kbGwubGliIn4KKwkgIGxpbmtuYW1lcz0nCisJIyBUaGUgbGlua2VyIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgYnVpbGQgYSBzdGF0aWMgbGliIGlmIHdlIGJ1aWxkIGEgRExMLgorCSMgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzLCApPSd0cnVlJworCWVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXM9eWVzCisJZXhjbHVkZV9leHBzeW1zPSdfTlVMTF9JTVBPUlRfREVTQ1JJUFRPUnxfSU1QT1JUX0RFU0NSSVBUT1JfLionCisJZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltCQ0RHUlNdWyBdL3MvLipbIF1cKFteIF0qXCkvXDEsREFUQS8nXCcnIHwgJFNFRCAtZSAnXCcnL15bQUlUV11bIF0vcy8uKlsgXS8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworCSMgRG9uJ3QgdXNlIHJhbmxpYgorCW9sZF9wb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA2NDQgJG9sZGxpYicKKwlwb3N0bGlua19jbWRzPSdsdF9vdXRwdXRmaWxlPSJAT1VUUFVUQCJ+CisJICBsdF90b29sX291dHB1dGZpbGU9IkBUT09MX09VVFBVVEAifgorCSAgY2FzZSAkbHRfb3V0cHV0ZmlsZSBpbgorCSAgICAqLmV4ZXwqLkVYRSkgOzsKKwkgICAgKikKKwkgICAgICBsdF9vdXRwdXRmaWxlPSIkbHRfb3V0cHV0ZmlsZS5leGUiCisJICAgICAgbHRfdG9vbF9vdXRwdXRmaWxlPSIkbHRfdG9vbF9vdXRwdXRmaWxlLmV4ZSIKKwkgICAgICA7OworCSAgZXNhY34KKwkgIGlmIHRlc3QgIiRNQU5JRkVTVF9UT09MIiAhPSAiOiIgJiYgdGVzdCAtZiAiJGx0X291dHB1dGZpbGUubWFuaWZlc3QiOyB0aGVuCisJICAgICRNQU5JRkVTVF9UT09MIC1tYW5pZmVzdCAiJGx0X3Rvb2xfb3V0cHV0ZmlsZS5tYW5pZmVzdCIgLW91dHB1dHJlc291cmNlOiIkbHRfdG9vbF9vdXRwdXRmaWxlIiB8fCBleGl0IDE7CisJICAgICRSTSAiJGx0X291dHB1dGZpbGUubWFuaWZlc3QiOworCSAgZmknCisJOzsKKyAgICAgICopCisJIyBBc3N1bWUgTVNWQyB3cmFwcGVyCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nICcKKwlhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAorCSMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCisJbGliZXh0PWxpYgorCSMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgorCXNocmV4dF9jbWRzPSIuZGxsIgorCSMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtbyAkbGliICRsaWJvYmpzICRjb21waWxlcl9mbGFncyBgZnVuY19lY2hvX2FsbCAiJGRlcGxpYnMiIHwgJFNFRCAnXCcncy8gLWxjJC8vJ1wnJ2AgLWxpbmsgLWRsbH5saW5rbmFtZXM9JworCSMgVGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgYnVpbGQgYSAubGliIGZpbGUgaWYgd2UgYnVpbGQgYSBETEwuCisJb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0ndHJ1ZScKKwkjIEZJWE1FOiBTaG91bGQgbGV0IHRoZSB1c2VyIHNwZWNpZnkgdGhlIGxpYiBwcm9ncmFtLgorCW9sZF9hcmNoaXZlX2NtZHM9J2xpYiAtT1VUOiRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicycKKwllbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzPXllcworCTs7CisgICAgICBlc2FjCiAgICAgICA7OwogCiAgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKQEAgLTg5MTUsNyArOTg0OCwxMiBAQAogICBoYXJkY29kZV9kaXJlY3Q9bm8KICAgaGFyZGNvZGVfYXV0b21hdGljPXllcwogICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPXVuc3VwcG9ydGVkCi0gIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScnCisgIGlmIHRlc3QgIiRsdF9jdl9sZF9mb3JjZV9sb2FkIiA9ICJ5ZXMiOyB0aGVuCisgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9J2Bmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSAke3dsfS1mb3JjZV9sb2FkLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgJworCisgIGVsc2UKKyAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJworICBmaQogICBsaW5rX2FsbF9kZXBsaWJzPXllcwogICBhbGxvd191bmRlZmluZWRfZmxhZz0iJF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkIgogICBjYXNlICRjY19iYXNlbmFtZSBpbgpAQCAtODkyMyw3ICs5ODYxLDcgQEAKICAgICAgKikgX2x0X2Rhcl9jYW5fc2hhcmVkPSRHQ0MgOzsKICAgZXNhYwogICBpZiB0ZXN0ICIkX2x0X2Rhcl9jYW5fc2hhcmVkIiA9ICJ5ZXMiOyB0aGVuCi0gICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9ZWNobworICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPWZ1bmNfZWNob19hbGwKICAgICBhcmNoaXZlX2NtZHM9IlwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nICRfbHRfZGFyX3NpbmdsZV9tb2Qke19sdF9kc3ltdXRpbH0iCiAgICAgbW9kdWxlX2NtZHM9IlwkQ0MgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiAtYnVuZGxlIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyR7X2x0X2RzeW11dGlsfSIKICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSJzZWQgJ3MsXixfLCcgPCBcJGV4cG9ydF9zeW1ib2xzID4gXCRvdXRwdXRfb2JqZGlyL1wke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltflwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nICR7X2x0X2Rhcl9zaW5nbGVfbW9kfSR7X2x0X2Rhcl9leHBvcnRfc3ltc30ke19sdF9kc3ltdXRpbH0iCkBAIC04OTQxLDEwICs5ODc5LDYgQEAKICAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KICAgICAgIDs7CiAKLSAgICBmcmVlYnNkMSopCi0gICAgICBsZF9zaGxpYnM9bm8KLSAgICAgIDs7Ci0KICAgICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKICAgICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KICAgICAjIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nLCBhbmQgaGVscHMgc2lnbmlmaWNhbnRseSAoYXQgdGhlIGNvc3Qgb2YgYSBsaXR0bGUKQEAgLTg5NTcsNyArOTg5MSw3IEBACiAgICAgICA7OwogCiAgICAgIyBVbmZvcnR1bmF0ZWx5LCBvbGRlciB2ZXJzaW9ucyBvZiBGcmVlQlNEIDIgZG8gbm90IGhhdmUgdGhpcyBmZWF0dXJlLgotICAgIGZyZWVic2QyKikKKyAgICBmcmVlYnNkMi4qKQogICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwogICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcwogICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKQEAgLTg5NjYsNyArOTkwMCw3IEBACiAKICAgICAjIEZyZWVCU0QgMyBhbmQgZ3JlYXRlciB1c2VzIGdjYyAtc2hhcmVkIHRvIGRvIHNoYXJlZCBsaWJyYXJpZXMuCiAgICAgZnJlZWJzZCogfCBkcmFnb25mbHkqKQotICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwogICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJwogICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcwogICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwpAQCAtODk3NCw3ICs5OTA4LDcgQEAKIAogICAgIGhwdXg5KikKICAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JYXJjaGl2ZV9jbWRzPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworCWFyY2hpdmVfY21kcz0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgJHBpY19mbGFnICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCiAgICAgICBlbHNlCiAJYXJjaGl2ZV9jbWRzPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kTEQgLWIgK2IgJGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKICAgICAgIGZpCkBAIC04OTg5LDE0ICs5OTIzLDEzIEBACiAgICAgICA7OwogCiAgICAgaHB1eDEwKikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwogICAgICAgZWxzZQogCWFyY2hpdmVfY21kcz0nJExEIC1iICtoICRzb25hbWUgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKICAgICAgIGZpCiAgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KIAloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKLQloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPScrYiAkbGliZGlyJwogCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgogCWhhcmRjb2RlX2RpcmVjdD15ZXMKIAloYXJkY29kZV9kaXJlY3RfYWJzb2x1dGU9eWVzCkBAIC05MDA4LDE2ICs5OTQxLDE2IEBACiAgICAgICA7OwogCiAgICAgaHB1eDExKikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgogCWNhc2UgJGhvc3RfY3B1IGluCiAJaHBwYSo2NCopCiAJICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwogCSAgOzsKIAlpYTY0KikKLQkgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKIAkgIDs7CiAJKikKLQkgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCiAJICA7OwogCWVzYWMKICAgICAgIGVsc2UKQEAgLTkwMjksNyArOTk2Miw0NiBAQAogCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCiAJICA7OwogCSopCi0JICBhcmNoaXZlX2NtZHM9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCisJICAjIE9sZGVyIHZlcnNpb25zIG9mIHRoZSAxMS4wMCBjb21waWxlciBkbyBub3QgdW5kZXJzdGFuZCAtYiB5ZXQKKwkgICMgKEhQOTI0NTMtMDEgQS4xMS4wMS4yMCBkb2Vzbid0LCBIUDkyNDUzLTAxIEIuMTEuWC4zNTE3NS0zNTE3Ni5HUCBkb2VzKQorCSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkQ0MgdW5kZXJzdGFuZHMgLWIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJENDIHVuZGVyc3RhbmRzIC1iLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfX2IrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9wcm9nX2NvbXBpbGVyX19iPW5vCisgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgTERGTEFHUz0iJExERkxBR1MgLWIiCisgICBlY2hvICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KKyAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKyAgICAgICAkRUNITyAiJF9sdF9saW5rZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID4gY29uZnRlc3QuZXhwCisgICAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCisgICAgICAgaWYgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfX2I9eWVzCisgICAgICAgZmkKKyAgICAgZWxzZQorICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfX2I9eWVzCisgICAgIGZpCisgICBmaQorICAgJFJNIC1yIGNvbmZ0ZXN0KgorICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9fYiIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfX2IiID4mNjsgfQorCitpZiB0ZXN0IHgiJGx0X2N2X3Byb2dfY29tcGlsZXJfX2IiID0geHllczsgdGhlbgorICAgIGFyY2hpdmVfY21kcz0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCitlbHNlCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworZmkKKwogCSAgOzsKIAllc2FjCiAgICAgICBmaQpAQCAtOTA1NywyNiArMTAwMjksMzkgQEAKIAogICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCiAgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nIiB8ICRYc2VkYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwogCSMgVHJ5IHRvIHVzZSB0aGUgLWV4cG9ydGVkX3N5bWJvbCBsZCBvcHRpb24sIGlmIGl0IGRvZXMgbm90CiAJIyB3b3JrLCBhc3N1bWUgdGhhdCAtZXhwb3J0c19maWxlIGRvZXMgbm90IHdvcmsgZWl0aGVyIGFuZAogCSMgaW1wbGljaXRseSBleHBvcnQgYWxsIHN5bWJvbHMuCi0gICAgICAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCi0gICAgICAgIExERkxBR1M9IiRMREZMQUdTIC1zaGFyZWQgJHt3bH0tZXhwb3J0ZWRfc3ltYm9sICR7d2x9Zm9vICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfS9kZXYvbnVsbCIKLSAgICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorCSMgVGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgZm9yIGFsbCBsYW5ndWFnZXMsIHNvIG5vIHBlci10YWcgY2FjaGUgdmFyaWFibGUuCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSAkaG9zdF9vcyBsaW5rZXIgYWNjZXB0cyAtZXhwb3J0ZWRfc3ltYm9sIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlICRob3N0X29zIGxpbmtlciBhY2NlcHRzIC1leHBvcnRlZF9zeW1ib2wuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfaXJpeF9leHBvcnRlZF9zeW1ib2wrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorCSAgIExERkxBR1M9IiRMREZMQUdTIC1zaGFyZWQgJHt3bH0tZXhwb3J0ZWRfc3ltYm9sICR7d2x9Zm9vICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfS9kZXYvbnVsbCIKKwkgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCi1pbnQgZm9vKHZvaWQpIHt9CitpbnQgZm9vICh2b2lkKSB7IHJldHVybiAwOyB9CiBfQUNFT0YKIGlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nIiB8ICRYc2VkYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAke3dsfS1leHBvcnRzX2ZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLQorICBsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbD15ZXMKK2Vsc2UKKyAgbHRfY3ZfaXJpeF9leHBvcnRlZF9zeW1ib2w9bm8KIGZpCiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotICAgICAgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorICAgICAgICAgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfaXJpeF9leHBvcnRlZF9zeW1ib2wiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbCIgPiY2OyB9CisJaWYgdGVzdCAiJGx0X2N2X2lyaXhfZXhwb3J0ZWRfc3ltYm9sIiA9IHllczsgdGhlbgorICAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgJHt3bH0tZXhwb3J0c19maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJZmkKICAgICAgIGVsc2UKLQlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciIHwgJFhzZWRgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nIiB8ICRYc2VkYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1leHBvcnRzX2ZpbGUgJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLWV4cG9ydHNfZmlsZSAkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKICAgICAgIGZpCiAgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sYz0nbm8nCiAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCkBAIC05MTM4LDE3ICsxMDEyMywxNyBAQAogICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwogICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgICBhcmNoaXZlX2NtZHM9JyRFQ0hPICJMSUJSQVJZICRsaWJuYW1lIElOSVRJTlNUQU5DRSIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JEVDSE8gIkRFU0NSSVBUSU9OIFwiJGxpYm5hbWVcIiIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRFQ0hPIERBVEEgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRFQ0hPICIgU0lOR0xFIE5PTlNIQVJFRCIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRFQ0hPIEVYUE9SVFMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVteGV4cCAkbGlib2JqcyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JENDIC1aZGxsIC1aY3J0ZGxsIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKKyAgICAgIGFyY2hpdmVfY21kcz0nJEVDSE8gIkxJQlJBUlkgJGxpYm5hbWUgSU5JVElOU1RBTkNFIiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kRUNITyAiREVTQ1JJUFRJT04gXCIkbGlibmFtZVwiIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZWNobyBEQVRBID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lY2hvICIgU0lOR0xFIE5PTlNIQVJFRCIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVjaG8gRVhQT1JUUyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZW14ZXhwICRsaWJvYmpzID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kQ0MgLVpkbGwgLVpjcnRkbGwgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJwogICAgICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0nZW14aW1wIC1vICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmEgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJwogICAgICAgOzsKIAogICAgIG9zZjMqKQogICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KIAlhbGxvd191bmRlZmluZWRfZmxhZz0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWCR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyIgfCAkWHNlZGAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCiAgICAgICBlbHNlCiAJYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCi0JYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciIHwgJFhzZWRgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCiAgICAgICBmaQogICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9J25vJwogICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwpAQCAtOTE1OCwxMyArMTAxNDMsMTMgQEAKICAgICBvc2Y0KiB8IG9zZjUqKQkjIGFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIC1tc3ltIGZsYWcKICAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCiAJYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWCR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyIgfCAkWHNlZGAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCiAJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwogICAgICAgZWxzZQogCWFsbG93X3VuZGVmaW5lZF9mbGFnPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJwotCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nIiB8ICRYc2VkYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwogCWFyY2hpdmVfZXhwc3ltX2NtZHM9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICIlcyAlc1xcbiIgLWV4cG9ydGVkX3N5bWJvbCAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZTsgcHJpbnRmICIlc1xcbiIgIi1oaWRkZW4iPj4gJGxpYi5leHB+Ci0JJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAke3dsfS1pbnB1dCAke3dsfSRsaWIuZXhwICRjb21waWxlcl9mbGFncyAkbGlib2JqcyAkZGVwbGlicyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciIHwgJFhzZWRgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4kUk0gJGxpYi5leHAnCisJJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAke3dsfS1pbnB1dCAke3dsfSRsaWIuZXhwICRjb21waWxlcl9mbGFncyAkbGlib2JqcyAkZGVwbGlicyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4kUk0gJGxpYi5leHAnCiAKIAkjIEJvdGggYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5CiAJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLXJwYXRoICRsaWJkaXInCkBAIC05MTc3LDkgKzEwMTYyLDkgQEAKICAgICAgIG5vX3VuZGVmaW5lZF9mbGFnPScgLXogZGVmcycKICAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCiAJd2xhcmM9JyR7d2x9JwotCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHt3bH0teiAke3dsfXRleHQgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0teiAke3dsfXRleHQgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCiAJYXJjaGl2ZV9leHBzeW1fY21kcz0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgotCSAgJENDIC1zaGFyZWQgJHt3bH0teiAke3dsfXRleHQgJHt3bH0tTSAke3dsfSRsaWIuZXhwICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKwkgICRDQyAtc2hhcmVkICRwaWNfZmxhZyAke3dsfS16ICR7d2x9dGV4dCAke3dsfS1NICR7d2x9JGxpYi5leHAgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJwogICAgICAgZWxzZQogCWNhc2UgYCRDQyAtViAyPiYxYCBpbgogCSoiQ29tcGlsZXJzIDUuMCIqKQpAQCAtOTM2Nyw0NCArMTAzNTIsNTAgQEAKICAgICAgICMgdG8gbGQsIGRvbid0IGFkZCAtbGMgYmVmb3JlIC1sZ2NjLgogICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4iID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluLi4uICIgPiY2OyB9Ci0gICAgICAkUk0gY29uZnRlc3QqCi0gICAgICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKK2lmICR7bHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICAkUk0gY29uZnRlc3QqCisJZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CiAKLSAgICAgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQorCWlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQogICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQogICBhY19zdGF0dXM9JD8KICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gMj5jb25mdGVzdC5lcnI7IHRoZW4KLSAgICAgICAgc29uYW1lPWNvbmZ0ZXN0Ci0gICAgICAgIGxpYj1jb25mdGVzdAotICAgICAgICBsaWJvYmpzPWNvbmZ0ZXN0LiRhY19vYmpleHQKLSAgICAgICAgZGVwbGlicz0KLSAgICAgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wKLQlwaWNfZmxhZz0kbHRfcHJvZ19jb21waWxlcl9waWMKLSAgICAgICAgY29tcGlsZXJfZmxhZ3M9LXYKLSAgICAgICAgbGlua2VyX2ZsYWdzPS12Ci0gICAgICAgIHZlcnN0cmluZz0KLSAgICAgICAgb3V0cHV0X29iamRpcj0uCi0gICAgICAgIGxpYm5hbWU9Y29uZnRlc3QKLSAgICAgICAgbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kYWxsb3dfdW5kZWZpbmVkX2ZsYWcKLSAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Ci0gICAgICAgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhcmNoaXZlX2NtZHMgMlw+XCYxIFx8ICRHUkVQIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjFcIiI7IH0gPiY1CisJICBzb25hbWU9Y29uZnRlc3QKKwkgIGxpYj1jb25mdGVzdAorCSAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0CisJICBkZXBsaWJzPQorCSAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wKKwkgIHBpY19mbGFnPSRsdF9wcm9nX2NvbXBpbGVyX3BpYworCSAgY29tcGlsZXJfZmxhZ3M9LXYKKwkgIGxpbmtlcl9mbGFncz0tdgorCSAgdmVyc3RyaW5nPQorCSAgb3V0cHV0X29iamRpcj0uCisJICBsaWJuYW1lPWNvbmZ0ZXN0CisJICBsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnPSRhbGxvd191bmRlZmluZWRfZmxhZworCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9CisJICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYXJjaGl2ZV9jbWRzIDJcPlwmMSBcfCAkR1JFUCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxXCIiOyB9ID4mNQogICAoZXZhbCAkYXJjaGl2ZV9jbWRzIDJcPlwmMSBcfCAkR1JFUCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxKSAyPiY1CiAgIGFjX3N0YXR1cz0kPwogICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQotICAgICAgICB0aGVuCi0JICBhcmNoaXZlX2NtZHNfbmVlZF9sYz1ubwotICAgICAgICBlbHNlCi0JICBhcmNoaXZlX2NtZHNfbmVlZF9sYz15ZXMKLSAgICAgICAgZmkKLSAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKLSAgICAgIGVsc2UKLSAgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgICBmaQotICAgICAgJFJNIGNvbmZ0ZXN0KgotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhcmNoaXZlX2NtZHNfbmVlZF9sYyIgPiY1Ci0kYXNfZWNobyAiJGFyY2hpdmVfY21kc19uZWVkX2xjIiA+JjY7IH0KKwkgIHRoZW4KKwkgICAgbHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGM9bm8KKwkgIGVsc2UKKwkgICAgbHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGM9eWVzCisJICBmaQorCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKKwllbHNlCisJICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKwlmaQorCSRSTSBjb25mdGVzdCoKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGMiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYyIgPiY2OyB9CisgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sYz0kbHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGMKICAgICAgIDs7CiAgICAgZXNhYwogICBmaQpAQCAtOTU2MiwxMSArMTA1NTMsNiBAQAogCiAKIAotCi0KLQotCi0KICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzLi4uICIgPiY2OyB9CiAKQEAgLTk1NzUsMTYgKzEwNTYxLDIzIEBACiAgICAgZGFyd2luKikgbHRfYXdrX2FyZz0iL15saWJyYXJpZXM6LywvTFIvIiA7OwogICAgICopIGx0X2F3a19hcmc9Ii9ebGlicmFyaWVzOi8iIDs7CiAgIGVzYWMKLSAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGF3ayAkbHRfYXdrX2FyZyB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnImAKLSAgaWYgJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRHUkVQICc7JyA+L2Rldi9udWxsIDsgdGhlbgorICBjYXNlICRob3N0X29zIGluCisgICAgbWluZ3cqIHwgY2VnY2MqKSBsdF9zZWRfc3RyaXBfZXE9InMsPVwoW0EtWmEtel06XCksXDEsZyIgOzsKKyAgICAqKSBsdF9zZWRfc3RyaXBfZXE9InMsPS8sLyxnIiA7OworICBlc2FjCisgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBhd2sgJGx0X2F3a19hcmcgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICRsdF9zZWRfc3RyaXBfZXFgCisgIGNhc2UgJGx0X3NlYXJjaF9wYXRoX3NwZWMgaW4KKyAgKlw7KikKICAgICAjIGlmIHRoZSBwYXRoIGNvbnRhaW5zICI7IiB0aGVuIHdlIGFzc3VtZSBpdCB0byBiZSB0aGUgc2VwYXJhdG9yCiAgICAgIyBvdGhlcndpc2UgZGVmYXVsdCB0byB0aGUgc3RhbmRhcmQgcGF0aCBzZXBhcmF0b3IgKGkuZS4gIjoiKSAtIGl0IGlzCiAgICAgIyBhc3N1bWVkIHRoYXQgbm8gcGFydCBvZiBhIG5vcm1hbCBwYXRobmFtZSBjb250YWlucyAiOyIgYnV0IHRoYXQgc2hvdWxkCiAgICAgIyBva2F5IGluIHRoZSByZWFsIHdvcmxkIHdoZXJlICI7IiBpbiBkaXJwYXRocyBpcyBpdHNlbGYgcHJvYmxlbWF0aWMuCi0gICAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAotICBlbHNlCi0gICAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAotICBmaQorICAgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICdzLzsvIC9nJ2AKKyAgICA7OworICAqKQorICAgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgIDs7CisgIGVzYWMKICAgIyBPaywgbm93IHdlIGhhdmUgdGhlIHBhdGgsIHNlcGFyYXRlZCBieSBzcGFjZXMsIHdlIGNhbiBzdGVwIHRocm91Z2ggaXQKICAgIyBhbmQgYWRkIG11bHRpbGliIGRpciBpZiBuZWNlc3NhcnkuCiAgIGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjPQpAQCAtOTU5Nyw3ICsxMDU5MCw3IEBACiAJbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWM9IiRsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYyAkbHRfc3lzX3BhdGgiCiAgICAgZmkKICAgZG9uZQotICBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAkbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWMgfCBhd2sgJworICBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjIiB8IGF3ayAnCiBCRUdJTiB7UlM9IiAiOyBGUz0iL3xcbiI7fSB7CiAgIGx0X2Zvbz0iIjsKICAgbHRfY291bnQ9MDsKQEAgLTk2MTcsNyArMTA2MTAsMTMgQEAKICAgaWYgKGx0X2ZvbyAhPSAiIikgeyBsdF9mcmVxW2x0X2Zvb10rKzsgfQogICBpZiAobHRfZnJlcVtsdF9mb29dID09IDEpIHsgcHJpbnQgbHRfZm9vOyB9CiB9J2AKLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAkbHRfc2VhcmNoX3BhdGhfc3BlY2AKKyAgIyBBV0sgcHJvZ3JhbSBhYm92ZSBlcnJvbmVvdXNseSBwcmVwZW5kcyAnLycgdG8gQzovZG9zL3BhdGhzCisgICMgZm9yIHRoZXNlIGhvc3RzLgorICBjYXNlICRob3N0X29zIGluCisgICAgbWluZ3cqIHwgY2VnY2MqKSBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJGx0X3NlYXJjaF9wYXRoX3NwZWMiIHxcCisgICAgICAkU0VEICdzLC9cKFtBLVphLXpdOlwpLFwxLGcnYCA7OworICBlc2FjCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRsdF9OTDJTUGAKIGVsc2UKICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgogZmkKQEAgLTk2NDMsNyArMTA2NDIsNyBAQAogCiBjYXNlICRob3N0X29zIGluCiBhaXgzKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4CisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lLmEnCiAgIHNobGlicGF0aF92YXI9TElCUEFUSAogCkBAIC05NjUyLDcgKzEwNjUxLDcgQEAKICAgOzsKIAogYWl4WzQtOV0qKQotICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgogICBuZWVkX2xpYl9wcmVmaXg9bm8KICAgbmVlZF92ZXJzaW9uPW5vCiAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKQEAgLTk3MDUsNyArMTA3MDQsNyBAQAogICBtNjhrKQogICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCiAgICAgIyBDcmVhdGUgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSBlbnRyaWVzIGluIC9zeXMvbGlicy4KLSAgICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRFQ0hPICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRSTSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKKyAgICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YGZ1bmNfZWNob19hbGwgIiRsaWIiIHwgJFNFRCAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRSTSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKICAgICA7OwogICBlc2FjCiAgIDs7CkBAIC05NzE3LDcgKzEwNzE2LDcgQEAKICAgOzsKIAogYnNkaVs0NV0qKQotICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgogICBuZWVkX3ZlcnNpb249bm8KICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCiAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCkBAIC05NzM2LDggKzEwNzM1LDkgQEAKICAgbmVlZF92ZXJzaW9uPW5vCiAgIG5lZWRfbGliX3ByZWZpeD1ubwogCi0gIGNhc2UgJEdDQywkaG9zdF9vcyBpbgotICB5ZXMsY3lnd2luKiB8IHllcyxtaW5ndyogfCB5ZXMscHczMiogfCB5ZXMsY2VnY2MqKQorICBjYXNlICRHQ0MsJGNjX2Jhc2VuYW1lIGluCisgIHllcywqKQorICAgICMgZ2NjCiAgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwuYScKICAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCiAgICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+CkBAIC05NzU4LDM2ICsxMDc1OCw4MyBAQAogICAgIGN5Z3dpbiopCiAgICAgICAjIEN5Z3dpbiBETExzIHVzZSAnY3lnJyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKICAgICAgIHNvbmFtZV9zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvY3lnLydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIgL2xpYi93MzJhcGkgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC91c3IvbGliL3czMmFwaSIKICAgICAgIDs7CiAgICAgbWluZ3cqIHwgY2VnY2MqKQogICAgICAgIyBNaW5HVyBETExzIHVzZSB0cmFkaXRpb25hbCAnbGliJyBwcmVmaXgKICAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8ICRHUkVQICJebGlicmFyaWVzOiIgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCi0gICAgICBpZiAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkR1JFUCAnO1tjLXpDLVpdOi8nID4vZGV2L251bGw7IHRoZW4KLSAgICAgICAgIyBJdCBpcyBtb3N0IHByb2JhYmx5IGEgV2luZG93cyBmb3JtYXQgUEFUSCBwcmludGVkIGJ5Ci0gICAgICAgICMgbWluZ3cgZ2NjLCBidXQgd2UgYXJlIHJ1bm5pbmcgb24gQ3lnd2luLiBHY2MgcHJpbnRzIGl0cyBzZWFyY2gKLSAgICAgICAgIyBwYXRoIHdpdGggOyBzZXBhcmF0b3JzLCBhbmQgd2l0aCBkcml2ZSBsZXR0ZXJzLiBXZSBjYW4gaGFuZGxlIHRoZQotICAgICAgICAjIGRyaXZlIGxldHRlcnMgKGN5Z3dpbiBmaWxldXRpbHMgdW5kZXJzdGFuZHMgdGhlbSksIHNvIGxlYXZlIHRoZW0sCi0gICAgICAgICMgZXNwZWNpYWxseSBhcyB3ZSBtaWdodCBwYXNzIGZpbGVzIGZvdW5kIHRoZXJlIHRvIGEgbWluZ3cgb2JqZHVtcCwKLSAgICAgICAgIyB3aGljaCB3b3VsZG4ndCB1bmRlcnN0YW5kIGEgY3lnd2luaWZpZWQgcGF0aC4gQWhoLgotICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAotICAgICAgZWxzZQotICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAotICAgICAgZmkKICAgICAgIDs7CiAgICAgcHczMiopCiAgICAgICAjIHB3MzIgRExMcyB1c2UgJ3B3JyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKICAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL3B3LydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKICAgICAgIDs7CiAgICAgZXNhYworICAgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCisgICAgOzsKKworICAqLGNsKikKKyAgICAjIE5hdGl2ZSBNU1ZDCisgICAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9LmRsbC5saWInCisKKyAgICBjYXNlICRidWlsZF9vcyBpbgorICAgIG1pbmd3KikKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0KKyAgICAgIGx0X3NhdmVfaWZzPSRJRlMKKyAgICAgIElGUz0nOycKKyAgICAgIGZvciBsdF9wYXRoIGluICRMSUIKKyAgICAgIGRvCisgICAgICAgIElGUz0kbHRfc2F2ZV9pZnMKKyAgICAgICAgIyBMZXQgRE9TIHZhcmlhYmxlIGV4cGFuc2lvbiBwcmludCB0aGUgc2hvcnQgOC4zIHN0eWxlIGZpbGUgbmFtZS4KKyAgICAgICAgbHRfcGF0aD1gY2QgIiRsdF9wYXRoIiAyPi9kZXYvbnVsbCAmJiBjbWQgLy9DICJmb3IgJWkgaW4gKCIuIikgZG8gQGVjaG8gJX5zaSJgCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAkbHRfcGF0aCIKKyAgICAgIGRvbmUKKyAgICAgIElGUz0kbHRfc2F2ZV9pZnMKKyAgICAgICMgQ29udmVydCB0byBNU1lTIHN0eWxlLgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBzZWQgLWUgJ3N8XFxcXHwvfGcnIC1lICdzfCBcXChbYS16QS1aXVxcKTp8IC9cXDF8ZycgLWUgJ3N8XiB8fCdgCisgICAgICA7OworICAgIGN5Z3dpbiopCisgICAgICAjIENvbnZlcnQgdG8gdW5peCBmb3JtLCB0aGVuIHRvIGRvcyBmb3JtLCB0aGVuIGJhY2sgdG8gdW5peCBmb3JtCisgICAgICAjIGJ1dCB0aGlzIHRpbWUgZG9zIHN0eWxlIChubyBzcGFjZXMhKSBzbyB0aGF0IHRoZSB1bml4IGZvcm0gbG9va3MKKyAgICAgICMgbGlrZSAvY3lnZHJpdmUvYy9QUk9HUkF+MTovY3lnZHIuLi4KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gY3lncGF0aCAtLXBhdGggLS11bml4ICIkTElCImAKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gY3lncGF0aCAtLXBhdGggLS1kb3MgIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIDI+L2Rldi9udWxsYAorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBjeWdwYXRoIC0tcGF0aCAtLXVuaXggIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKKyAgICAgIDs7CisgICAgKikKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJExJQiIKKyAgICAgIGlmICRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRHUkVQICc7W2MtekMtWl06LycgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAjIEl0IGlzIG1vc3QgcHJvYmFibHkgYSBXaW5kb3dzIGZvcm1hdCBQQVRILgorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAorICAgICAgZWxzZQorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgICAgICBmaQorICAgICAgIyBGSVhNRTogZmluZCB0aGUgc2hvcnQgbmFtZSBvciB0aGUgcGF0aCBjb21wb25lbnRzLCBhcyBzcGFjZXMgYXJlCisgICAgICAjIGNvbW1vbi4gKGUuZy4gIlByb2dyYW0gRmlsZXMiIC0+ICJQUk9HUkF+MSIpCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgRExMIGlzIGluc3RhbGxlZCB0byAkKGxpYmRpcikvLi4vYmluIGJ5IHBvc3RpbnN0YWxsX2NtZHMKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSdiYXNlX2ZpbGU9YGJhc2VuYW1lIFwke2ZpbGV9YH4KKyAgICAgIGRscGF0aD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGRpci8nXCcnXCR7YmFzZV9maWxlfSdcJydpOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbGRpcj0kZGVzdGRpci9gZGlybmFtZSBcJGRscGF0aGB+CisgICAgICB0ZXN0IC1kIFwkZGxkaXIgfHwgbWtkaXIgLXAgXCRkbGRpcn4KKyAgICAgICRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lIFwkZGxkaXIvJGRsbmFtZScKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZmlsZTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxwYXRoPSRkaXIvXCRkbGRsbH4KKyAgICAgICAkUk0gXCRkbHBhdGgnCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsaW5rLmV4ZScKICAgICA7OwogCiAgICopCisgICAgIyBBc3N1bWUgTVNWQyB3cmFwcGVyCiAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fSAkbGlibmFtZS5saWInCisgICAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKICAgICA7OwogICBlc2FjCi0gIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCiAgICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgogICBzaGxpYnBhdGhfdmFyPVBBVEgKICAgOzsKQEAgLTk4MDgsNyArMTA4NTUsNyBAQAogICA7OwogCiBkZ3V4KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4CisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKICAgbmVlZF9saWJfcHJlZml4PW5vCiAgIG5lZWRfdmVyc2lvbj1ubwogICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHNoYXJlZF9leHQnCkBAIC05ODE2LDEwICsxMDg2Myw2IEBACiAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICiAgIDs7CiAKLWZyZWVic2QxKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLQogZnJlZWJzZCogfCBkcmFnb25mbHkqKQogICAjIERyYWdvbkZseSBkb2VzIG5vdCBoYXZlIGFvdXQuICBXaGVuL2lmIHRoZXkgaW1wbGVtZW50IGEgbmV3CiAgICMgdmVyc2lvbmluZyBtZWNoYW5pc20sIGFkanVzdCB0aGlzLgpAQCAtOTgyNyw3ICsxMDg3MCw3IEBACiAgICAgb2JqZm9ybWF0PWAvdXNyL2Jpbi9vYmpmb3JtYXRgCiAgIGVsc2UKICAgICBjYXNlICRob3N0X29zIGluCi0gICAgZnJlZWJzZFsxMjNdKikgb2JqZm9ybWF0PWFvdXQgOzsKKyAgICBmcmVlYnNkWzIzXS4qKSBvYmpmb3JtYXQ9YW91dCA7OwogICAgICopIG9iamZvcm1hdD1lbGYgOzsKICAgICBlc2FjCiAgIGZpCkBAIC05ODQ1LDcgKzEwODg4LDcgQEAKICAgZXNhYwogICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAogICBjYXNlICRob3N0X29zIGluCi0gIGZyZWVic2QyKikKKyAgZnJlZWJzZDIuKikKICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCiAgICAgOzsKICAgZnJlZWJzZDMuWzAxXSogfCBmcmVlYnNkZWxmMy5bMDFdKikKQEAgLTk4NjUsMTIgKzEwOTA4LDI2IEBACiAgIDs7CiAKIGdudSopCi0gIHZlcnNpb25fdHlwZT1saW51eAorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCiAgIG5lZWRfbGliX3ByZWZpeD1ubwogICBuZWVkX3ZlcnNpb249bm8KICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwogICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwogICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitoYWlrdSopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgcnVudGltZV9sb2FkZXIiCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0ke21ham9yfSAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL2Jvb3QvaG9tZS9jb25maWcvbGliIC9ib290L2NvbW1vbi9saWIgL2Jvb3Qvc3lzdGVtL2xpYicKICAgaGFyZGNvZGVfaW50b19saWJzPXllcwogICA7OwogCkBAIC05OTE2LDEyICsxMDk3MywxNCBAQAogICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCiAgICAgOzsKICAgZXNhYwotICAjIEhQLVVYIHJ1bnMgKnJlYWxseSogc2xvd2x5IHVubGVzcyBzaGFyZWQgbGlicmFyaWVzIGFyZSBtb2RlIDU1NS4KKyAgIyBIUC1VWCBydW5zICpyZWFsbHkqIHNsb3dseSB1bmxlc3Mgc2hhcmVkIGxpYnJhcmllcyBhcmUgbW9kZSA1NTUsIC4uLgogICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKKyAgIyBvciBmYWlscyBvdXRyaWdodCwgc28gb3ZlcnJpZGUgYXRvbWljYWxseToKKyAgaW5zdGFsbF9vdmVycmlkZV9tb2RlPTU1NQogICA7OwogCiBpbnRlcml4WzMtOV0qKQotICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgogICBuZWVkX2xpYl9wcmVmaXg9bm8KICAgbmVlZF92ZXJzaW9uPW5vCiAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCkBAIC05OTM3LDcgKzEwOTk2LDcgQEAKICAgICBub25zdG9wdXgqKSB2ZXJzaW9uX3R5cGU9bm9uc3RvcHV4IDs7CiAgICAgKikKIAlpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCi0JCXZlcnNpb25fdHlwZT1saW51eAorCQl2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCiAJZWxzZQogCQl2ZXJzaW9uX3R5cGU9aXJpeAogCWZpIDs7CkBAIC05OTc0LDkgKzExMDMzLDkgQEAKICAgZHluYW1pY19saW5rZXI9bm8KICAgOzsKIAotIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgotbGludXgqIHwgaypic2QqLWdudSkKLSAgdmVyc2lvbl90eXBlPWxpbnV4CisjIFRoaXMgbXVzdCBiZSBnbGliYy9FTEYuCitsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKICAgbmVlZF9saWJfcHJlZml4PW5vCiAgIG5lZWRfdmVyc2lvbj1ubwogICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKQEAgLTk5ODQsMTIgKzExMDQzLDE3IEBACiAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCiAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICiAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworCiAgICMgU29tZSBiaW51dGlscyBsZCBhcmUgcGF0Y2hlZCB0byBzZXQgRFRfUlVOUEFUSAotICBzYXZlX0xERkxBR1M9JExERkxBR1MKLSAgc2F2ZV9saWJkaXI9JGxpYmRpcgotICBldmFsICJsaWJkaXI9L2Zvbzsgd2w9XCIkbHRfcHJvZ19jb21waWxlcl93bFwiOyBcCi0gICAgICAgTERGTEFHUz1cIlwkTERGTEFHUyAkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiIgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisgIGlmICR7bHRfY3Zfc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3Zfc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgc2F2ZV9MREZMQUdTPSRMREZMQUdTCisgICAgc2F2ZV9saWJkaXI9JGxpYmRpcgorICAgIGV2YWwgImxpYmRpcj0vZm9vOyB3bD1cIiRsdF9wcm9nX2NvbXBpbGVyX3dsXCI7IFwKKwkgTERGTEFHUz1cIlwkTERGTEFHUyAkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiIgorICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAogaW50CkBAIC0xMDAwMiwxMyArMTEwNjYsMTcgQEAKIF9BQ0VPRgogaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgogICBpZiAgKCRPQkpEVU1QIC1wIGNvbmZ0ZXN0JGFjX2V4ZWV4dCkgMj4vZGV2L251bGwgfCBncmVwICJSVU5QQVRILiokbGliZGlyIiA+L2Rldi9udWxsOyB0aGVuIDoKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCiBmaQogZmkKIHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gIExERkxBR1M9JHNhdmVfTERGTEFHUwotICBsaWJkaXI9JHNhdmVfbGliZGlyCisgICAgTERGTEFHUz0kc2F2ZV9MREZMQUdTCisgICAgbGliZGlyPSRzYXZlX2xpYmRpcgorCitmaQorCisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kbHRfY3Zfc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCiAKICAgIyBUaGlzIGltcGxpZXMgbm8gZmFzdF9pbnN0YWxsLCB3aGljaCBpcyB1bmFjY2VwdGFibGUuCiAgICMgU29tZSByZXdvcmsgd2lsbCBiZSBuZWVkZWQgdG8gYWxsb3cgZm9yIGZhc3RfaW5zdGFsbApAQCAtMTAwMjAsOCArMTEwODgsOSBAQAogCiAgICMgQXBwZW5kIGxkLnNvLmNvbmYgY29udGVudHMgdG8gdGhlIHNlYXJjaCBwYXRoCiAgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCi0gICAgbHRfbGRfZXh0cmE9YGF3ayAnL15pbmNsdWRlIC8geyBzeXN0ZW0oc3ByaW50ZigiY2QgL2V0YzsgY2F0ICVzIDI+L2Rldi9udWxsIiwgXCQyKSk7IHNraXAgPSAxOyB9IHsgaWYgKCFza2lwKSBwcmludCBcJDA7IHNraXAgPSAwOyB9JyA8IC9ldGMvbGQuc28uY29uZiB8ICRTRUQgLWUgJ3MvIy4qLy87L15bCSBdKmh3Y2FwWwkgXS9kO3MvWzosCV0vIC9nO3MvPVtePV0qJC8vO3MvPVtePSBdKiAvIC9nOy9eJC9kJyB8IHRyICdcbicgJyAnYAorICAgIGx0X2xkX2V4dHJhPWBhd2sgJy9eaW5jbHVkZSAvIHsgc3lzdGVtKHNwcmludGYoImNkIC9ldGM7IGNhdCAlcyAyPi9kZXYvbnVsbCIsIFwkMikpOyBza2lwID0gMTsgfSB7IGlmICghc2tpcCkgcHJpbnQgXCQwOyBza2lwID0gMDsgfScgPCAvZXRjL2xkLnNvLmNvbmYgfCAkU0VEIC1lICdzLyMuKi8vOy9eWwkgXSpod2NhcFsJIF0vZDtzL1s6LAldLyAvZztzLz1bXj1dKiQvLztzLz1bXj0gXSogLyAvZztzLyIvL2c7L14kL2QnIHwgdHIgJ1xuJyAnICdgCiAgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyAkbHRfbGRfZXh0cmEiCisKICAgZmkKIAogICAjIFdlIHVzZWQgdG8gdGVzdCBmb3IgL2xpYi9sZC5zby4xIGFuZCBkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMgb24KQEAgLTEwMDUyLDcgKzExMTIxLDcgQEAKICAgOzsKIAogbmV3c29zNikKLSAgdmVyc2lvbl90eXBlPWxpbnV4CisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCiAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICiAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKQEAgLTEwMTIxLDcgKzExMTkwLDcgQEAKICAgOzsKIAogc29sYXJpcyopCi0gIHZlcnNpb25fdHlwZT1saW51eAorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCiAgIG5lZWRfbGliX3ByZWZpeD1ubwogICBuZWVkX3ZlcnNpb249bm8KICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCkBAIC0xMDE0Niw3ICsxMTIxNSw3IEBACiAgIDs7CiAKIHN5c3Y0IHwgc3lzdjQuMyopCi0gIHZlcnNpb25fdHlwZT1saW51eAorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCiAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwogICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwogICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSApAQCAtMTAxNzAsNyArMTEyMzksNyBAQAogCiBzeXN2NCpNUCopCiAgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KLSAgICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCiAgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKICAgICBzb25hbWVfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvcicKICAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSApAQCAtMTAyMDEsNyArMTEyNzAsNyBAQAogCiB0cGYqKQogICAjIFRQRiBpcyBhIGNyb3NzLXRhcmdldCBvbmx5LiAgUHJlZmVycmVkIGNyb3NzLWhvc3QgPSBHTlUvTGludXguCi0gIHZlcnNpb25fdHlwZT1saW51eAorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCiAgIG5lZWRfbGliX3ByZWZpeD1ubwogICBuZWVkX3ZlcnNpb249bm8KICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCkBAIC0xMDIxMSw3ICsxMTI4MCw3IEBACiAgIDs7CiAKIHV0czQqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgogICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKQEAgLTEwMzIzLDYgKzExMzkyLDExIEBACiAKIAogCisKKworCisKKwogICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcy4uLiAiID4mNjsgfQogaGFyZGNvZGVfYWN0aW9uPQpAQCAtMTAzOTUsNyArMTE0NjksNyBAQAogICAjIGlmIGxpYmRsIGlzIGluc3RhbGxlZCB3ZSBuZWVkIHRvIGxpbmsgYWdhaW5zdCBpdAogICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfZGxfZGxvcGVuK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfbGliX2RsX2Rsb3Blbis6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKQEAgLTEwNDI5LDcgKzExNTAzLDcgQEAKIGZpCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNQogJGFzX2VjaG8gIiRhY19jdl9saWJfZGxfZGxvcGVuIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9saWJfZGxfZGxvcGVuIiA9IHh5ZXM7IHRoZW4gOgogICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCiBlbHNlCiAKQEAgLTEwNDQzLDEyICsxMTUxNywxMiBAQAogCiAgICopCiAgICAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAic2hsX2xvYWQiICJhY19jdl9mdW5jX3NobF9sb2FkIgotaWYgdGVzdCAieCRhY19jdl9mdW5jX3NobF9sb2FkIiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfc2hsX2xvYWQiID0geHllczsgdGhlbiA6CiAgIGx0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiCiBlbHNlCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHNobF9sb2FkIGluIC1sZGxkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciBzaGxfbG9hZCBpbiAtbGRsZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfZGxkX3NobF9sb2FkK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfbGliX2RsZF9zaGxfbG9hZCs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKQEAgLTEwNDgyLDE2ICsxMTU1NiwxNiBAQAogZmkKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsZF9zaGxfbG9hZCIgPiY1CiAkYXNfZWNobyAiJGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfZGxkX3NobF9sb2FkIiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQiID0geHllczsgdGhlbiA6CiAgIGx0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsZCIKIGVsc2UKICAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiZGxvcGVuIiAiYWNfY3ZfZnVuY19kbG9wZW4iCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZGxvcGVuIiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZGxvcGVuIiA9IHh5ZXM7IHRoZW4gOgogICBsdF9jdl9kbG9wZW49ImRsb3BlbiIKIGVsc2UKICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2xpYl9kbF9kbG9wZW4rc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9saWJfZGxfZGxvcGVuKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwpAQCAtMTA1MjUsMTIgKzExNTk5LDEyIEBACiBmaQogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZGxfZGxvcGVuIiA+JjUKICRhc19lY2hvICIkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9kbF9kbG9wZW4iID0geCIieWVzOyB0aGVuIDoKK2lmIHRlc3QgIngkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPSB4eWVzOyB0aGVuIDoKICAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsIgogZWxzZQogICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxzdmxkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxzdmxkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2xpYl9zdmxkX2Rsb3BlbitzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X2xpYl9zdmxkX2Rsb3Blbis6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKQEAgLTEwNTY0LDEyICsxMTYzOCwxMiBAQAogZmkKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA+JjUKICRhc19lY2hvICIkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9zdmxkX2Rsb3BlbiIgPSB4eWVzOyB0aGVuIDoKICAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbHN2bGQiCiBlbHNlCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsZF9saW5rIGluIC1sZGxkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbGRfbGluayBpbiAtbGRsZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfZGxkX2RsZF9saW5rK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfbGliX2RsZF9kbGRfbGluays6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKQEAgLTEwNjAzLDcgKzExNjc3LDcgQEAKIGZpCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kbGRfZGxkX2xpbmsiID4mNQogJGFzX2VjaG8gIiRhY19jdl9saWJfZGxkX2RsZF9saW5rIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2RsZF9kbGRfbGluayIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9saWJfZGxkX2RsZF9saW5rIiA9IHh5ZXM7IHRoZW4gOgogICBsdF9jdl9kbG9wZW49ImRsZF9saW5rIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbGQiCiBmaQogCkBAIC0xMDY0NCw3ICsxMTcxOCw3IEBACiAKICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgYSBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYSBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2x0X2N2X2Rsb3Blbl9zZWxmK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7bHRfY3ZfZGxvcGVuX3NlbGYrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICAJICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CkBAIC0xMDY1Myw3ICsxMTcyNyw3IEBACiAgIGx0X2RsdW5rbm93bj0wOyBsdF9kbG5vX3VzY29yZT0xOyBsdF9kbG5lZWRfdXNjb3JlPTIKICAgbHRfc3RhdHVzPSRsdF9kbHVua25vd24KICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKLSNsaW5lIDEwNjU2ICJjb25maWd1cmUiCisjbGluZSAkTElORU5PICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogI2lmIEhBVkVfRExGQ05fSApAQCAtMTA2OTQsNyArMTE3NjgsMTMgQEAKICMgIGVuZGlmCiAjZW5kaWYKIAotdm9pZCBmbm9yZCgpIHsgaW50IGk9NDI7fQorLyogV2hlbiAtZnZpc2JpbGl0eT1oaWRkZW4gaXMgdXNlZCwgYXNzdW1lIHRoZSBjb2RlIGhhcyBiZWVuIGFubm90YXRlZAorICAgY29ycmVzcG9uZGluZ2x5IGZvciB0aGUgc3ltYm9scyBuZWVkZWQuICAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICgoKF9fR05VQ19fID09IDMpICYmIChfX0dOVUNfTUlOT1JfXyA+PSAzKSkgfHwgKF9fR05VQ19fID4gMykpCitpbnQgZm5vcmQgKCkgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSk7CisjZW5kaWYKKworaW50IGZub3JkICgpIHsgcmV0dXJuIDQyOyB9CiBpbnQgbWFpbiAoKQogewogICB2b2lkICpzZWxmID0gZGxvcGVuICgwLCBMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XKTsKQEAgLTEwNzAzLDcgKzExNzgzLDExIEBACiAgIGlmIChzZWxmKQogICAgIHsKICAgICAgIGlmIChkbHN5bSAoc2VsZiwiZm5vcmQiKSkgICAgICAgc3RhdHVzID0gJGx0X2Rsbm9fdXNjb3JlOwotICAgICAgZWxzZSBpZiAoZGxzeW0oIHNlbGYsIl9mbm9yZCIpKSBzdGF0dXMgPSAkbHRfZGxuZWVkX3VzY29yZTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworCSAgaWYgKGRsc3ltKCBzZWxmLCJfZm5vcmQiKSkgIHN0YXR1cyA9ICRsdF9kbG5lZWRfdXNjb3JlOworICAgICAgICAgIGVsc2UgcHV0cyAoZGxlcnJvciAoKSk7CisJfQogICAgICAgLyogZGxjbG9zZSAoc2VsZik7ICovCiAgICAgfQogICBlbHNlCkBAIC0xMDc0MCw3ICsxMTgyNCw3IEBACiAgICAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljXCIKICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7bHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7bHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgCSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgpAQCAtMTA3NDksNyArMTE4MzMsNyBAQAogICBsdF9kbHVua25vd249MDsgbHRfZGxub191c2NvcmU9MTsgbHRfZGxuZWVkX3VzY29yZT0yCiAgIGx0X3N0YXR1cz0kbHRfZGx1bmtub3duCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCi0jbGluZSAxMDc1MiAiY29uZmlndXJlIgorI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKICNpZiBIQVZFX0RMRkNOX0gKQEAgLTEwNzkwLDcgKzExODc0LDEzIEBACiAjICBlbmRpZgogI2VuZGlmCiAKLXZvaWQgZm5vcmQoKSB7IGludCBpPTQyO30KKy8qIFdoZW4gLWZ2aXNiaWxpdHk9aGlkZGVuIGlzIHVzZWQsIGFzc3VtZSB0aGUgY29kZSBoYXMgYmVlbiBhbm5vdGF0ZWQKKyAgIGNvcnJlc3BvbmRpbmdseSBmb3IgdGhlIHN5bWJvbHMgbmVlZGVkLiAgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoKChfX0dOVUNfXyA9PSAzKSAmJiAoX19HTlVDX01JTk9SX18gPj0gMykpIHx8IChfX0dOVUNfXyA+IDMpKQoraW50IGZub3JkICgpIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpOworI2VuZGlmCisKK2ludCBmbm9yZCAoKSB7IHJldHVybiA0MjsgfQogaW50IG1haW4gKCkKIHsKICAgdm9pZCAqc2VsZiA9IGRsb3BlbiAoMCwgTFRfRExHTE9CQUx8TFRfRExMQVpZX09SX05PVyk7CkBAIC0xMDc5OSw3ICsxMTg4OSwxMSBAQAogICBpZiAoc2VsZikKICAgICB7CiAgICAgICBpZiAoZGxzeW0gKHNlbGYsImZub3JkIikpICAgICAgIHN0YXR1cyA9ICRsdF9kbG5vX3VzY29yZTsKLSAgICAgIGVsc2UgaWYgKGRsc3ltKCBzZWxmLCJfZm5vcmQiKSkgc3RhdHVzID0gJGx0X2RsbmVlZF91c2NvcmU7CisgICAgICBlbHNlCisgICAgICAgIHsKKwkgIGlmIChkbHN5bSggc2VsZiwiX2Zub3JkIikpICBzdGF0dXMgPSAkbHRfZGxuZWVkX3VzY29yZTsKKyAgICAgICAgICBlbHNlIHB1dHMgKGRsZXJyb3IgKCkpOworCX0KICAgICAgIC8qIGRsY2xvc2UgKHNlbGYpOyAqLwogICAgIH0KICAgZWxzZQpAQCAtMTA5NjgsNiArMTIwNjIsOCBAQAogCiAKIAorCisKICAgICAgICAgYWNfY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIGxpYnRvb2wiCiAKIApAQCAtMTA5NzgsNiArMTIwNzQsMTAyMSBAQAogCiAKIAorIyBUZXN0IGZvciA2NC1iaXQgYnVpbGQuCisjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgorIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cworIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCisjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIHNpemVfdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBzaXplIG9mIHNpemVfdC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9zaXplb2Zfc2l6ZV90Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgYWNfZm5fY19jb21wdXRlX2ludCAiJExJTkVOTyIgIihsb25nIGludCkgKHNpemVvZiAoc2l6ZV90KSkiICJhY19jdl9zaXplb2Zfc2l6ZV90IiAgICAgICAgIiRhY19pbmNsdWRlc19kZWZhdWx0IjsgdGhlbiA6CisKK2Vsc2UKKyAgaWYgdGVzdCAiJGFjX2N2X3R5cGVfc2l6ZV90IiA9IHllczsgdGhlbgorICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yIDc3ICJjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHNpemVfdCkKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CisgICBlbHNlCisgICAgIGFjX2N2X3NpemVvZl9zaXplX3Q9MAorICAgZmkKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NpemVvZl9zaXplX3QiID4mNQorJGFzX2VjaG8gIiRhY19jdl9zaXplb2Zfc2l6ZV90IiA+JjY7IH0KKworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgU0laRU9GX1NJWkVfVCAkYWNfY3Zfc2l6ZW9mX3NpemVfdAorX0FDRU9GCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIHZlbmRvciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgQyBjb21waWxlciB2ZW5kb3IuLi4gIiA+JjY7IH0KK2lmICR7YXhfY3ZfY19jb21waWxlcl92ZW5kb3IrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICAjIG5vdGU6IGRvbid0IGNoZWNrIGZvciBnY2MgZmlyc3Qgc2luY2Ugc29tZSBvdGhlciBjb21waWxlcnMgZGVmaW5lIF9fR05VQ19fCisgIHZlbmRvcnM9ImludGVsOiAgICAgX19JQ0MsX19FQ0MsX19JTlRFTF9DT01QSUxFUgorICAgICAgICAgICBpYm06ICAgICAgIF9feGxjX18sX194bENfXyxfX0lCTUNfXyxfX0lCTUNQUF9fCisgICAgICAgICAgIHBhdGhzY2FsZTogX19QQVRIQ0NfXyxfX1BBVEhTQ0FMRV9fCisgICAgICAgICAgIGNsYW5nOiAgICAgX19jbGFuZ19fCisgICAgICAgICAgIGdudTogICAgICAgX19HTlVDX18KKyAgICAgICAgICAgc3VuOiAgICAgICBfX1NVTlBST19DLF9fU1VOUFJPX0NDCisgICAgICAgICAgIGhwOiAgICAgICAgX19IUF9jYyxfX0hQX2FDQworICAgICAgICAgICBkZWM6ICAgICAgIF9fREVDQyxfX0RFQ0NYWCxfX0RFQ0NfVkVSLF9fREVDQ1hYX1ZFUgorICAgICAgICAgICBib3JsYW5kOiAgIF9fQk9STEFORENfXyxfX1RVUkJPQ19fCisgICAgICAgICAgIGNvbWVhdTogICAgX19DT01PX18KKyAgICAgICAgICAgY3JheTogICAgICBfQ1JBWUMKKyAgICAgICAgICAga2FpOiAgICAgICBfX0tDQworICAgICAgICAgICBsY2M6ICAgICAgIF9fTENDX18KKyAgICAgICAgICAgc2dpOiAgICAgICBfX3NnaSxzZ2kKKyAgICAgICAgICAgbWljcm9zb2Z0OiBfTVNDX1ZFUgorICAgICAgICAgICBtZXRyb3dlcmtzOiBfX01XRVJLU19fCisgICAgICAgICAgIHdhdGNvbTogICAgX19XQVRDT01DX18KKyAgICAgICAgICAgcG9ydGxhbmQ6ICBfX1BHSQorICAgICAgICAgICB1bmtub3duOiAgIFVOS05PV04iCisgIGZvciB2ZW50ZXN0IGluICR2ZW5kb3JzOyBkbworICAgIGNhc2UgJHZlbnRlc3QgaW4KKyAgICAgICo6KSB2ZW5kb3I9JHZlbnRlc3Q7IGNvbnRpbnVlIDs7CisgICAgICAqKSAgdmVuY3BwPSJkZWZpbmVkKCJgZWNobyAkdmVudGVzdCB8IHNlZCAncy8sLykgfHwgZGVmaW5lZCgvZydgIikiIDs7CisgICAgZXNhYworICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgICAgICNpZiAhKCR2ZW5jcHApCisgICAgICAgIHRoaXNpc2FuZXJyb3I7CisgICAgICAjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGJyZWFrCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGRvbmUKKyAgYXhfY3ZfY19jb21waWxlcl92ZW5kb3I9YGVjaG8gJHZlbmRvciB8IGN1dCAtZDogLWYxYAorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRheF9jdl9jX2NvbXBpbGVyX3ZlbmRvciIgPiY1CiskYXNfZWNobyAiJGF4X2N2X2NfY29tcGlsZXJfdmVuZG9yIiA+JjY7IH0KKworCisKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1wb3J0YWJsZS1iaW5hcnkgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfcG9ydGFibGVfYmluYXJ5K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfcG9ydGFibGVfYmluYXJ5OyBhY3hfbWF4b3B0X3BvcnRhYmxlPSRlbmFibGV2YWwKK2Vsc2UKKyAgYWN4X21heG9wdF9wb3J0YWJsZT1ubworZmkKKworCisjIFRyeSB0byBkZXRlcm1pbmUgImdvb2QiIG5hdGl2ZSBjb21waWxlciBmbGFncyBpZiBub25lIHNwZWNpZmllZCB2aWEgQ0ZMQUdTCitpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiICE9ICJzZXQiOyB0aGVuCisgIENGTEFHUz0iIgorICBjYXNlICRheF9jdl9jX2NvbXBpbGVyX3ZlbmRvciBpbgorICAgIGRlYykgQ0ZMQUdTPSItbmV3YyAtdzAgLU81IC1hbnNpX2FsaWFzIC1hbnNpX2FyZ3MgLWZwX3Jlb3JkZXIgLXR1bmUgaG9zdCIKKwkgaWYgdGVzdCAieCRhY3hfbWF4b3B0X3BvcnRhYmxlIiA9IHhubzsgdGhlbgorICAgICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLWFyY2ggaG9zdCIKKyAgICAgICAgIGZpOzsKKworICAgIHN1bikgQ0ZMQUdTPSItbmF0aXZlIC1mYXN0IC14TzUgLWRhbGlnbiIKKwkgaWYgdGVzdCAieCRhY3hfbWF4b3B0X3BvcnRhYmxlIiA9IHh5ZXM7IHRoZW4KKwkgICBDRkxBR1M9IiRDRkxBR1MgLXhhcmNoPWdlbmVyaWMiCisgICAgICAgICBmaTs7CisKKyAgICBocCkgIENGTEFHUz0iK09hbGwgK09wdHJzX2Fuc2kgK0RTbmF0aXZlIgorCSBpZiB0ZXN0ICJ4JGFjeF9tYXhvcHRfcG9ydGFibGUiID0geHllczsgdGhlbgorCSAgIENGTEFHUz0iJENGTEFHUyArREFwb3J0YWJsZSIKKwkgZmk7OworCisgICAgaWJtKSBpZiB0ZXN0ICJ4JGFjeF9tYXhvcHRfcG9ydGFibGUiID0geG5vOyB0aGVuCisgICAgICAgICAgIHhsY19vcHQ9Ii1xYXJjaD1hdXRvIC1xdHVuZT1hdXRvIgorCSBlbHNlCisgICAgICAgICAgIHhsY19vcHQ9Ii1xdHVuZT1hdXRvIgorCSBmaQorICAgICAgICAgYXNfQ0FDSEVWQVI9YCRhc19lY2hvICJheF9jdl9jaGVja19jZmxhZ3NfXyR4bGNfb3B0IiB8ICRhc190cl9zaGAKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBDIGNvbXBpbGVyIGFjY2VwdHMgJHhsY19vcHQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBDIGNvbXBpbGVyIGFjY2VwdHMgJHhsY19vcHQuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JGFzX0NBQ0hFVkFSKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworICBheF9jaGVja19zYXZlX2ZsYWdzPSRDRkxBR1MKKyAgQ0ZMQUdTPSIkQ0ZMQUdTICAkeGxjX29wdCIKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGV2YWwgIiRhc19DQUNIRVZBUj15ZXMiCitlbHNlCisgIGV2YWwgIiRhc19DQUNIRVZBUj1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgQ0ZMQUdTPSRheF9jaGVja19zYXZlX2ZsYWdzCitmaQorZXZhbCBhY19yZXM9XCQkYXNfQ0FDSEVWQVIKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQoraWYgdGVzdCB4ImBldmFsICdhc192YWw9JHsnJGFzX0NBQ0hFVkFSJ307JGFzX2VjaG8gIiRhc192YWwiJ2AiID0geHllczsgdGhlbiA6CisgIENGTEFHUz0iLU8zIC1xYW5zaWFsaWFzIC13ICR4bGNfb3B0IgorZWxzZQorICBDRkxBR1M9Ii1PMyAtcWFuc2lhbGlhcyAtdyIKKyAgICAgICAgICAgICAgICBlY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCisgICAgICAgICAgICAgICAgZWNobyAiKiAgWW91IHNlZW0gdG8gaGF2ZSB0aGUgSUJNICBDIGNvbXBpbGVyLiAgSXQgaXMgICAgICAqIgorICAgICAgICAgICAgICAgIGVjaG8gIiogIHJlY29tbWVuZGVkIGZvciBiZXN0IHBlcmZvcm1hbmNlIHRoYXQgeW91IHVzZTogICAgKiIKKyAgICAgICAgICAgICAgICBlY2hvICIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoiCisgICAgICAgICAgICAgICAgZWNobyAiKiAgICBDRkxBR1M9LU8zIC1xYXJjaD14eHggLXF0dW5lPXh4eCAtcWFuc2lhbGlhcyAtdyAqIgorICAgICAgICAgICAgICAgIGVjaG8gIiogICAgICAgICAgICAgICAgICAgICAgXl5eICAgICAgICBeXl4gICAgICAgICAgICAgICAgKiIKKyAgICAgICAgICAgICAgICBlY2hvICIqICB3aGVyZSB4eHggaXMgcHdyMiwgcHdyMywgNjA0LCBvciB3aGF0ZXZlciBraW5kIG9mICoiCisgICAgICAgICAgICAgICAgZWNobyAiKiAgQ1BVIHlvdSBoYXZlLiAgKFNldCB0aGUgQ0ZMQUdTIGVudmlyb25tZW50IHZhci4gICAqIgorICAgICAgICAgICAgICAgIGVjaG8gIiogIGFuZCByZS1ydW4gY29uZmlndXJlLikgIEZvciBtb3JlIGluZm8sIG1hbiBjYy4gICAgKiIKKyAgICAgICAgICAgICAgICBlY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCitmaQorCisgICAgICAgICA7OworCisgICAgaW50ZWwpIENGTEFHUz0iLU8zIC1hbnNpX2FsaWFzIgorCWlmIHRlc3QgIngkYWN4X21heG9wdF9wb3J0YWJsZSIgPSB4bm87IHRoZW4KKwkgIGljY19hcmNoZmxhZz11bmtub3duCisJICBpY2NfZmxhZ3M9IiIKKwkgIGNhc2UgJGhvc3RfY3B1IGluCisJICAgIGk2ODYqfHg4Nl82NCopCisgICAgICAgICAgICAgICMgaWNjIGFjY2VwdHMgZ2NjIGFzc2VtYmx5IHN5bnRheCwgc28gdGhlc2Ugc2hvdWxkIHdvcms6CisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgeDg2IGNwdWlkIDAgb3V0cHV0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB4ODYgY3B1aWQgMCBvdXRwdXQuLi4gIiA+JjY7IH0KK2lmICR7YXhfY3ZfZ2NjX3g4Nl9jcHVpZF8wKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICBheF9jdl9nY2NfeDg2X2NwdWlkXzA9dW5rbm93bgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkaW8uaD4KK2ludAorbWFpbiAoKQoreworCisgICAgIGludCBvcCA9IDAsIGVheCwgZWJ4LCBlY3gsIGVkeDsKKyAgICAgRklMRSAqZjsKKyAgICAgIF9fYXNtX18oImNwdWlkIgorICAgICAgICA6ICI9YSIgKGVheCksICI9YiIgKGVieCksICI9YyIgKGVjeCksICI9ZCIgKGVkeCkKKyAgICAgICAgOiAiYSIgKG9wKSk7CisgICAgIGYgPSBmb3BlbigiY29uZnRlc3RfY3B1aWQiLCAidyIpOyBpZiAoIWYpIHJldHVybiAxOworICAgICBmcHJpbnRmKGYsICIleDoleDoleDoleFxuIiwgZWF4LCBlYngsIGVjeCwgZWR4KTsKKyAgICAgZmNsb3NlKGYpOworICAgICByZXR1cm4gMDsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKyAgYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8wPWBjYXQgY29uZnRlc3RfY3B1aWRgOyBybSAtZiBjb25mdGVzdF9jcHVpZAorZWxzZQorICBheF9jdl9nY2NfeDg2X2NwdWlkXzA9dW5rbm93bjsgcm0gLWYgY29uZnRlc3RfY3B1aWQKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRheF9jdl9nY2NfeDg2X2NwdWlkXzAiID4mNQorJGFzX2VjaG8gIiRheF9jdl9nY2NfeDg2X2NwdWlkXzAiID4mNjsgfQorYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB4ODYgY3B1aWQgMSBvdXRwdXQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHg4NiBjcHVpZCAxIG91dHB1dC4uLiAiID4mNjsgfQoraWYgJHtheF9jdl9nY2NfeDg2X2NwdWlkXzErOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIGF4X2N2X2djY194ODZfY3B1aWRfMT11bmtub3duCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgoraW50CittYWluICgpCit7CisKKyAgICAgaW50IG9wID0gMSwgZWF4LCBlYngsIGVjeCwgZWR4OworICAgICBGSUxFICpmOworICAgICAgX19hc21fXygiY3B1aWQiCisgICAgICAgIDogIj1hIiAoZWF4KSwgIj1iIiAoZWJ4KSwgIj1jIiAoZWN4KSwgIj1kIiAoZWR4KQorICAgICAgICA6ICJhIiAob3ApKTsKKyAgICAgZiA9IGZvcGVuKCJjb25mdGVzdF9jcHVpZCIsICJ3Iik7IGlmICghZikgcmV0dXJuIDE7CisgICAgIGZwcmludGYoZiwgIiV4OiV4OiV4OiV4XG4iLCBlYXgsIGVieCwgZWN4LCBlZHgpOworICAgICBmY2xvc2UoZik7CisgICAgIHJldHVybiAwOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorICBheF9jdl9nY2NfeDg2X2NwdWlkXzE9YGNhdCBjb25mdGVzdF9jcHVpZGA7IHJtIC1mIGNvbmZ0ZXN0X2NwdWlkCitlbHNlCisgIGF4X2N2X2djY194ODZfY3B1aWRfMT11bmtub3duOyBybSAtZiBjb25mdGVzdF9jcHVpZAorZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGF4X2N2X2djY194ODZfY3B1aWRfMSIgPiY1CiskYXNfZWNobyAiJGF4X2N2X2djY194ODZfY3B1aWRfMSIgPiY2OyB9CithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKworCSAgICAgIGNhc2UgJGF4X2N2X2djY194ODZfY3B1aWRfMCBpbiAjIHNlZSBBWF9HQ0NfQVJDSEZMQUcKKyAgICAgICAgICAgICAgICAqOjc1NmU2NTQ3Oio6KikgIyBJbnRlbAorICAgICAgICAgICAgICAgICAgY2FzZSAkYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8xIGluCisgICAgICAgICAgICAgICAgICAgICo2YT86KlsyMzRdOio6KnwqNls3ODliXT86KjoqOiopIGljY19mbGFncz0iLXhLIjs7CisgICAgICAgICAgICAgICAgICAgICpmM1szNDddOio6KjoqfCpmNDEzNDc6KjoqOiopIGljY19mbGFncz0iLXhQIC14TiAteFcgLXhLIjs7CisgICAgICAgICAgICAgICAgICAgICpmPz86KjoqOiopIGljY19mbGFncz0iLXhOIC14VyAteEsiOzsKKyAgICAgICAgICAgICAgICAgIGVzYWMgOzsKKyAgICAgICAgICAgICAgZXNhYyA7OworICAgICAgICAgIGVzYWMKKyAgICAgICAgICBpZiB0ZXN0ICJ4JGljY19mbGFncyIgIT0geDsgdGhlbgorICAgICAgICAgICAgZm9yIGZsYWcgaW4gJGljY19mbGFnczsgZG8KKyAgICAgICAgICAgICAgYXNfQ0FDSEVWQVI9YCRhc19lY2hvICJheF9jdl9jaGVja19jZmxhZ3NfXyRmbGFnIiB8ICRhc190cl9zaGAKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBDIGNvbXBpbGVyIGFjY2VwdHMgJGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBDIGNvbXBpbGVyIGFjY2VwdHMgJGZsYWcuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JGFzX0NBQ0hFVkFSKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworICBheF9jaGVja19zYXZlX2ZsYWdzPSRDRkxBR1MKKyAgQ0ZMQUdTPSIkQ0ZMQUdTICAkZmxhZyIKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGV2YWwgIiRhc19DQUNIRVZBUj15ZXMiCitlbHNlCisgIGV2YWwgIiRhc19DQUNIRVZBUj1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgQ0ZMQUdTPSRheF9jaGVja19zYXZlX2ZsYWdzCitmaQorZXZhbCBhY19yZXM9XCQkYXNfQ0FDSEVWQVIKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQoraWYgdGVzdCB4ImBldmFsICdhc192YWw9JHsnJGFzX0NBQ0hFVkFSJ307JGFzX2VjaG8gIiRhc192YWwiJ2AiID0geHllczsgdGhlbiA6CisgIGljY19hcmNoZmxhZz0kZmxhZzsgYnJlYWsKK2Vsc2UKKyAgOgorZmkKKworICAgICAgICAgICAgZG9uZQorICAgICAgICAgIGZpCisgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgaWNjIGFyY2hpdGVjdHVyZSBmbGFnIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBpY2MgYXJjaGl0ZWN0dXJlIGZsYWcuLi4gIiA+JjY7IH0KKwkgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkaWNjX2FyY2hmbGFnIiA+JjUKKyRhc19lY2hvICIkaWNjX2FyY2hmbGFnIiA+JjY7IH0KKyAgICAgICAgICBpZiB0ZXN0ICJ4JGljY19hcmNoZmxhZyIgIT0geHVua25vd247IHRoZW4KKyAgICAgICAgICAgIENGTEFHUz0iJENGTEFHUyAkaWNjX2FyY2hmbGFnIgorICAgICAgICAgIGZpCisgICAgICAgIGZpCisJOzsKKworICAgIGdudSkKKyAgICAgIyBkZWZhdWx0IG9wdGltaXphdGlvbiBmbGFncyBmb3IgZ2NjIG9uIGFsbCBzeXN0ZW1zCisgICAgIENGTEFHUz0iLU8zIC1mb21pdC1mcmFtZS1wb2ludGVyIgorCisgICAgICMgLW1hbGlnbi1kb3VibGUgZm9yIHg4NiBzeXN0ZW1zCisgICAgICMgTElCRkZJIC0tIERPTidUIERPIFRISVMgLSBDSEFOR0VTIEFCSQorICAgICAjIEFYX0NIRUNLX0NPTVBJTEVfRkxBRygtbWFsaWduLWRvdWJsZSwgQ0ZMQUdTPSIkQ0ZMQUdTIC1tYWxpZ24tZG91YmxlIikKKworICAgICAjICAtZnN0cmljdC1hbGlhc2luZyBmb3IgZ2NjLTIuOTUrCisgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBDIGNvbXBpbGVyIGFjY2VwdHMgLWZzdHJpY3QtYWxpYXNpbmciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBDIGNvbXBpbGVyIGFjY2VwdHMgLWZzdHJpY3QtYWxpYXNpbmcuLi4gIiA+JjY7IH0KK2lmICR7YXhfY3ZfY2hlY2tfY2ZsYWdzX19fZnN0cmljdF9hbGlhc2luZys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKyAgYXhfY2hlY2tfc2F2ZV9mbGFncz0kQ0ZMQUdTCisgIENGTEFHUz0iJENGTEFHUyAgLWZzdHJpY3QtYWxpYXNpbmciCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBheF9jdl9jaGVja19jZmxhZ3NfX19mc3RyaWN0X2FsaWFzaW5nPXllcworZWxzZQorICBheF9jdl9jaGVja19jZmxhZ3NfX19mc3RyaWN0X2FsaWFzaW5nPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIENGTEFHUz0kYXhfY2hlY2tfc2F2ZV9mbGFncworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYXhfY3ZfY2hlY2tfY2ZsYWdzX19fZnN0cmljdF9hbGlhc2luZyIgPiY1CiskYXNfZWNobyAiJGF4X2N2X2NoZWNrX2NmbGFnc19fX2ZzdHJpY3RfYWxpYXNpbmciID4mNjsgfQoraWYgdGVzdCB4IiRheF9jdl9jaGVja19jZmxhZ3NfX19mc3RyaWN0X2FsaWFzaW5nIiA9IHh5ZXM7IHRoZW4gOgorICBDRkxBR1M9IiRDRkxBR1MgLWZzdHJpY3QtYWxpYXNpbmciCitlbHNlCisgIDoKK2ZpCisKKworICAgICAjIG5vdGUgdGhhdCB3ZSBlbmFibGUgInVuc2FmZSIgZnAgb3B0aW1pemF0aW9uIHdpdGggb3RoZXIgY29tcGlsZXJzLCB0b28KKyAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIEMgY29tcGlsZXIgYWNjZXB0cyAtZmZhc3QtbWF0aCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIEMgY29tcGlsZXIgYWNjZXB0cyAtZmZhc3QtbWF0aC4uLiAiID4mNjsgfQoraWYgJHtheF9jdl9jaGVja19jZmxhZ3NfX19mZmFzdF9tYXRoKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworICBheF9jaGVja19zYXZlX2ZsYWdzPSRDRkxBR1MKKyAgQ0ZMQUdTPSIkQ0ZMQUdTICAtZmZhc3QtbWF0aCIKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGF4X2N2X2NoZWNrX2NmbGFnc19fX2ZmYXN0X21hdGg9eWVzCitlbHNlCisgIGF4X2N2X2NoZWNrX2NmbGFnc19fX2ZmYXN0X21hdGg9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgQ0ZMQUdTPSRheF9jaGVja19zYXZlX2ZsYWdzCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRheF9jdl9jaGVja19jZmxhZ3NfX19mZmFzdF9tYXRoIiA+JjUKKyRhc19lY2hvICIkYXhfY3ZfY2hlY2tfY2ZsYWdzX19fZmZhc3RfbWF0aCIgPiY2OyB9CitpZiB0ZXN0IHgiJGF4X2N2X2NoZWNrX2NmbGFnc19fX2ZmYXN0X21hdGgiID0geHllczsgdGhlbiA6CisgIENGTEFHUz0iJENGTEFHUyAtZmZhc3QtbWF0aCIKK2Vsc2UKKyAgOgorZmkKKworCisKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ2NjLWFyY2ggd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2djY19hcmNoK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9nY2NfYXJjaDsgYXhfZ2NjX2FyY2g9JHdpdGh2YWwKK2Vsc2UKKyAgYXhfZ2NjX2FyY2g9eWVzCitmaQorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGdjYyBhcmNoaXRlY3R1cmUgZmxhZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZ2NjIGFyY2hpdGVjdHVyZSBmbGFnLi4uICIgPiY2OyB9Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogIiA+JjUKKyRhc19lY2hvICIiID4mNjsgfQoraWYgJHtheF9jdl9nY2NfYXJjaGZsYWcrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCitheF9jdl9nY2NfYXJjaGZsYWc9InVua25vd24iCisKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisKK2lmIHRlc3QgIngkYXhfZ2NjX2FyY2giID0geHllczsgdGhlbgorYXhfZ2NjX2FyY2g9IiIKK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0gbm87IHRoZW4KK2Nhc2UgJGhvc3RfY3B1IGluCisgIGlbMzQ1Nl04Nip8eDg2XzY0KikgIyB1c2UgY3B1aWQgY29kZXMKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB4ODYgY3B1aWQgMCBvdXRwdXQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHg4NiBjcHVpZCAwIG91dHB1dC4uLiAiID4mNjsgfQoraWYgJHtheF9jdl9nY2NfeDg2X2NwdWlkXzArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIGF4X2N2X2djY194ODZfY3B1aWRfMD11bmtub3duCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgoraW50CittYWluICgpCit7CisKKyAgICAgaW50IG9wID0gMCwgZWF4LCBlYngsIGVjeCwgZWR4OworICAgICBGSUxFICpmOworICAgICAgX19hc21fXygiY3B1aWQiCisgICAgICAgIDogIj1hIiAoZWF4KSwgIj1iIiAoZWJ4KSwgIj1jIiAoZWN4KSwgIj1kIiAoZWR4KQorICAgICAgICA6ICJhIiAob3ApKTsKKyAgICAgZiA9IGZvcGVuKCJjb25mdGVzdF9jcHVpZCIsICJ3Iik7IGlmICghZikgcmV0dXJuIDE7CisgICAgIGZwcmludGYoZiwgIiV4OiV4OiV4OiV4XG4iLCBlYXgsIGVieCwgZWN4LCBlZHgpOworICAgICBmY2xvc2UoZik7CisgICAgIHJldHVybiAwOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorICBheF9jdl9nY2NfeDg2X2NwdWlkXzA9YGNhdCBjb25mdGVzdF9jcHVpZGA7IHJtIC1mIGNvbmZ0ZXN0X2NwdWlkCitlbHNlCisgIGF4X2N2X2djY194ODZfY3B1aWRfMD11bmtub3duOyBybSAtZiBjb25mdGVzdF9jcHVpZAorZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGF4X2N2X2djY194ODZfY3B1aWRfMCIgPiY1CiskYXNfZWNobyAiJGF4X2N2X2djY194ODZfY3B1aWRfMCIgPiY2OyB9CithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHg4NiBjcHVpZCAxIG91dHB1dCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgeDg2IGNwdWlkIDEgb3V0cHV0Li4uICIgPiY2OyB9CitpZiAke2F4X2N2X2djY194ODZfY3B1aWRfMSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8xPXVua25vd24KK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CitpbnQKK21haW4gKCkKK3sKKworICAgICBpbnQgb3AgPSAxLCBlYXgsIGVieCwgZWN4LCBlZHg7CisgICAgIEZJTEUgKmY7CisgICAgICBfX2FzbV9fKCJjcHVpZCIKKyAgICAgICAgOiAiPWEiIChlYXgpLCAiPWIiIChlYngpLCAiPWMiIChlY3gpLCAiPWQiIChlZHgpCisgICAgICAgIDogImEiIChvcCkpOworICAgICBmID0gZm9wZW4oImNvbmZ0ZXN0X2NwdWlkIiwgInciKTsgaWYgKCFmKSByZXR1cm4gMTsKKyAgICAgZnByaW50ZihmLCAiJXg6JXg6JXg6JXhcbiIsIGVheCwgZWJ4LCBlY3gsIGVkeCk7CisgICAgIGZjbG9zZShmKTsKKyAgICAgcmV0dXJuIDA7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisgIGF4X2N2X2djY194ODZfY3B1aWRfMT1gY2F0IGNvbmZ0ZXN0X2NwdWlkYDsgcm0gLWYgY29uZnRlc3RfY3B1aWQKK2Vsc2UKKyAgYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8xPXVua25vd247IHJtIC1mIGNvbmZ0ZXN0X2NwdWlkCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8xIiA+JjUKKyRhc19lY2hvICIkYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8xIiA+JjY7IH0KK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCisgICAgIGNhc2UgJGF4X2N2X2djY194ODZfY3B1aWRfMCBpbgorICAgICAgICo6NzU2ZTY1NDc6KjoqKSAjIEludGVsCisgICAgICAgICAgY2FzZSAkYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8xIGluCisJICAgICo1WzQ4XT86KjoqOiopIGF4X2djY19hcmNoPSJwZW50aXVtLW1teCBwZW50aXVtIiA7OworCSAgICAqNT8/Oio6KjoqKSBheF9nY2NfYXJjaD1wZW50aXVtIDs7CisJICAgICowPzZbMzQ1Nl0/Oio6KjoqKSBheF9nY2NfYXJjaD0icGVudGl1bTIgcGVudGl1bXBybyIgOzsKKwkgICAgKjA/NmE/OipbMDFdOio6KikgYXhfZ2NjX2FyY2g9InBlbnRpdW0yIHBlbnRpdW1wcm8iIDs7CisJICAgICowPzZhPzoqWzIzNF06KjoqKSBheF9nY2NfYXJjaD0icGVudGl1bTMgcGVudGl1bXBybyIgOzsKKwkgICAgKjA/Nls5ZGVdPzoqOio6KikgYXhfZ2NjX2FyY2g9InBlbnRpdW0tbSBwZW50aXVtMyBwZW50aXVtcHJvIiA7OworCSAgICAqMD82Wzc4Yl0/Oio6KjoqKSBheF9nY2NfYXJjaD0icGVudGl1bTMgcGVudGl1bXBybyIgOzsKKwkgICAgKjA/NmY/Oio6KjoqfCoxPzY2PzoqOio6KikgYXhfZ2NjX2FyY2g9ImNvcmUyIHBlbnRpdW0tbSBwZW50aXVtMyBwZW50aXVtcHJvIiA7OworCSAgICAqMT82WzdkXT86KjoqOiopIGF4X2djY19hcmNoPSJwZW5yeW4gY29yZTIgcGVudGl1bS1tIHBlbnRpdW0zIHBlbnRpdW1wcm8iIDs7CisJICAgICoxPzZbYWVmXT86KjoqOip8KjI/Nls1Y2VmXT86KjoqOiopIGF4X2djY19hcmNoPSJjb3JlaTcgY29yZTIgcGVudGl1bS1tIHBlbnRpdW0zIHBlbnRpdW1wcm8iIDs7CisJICAgICoxPzZjPzoqOio6KnwqWzIzXT82Nj86KjoqOiopIGF4X2djY19hcmNoPSJhdG9tIGNvcmUyIHBlbnRpdW0tbSBwZW50aXVtMyBwZW50aXVtcHJvIiA7OworCSAgICAqMj82W2FkXT86KjoqOiopIGF4X2djY19hcmNoPSJjb3JlaTctYXZ4IGNvcmVpNyBjb3JlMiBwZW50aXVtLW0gcGVudGl1bTMgcGVudGl1bXBybyIgOzsKKwkgICAgKjA/Nj8/Oio6KjoqKSBheF9nY2NfYXJjaD1wZW50aXVtcHJvIDs7CisJICAgICo2Pz86KjoqOiopIGF4X2djY19hcmNoPSJjb3JlMiBwZW50aXVtcHJvIiA7OworCSAgICA/MDAwP2YzWzM0N106KjoqOip8PzAwMD9mNDEzNDc6KjoqOip8PzAwMD9mNj86KjoqOiopCisJCWNhc2UgJGhvc3RfY3B1IGluCisJICAgICAgICAgIHg4Nl82NCopIGF4X2djY19hcmNoPSJub2NvbmEgcGVudGl1bTQgcGVudGl1bXBybyIgOzsKKwkgICAgICAgICAgKikgYXhfZ2NjX2FyY2g9InByZXNjb3R0IHBlbnRpdW00IHBlbnRpdW1wcm8iIDs7CisJICAgICAgICBlc2FjIDs7CisJICAgID8wMDA/Zj8/Oio6KjoqKSBheF9nY2NfYXJjaD0icGVudGl1bTQgcGVudGl1bXBybyI7OworICAgICAgICAgIGVzYWMgOzsKKyAgICAgICAqOjY4NzQ3NTQxOio6KikgIyBBTUQKKyAgICAgICAgICBjYXNlICRheF9jdl9nY2NfeDg2X2NwdWlkXzEgaW4KKwkgICAgKjVbNjddPzoqOio6KikgYXhfZ2NjX2FyY2g9azYgOzsKKwkgICAgKjVbOGRdPzoqOio6KikgYXhfZ2NjX2FyY2g9Ims2LTIgazYiIDs7CisJICAgICo1WzldPzoqOio6KikgYXhfZ2NjX2FyY2g9Ims2LTMgazYiIDs7CisJICAgICo2MD86KjoqOiopIGF4X2djY19hcmNoPWs3IDs7CisJICAgICo2WzEyXT86KjoqOiopIGF4X2djY19hcmNoPSJhdGhsb24gazciIDs7CisJICAgICo2WzM0XT86KjoqOiopIGF4X2djY19hcmNoPSJhdGhsb24tdGJpcmQgazciIDs7CisJICAgICo2Nz86KjoqOiopIGF4X2djY19hcmNoPSJhdGhsb24tNCBhdGhsb24gazciIDs7CisJICAgICo2WzY4YV0/Oio6KjoqKQorCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHg4NiBjcHVpZCAweDgwMDAwMDA2IG91dHB1dCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgeDg2IGNwdWlkIDB4ODAwMDAwMDYgb3V0cHV0Li4uICIgPiY2OyB9CitpZiAke2F4X2N2X2djY194ODZfY3B1aWRfMHg4MDAwMDAwNis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8weDgwMDAwMDA2PXVua25vd24KK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CitpbnQKK21haW4gKCkKK3sKKworICAgICBpbnQgb3AgPSAweDgwMDAwMDA2LCBlYXgsIGVieCwgZWN4LCBlZHg7CisgICAgIEZJTEUgKmY7CisgICAgICBfX2FzbV9fKCJjcHVpZCIKKyAgICAgICAgOiAiPWEiIChlYXgpLCAiPWIiIChlYngpLCAiPWMiIChlY3gpLCAiPWQiIChlZHgpCisgICAgICAgIDogImEiIChvcCkpOworICAgICBmID0gZm9wZW4oImNvbmZ0ZXN0X2NwdWlkIiwgInciKTsgaWYgKCFmKSByZXR1cm4gMTsKKyAgICAgZnByaW50ZihmLCAiJXg6JXg6JXg6JXhcbiIsIGVheCwgZWJ4LCBlY3gsIGVkeCk7CisgICAgIGZjbG9zZShmKTsKKyAgICAgcmV0dXJuIDA7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisgIGF4X2N2X2djY194ODZfY3B1aWRfMHg4MDAwMDAwNj1gY2F0IGNvbmZ0ZXN0X2NwdWlkYDsgcm0gLWYgY29uZnRlc3RfY3B1aWQKK2Vsc2UKKyAgYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8weDgwMDAwMDA2PXVua25vd247IHJtIC1mIGNvbmZ0ZXN0X2NwdWlkCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8weDgwMDAwMDA2IiA+JjUKKyRhc19lY2hvICIkYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8weDgwMDAwMDA2IiA+JjY7IH0KK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworICMgTDIgY2FjaGUgc2l6ZQorCSAgICAgICBjYXNlICRheF9jdl9nY2NfeDg2X2NwdWlkXzB4ODAwMDAwMDYgaW4KKyAgICAgICAgICAgICAgICAgKjoqOipbMS05YS1mXT8/Pz8/PzoqKSAjIChMMiA9IGVjeCA+PiAxNikgPj0gMjU2CisJCQlheF9nY2NfYXJjaD0iYXRobG9uLXhwIGF0aGxvbi00IGF0aGxvbiBrNyIgOzsKKyAgICAgICAgICAgICAgICAgKikgYXhfZ2NjX2FyY2g9ImF0aGxvbi00IGF0aGxvbiBrNyIgOzsKKwkgICAgICAgZXNhYyA7OworCSAgICA/MDA/P2ZbNGNlZjhiXT86KjoqOiopIGF4X2djY19hcmNoPSJhdGhsb242NCBrOCIgOzsKKwkgICAgPzAwPz9mNT86KjoqOiopIGF4X2djY19hcmNoPSJvcHRlcm9uIGs4IiA7OworCSAgICA/MDA/P2Y3PzoqOio6KikgYXhfZ2NjX2FyY2g9ImF0aGxvbi1meCBvcHRlcm9uIGs4IiA7OworCSAgICA/MDA/P2Y/PzoqOio6KikgYXhfZ2NjX2FyY2g9Ims4IiA7OworCSAgICA/MDU/P2Y/PzoqOio6KikgYXhfZ2NjX2FyY2g9ImJ0dmVyMSBhbWRmYW0xMCBrOCIgOzsKKwkgICAgPzA2Pz9mPz86KjoqOiopIGF4X2djY19hcmNoPSJiZHZlcjEgYW1kZmFtMTAgazgiIDs7CisJICAgICpmPz86KjoqOiopIGF4X2djY19hcmNoPSJhbWRmYW0xMCBrOCIgOzsKKyAgICAgICAgICBlc2FjIDs7CisJKjo3NDZlNjU0MzoqOiopICMgSURUCisJICAgY2FzZSAkYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8xIGluCisJICAgICAqNTQ/Oio6KjoqKSBheF9nY2NfYXJjaD13aW5jaGlwLWM2IDs7CisJICAgICAqNTg/Oio6KjoqKSBheF9nY2NfYXJjaD13aW5jaGlwMiA7OworCSAgICAgKjZbNzhdPzoqOio6KikgYXhfZ2NjX2FyY2g9YzMgOzsKKwkgICAgICo2OT86KjoqOiopIGF4X2djY19hcmNoPSJjMy0yIGMzIiA7OworCSAgIGVzYWMgOzsKKyAgICAgZXNhYworICAgICBpZiB0ZXN0IHgiJGF4X2djY19hcmNoIiA9IHg7IHRoZW4gIyBmYWxsYmFjaworCWNhc2UgJGhvc3RfY3B1IGluCisJICBpNTg2KikgYXhfZ2NjX2FyY2g9cGVudGl1bSA7OworCSAgaTY4NiopIGF4X2djY19hcmNoPXBlbnRpdW1wcm8gOzsKKyAgICAgICAgZXNhYworICAgICBmaQorICAgICA7OworCisgIHNwYXJjKikKKyAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJwcnRkaWFnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBwcnRkaWFnOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9QUlRESUFHKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkUFJURElBRyBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9QUlRESUFHPSIkUFJURElBRyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2FzX2R1bW15PSIkUEFUSDovdXNyL3BsYXRmb3JtL2B1bmFtZSAtaWAvc2Jpbi86L3Vzci9wbGF0Zm9ybS9gdW5hbWUgLW1gL3NiaW4vIgorZm9yIGFzX2RpciBpbiAkYXNfZHVtbXkKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3BhdGhfUFJURElBRz0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9QUlRESUFHIiAmJiBhY19jdl9wYXRoX1BSVERJQUc9InBydGRpYWciCisgIDs7Citlc2FjCitmaQorUFJURElBRz0kYWNfY3ZfcGF0aF9QUlRESUFHCitpZiB0ZXN0IC1uICIkUFJURElBRyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQUlRESUFHIiA+JjUKKyRhc19lY2hvICIkUFJURElBRyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgICAgIGNwdXR5cGU9YCgoKGdyZXAgY3B1IC9wcm9jL2NwdWluZm8gfCBjdXQgLWQ6IC1mMikgOyAoJFBSVERJQUcgLXYgfGdyZXAgLWkgc3BhcmMpIDsgZ3JlcCAtaSBjcHUgL3Zhci9ydW4vZG1lc2cuYm9vdCApIHwgaGVhZCAtbiAxKSAyPiAvZGV2L251bGxgCisgICAgIGNwdXR5cGU9YGVjaG8gIiRjcHV0eXBlIiB8IHRyIC1kICcgLScgfHRyICRhc19jcl9MRVRURVJTICRhc19jcl9sZXR0ZXJzYAorICAgICBjYXNlICRjcHV0eXBlIGluCisgICAgICAgICAqdWx0cmFzcGFyY2l2KikgYXhfZ2NjX2FyY2g9InVsdHJhc3BhcmM0IHVsdHJhc3BhcmMzIHVsdHJhc3BhcmMgdjkiIDs7CisgICAgICAgICAqdWx0cmFzcGFyY2lpaSopIGF4X2djY19hcmNoPSJ1bHRyYXNwYXJjMyB1bHRyYXNwYXJjIHY5IiA7OworICAgICAgICAgKnVsdHJhc3BhcmMqKSBheF9nY2NfYXJjaD0idWx0cmFzcGFyYyB2OSIgOzsKKyAgICAgICAgICpzdXBlcnNwYXJjKnwqdG1zMzkwejVbMDVdKikgYXhfZ2NjX2FyY2g9InN1cGVyc3BhcmMgdjgiIDs7CisgICAgICAgICAqaHlwZXJzcGFyYyp8KnJ0NjJbMDU2XSopIGF4X2djY19hcmNoPSJoeXBlcnNwYXJjIHY4IiA7OworICAgICAgICAgKmN5cHJlc3MqKSBheF9nY2NfYXJjaD1jeXByZXNzIDs7CisgICAgIGVzYWMgOzsKKworICBhbHBoYWV2NSkgYXhfZ2NjX2FyY2g9ZXY1IDs7CisgIGFscGhhZXY1NikgYXhfZ2NjX2FyY2g9ZXY1NiA7OworICBhbHBoYXBjYTU2KSBheF9nY2NfYXJjaD0icGNhNTYgZXY1NiIgOzsKKyAgYWxwaGFwY2E1NykgYXhfZ2NjX2FyY2g9InBjYTU3IHBjYTU2IGV2NTYiIDs7CisgIGFscGhhZXY2KSBheF9nY2NfYXJjaD1ldjYgOzsKKyAgYWxwaGFldjY3KSBheF9nY2NfYXJjaD1ldjY3IDs7CisgIGFscGhhZXY2OCkgYXhfZ2NjX2FyY2g9ImV2NjggZXY2NyIgOzsKKyAgYWxwaGFldjY5KSBheF9nY2NfYXJjaD0iZXY2OSBldjY4IGV2NjciIDs7CisgIGFscGhhZXY3KSBheF9nY2NfYXJjaD0iZXY3IGV2NjkgZXY2OCBldjY3IiA7OworICBhbHBoYWV2NzkpIGF4X2djY19hcmNoPSJldjc5IGV2NyBldjY5IGV2NjggZXY2NyIgOzsKKworICBwb3dlcnBjKikKKyAgICAgY3B1dHlwZT1gKChncmVwIGNwdSAvcHJvYy9jcHVpbmZvIHwgaGVhZCAtbiAxIHwgY3V0IC1kOiAtZjIgfCBjdXQgLWQsIC1mMSB8IHNlZCAncy8gLy9nJykgOyAvdXNyL2Jpbi9tYWNoaW5lIDsgL2Jpbi9tYWNoaW5lOyBncmVwIENQVSAvdmFyL3J1bi9kbWVzZy5ib290IHwgaGVhZCAtbiAxIHwgY3V0IC1kIiAiIC1mMikgMj4gL2Rldi9udWxsYAorICAgICBjcHV0eXBlPWBlY2hvICRjcHV0eXBlIHwgc2VkIC1lICdzL3BwYy8vZztzLyAqLy9nJ2AKKyAgICAgY2FzZSAkY3B1dHlwZSBpbgorICAgICAgICo3NTAqKSBheF9nY2NfYXJjaD0iNzUwIEczIiA7OworICAgICAgICo3NDBbMC05XSopIGF4X2djY19hcmNoPSIkY3B1dHlwZSA3NDAwIEc0IiA7OworICAgICAgICo3NFs0LTVdWzAtOV0qKSBheF9nY2NfYXJjaD0iJGNwdXR5cGUgNzQ1MCBHNCIgOzsKKyAgICAgICAqNzRbMC05XVswLTldKikgYXhfZ2NjX2FyY2g9IiRjcHV0eXBlIEc0IiA7OworICAgICAgICo5NzAqKSBheF9nY2NfYXJjaD0iOTcwIEc1IHBvd2VyNCI7OworICAgICAgICpQT1dFUjQqfCpwb3dlcjQqfCpncSopIGF4X2djY19hcmNoPSJwb3dlcjQgOTcwIjs7CisgICAgICAgKlBPV0VSNSp8KnBvd2VyNSp8KmdyKnwqZ3MqKSBheF9nY2NfYXJjaD0icG93ZXI1IHBvd2VyNCA5NzAiOzsKKyAgICAgICA2MDNldnw4MjQwKSBheF9nY2NfYXJjaD0iJGNwdXR5cGUgNjAzZSA2MDMiOzsKKyAgICAgICAqKSBheF9nY2NfYXJjaD0kY3B1dHlwZSA7OworICAgICBlc2FjCisgICAgIGF4X2djY19hcmNoPSIkYXhfZ2NjX2FyY2ggcG93ZXJwYyIKKyAgICAgOzsKK2VzYWMKK2ZpICMgbm90IGNyb3NzLWNvbXBpbGluZworZmkgIyBndWVzcyBhcmNoCisKK2lmIHRlc3QgIngkYXhfZ2NjX2FyY2giICE9IHggLWEgIngkYXhfZ2NjX2FyY2giICE9IHhubzsgdGhlbgorZm9yIGFyY2ggaW4gJGF4X2djY19hcmNoOyBkbworICBpZiB0ZXN0ICJ4JGFjeF9tYXhvcHRfcG9ydGFibGUiID0geHllczsgdGhlbiAjIGlmIHdlIHJlcXVpcmUgcG9ydGFibGUgY29kZQorICAgIGZsYWdzPSItbXR1bmU9JGFyY2giCisgICAgIyAtbWNwdT0kYXJjaCBhbmQgbSRhcmNoIGdlbmVyYXRlIG5vbnBvcnRhYmxlIGNvZGUgb24gZXZlcnkgYXJjaCBleGNlcHQKKyAgICAjIHg4Ni4gIEFuZCBzb21lIG90aGVyIGFyY2hlcyAoZS5nLiBBbHBoYSkgZG9uJ3QgYWNjZXB0IC1tdHVuZS4gIEdycnIuCisgICAgY2FzZSAkaG9zdF9jcHUgaW4gaSo4Nnx4ODZfNjQqKSBmbGFncz0iJGZsYWdzIC1tY3B1PSRhcmNoIC1tJGFyY2giOzsgZXNhYworICBlbHNlCisgICAgZmxhZ3M9Ii1tYXJjaD0kYXJjaCAtbWNwdT0kYXJjaCAtbSRhcmNoIgorICBmaQorICBmb3IgZmxhZyBpbiAkZmxhZ3M7IGRvCisgICAgYXNfQ0FDSEVWQVI9YCRhc19lY2hvICJheF9jdl9jaGVja19jZmxhZ3NfXyRmbGFnIiB8ICRhc190cl9zaGAKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBDIGNvbXBpbGVyIGFjY2VwdHMgJGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBDIGNvbXBpbGVyIGFjY2VwdHMgJGZsYWcuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JGFzX0NBQ0hFVkFSKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworICBheF9jaGVja19zYXZlX2ZsYWdzPSRDRkxBR1MKKyAgQ0ZMQUdTPSIkQ0ZMQUdTICAkZmxhZyIKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGV2YWwgIiRhc19DQUNIRVZBUj15ZXMiCitlbHNlCisgIGV2YWwgIiRhc19DQUNIRVZBUj1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgQ0ZMQUdTPSRheF9jaGVja19zYXZlX2ZsYWdzCitmaQorZXZhbCBhY19yZXM9XCQkYXNfQ0FDSEVWQVIKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQoraWYgdGVzdCB4ImBldmFsICdhc192YWw9JHsnJGFzX0NBQ0hFVkFSJ307JGFzX2VjaG8gIiRhc192YWwiJ2AiID0geHllczsgdGhlbiA6CisgIGF4X2N2X2djY19hcmNoZmxhZz0kZmxhZzsgYnJlYWsKK2Vsc2UKKyAgOgorZmkKKworICBkb25lCisgIHRlc3QgIngkYXhfY3ZfZ2NjX2FyY2hmbGFnIiA9IHh1bmtub3duIHx8IGJyZWFrCitkb25lCitmaQorCitmaSAjICRHQ0M9eWVzCisKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGdjYyBhcmNoaXRlY3R1cmUgZmxhZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZ2NjIGFyY2hpdGVjdHVyZSBmbGFnLi4uICIgPiY2OyB9Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGF4X2N2X2djY19hcmNoZmxhZyIgPiY1CiskYXNfZWNobyAiJGF4X2N2X2djY19hcmNoZmxhZyIgPiY2OyB9CitpZiB0ZXN0ICJ4JGF4X2N2X2djY19hcmNoZmxhZyIgPSB4dW5rbm93bjsgdGhlbgorICA6CitlbHNlCisgIENGTEFHUz0iJENGTEFHUyAkYXhfY3ZfZ2NjX2FyY2hmbGFnIgorZmkKKworICAgICA7OworICBlc2FjCisKKyAgaWYgdGVzdCAteiAiJENGTEFHUyI7IHRoZW4KKwllY2hvICIiCisJZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCisgICAgICAgIGVjaG8gIiogV0FSTklORzogRG9uJ3Qga25vdyB0aGUgYmVzdCBDRkxBR1MgZm9yIHRoaXMgc3lzdGVtICAqIgorICAgICAgICBlY2hvICIqIFVzZSAuL2NvbmZpZ3VyZSBDRkxBR1M9Li4uIHRvIHNwZWNpZnkgeW91ciBvd24gZmxhZ3MgKiIKKwllY2hvICIqIChvdGhlcndpc2UsIGEgZGVmYXVsdCBvZiBDRkxBR1M9LU8zIHdpbGwgYmUgdXNlZCkgICAgKiIKKwllY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKKwllY2hvICIiCisgICAgICAgIENGTEFHUz0iLU8zIgorICBmaQorCisgIGFzX0NBQ0hFVkFSPWAkYXNfZWNobyAiYXhfY3ZfY2hlY2tfY2ZsYWdzX18kQ0ZMQUdTIiB8ICRhc190cl9zaGAKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBDIGNvbXBpbGVyIGFjY2VwdHMgJENGTEFHUyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIEMgY29tcGlsZXIgYWNjZXB0cyAkQ0ZMQUdTLi4uICIgPiY2OyB9CitpZiBldmFsIFwkeyRhc19DQUNIRVZBUis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKyAgYXhfY2hlY2tfc2F2ZV9mbGFncz0kQ0ZMQUdTCisgIENGTEFHUz0iJENGTEFHUyAgJENGTEFHUyIKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGV2YWwgIiRhc19DQUNIRVZBUj15ZXMiCitlbHNlCisgIGV2YWwgIiRhc19DQUNIRVZBUj1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgQ0ZMQUdTPSRheF9jaGVja19zYXZlX2ZsYWdzCitmaQorZXZhbCBhY19yZXM9XCQkYXNfQ0FDSEVWQVIKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQoraWYgdGVzdCB4ImBldmFsICdhc192YWw9JHsnJGFzX0NBQ0hFVkFSJ307JGFzX2VjaG8gIiRhc192YWwiJ2AiID0geHllczsgdGhlbiA6CisgIDoKK2Vsc2UKKworCWVjaG8gIiIKKyAgICAgICAgZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCisgICAgICAgIGVjaG8gIiogV0FSTklORzogVGhlIGd1ZXNzZWQgQ0ZMQUdTIGRvbid0IHNlZW0gdG8gd29yayB3aXRoICAqIgorICAgICAgICBlY2hvICIqIHlvdXIgY29tcGlsZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiIKKyAgICAgICAgZWNobyAiKiBVc2UgLi9jb25maWd1cmUgQ0ZMQUdTPS4uLiB0byBzcGVjaWZ5IHlvdXIgb3duIGZsYWdzICoiCisgICAgICAgIGVjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorICAgICAgICBlY2hvICIiCisgICAgICAgIENGTEFHUz0iIgorCitmaQorCisKK2ZpCisKKyMgVGhlIEFYX0NGTEFHU19XQVJOX0FMTCBtYWNybyBkb2Vzbid0IGN1cnJlbnRseSB3b3JrIGZvciBzdW5wcm8KKyMgY29tcGlsZXIuCitpZiB0ZXN0ICIkYXhfY3ZfY19jb21waWxlcl92ZW5kb3IiICE9ICJzdW4iOyB0aGVuCisgIGlmICR7Q0ZMQUdTKzp9IGZhbHNlOyB0aGVuIDoKKyAgY2FzZSAiICRDRkxBR1MgIiBpbgorICAgICoiICAiKikKKyAgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiA6IENGTEFHUyBhbHJlYWR5IGNvbnRhaW5zICI7IH0gPiY1CisgICg6IENGTEFHUyBhbHJlYWR5IGNvbnRhaW5zICkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KKyAgICAgIDs7CisgICAgKikKKyAgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiA6IENGTEFHUz1cIlwkQ0ZMQUdTIFwiIjsgfSA+JjUKKyAgKDogQ0ZMQUdTPSIkQ0ZMQUdTICIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgICAgICBDRkxBR1M9IiRDRkxBR1MgIgorICAgICAgOzsKKyAgIGVzYWMKK2Vsc2UKKyAgQ0ZMQUdTPSIiCitmaQorCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgQ0ZMQUdTIGZvciBtYXhpbXVtIHdhcm5pbmdzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIENGTEFHUyBmb3IgbWF4aW11bSB3YXJuaW5ncy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9jZmxhZ3Nfd2Fybl9hbGwrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jdl9jZmxhZ3Nfd2Fybl9hbGw9Im5vLCB1bmtub3duIgorYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCitmb3IgYWNfYXJnIGluICItd2FybiBhbGwgICUgLXdhcm4gYWxsIiAgICAgICItcGVkYW50aWMgICUgLVdhbGwiICAgICAgICAgICIteHN0cmNvbnN0ICUgLXYiICAgICAgICAgICAgICItc3RkMSAgICAgICUgLXZlcmJvc2UgLXcwIC13YXJucHJvdG9zIiAgICAiLXFsYW5nbHZsPWFuc2kgJSAtcXNyY21zZyAtcWluZm89YWxsOm5vcHB0Om5vcHBjOm5vb2JzOm5vY25kIiAgICAiLWFuc2kgLWFuc2lFICUgLWZ1bGx3YXJuIiAgICAiK0VTbGl0ICAgICAlICt3MSIgICAgICAgICAgICAiLVhjICAgICAgICAlIC1wdmN0bCxmdWxsbXNnIiAgICAiLWggY29uZm9ybSAlIC1oIG1zZ2xldmVsIDIiICAgICMKK2RvIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTICJgZWNobyAkYWNfYXJnIHwgc2VkIC1lICdzLCUlLiosLCcgLWUgJ3MsJSwsJ2AKKyAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9jZmxhZ3Nfd2Fybl9hbGw9YGVjaG8gJGFjX2FyZyB8IHNlZCAtZSAncywuKiUgKiwsJ2AgOyBicmVhaworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZG9uZQorQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2NmbGFnc193YXJuX2FsbCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2NmbGFnc193YXJuX2FsbCIgPiY2OyB9CisKK2Nhc2UgIi4kYWNfY3ZfY2ZsYWdzX3dhcm5fYWxsIiBpbgorICAgICAub2t8Lm9rLCopICA7OworICAgLnwubm98Lm5vLCopICA7OworICAgKikgaWYgJHtDRkxBR1MrOn0gZmFsc2U7IHRoZW4gOgorICBjYXNlICIgJENGTEFHUyAiIGluCisgICAgKiIgJGFjX2N2X2NmbGFnc193YXJuX2FsbCAiKikKKyAgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiA6IENGTEFHUyBhbHJlYWR5IGNvbnRhaW5zIFwkYWNfY3ZfY2ZsYWdzX3dhcm5fYWxsIjsgfSA+JjUKKyAgKDogQ0ZMQUdTIGFscmVhZHkgY29udGFpbnMgJGFjX2N2X2NmbGFnc193YXJuX2FsbCkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KKyAgICAgIDs7CisgICAgKikKKyAgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiA6IENGTEFHUz1cIlwkQ0ZMQUdTIFwkYWNfY3ZfY2ZsYWdzX3dhcm5fYWxsXCIiOyB9ID4mNQorICAoOiBDRkxBR1M9IiRDRkxBR1MgJGFjX2N2X2NmbGFnc193YXJuX2FsbCIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgICAgICBDRkxBR1M9IiRDRkxBR1MgJGFjX2N2X2NmbGFnc193YXJuX2FsbCIKKyAgICAgIDs7CisgICBlc2FjCitlbHNlCisgIENGTEFHUz0iJGFjX2N2X2NmbGFnc193YXJuX2FsbCIKK2ZpCisgOzsKK2VzYWMKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKK2ZpCisKK2lmIHRlc3QgIngkR0NDIiA9ICJ4eWVzIjsgdGhlbgorICBDRkxBR1M9IiRDRkxBR1MgLWZleGNlcHRpb25zIgorICB0b3VjaCBsb2NhbC5leHAKK2Vsc2UKKyAgY2F0ID4gbG9jYWwuZXhwIDw8RU9GCitzZXQgQ0NfRk9SX1RBUkdFVCAiJENDIgorRU9GCitmaQorCiAKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMuLi4gIiA+JjY7IH0KQEAgLTExMDA1LDcgKzEzMTE2LDcgQEAKIGZvciBhY19oZWFkZXIgaW4gc3lzL21tYW4uaAogZG8gOgogICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAic3lzL21tYW4uaCIgImFjX2N2X2hlYWRlcl9zeXNfbW1hbl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9zeXNfbW1hbl9oIiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9zeXNfbW1hbl9oIiA9IHh5ZXM7IHRoZW4gOgogICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIEhBVkVfU1lTX01NQU5fSCAxCiBfQUNFT0YKQEAgLTExMDE3LDcgKzEzMTI4LDcgQEAKIGZvciBhY19mdW5jIGluIG1tYXAKIGRvIDoKICAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAibW1hcCIgImFjX2N2X2Z1bmNfbW1hcCIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19tbWFwIiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfbW1hcCIgPSB4eWVzOyB0aGVuIDoKICAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgogI2RlZmluZSBIQVZFX01NQVAgMQogX0FDRU9GCkBAIC0xMTAyNyw3ICsxMzEzOCw3IEBACiAKIAogYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgInN5cy9tbWFuLmgiICJhY19jdl9oZWFkZXJfc3lzX21tYW5faCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfc3lzX21tYW5faCIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfc3lzX21tYW5faCIgPSB4eWVzOyB0aGVuIDoKICAgbGliZmZpX2hlYWRlcl9zeXNfbW1hbl9oPXllcwogZWxzZQogICBsaWJmZmlfaGVhZGVyX3N5c19tbWFuX2g9bm8KQEAgLTExMDM1LDcgKzEzMTQ2LDcgQEAKIAogCiBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJtbWFwIiAiYWNfY3ZfZnVuY19tbWFwIgotaWYgdGVzdCAieCRhY19jdl9mdW5jX21tYXAiID0geCIieWVzOyB0aGVuIDoKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19tbWFwIiA9IHh5ZXM7IHRoZW4gOgogICBsaWJmZmlfZnVuY19tbWFwPXllcwogZWxzZQogICBsaWJmZmlfZnVuY19tbWFwPW5vCkBAIC0xMTA0OSw3ICsxMzE2MCw3IEBACiBlbHNlCiAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgcmVhZC1vbmx5IG1tYXAgb2YgYSBwbGFpbiBmaWxlIHdvcmtzIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgcmVhZC1vbmx5IG1tYXAgb2YgYSBwbGFpbiBmaWxlIHdvcmtzLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2Z1bmNfbW1hcF9maWxlK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfZnVuY19tbWFwX2ZpbGUrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICAjIEFkZCBhIHN5c3RlbSB0byB0aGlzIGJsYWNrbGlzdCBpZgpAQCAtMTEwNjgsNyArMTMxNzksNyBAQAogJGFzX2VjaG8gIiRhY19jdl9mdW5jX21tYXBfZmlsZSIgPiY2OyB9CiAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgbW1hcCBmcm9tIC9kZXYvemVybyB3b3JrcyIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIG1tYXAgZnJvbSAvZGV2L3plcm8gd29ya3MuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfZnVuY19tbWFwX2Rldl96ZXJvK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfZnVuY19tbWFwX2Rldl96ZXJvKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgIyBBZGQgYSBzeXN0ZW0gdG8gdGhpcyBibGFja2xpc3QgaWYgaXQgaGFzIG1tYXAoKSBidXQgL2Rldi96ZXJvCkBAIC0xMTA5NCw3ICsxMzIwNSw3IEBACiAgICAjIFVubGlrZSAvZGV2L3plcm8sIHRoZSBNQVBfQU5PTihZTU9VUykgZGVmaW5lcyBjYW4gYmUgcHJvYmVkIGZvci4KICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIE1BUF9BTk9OKFlNT1VTKSIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgTUFQX0FOT04oWU1PVVMpLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2RlY2xfbWFwX2Fub24rc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9kZWNsX21hcF9hbm9uKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dApAQCAtMTExMzAsNyArMTMyNDEsNyBAQAogICAgZWxzZQogICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgbW1hcCB3aXRoIE1BUF9BTk9OKFlNT1VTKSB3b3JrcyIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIG1tYXAgd2l0aCBNQVBfQU5PTihZTU9VUykgd29ya3MuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfZnVuY19tbWFwX2Fub24rc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9mdW5jX21tYXBfYW5vbis6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgICMgQWRkIGEgc3lzdGVtIHRvIHRoaXMgYmxhY2tsaXN0IGlmIGl0IGhhcyBtbWFwKCkgYW5kIE1BUF9BTk9OIG9yCkBAIC0xMTE3OCw5ICsxMzI4OSwxMyBAQAogCiBUQVJHRVRESVI9InVua25vd24iCiBjYXNlICIkaG9zdCIgaW4KKyAgYWFyY2g2NCotKi0qKQorCVRBUkdFVD1BQVJDSDY0OyBUQVJHRVRESVI9YWFyY2g2NAorCTs7CisKICAgYWxwaGEqLSotKikKIAlUQVJHRVQ9QUxQSEE7IFRBUkdFVERJUj1hbHBoYTsKLQkjIFN1cHBvcnQgMTI4LWJpdCBsb25nIGRvdWJsZSwgY2hhbmdhYmxlIHZpYSBjb21tYW5kLWxpbmUgc3dpdGNoLgorCSMgU3VwcG9ydCAxMjgtYml0IGxvbmcgZG91YmxlLCBjaGFuZ2VhYmxlIHZpYSBjb21tYW5kLWxpbmUgc3dpdGNoLgogCUhBVkVfTE9OR19ET1VCTEU9J2RlZmluZWQoX19MT05HX0RPVUJMRV8xMjhfXyknCiAJOzsKIApAQCAtMTExOTQsMTIgKzEzMzA5LDIwIEBACiAKICAgYW1kNjQtKi1mcmVlYnNkKikKIAlUQVJHRVQ9WDg2XzY0OyBUQVJHRVRESVI9eDg2CisgIAk7OworCisgIGFtZDY0LSotZnJlZWJzZCopCisJVEFSR0VUPVg4Nl82NDsgVEFSR0VURElSPXg4NgogCTs7CiAKICAgYXZyMzIqLSotKikKIAlUQVJHRVQ9QVZSMzI7IFRBUkdFVERJUj1hdnIzMgogCTs7CiAKKyAgYmZpbiopCisgIAlUQVJHRVQ9QkZJTjsgVEFSR0VURElSPWJmaW4KKyAgCTs7CisKICAgY3Jpcy0qLSopCiAJVEFSR0VUPUxJQkZGSV9DUklTOyBUQVJHRVRESVI9Y3JpcwogCTs7CkBAIC0xMTIwOCw3ICsxMzMzMSw3IEBACiAJVEFSR0VUPUZSVjsgVEFSR0VURElSPWZydgogCTs7CiAKLSAgaHBwYSotKi1saW51eCogfCBwYXJpc2MqLSotbGludXgqKQorICBocHBhKi0qLWxpbnV4KiB8IHBhcmlzYyotKi1saW51eCogfCBocHBhKi0qLW9wZW5ic2QqKQogCVRBUkdFVD1QQV9MSU5VWDsgVEFSR0VURElSPXBhCiAJOzsKICAgaHBwYSo2NC0qLWhwdXgqKQpAQCAtMTEyMjEsMjIgKzEzMzQ0LDY1IEBACiAgIGk/ODYtKi1mcmVlYnNkKiB8IGk/ODYtKi1vcGVuYnNkKikKIAlUQVJHRVQ9WDg2X0ZSRUVCU0Q7IFRBUkdFVERJUj14ODYKIAk7OwotICBpPzg2LXdpbjMyKiB8IGk/ODYtKi1jeWd3aW4qIHwgaT84Ni0qLW1pbmd3KikKKyAgaT84Ni13aW4zMiogfCBpPzg2LSotY3lnd2luKiB8IGk/ODYtKi1taW5ndyogfCBpPzg2LSotb3MyKiB8IGk/ODYtKi1pbnRlcml4KikKIAlUQVJHRVQ9WDg2X1dJTjMyOyBUQVJHRVRESVI9eDg2Ci0JIyBBbGwgbWluZ3cvY3lnd2luL3dpbjMyIGJ1aWxkcyByZXF1aXJlIHRoaXMgZm9yIHNoYXJlZGxpYgotCUFNX0xUTERGTEFHUz0iLW5vLXVuZGVmaW5lZCIKKwkjIEFsbCBtaW5ndy9jeWd3aW4vd2luMzIgYnVpbGRzIHJlcXVpcmUgLW5vLXVuZGVmaW5lZCBmb3Igc2hhcmVkbGliLgorCSMgV2UgbXVzdCBhbHNvIGNoZWNrIHdpdGhfY3Jvc3NfaG9zdCB0byBkZWNpZGUgaWYgdGhpcyBpcyBhIG5hdGl2ZQorCSMgb3IgY3Jvc3MtYnVpbGQgYW5kIHNlbGVjdCB3aGVyZSB0byBpbnN0YWxsIGRsbHMgYXBwcm9wcmlhdGVseS4KKwlpZiB0ZXN0IC1uICIkd2l0aF9jcm9zc19ob3N0IiAmJgorCSAgIHRlc3QgeCIkd2l0aF9jcm9zc19ob3N0IiAhPSB4Im5vIjsgdGhlbgorCSAgQU1fTFRMREZMQUdTPSctbm8tdW5kZWZpbmVkIC1iaW5kaXIgIiQodG9vbGV4ZWNsaWJkaXIpIic7CisJZWxzZQorCSAgQU1fTFRMREZMQUdTPSctbm8tdW5kZWZpbmVkIC1iaW5kaXIgIiQoYmluZGlyKSInOworCWZpCiAJOzsKICAgaT84Ni0qLWRhcndpbiopCiAJVEFSR0VUPVg4Nl9EQVJXSU47IFRBUkdFVERJUj14ODYKIAk7OwogICBpPzg2LSotc29sYXJpczIuMVswLTldKikKLQlUQVJHRVQ9WDg2XzY0OyBUQVJHRVRESVI9eDg2CisJVEFSR0VURElSPXg4NgorCWlmIHRlc3QgJGFjX2N2X3NpemVvZl9zaXplX3QgPSA0OyB0aGVuCisJICBUQVJHRVQ9WDg2OworCWVsc2UKKwkgIFRBUkdFVD1YODZfNjQ7CisJZmkKIAk7OworCiAgIGkqODYtKi1udG8tcW54KikKICAgICAgICAgVEFSR0VUPVg4NjsgVEFSR0VURElSPXg4NgogICAgICAgICA7OwotICBpPzg2LSotKikKLQlUQVJHRVQ9WDg2OyBUQVJHRVRESVI9eDg2CisKKyAgeDg2XzY0LSotZGFyd2luKikKKwlUQVJHRVQ9WDg2X0RBUldJTjsgVEFSR0VURElSPXg4NgorCTs7CisKKyAgeDg2XzY0LSotY3lnd2luKiB8IHg4Nl82NC0qLW1pbmd3KikKKwlUQVJHRVQ9WDg2X1dJTjY0OyBUQVJHRVRESVI9eDg2CisJIyBBbGwgbWluZ3cvY3lnd2luL3dpbjMyIGJ1aWxkcyByZXF1aXJlIC1uby11bmRlZmluZWQgZm9yIHNoYXJlZGxpYi4KKwkjIFdlIG11c3QgYWxzbyBjaGVjayB3aXRoX2Nyb3NzX2hvc3QgdG8gZGVjaWRlIGlmIHRoaXMgaXMgYSBuYXRpdmUKKwkjIG9yIGNyb3NzLWJ1aWxkIGFuZCBzZWxlY3Qgd2hlcmUgdG8gaW5zdGFsbCBkbGxzIGFwcHJvcHJpYXRlbHkuCisJaWYgdGVzdCAtbiAiJHdpdGhfY3Jvc3NfaG9zdCIgJiYKKwkgICB0ZXN0IHgiJHdpdGhfY3Jvc3NfaG9zdCIgIT0geCJubyI7IHRoZW4KKwkgIEFNX0xUTERGTEFHUz0nLW5vLXVuZGVmaW5lZCAtYmluZGlyICIkKHRvb2xleGVjbGliZGlyKSInOworCWVsc2UKKwkgIEFNX0xUTERGTEFHUz0nLW5vLXVuZGVmaW5lZCAtYmluZGlyICIkKGJpbmRpcikiJzsKKwlmaQorCTs7CisKKyAgaT84Ni0qLSogfCB4ODZfNjQtKi0qKQorCVRBUkdFVERJUj14ODYKKwlpZiB0ZXN0ICRhY19jdl9zaXplb2Zfc2l6ZV90ID0gNDsgdGhlbgorCSAgY2FzZSAiJGhvc3QiIGluCisJICAgICotZ251eDMyKQorCSAgICAgIFRBUkdFVD1YODZfNjQKKwkgICAgICA7OworCSAgICAqKQorCSAgICAgIFRBUkdFVD1YODYKKwkgICAgICA7OworICAgICAgICAgIGVzYWMKKwllbHNlCisJICBUQVJHRVQ9WDg2XzY0OworCWZpCiAJOzsKIAogICBpYTY0Ki0qLSopCkBAIC0xMTI1MSwxMCArMTM0MTcsMjIgQEAKIAlUQVJHRVQ9TTY4SzsgVEFSR0VURElSPW02OGsKIAk7OwogCi0gIG1pcHMtc2dpLWlyaXg1LiogfCBtaXBzLXNnaS1pcml4Ni4qKQorICBtaWNyb2JsYXplKi0qLSopCisJVEFSR0VUPU1JQ1JPQkxBWkU7IFRBUkdFVERJUj1taWNyb2JsYXplCisJOzsKKworICBtb3hpZS0qLSopCisJVEFSR0VUPU1PWElFOyBUQVJHRVRESVI9bW94aWUKKwk7OworCisgIG1ldGFnLSotKikKKwlUQVJHRVQ9TUVUQUc7IFRBUkdFVERJUj1tZXRhZworCTs7CisKKyAgbWlwcy1zZ2ktaXJpeDUuKiB8IG1pcHMtc2dpLWlyaXg2LiogfCBtaXBzKi0qLXJ0ZW1zKikKIAlUQVJHRVQ9TUlQU19JUklYOyBUQVJHRVRESVI9bWlwcwogCTs7Ci0gIG1pcHMqLSotbGludXgqKQorICBtaXBzKi0qLWxpbnV4KiB8IG1pcHMqLSotb3BlbmJzZCopCiAJIyBTdXBwb3J0IDEyOC1iaXQgbG9uZyBkb3VibGUgZm9yIE5ld0FCSS4KIAlIQVZFX0xPTkdfRE9VQkxFPSdkZWZpbmVkKF9fbWlwczY0KScKIAlUQVJHRVQ9TUlQU19JUklYOyBUQVJHRVRESVI9bWlwcwpAQCAtMTEyNjMsMTggKzEzNDQxLDI0IEBACiAgIHBvd2VycGMqLSotbGludXgqIHwgcG93ZXJwYy0qLXN5c3YqKQogCVRBUkdFVD1QT1dFUlBDOyBUQVJHRVRESVI9cG93ZXJwYwogCTs7CisgIHBvd2VycGMtKi1hbWlnYW9zKikKKwlUQVJHRVQ9UE9XRVJQQzsgVEFSR0VURElSPXBvd2VycGMKKwk7OwogICBwb3dlcnBjLSotYmVvcyopCiAJVEFSR0VUPVBPV0VSUEM7IFRBUkdFVERJUj1wb3dlcnBjCiAJOzsKLSAgcG93ZXJwYy0qLWRhcndpbiopCisgIHBvd2VycGMtKi1kYXJ3aW4qIHwgcG93ZXJwYzY0LSotZGFyd2luKikKIAlUQVJHRVQ9UE9XRVJQQ19EQVJXSU47IFRBUkdFVERJUj1wb3dlcnBjCiAJOzsKICAgcG93ZXJwYy0qLWFpeCogfCByczYwMDAtKi1haXgqKQogCVRBUkdFVD1QT1dFUlBDX0FJWDsgVEFSR0VURElSPXBvd2VycGMKIAk7OwotICBwb3dlcnBjLSotZnJlZWJzZCopCisgIHBvd2VycGMtKi1mcmVlYnNkKiB8IHBvd2VycGMtKi1vcGVuYnNkKikKIAlUQVJHRVQ9UE9XRVJQQ19GUkVFQlNEOyBUQVJHRVRESVI9cG93ZXJwYwogCTs7CisgIHBvd2VycGM2NC0qLWZyZWVic2QqKQorCVRBUkdFVD1QT1dFUlBDOyBUQVJHRVRESVI9cG93ZXJwYworCTs7CiAgIHBvd2VycGMqLSotcnRlbXMqKQogCVRBUkdFVD1QT1dFUlBDOyBUQVJHRVRESVI9cG93ZXJwYwogCTs7CkBAIC0xMTI5NCwyNCArMTM0NzgsMjEgQEAKIAlUQVJHRVQ9U1BBUkM7IFRBUkdFVERJUj1zcGFyYwogCTs7CiAKLSAgeDg2XzY0LSotZGFyd2luKikKLQlUQVJHRVQ9WDg2X0RBUldJTjsgVEFSR0VURElSPXg4NgorICB0aWxlKi0qKQorICAgICAgICBUQVJHRVQ9VElMRTsgVEFSR0VURElSPXRpbGUKKyAgICAgICAgOzsKKworICB4dGVuc2EqLSopCisJVEFSR0VUPVhURU5TQTsgVEFSR0VURElSPXh0ZW5zYQogCTs7CiAKLSAgeDg2XzY0LSotY3lnd2luKiB8IHg4Nl82NC0qLW1pbmd3KikKLQlUQVJHRVQ9WDg2X1dJTjY0OyBUQVJHRVRESVI9eDg2Ci0JOzsKLQotICB4ODZfNjQtKi0qKQotCVRBUkdFVD1YODZfNjQ7IFRBUkdFVERJUj14ODYKLQk7OwogZXNhYwogCiAKIAogCiBpZiB0ZXN0ICRUQVJHRVRESVIgPSB1bmtub3duOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICJcImxpYmZmaSBoYXMgbm90IGJlZW4gcG9ydGVkIHRvICRob3N0LlwiIiAiJExJTkVOTyIgNQorICBhc19mbl9lcnJvciAkPyAiXCJsaWJmZmkgaGFzIG5vdCBiZWVuIHBvcnRlZCB0byAkaG9zdC5cIiIgIiRMSU5FTk8iIDUKIGZpCiAKICBpZiBleHByIHgkVEFSR0VUIDogJ3hNSVBTJyA+IC9kZXYvbnVsbDsgdGhlbgpAQCAtMTEzMjIsNiArMTM1MDMsMTQgQEAKICAgTUlQU19GQUxTRT0KIGZpCiAKKyBpZiB0ZXN0IHgkVEFSR0VUID0geEJGSU47IHRoZW4KKyAgQkZJTl9UUlVFPQorICBCRklOX0ZBTFNFPScjJworZWxzZQorICBCRklOX1RSVUU9JyMnCisgIEJGSU5fRkFMU0U9CitmaQorCiAgaWYgdGVzdCB4JFRBUkdFVCA9IHhTUEFSQzsgdGhlbgogICBTUEFSQ19UUlVFPQogICBTUEFSQ19GQUxTRT0nIycKQEAgLTExNDAyLDYgKzEzNTkxLDMwIEBACiAgIE02OEtfRkFMU0U9CiBmaQogCisgaWYgdGVzdCB4JFRBUkdFVCA9IHhNSUNST0JMQVpFOyB0aGVuCisgIE1JQ1JPQkxBWkVfVFJVRT0KKyAgTUlDUk9CTEFaRV9GQUxTRT0nIycKK2Vsc2UKKyAgTUlDUk9CTEFaRV9UUlVFPScjJworICBNSUNST0JMQVpFX0ZBTFNFPQorZmkKKworIGlmIHRlc3QgeCRUQVJHRVQgPSB4TUVUQUc7IHRoZW4KKyAgTUVUQUdfVFJVRT0KKyAgTUVUQUdfRkFMU0U9JyMnCitlbHNlCisgIE1FVEFHX1RSVUU9JyMnCisgIE1FVEFHX0ZBTFNFPQorZmkKKworIGlmIHRlc3QgeCRUQVJHRVQgPSB4TU9YSUU7IHRoZW4KKyAgTU9YSUVfVFJVRT0KKyAgTU9YSUVfRkFMU0U9JyMnCitlbHNlCisgIE1PWElFX1RSVUU9JyMnCisgIE1PWElFX0ZBTFNFPQorZmkKKwogIGlmIHRlc3QgeCRUQVJHRVQgPSB4UE9XRVJQQzsgdGhlbgogICBQT1dFUlBDX1RSVUU9CiAgIFBPV0VSUENfRkFMU0U9JyMnCkBAIC0xMTQzNCw2ICsxMzY0NywxNCBAQAogICBQT1dFUlBDX0ZSRUVCU0RfRkFMU0U9CiBmaQogCisgaWYgdGVzdCB4JFRBUkdFVCA9IHhBQVJDSDY0OyB0aGVuCisgIEFBUkNINjRfVFJVRT0KKyAgQUFSQ0g2NF9GQUxTRT0nIycKK2Vsc2UKKyAgQUFSQ0g2NF9UUlVFPScjJworICBBQVJDSDY0X0ZBTFNFPQorZmkKKwogIGlmIHRlc3QgeCRUQVJHRVQgPSB4QVJNOyB0aGVuCiAgIEFSTV9UUlVFPQogICBBUk1fRkFMU0U9JyMnCkBAIC0xMTUyMiwxMCArMTM3NDMsMjYgQEAKICAgUEE2NF9IUFVYX0ZBTFNFPQogZmkKIAorIGlmIHRlc3QgeCRUQVJHRVQgPSB4VElMRTsgdGhlbgorICBUSUxFX1RSVUU9CisgIFRJTEVfRkFMU0U9JyMnCitlbHNlCisgIFRJTEVfVFJVRT0nIycKKyAgVElMRV9GQUxTRT0KK2ZpCisKKyBpZiB0ZXN0IHgkVEFSR0VUID0geFhURU5TQTsgdGhlbgorICBYVEVOU0FfVFJVRT0KKyAgWFRFTlNBX0ZBTFNFPScjJworZWxzZQorICBYVEVOU0FfVFJVRT0nIycKKyAgWFRFTlNBX0ZBTFNFPQorZmkKKwogCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9zdGRjK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfaGVhZGVyX3N0ZGMrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CkBAIC0xMTYzOCw3ICsxMzg3NSw3IEBACiBmb3IgYWNfZnVuYyBpbiBtZW1jcHkKIGRvIDoKICAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAibWVtY3B5IiAiYWNfY3ZfZnVuY19tZW1jcHkiCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfbWVtY3B5IiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfbWVtY3B5IiA9IHh5ZXM7IHRoZW4gOgogICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIEhBVkVfTUVNQ1BZIDEKIF9BQ0VPRgpAQCAtMTE2NDYsMTEgKzEzODgzLDIyIEBACiBmaQogZG9uZQogCithY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJzaXplX3QiICJhY19jdl90eXBlX3NpemVfdCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl90eXBlX3NpemVfdCIgPSB4eWVzOyB0aGVuIDoKKworZWxzZQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBpbnQKK19BQ0VPRgorCitmaQorCiAjIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwogIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmguLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zfd29ya2luZ19hbGxvY2FfaCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3dvcmtpbmdfYWxsb2NhX2grOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CkBAIC0xMTY4Myw3ICsxMzkzMSw3IEBACiAKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgYWxsb2NhLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CkBAIC0xMTcwMiw3ICsxMzk1MCw3IEBACiAgI3ByYWdtYSBhbGxvY2EKICMgICBlbHNlCiAjICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Cit2b2lkICphbGxvY2EgKHNpemVfdCk7CiAjICAgIGVuZGlmCiAjICAgZW5kaWYKICMgIGVuZGlmCkBAIC0xMTc0Niw3ICsxMzk5NCw3IEBACiAKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBcYGFsbG9jYS5jJyBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgXGBhbGxvY2EuYycgbmVlZHMgQ3JheSBob29rcy4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9vc19jcmF5K3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3Zfb3NfY3JheSs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKQEAgLTExNzczLDggKzE0MDIxLDcgQEAKICAgZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwogICAgIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAogYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgotZXZhbCBhc192YWw9XCQkYXNfYWNfdmFyCi0gICBpZiB0ZXN0ICJ4JGFzX3ZhbCIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgogCiBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCkBAIC0xMTc4OCw3ICsxNDAzNSw3IEBACiAKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfY19zdGFja19kaXJlY3Rpb24rOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CkBAIC0xMTc5OCwyMyArMTQwNDUsMjAgQEAKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICRhY19pbmNsdWRlc19kZWZhdWx0CiBpbnQKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCitmaW5kX3N0YWNrX2RpcmVjdGlvbiAoaW50ICphZGRyLCBpbnQgZGVwdGgpCiB7Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKKyAgaW50IGRpciwgZHVtbXkgPSAwOworICBpZiAoISBhZGRyKQorICAgIGFkZHIgPSAmZHVtbXk7CisgICphZGRyID0gYWRkciA8ICZkdW1teSA/IDEgOiBhZGRyID09ICZkdW1teSA/IDAgOiAtMTsKKyAgZGlyID0gZGVwdGggPyBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoYWRkciwgZGVwdGggLSAxKSA6IDA7CisgIHJldHVybiBkaXIgKyBkdW1teTsKIH0KIAogaW50Ci1tYWluICgpCittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7Ci0gIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKSA8IDA7CisgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoMCwgYXJnYyArICFhcmd2ICsgMjApIDwgMDsKIH0KIF9BQ0VPRgogaWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CkBAIC0xMTg0Myw3ICsxNDA4Nyw3IEBACiAjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIGRvdWJsZSIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBzaXplIG9mIGRvdWJsZS4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9zaXplb2ZfZG91YmxlK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3Zfc2l6ZW9mX2RvdWJsZSs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIGFjX2ZuX2NfY29tcHV0ZV9pbnQgIiRMSU5FTk8iICIobG9uZyBpbnQpIChzaXplb2YgKGRvdWJsZSkpIiAiYWNfY3Zfc2l6ZW9mX2RvdWJsZSIgICAgICAgICIkYWNfaW5jbHVkZXNfZGVmYXVsdCI7IHRoZW4gOgpAQCAtMTE4NTIsOSArMTQwOTYsOCBAQAogICBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9kb3VibGUiID0geWVzOyB0aGVuCiAgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQogJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQoteyBhc19mbl9zZXRfc3RhdHVzIDc3Ci1hc19mbl9lcnJvciAiY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChkb3VibGUpCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgIiRMSU5FTk8iIDU7IH07IH0KK2FzX2ZuX2Vycm9yIDc3ICJjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGRvdWJsZSkKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CiAgICBlbHNlCiAgICAgIGFjX2N2X3NpemVvZl9kb3VibGU9MAogICAgZmkKQEAgLTExODc3LDcgKzE0MTIwLDcgQEAKICMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2YgbG9uZyBkb3VibGUiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgc2l6ZSBvZiBsb25nIGRvdWJsZS4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9zaXplb2ZfbG9uZ19kb3VibGUrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9zaXplb2ZfbG9uZ19kb3VibGUrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiBhY19mbl9jX2NvbXB1dGVfaW50ICIkTElORU5PIiAiKGxvbmcgaW50KSAoc2l6ZW9mIChsb25nIGRvdWJsZSkpIiAiYWNfY3Zfc2l6ZW9mX2xvbmdfZG91YmxlIiAgICAgICAgIiRhY19pbmNsdWRlc19kZWZhdWx0IjsgdGhlbiA6CkBAIC0xMTg4Niw5ICsxNDEyOSw4IEBACiAgIGlmIHRlc3QgIiRhY19jdl90eXBlX2xvbmdfZG91YmxlIiA9IHllczsgdGhlbgogICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KLXsgYXNfZm5fc2V0X3N0YXR1cyA3NwotYXNfZm5fZXJyb3IgImNhbm5vdCBjb21wdXRlIHNpemVvZiAobG9uZyBkb3VibGUpCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgIiRMSU5FTk8iIDU7IH07IH0KK2FzX2ZuX2Vycm9yIDc3ICJjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGxvbmcgZG91YmxlKQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KICAgIGVsc2UKICAgICAgYWNfY3Zfc2l6ZW9mX2xvbmdfZG91YmxlPTAKICAgIGZpCkBAIC0xMTkyMiw3ICsxNDE2NCw3IEBACiAKICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4iID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbi4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9jX2JpZ2VuZGlhbitzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X2NfYmlnZW5kaWFuKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgYWNfY3ZfY19iaWdlbmRpYW49dW5rbm93bgpAQCAtMTIxNDAsMTggKzE0MzgyLDE4IEBACiAKICAgICAgOzsgIygKICAgICopCi0gICAgIGFzX2ZuX2Vycm9yICJ1bmtub3duIGVuZGlhbm5lc3MKKyAgICAgYXNfZm5fZXJyb3IgJD8gInVua25vd24gZW5kaWFubmVzcwogIHByZXNldHRpbmcgYWNfY3ZfY19iaWdlbmRpYW49bm8gKG9yIHllcykgd2lsbCBoZWxwIiAiJExJTkVOTyIgNSA7OwogIGVzYWMKIAogCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGFzc2VtYmxlciAuY2ZpIHBzZXVkby1vcCBzdXBwb3J0IiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGFzc2VtYmxlciAuY2ZpIHBzZXVkby1vcCBzdXBwb3J0Li4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2xpYmZmaV9jdl9hc19jZmlfcHNldWRvX29wK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7Z2NjX2N2X2FzX2NmaV9wc2V1ZG9fb3ArOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogCi0gICAgbGliZmZpX2N2X2FzX2NmaV9wc2V1ZG9fb3A9dW5rbm93bgorICAgIGdjY19jdl9hc19jZmlfcHNldWRvX29wPXVua25vd24KICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiBhc20gKCIuY2ZpX3N0YXJ0cHJvY1xuXHQuY2ZpX2VuZHByb2MiKTsKQEAgLTEyMTY0LDI1ICsxNDQwNiwyNiBAQAogfQogX0FDRU9GCiBpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGxpYmZmaV9jdl9hc19jZmlfcHNldWRvX29wPXllcworICBnY2NfY3ZfYXNfY2ZpX3BzZXVkb19vcD15ZXMKIGVsc2UKLSAgbGliZmZpX2N2X2FzX2NmaV9wc2V1ZG9fb3A9bm8KKyAgZ2NjX2N2X2FzX2NmaV9wc2V1ZG9fb3A9bm8KIGZpCiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIAogZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbGliZmZpX2N2X2FzX2NmaV9wc2V1ZG9fb3AiID4mNQotJGFzX2VjaG8gIiRsaWJmZmlfY3ZfYXNfY2ZpX3BzZXVkb19vcCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGxpYmZmaV9jdl9hc19jZmlfcHNldWRvX29wIiA9IHh5ZXM7IHRoZW4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZ2NjX2N2X2FzX2NmaV9wc2V1ZG9fb3AiID4mNQorJGFzX2VjaG8gIiRnY2NfY3ZfYXNfY2ZpX3BzZXVkb19vcCIgPiY2OyB9CisgaWYgdGVzdCAieCRnY2NfY3ZfYXNfY2ZpX3BzZXVkb19vcCIgPSB4eWVzOyB0aGVuCiAKICRhc19lY2hvICIjZGVmaW5lIEhBVkVfQVNfQ0ZJX1BTRVVET19PUCAxIiA+PmNvbmZkZWZzLmgKIAotZmkKKyBmaQorCiAKIGlmIHRlc3QgeCRUQVJHRVQgPSB4U1BBUkM7IHRoZW4KICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGFzc2VtYmxlciBhbmQgbGlua2VyIHN1cHBvcnQgdW5hbGlnbmVkIHBjIHJlbGF0ZWQgcmVsb2NzIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGFzc2VtYmxlciBhbmQgbGlua2VyIHN1cHBvcnQgdW5hbGlnbmVkIHBjIHJlbGF0ZWQgcmVsb2NzLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2xpYmZmaV9jdl9hc19zcGFyY191YV9wY3JlbCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2xpYmZmaV9jdl9hc19zcGFyY191YV9wY3JlbCs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAKQEAgLTEyMjIxLDcgKzE0NDY0LDcgQEAKIAogICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgYXNzZW1ibGVyIC5yZWdpc3RlciBwc2V1ZG8tb3Agc3VwcG9ydCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBhc3NlbWJsZXIgLnJlZ2lzdGVyIHBzZXVkby1vcCBzdXBwb3J0Li4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2xpYmZmaV9jdl9hc19yZWdpc3Rlcl9wc2V1ZG9fb3Arc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHtsaWJmZmlfY3ZfYXNfcmVnaXN0ZXJfcHNldWRvX29wKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKIApAQCAtMTIyMjksMTEgKzE0NDcyLDExIEBACiAgICAgICAgIyBDaGVjayBpZiB3ZSBoYXZlIC5yZWdpc3RlcgogICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLWFzbSAoIi5yZWdpc3RlciAlZzIsICNzY3JhdGNoIik7CisKIGludAogbWFpbiAoKQogewotCithc20gKCIucmVnaXN0ZXIgJWcyLCAjc2NyYXRjaCIpOwogICA7CiAgIHJldHVybiAwOwogfQpAQCAtMTIyNTgsMTQgKzE0NTAxLDE0IEBACiBpZiB0ZXN0IHgkVEFSR0VUID0geFg4NiB8fCB0ZXN0IHgkVEFSR0VUID0geFg4Nl9XSU4zMiB8fCB0ZXN0IHgkVEFSR0VUID0geFg4Nl82NDsgdGhlbgogICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgYXNzZW1ibGVyIHN1cHBvcnRzIHBjIHJlbGF0ZWQgcmVsb2NzIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGFzc2VtYmxlciBzdXBwb3J0cyBwYyByZWxhdGVkIHJlbG9jcy4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHtsaWJmZmlfY3ZfYXNfeDg2X3BjcmVsK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7bGliZmZpX2N2X2FzX3g4Nl9wY3JlbCs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAKLQlsaWJmZmlfY3ZfYXNfeDg2X3BjcmVsPXllcworCWxpYmZmaV9jdl9hc194ODZfcGNyZWw9bm8KIAllY2hvICcudGV4dDsgZm9vOiBub3A7IC5kYXRhOyAubG9uZyBmb28tLjsgLnRleHQnID4gY29uZnRlc3QucwotCWlmICRDQyAkQ0ZMQUdTIC1jIGNvbmZ0ZXN0LnMgMj4mMSB8IGdyZXAgLWkgd2FybmluZyA+IC9kZXYvbnVsbDsgdGhlbgotCSAgICBsaWJmZmlfY3ZfYXNfeDg2X3BjcmVsPW5vCisJaWYgJENDICRDRkxBR1MgLWMgY29uZnRlc3QucyA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgIGxpYmZmaV9jdl9hc194ODZfcGNyZWw9eWVzCiAJZmkKIAogZmkKQEAgLTEyMjc2LDc3ICsxNDUxOSwyNTUgQEAKICRhc19lY2hvICIjZGVmaW5lIEhBVkVfQVNfWDg2X1BDUkVMIDEiID4+Y29uZmRlZnMuaAogCiAgICAgZmkKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgYXNzZW1ibGVyIC5hc2NpaSBwc2V1ZG8tb3Agc3VwcG9ydCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBhc3NlbWJsZXIgLmFzY2lpIHBzZXVkby1vcCBzdXBwb3J0Li4uICIgPiY2OyB9CitpZiAke2xpYmZmaV9jdl9hc19hc2NpaV9wc2V1ZG9fb3ArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisgICAgICAgbGliZmZpX2N2X2FzX2FzY2lpX3BzZXVkb19vcD11bmtub3duCisgICAgICAgIyBDaGVjayBpZiB3ZSBoYXZlIC5hc2NpaQorICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7Cithc20gKCIuYXNjaWkgXFwic3RyaW5nXFwiIik7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgbGliZmZpX2N2X2FzX2FzY2lpX3BzZXVkb19vcD15ZXMKK2Vsc2UKKyAgbGliZmZpX2N2X2FzX2FzY2lpX3BzZXVkb19vcD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsaWJmZmlfY3ZfYXNfYXNjaWlfcHNldWRvX29wIiA+JjUKKyRhc19lY2hvICIkbGliZmZpX2N2X2FzX2FzY2lpX3BzZXVkb19vcCIgPiY2OyB9CisgICAgaWYgdGVzdCAieCRsaWJmZmlfY3ZfYXNfYXNjaWlfcHNldWRvX29wIiA9IHh5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9BU19BU0NJSV9QU0VVRE9fT1AgMSIgPj5jb25mZGVmcy5oCisKKyAgICBmaQorCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBhc3NlbWJsZXIgLnN0cmluZyBwc2V1ZG8tb3Agc3VwcG9ydCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBhc3NlbWJsZXIgLnN0cmluZyBwc2V1ZG8tb3Agc3VwcG9ydC4uLiAiID4mNjsgfQoraWYgJHtsaWJmZmlfY3ZfYXNfc3RyaW5nX3BzZXVkb19vcCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKyAgICAgICBsaWJmZmlfY3ZfYXNfc3RyaW5nX3BzZXVkb19vcD11bmtub3duCisgICAgICAgIyBDaGVjayBpZiB3ZSBoYXZlIC5zdHJpbmcKKyAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworYXNtICgiLnN0cmluZyBcXCJzdHJpbmdcXCIiKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBsaWJmZmlfY3ZfYXNfc3RyaW5nX3BzZXVkb19vcD15ZXMKK2Vsc2UKKyAgbGliZmZpX2N2X2FzX3N0cmluZ19wc2V1ZG9fb3A9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbGliZmZpX2N2X2FzX3N0cmluZ19wc2V1ZG9fb3AiID4mNQorJGFzX2VjaG8gIiRsaWJmZmlfY3ZfYXNfc3RyaW5nX3BzZXVkb19vcCIgPiY2OyB9CisgICAgaWYgdGVzdCAieCRsaWJmZmlfY3ZfYXNfc3RyaW5nX3BzZXVkb19vcCIgPSB4eWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfQVNfU1RSSU5HX1BTRVVET19PUCAxIiA+PmNvbmZkZWZzLmgKKworICAgIGZpCiBmaQogCisjIE9uIFBhWCBlbmFibGUga2VybmVscyB0aGF0IGhhdmUgTVBST1RFQ1QgZW5hYmxlIHdlIGNhbid0IHVzZSBQUk9UX0VYRUMuCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcGF4X2VtdXRyYW1wIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3BheF9lbXV0cmFtcCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX3BheF9lbXV0cmFtcDsgaWYgdGVzdCAiJGVuYWJsZV9wYXhfZW11dHJhbXAiID0gInllcyI7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgRkZJX01NQVBfRVhFQ19FTVVUUkFNUF9QQVggMSIgPj5jb25mZGVmcy5oCisKKyAgZmkKK2ZpCisKKworaWYgdGVzdCB4JFRBUkdFVCA9IHhYODZfV0lONjQ7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubworICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgordm9pZCBubV90ZXN0X2Z1bmMoKXt9CitpbnQgbWFpbigpe25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9CitfTFRfRU9GCisgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KKyAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KKyAgICBhY19ubGlzdD1jb25mdGVzdC5ubQorICAgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdFwiIjsgfSA+JjUKKyAgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCisgICAgICAjIFNlZSB3aGV0aGVyIHRoZSBzeW1ib2xzIGhhdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUuCisgICAgICBpZiBncmVwICdeLiBfbm1fdGVzdF9mdW5jJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgIGx0X2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKKyAgICAgIGVsc2UKKyAgICAgICAgaWYgZ3JlcCAnXi4gbm1fdGVzdF9mdW5jICcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCSAgOgorICAgICAgICBlbHNlCisJICBlY2hvICJjb25maWd1cmU6IGNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mNQorICAgICAgICBmaQorICAgICAgZmkKKyAgICBlbHNlCisgICAgICBlY2hvICJjb25maWd1cmU6IGNhbm5vdCBydW4gJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mNQorICAgIGZpCisgIGVsc2UKKyAgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICAgIGNhdCBjb25mdGVzdC5jID4mNQorICBmaQorICBybSAtcmYgY29uZnRlc3QqCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSIgPiY2OyB9CisgIHN5c19zeW1ib2xfdW5kZXJzY29yZT0kbHRfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlCisKKworICAgIGlmIHRlc3QgIngkc3lzX3N5bWJvbF91bmRlcnNjb3JlIiA9IHh5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgU1lNQk9MX1VOREVSU0NPUkUgMSIgPj5jb25mZGVmcy5oCisKKyAgICBmaQorZmkKKworRkZJX0VYRUNfVFJBTVBPTElORV9UQUJMRT0wCiBjYXNlICIkdGFyZ2V0IiBpbgotICAgICAqLWFwcGxlLWRhcndpbjEwKiB8ICotKi1mcmVlYnNkKiB8ICotKi1vcGVuYnNkKiB8ICotcGMtc29sYXJpcyopCisgICAgICphcm0qLWFwcGxlLWRhcndpbiopCisgICAgICAgRkZJX0VYRUNfVFJBTVBPTElORV9UQUJMRT0xCisKKyRhc19lY2hvICIjZGVmaW5lIEZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEUgMSIgPj5jb25mZGVmcy5oCisKKyAgICAgOzsKKyAgICAgKi1hcHBsZS1kYXJ3aW4xKiB8ICotKi1mcmVlYnNkKiB8ICotKi1rZnJlZWJzZCogfCAqLSotb3BlbmJzZCogfCAqLXBjLXNvbGFyaXMqKQogCiAkYXNfZWNobyAiI2RlZmluZSBGRklfTU1BUF9FWEVDX1dSSVQgMSIgPj5jb25mZGVmcy5oCiAKICAgICAgOzsKIGVzYWMKKyBpZiB0ZXN0IHgkRkZJX0VYRUNfVFJBTVBPTElORV9UQUJMRSA9IHgxOyB0aGVuCisgIEZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEVfVFJVRT0KKyAgRkZJX0VYRUNfVFJBTVBPTElORV9UQUJMRV9GQUxTRT0nIycKK2Vsc2UKKyAgRkZJX0VYRUNfVFJBTVBPTElORV9UQUJMRV9UUlVFPScjJworICBGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFX0ZBTFNFPQorZmkKIAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIC5laF9mcmFtZSBzZWN0aW9uIHNob3VsZCBiZSByZWFkLW9ubHkiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAuZWhfZnJhbWUgc2VjdGlvbiBzaG91bGQgYmUgcmVhZC1vbmx5Li4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2xpYmZmaV9jdl9yb19laF9mcmFtZStzZXR9IiA9IHNldDsgdGhlbiA6CisKKworaWYgdGVzdCB4JFRBUkdFVCA9IHhYODZfNjQ7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGFzc2VtYmxlciBzdXBwb3J0cyB1bndpbmQgc2VjdGlvbiB0eXBlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGFzc2VtYmxlciBzdXBwb3J0cyB1bndpbmQgc2VjdGlvbiB0eXBlLi4uICIgPiY2OyB9CitpZiAke2xpYmZmaV9jdl9hc194ODZfNjRfdW53aW5kX3NlY3Rpb25fdHlwZSs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAKLQlsaWJmZmlfY3Zfcm9fZWhfZnJhbWU9bm8KLQllY2hvICdleHRlcm4gdm9pZCBmb28gKHZvaWQpOyB2b2lkIGJhciAodm9pZCkgeyBmb28gKCk7IGZvbyAoKTsgfScgPiBjb25mdGVzdC5jCi0JaWYgJENDICRDRkxBR1MgLVMgLWZwaWMgLWZleGNlcHRpb25zIC1vIGNvbmZ0ZXN0LnMgY29uZnRlc3QuYyA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgIGlmIGdyZXAgJy5zZWN0aW9uLiplaF9mcmFtZS4qImEiJyBjb25mdGVzdC5zID4gL2Rldi9udWxsOyB0aGVuCi0JCWxpYmZmaV9jdl9yb19laF9mcmFtZT15ZXMKLQkgICAgZWxpZiBncmVwICcuc2VjdGlvbi4qZWhfZnJhbWUuKiNhbGxvYycgY29uZnRlc3QuYyBcCi0JCSB8IGdyZXAgLXYgJyN3cml0ZScgPiAvZGV2L251bGw7IHRoZW4KLQkJbGliZmZpX2N2X3JvX2VoX2ZyYW1lPXllcwotCSAgICBmaQorCWxpYmZmaV9jdl9hc194ODZfNjRfdW53aW5kX3NlY3Rpb25fdHlwZT15ZXMKKwllY2hvICcuc2VjdGlvbiAuZWhfZnJhbWUsImEiLEB1bndpbmQnID4gY29uZnRlc3QucworCWlmICRDQyAkQ0ZMQUdTIC1jIGNvbmZ0ZXN0LnMgMj4mMSB8IGdyZXAgLWkgd2FybmluZyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICBsaWJmZmlfY3ZfYXNfeDg2XzY0X3Vud2luZF9zZWN0aW9uX3R5cGU9bm8KIAlmaQotCXJtIC1mIGNvbmZ0ZXN0LioKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbGliZmZpX2N2X2FzX3g4Nl82NF91bndpbmRfc2VjdGlvbl90eXBlIiA+JjUKKyRhc19lY2hvICIkbGliZmZpX2N2X2FzX3g4Nl82NF91bndpbmRfc2VjdGlvbl90eXBlIiA+JjY7IH0KKyAgICBpZiB0ZXN0ICJ4JGxpYmZmaV9jdl9hc194ODZfNjRfdW53aW5kX3NlY3Rpb25fdHlwZSIgPSB4eWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfQVNfWDg2XzY0X1VOV0lORF9TRUNUSU9OX1RZUEUgMSIgPj5jb25mZGVmcy5oCisKKyAgICBmaQorZmkKKworaWYgdGVzdCAieCRHQ0MiID0gInh5ZXMiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAuZWhfZnJhbWUgc2VjdGlvbiBzaG91bGQgYmUgcmVhZC1vbmx5IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgLmVoX2ZyYW1lIHNlY3Rpb24gc2hvdWxkIGJlIHJlYWQtb25seS4uLiAiID4mNjsgfQoraWYgJHtsaWJmZmlfY3Zfcm9fZWhfZnJhbWUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisgIAlsaWJmZmlfY3Zfcm9fZWhfZnJhbWU9bm8KKyAgCWVjaG8gJ2V4dGVybiB2b2lkIGZvbyAodm9pZCk7IHZvaWQgYmFyICh2b2lkKSB7IGZvbyAoKTsgZm9vICgpOyB9JyA+IGNvbmZ0ZXN0LmMKKyAgCWlmICRDQyAkQ0ZMQUdTIC1jIC1mcGljIC1mZXhjZXB0aW9ucyAtbyBjb25mdGVzdC5vIGNvbmZ0ZXN0LmMgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICBvYmpkdW1wIC1oIGNvbmZ0ZXN0Lm8gPiBjb25mdGVzdC5kdW1wIDI+JjEKKwkgICAgbGliZmZpX2VoX2ZyYW1lX2xpbmU9YGdyZXAgLW4gZWhfZnJhbWUgY29uZnRlc3QuZHVtcCB8IGN1dCAtZDogLWYgMWAKKwkgICAgbGliZmZpX3Rlc3RfbGluZT1gZXhwciAkbGliZmZpX2VoX2ZyYW1lX2xpbmUgKyAxYHAKKwkgICAgc2VkIC1uICRsaWJmZmlfdGVzdF9saW5lIGNvbmZ0ZXN0LmR1bXAgPiBjb25mdGVzdC5saW5lCisgIAkgICAgaWYgZ3JlcCBSRUFET05MWSBjb25mdGVzdC5saW5lID4gL2Rldi9udWxsOyB0aGVuCisgIAkJbGliZmZpX2N2X3JvX2VoX2ZyYW1lPXllcworICAJICAgIGZpCisgIAlmaQorICAJcm0gLWYgY29uZnRlc3QuKgogCiBmaQogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsaWJmZmlfY3Zfcm9fZWhfZnJhbWUiID4mNQogJGFzX2VjaG8gIiRsaWJmZmlfY3Zfcm9fZWhfZnJhbWUiID4mNjsgfQotaWYgdGVzdCAieCRsaWJmZmlfY3Zfcm9fZWhfZnJhbWUiID0geHllczsgdGhlbgorICBpZiB0ZXN0ICJ4JGxpYmZmaV9jdl9yb19laF9mcmFtZSIgPSB4eWVzOyB0aGVuCiAKICRhc19lY2hvICIjZGVmaW5lIEhBVkVfUk9fRUhfRlJBTUUgMSIgPj5jb25mZGVmcy5oCiAKIAogJGFzX2VjaG8gIiNkZWZpbmUgRUhfRlJBTUVfRkxBR1MgXCJhXCIiID4+Y29uZmRlZnMuaAogCi1lbHNlCisgIGVsc2UKIAogJGFzX2VjaG8gIiNkZWZpbmUgRUhfRlJBTUVfRkxBR1MgXCJhd1wiIiA+PmNvbmZkZWZzLmgKIAotZmkKKyAgZmkKIAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eShcImhpZGRlblwiKSkpIiA+JjUKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eShcImhpZGRlblwiKSkpIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KFwiaGlkZGVuXCIpKSkuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7bGliZmZpX2N2X2hpZGRlbl92aXNpYmlsaXR5X2F0dHJpYnV0ZStzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2xpYmZmaV9jdl9oaWRkZW5fdmlzaWJpbGl0eV9hdHRyaWJ1dGUrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogCi0JZWNobyAnaW50IF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiaGlkZGVuIikpKSBmb28gKHZvaWQpIHsgcmV0dXJuIDE7IH0nID4gY29uZnRlc3QuYwotCWxpYmZmaV9jdl9oaWRkZW5fdmlzaWJpbGl0eV9hdHRyaWJ1dGU9bm8KLQlpZiB7IGFjX3RyeT0nJHtDQy1jY30gLVdlcnJvciAtUyBjb25mdGVzdC5jIC1vIGNvbmZ0ZXN0LnMgMT4mNScKKyAgCWVjaG8gJ2ludCBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImhpZGRlbiIpKSkgZm9vICh2b2lkKSB7IHJldHVybiAxICA7IH0nID4gY29uZnRlc3QuYworICAJbGliZmZpX2N2X2hpZGRlbl92aXNpYmlsaXR5X2F0dHJpYnV0ZT1ubworICAJaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1XZXJyb3IgLVMgY29uZnRlc3QuYyAtbyBjb25mdGVzdC5zIDE+JjUnCiAgIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY190cnlcIiI7IH0gPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CiAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB9OyB0aGVuCi0JICAgIGlmIGdyZXAgJ1wuaGlkZGVuLipmb28nIGNvbmZ0ZXN0LnMgPi9kZXYvbnVsbDsgdGhlbgotCQlsaWJmZmlfY3ZfaGlkZGVuX3Zpc2liaWxpdHlfYXR0cmlidXRlPXllcwotCSAgICBmaQotCWZpCi0Jcm0gLWYgY29uZnRlc3QuKgorICAJICAgIGlmIGdyZXAgJ1wuaGlkZGVuLipmb28nIGNvbmZ0ZXN0LnMgPi9kZXYvbnVsbDsgdGhlbgorICAJCWxpYmZmaV9jdl9oaWRkZW5fdmlzaWJpbGl0eV9hdHRyaWJ1dGU9eWVzCisgIAkgICAgZmkKKyAgCWZpCisgIAlybSAtZiBjb25mdGVzdC4qCiAKIGZpCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGxpYmZmaV9jdl9oaWRkZW5fdmlzaWJpbGl0eV9hdHRyaWJ1dGUiID4mNQogJGFzX2VjaG8gIiRsaWJmZmlfY3ZfaGlkZGVuX3Zpc2liaWxpdHlfYXR0cmlidXRlIiA+JjY7IH0KLWlmIHRlc3QgJGxpYmZmaV9jdl9oaWRkZW5fdmlzaWJpbGl0eV9hdHRyaWJ1dGUgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAkbGliZmZpX2N2X2hpZGRlbl92aXNpYmlsaXR5X2F0dHJpYnV0ZSA9IHllczsgdGhlbgogCiAkYXNfZWNobyAiI2RlZmluZSBIQVZFX0hJRERFTl9WSVNJQklMSVRZX0FUVFJJQlVURSAxIiA+PmNvbmZkZWZzLmgKIAorICBmaQogZmkKIAogCkBAIC0xMjM2NSw2ICsxNDc4NiwxNCBAQAogICBmaQogZmkKIAorIGlmIHRlc3QgIiRlbmFibGVfZGVidWciID0gInllcyI7IHRoZW4KKyAgRkZJX0RFQlVHX1RSVUU9CisgIEZGSV9ERUJVR19GQUxTRT0nIycKK2Vsc2UKKyAgRkZJX0RFQlVHX1RSVUU9JyMnCisgIEZGSV9ERUJVR19GQUxTRT0KK2ZpCisKIAogIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0cnVjdHMgd2FzIGdpdmVuLgogaWYgdGVzdCAiJHtlbmFibGVfc3RydWN0cytzZXR9IiA9IHNldDsgdGhlbiA6CkBAIC0xMjM3NSw2ICsxNDgwNCwxNCBAQAogICBmaQogZmkKIAorIGlmIHRlc3QgIiRlbmFibGVfZGVidWciID0gInllcyI7IHRoZW4KKyAgRkZJX0RFQlVHX1RSVUU9CisgIEZGSV9ERUJVR19GQUxTRT0nIycKK2Vsc2UKKyAgRkZJX0RFQlVHX1RSVUU9JyMnCisgIEZGSV9ERUJVR19GQUxTRT0KK2ZpCisKIAogIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXJhdy1hcGkgd2FzIGdpdmVuLgogaWYgdGVzdCAiJHtlbmFibGVfcmF3X2FwaStzZXR9IiA9IHNldDsgdGhlbiA6CkBAIC0xMjM5NiwyOCArMTQ4MzMsMjggQEAKIGZpCiAKIAotaWYgdGVzdCAtbiAiJHdpdGhfY3Jvc3NfaG9zdCIgJiYKLSAgIHRlc3QgeCIkd2l0aF9jcm9zc19ob3N0IiAhPSB4Im5vIjsgdGhlbgotICB0b29sZXhlY2Rpcj0nJChleGVjX3ByZWZpeCkvJCh0YXJnZXRfYWxpYXMpJwotICB0b29sZXhlY2xpYmRpcj0nJCh0b29sZXhlY2RpcikvbGliJworIyBUaGVzZSB2YXJpYWJsZXMgYXJlIG9ubHkgZXZlciB1c2VkIHdoZW4gd2UgY3Jvc3MtYnVpbGQgdG8gWDg2X1dJTjMyLgorIyBBbmQgd2Ugb25seSBzdXBwb3J0IHRoaXMgd2l0aCBHQ0MsIHNvLi4uCitpZiB0ZXN0ICJ4JEdDQyIgPSAieHllcyI7IHRoZW4KKyAgaWYgdGVzdCAtbiAiJHdpdGhfY3Jvc3NfaG9zdCIgJiYKKyAgICAgdGVzdCB4IiR3aXRoX2Nyb3NzX2hvc3QiICE9IHgibm8iOyB0aGVuCisgICAgdG9vbGV4ZWNkaXI9JyQoZXhlY19wcmVmaXgpLyQodGFyZ2V0X2FsaWFzKScKKyAgICB0b29sZXhlY2xpYmRpcj0nJCh0b29sZXhlY2RpcikvbGliJworICBlbHNlCisgICAgdG9vbGV4ZWNkaXI9JyQobGliZGlyKS9nY2MtbGliLyQodGFyZ2V0X2FsaWFzKScKKyAgICB0b29sZXhlY2xpYmRpcj0nJChsaWJkaXIpJworICBmaQorICBtdWx0aV9vc19kaXJlY3Rvcnk9YCRDQyAtcHJpbnQtbXVsdGktb3MtZGlyZWN0b3J5YAorICBjYXNlICRtdWx0aV9vc19kaXJlY3RvcnkgaW4KKyAgICAuKSA7OyAjIEF2b2lkIHRyYWlsaW5nIC8uCisgICAgLi4vKikgdG9vbGV4ZWNsaWJkaXI9JHRvb2xleGVjbGliZGlyLyRtdWx0aV9vc19kaXJlY3RvcnkgOzsKKyAgZXNhYworCiBlbHNlCi0gIHRvb2xleGVjZGlyPSckKGxpYmRpcikvZ2NjLWxpYi8kKHRhcmdldF9hbGlhcyknCiAgIHRvb2xleGVjbGliZGlyPSckKGxpYmRpciknCiBmaQotbXVsdGlfb3NfZGlyZWN0b3J5PWAkQ0MgLXByaW50LW11bHRpLW9zLWRpcmVjdG9yeWAKLWNhc2UgJG11bHRpX29zX2RpcmVjdG9yeSBpbgotICAuKSA7OyAjIEF2b2lkIHRyYWlsaW5nIC8uCi0gICopIHRvb2xleGVjbGliZGlyPSR0b29sZXhlY2xpYmRpci8kbXVsdGlfb3NfZGlyZWN0b3J5IDs7Ci1lc2FjCiAKIAotCi1pZiB0ZXN0ICIke211bHRpbGlifSIgPSAieWVzIjsgdGhlbgotICBtdWx0aWxpYl9hcmc9Ii0tZW5hYmxlLW11bHRpbGliIgotZWxzZQotICBtdWx0aWxpYl9hcmc9Ci1maQotCiBhY19jb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMgaW5jbHVkZSIKIAogYWNfY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIHNyYyIKQEAgLTEyNDk5LDEwICsxNDkzNiwyMSBAQAogICAgICA6ZW5kJyA+PmNvbmZjYWNoZQogaWYgZGlmZiAiJGNhY2hlX2ZpbGUiIGNvbmZjYWNoZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQogICBpZiB0ZXN0IC13ICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgICB0ZXN0ICJ4JGNhY2hlX2ZpbGUiICE9ICJ4L2Rldi9udWxsIiAmJgorICAgIGlmIHRlc3QgIngkY2FjaGVfZmlsZSIgIT0gIngvZGV2L251bGwiOyB0aGVuCiAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKICRhc19lY2hvICIkYXNfbWU6IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICAgIGNhdCBjb25mY2FjaGUgPiRjYWNoZV9maWxlCisgICAgICBpZiB0ZXN0ICEgLWYgIiRjYWNoZV9maWxlIiB8fCB0ZXN0IC1oICIkY2FjaGVfZmlsZSI7IHRoZW4KKwljYXQgY29uZmNhY2hlID4iJGNhY2hlX2ZpbGUiCisgICAgICBlbHNlCisgICAgICAgIGNhc2UgJGNhY2hlX2ZpbGUgaW4gIygKKyAgICAgICAgKi8qIHwgPzoqKQorCSAgbXYgLWYgY29uZmNhY2hlICIkY2FjaGVfZmlsZSIkJCAmJgorCSAgbXYgLWYgIiRjYWNoZV9maWxlIiQkICIkY2FjaGVfZmlsZSIgOzsgIygKKyAgICAgICAgKikKKwkgIG12IC1mIGNvbmZjYWNoZSAiJGNhY2hlX2ZpbGUiIDs7CisJZXNhYworICAgICAgZmkKKyAgICBmaQogICBlbHNlCiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CiAkYXNfZWNobyAiJGFzX21lOiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KQEAgLTEyNTE4LDYgKzE0OTY2LDcgQEAKIAogYWNfbGlib2Jqcz0KIGFjX2x0bGlib2Jqcz0KK1U9CiBmb3IgYWNfaSBpbiA6ICRMSUJPQkpTOyBkbyB0ZXN0ICJ4JGFjX2kiID0geDogJiYgY29udGludWUKICAgIyAxLiBSZW1vdmUgdGhlIGV4dGVuc2lvbiwgYW5kICRVIGlmIGFscmVhZHkgaW5zdGFsbGVkLgogICBhY19zY3JpcHQ9J3MvXCRVXC4vLi87cy9cLm8kLy87cy9cLm9iaiQvLycKQEAgLTEyNTMyLDYgKzE0OTgxLDE0IEBACiBMVExJQk9CSlM9JGFjX2x0bGlib2JqcwogCiAKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgdGhhdCBnZW5lcmF0ZWQgZmlsZXMgYXJlIG5ld2VyIHRoYW4gY29uZmlndXJlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHRoYXQgZ2VuZXJhdGVkIGZpbGVzIGFyZSBuZXdlciB0aGFuIGNvbmZpZ3VyZS4uLiAiID4mNjsgfQorICAgaWYgdGVzdCAtbiAiJGFtX3NsZWVwX3BpZCI7IHRoZW4KKyAgICAgIyBIaWRlIHdhcm5pbmdzIGFib3V0IHJldXNlZCBQSURzLgorICAgICB3YWl0ICRhbV9zbGVlcF9waWQgMj4vZGV2L251bGwKKyAgIGZpCisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogZG9uZSIgPiY1CiskYXNfZWNobyAiZG9uZSIgPiY2OyB9CiAgaWYgdGVzdCAtbiAiJEVYRUVYVCI7IHRoZW4KICAgYW1fX0VYRUVYVF9UUlVFPQogICBhbV9fRVhFRVhUX0ZBTFNFPScjJwpAQCAtMTI1NDEsMTMyICsxNDk5OCwxNzIgQEAKIGZpCiAKIGlmIHRlc3QgLXogIiR7QU1ERVBfVFJVRX0iICYmIHRlc3QgLXogIiR7QU1ERVBfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAiY29uZGl0aW9uYWwgXCJBTURFUFwiIHdhcyBuZXZlciBkZWZpbmVkLgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJBTURFUFwiIHdhcyBuZXZlciBkZWZpbmVkLgogVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQogZmkKIGlmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDQ19UUlVFfSIgJiYgdGVzdCAteiAiJHthbV9fZmFzdGRlcENDX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgImNvbmRpdGlvbmFsIFwiYW1fX2Zhc3RkZXBDQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJhbV9fZmFzdGRlcENDXCIgd2FzIG5ldmVyIGRlZmluZWQuCiBVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CiBmaQogaWYgdGVzdCAteiAiJHthbV9fZmFzdGRlcENDQVNfVFJVRX0iICYmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDQ0FTX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgImNvbmRpdGlvbmFsIFwiYW1fX2Zhc3RkZXBDQ0FTXCIgd2FzIG5ldmVyIGRlZmluZWQuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcImFtX19mYXN0ZGVwQ0NBU1wiIHdhcyBuZXZlciBkZWZpbmVkLgogVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQogZmkKIGlmIHRlc3QgLXogIiR7TUFJTlRBSU5FUl9NT0RFX1RSVUV9IiAmJiB0ZXN0IC16ICIke01BSU5UQUlORVJfTU9ERV9GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICJjb25kaXRpb25hbCBcIk1BSU5UQUlORVJfTU9ERVwiIHdhcyBuZXZlciBkZWZpbmVkLgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJNQUlOVEFJTkVSX01PREVcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KIFVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKIGZpCiBpZiB0ZXN0IC16ICIke1RFU1RTVUJESVJfVFJVRX0iICYmIHRlc3QgLXogIiR7VEVTVFNVQkRJUl9GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICJjb25kaXRpb25hbCBcIlRFU1RTVUJESVJcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiVEVTVFNVQkRJUlwiIHdhcyBuZXZlciBkZWZpbmVkLgogVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQogZmkKIGlmIHRlc3QgLXogIiR7TUlQU19UUlVFfSIgJiYgdGVzdCAteiAiJHtNSVBTX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgImNvbmRpdGlvbmFsIFwiTUlQU1wiIHdhcyBuZXZlciBkZWZpbmVkLgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJNSVBTXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHtCRklOX1RSVUV9IiAmJiB0ZXN0IC16ICIke0JGSU5fRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJCRklOXCIgd2FzIG5ldmVyIGRlZmluZWQuCiBVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CiBmaQogaWYgdGVzdCAteiAiJHtTUEFSQ19UUlVFfSIgJiYgdGVzdCAteiAiJHtTUEFSQ19GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICJjb25kaXRpb25hbCBcIlNQQVJDXCIgd2FzIG5ldmVyIGRlZmluZWQuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIlNQQVJDXCIgd2FzIG5ldmVyIGRlZmluZWQuCiBVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CiBmaQogaWYgdGVzdCAteiAiJHtYODZfVFJVRX0iICYmIHRlc3QgLXogIiR7WDg2X0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgImNvbmRpdGlvbmFsIFwiWDg2XCIgd2FzIG5ldmVyIGRlZmluZWQuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIlg4NlwiIHdhcyBuZXZlciBkZWZpbmVkLgogVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQogZmkKIGlmIHRlc3QgLXogIiR7WDg2X0ZSRUVCU0RfVFJVRX0iICYmIHRlc3QgLXogIiR7WDg2X0ZSRUVCU0RfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAiY29uZGl0aW9uYWwgXCJYODZfRlJFRUJTRFwiIHdhcyBuZXZlciBkZWZpbmVkLgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJYODZfRlJFRUJTRFwiIHdhcyBuZXZlciBkZWZpbmVkLgogVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQogZmkKIGlmIHRlc3QgLXogIiR7WDg2X1dJTjMyX1RSVUV9IiAmJiB0ZXN0IC16ICIke1g4Nl9XSU4zMl9GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICJjb25kaXRpb25hbCBcIlg4Nl9XSU4zMlwiIHdhcyBuZXZlciBkZWZpbmVkLgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJYODZfV0lOMzJcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KIFVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKIGZpCiBpZiB0ZXN0IC16ICIke1g4Nl9XSU42NF9UUlVFfSIgJiYgdGVzdCAteiAiJHtYODZfV0lONjRfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAiY29uZGl0aW9uYWwgXCJYODZfV0lONjRcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiWDg2X1dJTjY0XCIgd2FzIG5ldmVyIGRlZmluZWQuCiBVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CiBmaQogaWYgdGVzdCAteiAiJHtYODZfREFSV0lOX1RSVUV9IiAmJiB0ZXN0IC16ICIke1g4Nl9EQVJXSU5fRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAiY29uZGl0aW9uYWwgXCJYODZfREFSV0lOXCIgd2FzIG5ldmVyIGRlZmluZWQuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIlg4Nl9EQVJXSU5cIiB3YXMgbmV2ZXIgZGVmaW5lZC4KIFVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKIGZpCiBpZiB0ZXN0IC16ICIke0FMUEhBX1RSVUV9IiAmJiB0ZXN0IC16ICIke0FMUEhBX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgImNvbmRpdGlvbmFsIFwiQUxQSEFcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiQUxQSEFcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KIFVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKIGZpCiBpZiB0ZXN0IC16ICIke0lBNjRfVFJVRX0iICYmIHRlc3QgLXogIiR7SUE2NF9GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICJjb25kaXRpb25hbCBcIklBNjRcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiSUE2NFwiIHdhcyBuZXZlciBkZWZpbmVkLgogVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQogZmkKIGlmIHRlc3QgLXogIiR7TTMyUl9UUlVFfSIgJiYgdGVzdCAteiAiJHtNMzJSX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgImNvbmRpdGlvbmFsIFwiTTMyUlwiIHdhcyBuZXZlciBkZWZpbmVkLgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJNMzJSXCIgd2FzIG5ldmVyIGRlZmluZWQuCiBVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CiBmaQogaWYgdGVzdCAteiAiJHtNNjhLX1RSVUV9IiAmJiB0ZXN0IC16ICIke002OEtfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAiY29uZGl0aW9uYWwgXCJNNjhLXCIgd2FzIG5ldmVyIGRlZmluZWQuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIk02OEtcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKK2ZpCitpZiB0ZXN0IC16ICIke01JQ1JPQkxBWkVfVFJVRX0iICYmIHRlc3QgLXogIiR7TUlDUk9CTEFaRV9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIk1JQ1JPQkxBWkVcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKK2ZpCitpZiB0ZXN0IC16ICIke01FVEFHX1RSVUV9IiAmJiB0ZXN0IC16ICIke01FVEFHX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiTUVUQUdcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKK2ZpCitpZiB0ZXN0IC16ICIke01PWElFX1RSVUV9IiAmJiB0ZXN0IC16ICIke01PWElFX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiTU9YSUVcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KIFVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKIGZpCiBpZiB0ZXN0IC16ICIke1BPV0VSUENfVFJVRX0iICYmIHRlc3QgLXogIiR7UE9XRVJQQ19GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICJjb25kaXRpb25hbCBcIlBPV0VSUENcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiUE9XRVJQQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgogVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQogZmkKIGlmIHRlc3QgLXogIiR7UE9XRVJQQ19BSVhfVFJVRX0iICYmIHRlc3QgLXogIiR7UE9XRVJQQ19BSVhfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAiY29uZGl0aW9uYWwgXCJQT1dFUlBDX0FJWFwiIHdhcyBuZXZlciBkZWZpbmVkLgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJQT1dFUlBDX0FJWFwiIHdhcyBuZXZlciBkZWZpbmVkLgogVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQogZmkKIGlmIHRlc3QgLXogIiR7UE9XRVJQQ19EQVJXSU5fVFJVRX0iICYmIHRlc3QgLXogIiR7UE9XRVJQQ19EQVJXSU5fRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAiY29uZGl0aW9uYWwgXCJQT1dFUlBDX0RBUldJTlwiIHdhcyBuZXZlciBkZWZpbmVkLgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJQT1dFUlBDX0RBUldJTlwiIHdhcyBuZXZlciBkZWZpbmVkLgogVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQogZmkKIGlmIHRlc3QgLXogIiR7UE9XRVJQQ19GUkVFQlNEX1RSVUV9IiAmJiB0ZXN0IC16ICIke1BPV0VSUENfRlJFRUJTRF9GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICJjb25kaXRpb25hbCBcIlBPV0VSUENfRlJFRUJTRFwiIHdhcyBuZXZlciBkZWZpbmVkLgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJQT1dFUlBDX0ZSRUVCU0RcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKK2ZpCitpZiB0ZXN0IC16ICIke0FBUkNINjRfVFJVRX0iICYmIHRlc3QgLXogIiR7QUFSQ0g2NF9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkFBUkNINjRcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KIFVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKIGZpCiBpZiB0ZXN0IC16ICIke0FSTV9UUlVFfSIgJiYgdGVzdCAteiAiJHtBUk1fRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAiY29uZGl0aW9uYWwgXCJBUk1cIiB3YXMgbmV2ZXIgZGVmaW5lZC4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiQVJNXCIgd2FzIG5ldmVyIGRlZmluZWQuCiBVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CiBmaQogaWYgdGVzdCAteiAiJHtBVlIzMl9UUlVFfSIgJiYgdGVzdCAteiAiJHtBVlIzMl9GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICJjb25kaXRpb25hbCBcIkFWUjMyXCIgd2FzIG5ldmVyIGRlZmluZWQuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkFWUjMyXCIgd2FzIG5ldmVyIGRlZmluZWQuCiBVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CiBmaQogaWYgdGVzdCAteiAiJHtMSUJGRklfQ1JJU19UUlVFfSIgJiYgdGVzdCAteiAiJHtMSUJGRklfQ1JJU19GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICJjb25kaXRpb25hbCBcIkxJQkZGSV9DUklTXCIgd2FzIG5ldmVyIGRlZmluZWQuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkxJQkZGSV9DUklTXCIgd2FzIG5ldmVyIGRlZmluZWQuCiBVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CiBmaQogaWYgdGVzdCAteiAiJHtGUlZfVFJVRX0iICYmIHRlc3QgLXogIiR7RlJWX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgImNvbmRpdGlvbmFsIFwiRlJWXCIgd2FzIG5ldmVyIGRlZmluZWQuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkZSVlwiIHdhcyBuZXZlciBkZWZpbmVkLgogVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQogZmkKIGlmIHRlc3QgLXogIiR7UzM5MF9UUlVFfSIgJiYgdGVzdCAteiAiJHtTMzkwX0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgImNvbmRpdGlvbmFsIFwiUzM5MFwiIHdhcyBuZXZlciBkZWZpbmVkLgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJTMzkwXCIgd2FzIG5ldmVyIGRlZmluZWQuCiBVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CiBmaQogaWYgdGVzdCAteiAiJHtYODZfNjRfVFJVRX0iICYmIHRlc3QgLXogIiR7WDg2XzY0X0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgImNvbmRpdGlvbmFsIFwiWDg2XzY0XCIgd2FzIG5ldmVyIGRlZmluZWQuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIlg4Nl82NFwiIHdhcyBuZXZlciBkZWZpbmVkLgogVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQogZmkKIGlmIHRlc3QgLXogIiR7U0hfVFJVRX0iICYmIHRlc3QgLXogIiR7U0hfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAiY29uZGl0aW9uYWwgXCJTSFwiIHdhcyBuZXZlciBkZWZpbmVkLgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJTSFwiIHdhcyBuZXZlciBkZWZpbmVkLgogVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQogZmkKIGlmIHRlc3QgLXogIiR7U0g2NF9UUlVFfSIgJiYgdGVzdCAteiAiJHtTSDY0X0ZBTFNFfSI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgImNvbmRpdGlvbmFsIFwiU0g2NFwiIHdhcyBuZXZlciBkZWZpbmVkLgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJTSDY0XCIgd2FzIG5ldmVyIGRlZmluZWQuCiBVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CiBmaQogaWYgdGVzdCAteiAiJHtQQV9MSU5VWF9UUlVFfSIgJiYgdGVzdCAteiAiJHtQQV9MSU5VWF9GQUxTRX0iOyB0aGVuCi0gIGFzX2ZuX2Vycm9yICJjb25kaXRpb25hbCBcIlBBX0xJTlVYXCIgd2FzIG5ldmVyIGRlZmluZWQuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIlBBX0xJTlVYXCIgd2FzIG5ldmVyIGRlZmluZWQuCiBVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CiBmaQogaWYgdGVzdCAteiAiJHtQQV9IUFVYX1RSVUV9IiAmJiB0ZXN0IC16ICIke1BBX0hQVVhfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAiY29uZGl0aW9uYWwgXCJQQV9IUFVYXCIgd2FzIG5ldmVyIGRlZmluZWQuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIlBBX0hQVVhcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KIFVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKIGZpCiBpZiB0ZXN0IC16ICIke1BBNjRfSFBVWF9UUlVFfSIgJiYgdGVzdCAteiAiJHtQQTY0X0hQVVhfRkFMU0V9IjsgdGhlbgotICBhc19mbl9lcnJvciAiY29uZGl0aW9uYWwgXCJQQTY0X0hQVVhcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiUEE2NF9IUFVYXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHtUSUxFX1RSVUV9IiAmJiB0ZXN0IC16ICIke1RJTEVfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJUSUxFXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHtYVEVOU0FfVFJVRX0iICYmIHRlc3QgLXogIiR7WFRFTlNBX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiWFRFTlNBXCIgd2FzIG5ldmVyIGRlZmluZWQuCiBVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CiBmaQogCitpZiB0ZXN0IC16ICIke0ZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEVfVFJVRX0iICYmIHRlc3QgLXogIiR7RkZJX0VYRUNfVFJBTVBPTElORV9UQUJMRV9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEVcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKK2ZpCitpZiB0ZXN0IC16ICIke0ZGSV9ERUJVR19UUlVFfSIgJiYgdGVzdCAteiAiJHtGRklfREVCVUdfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJGRklfREVCVUdcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKK2ZpCitpZiB0ZXN0IC16ICIke0ZGSV9ERUJVR19UUlVFfSIgJiYgdGVzdCAteiAiJHtGRklfREVCVUdfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJGRklfREVCVUdcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKK2ZpCiAKLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KKzogIiR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9IgogYWNfd3JpdGVfZmFpbD0wCiBhY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcwogYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyAkQ09ORklHX1NUQVRVUyIKQEAgLTEyNzY3LDYgKzE1MjY0LDcgQEAKIElGUz0iICIiCSRhc19ubCIKIAogIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gZGlyZWN0b3J5IHNlcGFyYXRvci4KK2FzX215c2VsZj0KIGNhc2UgJDAgaW4gIygoCiAgICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKICAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgpAQCAtMTI4MTIsMTkgKzE1MzEwLDE5IEBACiAodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICiAKIAotIyBhc19mbl9lcnJvciBFUlJPUiBbTElORU5PIExPR19GRF0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGFzX2ZuX2Vycm9yIFNUQVRVUyBFUlJPUiBbTElORU5PIExPR19GRF0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBPdXRwdXQgImBiYXNlbmFtZSAkMGA6IGVycm9yOiBFUlJPUiIgdG8gc3RkZXJyLiBJZiBMSU5FTk8gYW5kIExPR19GRCBhcmUKICMgcHJvdmlkZWQsIGFsc28gb3V0cHV0IHRoZSBlcnJvciB0byBMT0dfRkQsIHJlZmVyZW5jaW5nIExJTkVOTy4gVGhlbiBleGl0IHRoZQotIyBzY3JpcHQgd2l0aCBzdGF0dXMgJD8sIHVzaW5nIDEgaWYgdGhhdCB3YXMgMC4KKyMgc2NyaXB0IHdpdGggU1RBVFVTLCB1c2luZyAxIGlmIHRoYXQgd2FzIDAuCiBhc19mbl9lcnJvciAoKQogewotICBhc19zdGF0dXM9JD87IHRlc3QgJGFzX3N0YXR1cyAtZXEgMCAmJiBhc19zdGF0dXM9MQotICBpZiB0ZXN0ICIkMyI7IHRoZW4KLSAgICBhc19saW5lbm89JHthc19saW5lbm8tIiQyIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6ICQxIiA+JiQzCisgIGFzX3N0YXR1cz0kMTsgdGVzdCAkYXNfc3RhdHVzIC1lcSAwICYmIGFzX3N0YXR1cz0xCisgIGlmIHRlc3QgIiQ0IjsgdGhlbgorICAgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDMifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogJDIiID4mJDQKICAgZmkKLSAgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6ICQxIiA+JjIKKyAgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6ICQyIiA+JjIKICAgYXNfZm5fZXhpdCAkYXNfc3RhdHVzCiB9ICMgYXNfZm5fZXJyb3IKIApAQCAtMTI5NjIsMTYgKzE1NDYwLDE2IEBACiAgICAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKICAgICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgogICAgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgotICAgICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcCcuCisgICAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wUicuCiAgICAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAotICAgICAgYXNfbG5fcz0nY3AgLXAnCisgICAgICBhc19sbl9zPSdjcCAtcFInCiAgIGVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgYXNfbG5fcz1sbgogICBlbHNlCi0gICAgYXNfbG5fcz0nY3AgLXAnCisgICAgYXNfbG5fcz0nY3AgLXBSJwogICBmaQogZWxzZQotICBhc19sbl9zPSdjcCAtcCcKKyAgYXNfbG5fcz0nY3AgLXBSJwogZmkKIHJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKIHJtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKQEAgLTEzMDIwLDcgKzE1NTE4LDcgQEAKICAgICAgIHRlc3QgLWQgIiRhc19kaXIiICYmIGJyZWFrCiAgICAgZG9uZQogICAgIHRlc3QgLXogIiRhc19kaXJzIiB8fCBldmFsICJta2RpciAkYXNfZGlycyIKLSAgfSB8fCB0ZXN0IC1kICIkYXNfZGlyIiB8fCBhc19mbl9lcnJvciAiY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIKKyAgfSB8fCB0ZXN0IC1kICIkYXNfZGlyIiB8fCBhc19mbl9lcnJvciAkPyAiY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIKIAogCiB9ICMgYXNfZm5fbWtkaXJfcApAQCAtMTMwMzEsMjggKzE1NTI5LDE2IEBACiAgIGFzX21rZGlyX3A9ZmFsc2UKIGZpCiAKLWlmIHRlc3QgLXggLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYXNfdGVzdF94PSd0ZXN0IC14JwotZWxzZQotICBpZiBscyAtZEwgLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBhc19sc19MX29wdGlvbj1MCi0gIGVsc2UKLSAgICBhc19sc19MX29wdGlvbj0KLSAgZmkKLSAgYXNfdGVzdF94PScKLSAgICBldmFsIHNoIC1jICdcJycKLSAgICAgIGlmIHRlc3QgLWQgIiQxIjsgdGhlbgotCXRlc3QgLWQgIiQxLy4iOwotICAgICAgZWxzZQotCWNhc2UgJDEgaW4gIygKLQktKilzZXQgIi4vJDEiOzsKLQllc2FjOwotCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluICMoKAotCT8/P1tzeF0qKTo7OyopZmFsc2U7O2VzYWM7ZmkKLSAgICAnXCcnIHNoCi0gICcKLWZpCi1hc19leGVjdXRhYmxlX3A9JGFzX3Rlc3RfeAorCisjIGFzX2ZuX2V4ZWN1dGFibGVfcCBGSUxFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRlc3QgaWYgRklMRSBpcyBhbiBleGVjdXRhYmxlIHJlZ3VsYXIgZmlsZS4KK2FzX2ZuX2V4ZWN1dGFibGVfcCAoKQoreworICB0ZXN0IC1mICIkMSIgJiYgdGVzdCAteCAiJDEiCit9ICMgYXNfZm5fZXhlY3V0YWJsZV9wCithc190ZXN0X3g9J3Rlc3QgLXgnCithc19leGVjdXRhYmxlX3A9YXNfZm5fZXhlY3V0YWJsZV9wCiAKICMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KIGFzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCkBAIC0xMzA3Myw4ICsxNTU1OSw4IEBACiAjIHJlcG9ydCBhY3R1YWwgaW5wdXQgdmFsdWVzIG9mIENPTkZJR19GSUxFUyBldGMuIGluc3RlYWQgb2YgdGhlaXIKICMgdmFsdWVzIGFmdGVyIG9wdGlvbnMgaGFuZGxpbmcuCiBhY19sb2c9IgotVGhpcyBmaWxlIHdhcyBleHRlbmRlZCBieSBsaWJmZmkgJGFzX21lIDMuMC4xMHJjMCwgd2hpY2ggd2FzCi1nZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjUuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKK1RoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgbGliZmZpICRhc19tZSAzLjAuMTMsIHdoaWNoIHdhcworZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5LiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCiAKICAgQ09ORklHX0ZJTEVTICAgID0gJENPTkZJR19GSUxFUwogICBDT05GSUdfSEVBREVSUyAgPSAkQ09ORklHX0hFQURFUlMKQEAgLTEzMTM3LDE3ICsxNTYyMywxNyBAQAogQ29uZmlndXJhdGlvbiBjb21tYW5kczoKICRjb25maWdfY29tbWFuZHMKIAotUmVwb3J0IGJ1Z3MgdG8gPGh0dHA6Ly9nY2MuZ251Lm9yZy9idWdzLmh0bWw+LiIKK1JlcG9ydCBidWdzIHRvIDxodHRwOi8vZ2l0aHViLmNvbS9hdGdyZWVuL2xpYmZmaS9pc3N1ZXM+LiIKIAogX0FDRU9GCiBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKIGFjX2NzX2NvbmZpZz0iYCRhc19lY2hvICIkYWNfY29uZmlndXJlX2FyZ3MiIHwgc2VkICdzL14gLy87IHMvW1xcIiJcYFwkXS9cXFxcJi9nJ2AiCiBhY19jc192ZXJzaW9uPSJcXAotbGliZmZpIGNvbmZpZy5zdGF0dXMgMy4wLjEwcmMwCi1jb25maWd1cmVkIGJ5ICQwLCBnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjUsCitsaWJmZmkgY29uZmlnLnN0YXR1cyAzLjAuMTMKK2NvbmZpZ3VyZWQgYnkgJDAsIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OSwKICAgd2l0aCBvcHRpb25zIFxcIlwkYWNfY3NfY29uZmlnXFwiCiAKLUNvcHlyaWdodCAoQykgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK0NvcHlyaWdodCAoQykgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KIFRoaXMgY29uZmlnLnN0YXR1cyBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgogZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LiIKIApAQCAtMTMxNjUsMTEgKzE1NjUxLDE2IEBACiB3aGlsZSB0ZXN0ICQjICE9IDAKIGRvCiAgIGNhc2UgJDEgaW4KLSAgLS0qPSopCisgIC0tKj0/KikKICAgICBhY19vcHRpb249YGV4cHIgIlgkMSIgOiAnWFwoW149XSpcKT0nYAogICAgIGFjX29wdGFyZz1gZXhwciAiWCQxIiA6ICdYW149XSo9XCguKlwpJ2AKICAgICBhY19zaGlmdD06CiAgICAgOzsKKyAgLS0qPSkKKyAgICBhY19vcHRpb249YGV4cHIgIlgkMSIgOiAnWFwoW149XSpcKT0nYAorICAgIGFjX29wdGFyZz0KKyAgICBhY19zaGlmdD06CisgICAgOzsKICAgKikKICAgICBhY19vcHRpb249JDEKICAgICBhY19vcHRhcmc9JDIKQEAgLTEzMTkxLDYgKzE1NjgyLDcgQEAKICAgICAkYWNfc2hpZnQKICAgICBjYXNlICRhY19vcHRhcmcgaW4KICAgICAqXCcqKSBhY19vcHRhcmc9YCRhc19lY2hvICIkYWNfb3B0YXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OworICAgICcnKSBhc19mbl9lcnJvciAkPyAibWlzc2luZyBmaWxlIGFyZ3VtZW50IiA7OwogICAgIGVzYWMKICAgICBhc19mbl9hcHBlbmQgQ09ORklHX0ZJTEVTICIgJyRhY19vcHRhcmcnIgogICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OwpAQCAtMTMyMDMsNyArMTU2OTUsNyBAQAogICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OwogICAtLWhlIHwgLS1oKQogICAgICMgQ29uZmxpY3QgYmV0d2VlbiAtLWhlbHAgYW5kIC0taGVhZGVyCi0gICAgYXNfZm5fZXJyb3IgImFtYmlndW91cyBvcHRpb246IFxgJDEnCisgICAgYXNfZm5fZXJyb3IgJD8gImFtYmlndW91cyBvcHRpb246IFxgJDEnCiBUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiI7OwogICAtLWhlbHAgfCAtLWhlbCB8IC1oICkKICAgICAkYXNfZWNobyAiJGFjX2NzX3VzYWdlIjsgZXhpdCA7OwpAQCAtMTMyMTIsNyArMTU3MDQsNyBAQAogICAgIGFjX2NzX3NpbGVudD06IDs7CiAKICAgIyBUaGlzIGlzIGFuIGVycm9yLgotICAtKikgYXNfZm5fZXJyb3IgInVucmVjb2duaXplZCBvcHRpb246IFxgJDEnCisgIC0qKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbjogXGAkMScKIFRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA7OwogCiAgICopIGFzX2ZuX2FwcGVuZCBhY19jb25maWdfdGFyZ2V0cyAiICQxIgpAQCAtMTMyMzIsNyArMTU3MjQsNyBAQAogX0FDRU9GCiBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKIGlmIFwkYWNfY3NfcmVjaGVjazsgdGhlbgotICBzZXQgWCAnJFNIRUxMJyAnJDAnICRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uCisgIHNldCBYICRTSEVMTCAnJDAnICRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uCiAgIHNoaWZ0CiAgIFwkYXNfZWNobyAicnVubmluZyBDT05GSUdfU0hFTEw9JFNIRUxMIFwkKiIgPiY2CiAgIENPTkZJR19TSEVMTD0nJFNIRUxMJwpAQCAtMTMyNTYsNiArMTU3NDgsMTQgQEAKICMKICMgSU5JVC1DT01NQU5EUwogIworYXhfZW5hYmxlX2J1aWxkZGlyX3NyY2Rpcj0iJHNyY2RpciIgICAgICAgICAgICAgICAgICAgICMgJHNyY2RpcgorYXhfZW5hYmxlX2J1aWxkZGlyX2hvc3Q9IiRIT1NUIiAgICAgICAgICAgICAgICAgICAgICAgICMgJEhPU1QgLyAkaG9zdAorYXhfZW5hYmxlX2J1aWxkZGlyX3ZlcnNpb249IiRWRVJTSU9OIiAgICAgICAgICAgICAgICAgICMgJFZFUlNJT04KK2F4X2VuYWJsZV9idWlsZGRpcl9wYWNrYWdlPSIkUEFDS0FHRSIgICAgICAgICAgICAgICAgICAjICRQQUNLQUdFCitheF9lbmFibGVfYnVpbGRkaXJfYXV4ZGlyPSIkYXhfZW5hYmxlX2J1aWxkZGlyX2F1eGRpciIgIyAkQVVYCitheF9lbmFibGVfYnVpbGRkaXJfc2VkPSIkYXhfZW5hYmxlX2J1aWxkZGlyX3NlZCIgICAgICAgIyAkU0VECitheF9lbmFibGVfYnVpbGRkaXI9IiRheF9lbmFibGVfYnVpbGRkaXIiICAgICAgICAgICAgICAgIyAkU1VCCisKIEFNREVQX1RSVUU9IiRBTURFUF9UUlVFIiBhY19hdXhfZGlyPSIkYWNfYXV4X2RpciIKIAogCkBAIC0xMzI2NiwxMzEgKzE1NzY2LDE1NCBAQAogc2VkX3F1b3RlX3N1YnN0PSckc2VkX3F1b3RlX3N1YnN0JwogZG91YmxlX3F1b3RlX3N1YnN0PSckZG91YmxlX3F1b3RlX3N1YnN0JwogZGVsYXlfdmFyaWFibGVfc3Vic3Q9JyRkZWxheV92YXJpYWJsZV9zdWJzdCcKLW1hY3JvX3ZlcnNpb249J2AkRUNITyAiWCRtYWNyb192ZXJzaW9uIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1tYWNyb19yZXZpc2lvbj0nYCRFQ0hPICJYJG1hY3JvX3JldmlzaW9uIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1lbmFibGVfc2hhcmVkPSdgJEVDSE8gIlgkZW5hYmxlX3NoYXJlZCIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotZW5hYmxlX3N0YXRpYz0nYCRFQ0hPICJYJGVuYWJsZV9zdGF0aWMiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLXBpY19tb2RlPSdgJEVDSE8gIlgkcGljX21vZGUiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWVuYWJsZV9mYXN0X2luc3RhbGw9J2AkRUNITyAiWCRlbmFibGVfZmFzdF9pbnN0YWxsIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1ob3N0X2FsaWFzPSdgJEVDSE8gIlgkaG9zdF9hbGlhcyIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotaG9zdD0nYCRFQ0hPICJYJGhvc3QiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWhvc3Rfb3M9J2AkRUNITyAiWCRob3N0X29zIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1idWlsZF9hbGlhcz0nYCRFQ0hPICJYJGJ1aWxkX2FsaWFzIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1idWlsZD0nYCRFQ0hPICJYJGJ1aWxkIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1idWlsZF9vcz0nYCRFQ0hPICJYJGJ1aWxkX29zIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1TRUQ9J2AkRUNITyAiWCRTRUQiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLVhzZWQ9J2AkRUNITyAiWCRYc2VkIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1HUkVQPSdgJEVDSE8gIlgkR1JFUCIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotRUdSRVA9J2AkRUNITyAiWCRFR1JFUCIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotRkdSRVA9J2AkRUNITyAiWCRGR1JFUCIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotTEQ9J2AkRUNITyAiWCRMRCIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotTk09J2AkRUNITyAiWCROTSIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotTE5fUz0nYCRFQ0hPICJYJExOX1MiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLW1heF9jbWRfbGVuPSdgJEVDSE8gIlgkbWF4X2NtZF9sZW4iIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWFjX29iamV4dD0nYCRFQ0hPICJYJGFjX29iamV4dCIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotZXhlZXh0PSdgJEVDSE8gIlgkZXhlZXh0IiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1sdF91bnNldD0nYCRFQ0hPICJYJGx0X3Vuc2V0IiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1sdF9TUDJOTD0nYCRFQ0hPICJYJGx0X1NQMk5MIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1sdF9OTDJTUD0nYCRFQ0hPICJYJGx0X05MMlNQIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1yZWxvYWRfZmxhZz0nYCRFQ0hPICJYJHJlbG9hZF9mbGFnIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1yZWxvYWRfY21kcz0nYCRFQ0hPICJYJHJlbG9hZF9jbWRzIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1PQkpEVU1QPSdgJEVDSE8gIlgkT0JKRFVNUCIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotZGVwbGlic19jaGVja19tZXRob2Q9J2AkRUNITyAiWCRkZXBsaWJzX2NoZWNrX21ldGhvZCIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotZmlsZV9tYWdpY19jbWQ9J2AkRUNITyAiWCRmaWxlX21hZ2ljX2NtZCIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotQVI9J2AkRUNITyAiWCRBUiIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotQVJfRkxBR1M9J2AkRUNITyAiWCRBUl9GTEFHUyIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotU1RSSVA9J2AkRUNITyAiWCRTVFJJUCIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotUkFOTElCPSdgJEVDSE8gIlgkUkFOTElCIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1vbGRfcG9zdGluc3RhbGxfY21kcz0nYCRFQ0hPICJYJG9sZF9wb3N0aW5zdGFsbF9jbWRzIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1vbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSdgJEVDSE8gIlgkb2xkX3Bvc3R1bmluc3RhbGxfY21kcyIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotb2xkX2FyY2hpdmVfY21kcz0nYCRFQ0hPICJYJG9sZF9hcmNoaXZlX2NtZHMiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLUNDPSdgJEVDSE8gIlgkQ0MiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLUNGTEFHUz0nYCRFQ0hPICJYJENGTEFHUyIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotY29tcGlsZXI9J2AkRUNITyAiWCRjb21waWxlciIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotR0NDPSdgJEVDSE8gIlgkR0NDIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSdgJEVDSE8gIlgkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9J2AkRUNITyAiWCRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9J2AkRUNITyAiWCRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeD0nYCRFQ0hPICJYJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXgiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLW9iamRpcj0nYCRFQ0hPICJYJG9iamRpciIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotU0hFTEw9J2AkRUNITyAiWCRTSEVMTCIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotRUNITz0nYCRFQ0hPICJYJEVDSE8iIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLU1BR0lDX0NNRD0nYCRFQ0hPICJYJE1BR0lDX0NNRCIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWc9J2AkRUNITyAiWCRsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZyIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotbHRfcHJvZ19jb21waWxlcl93bD0nYCRFQ0hPICJYJGx0X3Byb2dfY29tcGlsZXJfd2wiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWx0X3Byb2dfY29tcGlsZXJfcGljPSdgJEVDSE8gIlgkbHRfcHJvZ19jb21waWxlcl9waWMiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSdgJEVDSE8gIlgkbHRfcHJvZ19jb21waWxlcl9zdGF0aWMiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWx0X2N2X3Byb2dfY29tcGlsZXJfY19vPSdgJEVDSE8gIlgkbHRfY3ZfcHJvZ19jb21waWxlcl9jX28iIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLW5lZWRfbG9ja3M9J2AkRUNITyAiWCRuZWVkX2xvY2tzIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1EU1lNVVRJTD0nYCRFQ0hPICJYJERTWU1VVElMIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1OTUVESVQ9J2AkRUNITyAiWCROTUVESVQiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLUxJUE89J2AkRUNITyAiWCRMSVBPIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1PVE9PTD0nYCRFQ0hPICJYJE9UT09MIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1PVE9PTDY0PSdgJEVDSE8gIlgkT1RPT0w2NCIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotbGliZXh0PSdgJEVDSE8gIlgkbGliZXh0IiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1zaHJleHRfY21kcz0nYCRFQ0hPICJYJHNocmV4dF9jbWRzIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1leHRyYWN0X2V4cHN5bXNfY21kcz0nYCRFQ0hPICJYJGV4dHJhY3RfZXhwc3ltc19jbWRzIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1hcmNoaXZlX2NtZHNfbmVlZF9sYz0nYCRFQ0hPICJYJGFyY2hpdmVfY21kc19uZWVkX2xjIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1lbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzPSdgJEVDSE8gIlgkZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcyIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSdgJEVDSE8gIlgkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi13aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nYCRFQ0hPICJYJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1jb21waWxlcl9uZWVkc19vYmplY3Q9J2AkRUNITyAiWCRjb21waWxlcl9uZWVkc19vYmplY3QiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLW9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9J2AkRUNITyAiWCRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1vbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0nYCRFQ0hPICJYJG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1hcmNoaXZlX2NtZHM9J2AkRUNITyAiWCRhcmNoaXZlX2NtZHMiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWFyY2hpdmVfZXhwc3ltX2NtZHM9J2AkRUNITyAiWCRhcmNoaXZlX2V4cHN5bV9jbWRzIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1tb2R1bGVfY21kcz0nYCRFQ0hPICJYJG1vZHVsZV9jbWRzIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1tb2R1bGVfZXhwc3ltX2NtZHM9J2AkRUNITyAiWCRtb2R1bGVfZXhwc3ltX2NtZHMiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLXdpdGhfZ251X2xkPSdgJEVDSE8gIlgkd2l0aF9nbnVfbGQiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWFsbG93X3VuZGVmaW5lZF9mbGFnPSdgJEVDSE8gIlgkYWxsb3dfdW5kZWZpbmVkX2ZsYWciIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLW5vX3VuZGVmaW5lZF9mbGFnPSdgJEVDSE8gIlgkbm9fdW5kZWZpbmVkX2ZsYWciIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9J2AkRUNITyAiWCRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPSdgJEVDSE8gIlgkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0nYCRFQ0hPICJYJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWhhcmRjb2RlX2RpcmVjdD0nYCRFQ0hPICJYJGhhcmRjb2RlX2RpcmVjdCIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlPSdgJEVDSE8gIlgkaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1oYXJkY29kZV9taW51c19MPSdgJEVDSE8gIlgkaGFyZGNvZGVfbWludXNfTCIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0nYCRFQ0hPICJYJGhhcmRjb2RlX3NobGlicGF0aF92YXIiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWhhcmRjb2RlX2F1dG9tYXRpYz0nYCRFQ0hPICJYJGhhcmRjb2RlX2F1dG9tYXRpYyIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotaW5oZXJpdF9ycGF0aD0nYCRFQ0hPICJYJGluaGVyaXRfcnBhdGgiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWxpbmtfYWxsX2RlcGxpYnM9J2AkRUNITyAiWCRsaW5rX2FsbF9kZXBsaWJzIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1maXhfc3JjZmlsZV9wYXRoPSdgJEVDSE8gIlgkZml4X3NyY2ZpbGVfcGF0aCIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotYWx3YXlzX2V4cG9ydF9zeW1ib2xzPSdgJEVDSE8gIlgkYWx3YXlzX2V4cG9ydF9zeW1ib2xzIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1leHBvcnRfc3ltYm9sc19jbWRzPSdgJEVDSE8gIlgkZXhwb3J0X3N5bWJvbHNfY21kcyIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotZXhjbHVkZV9leHBzeW1zPSdgJEVDSE8gIlgkZXhjbHVkZV9leHBzeW1zIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1pbmNsdWRlX2V4cHN5bXM9J2AkRUNITyAiWCRpbmNsdWRlX2V4cHN5bXMiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLXByZWxpbmtfY21kcz0nYCRFQ0hPICJYJHByZWxpbmtfY21kcyIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotZmlsZV9saXN0X3NwZWM9J2AkRUNITyAiWCRmaWxlX2xpc3Rfc3BlYyIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9J2AkRUNITyAiWCR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotbmVlZF9saWJfcHJlZml4PSdgJEVDSE8gIlgkbmVlZF9saWJfcHJlZml4IiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1uZWVkX3ZlcnNpb249J2AkRUNITyAiWCRuZWVkX3ZlcnNpb24iIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLXZlcnNpb25fdHlwZT0nYCRFQ0hPICJYJHZlcnNpb25fdHlwZSIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotcnVucGF0aF92YXI9J2AkRUNITyAiWCRydW5wYXRoX3ZhciIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotc2hsaWJwYXRoX3Zhcj0nYCRFQ0hPICJYJHNobGlicGF0aF92YXIiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0nYCRFQ0hPICJYJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotbGlibmFtZV9zcGVjPSdgJEVDSE8gIlgkbGlibmFtZV9zcGVjIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1saWJyYXJ5X25hbWVzX3NwZWM9J2AkRUNITyAiWCRsaWJyYXJ5X25hbWVzX3NwZWMiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLXNvbmFtZV9zcGVjPSdgJEVDSE8gIlgkc29uYW1lX3NwZWMiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLXBvc3RpbnN0YWxsX2NtZHM9J2AkRUNITyAiWCRwb3N0aW5zdGFsbF9jbWRzIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1wb3N0dW5pbnN0YWxsX2NtZHM9J2AkRUNITyAiWCRwb3N0dW5pbnN0YWxsX2NtZHMiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWZpbmlzaF9jbWRzPSdgJEVDSE8gIlgkZmluaXNoX2NtZHMiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWZpbmlzaF9ldmFsPSdgJEVDSE8gIlgkZmluaXNoX2V2YWwiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWhhcmRjb2RlX2ludG9fbGlicz0nYCRFQ0hPICJYJGhhcmRjb2RlX2ludG9fbGlicyIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSdgJEVDSE8gIlgkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nYCRFQ0hPICJYJHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1oYXJkY29kZV9hY3Rpb249J2AkRUNITyAiWCRoYXJkY29kZV9hY3Rpb24iIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWVuYWJsZV9kbG9wZW49J2AkRUNITyAiWCRlbmFibGVfZGxvcGVuIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1lbmFibGVfZGxvcGVuX3NlbGY9J2AkRUNITyAiWCRlbmFibGVfZGxvcGVuX3NlbGYiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLWVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9J2AkRUNITyAiWCRlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCi1vbGRfc3RyaXBsaWI9J2AkRUNITyAiWCRvbGRfc3RyaXBsaWIiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKLXN0cmlwbGliPSdgJEVDSE8gIlgkc3RyaXBsaWIiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK21hY3JvX3ZlcnNpb249J2AkRUNITyAiJG1hY3JvX3ZlcnNpb24iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbWFjcm9fcmV2aXNpb249J2AkRUNITyAiJG1hY3JvX3JldmlzaW9uIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2VuYWJsZV9zaGFyZWQ9J2AkRUNITyAiJGVuYWJsZV9zaGFyZWQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZW5hYmxlX3N0YXRpYz0nYCRFQ0hPICIkZW5hYmxlX3N0YXRpYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwaWNfbW9kZT0nYCRFQ0hPICIkcGljX21vZGUiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZW5hYmxlX2Zhc3RfaW5zdGFsbD0nYCRFQ0hPICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitTSEVMTD0nYCRFQ0hPICIkU0hFTEwiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworRUNITz0nYCRFQ0hPICIkRUNITyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitQQVRIX1NFUEFSQVRPUj0nYCRFQ0hPICIkUEFUSF9TRVBBUkFUT1IiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaG9zdF9hbGlhcz0nYCRFQ0hPICIkaG9zdF9hbGlhcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitob3N0PSdgJEVDSE8gIiRob3N0IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hvc3Rfb3M9J2AkRUNITyAiJGhvc3Rfb3MiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYnVpbGRfYWxpYXM9J2AkRUNITyAiJGJ1aWxkX2FsaWFzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2J1aWxkPSdgJEVDSE8gIiRidWlsZCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitidWlsZF9vcz0nYCRFQ0hPICIkYnVpbGRfb3MiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworU0VEPSdgJEVDSE8gIiRTRUQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworWHNlZD0nYCRFQ0hPICIkWHNlZCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitHUkVQPSdgJEVDSE8gIiRHUkVQIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0VHUkVQPSdgJEVDSE8gIiRFR1JFUCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitGR1JFUD0nYCRFQ0hPICIkRkdSRVAiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworTEQ9J2AkRUNITyAiJExEIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK05NPSdgJEVDSE8gIiROTSIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitMTl9TPSdgJEVDSE8gIiRMTl9TIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK21heF9jbWRfbGVuPSdgJEVDSE8gIiRtYXhfY21kX2xlbiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCithY19vYmpleHQ9J2AkRUNITyAiJGFjX29iamV4dCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitleGVleHQ9J2AkRUNITyAiJGV4ZWV4dCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF91bnNldD0nYCRFQ0hPICIkbHRfdW5zZXQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfU1AyTkw9J2AkRUNITyAiJGx0X1NQMk5MIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X05MMlNQPSdgJEVDSE8gIiRsdF9OTDJTUCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9jdl90b19ob3N0X2ZpbGVfY21kPSdgJEVDSE8gIiRsdF9jdl90b19ob3N0X2ZpbGVfY21kIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X2N2X3RvX3Rvb2xfZmlsZV9jbWQ9J2AkRUNITyAiJGx0X2N2X3RvX3Rvb2xfZmlsZV9jbWQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcmVsb2FkX2ZsYWc9J2AkRUNITyAiJHJlbG9hZF9mbGFnIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3JlbG9hZF9jbWRzPSdgJEVDSE8gIiRyZWxvYWRfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitPQkpEVU1QPSdgJEVDSE8gIiRPQkpEVU1QIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdgJEVDSE8gIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitmaWxlX21hZ2ljX2NtZD0nYCRFQ0hPICIkZmlsZV9tYWdpY19jbWQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZmlsZV9tYWdpY19nbG9iPSdgJEVDSE8gIiRmaWxlX21hZ2ljX2dsb2IiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJword2FudF9ub2Nhc2VnbG9iPSdgJEVDSE8gIiR3YW50X25vY2FzZWdsb2IiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworRExMVE9PTD0nYCRFQ0hPICIkRExMVE9PTCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitzaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD0nYCRFQ0hPICIkc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworQVI9J2AkRUNITyAiJEFSIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0FSX0ZMQUdTPSdgJEVDSE8gIiRBUl9GTEFHUyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCithcmNoaXZlcl9saXN0X3NwZWM9J2AkRUNITyAiJGFyY2hpdmVyX2xpc3Rfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitTVFJJUD0nYCRFQ0hPICIkU1RSSVAiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworUkFOTElCPSdgJEVDSE8gIiRSQU5MSUIiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworb2xkX3Bvc3RpbnN0YWxsX2NtZHM9J2AkRUNITyAiJG9sZF9wb3N0aW5zdGFsbF9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK29sZF9wb3N0dW5pbnN0YWxsX2NtZHM9J2AkRUNITyAiJG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworb2xkX2FyY2hpdmVfY21kcz0nYCRFQ0hPICIkb2xkX2FyY2hpdmVfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb249J2AkRUNITyAiJGxvY2tfb2xkX2FyY2hpdmVfZXh0cmFjdGlvbiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitDQz0nYCRFQ0hPICIkQ0MiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworQ0ZMQUdTPSdgJEVDSE8gIiRDRkxBR1MiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworY29tcGlsZXI9J2AkRUNITyAiJGNvbXBpbGVyIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0dDQz0nYCRFQ0hPICIkR0NDIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9J2AkRUNITyAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9J2AkRUNITyAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSdgJEVDSE8gIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4PSdgJEVDSE8gIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK25tX2ZpbGVfbGlzdF9zcGVjPSdgJEVDSE8gIiRubV9maWxlX2xpc3Rfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9zeXNyb290PSdgJEVDSE8gIiRsdF9zeXNyb290IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK29iamRpcj0nYCRFQ0hPICIkb2JqZGlyIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK01BR0lDX0NNRD0nYCRFQ0hPICIkTUFHSUNfQ01EIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPSdgJEVDSE8gIiRsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9wcm9nX2NvbXBpbGVyX3BpYz0nYCRFQ0hPICIkbHRfcHJvZ19jb21waWxlcl9waWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfcHJvZ19jb21waWxlcl93bD0nYCRFQ0hPICIkbHRfcHJvZ19jb21waWxlcl93bCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nYCRFQ0hPICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfY3ZfcHJvZ19jb21waWxlcl9jX289J2AkRUNITyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK25lZWRfbG9ja3M9J2AkRUNITyAiJG5lZWRfbG9ja3MiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworTUFOSUZFU1RfVE9PTD0nYCRFQ0hPICIkTUFOSUZFU1RfVE9PTCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitEU1lNVVRJTD0nYCRFQ0hPICIkRFNZTVVUSUwiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworTk1FRElUPSdgJEVDSE8gIiROTUVESVQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworTElQTz0nYCRFQ0hPICIkTElQTyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitPVE9PTD0nYCRFQ0hPICIkT1RPT0wiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworT1RPT0w2ND0nYCRFQ0hPICIkT1RPT0w2NCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsaWJleHQ9J2AkRUNITyAiJGxpYmV4dCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitzaHJleHRfY21kcz0nYCRFQ0hPICIkc2hyZXh0X2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZXh0cmFjdF9leHBzeW1zX2NtZHM9J2AkRUNITyAiJGV4dHJhY3RfZXhwc3ltc19jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2FyY2hpdmVfY21kc19uZWVkX2xjPSdgJEVDSE8gIiRhcmNoaXZlX2NtZHNfbmVlZF9sYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzPSdgJEVDSE8gIiRlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nYCRFQ0hPICIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSdgJEVDSE8gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitjb21waWxlcl9uZWVkc19vYmplY3Q9J2AkRUNITyAiJGNvbXBpbGVyX25lZWRzX29iamVjdCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSdgJEVDSE8gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPSdgJEVDSE8gIiRvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCithcmNoaXZlX2NtZHM9J2AkRUNITyAiJGFyY2hpdmVfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCithcmNoaXZlX2V4cHN5bV9jbWRzPSdgJEVDSE8gIiRhcmNoaXZlX2V4cHN5bV9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK21vZHVsZV9jbWRzPSdgJEVDSE8gIiRtb2R1bGVfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCittb2R1bGVfZXhwc3ltX2NtZHM9J2AkRUNITyAiJG1vZHVsZV9leHBzeW1fY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCit3aXRoX2dudV9sZD0nYCRFQ0hPICIkd2l0aF9nbnVfbGQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYWxsb3dfdW5kZWZpbmVkX2ZsYWc9J2AkRUNITyAiJGFsbG93X3VuZGVmaW5lZF9mbGFnIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK25vX3VuZGVmaW5lZF9mbGFnPSdgJEVDSE8gIiRub191bmRlZmluZWRfZmxhZyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSdgJEVDSE8gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9J2AkRUNITyAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfZGlyZWN0PSdgJEVDSE8gIiRoYXJkY29kZV9kaXJlY3QiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlPSdgJEVDSE8gIiRoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfbWludXNfTD0nYCRFQ0hPICIkaGFyZGNvZGVfbWludXNfTCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9zaGxpYnBhdGhfdmFyPSdgJEVDSE8gIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2F1dG9tYXRpYz0nYCRFQ0hPICIkaGFyZGNvZGVfYXV0b21hdGljIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2luaGVyaXRfcnBhdGg9J2AkRUNITyAiJGluaGVyaXRfcnBhdGgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbGlua19hbGxfZGVwbGlicz0nYCRFQ0hPICIkbGlua19hbGxfZGVwbGlicyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCithbHdheXNfZXhwb3J0X3N5bWJvbHM9J2AkRUNITyAiJGFsd2F5c19leHBvcnRfc3ltYm9scyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitleHBvcnRfc3ltYm9sc19jbWRzPSdgJEVDSE8gIiRleHBvcnRfc3ltYm9sc19jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2V4Y2x1ZGVfZXhwc3ltcz0nYCRFQ0hPICIkZXhjbHVkZV9leHBzeW1zIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2luY2x1ZGVfZXhwc3ltcz0nYCRFQ0hPICIkaW5jbHVkZV9leHBzeW1zIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3ByZWxpbmtfY21kcz0nYCRFQ0hPICIkcHJlbGlua19jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3Bvc3RsaW5rX2NtZHM9J2AkRUNITyAiJHBvc3RsaW5rX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZmlsZV9saXN0X3NwZWM9J2AkRUNITyAiJGZpbGVfbGlzdF9zcGVjIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSdgJEVDSE8gIiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCituZWVkX2xpYl9wcmVmaXg9J2AkRUNITyAiJG5lZWRfbGliX3ByZWZpeCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCituZWVkX3ZlcnNpb249J2AkRUNITyAiJG5lZWRfdmVyc2lvbiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCit2ZXJzaW9uX3R5cGU9J2AkRUNITyAiJHZlcnNpb25fdHlwZSIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitydW5wYXRoX3Zhcj0nYCRFQ0hPICIkcnVucGF0aF92YXIiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworc2hsaWJwYXRoX3Zhcj0nYCRFQ0hPICIkc2hsaWJwYXRoX3ZhciIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9J2AkRUNITyAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsaWJuYW1lX3NwZWM9J2AkRUNITyAiJGxpYm5hbWVfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsaWJyYXJ5X25hbWVzX3NwZWM9J2AkRUNITyAiJGxpYnJhcnlfbmFtZXNfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitzb25hbWVfc3BlYz0nYCRFQ0hPICIkc29uYW1lX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaW5zdGFsbF9vdmVycmlkZV9tb2RlPSdgJEVDSE8gIiRpbnN0YWxsX292ZXJyaWRlX21vZGUiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcG9zdGluc3RhbGxfY21kcz0nYCRFQ0hPICIkcG9zdGluc3RhbGxfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwb3N0dW5pbnN0YWxsX2NtZHM9J2AkRUNITyAiJHBvc3R1bmluc3RhbGxfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitmaW5pc2hfY21kcz0nYCRFQ0hPICIkZmluaXNoX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZmluaXNoX2V2YWw9J2AkRUNITyAiJGZpbmlzaF9ldmFsIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2ludG9fbGlicz0nYCRFQ0hPICIkaGFyZGNvZGVfaW50b19saWJzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nYCRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSdgJEVDSE8gIiRzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9hY3Rpb249J2AkRUNITyAiJGhhcmRjb2RlX2FjdGlvbiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitlbmFibGVfZGxvcGVuPSdgJEVDSE8gIiRlbmFibGVfZGxvcGVuIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2VuYWJsZV9kbG9wZW5fc2VsZj0nYCRFQ0hPICIkZW5hYmxlX2Rsb3Blbl9zZWxmIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2VuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9J2AkRUNITyAiJGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworb2xkX3N0cmlwbGliPSdgJEVDSE8gIiRvbGRfc3RyaXBsaWIiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworc3RyaXBsaWI9J2AkRUNITyAiJHN0cmlwbGliIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKIAogTFRDQz0nJExUQ0MnCiBMVENGTEFHUz0nJExUQ0ZMQUdTJwogY29tcGlsZXI9JyRjb21waWxlcl9ERUZBVUxUJwogCisjIEEgZnVuY3Rpb24gdGhhdCBpcyB1c2VkIHdoZW4gdGhlcmUgaXMgbm8gcHJpbnQgYnVpbHRpbiBvciBwcmludGYuCitmdW5jX2ZhbGxiYWNrX2VjaG8gKCkKK3sKKyAgZXZhbCAnY2F0IDw8X0xURUNIT19FT0YKK1wkMQorX0xURUNIT19FT0YnCit9CisKICMgUXVvdGUgZXZhbGVkIHN0cmluZ3MuCi1mb3IgdmFyIGluIFNFRCBcCitmb3IgdmFyIGluIFNIRUxMIFwKK0VDSE8gXAorUEFUSF9TRVBBUkFUT1IgXAorU0VEIFwKIEdSRVAgXAogRUdSRVAgXAogRkdSRVAgXApAQCAtMTM0MDMsOCArMTU5MjYsMTMgQEAKIE9CSkRVTVAgXAogZGVwbGlic19jaGVja19tZXRob2QgXAogZmlsZV9tYWdpY19jbWQgXAorZmlsZV9tYWdpY19nbG9iIFwKK3dhbnRfbm9jYXNlZ2xvYiBcCitETExUT09MIFwKK3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kIFwKIEFSIFwKIEFSX0ZMQUdTIFwKK2FyY2hpdmVyX2xpc3Rfc3BlYyBcCiBTVFJJUCBcCiBSQU5MSUIgXAogQ0MgXApAQCAtMTM0MTQsMTQgKzE1OTQyLDE0IEBACiBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCiBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyBcCiBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4IFwKLVNIRUxMIFwKLUVDSE8gXAorbm1fZmlsZV9saXN0X3NwZWMgXAogbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcgXAotbHRfcHJvZ19jb21waWxlcl93bCBcCiBsdF9wcm9nX2NvbXBpbGVyX3BpYyBcCitsdF9wcm9nX2NvbXBpbGVyX3dsIFwKIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIFwKIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vIFwKIG5lZWRfbG9ja3MgXAorTUFOSUZFU1RfVE9PTCBcCiBEU1lNVVRJTCBcCiBOTUVESVQgXAogTElQTyBcCkBAIC0xMzQzNSw5ICsxNTk2Myw3IEBACiBhbGxvd191bmRlZmluZWRfZmxhZyBcCiBub191bmRlZmluZWRfZmxhZyBcCiBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIFwKLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQgXAogaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBcCi1maXhfc3JjZmlsZV9wYXRoIFwKIGV4Y2x1ZGVfZXhwc3ltcyBcCiBpbmNsdWRlX2V4cHN5bXMgXAogZmlsZV9saXN0X3NwZWMgXApAQCAtMTM0NDUsMTIgKzE1OTcxLDEzIEBACiBsaWJuYW1lX3NwZWMgXAogbGlicmFyeV9uYW1lc19zcGVjIFwKIHNvbmFtZV9zcGVjIFwKK2luc3RhbGxfb3ZlcnJpZGVfbW9kZSBcCiBmaW5pc2hfZXZhbCBcCiBvbGRfc3RyaXBsaWIgXAogc3RyaXBsaWI7IGRvCi0gICAgY2FzZSBcYGV2YWwgXFxcXFwkRUNITyAiWFxcXFxcJFwkdmFyIlxgIGluCisgICAgY2FzZSBcYGV2YWwgXFxcXFwkRUNITyBcXFxcIiJcXFxcXCRcJHZhciJcXFxcIlxgIGluCiAgICAgKltcXFxcXFxcYFxcIlxcXCRdKikKLSAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFxgXFxcJEVDSE8gXFwiWFxcXCRcJHZhclxcIiB8IFxcXCRYc2VkIC1lIFxcIlxcXCRzZWRfcXVvdGVfc3Vic3RcXCJcXFxgXFxcXFxcIiIKKyAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFxgXFxcJEVDSE8gXFwiXFxcJFwkdmFyXFwiIHwgXFxcJFNFRCBcXCJcXFwkc2VkX3F1b3RlX3N1YnN0XFwiXFxcYFxcXFxcXCIiCiAgICAgICA7OwogICAgICopCiAgICAgICBldmFsICJsdF9cJHZhcj1cXFxcXFwiXFxcJFwkdmFyXFxcXFxcIiIKQEAgLTEzNDcyLDE0ICsxNTk5OSwxNSBAQAogbW9kdWxlX2V4cHN5bV9jbWRzIFwKIGV4cG9ydF9zeW1ib2xzX2NtZHMgXAogcHJlbGlua19jbWRzIFwKK3Bvc3RsaW5rX2NtZHMgXAogcG9zdGluc3RhbGxfY21kcyBcCiBwb3N0dW5pbnN0YWxsX2NtZHMgXAogZmluaXNoX2NtZHMgXAogc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIFwKIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjOyBkbwotICAgIGNhc2UgXGBldmFsIFxcXFxcJEVDSE8gIlhcXFxcXCRcJHZhciJcYCBpbgorICAgIGNhc2UgXGBldmFsIFxcXFxcJEVDSE8gXFxcXCIiXFxcXFwkXCR2YXIiXFxcXCJcYCBpbgogICAgICpbXFxcXFxcXGBcXCJcXFwkXSopCi0gICAgICBldmFsICJsdF9cJHZhcj1cXFxcXFwiXFxcYFxcXCRFQ0hPIFxcIlhcXFwkXCR2YXJcXCIgfCBcXFwkWHNlZCAtZSBcXCJcXFwkZG91YmxlX3F1b3RlX3N1YnN0XFwiIC1lIFxcIlxcXCRzZWRfcXVvdGVfc3Vic3RcXCIgLWUgXFwiXFxcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XFwiXFxcYFxcXFxcXCIiCisgICAgICBldmFsICJsdF9cJHZhcj1cXFxcXFwiXFxcYFxcXCRFQ0hPIFxcIlxcXCRcJHZhclxcIiB8IFxcXCRTRUQgLWUgXFwiXFxcJGRvdWJsZV9xdW90ZV9zdWJzdFxcIiAtZSBcXCJcXFwkc2VkX3F1b3RlX3N1YnN0XFwiIC1lIFxcIlxcXCRkZWxheV92YXJpYWJsZV9zdWJzdFxcIlxcXGBcXFxcXFwiIgogICAgICAgOzsKICAgICAqKQogICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXCRcJHZhclxcXFxcXCIiCkBAIC0xMzQ4NywxMiArMTYwMTUsNiBAQAogICAgIGVzYWMKIGRvbmUKIAotIyBGaXgtdXAgZmFsbGJhY2sgZWNobyBpZiBpdCB3YXMgbWFuZ2xlZCBieSB0aGUgYWJvdmUgcXVvdGluZyBydWxlcy4KLWNhc2UgXCRsdF9FQ0hPIGluCi0qJ1xcXCQwIC0tZmFsbGJhY2stZWNobyInKSAgbHRfRUNITz1cYFwkRUNITyAiWFwkbHRfRUNITyIgfCBcJFhzZWQgLWUgJ3MvXFxcXFxcXFxcXFxcXFxcJDAgLS1mYWxsYmFjay1lY2hvIlwkL1wkMCAtLWZhbGxiYWNrLWVjaG8iLydcYAotICA7OwotZXNhYwotCiBhY19hdXhfZGlyPSckYWNfYXV4X2RpcicKIHhzaV9zaGVsbD0nJHhzaV9zaGVsbCcKIGx0X3NoZWxsX2FwcGVuZD0nJGx0X3NoZWxsX2FwcGVuZCcKQEAgLTEzNTIzLDYgKzE2MDQ1LDcgQEAKIGRvCiAgIGNhc2UgJGFjX2NvbmZpZ190YXJnZXQgaW4KICAgICAiZmZpY29uZmlnLmgiKSBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTIGZmaWNvbmZpZy5oIiA7OworICAgICJidWlsZGlyIikgQ09ORklHX0NPTU1BTkRTPSIkQ09ORklHX0NPTU1BTkRTIGJ1aWxkaXIiIDs7CiAgICAgImRlcGZpbGVzIikgQ09ORklHX0NPTU1BTkRTPSIkQ09ORklHX0NPTU1BTkRTIGRlcGZpbGVzIiA7OwogICAgICJsaWJ0b29sIikgQ09ORklHX0NPTU1BTkRTPSIkQ09ORklHX0NPTU1BTkRTIGxpYnRvb2wiIDs7CiAgICAgImluY2x1ZGUiKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgaW5jbHVkZSIgOzsKQEAgLTEzNTM3LDcgKzE2MDYwLDcgQEAKICAgICAiaW5jbHVkZS9mZmlfY29tbW9uLmgiKSBDT05GSUdfTElOS1M9IiRDT05GSUdfTElOS1MgaW5jbHVkZS9mZmlfY29tbW9uLmg6aW5jbHVkZS9mZmlfY29tbW9uLmgiIDs7CiAgICAgImZmaWNvbmZpZy5weSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBmZmljb25maWcucHkiIDs7CiAKLSAgKikgYXNfZm5fZXJyb3IgImludmFsaWQgYXJndW1lbnQ6IFxgJGFjX2NvbmZpZ190YXJnZXQnIiAiJExJTkVOTyIgNTs7CisgICopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIGFyZ3VtZW50OiBcYCRhY19jb25maWdfdGFyZ2V0JyIgIiRMSU5FTk8iIDU7OwogICBlc2FjCiBkb25lCiAKQEAgLTEzNTYxLDkgKzE2MDg0LDEwIEBACiAjIGFmdGVyIGl0cyBjcmVhdGlvbiBidXQgYmVmb3JlIGl0cyBuYW1lIGhhcyBiZWVuIGFzc2lnbmVkIHRvIGAkdG1wJy4KICRkZWJ1ZyB8fAogewotICB0bXA9CisgIHRtcD0gYWNfdG1wPQogICB0cmFwICdleGl0X3N0YXR1cz0kPwotICB7IHRlc3QgLXogIiR0bXAiIHx8IHRlc3QgISAtZCAiJHRtcCIgfHwgcm0gLWZyICIkdG1wIjsgfSAmJiBleGl0ICRleGl0X3N0YXR1cworICA6ICIke2FjX3RtcDo9JHRtcH0iCisgIHsgdGVzdCAhIC1kICIkYWNfdG1wIiB8fCBybSAtZnIgIiRhY190bXAiOyB9ICYmIGV4aXQgJGV4aXRfc3RhdHVzCiAnIDAKICAgdHJhcCAnYXNfZm5fZXhpdCAxJyAxIDIgMTMgMTUKIH0KQEAgLTEzNTcxLDEyICsxNjA5NSwxMyBAQAogCiB7CiAgIHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIi4vY29uZlhYWFhYWCIpIDI+L2Rldi9udWxsYCAmJgotICB0ZXN0IC1uICIkdG1wIiAmJiB0ZXN0IC1kICIkdG1wIgorICB0ZXN0IC1kICIkdG1wIgogfSAgfHwKIHsKICAgdG1wPS4vY29uZiQkLSRSQU5ET00KICAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCi19IHx8IGFzX2ZuX2Vycm9yICJjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAuIiAiJExJTkVOTyIgNQorfSB8fCBhc19mbl9lcnJvciAkPyAiY2Fubm90IGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gLiIgIiRMSU5FTk8iIDUKK2FjX3RtcD0kdG1wCiAKICMgU2V0IHVwIHRoZSBzY3JpcHRzIGZvciBDT05GSUdfRklMRVMgc2VjdGlvbi4KICMgTm8gbmVlZCB0byBnZW5lcmF0ZSB0aGVtIGlmIHRoZXJlIGFyZSBubyBDT05GSUdfRklMRVMuCkBAIC0xMzU5MywxMiArMTYxMTgsMTIgQEAKIGZpCiBhY19jc19hd2tfY3I9YCRBV0sgJ0JFR0lOIHsgcHJpbnQgImFccmIiIH0nIDwvZGV2L251bGwgMj4vZGV2L251bGxgCiBpZiB0ZXN0ICIkYWNfY3NfYXdrX2NyIiA9ICJhJHthY19jcn1iIjsgdGhlbgotICBhY19jc19hd2tfY3I9J1xyJworICBhY19jc19hd2tfY3I9J1xccicKIGVsc2UKICAgYWNfY3NfYXdrX2NyPSRhY19jcgogZmkKIAotZWNobyAnQkVHSU4geycgPiIkdG1wL3N1YnMxLmF3ayIgJiYKK2VjaG8gJ0JFR0lOIHsnID4iJGFjX3RtcC9zdWJzMS5hd2siICYmCiBfQUNFT0YKIAogCkBAIC0xMzYwNywxOCArMTYxMzIsMTggQEAKICAgZWNobyAiJGFjX3N1YnN0X3ZhcnMiIHwgc2VkICdzLy4qLyYhJCYkYWNfZGVsaW0vJyAmJgogICBlY2hvICJfQUNFT0YiCiB9ID5jb25mJCRzdWJzLnNoIHx8Ci0gIGFzX2ZuX2Vycm9yICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKLWFjX2RlbGltX251bT1gZWNobyAiJGFjX3N1YnN0X3ZhcnMiIHwgZ3JlcCAtYyAnJCdgCisgIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKK2FjX2RlbGltX251bT1gZWNobyAiJGFjX3N1YnN0X3ZhcnMiIHwgZ3JlcCAtYyAnXidgCiBhY19kZWxpbT0nJSFfISMgJwogZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIDo7IGRvCiAgIC4gLi9jb25mJCRzdWJzLnNoIHx8Ci0gICAgYXNfZm5fZXJyb3IgImNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQorICAgIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKIAogICBhY19kZWxpbV9uPWBzZWQgLW4gInMvLiokYWNfZGVsaW1cJC9YL3AiIGNvbmYkJHN1YnMuYXdrIHwgZ3JlcCAtYyBYYAogICBpZiB0ZXN0ICRhY19kZWxpbV9uID0gJGFjX2RlbGltX251bTsgdGhlbgogICAgIGJyZWFrCiAgIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCi0gICAgYXNfZm5fZXJyb3IgImNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQorICAgIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKICAgZWxzZQogICAgIGFjX2RlbGltPSIkYWNfZGVsaW0hJGFjX2RlbGltIF8kYWNfZGVsaW0hISAiCiAgIGZpCkBAIC0xMzYyNiw3ICsxNjE1MSw3IEBACiBybSAtZiBjb25mJCRzdWJzLnNoCiAKIGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotY2F0ID4+IlwkdG1wL3N1YnMxLmF3ayIgPDxcXF9BQ0FXSyAmJgorY2F0ID4+IlwkYWNfdG1wL3N1YnMxLmF3ayIgPDxcXF9BQ0FXSyAmJgogX0FDRU9GCiBzZWQgLW4gJwogaApAQCAtMTM2NzQsNyArMTYxOTksNyBAQAogcm0gLWYgY29uZiQkc3Vicy5hd2sKIGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQogX0FDQVdLCi1jYXQgPj4iXCR0bXAvc3ViczEuYXdrIiA8PF9BQ0FXSyAmJgorY2F0ID4+IlwkYWNfdG1wL3N1YnMxLmF3ayIgPDxfQUNBV0sgJiYKICAgZm9yIChrZXkgaW4gUykgU19pc19zZXRba2V5XSA9IDEKICAgRlMgPSAiByIKIApAQCAtMTM3MDYsMjEgKzE2MjMxLDI5IEBACiAgIHNlZCAicy8kYWNfY3JcJC8vOyBzLyRhY19jci8kYWNfY3NfYXdrX2NyL2ciCiBlbHNlCiAgIGNhdAotZmkgPCAiJHRtcC9zdWJzMS5hd2siID4gIiR0bXAvc3Vicy5hd2siIFwKLSAgfHwgYXNfZm5fZXJyb3IgImNvdWxkIG5vdCBzZXR1cCBjb25maWcgZmlsZXMgbWFjaGluZXJ5IiAiJExJTkVOTyIgNQorZmkgPCAiJGFjX3RtcC9zdWJzMS5hd2siID4gIiRhY190bXAvc3Vicy5hd2siIFwKKyAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBzZXR1cCBjb25maWcgZmlsZXMgbWFjaGluZXJ5IiAiJExJTkVOTyIgNQogX0FDRU9GCiAKLSMgVlBBVEggbWF5IGNhdXNlIHRyb3VibGUgd2l0aCBzb21lIG1ha2VzLCBzbyB3ZSByZW1vdmUgJChzcmNkaXIpLAotIyAke3NyY2Rpcn0gYW5kIEBzcmNkaXJAIGZyb20gVlBBVEggaWYgc3JjZGlyIGlzICIuIiwgc3RyaXAgbGVhZGluZyBhbmQKKyMgVlBBVEggbWF5IGNhdXNlIHRyb3VibGUgd2l0aCBzb21lIG1ha2VzLCBzbyB3ZSByZW1vdmUgc29sZSAkKHNyY2RpciksCisjICR7c3JjZGlyfSBhbmQgQHNyY2RpckAgZW50cmllcyBmcm9tIFZQQVRIIGlmIHNyY2RpciBpcyAiLiIsIHN0cmlwIGxlYWRpbmcgYW5kCiAjIHRyYWlsaW5nIGNvbG9ucyBhbmQgdGhlbiByZW1vdmUgdGhlIHdob2xlIGxpbmUgaWYgVlBBVEggYmVjb21lcyBlbXB0eQogIyAoYWN0dWFsbHkgd2UgbGVhdmUgYW4gZW1wdHkgbGluZSB0byBwcmVzZXJ2ZSBsaW5lIG51bWJlcnMpLgogaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWwkgXSpWUEFUSFsJIF0qPS97Ci1zLzoqXCQoc3JjZGlyKToqLzovCi1zLzoqXCR7c3JjZGlyfToqLzovCi1zLzoqQHNyY2RpckA6Ki86Lwotcy9eXChbXj1dKj1bCSBdKlwpOiovXDEvCisgIGFjX3Zwc3ViPScvXlsJIF0qVlBBVEhbCSBdKj1bCSBdKi97CitoCitzLy8vCitzL14vOi8KK3MvWwkgXSokLzovCitzLzpcJChzcmNkaXIpOi86L2cKK3MvOlwke3NyY2Rpcn06LzovZworcy86QHNyY2RpckA6LzovZworcy9eOiovLwogcy86KiQvLworeAorcy9cKD1bCSBdKlwpLiovXDEvCitHCitzL1xuLy8KIHMvXltePV0qPVsJIF0qJC8vCiB9JwogZmkKQEAgLTEzNzMyLDcgKzE2MjY1LDcgQEAKICMgTm8gbmVlZCB0byBnZW5lcmF0ZSB0aGVtIGlmIHRoZXJlIGFyZSBubyBDT05GSUdfSEVBREVSUy4KICMgVGhpcyBoYXBwZW5zIGZvciBpbnN0YW5jZSB3aXRoIGAuL2NvbmZpZy5zdGF0dXMgTWFrZWZpbGUnLgogaWYgdGVzdCAtbiAiJENPTkZJR19IRUFERVJTIjsgdGhlbgotY2F0ID4iJHRtcC9kZWZpbmVzLmF3ayIgPDxcX0FDQVdLIHx8CitjYXQgPiIkYWNfdG1wL2RlZmluZXMuYXdrIiA8PFxfQUNBV0sgfHwKIEJFR0lOIHsKIF9BQ0VPRgogCkBAIC0xMzc0NCwxMSArMTYyNzcsMTEgQEAKICMgaGFuZGxpbmcgb2YgbG9uZyBsaW5lcy4KIGFjX2RlbGltPSclIV8hIyAnCiBmb3IgYWNfbGFzdF90cnkgaW4gZmFsc2UgZmFsc2UgOjsgZG8KLSAgYWNfdD1gc2VkIC1uICIvJGFjX2RlbGltL3AiIGNvbmZkZWZzLmhgCi0gIGlmIHRlc3QgLXogIiRhY190IjsgdGhlbgorICBhY190dD1gc2VkIC1uICIvJGFjX2RlbGltL3AiIGNvbmZkZWZzLmhgCisgIGlmIHRlc3QgLXogIiRhY190dCI7IHRoZW4KICAgICBicmVhawogICBlbGlmICRhY19sYXN0X3RyeTsgdGhlbgotICAgIGFzX2ZuX2Vycm9yICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX0hFQURFUlMiICIkTElORU5PIiA1CisgICAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfSEVBREVSUyIgIiRMSU5FTk8iIDUKICAgZWxzZQogICAgIGFjX2RlbGltPSIkYWNfZGVsaW0hJGFjX2RlbGltIF8kYWNfZGVsaW0hISAiCiAgIGZpCkBAIC0xMzgzMyw3ICsxNjM2Niw3IEBACiBfQUNBV0sKIF9BQ0VPRgogY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotICBhc19mbl9lcnJvciAiY291bGQgbm90IHNldHVwIGNvbmZpZyBoZWFkZXJzIG1hY2hpbmVyeSIgIiRMSU5FTk8iIDUKKyAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBzZXR1cCBjb25maWcgaGVhZGVycyBtYWNoaW5lcnkiICIkTElORU5PIiA1CiBmaSAjIHRlc3QgLW4gIiRDT05GSUdfSEVBREVSUyIKIAogCkBAIC0xMzg0Niw3ICsxNjM3OSw3IEBACiAgIGVzYWMKICAgY2FzZSAkYWNfbW9kZSRhY190YWcgaW4KICAgOltGSExdKjoqKTs7Ci0gIDpMKiB8IDpDKjoqKSBhc19mbl9lcnJvciAiaW52YWxpZCB0YWcgXGAkYWNfdGFnJyIgIiRMSU5FTk8iIDU7OworICA6TCogfCA6Qyo6KikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdGFnIFxgJGFjX3RhZyciICIkTElORU5PIiA1OzsKICAgOltGSF0tKSBhY190YWc9LTotOzsKICAgOltGSF0qKSBhY190YWc9JGFjX3RhZzokYWNfdGFnLmluOzsKICAgZXNhYwpAQCAtMTM4NjUsNyArMTYzOTgsNyBAQAogICAgIGZvciBhY19mCiAgICAgZG8KICAgICAgIGNhc2UgJGFjX2YgaW4KLSAgICAgIC0pIGFjX2Y9IiR0bXAvc3RkaW4iOzsKKyAgICAgIC0pIGFjX2Y9IiRhY190bXAvc3RkaW4iOzsKICAgICAgICopICMgTG9vayBmb3IgdGhlIGZpbGUgZmlyc3QgaW4gdGhlIGJ1aWxkIHRyZWUsIHRoZW4gaW4gdGhlIHNvdXJjZSB0cmVlCiAJICMgKGlmIHRoZSBwYXRoIGlzIG5vdCBhYnNvbHV0ZSkuICBUaGUgYWJzb2x1dGUgcGF0aCBjYW5ub3QgYmUgRE9TLXN0eWxlLAogCSAjIGJlY2F1c2UgJGFjX2YgY2Fubm90IGNvbnRhaW4gYDonLgpAQCAtMTM4NzQsNyArMTY0MDcsNyBAQAogCSAgIFtcXC8kXSopIGZhbHNlOzsKIAkgICAqKSB0ZXN0IC1mICIkc3JjZGlyLyRhY19mIiAmJiBhY19mPSIkc3JjZGlyLyRhY19mIjs7CiAJICAgZXNhYyB8fAotCSAgIGFzX2ZuX2Vycm9yICJjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiBcYCRhY19mJyIgIiRMSU5FTk8iIDU7OworCSAgIGFzX2ZuX2Vycm9yIDEgImNhbm5vdCBmaW5kIGlucHV0IGZpbGU6IFxgJGFjX2YnIiAiJExJTkVOTyIgNTs7CiAgICAgICBlc2FjCiAgICAgICBjYXNlICRhY19mIGluICpcJyopIGFjX2Y9YCRhc19lY2hvICIkYWNfZiIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyBlc2FjCiAgICAgICBhc19mbl9hcHBlbmQgYWNfZmlsZV9pbnB1dHMgIiAnJGFjX2YnIgpAQCAtMTM5MDAsOCArMTY0MzMsOCBAQAogICAgIGVzYWMKIAogICAgIGNhc2UgJGFjX3RhZyBpbgotICAgICo6LToqIHwgKjotKSBjYXQgPiIkdG1wL3N0ZGluIiBcCi0gICAgICB8fCBhc19mbl9lcnJvciAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUgOzsKKyAgICAqOi06KiB8ICo6LSkgY2F0ID4iJGFjX3RtcC9zdGRpbiIgXAorICAgICAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1IDs7CiAgICAgZXNhYwogICAgIDs7CiAgIGVzYWMKQEAgLTE0MDM3LDIzICsxNjU3MCwyNCBAQAogcyZATUtESVJfUEAmJGFjX01LRElSX1AmO3QgdAogJGFjX2RhdGFyb290ZGlyX2hhY2sKICIKLWV2YWwgc2VkIFwiXCRhY19zZWRfZXh0cmFcIiAiJGFjX2ZpbGVfaW5wdXRzIiB8ICRBV0sgLWYgIiR0bXAvc3Vicy5hd2siID4kdG1wL291dCBcCi0gIHx8IGFzX2ZuX2Vycm9yICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQorZXZhbCBzZWQgXCJcJGFjX3NlZF9leHRyYVwiICIkYWNfZmlsZV9pbnB1dHMiIHwgJEFXSyAtZiAiJGFjX3RtcC9zdWJzLmF3ayIgXAorICA+JGFjX3RtcC9vdXQgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1CiAKIHRlc3QgLXogIiRhY19kYXRhcm9vdGRpcl9oYWNrJGFjX2RhdGFyb290ZGlyX3NlZW4iICYmCi0gIHsgYWNfb3V0PWBzZWQgLW4gJy9cJHtkYXRhcm9vdGRpcn0vcCcgIiR0bXAvb3V0ImA7IHRlc3QgLW4gIiRhY19vdXQiOyB9ICYmCi0gIHsgYWNfb3V0PWBzZWQgLW4gJy9eWwkgXSpkYXRhcm9vdGRpclsJIF0qOio9L3AnICIkdG1wL291dCJgOyB0ZXN0IC16ICIkYWNfb3V0IjsgfSAmJgorICB7IGFjX291dD1gc2VkIC1uICcvXCR7ZGF0YXJvb3RkaXJ9L3AnICIkYWNfdG1wL291dCJgOyB0ZXN0IC1uICIkYWNfb3V0IjsgfSAmJgorICB7IGFjX291dD1gc2VkIC1uICcvXlsJIF0qZGF0YXJvb3RkaXJbCSBdKjoqPS9wJyBcCisgICAgICAiJGFjX3RtcC9vdXQiYDsgdGVzdCAteiAiJGFjX291dCI7IH0gJiYKICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkYWNfZmlsZSBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgdmFyaWFibGUgXGBkYXRhcm9vdGRpcicKLXdoaWNoIHNlZW1zIHRvIGJlIHVuZGVmaW5lZC4gIFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgZGVmaW5lZC4iID4mNQord2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkIiA+JjUKICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJwotd2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkLiIgPiYyO30KK3doaWNoIHNlZW1zIHRvIGJlIHVuZGVmaW5lZC4gIFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgZGVmaW5lZCIgPiYyO30KIAotICBybSAtZiAiJHRtcC9zdGRpbiIKKyAgcm0gLWYgIiRhY190bXAvc3RkaW4iCiAgIGNhc2UgJGFjX2ZpbGUgaW4KLSAgLSkgY2F0ICIkdG1wL291dCIgJiYgcm0gLWYgIiR0bXAvb3V0Ijs7Ci0gICopIHJtIC1mICIkYWNfZmlsZSIgJiYgbXYgIiR0bXAvb3V0IiAiJGFjX2ZpbGUiOzsKKyAgLSkgY2F0ICIkYWNfdG1wL291dCIgJiYgcm0gLWYgIiRhY190bXAvb3V0Ijs7CisgICopIHJtIC1mICIkYWNfZmlsZSIgJiYgbXYgIiRhY190bXAvb3V0IiAiJGFjX2ZpbGUiOzsKICAgZXNhYyBcCi0gIHx8IGFzX2ZuX2Vycm9yICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQorICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKICA7OwogICA6SCkKICAgIwpAQCAtMTQwNjIsMjEgKzE2NTk2LDIxIEBACiAgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KICAgICB7CiAgICAgICAkYXNfZWNobyAiLyogJGNvbmZpZ3VyZV9pbnB1dCAgKi8iIFwKLSAgICAgICYmIGV2YWwgJyRBV0sgLWYgIiR0bXAvZGVmaW5lcy5hd2siJyAiJGFjX2ZpbGVfaW5wdXRzIgotICAgIH0gPiIkdG1wL2NvbmZpZy5oIiBcCi0gICAgICB8fCBhc19mbl9lcnJvciAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKLSAgICBpZiBkaWZmICIkYWNfZmlsZSIgIiR0bXAvY29uZmlnLmgiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgJiYgZXZhbCAnJEFXSyAtZiAiJGFjX3RtcC9kZWZpbmVzLmF3ayInICIkYWNfZmlsZV9pbnB1dHMiCisgICAgfSA+IiRhY190bXAvY29uZmlnLmgiIFwKKyAgICAgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQorICAgIGlmIGRpZmYgIiRhY19maWxlIiAiJGFjX3RtcC9jb25maWcuaCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY1CiAkYXNfZWNobyAiJGFzX21lOiAkYWNfZmlsZSBpcyB1bmNoYW5nZWQiID4mNjt9CiAgICAgZWxzZQogICAgICAgcm0gLWYgIiRhY19maWxlIgotICAgICAgbXYgIiR0bXAvY29uZmlnLmgiICIkYWNfZmlsZSIgXAotCXx8IGFzX2ZuX2Vycm9yICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQorICAgICAgbXYgIiRhY190bXAvY29uZmlnLmgiICIkYWNfZmlsZSIgXAorCXx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQogICAgIGZpCiAgIGVsc2UKICAgICAkYXNfZWNobyAiLyogJGNvbmZpZ3VyZV9pbnB1dCAgKi8iIFwKLSAgICAgICYmIGV2YWwgJyRBV0sgLWYgIiR0bXAvZGVmaW5lcy5hd2siJyAiJGFjX2ZpbGVfaW5wdXRzIiBcCi0gICAgICB8fCBhc19mbl9lcnJvciAiY291bGQgbm90IGNyZWF0ZSAtIiAiJExJTkVOTyIgNQorICAgICAgJiYgZXZhbCAnJEFXSyAtZiAiJGFjX3RtcC9kZWZpbmVzLmF3ayInICIkYWNfZmlsZV9pbnB1dHMiIFwKKyAgICAgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlIC0iICIkTElORU5PIiA1CiAgIGZpCiAjIENvbXB1dGUgIiRhY19maWxlIidzIGluZGV4IGluICRjb25maWdfaGVhZGVycy4KIF9hbV9hcmc9IiRhY19maWxlIgpAQCAtMTQxMzAsMTkgKzE2NjY0LDE5IEBACiAkYXNfZWNobyAiJGFzX21lOiBsaW5raW5nICRhY19zb3VyY2UgdG8gJGFjX2ZpbGUiID4mNjt9CiAKICAgICBpZiB0ZXN0ICEgLXIgIiRhY19zb3VyY2UiOyB0aGVuCi0gICAgICBhc19mbl9lcnJvciAiJGFjX3NvdXJjZTogZmlsZSBub3QgZm91bmQiICIkTElORU5PIiA1CisgICAgICBhc19mbl9lcnJvciAkPyAiJGFjX3NvdXJjZTogZmlsZSBub3QgZm91bmQiICIkTElORU5PIiA1CiAgICAgZmkKICAgICBybSAtZiAiJGFjX2ZpbGUiCiAKICAgICAjIFRyeSBhIHJlbGF0aXZlIHN5bWxpbmssIHRoZW4gYSBoYXJkIGxpbmssIHRoZW4gYSBjb3B5LgotICAgIGNhc2UgJHNyY2RpciBpbgorICAgIGNhc2UgJGFjX3NvdXJjZSBpbgogICAgIFtcXC8kXSogfCA/OltcXC9dKiApIGFjX3JlbF9zb3VyY2U9JGFjX3NvdXJjZSA7OwogCSopIGFjX3JlbF9zb3VyY2U9JGFjX3RvcF9idWlsZF9wcmVmaXgkYWNfc291cmNlIDs7CiAgICAgZXNhYwogICAgIGxuIC1zICIkYWNfcmVsX3NvdXJjZSIgIiRhY19maWxlIiAyPi9kZXYvbnVsbCB8fAogICAgICAgbG4gIiRhY19zb3VyY2UiICIkYWNfZmlsZSIgMj4vZGV2L251bGwgfHwKICAgICAgIGNwIC1wICIkYWNfc291cmNlIiAiJGFjX2ZpbGUiIHx8Ci0gICAgICBhc19mbl9lcnJvciAiY2Fubm90IGxpbmsgb3IgY29weSAkYWNfc291cmNlIHRvICRhY19maWxlIiAiJExJTkVOTyIgNQorICAgICAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBsaW5rIG9yIGNvcHkgJGFjX3NvdXJjZSB0byAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKICAgZmkKICA7OwogICA6QykgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXhlY3V0aW5nICRhY19maWxlIGNvbW1hbmRzIiA+JjUKQEAgLTE0MTUyLDYgKzE2Njg2LDE1MCBAQAogCiAKICAgY2FzZSAkYWNfZmlsZSRhY19tb2RlIGluCisgICAgImJ1aWxkaXIiOkMpICAgYWNfdG9wX3NyY2Rpcj0iJGF4X2VuYWJsZV9idWlsZGRpcl9zcmNkaXIiCisgIGlmIHRlc3QgIi4kYXhfZW5hYmxlX2J1aWxkZGlyIiA9ICIuLiIgOyB0aGVuCisgICAgaWYgdGVzdCAtZiAiJHRvcF9zcmNkaXIvTWFrZWZpbGUiIDsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBza2lwcGluZyB0b3Bfc3JjZGlyL01ha2VmaWxlIC0gbGVmdCB1bnRvdWNoZWQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogc2tpcHBpbmcgdG9wX3NyY2Rpci9NYWtlZmlsZSAtIGxlZnQgdW50b3VjaGVkIiA+JjY7fQorICAgIGVsc2UKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogc2tpcHBpbmcgdG9wX3NyY2Rpci9NYWtlZmlsZSAtIG5vdCBjcmVhdGVkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IHNraXBwaW5nIHRvcF9zcmNkaXIvTWFrZWZpbGUgLSBub3QgY3JlYXRlZCIgPiY2O30KKyAgICBmaQorICBlbHNlCisgICAgaWYgdGVzdCAtZiAiJGFjX3RvcF9zcmNkaXIvTWFrZWZpbGUiIDsgdGhlbgorICAgICAgYT1gZ3JlcCAiXlZFUlNJT04gIiAiJGFjX3RvcF9zcmNkaXIvTWFrZWZpbGUiYCA7IGI9YGdyZXAgIl5WRVJTSU9OICIgTWFrZWZpbGVgCisgICAgICB0ZXN0ICIkYSIgIT0gIiRiIiAmJiBybSAiJGFjX3RvcF9zcmNkaXIvTWFrZWZpbGUiCisgICAgZmkKKyAgICBpZiB0ZXN0IC1mICIkYWNfdG9wX3NyY2Rpci9NYWtlZmlsZSIgOyB0aGVuCisJZWNobyAiJGFjX3RvcF9zcmNkaXIvTWFrZWZpbGUgOiAkYWNfdG9wX3NyY2Rpci9NYWtlZmlsZS5pbiIgPiAkdG1wL2NvbmZ0ZW1wLm1rCisJZWNobyAiCUAgZWNobyAnUkVNT1ZFRCwsLCcgPlwkQCIgPj4gJHRtcC9jb25mdGVtcC5taworICAgICAgZXZhbCAiJHtNQUtFLW1ha2V9IC1mICR0bXAvY29uZnRlbXAubWsgMj4vZGV2L251bGwgPi9kZXYvbnVsbCIKKyAgICAgIGlmIGdyZXAgJ15SRU1PVkVELCwsJyAiJGFjX3RvcF9zcmNkaXIvTWFrZWZpbGUiID4vZGV2L251bGwKKyAgICAgIHRoZW4gcm0gJGFjX3RvcF9zcmNkaXIvTWFrZWZpbGUgOyBmaQorICAgICAgY3AgJHRtcC9jb25mdGVtcC5tayAkYWNfdG9wX3NyY2Rpci9tYWtlZmlsZXMubWt+ICAgICAgIyMgREVCVUdHSU5HCisgICAgZmkKKyAgICBpZiB0ZXN0ICEgLWYgIiRhY190b3Bfc3JjZGlyL01ha2VmaWxlIiA7IHRoZW4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY3JlYXRlIHRvcF9zcmNkaXIvTWFrZWZpbGUgZ3Vlc3NlZCBmcm9tIGxvY2FsIE1ha2VmaWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGNyZWF0ZSB0b3Bfc3JjZGlyL01ha2VmaWxlIGd1ZXNzZWQgZnJvbSBsb2NhbCBNYWtlZmlsZSIgPiY2O30KKyAgICAgIHg9J2AnIDsgY2F0ID4kdG1wL2NvbmZ0ZW1wLnNlZCA8PF9FT0YKKy9eXCQvbgoreAorL15cJC9iUworeAorL1xcXFxcJC97SDtkO30KK3tIO3MvLiovLzt4O30KK2JNCis6UworeAorL1xcXFxcJC97aDtkO30KK3toO3MvLiovLzt4O30KKzpNCitzL1xcKFxcblxcKQkvXFwxIC9nCisvXgkvZAorL15bCSBdKltcXCNdL2QKKy9eVlBBVEggKj0vZAorcy9ec3JjZGlyICo9Liovc3JjZGlyID0gLi8KK3MvXnRvcF9zcmNkaXIgKj0uKi90b3Bfc3JjZGlyID0gLi8KKy9bOj1dLyFkCisvXlxcLi9kCisvID0gL2IKKy8gLj0gL2IKKy86LyFiCitzLzouKi86Lworcy8gLyAgL2cKK3MvIFxcKFthLXpdW2Etei1dKlthLXpBLVowLTldXFwpXFwoWyA6XVxcKS8gXFwxIFxcMS1hbGxcXDIvZworcy9eXFwoW2Etel1bYS16LV0qW2EtekEtWjAtOV1cXClcXChbIDpdXFwpL1xcMSBcXDEtYWxsXFwyLworcy8gIC8gL2cKKy9eYWxsIGFsbC1hbGxbIDpdL2lcXAorYWxsLWNvbmZpZ3VyZWQgOiBhbGwtYWxsCitzLyBbYS16QS1aMC05LV0qLWFsbCBbYS16QS1aMC05LV0qLWFsbC1hbGwvL2cKKy8tYWxsLWFsbC9kCithXFwKKwlAIEhPU1Q9IlwkKEhPU1QpXCIgXFxcXFxcCisJOyB0ZXN0ICIuXCRcJEhPU1QiID0gIi4iICYmIEhPU1Q9JHggc2ggJGF4X2VuYWJsZV9idWlsZGRpcl9hdXhkaXIvY29uZmlnLmd1ZXNzICR4IFxcXFxcXAorCTsgQlVJTEQ9JHggZ3JlcCAiXiMjIyMgXCRcJEhPU1QgIiBNYWtlZmlsZSB8IHNlZCAtZSAncy8uKnwvLycgJHggXFxcXFxcCisJOyB1c2U9JHggYmFzZW5hbWUgIlwkXEAiIC1hbGwgJHg7IG49JHggZWNobyBcJFwkQlVJTEQgfCB3YyAtdyAkeCBcXFxcXFwKKwk7IGVjaG8gIk1BS0UgXCRcJEhPU1QgOiBcJFwkbiAqIFwkXEAiOyBpZiB0ZXN0ICJcJFwkbiIgLWVxICIwIiA7IHRoZW4gOiBcXFxcXFwKKwk7IEJVSUxEPSR4IGdyZXAgIl4jIyMjLip8IiBNYWtlZmlsZSB8dGFpbCAtMXwgc2VkIC1lICdzLy4qfC8vJyAkeCA7IGZpIFxcXFxcXAorCTsgdGVzdCAiLlwkXCRCVUlMRCIgPSAiLiIgJiYgQlVJTEQ9Ii4iIFxcXFxcXAorCTsgdGVzdCAiXCRcJHVzZSIgPSAiXCRcQCIgJiYgQlVJTEQ9JHggZWNobyAiXCRcJEJVSUxEIiB8IHRhaWwgLTEgJHggXFxcXFxcCisJOyBmb3IgaSBpbiBcJFwkQlVJTEQgOyBkbyB0ZXN0ICIuXCRcJGkiID0gIi4iICYmIGNvbnRpbnVlIFxcXFxcXAorCTsgKGNkICJcJFwkaSIgJiYgdGVzdCAhIC1mIGNvbmZpZ3VyZSAmJiBcJChNQUtFKSBcJFwkdXNlKSB8fCBleGl0OyBkb25lCisvZGlzdC1hbGwgKjovYVxcCisJQCBIT1NUPSJcJChIT1NUKVwiIFxcXFxcXAorCTsgdGVzdCAiLlwkXCRIT1NUIiA9ICIuIiAmJiBIT1NUPSR4IHNoICRheF9lbmFibGVfYnVpbGRkaXJfYXV4ZGlyL2NvbmZpZy5ndWVzcyAkeCBcXFxcXFwKKwk7IEJVSUxEPSR4IGdyZXAgIl4jIyMjIFwkXCRIT1NUICIgTWFrZWZpbGUgfCBzZWQgLWUgJ3MvLip8Ly8nICR4IFxcXFxcXAorCTsgZm91bmQ9JHggZWNobyBcJFwkQlVJTEQgfCB3YyAtdyAkeCBcXFxcXFwKKwk7IGVjaG8gIk1BS0UgXCRcJEhPU1QgOiBcJFwkZm91bmQgXCQoUEFDS0FHRSktXCQoVkVSU0lPTikudGFyLioiIFxcXFxcXAorCTsgaWYgdGVzdCAiXCRcJGZvdW5kIiAtZXEgIjAiIDsgdGhlbiA6IFxcXFxcXAorCTsgQlVJTEQ9JHggZ3JlcCAiXiMjIyMgLip8IiBNYWtlZmlsZSB8dGFpbCAtMXwgc2VkIC1lICdzLy4qfC8vJyAkeCBcXFxcXFwKKwk7IGZpIDsgZm9yIGkgaW4gXCRcJEJVSUxEIDsgZG8gdGVzdCAiLlwkXCRpIiA9ICIuIiAmJiBjb250aW51ZSBcXFxcXFwKKwk7IGZvciBmIGluIFwkXCRpL1wkKFBBQ0tBR0UpLVwkKFZFUlNJT04pLnRhci4qIFxcXFxcXAorCTsgZG8gdGVzdCAtZiAiXCRcJGYiICYmIG12ICJcJFwkZiIgXCQoUFVCKS4gOyBkb25lIDsgYnJlYWsgOyBkb25lCisvZGlzdC1bYS16QS1aMC05XSotYWxsICo6L2FcXAorCUAgSE9TVD0iXCQoSE9TVClcIiBcXFxcXFwKKwk7IHRlc3QgIi5cJFwkSE9TVCIgPSAiLiIgJiYgSE9TVD0keCBzaCAuL2NvbmZpZy5ndWVzcyAkeCBcXFxcXFwKKwk7IEJVSUxEPSR4IGdyZXAgIl4jIyMjIFwkXCRIT1NUICIgTWFrZWZpbGUgfCBzZWQgLWUgJ3MvLip8Ly8nICR4IFxcXFxcXAorCTsgZm91bmQ9JHggZWNobyBcJFwkQlVJTEQgfCB3YyAtdyAkeCBcXFxcXFwKKwk7IGVjaG8gIk1BS0UgXCRcJEhPU1QgOiBcJFwkZm91bmQgXCQoUEFDS0FHRSktXCQoVkVSU0lPTikuKiIgXFxcXFxcCisJOyBpZiB0ZXN0ICJcJFwkZm91bmQiIC1lcSAiMCIgOyB0aGVuIDogXFxcXFxcCisJOyBCVUlMRD0keCBncmVwICJeIyMjIyAuKnwiIE1ha2VmaWxlIHx0YWlsIC0xfCBzZWQgLWUgJ3MvLip8Ly8nICR4IFxcXFxcXAorCTsgZmkgOyBmb3IgaSBpbiBcJFwkQlVJTEQgOyBkbyB0ZXN0ICIuXCRcJGkiID0gIi4iICYmIGNvbnRpbnVlIFxcXFxcXAorCTsgZm9yIGYgaW4gXCRcJGkvXCQoUEFDS0FHRSktXCQoVkVSU0lPTikuKiBcXFxcXFwKKwk7IGRvIHRlc3QgLWYgIlwkXCRmIiAmJiBtdiAiXCRcJGYiIFwkKFBVQikuIDsgZG9uZSA7IGJyZWFrIDsgZG9uZQorL2Rpc3RjbGVhbi1hbGwgKjovYVxcCisJQCBIT1NUPSJcJChIT1NUKVwiIFxcXFxcXAorCTsgdGVzdCAiLlwkXCRIT1NUIiA9ICIuIiAmJiBIT1NUPSR4IHNoICRheF9lbmFibGVfYnVpbGRkaXJfYXV4ZGlyL2NvbmZpZy5ndWVzcyAkeCBcXFxcXFwKKwk7IEJVSUxEPSR4IGdyZXAgIl4jIyMjIC4qfCIgTWFrZWZpbGUgfCBzZWQgLWUgJ3MvLip8Ly8nICR4IFxcXFxcXAorCTsgdXNlPSR4IGJhc2VuYW1lICJcJFxAIiAtYWxsICR4OyBuPSR4IGVjaG8gXCRcJEJVSUxEIHwgd2MgLXcgJHggXFxcXFxcCisJOyBlY2hvICJNQUtFIFwkXCRIT1NUIDogXCRcJG4gKiBcJFxAIChhbGwgbG9jYWwgYnVpbGRzKSIgXFxcXFxcCisJOyB0ZXN0ICIuXCRcJEJVSUxEIiA9ICIuIiAmJiBCVUlMRD0iLiIgXFxcXFxcCisJOyBmb3IgaSBpbiBcJFwkQlVJTEQgOyBkbyB0ZXN0ICIuXCRcJGkiID0gIi4iICYmIGNvbnRpbnVlIFxcXFxcXAorCTsgZWNobyAiIyBybSAtciBcJFwkaSI7IGRvbmUgOyBlY2hvICIjIChzbGVlcCAzKSIgOyBzbGVlcCAzIFxcXFxcXAorCTsgZm9yIGkgaW4gXCRcJEJVSUxEIDsgZG8gdGVzdCAiLlwkXCRpIiA9ICIuIiAmJiBjb250aW51ZSBcXFxcXFwKKwk7IGVjaG8gIlwkXCRpIiB8IGdyZXAgIl4vIiA+IC9kZXYvbnVsbCAmJiBjb250aW51ZSBcXFxcXFwKKwk7IGVjaG8gIlwkXCRpIiB8IGdyZXAgIl4uLi8iID4gL2Rldi9udWxsICYmIGNvbnRpbnVlIFxcXFxcXAorCTsgZWNobyAicm0gLXIgXCRcJGkiOyAocm0gLXIgIlwkXCRpIikgOyBkb25lIDsgcm0gTWFrZWZpbGUKK19FT0YKKyAgICAgIGNwICIkdG1wL2NvbmZ0ZW1wLnNlZCIgIiRhY190b3Bfc3JjZGlyL21ha2VmaWxlLnNlZH4iICAgICAgICAgICAgIyMgREVCVUdHSU5HCisgICAgICAkYXhfZW5hYmxlX2J1aWxkZGlyX3NlZCAtZiAkdG1wL2NvbmZ0ZW1wLnNlZCBNYWtlZmlsZSA+JGFjX3RvcF9zcmNkaXIvTWFrZWZpbGUKKyAgICAgIGlmIHRlc3QgLWYgIiRhY190b3Bfc3JjZGlyL01ha2VmaWxlLm1rIiA7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBleHRlbmQgdG9wX3NyY2Rpci9NYWtlZmlsZSB3aXRoIHRvcF9zcmNkaXIvTWFrZWZpbGUubWsiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXh0ZW5kIHRvcF9zcmNkaXIvTWFrZWZpbGUgd2l0aCB0b3Bfc3JjZGlyL01ha2VmaWxlLm1rIiA+JjY7fQorICAgICAgICBjYXQgJGFjX3RvcF9zcmNkaXIvTWFrZWZpbGUubWsgPj4kYWNfdG9wX3NyY2Rpci9NYWtlZmlsZQorICAgICAgZmkgOyB4eHh4PSIjIyMjIgorICAgICAgZWNobyAiJHh4eHggQ09ORklHVVJBVElPTlMgRk9SIFRPUExFVkVMIE1BS0VGSUxFOiAiID4+JGFjX3RvcF9zcmNkaXIvTWFrZWZpbGUKKyAgICAgICMgc2FuaXR5IGNoZWNrCisgICAgICBpZiBncmVwICdeOyBlY2hvICJNQUtFICcgJGFjX3RvcF9zcmNkaXIvTWFrZWZpbGUgPi9kZXYvbnVsbCA7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBidWdneSBzZWQgZm91bmQgLSBpdCBkZWxldGVzIHRhYiBpbiBcImFcIiB0ZXh0IHBhcnRzIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGJ1Z2d5IHNlZCBmb3VuZCAtIGl0IGRlbGV0ZXMgdGFiIGluIFwiYVwiIHRleHQgcGFydHMiID4mNjt9CisgICAgICAgICRheF9lbmFibGVfYnVpbGRkaXJfc2VkIC1lICcvXkAgSE9TVD0vcy9eLwkvJyAtZSAnL147IC9zL14vCS8nICRhY190b3Bfc3JjZGlyL01ha2VmaWxlIFwKKyAgICAgICAgICA+JGFjX3RvcF9zcmNkaXIvTWFrZWZpbGV+CisgICAgICAgICh0ZXN0IC1zICRhY190b3Bfc3JjZGlyL01ha2VmaWxlfiAmJiBtdiAkYWNfdG9wX3NyY2Rpci9NYWtlZmlsZX4gJGFjX3RvcF9zcmNkaXIvTWFrZWZpbGUpIDI+L2Rldi9udWxsCisgICAgICBmaQorICAgIGVsc2UKKyAgICAgIHh4eHg9IlxcI1xcI1xcI1xcIyIKKyAgICAgICMgZWNobyAiL14keHh4eCAqJGF4X2VuYWJsZV9idWlsZGRpcl9ob3N0IC9kIiA+JHRtcC9jb25mdGVtcC5zZWQKKyAgICAgIGVjaG8gInMhXiR4eHh4IFtefF0qIHwgKiRheF9lbmFibGVfYnVpbGRkaXIgKlwkISR4eHh4IC4uLi4uLiAkYXhfZW5hYmxlX2J1aWxkZGlyISIgPiR0bXAvY29uZnRlbXAuc2VkCisgICAgICAkYXhfZW5hYmxlX2J1aWxkZGlyX3NlZCAtZiAiJHRtcC9jb25mdGVtcC5zZWQiICIkYWNfdG9wX3NyY2Rpci9NYWtlZmlsZSIgPiR0bXAvbWtmaWxlLnRtcAorICAgICAgICBjcCAiJHRtcC9jb25mdGVtcC5zZWQiICIkYWNfdG9wX3NyY2Rpci9tYWtlZmlsZXMuc2VkfiIgICAgICAgICAjIyBERUJVR0dJTkcKKyAgICAgICAgY3AgIiR0bXAvbWtmaWxlLnRtcCIgICAiJGFjX3RvcF9zcmNkaXIvbWFrZWZpbGVzLm91dH4iICAgICAgICAgIyMgREVCVUdHSU5HCisgICAgICBpZiBjbXAgLXMgIiRhY190b3Bfc3JjZGlyL01ha2VmaWxlIiAiJHRtcC9ta2ZpbGUudG1wIiAyPi9kZXYvbnVsbCA7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBrZWVwaW5nIHRvcF9zcmNkaXIvTWFrZWZpbGUgZnJvbSBlYXJsaWVyIGNvbmZpZ3VyZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBrZWVwaW5nIHRvcF9zcmNkaXIvTWFrZWZpbGUgZnJvbSBlYXJsaWVyIGNvbmZpZ3VyZSIgPiY2O30KKyAgICAgICAgcm0gIiR0bXAvbWtmaWxlLnRtcCIKKyAgICAgIGVsc2UKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXVzaW5nIHRvcF9zcmNkaXIvTWFrZWZpbGUgZnJvbSBlYXJsaWVyIGNvbmZpZ3VyZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiByZXVzaW5nIHRvcF9zcmNkaXIvTWFrZWZpbGUgZnJvbSBlYXJsaWVyIGNvbmZpZ3VyZSIgPiY2O30KKyAgICAgICAgbXYgIiR0bXAvbWtmaWxlLnRtcCIgIiRhY190b3Bfc3JjZGlyL01ha2VmaWxlIgorICAgICAgZmkKKyAgICBmaQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogYnVpbGQgaW4gJGF4X2VuYWJsZV9idWlsZGRpciAoSE9TVD0kYXhfZW5hYmxlX2J1aWxkZGlyX2hvc3QpIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGJ1aWxkIGluICRheF9lbmFibGVfYnVpbGRkaXIgKEhPU1Q9JGF4X2VuYWJsZV9idWlsZGRpcl9ob3N0KSIgPiY2O30KKyAgICB4eHh4PSIjIyMjIgorICAgIGVjaG8gIiR4eHh4IiAiJGF4X2VuYWJsZV9idWlsZGRpcl9ob3N0IiAifCRheF9lbmFibGVfYnVpbGRkaXIiID4+JGFjX3RvcF9zcmNkaXIvTWFrZWZpbGUKKyAgZmkKKyA7OwogICAgICJkZXBmaWxlcyI6QykgdGVzdCB4IiRBTURFUF9UUlVFIiAhPSB4IiIgfHwgewogICAjIEF1dG9jb25mIDIuNjIgcXVvdGVzIC0tZmlsZSBhcmd1bWVudHMgZm9yIGV2YWwsIGJ1dCBub3Qgd2hlbiBmaWxlcwogICAjIGFyZSBsaXN0ZWQgd2l0aG91dCAtLWZpbGUuICBMZXQncyBwbGF5IHNhZmUgYW5kIG9ubHkgZW5hYmxlIHRoZSBldmFsCkBAIC0xNDE2Niw3ICsxNjg0NCw3IEBACiAgICAgIyBTdHJpcCBNRiBzbyB3ZSBlbmQgdXAgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KICAgICBtZj1gZWNobyAiJG1mIiB8IHNlZCAtZSAncy86LiokLy8nYAogICAgICMgQ2hlY2sgd2hldGhlciB0aGlzIGlzIGFuIEF1dG9tYWtlIGdlbmVyYXRlZCBNYWtlZmlsZSBvciBub3QuCi0gICAgIyBXZSB1c2VkIHRvIG1hdGNoIG9ubHkgdGhlIGZpbGVzIG5hbWVkIGBNYWtlZmlsZS5pbicsIGJ1dAorICAgICMgV2UgdXNlZCB0byBtYXRjaCBvbmx5IHRoZSBmaWxlcyBuYW1lZCAnTWFrZWZpbGUuaW4nLCBidXQKICAgICAjIHNvbWUgcGVvcGxlIHJlbmFtZSB0aGVtOyBzbyBpbnN0ZWFkIHdlIGxvb2sgYXQgdGhlIGZpbGUgY29udGVudC4KICAgICAjIEdyZXAnaW5nIHRoZSBmaXJzdCBsaW5lIGlzIG5vdCBlbm91Z2g6IHNvbWUgcGVvcGxlIHBvc3QtcHJvY2VzcwogICAgICMgZWFjaCBNYWtlZmlsZS5pbiBhbmQgYWRkIGEgbmV3IGxpbmUgb24gdG9wIG9mIGVhY2ggZmlsZSB0byBzYXkgc28uCkBAIC0xNDIwMCwyMSArMTY4NzgsMTkgQEAKICAgICAgIGNvbnRpbnVlCiAgICAgZmkKICAgICAjIEV4dHJhY3QgdGhlIGRlZmluaXRpb24gb2YgREVQRElSLCBhbV9faW5jbHVkZSwgYW5kIGFtX19xdW90ZQotICAgICMgZnJvbSB0aGUgTWFrZWZpbGUgd2l0aG91dCBydW5uaW5nIGBtYWtlJy4KKyAgICAjIGZyb20gdGhlIE1ha2VmaWxlIHdpdGhvdXQgcnVubmluZyAnbWFrZScuCiAgICAgREVQRElSPWBzZWQgLW4gJ3MvXkRFUERJUiA9IC8vcCcgPCAiJG1mImAKICAgICB0ZXN0IC16ICIkREVQRElSIiAmJiBjb250aW51ZQogICAgIGFtX19pbmNsdWRlPWBzZWQgLW4gJ3MvXmFtX19pbmNsdWRlID0gLy9wJyA8ICIkbWYiYAogICAgIHRlc3QgLXogImFtX19pbmNsdWRlIiAmJiBjb250aW51ZQogICAgIGFtX19xdW90ZT1gc2VkIC1uICdzL15hbV9fcXVvdGUgPSAvL3AnIDwgIiRtZiJgCi0gICAgIyBXaGVuIHVzaW5nIGFuc2kya25yLCBVIG1heSBiZSBlbXB0eSBvciBhbiB1bmRlcnNjb3JlOyBleHBhbmQgaXQKLSAgICBVPWBzZWQgLW4gJ3MvXlUgPSAvL3AnIDwgIiRtZiJgCiAgICAgIyBGaW5kIGFsbCBkZXBlbmRlbmN5IG91dHB1dCBmaWxlcywgdGhleSBhcmUgaW5jbHVkZWQgZmlsZXMgd2l0aAogICAgICMgJChERVBESVIpIGluIHRoZWlyIG5hbWVzLiAgV2UgaW52b2tlIHNlZCB0d2ljZSBiZWNhdXNlIGl0IGlzIHRoZQogICAgICMgc2ltcGxlc3QgYXBwcm9hY2ggdG8gY2hhbmdpbmcgJChERVBESVIpIHRvIGl0cyBhY3R1YWwgdmFsdWUgaW4gdGhlCiAgICAgIyBleHBhbnNpb24uCiAgICAgZm9yIGZpbGUgaW4gYHNlZCAtbiAiCiAgICAgICBzL14kYW1fX2luY2x1ZGUgJGFtX19xdW90ZVwoLiooREVQRElSKS4qXCkkYW1fX3F1b3RlIickL1wxL3AnIDwiJG1mIiB8IFwKLQkgc2VkIC1lICdzL1wkKERFUERJUikvJyIkREVQRElSIicvZycgLWUgJ3MvXCRVLyciJFUiJy9nJ2A7IGRvCisJIHNlZCAtZSAncy9cJChERVBESVIpLyciJERFUERJUiInL2cnYDsgZG8KICAgICAgICMgTWFrZSBzdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzLgogICAgICAgdGVzdCAtZiAiJGRpcnBhcnQvJGZpbGUiICYmIGNvbnRpbnVlCiAgICAgICBmZGlyPWAkYXNfZGlybmFtZSAtLSAiJGZpbGUiIHx8CkBAIC0xNDI2OCw3ICsxNjk0NCw4IEBACiAjIE5PVEU6IENoYW5nZXMgbWFkZSB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0OiBsb29rIGF0IGx0bWFpbi5zaC4KICMKICMgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsCi0jICAgICAgICAgICAgICAgICAyMDA2LCAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyAgICAgICAgICAgICAgICAgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlCisjICAgICAgICAgICAgICAgICBGb3VuZGF0aW9uLCBJbmMuCiAjICAgV3JpdHRlbiBieSBHb3Jkb24gTWF0emlna2VpdCwgMTk5NgogIwogIyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBMaWJ0b29sLgpAQCAtMTQzMTYsNiArMTY5OTMsMTUgQEAKICMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgogZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCiAKKyMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KK1NIRUxMPSRsdF9TSEVMTAorCisjIEFuIGVjaG8gcHJvZ3JhbSB0aGF0IHByb3RlY3RzIGJhY2tzbGFzaGVzLgorRUNITz0kbHRfRUNITworCisjIFRoZSBQQVRIIHNlcGFyYXRvciBmb3IgdGhlIGJ1aWxkIHN5c3RlbS4KK1BBVEhfU0VQQVJBVE9SPSRsdF9QQVRIX1NFUEFSQVRPUgorCiAjIFRoZSBob3N0IHN5c3RlbS4KIGhvc3RfYWxpYXM9JGhvc3RfYWxpYXMKIGhvc3Q9JGhvc3QKQEAgLTE0MzY1LDkgKzE3MDUxLDExIEBACiAjIHR1cm4gbmV3bGluZXMgaW50byBzcGFjZXMuCiBOTDJTUD0kbHRfbHRfTkwyU1AKIAotIyBIb3cgdG8gY3JlYXRlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzLgotcmVsb2FkX2ZsYWc9JGx0X3JlbG9hZF9mbGFnCi1yZWxvYWRfY21kcz0kbHRfcmVsb2FkX2NtZHMKKyMgY29udmVydCBcJGJ1aWxkIGZpbGUgbmFtZXMgdG8gXCRob3N0IGZvcm1hdC4KK3RvX2hvc3RfZmlsZV9jbWQ9JGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQKKworIyBjb252ZXJ0IFwkYnVpbGQgZmlsZXMgdG8gdG9vbGNoYWluIGZvcm1hdC4KK3RvX3Rvb2xfZmlsZV9jbWQ9JGx0X2N2X3RvX3Rvb2xfZmlsZV9jbWQKIAogIyBBbiBvYmplY3Qgc3ltYm9sIGR1bXBlci4KIE9CSkRVTVA9JGx0X09CSkRVTVAKQEAgLTE0Mzc1LDEzICsxNzA2MywzMCBAQAogIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9kZXBsaWJzX2NoZWNrX21ldGhvZAogCi0jIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gImZpbGVfbWFnaWMiLgorIyBDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID0gImZpbGVfbWFnaWMiLgogZmlsZV9tYWdpY19jbWQ9JGx0X2ZpbGVfbWFnaWNfY21kCiAKKyMgSG93IHRvIGZpbmQgcG90ZW50aWFsIGZpbGVzIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPSAiZmlsZV9tYWdpYyIuCitmaWxlX21hZ2ljX2dsb2I9JGx0X2ZpbGVfbWFnaWNfZ2xvYgorCisjIEZpbmQgcG90ZW50aWFsIGZpbGVzIHVzaW5nIG5vY2FzZWdsb2Igd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9ICJmaWxlX21hZ2ljIi4KK3dhbnRfbm9jYXNlZ2xvYj0kbHRfd2FudF9ub2Nhc2VnbG9iCisKKyMgRExMIGNyZWF0aW9uIHByb2dyYW0uCitETExUT09MPSRsdF9ETExUT09MCisKKyMgQ29tbWFuZCB0byBhc3NvY2lhdGUgc2hhcmVkIGFuZCBsaW5rIGxpYnJhcmllcy4KK3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPSRsdF9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZAorCiAjIFRoZSBhcmNoaXZlci4KIEFSPSRsdF9BUgorCisjIEZsYWdzIHRvIGNyZWF0ZSBhbiBhcmNoaXZlLgogQVJfRkxBR1M9JGx0X0FSX0ZMQUdTCiAKKyMgSG93IHRvIGZlZWQgYSBmaWxlIGxpc3RpbmcgdG8gdGhlIGFyY2hpdmVyLgorYXJjaGl2ZXJfbGlzdF9zcGVjPSRsdF9hcmNoaXZlcl9saXN0X3NwZWMKKwogIyBBIHN5bWJvbCBzdHJpcHBpbmcgcHJvZ3JhbS4KIFNUUklQPSRsdF9TVFJJUAogCkBAIC0xNDM5MCw2ICsxNzA5NSw5IEBACiBvbGRfcG9zdGluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3RpbnN0YWxsX2NtZHMKIG9sZF9wb3N0dW5pbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0dW5pbnN0YWxsX2NtZHMKIAorIyBXaGV0aGVyIHRvIHVzZSBhIGxvY2sgZm9yIG9sZCBhcmNoaXZlIGV4dHJhY3Rpb24uCitsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb249JGxvY2tfb2xkX2FyY2hpdmVfZXh0cmFjdGlvbgorCiAjIEEgQyBjb21waWxlci4KIExUQ0M9JGx0X0NDCiAKQEAgLTE0NDA4LDIxICsxNzExNiwyNCBAQAogIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIgd2hlbiBsaWIgcHJlZml4IGlzIG5lZWRlZC4KIGdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeD0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeAogCisjIFNwZWNpZnkgZmlsZW5hbWUgY29udGFpbmluZyBpbnB1dCBmaWxlcyBmb3IgXCROTS4KK25tX2ZpbGVfbGlzdF9zcGVjPSRsdF9ubV9maWxlX2xpc3Rfc3BlYworCisjIFRoZSByb290IHdoZXJlIHRvIHNlYXJjaCBmb3IgZGVwZW5kZW50IGxpYnJhcmllcyxhbmQgaW4gd2hpY2ggb3VyIGxpYnJhcmllcyBzaG91bGQgYmUgaW5zdGFsbGVkLgorbHRfc3lzcm9vdD0kbHRfc3lzcm9vdAorCiAjIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KIG9iamRpcj0kb2JqZGlyCiAKLSMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KLVNIRUxMPSRsdF9TSEVMTAotCi0jIEFuIGVjaG8gcHJvZ3JhbSB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2hlcy4KLUVDSE89JGx0X0VDSE8KLQogIyBVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zIHdpdGggImZpbGUiLgogTUFHSUNfQ01EPSRNQUdJQ19DTUQKIAogIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbj8KIG5lZWRfbG9ja3M9JGx0X25lZWRfbG9ja3MKIAorIyBNYW5pZmVzdCB0b29sLgorTUFOSUZFU1RfVE9PTD0kbHRfTUFOSUZFU1RfVE9PTAorCiAjIFRvb2wgdG8gbWFuaXB1bGF0ZSBhcmNoaXZlZCBEV0FSRiBkZWJ1ZyBzeW1ib2wgZmlsZXMgb24gTWFjIE9TIFguCiBEU1lNVVRJTD0kbHRfRFNZTVVUSUwKIApAQCAtMTQ0NzksNiArMTcxOTAsOSBAQAogIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KIHNvbmFtZV9zcGVjPSRsdF9zb25hbWVfc3BlYwogCisjIFBlcm1pc3Npb24gbW9kZSBvdmVycmlkZSBmb3IgaW5zdGFsbGF0aW9uIG9mIHNoYXJlZCBsaWJyYXJpZXMuCitpbnN0YWxsX292ZXJyaWRlX21vZGU9JGx0X2luc3RhbGxfb3ZlcnJpZGVfbW9kZQorCiAjIENvbW1hbmQgdG8gdXNlIGFmdGVyIGluc3RhbGxhdGlvbiBvZiBhIHNoYXJlZCBhcmNoaXZlLgogcG9zdGluc3RhbGxfY21kcz0kbHRfcG9zdGluc3RhbGxfY21kcwogCkBAIC0xNDUxOCw2ICsxNzIzMiwxMCBAQAogIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgogTEQ9JGx0X0xECiAKKyMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KK3JlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZworcmVsb2FkX2NtZHM9JGx0X3JlbG9hZF9jbWRzCisKICMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KIG9sZF9hcmNoaXZlX2NtZHM9JGx0X29sZF9hcmNoaXZlX2NtZHMKIApAQCAtMTQ1MzAsMTIgKzE3MjQ4LDEyIEBACiAjIENvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnMuCiBub19idWlsdGluX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnCiAKLSMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KLXdsPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3dsCi0KICMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgogcGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfcGljCiAKKyMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KK3dsPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3dsCisKICMgQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZy4KIGxpbmtfc3RhdGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfc3RhdGljCiAKQEAgLTE0NTg1LDEwICsxNzMwMyw2IEBACiAjIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QKIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMKIAotIyBJZiBsZCBpcyB1c2VkIHdoZW4gbGlua2luZywgZmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5Ci0jIGR1cmluZyBsaW5raW5nLiAgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzIG5vdCBleGlzdC4KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQ9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQKLQogIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgIi1ycGF0aCIgZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgogaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcgogCkBAIC0xNDYyMiw5ICsxNzMzNiw2IEBACiAjIFdoZXRoZXIgbGlidG9vbCBtdXN0IGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgYWxsIGl0cyBkZXBlbmRlbmN5IGxpYnJhcmllcy4KIGxpbmtfYWxsX2RlcGxpYnM9JGxpbmtfYWxsX2RlcGxpYnMKIAotIyBGaXggdGhlIHNoZWxsIHZhcmlhYmxlIFwkc3JjZmlsZSBmb3IgdGhlIGNvbXBpbGVyLgotZml4X3NyY2ZpbGVfcGF0aD0kbHRfZml4X3NyY2ZpbGVfcGF0aAotCiAjIFNldCB0byAieWVzIiBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KIGFsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzCiAKQEAgLTE0NjQwLDYgKzE3MzUxLDkgQEAKICMgQ29tbWFuZHMgbmVjZXNzYXJ5IGZvciBsaW5raW5nIHByb2dyYW1zIChhZ2FpbnN0IGxpYnJhcmllcykgd2l0aCB0ZW1wbGF0ZXMuCiBwcmVsaW5rX2NtZHM9JGx0X3ByZWxpbmtfY21kcwogCisjIENvbW1hbmRzIG5lY2Vzc2FyeSBmb3IgZmluaXNoaW5nIGxpbmtpbmcgcHJvZ3JhbXMuCitwb3N0bGlua19jbWRzPSRsdF9wb3N0bGlua19jbWRzCisKICMgU3BlY2lmeSBmaWxlbmFtZSBjb250YWluaW5nIGlucHV0IGZpbGVzLgogZmlsZV9saXN0X3NwZWM9JGx0X2ZpbGVfbGlzdF9zcGVjCiAKQEAgLTE0NjcyLDIxMiArMTczODYsMTY5IEBACiAgICMgaWYgZmluZHMgbWl4ZWQgQ1IvTEYgYW5kIExGLW9ubHkgbGluZXMuICBTaW5jZSBzZWQgb3BlcmF0ZXMgaW4KICAgIyB0ZXh0IG1vZGUsIGl0IHByb3Blcmx5IGNvbnZlcnRzIGxpbmVzIHRvIENSL0xGLiAgVGhpcyBiYXNoIHByb2JsZW0KICAgIyBpcyByZXBvcnRlZGx5IGZpeGVkLCBidXQgd2h5IG5vdCBydW4gb24gb2xkIHZlcnNpb25zIHRvbz8KLSAgc2VkICcvXiMgR2VuZXJhdGVkIHNoZWxsIGZ1bmN0aW9ucyBpbnNlcnRlZCBoZXJlL3EnICIkbHRtYWluIiA+PiAiJGNmZ2ZpbGUiIFwKLSAgICB8fCAocm0gLWYgIiRjZmdmaWxlIjsgZXhpdCAxKQorICBzZWQgJyRxJyAiJGx0bWFpbiIgPj4gIiRjZmdmaWxlIiBcCisgICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiOyBleGl0IDEpCiAKLSAgY2FzZSAkeHNpX3NoZWxsIGluCi0gIHllcykKLSAgICBjYXQgPDwgXF9MVF9FT0YgPj4gIiRjZmdmaWxlIgotCi0jIGZ1bmNfZGlybmFtZSBmaWxlIGFwcGVuZCBub25kaXJfcmVwbGFjZW1lbnQKLSMgQ29tcHV0ZSB0aGUgZGlybmFtZSBvZiBGSUxFLiAgSWYgbm9uZW1wdHksIGFkZCBBUFBFTkQgdG8gdGhlIHJlc3VsdCwKLSMgb3RoZXJ3aXNlIHNldCByZXN1bHQgdG8gTk9ORElSX1JFUExBQ0VNRU5ULgotZnVuY19kaXJuYW1lICgpCi17Ci0gIGNhc2UgJHsxfSBpbgotICAgICovKikgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHsxJS8qfSR7Mn0iIDs7Ci0gICAgKiAgKSBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezN9IiA7OwotICBlc2FjCi19Ci0KLSMgZnVuY19iYXNlbmFtZSBmaWxlCi1mdW5jX2Jhc2VuYW1lICgpCi17Ci0gIGZ1bmNfYmFzZW5hbWVfcmVzdWx0PSIkezEjIyovfSIKLX0KLQotIyBmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lIGZpbGUgYXBwZW5kIG5vbmRpcl9yZXBsYWNlbWVudAotIyBwZXJmb3JtIGZ1bmNfYmFzZW5hbWUgYW5kIGZ1bmNfZGlybmFtZSBpbiBhIHNpbmdsZSBmdW5jdGlvbgotIyBjYWxsOgotIyAgIGRpcm5hbWU6ICBDb21wdXRlIHRoZSBkaXJuYW1lIG9mIEZJTEUuICBJZiBub25lbXB0eSwKLSMgICAgICAgICAgICAgYWRkIEFQUEVORCB0byB0aGUgcmVzdWx0LCBvdGhlcndpc2Ugc2V0IHJlc3VsdAotIyAgICAgICAgICAgICB0byBOT05ESVJfUkVQTEFDRU1FTlQuCi0jICAgICAgICAgICAgIHZhbHVlIHJldHVybmVkIGluICIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKLSMgICBiYXNlbmFtZTogQ29tcHV0ZSBmaWxlbmFtZSBvZiBGSUxFLgotIyAgICAgICAgICAgICB2YWx1ZSByZXR1bmVkIGluICIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCi0jIEltcGxlbWVudGF0aW9uIG11c3QgYmUga2VwdCBzeW5jaHJvbml6ZWQgd2l0aCBmdW5jX2Rpcm5hbWUKLSMgYW5kIGZ1bmNfYmFzZW5hbWUuIEZvciBlZmZpY2llbmN5LCB3ZSBkbyBub3QgZGVsZWdhdGUgdG8KLSMgdGhvc2UgZnVuY3Rpb25zIGJ1dCBpbnN0ZWFkIGR1cGxpY2F0ZSB0aGUgZnVuY3Rpb25hbGl0eSBoZXJlLgotZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAoKQotewotICBjYXNlICR7MX0gaW4KLSAgICAqLyopIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7MSUvKn0kezJ9IiA7OwotICAgICogICkgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIgOzsKLSAgZXNhYwotICBmdW5jX2Jhc2VuYW1lX3Jlc3VsdD0iJHsxIyMqL30iCi19Ci0KLSMgZnVuY19zdHJpcG5hbWUgcHJlZml4IHN1ZmZpeCBuYW1lCi0jIHN0cmlwIFBSRUZJWCBhbmQgU1VGRklYIG9mZiBvZiBOQU1FLgotIyBQUkVGSVggYW5kIFNVRkZJWCBtdXN0IG5vdCBjb250YWluIGdsb2JiaW5nIG9yIHJlZ2V4IHNwZWNpYWwKLSMgY2hhcmFjdGVycywgaGFzaGVzLCBwZXJjZW50IHNpZ25zLCBidXQgU1VGRklYIG1heSBjb250YWluIGEgbGVhZGluZwotIyBkb3QgKGluIHdoaWNoIGNhc2UgdGhhdCBtYXRjaGVzIG9ubHkgYSBkb3QpLgotZnVuY19zdHJpcG5hbWUgKCkKLXsKLSAgIyBwZGtzaCA1LjIuMTQgZG9lcyBub3QgZG8gJHtYJSRZfSBjb3JyZWN0bHkgaWYgYm90aCBYIGFuZCBZIGFyZQotICAjIHBvc2l0aW9uYWwgcGFyYW1ldGVycywgc28gYXNzaWduIG9uZSB0byBvcmRpbmFyeSBwYXJhbWV0ZXIgZmlyc3QuCi0gIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0kezN9Ci0gIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0ke2Z1bmNfc3RyaXBuYW1lX3Jlc3VsdCMiJHsxfSJ9Ci0gIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0ke2Z1bmNfc3RyaXBuYW1lX3Jlc3VsdCUiJHsyfSJ9Ci19Ci0KLSMgZnVuY19vcHRfc3BsaXQKLWZ1bmNfb3B0X3NwbGl0ICgpCi17Ci0gIGZ1bmNfb3B0X3NwbGl0X29wdD0kezElJT0qfQotICBmdW5jX29wdF9zcGxpdF9hcmc9JHsxIyo9fQotfQotCi0jIGZ1bmNfbG8ybyBvYmplY3QKLWZ1bmNfbG8ybyAoKQotewotICBjYXNlICR7MX0gaW4KLSAgICAqLmxvKSBmdW5jX2xvMm9fcmVzdWx0PSR7MSUubG99LiR7b2JqZXh0fSA7OwotICAgICopICAgIGZ1bmNfbG8yb19yZXN1bHQ9JHsxfSA7OwotICBlc2FjCi19Ci0KLSMgZnVuY194Zm9ybSBsaWJvYmotb3Itc291cmNlCi1mdW5jX3hmb3JtICgpCi17Ci0gIGZ1bmNfeGZvcm1fcmVzdWx0PSR7MSUuKn0ubG8KLX0KLQotIyBmdW5jX2FyaXRoIGFyaXRobWV0aWMtdGVybS4uLgotZnVuY19hcml0aCAoKQotewotICBmdW5jX2FyaXRoX3Jlc3VsdD0kKCggJCogKSkKLX0KLQotIyBmdW5jX2xlbiBzdHJpbmcKLSMgU1RSSU5HIG1heSBub3Qgc3RhcnQgd2l0aCBhIGh5cGhlbi4KLWZ1bmNfbGVuICgpCi17Ci0gIGZ1bmNfbGVuX3Jlc3VsdD0keyMxfQotfQotCi1fTFRfRU9GCi0gICAgOzsKLSAgKikgIyBCb3VybmUgY29tcGF0aWJsZSBmdW5jdGlvbnMuCi0gICAgY2F0IDw8IFxfTFRfRU9GID4+ICIkY2ZnZmlsZSIKLQotIyBmdW5jX2Rpcm5hbWUgZmlsZSBhcHBlbmQgbm9uZGlyX3JlcGxhY2VtZW50Ci0jIENvbXB1dGUgdGhlIGRpcm5hbWUgb2YgRklMRS4gIElmIG5vbmVtcHR5LCBhZGQgQVBQRU5EIHRvIHRoZSByZXN1bHQsCi0jIG90aGVyd2lzZSBzZXQgcmVzdWx0IHRvIE5PTkRJUl9SRVBMQUNFTUVOVC4KLWZ1bmNfZGlybmFtZSAoKQotewotICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgotICBmdW5jX2Rpcm5hbWVfcmVzdWx0PWAkRUNITyAiWCR7MX0iIHwgJFhzZWQgLWUgIiRkaXJuYW1lImAKLSAgaWYgdGVzdCAiWCRmdW5jX2Rpcm5hbWVfcmVzdWx0IiA9ICJYJHsxfSI7IHRoZW4KLSAgICBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezN9IgotICBlbHNlCi0gICAgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJGZ1bmNfZGlybmFtZV9yZXN1bHQkezJ9IgotICBmaQotfQotCi0jIGZ1bmNfYmFzZW5hbWUgZmlsZQotZnVuY19iYXNlbmFtZSAoKQotewotICBmdW5jX2Jhc2VuYW1lX3Jlc3VsdD1gJEVDSE8gIlgkezF9IiB8ICRYc2VkIC1lICIkYmFzZW5hbWUiYAotfQorICBpZiB0ZXN0IHgiJHhzaV9zaGVsbCIgPSB4eWVzOyB0aGVuCisgIHNlZCAtZSAnL15mdW5jX2Rpcm5hbWUgKCkkLywvXn0gIyBmdW5jX2Rpcm5hbWUgL2NcCitmdW5jX2Rpcm5hbWUgKClcCit7XAorXCAgICBjYXNlICR7MX0gaW5cCitcICAgICAgKi8qKSBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezElLyp9JHsyfSIgOztcCitcICAgICAgKiAgKSBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezN9IiA7O1wKK1wgICAgZXNhY1wKK30gIyBFeHRlbmRlZC1zaGVsbCBmdW5jX2Rpcm5hbWUgaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKIAogCi0jIGZ1bmNfc3RyaXBuYW1lIHByZWZpeCBzdWZmaXggbmFtZQotIyBzdHJpcCBQUkVGSVggYW5kIFNVRkZJWCBvZmYgb2YgTkFNRS4KLSMgUFJFRklYIGFuZCBTVUZGSVggbXVzdCBub3QgY29udGFpbiBnbG9iYmluZyBvciByZWdleCBzcGVjaWFsCi0jIGNoYXJhY3RlcnMsIGhhc2hlcywgcGVyY2VudCBzaWducywgYnV0IFNVRkZJWCBtYXkgY29udGFpbiBhIGxlYWRpbmcKLSMgZG90IChpbiB3aGljaCBjYXNlIHRoYXQgbWF0Y2hlcyBvbmx5IGEgZG90KS4KLSMgZnVuY19zdHJpcF9zdWZmaXggcHJlZml4IG5hbWUKLWZ1bmNfc3RyaXBuYW1lICgpCi17Ci0gIGNhc2UgJHsyfSBpbgotICAgIC4qKSBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9YCRFQ0hPICJYJHszfSIgXAotICAgICAgICAgICB8ICRYc2VkIC1lICJzJV4kezF9JSUiIC1lICJzJVxcXFwkezJ9XCQlJSJgOzsKLSAgICAqKSAgZnVuY19zdHJpcG5hbWVfcmVzdWx0PWAkRUNITyAiWCR7M30iIFwKLSAgICAgICAgICAgfCAkWHNlZCAtZSAicyVeJHsxfSUlIiAtZSAicyUkezJ9XCQlJSJgOzsKLSAgZXNhYwotfQotCi0jIHNlZCBzY3JpcHRzOgotbXlfc2VkX2xvbmdfb3B0PScxcy9eXCgtW149XSpcKT0uKi9cMS87cScKLW15X3NlZF9sb25nX2FyZz0nMXMvXi1bXj1dKj0vLycKLQotIyBmdW5jX29wdF9zcGxpdAotZnVuY19vcHRfc3BsaXQgKCkKLXsKLSAgZnVuY19vcHRfc3BsaXRfb3B0PWAkRUNITyAiWCR7MX0iIHwgJFhzZWQgLWUgIiRteV9zZWRfbG9uZ19vcHQiYAotICBmdW5jX29wdF9zcGxpdF9hcmc9YCRFQ0hPICJYJHsxfSIgfCAkWHNlZCAtZSAiJG15X3NlZF9sb25nX2FyZyJgCi19Ci0KLSMgZnVuY19sbzJvIG9iamVjdAotZnVuY19sbzJvICgpCi17Ci0gIGZ1bmNfbG8yb19yZXN1bHQ9YCRFQ0hPICJYJHsxfSIgfCAkWHNlZCAtZSAiJGxvMm8iYAotfQotCi0jIGZ1bmNfeGZvcm0gbGlib2JqLW9yLXNvdXJjZQotZnVuY194Zm9ybSAoKQotewotICBmdW5jX3hmb3JtX3Jlc3VsdD1gJEVDSE8gIlgkezF9IiB8ICRYc2VkIC1lICdzL1wuW14uXSokLy5sby8nYAotfQotCi0jIGZ1bmNfYXJpdGggYXJpdGhtZXRpYy10ZXJtLi4uCi1mdW5jX2FyaXRoICgpCi17Ci0gIGZ1bmNfYXJpdGhfcmVzdWx0PWBleHByICIkQCJgCi19Ci0KLSMgZnVuY19sZW4gc3RyaW5nCi0jIFNUUklORyBtYXkgbm90IHN0YXJ0IHdpdGggYSBoeXBoZW4uCi1mdW5jX2xlbiAoKQotewotICBmdW5jX2xlbl9yZXN1bHQ9YGV4cHIgIiQxIiA6ICIuKiIgMj4vZGV2L251bGwgfHwgZWNobyAkbWF4X2NtZF9sZW5gCi19Ci0KLV9MVF9FT0YKLWVzYWMKLQotY2FzZSAkbHRfc2hlbGxfYXBwZW5kIGluCi0gIHllcykKLSAgICBjYXQgPDwgXF9MVF9FT0YgPj4gIiRjZmdmaWxlIgotCi0jIGZ1bmNfYXBwZW5kIHZhciB2YWx1ZQotIyBBcHBlbmQgVkFMVUUgdG8gdGhlIGVuZCBvZiBzaGVsbCB2YXJpYWJsZSBWQVIuCi1mdW5jX2FwcGVuZCAoKQotewotICBldmFsICIkMSs9XCQyIgotfQotX0xUX0VPRgotICAgIDs7Ci0gICopCi0gICAgY2F0IDw8IFxfTFRfRU9GID4+ICIkY2ZnZmlsZSIKLQotIyBmdW5jX2FwcGVuZCB2YXIgdmFsdWUKLSMgQXBwZW5kIFZBTFVFIHRvIHRoZSBlbmQgb2Ygc2hlbGwgdmFyaWFibGUgVkFSLgotZnVuY19hcHBlbmQgKCkKLXsKLSAgZXZhbCAiJDE9XCQkMVwkMiIKLX0KLQotX0xUX0VPRgotICAgIDs7Ci0gIGVzYWMKKyAgc2VkIC1lICcvXmZ1bmNfYmFzZW5hbWUgKCkkLywvXn0gIyBmdW5jX2Jhc2VuYW1lIC9jXAorZnVuY19iYXNlbmFtZSAoKVwKK3tcCitcICAgIGZ1bmNfYmFzZW5hbWVfcmVzdWx0PSIkezEjIyovfSJcCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19iYXNlbmFtZSBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgogCiAKLSAgc2VkIC1uICcvXiMgR2VuZXJhdGVkIHNoZWxsIGZ1bmN0aW9ucyBpbnNlcnRlZCBoZXJlLywkcCcgIiRsdG1haW4iID4+ICIkY2ZnZmlsZSIgXAotICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiOyBleGl0IDEpCisgIHNlZCAtZSAnL15mdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lICgpJC8sL159ICMgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAvY1wKK2Z1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgKClcCit7XAorXCAgICBjYXNlICR7MX0gaW5cCitcICAgICAgKi8qKSBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezElLyp9JHsyfSIgOztcCitcICAgICAgKiAgKSBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezN9IiA7O1wKK1wgICAgZXNhY1wKK1wgICAgZnVuY19iYXNlbmFtZV9yZXN1bHQ9IiR7MSMjKi99IlwKK30gIyBFeHRlbmRlZC1zaGVsbCBmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lIGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CiAKLSAgbXYgLWYgIiRjZmdmaWxlIiAiJG9maWxlIiB8fAorCisgIHNlZCAtZSAnL15mdW5jX3N0cmlwbmFtZSAoKSQvLC9efSAjIGZ1bmNfc3RyaXBuYW1lIC9jXAorZnVuY19zdHJpcG5hbWUgKClcCit7XAorXCAgICAjIHBka3NoIDUuMi4xNCBkb2VzIG5vdCBkbyAke1glJFl9IGNvcnJlY3RseSBpZiBib3RoIFggYW5kIFkgYXJlXAorXCAgICAjIHBvc2l0aW9uYWwgcGFyYW1ldGVycywgc28gYXNzaWduIG9uZSB0byBvcmRpbmFyeSBwYXJhbWV0ZXIgZmlyc3QuXAorXCAgICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9JHszfVwKK1wgICAgZnVuY19zdHJpcG5hbWVfcmVzdWx0PSR7ZnVuY19zdHJpcG5hbWVfcmVzdWx0IyIkezF9In1cCitcICAgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0ke2Z1bmNfc3RyaXBuYW1lX3Jlc3VsdCUiJHsyfSJ9XAorfSAjIEV4dGVuZGVkLXNoZWxsIGZ1bmNfc3RyaXBuYW1lIGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKKworICBzZWQgLWUgJy9eZnVuY19zcGxpdF9sb25nX29wdCAoKSQvLC9efSAjIGZ1bmNfc3BsaXRfbG9uZ19vcHQgL2NcCitmdW5jX3NwbGl0X2xvbmdfb3B0ICgpXAore1wKK1wgICAgZnVuY19zcGxpdF9sb25nX29wdF9uYW1lPSR7MSUlPSp9XAorXCAgICBmdW5jX3NwbGl0X2xvbmdfb3B0X2FyZz0kezEjKj19XAorfSAjIEV4dGVuZGVkLXNoZWxsIGZ1bmNfc3BsaXRfbG9uZ19vcHQgaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKKworCisgIHNlZCAtZSAnL15mdW5jX3NwbGl0X3Nob3J0X29wdCAoKSQvLC9efSAjIGZ1bmNfc3BsaXRfc2hvcnRfb3B0IC9jXAorZnVuY19zcGxpdF9zaG9ydF9vcHQgKClcCit7XAorXCAgICBmdW5jX3NwbGl0X3Nob3J0X29wdF9hcmc9JHsxIz8/fVwKK1wgICAgZnVuY19zcGxpdF9zaG9ydF9vcHRfbmFtZT0kezElIiRmdW5jX3NwbGl0X3Nob3J0X29wdF9hcmcifVwKK30gIyBFeHRlbmRlZC1zaGVsbCBmdW5jX3NwbGl0X3Nob3J0X29wdCBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorCisKKyAgc2VkIC1lICcvXmZ1bmNfbG8ybyAoKSQvLC9efSAjIGZ1bmNfbG8ybyAvY1wKK2Z1bmNfbG8ybyAoKVwKK3tcCitcICAgIGNhc2UgJHsxfSBpblwKK1wgICAgICAqLmxvKSBmdW5jX2xvMm9fcmVzdWx0PSR7MSUubG99LiR7b2JqZXh0fSA7O1wKK1wgICAgICAqKSAgICBmdW5jX2xvMm9fcmVzdWx0PSR7MX0gOztcCitcICAgIGVzYWNcCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19sbzJvIGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKKworICBzZWQgLWUgJy9eZnVuY194Zm9ybSAoKSQvLC9efSAjIGZ1bmNfeGZvcm0gL2NcCitmdW5jX3hmb3JtICgpXAore1wKKyAgICBmdW5jX3hmb3JtX3Jlc3VsdD0kezElLip9LmxvXAorfSAjIEV4dGVuZGVkLXNoZWxsIGZ1bmNfeGZvcm0gaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKKworCisgIHNlZCAtZSAnL15mdW5jX2FyaXRoICgpJC8sL159ICMgZnVuY19hcml0aCAvY1wKK2Z1bmNfYXJpdGggKClcCit7XAorICAgIGZ1bmNfYXJpdGhfcmVzdWx0PSQoKCAkKiApKVwKK30gIyBFeHRlbmRlZC1zaGVsbCBmdW5jX2FyaXRoIGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKKworICBzZWQgLWUgJy9eZnVuY19sZW4gKCkkLywvXn0gIyBmdW5jX2xlbiAvY1wKK2Z1bmNfbGVuICgpXAore1wKKyAgICBmdW5jX2xlbl9yZXN1bHQ9JHsjMX1cCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19sZW4gaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKKworZmkKKworaWYgdGVzdCB4IiRsdF9zaGVsbF9hcHBlbmQiID0geHllczsgdGhlbgorICBzZWQgLWUgJy9eZnVuY19hcHBlbmQgKCkkLywvXn0gIyBmdW5jX2FwcGVuZCAvY1wKK2Z1bmNfYXBwZW5kICgpXAore1wKKyAgICBldmFsICIkezF9Kz1cXCR7Mn0iXAorfSAjIEV4dGVuZGVkLXNoZWxsIGZ1bmNfYXBwZW5kIGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKKworICBzZWQgLWUgJy9eZnVuY19hcHBlbmRfcXVvdGVkICgpJC8sL159ICMgZnVuY19hcHBlbmRfcXVvdGVkIC9jXAorZnVuY19hcHBlbmRfcXVvdGVkICgpXAore1wKK1wgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJHsyfSJcCitcICAgIGV2YWwgIiR7MX0rPVxcXFwgXFwkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiXAorfSAjIEV4dGVuZGVkLXNoZWxsIGZ1bmNfYXBwZW5kX3F1b3RlZCBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorCisKKyAgIyBTYXZlIGEgYGZ1bmNfYXBwZW5kJyBmdW5jdGlvbiBjYWxsIHdoZXJlIHBvc3NpYmxlIGJ5IGRpcmVjdCB1c2Ugb2YgJys9JworICBzZWQgLWUgJ3MlZnVuY19hcHBlbmQgXChbYS16QS1aX11cezEsXH1cKSAiJVwxKz0iJWcnICRjZmdmaWxlID4gJGNmZ2ZpbGUudG1wIFwKKyAgICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCisgIHRlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CitlbHNlCisgICMgU2F2ZSBhIGBmdW5jX2FwcGVuZCcgZnVuY3Rpb24gY2FsbCBldmVuIHdoZW4gJys9JyBpcyBub3QgYXZhaWxhYmxlCisgIHNlZCAtZSAncyVmdW5jX2FwcGVuZCBcKFthLXpBLVpfXVx7MSxcfVwpICIlXDE9IiRcMSVnJyAkY2ZnZmlsZSA+ICRjZmdmaWxlLnRtcCBcCisgICAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQorICB0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorZmkKKworaWYgdGVzdCB4IiRfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsIiA9IHgiOiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBVbmFibGUgdG8gc3Vic3RpdHV0ZSBleHRlbmRlZCBzaGVsbCBmdW5jdGlvbnMgaW4gJG9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IFVuYWJsZSB0byBzdWJzdGl0dXRlIGV4dGVuZGVkIHNoZWxsIGZ1bmN0aW9ucyBpbiAkb2ZpbGUiID4mMjt9CitmaQorCisKKyAgIG12IC1mICIkY2ZnZmlsZSIgIiRvZmlsZSIgfHwKICAgICAocm0gLWYgIiRvZmlsZSIgJiYgY3AgIiRjZmdmaWxlIiAiJG9maWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUiKQogICBjaG1vZCAreCAiJG9maWxlIgogCkBAIC0xNDg5Nyw3ICsxNzU2OCw3IEBACiBhY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQogCiB0ZXN0ICRhY193cml0ZV9mYWlsID0gMCB8fAotICBhc19mbl9lcnJvciAid3JpdGUgZmFpbHVyZSBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKKyAgYXNfZm5fZXJyb3IgJD8gIndyaXRlIGZhaWx1cmUgY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiICIkTElORU5PIiA1CiAKIAogIyBjb25maWd1cmUgaXMgd3JpdGluZyB0byBjb25maWcubG9nLCBhbmQgdGhlbiBjYWxscyBjb25maWcuc3RhdHVzLgpAQCAtMTQ5MTgsNyArMTc1ODksNyBAQAogICBleGVjIDU+PmNvbmZpZy5sb2cKICAgIyBVc2UgfHwsIG5vdCAmJiwgdG8gYXZvaWQgZXhpdGluZyBmcm9tIHRoZSBpZiB3aXRoICQ/ID0gMSwgd2hpY2gKICAgIyB3b3VsZCBtYWtlIGNvbmZpZ3VyZSBmYWlsIGlmIHRoaXMgaXMgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24uCi0gICRhY19jc19zdWNjZXNzIHx8IGFzX2ZuX2V4aXQgJD8KKyAgJGFjX2NzX3N1Y2Nlc3MgfHwgYXNfZm5fZXhpdCAxCiBmaQogaWYgdGVzdCAtbiAiJGFjX3VucmVjb2duaXplZF9vcHRzIiAmJiB0ZXN0ICIkZW5hYmxlX29wdGlvbl9jaGVja2luZyIgIT0gbm87IHRoZW4KICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA+JjUKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvY29uZmlndXJlLmFjIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9jb25maWd1cmUuYWMKaW5kZXggODdjNjNlMS4uN2ZlNWZmNSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9jb25maWd1cmUuYWMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9jb25maWd1cmUuYWMKQEAgLTEsMTEgKzEsMTEgQEAKIGRubCBQcm9jZXNzIHRoaXMgd2l0aCBhdXRvY29uZiB0byBjcmVhdGUgY29uZmlndXJlCiAjCi0jIGZpbGUgZnJvbSBsaWJmZmkgLSBzbGlnaHRseSBwYXRjaGVkIGZvciBjdHlwZXMKKyMgZmlsZSBmcm9tIGxpYmZmaSAtIHNsaWdodGx5IHBhdGNoZWQgZm9yIFB5dGhvbidzIGN0eXBlcwogIwogCi1BQ19QUkVSRVEoMi42MykKK0FDX1BSRVJFUSgyLjY4KQogCi1BQ19JTklUKFtsaWJmZmldLCBbMy4wLjEwcmMwXSwgW2h0dHA6Ly9nY2MuZ251Lm9yZy9idWdzLmh0bWxdKQorQUNfSU5JVChbbGliZmZpXSwgWzMuMC4xM10sIFtodHRwOi8vZ2l0aHViLmNvbS9hdGdyZWVuL2xpYmZmaS9pc3N1ZXNdKQogQUNfQ09ORklHX0hFQURFUlMoW2ZmaWNvbmZpZy5oXSkKIAogQUNfQ0FOT05JQ0FMX1NZU1RFTQpAQCAtMTMsMTggKzEzLDI0IEBACiAKIC4gJHtzcmNkaXJ9L2NvbmZpZ3VyZS5ob3N0CiAKK0FYX0VOQUJMRV9CVUlMRERJUgorCiBBTV9JTklUX0FVVE9NQUtFCiAKICMgVGhlIHNhbWUgYXMgaW4gYm9laG0tZ2MgYW5kIGxpYnN0ZGMrKy4gSGF2ZSB0byBib3Jyb3cgaXQgZnJvbSB0aGVyZS4KICMgV2UgbXVzdCBmb3JjZSBDQyB0byAvbm90LyBiZSBwcmVjaW91cyB2YXJpYWJsZXM7IG90aGVyd2lzZQogIyB0aGUgd3JvbmcsIG5vbi1tdWx0aWxpYi1hZGp1c3RlZCB2YWx1ZSB3aWxsIGJlIHVzZWQgaW4gbXVsdGlsaWJzLgogIyBBcyBhIHNpZGUgZWZmZWN0LCB3ZSBoYXZlIHRvIHN1YnN0IENGTEFHUyBvdXJzZWx2ZXMuCisjIEFsc28gc2F2ZSBhbmQgcmVzdG9yZSBDRkxBR1MsIHNpbmNlIEFDX1BST0dfQ0Mgd2lsbCBjb21lIHVwIHdpdGgKKyMgZGVmYXVsdHMgb2YgaXRzIG93biBpZiBub25lIGFyZSBwcm92aWRlZC4KIAogbTRfcmVuYW1lKFtfQUNfQVJHX1ZBUl9QUkVDSU9VU10sW3JlYWxfUFJFQ0lPVVNdKQogbTRfZGVmaW5lKFtfQUNfQVJHX1ZBUl9QUkVDSU9VU10sW10pCitzYXZlX0NGTEFHUz0kQ0ZMQUdTCiBBQ19QUk9HX0NDCitDRkxBR1M9JHNhdmVfQ0ZMQUdTCiBtNF91bmRlZmluZShbX0FDX0FSR19WQVJfUFJFQ0lPVVNdKQotbTRfcmVuYW1lKFtyZWFsX1BSRUNJT1VTXSxbX0FDX0FSR19WQVJfUFJFQ0lPVVNdKQorbTRfcmVuYW1lX2ZvcmNlKFtyZWFsX1BSRUNJT1VTXSxbX0FDX0FSR19WQVJfUFJFQ0lPVVNdKQogCiBBQ19TVUJTVChDRkxBR1MpCiAKQEAgLTMzLDYgKzM5LDI2IEBACiBBQ19QUk9HX0xJQlRPT0wKIEFDX0NPTkZJR19NQUNST19ESVIoW200XSkKIAorIyBUZXN0IGZvciA2NC1iaXQgYnVpbGQuCitBQ19DSEVDS19TSVpFT0YoW3NpemVfdF0pCisKK0FYX0NPTVBJTEVSX1ZFTkRPUgorQVhfQ0NfTUFYT1BUCisjIFRoZSBBWF9DRkxBR1NfV0FSTl9BTEwgbWFjcm8gZG9lc24ndCBjdXJyZW50bHkgd29yayBmb3Igc3VucHJvCisjIGNvbXBpbGVyLgoraWYgdGVzdCAiJGF4X2N2X2NfY29tcGlsZXJfdmVuZG9yIiAhPSAic3VuIjsgdGhlbgorICBBWF9DRkxBR1NfV0FSTl9BTEwKK2ZpCisKK2lmIHRlc3QgIngkR0NDIiA9ICJ4eWVzIjsgdGhlbgorICBDRkxBR1M9IiRDRkxBR1MgLWZleGNlcHRpb25zIgorICB0b3VjaCBsb2NhbC5leHAKK2Vsc2UKKyAgY2F0ID4gbG9jYWwuZXhwIDw8RU9GCitzZXQgQ0NfRk9SX1RBUkdFVCAiJENDIgorRU9GCitmaQorCiBBTV9NQUlOVEFJTkVSX01PREUKIAogQUNfQ0hFQ0tfSEVBREVSUyhzeXMvbW1hbi5oKQpAQCAtNDQsOSArNzAsMTMgQEAKIAogVEFSR0VURElSPSJ1bmtub3duIgogY2FzZSAiJGhvc3QiIGluCisgIGFhcmNoNjQqLSotKikKKwlUQVJHRVQ9QUFSQ0g2NDsgVEFSR0VURElSPWFhcmNoNjQKKwk7OworCiAgIGFscGhhKi0qLSopCiAJVEFSR0VUPUFMUEhBOyBUQVJHRVRESVI9YWxwaGE7Ci0JIyBTdXBwb3J0IDEyOC1iaXQgbG9uZyBkb3VibGUsIGNoYW5nYWJsZSB2aWEgY29tbWFuZC1saW5lIHN3aXRjaC4KKwkjIFN1cHBvcnQgMTI4LWJpdCBsb25nIGRvdWJsZSwgY2hhbmdlYWJsZSB2aWEgY29tbWFuZC1saW5lIHN3aXRjaC4KIAlIQVZFX0xPTkdfRE9VQkxFPSdkZWZpbmVkKF9fTE9OR19ET1VCTEVfMTI4X18pJwogCTs7CiAKQEAgLTYwLDEyICs5MCwyMCBAQAogCiAgIGFtZDY0LSotZnJlZWJzZCopCiAJVEFSR0VUPVg4Nl82NDsgVEFSR0VURElSPXg4NgorICAJOzsKKworICBhbWQ2NC0qLWZyZWVic2QqKQorCVRBUkdFVD1YODZfNjQ7IFRBUkdFVERJUj14ODYKIAk7OwogCiAgIGF2cjMyKi0qLSopCiAJVEFSR0VUPUFWUjMyOyBUQVJHRVRESVI9YXZyMzIKIAk7OwogCisgIGJmaW4qKQorICAJVEFSR0VUPUJGSU47IFRBUkdFVERJUj1iZmluCisgIAk7OworCiAgIGNyaXMtKi0qKQogCVRBUkdFVD1MSUJGRklfQ1JJUzsgVEFSR0VURElSPWNyaXMKIAk7OwpAQCAtNzQsNyArMTEyLDcgQEAKIAlUQVJHRVQ9RlJWOyBUQVJHRVRESVI9ZnJ2CiAJOzsKIAotICBocHBhKi0qLWxpbnV4KiB8IHBhcmlzYyotKi1saW51eCopCisgIGhwcGEqLSotbGludXgqIHwgcGFyaXNjKi0qLWxpbnV4KiB8IGhwcGEqLSotb3BlbmJzZCopCiAJVEFSR0VUPVBBX0xJTlVYOyBUQVJHRVRESVI9cGEKIAk7OwogICBocHBhKjY0LSotaHB1eCopCkBAIC04NywyMiArMTI1LDY1IEBACiAgIGk/ODYtKi1mcmVlYnNkKiB8IGk/ODYtKi1vcGVuYnNkKikKIAlUQVJHRVQ9WDg2X0ZSRUVCU0Q7IFRBUkdFVERJUj14ODYKIAk7OwotICBpPzg2LXdpbjMyKiB8IGk/ODYtKi1jeWd3aW4qIHwgaT84Ni0qLW1pbmd3KikKKyAgaT84Ni13aW4zMiogfCBpPzg2LSotY3lnd2luKiB8IGk/ODYtKi1taW5ndyogfCBpPzg2LSotb3MyKiB8IGk/ODYtKi1pbnRlcml4KikKIAlUQVJHRVQ9WDg2X1dJTjMyOyBUQVJHRVRESVI9eDg2Ci0JIyBBbGwgbWluZ3cvY3lnd2luL3dpbjMyIGJ1aWxkcyByZXF1aXJlIHRoaXMgZm9yIHNoYXJlZGxpYgotCUFNX0xUTERGTEFHUz0iLW5vLXVuZGVmaW5lZCIKKwkjIEFsbCBtaW5ndy9jeWd3aW4vd2luMzIgYnVpbGRzIHJlcXVpcmUgLW5vLXVuZGVmaW5lZCBmb3Igc2hhcmVkbGliLgorCSMgV2UgbXVzdCBhbHNvIGNoZWNrIHdpdGhfY3Jvc3NfaG9zdCB0byBkZWNpZGUgaWYgdGhpcyBpcyBhIG5hdGl2ZQorCSMgb3IgY3Jvc3MtYnVpbGQgYW5kIHNlbGVjdCB3aGVyZSB0byBpbnN0YWxsIGRsbHMgYXBwcm9wcmlhdGVseS4KKwlpZiB0ZXN0IC1uICIkd2l0aF9jcm9zc19ob3N0IiAmJgorCSAgIHRlc3QgeCIkd2l0aF9jcm9zc19ob3N0IiAhPSB4Im5vIjsgdGhlbgorCSAgQU1fTFRMREZMQUdTPSctbm8tdW5kZWZpbmVkIC1iaW5kaXIgIiQodG9vbGV4ZWNsaWJkaXIpIic7CisJZWxzZQorCSAgQU1fTFRMREZMQUdTPSctbm8tdW5kZWZpbmVkIC1iaW5kaXIgIiQoYmluZGlyKSInOworCWZpCiAJOzsKICAgaT84Ni0qLWRhcndpbiopCiAJVEFSR0VUPVg4Nl9EQVJXSU47IFRBUkdFVERJUj14ODYKIAk7OwogICBpPzg2LSotc29sYXJpczIuMVtbMC05XV0qKQotCVRBUkdFVD1YODZfNjQ7IFRBUkdFVERJUj14ODYKKwlUQVJHRVRESVI9eDg2CisJaWYgdGVzdCAkYWNfY3Zfc2l6ZW9mX3NpemVfdCA9IDQ7IHRoZW4KKwkgIFRBUkdFVD1YODY7IAorCWVsc2UKKwkgIFRBUkdFVD1YODZfNjQ7IAorCWZpCSAgCiAJOzsKKwogICBpKjg2LSotbnRvLXFueCopIAogICAgICAgICBUQVJHRVQ9WDg2OyBUQVJHRVRESVI9eDg2CiAgICAgICAgIDs7Ci0gIGk/ODYtKi0qKQotCVRBUkdFVD1YODY7IFRBUkdFVERJUj14ODYKKworICB4ODZfNjQtKi1kYXJ3aW4qKQorCVRBUkdFVD1YODZfREFSV0lOOyBUQVJHRVRESVI9eDg2CisJOzsKKworICB4ODZfNjQtKi1jeWd3aW4qIHwgeDg2XzY0LSotbWluZ3cqKQorCVRBUkdFVD1YODZfV0lONjQ7IFRBUkdFVERJUj14ODYKKwkjIEFsbCBtaW5ndy9jeWd3aW4vd2luMzIgYnVpbGRzIHJlcXVpcmUgLW5vLXVuZGVmaW5lZCBmb3Igc2hhcmVkbGliLgorCSMgV2UgbXVzdCBhbHNvIGNoZWNrIHdpdGhfY3Jvc3NfaG9zdCB0byBkZWNpZGUgaWYgdGhpcyBpcyBhIG5hdGl2ZQorCSMgb3IgY3Jvc3MtYnVpbGQgYW5kIHNlbGVjdCB3aGVyZSB0byBpbnN0YWxsIGRsbHMgYXBwcm9wcmlhdGVseS4KKwlpZiB0ZXN0IC1uICIkd2l0aF9jcm9zc19ob3N0IiAmJgorCSAgIHRlc3QgeCIkd2l0aF9jcm9zc19ob3N0IiAhPSB4Im5vIjsgdGhlbgorCSAgQU1fTFRMREZMQUdTPSctbm8tdW5kZWZpbmVkIC1iaW5kaXIgIiQodG9vbGV4ZWNsaWJkaXIpIic7CisJZWxzZQorCSAgQU1fTFRMREZMQUdTPSctbm8tdW5kZWZpbmVkIC1iaW5kaXIgIiQoYmluZGlyKSInOworCWZpCisJOzsKKworICBpPzg2LSotKiB8IHg4Nl82NC0qLSopCisJVEFSR0VURElSPXg4NgorCWlmIHRlc3QgJGFjX2N2X3NpemVvZl9zaXplX3QgPSA0OyB0aGVuCisJICBjYXNlICIkaG9zdCIgaW4KKwkgICAgKi1nbnV4MzIpCisJICAgICAgVEFSR0VUPVg4Nl82NAorCSAgICAgIDs7CisJICAgICopCisJICAgICAgVEFSR0VUPVg4NgorCSAgICAgIDs7CisgICAgICAgICAgZXNhYwkKKwllbHNlCisJICBUQVJHRVQ9WDg2XzY0OyAKKwlmaQkgIAogCTs7CiAKICAgaWE2NCotKi0qKQpAQCAtMTE3LDEwICsxOTgsMjIgQEAKIAlUQVJHRVQ9TTY4SzsgVEFSR0VURElSPW02OGsKIAk7OwogCi0gIG1pcHMtc2dpLWlyaXg1LiogfCBtaXBzLXNnaS1pcml4Ni4qKQorICBtaWNyb2JsYXplKi0qLSopCisJVEFSR0VUPU1JQ1JPQkxBWkU7IFRBUkdFVERJUj1taWNyb2JsYXplCisJOzsKKworICBtb3hpZS0qLSopCisJVEFSR0VUPU1PWElFOyBUQVJHRVRESVI9bW94aWUKKwk7OworCisgIG1ldGFnLSotKikKKwlUQVJHRVQ9TUVUQUc7IFRBUkdFVERJUj1tZXRhZworCTs7CisKKyAgbWlwcy1zZ2ktaXJpeDUuKiB8IG1pcHMtc2dpLWlyaXg2LiogfCBtaXBzKi0qLXJ0ZW1zKikKIAlUQVJHRVQ9TUlQU19JUklYOyBUQVJHRVRESVI9bWlwcwogCTs7Ci0gIG1pcHMqLSotbGludXgqKQorICBtaXBzKi0qLWxpbnV4KiB8IG1pcHMqLSotb3BlbmJzZCopCiAJIyBTdXBwb3J0IDEyOC1iaXQgbG9uZyBkb3VibGUgZm9yIE5ld0FCSS4KIAlIQVZFX0xPTkdfRE9VQkxFPSdkZWZpbmVkKF9fbWlwczY0KScKIAlUQVJHRVQ9TUlQU19JUklYOyBUQVJHRVRESVI9bWlwcwpAQCAtMTI5LDE4ICsyMjIsMjQgQEAKICAgcG93ZXJwYyotKi1saW51eCogfCBwb3dlcnBjLSotc3lzdiopCiAJVEFSR0VUPVBPV0VSUEM7IFRBUkdFVERJUj1wb3dlcnBjCiAJOzsKKyAgcG93ZXJwYy0qLWFtaWdhb3MqKQorCVRBUkdFVD1QT1dFUlBDOyBUQVJHRVRESVI9cG93ZXJwYworCTs7CiAgIHBvd2VycGMtKi1iZW9zKikKIAlUQVJHRVQ9UE9XRVJQQzsgVEFSR0VURElSPXBvd2VycGMKIAk7OwotICBwb3dlcnBjLSotZGFyd2luKikKKyAgcG93ZXJwYy0qLWRhcndpbiogfCBwb3dlcnBjNjQtKi1kYXJ3aW4qKQogCVRBUkdFVD1QT1dFUlBDX0RBUldJTjsgVEFSR0VURElSPXBvd2VycGMKIAk7OwogICBwb3dlcnBjLSotYWl4KiB8IHJzNjAwMC0qLWFpeCopCiAJVEFSR0VUPVBPV0VSUENfQUlYOyBUQVJHRVRESVI9cG93ZXJwYwogCTs7Ci0gIHBvd2VycGMtKi1mcmVlYnNkKikKKyAgcG93ZXJwYy0qLWZyZWVic2QqIHwgcG93ZXJwYy0qLW9wZW5ic2QqKQogCVRBUkdFVD1QT1dFUlBDX0ZSRUVCU0Q7IFRBUkdFVERJUj1wb3dlcnBjCiAJOzsKKyAgcG93ZXJwYzY0LSotZnJlZWJzZCopCisJVEFSR0VUPVBPV0VSUEM7IFRBUkdFVERJUj1wb3dlcnBjCisJOzsKICAgcG93ZXJwYyotKi1ydGVtcyopCiAJVEFSR0VUPVBPV0VSUEM7IFRBUkdFVERJUj1wb3dlcnBjCiAJOzsKQEAgLTE2MCwxNyArMjU5LDE0IEBACiAJVEFSR0VUPVNQQVJDOyBUQVJHRVRESVI9c3BhcmMKIAk7OwogCi0gIHg4Nl82NC0qLWRhcndpbiopCi0JVEFSR0VUPVg4Nl9EQVJXSU47IFRBUkdFVERJUj14ODYKKyAgdGlsZSotKikKKyAgICAgICAgVEFSR0VUPVRJTEU7IFRBUkdFVERJUj10aWxlCisgICAgICAgIDs7CisKKyAgeHRlbnNhKi0qKQorCVRBUkdFVD1YVEVOU0E7IFRBUkdFVERJUj14dGVuc2EKIAk7OwogCi0gIHg4Nl82NC0qLWN5Z3dpbiogfCB4ODZfNjQtKi1taW5ndyopCi0JVEFSR0VUPVg4Nl9XSU42NDsgVEFSR0VURElSPXg4NgotCTs7Ci0KLSAgeDg2XzY0LSotKikKLQlUQVJHRVQ9WDg2XzY0OyBUQVJHRVRESVI9eDg2Ci0JOzsKIGVzYWMKIAogQUNfU1VCU1QoQU1fUlVOVEVTVEZMQUdTKQpAQCAtMTgxLDYgKzI3Nyw3IEBACiBmaQogCiBBTV9DT05ESVRJT05BTChNSVBTLFtleHByIHgkVEFSR0VUIDogJ3hNSVBTJyA+IC9kZXYvbnVsbF0pCitBTV9DT05ESVRJT05BTChCRklOLCB0ZXN0IHgkVEFSR0VUID0geEJGSU4pCiBBTV9DT05ESVRJT05BTChTUEFSQywgdGVzdCB4JFRBUkdFVCA9IHhTUEFSQykKIEFNX0NPTkRJVElPTkFMKFg4NiwgdGVzdCB4JFRBUkdFVCA9IHhYODYpCiBBTV9DT05ESVRJT05BTChYODZfRlJFRUJTRCwgdGVzdCB4JFRBUkdFVCA9IHhYODZfRlJFRUJTRCkKQEAgLTE5MSwxMCArMjg4LDE0IEBACiBBTV9DT05ESVRJT05BTChJQTY0LCB0ZXN0IHgkVEFSR0VUID0geElBNjQpCiBBTV9DT05ESVRJT05BTChNMzJSLCB0ZXN0IHgkVEFSR0VUID0geE0zMlIpCiBBTV9DT05ESVRJT05BTChNNjhLLCB0ZXN0IHgkVEFSR0VUID0geE02OEspCitBTV9DT05ESVRJT05BTChNSUNST0JMQVpFLCB0ZXN0IHgkVEFSR0VUID0geE1JQ1JPQkxBWkUpCitBTV9DT05ESVRJT05BTChNRVRBRywgdGVzdCB4JFRBUkdFVCA9IHhNRVRBRykKK0FNX0NPTkRJVElPTkFMKE1PWElFLCB0ZXN0IHgkVEFSR0VUID0geE1PWElFKQogQU1fQ09ORElUSU9OQUwoUE9XRVJQQywgdGVzdCB4JFRBUkdFVCA9IHhQT1dFUlBDKQogQU1fQ09ORElUSU9OQUwoUE9XRVJQQ19BSVgsIHRlc3QgeCRUQVJHRVQgPSB4UE9XRVJQQ19BSVgpCiBBTV9DT05ESVRJT05BTChQT1dFUlBDX0RBUldJTiwgdGVzdCB4JFRBUkdFVCA9IHhQT1dFUlBDX0RBUldJTikKIEFNX0NPTkRJVElPTkFMKFBPV0VSUENfRlJFRUJTRCwgdGVzdCB4JFRBUkdFVCA9IHhQT1dFUlBDX0ZSRUVCU0QpCitBTV9DT05ESVRJT05BTChBQVJDSDY0LCB0ZXN0IHgkVEFSR0VUID0geEFBUkNINjQpCiBBTV9DT05ESVRJT05BTChBUk0sIHRlc3QgeCRUQVJHRVQgPSB4QVJNKQogQU1fQ09ORElUSU9OQUwoQVZSMzIsIHRlc3QgeCRUQVJHRVQgPSB4QVZSMzIpCiBBTV9DT05ESVRJT05BTChMSUJGRklfQ1JJUywgdGVzdCB4JFRBUkdFVCA9IHhMSUJGRklfQ1JJUykKQEAgLTIwNiw2ICszMDcsOCBAQAogQU1fQ09ORElUSU9OQUwoUEFfTElOVVgsIHRlc3QgeCRUQVJHRVQgPSB4UEFfTElOVVgpCiBBTV9DT05ESVRJT05BTChQQV9IUFVYLCB0ZXN0IHgkVEFSR0VUID0geFBBX0hQVVgpCiBBTV9DT05ESVRJT05BTChQQTY0X0hQVVgsIHRlc3QgeCRUQVJHRVQgPSB4UEE2NF9IUFVYKQorQU1fQ09ORElUSU9OQUwoVElMRSwgdGVzdCB4JFRBUkdFVCA9IHhUSUxFKQorQU1fQ09ORElUSU9OQUwoWFRFTlNBLCB0ZXN0IHgkVEFSR0VUID0geFhURU5TQSkKIAogQUNfSEVBREVSX1NUREMKIEFDX0NIRUNLX0ZVTkNTKG1lbWNweSkKQEAgLTIyOCwxNyArMzMxLDcgQEAKIAogQUNfQ19CSUdFTkRJQU4KIAotQUNfQ0FDSEVfQ0hFQ0soW2Fzc2VtYmxlciAuY2ZpIHBzZXVkby1vcCBzdXBwb3J0XSwKLSAgICBsaWJmZmlfY3ZfYXNfY2ZpX3BzZXVkb19vcCwgWwotICAgIGxpYmZmaV9jdl9hc19jZmlfcHNldWRvX29wPXVua25vd24KLSAgICBBQ19UUllfQ09NUElMRShbYXNtICgiLmNmaV9zdGFydHByb2Ncblx0LmNmaV9lbmRwcm9jIik7XSwsCi0JCSAgIFtsaWJmZmlfY3ZfYXNfY2ZpX3BzZXVkb19vcD15ZXNdLAotCQkgICBbbGliZmZpX2N2X2FzX2NmaV9wc2V1ZG9fb3A9bm9dKQotXSkKLWlmIHRlc3QgIngkbGliZmZpX2N2X2FzX2NmaV9wc2V1ZG9fb3AiID0geHllczsgdGhlbgotICAgIEFDX0RFRklORShIQVZFX0FTX0NGSV9QU0VVRE9fT1AsIDEsCi0JICAgICAgW0RlZmluZSBpZiB5b3VyIGFzc2VtYmxlciBzdXBwb3J0cyAuY2ZpXyogZGlyZWN0aXZlcy5dKQotZmkKK0dDQ19BU19DRklfUFNFVURPX09QCiAKIGlmIHRlc3QgeCRUQVJHRVQgPSB4U1BBUkM7IHRoZW4KICAgICBBQ19DQUNIRV9DSEVDSyhbYXNzZW1ibGVyIGFuZCBsaW5rZXIgc3VwcG9ydCB1bmFsaWduZWQgcGMgcmVsYXRlZCByZWxvY3NdLApAQCAtMjYxLDcgKzM1NCw3IEBACiAgICAgICAgbGliZmZpX2N2X2FzX3JlZ2lzdGVyX3BzZXVkb19vcCwgWwogICAgICAgIGxpYmZmaV9jdl9hc19yZWdpc3Rlcl9wc2V1ZG9fb3A9dW5rbm93bgogICAgICAgICMgQ2hlY2sgaWYgd2UgaGF2ZSAucmVnaXN0ZXIKLSAgICAgICBBQ19UUllfQ09NUElMRShbYXNtICgiLnJlZ2lzdGVyICVnMiwgI3NjcmF0Y2giKTtdLCwKKyAgICAgICBBQ19UUllfQ09NUElMRSgsW2FzbSAoIi5yZWdpc3RlciAlZzIsICNzY3JhdGNoIik7XSwKIAkJICAgICAgIFtsaWJmZmlfY3ZfYXNfcmVnaXN0ZXJfcHNldWRvX29wPXllc10sCiAJCSAgICAgICBbbGliZmZpX2N2X2FzX3JlZ2lzdGVyX3BzZXVkb19vcD1ub10pCiAgICAgXSkKQEAgLTI3NCw2NCArMzY3LDEzMiBAQAogaWYgdGVzdCB4JFRBUkdFVCA9IHhYODYgfHwgdGVzdCB4JFRBUkdFVCA9IHhYODZfV0lOMzIgfHwgdGVzdCB4JFRBUkdFVCA9IHhYODZfNjQ7IHRoZW4KICAgICBBQ19DQUNIRV9DSEVDSyhbYXNzZW1ibGVyIHN1cHBvcnRzIHBjIHJlbGF0ZWQgcmVsb2NzXSwKIAlsaWJmZmlfY3ZfYXNfeDg2X3BjcmVsLCBbCi0JbGliZmZpX2N2X2FzX3g4Nl9wY3JlbD15ZXMKKwlsaWJmZmlfY3ZfYXNfeDg2X3BjcmVsPW5vCiAJZWNobyAnLnRleHQ7IGZvbzogbm9wOyAuZGF0YTsgLmxvbmcgZm9vLS47IC50ZXh0JyA+IGNvbmZ0ZXN0LnMKLQlpZiAkQ0MgJENGTEFHUyAtYyBjb25mdGVzdC5zIDI+JjEgfCBncmVwIC1pIHdhcm5pbmcgPiAvZGV2L251bGw7IHRoZW4KLQkgICAgbGliZmZpX2N2X2FzX3g4Nl9wY3JlbD1ubworCWlmICRDQyAkQ0ZMQUdTIC1jIGNvbmZ0ZXN0LnMgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICBsaWJmZmlfY3ZfYXNfeDg2X3BjcmVsPXllcwogCWZpCiAJXSkKICAgICBpZiB0ZXN0ICJ4JGxpYmZmaV9jdl9hc194ODZfcGNyZWwiID0geHllczsgdGhlbgogCUFDX0RFRklORShIQVZFX0FTX1g4Nl9QQ1JFTCwgMSwKIAkJICBbRGVmaW5lIGlmIHlvdXIgYXNzZW1ibGVyIHN1cHBvcnRzIFBDIHJlbGF0aXZlIHJlbG9jcy5dKQogICAgIGZpCisKKyAgICBBQ19DQUNIRV9DSEVDSyhbYXNzZW1ibGVyIC5hc2NpaSBwc2V1ZG8tb3Agc3VwcG9ydF0sCisgICAgICAgbGliZmZpX2N2X2FzX2FzY2lpX3BzZXVkb19vcCwgWworICAgICAgIGxpYmZmaV9jdl9hc19hc2NpaV9wc2V1ZG9fb3A9dW5rbm93bgorICAgICAgICMgQ2hlY2sgaWYgd2UgaGF2ZSAuYXNjaWkKKyAgICAgICBBQ19UUllfQ09NUElMRSgsW2FzbSAoIi5hc2NpaSBcXCJzdHJpbmdcXCIiKTtdLAorCQkgICAgICAgW2xpYmZmaV9jdl9hc19hc2NpaV9wc2V1ZG9fb3A9eWVzXSwKKwkJICAgICAgIFtsaWJmZmlfY3ZfYXNfYXNjaWlfcHNldWRvX29wPW5vXSkKKyAgICBdKQorICAgIGlmIHRlc3QgIngkbGliZmZpX2N2X2FzX2FzY2lpX3BzZXVkb19vcCIgPSB4eWVzOyB0aGVuCisgICAgICAgQUNfREVGSU5FKEhBVkVfQVNfQVNDSUlfUFNFVURPX09QLCAxLAorCSAgICAgICBbRGVmaW5lIGlmIHlvdXIgYXNzZW1ibGVyIHN1cHBvcnRzIC5hc2NpaS5dKQorICAgIGZpCisKKyAgICBBQ19DQUNIRV9DSEVDSyhbYXNzZW1ibGVyIC5zdHJpbmcgcHNldWRvLW9wIHN1cHBvcnRdLAorICAgICAgIGxpYmZmaV9jdl9hc19zdHJpbmdfcHNldWRvX29wLCBbCisgICAgICAgbGliZmZpX2N2X2FzX3N0cmluZ19wc2V1ZG9fb3A9dW5rbm93bgorICAgICAgICMgQ2hlY2sgaWYgd2UgaGF2ZSAuc3RyaW5nCisgICAgICAgQUNfVFJZX0NPTVBJTEUoLFthc20gKCIuc3RyaW5nIFxcInN0cmluZ1xcIiIpO10sCisJCSAgICAgICBbbGliZmZpX2N2X2FzX3N0cmluZ19wc2V1ZG9fb3A9eWVzXSwKKwkJICAgICAgIFtsaWJmZmlfY3ZfYXNfc3RyaW5nX3BzZXVkb19vcD1ub10pCisgICAgXSkKKyAgICBpZiB0ZXN0ICJ4JGxpYmZmaV9jdl9hc19zdHJpbmdfcHNldWRvX29wIiA9IHh5ZXM7IHRoZW4KKyAgICAgICBBQ19ERUZJTkUoSEFWRV9BU19TVFJJTkdfUFNFVURPX09QLCAxLAorCSAgICAgICBbRGVmaW5lIGlmIHlvdXIgYXNzZW1ibGVyIHN1cHBvcnRzIC5zdHJpbmcuXSkKKyAgICBmaQogZmkKIAorIyBPbiBQYVggZW5hYmxlIGtlcm5lbHMgdGhhdCBoYXZlIE1QUk9URUNUIGVuYWJsZSB3ZSBjYW4ndCB1c2UgUFJPVF9FWEVDLgorQUNfQVJHX0VOQUJMRShwYXhfZW11dHJhbXAsCisgIFsgIC0tZW5hYmxlLXBheF9lbXV0cmFtcCAgICAgICBlbmFibGUgcGF4IGVtdWxhdGVkIHRyYW1wb2xpbmVzLCBmb3Igd2UgY2FuJ3QgdXNlIFBST1RfRVhFQ10sCisgIGlmIHRlc3QgIiRlbmFibGVfcGF4X2VtdXRyYW1wIiA9ICJ5ZXMiOyB0aGVuCisgICAgQUNfREVGSU5FKEZGSV9NTUFQX0VYRUNfRU1VVFJBTVBfUEFYLCAxLAorICAgICAgW0RlZmluZSB0aGlzIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBwYXggZW11bGF0ZWQgdHJhbXBvbGluZXNdKQorICBmaSkKKworaWYgdGVzdCB4JFRBUkdFVCA9IHhYODZfV0lONjQ7IHRoZW4KKyAgICBMVF9TWVNfU1lNQk9MX1VTQ09SRQorICAgIGlmIHRlc3QgIngkc3lzX3N5bWJvbF91bmRlcnNjb3JlIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQUNfREVGSU5FKFNZTUJPTF9VTkRFUlNDT1JFLCAxLCBbRGVmaW5lIGlmIHN5bWJvbHMgYXJlIHVuZGVyc2NvcmVkLl0pCisgICAgZmkKK2ZpCisKK0ZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEU9MAogY2FzZSAiJHRhcmdldCIgaW4KLSAgICAgKi1hcHBsZS1kYXJ3aW4xMCogfCAqLSotZnJlZWJzZCogfCAqLSotb3BlbmJzZCogfCAqLXBjLXNvbGFyaXMqKQorICAgICAqYXJtKi1hcHBsZS1kYXJ3aW4qKQorICAgICAgIEZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEU9MQorICAgICAgIEFDX0RFRklORShGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFLCAxLAorICAgICAgICAgICAgICAgICBbQ2Fubm90IHVzZSBQUk9UX0VYRUMgb24gdGhpcyB0YXJnZXQsIHNvLCB3ZSByZXZlcnQgdG8KKyAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGl2ZSBtZWFuc10pCisgICAgIDs7CisgICAgICotYXBwbGUtZGFyd2luMSogfCAqLSotZnJlZWJzZCogfCAqLSota2ZyZWVic2QqIHwgKi0qLW9wZW5ic2QqIHwgKi1wYy1zb2xhcmlzKikKICAgICAgICBBQ19ERUZJTkUoRkZJX01NQVBfRVhFQ19XUklULCAxLAogICAgICAgICAgICAgICAgICBbQ2Fubm90IHVzZSBtYWxsb2Mgb24gdGhpcyB0YXJnZXQsIHNvLCB3ZSByZXZlcnQgdG8KICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGl2ZSBtZWFuc10pCiAgICAgIDs7CiBlc2FjCitBTV9DT05ESVRJT05BTChGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFLCB0ZXN0IHgkRkZJX0VYRUNfVFJBTVBPTElORV9UQUJMRSA9IHgxKQorQUNfU1VCU1QoRkZJX0VYRUNfVFJBTVBPTElORV9UQUJMRSkKIAotQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgLmVoX2ZyYW1lIHNlY3Rpb24gc2hvdWxkIGJlIHJlYWQtb25seV0sCi0gICAgbGliZmZpX2N2X3JvX2VoX2ZyYW1lLCBbCi0JbGliZmZpX2N2X3JvX2VoX2ZyYW1lPW5vCi0JZWNobyAnZXh0ZXJuIHZvaWQgZm9vICh2b2lkKTsgdm9pZCBiYXIgKHZvaWQpIHsgZm9vICgpOyBmb28gKCk7IH0nID4gY29uZnRlc3QuYwotCWlmICRDQyAkQ0ZMQUdTIC1TIC1mcGljIC1mZXhjZXB0aW9ucyAtbyBjb25mdGVzdC5zIGNvbmZ0ZXN0LmMgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICBpZiBncmVwICcuc2VjdGlvbi4qZWhfZnJhbWUuKiJhIicgY29uZnRlc3QucyA+IC9kZXYvbnVsbDsgdGhlbgotCQlsaWJmZmlfY3Zfcm9fZWhfZnJhbWU9eWVzCi0JICAgIGVsaWYgZ3JlcCAnLnNlY3Rpb24uKmVoX2ZyYW1lLiojYWxsb2MnIGNvbmZ0ZXN0LmMgXAotCQkgfCBncmVwIC12ICcjd3JpdGUnID4gL2Rldi9udWxsOyB0aGVuCi0JCWxpYmZmaV9jdl9yb19laF9mcmFtZT15ZXMKLQkgICAgZmkKK2lmIHRlc3QgeCRUQVJHRVQgPSB4WDg2XzY0OyB0aGVuCisgICAgQUNfQ0FDSEVfQ0hFQ0soW2Fzc2VtYmxlciBzdXBwb3J0cyB1bndpbmQgc2VjdGlvbiB0eXBlXSwKKwlsaWJmZmlfY3ZfYXNfeDg2XzY0X3Vud2luZF9zZWN0aW9uX3R5cGUsIFsKKwlsaWJmZmlfY3ZfYXNfeDg2XzY0X3Vud2luZF9zZWN0aW9uX3R5cGU9eWVzCisJZWNobyAnLnNlY3Rpb24gLmVoX2ZyYW1lLCJhIixAdW53aW5kJyA+IGNvbmZ0ZXN0LnMKKwlpZiAkQ0MgJENGTEFHUyAtYyBjb25mdGVzdC5zIDI+JjEgfCBncmVwIC1pIHdhcm5pbmcgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgbGliZmZpX2N2X2FzX3g4Nl82NF91bndpbmRfc2VjdGlvbl90eXBlPW5vCiAJZmkKLQlybSAtZiBjb25mdGVzdC4qCi0gICAgXSkKLWlmIHRlc3QgIngkbGliZmZpX2N2X3JvX2VoX2ZyYW1lIiA9IHh5ZXM7IHRoZW4KLSAgICBBQ19ERUZJTkUoSEFWRV9ST19FSF9GUkFNRSwgMSwKLQkgICAgICBbRGVmaW5lIGlmIC5laF9mcmFtZSBzZWN0aW9ucyBzaG91bGQgYmUgcmVhZC1vbmx5Ll0pCi0gICAgQUNfREVGSU5FKEVIX0ZSQU1FX0ZMQUdTLCAiYSIsCi0JICAgICAgW0RlZmluZSB0byB0aGUgZmxhZ3MgbmVlZGVkIGZvciB0aGUgLnNlY3Rpb24gLmVoX2ZyYW1lIGRpcmVjdGl2ZS5dKQotZWxzZQotICAgIEFDX0RFRklORShFSF9GUkFNRV9GTEFHUywgImF3IiwKLQkgICAgICBbRGVmaW5lIHRvIHRoZSBmbGFncyBuZWVkZWQgZm9yIHRoZSAuc2VjdGlvbiAuZWhfZnJhbWUgZGlyZWN0aXZlLl0pCisJXSkKKyAgICBpZiB0ZXN0ICJ4JGxpYmZmaV9jdl9hc194ODZfNjRfdW53aW5kX3NlY3Rpb25fdHlwZSIgPSB4eWVzOyB0aGVuCisJQUNfREVGSU5FKEhBVkVfQVNfWDg2XzY0X1VOV0lORF9TRUNUSU9OX1RZUEUsIDEsCisJCSAgW0RlZmluZSBpZiB5b3VyIGFzc2VtYmxlciBzdXBwb3J0cyB1bndpbmQgc2VjdGlvbiB0eXBlLl0pCisgICAgZmkKIGZpCiAKLUFDX0NBQ0hFX0NIRUNLKFtmb3IgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiaGlkZGVuIikpKV0sCi0gICAgbGliZmZpX2N2X2hpZGRlbl92aXNpYmlsaXR5X2F0dHJpYnV0ZSwgWwotCWVjaG8gJ2ludCBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImhpZGRlbiIpKSkgZm9vICh2b2lkKSB7IHJldHVybiAxOyB9JyA+IGNvbmZ0ZXN0LmMKLQlsaWJmZmlfY3ZfaGlkZGVuX3Zpc2liaWxpdHlfYXR0cmlidXRlPW5vCi0JaWYgQUNfVFJZX0NPTU1BTkQoJHtDQy1jY30gLVdlcnJvciAtUyBjb25mdGVzdC5jIC1vIGNvbmZ0ZXN0LnMgMT4mQVNfTUVTU0FHRV9MT0dfRkQpOyB0aGVuCi0JICAgIGlmIGdyZXAgJ1wuaGlkZGVuLipmb28nIGNvbmZ0ZXN0LnMgPi9kZXYvbnVsbDsgdGhlbgotCQlsaWJmZmlfY3ZfaGlkZGVuX3Zpc2liaWxpdHlfYXR0cmlidXRlPXllcwotCSAgICBmaQotCWZpCi0Jcm0gLWYgY29uZnRlc3QuKgotICAgIF0pCi1pZiB0ZXN0ICRsaWJmZmlfY3ZfaGlkZGVuX3Zpc2liaWxpdHlfYXR0cmlidXRlID0geWVzOyB0aGVuCi0gICAgQUNfREVGSU5FKEhBVkVfSElEREVOX1ZJU0lCSUxJVFlfQVRUUklCVVRFLCAxLAotCSAgICAgIFtEZWZpbmUgaWYgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiaGlkZGVuIikpKSBpcyBzdXBwb3J0ZWQuXSkKK2lmIHRlc3QgIngkR0NDIiA9ICJ4eWVzIjsgdGhlbgorICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciAuZWhfZnJhbWUgc2VjdGlvbiBzaG91bGQgYmUgcmVhZC1vbmx5XSwKKyAgICAgIGxpYmZmaV9jdl9yb19laF9mcmFtZSwgWworICAJbGliZmZpX2N2X3JvX2VoX2ZyYW1lPW5vCisgIAllY2hvICdleHRlcm4gdm9pZCBmb28gKHZvaWQpOyB2b2lkIGJhciAodm9pZCkgeyBmb28gKCk7IGZvbyAoKTsgfScgPiBjb25mdGVzdC5jCisgIAlpZiAkQ0MgJENGTEFHUyAtYyAtZnBpYyAtZmV4Y2VwdGlvbnMgLW8gY29uZnRlc3QubyBjb25mdGVzdC5jID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgb2JqZHVtcCAtaCBjb25mdGVzdC5vID4gY29uZnRlc3QuZHVtcCAyPiYxCisJICAgIGxpYmZmaV9laF9mcmFtZV9saW5lPWBncmVwIC1uIGVoX2ZyYW1lIGNvbmZ0ZXN0LmR1bXAgfCBjdXQgLWQ6IC1mIDFgCisJICAgIGxpYmZmaV90ZXN0X2xpbmU9YGV4cHIgJGxpYmZmaV9laF9mcmFtZV9saW5lICsgMWBwCisJICAgIHNlZCAtbiAkbGliZmZpX3Rlc3RfbGluZSBjb25mdGVzdC5kdW1wID4gY29uZnRlc3QubGluZQorICAJICAgIGlmIGdyZXAgUkVBRE9OTFkgY29uZnRlc3QubGluZSA+IC9kZXYvbnVsbDsgdGhlbgorICAJCWxpYmZmaV9jdl9yb19laF9mcmFtZT15ZXMKKyAgCSAgICBmaQorICAJZmkKKyAgCXJtIC1mIGNvbmZ0ZXN0LioKKyAgICAgIF0pCisgIGlmIHRlc3QgIngkbGliZmZpX2N2X3JvX2VoX2ZyYW1lIiA9IHh5ZXM7IHRoZW4KKyAgICAgIEFDX0RFRklORShIQVZFX1JPX0VIX0ZSQU1FLCAxLAorICAJICAgICAgW0RlZmluZSBpZiAuZWhfZnJhbWUgc2VjdGlvbnMgc2hvdWxkIGJlIHJlYWQtb25seS5dKQorICAgICAgQUNfREVGSU5FKEVIX0ZSQU1FX0ZMQUdTLCAiYSIsCisgIAkgICAgICBbRGVmaW5lIHRvIHRoZSBmbGFncyBuZWVkZWQgZm9yIHRoZSAuc2VjdGlvbiAuZWhfZnJhbWUgZGlyZWN0aXZlLiAgXSkKKyAgZWxzZQorICAgICAgQUNfREVGSU5FKEVIX0ZSQU1FX0ZMQUdTLCAiYXciLAorICAJICAgICAgW0RlZmluZSB0byB0aGUgZmxhZ3MgbmVlZGVkIGZvciB0aGUgLnNlY3Rpb24gLmVoX2ZyYW1lIGRpcmVjdGl2ZS4gIF0pCisgIGZpCisKKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpXSwKKyAgICAgIGxpYmZmaV9jdl9oaWRkZW5fdmlzaWJpbGl0eV9hdHRyaWJ1dGUsIFsKKyAgCWVjaG8gJ2ludCBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImhpZGRlbiIpKSkgZm9vICh2b2lkKSB7IHJldHVybiAxICA7IH0nID4gY29uZnRlc3QuYworICAJbGliZmZpX2N2X2hpZGRlbl92aXNpYmlsaXR5X2F0dHJpYnV0ZT1ubworICAJaWYgQUNfVFJZX0NPTU1BTkQoJHtDQy1jY30gLVdlcnJvciAtUyBjb25mdGVzdC5jIC1vIGNvbmZ0ZXN0LnMgMT4mQVNfTUVTU0FHRV9MT0dfRkQpOyB0aGVuCisgIAkgICAgaWYgZ3JlcCAnXC5oaWRkZW4uKmZvbycgY29uZnRlc3QucyA+L2Rldi9udWxsOyB0aGVuCisgIAkJbGliZmZpX2N2X2hpZGRlbl92aXNpYmlsaXR5X2F0dHJpYnV0ZT15ZXMKKyAgCSAgICBmaQorICAJZmkKKyAgCXJtIC1mIGNvbmZ0ZXN0LioKKyAgICAgIF0pCisgIGlmIHRlc3QgJGxpYmZmaV9jdl9oaWRkZW5fdmlzaWJpbGl0eV9hdHRyaWJ1dGUgPSB5ZXM7IHRoZW4KKyAgICAgIEFDX0RFRklORShIQVZFX0hJRERFTl9WSVNJQklMSVRZX0FUVFJJQlVURSwgMSwKKyAgCSAgICAgIFtEZWZpbmUgaWYgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiaGlkZGVuIikpKSBpcyBzdXBwb3J0ZWQuXSkKKyAgZmkKIGZpCiAKIEFIX0JPVFRPTShbCkBAIC0zNjAsMTIgKzUyMSwxNCBAQAogICBpZiB0ZXN0ICIkZW5hYmxlX2RlYnVnIiA9ICJ5ZXMiOyB0aGVuCiAgICAgQUNfREVGSU5FKEZGSV9ERUJVRywgMSwgW0RlZmluZSB0aGlzIGlmIHlvdSB3YW50IGV4dHJhIGRlYnVnZ2luZy5dKQogICBmaSkKK0FNX0NPTkRJVElPTkFMKEZGSV9ERUJVRywgdGVzdCAiJGVuYWJsZV9kZWJ1ZyIgPSAieWVzIikKIAogQUNfQVJHX0VOQUJMRShzdHJ1Y3RzLAogWyAgLS1kaXNhYmxlLXN0cnVjdHMgICAgICAgb21pdCBjb2RlIGZvciBzdHJ1Y3Qgc3VwcG9ydF0sCiAgIGlmIHRlc3QgIiRlbmFibGVfc3RydWN0cyIgPSAibm8iOyB0aGVuCiAgICAgQUNfREVGSU5FKEZGSV9OT19TVFJVQ1RTLCAxLCBbRGVmaW5lIHRoaXMgaXMgeW91IGRvIG5vdCB3YW50IHN1cHBvcnQgZm9yIGFnZ3JlZ2F0ZSB0eXBlcy5dKQogICBmaSkKK0FNX0NPTkRJVElPTkFMKEZGSV9ERUJVRywgdGVzdCAiJGVuYWJsZV9kZWJ1ZyIgPSAieWVzIikKIAogQUNfQVJHX0VOQUJMRShyYXctYXBpLAogWyAgLS1kaXNhYmxlLXJhdy1hcGkgICAgICAgbWFrZSB0aGUgcmF3IGFwaSB1bmF2YWlsYWJsZV0sCkBAIC0zNzksMjggKzU0MiwyOCBAQAogICAgIEFDX0RFRklORShVU0lOR19QVVJJRlksIDEsIFtEZWZpbmUgdGhpcyBpZiB5b3UgYXJlIHVzaW5nIFB1cmlmeSBhbmQgd2FudCB0byBzdXBwcmVzcyBzcHVyaW91cyBtZXNzYWdlcy5dKQogICBmaSkKIAotaWYgdGVzdCAtbiAiJHdpdGhfY3Jvc3NfaG9zdCIgJiYKLSAgIHRlc3QgeCIkd2l0aF9jcm9zc19ob3N0IiAhPSB4Im5vIjsgdGhlbgotICB0b29sZXhlY2Rpcj0nJChleGVjX3ByZWZpeCkvJCh0YXJnZXRfYWxpYXMpJwotICB0b29sZXhlY2xpYmRpcj0nJCh0b29sZXhlY2RpcikvbGliJworIyBUaGVzZSB2YXJpYWJsZXMgYXJlIG9ubHkgZXZlciB1c2VkIHdoZW4gd2UgY3Jvc3MtYnVpbGQgdG8gWDg2X1dJTjMyLgorIyBBbmQgd2Ugb25seSBzdXBwb3J0IHRoaXMgd2l0aCBHQ0MsIHNvLi4uCitpZiB0ZXN0ICJ4JEdDQyIgPSAieHllcyI7IHRoZW4KKyAgaWYgdGVzdCAtbiAiJHdpdGhfY3Jvc3NfaG9zdCIgJiYKKyAgICAgdGVzdCB4IiR3aXRoX2Nyb3NzX2hvc3QiICE9IHgibm8iOyB0aGVuCisgICAgdG9vbGV4ZWNkaXI9JyQoZXhlY19wcmVmaXgpLyQodGFyZ2V0X2FsaWFzKScKKyAgICB0b29sZXhlY2xpYmRpcj0nJCh0b29sZXhlY2RpcikvbGliJworICBlbHNlCisgICAgdG9vbGV4ZWNkaXI9JyQobGliZGlyKS9nY2MtbGliLyQodGFyZ2V0X2FsaWFzKScKKyAgICB0b29sZXhlY2xpYmRpcj0nJChsaWJkaXIpJworICBmaQorICBtdWx0aV9vc19kaXJlY3Rvcnk9YCRDQyAtcHJpbnQtbXVsdGktb3MtZGlyZWN0b3J5YAorICBjYXNlICRtdWx0aV9vc19kaXJlY3RvcnkgaW4KKyAgICAuKSA7OyAjIEF2b2lkIHRyYWlsaW5nIC8uCisgICAgLi4vKikgdG9vbGV4ZWNsaWJkaXI9JHRvb2xleGVjbGliZGlyLyRtdWx0aV9vc19kaXJlY3RvcnkgOzsKKyAgZXNhYworICBBQ19TVUJTVCh0b29sZXhlY2RpcikKIGVsc2UKLSAgdG9vbGV4ZWNkaXI9JyQobGliZGlyKS9nY2MtbGliLyQodGFyZ2V0X2FsaWFzKScKICAgdG9vbGV4ZWNsaWJkaXI9JyQobGliZGlyKScKIGZpCi1tdWx0aV9vc19kaXJlY3Rvcnk9YCRDQyAtcHJpbnQtbXVsdGktb3MtZGlyZWN0b3J5YAotY2FzZSAkbXVsdGlfb3NfZGlyZWN0b3J5IGluCi0gIC4pIDs7ICMgQXZvaWQgdHJhaWxpbmcgLy4KLSAgKikgdG9vbGV4ZWNsaWJkaXI9JHRvb2xleGVjbGliZGlyLyRtdWx0aV9vc19kaXJlY3RvcnkgOzsKLWVzYWMKLUFDX1NVQlNUKHRvb2xleGVjZGlyKQogQUNfU1VCU1QodG9vbGV4ZWNsaWJkaXIpCiAKLWlmIHRlc3QgIiR7bXVsdGlsaWJ9IiA9ICJ5ZXMiOyB0aGVuCi0gIG11bHRpbGliX2FyZz0iLS1lbmFibGUtbXVsdGlsaWIiCi1lbHNlCi0gIG11bHRpbGliX2FyZz0KLWZpCi0KIEFDX0NPTkZJR19DT01NQU5EUyhpbmNsdWRlLCBbdGVzdCAtZCBpbmNsdWRlIHx8IG1rZGlyIGluY2x1ZGVdKQogQUNfQ09ORklHX0NPTU1BTkRTKHNyYywgWwogdGVzdCAtZCBzcmMgfHwgbWtkaXIgc3JjCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2RlcGNvbXAgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2RlcGNvbXAKaW5kZXggY2E1ZWE0ZS4uZGY4ZWVhNyAxMDA3NTUKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9kZXBjb21wCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvZGVwY29tcApAQCAtMSwxMCArMSwxMCBAQAogIyEgL2Jpbi9zaAogIyBkZXBjb21wIC0gY29tcGlsZSBhIHByb2dyYW0gZ2VuZXJhdGluZyBkZXBlbmRlbmNpZXMgYXMgc2lkZS1lZmZlY3RzCiAKLXNjcmlwdHZlcnNpb249MjAwNi0xMC0xNS4xOAorc2NyaXB0dmVyc2lvbj0yMDA5LTA0LTI4LjIxOyAjIFVUQwogCi0jIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4KKyMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA5IEZyZWUKKyMgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogCiAjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0xNyw5ICsxNyw3IEBACiAjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAKICMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotIyAwMjExMC0xMzAxLCBVU0EuCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogCiAjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKICMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCkBAIC04Nyw2ICs4NSwxNSBAQAogICAgZGVwbW9kZT1kYXNobXN0ZG91dAogZmkKIAorY3lncGF0aF91PSJjeWdwYXRoIC11IC1mIC0iCitpZiB0ZXN0ICIkZGVwbW9kZSIgPSBtc3ZjbXN5czsgdGhlbgorICAgIyBUaGlzIGlzIGp1c3QgbGlrZSBtc3Zpc3VhbGNwcCBidXQgdy9vIGN5Z3BhdGggdHJhbnNsYXRpb24uCisgICAjIEp1c3QgY29udmVydCB0aGUgYmFja3NsYXNoLWVzY2FwZWQgYmFja3NsYXNoZXMgdG8gc2luZ2xlIGZvcndhcmQKKyAgICMgc2xhc2hlcyB0byBzYXRpc2Z5IGRlcGVuZC5tNAorICAgY3lncGF0aF91PSJzZWQgcyxcXFxcXFxcXCwvLGciCisgICBkZXBtb2RlPW1zdmlzdWFsY3BwCitmaQorCiBjYXNlICIkZGVwbW9kZSIgaW4KIGdjYzMpCiAjIyBnY2MgMyBpbXBsZW1lbnRzIGRlcGVuZGVuY3kgdHJhY2tpbmcgdGhhdCBkb2VzIGV4YWN0bHkgd2hhdApAQCAtMTkyLDE0ICsxOTksMTQgQEAKICcgPCAiJHRtcGRlcGZpbGUiIFwKICAgICB8IHNlZCAtZSAncy9eLipcLm86Ly8nIC1lICdzLyMuKiQvLycgLWUgJy9eJC8gZCcgfCBcCiAgICAgdHIgJwotJyAnICcgPj4gJGRlcGZpbGUKLSAgICBlY2hvID4+ICRkZXBmaWxlCisnICcgJyA+PiAiJGRlcGZpbGUiCisgICAgZWNobyA+PiAiJGRlcGZpbGUiCiAKICAgICAjIFRoZSBzZWNvbmQgcGFzcyBnZW5lcmF0ZXMgYSBkdW1teSBlbnRyeSBmb3IgZWFjaCBoZWFkZXIgZmlsZS4KICAgICB0ciAnICcgJwogJyA8ICIkdG1wZGVwZmlsZSIgXAogICAgfCBzZWQgLWUgJ3MvXi4qXC5vOi8vJyAtZSAncy8jLiokLy8nIC1lICcvXiQvIGQnIC1lICdzLyQvOi8nIFwKLSAgID4+ICRkZXBmaWxlCisgICA+PiAiJGRlcGZpbGUiCiAgIGVsc2UKICAgICAjIFRoZSBzb3VyY2VmaWxlIGRvZXMgbm90IGNvbnRhaW4gYW55IGRlcGVuZGVuY2llcywgc28ganVzdAogICAgICMgc3RvcmUgYSBkdW1teSBjb21tZW50IGxpbmUsIHRvIGF2b2lkIGVycm9ycyB3aXRoIHRoZSBNYWtlZmlsZQpAQCAtMjE1LDM0ICsyMjIsMzkgQEAKICAgIyBjdXJyZW50IGRpcmVjdG9yeS4gIEFsc28sIHRoZSBBSVggY29tcGlsZXIgcHV0cyBgJG9iamVjdDonIGF0IHRoZQogICAjIHN0YXJ0IG9mIGVhY2ggbGluZTsgJG9iamVjdCBkb2Vzbid0IGhhdmUgZGlyZWN0b3J5IGluZm9ybWF0aW9uLgogICAjIFZlcnNpb24gNiB1c2VzIHRoZSBkaXJlY3RvcnkgaW4gYm90aCBjYXNlcy4KLSAgc3RyaXBwZWQ9YGVjaG8gIiRvYmplY3QiIHwgc2VkICdzL1woLipcKVwuLiokL1wxLydgCi0gIHRtcGRlcGZpbGU9IiRzdHJpcHBlZC51IgorICBkaXI9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfC9bXi9dKiR8L3wnYAorICB0ZXN0ICJ4JGRpciIgPSAieCRvYmplY3QiICYmIGRpcj0KKyAgYmFzZT1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8Xi4qL3x8JyAtZSAncy9cLm8kLy8nIC1lICdzL1wubG8kLy8nYAogICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2UudQorICAgIHRtcGRlcGZpbGUyPSRiYXNlLnUKKyAgICB0bXBkZXBmaWxlMz0kZGlyLmxpYnMvJGJhc2UudQogICAgICIkQCIgLVdjLC1NCiAgIGVsc2UKKyAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2UudQorICAgIHRtcGRlcGZpbGUyPSRkaXIkYmFzZS51CisgICAgdG1wZGVwZmlsZTM9JGRpciRiYXNlLnUKICAgICAiJEAiIC1NCiAgIGZpCiAgIHN0YXQ9JD8KIAotICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4gOgotICBlbHNlCi0gICAgc3RyaXBwZWQ9YGVjaG8gIiRzdHJpcHBlZCIgfCBzZWQgJ3MsXi4qLywsJ2AKLSAgICB0bXBkZXBmaWxlPSIkc3RyaXBwZWQudSIKLSAgZmkKLQogICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKICAgZWxzZQotICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUxIiAiJHRtcGRlcGZpbGUyIiAiJHRtcGRlcGZpbGUzIgogICAgIGV4aXQgJHN0YXQKICAgZmkKIAorICBmb3IgdG1wZGVwZmlsZSBpbiAiJHRtcGRlcGZpbGUxIiAiJHRtcGRlcGZpbGUyIiAiJHRtcGRlcGZpbGUzIgorICBkbworICAgIHRlc3QgLWYgIiR0bXBkZXBmaWxlIiAmJiBicmVhaworICBkb25lCiAgIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbgotICAgIG91dG5hbWU9IiRzdHJpcHBlZC5vIgogICAgICMgRWFjaCBsaW5lIGlzIG9mIHRoZSBmb3JtIGBmb28ubzogZGVwZW5kZW50LmgnLgogICAgICMgRG8gdHdvIHBhc3Nlcywgb25lIHRvIGp1c3QgY2hhbmdlIHRoZXNlIHRvCiAgICAgIyBgJG9iamVjdDogZGVwZW5kZW50LmgnIGFuZCBvbmUgdG8gc2ltcGx5IGBkZXBlbmRlbnQuaDonLgotICAgIHNlZCAtZSAicyxeJG91dG5hbWU6LCRvYmplY3QgOiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKLSAgICBzZWQgLWUgInMsXiRvdXRuYW1lOiBcKC4qXCkkLFwxOiwiIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgICAgc2VkIC1lICJzLF4uKlwuW2Etel0qOiwkb2JqZWN0OiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgICAjIFRoYXQncyBhIHRhYiBhbmQgYSBzcGFjZSBpbiB0aGUgW10uCisgICAgc2VkIC1lICdzLF4uKlwuW2Etel0qOlsJIF0qLCwnIC1lICdzLCQsOiwnIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCiAgIGVsc2UKICAgICAjIFRoZSBzb3VyY2VmaWxlIGRvZXMgbm90IGNvbnRhaW4gYW55IGRlcGVuZGVuY2llcywgc28ganVzdAogICAgICMgc3RvcmUgYSBkdW1teSBjb21tZW50IGxpbmUsIHRvIGF2b2lkIGVycm9ycyB3aXRoIHRoZSBNYWtlZmlsZQpAQCAtMzIzLDcgKzMzNSwxMiBAQAogICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4KICAgICBzZWQgLWUgInMsXi4qXC5bYS16XSo6LCRvYmplY3Q6LCIgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKICAgICAjIEFkZCBgZGVwZW5kZW50Lmg6JyBsaW5lcy4KLSAgICBzZWQgLW5lICcyLCR7OyBzL14gKi8vOyBzLyBcXCokLy87IHMvJC86LzsgcDt9JyAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKKyAgICBzZWQgLW5lICcyLCR7CisJICAgICAgIHMvXiAqLy8KKwkgICAgICAgcy8gXFwqJC8vCisJICAgICAgIHMvJC86LworCSAgICAgICBwCisJICAgICB9JyAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKICAgZWxzZQogICAgIGVjaG8gIiNkdW1teSIgPiAiJGRlcGZpbGUiCiAgIGZpCkBAIC0zOTksNyArNDE2LDcgQEAKIAogICAjIFJlbW92ZSB0aGUgY2FsbCB0byBMaWJ0b29sLgogICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KLSAgICB3aGlsZSB0ZXN0ICQxICE9ICctLW1vZGU9Y29tcGlsZSc7IGRvCisgICAgd2hpbGUgdGVzdCAiWCQxIiAhPSAnWC0tbW9kZT1jb21waWxlJzsgZG8KICAgICAgIHNoaWZ0CiAgICAgZG9uZQogICAgIHNoaWZ0CkBAIC00NTAsMzIgKzQ2NywzOSBAQAogICAiJEAiIHx8IGV4aXQgJD8KICAgIyBSZW1vdmUgYW55IExpYnRvb2wgY2FsbAogICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KLSAgICB3aGlsZSB0ZXN0ICQxICE9ICctLW1vZGU9Y29tcGlsZSc7IGRvCisgICAgd2hpbGUgdGVzdCAiWCQxIiAhPSAnWC0tbW9kZT1jb21waWxlJzsgZG8KICAgICAgIHNoaWZ0CiAgICAgZG9uZQogICAgIHNoaWZ0CiAgIGZpCiAgICMgWCBtYWtlZGVwZW5kCiAgIHNoaWZ0Ci0gIGNsZWFyZWQ9bm8KLSAgZm9yIGFyZyBpbiAiJEAiOyBkbworICBjbGVhcmVkPW5vIGVhdD1ubworICBmb3IgYXJnCisgIGRvCiAgICAgY2FzZSAkY2xlYXJlZCBpbgogICAgIG5vKQogICAgICAgc2V0ICIiOyBzaGlmdAogICAgICAgY2xlYXJlZD15ZXMgOzsKICAgICBlc2FjCisgICAgaWYgdGVzdCAkZWF0ID0geWVzOyB0aGVuCisgICAgICBlYXQ9bm8KKyAgICAgIGNvbnRpbnVlCisgICAgZmkKICAgICBjYXNlICIkYXJnIiBpbgogICAgIC1EKnwtSSopCiAgICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyI7IHNoaWZ0IDs7CiAgICAgIyBTdHJpcCBhbnkgb3B0aW9uIHRoYXQgbWFrZWRlcGVuZCBtYXkgbm90IHVuZGVyc3RhbmQuICBSZW1vdmUKICAgICAjIHRoZSBvYmplY3QgdG9vLCBvdGhlcndpc2UgbWFrZWRlcGVuZCB3aWxsIHBhcnNlIGl0IGFzIGEgc291cmNlIGZpbGUuCisgICAgLWFyY2gpCisgICAgICBlYXQ9eWVzIDs7CiAgICAgLSp8JG9iamVjdCkKICAgICAgIDs7CiAgICAgKikKICAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIjsgc2hpZnQgOzsKICAgICBlc2FjCiAgIGRvbmUKLSAgb2JqX3N1ZmZpeD0iYGVjaG8gJG9iamVjdCB8IHNlZCAncy9eLipcLi8uLydgIgorICBvYmpfc3VmZml4PWBlY2hvICIkb2JqZWN0IiB8IHNlZCAncy9eLipcLi8uLydgCiAgIHRvdWNoICIkdG1wZGVwZmlsZSIKICAgJHtNQUtFREVQRU5ELW1ha2VkZXBlbmR9IC1vIiRvYmpfc3VmZml4IiAtZiIkdG1wZGVwZmlsZSIgIiRAIgogICBybSAtZiAiJGRlcGZpbGUiCkBAIC00OTUsNyArNTE5LDcgQEAKIAogICAjIFJlbW92ZSB0aGUgY2FsbCB0byBMaWJ0b29sLgogICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KLSAgICB3aGlsZSB0ZXN0ICQxICE9ICctLW1vZGU9Y29tcGlsZSc7IGRvCisgICAgd2hpbGUgdGVzdCAiWCQxIiAhPSAnWC0tbW9kZT1jb21waWxlJzsgZG8KICAgICAgIHNoaWZ0CiAgICAgZG9uZQogICAgIHNoaWZ0CkBAIC01MzMsMTMgKzU1NywyNyBAQAogCiBtc3Zpc3VhbGNwcCkKICAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCi0gICMgYWx3YXlzIHdyaXRlIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQsIHJlZ2FyZGxlc3Mgb2YgLW8sCi0gICMgYmVjYXVzZSB3ZSBtdXN0IHVzZSAtbyB3aGVuIHJ1bm5pbmcgbGlidG9vbC4KKyAgIyBhbHdheXMgd3JpdGUgdGhlIHByZXByb2Nlc3NlZCBmaWxlIHRvIHN0ZG91dC4KICAgIiRAIiB8fCBleGl0ICQ/CisKKyAgIyBSZW1vdmUgdGhlIGNhbGwgdG8gTGlidG9vbC4KKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgd2hpbGUgdGVzdCAiWCQxIiAhPSAnWC0tbW9kZT1jb21waWxlJzsgZG8KKyAgICAgIHNoaWZ0CisgICAgZG9uZQorICAgIHNoaWZ0CisgIGZpCisKICAgSUZTPSIgIgogICBmb3IgYXJnCiAgIGRvCiAgICAgY2FzZSAiJGFyZyIgaW4KKyAgICAtbykKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICRvYmplY3QpCisgICAgICBzaGlmdAorICAgICAgOzsKICAgICAiLUdtInwiL0dtInwiLUdpInwiL0dpInwiLVpJInwiL1pJIikKIAlzZXQgZm5vcmQgIiRAIgogCXNoaWZ0CkBAIC01NTIsMTYgKzU5MCwyMyBAQAogCTs7CiAgICAgZXNhYwogICBkb25lCi0gICIkQCIgLUUgfAotICBzZWQgLW4gJy9eI2xpbmUgWzAtOV1bMC05XSogIlwoW14iXSpcKSIvIHM6OmVjaG8gImBjeWdwYXRoIC11IFxcIlwxXFwiYCI6cCcgfCBzb3J0IHwgdW5pcSA+ICIkdG1wZGVwZmlsZSIKKyAgIiRAIiAtRSAyPi9kZXYvbnVsbCB8CisgIHNlZCAtbiAnL14jbGluZSBbMC05XVswLTldKiAiXChbXiJdKlwpIi8gczo6XDE6cCcgfCAkY3lncGF0aF91IHwgc29ydCAtdSA+ICIkdG1wZGVwZmlsZSIKICAgcm0gLWYgIiRkZXBmaWxlIgogICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgotICAuICIkdG1wZGVwZmlsZSIgfCBzZWQgJ3MlICVcXCAlZycgfCBzZWQgLW4gJy9eXCguKlwpJC8gczo6CVwxIFxcOnAnID4+ICIkZGVwZmlsZSIKKyAgc2VkIDwgIiR0bXBkZXBmaWxlIiAtbiAtZSAncyUgJVxcICVnJyAtZSAnL15cKC4qXCkkLyBzOjoJXDEgXFw6cCcgPj4gIiRkZXBmaWxlIgogICBlY2hvICIJIiA+PiAiJGRlcGZpbGUiCi0gIC4gIiR0bXBkZXBmaWxlIiB8IHNlZCAncyUgJVxcICVnJyB8IHNlZCAtbiAnL15cKC4qXCkkLyBzOjpcMVw6OnAnID4+ICIkZGVwZmlsZSIKKyAgc2VkIDwgIiR0bXBkZXBmaWxlIiAtbiAtZSAncyUgJVxcICVnJyAtZSAnL15cKC4qXCkkLyBzOjpcMVw6OnAnID4+ICIkZGVwZmlsZSIKICAgcm0gLWYgIiR0bXBkZXBmaWxlIgogICA7OwogCittc3ZjbXN5cykKKyAgIyBUaGlzIGNhc2UgZXhpc3RzIG9ubHkgdG8gbGV0IGRlcGVuZC5tNCBkbyBpdHMgd29yay4gIEl0IHdvcmtzIGJ5CisgICMgbG9va2luZyBhdCB0aGUgdGV4dCBvZiB0aGlzIHNjcmlwdC4gIFRoaXMgY2FzZSB3aWxsIG5ldmVyIGJlIHJ1biwKKyAgIyBzaW5jZSBpdCBpcyBjaGVja2VkIGZvciBhYm92ZS4KKyAgZXhpdCAxCisgIDs7CisKIG5vbmUpCiAgIGV4ZWMgIiRAIgogICA7OwpAQCAtNTgwLDUgKzYyNSw2IEBACiAjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKICMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgogIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKLSMgdGltZS1zdGFtcC1lbmQ6ICIkIgorIyB0aW1lLXN0YW1wLXRpbWUtem9uZTogIlVUQyIKKyMgdGltZS1zdGFtcC1lbmQ6ICI7ICMgVVRDIgogIyBFbmQ6CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2RvYy9saWJmZmkuaW5mbyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvZG9jL2xpYmZmaS5pbmZvCmluZGV4IDg5NmE1ZWMuLjZkNWFjZjggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvZG9jL2xpYmZmaS5pbmZvCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvZG9jL2xpYmZmaS5pbmZvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvZG9jL2xpYmZmaS50ZXhpIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9kb2MvbGliZmZpLnRleGkKaW5kZXggOWZhNWIxNy4uNWMwNTUyYiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9kb2MvbGliZmZpLnRleGkKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9kb2MvbGliZmZpLnRleGkKQEAgLTE5LDcgKzE5LDcgQEAKIFRoaXMgbWFudWFsIGlzIGZvciBMaWJmZmksIGEgcG9ydGFibGUgZm9yZWlnbi1mdW5jdGlvbiBpbnRlcmZhY2UKIGxpYnJhcnkuCiAKLUNvcHlyaWdodCBAY29weXJpZ2h0e30gMjAwOCwgMjAxMCBSZWQgSGF0LCBJbmMuCitDb3B5cmlnaHQgQGNvcHlyaWdodHt9IDIwMDgsIDIwMTAsIDIwMTEgUmVkIEhhdCwgSW5jLgogCiBAcXVvdGF0aW9uCiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoaXMgZG9jdW1lbnQKQEAgLTEzMyw4ICsxMzMsNiBAQAogeW91IHdhbnQuICBAcmVme011bHRpcGxlIEFCSXN9IGZvciBtb3JlIGluZm9ybWF0aW9uLgogCiBAdmFye25hcmdzfSBpcyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGF0IHRoaXMgZnVuY3Rpb24gYWNjZXB0cy4KLUBzYW1we2xpYmZmaX0gZG9lcyBub3QgeWV0IGhhbmRsZSB2YXJhcmdzIGZ1bmN0aW9uczsgc2VlIEByZWZ7TWlzc2luZwotRmVhdHVyZXN9IGZvciBtb3JlIGluZm9ybWF0aW9uLgogCiBAdmFye3J0eXBlfSBpcyBhIHBvaW50ZXIgdG8gYW4gQGNvZGV7ZmZpX3R5cGV9IHN0cnVjdHVyZSB0aGF0CiBkZXNjcmliZXMgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBmdW5jdGlvbi4gIEB4cmVme1R5cGVzfS4KQEAgLTE1MCw2ICsxNDgsMzAgQEAKIGlzIGludmFsaWQuCiBAZW5kIGRlZnVuCiAKK0lmIHRoZSBmdW5jdGlvbiBiZWluZyBjYWxsZWQgaXMgdmFyaWFkaWMgKHZhcmFyZ3MpIHRoZW4KK0Bjb2Rle2ZmaV9wcmVwX2NpZl92YXJ9IG11c3QgYmUgdXNlZCBpbnN0ZWFkIG9mIEBjb2Rle2ZmaV9wcmVwX2NpZn0uCisKK0BmaW5kZXggZmZpX3ByZXBfY2lmX3ZhcgorQGRlZnVuIGZmaV9zdGF0dXMgZmZpX3ByZXBfY2lmX3ZhciAoZmZpX2NpZiAqQHZhcntjaWZ9LCBmZmlfYWJpIHZhcnthYml9LCB1bnNpZ25lZCBpbnQgQHZhcntuZml4ZWRhcmdzfSwgdW5zaWduZWQgaW50IHZhcntudG90YWxhcmdzfSwgZmZpX3R5cGUgKkB2YXJ7cnR5cGV9LCBmZmlfdHlwZSAqKkB2YXJ7YXJndHlwZXN9KQorVGhpcyBpbml0aWFsaXplcyBAdmFye2NpZn0gYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBwYXJhbWV0ZXJzIGZvcgorYSBjYWxsIHRvIGEgdmFyaWFkaWMgZnVuY3Rpb24uICBJbiBnZW5lcmFsIGl0J3Mgb3BlcmF0aW9uIGlzIHRoZQorc2FtZSBhcyBmb3IgQGNvZGV7ZmZpX3ByZXBfY2lmfSBleGNlcHQgdGhhdDoKKworQHZhcntuZml4ZWRhcmdzfSBpcyB0aGUgbnVtYmVyIG9mIGZpeGVkIGFyZ3VtZW50cywgcHJpb3IgdG8gYW55Cit2YXJpYWRpYyBhcmd1bWVudHMuICBJdCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLgorCitAdmFye250b3RhbGFyZ3N9IHRoZSB0b3RhbCBudW1iZXIgb2YgYXJndW1lbnRzLCBpbmNsdWRpbmcgdmFyaWFkaWMKK2FuZCBmaXhlZCBhcmd1bWVudHMuCisKK05vdGUgdGhhdCwgZGlmZmVyZW50IGNpZidzIG11c3QgYmUgcHJlcHBlZCBmb3IgY2FsbHMgdG8gdGhlIHNhbWUKK2Z1bmN0aW9uIHdoZW4gZGlmZmVyZW50IG51bWJlcnMgb2YgYXJndW1lbnRzIGFyZSBwYXNzZWQuCisKK0Fsc28gbm90ZSB0aGF0IGEgY2FsbCB0byBAY29kZXtmZmlfcHJlcF9jaWZfdmFyfSB3aXRoCitAdmFye25maXhlZGFyZ3N9PUB2YXJ7bm90b3RhbGFyZ3N9IGlzIE5PVCBlcXVpdmFsZW50IHRvIGEgY2FsbCB0bworQGNvZGV7ZmZpX3ByZXBfY2lmfS4KKworQGVuZCBkZWZ1bgorCiAKIFRvIGNhbGwgYSBmdW5jdGlvbiB1c2luZyBhbiBpbml0aWFsaXplZCBAY29kZXtmZmlfY2lmfSwgdXNlIHRoZQogQGNvZGV7ZmZpX2NhbGx9IGZ1bmN0aW9uOgpAQCAtMTcxLDcgKzE5Myw5IEBACiBAdmFye2F2YWx1ZXN9IGlzIGEgdmVjdG9yIG9mIEBjb2Rle3ZvaWQgKn0gcG9pbnRlcnMgdGhhdCBwb2ludCB0byB0aGUKIG1lbW9yeSBsb2NhdGlvbnMgaG9sZGluZyB0aGUgYXJndW1lbnQgdmFsdWVzIGZvciBhIGNhbGwuICBJZiBAdmFye2NpZn0KIGRlY2xhcmVzIHRoYXQgdGhlIGZ1bmN0aW9uIGhhcyBubyBhcmd1bWVudHMgKGkuZS4sIEB2YXJ7bmFyZ3N9IHdhcyAwKSwKLXRoZW4gQHZhcnthdmFsdWVzfSBpcyBpZ25vcmVkLgordGhlbiBAdmFye2F2YWx1ZXN9IGlzIGlnbm9yZWQuICBOb3RlIHRoYXQgYXJndW1lbnQgdmFsdWVzIG1heSBiZQorbW9kaWZpZWQgYnkgdGhlIGNhbGxlZSAoZm9yIGluc3RhbmNlLCBzdHJ1Y3RzIHBhc3NlZCBieSB2YWx1ZSk7IHRoZQorYnVyZGVuIG9mIGNvcHlpbmcgcGFzcy1ieS12YWx1ZSBhcmd1bWVudHMgaXMgcGxhY2VkIG9uIHRoZSBjYWxsZXIuCiBAZW5kIGRlZnVuCiAKIApAQCAtMzM2LDcgKzM2MCw3IEBACiBuZXcgQGNvZGV7ZmZpX3R5cGV9IG9iamVjdCBmb3IgaXQuCiAKIEB0aW5kZXggZmZpX3R5cGUKLUBkZWZ0cCBmZmlfdHlwZQorQGRlZnRwIHtEYXRhIHR5cGV9IGZmaV90eXBlCiBUaGUgQGNvZGV7ZmZpX3R5cGV9IGhhcyB0aGUgZm9sbG93aW5nIG1lbWJlcnM6CiBAdGFibGUgQGNvZGUKIEBpdGVtIHNpemVfdCBzaXplCkBAIC00MzgsNyArNDYyLDcgQEAKIGhlYXAuICBNZW1vcnkgbWFuYWdlbWVudCBmb3IgY2xvc3VyZXMgaXMgaGFuZGxlZCBieSBhIHBhaXIgb2YKIGZ1bmN0aW9uczoKIAotQGZpbmRleCBmZmlfY2xvc3VyZV9hbGxvY2EKK0BmaW5kZXggZmZpX2Nsb3N1cmVfYWxsb2MKIEBkZWZ1biB2b2lkICpmZmlfY2xvc3VyZV9hbGxvYyAoc2l6ZV90IEB2YXJ7c2l6ZX0sIHZvaWQgKipAdmFye2NvZGV9KQogQWxsb2NhdGUgYSBjaHVuayBvZiBtZW1vcnkgaG9sZGluZyBAdmFye3NpemV9IGJ5dGVzLiAgVGhpcyByZXR1cm5zIGEKIHBvaW50ZXIgdG8gdGhlIHdyaXRhYmxlIGFkZHJlc3MsIGFuZCBzZXRzICpAdmFye2NvZGV9IHRvIHRoZQpAQCAtNTcwLDkgKzU5NCw3IEBACiAKIEBpdGVtaXplIEBidWxsZXQKIEBpdGVtCi1UaGVyZSBpcyBubyBzdXBwb3J0IGZvciBjYWxsaW5nIHZhcmFyZ3MgZnVuY3Rpb25zLiAgVGhpcyBtYXkgd29yayBvbgotc29tZSBwbGF0Zm9ybXMsIGRlcGVuZGluZyBvbiBob3cgdGhlIEFCSSBpcyBkZWZpbmVkLCBidXQgaXQgaXMgbm90Ci1yZWxpYWJsZS4KK1ZhcmlhZGljIGNsb3N1cmVzLgogCiBAaXRlbQogVGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgYml0IGZpZWxkcyBpbiBzdHJ1Y3R1cmVzLgpAQCAtNTg5LDYgKzYxMSw4IEBACiBAYyBhbnl0aGluZyBlbHNlPwogQGVuZCBpdGVtaXplCiAKK05vdGUgdGhhdCB2YXJpYWRpYyBzdXBwb3J0IGlzIHZlcnkgbmV3IGFuZCB0ZXN0ZWQgb24gYSByZWxhdGl2ZWx5CitzbWFsbCBudW1iZXIgb2YgcGxhdGZvcm1zLgogCiBAbm9kZSBJbmRleAogQHVubnVtYmVyZWQgSW5kZXgKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvZG9jL3N0YW1wLXZ0aSBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvZG9jL3N0YW1wLXZ0aQppbmRleCA4MWQwYjc5Li41NDI1NWJhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2RvYy9zdGFtcC12dGkKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9kb2Mvc3RhbXAtdnRpCkBAIC0xLDQgKzEsNCBAQAotQHNldCBVUERBVEVEIDE0IEZlYnJ1YXJ5IDIwMDgKLUBzZXQgVVBEQVRFRC1NT05USCBGZWJydWFyeSAyMDA4Ci1Ac2V0IEVESVRJT04gMy4wLjgKLUBzZXQgVkVSU0lPTiAzLjAuOAorQHNldCBVUERBVEVEIDE2IE1hcmNoIDIwMTMKK0BzZXQgVVBEQVRFRC1NT05USCBNYXJjaCAyMDEzCitAc2V0IEVESVRJT04gMy4wLjEzCitAc2V0IFZFUlNJT04gMy4wLjEzCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2RvYy92ZXJzaW9uLnRleGkgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2RvYy92ZXJzaW9uLnRleGkKaW5kZXggODFkMGI3OS4uNTQyNTViYSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9kb2MvdmVyc2lvbi50ZXhpCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvZG9jL3ZlcnNpb24udGV4aQpAQCAtMSw0ICsxLDQgQEAKLUBzZXQgVVBEQVRFRCAxNCBGZWJydWFyeSAyMDA4Ci1Ac2V0IFVQREFURUQtTU9OVEggRmVicnVhcnkgMjAwOAotQHNldCBFRElUSU9OIDMuMC44Ci1Ac2V0IFZFUlNJT04gMy4wLjgKK0BzZXQgVVBEQVRFRCAxNiBNYXJjaCAyMDEzCitAc2V0IFVQREFURUQtTU9OVEggTWFyY2ggMjAxMworQHNldCBFRElUSU9OIDMuMC4xMworQHNldCBWRVJTSU9OIDMuMC4xMwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9mZmljb25maWcuaC5pbiBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvZmZpY29uZmlnLmguaW4KaW5kZXggZTAzYmJmOS4uYzc3NTg1ZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9mZmljb25maWcuaC5pbgorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2ZmaWNvbmZpZy5oLmluCkBAIC0xNyw2ICsxNywxMiBAQAogLyogRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgZXh0cmEgZGVidWdnaW5nLiAqLwogI3VuZGVmIEZGSV9ERUJVRwogCisvKiBDYW5ub3QgdXNlIFBST1RfRVhFQyBvbiB0aGlzIHRhcmdldCwgc28sIHdlIHJldmVydCB0byBhbHRlcm5hdGl2ZSBtZWFucyAqLworI3VuZGVmIEZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEUKKworLyogRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgdG8gZW5hYmxlIHBheCBlbXVsYXRlZCB0cmFtcG9saW5lcyAqLworI3VuZGVmIEZGSV9NTUFQX0VYRUNfRU1VVFJBTVBfUEFYCisKIC8qIENhbm5vdCB1c2UgbWFsbG9jIG9uIHRoaXMgdGFyZ2V0LCBzbywgd2UgcmV2ZXJ0IHRvIGFsdGVybmF0aXZlIG1lYW5zICovCiAjdW5kZWYgRkZJX01NQVBfRVhFQ19XUklUCiAKQEAgLTMzLDYgKzM5LDkgQEAKICAgICovCiAjdW5kZWYgSEFWRV9BTExPQ0FfSAogCisvKiBEZWZpbmUgaWYgeW91ciBhc3NlbWJsZXIgc3VwcG9ydHMgLmFzY2lpLiAqLworI3VuZGVmIEhBVkVfQVNfQVNDSUlfUFNFVURPX09QCisKIC8qIERlZmluZSBpZiB5b3VyIGFzc2VtYmxlciBzdXBwb3J0cyAuY2ZpXyogZGlyZWN0aXZlcy4gKi8KICN1bmRlZiBIQVZFX0FTX0NGSV9QU0VVRE9fT1AKIApAQCAtNDMsNiArNTIsMTIgQEAKICAgICovCiAjdW5kZWYgSEFWRV9BU19TUEFSQ19VQV9QQ1JFTAogCisvKiBEZWZpbmUgaWYgeW91ciBhc3NlbWJsZXIgc3VwcG9ydHMgLnN0cmluZy4gKi8KKyN1bmRlZiBIQVZFX0FTX1NUUklOR19QU0VVRE9fT1AKKworLyogRGVmaW5lIGlmIHlvdXIgYXNzZW1ibGVyIHN1cHBvcnRzIHVud2luZCBzZWN0aW9uIHR5cGUuICovCisjdW5kZWYgSEFWRV9BU19YODZfNjRfVU5XSU5EX1NFQ1RJT05fVFlQRQorCiAvKiBEZWZpbmUgaWYgeW91ciBhc3NlbWJsZXIgc3VwcG9ydHMgUEMgcmVsYXRpdmUgcmVsb2NzLiAqLwogI3VuZGVmIEhBVkVfQVNfWDg2X1BDUkVMCiAKQEAgLTE0OCw2ICsxNjMsOSBAQAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCiAjdW5kZWYgU1REQ19IRUFERVJTCiAKKy8qIERlZmluZSBpZiBzeW1ib2xzIGFyZSB1bmRlcnNjb3JlZC4gKi8KKyN1bmRlZiBTWU1CT0xfVU5ERVJTQ09SRQorCiAvKiBEZWZpbmUgdGhpcyBpZiB5b3UgYXJlIHVzaW5nIFB1cmlmeSBhbmQgd2FudCB0byBzdXBwcmVzcyBzcHVyaW91cyBtZXNzYWdlcy4KICAgICovCiAjdW5kZWYgVVNJTkdfUFVSSUZZCkBAIC0xNjcsNiArMTg1LDkgQEAKICMgZW5kaWYKICNlbmRpZgogCisvKiBEZWZpbmUgdG8gYHVuc2lnbmVkIGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2VzIG5vdCBkZWZpbmUuICovCisjdW5kZWYgc2l6ZV90CisKIAogI2lmZGVmIEhBVkVfSElEREVOX1ZJU0lCSUxJVFlfQVRUUklCVVRFCiAjaWZkZWYgTElCRkZJX0FTTQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9mZmljb25maWcucHkuaW4gYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2ZmaWNvbmZpZy5weS5pbgppbmRleCAyN2M5NzFmLi5jOTEwODE0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2ZmaWNvbmZpZy5weS5pbgorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2ZmaWNvbmZpZy5weS5pbgpAQCAtMSw3ICsxLDYgQEAKIGZmaV9zb3VyY2VzID0gIiIiCiBzcmMvcHJlcF9jaWYuYwogc3JjL2Nsb3N1cmVzLmMKLXNyYy9kbG1hbGxvYy5jCiAiIiIuc3BsaXQoKQogCiBmZmlfcGxhdGZvcm1zID0gewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9nZW5lcmF0ZS1pb3Mtc291cmNlLWFuZC1oZWFkZXJzLnB5IGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9nZW5lcmF0ZS1pb3Mtc291cmNlLWFuZC1oZWFkZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMyYmNhNzMKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2dlbmVyYXRlLWlvcy1zb3VyY2UtYW5kLWhlYWRlcnMucHkKQEAgLTAsMCArMSwxNjAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHJlCitpbXBvcnQgb3MKK2ltcG9ydCBlcnJubworaW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgc3lzCisKK2NsYXNzIFBsYXRmb3JtKG9iamVjdCk6CisgICAgcGFzcworCitzZGtfcmUgPSByZS5jb21waWxlKHInLiotc2RrIChbYS16QS1aMC05Ll0qKScpCisKK2RlZiBzZGtpbmZvKHNka25hbWUpOgorICAgIHJldCA9IHt9CisgICAgZm9yIGxpbmUgaW4gc3VicHJvY2Vzcy5Qb3BlbihbJ3hjb2RlYnVpbGQnLCAnLXNkaycsIHNka25hbWUsICctdmVyc2lvbiddLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKS5zdGRvdXQ6CisgICAgICAgIGt2ID0gbGluZS5zdHJpcCgpLnNwbGl0KCc6ICcsIDEpCisgICAgICAgIGlmIGxlbihrdikgPT0gMjoKKyAgICAgICAgICAgIGssdiA9IGt2CisgICAgICAgICAgICByZXRba10gPSB2CisgICAgcmV0dXJuIHJldAorCitzaW1fc2RrX2luZm8gPSBzZGtpbmZvKCdpcGhvbmVzaW11bGF0b3InKQorZGV2aWNlX3Nka19pbmZvID0gc2RraW5mbygnaXBob25lb3MnKQorCitkZWYgbGF0ZXN0X3Nka3MoKToKKyAgICBsYXRlc3Rfc2ltID0gTm9uZQorICAgIGxhdGVzdF9kZXZpY2UgPSBOb25lCisgICAgZm9yIGxpbmUgaW4gc3VicHJvY2Vzcy5Qb3BlbihbJ3hjb2RlYnVpbGQnLCAnLXNob3dzZGtzJ10sIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpLnN0ZG91dDoKKyAgICAgICAgbWF0Y2ggPSBzZGtfcmUubWF0Y2gobGluZSkKKyAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICBpZiAnU2ltdWxhdG9yJyBpbiBsaW5lOgorICAgICAgICAgICAgICAgIGxhdGVzdF9zaW0gPSBtYXRjaC5ncm91cCgxKQorICAgICAgICAgICAgZWxpZiAnaU9TJyBpbiBsaW5lOgorICAgICAgICAgICAgICAgIGxhdGVzdF9kZXZpY2UgPSBtYXRjaC5ncm91cCgxKQorCisgICAgcmV0dXJuIGxhdGVzdF9zaW0sIGxhdGVzdF9kZXZpY2UKKworc2ltX3NkaywgZGV2aWNlX3NkayA9IGxhdGVzdF9zZGtzKCkKKworY2xhc3Mgc2ltdWxhdG9yX3BsYXRmb3JtKFBsYXRmb3JtKToKKyAgICBzZGs9J2lwaG9uZXNpbXVsYXRvcicKKyAgICBhcmNoID0gJ2kzODYnCisgICAgbmFtZSA9ICdzaW11bGF0b3InCisgICAgdHJpcGxlID0gJ2kzODYtYXBwbGUtZGFyd2luMTAnCisgICAgc2Rrcm9vdCA9IHNpbV9zZGtfaW5mb1snUGF0aCddCisKKyAgICBwcmVmaXggPSAiI2lmICFkZWZpbmVkKF9fYXJtX18pICYmIGRlZmluZWQoX19pMzg2X18pXG5cbiIKKyAgICBzdWZmaXggPSAiXG5cbiNlbmRpZiIKKworY2xhc3MgZGV2aWNlX3BsYXRmb3JtKFBsYXRmb3JtKToKKyAgICBzZGs9J2lwaG9uZW9zJworICAgIG5hbWUgPSAnaW9zJworICAgIGFyY2ggPSAnYXJtdjcnCisgICAgdHJpcGxlID0gJ2FybS1hcHBsZS1kYXJ3aW4xMCcKKyAgICBzZGtyb290ID0gZGV2aWNlX3Nka19pbmZvWydQYXRoJ10KKworICAgIHByZWZpeCA9ICIjaWZkZWYgX19hcm1fX1xuXG4iCisgICAgc3VmZml4ID0gIlxuXG4jZW5kaWYiCisKKworZGVmIG1vdmVfZmlsZShzcmNfZGlyLCBkc3RfZGlyLCBmaWxlbmFtZSwgZmlsZV9zdWZmaXg9Tm9uZSwgcHJlZml4PScnLCBzdWZmaXg9JycpOgorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhkc3RfZGlyKToKKyAgICAgICAgb3MubWFrZWRpcnMoZHN0X2RpcikKKworICAgIG91dF9maWxlbmFtZSA9IGZpbGVuYW1lCisKKyAgICBpZiBmaWxlX3N1ZmZpeDoKKyAgICAgICAgc3BsaXRfbmFtZSA9IG9zLnBhdGguc3BsaXRleHQoZmlsZW5hbWUpCisgICAgICAgIG91dF9maWxlbmFtZSA9ICAiJXNfJXMlcyIgJSAoc3BsaXRfbmFtZVswXSwgZmlsZV9zdWZmaXgsIHNwbGl0X25hbWVbMV0pCisKKyAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKHNyY19kaXIsIGZpbGVuYW1lKSkgYXMgaW5fZmlsZToKKyAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihkc3RfZGlyLCBvdXRfZmlsZW5hbWUpLCAndycpIGFzIG91dF9maWxlOgorICAgICAgICAgICAgaWYgcHJlZml4OgorICAgICAgICAgICAgICAgIG91dF9maWxlLndyaXRlKHByZWZpeCkKKworICAgICAgICAgICAgb3V0X2ZpbGUud3JpdGUoaW5fZmlsZS5yZWFkKCkpCisKKyAgICAgICAgICAgIGlmIHN1ZmZpeDoKKyAgICAgICAgICAgICAgICBvdXRfZmlsZS53cml0ZShzdWZmaXgpCisKK2hlYWRlcnNfc2VlbiA9IGNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0KHNldCkKKworZGVmIG1vdmVfc291cmNlX3RyZWUoc3JjX2RpciwgZGVzdF9kaXIsIGRlc3RfaW5jbHVkZV9kaXIsIGFyY2g9Tm9uZSwgcHJlZml4PU5vbmUsIHN1ZmZpeD1Ob25lKToKKyAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhzcmNfZGlyLCBmb2xsb3dsaW5rcz1UcnVlKToKKyAgICAgICAgcmVscm9vdCA9IG9zLnBhdGgucmVscGF0aChyb290LHNyY19kaXIpCisKKyAgICAgICAgZGVmIG1vdmVfZGlyKGFyY2gsIHByZWZpeD0nJywgc3VmZml4PScnLCBmaWxlcz1bXSk6CisgICAgICAgICAgICBmb3IgZmlsZSBpbiBmaWxlczoKKyAgICAgICAgICAgICAgICBmaWxlX3N1ZmZpeCA9IE5vbmUKKyAgICAgICAgICAgICAgICBpZiBmaWxlLmVuZHN3aXRoKCcuaCcpOgorICAgICAgICAgICAgICAgICAgICBpZiBkZXN0X2luY2x1ZGVfZGlyOgorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9zdWZmaXggPSBhcmNoCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBhcmNoOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnNfc2VlbltmaWxlXS5hZGQoYXJjaCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVfZmlsZShyb290LCBkZXN0X2luY2x1ZGVfZGlyLCBmaWxlLCBhcmNoLCBwcmVmaXg9cHJlZml4LCBzdWZmaXg9c3VmZml4KQorCisgICAgICAgICAgICAgICAgZWxpZiBkZXN0X2RpcjoKKyAgICAgICAgICAgICAgICAgICAgb3V0cm9vdCA9IG9zLnBhdGguam9pbihkZXN0X2RpciwgcmVscm9vdCkKKyAgICAgICAgICAgICAgICAgICAgbW92ZV9maWxlKHJvb3QsIG91dHJvb3QsIGZpbGUsIHByZWZpeD1wcmVmaXgsIHN1ZmZpeD1zdWZmaXgpCisKKyAgICAgICAgaWYgcmVscm9vdCA9PSAnLic6CisgICAgICAgICAgICBtb3ZlX2RpcihhcmNoPWFyY2gsCisgICAgICAgICAgICAgICAgICAgICBmaWxlcz1maWxlcywKKyAgICAgICAgICAgICAgICAgICAgIHByZWZpeD1wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICBzdWZmaXg9c3VmZml4KQorICAgICAgICBlbGlmIHJlbHJvb3QgPT0gJ2FybSc6CisgICAgICAgICAgICBtb3ZlX2RpcihhcmNoPSdhcm0nLAorICAgICAgICAgICAgICAgICAgICAgcHJlZml4PSIjaWZkZWYgX19hcm1fX1xuXG4iLAorICAgICAgICAgICAgICAgICAgICAgc3VmZml4PSJcblxuI2VuZGlmIiwKKyAgICAgICAgICAgICAgICAgICAgIGZpbGVzPWZpbGVzKQorICAgICAgICBlbGlmIHJlbHJvb3QgPT0gJ3g4Nic6CisgICAgICAgICAgICBtb3ZlX2RpcihhcmNoPSdpMzg2JywKKyAgICAgICAgICAgICAgICAgICAgIHByZWZpeD0iI2lmICFkZWZpbmVkKF9fYXJtX18pICYmIGRlZmluZWQoX19pMzg2X18pXG5cbiIsCisgICAgICAgICAgICAgICAgICAgICBzdWZmaXg9IlxuXG4jZW5kaWYiLAorICAgICAgICAgICAgICAgICAgICAgZmlsZXM9ZmlsZXMpCisKK2RlZiBidWlsZF90YXJnZXQocGxhdGZvcm0pOgorICAgIGRlZiB4Y3J1bl9jbWQoY21kKToKKyAgICAgICAgcmV0dXJuIHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KFsneGNydW4nLCAnLXNkaycsIHBsYXRmb3JtLnNka3Jvb3QsICctZmluZCcsIGNtZF0pLnN0cmlwKCkKKworICAgIGJ1aWxkX2RpciA9ICdidWlsZF8nICsgcGxhdGZvcm0ubmFtZQorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhidWlsZF9kaXIpOgorICAgICAgICBvcy5tYWtlZGlycyhidWlsZF9kaXIpCisgICAgICAgIGVudiA9IGRpY3QoQ0M9eGNydW5fY21kKCdjbGFuZycpLAorICAgICAgICAgICAgICAgICAgIExEPXhjcnVuX2NtZCgnbGQnKSwKKyAgICAgICAgICAgICAgICAgICBDRkxBR1M9Jy1hcmNoICVzIC1pc3lzcm9vdCAlcyAtbWlwaG9uZW9zLXZlcnNpb24tbWluPTQuMCcgJSAocGxhdGZvcm0uYXJjaCwgcGxhdGZvcm0uc2Rrcm9vdCkpCisgICAgICAgIHdvcmtpbmdfZGlyPW9zLmdldGN3ZCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLmNoZGlyKGJ1aWxkX2RpcikKKyAgICAgICAgICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbChbJy4uL2NvbmZpZ3VyZScsICctaG9zdCcsIHBsYXRmb3JtLnRyaXBsZV0sIGVudj1lbnYpCisgICAgICAgICAgICBtb3ZlX3NvdXJjZV90cmVlKCcuJywgTm9uZSwgJy4uL2lvcy9pbmNsdWRlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjaD1wbGF0Zm9ybS5hcmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9cGxhdGZvcm0ucHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXg9cGxhdGZvcm0uc3VmZml4KQorICAgICAgICAgICAgbW92ZV9zb3VyY2VfdHJlZSgnLi9pbmNsdWRlJywgTm9uZSwgJy4uL2lvcy9pbmNsdWRlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNoPXBsYXRmb3JtLmFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4PXBsYXRmb3JtLnByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXg9cGxhdGZvcm0uc3VmZml4KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuY2hkaXIod29ya2luZ19kaXIpCisKKyAgICAgICAgZm9yIGhlYWRlcl9uYW1lLCBhcmNocyBpbiBoZWFkZXJzX3NlZW4uaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBiYXNlbmFtZSwgc3VmZml4ID0gb3MucGF0aC5zcGxpdGV4dChoZWFkZXJfbmFtZSkKKworZGVmIG1haW4oKToKKyAgICBtb3ZlX3NvdXJjZV90cmVlKCdzcmMnLCAnaW9zL3NyYycsICdpb3MvaW5jbHVkZScpCisgICAgbW92ZV9zb3VyY2VfdHJlZSgnaW5jbHVkZScsIE5vbmUsICdpb3MvaW5jbHVkZScpCisgICAgYnVpbGRfdGFyZ2V0KHNpbXVsYXRvcl9wbGF0Zm9ybSkKKyAgICBidWlsZF90YXJnZXQoZGV2aWNlX3BsYXRmb3JtKQorCisgICAgZm9yIGhlYWRlcl9uYW1lLCBhcmNocyBpbiBoZWFkZXJzX3NlZW4uaXRlcml0ZW1zKCk6CisgICAgICAgIGJhc2VuYW1lLCBzdWZmaXggPSBvcy5wYXRoLnNwbGl0ZXh0KGhlYWRlcl9uYW1lKQorICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKCdpb3MvaW5jbHVkZScsIGhlYWRlcl9uYW1lKSwgJ3cnKSBhcyBoZWFkZXI6CisgICAgICAgICAgICBmb3IgYXJjaCBpbiBhcmNoczoKKyAgICAgICAgICAgICAgICBoZWFkZXIud3JpdGUoJyNpbmNsdWRlIDwlc18lcyVzPlxuJyAlIChiYXNlbmFtZSwgYXJjaCwgc3VmZml4KSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvZ2VuZXJhdGUtb3N4LXNvdXJjZS1hbmQtaGVhZGVycy5weSBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvZ2VuZXJhdGUtb3N4LXNvdXJjZS1hbmQtaGVhZGVycy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NDMxM2MxCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9nZW5lcmF0ZS1vc3gtc291cmNlLWFuZC1oZWFkZXJzLnB5CkBAIC0wLDAgKzEsMTUzIEBACisjIS91c3IvYmluL2VudiBweXRob24KK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgcmUKK2ltcG9ydCBvcworaW1wb3J0IGVycm5vCitpbXBvcnQgY29sbGVjdGlvbnMKK2ltcG9ydCBzeXMKKworY2xhc3MgUGxhdGZvcm0ob2JqZWN0KToKKyAgICBwYXNzCisKK3Nka19yZSA9IHJlLmNvbXBpbGUocicuKi1zZGsgKFthLXpBLVowLTkuXSopJykKKworZGVmIHNka2luZm8oc2RrbmFtZSk6CisgICAgcmV0ID0ge30KKyAgICBmb3IgbGluZSBpbiBzdWJwcm9jZXNzLlBvcGVuKFsneGNvZGVidWlsZCcsICctc2RrJywgc2RrbmFtZSwgJy12ZXJzaW9uJ10sIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpLnN0ZG91dDoKKyAgICAgICAga3YgPSBsaW5lLnN0cmlwKCkuc3BsaXQoJzogJywgMSkKKyAgICAgICAgaWYgbGVuKGt2KSA9PSAyOgorICAgICAgICAgICAgayx2ID0ga3YKKyAgICAgICAgICAgIHJldFtrXSA9IHYKKyAgICByZXR1cm4gcmV0CisKK2Rlc2t0b3Bfc2RrX2luZm8gPSBzZGtpbmZvKCdtYWNvc3gnKQorCitkZWYgbGF0ZXN0X3Nka3MoKToKKyAgICBsYXRlc3RfZGVza3RvcCA9IE5vbmUKKyAgICBmb3IgbGluZSBpbiBzdWJwcm9jZXNzLlBvcGVuKFsneGNvZGVidWlsZCcsICctc2hvd3Nka3MnXSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkuc3Rkb3V0OgorICAgICAgICBtYXRjaCA9IHNka19yZS5tYXRjaChsaW5lKQorICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgIGlmICdPUyBYJyBpbiBsaW5lOgorICAgICAgICAgICAgICAgIGxhdGVzdF9kZXNrdG9wID0gbWF0Y2guZ3JvdXAoMSkKKworICAgIHJldHVybiBsYXRlc3RfZGVza3RvcAorCitkZXNrdG9wX3NkayA9IGxhdGVzdF9zZGtzKCkKKworY2xhc3MgZGVza3RvcF9wbGF0Zm9ybV8zMihQbGF0Zm9ybSk6CisgICAgc2RrPSdtYWNvc3gnCisgICAgYXJjaCA9ICdpMzg2JworICAgIG5hbWUgPSAnbWFjMzInCisgICAgdHJpcGxlID0gJ2kzODYtYXBwbGUtZGFyd2luMTAnCisgICAgc2Rrcm9vdCA9IGRlc2t0b3Bfc2RrX2luZm9bJ1BhdGgnXQorCisgICAgcHJlZml4ID0gIiNpZiBkZWZpbmVkKF9faTM4Nl9fKSAmJiAhZGVmaW5lZChfX3g4Nl82NF9fKVxuXG4iCisgICAgc3VmZml4ID0gIlxuXG4jZW5kaWYiCisKK2NsYXNzIGRlc2t0b3BfcGxhdGZvcm1fNjQoUGxhdGZvcm0pOgorICAgIHNkaz0nbWFjb3N4JworICAgIGFyY2ggPSAneDg2XzY0JworICAgIG5hbWUgPSAnbWFjJworICAgIHRyaXBsZSA9ICd4ODZfNjQtYXBwbGUtZGFyd2luMTAnCisgICAgc2Rrcm9vdCA9IGRlc2t0b3Bfc2RrX2luZm9bJ1BhdGgnXQorCisgICAgcHJlZml4ID0gIiNpZiAhZGVmaW5lZChfX2kzODZfXykgJiYgZGVmaW5lZChfX3g4Nl82NF9fKVxuXG4iCisgICAgc3VmZml4ID0gIlxuXG4jZW5kaWYiCisKK2RlZiBtb3ZlX2ZpbGUoc3JjX2RpciwgZHN0X2RpciwgZmlsZW5hbWUsIGZpbGVfc3VmZml4PU5vbmUsIHByZWZpeD0nJywgc3VmZml4PScnKToKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZHN0X2Rpcik6CisgICAgICAgIG9zLm1ha2VkaXJzKGRzdF9kaXIpCisKKyAgICBvdXRfZmlsZW5hbWUgPSBmaWxlbmFtZQorCisgICAgaWYgZmlsZV9zdWZmaXg6CisgICAgICAgIHNwbGl0X25hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKQorICAgICAgICBvdXRfZmlsZW5hbWUgPSAgIiVzXyVzJXMiICUgKHNwbGl0X25hbWVbMF0sIGZpbGVfc3VmZml4LCBzcGxpdF9uYW1lWzFdKQorCisgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihzcmNfZGlyLCBmaWxlbmFtZSkpIGFzIGluX2ZpbGU6CisgICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oZHN0X2Rpciwgb3V0X2ZpbGVuYW1lKSwgJ3cnKSBhcyBvdXRfZmlsZToKKyAgICAgICAgICAgIGlmIHByZWZpeDoKKyAgICAgICAgICAgICAgICBvdXRfZmlsZS53cml0ZShwcmVmaXgpCisKKyAgICAgICAgICAgIG91dF9maWxlLndyaXRlKGluX2ZpbGUucmVhZCgpKQorCisgICAgICAgICAgICBpZiBzdWZmaXg6CisgICAgICAgICAgICAgICAgb3V0X2ZpbGUud3JpdGUoc3VmZml4KQorCitoZWFkZXJzX3NlZW4gPSBjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdChzZXQpCisKK2RlZiBtb3ZlX3NvdXJjZV90cmVlKHNyY19kaXIsIGRlc3RfZGlyLCBkZXN0X2luY2x1ZGVfZGlyLCBhcmNoPU5vbmUsIHByZWZpeD1Ob25lLCBzdWZmaXg9Tm9uZSk6CisgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoc3JjX2RpciwgZm9sbG93bGlua3M9VHJ1ZSk6CisgICAgICAgIHJlbHJvb3QgPSBvcy5wYXRoLnJlbHBhdGgocm9vdCxzcmNfZGlyKQorCisgICAgICAgIGRlZiBtb3ZlX2RpcihhcmNoLCBwcmVmaXg9JycsIHN1ZmZpeD0nJywgZmlsZXM9W10pOgorICAgICAgICAgICAgZm9yIGZpbGUgaW4gZmlsZXM6CisgICAgICAgICAgICAgICAgZmlsZV9zdWZmaXggPSBOb25lCisgICAgICAgICAgICAgICAgaWYgZmlsZS5lbmRzd2l0aCgnLmgnKToKKyAgICAgICAgICAgICAgICAgICAgaWYgZGVzdF9pbmNsdWRlX2RpcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfc3VmZml4ID0gYXJjaAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgYXJjaDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzX3NlZW5bZmlsZV0uYWRkKGFyY2gpCisgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlX2ZpbGUocm9vdCwgZGVzdF9pbmNsdWRlX2RpciwgZmlsZSwgYXJjaCwgcHJlZml4PXByZWZpeCwgc3VmZml4PXN1ZmZpeCkKKworICAgICAgICAgICAgICAgIGVsaWYgZGVzdF9kaXI6CisgICAgICAgICAgICAgICAgICAgIG91dHJvb3QgPSBvcy5wYXRoLmpvaW4oZGVzdF9kaXIsIHJlbHJvb3QpCisgICAgICAgICAgICAgICAgICAgIG1vdmVfZmlsZShyb290LCBvdXRyb290LCBmaWxlLCBwcmVmaXg9cHJlZml4LCBzdWZmaXg9c3VmZml4KQorCisgICAgICAgIGlmIHJlbHJvb3QgPT0gJy4nOgorICAgICAgICAgICAgbW92ZV9kaXIoYXJjaD1hcmNoLAorICAgICAgICAgICAgICAgICAgICAgZmlsZXM9ZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9cHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgc3VmZml4PXN1ZmZpeCkKKyAgICAgICAgZWxpZiByZWxyb290ID09ICd4ODYnOgorICAgICAgICAgICAgbW92ZV9kaXIoYXJjaD0naTM4NicsCisgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9IiNpZiBkZWZpbmVkKF9faTM4Nl9fKSAmJiAhZGVmaW5lZChfX3g4Nl82NF9fKVxuXG4iLAorICAgICAgICAgICAgICAgICAgICAgc3VmZml4PSJcblxuI2VuZGlmIiwKKyAgICAgICAgICAgICAgICAgICAgIGZpbGVzPWZpbGVzKQorICAgICAgICAgICAgbW92ZV9kaXIoYXJjaD0neDg2XzY0JywKKyAgICAgICAgICAgICAgICAgICAgIHByZWZpeD0iI2lmICFkZWZpbmVkKF9faTM4Nl9fKSAmJiBkZWZpbmVkKF9feDg2XzY0X18pXG5cbiIsCisgICAgICAgICAgICAgICAgICAgICBzdWZmaXg9IlxuXG4jZW5kaWYiLAorICAgICAgICAgICAgICAgICAgICAgZmlsZXM9ZmlsZXMpCisKK2RlZiBidWlsZF90YXJnZXQocGxhdGZvcm0pOgorICAgIGRlZiB4Y3J1bl9jbWQoY21kKToKKyAgICAgICAgcmV0dXJuIHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KFsneGNydW4nLCAnLXNkaycsIHBsYXRmb3JtLnNka3Jvb3QsICctZmluZCcsIGNtZF0pLnN0cmlwKCkKKworICAgIGJ1aWxkX2RpciA9ICdidWlsZF8nICsgcGxhdGZvcm0ubmFtZQorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhidWlsZF9kaXIpOgorICAgICAgICBvcy5tYWtlZGlycyhidWlsZF9kaXIpCisgICAgICAgIGVudiA9IGRpY3QoQ0M9eGNydW5fY21kKCdjbGFuZycpLAorICAgICAgICAgICAgICAgICAgIExEPXhjcnVuX2NtZCgnbGQnKSwKKyAgICAgICAgICAgICAgICAgICBDRkxBR1M9Jy1hcmNoICVzIC1pc3lzcm9vdCAlcyAtbW1hY29zeC12ZXJzaW9uLW1pbj0xMC42JyAlIChwbGF0Zm9ybS5hcmNoLCBwbGF0Zm9ybS5zZGtyb290KSkKKyAgICAgICAgd29ya2luZ19kaXI9b3MuZ2V0Y3dkKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MuY2hkaXIoYnVpbGRfZGlyKQorICAgICAgICAgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKFsnLi4vY29uZmlndXJlJywgJy1ob3N0JywgcGxhdGZvcm0udHJpcGxlXSwgZW52PWVudikKKyAgICAgICAgICAgIG1vdmVfc291cmNlX3RyZWUoJy4nLCBOb25lLCAnLi4vb3N4L2luY2x1ZGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNoPXBsYXRmb3JtLmFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD1wbGF0Zm9ybS5wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeD1wbGF0Zm9ybS5zdWZmaXgpCisgICAgICAgICAgICBtb3ZlX3NvdXJjZV90cmVlKCcuL2luY2x1ZGUnLCBOb25lLCAnLi4vb3N4L2luY2x1ZGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNoPXBsYXRmb3JtLmFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD1wbGF0Zm9ybS5wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeD1wbGF0Zm9ybS5zdWZmaXgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5jaGRpcih3b3JraW5nX2RpcikKKworICAgICAgICBmb3IgaGVhZGVyX25hbWUsIGFyY2hzIGluIGhlYWRlcnNfc2Vlbi5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIGJhc2VuYW1lLCBzdWZmaXggPSBvcy5wYXRoLnNwbGl0ZXh0KGhlYWRlcl9uYW1lKQorCitkZWYgbWFpbigpOgorICAgIG1vdmVfc291cmNlX3RyZWUoJ3NyYycsICdvc3gvc3JjJywgJ29zeC9pbmNsdWRlJykKKyAgICBtb3ZlX3NvdXJjZV90cmVlKCdpbmNsdWRlJywgTm9uZSwgJ29zeC9pbmNsdWRlJykKKyAgICBidWlsZF90YXJnZXQoZGVza3RvcF9wbGF0Zm9ybV8zMikKKyAgICBidWlsZF90YXJnZXQoZGVza3RvcF9wbGF0Zm9ybV82NCkKKworICAgIGZvciBoZWFkZXJfbmFtZSwgYXJjaHMgaW4gaGVhZGVyc19zZWVuLml0ZXJpdGVtcygpOgorICAgICAgICBiYXNlbmFtZSwgc3VmZml4ID0gb3MucGF0aC5zcGxpdGV4dChoZWFkZXJfbmFtZSkKKyAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbignb3N4L2luY2x1ZGUnLCBoZWFkZXJfbmFtZSksICd3JykgYXMgaGVhZGVyOgorICAgICAgICAgICAgZm9yIGFyY2ggaW4gYXJjaHM6CisgICAgICAgICAgICAgICAgaGVhZGVyLndyaXRlKCcjaW5jbHVkZSA8JXNfJXMlcz5cbicgJSAoYmFzZW5hbWUsIGFyY2gsIHN1ZmZpeCkpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2luY2x1ZGUvTWFrZWZpbGUuaW4gYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2luY2x1ZGUvTWFrZWZpbGUuaW4KaW5kZXggMTM2ZjM2Yy4uMmMzNmUzNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9pbmNsdWRlL01ha2VmaWxlLmluCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvaW5jbHVkZS9NYWtlZmlsZS5pbgpAQCAtMSw5ICsxLDggQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTEgZnJvbSBNYWtlZmlsZS5hbS4KKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTIuMiBmcm9tIE1ha2VmaWxlLmFtLgogIyBAY29uZmlndXJlX2lucHV0QAogCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKLSMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotIyBJbmMuCisjIENvcHlyaWdodCAoQykgMTk5NC0yMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCiAjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgogIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAogIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCkBAIC0xNiw2ICsxNSwyMyBAQAogQFNFVF9NQUtFQAogCiBWUEFUSCA9IEBzcmNkaXJACithbV9fbWFrZV9kcnlydW4gPSBcCisgIHsgXAorICAgIGFtX19kcnk9bm87IFwKKyAgICBjYXNlICQkTUFLRUZMQUdTIGluIFwKKyAgICAgICpcXFtcIFwJXSopIFwKKyAgICAgICAgZWNobyAnYW0tLWVjaG86IDsgQGVjaG8gIkFNIiAgT0snIHwgJChNQUtFKSAtZiAtIDI+L2Rldi9udWxsIFwKKyAgICAgICAgICB8IGdyZXAgJ15BTSBPSyQkJyA+L2Rldi9udWxsIHx8IGFtX19kcnk9eWVzOzsgXAorICAgICAgKikgXAorICAgICAgICBmb3IgYW1fX2ZsZyBpbiAkJE1BS0VGTEFHUzsgZG8gXAorICAgICAgICAgIGNhc2UgJCRhbV9fZmxnIGluIFwKKyAgICAgICAgICAgICo9KnwtLSopIDs7IFwKKyAgICAgICAgICAgICpuKikgYW1fX2RyeT15ZXM7IGJyZWFrOzsgXAorICAgICAgICAgIGVzYWM7IFwKKyAgICAgICAgZG9uZTs7IFwKKyAgICBlc2FjOyBcCisgICAgdGVzdCAkJGFtX19kcnkgPSB5ZXM7IFwKKyAgfQogcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACiBwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKIHBrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKQEAgLTM5LDcgKzU1LDE5IEBACiBESVNUX0NPTU1PTiA9ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuaW4gXAogCSQoc3JjZGlyKS9mZmkuaC5pbgogQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAotYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL200L2FzbWNmaS5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9hcHBlbmRfZmxhZy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9jY19tYXhvcHQubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYXhfY2ZsYWdzX3dhcm5fYWxsLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2NoZWNrX2NvbXBpbGVfZmxhZy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9jb21waWxlcl92ZW5kb3IubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYXhfY29uZmlndXJlX2FyZ3MubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYXhfZW5hYmxlX2J1aWxkZGlyLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2djY19hcmNoZmxhZy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9nY2NfeDg2X2NwdWlkLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2xpYnRvb2wubTQgJCh0b3Bfc3JjZGlyKS9tNC9sdG9wdGlvbnMubTQgXAorCSQodG9wX3NyY2RpcikvbTQvbHRzdWdhci5tNCAkKHRvcF9zcmNkaXIpL200L2x0dmVyc2lvbi5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9sdH5vYnNvbGV0ZS5tNCAkKHRvcF9zcmNkaXIpL2FjaW5jbHVkZS5tNCBcCiAJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKIGFtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCiAJJChBQ0xPQ0FMX000KQpAQCAtNDksNiArNzcsMTEgQEAKIENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9CiBTT1VSQ0VTID0KIERJU1RfU09VUkNFUyA9CithbV9fY2FuX3J1bl9pbnN0YWxsaW5mbyA9IFwKKyAgY2FzZSAkJEFNX1VQREFURV9JTkZPX0RJUiBpbiBcCisgICAgbnxub3xOTykgZmFsc2U7OyBcCisgICAgKikgKGluc3RhbGwtaW5mbyAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMTs7IFwKKyAgZXNhYwogYW1fX3ZwYXRoX2Fkal9zZXR1cCA9IHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7CiBhbV9fdnBhdGhfYWRqID0gY2FzZSAkJHAgaW4gXAogICAgICQoc3JjZGlyKS8qKSBmPWBlY2hvICIkJHAiIHwgc2VkICJzfF4kJHNyY2RpcnN0cmlwL3x8ImA7OyBcCkBAIC03MCw2ICsxMDMsMTIgQEAKIGFtX19iYXNlX2xpc3QgPSBcCiAgIHNlZCAnJCQhTjskJCFOOyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjtzL1xuLyAvZycgfCBcCiAgIHNlZCAnJCQhTjskJCFOOyQkIU47JCQhTjtzL1xuLyAvZycKK2FtX191bmluc3RhbGxfZmlsZXNfZnJvbV9kaXIgPSB7IFwKKyAgdGVzdCAteiAiJCRmaWxlcyIgXAorICAgIHx8IHsgdGVzdCAhIC1kICIkJGRpciIgJiYgdGVzdCAhIC1mICIkJGRpciIgJiYgdGVzdCAhIC1yICIkJGRpciI7IH0gXAorICAgIHx8IHsgZWNobyAiICggY2QgJyQkZGlyJyAmJiBybSAtZiIgJCRmaWxlcyAiKSI7IFwKKyAgICAgICAgICQoYW1fX2NkKSAiJCRkaXIiICYmIHJtIC1mICQkZmlsZXM7IH07IFwKKyAgfQogYW1fX2luc3RhbGxkaXJzID0gIiQoREVTVERJUikkKGluY2x1ZGVzZGlyKSIKIEhFQURFUlMgPSAkKG5vZGlzdF9pbmNsdWRlc19IRUFERVJTKQogRVRBR1MgPSBldGFncwpAQCAtNzgsNiArMTE3LDcgQEAKIEFDTE9DQUwgPSBAQUNMT0NBTEAKIEFMTE9DQSA9IEBBTExPQ0FACiBBTVRBUiA9IEBBTVRBUkAKK0FNX0xUTERGTEFHUyA9IEBBTV9MVExERkxBR1NACiBBTV9SVU5URVNURkxBR1MgPSBAQU1fUlVOVEVTVEZMQUdTQAogQVIgPSBAQVJACiBBVVRPQ09ORiA9IEBBVVRPQ09ORkAKQEAgLTk1LDYgKzEzNSw3IEBACiBDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAogREVGUyA9IEBERUZTQAogREVQRElSID0gQERFUERJUkAKK0RMTFRPT0wgPSBARExMVE9PTEAKIERTWU1VVElMID0gQERTWU1VVElMQAogRFVNUEJJTiA9IEBEVU1QQklOQAogRUNIT19DID0gQEVDSE9fQ0AKQEAgLTEwMiw2ICsxNDMsNyBAQAogRUNIT19UID0gQEVDSE9fVEAKIEVHUkVQID0gQEVHUkVQQAogRVhFRVhUID0gQEVYRUVYVEAKK0ZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEUgPSBARkZJX0VYRUNfVFJBTVBPTElORV9UQUJMRUAKIEZHUkVQID0gQEZHUkVQQAogR1JFUCA9IEBHUkVQQAogSEFWRV9MT05HX0RPVUJMRSA9IEBIQVZFX0xPTkdfRE9VQkxFQApAQCAtMTIwLDYgKzE2Miw3IEBACiBMVExJQk9CSlMgPSBATFRMSUJPQkpTQAogTUFJTlQgPSBATUFJTlRACiBNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01BTklGRVNUX1RPT0wgPSBATUFOSUZFU1RfVE9PTEAKIE1LRElSX1AgPSBATUtESVJfUEAKIE5NID0gQE5NQAogTk1FRElUID0gQE5NRURJVEAKQEAgLTEzMiw4ICsxNzUsMTAgQEAKIFBBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACiBQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKIFBBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1VSTCA9IEBQQUNLQUdFX1VSTEAKIFBBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACiBQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BSVERJQUcgPSBAUFJURElBR0AKIFJBTkxJQiA9IEBSQU5MSUJACiBTRUQgPSBAU0VEQAogU0VUX01BS0UgPSBAU0VUX01BS0VACkBAIC0xNDYsNiArMTkxLDcgQEAKIGFic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKIGFic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKIGFic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQVIgPSBAYWNfY3RfQVJACiBhY19jdF9DQyA9IEBhY19jdF9DQ0AKIGFjX2N0X0RVTVBCSU4gPSBAYWNfY3RfRFVNUEJJTkAKIGFtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQApAQCAtMTUzLDYgKzE5OSw3IEBACiBhbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAogYW1fX3RhciA9IEBhbV9fdGFyQAogYW1fX3VudGFyID0gQGFtX191bnRhckAKK2F4X2VuYWJsZV9idWlsZGRpcl9zZWQgPSBAYXhfZW5hYmxlX2J1aWxkZGlyX3NlZEAKIGJpbmRpciA9IEBiaW5kaXJACiBidWlsZCA9IEBidWlsZEAKIGJ1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQApAQCAtMTc4LDcgKzIyNSw2IEBACiBsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACiBsb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAogbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAotbHRfRUNITyA9IEBsdF9FQ0hPQAogbWFuZGlyID0gQG1hbmRpckAKIG1rZGlyX3AgPSBAbWtkaXJfcEAKIG9sZGluY2x1ZGVkaXIgPSBAb2xkaW5jbHVkZWRpckAKQEAgLTE4OSw2ICsyMzUsNyBAQAogc2JpbmRpciA9IEBzYmluZGlyQAogc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACiBzcmNkaXIgPSBAc3JjZGlyQAorc3lzX3N5bWJvbF91bmRlcnNjb3JlID0gQHN5c19zeW1ib2xfdW5kZXJzY29yZUAKIHN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKIHRhcmdldCA9IEB0YXJnZXRACiB0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQApAQCAtMjQ4LDggKzI5NSwxMSBAQAogCS1ybSAtcmYgLmxpYnMgX2xpYnMKIGluc3RhbGwtbm9kaXN0X2luY2x1ZGVzSEVBREVSUzogJChub2Rpc3RfaW5jbHVkZXNfSEVBREVSUykKIAlAJChOT1JNQUxfSU5TVEFMTCkKLQl0ZXN0IC16ICIkKGluY2x1ZGVzZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQoaW5jbHVkZXNkaXIpIgogCUBsaXN0PSckKG5vZGlzdF9pbmNsdWRlc19IRUFERVJTKSc7IHRlc3QgLW4gIiQoaW5jbHVkZXNkaXIpIiB8fCBsaXN0PTsgXAorCWlmIHRlc3QgLW4gIiQkbGlzdCI7IHRoZW4gXAorCSAgZWNobyAiICQoTUtESVJfUCkgJyQoREVTVERJUikkKGluY2x1ZGVzZGlyKSciOyBcCisJICAkKE1LRElSX1ApICIkKERFU1RESVIpJChpbmNsdWRlc2RpcikiIHx8IGV4aXQgMTsgXAorCWZpOyBcCiAJZm9yIHAgaW4gJCRsaXN0OyBkbyBcCiAJICBpZiB0ZXN0IC1mICIkJHAiOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAogCSAgZWNobyAiJCRkJCRwIjsgXApAQCAtMjYzLDkgKzMxMyw3IEBACiAJQCQoTk9STUFMX1VOSU5TVEFMTCkKIAlAbGlzdD0nJChub2Rpc3RfaW5jbHVkZXNfSEVBREVSUyknOyB0ZXN0IC1uICIkKGluY2x1ZGVzZGlyKSIgfHwgbGlzdD07IFwKIAlmaWxlcz1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICQkcDsgZG9uZSB8IHNlZCAtZSAnc3xeLiovfHwnYDsgXAotCXRlc3QgLW4gIiQkZmlsZXMiIHx8IGV4aXQgMDsgXAotCWVjaG8gIiAoIGNkICckKERFU1RESVIpJChpbmNsdWRlc2RpciknICYmIHJtIC1mIiAkJGZpbGVzICIpIjsgXAotCWNkICIkKERFU1RESVIpJChpbmNsdWRlc2RpcikiICYmIHJtIC1mICQkZmlsZXMKKwlkaXI9JyQoREVTVERJUikkKGluY2x1ZGVzZGlyKSc7ICQoYW1fX3VuaW5zdGFsbF9maWxlc19mcm9tX2RpcikKIAogSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKIAlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXApAQCAtMzE2LDYgKzM2NCwyMCBAQAogCSAgJiYgJChhbV9fY2QpICQodG9wX3NyY2RpcikgXAogCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAiJCRoZXJlIgogCitjc2NvcGVsaXN0OiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSc7IFwKKwljYXNlICIkKHNyY2RpcikiIGluIFwKKwkgIFtcXC9dKiB8ID86W1xcL10qKSBzZGlyPSIkKHNyY2RpcikiIDs7IFwKKwkgICopIHNkaXI9JChzdWJkaXIpLyQoc3JjZGlyKSA7OyBcCisJZXNhYzsgXAorCWZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBcCisJICAgIGVjaG8gIiQoc3ViZGlyKS8kJGkiOyBcCisJICBlbHNlIFwKKwkgICAgZWNobyAiJCRzZGlyLyQkaSI7IFwKKwkgIGZpOyBcCisJZG9uZSA+PiAkKHRvcF9idWlsZGRpcikvY3Njb3BlLmZpbGVzCisKIGRpc3RjbGVhbi10YWdzOgogCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCiAKQEAgLTM2NiwxMCArNDI4LDE1IEBACiAKIGluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCiBpbnN0YWxsLXN0cmlwOgotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKLQkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAotCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorCWlmIHRlc3QgLXogJyQoU1RSSVApJzsgdGhlbiBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgICAgICBpbnN0YWxsOyBcCisJZWxzZSBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgICAgIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciIGluc3RhbGw7IFwKKwlmaQogbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKIAogY2xlYW4tZ2VuZXJpYzoKQEAgLTQ1MSw3ICs1MTgsNyBAQAogLk1BS0U6IGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAogCiAuUEhPTlk6IENUQUdTIEdUQUdTIGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBcCi0JY2xlYW4tbGlidG9vbCBjdGFncyBkaXN0Y2xlYW4gZGlzdGNsZWFuLWdlbmVyaWMgXAorCWNsZWFuLWxpYnRvb2wgY3Njb3BlbGlzdCBjdGFncyBkaXN0Y2xlYW4gZGlzdGNsZWFuLWdlbmVyaWMgXAogCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIFwKIAlodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIFwKIAlpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIFwKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvaW5jbHVkZS9mZmkuaC5pbiBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvaW5jbHVkZS9mZmkuaC5pbgppbmRleCBkZjdkMmNkLi5hNTE1ODNiIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2luY2x1ZGUvZmZpLmguaW4KKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9pbmNsdWRlL2ZmaS5oLmluCkBAIC0xLDE2ICsxLDE3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotQy0qLQotICAgbGliZmZpIEBWRVJTSU9OQCAtIENvcHlyaWdodCAoYykgMTk5Ni0yMDAzLCAyMDA3LCAyMDA4ICBSZWQgSGF0LCBJbmMuCisgICBsaWJmZmkgQFZFUlNJT05AIC0gQ29weXJpZ2h0IChjKSAyMDExIEFudGhvbnkgR3JlZW4KKyAgICAgICAgICAgICAgICAgICAgLSBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMywgMjAwNywgMjAwOCBSZWQgSGF0LCBJbmMuCiAKLSAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0gICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAgIGZpbGVzICh0aGUgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgICBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAgIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi0gICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAotICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICAgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiAKICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCiAgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKQEAgLTU3LDcgKzU4LDkgQEAKICNlbmRpZgogCiAvKiBTcGVjaWZ5IHdoaWNoIGFyY2hpdGVjdHVyZSBsaWJmZmkgaXMgY29uZmlndXJlZCBmb3IuICovCisjaWZuZGVmIEBUQVJHRVRACiAjZGVmaW5lIEBUQVJHRVRACisjZW5kaWYKIAogLyogLS0tLSBTeXN0ZW0gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtNzUsMTUgKzc4LDMxIEBACiAvKiBMT05HX0xPTkdfTUFYIGlzIG5vdCBhbHdheXMgZGVmaW5lZCAobm90IGlmIFNUUklDVF9BTlNJLCBmb3IgZXhhbXBsZSkuCiAgICBCdXQgd2UgY2FuIGZpbmQgaXQgZWl0aGVyIHVuZGVyIHRoZSBjb3JyZWN0IEFOU0kgbmFtZSwgb3IgdW5kZXIgR05VCiAgICBDJ3MgaW50ZXJuYWwgbmFtZS4gICovCisKKyNkZWZpbmUgRkZJXzY0X0JJVF9NQVggOTIyMzM3MjAzNjg1NDc3NTgwNworCiAjaWZkZWYgTE9OR19MT05HX01BWAogIyBkZWZpbmUgRkZJX0xPTkdfTE9OR19NQVggTE9OR19MT05HX01BWAogI2Vsc2UKICMgaWZkZWYgTExPTkdfTUFYCiAjICBkZWZpbmUgRkZJX0xPTkdfTE9OR19NQVggTExPTkdfTUFYCisjICBpZmRlZiBfQUlYNTIgLyogb3IgbmV3ZXIgaGFzIEM5OSBMTE9OR19NQVggKi8KKyMgICB1bmRlZiBGRklfNjRfQklUX01BWAorIyAgIGRlZmluZSBGRklfNjRfQklUX01BWCA5MjIzMzcyMDM2ODU0Nzc1ODA3TEwKKyMgIGVuZGlmIC8qIF9BSVg1MiBvciBuZXdlciAqLwogIyBlbHNlCiAjICBpZmRlZiBfX0dOVUNfXwogIyAgIGRlZmluZSBGRklfTE9OR19MT05HX01BWCBfX0xPTkdfTE9OR19NQVhfXwogIyAgZW5kaWYKKyMgIGlmZGVmIF9BSVggLyogQUlYIDUuMSBhbmQgZWFybGllciBoYXZlIExPTkdMT05HX01BWCAqLworIyAgIGlmbmRlZiBfX1BQQzY0X18KKyMgICAgaWYgZGVmaW5lZCAoX19JQk1DX18pIHx8IGRlZmluZWQgKF9fSUJNQ1BQX18pCisjICAgICBkZWZpbmUgRkZJX0xPTkdfTE9OR19NQVggTE9OR0xPTkdfTUFYCisjICAgIGVuZGlmCisjICAgZW5kaWYgLyogX19QUEM2NF9fICovCisjICAgdW5kZWYgIEZGSV82NF9CSVRfTUFYCisjICAgZGVmaW5lIEZGSV82NF9CSVRfTUFYIDkyMjMzNzIwMzY4NTQ3NzU4MDdMTAorIyAgZW5kaWYKICMgZW5kaWYKICNlbmRpZgogCkBAIC0xMzAsMzkgKzE0OSw1MyBAQAogI2VuZGlmCiAKICNpZiBMT05HX01BWCA9PSAyMTQ3NDgzNjQ3Ci0jIGlmIEZGSV9MT05HX0xPTkdfTUFYICE9IDkyMjMzNzIwMzY4NTQ3NzU4MDcKKyMgaWYgRkZJX0xPTkdfTE9OR19NQVggIT0gRkZJXzY0X0JJVF9NQVgKICAjZXJyb3IgIm5vIDY0LWJpdCBkYXRhIHR5cGUgc3VwcG9ydGVkIgogIyBlbmRpZgotI2VsaWYgTE9OR19NQVggIT0gOTIyMzM3MjAzNjg1NDc3NTgwNworI2VsaWYgTE9OR19NQVggIT0gRkZJXzY0X0JJVF9NQVgKICAjZXJyb3IgImxvbmcgc2l6ZSBub3Qgc3VwcG9ydGVkIgogI2VuZGlmCiAKICNpZiBMT05HX01BWCA9PSAyMTQ3NDgzNjQ3CiAjIGRlZmluZSBmZmlfdHlwZV91bG9uZyAgICAgICAgZmZpX3R5cGVfdWludDMyCiAjIGRlZmluZSBmZmlfdHlwZV9zbG9uZyAgICAgICAgZmZpX3R5cGVfc2ludDMyCi0jZWxpZiBMT05HX01BWCA9PSA5MjIzMzcyMDM2ODU0Nzc1ODA3CisjZWxpZiBMT05HX01BWCA9PSBGRklfNjRfQklUX01BWAogIyBkZWZpbmUgZmZpX3R5cGVfdWxvbmcgICAgICAgIGZmaV90eXBlX3VpbnQ2NAogIyBkZWZpbmUgZmZpX3R5cGVfc2xvbmcgICAgICAgIGZmaV90eXBlX3NpbnQ2NAogI2Vsc2UKICAjZXJyb3IgImxvbmcgc2l6ZSBub3Qgc3VwcG9ydGVkIgogI2VuZGlmCiAKKy8qIE5lZWQgbWluaW1hbCBkZWNvcmF0aW9ucyBmb3IgRExMcyB0byB3b3JrcyBvbiBXaW5kb3dzLiAqLworLyogR0NDIGhhcyBhdXRvaW1wb3J0IGFuZCBhdXRvZXhwb3J0LiAgUmVseSBvbiBMaWJ0b29sIHRvICovCisvKiBoZWxwIE1TVkMgZXhwb3J0IGZyb20gYSBETEwsIGJ1dCBhbHdheXMgZGVjbGFyZSBkYXRhICAgKi8KKy8qIHRvIGJlIGltcG9ydGVkIGZvciBNU1ZDIGNsaWVudHMuICBUaGlzIGNvc3RzIGFuIGV4dHJhICAqLworLyogaW5kaXJlY3Rpb24gZm9yIE1TVkMgY2xpZW50cyB1c2luZyB0aGUgc3RhdGljIHZlcnNpb24gICovCisvKiBvZiB0aGUgbGlicmFyeSwgYnV0IGRvbid0IHdvcnJ5IGFib3V0IHRoYXQuICBCZXNpZGVzLCAgKi8KKy8qIGFzIGEgd29ya2Fyb3VuZCwgdGhleSBjYW4gZGVmaW5lIEZGSV9CVUlMRElORyBpZiB0aGV5ICAqLworLyogKmtub3cqIHRoZXkgYXJlIGdvaW5nIHRvIGxpbmsgd2l0aCB0aGUgc3RhdGljIGxpYnJhcnkuICovCisjaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiAhZGVmaW5lZCBGRklfQlVJTERJTkcKKyNkZWZpbmUgRkZJX0VYVEVSTiBleHRlcm4gX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjZWxzZQorI2RlZmluZSBGRklfRVhURVJOIGV4dGVybgorI2VuZGlmCisKIC8qIFRoZXNlIGFyZSBkZWZpbmVkIGluIHR5cGVzLmMgKi8KLWV4dGVybiBmZmlfdHlwZSBmZmlfdHlwZV92b2lkOwotZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX3VpbnQ4OwotZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX3NpbnQ4OwotZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX3VpbnQxNjsKLWV4dGVybiBmZmlfdHlwZSBmZmlfdHlwZV9zaW50MTY7Ci1leHRlcm4gZmZpX3R5cGUgZmZpX3R5cGVfdWludDMyOwotZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX3NpbnQzMjsKLWV4dGVybiBmZmlfdHlwZSBmZmlfdHlwZV91aW50NjQ7Ci1leHRlcm4gZmZpX3R5cGUgZmZpX3R5cGVfc2ludDY0OwotZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX2Zsb2F0OwotZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX2RvdWJsZTsKLWV4dGVybiBmZmlfdHlwZSBmZmlfdHlwZV9wb2ludGVyOworRkZJX0VYVEVSTiBmZmlfdHlwZSBmZmlfdHlwZV92b2lkOworRkZJX0VYVEVSTiBmZmlfdHlwZSBmZmlfdHlwZV91aW50ODsKK0ZGSV9FWFRFUk4gZmZpX3R5cGUgZmZpX3R5cGVfc2ludDg7CitGRklfRVhURVJOIGZmaV90eXBlIGZmaV90eXBlX3VpbnQxNjsKK0ZGSV9FWFRFUk4gZmZpX3R5cGUgZmZpX3R5cGVfc2ludDE2OworRkZJX0VYVEVSTiBmZmlfdHlwZSBmZmlfdHlwZV91aW50MzI7CitGRklfRVhURVJOIGZmaV90eXBlIGZmaV90eXBlX3NpbnQzMjsKK0ZGSV9FWFRFUk4gZmZpX3R5cGUgZmZpX3R5cGVfdWludDY0OworRkZJX0VYVEVSTiBmZmlfdHlwZSBmZmlfdHlwZV9zaW50NjQ7CitGRklfRVhURVJOIGZmaV90eXBlIGZmaV90eXBlX2Zsb2F0OworRkZJX0VYVEVSTiBmZmlfdHlwZSBmZmlfdHlwZV9kb3VibGU7CitGRklfRVhURVJOIGZmaV90eXBlIGZmaV90eXBlX3BvaW50ZXI7CiAKICNpZiBASEFWRV9MT05HX0RPVUJMRUAKLWV4dGVybiBmZmlfdHlwZSBmZmlfdHlwZV9sb25nZG91YmxlOworRkZJX0VYVEVSTiBmZmlfdHlwZSBmZmlfdHlwZV9sb25nZG91YmxlOwogI2Vsc2UKICNkZWZpbmUgZmZpX3R5cGVfbG9uZ2RvdWJsZSBmZmlfdHlwZV9kb3VibGUKICNlbmRpZgpAQCAtMTg4LDEyICsyMjEsMjEgQEAKICNlbmRpZgogfSBmZmlfY2lmOwogCisvKiBVc2VkIGludGVybmFsbHksIGJ1dCBvdmVycmlkZGVuIGJ5IHNvbWUgYXJjaGl0ZWN0dXJlcyAqLworZmZpX3N0YXR1cyBmZmlfcHJlcF9jaWZfY29yZShmZmlfY2lmICpjaWYsCisJCQkgICAgIGZmaV9hYmkgYWJpLAorCQkJICAgICB1bnNpZ25lZCBpbnQgaXN2YXJpYWRpYywKKwkJCSAgICAgdW5zaWduZWQgaW50IG5maXhlZGFyZ3MsCisJCQkgICAgIHVuc2lnbmVkIGludCBudG90YWxhcmdzLAorCQkJICAgICBmZmlfdHlwZSAqcnR5cGUsCisJCQkgICAgIGZmaV90eXBlICoqYXR5cGVzKTsKKwogLyogLS0tLSBEZWZpbml0aW9ucyBmb3IgdGhlIHJhdyBBUEkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogI2lmbmRlZiBGRklfU0laRU9GX0FSRwogIyBpZiBMT05HX01BWCA9PSAyMTQ3NDgzNjQ3CiAjICBkZWZpbmUgRkZJX1NJWkVPRl9BUkcgICAgICAgIDQKLSMgZWxpZiBMT05HX01BWCA9PSA5MjIzMzcyMDM2ODU0Nzc1ODA3CisjIGVsaWYgTE9OR19NQVggPT0gRkZJXzY0X0JJVF9NQVgKICMgIGRlZmluZSBGRklfU0laRU9GX0FSRyAgICAgICAgOAogIyBlbmRpZgogI2VuZGlmCkBAIC0yNTUsNyArMjk3LDEyIEBACiBfX2RlY2xzcGVjKGFsaWduKDgpKQogI2VuZGlmCiB0eXBlZGVmIHN0cnVjdCB7CisjaWYgQEZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEVACisgIHZvaWQgKnRyYW1wb2xpbmVfdGFibGU7CisgIHZvaWQgKnRyYW1wb2xpbmVfdGFibGVfZW50cnk7CisjZWxzZQogICBjaGFyIHRyYW1wW0ZGSV9UUkFNUE9MSU5FX1NJWkVdOworI2VuZGlmCiAgIGZmaV9jaWYgICAqY2lmOwogICB2b2lkICAgICAoKmZ1bikoZmZpX2NpZiosdm9pZCosdm9pZCoqLHZvaWQqKTsKICAgdm9pZCAgICAgICp1c2VyX2RhdGE7CkBAIC0yNjMsNiArMzEwLDkgQEAKIH0gZmZpX2Nsb3N1cmUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoOCkpKTsKICNlbHNlCiB9IGZmaV9jbG9zdXJlOworIyBpZmRlZiBfX3NnaQorIyAgcHJhZ21hIHBhY2sgMAorIyBlbmRpZgogI2VuZGlmCiAKIHZvaWQgKmZmaV9jbG9zdXJlX2FsbG9jIChzaXplX3Qgc2l6ZSwgdm9pZCAqKmNvZGUpOwpAQCAtMjgxLDkgKzMzMSwxNiBAQAogCQkgICAgICB2b2lkICp1c2VyX2RhdGEsCiAJCSAgICAgIHZvaWQqY29kZWxvYyk7CiAKKyNpZmRlZiBfX3NnaQorIyBwcmFnbWEgcGFjayA4CisjZW5kaWYKIHR5cGVkZWYgc3RydWN0IHsKKyNpZiBARkZJX0VYRUNfVFJBTVBPTElORV9UQUJMRUAKKyAgdm9pZCAqdHJhbXBvbGluZV90YWJsZTsKKyAgdm9pZCAqdHJhbXBvbGluZV90YWJsZV9lbnRyeTsKKyNlbHNlCiAgIGNoYXIgdHJhbXBbRkZJX1RSQU1QT0xJTkVfU0laRV07Ci0KKyNlbmRpZgogICBmZmlfY2lmICAgKmNpZjsKIAogI2lmICFGRklfTkFUSVZFX1JBV19BUEkKQEAgLTMwMyw3ICszNjAsMTIgQEAKIH0gZmZpX3Jhd19jbG9zdXJlOwogCiB0eXBlZGVmIHN0cnVjdCB7CisjaWYgQEZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEVACisgIHZvaWQgKnRyYW1wb2xpbmVfdGFibGU7CisgIHZvaWQgKnRyYW1wb2xpbmVfdGFibGVfZW50cnk7CisjZWxzZQogICBjaGFyIHRyYW1wW0ZGSV9UUkFNUE9MSU5FX1NJWkVdOworI2VuZGlmCiAKICAgZmZpX2NpZiAgICpjaWY7CiAKQEAgLTM1OSw2ICs0MjEsMTMgQEAKIAkJCWZmaV90eXBlICpydHlwZSwKIAkJCWZmaV90eXBlICoqYXR5cGVzKTsKIAorZmZpX3N0YXR1cyBmZmlfcHJlcF9jaWZfdmFyKGZmaV9jaWYgKmNpZiwKKwkJCSAgICBmZmlfYWJpIGFiaSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgbmZpeGVkYXJncywKKwkJCSAgICB1bnNpZ25lZCBpbnQgbnRvdGFsYXJncywKKwkJCSAgICBmZmlfdHlwZSAqcnR5cGUsCisJCQkgICAgZmZpX3R5cGUgKiphdHlwZXMpOworCiB2b2lkIGZmaV9jYWxsKGZmaV9jaWYgKmNpZiwKIAkgICAgICB2b2lkICgqZm4pKHZvaWQpLAogCSAgICAgIHZvaWQgKnJ2YWx1ZSwKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvaW5jbHVkZS9mZmlfY29tbW9uLmggYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2luY2x1ZGUvZmZpX2NvbW1vbi5oCmluZGV4IDQyY2FjZTkuLjY1MGNhNjkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvaW5jbHVkZS9mZmlfY29tbW9uLmgKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9pbmNsdWRlL2ZmaV9jb21tb24uaApAQCAtMSw3ICsxLDggQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICBmZmlfY29tbW9uLmggLSBDb3B5cmlnaHQgKGMpIDE5OTYgIFJlZCBIYXQsIEluYy4KLSAgIENvcHlyaWdodCAoQykgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYwotCisgICBmZmlfY29tbW9uLmggLSBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTIgIEFudGhvbnkgR3JlZW4KKyAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMjAwNyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMKKyAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMTk5NiAgUmVkIEhhdCwgSW5jLgorICAgICAgICAgICAgICAgICAgCiAgICBDb21tb24gaW50ZXJuYWwgZGVmaW5pdGlvbnMgYW5kIG1hY3Jvcy4gT25seSBuZWNlc3NhcnkgZm9yIGJ1aWxkaW5nCiAgICBsaWJmZmkuCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNzQsNiArNzUsOCBAQAogCiAvKiBQZXJmb3JtIG1hY2hpbmUgZGVwZW5kZW50IGNpZiBwcm9jZXNzaW5nICovCiBmZmlfc3RhdHVzIGZmaV9wcmVwX2NpZl9tYWNoZGVwKGZmaV9jaWYgKmNpZik7CitmZmlfc3RhdHVzIGZmaV9wcmVwX2NpZl9tYWNoZGVwX3ZhcihmZmlfY2lmICpjaWYsCisJIHVuc2lnbmVkIGludCBuZml4ZWRhcmdzLCB1bnNpZ25lZCBpbnQgbnRvdGFsYXJncyk7CiAKIC8qIEV4dGVuZGVkIGNpZiwgdXNlZCBpbiBjYWxsYmFjayBmcm9tIGFzc2VtYmx5IHJvdXRpbmUgKi8KIHR5cGVkZWYgc3RydWN0CkBAIC04NCw3ICs4Nyw3IEBACiB9IGV4dGVuZGVkX2NpZjsKIAogLyogVGVyc2Ugc2l6ZWQgdHlwZSBkZWZpbml0aW9ucy4gICovCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX3NnaSkKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fc2dpKSB8fCBkZWZpbmVkKF9fU1VOUFJPX0MpCiB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVUlOVDg7CiB0eXBlZGVmIHNpZ25lZCBjaGFyICAgU0lOVDg7CiB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVJTlQxNjsKQEAgLTExMiwxMSArMTE1LDE0IEBACiAKIHR5cGVkZWYgZmxvYXQgRkxPQVQzMjsKIAorI2lmbmRlZiBfX0dOVUNfXworI2RlZmluZSBfX2J1aWx0aW5fZXhwZWN0KHgsIGV4cGVjdGVkX3ZhbHVlKSAoeCkKKyNlbmRpZgorI2RlZmluZSBMSUtFTFkoeCkgICAgX19idWlsdGluX2V4cGVjdCghISh4KSwxKQorI2RlZmluZSBVTkxJS0VMWSh4KSAgX19idWlsdGluX2V4cGVjdCgoeCkhPTAsMCkKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKIAogI2VuZGlmCi0KLQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9pbnN0YWxsLXNoIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9pbnN0YWxsLXNoCmluZGV4IDZlYmU0NmQuLjY3ODFiOTggMTAwNzU1Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvaW5zdGFsbC1zaAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2luc3RhbGwtc2gKQEAgLTEsNyArMSw3IEBACiAjIS9iaW4vc2gKICMgaW5zdGFsbCAtIGluc3RhbGwgYSBwcm9ncmFtLCBzY3JpcHQsIG9yIGRhdGFmaWxlCiAKLXNjcmlwdHZlcnNpb249MjAwNC0xMi0xNy4wOQorc2NyaXB0dmVyc2lvbj0yMDA5LTA0LTI4LjIxOyAjIFVUQwogCiAjIFRoaXMgb3JpZ2luYXRlcyBmcm9tIFgxMVI1IChtaXQvdXRpbC9zY3JpcHRzL2luc3RhbGwuc2gpLCB3aGljaCB3YXMKICMgbGF0ZXIgcmVsZWFzZWQgaW4gWDExUjYgKHhjL2NvbmZpZy91dGlsL2luc3RhbGwuc2gpIHdpdGggdGhlCkBAIC0zOSwzOCArMzksNjggQEAKICMgd2hlbiB0aGVyZSBpcyBubyBNYWtlZmlsZS4KICMKICMgVGhpcyBzY3JpcHQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBCU0QgaW5zdGFsbCBzY3JpcHQsIGJ1dCB3YXMgd3JpdHRlbgotIyBmcm9tIHNjcmF0Y2guICBJdCBjYW4gb25seSBpbnN0YWxsIG9uZSBmaWxlIGF0IGEgdGltZSwgYSByZXN0cmljdGlvbgotIyBzaGFyZWQgd2l0aCBtYW55IE9TJ3MgaW5zdGFsbCBwcm9ncmFtcy4KKyMgZnJvbSBzY3JhdGNoLgorCitubD0nCisnCitJRlM9IiAiIgkkbmwiCiAKICMgc2V0IERPSVRQUk9HIHRvIGVjaG8gdG8gdGVzdCB0aGlzIHNjcmlwdAogCiAjIERvbid0IHVzZSA6LSBzaW5jZSA0LjNCU0QgYW5kIGVhcmxpZXIgc2hlbGxzIGRvbid0IGxpa2UgaXQuCi1kb2l0PSIke0RPSVRQUk9HLX0iCitkb2l0PSR7RE9JVFBST0ctfQoraWYgdGVzdCAteiAiJGRvaXQiOyB0aGVuCisgIGRvaXRfZXhlYz1leGVjCitlbHNlCisgIGRvaXRfZXhlYz0kZG9pdAorZmkKIAotIyBwdXQgaW4gYWJzb2x1dGUgcGF0aHMgaWYgeW91IGRvbid0IGhhdmUgdGhlbSBpbiB5b3VyIHBhdGg7IG9yIHVzZSBlbnYuIHZhcnMuCisjIFB1dCBpbiBhYnNvbHV0ZSBmaWxlIG5hbWVzIGlmIHlvdSBkb24ndCBoYXZlIHRoZW0gaW4geW91ciBwYXRoOworIyBvciB1c2UgZW52aXJvbm1lbnQgdmFycy4KIAotbXZwcm9nPSIke01WUFJPRy1tdn0iCi1jcHByb2c9IiR7Q1BQUk9HLWNwfSIKLWNobW9kcHJvZz0iJHtDSE1PRFBST0ctY2htb2R9IgotY2hvd25wcm9nPSIke0NIT1dOUFJPRy1jaG93bn0iCi1jaGdycHByb2c9IiR7Q0hHUlBQUk9HLWNoZ3JwfSIKLXN0cmlwcHJvZz0iJHtTVFJJUFBST0ctc3RyaXB9Igotcm1wcm9nPSIke1JNUFJPRy1ybX0iCi1ta2RpcnByb2c9IiR7TUtESVJQUk9HLW1rZGlyfSIKK2NoZ3JwcHJvZz0ke0NIR1JQUFJPRy1jaGdycH0KK2NobW9kcHJvZz0ke0NITU9EUFJPRy1jaG1vZH0KK2Nob3ducHJvZz0ke0NIT1dOUFJPRy1jaG93bn0KK2NtcHByb2c9JHtDTVBQUk9HLWNtcH0KK2NwcHJvZz0ke0NQUFJPRy1jcH0KK21rZGlycHJvZz0ke01LRElSUFJPRy1ta2Rpcn0KK212cHJvZz0ke01WUFJPRy1tdn0KK3JtcHJvZz0ke1JNUFJPRy1ybX0KK3N0cmlwcHJvZz0ke1NUUklQUFJPRy1zdHJpcH0KIAotY2htb2RjbWQ9IiRjaG1vZHByb2cgMDc1NSIKLWNob3duY21kPQorcG9zaXhfZ2xvYj0nPycKK2luaXRpYWxpemVfcG9zaXhfZ2xvYj0nCisgIHRlc3QgIiRwb3NpeF9nbG9iIiAhPSAiPyIgfHwgeworICAgIGlmIChzZXQgLWYpIDI+L2Rldi9udWxsOyB0aGVuCisgICAgICBwb3NpeF9nbG9iPQorICAgIGVsc2UKKyAgICAgIHBvc2l4X2dsb2I9OgorICAgIGZpCisgIH0KKycKKworcG9zaXhfbWtkaXI9CisKKyMgRGVzaXJlZCBtb2RlIG9mIGluc3RhbGxlZCBmaWxlLgorbW9kZT0wNzU1CisKIGNoZ3JwY21kPQotc3RyaXBjbWQ9CitjaG1vZGNtZD0kY2htb2Rwcm9nCitjaG93bmNtZD0KK212Y21kPSRtdnByb2cKIHJtY21kPSIkcm1wcm9nIC1mIgotbXZjbWQ9IiRtdnByb2ciCitzdHJpcGNtZD0KKwogc3JjPQogZHN0PQogZGlyX2FyZz0KLWRzdGFyZz0KK2RzdF9hcmc9CisKK2NvcHlfb25fY2hhbmdlPWZhbHNlCiBub190YXJnZXRfZGlyZWN0b3J5PQogCi11c2FnZT0iVXNhZ2U6ICQwIFtPUFRJT05dLi4uIFstVF0gU1JDRklMRSBEU1RGSUxFCit1c2FnZT0iXAorVXNhZ2U6ICQwIFtPUFRJT05dLi4uIFstVF0gU1JDRklMRSBEU1RGSUxFCiAgICBvcjogJDAgW09QVElPTl0uLi4gU1JDRklMRVMuLi4gRElSRUNUT1JZCiAgICBvcjogJDAgW09QVElPTl0uLi4gLXQgRElSRUNUT1JZIFNSQ0ZJTEVTLi4uCiAgICBvcjogJDAgW09QVElPTl0uLi4gLWQgRElSRUNUT1JJRVMuLi4KQEAgLTgwLDgxICsxMTAsODYgQEAKIEluIHRoZSA0dGgsIGNyZWF0ZSBESVJFQ1RPUklFUy4KIAogT3B0aW9uczoKLS1jICAgICAgICAgKGlnbm9yZWQpCi0tZCAgICAgICAgIGNyZWF0ZSBkaXJlY3RvcmllcyBpbnN0ZWFkIG9mIGluc3RhbGxpbmcgZmlsZXMuCi0tZyBHUk9VUCAgICRjaGdycHByb2cgaW5zdGFsbGVkIGZpbGVzIHRvIEdST1VQLgotLW0gTU9ERSAgICAkY2htb2Rwcm9nIGluc3RhbGxlZCBmaWxlcyB0byBNT0RFLgotLW8gVVNFUiAgICAkY2hvd25wcm9nIGluc3RhbGxlZCBmaWxlcyB0byBVU0VSLgotLXMgICAgICAgICAkc3RyaXBwcm9nIGluc3RhbGxlZCBmaWxlcy4KLS10IERJUkVDVE9SWSAgaW5zdGFsbCBpbnRvIERJUkVDVE9SWS4KLS1UICAgICAgICAgcmVwb3J0IGFuIGVycm9yIGlmIERTVEZJTEUgaXMgYSBkaXJlY3RvcnkuCi0tLWhlbHAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0LgotLS12ZXJzaW9uICBkaXNwbGF5IHZlcnNpb24gaW5mbyBhbmQgZXhpdC4KKyAgICAgLS1oZWxwICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdC4KKyAgICAgLS12ZXJzaW9uICBkaXNwbGF5IHZlcnNpb24gaW5mbyBhbmQgZXhpdC4KKworICAtYyAgICAgICAgICAgIChpZ25vcmVkKQorICAtQyAgICAgICAgICAgIGluc3RhbGwgb25seSBpZiBkaWZmZXJlbnQgKHByZXNlcnZlIHRoZSBsYXN0IGRhdGEgbW9kaWZpY2F0aW9uIHRpbWUpCisgIC1kICAgICAgICAgICAgY3JlYXRlIGRpcmVjdG9yaWVzIGluc3RlYWQgb2YgaW5zdGFsbGluZyBmaWxlcy4KKyAgLWcgR1JPVVAgICAgICAkY2hncnBwcm9nIGluc3RhbGxlZCBmaWxlcyB0byBHUk9VUC4KKyAgLW0gTU9ERSAgICAgICAkY2htb2Rwcm9nIGluc3RhbGxlZCBmaWxlcyB0byBNT0RFLgorICAtbyBVU0VSICAgICAgICRjaG93bnByb2cgaW5zdGFsbGVkIGZpbGVzIHRvIFVTRVIuCisgIC1zICAgICAgICAgICAgJHN0cmlwcHJvZyBpbnN0YWxsZWQgZmlsZXMuCisgIC10IERJUkVDVE9SWSAgaW5zdGFsbCBpbnRvIERJUkVDVE9SWS4KKyAgLVQgICAgICAgICAgICByZXBvcnQgYW4gZXJyb3IgaWYgRFNURklMRSBpcyBhIGRpcmVjdG9yeS4KIAogRW52aXJvbm1lbnQgdmFyaWFibGVzIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGNvbW1hbmRzOgotICBDSEdSUFBST0cgQ0hNT0RQUk9HIENIT1dOUFJPRyBDUFBST0cgTUtESVJQUk9HIE1WUFJPRyBSTVBST0cgU1RSSVBQUk9HCisgIENIR1JQUFJPRyBDSE1PRFBST0cgQ0hPV05QUk9HIENNUFBST0cgQ1BQUk9HIE1LRElSUFJPRyBNVlBST0cKKyAgUk1QUk9HIFNUUklQUFJPRwogIgogCi13aGlsZSB0ZXN0IC1uICIkMSI7IGRvCit3aGlsZSB0ZXN0ICQjIC1uZSAwOyBkbwogICBjYXNlICQxIGluCi0gICAgLWMpIHNoaWZ0Ci0gICAgICAgIGNvbnRpbnVlOzsKKyAgICAtYykgOzsKIAotICAgIC1kKSBkaXJfYXJnPXRydWUKLSAgICAgICAgc2hpZnQKLSAgICAgICAgY29udGludWU7OworICAgIC1DKSBjb3B5X29uX2NoYW5nZT10cnVlOzsKKworICAgIC1kKSBkaXJfYXJnPXRydWU7OwogCiAgICAgLWcpIGNoZ3JwY21kPSIkY2hncnBwcm9nICQyIgotICAgICAgICBzaGlmdAotICAgICAgICBzaGlmdAotICAgICAgICBjb250aW51ZTs7CisJc2hpZnQ7OwogCi0gICAgLS1oZWxwKSBlY2hvICIkdXNhZ2UiOyBleGl0IDA7OworICAgIC0taGVscCkgZWNobyAiJHVzYWdlIjsgZXhpdCAkPzs7CiAKLSAgICAtbSkgY2htb2RjbWQ9IiRjaG1vZHByb2cgJDIiCi0gICAgICAgIHNoaWZ0Ci0gICAgICAgIHNoaWZ0Ci0gICAgICAgIGNvbnRpbnVlOzsKKyAgICAtbSkgbW9kZT0kMgorCWNhc2UgJG1vZGUgaW4KKwkgIConICcqIHwgKicJJyogfCAqJworJyoJICB8IConKicqIHwgKic/JyogfCAqJ1snKikKKwkgICAgZWNobyAiJDA6IGludmFsaWQgbW9kZTogJG1vZGUiID4mMgorCSAgICBleGl0IDE7OworCWVzYWMKKwlzaGlmdDs7CiAKICAgICAtbykgY2hvd25jbWQ9IiRjaG93bnByb2cgJDIiCi0gICAgICAgIHNoaWZ0Ci0gICAgICAgIHNoaWZ0Ci0gICAgICAgIGNvbnRpbnVlOzsKKwlzaGlmdDs7CiAKLSAgICAtcykgc3RyaXBjbWQ9JHN0cmlwcHJvZwotICAgICAgICBzaGlmdAotICAgICAgICBjb250aW51ZTs7CisgICAgLXMpIHN0cmlwY21kPSRzdHJpcHByb2c7OwogCi0gICAgLXQpIGRzdGFyZz0kMgotCXNoaWZ0Ci0Jc2hpZnQKLQljb250aW51ZTs7CisgICAgLXQpIGRzdF9hcmc9JDIKKwlzaGlmdDs7CiAKLSAgICAtVCkgbm9fdGFyZ2V0X2RpcmVjdG9yeT10cnVlCi0Jc2hpZnQKLQljb250aW51ZTs7CisgICAgLVQpIG5vX3RhcmdldF9kaXJlY3Rvcnk9dHJ1ZTs7CiAKLSAgICAtLXZlcnNpb24pIGVjaG8gIiQwICRzY3JpcHR2ZXJzaW9uIjsgZXhpdCAwOzsKKyAgICAtLXZlcnNpb24pIGVjaG8gIiQwICRzY3JpcHR2ZXJzaW9uIjsgZXhpdCAkPzs7CiAKLSAgICAqKSAgIyBXaGVuIC1kIGlzIHVzZWQsIGFsbCByZW1haW5pbmcgYXJndW1lbnRzIGFyZSBkaXJlY3RvcmllcyB0byBjcmVhdGUuCi0JIyBXaGVuIC10IGlzIHVzZWQsIHRoZSBkZXN0aW5hdGlvbiBpcyBhbHJlYWR5IHNwZWNpZmllZC4KLQl0ZXN0IC1uICIkZGlyX2FyZyRkc3RhcmciICYmIGJyZWFrCi0gICAgICAgICMgT3RoZXJ3aXNlLCB0aGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgZGVzdGluYXRpb24uICBSZW1vdmUgaXQgZnJvbSAkQC4KLQlmb3IgYXJnCi0JZG8KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkZHN0YXJnIjsgdGhlbgotCSAgICAjICRAIGlzIG5vdCBlbXB0eTogaXQgY29udGFpbnMgYXQgbGVhc3QgJGFyZy4KLQkgICAgc2V0IGZub3JkICIkQCIgIiRkc3RhcmciCi0JICAgIHNoaWZ0ICMgZm5vcmQKLQkgIGZpCi0JICBzaGlmdCAjIGFyZwotCSAgZHN0YXJnPSRhcmcKLQlkb25lCisgICAgLS0pCXNoaWZ0CiAJYnJlYWs7OworCisgICAgLSopCWVjaG8gIiQwOiBpbnZhbGlkIG9wdGlvbjogJDEiID4mMgorCWV4aXQgMTs7CisKKyAgICAqKSAgYnJlYWs7OwogICBlc2FjCisgIHNoaWZ0CiBkb25lCiAKLWlmIHRlc3QgLXogIiQxIjsgdGhlbgoraWYgdGVzdCAkIyAtbmUgMCAmJiB0ZXN0IC16ICIkZGlyX2FyZyRkc3RfYXJnIjsgdGhlbgorICAjIFdoZW4gLWQgaXMgdXNlZCwgYWxsIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIGRpcmVjdG9yaWVzIHRvIGNyZWF0ZS4KKyAgIyBXaGVuIC10IGlzIHVzZWQsIHRoZSBkZXN0aW5hdGlvbiBpcyBhbHJlYWR5IHNwZWNpZmllZC4KKyAgIyBPdGhlcndpc2UsIHRoZSBsYXN0IGFyZ3VtZW50IGlzIHRoZSBkZXN0aW5hdGlvbi4gIFJlbW92ZSBpdCBmcm9tICRALgorICBmb3IgYXJnCisgIGRvCisgICAgaWYgdGVzdCAtbiAiJGRzdF9hcmciOyB0aGVuCisgICAgICAjICRAIGlzIG5vdCBlbXB0eTogaXQgY29udGFpbnMgYXQgbGVhc3QgJGFyZy4KKyAgICAgIHNldCBmbm9yZCAiJEAiICIkZHN0X2FyZyIKKyAgICAgIHNoaWZ0ICMgZm5vcmQKKyAgICBmaQorICAgIHNoaWZ0ICMgYXJnCisgICAgZHN0X2FyZz0kYXJnCisgIGRvbmUKK2ZpCisKK2lmIHRlc3QgJCMgLWVxIDA7IHRoZW4KICAgaWYgdGVzdCAteiAiJGRpcl9hcmciOyB0aGVuCiAgICAgZWNobyAiJDA6IG5vIGlucHV0IGZpbGUgc3BlY2lmaWVkLiIgPiYyCiAgICAgZXhpdCAxCkBAIC0xNjQsMjQgKzE5OSw0NyBAQAogICBleGl0IDAKIGZpCiAKK2lmIHRlc3QgLXogIiRkaXJfYXJnIjsgdGhlbgorICB0cmFwICcoZXhpdCAkPyk7IGV4aXQnIDEgMiAxMyAxNQorCisgICMgU2V0IHVtYXNrIHNvIGFzIG5vdCB0byBjcmVhdGUgdGVtcHMgd2l0aCB0b28tZ2VuZXJvdXMgbW9kZXMuCisgICMgSG93ZXZlciwgJ3N0cmlwJyByZXF1aXJlcyBib3RoIHJlYWQgYW5kIHdyaXRlIGFjY2VzcyB0byB0ZW1wcy4KKyAgY2FzZSAkbW9kZSBpbgorICAgICMgT3B0aW1pemUgY29tbW9uIGNhc2VzLgorICAgICo2NDQpIGNwX3VtYXNrPTEzMzs7CisgICAgKjc1NSkgY3BfdW1hc2s9MjI7OworCisgICAgKlswLTddKQorICAgICAgaWYgdGVzdCAteiAiJHN0cmlwY21kIjsgdGhlbgorCXVfcGx1c19ydz0KKyAgICAgIGVsc2UKKwl1X3BsdXNfcnc9JyUgMjAwJworICAgICAgZmkKKyAgICAgIGNwX3VtYXNrPWBleHByICcoJyA3NzcgLSAkbW9kZSAlIDEwMDAgJyknICR1X3BsdXNfcndgOzsKKyAgICAqKQorICAgICAgaWYgdGVzdCAteiAiJHN0cmlwY21kIjsgdGhlbgorCXVfcGx1c19ydz0KKyAgICAgIGVsc2UKKwl1X3BsdXNfcnc9LHUrcncKKyAgICAgIGZpCisgICAgICBjcF91bWFzaz0kbW9kZSR1X3BsdXNfcnc7OworICBlc2FjCitmaQorCiBmb3Igc3JjCiBkbwogICAjIFByb3RlY3QgbmFtZXMgc3RhcnRpbmcgd2l0aCBgLScuCiAgIGNhc2UgJHNyYyBpbgotICAgIC0qKSBzcmM9Li8kc3JjIDs7CisgICAgLSopIHNyYz0uLyRzcmM7OwogICBlc2FjCiAKICAgaWYgdGVzdCAtbiAiJGRpcl9hcmciOyB0aGVuCiAgICAgZHN0PSRzcmMKLSAgICBzcmM9Ci0KLSAgICBpZiB0ZXN0IC1kICIkZHN0IjsgdGhlbgotICAgICAgbWtkaXJjbWQ9OgotICAgICAgY2htb2RjbWQ9Ci0gICAgZWxzZQotICAgICAgbWtkaXJjbWQ9JG1rZGlycHJvZwotICAgIGZpCisgICAgZHN0ZGlyPSRkc3QKKyAgICB0ZXN0IC1kICIkZHN0ZGlyIgorICAgIGRzdGRpcl9zdGF0dXM9JD8KICAgZWxzZQorCiAgICAgIyBXYWl0aW5nIGZvciB0aGlzIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSAiJGNwcHJvZyAkc3JjICRkc3R0bXAiIGNvbW1hbmQKICAgICAjIG1pZ2h0IGNhdXNlIGRpcmVjdG9yaWVzIHRvIGJlIGNyZWF0ZWQsIHdoaWNoIHdvdWxkIGJlIGVzcGVjaWFsbHkgYmFkCiAgICAgIyBpZiAkc3JjIChhbmQgdGh1cyAkZHN0dG1wKSBjb250YWlucyAnKicuCkBAIC0xOTAsNzEgKzI0OCwxOTkgQEAKICAgICAgIGV4aXQgMQogICAgIGZpCiAKLSAgICBpZiB0ZXN0IC16ICIkZHN0YXJnIjsgdGhlbgorICAgIGlmIHRlc3QgLXogIiRkc3RfYXJnIjsgdGhlbgogICAgICAgZWNobyAiJDA6IG5vIGRlc3RpbmF0aW9uIHNwZWNpZmllZC4iID4mMgogICAgICAgZXhpdCAxCiAgICAgZmkKIAotICAgIGRzdD0kZHN0YXJnCisgICAgZHN0PSRkc3RfYXJnCiAgICAgIyBQcm90ZWN0IG5hbWVzIHN0YXJ0aW5nIHdpdGggYC0nLgogICAgIGNhc2UgJGRzdCBpbgotICAgICAgLSopIGRzdD0uLyRkc3QgOzsKKyAgICAgIC0qKSBkc3Q9Li8kZHN0OzsKICAgICBlc2FjCiAKICAgICAjIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyB3b24ndCB3b3JrCiAgICAgIyBpZiBkb3VibGUgc2xhc2hlcyBhcmVuJ3QgaWdub3JlZC4KICAgICBpZiB0ZXN0IC1kICIkZHN0IjsgdGhlbgogICAgICAgaWYgdGVzdCAtbiAiJG5vX3RhcmdldF9kaXJlY3RvcnkiOyB0aGVuCi0JZWNobyAiJDA6ICRkc3Rhcmc6IElzIGEgZGlyZWN0b3J5IiA+JjIKKwllY2hvICIkMDogJGRzdF9hcmc6IElzIGEgZGlyZWN0b3J5IiA+JjIKIAlleGl0IDEKICAgICAgIGZpCi0gICAgICBkc3Q9JGRzdC9gYmFzZW5hbWUgIiRzcmMiYAorICAgICAgZHN0ZGlyPSRkc3QKKyAgICAgIGRzdD0kZHN0ZGlyL2BiYXNlbmFtZSAiJHNyYyJgCisgICAgICBkc3RkaXJfc3RhdHVzPTAKKyAgICBlbHNlCisgICAgICAjIFByZWZlciBkaXJuYW1lLCBidXQgZmFsbCBiYWNrIG9uIGEgc3Vic3RpdHV0ZSBpZiBkaXJuYW1lIGZhaWxzLgorICAgICAgZHN0ZGlyPWAKKwkoZGlybmFtZSAiJGRzdCIpIDI+L2Rldi9udWxsIHx8CisJZXhwciBYIiRkc3QiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJICAgICBYIiRkc3QiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJICAgICBYIiRkc3QiIDogJ1hcKC8vXCkkJyBcfCBcCisJICAgICBYIiRkc3QiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorCWVjaG8gWCIkZHN0IiB8CisJICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJCSAgIHMvL1wxLworCQkgICBxCisJCSB9CisJCSAvXlhcKFwvXC9cKVteL10uKi97CisJCSAgIHMvL1wxLworCQkgICBxCisJCSB9CisJCSAvXlhcKFwvXC9cKSQveworCQkgICBzLy9cMS8KKwkJICAgcQorCQkgfQorCQkgL15YXChcL1wpLioveworCQkgICBzLy9cMS8KKwkJICAgcQorCQkgfQorCQkgcy8uKi8uLzsgcScKKyAgICAgIGAKKworICAgICAgdGVzdCAtZCAiJGRzdGRpciIKKyAgICAgIGRzdGRpcl9zdGF0dXM9JD8KICAgICBmaQogICBmaQogCi0gICMgVGhpcyBzZWQgY29tbWFuZCBlbXVsYXRlcyB0aGUgZGlybmFtZSBjb21tYW5kLgotICBkc3RkaXI9YGVjaG8gIiRkc3QiIHwgc2VkIC1lICdzLC8qJCwsO3MsW14vXSokLCw7cywvKiQsLDtzLF4kLC4sJ2AKKyAgb2Jzb2xldGVfbWtkaXJfdXNlZD1mYWxzZQogCi0gICMgTWFrZSBzdXJlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHMuCisgIGlmIHRlc3QgJGRzdGRpcl9zdGF0dXMgIT0gMDsgdGhlbgorICAgIGNhc2UgJHBvc2l4X21rZGlyIGluCisgICAgICAnJykKKwkjIENyZWF0ZSBpbnRlcm1lZGlhdGUgZGlycyB1c2luZyBtb2RlIDc1NSBhcyBtb2RpZmllZCBieSB0aGUgdW1hc2suCisJIyBUaGlzIGlzIGxpa2UgRnJlZUJTRCAnaW5zdGFsbCcgYXMgb2YgMTk5Ny0xMC0yOC4KKwl1bWFzaz1gdW1hc2tgCisJY2FzZSAkc3RyaXBjbWQuJHVtYXNrIGluCisJICAjIE9wdGltaXplIGNvbW1vbiBjYXNlcy4KKwkgICpbMjM2N11bMjM2N10pIG1rZGlyX3VtYXNrPSR1bWFzazs7CisJICAuKjBbMDJdWzAyXSB8IC5bMDJdWzAyXSB8IC5bMDJdKSBta2Rpcl91bWFzaz0yMjs7CiAKLSAgIyBTa2lwIGxvdHMgb2Ygc3RhdCBjYWxscyBpbiB0aGUgdXN1YWwgY2FzZS4KLSAgaWYgdGVzdCAhIC1kICIkZHN0ZGlyIjsgdGhlbgotICAgIGRlZmF1bHRJRlM9JwotCSAnCi0gICAgSUZTPSIke0lGUy0kZGVmYXVsdElGU30iCisJICAqWzAtN10pCisJICAgIG1rZGlyX3VtYXNrPWBleHByICR1bWFzayArIDIyIFwKKwkgICAgICAtICR1bWFzayAlIDEwMCAlIDQwICsgJHVtYXNrICUgMjAgXAorCSAgICAgIC0gJHVtYXNrICUgMTAgJSA0ICsgJHVtYXNrICUgMgorCSAgICBgOzsKKwkgICopIG1rZGlyX3VtYXNrPSR1bWFzayxnby13OzsKKwllc2FjCiAKLSAgICBvSUZTPSRJRlMKLSAgICAjIFNvbWUgc2gncyBjYW4ndCBoYW5kbGUgSUZTPS8gZm9yIHNvbWUgcmVhc29uLgotICAgIElGUz0nJScKLSAgICBzZXQgeCBgZWNobyAiJGRzdGRpciIgfCBzZWQgLWUgJ3NAL0AlQGcnIC1lICdzQF4lQC9AJ2AKLSAgICBzaGlmdAotICAgIElGUz0kb0lGUworCSMgV2l0aCAtZCwgY3JlYXRlIHRoZSBuZXcgZGlyZWN0b3J5IHdpdGggdGhlIHVzZXItc3BlY2lmaWVkIG1vZGUuCisJIyBPdGhlcndpc2UsIHJlbHkgb24gJG1rZGlyX3VtYXNrLgorCWlmIHRlc3QgLW4gIiRkaXJfYXJnIjsgdGhlbgorCSAgbWtkaXJfbW9kZT0tbSRtb2RlCisJZWxzZQorCSAgbWtkaXJfbW9kZT0KKwlmaQogCi0gICAgcGF0aGNvbXA9CisJcG9zaXhfbWtkaXI9ZmFsc2UKKwljYXNlICR1bWFzayBpbgorCSAgKlsxMjM1NjddWzAtN11bMC03XSkKKwkgICAgIyBQT1NJWCBta2RpciAtcCBzZXRzIHUrd3ggYml0cyByZWdhcmRsZXNzIG9mIHVtYXNrLCB3aGljaAorCSAgICAjIGlzIGluY29tcGF0aWJsZSB3aXRoIEZyZWVCU0QgJ2luc3RhbGwnIHdoZW4gKHVtYXNrICYgMzAwKSAhPSAwLgorCSAgICA7OworCSAgKikKKwkgICAgdG1wZGlyPSR7VE1QRElSLS90bXB9L2lucyRSQU5ET00tJCQKKwkgICAgdHJhcCAncmV0PSQ/OyBybWRpciAiJHRtcGRpci9kIiAiJHRtcGRpciIgMj4vZGV2L251bGw7IGV4aXQgJHJldCcgMAogCi0gICAgd2hpbGUgdGVzdCAkIyAtbmUgMCA7IGRvCi0gICAgICBwYXRoY29tcD0kcGF0aGNvbXAkMQorCSAgICBpZiAodW1hc2sgJG1rZGlyX3VtYXNrICYmCisJCWV4ZWMgJG1rZGlycHJvZyAkbWtkaXJfbW9kZSAtcCAtLSAiJHRtcGRpci9kIikgPi9kZXYvbnVsbCAyPiYxCisJICAgIHRoZW4KKwkgICAgICBpZiB0ZXN0IC16ICIkZGlyX2FyZyIgfHwgeworCQkgICAjIENoZWNrIGZvciBQT1NJWCBpbmNvbXBhdGliaWxpdGllcyB3aXRoIC1tLgorCQkgICAjIEhQLVVYIDExLjIzIGFuZCBJUklYIDYuNSBta2RpciAtbSAtcCBzZXRzIGdyb3VwLSBvcgorCQkgICAjIG90aGVyLXdyaXRlYWJsZSBiaXQgb2YgcGFyZW50IGRpcmVjdG9yeSB3aGVuIGl0IHNob3VsZG4ndC4KKwkJICAgIyBGcmVlQlNEIDYuMSBta2RpciAtbSAtcCBzZXRzIG1vZGUgb2YgZXhpc3RpbmcgZGlyZWN0b3J5LgorCQkgICBsc19sZF90bXBkaXI9YGxzIC1sZCAiJHRtcGRpciJgCisJCSAgIGNhc2UgJGxzX2xkX3RtcGRpciBpbgorCQkgICAgIGQ/Pz8/LT9yLSopIGRpZmZlcmVudF9tb2RlPTcwMDs7CisJCSAgICAgZD8/Pz8tPy0tKikgZGlmZmVyZW50X21vZGU9NzU1OzsKKwkJICAgICAqKSBmYWxzZTs7CisJCSAgIGVzYWMgJiYKKwkJICAgJG1rZGlycHJvZyAtbSRkaWZmZXJlbnRfbW9kZSAtcCAtLSAiJHRtcGRpciIgJiYgeworCQkgICAgIGxzX2xkX3RtcGRpcl8xPWBscyAtbGQgIiR0bXBkaXIiYAorCQkgICAgIHRlc3QgIiRsc19sZF90bXBkaXIiID0gIiRsc19sZF90bXBkaXJfMSIKKwkJICAgfQorCQkgfQorCSAgICAgIHRoZW4gcG9zaXhfbWtkaXI9OgorCSAgICAgIGZpCisJICAgICAgcm1kaXIgIiR0bXBkaXIvZCIgIiR0bXBkaXIiCisJICAgIGVsc2UKKwkgICAgICAjIFJlbW92ZSBhbnkgZGlycyBsZWZ0IGJlaGluZCBieSBhbmNpZW50IG1rZGlyIGltcGxlbWVudGF0aW9ucy4KKwkgICAgICBybWRpciAuLyRta2Rpcl9tb2RlIC4vLXAgLi8tLSAyPi9kZXYvbnVsbAorCSAgICBmaQorCSAgICB0cmFwICcnIDA7OworCWVzYWM7OworICAgIGVzYWMKKworICAgIGlmCisgICAgICAkcG9zaXhfbWtkaXIgJiYgKAorCXVtYXNrICRta2Rpcl91bWFzayAmJgorCSRkb2l0X2V4ZWMgJG1rZGlycHJvZyAkbWtkaXJfbW9kZSAtcCAtLSAiJGRzdGRpciIKKyAgICAgICkKKyAgICB0aGVuIDoKKyAgICBlbHNlCisKKyAgICAgICMgVGhlIHVtYXNrIGlzIHJpZGljdWxvdXMsIG9yIG1rZGlyIGRvZXMgbm90IGNvbmZvcm0gdG8gUE9TSVgsCisgICAgICAjIG9yIGl0IGZhaWxlZCBwb3NzaWJseSBkdWUgdG8gYSByYWNlIGNvbmRpdGlvbi4gIENyZWF0ZSB0aGUKKyAgICAgICMgZGlyZWN0b3J5IHRoZSBzbG93IHdheSwgc3RlcCBieSBzdGVwLCBjaGVja2luZyBmb3IgcmFjZXMgYXMgd2UgZ28uCisKKyAgICAgIGNhc2UgJGRzdGRpciBpbgorCS8qKSBwcmVmaXg9Jy8nOzsKKwktKikgcHJlZml4PScuLyc7OworCSopICBwcmVmaXg9Jyc7OworICAgICAgZXNhYworCisgICAgICBldmFsICIkaW5pdGlhbGl6ZV9wb3NpeF9nbG9iIgorCisgICAgICBvSUZTPSRJRlMKKyAgICAgIElGUz0vCisgICAgICAkcG9zaXhfZ2xvYiBzZXQgLWYKKyAgICAgIHNldCBmbm9yZCAkZHN0ZGlyCiAgICAgICBzaGlmdAotICAgICAgaWYgdGVzdCAhIC1kICIkcGF0aGNvbXAiOyB0aGVuCi0gICAgICAgICRta2RpcnByb2cgIiRwYXRoY29tcCIKLQkjIG1rZGlyIGNhbiBmYWlsIHdpdGggYSBgRmlsZSBleGlzdCcgZXJyb3IgaW4gY2FzZSBzZXZlcmFsCi0JIyBpbnN0YWxsLXNoIGFyZSBjcmVhdGluZyB0aGUgZGlyZWN0b3J5IGNvbmN1cnJlbnRseS4gIFRoaXMKLQkjIGlzIE9LLgotCXRlc3QgLWQgIiRwYXRoY29tcCIgfHwgZXhpdAorICAgICAgJHBvc2l4X2dsb2Igc2V0ICtmCisgICAgICBJRlM9JG9JRlMKKworICAgICAgcHJlZml4ZXM9CisKKyAgICAgIGZvciBkCisgICAgICBkbworCXRlc3QgLXogIiRkIiAmJiBjb250aW51ZQorCisJcHJlZml4PSRwcmVmaXgkZAorCWlmIHRlc3QgLWQgIiRwcmVmaXgiOyB0aGVuCisJICBwcmVmaXhlcz0KKwllbHNlCisJICBpZiAkcG9zaXhfbWtkaXI7IHRoZW4KKwkgICAgKHVtYXNrPSRta2Rpcl91bWFzayAmJgorCSAgICAgJGRvaXRfZXhlYyAkbWtkaXJwcm9nICRta2Rpcl9tb2RlIC1wIC0tICIkZHN0ZGlyIikgJiYgYnJlYWsKKwkgICAgIyBEb24ndCBmYWlsIGlmIHR3byBpbnN0YW5jZXMgYXJlIHJ1bm5pbmcgY29uY3VycmVudGx5LgorCSAgICB0ZXN0IC1kICIkcHJlZml4IiB8fCBleGl0IDEKKwkgIGVsc2UKKwkgICAgY2FzZSAkcHJlZml4IGluCisJICAgICAgKlwnKikgcXByZWZpeD1gZWNobyAiJHByZWZpeCIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OworCSAgICAgICopIHFwcmVmaXg9JHByZWZpeDs7CisJICAgIGVzYWMKKwkgICAgcHJlZml4ZXM9IiRwcmVmaXhlcyAnJHFwcmVmaXgnIgorCSAgZmkKKwlmaQorCXByZWZpeD0kcHJlZml4LworICAgICAgZG9uZQorCisgICAgICBpZiB0ZXN0IC1uICIkcHJlZml4ZXMiOyB0aGVuCisJIyBEb24ndCBmYWlsIGlmIHR3byBpbnN0YW5jZXMgYXJlIHJ1bm5pbmcgY29uY3VycmVudGx5LgorCSh1bWFzayAkbWtkaXJfdW1hc2sgJiYKKwkgZXZhbCAiXCRkb2l0X2V4ZWMgXCRta2RpcnByb2cgJHByZWZpeGVzIikgfHwKKwkgIHRlc3QgLWQgIiRkc3RkaXIiIHx8IGV4aXQgMQorCW9ic29sZXRlX21rZGlyX3VzZWQ9dHJ1ZQogICAgICAgZmkKLSAgICAgIHBhdGhjb21wPSRwYXRoY29tcC8KLSAgICBkb25lCisgICAgZmkKICAgZmkKIAogICBpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KLSAgICAkZG9pdCAkbWtkaXJjbWQgIiRkc3QiIFwKLSAgICAgICYmIHsgdGVzdCAteiAiJGNob3duY21kIiB8fCAkZG9pdCAkY2hvd25jbWQgIiRkc3QiOyB9IFwKLSAgICAgICYmIHsgdGVzdCAteiAiJGNoZ3JwY21kIiB8fCAkZG9pdCAkY2hncnBjbWQgIiRkc3QiOyB9IFwKLSAgICAgICYmIHsgdGVzdCAteiAiJHN0cmlwY21kIiB8fCAkZG9pdCAkc3RyaXBjbWQgIiRkc3QiOyB9IFwKLSAgICAgICYmIHsgdGVzdCAteiAiJGNobW9kY21kIiB8fCAkZG9pdCAkY2htb2RjbWQgIiRkc3QiOyB9Ci0KKyAgICB7IHRlc3QgLXogIiRjaG93bmNtZCIgfHwgJGRvaXQgJGNob3duY21kICIkZHN0IjsgfSAmJgorICAgIHsgdGVzdCAteiAiJGNoZ3JwY21kIiB8fCAkZG9pdCAkY2hncnBjbWQgIiRkc3QiOyB9ICYmCisgICAgeyB0ZXN0ICIkb2Jzb2xldGVfbWtkaXJfdXNlZCRjaG93bmNtZCRjaGdycGNtZCIgPSBmYWxzZSB8fAorICAgICAgdGVzdCAteiAiJGNobW9kY21kIiB8fCAkZG9pdCAkY2htb2RjbWQgJG1vZGUgIiRkc3QiOyB9IHx8IGV4aXQgMQogICBlbHNlCi0gICAgZHN0ZmlsZT1gYmFzZW5hbWUgIiRkc3QiYAogCiAgICAgIyBNYWtlIGEgY291cGxlIG9mIHRlbXAgZmlsZSBuYW1lcyBpbiB0aGUgcHJvcGVyIGRpcmVjdG9yeS4KICAgICBkc3R0bXA9JGRzdGRpci9faW5zdC4kJF8KQEAgLTI2MiwxMCArNDQ4LDkgQEAKIAogICAgICMgVHJhcCB0byBjbGVhbiB1cCB0aG9zZSB0ZW1wIGZpbGVzIGF0IGV4aXQuCiAgICAgdHJhcCAncmV0PSQ/OyBybSAtZiAiJGRzdHRtcCIgIiRybXRtcCIgJiYgZXhpdCAkcmV0JyAwCi0gICAgdHJhcCAnKGV4aXQgJD8pOyBleGl0JyAxIDIgMTMgMTUKIAogICAgICMgQ29weSB0aGUgZmlsZSBuYW1lIHRvIHRoZSB0ZW1wIG5hbWUuCi0gICAgJGRvaXQgJGNwcHJvZyAiJHNyYyIgIiRkc3R0bXAiICYmCisgICAgKHVtYXNrICRjcF91bWFzayAmJiAkZG9pdF9leGVjICRjcHByb2cgIiRzcmMiICIkZHN0dG1wIikgJiYKIAogICAgICMgYW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cy4KICAgICAjCkBAIC0yNzMsNTEgKzQ1OCw2MyBAQAogICAgICMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQogICAgICMgZXJyb3JzIGZyb20gdGhlIGFib3ZlICIkZG9pdCAkY3Bwcm9nICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KICAgICAjCi0gICAgeyB0ZXN0IC16ICIkY2hvd25jbWQiIHx8ICRkb2l0ICRjaG93bmNtZCAiJGRzdHRtcCI7IH0gXAotICAgICAgJiYgeyB0ZXN0IC16ICIkY2hncnBjbWQiIHx8ICRkb2l0ICRjaGdycGNtZCAiJGRzdHRtcCI7IH0gXAotICAgICAgJiYgeyB0ZXN0IC16ICIkc3RyaXBjbWQiIHx8ICRkb2l0ICRzdHJpcGNtZCAiJGRzdHRtcCI7IH0gXAotICAgICAgJiYgeyB0ZXN0IC16ICIkY2htb2RjbWQiIHx8ICRkb2l0ICRjaG1vZGNtZCAiJGRzdHRtcCI7IH0gJiYKKyAgICB7IHRlc3QgLXogIiRjaG93bmNtZCIgfHwgJGRvaXQgJGNob3duY21kICIkZHN0dG1wIjsgfSAmJgorICAgIHsgdGVzdCAteiAiJGNoZ3JwY21kIiB8fCAkZG9pdCAkY2hncnBjbWQgIiRkc3R0bXAiOyB9ICYmCisgICAgeyB0ZXN0IC16ICIkc3RyaXBjbWQiIHx8ICRkb2l0ICRzdHJpcGNtZCAiJGRzdHRtcCI7IH0gJiYKKyAgICB7IHRlc3QgLXogIiRjaG1vZGNtZCIgfHwgJGRvaXQgJGNobW9kY21kICRtb2RlICIkZHN0dG1wIjsgfSAmJgogCi0gICAgIyBOb3cgcmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgotICAgIHsgJGRvaXQgJG12Y21kIC1mICIkZHN0dG1wIiAiJGRzdGRpci8kZHN0ZmlsZSIgMj4vZGV2L251bGwgXAotICAgICAgfHwgewotCSAgICMgVGhlIHJlbmFtZSBmYWlsZWQsIHBlcmhhcHMgYmVjYXVzZSBtdiBjYW4ndCByZW5hbWUgc29tZXRoaW5nIGVsc2UKLQkgICAjIHRvIGl0c2VsZiwgb3IgcGVyaGFwcyBiZWNhdXNlIG12IGlzIHNvIGFuY2llbnQgdGhhdCBpdCBkb2VzIG5vdAotCSAgICMgc3VwcG9ydCAtZi4KKyAgICAjIElmIC1DLCBkb24ndCBib3RoZXIgdG8gY29weSBpZiBpdCB3b3VsZG4ndCBjaGFuZ2UgdGhlIGZpbGUuCisgICAgaWYgJGNvcHlfb25fY2hhbmdlICYmCisgICAgICAgb2xkPWBMQ19BTEw9QyBscyAtZGxMICIkZHN0IgkyPi9kZXYvbnVsbGAgJiYKKyAgICAgICBuZXc9YExDX0FMTD1DIGxzIC1kbEwgIiRkc3R0bXAiCTI+L2Rldi9udWxsYCAmJgogCi0JICAgIyBOb3cgcmVtb3ZlIG9yIG1vdmUgYXNpZGUgYW55IG9sZCBmaWxlIGF0IGRlc3RpbmF0aW9uIGxvY2F0aW9uLgotCSAgICMgV2UgdHJ5IHRoaXMgdHdvIHdheXMgc2luY2Ugcm0gY2FuJ3QgdW5saW5rIGl0c2VsZiBvbiBzb21lCi0JICAgIyBzeXN0ZW1zIGFuZCB0aGUgZGVzdGluYXRpb24gZmlsZSBtaWdodCBiZSBidXN5IGZvciBvdGhlcgotCSAgICMgcmVhc29ucy4gIEluIHRoaXMgY2FzZSwgdGhlIGZpbmFsIGNsZWFudXAgbWlnaHQgZmFpbCBidXQgdGhlIG5ldwotCSAgICMgZmlsZSBzaG91bGQgc3RpbGwgaW5zdGFsbCBzdWNjZXNzZnVsbHkuCi0JICAgewotCSAgICAgaWYgdGVzdCAtZiAiJGRzdGRpci8kZHN0ZmlsZSI7IHRoZW4KLQkgICAgICAgJGRvaXQgJHJtY21kIC1mICIkZHN0ZGlyLyRkc3RmaWxlIiAyPi9kZXYvbnVsbCBcCi0JICAgICAgIHx8ICRkb2l0ICRtdmNtZCAtZiAiJGRzdGRpci8kZHN0ZmlsZSIgIiRybXRtcCIgMj4vZGV2L251bGwgXAotCSAgICAgICB8fCB7Ci0JCSBlY2hvICIkMDogY2Fubm90IHVubGluayBvciByZW5hbWUgJGRzdGRpci8kZHN0ZmlsZSIgPiYyCi0JCSAoZXhpdCAxKTsgZXhpdCAxCi0JICAgICAgIH0KLQkgICAgIGVsc2UKLQkgICAgICAgOgotCSAgICAgZmkKLQkgICB9ICYmCisgICAgICAgZXZhbCAiJGluaXRpYWxpemVfcG9zaXhfZ2xvYiIgJiYKKyAgICAgICAkcG9zaXhfZ2xvYiBzZXQgLWYgJiYKKyAgICAgICBzZXQgWCAkb2xkICYmIG9sZD06JDI6JDQ6JDU6JDYgJiYKKyAgICAgICBzZXQgWCAkbmV3ICYmIG5ldz06JDI6JDQ6JDU6JDYgJiYKKyAgICAgICAkcG9zaXhfZ2xvYiBzZXQgK2YgJiYKIAotCSAgICMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KLQkgICAkZG9pdCAkbXZjbWQgIiRkc3R0bXAiICIkZHN0ZGlyLyRkc3RmaWxlIgotCSB9Ci0gICAgfQotICBmaSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KKyAgICAgICB0ZXN0ICIkb2xkIiA9ICIkbmV3IiAmJgorICAgICAgICRjbXBwcm9nICIkZHN0IiAiJGRzdHRtcCIgPi9kZXYvbnVsbCAyPiYxCisgICAgdGhlbgorICAgICAgcm0gLWYgIiRkc3R0bXAiCisgICAgZWxzZQorICAgICAgIyBSZW5hbWUgdGhlIGZpbGUgdG8gdGhlIHJlYWwgZGVzdGluYXRpb24uCisgICAgICAkZG9pdCAkbXZjbWQgLWYgIiRkc3R0bXAiICIkZHN0IiAyPi9kZXYvbnVsbCB8fAorCisgICAgICAjIFRoZSByZW5hbWUgZmFpbGVkLCBwZXJoYXBzIGJlY2F1c2UgbXYgY2FuJ3QgcmVuYW1lIHNvbWV0aGluZyBlbHNlCisgICAgICAjIHRvIGl0c2VsZiwgb3IgcGVyaGFwcyBiZWNhdXNlIG12IGlzIHNvIGFuY2llbnQgdGhhdCBpdCBkb2VzIG5vdAorICAgICAgIyBzdXBwb3J0IC1mLgorICAgICAgeworCSMgTm93IHJlbW92ZSBvciBtb3ZlIGFzaWRlIGFueSBvbGQgZmlsZSBhdCBkZXN0aW5hdGlvbiBsb2NhdGlvbi4KKwkjIFdlIHRyeSB0aGlzIHR3byB3YXlzIHNpbmNlIHJtIGNhbid0IHVubGluayBpdHNlbGYgb24gc29tZQorCSMgc3lzdGVtcyBhbmQgdGhlIGRlc3RpbmF0aW9uIGZpbGUgbWlnaHQgYmUgYnVzeSBmb3Igb3RoZXIKKwkjIHJlYXNvbnMuICBJbiB0aGlzIGNhc2UsIHRoZSBmaW5hbCBjbGVhbnVwIG1pZ2h0IGZhaWwgYnV0IHRoZSBuZXcKKwkjIGZpbGUgc2hvdWxkIHN0aWxsIGluc3RhbGwgc3VjY2Vzc2Z1bGx5LgorCXsKKwkgIHRlc3QgISAtZiAiJGRzdCIgfHwKKwkgICRkb2l0ICRybWNtZCAtZiAiJGRzdCIgMj4vZGV2L251bGwgfHwKKwkgIHsgJGRvaXQgJG12Y21kIC1mICIkZHN0IiAiJHJtdG1wIiAyPi9kZXYvbnVsbCAmJgorCSAgICB7ICRkb2l0ICRybWNtZCAtZiAiJHJtdG1wIiAyPi9kZXYvbnVsbDsgOjsgfQorCSAgfSB8fAorCSAgeyBlY2hvICIkMDogY2Fubm90IHVubGluayBvciByZW5hbWUgJGRzdCIgPiYyCisJICAgIChleGl0IDEpOyBleGl0IDEKKwkgIH0KKwl9ICYmCisKKwkjIE5vdyByZW5hbWUgdGhlIGZpbGUgdG8gdGhlIHJlYWwgZGVzdGluYXRpb24uCisJJGRvaXQgJG12Y21kICIkZHN0dG1wIiAiJGRzdCIKKyAgICAgIH0KKyAgICBmaSB8fCBleGl0IDEKKworICAgIHRyYXAgJycgMAorICBmaQogZG9uZQogCi0jIFRoZSBmaW5hbCBsaXR0bGUgdHJpY2sgdG8gImNvcnJlY3RseSIgcGFzcyB0aGUgZXhpdCBzdGF0dXMgdG8gdGhlIGV4aXQgdHJhcC4KLXsKLSAgKGV4aXQgMCk7IGV4aXQgMAotfQotCiAjIExvY2FsIHZhcmlhYmxlczoKICMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQogIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCiAjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgotIyB0aW1lLXN0YW1wLWVuZDogIiQiCisjIHRpbWUtc3RhbXAtdGltZS16b25lOiAiVVRDIgorIyB0aW1lLXN0YW1wLWVuZDogIjsgIyBVVEMiCiAjIEVuZDoKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbGliZmZpLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2ogYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2xpYmZmaS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YzM5YTIKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2xpYmZmaS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCkBAIC0wLDAgKzEsNTc5IEBACisvLyAhJCpVVEY4KiQhCit7CisJYXJjaGl2ZVZlcnNpb24gPSAxOworCWNsYXNzZXMgPSB7CisJfTsKKwlvYmplY3RWZXJzaW9uID0gNDY7CisJb2JqZWN0cyA9IHsKKworLyogQmVnaW4gUEJYQnVpbGRGaWxlIHNlY3Rpb24gKi8KKwkJNkM0M0NCREMxNTM0Rjc2RjAwMTYyMzY0IC8qIGZmaS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNkM0M0NCQkQxNTM0Rjc2RjAwMTYyMzY0IC8qIGZmaS5jICovOyB9OworCQk2QzQzQ0JERDE1MzRGNzZGMDAxNjIzNjQgLyogc3lzdi5TIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNkM0M0NCQkYxNTM0Rjc2RjAwMTYyMzY0IC8qIHN5c3YuUyAqLzsgfTsKKwkJNkM0M0NCREUxNTM0Rjc2RjAwMTYyMzY0IC8qIHRyYW1wb2xpbmUuUyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDZDNDNDQkMwMTUzNEY3NkYwMDE2MjM2NCAvKiB0cmFtcG9saW5lLlMgKi87IH07CisJCTZDNDNDQkU2MTUzNEY3NkYwMDE2MjM2NCAvKiBkYXJ3aW4uUyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDZDNDNDQkM5MTUzNEY3NkYwMDE2MjM2NCAvKiBkYXJ3aW4uUyAqLzsgfTsKKwkJNkM0M0NCRTgxNTM0Rjc2RjAwMTYyMzY0IC8qIGZmaS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNkM0M0NCQ0IxNTM0Rjc2RjAwMTYyMzY0IC8qIGZmaS5jICovOyB9OworCQk2QzQzQ0MxRjE1MzRGNzc4MDAxNjIzNjQgLyogZGFyd2luLlMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA2QzQzQ0MwNTE1MzRGNzc4MDAxNjIzNjQgLyogZGFyd2luLlMgKi87IH07CisJCTZDNDNDQzIwMTUzNEY3NzgwMDE2MjM2NCAvKiBkYXJ3aW42NC5TIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNkM0M0NDMDYxNTM0Rjc3ODAwMTYyMzY0IC8qIGRhcndpbjY0LlMgKi87IH07CisJCTZDNDNDQzIxMTUzNEY3NzgwMDE2MjM2NCAvKiBmZmkuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDZDNDNDQzA3MTUzNEY3NzgwMDE2MjM2NCAvKiBmZmkuYyAqLzsgfTsKKwkJNkM0M0NDMjIxNTM0Rjc3ODAwMTYyMzY0IC8qIGZmaTY0LmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA2QzQzQ0MwODE1MzRGNzc4MDAxNjIzNjQgLyogZmZpNjQuYyAqLzsgfTsKKwkJNkM0M0NDMkYxNTM0RjdCRTAwMTYyMzY0IC8qIGNsb3N1cmVzLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA2QzQzQ0MyODE1MzRGN0JFMDAxNjIzNjQgLyogY2xvc3VyZXMuYyAqLzsgfTsKKwkJNkM0M0NDMzAxNTM0RjdCRTAwMTYyMzY0IC8qIGNsb3N1cmVzLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA2QzQzQ0MyODE1MzRGN0JFMDAxNjIzNjQgLyogY2xvc3VyZXMuYyAqLzsgfTsKKwkJNkM0M0NDMzUxNTM0RjdCRTAwMTYyMzY0IC8qIGphdmFfcmF3X2FwaS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNkM0M0NDMkIxNTM0RjdCRTAwMTYyMzY0IC8qIGphdmFfcmF3X2FwaS5jICovOyB9OworCQk2QzQzQ0MzNjE1MzRGN0JFMDAxNjIzNjQgLyogamF2YV9yYXdfYXBpLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA2QzQzQ0MyQjE1MzRGN0JFMDAxNjIzNjQgLyogamF2YV9yYXdfYXBpLmMgKi87IH07CisJCTZDNDNDQzM3MTUzNEY3QkUwMDE2MjM2NCAvKiBwcmVwX2NpZi5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNkM0M0NDMkMxNTM0RjdCRTAwMTYyMzY0IC8qIHByZXBfY2lmLmMgKi87IH07CisJCTZDNDNDQzM4MTUzNEY3QkUwMDE2MjM2NCAvKiBwcmVwX2NpZi5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNkM0M0NDMkMxNTM0RjdCRTAwMTYyMzY0IC8qIHByZXBfY2lmLmMgKi87IH07CisJCTZDNDNDQzM5MTUzNEY3QkUwMDE2MjM2NCAvKiByYXdfYXBpLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA2QzQzQ0MyRDE1MzRGN0JFMDAxNjIzNjQgLyogcmF3X2FwaS5jICovOyB9OworCQk2QzQzQ0MzQTE1MzRGN0JFMDAxNjIzNjQgLyogcmF3X2FwaS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNkM0M0NDMkQxNTM0RjdCRTAwMTYyMzY0IC8qIHJhd19hcGkuYyAqLzsgfTsKKwkJNkM0M0NDM0IxNTM0RjdCRTAwMTYyMzY0IC8qIHR5cGVzLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA2QzQzQ0MyRTE1MzRGN0JFMDAxNjIzNjQgLyogdHlwZXMuYyAqLzsgfTsKKwkJNkM0M0NDM0MxNTM0RjdCRTAwMTYyMzY0IC8qIHR5cGVzLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA2QzQzQ0MyRTE1MzRGN0JFMDAxNjIzNjQgLyogdHlwZXMuYyAqLzsgfTsKKwkJNkM0M0NDOTcxNTM1MDMyNjAwMTYyMzY0IC8qIGZmaS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNkM0M0NDOEQxNTM1MDMyNjAwMTYyMzY0IC8qIGZmaS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJNkM0M0NDOTgxNTM1MDMyNjAwMTYyMzY0IC8qIGZmaV9jb21tb24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDZDNDNDQzhFMTUzNTAzMjYwMDE2MjM2NCAvKiBmZmlfY29tbW9uLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQk2QzQzQ0M5OTE1MzUwMzI2MDAxNjIzNjQgLyogZmZpX2kzODYuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDZDNDNDQzhGMTUzNTAzMjYwMDE2MjM2NCAvKiBmZmlfaTM4Ni5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJNkM0M0NDOUExNTM1MDMyNjAwMTYyMzY0IC8qIGZmaV94ODZfNjQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDZDNDNDQzkwMTUzNTAzMjYwMDE2MjM2NCAvKiBmZmlfeDg2XzY0LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQk2QzQzQ0M5QjE1MzUwMzI2MDAxNjIzNjQgLyogZmZpY29uZmlnLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA2QzQzQ0M5MTE1MzUwMzI2MDAxNjIzNjQgLyogZmZpY29uZmlnLmggKi87IH07CisJCTZDNDNDQzlDMTUzNTAzMjYwMDE2MjM2NCAvKiBmZmljb25maWdfaTM4Ni5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNkM0M0NDOTIxNTM1MDMyNjAwMTYyMzY0IC8qIGZmaWNvbmZpZ19pMzg2LmggKi87IH07CisJCTZDNDNDQzlEMTUzNTAzMjYwMDE2MjM2NCAvKiBmZmljb25maWdfeDg2XzY0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA2QzQzQ0M5MzE1MzUwMzI2MDAxNjIzNjQgLyogZmZpY29uZmlnX3g4Nl82NC5oICovOyB9OworCQk2QzQzQ0M5RTE1MzUwMzI2MDAxNjIzNjQgLyogZmZpdGFyZ2V0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA2QzQzQ0M5NDE1MzUwMzI2MDAxNjIzNjQgLyogZmZpdGFyZ2V0LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQk2QzQzQ0M5RjE1MzUwMzI2MDAxNjIzNjQgLyogZmZpdGFyZ2V0X2kzODYuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDZDNDNDQzk1MTUzNTAzMjYwMDE2MjM2NCAvKiBmZml0YXJnZXRfaTM4Ni5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJNkM0M0NDQTAxNTM1MDMyNjAwMTYyMzY0IC8qIGZmaXRhcmdldF94ODZfNjQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDZDNDNDQzk2MTUzNTAzMjYwMDE2MjM2NCAvKiBmZml0YXJnZXRfeDg2XzY0LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQk2QzQzQ0NBRDE1MzUwMzk2MDAxNjIzNjQgLyogZmZpLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA2QzQzQ0NBMjE1MzUwMzk2MDAxNjIzNjQgLyogZmZpLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQk2QzQzQ0NBRTE1MzUwMzk2MDAxNjIzNjQgLyogZmZpX2FybXY3LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA2QzQzQ0NBMzE1MzUwMzk2MDAxNjIzNjQgLyogZmZpX2FybXY3LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQk2QzQzQ0NBRjE1MzUwMzk2MDAxNjIzNjQgLyogZmZpX2NvbW1vbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNkM0M0NDQTQxNTM1MDM5NjAwMTYyMzY0IC8qIGZmaV9jb21tb24uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTZDNDNDQ0IwMTUzNTAzOTYwMDE2MjM2NCAvKiBmZmlfaTM4Ni5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNkM0M0NDQTUxNTM1MDM5NjAwMTYyMzY0IC8qIGZmaV9pMzg2LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQk2QzQzQ0NCMTE1MzUwMzk2MDAxNjIzNjQgLyogZmZpY29uZmlnLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA2QzQzQ0NBNjE1MzUwMzk2MDAxNjIzNjQgLyogZmZpY29uZmlnLmggKi87IH07CisJCTZDNDNDQ0IyMTUzNTAzOTYwMDE2MjM2NCAvKiBmZmljb25maWdfYXJtdjcuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDZDNDNDQ0E3MTUzNTAzOTYwMDE2MjM2NCAvKiBmZmljb25maWdfYXJtdjcuaCAqLzsgfTsKKwkJNkM0M0NDQjMxNTM1MDM5NjAwMTYyMzY0IC8qIGZmaWNvbmZpZ19pMzg2LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA2QzQzQ0NBODE1MzUwMzk2MDAxNjIzNjQgLyogZmZpY29uZmlnX2kzODYuaCAqLzsgfTsKKwkJNkM0M0NDQjQxNTM1MDM5NjAwMTYyMzY0IC8qIGZmaXRhcmdldC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNkM0M0NDQTkxNTM1MDM5NjAwMTYyMzY0IC8qIGZmaXRhcmdldC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJNkM0M0NDQjUxNTM1MDM5NjAwMTYyMzY0IC8qIGZmaXRhcmdldF9hcm0uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDZDNDNDQ0FBMTUzNTAzOTYwMDE2MjM2NCAvKiBmZml0YXJnZXRfYXJtLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQk2QzQzQ0NCNjE1MzUwMzk2MDAxNjIzNjQgLyogZmZpdGFyZ2V0X2FybXY3LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA2QzQzQ0NBQjE1MzUwMzk2MDAxNjIzNjQgLyogZmZpdGFyZ2V0X2FybXY3LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQk2QzQzQ0NCNzE1MzUwMzk2MDAxNjIzNjQgLyogZmZpdGFyZ2V0X2kzODYuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDZDNDNDQ0FDMTUzNTAzOTYwMDE2MjM2NCAvKiBmZml0YXJnZXRfaTM4Ni5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKy8qIEVuZCBQQlhCdWlsZEZpbGUgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhGaWxlUmVmZXJlbmNlIHNlY3Rpb24gKi8KKwkJNkM0M0NCM0QxNTM0RTlEMTAwMTYyMzY0IC8qIGxpYmZmaS5hICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSBhcmNoaXZlLmFyOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSBsaWJmZmkuYTsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJNkM0M0NCQkQxNTM0Rjc2RjAwMTYyMzY0IC8qIGZmaS5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBmZmkuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNkM0M0NCQkYxNTM0Rjc2RjAwMTYyMzY0IC8qIHN5c3YuUyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYXNtOyBwYXRoID0gc3lzdi5TOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk2QzQzQ0JDMDE1MzRGNzZGMDAxNjIzNjQgLyogdHJhbXBvbGluZS5TICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5hc207IHBhdGggPSB0cmFtcG9saW5lLlM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTZDNDNDQkM5MTUzNEY3NkYwMDE2MjM2NCAvKiBkYXJ3aW4uUyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYXNtOyBwYXRoID0gZGFyd2luLlM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTZDNDNDQkNCMTUzNEY3NkYwMDE2MjM2NCAvKiBmZmkuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gZmZpLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTZDNDNDQzA1MTUzNEY3NzgwMDE2MjM2NCAvKiBkYXJ3aW4uUyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYXNtOyBwYXRoID0gZGFyd2luLlM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTZDNDNDQzA2MTUzNEY3NzgwMDE2MjM2NCAvKiBkYXJ3aW42NC5TICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5hc207IHBhdGggPSBkYXJ3aW42NC5TOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk2QzQzQ0MwNzE1MzRGNzc4MDAxNjIzNjQgLyogZmZpLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IGZmaS5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk2QzQzQ0MwODE1MzRGNzc4MDAxNjIzNjQgLyogZmZpNjQuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gZmZpNjQuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNkM0M0NDMjgxNTM0RjdCRTAwMTYyMzY0IC8qIGNsb3N1cmVzLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgbmFtZSA9IGNsb3N1cmVzLmM7IHBhdGggPSBzcmMvY2xvc3VyZXMuYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQk2QzQzQ0MyQjE1MzRGN0JFMDAxNjIzNjQgLyogamF2YV9yYXdfYXBpLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgbmFtZSA9IGphdmFfcmF3X2FwaS5jOyBwYXRoID0gc3JjL2phdmFfcmF3X2FwaS5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTZDNDNDQzJDMTUzNEY3QkUwMDE2MjM2NCAvKiBwcmVwX2NpZi5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSBwcmVwX2NpZi5jOyBwYXRoID0gc3JjL3ByZXBfY2lmLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJNkM0M0NDMkQxNTM0RjdCRTAwMTYyMzY0IC8qIHJhd19hcGkuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBuYW1lID0gcmF3X2FwaS5jOyBwYXRoID0gc3JjL3Jhd19hcGkuYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQk2QzQzQ0MyRTE1MzRGN0JFMDAxNjIzNjQgLyogdHlwZXMuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBuYW1lID0gdHlwZXMuYzsgcGF0aCA9IHNyYy90eXBlcy5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTZDNDNDQzhEMTUzNTAzMjYwMDE2MjM2NCAvKiBmZmkuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gZmZpLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTZDNDNDQzhFMTUzNTAzMjYwMDE2MjM2NCAvKiBmZmlfY29tbW9uLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGZmaV9jb21tb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNkM0M0NDOEYxNTM1MDMyNjAwMTYyMzY0IC8qIGZmaV9pMzg2LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGZmaV9pMzg2Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTZDNDNDQzkwMTUzNTAzMjYwMDE2MjM2NCAvKiBmZmlfeDg2XzY0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGZmaV94ODZfNjQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNkM0M0NDOTExNTM1MDMyNjAwMTYyMzY0IC8qIGZmaWNvbmZpZy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBmZmljb25maWcuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNkM0M0NDOTIxNTM1MDMyNjAwMTYyMzY0IC8qIGZmaWNvbmZpZ19pMzg2LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGZmaWNvbmZpZ19pMzg2Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTZDNDNDQzkzMTUzNTAzMjYwMDE2MjM2NCAvKiBmZmljb25maWdfeDg2XzY0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGZmaWNvbmZpZ194ODZfNjQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNkM0M0NDOTQxNTM1MDMyNjAwMTYyMzY0IC8qIGZmaXRhcmdldC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBmZml0YXJnZXQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNkM0M0NDOTUxNTM1MDMyNjAwMTYyMzY0IC8qIGZmaXRhcmdldF9pMzg2LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGZmaXRhcmdldF9pMzg2Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTZDNDNDQzk2MTUzNTAzMjYwMDE2MjM2NCAvKiBmZml0YXJnZXRfeDg2XzY0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGZmaXRhcmdldF94ODZfNjQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNkM0M0NDQTIxNTM1MDM5NjAwMTYyMzY0IC8qIGZmaS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBmZmkuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNkM0M0NDQTMxNTM1MDM5NjAwMTYyMzY0IC8qIGZmaV9hcm12Ny5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBmZmlfYXJtdjcuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNkM0M0NDQTQxNTM1MDM5NjAwMTYyMzY0IC8qIGZmaV9jb21tb24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gZmZpX2NvbW1vbi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk2QzQzQ0NBNTE1MzUwMzk2MDAxNjIzNjQgLyogZmZpX2kzODYuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gZmZpX2kzODYuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNkM0M0NDQTYxNTM1MDM5NjAwMTYyMzY0IC8qIGZmaWNvbmZpZy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBmZmljb25maWcuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNkM0M0NDQTcxNTM1MDM5NjAwMTYyMzY0IC8qIGZmaWNvbmZpZ19hcm12Ny5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBmZmljb25maWdfYXJtdjcuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNkM0M0NDQTgxNTM1MDM5NjAwMTYyMzY0IC8qIGZmaWNvbmZpZ19pMzg2LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGZmaWNvbmZpZ19pMzg2Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTZDNDNDQ0E5MTUzNTAzOTYwMDE2MjM2NCAvKiBmZml0YXJnZXQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gZmZpdGFyZ2V0Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTZDNDNDQ0FBMTUzNTAzOTYwMDE2MjM2NCAvKiBmZml0YXJnZXRfYXJtLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGZmaXRhcmdldF9hcm0uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNkM0M0NDQUIxNTM1MDM5NjAwMTYyMzY0IC8qIGZmaXRhcmdldF9hcm12Ny5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBmZml0YXJnZXRfYXJtdjcuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNkM0M0NDQUMxNTM1MDM5NjAwMTYyMzY0IC8qIGZmaXRhcmdldF9pMzg2LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGZmaXRhcmdldF9pMzg2Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY2Rjk4MEJBMTQ3Mzg2MTMwMDA4RjEyMSAvKiBsaWJmZmkuYSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gYXJjaGl2ZS5hcjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gbGliZmZpLmE7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisvKiBFbmQgUEJYRmlsZVJlZmVyZW5jZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJNkM0M0NCM0ExNTM0RTlEMTAwMTYyMzY0IC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJRjZGOTgwQjcxNDczODYxMzAwMDhGMTIxIC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEdyb3VwIHNlY3Rpb24gKi8KKwkJNkM0M0NCQUYxNTM0Rjc2RjAwMTYyMzY0IC8qIGlPUyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJNkM0M0NDQTExNTM1MDM5NjAwMTYyMzY0IC8qIGluY2x1ZGUgKi8sCisJCQkJNkM0M0NCQkIxNTM0Rjc2RjAwMTYyMzY0IC8qIHNyYyAqLywKKwkJCSk7CisJCQluYW1lID0gaU9TOworCQkJcGF0aCA9IGlvczsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTZDNDNDQkJCMTUzNEY3NkYwMDE2MjM2NCAvKiBzcmMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTZDNDNDQkM4MTUzNEY3NkYwMDE2MjM2NCAvKiB4ODYgKi8sCisJCQkJNkM0M0NCQkMxNTM0Rjc2RjAwMTYyMzY0IC8qIGFybSAqLywKKwkJCSk7CisJCQlwYXRoID0gc3JjOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJNkM0M0NCQkMxNTM0Rjc2RjAwMTYyMzY0IC8qIGFybSAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJNkM0M0NCQkQxNTM0Rjc2RjAwMTYyMzY0IC8qIGZmaS5jICovLAorCQkJCTZDNDNDQkJGMTUzNEY3NkYwMDE2MjM2NCAvKiBzeXN2LlMgKi8sCisJCQkJNkM0M0NCQzAxNTM0Rjc2RjAwMTYyMzY0IC8qIHRyYW1wb2xpbmUuUyAqLywKKwkJCSk7CisJCQlwYXRoID0gYXJtOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJNkM0M0NCQzgxNTM0Rjc2RjAwMTYyMzY0IC8qIHg4NiAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJNkM0M0NCQzkxNTM0Rjc2RjAwMTYyMzY0IC8qIGRhcndpbi5TICovLAorCQkJCTZDNDNDQkNCMTUzNEY3NkYwMDE2MjM2NCAvKiBmZmkuYyAqLywKKwkJCSk7CisJCQlwYXRoID0geDg2OworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJNkM0M0NCRjAxNTM0Rjc3ODAwMTYyMzY0IC8qIE9TIFggKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTZDNDNDQzhDMTUzNTAzMjYwMDE2MjM2NCAvKiBpbmNsdWRlICovLAorCQkJCTZDNDNDQkZDMTUzNEY3NzgwMDE2MjM2NCAvKiBzcmMgKi8sCisJCQkpOworCQkJbmFtZSA9ICJPUyBYIjsKKwkJCXBhdGggPSBvc3g7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQk2QzQzQ0JGQzE1MzRGNzc4MDAxNjIzNjQgLyogc3JjICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk2QzQzQ0MwNDE1MzRGNzc4MDAxNjIzNjQgLyogeDg2ICovLAorCQkJKTsKKwkJCXBhdGggPSBzcmM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQk2QzQzQ0MwNDE1MzRGNzc4MDAxNjIzNjQgLyogeDg2ICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk2QzQzQ0MwNTE1MzRGNzc4MDAxNjIzNjQgLyogZGFyd2luLlMgKi8sCisJCQkJNkM0M0NDMDYxNTM0Rjc3ODAwMTYyMzY0IC8qIGRhcndpbjY0LlMgKi8sCisJCQkJNkM0M0NDMDcxNTM0Rjc3ODAwMTYyMzY0IC8qIGZmaS5jICovLAorCQkJCTZDNDNDQzA4MTUzNEY3NzgwMDE2MjM2NCAvKiBmZmk2NC5jICovLAorCQkJKTsKKwkJCXBhdGggPSB4ODY7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQk2QzQzQ0MzRDE1MzRGN0M0MDAxNjIzNjQgLyogc3JjICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk2QzQzQ0MyODE1MzRGN0JFMDAxNjIzNjQgLyogY2xvc3VyZXMuYyAqLywKKwkJCQk2QzQzQ0MyQjE1MzRGN0JFMDAxNjIzNjQgLyogamF2YV9yYXdfYXBpLmMgKi8sCisJCQkJNkM0M0NDMkMxNTM0RjdCRTAwMTYyMzY0IC8qIHByZXBfY2lmLmMgKi8sCisJCQkJNkM0M0NDMkQxNTM0RjdCRTAwMTYyMzY0IC8qIHJhd19hcGkuYyAqLywKKwkJCQk2QzQzQ0MyRTE1MzRGN0JFMDAxNjIzNjQgLyogdHlwZXMuYyAqLywKKwkJCSk7CisJCQluYW1lID0gc3JjOworCQkJcGF0aCA9IGlvczsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTZDNDNDQzhDMTUzNTAzMjYwMDE2MjM2NCAvKiBpbmNsdWRlICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk2QzQzQ0M4RDE1MzUwMzI2MDAxNjIzNjQgLyogZmZpLmggKi8sCisJCQkJNkM0M0NDOEUxNTM1MDMyNjAwMTYyMzY0IC8qIGZmaV9jb21tb24uaCAqLywKKwkJCQk2QzQzQ0M4RjE1MzUwMzI2MDAxNjIzNjQgLyogZmZpX2kzODYuaCAqLywKKwkJCQk2QzQzQ0M5MDE1MzUwMzI2MDAxNjIzNjQgLyogZmZpX3g4Nl82NC5oICovLAorCQkJCTZDNDNDQzkxMTUzNTAzMjYwMDE2MjM2NCAvKiBmZmljb25maWcuaCAqLywKKwkJCQk2QzQzQ0M5MjE1MzUwMzI2MDAxNjIzNjQgLyogZmZpY29uZmlnX2kzODYuaCAqLywKKwkJCQk2QzQzQ0M5MzE1MzUwMzI2MDAxNjIzNjQgLyogZmZpY29uZmlnX3g4Nl82NC5oICovLAorCQkJCTZDNDNDQzk0MTUzNTAzMjYwMDE2MjM2NCAvKiBmZml0YXJnZXQuaCAqLywKKwkJCQk2QzQzQ0M5NTE1MzUwMzI2MDAxNjIzNjQgLyogZmZpdGFyZ2V0X2kzODYuaCAqLywKKwkJCQk2QzQzQ0M5NjE1MzUwMzI2MDAxNjIzNjQgLyogZmZpdGFyZ2V0X3g4Nl82NC5oICovLAorCQkJKTsKKwkJCXBhdGggPSBpbmNsdWRlOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJNkM0M0NDQTExNTM1MDM5NjAwMTYyMzY0IC8qIGluY2x1ZGUgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTZDNDNDQ0EyMTUzNTAzOTYwMDE2MjM2NCAvKiBmZmkuaCAqLywKKwkJCQk2QzQzQ0NBMzE1MzUwMzk2MDAxNjIzNjQgLyogZmZpX2FybXY3LmggKi8sCisJCQkJNkM0M0NDQTQxNTM1MDM5NjAwMTYyMzY0IC8qIGZmaV9jb21tb24uaCAqLywKKwkJCQk2QzQzQ0NBNTE1MzUwMzk2MDAxNjIzNjQgLyogZmZpX2kzODYuaCAqLywKKwkJCQk2QzQzQ0NBNjE1MzUwMzk2MDAxNjIzNjQgLyogZmZpY29uZmlnLmggKi8sCisJCQkJNkM0M0NDQTcxNTM1MDM5NjAwMTYyMzY0IC8qIGZmaWNvbmZpZ19hcm12Ny5oICovLAorCQkJCTZDNDNDQ0E4MTUzNTAzOTYwMDE2MjM2NCAvKiBmZmljb25maWdfaTM4Ni5oICovLAorCQkJCTZDNDNDQ0E5MTUzNTAzOTYwMDE2MjM2NCAvKiBmZml0YXJnZXQuaCAqLywKKwkJCQk2QzQzQ0NBQTE1MzUwMzk2MDAxNjIzNjQgLyogZmZpdGFyZ2V0X2FybS5oICovLAorCQkJCTZDNDNDQ0FCMTUzNTAzOTYwMDE2MjM2NCAvKiBmZml0YXJnZXRfYXJtdjcuaCAqLywKKwkJCQk2QzQzQ0NBQzE1MzUwMzk2MDAxNjIzNjQgLyogZmZpdGFyZ2V0X2kzODYuaCAqLywKKwkJCSk7CisJCQlwYXRoID0gaW5jbHVkZTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCUY2QjA4Mzk1MTQ3MjFFRTUwMDMxRDhBMSA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJNkM0M0NDM0QxNTM0RjdDNDAwMTYyMzY0IC8qIHNyYyAqLywKKwkJCQk2QzQzQ0JBRjE1MzRGNzZGMDAxNjIzNjQgLyogaU9TICovLAorCQkJCTZDNDNDQkYwMTUzNEY3NzgwMDE2MjM2NCAvKiBPUyBYICovLAorCQkJCUY2Rjk4MEM2MTQ3Mzg2MjYwMDA4RjEyMSAvKiBQcm9kdWN0cyAqLywKKwkJCSk7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQlGNkY5ODBDNjE0NzM4NjI2MDAwOEYxMjEgLyogUHJvZHVjdHMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCUY2Rjk4MEJBMTQ3Mzg2MTMwMDA4RjEyMSAvKiBsaWJmZmkuYSAqLywKKwkJCQk2QzQzQ0IzRDE1MzRFOUQxMDAxNjIzNjQgLyogbGliZmZpLmEgKi8sCisJCQkpOworCQkJbmFtZSA9IFByb2R1Y3RzOworCQkJcGF0aCA9IC4uLy4uOworCQkJc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsKKwkJfTsKKy8qIEVuZCBQQlhHcm91cCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEhlYWRlcnNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJNkM0M0NCM0IxNTM0RTlEMTAwMTYyMzY0IC8qIEhlYWRlcnMgKi8gPSB7CisJCQlpc2EgPSBQQlhIZWFkZXJzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQk2QzQzQ0M5NzE1MzUwMzI2MDAxNjIzNjQgLyogZmZpLmggaW4gSGVhZGVycyAqLywKKwkJCQk2QzQzQ0M5ODE1MzUwMzI2MDAxNjIzNjQgLyogZmZpX2NvbW1vbi5oIGluIEhlYWRlcnMgKi8sCisJCQkJNkM0M0NDOTkxNTM1MDMyNjAwMTYyMzY0IC8qIGZmaV9pMzg2LmggaW4gSGVhZGVycyAqLywKKwkJCQk2QzQzQ0M5QTE1MzUwMzI2MDAxNjIzNjQgLyogZmZpX3g4Nl82NC5oIGluIEhlYWRlcnMgKi8sCisJCQkJNkM0M0NDOUUxNTM1MDMyNjAwMTYyMzY0IC8qIGZmaXRhcmdldC5oIGluIEhlYWRlcnMgKi8sCisJCQkJNkM0M0NDOUYxNTM1MDMyNjAwMTYyMzY0IC8qIGZmaXRhcmdldF9pMzg2LmggaW4gSGVhZGVycyAqLywKKwkJCQk2QzQzQ0NBMDE1MzUwMzI2MDAxNjIzNjQgLyogZmZpdGFyZ2V0X3g4Nl82NC5oIGluIEhlYWRlcnMgKi8sCisJCQkJNkM0M0NDOUIxNTM1MDMyNjAwMTYyMzY0IC8qIGZmaWNvbmZpZy5oIGluIEhlYWRlcnMgKi8sCisJCQkJNkM0M0NDOUMxNTM1MDMyNjAwMTYyMzY0IC8qIGZmaWNvbmZpZ19pMzg2LmggaW4gSGVhZGVycyAqLywKKwkJCQk2QzQzQ0M5RDE1MzUwMzI2MDAxNjIzNjQgLyogZmZpY29uZmlnX3g4Nl82NC5oIGluIEhlYWRlcnMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUY2Rjk4MEI4MTQ3Mzg2MTMwMDA4RjEyMSAvKiBIZWFkZXJzICovID0geworCQkJaXNhID0gUEJYSGVhZGVyc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJNkM0M0NDQUQxNTM1MDM5NjAwMTYyMzY0IC8qIGZmaS5oIGluIEhlYWRlcnMgKi8sCisJCQkJNkM0M0NDQUUxNTM1MDM5NjAwMTYyMzY0IC8qIGZmaV9hcm12Ny5oIGluIEhlYWRlcnMgKi8sCisJCQkJNkM0M0NDQUYxNTM1MDM5NjAwMTYyMzY0IC8qIGZmaV9jb21tb24uaCBpbiBIZWFkZXJzICovLAorCQkJCTZDNDNDQ0IwMTUzNTAzOTYwMDE2MjM2NCAvKiBmZmlfaTM4Ni5oIGluIEhlYWRlcnMgKi8sCisJCQkJNkM0M0NDQjQxNTM1MDM5NjAwMTYyMzY0IC8qIGZmaXRhcmdldC5oIGluIEhlYWRlcnMgKi8sCisJCQkJNkM0M0NDQjUxNTM1MDM5NjAwMTYyMzY0IC8qIGZmaXRhcmdldF9hcm0uaCBpbiBIZWFkZXJzICovLAorCQkJCTZDNDNDQ0I2MTUzNTAzOTYwMDE2MjM2NCAvKiBmZml0YXJnZXRfYXJtdjcuaCBpbiBIZWFkZXJzICovLAorCQkJCTZDNDNDQ0I3MTUzNTAzOTYwMDE2MjM2NCAvKiBmZml0YXJnZXRfaTM4Ni5oIGluIEhlYWRlcnMgKi8sCisJCQkJNkM0M0NDQjExNTM1MDM5NjAwMTYyMzY0IC8qIGZmaWNvbmZpZy5oIGluIEhlYWRlcnMgKi8sCisJCQkJNkM0M0NDQjIxNTM1MDM5NjAwMTYyMzY0IC8qIGZmaWNvbmZpZ19hcm12Ny5oIGluIEhlYWRlcnMgKi8sCisJCQkJNkM0M0NDQjMxNTM1MDM5NjAwMTYyMzY0IC8qIGZmaWNvbmZpZ19pMzg2LmggaW4gSGVhZGVycyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhIZWFkZXJzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWE5hdGl2ZVRhcmdldCBzZWN0aW9uICovCisJCTZDNDNDQjNDMTUzNEU5RDEwMDE2MjM2NCAvKiBsaWJmZmkgT1MgWCAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSA2QzQzQ0I0QTE1MzRFOUQxMDAxNjIzNjQgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgImxpYmZmaSBPUyBYIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTZDNDNDQzQwMTUzNEZGM0IwMDE2MjM2NCAvKiBHZW5lcmF0ZSBTb3VyY2UgYW5kIEhlYWRlcnMgKi8sCisJCQkJNkM0M0NCMzkxNTM0RTlEMTAwMTYyMzY0IC8qIFNvdXJjZXMgKi8sCisJCQkJNkM0M0NCM0ExNTM0RTlEMTAwMTYyMzY0IC8qIEZyYW1ld29ya3MgKi8sCisJCQkJNkM0M0NCM0IxNTM0RTlEMTAwMTYyMzY0IC8qIEhlYWRlcnMgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9ICJsaWJmZmkgT1MgWCI7CisJCQlwcm9kdWN0TmFtZSA9ICJmZmkgT1MgWCI7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gNkM0M0NCM0QxNTM0RTlEMTAwMTYyMzY0IC8qIGxpYmZmaS5hICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5saWJyYXJ5LnN0YXRpYyI7CisJCX07CisJCUY2Rjk4MEI5MTQ3Mzg2MTMwMDA4RjEyMSAvKiBsaWJmZmkgaU9TICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IEY2Rjk4MEM0MTQ3Mzg2MTMwMDA4RjEyMSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAibGliZmZpIGlPUyIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQk2QzQzQ0MzRTE1MzRGOEUyMDAxNjIzNjQgLyogR2VuZXJhdGUgVHJhbXBvbGluZSAqLywKKwkJCQk2QzQzQ0MzRjE1MzRGRjFCMDAxNjIzNjQgLyogR2VuZXJhdGUgU291cmNlIGFuZCBIZWFkZXJzICovLAorCQkJCUY2Rjk4MEI2MTQ3Mzg2MTMwMDA4RjEyMSAvKiBTb3VyY2VzICovLAorCQkJCUY2Rjk4MEI3MTQ3Mzg2MTMwMDA4RjEyMSAvKiBGcmFtZXdvcmtzICovLAorCQkJCUY2Rjk4MEI4MTQ3Mzg2MTMwMDA4RjEyMSAvKiBIZWFkZXJzICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJKTsKKwkJCW5hbWUgPSAibGliZmZpIGlPUyI7CisJCQlwcm9kdWN0TmFtZSA9IGZmaTsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSBGNkY5ODBCQTE0NzM4NjEzMDAwOEYxMjEgLyogbGliZmZpLmEgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLmxpYnJhcnkuc3RhdGljIjsKKwkJfTsKKy8qIEVuZCBQQlhOYXRpdmVUYXJnZXQgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhQcm9qZWN0IHNlY3Rpb24gKi8KKwkJRjZCMDgzOTcxNDcyMUVFNTAwMzFEOEExIC8qIFByb2plY3Qgb2JqZWN0ICovID0geworCQkJaXNhID0gUEJYUHJvamVjdDsKKwkJCWF0dHJpYnV0ZXMgPSB7CisJCQkJTGFzdFVwZ3JhZGVDaGVjayA9IDA0MzA7CisJCQl9OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IEY2QjA4MzlBMTQ3MjFFRTUwMDMxRDhBMSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWFByb2plY3QgImxpYmZmaSIgKi87CisJCQljb21wYXRpYmlsaXR5VmVyc2lvbiA9ICJYY29kZSAzLjIiOworCQkJZGV2ZWxvcG1lbnRSZWdpb24gPSBFbmdsaXNoOworCQkJaGFzU2Nhbm5lZEZvckVuY29kaW5ncyA9IDA7CisJCQlrbm93blJlZ2lvbnMgPSAoCisJCQkJZW4sCisJCQkpOworCQkJbWFpbkdyb3VwID0gRjZCMDgzOTUxNDcyMUVFNTAwMzFEOEExOworCQkJcHJvZHVjdFJlZkdyb3VwID0gRjZCMDgzOTUxNDcyMUVFNTAwMzFEOEExOworCQkJcHJvamVjdERpclBhdGggPSAiIjsKKwkJCXByb2plY3RSb290ID0gIiI7CisJCQl0YXJnZXRzID0gKAorCQkJCUY2Rjk4MEI5MTQ3Mzg2MTMwMDA4RjEyMSAvKiBsaWJmZmkgaU9TICovLAorCQkJCTZDNDNDQjNDMTUzNEU5RDEwMDE2MjM2NCAvKiBsaWJmZmkgT1MgWCAqLywKKwkJCSk7CisJCX07CisvKiBFbmQgUEJYUHJvamVjdCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFNoZWxsU2NyaXB0QnVpbGRQaGFzZSBzZWN0aW9uICovCisJCTZDNDNDQzNFMTUzNEY4RTIwMDE2MjM2NCAvKiBHZW5lcmF0ZSBUcmFtcG9saW5lICovID0geworCQkJaXNhID0gUEJYU2hlbGxTY3JpcHRCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCWlucHV0UGF0aHMgPSAoCisJCQkpOworCQkJbmFtZSA9ICJHZW5lcmF0ZSBUcmFtcG9saW5lIjsKKwkJCW91dHB1dFBhdGhzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQkJc2hlbGxQYXRoID0gL3Vzci9iaW4vcHl0aG9uOworCQkJc2hlbGxTY3JpcHQgPSAiaW1wb3J0IHN1YnByb2Nlc3NcbmltcG9ydCByZVxuaW1wb3J0IG9zXG5pbXBvcnQgZXJybm9cbmltcG9ydCBzeXNcblxuZGVmIG1haW4oKTpcbiAgICB3aXRoIG9wZW4oJ3NyYy9hcm0vdHJhbXBvbGluZS5TJywgJ3cnKSBhcyB0cmFtcF9vdXQ6XG4gICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFsnYmFzaCcsICdzcmMvYXJtL2dlbnRyYW1wLnNoJ10sIHN0ZG91dD10cmFtcF9vdXQpXG4gICAgICAgIHAud2FpdCgpXG5cbmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6XG4gICAgbWFpbigpIjsKKwkJfTsKKwkJNkM0M0NDM0YxNTM0RkYxQjAwMTYyMzY0IC8qIEdlbmVyYXRlIFNvdXJjZSBhbmQgSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNoZWxsU2NyaXB0QnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlpbnB1dFBhdGhzID0gKAorCQkJKTsKKwkJCW5hbWUgPSAiR2VuZXJhdGUgU291cmNlIGFuZCBIZWFkZXJzIjsKKwkJCW91dHB1dFBhdGhzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQkJc2hlbGxQYXRoID0gL2Jpbi9zaDsKKwkJCXNoZWxsU2NyaXB0ID0gIi91c3IvYmluL3B5dGhvbiBnZW5lcmF0ZS1pb3Mtc291cmNlLWFuZC1oZWFkZXJzLnB5IjsKKwkJfTsKKwkJNkM0M0NDNDAxNTM0RkYzQjAwMTYyMzY0IC8qIEdlbmVyYXRlIFNvdXJjZSBhbmQgSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNoZWxsU2NyaXB0QnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlpbnB1dFBhdGhzID0gKAorCQkJKTsKKwkJCW5hbWUgPSAiR2VuZXJhdGUgU291cmNlIGFuZCBIZWFkZXJzIjsKKwkJCW91dHB1dFBhdGhzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQkJc2hlbGxQYXRoID0gL2Jpbi9zaDsKKwkJCXNoZWxsU2NyaXB0ID0gIi91c3IvYmluL3B5dGhvbiBnZW5lcmF0ZS1vc3gtc291cmNlLWFuZC1oZWFkZXJzLnB5IjsKKwkJfTsKKy8qIEVuZCBQQlhTaGVsbFNjcmlwdEJ1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhTb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCTZDNDNDQjM5MTUzNEU5RDEwMDE2MjM2NCAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJNkM0M0NDMUYxNTM0Rjc3ODAwMTYyMzY0IC8qIGRhcndpbi5TIGluIFNvdXJjZXMgKi8sCisJCQkJNkM0M0NDMjAxNTM0Rjc3ODAwMTYyMzY0IC8qIGRhcndpbjY0LlMgaW4gU291cmNlcyAqLywKKwkJCQk2QzQzQ0MyMTE1MzRGNzc4MDAxNjIzNjQgLyogZmZpLmMgaW4gU291cmNlcyAqLywKKwkJCQk2QzQzQ0MyMjE1MzRGNzc4MDAxNjIzNjQgLyogZmZpNjQuYyBpbiBTb3VyY2VzICovLAorCQkJCTZDNDNDQzMwMTUzNEY3QkUwMDE2MjM2NCAvKiBjbG9zdXJlcy5jIGluIFNvdXJjZXMgKi8sCisJCQkJNkM0M0NDMzYxNTM0RjdCRTAwMTYyMzY0IC8qIGphdmFfcmF3X2FwaS5jIGluIFNvdXJjZXMgKi8sCisJCQkJNkM0M0NDMzgxNTM0RjdCRTAwMTYyMzY0IC8qIHByZXBfY2lmLmMgaW4gU291cmNlcyAqLywKKwkJCQk2QzQzQ0MzQTE1MzRGN0JFMDAxNjIzNjQgLyogcmF3X2FwaS5jIGluIFNvdXJjZXMgKi8sCisJCQkJNkM0M0NDM0MxNTM0RjdCRTAwMTYyMzY0IC8qIHR5cGVzLmMgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJRjZGOTgwQjYxNDczODYxMzAwMDhGMTIxIC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQk2QzQzQ0JEQzE1MzRGNzZGMDAxNjIzNjQgLyogZmZpLmMgaW4gU291cmNlcyAqLywKKwkJCQk2QzQzQ0JERDE1MzRGNzZGMDAxNjIzNjQgLyogc3lzdi5TIGluIFNvdXJjZXMgKi8sCisJCQkJNkM0M0NCREUxNTM0Rjc2RjAwMTYyMzY0IC8qIHRyYW1wb2xpbmUuUyBpbiBTb3VyY2VzICovLAorCQkJCTZDNDNDQkU2MTUzNEY3NkYwMDE2MjM2NCAvKiBkYXJ3aW4uUyBpbiBTb3VyY2VzICovLAorCQkJCTZDNDNDQkU4MTUzNEY3NkYwMDE2MjM2NCAvKiBmZmkuYyBpbiBTb3VyY2VzICovLAorCQkJCTZDNDNDQzJGMTUzNEY3QkUwMDE2MjM2NCAvKiBjbG9zdXJlcy5jIGluIFNvdXJjZXMgKi8sCisJCQkJNkM0M0NDMzUxNTM0RjdCRTAwMTYyMzY0IC8qIGphdmFfcmF3X2FwaS5jIGluIFNvdXJjZXMgKi8sCisJCQkJNkM0M0NDMzcxNTM0RjdCRTAwMTYyMzY0IC8qIHByZXBfY2lmLmMgaW4gU291cmNlcyAqLywKKwkJCQk2QzQzQ0MzOTE1MzRGN0JFMDAxNjIzNjQgLyogcmF3X2FwaS5jIGluIFNvdXJjZXMgKi8sCisJCQkJNkM0M0NDM0IxNTM0RjdCRTAwMTYyMzY0IC8qIHR5cGVzLmMgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhTb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFhDQnVpbGRDb25maWd1cmF0aW9uIHNlY3Rpb24gKi8KKwkJNkM0M0NCNEIxNTM0RTlEMTAwMTYyMzY0IC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFSQ0hTID0gIiQoQVJDSFNfU1RBTkRBUkRfMzJfNjRfQklUKSI7CisJCQkJRFNUUk9PVCA9IC90bXAvZmZpLmRzdDsKKwkJCQlGUkFNRVdPUktfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkiJChpbmhlcml0ZWQpIiwKKwkJCQkJIlwiJChTWVNURU1fQVBQU19ESVIpL1hjb2RlLmFwcC9Db250ZW50cy9EZXZlbG9wZXIvTGlicmFyeS9GcmFtZXdvcmtzXCIiLAorCQkJCSk7CisJCQkJR0NDX0VOQUJMRV9PQkpDX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX1ZFUlNJT04gPSBjb20uYXBwbGUuY29tcGlsZXJzLmxsdm0uY2xhbmcuMV8wOworCQkJCUdDQ19XQVJOXzY0X1RPXzMyX0JJVF9DT05WRVJTSU9OID0gWUVTOworCQkJCUdDQ19XQVJOX1VOSU5JVElBTElaRURfQVVUT1MgPSBZRVM7CisJCQkJTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUID0gMTAuNjsKKwkJCQlPTkxZX0FDVElWRV9BUkNIID0gWUVTOworCQkJCVBST0RVQ1RfTkFNRSA9IGZmaTsKKwkJCQlTREtST09UID0gbWFjb3N4OworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJNkM0M0NCNEMxNTM0RTlEMTAwMTYyMzY0IC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQVJDSFMgPSAiJChBUkNIU19TVEFOREFSRF8zMl82NF9CSVQpIjsKKwkJCQlERUJVR19JTkZPUk1BVElPTl9GT1JNQVQgPSAiZHdhcmYtd2l0aC1kc3ltIjsKKwkJCQlEU1RST09UID0gL3RtcC9mZmkuZHN0OworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAoCisJCQkJCSIkKGluaGVyaXRlZCkiLAorCQkJCQkiXCIkKFNZU1RFTV9BUFBTX0RJUikvWGNvZGUuYXBwL0NvbnRlbnRzL0RldmVsb3Blci9MaWJyYXJ5L0ZyYW1ld29ya3NcIiIsCisJCQkJKTsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfRVhDRVBUSU9OUyA9IFlFUzsKKwkJCQlHQ0NfVkVSU0lPTiA9IGNvbS5hcHBsZS5jb21waWxlcnMubGx2bS5jbGFuZy4xXzA7CisJCQkJR0NDX1dBUk5fNjRfVE9fMzJfQklUX0NPTlZFUlNJT04gPSBZRVM7CisJCQkJR0NDX1dBUk5fVU5JTklUSUFMSVpFRF9BVVRPUyA9IFlFUzsKKwkJCQlNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgPSAxMC42OworCQkJCVBST0RVQ1RfTkFNRSA9IGZmaTsKKwkJCQlTREtST09UID0gbWFjb3N4OworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQlGNkIwODNBQjE0NzIxRUU1MDAzMUQ4QTEgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQUxXQVlTX1NFQVJDSF9VU0VSX1BBVEhTID0gTk87CisJCQkJQVJDSFMgPSAiJChBUkNIU19TVEFOREFSRF8zMl9CSVQpIjsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gTk87CisJCQkJR0NDX0NfTEFOR1VBR0VfU1RBTkRBUkQgPSBnbnU5OTsKKwkJCQlHQ0NfRFlOQU1JQ19OT19QSUMgPSBOTzsKKwkJCQlHQ0NfT1BUSU1JWkFUSU9OX0xFVkVMID0gMDsKKwkJCQlHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TID0gKAorCQkJCQkiREVCVUc9MSIsCisJCQkJCSIkKGluaGVyaXRlZCkiLAorCQkJCSk7CisJCQkJR0NDX1NZTUJPTFNfUFJJVkFURV9FWFRFUk4gPSBOTzsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9NSVNTSU5HX1BST1RPVFlQRVMgPSBOTzsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9SRVRVUk5fVFlQRSA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfVkFMVUUgPSBOTzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfVkFSSUFCTEUgPSBZRVM7CisJCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9IGlvcy9pbmNsdWRlOworCQkJCVNES1JPT1QgPSBpcGhvbmVvczsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCUY2QjA4M0FDMTQ3MjFFRTUwMDMxRDhBMSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IE5POworCQkJCUFSQ0hTID0gIiQoQVJDSFNfU1RBTkRBUkRfMzJfQklUKSI7CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IFlFUzsKKwkJCQlHQ0NfQ19MQU5HVUFHRV9TVEFOREFSRCA9IGdudTk5OworCQkJCUdDQ19QUkVQUk9DRVNTT1JfREVGSU5JVElPTlMgPSAiIjsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9NSVNTSU5HX1BST1RPVFlQRVMgPSBOTzsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9SRVRVUk5fVFlQRSA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfVkFMVUUgPSBOTzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfVkFSSUFCTEUgPSBZRVM7CisJCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9IGlvcy9pbmNsdWRlOworCQkJCVNES1JPT1QgPSBpcGhvbmVvczsKKwkJCQlWQUxJREFURV9QUk9EVUNUID0gWUVTOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQlGNkY5ODBDMjE0NzM4NjEzMDAwOEYxMjEgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQVJDSFMgPSAoCisJCQkJCWFybXY2LAorCQkJCQlhcm12NywKKwkJCQkpOworCQkJCURTVFJPT1QgPSAvdG1wL2ZmaS5kc3Q7CisJCQkJR0NDX1BSRUNPTVBJTEVfUFJFRklYX0hFQURFUiA9IFlFUzsKKwkJCQlHQ0NfVEhVTUJfU1VQUE9SVCA9IE5POworCQkJCUlQSE9ORU9TX0RFUExPWU1FTlRfVEFSR0VUID0gNC4wOworCQkJCU9USEVSX0xERkxBR1MgPSAiLU9iakMiOworCQkJCVBST0RVQ1RfTkFNRSA9IGZmaTsKKwkJCQlTS0lQX0lOU1RBTEwgPSBZRVM7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQlGNkY5ODBDMzE0NzM4NjEzMDAwOEYxMjEgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBUkNIUyA9ICgKKwkJCQkJYXJtdjYsCisJCQkJCWFybXY3LAorCQkJCSk7CisJCQkJRFNUUk9PVCA9IC90bXAvZmZpLmRzdDsKKwkJCQlHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSID0gWUVTOworCQkJCUdDQ19USFVNQl9TVVBQT1JUID0gTk87CisJCQkJSVBIT05FT1NfREVQTE9ZTUVOVF9UQVJHRVQgPSA0LjA7CisJCQkJT1RIRVJfTERGTEFHUyA9ICItT2JqQyI7CisJCQkJUFJPRFVDVF9OQU1FID0gZmZpOworCQkJCVNLSVBfSU5TVEFMTCA9IFlFUzsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKy8qIEVuZCBYQ0J1aWxkQ29uZmlndXJhdGlvbiBzZWN0aW9uICovCisKKy8qIEJlZ2luIFhDQ29uZmlndXJhdGlvbkxpc3Qgc2VjdGlvbiAqLworCQk2QzQzQ0I0QTE1MzRFOUQxMDAxNjIzNjQgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgImxpYmZmaSBPUyBYIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTZDNDNDQjRCMTUzNEU5RDEwMDE2MjM2NCAvKiBEZWJ1ZyAqLywKKwkJCQk2QzQzQ0I0QzE1MzRFOUQxMDAxNjIzNjQgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworCQlGNkIwODM5QTE0NzIxRUU1MDAzMUQ4QTEgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhQcm9qZWN0ICJsaWJmZmkiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJRjZCMDgzQUIxNDcyMUVFNTAwMzFEOEExIC8qIERlYnVnICovLAorCQkJCUY2QjA4M0FDMTQ3MjFFRTUwMDMxRDhBMSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisJCUY2Rjk4MEM0MTQ3Mzg2MTMwMDA4RjEyMSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAibGliZmZpIGlPUyIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQlGNkY5ODBDMjE0NzM4NjEzMDAwOEYxMjEgLyogRGVidWcgKi8sCisJCQkJRjZGOTgwQzMxNDczODYxMzAwMDhGMTIxIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKy8qIEVuZCBYQ0NvbmZpZ3VyYXRpb25MaXN0IHNlY3Rpb24gKi8KKwl9OworCXJvb3RPYmplY3QgPSBGNkIwODM5NzE0NzIxRUU1MDAzMUQ4QTEgLyogUHJvamVjdCBvYmplY3QgKi87Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2xpYnRvb2wtbGRmbGFncyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbGlidG9vbC1sZGZsYWdzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUzMmUzN2IKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2xpYnRvb2wtbGRmbGFncwpAQCAtMCwwICsxLDEwNiBAQAorIyEgL2Jpbi9zaAorCisjIFNjcmlwdCB0byB0cmFuc2xhdGUgTERGTEFHUyBpbnRvIGEgZm9ybSBzdWl0YWJsZSBmb3IgdXNlIHdpdGggbGlidG9vbC4KKworIyBDb3B5cmlnaHQgKEMpIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCAKKyMgTUEgMDIxMTAtMTMwMSwgVVNBLiAKKworIyBDb250cmlidXRlZCBieSBDb2RlU291cmNlcnksIExMQy4KKworIyBUaGlzIHNjcmlwdCBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIGZyb20gYSBNYWtlZmlsZSB0aGF0IHVzZXMgbGlidG9vbAorIyB0byBidWlsZCBsaWJyYXJpZXMgYXMgZm9sbG93czogCisjCisjICAgTFRMREZMQUdTID0gJChzaGVsbCBsaWJ0b29sLWxkZmxhZ3MgJChMREZMQUdTKSkKKyMKKyMgVGhlbiwgdXNlIChMVExERkxBR1MpIGluIHBsYWNlIG9mICQoTERGTEFHUykgaW4geW91ciBsaW5rIGxpbmUuCisKKyMgVGhlIG91dHB1dCBvZiB0aGUgc2NyaXB0LiAgVGhpcyBzdHJpbmcgaXMgYnVpbHQgdXAgYXMgd2UgcHJvY2VzcyB0aGUKKyMgYXJndW1lbnRzLgorcmVzdWx0PQorcHJldl9hcmc9CisKK2ZvciBhcmcKK2RvCisgICAgY2FzZSAkYXJnIGluCisJLWYqfC0tKikKKwkgICAgIyBMaWJ0b29sIGRvZXMgbm90IGFzY3JpYmUgYW55IHNwZWNpYWwgbWVhbmluZyBvcHRpb25zCisJICAgICMgdGhhdCBiZWdpbiB3aXRoIC1mIG9yIHdpdGggYSBkb3VibGUtZGFzaC4gIFNvLCBpdCB3aWxsCisJICAgICMgdGhpbmsgdGhlc2Ugb3B0aW9ucyBhcmUgbGlua2VyIG9wdGlvbnMsIGFuZCBwcmVmaXggdGhlbQorCSAgICAjIHdpdGggIi1XbCwiLiAgVGhlbiwgdGhlIGNvbXBpbGVyIGRyaXZlciB3aWxsIGlnbm9yZSB0aGUKKwkgICAgIyBvcHRpb25zLiAgU28sIHdlIHByZWZpeCB0aGVzZSBvcHRpb25zIHdpdGggLVhjb21waWxlciB0bworCSAgICAjIG1ha2UgY2xlYXIgdG8gbGlidG9vbCB0aGF0IHRoZXkgYXJlIGluIGZhY3QgY29tcGlsZXIKKwkgICAgIyBvcHRpb25zLgorCSAgICBjYXNlICRwcmV2X2FyZyBpbgorCQktWHByZXByb2Nlc3NvcnwtWGNvbXBpbGVyfC1YbGlua2VyKQorCQkgICAgIyBUaGlzIG9wdGlvbiBpcyBhbHJlYWR5IHByZWZpeGVkOyBkb24ndCBwcmVmaXggaXQgYWdhaW4uCisJCSAgICA7OworCQkqKQorCQkgICAgcmVzdWx0PSIkcmVzdWx0IC1YY29tcGlsZXIiCisJCSAgICA7OworCSAgICBlc2FjCisJICAgIDs7CisJKikKKwkgICAgIyBXZSBkbyBub3Qgd2FudCB0byBhZGQgLVhjb21waWxlciB0byBvdGhlciBvcHRpb25zIGJlY2F1c2UKKwkgICAgIyB0aGF0IHdvdWxkIHByZXZlbnQgbGlidG9vbCBpdHNlbGYgZnJvbSByZWNvZ25pemluZyB0aGVtLgorCSAgICA7OworICAgIGVzYWMKKyAgICBwcmV2X2FyZz0kYXJnCisKKyAgICAjIElmICQoTERGTEFHUykgaXMgKHNheSk6CisgICAgIyAgIGEgImInYyBkIiBlCisgICAgIyB0aGVuIHRoZSB1c2VyIGV4cGVjdHMgdGhhdDoKKyAgICAjICAgJChMRCkgJChMREZMQUdTKQorICAgICMgd2lsbCBwYXNzIHRocmVlIGFyZ3VtZW50cyB0byAkKExEKToKKyAgICAjICAgMSkgYQorICAgICMgICAyKSBiJ2MgZAorICAgICMgICAzKSBlCisgICAgIyBXZSBtdXN0IGVuc3VyZSwgdGhlcmVmb3JlLCB0aGF0IHRoZSBhcmd1bWVudHMgYXJlIGFwcHJvcHJpYXRlbHkKKyAgICAjIHF1b3RlZCBzbyB0aGF0IHVzaW5nOgorICAgICMgICBsaWJ0b29sIC0tbW9kZT1saW5rIC4uLiAkKExUTERGTEFHUykKKyAgICAjIHdpbGwgcmVzdWx0IGluIHRoZSBzYW1lIG51bWJlciBvZiBhcmd1bWVudHMgYmVpbmcgcGFzc2VkIHRvCisgICAgIyBsaWJ0b29sLiAgIEluIG90aGVyIHdvcmRzLCB3aGVuIHRoaXMgc2NyaXB0IHdhcyBpbnZva2VkLCB0aGUgc2hlbGwgCisgICAgIyByZW1vdmVkIG9uZSBsZXZlbCBvZiBxdW90aW5nLCBwcmVzZW50IGluICQoTERGTEFHUyk7IHdlIGhhdmUgdG8gcHV0IAorICAgICMgaXQgYmFjay4KKworICAgICMgUXVvdGUgYW55IGVtYmVkZGVkIHNpbmdsZSBxdW90ZXMuCisgICAgY2FzZSAkYXJnIGluCisJKiInIiopCisJICAgICMgVGhlIGZvbGxvd2luZyBjb21tYW5kIGNyZWF0ZXMgdGhlIHNjcmlwdDoKKwkgICAgIyAgIDFzLF5YLCw7c3wnfCciJyInfGcKKwkgICAgIyB3aGljaCByZW1vdmVzIGEgbGVhZGluZyBYLCBhbmQgdGhlbiBxdW90ZXMgYW5kIGVtYmVkZGVkIHNpbmdsZQorCSAgICAjIHF1b3Rlcy4KKwkgICAgc2VkX3NjcmlwdD0iMXMsXlgsLDtzfCd8J1wiJ1wiJ3xnIgorCSAgICAjIEFkZCBhIGxlYWRpbmcgIlgiIHNvIHRoYXQgaWYgJGFyZyBzdGFydHMgd2l0aCBhIGRhc2gsCisJICAgICMgdGhlIGVjaG8gY29tbWFuZCB3aWxsIG5vdCB0cnkgdG8gaW50ZXJwcmV0IHRoZSBhcmd1bWVudAorCSAgICAjIGFzIGEgY29tbWFuZC1saW5lIG9wdGlvbi4KKwkgICAgYXJnPSJYJGFyZyIKKwkgICAgIyBHZW5lcmF0ZSB0aGUgcXVvdGVkIHN0cmluZy4KKwkgICAgcXVvdGVkX2FyZz1gZWNobyAiJGFyZyIgfCBzZWQgLWUgIiRzZWRfc2NyaXB0ImAKKwkgICAgOzsKKwkqKQorCSAgICBxdW90ZWRfYXJnPSRhcmcKKwkgICAgOzsKKyAgICBlc2FjCisgICAgIyBTdXJyb3VuZCB0aGUgZW50aXJlIGFyZ3VtZW50IHdpdGggc2luZ2xlIHF1b3Rlcy4KKyAgICBxdW90ZWRfYXJnPSInIiRxdW90ZWRfYXJnIiciIAorCisgICAgIyBBZGQgaXQgdG8gdGhlIHN0cmluZy4KKyAgICByZXN1bHQ9IiRyZXN1bHQgJHF1b3RlZF9hcmciCitkb25lCisKKyMgT3V0cHV0IHRoZSBzdHJpbmcgd2UgaGF2ZSBidWlsdCB1cC4KK2VjaG8gIiRyZXN1bHQiCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2xpYnRvb2wtdmVyc2lvbiBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbGlidG9vbC12ZXJzaW9uCmluZGV4IGI4YjgwZTAuLmU3ODRmYzQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbGlidG9vbC12ZXJzaW9uCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbGlidG9vbC12ZXJzaW9uCkBAIC0yNiw0ICsyNiw0IEBACiAjICAgIHJlbGVhc2UsIHRoZW4gc2V0IGFnZSB0byAwLgogIwogIyBDVVJSRU5UOlJFVklTSU9OOkFHRQotNToxMDowCis2OjE6MApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9sdG1haW4uc2ggYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2x0bWFpbi5zaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDY5MzlkY2MuLjYzYWU2OWQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9sdG1haW4uc2gKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9sdG1haW4uc2gKQEAgLTEsOSArMSw5IEBACi0jIEdlbmVyYXRlZCBmcm9tIGx0bWFpbi5tNHNoLgogCi0jIGx0bWFpbi5zaCAoR05VIGxpYnRvb2wpIDIuMi42CisjIGxpYnRvb2wgKEdOVSBsaWJ0b29sKSAyLjQuMgogIyBXcml0dGVuIGJ5IEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgogCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsCisjIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAjIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCiAjIHdhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogCkBAIC0zMiw1MCArMzIsNTcgQEAKICMKICMgUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCiAjCi0jICAgICAtLWNvbmZpZyAgICAgICAgICAgICBzaG93IGFsbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcwotIyAgICAgLS1kZWJ1ZyAgICAgICAgICAgICAgZW5hYmxlIHZlcmJvc2Ugc2hlbGwgdHJhY2luZwotIyAtbiwgLS1kcnktcnVuICAgICAgICAgICAgZGlzcGxheSBjb21tYW5kcyB3aXRob3V0IG1vZGlmeWluZyBhbnkgZmlsZXMKLSMgICAgIC0tZmVhdHVyZXMgICAgICAgICAgIGRpc3BsYXkgYmFzaWMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotIyAgICAgLS1tb2RlPU1PREUgICAgICAgICAgdXNlIG9wZXJhdGlvbiBtb2RlIE1PREUKLSMgICAgIC0tcHJlc2VydmUtZHVwLWRlcHMgIGRvbid0IHJlbW92ZSBkdXBsaWNhdGUgZGVwZW5kZW5jeSBsaWJyYXJpZXMKLSMgICAgIC0tcXVpZXQsIC0tc2lsZW50ICAgIGRvbid0IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMKLSMgICAgIC0tdGFnPVRBRyAgICAgICAgICAgIHVzZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmcm9tIHRhZyBUQUcKLSMgLXYsIC0tdmVyYm9zZSAgICAgICAgICAgIHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMgKGRlZmF1bHQpCi0jICAgICAtLXZlcnNpb24gICAgICAgICAgICBwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uCi0jIC1oLCAtLWhlbHAgICAgICAgICAgICAgICBwcmludCBzaG9ydCBvciBsb25nIGhlbHAgbWVzc2FnZQorIyAgICAgICAtLWNvbmZpZyAgICAgICAgICAgICBzaG93IGFsbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcworIyAgICAgICAtLWRlYnVnICAgICAgICAgICAgICBlbmFibGUgdmVyYm9zZSBzaGVsbCB0cmFjaW5nCisjICAgLW4sIC0tZHJ5LXJ1biAgICAgICAgICAgIGRpc3BsYXkgY29tbWFuZHMgd2l0aG91dCBtb2RpZnlpbmcgYW55IGZpbGVzCisjICAgICAgIC0tZmVhdHVyZXMgICAgICAgICAgIGRpc3BsYXkgYmFzaWMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorIyAgICAgICAtLW1vZGU9TU9ERSAgICAgICAgICB1c2Ugb3BlcmF0aW9uIG1vZGUgTU9ERQorIyAgICAgICAtLXByZXNlcnZlLWR1cC1kZXBzICBkb24ndCByZW1vdmUgZHVwbGljYXRlIGRlcGVuZGVuY3kgbGlicmFyaWVzCisjICAgICAgIC0tcXVpZXQsIC0tc2lsZW50ICAgIGRvbid0IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMKKyMgICAgICAgLS1uby1xdWlldCwgLS1uby1zaWxlbnQKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcyAoZGVmYXVsdCkKKyMgICAgICAgLS1uby13YXJuICAgICAgICAgICAgZG9uJ3QgZGlzcGxheSB3YXJuaW5nIG1lc3NhZ2VzCisjICAgICAgIC0tdGFnPVRBRyAgICAgICAgICAgIHVzZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmcm9tIHRhZyBUQUcKKyMgICAtdiwgLS12ZXJib3NlICAgICAgICAgICAgcHJpbnQgbW9yZSBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIHRoYW4gZGVmYXVsdAorIyAgICAgICAtLW5vLXZlcmJvc2UgICAgICAgICBkb24ndCBwcmludCB0aGUgZXh0cmEgaW5mb3JtYXRpb25hbCBtZXNzYWdlcworIyAgICAgICAtLXZlcnNpb24gICAgICAgICAgICBwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uCisjICAgLWgsIC0taGVscCwgLS1oZWxwLWFsbCAgIHByaW50IHNob3J0LCBsb25nLCBvciBkZXRhaWxlZCBoZWxwIG1lc3NhZ2UKICMKICMgTU9ERSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgogIwotIyAgICAgICBjbGVhbiAgICAgICAgICAgICAgcmVtb3ZlIGZpbGVzIGZyb20gdGhlIGJ1aWxkIGRpcmVjdG9yeQotIyAgICAgICBjb21waWxlICAgICAgICAgICAgY29tcGlsZSBhIHNvdXJjZSBmaWxlIGludG8gYSBsaWJ0b29sIG9iamVjdAotIyAgICAgICBleGVjdXRlICAgICAgICAgICAgYXV0b21hdGljYWxseSBzZXQgbGlicmFyeSBwYXRoLCB0aGVuIHJ1biBhIHByb2dyYW0KLSMgICAgICAgZmluaXNoICAgICAgICAgICAgIGNvbXBsZXRlIHRoZSBpbnN0YWxsYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMKLSMgICAgICAgaW5zdGFsbCAgICAgICAgICAgIGluc3RhbGwgbGlicmFyaWVzIG9yIGV4ZWN1dGFibGVzCi0jICAgICAgIGxpbmsgICAgICAgICAgICAgICBjcmVhdGUgYSBsaWJyYXJ5IG9yIGFuIGV4ZWN1dGFibGUKLSMgICAgICAgdW5pbnN0YWxsICAgICAgICAgIHJlbW92ZSBsaWJyYXJpZXMgZnJvbSBhbiBpbnN0YWxsZWQgZGlyZWN0b3J5CisjICAgICAgICAgY2xlYW4gICAgICAgICAgICAgIHJlbW92ZSBmaWxlcyBmcm9tIHRoZSBidWlsZCBkaXJlY3RvcnkKKyMgICAgICAgICBjb21waWxlICAgICAgICAgICAgY29tcGlsZSBhIHNvdXJjZSBmaWxlIGludG8gYSBsaWJ0b29sIG9iamVjdAorIyAgICAgICAgIGV4ZWN1dGUgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IHNldCBsaWJyYXJ5IHBhdGgsIHRoZW4gcnVuIGEgcHJvZ3JhbQorIyAgICAgICAgIGZpbmlzaCAgICAgICAgICAgICBjb21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzCisjICAgICAgICAgaW5zdGFsbCAgICAgICAgICAgIGluc3RhbGwgbGlicmFyaWVzIG9yIGV4ZWN1dGFibGVzCisjICAgICAgICAgbGluayAgICAgICAgICAgICAgIGNyZWF0ZSBhIGxpYnJhcnkgb3IgYW4gZXhlY3V0YWJsZQorIyAgICAgICAgIHVuaW5zdGFsbCAgICAgICAgICByZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGVkIGRpcmVjdG9yeQogIwotIyBNT0RFLUFSR1MgdmFyeSBkZXBlbmRpbmcgb24gdGhlIE1PREUuCisjIE1PREUtQVJHUyB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgTU9ERS4gIFdoZW4gcGFzc2VkIGFzIGZpcnN0IG9wdGlvbiwKKyMgYC0tbW9kZT1NT0RFJyBtYXkgYmUgYWJicmV2aWF0ZWQgYXMgYE1PREUnIG9yIGEgdW5pcXVlIGFiYnJldmlhdGlvbiBvZiB0aGF0LgogIyBUcnkgYCRwcm9nbmFtZSAtLWhlbHAgLS1tb2RlPU1PREUnIGZvciBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgTU9ERS4KICMKICMgV2hlbiByZXBvcnRpbmcgYSBidWcsIHBsZWFzZSBkZXNjcmliZSBhIHRlc3QgY2FzZSB0byByZXByb2R1Y2UgaXQgYW5kCiAjIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoKICMKLSMgICAgICAgaG9zdC10cmlwbGV0OgkkaG9zdAotIyAgICAgICBzaGVsbDoJCSRTSEVMTAotIyAgICAgICBjb21waWxlcjoJCSRMVENDCi0jICAgICAgIGNvbXBpbGVyIGZsYWdzOgkJJExUQ0ZMQUdTCi0jICAgICAgIGxpbmtlcjoJCSRMRCAoZ251PyAkd2l0aF9nbnVfbGQpCi0jICAgICAgICRwcm9nbmFtZToJCShHTlUgbGlidG9vbCkgMi4yLjYKLSMgICAgICAgYXV0b21ha2U6CQkkYXV0b21ha2VfdmVyc2lvbgotIyAgICAgICBhdXRvY29uZjoJCSRhdXRvY29uZl92ZXJzaW9uCisjICAgICAgICAgaG9zdC10cmlwbGV0OgkkaG9zdAorIyAgICAgICAgIHNoZWxsOgkJJFNIRUxMCisjICAgICAgICAgY29tcGlsZXI6CQkkTFRDQworIyAgICAgICAgIGNvbXBpbGVyIGZsYWdzOgkJJExUQ0ZMQUdTCisjICAgICAgICAgbGlua2VyOgkJJExEIChnbnU/ICR3aXRoX2dudV9sZCkKKyMgICAgICAgICAkcHJvZ25hbWU6CShHTlUgbGlidG9vbCkgMi40LjIKKyMgICAgICAgICBhdXRvbWFrZToJJGF1dG9tYWtlX3ZlcnNpb24KKyMgICAgICAgICBhdXRvY29uZjoJJGF1dG9jb25mX3ZlcnNpb24KICMKICMgUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1saWJ0b29sQGdudS5vcmc+LgorIyBHTlUgbGlidG9vbCBob21lIHBhZ2U6IDxodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGlidG9vbC8+LgorIyBHZW5lcmFsIGhlbHAgdXNpbmcgR05VIHNvZnR3YXJlOiA8aHR0cDovL3d3dy5nbnUub3JnL2dldGhlbHAvPi4KIAotUFJPR1JBTT1sdG1haW4uc2gKK1BST0dSQU09bGlidG9vbAogUEFDS0FHRT1saWJ0b29sCi1WRVJTSU9OPTIuMi42CitWRVJTSU9OPTIuNC4yCiBUSU1FU1RBTVA9IiIKLXBhY2thZ2VfcmV2aXNpb249MS4zMDEyCitwYWNrYWdlX3JldmlzaW9uPTEuMzMzNwogCiAjIEJlIEJvdXJuZSBjb21wYXRpYmxlCiBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KQEAgLTkxLDEwICs5OCwxNSBAQAogQklOX1NIPXhwZzQ7IGV4cG9ydCBCSU5fU0ggIyBmb3IgVHJ1NjQKIERVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKIAorIyBBIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB3aGVuIHRoZXJlIGlzIG5vIHByaW50IGJ1aWx0aW4gb3IgcHJpbnRmLgorZnVuY19mYWxsYmFja19lY2hvICgpCit7CisgIGV2YWwgJ2NhdCA8PF9MVEVDSE9fRU9GCiskMQorX0xURUNIT19FT0YnCit9CisKICMgTkxTIG51aXNhbmNlczogV2Ugc2F2ZSB0aGUgb2xkIHZhbHVlcyB0byByZXN0b3JlIGR1cmluZyBleGVjdXRlIG1vZGUuCi0jIE9ubHkgc2V0IExBTkcgYW5kIExDX0FMTCB0byBDIGlmIGFscmVhZHkgc2V0LgotIyBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5IGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQKLSMgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KIGx0X3VzZXJfbG9jYWxlPQogbHRfc2FmZV9sb2NhbGU9CiBmb3IgbHRfdmFyIGluIExBTkcgTEFOR1VBR0UgTENfQUxMIExDX0NUWVBFIExDX0NPTExBVEUgTENfTUVTU0FHRVMKQEAgLTEwNywyNCArMTE5LDI4IEBACiAJICBsdF9zYWZlX2xvY2FsZT1cIiRsdF92YXI9QzsgXCRsdF9zYWZlX2xvY2FsZVwiCiAJZmkiCiBkb25lCitMQ19BTEw9QworTEFOR1VBR0U9QworZXhwb3J0IExBTkdVQUdFIExDX0FMTAogCiAkbHRfdW5zZXQgQ0RQQVRICiAKIAorIyBXb3JrIGFyb3VuZCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGlzc3VlIG9uIElSSVggNi41LiBPbiBJUklYIDYuNCssIHNoCisjIGlzIGtzaCBidXQgd2hlbiB0aGUgc2hlbGwgaXMgaW52b2tlZCBhcyAic2giIGFuZCB0aGUgY3VycmVudCB2YWx1ZSBvZgorIyB0aGUgX1hQRyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZXF1YWwgdG8gMSAob25lKSwgdGhlIHNwZWNpYWwKKyMgcG9zaXRpb25hbCBwYXJhbWV0ZXIgJDAsIHdpdGhpbiBhIGZ1bmN0aW9uIGNhbGwsIGlzIHRoZSBuYW1lIG9mIHRoZQorIyBmdW5jdGlvbi4KK3Byb2dwYXRoPSIkMCIKIAogCiAKIDogJHtDUD0iY3AgLWYifQotOiAke0VDSE89ImVjaG8ifQotOiAke0VHUkVQPSIvYmluL2dyZXAgLUUifQotOiAke0ZHUkVQPSIvYmluL2dyZXAgLUYifQotOiAke0dSRVA9Ii9iaW4vZ3JlcCJ9Ci06ICR7TE5fUz0ibG4gLXMifQordGVzdCAiJHtFQ0hPK3NldH0iID0gc2V0IHx8IEVDSE89JHthc19lY2hvLSdwcmludGYgJXNcbid9CiA6ICR7TUFLRT0ibWFrZSJ9CiA6ICR7TUtESVI9Im1rZGlyIn0KIDogJHtNVj0ibXYgLWYifQogOiAke1JNPSJybSAtZiJ9Ci06ICR7U0VEPSIvYmluL3NlZCJ9CiA6ICR7U0hFTEw9IiR7Q09ORklHX1NIRUxMLS9iaW4vc2h9In0KIDogJHtYc2VkPSIkU0VEIC1lIDFzL15YLy8ifQogCkBAIC0xNDQsNiArMTYwLDI3IEBACiBkaXJuYW1lPSJzLC9bXi9dKiQsLCIKIGJhc2VuYW1lPSJzLF4uKi8sLCIKIAorIyBmdW5jX2Rpcm5hbWUgZmlsZSBhcHBlbmQgbm9uZGlyX3JlcGxhY2VtZW50CisjIENvbXB1dGUgdGhlIGRpcm5hbWUgb2YgRklMRS4gIElmIG5vbmVtcHR5LCBhZGQgQVBQRU5EIHRvIHRoZSByZXN1bHQsCisjIG90aGVyd2lzZSBzZXQgcmVzdWx0IHRvIE5PTkRJUl9SRVBMQUNFTUVOVC4KK2Z1bmNfZGlybmFtZSAoKQoreworICAgIGZ1bmNfZGlybmFtZV9yZXN1bHQ9YCRFQ0hPICIkezF9IiB8ICRTRUQgIiRkaXJuYW1lImAKKyAgICBpZiB0ZXN0ICJYJGZ1bmNfZGlybmFtZV9yZXN1bHQiID0gIlgkezF9IjsgdGhlbgorICAgICAgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIKKyAgICBlbHNlCisgICAgICBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkZnVuY19kaXJuYW1lX3Jlc3VsdCR7Mn0iCisgICAgZmkKK30gIyBmdW5jX2Rpcm5hbWUgbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKKworIyBmdW5jX2Jhc2VuYW1lIGZpbGUKK2Z1bmNfYmFzZW5hbWUgKCkKK3sKKyAgICBmdW5jX2Jhc2VuYW1lX3Jlc3VsdD1gJEVDSE8gIiR7MX0iIHwgJFNFRCAiJGJhc2VuYW1lImAKK30gIyBmdW5jX2Jhc2VuYW1lIG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCisKICMgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSBmaWxlIGFwcGVuZCBub25kaXJfcmVwbGFjZW1lbnQKICMgcGVyZm9ybSBmdW5jX2Jhc2VuYW1lIGFuZCBmdW5jX2Rpcm5hbWUgaW4gYSBzaW5nbGUgZnVuY3Rpb24KICMgY2FsbDoKQEAgLTE1OCwzMyArMTk1LDE4MyBAQAogIyB0aG9zZSBmdW5jdGlvbnMgYnV0IGluc3RlYWQgZHVwbGljYXRlIHRoZSBmdW5jdGlvbmFsaXR5IGhlcmUuCiBmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lICgpCiB7Ci0gICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCi0gIGZ1bmNfZGlybmFtZV9yZXN1bHQ9YCRFQ0hPICJYJHsxfSIgfCAkWHNlZCAtZSAiJGRpcm5hbWUiYAotICBpZiB0ZXN0ICJYJGZ1bmNfZGlybmFtZV9yZXN1bHQiID0gIlgkezF9IjsgdGhlbgotICAgIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7M30iCi0gIGVsc2UKLSAgICBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkZnVuY19kaXJuYW1lX3Jlc3VsdCR7Mn0iCi0gIGZpCi0gIGZ1bmNfYmFzZW5hbWVfcmVzdWx0PWAkRUNITyAiWCR7MX0iIHwgJFhzZWQgLWUgIiRiYXNlbmFtZSJgCisgICAgIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KKyAgICBmdW5jX2Rpcm5hbWVfcmVzdWx0PWAkRUNITyAiJHsxfSIgfCAkU0VEIC1lICIkZGlybmFtZSJgCisgICAgaWYgdGVzdCAiWCRmdW5jX2Rpcm5hbWVfcmVzdWx0IiA9ICJYJHsxfSI7IHRoZW4KKyAgICAgIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7M30iCisgICAgZWxzZQorICAgICAgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJGZ1bmNfZGlybmFtZV9yZXN1bHQkezJ9IgorICAgIGZpCisgICAgZnVuY19iYXNlbmFtZV9yZXN1bHQ9YCRFQ0hPICIkezF9IiB8ICRTRUQgLWUgIiRiYXNlbmFtZSJgCit9ICMgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworCisjIGZ1bmNfc3RyaXBuYW1lIHByZWZpeCBzdWZmaXggbmFtZQorIyBzdHJpcCBQUkVGSVggYW5kIFNVRkZJWCBvZmYgb2YgTkFNRS4KKyMgUFJFRklYIGFuZCBTVUZGSVggbXVzdCBub3QgY29udGFpbiBnbG9iYmluZyBvciByZWdleCBzcGVjaWFsCisjIGNoYXJhY3RlcnMsIGhhc2hlcywgcGVyY2VudCBzaWducywgYnV0IFNVRkZJWCBtYXkgY29udGFpbiBhIGxlYWRpbmcKKyMgZG90IChpbiB3aGljaCBjYXNlIHRoYXQgbWF0Y2hlcyBvbmx5IGEgZG90KS4KKyMgZnVuY19zdHJpcF9zdWZmaXggcHJlZml4IG5hbWUKK2Z1bmNfc3RyaXBuYW1lICgpCit7CisgICAgY2FzZSAkezJ9IGluCisgICAgICAuKikgZnVuY19zdHJpcG5hbWVfcmVzdWx0PWAkRUNITyAiJHszfSIgfCAkU0VEICJzJV4kezF9JSU7IHMlXFxcXCR7Mn1cJCUlImA7OworICAgICAgKikgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD1gJEVDSE8gIiR7M30iIHwgJFNFRCAicyVeJHsxfSUlOyBzJSR7Mn1cJCUlImA7OworICAgIGVzYWMKK30gIyBmdW5jX3N0cmlwbmFtZSBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworCisjIFRoZXNlIFNFRCBzY3JpcHRzIHByZXN1cHBvc2UgYW4gYWJzb2x1dGUgcGF0aCB3aXRoIGEgdHJhaWxpbmcgc2xhc2guCitwYXRoY2FyPSdzLF4vXChbXi9dKlwpLiokLFwxLCcKK3BhdGhjZHI9J3MsXi9bXi9dKiwsJworcmVtb3ZlZG90cGFydHM9Jzpkb3RzbAorCQlzQC9cLi9AL0BnCisJCXQgZG90c2wKKwkJcywvXC4kLC8sJworY29sbGFwc2VzbGFzaGVzPSdzQC9cezEsXH1AL0BnJworZmluYWxzbGFzaD0ncywvKiQsLywnCisKKyMgZnVuY19ub3JtYWxfYWJzcGF0aCBQQVRICisjIFJlbW92ZSBkb3VibGVkLXVwIGFuZCB0cmFpbGluZyBzbGFzaGVzLCAiLiIgcGF0aCBjb21wb25lbnRzLAorIyBhbmQgY2FuY2VsIG91dCBhbnkgIi4uIiBwYXRoIGNvbXBvbmVudHMgaW4gUEFUSCBhZnRlciBtYWtpbmcKKyMgaXQgYW4gYWJzb2x1dGUgcGF0aC4KKyMgICAgICAgICAgICAgdmFsdWUgcmV0dXJuZWQgaW4gIiRmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdCIKK2Z1bmNfbm9ybWFsX2Fic3BhdGggKCkKK3sKKyAgIyBTdGFydCBmcm9tIHJvb3QgZGlyIGFuZCByZWFzc2VtYmxlIHRoZSBwYXRoLgorICBmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdD0KKyAgZnVuY19ub3JtYWxfYWJzcGF0aF90cGF0aD0kMQorICBmdW5jX25vcm1hbF9hYnNwYXRoX2FsdG5hbWVzcGFjZT0KKyAgY2FzZSAkZnVuY19ub3JtYWxfYWJzcGF0aF90cGF0aCBpbgorICAgICIiKQorICAgICAgIyBFbXB0eSBwYXRoLCB0aGF0IGp1c3QgbWVhbnMgJGN3ZC4KKyAgICAgIGZ1bmNfc3RyaXBuYW1lICcnICcvJyAiYHB3ZGAiCisgICAgICBmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisgICAgICByZXR1cm4KKyAgICA7OworICAgICMgVGhlIG5leHQgdGhyZWUgZW50cmllcyBhcmUgdXNlZCB0byBzcG90IGEgcnVuIG9mIHByZWNpc2VseQorICAgICMgdHdvIGxlYWRpbmcgc2xhc2hlcyB3aXRob3V0IHVzaW5nIG5lZ2F0ZWQgY2hhcmFjdGVyIGNsYXNzZXM7CisgICAgIyB3ZSB0YWtlIGFkdmFudGFnZSBvZiBjYXNlJ3MgZmlyc3QtbWF0Y2ggYmVoYXZpb3VyLgorICAgIC8vLyopCisgICAgICAjIFVudXN1YWwgZm9ybSBvZiBhYnNvbHV0ZSBwYXRoLCBkbyBub3RoaW5nLgorICAgIDs7CisgICAgLy8qKQorICAgICAgIyBOb3QgbmVjZXNzYXJpbHkgYW4gb3JkaW5hcnkgcGF0aDsgUE9TSVggcmVzZXJ2ZXMgbGVhZGluZyAnLy8nCisgICAgICAjIGFuZCBmb3IgZXhhbXBsZSBDeWd3aW4gdXNlcyBpdCB0byBhY2Nlc3MgcmVtb3RlIGZpbGUgc2hhcmVzCisgICAgICAjIG92ZXIgQ0lGUy9TTUIsIHNvIHdlIGNvbnNlcnZlIGEgbGVhZGluZyBkb3VibGUgc2xhc2ggaWYgZm91bmQuCisgICAgICBmdW5jX25vcm1hbF9hYnNwYXRoX2FsdG5hbWVzcGFjZT0vCisgICAgOzsKKyAgICAvKikKKyAgICAgICMgQWJzb2x1dGUgcGF0aCwgZG8gbm90aGluZy4KKyAgICA7OworICAgICopCisgICAgICAjIFJlbGF0aXZlIHBhdGgsIHByZXBlbmQgJGN3ZC4KKyAgICAgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGg9YHB3ZGAvJGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGgKKyAgICA7OworICBlc2FjCisgICMgQ2FuY2VsIG91dCBhbGwgdGhlIHNpbXBsZSBzdHVmZiB0byBzYXZlIGl0ZXJhdGlvbnMuICBXZSBhbHNvIHdhbnQKKyAgIyB0aGUgcGF0aCB0byBlbmQgd2l0aCBhIHNsYXNoIGZvciBlYXNlIG9mIHBhcnNpbmcsIHNvIG1ha2Ugc3VyZQorICAjIHRoZXJlIGlzIG9uZSAoYW5kIG9ubHkgb25lKSBoZXJlLgorICBmdW5jX25vcm1hbF9hYnNwYXRoX3RwYXRoPWAkRUNITyAiJGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGgiIHwgJFNFRCBcCisgICAgICAgIC1lICIkcmVtb3ZlZG90cGFydHMiIC1lICIkY29sbGFwc2VzbGFzaGVzIiAtZSAiJGZpbmFsc2xhc2giYAorICB3aGlsZSA6OyBkbworICAgICMgUHJvY2Vzc2VkIGl0IGFsbCB5ZXQ/CisgICAgaWYgdGVzdCAiJGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGgiID0gLyA7IHRoZW4KKyAgICAgICMgSWYgd2UgYXNjZW5kZWQgdG8gdGhlIHJvb3QgdXNpbmcgIi4uIiB0aGUgcmVzdWx0IG1heSBiZSBlbXB0eSBub3cuCisgICAgICBpZiB0ZXN0IC16ICIkZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQiIDsgdGhlbgorICAgICAgICBmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdD0vCisgICAgICBmaQorICAgICAgYnJlYWsKKyAgICBmaQorICAgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfdGNvbXBvbmVudD1gJEVDSE8gIiRmdW5jX25vcm1hbF9hYnNwYXRoX3RwYXRoIiB8ICRTRUQgXAorICAgICAgICAtZSAiJHBhdGhjYXIiYAorICAgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGg9YCRFQ0hPICIkZnVuY19ub3JtYWxfYWJzcGF0aF90cGF0aCIgfCAkU0VEIFwKKyAgICAgICAgLWUgIiRwYXRoY2RyImAKKyAgICAjIEZpZ3VyZSBvdXQgd2hhdCB0byBkbyB3aXRoIGl0CisgICAgY2FzZSAkZnVuY19ub3JtYWxfYWJzcGF0aF90Y29tcG9uZW50IGluCisgICAgICAiIikKKyAgICAgICAgIyBUcmFpbGluZyBlbXB0eSBwYXRoIGNvbXBvbmVudCwgaWdub3JlIGl0LgorICAgICAgOzsKKyAgICAgIC4uKQorICAgICAgICAjIFBhcmVudCBkaXI7IHN0cmlwIGxhc3QgYXNzZW1ibGVkIGNvbXBvbmVudCBmcm9tIHJlc3VsdC4KKyAgICAgICAgZnVuY19kaXJuYW1lICIkZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQiCisgICAgICAgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0PSRmdW5jX2Rpcm5hbWVfcmVzdWx0CisgICAgICA7OworICAgICAgKikKKyAgICAgICAgIyBBY3R1YWwgcGF0aCBjb21wb25lbnQsIGFwcGVuZCBpdC4KKyAgICAgICAgZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQ9JGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0LyRmdW5jX25vcm1hbF9hYnNwYXRoX3Rjb21wb25lbnQKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisgICMgUmVzdG9yZSBsZWFkaW5nIGRvdWJsZS1zbGFzaCBpZiBvbmUgd2FzIGZvdW5kIG9uIGVudHJ5LgorICBmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdD0kZnVuY19ub3JtYWxfYWJzcGF0aF9hbHRuYW1lc3BhY2UkZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQKIH0KIAotIyBHZW5lcmF0ZWQgc2hlbGwgZnVuY3Rpb25zIGluc2VydGVkIGhlcmUuCisjIGZ1bmNfcmVsYXRpdmVfcGF0aCBTUkNESVIgRFNURElSCisjIGdlbmVyYXRlcyBhIHJlbGF0aXZlIHBhdGggZnJvbSBTUkNESVIgdG8gRFNURElSLCB3aXRoIGEgdHJhaWxpbmcKKyMgc2xhc2ggaWYgbm9uLWVtcHR5LCBzdWl0YWJsZSBmb3IgaW1tZWRpYXRlbHkgYXBwZW5kaW5nIGEgZmlsZW5hbWUKKyMgd2l0aG91dCBuZWVkaW5nIHRvIGFwcGVuZCBhIHNlcGFyYXRvci4KKyMgICAgICAgICAgICAgdmFsdWUgcmV0dXJuZWQgaW4gIiRmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0IgorZnVuY19yZWxhdGl2ZV9wYXRoICgpCit7CisgIGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQ9CisgIGZ1bmNfbm9ybWFsX2Fic3BhdGggIiQxIgorICBmdW5jX3JlbGF0aXZlX3BhdGhfdGxpYmRpcj0kZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQKKyAgZnVuY19ub3JtYWxfYWJzcGF0aCAiJDIiCisgIGZ1bmNfcmVsYXRpdmVfcGF0aF90YmluZGlyPSRmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdAogCi0jIFdvcmsgYXJvdW5kIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaXNzdWUgb24gSVJJWCA2LjUuIE9uIElSSVggNi40Kywgc2gKLSMgaXMga3NoIGJ1dCB3aGVuIHRoZSBzaGVsbCBpcyBpbnZva2VkIGFzICJzaCIgYW5kIHRoZSBjdXJyZW50IHZhbHVlIG9mCi0jIHRoZSBfWFBHIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBlcXVhbCB0byAxIChvbmUpLCB0aGUgc3BlY2lhbAotIyBwb3NpdGlvbmFsIHBhcmFtZXRlciAkMCwgd2l0aGluIGEgZnVuY3Rpb24gY2FsbCwgaXMgdGhlIG5hbWUgb2YgdGhlCi0jIGZ1bmN0aW9uLgotcHJvZ3BhdGg9IiQwIgorICAjIEFzY2VuZCB0aGUgdHJlZSBzdGFydGluZyBmcm9tIGxpYmRpcgorICB3aGlsZSA6OyBkbworICAgICMgY2hlY2sgaWYgd2UgaGF2ZSBmb3VuZCBhIHByZWZpeCBvZiBiaW5kaXIKKyAgICBjYXNlICRmdW5jX3JlbGF0aXZlX3BhdGhfdGJpbmRpciBpbgorICAgICAgJGZ1bmNfcmVsYXRpdmVfcGF0aF90bGliZGlyKQorICAgICAgICAjIGZvdW5kIGFuIGV4YWN0IG1hdGNoCisgICAgICAgIGZ1bmNfcmVsYXRpdmVfcGF0aF90Y2FuY2VsbGVkPQorICAgICAgICBicmVhaworICAgICAgICA7OworICAgICAgJGZ1bmNfcmVsYXRpdmVfcGF0aF90bGliZGlyKikKKyAgICAgICAgIyBmb3VuZCBhIG1hdGNoaW5nIHByZWZpeAorICAgICAgICBmdW5jX3N0cmlwbmFtZSAiJGZ1bmNfcmVsYXRpdmVfcGF0aF90bGliZGlyIiAnJyAiJGZ1bmNfcmVsYXRpdmVfcGF0aF90YmluZGlyIgorICAgICAgICBmdW5jX3JlbGF0aXZlX3BhdGhfdGNhbmNlbGxlZD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisgICAgICAgIGlmIHRlc3QgLXogIiRmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0IjsgdGhlbgorICAgICAgICAgIGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQ9LgorICAgICAgICBmaQorICAgICAgICBicmVhaworICAgICAgICA7OworICAgICAgKikKKyAgICAgICAgZnVuY19kaXJuYW1lICRmdW5jX3JlbGF0aXZlX3BhdGhfdGxpYmRpcgorICAgICAgICBmdW5jX3JlbGF0aXZlX3BhdGhfdGxpYmRpcj0ke2Z1bmNfZGlybmFtZV9yZXN1bHR9CisgICAgICAgIGlmIHRlc3QgIngkZnVuY19yZWxhdGl2ZV9wYXRoX3RsaWJkaXIiID0geCA7IHRoZW4KKyAgICAgICAgICAjIEhhdmUgdG8gZGVzY2VuZCBhbGwgdGhlIHdheSB0byB0aGUgcm9vdCEKKyAgICAgICAgICBmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0PS4uLyRmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0CisgICAgICAgICAgZnVuY19yZWxhdGl2ZV9wYXRoX3RjYW5jZWxsZWQ9JGZ1bmNfcmVsYXRpdmVfcGF0aF90YmluZGlyCisgICAgICAgICAgYnJlYWsKKyAgICAgICAgZmkKKyAgICAgICAgZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdD0uLi8kZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdAorICAgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorCisgICMgTm93IGNhbGN1bGF0ZSBwYXRoOyB0YWtlIGNhcmUgdG8gYXZvaWQgZG91YmxpbmctdXAgc2xhc2hlcy4KKyAgZnVuY19zdHJpcG5hbWUgJycgJy8nICIkZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdCIKKyAgZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisgIGZ1bmNfc3RyaXBuYW1lICcvJyAnLycgIiRmdW5jX3JlbGF0aXZlX3BhdGhfdGNhbmNlbGxlZCIKKyAgaWYgdGVzdCAieCRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiICE9IHggOyB0aGVuCisgICAgZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdD0ke2Z1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHR9LyR7ZnVuY19zdHJpcG5hbWVfcmVzdWx0fQorICBmaQorCisgICMgTm9ybWFsaXNhdGlvbi4gSWYgYmluZGlyIGlzIGxpYmRpciwgcmV0dXJuIGVtcHR5IHN0cmluZywKKyAgIyBlbHNlIHJlbGF0aXZlIHBhdGggZW5kaW5nIHdpdGggYSBzbGFzaDsgZWl0aGVyIHdheSwgdGFyZ2V0CisgICMgZmlsZSBuYW1lIGNhbiBiZSBkaXJlY3RseSBhcHBlbmRlZC4KKyAgaWYgdGVzdCAhIC16ICIkZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdCI7IHRoZW4KKyAgICBmdW5jX3N0cmlwbmFtZSAnLi8nICcnICIkZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdC8iCisgICAgZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisgIGZpCit9CiAKICMgVGhlIG5hbWUgb2YgdGhpcyBwcm9ncmFtOgotIyBJbiB0aGUgdW5saWtlbHkgZXZlbnQgJHByb2duYW1lIGJlZ2FuIHdpdGggYSAnLScsIGl0IHdvdWxkIHBsYXkgaGF2b2Mgd2l0aAotIyBmdW5jX2VjaG8gKGltYWdpbmUgcHJvZ25hbWU9LW4pLCBzbyB3ZSBwcmVwZW5kIC4vIGluIHRoYXQgY2FzZToKIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgIiRwcm9ncGF0aCIKIHByb2duYW1lPSRmdW5jX2Jhc2VuYW1lX3Jlc3VsdAotY2FzZSAkcHJvZ25hbWUgaW4KLSAgLSopIHByb2duYW1lPS4vJHByb2duYW1lIDs7Ci1lc2FjCiAKICMgTWFrZSBzdXJlIHdlIGhhdmUgYW4gYWJzb2x1dGUgcGF0aCBmb3IgcmVleGVjdXRpb246CiBjYXNlICRwcm9ncGF0aCBpbgpAQCAtMTk2LDcgKzM4Myw3IEBACiAgICAgIDs7CiAgICopCiAgICAgIHNhdmVfSUZTPSIkSUZTIgotICAgICBJRlM9OgorICAgICBJRlM9JHtQQVRIX1NFUEFSQVRPUi06fQogICAgICBmb3IgcHJvZ2RpciBpbiAkUEFUSDsgZG8KICAgICAgICBJRlM9IiRzYXZlX0lGUyIKICAgICAgICB0ZXN0IC14ICIkcHJvZ2Rpci8kcHJvZ25hbWUiICYmIGJyZWFrCkBAIC0yMTUsNiArNDAyLDE1IEBACiAjIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KIGRvdWJsZV9xdW90ZV9zdWJzdD0ncy9cKFsiYFxcXVwpL1xcXDEvZycKIAorIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgdHVybnMgYSBzdHJpbmcgaW50byBhIHJlZ2V4IG1hdGNoaW5nIGZvciB0aGUKKyMgc3RyaW5nIGxpdGVyYWxseS4KK3NlZF9tYWtlX2xpdGVyYWxfcmVnZXg9J3MsW10uW14kXFwqXC9dLFxcJixnJworCisjIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBjb252ZXJ0cyBhIHczMiBmaWxlIG5hbWUgb3IgcGF0aAorIyB3aGljaCBjb250YWlucyBmb3J3YXJkIHNsYXNoZXMsIGludG8gb25lIHRoYXQgY29udGFpbnMKKyMgKGVzY2FwZWQpIGJhY2tzbGFzaGVzLiAgQSB2ZXJ5IG5haXZlIGltcGxlbWVudGF0aW9uLgorbHRfc2VkX25haXZlX2JhY2tzbGFzaGlmeT0nc3xcXFxcKnxcXHxnO3N8L3xcXHxnO3N8XFx8XFxcXHxnJworCiAjIFJlLWBcJyBwYXJhbWV0ZXIgZXhwYW5zaW9ucyBpbiBvdXRwdXQgb2YgZG91YmxlX3F1b3RlX3N1YnN0IHRoYXQgd2VyZQogIyBgXCctZWQgaW4gaW5wdXQgdG8gdGhlIHNhbWUuICBJZiBhbiBvZGQgbnVtYmVyIG9mIGBcJyBwcmVjZWRlZCBhICckJwogIyBpbiBpbnB1dCB0byBkb3VibGVfcXVvdGVfc3Vic3QsIHRoYXQgJyQnIHdhcyBwcm90ZWN0ZWQgZnJvbSBleHBhbnNpb24uCkBAIC0yNDMsNyArNDM5LDcgQEAKICMgbmFtZSBpZiBpdCBoYXMgYmVlbiBzZXQgeWV0LgogZnVuY19lY2hvICgpCiB7Ci0gICAgJEVDSE8gIiRwcm9nbmFtZSR7bW9kZSs6IH0kbW9kZTogJCoiCisgICAgJEVDSE8gIiRwcm9nbmFtZTogJHtvcHRfbW9kZSskb3B0X21vZGU6IH0kKiIKIH0KIAogIyBmdW5jX3ZlcmJvc2UgYXJnLi4uCkBAIC0yNTgsMTggKzQ1NCwyNSBAQAogICAgIDoKIH0KIAorIyBmdW5jX2VjaG9fYWxsIGFyZy4uLgorIyBJbnZva2UgJEVDSE8gd2l0aCBhbGwgYXJncywgc3BhY2Utc2VwYXJhdGVkLgorZnVuY19lY2hvX2FsbCAoKQoreworICAgICRFQ0hPICIkKiIKK30KKwogIyBmdW5jX2Vycm9yIGFyZy4uLgogIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yLgogZnVuY19lcnJvciAoKQogewotICAgICRFQ0hPICIkcHJvZ25hbWUke21vZGUrOiB9JG1vZGU6ICIkezErIiRAIn0gMT4mMgorICAgICRFQ0hPICIkcHJvZ25hbWU6ICR7b3B0X21vZGUrJG9wdF9tb2RlOiB9IiR7MSsiJEAifSAxPiYyCiB9CiAKICMgZnVuY193YXJuaW5nIGFyZy4uLgogIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCB3YXJuaW5nIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IuCiBmdW5jX3dhcm5pbmcgKCkKIHsKLSAgICAkb3B0X3dhcm5pbmcgJiYgJEVDSE8gIiRwcm9nbmFtZSR7bW9kZSs6IH0kbW9kZTogd2FybmluZzogIiR7MSsiJEAifSAxPiYyCisgICAgJG9wdF93YXJuaW5nICYmICRFQ0hPICIkcHJvZ25hbWU6ICR7b3B0X21vZGUrJG9wdF9tb2RlOiB9d2FybmluZzogIiR7MSsiJEAifSAxPiYyCiAKICAgICAjIGJhc2ggYnVnIGFnYWluOgogICAgIDoKQEAgLTMyNiw5ICs1MjksOSBAQAogICAgICAgICBjYXNlICRteV9kaXJlY3RvcnlfcGF0aCBpbiAqLyopIDs7ICopIGJyZWFrIDs7IGVzYWMKIAogICAgICAgICAjIC4uLm90aGVyd2lzZSB0aHJvdyBhd2F5IHRoZSBjaGlsZCBkaXJlY3RvcnkgYW5kIGxvb3AKLSAgICAgICAgbXlfZGlyZWN0b3J5X3BhdGg9YCRFQ0hPICJYJG15X2RpcmVjdG9yeV9wYXRoIiB8ICRYc2VkIC1lICIkZGlybmFtZSJgCisgICAgICAgIG15X2RpcmVjdG9yeV9wYXRoPWAkRUNITyAiJG15X2RpcmVjdG9yeV9wYXRoIiB8ICRTRUQgLWUgIiRkaXJuYW1lImAKICAgICAgIGRvbmUKLSAgICAgIG15X2Rpcl9saXN0PWAkRUNITyAiWCRteV9kaXJfbGlzdCIgfCAkWHNlZCAtZSAncyw6KiQsLCdgCisgICAgICBteV9kaXJfbGlzdD1gJEVDSE8gIiRteV9kaXJfbGlzdCIgfCAkU0VEICdzLDoqJCwsJ2AKIAogICAgICAgc2F2ZV9ta2Rpcl9wX0lGUz0iJElGUyI7IElGUz0nOicKICAgICAgIGZvciBteV9kaXIgaW4gJG15X2Rpcl9saXN0OyBkbwpAQCAtMzc4LDcgKzU4MSw3IEBACiAgICAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBjcmVhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBcYCRteV90bXBkaXInIgogICAgIGZpCiAKLSAgICAkRUNITyAiWCRteV90bXBkaXIiIHwgJFhzZWQKKyAgICAkRUNITyAiJG15X3RtcGRpciIKIH0KIAogCkBAIC0zOTIsNyArNTk1LDcgQEAKIHsKICAgICBjYXNlICQxIGluCiAgICAgICAqW1xcXGBcIlwkXSopCi0JZnVuY19xdW90ZV9mb3JfZXZhbF91bnF1b3RlZF9yZXN1bHQ9YCRFQ0hPICJYJDEiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYCA7OworCWZ1bmNfcXVvdGVfZm9yX2V2YWxfdW5xdW90ZWRfcmVzdWx0PWAkRUNITyAiJDEiIHwgJFNFRCAiJHNlZF9xdW90ZV9zdWJzdCJgIDs7CiAgICAgICAqKQogICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsX3VucXVvdGVkX3Jlc3VsdD0iJDEiIDs7CiAgICAgZXNhYwpAQCAtNDE5LDcgKzYyMiw3IEBACiB7CiAgICAgY2FzZSAkMSBpbgogICAgICAgKltcXFxgXCJdKikKLQlteV9hcmc9YCRFQ0hPICJYJDEiIHwgJFhzZWQgXAorCW15X2FyZz1gJEVDSE8gIiQxIiB8ICRTRUQgXAogCSAgICAtZSAiJGRvdWJsZV9xdW90ZV9zdWJzdCIgLWUgIiRzZWRfZG91YmxlX2JhY2tzbGFzaCJgIDs7CiAgICAgICAqKQogICAgICAgICBteV9hcmc9IiQxIiA7OwpAQCAtNDg4LDE1ICs2OTEsMzkgQEAKICAgICBmaQogfQogCi0KLQorIyBmdW5jX3RyX3NoCisjIFR1cm4gJDEgaW50byBhIHN0cmluZyBzdWl0YWJsZSBmb3IgYSBzaGVsbCB2YXJpYWJsZSBuYW1lLgorIyBSZXN1bHQgaXMgc3RvcmVkIGluICRmdW5jX3RyX3NoX3Jlc3VsdC4gIEFsbCBjaGFyYWN0ZXJzCisjIG5vdCBpbiB0aGUgc2V0IGEtekEtWjAtOV8gYXJlIHJlcGxhY2VkIHdpdGggJ18nLiBGdXJ0aGVyLAorIyBpZiAkMSBiZWdpbnMgd2l0aCBhIGRpZ2l0LCBhICdfJyBpcyBwcmVwZW5kZWQgYXMgd2VsbC4KK2Z1bmNfdHJfc2ggKCkKK3sKKyAgY2FzZSAkMSBpbgorICBbMC05XSogfCAqWyFhLXpBLVowLTlfXSopCisgICAgZnVuY190cl9zaF9yZXN1bHQ9YCRFQ0hPICIkMSIgfCAkU0VEICdzL15cKFswLTldXCkvX1wxLzsgcy9bXmEtekEtWjAtOV9dL18vZydgCisgICAgOzsKKyAgKiApCisgICAgZnVuY190cl9zaF9yZXN1bHQ9JDEKKyAgICA7OworICBlc2FjCit9CiAKIAogIyBmdW5jX3ZlcnNpb24KICMgRWNobyB2ZXJzaW9uIG1lc3NhZ2UgdG8gc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LgogZnVuY192ZXJzaW9uICgpCiB7Ci0gICAgJFNFRCAtbiAnL14jICckUFJPR1JBTScgKEdOVSAvLC8jIHdhcnJhbnR5OyAvIHsKKyAgICAkb3B0X2RlYnVnCisKKyAgICAkU0VEIC1uICcvKEMpLyFiIGdvCisJOm1vcmUKKwkvXC4vIXsKKwkgIE4KKwkgIHMvXG4jIC8gLworCSAgYiBtb3JlCisJfQorCTpnbworCS9eIyAnJFBST0dSQU0nIChHTlUgLywvIyB3YXJyYW50eTsgLyB7CiAgICAgICAgIHMvXiMgLy8KIAlzL14jICokLy8KICAgICAgICAgcy9cKChDKVwpWyAwLTksLV0qXCggWzEtOV1bMC05XSpcKS9cMVwyLwpAQCAtNTA5LDIyICs3MzYsMjggQEAKICMgRWNobyBzaG9ydCBoZWxwIG1lc3NhZ2UgdG8gc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LgogZnVuY191c2FnZSAoKQogewotICAgICRTRUQgLW4gJy9eIyBVc2FnZTovLC8jIC1oLyB7CisgICAgJG9wdF9kZWJ1ZworCisgICAgJFNFRCAtbiAnL14jIFVzYWdlOi8sL14jICAqLiotLWhlbHAvIHsKICAgICAgICAgcy9eIyAvLwogCXMvXiMgKiQvLwogCXMvXCRwcm9nbmFtZS8nJHByb2duYW1lJy8KIAlwCiAgICAgfScgPCAiJHByb2dwYXRoIgotICAgICRFQ0hPCisgICAgZWNobwogICAgICRFQ0hPICJydW4gXGAkcHJvZ25hbWUgLS1oZWxwIHwgbW9yZScgZm9yIGZ1bGwgdXNhZ2UiCiAgICAgZXhpdCAkPwogfQogCi0jIGZ1bmNfaGVscAotIyBFY2hvIGxvbmcgaGVscCBtZXNzYWdlIHRvIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KKyMgZnVuY19oZWxwIFtOT0VYSVRdCisjIEVjaG8gbG9uZyBoZWxwIG1lc3NhZ2UgdG8gc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LAorIyB1bmxlc3MgJ25vZXhpdCcgaXMgcGFzc2VkIGFzIGFyZ3VtZW50LgogZnVuY19oZWxwICgpCiB7CisgICAgJG9wdF9kZWJ1ZworCiAgICAgJFNFRCAtbiAnL14jIFVzYWdlOi8sLyMgUmVwb3J0IGJ1Z3MgdG8vIHsKKwk6cHJpbnQKICAgICAgICAgcy9eIyAvLwogCXMvXiMgKiQvLwogCXMqXCRwcm9nbmFtZSonJHByb2duYW1lJyoKQEAgLTUzNCwxMSArNzY3LDE4IEBACiAJcypcJExUQ0ZMQUdTKiciJExUQ0ZMQUdTIicqCiAJcypcJExEKiciJExEIicqCiAJcy9cJHdpdGhfZ251X2xkLyciJHdpdGhfZ251X2xkIicvCi0Jcy9cJGF1dG9tYWtlX3ZlcnNpb24vJyJgKGF1dG9tYWtlIC0tdmVyc2lvbikgMj4vZGV2L251bGwgfCRTRUQgMXFgIicvCi0Jcy9cJGF1dG9jb25mX3ZlcnNpb24vJyJgKGF1dG9jb25mIC0tdmVyc2lvbikgMj4vZGV2L251bGwgfCRTRUQgMXFgIicvCisJcy9cJGF1dG9tYWtlX3ZlcnNpb24vJyJgKCR7QVVUT01BS0UtYXV0b21ha2V9IC0tdmVyc2lvbikgMj4vZGV2L251bGwgfCRTRUQgMXFgIicvCisJcy9cJGF1dG9jb25mX3ZlcnNpb24vJyJgKCR7QVVUT0NPTkYtYXV0b2NvbmZ9IC0tdmVyc2lvbikgMj4vZGV2L251bGwgfCRTRUQgMXFgIicvCiAJcAotICAgICB9JyA8ICIkcHJvZ3BhdGgiCi0gICAgZXhpdCAkPworCWQKKyAgICAgfQorICAgICAvXiMgLiogaG9tZSBwYWdlOi9iIHByaW50CisgICAgIC9eIyBHZW5lcmFsIGhlbHAgdXNpbmcvYiBwcmludAorICAgICAnIDwgIiRwcm9ncGF0aCIKKyAgICByZXQ9JD8KKyAgICBpZiB0ZXN0IC16ICIkMSI7IHRoZW4KKyAgICAgIGV4aXQgJHJldAorICAgIGZpCiB9CiAKICMgZnVuY19taXNzaW5nX2FyZyBhcmduYW1lCkBAIC01NDYsNjMgKzc4NiwxMDYgQEAKICMgZXhpdF9jbWQuCiBmdW5jX21pc3NpbmdfYXJnICgpCiB7Ci0gICAgZnVuY19lcnJvciAibWlzc2luZyBhcmd1bWVudCBmb3IgJDEiCisgICAgJG9wdF9kZWJ1ZworCisgICAgZnVuY19lcnJvciAibWlzc2luZyBhcmd1bWVudCBmb3IgJDEuIgogICAgIGV4aXRfY21kPWV4aXQKIH0KIAorCisjIGZ1bmNfc3BsaXRfc2hvcnRfb3B0IHNob3J0b3B0CisjIFNldCBmdW5jX3NwbGl0X3Nob3J0X29wdF9uYW1lIGFuZCBmdW5jX3NwbGl0X3Nob3J0X29wdF9hcmcgc2hlbGwKKyMgdmFyaWFibGVzIGFmdGVyIHNwbGl0dGluZyBTSE9SVE9QVCBhZnRlciB0aGUgMm5kIGNoYXJhY3Rlci4KK2Z1bmNfc3BsaXRfc2hvcnRfb3B0ICgpCit7CisgICAgbXlfc2VkX3Nob3J0X29wdD0nMXMvXlwoLi5cKS4qJC9cMS87cScKKyAgICBteV9zZWRfc2hvcnRfcmVzdD0nMXMvXi4uXCguKlwpJC9cMS87cScKKworICAgIGZ1bmNfc3BsaXRfc2hvcnRfb3B0X25hbWU9YCRFQ0hPICIkMSIgfCAkU0VEICIkbXlfc2VkX3Nob3J0X29wdCJgCisgICAgZnVuY19zcGxpdF9zaG9ydF9vcHRfYXJnPWAkRUNITyAiJDEiIHwgJFNFRCAiJG15X3NlZF9zaG9ydF9yZXN0ImAKK30gIyBmdW5jX3NwbGl0X3Nob3J0X29wdCBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworCisjIGZ1bmNfc3BsaXRfbG9uZ19vcHQgbG9uZ29wdAorIyBTZXQgZnVuY19zcGxpdF9sb25nX29wdF9uYW1lIGFuZCBmdW5jX3NwbGl0X2xvbmdfb3B0X2FyZyBzaGVsbAorIyB2YXJpYWJsZXMgYWZ0ZXIgc3BsaXR0aW5nIExPTkdPUFQgYXQgdGhlIGA9JyBzaWduLgorZnVuY19zcGxpdF9sb25nX29wdCAoKQoreworICAgIG15X3NlZF9sb25nX29wdD0nMXMvXlwoLS1bXj1dKlwpPS4qL1wxLztxJworICAgIG15X3NlZF9sb25nX2FyZz0nMXMvXi0tW149XSo9Ly8nCisKKyAgICBmdW5jX3NwbGl0X2xvbmdfb3B0X25hbWU9YCRFQ0hPICIkMSIgfCAkU0VEICIkbXlfc2VkX2xvbmdfb3B0ImAKKyAgICBmdW5jX3NwbGl0X2xvbmdfb3B0X2FyZz1gJEVDSE8gIiQxIiB8ICRTRUQgIiRteV9zZWRfbG9uZ19hcmciYAorfSAjIGZ1bmNfc3BsaXRfbG9uZ19vcHQgbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKIGV4aXRfY21kPToKIAogCiAKIAogCi0jIENoZWNrIHRoYXQgd2UgaGF2ZSBhIHdvcmtpbmcgJEVDSE8uCi1pZiB0ZXN0ICJYJDEiID0gWC0tbm8tcmVleGVjOyB0aGVuCi0gICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgotICBzaGlmdAotZWxpZiB0ZXN0ICJYJDEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgotICAjIEF2b2lkIGlubGluZSBkb2N1bWVudCBoZXJlLCBpdCBtYXkgYmUgbGVmdCBvdmVyCi0gIDoKLWVsaWYgdGVzdCAiWGB7ICRFQ0hPICdcdCc7IH0gMj4vZGV2L251bGxgIiA9ICdYXHQnOyB0aGVuCi0gICMgWWlwcGVlLCAkRUNITyB3b3JrcyEKLSAgOgotZWxzZQotICAjIFJlc3RhcnQgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwsIGFuZCB0aGVuIG1heWJlICRFQ0hPIHdpbGwgd29yay4KLSAgZXhlYyAkU0hFTEwgIiRwcm9ncGF0aCIgLS1uby1yZWV4ZWMgJHsxKyIkQCJ9Ci1maQotCi1pZiB0ZXN0ICJYJDEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgotICAjIHVzZWQgYXMgZmFsbGJhY2sgZWNobwotICBzaGlmdAotICBjYXQgPDxFT0YKLSQqCi1FT0YKLSAgZXhpdCAkRVhJVF9TVUNDRVNTCi1maQotCiBtYWdpYz0iJSUlTUFHSUMgdmFyaWFibGUlJSUiCiBtYWdpY19leGU9IiUlJU1BR0lDIEVYRSB2YXJpYWJsZSUlJSIKIAogIyBHbG9iYWwgdmFyaWFibGVzLgotIyAkbW9kZSBpcyB1bnNldAogbm9ub3B0PQotZXhlY3V0ZV9kbGZpbGVzPQogcHJlc2VydmVfYXJncz0KIGxvMm89InMvXFwubG9cJC8uJHtvYmpleHR9LyIKIG8ybG89InMvXFwuJHtvYmpleHR9XCQvLmxvLyIKIGV4dHJhY3RlZF9hcmNoaXZlcz0KIGV4dHJhY3RlZF9zZXJpYWw9MAogCi1vcHRfZHJ5X3J1bj1mYWxzZQotb3B0X2R1cGxpY2F0ZV9kZXBzPWZhbHNlCi1vcHRfc2lsZW50PWZhbHNlCi1vcHRfZGVidWc9OgotCiAjIElmIHRoaXMgdmFyaWFibGUgaXMgc2V0IGluIGFueSBvZiB0aGUgYWN0aW9ucywgdGhlIGNvbW1hbmQgaW4gaXQKICMgd2lsbCBiZSBleGVjZWQgYXQgdGhlIGVuZC4gIFRoaXMgcHJldmVudHMgaGVyZS1kb2N1bWVudHMgZnJvbSBiZWluZwogIyBsZWZ0IG92ZXIgYnkgc2hlbGxzLgogZXhlY19jbWQ9CiAKKyMgZnVuY19hcHBlbmQgdmFyIHZhbHVlCisjIEFwcGVuZCBWQUxVRSB0byB0aGUgZW5kIG9mIHNoZWxsIHZhcmlhYmxlIFZBUi4KK2Z1bmNfYXBwZW5kICgpCit7CisgICAgZXZhbCAiJHsxfT1cJCR7MX1cJHsyfSIKK30gIyBmdW5jX2FwcGVuZCBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworIyBmdW5jX2FwcGVuZF9xdW90ZWQgdmFyIHZhbHVlCisjIFF1b3RlIFZBTFVFIGFuZCBhcHBlbmQgdG8gdGhlIGVuZCBvZiBzaGVsbCB2YXJpYWJsZSBWQVIsIHNlcGFyYXRlZAorIyBieSBhIHNwYWNlLgorZnVuY19hcHBlbmRfcXVvdGVkICgpCit7CisgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJHsyfSIKKyAgICBldmFsICIkezF9PVwkJHsxfVxcIFwkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCit9ICMgZnVuY19hcHBlbmRfcXVvdGVkIG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCisKKyMgZnVuY19hcml0aCBhcml0aG1ldGljLXRlcm0uLi4KK2Z1bmNfYXJpdGggKCkKK3sKKyAgICBmdW5jX2FyaXRoX3Jlc3VsdD1gZXhwciAiJHtAfSJgCit9ICMgZnVuY19hcml0aCBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworCisjIGZ1bmNfbGVuIHN0cmluZworIyBTVFJJTkcgbWF5IG5vdCBzdGFydCB3aXRoIGEgaHlwaGVuLgorZnVuY19sZW4gKCkKK3sKKyAgICBmdW5jX2xlbl9yZXN1bHQ9YGV4cHIgIiR7MX0iIDogIi4qIiAyPi9kZXYvbnVsbCB8fCBlY2hvICRtYXhfY21kX2xlbmAKK30gIyBmdW5jX2xlbiBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworCisjIGZ1bmNfbG8ybyBvYmplY3QKK2Z1bmNfbG8ybyAoKQoreworICAgIGZ1bmNfbG8yb19yZXN1bHQ9YCRFQ0hPICIkezF9IiB8ICRTRUQgIiRsbzJvImAKK30gIyBmdW5jX2xvMm8gbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKKworIyBmdW5jX3hmb3JtIGxpYm9iai1vci1zb3VyY2UKK2Z1bmNfeGZvcm0gKCkKK3sKKyAgICBmdW5jX3hmb3JtX3Jlc3VsdD1gJEVDSE8gIiR7MX0iIHwgJFNFRCAncy9cLlteLl0qJC8ubG8vJ2AKK30gIyBmdW5jX3hmb3JtIG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCisKICMgZnVuY19mYXRhbF9jb25maWd1cmF0aW9uIGFyZy4uLgogIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yLCBmb2xsb3dlZCBieQogIyBhIGNvbmZpZ3VyYXRpb24gZmFpbHVyZSBoaW50LCBhbmQgZXhpdC4KQEAgLTYzNiwxNiArOTE5LDE2IEBACiAjIERpc3BsYXkgdGhlIGZlYXR1cmVzIHN1cHBvcnRlZCBieSB0aGlzIHNjcmlwdC4KIGZ1bmNfZmVhdHVyZXMgKCkKIHsKLSAgICAkRUNITyAiaG9zdDogJGhvc3QiCisgICAgZWNobyAiaG9zdDogJGhvc3QiCiAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgICRFQ0hPICJlbmFibGUgc2hhcmVkIGxpYnJhcmllcyIKKyAgICAgIGVjaG8gImVuYWJsZSBzaGFyZWQgbGlicmFyaWVzIgogICAgIGVsc2UKLSAgICAgICRFQ0hPICJkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMiCisgICAgICBlY2hvICJkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMiCiAgICAgZmkKICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICAkRUNITyAiZW5hYmxlIHN0YXRpYyBsaWJyYXJpZXMiCisgICAgICBlY2hvICJlbmFibGUgc3RhdGljIGxpYnJhcmllcyIKICAgICBlbHNlCi0gICAgICAkRUNITyAiZGlzYWJsZSBzdGF0aWMgbGlicmFyaWVzIgorICAgICAgZWNobyAiZGlzYWJsZSBzdGF0aWMgbGlicmFyaWVzIgogICAgIGZpCiAKICAgICBleGl0ICQ/CkBAIC02OTIsMTMzICs5NzUsNiBAQAogICBlc2FjCiB9CiAKLSMgUGFyc2Ugb3B0aW9ucyBvbmNlLCB0aG9yb3VnaGx5LiAgVGhpcyBjb21lcyBhcyBzb29uIGFzIHBvc3NpYmxlIGluCi0jIHRoZSBzY3JpcHQgdG8gbWFrZSB0aGluZ3MgbGlrZSBgbGlidG9vbCAtLXZlcnNpb24nIGhhcHBlbiBxdWlja2x5LgotewotCi0gICMgU2hvcnRoYW5kIGZvciAtLW1vZGU9Zm9vLCBvbmx5IHZhbGlkIGFzIHRoZSBmaXJzdCBhcmd1bWVudAotICBjYXNlICQxIGluCi0gIGNsZWFufGNsZWF8Y2xlfGNsKQotICAgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIGNsZWFuICR7MSsiJEAifTsgc2hpZnQKLSAgICA7OwotICBjb21waWxlfGNvbXBpbHxjb21waXxjb21wfGNvbXxjb3xjKQotICAgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIGNvbXBpbGUgJHsxKyIkQCJ9OyBzaGlmdAotICAgIDs7Ci0gIGV4ZWN1dGV8ZXhlY3V0fGV4ZWN1fGV4ZWN8ZXhlfGV4fGUpCi0gICAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgZXhlY3V0ZSAkezErIiRAIn07IHNoaWZ0Ci0gICAgOzsKLSAgZmluaXNofGZpbmlzfGZpbml8ZmlufGZpfGYpCi0gICAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgZmluaXNoICR7MSsiJEAifTsgc2hpZnQKLSAgICA7OwotICBpbnN0YWxsfGluc3RhbHxpbnN0YXxpbnN0fGluc3xpbnxpKQotICAgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIGluc3RhbGwgJHsxKyIkQCJ9OyBzaGlmdAotICAgIDs7Ci0gIGxpbmt8bGlufGxpfGwpCi0gICAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgbGluayAkezErIiRAIn07IHNoaWZ0Ci0gICAgOzsKLSAgdW5pbnN0YWxsfHVuaW5zdGFsfHVuaW5zdGF8dW5pbnN0fHVuaW5zfHVuaW58dW5pfHVufHUpCi0gICAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgdW5pbnN0YWxsICR7MSsiJEAifTsgc2hpZnQKLSAgICA7OwotICBlc2FjCi0KLSAgIyBQYXJzZSBub24tbW9kZSBzcGVjaWZpYyBhcmd1bWVudHM6Ci0gIHdoaWxlIHRlc3QgIiQjIiAtZ3QgMDsgZG8KLSAgICBvcHQ9IiQxIgotICAgIHNoaWZ0Ci0KLSAgICBjYXNlICRvcHQgaW4KLSAgICAgIC0tY29uZmlnKQkJZnVuY19jb25maWcJCQkJCTs7Ci0KLSAgICAgIC0tZGVidWcpCQlwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAkb3B0IgotCQkJZnVuY19lY2hvICJlbmFibGluZyBzaGVsbCB0cmFjZSBtb2RlIgotCQkJb3B0X2RlYnVnPSdzZXQgLXgnCi0JCQkkb3B0X2RlYnVnCi0JCQk7OwotCi0gICAgICAtZGxvcGVuKQkJdGVzdCAiJCMiIC1lcSAwICYmIGZ1bmNfbWlzc2luZ19hcmcgIiRvcHQiICYmIGJyZWFrCi0JCQlleGVjdXRlX2RsZmlsZXM9IiRleGVjdXRlX2RsZmlsZXMgJDEiCi0JCQlzaGlmdAotCQkJOzsKLQotICAgICAgLS1kcnktcnVuIHwgLW4pCW9wdF9kcnlfcnVuPToJCQkJCTs7Ci0gICAgICAtLWZlYXR1cmVzKSAgICAgICBmdW5jX2ZlYXR1cmVzCQkJCQk7OwotICAgICAgLS1maW5pc2gpCQltb2RlPSJmaW5pc2giCQkJCQk7OwotCi0gICAgICAtLW1vZGUpCQl0ZXN0ICIkIyIgLWVxIDAgJiYgZnVuY19taXNzaW5nX2FyZyAiJG9wdCIgJiYgYnJlYWsKLQkJCWNhc2UgJDEgaW4KLQkJCSAgIyBWYWxpZCBtb2RlIGFyZ3VtZW50czoKLQkJCSAgY2xlYW4pCTs7Ci0JCQkgIGNvbXBpbGUpCTs7Ci0JCQkgIGV4ZWN1dGUpCTs7Ci0JCQkgIGZpbmlzaCkJOzsKLQkJCSAgaW5zdGFsbCkJOzsKLQkJCSAgbGluaykJCTs7Ci0JCQkgIHJlbGluaykJOzsKLQkJCSAgdW5pbnN0YWxsKQk7OwotCi0JCQkgICMgQ2F0Y2ggYW55dGhpbmcgZWxzZSBhcyBhbiBlcnJvcgotCQkJICAqKSBmdW5jX2Vycm9yICJpbnZhbGlkIGFyZ3VtZW50IGZvciAkb3B0IgotCQkJICAgICBleGl0X2NtZD1leGl0Ci0JCQkgICAgIGJyZWFrCi0JCQkgICAgIDs7Ci0JCSAgICAgICAgZXNhYwotCi0JCQltb2RlPSIkMSIKLQkJCXNoaWZ0Ci0JCQk7OwotCi0gICAgICAtLXByZXNlcnZlLWR1cC1kZXBzKQotCQkJb3B0X2R1cGxpY2F0ZV9kZXBzPToJCQkJOzsKLQotICAgICAgLS1xdWlldHwtLXNpbGVudCkJcHJlc2VydmVfYXJncz0iJHByZXNlcnZlX2FyZ3MgJG9wdCIKLQkJCW9wdF9zaWxlbnQ9OgotCQkJOzsKLQotICAgICAgLS12ZXJib3NlfCAtdikJcHJlc2VydmVfYXJncz0iJHByZXNlcnZlX2FyZ3MgJG9wdCIKLQkJCW9wdF9zaWxlbnQ9ZmFsc2UKLQkJCTs7Ci0KLSAgICAgIC0tdGFnKQkJdGVzdCAiJCMiIC1lcSAwICYmIGZ1bmNfbWlzc2luZ19hcmcgIiRvcHQiICYmIGJyZWFrCi0JCQlwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAkb3B0ICQxIgotCQkJZnVuY19lbmFibGVfdGFnICIkMSIJIyB0YWduYW1lIGlzIHNldCBoZXJlCi0JCQlzaGlmdAotCQkJOzsKLQotICAgICAgIyBTZXBhcmF0ZSBvcHRhcmdzIHRvIGxvbmcgb3B0aW9uczoKLSAgICAgIC1kbG9wZW49KnwtLW1vZGU9KnwtLXRhZz0qKQotCQkJZnVuY19vcHRfc3BsaXQgIiRvcHQiCi0JCQlzZXQgZHVtbXkgIiRmdW5jX29wdF9zcGxpdF9vcHQiICIkZnVuY19vcHRfc3BsaXRfYXJnIiAkezErIiRAIn0KLQkJCXNoaWZ0Ci0JCQk7OwotCi0gICAgICAtXD98LWgpCQlmdW5jX3VzYWdlCQkJCQk7OwotICAgICAgLS1oZWxwKQkJb3B0X2hlbHA9OgkJCQkJOzsKLSAgICAgIC0tdmVyc2lvbikJZnVuY192ZXJzaW9uCQkJCQk7OwotCi0gICAgICAtKikJCWZ1bmNfZmF0YWxfaGVscCAidW5yZWNvZ25pemVkIG9wdGlvbiBcYCRvcHQnIgk7OwotCi0gICAgICAqKQkJbm9ub3B0PSIkb3B0IgotCQkJYnJlYWsKLQkJCTs7Ci0gICAgZXNhYwotICBkb25lCi0KLQotICBjYXNlICRob3N0IGluCi0gICAgKmN5Z3dpbiogfCAqbWluZ3cqIHwgKnB3MzIqIHwgKmNlZ2NjKikKLSAgICAgICMgZG9uJ3QgZWxpbWluYXRlIGR1cGxpY2F0aW9ucyBpbiAkcG9zdGRlcHMgYW5kICRwcmVkZXBzCi0gICAgICBvcHRfZHVwbGljYXRlX2NvbXBpbGVyX2dlbmVyYXRlZF9kZXBzPToKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIG9wdF9kdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHM9JG9wdF9kdXBsaWNhdGVfZGVwcwotICAgICAgOzsKLSAgZXNhYwotCi0gICMgSGF2aW5nIHdhcm5lZCBhYm91dCBhbGwgbWlzLXNwZWNpZmllZCBvcHRpb25zLCBiYWlsIG91dCBpZgotICAjIGFueXRoaW5nIHdhcyB3cm9uZy4KLSAgJGV4aXRfY21kICRFWElUX0ZBSUxVUkUKLX0KLQogIyBmdW5jX2NoZWNrX3ZlcnNpb25fbWF0Y2gKICMgRW5zdXJlIHRoYXQgd2UgYXJlIHVzaW5nIG00IG1hY3JvcywgYW5kIGxpYnRvb2wgc2NyaXB0IGZyb20gdGhlIHNhbWUKICMgcmVsZWFzZSBvZiBsaWJ0b29sLgpAQCAtODU1LDM4ICsxMDExLDIxOSBAQAogfQogCiAKKyMgU2hvcnRoYW5kIGZvciAtLW1vZGU9Zm9vLCBvbmx5IHZhbGlkIGFzIHRoZSBmaXJzdCBhcmd1bWVudAorY2FzZSAkMSBpbgorY2xlYW58Y2xlYXxjbGV8Y2wpCisgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIGNsZWFuICR7MSsiJEAifTsgc2hpZnQKKyAgOzsKK2NvbXBpbGV8Y29tcGlsfGNvbXBpfGNvbXB8Y29tfGNvfGMpCisgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIGNvbXBpbGUgJHsxKyIkQCJ9OyBzaGlmdAorICA7OworZXhlY3V0ZXxleGVjdXR8ZXhlY3V8ZXhlY3xleGV8ZXh8ZSkKKyAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgZXhlY3V0ZSAkezErIiRAIn07IHNoaWZ0CisgIDs7CitmaW5pc2h8ZmluaXN8ZmluaXxmaW58Zml8ZikKKyAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgZmluaXNoICR7MSsiJEAifTsgc2hpZnQKKyAgOzsKK2luc3RhbGx8aW5zdGFsfGluc3RhfGluc3R8aW5zfGlufGkpCisgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIGluc3RhbGwgJHsxKyIkQCJ9OyBzaGlmdAorICA7OworbGlua3xsaW58bGl8bCkKKyAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgbGluayAkezErIiRAIn07IHNoaWZ0CisgIDs7Cit1bmluc3RhbGx8dW5pbnN0YWx8dW5pbnN0YXx1bmluc3R8dW5pbnN8dW5pbnx1bml8dW58dSkKKyAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgdW5pbnN0YWxsICR7MSsiJEAifTsgc2hpZnQKKyAgOzsKK2VzYWMKKworCisKKyMgT3B0aW9uIGRlZmF1bHRzOgorb3B0X2RlYnVnPToKK29wdF9kcnlfcnVuPWZhbHNlCitvcHRfY29uZmlnPWZhbHNlCitvcHRfcHJlc2VydmVfZHVwX2RlcHM9ZmFsc2UKK29wdF9mZWF0dXJlcz1mYWxzZQorb3B0X2ZpbmlzaD1mYWxzZQorb3B0X2hlbHA9ZmFsc2UKK29wdF9oZWxwX2FsbD1mYWxzZQorb3B0X3NpbGVudD06CitvcHRfd2FybmluZz06CitvcHRfdmVyYm9zZT06CitvcHRfc2lsZW50PWZhbHNlCitvcHRfdmVyYm9zZT1mYWxzZQorCisKKyMgUGFyc2Ugb3B0aW9ucyBvbmNlLCB0aG9yb3VnaGx5LiAgVGhpcyBjb21lcyBhcyBzb29uIGFzIHBvc3NpYmxlIGluIHRoZQorIyBzY3JpcHQgdG8gbWFrZSB0aGluZ3MgbGlrZSBgLS12ZXJzaW9uJyBoYXBwZW4gYXMgcXVpY2tseSBhcyB3ZSBjYW4uCit7CisgICMgdGhpcyBqdXN0IGVhc2VzIGV4aXQgaGFuZGxpbmcKKyAgd2hpbGUgdGVzdCAkIyAtZ3QgMDsgZG8KKyAgICBvcHQ9IiQxIgorICAgIHNoaWZ0CisgICAgY2FzZSAkb3B0IGluCisgICAgICAtLWRlYnVnfC14KQlvcHRfZGVidWc9J3NldCAteCcKKwkJCWZ1bmNfZWNobyAiZW5hYmxpbmcgc2hlbGwgdHJhY2UgbW9kZSIKKwkJCSRvcHRfZGVidWcKKwkJCTs7CisgICAgICAtLWRyeS1ydW58LS1kcnlydW58LW4pCisJCQlvcHRfZHJ5X3J1bj06CisJCQk7OworICAgICAgLS1jb25maWcpCisJCQlvcHRfY29uZmlnPToKK2Z1bmNfY29uZmlnCisJCQk7OworICAgICAgLS1kbG9wZW58LWRsb3BlbikKKwkJCW9wdGFyZz0iJDEiCisJCQlvcHRfZGxvcGVuPSIke29wdF9kbG9wZW4rJG9wdF9kbG9wZW4KK30kb3B0YXJnIgorCQkJc2hpZnQKKwkJCTs7CisgICAgICAtLXByZXNlcnZlLWR1cC1kZXBzKQorCQkJb3B0X3ByZXNlcnZlX2R1cF9kZXBzPToKKwkJCTs7CisgICAgICAtLWZlYXR1cmVzKQorCQkJb3B0X2ZlYXR1cmVzPToKK2Z1bmNfZmVhdHVyZXMKKwkJCTs7CisgICAgICAtLWZpbmlzaCkKKwkJCW9wdF9maW5pc2g9Ogorc2V0IGR1bW15IC0tbW9kZSBmaW5pc2ggJHsxKyIkQCJ9OyBzaGlmdAorCQkJOzsKKyAgICAgIC0taGVscCkKKwkJCW9wdF9oZWxwPToKKwkJCTs7CisgICAgICAtLWhlbHAtYWxsKQorCQkJb3B0X2hlbHBfYWxsPToKK29wdF9oZWxwPSc6IGhlbHAtYWxsJworCQkJOzsKKyAgICAgIC0tbW9kZSkKKwkJCXRlc3QgJCMgPSAwICYmIGZ1bmNfbWlzc2luZ19hcmcgJG9wdCAmJiBicmVhaworCQkJb3B0YXJnPSIkMSIKKwkJCW9wdF9tb2RlPSIkb3B0YXJnIgorY2FzZSAkb3B0YXJnIGluCisgICMgVmFsaWQgbW9kZSBhcmd1bWVudHM6CisgIGNsZWFufGNvbXBpbGV8ZXhlY3V0ZXxmaW5pc2h8aW5zdGFsbHxsaW5rfHJlbGlua3x1bmluc3RhbGwpIDs7CisKKyAgIyBDYXRjaCBhbnl0aGluZyBlbHNlIGFzIGFuIGVycm9yCisgICopIGZ1bmNfZXJyb3IgImludmFsaWQgYXJndW1lbnQgZm9yICRvcHQiCisgICAgIGV4aXRfY21kPWV4aXQKKyAgICAgYnJlYWsKKyAgICAgOzsKK2VzYWMKKwkJCXNoaWZ0CisJCQk7OworICAgICAgLS1uby1zaWxlbnR8LS1uby1xdWlldCkKKwkJCW9wdF9zaWxlbnQ9ZmFsc2UKK2Z1bmNfYXBwZW5kIHByZXNlcnZlX2FyZ3MgIiAkb3B0IgorCQkJOzsKKyAgICAgIC0tbm8td2FybmluZ3wtLW5vLXdhcm4pCisJCQlvcHRfd2FybmluZz1mYWxzZQorZnVuY19hcHBlbmQgcHJlc2VydmVfYXJncyAiICRvcHQiCisJCQk7OworICAgICAgLS1uby12ZXJib3NlKQorCQkJb3B0X3ZlcmJvc2U9ZmFsc2UKK2Z1bmNfYXBwZW5kIHByZXNlcnZlX2FyZ3MgIiAkb3B0IgorCQkJOzsKKyAgICAgIC0tc2lsZW50fC0tcXVpZXQpCisJCQlvcHRfc2lsZW50PToKK2Z1bmNfYXBwZW5kIHByZXNlcnZlX2FyZ3MgIiAkb3B0IgorICAgICAgICBvcHRfdmVyYm9zZT1mYWxzZQorCQkJOzsKKyAgICAgIC0tdmVyYm9zZXwtdikKKwkJCW9wdF92ZXJib3NlPToKK2Z1bmNfYXBwZW5kIHByZXNlcnZlX2FyZ3MgIiAkb3B0Igorb3B0X3NpbGVudD1mYWxzZQorCQkJOzsKKyAgICAgIC0tdGFnKQorCQkJdGVzdCAkIyA9IDAgJiYgZnVuY19taXNzaW5nX2FyZyAkb3B0ICYmIGJyZWFrCisJCQlvcHRhcmc9IiQxIgorCQkJb3B0X3RhZz0iJG9wdGFyZyIKK2Z1bmNfYXBwZW5kIHByZXNlcnZlX2FyZ3MgIiAkb3B0ICRvcHRhcmciCitmdW5jX2VuYWJsZV90YWcgIiRvcHRhcmciCisJCQlzaGlmdAorCQkJOzsKKworICAgICAgLVw/fC1oKQkJZnVuY191c2FnZQkJCQk7OworICAgICAgLS1oZWxwKQkJZnVuY19oZWxwCQkJCTs7CisgICAgICAtLXZlcnNpb24pCWZ1bmNfdmVyc2lvbgkJCQk7OworCisgICAgICAjIFNlcGFyYXRlIG9wdGFyZ3MgdG8gbG9uZyBvcHRpb25zOgorICAgICAgLS0qPSopCisJCQlmdW5jX3NwbGl0X2xvbmdfb3B0ICIkb3B0IgorCQkJc2V0IGR1bW15ICIkZnVuY19zcGxpdF9sb25nX29wdF9uYW1lIiAiJGZ1bmNfc3BsaXRfbG9uZ19vcHRfYXJnIiAkezErIiRAIn0KKwkJCXNoaWZ0CisJCQk7OworCisgICAgICAjIFNlcGFyYXRlIG5vbi1hcmd1bWVudCBzaG9ydCBvcHRpb25zOgorICAgICAgLVw/KnwtaCp8LW4qfC12KikKKwkJCWZ1bmNfc3BsaXRfc2hvcnRfb3B0ICIkb3B0IgorCQkJc2V0IGR1bW15ICIkZnVuY19zcGxpdF9zaG9ydF9vcHRfbmFtZSIgIi0kZnVuY19zcGxpdF9zaG9ydF9vcHRfYXJnIiAkezErIiRAIn0KKwkJCXNoaWZ0CisJCQk7OworCisgICAgICAtLSkJCWJyZWFrCQkJCQk7OworICAgICAgLSopCQlmdW5jX2ZhdGFsX2hlbHAgInVucmVjb2duaXplZCBvcHRpb24gXGAkb3B0JyIgOzsKKyAgICAgICopCQlzZXQgZHVtbXkgIiRvcHQiICR7MSsiJEAifTsJc2hpZnQ7IGJyZWFrICA7OworICAgIGVzYWMKKyAgZG9uZQorCisgICMgVmFsaWRhdGUgb3B0aW9uczoKKworICAjIHNhdmUgZmlyc3Qgbm9uLW9wdGlvbiBhcmd1bWVudAorICBpZiB0ZXN0ICIkIyIgLWd0IDA7IHRoZW4KKyAgICBub25vcHQ9IiRvcHQiCisgICAgc2hpZnQKKyAgZmkKKworICAjIHByZXNlcnZlIC0tZGVidWcKKyAgdGVzdCAiJG9wdF9kZWJ1ZyIgPSA6IHx8IGZ1bmNfYXBwZW5kIHByZXNlcnZlX2FyZ3MgIiAtLWRlYnVnIgorCisgIGNhc2UgJGhvc3QgaW4KKyAgICAqY3lnd2luKiB8ICptaW5ndyogfCAqcHczMiogfCAqY2VnY2MqKQorICAgICAgIyBkb24ndCBlbGltaW5hdGUgZHVwbGljYXRpb25zIGluICRwb3N0ZGVwcyBhbmQgJHByZWRlcHMKKyAgICAgIG9wdF9kdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHM9OgorICAgICAgOzsKKyAgICAqKQorICAgICAgb3B0X2R1cGxpY2F0ZV9jb21waWxlcl9nZW5lcmF0ZWRfZGVwcz0kb3B0X3ByZXNlcnZlX2R1cF9kZXBzCisgICAgICA7OworICBlc2FjCisKKyAgJG9wdF9oZWxwIHx8IHsKKyAgICAjIFNhbml0eSBjaGVja3MgZmlyc3Q6CisgICAgZnVuY19jaGVja192ZXJzaW9uX21hdGNoCisKKyAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiAhPSB5ZXM7IHRoZW4KKyAgICAgIGZ1bmNfZmF0YWxfY29uZmlndXJhdGlvbiAibm90IGNvbmZpZ3VyZWQgdG8gYnVpbGQgYW55IGtpbmQgb2YgbGlicmFyeSIKKyAgICBmaQorCisgICAgIyBEYXJ3aW4gc3Vja3MKKyAgICBldmFsIHN0ZF9zaHJleHQ9XCIkc2hyZXh0X2NtZHNcIgorCisgICAgIyBPbmx5IGV4ZWN1dGUgbW9kZSBpcyBhbGxvd2VkIHRvIGhhdmUgLWRsb3BlbiBmbGFncy4KKyAgICBpZiB0ZXN0IC1uICIkb3B0X2Rsb3BlbiIgJiYgdGVzdCAiJG9wdF9tb2RlIiAhPSBleGVjdXRlOyB0aGVuCisgICAgICBmdW5jX2Vycm9yICJ1bnJlY29nbml6ZWQgb3B0aW9uIFxgLWRsb3BlbiciCisgICAgICAkRUNITyAiJGhlbHAiIDE+JjIKKyAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorICAgIGZpCisKKyAgICAjIENoYW5nZSB0aGUgaGVscCBtZXNzYWdlIHRvIGEgbW9kZS1zcGVjaWZpYyBvbmUuCisgICAgZ2VuZXJpY19oZWxwPSIkaGVscCIKKyAgICBoZWxwPSJUcnkgXGAkcHJvZ25hbWUgLS1oZWxwIC0tbW9kZT0kb3B0X21vZGUnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKyAgfQorCisKKyAgIyBCYWlsIGlmIHRoZSBvcHRpb25zIHdlcmUgc2NyZXdlZAorICAkZXhpdF9jbWQgJEVYSVRfRkFJTFVSRQorfQorCisKKworCiAjIyAtLS0tLS0tLS0tLSAjIwogIyMgICAgTWFpbi4gICAgIyMKICMjIC0tLS0tLS0tLS0tICMjCiAKLSRvcHRfaGVscCB8fCB7Ci0gICMgU2FuaXR5IGNoZWNrcyBmaXJzdDoKLSAgZnVuY19jaGVja192ZXJzaW9uX21hdGNoCi0KLSAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgIT0geWVzOyB0aGVuCi0gICAgZnVuY19mYXRhbF9jb25maWd1cmF0aW9uICJub3QgY29uZmlndXJlZCB0byBidWlsZCBhbnkga2luZCBvZiBsaWJyYXJ5IgotICBmaQotCi0gIHRlc3QgLXogIiRtb2RlIiAmJiBmdW5jX2ZhdGFsX2Vycm9yICJlcnJvcjogeW91IG11c3Qgc3BlY2lmeSBhIE1PREUuIgotCi0KLSAgIyBEYXJ3aW4gc3Vja3MKLSAgZXZhbCBzdGRfc2hyZXh0PVwiJHNocmV4dF9jbWRzXCIKLQotCi0gICMgT25seSBleGVjdXRlIG1vZGUgaXMgYWxsb3dlZCB0byBoYXZlIC1kbG9wZW4gZmxhZ3MuCi0gIGlmIHRlc3QgLW4gIiRleGVjdXRlX2RsZmlsZXMiICYmIHRlc3QgIiRtb2RlIiAhPSBleGVjdXRlOyB0aGVuCi0gICAgZnVuY19lcnJvciAidW5yZWNvZ25pemVkIG9wdGlvbiBcYC1kbG9wZW4nIgotICAgICRFQ0hPICIkaGVscCIgMT4mMgotICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICBmaQotCi0gICMgQ2hhbmdlIHRoZSBoZWxwIG1lc3NhZ2UgdG8gYSBtb2RlLXNwZWNpZmljIG9uZS4KLSAgZ2VuZXJpY19oZWxwPSIkaGVscCIKLSAgaGVscD0iVHJ5IFxgJHByb2duYW1lIC0taGVscCAtLW1vZGU9JG1vZGUnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKLX0KLQotCiAjIGZ1bmNfbGFsaWJfcCBmaWxlCiAjIFRydWUgaWZmIEZJTEUgaXMgYSBsaWJ0b29sIGAubGEnIGxpYnJhcnkgb3IgYC5sbycgb2JqZWN0IGZpbGUuCiAjIFRoaXMgZnVuY3Rpb24gaXMgb25seSBhIGJhc2ljIHNhbml0eSBjaGVjazsgaXQgd2lsbCBoYXJkbHkgZmx1c2ggb3V0CkBAIC05NTAsMTIgKzEyODcsOSBAQAogIyB0ZW1wb3JhcnkgbHR3cmFwcGVyX3NjcmlwdC4KIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgKCkKIHsKLSAgICBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdD0iIgotICAgIGlmIGZ1bmNfbHR3cmFwcGVyX2V4ZWN1dGFibGVfcCAiJDEiOyB0aGVuCi0JZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAiJDEiICIiICIuIgotCWZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgotCWZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0PSIkZnVuY19kaXJuYW1lX3Jlc3VsdC8kb2JqZGlyLyR7ZnVuY19zdHJpcG5hbWVfcmVzdWx0fV9sdHNod3JhcHBlciIKLSAgICBmaQorICAgIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgIiQxIiAiIiAiLiIKKyAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKyAgICBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdD0iJGZ1bmNfZGlybmFtZV9yZXN1bHQvJG9iamRpci8ke2Z1bmNfc3RyaXBuYW1lX3Jlc3VsdH1fbHRzaHdyYXBwZXIiCiB9CiAKICMgZnVuY19sdHdyYXBwZXJfcCBmaWxlCkBAIC0xMDAxLDYgKzEzMzUsMzcgQEAKIH0KIAogCisjIGZ1bmNfcmVzb2x2ZV9zeXNyb290IFBBVEgKKyMgUmVwbGFjZSBhIGxlYWRpbmcgPSBpbiBQQVRIIHdpdGggYSBzeXNyb290LiAgU3RvcmUgdGhlIHJlc3VsdCBpbnRvCisjIGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdAorZnVuY19yZXNvbHZlX3N5c3Jvb3QgKCkKK3sKKyAgZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0PSQxCisgIGNhc2UgJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCBpbgorICA9KikKKyAgICBmdW5jX3N0cmlwbmFtZSAnPScgJycgIiRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQiCisgICAgZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0PSRsdF9zeXNyb290JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICAgIDs7CisgIGVzYWMKK30KKworIyBmdW5jX3JlcGxhY2Vfc3lzcm9vdCBQQVRICisjIElmIFBBVEggYmVnaW5zIHdpdGggdGhlIHN5c3Jvb3QsIHJlcGxhY2UgaXQgd2l0aCA9IGFuZAorIyBzdG9yZSB0aGUgcmVzdWx0IGludG8gZnVuY19yZXBsYWNlX3N5c3Jvb3RfcmVzdWx0LgorZnVuY19yZXBsYWNlX3N5c3Jvb3QgKCkKK3sKKyAgY2FzZSAiJGx0X3N5c3Jvb3Q6JDEiIGluCisgID8qOiIkbHRfc3lzcm9vdCIqKQorICAgIGZ1bmNfc3RyaXBuYW1lICIkbHRfc3lzcm9vdCIgJycgIiQxIgorICAgIGZ1bmNfcmVwbGFjZV9zeXNyb290X3Jlc3VsdD0iPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiCisgICAgOzsKKyAgKikKKyAgICAjIEluY2x1ZGluZyBubyBzeXNyb290LgorICAgIGZ1bmNfcmVwbGFjZV9zeXNyb290X3Jlc3VsdD0kMQorICAgIDs7CisgIGVzYWMKK30KKwogIyBmdW5jX2luZmVyX3RhZyBhcmcKICMgSW5mZXIgdGFnZ2VkIGNvbmZpZ3VyYXRpb24gdG8gdXNlIGlmIGFueSBhcmUgYXZhaWxhYmxlIGFuZAogIyBpZiBvbmUgd2Fzbid0IGNob3NlbiB2aWEgdGhlICItLXRhZyIgY29tbWFuZCBsaW5lIG9wdGlvbi4KQEAgLTEwMTMsMTMgKzEzNzgsMTUgQEAKICAgICBpZiB0ZXN0IC1uICIkYXZhaWxhYmxlX3RhZ3MiICYmIHRlc3QgLXogIiR0YWduYW1lIjsgdGhlbgogICAgICAgQ0NfcXVvdGVkPQogICAgICAgZm9yIGFyZyBpbiAkQ0M7IGRvCi0gICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCi0JQ0NfcXVvdGVkPSIkQ0NfcXVvdGVkICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKwlmdW5jX2FwcGVuZF9xdW90ZWQgQ0NfcXVvdGVkICIkYXJnIgogICAgICAgZG9uZQorICAgICAgQ0NfZXhwYW5kZWQ9YGZ1bmNfZWNob19hbGwgJENDYAorICAgICAgQ0NfcXVvdGVkX2V4cGFuZGVkPWBmdW5jX2VjaG9fYWxsICRDQ19xdW90ZWRgCiAgICAgICBjYXNlICRAIGluCiAgICAgICAjIEJsYW5rcyBpbiB0aGUgY29tbWFuZCBtYXkgaGF2ZSBiZWVuIHN0cmlwcGVkIGJ5IHRoZSBjYWxsaW5nIHNoZWxsLAogICAgICAgIyBidXQgbm90IGZyb20gdGhlIENDIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gY29uZmlndXJlIHdhcyBydW4uCi0gICAgICAiICRDQyAiKiB8ICIkQ0MgIiogfCAiIGAkRUNITyAkQ0NgICIqIHwgImAkRUNITyAkQ0NgICIqIHwgIiAkQ0NfcXVvdGVkIiogfCAiJENDX3F1b3RlZCAiKiB8ICIgYCRFQ0hPICRDQ19xdW90ZWRgICIqIHwgImAkRUNITyAkQ0NfcXVvdGVkYCAiKikgOzsKKyAgICAgICIgJENDICIqIHwgIiRDQyAiKiB8ICIgJENDX2V4cGFuZGVkICIqIHwgIiRDQ19leHBhbmRlZCAiKiB8IFwKKyAgICAgICIgJENDX3F1b3RlZCIqIHwgIiRDQ19xdW90ZWQgIiogfCAiICRDQ19xdW90ZWRfZXhwYW5kZWQgIiogfCAiJENDX3F1b3RlZF9leHBhbmRlZCAiKikgOzsKICAgICAgICMgQmxhbmtzIGF0IHRoZSBzdGFydCBvZiAkYmFzZV9jb21waWxlIHdpbGwgY2F1c2UgdGhpcyB0byBmYWlsCiAgICAgICAjIGlmIHdlIGRvbid0IGNoZWNrIGZvciB0aGVtIGFzIHdlbGwuCiAgICAgICAqKQpAQCAtMTAzMCwxMSArMTM5NywxMyBAQAogCSAgICBDQ19xdW90ZWQ9CiAJICAgIGZvciBhcmcgaW4gJENDOyBkbwogCSAgICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBvdGhlciBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLQkgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgotCSAgICAgIENDX3F1b3RlZD0iJENDX3F1b3RlZCAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisJICAgICAgZnVuY19hcHBlbmRfcXVvdGVkIENDX3F1b3RlZCAiJGFyZyIKIAkgICAgZG9uZQorCSAgICBDQ19leHBhbmRlZD1gZnVuY19lY2hvX2FsbCAkQ0NgCisJICAgIENDX3F1b3RlZF9leHBhbmRlZD1gZnVuY19lY2hvX2FsbCAkQ0NfcXVvdGVkYAogCSAgICBjYXNlICIkQCAiIGluCi0JICAgICAgIiAkQ0MgIiogfCAiJENDICIqIHwgIiBgJEVDSE8gJENDYCAiKiB8ICJgJEVDSE8gJENDYCAiKiB8ICIgJENDX3F1b3RlZCIqIHwgIiRDQ19xdW90ZWQgIiogfCAiIGAkRUNITyAkQ0NfcXVvdGVkYCAiKiB8ICJgJEVDSE8gJENDX3F1b3RlZGAgIiopCisJICAgICIgJENDICIqIHwgIiRDQyAiKiB8ICIgJENDX2V4cGFuZGVkICIqIHwgIiRDQ19leHBhbmRlZCAiKiB8IFwKKwkgICAgIiAkQ0NfcXVvdGVkIiogfCAiJENDX3F1b3RlZCAiKiB8ICIgJENDX3F1b3RlZF9leHBhbmRlZCAiKiB8ICIkQ0NfcXVvdGVkX2V4cGFuZGVkICIqKQogCSAgICAgICMgVGhlIGNvbXBpbGVyIGluIHRoZSBiYXNlIGNvbXBpbGUgY29tbWFuZCBtYXRjaGVzCiAJICAgICAgIyB0aGUgb25lIGluIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbi4KIAkgICAgICAjIEFzc3VtZSB0aGlzIGlzIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbiB3ZSB3YW50LgpAQCAtMTA5Nyw2ICsxNDY2LDQ4NiBAQAogICAgIH0KIH0KIAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBGSUxFIE5BTUUgQU5EIFBBVEggQ09OVkVSU0lPTiBIRUxQRVIgRlVOQ1RJT05TICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMiBBUkcKKyMgSGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgZmlsZSBuYW1lIGNvbnZlcnNpb24gZnVuY3Rpb25zIHdoZW4gJGJ1aWxkIGlzICpuaXgsCisjIGFuZCAkaG9zdCBpcyBtaW5ndywgY3lnd2luLCBvciBzb21lIG90aGVyIHczMiBlbnZpcm9ubWVudC4gUmVsaWVzIG9uIGEKKyMgY29ycmVjdGx5IGNvbmZpZ3VyZWQgd2luZSBlbnZpcm9ubWVudCBhdmFpbGFibGUsIHdpdGggdGhlIHdpbmVwYXRoIHByb2dyYW0KKyMgaW4gJGJ1aWxkJ3MgJFBBVEguCisjCisjIEFSRyBpcyB0aGUgJGJ1aWxkIGZpbGUgbmFtZSB0byBiZSBjb252ZXJ0ZWQgdG8gdzMyIGZvcm1hdC4KKyMgUmVzdWx0IGlzIGF2YWlsYWJsZSBpbiAkZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl9yZXN1bHQsIGFuZCB3aWxsCisjIGJlIGVtcHR5IG9uIGVycm9yIChvciB3aGVuIEFSRyBpcyBlbXB0eSkKK2Z1bmNfY29udmVydF9jb3JlX2ZpbGVfd2luZV90b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3Jlc3VsdD0iJDEiCisgIGlmIHRlc3QgLW4gIiQxIjsgdGhlbgorICAgICMgVW5mb3J0dW5hdGVseSwgd2luZXBhdGggZG9lcyBub3QgZXhpdCB3aXRoIGEgbm9uLXplcm8gZXJyb3IgY29kZSwgc28gd2UKKyAgICAjIGFyZSBmb3JjZWQgdG8gY2hlY2sgdGhlIGNvbnRlbnRzIG9mIHN0ZG91dC4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoZQorICAgICMgY29tbWFuZCBpcyBub3QgZm91bmQsIHRoZSBzaGVsbCB3aWxsIHNldCBhbiBleGl0IGNvZGUgb2YgMTI3IGFuZCBwcmludAorICAgICMgKmFuIGVycm9yIG1lc3NhZ2UqIHRvIHN0ZG91dC4gU28gd2UgbXVzdCBjaGVjayBmb3IgYm90aCBlcnJvciBjb2RlIG9mCisgICAgIyB6ZXJvIEFORCBub24tZW1wdHkgc3Rkb3V0LCB3aGljaCBleHBsYWlucyB0aGUgb2RkIGNvbnN0cnVjdGlvbjoKKyAgICBmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3RtcD1gd2luZXBhdGggLXcgIiQxIiAyPi9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICIkPyIgLWVxIDAgJiYgdGVzdCAtbiAiJHtmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3RtcH0iOyB0aGVuCisgICAgICBmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3Jlc3VsdD1gJEVDSE8gIiRmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3RtcCIgfAorICAgICAgICAkU0VEIC1lICIkbHRfc2VkX25haXZlX2JhY2tzbGFzaGlmeSJgCisgICAgZWxzZQorICAgICAgZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl9yZXN1bHQ9CisgICAgZmkKKyAgZmkKK30KKyMgZW5kOiBmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyCisKKworIyBmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyIEFSRworIyBIZWxwZXIgZnVuY3Rpb24gdXNlZCBieSBwYXRoIGNvbnZlcnNpb24gZnVuY3Rpb25zIHdoZW4gJGJ1aWxkIGlzICpuaXgsIGFuZAorIyAkaG9zdCBpcyBtaW5ndywgY3lnd2luLCBvciBzb21lIG90aGVyIHczMiBlbnZpcm9ubWVudC4gUmVsaWVzIG9uIGEgY29ycmVjdGx5CisjIGNvbmZpZ3VyZWQgd2luZSBlbnZpcm9ubWVudCBhdmFpbGFibGUsIHdpdGggdGhlIHdpbmVwYXRoIHByb2dyYW0gaW4gJGJ1aWxkJ3MKKyMgJFBBVEguIEFzc3VtZXMgQVJHIGhhcyBubyBsZWFkaW5nIG9yIHRyYWlsaW5nIHBhdGggc2VwYXJhdG9yIGNoYXJhY3RlcnMuCisjCisjIEFSRyBpcyBwYXRoIHRvIGJlIGNvbnZlcnRlZCBmcm9tICRidWlsZCBmb3JtYXQgdG8gd2luMzIuCisjIFJlc3VsdCBpcyBhdmFpbGFibGUgaW4gJGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzJfcmVzdWx0LgorIyBVbmNvbnZlcnRpYmxlIGZpbGUgKGRpcmVjdG9yeSkgbmFtZXMgaW4gQVJHIGFyZSBza2lwcGVkOyBpZiBubyBkaXJlY3RvcnkgbmFtZXMKKyMgYXJlIGNvbnZlcnRpYmxlLCB0aGVuIHRoZSByZXN1bHQgbWF5IGJlIGVtcHR5LgorZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMiAoKQoreworICAkb3B0X2RlYnVnCisgICMgdW5mb3J0dW5hdGVseSwgd2luZXBhdGggZG9lc24ndCBjb252ZXJ0IHBhdGhzLCBvbmx5IGZpbGUgbmFtZXMKKyAgZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMl9yZXN1bHQ9IiIKKyAgaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisgICAgb2xkSUZTPSRJRlMKKyAgICBJRlM9OgorICAgIGZvciBmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyX2YgaW4gJDE7IGRvCisgICAgICBJRlM9JG9sZElGUworICAgICAgZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMiAiJGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzJfZiIKKyAgICAgIGlmIHRlc3QgLW4gIiRmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3Jlc3VsdCIgOyB0aGVuCisgICAgICAgIGlmIHRlc3QgLXogIiRmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyX3Jlc3VsdCI7IHRoZW4KKyAgICAgICAgICBmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyX3Jlc3VsdD0iJGZ1bmNfY29udmVydF9jb3JlX2ZpbGVfd2luZV90b193MzJfcmVzdWx0IgorICAgICAgICBlbHNlCisgICAgICAgICAgZnVuY19hcHBlbmQgZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMl9yZXN1bHQgIjskZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl9yZXN1bHQiCisgICAgICAgIGZpCisgICAgICBmaQorICAgIGRvbmUKKyAgICBJRlM9JG9sZElGUworICBmaQorfQorIyBlbmQ6IGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzIKKworCisjIGZ1bmNfY3lncGF0aCBBUkdTLi4uCisjIFdyYXBwZXIgYXJvdW5kIGNhbGxpbmcgdGhlIGN5Z3BhdGggcHJvZ3JhbSB2aWEgTFRfQ1lHUEFUSC4gVGhpcyBpcyB1c2VkIHdoZW4KKyMgd2hlbiAoMSkgJGJ1aWxkIGlzICpuaXggYW5kIEN5Z3dpbiBpcyBob3N0ZWQgdmlhIGEgd2luZSBlbnZpcm9ubWVudDsgb3IgKDIpCisjICRidWlsZCBpcyBNU1lTIGFuZCAkaG9zdCBpcyBDeWd3aW4sIG9yICgzKSAkYnVpbGQgaXMgQ3lnd2luLiBJbiBjYXNlICgxKSBvcgorIyAoMiksIHJldHVybnMgdGhlIEN5Z3dpbiBmaWxlIG5hbWUgb3IgcGF0aCBpbiBmdW5jX2N5Z3BhdGhfcmVzdWx0IChpbnB1dAorIyBmaWxlIG5hbWUgb3IgcGF0aCBpcyBhc3N1bWVkIHRvIGJlIGluIHczMiBmb3JtYXQsIGFzIHByZXZpb3VzbHkgY29udmVydGVkCisjIGZyb20gJGJ1aWxkJ3MgKm5peCBvciBNU1lTIGZvcm1hdCkuIEluIGNhc2UgKDMpLCByZXR1cm5zIHRoZSB3MzIgZmlsZSBuYW1lCisjIG9yIHBhdGggaW4gZnVuY19jeWdwYXRoX3Jlc3VsdCAoaW5wdXQgZmlsZSBuYW1lIG9yIHBhdGggaXMgYXNzdW1lZCB0byBiZSBpbgorIyBDeWd3aW4gZm9ybWF0KS4gUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgb24gZXJyb3IuCisjCisjIEFSR1MgYXJlIHBhc3NlZCB0byBjeWdwYXRoLCB3aXRoIHRoZSBsYXN0IG9uZSBiZWluZyB0aGUgZmlsZSBuYW1lIG9yIHBhdGggdG8KKyMgYmUgY29udmVydGVkLgorIworIyBTcGVjaWZ5IHRoZSBhYnNvbHV0ZSAqbml4IChvciB3MzIpIG5hbWUgdG8gY3lncGF0aCBpbiB0aGUgTFRfQ1lHUEFUSAorIyBlbnZpcm9ubWVudCB2YXJpYWJsZTsgZG8gbm90IHB1dCBpdCBpbiAkUEFUSC4KK2Z1bmNfY3lncGF0aCAoKQoreworICAkb3B0X2RlYnVnCisgIGlmIHRlc3QgLW4gIiRMVF9DWUdQQVRIIiAmJiB0ZXN0IC1mICIkTFRfQ1lHUEFUSCI7IHRoZW4KKyAgICBmdW5jX2N5Z3BhdGhfcmVzdWx0PWAkTFRfQ1lHUEFUSCAiJEAiIDI+L2Rldi9udWxsYAorICAgIGlmIHRlc3QgIiQ/IiAtbmUgMDsgdGhlbgorICAgICAgIyBvbiBmYWlsdXJlLCBlbnN1cmUgcmVzdWx0IGlzIGVtcHR5CisgICAgICBmdW5jX2N5Z3BhdGhfcmVzdWx0PQorICAgIGZpCisgIGVsc2UKKyAgICBmdW5jX2N5Z3BhdGhfcmVzdWx0PQorICAgIGZ1bmNfZXJyb3IgIkxUX0NZR1BBVEggaXMgZW1wdHkgb3Igc3BlY2lmaWVzIG5vbi1leGlzdGVudCBmaWxlOiBcYCRMVF9DWUdQQVRIJyIKKyAgZmkKK30KKyNlbmQ6IGZ1bmNfY3lncGF0aAorCisKKyMgZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzIgQVJHCisjIENvbnZlcnQgZmlsZSBuYW1lIG9yIHBhdGggQVJHIGZyb20gTVNZUyBmb3JtYXQgdG8gdzMyIGZvcm1hdC4gIFJldHVybgorIyByZXN1bHQgaW4gZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzJfcmVzdWx0LgorZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICAjIGF3a3dhcmQ6IGNtZCBhcHBlbmRzIHNwYWNlcyB0byByZXN1bHQKKyAgZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzJfcmVzdWx0PWAoIGNtZCAvL2MgZWNobyAiJDEiICkgMj4vZGV2L251bGwgfAorICAgICRTRUQgLWUgJ3MvWyBdKiQvLycgLWUgIiRsdF9zZWRfbmFpdmVfYmFja3NsYXNoaWZ5ImAKK30KKyNlbmQ6IGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyCisKKworIyBmdW5jX2NvbnZlcnRfZmlsZV9jaGVjayBBUkcxIEFSRzIKKyMgVmVyaWZ5IHRoYXQgQVJHMSAoYSBmaWxlIG5hbWUgaW4gJGJ1aWxkIGZvcm1hdCkgd2FzIGNvbnZlcnRlZCB0byAkaG9zdAorIyBmb3JtYXQgaW4gQVJHMi4gT3RoZXJ3aXNlLCBlbWl0IGFuIGVycm9yIG1lc3NhZ2UsIGJ1dCBjb250aW51ZSAocmVzZXR0aW5nCisjIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdCB0byBBUkcxKS4KK2Z1bmNfY29udmVydF9maWxlX2NoZWNrICgpCit7CisgICRvcHRfZGVidWcKKyAgaWYgdGVzdCAteiAiJDIiICYmIHRlc3QgLW4gIiQxIiA7IHRoZW4KKyAgICBmdW5jX2Vycm9yICJDb3VsZCBub3QgZGV0ZXJtaW5lIGhvc3QgZmlsZSBuYW1lIGNvcnJlc3BvbmRpbmcgdG8iCisgICAgZnVuY19lcnJvciAiICBcYCQxJyIKKyAgICBmdW5jX2Vycm9yICJDb250aW51aW5nLCBidXQgdW5pbnN0YWxsZWQgZXhlY3V0YWJsZXMgbWF5IG5vdCB3b3JrLiIKKyAgICAjIEZhbGxiYWNrOgorICAgIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdD0iJDEiCisgIGZpCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfZmlsZV9jaGVjaworCisKKyMgZnVuY19jb252ZXJ0X3BhdGhfY2hlY2sgRlJPTV9QQVRIU0VQIFRPX1BBVEhTRVAgRlJPTV9QQVRIIFRPX1BBVEgKKyMgVmVyaWZ5IHRoYXQgRlJPTV9QQVRIIChhIHBhdGggaW4gJGJ1aWxkIGZvcm1hdCkgd2FzIGNvbnZlcnRlZCB0byAkaG9zdAorIyBmb3JtYXQgaW4gVE9fUEFUSC4gT3RoZXJ3aXNlLCBlbWl0IGFuIGVycm9yIG1lc3NhZ2UsIGJ1dCBjb250aW51ZSwgcmVzZXR0aW5nCisjIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdCB0byBhIHNpbXBsaXN0aWMgZmFsbGJhY2sgdmFsdWUgKHNlZSBiZWxvdykuCitmdW5jX2NvbnZlcnRfcGF0aF9jaGVjayAoKQoreworICAkb3B0X2RlYnVnCisgIGlmIHRlc3QgLXogIiQ0IiAmJiB0ZXN0IC1uICIkMyI7IHRoZW4KKyAgICBmdW5jX2Vycm9yICJDb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBob3N0IHBhdGggY29ycmVzcG9uZGluZyB0byIKKyAgICBmdW5jX2Vycm9yICIgIFxgJDMnIgorICAgIGZ1bmNfZXJyb3IgIkNvbnRpbnVpbmcsIGJ1dCB1bmluc3RhbGxlZCBleGVjdXRhYmxlcyBtYXkgbm90IHdvcmsuIgorICAgICMgRmFsbGJhY2suICBUaGlzIGlzIGEgZGVsaWJlcmF0ZWx5IHNpbXBsaXN0aWMgImNvbnZlcnNpb24iIGFuZAorICAgICMgc2hvdWxkIG5vdCBiZSAiaW1wcm92ZWQiLiAgU2VlIGxpYnRvb2wuaW5mby4KKyAgICBpZiB0ZXN0ICJ4JDEiICE9ICJ4JDIiOyB0aGVuCisgICAgICBsdF9yZXBsYWNlX3BhdGhzZXBfY2hhcnM9InN8JDF8JDJ8ZyIKKyAgICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD1gZWNobyAiJDMiIHwKKyAgICAgICAgJFNFRCAtZSAiJGx0X3JlcGxhY2VfcGF0aHNlcF9jaGFycyJgCisgICAgZWxzZQorICAgICAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkMyIKKyAgICBmaQorICBmaQorfQorIyBlbmQgZnVuY19jb252ZXJ0X3BhdGhfY2hlY2sKKworCisjIGZ1bmNfY29udmVydF9wYXRoX2Zyb250X2JhY2tfcGF0aHNlcCBGUk9OVFBBVCBCQUNLUEFUIFJFUEwgT1JJRworIyBNb2RpZmllcyBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQgYnkgcHJlcGVuZGluZyBSRVBMIGlmIE9SSUcgbWF0Y2hlcyBGUk9OVFBBVAorIyBhbmQgYXBwZW5kaW5nIFJFUEwgaWYgT1JJRyBtYXRjaGVzIEJBQ0tQQVQuCitmdW5jX2NvbnZlcnRfcGF0aF9mcm9udF9iYWNrX3BhdGhzZXAgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBjYXNlICQ0IGluCisgICQxICkgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkMyRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiCisgICAgOzsKKyAgZXNhYworICBjYXNlICQ0IGluCisgICQyICkgZnVuY19hcHBlbmQgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0ICIkMyIKKyAgICA7OworICBlc2FjCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfcGF0aF9mcm9udF9iYWNrX3BhdGhzZXAKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAkYnVpbGQgdG8gJGhvc3QgRklMRSBOQU1FIENPTlZFUlNJT04gRlVOQ1RJT05TICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGludm9rZWQgdmlhIGAkdG9faG9zdF9maWxlX2NtZCBBUkcnCisjCisjIEluIGVhY2ggY2FzZSwgQVJHIGlzIHRoZSBwYXRoIHRvIGJlIGNvbnZlcnRlZCBmcm9tICRidWlsZCB0byAkaG9zdCBmb3JtYXQuCisjIFJlc3VsdCB3aWxsIGJlIGF2YWlsYWJsZSBpbiAkZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorCisKKyMgZnVuY190b19ob3N0X2ZpbGUgQVJHCisjIENvbnZlcnRzIHRoZSBmaWxlIG5hbWUgQVJHIGZyb20gJGJ1aWxkIGZvcm1hdCB0byAkaG9zdCBmb3JtYXQuIFJldHVybiByZXN1bHQKKyMgaW4gZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorZnVuY190b19ob3N0X2ZpbGUgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICAkdG9faG9zdF9maWxlX2NtZCAiJDEiCit9CisjIGVuZCBmdW5jX3RvX2hvc3RfZmlsZQorCisKKyMgZnVuY190b190b29sX2ZpbGUgQVJHIExBWlkKKyMgY29udmVydHMgdGhlIGZpbGUgbmFtZSBBUkcgZnJvbSAkYnVpbGQgZm9ybWF0IHRvIHRvb2xjaGFpbiBmb3JtYXQuIFJldHVybgorIyByZXN1bHQgaW4gZnVuY190b190b29sX2ZpbGVfcmVzdWx0LiAgSWYgdGhlIGNvbnZlcnNpb24gaW4gdXNlIGlzIGxpc3RlZAorIyBpbiAodGhlIGNvbW1hIHNlcGFyYXRlZCkgTEFaWSwgbm8gY29udmVyc2lvbiB0YWtlcyBwbGFjZS4KK2Z1bmNfdG9fdG9vbF9maWxlICgpCit7CisgICRvcHRfZGVidWcKKyAgY2FzZSAsJDIsIGluCisgICAgKiwiJHRvX3Rvb2xfZmlsZV9jbWQiLCopCisgICAgICBmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQ9JDEKKyAgICAgIDs7CisgICAgKikKKyAgICAgICR0b190b29sX2ZpbGVfY21kICIkMSIKKyAgICAgIGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdD0kZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0CisgICAgICA7OworICBlc2FjCit9CisjIGVuZCBmdW5jX3RvX3Rvb2xfZmlsZQorCisKKyMgZnVuY19jb252ZXJ0X2ZpbGVfbm9vcCBBUkcKKyMgQ29weSBBUkcgdG8gZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorZnVuY19jb252ZXJ0X2ZpbGVfbm9vcCAoKQoreworICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiQxIgorfQorIyBlbmQgZnVuY19jb252ZXJ0X2ZpbGVfbm9vcAorCisKKyMgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIgQVJHCisjIENvbnZlcnQgZmlsZSBuYW1lIEFSRyBmcm9tIChtaW5ndykgTVNZUyB0byAobWluZ3cpIHczMiBmb3JtYXQ7IGF1dG9tYXRpYworIyBjb252ZXJzaW9uIHRvIHczMiBpcyBub3QgYXZhaWxhYmxlIGluc2lkZSB0aGUgY3dyYXBwZXIuICBSZXR1cm5zIHJlc3VsdCBpbgorIyBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQuCitmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMiAoKQoreworICAkb3B0X2RlYnVnCisgIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdD0iJDEiCisgIGlmIHRlc3QgLW4gIiQxIjsgdGhlbgorICAgIGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyICIkMSIKKyAgICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiRmdW5jX2NvbnZlcnRfY29yZV9tc3lzX3RvX3czMl9yZXN1bHQiCisgIGZpCisgIGZ1bmNfY29udmVydF9maWxlX2NoZWNrICIkMSIgIiRmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQiCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorCisKKyMgZnVuY19jb252ZXJ0X2ZpbGVfY3lnd2luX3RvX3czMiBBUkcKKyMgQ29udmVydCBmaWxlIG5hbWUgQVJHIGZyb20gQ3lnd2luIHRvIHczMiBmb3JtYXQuICBSZXR1cm5zIHJlc3VsdCBpbgorIyBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQuCitmdW5jX2NvbnZlcnRfZmlsZV9jeWd3aW5fdG9fdzMyICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0PSIkMSIKKyAgaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisgICAgIyBiZWNhdXNlICRidWlsZCBpcyBjeWd3aW4sIHdlIGNhbGwgInRoZSIgY3lncGF0aCBpbiAkUEFUSDsgbm8gbmVlZCB0byB1c2UKKyAgICAjIExUX0NZR1BBVEggaW4gdGhpcyBjYXNlLgorICAgIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdD1gY3lncGF0aCAtbSAiJDEiYAorICBmaQorICBmdW5jX2NvbnZlcnRfZmlsZV9jaGVjayAiJDEiICIkZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0IgorfQorIyBlbmQgZnVuY19jb252ZXJ0X2ZpbGVfY3lnd2luX3RvX3czMgorCisKKyMgZnVuY19jb252ZXJ0X2ZpbGVfbml4X3RvX3czMiBBUkcKKyMgQ29udmVydCBmaWxlIG5hbWUgQVJHIGZyb20gKm5peCB0byB3MzIgZm9ybWF0LiAgUmVxdWlyZXMgYSB3aW5lIGVudmlyb25tZW50CisjIGFuZCBhIHdvcmtpbmcgd2luZXBhdGguIFJldHVybnMgcmVzdWx0IGluIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9maWxlX25peF90b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICBmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyICIkMSIKKyAgICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiRmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3Jlc3VsdCIKKyAgZmkKKyAgZnVuY19jb252ZXJ0X2ZpbGVfY2hlY2sgIiQxIiAiJGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdCIKK30KKyMgZW5kIGZ1bmNfY29udmVydF9maWxlX25peF90b193MzIKKworCisjIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fY3lnd2luIEFSRworIyBDb252ZXJ0IGZpbGUgbmFtZSBBUkcgZnJvbSBNU1lTIHRvIEN5Z3dpbiBmb3JtYXQuICBSZXF1aXJlcyBMVF9DWUdQQVRIIHNldC4KKyMgUmV0dXJucyByZXN1bHQgaW4gZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b19jeWd3aW4gKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICBmdW5jX2NvbnZlcnRfY29yZV9tc3lzX3RvX3czMiAiJDEiCisgICAgZnVuY19jeWdwYXRoIC11ICIkZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzJfcmVzdWx0IgorICAgIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdD0iJGZ1bmNfY3lncGF0aF9yZXN1bHQiCisgIGZpCisgIGZ1bmNfY29udmVydF9maWxlX2NoZWNrICIkMSIgIiRmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQiCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX2N5Z3dpbgorCisKKyMgZnVuY19jb252ZXJ0X2ZpbGVfbml4X3RvX2N5Z3dpbiBBUkcKKyMgQ29udmVydCBmaWxlIG5hbWUgQVJHIGZyb20gKm5peCB0byBDeWd3aW4gZm9ybWF0LiAgUmVxdWlyZXMgQ3lnd2luIGluc3RhbGxlZAorIyBpbiBhIHdpbmUgZW52aXJvbm1lbnQsIHdvcmtpbmcgd2luZXBhdGgsIGFuZCBMVF9DWUdQQVRIIHNldC4gIFJldHVybnMgcmVzdWx0CisjIGluIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9maWxlX25peF90b19jeWd3aW4gKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICAjIGNvbnZlcnQgZnJvbSAqbml4IHRvIHczMiwgdGhlbiB1c2UgY3lncGF0aCB0byBjb252ZXJ0IGZyb20gdzMyIHRvIGN5Z3dpbi4KKyAgICBmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyICIkMSIKKyAgICBmdW5jX2N5Z3BhdGggLXUgIiRmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3Jlc3VsdCIKKyAgICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiRmdW5jX2N5Z3BhdGhfcmVzdWx0IgorICBmaQorICBmdW5jX2NvbnZlcnRfZmlsZV9jaGVjayAiJDEiICIkZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0IgorfQorIyBlbmQgZnVuY19jb252ZXJ0X2ZpbGVfbml4X3RvX2N5Z3dpbgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAkYnVpbGQgdG8gJGhvc3QgUEFUSCBDT05WRVJTSU9OIEZVTkNUSU9OUyAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgaW52b2tlZCB2aWEgYCR0b19ob3N0X3BhdGhfY21kIEFSRycKKyMKKyMgSW4gZWFjaCBjYXNlLCBBUkcgaXMgdGhlIHBhdGggdG8gYmUgY29udmVydGVkIGZyb20gJGJ1aWxkIHRvICRob3N0IGZvcm1hdC4KKyMgVGhlIHJlc3VsdCB3aWxsIGJlIGF2YWlsYWJsZSBpbiAkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0LgorIworIyBQYXRoIHNlcGFyYXRvcnMgYXJlIGFsc28gY29udmVydGVkIGZyb20gJGJ1aWxkIGZvcm1hdCB0byAkaG9zdCBmb3JtYXQuICBJZgorIyBBUkcgYmVnaW5zIG9yIGVuZHMgd2l0aCBhIHBhdGggc2VwYXJhdG9yIGNoYXJhY3RlciwgaXQgaXMgcHJlc2VydmVkIChidXQKKyMgY29udmVydGVkIHRvICRob3N0IGZvcm1hdCkgb24gb3V0cHV0LgorIworIyBBbGwgcGF0aCBjb252ZXJzaW9uIGZ1bmN0aW9ucyBhcmUgbmFtZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb252ZW50aW9uOgorIyAgIGZpbGUgbmFtZSBjb252ZXJzaW9uIGZ1bmN0aW9uICAgIDogZnVuY19jb252ZXJ0X2ZpbGVfWF90b19ZICgpCisjICAgcGF0aCBjb252ZXJzaW9uIGZ1bmN0aW9uICAgICAgICAgOiBmdW5jX2NvbnZlcnRfcGF0aF9YX3RvX1kgKCkKKyMgd2hlcmUsIGZvciBhbnkgZ2l2ZW4gJGJ1aWxkLyRob3N0IGNvbWJpbmF0aW9uIHRoZSAnWF90b19ZJyB2YWx1ZSBpcyB0aGUKKyMgc2FtZS4gIElmIGNvbnZlcnNpb24gZnVuY3Rpb25zIGFyZSBhZGRlZCBmb3IgbmV3ICRidWlsZC8kaG9zdCBjb21iaW5hdGlvbnMsCisjIHRoZSB0d28gbmV3IGZ1bmN0aW9ucyBtdXN0IGZvbGxvdyB0aGlzIHBhdHRlcm4sIG9yIGZ1bmNfaW5pdF90b19ob3N0X3BhdGhfY21kCisjIHdpbGwgYnJlYWsuCisKKworIyBmdW5jX2luaXRfdG9faG9zdF9wYXRoX2NtZAorIyBFbnN1cmVzIHRoYXQgZnVuY3Rpb24gInBvaW50ZXIiIHZhcmlhYmxlICR0b19ob3N0X3BhdGhfY21kIGlzIHNldCB0byB0aGUKKyMgYXBwcm9wcmlhdGUgdmFsdWUsIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiAkdG9faG9zdF9maWxlX2NtZC4KK3RvX2hvc3RfcGF0aF9jbWQ9CitmdW5jX2luaXRfdG9faG9zdF9wYXRoX2NtZCAoKQoreworICAkb3B0X2RlYnVnCisgIGlmIHRlc3QgLXogIiR0b19ob3N0X3BhdGhfY21kIjsgdGhlbgorICAgIGZ1bmNfc3RyaXBuYW1lICdmdW5jX2NvbnZlcnRfZmlsZV8nICcnICIkdG9faG9zdF9maWxlX2NtZCIKKyAgICB0b19ob3N0X3BhdGhfY21kPSJmdW5jX2NvbnZlcnRfcGF0aF8ke2Z1bmNfc3RyaXBuYW1lX3Jlc3VsdH0iCisgIGZpCit9CisKKworIyBmdW5jX3RvX2hvc3RfcGF0aCBBUkcKKyMgQ29udmVydHMgdGhlIHBhdGggQVJHIGZyb20gJGJ1aWxkIGZvcm1hdCB0byAkaG9zdCBmb3JtYXQuIFJldHVybiByZXN1bHQKKyMgaW4gZnVuY190b19ob3N0X3BhdGhfcmVzdWx0LgorZnVuY190b19ob3N0X3BhdGggKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX2luaXRfdG9faG9zdF9wYXRoX2NtZAorICAkdG9faG9zdF9wYXRoX2NtZCAiJDEiCit9CisjIGVuZCBmdW5jX3RvX2hvc3RfcGF0aAorCisKKyMgZnVuY19jb252ZXJ0X3BhdGhfbm9vcCBBUkcKKyMgQ29weSBBUkcgdG8gZnVuY190b19ob3N0X3BhdGhfcmVzdWx0LgorZnVuY19jb252ZXJ0X3BhdGhfbm9vcCAoKQoreworICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiQxIgorfQorIyBlbmQgZnVuY19jb252ZXJ0X3BhdGhfbm9vcAorCisKKyMgZnVuY19jb252ZXJ0X3BhdGhfbXN5c190b193MzIgQVJHCisjIENvbnZlcnQgcGF0aCBBUkcgZnJvbSAobWluZ3cpIE1TWVMgdG8gKG1pbmd3KSB3MzIgZm9ybWF0OyBhdXRvbWF0aWMKKyMgY29udmVyc2lvbiB0byB3MzIgaXMgbm90IGF2YWlsYWJsZSBpbnNpZGUgdGhlIGN3cmFwcGVyLiAgUmV0dXJucyByZXN1bHQgaW4KKyMgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0LgorZnVuY19jb252ZXJ0X3BhdGhfbXN5c190b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICAjIFJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXJzIGZyb20gQVJHLiAgTVNZUworICAgICMgYmVoYXZpb3IgaXMgaW5jb25zaXN0ZW50IGhlcmU7IGN5Z3BhdGggdHVybnMgdGhlbSBpbnRvICcuOycgYW5kICc7Lic7CisgICAgIyBhbmQgd2luZXBhdGggaWdub3JlcyB0aGVtIGNvbXBsZXRlbHkuCisgICAgZnVuY19zdHJpcG5hbWUgOiA6ICIkMSIKKyAgICBmdW5jX3RvX2hvc3RfcGF0aF90bXAxPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKyAgICBmdW5jX2NvbnZlcnRfY29yZV9tc3lzX3RvX3czMiAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiCisgICAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzJfcmVzdWx0IgorICAgIGZ1bmNfY29udmVydF9wYXRoX2NoZWNrIDogIjsiIFwKKyAgICAgICIkZnVuY190b19ob3N0X3BhdGhfdG1wMSIgIiRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiCisgICAgZnVuY19jb252ZXJ0X3BhdGhfZnJvbnRfYmFja19wYXRoc2VwICI6KiIgIio6IiAiOyIgIiQxIgorICBmaQorfQorIyBlbmQgZnVuY19jb252ZXJ0X3BhdGhfbXN5c190b193MzIKKworCisjIGZ1bmNfY29udmVydF9wYXRoX2N5Z3dpbl90b193MzIgQVJHCisjIENvbnZlcnQgcGF0aCBBUkcgZnJvbSBDeWd3aW4gdG8gdzMyIGZvcm1hdC4gIFJldHVybnMgcmVzdWx0IGluCisjIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9wYXRoX2N5Z3dpbl90b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICAjIFNlZSBmdW5jX2NvbnZlcnRfcGF0aF9tc3lzX3RvX3czMjoKKyAgICBmdW5jX3N0cmlwbmFtZSA6IDogIiQxIgorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3RtcDE9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD1gY3lncGF0aCAtbSAtcCAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiYAorICAgIGZ1bmNfY29udmVydF9wYXRoX2NoZWNrIDogIjsiIFwKKyAgICAgICIkZnVuY190b19ob3N0X3BhdGhfdG1wMSIgIiRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiCisgICAgZnVuY19jb252ZXJ0X3BhdGhfZnJvbnRfYmFja19wYXRoc2VwICI6KiIgIio6IiAiOyIgIiQxIgorICBmaQorfQorIyBlbmQgZnVuY19jb252ZXJ0X3BhdGhfY3lnd2luX3RvX3czMgorCisKKyMgZnVuY19jb252ZXJ0X3BhdGhfbml4X3RvX3czMiBBUkcKKyMgQ29udmVydCBwYXRoIEFSRyBmcm9tICpuaXggdG8gdzMyIGZvcm1hdC4gIFJlcXVpcmVzIGEgd2luZSBlbnZpcm9ubWVudCBhbmQKKyMgYSB3b3JraW5nIHdpbmVwYXRoLiAgUmV0dXJucyByZXN1bHQgaW4gZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorZnVuY19jb252ZXJ0X3BhdGhfbml4X3RvX3czMiAoKQoreworICAkb3B0X2RlYnVnCisgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJDEiCisgIGlmIHRlc3QgLW4gIiQxIjsgdGhlbgorICAgICMgU2VlIGZ1bmNfY29udmVydF9wYXRoX21zeXNfdG9fdzMyOgorICAgIGZ1bmNfc3RyaXBuYW1lIDogOiAiJDEiCisgICAgZnVuY190b19ob3N0X3BhdGhfdG1wMT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisgICAgZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMiAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiCisgICAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMl9yZXN1bHQiCisgICAgZnVuY19jb252ZXJ0X3BhdGhfY2hlY2sgOiAiOyIgXAorICAgICAgIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxIiAiJGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdCIKKyAgICBmdW5jX2NvbnZlcnRfcGF0aF9mcm9udF9iYWNrX3BhdGhzZXAgIjoqIiAiKjoiICI7IiAiJDEiCisgIGZpCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfcGF0aF9uaXhfdG9fdzMyCisKKworIyBmdW5jX2NvbnZlcnRfcGF0aF9tc3lzX3RvX2N5Z3dpbiBBUkcKKyMgQ29udmVydCBwYXRoIEFSRyBmcm9tIE1TWVMgdG8gQ3lnd2luIGZvcm1hdC4gIFJlcXVpcmVzIExUX0NZR1BBVEggc2V0LgorIyBSZXR1cm5zIHJlc3VsdCBpbiBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQuCitmdW5jX2NvbnZlcnRfcGF0aF9tc3lzX3RvX2N5Z3dpbiAoKQoreworICAkb3B0X2RlYnVnCisgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJDEiCisgIGlmIHRlc3QgLW4gIiQxIjsgdGhlbgorICAgICMgU2VlIGZ1bmNfY29udmVydF9wYXRoX21zeXNfdG9fdzMyOgorICAgIGZ1bmNfc3RyaXBuYW1lIDogOiAiJDEiCisgICAgZnVuY190b19ob3N0X3BhdGhfdG1wMT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisgICAgZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzIgIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxIgorICAgIGZ1bmNfY3lncGF0aCAtdSAtcCAiJGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyX3Jlc3VsdCIKKyAgICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiRmdW5jX2N5Z3BhdGhfcmVzdWx0IgorICAgIGZ1bmNfY29udmVydF9wYXRoX2NoZWNrIDogOiBcCisgICAgICAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiICIkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IgorICAgIGZ1bmNfY29udmVydF9wYXRoX2Zyb250X2JhY2tfcGF0aHNlcCAiOioiICIqOiIgOiAiJDEiCisgIGZpCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfcGF0aF9tc3lzX3RvX2N5Z3dpbgorCisKKyMgZnVuY19jb252ZXJ0X3BhdGhfbml4X3RvX2N5Z3dpbiBBUkcKKyMgQ29udmVydCBwYXRoIEFSRyBmcm9tICpuaXggdG8gQ3lnd2luIGZvcm1hdC4gIFJlcXVpcmVzIEN5Z3dpbiBpbnN0YWxsZWQgaW4gYQorIyBhIHdpbmUgZW52aXJvbm1lbnQsIHdvcmtpbmcgd2luZXBhdGgsIGFuZCBMVF9DWUdQQVRIIHNldC4gIFJldHVybnMgcmVzdWx0IGluCisjIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9wYXRoX25peF90b19jeWd3aW4gKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICAjIFJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXJzIGZyb20KKyAgICAjIEFSRy4gbXN5cyBiZWhhdmlvciBpcyBpbmNvbnNpc3RlbnQgaGVyZSwgY3lncGF0aCB0dXJucyB0aGVtCisgICAgIyBpbnRvICcuOycgYW5kICc7LicsIGFuZCB3aW5lcGF0aCBpZ25vcmVzIHRoZW0gY29tcGxldGVseS4KKyAgICBmdW5jX3N0cmlwbmFtZSA6IDogIiQxIgorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3RtcDE9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICAgIGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzIgIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxIgorICAgIGZ1bmNfY3lncGF0aCAtdSAtcCAiJGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzJfcmVzdWx0IgorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJGZ1bmNfY3lncGF0aF9yZXN1bHQiCisgICAgZnVuY19jb252ZXJ0X3BhdGhfY2hlY2sgOiA6IFwKKyAgICAgICIkZnVuY190b19ob3N0X3BhdGhfdG1wMSIgIiRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiCisgICAgZnVuY19jb252ZXJ0X3BhdGhfZnJvbnRfYmFja19wYXRoc2VwICI6KiIgIio6IiA6ICIkMSIKKyAgZmkKK30KKyMgZW5kIGZ1bmNfY29udmVydF9wYXRoX25peF90b19jeWd3aW4KKworCiAjIGZ1bmNfbW9kZV9jb21waWxlIGFyZy4uLgogZnVuY19tb2RlX2NvbXBpbGUgKCkKIHsKQEAgLTExMzcsMTIgKzE5ODYsMTIgQEAKIAkgIDs7CiAKIAktcGllIHwgLWZwaWUgfCAtZlBJRSkKLSAgICAgICAgICBwaWVfZmxhZz0iJHBpZV9mbGFnICRhcmciCisgICAgICAgICAgZnVuY19hcHBlbmQgcGllX2ZsYWcgIiAkYXJnIgogCSAgY29udGludWUKIAkgIDs7CiAKIAktc2hhcmVkIHwgLXN0YXRpYyB8IC1wcmVmZXItcGljIHwgLXByZWZlci1ub24tcGljKQotCSAgbGF0ZXI9IiRsYXRlciAkYXJnIgorCSAgZnVuY19hcHBlbmQgbGF0ZXIgIiAkYXJnIgogCSAgY29udGludWUKIAkgIDs7CiAKQEAgLTExNjMsMTUgKzIwMTIsMTQgQEAKIAkgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJwogCSAgZm9yIGFyZyBpbiAkYXJnczsgZG8KIAkgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCi0JICAgIGxhc3Rhcmc9IiRsYXN0YXJnICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKwkgICAgZnVuY19hcHBlbmRfcXVvdGVkIGxhc3RhcmcgIiRhcmciCiAJICBkb25lCiAJICBJRlM9IiRzYXZlX2lmcyIKIAkgIGZ1bmNfc3RyaXBuYW1lICcgJyAnJyAiJGxhc3RhcmciCiAJICBsYXN0YXJnPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKIAogCSAgIyBBZGQgdGhlIGFyZ3VtZW50cyB0byBiYXNlX2NvbXBpbGUuCi0JICBiYXNlX2NvbXBpbGU9IiRiYXNlX2NvbXBpbGUgJGxhc3RhcmciCisJICBmdW5jX2FwcGVuZCBiYXNlX2NvbXBpbGUgIiAkbGFzdGFyZyIKIAkgIGNvbnRpbnVlCiAJICA7OwogCkBAIC0xMTg3LDggKzIwMzUsNyBAQAogICAgICAgZXNhYyAgICAjICBjYXNlICRhcmdfbW9kZQogCiAgICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgdGhlIHByZXZpb3VzIGFyZ3VtZW50LgotICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGxhc3RhcmciCi0gICAgICBiYXNlX2NvbXBpbGU9IiRiYXNlX2NvbXBpbGUgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorICAgICAgZnVuY19hcHBlbmRfcXVvdGVkIGJhc2VfY29tcGlsZSAiJGxhc3RhcmciCiAgICAgZG9uZSAjIGZvciBhcmcKIAogICAgIGNhc2UgJGFyZ19tb2RlIGluCkBAIC0xMjEzLDcgKzIwNjAsNyBAQAogICAgICouW2NDRlNpZm1zb10gfCBcCiAgICAgKi5hZGEgfCAqLmFkYiB8ICouYWRzIHwgKi5hc20gfCBcCiAgICAgKi5jKysgfCAqLmNjIHwgKi5paSB8ICouY2xhc3MgfCAqLmNwcCB8ICouY3h4IHwgXAotICAgICouW2ZGXVswOV0/IHwgKi5mb3IgfCAqLmphdmEgfCAqLm9iaiB8ICouc3gpCisgICAgKi5bZkZdWzA5XT8gfCAqLmZvciB8ICouamF2YSB8ICouZ28gfCAqLm9iaiB8ICouc3ggfCAqLmN1IHwgKi5jdXApCiAgICAgICBmdW5jX3hmb3JtICIkbGlib2JqIgogICAgICAgbGlib2JqPSRmdW5jX3hmb3JtX3Jlc3VsdAogICAgICAgOzsKQEAgLTEyODgsNyArMjEzNSw3IEBACiAgICAgIyBDYWxjdWxhdGUgdGhlIGZpbGVuYW1lIG9mIHRoZSBvdXRwdXQgb2JqZWN0IGlmIGNvbXBpbGVyIGRvZXMKICAgICAjIG5vdCBzdXBwb3J0IC1vIHdpdGggLWMKICAgICBpZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IG5vOyB0aGVuCi0gICAgICBvdXRwdXRfb2JqPWAkRUNITyAiWCRzcmNmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJScgLWUgJ3MlXC5bXi5dKiQlJSdgLiR7b2JqZXh0fQorICAgICAgb3V0cHV0X29iaj1gJEVDSE8gIiRzcmNmaWxlIiB8ICRTRUQgJ3MlXi4qLyUlOyBzJVwuW14uXSokJSUnYC4ke29iamV4dH0KICAgICAgIGxvY2tmaWxlPSIkb3V0cHV0X29iai5sb2NrIgogICAgIGVsc2UKICAgICAgIG91dHB1dF9vYmo9CkBAIC0xMzE5LDE3ICsyMTY2LDE2IEBACiAJJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdAogCWV4aXQgJEVYSVRfRkFJTFVSRQogICAgICAgZmkKLSAgICAgIHJlbW92ZWxpc3Q9IiRyZW1vdmVsaXN0ICRvdXRwdXRfb2JqIgorICAgICAgZnVuY19hcHBlbmQgcmVtb3ZlbGlzdCAiICRvdXRwdXRfb2JqIgogICAgICAgJEVDSE8gIiRzcmNmaWxlIiA+ICIkbG9ja2ZpbGUiCiAgICAgZmkKIAogICAgICRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3QKLSAgICByZW1vdmVsaXN0PSIkcmVtb3ZlbGlzdCAkbG9ja2ZpbGUiCisgICAgZnVuY19hcHBlbmQgcmVtb3ZlbGlzdCAiICRsb2NrZmlsZSIKICAgICB0cmFwICckb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0OyBleGl0ICRFWElUX0ZBSUxVUkUnIDEgMiAxNQogCi0gICAgaWYgdGVzdCAtbiAiJGZpeF9zcmNmaWxlX3BhdGgiOyB0aGVuCi0gICAgICBldmFsIHNyY2ZpbGU9XCIkZml4X3NyY2ZpbGVfcGF0aFwiCi0gICAgZmkKKyAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJHNyY2ZpbGUiIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisgICAgc3JjZmlsZT0kZnVuY190b190b29sX2ZpbGVfcmVzdWx0CiAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJHNyY2ZpbGUiCiAgICAgcXNyY2ZpbGU9JGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0CiAKQEAgLTEzNDksNyArMjE5NSw3IEBACiAKICAgICAgIGlmIHRlc3QgLXogIiRvdXRwdXRfb2JqIjsgdGhlbgogCSMgUGxhY2UgUElDIG9iamVjdHMgaW4gJG9iamRpcgotCWNvbW1hbmQ9IiRjb21tYW5kIC1vICRsb2JqIgorCWZ1bmNfYXBwZW5kIGNvbW1hbmQgIiAtbyAkbG9iaiIKICAgICAgIGZpCiAKICAgICAgIGZ1bmNfc2hvd19ldmFsX2xvY2FsZSAiJGNvbW1hbmQiCVwKQEAgLTEzOTYsMTEgKzIyNDIsMTEgQEAKIAljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSAkcGljX2ZsYWciCiAgICAgICBmaQogICAgICAgaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSB5ZXM7IHRoZW4KLQljb21tYW5kPSIkY29tbWFuZCAtbyAkb2JqIgorCWZ1bmNfYXBwZW5kIGNvbW1hbmQgIiAtbyAkb2JqIgogICAgICAgZmkKIAogICAgICAgIyBTdXBwcmVzcyBjb21waWxlciBvdXRwdXQgaWYgd2UgYWxyZWFkeSBkaWQgYSBQSUMgY29tcGlsYXRpb24uCi0gICAgICBjb21tYW5kPSIkY29tbWFuZCRzdXBwcmVzc19vdXRwdXQiCisgICAgICBmdW5jX2FwcGVuZCBjb21tYW5kICIkc3VwcHJlc3Nfb3V0cHV0IgogICAgICAgZnVuY19zaG93X2V2YWxfbG9jYWxlICIkY29tbWFuZCIgXAogICAgICAgICAnJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdDsgZXhpdCAkRVhJVF9GQUlMVVJFJwogCkBAIC0xNDQ1LDEzICsyMjkxLDEzIEBACiB9CiAKICRvcHRfaGVscCB8fCB7Ci10ZXN0ICIkbW9kZSIgPSBjb21waWxlICYmIGZ1bmNfbW9kZV9jb21waWxlICR7MSsiJEAifQorICB0ZXN0ICIkb3B0X21vZGUiID0gY29tcGlsZSAmJiBmdW5jX21vZGVfY29tcGlsZSAkezErIiRAIn0KIH0KIAogZnVuY19tb2RlX2hlbHAgKCkKIHsKICAgICAjIFdlIG5lZWQgdG8gZGlzcGxheSBoZWxwIGZvciBlYWNoIG9mIHRoZSBtb2Rlcy4KLSAgICBjYXNlICRtb2RlIGluCisgICAgY2FzZSAkb3B0X21vZGUgaW4KICAgICAgICIiKQogICAgICAgICAjIEdlbmVyaWMgaGVscCBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgdXNhZ2UgY29tbWVudHMKICAgICAgICAgIyBhdCB0aGUgc3RhcnQgb2YgdGhpcyBmaWxlLgpAQCAtMTQ4MiwxMCArMjMyOCwxMSBAQAogCiAgIC1vIE9VVFBVVC1GSUxFICAgIHNldCB0aGUgb3V0cHV0IGZpbGUgbmFtZSB0byBPVVRQVVQtRklMRQogICAtbm8tc3VwcHJlc3MgICAgICBkbyBub3Qgc3VwcHJlc3MgY29tcGlsZXIgb3V0cHV0IGZvciBtdWx0aXBsZSBwYXNzZXMKLSAgLXByZWZlci1waWMgICAgICAgdHJ5IHRvIGJ1aWxkaW5nIFBJQyBvYmplY3RzIG9ubHkKLSAgLXByZWZlci1ub24tcGljICAgdHJ5IHRvIGJ1aWxkaW5nIG5vbi1QSUMgb2JqZWN0cyBvbmx5CisgIC1wcmVmZXItcGljICAgICAgIHRyeSB0byBidWlsZCBQSUMgb2JqZWN0cyBvbmx5CisgIC1wcmVmZXItbm9uLXBpYyAgIHRyeSB0byBidWlsZCBub24tUElDIG9iamVjdHMgb25seQogICAtc2hhcmVkICAgICAgICAgICBkbyBub3QgYnVpbGQgYSBcYC5vJyBmaWxlIHN1aXRhYmxlIGZvciBzdGF0aWMgbGlua2luZwogICAtc3RhdGljICAgICAgICAgICBvbmx5IGJ1aWxkIGEgXGAubycgZmlsZSBzdWl0YWJsZSBmb3Igc3RhdGljIGxpbmtpbmcKKyAgLVdjLEZMQUcgICAgICAgICAgcGFzcyBGTEFHIGRpcmVjdGx5IHRvIHRoZSBjb21waWxlcgogCiBDT01QSUxFLUNPTU1BTkQgaXMgYSBjb21tYW5kIHRvIGJlIHVzZWQgaW4gY3JlYXRpbmcgYSBcYHN0YW5kYXJkJyBvYmplY3QgZmlsZQogZnJvbSB0aGUgZ2l2ZW4gU09VUkNFRklMRS4KQEAgLTE1MzgsNyArMjM4NSw3IEBACiAKIFRoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBvZiBJTlNUQUxMLUNPTU1BTkQgYXJlIHRyZWF0ZWQgc3BlY2lhbGx5OgogCi0gIC1pbnN0LXByZWZpeCBQUkVGSVgtRElSICBVc2UgUFJFRklYLURJUiBhcyBhIHN0YWdpbmcgYXJlYSBmb3IgaW5zdGFsbGF0aW9uCisgIC1pbnN0LXByZWZpeC1kaXIgUFJFRklYLURJUiAgVXNlIFBSRUZJWC1ESVIgYXMgYSBzdGFnaW5nIGFyZWEgZm9yIGluc3RhbGxhdGlvbgogCiBUaGUgcmVzdCBvZiB0aGUgY29tcG9uZW50cyBhcmUgaW50ZXJwcmV0ZWQgYXMgYXJndW1lbnRzIHRvIHRoYXQgY29tbWFuZCAob25seQogQlNELWNvbXBhdGlibGUgaW5zdGFsbCBvcHRpb25zIGFyZSByZWNvZ25pemVkKS4iCkBAIC0xNTU4LDYgKzI0MDUsOCBAQAogCiAgIC1hbGwtc3RhdGljICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIGF0IGFsbAogICAtYXZvaWQtdmVyc2lvbiAgICBkbyBub3QgYWRkIGEgdmVyc2lvbiBzdWZmaXggaWYgcG9zc2libGUKKyAgLWJpbmRpciBCSU5ESVIgICAgc3BlY2lmeSBwYXRoIHRvIGJpbmFyaWVzIGRpcmVjdG9yeSAoZm9yIHN5c3RlbXMgd2hlcmUKKyAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzIG11c3QgYmUgZm91bmQgaW4gdGhlIFBBVEggc2V0dGluZyBhdCBydW50aW1lKQogICAtZGxvcGVuIEZJTEUgICAgICBcYC1kbHByZW9wZW4nIEZJTEUgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkIGF0IHJ1bnRpbWUKICAgLWRscHJlb3BlbiBGSUxFICAgbGluayBpbiBGSUxFIGFuZCBhZGQgaXRzIHN5bWJvbHMgdG8gbHRfcHJlbG9hZGVkX3N5bWJvbHMKICAgLWV4cG9ydC1keW5hbWljICAgYWxsb3cgc3ltYm9scyBmcm9tIE9VVFBVVC1GSUxFIHRvIGJlIHJlc29sdmVkIHdpdGggZGxzeW0oMykKQEAgLTE1ODYsNiArMjQzNSwxMSBAQAogICAtdmVyc2lvbi1pbmZvIENVUlJFTlRbOlJFVklTSU9OWzpBR0VdXQogICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5IGxpYnJhcnkgdmVyc2lvbiBpbmZvIFtlYWNoIHZhcmlhYmxlIGRlZmF1bHRzIHRvIDBdCiAgIC13ZWFrIExJQk5BTUUgICAgIGRlY2xhcmUgdGhhdCB0aGUgdGFyZ2V0IHByb3ZpZGVzIHRoZSBMSUJOQU1FIGludGVyZmFjZQorICAtV2MsRkxBRworICAtWGNvbXBpbGVyIEZMQUcgICBwYXNzIGxpbmtlci1zcGVjaWZpYyBGTEFHIGRpcmVjdGx5IHRvIHRoZSBjb21waWxlcgorICAtV2wsRkxBRworICAtWGxpbmtlciBGTEFHICAgICBwYXNzIGxpbmtlci1zcGVjaWZpYyBGTEFHIGRpcmVjdGx5IHRvIHRoZSBsaW5rZXIKKyAgLVhDQ2xpbmtlciBGTEFHICAgcGFzcyBsaW5rLXNwZWNpZmljIEZMQUcgdG8gdGhlIGNvbXBpbGVyIGRyaXZlciAoQ0MpCiAKIEFsbCBvdGhlciBvcHRpb25zIChhcmd1bWVudHMgYmVnaW5uaW5nIHdpdGggXGAtJykgYXJlIGlnbm9yZWQuCiAKQEAgLTE2MTksMTggKzI0NzMsNDQgQEAKICAgICAgICAgOzsKIAogICAgICAgKikKLSAgICAgICAgZnVuY19mYXRhbF9oZWxwICJpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG1vZGUnIgorICAgICAgICBmdW5jX2ZhdGFsX2hlbHAgImludmFsaWQgb3BlcmF0aW9uIG1vZGUgXGAkb3B0X21vZGUnIgogICAgICAgICA7OwogICAgIGVzYWMKIAotICAgICRFQ0hPCisgICAgZWNobwogICAgICRFQ0hPICJUcnkgXGAkcHJvZ25hbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBvdGhlciBtb2Rlcy4iCi0KLSAgICBleGl0ICQ/CiB9CiAKLSAgIyBOb3cgdGhhdCB3ZSd2ZSBjb2xsZWN0ZWQgYSBwb3NzaWJsZSAtLW1vZGUgYXJnLCBzaG93IGhlbHAgaWYgbmVjZXNzYXJ5Ci0gICRvcHRfaGVscCAmJiBmdW5jX21vZGVfaGVscAorIyBOb3cgdGhhdCB3ZSd2ZSBjb2xsZWN0ZWQgYSBwb3NzaWJsZSAtLW1vZGUgYXJnLCBzaG93IGhlbHAgaWYgbmVjZXNzYXJ5CitpZiAkb3B0X2hlbHA7IHRoZW4KKyAgaWYgdGVzdCAiJG9wdF9oZWxwIiA9IDo7IHRoZW4KKyAgICBmdW5jX21vZGVfaGVscAorICBlbHNlCisgICAgeworICAgICAgZnVuY19oZWxwIG5vZXhpdAorICAgICAgZm9yIG9wdF9tb2RlIGluIGNvbXBpbGUgbGluayBleGVjdXRlIGluc3RhbGwgZmluaXNoIHVuaW5zdGFsbCBjbGVhbjsgZG8KKwlmdW5jX21vZGVfaGVscAorICAgICAgZG9uZQorICAgIH0gfCBzZWQgLW4gJzFwOyAyLCRzL15Vc2FnZTovICBvcjogL3AnCisgICAgeworICAgICAgZnVuY19oZWxwIG5vZXhpdAorICAgICAgZm9yIG9wdF9tb2RlIGluIGNvbXBpbGUgbGluayBleGVjdXRlIGluc3RhbGwgZmluaXNoIHVuaW5zdGFsbCBjbGVhbjsgZG8KKwllY2hvCisJZnVuY19tb2RlX2hlbHAKKyAgICAgIGRvbmUKKyAgICB9IHwKKyAgICBzZWQgJzFkCisgICAgICAvXldoZW4gcmVwb3J0aW5nLywvXlJlcG9ydC97CisJSAorCWQKKyAgICAgIH0KKyAgICAgICR4CisgICAgICAvaW5mb3JtYXRpb24gYWJvdXQgb3RoZXIgbW9kZXMvZAorICAgICAgL21vcmUgZGV0YWlsZWQgLipNT0RFL2QKKyAgICAgIHMvXlVzYWdlOi4qLS1tb2RlPVwoW14gXSpcKSAuKi9EZXNjcmlwdGlvbiBvZiBcMSBtb2RlOi8nCisgIGZpCisgIGV4aXQgJD8KK2ZpCiAKIAogIyBmdW5jX21vZGVfZXhlY3V0ZSBhcmcuLi4KQEAgLTE2NDMsMTMgKzI1MjMsMTYgQEAKICAgICAgIGZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhIENPTU1BTkQiCiAKICAgICAjIEhhbmRsZSAtZGxvcGVuIGZsYWdzIGltbWVkaWF0ZWx5LgotICAgIGZvciBmaWxlIGluICRleGVjdXRlX2RsZmlsZXM7IGRvCisgICAgZm9yIGZpbGUgaW4gJG9wdF9kbG9wZW47IGRvCiAgICAgICB0ZXN0IC1mICIkZmlsZSIgXAogCXx8IGZ1bmNfZmF0YWxfaGVscCAiXGAkZmlsZScgaXMgbm90IGEgZmlsZSIKIAogICAgICAgZGlyPQogICAgICAgY2FzZSAkZmlsZSBpbgogICAgICAgKi5sYSkKKwlmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGZpbGUiCisJZmlsZT0kZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0CisKIAkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgogCWZ1bmNfbGFsaWJfdW5zYWZlX3AgIiRmaWxlIiBcCiAJICB8fCBmdW5jX2ZhdGFsX2hlbHAgIlxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgpAQCAtMTY3MSw3ICsyNTU0LDcgQEAKIAlkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgogCiAJaWYgdGVzdCAtZiAiJGRpci8kb2JqZGlyLyRkbG5hbWUiOyB0aGVuCi0JICBkaXI9IiRkaXIvJG9iamRpciIKKwkgIGZ1bmNfYXBwZW5kIGRpciAiLyRvYmpkaXIiCiAJZWxzZQogCSAgaWYgdGVzdCAhIC1mICIkZGlyLyRkbG5hbWUiOyB0aGVuCiAJICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBmaW5kIFxgJGRsbmFtZScgaW4gXGAkZGlyJyBvciBcYCRkaXIvJG9iamRpciciCkBAIC0xNzEyLDcgKzI1OTUsNyBAQAogICAgIGZvciBmaWxlCiAgICAgZG8KICAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgIC0qKSA7OworICAgICAgLSogfCAqLmxhIHwgKi5sbyApIDs7CiAgICAgICAqKQogCSMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHJlYWxseSBhIGxpYnRvb2wgcHJvZ3JhbS4KIAlpZiBmdW5jX2x0d3JhcHBlcl9zY3JpcHRfcCAiJGZpbGUiOyB0aGVuCkBAIC0xNzI4LDggKzI2MTEsNyBAQAogCTs7CiAgICAgICBlc2FjCiAgICAgICAjIFF1b3RlIGFyZ3VtZW50cyAodG8gcHJlc2VydmUgc2hlbGwgbWV0YWNoYXJhY3RlcnMpLgotICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGZpbGUiCi0gICAgICBhcmdzPSIkYXJncyAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisgICAgICBmdW5jX2FwcGVuZF9xdW90ZWQgYXJncyAiJGZpbGUiCiAgICAgZG9uZQogCiAgICAgaWYgdGVzdCAiWCRvcHRfZHJ5X3J1biIgPSBYZmFsc2U7IHRoZW4KQEAgLTE3NTQsMjkgKzI2MzYsNjYgQEAKICAgICAgICMgRGlzcGxheSB3aGF0IHdvdWxkIGJlIGRvbmUuCiAgICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KIAlldmFsICJcJEVDSE8gXCJcJHNobGlicGF0aF92YXI9XCQkc2hsaWJwYXRoX3ZhclwiIgotCSRFQ0hPICJleHBvcnQgJHNobGlicGF0aF92YXIiCisJZWNobyAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgogICAgICAgZmkKICAgICAgICRFQ0hPICIkY21kJGFyZ3MiCiAgICAgICBleGl0ICRFWElUX1NVQ0NFU1MKICAgICBmaQogfQogCi10ZXN0ICIkbW9kZSIgPSBleGVjdXRlICYmIGZ1bmNfbW9kZV9leGVjdXRlICR7MSsiJEAifQordGVzdCAiJG9wdF9tb2RlIiA9IGV4ZWN1dGUgJiYgZnVuY19tb2RlX2V4ZWN1dGUgJHsxKyIkQCJ9CiAKIAogIyBmdW5jX21vZGVfZmluaXNoIGFyZy4uLgogZnVuY19tb2RlX2ZpbmlzaCAoKQogewogICAgICRvcHRfZGVidWcKLSAgICBsaWJkaXJzPSIkbm9ub3B0IgorICAgIGxpYnM9CisgICAgbGliZGlycz0KICAgICBhZG1pbmNtZHM9CiAKLSAgICBpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMkZmluaXNoX2V2YWwiICYmIHRlc3QgLW4gIiRsaWJkaXJzIjsgdGhlbgotICAgICAgZm9yIGRpcgotICAgICAgZG8KLQlsaWJkaXJzPSIkbGliZGlycyAkZGlyIgotICAgICAgZG9uZQorICAgIGZvciBvcHQgaW4gIiRub25vcHQiICR7MSsiJEAifQorICAgIGRvCisgICAgICBpZiB0ZXN0IC1kICIkb3B0IjsgdGhlbgorCWZ1bmNfYXBwZW5kIGxpYmRpcnMgIiAkb3B0IgogCisgICAgICBlbGlmIHRlc3QgLWYgIiRvcHQiOyB0aGVuCisJaWYgZnVuY19sYWxpYl91bnNhZmVfcCAiJG9wdCI7IHRoZW4KKwkgIGZ1bmNfYXBwZW5kIGxpYnMgIiAkb3B0IgorCWVsc2UKKwkgIGZ1bmNfd2FybmluZyAiXGAkb3B0JyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCisJZmkKKworICAgICAgZWxzZQorCWZ1bmNfZmF0YWxfZXJyb3IgImludmFsaWQgYXJndW1lbnQgXGAkb3B0JyIKKyAgICAgIGZpCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAtbiAiJGxpYnMiOyB0aGVuCisgICAgICBpZiB0ZXN0IC1uICIkbHRfc3lzcm9vdCI7IHRoZW4KKyAgICAgICAgc3lzcm9vdF9yZWdleD1gJEVDSE8gIiRsdF9zeXNyb290IiB8ICRTRUQgIiRzZWRfbWFrZV9saXRlcmFsX3JlZ2V4ImAKKyAgICAgICAgc3lzcm9vdF9jbWQ9InMvXChbICddXCkkc3lzcm9vdF9yZWdleC9cMS9nOyIKKyAgICAgIGVsc2UKKyAgICAgICAgc3lzcm9vdF9jbWQ9CisgICAgICBmaQorCisgICAgICAjIFJlbW92ZSBzeXNyb290IHJlZmVyZW5jZXMKKyAgICAgIGlmICRvcHRfZHJ5X3J1bjsgdGhlbgorICAgICAgICBmb3IgbGliIGluICRsaWJzOyBkbworICAgICAgICAgIGVjaG8gInJlbW92aW5nIHJlZmVyZW5jZXMgdG8gJGx0X3N5c3Jvb3QgYW5kIFxgPScgcHJlZml4ZXMgZnJvbSAkbGliIgorICAgICAgICBkb25lCisgICAgICBlbHNlCisgICAgICAgIHRtcGRpcj1gZnVuY19ta3RlbXBkaXJgCisgICAgICAgIGZvciBsaWIgaW4gJGxpYnM7IGRvCisJICBzZWQgLWUgIiR7c3lzcm9vdF9jbWR9IHMvXChbICddLVtMUl1cKT0vXDEvZzsgcy9cKFsgJ11cKT0vXDEvZyIgJGxpYiBcCisJICAgID4gJHRtcGRpci90bXAtbGEKKwkgIG12IC1mICR0bXBkaXIvdG1wLWxhICRsaWIKKwlkb25lCisgICAgICAgICR7Uk19ciAiJHRtcGRpciIKKyAgICAgIGZpCisgICAgZmkKKworICAgIGlmIHRlc3QgLW4gIiRmaW5pc2hfY21kcyRmaW5pc2hfZXZhbCIgJiYgdGVzdCAtbiAiJGxpYmRpcnMiOyB0aGVuCiAgICAgICBmb3IgbGliZGlyIGluICRsaWJkaXJzOyBkbwogCWlmIHRlc3QgLW4gIiRmaW5pc2hfY21kcyI7IHRoZW4KIAkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBmaW5pc2ggY29tbWFuZHMuCkBAIC0xNzg2LDcgKzI3MDUsNyBAQAogCWlmIHRlc3QgLW4gIiRmaW5pc2hfZXZhbCI7IHRoZW4KIAkgICMgRG8gdGhlIHNpbmdsZSBmaW5pc2hfZXZhbC4KIAkgIGV2YWwgY21kcz1cIiRmaW5pc2hfZXZhbFwiCi0JICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAiJGNtZHMiIHx8IGFkbWluY21kcz0iJGFkbWluY21kcworCSAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgIiRjbWRzIiB8fCBmdW5jX2FwcGVuZCBhZG1pbmNtZHMgIgogICAgICAgICRjbWRzIgogCWZpCiAgICAgICBkb25lCkBAIC0xNzk1LDUzICsyNzE0LDU1IEBACiAgICAgIyBFeGl0IGhlcmUgaWYgdGhleSB3YW50ZWQgc2lsZW50IG1vZGUuCiAgICAgJG9wdF9zaWxlbnQgJiYgZXhpdCAkRVhJVF9TVUNDRVNTCiAKLSAgICAkRUNITyAiWC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIHwgJFhzZWQKLSAgICAkRUNITyAiTGlicmFyaWVzIGhhdmUgYmVlbiBpbnN0YWxsZWQgaW46IgotICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCi0gICAgICAkRUNITyAiICAgJGxpYmRpciIKLSAgICBkb25lCi0gICAgJEVDSE8KLSAgICAkRUNITyAiSWYgeW91IGV2ZXIgaGFwcGVuIHRvIHdhbnQgdG8gbGluayBhZ2FpbnN0IGluc3RhbGxlZCBsaWJyYXJpZXMiCi0gICAgJEVDSE8gImluIGEgZ2l2ZW4gZGlyZWN0b3J5LCBMSUJESVIsIHlvdSBtdXN0IGVpdGhlciB1c2UgbGlidG9vbCwgYW5kIgotICAgICRFQ0hPICJzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBsaWJyYXJ5LCBvciB1c2UgdGhlIFxgLUxMSUJESVInIgotICAgICRFQ0hPICJmbGFnIGR1cmluZyBsaW5raW5nIGFuZCBkbyBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZzoiCi0gICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0gICAgICAkRUNITyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRzaGxpYnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKLSAgICAgICRFQ0hPICIgICAgIGR1cmluZyBleGVjdXRpb24iCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0gICAgICAkRUNITyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRydW5wYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCi0gICAgICAkRUNITyAiICAgICBkdXJpbmcgbGlua2luZyIKLSAgICBmaQotICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgotICAgICAgbGliZGlyPUxJQkRJUgotICAgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorICAgIGlmIHRlc3QgLW4gIiRmaW5pc2hfY21kcyRmaW5pc2hfZXZhbCIgJiYgdGVzdCAtbiAiJGxpYmRpcnMiOyB0aGVuCisgICAgICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgICAgZWNobyAiTGlicmFyaWVzIGhhdmUgYmVlbiBpbnN0YWxsZWQgaW46IgorICAgICAgZm9yIGxpYmRpciBpbiAkbGliZGlyczsgZG8KKwkkRUNITyAiICAgJGxpYmRpciIKKyAgICAgIGRvbmUKKyAgICAgIGVjaG8KKyAgICAgIGVjaG8gIklmIHlvdSBldmVyIGhhcHBlbiB0byB3YW50IHRvIGxpbmsgYWdhaW5zdCBpbnN0YWxsZWQgbGlicmFyaWVzIgorICAgICAgZWNobyAiaW4gYSBnaXZlbiBkaXJlY3RvcnksIExJQkRJUiwgeW91IG11c3QgZWl0aGVyIHVzZSBsaWJ0b29sLCBhbmQiCisgICAgICBlY2hvICJzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBsaWJyYXJ5LCBvciB1c2UgdGhlIFxgLUxMSUJESVInIgorICAgICAgZWNobyAiZmxhZyBkdXJpbmcgbGlua2luZyBhbmQgZG8gYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmc6IgorICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisJZWNobyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRzaGxpYnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKKwllY2hvICIgICAgIGR1cmluZyBleGVjdXRpb24iCisgICAgICBmaQorICAgICAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgorCWVjaG8gIiAgIC0gYWRkIExJQkRJUiB0byB0aGUgXGAkcnVucGF0aF92YXInIGVudmlyb25tZW50IHZhcmlhYmxlIgorCWVjaG8gIiAgICAgZHVyaW5nIGxpbmtpbmciCisgICAgICBmaQorICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCisJbGliZGlyPUxJQkRJUgorCWV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKIAotICAgICAgJEVDSE8gIiAgIC0gdXNlIHRoZSBcYCRmbGFnJyBsaW5rZXIgZmxhZyIKLSAgICBmaQotICAgIGlmIHRlc3QgLW4gIiRhZG1pbmNtZHMiOyB0aGVuCi0gICAgICAkRUNITyAiICAgLSBoYXZlIHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IgcnVuIHRoZXNlIGNvbW1hbmRzOiRhZG1pbmNtZHMiCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgotICAgICAgJEVDSE8gIiAgIC0gaGF2ZSB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIGFkZCBMSUJESVIgdG8gXGAvZXRjL2xkLnNvLmNvbmYnIgotICAgIGZpCi0gICAgJEVDSE8KKwkkRUNITyAiICAgLSB1c2UgdGhlIFxgJGZsYWcnIGxpbmtlciBmbGFnIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgLW4gIiRhZG1pbmNtZHMiOyB0aGVuCisJJEVDSE8gIiAgIC0gaGF2ZSB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIHJ1biB0aGVzZSBjb21tYW5kczokYWRtaW5jbWRzIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCisJZWNobyAiICAgLSBoYXZlIHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IgYWRkIExJQkRJUiB0byBcYC9ldGMvbGQuc28uY29uZiciCisgICAgICBmaQorICAgICAgZWNobwogCi0gICAgJEVDSE8gIlNlZSBhbnkgb3BlcmF0aW5nIHN5c3RlbSBkb2N1bWVudGF0aW9uIGFib3V0IHNoYXJlZCBsaWJyYXJpZXMgZm9yIgotICAgIGNhc2UgJGhvc3QgaW4KLSAgICAgIHNvbGFyaXMyLls2Nzg5XXxzb2xhcmlzMi4xWzAtOV0pCi0gICAgICAgICRFQ0hPICJtb3JlIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSBsZCgxKSwgY3JsZSgxKSBhbmQgbGQuc28oOCkgbWFudWFsIgotCSRFQ0hPICJwYWdlcy4iCi0JOzsKLSAgICAgICopCi0gICAgICAgICRFQ0hPICJtb3JlIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSBsZCgxKSBhbmQgbGQuc28oOCkgbWFudWFsIHBhZ2VzLiIKLSAgICAgICAgOzsKLSAgICBlc2FjCi0gICAgJEVDSE8gIlgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiB8ICRYc2VkCisgICAgICBlY2hvICJTZWUgYW55IG9wZXJhdGluZyBzeXN0ZW0gZG9jdW1lbnRhdGlvbiBhYm91dCBzaGFyZWQgbGlicmFyaWVzIGZvciIKKyAgICAgIGNhc2UgJGhvc3QgaW4KKwlzb2xhcmlzMi5bNjc4OV18c29sYXJpczIuMVswLTldKQorCSAgZWNobyAibW9yZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgbGQoMSksIGNybGUoMSkgYW5kIGxkLnNvKDgpIG1hbnVhbCIKKwkgIGVjaG8gInBhZ2VzLiIKKwkgIDs7CisJKikKKwkgIGVjaG8gIm1vcmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIGxkKDEpIGFuZCBsZC5zbyg4KSBtYW51YWwgcGFnZXMuIgorCSAgOzsKKyAgICAgIGVzYWMKKyAgICAgIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgICAgZmkKICAgICBleGl0ICRFWElUX1NVQ0NFU1MKIH0KIAotdGVzdCAiJG1vZGUiID0gZmluaXNoICYmIGZ1bmNfbW9kZV9maW5pc2ggJHsxKyIkQCJ9Cit0ZXN0ICIkb3B0X21vZGUiID0gZmluaXNoICYmIGZ1bmNfbW9kZV9maW5pc2ggJHsxKyIkQCJ9CiAKIAogIyBmdW5jX21vZGVfaW5zdGFsbCBhcmcuLi4KQEAgLTE4NTIsNyArMjc3Myw3IEBACiAgICAgIyBpbnN0YWxsX3Byb2cgKGVzcGVjaWFsbHkgb24gV2luZG93cyBOVCkuCiAgICAgaWYgdGVzdCAiJG5vbm9wdCIgPSAiJFNIRUxMIiB8fCB0ZXN0ICIkbm9ub3B0IiA9IC9iaW4vc2ggfHwKICAgICAgICAjIEFsbG93IHRoZSB1c2Ugb2YgR05VIHNodG9vbCdzIGluc3RhbGwgY29tbWFuZC4KLSAgICAgICAkRUNITyAiWCRub25vcHQiIHwgJEdSRVAgc2h0b29sID4vZGV2L251bGw7IHRoZW4KKyAgICAgICBjYXNlICRub25vcHQgaW4gKnNodG9vbCopIDo7OyAqKSBmYWxzZTs7IGVzYWM7IHRoZW4KICAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRub25vcHQiCiAgICAgICBpbnN0YWxsX3Byb2c9IiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCAiCkBAIC0xODY2LDcgKzI3ODcsMTIgQEAKICAgICAjIFRoZSByZWFsIGZpcnN0IGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgaW5zdGFsbGF0aW9uIHByb2dyYW0uCiAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIGl0LgogICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCi0gICAgaW5zdGFsbF9wcm9nPSIkaW5zdGFsbF9wcm9nJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorICAgIGZ1bmNfYXBwZW5kIGluc3RhbGxfcHJvZyAiJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorICAgIGluc3RhbGxfc2hhcmVkX3Byb2c9JGluc3RhbGxfcHJvZworICAgIGNhc2UgIiAkaW5zdGFsbF9wcm9nICIgaW4KKyAgICAgICpbXFxcIC9dY3BcICopIGluc3RhbGxfY3A9OiA7OworICAgICAgKikgaW5zdGFsbF9jcD1mYWxzZSA7OworICAgIGVzYWMKIAogICAgICMgV2UgbmVlZCB0byBhY2NlcHQgYXQgbGVhc3QgYWxsIHRoZSBCU0QgaW5zdGFsbCBmbGFncy4KICAgICBkZXN0PQpAQCAtMTg3NiwxMCArMjgwMiwxMiBAQAogICAgIGluc3RhbGxfdHlwZT0KICAgICBpc2Rpcj1ubwogICAgIHN0cmlwbWU9CisgICAgbm9fbW9kZT06CiAgICAgZm9yIGFyZwogICAgIGRvCisgICAgICBhcmcyPQogICAgICAgaWYgdGVzdCAtbiAiJGRlc3QiOyB0aGVuCi0JZmlsZXM9IiRmaWxlcyAkZGVzdCIKKwlmdW5jX2FwcGVuZCBmaWxlcyAiICRkZXN0IgogCWRlc3Q9JGFyZwogCWNvbnRpbnVlCiAgICAgICBmaQpAQCAtMTg4NywxMCArMjgxNSw5IEBACiAgICAgICBjYXNlICRhcmcgaW4KICAgICAgIC1kKSBpc2Rpcj15ZXMgOzsKICAgICAgIC1mKQotCWNhc2UgIiAkaW5zdGFsbF9wcm9nICIgaW4KLQkqW1xcXCAvXWNwXCAqKSA7OwotCSopIHByZXY9JGFyZyA7OwotCWVzYWMKKwlpZiAkaW5zdGFsbF9jcDsgdGhlbiA6OyBlbHNlCisJICBwcmV2PSRhcmcKKwlmaQogCTs7CiAgICAgICAtZyB8IC1tIHwgLW8pCiAJcHJldj0kYXJnCkBAIC0xOTA0LDYgKzI4MzEsMTAgQEAKICAgICAgICopCiAJIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRlZCBhbiBhcmd1bWVudCwgdGhlbiBza2lwIGl0LgogCWlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgorCSAgaWYgdGVzdCAieCRwcmV2IiA9IHgtbSAmJiB0ZXN0IC1uICIkaW5zdGFsbF9vdmVycmlkZV9tb2RlIjsgdGhlbgorCSAgICBhcmcyPSRpbnN0YWxsX292ZXJyaWRlX21vZGUKKwkgICAgbm9fbW9kZT1mYWxzZQorCSAgZmkKIAkgIHByZXY9CiAJZWxzZQogCSAgZGVzdD0kYXJnCkBAIC0xOTE0LDcgKzI4NDUsMTEgQEAKIAogICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIHRoZSBhcmd1bWVudC4KICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCi0gICAgICBpbnN0YWxsX3Byb2c9IiRpbnN0YWxsX3Byb2cgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorICAgICAgZnVuY19hcHBlbmQgaW5zdGFsbF9wcm9nICIgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorICAgICAgaWYgdGVzdCAtbiAiJGFyZzIiOyB0aGVuCisJZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZzIiCisgICAgICBmaQorICAgICAgZnVuY19hcHBlbmQgaW5zdGFsbF9zaGFyZWRfcHJvZyAiICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKICAgICBkb25lCiAKICAgICB0ZXN0IC16ICIkaW5zdGFsbF9wcm9nIiAmJiBcCkBAIC0xOTIzLDYgKzI4NTgsMTMgQEAKICAgICB0ZXN0IC1uICIkcHJldiIgJiYgXAogICAgICAgZnVuY19mYXRhbF9oZWxwICJ0aGUgXGAkcHJldicgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IgogCisgICAgaWYgdGVzdCAtbiAiJGluc3RhbGxfb3ZlcnJpZGVfbW9kZSIgJiYgJG5vX21vZGU7IHRoZW4KKyAgICAgIGlmICRpbnN0YWxsX2NwOyB0aGVuIDo7IGVsc2UKKwlmdW5jX3F1b3RlX2Zvcl9ldmFsICIkaW5zdGFsbF9vdmVycmlkZV9tb2RlIgorCWZ1bmNfYXBwZW5kIGluc3RhbGxfc2hhcmVkX3Byb2cgIiAtbSAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisgICAgICBmaQorICAgIGZpCisKICAgICBpZiB0ZXN0IC16ICIkZmlsZXMiOyB0aGVuCiAgICAgICBpZiB0ZXN0IC16ICIkZGVzdCI7IHRoZW4KIAlmdW5jX2ZhdGFsX2hlbHAgIm5vIGZpbGUgb3IgZGVzdGluYXRpb24gc3BlY2lmaWVkIgpAQCAtMTk3NywxMCArMjkxOSwxMyBAQAogICAgICAgY2FzZSAkZmlsZSBpbgogICAgICAgKi4kbGliZXh0KQogCSMgRG8gdGhlIHN0YXRpYyBsaWJyYXJpZXMgbGF0ZXIuCi0Jc3RhdGljbGlicz0iJHN0YXRpY2xpYnMgJGZpbGUiCisJZnVuY19hcHBlbmQgc3RhdGljbGlicyAiICRmaWxlIgogCTs7CiAKICAgICAgICoubGEpCisJZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRmaWxlIgorCWZpbGU9JGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdAorCiAJIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KIAlmdW5jX2xhbGliX3Vuc2FmZV9wICIkZmlsZSIgXAogCSAgfHwgZnVuY19mYXRhbF9oZWxwICJcYCRmaWxlJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCkBAIC0xOTk0LDIzICsyOTM5LDIzIEBACiAJaWYgdGVzdCAiWCRkZXN0ZGlyIiA9ICJYJGxpYmRpciI7IHRoZW4KIAkgIGNhc2UgIiRjdXJyZW50X2xpYmRpcnMgIiBpbgogCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGN1cnJlbnRfbGliZGlycz0iJGN1cnJlbnRfbGliZGlycyAkbGliZGlyIiA7OworCSAgKikgZnVuY19hcHBlbmQgY3VycmVudF9saWJkaXJzICIgJGxpYmRpciIgOzsKIAkgIGVzYWMKIAllbHNlCiAJICAjIE5vdGUgdGhlIGxpYmRpciBhcyBhIGZ1dHVyZSBsaWJkaXIuCiAJICBjYXNlICIkZnV0dXJlX2xpYmRpcnMgIiBpbgogCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGZ1dHVyZV9saWJkaXJzPSIkZnV0dXJlX2xpYmRpcnMgJGxpYmRpciIgOzsKKwkgICopIGZ1bmNfYXBwZW5kIGZ1dHVyZV9saWJkaXJzICIgJGxpYmRpciIgOzsKIAkgIGVzYWMKIAlmaQogCiAJZnVuY19kaXJuYW1lICIkZmlsZSIgIi8iICIiCiAJZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKLQlkaXI9IiRkaXIkb2JqZGlyIgorCWZ1bmNfYXBwZW5kIGRpciAiJG9iamRpciIKIAogCWlmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KIAkgICMgRGV0ZXJtaW5lIHRoZSBwcmVmaXggdGhlIHVzZXIgaGFzIGFwcGxpZWQgdG8gb3VyIGZ1dHVyZSBkaXIuCi0JICBpbnN0X3ByZWZpeF9kaXI9YCRFQ0hPICJYJGRlc3RkaXIiIHwgJFhzZWQgLWUgInMlJGxpYmRpclwkJSUiYAorCSAgaW5zdF9wcmVmaXhfZGlyPWAkRUNITyAiJGRlc3RkaXIiIHwgJFNFRCAtZSAicyUkbGliZGlyXCQlJSJgCiAKIAkgICMgRG9uJ3QgYWxsb3cgdGhlIHVzZXIgdG8gcGxhY2UgdXMgb3V0c2lkZSBvZiBvdXIgZXhwZWN0ZWQKIAkgICMgbG9jYXRpb24gYi9jIHRoaXMgcHJldmVudHMgZmluZGluZyBkZXBlbmRlbnQgbGlicmFyaWVzIHRoYXQKQEAgLTIwMjMsOSArMjk2OCw5IEBACiAKIAkgIGlmIHRlc3QgLW4gIiRpbnN0X3ByZWZpeF9kaXIiOyB0aGVuCiAJICAgICMgU3RpY2sgdGhlIGluc3RfcHJlZml4X2RpciBkYXRhIGludG8gdGhlIGxpbmsgY29tbWFuZC4KLQkgICAgcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICJYJHJlbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBpbnN0X3ByZWZpeF9kaXJAJS1pbnN0LXByZWZpeC1kaXIgJGluc3RfcHJlZml4X2RpciUiYAorCSAgICByZWxpbmtfY29tbWFuZD1gJEVDSE8gIiRyZWxpbmtfY29tbWFuZCIgfCAkU0VEICJzJUBpbnN0X3ByZWZpeF9kaXJAJS1pbnN0LXByZWZpeC1kaXIgJGluc3RfcHJlZml4X2RpciUiYAogCSAgZWxzZQotCSAgICByZWxpbmtfY29tbWFuZD1gJEVDSE8gIlgkcmVsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQGluc3RfcHJlZml4X2RpckAlJSJgCisJICAgIHJlbGlua19jb21tYW5kPWAkRUNITyAiJHJlbGlua19jb21tYW5kIiB8ICRTRUQgInMlQGluc3RfcHJlZml4X2RpckAlJSJgCiAJICBmaQogCiAJICBmdW5jX3dhcm5pbmcgInJlbGlua2luZyBcYCRmaWxlJyIKQEAgLTIwNDMsNyArMjk4OCw3IEBACiAJICB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiICYmIHNyY25hbWU9IiRyZWFsbmFtZSJUCiAKIAkgICMgSW5zdGFsbCB0aGUgc2hhcmVkIGxpYnJhcnkgYW5kIGJ1aWxkIHRoZSBzeW1saW5rcy4KLQkgIGZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9wcm9nICRkaXIvJHNyY25hbWUgJGRlc3RkaXIvJHJlYWxuYW1lIiBcCisJICBmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfc2hhcmVkX3Byb2cgJGRpci8kc3JjbmFtZSAkZGVzdGRpci8kcmVhbG5hbWUiIFwKIAkgICAgICAnZXhpdCAkPycKIAkgIHRzdHJpcG1lPSIkc3RyaXBtZSIKIAkgIGNhc2UgJGhvc3Rfb3MgaW4KQEAgLTIwODMsNyArMzAyOCw3IEBACiAJZnVuY19zaG93X2V2YWwgIiRpbnN0YWxsX3Byb2cgJGluc3RuYW1lICRkZXN0ZGlyLyRuYW1lIiAnZXhpdCAkPycKIAogCSMgTWF5YmUgaW5zdGFsbCB0aGUgc3RhdGljIGxpYnJhcnksIHRvby4KLQl0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIHN0YXRpY2xpYnM9IiRzdGF0aWNsaWJzICRkaXIvJG9sZF9saWJyYXJ5IgorCXRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgZnVuY19hcHBlbmQgc3RhdGljbGlicyAiICRkaXIvJG9sZF9saWJyYXJ5IgogCTs7CiAKICAgICAgICoubG8pCkBAIC0yMTgzLDcgKzMxMjgsNyBAQAogCSAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgogCSAgICAgIGZ1bmNfc291cmNlICIkbGliIgogCSAgICBmaQotCSAgICBsaWJmaWxlPSIkbGliZGlyLyJgJEVDSE8gIlgkbGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJWcnYCAjIyMgdGVzdHN1aXRlOiBza2lwIG5lc3RlZCBxdW90aW5nIHRlc3QKKwkgICAgbGliZmlsZT0iJGxpYmRpci8iYCRFQ0hPICIkbGliIiB8ICRTRUQgJ3MlXi4qLyUlZydgICMjIyB0ZXN0c3VpdGU6IHNraXAgbmVzdGVkIHF1b3RpbmcgdGVzdAogCSAgICBpZiB0ZXN0IC1uICIkbGliZGlyIiAmJiB0ZXN0ICEgLWYgIiRsaWJmaWxlIjsgdGhlbgogCSAgICAgIGZ1bmNfd2FybmluZyAiXGAkbGliJyBoYXMgbm90IGJlZW4gaW5zdGFsbGVkIGluIFxgJGxpYmRpciciCiAJICAgICAgZmluYWxpemU9bm8KQEAgLTIyMDIsNyArMzE0Nyw3IEBACiAJCWZpbGU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKIAkgICAgICAgIG91dHB1dG5hbWU9IiR0bXBkaXIvJGZpbGUiCiAJICAgICAgICAjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCi0JICAgICAgICByZWxpbmtfY29tbWFuZD1gJEVDSE8gIlgkcmVsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0bmFtZSInJWcnYAorCSAgICAgICAgcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICIkcmVsaW5rX2NvbW1hbmQiIHwgJFNFRCAncyVAT1VUUFVUQCUnIiRvdXRwdXRuYW1lIiclZydgCiAKIAkgICAgICAgICRvcHRfc2lsZW50IHx8IHsKIAkgICAgICAgICAgZnVuY19xdW90ZV9mb3JfZXhwYW5kICIkcmVsaW5rX2NvbW1hbmQiCkBAIC0yMjIxLDcgKzMxNjYsNyBAQAogCSAgICB9CiAJICBlbHNlCiAJICAgICMgSW5zdGFsbCB0aGUgYmluYXJ5IHRoYXQgd2UgY29tcGlsZWQgZWFybGllci4KLQkgICAgZmlsZT1gJEVDSE8gIlgkZmlsZSRzdHJpcHBlZF9leHQiIHwgJFhzZWQgLWUgInMlXChbXi9dKlwpJCUkb2JqZGlyL1wxJSJgCisJICAgIGZpbGU9YCRFQ0hPICIkZmlsZSRzdHJpcHBlZF9leHQiIHwgJFNFRCAicyVcKFteL10qXCkkJSRvYmpkaXIvXDElImAKIAkgIGZpCiAJZmkKIApAQCAtMjI1NywxMSArMzIwMiwxMyBAQAogCiAgICAgICAjIFNldCB1cCB0aGUgcmFubGliIHBhcmFtZXRlcnMuCiAgICAgICBvbGRsaWI9IiRkZXN0ZGlyLyRuYW1lIgorICAgICAgZnVuY190b190b29sX2ZpbGUgIiRvbGRsaWIiIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisgICAgICB0b29sX29sZGxpYj0kZnVuY190b190b29sX2ZpbGVfcmVzdWx0CiAKICAgICAgIGZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9wcm9nIFwkZmlsZSBcJG9sZGxpYiIgJ2V4aXQgJD8nCiAKICAgICAgIGlmIHRlc3QgLW4gIiRzdHJpcG1lIiAmJiB0ZXN0IC1uICIkb2xkX3N0cmlwbGliIjsgdGhlbgotCWZ1bmNfc2hvd19ldmFsICIkb2xkX3N0cmlwbGliICRvbGRsaWIiICdleGl0ICQ/JworCWZ1bmNfc2hvd19ldmFsICIkb2xkX3N0cmlwbGliICR0b29sX29sZGxpYiIgJ2V4aXQgJD8nCiAgICAgICBmaQogCiAgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdGluc3RhbGwgY29tbWFuZHMuCkBAIC0yMjgwLDcgKzMyMjcsNyBAQAogICAgIGZpCiB9CiAKLXRlc3QgIiRtb2RlIiA9IGluc3RhbGwgJiYgZnVuY19tb2RlX2luc3RhbGwgJHsxKyIkQCJ9Cit0ZXN0ICIkb3B0X21vZGUiID0gaW5zdGFsbCAmJiBmdW5jX21vZGVfaW5zdGFsbCAkezErIiRAIn0KIAogCiAjIGZ1bmNfZ2VuZXJhdGVfZGxzeW1zIG91dHB1dG5hbWUgb3JpZ2luYXRvciBwaWNfcApAQCAtMjMyMyw2ICszMjcwLDIyIEBACiBleHRlcm4gXCJDXCIgewogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoKChfX0dOVUNfXyA9PSA0KSAmJiAoX19HTlVDX01JTk9SX18gPj0gNCkpIHx8IChfX0dOVUNfXyA+IDQpKQorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdzdHJpY3QtcHJvdG90eXBlc1wiCisjZW5kaWYKKworLyogS2VlcCB0aGlzIGNvZGUgaW4gc3luYyBiZXR3ZWVuIGxpYnRvb2wubTQsIGx0bWFpbiwgbHRfc3lzdGVtLmgsIGFuZCB0ZXN0cy4gICovCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfV0lOMzJfV0NFKQorLyogREFUQSBpbXBvcnRzIGZyb20gRExMcyBvbiBXSU4zMiBjb24ndCBiZSBjb25zdCwgYmVjYXVzZSBydW50aW1lCisgICByZWxvY2F0aW9ucyBhcmUgcGVyZm9ybWVkIC0tIHNlZSBsZCdzIGRvY3VtZW50YXRpb24gb24gcHNldWRvLXJlbG9jcy4gICovCisjIGRlZmluZSBMVF9ETFNZTV9DT05TVAorI2VsaWYgZGVmaW5lZChfX29zZl9fKQorLyogVGhpcyBzeXN0ZW0gZG9lcyBub3QgY29wZSB3ZWxsIHdpdGggcmVsb2NhdGlvbnMgaW4gY29uc3QgZGF0YS4gICovCisjIGRlZmluZSBMVF9ETFNZTV9DT05TVAorI2Vsc2UKKyMgZGVmaW5lIExUX0RMU1lNX0NPTlNUIGNvbnN0CisjZW5kaWYKKwogLyogRXh0ZXJuYWwgc3ltYm9sIGRlY2xhcmF0aW9ucyBmb3IgdGhlIGNvbXBpbGVyLiAqL1wKICIKIApAQCAtMjMzMiwxMCArMzI5NSwxMSBAQAogCSAgJG9wdF9kcnlfcnVuIHx8IGVjaG8gJzogQFBST0dSQU1AICcgPiAiJG5saXN0IgogCiAJICAjIEFkZCBvdXIgb3duIHByb2dyYW0gb2JqZWN0cyB0byB0aGUgc3ltYm9sIGxpc3QuCi0JICBwcm9nZmlsZXM9YCRFQ0hPICJYJG9ianMkb2xkX2RlcGxpYnMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKKwkgIHByb2dmaWxlcz1gJEVDSE8gIiRvYmpzJG9sZF9kZXBsaWJzIiB8ICRTUDJOTCB8ICRTRUQgIiRsbzJvIiB8ICROTDJTUGAKIAkgIGZvciBwcm9nZmlsZSBpbiAkcHJvZ2ZpbGVzOyBkbwotCSAgICBmdW5jX3ZlcmJvc2UgImV4dHJhY3RpbmcgZ2xvYmFsIEMgc3ltYm9scyBmcm9tIFxgJHByb2dmaWxlJyIKLQkgICAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgIiROTSAkcHJvZ2ZpbGUgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4+ICckbmxpc3QnIgorCSAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJHByb2dmaWxlIiBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorCSAgICBmdW5jX3ZlcmJvc2UgImV4dHJhY3RpbmcgZ2xvYmFsIEMgc3ltYm9scyBmcm9tIFxgJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCciCisJICAgICRvcHRfZHJ5X3J1biB8fCBldmFsICIkTk0gJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCiAJICBkb25lCiAKIAkgIGlmIHRlc3QgLW4gIiRleGNsdWRlX2V4cHN5bXMiOyB0aGVuCkBAIC0yMzcxLDcgKzMzMzUsNyBAQAogCSAgICAgIGV2YWwgJyRHUkVQIC1mICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5leHAiIDwgIiRubGlzdCIgPiAiJG5saXN0IlQnCiAJICAgICAgZXZhbCAnJE1WICIkbmxpc3QiVCAiJG5saXN0IicKIAkgICAgICBjYXNlICRob3N0IGluCi0JICAgICAgICAqY3lnd2luIHwgKm1pbmd3KiB8ICpjZWdjYyogKQorCSAgICAgICAgKmN5Z3dpbiogfCAqbWluZ3cqIHwgKmNlZ2NjKiApCiAJICAgICAgICAgIGV2YWwgImVjaG8gRVhQT1JUUyAiJz4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmRlZiInCiAJICAgICAgICAgIGV2YWwgJ2NhdCAiJG5saXN0IiA+PiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZGVmIicKIAkgICAgICAgICAgOzsKQEAgLTIzODQsMTAgKzMzNDgsNTIgQEAKIAkgIGZ1bmNfdmVyYm9zZSAiZXh0cmFjdGluZyBnbG9iYWwgQyBzeW1ib2xzIGZyb20gXGAkZGxwcmVmaWxlJyIKIAkgIGZ1bmNfYmFzZW5hbWUgIiRkbHByZWZpbGUiCiAJICBuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCi0JICAkb3B0X2RyeV9ydW4gfHwgewotCSAgICBldmFsICckRUNITyAiOiAkbmFtZSAiID4+ICIkbmxpc3QiJwotCSAgICBldmFsICIkTk0gJGRscHJlZmlsZSAyPi9kZXYvbnVsbCB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCi0JICB9CisgICAgICAgICAgY2FzZSAkaG9zdCBpbgorCSAgICAqY3lnd2luKiB8ICptaW5ndyogfCAqY2VnY2MqICkKKwkgICAgICAjIGlmIGFuIGltcG9ydCBsaWJyYXJ5LCB3ZSBuZWVkIHRvIG9idGFpbiBkbG5hbWUKKwkgICAgICBpZiBmdW5jX3dpbjMyX2ltcG9ydF9saWJfcCAiJGRscHJlZmlsZSI7IHRoZW4KKwkgICAgICAgIGZ1bmNfdHJfc2ggIiRkbHByZWZpbGUiCisJICAgICAgICBldmFsICJjdXJyX2xhZmlsZT1cJGxpYmZpbGVfJGZ1bmNfdHJfc2hfcmVzdWx0IgorCSAgICAgICAgZGxwcmVmaWxlX2RsYmFzZW5hbWU9IiIKKwkgICAgICAgIGlmIHRlc3QgLW4gIiRjdXJyX2xhZmlsZSIgJiYgZnVuY19sYWxpYl9wICIkY3Vycl9sYWZpbGUiOyB0aGVuCisJICAgICAgICAgICMgVXNlIHN1YnNoZWxsLCB0byBhdm9pZCBjbG9iYmVyaW5nIGN1cnJlbnQgdmFyaWFibGUgdmFsdWVzCisJICAgICAgICAgIGRscHJlZmlsZV9kbG5hbWU9YHNvdXJjZSAiJGN1cnJfbGFmaWxlIiAmJiBlY2hvICIkZGxuYW1lImAKKwkgICAgICAgICAgaWYgdGVzdCAtbiAiJGRscHJlZmlsZV9kbG5hbWUiIDsgdGhlbgorCSAgICAgICAgICAgIGZ1bmNfYmFzZW5hbWUgIiRkbHByZWZpbGVfZGxuYW1lIgorCSAgICAgICAgICAgIGRscHJlZmlsZV9kbGJhc2VuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJICAgICAgICAgIGVsc2UKKwkgICAgICAgICAgICAjIG5vIGxhZmlsZS4gdXNlciBleHBsaWNpdGx5IHJlcXVlc3RlZCAtZGxwcmVvcGVuIDxpbXBvcnQgbGlicmFyeT4uCisJICAgICAgICAgICAgJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kICIkZGxwcmVmaWxlIgorCSAgICAgICAgICAgIGRscHJlZmlsZV9kbGJhc2VuYW1lPSRzaGFyZWRsaWJfZnJvbV9saW5rbGliX3Jlc3VsdAorCSAgICAgICAgICBmaQorCSAgICAgICAgZmkKKwkgICAgICAgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgICAgICAgIGlmIHRlc3QgLW4gIiRkbHByZWZpbGVfZGxiYXNlbmFtZSIgOyB0aGVuCisJICAgICAgICAgICAgZXZhbCAnJEVDSE8gIjogJGRscHJlZmlsZV9kbGJhc2VuYW1lIiA+PiAiJG5saXN0IicKKwkgICAgICAgICAgZWxzZQorCSAgICAgICAgICAgIGZ1bmNfd2FybmluZyAiQ291bGQgbm90IGNvbXB1dGUgRExMIG5hbWUgZnJvbSAkbmFtZSIKKwkgICAgICAgICAgICBldmFsICckRUNITyAiOiAkbmFtZSAiID4+ICIkbmxpc3QiJworCSAgICAgICAgICBmaQorCSAgICAgICAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJGRscHJlZmlsZSIgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKwkgICAgICAgICAgZXZhbCAiJE5NIFwiJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdFwiIDI+L2Rldi9udWxsIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8CisJICAgICAgICAgICAgJFNFRCAtZSAnL0kgX19pbXAvZCcgLWUgJ3MvSSBfX25tXy9EIC87cy9fbm1fXy8vJyA+PiAnJG5saXN0JyIKKwkgICAgICAgIH0KKwkgICAgICBlbHNlICMgbm90IGFuIGltcG9ydCBsaWIKKwkgICAgICAgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgICAgICAgIGV2YWwgJyRFQ0hPICI6ICRuYW1lICIgPj4gIiRubGlzdCInCisJICAgICAgICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkZGxwcmVmaWxlIiBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorCSAgICAgICAgICBldmFsICIkTk0gXCIkZnVuY190b190b29sX2ZpbGVfcmVzdWx0XCIgMj4vZGV2L251bGwgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4+ICckbmxpc3QnIgorCSAgICAgICAgfQorCSAgICAgIGZpCisJICAgIDs7CisJICAgICopCisJICAgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICAgIGV2YWwgJyRFQ0hPICI6ICRuYW1lICIgPj4gIiRubGlzdCInCisJICAgICAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJGRscHJlZmlsZSIgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKwkgICAgICAgIGV2YWwgIiROTSBcIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHRcIiAyPi9kZXYvbnVsbCB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCisJICAgICAgfQorCSAgICA7OworICAgICAgICAgIGVzYWMKIAlkb25lCiAKIAkkb3B0X2RyeV9ydW4gfHwgewpAQCAtMjQxNSwzNiArMzQyMSwxOSBAQAogCSAgaWYgdGVzdCAtZiAiJG5saXN0IlM7IHRoZW4KIAkgICAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiUyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyInCiAJICBlbHNlCi0JICAgICRFQ0hPICcvKiBOT05FICovJyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIKKwkgICAgZWNobyAnLyogTk9ORSAqLycgPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiCiAJICBmaQogCi0JICAkRUNITyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIlwKKwkgIGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiICJcCiAKIC8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAgKi8KIHR5cGVkZWYgc3RydWN0IHsKICAgY29uc3QgY2hhciAqbmFtZTsKICAgdm9pZCAqYWRkcmVzczsKIH0gbHRfZGxzeW1saXN0OwotIgotCSAgY2FzZSAkaG9zdCBpbgotCSAgKmN5Z3dpbiogfCAqbWluZ3cqIHwgKmNlZ2NjKiApCi0JICAgICRFQ0hPID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIiAiXAotLyogREFUQSBpbXBvcnRzIGZyb20gRExMcyBvbiBXSU4zMiBjb24ndCBiZSBjb25zdCwgYmVjYXVzZQotICAgcnVudGltZSByZWxvY2F0aW9ucyBhcmUgcGVyZm9ybWVkIC0tIHNlZSBsZCdzIGRvY3VtZW50YXRpb24KLSAgIG9uIHBzZXVkby1yZWxvY3MuICAqLyIKLQkgICAgbHRfZGxzeW1fY29uc3Q9IDs7Ci0JICAqb3NmNSopCi0JICAgIGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiICJcCi0vKiBUaGlzIHN5c3RlbSBkb2VzIG5vdCBjb3BlIHdlbGwgd2l0aCByZWxvY2F0aW9ucyBpbiBjb25zdCBkYXRhICovIgotCSAgICBsdF9kbHN5bV9jb25zdD0gOzsKLQkgICopCi0JICAgIGx0X2Rsc3ltX2NvbnN0PWNvbnN0IDs7Ci0JICBlc2FjCi0KLQkgICRFQ0hPID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIiAiXAotZXh0ZXJuICRsdF9kbHN5bV9jb25zdCBsdF9kbHN5bWxpc3QKK2V4dGVybiBMVF9ETFNZTV9DT05TVCBsdF9kbHN5bWxpc3QKIGx0XyR7bXlfcHJlZml4fV9MVFhfcHJlbG9hZGVkX3N5bWJvbHNbXTsKLSRsdF9kbHN5bV9jb25zdCBsdF9kbHN5bWxpc3QKK0xUX0RMU1lNX0NPTlNUIGx0X2Rsc3ltbGlzdAogbHRfJHtteV9wcmVmaXh9X0xUWF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KIHtcCiAgIHsgXCIkbXlfb3JpZ2luYXRvclwiLCAodm9pZCAqKSAwIH0sIgpAQCAtMjQ1Nyw3ICszNDQ2LDcgQEAKIAkgICAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeCIgPCAiJG5saXN0IiA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIKIAkgICAgOzsKIAkgIGVzYWMKLQkgICRFQ0hPID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIiAiXAorCSAgZWNobyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIlwKICAgezAsICh2b2lkICopIDB9CiB9OwogCkBAIC0yNDg0LDcgKzM0NzMsNyBAQAogCSAgIyBsaW5rZWQgYmVmb3JlIGFueSBvdGhlciBQSUMgb2JqZWN0LiAgQnV0IHdlIG11c3Qgbm90IHVzZQogCSAgIyBwaWNfZmxhZyB3aGVuIGxpbmtpbmcgd2l0aCAtc3RhdGljLiAgVGhlIHByb2JsZW0gZXhpc3RzIGluCiAJICAjIEZyZWVCU0QgMi4yLjYgYW5kIGlzIGZpeGVkIGluIEZyZWVCU0QgMy4xLgotCSAgKi0qLWZyZWVic2QyKnwqLSotZnJlZWJzZDMuMCp8Ki0qLWZyZWVic2RlbGYzLjAqKQorCSAgKi0qLWZyZWVic2QyLip8Ki0qLWZyZWVic2QzLjAqfCotKi1mcmVlYnNkZWxmMy4wKikKIAkgICAgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPSIgJHBpY19mbGFnIC1ERlJFRUJTRF9XT1JLQVJPVU5EIiA7OwogCSAgKi0qLWhwdXgqKQogCSAgICBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9IiAkcGljX2ZsYWciICA7OwpAQCAtMjUwMCw3ICszNDg5LDcgQEAKIAlmb3IgYXJnIGluICRMVENGTEFHUzsgZG8KIAkgIGNhc2UgJGFyZyBpbgogCSAgLXBpZSB8IC1mcGllIHwgLWZQSUUpIDs7Ci0JICAqKSBzeW10YWJfY2ZsYWdzPSIkc3ltdGFiX2NmbGFncyAkYXJnIiA7OworCSAgKikgZnVuY19hcHBlbmQgc3ltdGFiX2NmbGFncyAiICRhcmciIDs7CiAJICBlc2FjCiAJZG9uZQogCkBAIC0yNTE1LDE2ICszNTA0LDE2IEBACiAJY2FzZSAkaG9zdCBpbgogCSpjeWd3aW4qIHwgKm1pbmd3KiB8ICpjZWdjYyogKQogCSAgaWYgdGVzdCAtZiAiJG91dHB1dF9vYmpkaXIvJG15X291dHB1dG5hbWUuZGVmIjsgdGhlbgotCSAgICBjb21waWxlX2NvbW1hbmQ9YCRFQ0hPICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJG91dHB1dF9vYmpkaXIvJG15X291dHB1dG5hbWUuZGVmICRzeW1maWxlb2JqJSJgCi0JICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRFQ0hPICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyRteV9vdXRwdXRuYW1lLmRlZiAkc3ltZmlsZW9iaiUiYAorCSAgICBjb21waWxlX2NvbW1hbmQ9YCRFQ0hPICIkY29tcGlsZV9jb21tYW5kIiB8ICRTRUQgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyRteV9vdXRwdXRuYW1lLmRlZiAkc3ltZmlsZW9iaiUiYAorCSAgICBmaW5hbGl6ZV9jb21tYW5kPWAkRUNITyAiJGZpbmFsaXplX2NvbW1hbmQiIHwgJFNFRCAicyVAU1lNRklMRUAlJG91dHB1dF9vYmpkaXIvJG15X291dHB1dG5hbWUuZGVmICRzeW1maWxlb2JqJSJgCiAJICBlbHNlCi0JICAgIGNvbXBpbGVfY29tbWFuZD1gJEVDSE8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkc3ltZmlsZW9iaiUiYAotCSAgICBmaW5hbGl6ZV9jb21tYW5kPWAkRUNITyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkc3ltZmlsZW9iaiUiYAorCSAgICBjb21waWxlX2NvbW1hbmQ9YCRFQ0hPICIkY29tcGlsZV9jb21tYW5kIiB8ICRTRUQgInMlQFNZTUZJTEVAJSRzeW1maWxlb2JqJSJgCisJICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRFQ0hPICIkZmluYWxpemVfY29tbWFuZCIgfCAkU0VEICJzJUBTWU1GSUxFQCUkc3ltZmlsZW9iaiUiYAogCSAgZmkKIAkgIDs7CiAJKikKLQkgIGNvbXBpbGVfY29tbWFuZD1gJEVDSE8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkc3ltZmlsZW9iaiUiYAotCSAgZmluYWxpemVfY29tbWFuZD1gJEVDSE8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJHN5bWZpbGVvYmolImAKKwkgIGNvbXBpbGVfY29tbWFuZD1gJEVDSE8gIiRjb21waWxlX2NvbW1hbmQiIHwgJFNFRCAicyVAU1lNRklMRUAlJHN5bWZpbGVvYmolImAKKwkgIGZpbmFsaXplX2NvbW1hbmQ9YCRFQ0hPICIkZmluYWxpemVfY29tbWFuZCIgfCAkU0VEICJzJUBTWU1GSUxFQCUkc3ltZmlsZW9iaiUiYAogCSAgOzsKIAllc2FjCiAJOzsKQEAgLTI1MzgsOCArMzUyNyw4IEBACiAgICAgICAjIHJlYWxseSB3YXMgcmVxdWlyZWQuCiAKICAgICAgICMgTnVsbGlmeSB0aGUgc3ltYm9sIGZpbGUuCi0gICAgICBjb21waWxlX2NvbW1hbmQ9YCRFQ0hPICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAotICAgICAgZmluYWxpemVfY29tbWFuZD1gJEVDSE8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAorICAgICAgY29tcGlsZV9jb21tYW5kPWAkRUNITyAiJGNvbXBpbGVfY29tbWFuZCIgfCAkU0VEICJzJSBAU1lNRklMRUAlJSJgCisgICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkRUNITyAiJGZpbmFsaXplX2NvbW1hbmQiIHwgJFNFRCAicyUgQFNZTUZJTEVAJSUiYAogICAgIGZpCiB9CiAKQEAgLTI1NDksNiArMzUzOCw3IEBACiAjIE5lZWQgYSBsb3Qgb2YgZ29vIHRvIGhhbmRsZSAqYm90aCogRExMcyBhbmQgaW1wb3J0IGxpYnMKICMgSGFzIHRvIGJlIGEgc2hlbGwgZnVuY3Rpb24gaW4gb3JkZXIgdG8gJ2VhdCcgdGhlIGFyZ3VtZW50CiAjIHRoYXQgaXMgc3VwcGxpZWQgd2hlbiAkZmlsZV9tYWdpY19jb21tYW5kIGlzIGNhbGxlZC4KKyMgRGVzcGl0ZSB0aGUgbmFtZSwgYWxzbyBkZWFsIHdpdGggNjQgYml0IGJpbmFyaWVzLgogZnVuY193aW4zMl9saWJpZCAoKQogewogICAkb3B0X2RlYnVnCkBAIC0yNTU5LDkgKzM1NDksMTEgQEAKICAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgYXJjaGl2ZSBpbXBvcnQiCiAgICAgOzsKICAgKmFyXCBhcmNoaXZlKikgIyBjb3VsZCBiZSBhbiBpbXBvcnQsIG9yIHN0YXRpYworICAgICMgS2VlcCB0aGUgZWdyZXAgcGF0dGVybiBpbiBzeW5jIHdpdGggdGhlIG9uZSBpbiBfTFRfQ0hFQ0tfTUFHSUNfTUVUSE9ELgogICAgIGlmIGV2YWwgJE9CSkRVTVAgLWYgJDEgfCAkU0VEIC1lICcxMHEnIDI+L2Rldi9udWxsIHwKLSAgICAgICAkRUdSRVAgJ2ZpbGUgZm9ybWF0IHBlLWkzODYoLiphcmNoaXRlY3R1cmU6IGkzODYpPycgPi9kZXYvbnVsbCA7IHRoZW4KLSAgICAgIHdpbjMyX25tcmVzPWBldmFsICROTSAtZiBwb3NpeCAtQSAkMSB8CisgICAgICAgJEVHUkVQICdmaWxlIGZvcm1hdCAocGVpKi1pMzg2KC4qYXJjaGl0ZWN0dXJlOiBpMzg2KT98cGUtYXJtLXdpbmNlfHBlLXg4Ni02NCknID4vZGV2L251bGw7IHRoZW4KKyAgICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkMSIgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKyAgICAgIHdpbjMyX25tcmVzPWBldmFsICROTSAtZiBwb3NpeCAtQSBcIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHRcIiB8CiAJJFNFRCAtbiAtZSAnCiAJICAgIDEsMTAwewogCQkvIEkgL3sKQEAgLTI1OTAsNiArMzU4MiwxMzEgQEAKICAgJEVDSE8gIiR3aW4zMl9saWJpZF90eXBlIgogfQogCisjIGZ1bmNfY3lnbWluZ19kbGxfZm9yX2ltcGxpYiBBUkcKKyMKKyMgUGxhdGZvcm0tc3BlY2lmaWMgZnVuY3Rpb24gdG8gZXh0cmFjdCB0aGUKKyMgbmFtZSBvZiB0aGUgRExMIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkCisjIGltcG9ydCBsaWJyYXJ5IEFSRy4KKyMgSW52b2tlZCBieSBldmFsJ2luZyB0aGUgbGlidG9vbCB2YXJpYWJsZQorIyAgICAkc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQKKyMgUmVzdWx0IGlzIGF2YWlsYWJsZSBpbiB0aGUgdmFyaWFibGUKKyMgICAgJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfcmVzdWx0CitmdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBzaGFyZWRsaWJfZnJvbV9saW5rbGliX3Jlc3VsdD1gJERMTFRPT0wgLS1pZGVudGlmeS1zdHJpY3QgLS1pZGVudGlmeSAiJDEiYAorfQorCisjIGZ1bmNfY3lnbWluZ19kbGxfZm9yX2ltcGxpYl9mYWxsYmFja19jb3JlIFNFQ1RJT05fTkFNRSBMSUJOQU1FcworIworIyBUaGUgaXMgdGhlIGNvcmUgb2YgYSBmYWxsYmFjayBpbXBsZW1lbnRhdGlvbiBvZiBhCisjIHBsYXRmb3JtLXNwZWNpZmljIGZ1bmN0aW9uIHRvIGV4dHJhY3QgdGhlIG5hbWUgb2YgdGhlCisjIERMTCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBpbXBvcnQgbGlicmFyeSBMSUJOQU1FLgorIworIyBTRUNUSU9OX05BTUUgaXMgZWl0aGVyIC5pZGF0YSQ2IG9yIC5pZGF0YSQ3LCBkZXBlbmRpbmcKKyMgb24gdGhlIHBsYXRmb3JtIGFuZCBjb21waWxlciB0aGF0IGNyZWF0ZWQgdGhlIGltcGxpYi4KKyMKKyMgRWNob3MgdGhlIG5hbWUgb2YgdGhlIERMTCBhc3NvY2lhdGVkIHdpdGggdGhlCisjIHNwZWNpZmllZCBpbXBvcnQgbGlicmFyeS4KK2Z1bmNfY3lnbWluZ19kbGxfZm9yX2ltcGxpYl9mYWxsYmFja19jb3JlICgpCit7CisgICRvcHRfZGVidWcKKyAgbWF0Y2hfbGl0ZXJhbD1gJEVDSE8gIiQxIiB8ICRTRUQgIiRzZWRfbWFrZV9saXRlcmFsX3JlZ2V4ImAKKyAgJE9CSkRVTVAgLXMgLS1zZWN0aW9uICIkMSIgIiQyIiAyPi9kZXYvbnVsbCB8CisgICAgJFNFRCAnL15Db250ZW50cyBvZiBzZWN0aW9uICciJG1hdGNoX2xpdGVyYWwiJzoveworICAgICAgIyBQbGFjZSBtYXJrZXIgYXQgYmVnaW5uaW5nIG9mIGFyY2hpdmUgbWVtYmVyIGRsbG5hbWUgc2VjdGlvbgorICAgICAgcy8uKi89PT09TUFSSz09PT0vCisgICAgICBwCisgICAgICBkCisgICAgfQorICAgICMgVGhlc2UgbGluZXMgY2FuIHNvbWV0aW1lcyBiZSBsb25nZXIgdGhhbiA0MyBjaGFyYWN0ZXJzLCBidXQKKyAgICAjIGFyZSBhbHdheXMgdW5pbnRlcmVzdGluZworICAgIC86WwkgXSpmaWxlIGZvcm1hdCBwZVtpXVx7LDFcfS0vZAorICAgIC9eSW4gYXJjaGl2ZSBbXjpdKjovZAorICAgICMgRW5zdXJlIG1hcmtlciBpcyBwcmludGVkCisgICAgL149PT09TUFSSz09PT0vcAorICAgICMgUmVtb3ZlIGFsbCBsaW5lcyB3aXRoIGxlc3MgdGhhbiA0MyBjaGFyYWN0ZXJzCisgICAgL14uXHs0M1x9LyFkCisgICAgIyBGcm9tIHJlbWFpbmluZyBsaW5lcywgcmVtb3ZlIGZpcnN0IDQzIGNoYXJhY3RlcnMKKyAgICBzL14uXHs0M1x9Ly8nIHwKKyAgICAkU0VEIC1uICcKKyAgICAgICMgSm9pbiBtYXJrZXIgYW5kIGFsbCBsaW5lcyB1bnRpbCBuZXh0IG1hcmtlciBpbnRvIGEgc2luZ2xlIGxpbmUKKyAgICAgIC9ePT09PU1BUks9PT09LyBiIHBhcmEKKyAgICAgIEgKKyAgICAgICQgYiBwYXJhCisgICAgICBiCisgICAgICA6cGFyYQorICAgICAgeAorICAgICAgcy9cbi8vZworICAgICAgIyBSZW1vdmUgdGhlIG1hcmtlcgorICAgICAgcy9ePT09PU1BUks9PT09Ly8KKyAgICAgICMgUmVtb3ZlIHRyYWlsaW5nIGRvdHMgYW5kIHdoaXRlc3BhY2UKKyAgICAgIHMvW1wuIFx0XSokLy8KKyAgICAgICMgUHJpbnQKKyAgICAgIC8uL3AnIHwKKyAgICAjIHdlIG5vdyBoYXZlIGEgbGlzdCwgb25lIGVudHJ5IHBlciBsaW5lLCBvZiB0aGUgc3RyaW5naWZpZWQKKyAgICAjIGNvbnRlbnRzIG9mIHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9uIG9mIGFsbCBtZW1iZXJzIG9mIHRoZQorICAgICMgYXJjaGl2ZSB3aGljaCBwb3NzZXNzIHRoYXQgc2VjdGlvbi4gSGV1cmlzdGljOiBlbGltaW5hdGUKKyAgICAjIGFsbCB0aG9zZSB3aGljaCBoYXZlIGEgZmlyc3Qgb3Igc2Vjb25kIGNoYXJhY3RlciB0aGF0IGlzCisgICAgIyBhICcuJyAodGhhdCBpcywgb2JqZHVtcCdzIHJlcHJlc2VudGF0aW9uIG9mIGFuIHVucHJpbnRhYmxlCisgICAgIyBjaGFyYWN0ZXIuKSBUaGlzIHNob3VsZCB3b3JrIGZvciBhbGwgYXJjaGl2ZXMgd2l0aCBsZXNzIHRoYW4KKyAgICAjIDB4MzAyZiBleHBvcnRzIC0tIGJ1dCB3aWxsIGZhaWwgZm9yIERMTHMgd2hvc2UgbmFtZSBhY3R1YWxseQorICAgICMgYmVnaW5zIHdpdGggYSBsaXRlcmFsICcuJyBvciBhIHNpbmdsZSBjaGFyYWN0ZXIgZm9sbG93ZWQgYnkKKyAgICAjIGEgJy4nLgorICAgICMKKyAgICAjIE9mIHRob3NlIHRoYXQgcmVtYWluLCBwcmludCB0aGUgZmlyc3Qgb25lLgorICAgICRTRUQgLWUgJy9eXC4vZDsvXi5cLi9kO3EnCit9CisKKyMgZnVuY19jeWdtaW5nX2dudV9pbXBsaWJfcCBBUkcKKyMgVGhpcyBwcmVkaWNhdGUgcmV0dXJucyB3aXRoIHplcm8gc3RhdHVzIChUUlVFKSBpZgorIyBBUkcgaXMgYSBHTlUvYmludXRpbHMtc3R5bGUgaW1wb3J0IGxpYnJhcnkuIFJldHVybnMKKyMgd2l0aCBub256ZXJvIHN0YXR1cyAoRkFMU0UpIG90aGVyd2lzZS4KK2Z1bmNfY3lnbWluZ19nbnVfaW1wbGliX3AgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX3Rvb2xfZmlsZSAiJDEiIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisgIGZ1bmNfY3lnbWluZ19nbnVfaW1wbGliX3RtcD1gJE5NICIkZnVuY190b190b29sX2ZpbGVfcmVzdWx0IiB8IGV2YWwgIiRnbG9iYWxfc3ltYm9sX3BpcGUiIHwgJEVHUkVQICcgKF9oZWFkX1tBLVphLXowLTlfXStfW2FkXWwqfFtBLVphLXowLTlfXStfW2FkXWwqX2luYW1lKSQnYAorICB0ZXN0IC1uICIkZnVuY19jeWdtaW5nX2dudV9pbXBsaWJfdG1wIgorfQorCisjIGZ1bmNfY3lnbWluZ19tc19pbXBsaWJfcCBBUkcKKyMgVGhpcyBwcmVkaWNhdGUgcmV0dXJucyB3aXRoIHplcm8gc3RhdHVzIChUUlVFKSBpZgorIyBBUkcgaXMgYW4gTVMtc3R5bGUgaW1wb3J0IGxpYnJhcnkuIFJldHVybnMKKyMgd2l0aCBub256ZXJvIHN0YXR1cyAoRkFMU0UpIG90aGVyd2lzZS4KK2Z1bmNfY3lnbWluZ19tc19pbXBsaWJfcCAoKQoreworICAkb3B0X2RlYnVnCisgIGZ1bmNfdG9fdG9vbF9maWxlICIkMSIgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKyAgZnVuY19jeWdtaW5nX21zX2ltcGxpYl90bXA9YCROTSAiJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCIgfCBldmFsICIkZ2xvYmFsX3N5bWJvbF9waXBlIiB8ICRHUkVQICdfTlVMTF9JTVBPUlRfREVTQ1JJUFRPUidgCisgIHRlc3QgLW4gIiRmdW5jX2N5Z21pbmdfbXNfaW1wbGliX3RtcCIKK30KKworIyBmdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWJfZmFsbGJhY2sgQVJHCisjIFBsYXRmb3JtLXNwZWNpZmljIGZ1bmN0aW9uIHRvIGV4dHJhY3QgdGhlCisjIG5hbWUgb2YgdGhlIERMTCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZAorIyBpbXBvcnQgbGlicmFyeSBBUkcuCisjCisjIFRoaXMgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gaXMgZm9yIHVzZSB3aGVuICRETExUT09MCisjIGRvZXMgbm90IHN1cHBvcnQgdGhlIC0taWRlbnRpZnktc3RyaWN0IG9wdGlvbi4KKyMgSW52b2tlZCBieSBldmFsJ2luZyB0aGUgbGlidG9vbCB2YXJpYWJsZQorIyAgICAkc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQKKyMgUmVzdWx0IGlzIGF2YWlsYWJsZSBpbiB0aGUgdmFyaWFibGUKKyMgICAgJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfcmVzdWx0CitmdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWJfZmFsbGJhY2sgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBpZiBmdW5jX2N5Z21pbmdfZ251X2ltcGxpYl9wICIkMSIgOyB0aGVuCisgICAgIyBiaW51dGlscyBpbXBvcnQgbGlicmFyeQorICAgIHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfcmVzdWx0PWBmdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWJfZmFsbGJhY2tfY29yZSAnLmlkYXRhJDcnICIkMSJgCisgIGVsaWYgZnVuY19jeWdtaW5nX21zX2ltcGxpYl9wICIkMSIgOyB0aGVuCisgICAgIyBtcy1nZW5lcmF0ZWQgaW1wb3J0IGxpYnJhcnkKKyAgICBzaGFyZWRsaWJfZnJvbV9saW5rbGliX3Jlc3VsdD1gZnVuY19jeWdtaW5nX2RsbF9mb3JfaW1wbGliX2ZhbGxiYWNrX2NvcmUgJy5pZGF0YSQ2JyAiJDEiYAorICBlbHNlCisgICAgIyB1bmtub3duCisgICAgc2hhcmVkbGliX2Zyb21fbGlua2xpYl9yZXN1bHQ9IiIKKyAgZmkKK30KIAogCiAjIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlIGRpciBvbGRsaWIKQEAgLTI1OTgsNyArMzcxNSwxOCBAQAogICAgICRvcHRfZGVidWcKICAgICBmX2V4X2FuX2FyX2Rpcj0iJDEiOyBzaGlmdAogICAgIGZfZXhfYW5fYXJfb2xkbGliPSIkMSIKLSAgICBmdW5jX3Nob3dfZXZhbCAiKGNkIFwkZl9leF9hbl9hcl9kaXIgJiYgJEFSIHggXCJcJGZfZXhfYW5fYXJfb2xkbGliXCIpIiAnZXhpdCAkPycKKyAgICBpZiB0ZXN0ICIkbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uIiA9IHllczsgdGhlbgorICAgICAgbG9ja2ZpbGU9JGZfZXhfYW5fYXJfb2xkbGliLmxvY2sKKyAgICAgIHVudGlsICRvcHRfZHJ5X3J1biB8fCBsbiAiJHByb2dwYXRoIiAiJGxvY2tmaWxlIiAyPi9kZXYvbnVsbDsgZG8KKwlmdW5jX2VjaG8gIldhaXRpbmcgZm9yICRsb2NrZmlsZSB0byBiZSByZW1vdmVkIgorCXNsZWVwIDIKKyAgICAgIGRvbmUKKyAgICBmaQorICAgIGZ1bmNfc2hvd19ldmFsICIoY2QgXCRmX2V4X2FuX2FyX2RpciAmJiAkQVIgeCBcIlwkZl9leF9hbl9hcl9vbGRsaWJcIikiIFwKKwkJICAgJ3N0YXQ9JD87IHJtIC1mICIkbG9ja2ZpbGUiOyBleGl0ICRzdGF0JworICAgIGlmIHRlc3QgIiRsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb24iID0geWVzOyB0aGVuCisgICAgICAkb3B0X2RyeV9ydW4gfHwgcm0gLWYgIiRsb2NrZmlsZSIKKyAgICBmaQogICAgIGlmICgkQVIgdCAiJGZfZXhfYW5fYXJfb2xkbGliIiB8IHNvcnQgfCBzb3J0IC11YyA+L2Rldi9udWxsIDI+JjEpOyB0aGVuCiAgICAgIDoKICAgICBlbHNlCkBAIC0yNjY5LDcgKzM3OTcsNyBAQAogCSAgICBkYXJ3aW5fZmlsZT0KIAkgICAgZGFyd2luX2ZpbGVzPQogCSAgICBmb3IgZGFyd2luX2ZpbGUgaW4gJGRhcndpbl9maWxlbGlzdDsgZG8KLQkgICAgICBkYXJ3aW5fZmlsZXM9YGZpbmQgdW5mYXQtJCQgLW5hbWUgJGRhcndpbl9maWxlIC1wcmludCB8ICROTDJTUGAKKwkgICAgICBkYXJ3aW5fZmlsZXM9YGZpbmQgdW5mYXQtJCQgLW5hbWUgJGRhcndpbl9maWxlIC1wcmludCB8IHNvcnQgfCAkTkwyU1BgCiAJICAgICAgJExJUE8gLWNyZWF0ZSAtb3V0cHV0ICIkZGFyd2luX2ZpbGUiICRkYXJ3aW5fZmlsZXMKIAkgICAgZG9uZSAjICRkYXJ3aW5fZmlsZWxpc3QKIAkgICAgJFJNIC1yZiB1bmZhdC0kJApAQCAtMjY4NCwyNSArMzgxMiwzMCBAQAogICAgICAgICBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAiJG15X3hkaXIiICIkbXlfeGFicyIKIAk7OwogICAgICAgZXNhYwotICAgICAgbXlfb2xkb2Jqcz0iJG15X29sZG9ianMgImBmaW5kICRteV94ZGlyIC1uYW1lIFwqLiRvYmpleHQgLXByaW50IC1vIC1uYW1lIFwqLmxvIC1wcmludCB8ICROTDJTUGAKKyAgICAgIG15X29sZG9ianM9IiRteV9vbGRvYmpzICJgZmluZCAkbXlfeGRpciAtbmFtZSBcKi4kb2JqZXh0IC1wcmludCAtbyAtbmFtZSBcKi5sbyAtcHJpbnQgfCBzb3J0IHwgJE5MMlNQYAogICAgIGRvbmUKIAogICAgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQ9IiRteV9vbGRvYmpzIgogfQogCiAKLQotIyBmdW5jX2VtaXRfd3JhcHBlcl9wYXJ0MSBbYXJnPW5vXQorIyBmdW5jX2VtaXRfd3JhcHBlciBbYXJnPW5vXQogIwotIyBFbWl0IHRoZSBmaXJzdCBwYXJ0IG9mIGEgbGlidG9vbCB3cmFwcGVyIHNjcmlwdCBvbiBzdGRvdXQuCi0jIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIGRlc2NyaXB0aW9uIGFzc29jaWF0ZWQgd2l0aAotIyBmdW5jX2VtaXRfd3JhcHBlcigpLCBiZWxvdy4KLWZ1bmNfZW1pdF93cmFwcGVyX3BhcnQxICgpCisjIEVtaXQgYSBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0IG9uIHN0ZG91dC4KKyMgRG9uJ3QgZGlyZWN0bHkgb3BlbiBhIGZpbGUgYmVjYXVzZSB3ZSBtYXkgd2FudCB0bworIyBpbmNvcnBvcmF0ZSB0aGUgc2NyaXB0IGNvbnRlbnRzIHdpdGhpbiBhIGN5Z3dpbi9taW5ndworIyB3cmFwcGVyIGV4ZWN1dGFibGUuICBNdXN0IE9OTFkgYmUgY2FsbGVkIGZyb20gd2l0aGluCisjIGZ1bmNfbW9kZV9saW5rIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBhIG51bWJlciBvZiB2YXJpYWJsZXMKKyMgc2V0IHRoZXJlaW4uCisjCisjIEFSRyBpcyB0aGUgdmFsdWUgdGhhdCB0aGUgV1JBUFBFUl9TQ1JJUFRfQkVMT05HU19JTl9PQkpESVIKKyMgdmFyaWFibGUgd2lsbCB0YWtlLiAgSWYgJ3llcycsIHRoZW4gdGhlIGVtaXR0ZWQgc2NyaXB0CisjIHdpbGwgYXNzdW1lIHRoYXQgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBpdCBpcyBzdG9yZWQgaXMKKyMgdGhlICRvYmpkaXIgZGlyZWN0b3J5LiAgVGhpcyBpcyBhIGN5Z3dpbi9taW5ndy1zcGVjaWZpYworIyBiZWhhdmlvci4KK2Z1bmNfZW1pdF93cmFwcGVyICgpCiB7Ci0JZnVuY19lbWl0X3dyYXBwZXJfcGFydDFfYXJnMT1ubwotCWlmIHRlc3QgLW4gIiQxIiA7IHRoZW4KLQkgIGZ1bmNfZW1pdF93cmFwcGVyX3BhcnQxX2FyZzE9JDEKLQlmaQorCWZ1bmNfZW1pdF93cmFwcGVyX2FyZzE9JHsxLW5vfQogCiAJJEVDSE8gIlwKICMhICRTSEVMTApAQCAtMjcxOCw3ICszODUxLDYgQEAKIAogIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcwogIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KLVhzZWQ9JyR7U0VEfSAtZSAxcy9eWC8vJwogc2VkX3F1b3RlX3N1YnN0PSckc2VkX3F1b3RlX3N1YnN0JwogCiAjIEJlIEJvdXJuZSBjb21wYXRpYmxlCkBAIC0yNzQ5LDMxICszODgxLDEzNSBAQAogZWxzZQogICAjIFdoZW4gd2UgYXJlIHNvdXJjZWQgaW4gZXhlY3V0ZSBtb2RlLCBcJGZpbGUgYW5kIFwkRUNITyBhcmUgYWxyZWFkeSBzZXQuCiAgIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KLSAgICBFQ0hPPVwiJHFlY2hvXCIKLSAgICBmaWxlPVwiXCQwXCIKLSAgICAjIE1ha2Ugc3VyZSBlY2hvIHdvcmtzLgotICAgIGlmIHRlc3QgXCJYXCQxXCIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KLSAgICAgICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgotICAgICAgc2hpZnQKLSAgICBlbGlmIHRlc3QgXCJYXGB7IFwkRUNITyAnXHQnOyB9IDI+L2Rldi9udWxsXGBcIiA9ICdYXHQnOyB0aGVuCi0gICAgICAjIFlpcHBlZSwgXCRFQ0hPIHdvcmtzIQotICAgICAgOgotICAgIGVsc2UKLSAgICAgICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbCwgYW5kIHRoZW4gbWF5YmUgXCRFQ0hPIHdpbGwgd29yay4KLSAgICAgIGV4ZWMgJFNIRUxMIFwiXCQwXCIgLS1uby1yZWV4ZWMgXCR7MStcIlwkQFwifQotICAgIGZpCi0gIGZpXAorICAgIGZpbGU9XCJcJDBcIiIKKworICAgIHFFQ0hPPWAkRUNITyAiJEVDSE8iIHwgJFNFRCAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgJEVDSE8gIlwKKworIyBBIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB3aGVuIHRoZXJlIGlzIG5vIHByaW50IGJ1aWx0aW4gb3IgcHJpbnRmLgorZnVuY19mYWxsYmFja19lY2hvICgpCit7CisgIGV2YWwgJ2NhdCA8PF9MVEVDSE9fRU9GCitcJDEKK19MVEVDSE9fRU9GJworfQorICAgIEVDSE89XCIkcUVDSE9cIgorICBmaQorCisjIFZlcnkgYmFzaWMgb3B0aW9uIHBhcnNpbmcuIFRoZXNlIG9wdGlvbnMgYXJlIChhKSBzcGVjaWZpYyB0bworIyB0aGUgbGlidG9vbCB3cmFwcGVyLCAoYikgYXJlIGlkZW50aWNhbCBiZXR3ZWVuIHRoZSB3cmFwcGVyCisjIC9zY3JpcHQvIGFuZCB0aGUgd3JhcHBlciAvZXhlY3V0YWJsZS8gd2hpY2ggaXMgdXNlZCBvbmx5IG9uCisjIHdpbmRvd3MgcGxhdGZvcm1zLCBhbmQgKGMpIGFsbCBiZWdpbiB3aXRoIHRoZSBzdHJpbmcgIi0tbHQtIgorIyAoYXBwbGljYXRpb24gcHJvZ3JhbXMgYXJlIHVubGlrZWx5IHRvIGhhdmUgb3B0aW9ucyB3aGljaCBtYXRjaAorIyB0aGlzIHBhdHRlcm4pLgorIworIyBUaGVyZSBhcmUgb25seSB0d28gc3VwcG9ydGVkIG9wdGlvbnM6IC0tbHQtZGVidWcgYW5kCisjIC0tbHQtZHVtcC1zY3JpcHQuIFRoZXJlIGlzLCBkZWxpYmVyYXRlbHksIG5vIC0tbHQtaGVscC4KKyMKKyMgVGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoaXMgcGFyc2luZyBmdW5jdGlvbiBzaG91bGQgYmUgdGhlCisjIHNjcmlwdCdzICQwIHZhbHVlLCBmb2xsb3dlZCBieSAiJEAiLgorbHRfb3B0aW9uX2RlYnVnPQorZnVuY19wYXJzZV9sdF9vcHRpb25zICgpCit7CisgIGx0X3NjcmlwdF9hcmcwPVwkMAorICBzaGlmdAorICBmb3IgbHRfb3B0CisgIGRvCisgICAgY2FzZSBcIlwkbHRfb3B0XCIgaW4KKyAgICAtLWx0LWRlYnVnKSBsdF9vcHRpb25fZGVidWc9MSA7OworICAgIC0tbHQtZHVtcC1zY3JpcHQpCisgICAgICAgIGx0X2R1bXBfRD1cYFwkRUNITyBcIlhcJGx0X3NjcmlwdF9hcmcwXCIgfCAkU0VEIC1lICdzL15YLy8nIC1lICdzJS9bXi9dKiQlJSdcYAorICAgICAgICB0ZXN0IFwiWFwkbHRfZHVtcF9EXCIgPSBcIlhcJGx0X3NjcmlwdF9hcmcwXCIgJiYgbHRfZHVtcF9EPS4KKyAgICAgICAgbHRfZHVtcF9GPVxgXCRFQ0hPIFwiWFwkbHRfc2NyaXB0X2FyZzBcIiB8ICRTRUQgLWUgJ3MvXlgvLycgLWUgJ3MlXi4qLyUlJ1xgCisgICAgICAgIGNhdCBcIlwkbHRfZHVtcF9EL1wkbHRfZHVtcF9GXCIKKyAgICAgICAgZXhpdCAwCisgICAgICA7OworICAgIC0tbHQtKikKKyAgICAgICAgXCRFQ0hPIFwiVW5yZWNvZ25pemVkIC0tbHQtIG9wdGlvbjogJ1wkbHRfb3B0J1wiIDE+JjIKKyAgICAgICAgZXhpdCAxCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorCisgICMgUHJpbnQgdGhlIGRlYnVnIGJhbm5lciBpbW1lZGlhdGVseToKKyAgaWYgdGVzdCAtbiBcIlwkbHRfb3B0aW9uX2RlYnVnXCI7IHRoZW4KKyAgICBlY2hvIFwiJHtvdXRwdXRuYW1lfToke291dHB1dH06XCR7TElORU5PfTogbGlidG9vbCB3cmFwcGVyIChHTlUgJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTlwiIDE+JjIKKyAgZmkKK30KKworIyBVc2VkIHdoZW4gLS1sdC1kZWJ1Zy4gUHJpbnRzIGl0cyBhcmd1bWVudHMgdG8gc3Rkb3V0CisjIChyZWRpcmVjdGlvbiBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlcikKK2Z1bmNfbHRfZHVtcF9hcmdzICgpCit7CisgIGx0X2R1bXBfYXJnc19OPTE7CisgIGZvciBsdF9hcmcKKyAgZG8KKyAgICBcJEVDSE8gXCIke291dHB1dG5hbWV9OiR7b3V0cHV0fTpcJHtMSU5FTk99OiBuZXdhcmd2W1wkbHRfZHVtcF9hcmdzX05dOiBcJGx0X2FyZ1wiCisgICAgbHRfZHVtcF9hcmdzX049XGBleHByIFwkbHRfZHVtcF9hcmdzX04gKyAxXGAKKyAgZG9uZQorfQorCisjIENvcmUgZnVuY3Rpb24gZm9yIGxhdW5jaGluZyB0aGUgdGFyZ2V0IGFwcGxpY2F0aW9uCitmdW5jX2V4ZWNfcHJvZ3JhbV9jb3JlICgpCit7CiAiCi0JJEVDSE8gIlwKKyAgY2FzZSAkaG9zdCBpbgorICAjIEJhY2tzbGFzaGVzIHNlcGFyYXRlIGRpcmVjdG9yaWVzIG9uIHBsYWluIHdpbmRvd3MKKyAgKi0qLW1pbmd3IHwgKi0qLW9zMiogfCAqLWNlZ2NjKikKKyAgICAkRUNITyAiXAorICAgICAgaWYgdGVzdCAtbiBcIlwkbHRfb3B0aW9uX2RlYnVnXCI7IHRoZW4KKyAgICAgICAgXCRFQ0hPIFwiJHtvdXRwdXRuYW1lfToke291dHB1dH06XCR7TElORU5PfTogbmV3YXJndlswXTogXCRwcm9nZGlyXFxcXFwkcHJvZ3JhbVwiIDE+JjIKKyAgICAgICAgZnVuY19sdF9kdW1wX2FyZ3MgXCR7MStcIlwkQFwifSAxPiYyCisgICAgICBmaQorICAgICAgZXhlYyBcIlwkcHJvZ2RpclxcXFxcJHByb2dyYW1cIiBcJHsxK1wiXCRAXCJ9CisiCisgICAgOzsKKworICAqKQorICAgICRFQ0hPICJcCisgICAgICBpZiB0ZXN0IC1uIFwiXCRsdF9vcHRpb25fZGVidWdcIjsgdGhlbgorICAgICAgICBcJEVDSE8gXCIke291dHB1dG5hbWV9OiR7b3V0cHV0fTpcJHtMSU5FTk99OiBuZXdhcmd2WzBdOiBcJHByb2dkaXIvXCRwcm9ncmFtXCIgMT4mMgorICAgICAgICBmdW5jX2x0X2R1bXBfYXJncyBcJHsxK1wiXCRAXCJ9IDE+JjIKKyAgICAgIGZpCisgICAgICBleGVjIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIFwkezErXCJcJEBcIn0KKyIKKyAgICA7OworICBlc2FjCisgICRFQ0hPICJcCisgICAgICBcJEVDSE8gXCJcJDA6IGNhbm5vdCBleGVjIFwkcHJvZ3JhbSBcJCpcIiAxPiYyCisgICAgICBleGl0IDEKK30KKworIyBBIGZ1bmN0aW9uIHRvIGVuY2Fwc3VsYXRlIGxhdW5jaGluZyB0aGUgdGFyZ2V0IGFwcGxpY2F0aW9uCisjIFN0cmlwcyBvcHRpb25zIGluIHRoZSAtLWx0LSogbmFtZXNwYWNlIGZyb20gXCRAIGFuZAorIyBsYXVuY2hlcyB0YXJnZXQgYXBwbGljYXRpb24gd2l0aCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cy4KK2Z1bmNfZXhlY19wcm9ncmFtICgpCit7CisgIGNhc2UgXCIgXCQqIFwiIGluCisgICpcXCAtLWx0LSopCisgICAgZm9yIGx0X3dyX2FyZworICAgIGRvCisgICAgICBjYXNlIFwkbHRfd3JfYXJnIGluCisgICAgICAtLWx0LSopIDs7CisgICAgICAqKSBzZXQgeCBcIlwkQFwiIFwiXCRsdF93cl9hcmdcIjsgc2hpZnQ7OworICAgICAgZXNhYworICAgICAgc2hpZnQKKyAgICBkb25lIDs7CisgIGVzYWMKKyAgZnVuY19leGVjX3Byb2dyYW1fY29yZSBcJHsxK1wiXCRAXCJ9Cit9CisKKyAgIyBQYXJzZSBvcHRpb25zCisgIGZ1bmNfcGFyc2VfbHRfb3B0aW9ucyBcIlwkMFwiIFwkezErXCJcJEBcIn0KIAogICAjIEZpbmQgdGhlIGRpcmVjdG9yeSB0aGF0IHRoaXMgc2NyaXB0IGxpdmVzIGluLgotICB0aGlzZGlyPVxgXCRFQ0hPIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJS9bXi9dKiQlJSdcYAorICB0aGlzZGlyPVxgXCRFQ0hPIFwiXCRmaWxlXCIgfCAkU0VEICdzJS9bXi9dKiQlJSdcYAogICB0ZXN0IFwieFwkdGhpc2RpclwiID0gXCJ4XCRmaWxlXCIgJiYgdGhpc2Rpcj0uCiAKICAgIyBGb2xsb3cgc3ltYm9saWMgbGlua3MgdW50aWwgd2UgZ2V0IHRvIHRoZSByZWFsIHRoaXNkaXIuCi0gIGZpbGU9XGBscyAtbGQgXCJcJGZpbGVcIiB8ICR7U0VEfSAtbiAncy8uKi0+IC8vcCdcYAorICBmaWxlPVxgbHMgLWxkIFwiXCRmaWxlXCIgfCAkU0VEIC1uICdzLy4qLT4gLy9wJ1xgCiAgIHdoaWxlIHRlc3QgLW4gXCJcJGZpbGVcIjsgZG8KLSAgICBkZXN0ZGlyPVxgXCRFQ0hPIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJS9bXi9dKlwkJSUnXGAKKyAgICBkZXN0ZGlyPVxgXCRFQ0hPIFwiXCRmaWxlXCIgfCAkU0VEICdzJS9bXi9dKlwkJSUnXGAKIAogICAgICMgSWYgdGhlcmUgd2FzIGEgZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBjaGFuZ2UgdGhpc2Rpci4KICAgICBpZiB0ZXN0IFwieFwkZGVzdGRpclwiICE9IFwieFwkZmlsZVwiOyB0aGVuCkBAIC0yNzgzLDMwICs0MDE5LDEzIEBACiAgICAgICBlc2FjCiAgICAgZmkKIAotICAgIGZpbGU9XGBcJEVDSE8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlXi4qLyUlJ1xgCi0gICAgZmlsZT1cYGxzIC1sZCBcIlwkdGhpc2Rpci9cJGZpbGVcIiB8ICR7U0VEfSAtbiAncy8uKi0+IC8vcCdcYAorICAgIGZpbGU9XGBcJEVDSE8gXCJcJGZpbGVcIiB8ICRTRUQgJ3MlXi4qLyUlJ1xgCisgICAgZmlsZT1cYGxzIC1sZCBcIlwkdGhpc2Rpci9cJGZpbGVcIiB8ICRTRUQgLW4gJ3MvLiotPiAvL3AnXGAKICAgZG9uZQotIgotfQotIyBlbmQ6IGZ1bmNfZW1pdF93cmFwcGVyX3BhcnQxCi0KLSMgZnVuY19lbWl0X3dyYXBwZXJfcGFydDIgW2FyZz1ub10KLSMKLSMgRW1pdCB0aGUgc2Vjb25kIHBhcnQgb2YgYSBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0IG9uIHN0ZG91dC4KLSMgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgZGVzY3JpcHRpb24gYXNzb2NpYXRlZCB3aXRoCi0jIGZ1bmNfZW1pdF93cmFwcGVyKCksIGJlbG93LgotZnVuY19lbWl0X3dyYXBwZXJfcGFydDIgKCkKLXsKLQlmdW5jX2VtaXRfd3JhcHBlcl9wYXJ0Ml9hcmcxPW5vCi0JaWYgdGVzdCAtbiAiJDEiIDsgdGhlbgotCSAgZnVuY19lbWl0X3dyYXBwZXJfcGFydDJfYXJnMT0kMQotCWZpCi0KLQkkRUNITyAiXAogCiAgICMgVXN1YWxseSAnbm8nLCBleGNlcHQgb24gY3lnd2luL21pbmd3IHdoZW4gZW1iZWRkZWQgaW50bwogICAjIHRoZSBjd3JhcHBlci4KLSAgV1JBUFBFUl9TQ1JJUFRfQkVMT05HU19JTl9PQkpESVI9JGZ1bmNfZW1pdF93cmFwcGVyX3BhcnQyX2FyZzEKKyAgV1JBUFBFUl9TQ1JJUFRfQkVMT05HU19JTl9PQkpESVI9JGZ1bmNfZW1pdF93cmFwcGVyX2FyZzEKICAgaWYgdGVzdCBcIlwkV1JBUFBFUl9TQ1JJUFRfQkVMT05HU19JTl9PQkpESVJcIiA9IFwieWVzXCI7IHRoZW4KICAgICAjIHNwZWNpYWwgY2FzZSBmb3IgJy4nCiAgICAgaWYgdGVzdCBcIlwkdGhpc2RpclwiID0gXCIuXCI7IHRoZW4KQEAgLTI4MTQsNyArNDAzMyw3IEBACiAgICAgZmkKICAgICAjIHJlbW92ZSAubGlicyBmcm9tIHRoaXNkaXIKICAgICBjYXNlIFwiXCR0aGlzZGlyXCIgaW4KLSAgICAqW1xcXFwvXSRvYmpkaXIgKSB0aGlzZGlyPVxgXCRFQ0hPIFwiWFwkdGhpc2RpclwiIHwgXCRYc2VkIC1lICdzJVtcXFxcL11bXlxcXFwvXSokJSUnXGAgOzsKKyAgICAqW1xcXFwvXSRvYmpkaXIgKSB0aGlzZGlyPVxgXCRFQ0hPIFwiXCR0aGlzZGlyXCIgfCAkU0VEICdzJVtcXFxcL11bXlxcXFwvXSokJSUnXGAgOzsKICAgICAkb2JqZGlyICkgICB0aGlzZGlyPS4gOzsKICAgICBlc2FjCiAgIGZpCkBAIC0yODY5LDYgKzQwODgsMTggQEAKIAogICBpZiB0ZXN0IC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB0aGVuIgogCisJIyBmaXh1cCB0aGUgZGxsIHNlYXJjaHBhdGggaWYgd2UgbmVlZCB0by4KKwkjCisJIyBGaXggdGhlIERMTCBzZWFyY2hwYXRoIGlmIHdlIG5lZWQgdG8uICBEbyB0aGlzIGJlZm9yZSBwcmVwZW5kaW5nCisJIyB0byBzaGxpYnBhdGgsIGJlY2F1c2Ugb24gV2luZG93cywgYm90aCBhcmUgUEFUSCBhbmQgdW5pbnN0YWxsZWQKKwkjIGxpYnJhcmllcyBtdXN0IGNvbWUgZmlyc3QuCisJaWYgdGVzdCAtbiAiJGRsbHNlYXJjaHBhdGgiOyB0aGVuCisJICAkRUNITyAiXAorICAgICMgQWRkIHRoZSBkbGwgc2VhcmNoIHBhdGggY29tcG9uZW50cyB0byB0aGUgZXhlY3V0YWJsZSBQQVRICisgICAgUEFUSD0kZGxsc2VhcmNocGF0aDpcJFBBVEgKKyIKKwlmaQorCiAJIyBFeHBvcnQgb3VyIHNobGlicGF0aF92YXIgaWYgd2UgaGF2ZSBvbmUuCiAJaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgJiYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLW4gIiR0ZW1wX3JwYXRoIjsgdGhlbgogCSAgJEVDSE8gIlwKQEAgLTI4NzcsMjU0ICs0MTA4LDI5IEBACiAKICAgICAjIFNvbWUgc3lzdGVtcyBjYW5ub3QgY29wZSB3aXRoIGNvbG9uLXRlcm1pbmF0ZWQgJHNobGlicGF0aF92YXIKICAgICAjIFRoZSBzZWNvbmQgY29sb24gaXMgYSB3b3JrYXJvdW5kIGZvciBhIGJ1ZyBpbiBCZU9TIFI0IHNlZAotICAgICRzaGxpYnBhdGhfdmFyPVxgXCRFQ0hPIFwiWFwkJHNobGlicGF0aF92YXJcIiB8IFwkWHNlZCAtZSAncy86OipcJC8vJ1xgCisgICAgJHNobGlicGF0aF92YXI9XGBcJEVDSE8gXCJcJCRzaGxpYnBhdGhfdmFyXCIgfCAkU0VEICdzLzo6KlwkLy8nXGAKIAogICAgIGV4cG9ydCAkc2hsaWJwYXRoX3ZhcgogIgogCWZpCiAKLQkjIGZpeHVwIHRoZSBkbGwgc2VhcmNocGF0aCBpZiB3ZSBuZWVkIHRvLgotCWlmIHRlc3QgLW4gIiRkbGxzZWFyY2hwYXRoIjsgdGhlbgotCSAgJEVDSE8gIlwKLSAgICAjIEFkZCB0aGUgZGxsIHNlYXJjaCBwYXRoIGNvbXBvbmVudHMgdG8gdGhlIGV4ZWN1dGFibGUgUEFUSAotICAgIFBBVEg9JGRsbHNlYXJjaHBhdGg6XCRQQVRICi0iCi0JZmkKLQogCSRFQ0hPICJcCiAgICAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgIT0gXCIkbWFnaWNcIjsgdGhlbgogICAgICAgIyBSdW4gdGhlIGFjdHVhbCBwcm9ncmFtIHdpdGggb3VyIGFyZ3VtZW50cy4KLSIKLQljYXNlICRob3N0IGluCi0JIyBCYWNrc2xhc2hlcyBzZXBhcmF0ZSBkaXJlY3RvcmllcyBvbiBwbGFpbiB3aW5kb3dzCi0JKi0qLW1pbmd3IHwgKi0qLW9zMiogfCAqLWNlZ2NjKikKLQkgICRFQ0hPICJcCi0gICAgICBleGVjIFwiXCRwcm9nZGlyXFxcXFwkcHJvZ3JhbVwiIFwkezErXCJcJEBcIn0KLSIKLQkgIDs7Ci0KLQkqKQotCSAgJEVDSE8gIlwKLSAgICAgIGV4ZWMgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgXCR7MStcIlwkQFwifQotIgotCSAgOzsKLQllc2FjCi0JJEVDSE8gIlwKLSAgICAgIFwkRUNITyBcIlwkMDogY2Fubm90IGV4ZWMgXCRwcm9ncmFtIFwkKlwiIDE+JjIKLSAgICAgIGV4aXQgMQorICAgICAgZnVuY19leGVjX3Byb2dyYW0gXCR7MStcIlwkQFwifQogICAgIGZpCiAgIGVsc2UKICAgICAjIFRoZSBwcm9ncmFtIGRvZXNuJ3QgZXhpc3QuCiAgICAgXCRFQ0hPIFwiXCQwOiBlcnJvcjogXFxcYFwkcHJvZ2Rpci9cJHByb2dyYW0nIGRvZXMgbm90IGV4aXN0XCIgMT4mMgogICAgIFwkRUNITyBcIlRoaXMgc2NyaXB0IGlzIGp1c3QgYSB3cmFwcGVyIGZvciBcJHByb2dyYW0uXCIgMT4mMgotICAgICRFQ0hPIFwiU2VlIHRoZSAkUEFDS0FHRSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlwiIDE+JjIKKyAgICBcJEVDSE8gXCJTZWUgdGhlICRQQUNLQUdFIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIgMT4mMgogICAgIGV4aXQgMQogICBmaQogZmlcCiAiCiB9Ci0jIGVuZDogZnVuY19lbWl0X3dyYXBwZXJfcGFydDIKIAogCi0jIGZ1bmNfZW1pdF93cmFwcGVyIFthcmc9bm9dCi0jCi0jIEVtaXQgYSBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0IG9uIHN0ZG91dC4KLSMgRG9uJ3QgZGlyZWN0bHkgb3BlbiBhIGZpbGUgYmVjYXVzZSB3ZSBtYXkgd2FudCB0bwotIyBpbmNvcnBvcmF0ZSB0aGUgc2NyaXB0IGNvbnRlbnRzIHdpdGhpbiBhIGN5Z3dpbi9taW5ndwotIyB3cmFwcGVyIGV4ZWN1dGFibGUuICBNdXN0IE9OTFkgYmUgY2FsbGVkIGZyb20gd2l0aGluCi0jIGZ1bmNfbW9kZV9saW5rIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBhIG51bWJlciBvZiB2YXJpYWJsZXMKLSMgc2V0IHRoZXJlaW4uCi0jCi0jIEFSRyBpcyB0aGUgdmFsdWUgdGhhdCB0aGUgV1JBUFBFUl9TQ1JJUFRfQkVMT05HU19JTl9PQkpESVIKLSMgdmFyaWFibGUgd2lsbCB0YWtlLiAgSWYgJ3llcycsIHRoZW4gdGhlIGVtaXR0ZWQgc2NyaXB0Ci0jIHdpbGwgYXNzdW1lIHRoYXQgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBpdCBpcyBzdG9yZWQgaXMKLSMgdGhlICRvYmpkaXIgZGlyZWN0b3J5LiAgVGhpcyBpcyBhIGN5Z3dpbi9taW5ndy1zcGVjaWZpYwotIyBiZWhhdmlvci4KLWZ1bmNfZW1pdF93cmFwcGVyICgpCi17Ci0JZnVuY19lbWl0X3dyYXBwZXJfYXJnMT1ubwotCWlmIHRlc3QgLW4gIiQxIiA7IHRoZW4KLQkgIGZ1bmNfZW1pdF93cmFwcGVyX2FyZzE9JDEKLQlmaQotCi0JIyBzcGxpdCB0aGlzIHVwIHNvIHRoYXQgZnVuY19lbWl0X2N3cmFwcGVyZXhlX3NyYwotCSMgY2FuIGNhbGwgZWFjaCBwYXJ0IGluZGVwZW5kZW50bHkuCi0JZnVuY19lbWl0X3dyYXBwZXJfcGFydDEgIiR7ZnVuY19lbWl0X3dyYXBwZXJfYXJnMX0iCi0JZnVuY19lbWl0X3dyYXBwZXJfcGFydDIgIiR7ZnVuY19lbWl0X3dyYXBwZXJfYXJnMX0iCi19Ci0KLQotIyBmdW5jX3RvX2hvc3RfcGF0aCBhcmcKLSMKLSMgQ29udmVydCBwYXRocyB0byBob3N0IGZvcm1hdCB3aGVuIHVzZWQgd2l0aCBidWlsZCB0b29scy4KLSMgSW50ZW5kZWQgZm9yIHVzZSB3aXRoICJuYXRpdmUiIG1pbmd3ICh3aGVyZSBsaWJ0b29sIGl0c2VsZgotIyBpcyBydW5uaW5nIHVuZGVyIHRoZSBtc3lzIHNoZWxsKSwgb3IgaW4gdGhlIGZvbGxvd2luZyBjcm9zcy0KLSMgYnVpbGQgZW52aXJvbm1lbnRzOgotIyAgICAkYnVpbGQgICAgICAgICAgJGhvc3QKLSMgICAgbWluZ3cgKG1zeXMpICAgIG1pbmd3ICBbZS5nLiBuYXRpdmVdCi0jICAgIGN5Z3dpbiAgICAgICAgICBtaW5ndwotIyAgICAqbml4ICsgd2luZSAgICAgbWluZ3cKLSMgd2hlcmUgd2luZSBpcyBlcXVpcHBlZCB3aXRoIHRoZSBgd2luZXBhdGgnIGV4ZWN1dGFibGUuCi0jIEluIHRoZSBuYXRpdmUgbWluZ3cgY2FzZSwgdGhlIChtc3lzKSBzaGVsbCBhdXRvbWF0aWNhbGx5Ci0jIGNvbnZlcnRzIHBhdGhzIGZvciBhbnkgbm9uLW1zeXMgYXBwbGljYXRpb25zIGl0IGxhdW5jaGVzLAotIyBidXQgdGhhdCBmYWNpbGl0eSBpc24ndCBhdmFpbGFibGUgZnJvbSBpbnNpZGUgdGhlIGN3cmFwcGVyLgotIyBTaW1pbGFyIGFjY29tbW9kYXRpb25zIGFyZSBuZWNlc3NhcnkgZm9yICRob3N0IG1pbmd3IGFuZAotIyAkYnVpbGQgY3lnd2luLiAgQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIGRvZXMgbm8gaGFybSBmb3Igb3RoZXIKLSMgJGhvc3QvJGJ1aWxkIGNvbWJpbmF0aW9ucyBub3QgbGlzdGVkIGFib3ZlLgotIwotIyBBUkcgaXMgdGhlIHBhdGggKG9uICRidWlsZCkgdGhhdCBzaG91bGQgYmUgY29udmVydGVkIHRvCi0jIHRoZSBwcm9wZXIgcmVwcmVzZW50YXRpb24gZm9yICRob3N0LiBUaGUgcmVzdWx0IGlzIHN0b3JlZAotIyBpbiAkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0LgotZnVuY190b19ob3N0X3BhdGggKCkKLXsKLSAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkMSIKLSAgaWYgdGVzdCAtbiAiJDEiIDsgdGhlbgotICAgIGNhc2UgJGhvc3QgaW4KLSAgICAgICptaW5ndyogKQotICAgICAgICBsdF9zZWRfbmFpdmVfYmFja3NsYXNoaWZ5PSdzfFxcXFwqfFxcfGc7c3wvfFxcfGc7c3xcXHxcXFxcfGcnCi0gICAgICAgIGNhc2UgJGJ1aWxkIGluCi0gICAgICAgICAgKm1pbmd3KiApICMgYWN0dWFsbHksIG1zeXMKLSAgICAgICAgICAgICMgYXdrd2FyZDogY21kIGFwcGVuZHMgc3BhY2VzIHRvIHJlc3VsdAotICAgICAgICAgICAgbHRfc2VkX3N0cmlwX3RyYWlsaW5nX3NwYWNlcz0icy9bIF0qXCQvLyIKLSAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRoX3RtcDE9YCggY21kIC8vYyBlY2hvICIkMSIgfFwKLSAgICAgICAgICAgICAgJFNFRCAtZSAiJGx0X3NlZF9zdHJpcF90cmFpbGluZ19zcGFjZXMiICkgMj4vZGV2L251bGwgfHwgZWNobyAiImAKLSAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD1gZWNobyAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiIHxcCi0gICAgICAgICAgICAgICRTRUQgLWUgIiRsdF9zZWRfbmFpdmVfYmFja3NsYXNoaWZ5ImAKLSAgICAgICAgICAgIDs7Ci0gICAgICAgICAgKmN5Z3dpbiogKQotICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhfdG1wMT1gY3lncGF0aCAtdyAiJDEiYAotICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PWBlY2hvICIkZnVuY190b19ob3N0X3BhdGhfdG1wMSIgfFwKLSAgICAgICAgICAgICAgJFNFRCAtZSAiJGx0X3NlZF9uYWl2ZV9iYWNrc2xhc2hpZnkiYAotICAgICAgICAgICAgOzsKLSAgICAgICAgICAqICkKLSAgICAgICAgICAgICMgVW5mb3J0dW5hdGVseSwgd2luZXBhdGggZG9lcyBub3QgZXhpdCB3aXRoIGEgbm9uLXplcm8KLSAgICAgICAgICAgICMgZXJyb3IgY29kZSwgc28gd2UgYXJlIGZvcmNlZCB0byBjaGVjayB0aGUgY29udGVudHMgb2YKLSAgICAgICAgICAgICMgc3Rkb3V0LiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlIGNvbW1hbmQgaXMgbm90Ci0gICAgICAgICAgICAjIGZvdW5kLCB0aGUgc2hlbGwgd2lsbCBzZXQgYW4gZXhpdCBjb2RlIG9mIDEyNyBhbmQgcHJpbnQKLSAgICAgICAgICAgICMgKmFuIGVycm9yIG1lc3NhZ2UqIHRvIHN0ZG91dC4gU28gd2UgbXVzdCBjaGVjayBmb3IgYm90aAotICAgICAgICAgICAgIyBlcnJvciBjb2RlIG9mIHplcm8gQU5EIG5vbi1lbXB0eSBzdGRvdXQsIHdoaWNoIGV4cGxhaW5zCi0gICAgICAgICAgICAjIHRoZSBvZGQgY29uc3RydWN0aW9uOgotICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhfdG1wMT1gd2luZXBhdGggLXcgIiQxIiAyPi9kZXYvbnVsbGAKLSAgICAgICAgICAgIGlmIHRlc3QgIiQ/IiAtZXEgMCAmJiB0ZXN0IC1uICIke2Z1bmNfdG9faG9zdF9wYXRoX3RtcDF9IjsgdGhlbgotICAgICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9YGVjaG8gIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxIiB8XAotICAgICAgICAgICAgICAgICRTRUQgLWUgIiRsdF9zZWRfbmFpdmVfYmFja3NsYXNoaWZ5ImAKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIyBBbGxvdyB3YXJuaW5nIGJlbG93LgotICAgICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiIKLSAgICAgICAgICAgIGZpCi0gICAgICAgICAgICA7OwotICAgICAgICBlc2FjCi0gICAgICAgIGlmIHRlc3QgLXogIiRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiIDsgdGhlbgotICAgICAgICAgIGZ1bmNfZXJyb3IgIkNvdWxkIG5vdCBkZXRlcm1pbmUgaG9zdCBwYXRoIGNvcnJlc3BvbmRpbmcgdG8iCi0gICAgICAgICAgZnVuY19lcnJvciAiICAnJDEnIgotICAgICAgICAgIGZ1bmNfZXJyb3IgIkNvbnRpbnVpbmcsIGJ1dCB1bmluc3RhbGxlZCBleGVjdXRhYmxlcyBtYXkgbm90IHdvcmsuIgotICAgICAgICAgICMgRmFsbGJhY2s6Ci0gICAgICAgICAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkMSIKLSAgICAgICAgZmkKLSAgICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi19Ci0jIGVuZDogZnVuY190b19ob3N0X3BhdGgKLQotIyBmdW5jX3RvX2hvc3RfcGF0aGxpc3QgYXJnCi0jCi0jIENvbnZlcnQgcGF0aGxpc3RzIHRvIGhvc3QgZm9ybWF0IHdoZW4gdXNlZCB3aXRoIGJ1aWxkIHRvb2xzLgotIyBTZWUgZnVuY190b19ob3N0X3BhdGgoKSwgYWJvdmUuIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgdGhlCi0jIGZvbGxvd2luZyAkYnVpbGQvJGhvc3QgY29tYmluYXRpb25zIChidXQgZG9lcyBubyBoYXJtIGZvcgotIyBjb21iaW5hdGlvbnMgbm90IGxpc3RlZCBoZXJlKToKLSMgICAgJGJ1aWxkICAgICAgICAgICRob3N0Ci0jICAgIG1pbmd3IChtc3lzKSAgICBtaW5ndyAgW2UuZy4gbmF0aXZlXQotIyAgICBjeWd3aW4gICAgICAgICAgbWluZ3cKLSMgICAgKm5peCArIHdpbmUgICAgIG1pbmd3Ci0jCi0jIFBhdGggc2VwYXJhdG9ycyBhcmUgYWxzbyBjb252ZXJ0ZWQgZnJvbSAkYnVpbGQgZm9ybWF0IHRvCi0jICRob3N0IGZvcm1hdC4gSWYgQVJHIGJlZ2lucyBvciBlbmRzIHdpdGggYSBwYXRoIHNlcGFyYXRvcgotIyBjaGFyYWN0ZXIsIGl0IGlzIHByZXNlcnZlZCAoYnV0IGNvbnZlcnRlZCB0byAkaG9zdCBmb3JtYXQpCi0jIG9uIG91dHB1dC4KLSMKLSMgQVJHIGlzIGEgcGF0aGxpc3QgKG9uICRidWlsZCkgdGhhdCBzaG91bGQgYmUgY29udmVydGVkIHRvCi0jIHRoZSBwcm9wZXIgcmVwcmVzZW50YXRpb24gb24gJGhvc3QuIFRoZSByZXN1bHQgaXMgc3RvcmVkCi0jIGluICRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0LgotZnVuY190b19ob3N0X3BhdGhsaXN0ICgpCi17Ci0gIGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQ9IiQxIgotICBpZiB0ZXN0IC1uICIkMSIgOyB0aGVuCi0gICAgY2FzZSAkaG9zdCBpbgotICAgICAgKm1pbmd3KiApCi0gICAgICAgIGx0X3NlZF9uYWl2ZV9iYWNrc2xhc2hpZnk9J3N8XFxcXCp8XFx8ZztzfC98XFx8ZztzfFxcfFxcXFx8ZycKLSAgICAgICAgIyBSZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3IgY2hhcmFjdGVycyBmcm9tCi0gICAgICAgICMgQVJHLiBtc3lzIGJlaGF2aW9yIGlzIGluY29uc2lzdGVudCBoZXJlLCBjeWdwYXRoIHR1cm5zIHRoZW0KLSAgICAgICAgIyBpbnRvICcuOycgYW5kICc7LicsIGFuZCB3aW5lcGF0aCBpZ25vcmVzIHRoZW0gY29tcGxldGVseS4KLSAgICAgICAgZnVuY190b19ob3N0X3BhdGhsaXN0X3RtcDI9IiQxIgotICAgICAgICAjIE9uY2Ugc2V0IGZvciB0aGlzIGNhbGwsIHRoaXMgdmFyaWFibGUgc2hvdWxkIG5vdCBiZQotICAgICAgICAjIHJlYXNzaWduZWQuIEl0IGlzIHVzZWQgaW4gdGhhIGZhbGxiYWNrIGNhc2UuCi0gICAgICAgIGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAxPWBlY2hvICIkZnVuY190b19ob3N0X3BhdGhsaXN0X3RtcDIiIHxcCi0gICAgICAgICAgJFNFRCAtZSAnc3xeOip8fCcgLWUgJ3N8OiokfHwnYAotICAgICAgICBjYXNlICRidWlsZCBpbgotICAgICAgICAgICptaW5ndyogKSAjIEFjdHVhbGx5LCBtc3lzLgotICAgICAgICAgICAgIyBBd2t3YXJkOiBjbWQgYXBwZW5kcyBzcGFjZXMgdG8gcmVzdWx0LgotICAgICAgICAgICAgbHRfc2VkX3N0cmlwX3RyYWlsaW5nX3NwYWNlcz0icy9bIF0qXCQvLyIKLSAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAyPWAoIGNtZCAvL2MgZWNobyAiJGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAxIiB8XAotICAgICAgICAgICAgICAkU0VEIC1lICIkbHRfc2VkX3N0cmlwX3RyYWlsaW5nX3NwYWNlcyIgKSAyPi9kZXYvbnVsbCB8fCBlY2hvICIiYAotICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdD1gZWNobyAiJGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAyIiB8XAotICAgICAgICAgICAgICAkU0VEIC1lICIkbHRfc2VkX25haXZlX2JhY2tzbGFzaGlmeSJgCi0gICAgICAgICAgICA7OwotICAgICAgICAgICpjeWd3aW4qICkKLSAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAyPWBjeWdwYXRoIC13IC1wICIkZnVuY190b19ob3N0X3BhdGhsaXN0X3RtcDEiYAotICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdD1gZWNobyAiJGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAyIiB8XAotICAgICAgICAgICAgICAkU0VEIC1lICIkbHRfc2VkX25haXZlX2JhY2tzbGFzaGlmeSJgCi0gICAgICAgICAgICA7OwotICAgICAgICAgICogKQotICAgICAgICAgICAgIyB1bmZvcnR1bmF0ZWx5LCB3aW5lcGF0aCBkb2Vzbid0IGNvbnZlcnQgcGF0aGxpc3RzCi0gICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0PSIiCi0gICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aGxpc3Rfb2xkSUZTPSRJRlMKLSAgICAgICAgICAgIElGUz06Ci0gICAgICAgICAgICBmb3IgZnVuY190b19ob3N0X3BhdGhsaXN0X2YgaW4gJGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAxIDsgZG8KLSAgICAgICAgICAgICAgSUZTPSRmdW5jX3RvX2hvc3RfcGF0aGxpc3Rfb2xkSUZTCi0gICAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfZiIgOyB0aGVuCi0gICAgICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGggIiRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfZiIKLSAgICAgICAgICAgICAgICBpZiB0ZXN0IC1uICIkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IiA7IHRoZW4KLSAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0IiA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdD0iJGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdCIKLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdD0iJGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQ7JGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdCIKLSAgICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgICAgSUZTPToKLSAgICAgICAgICAgIGRvbmUKLSAgICAgICAgICAgIElGUz0kZnVuY190b19ob3N0X3BhdGhsaXN0X29sZElGUwotICAgICAgICAgICAgOzsKLSAgICAgICAgZXNhYwotICAgICAgICBpZiB0ZXN0IC16ICIkZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdCIgOyB0aGVuCi0gICAgICAgICAgZnVuY19lcnJvciAiQ291bGQgbm90IGRldGVybWluZSB0aGUgaG9zdCBwYXRoKHMpIGNvcnJlc3BvbmRpbmcgdG8iCi0gICAgICAgICAgZnVuY19lcnJvciAiICAnJDEnIgotICAgICAgICAgIGZ1bmNfZXJyb3IgIkNvbnRpbnVpbmcsIGJ1dCB1bmluc3RhbGxlZCBleGVjdXRhYmxlcyBtYXkgbm90IHdvcmsuIgotICAgICAgICAgICMgRmFsbGJhY2suIFRoaXMgbWF5IGJyZWFrIGlmICQxIGNvbnRhaW5zIERPUy1zdHlsZSBkcml2ZQotICAgICAgICAgICMgc3BlY2lmaWNhdGlvbnMuIFRoZSBmaXggaXMgbm90IHRvIGNvbXBsaWNhdGUgdGhlIGV4cHJlc3Npb24KLSAgICAgICAgICAjIGJlbG93LCBidXQgZm9yIHRoZSB1c2VyIHRvIHByb3ZpZGUgYSB3b3JraW5nIHdpbmUgaW5zdGFsbGF0aW9uCi0gICAgICAgICAgIyB3aXRoIHdpbmVwYXRoIHNvIHRoYXQgcGF0aCB0cmFuc2xhdGlvbiBpbiB0aGUgY3Jvc3MtdG8tbWluZ3cKLSAgICAgICAgICAjIGNhc2Ugd29ya3MgcHJvcGVybHkuCi0gICAgICAgICAgbHRfcmVwbGFjZV9wYXRoc2VwX25peF90b19kb3M9InN8Onw7fGciCi0gICAgICAgICAgZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdD1gZWNobyAiJGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAxIiB8XAotICAgICAgICAgICAgJFNFRCAtZSAiJGx0X3JlcGxhY2VfcGF0aHNlcF9uaXhfdG9fZG9zImAKLSAgICAgICAgZmkKLSAgICAgICAgIyBOb3csIGFkZCB0aGUgbGVhZGluZyBhbmQgdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3JzIGJhY2sKLSAgICAgICAgY2FzZSAiJDEiIGluCi0gICAgICAgICAgOiogKSBmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0PSI7JGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQiCi0gICAgICAgICAgICA7OwotICAgICAgICBlc2FjCi0gICAgICAgIGNhc2UgIiQxIiBpbgotICAgICAgICAgICo6ICkgZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdD0iJGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQ7IgotICAgICAgICAgICAgOzsKLSAgICAgICAgZXNhYwotICAgICAgICA7OwotICAgIGVzYWMKLSAgZmkKLX0KLSMgZW5kOiBmdW5jX3RvX2hvc3RfcGF0aGxpc3QKLQogIyBmdW5jX2VtaXRfY3dyYXBwZXJleGVfc3JjCiAjIGVtaXQgdGhlIHNvdXJjZSBjb2RlIGZvciBhIHdyYXBwZXIgZXhlY3V0YWJsZSBvbiBzdGRvdXQKICMgTXVzdCBPTkxZIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBmdW5jX21vZGVfbGluayBiZWNhdXNlCkBAIC0zMTQxLDMxICs0MTQ3LDIzIEBACiAKICAgIFRoaXMgd3JhcHBlciBleGVjdXRhYmxlIHNob3VsZCBuZXZlciBiZSBtb3ZlZCBvdXQgb2YgdGhlIGJ1aWxkIGRpcmVjdG9yeS4KICAgIElmIGl0IGlzLCBpdCB3aWxsIG5vdCBvcGVyYXRlIGNvcnJlY3RseS4KLQotICAgQ3VycmVudGx5LCBpdCBzaW1wbHkgZXhlY3MgdGhlIHdyYXBwZXIgKnNjcmlwdCogIiRTSEVMTCAkb3V0cHV0IiwKLSAgIGJ1dCBjb3VsZCBldmVudHVhbGx5IGFic29yYiBhbGwgb2YgdGhlIHNjcmlwdHMgZnVuY3Rpb25hbGl0eSBhbmQKLSAgIGV4ZWMgJG9iamRpci8kb3V0cHV0bmFtZSBkaXJlY3RseS4KICovCiBFT0YKIAkgICAgY2F0IDw8IkVPRiIKKyNpZmRlZiBfTVNDX1ZFUgorIyBkZWZpbmUgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIDEKKyNlbmRpZgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaWZkZWYgX01TQ19WRVIKICMgaW5jbHVkZSA8ZGlyZWN0Lmg+CiAjIGluY2x1ZGUgPHByb2Nlc3MuaD4KICMgaW5jbHVkZSA8aW8uaD4KLSMgZGVmaW5lIHNldG1vZGUgX3NldG1vZGUKICNlbHNlCiAjIGluY2x1ZGUgPHVuaXN0ZC5oPgogIyBpbmNsdWRlIDxzdGRpbnQuaD4KICMgaWZkZWYgX19DWUdXSU5fXwogIyAgaW5jbHVkZSA8aW8uaD4KLSMgIGRlZmluZSBIQVZFX1NFVEVOVgotIyAgaWZkZWYgX19TVFJJQ1RfQU5TSV9fCi1jaGFyICpyZWFscGF0aCAoY29uc3QgY2hhciAqLCBjaGFyICopOwotaW50IHB1dGVudiAoY2hhciAqKTsKLWludCBzZXRlbnYgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpOwotIyAgZW5kaWYKICMgZW5kaWYKICNlbmRpZgogI2luY2x1ZGUgPG1hbGxvYy5oPgpAQCAtMzE3Nyw2ICs0MTc1LDQ0IEBACiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogCisvKiBkZWNsYXJhdGlvbnMgb2Ygbm9uLUFOU0kgZnVuY3Rpb25zICovCisjaWYgZGVmaW5lZChfX01JTkdXMzJfXykKKyMgaWZkZWYgX19TVFJJQ1RfQU5TSV9fCitpbnQgX3B1dGVudiAoY29uc3QgY2hhciAqKTsKKyMgZW5kaWYKKyNlbGlmIGRlZmluZWQoX19DWUdXSU5fXykKKyMgaWZkZWYgX19TVFJJQ1RfQU5TSV9fCitjaGFyICpyZWFscGF0aCAoY29uc3QgY2hhciAqLCBjaGFyICopOworaW50IHB1dGVudiAoY2hhciAqKTsKK2ludCBzZXRlbnYgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpOworIyBlbmRpZgorLyogI2VsaWYgZGVmaW5lZCAob3RoZXIgcGxhdGZvcm1zKSAuLi4gKi8KKyNlbmRpZgorCisvKiBwb3J0YWJpbGl0eSBkZWZpbmVzLCBleGNsdWRpbmcgcGF0aCBoYW5kbGluZyBtYWNyb3MgKi8KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorIyBkZWZpbmUgc2V0bW9kZSBfc2V0bW9kZQorIyBkZWZpbmUgc3RhdCAgICBfc3RhdAorIyBkZWZpbmUgY2htb2QgICBfY2htb2QKKyMgZGVmaW5lIGdldGN3ZCAgX2dldGN3ZAorIyBkZWZpbmUgcHV0ZW52ICBfcHV0ZW52CisjIGRlZmluZSBTX0lYVVNSIF9TX0lFWEVDCisjIGlmbmRlZiBfSU5UUFRSX1RfREVGSU5FRAorIyAgZGVmaW5lIF9JTlRQVFJfVF9ERUZJTkVECisjICBkZWZpbmUgaW50cHRyX3QgaW50CisjIGVuZGlmCisjZWxpZiBkZWZpbmVkKF9fTUlOR1czMl9fKQorIyBkZWZpbmUgc2V0bW9kZSBfc2V0bW9kZQorIyBkZWZpbmUgc3RhdCAgICBfc3RhdAorIyBkZWZpbmUgY2htb2QgICBfY2htb2QKKyMgZGVmaW5lIGdldGN3ZCAgX2dldGN3ZAorIyBkZWZpbmUgcHV0ZW52ICBfcHV0ZW52CisjZWxpZiBkZWZpbmVkKF9fQ1lHV0lOX18pCisjIGRlZmluZSBIQVZFX1NFVEVOVgorIyBkZWZpbmUgRk9QRU5fV0IgIndiIgorLyogI2VsaWYgZGVmaW5lZCAob3RoZXIgcGxhdGZvcm1zKSAuLi4gKi8KKyNlbmRpZgorCiAjaWYgZGVmaW5lZChQQVRIX01BWCkKICMgZGVmaW5lIExUX1BBVEhNQVggUEFUSF9NQVgKICNlbGlmIGRlZmluZWQoTUFYUEFUSExFTikKQEAgLTMxOTIsMTQgKzQyMjgsNyBAQAogIyBkZWZpbmUgU19JWEdSUCAwCiAjZW5kaWYKIAotI2lmZGVmIF9NU0NfVkVSCi0jIGRlZmluZSBTX0lYVVNSIF9TX0lFWEVDCi0jIGRlZmluZSBzdGF0IF9zdGF0Ci0jIGlmbmRlZiBfSU5UUFRSX1RfREVGSU5FRAotIyAgZGVmaW5lIGludHB0cl90IGludAotIyBlbmRpZgotI2VuZGlmCi0KKy8qIHBhdGggaGFuZGxpbmcgcG9ydGFiaWxpdHkgbWFjcm9zICovCiAjaWZuZGVmIERJUl9TRVBBUkFUT1IKICMgZGVmaW5lIERJUl9TRVBBUkFUT1IgJy8nCiAjIGRlZmluZSBQQVRIX1NFUEFSQVRPUiAnOicKQEAgLTMyMzAsMTAgKzQyNTksNiBAQAogIyBkZWZpbmUgSVNfUEFUSF9TRVBBUkFUT1IoY2gpICgoY2gpID09IFBBVEhfU0VQQVJBVE9SXzIpCiAjZW5kaWYgLyogUEFUSF9TRVBBUkFUT1JfMiAqLwogCi0jaWZkZWYgX19DWUdXSU5fXwotIyBkZWZpbmUgRk9QRU5fV0IgIndiIgotI2VuZGlmCi0KICNpZm5kZWYgRk9QRU5fV0IKICMgZGVmaW5lIEZPUEVOX1dCICJ3IgogI2VuZGlmCkBAIC0zMjQ2LDIyICs0MjcxLDEzIEBACiAgIGlmIChzdGFsZSkgeyBmcmVlICgodm9pZCAqKSBzdGFsZSk7IHN0YWxlID0gMDsgfSBcCiB9IHdoaWxlICgwKQogCi0jdW5kZWYgTFRXUkFQUEVSX0RFQlVHUFJJTlRGCi0jaWYgZGVmaW5lZCBERUJVR1dSQVBQRVIKLSMgZGVmaW5lIExUV1JBUFBFUl9ERUJVR1BSSU5URihhcmdzKSBsdHdyYXBwZXJfZGVidWdwcmludGYgYXJncwotc3RhdGljIHZvaWQKLWx0d3JhcHBlcl9kZWJ1Z3ByaW50ZiAoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gICAgdmFfbGlzdCBhcmdzOwotICAgIHZhX3N0YXJ0IChhcmdzLCBmbXQpOwotICAgICh2b2lkKSB2ZnByaW50ZiAoc3RkZXJyLCBmbXQsIGFyZ3MpOwotICAgIHZhX2VuZCAoYXJncyk7Ci19CisjaWYgZGVmaW5lZChMVF9ERUJVR1dSQVBQRVIpCitzdGF0aWMgaW50IGx0X2RlYnVnID0gMTsKICNlbHNlCi0jIGRlZmluZSBMVFdSQVBQRVJfREVCVUdQUklOVEYoYXJncykKK3N0YXRpYyBpbnQgbHRfZGVidWcgPSAwOwogI2VuZGlmCiAKLWNvbnN0IGNoYXIgKnByb2dyYW1fbmFtZSA9IE5VTEw7Citjb25zdCBjaGFyICpwcm9ncmFtX25hbWUgPSAibGlidG9vbC13cmFwcGVyIjsgLyogaW4gY2FzZSB4c3RyZHVwIGZhaWxzICovCiAKIHZvaWQgKnhtYWxsb2MgKHNpemVfdCBudW0pOwogY2hhciAqeHN0cmR1cCAoY29uc3QgY2hhciAqc3RyaW5nKTsKQEAgLTMyNzEsNDEgKzQyODcsMjcgQEAKIGludCBtYWtlX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIgKnBhdGgpOwogaW50IGNoZWNrX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIgKnBhdGgpOwogY2hhciAqc3RyZW5kemFwIChjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnBhdCk7Ci12b2lkIGx0X2ZhdGFsIChjb25zdCBjaGFyICptZXNzYWdlLCAuLi4pOwordm9pZCBsdF9kZWJ1Z3ByaW50ZiAoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK3ZvaWQgbHRfZmF0YWwgKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICptZXNzYWdlLCAuLi4pOworc3RhdGljIGNvbnN0IGNoYXIgKm5vbm51bGwgKGNvbnN0IGNoYXIgKnMpOworc3RhdGljIGNvbnN0IGNoYXIgKm5vbmVtcHR5IChjb25zdCBjaGFyICpzKTsKIHZvaWQgbHRfc2V0ZW52IChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSk7CiBjaGFyICpsdF9leHRlbmRfc3RyIChjb25zdCBjaGFyICpvcmlnX3ZhbHVlLCBjb25zdCBjaGFyICphZGQsIGludCB0b19lbmQpOwotdm9pZCBsdF9vcHRfcHJvY2Vzc19lbnZfc2V0IChjb25zdCBjaGFyICphcmcpOwotdm9pZCBsdF9vcHRfcHJvY2Vzc19lbnZfcHJlcGVuZCAoY29uc3QgY2hhciAqYXJnKTsKLXZvaWQgbHRfb3B0X3Byb2Nlc3NfZW52X2FwcGVuZCAoY29uc3QgY2hhciAqYXJnKTsKLWludCBsdF9zcGxpdF9uYW1lX3ZhbHVlIChjb25zdCBjaGFyICphcmcsIGNoYXIqKiBuYW1lLCBjaGFyKiogdmFsdWUpOwogdm9pZCBsdF91cGRhdGVfZXhlX3BhdGggKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKTsKIHZvaWQgbHRfdXBkYXRlX2xpYl9wYXRoIChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzY3JpcHRfdGV4dF9wYXJ0MSA9CitjaGFyICoqcHJlcGFyZV9zcGF3biAoY2hhciAqKmFyZ3YpOwordm9pZCBsdF9kdW1wX3NjcmlwdCAoRklMRSAqZik7CiBFT0YKIAotCSAgICBmdW5jX2VtaXRfd3JhcHBlcl9wYXJ0MSB5ZXMgfAotCSAgICAgICAgJFNFRCAtZSAncy9cKFtcXCJdXCkvXFxcMS9nJyBcCi0JICAgICAgICAgICAgIC1lICdzL14vICAiLycgLWUgJ3MvJC9cXG4iLycKLQkgICAgZWNobyAiOyIKIAkgICAgY2F0IDw8RU9GCi0KLXN0YXRpYyBjb25zdCBjaGFyICpzY3JpcHRfdGV4dF9wYXJ0MiA9Ci1FT0YKLQkgICAgZnVuY19lbWl0X3dyYXBwZXJfcGFydDIgeWVzIHwKLQkgICAgICAgICRTRUQgLWUgJ3MvXChbXFwiXVwpL1xcXDEvZycgXAotCSAgICAgICAgICAgICAtZSAncy9eLyAgIi8nIC1lICdzLyQvXFxuIi8nCi0JICAgIGVjaG8gIjsiCi0KLQkgICAgY2F0IDw8RU9GCi1jb25zdCBjaGFyICogTUFHSUNfRVhFID0gIiRtYWdpY19leGUiOwordm9sYXRpbGUgY29uc3QgY2hhciAqIE1BR0lDX0VYRSA9ICIkbWFnaWNfZXhlIjsKIGNvbnN0IGNoYXIgKiBMSUJfUEFUSF9WQVJOQU1FID0gIiRzaGxpYnBhdGhfdmFyIjsKIEVPRgogCiAJICAgIGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzICYmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIiAmJiB0ZXN0IC1uICIkdGVtcF9ycGF0aCI7IHRoZW4KLSAgICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhsaXN0ICIkdGVtcF9ycGF0aCIKKyAgICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGggIiR0ZW1wX3JwYXRoIgogCSAgICAgIGNhdCA8PEVPRgotY29uc3QgY2hhciAqIExJQl9QQVRIX1ZBTFVFICAgPSAiJGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQiOworY29uc3QgY2hhciAqIExJQl9QQVRIX1ZBTFVFICAgPSAiJGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdCI7CiBFT0YKIAkgICAgZWxzZQogCSAgICAgIGNhdCA8PCJFT0YiCkBAIC0zMzE0LDEwICs0MzE2LDEwIEBACiAJICAgIGZpCiAKIAkgICAgaWYgdGVzdCAtbiAiJGRsbHNlYXJjaHBhdGgiOyB0aGVuCi0gICAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRobGlzdCAiJGRsbHNlYXJjaHBhdGg6IgorICAgICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aCAiJGRsbHNlYXJjaHBhdGg6IgogCSAgICAgIGNhdCA8PEVPRgogY29uc3QgY2hhciAqIEVYRV9QQVRIX1ZBUk5BTUUgPSAiUEFUSCI7Ci1jb25zdCBjaGFyICogRVhFX1BBVEhfVkFMVUUgICA9ICIkZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdCI7Citjb25zdCBjaGFyICogRVhFX1BBVEhfVkFMVUUgICA9ICIkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IjsKIEVPRgogCSAgICBlbHNlCiAJICAgICAgY2F0IDw8IkVPRiIKQEAgLTMzNDAsMjQgKzQzNDIsMTAgQEAKIAkgICAgY2F0IDw8IkVPRiIKIAogI2RlZmluZSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWCAgICAgICAgICItLWx0LSIKLSNkZWZpbmUgTFRXUkFQUEVSX09QVElPTl9QUkVGSVhfTEVOR1RIICA1CiAKLXN0YXRpYyBjb25zdCBzaXplX3Qgb3B0X3ByZWZpeF9sZW4gICAgICAgICA9IExUV1JBUFBFUl9PUFRJT05fUFJFRklYX0xFTkdUSDsKIHN0YXRpYyBjb25zdCBjaGFyICpsdHdyYXBwZXJfb3B0aW9uX3ByZWZpeCA9IExUV1JBUFBFUl9PUFRJT05fUFJFRklYOwotCiBzdGF0aWMgY29uc3QgY2hhciAqZHVtcHNjcmlwdF9vcHQgICAgICAgPSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWCAiZHVtcC1zY3JpcHQiOwotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGVudl9zZXRfb3B0X2xlbiAgICAgPSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWF9MRU5HVEggKyA3Owotc3RhdGljIGNvbnN0IGNoYXIgKmVudl9zZXRfb3B0ICAgICAgICAgID0gTFRXUkFQUEVSX09QVElPTl9QUkVGSVggImVudi1zZXQiOwotICAvKiBhcmd1bWVudCBpcyBwdXRlbnYtc3R5bGUgImZvbz1iYXIiLCB2YWx1ZSBvZiBmb28gaXMgc2V0IHRvIGJhciAqLwotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGVudl9wcmVwZW5kX29wdF9sZW4gPSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWF9MRU5HVEggKyAxMTsKLXN0YXRpYyBjb25zdCBjaGFyICplbnZfcHJlcGVuZF9vcHQgICAgICA9IExUV1JBUFBFUl9PUFRJT05fUFJFRklYICJlbnYtcHJlcGVuZCI7Ci0gIC8qIGFyZ3VtZW50IGlzIHB1dGVudi1zdHlsZSAiZm9vPWJhciIsIG5ldyB2YWx1ZSBvZiBmb28gaXMgYmFyJHtmb299ICovCi0KLXN0YXRpYyBjb25zdCBzaXplX3QgZW52X2FwcGVuZF9vcHRfbGVuICA9IExUV1JBUFBFUl9PUFRJT05fUFJFRklYX0xFTkdUSCArIDEwOwotc3RhdGljIGNvbnN0IGNoYXIgKmVudl9hcHBlbmRfb3B0ICAgICAgID0gTFRXUkFQUEVSX09QVElPTl9QUkVGSVggImVudi1hcHBlbmQiOwotICAvKiBhcmd1bWVudCBpcyBwdXRlbnYtc3R5bGUgImZvbz1iYXIiLCBuZXcgdmFsdWUgb2YgZm9vIGlzICR7Zm9vfWJhciAqLworc3RhdGljIGNvbnN0IGNoYXIgKmRlYnVnX29wdCAgICAgICAgICAgID0gTFRXUkFQUEVSX09QVElPTl9QUkVGSVggImRlYnVnIjsKIAogaW50CiBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQpAQCAtMzM3NCwxMCArNDM2MiwxMyBAQAogICBpbnQgaTsKIAogICBwcm9ncmFtX25hbWUgPSAoY2hhciAqKSB4c3RyZHVwIChiYXNlX25hbWUgKGFyZ3ZbMF0pKTsKLSAgTFRXUkFQUEVSX0RFQlVHUFJJTlRGICgoIihtYWluKSBhcmd2WzBdICAgICAgOiAlc1xuIiwgYXJndlswXSkpOwotICBMVFdSQVBQRVJfREVCVUdQUklOVEYgKCgiKG1haW4pIHByb2dyYW1fbmFtZSA6ICVzXG4iLCBwcm9ncmFtX25hbWUpKTsKKyAgbmV3YXJneiA9IFhNQUxMT0MgKGNoYXIgKiwgYXJnYyArIDEpOwogCi0gIC8qIHZlcnkgc2ltcGxlIGFyZyBwYXJzaW5nOyBkb24ndCB3YW50IHRvIHJlbHkgb24gZ2V0b3B0ICovCisgIC8qIHZlcnkgc2ltcGxlIGFyZyBwYXJzaW5nOyBkb24ndCB3YW50IHRvIHJlbHkgb24gZ2V0b3B0CisgICAqIGFsc28sIGNvcHkgYWxsIG5vbiBjd3JhcHBlciBvcHRpb25zIHRvIG5ld2FyZ3osIGV4Y2VwdAorICAgKiBhcmd6WzBdLCB3aGljaCBpcyBoYW5kbGVkIGRpZmZlcmVudGx5CisgICAqLworICBuZXdhcmdjPTA7CiAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCiAgICAgewogICAgICAgaWYgKHN0cmNtcCAoYXJndltpXSwgZHVtcHNjcmlwdF9vcHQpID09IDApCkBAIC0zMzkxLDI1ICs0MzgyLDU3IEBACiAJICAgICAgZXNhYwogCiAJICAgIGNhdCA8PCJFT0YiCi0JICBwcmludGYgKCIlcyIsIHNjcmlwdF90ZXh0X3BhcnQxKTsKLQkgIHByaW50ZiAoIiVzIiwgc2NyaXB0X3RleHRfcGFydDIpOworCSAgbHRfZHVtcF9zY3JpcHQgKHN0ZG91dCk7CiAJICByZXR1cm4gMDsKIAl9CisgICAgICBpZiAoc3RyY21wIChhcmd2W2ldLCBkZWJ1Z19vcHQpID09IDApCisJeworICAgICAgICAgIGx0X2RlYnVnID0gMTsKKyAgICAgICAgICBjb250aW51ZTsKKwl9CisgICAgICBpZiAoc3RyY21wIChhcmd2W2ldLCBsdHdyYXBwZXJfb3B0aW9uX3ByZWZpeCkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIC8qIGhvd2V2ZXIsIGlmIHRoZXJlIGlzIGFuIG9wdGlvbiBpbiB0aGUgTFRXUkFQUEVSX09QVElPTl9QUkVGSVgKKyAgICAgICAgICAgICBuYW1lc3BhY2UsIGJ1dCBpdCBpcyBub3Qgb25lIG9mIHRoZSBvbmVzIHdlIGtub3cgYWJvdXQgYW5kCisgICAgICAgICAgICAgaGF2ZSBhbHJlYWR5IGRlYWx0IHdpdGgsIGFib3ZlIChpbmx1ZGluZyBkdW1wLXNjcmlwdCksIHRoZW4KKyAgICAgICAgICAgICByZXBvcnQgYW4gZXJyb3IuIE90aGVyd2lzZSwgdGFyZ2V0cyBtaWdodCBiZWdpbiB0byBiZWxpZXZlCisgICAgICAgICAgICAgdGhleSBhcmUgYWxsb3dlZCB0byB1c2Ugb3B0aW9ucyBpbiB0aGUgTFRXUkFQUEVSX09QVElPTl9QUkVGSVgKKyAgICAgICAgICAgICBuYW1lc3BhY2UuIFRoZSBmaXJzdCB0aW1lIGFueSB1c2VyIGNvbXBsYWlucyBhYm91dCB0aGlzLCB3ZSdsbAorICAgICAgICAgICAgIG5lZWQgdG8gbWFrZSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWCBhIGNvbmZpZ3VyZS10aW1lIG9wdGlvbgorICAgICAgICAgICAgIG9yIGEgY29uZmlndXJlLmFjLXNldHRhYmxlIHZhbHVlLgorICAgICAgICAgICAqLworICAgICAgICAgIGx0X2ZhdGFsIChfX0ZJTEVfXywgX19MSU5FX18sCisJCSAgICAidW5yZWNvZ25pemVkICVzIG9wdGlvbjogJyVzJyIsCisgICAgICAgICAgICAgICAgICAgIGx0d3JhcHBlcl9vcHRpb25fcHJlZml4LCBhcmd2W2ldKTsKKyAgICAgICAgfQorICAgICAgLyogb3RoZXJ3aXNlIC4uLiAqLworICAgICAgbmV3YXJnelsrK25ld2FyZ2NdID0geHN0cmR1cCAoYXJndltpXSk7CiAgICAgfQorICBuZXdhcmd6WysrbmV3YXJnY10gPSBOVUxMOwogCi0gIG5ld2FyZ3ogPSBYTUFMTE9DIChjaGFyICosIGFyZ2MgKyAxKTsKK0VPRgorCSAgICBjYXQgPDxFT0YKKyAgLyogVGhlIEdOVSBiYW5uZXIgbXVzdCBiZSB0aGUgZmlyc3Qgbm9uLWVycm9yIGRlYnVnIG1lc3NhZ2UgKi8KKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywgImxpYnRvb2wgd3JhcHBlciAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT05cbiIpOworRU9GCisJICAgIGNhdCA8PCJFT0YiCisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sICIobWFpbikgYXJndlswXTogJXNcbiIsIGFyZ3ZbMF0pOworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLCAiKG1haW4pIHByb2dyYW1fbmFtZTogJXNcbiIsIHByb2dyYW1fbmFtZSk7CisKICAgdG1wX3BhdGhzcGVjID0gZmluZF9leGVjdXRhYmxlIChhcmd2WzBdKTsKICAgaWYgKHRtcF9wYXRoc3BlYyA9PSBOVUxMKQotICAgIGx0X2ZhdGFsICgiQ291bGRuJ3QgZmluZCAlcyIsIGFyZ3ZbMF0pOwotICBMVFdSQVBQRVJfREVCVUdQUklOVEYgKCgiKG1haW4pIGZvdW5kIGV4ZSAoYmVmb3JlIHN5bWxpbmsgY2hhc2UpIGF0IDogJXNcbiIsCi0JCQkgIHRtcF9wYXRoc3BlYykpOworICAgIGx0X2ZhdGFsIChfX0ZJTEVfXywgX19MSU5FX18sICJjb3VsZG4ndCBmaW5kICVzIiwgYXJndlswXSk7CisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAiKG1haW4pIGZvdW5kIGV4ZSAoYmVmb3JlIHN5bWxpbmsgY2hhc2UpIGF0OiAlc1xuIiwKKwkJICB0bXBfcGF0aHNwZWMpOwogCiAgIGFjdHVhbF9jd3JhcHBlcl9wYXRoID0gY2hhc2Vfc3ltbGlua3MgKHRtcF9wYXRoc3BlYyk7Ci0gIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobWFpbikgZm91bmQgZXhlIChhZnRlciBzeW1saW5rIGNoYXNlKSBhdCA6ICVzXG4iLAotCQkJICBhY3R1YWxfY3dyYXBwZXJfcGF0aCkpOworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgIihtYWluKSBmb3VuZCBleGUgKGFmdGVyIHN5bWxpbmsgY2hhc2UpIGF0OiAlc1xuIiwKKwkJICBhY3R1YWxfY3dyYXBwZXJfcGF0aCk7CiAgIFhGUkVFICh0bXBfcGF0aHNwZWMpOwogCi0gIGFjdHVhbF9jd3JhcHBlcl9uYW1lID0geHN0cmR1cCggYmFzZV9uYW1lIChhY3R1YWxfY3dyYXBwZXJfcGF0aCkpOworICBhY3R1YWxfY3dyYXBwZXJfbmFtZSA9IHhzdHJkdXAgKGJhc2VfbmFtZSAoYWN0dWFsX2N3cmFwcGVyX3BhdGgpKTsKICAgc3RyZW5kemFwIChhY3R1YWxfY3dyYXBwZXJfcGF0aCwgYWN0dWFsX2N3cmFwcGVyX25hbWUpOwogCiAgIC8qIHdyYXBwZXIgbmFtZSB0cmFuc2Zvcm1zICovCkBAIC0zNDI3LDggKzQ0NTAsOSBAQAogICB0YXJnZXRfbmFtZSA9IHRtcF9wYXRoc3BlYzsKICAgdG1wX3BhdGhzcGVjID0gMDsKIAotICBMVFdSQVBQRVJfREVCVUdQUklOVEYgKCgiKG1haW4pIGxpYnRvb2wgdGFyZ2V0IG5hbWU6ICVzXG4iLAotCQkJICB0YXJnZXRfbmFtZSkpOworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLAorCQkgICIobWFpbikgbGlidG9vbCB0YXJnZXQgbmFtZTogJXNcbiIsCisJCSAgdGFyZ2V0X25hbWUpOwogRU9GCiAKIAkgICAgY2F0IDw8RU9GCkBAIC0zNDc4LDgwICs0NTAyLDE5IEBACiAKICAgbHRfc2V0ZW52ICgiQklOX1NIIiwgInhwZzQiKTsgLyogZm9yIFRydTY0ICovCiAgIGx0X3NldGVudiAoIkRVQUxDQVNFIiwgIjEiKTsgIC8qIGZvciBNU0sgc2ggKi8KLSAgbHRfdXBkYXRlX2xpYl9wYXRoIChMSUJfUEFUSF9WQVJOQU1FLCBMSUJfUEFUSF9WQUxVRSk7CisgIC8qIFVwZGF0ZSB0aGUgRExMIHNlYXJjaHBhdGguICBFWEVfUEFUSF9WQUxVRSAoJGRsbHNlYXJjaHBhdGgpIG11c3QKKyAgICAgYmUgcHJlcGVuZGVkIGJlZm9yZSAodGhhdCBpcywgYXBwZWFyIGFmdGVyKSBMSUJfUEFUSF9WQUxVRSAoJHRlbXBfcnBhdGgpCisgICAgIGJlY2F1c2Ugb24gV2luZG93cywgYm90aCAqX1ZBUk5BTUVzIGFyZSBQQVRIIGJ1dCB1bmluc3RhbGxlZAorICAgICBsaWJyYXJpZXMgbXVzdCBjb21lIGZpcnN0LiAqLwogICBsdF91cGRhdGVfZXhlX3BhdGggKEVYRV9QQVRIX1ZBUk5BTUUsIEVYRV9QQVRIX1ZBTFVFKTsKKyAgbHRfdXBkYXRlX2xpYl9wYXRoIChMSUJfUEFUSF9WQVJOQU1FLCBMSUJfUEFUSF9WQUxVRSk7CiAKLSAgbmV3YXJnYz0wOwotICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzdHJuY21wIChhcmd2W2ldLCBlbnZfc2V0X29wdCwgZW52X3NldF9vcHRfbGVuKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGFyZ3ZbaV1bZW52X3NldF9vcHRfbGVuXSA9PSAnPScpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBhcmd2W2ldICsgZW52X3NldF9vcHRfbGVuICsgMTsKLSAgICAgICAgICAgICAgbHRfb3B0X3Byb2Nlc3NfZW52X3NldCAocCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoYXJndltpXVtlbnZfc2V0X29wdF9sZW5dID09ICdcMCcgJiYgaSArIDEgPCBhcmdjKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBsdF9vcHRfcHJvY2Vzc19lbnZfc2V0IChhcmd2WysraV0pOyAvKiBkb24ndCBjb3B5ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgbHRfZmF0YWwgKCIlcyBtaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50IiwgZW52X3NldF9vcHQpOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICBpZiAoc3RybmNtcCAoYXJndltpXSwgZW52X3ByZXBlbmRfb3B0LCBlbnZfcHJlcGVuZF9vcHRfbGVuKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGFyZ3ZbaV1bZW52X3ByZXBlbmRfb3B0X2xlbl0gPT0gJz0nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjb25zdCBjaGFyICpwID0gYXJndltpXSArIGVudl9wcmVwZW5kX29wdF9sZW4gKyAxOwotICAgICAgICAgICAgICBsdF9vcHRfcHJvY2Vzc19lbnZfcHJlcGVuZCAocCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoYXJndltpXVtlbnZfcHJlcGVuZF9vcHRfbGVuXSA9PSAnXDAnICYmIGkgKyAxIDwgYXJnYykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbHRfb3B0X3Byb2Nlc3NfZW52X3ByZXBlbmQgKGFyZ3ZbKytpXSk7IC8qIGRvbid0IGNvcHkgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBsdF9mYXRhbCAoIiVzIG1pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnQiLCBlbnZfcHJlcGVuZF9vcHQpOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICBpZiAoc3RybmNtcCAoYXJndltpXSwgZW52X2FwcGVuZF9vcHQsIGVudl9hcHBlbmRfb3B0X2xlbikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChhcmd2W2ldW2Vudl9hcHBlbmRfb3B0X2xlbl0gPT0gJz0nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjb25zdCBjaGFyICpwID0gYXJndltpXSArIGVudl9hcHBlbmRfb3B0X2xlbiArIDE7Ci0gICAgICAgICAgICAgIGx0X29wdF9wcm9jZXNzX2Vudl9hcHBlbmQgKHApOwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKGFyZ3ZbaV1bZW52X2FwcGVuZF9vcHRfbGVuXSA9PSAnXDAnICYmIGkgKyAxIDwgYXJnYykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbHRfb3B0X3Byb2Nlc3NfZW52X2FwcGVuZCAoYXJndlsrK2ldKTsgLyogZG9uJ3QgY29weSAqLwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGx0X2ZhdGFsICgiJXMgbWlzc2luZyByZXF1aXJlZCBhcmd1bWVudCIsIGVudl9hcHBlbmRfb3B0KTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgaWYgKHN0cm5jbXAgKGFyZ3ZbaV0sIGx0d3JhcHBlcl9vcHRpb25fcHJlZml4LCBvcHRfcHJlZml4X2xlbikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIC8qIGhvd2V2ZXIsIGlmIHRoZXJlIGlzIGFuIG9wdGlvbiBpbiB0aGUgTFRXUkFQUEVSX09QVElPTl9QUkVGSVgKLSAgICAgICAgICAgICBuYW1lc3BhY2UsIGJ1dCBpdCBpcyBub3Qgb25lIG9mIHRoZSBvbmVzIHdlIGtub3cgYWJvdXQgYW5kCi0gICAgICAgICAgICAgaGF2ZSBhbHJlYWR5IGRlYWx0IHdpdGgsIGFib3ZlIChpbmx1ZGluZyBkdW1wLXNjcmlwdCksIHRoZW4KLSAgICAgICAgICAgICByZXBvcnQgYW4gZXJyb3IuIE90aGVyd2lzZSwgdGFyZ2V0cyBtaWdodCBiZWdpbiB0byBiZWxpZXZlCi0gICAgICAgICAgICAgdGhleSBhcmUgYWxsb3dlZCB0byB1c2Ugb3B0aW9ucyBpbiB0aGUgTFRXUkFQUEVSX09QVElPTl9QUkVGSVgKLSAgICAgICAgICAgICBuYW1lc3BhY2UuIFRoZSBmaXJzdCB0aW1lIGFueSB1c2VyIGNvbXBsYWlucyBhYm91dCB0aGlzLCB3ZSdsbAotICAgICAgICAgICAgIG5lZWQgdG8gbWFrZSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWCBhIGNvbmZpZ3VyZS10aW1lIG9wdGlvbgotICAgICAgICAgICAgIG9yIGEgY29uZmlndXJlLmFjLXNldHRhYmxlIHZhbHVlLgotICAgICAgICAgICAqLwotICAgICAgICAgIGx0X2ZhdGFsICgiVW5yZWNvZ25pemVkIG9wdGlvbiBpbiAlcyBuYW1lc3BhY2U6ICclcyciLAotICAgICAgICAgICAgICAgICAgICBsdHdyYXBwZXJfb3B0aW9uX3ByZWZpeCwgYXJndltpXSk7Ci0gICAgICAgIH0KLSAgICAgIC8qIG90aGVyd2lzZSAuLi4gKi8KLSAgICAgIG5ld2FyZ3pbKytuZXdhcmdjXSA9IHhzdHJkdXAgKGFyZ3ZbaV0pOwotICAgIH0KLSAgbmV3YXJnelsrK25ld2FyZ2NdID0gTlVMTDsKLQotICBMVFdSQVBQRVJfREVCVUdQUklOVEYgICAgICgoIihtYWluKSBsdF9hcmd2X3plcm8gOiAlc1xuIiwgKGx0X2FyZ3ZfemVybyA/IGx0X2FyZ3ZfemVybyA6ICI8TlVMTD4iKSkpOworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLCAiKG1haW4pIGx0X2FyZ3ZfemVybzogJXNcbiIsCisJCSAgbm9ubnVsbCAobHRfYXJndl96ZXJvKSk7CiAgIGZvciAoaSA9IDA7IGkgPCBuZXdhcmdjOyBpKyspCiAgICAgewotICAgICAgTFRXUkFQUEVSX0RFQlVHUFJJTlRGICgoIihtYWluKSBuZXdhcmd6WyVkXSAgIDogJXNcbiIsIGksIChuZXdhcmd6W2ldID8gbmV3YXJneltpXSA6ICI8TlVMTD4iKSkpOworICAgICAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywgIihtYWluKSBuZXdhcmd6WyVkXTogJXNcbiIsCisJCSAgICAgIGksIG5vbm51bGwgKG5ld2FyZ3pbaV0pKTsKICAgICB9CiAKIEVPRgpAQCAtMzU2MCwxMSArNDUyMywxNCBAQAogCSAgICAgIG1pbmd3KikKIAkJY2F0IDw8IkVPRiIKICAgLyogZXhlY3YgZG9lc24ndCBhY3R1YWxseSB3b3JrIG9uIG1pbmd3IGFzIGV4cGVjdGVkIG9uIHVuaXggKi8KKyAgbmV3YXJneiA9IHByZXBhcmVfc3Bhd24gKG5ld2FyZ3opOwogICBydmFsID0gX3NwYXdudiAoX1BfV0FJVCwgbHRfYXJndl96ZXJvLCAoY29uc3QgY2hhciAqIGNvbnN0ICopIG5ld2FyZ3opOwogICBpZiAocnZhbCA9PSAtMSkKICAgICB7CiAgICAgICAvKiBmYWlsZWQgdG8gc3RhcnQgcHJvY2VzcyAqLwotICAgICAgTFRXUkFQUEVSX0RFQlVHUFJJTlRGICgoIihtYWluKSBmYWlsZWQgdG8gbGF1bmNoIHRhcmdldCBcIiVzXCI6IGVycm5vID0gJWRcbiIsIGx0X2FyZ3ZfemVybywgZXJybm8pKTsKKyAgICAgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sCisJCSAgICAgICIobWFpbikgZmFpbGVkIHRvIGxhdW5jaCB0YXJnZXQgXCIlc1wiOiAlc1xuIiwKKwkJICAgICAgbHRfYXJndl96ZXJvLCBub25udWxsIChzdHJlcnJvciAoZXJybm8pKSk7CiAgICAgICByZXR1cm4gMTI3OwogICAgIH0KICAgcmV0dXJuIHJ2YWw7CkBAIC0zNTg2LDcgKzQ1NTIsNyBAQAogewogICB2b2lkICpwID0gKHZvaWQgKikgbWFsbG9jIChudW0pOwogICBpZiAoIXApCi0gICAgbHRfZmF0YWwgKCJNZW1vcnkgZXhoYXVzdGVkIik7CisgICAgbHRfZmF0YWwgKF9fRklMRV9fLCBfX0xJTkVfXywgIm1lbW9yeSBleGhhdXN0ZWQiKTsKIAogICByZXR1cm4gcDsKIH0KQEAgLTM2MjAsOCArNDU4Niw4IEBACiB7CiAgIHN0cnVjdCBzdGF0IHN0OwogCi0gIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIoY2hlY2tfZXhlY3V0YWJsZSkgIDogJXNcbiIsCi0JCQkgIHBhdGggPyAoKnBhdGggPyBwYXRoIDogIkVNUFRZISIpIDogIk5VTEwhIikpOworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLCAiKGNoZWNrX2V4ZWN1dGFibGUpOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIG5vbmVtcHR5IChwYXRoKSk7CiAgIGlmICgoIXBhdGgpIHx8ICghKnBhdGgpKQogICAgIHJldHVybiAwOwogCkBAIC0zNjM4LDggKzQ2MDQsOCBAQAogICBpbnQgcnZhbCA9IDA7CiAgIHN0cnVjdCBzdGF0IHN0OwogCi0gIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobWFrZV9leGVjdXRhYmxlKSAgIDogJXNcbiIsCi0JCQkgIHBhdGggPyAoKnBhdGggPyBwYXRoIDogIkVNUFRZISIpIDogIk5VTEwhIikpOworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLCAiKG1ha2VfZXhlY3V0YWJsZSk6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgbm9uZW1wdHkgKHBhdGgpKTsKICAgaWYgKCghcGF0aCkgfHwgKCEqcGF0aCkpCiAgICAgcmV0dXJuIDA7CiAKQEAgLTM2NjUsOCArNDYzMSw4IEBACiAgIGludCB0bXBfbGVuOwogICBjaGFyICpjb25jYXRfbmFtZTsKIAotICBMVFdSQVBQRVJfREVCVUdQUklOVEYgKCgiKGZpbmRfZXhlY3V0YWJsZSkgICA6ICVzXG4iLAotCQkJICB3cmFwcGVyID8gKCp3cmFwcGVyID8gd3JhcHBlciA6ICJFTVBUWSEiKSA6ICJOVUxMISIpKTsKKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywgIihmaW5kX2V4ZWN1dGFibGUpOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIG5vbmVtcHR5ICh3cmFwcGVyKSk7CiAKICAgaWYgKCh3cmFwcGVyID09IE5VTEwpIHx8ICgqd3JhcHBlciA9PSAnXDAnKSkKICAgICByZXR1cm4gTlVMTDsKQEAgLTM3MTksNyArNDY4NSw4IEBACiAJCXsKIAkJICAvKiBlbXB0eSBwYXRoOiBjdXJyZW50IGRpcmVjdG9yeSAqLwogCQkgIGlmIChnZXRjd2QgKHRtcCwgTFRfUEFUSE1BWCkgPT0gTlVMTCkKLQkJICAgIGx0X2ZhdGFsICgiZ2V0Y3dkIGZhaWxlZCIpOworCQkgICAgbHRfZmF0YWwgKF9fRklMRV9fLCBfX0xJTkVfXywgImdldGN3ZCBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbm51bGwgKHN0cmVycm9yIChlcnJubykpKTsKIAkJICB0bXBfbGVuID0gc3RybGVuICh0bXApOwogCQkgIGNvbmNhdF9uYW1lID0KIAkJICAgIFhNQUxMT0MgKGNoYXIsIHRtcF9sZW4gKyAxICsgc3RybGVuICh3cmFwcGVyKSArIDEpOwpAQCAtMzc0NCw3ICs0NzExLDggQEAKICAgICB9CiAgIC8qIFJlbGF0aXZlIHBhdGggfCBub3QgZm91bmQgaW4gcGF0aDogcHJlcGVuZCBjd2QgKi8KICAgaWYgKGdldGN3ZCAodG1wLCBMVF9QQVRITUFYKSA9PSBOVUxMKQotICAgIGx0X2ZhdGFsICgiZ2V0Y3dkIGZhaWxlZCIpOworICAgIGx0X2ZhdGFsIChfX0ZJTEVfXywgX19MSU5FX18sICJnZXRjd2QgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICAgIG5vbm51bGwgKHN0cmVycm9yIChlcnJubykpKTsKICAgdG1wX2xlbiA9IHN0cmxlbiAodG1wKTsKICAgY29uY2F0X25hbWUgPSBYTUFMTE9DIChjaGFyLCB0bXBfbGVuICsgMSArIHN0cmxlbiAod3JhcHBlcikgKyAxKTsKICAgbWVtY3B5IChjb25jYXRfbmFtZSwgdG1wLCB0bXBfbGVuKTsKQEAgLTM3NzAsOCArNDczOCw5IEBACiAgIGludCBoYXNfc3ltbGlua3MgPSAwOwogICB3aGlsZSAoc3RybGVuICh0bXBfcGF0aHNwZWMpICYmICFoYXNfc3ltbGlua3MpCiAgICAgewotICAgICAgTFRXUkFQUEVSX0RFQlVHUFJJTlRGICgoImNoZWNraW5nIHBhdGggY29tcG9uZW50IGZvciBzeW1saW5rczogJXNcbiIsCi0JCQkgICAgICB0bXBfcGF0aHNwZWMpKTsKKyAgICAgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sCisJCSAgICAgICJjaGVja2luZyBwYXRoIGNvbXBvbmVudCBmb3Igc3ltbGlua3M6ICVzXG4iLAorCQkgICAgICB0bXBfcGF0aHNwZWMpOwogICAgICAgaWYgKGxzdGF0ICh0bXBfcGF0aHNwZWMsICZzKSA9PSAwKQogCXsKIAkgIGlmIChTX0lTTE5LIChzLnN0X21vZGUpICE9IDApCkBAIC0zNzkzLDggKzQ3NjIsOSBAQAogCX0KICAgICAgIGVsc2UKIAl7Ci0JICBjaGFyICplcnJzdHIgPSBzdHJlcnJvciAoZXJybm8pOwotCSAgbHRfZmF0YWwgKCJFcnJvciBhY2Nlc3NpbmcgZmlsZSAlcyAoJXMpIiwgdG1wX3BhdGhzcGVjLCBlcnJzdHIpOworCSAgbHRfZmF0YWwgKF9fRklMRV9fLCBfX0xJTkVfXywKKwkJICAgICJlcnJvciBhY2Nlc3NpbmcgZmlsZSBcIiVzXCI6ICVzIiwKKwkJICAgIHRtcF9wYXRoc3BlYywgbm9ubnVsbCAoc3RyZXJyb3IgKGVycm5vKSkpOwogCX0KICAgICB9CiAgIFhGUkVFICh0bXBfcGF0aHNwZWMpOwpAQCAtMzgwNyw3ICs0Nzc3LDggQEAKICAgdG1wX3BhdGhzcGVjID0gcmVhbHBhdGggKHBhdGhzcGVjLCBidWYpOwogICBpZiAodG1wX3BhdGhzcGVjID09IDApCiAgICAgewotICAgICAgbHRfZmF0YWwgKCJDb3VsZCBub3QgZm9sbG93IHN5bWxpbmtzIGZvciAlcyIsIHBhdGhzcGVjKTsKKyAgICAgIGx0X2ZhdGFsIChfX0ZJTEVfXywgX19MSU5FX18sCisJCSJjb3VsZCBub3QgZm9sbG93IHN5bWxpbmtzIGZvciAlcyIsIHBhdGhzcGVjKTsKICAgICB9CiAgIHJldHVybiB4c3RyZHVwICh0bXBfcGF0aHNwZWMpOwogI2VuZGlmCkBAIC0zODMzLDExICs0ODA0LDI1IEBACiAgIHJldHVybiBzdHI7CiB9CiAKK3ZvaWQKK2x0X2RlYnVncHJpbnRmIChjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgaWYgKGx0X2RlYnVnKQorICAgIHsKKyAgICAgICh2b2lkKSBmcHJpbnRmIChzdGRlcnIsICIlczolczolZDogIiwgcHJvZ3JhbV9uYW1lLCBmaWxlLCBsaW5lKTsKKyAgICAgIHZhX3N0YXJ0IChhcmdzLCBmbXQpOworICAgICAgKHZvaWQpIHZmcHJpbnRmIChzdGRlcnIsIGZtdCwgYXJncyk7CisgICAgICB2YV9lbmQgKGFyZ3MpOworICAgIH0KK30KKwogc3RhdGljIHZvaWQKLWx0X2Vycm9yX2NvcmUgKGludCBleGl0X3N0YXR1cywgY29uc3QgY2hhciAqbW9kZSwKK2x0X2Vycm9yX2NvcmUgKGludCBleGl0X3N0YXR1cywgY29uc3QgY2hhciAqZmlsZSwKKwkgICAgICAgaW50IGxpbmUsIGNvbnN0IGNoYXIgKm1vZGUsCiAJICAgICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIHZhX2xpc3QgYXApCiB7Ci0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlczogIiwgcHJvZ3JhbV9uYW1lLCBtb2RlKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXM6JWQ6ICVzOiAiLCBwcm9ncmFtX25hbWUsIGZpbGUsIGxpbmUsIG1vZGUpOwogICB2ZnByaW50ZiAoc3RkZXJyLCBtZXNzYWdlLCBhcCk7CiAgIGZwcmludGYgKHN0ZGVyciwgIi5cbiIpOwogCkBAIC0zODQ2LDIwICs0ODMxLDMyIEBACiB9CiAKIHZvaWQKLWx0X2ZhdGFsIChjb25zdCBjaGFyICptZXNzYWdlLCAuLi4pCitsdF9mYXRhbCAoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIC4uLikKIHsKICAgdmFfbGlzdCBhcDsKICAgdmFfc3RhcnQgKGFwLCBtZXNzYWdlKTsKLSAgbHRfZXJyb3JfY29yZSAoRVhJVF9GQUlMVVJFLCAiRkFUQUwiLCBtZXNzYWdlLCBhcCk7CisgIGx0X2Vycm9yX2NvcmUgKEVYSVRfRkFJTFVSRSwgZmlsZSwgbGluZSwgIkZBVEFMIiwgbWVzc2FnZSwgYXApOwogICB2YV9lbmQgKGFwKTsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKgorbm9ubnVsbCAoY29uc3QgY2hhciAqcykKK3sKKyAgcmV0dXJuIHMgPyBzIDogIihudWxsKSI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK25vbmVtcHR5IChjb25zdCBjaGFyICpzKQoreworICByZXR1cm4gKHMgJiYgISpzKSA/ICIoZW1wdHkpIiA6IG5vbm51bGwgKHMpOworfQorCiB2b2lkCiBsdF9zZXRlbnYgKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQogewotICBMVFdSQVBQRVJfREVCVUdQUklOVEYgKCgiKGx0X3NldGVudikgc2V0dGluZyAnJXMnIHRvICclcydcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lID8gbmFtZSA6ICI8TlVMTD4iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlID8gdmFsdWUgOiAiPE5VTEw+IikpKTsKKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywKKwkJICAiKGx0X3NldGVudikgc2V0dGluZyAnJXMnIHRvICclcydcbiIsCisgICAgICAgICAgICAgICAgICBub25udWxsIChuYW1lKSwgbm9ubnVsbCAodmFsdWUpKTsKICAgewogI2lmZGVmIEhBVkVfU0VURU5WCiAgICAgLyogYWx3YXlzIG1ha2UgYSBjb3B5LCBmb3IgY29uc2lzdGVuY3kgd2l0aCAhSEFWRV9TRVRFTlYgKi8KQEAgLTM5MDQsOTUgKzQ5MDEsMTIgQEAKICAgcmV0dXJuIG5ld192YWx1ZTsKIH0KIAotaW50Ci1sdF9zcGxpdF9uYW1lX3ZhbHVlIChjb25zdCBjaGFyICphcmcsIGNoYXIqKiBuYW1lLCBjaGFyKiogdmFsdWUpCi17Ci0gIGNvbnN0IGNoYXIgKnA7Ci0gIGludCBsZW47Ci0gIGlmICghYXJnIHx8ICEqYXJnKQotICAgIHJldHVybiAxOwotCi0gIHAgPSBzdHJjaHIgKGFyZywgKGludCknPScpOwotCi0gIGlmICghcCkKLSAgICByZXR1cm4gMTsKLQotICAqdmFsdWUgPSB4c3RyZHVwICgrK3ApOwotCi0gIGxlbiA9IHN0cmxlbiAoYXJnKSAtIHN0cmxlbiAoKnZhbHVlKTsKLSAgKm5hbWUgPSBYTUFMTE9DIChjaGFyLCBsZW4pOwotICBzdHJuY3B5ICgqbmFtZSwgYXJnLCBsZW4tMSk7Ci0gICgqbmFtZSlbbGVuIC0gMV0gPSAnXDAnOwotCi0gIHJldHVybiAwOwotfQotCi12b2lkCi1sdF9vcHRfcHJvY2Vzc19lbnZfc2V0IChjb25zdCBjaGFyICphcmcpCi17Ci0gIGNoYXIgKm5hbWUgPSBOVUxMOwotICBjaGFyICp2YWx1ZSA9IE5VTEw7Ci0KLSAgaWYgKGx0X3NwbGl0X25hbWVfdmFsdWUgKGFyZywgJm5hbWUsICZ2YWx1ZSkgIT0gMCkKLSAgICB7Ci0gICAgICBYRlJFRSAobmFtZSk7Ci0gICAgICBYRlJFRSAodmFsdWUpOwotICAgICAgbHRfZmF0YWwgKCJiYWQgYXJndW1lbnQgZm9yICVzOiAnJXMnIiwgZW52X3NldF9vcHQsIGFyZyk7Ci0gICAgfQotCi0gIGx0X3NldGVudiAobmFtZSwgdmFsdWUpOwotICBYRlJFRSAobmFtZSk7Ci0gIFhGUkVFICh2YWx1ZSk7Ci19Ci0KLXZvaWQKLWx0X29wdF9wcm9jZXNzX2Vudl9wcmVwZW5kIChjb25zdCBjaGFyICphcmcpCi17Ci0gIGNoYXIgKm5hbWUgPSBOVUxMOwotICBjaGFyICp2YWx1ZSA9IE5VTEw7Ci0gIGNoYXIgKm5ld192YWx1ZSA9IE5VTEw7Ci0KLSAgaWYgKGx0X3NwbGl0X25hbWVfdmFsdWUgKGFyZywgJm5hbWUsICZ2YWx1ZSkgIT0gMCkKLSAgICB7Ci0gICAgICBYRlJFRSAobmFtZSk7Ci0gICAgICBYRlJFRSAodmFsdWUpOwotICAgICAgbHRfZmF0YWwgKCJiYWQgYXJndW1lbnQgZm9yICVzOiAnJXMnIiwgZW52X3ByZXBlbmRfb3B0LCBhcmcpOwotICAgIH0KLQotICBuZXdfdmFsdWUgPSBsdF9leHRlbmRfc3RyIChnZXRlbnYgKG5hbWUpLCB2YWx1ZSwgMCk7Ci0gIGx0X3NldGVudiAobmFtZSwgbmV3X3ZhbHVlKTsKLSAgWEZSRUUgKG5ld192YWx1ZSk7Ci0gIFhGUkVFIChuYW1lKTsKLSAgWEZSRUUgKHZhbHVlKTsKLX0KLQotdm9pZAotbHRfb3B0X3Byb2Nlc3NfZW52X2FwcGVuZCAoY29uc3QgY2hhciAqYXJnKQotewotICBjaGFyICpuYW1lID0gTlVMTDsKLSAgY2hhciAqdmFsdWUgPSBOVUxMOwotICBjaGFyICpuZXdfdmFsdWUgPSBOVUxMOwotCi0gIGlmIChsdF9zcGxpdF9uYW1lX3ZhbHVlIChhcmcsICZuYW1lLCAmdmFsdWUpICE9IDApCi0gICAgewotICAgICAgWEZSRUUgKG5hbWUpOwotICAgICAgWEZSRUUgKHZhbHVlKTsKLSAgICAgIGx0X2ZhdGFsICgiYmFkIGFyZ3VtZW50IGZvciAlczogJyVzJyIsIGVudl9hcHBlbmRfb3B0LCBhcmcpOwotICAgIH0KLQotICBuZXdfdmFsdWUgPSBsdF9leHRlbmRfc3RyIChnZXRlbnYgKG5hbWUpLCB2YWx1ZSwgMSk7Ci0gIGx0X3NldGVudiAobmFtZSwgbmV3X3ZhbHVlKTsKLSAgWEZSRUUgKG5ld192YWx1ZSk7Ci0gIFhGUkVFIChuYW1lKTsKLSAgWEZSRUUgKHZhbHVlKTsKLX0KLQogdm9pZAogbHRfdXBkYXRlX2V4ZV9wYXRoIChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKIHsKLSAgTFRXUkFQUEVSX0RFQlVHUFJJTlRGICgoIihsdF91cGRhdGVfZXhlX3BhdGgpIG1vZGlmeWluZyAnJXMnIGJ5IHByZXBlbmRpbmcgJyVzJ1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWUgPyBuYW1lIDogIjxOVUxMPiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUgPyB2YWx1ZSA6ICI8TlVMTD4iKSkpOworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLAorCQkgICIobHRfdXBkYXRlX2V4ZV9wYXRoKSBtb2RpZnlpbmcgJyVzJyBieSBwcmVwZW5kaW5nICclcydcbiIsCisgICAgICAgICAgICAgICAgICBub25udWxsIChuYW1lKSwgbm9ubnVsbCAodmFsdWUpKTsKIAogICBpZiAobmFtZSAmJiAqbmFtZSAmJiB2YWx1ZSAmJiAqdmFsdWUpCiAgICAgewpAQCAtNDAxMSw5ICs0OTI1LDkgQEAKIHZvaWQKIGx0X3VwZGF0ZV9saWJfcGF0aCAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCiB7Ci0gIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobHRfdXBkYXRlX2xpYl9wYXRoKSBtb2RpZnlpbmcgJyVzJyBieSBwcmVwZW5kaW5nICclcydcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lID8gbmFtZSA6ICI8TlVMTD4iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlID8gdmFsdWUgOiAiPE5VTEw+IikpKTsKKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywKKwkJICAiKGx0X3VwZGF0ZV9saWJfcGF0aCkgbW9kaWZ5aW5nICclcycgYnkgcHJlcGVuZGluZyAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgbm9ubnVsbCAobmFtZSksIG5vbm51bGwgKHZhbHVlKSk7CiAKICAgaWYgKG5hbWUgJiYgKm5hbWUgJiYgdmFsdWUgJiYgKnZhbHVlKQogICAgIHsKQEAgLTQwMjMsMTEgKzQ5MzcsMTU4IEBACiAgICAgfQogfQogCitFT0YKKwkgICAgY2FzZSAkaG9zdF9vcyBpbgorCSAgICAgIG1pbmd3KikKKwkJY2F0IDw8IkVPRiIKIAorLyogUHJlcGFyZXMgYW4gYXJndW1lbnQgdmVjdG9yIGJlZm9yZSBjYWxsaW5nIHNwYXduKCkuCisgICBOb3RlIHRoYXQgc3Bhd24oKSBkb2VzIG5vdCBieSBpdHNlbGYgY2FsbCB0aGUgY29tbWFuZCBpbnRlcnByZXRlcgorICAgICAoZ2V0ZW52ICgiQ09NU1BFQyIpICE9IE5VTEwgPyBnZXRlbnYgKCJDT01TUEVDIikgOgorICAgICAgKHsgT1NWRVJTSU9OSU5GTyB2OyB2LmR3T1NWZXJzaW9uSW5mb1NpemUgPSBzaXplb2YoT1NWRVJTSU9OSU5GTyk7CisgICAgICAgICBHZXRWZXJzaW9uRXgoJnYpOworICAgICAgICAgdi5kd1BsYXRmb3JtSWQgPT0gVkVSX1BMQVRGT1JNX1dJTjMyX05UOworICAgICAgfSkgPyAiY21kLmV4ZSIgOiAiY29tbWFuZC5jb20iKS4KKyAgIEluc3RlYWQgaXQgc2ltcGx5IGNvbmNhdGVuYXRlcyB0aGUgYXJndW1lbnRzLCBzZXBhcmF0ZWQgYnkgJyAnLCBhbmQgY2FsbHMKKyAgIENyZWF0ZVByb2Nlc3MoKS4gIFdlIG11c3QgcXVvdGUgdGhlIGFyZ3VtZW50cyBzaW5jZSBXaW4zMiBDcmVhdGVQcm9jZXNzKCkKKyAgIGludGVycHJldHMgY2hhcmFjdGVycyBsaWtlICcgJywgJ1x0JywgJ1xcJywgJyInIChidXQgbm90ICc8JyBhbmQgJz4nKSBpbiBhCisgICBzcGVjaWFsIHdheToKKyAgIC0gU3BhY2UgYW5kIHRhYiBhcmUgaW50ZXJwcmV0ZWQgYXMgZGVsaW1pdGVycy4gVGhleSBhcmUgbm90IHRyZWF0ZWQgYXMKKyAgICAgZGVsaW1pdGVycyBpZiB0aGV5IGFyZSBzdXJyb3VuZGVkIGJ5IGRvdWJsZSBxdW90ZXM6ICIuLi4iLgorICAgLSBVbmVzY2FwZWQgZG91YmxlIHF1b3RlcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBpbnB1dC4gVGhlaXIgb25seSBlZmZlY3QgaXMKKyAgICAgdGhhdCB3aXRoaW4gZG91YmxlIHF1b3Rlcywgc3BhY2UgYW5kIHRhYiBhcmUgdHJlYXRlZCBsaWtlIG5vcm1hbAorICAgICBjaGFyYWN0ZXJzLgorICAgLSBCYWNrc2xhc2hlcyBub3QgZm9sbG93ZWQgYnkgZG91YmxlIHF1b3RlcyBhcmUgbm90IHNwZWNpYWwuCisgICAtIEJ1dCAyKm4rMSBiYWNrc2xhc2hlcyBmb2xsb3dlZCBieSBhIGRvdWJsZSBxdW90ZSBiZWNvbWUKKyAgICAgbiBiYWNrc2xhc2hlcyBmb2xsb3dlZCBieSBhIGRvdWJsZSBxdW90ZSAobiA+PSAwKToKKyAgICAgICBcIiAtPiAiCisgICAgICAgXFxcIiAtPiBcIgorICAgICAgIFxcXFxcIiAtPiBcXCIKKyAqLworI2RlZmluZSBTSEVMTF9TUEVDSUFMX0NIQVJTICJcIlxcIFwwMDFcMDAyXDAwM1wwMDRcMDA1XDAwNlwwMDdcMDEwXDAxMVwwMTJcMDEzXDAxNFwwMTVcMDE2XDAxN1wwMjBcMDIxXDAyMlwwMjNcMDI0XDAyNVwwMjZcMDI3XDAzMFwwMzFcMDMyXDAzM1wwMzRcMDM1XDAzNlwwMzciCisjZGVmaW5lIFNIRUxMX1NQQUNFX0NIQVJTICIgXDAwMVwwMDJcMDAzXDAwNFwwMDVcMDA2XDAwN1wwMTBcMDExXDAxMlwwMTNcMDE0XDAxNVwwMTZcMDE3XDAyMFwwMjFcMDIyXDAyM1wwMjRcMDI1XDAyNlwwMjdcMDMwXDAzMVwwMzJcMDMzXDAzNFwwMzVcMDM2XDAzNyIKK2NoYXIgKioKK3ByZXBhcmVfc3Bhd24gKGNoYXIgKiphcmd2KQoreworICBzaXplX3QgYXJnYzsKKyAgY2hhciAqKm5ld19hcmd2OworICBzaXplX3QgaTsKKworICAvKiBDb3VudCBudW1iZXIgb2YgYXJndW1lbnRzLiAgKi8KKyAgZm9yIChhcmdjID0gMDsgYXJndlthcmdjXSAhPSBOVUxMOyBhcmdjKyspCisgICAgOworCisgIC8qIEFsbG9jYXRlIG5ldyBhcmd1bWVudCB2ZWN0b3IuICAqLworICBuZXdfYXJndiA9IFhNQUxMT0MgKGNoYXIgKiwgYXJnYyArIDEpOworCisgIC8qIFB1dCBxdW90ZWQgYXJndW1lbnRzIGludG8gdGhlIG5ldyBhcmd1bWVudCB2ZWN0b3IuICAqLworICBmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnN0cmluZyA9IGFyZ3ZbaV07CisKKyAgICAgIGlmIChzdHJpbmdbMF0gPT0gJ1wwJykKKwluZXdfYXJndltpXSA9IHhzdHJkdXAgKCJcIlwiIik7CisgICAgICBlbHNlIGlmIChzdHJwYnJrIChzdHJpbmcsIFNIRUxMX1NQRUNJQUxfQ0hBUlMpICE9IE5VTEwpCisJeworCSAgaW50IHF1b3RlX2Fyb3VuZCA9IChzdHJwYnJrIChzdHJpbmcsIFNIRUxMX1NQQUNFX0NIQVJTKSAhPSBOVUxMKTsKKwkgIHNpemVfdCBsZW5ndGg7CisJICB1bnNpZ25lZCBpbnQgYmFja3NsYXNoZXM7CisJICBjb25zdCBjaGFyICpzOworCSAgY2hhciAqcXVvdGVkX3N0cmluZzsKKwkgIGNoYXIgKnA7CisKKwkgIGxlbmd0aCA9IDA7CisJICBiYWNrc2xhc2hlcyA9IDA7CisJICBpZiAocXVvdGVfYXJvdW5kKQorCSAgICBsZW5ndGgrKzsKKwkgIGZvciAocyA9IHN0cmluZzsgKnMgIT0gJ1wwJzsgcysrKQorCSAgICB7CisJICAgICAgY2hhciBjID0gKnM7CisJICAgICAgaWYgKGMgPT0gJyInKQorCQlsZW5ndGggKz0gYmFja3NsYXNoZXMgKyAxOworCSAgICAgIGxlbmd0aCsrOworCSAgICAgIGlmIChjID09ICdcXCcpCisJCWJhY2tzbGFzaGVzKys7CisJICAgICAgZWxzZQorCQliYWNrc2xhc2hlcyA9IDA7CisJICAgIH0KKwkgIGlmIChxdW90ZV9hcm91bmQpCisJICAgIGxlbmd0aCArPSBiYWNrc2xhc2hlcyArIDE7CisKKwkgIHF1b3RlZF9zdHJpbmcgPSBYTUFMTE9DIChjaGFyLCBsZW5ndGggKyAxKTsKKworCSAgcCA9IHF1b3RlZF9zdHJpbmc7CisJICBiYWNrc2xhc2hlcyA9IDA7CisJICBpZiAocXVvdGVfYXJvdW5kKQorCSAgICAqcCsrID0gJyInOworCSAgZm9yIChzID0gc3RyaW5nOyAqcyAhPSAnXDAnOyBzKyspCisJICAgIHsKKwkgICAgICBjaGFyIGMgPSAqczsKKwkgICAgICBpZiAoYyA9PSAnIicpCisJCXsKKwkJICB1bnNpZ25lZCBpbnQgajsKKwkJICBmb3IgKGogPSBiYWNrc2xhc2hlcyArIDE7IGogPiAwOyBqLS0pCisJCSAgICAqcCsrID0gJ1xcJzsKKwkJfQorCSAgICAgICpwKysgPSBjOworCSAgICAgIGlmIChjID09ICdcXCcpCisJCWJhY2tzbGFzaGVzKys7CisJICAgICAgZWxzZQorCQliYWNrc2xhc2hlcyA9IDA7CisJICAgIH0KKwkgIGlmIChxdW90ZV9hcm91bmQpCisJICAgIHsKKwkgICAgICB1bnNpZ25lZCBpbnQgajsKKwkgICAgICBmb3IgKGogPSBiYWNrc2xhc2hlczsgaiA+IDA7IGotLSkKKwkJKnArKyA9ICdcXCc7CisJICAgICAgKnArKyA9ICciJzsKKwkgICAgfQorCSAgKnAgPSAnXDAnOworCisJICBuZXdfYXJndltpXSA9IHF1b3RlZF9zdHJpbmc7CisJfQorICAgICAgZWxzZQorCW5ld19hcmd2W2ldID0gKGNoYXIgKikgc3RyaW5nOworICAgIH0KKyAgbmV3X2FyZ3ZbYXJnY10gPSBOVUxMOworCisgIHJldHVybiBuZXdfYXJndjsKK30KK0VPRgorCQk7OworCSAgICBlc2FjCisKKyAgICAgICAgICAgIGNhdCA8PCJFT0YiCit2b2lkIGx0X2R1bXBfc2NyaXB0IChGSUxFKiBmKQoreworRU9GCisJICAgIGZ1bmNfZW1pdF93cmFwcGVyIHllcyB8CisJICAgICAgJFNFRCAtbiAtZSAnCitzL15cKC5cezc5XH1cKVwoLi4qXCkvXDFcCitcMi8KK2gKK3MvXChbXFwiXVwpL1xcXDEvZworcy8kL1xcbi8KK3MvXChbXlxuXSpcKS4qLyAgZnB1dHMgKCJcMSIsIGYpOy9wCitnCitEJworICAgICAgICAgICAgY2F0IDw8IkVPRiIKK30KIEVPRgogfQogIyBlbmQ6IGZ1bmNfZW1pdF9jd3JhcHBlcmV4ZV9zcmMKIAorIyBmdW5jX3dpbjMyX2ltcG9ydF9saWJfcCBBUkcKKyMgVHJ1ZSBpZiBBUkcgaXMgYW4gaW1wb3J0IGxpYiwgYXMgaW5kaWNhdGVkIGJ5ICRmaWxlX21hZ2ljX2NtZAorZnVuY193aW4zMl9pbXBvcnRfbGliX3AgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgY2FzZSBgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCJcJDFcIiAyPi9kZXYvbnVsbCB8ICRTRUQgLWUgMTBxYCBpbgorICAgICppbXBvcnQqKSA6IDs7CisgICAgKikgZmFsc2UgOzsKKyAgICBlc2FjCit9CisKICMgZnVuY19tb2RlX2xpbmsgYXJnLi4uCiBmdW5jX21vZGVfbGluayAoKQogewpAQCAtNDA3Miw2ICs1MTMzLDcgQEAKICAgICBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncz0KIAogICAgIGF2b2lkX3ZlcnNpb249bm8KKyAgICBiaW5kaXI9CiAgICAgZGxmaWxlcz0KICAgICBkbHByZWZpbGVzPQogICAgIGRsc2VsZj1ubwpAQCAtNDE2NCw2ICs1MjI2LDExIEBACiAJZXNhYwogCiAJY2FzZSAkcHJldiBpbgorCWJpbmRpcikKKwkgIGJpbmRpcj0iJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKIAlkbGZpbGVzfGRscHJlZmlsZXMpCiAJICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSBubzsgdGhlbgogCSAgICAjIEFkZCB0aGUgc3ltYm9sIG9iamVjdCBpbnRvIHRoZSBsaW5raW5nIGNvbW1hbmRzLgpAQCAtNDE5NSw5ICs1MjYyLDkgQEAKIAkgICAgOzsKIAkgICopCiAJICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KLQkgICAgICBkbGZpbGVzPSIkZGxmaWxlcyAkYXJnIgorCSAgICAgIGZ1bmNfYXBwZW5kIGRsZmlsZXMgIiAkYXJnIgogCSAgICBlbHNlCi0JICAgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGFyZyIKKwkgICAgICBmdW5jX2FwcGVuZCBkbHByZWZpbGVzICIgJGFyZyIKIAkgICAgZmkKIAkgICAgcHJldj0KIAkgICAgY29udGludWUKQEAgLTQyMjEsNyArNTI4OCw3IEBACiAJICAgICotKi1kYXJ3aW4qKQogCSAgICAgIGNhc2UgIiRkZXBsaWJzICIgaW4KIAkJKiIgJHFhcmcubHRmcmFtZXdvcmsgIiopIDs7Ci0JCSopIGRlcGxpYnM9IiRkZXBsaWJzICRxYXJnLmx0ZnJhbWV3b3JrIiAjIHRoaXMgaXMgZml4ZWQgbGF0ZXIKKwkJKikgZnVuY19hcHBlbmQgZGVwbGlicyAiICRxYXJnLmx0ZnJhbWV3b3JrIiAjIHRoaXMgaXMgZml4ZWQgbGF0ZXIKIAkJICAgOzsKIAkgICAgICBlc2FjCiAJICAgICAgOzsKQEAgLTQyNDAsNyArNTMwNyw3IEBACiAJICAgIG1vcmVhcmdzPQogCSAgICBmb3IgZmlsIGluIGBjYXQgIiRzYXZlX2FyZyJgCiAJICAgIGRvCi0jCSAgICAgIG1vcmVhcmdzPSIkbW9yZWFyZ3MgJGZpbCIKKyMJICAgICAgZnVuY19hcHBlbmQgbW9yZWFyZ3MgIiAkZmlsIgogCSAgICAgIGFyZz0kZmlsCiAJICAgICAgIyBBIGxpYnRvb2wtY29udHJvbGxlZCBvYmplY3QuCiAKQEAgLTQyNjksNyArNTMzNiw3IEBACiAKIAkJICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCiAJCSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0geWVzOyB0aGVuCi0JCSAgICAgIGRsZmlsZXM9IiRkbGZpbGVzICRwaWNfb2JqZWN0IgorCQkgICAgICBmdW5jX2FwcGVuZCBkbGZpbGVzICIgJHBpY19vYmplY3QiCiAJCSAgICAgIHByZXY9CiAJCSAgICAgIGNvbnRpbnVlCiAJCSAgICBlbHNlCkBAIC00MjgxLDcgKzUzNDgsNyBAQAogCQkgICMgQ0hFQ0sgTUU6ICBJIHRoaW5rIEkgYnVzdGVkIHRoaXMuICAtT3NzYW1hCiAJCSAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgogCQkgICAgIyBQcmVsb2FkIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgotCQkgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJHBpY19vYmplY3QiCisJCSAgICBmdW5jX2FwcGVuZCBkbHByZWZpbGVzICIgJHBpY19vYmplY3QiCiAJCSAgICBwcmV2PQogCQkgIGZpCiAKQEAgLTQzNTEsMTIgKzU0MTgsMTIgQEAKIAkgIGlmIHRlc3QgIiRwcmV2IiA9IHJwYXRoOyB0aGVuCiAJICAgIGNhc2UgIiRycGF0aCAiIGluCiAJICAgICoiICRhcmcgIiopIDs7Ci0JICAgICopIHJwYXRoPSIkcnBhdGggJGFyZyIgOzsKKwkgICAgKikgZnVuY19hcHBlbmQgcnBhdGggIiAkYXJnIiA7OwogCSAgICBlc2FjCiAJICBlbHNlCiAJICAgIGNhc2UgIiR4cnBhdGggIiBpbgogCSAgICAqIiAkYXJnICIqKSA7OwotCSAgICAqKSB4cnBhdGg9IiR4cnBhdGggJGFyZyIgOzsKKwkgICAgKikgZnVuY19hcHBlbmQgeHJwYXRoICIgJGFyZyIgOzsKIAkgICAgZXNhYwogCSAgZmkKIAkgIHByZXY9CkBAIC00MzY4LDI4ICs1NDM1LDI4IEBACiAJICBjb250aW51ZQogCSAgOzsKIAl3ZWFrKQotCSAgd2Vha19saWJzPSIkd2Vha19saWJzICRhcmciCisJICBmdW5jX2FwcGVuZCB3ZWFrX2xpYnMgIiAkYXJnIgogCSAgcHJldj0KIAkgIGNvbnRpbnVlCiAJICA7OwogCXhjY2xpbmtlcikKLQkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkcWFyZyIKLQkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHFhcmciCisJICBmdW5jX2FwcGVuZCBsaW5rZXJfZmxhZ3MgIiAkcWFyZyIKKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVyX2ZsYWdzICIgJHFhcmciCiAJICBwcmV2PQogCSAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJHFhcmciCiAJICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJHFhcmciCiAJICBjb250aW51ZQogCSAgOzsKIAl4Y29tcGlsZXIpCi0JICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRxYXJnIgorCSAgZnVuY19hcHBlbmQgY29tcGlsZXJfZmxhZ3MgIiAkcWFyZyIKIAkgIHByZXY9CiAJICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkcWFyZyIKIAkgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkcWFyZyIKIAkgIGNvbnRpbnVlCiAJICA7OwogCXhsaW5rZXIpCi0JICBsaW5rZXJfZmxhZ3M9IiRsaW5rZXJfZmxhZ3MgJHFhcmciCi0JICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICR3bCRxYXJnIgorCSAgZnVuY19hcHBlbmQgbGlua2VyX2ZsYWdzICIgJHFhcmciCisJICBmdW5jX2FwcGVuZCBjb21waWxlcl9mbGFncyAiICR3bCRxYXJnIgogCSAgcHJldj0KIAkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICR3bCRxYXJnIgogCSAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICR3bCRxYXJnIgpAQCAtNDQyNSw2ICs1NDkyLDExIEBACiAJY29udGludWUKIAk7OwogCisgICAgICAtYmluZGlyKQorCXByZXY9YmluZGlyCisJY29udGludWUKKwk7OworCiAgICAgICAtZGxvcGVuKQogCXByZXY9ZGxmaWxlcwogCWNvbnRpbnVlCkBAIC00NDc1LDE1ICs1NTQ3LDE2IEBACiAJOzsKIAogICAgICAgLUwqKQotCWZ1bmNfc3RyaXBuYW1lICctTCcgJycgIiRhcmciCi0JZGlyPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKLQlpZiB0ZXN0IC16ICIkZGlyIjsgdGhlbgorCWZ1bmNfc3RyaXBuYW1lICItTCIgJycgIiRhcmciCisJaWYgdGVzdCAteiAiJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCI7IHRoZW4KIAkgIGlmIHRlc3QgIiQjIiAtZ3QgMDsgdGhlbgogCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJyZXF1aXJlIG5vIHNwYWNlIGJldHdlZW4gXGAtTCcgYW5kIFxgJDEnIgogCSAgZWxzZQogCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJuZWVkIHBhdGggZm9yIFxgLUwnIG9wdGlvbiIKIAkgIGZpCiAJZmkKKwlmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCIKKwlkaXI9JGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdAogCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgogCWNhc2UgJGRpciBpbgogCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKQEAgLTQ0OTUsMjQgKzU1NjgsMzAgQEAKIAkgIDs7CiAJZXNhYwogCWNhc2UgIiRkZXBsaWJzICIgaW4KLQkqIiAtTCRkaXIgIiopIDs7CisJKiIgLUwkZGlyICIqIHwgKiIgJGFyZyAiKikKKwkgICMgV2lsbCBvbmx5IGhhcHBlbiBmb3IgYWJzb2x1dGUgb3Igc3lzcm9vdCBhcmd1bWVudHMKKwkgIDs7CiAJKikKLQkgIGRlcGxpYnM9IiRkZXBsaWJzIC1MJGRpciIKLQkgIGxpYl9zZWFyY2hfcGF0aD0iJGxpYl9zZWFyY2hfcGF0aCAkZGlyIgorCSAgIyBQcmVzZXJ2ZSBzeXNyb290LCBidXQgbmV2ZXIgaW5jbHVkZSByZWxhdGl2ZSBkaXJlY3RvcmllcworCSAgY2FzZSAkZGlyIGluCisJICAgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKiB8ID0qKSBmdW5jX2FwcGVuZCBkZXBsaWJzICIgJGFyZyIgOzsKKwkgICAgKikgZnVuY19hcHBlbmQgZGVwbGlicyAiIC1MJGRpciIgOzsKKwkgIGVzYWMKKwkgIGZ1bmNfYXBwZW5kIGxpYl9zZWFyY2hfcGF0aCAiICRkaXIiCiAJICA7OwogCWVzYWMKIAljYXNlICRob3N0IGluCiAJKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiogfCAqLWNlZ2NjKikKLQkgIHRlc3RiaW5kaXI9YCRFQ0hPICJYJGRpciIgfCAkWHNlZCAtZSAncyovbGliJCovYmluKidgCisJICB0ZXN0YmluZGlyPWAkRUNITyAiJGRpciIgfCAkU0VEICdzKi9saWIkKi9iaW4qJ2AKIAkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgogCSAgKiI6JGRpcjoiKikgOzsKIAkgIDo6KSBkbGxzZWFyY2hwYXRoPSRkaXI7OwotCSAgKikgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaHBhdGg6JGRpciI7OworCSAgKikgZnVuY19hcHBlbmQgZGxsc2VhcmNocGF0aCAiOiRkaXIiOzsKIAkgIGVzYWMKIAkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgogCSAgKiI6JHRlc3RiaW5kaXI6IiopIDs7CiAJICA6OikgZGxsc2VhcmNocGF0aD0kdGVzdGJpbmRpcjs7Ci0JICAqKSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNocGF0aDokdGVzdGJpbmRpciI7OworCSAgKikgZnVuY19hcHBlbmQgZGxsc2VhcmNocGF0aCAiOiR0ZXN0YmluZGlyIjs7CiAJICBlc2FjCiAJICA7OwogCWVzYWMKQEAgLTQ1MjIsNyArNTYwMSw3IEBACiAgICAgICAtbCopCiAJaWYgdGVzdCAiWCRhcmciID0gIlgtbGMiIHx8IHRlc3QgIlgkYXJnIiA9ICJYLWxtIjsgdGhlbgogCSAgY2FzZSAkaG9zdCBpbgotCSAgKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLWJlb3MqIHwgKi1jZWdjYyopCisJICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotYmVvcyogfCAqLWNlZ2NjKiB8ICotKi1oYWlrdSopCiAJICAgICMgVGhlc2Ugc3lzdGVtcyBkb24ndCBhY3R1YWxseSBoYXZlIGEgQyBvciBtYXRoIGxpYnJhcnkgKGFzIHN1Y2gpCiAJICAgIGNvbnRpbnVlCiAJICAgIDs7CkBAIC00NTM2LDcgKzU2MTUsNyBAQAogCSAgICA7OwogCSAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQogCSAgICAjIFJoYXBzb2R5IEMgYW5kIG1hdGggbGlicmFyaWVzIGFyZSBpbiB0aGUgU3lzdGVtIGZyYW1ld29yawotCSAgICBkZXBsaWJzPSIkZGVwbGlicyBTeXN0ZW0ubHRmcmFtZXdvcmsiCisJICAgIGZ1bmNfYXBwZW5kIGRlcGxpYnMgIiBTeXN0ZW0ubHRmcmFtZXdvcmsiCiAJICAgIGNvbnRpbnVlCiAJICAgIDs7CiAJICAqLSotc2NvMy4ydjUqIHwgKi0qLXNjbzV2NiopCkBAIC00NTU2LDcgKzU2MzUsNyBAQAogCSAgIDs7CiAJIGVzYWMKIAlmaQotCWRlcGxpYnM9IiRkZXBsaWJzICRhcmciCisJZnVuY19hcHBlbmQgZGVwbGlicyAiICRhcmciCiAJY29udGludWUKIAk7OwogCkBAIC00NTY4LDIxICs1NjQ3LDIyIEBACiAgICAgICAjIFRydTY0IFVOSVggdXNlcyAtbW9kZWwgW2FyZ10gdG8gZGV0ZXJtaW5lIHRoZSBsYXlvdXQgb2YgQysrCiAgICAgICAjIGNsYXNzZXMsIG5hbWUgbWFuZ2xpbmcsIGFuZCBleGNlcHRpb24gaGFuZGxpbmcuCiAgICAgICAjIERhcndpbiB1c2VzIHRoZSAtYXJjaCBmbGFnIHRvIGRldGVybWluZSBvdXRwdXQgYXJjaGl0ZWN0dXJlLgotICAgICAgLW1vZGVsfC1hcmNofC1pc3lzcm9vdCkKLQljb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRhcmciCisgICAgICAtbW9kZWx8LWFyY2h8LWlzeXNyb290fC0tc3lzcm9vdCkKKwlmdW5jX2FwcGVuZCBjb21waWxlcl9mbGFncyAiICRhcmciCiAJZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJGFyZyIKIAlmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKIAlwcmV2PXhjb21waWxlcgogCWNvbnRpbnVlCiAJOzsKIAotICAgICAgLW10fC1tdGhyZWFkc3wta3RocmVhZHwtS3RocmVhZHwtcHRocmVhZHwtcHRocmVhZHN8LS10aHJlYWQtc2FmZXwtdGhyZWFkcykKLQljb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRhcmciCisgICAgICAtbXR8LW10aHJlYWRzfC1rdGhyZWFkfC1LdGhyZWFkfC1wdGhyZWFkfC1wdGhyZWFkc3wtLXRocmVhZC1zYWZlIFwKKyAgICAgIHwtdGhyZWFkc3wtZm9wZW5tcHwtb3Blbm1wfC1tcHwteG9wZW5tcHwtb21wfC1xc21wPSopCisJZnVuY19hcHBlbmQgY29tcGlsZXJfZmxhZ3MgIiAkYXJnIgogCWZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCiAJZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRhcmciCiAJY2FzZSAiJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgaW4KIAkgICAgKiIgJGFyZyAiKikgOzsKLQkgICAgKiApIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzPSIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgJGFyZyIgOzsKKwkgICAgKiApIGZ1bmNfYXBwZW5kIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgJGFyZyIgOzsKIAllc2FjCiAJY29udGludWUKIAk7OwpAQCAtNDY0OSwxMyArNTcyOSwxNyBAQAogCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgogCWNhc2UgJGRpciBpbgogCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKKwk9KikKKwkgIGZ1bmNfc3RyaXBuYW1lICc9JyAnJyAiJGRpciIKKwkgIGRpcj0kbHRfc3lzcm9vdCRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgIDs7CiAJKikKIAkgIGZ1bmNfZmF0YWxfZXJyb3IgIm9ubHkgYWJzb2x1dGUgcnVuLXBhdGhzIGFyZSBhbGxvd2VkIgogCSAgOzsKIAllc2FjCiAJY2FzZSAiJHhycGF0aCAiIGluCiAJKiIgJGRpciAiKikgOzsKLQkqKSB4cnBhdGg9IiR4cnBhdGggJGRpciIgOzsKKwkqKSBmdW5jX2FwcGVuZCB4cnBhdGggIiAkZGlyIiA7OwogCWVzYWMKIAljb250aW51ZQogCTs7CkBAIC00NzA4LDggKzU3OTIsOCBAQAogCWZvciBmbGFnIGluICRhcmdzOyBkbwogCSAgSUZTPSIkc2F2ZV9pZnMiCiAgICAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGZsYWciCi0JICBhcmc9IiRhcmcgJHdsJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgotCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisJICBmdW5jX2FwcGVuZCBhcmcgIiAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisJICBmdW5jX2FwcGVuZCBjb21waWxlcl9mbGFncyAiICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKIAlkb25lCiAJSUZTPSIkc2F2ZV9pZnMiCiAJZnVuY19zdHJpcG5hbWUgJyAnICcnICIkYXJnIgpAQCAtNDcyNCw5ICs1ODA4LDkgQEAKIAlmb3IgZmxhZyBpbiAkYXJnczsgZG8KIAkgIElGUz0iJHNhdmVfaWZzIgogICAgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRmbGFnIgotCSAgYXJnPSIkYXJnICR3bCRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKLQkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHdsJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgotCSAgbGlua2VyX2ZsYWdzPSIkbGlua2VyX2ZsYWdzICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKwkgIGZ1bmNfYXBwZW5kIGFyZyAiICR3bCRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVyX2ZsYWdzICIgJHdsJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCSAgZnVuY19hcHBlbmQgbGlua2VyX2ZsYWdzICIgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgogCWRvbmUKIAlJRlM9IiRzYXZlX2lmcyIKIAlmdW5jX3N0cmlwbmFtZSAnICcgJycgIiRhcmciCkBAIC00NzU0LDIzICs1ODM4LDI3IEBACiAJYXJnPSIkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCiAJOzsKIAotICAgICAgIyAtNjQsIC1taXBzWzAtOV0gZW5hYmxlIDY0LWJpdCBtb2RlIG9uIHRoZSBTR0kgY29tcGlsZXIKLSAgICAgICMgLXJbMC05XVswLTldKiBzcGVjaWZpZXMgdGhlIHByb2Nlc3NvciBvbiB0aGUgU0dJIGNvbXBpbGVyCi0gICAgICAjIC14YXJjaD0qLCAteHRhcmdldD0qIGVuYWJsZSA2NC1iaXQgbW9kZSBvbiB0aGUgU3VuIGNvbXBpbGVyCi0gICAgICAjICtEQSosICtERCogZW5hYmxlIDY0LWJpdCBtb2RlIG9uIHRoZSBIUCBjb21waWxlcgotICAgICAgIyAtcSogcGFzcyB0aHJvdWdoIGNvbXBpbGVyIGFyZ3MgZm9yIHRoZSBJQk0gY29tcGlsZXIKLSAgICAgICMgLW0qLCAtdFs0NV0qLCAtdHhzY2FsZSogcGFzcyB0aHJvdWdoIGFyY2hpdGVjdHVyZS1zcGVjaWZpYwotICAgICAgIyBjb21waWxlciBhcmdzIGZvciBHQ0MKLSAgICAgICMgLUYvcGF0aCBnaXZlcyBwYXRoIHRvIHVuaW5zdGFsbGVkIGZyYW1ld29ya3MsIGdjYyBvbiBkYXJ3aW4KLSAgICAgICMgLXAsIC1wZywgLS1jb3ZlcmFnZSwgLWZwcm9maWxlLSogcGFzcyB0aHJvdWdoIHByb2ZpbGluZyBmbGFnIGZvciBHQ0MKLSAgICAgICMgQGZpbGUgR0NDIHJlc3BvbnNlIGZpbGVzCisgICAgICAjIEZsYWdzIHRvIGJlIHBhc3NlZCB0aHJvdWdoIHVuY2hhbmdlZCwgd2l0aCByYXRpb25hbGU6CisgICAgICAjIC02NCwgLW1pcHNbMC05XSAgICAgIGVuYWJsZSA2NC1iaXQgbW9kZSBmb3IgdGhlIFNHSSBjb21waWxlcgorICAgICAgIyAtclswLTldWzAtOV0qICAgICAgICBzcGVjaWZ5IHByb2Nlc3NvciBmb3IgdGhlIFNHSSBjb21waWxlcgorICAgICAgIyAteGFyY2g9KiwgLXh0YXJnZXQ9KiBlbmFibGUgNjQtYml0IG1vZGUgZm9yIHRoZSBTdW4gY29tcGlsZXIKKyAgICAgICMgK0RBKiwgK0REKiAgICAgICAgICAgZW5hYmxlIDY0LWJpdCBtb2RlIGZvciB0aGUgSFAgY29tcGlsZXIKKyAgICAgICMgLXEqICAgICAgICAgICAgICAgICAgY29tcGlsZXIgYXJncyBmb3IgdGhlIElCTSBjb21waWxlcgorICAgICAgIyAtbSosIC10WzQ1XSosIC10eHNjYWxlKiBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgZmxhZ3MgZm9yIEdDQworICAgICAgIyAtRi9wYXRoICAgICAgICAgICAgICBwYXRoIHRvIHVuaW5zdGFsbGVkIGZyYW1ld29ya3MsIGdjYyBvbiBkYXJ3aW4KKyAgICAgICMgLXAsIC1wZywgLS1jb3ZlcmFnZSwgLWZwcm9maWxlLSogIHByb2ZpbGluZyBmbGFncyBmb3IgR0NDCisgICAgICAjIEBmaWxlICAgICAgICAgICAgICAgIEdDQyByZXNwb25zZSBmaWxlcworICAgICAgIyAtdHA9KiAgICAgICAgICAgICAgICBQb3J0bGFuZCBwZ2NjIHRhcmdldCBwcm9jZXNzb3Igc2VsZWN0aW9uCisgICAgICAjIC0tc3lzcm9vdD0qICAgICAgICAgIGZvciBzeXNyb290IHN1cHBvcnQKKyAgICAgICMgLU8qLCAtZmx0byosIC1md2hvcHIqLCAtZnVzZS1saW5rZXItcGx1Z2luIEdDQyBsaW5rLXRpbWUgb3B0aW1pemF0aW9uCiAgICAgICAtNjR8LW1pcHNbMC05XXwtclswLTldWzAtOV0qfC14YXJjaD0qfC14dGFyZ2V0PSp8K0RBKnwrREQqfC1xKnwtbSp8IFwKLSAgICAgIC10WzQ1XSp8LXR4c2NhbGUqfC1wfC1wZ3wtLWNvdmVyYWdlfC1mcHJvZmlsZS0qfC1GKnxAKikKKyAgICAgIC10WzQ1XSp8LXR4c2NhbGUqfC1wfC1wZ3wtLWNvdmVyYWdlfC1mcHJvZmlsZS0qfC1GKnxAKnwtdHA9KnwtLXN5c3Jvb3Q9KnwgXAorICAgICAgLU8qfC1mbHRvKnwtZndob3ByKnwtZnVzZS1saW5rZXItcGx1Z2luKQogICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgogCWFyZz0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgogICAgICAgICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkYXJnIgogICAgICAgICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKLSAgICAgICAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkYXJnIgorICAgICAgICBmdW5jX2FwcGVuZCBjb21waWxlcl9mbGFncyAiICRhcmciCiAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgIDs7CiAKQEAgLTQ3ODIsNyArNTg3MCw3IEBACiAKICAgICAgICouJG9iamV4dCkKIAkjIEEgc3RhbmRhcmQgb2JqZWN0LgotCW9ianM9IiRvYmpzICRhcmciCisJZnVuY19hcHBlbmQgb2JqcyAiICRhcmciCiAJOzsKIAogICAgICAgKi5sbykKQEAgLTQ4MTMsNyArNTkwMSw3IEBACiAKIAkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgogCSAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgPSB5ZXM7IHRoZW4KLQkJZGxmaWxlcz0iJGRsZmlsZXMgJHBpY19vYmplY3QiCisJCWZ1bmNfYXBwZW5kIGRsZmlsZXMgIiAkcGljX29iamVjdCIKIAkJcHJldj0KIAkJY29udGludWUKIAkgICAgICBlbHNlCkBAIC00ODI1LDcgKzU5MTMsNyBAQAogCSAgICAjIENIRUNLIE1FOiAgSSB0aGluayBJIGJ1c3RlZCB0aGlzLiAgLU9zc2FtYQogCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCiAJICAgICAgIyBQcmVsb2FkIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgotCSAgICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRwaWNfb2JqZWN0IgorCSAgICAgIGZ1bmNfYXBwZW5kIGRscHJlZmlsZXMgIiAkcGljX29iamVjdCIKIAkgICAgICBwcmV2PQogCSAgICBmaQogCkBAIC00ODcwLDI0ICs1OTU4LDI1IEBACiAKICAgICAgICouJGxpYmV4dCkKIAkjIEFuIGFyY2hpdmUuCi0JZGVwbGlicz0iJGRlcGxpYnMgJGFyZyIKLQlvbGRfZGVwbGlicz0iJG9sZF9kZXBsaWJzICRhcmciCisJZnVuY19hcHBlbmQgZGVwbGlicyAiICRhcmciCisJZnVuY19hcHBlbmQgb2xkX2RlcGxpYnMgIiAkYXJnIgogCWNvbnRpbnVlCiAJOzsKIAogICAgICAgKi5sYSkKIAkjIEEgbGlidG9vbC1jb250cm9sbGVkIGxpYnJhcnkuCiAKKwlmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGFyZyIKIAlpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCiAJICAjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KLQkgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCisJICBmdW5jX2FwcGVuZCBkbGZpbGVzICIgJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCIKIAkgIHByZXY9CiAJZWxpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCiAJICAjIFRoZSBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxwcmVvcGVuLgotCSAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGFyZyIKKwkgIGZ1bmNfYXBwZW5kIGRscHJlZmlsZXMgIiAkZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0IgogCSAgcHJldj0KIAllbHNlCi0JICBkZXBsaWJzPSIkZGVwbGlicyAkYXJnIgorCSAgZnVuY19hcHBlbmQgZGVwbGlicyAiICRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQiCiAJZmkKIAljb250aW51ZQogCTs7CkBAIC00OTI1LDcgKzYwMTQsNyBAQAogCiAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCiAgICAgICAjIGdldCB0aGUgZGlyZWN0b3JpZXMgbGlzdGVkIGluICRzaGxpYnBhdGhfdmFyCi0gICAgICBldmFsIHNobGliX3NlYXJjaF9wYXRoPVxgXCRFQ0hPIFwiWFwkeyRzaGxpYnBhdGhfdmFyfVwiIFx8IFwkWHNlZCAtZSBcJ3MvOi8gL2dcJ1xgCisgICAgICBldmFsIHNobGliX3NlYXJjaF9wYXRoPVxgXCRFQ0hPIFwiXCR7JHNobGlicGF0aF92YXJ9XCIgXHwgXCRTRUQgXCdzLzovIC9nXCdcYAogICAgIGVsc2UKICAgICAgIHNobGliX3NlYXJjaF9wYXRoPQogICAgIGZpCkBAIC00OTM0LDYgKzYwMjMsOCBAQAogCiAgICAgZnVuY19kaXJuYW1lICIkb3V0cHV0IiAiLyIgIiIKICAgICBvdXRwdXRfb2JqZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCRvYmpkaXIiCisgICAgZnVuY190b190b29sX2ZpbGUgIiRvdXRwdXRfb2JqZGlyLyIKKyAgICB0b29sX291dHB1dF9vYmpkaXI9JGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdAogICAgICMgQ3JlYXRlIHRoZSBvYmplY3QgZGlyZWN0b3J5LgogICAgIGZ1bmNfbWtkaXJfcCAiJG91dHB1dF9vYmpkaXIiCiAKQEAgLTQ5NTQsMTIgKzYwNDUsMTIgQEAKICAgICAjIEZpbmQgYWxsIGludGVyZGVwZW5kZW50IGRlcGxpYnMgYnkgc2VhcmNoaW5nIGZvciBsaWJyYXJpZXMKICAgICAjIHRoYXQgYXJlIGxpbmtlZCBtb3JlIHRoYW4gb25jZSAoZS5nLiAtbGEgLWxiIC1sYSkKICAgICBmb3IgZGVwbGliIGluICRkZXBsaWJzOyBkbwotICAgICAgaWYgJG9wdF9kdXBsaWNhdGVfZGVwcyA7IHRoZW4KKyAgICAgIGlmICRvcHRfcHJlc2VydmVfZHVwX2RlcHMgOyB0aGVuCiAJY2FzZSAiJGxpYnMgIiBpbgotCSoiICRkZXBsaWIgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJGRlcGxpYiIgOzsKKwkqIiAkZGVwbGliICIqKSBmdW5jX2FwcGVuZCBzcGVjaWFsZGVwbGlicyAiICRkZXBsaWIiIDs7CiAJZXNhYwogICAgICAgZmkKLSAgICAgIGxpYnM9IiRsaWJzICRkZXBsaWIiCisgICAgICBmdW5jX2FwcGVuZCBsaWJzICIgJGRlcGxpYiIKICAgICBkb25lCiAKICAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliOyB0aGVuCkBAIC00OTcyLDkgKzYwNjMsOSBAQAogICAgICAgaWYgJG9wdF9kdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHM7IHRoZW4KIAlmb3IgcHJlX3Bvc3RfZGVwIGluICRwcmVkZXBzICRwb3N0ZGVwczsgZG8KIAkgIGNhc2UgIiRwcmVfcG9zdF9kZXBzICIgaW4KLQkgICoiICRwcmVfcG9zdF9kZXAgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJHByZV9wb3N0X2RlcHMiIDs7CisJICAqIiAkcHJlX3Bvc3RfZGVwICIqKSBmdW5jX2FwcGVuZCBzcGVjaWFsZGVwbGlicyAiICRwcmVfcG9zdF9kZXBzIiA7OwogCSAgZXNhYwotCSAgcHJlX3Bvc3RfZGVwcz0iJHByZV9wb3N0X2RlcHMgJHByZV9wb3N0X2RlcCIKKwkgIGZ1bmNfYXBwZW5kIHByZV9wb3N0X2RlcHMgIiAkcHJlX3Bvc3RfZGVwIgogCWRvbmUKICAgICAgIGZpCiAgICAgICBwcmVfcG9zdF9kZXBzPQpAQCAtNTA0MSwxNyArNjEzMiwxOSBAQAogCWZvciBsaWIgaW4gJGRscHJlZmlsZXM7IGRvCiAJICAjIElnbm9yZSBub24tbGlidG9vbC1saWJzCiAJICBkZXBlbmRlbmN5X2xpYnM9CisJICBmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGxpYiIKIAkgIGNhc2UgJGxpYiBpbgotCSAgKi5sYSkJZnVuY19zb3VyY2UgIiRsaWIiIDs7CisJICAqLmxhKQlmdW5jX3NvdXJjZSAiJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCIgOzsKIAkgIGVzYWMKIAogCSAgIyBDb2xsZWN0IHByZW9wZW5lZCBsaWJ0b29sIGRlcGxpYnMsIGV4Y2VwdCBhbnkgdGhpcyBsaWJyYXJ5CiAJICAjIGhhcyBkZWNsYXJlZCBhcyB3ZWFrIGxpYnMKIAkgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KLSAgICAgICAgICAgIGRlcGxpYl9iYXNlPWAkRUNITyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgIiRiYXNlbmFtZSJgCisJICAgIGZ1bmNfYmFzZW5hbWUgIiRkZXBsaWIiCisgICAgICAgICAgICBkZXBsaWJfYmFzZT0kZnVuY19iYXNlbmFtZV9yZXN1bHQKIAkgICAgY2FzZSAiICR3ZWFrX2xpYnMgIiBpbgogCSAgICAqIiAkZGVwbGliX2Jhc2UgIiopIDs7Ci0JICAgICopIGRlcGxpYnM9IiRkZXBsaWJzICRkZXBsaWIiIDs7CisJICAgICopIGZ1bmNfYXBwZW5kIGRlcGxpYnMgIiAkZGVwbGliIiA7OwogCSAgICBlc2FjCiAJICBkb25lCiAJZG9uZQpAQCAtNTA2NywxNiArNjE2MCwxNyBAQAogCWxpYj0KIAlmb3VuZD1ubwogCWNhc2UgJGRlcGxpYiBpbgotCS1tdHwtbXRocmVhZHN8LWt0aHJlYWR8LUt0aHJlYWR8LXB0aHJlYWR8LXB0aHJlYWRzfC0tdGhyZWFkLXNhZmV8LXRocmVhZHMpCisJLW10fC1tdGhyZWFkc3wta3RocmVhZHwtS3RocmVhZHwtcHRocmVhZHwtcHRocmVhZHN8LS10aHJlYWQtc2FmZSBcCisgICAgICAgIHwtdGhyZWFkc3wtZm9wZW5tcHwtb3Blbm1wfC1tcHwteG9wZW5tcHwtb21wfC1xc21wPSopCiAJICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KIAkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCiAJICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCiAJICBlbHNlCi0JICAgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGRlcGxpYiIKKwkgICAgZnVuY19hcHBlbmQgY29tcGlsZXJfZmxhZ3MgIiAkZGVwbGliIgogCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliIDsgdGhlbgogCQljYXNlICIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgIiBpbgogCQkgICAgKiIgJGRlcGxpYiAiKikgOzsKLQkJICAgICogKSBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncz0iJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICRkZXBsaWIiIDs7CisJCSAgICAqICkgZnVuY19hcHBlbmQgbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgIiAkZGVwbGliIiA7OwogCQllc2FjCiAJICAgIGZpCiAJICBmaQpAQCAtNTE2MSw3ICs2MjU1LDcgQEAKIAkgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYiA7IHRoZW4KIAkJY2FzZSAiJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgaW4KIAkJICAgICoiICRkZXBsaWIgIiopIDs7Ci0JCSAgICAqICkgbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3M9IiRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAkZGVwbGliIiA7OworCQkgICAgKiApIGZ1bmNfYXBwZW5kIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgJGRlcGxpYiIgOzsKIAkJZXNhYwogCSAgICBmaQogCSAgZmkKQEAgLTUxNzQsNyArNjI2OCw4IEBACiAJICAgIHRlc3QgIiRwYXNzIiA9IGNvbnYgJiYgY29udGludWUKIAkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCiAJICAgIGZ1bmNfc3RyaXBuYW1lICctTCcgJycgIiRkZXBsaWIiCi0JICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkZnVuY19zdHJpcG5hbWVfcmVzdWx0IgorCSAgICBmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCIKKwkgICAgZnVuY19hcHBlbmQgbmV3bGliX3NlYXJjaF9wYXRoICIgJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCIKIAkgICAgOzsKIAkgIHByb2cpCiAJICAgIGlmIHRlc3QgIiRwYXNzIiA9IGNvbnY7IHRoZW4KQEAgLTUxODgsNyArNjI4Myw4IEBACiAJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKIAkgICAgZmkKIAkgICAgZnVuY19zdHJpcG5hbWUgJy1MJyAnJyAiJGRlcGxpYiIKLQkgICAgbmV3bGliX3NlYXJjaF9wYXRoPSIkbmV3bGliX3NlYXJjaF9wYXRoICRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiCisJICAgIGZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkZnVuY19zdHJpcG5hbWVfcmVzdWx0IgorCSAgICBmdW5jX2FwcGVuZCBuZXdsaWJfc2VhcmNoX3BhdGggIiAkZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0IgogCSAgICA7OwogCSAgKikKIAkgICAgZnVuY193YXJuaW5nICJcYC1MJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcy9vYmplY3RzIgpAQCAtNTE5OSwxNyArNjI5NSwyMSBAQAogCS1SKikKIAkgIGlmIHRlc3QgIiRwYXNzIiA9IGxpbms7IHRoZW4KIAkgICAgZnVuY19zdHJpcG5hbWUgJy1SJyAnJyAiJGRlcGxpYiIKLQkgICAgZGlyPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgICAgZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiCisJICAgIGRpcj0kZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0CiAJICAgICMgTWFrZSBzdXJlIHRoZSB4cnBhdGggY29udGFpbnMgb25seSB1bmlxdWUgZGlyZWN0b3JpZXMuCiAJICAgIGNhc2UgIiR4cnBhdGggIiBpbgogCSAgICAqIiAkZGlyICIqKSA7OwotCSAgICAqKSB4cnBhdGg9IiR4cnBhdGggJGRpciIgOzsKKwkgICAgKikgZnVuY19hcHBlbmQgeHJwYXRoICIgJGRpciIgOzsKIAkgICAgZXNhYwogCSAgZmkKIAkgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCiAJICBjb250aW51ZQogCSAgOzsKLQkqLmxhKSBsaWI9IiRkZXBsaWIiIDs7CisJKi5sYSkKKwkgIGZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkZGVwbGliIgorCSAgbGliPSRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQKKwkgIDs7CiAJKi4kbGliZXh0KQogCSAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgogCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgpAQCAtNTIyNyw3ICs2MzI3LDcgQEAKIAkJbWF0Y2hfcGF0dGVybiopCiAJCSAgc2V0IGR1bW15ICRkZXBsaWJzX2NoZWNrX21ldGhvZDsgc2hpZnQKIAkJICBtYXRjaF9wYXR0ZXJuX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogIiQxIFwoLipcKSJgCi0JCSAgaWYgZXZhbCAiXCRFQ0hPIFwiWCRkZXBsaWJcIiIgMj4vZGV2L251bGwgfCAkWHNlZCAtZSAxMHEgXAorCQkgIGlmIGV2YWwgIlwkRUNITyBcIiRkZXBsaWJcIiIgMj4vZGV2L251bGwgfCAkU0VEIDEwcSBcCiAJCSAgICB8ICRFR1JFUCAiJG1hdGNoX3BhdHRlcm5fcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCiAJCSAgICB2YWxpZF9hX2xpYj15ZXMKIAkJICBmaQpAQCAtNTIzNywxNSArNjMzNywxNSBAQAogCQk7OwogCSAgICAgIGVzYWMKIAkgICAgICBpZiB0ZXN0ICIkdmFsaWRfYV9saWIiICE9IHllczsgdGhlbgotCQkkRUNITworCQllY2hvCiAJCSRFQ0hPICIqKiogV2FybmluZzogVHJ5aW5nIHRvIGxpbmsgd2l0aCBzdGF0aWMgbGliIGFyY2hpdmUgJGRlcGxpYi4iCi0JCSRFQ0hPICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCQkkRUNITyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkJJEVDSE8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKLQkJJEVDSE8gIioqKiBiZWNhdXNlIHRoZSBmaWxlIGV4dGVuc2lvbnMgLiRsaWJleHQgb2YgdGhpcyBhcmd1bWVudCBtYWtlcyBtZSBiZWxpZXZlIgotCQkkRUNITyAiKioqIHRoYXQgaXQgaXMganVzdCBhIHN0YXRpYyBhcmNoaXZlIHRoYXQgSSBzaG91bGQgbm90IHVzZSBoZXJlLiIKKwkJZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkJZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgorCQllY2hvICIqKiogYmVjYXVzZSB0aGUgZmlsZSBleHRlbnNpb25zIC4kbGliZXh0IG9mIHRoaXMgYXJndW1lbnQgbWFrZXMgbWUgYmVsaWV2ZSIKKwkJZWNobyAiKioqIHRoYXQgaXQgaXMganVzdCBhIHN0YXRpYyBhcmNoaXZlIHRoYXQgSSBzaG91bGQgbm90IHVzZSBoZXJlLiIKIAkgICAgICBlbHNlCi0JCSRFQ0hPCisJCWVjaG8KIAkJJEVDSE8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIgogCQkkRUNITyAiKioqIHN0YXRpYyBsaWJyYXJ5ICRkZXBsaWIgaXMgbm90IHBvcnRhYmxlISIKIAkJZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKQEAgLTUyNzIsMTEgKzYzNzIsMTEgQEAKIAkgICAgaWYgdGVzdCAiJHBhc3MiID0gZGxwcmVvcGVuIHx8IHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgIT0geWVzIHx8IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbm87IHRoZW4KIAkgICAgICAjIElmIHRoZXJlIGlzIG5vIGRsb3BlbiBzdXBwb3J0IG9yIHdlJ3JlIGxpbmtpbmcgc3RhdGljYWxseSwKIAkgICAgICAjIHdlIG5lZWQgdG8gcHJlbG9hZC4KLQkgICAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkZGVwbGliIgorCSAgICAgIGZ1bmNfYXBwZW5kIG5ld2RscHJlZmlsZXMgIiAkZGVwbGliIgogCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgogCSAgICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCiAJICAgIGVsc2UKLQkgICAgICBuZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkZGVwbGliIgorCSAgICAgIGZ1bmNfYXBwZW5kIG5ld2RsZmlsZXMgIiAkZGVwbGliIgogCSAgICBmaQogCSAgZmkKIAkgIGNvbnRpbnVlCkBAIC01MzE4LDIwICs2NDE4LDIwIEBACiAKIAkjIENvbnZlcnQgIi1mcmFtZXdvcmsgZm9vIiB0byAiZm9vLmx0ZnJhbWV3b3JrIgogCWlmIHRlc3QgLW4gIiRpbmhlcml0ZWRfbGlua2VyX2ZsYWdzIjsgdGhlbgotCSAgdG1wX2luaGVyaXRlZF9saW5rZXJfZmxhZ3M9YCRFQ0hPICJYJGluaGVyaXRlZF9saW5rZXJfZmxhZ3MiIHwgJFhzZWQgLWUgJ3MvLWZyYW1ld29yayBcKFteICRdKlwpL1wxLmx0ZnJhbWV3b3JrL2cnYAorCSAgdG1wX2luaGVyaXRlZF9saW5rZXJfZmxhZ3M9YCRFQ0hPICIkaW5oZXJpdGVkX2xpbmtlcl9mbGFncyIgfCAkU0VEICdzLy1mcmFtZXdvcmsgXChbXiAkXSpcKS9cMS5sdGZyYW1ld29yay9nJ2AKIAkgIGZvciB0bXBfaW5oZXJpdGVkX2xpbmtlcl9mbGFnIGluICR0bXBfaW5oZXJpdGVkX2xpbmtlcl9mbGFnczsgZG8KIAkgICAgY2FzZSAiICRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAiIGluCiAJICAgICAgKiIgJHRtcF9pbmhlcml0ZWRfbGlua2VyX2ZsYWcgIiopIDs7Ci0JICAgICAgKikgbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3M9IiRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAkdG1wX2luaGVyaXRlZF9saW5rZXJfZmxhZyI7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgJHRtcF9pbmhlcml0ZWRfbGlua2VyX2ZsYWciOzsKIAkgICAgZXNhYwogCSAgZG9uZQogCWZpCi0JZGVwZW5kZW5jeV9saWJzPWAkRUNITyAiWCAkZGVwZW5kZW5jeV9saWJzIiB8ICRYc2VkIC1lICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAorCWRlcGVuZGVuY3lfbGlicz1gJEVDSE8gIiAkZGVwZW5kZW5jeV9saWJzIiB8ICRTRUQgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCiAJaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJsaWIsbGluayIgfHwKIAkgICB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csc2NhbiIgfHwKIAkgICB7IHRlc3QgIiRsaW5rbW9kZSIgIT0gcHJvZyAmJiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYjsgfTsgdGhlbgotCSAgdGVzdCAtbiAiJGRsb3BlbiIgJiYgZGxmaWxlcz0iJGRsZmlsZXMgJGRsb3BlbiIKLQkgIHRlc3QgLW4gIiRkbHByZW9wZW4iICYmIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRkbHByZW9wZW4iCisJICB0ZXN0IC1uICIkZGxvcGVuIiAmJiBmdW5jX2FwcGVuZCBkbGZpbGVzICIgJGRsb3BlbiIKKwkgIHRlc3QgLW4gIiRkbHByZW9wZW4iICYmIGZ1bmNfYXBwZW5kIGRscHJlZmlsZXMgIiAkZGxwcmVvcGVuIgogCWZpCiAKIAlpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCkBAIC01MzQyLDIwICs2NDQyLDIwIEBACiAJICAgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgbmFtZSBvZiBsaW5rIGxpYnJhcnkgZm9yIFxgJGxpYiciCiAJICAgIGZpCiAJICAgICMgSXQgaXMgYSBsaWJ0b29sIGNvbnZlbmllbmNlIGxpYnJhcnksIHNvIGFkZCBpbiBpdHMgb2JqZWN0cy4KLQkgICAgY29udmVuaWVuY2U9IiRjb252ZW5pZW5jZSAkbGFkaXIvJG9iamRpci8kb2xkX2xpYnJhcnkiCi0JICAgIG9sZF9jb252ZW5pZW5jZT0iJG9sZF9jb252ZW5pZW5jZSAkbGFkaXIvJG9iamRpci8kb2xkX2xpYnJhcnkiCisJICAgIGZ1bmNfYXBwZW5kIGNvbnZlbmllbmNlICIgJGxhZGlyLyRvYmpkaXIvJG9sZF9saWJyYXJ5IgorCSAgICBmdW5jX2FwcGVuZCBvbGRfY29udmVuaWVuY2UgIiAkbGFkaXIvJG9iamRpci8kb2xkX2xpYnJhcnkiCiAJICBlbGlmIHRlc3QgIiRsaW5rbW9kZSIgIT0gcHJvZyAmJiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYjsgdGhlbgogCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRsaWInIGlzIG5vdCBhIGNvbnZlbmllbmNlIGxpYnJhcnkiCiAJICBmaQogCSAgdG1wX2xpYnM9CiAJICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCiAJICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgIGlmICRvcHRfZHVwbGljYXRlX2RlcHMgOyB0aGVuCisJICAgIGlmICRvcHRfcHJlc2VydmVfZHVwX2RlcHMgOyB0aGVuCiAJICAgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KLQkgICAgICAqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7CisJICAgICAgKiIgJGRlcGxpYiAiKikgZnVuY19hcHBlbmQgc3BlY2lhbGRlcGxpYnMgIiAkZGVwbGliIiA7OwogCSAgICAgIGVzYWMKIAkgICAgZmkKLQkgICAgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIgorCSAgICBmdW5jX2FwcGVuZCB0bXBfbGlicyAiICRkZXBsaWIiCiAJICBkb25lCiAJICBjb250aW51ZQogCWZpICMgJHBhc3MgPSBjb252CkBAIC01MzYzLDkgKzY0NjMsMTUgQEAKIAogCSMgR2V0IHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IHdlIGxpbmsgYWdhaW5zdC4KIAlsaW5rbGliPQotCWZvciBsIGluICRvbGRfbGlicmFyeSAkbGlicmFyeV9uYW1lczsgZG8KLQkgIGxpbmtsaWI9IiRsIgotCWRvbmUKKwlpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmCisJICAgeyB0ZXN0ICIkcHJlZmVyX3N0YXRpY19saWJzIiA9IHllcyB8fAorCSAgICAgdGVzdCAiJHByZWZlcl9zdGF0aWNfbGlicywkaW5zdGFsbGVkIiA9ICJidWlsdCxubyI7IH07IHRoZW4KKwkgIGxpbmtsaWI9JG9sZF9saWJyYXJ5CisJZWxzZQorCSAgZm9yIGwgaW4gJG9sZF9saWJyYXJ5ICRsaWJyYXJ5X25hbWVzOyBkbworCSAgICBsaW5rbGliPSIkbCIKKwkgIGRvbmUKKwlmaQogCWlmIHRlc3QgLXogIiRsaW5rbGliIjsgdGhlbgogCSAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgbmFtZSBvZiBsaW5rIGxpYnJhcnkgZm9yIFxgJGxpYiciCiAJZmkKQEAgLTUzODIsOSArNjQ4OCw5IEBACiAJICAgICMgc3RhdGljYWxseSwgd2UgbmVlZCB0byBwcmVsb2FkLiAgV2UgYWxzbyBuZWVkIHRvIHByZWxvYWQgYW55CiAJICAgICMgZGVwZW5kZW50IGxpYnJhcmllcyBzbyBsaWJsdGRsJ3MgZGVwbGliIHByZWxvYWRlciBkb2Vzbid0CiAJICAgICMgYm9tYiBvdXQgaW4gdGhlIGxvYWQgZGVwbGlicyBwaGFzZS4KLQkgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGxpYiAkZGVwZW5kZW5jeV9saWJzIgorCSAgICBmdW5jX2FwcGVuZCBkbHByZWZpbGVzICIgJGxpYiAkZGVwZW5kZW5jeV9saWJzIgogCSAgZWxzZQotCSAgICBuZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkbGliIgorCSAgICBmdW5jX2FwcGVuZCBuZXdkbGZpbGVzICIgJGxpYiIKIAkgIGZpCiAJICBjb250aW51ZQogCWZpICMgJHBhc3MgPSBkbG9wZW4KQEAgLTU0MDYsMTQgKzY1MTIsMTQgQEAKIAogCSMgRmluZCB0aGUgcmVsZXZhbnQgb2JqZWN0IGRpcmVjdG9yeSBhbmQgbGlicmFyeSBuYW1lLgogCWlmIHRlc3QgIlgkaW5zdGFsbGVkIiA9IFh5ZXM7IHRoZW4KLQkgIGlmIHRlc3QgISAtZiAiJGxpYmRpci8kbGlua2xpYiIgJiYgdGVzdCAtZiAiJGFic19sYWRpci8kbGlua2xpYiI7IHRoZW4KKwkgIGlmIHRlc3QgISAtZiAiJGx0X3N5c3Jvb3QkbGliZGlyLyRsaW5rbGliIiAmJiB0ZXN0IC1mICIkYWJzX2xhZGlyLyRsaW5rbGliIjsgdGhlbgogCSAgICBmdW5jX3dhcm5pbmcgImxpYnJhcnkgXGAkbGliJyB3YXMgbW92ZWQuIgogCSAgICBkaXI9IiRsYWRpciIKIAkgICAgYWJzZGlyPSIkYWJzX2xhZGlyIgogCSAgICBsaWJkaXI9IiRhYnNfbGFkaXIiCiAJICBlbHNlCi0JICAgIGRpcj0iJGxpYmRpciIKLQkgICAgYWJzZGlyPSIkbGliZGlyIgorCSAgICBkaXI9IiRsdF9zeXNyb290JGxpYmRpciIKKwkgICAgYWJzZGlyPSIkbHRfc3lzcm9vdCRsaWJkaXIiCiAJICBmaQogCSAgdGVzdCAiWCRoYXJkY29kZV9hdXRvbWF0aWMiID0gWHllcyAmJiBhdm9pZHRlbXBycGF0aD15ZXMKIAllbHNlCkBAIC01NDIxLDEyICs2NTI3LDEyIEBACiAJICAgIGRpcj0iJGxhZGlyIgogCSAgICBhYnNkaXI9IiRhYnNfbGFkaXIiCiAJICAgICMgUmVtb3ZlIHRoaXMgc2VhcmNoIHBhdGggbGF0ZXIKLQkgICAgbm90aW5zdF9wYXRoPSIkbm90aW5zdF9wYXRoICRhYnNfbGFkaXIiCisJICAgIGZ1bmNfYXBwZW5kIG5vdGluc3RfcGF0aCAiICRhYnNfbGFkaXIiCiAJICBlbHNlCiAJICAgIGRpcj0iJGxhZGlyLyRvYmpkaXIiCiAJICAgIGFic2Rpcj0iJGFic19sYWRpci8kb2JqZGlyIgogCSAgICAjIFJlbW92ZSB0aGlzIHNlYXJjaCBwYXRoIGxhdGVyCi0JICAgIG5vdGluc3RfcGF0aD0iJG5vdGluc3RfcGF0aCAkYWJzX2xhZGlyIgorCSAgICBmdW5jX2FwcGVuZCBub3RpbnN0X3BhdGggIiAkYWJzX2xhZGlyIgogCSAgZmkKIAlmaSAjICRpbnN0YWxsZWQgPSB5ZXMKIAlmdW5jX3N0cmlwbmFtZSAnbGliJyAnLmxhJyAiJGxhbmFtZSIKQEAgLTU0MzcsMjAgKzY1NDMsNDYgQEAKIAkgIGlmIHRlc3QgLXogIiRsaWJkaXIiICYmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCiAJICAgIGZ1bmNfZmF0YWxfZXJyb3IgIm9ubHkgbGlicmFyaWVzIG1heSAtZGxwcmVvcGVuIGEgY29udmVuaWVuY2UgbGlicmFyeTogXGAkbGliJyIKIAkgIGZpCi0JICAjIFByZWZlciB1c2luZyBhIHN0YXRpYyBsaWJyYXJ5IChzbyB0aGF0IG5vIHNpbGx5IF9EWU5BTUlDIHN5bWJvbHMKLQkgICMgYXJlIHJlcXVpcmVkIHRvIGxpbmspLgotCSAgaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgotCSAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkZGlyLyRvbGRfbGlicmFyeSIKLQkgICAgIyBLZWVwIGEgbGlzdCBvZiBwcmVvcGVuZWQgY29udmVuaWVuY2UgbGlicmFyaWVzIHRvIGNoZWNrCi0JICAgICMgdGhhdCB0aGV5IGFyZSBiZWluZyB1c2VkIGNvcnJlY3RseSBpbiB0aGUgbGluayBwYXNzLgotCSAgICB0ZXN0IC16ICIkbGliZGlyIiAmJiBcCi0JCWRscHJlY29udmVuaWVuY2VsaWJzPSIkZGxwcmVjb252ZW5pZW5jZWxpYnMgJGRpci8kb2xkX2xpYnJhcnkiCi0JICAjIE90aGVyd2lzZSwgdXNlIHRoZSBkbG5hbWUsIHNvIHRoYXQgbHRfZGxvcGVuIGZpbmRzIGl0LgotCSAgZWxpZiB0ZXN0IC1uICIkZGxuYW1lIjsgdGhlbgotCSAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkZGlyLyRkbG5hbWUiCi0JICBlbHNlCi0JICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRkaXIvJGxpbmtsaWIiCi0JICBmaQorCSAgY2FzZSAiJGhvc3QiIGluCisJICAgICMgc3BlY2lhbCBoYW5kbGluZyBmb3IgcGxhdGZvcm1zIHdpdGggUEUtRExMcy4KKwkgICAgKmN5Z3dpbiogfCAqbWluZ3cqIHwgKmNlZ2NjKiApCisJICAgICAgIyBMaW5rZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGxpbmsgYWdhaW5zdCBzaGFyZWQgbGlicmFyeSBpZiBib3RoCisJICAgICAgIyBzdGF0aWMgYW5kIHNoYXJlZCBhcmUgcHJlc2VudC4gIFRoZXJlZm9yZSwgZW5zdXJlIHdlIGV4dHJhY3QKKwkgICAgICAjIHN5bWJvbHMgZnJvbSB0aGUgaW1wb3J0IGxpYnJhcnkgaWYgYSBzaGFyZWQgbGlicmFyeSBpcyBwcmVzZW50CisJICAgICAgIyAob3RoZXJ3aXNlLCB0aGUgZGxvcGVuIG1vZHVsZSBuYW1lIHdpbGwgYmUgaW5jb3JyZWN0KS4gIFdlIGRvCisJICAgICAgIyB0aGlzIGJ5IHB1dHRpbmcgdGhlIGltcG9ydCBsaWJyYXJ5IG5hbWUgaW50byAkbmV3ZGxwcmVmaWxlcy4KKwkgICAgICAjIFdlIHJlY292ZXIgdGhlIGRsb3BlbiBtb2R1bGUgbmFtZSBieSAnc2F2aW5nJyB0aGUgbGEgZmlsZQorCSAgICAgICMgbmFtZSBpbiBhIHNwZWNpYWwgcHVycG9zZSB2YXJpYWJsZSwgYW5kIChsYXRlcikgZXh0cmFjdGluZyB0aGUKKwkgICAgICAjIGRsbmFtZSBmcm9tIHRoZSBsYSBmaWxlLgorCSAgICAgIGlmIHRlc3QgLW4gIiRkbG5hbWUiOyB0aGVuCisJICAgICAgICBmdW5jX3RyX3NoICIkZGlyLyRsaW5rbGliIgorCSAgICAgICAgZXZhbCAibGliZmlsZV8kZnVuY190cl9zaF9yZXN1bHQ9XCRhYnNfbGFkaXIvXCRsYW5hbWUiCisJICAgICAgICBmdW5jX2FwcGVuZCBuZXdkbHByZWZpbGVzICIgJGRpci8kbGlua2xpYiIKKwkgICAgICBlbHNlCisJICAgICAgICBmdW5jX2FwcGVuZCBuZXdkbHByZWZpbGVzICIgJGRpci8kb2xkX2xpYnJhcnkiCisJICAgICAgICAjIEtlZXAgYSBsaXN0IG9mIHByZW9wZW5lZCBjb252ZW5pZW5jZSBsaWJyYXJpZXMgdG8gY2hlY2sKKwkgICAgICAgICMgdGhhdCB0aGV5IGFyZSBiZWluZyB1c2VkIGNvcnJlY3RseSBpbiB0aGUgbGluayBwYXNzLgorCSAgICAgICAgdGVzdCAteiAiJGxpYmRpciIgJiYgXAorCSAgICAgICAgICBmdW5jX2FwcGVuZCBkbHByZWNvbnZlbmllbmNlbGlicyAiICRkaXIvJG9sZF9saWJyYXJ5IgorCSAgICAgIGZpCisJICAgIDs7CisJICAgICogKQorCSAgICAgICMgUHJlZmVyIHVzaW5nIGEgc3RhdGljIGxpYnJhcnkgKHNvIHRoYXQgbm8gc2lsbHkgX0RZTkFNSUMgc3ltYm9scworCSAgICAgICMgYXJlIHJlcXVpcmVkIHRvIGxpbmspLgorCSAgICAgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KKwkgICAgICAgIGZ1bmNfYXBwZW5kIG5ld2RscHJlZmlsZXMgIiAkZGlyLyRvbGRfbGlicmFyeSIKKwkgICAgICAgICMgS2VlcCBhIGxpc3Qgb2YgcHJlb3BlbmVkIGNvbnZlbmllbmNlIGxpYnJhcmllcyB0byBjaGVjaworCSAgICAgICAgIyB0aGF0IHRoZXkgYXJlIGJlaW5nIHVzZWQgY29ycmVjdGx5IGluIHRoZSBsaW5rIHBhc3MuCisJICAgICAgICB0ZXN0IC16ICIkbGliZGlyIiAmJiBcCisJICAgICAgICAgIGZ1bmNfYXBwZW5kIGRscHJlY29udmVuaWVuY2VsaWJzICIgJGRpci8kb2xkX2xpYnJhcnkiCisJICAgICAgIyBPdGhlcndpc2UsIHVzZSB0aGUgZGxuYW1lLCBzbyB0aGF0IGx0X2Rsb3BlbiBmaW5kcyBpdC4KKwkgICAgICBlbGlmIHRlc3QgLW4gIiRkbG5hbWUiOyB0aGVuCisJICAgICAgICBmdW5jX2FwcGVuZCBuZXdkbHByZWZpbGVzICIgJGRpci8kZGxuYW1lIgorCSAgICAgIGVsc2UKKwkgICAgICAgIGZ1bmNfYXBwZW5kIG5ld2RscHJlZmlsZXMgIiAkZGlyLyRsaW5rbGliIgorCSAgICAgIGZpCisJICAgIDs7CisJICBlc2FjCiAJZmkgIyAkcGFzcyA9IGRscHJlb3BlbgogCiAJaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KQEAgLTU0NjgsNyArNjYwMCw3IEBACiAKIAogCWlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nICYmIHRlc3QgIiRwYXNzIiAhPSBsaW5rOyB0aGVuCi0JICBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggJGxhZGlyIgorCSAgZnVuY19hcHBlbmQgbmV3bGliX3NlYXJjaF9wYXRoICIgJGxhZGlyIgogCSAgZGVwbGlicz0iJGxpYiAkZGVwbGlicyIKIAogCSAgbGlua2FsbGRlcGxpYnM9bm8KQEAgLTU0ODEsNyArNjYxMyw4IEBACiAJICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCiAJICAgIGNhc2UgJGRlcGxpYiBpbgogCSAgICAtTCopIGZ1bmNfc3RyaXBuYW1lICctTCcgJycgIiRkZXBsaWIiCi0JICAgICAgICAgbmV3bGliX3NlYXJjaF9wYXRoPSIkbmV3bGliX3NlYXJjaF9wYXRoICRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiCisJICAgICAgICAgZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiCisJICAgICAgICAgZnVuY19hcHBlbmQgbmV3bGliX3NlYXJjaF9wYXRoICIgJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCIKIAkJIDs7CiAJICAgIGVzYWMKIAkgICAgIyBOZWVkIHRvIGxpbmsgYWdhaW5zdCBhbGwgZGVwZW5kZW5jeV9saWJzPwpAQCAtNTQ5MiwxMiArNjYyNSwxMiBAQAogCSAgICAgICMgb3IvYW5kIGxpbmsgYWdhaW5zdCBzdGF0aWMgbGlicmFyaWVzCiAJICAgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCiAJICAgIGZpCi0JICAgIGlmICRvcHRfZHVwbGljYXRlX2RlcHMgOyB0aGVuCisJICAgIGlmICRvcHRfcHJlc2VydmVfZHVwX2RlcHMgOyB0aGVuCiAJICAgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KLQkgICAgICAqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7CisJICAgICAgKiIgJGRlcGxpYiAiKikgZnVuY19hcHBlbmQgc3BlY2lhbGRlcGxpYnMgIiAkZGVwbGliIiA7OwogCSAgICAgIGVzYWMKIAkgICAgZmkKLQkgICAgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIgorCSAgICBmdW5jX2FwcGVuZCB0bXBfbGlicyAiICRkZXBsaWIiCiAJICBkb25lICMgZm9yIGRlcGxpYgogCSAgY29udGludWUKIAlmaSAjICRsaW5rbW9kZSA9IHByb2cuLi4KQEAgLTU1MTIsNyArNjY0NSw3IEBACiAJICAgICAgIyBNYWtlIHN1cmUgdGhlIHJwYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgogCSAgICAgIGNhc2UgIiR0ZW1wX3JwYXRoOiIgaW4KIAkgICAgICAqIiRhYnNkaXI6IiopIDs7Ci0JICAgICAgKikgdGVtcF9ycGF0aD0iJHRlbXBfcnBhdGgkYWJzZGlyOiIgOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCB0ZW1wX3JwYXRoICIkYWJzZGlyOiIgOzsKIAkgICAgICBlc2FjCiAJICAgIGZpCiAKQEAgLTU1MjQsNyArNjY1Nyw3IEBACiAJICAgICopCiAJICAgICAgY2FzZSAiJGNvbXBpbGVfcnBhdGggIiBpbgogCSAgICAgICoiICRhYnNkaXIgIiopIDs7Ci0JICAgICAgKikgY29tcGlsZV9ycGF0aD0iJGNvbXBpbGVfcnBhdGggJGFic2RpciIKKwkgICAgICAqKSBmdW5jX2FwcGVuZCBjb21waWxlX3JwYXRoICIgJGFic2RpciIgOzsKIAkgICAgICBlc2FjCiAJICAgICAgOzsKIAkgICAgZXNhYwpAQCAtNTUzMyw3ICs2NjY2LDcgQEAKIAkgICAgKikKIAkgICAgICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgogCSAgICAgICoiICRsaWJkaXIgIiopIDs7Ci0JICAgICAgKikgZmluYWxpemVfcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCAkbGliZGlyIgorCSAgICAgICopIGZ1bmNfYXBwZW5kIGZpbmFsaXplX3JwYXRoICIgJGxpYmRpciIgOzsKIAkgICAgICBlc2FjCiAJICAgICAgOzsKIAkgICAgZXNhYwpAQCAtNTU1OCwxMiArNjY5MSwxMiBAQAogCSAgY2FzZSAkaG9zdCBpbgogCSAgKmN5Z3dpbiogfCAqbWluZ3cqIHwgKmNlZ2NjKikKIAkgICAgICAjIE5vIHBvaW50IGluIHJlbGlua2luZyBETExzIGJlY2F1c2UgcGF0aHMgYXJlIG5vdCBlbmNvZGVkCi0JICAgICAgbm90aW5zdF9kZXBsaWJzPSIkbm90aW5zdF9kZXBsaWJzICRsaWIiCisJICAgICAgZnVuY19hcHBlbmQgbm90aW5zdF9kZXBsaWJzICIgJGxpYiIKIAkgICAgICBuZWVkX3JlbGluaz1ubwogCSAgICA7OwogCSAgKikKIAkgICAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSBubzsgdGhlbgotCSAgICAgIG5vdGluc3RfZGVwbGlicz0iJG5vdGluc3RfZGVwbGlicyAkbGliIgorCSAgICAgIGZ1bmNfYXBwZW5kIG5vdGluc3RfZGVwbGlicyAiICRsaWIiCiAJICAgICAgbmVlZF9yZWxpbms9eWVzCiAJICAgIGZpCiAJICAgIDs7CkBAIC01NTgwLDcgKzY3MTMsNyBAQAogCSAgICBmaQogCSAgZG9uZQogCSAgaWYgdGVzdCAteiAiJGRsb3Blbm1vZHVsZSIgJiYgdGVzdCAiJHNob3VsZG5vdGxpbmsiID0geWVzICYmIHRlc3QgIiRwYXNzIiA9IGxpbms7IHRoZW4KLQkgICAgJEVDSE8KKwkgICAgZWNobwogCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgogCSAgICAgICRFQ0hPICIqKiogV2FybmluZzogTGlua2luZyB0aGUgZXhlY3V0YWJsZSAkb3V0cHV0IGFnYWluc3QgdGhlIGxvYWRhYmxlIG1vZHVsZSIKIAkgICAgZWxzZQpAQCAtNTU5OCw3ICs2NzMxLDcgQEAKIAkgICAgKikKIAkgICAgICBjYXNlICIkY29tcGlsZV9ycGF0aCAiIGluCiAJICAgICAgKiIgJGFic2RpciAiKikgOzsKLQkgICAgICAqKSBjb21waWxlX3JwYXRoPSIkY29tcGlsZV9ycGF0aCAkYWJzZGlyIgorCSAgICAgICopIGZ1bmNfYXBwZW5kIGNvbXBpbGVfcnBhdGggIiAkYWJzZGlyIiA7OwogCSAgICAgIGVzYWMKIAkgICAgICA7OwogCSAgICBlc2FjCkBAIC01NjA3LDcgKzY3NDAsNyBAQAogCSAgICAqKQogCSAgICAgIGNhc2UgIiRmaW5hbGl6ZV9ycGF0aCAiIGluCiAJICAgICAgKiIgJGxpYmRpciAiKikgOzsKLQkgICAgICAqKSBmaW5hbGl6ZV9ycGF0aD0iJGZpbmFsaXplX3JwYXRoICRsaWJkaXIiCisJICAgICAgKikgZnVuY19hcHBlbmQgZmluYWxpemVfcnBhdGggIiAkbGliZGlyIiA7OwogCSAgICAgIGVzYWMKIAkgICAgICA7OwogCSAgICBlc2FjCkBAIC01NjYxLDcgKzY3OTQsNyBAQAogCSAgICBsaW5rbGliPSRuZXdsaWIKIAkgIGZpICMgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIgogCi0JICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZyB8fCB0ZXN0ICIkbW9kZSIgIT0gcmVsaW5rOyB0aGVuCisJICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZyB8fCB0ZXN0ICIkb3B0X21vZGUiICE9IHJlbGluazsgdGhlbgogCSAgICBhZGRfc2hsaWJwYXRoPQogCSAgICBhZGRfZGlyPQogCSAgICBhZGQ9CkBAIC01NjgzLDkgKzY4MTYsOSBAQAogCQkgICAgICBpZiB0ZXN0ICJYJGRsb3Blbm1vZHVsZSIgIT0gIlgkbGliIjsgdGhlbgogCQkJJEVDSE8gIioqKiBXYXJuaW5nOiBsaWIgJGxpbmtsaWIgaXMgYSBtb2R1bGUsIG5vdCBhIHNoYXJlZCBsaWJyYXJ5IgogCQkJaWYgdGVzdCAteiAiJG9sZF9saWJyYXJ5IiA7IHRoZW4KLQkJCSAgJEVDSE8KLQkJCSAgJEVDSE8gIioqKiBBbmQgdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgc3RhdGljIGFyY2hpdmUgYXZhaWxhYmxlIgotCQkJICAkRUNITyAiKioqIFRoZSBsaW5rIHdpbGwgcHJvYmFibHkgZmFpbCwgc29ycnkiCisJCQkgIGVjaG8KKwkJCSAgZWNobyAiKioqIEFuZCB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSBzdGF0aWMgYXJjaGl2ZSBhdmFpbGFibGUiCisJCQkgIGVjaG8gIioqKiBUaGUgbGluayB3aWxsIHByb2JhYmx5IGZhaWwsIHNvcnJ5IgogCQkJZWxzZQogCQkJICBhZGQ9IiRkaXIvJG9sZF9saWJyYXJ5IgogCQkJZmkKQEAgLTU3MTIsMTIgKzY4NDUsMTIgQEAKIAkgICAgICAgICB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlIiA9IG5vOyB0aGVuCiAJCWFkZD0iJGRpci8kbGlua2xpYiIKIAkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgotCQlhZGRfZGlyPSItTCRkaXIiCisJCWFkZF9kaXI9Ii1MJGFic2RpciIKIAkJIyBUcnkgbG9va2luZyBmaXJzdCBpbiB0aGUgbG9jYXRpb24gd2UncmUgYmVpbmcgaW5zdGFsbGVkIHRvLgogCQlpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIjsgdGhlbgogCQkgIGNhc2UgJGxpYmRpciBpbgogCQkgICAgW1xcL10qKQotCQkgICAgICBhZGRfZGlyPSIkYWRkX2RpciAtTCRpbnN0X3ByZWZpeF9kaXIkbGliZGlyIgorCQkgICAgICBmdW5jX2FwcGVuZCBhZGRfZGlyICIgLUwkaW5zdF9wcmVmaXhfZGlyJGxpYmRpciIKIAkJICAgICAgOzsKIAkJICBlc2FjCiAJCWZpCkBAIC01NzM5LDcgKzY4NzIsNyBAQAogCSAgICBpZiB0ZXN0IC1uICIkYWRkX3NobGlicGF0aCI7IHRoZW4KIAkgICAgICBjYXNlIDokY29tcGlsZV9zaGxpYnBhdGg6IGluCiAJICAgICAgKiI6JGFkZF9zaGxpYnBhdGg6IiopIDs7Ci0JICAgICAgKikgY29tcGlsZV9zaGxpYnBhdGg9IiRjb21waWxlX3NobGlicGF0aCRhZGRfc2hsaWJwYXRoOiIgOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCBjb21waWxlX3NobGlicGF0aCAiJGFkZF9zaGxpYnBhdGg6IiA7OwogCSAgICAgIGVzYWMKIAkgICAgZmkKIAkgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KQEAgLTU3NTMsMTMgKzY4ODYsMTMgQEAKIAkJIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgogCQljYXNlIDokZmluYWxpemVfc2hsaWJwYXRoOiBpbgogCQkqIjokbGliZGlyOiIqKSA7OwotCQkqKSBmaW5hbGl6ZV9zaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgkbGliZGlyOiIgOzsKKwkJKikgZnVuY19hcHBlbmQgZmluYWxpemVfc2hsaWJwYXRoICIkbGliZGlyOiIgOzsKIAkJZXNhYwogCSAgICAgIGZpCiAJICAgIGZpCiAJICBmaQogCi0JICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZyB8fCB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nIHx8IHRlc3QgIiRvcHRfbW9kZSIgPSByZWxpbms7IHRoZW4KIAkgICAgYWRkX3NobGlicGF0aD0KIAkgICAgYWRkX2Rpcj0KIAkgICAgYWRkPQpAQCAtNTc3Myw3ICs2OTA2LDcgQEAKIAkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSB5ZXM7IHRoZW4KIAkgICAgICBjYXNlIDokZmluYWxpemVfc2hsaWJwYXRoOiBpbgogCSAgICAgICoiOiRsaWJkaXI6IiopIDs7Ci0JICAgICAgKikgZmluYWxpemVfc2hsaWJwYXRoPSIkZmluYWxpemVfc2hsaWJwYXRoJGxpYmRpcjoiIDs7CisJICAgICAgKikgZnVuY19hcHBlbmQgZmluYWxpemVfc2hsaWJwYXRoICIkbGliZGlyOiIgOzsKIAkgICAgICBlc2FjCiAJICAgICAgYWRkPSItbCRuYW1lIgogCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9hdXRvbWF0aWMiID0geWVzOyB0aGVuCkBAIC01NzkwLDcgKzY5MjMsNyBAQAogCSAgICAgIGlmIHRlc3QgLW4gIiRpbnN0X3ByZWZpeF9kaXIiOyB0aGVuCiAJCWNhc2UgJGxpYmRpciBpbgogCQkgIFtcXC9dKikKLQkJICAgIGFkZF9kaXI9IiRhZGRfZGlyIC1MJGluc3RfcHJlZml4X2RpciRsaWJkaXIiCisJCSAgICBmdW5jX2FwcGVuZCBhZGRfZGlyICIgLUwkaW5zdF9wcmVmaXhfZGlyJGxpYmRpciIKIAkJICAgIDs7CiAJCWVzYWMKIAkgICAgICBmaQpAQCAtNTgyNSwyMSArNjk1OCwyMSBAQAogCiAJICAgICMgSnVzdCBwcmludCBhIHdhcm5pbmcgYW5kIGFkZCB0aGUgbGlicmFyeSB0byBkZXBlbmRlbmN5X2xpYnMgc28KIAkgICAgIyB0aGF0IHRoZSBwcm9ncmFtIGNhbiBiZSBsaW5rZWQgYWdhaW5zdCB0aGUgc3RhdGljIGxpYnJhcnkuCi0JICAgICRFQ0hPCisJICAgIGVjaG8KIAkgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBUaGlzIHN5c3RlbSBjYW4gbm90IGxpbmsgdG8gc3RhdGljIGxpYiBhcmNoaXZlICRsaWIuIgotCSAgICAkRUNITyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKLQkgICAgJEVDSE8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCi0JICAgICRFQ0hPICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUuIgorCSAgICBlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCSAgICBlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgorCSAgICBlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUuIgogCSAgICBpZiB0ZXN0ICIkbW9kdWxlIiA9IHllczsgdGhlbgotCSAgICAgICRFQ0hPICIqKiogQnV0IGFzIHlvdSB0cnkgdG8gYnVpbGQgYSBtb2R1bGUgbGlicmFyeSwgbGlidG9vbCB3aWxsIHN0aWxsIGNyZWF0ZSAiCi0JICAgICAgJEVDSE8gIioqKiBhIHN0YXRpYyBtb2R1bGUsIHRoYXQgc2hvdWxkIHdvcmsgYXMgbG9uZyBhcyB0aGUgZGxvcGVuaW5nIGFwcGxpY2F0aW9uIgotCSAgICAgICRFQ0hPICIqKiogaXMgbGlua2VkIHdpdGggdGhlIC1kbG9wZW4gZmxhZyB0byByZXNvbHZlIHN5bWJvbHMgYXQgcnVudGltZS4iCisJICAgICAgZWNobyAiKioqIEJ1dCBhcyB5b3UgdHJ5IHRvIGJ1aWxkIGEgbW9kdWxlIGxpYnJhcnksIGxpYnRvb2wgd2lsbCBzdGlsbCBjcmVhdGUgIgorCSAgICAgIGVjaG8gIioqKiBhIHN0YXRpYyBtb2R1bGUsIHRoYXQgc2hvdWxkIHdvcmsgYXMgbG9uZyBhcyB0aGUgZGxvcGVuaW5nIGFwcGxpY2F0aW9uIgorCSAgICAgIGVjaG8gIioqKiBpcyBsaW5rZWQgd2l0aCB0aGUgLWRsb3BlbiBmbGFnIHRvIHJlc29sdmUgc3ltYm9scyBhdCBydW50aW1lLiIKIAkgICAgICBpZiB0ZXN0IC16ICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotCQkkRUNITwotCQkkRUNITyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCi0JCSRFQ0hPICIqKiogbGlzdHMgZnJvbSBhIHByb2dyYW0sIHVzaW5nIFxgbm0nIG9yIGVxdWl2YWxlbnQsIGJ1dCBsaWJ0b29sIGNvdWxkIgotCQkkRUNITyAiKioqIG5vdCBmaW5kIHN1Y2ggYSBwcm9ncmFtLiAgU28sIHRoaXMgbW9kdWxlIGlzIHByb2JhYmx5IHVzZWxlc3MuIgotCQkkRUNITyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCisJCWVjaG8KKwkJZWNobyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCisJCWVjaG8gIioqKiBsaXN0cyBmcm9tIGEgcHJvZ3JhbSwgdXNpbmcgXGBubScgb3IgZXF1aXZhbGVudCwgYnV0IGxpYnRvb2wgY291bGQiCisJCWVjaG8gIioqKiBub3QgZmluZCBzdWNoIGEgcHJvZ3JhbS4gIFNvLCB0aGlzIG1vZHVsZSBpcyBwcm9iYWJseSB1c2VsZXNzLiIKKwkJZWNobyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCiAJICAgICAgZmkKIAkgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KIAkJYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQpAQCAtNTg2NywzNyArNzAwMCw0NiBAQAogCSAgICAgICAgICAgdGVtcF94cnBhdGg9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAogCQkgICBjYXNlICIgJHhycGF0aCAiIGluCiAJCSAgICoiICR0ZW1wX3hycGF0aCAiKikgOzsKLQkJICAgKikgeHJwYXRoPSIkeHJwYXRoICR0ZW1wX3hycGF0aCI7OworCQkgICAqKSBmdW5jX2FwcGVuZCB4cnBhdGggIiAkdGVtcF94cnBhdGgiOzsKIAkJICAgZXNhYzs7Ci0JICAgICAgKikgdGVtcF9kZXBsaWJzPSIkdGVtcF9kZXBsaWJzICRsaWJkaXIiOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCB0ZW1wX2RlcGxpYnMgIiAkbGliZGlyIjs7CiAJICAgICAgZXNhYwogCSAgICBkb25lCiAJICAgIGRlcGVuZGVuY3lfbGlicz0iJHRlbXBfZGVwbGlicyIKIAkgIGZpCiAKLQkgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkYWJzZGlyIgorCSAgZnVuY19hcHBlbmQgbmV3bGliX3NlYXJjaF9wYXRoICIgJGFic2RpciIKIAkgICMgTGluayBhZ2FpbnN0IHRoaXMgbGlicmFyeQogCSAgdGVzdCAiJGxpbmtfc3RhdGljIiA9IG5vICYmIG5ld2RlcGVuZGVuY3lfbGlicz0iJGFic19sYWRpci8kbGFuYW1lICRuZXdkZXBlbmRlbmN5X2xpYnMiCiAJICAjIC4uLiBhbmQgaXRzIGRlcGVuZGVuY3lfbGlicwogCSAgdG1wX2xpYnM9CiAJICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCiAJICAgIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgotCSAgICBpZiAkb3B0X2R1cGxpY2F0ZV9kZXBzIDsgdGhlbgorCSAgICBjYXNlICRkZXBsaWIgaW4KKyAgICAgICAgICAgICAgLUwqKSBmdW5jX3N0cmlwbmFtZSAnLUwnICcnICIkZGVwbGliIgorICAgICAgICAgICAgICAgICAgIGZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkZnVuY19zdHJpcG5hbWVfcmVzdWx0Ijs7CisgICAgICAgICAgICAgICopIGZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkZGVwbGliIiA7OworICAgICAgICAgICAgZXNhYworCSAgICBpZiAkb3B0X3ByZXNlcnZlX2R1cF9kZXBzIDsgdGhlbgogCSAgICAgIGNhc2UgIiR0bXBfbGlicyAiIGluCi0JICAgICAgKiIgJGRlcGxpYiAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkZGVwbGliIiA7OworCSAgICAgICoiICRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQgIiopCisgICAgICAgICAgICAgICAgZnVuY19hcHBlbmQgc3BlY2lhbGRlcGxpYnMgIiAkZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0IiA7OwogCSAgICAgIGVzYWMKIAkgICAgZmkKLQkgICAgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIgorCSAgICBmdW5jX2FwcGVuZCB0bXBfbGlicyAiICRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQiCiAJICBkb25lCiAKIAkgIGlmIHRlc3QgIiRsaW5rX2FsbF9kZXBsaWJzIiAhPSBubzsgdGhlbgogCSAgICAjIEFkZCB0aGUgc2VhcmNoIHBhdGhzIG9mIGFsbCBkZXBlbmRlbmN5IGxpYnJhcmllcwogCSAgICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgICAgcGF0aD0KIAkgICAgICBjYXNlICRkZXBsaWIgaW4KIAkgICAgICAtTCopIHBhdGg9IiRkZXBsaWIiIDs7CiAJICAgICAgKi5sYSkKKwkgICAgICAgIGZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkZGVwbGliIgorCSAgICAgICAgZGVwbGliPSRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQKIAkgICAgICAgIGZ1bmNfZGlybmFtZSAiJGRlcGxpYiIgIiIgIi4iCi0JCWRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisJCWRpcj0kZnVuY19kaXJuYW1lX3Jlc3VsdAogCQkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KIAkJY2FzZSAkZGlyIGluCiAJCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgYWJzZGlyPSIkZGlyIiA7OwpAQCAtNTkyNCw4ICs3MDY2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkZGFyd2luX2luc3RhbGxfbmFtZSI7IHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFyd2luX2luc3RhbGxfbmFtZT1gJHtPVE9PTDY0fSAtTCAkZGVwZGVwbCAgfCBhd2sgJ3tpZiAoTlIgPT0gMikge3ByaW50ICQxO2V4aXR9fSdgCiAgICAgICAgICAgICAgICAgICAgICAgZmkKLQkJICAgICAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAke3dsfS1keWxpYl9maWxlICR7d2x9JHtkYXJ3aW5faW5zdGFsbF9uYW1lfToke2RlcGRlcGx9IgotCQkgICAgICBsaW5rZXJfZmxhZ3M9IiRsaW5rZXJfZmxhZ3MgLWR5bGliX2ZpbGUgJHtkYXJ3aW5faW5zdGFsbF9uYW1lfToke2RlcGRlcGx9IgorCQkgICAgICBmdW5jX2FwcGVuZCBjb21waWxlcl9mbGFncyAiICR7d2x9LWR5bGliX2ZpbGUgJHt3bH0ke2Rhcndpbl9pbnN0YWxsX25hbWV9OiR7ZGVwZGVwbH0iCisJCSAgICAgIGZ1bmNfYXBwZW5kIGxpbmtlcl9mbGFncyAiIC1keWxpYl9maWxlICR7ZGFyd2luX2luc3RhbGxfbmFtZX06JHtkZXBkZXBsfSIKIAkJICAgICAgcGF0aD0KIAkJICAgIGZpCiAJCSAgZmkKQEAgLTU5NTgsNyArNzEwMCw3IEBACiAJICBjb21waWxlX2RlcGxpYnM9IiRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAkY29tcGlsZV9kZXBsaWJzIgogCSAgZmluYWxpemVfZGVwbGlicz0iJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICRmaW5hbGl6ZV9kZXBsaWJzIgogCWVsc2UKLQkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgImAkRUNITyAiWCAkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MiIHwgJFhzZWQgLWUgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCisJICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICJgJEVDSE8gIiAkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MiIHwgJFNFRCAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKIAlmaQogICAgICAgZmkKICAgICAgIGRlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyIKQEAgLTU5NzUsNyArNzExNyw3IEBACiAJICBmb3IgZGlyIGluICRuZXdsaWJfc2VhcmNoX3BhdGg7IGRvCiAJICAgIGNhc2UgIiRsaWJfc2VhcmNoX3BhdGggIiBpbgogCSAgICAqIiAkZGlyICIqKSA7OwotCSAgICAqKSBsaWJfc2VhcmNoX3BhdGg9IiRsaWJfc2VhcmNoX3BhdGggJGRpciIgOzsKKwkgICAgKikgZnVuY19hcHBlbmQgbGliX3NlYXJjaF9wYXRoICIgJGRpciIgOzsKIAkgICAgZXNhYwogCSAgZG9uZQogCSAgbmV3bGliX3NlYXJjaF9wYXRoPQpAQCAtNjAzMywxMCArNzE3NSwxMCBAQAogCSAgICAtTCopCiAJICAgICAgY2FzZSAiICR0bXBfbGlicyAiIGluCiAJICAgICAgKiIgJGRlcGxpYiAiKikgOzsKLQkgICAgICAqKSB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiIDs7CisJICAgICAgKikgZnVuY19hcHBlbmQgdG1wX2xpYnMgIiAkZGVwbGliIiA7OwogCSAgICAgIGVzYWMKIAkgICAgICA7OwotCSAgICAqKSB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiIDs7CisJICAgICopIGZ1bmNfYXBwZW5kIHRtcF9saWJzICIgJGRlcGxpYiIgOzsKIAkgICAgZXNhYwogCSAgZG9uZQogCSAgZXZhbCAkdmFyPVwiJHRtcF9saWJzXCIKQEAgLTYwNTIsNyArNzE5NCw3IEBACiAJICA7OwogCWVzYWMKIAlpZiB0ZXN0IC1uICIkaSIgOyB0aGVuCi0JICB0bXBfbGlicz0iJHRtcF9saWJzICRpIgorCSAgZnVuY19hcHBlbmQgdG1wX2xpYnMgIiAkaSIKIAlmaQogICAgICAgZG9uZQogICAgICAgZGVwZW5kZW5jeV9saWJzPSR0bXBfbGlicwpAQCAtNjA5Myw3ICs3MjM1LDcgQEAKICAgICAgICMgTm93IHNldCB0aGUgdmFyaWFibGVzIGZvciBidWlsZGluZyBvbGQgbGlicmFyaWVzLgogICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCiAgICAgICBvbGRsaWJzPSIkb3V0cHV0IgotICAgICAgb2Jqcz0iJG9ianMkb2xkX2RlcGxpYnMiCisgICAgICBmdW5jX2FwcGVuZCBvYmpzICIkb2xkX2RlcGxpYnMiCiAgICAgICA7OwogCiAgICAgbGliKQpAQCAtNjEyNiwxMCArNzI2OCwxMCBAQAogCWlmIHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgIT0gcGFzc19hbGw7IHRoZW4KIAkgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBidWlsZCBsaWJ0b29sIGxpYnJhcnkgXGAkb3V0cHV0JyBmcm9tIG5vbi1saWJ0b29sIG9iamVjdHMgb24gdGhpcyBob3N0OiRvYmpzIgogCWVsc2UKLQkgICRFQ0hPCisJICBlY2hvCiAJICAkRUNITyAiKioqIFdhcm5pbmc6IExpbmtpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5ICRvdXRwdXQgYWdhaW5zdCB0aGUgbm9uLWxpYnRvb2wiCiAJICAkRUNITyAiKioqIG9iamVjdHMgJG9ianMgaXMgbm90IHBvcnRhYmxlISIKLQkgIGxpYm9ianM9IiRsaWJvYmpzICRvYmpzIgorCSAgZnVuY19hcHBlbmQgbGlib2JqcyAiICRvYmpzIgogCWZpCiAgICAgICBmaQogCkBAIC02MTg4LDEzICs3MzMwLDE0IEBACiAJICAjIHdoaWNoIGhhcyBhbiBleHRyYSAxIGFkZGVkIGp1c3QgZm9yIGZ1bgogCSAgIwogCSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisJICAjIGNvcnJlY3QgbGludXggdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKIAkgIGRhcndpbnxsaW51eHxvc2Z8d2luZG93c3xub25lKQogCSAgICBmdW5jX2FyaXRoICRudW1iZXJfbWFqb3IgKyAkbnVtYmVyX21pbm9yCiAJICAgIGN1cnJlbnQ9JGZ1bmNfYXJpdGhfcmVzdWx0CiAJICAgIGFnZT0iJG51bWJlcl9taW5vciIKIAkgICAgcmV2aXNpb249IiRudW1iZXJfcmV2aXNpb24iCiAJICAgIDs7Ci0JICBmcmVlYnNkLWFvdXR8ZnJlZWJzZC1lbGZ8c3Vub3MpCisJICBmcmVlYnNkLWFvdXR8ZnJlZWJzZC1lbGZ8cW54fHN1bm9zKQogCSAgICBjdXJyZW50PSIkbnVtYmVyX21ham9yIgogCSAgICByZXZpc2lvbj0iJG51bWJlcl9taW5vciIKIAkgICAgYWdlPSIwIgpAQCAtNjMwNCw3ICs3NDQ3LDcgQEAKIAkgIHZlcnN1ZmZpeD0iJG1ham9yLiRyZXZpc2lvbiIKIAkgIDs7CiAKLQlsaW51eCkKKwlsaW51eCkgIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCiAJICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQogCSAgbWFqb3I9LiRmdW5jX2FyaXRoX3Jlc3VsdAogCSAgdmVyc3VmZml4PSIkbWFqb3IuJGFnZS4kcmV2aXNpb24iCkBAIC02MzI3LDcgKzc0NzAsNyBAQAogCSAgZG9uZQogCiAJICAjIE1ha2UgZXhlY3V0YWJsZXMgZGVwZW5kIG9uIG91ciBjdXJyZW50IHZlcnNpb24uCi0JICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtjdXJyZW50fS4wIgorCSAgZnVuY19hcHBlbmQgdmVyc3RyaW5nICI6JHtjdXJyZW50fS4wIgogCSAgOzsKIAogCXFueCkKQEAgLTYzOTUsMTAgKzc1MzgsMTAgQEAKICAgICAgIGZpCiAKICAgICAgIGZ1bmNfZ2VuZXJhdGVfZGxzeW1zICIkbGlibmFtZSIgIiRsaWJuYW1lIiAieWVzIgotICAgICAgbGlib2Jqcz0iJGxpYm9ianMgJHN5bWZpbGVvYmoiCisgICAgICBmdW5jX2FwcGVuZCBsaWJvYmpzICIgJHN5bWZpbGVvYmoiCiAgICAgICB0ZXN0ICJYJGxpYm9ianMiID0gIlggIiAmJiBsaWJvYmpzPQogCi0gICAgICBpZiB0ZXN0ICIkbW9kZSIgIT0gcmVsaW5rOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkb3B0X21vZGUiICE9IHJlbGluazsgdGhlbgogCSMgUmVtb3ZlIG91ciBvdXRwdXRzLCBidXQgZG9uJ3QgcmVtb3ZlIG9iamVjdCBmaWxlcyBzaW5jZSB0aGV5CiAJIyBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQgd2hlbiBjb21waWxpbmcgUElDIG9iamVjdHMuCiAJcmVtb3ZlbGlzdD0KQEAgLTY0MTQsNyArNzU1Nyw3IEBACiAJCSAgIGNvbnRpbnVlCiAJCSBmaQogCSAgICAgICBmaQotCSAgICAgICByZW1vdmVsaXN0PSIkcmVtb3ZlbGlzdCAkcCIKKwkgICAgICAgZnVuY19hcHBlbmQgcmVtb3ZlbGlzdCAiICRwIgogCSAgICAgICA7OwogCSAgICAqKSA7OwogCSAgZXNhYwpAQCAtNjQyNSwyNyArNzU2OCwyOCBAQAogCiAgICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KICAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0gY29udmVuaWVuY2UgOyB0aGVuCi0Jb2xkbGlicz0iJG9sZGxpYnMgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKKwlmdW5jX2FwcGVuZCBvbGRsaWJzICIgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKIAogCSMgVHJhbnNmb3JtIC5sbyBmaWxlcyB0byAubyBmaWxlcy4KLQlvbGRvYmpzPSIkb2JqcyAiYCRFQ0hPICJYJGxpYm9ianMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgJy9cLicke2xpYmV4dH0nJC9kJyAtZSAiJGxvMm8iIHwgJE5MMlNQYAorCW9sZG9ianM9IiRvYmpzICJgJEVDSE8gIiRsaWJvYmpzIiB8ICRTUDJOTCB8ICRTRUQgIi9cLiR7bGliZXh0fSQvZDsgJGxvMm8iIHwgJE5MMlNQYAogICAgICAgZmkKIAogICAgICAgIyBFbGltaW5hdGUgYWxsIHRlbXBvcmFyeSBkaXJlY3Rvcmllcy4KICAgICAgICNmb3IgcGF0aCBpbiAkbm90aW5zdF9wYXRoOyBkbwotICAgICAgIwlsaWJfc2VhcmNoX3BhdGg9YCRFQ0hPICJYJGxpYl9zZWFyY2hfcGF0aCAiIHwgJFhzZWQgLWUgInMlICRwYXRoICUgJWciYAotICAgICAgIwlkZXBsaWJzPWAkRUNITyAiWCRkZXBsaWJzICIgfCAkWHNlZCAtZSAicyUgLUwkcGF0aCAlICVnImAKLSAgICAgICMJZGVwZW5kZW5jeV9saWJzPWAkRUNITyAiWCRkZXBlbmRlbmN5X2xpYnMgIiB8ICRYc2VkIC1lICJzJSAtTCRwYXRoICUgJWciYAorICAgICAgIwlsaWJfc2VhcmNoX3BhdGg9YCRFQ0hPICIkbGliX3NlYXJjaF9wYXRoICIgfCAkU0VEICJzJSAkcGF0aCAlICVnImAKKyAgICAgICMJZGVwbGlicz1gJEVDSE8gIiRkZXBsaWJzICIgfCAkU0VEICJzJSAtTCRwYXRoICUgJWciYAorICAgICAgIwlkZXBlbmRlbmN5X2xpYnM9YCRFQ0hPICIkZGVwZW5kZW5jeV9saWJzICIgfCAkU0VEICJzJSAtTCRwYXRoICUgJWciYAogICAgICAgI2RvbmUKIAogICAgICAgaWYgdGVzdCAtbiAiJHhycGF0aCI7IHRoZW4KIAkjIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhbnkgcnBhdGggZmxhZ3MsIHRoZW4gYWRkIHRoZW0uCiAJdGVtcF94cnBhdGg9CiAJZm9yIGxpYmRpciBpbiAkeHJwYXRoOyBkbwotCSAgdGVtcF94cnBhdGg9IiR0ZW1wX3hycGF0aCAtUiRsaWJkaXIiCisJICBmdW5jX3JlcGxhY2Vfc3lzcm9vdCAiJGxpYmRpciIKKwkgIGZ1bmNfYXBwZW5kIHRlbXBfeHJwYXRoICIgLVIkZnVuY19yZXBsYWNlX3N5c3Jvb3RfcmVzdWx0IgogCSAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KIAkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBmaW5hbGl6ZV9ycGF0aD0iJGZpbmFsaXplX3JwYXRoICRsaWJkaXIiIDs7CisJICAqKSBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9ycGF0aCAiICRsaWJkaXIiIDs7CiAJICBlc2FjCiAJZG9uZQogCWlmIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiICE9IHllcyB8fCB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCkBAIC02NDU5LDcgKzc2MDMsNyBAQAogICAgICAgZm9yIGxpYiBpbiAkb2xkX2RsZmlsZXM7IGRvCiAJY2FzZSAiICRkbHByZWZpbGVzICRkbGZpbGVzICIgaW4KIAkqIiAkbGliICIqKSA7OwotCSopIGRsZmlsZXM9IiRkbGZpbGVzICRsaWIiIDs7CisJKikgZnVuY19hcHBlbmQgZGxmaWxlcyAiICRsaWIiIDs7CiAJZXNhYwogICAgICAgZG9uZQogCkBAIC02NDY5LDE5ICs3NjEzLDE5IEBACiAgICAgICBmb3IgbGliIGluICRvbGRfZGxwcmVmaWxlczsgZG8KIAljYXNlICIkZGxwcmVmaWxlcyAiIGluCiAJKiIgJGxpYiAiKikgOzsKLQkqKSBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkbGliIiA7OworCSopIGZ1bmNfYXBwZW5kIGRscHJlZmlsZXMgIiAkbGliIiA7OwogCWVzYWMKICAgICAgIGRvbmUKIAogICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KIAlpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCiAJICBjYXNlICRob3N0IGluCi0JICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotKi1iZW9zKiB8ICotY2VnY2MqKQorCSAgKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiogfCAqLSotYmVvcyogfCAqLWNlZ2NjKiB8ICotKi1oYWlrdSopCiAJICAgICMgdGhlc2Ugc3lzdGVtcyBkb24ndCBhY3R1YWxseSBoYXZlIGEgYyBsaWJyYXJ5IChhcyBzdWNoKSEKIAkgICAgOzsKIAkgICotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKIAkgICAgIyBSaGFwc29keSBDIGxpYnJhcnkgaXMgaW4gdGhlIFN5c3RlbSBmcmFtZXdvcmsKLQkgICAgZGVwbGlicz0iJGRlcGxpYnMgU3lzdGVtLmx0ZnJhbWV3b3JrIgorCSAgICBmdW5jX2FwcGVuZCBkZXBsaWJzICIgU3lzdGVtLmx0ZnJhbWV3b3JrIgogCSAgICA7OwogCSAgKi0qLW5ldGJzZCopCiAJICAgICMgRG9uJ3QgbGluayB3aXRoIGxpYmMgdW50aWwgdGhlIGEub3V0IGxkLnNvIGlzIGZpeGVkLgpAQCAtNjQ5OCw3ICs3NjQyLDcgQEAKIAkgICopCiAJICAgICMgQWRkIGxpYmMgdG8gZGVwbGlicyBvbiBhbGwgb3RoZXIgc3lzdGVtcyBpZiBuZWNlc3NhcnkuCiAJICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX25lZWRfbGMiID0gInllcyI7IHRoZW4KLQkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAtbGMiCisJICAgICAgZnVuY19hcHBlbmQgZGVwbGlicyAiIC1sYyIKIAkgICAgZmkKIAkgICAgOzsKIAkgIGVzYWMKQEAgLTY1NDcsNyArNzY5MSw3IEBACiAJCWlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KIAkJICBjYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KIAkJICAqIiAkaSAiKikKLQkJICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgorCQkgICAgZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRpIgogCQkgICAgaT0iIgogCQkgICAgOzsKIAkJICBlc2FjCkBAIC02NTU4LDIxICs3NzAyLDIxIEBACiAJCSAgc2V0IGR1bW15ICRkZXBsaWJfbWF0Y2hlczsgc2hpZnQKIAkJICBkZXBsaWJfbWF0Y2g9JDEKIAkJICBpZiB0ZXN0IGBleHByICIkbGRkX291dHB1dCIgOiAiLiokZGVwbGliX21hdGNoImAgLW5lIDAgOyB0aGVuCi0JCSAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKKwkJICAgIGZ1bmNfYXBwZW5kIG5ld2RlcGxpYnMgIiAkaSIKIAkJICBlbHNlCiAJCSAgICBkcm9wcGVkZGVwcz15ZXMKLQkJICAgICRFQ0hPCisJCSAgICBlY2hvCiAJCSAgICAkRUNITyAiKioqIFdhcm5pbmc6IGR5bmFtaWMgbGlua2VyIGRvZXMgbm90IGFjY2VwdCBuZWVkZWQgbGlicmFyeSAkaS4iCi0JCSAgICAkRUNITyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKLQkJICAgICRFQ0hPICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgotCQkgICAgJEVDSE8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggSSBiZWxpZXZlIHlvdSBkbyBub3QgaGF2ZSIKLQkJICAgICRFQ0hPICIqKiogYmVjYXVzZSBhIHRlc3RfY29tcGlsZSBkaWQgcmV2ZWFsIHRoYXQgdGhlIGxpbmtlciBkaWQgbm90IHVzZSBpdCBmb3IiCi0JCSAgICAkRUNITyAiKioqIGl0cyBkeW5hbWljIGRlcGVuZGVuY3kgbGlzdCB0aGF0IHByb2dyYW1zIGdldCByZXNvbHZlZCB3aXRoIGF0IHJ1bnRpbWUuIgorCQkgICAgZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkJICAgIGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJCSAgICBlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIEkgYmVsaWV2ZSB5b3UgZG8gbm90IGhhdmUiCisJCSAgICBlY2hvICIqKiogYmVjYXVzZSBhIHRlc3RfY29tcGlsZSBkaWQgcmV2ZWFsIHRoYXQgdGhlIGxpbmtlciBkaWQgbm90IHVzZSBpdCBmb3IiCisJCSAgICBlY2hvICIqKiogaXRzIGR5bmFtaWMgZGVwZW5kZW5jeSBsaXN0IHRoYXQgcHJvZ3JhbXMgZ2V0IHJlc29sdmVkIHdpdGggYXQgcnVudGltZS4iCiAJCSAgZmkKIAkJZmkKIAkJOzsKIAkgICAgICAqKQotCQluZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKKwkJZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRpIgogCQk7OwogCSAgICAgIGVzYWMKIAkgICAgZG9uZQpAQCAtNjU5MCw3ICs3NzM0LDcgQEAKIAkJICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCiAJCSAgICBjYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KIAkJICAgICoiICRpICIqKQotCQkgICAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKKwkJICAgICAgZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRpIgogCQkgICAgICBpPSIiCiAJCSAgICAgIDs7CiAJCSAgICBlc2FjCkBAIC02NjAxLDI5ICs3NzQ1LDI5IEBACiAJCSAgICBzZXQgZHVtbXkgJGRlcGxpYl9tYXRjaGVzOyBzaGlmdAogCQkgICAgZGVwbGliX21hdGNoPSQxCiAJCSAgICBpZiB0ZXN0IGBleHByICIkbGRkX291dHB1dCIgOiAiLiokZGVwbGliX21hdGNoImAgLW5lIDAgOyB0aGVuCi0JCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgorCQkgICAgICBmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGkiCiAJCSAgICBlbHNlCiAJCSAgICAgIGRyb3BwZWRkZXBzPXllcwotCQkgICAgICAkRUNITworCQkgICAgICBlY2hvCiAJCSAgICAgICRFQ0hPICIqKiogV2FybmluZzogZHluYW1pYyBsaW5rZXIgZG9lcyBub3QgYWNjZXB0IG5lZWRlZCBsaWJyYXJ5ICRpLiIKLQkJICAgICAgJEVDSE8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCi0JCSAgICAgICRFQ0hPICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgotCQkgICAgICAkRUNITyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgotCQkgICAgICAkRUNITyAiKioqIGJlY2F1c2UgYSB0ZXN0X2NvbXBpbGUgZGlkIHJldmVhbCB0aGF0IHRoZSBsaW5rZXIgZGlkIG5vdCB1c2UgdGhpcyBvbmUiCi0JCSAgICAgICRFQ0hPICIqKiogYXMgYSBkeW5hbWljIGRlcGVuZGVuY3kgdGhhdCBwcm9ncmFtcyBjYW4gZ2V0IHJlc29sdmVkIHdpdGggYXQgcnVudGltZS4iCisJCSAgICAgIGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJCSAgICAgIGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJCSAgICAgIGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKKwkJICAgICAgZWNobyAiKioqIGJlY2F1c2UgYSB0ZXN0X2NvbXBpbGUgZGlkIHJldmVhbCB0aGF0IHRoZSBsaW5rZXIgZGlkIG5vdCB1c2UgdGhpcyBvbmUiCisJCSAgICAgIGVjaG8gIioqKiBhcyBhIGR5bmFtaWMgZGVwZW5kZW5jeSB0aGF0IHByb2dyYW1zIGNhbiBnZXQgcmVzb2x2ZWQgd2l0aCBhdCBydW50aW1lLiIKIAkJICAgIGZpCiAJCSAgZmkKIAkJZWxzZQogCQkgIGRyb3BwZWRkZXBzPXllcwotCQkgICRFQ0hPCisJCSAgZWNobwogCQkgICRFQ0hPICIqKiogV2FybmluZyEgIExpYnJhcnkgJGkgaXMgbmVlZGVkIGJ5IHRoaXMgbGlicmFyeSBidXQgSSB3YXMgbm90IGFibGUgdG8iCi0JCSAgJEVDSE8gIioqKiBtYWtlIGl0IGxpbmsgaW4hICBZb3Ugd2lsbCBwcm9iYWJseSBuZWVkIHRvIGluc3RhbGwgaXQgb3Igc29tZSIKLQkJICAkRUNITyAiKioqIGxpYnJhcnkgdGhhdCBpdCBkZXBlbmRzIG9uIGJlZm9yZSB0aGlzIGxpYnJhcnkgd2lsbCBiZSBmdWxseSIKLQkJICAkRUNITyAiKioqIGZ1bmN0aW9uYWwuICBJbnN0YWxsaW5nIGl0IGJlZm9yZSBjb250aW51aW5nIHdvdWxkIGJlIGV2ZW4gYmV0dGVyLiIKKwkJICBlY2hvICIqKiogbWFrZSBpdCBsaW5rIGluISAgWW91IHdpbGwgcHJvYmFibHkgbmVlZCB0byBpbnN0YWxsIGl0IG9yIHNvbWUiCisJCSAgZWNobyAiKioqIGxpYnJhcnkgdGhhdCBpdCBkZXBlbmRzIG9uIGJlZm9yZSB0aGlzIGxpYnJhcnkgd2lsbCBiZSBmdWxseSIKKwkJICBlY2hvICIqKiogZnVuY3Rpb25hbC4gIEluc3RhbGxpbmcgaXQgYmVmb3JlIGNvbnRpbnVpbmcgd291bGQgYmUgZXZlbiBiZXR0ZXIuIgogCQlmaQogCQk7OwogCSAgICAgICopCi0JCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgorCQlmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGkiCiAJCTs7CiAJICAgICAgZXNhYwogCSAgICBkb25lCkBAIC02NjQwLDE1ICs3Nzg0LDI3IEBACiAJICAgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgogCQljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KIAkJKiIgJGFfZGVwbGliICIqKQotCQkgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKKwkJICBmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGFfZGVwbGliIgogCQkgIGFfZGVwbGliPSIiCiAJCSAgOzsKIAkJZXNhYwogCSAgICAgIGZpCiAJICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KIAkJbGlibmFtZT1gZXZhbCAiXFwkRUNITyBcIiRsaWJuYW1lX3NwZWNcIiJgCisJCWlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX2dsb2IiOyB0aGVuCisJCSAgbGlibmFtZWdsb2I9YGZ1bmNfZWNob19hbGwgIiRsaWJuYW1lIiB8ICRTRUQgLWUgJGZpbGVfbWFnaWNfZ2xvYmAKKwkJZWxzZQorCQkgIGxpYm5hbWVnbG9iPSRsaWJuYW1lCisJCWZpCisJCXRlc3QgIiR3YW50X25vY2FzZWdsb2IiID0geWVzICYmIG5vY2FzZWdsb2I9YHNob3B0IC1wIG5vY2FzZWdsb2JgCiAJCWZvciBpIGluICRsaWJfc2VhcmNoX3BhdGggJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoOyBkbwotCQkgIHBvdGVudGlhbF9saWJzPWBscyAkaS8kbGlibmFtZVsuLV0qIDI+L2Rldi9udWxsYAorCQkgIGlmIHRlc3QgIiR3YW50X25vY2FzZWdsb2IiID0geWVzOyB0aGVuCisJCSAgICBzaG9wdCAtcyBub2Nhc2VnbG9iCisJCSAgICBwb3RlbnRpYWxfbGlicz1gbHMgJGkvJGxpYm5hbWVnbG9iWy4tXSogMj4vZGV2L251bGxgCisJCSAgICAkbm9jYXNlZ2xvYgorCQkgIGVsc2UKKwkJICAgIHBvdGVudGlhbF9saWJzPWBscyAkaS8kbGlibmFtZWdsb2JbLi1dKiAyPi9kZXYvbnVsbGAKKwkJICBmaQogCQkgIGZvciBwb3RlbnRfbGliIGluICRwb3RlbnRpYWxfbGliczsgZG8KIAkJICAgICAgIyBGb2xsb3cgc29mdCBsaW5rcy4KIAkJICAgICAgaWYgbHMgLWxMZCAiJHBvdGVudF9saWIiIDI+L2Rldi9udWxsIHwKQEAgLTY2NjUsMTMgKzc4MjEsMTMgQEAKIAkJCXBvdGxpYmxpbms9YGxzIC1sZCAkcG90bGliIHwgJHtTRUR9ICdzLy4qIC0+IC8vJ2AKIAkJCWNhc2UgJHBvdGxpYmxpbmsgaW4KIAkJCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgcG90bGliPSIkcG90bGlibGluayI7OwotCQkJKikgcG90bGliPWAkRUNITyAiWCRwb3RsaWIiIHwgJFhzZWQgLWUgJ3MsW14vXSokLCwnYCIkcG90bGlibGluayI7OworCQkJKikgcG90bGliPWAkRUNITyAiJHBvdGxpYiIgfCAkU0VEICdzLFteL10qJCwsJ2AiJHBvdGxpYmxpbmsiOzsKIAkJCWVzYWMKIAkJICAgICAgZG9uZQogCQkgICAgICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcIlwkcG90bGliXCIgMj4vZGV2L251bGwgfAogCQkJICRTRUQgLWUgMTBxIHwKIAkJCSAkRUdSRVAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgotCQkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgorCQkJZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRhX2RlcGxpYiIKIAkJCWFfZGVwbGliPSIiCiAJCQlicmVhayAyCiAJCSAgICAgIGZpCkBAIC02NjgwLDEyICs3ODM2LDEyIEBACiAJICAgICAgZmkKIAkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgogCQlkcm9wcGVkZGVwcz15ZXMKLQkJJEVDSE8KKwkJZWNobwogCQkkRUNITyAiKioqIFdhcm5pbmc6IGxpbmtlciBwYXRoIGRvZXMgbm90IGhhdmUgcmVhbCBmaWxlIGZvciBsaWJyYXJ5ICRhX2RlcGxpYi4iCi0JCSRFQ0hPICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCQkkRUNITyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkJJEVDSE8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKLQkJJEVDSE8gIioqKiBiZWNhdXNlIEkgZGlkIGNoZWNrIHRoZSBsaW5rZXIgcGF0aCBsb29raW5nIGZvciBhIGZpbGUgc3RhcnRpbmciCisJCWVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJCWVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJCWVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKKwkJZWNobyAiKioqIGJlY2F1c2UgSSBkaWQgY2hlY2sgdGhlIGxpbmtlciBwYXRoIGxvb2tpbmcgZm9yIGEgZmlsZSBzdGFydGluZyIKIAkJaWYgdGVzdCAteiAiJHBvdGxpYiIgOyB0aGVuCiAJCSAgJEVDSE8gIioqKiB3aXRoICRsaWJuYW1lIGJ1dCBubyBjYW5kaWRhdGVzIHdlcmUgZm91bmQuICguLi5mb3IgZmlsZSBtYWdpYyB0ZXN0KSIKIAkJZWxzZQpAQCAtNjY5Niw3ICs3ODUyLDcgQEAKIAkgICAgICA7OwogCSAgICAqKQogCSAgICAgICMgQWRkIGEgLUwgYXJndW1lbnQuCi0JICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgorCSAgICAgIGZ1bmNfYXBwZW5kIG5ld2RlcGxpYnMgIiAkYV9kZXBsaWIiCiAJICAgICAgOzsKIAkgICAgZXNhYwogCSAgZG9uZSAjIEdvbmUgdGhyb3VnaCBhbGwgZGVwbGlicy4KQEAgLTY3MTIsNyArNzg2OCw3IEBACiAJICAgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgogCQljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KIAkJKiIgJGFfZGVwbGliICIqKQotCQkgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKKwkJICBmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGFfZGVwbGliIgogCQkgIGFfZGVwbGliPSIiCiAJCSAgOzsKIAkJZXNhYwpAQCAtNjcyMyw5ICs3ODc5LDkgQEAKIAkJICBwb3RlbnRpYWxfbGlicz1gbHMgJGkvJGxpYm5hbWVbLi1dKiAyPi9kZXYvbnVsbGAKIAkJICBmb3IgcG90ZW50X2xpYiBpbiAkcG90ZW50aWFsX2xpYnM7IGRvCiAJCSAgICBwb3RsaWI9IiRwb3RlbnRfbGliIiAjIHNlZSBzeW1saW5rLWNoZWNrIGFib3ZlIGluIGZpbGVfbWFnaWMgdGVzdAotCQkgICAgaWYgZXZhbCAiXCRFQ0hPIFwiWCRwb3RlbnRfbGliXCIiIDI+L2Rldi9udWxsIHwgJFhzZWQgLWUgMTBxIHwgXAorCQkgICAgaWYgZXZhbCAiXCRFQ0hPIFwiJHBvdGVudF9saWJcIiIgMj4vZGV2L251bGwgfCAkU0VEIDEwcSB8IFwKIAkJICAgICAgICRFR1JFUCAiJG1hdGNoX3BhdHRlcm5fcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCi0JCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKKwkJICAgICAgZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRhX2RlcGxpYiIKIAkJICAgICAgYV9kZXBsaWI9IiIKIAkJICAgICAgYnJlYWsgMgogCQkgICAgZmkKQEAgLTY3MzQsMTIgKzc4OTAsMTIgQEAKIAkgICAgICBmaQogCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCiAJCWRyb3BwZWRkZXBzPXllcwotCQkkRUNITworCQllY2hvCiAJCSRFQ0hPICIqKiogV2FybmluZzogbGlua2VyIHBhdGggZG9lcyBub3QgaGF2ZSByZWFsIGZpbGUgZm9yIGxpYnJhcnkgJGFfZGVwbGliLiIKLQkJJEVDSE8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCi0JCSRFQ0hPICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgotCQkkRUNITyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgotCQkkRUNITyAiKioqIGJlY2F1c2UgSSBkaWQgY2hlY2sgdGhlIGxpbmtlciBwYXRoIGxvb2tpbmcgZm9yIGEgZmlsZSBzdGFydGluZyIKKwkJZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkJZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgorCQllY2hvICIqKiogYmVjYXVzZSBJIGRpZCBjaGVjayB0aGUgbGlua2VyIHBhdGggbG9va2luZyBmb3IgYSBmaWxlIHN0YXJ0aW5nIgogCQlpZiB0ZXN0IC16ICIkcG90bGliIiA7IHRoZW4KIAkJICAkRUNITyAiKioqIHdpdGggJGxpYm5hbWUgYnV0IG5vIGNhbmRpZGF0ZXMgd2VyZSBmb3VuZC4gKC4uLmZvciByZWdleCBwYXR0ZXJuIHRlc3QpIgogCQllbHNlCkBAIC02NzUwLDMyICs3OTA2LDMyIEBACiAJICAgICAgOzsKIAkgICAgKikKIAkgICAgICAjIEFkZCBhIC1MIGFyZ3VtZW50LgotCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKKwkgICAgICBmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGFfZGVwbGliIgogCSAgICAgIDs7CiAJICAgIGVzYWMKIAkgIGRvbmUgIyBHb25lIHRocm91Z2ggYWxsIGRlcGxpYnMuCiAJICA7OwogCW5vbmUgfCB1bmtub3duIHwgKikKIAkgIG5ld2RlcGxpYnM9IiIKLQkgIHRtcF9kZXBsaWJzPWAkRUNITyAiWCAkZGVwbGlicyIgfCAkWHNlZCBcCi0JICAgICAgLWUgJ3MvIC1sYyQvLycgLWUgJ3MvIC1bTFJdW14gXSovL2cnYAorCSAgdG1wX2RlcGxpYnM9YCRFQ0hPICIgJGRlcGxpYnMiIHwgJFNFRCAncy8gLWxjJC8vOyBzLyAtW0xSXVteIF0qLy9nJ2AKIAkgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KIAkgICAgZm9yIGkgaW4gJHByZWRlcHMgJHBvc3RkZXBzIDsgZG8KIAkgICAgICAjIGNhbid0IHVzZSBYc2VkIGJlbG93LCBiZWNhdXNlICRpIG1pZ2h0IGNvbnRhaW4gJy8nCi0JICAgICAgdG1wX2RlcGxpYnM9YCRFQ0hPICJYICR0bXBfZGVwbGlicyIgfCAkWHNlZCAtZSAicywkaSwsImAKKwkgICAgICB0bXBfZGVwbGlicz1gJEVDSE8gIiAkdG1wX2RlcGxpYnMiIHwgJFNFRCAicywkaSwsImAKIAkgICAgZG9uZQogCSAgZmkKLQkgIGlmICRFQ0hPICJYICR0bXBfZGVwbGlicyIgfCAkWHNlZCAtZSAncy9bCSBdLy9nJyB8Ci0JICAgICAkR1JFUCAuID4vZGV2L251bGw7IHRoZW4KLQkgICAgJEVDSE8KKwkgIGNhc2UgJHRtcF9kZXBsaWJzIGluCisJICAqWyFcCVwgXSopCisJICAgIGVjaG8KIAkgICAgaWYgdGVzdCAiWCRkZXBsaWJzX2NoZWNrX21ldGhvZCIgPSAiWG5vbmUiOyB0aGVuCi0JICAgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHBsYXRmb3JtLiIKKwkgICAgICBlY2hvICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBwbGF0Zm9ybS4iCiAJICAgIGVsc2UKLQkgICAgICAkRUNITyAiKioqIFdhcm5pbmc6IGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBub3Qga25vd24gdG8gYmUgc3VwcG9ydGVkLiIKKwkgICAgICBlY2hvICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBrbm93biB0byBiZSBzdXBwb3J0ZWQuIgogCSAgICBmaQotCSAgICAkRUNITyAiKioqIEFsbCBkZWNsYXJlZCBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgYmVpbmcgZHJvcHBlZC4iCisJICAgIGVjaG8gIioqKiBBbGwgZGVjbGFyZWQgaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIGJlaW5nIGRyb3BwZWQuIgogCSAgICBkcm9wcGVkZGVwcz15ZXMKLQkgIGZpCisJICAgIDs7CisJICBlc2FjCiAJICA7OwogCWVzYWMKIAl2ZXJzdWZmaXg9JHZlcnN1ZmZpeF9zYXZlCkBAIC02Nzg3LDIzICs3OTQzLDIzIEBACiAJY2FzZSAkaG9zdCBpbgogCSotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKIAkgICMgT24gUmhhcHNvZHkgcmVwbGFjZSB0aGUgQyBsaWJyYXJ5IHdpdGggdGhlIFN5c3RlbSBmcmFtZXdvcmsKLQkgIG5ld2RlcGxpYnM9YCRFQ0hPICJYICRuZXdkZXBsaWJzIiB8ICRYc2VkIC1lICdzLyAtbGMgLyBTeXN0ZW0ubHRmcmFtZXdvcmsgLydgCisJICBuZXdkZXBsaWJzPWAkRUNITyAiICRuZXdkZXBsaWJzIiB8ICRTRUQgJ3MvIC1sYyAvIFN5c3RlbS5sdGZyYW1ld29yayAvJ2AKIAkgIDs7CiAJZXNhYwogCiAJaWYgdGVzdCAiJGRyb3BwZWRkZXBzIiA9IHllczsgdGhlbgogCSAgaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXM7IHRoZW4KLQkgICAgJEVDSE8KLQkgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBsaWJ0b29sIGNvdWxkIG5vdCBzYXRpc2Z5IGFsbCBkZWNsYXJlZCBpbnRlci1saWJyYXJ5IgorCSAgICBlY2hvCisJICAgIGVjaG8gIioqKiBXYXJuaW5nOiBsaWJ0b29sIGNvdWxkIG5vdCBzYXRpc2Z5IGFsbCBkZWNsYXJlZCBpbnRlci1saWJyYXJ5IgogCSAgICAkRUNITyAiKioqIGRlcGVuZGVuY2llcyBvZiBtb2R1bGUgJGxpYm5hbWUuICBUaGVyZWZvcmUsIGxpYnRvb2wgd2lsbCBjcmVhdGUiCi0JICAgICRFQ0hPICIqKiogYSBzdGF0aWMgbW9kdWxlLCB0aGF0IHNob3VsZCB3b3JrIGFzIGxvbmcgYXMgdGhlIGRsb3BlbmluZyIKLQkgICAgJEVDSE8gIioqKiBhcHBsaWNhdGlvbiBpcyBsaW5rZWQgd2l0aCB0aGUgLWRsb3BlbiBmbGFnLiIKKwkgICAgZWNobyAiKioqIGEgc3RhdGljIG1vZHVsZSwgdGhhdCBzaG91bGQgd29yayBhcyBsb25nIGFzIHRoZSBkbG9wZW5pbmciCisJICAgIGVjaG8gIioqKiBhcHBsaWNhdGlvbiBpcyBsaW5rZWQgd2l0aCB0aGUgLWRsb3BlbiBmbGFnLiIKIAkgICAgaWYgdGVzdCAteiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLQkgICAgICAkRUNITwotCSAgICAgICRFQ0hPICIqKiogSG93ZXZlciwgdGhpcyB3b3VsZCBvbmx5IHdvcmsgaWYgbGlidG9vbCB3YXMgYWJsZSB0byBleHRyYWN0IHN5bWJvbCIKLQkgICAgICAkRUNITyAiKioqIGxpc3RzIGZyb20gYSBwcm9ncmFtLCB1c2luZyBcYG5tJyBvciBlcXVpdmFsZW50LCBidXQgbGlidG9vbCBjb3VsZCIKLQkgICAgICAkRUNITyAiKioqIG5vdCBmaW5kIHN1Y2ggYSBwcm9ncmFtLiAgU28sIHRoaXMgbW9kdWxlIGlzIHByb2JhYmx5IHVzZWxlc3MuIgotCSAgICAgICRFQ0hPICIqKiogXGBubScgZnJvbSBHTlUgYmludXRpbHMgYW5kIGEgZnVsbCByZWJ1aWxkIG1heSBoZWxwLiIKKwkgICAgICBlY2hvCisJICAgICAgZWNobyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCisJICAgICAgZWNobyAiKioqIGxpc3RzIGZyb20gYSBwcm9ncmFtLCB1c2luZyBcYG5tJyBvciBlcXVpdmFsZW50LCBidXQgbGlidG9vbCBjb3VsZCIKKwkgICAgICBlY2hvICIqKiogbm90IGZpbmQgc3VjaCBhIHByb2dyYW0uICBTbywgdGhpcyBtb2R1bGUgaXMgcHJvYmFibHkgdXNlbGVzcy4iCisJICAgICAgZWNobyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCiAJICAgIGZpCiAJICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSBubzsgdGhlbgogCSAgICAgIG9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCkBAIC02ODEzLDE2ICs3OTY5LDE2IEBACiAJICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCiAJICAgIGZpCiAJICBlbHNlCi0JICAgICRFQ0hPICIqKiogVGhlIGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIHRoYXQgaGF2ZSBiZWVuIGRyb3BwZWQgaGVyZSB3aWxsIGJlIgotCSAgICAkRUNITyAiKioqIGF1dG9tYXRpY2FsbHkgYWRkZWQgd2hlbmV2ZXIgYSBwcm9ncmFtIGlzIGxpbmtlZCB3aXRoIHRoaXMgbGlicmFyeSIKLQkgICAgJEVDSE8gIioqKiBvciBpcyBkZWNsYXJlZCB0byAtZGxvcGVuIGl0LiIKKwkgICAgZWNobyAiKioqIFRoZSBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyB0aGF0IGhhdmUgYmVlbiBkcm9wcGVkIGhlcmUgd2lsbCBiZSIKKwkgICAgZWNobyAiKioqIGF1dG9tYXRpY2FsbHkgYWRkZWQgd2hlbmV2ZXIgYSBwcm9ncmFtIGlzIGxpbmtlZCB3aXRoIHRoaXMgbGlicmFyeSIKKwkgICAgZWNobyAiKioqIG9yIGlzIGRlY2xhcmVkIHRvIC1kbG9wZW4gaXQuIgogCiAJICAgIGlmIHRlc3QgIiRhbGxvd191bmRlZmluZWQiID0gbm87IHRoZW4KLQkgICAgICAkRUNITwotCSAgICAgICRFQ0hPICIqKiogU2luY2UgdGhpcyBsaWJyYXJ5IG11c3Qgbm90IGNvbnRhaW4gdW5kZWZpbmVkIHN5bWJvbHMsIgotCSAgICAgICRFQ0hPICIqKiogYmVjYXVzZSBlaXRoZXIgdGhlIHBsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgdGhlbSBvciIKLQkgICAgICAkRUNITyAiKioqIGl0IHdhcyBleHBsaWNpdGx5IHJlcXVlc3RlZCB3aXRoIC1uby11bmRlZmluZWQsIgotCSAgICAgICRFQ0hPICIqKiogbGlidG9vbCB3aWxsIG9ubHkgY3JlYXRlIGEgc3RhdGljIHZlcnNpb24gb2YgaXQuIgorCSAgICAgIGVjaG8KKwkgICAgICBlY2hvICIqKiogU2luY2UgdGhpcyBsaWJyYXJ5IG11c3Qgbm90IGNvbnRhaW4gdW5kZWZpbmVkIHN5bWJvbHMsIgorCSAgICAgIGVjaG8gIioqKiBiZWNhdXNlIGVpdGhlciB0aGUgcGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCB0aGVtIG9yIgorCSAgICAgIGVjaG8gIioqKiBpdCB3YXMgZXhwbGljaXRseSByZXF1ZXN0ZWQgd2l0aCAtbm8tdW5kZWZpbmVkLCIKKwkgICAgICBlY2hvICIqKiogbGlidG9vbCB3aWxsIG9ubHkgY3JlYXRlIGEgc3RhdGljIHZlcnNpb24gb2YgaXQuIgogCSAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSBubzsgdGhlbgogCQlvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgogCQlidWlsZF9saWJ0b29sX2xpYnM9bW9kdWxlCkBAIC02ODM5LDkgKzc5OTUsOSBAQAogICAgICAgIyBUaW1lIHRvIGNoYW5nZSBhbGwgb3VyICJmb28ubHRmcmFtZXdvcmsiIHN0dWZmIGJhY2sgdG8gIi1mcmFtZXdvcmsgZm9vIgogICAgICAgY2FzZSAkaG9zdCBpbgogCSotKi1kYXJ3aW4qKQotCSAgbmV3ZGVwbGlicz1gJEVDSE8gIlggJG5ld2RlcGxpYnMiIHwgJFhzZWQgLWUgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCi0JICBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncz1gJEVDSE8gIlggJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzIiB8ICRYc2VkIC1lICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAotCSAgZGVwbGlicz1gJEVDSE8gIlggJGRlcGxpYnMiIHwgJFhzZWQgLWUgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCisJICBuZXdkZXBsaWJzPWAkRUNITyAiICRuZXdkZXBsaWJzIiB8ICRTRUQgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCisJICBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncz1gJEVDSE8gIiAkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MiIHwgJFNFRCAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwkgIGRlcGxpYnM9YCRFQ0hPICIgJGRlcGxpYnMiIHwgJFNFRCAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKIAkgIDs7CiAgICAgICBlc2FjCiAKQEAgLTY4NTQsNyArODAxMCw3IEBACiAJKikKIAkgIGNhc2UgIiAkZGVwbGlicyAiIGluCiAJICAqIiAtTCRwYXRoLyRvYmpkaXIgIiopCi0JICAgIG5ld19saWJzPSIkbmV3X2xpYnMgLUwkcGF0aC8kb2JqZGlyIiA7OworCSAgICBmdW5jX2FwcGVuZCBuZXdfbGlicyAiIC1MJHBhdGgvJG9iamRpciIgOzsKIAkgIGVzYWMKIAkgIDs7CiAJZXNhYwpAQCAtNjg2NCwxMCArODAyMCwxMCBAQAogCS1MKikKIAkgIGNhc2UgIiAkbmV3X2xpYnMgIiBpbgogCSAgKiIgJGRlcGxpYiAiKikgOzsKLQkgICopIG5ld19saWJzPSIkbmV3X2xpYnMgJGRlcGxpYiIgOzsKKwkgICopIGZ1bmNfYXBwZW5kIG5ld19saWJzICIgJGRlcGxpYiIgOzsKIAkgIGVzYWMKIAkgIDs7Ci0JKikgbmV3X2xpYnM9IiRuZXdfbGlicyAkZGVwbGliIiA7OworCSopIGZ1bmNfYXBwZW5kIG5ld19saWJzICIgJGRlcGxpYiIgOzsKIAllc2FjCiAgICAgICBkb25lCiAgICAgICBkZXBsaWJzPSIkbmV3X2xpYnMiCkBAIC02ODc5LDE1ICs4MDM1LDIyIEBACiAKICAgICAgICMgVGVzdCBhZ2Fpbiwgd2UgbWF5IGhhdmUgZGVjaWRlZCBub3QgdG8gYnVpbGQgaXQgYW55IG1vcmUKICAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisJIyBSZW1vdmUgJHt3bH0gaW5zdGFuY2VzIHdoZW4gbGlua2luZyB3aXRoIGxkLgorCSMgRklYTUU6IHNob3VsZCB0ZXN0IHRoZSByaWdodCBfY21kcyB2YXJpYWJsZS4KKwljYXNlICRhcmNoaXZlX2NtZHMgaW4KKwkgICpcJExEXCAqKSB3bD0gOzsKKyAgICAgICAgZXNhYwogCWlmIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiID0geWVzOyB0aGVuCiAJICAjIEhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGhzCiAJICBoYXJkY29kZV9saWJkaXJzPQogCSAgZGVwX3JwYXRoPQogCSAgcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCIKLQkgIHRlc3QgIiRtb2RlIiAhPSByZWxpbmsgJiYgcnBhdGg9IiRjb21waWxlX3JwYXRoJHJwYXRoIgorCSAgdGVzdCAiJG9wdF9tb2RlIiAhPSByZWxpbmsgJiYgcnBhdGg9IiRjb21waWxlX3JwYXRoJHJwYXRoIgogCSAgZm9yIGxpYmRpciBpbiAkcnBhdGg7IGRvCiAJICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgogCSAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorCQlmdW5jX3JlcGxhY2Vfc3lzcm9vdCAiJGxpYmRpciIKKwkJbGliZGlyPSRmdW5jX3JlcGxhY2Vfc3lzcm9vdF9yZXN1bHQKIAkJaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCiAJCSAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKIAkJZWxzZQpAQCAtNjg5NiwxOCArODA1OSwxOCBAQAogCQkgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKIAkJICAgIDs7CiAJCSAgKikKLQkJICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgorCQkgICAgZnVuY19hcHBlbmQgaGFyZGNvZGVfbGliZGlycyAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgogCQkgICAgOzsKIAkJICBlc2FjCiAJCWZpCiAJICAgICAgZWxzZQogCQlldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0JCWRlcF9ycGF0aD0iJGRlcF9ycGF0aCAkZmxhZyIKKwkJZnVuY19hcHBlbmQgZGVwX3JwYXRoICIgJGZsYWciCiAJICAgICAgZmkKIAkgICAgZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCiAJICAgICAgY2FzZSAiJHBlcm1fcnBhdGggIiBpbgogCSAgICAgICoiICRsaWJkaXIgIiopIDs7Ci0JICAgICAgKikgcGVybV9ycGF0aD0iJHBlcm1fcnBhdGggJGxpYmRpciIgOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCBwZXJtX3JwYXRoICIgJGxpYmRpciIgOzsKIAkgICAgICBlc2FjCiAJICAgIGZpCiAJICBkb25lCkBAIC02OTE1LDE3ICs4MDc4LDEzIEBACiAJICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgJiYKIAkgICAgIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgogCSAgICBsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgotCSAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCI7IHRoZW4KLQkgICAgICBldmFsIGRlcF9ycGF0aD1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkXCIKLQkgICAgZWxzZQotCSAgICAgIGV2YWwgZGVwX3JwYXRoPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotCSAgICBmaQorCSAgICBldmFsICJkZXBfcnBhdGg9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiIgogCSAgZmkKIAkgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciIgJiYgdGVzdCAtbiAiJHBlcm1fcnBhdGgiOyB0aGVuCiAJICAgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCiAJICAgIHJwYXRoPQogCSAgICBmb3IgZGlyIGluICRwZXJtX3JwYXRoOyBkbwotCSAgICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKKwkgICAgICBmdW5jX2FwcGVuZCBycGF0aCAiJGRpcjoiCiAJICAgIGRvbmUKIAkgICAgZXZhbCAiJHJ1bnBhdGhfdmFyPSckcnBhdGhcJCRydW5wYXRoX3Zhcic7IGV4cG9ydCAkcnVucGF0aF92YXIiCiAJICBmaQpAQCAtNjkzMyw3ICs4MDkyLDcgQEAKIAlmaQogCiAJc2hsaWJwYXRoPSIkZmluYWxpemVfc2hsaWJwYXRoIgotCXRlc3QgIiRtb2RlIiAhPSByZWxpbmsgJiYgc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkc2hsaWJwYXRoIgorCXRlc3QgIiRvcHRfbW9kZSIgIT0gcmVsaW5rICYmIHNobGlicGF0aD0iJGNvbXBpbGVfc2hsaWJwYXRoJHNobGlicGF0aCIKIAlpZiB0ZXN0IC1uICIkc2hsaWJwYXRoIjsgdGhlbgogCSAgZXZhbCAiJHNobGlicGF0aF92YXI9JyRzaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyJzsgZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgogCWZpCkBAIC02OTU5LDE4ICs4MTE4LDE4IEBACiAJbGlua25hbWVzPQogCWZvciBsaW5rCiAJZG8KLQkgIGxpbmtuYW1lcz0iJGxpbmtuYW1lcyAkbGluayIKKwkgIGZ1bmNfYXBwZW5kIGxpbmtuYW1lcyAiICRsaW5rIgogCWRvbmUKIAogCSMgVXNlIHN0YW5kYXJkIG9iamVjdHMgaWYgdGhleSBhcmUgcGljCi0JdGVzdCAteiAiJHBpY19mbGFnIiAmJiBsaWJvYmpzPWAkRUNITyAiWCRsaWJvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCisJdGVzdCAteiAiJHBpY19mbGFnIiAmJiBsaWJvYmpzPWAkRUNITyAiJGxpYm9ianMiIHwgJFNQMk5MIHwgJFNFRCAiJGxvMm8iIHwgJE5MMlNQYAogCXRlc3QgIlgkbGlib2JqcyIgPSAiWCAiICYmIGxpYm9ianM9CiAKIAlkZWxmaWxlcz0KIAlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRpbmNsdWRlX2V4cHN5bXMiOyB0aGVuCiAJICAkb3B0X2RyeV9ydW4gfHwgY3AgIiRleHBvcnRfc3ltYm9scyIgIiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnVleHAiCiAJICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudWV4cCIKLQkgIGRlbGZpbGVzPSIkZGVsZmlsZXMgJGV4cG9ydF9zeW1ib2xzIgorCSAgZnVuY19hcHBlbmQgZGVsZmlsZXMgIiAkZXhwb3J0X3N5bWJvbHMiCiAJZmkKIAogCW9yaWdfZXhwb3J0X3N5bWJvbHM9CkBAIC03MDAxLDE0ICs4MTYwLDQ2IEBACiAJICAgICRvcHRfZHJ5X3J1biB8fCAkUk0gJGV4cG9ydF9zeW1ib2xzCiAJICAgIGNtZHM9JGV4cG9ydF9zeW1ib2xzX2NtZHMKIAkgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisJICAgIGZvciBjbWQxIGluICRjbWRzOyBkbwogCSAgICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICAgIGV2YWwgY21kPVwiJGNtZFwiCi0JICAgICAgZnVuY19sZW4gIiAkY21kIgotCSAgICAgIGxlbj0kZnVuY19sZW5fcmVzdWx0Ci0JICAgICAgaWYgdGVzdCAiJGxlbiIgLWx0ICIkbWF4X2NtZF9sZW4iIHx8IHRlc3QgIiRtYXhfY21kX2xlbiIgLWxlIC0xOyB0aGVuCisJICAgICAgIyBUYWtlIHRoZSBub3JtYWwgYnJhbmNoIGlmIHRoZSBubV9maWxlX2xpc3Rfc3BlYyBicmFuY2gKKwkgICAgICAjIGRvZXNuJ3Qgd29yayBvciBpZiB0b29sIGNvbnZlcnNpb24gaXMgbm90IG5lZWRlZC4KKwkgICAgICBjYXNlICRubV9maWxlX2xpc3Rfc3BlY34kdG9fdG9vbF9maWxlX2NtZCBpbgorCQkqfmZ1bmNfY29udmVydF9maWxlX25vb3AgfCAqfmZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyIHwgfiopCisJCSAgdHJ5X25vcm1hbF9icmFuY2g9eWVzCisJCSAgZXZhbCBjbWQ9XCIkY21kMVwiCisJCSAgZnVuY19sZW4gIiAkY21kIgorCQkgIGxlbj0kZnVuY19sZW5fcmVzdWx0CisJCSAgOzsKKwkJKikKKwkJICB0cnlfbm9ybWFsX2JyYW5jaD1ubworCQkgIDs7CisJICAgICAgZXNhYworCSAgICAgIGlmIHRlc3QgIiR0cnlfbm9ybWFsX2JyYW5jaCIgPSB5ZXMgXAorCQkgJiYgeyB0ZXN0ICIkbGVuIiAtbHQgIiRtYXhfY21kX2xlbiIgXAorCQkgICAgICB8fCB0ZXN0ICIkbWF4X2NtZF9sZW4iIC1sZSAtMTsgfQorCSAgICAgIHRoZW4KIAkJZnVuY19zaG93X2V2YWwgIiRjbWQiICdleGl0ICQ/JwogCQlza2lwcGVkX2V4cG9ydD1mYWxzZQorCSAgICAgIGVsaWYgdGVzdCAtbiAiJG5tX2ZpbGVfbGlzdF9zcGVjIjsgdGhlbgorCQlmdW5jX2Jhc2VuYW1lICIkb3V0cHV0IgorCQlvdXRwdXRfbGE9JGZ1bmNfYmFzZW5hbWVfcmVzdWx0CisJCXNhdmVfbGlib2Jqcz0kbGlib2JqcworCQlzYXZlX291dHB1dD0kb3V0cHV0CisJCW91dHB1dD0ke291dHB1dF9vYmpkaXJ9LyR7b3V0cHV0X2xhfS5ubQorCQlmdW5jX3RvX3Rvb2xfZmlsZSAiJG91dHB1dCIKKwkJbGlib2Jqcz0kbm1fZmlsZV9saXN0X3NwZWMkZnVuY190b190b29sX2ZpbGVfcmVzdWx0CisJCWZ1bmNfYXBwZW5kIGRlbGZpbGVzICIgJG91dHB1dCIKKwkJZnVuY192ZXJib3NlICJjcmVhdGluZyAkTk0gaW5wdXQgZmlsZSBsaXN0OiAkb3V0cHV0IgorCQlmb3Igb2JqIGluICRzYXZlX2xpYm9ianM7IGRvCisJCSAgZnVuY190b190b29sX2ZpbGUgIiRvYmoiCisJCSAgJEVDSE8gIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQiCisJCWRvbmUgPiAiJG91dHB1dCIKKwkJZXZhbCBjbWQ9XCIkY21kMVwiCisJCWZ1bmNfc2hvd19ldmFsICIkY21kIiAnZXhpdCAkPycKKwkJb3V0cHV0PSRzYXZlX291dHB1dAorCQlsaWJvYmpzPSRzYXZlX2xpYm9ianMKKwkJc2tpcHBlZF9leHBvcnQ9ZmFsc2UKIAkgICAgICBlbHNlCiAJCSMgVGhlIGNvbW1hbmQgbGluZSBpcyB0b28gbG9uZyB0byBleGVjdXRlIGluIG9uZSBzdGVwLgogCQlmdW5jX3ZlcmJvc2UgInVzaW5nIHJlbG9hZGFibGUgb2JqZWN0IGZpbGUgZm9yIGV4cG9ydCBsaXN0Li4uIgpAQCAtNzAyOSw3ICs4MjIwLDcgQEAKIAlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRpbmNsdWRlX2V4cHN5bXMiOyB0aGVuCiAJICB0bXBfZXhwb3J0X3N5bWJvbHM9IiRleHBvcnRfc3ltYm9scyIKIAkgIHRlc3QgLW4gIiRvcmlnX2V4cG9ydF9zeW1ib2xzIiAmJiB0bXBfZXhwb3J0X3N5bWJvbHM9IiRvcmlnX2V4cG9ydF9zeW1ib2xzIgotCSAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgJyRFQ0hPICJYJGluY2x1ZGVfZXhwc3ltcyIgfCAkWHNlZCB8ICRTUDJOTCA+PiAiJHRtcF9leHBvcnRfc3ltYm9scyInCisJICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAnJEVDSE8gIiRpbmNsdWRlX2V4cHN5bXMiIHwgJFNQMk5MID4+ICIkdG1wX2V4cG9ydF9zeW1ib2xzIicKIAlmaQogCiAJaWYgdGVzdCAiWCRza2lwcGVkX2V4cG9ydCIgIT0gIlg6IiAmJiB0ZXN0IC1uICIkb3JpZ19leHBvcnRfc3ltYm9scyI7IHRoZW4KQEAgLTcwNDEsNyArODIzMiw3IEBACiAJICAjIGdsb2JhbCB2YXJpYWJsZXMuIGpvaW4oMSkgd291bGQgYmUgbmljZSBoZXJlLCBidXQgdW5mb3J0dW5hdGVseQogCSAgIyBpc24ndCBhIGJsZXNzZWQgdG9vbC4KIAkgICRvcHRfZHJ5X3J1biB8fCAkU0VEIC1lICcvWyAsXURBVEEvIWQ7cyxcKC4qXClcKFsgXCxdLipcKSxzfF5cMSR8XDFcMnwsJyA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlcgotCSAgZGVsZmlsZXM9IiRkZWxmaWxlcyAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyIgorCSAgZnVuY19hcHBlbmQgZGVsZmlsZXMgIiAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyIgogCSAgZXhwb3J0X3N5bWJvbHM9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmCiAJICAkb3B0X2RyeV9ydW4gfHwgJFNFRCAtZiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIgPCAkb3JpZ19leHBvcnRfc3ltYm9scyA+ICRleHBvcnRfc3ltYm9scwogCWZpCkBAIC03MDUxLDcgKzgyNDIsNyBAQAogCSAgY2FzZSAiICRjb252ZW5pZW5jZSAiIGluCiAJICAqIiAkdGVzdF9kZXBsaWIgIiopIDs7CiAJICAqKQotCSAgICB0bXBfZGVwbGlicz0iJHRtcF9kZXBsaWJzICR0ZXN0X2RlcGxpYiIKKwkgICAgZnVuY19hcHBlbmQgdG1wX2RlcGxpYnMgIiAkdGVzdF9kZXBsaWIiCiAJICAgIDs7CiAJICBlc2FjCiAJZG9uZQpAQCAtNzA3MSwyMSArODI2MiwyMSBAQAogCSAgICB0ZXN0ICJYJGxpYm9ianMiID0gIlggIiAmJiBsaWJvYmpzPQogCSAgZWxzZQogCSAgICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgotCSAgICBnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKKwkgICAgZnVuY19hcHBlbmQgZ2VuZXJhdGVkICIgJGdlbnRvcCIKIAogCSAgICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkY29udmVuaWVuY2UKLQkgICAgbGlib2Jqcz0iJGxpYm9ianMgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCisJICAgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKIAkgICAgdGVzdCAiWCRsaWJvYmpzIiA9ICJYICIgJiYgbGlib2Jqcz0KIAkgIGZpCiAJZmkKIAogCWlmIHRlc3QgIiR0aHJlYWRfc2FmZSIgPSB5ZXMgJiYgdGVzdCAtbiAiJHRocmVhZF9zYWZlX2ZsYWdfc3BlYyI7IHRoZW4KIAkgIGV2YWwgZmxhZz1cIiR0aHJlYWRfc2FmZV9mbGFnX3NwZWNcIgotCSAgbGlua2VyX2ZsYWdzPSIkbGlua2VyX2ZsYWdzICRmbGFnIgorCSAgZnVuY19hcHBlbmQgbGlua2VyX2ZsYWdzICIgJGZsYWciCiAJZmkKIAogCSMgTWFrZSBhIGJhY2t1cCBvZiB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSB3aGVuIHJlbGlua2luZwotCWlmIHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgorCWlmIHRlc3QgIiRvcHRfbW9kZSIgPSByZWxpbms7IHRoZW4KIAkgICRvcHRfZHJ5X3J1biB8fCBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJFJNICR7cmVhbG5hbWV9VSAmJiAkTVYgJHJlYWxuYW1lICR7cmVhbG5hbWV9VSknIHx8IGV4aXQgJD8KIAlmaQogCkBAIC03MTMwLDcgKzgzMjEsOCBAQAogCSAgICBzYXZlX2xpYm9ianM9JGxpYm9ianMKIAkgIGZpCiAJICBzYXZlX291dHB1dD0kb3V0cHV0Ci0JICBvdXRwdXRfbGE9YCRFQ0hPICJYJG91dHB1dCIgfCAkWHNlZCAtZSAiJGJhc2VuYW1lImAKKwkgIGZ1bmNfYmFzZW5hbWUgIiRvdXRwdXQiCisJICBvdXRwdXRfbGE9JGZ1bmNfYmFzZW5hbWVfcmVzdWx0CiAKIAkgICMgQ2xlYXIgdGhlIHJlbG9hZGFibGUgb2JqZWN0IGNyZWF0aW9uIGNvbW1hbmQgcXVldWUgYW5kCiAJICAjIGluaXRpYWxpemUgayB0byBvbmUuCkBAIC03MTQzLDEzICs4MzM1LDE2IEBACiAJICBpZiB0ZXN0IC1uICIkc2F2ZV9saWJvYmpzIiAmJiB0ZXN0ICJYJHNraXBwZWRfZXhwb3J0IiAhPSAiWDoiICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KIAkgICAgb3V0cHV0PSR7b3V0cHV0X29iamRpcn0vJHtvdXRwdXRfbGF9Lmxua3NjcmlwdAogCSAgICBmdW5jX3ZlcmJvc2UgImNyZWF0aW5nIEdOVSBsZCBzY3JpcHQ6ICRvdXRwdXQiCi0JICAgICRFQ0hPICdJTlBVVCAoJyA+ICRvdXRwdXQKKwkgICAgZWNobyAnSU5QVVQgKCcgPiAkb3V0cHV0CiAJICAgIGZvciBvYmogaW4gJHNhdmVfbGlib2JqcwogCSAgICBkbwotCSAgICAgICRFQ0hPICIkb2JqIiA+PiAkb3V0cHV0CisJICAgICAgZnVuY190b190b29sX2ZpbGUgIiRvYmoiCisJICAgICAgJEVDSE8gIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQiID4+ICRvdXRwdXQKIAkgICAgZG9uZQotCSAgICAkRUNITyAnKScgPj4gJG91dHB1dAotCSAgICBkZWxmaWxlcz0iJGRlbGZpbGVzICRvdXRwdXQiCisJICAgIGVjaG8gJyknID4+ICRvdXRwdXQKKwkgICAgZnVuY19hcHBlbmQgZGVsZmlsZXMgIiAkb3V0cHV0IgorCSAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJG91dHB1dCIKKwkgICAgb3V0cHV0PSRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQKIAkgIGVsaWYgdGVzdCAtbiAiJHNhdmVfbGlib2JqcyIgJiYgdGVzdCAiWCRza2lwcGVkX2V4cG9ydCIgIT0gIlg6IiAmJiB0ZXN0ICJYJGZpbGVfbGlzdF9zcGVjIiAhPSBYOyB0aGVuCiAJICAgIG91dHB1dD0ke291dHB1dF9vYmpkaXJ9LyR7b3V0cHV0X2xhfS5sbmsKIAkgICAgZnVuY192ZXJib3NlICJjcmVhdGluZyBsaW5rZXIgaW5wdXQgZmlsZSBsaXN0OiAkb3V0cHV0IgpAQCAtNzE2MywxMCArODM1OCwxMiBAQAogCSAgICBmaQogCSAgICBmb3Igb2JqCiAJICAgIGRvCi0JICAgICAgJEVDSE8gIiRvYmoiID4+ICRvdXRwdXQKKwkgICAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJG9iaiIKKwkgICAgICAkRUNITyAiJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCIgPj4gJG91dHB1dAogCSAgICBkb25lCi0JICAgIGRlbGZpbGVzPSIkZGVsZmlsZXMgJG91dHB1dCIKLQkgICAgb3V0cHV0PSRmaXJzdG9ialwiJGZpbGVfbGlzdF9zcGVjJG91dHB1dFwiCisJICAgIGZ1bmNfYXBwZW5kIGRlbGZpbGVzICIgJG91dHB1dCIKKwkgICAgZnVuY190b190b29sX2ZpbGUgIiRvdXRwdXQiCisJICAgIG91dHB1dD0kZmlyc3RvYmpcIiRmaWxlX2xpc3Rfc3BlYyRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHRcIgogCSAgZWxzZQogCSAgICBpZiB0ZXN0IC1uICIkc2F2ZV9saWJvYmpzIjsgdGhlbgogCSAgICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuLi4iCkBAIC03MTkwLDE3ICs4Mzg3LDE5IEBACiAJCSAgIyBjb21tYW5kIHRvIHRoZSBxdWV1ZS4KIAkJICBpZiB0ZXN0ICIkayIgLWVxIDEgOyB0aGVuCiAJCSAgICAjIFRoZSBmaXJzdCBmaWxlIGRvZXNuJ3QgaGF2ZSBhIHByZXZpb3VzIGNvbW1hbmQgdG8gYWRkLgotCQkgICAgZXZhbCBjb25jYXRfY21kcz1cIiRyZWxvYWRfY21kcyAkb2JqbGlzdCAkbGFzdF9yb2JqXCIKKwkJICAgIHJlbG9hZF9vYmpzPSRvYmpsaXN0CisJCSAgICBldmFsIGNvbmNhdF9jbWRzPVwiJHJlbG9hZF9jbWRzXCIKIAkJICBlbHNlCiAJCSAgICAjIEFsbCBzdWJzZXF1ZW50IHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzIHdpbGwgbGluayBpbgogCQkgICAgIyB0aGUgbGFzdCBvbmUgY3JlYXRlZC4KLQkJICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzfiRyZWxvYWRfY21kcyAkb2JqbGlzdCAkbGFzdF9yb2JqflwkUk0gJGxhc3Rfcm9ialwiCisJCSAgICByZWxvYWRfb2Jqcz0iJG9iamxpc3QgJGxhc3Rfcm9iaiIKKwkJICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzfiRyZWxvYWRfY21kc35cJFJNICRsYXN0X3JvYmpcIgogCQkgIGZpCiAJCSAgbGFzdF9yb2JqPSRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtrfS4kb2JqZXh0CiAJCSAgZnVuY19hcml0aCAkayArIDEKIAkJICBrPSRmdW5jX2FyaXRoX3Jlc3VsdAogCQkgIG91dHB1dD0kb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7a30uJG9iamV4dAotCQkgIG9iamxpc3Q9JG9iagorCQkgIG9iamxpc3Q9IiAkb2JqIgogCQkgIGZ1bmNfbGVuICIgJGxhc3Rfcm9iaiIKIAkJICBmdW5jX2FyaXRoICRsZW4wICsgJGZ1bmNfbGVuX3Jlc3VsdAogCQkgIGxlbj0kZnVuY19hcml0aF9yZXN1bHQKQEAgLTcyMTAsMTEgKzg0MDksMTIgQEAKIAkgICAgICAjIHJlbG9hZGFibGUgb2JqZWN0IGZpbGUuICBBbGwgc3Vic2VxdWVudCByZWxvYWRhYmxlIG9iamVjdAogCSAgICAgICMgZmlsZXMgd2lsbCBsaW5rIGluIHRoZSBsYXN0IG9uZSBjcmVhdGVkLgogCSAgICAgIHRlc3QgLXogIiRjb25jYXRfY21kcyIgfHwgY29uY2F0X2NtZHM9JGNvbmNhdF9jbWRzfgotCSAgICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJHtjb25jYXRfY21kc30kcmVsb2FkX2NtZHMgJG9iamxpc3QgJGxhc3Rfcm9ialwiCisJICAgICAgcmVsb2FkX29ianM9IiRvYmpsaXN0ICRsYXN0X3JvYmoiCisJICAgICAgZXZhbCBjb25jYXRfY21kcz1cIlwke2NvbmNhdF9jbWRzfSRyZWxvYWRfY21kc1wiCiAJICAgICAgaWYgdGVzdCAtbiAiJGxhc3Rfcm9iaiI7IHRoZW4KIAkgICAgICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJHtjb25jYXRfY21kc31+XCRSTSAkbGFzdF9yb2JqXCIKIAkgICAgICBmaQotCSAgICAgIGRlbGZpbGVzPSIkZGVsZmlsZXMgJG91dHB1dCIKKwkgICAgICBmdW5jX2FwcGVuZCBkZWxmaWxlcyAiICRvdXRwdXQiCiAKIAkgICAgZWxzZQogCSAgICAgIG91dHB1dD0KQEAgLTcyNDgsNyArODQ0OCw3IEBACiAJCWx0X2V4aXQ9JD8KIAogCQkjIFJlc3RvcmUgdGhlIHVuaW5zdGFsbGVkIGxpYnJhcnkgYW5kIGV4aXQKLQkJaWYgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB0aGVuCisJCWlmIHRlc3QgIiRvcHRfbW9kZSIgPSByZWxpbms7IHRoZW4KIAkJICAoIGNkICIkb3V0cHV0X29iamRpciIgJiYgXAogCQkgICAgJFJNICIke3JlYWxuYW1lfVQiICYmIFwKIAkJICAgICRNViAiJHtyZWFsbmFtZX1VIiAiJHJlYWxuYW1lIiApCkBAIC03MjY5LDcgKzg0NjksNyBAQAogCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRpbmNsdWRlX2V4cHN5bXMiOyB0aGVuCiAJICAgICAgdG1wX2V4cG9ydF9zeW1ib2xzPSIkZXhwb3J0X3N5bWJvbHMiCiAJICAgICAgdGVzdCAtbiAiJG9yaWdfZXhwb3J0X3N5bWJvbHMiICYmIHRtcF9leHBvcnRfc3ltYm9scz0iJG9yaWdfZXhwb3J0X3N5bWJvbHMiCi0JICAgICAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgJyRFQ0hPICJYJGluY2x1ZGVfZXhwc3ltcyIgfCAkWHNlZCB8ICRTUDJOTCA+PiAiJHRtcF9leHBvcnRfc3ltYm9scyInCisJICAgICAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgJyRFQ0hPICIkaW5jbHVkZV9leHBzeW1zIiB8ICRTUDJOTCA+PiAiJHRtcF9leHBvcnRfc3ltYm9scyInCiAJICAgIGZpCiAKIAkgICAgaWYgdGVzdCAtbiAiJG9yaWdfZXhwb3J0X3N5bWJvbHMiOyB0aGVuCkBAIC03MjgxLDcgKzg0ODEsNyBAQAogCSAgICAgICMgZ2xvYmFsIHZhcmlhYmxlcy4gam9pbigxKSB3b3VsZCBiZSBuaWNlIGhlcmUsIGJ1dCB1bmZvcnR1bmF0ZWx5CiAJICAgICAgIyBpc24ndCBhIGJsZXNzZWQgdG9vbC4KIAkgICAgICAkb3B0X2RyeV9ydW4gfHwgJFNFRCAtZSAnL1sgLF1EQVRBLyFkO3MsXCguKlwpXChbIFwsXS4qXCksc3xeXDEkfFwxXDJ8LCcgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIKLQkgICAgICBkZWxmaWxlcz0iJGRlbGZpbGVzICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIiCisJICAgICAgZnVuY19hcHBlbmQgZGVsZmlsZXMgIiAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyIgogCSAgICAgIGV4cG9ydF9zeW1ib2xzPSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZgogCSAgICAgICRvcHRfZHJ5X3J1biB8fCAkU0VEIC1mICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlciA8ICRvcmlnX2V4cG9ydF9zeW1ib2xzID4gJGV4cG9ydF9zeW1ib2xzCiAJICAgIGZpCkBAIC03MzIyLDEwICs4NTIyLDEwIEBACiAJIyBBZGQgYW55IG9iamVjdHMgZnJvbSBwcmVsb2FkZWQgY29udmVuaWVuY2UgbGlicmFyaWVzCiAJaWYgdGVzdCAtbiAiJGRscHJlZmlsZXMiOyB0aGVuCiAJICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgotCSAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCisJICBmdW5jX2FwcGVuZCBnZW5lcmF0ZWQgIiAkZ2VudG9wIgogCiAJICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkZGxwcmVmaWxlcwotCSAgbGlib2Jqcz0iJGxpYm9ianMgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCisJICBmdW5jX2FwcGVuZCBsaWJvYmpzICIgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCiAJICB0ZXN0ICJYJGxpYm9ianMiID0gIlggIiAmJiBsaWJvYmpzPQogCWZpCiAKQEAgLTczNDEsNyArODU0MSw3IEBACiAJICAgIGx0X2V4aXQ9JD8KIAogCSAgICAjIFJlc3RvcmUgdGhlIHVuaW5zdGFsbGVkIGxpYnJhcnkgYW5kIGV4aXQKLQkgICAgaWYgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB0aGVuCisJICAgIGlmIHRlc3QgIiRvcHRfbW9kZSIgPSByZWxpbms7IHRoZW4KIAkgICAgICAoIGNkICIkb3V0cHV0X29iamRpciIgJiYgXAogCSAgICAgICAgJFJNICIke3JlYWxuYW1lfVQiICYmIFwKIAkJJE1WICIke3JlYWxuYW1lfVUiICIkcmVhbG5hbWUiICkKQEAgLTczNTMsNyArODU1Myw3IEBACiAJSUZTPSIkc2F2ZV9pZnMiCiAKIAkjIFJlc3RvcmUgdGhlIHVuaW5zdGFsbGVkIGxpYnJhcnkgYW5kIGV4aXQKLQlpZiB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KKwlpZiB0ZXN0ICIkb3B0X21vZGUiID0gcmVsaW5rOyB0aGVuCiAJICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRSTSAke3JlYWxuYW1lfVQgJiYgJE1WICRyZWFsbmFtZSAke3JlYWxuYW1lfVQgJiYgJE1WICR7cmVhbG5hbWV9VSAkcmVhbG5hbWUpJyB8fCBleGl0ICQ/CiAKIAkgIGlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSI7IHRoZW4KQEAgLTc0MzQsMTggKzg2MzQsMjEgQEAKICAgICAgIGlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSI7IHRoZW4KIAlpZiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCiAJICBldmFsIHRtcF93aG9sZV9hcmNoaXZlX2ZsYWdzPVwiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjXCIKLQkgIHJlbG9hZF9jb252X29ianM9JHJlbG9hZF9vYmpzXCBgJEVDSE8gIlgkdG1wX3dob2xlX2FyY2hpdmVfZmxhZ3MiIHwgJFhzZWQgLWUgJ3N8LHwgfGcnYAorCSAgcmVsb2FkX2NvbnZfb2Jqcz0kcmVsb2FkX29ianNcIGAkRUNITyAiJHRtcF93aG9sZV9hcmNoaXZlX2ZsYWdzIiB8ICRTRUQgJ3N8LHwgfGcnYAogCWVsc2UKIAkgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvYmp9eCIKLQkgIGdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgorCSAgZnVuY19hcHBlbmQgZ2VuZXJhdGVkICIgJGdlbnRvcCIKIAogCSAgZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGNvbnZlbmllbmNlCiAJICByZWxvYWRfY29udl9vYmpzPSIkcmVsb2FkX29ianMgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCiAJZmkKICAgICAgIGZpCiAKKyAgICAgICMgSWYgd2UncmUgbm90IGJ1aWxkaW5nIHNoYXJlZCwgd2UgbmVlZCB0byB1c2Ugbm9uX3BpY19vYmpzCisgICAgICB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXMgJiYgbGlib2Jqcz0iJG5vbl9waWNfb2JqZWN0cyIKKwogICAgICAgIyBDcmVhdGUgdGhlIG9sZC1zdHlsZSBvYmplY3QuCi0gICAgICByZWxvYWRfb2Jqcz0iJG9ianMkb2xkX2RlcGxpYnMgImAkRUNITyAiWCRsaWJvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICcvXC4nJHtsaWJleHR9JCcvZCcgLWUgJy9cLmxpYiQvZCcgLWUgIiRsbzJvIiB8ICROTDJTUGAiICRyZWxvYWRfY29udl9vYmpzIiAjIyMgdGVzdHN1aXRlOiBza2lwIG5lc3RlZCBxdW90aW5nIHRlc3QKKyAgICAgIHJlbG9hZF9vYmpzPSIkb2JqcyRvbGRfZGVwbGlicyAiYCRFQ0hPICIkbGlib2JqcyIgfCAkU1AyTkwgfCAkU0VEICIvXC4ke2xpYmV4dH0kL2Q7IC9cLmxpYiQvZDsgJGxvMm8iIHwgJE5MMlNQYCIgJHJlbG9hZF9jb252X29ianMiICMjIyB0ZXN0c3VpdGU6IHNraXAgbmVzdGVkIHF1b3RpbmcgdGVzdAogCiAgICAgICBvdXRwdXQ9IiRvYmoiCiAgICAgICBmdW5jX2V4ZWN1dGVfY21kcyAiJHJlbG9hZF9jbWRzIiAnZXhpdCAkPycKQEAgLTc1MDUsOCArODcwOCw4IEBACiAgICAgICBjYXNlICRob3N0IGluCiAgICAgICAqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCiAJIyBPbiBSaGFwc29keSByZXBsYWNlIHRoZSBDIGxpYnJhcnkgaXMgdGhlIFN5c3RlbSBmcmFtZXdvcmsKLQljb21waWxlX2RlcGxpYnM9YCRFQ0hPICJYICRjb21waWxlX2RlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvIC1sYyAvIFN5c3RlbS5sdGZyYW1ld29yayAvJ2AKLQlmaW5hbGl6ZV9kZXBsaWJzPWAkRUNITyAiWCAkZmluYWxpemVfZGVwbGlicyIgfCAkWHNlZCAtZSAncy8gLWxjIC8gU3lzdGVtLmx0ZnJhbWV3b3JrIC8nYAorCWNvbXBpbGVfZGVwbGlicz1gJEVDSE8gIiAkY29tcGlsZV9kZXBsaWJzIiB8ICRTRUQgJ3MvIC1sYyAvIFN5c3RlbS5sdGZyYW1ld29yayAvJ2AKKwlmaW5hbGl6ZV9kZXBsaWJzPWAkRUNITyAiICRmaW5hbGl6ZV9kZXBsaWJzIiB8ICRTRUQgJ3MvIC1sYyAvIFN5c3RlbS5sdGZyYW1ld29yayAvJ2AKIAk7OwogICAgICAgZXNhYwogCkBAIC03NTE3LDE0ICs4NzIwLDE0IEBACiAJaWYgdGVzdCAiJHRhZ25hbWUiID0gQ1hYIDsgdGhlbgogCSAgY2FzZSAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVC0xMC4wfSBpbgogCSAgICAxMC5bMDEyM10pCi0JICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICR7d2x9LWJpbmRfYXRfbG9hZCIKLQkgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAke3dsfS1iaW5kX2F0X2xvYWQiCisJICAgICAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJHt3bH0tYmluZF9hdF9sb2FkIgorCSAgICAgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAke3dsfS1iaW5kX2F0X2xvYWQiCiAJICAgIDs7CiAJICBlc2FjCiAJZmkKIAkjIFRpbWUgdG8gY2hhbmdlIGFsbCBvdXIgImZvby5sdGZyYW1ld29yayIgc3R1ZmYgYmFjayB0byAiLWZyYW1ld29yayBmb28iCi0JY29tcGlsZV9kZXBsaWJzPWAkRUNITyAiWCAkY29tcGlsZV9kZXBsaWJzIiB8ICRYc2VkIC1lICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAotCWZpbmFsaXplX2RlcGxpYnM9YCRFQ0hPICJYICRmaW5hbGl6ZV9kZXBsaWJzIiB8ICRYc2VkIC1lICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAorCWNvbXBpbGVfZGVwbGlicz1gJEVDSE8gIiAkY29tcGlsZV9kZXBsaWJzIiB8ICRTRUQgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCisJZmluYWxpemVfZGVwbGlicz1gJEVDSE8gIiAkZmluYWxpemVfZGVwbGlicyIgfCAkU0VEICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAogCTs7CiAgICAgICBlc2FjCiAKQEAgLTc1MzgsNyArODc0MSw3IEBACiAJKikKIAkgIGNhc2UgIiAkY29tcGlsZV9kZXBsaWJzICIgaW4KIAkgICoiIC1MJHBhdGgvJG9iamRpciAiKikKLQkgICAgbmV3X2xpYnM9IiRuZXdfbGlicyAtTCRwYXRoLyRvYmpkaXIiIDs7CisJICAgIGZ1bmNfYXBwZW5kIG5ld19saWJzICIgLUwkcGF0aC8kb2JqZGlyIiA7OwogCSAgZXNhYwogCSAgOzsKIAllc2FjCkBAIC03NTQ4LDE3ICs4NzUxLDE3IEBACiAJLUwqKQogCSAgY2FzZSAiICRuZXdfbGlicyAiIGluCiAJICAqIiAkZGVwbGliICIqKSA7OwotCSAgKikgbmV3X2xpYnM9IiRuZXdfbGlicyAkZGVwbGliIiA7OworCSAgKikgZnVuY19hcHBlbmQgbmV3X2xpYnMgIiAkZGVwbGliIiA7OwogCSAgZXNhYwogCSAgOzsKLQkqKSBuZXdfbGlicz0iJG5ld19saWJzICRkZXBsaWIiIDs7CisJKikgZnVuY19hcHBlbmQgbmV3X2xpYnMgIiAkZGVwbGliIiA7OwogCWVzYWMKICAgICAgIGRvbmUKICAgICAgIGNvbXBpbGVfZGVwbGlicz0iJG5ld19saWJzIgogCiAKLSAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkY29tcGlsZV9kZXBsaWJzIgotICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGZpbmFsaXplX2RlcGxpYnMiCisgICAgICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkY29tcGlsZV9kZXBsaWJzIgorICAgICAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRmaW5hbGl6ZV9kZXBsaWJzIgogCiAgICAgICBpZiB0ZXN0IC1uICIkcnBhdGgkeHJwYXRoIjsgdGhlbgogCSMgSWYgdGhlIHVzZXIgc3BlY2lmaWVkIGFueSBycGF0aCBmbGFncywgdGhlbiBhZGQgdGhlbS4KQEAgLTc1NjYsNyArODc2OSw3IEBACiAJICAjIFRoaXMgaXMgdGhlIG1hZ2ljIHRvIHVzZSAtcnBhdGguCiAJICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgogCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIgOzsKKwkgICopIGZ1bmNfYXBwZW5kIGZpbmFsaXplX3JwYXRoICIgJGxpYmRpciIgOzsKIAkgIGVzYWMKIAlkb25lCiAgICAgICBmaQpAQCAtNzU4NSwxOCArODc4OCwxOCBAQAogCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKIAkJOzsKIAkgICAgICAqKQotCQloYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKKwkJZnVuY19hcHBlbmQgaGFyZGNvZGVfbGliZGlycyAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgogCQk7OwogCSAgICAgIGVzYWMKIAkgICAgZmkKIAkgIGVsc2UKIAkgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotCSAgICBycGF0aD0iJHJwYXRoICRmbGFnIgorCSAgICBmdW5jX2FwcGVuZCBycGF0aCAiICRmbGFnIgogCSAgZmkKIAllbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KIAkgIGNhc2UgIiRwZXJtX3JwYXRoICIgaW4KIAkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBwZXJtX3JwYXRoPSIkcGVybV9ycGF0aCAkbGliZGlyIiA7OworCSAgKikgZnVuY19hcHBlbmQgcGVybV9ycGF0aCAiICRsaWJkaXIiIDs7CiAJICBlc2FjCiAJZmkKIAljYXNlICRob3N0IGluCkBAIC03NjA1LDEyICs4ODA4LDEyIEBACiAJICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KIAkgICoiOiRsaWJkaXI6IiopIDs7CiAJICA6OikgZGxsc2VhcmNocGF0aD0kbGliZGlyOzsKLQkgICopIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hwYXRoOiRsaWJkaXIiOzsKKwkgICopIGZ1bmNfYXBwZW5kIGRsbHNlYXJjaHBhdGggIjokbGliZGlyIjs7CiAJICBlc2FjCiAJICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KIAkgICoiOiR0ZXN0YmluZGlyOiIqKSA7OwogCSAgOjopIGRsbHNlYXJjaHBhdGg9JHRlc3RiaW5kaXI7OwotCSAgKikgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaHBhdGg6JHRlc3RiaW5kaXIiOzsKKwkgICopIGZ1bmNfYXBwZW5kIGRsbHNlYXJjaHBhdGggIjokdGVzdGJpbmRpciI7OwogCSAgZXNhYwogCSAgOzsKIAllc2FjCkBAIC03NjM2LDE4ICs4ODM5LDE4IEBACiAJICAgICAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQogCQk7OwogCSAgICAgICopCi0JCWhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgorCQlmdW5jX2FwcGVuZCBoYXJkY29kZV9saWJkaXJzICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCiAJCTs7CiAJICAgICAgZXNhYwogCSAgICBmaQogCSAgZWxzZQogCSAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0JICAgIHJwYXRoPSIkcnBhdGggJGZsYWciCisJICAgIGZ1bmNfYXBwZW5kIHJwYXRoICIgJGZsYWciCiAJICBmaQogCWVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgogCSAgY2FzZSAiJGZpbmFsaXplX3Blcm1fcnBhdGggIiBpbgogCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGZpbmFsaXplX3Blcm1fcnBhdGg9IiRmaW5hbGl6ZV9wZXJtX3JwYXRoICRsaWJkaXIiIDs7CisJICAqKSBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9wZXJtX3JwYXRoICIgJGxpYmRpciIgOzsKIAkgIGVzYWMKIAlmaQogICAgICAgZG9uZQpAQCAtNzY2MSw4ICs4ODY0LDggQEAKIAogICAgICAgaWYgdGVzdCAtbiAiJGxpYm9ianMiICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KIAkjIFRyYW5zZm9ybSBhbGwgdGhlIGxpYnJhcnkgb2JqZWN0cyBpbnRvIHN0YW5kYXJkIG9iamVjdHMuCi0JY29tcGlsZV9jb21tYW5kPWAkRUNITyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKLQlmaW5hbGl6ZV9jb21tYW5kPWAkRUNITyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCisJY29tcGlsZV9jb21tYW5kPWAkRUNITyAiJGNvbXBpbGVfY29tbWFuZCIgfCAkU1AyTkwgfCAkU0VEICIkbG8ybyIgfCAkTkwyU1BgCisJZmluYWxpemVfY29tbWFuZD1gJEVDSE8gIiRmaW5hbGl6ZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRTRUQgIiRsbzJvIiB8ICROTDJTUGAKICAgICAgIGZpCiAKICAgICAgIGZ1bmNfZ2VuZXJhdGVfZGxzeW1zICIkb3V0cHV0bmFtZSIgIkBQUk9HUkFNQCIgIm5vIgpAQCAtNzY3NCwxNSArODg3NywxNSBAQAogCiAgICAgICB3cmFwcGVyc19yZXF1aXJlZD15ZXMKICAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICpjZWdjYyogfCAqbWluZ3czMmNlKikKKyAgICAgICAgIyBEaXNhYmxlIHdyYXBwZXJzIGZvciBjZWdjYyBhbmQgbWluZ3czMmNlIGhvc3RzLCB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nIGFueXdheS4KKyAgICAgICAgd3JhcHBlcnNfcmVxdWlyZWQ9bm8KKyAgICAgICAgOzsKICAgICAgICpjeWd3aW4qIHwgKm1pbmd3KiApCiAgICAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgogICAgICAgICAgIHdyYXBwZXJzX3JlcXVpcmVkPW5vCiAgICAgICAgIGZpCiAgICAgICAgIDs7Ci0gICAgICAqY2VnY2MpCi0gICAgICAgICMgRGlzYWJsZSB3cmFwcGVycyBmb3IgY2VnY2MsIHdlIGFyZSBjcm9zcyBjb21waWxpbmcgYW55d2F5LgotICAgICAgICB3cmFwcGVyc19yZXF1aXJlZD1ubwotICAgICAgICA7OwogICAgICAgKikKICAgICAgICAgaWYgdGVzdCAiJG5lZWRfcmVsaW5rIiA9IG5vIHx8IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgogICAgICAgICAgIHdyYXBwZXJzX3JlcXVpcmVkPW5vCkBAIC03NjkxLDEzICs4ODk0LDE5IEBACiAgICAgICBlc2FjCiAgICAgICBpZiB0ZXN0ICIkd3JhcHBlcnNfcmVxdWlyZWQiID0gbm87IHRoZW4KIAkjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCi0JY29tcGlsZV9jb21tYW5kPWAkRUNITyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZydgCisJY29tcGlsZV9jb21tYW5kPWAkRUNITyAiJGNvbXBpbGVfY29tbWFuZCIgfCAkU0VEICdzJUBPVVRQVVRAJSciJG91dHB1dCInJWcnYAogCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgogCiAJIyBXZSBoYXZlIG5vIHVuaW5zdGFsbGVkIGxpYnJhcnkgZGVwZW5kZW5jaWVzLCBzbyBmaW5hbGl6ZSByaWdodCBub3cuCiAJZXhpdF9zdGF0dXM9MAogCWZ1bmNfc2hvd19ldmFsICIkbGlua19jb21tYW5kIiAnZXhpdF9zdGF0dXM9JD8nCiAKKwlpZiB0ZXN0IC1uICIkcG9zdGxpbmtfY21kcyI7IHRoZW4KKwkgIGZ1bmNfdG9fdG9vbF9maWxlICIkb3V0cHV0IgorCSAgcG9zdGxpbmtfY21kcz1gZnVuY19lY2hvX2FsbCAiJHBvc3RsaW5rX2NtZHMiIHwgJFNFRCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJyAtZSAncyVAVE9PTF9PVVRQVVRAJSciJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCInJWcnYAorCSAgZnVuY19leGVjdXRlX2NtZHMgIiRwb3N0bGlua19jbWRzIiAnZXhpdCAkPycKKwlmaQorCiAJIyBEZWxldGUgdGhlIGdlbmVyYXRlZCBmaWxlcy4KIAlpZiB0ZXN0IC1mICIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0iOyB0aGVuCiAJICBmdW5jX3Nob3dfZXZhbCAnJFJNICIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0iJwpAQCAtNzcyMCw3ICs4OTI5LDcgQEAKIAkgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCiAJICBycGF0aD0KIAkgIGZvciBkaXIgaW4gJHBlcm1fcnBhdGg7IGRvCi0JICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKKwkgICAgZnVuY19hcHBlbmQgcnBhdGggIiRkaXI6IgogCSAgZG9uZQogCSAgY29tcGlsZV92YXI9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgIgogCWZpCkBAIC03NzI4LDcgKzg5MzcsNyBAQAogCSAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KIAkgIHJwYXRoPQogCSAgZm9yIGRpciBpbiAkZmluYWxpemVfcGVybV9ycGF0aDsgZG8KLQkgICAgcnBhdGg9IiRycGF0aCRkaXI6IgorCSAgICBmdW5jX2FwcGVuZCBycGF0aCAiJGRpcjoiCiAJICBkb25lCiAJICBmaW5hbGl6ZV92YXI9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgIgogCWZpCkBAIC03NzM4LDExICs4OTQ3LDE4IEBACiAJIyBXZSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBhIHdyYXBwZXIgc2NyaXB0LgogCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgogCSMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KLQlsaW5rX2NvbW1hbmQ9YCRFQ0hPICJYJGxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJ2AKKwlsaW5rX2NvbW1hbmQ9YCRFQ0hPICIkbGlua19jb21tYW5kIiB8ICRTRUQgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZydgCiAJIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZS4KIAkkb3B0X2RyeV9ydW4gfHwgJFJNICRvdXRwdXQKIAkjIExpbmsgdGhlIGV4ZWN1dGFibGUgYW5kIGV4aXQKIAlmdW5jX3Nob3dfZXZhbCAiJGxpbmtfY29tbWFuZCIgJ2V4aXQgJD8nCisKKwlpZiB0ZXN0IC1uICIkcG9zdGxpbmtfY21kcyI7IHRoZW4KKwkgIGZ1bmNfdG9fdG9vbF9maWxlICIkb3V0cHV0IgorCSAgcG9zdGxpbmtfY21kcz1gZnVuY19lY2hvX2FsbCAiJHBvc3RsaW5rX2NtZHMiIHwgJFNFRCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJyAtZSAncyVAVE9PTF9PVVRQVVRAJSciJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCInJWcnYAorCSAgZnVuY19leGVjdXRlX2NtZHMgIiRwb3N0bGlua19jbWRzIiAnZXhpdCAkPycKKwlmaQorCiAJZXhpdCAkRVhJVF9TVUNDRVNTCiAgICAgICBmaQogCkBAIC03NzU3LDcgKzg5NzMsNyBAQAogCWlmIHRlc3QgIiRmYXN0X2luc3RhbGwiICE9IG5vOyB0aGVuCiAJICBsaW5rX2NvbW1hbmQ9IiRmaW5hbGl6ZV92YXIkY29tcGlsZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgogCSAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSB5ZXM7IHRoZW4KLQkgICAgcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICJYJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJVwkcHJvZ2Rpci9cJGZpbGUlZydgCisJICAgIHJlbGlua19jb21tYW5kPWAkRUNITyAiJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIiB8ICRTRUQgJ3MlQE9VVFBVVEAlXCRwcm9nZGlyL1wkZmlsZSVnJ2AKIAkgIGVsc2UKIAkgICAgIyBmYXN0X2luc3RhbGwgaXMgc2V0IHRvIG5lZWRsZXNzCiAJICAgIHJlbGlua19jb21tYW5kPQpAQCAtNzc2OSwxMyArODk4NSwxOSBAQAogICAgICAgZmkKIAogICAgICAgIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgotICAgICAgbGlua19jb21tYW5kPWAkRUNITyAiWCRsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSInJWcnYAorICAgICAgbGlua19jb21tYW5kPWAkRUNITyAiJGxpbmtfY29tbWFuZCIgfCAkU0VEICdzJUBPVVRQVVRAJSciJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiJyVnJ2AKIAogICAgICAgIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZXMuCiAgICAgICAkb3B0X2RyeV9ydW4gfHwgJFJNICRvdXRwdXQgJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUgJG91dHB1dF9vYmpkaXIvbHQtJG91dHB1dG5hbWUKIAogICAgICAgZnVuY19zaG93X2V2YWwgIiRsaW5rX2NvbW1hbmQiICdleGl0ICQ/JwogCisgICAgICBpZiB0ZXN0IC1uICIkcG9zdGxpbmtfY21kcyI7IHRoZW4KKwlmdW5jX3RvX3Rvb2xfZmlsZSAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiCisJcG9zdGxpbmtfY21kcz1gZnVuY19lY2hvX2FsbCAiJHBvc3RsaW5rX2NtZHMiIHwgJFNFRCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lIiclZycgLWUgJ3MlQFRPT0xfT1VUUFVUQCUnIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQiJyVnJ2AKKwlmdW5jX2V4ZWN1dGVfY21kcyAiJHBvc3RsaW5rX2NtZHMiICdleGl0ICQ/JworICAgICAgZmkKKwogICAgICAgIyBOb3cgY3JlYXRlIHRoZSB3cmFwcGVyIHNjcmlwdC4KICAgICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgJG91dHB1dCIKIApAQCAtNzc5MywxOCArOTAxNSw3IEBACiAJICBmaQogCWRvbmUKIAlyZWxpbmtfY29tbWFuZD0iKGNkIGBwd2RgOyAkcmVsaW5rX2NvbW1hbmQpIgotCXJlbGlua19jb21tYW5kPWAkRUNITyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBmaQotCi0gICAgICAjIFF1b3RlICRFQ0hPIGZvciBzaGlwcGluZy4KLSAgICAgIGlmIHRlc3QgIlgkRUNITyIgPSAiWCRTSEVMTCAkcHJvZ3BhdGggLS1mYWxsYmFjay1lY2hvIjsgdGhlbgotCWNhc2UgJHByb2dwYXRoIGluCi0JW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBxZWNobz0iJFNIRUxMICRwcm9ncGF0aCAtLWZhbGxiYWNrLWVjaG8iOzsKLQkqKSBxZWNobz0iJFNIRUxMIGBwd2RgLyRwcm9ncGF0aCAtLWZhbGxiYWNrLWVjaG8iOzsKLQllc2FjCi0JcWVjaG89YCRFQ0hPICJYJHFlY2hvIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGVsc2UKLQlxZWNobz1gJEVDSE8gIlgkRUNITyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisJcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICIkcmVsaW5rX2NvbW1hbmQiIHwgJFNFRCAiJHNlZF9xdW90ZV9zdWJzdCJgCiAgICAgICBmaQogCiAgICAgICAjIE9ubHkgYWN0dWFsbHkgZG8gdGhpbmdzIGlmIG5vdCBpbiBkcnkgcnVuIG1vZGUuCkBAIC03ODg0LDcgKzkwOTUsNyBAQAogCWVsc2UKIAkgIG9sZG9ianM9IiRvbGRfZGVwbGlicyAkbm9uX3BpY19vYmplY3RzIgogCSAgaWYgdGVzdCAiJHByZWxvYWQiID0geWVzICYmIHRlc3QgLWYgIiRzeW1maWxlb2JqIjsgdGhlbgotCSAgICBvbGRvYmpzPSIkb2xkb2JqcyAkc3ltZmlsZW9iaiIKKwkgICAgZnVuY19hcHBlbmQgb2xkb2JqcyAiICRzeW1maWxlb2JqIgogCSAgZmkKIAlmaQogCWFkZGxpYnM9IiRvbGRfY29udmVuaWVuY2UiCkBAIC03ODkyLDEwICs5MTAzLDEwIEBACiAKICAgICAgIGlmIHRlc3QgLW4gIiRhZGRsaWJzIjsgdGhlbgogCWdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCi0JZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCisJZnVuY19hcHBlbmQgZ2VuZXJhdGVkICIgJGdlbnRvcCIKIAogCWZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRhZGRsaWJzCi0Jb2xkb2Jqcz0iJG9sZG9ianMgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCisJZnVuY19hcHBlbmQgb2xkb2JqcyAiICRmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0IgogICAgICAgZmkKIAogICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIGFyY2hpdmUgY29tbWFuZHMuCkBAIC03OTA2LDEwICs5MTE3LDEwIEBACiAJIyBBZGQgYW55IG9iamVjdHMgZnJvbSBwcmVsb2FkZWQgY29udmVuaWVuY2UgbGlicmFyaWVzCiAJaWYgdGVzdCAtbiAiJGRscHJlZmlsZXMiOyB0aGVuCiAJICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgotCSAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCisJICBmdW5jX2FwcGVuZCBnZW5lcmF0ZWQgIiAkZ2VudG9wIgogCiAJICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkZGxwcmVmaWxlcwotCSAgb2xkb2Jqcz0iJG9sZG9ianMgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCisJICBmdW5jX2FwcGVuZCBvbGRvYmpzICIgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCiAJZmkKIAogCSMgUE9TSVggZGVtYW5kcyBubyBwYXRocyB0byBiZSBlbmNvZGVkIGluIGFyY2hpdmVzLiAgV2UgaGF2ZQpAQCAtNzkyNSw5ICs5MTM2LDkgQEAKIAkgICAgZG9uZSB8IHNvcnQgfCBzb3J0IC11YyA+L2Rldi9udWxsIDI+JjEpOyB0aGVuCiAJICA6CiAJZWxzZQotCSAgJEVDSE8gImNvcHlpbmcgc2VsZWN0ZWQgb2JqZWN0IGZpbGVzIHRvIGF2b2lkIGJhc2VuYW1lIGNvbmZsaWN0cy4uLiIKKwkgIGVjaG8gImNvcHlpbmcgc2VsZWN0ZWQgb2JqZWN0IGZpbGVzIHRvIGF2b2lkIGJhc2VuYW1lIGNvbmZsaWN0cy4uLiIKIAkgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCi0JICBnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKKwkgIGZ1bmNfYXBwZW5kIGdlbmVyYXRlZCAiICRnZW50b3AiCiAJICBmdW5jX21rZGlyX3AgIiRnZW50b3AiCiAJICBzYXZlX29sZG9ianM9JG9sZG9ianMKIAkgIG9sZG9ianM9CkBAIC03OTUxLDE4ICs5MTYyLDMwIEBACiAJCWVzYWMKIAkgICAgICBkb25lCiAJICAgICAgZnVuY19zaG93X2V2YWwgImxuICRvYmogJGdlbnRvcC8kbmV3b2JqIHx8IGNwICRvYmogJGdlbnRvcC8kbmV3b2JqIgotCSAgICAgIG9sZG9ianM9IiRvbGRvYmpzICRnZW50b3AvJG5ld29iaiIKKwkgICAgICBmdW5jX2FwcGVuZCBvbGRvYmpzICIgJGdlbnRvcC8kbmV3b2JqIgogCSAgICAgIDs7Ci0JICAgICopIG9sZG9ianM9IiRvbGRvYmpzICRvYmoiIDs7CisJICAgICopIGZ1bmNfYXBwZW5kIG9sZG9ianMgIiAkb2JqIiA7OwogCSAgICBlc2FjCiAJICBkb25lCiAJZmkKKwlmdW5jX3RvX3Rvb2xfZmlsZSAiJG9sZGxpYiIgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKwl0b29sX29sZGxpYj0kZnVuY190b190b29sX2ZpbGVfcmVzdWx0CiAJZXZhbCBjbWRzPVwiJG9sZF9hcmNoaXZlX2NtZHNcIgogCiAJZnVuY19sZW4gIiAkY21kcyIKIAlsZW49JGZ1bmNfbGVuX3Jlc3VsdAogCWlmIHRlc3QgIiRsZW4iIC1sdCAiJG1heF9jbWRfbGVuIiB8fCB0ZXN0ICIkbWF4X2NtZF9sZW4iIC1sZSAtMTsgdGhlbgogCSAgY21kcz0kb2xkX2FyY2hpdmVfY21kcworCWVsaWYgdGVzdCAtbiAiJGFyY2hpdmVyX2xpc3Rfc3BlYyI7IHRoZW4KKwkgIGZ1bmNfdmVyYm9zZSAidXNpbmcgY29tbWFuZCBmaWxlIGFyY2hpdmUgbGlua2luZy4uLiIKKwkgIGZvciBvYmogaW4gJG9sZG9ianMKKwkgIGRvCisJICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkb2JqIgorCSAgICAkRUNITyAiJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCIKKwkgIGRvbmUgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5saWJjbWQKKwkgIGZ1bmNfdG9fdG9vbF9maWxlICIkb3V0cHV0X29iamRpci8kbGlibmFtZS5saWJjbWQiCisJICBvbGRvYmpzPSIgJGFyY2hpdmVyX2xpc3Rfc3BlYyRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQiCisJICBjbWRzPSRvbGRfYXJjaGl2ZV9jbWRzCiAJZWxzZQogCSAgIyB0aGUgY29tbWFuZCBsaW5lIGlzIHRvbyBsb25nIHRvIGxpbmsgaW4gb25lIHN0ZXAsIGxpbmsgaW4gcGFydHMKIAkgIGZ1bmNfdmVyYm9zZSAidXNpbmcgcGllY2V3aXNlIGFyY2hpdmUgbGlua2luZy4uLiIKQEAgLTgwMzYsNyArOTI1OSw3IEBACiAgICAgICBkb25lCiAgICAgICAjIFF1b3RlIHRoZSBsaW5rIGNvbW1hbmQgZm9yIHNoaXBwaW5nLgogICAgICAgcmVsaW5rX2NvbW1hbmQ9IihjZCBgcHdkYDsgJFNIRUxMICRwcm9ncGF0aCAkcHJlc2VydmVfYXJncyAtLW1vZGU9cmVsaW5rICRsaWJ0b29sX2FyZ3MgQGluc3RfcHJlZml4X2RpckApIgotICAgICAgcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICJYJHJlbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAgIHJlbGlua19jb21tYW5kPWAkRUNITyAiJHJlbGlua19jb21tYW5kIiB8ICRTRUQgIiRzZWRfcXVvdGVfc3Vic3QiYAogICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSB5ZXMgOyB0aGVuCiAJcmVsaW5rX2NvbW1hbmQ9CiAgICAgICBmaQpAQCAtODA1NiwxMiArOTI3OSwyMyBAQAogCSAgICAgICoubGEpCiAJCWZ1bmNfYmFzZW5hbWUgIiRkZXBsaWIiCiAJCW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKLQkJZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKKwkJZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRkZXBsaWIiCisJCWV2YWwgbGliZGlyPWAke1NFRH0gLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHRgCiAJCXRlc3QgLXogIiRsaWJkaXIiICYmIFwKIAkJICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRkZXBsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKLQkJbmV3ZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzICRsaWJkaXIvJG5hbWUiCisJCWZ1bmNfYXBwZW5kIG5ld2RlcGVuZGVuY3lfbGlicyAiICR7bHRfc3lzcm9vdDorPX0kbGliZGlyLyRuYW1lIgogCQk7OwotCSAgICAgICopIG5ld2RlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyAkZGVwbGliIiA7OworCSAgICAgIC1MKikKKwkJZnVuY19zdHJpcG5hbWUgLUwgJycgIiRkZXBsaWIiCisJCWZ1bmNfcmVwbGFjZV9zeXNyb290ICIkZnVuY19zdHJpcG5hbWVfcmVzdWx0IgorCQlmdW5jX2FwcGVuZCBuZXdkZXBlbmRlbmN5X2xpYnMgIiAtTCRmdW5jX3JlcGxhY2Vfc3lzcm9vdF9yZXN1bHQiCisJCTs7CisJICAgICAgLVIqKQorCQlmdW5jX3N0cmlwbmFtZSAtUiAnJyAiJGRlcGxpYiIKKwkJZnVuY19yZXBsYWNlX3N5c3Jvb3QgIiRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiCisJCWZ1bmNfYXBwZW5kIG5ld2RlcGVuZGVuY3lfbGlicyAiIC1SJGZ1bmNfcmVwbGFjZV9zeXNyb290X3Jlc3VsdCIKKwkJOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCBuZXdkZXBlbmRlbmN5X2xpYnMgIiAkZGVwbGliIiA7OwogCSAgICAgIGVzYWMKIAkgICAgZG9uZQogCSAgICBkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMiCkBAIC04MDc1LDkgKzkzMDksOSBAQAogCQlldmFsIGxpYmRpcj1gJHtTRUR9IC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkbGliYAogCQl0ZXN0IC16ICIkbGliZGlyIiAmJiBcCiAJCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCi0JCW5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRsaWJkaXIvJG5hbWUiCisJCWZ1bmNfYXBwZW5kIG5ld2RsZmlsZXMgIiAke2x0X3N5c3Jvb3Q6Kz19JGxpYmRpci8kbmFtZSIKIAkJOzsKLQkgICAgICAqKSBuZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkbGliIiA7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIG5ld2RsZmlsZXMgIiAkbGliIiA7OwogCSAgICAgIGVzYWMKIAkgICAgZG9uZQogCSAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKQEAgLTgwOTQsNyArOTMyOCw3IEBACiAJCWV2YWwgbGliZGlyPWAke1NFRH0gLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRsaWJgCiAJCXRlc3QgLXogIiRsaWJkaXIiICYmIFwKIAkJICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKLQkJbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGxpYmRpci8kbmFtZSIKKwkJZnVuY19hcHBlbmQgbmV3ZGxwcmVmaWxlcyAiICR7bHRfc3lzcm9vdDorPX0kbGliZGlyLyRuYW1lIgogCQk7OwogCSAgICAgIGVzYWMKIAkgICAgZG9uZQpAQCAtODEwNiw3ICs5MzQwLDcgQEAKIAkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBhYnM9IiRsaWIiIDs7CiAJCSopIGFicz1gcHdkYCIvJGxpYiIgOzsKIAkgICAgICBlc2FjCi0JICAgICAgbmV3ZGxmaWxlcz0iJG5ld2RsZmlsZXMgJGFicyIKKwkgICAgICBmdW5jX2FwcGVuZCBuZXdkbGZpbGVzICIgJGFicyIKIAkgICAgZG9uZQogCSAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKIAkgICAgbmV3ZGxwcmVmaWxlcz0KQEAgLTgxMTUsMTUgKzkzNDksMzMgQEAKIAkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBhYnM9IiRsaWIiIDs7CiAJCSopIGFicz1gcHdkYCIvJGxpYiIgOzsKIAkgICAgICBlc2FjCi0JICAgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGFicyIKKwkgICAgICBmdW5jX2FwcGVuZCBuZXdkbHByZWZpbGVzICIgJGFicyIKIAkgICAgZG9uZQogCSAgICBkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyIKIAkgIGZpCiAJICAkUk0gJG91dHB1dAogCSAgIyBwbGFjZSBkbG5hbWUgaW4gY29ycmVjdCBwb3NpdGlvbiBmb3IgY3lnd2luCisJICAjIEluIGZhY3QsIGl0IHdvdWxkIGJlIG5pY2UgaWYgd2UgY291bGQgdXNlIHRoaXMgY29kZSBmb3IgYWxsIHRhcmdldAorCSAgIyBzeXN0ZW1zIHRoYXQgY2FuJ3QgaGFyZC1jb2RlIGxpYnJhcnkgcGF0aHMgaW50byB0aGVpciBleGVjdXRhYmxlcworCSAgIyBhbmQgdGhhdCBoYXZlIG5vIHNoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGUgaW5kZXBlbmRlbnQgb2YgUEFUSCwKKwkgICMgYnV0IGl0IHR1cm5zIG91dCB3ZSBjYW4ndCBlYXNpbHkgZGV0ZXJtaW5lIHRoYXQgZnJvbSBpbnNwZWN0aW5nCisJICAjIGxpYnRvb2wgdmFyaWFibGVzLCBzbyB3ZSBoYXZlIHRvIGhhcmQtY29kZSB0aGUgT1NzIHRvIHdoaWNoIGl0CisJICAjIGFwcGxpZXMgaGVyZTsgYXQgdGhlIG1vbWVudCwgdGhhdCBtZWFucyBwbGF0Zm9ybXMgdGhhdCB1c2UgdGhlIFBFCisJICAjIG9iamVjdCBmb3JtYXQgd2l0aCBETEwgZmlsZXMuICBTZWUgdGhlIGxvbmcgY29tbWVudCBhdCB0aGUgdG9wIG9mCisJICAjIHRlc3RzL2JpbmRpci5hdCBmb3IgZnVsbCBkZXRhaWxzLgogCSAgdGRsbmFtZT0kZGxuYW1lCiAJICBjYXNlICRob3N0LCRvdXRwdXQsJGluc3RhbGxlZCwkbW9kdWxlLCRkbG5hbWUgaW4KLQkgICAgKmN5Z3dpbiosKmxhaSx5ZXMsbm8sKi5kbGwgfCAqbWluZ3cqLCpsYWkseWVzLG5vLCouZGxsIHwgKmNlZ2NjKiwqbGFpLHllcyxubywqLmRsbCkgdGRsbmFtZT0uLi9iaW4vJGRsbmFtZSA7OworCSAgICAqY3lnd2luKiwqbGFpLHllcyxubywqLmRsbCB8ICptaW5ndyosKmxhaSx5ZXMsbm8sKi5kbGwgfCAqY2VnY2MqLCpsYWkseWVzLG5vLCouZGxsKQorCSAgICAgICMgSWYgYSAtYmluZGlyIGFyZ3VtZW50IHdhcyBzdXBwbGllZCwgcGxhY2UgdGhlIGRsbCB0aGVyZS4KKwkgICAgICBpZiB0ZXN0ICJ4JGJpbmRpciIgIT0geCA7CisJICAgICAgdGhlbgorCQlmdW5jX3JlbGF0aXZlX3BhdGggIiRpbnN0YWxsX2xpYmRpciIgIiRiaW5kaXIiCisJCXRkbG5hbWU9JGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQkZGxuYW1lCisJICAgICAgZWxzZQorCQkjIE90aGVyd2lzZSBmYWxsIGJhY2sgb24gaGV1cmlzdGljLgorCQl0ZGxuYW1lPS4uL2Jpbi8kZGxuYW1lCisJICAgICAgZmkKKwkgICAgICA7OwogCSAgZXNhYwogCSAgJEVDSE8gPiAkb3V0cHV0ICJcCiAjICRvdXRwdXRuYW1lIC0gYSBsaWJ0b29sIGxpYnJhcnkgZmlsZQpAQCAtODE4Miw3ICs5NDM0LDcgQEAKICAgICBleGl0ICRFWElUX1NVQ0NFU1MKIH0KIAoteyB0ZXN0ICIkbW9kZSIgPSBsaW5rIHx8IHRlc3QgIiRtb2RlIiA9IHJlbGluazsgfSAmJgoreyB0ZXN0ICIkb3B0X21vZGUiID0gbGluayB8fCB0ZXN0ICIkb3B0X21vZGUiID0gcmVsaW5rOyB9ICYmCiAgICAgZnVuY19tb2RlX2xpbmsgJHsxKyIkQCJ9CiAKIApAQCAtODIwMiw5ICs5NDU0LDkgQEAKICAgICBmb3IgYXJnCiAgICAgZG8KICAgICAgIGNhc2UgJGFyZyBpbgotICAgICAgLWYpIFJNPSIkUk0gJGFyZyI7IHJtZm9yY2U9eWVzIDs7Ci0gICAgICAtKikgUk09IiRSTSAkYXJnIiA7OwotICAgICAgKikgZmlsZXM9IiRmaWxlcyAkYXJnIiA7OworICAgICAgLWYpIGZ1bmNfYXBwZW5kIFJNICIgJGFyZyI7IHJtZm9yY2U9eWVzIDs7CisgICAgICAtKikgZnVuY19hcHBlbmQgUk0gIiAkYXJnIiA7OworICAgICAgKikgZnVuY19hcHBlbmQgZmlsZXMgIiAkYXJnIiA7OwogICAgICAgZXNhYwogICAgIGRvbmUKIApAQCAtODIxMywyNCArOTQ2NSwyMyBAQAogCiAgICAgcm1kaXJzPQogCi0gICAgb3JpZ29iamRpcj0iJG9iamRpciIKICAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCiAgICAgICBmdW5jX2Rpcm5hbWUgIiRmaWxlIiAiIiAiLiIKICAgICAgIGRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCiAgICAgICBpZiB0ZXN0ICJYJGRpciIgPSBYLjsgdGhlbgotCW9iamRpcj0iJG9yaWdvYmpkaXIiCisJb2Rpcj0iJG9iamRpciIKICAgICAgIGVsc2UKLQlvYmpkaXI9IiRkaXIvJG9yaWdvYmpkaXIiCisJb2Rpcj0iJGRpci8kb2JqZGlyIgogICAgICAgZmkKICAgICAgIGZ1bmNfYmFzZW5hbWUgIiRmaWxlIgogICAgICAgbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgotICAgICAgdGVzdCAiJG1vZGUiID0gdW5pbnN0YWxsICYmIG9iamRpcj0iJGRpciIKKyAgICAgIHRlc3QgIiRvcHRfbW9kZSIgPSB1bmluc3RhbGwgJiYgb2Rpcj0iJGRpciIKIAotICAgICAgIyBSZW1lbWJlciBvYmpkaXIgZm9yIHJlbW92YWwgbGF0ZXIsIGJlaW5nIGNhcmVmdWwgdG8gYXZvaWQgZHVwbGljYXRlcwotICAgICAgaWYgdGVzdCAiJG1vZGUiID0gY2xlYW47IHRoZW4KKyAgICAgICMgUmVtZW1iZXIgb2RpciBmb3IgcmVtb3ZhbCBsYXRlciwgYmVpbmcgY2FyZWZ1bCB0byBhdm9pZCBkdXBsaWNhdGVzCisgICAgICBpZiB0ZXN0ICIkb3B0X21vZGUiID0gY2xlYW47IHRoZW4KIAljYXNlICIgJHJtZGlycyAiIGluCi0JICAqIiAkb2JqZGlyICIqKSA7OwotCSAgKikgcm1kaXJzPSIkcm1kaXJzICRvYmpkaXIiIDs7CisJICAqIiAkb2RpciAiKikgOzsKKwkgICopIGZ1bmNfYXBwZW5kIHJtZGlycyAiICRvZGlyIiA7OwogCWVzYWMKICAgICAgIGZpCiAKQEAgLTgyNTYsMTggKzk1MDcsMTcgQEAKIAogCSAgIyBEZWxldGUgdGhlIGxpYnRvb2wgbGlicmFyaWVzIGFuZCBzeW1saW5rcy4KIAkgIGZvciBuIGluICRsaWJyYXJ5X25hbWVzOyBkbwotCSAgICBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyLyRuIgorCSAgICBmdW5jX2FwcGVuZCBybWZpbGVzICIgJG9kaXIvJG4iCiAJICBkb25lCi0JICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG9sZF9saWJyYXJ5IgorCSAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBmdW5jX2FwcGVuZCBybWZpbGVzICIgJG9kaXIvJG9sZF9saWJyYXJ5IgogCi0JICBjYXNlICIkbW9kZSIgaW4KKwkgIGNhc2UgIiRvcHRfbW9kZSIgaW4KIAkgIGNsZWFuKQotCSAgICBjYXNlICIgICRsaWJyYXJ5X25hbWVzICIgaW4KLQkgICAgIyAiICAiIGluIHRoZSBiZWdpbm5pbmcgY2F0Y2hlcyBlbXB0eSAkZGxuYW1lCisJICAgIGNhc2UgIiAkbGlicmFyeV9uYW1lcyAiIGluCiAJICAgICoiICRkbG5hbWUgIiopIDs7Ci0JICAgICopIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJGRsbmFtZSIgOzsKKwkgICAgKikgdGVzdCAtbiAiJGRsbmFtZSIgJiYgZnVuY19hcHBlbmQgcm1maWxlcyAiICRvZGlyLyRkbG5hbWUiIDs7CiAJICAgIGVzYWMKLQkgICAgdGVzdCAtbiAiJGxpYmRpciIgJiYgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci8kbmFtZSAkb2JqZGlyLyR7bmFtZX1pIgorCSAgICB0ZXN0IC1uICIkbGliZGlyIiAmJiBmdW5jX2FwcGVuZCBybWZpbGVzICIgJG9kaXIvJG5hbWUgJG9kaXIvJHtuYW1lfWkiCiAJICAgIDs7CiAJICB1bmluc3RhbGwpCiAJICAgIGlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgdGhlbgpAQCAtODI5NSwxOSArOTU0NSwxOSBAQAogCSAgIyBBZGQgUElDIG9iamVjdCB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byByZW1vdmUuCiAJICBpZiB0ZXN0IC1uICIkcGljX29iamVjdCIgJiYKIAkgICAgIHRlc3QgIiRwaWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCi0JICAgIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJHBpY19vYmplY3QiCisJICAgIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkZGlyLyRwaWNfb2JqZWN0IgogCSAgZmkKIAogCSAgIyBBZGQgbm9uLVBJQyBvYmplY3QgdG8gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gcmVtb3ZlLgogCSAgaWYgdGVzdCAtbiAiJG5vbl9waWNfb2JqZWN0IiAmJgogCSAgICAgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCi0JICAgIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJG5vbl9waWNfb2JqZWN0IgorCSAgICBmdW5jX2FwcGVuZCBybWZpbGVzICIgJGRpci8kbm9uX3BpY19vYmplY3QiCiAJICBmaQogCWZpCiAJOzsKIAogICAgICAgKikKLQlpZiB0ZXN0ICIkbW9kZSIgPSBjbGVhbiA7IHRoZW4KKwlpZiB0ZXN0ICIkb3B0X21vZGUiID0gY2xlYW4gOyB0aGVuCiAJICBub2V4ZW5hbWU9JG5hbWUKIAkgIGNhc2UgJGZpbGUgaW4KIAkgICouZXhlKQpAQCAtODMxNyw3ICs5NTY3LDcgQEAKIAkgICAgbm9leGVuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKIAkgICAgIyAkZmlsZSB3aXRoIC5leGUgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byBybWZpbGVzLAogCSAgICAjIGFkZCAkZmlsZSB3aXRob3V0IC5leGUKLQkgICAgcm1maWxlcz0iJHJtZmlsZXMgJGZpbGUiCisJICAgIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkZmlsZSIKIAkgICAgOzsKIAkgIGVzYWMKIAkgICMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIGEgbGlidG9vbCBwcm9ncmFtLgpAQCAtODMyNiw3ICs5NTc2LDcgQEAKIAkgICAgICBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lICIkZmlsZSIKIAkgICAgICByZWxpbmtfY29tbWFuZD0KIAkgICAgICBmdW5jX3NvdXJjZSAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQKLQkgICAgICBybWZpbGVzPSIkcm1maWxlcyAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQiCisJICAgICAgZnVuY19hcHBlbmQgcm1maWxlcyAiICRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdCIKIAkgICAgZWxzZQogCSAgICAgIHJlbGlua19jb21tYW5kPQogCSAgICAgIGZ1bmNfc291cmNlICRkaXIvJG5vZXhlbmFtZQpAQCAtODMzNCwxMiArOTU4NCwxMiBAQAogCiAJICAgICMgbm90ZSAkbmFtZSBzdGlsbCBjb250YWlucyAuZXhlIGlmIGl0IHdhcyBpbiAkZmlsZSBvcmlnaW5hbGx5CiAJICAgICMgYXMgZG9lcyB0aGUgdmVyc2lvbiBvZiAkZmlsZSB0aGF0IHdhcyBhZGRlZCBpbnRvICRybWZpbGVzCi0JICAgIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG5hbWUgJG9iamRpci8ke25hbWV9Uy4ke29iamV4dH0iCisJICAgIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkb2Rpci8kbmFtZSAkb2Rpci8ke25hbWV9Uy4ke29iamV4dH0iCiAJICAgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzICYmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KLQkgICAgICBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyL2x0LSRuYW1lIgorCSAgICAgIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkb2Rpci9sdC0kbmFtZSIKIAkgICAgZmkKIAkgICAgaWYgdGVzdCAiWCRub2V4ZW5hbWUiICE9ICJYJG5hbWUiIDsgdGhlbgotCSAgICAgIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvbHQtJHtub2V4ZW5hbWV9LmMiCisJICAgICAgZnVuY19hcHBlbmQgcm1maWxlcyAiICRvZGlyL2x0LSR7bm9leGVuYW1lfS5jIgogCSAgICBmaQogCSAgZmkKIAlmaQpAQCAtODM0Nyw3ICs5NTk3LDYgQEAKICAgICAgIGVzYWMKICAgICAgIGZ1bmNfc2hvd19ldmFsICIkUk0gJHJtZmlsZXMiICdleGl0X3N0YXR1cz0xJwogICAgIGRvbmUKLSAgICBvYmpkaXI9IiRvcmlnb2JqZGlyIgogCiAgICAgIyBUcnkgdG8gcmVtb3ZlIHRoZSAke29iamRpcn1zIGluIHRoZSBkaXJlY3RvcmllcyB3aGVyZSB3ZSBkZWxldGVkIGZpbGVzCiAgICAgZm9yIGRpciBpbiAkcm1kaXJzOyBkbwpAQCAtODM1OSwxNiArOTYwOCwxNiBAQAogICAgIGV4aXQgJGV4aXRfc3RhdHVzCiB9CiAKLXsgdGVzdCAiJG1vZGUiID0gdW5pbnN0YWxsIHx8IHRlc3QgIiRtb2RlIiA9IGNsZWFuOyB9ICYmCit7IHRlc3QgIiRvcHRfbW9kZSIgPSB1bmluc3RhbGwgfHwgdGVzdCAiJG9wdF9tb2RlIiA9IGNsZWFuOyB9ICYmCiAgICAgZnVuY19tb2RlX3VuaW5zdGFsbCAkezErIiRAIn0KIAotdGVzdCAteiAiJG1vZGUiICYmIHsKK3Rlc3QgLXogIiRvcHRfbW9kZSIgJiYgewogICBoZWxwPSIkZ2VuZXJpY19oZWxwIgogICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYSBNT0RFIgogfQogCiB0ZXN0IC16ICIkZXhlY19jbWQiICYmIFwKLSAgZnVuY19mYXRhbF9oZWxwICJpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG1vZGUnIgorICBmdW5jX2ZhdGFsX2hlbHAgImludmFsaWQgb3BlcmF0aW9uIG1vZGUgXGAkb3B0X21vZGUnIgogCiBpZiB0ZXN0IC1uICIkZXhlY19jbWQiOyB0aGVuCiAgIGV2YWwgZXhlYyAiJGV4ZWNfY21kIgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9tNC9hc21jZmkubTQgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL200L2FzbWNmaS5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmY3M2EwCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9tNC9hc21jZmkubTQKQEAgLTAsMCArMSwxMyBAQAorQUNfREVGVU4oW0dDQ19BU19DRklfUFNFVURPX09QXSwKK1tBQ19DQUNIRV9DSEVDSyhbYXNzZW1ibGVyIC5jZmkgcHNldWRvLW9wIHN1cHBvcnRdLAorICAgIGdjY19jdl9hc19jZmlfcHNldWRvX29wLCBbCisgICAgZ2NjX2N2X2FzX2NmaV9wc2V1ZG9fb3A9dW5rbm93bgorICAgIEFDX1RSWV9DT01QSUxFKFthc20gKCIuY2ZpX3N0YXJ0cHJvY1xuXHQuY2ZpX2VuZHByb2MiKTtdLCwKKwkJICAgW2djY19jdl9hc19jZmlfcHNldWRvX29wPXllc10sCisJCSAgIFtnY2NfY3ZfYXNfY2ZpX3BzZXVkb19vcD1ub10pCisgXSkKKyBpZiB0ZXN0ICJ4JGdjY19jdl9hc19jZmlfcHNldWRvX29wIiA9IHh5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoSEFWRV9BU19DRklfUFNFVURPX09QLCAxLAorCSAgICAgIFtEZWZpbmUgaWYgeW91ciBhc3NlbWJsZXIgc3VwcG9ydHMgLmNmaV8qIGRpcmVjdGl2ZXMuXSkKKyBmaQorXSkKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbTQvYXhfYXBwZW5kX2ZsYWcubTQgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL200L2F4X2FwcGVuZF9mbGFnLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMzhiNzYKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL200L2F4X2FwcGVuZF9mbGFnLm00CkBAIC0wLDAgKzEsNjkgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICAgICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfYXBwZW5kX2ZsYWcuaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU1lOT1BTSVMKKyMKKyMgICBBWF9BUFBFTkRfRkxBRyhGTEFHLCBbRkxBR1MtVkFSSUFCTEVdKQorIworIyBERVNDUklQVElPTgorIworIyAgIEZMQUcgaXMgYXBwZW5kZWQgdG8gdGhlIEZMQUdTLVZBUklBQkxFIHNoZWxsIHZhcmlhYmxlLCB3aXRoIGEgc3BhY2UKKyMgICBhZGRlZCBpbiBiZXR3ZWVuLgorIworIyAgIElmIEZMQUdTLVZBUklBQkxFIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBjdXJyZW50IGxhbmd1YWdlJ3MgZmxhZ3MgKGUuZy4KKyMgICBDRkxBR1MpIGlzIHVzZWQuICBGTEFHUy1WQVJJQUJMRSBpcyBub3QgY2hhbmdlZCBpZiBpdCBhbHJlYWR5IGNvbnRhaW5zCisjICAgRkxBRy4gIElmIEZMQUdTLVZBUklBQkxFIGlzIHVuc2V0IGluIHRoZSBzaGVsbCwgaXQgaXMgc2V0IHRvIGV4YWN0bHkKKyMgICBGTEFHLgorIworIyAgIE5PVEU6IEltcGxlbWVudGF0aW9uIGJhc2VkIG9uIEFYX0NGTEFHU19HQ0NfT1BUSU9OLgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDA4IEd1aWRvIFUuIERyYWhlaW0gPGd1aWRvZEBnbXguZGU+CisjICAgQ29weXJpZ2h0IChjKSAyMDExIE1hYXJ0ZW4gQm9zbWFucyA8bWtib3NtYW5zQGdtYWlsLmNvbT4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyMgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsCisjICAgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyAgIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisjCisjICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHJlc3BlY3RpdmUgQXV0b2NvbmYgTWFjcm8ncyBjb3B5cmlnaHQgb3duZXIKKyMgICBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgdGhlIGNvbmZpZ3VyZQorIyAgIHNjcmlwdHMgdGhhdCBhcmUgdGhlIG91dHB1dCBvZiBBdXRvY29uZiB3aGVuIHByb2Nlc3NpbmcgdGhlIE1hY3JvLiBZb3UKKyMgICBuZWVkIG5vdCBmb2xsb3cgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB3aGVuIHVzaW5nCisjICAgb3IgZGlzdHJpYnV0aW5nIHN1Y2ggc2NyaXB0cywgZXZlbiB0aG91Z2ggcG9ydGlvbnMgb2YgdGhlIHRleHQgb2YgdGhlCisjICAgTWFjcm8gYXBwZWFyIGluIHRoZW0uIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBkb2VzIGdvdmVybgorIyAgIGFsbCBvdGhlciB1c2Ugb2YgdGhlIG1hdGVyaWFsIHRoYXQgY29uc3RpdHV0ZXMgdGhlIEF1dG9jb25mIE1hY3JvLgorIworIyAgIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCBhcHBsaWVzIHRvIHZlcnNpb25zIG9mIHRoZSBBdXRvY29uZgorIyAgIE1hY3JvIHJlbGVhc2VkIGJ5IHRoZSBBdXRvY29uZiBBcmNoaXZlLiBXaGVuIHlvdSBtYWtlIGFuZCBkaXN0cmlidXRlIGEKKyMgICBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBBdXRvY29uZiBNYWNybywgeW91IG1heSBleHRlbmQgdGhpcyBzcGVjaWFsCisjICAgZXhjZXB0aW9uIHRvIHRoZSBHUEwgdG8gYXBwbHkgdG8geW91ciBtb2RpZmllZCB2ZXJzaW9uIGFzIHdlbGwuCisKKyNzZXJpYWwgMgorCitBQ19ERUZVTihbQVhfQVBQRU5EX0ZMQUddLAorW0FDX1BSRVJFUSgyLjU5KWRubCBmb3IgX0FDX0xBTkdfUFJFRklYCitBU19WQVJfUFVTSERFRihbRkxBR1NdLCBbbTRfZGVmYXVsdCgkMixfQUNfTEFOR19QUkVGSVhbRkxBR1NdKV0pZG5sCitBU19WQVJfU0VUX0lGKEZMQUdTLAorICBbY2FzZSAiIEFTX1ZBUl9HRVQoRkxBR1MpICIgaW4KKyAgICAqIiAkMSAiKikKKyAgICAgIEFDX1JVTl9MT0coWzogRkxBR1MgYWxyZWFkeSBjb250YWlucyAkMV0pCisgICAgICA7OworICAgICopCisgICAgICBBQ19SVU5fTE9HKFs6IEZMQUdTPSIkRkxBR1MgJDEiXSkKKyAgICAgIEFTX1ZBUl9TRVQoRkxBR1MsIFsiQVNfVkFSX0dFVChGTEFHUykgJDEiXSkKKyAgICAgIDs7CisgICBlc2FjXSwKKyAgW0FTX1ZBUl9TRVQoRkxBR1MsWyIkMSJdKV0pCitBU19WQVJfUE9QREVGKFtGTEFHU10pZG5sCitdKWRubCBBWF9BUFBFTkRfRkxBRwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9tNC9heF9jY19tYXhvcHQubTQgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL200L2F4X2NjX21heG9wdC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmUzYjUzCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9tNC9heF9jY19tYXhvcHQubTQKQEAgLTAsMCArMSwxODEgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICAgICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2NjX21heG9wdC5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX0NDX01BWE9QVAorIworIyBERVNDUklQVElPTgorIworIyAgIFRyeSB0byB0dXJuIG9uICJnb29kIiBDIG9wdGltaXphdGlvbiBmbGFncyBmb3IgdmFyaW91cyBjb21waWxlcnMgYW5kCisjICAgYXJjaGl0ZWN0dXJlcywgZm9yIHNvbWUgZGVmaW5pdGlvbiBvZiAiZ29vZCIuIChJbiBvdXIgY2FzZSwgZ29vZCBmb3IKKyMgICBGRlRXIGFuZCBob3BlZnVsbHkgZm9yIG90aGVyIHNjaWVudGlmaWMgY29kZXMuIE1vZGlmeSBhcyBuZWVkZWQuKQorIworIyAgIFRoZSB1c2VyIGNhbiBvdmVycmlkZSB0aGUgZmxhZ3MgYnkgc2V0dGluZyB0aGUgQ0ZMQUdTIGVudmlyb25tZW50CisjICAgdmFyaWFibGUuIFRoZSB1c2VyIGNhbiBhbHNvIHNwZWNpZnkgLS1lbmFibGUtcG9ydGFibGUtYmluYXJ5IGluIG9yZGVyIHRvCisjICAgZGlzYWJsZSBhbnkgb3B0aW1pemF0aW9uIGZsYWdzIHRoYXQgbWlnaHQgcmVzdWx0IGluIGEgYmluYXJ5IHRoYXQgb25seQorIyAgIHJ1bnMgb24gdGhlIGhvc3QgYXJjaGl0ZWN0dXJlLgorIworIyAgIE5vdGUgYWxzbyB0aGF0IHRoZSBmbGFncyBhc3N1bWUgdGhhdCBBTlNJIEMgYWxpYXNpbmcgcnVsZXMgYXJlIGZvbGxvd2VkCisjICAgYnkgdGhlIGNvZGUgKGUuZy4gZm9yIGdjYydzIC1mc3RyaWN0LWFsaWFzaW5nKSwgYW5kIHRoYXQgZmxvYXRpbmctcG9pbnQKKyMgICBjb21wdXRhdGlvbnMgY2FuIGJlIHJlLW9yZGVyZWQgYXMgbmVlZGVkLgorIworIyAgIFJlcXVpcmVzIG1hY3JvczogQVhfQ0hFQ0tfQ09NUElMRV9GTEFHLCBBWF9DT01QSUxFUl9WRU5ET1IsCisjICAgQVhfR0NDX0FSQ0hGTEFHLCBBWF9HQ0NfWDg2X0NQVUlELgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDA4IFN0ZXZlbiBHLiBKb2huc29uIDxzdGV2ZW5qQGFsdW0ubWl0LmVkdT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMDggTWF0dGVvIEZyaWdvCisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisjICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbAorIyAgIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgICB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorIworIyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSByZXNwZWN0aXZlIEF1dG9jb25mIE1hY3JvJ3MgY29weXJpZ2h0IG93bmVyCisjICAgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IHRoZSBjb25maWd1cmUKKyMgICBzY3JpcHRzIHRoYXQgYXJlIHRoZSBvdXRwdXQgb2YgQXV0b2NvbmYgd2hlbiBwcm9jZXNzaW5nIHRoZSBNYWNyby4gWW91CisjICAgbmVlZCBub3QgZm9sbG93IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugd2hlbiB1c2luZworIyAgIG9yIGRpc3RyaWJ1dGluZyBzdWNoIHNjcmlwdHMsIGV2ZW4gdGhvdWdoIHBvcnRpb25zIG9mIHRoZSB0ZXh0IG9mIHRoZQorIyAgIE1hY3JvIGFwcGVhciBpbiB0aGVtLiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgZG9lcyBnb3Zlcm4KKyMgICBhbGwgb3RoZXIgdXNlIG9mIHRoZSBtYXRlcmlhbCB0aGF0IGNvbnN0aXR1dGVzIHRoZSBBdXRvY29uZiBNYWNyby4KKyMKKyMgICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwgYXBwbGllcyB0byB2ZXJzaW9ucyBvZiB0aGUgQXV0b2NvbmYKKyMgICBNYWNybyByZWxlYXNlZCBieSB0aGUgQXV0b2NvbmYgQXJjaGl2ZS4gV2hlbiB5b3UgbWFrZSBhbmQgZGlzdHJpYnV0ZSBhCisjICAgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgQXV0b2NvbmYgTWFjcm8sIHlvdSBtYXkgZXh0ZW5kIHRoaXMgc3BlY2lhbAorIyAgIGV4Y2VwdGlvbiB0byB0aGUgR1BMIHRvIGFwcGx5IHRvIHlvdXIgbW9kaWZpZWQgdmVyc2lvbiBhcyB3ZWxsLgorCisjc2VyaWFsIDEzCisKK0FDX0RFRlVOKFtBWF9DQ19NQVhPUFRdLAorWworQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pCitBQ19SRVFVSVJFKFtBWF9DT01QSUxFUl9WRU5ET1JdKQorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKQorCitBQ19BUkdfRU5BQkxFKHBvcnRhYmxlLWJpbmFyeSwgW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1wb3J0YWJsZS1iaW5hcnldLCBbZGlzYWJsZSBjb21waWxlciBvcHRpbWl6YXRpb25zIHRoYXQgd291bGQgcHJvZHVjZSB1bnBvcnRhYmxlIGJpbmFyaWVzXSldLAorCWFjeF9tYXhvcHRfcG9ydGFibGU9JGVuYWJsZXZhbCwgYWN4X21heG9wdF9wb3J0YWJsZT1ubykKKworIyBUcnkgdG8gZGV0ZXJtaW5lICJnb29kIiBuYXRpdmUgY29tcGlsZXIgZmxhZ3MgaWYgbm9uZSBzcGVjaWZpZWQgdmlhIENGTEFHUworaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiAhPSAic2V0IjsgdGhlbgorICBDRkxBR1M9IiIKKyAgY2FzZSAkYXhfY3ZfY19jb21waWxlcl92ZW5kb3IgaW4KKyAgICBkZWMpIENGTEFHUz0iLW5ld2MgLXcwIC1PNSAtYW5zaV9hbGlhcyAtYW5zaV9hcmdzIC1mcF9yZW9yZGVyIC10dW5lIGhvc3QiCisJIGlmIHRlc3QgIngkYWN4X21heG9wdF9wb3J0YWJsZSIgPSB4bm87IHRoZW4KKyAgICAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1hcmNoIGhvc3QiCisgICAgICAgICBmaTs7CisKKyAgICBzdW4pIENGTEFHUz0iLW5hdGl2ZSAtZmFzdCAteE81IC1kYWxpZ24iCisJIGlmIHRlc3QgIngkYWN4X21heG9wdF9wb3J0YWJsZSIgPSB4eWVzOyB0aGVuCisJICAgQ0ZMQUdTPSIkQ0ZMQUdTIC14YXJjaD1nZW5lcmljIgorICAgICAgICAgZmk7OworCisgICAgaHApICBDRkxBR1M9IitPYWxsICtPcHRyc19hbnNpICtEU25hdGl2ZSIKKwkgaWYgdGVzdCAieCRhY3hfbWF4b3B0X3BvcnRhYmxlIiA9IHh5ZXM7IHRoZW4KKwkgICBDRkxBR1M9IiRDRkxBR1MgK0RBcG9ydGFibGUiCisJIGZpOzsKKworICAgIGlibSkgaWYgdGVzdCAieCRhY3hfbWF4b3B0X3BvcnRhYmxlIiA9IHhubzsgdGhlbgorICAgICAgICAgICB4bGNfb3B0PSItcWFyY2g9YXV0byAtcXR1bmU9YXV0byIKKwkgZWxzZQorICAgICAgICAgICB4bGNfb3B0PSItcXR1bmU9YXV0byIKKwkgZmkKKyAgICAgICAgIEFYX0NIRUNLX0NPTVBJTEVfRkxBRygkeGxjX29wdCwKKwkJQ0ZMQUdTPSItTzMgLXFhbnNpYWxpYXMgLXcgJHhsY19vcHQiLAorICAgICAgICAgICAgICAgW0NGTEFHUz0iLU8zIC1xYW5zaWFsaWFzIC13IgorICAgICAgICAgICAgICAgIGVjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKKyAgICAgICAgICAgICAgICBlY2hvICIqICBZb3Ugc2VlbSB0byBoYXZlIHRoZSBJQk0gIEMgY29tcGlsZXIuICBJdCBpcyAgICAgICoiCisgICAgICAgICAgICAgICAgZWNobyAiKiAgcmVjb21tZW5kZWQgZm9yIGJlc3QgcGVyZm9ybWFuY2UgdGhhdCB5b3UgdXNlOiAgICAqIgorICAgICAgICAgICAgICAgIGVjaG8gIiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiIKKyAgICAgICAgICAgICAgICBlY2hvICIqICAgIENGTEFHUz0tTzMgLXFhcmNoPXh4eCAtcXR1bmU9eHh4IC1xYW5zaWFsaWFzIC13ICoiCisgICAgICAgICAgICAgICAgZWNobyAiKiAgICAgICAgICAgICAgICAgICAgICBeXl4gICAgICAgIF5eXiAgICAgICAgICAgICAgICAqIgorICAgICAgICAgICAgICAgIGVjaG8gIiogIHdoZXJlIHh4eCBpcyBwd3IyLCBwd3IzLCA2MDQsIG9yIHdoYXRldmVyIGtpbmQgb2YgKiIKKyAgICAgICAgICAgICAgICBlY2hvICIqICBDUFUgeW91IGhhdmUuICAoU2V0IHRoZSBDRkxBR1MgZW52aXJvbm1lbnQgdmFyLiAgICoiCisgICAgICAgICAgICAgICAgZWNobyAiKiAgYW5kIHJlLXJ1biBjb25maWd1cmUuKSAgRm9yIG1vcmUgaW5mbywgbWFuIGNjLiAgICAqIgorICAgICAgICAgICAgICAgIGVjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiJdKQorICAgICAgICAgOzsKKworICAgIGludGVsKSBDRkxBR1M9Ii1PMyAtYW5zaV9hbGlhcyIKKwlpZiB0ZXN0ICJ4JGFjeF9tYXhvcHRfcG9ydGFibGUiID0geG5vOyB0aGVuCisJICBpY2NfYXJjaGZsYWc9dW5rbm93bgorCSAgaWNjX2ZsYWdzPSIiCisJICBjYXNlICRob3N0X2NwdSBpbgorCSAgICBpNjg2Knx4ODZfNjQqKQorICAgICAgICAgICAgICAjIGljYyBhY2NlcHRzIGdjYyBhc3NlbWJseSBzeW50YXgsIHNvIHRoZXNlIHNob3VsZCB3b3JrOgorCSAgICAgIEFYX0dDQ19YODZfQ1BVSUQoMCkKKyAgICAgICAgICAgICAgQVhfR0NDX1g4Nl9DUFVJRCgxKQorCSAgICAgIGNhc2UgJGF4X2N2X2djY194ODZfY3B1aWRfMCBpbiAjIHNlZSBBWF9HQ0NfQVJDSEZMQUcKKyAgICAgICAgICAgICAgICAqOjc1NmU2NTQ3Oio6KikgIyBJbnRlbAorICAgICAgICAgICAgICAgICAgY2FzZSAkYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8xIGluCisgICAgICAgICAgICAgICAgICAgICo2YT86KltbMjM0XV06KjoqfCo2W1s3ODliXV0/Oio6KjoqKSBpY2NfZmxhZ3M9Ii14SyI7OworICAgICAgICAgICAgICAgICAgICAqZjNbWzM0N11dOio6KjoqfCpmNFsxMzQ3XToqOio6KikgaWNjX2ZsYWdzPSIteFAgLXhOIC14VyAteEsiOzsKKyAgICAgICAgICAgICAgICAgICAgKmY/PzoqOio6KikgaWNjX2ZsYWdzPSIteE4gLXhXIC14SyI7OworICAgICAgICAgICAgICAgICAgZXNhYyA7OworICAgICAgICAgICAgICBlc2FjIDs7CisgICAgICAgICAgZXNhYworICAgICAgICAgIGlmIHRlc3QgIngkaWNjX2ZsYWdzIiAhPSB4OyB0aGVuCisgICAgICAgICAgICBmb3IgZmxhZyBpbiAkaWNjX2ZsYWdzOyBkbworICAgICAgICAgICAgICBBWF9DSEVDS19DT01QSUxFX0ZMQUcoJGZsYWcsIFtpY2NfYXJjaGZsYWc9JGZsYWc7IGJyZWFrXSkKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICBmaQorICAgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGljYyBhcmNoaXRlY3R1cmUgZmxhZ10pCisJICBBQ19NU0dfUkVTVUxUKCRpY2NfYXJjaGZsYWcpCisgICAgICAgICAgaWYgdGVzdCAieCRpY2NfYXJjaGZsYWciICE9IHh1bmtub3duOyB0aGVuCisgICAgICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJGljY19hcmNoZmxhZyIKKyAgICAgICAgICBmaQorICAgICAgICBmaQorCTs7CisKKyAgICBnbnUpCisgICAgICMgZGVmYXVsdCBvcHRpbWl6YXRpb24gZmxhZ3MgZm9yIGdjYyBvbiBhbGwgc3lzdGVtcworICAgICBDRkxBR1M9Ii1PMyAtZm9taXQtZnJhbWUtcG9pbnRlciIKKworICAgICAjIC1tYWxpZ24tZG91YmxlIGZvciB4ODYgc3lzdGVtcworICAgICAjIExJQkZGSSAtLSBET04nVCBETyBUSElTIC0gQ0hBTkdFUyBBQkkKKyAgICAgIyBBWF9DSEVDS19DT01QSUxFX0ZMQUcoLW1hbGlnbi1kb3VibGUsIENGTEFHUz0iJENGTEFHUyAtbWFsaWduLWRvdWJsZSIpCisKKyAgICAgIyAgLWZzdHJpY3QtYWxpYXNpbmcgZm9yIGdjYy0yLjk1KworICAgICBBWF9DSEVDS19DT01QSUxFX0ZMQUcoLWZzdHJpY3QtYWxpYXNpbmcsCisJQ0ZMQUdTPSIkQ0ZMQUdTIC1mc3RyaWN0LWFsaWFzaW5nIikKKworICAgICAjIG5vdGUgdGhhdCB3ZSBlbmFibGUgInVuc2FmZSIgZnAgb3B0aW1pemF0aW9uIHdpdGggb3RoZXIgY29tcGlsZXJzLCB0b28KKyAgICAgQVhfQ0hFQ0tfQ09NUElMRV9GTEFHKC1mZmFzdC1tYXRoLCBDRkxBR1M9IiRDRkxBR1MgLWZmYXN0LW1hdGgiKQorCisgICAgIEFYX0dDQ19BUkNIRkxBRygkYWN4X21heG9wdF9wb3J0YWJsZSkKKyAgICAgOzsKKyAgZXNhYworCisgIGlmIHRlc3QgLXogIiRDRkxBR1MiOyB0aGVuCisJZWNobyAiIgorCWVjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorICAgICAgICBlY2hvICIqIFdBUk5JTkc6IERvbid0IGtub3cgdGhlIGJlc3QgQ0ZMQUdTIGZvciB0aGlzIHN5c3RlbSAgKiIKKyAgICAgICAgZWNobyAiKiBVc2UgLi9jb25maWd1cmUgQ0ZMQUdTPS4uLiB0byBzcGVjaWZ5IHlvdXIgb3duIGZsYWdzICoiCisJZWNobyAiKiAob3RoZXJ3aXNlLCBhIGRlZmF1bHQgb2YgQ0ZMQUdTPS1PMyB3aWxsIGJlIHVzZWQpICAgICoiCisJZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCisJZWNobyAiIgorICAgICAgICBDRkxBR1M9Ii1PMyIKKyAgZmkKKworICBBWF9DSEVDS19DT01QSUxFX0ZMQUcoJENGTEFHUywgW10sIFsKKwllY2hvICIiCisgICAgICAgIGVjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorICAgICAgICBlY2hvICIqIFdBUk5JTkc6IFRoZSBndWVzc2VkIENGTEFHUyBkb24ndCBzZWVtIHRvIHdvcmsgd2l0aCAgKiIKKyAgICAgICAgZWNobyAiKiB5b3VyIGNvbXBpbGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoiCisgICAgICAgIGVjaG8gIiogVXNlIC4vY29uZmlndXJlIENGTEFHUz0uLi4gdG8gc3BlY2lmeSB5b3VyIG93biBmbGFncyAqIgorICAgICAgICBlY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKKyAgICAgICAgZWNobyAiIgorICAgICAgICBDRkxBR1M9IiIKKyAgXSkKKworZmkKK10pCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL200L2F4X2NmbGFnc193YXJuX2FsbC5tNCBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbTQvYXhfY2ZsYWdzX3dhcm5fYWxsLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYTNlMTgKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL200L2F4X2NmbGFnc193YXJuX2FsbC5tNApAQCAtMCwwICsxLDEyMiBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfY2ZsYWdzX3dhcm5fYWxsLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNZTk9QU0lTCisjCisjICAgQVhfQ0ZMQUdTX1dBUk5fQUxMICAgWyhzaGVsbHZhciBbLGRlZmF1bHQsIFtBL05BXV0pXQorIyAgIEFYX0NYWEZMQUdTX1dBUk5fQUxMIFsoc2hlbGx2YXIgWyxkZWZhdWx0LCBbQS9OQV1dKV0KKyMgICBBWF9GQ0ZMQUdTX1dBUk5fQUxMICBbKHNoZWxsdmFyIFssZGVmYXVsdCwgW0EvTkFdXSldCisjCisjIERFU0NSSVBUSU9OCisjCisjICAgVHJ5IHRvIGZpbmQgYSBjb21waWxlciBvcHRpb24gdGhhdCBlbmFibGVzIG1vc3QgcmVhc29uYWJsZSB3YXJuaW5ncy4KKyMKKyMgICBGb3IgdGhlIEdOVSBjb21waWxlciBpdCB3aWxsIGJlIC1XYWxsIChhbmQgLWFuc2kgLXBlZGFudGljKSBUaGUgcmVzdWx0CisjICAgaXMgYWRkZWQgdG8gdGhlIHNoZWxsdmFyIGJlaW5nIENGTEFHUywgQ1hYRkxBR1MsIG9yIEZDRkxBR1MgYnkgZGVmYXVsdC4KKyMKKyMgICBDdXJyZW50bHkgdGhpcyBtYWNybyBrbm93cyBhYm91dCB0aGUgR0NDLCBTb2xhcmlzLCBEaWdpdGFsIFVuaXgsIEFJWCwKKyMgICBIUC1VWCwgSVJJWCwgTkVDIFNYLTUgKFN1cGVyLVVYIDEwKSwgQ3JheSBKOTAgKFVuaWNvcyAxMC4wLjAuOCksIGFuZAorIyAgIEludGVsIGNvbXBpbGVycy4gIEZvciBhIGdpdmVuIGNvbXBpbGVyLCB0aGUgRm9ydHJhbiBmbGFncyBhcmUgbXVjaCBtb3JlCisjICAgZXhwZXJpbWVudGFsIHRoYW4gdGhlaXIgQyBlcXVpdmFsZW50cy4KKyMKKyMgICAgLSAkMSBzaGVsbC12YXJpYWJsZS10by1hZGQtdG8gOiBDRkxBR1MsIENYWEZMQUdTLCBvciBGQ0ZMQUdTCisjICAgIC0gJDIgYWRkLXZhbHVlLWlmLW5vdC1mb3VuZCA6IG5vdGhpbmcKKyMgICAgLSAkMyBhY3Rpb24taWYtZm91bmQgOiBhZGQgdmFsdWUgdG8gc2hlbGx2YXJpYWJsZQorIyAgICAtICQ0IGFjdGlvbi1pZi1ub3QtZm91bmQgOiBub3RoaW5nCisjCisjICAgTk9URTogVGhlc2UgbWFjcm9zIGRlcGVuZCBvbiBBWF9BUFBFTkRfRkxBRy4KKyMKKyMgTElDRU5TRQorIworIyAgIENvcHlyaWdodCAoYykgMjAwOCBHdWlkbyBVLiBEcmFoZWltIDxndWlkb2RAZ214LmRlPgorIyAgIENvcHlyaWdodCAoYykgMjAxMCBSaHlzIFVsZXJpY2ggPHJoeXMudWxlcmljaEBnbWFpbC5jb20+CisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisjICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbAorIyAgIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgICB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorIworIyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSByZXNwZWN0aXZlIEF1dG9jb25mIE1hY3JvJ3MgY29weXJpZ2h0IG93bmVyCisjICAgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IHRoZSBjb25maWd1cmUKKyMgICBzY3JpcHRzIHRoYXQgYXJlIHRoZSBvdXRwdXQgb2YgQXV0b2NvbmYgd2hlbiBwcm9jZXNzaW5nIHRoZSBNYWNyby4gWW91CisjICAgbmVlZCBub3QgZm9sbG93IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugd2hlbiB1c2luZworIyAgIG9yIGRpc3RyaWJ1dGluZyBzdWNoIHNjcmlwdHMsIGV2ZW4gdGhvdWdoIHBvcnRpb25zIG9mIHRoZSB0ZXh0IG9mIHRoZQorIyAgIE1hY3JvIGFwcGVhciBpbiB0aGVtLiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgZG9lcyBnb3Zlcm4KKyMgICBhbGwgb3RoZXIgdXNlIG9mIHRoZSBtYXRlcmlhbCB0aGF0IGNvbnN0aXR1dGVzIHRoZSBBdXRvY29uZiBNYWNyby4KKyMKKyMgICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwgYXBwbGllcyB0byB2ZXJzaW9ucyBvZiB0aGUgQXV0b2NvbmYKKyMgICBNYWNybyByZWxlYXNlZCBieSB0aGUgQXV0b2NvbmYgQXJjaGl2ZS4gV2hlbiB5b3UgbWFrZSBhbmQgZGlzdHJpYnV0ZSBhCisjICAgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgQXV0b2NvbmYgTWFjcm8sIHlvdSBtYXkgZXh0ZW5kIHRoaXMgc3BlY2lhbAorIyAgIGV4Y2VwdGlvbiB0byB0aGUgR1BMIHRvIGFwcGx5IHRvIHlvdXIgbW9kaWZpZWQgdmVyc2lvbiBhcyB3ZWxsLgorCisjc2VyaWFsIDE0CisKK0FDX0RFRlVOKFtBWF9GTEFHU19XQVJOX0FMTF0sW2RubAorQVNfVkFSX1BVU0hERUYoW0ZMQUdTXSxbX0FDX0xBTkdfUFJFRklYW11GTEFHU10pZG5sCitBU19WQVJfUFVTSERFRihbVkFSXSxbYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXWZsYWdzX3dhcm5fYWxsXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFttNF9pZnZhbCgkMSwkMSxGTEFHUykgZm9yIG1heGltdW0gd2FybmluZ3NdLAorVkFSLFtWQVI9Im5vLCB1bmtub3duIgorYWNfc2F2ZV9bXUZMQUdTPSIkW11GTEFHUyIKK2ZvciBhY19hcmcgZG5sCitpbiAiLXdhcm4gYWxsICAlIC13YXJuIGFsbCIgICBkbmwgSW50ZWwKKyAgICItcGVkYW50aWMgICUgLVdhbGwiICAgICAgIGRubCBHQ0MKKyAgICIteHN0cmNvbnN0ICUgLXYiICAgICAgICAgIGRubCBTb2xhcmlzIEMKKyAgICItc3RkMSAgICAgICUgLXZlcmJvc2UgLXcwIC13YXJucHJvdG9zIiBkbmwgRGlnaXRhbCBVbml4CisgICAiLXFsYW5nbHZsPWFuc2kgJSAtcXNyY21zZyAtcWluZm89YWxsOm5vcHB0Om5vcHBjOm5vb2JzOm5vY25kIiBkbmwgQUlYCisgICAiLWFuc2kgLWFuc2lFICUgLWZ1bGx3YXJuIiBkbmwgSVJJWAorICAgIitFU2xpdCAgICAgJSArdzEiICAgICAgICAgZG5sIEhQLVVYIEMKKyAgICItWGMgICAgICAgICUgLXB2Y3RsWyxdZnVsbG1zZyIgZG5sIE5FQyBTWC01IChTdXBlci1VWCAxMCkKKyAgICItaCBjb25mb3JtICUgLWggbXNnbGV2ZWwgMiIgZG5sIENyYXkgQyAoVW5pY29zKQorICAgIworZG8gRkxBR1M9IiRhY19zYXZlX1tdRkxBR1MgImBlY2hvICRhY19hcmcgfCBzZWQgLWUgJ3MsJSUuKiwsJyAtZSAncywlLCwnYAorICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTV0sCisgICAgICAgICAgICAgICAgICAgICBbVkFSPWBlY2hvICRhY19hcmcgfCBzZWQgLWUgJ3MsLiolICosLCdgIDsgYnJlYWtdKQorZG9uZQorRkxBR1M9IiRhY19zYXZlX1tdRkxBR1MiCitdKQorQVNfVkFSX1BPUERFRihbRkxBR1NdKWRubAorQUNfUkVRVUlSRShbQVhfQVBQRU5EX0ZMQUddKQorY2FzZSAiLiRWQVIiIGluCisgICAgIC5va3wub2ssKikgbTRfaWZ2YWxuKCQzLCQzKSA7OworICAgLnwubm98Lm5vLCopIG00X2RlZmF1bHQoJDQsW200X2lmdmFsKCQyLFtBWF9BUFBFTkRfRkxBRyhbJDJdLCBbJDFdKV0pXSkgOzsKKyAgICopIG00X2RlZmF1bHQoJDMsW0FYX0FQUEVORF9GTEFHKFskVkFSXSwgWyQxXSldKSA7OworZXNhYworQVNfVkFSX1BPUERFRihbVkFSXSlkbmwKK10pZG5sIEFYX0ZMQUdTX1dBUk5fQUxMCitkbmwgIGltcGxlbWVudGF0aW9uIHRhY3RpY3M6CitkbmwgICB0aGUgZm9yLWFyZ3VtZW50IGNvbnRhaW5zIGEgbGlzdCBvZiBvcHRpb25zLiBUaGUgZmlyc3QgcGFydCBvZgorZG5sICAgdGhlc2UgZG9lcyBvbmx5IGV4aXN0IHRvIGRldGVjdCB0aGUgY29tcGlsZXIgLSB1c3VhbGx5IGl0IGlzCitkbmwgICBhIGdsb2JhbCBvcHRpb24gdG8gZW5hYmxlIC1hbnNpIG9yIC1leHRyYXdhcm5pbmdzLiBBbGwgb3RoZXIKK2RubCAgIGNvbXBpbGVycyB3aWxsIGZhaWwgYWJvdXQgaXQuIFRoYXQgd2FzIG5lZWRlZCBzaW5jZSBhIGxvdCBvZgorZG5sICAgY29tcGlsZXJzIHdpbGwgZ2l2ZSBmYWxzZSBwb3NpdGl2ZXMgZm9yIHNvbWUgb3B0aW9uLXN5bnRheAorZG5sICAgbGlrZSAtV29wdGlvbiBvciAtWG9wdGlvbiBhcyB0aGV5IHRoaW5rIG9mIGl0IGlzIGEgcGFzcy10aHJvdWdoCitkbmwgICB0byBsYXRlciBjb21waWxlIHN0YWdlcyBvciBzb21ldGhpbmcuIFRoZSAiJSIgaXMgdXNlZCBhcyBhCitkbmwgICBkZWxpbWl0ZXIuIEEgbm9uLW9wdGlvbiBjb21tZW50IGNhbiBiZSBnaXZlbiBhZnRlciAiJSUiIG1hcmtzCitkbmwgICB3aGljaCB3aWxsIGJlIHNob3duIGJ1dCBub3QgYWRkZWQgdG8gdGhlIHJlc3BlY3RpdmUgQy9DWFhGTEFHUy4KKworQUNfREVGVU4oW0FYX0NGTEFHU19XQVJOX0FMTF0sW2RubAorQUNfTEFOR19QVVNIKFtDXSkKK0FYX0ZMQUdTX1dBUk5fQUxMKFskMV0sIFskMl0sIFskM10sIFskNF0pCitBQ19MQU5HX1BPUChbQ10pCitdKQorCitBQ19ERUZVTihbQVhfQ1hYRkxBR1NfV0FSTl9BTExdLFtkbmwKK0FDX0xBTkdfUFVTSChbQysrXSkKK0FYX0ZMQUdTX1dBUk5fQUxMKFskMV0sIFskMl0sIFskM10sIFskNF0pCitBQ19MQU5HX1BPUChbQysrXSkKK10pCisKK0FDX0RFRlVOKFtBWF9GQ0ZMQUdTX1dBUk5fQUxMXSxbZG5sCitBQ19MQU5HX1BVU0goW0ZvcnRyYW5dKQorQVhfRkxBR1NfV0FSTl9BTEwoWyQxXSwgWyQyXSwgWyQzXSwgWyQ0XSkKK0FDX0xBTkdfUE9QKFtGb3J0cmFuXSkKK10pCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL200L2F4X2NoZWNrX2NvbXBpbGVfZmxhZy5tNCBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbTQvYXhfY2hlY2tfY29tcGlsZV9mbGFnLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYThkNjkKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL200L2F4X2NoZWNrX2NvbXBpbGVfZmxhZy5tNApAQCAtMCwwICsxLDcyIEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2NoZWNrX2NvbXBpbGVfZmxhZy5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX0NIRUNLX0NPTVBJTEVfRkxBRyhGTEFHLCBbQUNUSU9OLVNVQ0NFU1NdLCBbQUNUSU9OLUZBSUxVUkVdLCBbRVhUUkEtRkxBR1NdKQorIworIyBERVNDUklQVElPTgorIworIyAgIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIEZMQUcgd29ya3Mgd2l0aCB0aGUgY3VycmVudCBsYW5ndWFnZSdzIGNvbXBpbGVyCisjICAgb3IgZ2l2ZXMgYW4gZXJyb3IuICAoV2FybmluZ3MsIGhvd2V2ZXIsIGFyZSBpZ25vcmVkKQorIworIyAgIEFDVElPTi1TVUNDRVNTL0FDVElPTi1GQUlMVVJFIGFyZSBzaGVsbCBjb21tYW5kcyB0byBleGVjdXRlIG9uCisjICAgc3VjY2Vzcy9mYWlsdXJlLgorIworIyAgIElmIEVYVFJBLUZMQUdTIGlzIGRlZmluZWQsIGl0IGlzIGFkZGVkIHRvIHRoZSBjdXJyZW50IGxhbmd1YWdlJ3MgZGVmYXVsdAorIyAgIGZsYWdzIChlLmcuIENGTEFHUykgd2hlbiB0aGUgY2hlY2sgaXMgZG9uZS4gIFRoZSBjaGVjayBpcyB0aHVzIG1hZGUgd2l0aAorIyAgIHRoZSBmbGFnczogIkNGTEFHUyBFWFRSQS1GTEFHUyBGTEFHIi4gIFRoaXMgY2FuIGZvciBleGFtcGxlIGJlIHVzZWQgdG8KKyMgICBmb3JjZSB0aGUgY29tcGlsZXIgdG8gaXNzdWUgYW4gZXJyb3Igd2hlbiBhIGJhZCBmbGFnIGlzIGdpdmVuLgorIworIyAgIE5PVEU6IEltcGxlbWVudGF0aW9uIGJhc2VkIG9uIEFYX0NGTEFHU19HQ0NfT1BUSU9OLiBQbGVhc2Uga2VlcCB0aGlzCisjICAgbWFjcm8gaW4gc3luYyB3aXRoIEFYX0NIRUNLX3tQUkVQUk9DLExJTkt9X0ZMQUcuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDggR3VpZG8gVS4gRHJhaGVpbSA8Z3VpZG9kQGdteC5kZT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTEgTWFhcnRlbiBCb3NtYW5zIDxta2Jvc21hbnNAZ21haWwuY29tPgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisjICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorIyAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwKKyMgICBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjICAgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyMKKyMgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgcmVzcGVjdGl2ZSBBdXRvY29uZiBNYWNybydzIGNvcHlyaWdodCBvd25lcgorIyAgIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSB0aGUgY29uZmlndXJlCisjICAgc2NyaXB0cyB0aGF0IGFyZSB0aGUgb3V0cHV0IG9mIEF1dG9jb25mIHdoZW4gcHJvY2Vzc2luZyB0aGUgTWFjcm8uIFlvdQorIyAgIG5lZWQgbm90IGZvbGxvdyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHdoZW4gdXNpbmcKKyMgICBvciBkaXN0cmlidXRpbmcgc3VjaCBzY3JpcHRzLCBldmVuIHRob3VnaCBwb3J0aW9ucyBvZiB0aGUgdGV4dCBvZiB0aGUKKyMgICBNYWNybyBhcHBlYXIgaW4gdGhlbS4gVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIGRvZXMgZ292ZXJuCisjICAgYWxsIG90aGVyIHVzZSBvZiB0aGUgbWF0ZXJpYWwgdGhhdCBjb25zdGl0dXRlcyB0aGUgQXV0b2NvbmYgTWFjcm8uCisjCisjICAgVGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMIGFwcGxpZXMgdG8gdmVyc2lvbnMgb2YgdGhlIEF1dG9jb25mCisjICAgTWFjcm8gcmVsZWFzZWQgYnkgdGhlIEF1dG9jb25mIEFyY2hpdmUuIFdoZW4geW91IG1ha2UgYW5kIGRpc3RyaWJ1dGUgYQorIyAgIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIEF1dG9jb25mIE1hY3JvLCB5b3UgbWF5IGV4dGVuZCB0aGlzIHNwZWNpYWwKKyMgICBleGNlcHRpb24gdG8gdGhlIEdQTCB0byBhcHBseSB0byB5b3VyIG1vZGlmaWVkIHZlcnNpb24gYXMgd2VsbC4KKworI3NlcmlhbCAyCisKK0FDX0RFRlVOKFtBWF9DSEVDS19DT01QSUxFX0ZMQUddLAorW0FDX1BSRVJFUSgyLjU5KWRubCBmb3IgX0FDX0xBTkdfUFJFRklYCitBU19WQVJfUFVTSERFRihbQ0FDSEVWQVJdLFtheF9jdl9jaGVja19bXV9BQ19MQU5HX0FCQlJFVltdZmxhZ3NfJDRfJDFdKWRubAorQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgX0FDX0xBTkcgY29tcGlsZXIgYWNjZXB0cyAkMV0sIENBQ0hFVkFSLCBbCisgIGF4X2NoZWNrX3NhdmVfZmxhZ3M9JFtdX0FDX0xBTkdfUFJFRklYW11GTEFHUworICBfQUNfTEFOR19QUkVGSVhbXUZMQUdTPSIkW11fQUNfTEFOR19QUkVGSVhbXUZMQUdTICQ0ICQxIgorICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKCldLAorICAgIFtBU19WQVJfU0VUKENBQ0hFVkFSLFt5ZXNdKV0sCisgICAgW0FTX1ZBUl9TRVQoQ0FDSEVWQVIsW25vXSldKQorICBfQUNfTEFOR19QUkVGSVhbXUZMQUdTPSRheF9jaGVja19zYXZlX2ZsYWdzXSkKK0FTX0lGKFt0ZXN0IHgiQVNfVkFSX0dFVChDQUNIRVZBUikiID0geHllc10sCisgIFttNF9kZWZhdWx0KFskMl0sIDopXSwKKyAgW200X2RlZmF1bHQoWyQzXSwgOildKQorQVNfVkFSX1BPUERFRihbQ0FDSEVWQVJdKWRubAorXSlkbmwgQVhfQ0hFQ0tfQ09NUElMRV9GTEFHUwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9tNC9heF9jb21waWxlcl92ZW5kb3IubTQgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL200L2F4X2NvbXBpbGVyX3ZlbmRvci5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2UzMmVhCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9tNC9heF9jb21waWxlcl92ZW5kb3IubTQKQEAgLTAsMCArMSw4NCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfY29tcGlsZXJfdmVuZG9yLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNZTk9QU0lTCisjCisjICAgQVhfQ09NUElMRVJfVkVORE9SCisjCisjIERFU0NSSVBUSU9OCisjCisjICAgRGV0ZXJtaW5lIHRoZSB2ZW5kb3Igb2YgdGhlIEMvQysrIGNvbXBpbGVyLCBlLmcuLCBnbnUsIGludGVsLCBpYm0sIHN1biwKKyMgICBocCwgYm9ybGFuZCwgY29tZWF1LCBkZWMsIGNyYXksIGthaSwgbGNjLCBtZXRyb3dlcmtzLCBzZ2ksIG1pY3Jvc29mdCwKKyMgICB3YXRjb20sIGV0Yy4gVGhlIHZlbmRvciBpcyByZXR1cm5lZCBpbiB0aGUgY2FjaGUgdmFyaWFibGUKKyMgICAkYXhfY3ZfY19jb21waWxlcl92ZW5kb3IgZm9yIEMgYW5kICRheF9jdl9jeHhfY29tcGlsZXJfdmVuZG9yIGZvciBDKysuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDggU3RldmVuIEcuIEpvaG5zb24gPHN0ZXZlbmpAYWx1bS5taXQuZWR1PgorIyAgIENvcHlyaWdodCAoYykgMjAwOCBNYXR0ZW8gRnJpZ28KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyMgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsCisjICAgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyAgIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisjCisjICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHJlc3BlY3RpdmUgQXV0b2NvbmYgTWFjcm8ncyBjb3B5cmlnaHQgb3duZXIKKyMgICBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgdGhlIGNvbmZpZ3VyZQorIyAgIHNjcmlwdHMgdGhhdCBhcmUgdGhlIG91dHB1dCBvZiBBdXRvY29uZiB3aGVuIHByb2Nlc3NpbmcgdGhlIE1hY3JvLiBZb3UKKyMgICBuZWVkIG5vdCBmb2xsb3cgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB3aGVuIHVzaW5nCisjICAgb3IgZGlzdHJpYnV0aW5nIHN1Y2ggc2NyaXB0cywgZXZlbiB0aG91Z2ggcG9ydGlvbnMgb2YgdGhlIHRleHQgb2YgdGhlCisjICAgTWFjcm8gYXBwZWFyIGluIHRoZW0uIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBkb2VzIGdvdmVybgorIyAgIGFsbCBvdGhlciB1c2Ugb2YgdGhlIG1hdGVyaWFsIHRoYXQgY29uc3RpdHV0ZXMgdGhlIEF1dG9jb25mIE1hY3JvLgorIworIyAgIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCBhcHBsaWVzIHRvIHZlcnNpb25zIG9mIHRoZSBBdXRvY29uZgorIyAgIE1hY3JvIHJlbGVhc2VkIGJ5IHRoZSBBdXRvY29uZiBBcmNoaXZlLiBXaGVuIHlvdSBtYWtlIGFuZCBkaXN0cmlidXRlIGEKKyMgICBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBBdXRvY29uZiBNYWNybywgeW91IG1heSBleHRlbmQgdGhpcyBzcGVjaWFsCisjICAgZXhjZXB0aW9uIHRvIHRoZSBHUEwgdG8gYXBwbHkgdG8geW91ciBtb2RpZmllZCB2ZXJzaW9uIGFzIHdlbGwuCisKKyNzZXJpYWwgMTEKKworQUNfREVGVU4oW0FYX0NPTVBJTEVSX1ZFTkRPUl0sCitbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBfQUNfTEFORyBjb21waWxlciB2ZW5kb3JdLCBheF9jdl9bXV9BQ19MQU5HX0FCQlJFVltdX2NvbXBpbGVyX3ZlbmRvciwKKyAgWyMgbm90ZTogZG9uJ3QgY2hlY2sgZm9yIGdjYyBmaXJzdCBzaW5jZSBzb21lIG90aGVyIGNvbXBpbGVycyBkZWZpbmUgX19HTlVDX18KKyAgdmVuZG9ycz0iaW50ZWw6ICAgICBfX0lDQyxfX0VDQyxfX0lOVEVMX0NPTVBJTEVSCisgICAgICAgICAgIGlibTogICAgICAgX194bGNfXyxfX3hsQ19fLF9fSUJNQ19fLF9fSUJNQ1BQX18KKyAgICAgICAgICAgcGF0aHNjYWxlOiBfX1BBVEhDQ19fLF9fUEFUSFNDQUxFX18KKyAgICAgICAgICAgY2xhbmc6ICAgICBfX2NsYW5nX18KKyAgICAgICAgICAgZ251OiAgICAgICBfX0dOVUNfXworICAgICAgICAgICBzdW46ICAgICAgIF9fU1VOUFJPX0MsX19TVU5QUk9fQ0MKKyAgICAgICAgICAgaHA6ICAgICAgICBfX0hQX2NjLF9fSFBfYUNDCisgICAgICAgICAgIGRlYzogICAgICAgX19ERUNDLF9fREVDQ1hYLF9fREVDQ19WRVIsX19ERUNDWFhfVkVSCisgICAgICAgICAgIGJvcmxhbmQ6ICAgX19CT1JMQU5EQ19fLF9fVFVSQk9DX18KKyAgICAgICAgICAgY29tZWF1OiAgICBfX0NPTU9fXworICAgICAgICAgICBjcmF5OiAgICAgIF9DUkFZQworICAgICAgICAgICBrYWk6ICAgICAgIF9fS0NDCisgICAgICAgICAgIGxjYzogICAgICAgX19MQ0NfXworICAgICAgICAgICBzZ2k6ICAgICAgIF9fc2dpLHNnaQorICAgICAgICAgICBtaWNyb3NvZnQ6IF9NU0NfVkVSCisgICAgICAgICAgIG1ldHJvd2Vya3M6IF9fTVdFUktTX18KKyAgICAgICAgICAgd2F0Y29tOiAgICBfX1dBVENPTUNfXworICAgICAgICAgICBwb3J0bGFuZDogIF9fUEdJCisgICAgICAgICAgIHVua25vd246ICAgVU5LTk9XTiIKKyAgZm9yIHZlbnRlc3QgaW4gJHZlbmRvcnM7IGRvCisgICAgY2FzZSAkdmVudGVzdCBpbgorICAgICAgKjopIHZlbmRvcj0kdmVudGVzdDsgY29udGludWUgOzsKKyAgICAgICopICB2ZW5jcHA9ImRlZmluZWQoImBlY2hvICR2ZW50ZXN0IHwgc2VkICdzLywvKSB8fCBkZWZpbmVkKC9nJ2AiKSIgOzsKKyAgICBlc2FjCisgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTSgsWworICAgICAgI2lmICEoJHZlbmNwcCkKKyAgICAgICAgdGhpc2lzYW5lcnJvcjsKKyAgICAgICNlbmRpZgorICAgIF0pXSwgW2JyZWFrXSkKKyAgZG9uZQorICBheF9jdl9bXV9BQ19MQU5HX0FCQlJFVltdX2NvbXBpbGVyX3ZlbmRvcj1gZWNobyAkdmVuZG9yIHwgY3V0IC1kOiAtZjFgCisgXSkKK10pCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL200L2F4X2NvbmZpZ3VyZV9hcmdzLm00IGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9tNC9heF9jb25maWd1cmVfYXJncy5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzI2YjFiCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9tNC9heF9jb25maWd1cmVfYXJncy5tNApAQCAtMCwwICsxLDcwIEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfY29uZmlndXJlX2FyZ3MuaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU1lOT1BTSVMKKyMKKyMgICBBWF9DT05GSUdVUkVfQVJHUworIworIyBERVNDUklQVElPTgorIworIyAgIEhlbHBlciBtYWNybyBmb3IgQVhfRU5BQkxFX0JVSUxERElSLgorIworIyAgIFRoZSB0cmFkaXRpb25hbCB3YXkgb2Ygc3RhcnRpbmcgYSBzdWJkaXItY29uZmlndXJlIGlzIHJ1bm5pbmcgdGhlIHNjcmlwdAorIyAgIHdpdGggJHsxKyIkQCJ9IGJ1dCBzaW5jZSBhdXRvY29uZiAyLjYwIHRoaXMgaXMgYnJva2VuLiBJbnN0ZWFkIHdlIGhhdmUKKyMgICB0byByZWx5IG9uIGV2YWwnaW5nICRhY19jb25maWd1cmVfYXJncyBob3dldmVyIHNvbWUgb2xkIGF1dG9jb25mCisjICAgdmVyc2lvbnMgZG8gbm90IHByb3ZpZGUgdGhhdC4gVG8gZW5zdXJlIG1heGltdW0gcG9ydGFiaWxpdHkgb2YgYXV0b2NvbmYKKyMgICBleHRlbnNpb24gbWFjcm9zIHRoaXMgaGVscGVyIGNhbiBiZSBBQ19SRVFVSVJFJ2Qgc28gdGhhdAorIyAgICRhY19jb25maWd1cmVfYXJncyB3aWxsIGFsc3dheXMgYmUgcHJlc2VudC4KKyMKKyMgICBTYWRseSwgdGhlIHRyYWRpdGlvbmFsICJleGVjICRTSEVMTCIgb2YgdGhlIGVuYWJsZV9idWlsZGRpciBtYWNyb3MgaXMKKyMgICBzcG9pbGVkIG5vdyBhbmQgbXVzdCBiZSByZXBsYWNlZCBieSAiZXZhbCArIGV4aXQgJD8iLgorIworIyAgIEV4YW1wbGU6CisjCisjICAgICBBQ19ERUZVTihbQVhfRU5BQkxFX1NVQkRJUl0sW2RubAorIyAgICAgICBBQ19SRVFVSVJFKFtBWF9DT05GSUdVUkVfQVJHU10pZG5sCisjICAgICAgIGV2YWwgJFNIRUxMICRhY19jb25maWd1cmVfYXJncyB8fCBleGl0ICQ/CisjICAgICAgIC4uLl0pCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDggR3VpZG8gVS4gRHJhaGVpbSA8Z3VpZG9kQGdteC5kZT4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyMgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsCisjICAgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyAgIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisjCisjICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHJlc3BlY3RpdmUgQXV0b2NvbmYgTWFjcm8ncyBjb3B5cmlnaHQgb3duZXIKKyMgICBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgdGhlIGNvbmZpZ3VyZQorIyAgIHNjcmlwdHMgdGhhdCBhcmUgdGhlIG91dHB1dCBvZiBBdXRvY29uZiB3aGVuIHByb2Nlc3NpbmcgdGhlIE1hY3JvLiBZb3UKKyMgICBuZWVkIG5vdCBmb2xsb3cgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB3aGVuIHVzaW5nCisjICAgb3IgZGlzdHJpYnV0aW5nIHN1Y2ggc2NyaXB0cywgZXZlbiB0aG91Z2ggcG9ydGlvbnMgb2YgdGhlIHRleHQgb2YgdGhlCisjICAgTWFjcm8gYXBwZWFyIGluIHRoZW0uIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBkb2VzIGdvdmVybgorIyAgIGFsbCBvdGhlciB1c2Ugb2YgdGhlIG1hdGVyaWFsIHRoYXQgY29uc3RpdHV0ZXMgdGhlIEF1dG9jb25mIE1hY3JvLgorIworIyAgIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCBhcHBsaWVzIHRvIHZlcnNpb25zIG9mIHRoZSBBdXRvY29uZgorIyAgIE1hY3JvIHJlbGVhc2VkIGJ5IHRoZSBBdXRvY29uZiBBcmNoaXZlLiBXaGVuIHlvdSBtYWtlIGFuZCBkaXN0cmlidXRlIGEKKyMgICBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBBdXRvY29uZiBNYWNybywgeW91IG1heSBleHRlbmQgdGhpcyBzcGVjaWFsCisjICAgZXhjZXB0aW9uIHRvIHRoZSBHUEwgdG8gYXBwbHkgdG8geW91ciBtb2RpZmllZCB2ZXJzaW9uIGFzIHdlbGwuCisKKyNzZXJpYWwgOQorCitBQ19ERUZVTihbQVhfQ09ORklHVVJFX0FSR1NdLFsKKyAgICMgWyRdQCBpcyB1bnNhYmxlIGluIDIuNjArIGJ1dCBlYXJsaWVyIGF1dG9jb25mIGhhZCBubyBhY19jb25maWd1cmVfYXJncworICAgaWYgdGVzdCAiJHthY19jb25maWd1cmVfYXJncytzZXR9IiAhPSAic2V0IiA7IHRoZW4KKyAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPQorICAgICAgZm9yIGFjX2FyZyBpbiAkezErIlskXUAifTsgZG8KKyAgICAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIgorICAgICAgZG9uZQorICAgZmkKK10pCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL200L2F4X2VuYWJsZV9idWlsZGRpci5tNCBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbTQvYXhfZW5hYmxlX2J1aWxkZGlyLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYjg3MzEKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL200L2F4X2VuYWJsZV9idWlsZGRpci5tNApAQCAtMCwwICsxLDMwMCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfZW5hYmxlX2J1aWxkZGlyLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNZTk9QU0lTCisjCisjICAgQVhfRU5BQkxFX0JVSUxERElSIFsoZGlyc3RyaW5nLW9yLWNvbW1hbmQgWyxNYWtlZmlsZS5tayBbLC1hbGxdXSldCisjCisjIERFU0NSSVBUSU9OCisjCisjICAgSWYgdGhlIGN1cnJlbnQgY29uZmlndXJlIHdhcyBydW4gd2l0aGluIHRoZSBzcmNkaXIgdGhlbiB3ZSBtb3ZlIGFsbAorIyAgIGNvbmZpZ3VyZS1maWxlcyBpbnRvIGEgc3ViZGlyIGFuZCBsZXQgdGhlIGNvbmZpZ3VyZSBzdGVwcyBjb250aW51ZQorIyAgIHRoZXJlLiBXZSBwcm92aWRlIGFuIG9wdGlvbiAtLWRpc2FibGUtYnVpbGRkaXIgdG8gc3VwcHJlc3MgdGhlIG1vdmUgaW50bworIyAgIGEgc2VwYXJhdGUgYnVpbGRkaXIuCisjCisjICAgRGVmYXVsdHM6CisjCisjICAgICAkMSA9ICRob3N0IChvdmVycmlkZGVuIHdpdGggJEhPU1QpCisjICAgICAkMiA9IE1ha2VmaWxlLm1rCisjICAgICAkMyA9IC1hbGwKKyMKKyMgICBUaGlzIG1hY3JvIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBBTV9JTklUX0FVVE9NQUtFLiBJdCBjcmVhdGVzIGEgZGVmYXVsdAorIyAgIHRvcGxldmVsIHNyY2RpciBNYWtlZmlsZSBmcm9tIHRoZSBpbmZvcm1hdGlvbiBmb3VuZCBpbiB0aGUgY3JlYXRlZAorIyAgIHRvcGxldmVsIGJ1aWxkZGlyIE1ha2VmaWxlLiBJdCBqdXN0IGNvcGllcyB0aGUgdmFyaWFibGVzIGFuZAorIyAgIHJ1bGUtdGFyZ2V0cywgZWFjaCBleHRlbmRlZCB3aXRoIGEgZGVmYXVsdCBydWxlLWV4ZWN1dGlvbiB0aGF0IHJlY3Vyc2VzCisjICAgaW50byB0aGUgYnVpbGQgZGlyZWN0b3J5IG9mIHRoZSBjdXJyZW50ICJIT1NUIi4gWW91IGNhbiBvdmVycmlkZSB0aGUKKyMgICBhdXRvLWRlY3Rpb24gdGhyb3VnaCBgY29uZmlnLmd1ZXNzYCBhbmQgYnVpbGQtdGltZSBvZiBjb3Vyc2UsIGFzIGluCisjCisjICAgICBtYWtlIEhPU1Q9aTM4Ni1taW5ndy1jcm9zcworIworIyAgIHdoaWNoIGNhbiBvZiBjb3Vyc2Ugc2V0IGF0IGNvbmZpZ3VyZSB0aW1lIGFzIHdlbGwgdXNpbmcKKyMKKyMgICAgIGNvbmZpZ3VyZSAtLWhvc3Q9aTM4Ni1taW5ndy1jcm9zcworIworIyAgIEFmdGVyIHRoZSBkZWZhdWx0IGhhcyBiZWVuIGNyZWF0ZWQsIGFkZGl0aW9uYWwgcnVsZXMgY2FuIGJlIGFwcGVuZGVkCisjICAgdGhhdCB3aWxsIG5vdCBqdXN0IHJlY3Vyc2UgaW50byB0aGUgc3ViZGlyZWN0b3JpZXMgYW5kIG9ubHkgZXZlciBleGlzdAorIyAgIGluIHRoZSBzcmNkaXIgdG9wbGV2ZWwgbWFrZWZpbGUgLSB0aGVzZSBwYXJ0cyBhcmUgcmVhZCBmcm9tIHRoZSAkMiA9CisjICAgTWFrZWZpbGUubWsgZmlsZQorIworIyAgIFRoZSBhdXRvbWF0aWMgcnVsZXMgYXJlIHVzdWFsbHkgc2Nhbm5pbmcgdGhlIHRvcGxldmVsIE1ha2VmaWxlIGZvciBsaW5lcworIyAgIGxpa2UgJyMjIyMgJGhvc3QgfCRidWlsZGRpcicgdG8gcmVjb2duaXplIHRoZSBwbGFjZSB3aGVyZSB0byByZWN1cnNlCisjICAgaW50by4gVXN1YWxseSwgdGhlIGxhc3Qgb25lIGlzIHRoZSBvbmx5IG9uZSB1c2VkLiBIb3dldmVyLCBhbG1vc3QgYWxsCisjICAgdGFyZ2V0cyBoYXZlIGFuIGFkZGl0aW9uYWwgIiotYWxsIiBydWxlIHdoaWNoIG1ha2VzIHRoZSBzY3JpcHQgdG8KKyMgICByZWN1cnNlIGludG8gX2FsbF8gdmFyaWFudHMgb2YgdGhlIGN1cnJlbnQgSE9TVCAoISEpIHNldHRpbmcuIFRoZSAiLWFsbCIKKyMgICBzdWZmaXggY2FuIGJlIG92ZXJyaWRlbiBmb3IgdGhlIG1hY3JvIGFzIHdlbGwuCisjCisjICAgYSBzcGVjaWFsIHJ1bGUgaXMgb25seSBnaXZlbiBmb3IgdGhpbmdzIGxpa2UgImRpc3QiIHRoYXQgd2lsbCBjb3B5IHRoZQorIyAgIHRhcmJhbGwgZnJvbSB0aGUgYnVpbGRkaXIgdG8gdGhlIHNvdXJjZWRpciAob3IgJChQVUIpKSBmb3IgcmVhc29uIG9mCisjICAgY29udmVuaWVuY2UuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDkgR3VpZG8gVS4gRHJhaGVpbSA8Z3VpZG9kQGdteC5kZT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMDkgQWxhbiBKZW5raW5zIDxhbGFuLWplbmtpbnNAdHVmZm1haWwuY28udWs+CisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisjICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbAorIyAgIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgICB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorIworIyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSByZXNwZWN0aXZlIEF1dG9jb25mIE1hY3JvJ3MgY29weXJpZ2h0IG93bmVyCisjICAgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IHRoZSBjb25maWd1cmUKKyMgICBzY3JpcHRzIHRoYXQgYXJlIHRoZSBvdXRwdXQgb2YgQXV0b2NvbmYgd2hlbiBwcm9jZXNzaW5nIHRoZSBNYWNyby4gWW91CisjICAgbmVlZCBub3QgZm9sbG93IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugd2hlbiB1c2luZworIyAgIG9yIGRpc3RyaWJ1dGluZyBzdWNoIHNjcmlwdHMsIGV2ZW4gdGhvdWdoIHBvcnRpb25zIG9mIHRoZSB0ZXh0IG9mIHRoZQorIyAgIE1hY3JvIGFwcGVhciBpbiB0aGVtLiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgZG9lcyBnb3Zlcm4KKyMgICBhbGwgb3RoZXIgdXNlIG9mIHRoZSBtYXRlcmlhbCB0aGF0IGNvbnN0aXR1dGVzIHRoZSBBdXRvY29uZiBNYWNyby4KKyMKKyMgICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwgYXBwbGllcyB0byB2ZXJzaW9ucyBvZiB0aGUgQXV0b2NvbmYKKyMgICBNYWNybyByZWxlYXNlZCBieSB0aGUgQXV0b2NvbmYgQXJjaGl2ZS4gV2hlbiB5b3UgbWFrZSBhbmQgZGlzdHJpYnV0ZSBhCisjICAgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgQXV0b2NvbmYgTWFjcm8sIHlvdSBtYXkgZXh0ZW5kIHRoaXMgc3BlY2lhbAorIyAgIGV4Y2VwdGlvbiB0byB0aGUgR1BMIHRvIGFwcGx5IHRvIHlvdXIgbW9kaWZpZWQgdmVyc2lvbiBhcyB3ZWxsLgorCisjc2VyaWFsIDIzCisKK0FDX0RFRlVOKFtBWF9FTkFCTEVfQlVJTERESVJdLFsKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlbXWRubAorQUNfUkVRVUlSRShbQVhfQ09ORklHVVJFX0FSR1NdKVtdZG5sCitBQ19SRVFVSVJFKFtBTV9BVVhfRElSX0VYUEFORF0pW11kbmwKK0FDX0JFRk9SRShbJDBdLFtBTV9JTklUX0FVVE9NQUtFXSlkbmwKK0FTX1ZBUl9QVVNIREVGKFtTVUJdLFtheF9lbmFibGVfYnVpbGRkaXJdKWRubAorQVNfVkFSX1BVU0hERUYoW0FVWF0sW2F4X2VuYWJsZV9idWlsZGRpcl9hdXhkaXJdKWRubAorQVNfVkFSX1BVU0hERUYoW1NFRF0sW2F4X2VuYWJsZV9idWlsZGRpcl9zZWRdKWRubAorU1VCPSIuIgorQUNfQVJHX0VOQUJMRShbYnVpbGRkaXJdLCBBU19IRUxQX1NUUklORygKKyAgWy0tZGlzYWJsZS1idWlsZGRpcl0sW2Rpc2FibGUgYXV0b21hdGljIGJ1aWxkIGluIHN1YmRpciBvZiBzb3VyY2VzXSkKKyAgLFtTVUI9IiRlbmFibGV2YWwiXSwgW1NVQj0iYXV0byJdKQoraWYgdGVzdCAiLiRhY19zcmNkaXJfZGVmYXVsdGVkIiAhPSAiLm5vIiA7IHRoZW4KK2lmIHRlc3QgIi4kc3JjZGlyIiA9ICIuLiIgOyB0aGVuCisgIGlmIHRlc3QgLWYgY29uZmlnLnN0YXR1cyA7IHRoZW4KKyAgICBBQ19NU0dfTk9USUNFKHRvcGxldmVsIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQuLi4gc2tpcHBpbmcgc3ViZGlyIGJ1aWxkKQorICBlbHNlCisgICAgdGVzdCAiLiRTVUIiID0gIi4iICAmJiBTVUI9Ii4iCisgICAgdGVzdCAiLiRTVUIiID0gIi5ubyIgICYmIFNVQj0iLiIKKyAgICB0ZXN0ICIuJFRBUkdFVCIgPSAiLiIgJiYgVEFSR0VUPSIkdGFyZ2V0IgorICAgIHRlc3QgIi4kU1VCIiA9ICIuYXV0byIgJiYgU1VCPSJtNF9pZnZhbChbJDFdLCBbJDFdLFskVEFSR0VUXSkiCisgICAgaWYgdGVzdCAiLiRTVUIiICE9ICIuLiIgOyB0aGVuICAgICMgd2Uga25vdyB3aGVyZSB0byBnbyBhbmQKKyAgICAgIEFTX01LRElSX1AoWyRTVUJdKQorICAgICAgZWNobyBfXy4kU1VCLl9fID4gJFNVQi9jb25mdGVzdC50bXAKKyAgICAgIGNkICRTVUIKKyAgICAgIGlmIGdyZXAgX18uJFNVQi5fXyBjb25mdGVzdC50bXAgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCA7IHRoZW4KKyAgICAgICAgcm0gY29uZnRlc3QudG1wCisgICAgICAgIEFDX01TR19SRVNVTFQoW2NvbnRpbnVlIGNvbmZpZ3VyZSBpbiBkZWZhdWx0IGJ1aWxkZGlyICIuLyRTVUIiXSkKKyAgICAgIGVsc2UKKyAgICAgICAgQUNfTVNHX0VSUk9SKFtjb3VsZCBub3QgY2hhbmdlIHRvIGRlZmF1bHQgYnVpbGRkaXIgIi4vJFNVQiJdKQorICAgICAgZmkKKyAgICAgIHNyY2Rpcj1gZWNobyAiJFNVQiIgfAorICAgICAgICAgICAgICBzZWQgLWUgJ3MsXlwuLywsO3MsW1teL11dJCwmLyw7cyxbW14vXV0qLywuLi8sZztzLFtbL11dJCwsOydgCisgICAgICAjIGdvaW5nIHRvIHJlc3RhcnQgZnJvbSBzdWJkaXJlY3RvcnkgbG9jYXRpb24KKyAgICAgIHRlc3QgLWYgJHNyY2Rpci9jb25maWcubG9nICAgJiYgbXYgJHNyY2Rpci9jb25maWcubG9nICAgLgorICAgICAgdGVzdCAtZiAkc3JjZGlyL2NvbmZkZWZzLmggICAmJiBtdiAkc3JjZGlyL2NvbmZkZWZzLmggICAuCisgICAgICB0ZXN0IC1mICRzcmNkaXIvY29uZnRlc3QubG9nICYmIG12ICRzcmNkaXIvY29uZnRlc3QubG9nIC4KKyAgICAgIHRlc3QgLWYgJHNyY2Rpci8kY2FjaGVfZmlsZSAgJiYgbXYgJHNyY2Rpci8kY2FjaGVfZmlsZSAgLgorICAgICAgQUNfTVNHX1JFU1VMVCguLi4uZXhlYyAkU0hFTEwgJHNyY2Rpci9bJF0wICItLXNyY2Rpcj0kc3JjZGlyIiAiLS1lbmFibGUtYnVpbGRkaXI9JFNVQiIgJHsxKyJbJF1AIn0pCisgICAgICBjYXNlICJbJF0wIiBpbiAjIHJlc3RhcnQKKyAgICAgICBbL1xcXSopIGV2YWwgJFNIRUxMICInWyRdMCciICInLS1zcmNkaXI9JHNyY2RpciciICInLS1lbmFibGUtYnVpbGRkaXI9JFNVQiciICRhY19jb25maWd1cmVfYXJncyA7OworICAgICAgICopIGV2YWwgJFNIRUxMICInJHNyY2Rpci9bJF0wJyIgIictLXNyY2Rpcj0kc3JjZGlyJyIgIictLWVuYWJsZS1idWlsZGRpcj0kU1VCJyIgJGFjX2NvbmZpZ3VyZV9hcmdzIDs7CisgICAgICBlc2FjIDsgZXhpdCAkPworICAgIGZpCisgIGZpCitmaSBmaQordGVzdCAiLiRTVUIiID0gIi5hdXRvIiAmJiBTVUI9Ii4iCitkbmwgYWNfcGF0aF9wcm9nIHVzZXMgInNldCBkdW1teSIgdG8gb3ZlcnJpZGUgJEAgd2hpY2ggd291bGQgZGVmZWF0IHRoZSAiZXhlYyIKK0FDX1BBVEhfUFJPRyhTRUQsZ3NlZCBzZWQsIHNlZCkKK0FVWD0iJGFtX2F1eF9kaXIiCitBU19WQVJfUE9QREVGKFtTRURdKWRubAorQVNfVkFSX1BPUERFRihbQVVYXSlkbmwKK0FTX1ZBUl9QT1BERUYoW1NVQl0pZG5sCitBQ19DT05GSUdfQ09NTUFORFMoW2J1aWxkaXJdLFtkbmwgLi4uLi4uLi4uLi4uLi4gY29uZmlnLnN0YXR1cyAuLi4uLi4uLi4uLi4uLgorQVNfVkFSX1BVU0hERUYoW1NVQl0sW2F4X2VuYWJsZV9idWlsZGRpcl0pZG5sCitBU19WQVJfUFVTSERFRihbVE9QXSxbdG9wX3NyY2Rpcl0pZG5sCitBU19WQVJfUFVTSERFRihbU1JDXSxbYWNfdG9wX3NyY2Rpcl0pZG5sCitBU19WQVJfUFVTSERFRihbQVVYXSxbYXhfZW5hYmxlX2J1aWxkZGlyX2F1eGRpcl0pZG5sCitBU19WQVJfUFVTSERFRihbU0VEXSxbYXhfZW5hYmxlX2J1aWxkZGlyX3NlZF0pZG5sCitwdXNoZGVmKFtFTkRdLFtNYWtlZmlsZS5ta10pZG5sCitwdXNoZGVmKFtfQUxMXSxbaWZlbHNlKFskM10sLFstYWxsXSxbJDNdKV0pZG5sCisgIFNSQz0iJGF4X2VuYWJsZV9idWlsZGRpcl9zcmNkaXIiCisgIGlmIHRlc3QgIi4kU1VCIiA9ICIuLiIgOyB0aGVuCisgICAgaWYgdGVzdCAtZiAiJFRPUC9NYWtlZmlsZSIgOyB0aGVuCisgICAgICBBQ19NU0dfTk9USUNFKFtza2lwcGluZyBUT1AvTWFrZWZpbGUgLSBsZWZ0IHVudG91Y2hlZF0pCisgICAgZWxzZQorICAgICAgQUNfTVNHX05PVElDRShbc2tpcHBpbmcgVE9QL01ha2VmaWxlIC0gbm90IGNyZWF0ZWRdKQorICAgIGZpCisgIGVsc2UKKyAgICBpZiB0ZXN0IC1mICIkU1JDL01ha2VmaWxlIiA7IHRoZW4KKyAgICAgIGE9YGdyZXAgIl5WRVJTSU9OICIgIiRTUkMvTWFrZWZpbGUiYCA7IGI9YGdyZXAgIl5WRVJTSU9OICIgTWFrZWZpbGVgCisgICAgICB0ZXN0ICIkYSIgIT0gIiRiIiAmJiBybSAiJFNSQy9NYWtlZmlsZSIKKyAgICBmaQorICAgIGlmIHRlc3QgLWYgIiRTUkMvTWFrZWZpbGUiIDsgdGhlbgorCWVjaG8gIiRTUkMvTWFrZWZpbGUgOiAkU1JDL01ha2VmaWxlLmluIiA+ICR0bXAvY29uZnRlbXAubWsKKwllY2hvICIJW11AIGVjaG8gJ1JFTU9WRUQsLCwnID5cJFtdQCIgPj4gJHRtcC9jb25mdGVtcC5taworICAgICAgZXZhbCAiJHtNQUtFLW1ha2V9IC1mICR0bXAvY29uZnRlbXAubWsgMj4vZGV2L251bGwgPi9kZXYvbnVsbCIKKyAgICAgIGlmIGdyZXAgJ15SRU1PVkVELCwsJyAiJFNSQy9NYWtlZmlsZSIgPi9kZXYvbnVsbAorICAgICAgdGhlbiBybSAkU1JDL01ha2VmaWxlIDsgZmkKKyAgICAgIGNwICR0bXAvY29uZnRlbXAubWsgJFNSQy9tYWtlZmlsZXMubWt+ICAgICAgIyMgREVCVUdHSU5HCisgICAgZmkKKyAgICBpZiB0ZXN0ICEgLWYgIiRTUkMvTWFrZWZpbGUiIDsgdGhlbgorICAgICAgQUNfTVNHX05PVElDRShbY3JlYXRlIFRPUC9NYWtlZmlsZSBndWVzc2VkIGZyb20gbG9jYWwgTWFrZWZpbGVdKQorICAgICAgeD0nYCcgOyBjYXQgPiR0bXAvY29uZnRlbXAuc2VkIDw8X0VPRgorL15cJC9uCit4CisvXlwkL2JTCit4CisvXFxcXFwkL3tIO2Q7fQore0g7cy8uKi8vO3g7fQorYk0KKzpTCit4CisvXFxcXFwkL3toO2Q7fQore2g7cy8uKi8vO3g7fQorOk0KK3MvXFwoXFxuXFwpCS9cXDEgL2cKKy9eCS9kCisvXltbCSBdXSpbW1xcI11dL2QKKy9eVlBBVEggKj0vZAorcy9ec3JjZGlyICo9Liovc3JjZGlyID0gLi8KK3MvXnRvcF9zcmNkaXIgKj0uKi90b3Bfc3JjZGlyID0gLi8KKy9bWzo9XV0vIWQKKy9eXFwuL2QKK2RubCBOb3cgaGFuZGxlIHJ1bGVzIChpLmUuIGxpbmVzIGNvbnRhaW5pbmcgIjoiIGJ1dCBub3QgIiA9ICIpLgorLyA9IC9iCisvIC49IC9iCisvOi8hYgorcy86LiovOi8KK3MvIC8gIC9nCitzLyBcXChbW2Etel1dW1thLXotXV0qW1thLXpBLVowLTldXVxcKVxcKFtbIDpdXVxcKS8gXFwxIFxcMVtdX0FMTFxcMi9nCitzL15cXChbW2Etel1dW1thLXotXV0qW1thLXpBLVowLTldXVxcKVxcKFtbIDpdXVxcKS9cXDEgXFwxW11fQUxMXFwyLworcy8gIC8gL2cKKy9eYWxsIGFsbFtdX0FMTFtbIDpdXS9pXFwKK2FsbC1jb25maWd1cmVkIDogYWxsW11fQUxMCitkbmwgZGlzdC1hbGwgZXhpc3RzLi4uIGFuZCB3b3VsZCBtYWtlIGZvciBkaXN0LWFsbC1hbGwKK3MvIFtbYS16QS1aMC05LV1dKltdX0FMTCBbW2EtekEtWjAtOS1dXSpbXV9BTExbXV9BTEwvL2cKKy9bXV9BTExbXV9BTEwvZAorYVxcCisJQCBIT1NUPSJcJChIT1NUKVwiIFxcXFxcXAorCTsgdGVzdCAiLlwkXCRIT1NUIiA9ICIuIiAmJiBIT1NUPSR4IHNoICRBVVgvY29uZmlnLmd1ZXNzICR4IFxcXFxcXAorCTsgQlVJTEQ9JHggZ3JlcCAiXiMjIyMgXCRcJEhPU1QgIiBNYWtlZmlsZSB8IHNlZCAtZSAncy8uKnwvLycgJHggXFxcXFxcCisJOyB1c2U9JHggYmFzZW5hbWUgIlwkXEAiIF9BTEwgJHg7IG49JHggZWNobyBcJFwkQlVJTEQgfCB3YyAtdyAkeCBcXFxcXFwKKwk7IGVjaG8gIk1BS0UgXCRcJEhPU1QgOiBcJFwkbiAqIFwkXEAiOyBpZiB0ZXN0ICJcJFwkbiIgLWVxICIwIiA7IHRoZW4gOiBcXFxcXFwKKwk7IEJVSUxEPSR4IGdyZXAgIl4jIyMjLip8IiBNYWtlZmlsZSB8dGFpbCAtMXwgc2VkIC1lICdzLy4qfC8vJyAkeCA7IGZpIFxcXFxcXAorCTsgdGVzdCAiLlwkXCRCVUlMRCIgPSAiLiIgJiYgQlVJTEQ9Ii4iIFxcXFxcXAorCTsgdGVzdCAiXCRcJHVzZSIgPSAiXCRcQCIgJiYgQlVJTEQ9JHggZWNobyAiXCRcJEJVSUxEIiB8IHRhaWwgLTEgJHggXFxcXFxcCisJOyBmb3IgaSBpbiBcJFwkQlVJTEQgOyBkbyB0ZXN0ICIuXCRcJGkiID0gIi4iICYmIGNvbnRpbnVlIFxcXFxcXAorCTsgKGNkICJcJFwkaSIgJiYgdGVzdCAhIC1mIGNvbmZpZ3VyZSAmJiBcJChNQUtFKSBcJFwkdXNlKSB8fCBleGl0OyBkb25lCitkbmwgc3BlY2lhbCBydWxlIGFkZC1vbjogImRpc3QiIGNvcGllcyB0aGUgdGFyYmFsbCB0byAkKFBVQikuIChzb3VyY2UgdHJlZSkKKy9kaXN0W11fQUxMICo6L2FcXAorCUAgSE9TVD0iXCQoSE9TVClcIiBcXFxcXFwKKwk7IHRlc3QgIi5cJFwkSE9TVCIgPSAiLiIgJiYgSE9TVD0keCBzaCAkQVVYL2NvbmZpZy5ndWVzcyAkeCBcXFxcXFwKKwk7IEJVSUxEPSR4IGdyZXAgIl4jIyMjIFwkXCRIT1NUICIgTWFrZWZpbGUgfCBzZWQgLWUgJ3MvLip8Ly8nICR4IFxcXFxcXAorCTsgZm91bmQ9JHggZWNobyBcJFwkQlVJTEQgfCB3YyAtdyAkeCBcXFxcXFwKKwk7IGVjaG8gIk1BS0UgXCRcJEhPU1QgOiBcJFwkZm91bmQgXCQoUEFDS0FHRSktXCQoVkVSU0lPTikudGFyLioiIFxcXFxcXAorCTsgaWYgdGVzdCAiXCRcJGZvdW5kIiAtZXEgIjAiIDsgdGhlbiA6IFxcXFxcXAorCTsgQlVJTEQ9JHggZ3JlcCAiXiMjIyMgLip8IiBNYWtlZmlsZSB8dGFpbCAtMXwgc2VkIC1lICdzLy4qfC8vJyAkeCBcXFxcXFwKKwk7IGZpIDsgZm9yIGkgaW4gXCRcJEJVSUxEIDsgZG8gdGVzdCAiLlwkXCRpIiA9ICIuIiAmJiBjb250aW51ZSBcXFxcXFwKKwk7IGZvciBmIGluIFwkXCRpL1wkKFBBQ0tBR0UpLVwkKFZFUlNJT04pLnRhci4qIFxcXFxcXAorCTsgZG8gdGVzdCAtZiAiXCRcJGYiICYmIG12ICJcJFwkZiIgXCQoUFVCKS4gOyBkb25lIDsgYnJlYWsgOyBkb25lCitkbmwgc3BlY2lhbCBydWxlIGFkZC1vbjogImRpc3QtZm9vIiBjb3BpZXMgYWxsIHRoZSBhcmNoaXZlcyB0byAkKFBVQikuIChzb3VyY2UgdHJlZSkKKy9kaXN0LVtbYS16QS1aMC05XV0qW11fQUxMICo6L2FcXAorCUAgSE9TVD0iXCQoSE9TVClcIiBcXFxcXFwKKwk7IHRlc3QgIi5cJFwkSE9TVCIgPSAiLiIgJiYgSE9TVD0keCBzaCAuL2NvbmZpZy5ndWVzcyAkeCBcXFxcXFwKKwk7IEJVSUxEPSR4IGdyZXAgIl4jIyMjIFwkXCRIT1NUICIgTWFrZWZpbGUgfCBzZWQgLWUgJ3MvLip8Ly8nICR4IFxcXFxcXAorCTsgZm91bmQ9JHggZWNobyBcJFwkQlVJTEQgfCB3YyAtdyAkeCBcXFxcXFwKKwk7IGVjaG8gIk1BS0UgXCRcJEhPU1QgOiBcJFwkZm91bmQgXCQoUEFDS0FHRSktXCQoVkVSU0lPTikuKiIgXFxcXFxcCisJOyBpZiB0ZXN0ICJcJFwkZm91bmQiIC1lcSAiMCIgOyB0aGVuIDogXFxcXFxcCisJOyBCVUlMRD0keCBncmVwICJeIyMjIyAuKnwiIE1ha2VmaWxlIHx0YWlsIC0xfCBzZWQgLWUgJ3MvLip8Ly8nICR4IFxcXFxcXAorCTsgZmkgOyBmb3IgaSBpbiBcJFwkQlVJTEQgOyBkbyB0ZXN0ICIuXCRcJGkiID0gIi4iICYmIGNvbnRpbnVlIFxcXFxcXAorCTsgZm9yIGYgaW4gXCRcJGkvXCQoUEFDS0FHRSktXCQoVkVSU0lPTikuKiBcXFxcXFwKKwk7IGRvIHRlc3QgLWYgIlwkXCRmIiAmJiBtdiAiXCRcJGYiIFwkKFBVQikuIDsgZG9uZSA7IGJyZWFrIDsgZG9uZQorZG5sIHNwZWNpYWwgcnVsZSBhZGQtb246ICJkaXN0Y2xlYW4iIHJlbW92ZXMgYWxsIGxvY2FsIGJ1aWxkZGlycyBjb21wbGV0ZWx5CisvZGlzdGNsZWFuW11fQUxMICo6L2FcXAorCUAgSE9TVD0iXCQoSE9TVClcIiBcXFxcXFwKKwk7IHRlc3QgIi5cJFwkSE9TVCIgPSAiLiIgJiYgSE9TVD0keCBzaCAkQVVYL2NvbmZpZy5ndWVzcyAkeCBcXFxcXFwKKwk7IEJVSUxEPSR4IGdyZXAgIl4jIyMjIC4qfCIgTWFrZWZpbGUgfCBzZWQgLWUgJ3MvLip8Ly8nICR4IFxcXFxcXAorCTsgdXNlPSR4IGJhc2VuYW1lICJcJFxAIiBfQUxMICR4OyBuPSR4IGVjaG8gXCRcJEJVSUxEIHwgd2MgLXcgJHggXFxcXFxcCisJOyBlY2hvICJNQUtFIFwkXCRIT1NUIDogXCRcJG4gKiBcJFxAIChhbGwgbG9jYWwgYnVpbGRzKSIgXFxcXFxcCisJOyB0ZXN0ICIuXCRcJEJVSUxEIiA9ICIuIiAmJiBCVUlMRD0iLiIgXFxcXFxcCisJOyBmb3IgaSBpbiBcJFwkQlVJTEQgOyBkbyB0ZXN0ICIuXCRcJGkiID0gIi4iICYmIGNvbnRpbnVlIFxcXFxcXAorCTsgZWNobyAiIyBybSAtciBcJFwkaSI7IGRvbmUgOyBlY2hvICIjIChzbGVlcCAzKSIgOyBzbGVlcCAzIFxcXFxcXAorCTsgZm9yIGkgaW4gXCRcJEJVSUxEIDsgZG8gdGVzdCAiLlwkXCRpIiA9ICIuIiAmJiBjb250aW51ZSBcXFxcXFwKKwk7IGVjaG8gIlwkXCRpIiB8IGdyZXAgIl4vIiA+IC9kZXYvbnVsbCAmJiBjb250aW51ZSBcXFxcXFwKKwk7IGVjaG8gIlwkXCRpIiB8IGdyZXAgIl4uLi8iID4gL2Rldi9udWxsICYmIGNvbnRpbnVlIFxcXFxcXAorCTsgZWNobyAicm0gLXIgXCRcJGkiOyAocm0gLXIgIlwkXCRpIikgOyBkb25lIDsgcm0gTWFrZWZpbGUKK19FT0YKKyAgICAgIGNwICIkdG1wL2NvbmZ0ZW1wLnNlZCIgIiRTUkMvbWFrZWZpbGUuc2VkfiIgICAgICAgICAgICAjIyBERUJVR0dJTkcKKyAgICAgICRTRUQgLWYgJHRtcC9jb25mdGVtcC5zZWQgTWFrZWZpbGUgPiRTUkMvTWFrZWZpbGUKKyAgICAgIGlmIHRlc3QgLWYgIiRTUkMvbTRfaWZ2YWwoWyQyXSxbJDJdLFtFTkRdKSIgOyB0aGVuCisgICAgICAgIEFDX01TR19OT1RJQ0UoW2V4dGVuZCBUT1AvTWFrZWZpbGUgd2l0aCBUT1AvbTRfaWZ2YWwoWyQyXSxbJDJdLFtFTkRdKV0pCisgICAgICAgIGNhdCAkU1JDL0VORCA+PiRTUkMvTWFrZWZpbGUKKyAgICAgIGZpIDsgeHh4eD0iIyMjIyIKKyAgICAgIGVjaG8gIiR4eHh4IENPTkZJR1VSQVRJT05TIEZPUiBUT1BMRVZFTCBNQUtFRklMRTogIiA+PiRTUkMvTWFrZWZpbGUKKyAgICAgICMgc2FuaXR5IGNoZWNrCisgICAgICBpZiBncmVwICdeOyBlY2hvICJNQUtFICcgJFNSQy9NYWtlZmlsZSA+L2Rldi9udWxsIDsgdGhlbgorICAgICAgICBBQ19NU0dfTk9USUNFKFtidWdneSBzZWQgZm91bmQgLSBpdCBkZWxldGVzIHRhYiBpbiAiYSIgdGV4dCBwYXJ0c10pCisgICAgICAgICRTRUQgLWUgJy9eQCBIT1NUPS9zL14vCS8nIC1lICcvXjsgL3MvXi8JLycgJFNSQy9NYWtlZmlsZSBcCisgICAgICAgICAgPiRTUkMvTWFrZWZpbGV+CisgICAgICAgICh0ZXN0IC1zICRTUkMvTWFrZWZpbGV+ICYmIG12ICRTUkMvTWFrZWZpbGV+ICRTUkMvTWFrZWZpbGUpIDI+L2Rldi9udWxsCisgICAgICBmaQorICAgIGVsc2UKKyAgICAgIHh4eHg9IlxcI1xcI1xcI1xcIyIKKyAgICAgICMgZWNobyAiL14keHh4eCAqJGF4X2VuYWJsZV9idWlsZGRpcl9ob3N0IC9kIiA+JHRtcC9jb25mdGVtcC5zZWQKKyAgICAgIGVjaG8gInMhXiR4eHh4IFtbXnxdXSogfCAqJFNVQiAqXCQhJHh4eHggLi4uLi4uICRTVUIhIiA+JHRtcC9jb25mdGVtcC5zZWQKKyAgICAgICRTRUQgLWYgIiR0bXAvY29uZnRlbXAuc2VkIiAiJFNSQy9NYWtlZmlsZSIgPiR0bXAvbWtmaWxlLnRtcAorICAgICAgICBjcCAiJHRtcC9jb25mdGVtcC5zZWQiICIkU1JDL21ha2VmaWxlcy5zZWR+IiAgICAgICAgICMjIERFQlVHR0lORworICAgICAgICBjcCAiJHRtcC9ta2ZpbGUudG1wIiAgICIkU1JDL21ha2VmaWxlcy5vdXR+IiAgICAgICAgICMjIERFQlVHR0lORworICAgICAgaWYgY21wIC1zICIkU1JDL01ha2VmaWxlIiAiJHRtcC9ta2ZpbGUudG1wIiAyPi9kZXYvbnVsbCA7IHRoZW4KKyAgICAgICAgQUNfTVNHX05PVElDRShba2VlcGluZyBUT1AvTWFrZWZpbGUgZnJvbSBlYXJsaWVyIGNvbmZpZ3VyZV0pCisgICAgICAgIHJtICIkdG1wL21rZmlsZS50bXAiCisgICAgICBlbHNlCisgICAgICAgIEFDX01TR19OT1RJQ0UoW3JldXNpbmcgVE9QL01ha2VmaWxlIGZyb20gZWFybGllciBjb25maWd1cmVdKQorICAgICAgICBtdiAiJHRtcC9ta2ZpbGUudG1wIiAiJFNSQy9NYWtlZmlsZSIKKyAgICAgIGZpCisgICAgZmkKKyAgICBBQ19NU0dfTk9USUNFKFtidWlsZCBpbiAkU1VCIChIT1NUPSRheF9lbmFibGVfYnVpbGRkaXJfaG9zdCldKQorICAgIHh4eHg9IiMjIyMiCisgICAgZWNobyAiJHh4eHgiICIkYXhfZW5hYmxlX2J1aWxkZGlyX2hvc3QiICJ8JFNVQiIgPj4kU1JDL01ha2VmaWxlCisgIGZpCitwb3BkZWYoW0VORF0pZG5sCitBU19WQVJfUE9QREVGKFtTRURdKWRubAorQVNfVkFSX1BPUERFRihbQVVYXSlkbmwKK0FTX1ZBUl9QT1BERUYoW1NSQ10pZG5sCitBU19WQVJfUE9QREVGKFtUT1BdKWRubAorQVNfVkFSX1BPUERFRihbU1VCXSlkbmwKK10sW2RubAorYXhfZW5hYmxlX2J1aWxkZGlyX3NyY2Rpcj0iJHNyY2RpciIgICAgICAgICAgICAgICAgICAgICMgJHNyY2RpcgorYXhfZW5hYmxlX2J1aWxkZGlyX2hvc3Q9IiRIT1NUIiAgICAgICAgICAgICAgICAgICAgICAgICMgJEhPU1QgLyAkaG9zdAorYXhfZW5hYmxlX2J1aWxkZGlyX3ZlcnNpb249IiRWRVJTSU9OIiAgICAgICAgICAgICAgICAgICMgJFZFUlNJT04KK2F4X2VuYWJsZV9idWlsZGRpcl9wYWNrYWdlPSIkUEFDS0FHRSIgICAgICAgICAgICAgICAgICAjICRQQUNLQUdFCitheF9lbmFibGVfYnVpbGRkaXJfYXV4ZGlyPSIkYXhfZW5hYmxlX2J1aWxkZGlyX2F1eGRpciIgIyAkQVVYCitheF9lbmFibGVfYnVpbGRkaXJfc2VkPSIkYXhfZW5hYmxlX2J1aWxkZGlyX3NlZCIgICAgICAgIyAkU0VECitheF9lbmFibGVfYnVpbGRkaXI9IiRheF9lbmFibGVfYnVpbGRkaXIiICAgICAgICAgICAgICAgIyAkU1VCCitdKWRubAorXSkKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbTQvYXhfZ2NjX2FyY2hmbGFnLm00IGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9tNC9heF9nY2NfYXJjaGZsYWcubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZkMDUwZQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbTQvYXhfZ2NjX2FyY2hmbGFnLm00CkBAIC0wLDAgKzEsMjI1IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2djY19hcmNoZmxhZy5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX0dDQ19BUkNIRkxBRyhbUE9SVEFCTEU/XSwgW0FDVElPTi1TVUNDRVNTXSwgW0FDVElPTi1GQUlMVVJFXSkKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBUaGlzIG1hY3JvIHRyaWVzIHRvIGd1ZXNzIHRoZSAibmF0aXZlIiBhcmNoIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRhcmdldAorIyAgIGFyY2hpdGVjdHVyZSBmb3IgdXNlIHdpdGggZ2NjJ3MgLW1hcmNoPWFyY2ggb3IgLW10dW5lPWFyY2ggZmxhZ3MuIElmCisjICAgZm91bmQsIHRoZSBjYWNoZSB2YXJpYWJsZSAkYXhfY3ZfZ2NjX2FyY2hmbGFnIGlzIHNldCB0byB0aGlzIGZsYWcgYW5kCisjICAgQUNUSU9OLVNVQ0NFU1MgaXMgZXhlY3V0ZWQ7IG90aGVyd2lzZSAkYXhfY3ZfZ2NjX2FyY2hmbGFnIGlzIHNldCB0bworIyAgICJ1bmtub3duIiBhbmQgQUNUSU9OLUZBSUxVUkUgaXMgZXhlY3V0ZWQuIFRoZSBkZWZhdWx0IEFDVElPTi1TVUNDRVNTIGlzCisjICAgdG8gYWRkICRheF9jdl9nY2NfYXJjaGZsYWcgdG8gdGhlIGVuZCBvZiAkQ0ZMQUdTLgorIworIyAgIFBPUlRBQkxFPyBzaG91bGQgYmUgZWl0aGVyIFt5ZXNdIChkZWZhdWx0KSBvciBbbm9dLiBJbiB0aGUgZm9ybWVyIGNhc2UsCisjICAgdGhlIGZsYWcgaXMgc2V0IHRvIC1tdHVuZSAob3IgZXF1aXZhbGVudCkgc28gdGhhdCB0aGUgYXJjaGl0ZWN0dXJlIGlzCisjICAgb25seSB1c2VkIGZvciB0dW5pbmcsIGJ1dCB0aGUgaW5zdHJ1Y3Rpb24gc2V0IHVzZWQgaXMgc3RpbGwgcG9ydGFibGUuIEluCisjICAgdGhlIGxhdHRlciBjYXNlLCB0aGUgZmxhZyBpcyBzZXQgdG8gLW1hcmNoIChvciBlcXVpdmFsZW50KSBzbyB0aGF0CisjICAgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGluc3RydWN0aW9ucyBhcmUgZW5hYmxlZC4KKyMKKyMgICBUaGUgdXNlciBjYW4gc3BlY2lmeSAtLXdpdGgtZ2NjLWFyY2g9PGFyY2g+IGluIG9yZGVyIHRvIG92ZXJyaWRlIHRoZQorIyAgIG1hY3JvJ3MgY2hvaWNlIG9mIGFyY2hpdGVjdHVyZSwgb3IgLS13aXRob3V0LWdjYy1hcmNoIHRvIGRpc2FibGUgdGhpcy4KKyMKKyMgICBXaGVuIGNyb3NzLWNvbXBpbGluZywgb3IgaWYgJENDIGlzIG5vdCBnY2MsIHRoZW4gQUNUSU9OLUZBSUxVUkUgaXMKKyMgICBjYWxsZWQgdW5sZXNzIHRoZSB1c2VyIHNwZWNpZmllZCAtLXdpdGgtZ2NjLWFyY2ggbWFudWFsbHkuCisjCisjICAgUmVxdWlyZXMgbWFjcm9zOiBBWF9DSEVDS19DT01QSUxFX0ZMQUcsIEFYX0dDQ19YODZfQ1BVSUQKKyMKKyMgICAoVGhlIG1haW4gZW1waGFzaXMgaGVyZSBpcyBvbiByZWNlbnQgQ1BVcywgb24gdGhlIHByaW5jaXBsZSB0aGF0IGRvaW5nCisjICAgaGlnaC1wZXJmb3JtYW5jZSBjb21wdXRpbmcgb24gb2xkIGhhcmR3YXJlIGlzIHVuY29tbW9uLikKKyMKKyMgTElDRU5TRQorIworIyAgIENvcHlyaWdodCAoYykgMjAwOCBTdGV2ZW4gRy4gSm9obnNvbiA8c3RldmVuakBhbHVtLm1pdC5lZHU+CisjICAgQ29weXJpZ2h0IChjKSAyMDA4IE1hdHRlbyBGcmlnbworIyAgIENvcHlyaWdodCAoYykgMjAxMiBUc3VrYXNhIE9pCisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisjICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbAorIyAgIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgICB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorIworIyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSByZXNwZWN0aXZlIEF1dG9jb25mIE1hY3JvJ3MgY29weXJpZ2h0IG93bmVyCisjICAgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IHRoZSBjb25maWd1cmUKKyMgICBzY3JpcHRzIHRoYXQgYXJlIHRoZSBvdXRwdXQgb2YgQXV0b2NvbmYgd2hlbiBwcm9jZXNzaW5nIHRoZSBNYWNyby4gWW91CisjICAgbmVlZCBub3QgZm9sbG93IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugd2hlbiB1c2luZworIyAgIG9yIGRpc3RyaWJ1dGluZyBzdWNoIHNjcmlwdHMsIGV2ZW4gdGhvdWdoIHBvcnRpb25zIG9mIHRoZSB0ZXh0IG9mIHRoZQorIyAgIE1hY3JvIGFwcGVhciBpbiB0aGVtLiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgZG9lcyBnb3Zlcm4KKyMgICBhbGwgb3RoZXIgdXNlIG9mIHRoZSBtYXRlcmlhbCB0aGF0IGNvbnN0aXR1dGVzIHRoZSBBdXRvY29uZiBNYWNyby4KKyMKKyMgICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwgYXBwbGllcyB0byB2ZXJzaW9ucyBvZiB0aGUgQXV0b2NvbmYKKyMgICBNYWNybyByZWxlYXNlZCBieSB0aGUgQXV0b2NvbmYgQXJjaGl2ZS4gV2hlbiB5b3UgbWFrZSBhbmQgZGlzdHJpYnV0ZSBhCisjICAgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgQXV0b2NvbmYgTWFjcm8sIHlvdSBtYXkgZXh0ZW5kIHRoaXMgc3BlY2lhbAorIyAgIGV4Y2VwdGlvbiB0byB0aGUgR1BMIHRvIGFwcGx5IHRvIHlvdXIgbW9kaWZpZWQgdmVyc2lvbiBhcyB3ZWxsLgorCisjc2VyaWFsIDExCisKK0FDX0RFRlVOKFtBWF9HQ0NfQVJDSEZMQUddLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKQorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKQorCitBQ19BUkdfV0lUSChnY2MtYXJjaCwgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtZ2NjLWFyY2g9PGFyY2g+XSwgW3VzZSBhcmNoaXRlY3R1cmUgPGFyY2g+IGZvciBnY2MgLW1hcmNoLy1tdHVuZSwgaW5zdGVhZCBvZiBndWVzc2luZ10pXSwKKwlheF9nY2NfYXJjaD0kd2l0aHZhbCwgYXhfZ2NjX2FyY2g9eWVzKQorCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBnY2MgYXJjaGl0ZWN0dXJlIGZsYWddKQorQUNfTVNHX1JFU1VMVChbXSkKK0FDX0NBQ0hFX1ZBTChheF9jdl9nY2NfYXJjaGZsYWcsCitbCitheF9jdl9nY2NfYXJjaGZsYWc9InVua25vd24iCisKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisKK2lmIHRlc3QgIngkYXhfZ2NjX2FyY2giID0geHllczsgdGhlbgorYXhfZ2NjX2FyY2g9IiIKK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0gbm87IHRoZW4KK2Nhc2UgJGhvc3RfY3B1IGluCisgIGlbWzM0NTZdXTg2Knx4ODZfNjQqKSAjIHVzZSBjcHVpZCBjb2RlcworICAgICBBWF9HQ0NfWDg2X0NQVUlEKDApCisgICAgIEFYX0dDQ19YODZfQ1BVSUQoMSkKKyAgICAgY2FzZSAkYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8wIGluCisgICAgICAgKjo3NTZlNjU0NzoqOiopICMgSW50ZWwKKyAgICAgICAgICBjYXNlICRheF9jdl9nY2NfeDg2X2NwdWlkXzEgaW4KKwkgICAgKjVbWzQ4XV0/Oio6KjoqKSBheF9nY2NfYXJjaD0icGVudGl1bS1tbXggcGVudGl1bSIgOzsKKwkgICAgKjU/PzoqOio6KikgYXhfZ2NjX2FyY2g9cGVudGl1bSA7OworCSAgICAqMD82W1szNDU2XV0/Oio6KjoqKSBheF9nY2NfYXJjaD0icGVudGl1bTIgcGVudGl1bXBybyIgOzsKKwkgICAgKjA/NmE/OipbWzAxXV06KjoqKSBheF9nY2NfYXJjaD0icGVudGl1bTIgcGVudGl1bXBybyIgOzsKKwkgICAgKjA/NmE/OipbWzIzNF1dOio6KikgYXhfZ2NjX2FyY2g9InBlbnRpdW0zIHBlbnRpdW1wcm8iIDs7CisJICAgICowPzZbWzlkZV1dPzoqOio6KikgYXhfZ2NjX2FyY2g9InBlbnRpdW0tbSBwZW50aXVtMyBwZW50aXVtcHJvIiA7OworCSAgICAqMD82W1s3OGJdXT86KjoqOiopIGF4X2djY19hcmNoPSJwZW50aXVtMyBwZW50aXVtcHJvIiA7OworCSAgICAqMD82Zj86KjoqOip8KjE/NjY/Oio6KjoqKSBheF9nY2NfYXJjaD0iY29yZTIgcGVudGl1bS1tIHBlbnRpdW0zIHBlbnRpdW1wcm8iIDs7CisJICAgICoxPzZbWzdkXV0/Oio6KjoqKSBheF9nY2NfYXJjaD0icGVucnluIGNvcmUyIHBlbnRpdW0tbSBwZW50aXVtMyBwZW50aXVtcHJvIiA7OworCSAgICAqMT82W1thZWZdXT86KjoqOip8KjI/NltbNWNlZl1dPzoqOio6KikgYXhfZ2NjX2FyY2g9ImNvcmVpNyBjb3JlMiBwZW50aXVtLW0gcGVudGl1bTMgcGVudGl1bXBybyIgOzsKKwkgICAgKjE/NmM/Oio6KjoqfCpbWzIzXV0/NjY/Oio6KjoqKSBheF9nY2NfYXJjaD0iYXRvbSBjb3JlMiBwZW50aXVtLW0gcGVudGl1bTMgcGVudGl1bXBybyIgOzsKKwkgICAgKjI/NltbYWRdXT86KjoqOiopIGF4X2djY19hcmNoPSJjb3JlaTctYXZ4IGNvcmVpNyBjb3JlMiBwZW50aXVtLW0gcGVudGl1bTMgcGVudGl1bXBybyIgOzsKKwkgICAgKjA/Nj8/Oio6KjoqKSBheF9nY2NfYXJjaD1wZW50aXVtcHJvIDs7CisJICAgICo2Pz86KjoqOiopIGF4X2djY19hcmNoPSJjb3JlMiBwZW50aXVtcHJvIiA7OworCSAgICA/MDAwP2YzW1szNDddXToqOio6Knw/MDAwP2Y0WzEzNDddOio6KjoqfD8wMDA/ZjY/Oio6KjoqKQorCQljYXNlICRob3N0X2NwdSBpbgorCSAgICAgICAgICB4ODZfNjQqKSBheF9nY2NfYXJjaD0ibm9jb25hIHBlbnRpdW00IHBlbnRpdW1wcm8iIDs7CisJICAgICAgICAgICopIGF4X2djY19hcmNoPSJwcmVzY290dCBwZW50aXVtNCBwZW50aXVtcHJvIiA7OworCSAgICAgICAgZXNhYyA7OworCSAgICA/MDAwP2Y/PzoqOio6KikgYXhfZ2NjX2FyY2g9InBlbnRpdW00IHBlbnRpdW1wcm8iOzsKKyAgICAgICAgICBlc2FjIDs7CisgICAgICAgKjo2ODc0NzU0MToqOiopICMgQU1ECisgICAgICAgICAgY2FzZSAkYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8xIGluCisJICAgICo1W1s2N11dPzoqOio6KikgYXhfZ2NjX2FyY2g9azYgOzsKKwkgICAgKjVbWzhkXV0/Oio6KjoqKSBheF9nY2NfYXJjaD0iazYtMiBrNiIgOzsKKwkgICAgKjVbWzldXT86KjoqOiopIGF4X2djY19hcmNoPSJrNi0zIGs2IiA7OworCSAgICAqNjA/Oio6KjoqKSBheF9nY2NfYXJjaD1rNyA7OworCSAgICAqNltbMTJdXT86KjoqOiopIGF4X2djY19hcmNoPSJhdGhsb24gazciIDs7CisJICAgICo2W1szNF1dPzoqOio6KikgYXhfZ2NjX2FyY2g9ImF0aGxvbi10YmlyZCBrNyIgOzsKKwkgICAgKjY3PzoqOio6KikgYXhfZ2NjX2FyY2g9ImF0aGxvbi00IGF0aGxvbiBrNyIgOzsKKwkgICAgKjZbWzY4YV1dPzoqOio6KikKKwkgICAgICAgQVhfR0NDX1g4Nl9DUFVJRCgweDgwMDAwMDA2KSAjIEwyIGNhY2hlIHNpemUKKwkgICAgICAgY2FzZSAkYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8weDgwMDAwMDA2IGluCisgICAgICAgICAgICAgICAgICo6KjoqW1sxLTlhLWZdXT8/Pz8/PzoqKSAjIChMMiA9IGVjeCA+PiAxNikgPj0gMjU2CisJCQlheF9nY2NfYXJjaD0iYXRobG9uLXhwIGF0aGxvbi00IGF0aGxvbiBrNyIgOzsKKyAgICAgICAgICAgICAgICAgKikgYXhfZ2NjX2FyY2g9ImF0aGxvbi00IGF0aGxvbiBrNyIgOzsKKwkgICAgICAgZXNhYyA7OworCSAgICA/MDA/P2ZbWzRjZWY4Yl1dPzoqOio6KikgYXhfZ2NjX2FyY2g9ImF0aGxvbjY0IGs4IiA7OworCSAgICA/MDA/P2Y1PzoqOio6KikgYXhfZ2NjX2FyY2g9Im9wdGVyb24gazgiIDs7CisJICAgID8wMD8/Zjc/Oio6KjoqKSBheF9nY2NfYXJjaD0iYXRobG9uLWZ4IG9wdGVyb24gazgiIDs7CisJICAgID8wMD8/Zj8/Oio6KjoqKSBheF9nY2NfYXJjaD0iazgiIDs7CisJICAgID8wNT8/Zj8/Oio6KjoqKSBheF9nY2NfYXJjaD0iYnR2ZXIxIGFtZGZhbTEwIGs4IiA7OworCSAgICA/MDY/P2Y/PzoqOio6KikgYXhfZ2NjX2FyY2g9ImJkdmVyMSBhbWRmYW0xMCBrOCIgOzsKKwkgICAgKmY/PzoqOio6KikgYXhfZ2NjX2FyY2g9ImFtZGZhbTEwIGs4IiA7OworICAgICAgICAgIGVzYWMgOzsKKwkqOjc0NmU2NTQzOio6KikgIyBJRFQKKwkgICBjYXNlICRheF9jdl9nY2NfeDg2X2NwdWlkXzEgaW4KKwkgICAgICo1ND86KjoqOiopIGF4X2djY19hcmNoPXdpbmNoaXAtYzYgOzsKKwkgICAgICo1OD86KjoqOiopIGF4X2djY19hcmNoPXdpbmNoaXAyIDs7CisJICAgICAqNltbNzhdXT86KjoqOiopIGF4X2djY19hcmNoPWMzIDs7CisJICAgICAqNjk/Oio6KjoqKSBheF9nY2NfYXJjaD0iYzMtMiBjMyIgOzsKKwkgICBlc2FjIDs7CisgICAgIGVzYWMKKyAgICAgaWYgdGVzdCB4IiRheF9nY2NfYXJjaCIgPSB4OyB0aGVuICMgZmFsbGJhY2sKKwljYXNlICRob3N0X2NwdSBpbgorCSAgaTU4NiopIGF4X2djY19hcmNoPXBlbnRpdW0gOzsKKwkgIGk2ODYqKSBheF9nY2NfYXJjaD1wZW50aXVtcHJvIDs7CisgICAgICAgIGVzYWMKKyAgICAgZmkKKyAgICAgOzsKKworICBzcGFyYyopCisgICAgIEFDX1BBVEhfUFJPRyhbUFJURElBR10sIFtwcnRkaWFnXSwgW3BydGRpYWddLCBbJFBBVEg6L3Vzci9wbGF0Zm9ybS9gdW5hbWUgLWlgL3NiaW4vOi91c3IvcGxhdGZvcm0vYHVuYW1lIC1tYC9zYmluL10pCisgICAgIGNwdXR5cGU9YCgoKGdyZXAgY3B1IC9wcm9jL2NwdWluZm8gfCBjdXQgLWQ6IC1mMikgOyAoJFBSVERJQUcgLXYgfGdyZXAgLWkgc3BhcmMpIDsgZ3JlcCAtaSBjcHUgL3Zhci9ydW4vZG1lc2cuYm9vdCApIHwgaGVhZCAtbiAxKSAyPiAvZGV2L251bGxgCisgICAgIGNwdXR5cGU9YGVjaG8gIiRjcHV0eXBlIiB8IHRyIC1kICcgLScgfHRyICRhc19jcl9MRVRURVJTICRhc19jcl9sZXR0ZXJzYAorICAgICBjYXNlICRjcHV0eXBlIGluCisgICAgICAgICAqdWx0cmFzcGFyY2l2KikgYXhfZ2NjX2FyY2g9InVsdHJhc3BhcmM0IHVsdHJhc3BhcmMzIHVsdHJhc3BhcmMgdjkiIDs7CisgICAgICAgICAqdWx0cmFzcGFyY2lpaSopIGF4X2djY19hcmNoPSJ1bHRyYXNwYXJjMyB1bHRyYXNwYXJjIHY5IiA7OworICAgICAgICAgKnVsdHJhc3BhcmMqKSBheF9nY2NfYXJjaD0idWx0cmFzcGFyYyB2OSIgOzsKKyAgICAgICAgICpzdXBlcnNwYXJjKnwqdG1zMzkwejVbWzA1XV0qKSBheF9nY2NfYXJjaD0ic3VwZXJzcGFyYyB2OCIgOzsKKyAgICAgICAgICpoeXBlcnNwYXJjKnwqcnQ2MltbMDU2XV0qKSBheF9nY2NfYXJjaD0iaHlwZXJzcGFyYyB2OCIgOzsKKyAgICAgICAgICpjeXByZXNzKikgYXhfZ2NjX2FyY2g9Y3lwcmVzcyA7OworICAgICBlc2FjIDs7CisKKyAgYWxwaGFldjUpIGF4X2djY19hcmNoPWV2NSA7OworICBhbHBoYWV2NTYpIGF4X2djY19hcmNoPWV2NTYgOzsKKyAgYWxwaGFwY2E1NikgYXhfZ2NjX2FyY2g9InBjYTU2IGV2NTYiIDs7CisgIGFscGhhcGNhNTcpIGF4X2djY19hcmNoPSJwY2E1NyBwY2E1NiBldjU2IiA7OworICBhbHBoYWV2NikgYXhfZ2NjX2FyY2g9ZXY2IDs7CisgIGFscGhhZXY2NykgYXhfZ2NjX2FyY2g9ZXY2NyA7OworICBhbHBoYWV2NjgpIGF4X2djY19hcmNoPSJldjY4IGV2NjciIDs7CisgIGFscGhhZXY2OSkgYXhfZ2NjX2FyY2g9ImV2NjkgZXY2OCBldjY3IiA7OworICBhbHBoYWV2NykgYXhfZ2NjX2FyY2g9ImV2NyBldjY5IGV2NjggZXY2NyIgOzsKKyAgYWxwaGFldjc5KSBheF9nY2NfYXJjaD0iZXY3OSBldjcgZXY2OSBldjY4IGV2NjciIDs7CisKKyAgcG93ZXJwYyopCisgICAgIGNwdXR5cGU9YCgoZ3JlcCBjcHUgL3Byb2MvY3B1aW5mbyB8IGhlYWQgLW4gMSB8IGN1dCAtZDogLWYyIHwgY3V0IC1kLCAtZjEgfCBzZWQgJ3MvIC8vZycpIDsgL3Vzci9iaW4vbWFjaGluZSA7IC9iaW4vbWFjaGluZTsgZ3JlcCBDUFUgL3Zhci9ydW4vZG1lc2cuYm9vdCB8IGhlYWQgLW4gMSB8IGN1dCAtZCIgIiAtZjIpIDI+IC9kZXYvbnVsbGAKKyAgICAgY3B1dHlwZT1gZWNobyAkY3B1dHlwZSB8IHNlZCAtZSAncy9wcGMvL2c7cy8gKi8vZydgCisgICAgIGNhc2UgJGNwdXR5cGUgaW4KKyAgICAgICAqNzUwKikgYXhfZ2NjX2FyY2g9Ijc1MCBHMyIgOzsKKyAgICAgICAqNzQwW1swLTldXSopIGF4X2djY19hcmNoPSIkY3B1dHlwZSA3NDAwIEc0IiA7OworICAgICAgICo3NFtbNC01XV1bWzAtOV1dKikgYXhfZ2NjX2FyY2g9IiRjcHV0eXBlIDc0NTAgRzQiIDs7CisgICAgICAgKjc0W1swLTldXVtbMC05XV0qKSBheF9nY2NfYXJjaD0iJGNwdXR5cGUgRzQiIDs7CisgICAgICAgKjk3MCopIGF4X2djY19hcmNoPSI5NzAgRzUgcG93ZXI0Ijs7CisgICAgICAgKlBPV0VSNCp8KnBvd2VyNCp8KmdxKikgYXhfZ2NjX2FyY2g9InBvd2VyNCA5NzAiOzsKKyAgICAgICAqUE9XRVI1KnwqcG93ZXI1KnwqZ3IqfCpncyopIGF4X2djY19hcmNoPSJwb3dlcjUgcG93ZXI0IDk3MCI7OworICAgICAgIDYwM2V2fDgyNDApIGF4X2djY19hcmNoPSIkY3B1dHlwZSA2MDNlIDYwMyI7OworICAgICAgICopIGF4X2djY19hcmNoPSRjcHV0eXBlIDs7CisgICAgIGVzYWMKKyAgICAgYXhfZ2NjX2FyY2g9IiRheF9nY2NfYXJjaCBwb3dlcnBjIgorICAgICA7OworZXNhYworZmkgIyBub3QgY3Jvc3MtY29tcGlsaW5nCitmaSAjIGd1ZXNzIGFyY2gKKworaWYgdGVzdCAieCRheF9nY2NfYXJjaCIgIT0geCAtYSAieCRheF9nY2NfYXJjaCIgIT0geG5vOyB0aGVuCitmb3IgYXJjaCBpbiAkYXhfZ2NjX2FyY2g7IGRvCisgIGlmIHRlc3QgInhbXW00X2RlZmF1bHQoWyQxXSx5ZXMpIiA9IHh5ZXM7IHRoZW4gIyBpZiB3ZSByZXF1aXJlIHBvcnRhYmxlIGNvZGUKKyAgICBmbGFncz0iLW10dW5lPSRhcmNoIgorICAgICMgLW1jcHU9JGFyY2ggYW5kIG0kYXJjaCBnZW5lcmF0ZSBub25wb3J0YWJsZSBjb2RlIG9uIGV2ZXJ5IGFyY2ggZXhjZXB0CisgICAgIyB4ODYuICBBbmQgc29tZSBvdGhlciBhcmNoZXMgKGUuZy4gQWxwaGEpIGRvbid0IGFjY2VwdCAtbXR1bmUuICBHcnJyLgorICAgIGNhc2UgJGhvc3RfY3B1IGluIGkqODZ8eDg2XzY0KikgZmxhZ3M9IiRmbGFncyAtbWNwdT0kYXJjaCAtbSRhcmNoIjs7IGVzYWMKKyAgZWxzZQorICAgIGZsYWdzPSItbWFyY2g9JGFyY2ggLW1jcHU9JGFyY2ggLW0kYXJjaCIKKyAgZmkKKyAgZm9yIGZsYWcgaW4gJGZsYWdzOyBkbworICAgIEFYX0NIRUNLX0NPTVBJTEVfRkxBRygkZmxhZywgW2F4X2N2X2djY19hcmNoZmxhZz0kZmxhZzsgYnJlYWtdKQorICBkb25lCisgIHRlc3QgIngkYXhfY3ZfZ2NjX2FyY2hmbGFnIiA9IHh1bmtub3duIHx8IGJyZWFrCitkb25lCitmaQorCitmaSAjICRHQ0M9eWVzCitdKQorQUNfTVNHX0NIRUNLSU5HKFtmb3IgZ2NjIGFyY2hpdGVjdHVyZSBmbGFnXSkKK0FDX01TR19SRVNVTFQoJGF4X2N2X2djY19hcmNoZmxhZykKK2lmIHRlc3QgIngkYXhfY3ZfZ2NjX2FyY2hmbGFnIiA9IHh1bmtub3duOyB0aGVuCisgIG00X2RlZmF1bHQoWyQzXSw6KQorZWxzZQorICBtNF9kZWZhdWx0KFskMl0sIFtDRkxBR1M9IiRDRkxBR1MgJGF4X2N2X2djY19hcmNoZmxhZyJdKQorZmkKK10pCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL200L2F4X2djY194ODZfY3B1aWQubTQgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL200L2F4X2djY194ODZfY3B1aWQubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q0NmZlZQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbTQvYXhfZ2NjX3g4Nl9jcHVpZC5tNApAQCAtMCwwICsxLDc5IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfZ2NjX3g4Nl9jcHVpZC5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX0dDQ19YODZfQ1BVSUQoT1ApCisjCisjIERFU0NSSVBUSU9OCisjCisjICAgT24gUGVudGl1bSBhbmQgbGF0ZXIgeDg2IHByb2Nlc3NvcnMsIHdpdGggZ2NjIG9yIGEgY29tcGlsZXIgdGhhdCBoYXMgYQorIyAgIGNvbXBhdGlibGUgc3ludGF4IGZvciBpbmxpbmUgYXNzZW1ibHkgaW5zdHJ1Y3Rpb25zLCBydW4gYSBzbWFsbCBwcm9ncmFtCisjICAgdGhhdCBleGVjdXRlcyB0aGUgY3B1aWQgaW5zdHJ1Y3Rpb24gd2l0aCBpbnB1dCBPUC4gVGhpcyBjYW4gYmUgdXNlZCB0bworIyAgIGRldGVjdCB0aGUgQ1BVIHR5cGUuCisjCisjICAgT24gb3V0cHV0LCB0aGUgdmFsdWVzIG9mIHRoZSBlYXgsIGVieCwgZWN4LCBhbmQgZWR4IHJlZ2lzdGVycyBhcmUgc3RvcmVkCisjICAgYXMgaGV4YWRlY2ltYWwgc3RyaW5ncyBhcyAiZWF4OmVieDplY3g6ZWR4IiBpbiB0aGUgY2FjaGUgdmFyaWFibGUKKyMgICBheF9jdl9nY2NfeDg2X2NwdWlkX09QLgorIworIyAgIElmIHRoZSBjcHVpZCBpbnN0cnVjdGlvbiBmYWlscyAoYmVjYXVzZSB5b3UgYXJlIHJ1bm5pbmcgYQorIyAgIGNyb3NzLWNvbXBpbGVyLCBvciBiZWNhdXNlIHlvdSBhcmUgbm90IHVzaW5nIGdjYywgb3IgYmVjYXVzZSB5b3UgYXJlIG9uCisjICAgYSBwcm9jZXNzb3IgdGhhdCBkb2Vzbid0IGhhdmUgdGhpcyBpbnN0cnVjdGlvbiksIGF4X2N2X2djY194ODZfY3B1aWRfT1AKKyMgICBpcyBzZXQgdG8gdGhlIHN0cmluZyAidW5rbm93biIuCisjCisjICAgVGhpcyBtYWNybyBtYWlubHkgZXhpc3RzIHRvIGJlIHVzZWQgaW4gQVhfR0NDX0FSQ0hGTEFHLgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDA4IFN0ZXZlbiBHLiBKb2huc29uIDxzdGV2ZW5qQGFsdW0ubWl0LmVkdT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMDggTWF0dGVvIEZyaWdvCisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisjICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbAorIyAgIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgICB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorIworIyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSByZXNwZWN0aXZlIEF1dG9jb25mIE1hY3JvJ3MgY29weXJpZ2h0IG93bmVyCisjICAgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IHRoZSBjb25maWd1cmUKKyMgICBzY3JpcHRzIHRoYXQgYXJlIHRoZSBvdXRwdXQgb2YgQXV0b2NvbmYgd2hlbiBwcm9jZXNzaW5nIHRoZSBNYWNyby4gWW91CisjICAgbmVlZCBub3QgZm9sbG93IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugd2hlbiB1c2luZworIyAgIG9yIGRpc3RyaWJ1dGluZyBzdWNoIHNjcmlwdHMsIGV2ZW4gdGhvdWdoIHBvcnRpb25zIG9mIHRoZSB0ZXh0IG9mIHRoZQorIyAgIE1hY3JvIGFwcGVhciBpbiB0aGVtLiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgZG9lcyBnb3Zlcm4KKyMgICBhbGwgb3RoZXIgdXNlIG9mIHRoZSBtYXRlcmlhbCB0aGF0IGNvbnN0aXR1dGVzIHRoZSBBdXRvY29uZiBNYWNyby4KKyMKKyMgICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwgYXBwbGllcyB0byB2ZXJzaW9ucyBvZiB0aGUgQXV0b2NvbmYKKyMgICBNYWNybyByZWxlYXNlZCBieSB0aGUgQXV0b2NvbmYgQXJjaGl2ZS4gV2hlbiB5b3UgbWFrZSBhbmQgZGlzdHJpYnV0ZSBhCisjICAgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgQXV0b2NvbmYgTWFjcm8sIHlvdSBtYXkgZXh0ZW5kIHRoaXMgc3BlY2lhbAorIyAgIGV4Y2VwdGlvbiB0byB0aGUgR1BMIHRvIGFwcGx5IHRvIHlvdXIgbW9kaWZpZWQgdmVyc2lvbiBhcyB3ZWxsLgorCisjc2VyaWFsIDcKKworQUNfREVGVU4oW0FYX0dDQ19YODZfQ1BVSURdLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKQorQUNfTEFOR19QVVNIKFtDXSkKK0FDX0NBQ0hFX0NIRUNLKGZvciB4ODYgY3B1aWQgJDEgb3V0cHV0LCBheF9jdl9nY2NfeDg2X2NwdWlkXyQxLAorIFtBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oWyNpbmNsdWRlIDxzdGRpby5oPl0sIFsKKyAgICAgaW50IG9wID0gJDEsIGVheCwgZWJ4LCBlY3gsIGVkeDsKKyAgICAgRklMRSAqZjsKKyAgICAgIF9fYXNtX18oImNwdWlkIgorICAgICAgICA6ICI9YSIgKGVheCksICI9YiIgKGVieCksICI9YyIgKGVjeCksICI9ZCIgKGVkeCkKKyAgICAgICAgOiAiYSIgKG9wKSk7CisgICAgIGYgPSBmb3BlbigiY29uZnRlc3RfY3B1aWQiLCAidyIpOyBpZiAoIWYpIHJldHVybiAxOworICAgICBmcHJpbnRmKGYsICIleDoleDoleDoleFxuIiwgZWF4LCBlYngsIGVjeCwgZWR4KTsKKyAgICAgZmNsb3NlKGYpOworICAgICByZXR1cm4gMDsKK10pXSwKKyAgICAgW2F4X2N2X2djY194ODZfY3B1aWRfJDE9YGNhdCBjb25mdGVzdF9jcHVpZGA7IHJtIC1mIGNvbmZ0ZXN0X2NwdWlkXSwKKyAgICAgW2F4X2N2X2djY194ODZfY3B1aWRfJDE9dW5rbm93bjsgcm0gLWYgY29uZnRlc3RfY3B1aWRdLAorICAgICBbYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8kMT11bmtub3duXSldKQorQUNfTEFOR19QT1AoW0NdKQorXSkKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbTQvbGlidG9vbC5tNCBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbTQvbGlidG9vbC5tNAppbmRleCA2NzFjZGUxLi4zMzE4ZjI3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL200L2xpYnRvb2wubTQKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9tNC9saWJ0b29sLm00CkBAIC0xLDcgKzEsOCBAQAogIyBsaWJ0b29sLm00IC0gQ29uZmlndXJlIGxpYnRvb2wgZm9yIHRoZSBob3N0IHN5c3RlbS4gLSotQXV0b2NvbmYtKi0KICMKICMgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsCi0jICAgICAgICAgICAgICAgICAyMDA2LCAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyAgICAgICAgICAgICAgICAgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlCisjICAgICAgICAgICAgICAgICBGb3VuZGF0aW9uLCBJbmMuCiAjICAgV3JpdHRlbiBieSBHb3Jkb24gTWF0emlna2VpdCwgMTk5NgogIwogIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcwpAQCAtMTAsNyArMTEsOCBAQAogCiBtNF9kZWZpbmUoW19MVF9DT1BZSU5HXSwgW2RubAogIyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwKLSMgICAgICAgICAgICAgICAgIDIwMDYsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjICAgICAgICAgICAgICAgICAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUKKyMgICAgICAgICAgICAgICAgIEZvdW5kYXRpb24sIEluYy4KICMgICBXcml0dGVuIGJ5IEdvcmRvbiBNYXR6aWdrZWl0LCAxOTk2CiAjCiAjICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIExpYnRvb2wuCkBAIC0zNyw3ICszOSw3IEBACiAjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgogXSkKIAotIyBzZXJpYWwgNTYgTFRfSU5JVAorIyBzZXJpYWwgNTcgTFRfSU5JVAogCiAKICMgTFRfUFJFUkVRKFZFUlNJT04pCkBAIC02Niw2ICs2OCw3IEBACiAjIC0tLS0tLS0tLS0tLS0tLS0tLQogQUNfREVGVU4oW0xUX0lOSVRdLAogW0FDX1BSRVJFUShbMi41OF0pZG5sIFdlIHVzZSBBQ19JTkNMVURFU19ERUZBVUxUCitBQ19SRVFVSVJFKFtBQ19DT05GSUdfQVVYX0RJUl9ERUZBVUxUXSlkbmwKIEFDX0JFRk9SRShbJDBdLCBbTFRfTEFOR10pZG5sCiBBQ19CRUZPUkUoWyQwXSwgW0xUX09VVFBVVF0pZG5sCiBBQ19CRUZPUkUoWyQwXSwgW0xURExfSU5JVF0pZG5sCkBAIC04Miw2ICs4NSw4IEBACiBBQ19SRVFVSVJFKFtMVE9CU09MRVRFX1ZFUlNJT05dKWRubAogbTRfcmVxdWlyZShbX0xUX1BST0dfTFRNQUlOXSlkbmwKIAorX0xUX1NIRUxMX0lOSVQoW1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9XSkKKwogZG5sIFBhcnNlIE9QVElPTlMKIF9MVF9TRVRfT1BUSU9OUyhbJDBdLCBbJDFdKQogCkBAIC0xMTgsNyArMTIzLDcgQEAKICAgICAqKSBicmVhazs7CiAgIGVzYWMKIGRvbmUKLWNjX2Jhc2VuYW1lPWAkRUNITyAiWCRjY190ZW1wIiB8ICRYc2VkIC1lICdzJS4qLyUlJyAtZSAicyVeJGhvc3RfYWxpYXMtJSUiYAorY2NfYmFzZW5hbWU9YCRFQ0hPICIkY2NfdGVtcCIgfCAkU0VEICJzJS4qLyUlOyBzJV4kaG9zdF9hbGlhcy0lJSJgCiBdKQogCiAKQEAgLTEzOCw2ICsxNDMsMTEgQEAKIG00X2RlZnVuKFtfTFRfU0VUVVBdLAogW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKIEFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCitBQ19SRVFVSVJFKFtfTFRfUFJFUEFSRV9TRURfUVVPVEVfVkFSU10pZG5sCitBQ19SRVFVSVJFKFtfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSF0pZG5sCisKK19MVF9ERUNMKFtdLCBbUEFUSF9TRVBBUkFUT1JdLCBbMV0sIFtUaGUgUEFUSCBzZXBhcmF0b3IgZm9yIHRoZSBidWlsZCBzeXN0ZW1dKWRubAorZG5sCiBfTFRfREVDTChbXSwgW2hvc3RfYWxpYXNdLCBbMF0sIFtUaGUgaG9zdCBzeXN0ZW1dKWRubAogX0xUX0RFQ0woW10sIFtob3N0XSwgWzBdKWRubAogX0xUX0RFQ0woW10sIFtob3N0X29zXSwgWzBdKWRubApAQCAtMTYwLDEwICsxNzAsMTMgQEAKIGRubAogbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCiBtNF9yZXF1aXJlKFtfTFRfQ0hFQ0tfU0hFTExfRkVBVFVSRVNdKWRubAorbTRfcmVxdWlyZShbX0xUX1BBVEhfQ09OVkVSU0lPTl9GVU5DVElPTlNdKWRubAogbTRfcmVxdWlyZShbX0xUX0NNRF9SRUxPQURdKWRubAogbTRfcmVxdWlyZShbX0xUX0NIRUNLX01BR0lDX01FVEhPRF0pZG5sCittNF9yZXF1aXJlKFtfTFRfQ0hFQ0tfU0hBUkVETElCX0ZST01fTElOS0xJQl0pZG5sCiBtNF9yZXF1aXJlKFtfTFRfQ01EX09MRF9BUkNISVZFXSlkbmwKIG00X3JlcXVpcmUoW19MVF9DTURfR0xPQkFMX1NZTUJPTFNdKWRubAorbTRfcmVxdWlyZShbX0xUX1dJVEhfU1lTUk9PVF0pZG5sCiAKIF9MVF9DT05GSUdfTElCVE9PTF9JTklUKFsKICMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIKQEAgLTE3OSw3ICsxOTIsNiBAQAogX0xUX0NIRUNLX09CSkRJUgogCiBtNF9yZXF1aXJlKFtfTFRfVEFHX0NPTVBJTEVSXSlkbmwKLV9MVF9QUk9HX0VDSE9fQkFDS1NMQVNICiAKIGNhc2UgJGhvc3Rfb3MgaW4KIGFpeDMqKQpAQCAtMTkzLDIzICsyMDUsNiBAQAogICA7OwogZXNhYwogCi0jIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCi0jIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgotc2VkX3F1b3RlX3N1YnN0PSdzL1woW1siYCRcXF1dXCkvXFxcMS9nJwotCi0jIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KLWRvdWJsZV9xdW90ZV9zdWJzdD0ncy9cKFtbImBcXF1dXCkvXFxcMS9nJwotCi0jIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2hlbGwgdmFyaWFibGUgaW4gYQotIyBkb3VibGVfcXVvdGVfc3Vic3QnZWQgc3RyaW5nLgotZGVsYXlfdmFyaWFibGVfc3Vic3Q9J3MvXFxcXFxcXFxcXFwkL1xcXFxcXCQvZycKLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNpbmdsZSBxdW90ZS4KLWRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdD0ncy8nXCcnLydcJ1xcXFxcXFwnXCcnL2cnCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0byBhdm9pZCBhY2NpZGVudGFsIGdsb2JiaW5nIGluIGV2YWxlZCBleHByZXNzaW9ucwotbm9fZ2xvYl9zdWJzdD0ncy9cKi9cXFwqL2cnCi0KICMgR2xvYmFsIHZhcmlhYmxlczoKIG9maWxlPWxpYnRvb2wKIGNhbl9idWlsZF9zaGFyZWQ9eWVzCkBAIC0yNTAsNiArMjQ1LDI4IEBACiBdKSMgX0xUX1NFVFVQCiAKIAorIyBfTFRfUFJFUEFSRV9TRURfUVVPVEVfVkFSUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZWZpbmUgYSBmZXcgc2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHAgdXMgZG8gcm9idXN0IHF1b3RpbmcuCittNF9kZWZ1bihbX0xUX1BSRVBBUkVfU0VEX1FVT1RFX1ZBUlNdLAorWyMgQmFja3NsYXNoaWZ5IG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4KKyMgZG91YmxlLXF1b3RlZCBzdHJpbmdzLgorc2VkX3F1b3RlX3N1YnN0PSdzL1woW1siYCRcXF1dXCkvXFxcMS9nJworCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KK2RvdWJsZV9xdW90ZV9zdWJzdD0ncy9cKFtbImBcXF1dXCkvXFxcMS9nJworCisjIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2hlbGwgdmFyaWFibGUgaW4gYQorIyBkb3VibGVfcXVvdGVfc3Vic3QnZWQgc3RyaW5nLgorZGVsYXlfdmFyaWFibGVfc3Vic3Q9J3MvXFxcXFxcXFxcXFwkL1xcXFxcXCQvZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNpbmdsZSBxdW90ZS4KK2RlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdD0ncy8nXCcnLydcJ1xcXFxcXFwnXCcnL2cnCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0byBhdm9pZCBhY2NpZGVudGFsIGdsb2JiaW5nIGluIGV2YWxlZCBleHByZXNzaW9ucworbm9fZ2xvYl9zdWJzdD0ncy9cKi9cXFwqL2cnCitdKQorCiAjIF9MVF9QUk9HX0xUTUFJTgogIyAtLS0tLS0tLS0tLS0tLS0KICMgTm90ZSB0aGF0IHRoaXMgY29kZSBpcyBjYWxsZWQgYm90aCBmcm9tIGBjb25maWd1cmUnLCBhbmQgYGNvbmZpZy5zdGF0dXMnCkBAIC00MDgsNyArNDI1LDcgQEAKICMgZGVjbGFyYXRpb24gdGhlcmUgd2lsbCBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIGluIGBjb25maWd1cmUnLiAgVkFSTkFNRQogIyBtdXN0IGhhdmUgYSBzaW5nbGUgcXVvdGUgZGVsaW1pdGVkIHZhbHVlIGZvciB0aGlzIHRvIHdvcmsuCiBtNF9kZWZpbmUoW19MVF9DT05GSUdfU1RBVFVTX0RFQ0xBUkVdLAotWyQxPSdgJEVDSE8gIlgkXVskMSIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJ10pCitbJDE9J2AkRUNITyAiJF1bJDEiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJ10pCiAKIAogIyBfTFRfQ09ORklHX1NUQVRVU19ERUNMQVJBVElPTlMKQEAgLTQxOCw3ICs0MzUsNyBAQAogIyBlbWJlZGRlZCBzaW5nbGUgcXVvdGVzIHByb3Blcmx5LiAgSW4gY29uZmlndXJlLCB0aGlzIG1hY3JvIGV4cGFuZHMKICMgZWFjaCB2YXJpYWJsZSBkZWNsYXJlZCB3aXRoIF9MVF9ERUNMIChhbmQgX0xUX1RBR0RFQ0wpIGludG86CiAjCi0jICAgIDx2YXI+PSdgJEVDSE8gIlgkPHZhcj4iIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKKyMgICAgPHZhcj49J2AkRUNITyAiJDx2YXI+IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKIG00X2RlZnVuKFtfTFRfQ09ORklHX1NUQVRVU19ERUNMQVJBVElPTlNdLAogW200X2ZvcmVhY2goW19sdF92YXJdLCBtNF9xdW90ZShsdF9kZWNsX2FsbF92YXJuYW1lcyksCiAgICAgW200X24oW19MVF9DT05GSUdfU1RBVFVTX0RFQ0xBUkUoX2x0X3ZhcildKV0pXSkKQEAgLTUxNywxMiArNTM0LDIwIEBACiBMVENGTEFHUz0nJExUQ0ZMQUdTJwogY29tcGlsZXI9JyRjb21waWxlcl9ERUZBVUxUJwogCisjIEEgZnVuY3Rpb24gdGhhdCBpcyB1c2VkIHdoZW4gdGhlcmUgaXMgbm8gcHJpbnQgYnVpbHRpbiBvciBwcmludGYuCitmdW5jX2ZhbGxiYWNrX2VjaG8gKCkKK3sKKyAgZXZhbCAnY2F0IDw8X0xURUNIT19FT0YKK1wkW10xCitfTFRFQ0hPX0VPRicKK30KKwogIyBRdW90ZSBldmFsZWQgc3RyaW5ncy4KIGZvciB2YXIgaW4gbHRfZGVjbF9hbGxfdmFybmFtZXMoW1sgXAogXV0sIGx0X2RlY2xfcXVvdGVfdmFybmFtZXMpOyBkbwotICAgIGNhc2UgXGBldmFsIFxcXFxcJEVDSE8gIlhcXFxcXCRcJHZhciJcYCBpbgorICAgIGNhc2UgXGBldmFsIFxcXFxcJEVDSE8gXFxcXCIiXFxcXFwkXCR2YXIiXFxcXCJcYCBpbgogICAgICpbW1xcXFxcXFxgXFwiXFxcJF1dKikKLSAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFxgXFxcJEVDSE8gXFwiWFxcXCRcJHZhclxcIiB8IFxcXCRYc2VkIC1lIFxcIlxcXCRzZWRfcXVvdGVfc3Vic3RcXCJcXFxgXFxcXFxcIiIKKyAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFxgXFxcJEVDSE8gXFwiXFxcJFwkdmFyXFwiIHwgXFxcJFNFRCBcXCJcXFwkc2VkX3F1b3RlX3N1YnN0XFwiXFxcYFxcXFxcXCIiCiAgICAgICA7OwogICAgICopCiAgICAgICBldmFsICJsdF9cJHZhcj1cXFxcXFwiXFxcJFwkdmFyXFxcXFxcIiIKQEAgLTUzMyw5ICs1NTgsOSBAQAogIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgogZm9yIHZhciBpbiBsdF9kZWNsX2FsbF92YXJuYW1lcyhbWyBcCiBdXSwgbHRfZGVjbF9kcXVvdGVfdmFybmFtZXMpOyBkbwotICAgIGNhc2UgXGBldmFsIFxcXFxcJEVDSE8gIlhcXFxcXCRcJHZhciJcYCBpbgorICAgIGNhc2UgXGBldmFsIFxcXFxcJEVDSE8gXFxcXCIiXFxcXFwkXCR2YXIiXFxcXCJcYCBpbgogICAgICpbW1xcXFxcXFxgXFwiXFxcJF1dKikKLSAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFxgXFxcJEVDSE8gXFwiWFxcXCRcJHZhclxcIiB8IFxcXCRYc2VkIC1lIFxcIlxcXCRkb3VibGVfcXVvdGVfc3Vic3RcXCIgLWUgXFwiXFxcJHNlZF9xdW90ZV9zdWJzdFxcIiAtZSBcXCJcXFwkZGVsYXlfdmFyaWFibGVfc3Vic3RcXCJcXFxgXFxcXFxcIiIKKyAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFxgXFxcJEVDSE8gXFwiXFxcJFwkdmFyXFwiIHwgXFxcJFNFRCAtZSBcXCJcXFwkZG91YmxlX3F1b3RlX3N1YnN0XFwiIC1lIFxcIlxcXCRzZWRfcXVvdGVfc3Vic3RcXCIgLWUgXFwiXFxcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XFwiXFxcYFxcXFxcXCIiCiAgICAgICA7OwogICAgICopCiAgICAgICBldmFsICJsdF9cJHZhcj1cXFxcXFwiXFxcJFwkdmFyXFxcXFxcIiIKQEAgLTU0MywxNiArNTY4LDM4IEBACiAgICAgZXNhYwogZG9uZQogCi0jIEZpeC11cCBmYWxsYmFjayBlY2hvIGlmIGl0IHdhcyBtYW5nbGVkIGJ5IHRoZSBhYm92ZSBxdW90aW5nIHJ1bGVzLgotY2FzZSBcJGx0X0VDSE8gaW4KLSonXFxcWyRdMCAtLWZhbGxiYWNrLWVjaG8iJylkbmwgIgotICBsdF9FQ0hPPVxgXCRFQ0hPICJYXCRsdF9FQ0hPIiB8IFwkWHNlZCAtZSAncy9cXFxcXFxcXFxcXFxcXFxbJF0wIC0tZmFsbGJhY2stZWNobyJcWyRdL1xbJF0wIC0tZmFsbGJhY2stZWNobyIvJ1xgCi0gIDs7Ci1lc2FjCi0KIF9MVF9PVVRQVVRfTElCVE9PTF9JTklUCiBdKQogCisjIF9MVF9HRU5FUkFURURfRklMRV9JTklUKEZJTEUsIFtDT01NRU5UXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEdlbmVyYXRlIGEgY2hpbGQgc2NyaXB0IEZJTEUgd2l0aCBhbGwgaW5pdGlhbGl6YXRpb24gbmVjZXNzYXJ5IHRvCisjIHJldXNlIHRoZSBlbnZpcm9ubWVudCBsZWFybmVkIGJ5IHRoZSBwYXJlbnQgc2NyaXB0LCBhbmQgbWFrZSB0aGUKKyMgZmlsZSBleGVjdXRhYmxlLiAgSWYgQ09NTUVOVCBpcyBzdXBwbGllZCwgaXQgaXMgaW5zZXJ0ZWQgYWZ0ZXIgdGhlCisjIGAjIScgc2VxdWVuY2UgYnV0IGJlZm9yZSBpbml0aWFsaXphdGlvbiB0ZXh0IGJlZ2lucy4gIEFmdGVyIHRoaXMKKyMgbWFjcm8sIGFkZGl0aW9uYWwgdGV4dCBjYW4gYmUgYXBwZW5kZWQgdG8gRklMRSB0byBmb3JtIHRoZSBib2R5IG9mCisjIHRoZSBjaGlsZCBzY3JpcHQuICBUaGUgbWFjcm8gZW5kcyB3aXRoIG5vbi16ZXJvIHN0YXR1cyBpZiB0aGUKKyMgZmlsZSBjb3VsZCBub3QgYmUgZnVsbHkgd3JpdHRlbiAoc3VjaCBhcyBpZiB0aGUgZGlzayBpcyBmdWxsKS4KK200X2lmZGVmKFtBU19JTklUX0dFTkVSQVRFRF0sCitbbTRfZGVmdW4oW19MVF9HRU5FUkFURURfRklMRV9JTklUXSxbQVNfSU5JVF9HRU5FUkFURUQoJEApXSldLAorW200X2RlZnVuKFtfTFRfR0VORVJBVEVEX0ZJTEVfSU5JVF0sCitbbTRfcmVxdWlyZShbQVNfUFJFUEFSRV0pXWRubAorW200X3B1c2hkZWYoW0FTX01FU1NBR0VfTE9HX0ZEXSldZG5sCitbbHRfd3JpdGVfZmFpbD0wCitjYXQgPiQxIDw8X0FTRU9GIHx8IGx0X3dyaXRlX2ZhaWw9MQorIyEgJFNIRUxMCisjIEdlbmVyYXRlZCBieSAkYXNfbWUuCiskMgorU0hFTEw9XCR7Q09ORklHX1NIRUxMLSRTSEVMTH0KK2V4cG9ydCBTSEVMTAorX0FTRU9GCitjYXQgPj4kMSA8PFxfQVNFT0YgfHwgbHRfd3JpdGVfZmFpbD0xCitBU19TSEVMTF9TQU5JVElaRQorX0FTX1BSRVBBUkUKK2V4ZWMgQVNfTUVTU0FHRV9GRD4mMQorX0FTRU9GCit0ZXN0ICRsdF93cml0ZV9mYWlsID0gMCAmJiBjaG1vZCAreCAkMVtdZG5sCittNF9wb3BkZWYoW0FTX01FU1NBR0VfTE9HX0ZEXSldKV0pIyBfTFRfR0VORVJBVEVEX0ZJTEVfSU5JVAogCiAjIExUX09VVFBVVAogIyAtLS0tLS0tLS0KQEAgLTU2MiwyMCArNjA5LDExIEBACiBBQ19ERUZVTihbTFRfT1VUUFVUXSwKIFs6ICR7Q09ORklHX0xUPS4vY29uZmlnLmx0fQogQUNfTVNHX05PVElDRShbY3JlYXRpbmcgJENPTkZJR19MVF0pCi1jYXQgPiIkQ09ORklHX0xUIiA8PF9MVEVPRgotIyEgJFNIRUxMCi0jIEdlbmVyYXRlZCBieSAkYXNfbWUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgYSBsaWJ0b29sIHN0dWIgd2l0aCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotCi1sdF9jbF9zaWxlbnQ9ZmFsc2UKLVNIRUxMPVwke0NPTkZJR19TSEVMTC0kU0hFTEx9Ci1fTFRFT0YKK19MVF9HRU5FUkFURURfRklMRV9JTklUKFsiJENPTkZJR19MVCJdLAorWyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSBhIGxpYnRvb2wgc3R1YiB3aXRoIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uXSkKIAogY2F0ID4+IiRDT05GSUdfTFQiIDw8XF9MVEVPRgotQVNfU0hFTExfU0FOSVRJWkUKLV9BU19QUkVQQVJFCi0KLWV4ZWMgQVNfTUVTU0FHRV9GRD4mMQorbHRfY2xfc2lsZW50PWZhbHNlCiBleGVjIEFTX01FU1NBR0VfTE9HX0ZEPj5jb25maWcubG9nCiB7CiAgIGVjaG8KQEAgLTYwMSw3ICs2MzksNyBAQAogbTRfaWZzZXQoW0FDX1BBQ0tBR0VfVkVSU0lPTl0sIFsgQUNfUEFDS0FHRV9WRVJTSU9OXSkKIGNvbmZpZ3VyZWQgYnkgJFswXSwgZ2VuZXJhdGVkIGJ5IG00X1BBQ0tBR0VfU1RSSU5HLgogCi1Db3B5cmlnaHQgKEMpIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitDb3B5cmlnaHQgKEMpIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiBUaGlzIGNvbmZpZy5sdCBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgogZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgogCkBAIC02NDYsMTUgKzY4NCwxMyBAQAogIyBhcHBlbmRpbmcgdG8gY29uZmlnLmxvZywgd2hpY2ggZmFpbHMgb24gRE9TLCBhcyBjb25maWcubG9nIGlzIHN0aWxsIGtlcHQKICMgb3BlbiBieSBjb25maWd1cmUuICBIZXJlIHdlIGV4ZWMgdGhlIEZEIHRvIC9kZXYvbnVsbCwgZWZmZWN0aXZlbHkgY2xvc2luZwogIyBjb25maWcubG9nLCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgKHJlKW9wZW5lZCBhbmQgYXBwZW5kZWQgdG8gYnkgY29uZmlnLmx0LgotaWYgdGVzdCAiJG5vX2NyZWF0ZSIgIT0geWVzOyB0aGVuCi0gIGx0X2NsX3N1Y2Nlc3M9OgotICB0ZXN0ICIkc2lsZW50IiA9IHllcyAmJgotICAgIGx0X2NvbmZpZ19sdF9hcmdzPSIkbHRfY29uZmlnX2x0X2FyZ3MgLS1xdWlldCIKLSAgZXhlYyBBU19NRVNTQUdFX0xPR19GRD4vZGV2L251bGwKLSAgJFNIRUxMICIkQ09ORklHX0xUIiAkbHRfY29uZmlnX2x0X2FyZ3MgfHwgbHRfY2xfc3VjY2Vzcz1mYWxzZQotICBleGVjIEFTX01FU1NBR0VfTE9HX0ZEPj5jb25maWcubG9nCi0gICRsdF9jbF9zdWNjZXNzIHx8IEFTX0VYSVQoMSkKLWZpCitsdF9jbF9zdWNjZXNzPToKK3Rlc3QgIiRzaWxlbnQiID0geWVzICYmCisgIGx0X2NvbmZpZ19sdF9hcmdzPSIkbHRfY29uZmlnX2x0X2FyZ3MgLS1xdWlldCIKK2V4ZWMgQVNfTUVTU0FHRV9MT0dfRkQ+L2Rldi9udWxsCiskU0hFTEwgIiRDT05GSUdfTFQiICRsdF9jb25maWdfbHRfYXJncyB8fCBsdF9jbF9zdWNjZXNzPWZhbHNlCitleGVjIEFTX01FU1NBR0VfTE9HX0ZEPj5jb25maWcubG9nCiskbHRfY2xfc3VjY2VzcyB8fCBBU19FWElUKDEpCiBdKSMgTFRfT1VUUFVUCiAKIApAQCAtNzE3LDE1ICs3NTMsMTIgQEAKICAgIyBpZiBmaW5kcyBtaXhlZCBDUi9MRiBhbmQgTEYtb25seSBsaW5lcy4gIFNpbmNlIHNlZCBvcGVyYXRlcyBpbgogICAjIHRleHQgbW9kZSwgaXQgcHJvcGVybHkgY29udmVydHMgbGluZXMgdG8gQ1IvTEYuICBUaGlzIGJhc2ggcHJvYmxlbQogICAjIGlzIHJlcG9ydGVkbHkgZml4ZWQsIGJ1dCB3aHkgbm90IHJ1biBvbiBvbGQgdmVyc2lvbnMgdG9vPwotICBzZWQgJy9eIyBHZW5lcmF0ZWQgc2hlbGwgZnVuY3Rpb25zIGluc2VydGVkIGhlcmUvcScgIiRsdG1haW4iID4+ICIkY2ZnZmlsZSIgXAotICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiOyBleGl0IDEpCisgIHNlZCAnJHEnICIkbHRtYWluIiA+PiAiJGNmZ2ZpbGUiIFwKKyAgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSI7IGV4aXQgMSkKIAotICBfTFRfUFJPR19YU0lfU0hFTExGTlMKKyAgX0xUX1BST0dfUkVQTEFDRV9TSEVMTEZOUwogCi0gIHNlZCAtbiAnL14jIEdlbmVyYXRlZCBzaGVsbCBmdW5jdGlvbnMgaW5zZXJ0ZWQgaGVyZS8sJHAnICIkbHRtYWluIiA+PiAiJGNmZ2ZpbGUiIFwKLSAgICB8fCAocm0gLWYgIiRjZmdmaWxlIjsgZXhpdCAxKQotCi0gIG12IC1mICIkY2ZnZmlsZSIgIiRvZmlsZSIgfHwKKyAgIG12IC1mICIkY2ZnZmlsZSIgIiRvZmlsZSIgfHwKICAgICAocm0gLWYgIiRvZmlsZSIgJiYgY3AgIiRjZmdmaWxlIiAiJG9maWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUiKQogICBjaG1vZCAreCAiJG9maWxlIgogXSwKQEAgLTc3MCw2ICs4MDMsNyBAQAogbTRfY2FzZShbJDFdLAogICBbQ10sCQkJW19MVF9MQU5HKEMpXSwKICAgW0MrK10sCQlbX0xUX0xBTkcoQ1hYKV0sCisgIFtHb10sCQkJW19MVF9MQU5HKEdPKV0sCiAgIFtKYXZhXSwJCVtfTFRfTEFORyhHQ0opXSwKICAgW0ZvcnRyYW4gNzddLAkJW19MVF9MQU5HKEY3NyldLAogICBbRm9ydHJhbl0sCQlbX0xUX0xBTkcoRkMpXSwKQEAgLTc5MSw2ICs4MjUsMzEgQEAKIF0pIyBfTFRfTEFORwogCiAKK200X2lmbmRlZihbQUNfUFJPR19HT10sIFsKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOT1RFOiBUaGlzIG1hY3JvIGhhcyBiZWVuIHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGludG8gICAjCisjICBHTlUgQXV0b2NvbmYgYXMgQUNfUFJPR19HTy4gIFdoZW4gaXQgaXMgYXZhaWxhYmxlIGluICAgICMKKyMgIGEgcmVsZWFzZWQgdmVyc2lvbiBvZiBBdXRvY29uZiB3ZSBzaG91bGQgcmVtb3ZlIHRoaXMgICAgIworIyAgbWFjcm8gYW5kIHVzZSBpdCBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK200X2RlZnVuKFtBQ19QUk9HX0dPXSwKK1tBQ19MQU5HX1BVU0goR28pZG5sCitBQ19BUkdfVkFSKFtHT0NdLCAgICAgW0dvIGNvbXBpbGVyIGNvbW1hbmRdKWRubAorQUNfQVJHX1ZBUihbR09GTEFHU10sIFtHbyBjb21waWxlciBmbGFnc10pZG5sCitfQUNfQVJHX1ZBUl9MREZMQUdTKClkbmwKK0FDX0NIRUNLX1RPT0woR09DLCBnY2NnbykKK2lmIHRlc3QgLXogIiRHT0MiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgICBBQ19DSEVDS19QUk9HKEdPQywgWyR7YWNfdG9vbF9wcmVmaXh9Z2NjZ29dLCBbJHthY190b29sX3ByZWZpeH1nY2Nnb10pCisgIGZpCitmaQoraWYgdGVzdCAteiAiJEdPQyI7IHRoZW4KKyAgQUNfQ0hFQ0tfUFJPRyhHT0MsIGdjY2dvLCBnY2NnbywgZmFsc2UpCitmaQorXSkjbTRfZGVmdW4KK10pI200X2lmbmRlZgorCisKICMgX0xUX0xBTkdfREVGQVVMVF9DT05GSUcKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIG00X2RlZnVuKFtfTFRfTEFOR19ERUZBVUxUX0NPTkZJR10sCkBAIC04MjEsNiArODgwLDEwIEBACiAgICAgICAgbTRfaWZkZWYoW0xUX1BST0dfR0NKXSwKIAlbbTRfZGVmaW5lKFtMVF9QUk9HX0dDSl0sIGRlZm4oW0xUX1BST0dfR0NKXSlbTFRfTEFORyhHQ0opXSldKV0pXSldKQogCitBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19HT10sCisgIFtMVF9MQU5HKEdPKV0sCisgIFttNF9kZWZpbmUoW0FDX1BST0dfR09dLCBkZWZuKFtBQ19QUk9HX0dPXSlbTFRfTEFORyhHTyldKV0pCisKIEFDX1BST1ZJREVfSUZFTFNFKFtMVF9QUk9HX1JDXSwKICAgW0xUX0xBTkcoUkMpXSwKICAgW200X2RlZmluZShbTFRfUFJPR19SQ10sIGRlZm4oW0xUX1BST0dfUkNdKVtMVF9MQU5HKFJDKV0pXSkKQEAgLTgzMSwxMSArODk0LDEzIEBACiBBVV9ERUZVTihbQUNfTElCVE9PTF9GNzddLCBbTFRfTEFORyhGb3J0cmFuIDc3KV0pCiBBVV9ERUZVTihbQUNfTElCVE9PTF9GQ10sIFtMVF9MQU5HKEZvcnRyYW4pXSkKIEFVX0RFRlVOKFtBQ19MSUJUT09MX0dDSl0sIFtMVF9MQU5HKEphdmEpXSkKK0FVX0RFRlVOKFtBQ19MSUJUT09MX1JDXSwgW0xUX0xBTkcoV2luZG93cyBSZXNvdXJjZSldKQogZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgogZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0NYWF0sIFtdKQogZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0Y3N10sIFtdKQogZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0ZDXSwgW10pCiBkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfR0NKXSwgW10pCitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfUkNdLCBbXSkKIAogCiAjIF9MVF9UQUdfQ09NUElMRVIKQEAgLTkyMSw3ICs5ODYsMTMgQEAKIAkkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gbGliY29uZnRlc3QuZHlsaWIgXAogCSAgLWR5bmFtaWNsaWIgLVdsLC1zaW5nbGVfbW9kdWxlIGNvbmZ0ZXN0LmMgMj5jb25mdGVzdC5lcnIKICAgICAgICAgX2x0X3Jlc3VsdD0kPwotCWlmIHRlc3QgLWYgbGliY29uZnRlc3QuZHlsaWIgJiYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyciAmJiB0ZXN0ICRfbHRfcmVzdWx0ID0gMDsgdGhlbgorCSMgSWYgdGhlcmUgaXMgYSBub24tZW1wdHkgZXJyb3IgbG9nLCBhbmQgInNpbmdsZV9tb2R1bGUiCisJIyBhcHBlYXJzIGluIGl0LCBhc3N1bWUgdGhlIGZsYWcgY2F1c2VkIGEgbGlua2VyIHdhcm5pbmcKKyAgICAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnIgJiYgJEdSRVAgc2luZ2xlX21vZHVsZSBjb25mdGVzdC5lcnI7IHRoZW4KKwkgIGNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorCSMgT3RoZXJ3aXNlLCBpZiB0aGUgb3V0cHV0IHdhcyBjcmVhdGVkIHdpdGggYSAwIGV4aXQgY29kZSBmcm9tCisJIyB0aGUgY29tcGlsZXIsIGl0IHdvcmtlZC4KKwllbGlmIHRlc3QgLWYgbGliY29uZnRlc3QuZHlsaWIgJiYgdGVzdCAkX2x0X3Jlc3VsdCAtZXEgMDsgdGhlbgogCSAgbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZD15ZXMKIAllbHNlCiAJICBjYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKQEAgLTkyOSw2ICsxMDAwLDcgQEAKIAlybSAtcmYgbGliY29uZnRlc3QuZHlsaWIqCiAJcm0gLWYgY29uZnRlc3QuKgogICAgICAgZmldKQorCiAgICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGxpbmtlciBmbGFnXSwKICAgICAgIFtsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3RdLAogICAgICAgW2x0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdD1ubwpAQCAtOTQwLDYgKzEwMTIsMzQgQEAKIAlbbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0PW5vXSkKIAlMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgogICAgIF0pCisKKyAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIC1mb3JjZV9sb2FkIGxpbmtlciBmbGFnXSxbbHRfY3ZfbGRfZm9yY2VfbG9hZF0sCisgICAgICBbbHRfY3ZfbGRfZm9yY2VfbG9hZD1ubworICAgICAgY2F0ID4gY29uZnRlc3QuYyA8PCBfTFRfRU9GCitpbnQgZm9yY2VkX2xvYWRlZCgpIHsgcmV0dXJuIDI7fQorX0xUX0VPRgorICAgICAgZWNobyAiJExUQ0MgJExUQ0ZMQUdTIC1jIC1vIGNvbmZ0ZXN0Lm8gY29uZnRlc3QuYyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgJExUQ0MgJExUQ0ZMQUdTIC1jIC1vIGNvbmZ0ZXN0Lm8gY29uZnRlc3QuYyAyPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgZWNobyAiJEFSIGNydSBsaWJjb25mdGVzdC5hIGNvbmZ0ZXN0Lm8iID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgICRBUiBjcnUgbGliY29uZnRlc3QuYSBjb25mdGVzdC5vIDI+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICBlY2hvICIkUkFOTElCIGxpYmNvbmZ0ZXN0LmEiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgICRSQU5MSUIgbGliY29uZnRlc3QuYSAyPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgY2F0ID4gY29uZnRlc3QuYyA8PCBfTFRfRU9GCitpbnQgbWFpbigpIHsgcmV0dXJuIDA7fQorX0xUX0VPRgorICAgICAgZWNobyAiJExUQ0MgJExUQ0ZMQUdTICRMREZMQUdTIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgLVdsLC1mb3JjZV9sb2FkLC4vbGliY29uZnRlc3QuYSIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgJExUQ0MgJExUQ0ZMQUdTICRMREZMQUdTIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgLVdsLC1mb3JjZV9sb2FkLC4vbGliY29uZnRlc3QuYSAyPmNvbmZ0ZXN0LmVycgorICAgICAgX2x0X3Jlc3VsdD0kPworICAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnIgJiYgJEdSRVAgZm9yY2VfbG9hZCBjb25mdGVzdC5lcnI7IHRoZW4KKwljYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgIGVsaWYgdGVzdCAtZiBjb25mdGVzdCAmJiB0ZXN0ICRfbHRfcmVzdWx0IC1lcSAwICYmICRHUkVQIGZvcmNlZF9sb2FkIGNvbmZ0ZXN0ID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwlsdF9jdl9sZF9mb3JjZV9sb2FkPXllcworICAgICAgZWxzZQorCWNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgZmkKKyAgICAgICAgcm0gLWYgY29uZnRlc3QuZXJyIGxpYmNvbmZ0ZXN0LmEgY29uZnRlc3QgY29uZnRlc3QuYworICAgICAgICBybSAtcmYgY29uZnRlc3QuZFNZTQorICAgIF0pCiAgICAgY2FzZSAkaG9zdF9vcyBpbgogICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuW1swMTJdXSkKICAgICAgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycgOzsKQEAgLTk2Nyw3ICsxMDY3LDcgQEAKICAgICBlbHNlCiAgICAgICBfbHRfZGFyX2V4cG9ydF9zeW1zPSd+JE5NRURJVCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKICAgICBmaQotICAgIGlmIHRlc3QgIiREU1lNVVRJTCIgIT0gIjoiOyB0aGVuCisgICAgaWYgdGVzdCAiJERTWU1VVElMIiAhPSAiOiIgJiYgdGVzdCAiJGx0X2N2X2xkX2ZvcmNlX2xvYWQiID0gIm5vIjsgdGhlbgogICAgICAgX2x0X2RzeW11dGlsPSd+JERTWU1VVElMICRsaWIgfHwgOicKICAgICBlbHNlCiAgICAgICBfbHRfZHN5bXV0aWw9CkBAIC05NzcsOCArMTA3Nyw4IEBACiBdKQogCiAKLSMgX0xUX0RBUldJTl9MSU5LRVJfRkVBVFVSRVMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX0xUX0RBUldJTl9MSU5LRVJfRkVBVFVSRVMoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBDaGVja3MgZm9yIGxpbmtlciBhbmQgY29tcGlsZXIgZmVhdHVyZXMgb24gZGFyd2luCiBtNF9kZWZ1bihbX0xUX0RBUldJTl9MSU5LRVJfRkVBVFVSRVNdLAogWwpAQCAtOTg3LDcgKzEwODcsMTMgQEAKICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubwogICBfTFRfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPXllcwogICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT11bnN1cHBvcnRlZAotICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JycKKyAgaWYgdGVzdCAiJGx0X2N2X2xkX2ZvcmNlX2xvYWQiID0gInllcyI7IHRoZW4KKyAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9J2Bmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSAke3dsfS1mb3JjZV9sb2FkLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgJworICAgIG00X2Nhc2UoWyQxXSwgW0Y3N10sIFtfTFRfVEFHVkFSKGNvbXBpbGVyX25lZWRzX29iamVjdCwgJDEpPXllc10sCisgICAgICAgICAgICAgICAgICBbRkNdLCAgW19MVF9UQUdWQVIoY29tcGlsZXJfbmVlZHNfb2JqZWN0LCAkMSk9eWVzXSkKKyAgZWxzZQorICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJworICBmaQogICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSIkX2x0X2Rhcl9hbGxvd191bmRlZmluZWQiCiAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCkBAIC05OTUsNyArMTEwMSw3IEBACiAgICAgICopIF9sdF9kYXJfY2FuX3NoYXJlZD0kR0NDIDs7CiAgIGVzYWMKICAgaWYgdGVzdCAiJF9sdF9kYXJfY2FuX3NoYXJlZCIgPSAieWVzIjsgdGhlbgotICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPWVjaG8KKyAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD1mdW5jX2VjaG9fYWxsCiAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0iXCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lIFwkcnBhdGgvXCRzb25hbWUgXCR2ZXJzdHJpbmcgJF9sdF9kYXJfc2luZ2xlX21vZCR7X2x0X2RzeW11dGlsfSIKICAgICBfTFRfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9IlwkQ0MgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiAtYnVuZGxlIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyR7X2x0X2RzeW11dGlsfSIKICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0ic2VkICdzLF4sXywnIDwgXCRleHBvcnRfc3ltYm9scyA+IFwkb3V0cHV0X29iamRpci9cJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX5cJENDIC1keW5hbWljbGliIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgXCRycGF0aC9cJHNvbmFtZSBcJHZlcnN0cmluZyAke19sdF9kYXJfc2luZ2xlX21vZH0ke19sdF9kYXJfZXhwb3J0X3N5bXN9JHtfbHRfZHN5bXV0aWx9IgpAQCAtMTAxMSwyMDMgKzExMTcsMTQyIEBACiAgIGZpCiBdKQogCi0jIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBMaW5rcyBhIG1pbmltYWwgcHJvZ3JhbSBhbmQgY2hlY2tzIHRoZSBleGVjdXRhYmxlCiAjIGZvciB0aGUgc3lzdGVtIGRlZmF1bHQgaGFyZGNvZGVkIGxpYnJhcnkgcGF0aC4gSW4gbW9zdCBjYXNlcywKICMgdGhpcyBpcyAvdXNyL2xpYjovbGliLCBidXQgd2hlbiB0aGUgTVBJIGNvbXBpbGVycyBhcmUgdXNlZAogIyB0aGUgbG9jYXRpb24gb2YgdGhlIGNvbW11bmljYXRpb24gYW5kIE1QSSBsaWJzIGFyZSBpbmNsdWRlZCB0b28uCiAjIElmIHdlIGRvbid0IGZpbmQgYW55dGhpbmcsIHVzZSB0aGUgZGVmYXVsdCBsaWJyYXJ5IHBhdGggYWNjb3JkaW5nCiAjIHRvIHRoZSBhaXggbGQgbWFudWFsLgorIyBTdG9yZSB0aGUgcmVzdWx0cyBmcm9tIHRoZSBkaWZmZXJlbnQgY29tcGlsZXJzIGZvciBlYWNoIFRBR05BTUUuCisjIEFsbG93IHRvIG92ZXJyaWRlIHRoZW0gZm9yIGFsbCB0YWdzIHRocm91Z2ggbHRfY3ZfYWl4X2xpYnBhdGguCiBtNF9kZWZ1bihbX0xUX1NZU19NT0RVTEVfUEFUSF9BSVhdLAogW200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCi1BQ19MSU5LX0lGRUxTRShBQ19MQU5HX1BST0dSQU0sWwotbHRfYWl4X2xpYnBhdGhfc2VkPScKLSAgICAvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7Ci0JL14wLyB7Ci0JICAgIHMvXjAgICpcKC4qXCkkL1wxLwotCSAgICBwCi0JfQotICAgIH0nCi1haXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICIkbHRfYWl4X2xpYnBhdGhfc2VkImAKLSMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KLWlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4KLSAgYWl4X2xpYnBhdGg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCi1maV0sW10pCi1pZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKK2lmIHRlc3QgIiR7bHRfY3ZfYWl4X2xpYnBhdGgrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgYWl4X2xpYnBhdGg9JGx0X2N2X2FpeF9saWJwYXRoCitlbHNlCisgIEFDX0NBQ0hFX1ZBTChbX0xUX1RBR1ZBUihbbHRfY3ZfYWl4X2xpYnBhdGhfXSwgWyQxXSldLAorICBbQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTV0sWworICBsdF9haXhfbGlicGF0aF9zZWQ9J1sKKyAgICAgIC9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsKKwkgIC9eMC8geworCSAgICAgIHMvXjAgICpcKFteIF0qXCkgKiQvXDEvCisJICAgICAgcAorCSAgfQorICAgICAgfV0nCisgIF9MVF9UQUdWQVIoW2x0X2N2X2FpeF9saWJwYXRoX10sIFskMV0pPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorICAjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCisgIGlmIHRlc3QgLXogIiRfTFRfVEFHVkFSKFtsdF9jdl9haXhfbGlicGF0aF9dLCBbJDFdKSI7IHRoZW4KKyAgICBfTFRfVEFHVkFSKFtsdF9jdl9haXhfbGlicGF0aF9dLCBbJDFdKT1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICIkbHRfYWl4X2xpYnBhdGhfc2VkImAKKyAgZmldLFtdKQorICBpZiB0ZXN0IC16ICIkX0xUX1RBR1ZBUihbbHRfY3ZfYWl4X2xpYnBhdGhfXSwgWyQxXSkiOyB0aGVuCisgICAgX0xUX1RBR1ZBUihbbHRfY3ZfYWl4X2xpYnBhdGhfXSwgWyQxXSk9Ii91c3IvbGliOi9saWIiCisgIGZpCisgIF0pCisgIGFpeF9saWJwYXRoPSRfTFRfVEFHVkFSKFtsdF9jdl9haXhfbGlicGF0aF9dLCBbJDFdKQorZmkKIF0pIyBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWAogCiAKICMgX0xUX1NIRUxMX0lOSVQoQVJHKQogIyAtLS0tLS0tLS0tLS0tLS0tLS0tCiBtNF9kZWZpbmUoW19MVF9TSEVMTF9JTklUXSwKLVtpZmRlZihbQUNfRElWRVJTSU9OX05PVElDRV0sCi0JICAgICBbQUNfRElWRVJUX1BVU0goQUNfRElWRVJTSU9OX05PVElDRSldLAotCSBbQUNfRElWRVJUX1BVU0goTk9USUNFKV0pCi0kMQotQUNfRElWRVJUX1BPUAotXSkjIF9MVF9TSEVMTF9JTklUCitbbTRfZGl2ZXJ0X3RleHQoW000U0gtSU5JVF0sIFskMQorXSldKSMgX0xUX1NIRUxMX0lOSVQKKwogCiAKICMgX0xUX1BST0dfRUNIT19CQUNLU0xBU0gKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQWRkIHNvbWUgY29kZSB0byB0aGUgc3RhcnQgb2YgdGhlIGdlbmVyYXRlZCBjb25maWd1cmUgc2NyaXB0IHdoaWNoCi0jIHdpbGwgZmluZCBhbiBlY2hvIGNvbW1hbmQgd2hpY2ggZG9lc24ndCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCisjIEZpbmQgaG93IHdlIGNhbiBmYWtlIGFuIGVjaG8gY29tbWFuZCB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2guCisjIEluIHBhcnRpY3VsYXIsIHdpdGggQXV0b2NvbmYgMi42MCBvciBsYXRlciB3ZSBhZGQgc29tZSBjb2RlIHRvIHRoZSBzdGFydAorIyBvZiB0aGUgZ2VuZXJhdGVkIGNvbmZpZ3VyZSBzY3JpcHQgd2hpY2ggd2lsbCBmaW5kIGEgc2hlbGwgd2l0aCBhIGJ1aWx0aW4KKyMgcHJpbnRmICh3aGljaCB3ZSBjYW4gdXNlIGFzIGFuIGVjaG8gY29tbWFuZCkuCiBtNF9kZWZ1bihbX0xUX1BST0dfRUNIT19CQUNLU0xBU0hdLAotW19MVF9TSEVMTF9JTklUKFsKLSMgQ2hlY2sgdGhhdCB3ZSBhcmUgcnVubmluZyB1bmRlciB0aGUgY29ycmVjdCBzaGVsbC4KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CitbRUNITz0nXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCcKK0VDSE89JEVDSE8kRUNITyRFQ0hPJEVDSE8kRUNITworRUNITz0kRUNITyRFQ0hPJEVDSE8kRUNITyRFQ0hPJEVDSE8KIAotY2FzZSBYJGx0X0VDSE8gaW4KLVgqLS1mYWxsYmFjay1lY2hvKQotICAjIFJlbW92ZSBvbmUgbGV2ZWwgb2YgcXVvdGF0aW9uICh3aGljaCB3YXMgcmVxdWlyZWQgZm9yIE1ha2UpLgotICBFQ0hPPWBlY2hvICIkbHRfRUNITyIgfCBzZWQgJ3MsXFxcXFxbJF1cXFskXTAsJ1skXTAnLCdgCi0gIDs7CitBQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBwcmludCBzdHJpbmdzXSkKKyMgVGVzdCBwcmludCBmaXJzdCwgYmVjYXVzZSBpdCB3aWxsIGJlIGEgYnVpbHRpbiBpZiBwcmVzZW50LgoraWYgdGVzdCAiWGAoIHByaW50IC1yIC0tIC1uICkgMj4vZGV2L251bGxgIiA9IFgtbiAmJiBcCisgICB0ZXN0ICJYYHByaW50IC1yIC0tICRFQ0hPIDI+L2Rldi9udWxsYCIgPSAiWCRFQ0hPIjsgdGhlbgorICBFQ0hPPSdwcmludCAtciAtLScKK2VsaWYgdGVzdCAiWGBwcmludGYgJXMgJEVDSE8gMj4vZGV2L251bGxgIiA9ICJYJEVDSE8iOyB0aGVuCisgIEVDSE89J3ByaW50ZiAlc1xuJworZWxzZQorICAjIFVzZSB0aGlzIGZ1bmN0aW9uIGFzIGEgZmFsbGJhY2sgdGhhdCBhbHdheXMgd29ya3MuCisgIGZ1bmNfZmFsbGJhY2tfZWNobyAoKQorICB7CisgICAgZXZhbCAnY2F0IDw8X0xURUNIT19FT0YKKyRbXTEKK19MVEVDSE9fRU9GJworICB9CisgIEVDSE89J2Z1bmNfZmFsbGJhY2tfZWNobycKK2ZpCisKKyMgZnVuY19lY2hvX2FsbCBhcmcuLi4KKyMgSW52b2tlICRFQ0hPIHdpdGggYWxsIGFyZ3MsIHNwYWNlLXNlcGFyYXRlZC4KK2Z1bmNfZWNob19hbGwgKCkKK3sKKyAgICAkRUNITyAiJCoiIAorfQorCitjYXNlICIkRUNITyIgaW4KKyAgcHJpbnRmKikgQUNfTVNHX1JFU1VMVChbcHJpbnRmXSkgOzsKKyAgcHJpbnQqKSBBQ19NU0dfUkVTVUxUKFtwcmludCAtcl0pIDs7CisgICopIEFDX01TR19SRVNVTFQoW2NhdF0pIDs7CiBlc2FjCiAKLUVDSE89JHtsdF9FQ0hPLWVjaG99Ci1pZiB0ZXN0ICJYWyRdMSIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KLSAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCi0gIHNoaWZ0Ci1lbGlmIHRlc3QgIlhbJF0xIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KLSAgIyBBdm9pZCBpbmxpbmUgZG9jdW1lbnQgaGVyZSwgaXQgbWF5IGJlIGxlZnQgb3ZlcgotICA6Ci1lbGlmIHRlc3QgIlhgeyAkRUNITyAnXHQnOyB9IDI+L2Rldi9udWxsYCIgPSAnWFx0JyA7IHRoZW4KLSAgIyBZaXBwZWUsICRFQ0hPIHdvcmtzIQotICA6Ci1lbHNlCi0gICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbC4KLSAgZXhlYyAkU0hFTEwgIlskXTAiIC0tbm8tcmVleGVjICR7MSsiWyRdQCJ9Ci1maQorbTRfaWZkZWYoW19BU19ERVRFQ1RfU1VHR0VTVEVEXSwKK1tfQVNfREVURUNUX1NVR0dFU1RFRChbCisgIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSR7QkFTSF9WRVJTSU9OK3NldH0iIHx8ICgKKyAgICBFQ0hPPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcJworICAgIEVDSE89JEVDSE8kRUNITyRFQ0hPJEVDSE8kRUNITworICAgIEVDSE89JEVDSE8kRUNITyRFQ0hPJEVDSE8kRUNITyRFQ0hPCisgICAgUEFUSD0vZW1wdHkgRlBBVEg9L2VtcHR5OyBleHBvcnQgUEFUSCBGUEFUSAorICAgIHRlc3QgIlhgcHJpbnRmICVzICRFQ0hPYCIgPSAiWCRFQ0hPIiBcCisgICAgICB8fCB0ZXN0ICJYYHByaW50IC1yIC0tICRFQ0hPYCIgPSAiWCRFQ0hPIiApXSldKQogCi1pZiB0ZXN0ICJYWyRdMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCi0gICMgdXNlZCBhcyBmYWxsYmFjayBlY2hvCi0gIHNoaWZ0Ci0gIGNhdCA8PF9MVF9FT0YKLVskXSoKLV9MVF9FT0YKLSAgZXhpdCAwCi1maQotCi0jIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAotIyBpZiBDRFBBVEggaXMgc2V0LgotKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAotCi1pZiB0ZXN0IC16ICIkbHRfRUNITyI7IHRoZW4KLSAgaWYgdGVzdCAiWCR7ZWNob190ZXN0X3N0cmluZytzZXR9IiAhPSBYc2V0OyB0aGVuCi0gICAgIyBmaW5kIGEgc3RyaW5nIGFzIGxhcmdlIGFzIHBvc3NpYmxlLCBhcyBsb25nIGFzIHRoZSBzaGVsbCBjYW4gY29wZSB3aXRoIGl0Ci0gICAgZm9yIGNtZCBpbiAnc2VkIDUwcSAiWyRdMCInICdzZWQgMjBxICJbJF0wIicgJ3NlZCAxMHEgIlskXTAiJyAnc2VkIDJxICJbJF0wIicgJ2VjaG8gdGVzdCc7IGRvCi0gICAgICAjIGV4cGVjdGVkIHNpemVzOiBsZXNzIHRoYW4gMktiLCAxS2IsIDUxMiBieXRlcywgMTYgYnl0ZXMsIC4uLgotICAgICAgaWYgeyBlY2hvX3Rlc3Rfc3RyaW5nPWBldmFsICRjbWRgOyB9IDI+L2Rldi9udWxsICYmCi0JIHsgdGVzdCAiWCRlY2hvX3Rlc3Rfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB9IDI+L2Rldi9udWxsCi0gICAgICB0aGVuCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgZmkKLQotICBpZiB0ZXN0ICJYYHsgJEVDSE8gJ1x0JzsgfSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLSAgICAgZWNob190ZXN0aW5nX3N0cmluZz1geyAkRUNITyAiJGVjaG9fdGVzdF9zdHJpbmciOyB9IDI+L2Rldi9udWxsYCAmJgotICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLSAgICA6Ci0gIGVsc2UKLSAgICAjIFRoZSBTb2xhcmlzLCBBSVgsIGFuZCBEaWdpdGFsIFVuaXggZGVmYXVsdCBlY2hvIHByb2dyYW1zIHVucXVvdGUKLSAgICAjIGJhY2tzbGFzaGVzLiAgVGhpcyBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHF1b3RlIGJhY2tzbGFzaGVzIHVzaW5nCi0gICAgIyAgIGVjaG8gIiRzb21ldGhpbmciIHwgc2VkICdzL1xcL1xcXFwvZycKLSAgICAjCi0gICAgIyBTbywgZmlyc3Qgd2UgbG9vayBmb3IgYSB3b3JraW5nIGVjaG8gaW4gdGhlIHVzZXIncyBQQVRILgotCi0gICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0gICAgZm9yIGRpciBpbiAkUEFUSCAvdXNyL3VjYjsgZG8KLSAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgICAgaWYgKHRlc3QgLWYgJGRpci9lY2hvIHx8IHRlc3QgLWYgJGRpci9lY2hvJGFjX2V4ZWV4dCkgJiYKLSAgICAgICAgIHRlc3QgIlhgKCRkaXIvZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLSAgICAgICAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkZGlyL2VjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCi0gICAgICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLSAgICAgICAgRUNITz0iJGRpci9lY2hvIgotICAgICAgICBicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0KLSAgICBpZiB0ZXN0ICJYJEVDSE8iID0gWGVjaG87IHRoZW4KLSAgICAgICMgV2UgZGlkbid0IGZpbmQgYSBiZXR0ZXIgZWNobywgc28gbG9vayBmb3IgYWx0ZXJuYXRpdmVzLgotICAgICAgaWYgdGVzdCAiWGB7IHByaW50IC1yICdcdCc7IH0gMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0gICAgICAgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWB7IHByaW50IC1yICIkZWNob190ZXN0X3N0cmluZyI7IH0gMj4vZGV2L251bGxgICYmCi0gICAgICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLSAgICAgICAgIyBUaGlzIHNoZWxsIGhhcyBhIGJ1aWx0aW4gcHJpbnQgLXIgdGhhdCBkb2VzIHRoZSB0cmljay4KLSAgICAgICAgRUNITz0ncHJpbnQgLXInCi0gICAgICBlbGlmIHsgdGVzdCAtZiAvYmluL2tzaCB8fCB0ZXN0IC1mIC9iaW4va3NoJGFjX2V4ZWV4dDsgfSAmJgotCSAgIHRlc3QgIlgkQ09ORklHX1NIRUxMIiAhPSBYL2Jpbi9rc2g7IHRoZW4KLSAgICAgICAgIyBJZiB3ZSBoYXZlIGtzaCwgdHJ5IHJ1bm5pbmcgY29uZmlndXJlIGFnYWluIHdpdGggaXQuCi0gICAgICAgIE9SSUdJTkFMX0NPTkZJR19TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotICAgICAgICBleHBvcnQgT1JJR0lOQUxfQ09ORklHX1NIRUxMCi0gICAgICAgIENPTkZJR19TSEVMTD0vYmluL2tzaAotICAgICAgICBleHBvcnQgQ09ORklHX1NIRUxMCi0gICAgICAgIGV4ZWMgJENPTkZJR19TSEVMTCAiWyRdMCIgLS1uby1yZWV4ZWMgJHsxKyJbJF1AIn0KLSAgICAgIGVsc2UKLSAgICAgICAgIyBUcnkgdXNpbmcgcHJpbnRmLgotICAgICAgICBFQ0hPPSdwcmludGYgJXNcbicKLSAgICAgICAgaWYgdGVzdCAiWGB7ICRFQ0hPICdcdCc7IH0gMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0JICAgZWNob190ZXN0aW5nX3N0cmluZz1geyAkRUNITyAiJGVjaG9fdGVzdF9zdHJpbmciOyB9IDI+L2Rldi9udWxsYCAmJgotCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotCSAgIyBDb29sLCBwcmludGYgd29ya3MKLQkgIDoKLSAgICAgICAgZWxpZiBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJE9SSUdJTkFMX0NPTkZJR19TSEVMTCAiWyRdMCIgLS1mYWxsYmFjay1lY2hvICdcdCcpIDI+L2Rldi9udWxsYCAmJgotCSAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICdYXHQnICYmCi0JICAgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJE9SSUdJTkFMX0NPTkZJR19TSEVMTCAiWyRdMCIgLS1mYWxsYmFjay1lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgotCSAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0JICBDT05GSUdfU0hFTEw9JE9SSUdJTkFMX0NPTkZJR19TSEVMTAotCSAgZXhwb3J0IENPTkZJR19TSEVMTAotCSAgU0hFTEw9IiRDT05GSUdfU0hFTEwiCi0JICBleHBvcnQgU0hFTEwKLQkgIEVDSE89IiRDT05GSUdfU0hFTEwgWyRdMCAtLWZhbGxiYWNrLWVjaG8iCi0gICAgICAgIGVsaWYgZWNob190ZXN0aW5nX3N0cmluZz1gKCRDT05GSUdfU0hFTEwgIlskXTAiIC0tZmFsbGJhY2stZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAgJiYKLQkgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAnWFx0JyAmJgotCSAgICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRDT05GSUdfU0hFTEwgIlskXTAiIC0tZmFsbGJhY2stZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKLQkgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotCSAgRUNITz0iJENPTkZJR19TSEVMTCBbJF0wIC0tZmFsbGJhY2stZWNobyIKLSAgICAgICAgZWxzZQotCSAgIyBtYXliZSB3aXRoIGEgc21hbGxlciBzdHJpbmcuLi4KLQkgIHByZXY9OgotCi0JICBmb3IgY21kIGluICdlY2hvIHRlc3QnICdzZWQgMnEgIlskXTAiJyAnc2VkIDEwcSAiWyRdMCInICdzZWQgMjBxICJbJF0wIicgJ3NlZCA1MHEgIlskXTAiJzsgZG8KLQkgICAgaWYgeyB0ZXN0ICJYJGVjaG9fdGVzdF9zdHJpbmciID0gIlhgZXZhbCAkY21kYCI7IH0gMj4vZGV2L251bGwKLQkgICAgdGhlbgotCSAgICAgIGJyZWFrCi0JICAgIGZpCi0JICAgIHByZXY9IiRjbWQiCi0JICBkb25lCi0KLQkgIGlmIHRlc3QgIiRwcmV2IiAhPSAnc2VkIDUwcSAiWyRdMCInOyB0aGVuCi0JICAgIGVjaG9fdGVzdF9zdHJpbmc9YGV2YWwgJHByZXZgCi0JICAgIGV4cG9ydCBlY2hvX3Rlc3Rfc3RyaW5nCi0JICAgIGV4ZWMgJHtPUklHSU5BTF9DT05GSUdfU0hFTEwtJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH19ICJbJF0wIiAkezErIlskXUAifQotCSAgZWxzZQotCSAgICAjIE9vcHMuICBXZSBsb3N0IGNvbXBsZXRlbHksIHNvIGp1c3Qgc3RpY2sgd2l0aCBlY2hvLgotCSAgICBFQ0hPPWVjaG8KLQkgIGZpCi0gICAgICAgIGZpCi0gICAgICBmaQotICAgIGZpCi0gIGZpCi1maQotCi0jIENvcHkgZWNobyBhbmQgcXVvdGUgdGhlIGNvcHkgc3VpdGFibHkgZm9yIHBhc3NpbmcgdG8gbGlidG9vbCBmcm9tCi0jIHRoZSBNYWtlZmlsZSwgaW5zdGVhZCBvZiBxdW90aW5nIHRoZSBvcmlnaW5hbCwgd2hpY2ggaXMgdXNlZCBsYXRlci4KLWx0X0VDSE89JEVDSE8KLWlmIHRlc3QgIlgkbHRfRUNITyIgPSAiWCRDT05GSUdfU0hFTEwgWyRdMCAtLWZhbGxiYWNrLWVjaG8iOyB0aGVuCi0gICBsdF9FQ0hPPSIkQ09ORklHX1NIRUxMIFxcXCRcWyRdMCAtLWZhbGxiYWNrLWVjaG8iCi1maQotCi1BQ19TVUJTVChsdF9FQ0hPKQotXSkKIF9MVF9ERUNMKFtdLCBbU0hFTExdLCBbMV0sIFtTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzXSkKLV9MVF9ERUNMKFtdLCBbRUNIT10sIFsxXSwKLSAgICBbQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzXSkKK19MVF9ERUNMKFtdLCBbRUNIT10sIFsxXSwgW0FuIGVjaG8gcHJvZ3JhbSB0aGF0IHByb3RlY3RzIGJhY2tzbGFzaGVzXSkKIF0pIyBfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSAogCiAKKyMgX0xUX1dJVEhfU1lTUk9PVAorIyAtLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0xUX1dJVEhfU1lTUk9PVF0sCitbQUNfTVNHX0NIRUNLSU5HKFtmb3Igc3lzcm9vdF0pCitBQ19BUkdfV0lUSChbc3lzcm9vdF0sCitbICAtLXdpdGgtc3lzcm9vdFs9RElSXSBTZWFyY2ggZm9yIGRlcGVuZGVudCBsaWJyYXJpZXMgd2l0aGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgKG9yIHRoZSBjb21waWxlcidzIHN5c3Jvb3QgaWYgbm90IHNwZWNpZmllZCkuXSwKK1tdLCBbd2l0aF9zeXNyb290PW5vXSkKKworZG5sIGx0X3N5c3Jvb3Qgd2lsbCBhbHdheXMgYmUgcGFzc2VkIHVucXVvdGVkLiAgV2UgcXVvdGUgaXQgaGVyZQorZG5sIGluIGNhc2UgdGhlIHVzZXIgcGFzc2VkIGEgZGlyZWN0b3J5IG5hbWUuCitsdF9zeXNyb290PQorY2FzZSAke3dpdGhfc3lzcm9vdH0gaW4gIygKKyB5ZXMpCisgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgICBsdF9zeXNyb290PWAkQ0MgLS1wcmludC1zeXNyb290IDI+L2Rldi9udWxsYAorICAgZmkKKyAgIDs7ICMoCisgLyopCisgICBsdF9zeXNyb290PWBlY2hvICIkd2l0aF9zeXNyb290IiB8IHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICA7OyAjKAorIG5vfCcnKQorICAgOzsgIygKKyAqKQorICAgQUNfTVNHX1JFU1VMVChbJHt3aXRoX3N5c3Jvb3R9XSkKKyAgIEFDX01TR19FUlJPUihbVGhlIHN5c3Jvb3QgbXVzdCBiZSBhbiBhYnNvbHV0ZSBwYXRoLl0pCisgICA7OworZXNhYworCisgQUNfTVNHX1JFU1VMVChbJHtsdF9zeXNyb290Oi1ub31dKQorX0xUX0RFQ0woW10sIFtsdF9zeXNyb290XSwgWzBdLCBbVGhlIHJvb3Qgd2hlcmUgdG8gc2VhcmNoIGZvciBdZG5sCitbZGVwZW5kZW50IGxpYnJhcmllcywgYW5kIGluIHdoaWNoIG91ciBsaWJyYXJpZXMgc2hvdWxkIGJlIGluc3RhbGxlZC5dKV0pCisKICMgX0xUX0VOQUJMRV9MT0NLCiAjIC0tLS0tLS0tLS0tLS0tLQogbTRfZGVmdW4oW19MVF9FTkFCTEVfTE9DS10sCkBAIC0xMjM2LDcgKzEyODEsNyBAQAogICA7OwogKi0qLWlyaXg2KikKICAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICdbI11saW5lIF9fb2xpbmVfXyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0CisgIGVjaG8gJ1sjXWxpbmUgJyRMSU5FTk8nICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKICAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KICAgICBpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCiAgICAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCkBAIC0xMjc5LDcgKzEzMjQsMTQgQEAKIAkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2X2Zic2QiCiAJICAgIDs7CiAJICB4ODZfNjQtKmxpbnV4KikKLQkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2IgorCSAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIGluCisJICAgICAgKng4Ni02NCopCisJICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjMyX3g4Nl82NCIKKwkgICAgICAgICA7OworCSAgICAgICopCisJICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2IgorCSAgICAgICAgIDs7CisJICAgIGVzYWMKIAkgICAgOzsKIAkgIHBwYzY0LSpsaW51eCp8cG93ZXJwYzY0LSpsaW51eCopCiAJICAgIExEPSIke0xELWxkfSAtbSBlbGYzMnBwY2xpbnV4IgpAQCAtMTMyOSwxNCArMTM4MSwyNyBAQAogICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgogICBmaQogICA7Owotc3BhcmMqLSpzb2xhcmlzKikKKyotKnNvbGFyaXMqKQogICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCiAgIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0CiAgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCiAgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCBpbgogICAgICo2NC1iaXQqKQogICAgICAgY2FzZSAkbHRfY3ZfcHJvZ19nbnVfbGQgaW4KLSAgICAgIHllcyopIExEPSIke0xELWxkfSAtbSBlbGY2NF9zcGFyYyIgOzsKKyAgICAgIHllcyopCisgICAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICAgaT84Ni0qLXNvbGFyaXMqKQorICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGZfeDg2XzY0IgorICAgICAgICAgIDs7CisgICAgICAgIHNwYXJjKi0qLXNvbGFyaXMqKQorICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGY2NF9zcGFyYyIKKyAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICAgICMgR05VIGxkIDIuMjEgaW50cm9kdWNlZCBfc29sMiBlbXVsYXRpb25zLiAgVXNlIHRoZW0gaWYgYXZhaWxhYmxlLgorICAgICAgICBpZiAke0xELWxkfSAtViB8IGdyZXAgX3NvbDIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAgICAgTEQ9IiR7TEQtbGR9X3NvbDIiCisgICAgICAgIGZpCisgICAgICAgIDs7CiAgICAgICAqKQogCWlmICR7TEQtbGR9IC02NCAtciAtbyBjb25mdGVzdDIubyBjb25mdGVzdC5vID4vZGV2L251bGwgMj4mMTsgdGhlbgogCSAgTEQ9IiR7TEQtbGR9IC02NCIKQEAgLTEzNTQsMTQgKzE0MTksNDcgQEAKIF0pIyBfTFRfRU5BQkxFX0xPQ0sKIAogCisjIF9MVF9QUk9HX0FSCisjIC0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX1BST0dfQVJdLAorW0FDX0NIRUNLX1RPT0xTKEFSLCBbYXJdLCBmYWxzZSkKKzogJHtBUj1hcn0KKzogJHtBUl9GTEFHUz1jcnV9CitfTFRfREVDTChbXSwgW0FSXSwgWzFdLCBbVGhlIGFyY2hpdmVyXSkKK19MVF9ERUNMKFtdLCBbQVJfRkxBR1NdLCBbMV0sIFtGbGFncyB0byBjcmVhdGUgYW4gYXJjaGl2ZV0pCisKK0FDX0NBQ0hFX0NIRUNLKFtmb3IgYXJjaGl2ZXIgQEZJTEUgc3VwcG9ydF0sIFtsdF9jdl9hcl9hdF9maWxlXSwKKyAgW2x0X2N2X2FyX2F0X2ZpbGU9bm8KKyAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU1dLAorICAgICBbZWNobyBjb25mdGVzdC4kYWNfb2JqZXh0ID4gY29uZnRlc3QubHN0CisgICAgICBsdF9hcl90cnk9JyRBUiAkQVJfRkxBR1MgbGliY29uZnRlc3QuYSBAY29uZnRlc3QubHN0ID4mQVNfTUVTU0FHRV9MT0dfRkQnCisgICAgICBBQ19UUllfRVZBTChbbHRfYXJfdHJ5XSkKKyAgICAgIGlmIHRlc3QgIiRhY19zdGF0dXMiIC1lcSAwOyB0aGVuCisJIyBFbnN1cmUgdGhlIGFyY2hpdmVyIGZhaWxzIHVwb24gYm9ndXMgZmlsZSBuYW1lcy4KKwlybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGxpYmNvbmZ0ZXN0LmEKKwlBQ19UUllfRVZBTChbbHRfYXJfdHJ5XSkKKwlpZiB0ZXN0ICIkYWNfc3RhdHVzIiAtbmUgMDsgdGhlbgorICAgICAgICAgIGx0X2N2X2FyX2F0X2ZpbGU9QAorICAgICAgICBmaQorICAgICAgZmkKKyAgICAgIHJtIC1mIGNvbmZ0ZXN0LiogbGliY29uZnRlc3QuYQorICAgICBdKQorICBdKQorCitpZiB0ZXN0ICJ4JGx0X2N2X2FyX2F0X2ZpbGUiID0geG5vOyB0aGVuCisgIGFyY2hpdmVyX2xpc3Rfc3BlYz0KK2Vsc2UKKyAgYXJjaGl2ZXJfbGlzdF9zcGVjPSRsdF9jdl9hcl9hdF9maWxlCitmaQorX0xUX0RFQ0woW10sIFthcmNoaXZlcl9saXN0X3NwZWNdLCBbMV0sCisgIFtIb3cgdG8gZmVlZCBhIGZpbGUgbGlzdGluZyB0byB0aGUgYXJjaGl2ZXJdKQorXSkjIF9MVF9QUk9HX0FSCisKKwogIyBfTFRfQ01EX09MRF9BUkNISVZFCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0KIG00X2RlZnVuKFtfTFRfQ01EX09MRF9BUkNISVZFXSwKLVtBQ19DSEVDS19UT09MKEFSLCBhciwgZmFsc2UpCi10ZXN0IC16ICIkQVIiICYmIEFSPWFyCi10ZXN0IC16ICIkQVJfRkxBR1MiICYmIEFSX0ZMQUdTPWNydQotX0xUX0RFQ0woW10sIFtBUl0sIFsxXSwgW1RoZSBhcmNoaXZlcl0pCi1fTFRfREVDTChbXSwgW0FSX0ZMQUdTXSwgWzFdKQorW19MVF9QUk9HX0FSCiAKIEFDX0NIRUNLX1RPT0woU1RSSVAsIHN0cmlwLCA6KQogdGVzdCAteiAiJFNUUklQIiAmJiBTVFJJUD06CkBAIC0xMzgwLDE4ICsxNDc4LDI3IEBACiBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgogICBjYXNlICRob3N0X29zIGluCiAgIG9wZW5ic2QqKQotICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSIkb2xkX3Bvc3RpbnN0YWxsX2NtZHN+XCRSQU5MSUIgLXQgXCRvbGRsaWIiCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kc35cJFJBTkxJQiAtdCBcJHRvb2xfb2xkbGliIgogICAgIDs7CiAgICopCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kc35cJFJBTkxJQiBcJG9sZGxpYiIKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzflwkUkFOTElCIFwkdG9vbF9vbGRsaWIiCiAgICAgOzsKICAgZXNhYwotICBvbGRfYXJjaGl2ZV9jbWRzPSIkb2xkX2FyY2hpdmVfY21kc35cJFJBTkxJQiBcJG9sZGxpYiIKKyAgb2xkX2FyY2hpdmVfY21kcz0iJG9sZF9hcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCR0b29sX29sZGxpYiIKIGZpCisKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgZGFyd2luKikKKyAgICBsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb249eWVzIDs7CisgICopCisgICAgbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uPW5vIDs7Citlc2FjCiBfTFRfREVDTChbXSwgW29sZF9wb3N0aW5zdGFsbF9jbWRzXSwgWzJdKQogX0xUX0RFQ0woW10sIFtvbGRfcG9zdHVuaW5zdGFsbF9jbWRzXSwgWzJdKQogX0xUX1RBR0RFQ0woW10sIFtvbGRfYXJjaGl2ZV9jbWRzXSwgWzJdLAogICAgIFtDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuIG9sZC1zdHlsZSBhcmNoaXZlXSkKK19MVF9ERUNMKFtdLCBbbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uXSwgWzBdLAorICAgIFtXaGV0aGVyIHRvIHVzZSBhIGxvY2sgZm9yIG9sZCBhcmNoaXZlIGV4dHJhY3Rpb25dKQogXSkjIF9MVF9DTURfT0xEX0FSQ0hJVkUKIAogCkBAIC0xNDE2LDE1ICsxNTIzLDE1IEBACiAgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCiAgICAtZSAnczogW1teIF1dKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKICAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCi0gICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6X19vbGluZV9fOiAkbHRfY29tcGlsZVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86ICRsdF9jb21waWxlXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQpCiAgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQogICAgYWNfc3RhdHVzPSQ/CiAgICBjYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKLSAgIGVjaG8gIiRhc19tZTpfX29saW5lX186IFwkPyA9ICRhY19zdGF0dXMiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JkFTX01FU1NBR0VfTE9HX0ZECiAgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zICIkYWNfb3V0ZmlsZSI7IHRoZW4KICAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKICAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzIG90aGVyIHRoYW4gdGhlIHVzdWFsIG91dHB1dC4KLSAgICAgJEVDSE8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAorICAgICAkRUNITyAiJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkU0VEICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAogICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKICAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyMiB8fCBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgogICAgICAgICQyPXllcwpAQCAtMTQ2NCw3ICsxNTcxLDcgQEAKICAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KICAgICAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgogICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mQVNfTUVTU0FHRV9MT0dfRkQKLSAgICAgICAkRUNITyAiWCRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBjb25mdGVzdC5leHAKKyAgICAgICAkRUNITyAiJF9sdF9saW5rZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID4gY29uZnRlc3QuZXhwCiAgICAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCiAgICAgICAgaWYgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICQyPXllcwpAQCAtMTUyNyw2ICsxNjM0LDExIEBACiAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTI7CiAgICAgOzsKIAorICBtaW50KikKKyAgICAjIE9uIE1pTlQgdGhpcyBjYW4gdGFrZSBhIGxvbmcgdGltZSBhbmQgcnVuIG91dCBvZiBtZW1vcnkuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTI7CisgICAgOzsKKwogICBhbWlnYW9zKikKICAgICAjIE9uIEFtaWdhT1Mgd2l0aCBwZGtzaCwgdGhpcyB0ZXN0IHRha2VzIGhvdXJzLCBsaXRlcmFsbHkuCiAgICAgIyBTbyB3ZSBqdXN0IHB1bnQgYW5kIHVzZSBhIG1pbmltdW0gbGluZSBsZW5ndGggb2YgODE5Mi4KQEAgLTE1NTIsNiArMTY2NCwxMSBAQAogICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xOTY2MDgKICAgICA7OwogCisgIG9zMiopCisgICAgIyBUaGUgdGVzdCB0YWtlcyBhIGxvbmcgdGltZSBvbiBPUy8yLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyCisgICAgOzsKKwogICBvc2YqKQogICAgICMgRHIuIEhhbnMgRWtrZWhhcmQgUGxlc3NlciByZXBvcnRzIHNlZWluZyBhIGtlcm5lbCBwYW5pYyBydW5uaW5nIGNvbmZpZ3VyZQogICAgICMgZHVlIHRvIHRoaXMgdGVzdCB3aGVuIGV4ZWNfZGlzYWJsZV9hcmdfbGltaXQgaXMgMSBvbiBUcnU2NC4gSXQgaXMgbm90CkBAIC0xNTc4LDcgKzE2OTUsOCBAQAogICAgIDs7CiAgICopCiAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAoZ2V0Y29uZiBBUkdfTUFYKSAyPiAvZGV2L251bGxgCi0gICAgaWYgdGVzdCAtbiAiJGx0X2N2X3N5c19tYXhfY21kX2xlbiI7IHRoZW4KKyAgICBpZiB0ZXN0IC1uICIkbHRfY3Zfc3lzX21heF9jbWRfbGVuIiAmJiBcCisgICAgICB0ZXN0IHVuZGVmaW5lZCAhPSAiJGx0X2N2X3N5c19tYXhfY21kX2xlbiI7IHRoZW4KICAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDRgCiAgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcKiAzYAogICAgIGVsc2UKQEAgLTE1OTEsOCArMTcwOSw4IEBACiAgICAgICAjIElmIHRlc3QgaXMgbm90IGEgc2hlbGwgYnVpbHQtaW4sIHdlJ2xsIHByb2JhYmx5IGVuZCB1cCBjb21wdXRpbmcgYQogICAgICAgIyBtYXhpbXVtIGxlbmd0aCB0aGF0IGlzIG9ubHkgaGFsZiBvZiB0aGUgYWN0dWFsIG1heGltdW0gbGVuZ3RoLCBidXQKICAgICAgICMgd2UgY2FuJ3QgdGVsbC4KLSAgICAgIHdoaWxlIHsgdGVzdCAiWCJgJFNIRUxMIFskXTAgLS1mYWxsYmFjay1lY2hvICJYJHRlc3RzdHJpbmckdGVzdHN0cmluZyIgMj4vZGV2L251bGxgIFwKLQkgICAgICAgICA9ICJYWCR0ZXN0c3RyaW5nJHRlc3RzdHJpbmciOyB9ID4vZGV2L251bGwgMj4mMSAmJgorICAgICAgd2hpbGUgeyB0ZXN0ICJYImBlbnYgZWNobyAiJHRlc3RzdHJpbmckdGVzdHN0cmluZyIgMj4vZGV2L251bGxgIFwKKwkgICAgICAgICA9ICJYJHRlc3RzdHJpbmckdGVzdHN0cmluZyI7IH0gPi9kZXYvbnVsbCAyPiYxICYmCiAJICAgICAgdGVzdCAkaSAhPSAxNyAjIDEvMiBNQiBzaG91bGQgYmUgZW5vdWdoCiAgICAgICBkbwogICAgICAgICBpPWBleHByICRpICsgMWAKQEAgLTE2NDMsNyArMTc2MSw3IEBACiAgIGx0X2RsdW5rbm93bj0wOyBsdF9kbG5vX3VzY29yZT0xOyBsdF9kbG5lZWRfdXNjb3JlPTIKICAgbHRfc3RhdHVzPSRsdF9kbHVua25vd24KICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKLVsjbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSIKK1sjbGluZSAkTElORU5PICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogI2lmIEhBVkVfRExGQ05fSApAQCAtMTY4NCw3ICsxODAyLDEzIEBACiAjICBlbmRpZgogI2VuZGlmCiAKLXZvaWQgZm5vcmQoKSB7IGludCBpPTQyO30KKy8qIFdoZW4gLWZ2aXNiaWxpdHk9aGlkZGVuIGlzIHVzZWQsIGFzc3VtZSB0aGUgY29kZSBoYXMgYmVlbiBhbm5vdGF0ZWQKKyAgIGNvcnJlc3BvbmRpbmdseSBmb3IgdGhlIHN5bWJvbHMgbmVlZGVkLiAgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoKChfX0dOVUNfXyA9PSAzKSAmJiAoX19HTlVDX01JTk9SX18gPj0gMykpIHx8IChfX0dOVUNfXyA+IDMpKQoraW50IGZub3JkICgpIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpOworI2VuZGlmCisKK2ludCBmbm9yZCAoKSB7IHJldHVybiA0MjsgfQogaW50IG1haW4gKCkKIHsKICAgdm9pZCAqc2VsZiA9IGRsb3BlbiAoMCwgTFRfRExHTE9CQUx8TFRfRExMQVpZX09SX05PVyk7CkBAIC0xNjkzLDcgKzE4MTcsMTEgQEAKICAgaWYgKHNlbGYpCiAgICAgewogICAgICAgaWYgKGRsc3ltIChzZWxmLCJmbm9yZCIpKSAgICAgICBzdGF0dXMgPSAkbHRfZGxub191c2NvcmU7Ci0gICAgICBlbHNlIGlmIChkbHN5bSggc2VsZiwiX2Zub3JkIikpIHN0YXR1cyA9ICRsdF9kbG5lZWRfdXNjb3JlOworICAgICAgZWxzZQorICAgICAgICB7CisJICBpZiAoZGxzeW0oIHNlbGYsIl9mbm9yZCIpKSAgc3RhdHVzID0gJGx0X2RsbmVlZF91c2NvcmU7CisgICAgICAgICAgZWxzZSBwdXRzIChkbGVycm9yICgpKTsKKwl9CiAgICAgICAvKiBkbGNsb3NlIChzZWxmKTsgKi8KICAgICB9CiAgIGVsc2UKQEAgLTE4NjksMTYgKzE5OTcsMTYgQEAKICAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKICAgIC1lICdzOiBbW14gXV0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAogICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKLSAgIChldmFsIGVjaG8gIlwiXCRhc19tZTpfX29saW5lX186ICRsdF9jb21waWxlXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQpCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogJGx0X2NvbXBpbGVcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKICAgIChldmFsICIkbHRfY29tcGlsZSIgMj5vdXQvY29uZnRlc3QuZXJyKQogICAgYWNfc3RhdHVzPSQ/CiAgICBjYXQgb3V0L2NvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECi0gICBlY2hvICIkYXNfbWU6X19vbGluZV9fOiBcJD8gPSAkYWNfc3RhdHVzIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiZBU19NRVNTQUdFX0xPR19GRAogICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQKICAgIHRoZW4KICAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKICAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCi0gICAgICRFQ0hPICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAorICAgICAkRUNITyAiJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkU0VEICcvXiQvZCcgPiBvdXQvY29uZnRlc3QuZXhwCiAgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBvdXQvY29uZnRlc3QuZXJyID5vdXQvY29uZnRlc3QuZXIyCiAgICAgIGlmIHRlc3QgISAtcyBvdXQvY29uZnRlc3QuZXIyIHx8IGRpZmYgb3V0L2NvbmZ0ZXN0LmV4cCBvdXQvY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KICAgICAgICBfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSk9eWVzCkBAIC0yMDM3LDYgKzIxNjUsNyBAQAogbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCiBtNF9yZXF1aXJlKFtfTFRfREVDTF9PQkpEVU1QXSlkbmwKIG00X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCittNF9yZXF1aXJlKFtfTFRfQ0hFQ0tfU0hFTExfRkVBVFVSRVNdKWRubAogQUNfTVNHX0NIRUNLSU5HKFtkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3NdKQogbTRfaWYoWyQxXSwKIAlbXSwgWwpAQCAtMjA0NSwxNiArMjE3NCwyMyBAQAogICAgIGRhcndpbiopIGx0X2F3a19hcmc9Ii9ebGlicmFyaWVzOi8sL0xSLyIgOzsKICAgICAqKSBsdF9hd2tfYXJnPSIvXmxpYnJhcmllczovIiA7OwogICBlc2FjCi0gIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBhd2sgJGx0X2F3a19hcmcgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCi0gIGlmICRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkR1JFUCAnOycgPi9kZXYvbnVsbCA7IHRoZW4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG1pbmd3KiB8IGNlZ2NjKikgbHRfc2VkX3N0cmlwX2VxPSJzLD1cKFtbQS1aYS16XV06XCksXDEsZyIgOzsKKyAgICAqKSBsdF9zZWRfc3RyaXBfZXE9InMsPS8sLyxnIiA7OworICBlc2FjCisgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBhd2sgJGx0X2F3a19hcmcgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICRsdF9zZWRfc3RyaXBfZXFgCisgIGNhc2UgJGx0X3NlYXJjaF9wYXRoX3NwZWMgaW4KKyAgKlw7KikKICAgICAjIGlmIHRoZSBwYXRoIGNvbnRhaW5zICI7IiB0aGVuIHdlIGFzc3VtZSBpdCB0byBiZSB0aGUgc2VwYXJhdG9yCiAgICAgIyBvdGhlcndpc2UgZGVmYXVsdCB0byB0aGUgc3RhbmRhcmQgcGF0aCBzZXBhcmF0b3IgKGkuZS4gIjoiKSAtIGl0IGlzCiAgICAgIyBhc3N1bWVkIHRoYXQgbm8gcGFydCBvZiBhIG5vcm1hbCBwYXRobmFtZSBjb250YWlucyAiOyIgYnV0IHRoYXQgc2hvdWxkCiAgICAgIyBva2F5IGluIHRoZSByZWFsIHdvcmxkIHdoZXJlICI7IiBpbiBkaXJwYXRocyBpcyBpdHNlbGYgcHJvYmxlbWF0aWMuCi0gICAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAotICBlbHNlCi0gICAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAotICBmaQorICAgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICdzLzsvIC9nJ2AKKyAgICA7OworICAqKQorICAgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgIDs7CisgIGVzYWMKICAgIyBPaywgbm93IHdlIGhhdmUgdGhlIHBhdGgsIHNlcGFyYXRlZCBieSBzcGFjZXMsIHdlIGNhbiBzdGVwIHRocm91Z2ggaXQKICAgIyBhbmQgYWRkIG11bHRpbGliIGRpciBpZiBuZWNlc3NhcnkuCiAgIGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjPQpAQCAtMjA2Nyw3ICsyMjAzLDcgQEAKIAlsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYz0iJGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjICRsdF9zeXNfcGF0aCIKICAgICBmaQogICBkb25lCi0gIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICRsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYyB8IGF3ayAnCisgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWMiIHwgYXdrICcKIEJFR0lOIHtSUz0iICI7IEZTPSIvfFxuIjt9IHsKICAgbHRfZm9vPSIiOwogICBsdF9jb3VudD0wOwpAQCAtMjA4Nyw3ICsyMjIzLDEzIEBACiAgIGlmIChsdF9mb28gIT0gIiIpIHsgbHRfZnJlcVtbbHRfZm9vXV0rKzsgfQogICBpZiAobHRfZnJlcVtbbHRfZm9vXV0gPT0gMSkgeyBwcmludCBsdF9mb287IH0KIH0nYAotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICRsdF9zZWFyY2hfcGF0aF9zcGVjYAorICAjIEFXSyBwcm9ncmFtIGFib3ZlIGVycm9uZW91c2x5IHByZXBlbmRzICcvJyB0byBDOi9kb3MvcGF0aHMKKyAgIyBmb3IgdGhlc2UgaG9zdHMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBtaW5ndyogfCBjZWdjYyopIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfFwKKyAgICAgICRTRUQgJ3MsL1woW1tBLVphLXpdXTpcKSxcMSxnJ2AgOzsKKyAgZXNhYworICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkbHRfTkwyU1BgCiBlbHNlCiAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKIGZpXSkKQEAgLTIxMTMsNyArMjI1NSw3IEBACiAKIGNhc2UgJGhvc3Rfb3MgaW4KIGFpeDMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgogICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUuYScKICAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICiAKQEAgLTIxMjIsNyArMjI2NCw3IEBACiAgIDs7CiAKIGFpeFtbNC05XV0qKQotICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgogICBuZWVkX2xpYl9wcmVmaXg9bm8KICAgbmVlZF92ZXJzaW9uPW5vCiAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKQEAgLTIxNzUsNyArMjMxNyw3IEBACiAgIG02OGspCiAgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5peGxpYnJhcnkgJGxpYm5hbWUuYScKICAgICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgotICAgIGZpbmlzaF9ldmFsPSdmb3IgbGliIGluIGBscyAkbGliZGlyLyouaXhsaWJyYXJ5IDI+L2Rldi9udWxsYDsgZG8gbGlibmFtZT1gJEVDSE8gIlgkbGliIiB8ICRYc2VkIC1lICdcJydzJV4uKi9cKFtbXi9dXSpcKVwuaXhsaWJyYXJ5JCVcMSUnXCcnYDsgdGVzdCAkUk0gL3N5cy9saWJzLyR7bGlibmFtZX1faXhsaWJyYXJ5LmE7ICRzaG93ICJjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIjsgY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSB8fCBleGl0IDE7IGRvbmUnCisgICAgZmluaXNoX2V2YWw9J2ZvciBsaWIgaW4gYGxzICRsaWJkaXIvKi5peGxpYnJhcnkgMj4vZGV2L251bGxgOyBkbyBsaWJuYW1lPWBmdW5jX2VjaG9fYWxsICIkbGliIiB8ICRTRUQgJ1wnJ3MlXi4qL1woW1teL11dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRSTSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKICAgICA7OwogICBlc2FjCiAgIDs7CkBAIC0yMTg3LDcgKzIzMjksNyBAQAogICA7OwogCiBic2RpW1s0NV1dKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4CisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKICAgbmVlZF92ZXJzaW9uPW5vCiAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwogICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwpAQCAtMjIwNiw4ICsyMzQ4LDkgQEAKICAgbmVlZF92ZXJzaW9uPW5vCiAgIG5lZWRfbGliX3ByZWZpeD1ubwogCi0gIGNhc2UgJEdDQywkaG9zdF9vcyBpbgotICB5ZXMsY3lnd2luKiB8IHllcyxtaW5ndyogfCB5ZXMscHczMiogfCB5ZXMsY2VnY2MqKQorICBjYXNlICRHQ0MsJGNjX2Jhc2VuYW1lIGluCisgIHllcywqKQorICAgICMgZ2NjCiAgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwuYScKICAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCiAgICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+CkBAIC0yMjI4LDM2ICsyMzcxLDgzIEBACiAgICAgY3lnd2luKikKICAgICAgICMgQ3lnd2luIERMTHMgdXNlICdjeWcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJwogICAgICAgc29uYW1lX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9jeWcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIC9saWIvdzMyYXBpIC9saWIgL3Vzci9sb2NhbC9saWIiCittNF9pZihbJDFdLCBbXSxbCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgL3Vzci9saWIvdzMyYXBpIl0pCiAgICAgICA7OwogICAgIG1pbmd3KiB8IGNlZ2NjKikKICAgICAgICMgTWluR1cgRExMcyB1c2UgdHJhZGl0aW9uYWwgJ2xpYicgcHJlZml4CiAgICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8ICRHUkVQICJebGlicmFyaWVzOiIgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCi0gICAgICBpZiAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBbJEdSRVAgJztbYy16Qy1aXTovJyA+L2Rldi9udWxsXTsgdGhlbgotICAgICAgICAjIEl0IGlzIG1vc3QgcHJvYmFibHkgYSBXaW5kb3dzIGZvcm1hdCBQQVRIIHByaW50ZWQgYnkKLSAgICAgICAgIyBtaW5ndyBnY2MsIGJ1dCB3ZSBhcmUgcnVubmluZyBvbiBDeWd3aW4uIEdjYyBwcmludHMgaXRzIHNlYXJjaAotICAgICAgICAjIHBhdGggd2l0aCA7IHNlcGFyYXRvcnMsIGFuZCB3aXRoIGRyaXZlIGxldHRlcnMuIFdlIGNhbiBoYW5kbGUgdGhlCi0gICAgICAgICMgZHJpdmUgbGV0dGVycyAoY3lnd2luIGZpbGV1dGlscyB1bmRlcnN0YW5kcyB0aGVtKSwgc28gbGVhdmUgdGhlbSwKLSAgICAgICAgIyBlc3BlY2lhbGx5IGFzIHdlIG1pZ2h0IHBhc3MgZmlsZXMgZm91bmQgdGhlcmUgdG8gYSBtaW5ndyBvYmpkdW1wLAotICAgICAgICAjIHdoaWNoIHdvdWxkbid0IHVuZGVyc3RhbmQgYSBjeWd3aW5pZmllZCBwYXRoLiBBaGguCi0gICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCi0gICAgICBlbHNlCi0gICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCi0gICAgICBmaQogICAgICAgOzsKICAgICBwdzMyKikKICAgICAgICMgcHczMiBETExzIHVzZSAncHcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJwogICAgICAgbGlicmFyeV9uYW1lc19zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvcHcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCiAgICAgICA7OwogICAgIGVzYWMKKyAgICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGQuZXhlJworICAgIDs7CisKKyAgKixjbCopCisgICAgIyBOYXRpdmUgTVNWQworICAgIGxpYm5hbWVfc3BlYz0nJG5hbWUnCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9LmRsbC5saWInCisKKyAgICBjYXNlICRidWlsZF9vcyBpbgorICAgIG1pbmd3KikKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0KKyAgICAgIGx0X3NhdmVfaWZzPSRJRlMKKyAgICAgIElGUz0nOycKKyAgICAgIGZvciBsdF9wYXRoIGluICRMSUIKKyAgICAgIGRvCisgICAgICAgIElGUz0kbHRfc2F2ZV9pZnMKKyAgICAgICAgIyBMZXQgRE9TIHZhcmlhYmxlIGV4cGFuc2lvbiBwcmludCB0aGUgc2hvcnQgOC4zIHN0eWxlIGZpbGUgbmFtZS4KKyAgICAgICAgbHRfcGF0aD1gY2QgIiRsdF9wYXRoIiAyPi9kZXYvbnVsbCAmJiBjbWQgLy9DICJmb3IgJWkgaW4gKCIuIikgZG8gQGVjaG8gJX5zaSJgCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAkbHRfcGF0aCIKKyAgICAgIGRvbmUKKyAgICAgIElGUz0kbHRfc2F2ZV9pZnMKKyAgICAgICMgQ29udmVydCB0byBNU1lTIHN0eWxlLgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBzZWQgLWUgJ3N8XFxcXHwvfGcnIC1lICdzfCBcXChbW2EtekEtWl1dXFwpOnwgL1xcMXxnJyAtZSAnc3xeIHx8J2AKKyAgICAgIDs7CisgICAgY3lnd2luKikKKyAgICAgICMgQ29udmVydCB0byB1bml4IGZvcm0sIHRoZW4gdG8gZG9zIGZvcm0sIHRoZW4gYmFjayB0byB1bml4IGZvcm0KKyAgICAgICMgYnV0IHRoaXMgdGltZSBkb3Mgc3R5bGUgKG5vIHNwYWNlcyEpIHNvIHRoYXQgdGhlIHVuaXggZm9ybSBsb29rcworICAgICAgIyBsaWtlIC9jeWdkcml2ZS9jL1BST0dSQX4xOi9jeWdkci4uLgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBjeWdwYXRoIC0tcGF0aCAtLXVuaXggIiRMSUIiYAorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBjeWdwYXRoIC0tcGF0aCAtLWRvcyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgMj4vZGV2L251bGxgCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGN5Z3BhdGggLS1wYXRoIC0tdW5peCAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgICAgOzsKKyAgICAqKQorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkTElCIgorICAgICAgaWYgJEVDSE8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgWyRHUkVQICc7W2MtekMtWl06LycgPi9kZXYvbnVsbF07IHRoZW4KKyAgICAgICAgIyBJdCBpcyBtb3N0IHByb2JhYmx5IGEgV2luZG93cyBmb3JtYXQgUEFUSC4KKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKKyAgICAgIGVsc2UKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgICAgZmkKKyAgICAgICMgRklYTUU6IGZpbmQgdGhlIHNob3J0IG5hbWUgb3IgdGhlIHBhdGggY29tcG9uZW50cywgYXMgc3BhY2VzIGFyZQorICAgICAgIyBjb21tb24uIChlLmcuICJQcm9ncmFtIEZpbGVzIiAtPiAiUFJPR1JBfjEiKQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCisgICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+CisgICAgICBkbHBhdGg9YCRTSEVMTCAyPiYxIC1jICdcJycuICRkaXIvJ1wnJ1wke2Jhc2VfZmlsZX0nXCcnaTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgorICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+CisgICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWUnCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+CisgICAgICAgJFJNIFwkZGxwYXRoJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGluay5leGUnCiAgICAgOzsKIAogICAqKQorICAgICMgQXNzdW1lIE1TVkMgd3JhcHBlcgogICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fSAkbGlibmFtZS5saWInCisgICAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKICAgICA7OwogICBlc2FjCi0gIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCiAgICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgogICBzaGxpYnBhdGhfdmFyPVBBVEgKICAgOzsKQEAgLTIyNzgsNyArMjQ2OCw3IEBACiAgIDs7CiAKIGRndXgqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgogICBuZWVkX2xpYl9wcmVmaXg9bm8KICAgbmVlZF92ZXJzaW9uPW5vCiAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUkc2hhcmVkX2V4dCcKQEAgLTIyODYsMTAgKzI0NzYsNiBAQAogICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAogICA7OwogCi1mcmVlYnNkMSopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0KIGZyZWVic2QqIHwgZHJhZ29uZmx5KikKICAgIyBEcmFnb25GbHkgZG9lcyBub3QgaGF2ZSBhb3V0LiAgV2hlbi9pZiB0aGV5IGltcGxlbWVudCBhIG5ldwogICAjIHZlcnNpb25pbmcgbWVjaGFuaXNtLCBhZGp1c3QgdGhpcy4KQEAgLTIyOTcsNyArMjQ4Myw3IEBACiAgICAgb2JqZm9ybWF0PWAvdXNyL2Jpbi9vYmpmb3JtYXRgCiAgIGVsc2UKICAgICBjYXNlICRob3N0X29zIGluCi0gICAgZnJlZWJzZFtbMTIzXV0qKSBvYmpmb3JtYXQ9YW91dCA7OworICAgIGZyZWVic2RbWzIzXV0uKikgb2JqZm9ybWF0PWFvdXQgOzsKICAgICAqKSBvYmpmb3JtYXQ9ZWxmIDs7CiAgICAgZXNhYwogICBmaQpAQCAtMjMxNSw3ICsyNTAxLDcgQEAKICAgZXNhYwogICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAogICBjYXNlICRob3N0X29zIGluCi0gIGZyZWVic2QyKikKKyAgZnJlZWJzZDIuKikKICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCiAgICAgOzsKICAgZnJlZWJzZDMuW1swMV1dKiB8IGZyZWVic2RlbGYzLltbMDFdXSopCkBAIC0yMzM1LDEyICsyNTIxLDI2IEBACiAgIDs7CiAKIGdudSopCi0gIHZlcnNpb25fdHlwZT1saW51eAorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCiAgIG5lZWRfbGliX3ByZWZpeD1ubwogICBuZWVkX3ZlcnNpb249bm8KICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwogICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwogICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitoYWlrdSopCisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgcnVudGltZV9sb2FkZXIiCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0ke21ham9yfSAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL2Jvb3QvaG9tZS9jb25maWcvbGliIC9ib290L2NvbW1vbi9saWIgL2Jvb3Qvc3lzdGVtL2xpYicKICAgaGFyZGNvZGVfaW50b19saWJzPXllcwogICA7OwogCkBAIC0yMzg2LDEyICsyNTg2LDE0IEBACiAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKICAgICA7OwogICBlc2FjCi0gICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgorICAjIEhQLVVYIHJ1bnMgKnJlYWxseSogc2xvd2x5IHVubGVzcyBzaGFyZWQgbGlicmFyaWVzIGFyZSBtb2RlIDU1NSwgLi4uCiAgIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDU1NSAkbGliJworICAjIG9yIGZhaWxzIG91dHJpZ2h0LCBzbyBvdmVycmlkZSBhdG9taWNhbGx5OgorICBpbnN0YWxsX292ZXJyaWRlX21vZGU9NTU1CiAgIDs7CiAKIGludGVyaXhbWzMtOV1dKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4CisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKICAgbmVlZF9saWJfcHJlZml4PW5vCiAgIG5lZWRfdmVyc2lvbj1ubwogICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JwpAQCAtMjQwNyw3ICsyNjA5LDcgQEAKICAgICBub25zdG9wdXgqKSB2ZXJzaW9uX3R5cGU9bm9uc3RvcHV4IDs7CiAgICAgKikKIAlpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCi0JCXZlcnNpb25fdHlwZT1saW51eAorCQl2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCiAJZWxzZQogCQl2ZXJzaW9uX3R5cGU9aXJpeAogCWZpIDs7CkBAIC0yNDQ0LDkgKzI2NDYsOSBAQAogICBkeW5hbWljX2xpbmtlcj1ubwogICA7OwogCi0jIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCi1saW51eCogfCBrKmJzZCotZ251KQotICB2ZXJzaW9uX3R5cGU9bGludXgKKyMgVGhpcyBtdXN0IGJlIGdsaWJjL0VMRi4KK2xpbnV4KiB8IGsqYnNkKi1nbnUgfCBrb3BlbnNvbGFyaXMqLWdudSkKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgogICBuZWVkX2xpYl9wcmVmaXg9bm8KICAgbmVlZF92ZXJzaW9uPW5vCiAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwpAQCAtMjQ1NCwxNiArMjY1NiwyMSBAQAogICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJwogICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAogICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKwogICAjIFNvbWUgYmludXRpbHMgbGQgYXJlIHBhdGNoZWQgdG8gc2V0IERUX1JVTlBBVEgKLSAgc2F2ZV9MREZMQUdTPSRMREZMQUdTCi0gIHNhdmVfbGliZGlyPSRsaWJkaXIKLSAgZXZhbCAibGliZGlyPS9mb287IHdsPVwiJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpXCI7IFwKLSAgICAgICBMREZMQUdTPVwiXCRMREZMQUdTICRfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKVwiIgotICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtdLFtdKV0sCi0gICAgW0FTX0lGKFsgKCRPQkpEVU1QIC1wIGNvbmZ0ZXN0JGFjX2V4ZWV4dCkgMj4vZGV2L251bGwgfCBncmVwICJSVU5QQVRILiokbGliZGlyIiA+L2Rldi9udWxsXSwKLSAgICAgICBbc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllc10pXSkKLSAgTERGTEFHUz0kc2F2ZV9MREZMQUdTCi0gIGxpYmRpcj0kc2F2ZV9saWJkaXIKKyAgQUNfQ0FDSEVfVkFMKFtsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGhdLAorICAgIFtsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICBzYXZlX0xERkxBR1M9JExERkxBR1MKKyAgICBzYXZlX2xpYmRpcj0kbGliZGlyCisgICAgZXZhbCAibGliZGlyPS9mb287IHdsPVwiJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpXCI7IFwKKwkgTERGTEFHUz1cIlwkTERGTEFHUyAkX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSlcIiIKKyAgICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtdLFtdKV0sCisgICAgICBbQVNfSUYoWyAoJE9CSkRVTVAgLXAgY29uZnRlc3QkYWNfZXhlZXh0KSAyPi9kZXYvbnVsbCB8IGdyZXAgIlJVTlBBVEguKiRsaWJkaXIiID4vZGV2L251bGxdLAorCSBbbHRfY3Zfc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllc10pXSkKKyAgICBMREZMQUdTPSRzYXZlX0xERkxBR1MKKyAgICBsaWJkaXI9JHNhdmVfbGliZGlyCisgICAgXSkKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKIAogICAjIFRoaXMgaW1wbGllcyBubyBmYXN0X2luc3RhbGwsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZS4KICAgIyBTb21lIHJld29yayB3aWxsIGJlIG5lZWRlZCB0byBhbGxvdyBmb3IgZmFzdF9pbnN0YWxsCkBAIC0yNDc1LDggKzI2ODIsOSBAQAogCiAgICMgQXBwZW5kIGxkLnNvLmNvbmYgY29udGVudHMgdG8gdGhlIHNlYXJjaCBwYXRoCiAgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCi0gICAgbHRfbGRfZXh0cmE9YGF3ayAnL15pbmNsdWRlIC8geyBzeXN0ZW0oc3ByaW50ZigiY2QgL2V0YzsgY2F0ICVzIDI+L2Rldi9udWxsIiwgXFskXTIpKTsgc2tpcCA9IDE7IH0geyBpZiAoIXNraXApIHByaW50IFxbJF0wOyBza2lwID0gMDsgfScgPCAvZXRjL2xkLnNvLmNvbmYgfCAkU0VEIC1lICdzLyMuKi8vOy9eWwkgXSpod2NhcFsJIF0vZDtzL1s6LAldLyAvZztzLz1bXj1dKiQvLztzLz1bXj0gXSogLyAvZzsvXiQvZCcgfCB0ciAnXG4nICcgJ2AKKyAgICBsdF9sZF9leHRyYT1gYXdrICcvXmluY2x1ZGUgLyB7IHN5c3RlbShzcHJpbnRmKCJjZCAvZXRjOyBjYXQgJXMgMj4vZGV2L251bGwiLCBcWyRdMikpOyBza2lwID0gMTsgfSB7IGlmICghc2tpcCkgcHJpbnQgXFskXTA7IHNraXAgPSAwOyB9JyA8IC9ldGMvbGQuc28uY29uZiB8ICRTRUQgLWUgJ3MvIy4qLy87L15bCSBdKmh3Y2FwWwkgXS9kO3MvWzosCV0vIC9nO3MvPVtePV0qJC8vO3MvPVtePSBdKiAvIC9nO3MvIi8vZzsvXiQvZCcgfCB0ciAnXG4nICcgJ2AKICAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjICRsdF9sZF9leHRyYSIKKwogICBmaQogCiAgICMgV2UgdXNlZCB0byB0ZXN0IGZvciAvbGliL2xkLnNvLjEgYW5kIGRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyBvbgpAQCAtMjUwNyw3ICsyNzE1LDcgQEAKICAgOzsKIAogbmV3c29zNikKLSAgdmVyc2lvbl90eXBlPWxpbnV4CisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCiAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICiAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKQEAgLTI1NzYsNyArMjc4NCw3IEBACiAgIDs7CiAKIHNvbGFyaXMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgogICBuZWVkX2xpYl9wcmVmaXg9bm8KICAgbmVlZF92ZXJzaW9uPW5vCiAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwpAQCAtMjYwMSw3ICsyODA5LDcgQEAKICAgOzsKIAogc3lzdjQgfCBzeXN2NC4zKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4CisgIHZlcnNpb25fdHlwZT1saW51eCAjIGNvcnJlY3QgdG8gZ251L2xpbnV4IGR1cmluZyB0aGUgbmV4dCBiaWcgcmVmYWN0b3IKICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCiAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCiAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICkBAIC0yNjI1LDcgKzI4MzMsNyBAQAogCiBzeXN2NCpNUCopCiAgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KLSAgICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCiAgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKICAgICBzb25hbWVfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvcicKICAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSApAQCAtMjY1Niw3ICsyODY0LDcgQEAKIAogdHBmKikKICAgIyBUUEYgaXMgYSBjcm9zcy10YXJnZXQgb25seS4gIFByZWZlcnJlZCBjcm9zcy1ob3N0ID0gR05VL0xpbnV4LgotICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgdmVyc2lvbl90eXBlPWxpbnV4ICMgY29ycmVjdCB0byBnbnUvbGludXggZHVyaW5nIHRoZSBuZXh0IGJpZyByZWZhY3RvcgogICBuZWVkX2xpYl9wcmVmaXg9bm8KICAgbmVlZF92ZXJzaW9uPW5vCiAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwpAQCAtMjY2Niw3ICsyODc0LDcgQEAKICAgOzsKIAogdXRzNCopCi0gIHZlcnNpb25fdHlwZT1saW51eAorICB2ZXJzaW9uX3R5cGU9bGludXggIyBjb3JyZWN0IHRvIGdudS9saW51eCBkdXJpbmcgdGhlIG5leHQgYmlnIHJlZmFjdG9yCiAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwogICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwogICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSApAQCAtMjcwOCw2ICsyOTE2LDggQEAKICAgICBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FXV0pCiBfTFRfREVDTChbXSwgW3NvbmFtZV9zcGVjXSwgWzFdLAogICAgIFtbVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWVdXSkKK19MVF9ERUNMKFtdLCBbaW5zdGFsbF9vdmVycmlkZV9tb2RlXSwgWzFdLAorICAgIFtQZXJtaXNzaW9uIG1vZGUgb3ZlcnJpZGUgZm9yIGluc3RhbGxhdGlvbiBvZiBzaGFyZWQgbGlicmFyaWVzXSkKIF9MVF9ERUNMKFtdLCBbcG9zdGluc3RhbGxfY21kc10sIFsyXSwKICAgICBbQ29tbWFuZCB0byB1c2UgYWZ0ZXIgaW5zdGFsbGF0aW9uIG9mIGEgc2hhcmVkIGFyY2hpdmVdKQogX0xUX0RFQ0woW10sIFtwb3N0dW5pbnN0YWxsX2NtZHNdLCBbMl0sCkBAIC0yODIwLDYgKzMwMzAsNyBAQAogQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKIG00X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCiBtNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCittNF9yZXF1aXJlKFtfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSF0pZG5sCiAKIEFDX0FSR19XSVRIKFtnbnUtbGRdLAogICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLWdudS1sZF0sCkBAIC0yOTQxLDYgKzMxNTIsMTEgQEAKIGVzYWMKIHJlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKIGNhc2UgJGhvc3Rfb3MgaW4KKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgorICAgICAgcmVsb2FkX2NtZHM9ZmFsc2UKKyAgICBmaQorICAgIDs7CiAgIGRhcndpbiopCiAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KICAgICAgIHJlbG9hZF9jbWRzPSckTFRDQyAkTFRDRkxBR1MgLW5vc3RkbGliICR7d2x9LXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKQEAgLTI5NDksOCArMzE2NSw4IEBACiAgICAgZmkKICAgICA7OwogZXNhYwotX0xUX0RFQ0woW10sIFtyZWxvYWRfZmxhZ10sIFsxXSwgW0hvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXNdKWRubAotX0xUX0RFQ0woW10sIFtyZWxvYWRfY21kc10sIFsyXSlkbmwKK19MVF9UQUdERUNMKFtdLCBbcmVsb2FkX2ZsYWddLCBbMV0sIFtIb3cgdG8gY3JlYXRlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzXSlkbmwKK19MVF9UQUdERUNMKFtdLCBbcmVsb2FkX2NtZHNdLCBbMl0pZG5sCiBdKSMgX0xUX0NNRF9SRUxPQUQKIAogCkBAIC0zMDAyLDE2ICszMjE4LDE4IEBACiAgICMgQmFzZSBNU1lTL01pbkdXIGRvIG5vdCBwcm92aWRlIHRoZSAnZmlsZScgY29tbWFuZCBuZWVkZWQgYnkKICAgIyBmdW5jX3dpbjMyX2xpYmlkIHNoZWxsIGZ1bmN0aW9uLCBzbyB1c2UgYSB3ZWFrZXIgdGVzdCBiYXNlZCBvbiAnb2JqZHVtcCcsCiAgICMgdW5sZXNzIHdlIGZpbmQgJ2ZpbGUnLCBmb3IgZXhhbXBsZSBiZWNhdXNlIHdlIGFyZSBjcm9zcy1jb21waWxpbmcuCi0gIGlmICggZmlsZSAvICkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICMgZnVuY193aW4zMl9saWJpZCBhc3N1bWVzIEJTRCBubSwgc28gZGlzYWxsb3cgaXQgaWYgdXNpbmcgTVMgZHVtcGJpbi4KKyAgaWYgKCB0ZXN0ICIkbHRfY3Zfbm1faW50ZXJmYWNlIiA9ICJCU0Qgbm0iICYmIGZpbGUgLyApID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIF54ODYgYXJjaGl2ZSBpbXBvcnR8Xng4NiBETEwnCiAgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9J2Z1bmNfd2luMzJfbGliaWQnCiAgIGVsc2UKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBmaWxlIGZvcm1hdCBwZWkqLWkzODYoLiphcmNoaXRlY3R1cmU6IGkzODYpPycKKyAgICAjIEtlZXAgdGhpcyBwYXR0ZXJuIGluIHN5bmMgd2l0aCB0aGUgb25lIGluIGZ1bmNfd2luMzJfbGliaWQuCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgZmlsZSBmb3JtYXQgKHBlaSotaTM4NiguKmFyY2hpdGVjdHVyZTogaTM4Nik/fHBlLWFybS13aW5jZXxwZS14ODYtNjQpJwogICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckT0JKRFVNUCAtZicKICAgZmkKICAgOzsKIAotY2VnY2MpCitjZWdjYyopCiAgICMgdXNlIHRoZSB3ZWFrZXIgdGVzdCBiYXNlZCBvbiAnb2JqZHVtcCcuIFNlZSBtaW5ndyouCiAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IHBlLWFybS0uKmxpdHRsZSguKmFyY2hpdGVjdHVyZTogYXJtKT8nCiAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckT0JKRFVNUCAtZicKQEAgLTMwNDEsNiArMzI1OSwxMCBAQAogICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAogICA7OwogCitoYWlrdSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKIGhwdXgxMC4yMCogfCBocHV4MTEqKQogICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCiAgIGNhc2UgJGhvc3RfY3B1IGluCkBAIC0zMDQ5LDExICszMjcxLDExIEBACiAgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvaHB1eDMyL2xpYmMuc28KICAgICA7OwogICBocHBhKjY0KikKLSAgICBbbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbMC05XVswLTldWzAtOV18RUxGLVswLTldWzAtOV0pIHNoYXJlZCBvYmplY3QgZmlsZSAtIFBBLVJJU0MgWzAtOV0uWzAtOV0nXQorICAgIFtsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxFTEZbIC1dWzAtOV1bMC05XSkoLWJpdCk/KCBbTE1dU0IpPyBzaGFyZWQgb2JqZWN0KCBmaWxlKT9bLCAtXSogUEEtUklTQyBbMC05XVwuWzAtOV0nXQogICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL3BhMjBfNjQvbGliYy5zbAogICAgIDs7CiAgICopCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbWzAtOV1dW1swLTldXVtbMC05XV18UEEtUklTQ1tbMC05XV0uW1swLTldXSkgc2hhcmVkIGxpYnJhcnknCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbWzAtOV1dW1swLTldXVtbMC05XV18UEEtUklTQ1tbMC05XV1cLltbMC05XV0pIHNoYXJlZCBsaWJyYXJ5JwogICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYmMuc2wKICAgICA7OwogICBlc2FjCkBAIC0zMDc0LDggKzMyOTYsOCBAQAogICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAogICA7OwogCi0jIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCi1saW51eCogfCBrKmJzZCotZ251KQorIyBUaGlzIG11c3QgYmUgZ2xpYmMvRUxGLgorbGludXgqIHwgaypic2QqLWdudSB8IGtvcGVuc29sYXJpcyotZ251KQogICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAogICA7OwogCkBAIC0zMTUzLDYgKzMzNzUsMjEgQEAKICAgOzsKIGVzYWMKIF0pCisKK2ZpbGVfbWFnaWNfZ2xvYj0KK3dhbnRfbm9jYXNlZ2xvYj1ubworaWYgdGVzdCAiJGJ1aWxkIiA9ICIkaG9zdCI7IHRoZW4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBtaW5ndyogfCBwdzMyKikKKyAgICBpZiAoIHNob3B0IHwgZ3JlcCBub2Nhc2VnbG9iICkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICB3YW50X25vY2FzZWdsb2I9eWVzCisgICAgZWxzZQorICAgICAgZmlsZV9tYWdpY19nbG9iPWBlY2hvIGFBYkJjQ2REZUVmRmdHaEhpSWpKa0tsTG1Nbk5vT3BQcVFyUnNTdFR1VXZWd1d4WHlZelogfCAkU0VEIC1lICJzL1woLi5cKS9zXC9bW1wxXV1cL1tbXDFdXVwvZzsvZyJgCisgICAgZmkKKyAgICA7OworICBlc2FjCitmaQorCiBmaWxlX21hZ2ljX2NtZD0kbHRfY3ZfZmlsZV9tYWdpY19jbWQKIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZAogdGVzdCAteiAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAmJiBkZXBsaWJzX2NoZWNrX21ldGhvZD11bmtub3duCkBAIC0zMTYwLDcgKzMzOTcsMTEgQEAKIF9MVF9ERUNMKFtdLCBbZGVwbGlic19jaGVja19tZXRob2RdLCBbMV0sCiAgICAgW01ldGhvZCB0byBjaGVjayB3aGV0aGVyIGRlcGVuZGVudCBsaWJyYXJpZXMgYXJlIHNoYXJlZCBvYmplY3RzXSkKIF9MVF9ERUNMKFtdLCBbZmlsZV9tYWdpY19jbWRdLCBbMV0sCi0gICAgW0NvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gImZpbGVfbWFnaWMiXSkKKyAgICBbQ29tbWFuZCB0byB1c2Ugd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9ICJmaWxlX21hZ2ljIl0pCitfTFRfREVDTChbXSwgW2ZpbGVfbWFnaWNfZ2xvYl0sIFsxXSwKKyAgICBbSG93IHRvIGZpbmQgcG90ZW50aWFsIGZpbGVzIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPSAiZmlsZV9tYWdpYyJdKQorX0xUX0RFQ0woW10sIFt3YW50X25vY2FzZWdsb2JdLCBbMV0sCisgICAgW0ZpbmQgcG90ZW50aWFsIGZpbGVzIHVzaW5nIG5vY2FzZWdsb2Igd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9ICJmaWxlX21hZ2ljIl0pCiBdKSMgX0xUX0NIRUNLX01BR0lDX01FVEhPRAogCiAKQEAgLTMyMTcsNyArMzQ1OCwxOSBAQAogICBOTT0iJGx0X2N2X3BhdGhfTk0iCiBlbHNlCiAgICMgRGlkbid0IGZpbmQgYW55IEJTRCBjb21wYXRpYmxlIG5hbWUgbGlzdGVyLCBsb29rIGZvciBkdW1wYmluLgotICBBQ19DSEVDS19UT09MUyhEVU1QQklOLCBbImR1bXBiaW4gLXN5bWJvbHMiICJsaW5rIC1kdW1wIC1zeW1ib2xzIl0sIDopCisgIGlmIHRlc3QgLW4gIiREVU1QQklOIjsgdGhlbiA6CisgICAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCisgIGVsc2UKKyAgICBBQ19DSEVDS19UT09MUyhEVU1QQklOLCBbZHVtcGJpbiAibGluayAtZHVtcCJdLCA6KQorICAgIGNhc2UgYCREVU1QQklOIC1zeW1ib2xzIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSdgIGluCisgICAgKkNPRkYqKQorICAgICAgRFVNUEJJTj0iJERVTVBCSU4gLXN5bWJvbHMiCisgICAgICA7OworICAgICopCisgICAgICBEVU1QQklOPToKKyAgICAgIDs7CisgICAgZXNhYworICBmaQogICBBQ19TVUJTVChbRFVNUEJJTl0pCiAgIGlmIHRlc3QgIiREVU1QQklOIiAhPSAiOiI7IHRoZW4KICAgICBOTT0iJERVTVBCSU4iCkBAIC0zMjMwLDEzICszNDgzLDEzIEBACiBBQ19DQUNIRV9DSEVDSyhbdGhlIG5hbWUgbGlzdGVyICgkTk0pIGludGVyZmFjZV0sIFtsdF9jdl9ubV9pbnRlcmZhY2VdLAogICBbbHRfY3Zfbm1faW50ZXJmYWNlPSJCU0Qgbm0iCiAgIGVjaG8gImludCBzb21lX3ZhcmlhYmxlID0gMDsiID4gY29uZnRlc3QuJGFjX2V4dAotICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6X19vbGluZV9fOiAkYWNfY29tcGlsZVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQorICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogJGFjX2NvbXBpbGVcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKICAgKGV2YWwgIiRhY19jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECi0gIChldmFsIGVjaG8gIlwiXCRhc19tZTpfX29saW5lX186ICROTSBcXFwiY29uZnRlc3QuJGFjX29iamV4dFxcXCJcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKKyAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86ICROTSBcXFwiY29uZnRlc3QuJGFjX29iamV4dFxcXCJcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKICAgKGV2YWwgIiROTSBcImNvbmZ0ZXN0LiRhY19vYmpleHRcIiIgMj5jb25mdGVzdC5lcnIgPiBjb25mdGVzdC5vdXQpCiAgIGNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAotICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6X19vbGluZV9fOiBvdXRwdXRcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKKyAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86IG91dHB1dFwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQogICBjYXQgY29uZnRlc3Qub3V0ID4mQVNfTUVTU0FHRV9MT0dfRkQKICAgaWYgJEdSRVAgJ0V4dGVybmFsLipzb21lX3ZhcmlhYmxlJyBjb25mdGVzdC5vdXQgPiAvZGV2L251bGw7IHRoZW4KICAgICBsdF9jdl9ubV9pbnRlcmZhY2U9Ik1TIGR1bXBiaW4iCkBAIC0zMjUxLDYgKzM1MDQsNjcgQEAKIGRubCBBQ19ERUZVTihbQU1fUFJPR19OTV0sIFtdKQogZG5sIEFDX0RFRlVOKFtBQ19QUk9HX05NXSwgW10pCiAKKyMgX0xUX0NIRUNLX1NIQVJFRExJQl9GUk9NX0xJTktMSUIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaG93IHRvIGRldGVybWluZSB0aGUgbmFtZSBvZiB0aGUgc2hhcmVkIGxpYnJhcnkKKyMgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgbGluayBsaWJyYXJ5LgorIyAgLS0gUE9SVE1FIGZpbGwgaW4gd2l0aCB0aGUgZHluYW1pYyBsaWJyYXJ5IGNoYXJhY3RlcmlzdGljcworbTRfZGVmdW4oW19MVF9DSEVDS19TSEFSRURMSUJfRlJPTV9MSU5LTElCXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pCittNF9yZXF1aXJlKFtfTFRfREVDTF9PQkpEVU1QXSkKK200X3JlcXVpcmUoW19MVF9ERUNMX0RMTFRPT0xdKQorQUNfQ0FDSEVfQ0hFQ0soW2hvdyB0byBhc3NvY2lhdGUgcnVudGltZSBhbmQgbGluayBsaWJyYXJpZXNdLAorbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQsCitbbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9J3Vua25vd24nCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgIyB0d28gZGlmZmVyZW50IHNoZWxsIGZ1bmN0aW9ucyBkZWZpbmVkIGluIGx0bWFpbi5zaAorICAjIGRlY2lkZSB3aGljaCB0byB1c2UgYmFzZWQgb24gY2FwYWJpbGl0aWVzIG9mICRETExUT09MCisgIGNhc2UgYCRETExUT09MIC0taGVscCAyPiYxYCBpbgorICAqLS1pZGVudGlmeS1zdHJpY3QqKQorICAgIGx0X2N2X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPWZ1bmNfY3lnbWluZ19kbGxfZm9yX2ltcGxpYgorICAgIDs7CisgICopCisgICAgbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9ZnVuY19jeWdtaW5nX2RsbF9mb3JfaW1wbGliX2ZhbGxiYWNrCisgICAgOzsKKyAgZXNhYworICA7OworKikKKyAgIyBmYWxsYmFjazogYXNzdW1lIGxpbmtsaWIgSVMgc2hhcmVkbGliCisgIGx0X2N2X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPSIkRUNITyIKKyAgOzsKK2VzYWMKK10pCitzaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD0kbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQKK3Rlc3QgLXogIiRzaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZCIgJiYgc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9JEVDSE8KKworX0xUX0RFQ0woW10sIFtzaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZF0sIFsxXSwKKyAgICBbQ29tbWFuZCB0byBhc3NvY2lhdGUgc2hhcmVkIGFuZCBsaW5rIGxpYnJhcmllc10pCitdKSMgX0xUX0NIRUNLX1NIQVJFRExJQl9GUk9NX0xJTktMSUIKKworCisjIF9MVF9QQVRIX01BTklGRVNUX1RPT0wKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBsb2NhdGUgdGhlIG1hbmlmZXN0IHRvb2wKK200X2RlZnVuKFtfTFRfUEFUSF9NQU5JRkVTVF9UT09MXSwKK1tBQ19DSEVDS19UT09MKE1BTklGRVNUX1RPT0wsIG10LCA6KQordGVzdCAteiAiJE1BTklGRVNUX1RPT0wiICYmIE1BTklGRVNUX1RPT0w9bXQKK0FDX0NBQ0hFX0NIRUNLKFtpZiAkTUFOSUZFU1RfVE9PTCBpcyBhIG1hbmlmZXN0IHRvb2xdLCBbbHRfY3ZfcGF0aF9tYWluZmVzdF90b29sXSwKKyAgW2x0X2N2X3BhdGhfbWFpbmZlc3RfdG9vbD1ubworICBlY2hvICIkYXNfbWU6JExJTkVOTzogJE1BTklGRVNUX1RPT0wgJy0/JyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAkTUFOSUZFU1RfVE9PTCAnLT8nIDI+Y29uZnRlc3QuZXJyID4gY29uZnRlc3Qub3V0CisgIGNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorICBpZiAkR1JFUCAnTWFuaWZlc3QgVG9vbCcgY29uZnRlc3Qub3V0ID4gL2Rldi9udWxsOyB0aGVuCisgICAgbHRfY3ZfcGF0aF9tYWluZmVzdF90b29sPXllcworICBmaQorICBybSAtZiBjb25mdGVzdCpdKQoraWYgdGVzdCAieCRsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2wiICE9IHh5ZXM7IHRoZW4KKyAgTUFOSUZFU1RfVE9PTD06CitmaQorX0xUX0RFQ0woW10sIFtNQU5JRkVTVF9UT09MXSwgWzFdLCBbTWFuaWZlc3QgdG9vbF0pZG5sCitdKSMgX0xUX1BBVEhfTUFOSUZFU1RfVE9PTAorCiAKICMgTFRfTElCX00KICMgLS0tLS0tLS0KQEAgLTMyNTksNyArMzU3Myw3IEBACiBbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAogTElCTT0KIGNhc2UgJGhvc3QgaW4KLSotKi1iZW9zKiB8ICotKi1jeWd3aW4qIHwgKi0qLXB3MzIqIHwgKi0qLWRhcndpbiopCisqLSotYmVvcyogfCAqLSotY2VnY2MqIHwgKi0qLWN5Z3dpbiogfCAqLSotaGFpa3UqIHwgKi0qLXB3MzIqIHwgKi0qLWRhcndpbiopCiAgICMgVGhlc2Ugc3lzdGVtIGRvbid0IGhhdmUgbGlibSwgb3IgZG9uJ3QgbmVlZCBpdAogICA7OwogKi1uY3Itc3lzdjQuMyopCkBAIC0zMjg3LDcgKzM2MDEsMTIgQEAKIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0KIAogaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPScgLWZuby1idWlsdGluJworICBjYXNlICRjY19iYXNlbmFtZSBpbgorICBudmNjKikKKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9JyAtWGNvbXBpbGVyIC1mbm8tYnVpbHRpbicgOzsKKyAgKikKKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9JyAtZm5vLWJ1aWx0aW4nIDs7CisgIGVzYWMKIAogICBfTFRfQ09NUElMRVJfT1BUSU9OKFtpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9uc10sCiAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMsCkBAIC0zMzA0LDYgKzM2MjMsNyBAQAogbTRfZGVmdW4oW19MVF9DTURfR0xPQkFMX1NZTUJPTFNdLAogW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKIEFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19BV0tdKWRubAogQUNfUkVRVUlSRShbTFRfUEFUSF9OTV0pZG5sCiBBQ19SRVFVSVJFKFtMVF9QQVRIX0xEXSlkbmwKIG00X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCkBAIC0zMzcxLDggKzM2OTEsOCBAQAogbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBpbnQgXDEoKTsvcCcgLWUgJ3MvXiRzeW1jb2RlKiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKIAogIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gc3ltYm9sIG5hbWUgYW5kIHN5bWJvbCBhZGRyZXNzCi1sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0ic2VkIC1uIC1lICdzL146IFwoW1teIF1dKlwpICQvICB7XFxcIlwxXFxcIiwgKHZvaWQgKikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbW14gXV0qXCkgXChbW14gXV0qXCkkLyAge1wiXDJcIiwgKHZvaWQgKikgXCZcMn0sL3AnIgotbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeD0ic2VkIC1uIC1lICdzL146IFwoW1teIF1dKlwpICQvICB7XFxcIlwxXFxcIiwgKHZvaWQgKikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbW14gXV0qXCkgXChsaWJbW14gXV0qXCkkLyAge1wiXDJcIiwgKHZvaWQgKikgXCZcMn0sL3AnIC1lICdzL14kc3ltY29kZSogXChbW14gXV0qXCkgXChbW14gXV0qXCkkLyAge1wibGliXDJcIiwgKHZvaWQgKikgXCZcMn0sL3AnIgorbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9InNlZCAtbiAtZSAncy9eOiBcKFtbXiBdXSpcKVtbIF1dKiQvICB7XFxcIlwxXFxcIiwgKHZvaWQgKikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbW14gXV0qXCkgXChbW14gXV0qXCkkLyAge1wiXDJcIiwgKHZvaWQgKikgXCZcMn0sL3AnIgorbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeD0ic2VkIC1uIC1lICdzL146IFwoW1teIF1dKlwpW1sgXV0qJC8gIHtcXFwiXDFcXFwiLCAodm9pZCAqKSAwfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFtbXiBdXSpcKSBcKGxpYltbXiBdXSpcKSQvICB7XCJcMlwiLCAodm9pZCAqKSBcJlwyfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFtbXiBdXSpcKSBcKFtbXiBdXSpcKSQvICB7XCJsaWJcMlwiLCAodm9pZCAqKSBcJlwyfSwvcCciCiAKICMgSGFuZGxlIENSTEYgaW4gbWluZ3cgdG9vbCBjaGFpbgogb3B0X2NyPQpAQCAtMzM5Niw2ICszNzE2LDcgQEAKICAgICAjIHdoaWNoIHN0YXJ0IHdpdGggQCBvciA/LgogICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9IiRBV0sgWyciXAogIiAgICAge2xhc3Rfc2VjdGlvbj1zZWN0aW9uOyBzZWN0aW9uPVwkIDN9OyJcCisiICAgICAvXkNPRkYgU1lNQk9MIFRBQkxFL3tmb3IoaSBpbiBoaWRlKSBkZWxldGUgaGlkZVtpXX07IlwKICIgICAgIC9TZWN0aW9uIGxlbmd0aCAuKiNyZWxvY3MuKihwaWNrIGFueSkve2hpZGVbbGFzdF9zZWN0aW9uXT0xfTsiXAogIiAgICAgXCQgMCF+L0V4dGVybmFsICpcfC97bmV4dH07IlwKICIgICAgIC8gMCsgVU5ERUYgL3tuZXh0fTsgLyBVTkRFRiBcKFtefF1cKSooKS97bmV4dH07IlwKQEAgLTM0MDgsNiArMzcyOSw3IEBACiAgIGVsc2UKICAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qW1sJIF1dXCgkc3ltY29kZSRzeW1jb2RlKlwpW1sJIF1dW1sJIF1dKiRhY19zeW1wcmZ4JHN5bXBhdCRvcHRfY3IkLyRzeW14ZnJtL3AnIgogICBmaQorICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSB8IHNlZCAnLyBfX2dudV9sdG8vZCciCiAKICAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCiAgIHBpcGVfd29ya3M9bm8KQEAgLTM0MjksNyArMzc1MSw3IEBACiAgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCiAgICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCiAgICAgbmxpc3Q9Y29uZnRlc3Qubm0KLSAgICBpZiBBQ19UUllfRVZBTChOTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRubGlzdCkgJiYgdGVzdCAtcyAiJG5saXN0IjsgdGhlbgorICAgIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiBcPiAkbmxpc3QpICYmIHRlc3QgLXMgIiRubGlzdCI7IHRoZW4KICAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCiAgICAgICBpZiBzb3J0ICIkbmxpc3QiIHwgdW5pcSA+ICIkbmxpc3QiVDsgdGhlbgogCW12IC1mICIkbmxpc3QiVCAiJG5saXN0IgpAQCAtMzQ0MSw2ICszNzYzLDE4IEBACiAgICAgICBpZiAkR1JFUCAnIG5tX3Rlc3RfdmFyJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgogCWlmICRHUkVQICcgbm1fdGVzdF9mdW5jJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgogCSAgY2F0IDw8X0xUX0VPRiA+IGNvbmZ0ZXN0LiRhY19leHQKKy8qIEtlZXAgdGhpcyBjb2RlIGluIHN5bmMgYmV0d2VlbiBsaWJ0b29sLm00LCBsdG1haW4sIGx0X3N5c3RlbS5oLCBhbmQgdGVzdHMuICAqLworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkKKy8qIERBVEEgaW1wb3J0cyBmcm9tIERMTHMgb24gV0lOMzIgY29uJ3QgYmUgY29uc3QsIGJlY2F1c2UgcnVudGltZQorICAgcmVsb2NhdGlvbnMgYXJlIHBlcmZvcm1lZCAtLSBzZWUgbGQncyBkb2N1bWVudGF0aW9uIG9uIHBzZXVkby1yZWxvY3MuICAqLworIyBkZWZpbmUgTFRAJnRAX0RMU1lNX0NPTlNUCisjZWxpZiBkZWZpbmVkKF9fb3NmX18pCisvKiBUaGlzIHN5c3RlbSBkb2VzIG5vdCBjb3BlIHdlbGwgd2l0aCByZWxvY2F0aW9ucyBpbiBjb25zdCBkYXRhLiAgKi8KKyMgZGVmaW5lIExUQCZ0QF9ETFNZTV9DT05TVAorI2Vsc2UKKyMgZGVmaW5lIExUQCZ0QF9ETFNZTV9DT05TVCBjb25zdAorI2VuZGlmCisKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYKQEAgLTM0NTIsNyArMzc4Niw3IEBACiAJICBjYXQgPDxfTFRfRU9GID4+IGNvbmZ0ZXN0LiRhY19leHQKIAogLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICAqLwotY29uc3Qgc3RydWN0IHsKK0xUQCZ0QF9ETFNZTV9DT05TVCBzdHJ1Y3QgewogICBjb25zdCBjaGFyICpuYW1lOwogICB2b2lkICAgICAgICphZGRyZXNzOwogfQpAQCAtMzQ3OCwxNSArMzgxMiwxNSBAQAogX0xUX0VPRgogCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KIAkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRzdG0uJGFjX29iamV4dAotCSAgbHRfc2F2ZV9MSUJTPSIkTElCUyIKLQkgIGx0X3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorCSAgbHRfZ2xvYnN5bV9zYXZlX0xJQlM9JExJQlMKKwkgIGx0X2dsb2JzeW1fc2F2ZV9DRkxBR1M9JENGTEFHUwogCSAgTElCUz0iY29uZnRzdG0uJGFjX29iamV4dCIKIAkgIENGTEFHUz0iJENGTEFHUyRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSkiCiAJICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCiAJICAgIHBpcGVfd29ya3M9eWVzCiAJICBmaQotCSAgTElCUz0iJGx0X3NhdmVfTElCUyIKLQkgIENGTEFHUz0iJGx0X3NhdmVfQ0ZMQUdTIgorCSAgTElCUz0kbHRfZ2xvYnN5bV9zYXZlX0xJQlMKKwkgIENGTEFHUz0kbHRfZ2xvYnN5bV9zYXZlX0NGTEFHUwogCWVsc2UKIAkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkbmxpc3QiID4mQVNfTUVTU0FHRV9MT0dfRkQKIAlmaQpAQCAtMzUxOSw2ICszODUzLDEzIEBACiAgIEFDX01TR19SRVNVTFQob2spCiBmaQogCisjIFJlc3BvbnNlIGZpbGUgc3VwcG9ydC4KK2lmIHRlc3QgIiRsdF9jdl9ubV9pbnRlcmZhY2UiID0gIk1TIGR1bXBiaW4iOyB0aGVuCisgIG5tX2ZpbGVfbGlzdF9zcGVjPSdAJworZWxpZiAkTk0gLS1oZWxwIDI+L2Rldi9udWxsIHwgZ3JlcCAnW1tAXV1GSUxFJyA+L2Rldi9udWxsOyB0aGVuCisgIG5tX2ZpbGVfbGlzdF9zcGVjPSdAJworZmkKKwogX0xUX0RFQ0woW2dsb2JhbF9zeW1ib2xfcGlwZV0sIFtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlXSwgWzFdLAogICAgIFtUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzXSkKIF9MVF9ERUNMKFtnbG9iYWxfc3ltYm9sX3RvX2NkZWNsXSwgW2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsXSwgWzFdLApAQCAtMzUyOSw2ICszODcwLDggQEAKIF9MVF9ERUNMKFtnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXhdLAogICAgIFtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4XSwgWzFdLAogICAgIFtUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIgd2hlbiBsaWIgcHJlZml4IGlzIG5lZWRlZF0pCitfTFRfREVDTChbXSwgW25tX2ZpbGVfbGlzdF9zcGVjXSwgWzFdLAorICAgIFtTcGVjaWZ5IGZpbGVuYW1lIGNvbnRhaW5pbmcgaW5wdXQgZmlsZXMgZm9yICROTV0pCiBdKSAjIF9MVF9DTURfR0xPQkFMX1NZTUJPTFMKIAogCkBAIC0zNTQwLDcgKzM4ODMsNiBAQAogX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQogX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPQogCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDXSkKIG00X2lmKFskMV0sIFtDWFhdLCBbCiAgICMgQysrIHNwZWNpZmljIGNhc2VzIGZvciBwaWMsIHN0YXRpYywgd2wsIGV0Yy4KICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KQEAgLTM1OTEsNiArMzkzMywxMSBAQAogICAgICAgIyBESkdQUCBkb2VzIG5vdCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMgYXQgYWxsCiAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CiAgICAgICA7OworICAgIGhhaWt1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBIYWlrdS4KKyAgICAgICMgVGhlICItc3RhdGljIiBmbGFnIGV4aXN0cywgYnV0IGlzIGJyb2tlbi4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0KKyAgICAgIDs7CiAgICAgaW50ZXJpeFtbMy05XV0qKQogICAgICAgIyBJbnRlcml4IDMueCBnY2MgLWZwaWMvLWZQSUMgb3B0aW9ucyBnZW5lcmF0ZSBicm9rZW4gY29kZS4KICAgICAgICMgSW5zdGVhZCwgd2UgcmVsb2NhdGUgc2hhcmVkIGxpYnJhcmllcyBhdCBydW50aW1lLgpAQCAtMzY0MCw2ICszOTg3LDEyIEBACiAJICA7OwogCWVzYWMKIAk7OworICAgICAgbWluZ3cqIHwgY3lnd2luKiB8IG9zMiogfCBwdzMyKiB8IGNlZ2NjKikKKwkjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisJIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKwltNF9pZihbJDFdLCBbR0NKXSwgW10sCisJICBbX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctRERMTF9FWFBPUlQnXSkKKwk7OwogICAgICAgZGd1eCopCiAJY2FzZSAkY2NfYmFzZW5hbWUgaW4KIAkgIGVjKysqKQpAQCAtMzY5Niw3ICs0MDQ5LDcgQEAKIAkgICAgOzsKIAllc2FjCiAJOzsKLSAgICAgIGxpbnV4KiB8IGsqYnNkKi1nbnUpCisgICAgICBsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCiAJY2FzZSAkY2NfYmFzZW5hbWUgaW4KIAkgIEtDQyopCiAJICAgICMgS0FJIEMrKyBDb21waWxlcgpAQCAtMzcyOSw4ICs0MDgyLDggQEAKIAkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQogCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJwogCSAgICA7OwotCSAgeGxjKiB8IHhsQyopCi0JICAgICMgSUJNIFhMIDguMCBvbiBQUEMKKwkgIHhsYyogfCB4bEMqIHwgYmd4bFtbY0NdXSogfCBtcGl4bFtbY0NdXSopCisJICAgICMgSUJNIFhMIDguMCwgOS4wIG9uIFBQQyBhbmQgQmx1ZUdlbmUKIAkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCiAJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXFwaWMnCiAJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXFzdGF0aWNsaW5rJwpAQCAtMzc5Miw3ICs0MTQ1LDcgQEAKIAk7OwogICAgICAgc29sYXJpcyopCiAJY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIENDKikKKwkgIENDKiB8IHN1bkNDKikKIAkgICAgIyBTdW4gQysrIDQuMiwgNS54IGFuZCBDZW50ZXJsaW5lIEMrKwogCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJwogCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwpAQCAtMzg5Niw2ICs0MjQ5LDEyIEBACiAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mbm8tY29tbW9uJwogICAgICAgOzsKIAorICAgIGhhaWt1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBIYWlrdS4KKyAgICAgICMgVGhlICItc3RhdGljIiBmbGFnIGV4aXN0cywgYnV0IGlzIGJyb2tlbi4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0KKyAgICAgIDs7CisKICAgICBocHV4KikKICAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciA2NC1iaXQgUEEgSFAtVVgsIGJ1dCBub3QgZm9yIDMyLWJpdAogICAgICAgIyBQQSBIUC1VWC4gIE9uIElBNjQgSFAtVVgsIFBJQyBpcyB0aGUgZGVmYXVsdCBidXQgdGhlIHBpYyBmbGFnCkBAIC0zOTM4LDYgKzQyOTcsMTUgQEAKICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCiAgICAgICA7OwogICAgIGVzYWMKKworICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgbnZjYyopICMgQ3VkYSBDb21waWxlciBEcml2ZXIgMi4yCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVhsaW5rZXIgJworICAgICAgaWYgdGVzdCAtbiAiJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSI7IHRoZW4KKyAgICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSItWGNvbXBpbGVyICRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkiCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCiAgIGVsc2UKICAgICAjIFBPUlRNRSBDaGVjayBmb3IgZmxhZyB0byBwYXNzIGxpbmtlciBmbGFncyB0aHJvdWdoIHRoZSBzeXN0ZW0gY29tcGlsZXIuCiAgICAgY2FzZSAkaG9zdF9vcyBpbgpAQCAtMzk4MCw3ICs0MzQ4LDcgQEAKICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCiAgICAgICA7OwogCi0gICAgbGludXgqIHwgaypic2QqLWdudSkKKyAgICBsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCiAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgogICAgICAgIyBvbGQgSW50ZWwgZm9yIHg4Nl82NCB3aGljaCBzdGlsbCBzdXBwb3J0ZWQgLUtQSUMuCiAgICAgICBlY2MqKQpAQCAtNDAwMSw3ICs0MzY5LDEzIEBACiAJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctLXNoYXJlZCcKIAlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy0tc3RhdGljJwogCTs7Ci0gICAgICBwZ2NjKiB8IHBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KikKKyAgICAgIG5hZ2ZvciopCisJIyBOQUcgRm9ydHJhbiBjb21waWxlcgorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsLVdsLCwnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctUElDJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJOzsKKyAgICAgIHBnY2MqIHwgcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqIHwgcGdmb3J0cmFuKikKICAgICAgICAgIyBQb3J0bGFuZCBHcm91cCBjb21waWxlcnMgKCpub3QqIHRoZSBQZW50aXVtIGdjYyBjb21waWxlciwKIAkjIHdoaWNoIGxvb2tzIHRvIGJlIGEgZGVhZCBwcm9qZWN0KQogCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwpAQCAtNDAxMywyNSArNDM4Nyw0MCBAQAogICAgICAgICAjIEFsbCBBbHBoYSBjb2RlIGlzIFBJQy4KICAgICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKICAgICAgICAgOzsKLSAgICAgIHhsKikKLQkjIElCTSBYTCBDIDguMC9Gb3J0cmFuIDEwLjEgb24gUFBDCisgICAgICB4bCogfCBiZ3hsKiB8IGJnZiogfCBtcGl4bCopCisJIyBJQk0gWEwgQyA4LjAvRm9ydHJhbiAxMC4xLCAxMS4xIG9uIFBQQyBhbmQgQmx1ZUdlbmUKIAlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKIAlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1xcGljJwogCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXFzdGF0aWNsaW5rJwogCTs7CiAgICAgICAqKQogCWNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorCSpTdW5cIENlcmVzXCBGb3J0cmFuKiB8ICpTdW4qRm9ydHJhbipcIFtbMS03XV0uKiB8ICpTdW4qRm9ydHJhbipcIDguW1swLTNdXSopCisJICAjIFN1biBGb3J0cmFuIDguMyBwYXNzZXMgYWxsIHVucmVjb2duaXplZCBmbGFncyB0byB0aGUgbGlua2VyCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPScnCisJICA7OworCSpTdW5cIEYqIHwgKlN1bipGb3J0cmFuKikKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1Rb3B0aW9uIGxkICcKKwkgIDs7CiAJKlN1blwgQyopCiAJICAjIFN1biBDIDUuOQogCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKIAkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCiAJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKIAkgIDs7Ci0JKlN1blwgRiopCi0JICAjIFN1biBGb3J0cmFuIDguMyBwYXNzZXMgYWxsIHVucmVjb2duaXplZCBmbGFncyB0byB0aGUgbGlua2VyCi0JICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworICAgICAgICAqSW50ZWwqXCBbW0NGXV0qQ29tcGlsZXIqKQorCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworCSAgOzsKKwkqUG9ydGxhbmRcIEdyb3VwKikKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZnBpYycKIAkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCi0JICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nJwogCSAgOzsKIAllc2FjCiAJOzsKQEAgLTQwNjMsNyArNDQ1Miw3IEBACiAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJwogICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICBmNzcqIHwgZjkwKiB8IGY5NSopCisgICAgICBmNzcqIHwgZjkwKiB8IGY5NSogfCBzdW5mNzcqIHwgc3VuZjkwKiB8IHN1bmY5NSopCiAJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1Rb3B0aW9uIGxkICc7OwogICAgICAgKikKIAlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCc7OwpAQCAtNDEyMCw5ICs0NTA5LDExIEBACiAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSIkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpQCZ0QG00X2lmKFskMV0sW10sWyAtRFBJQ10sW200X2lmKFskMV0sW0NYWF0sWyAtRFBJQ10sW10pXSkiCiAgICAgOzsKIGVzYWMKLUFDX01TR19SRVNVTFQoWyRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSldKQotX0xUX1RBR0RFQ0woW3dsXSwgW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbMV0sCi0JW0hvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXJdKQorCitBQ19DQUNIRV9DSEVDSyhbZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUNdLAorICBbX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX3BpYywgJDEpXSwKKyAgW19MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9waWMsICQxKT0kX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpXSkKK19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0kX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX3BpYywgJDEpCiAKICMKICMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KQEAgLTQxNDEsNiArNDUzMiw4IEBACiBfTFRfVEFHREVDTChbcGljX2ZsYWddLCBbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbMV0sCiAJW0FkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0c10pCiAKK19MVF9UQUdERUNMKFt3bF0sIFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgWzFdLAorCVtIb3cgdG8gcGFzcyBhIGxpbmtlciBmbGFnIHRocm91Z2ggdGhlIGNvbXBpbGVyXSkKICMKICMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBzdGF0aWMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KICMKQEAgLTQxNjEsNiArNDU1NCw3IEBACiBtNF9kZWZ1bihbX0xUX0xJTktFUl9TSExJQlNdLAogW0FDX1JFUVVJUkUoW0xUX1BBVEhfTERdKWRubAogQUNfUkVRVUlSRShbTFRfUEFUSF9OTV0pZG5sCittNF9yZXF1aXJlKFtfTFRfUEFUSF9NQU5JRkVTVF9UT09MXSlkbmwKIG00X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAogbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKWRubAogbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKQEAgLTQxNjksMjcgKzQ1NjMsMzcgQEAKIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKIG00X2lmKFskMV0sIFtDWFhdLCBbCiAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgIF9MVF9UQUdWQVIoZXhjbHVkZV9leHBzeW1zLCAkMSk9WydfR0xPQkFMX09GRlNFVF9UQUJMRV98X0dMT0JBTF9fRltJRF1fLionXQogICBjYXNlICRob3N0X29zIGluCiAgIGFpeFtbNC05XV0qKQogICAgICMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgogICAgICMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KKyAgICAjIEFsc28sIEFJWCBubSB0cmVhdHMgd2VhayBkZWZpbmVkIHN5bWJvbHMgbGlrZSBvdGhlciBnbG9iYWwgZGVmaW5lZAorICAgICMgc3ltYm9scywgd2hlcmVhcyBHTlUgbm0gbWFya3MgdGhlbSBhcyAiVyIuCiAgICAgaWYgJE5NIC1WIDI+JjEgfCAkR1JFUCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpKSAmJiAoW3N1YnN0cl0oXCQgMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQgMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQgMiA9PSAiVCIpIHx8IChcJCAyID09ICJEIikgfHwgKFwkIDIgPT0gIkIiKSB8fCAoXCQgMiA9PSAiVyIpKSAmJiAoW3N1YnN0cl0oXCQgMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQgMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKICAgICBlbHNlCiAgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NIC1CQ3BnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpKSAmJiAoW3N1YnN0cl0oXCQgMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQgMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKICAgICBmaQogICAgIDs7CiAgIHB3MzIqKQogICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSIkbHRkbGxfY21kcyIKLSAgOzsKKyAgICA7OwogICBjeWd3aW4qIHwgbWluZ3cqIHwgY2VnY2MqKQotICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW1tCQ0RHUlNdXVtbIF1dL3MvLipbWyBdXVwoW1teIF1dKlwpL1wxIERBVEEvOy9eLipbWyBdXV9fbm1fXy9zL14uKltbIF1dX19ubV9fXChbW14gXV0qXClbWyBdXVtbXiBdXSovXDEgREFUQS87L15JW1sgXV0vZDsvXltbQUlUV11dW1sgXV0vcy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKLSAgOzsKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgIGNsKikKKyAgICAgIF9MVF9UQUdWQVIoZXhjbHVkZV9leHBzeW1zLCAkMSk9J19OVUxMX0lNUE9SVF9ERVNDUklQVE9SfF9JTVBPUlRfREVTQ1JJUFRPUl8uKicKKyAgICAgIDs7CisgICAgKikKKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW1tCQ0RHUlNdXVtbIF1dL3MvLipbWyBdXVwoW1teIF1dKlwpL1wxIERBVEEvO3MvXi4qW1sgXV1fX25tX19cKFtbXiBdXSpcKVtbIF1dW1teIF1dKi9cMSBEQVRBLzsvXklbWyBdXS9kOy9eW1tBSVRXXV1bWyBdXS9zLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICAgICAgX0xUX1RBR1ZBUihleGNsdWRlX2V4cHN5bXMsICQxKT1bJ1tfXStHTE9CQUxfT0ZGU0VUX1RBQkxFX3xbX10rR0xPQkFMX19bRklEXV8uKnxbX10raGVhZF9bQS1aYS16MC05X10rX2RsbHxbQS1aYS16MC05X10rX2RsbF9pbmFtZSddCisgICAgICA7OworICAgIGVzYWMKKyAgICA7OwogICAqKQogICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCi0gIDs7CisgICAgOzsKICAgZXNhYwotICBfTFRfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpPVsnX0dMT0JBTF9PRkZTRVRfVEFCTEVffF9HTE9CQUxfX0ZbSURdXy4qJ10KIF0sIFsKICAgcnVucGF0aF92YXI9CiAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KQEAgLTQyMDQsNyArNDYwOCw2IEBACiAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT1ubwogICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KLSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9CiAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQogICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT1ubwogICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT11bnN1cHBvcnRlZApAQCAtNDI1Miw3ICs0NjU1LDMzIEBACiAgIGVzYWMKIAogICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcworCisgICMgT24gc29tZSB0YXJnZXRzLCBHTlUgbGQgaXMgY29tcGF0aWJsZSBlbm91Z2ggd2l0aCB0aGUgbmF0aXZlIGxpbmtlcgorICAjIHRoYXQgd2UncmUgYmV0dGVyIG9mZiB1c2luZyB0aGUgbmF0aXZlIGludGVyZmFjZSBmb3IgYm90aC4KKyAgbHRfdXNlX2dudV9sZF9pbnRlcmZhY2U9bm8KICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeCopCisJIyBUaGUgQUlYIHBvcnQgb2YgR05VIGxkIGhhcyBhbHdheXMgYXNwaXJlZCB0byBjb21wYXRpYmlsaXR5CisJIyB3aXRoIHRoZSBuYXRpdmUgbGlua2VyLiAgSG93ZXZlciwgYXMgdGhlIHdhcm5pbmcgaW4gdGhlIEdOVSBsZAorCSMgYmxvY2sgc2F5cywgdmVyc2lvbnMgYmVmb3JlIDIuMTkuNSogY291bGRuJ3QgcmVhbGx5IGNyZWF0ZSB3b3JraW5nCisJIyBzaGFyZWQgbGlicmFyaWVzLCByZWdhcmRsZXNzIG9mIHRoZSBpbnRlcmZhY2UgdXNlZC4KKwljYXNlIGAkTEQgLXYgMj4mMWAgaW4KKwkgICpcIFwoR05VXCBCaW51dGlsc1wpXCAyLjE5LjUqKSA7OworCSAgKlwgXChHTlVcIEJpbnV0aWxzXClcIDIuW1syLTldXSopIDs7CisJICAqXCBcKEdOVVwgQmludXRpbHNcKVwgW1szLTldXSopIDs7CisJICAqKQorCSAgICBsdF91c2VfZ251X2xkX2ludGVyZmFjZT15ZXMKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgICopCisJbHRfdXNlX2dudV9sZF9pbnRlcmZhY2U9eWVzCisJOzsKKyAgICBlc2FjCisgIGZpCisKKyAgaWYgdGVzdCAiJGx0X3VzZV9nbnVfbGRfaW50ZXJmYWNlIiA9IHllczsgdGhlbgogICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5CiAgICAgd2xhcmM9JyR7d2x9JwogCkBAIC00MjcwLDYgKzQ2OTksNyBAQAogICAgIGZpCiAgICAgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPW5vCiAgICAgY2FzZSBgJExEIC12IDI+JjFgIGluCisgICAgICAqR05VXCBnb2xkKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OwogICAgICAgKlwgW1swMV1dLiogfCAqXCAyLltbMC05XV0uKiB8ICpcIDIuMTAuKikgOzsgIyBjYXRjaCB2ZXJzaW9ucyA8IDIuMTEKICAgICAgICpcIDIuMTEuOTMuMC4yXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgUkg3LjMgLi4uCiAgICAgICAqXCAyLjExLjkyLjAuMTJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBNYW5kcmFrZSA4LjIgLi4uCkBAIC00Mjg1LDExICs0NzE1LDEyIEBACiAJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwogCWNhdCA8PF9MVF9FT0YgMT4mMgogCi0qKiogV2FybmluZzogdGhlIEdOVSBsaW5rZXIsIGF0IGxlYXN0IHVwIHRvIHJlbGVhc2UgMi45LjEsIGlzIHJlcG9ydGVkCisqKiogV2FybmluZzogdGhlIEdOVSBsaW5rZXIsIGF0IGxlYXN0IHVwIHRvIHJlbGVhc2UgMi4xOSwgaXMgcmVwb3J0ZWQKICoqKiB0byBiZSB1bmFibGUgdG8gcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gQUlYLgogKioqIFRoZXJlZm9yZSwgbGlidG9vbCBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgSWYgeW91Ci0qKiogcmVhbGx5IGNhcmUgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIHlvdSBtYXkgd2FudCB0byBtb2RpZnkgeW91ciBQQVRICi0qKiogc28gdGhhdCBhIG5vbi1HTlUgbGlua2VyIGlzIGZvdW5kLCBhbmQgdGhlbiByZXN0YXJ0LgorKioqIHJlYWxseSBjYXJlIGZvciBzaGFyZWQgbGlicmFyaWVzLCB5b3UgbWF5IHdhbnQgdG8gaW5zdGFsbCBiaW51dGlscworKioqIDIuMjAgb3IgYWJvdmUsIG9yIG1vZGlmeSB5b3VyIFBBVEggc28gdGhhdCBhIG5vbi1HTlUgbGlua2VyIGlzIGZvdW5kLgorKioqIFlvdSB3aWxsIHRoZW4gbmVlZCB0byByZXN0YXJ0IHRoZSBjb25maWd1cmF0aW9uIHByb2Nlc3MuCiAKIF9MVF9FT0YKICAgICAgIGZpCkBAIC00MzI1LDEwICs0NzU2LDEyIEBACiAgICAgICAjIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAogICAgICAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWFsbC1zeW1ib2xzJwogICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCiAgICAgICBfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCiAgICAgICBfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKLSAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW1tCQ0RHUlNdXVtbIF1dL3MvLipbWyBdXVwoW1teIF1dKlwpL1wxIERBVEEvJ1wnJyB8ICRTRUQgLWUgJ1wnJy9eW1tBSVRXXV1bWyBdXS9zLy4qW1sgXV0vLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW1tCQ0RHUlNdXVtbIF1dL3MvLipbWyBdXVwoW1teIF1dKlwpL1wxIERBVEEvO3MvXi4qW1sgXV1fX25tX19cKFtbXiBdXSpcKVtbIF1dW1teIF1dKi9cMSBEQVRBLzsvXklbWyBdXS9kOy9eW1tBSVRXXV1bWyBdXS9zLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICAgICAgX0xUX1RBR1ZBUihleGNsdWRlX2V4cHN5bXMsICQxKT1bJ1tfXStHTE9CQUxfT0ZGU0VUX1RBQkxFX3xbX10rR0xPQkFMX19bRklEXV8uKnxbX10raGVhZF9bQS1aYS16MC05X10rX2RsbHxbQS1aYS16MC05X10rX2RsbF9pbmFtZSddCiAKICAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCkBAIC00MzQ2LDYgKzQ3NzksMTEgQEAKICAgICAgIGZpCiAgICAgICA7OwogCisgICAgaGFpa3UqKQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgICAgIDs7CisKICAgICBpbnRlcml4W1szLTldXSopCiAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCiAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwpAQCAtNDM2MSw3ICs0Nzk5LDcgQEAKICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJwogICAgICAgOzsKIAotICAgIGdudSogfCBsaW51eCogfCB0cGYqIHwgaypic2QqLWdudSkKKyAgICBnbnUqIHwgbGludXgqIHwgdHBmKiB8IGsqYnNkKi1nbnUgfCBrb3BlbnNvbGFyaXMqLWdudSkKICAgICAgIHRtcF9kaWV0PW5vCiAgICAgICBpZiB0ZXN0ICIkaG9zdF9vcyIgPSBsaW51eC1kaWV0bGliYzsgdGhlbgogCWNhc2UgJGNjX2Jhc2VuYW1lIGluCkBAIC00MzcxLDE1ICs0ODA5LDE2IEBACiAgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkRUdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbCBcCiAJICYmIHRlc3QgIiR0bXBfZGlldCIgPSBubwogICAgICAgdGhlbgotCXRtcF9hZGRmbGFnPQorCXRtcF9hZGRmbGFnPScgJHBpY19mbGFnJwogCXRtcF9zaGFyZWRmbGFnPSctc2hhcmVkJwogCWNhc2UgJGNjX2Jhc2VuYW1lLCRob3N0X2NwdSBpbgogICAgICAgICBwZ2NjKikJCQkJIyBQb3J0bGFuZCBHcm91cCBDIGNvbXBpbGVyCi0JICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRFQ0hPIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCiAJICB0bXBfYWRkZmxhZz0nICRwaWNfZmxhZycKIAkgIDs7Ci0JcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqKQkjIFBvcnRsYW5kIEdyb3VwIGY3NyBhbmQgZjkwIGNvbXBpbGVycwotCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkRUNITyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqIHwgcGdmb3J0cmFuKikKKwkJCQkJIyBQb3J0bGFuZCBHcm91cCBmNzcgYW5kIGY5MCBjb21waWxlcnMKKwkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCiAJICB0bXBfYWRkZmxhZz0nICRwaWNfZmxhZyAtTW5vbWFpbicgOzsKIAllY2MqLGlhNjQqIHwgaWNjKixpYTY0KikJIyBJbnRlbCBDIGNvbXBpbGVyIG9uIGlhNjQKIAkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYycgOzsKQEAgLTQzOTAsMTMgKzQ4MjksMTcgQEAKIAlsZjk1KikJCQkJIyBMYWhleSBGb3J0cmFuIDguMQogCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQogCSAgdG1wX3NoYXJlZGZsYWc9Jy0tc2hhcmVkJyA7OwotCXhsW1tjQ11dKikJCQkjIElCTSBYTCBDIDguMCBvbiBQUEMgKGRlYWwgd2l0aCB4bGYgYmVsb3cpCisJeGxbW2NDXV0qIHwgYmd4bFtbY0NdXSogfCBtcGl4bFtbY0NdXSopICMgSUJNIFhMIEMgOC4wIG9uIFBQQyAoZGVhbCB3aXRoIHhsZiBiZWxvdykKIAkgIHRtcF9zaGFyZWRmbGFnPSctcW1rc2hyb2JqJwogCSAgdG1wX2FkZGZsYWc9IDs7CisJbnZjYyopCSMgQ3VkYSBDb21waWxlciBEcml2ZXIgMi4yCisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgX0xUX1RBR1ZBUihjb21waWxlcl9uZWVkc19vYmplY3QsICQxKT15ZXMKKwkgIDs7CiAJZXNhYwogCWNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgogCSpTdW5cIEMqKQkJCSMgU3VuIEMgNS45Ci0JICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYG5ld19jb252ZW5pZW5jZT07IGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLXogXCIkY29udlwiIHx8IG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJEVDSE8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBuZXdfY29udmVuaWVuY2U9OyBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0IC16IFwiJGNvbnZcIiB8fCBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJwogCSAgX0xUX1RBR1ZBUihjb21waWxlcl9uZWVkc19vYmplY3QsICQxKT15ZXMKIAkgIHRtcF9zaGFyZWRmbGFnPSctRycgOzsKIAkqU3VuXCBGKikJCQkjIFN1biBGb3J0cmFuIDguMwpAQCAtNDQxMiwxNyArNDg1NSwxNiBAQAogICAgICAgICBmaQogCiAJY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQl4bGYqKQorCXhsZiogfCBiZ2YqIHwgYmd4bGYqIHwgbXBpeGxmKikKIAkgICMgSUJNIFhMIEZvcnRyYW4gMTAuMSBvbiBQUEMgY2Fubm90IGNyZWF0ZSBzaGFyZWQgbGlicyBpdHNlbGYKIAkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlIC0tbm8td2hvbGUtYXJjaGl2ZScKLQkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQotCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9Jy1ycGF0aCAkbGliZGlyJwotCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSAtbyAkbGliJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIC1vICRsaWInCiAJICBpZiB0ZXN0ICJ4JHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyIgPSB4eWVzOyB0aGVuCiAJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgogCSAgICAgIGNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KIAkgICAgICBlY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KLQkgICAgICAkTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIC12ZXJzaW9uLXNjcmlwdCAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKKwkgICAgICAkTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSAtdmVyc2lvbi1zY3JpcHQgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCiAJICBmaQogCSAgOzsKIAllc2FjCkBAIC00NDM2LDggKzQ4NzgsOCBAQAogCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1vICRsaWInCiAJd2xhcmM9CiAgICAgICBlbHNlCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwogICAgICAgZmkKICAgICAgIDs7CiAKQEAgLTQ0NTUsOCArNDg5Nyw4IEBACiAKIF9MVF9FT0YKICAgICAgIGVsaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKICAgICAgIGVsc2UKIAlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCiAgICAgICBmaQpAQCAtNDUwMiw4ICs0OTQ0LDggQEAKIAogICAgICopCiAgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwogICAgICAgZWxzZQogCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KICAgICAgIGZpCkBAIC00NTQzLDggKzQ5ODUsMTAgQEAKICAgICAgIGVsc2UKIAkjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB3ZSBkb24ndCB3YW50IHRoZSAiLUMiIG9wdGlvbi4KIAkjIC1DIG1lYW5zIGRlbWFuZ2xlIHRvIEFJWCBubSwgYnV0IG1lYW5zIGRvbid0IGRlbWFuZ2xlIHdpdGggR05VIG5tCisJIyBBbHNvLCBBSVggbm0gdHJlYXRzIHdlYWsgZGVmaW5lZCBzeW1ib2xzIGxpa2Ugb3RoZXIgZ2xvYmFsCisJIyBkZWZpbmVkIHN5bWJvbHMsIHdoZXJlYXMgR05VIG5tIG1hcmtzIHRoZW0gYXMgIlciLgogCWlmICROTSAtViAyPiYxIHwgJEdSRVAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KLQkgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQgMiA9PSAiVCIpIHx8IChcJCAyID09ICJEIikgfHwgKFwkIDIgPT0gIkIiKSkgJiYgKFtzdWJzdHJdKFwkIDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkIDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisJICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NIC1CcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikgfHwgKFwkIDIgPT0gIlciKSkgJiYgKFtzdWJzdHJdKFwkIDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkIDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCiAJZWxzZQogCSAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQkNwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQgMiA9PSAiVCIpIHx8IChcJCAyID09ICJEIikgfHwgKFwkIDIgPT0gIkIiKSkgJiYgKFtzdWJzdHJdKFwkIDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkIDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCiAJZmkKQEAgLTQ2MzEsOSArNTA3NSw5IEBACiAJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSctYmVyb2snCiAgICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbgogICAgICAgICAjIGVtcHR5IGV4ZWN1dGFibGUuCi0gICAgICAgIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYCisgICAgICAgIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYKFskMV0pCiAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgotICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gJEVDSE8gIlgke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiB8ICRYc2VkOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzIGBpZiB0ZXN0ICJ4JHthbGxvd191bmRlZmluZWRfZmxhZ30iICE9ICJ4IjsgdGhlbiBmdW5jX2VjaG9fYWxsICIke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IjsgZWxzZSA6OyBmaWAgJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMgJHNoYXJlZF9mbGFnIgogICAgICAgZWxzZQogCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCiAJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCkBAIC00NjQyLDE0ICs1MDg2LDE5IEBACiAJZWxzZQogCSAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4KIAkgIyBlbXB0eSBleGVjdXRhYmxlLgotCSBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWAorCSBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWChbJDFdKQogCSBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKIAkgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1biB0aW1lIGxvYWRpbmcgZmxhZ3MsCiAJICAjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCiAJICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1iZXJub3RvaycKIAkgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWJlcm9rJwotCSAgIyBFeHBvcnRlZCBzeW1ib2xzIGNhbiBiZSBwdWxsZWQgaW50byBzaGFyZWQgb2JqZWN0cyBmcm9tIGFyY2hpdmVzCi0JICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyRjb252ZW5pZW5jZScKKwkgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKwkgICAgIyBXZSBvbmx5IHVzZSB0aGlzIGNvZGUgZm9yIEdOVSBsZHMgdGhhdCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZS4KKwkgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIGVsc2UKKwkgICAgIyBFeHBvcnRlZCBzeW1ib2xzIGNhbiBiZSBwdWxsZWQgaW50byBzaGFyZWQgb2JqZWN0cyBmcm9tIGFyY2hpdmVzCisJICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJGNvbnZlbmllbmNlJworCSAgZmkKIAkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT15ZXMKIAkgICMgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBBSVggdHJhZGl0aW9uYWxseSBidWlsZHMgaXRzIHNoYXJlZCBsaWJyYXJpZXMuCiAJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICR7d2x9LWJub2VudHJ5ICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJwpAQCAtNDY4MSwyMCArNTEzMCw2NCBAQAogICAgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KICAgICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKICAgICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nICcKLSAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAotICAgICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5saWIgZmlsZXMsIG5vdCAuYSBmaWxlcy4KLSAgICAgIGxpYmV4dD1saWIKLSAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgotICAgICAgc2hyZXh0X2NtZHM9Ii5kbGwiCi0gICAgICAjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCi0gICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLW8gJGxpYiAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgYCRFQ0hPICJYJGRlcGxpYnMiIHwgJFhzZWQgLWUgJ1wnJ3MvIC1sYyQvLydcJydgIC1saW5rIC1kbGx+bGlua25hbWVzPScKLSAgICAgICMgVGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgYnVpbGQgYSAubGliIGZpbGUgaWYgd2UgYnVpbGQgYSBETEwuCi0gICAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKT0ndHJ1ZScKLSAgICAgICMgRklYTUU6IFNob3VsZCBsZXQgdGhlIHVzZXIgc3BlY2lmeSB0aGUgbGliIHByb2dyYW0uCi0gICAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nbGliIC1PVVQ6JG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzJwotICAgICAgX0xUX1RBR1ZBUihmaXhfc3JjZmlsZV9wYXRoLCAkMSk9J2BjeWdwYXRoIC13ICIkc3JjZmlsZSJgJwotICAgICAgX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9eWVzCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgY2wqKQorCSMgTmF0aXZlIE1TVkMKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nICcKKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKwlfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPXllcworCV9MVF9UQUdWQVIoZmlsZV9saXN0X3NwZWMsICQxKT0nQCcKKwkjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgorCWxpYmV4dD1saWIKKwkjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KKwlzaHJleHRfY21kcz0iLmRsbCIKKwkjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzICRkZXBsaWJzIC1XbCwtZGxsfmxpbmtuYW1lcz0nCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICAgIHNlZCAtbiAtZSAncy9cXFxcXFxcKC4qXFxcXFxcXCkvLWxpbmtcXFwgLUVYUE9SVDpcXFxcXFxcMS8nIC1lICcxXFxcIXAnIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHA7CisJICBlbHNlCisJICAgIHNlZCAtZSAncy9cXFxcXFxcKC4qXFxcXFxcXCkvLWxpbmtcXFwgLUVYUE9SVDpcXFxcXFxcMS8nIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHA7CisJICBmaX4KKwkgICRDQyAtbyAkdG9vbF9vdXRwdXRfb2JqZGlyJHNvbmFtZSAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgJGRlcGxpYnMgIkAkdG9vbF9vdXRwdXRfb2JqZGlyJHNvbmFtZS5leHAiIC1XbCwtRExMLC1JTVBMSUI6IiR0b29sX291dHB1dF9vYmpkaXIkbGlibmFtZS5kbGwubGliIn4KKwkgIGxpbmtuYW1lcz0nCisJIyBUaGUgbGlua2VyIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgYnVpbGQgYSBzdGF0aWMgbGliIGlmIHdlIGJ1aWxkIGEgRExMLgorCSMgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzLCAkMSk9J3RydWUnCisJX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9eWVzCisJX0xUX1RBR1ZBUihleGNsdWRlX2V4cHN5bXMsICQxKT0nX05VTExfSU1QT1JUX0RFU0NSSVBUT1J8X0lNUE9SVF9ERVNDUklQVE9SXy4qJworCV9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW1tCQ0RHUlNdXVtbIF1dL3MvLipbWyBdXVwoW1teIF1dKlwpL1wxLERBVEEvJ1wnJyB8ICRTRUQgLWUgJ1wnJy9eW1tBSVRXXV1bWyBdXS9zLy4qW1sgXV0vLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKwkjIERvbid0IHVzZSByYW5saWIKKwlfTFRfVEFHVkFSKG9sZF9wb3N0aW5zdGFsbF9jbWRzLCAkMSk9J2NobW9kIDY0NCAkb2xkbGliJworCV9MVF9UQUdWQVIocG9zdGxpbmtfY21kcywgJDEpPSdsdF9vdXRwdXRmaWxlPSJAT1VUUFVUQCJ+CisJICBsdF90b29sX291dHB1dGZpbGU9IkBUT09MX09VVFBVVEAifgorCSAgY2FzZSAkbHRfb3V0cHV0ZmlsZSBpbgorCSAgICAqLmV4ZXwqLkVYRSkgOzsKKwkgICAgKikKKwkgICAgICBsdF9vdXRwdXRmaWxlPSIkbHRfb3V0cHV0ZmlsZS5leGUiCisJICAgICAgbHRfdG9vbF9vdXRwdXRmaWxlPSIkbHRfdG9vbF9vdXRwdXRmaWxlLmV4ZSIKKwkgICAgICA7OworCSAgZXNhY34KKwkgIGlmIHRlc3QgIiRNQU5JRkVTVF9UT09MIiAhPSAiOiIgJiYgdGVzdCAtZiAiJGx0X291dHB1dGZpbGUubWFuaWZlc3QiOyB0aGVuCisJICAgICRNQU5JRkVTVF9UT09MIC1tYW5pZmVzdCAiJGx0X3Rvb2xfb3V0cHV0ZmlsZS5tYW5pZmVzdCIgLW91dHB1dHJlc291cmNlOiIkbHRfdG9vbF9vdXRwdXRmaWxlIiB8fCBleGl0IDE7CisJICAgICRSTSAiJGx0X291dHB1dGZpbGUubWFuaWZlc3QiOworCSAgZmknCisJOzsKKyAgICAgICopCisJIyBBc3N1bWUgTVNWQyB3cmFwcGVyCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyAnCisJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisJIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5saWIgZmlsZXMsIG5vdCAuYSBmaWxlcy4KKwlsaWJleHQ9bGliCisJIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5kbGwgZmlsZXMsIG5vdCAuc28gZmlsZXMuCisJc2hyZXh0X2NtZHM9Ii5kbGwiCisJIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbyAkbGliICRsaWJvYmpzICRjb21waWxlcl9mbGFncyBgZnVuY19lY2hvX2FsbCAiJGRlcGxpYnMiIHwgJFNFRCAnXCcncy8gLWxjJC8vJ1wnJ2AgLWxpbmsgLWRsbH5saW5rbmFtZXM9JworCSMgVGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgYnVpbGQgYSAubGliIGZpbGUgaWYgd2UgYnVpbGQgYSBETEwuCisJX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzLCAkMSk9J3RydWUnCisJIyBGSVhNRTogU2hvdWxkIGxldCB0aGUgdXNlciBzcGVjaWZ5IHRoZSBsaWIgcHJvZ3JhbS4KKwlfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nbGliIC1PVVQ6JG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzJworCV9MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPXllcworCTs7CisgICAgICBlc2FjCiAgICAgICA7OwogCiAgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKQEAgLTQ3MDcsMTAgKzUyMDAsNiBAQAogICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KICAgICAgIDs7CiAKLSAgICBmcmVlYnNkMSopCi0gICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICA7OwotCiAgICAgIyBGcmVlQlNEIDIuMi5bMDEyXSBhbGxvd3MgdXMgdG8gaW5jbHVkZSBjKytydDAubyB0byBnZXQgQysrIGNvbnN0cnVjdG9yCiAgICAgIyBzdXBwb3J0LiAgRnV0dXJlIHZlcnNpb25zIGRvIHRoaXMgYXV0b21hdGljYWxseSwgYnV0IGFuIGV4cGxpY2l0IGMrK3J0MC5vCiAgICAgIyBkb2VzIG5vdCBicmVhayBhbnl0aGluZywgYW5kIGhlbHBzIHNpZ25pZmljYW50bHkgKGF0IHRoZSBjb3N0IG9mIGEgbGl0dGxlCkBAIC00NzIzLDcgKzUyMTIsNyBAQAogICAgICAgOzsKIAogICAgICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KLSAgICBmcmVlYnNkMiopCisgICAgZnJlZWJzZDIuKikKICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCiAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwogICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCkBAIC00NzMyLDcgKzUyMjEsNyBAQAogCiAgICAgIyBGcmVlQlNEIDMgYW5kIGdyZWF0ZXIgdXNlcyBnY2MgLXNoYXJlZCB0byBkbyBzaGFyZWQgbGlicmFyaWVzLgogICAgIGZyZWVic2QqIHwgZHJhZ29uZmx5KikKLSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwogICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCiAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwpAQCAtNDc0MCw3ICs1MjI5LDcgQEAKIAogICAgIGhwdXg5KikKICAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgLWZQSUMgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKICAgICAgIGVsc2UKIAlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kTEQgLWIgK2IgJGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKICAgICAgIGZpCkBAIC00NzU1LDE0ICs1MjQ0LDEzIEBACiAgICAgICA7OwogCiAgICAgaHB1eDEwKikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCiAgICAgICBlbHNlCiAJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1iICtoICRzb25hbWUgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKICAgICAgIGZpCiAgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KIAlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0JX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9JytiICRsaWJkaXInCiAJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgogCV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCiAJX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT15ZXMKQEAgLTQ3NzQsMTYgKzUyNjIsMTYgQEAKICAgICAgIDs7CiAKICAgICBocHV4MTEqKQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgLWEgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCiAJY2FzZSAkaG9zdF9jcHUgaW4KIAlocHBhKjY0KikKIAkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwogCSAgOzsKIAlpYTY0KikKLQkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwogCSAgOzsKIAkqKQotCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwogCSAgOzsKIAllc2FjCiAgICAgICBlbHNlCkBAIC00Nzk1LDcgKzUyODMsMTQgQEAKIAkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKIAkgIDs7CiAJKikKLQkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCW00X2lmKCQxLCBbXSwgWworCSAgIyBPbGRlciB2ZXJzaW9ucyBvZiB0aGUgMTEuMDAgY29tcGlsZXIgZG8gbm90IHVuZGVyc3RhbmQgLWIgeWV0CisJICAjIChIUDkyNDUzLTAxIEEuMTEuMDEuMjAgZG9lc24ndCwgSFA5MjQ1My0wMSBCLjExLlguMzUxNzUtMzUxNzYuR1AgZG9lcykKKwkgIF9MVF9MSU5LRVJfT1BUSU9OKFtpZiAkQ0MgdW5kZXJzdGFuZHMgLWJdLAorCSAgICBfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfX2IsICQxKSwgWy1iXSwKKwkgICAgW19MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJ10sCisJICAgIFtfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJ10pXSwKKwkgIFtfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyddKQogCSAgOzsKIAllc2FjCiAgICAgICBmaQpAQCAtNDgyMywxOSArNTMxOCwzNCBAQAogCiAgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKICAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nIiB8ICRYc2VkYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKIAkjIFRyeSB0byB1c2UgdGhlIC1leHBvcnRlZF9zeW1ib2wgbGQgb3B0aW9uLCBpZiBpdCBkb2VzIG5vdAogCSMgd29yaywgYXNzdW1lIHRoYXQgLWV4cG9ydHNfZmlsZSBkb2VzIG5vdCB3b3JrIGVpdGhlciBhbmQKIAkjIGltcGxpY2l0bHkgZXhwb3J0IGFsbCBzeW1ib2xzLgotICAgICAgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgotICAgICAgICBMREZMQUdTPSIkTERGTEFHUyAtc2hhcmVkICR7d2x9LWV4cG9ydGVkX3N5bWJvbCAke3dsfWZvbyAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0vZGV2L251bGwiCi0gICAgICAgIEFDX0xJTktfSUZFTFNFKGludCBmb28odm9pZCkge30sCi0gICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWCR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyIgfCAkWHNlZGAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgJHt3bH0tZXhwb3J0c19maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgICAgICkKLSAgICAgICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKwkjIFRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIGZvciBhbGwgbGFuZ3VhZ2VzLCBzbyBubyBwZXItdGFnIGNhY2hlIHZhcmlhYmxlLgorCUFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSAkaG9zdF9vcyBsaW5rZXIgYWNjZXB0cyAtZXhwb3J0ZWRfc3ltYm9sXSwKKwkgIFtsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbF0sCisJICBbc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKwkgICBMREZMQUdTPSIkTERGTEFHUyAtc2hhcmVkICR7d2x9LWV4cG9ydGVkX3N5bWJvbCAke3dsfWZvbyAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0vZGV2L251bGwiCisJICAgQUNfTElOS19JRkVMU0UoCisJICAgICBbQUNfTEFOR19TT1VSQ0UoCisJICAgICAgICBbQUNfTEFOR19DQVNFKFtDXSwgW1tpbnQgZm9vICh2b2lkKSB7IHJldHVybiAwOyB9XV0sCisJCQkgICAgICBbQysrXSwgW1tpbnQgZm9vICh2b2lkKSB7IHJldHVybiAwOyB9XV0sCisJCQkgICAgICBbRm9ydHJhbiA3N10sIFtbCisgICAgICBzdWJyb3V0aW5lIGZvbworICAgICAgZW5kXV0sCisJCQkgICAgICBbRm9ydHJhbl0sIFtbCisgICAgICBzdWJyb3V0aW5lIGZvbworICAgICAgZW5kXV0pXSldLAorCSAgICAgIFtsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbD15ZXNdLAorCSAgICAgIFtsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbD1ub10pCisgICAgICAgICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiXSkKKwlpZiB0ZXN0ICIkbHRfY3ZfaXJpeF9leHBvcnRlZF9zeW1ib2wiID0geWVzOyB0aGVuCisgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgJHt3bH0tZXhwb3J0c19maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJZmkKICAgICAgIGVsc2UKLQlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nIiB8ICRYc2VkYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciIHwgJFhzZWRgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLWV4cG9ydHNfZmlsZSAkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1leHBvcnRzX2ZpbGUgJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCiAgICAgICBmaQogICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPSdubycKICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCkBAIC00ODk3LDE3ICs1NDA3LDE3IEBACiAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJwogICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCiAgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKLSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRFQ0hPICJMSUJSQVJZICRsaWJuYW1lIElOSVRJTlNUQU5DRSIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JEVDSE8gIkRFU0NSSVBUSU9OIFwiJGxpYm5hbWVcIiIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRFQ0hPIERBVEEgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRFQ0hPICIgU0lOR0xFIE5PTlNIQVJFRCIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRFQ0hPIEVYUE9SVFMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVteGV4cCAkbGlib2JqcyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JENDIC1aZGxsIC1aY3J0ZGxsIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRFQ0hPICJMSUJSQVJZICRsaWJuYW1lIElOSVRJTlNUQU5DRSIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JEVDSE8gIkRFU0NSSVBUSU9OIFwiJGxpYm5hbWVcIiIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVjaG8gREFUQSA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZWNobyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lY2hvIEVYUE9SVFMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVteGV4cCAkbGlib2JqcyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JENDIC1aZGxsIC1aY3J0ZGxsIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKICAgICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgJDEpPSdlbXhpbXAgLW8gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuYSAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCiAgICAgICA7OwogCiAgICAgb3NmMyopCiAgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgogCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciIHwgJFhzZWRgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKICAgICAgIGVsc2UKIAlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nIiB8ICRYc2VkYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKICAgICAgIGZpCiAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9J25vJwogICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKQEAgLTQ5MTcsMTMgKzU0MjcsMTMgQEAKICAgICBvc2Y0KiB8IG9zZjUqKQkjIGFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIC1tc3ltIGZsYWcKICAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCiAJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKLQlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nIiB8ICRYc2VkYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCiAJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKICAgICAgIGVsc2UKIAlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nIiB8ICRYc2VkYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKIAlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lOyBwcmludGYgIiVzXFxuIiAiLWhpZGRlbiI+PiAkbGliLmV4cH4KLQkkQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICR7d2x9LWlucHV0ICR7d2x9JGxpYi5leHAgJGNvbXBpbGVyX2ZsYWdzICRsaWJvYmpzICRkZXBsaWJzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgtc2V0X3ZlcnNpb24gJHZlcnN0cmluZyIgfCAkWHNlZGAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGlifiRSTSAkbGliLmV4cCcKKwkkQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICR7d2x9LWlucHV0ICR7d2x9JGxpYi5leHAgJGNvbXBpbGVyX2ZsYWdzICRsaWJvYmpzICRkZXBsaWJzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGlifiRSTSAkbGliLmV4cCcKIAogCSMgQm90aCBjIGFuZCBjeHggY29tcGlsZXIgc3VwcG9ydCAtcnBhdGggZGlyZWN0bHkKIAlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLXJwYXRoICRsaWJkaXInCkBAIC00OTM2LDkgKzU0NDYsOSBAQAogICAgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgLXogZGVmcycKICAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCiAJd2xhcmM9JyR7d2x9JwotCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LXogJHt3bH10ZXh0ICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAke3dsfS16ICR7d2x9dGV4dCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKIAlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgotCSAgJENDIC1zaGFyZWQgJHt3bH0teiAke3dsfXRleHQgJHt3bH0tTSAke3dsfSRsaWIuZXhwICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKwkgICRDQyAtc2hhcmVkICRwaWNfZmxhZyAke3dsfS16ICR7d2x9dGV4dCAke3dsfS1NICR7d2x9JGxpYi5leHAgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJwogICAgICAgZWxzZQogCWNhc2UgYCRDQyAtViAyPiYxYCBpbgogCSoiQ29tcGlsZXJzIDUuMCIqKQpAQCAtNTExNCwzNiArNTYyNCwzOCBAQAogICAgICAgIyBUZXN0IHdoZXRoZXIgdGhlIGNvbXBpbGVyIGltcGxpY2l0bHkgbGlua3Mgd2l0aCAtbGMgc2luY2Ugb24gc29tZQogICAgICAgIyBzeXN0ZW1zLCAtbGdjYyBoYXMgdG8gY29tZSBiZWZvcmUgLWxjLiBJZiBnY2MgYWxyZWFkeSBwYXNzZXMgLWxjCiAgICAgICAjIHRvIGxkLCBkb24ndCBhZGQgLWxjIGJlZm9yZSAtbGdjYy4KLSAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluXSkKLSAgICAgICRSTSBjb25mdGVzdCoKLSAgICAgIGVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgICAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbl0sCisJW2x0X2N2X11fTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSksCisJWyRSTSBjb25mdGVzdCoKKwllY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKIAotICAgICAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcnI7IHRoZW4KLSAgICAgICAgc29uYW1lPWNvbmZ0ZXN0Ci0gICAgICAgIGxpYj1jb25mdGVzdAotICAgICAgICBsaWJvYmpzPWNvbmZ0ZXN0LiRhY19vYmpleHQKLSAgICAgICAgZGVwbGlicz0KLSAgICAgICAgd2w9JF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpCi0JcGljX2ZsYWc9JF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKQotICAgICAgICBjb21waWxlcl9mbGFncz0tdgotICAgICAgICBsaW5rZXJfZmxhZ3M9LXYKLSAgICAgICAgdmVyc3RyaW5nPQotICAgICAgICBvdXRwdXRfb2JqZGlyPS4KLSAgICAgICAgbGlibmFtZT1jb25mdGVzdAotICAgICAgICBsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnPSRfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSkKLSAgICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQotICAgICAgICBpZiBBQ19UUllfRVZBTChfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpIDJcPlwmMSBcfCAkR1JFUCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxKQotICAgICAgICB0aGVuCi0JICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KLSAgICAgICAgZWxzZQotCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcwotICAgICAgICBmaQotICAgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKLSAgICAgIGVsc2UKLSAgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgICBmaQotICAgICAgJFJNIGNvbmZ0ZXN0KgotICAgICAgQUNfTVNHX1JFU1VMVChbJF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKV0pCisJaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcnI7IHRoZW4KKwkgIHNvbmFtZT1jb25mdGVzdAorCSAgbGliPWNvbmZ0ZXN0CisJICBsaWJvYmpzPWNvbmZ0ZXN0LiRhY19vYmpleHQKKwkgIGRlcGxpYnM9CisJICB3bD0kX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSkKKwkgIHBpY19mbGFnPSRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkKKwkgIGNvbXBpbGVyX2ZsYWdzPS12CisJICBsaW5rZXJfZmxhZ3M9LXYKKwkgIHZlcnN0cmluZz0KKwkgIG91dHB1dF9vYmpkaXI9LgorCSAgbGlibmFtZT1jb25mdGVzdAorCSAgbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpCisJICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9CisJICBpZiBBQ19UUllfRVZBTChfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpIDJcPlwmMSBcfCAkR1JFUCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxKQorCSAgdGhlbgorCSAgICBsdF9jdl9bXV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworCSAgZWxzZQorCSAgICBsdF9jdl9bXV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT15ZXMKKwkgIGZpCisJICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKKwllbHNlCisJICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKwlmaQorCSRSTSBjb25mdGVzdCoKKwldKQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPSRsdF9jdl9bXV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKQogICAgICAgOzsKICAgICBlc2FjCiAgIGZpCkBAIC01MTgwLDkgKzU2OTIsNiBAQAogX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgWzFdLAogICAgIFtGbGFnIHRvIGhhcmRjb2RlICRsaWJkaXIgaW50byBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4KICAgICBUaGlzIG11c3Qgd29yayBldmVuIGlmICRsaWJkaXIgZG9lcyBub3QgZXhpc3RdKQotX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkXSwgWzFdLAotICAgIFtbSWYgbGQgaXMgdXNlZCB3aGVuIGxpbmtpbmcsIGZsYWcgdG8gaGFyZGNvZGUgJGxpYmRpciBpbnRvIGEgYmluYXJ5Ci0gICAgZHVyaW5nIGxpbmtpbmcuICBUaGlzIG11c3Qgd29yayBldmVuIGlmICRsaWJkaXIgZG9lcyBub3QgZXhpc3RdXSkKIF9MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFsxXSwKICAgICBbV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlICItcnBhdGgiIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudF0pCiBfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2RpcmVjdF0sIFswXSwKQEAgLTUyMDgsOCArNTcxNyw2IEBACiAgICAgdG8gcnVudGltZSBwYXRoIGxpc3RdKQogX0xUX1RBR0RFQ0woW10sIFtsaW5rX2FsbF9kZXBsaWJzXSwgWzBdLAogICAgIFtXaGV0aGVyIGxpYnRvb2wgbXVzdCBsaW5rIGEgcHJvZ3JhbSBhZ2FpbnN0IGFsbCBpdHMgZGVwZW5kZW5jeSBsaWJyYXJpZXNdKQotX0xUX1RBR0RFQ0woW10sIFtmaXhfc3JjZmlsZV9wYXRoXSwgWzFdLAotICAgIFtGaXggdGhlIHNoZWxsIHZhcmlhYmxlICRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXJdKQogX0xUX1RBR0RFQ0woW10sIFthbHdheXNfZXhwb3J0X3N5bWJvbHNdLCBbMF0sCiAgICAgW1NldCB0byAieWVzIiBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZF0pCiBfTFRfVEFHREVDTChbXSwgW2V4cG9ydF9zeW1ib2xzX2NtZHNdLCBbMl0sCkBAIC01MjIwLDYgKzU3MjcsOCBAQAogICAgIFtTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWRdKQogX0xUX1RBR0RFQ0woW10sIFtwcmVsaW5rX2NtZHNdLCBbMl0sCiAgICAgW0NvbW1hbmRzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyBwcm9ncmFtcyAoYWdhaW5zdCBsaWJyYXJpZXMpIHdpdGggdGVtcGxhdGVzXSkKK19MVF9UQUdERUNMKFtdLCBbcG9zdGxpbmtfY21kc10sIFsyXSwKKyAgICBbQ29tbWFuZHMgbmVjZXNzYXJ5IGZvciBmaW5pc2hpbmcgbGlua2luZyBwcm9ncmFtc10pCiBfTFRfVEFHREVDTChbXSwgW2ZpbGVfbGlzdF9zcGVjXSwgWzFdLAogICAgIFtTcGVjaWZ5IGZpbGVuYW1lIGNvbnRhaW5pbmcgaW5wdXQgZmlsZXNdKQogZG5sIEZJWE1FOiBOb3QgeWV0IGltcGxlbWVudGVkCkBAIC01MzEzLDE0ICs1ODIyLDE1IEBACiBdKSMgX0xUX0xBTkdfQ19DT05GSUcKIAogCi0jIF9MVF9QUk9HX0NYWAotIyAtLS0tLS0tLS0tLS0KLSMgU2luY2UgQUNfUFJPR19DWFggaXMgYnJva2VuLCBpbiB0aGF0IGl0IHJldHVybnMgZysrIGlmIHRoZXJlIGlzIG5vIGMrKwotIyBjb21waWxlciwgd2UgaGF2ZSBvdXIgb3duIHZlcnNpb24gaGVyZS4KLW00X2RlZnVuKFtfTFRfUFJPR19DWFhdLAotWwotcHVzaGRlZihbQUNfTVNHX0VSUk9SXSwgW19sdF9jYXVnaHRfQ1hYX2Vycm9yPXllc10pCi1BQ19QUk9HX0NYWAorIyBfTFRfTEFOR19DWFhfQ09ORklHKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZm9yIGEgQysrIGNvbXBpbGVyIGFyZSBzdWl0YWJseQorIyBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHIHRvIHdyaXRlCisjIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK200X2RlZnVuKFtfTFRfTEFOR19DWFhfQ09ORklHXSwKK1ttNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSlkbmwKK200X3JlcXVpcmUoW19MVF9QQVRIX01BTklGRVNUX1RPT0xdKWRubAogaWYgdGVzdCAtbiAiJENYWCIgJiYgKCB0ZXN0ICJYJENYWCIgIT0gIlhubyIgJiYKICAgICAoICh0ZXN0ICJYJENYWCIgPSAiWGcrKyIgJiYgYGcrKyAtdiA+L2Rldi9udWxsIDI+JjFgICkgfHwKICAgICAodGVzdCAiWCRDWFgiICE9ICJYZysrIikpKSA7IHRoZW4KQEAgLTUzMjgsMjIgKzU4MzgsNiBAQAogZWxzZQogICBfbHRfY2F1Z2h0X0NYWF9lcnJvcj15ZXMKIGZpCi1wb3BkZWYoW0FDX01TR19FUlJPUl0pCi1dKSMgX0xUX1BST0dfQ1hYCi0KLWRubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKLWRubCBBQ19ERUZVTihbX0xUX1BST0dfQ1hYXSwgW10pCi0KLQotIyBfTFRfTEFOR19DWFhfQ09ORklHKFtUQUddKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZm9yIGEgQysrIGNvbXBpbGVyIGFyZSBzdWl0YWJseQotIyBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHIHRvIHdyaXRlCi0jIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KLW00X2RlZnVuKFtfTFRfTEFOR19DWFhfQ09ORklHXSwKLVtBQ19SRVFVSVJFKFtfTFRfUFJPR19DWFhdKWRubAotbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCi1tNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCiAKIEFDX0xBTkdfUFVTSChDKyspCiBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KQEAgLTUzNTUsNyArNTg0OSw2IEBACiBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCiBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPW5vCiBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KLV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPQogX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CiBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT1ubwogX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9dW5zdXBwb3J0ZWQKQEAgLTUzNjUsNiArNTg1OCw4IEBACiBfTFRfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPQogX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9dW5rbm93bgogX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JG9sZF9hcmNoaXZlX2NtZHMKK19MVF9UQUdWQVIocmVsb2FkX2ZsYWcsICQxKT0kcmVsb2FkX2ZsYWcKK19MVF9UQUdWQVIocmVsb2FkX2NtZHMsICQxKT0kcmVsb2FkX2NtZHMKIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0KIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KIF9MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPW5vCkBAIC01Mzk2LDYgKzU4OTEsNyBAQAogCiAgICMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCiAgIGx0X3NhdmVfQ0M9JENDCisgIGx0X3NhdmVfQ0ZMQUdTPSRDRkxBR1MKICAgbHRfc2F2ZV9MRD0kTEQKICAgbHRfc2F2ZV9HQ0M9JEdDQwogICBHQ0M9JEdYWApAQCAtNTQxMyw2ICs1OTA5LDcgQEAKICAgZmkKICAgdGVzdCAteiAiJHtMRENYWCtzZXR9IiB8fCBMRD0kTERDWFgKICAgQ0M9JHtDWFgtImMrKyJ9CisgIENGTEFHUz0kQ1hYRkxBR1MKICAgY29tcGlsZXI9JENDCiAgIF9MVF9UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKICAgX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQpAQCAtNTQzNCw4ICs1OTMxLDggQEAKICAgICAgICMgQ2hlY2sgaWYgR05VIEMrKyB1c2VzIEdOVSBsZCBhcyB0aGUgdW5kZXJseWluZyBsaW5rZXIsIHNpbmNlIHRoZQogICAgICAgIyBhcmNoaXZpbmcgY29tbWFuZHMgYmVsb3cgYXNzdW1lIHRoYXQgR05VIGxkIGlzIGJlaW5nIHVzZWQuCiAgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDICRwaWNfZmxhZyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAkcGljX2ZsYWcgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCiAKICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKICAgICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJwpAQCAtNTQ2Nyw3ICs1OTY0LDcgQEAKICAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKICAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgogICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0gICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAiXC1MIicKKyAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQIC12ICJeQ29uZmlndXJlZCB3aXRoOiIgfCAkR1JFUCAiXC1MIicKIAogICAgIGVsc2UKICAgICAgIEdYWD1ubwpAQCAtNTU3NiwxMCArNjA3MywxMCBAQAogICAgICAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nLWJlcm9rJwogICAgICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eQogICAgICAgICAgICMgZXhlY3V0YWJsZS4KLSAgICAgICAgICBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWAorICAgICAgICAgIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYKFskMV0pCiAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCiAKLSAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gJEVDSE8gIlgke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiB8ICRYc2VkOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCisgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGZ1bmNfZWNob19hbGwgIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCiAgICAgICAgIGVsc2UKICAgICAgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgogCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCkBAIC01NTg4LDE0ICs2MDg1LDE5IEBACiAgICAgICAgICAgZWxzZQogCSAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4KIAkgICAgIyBlbXB0eSBleGVjdXRhYmxlLgotCSAgICBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWAorCSAgICBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWChbJDFdKQogCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKIAkgICAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKIAkgICAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgogCSAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1iZXJub3RvaycKIAkgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVyb2snCi0JICAgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcwotCSAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyRjb252ZW5pZW5jZScKKwkgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorCSAgICAgICMgV2Ugb25seSB1c2UgdGhpcyBjb2RlIGZvciBHTlUgbGRzIHRoYXQgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUuCisJICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgICAgZWxzZQorCSAgICAgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcworCSAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJGNvbnZlbmllbmNlJworCSAgICBmaQogCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCiAJICAgICMgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBBSVggdHJhZGl0aW9uYWxseSBidWlsZHMgaXRzIHNoYXJlZAogCSAgICAjIGxpYnJhcmllcy4KQEAgLTU2MjUsMjggKzYxMjcsNzUgQEAKICAgICAgICAgOzsKIAogICAgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQotICAgICAgICAjIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAotICAgICAgICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgotICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJwotICAgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKLSAgICAgICAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubwotICAgICAgICBfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKKwljYXNlICRHWFgsJGNjX2Jhc2VuYW1lIGluCisJLGNsKiB8IG5vLGNsKikKKwkgICMgTmF0aXZlIE1TVkMKKwkgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKKwkgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nICcKKwkgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorCSAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT15ZXMKKwkgIF9MVF9UQUdWQVIoZmlsZV9saXN0X3NwZWMsICQxKT0nQCcKKwkgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCisJICBsaWJleHQ9bGliCisJICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KKwkgIHNocmV4dF9jbWRzPSIuZGxsIgorCSAgIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzICRkZXBsaWJzIC1XbCwtZGxsfmxpbmtuYW1lcz0nCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KKwkgICAgICAkU0VEIC1uIC1lICdzL1xcXFxcXFwoLipcXFxcXFxcKS8tbGlua1xcXCAtRVhQT1JUOlxcXFxcXFwxLycgLWUgJzFcXFwhcCcgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cDsKKwkgICAgZWxzZQorCSAgICAgICRTRUQgLWUgJ3MvXFxcXFxcXCguKlxcXFxcXFwpLy1saW5rXFxcIC1FWFBPUlQ6XFxcXFxcXDEvJyA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwOworCSAgICBmaX4KKwkgICAgJENDIC1vICR0b29sX291dHB1dF9vYmpkaXIkc29uYW1lICRsaWJvYmpzICRjb21waWxlcl9mbGFncyAkZGVwbGlicyAiQCR0b29sX291dHB1dF9vYmpkaXIkc29uYW1lLmV4cCIgLVdsLC1ETEwsLUlNUExJQjoiJHRvb2xfb3V0cHV0X29iamRpciRsaWJuYW1lLmRsbC5saWIifgorCSAgICBsaW5rbmFtZXM9JworCSAgIyBUaGUgbGlua2VyIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgYnVpbGQgYSBzdGF0aWMgbGliIGlmIHdlIGJ1aWxkIGEgRExMLgorCSAgIyBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKT0ndHJ1ZScKKwkgIF9MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPXllcworCSAgIyBEb24ndCB1c2UgcmFubGliCisJICBfTFRfVEFHVkFSKG9sZF9wb3N0aW5zdGFsbF9jbWRzLCAkMSk9J2NobW9kIDY0NCAkb2xkbGliJworCSAgX0xUX1RBR1ZBUihwb3N0bGlua19jbWRzLCAkMSk9J2x0X291dHB1dGZpbGU9IkBPVVRQVVRAIn4KKwkgICAgbHRfdG9vbF9vdXRwdXRmaWxlPSJAVE9PTF9PVVRQVVRAIn4KKwkgICAgY2FzZSAkbHRfb3V0cHV0ZmlsZSBpbgorCSAgICAgICouZXhlfCouRVhFKSA7OworCSAgICAgICopCisJCWx0X291dHB1dGZpbGU9IiRsdF9vdXRwdXRmaWxlLmV4ZSIKKwkJbHRfdG9vbF9vdXRwdXRmaWxlPSIkbHRfdG9vbF9vdXRwdXRmaWxlLmV4ZSIKKwkJOzsKKwkgICAgZXNhY34KKwkgICAgZnVuY190b190b29sX2ZpbGUgIiRsdF9vdXRwdXRmaWxlIn4KKwkgICAgaWYgdGVzdCAiJE1BTklGRVNUX1RPT0wiICE9ICI6IiAmJiB0ZXN0IC1mICIkbHRfb3V0cHV0ZmlsZS5tYW5pZmVzdCI7IHRoZW4KKwkgICAgICAkTUFOSUZFU1RfVE9PTCAtbWFuaWZlc3QgIiRsdF90b29sX291dHB1dGZpbGUubWFuaWZlc3QiIC1vdXRwdXRyZXNvdXJjZToiJGx0X3Rvb2xfb3V0cHV0ZmlsZSIgfHwgZXhpdCAxOworCSAgICAgICRSTSAiJGx0X291dHB1dGZpbGUubWFuaWZlc3QiOworCSAgICBmaScKKwkgIDs7CisJKikKKwkgICMgZysrCisJICAjIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAorCSAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisJICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWFsbC1zeW1ib2xzJworCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisJICBfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCisJICBfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKIAotICAgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJwotICAgICAgICAgICMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKLSAgICAgICAgICAjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgotICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgotCSAgICBjcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7Ci0gICAgICAgICAgZWxzZQotCSAgICBlY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLQkgICAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLSAgICAgICAgICBmaX4KLSAgICAgICAgICAkQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWYgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCi0gICAgICAgIGVsc2UKLSAgICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICAgIGZpCi0gICAgICAgIDs7CisJICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKwkgICAgIyBJZiB0aGUgZXhwb3J0LXN5bWJvbHMgZmlsZSBhbHJlYWR5IGlzIGEgLmRlZiBmaWxlICgxc3QgbGluZQorCSAgICAjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KKwkgICAgICBjcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJICAgIGVsc2UKKwkgICAgICBlY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwkgICAgICBjYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCSAgICBmaX4KKwkgICAgJENDIC1zaGFyZWQgLW5vc3RkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworCSAgZWxzZQorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICBmaQorCSAgOzsKKwllc2FjCisJOzsKICAgICAgIGRhcndpbiogfCByaGFwc29keSopCiAgICAgICAgIF9MVF9EQVJXSU5fTElOS0VSX0ZFQVRVUkVTKCQxKQogCTs7CkBAIC01NjY5LDcgKzYyMTgsNyBAQAogICAgICAgICBlc2FjCiAgICAgICAgIDs7CiAKLSAgICAgIGZyZWVic2RbWzEyXV0qKQorICAgICAgZnJlZWJzZDIuKikKICAgICAgICAgIyBDKysgc2hhcmVkIGxpYnJhcmllcyByZXBvcnRlZCB0byBiZSBmYWlybHkgYnJva2VuIGJlZm9yZQogCSMgc3dpdGNoIHRvIEVMRgogICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCkBAIC01Njg4LDYgKzYyMzcsMTEgQEAKICAgICAgIGdudSopCiAgICAgICAgIDs7CiAKKyAgICAgIGhhaWt1KikKKyAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICAgICAgICA7OworCiAgICAgICBocHV4OSopCiAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgpAQCAtNTcxMiwxMSArNjI2NiwxMSBAQAogICAgICAgICAgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KICAgICAgICAgICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKICAgICAgICAgICAgICMgZGVwZW5kZW5jaWVzLgotICAgICAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAoJENDIC1iICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxKSB8ICRFR1JFUCAiXC1MImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyAkRUNITyAiWCRsaXN0IiB8ICRYc2VkJworICAgICAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAoJENDIC1iICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxKSB8ICRFR1JFUCAiXC1MImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBmdW5jX2VjaG9fYWxsICIkbGlzdCInCiAgICAgICAgICAgICA7OwogICAgICAgICAgICopCiAgICAgICAgICAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgotICAgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgLW5vc3RkbGliICRwaWNfZmxhZyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKICAgICAgICAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwpAQCAtNTc3Nyw3ICs2MzMxLDcgQEAKIAkgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KIAkgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQogCSAgICAjIGRlcGVuZGVuY2llcy4KLQkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAoJENDIC1iICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxKSB8ICRHUkVQICJcLUwiYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7ICRFQ0hPICJYJGxpc3QiIHwgJFhzZWQnCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gKCRDQyAtYiAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSkgfCAkR1JFUCAiXC1MImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBmdW5jX2VjaG9fYWxsICIkbGlzdCInCiAJICAgIDs7CiAgICAgICAgICAgKikKIAkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KQEAgLTU3ODcsMTAgKzYzNDEsMTAgQEAKIAkgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCiAJICAgICAgICAgICAgOzsKIAkgICAgICAgICAgaWE2NCopCi0JICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcGljX2ZsYWcgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCiAJICAgICAgICAgICAgOzsKIAkgICAgICAgICAgKikKLQkgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHBpY19mbGFnICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCiAJICAgICAgICAgICAgOzsKIAkgICAgICAgIGVzYWMKIAkgICAgICBmaQpAQCAtNTgyMCw3ICs2Mzc0LDcgQEAKICAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KICAgICAgICAgICBDQyopCiAJICAgICMgU0dJIEMrKwotCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtYWxsIC1tdWx0aWdvdCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nIiB8ICRYc2VkYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1hbGwgLW11bHRpZ290ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwogCiAJICAgICMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZwogCSAgICAjICJDQyAtYXIiLCB3aGVyZSAiQ0MiIGlzIHRoZSBJUklYIEMrKyBjb21waWxlci4gIFRoaXMgaXMKQEAgLTU4MzEsOSArNjM4NSw5IEBACiAgICAgICAgICAgKikKIAkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KIAkgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciIHwgJFhzZWRgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwogCSAgICAgIGVsc2UKLQkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciIHwgJFhzZWRgIC1vICRsaWInCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAtbyAkbGliJwogCSAgICAgIGZpCiAJICAgIGZpCiAJICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcwpAQCAtNTg0NCw3ICs2Mzk4LDcgQEAKICAgICAgICAgX0xUX1RBR1ZBUihpbmhlcml0X3JwYXRoLCAkMSk9eWVzCiAgICAgICAgIDs7CiAKLSAgICAgIGxpbnV4KiB8IGsqYnNkKi1nbnUpCisgICAgICBsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCiAgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCiAgICAgICAgICAgS0NDKikKIAkgICAgIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgpAQCAtNTg2Miw3ICs2NDE2LDcgQEAKIAkgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KIAkgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQogCSAgICAjIGRlcGVuZGVuY2llcy4KLQkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IC1vIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQgMj4mMSB8ICRHUkVQICJsZCJgOyBybSAtZiBsaWJjb25mdGVzdCRzaGFyZWRfZXh0OyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgJEVDSE8gIlgkbGlzdCIgfCAkWHNlZCcKKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IC1vIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQgMj4mMSB8ICRHUkVQICJsZCJgOyBybSAtZiBsaWJjb25mdGVzdCRzaGFyZWRfZXh0OyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZnVuY19lY2hvX2FsbCAiJGxpc3QiJwogCiAJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJwogCSAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCkBAIC01ODk5LDI2ICs2NDUzLDI2IEBACiAgICAgICAgICAgcGdDQyogfCBwZ2NwcCopCiAgICAgICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIEMrKyBjb21waWxlcgogCSAgICBjYXNlIGAkQ0MgLVZgIGluCi0JICAgICpwZ0NDXCBbWzEtNV1dKiB8ICpwZ2NwcFwgW1sxLTVdXSopCisJICAgICpwZ0NDXCBbWzEtNV1dLiogfCAqcGdjcHBcIFtbMS01XV0uKikKIAkgICAgICBfTFRfVEFHVkFSKHByZWxpbmtfY21kcywgJDEpPSd0cGxkaXI9VGVtcGxhdGUuZGlyfgogCQlybSAtcmYgJHRwbGRpcn4KIAkJJENDIC0tcHJlbGlua19vYmplY3RzIC0taW5zdGFudGlhdGlvbl9kaXIgJHRwbGRpciAkb2JqcyAkbGlib2JqcyAkY29tcGlsZV9kZXBsaWJzfgotCQljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgYGZpbmQgJHRwbGRpciAtbmFtZSBcKi5vIHwgJE5MMlNQYCInCisJCWNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCBzb3J0IHwgJE5MMlNQYCInCiAJICAgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9J3RwbGRpcj1UZW1wbGF0ZS5kaXJ+CiAJCXJtIC1yZiAkdHBsZGlyfgogCQkkQ0MgLS1wcmVsaW5rX29iamVjdHMgLS1pbnN0YW50aWF0aW9uX2RpciAkdHBsZGlyICRvbGRvYmpzJG9sZF9kZXBsaWJzfgotCQkkQVIgJEFSX0ZMQUdTICRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicyBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCAkTkwyU1BgfgorCQkkQVIgJEFSX0ZMQUdTICRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicyBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCBzb3J0IHwgJE5MMlNQYH4KIAkJJFJBTkxJQiAkb2xkbGliJwogCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9J3RwbGRpcj1UZW1wbGF0ZS5kaXJ+CiAJCXJtIC1yZiAkdHBsZGlyfgogCQkkQ0MgLS1wcmVsaW5rX29iamVjdHMgLS1pbnN0YW50aWF0aW9uX2RpciAkdHBsZGlyICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkY29udmVuaWVuY2UgJHBvc3RkZXBfb2JqZWN0c34KLQkJJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCAkTkwyU1BgICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgLW8gJGxpYicKKwkJJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCBzb3J0IHwgJE5MMlNQYCAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIC1vICRsaWInCiAJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3RwbGRpcj1UZW1wbGF0ZS5kaXJ+CiAJCXJtIC1yZiAkdHBsZGlyfgogCQkkQ0MgLS1wcmVsaW5rX29iamVjdHMgLS1pbnN0YW50aWF0aW9uX2RpciAkdHBsZGlyICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkY29udmVuaWVuY2UgJHBvc3RkZXBfb2JqZWN0c34KLQkJJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCAkTkwyU1BgICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAke3dsfSRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCQkkQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzIGBmaW5kICR0cGxkaXIgLW5hbWUgXCoubyB8IHNvcnQgfCAkTkwyU1BgICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAke3dsfSRleHBvcnRfc3ltYm9scyAtbyAkbGliJwogCSAgICAgIDs7Ci0JICAgICopICMgVmVyc2lvbiA2IHdpbGwgdXNlIHdlYWsgc3ltYm9scworCSAgICAqKSAjIFZlcnNpb24gNiBhbmQgYWJvdmUgdXNlIHdlYWsgc3ltYm9scwogCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAtbyAkbGliJwogCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAke3dsfSRleHBvcnRfc3ltYm9scyAtbyAkbGliJwogCSAgICAgIDs7CkBAIC01OTI2LDcgKzY0ODAsNyBAQAogCiAJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJwogCSAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCi0JICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJEVDSE8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJwogICAgICAgICAgICAgOzsKIAkgIGN4eCopCiAJICAgICMgQ29tcGFxIEMrKwpAQCAtNTk0NSw5ICs2NDk5LDkgQEAKIAkgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KIAkgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQogCSAgICAjIGRlcGVuZGVuY2llcy4KLQkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQICJsZCJgOyB0ZW1wbGlzdD1gJEVDSE8gIlgkdGVtcGxpc3QiIHwgJFhzZWQgLWUgInMvXCheLipsZC4qXClcKCAuKmxkIC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgJEVDSE8gIlgkbGlzdCIgfCAkWHNlZCcKKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQICJsZCJgOyB0ZW1wbGlzdD1gZnVuY19lY2hvX2FsbCAiJHRlbXBsaXN0IiB8ICRTRUQgInMvXCheLipsZC4qXClcKCAuKmxkIC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZnVuY19lY2hvX2FsbCAiWCRsaXN0IiB8ICRYc2VkJwogCSAgICA7OwotCSAgeGwqKQorCSAgeGwqIHwgbXBpeGwqIHwgYmd4bCopCiAJICAgICMgSUJNIFhMIDguMCBvbiBQUEMsIHdpdGggR05VIGxkCiAJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCiAJICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKQEAgLTU5NjcsMTMgKzY1MjEsMTMgQEAKIAkgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCiAJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzJwogCSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCi0JICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBuZXdfY29udmVuaWVuY2U9OyBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0IC16IFwiJGNvbnZcIiB8fCBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRFQ0hPIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgICAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYG5ld19jb252ZW5pZW5jZT07IGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLXogXCIkY29udlwiIHx8IG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCiAJICAgICAgX0xUX1RBR1ZBUihjb21waWxlcl9uZWVkc19vYmplY3QsICQxKT15ZXMKIAogCSAgICAgICMgTm90IHN1cmUgd2hldGhlciBzb21ldGhpbmcgYmFzZWQgb24KIAkgICAgICAjICRDQyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgLW8gbGliY29uZnRlc3Qkc2hhcmVkX2V4dCAyPiYxCiAJICAgICAgIyB3b3VsZCBiZSBiZXR0ZXIuCi0JICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCisJICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2Z1bmNfZWNob19hbGwnCiAKIAkgICAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKIAkgICAgICAjICJDQyAteGFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgU3VuIEMrKyBjb21waWxlci4gIFRoaXMgaXMKQEAgLTYwNDIsNyArNjU5Niw3IEBACiAJICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCiAJICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKIAkgIGZpCi0JICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD1lY2hvCisJICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD1mdW5jX2VjaG9fYWxsCiAJZWxzZQogCSAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwogCWZpCkBAIC02MDc3LDE1ICs2NjMxLDE1IEBACiAJICAgIGNhc2UgJGhvc3QgaW4KIAkgICAgICBvc2YzKikKIAkgICAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0JICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgke3dsfS1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nIiB8ICRYc2VkYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKIAkgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCiAJCTs7CiAJICAgICAgKikKIAkgICAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKLQkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgtc2V0X3ZlcnNpb24gJHZlcnN0cmluZyIgfCAkWHNlZGAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKIAkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiJXMgJXNcXG4iIC1leHBvcnRlZF9zeW1ib2wgIlwkaSIgPj4gJGxpYi5leHA7IGRvbmV+CiAJICAgICAgICAgIGVjaG8gIi1oaWRkZW4iPj4gJGxpYi5leHB+Ci0JICAgICAgICAgICRDQyAtc2hhcmVkJGFsbG93X3VuZGVmaW5lZF9mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgJHt3bH0taW5wdXQgJHt3bH0kbGliLmV4cCAgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciIHwgJFhzZWRgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4KKwkgICAgICAgICAgJENDIC1zaGFyZWQkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSAke3dsfS1pbnB1dCAke3dsfSRsaWIuZXhwICBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGlifgogCSAgICAgICAgICAkUk0gJGxpYi5leHAnCiAJICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLXJwYXRoICRsaWJkaXInCiAJCTs7CkBAIC02MTAxLDE3ICs2NjU1LDE3IEBACiAJICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCiAJICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKIAkgICAgIyBkZXBlbmRlbmNpZXMuCi0JICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAibGQiIHwgJEdSRVAgLXYgImxkOiJgOyB0ZW1wbGlzdD1gJEVDSE8gIlgkdGVtcGxpc3QiIHwgJFhzZWQgLWUgInMvXCheLipsZC4qXClcKCAuKmxkLiokXCkvXDEvImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyAkRUNITyAiWCRsaXN0IiB8ICRYc2VkJworCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgImxkIiB8ICRHUkVQIC12ICJsZDoiYDsgdGVtcGxpc3Q9YGZ1bmNfZWNob19hbGwgIiR0ZW1wbGlzdCIgfCAkU0VEICJzL1woXi4qbGQuKlwpXCggLipsZC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZnVuY19lY2hvX2FsbCAiJGxpc3QiJwogCSAgICA7OwogCSAgKikKIAkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCiAJICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKIAkgICAgICBjYXNlICRob3N0IGluCiAJICAgICAgICBvc2YzKikKLQkgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWCR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyIgfCAkWHNlZGAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwogCQkgIDs7CiAJICAgICAgICAqKQotCSAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LW1zeW0gJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyIgfCAkWHNlZGAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1ub3N0ZGxpYiAke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwogCQkgIDs7CiAJICAgICAgZXNhYwogCkBAIC02MTIxLDcgKzY2NzUsNyBAQAogCSAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKIAkgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KIAkgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAiXC1MIicKKwkgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAtdiAiXkNvbmZpZ3VyZWQgd2l0aDoiIHwgJEdSRVAgIlwtTCInCiAKIAkgICAgZWxzZQogCSAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydApAQCAtNjE1Nyw3ICs2NzExLDcgQEAKIAogICAgICAgc29sYXJpcyopCiAgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAgICAgQ0MqKQorICAgICAgICAgIENDKiB8IHN1bkNDKikKIAkgICAgIyBTdW4gQysrIDQuMiwgNS54IGFuZCBDZW50ZXJsaW5lIEMrKwogICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywkMSk9eWVzCiAJICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC16ZGVmcycKQEAgLTYxNzgsNyArNjczMiw3IEBACiAJICAgIGVzYWMKIAkgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCiAKLQkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdmdW5jX2VjaG9fYWxsJwogCiAJICAgICMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZwogCSAgICAjICJDQyAteGFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgU3VuIEMrKyBjb21waWxlci4gIFRoaXMgaXMKQEAgLTYxOTgsMTQgKzY3NTIsMTQgQEAKIAkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCiAJICAgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0teiAke3dsfWRlZnMnCiAJICAgICAgaWYgJENDIC0tdmVyc2lvbiB8ICRHUkVQIC12ICdeMlwuNycgPiAvZGV2L251bGw7IHRoZW4KLQkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkTERGTEFHUyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW5vc3RkbGliICRMREZMQUdTICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKIAkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+Ci0JCSAgJENDIC1zaGFyZWQgLW5vc3RkbGliICR7d2x9LU0gJHdsJGxpYi5leHAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCQkgICRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbm9zdGRsaWIgJHt3bH0tTSAkd2wkbGliLmV4cCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc34kUk0gJGxpYi5leHAnCiAKIAkgICAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKIAkgICAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgogCSAgICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAiXC1MIicKKwkgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQIC12ICJeQ29uZmlndXJlZCB3aXRoOiIgfCAkR1JFUCAiXC1MIicKIAkgICAgICBlbHNlCiAJICAgICAgICAjIGcrKyAyLjcgYXBwZWFycyB0byByZXF1aXJlIGAtRycgTk9UIGAtc2hhcmVkJyBvbiB0aGlzCiAJICAgICAgICAjIHBsYXRmb3JtLgpAQCAtNjIxNiw3ICs2NzcwLDcgQEAKIAkgICAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKIAkgICAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgogCSAgICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1HICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgIlwtTCInCisJICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1HICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgLXYgIl5Db25maWd1cmVkIHdpdGg6IiB8ICRHUkVQICJcLUwiJwogCSAgICAgIGZpCiAKIAkgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiAkd2wkbGliZGlyJwpAQCAtNjI3MCw2ICs2ODI0LDEwIEBACiAgICAgICAgICAgQ0MqKQogCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwogCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtVHByZWxpbmtfb2JqZWN0cyAkb2xkb2Jqc34KKwkgICAgICAnIiRfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKSIKKwkgICAgX0xUX1RBR1ZBUihyZWxvYWRfY21kcywgJDEpPSckQ0MgLVRwcmVsaW5rX29iamVjdHMgJHJlbG9hZF9vYmpzfgorCSAgICAgICciJF9MVF9UQUdWQVIocmVsb2FkX2NtZHMsICQxKSIKIAkgICAgOzsKIAkgICopCiAJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKQEAgLTYzMjUsNiArNjg4Myw3IEBACiAgIGZpICMgdGVzdCAtbiAiJGNvbXBpbGVyIgogCiAgIENDPSRsdF9zYXZlX0NDCisgIENGTEFHUz0kbHRfc2F2ZV9DRkxBR1MKICAgTERDWFg9JExECiAgIExEPSRsdF9zYXZlX0xECiAgIEdDQz0kbHRfc2F2ZV9HQ0MKQEAgLTYzMzksNiArNjg5OCwyOSBAQAogXSkjIF9MVF9MQU5HX0NYWF9DT05GSUcKIAogCisjIF9MVF9GVU5DX1NUUklQTkFNRV9DTkYKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBmdW5jX3N0cmlwbmFtZV9jbmYgcHJlZml4IHN1ZmZpeCBuYW1lCisjIHN0cmlwIFBSRUZJWCBhbmQgU1VGRklYIG9mZiBvZiBOQU1FLgorIyBQUkVGSVggYW5kIFNVRkZJWCBtdXN0IG5vdCBjb250YWluIGdsb2JiaW5nIG9yIHJlZ2V4IHNwZWNpYWwKKyMgY2hhcmFjdGVycywgaGFzaGVzLCBwZXJjZW50IHNpZ25zLCBidXQgU1VGRklYIG1heSBjb250YWluIGEgbGVhZGluZworIyBkb3QgKGluIHdoaWNoIGNhc2UgdGhhdCBtYXRjaGVzIG9ubHkgYSBkb3QpLgorIworIyBUaGlzIGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byB0aGUgKG5vbi1YU0kpIHZlcnNpb24gb2YgZnVuY19zdHJpcG5hbWUsCisjIGV4Y2VwdCB0aGlzIG9uZSBjYW4gYmUgdXNlZCBieSBtNCBjb2RlIHRoYXQgbWF5IGJlIGV4ZWN1dGVkIGJ5IGNvbmZpZ3VyZSwKKyMgcmF0aGVyIHRoYW4gdGhlIGxpYnRvb2wgc2NyaXB0LgorbTRfZGVmdW4oW19MVF9GVU5DX1NUUklQTkFNRV9DTkZdLFtkbmwKK0FDX1JFUVVJUkUoW19MVF9ERUNMX1NFRF0pCitBQ19SRVFVSVJFKFtfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSF0pCitmdW5jX3N0cmlwbmFtZV9jbmYgKCkKK3sKKyAgY2FzZSAkezJ9IGluCisgIC4qKSBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9YCRFQ0hPICIkezN9IiB8ICRTRUQgInMlXiR7MX0lJTsgcyVcXFxcJHsyfVwkJSUiYDs7CisgICopICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9YCRFQ0hPICIkezN9IiB8ICRTRUQgInMlXiR7MX0lJTsgcyUkezJ9XCQlJSJgOzsKKyAgZXNhYworfSAjIGZ1bmNfc3RyaXBuYW1lX2NuZgorXSkjIF9MVF9GVU5DX1NUUklQTkFNRV9DTkYKKwogIyBfTFRfU1lTX0hJRERFTl9MSUJERVBTKFtUQUdOQU1FXSkKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIEZpZ3VyZSBvdXQgImhpZGRlbiIgbGlicmFyeSBkZXBlbmRlbmNpZXMgZnJvbSB2ZXJib3NlCkBAIC02MzQ3LDYgKzY5MjksNyBAQAogIyBvYmplY3RzLCBsaWJyYXJpZXMgYW5kIGxpYnJhcnkgZmxhZ3MuCiBtNF9kZWZ1bihbX0xUX1NZU19ISURERU5fTElCREVQU10sCiBbbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCitBQ19SRVFVSVJFKFtfTFRfRlVOQ19TVFJJUE5BTUVfQ05GXSlkbmwKICMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIG9iamVjdCBiZWluZyBsaW5rZWQ6CiBfTFRfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSk9CiBfTFRfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpPQpAQCAtNjM5Niw3ICs2OTc5LDIwIEBACiAgIH0KIH07CiBfTFRfRU9GCitdLCBbJDFdLCBbR09dLCBbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKK3BhY2thZ2UgZm9vCitmdW5jIGZvbygpIHsKK30KK19MVF9FT0YKIF0pCisKK19sdF9saWJkZXBzX3NhdmVfQ0ZMQUdTPSRDRkxBR1MKK2Nhc2UgIiRDQyAkQ0ZMQUdTICIgaW4gIygKKypcIC1mbHRvKlwgKikgQ0ZMQUdTPSIkQ0ZMQUdTIC1mbm8tbHRvIiA7OworKlwgLWZ3aG9wcipcICopIENGTEFHUz0iJENGTEFHUyAtZm5vLXdob3ByIiA7OworKlwgLWZ1c2UtbGlua2VyLXBsdWdpbipcICopIENGTEFHUz0iJENGTEFHUyAtZm5vLXVzZS1saW5rZXItcGx1Z2luIiA7OworZXNhYworCiBkbmwgUGFyc2UgdGhlIGNvbXBpbGVyIG91dHB1dCBhbmQgZXh0cmFjdCB0aGUgbmVjZXNzYXJ5CiBkbmwgb2JqZWN0cywgbGlicmFyaWVzIGFuZCBsaWJyYXJ5IGZsYWdzLgogaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KQEAgLTY0MDgsNyArNzAwNCw3IEBACiAgIHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmU9bm8KIAogICBmb3IgcCBpbiBgZXZhbCAiJG91dHB1dF92ZXJib3NlX2xpbmtfY21kImA7IGRvCi0gICAgY2FzZSAkcCBpbgorICAgIGNhc2UgJHtwcmV2fSR7cH0gaW4KIAogICAgIC1MKiB8IC1SKiB8IC1sKikKICAgICAgICAjIFNvbWUgY29tcGlsZXJzIHBsYWNlIHNwYWNlIGJldHdlZW4gIi17TCxSfSIgYW5kIHRoZSBwYXRoLgpAQCAtNjQxNywxMyArNzAxMywyMiBAQAogICAgICAgICAgIHRlc3QgJHAgPSAiLVIiOyB0aGVuCiAJIHByZXY9JHAKIAkgY29udGludWUKLSAgICAgICBlbHNlCi0JIHByZXY9CiAgICAgICAgZmkKIAorICAgICAgICMgRXhwYW5kIHRoZSBzeXNyb290IHRvIGVhc2UgZXh0cmFjdGluZyB0aGUgZGlyZWN0b3JpZXMgbGF0ZXIuCisgICAgICAgaWYgdGVzdCAteiAiJHByZXYiOyB0aGVuCisgICAgICAgICBjYXNlICRwIGluCisgICAgICAgICAtTCopIGZ1bmNfc3RyaXBuYW1lX2NuZiAnLUwnICcnICIkcCI7IHByZXY9LUw7IHA9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCA7OworICAgICAgICAgLVIqKSBmdW5jX3N0cmlwbmFtZV9jbmYgJy1SJyAnJyAiJHAiOyBwcmV2PS1SOyBwPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQgOzsKKyAgICAgICAgIC1sKikgZnVuY19zdHJpcG5hbWVfY25mICctbCcgJycgIiRwIjsgcHJldj0tbDsgcD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0IDs7CisgICAgICAgICBlc2FjCisgICAgICAgZmkKKyAgICAgICBjYXNlICRwIGluCisgICAgICAgPSopIGZ1bmNfc3RyaXBuYW1lX2NuZiAnPScgJycgIiRwIjsgcD0kbHRfc3lzcm9vdCRmdW5jX3N0cmlwbmFtZV9yZXN1bHQgOzsKKyAgICAgICBlc2FjCiAgICAgICAgaWYgdGVzdCAiJHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmUiID0gbm87IHRoZW4KLQkgY2FzZSAkcCBpbgotCSAtTCogfCAtUiopCisJIGNhc2UgJHtwcmV2fSBpbgorCSAtTCB8IC1SKQogCSAgICMgSW50ZXJuYWwgY29tcGlsZXIgbGlicmFyeSBwYXRocyBzaG91bGQgY29tZSBhZnRlciB0aG9zZQogCSAgICMgcHJvdmlkZWQgdGhlIHVzZXIuICBUaGUgcG9zdGRlcHMgYWxyZWFkeSBjb21lIGFmdGVyIHRoZQogCSAgICMgdXNlciBzdXBwbGllZCBsaWJzIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gcHJvY2VzcyB0aGVtLgpAQCAtNjQ0Myw4ICs3MDQ4LDEwIEBACiAJICAgX0xUX1RBR1ZBUihwb3N0ZGVwcywgJDEpPSIke19MVF9UQUdWQVIocG9zdGRlcHMsICQxKX0gJHtwcmV2fSR7cH0iCiAJIGZpCiAgICAgICAgZmkKKyAgICAgICBwcmV2PQogICAgICAgIDs7CiAKKyAgICAqLmx0by4kb2JqZXh0KSA7OyAjIElnbm9yZSBHQ0MgTFRPIG9iamVjdHMKICAgICAqLiRvYmpleHQpCiAgICAgICAgIyBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgdGVzdCBvYmplY3QgZmlsZSBvbmx5IHNob3dzIHVwCiAgICAgICAgIyBvbmNlIGluIHRoZSBjb21waWxlciBvdXRwdXQuCkBAIC02NDgwLDYgKzcwODcsNyBAQAogZmkKIAogJFJNIC1mIGNvbmZlc3QuJG9iamV4dAorQ0ZMQUdTPSRfbHRfbGliZGVwc19zYXZlX0NGTEFHUwogCiAjIFBPUlRNRTogb3ZlcnJpZGUgYWJvdmUgdGVzdCBvbiBzeXN0ZW1zIHdoZXJlIGl0IGlzIGJyb2tlbgogbTRfaWYoWyQxXSwgW0NYWF0sCkBAIC02NTE2LDcgKzcxMjQsNyBAQAogCiBzb2xhcmlzKikKICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgQ0MqKQorICBDQyogfCBzdW5DQyopCiAgICAgIyBUaGUgbW9yZSBzdGFuZGFyZHMtY29uZm9ybWluZyBzdGxwb3J0NCBsaWJyYXJ5IGlzCiAgICAgIyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgQ3N0ZCBsaWJyYXJ5LiBBdm9pZCBzcGVjaWZ5aW5nCiAgICAgIyBpdCBpZiBpdCdzIGluIENYWEZMQUdTLiBJZ25vcmUgbGliQ3J1biBhcwpAQCAtNjU2MCwzMiArNzE2OCwxNiBAQAogXSkjIF9MVF9TWVNfSElEREVOX0xJQkRFUFMKIAogCi0jIF9MVF9QUk9HX0Y3NwotIyAtLS0tLS0tLS0tLS0KLSMgU2luY2UgQUNfUFJPR19GNzcgaXMgYnJva2VuLCBpbiB0aGF0IGl0IHJldHVybnMgdGhlIGVtcHR5IHN0cmluZwotIyBpZiB0aGVyZSBpcyBubyBmb3J0cmFuIGNvbXBpbGVyLCB3ZSBoYXZlIG91ciBvd24gdmVyc2lvbiBoZXJlLgotbTRfZGVmdW4oW19MVF9QUk9HX0Y3N10sCi1bCi1wdXNoZGVmKFtBQ19NU0dfRVJST1JdLCBbX2x0X2Rpc2FibGVfRjc3PXllc10pCi1BQ19QUk9HX0Y3NwotaWYgdGVzdCAteiAiJEY3NyIgfHwgdGVzdCAiWCRGNzciID0gIlhubyI7IHRoZW4KLSAgX2x0X2Rpc2FibGVfRjc3PXllcwotZmkKLXBvcGRlZihbQUNfTVNHX0VSUk9SXSkKLV0pIyBfTFRfUFJPR19GNzcKLQotZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgotZG5sIEFDX0RFRlVOKFtfTFRfUFJPR19GNzddLCBbXSkKLQotCiAjIF9MVF9MQU5HX0Y3N19DT05GSUcoW1RBR10pCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgYSBGb3J0cmFuIDc3IGNvbXBpbGVyIGFyZQogIyBzdWl0YWJseSBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHCiAjIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KIG00X2RlZnVuKFtfTFRfTEFOR19GNzdfQ09ORklHXSwKLVtBQ19SRVFVSVJFKFtfTFRfUFJPR19GNzddKWRubAotQUNfTEFOR19QVVNIKEZvcnRyYW4gNzcpCitbQUNfTEFOR19QVVNIKEZvcnRyYW4gNzcpCitpZiB0ZXN0IC16ICIkRjc3IiB8fCB0ZXN0ICJYJEY3NyIgPSAiWG5vIjsgdGhlbgorICBfbHRfZGlzYWJsZV9GNzc9eWVzCitmaQogCiBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KQEAgLTY1OTUsNyArNzE4Nyw2IEBACiBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCiBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPW5vCiBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KLV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPQogX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CiBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT1ubwogX0xUX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT1ubwpAQCAtNjYwNCw2ICs3MTk1LDggQEAKIF9MVF9UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9CiBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT11bmtub3duCiBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0kb2xkX2FyY2hpdmVfY21kcworX0xUX1RBR1ZBUihyZWxvYWRfZmxhZywgJDEpPSRyZWxvYWRfZmxhZworX0xUX1RBR1ZBUihyZWxvYWRfY21kcywgJDEpPSRyZWxvYWRfY21kcwogX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPQogX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQogX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9bm8KQEAgLTY2NDMsNyArNzIzNiw5IEBACiAgICMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCiAgIGx0X3NhdmVfQ0M9IiRDQyIKICAgbHRfc2F2ZV9HQ0M9JEdDQworICBsdF9zYXZlX0NGTEFHUz0kQ0ZMQUdTCiAgIENDPSR7Rjc3LSJmNzcifQorICBDRkxBR1M9JEZGTEFHUwogICBjb21waWxlcj0kQ0MKICAgX0xUX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQwogICBfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCkBAIC02Njk3LDM4ICs3MjkyLDI0IEBACiAKICAgR0NDPSRsdF9zYXZlX0dDQwogICBDQz0iJGx0X3NhdmVfQ0MiCisgIENGTEFHUz0iJGx0X3NhdmVfQ0ZMQUdTIgogZmkgIyB0ZXN0ICIkX2x0X2Rpc2FibGVfRjc3IiAhPSB5ZXMKIAogQUNfTEFOR19QT1AKIF0pIyBfTFRfTEFOR19GNzdfQ09ORklHCiAKIAotIyBfTFRfUFJPR19GQwotIyAtLS0tLS0tLS0tLQotIyBTaW5jZSBBQ19QUk9HX0ZDIGlzIGJyb2tlbiwgaW4gdGhhdCBpdCByZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcKLSMgaWYgdGhlcmUgaXMgbm8gZm9ydHJhbiBjb21waWxlciwgd2UgaGF2ZSBvdXIgb3duIHZlcnNpb24gaGVyZS4KLW00X2RlZnVuKFtfTFRfUFJPR19GQ10sCi1bCi1wdXNoZGVmKFtBQ19NU0dfRVJST1JdLCBbX2x0X2Rpc2FibGVfRkM9eWVzXSkKLUFDX1BST0dfRkMKLWlmIHRlc3QgLXogIiRGQyIgfHwgdGVzdCAiWCRGQyIgPSAiWG5vIjsgdGhlbgotICBfbHRfZGlzYWJsZV9GQz15ZXMKLWZpCi1wb3BkZWYoW0FDX01TR19FUlJPUl0pCi1dKSMgX0xUX1BST0dfRkMKLQotZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgotZG5sIEFDX0RFRlVOKFtfTFRfUFJPR19GQ10sIFtdKQotCi0KICMgX0xUX0xBTkdfRkNfQ09ORklHKFtUQUddKQogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgYSBGb3J0cmFuIGNvbXBpbGVyIGFyZQogIyBzdWl0YWJseSBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHCiAjIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KIG00X2RlZnVuKFtfTFRfTEFOR19GQ19DT05GSUddLAotW0FDX1JFUVVJUkUoW19MVF9QUk9HX0ZDXSlkbmwKLUFDX0xBTkdfUFVTSChGb3J0cmFuKQorW0FDX0xBTkdfUFVTSChGb3J0cmFuKQorCitpZiB0ZXN0IC16ICIkRkMiIHx8IHRlc3QgIlgkRkMiID0gIlhubyI7IHRoZW4KKyAgX2x0X2Rpc2FibGVfRkM9eWVzCitmaQogCiBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KQEAgLTY3MzgsNyArNzMxOSw2IEBACiBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCiBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPW5vCiBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KLV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPQogX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CiBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT1ubwogX0xUX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT1ubwpAQCAtNjc0Nyw2ICs3MzI3LDggQEAKIF9MVF9UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9CiBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT11bmtub3duCiBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0kb2xkX2FyY2hpdmVfY21kcworX0xUX1RBR1ZBUihyZWxvYWRfZmxhZywgJDEpPSRyZWxvYWRfZmxhZworX0xUX1RBR1ZBUihyZWxvYWRfY21kcywgJDEpPSRyZWxvYWRfY21kcwogX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPQogX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQogX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9bm8KQEAgLTY3ODYsNyArNzM2OCw5IEBACiAgICMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCiAgIGx0X3NhdmVfQ0M9IiRDQyIKICAgbHRfc2F2ZV9HQ0M9JEdDQworICBsdF9zYXZlX0NGTEFHUz0kQ0ZMQUdTCiAgIENDPSR7RkMtImY5NSJ9CisgIENGTEFHUz0kRkNGTEFHUwogICBjb21waWxlcj0kQ0MKICAgR0NDPSRhY19jdl9mY19jb21waWxlcl9nbnUKIApAQCAtNjg0Miw3ICs3NDI2LDggQEAKICAgZmkgIyB0ZXN0IC1uICIkY29tcGlsZXIiCiAKICAgR0NDPSRsdF9zYXZlX0dDQwotICBDQz0iJGx0X3NhdmVfQ0MiCisgIENDPSRsdF9zYXZlX0NDCisgIENGTEFHUz0kbHRfc2F2ZV9DRkxBR1MKIGZpICMgdGVzdCAiJF9sdF9kaXNhYmxlX0ZDIiAhPSB5ZXMKIAogQUNfTEFOR19QT1AKQEAgLTY4NzksMTAgKzc0NjQsMTIgQEAKIF9MVF9MSU5LRVJfQk9JTEVSUExBVEUKIAogIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLWx0X3NhdmVfQ0M9IiRDQyIKK2x0X3NhdmVfQ0M9JENDCitsdF9zYXZlX0NGTEFHUz0kQ0ZMQUdTCiBsdF9zYXZlX0dDQz0kR0NDCiBHQ0M9eWVzCiBDQz0ke0dDSi0iZ2NqIn0KK0NGTEFHUz0kR0NKRkxBR1MKIGNvbXBpbGVyPSRDQwogX0xUX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQwogX0xUX1RBR1ZBUihMRCwgJDEpPSIkTEQiCkBAIC02ODkyLDYgKzc0NzksOCBAQAogX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCiAKIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCitfTFRfVEFHVkFSKHJlbG9hZF9mbGFnLCAkMSk9JHJlbG9hZF9mbGFnCitfTFRfVEFHVkFSKHJlbG9hZF9jbWRzLCAkMSk9JHJlbG9hZF9jbWRzCiAKICMjIENBVkVBVCBFTVBUT1I6CiAjIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQpAQCAtNjkxMSwxMCArNzUwMCw4MiBAQAogQUNfTEFOR19SRVNUT1JFCiAKIEdDQz0kbHRfc2F2ZV9HQ0MKLUNDPSIkbHRfc2F2ZV9DQyIKK0NDPSRsdF9zYXZlX0NDCitDRkxBR1M9JGx0X3NhdmVfQ0ZMQUdTCiBdKSMgX0xUX0xBTkdfR0NKX0NPTkZJRwogCiAKKyMgX0xUX0xBTkdfR09fQ09ORklHKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZm9yIHRoZSBHTlUgR28gY29tcGlsZXIKKyMgYXJlIHN1aXRhYmx5IGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcKKyMgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorbTRfZGVmdW4oW19MVF9MQU5HX0dPX0NPTkZJR10sCitbQUNfUkVRVUlSRShbTFRfUFJPR19HT10pZG5sCitBQ19MQU5HX1NBVkUKKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEdvIHRlc3Qgc291cmNlcy4KK2FjX2V4dD1nbworCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgR28gdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJwYWNrYWdlIG1haW47IGZ1bmMgbWFpbigpIHsgfSIKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0ncGFja2FnZSBtYWluOyBmdW5jIG1haW4oKSB7IH0nCisKKyMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KK19MVF9UQUdfQ09NUElMRVIKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK19MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorbHRfc2F2ZV9DQz0kQ0MKK2x0X3NhdmVfQ0ZMQUdTPSRDRkxBR1MKK2x0X3NhdmVfR0NDPSRHQ0MKK0dDQz15ZXMKK0NDPSR7R09DLSJnY2NnbyJ9CitDRkxBR1M9JEdPRkxBR1MKK2NvbXBpbGVyPSRDQworX0xUX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQworX0xUX1RBR1ZBUihMRCwgJDEpPSIkTEQiCitfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCisKKyMgR28gZGlkIG5vdCBleGlzdCBhdCB0aGUgdGltZSBHQ0MgZGlkbid0IGltcGxpY2l0bHkgbGluayBsaWJjIGluLgorX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisKK19MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCitfTFRfVEFHVkFSKHJlbG9hZF9mbGFnLCAkMSk9JHJlbG9hZF9mbGFnCitfTFRfVEFHVkFSKHJlbG9hZF9jbWRzLCAkMSk9JHJlbG9hZF9jbWRzCisKKyMjIENBVkVBVCBFTVBUT1I6CisjIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQorIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKKyMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgoraWYgdGVzdCAtbiAiJGNvbXBpbGVyIjsgdGhlbgorICBfTFRfQ09NUElMRVJfTk9fUlRUSSgkMSkKKyAgX0xUX0NPTVBJTEVSX1BJQygkMSkKKyAgX0xUX0NPTVBJTEVSX0NfTygkMSkKKyAgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MoJDEpCisgIF9MVF9MSU5LRVJfU0hMSUJTKCQxKQorICBfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEgoJDEpCisKKyAgX0xUX0NPTkZJRygkMSkKK2ZpCisKK0FDX0xBTkdfUkVTVE9SRQorCitHQ0M9JGx0X3NhdmVfR0NDCitDQz0kbHRfc2F2ZV9DQworQ0ZMQUdTPSRsdF9zYXZlX0NGTEFHUworXSkjIF9MVF9MQU5HX0dPX0NPTkZJRworCisKICMgX0xUX0xBTkdfUkNfQ09ORklHKFtUQUddKQogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgdGhlIFdpbmRvd3MgcmVzb3VyY2UgY29tcGlsZXIKQEAgLTY5NDYsOSArNzYwNywxMSBAQAogCiAjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgogbHRfc2F2ZV9DQz0iJENDIgorbHRfc2F2ZV9DRkxBR1M9JENGTEFHUwogbHRfc2F2ZV9HQ0M9JEdDQwogR0NDPQogQ0M9JHtSQy0id2luZHJlcyJ9CitDRkxBR1M9CiBjb21waWxlcj0kQ0MKIF9MVF9UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKIF9MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKQEAgLTY5NjEsNyArNzYyNCw4IEBACiAKIEdDQz0kbHRfc2F2ZV9HQ0MKIEFDX0xBTkdfUkVTVE9SRQotQ0M9IiRsdF9zYXZlX0NDIgorQ0M9JGx0X3NhdmVfQ0MKK0NGTEFHUz0kbHRfc2F2ZV9DRkxBR1MKIF0pIyBfTFRfTEFOR19SQ19DT05GSUcKIAogCkBAIC02OTgxLDYgKzc2NDUsMTMgQEAKIGRubCBBQ19ERUZVTihbTFRfQUNfUFJPR19HQ0pdLCBbXSkKIAogCisjIExUX1BST0dfR08KKyMgLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX1BST0dfR09dLAorW0FDX0NIRUNLX1RPT0woR09DLCBnY2NnbywpCitdKQorCisKICMgTFRfUFJPR19SQwogIyAtLS0tLS0tLS0tCiBBQ19ERUZVTihbTFRfUFJPR19SQ10sCkBAIC03MDIwLDYgKzc2OTEsMTUgQEAKIEFDX1NVQlNUKFtPQkpEVU1QXSkKIF0pCiAKKyMgX0xUX0RFQ0xfRExMVE9PTAorIyAtLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSBETExUT09MIHZhcmlhYmxlIGlzIHNldC4KK200X2RlZnVuKFtfTFRfREVDTF9ETExUT09MXSwKK1tBQ19DSEVDS19UT09MKERMTFRPT0wsIGRsbHRvb2wsIGZhbHNlKQordGVzdCAteiAiJERMTFRPT0wiICYmIERMTFRPT0w9ZGxsdG9vbAorX0xUX0RFQ0woW10sIFtETExUT09MXSwgWzFdLCBbRExMIGNyZWF0aW9uIHByb2dyYW1dKQorQUNfU1VCU1QoW0RMTFRPT0xdKQorXSkKIAogIyBfTFRfREVDTF9TRUQKICMgLS0tLS0tLS0tLS0tCkBAIC03MTEzLDggKzc3OTMsOCBAQAogIyBUcnkgc29tZSBYU0kgZmVhdHVyZXMKIHhzaV9zaGVsbD1ubwogKCBfbHRfZHVtbXk9ImEvYi9jIgotICB0ZXN0ICIke19sdF9kdW1teSMjKi99LCR7X2x0X2R1bW15JS8qfSwiJHtfbHRfZHVtbXklIiRfbHRfZHVtbXkifSwgXAotICAgICAgPSBjLGEvYiwsIFwKKyAgdGVzdCAiJHtfbHRfZHVtbXkjIyovfSwke19sdF9kdW1teSUvKn0sJHtfbHRfZHVtbXkjPz99IiR7X2x0X2R1bW15JSIkX2x0X2R1bW15In0sIFwKKyAgICAgID0gYyxhL2IsYi9jLCBcCiAgICAgJiYgZXZhbCAndGVzdCAkKCggMSArIDEgKSkgLWVxIDIgXAogICAgICYmIHRlc3QgIiR7I19sdF9kdW1teX0iIC1lcSA1JyApID4vZGV2L251bGwgMj4mMSBcCiAgICYmIHhzaV9zaGVsbD15ZXMKQEAgLTcxNTMsMjA4ICs3ODMzLDE2MiBAQAogXSkjIF9MVF9DSEVDS19TSEVMTF9GRUFUVVJFUwogCiAKLSMgX0xUX1BST0dfWFNJX1NIRUxMRk5TCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBCb3VybmUgYW5kIFhTSSBjb21wYXRpYmxlIHZhcmlhbnRzIG9mIHNvbWUgdXNlZnVsIHNoZWxsIGZ1bmN0aW9ucy4KLW00X2RlZnVuKFtfTFRfUFJPR19YU0lfU0hFTExGTlNdLAotW2Nhc2UgJHhzaV9zaGVsbCBpbgotICB5ZXMpCi0gICAgY2F0IDw8IFxfTFRfRU9GID4+ICIkY2ZnZmlsZSIKLQotIyBmdW5jX2Rpcm5hbWUgZmlsZSBhcHBlbmQgbm9uZGlyX3JlcGxhY2VtZW50Ci0jIENvbXB1dGUgdGhlIGRpcm5hbWUgb2YgRklMRS4gIElmIG5vbmVtcHR5LCBhZGQgQVBQRU5EIHRvIHRoZSByZXN1bHQsCi0jIG90aGVyd2lzZSBzZXQgcmVzdWx0IHRvIE5PTkRJUl9SRVBMQUNFTUVOVC4KLWZ1bmNfZGlybmFtZSAoKQotewotICBjYXNlICR7MX0gaW4KLSAgICAqLyopIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7MSUvKn0kezJ9IiA7OwotICAgICogICkgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIgOzsKLSAgZXNhYwotfQotCi0jIGZ1bmNfYmFzZW5hbWUgZmlsZQotZnVuY19iYXNlbmFtZSAoKQotewotICBmdW5jX2Jhc2VuYW1lX3Jlc3VsdD0iJHsxIyMqL30iCi19Ci0KLSMgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSBmaWxlIGFwcGVuZCBub25kaXJfcmVwbGFjZW1lbnQKLSMgcGVyZm9ybSBmdW5jX2Jhc2VuYW1lIGFuZCBmdW5jX2Rpcm5hbWUgaW4gYSBzaW5nbGUgZnVuY3Rpb24KLSMgY2FsbDoKLSMgICBkaXJuYW1lOiAgQ29tcHV0ZSB0aGUgZGlybmFtZSBvZiBGSUxFLiAgSWYgbm9uZW1wdHksCi0jICAgICAgICAgICAgIGFkZCBBUFBFTkQgdG8gdGhlIHJlc3VsdCwgb3RoZXJ3aXNlIHNldCByZXN1bHQKLSMgICAgICAgICAgICAgdG8gTk9ORElSX1JFUExBQ0VNRU5ULgotIyAgICAgICAgICAgICB2YWx1ZSByZXR1cm5lZCBpbiAiJGZ1bmNfZGlybmFtZV9yZXN1bHQiCi0jICAgYmFzZW5hbWU6IENvbXB1dGUgZmlsZW5hbWUgb2YgRklMRS4KLSMgICAgICAgICAgICAgdmFsdWUgcmV0dW5lZCBpbiAiJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgotIyBJbXBsZW1lbnRhdGlvbiBtdXN0IGJlIGtlcHQgc3luY2hyb25pemVkIHdpdGggZnVuY19kaXJuYW1lCi0jIGFuZCBmdW5jX2Jhc2VuYW1lLiBGb3IgZWZmaWNpZW5jeSwgd2UgZG8gbm90IGRlbGVnYXRlIHRvCi0jIHRob3NlIGZ1bmN0aW9ucyBidXQgaW5zdGVhZCBkdXBsaWNhdGUgdGhlIGZ1bmN0aW9uYWxpdHkgaGVyZS4KLWZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgKCkKLXsKLSAgY2FzZSAkezF9IGluCi0gICAgKi8qKSBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezElLyp9JHsyfSIgOzsKLSAgICAqICApIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7M30iIDs7Ci0gIGVzYWMKLSAgZnVuY19iYXNlbmFtZV9yZXN1bHQ9IiR7MSMjKi99IgotfQotCi0jIGZ1bmNfc3RyaXBuYW1lIHByZWZpeCBzdWZmaXggbmFtZQotIyBzdHJpcCBQUkVGSVggYW5kIFNVRkZJWCBvZmYgb2YgTkFNRS4KLSMgUFJFRklYIGFuZCBTVUZGSVggbXVzdCBub3QgY29udGFpbiBnbG9iYmluZyBvciByZWdleCBzcGVjaWFsCi0jIGNoYXJhY3RlcnMsIGhhc2hlcywgcGVyY2VudCBzaWducywgYnV0IFNVRkZJWCBtYXkgY29udGFpbiBhIGxlYWRpbmcKLSMgZG90IChpbiB3aGljaCBjYXNlIHRoYXQgbWF0Y2hlcyBvbmx5IGEgZG90KS4KLWZ1bmNfc3RyaXBuYW1lICgpCi17Ci0gICMgcGRrc2ggNS4yLjE0IGRvZXMgbm90IGRvICR7WCUkWX0gY29ycmVjdGx5IGlmIGJvdGggWCBhbmQgWSBhcmUKLSAgIyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMsIHNvIGFzc2lnbiBvbmUgdG8gb3JkaW5hcnkgcGFyYW1ldGVyIGZpcnN0LgotICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9JHszfQotICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9JHtmdW5jX3N0cmlwbmFtZV9yZXN1bHQjIiR7MX0ifQotICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9JHtmdW5jX3N0cmlwbmFtZV9yZXN1bHQlIiR7Mn0ifQotfQotCi0jIGZ1bmNfb3B0X3NwbGl0Ci1mdW5jX29wdF9zcGxpdCAoKQotewotICBmdW5jX29wdF9zcGxpdF9vcHQ9JHsxJSU9Kn0KLSAgZnVuY19vcHRfc3BsaXRfYXJnPSR7MSMqPX0KLX0KLQotIyBmdW5jX2xvMm8gb2JqZWN0Ci1mdW5jX2xvMm8gKCkKLXsKLSAgY2FzZSAkezF9IGluCi0gICAgKi5sbykgZnVuY19sbzJvX3Jlc3VsdD0kezElLmxvfS4ke29iamV4dH0gOzsKLSAgICAqKSAgICBmdW5jX2xvMm9fcmVzdWx0PSR7MX0gOzsKLSAgZXNhYwotfQotCi0jIGZ1bmNfeGZvcm0gbGlib2JqLW9yLXNvdXJjZQotZnVuY194Zm9ybSAoKQotewotICBmdW5jX3hmb3JtX3Jlc3VsdD0kezElLip9LmxvCi19Ci0KLSMgZnVuY19hcml0aCBhcml0aG1ldGljLXRlcm0uLi4KLWZ1bmNfYXJpdGggKCkKLXsKLSAgZnVuY19hcml0aF9yZXN1bHQ9JCgoICRbKl0gKSkKLX0KLQotIyBmdW5jX2xlbiBzdHJpbmcKLSMgU1RSSU5HIG1heSBub3Qgc3RhcnQgd2l0aCBhIGh5cGhlbi4KLWZ1bmNfbGVuICgpCi17Ci0gIGZ1bmNfbGVuX3Jlc3VsdD0keyMxfQotfQotCi1fTFRfRU9GCi0gICAgOzsKLSAgKikgIyBCb3VybmUgY29tcGF0aWJsZSBmdW5jdGlvbnMuCi0gICAgY2F0IDw8IFxfTFRfRU9GID4+ICIkY2ZnZmlsZSIKLQotIyBmdW5jX2Rpcm5hbWUgZmlsZSBhcHBlbmQgbm9uZGlyX3JlcGxhY2VtZW50Ci0jIENvbXB1dGUgdGhlIGRpcm5hbWUgb2YgRklMRS4gIElmIG5vbmVtcHR5LCBhZGQgQVBQRU5EIHRvIHRoZSByZXN1bHQsCi0jIG90aGVyd2lzZSBzZXQgcmVzdWx0IHRvIE5PTkRJUl9SRVBMQUNFTUVOVC4KLWZ1bmNfZGlybmFtZSAoKQotewotICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgotICBmdW5jX2Rpcm5hbWVfcmVzdWx0PWAkRUNITyAiWCR7MX0iIHwgJFhzZWQgLWUgIiRkaXJuYW1lImAKLSAgaWYgdGVzdCAiWCRmdW5jX2Rpcm5hbWVfcmVzdWx0IiA9ICJYJHsxfSI7IHRoZW4KLSAgICBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezN9IgotICBlbHNlCi0gICAgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJGZ1bmNfZGlybmFtZV9yZXN1bHQkezJ9IgotICBmaQotfQotCi0jIGZ1bmNfYmFzZW5hbWUgZmlsZQotZnVuY19iYXNlbmFtZSAoKQotewotICBmdW5jX2Jhc2VuYW1lX3Jlc3VsdD1gJEVDSE8gIlgkezF9IiB8ICRYc2VkIC1lICIkYmFzZW5hbWUiYAotfQotCi1kbmwgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZQotZG5sIEEgcG9ydGFibGUgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBnZW5lcmFsLm00c2gKLWRubCBzbyB0aGVyZSBpcyBubyBuZWVkIGZvciBpdCBoZXJlLgotCi0jIGZ1bmNfc3RyaXBuYW1lIHByZWZpeCBzdWZmaXggbmFtZQotIyBzdHJpcCBQUkVGSVggYW5kIFNVRkZJWCBvZmYgb2YgTkFNRS4KLSMgUFJFRklYIGFuZCBTVUZGSVggbXVzdCBub3QgY29udGFpbiBnbG9iYmluZyBvciByZWdleCBzcGVjaWFsCi0jIGNoYXJhY3RlcnMsIGhhc2hlcywgcGVyY2VudCBzaWducywgYnV0IFNVRkZJWCBtYXkgY29udGFpbiBhIGxlYWRpbmcKLSMgZG90IChpbiB3aGljaCBjYXNlIHRoYXQgbWF0Y2hlcyBvbmx5IGEgZG90KS4KLSMgZnVuY19zdHJpcF9zdWZmaXggcHJlZml4IG5hbWUKLWZ1bmNfc3RyaXBuYW1lICgpCi17Ci0gIGNhc2UgJHsyfSBpbgotICAgIC4qKSBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9YCRFQ0hPICJYJHszfSIgXAotICAgICAgICAgICB8ICRYc2VkIC1lICJzJV4kezF9JSUiIC1lICJzJVxcXFwkezJ9XCQlJSJgOzsKLSAgICAqKSAgZnVuY19zdHJpcG5hbWVfcmVzdWx0PWAkRUNITyAiWCR7M30iIFwKLSAgICAgICAgICAgfCAkWHNlZCAtZSAicyVeJHsxfSUlIiAtZSAicyUkezJ9XCQlJSJgOzsKLSAgZXNhYwotfQotCi0jIHNlZCBzY3JpcHRzOgotbXlfc2VkX2xvbmdfb3B0PScxcy9eXCgtW1tePV1dKlwpPS4qL1wxLztxJwotbXlfc2VkX2xvbmdfYXJnPScxcy9eLVtbXj1dXSo9Ly8nCi0KLSMgZnVuY19vcHRfc3BsaXQKLWZ1bmNfb3B0X3NwbGl0ICgpCi17Ci0gIGZ1bmNfb3B0X3NwbGl0X29wdD1gJEVDSE8gIlgkezF9IiB8ICRYc2VkIC1lICIkbXlfc2VkX2xvbmdfb3B0ImAKLSAgZnVuY19vcHRfc3BsaXRfYXJnPWAkRUNITyAiWCR7MX0iIHwgJFhzZWQgLWUgIiRteV9zZWRfbG9uZ19hcmciYAotfQotCi0jIGZ1bmNfbG8ybyBvYmplY3QKLWZ1bmNfbG8ybyAoKQotewotICBmdW5jX2xvMm9fcmVzdWx0PWAkRUNITyAiWCR7MX0iIHwgJFhzZWQgLWUgIiRsbzJvImAKLX0KLQotIyBmdW5jX3hmb3JtIGxpYm9iai1vci1zb3VyY2UKLWZ1bmNfeGZvcm0gKCkKLXsKLSAgZnVuY194Zm9ybV9yZXN1bHQ9YCRFQ0hPICJYJHsxfSIgfCAkWHNlZCAtZSAncy9cLltbXi5dXSokLy5sby8nYAotfQotCi0jIGZ1bmNfYXJpdGggYXJpdGhtZXRpYy10ZXJtLi4uCi1mdW5jX2FyaXRoICgpCi17Ci0gIGZ1bmNfYXJpdGhfcmVzdWx0PWBleHByICIkW0BdImAKLX0KLQotIyBmdW5jX2xlbiBzdHJpbmcKLSMgU1RSSU5HIG1heSBub3Qgc3RhcnQgd2l0aCBhIGh5cGhlbi4KLWZ1bmNfbGVuICgpCi17Ci0gIGZ1bmNfbGVuX3Jlc3VsdD1gZXhwciAiJFsxXSIgOiAiLioiIDI+L2Rldi9udWxsIHx8IGVjaG8gJG1heF9jbWRfbGVuYAotfQotCi1fTFRfRU9GCi1lc2FjCi0KLWNhc2UgJGx0X3NoZWxsX2FwcGVuZCBpbgotICB5ZXMpCi0gICAgY2F0IDw8IFxfTFRfRU9GID4+ICIkY2ZnZmlsZSIKLQotIyBmdW5jX2FwcGVuZCB2YXIgdmFsdWUKLSMgQXBwZW5kIFZBTFVFIHRvIHRoZSBlbmQgb2Ygc2hlbGwgdmFyaWFibGUgVkFSLgotZnVuY19hcHBlbmQgKCkKLXsKLSAgZXZhbCAiJFsxXSs9XCRbMl0iCi19Ci1fTFRfRU9GCi0gICAgOzsKLSAgKikKLSAgICBjYXQgPDwgXF9MVF9FT0YgPj4gIiRjZmdmaWxlIgotCi0jIGZ1bmNfYXBwZW5kIHZhciB2YWx1ZQotIyBBcHBlbmQgVkFMVUUgdG8gdGhlIGVuZCBvZiBzaGVsbCB2YXJpYWJsZSBWQVIuCi1mdW5jX2FwcGVuZCAoKQotewotICBldmFsICIkWzFdPVwkJFsxXVwkWzJdIgotfQotCi1fTFRfRU9GCi0gICAgOzsKLSAgZXNhYworIyBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFIChGVU5DTkFNRSwgUkVQTEFDRU1FTlQtQk9EWSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEluIGAkY2ZnZmlsZScsIGxvb2sgZm9yIGZ1bmN0aW9uIEZVTkNOQU1FIGRlbGltaXRlZCBieSBgXkZVTkNOQU1FICgpJCcgYW5kCisjICdefSBGVU5DTkFNRSAnLCBhbmQgcmVwbGFjZSBpdHMgYm9keSB3aXRoIFJFUExBQ0VNRU5ULUJPRFkuCittNF9kZWZ1bihbX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRV0sCitbZG5sIHsKK3NlZCAtZSAnL14kMSAoKSQvLC9efSAjICQxIC9jXAorJDEgKClcCit7XAorbTRfYnBhdHN1YnN0cyhbJDJdLCBbJF0sIFtcXF0sIFteXChbCSBdXCldLCBbXFxcMV0pCit9ICMgRXh0ZW5kZWQtc2hlbGwgJDEgaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKIF0pCisKKworIyBfTFRfUFJPR19SRVBMQUNFX1NIRUxMRk5TCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmVwbGFjZSBleGlzdGluZyBwb3J0YWJsZSBpbXBsZW1lbnRhdGlvbnMgb2Ygc2V2ZXJhbCBzaGVsbCBmdW5jdGlvbnMgd2l0aAorIyBlcXVpdmFsZW50IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9ucyB3aGVyZSB0aG9zZSBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlLi4KK200X2RlZnVuKFtfTFRfUFJPR19SRVBMQUNFX1NIRUxMRk5TXSwKK1tpZiB0ZXN0IHgiJHhzaV9zaGVsbCIgPSB4eWVzOyB0aGVuCisgIF9MVF9QUk9HX0ZVTkNUSU9OX1JFUExBQ0UoW2Z1bmNfZGlybmFtZV0sIFtkbmwKKyAgICBjYXNlICR7MX0gaW4KKyAgICAgICovKikgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHsxJS8qfSR7Mn0iIDs7CisgICAgICAqICApIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7M30iIDs7CisgICAgZXNhY10pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19iYXNlbmFtZV0sIFtkbmwKKyAgICBmdW5jX2Jhc2VuYW1lX3Jlc3VsdD0iJHsxIyMqL30iXSkKKworICBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFKFtmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lXSwgW2RubAorICAgIGNhc2UgJHsxfSBpbgorICAgICAgKi8qKSBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezElLyp9JHsyfSIgOzsKKyAgICAgICogICkgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIgOzsKKyAgICBlc2FjCisgICAgZnVuY19iYXNlbmFtZV9yZXN1bHQ9IiR7MSMjKi99Il0pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19zdHJpcG5hbWVdLCBbZG5sCisgICAgIyBwZGtzaCA1LjIuMTQgZG9lcyBub3QgZG8gJHtYJSRZfSBjb3JyZWN0bHkgaWYgYm90aCBYIGFuZCBZIGFyZQorICAgICMgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLCBzbyBhc3NpZ24gb25lIHRvIG9yZGluYXJ5IHBhcmFtZXRlciBmaXJzdC4KKyAgICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9JHszfQorICAgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0ke2Z1bmNfc3RyaXBuYW1lX3Jlc3VsdCMiJHsxfSJ9CisgICAgZnVuY19zdHJpcG5hbWVfcmVzdWx0PSR7ZnVuY19zdHJpcG5hbWVfcmVzdWx0JSIkezJ9In1dKQorCisgIF9MVF9QUk9HX0ZVTkNUSU9OX1JFUExBQ0UoW2Z1bmNfc3BsaXRfbG9uZ19vcHRdLCBbZG5sCisgICAgZnVuY19zcGxpdF9sb25nX29wdF9uYW1lPSR7MSUlPSp9CisgICAgZnVuY19zcGxpdF9sb25nX29wdF9hcmc9JHsxIyo9fV0pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19zcGxpdF9zaG9ydF9vcHRdLCBbZG5sCisgICAgZnVuY19zcGxpdF9zaG9ydF9vcHRfYXJnPSR7MSM/P30KKyAgICBmdW5jX3NwbGl0X3Nob3J0X29wdF9uYW1lPSR7MSUiJGZ1bmNfc3BsaXRfc2hvcnRfb3B0X2FyZyJ9XSkKKworICBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFKFtmdW5jX2xvMm9dLCBbZG5sCisgICAgY2FzZSAkezF9IGluCisgICAgICAqLmxvKSBmdW5jX2xvMm9fcmVzdWx0PSR7MSUubG99LiR7b2JqZXh0fSA7OworICAgICAgKikgICAgZnVuY19sbzJvX3Jlc3VsdD0kezF9IDs7CisgICAgZXNhY10pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY194Zm9ybV0sIFsgICAgZnVuY194Zm9ybV9yZXN1bHQ9JHsxJS4qfS5sb10pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19hcml0aF0sIFsgICAgZnVuY19hcml0aF9yZXN1bHQ9JCgoICRbKl0gKSldKQorCisgIF9MVF9QUk9HX0ZVTkNUSU9OX1JFUExBQ0UoW2Z1bmNfbGVuXSwgWyAgICBmdW5jX2xlbl9yZXN1bHQ9JHsjMX1dKQorZmkKKworaWYgdGVzdCB4IiRsdF9zaGVsbF9hcHBlbmQiID0geHllczsgdGhlbgorICBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFKFtmdW5jX2FwcGVuZF0sIFsgICAgZXZhbCAiJHsxfSs9XFwkezJ9Il0pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19hcHBlbmRfcXVvdGVkXSwgW2RubAorICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiR7Mn0iCitkbmwgbTQgZXhwYW5zaW9uIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHRoZW4gdGhlIHNoZWxsIGV2YWwgdHVybnMgdGhhdCBpbnRvIFwKKyAgICBldmFsICIkezF9Kz1cXFxcIFxcJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0Il0pCisKKyAgIyBTYXZlIGEgYGZ1bmNfYXBwZW5kJyBmdW5jdGlvbiBjYWxsIHdoZXJlIHBvc3NpYmxlIGJ5IGRpcmVjdCB1c2Ugb2YgJys9JworICBzZWQgLWUgJ3MlZnVuY19hcHBlbmQgXChbW2EtekEtWl9dXVx7MSxcfVwpICIlXDErPSIlZycgJGNmZ2ZpbGUgPiAkY2ZnZmlsZS50bXAgXAorICAgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKKyAgdGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKK2Vsc2UKKyAgIyBTYXZlIGEgYGZ1bmNfYXBwZW5kJyBmdW5jdGlvbiBjYWxsIGV2ZW4gd2hlbiAnKz0nIGlzIG5vdCBhdmFpbGFibGUKKyAgc2VkIC1lICdzJWZ1bmNfYXBwZW5kIFwoW1thLXpBLVpfXV1cezEsXH1cKSAiJVwxPSIkXDElZycgJGNmZ2ZpbGUgPiAkY2ZnZmlsZS50bXAgXAorICAgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKKyAgdGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKK2ZpCisKK2lmIHRlc3QgeCIkX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbCIgPSB4IjoiOyB0aGVuCisgIEFDX01TR19XQVJOKFtVbmFibGUgdG8gc3Vic3RpdHV0ZSBleHRlbmRlZCBzaGVsbCBmdW5jdGlvbnMgaW4gJG9maWxlXSkKK2ZpCitdKQorCisjIF9MVF9QQVRIX0NPTlZFUlNJT05fRlVOQ1RJT05TCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERldGVybWluZSB3aGljaCBmaWxlIG5hbWUgY29udmVyc2lvbiBmdW5jdGlvbnMgc2hvdWxkIGJlIHVzZWQgYnkKKyMgZnVuY190b19ob3N0X2ZpbGUgKGFuZCwgaW1wbGljaXRseSwgYnkgZnVuY190b19ob3N0X3BhdGgpLiAgVGhlc2UgYXJlIG5lZWRlZAorIyBmb3IgY2VydGFpbiBjcm9zcy1jb21waWxlIGNvbmZpZ3VyYXRpb25zIGFuZCBuYXRpdmUgbWluZ3cuCittNF9kZWZ1bihbX0xUX1BBVEhfQ09OVkVSU0lPTl9GVU5DVElPTlNdLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCitBQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBjb252ZXJ0ICRidWlsZCBmaWxlIG5hbWVzIHRvICRob3N0IGZvcm1hdF0pCitBQ19DQUNIRV9WQUwobHRfY3ZfdG9faG9zdF9maWxlX2NtZCwKK1tjYXNlICRob3N0IGluCisgICotKi1taW5ndyogKQorICAgIGNhc2UgJGJ1aWxkIGluCisgICAgICAqLSotbWluZ3cqICkgIyBhY3R1YWxseSBtc3lzCisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKyAgICAgICAgOzsKKyAgICAgICotKi1jeWd3aW4qICkKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9jeWd3aW5fdG9fdzMyCisgICAgICAgIDs7CisgICAgICAqICkgIyBvdGhlcndpc2UsIGFzc3VtZSAqbml4CisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbml4X3RvX3czMgorICAgICAgICA7OworICAgIGVzYWMKKyAgICA7OworICAqLSotY3lnd2luKiApCisgICAgY2FzZSAkYnVpbGQgaW4KKyAgICAgICotKi1taW5ndyogKSAjIGFjdHVhbGx5IG1zeXMKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX2N5Z3dpbgorICAgICAgICA7OworICAgICAgKi0qLWN5Z3dpbiogKQorICAgICAgICBsdF9jdl90b19ob3N0X2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX25vb3AKKyAgICAgICAgOzsKKyAgICAgICogKSAjIG90aGVyd2lzZSwgYXNzdW1lICpuaXgKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9uaXhfdG9fY3lnd2luCisgICAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisgICogKSAjIHVuaGFuZGxlZCBob3N0cyAoYW5kICJub3JtYWwiIG5hdGl2ZSBidWlsZHMpCisgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9ub29wCisgICAgOzsKK2VzYWMKK10pCit0b19ob3N0X2ZpbGVfY21kPSRsdF9jdl90b19ob3N0X2ZpbGVfY21kCitBQ19NU0dfUkVTVUxUKFskbHRfY3ZfdG9faG9zdF9maWxlX2NtZF0pCitfTFRfREVDTChbdG9faG9zdF9maWxlX2NtZF0sIFtsdF9jdl90b19ob3N0X2ZpbGVfY21kXSwKKyAgICAgICAgIFswXSwgW2NvbnZlcnQgJGJ1aWxkIGZpbGUgbmFtZXMgdG8gJGhvc3QgZm9ybWF0XSlkbmwKKworQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gY29udmVydCAkYnVpbGQgZmlsZSBuYW1lcyB0byB0b29sY2hhaW4gZm9ybWF0XSkKK0FDX0NBQ0hFX1ZBTChsdF9jdl90b190b29sX2ZpbGVfY21kLAorWyNhc3N1bWUgb3JkaW5hcnkgY3Jvc3MgdG9vbHMsIG9yIG5hdGl2ZSBidWlsZC4KK2x0X2N2X3RvX3Rvb2xfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbm9vcAorY2FzZSAkaG9zdCBpbgorICAqLSotbWluZ3cqICkKKyAgICBjYXNlICRidWlsZCBpbgorICAgICAgKi0qLW1pbmd3KiApICMgYWN0dWFsbHkgbXN5cworICAgICAgICBsdF9jdl90b190b29sX2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisgICAgICAgIDs7CisgICAgZXNhYworICAgIDs7Citlc2FjCitdKQordG9fdG9vbF9maWxlX2NtZD0kbHRfY3ZfdG9fdG9vbF9maWxlX2NtZAorQUNfTVNHX1JFU1VMVChbJGx0X2N2X3RvX3Rvb2xfZmlsZV9jbWRdKQorX0xUX0RFQ0woW3RvX3Rvb2xfZmlsZV9jbWRdLCBbbHRfY3ZfdG9fdG9vbF9maWxlX2NtZF0sCisgICAgICAgICBbMF0sIFtjb252ZXJ0ICRidWlsZCBmaWxlcyB0byB0b29sY2hhaW4gZm9ybWF0XSlkbmwKK10pIyBfTFRfUEFUSF9DT05WRVJTSU9OX0ZVTkNUSU9OUwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9tNC9sdG9wdGlvbnMubTQgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL200L2x0b3B0aW9ucy5tNAppbmRleCAzNDE1MWEzLi41ZDlhY2Q4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL200L2x0b3B0aW9ucy5tNAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL200L2x0b3B0aW9ucy5tNApAQCAtMSwxMyArMSwxNCBAQAogIyBIZWxwZXIgZnVuY3Rpb25zIGZvciBvcHRpb24gaGFuZGxpbmcuICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCiAjCi0jICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyAgIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNywgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjICAgSW5jLgogIyAgIFdyaXR0ZW4gYnkgR2FyeSBWLiBWYXVnaGFuLCAyMDA0CiAjCiAjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCiAjIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAogIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KIAotIyBzZXJpYWwgNiBsdG9wdGlvbnMubTQKKyMgc2VyaWFsIDcgbHRvcHRpb25zLm00CiAKICMgVGhpcyBpcyB0byBoZWxwIGFjbG9jYWwgZmluZCB0aGVzZSBtYWNyb3MsIGFzIGl0IGNhbid0IHNlZSBtNF9kZWZpbmUuCiBBQ19ERUZVTihbTFRPUFRJT05TX1ZFUlNJT05dLCBbbTRfaWYoWzFdKV0pCkBAIC0xMjUsNyArMTI2LDcgQEAKIFtlbmFibGVfd2luMzJfZGxsPXllcwogCiBjYXNlICRob3N0IGluCi0qLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLWNlZ2NjKikKKyotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1jZWdjYyopCiAgIEFDX0NIRUNLX1RPT0woQVMsIGFzLCBmYWxzZSkKICAgQUNfQ0hFQ0tfVE9PTChETExUT09MLCBkbGx0b29sLCBmYWxzZSkKICAgQUNfQ0hFQ0tfVE9PTChPQkpEVU1QLCBvYmpkdW1wLCBmYWxzZSkKQEAgLTEzMywxMyArMTM0LDEzIEBACiBlc2FjCiAKIHRlc3QgLXogIiRBUyIgJiYgQVM9YXMKLV9MVF9ERUNMKFtdLCBbQVNdLCAgICAgIFswXSwgW0Fzc2VtYmxlciBwcm9ncmFtXSlkbmwKK19MVF9ERUNMKFtdLCBbQVNdLCAgICAgIFsxXSwgW0Fzc2VtYmxlciBwcm9ncmFtXSlkbmwKIAogdGVzdCAteiAiJERMTFRPT0wiICYmIERMTFRPT0w9ZGxsdG9vbAotX0xUX0RFQ0woW10sIFtETExUT09MXSwgWzBdLCBbRExMIGNyZWF0aW9uIHByb2dyYW1dKWRubAorX0xUX0RFQ0woW10sIFtETExUT09MXSwgWzFdLCBbRExMIGNyZWF0aW9uIHByb2dyYW1dKWRubAogCiB0ZXN0IC16ICIkT0JKRFVNUCIgJiYgT0JKRFVNUD1vYmpkdW1wCi1fTFRfREVDTChbXSwgW09CSkRVTVBdLCBbMF0sIFtPYmplY3QgZHVtcGVyIHByb2dyYW1dKWRubAorX0xUX0RFQ0woW10sIFtPQkpEVU1QXSwgWzFdLCBbT2JqZWN0IGR1bXBlciBwcm9ncmFtXSlkbmwKIF0pIyB3aW4zMi1kbGwKIAogQVVfREVGVU4oW0FDX0xJQlRPT0xfV0lOMzJfRExMXSwKQEAgLTMyNSw5ICszMjYsMjQgQEAKICMgTU9ERSBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGBib3RoJy4KIG00X2RlZmluZShbX0xUX1dJVEhfUElDXSwKIFtBQ19BUkdfV0lUSChbcGljXSwKLSAgICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1waWNdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLXBpY0A8OkA9UEtHU0A6PkBdLAogCVt0cnkgdG8gdXNlIG9ubHkgUElDL25vbi1QSUMgb2JqZWN0cyBAPDpAZGVmYXVsdD11c2UgYm90aEA6PkBdKV0sCi0gICAgW3BpY19tb2RlPSIkd2l0aHZhbCJdLAorICAgIFtsdF9wPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJHdpdGh2YWwgaW4KKyAgICB5ZXN8bm8pIHBpY19tb2RlPSR3aXRodmFsIDs7CisgICAgKikKKyAgICAgIHBpY19tb2RlPWRlZmF1bHQKKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIGx0X3BrZyBpbiAkd2l0aHZhbDsgZG8KKwlJRlM9IiRsdF9zYXZlX2lmcyIKKwlpZiB0ZXN0ICJYJGx0X3BrZyIgPSAiWCRsdF9wIjsgdGhlbgorCSAgcGljX21vZGU9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjXSwKICAgICBbcGljX21vZGU9ZGVmYXVsdF0pCiAKIHRlc3QgLXogIiRwaWNfbW9kZSIgJiYgcGljX21vZGU9bTRfZGVmYXVsdChbJDFdLCBbZGVmYXVsdF0pCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL200L2x0dmVyc2lvbi5tNCBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbTQvbHR2ZXJzaW9uLm00CmluZGV4IGI4ZTE1NGYuLjA3YTg2MDIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbTQvbHR2ZXJzaW9uLm00CisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbTQvbHR2ZXJzaW9uLm00CkBAIC03LDE3ICs3LDE3IEBACiAjIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAogIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KIAotIyBHZW5lcmF0ZWQgZnJvbSBsdHZlcnNpb24uaW4uCisjIEBjb25maWd1cmVfaW5wdXRACiAKLSMgc2VyaWFsIDMwMTIgbHR2ZXJzaW9uLm00CisjIHNlcmlhbCAzMzM3IGx0dmVyc2lvbi5tNAogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgTGlidG9vbAogCi1tNF9kZWZpbmUoW0xUX1BBQ0tBR0VfVkVSU0lPTl0sIFsyLjIuNl0pCi1tNF9kZWZpbmUoW0xUX1BBQ0tBR0VfUkVWSVNJT05dLCBbMS4zMDEyXSkKK200X2RlZmluZShbTFRfUEFDS0FHRV9WRVJTSU9OXSwgWzIuNC4yXSkKK200X2RlZmluZShbTFRfUEFDS0FHRV9SRVZJU0lPTl0sIFsxLjMzMzddKQogCiBBQ19ERUZVTihbTFRWRVJTSU9OX1ZFUlNJT05dLAotW21hY3JvX3ZlcnNpb249JzIuMi42JwotbWFjcm9fcmV2aXNpb249JzEuMzAxMicKK1ttYWNyb192ZXJzaW9uPScyLjQuMicKK21hY3JvX3JldmlzaW9uPScxLjMzMzcnCiBfTFRfREVDTCgsIG1hY3JvX3ZlcnNpb24sIDAsIFtXaGljaCByZWxlYXNlIG9mIGxpYnRvb2wubTQgd2FzIHVzZWQ/XSkKIF9MVF9ERUNMKCwgbWFjcm9fcmV2aXNpb24sIDApCiBdKQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9tNC9sdH5vYnNvbGV0ZS5tNCBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbTQvbHR+b2Jzb2xldGUubTQKaW5kZXggNjM3YmIyMC4uYzU3M2RhOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9tNC9sdH5vYnNvbGV0ZS5tNAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL200L2x0fm9ic29sZXRlLm00CkBAIC0xLDEzICsxLDEzIEBACiAjIGx0fm9ic29sZXRlLm00IC0tIGFjbG9jYWwgc2F0aXNmeWluZyBvYnNvbGV0ZSBkZWZpbml0aW9ucy4gICAgLSotQXV0b2NvbmYtKi0KICMKLSMgICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA3LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogIyAgIFdyaXR0ZW4gYnkgU2NvdHQgSmFtZXMgUmVtbmFudCwgMjAwNC4KICMKICMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMKICMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0CiAjIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgogCi0jIHNlcmlhbCA0IGx0fm9ic29sZXRlLm00CisjIHNlcmlhbCA1IGx0fm9ic29sZXRlLm00CiAKICMgVGhlc2UgZXhpc3QgZW50aXJlbHkgdG8gZm9vbCBhY2xvY2FsIHdoZW4gYm9vdHN0cmFwcGluZyBsaWJ0b29sLgogIwpAQCAtNzcsNyArNzcsNiBAQAogbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19DWFhdLAkJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19DWFhdKV0pCiBtNF9pZm5kZWYoW19MVF9BQ19MQU5HX0Y3N10sCQlbQUNfREVGVU4oW19MVF9BQ19MQU5HX0Y3N10pXSkKIG00X2lmbmRlZihbX0xUX0FDX0xBTkdfR0NKXSwJCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfR0NKXSldKQotbTRfaWZuZGVmKFtBQ19MSUJUT09MX1JDXSwJCVtBQ19ERUZVTihbQUNfTElCVE9PTF9SQ10pXSkKIG00X2lmbmRlZihbQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfQ19DT05GSUddKV0pCiBtNF9pZm5kZWYoW19MVF9BQ19MQU5HX0NfQ09ORklHXSwJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19DX0NPTkZJR10pXSkKIG00X2lmbmRlZihbQUNfTElCVE9PTF9MQU5HX0NYWF9DT05GSUddLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19DWFhfQ09ORklHXSldKQpAQCAtOTAsMyArODksMTAgQEAKIG00X2lmbmRlZihbX0xUX0FDX0xBTkdfUkNfQ09ORklHXSwJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19SQ19DT05GSUddKV0pCiBtNF9pZm5kZWYoW0FDX0xJQlRPT0xfQ09ORklHXSwJCVtBQ19ERUZVTihbQUNfTElCVE9PTF9DT05GSUddKV0pCiBtNF9pZm5kZWYoW19MVF9BQ19GSUxFX0xURExMX0NdLAlbQUNfREVGVU4oW19MVF9BQ19GSUxFX0xURExMX0NdKV0pCittNF9pZm5kZWYoW19MVF9SRVFVSVJFRF9EQVJXSU5fQ0hFQ0tTXSwJW0FDX0RFRlVOKFtfTFRfUkVRVUlSRURfREFSV0lOX0NIRUNLU10pXSkKK200X2lmbmRlZihbX0xUX0FDX1BST0dfQ1hYQ1BQXSwJCVtBQ19ERUZVTihbX0xUX0FDX1BST0dfQ1hYQ1BQXSldKQorbTRfaWZuZGVmKFtfTFRfUFJFUEFSRV9TRURfUVVPVEVfVkFSU10sCVtBQ19ERUZVTihbX0xUX1BSRVBBUkVfU0VEX1FVT1RFX1ZBUlNdKV0pCittNF9pZm5kZWYoW19MVF9QUk9HX0VDSE9fQkFDS1NMQVNIXSwJW0FDX0RFRlVOKFtfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSF0pXSkKK200X2lmbmRlZihbX0xUX1BST0dfRjc3XSwJCVtBQ19ERUZVTihbX0xUX1BST0dfRjc3XSldKQorbTRfaWZuZGVmKFtfTFRfUFJPR19GQ10sCQlbQUNfREVGVU4oW19MVF9QUk9HX0ZDXSldKQorbTRfaWZuZGVmKFtfTFRfUFJPR19DWFhdLAkJW0FDX0RFRlVOKFtfTFRfUFJPR19DWFhdKV0pCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL21hbi9NYWtlZmlsZS5hbSBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbWFuL01ha2VmaWxlLmFtCmluZGV4IDI1MTkyNzcuLmFmY2JmYjYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbWFuL01ha2VmaWxlLmFtCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbWFuL01ha2VmaWxlLmFtCkBAIC0yLDcgKzIsNyBAQAogCiBBVVRPTUFLRV9PUFRJT05TPWZvcmVpZ24KIAotRVhUUkFfRElTVCA9IGZmaS4zIGZmaV9jYWxsLjMgZmZpX3ByZXBfY2lmLjMKK0VYVFJBX0RJU1QgPSBmZmkuMyBmZmlfY2FsbC4zIGZmaV9wcmVwX2NpZi4zIGZmaV9wcmVwX2NpZl92YXIuMwogCi1tYW5fTUFOUyA9IGZmaS4zIGZmaV9jYWxsLjMgZmZpX3ByZXBfY2lmLjMKK21hbl9NQU5TID0gZmZpLjMgZmZpX2NhbGwuMyBmZmlfcHJlcF9jaWYuMyBmZmlfcHJlcF9jaWZfdmFyLjMKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9tYW4vTWFrZWZpbGUuaW4gYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL21hbi9NYWtlZmlsZS5pbgppbmRleCAzZTQwYmUyLi5jMDJlMWYyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL21hbi9NYWtlZmlsZS5pbgorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL21hbi9NYWtlZmlsZS5pbgpAQCAtMSw5ICsxLDggQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTEgZnJvbSBNYWtlZmlsZS5hbS4KKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTIuMiBmcm9tIE1ha2VmaWxlLmFtLgogIyBAY29uZmlndXJlX2lucHV0QAogCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKLSMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotIyBJbmMuCisjIENvcHlyaWdodCAoQykgMTk5NC0yMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCiAjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgogIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAogIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCkBAIC0xNSw2ICsxNCwyMyBAQAogCiBAU0VUX01BS0VACiBWUEFUSCA9IEBzcmNkaXJACithbV9fbWFrZV9kcnlydW4gPSBcCisgIHsgXAorICAgIGFtX19kcnk9bm87IFwKKyAgICBjYXNlICQkTUFLRUZMQUdTIGluIFwKKyAgICAgICpcXFtcIFwJXSopIFwKKyAgICAgICAgZWNobyAnYW0tLWVjaG86IDsgQGVjaG8gIkFNIiAgT0snIHwgJChNQUtFKSAtZiAtIDI+L2Rldi9udWxsIFwKKyAgICAgICAgICB8IGdyZXAgJ15BTSBPSyQkJyA+L2Rldi9udWxsIHx8IGFtX19kcnk9eWVzOzsgXAorICAgICAgKikgXAorICAgICAgICBmb3IgYW1fX2ZsZyBpbiAkJE1BS0VGTEFHUzsgZG8gXAorICAgICAgICAgIGNhc2UgJCRhbV9fZmxnIGluIFwKKyAgICAgICAgICAgICo9KnwtLSopIDs7IFwKKyAgICAgICAgICAgICpuKikgYW1fX2RyeT15ZXM7IGJyZWFrOzsgXAorICAgICAgICAgIGVzYWM7IFwKKyAgICAgICAgZG9uZTs7IFwKKyAgICBlc2FjOyBcCisgICAgdGVzdCAkJGFtX19kcnkgPSB5ZXM7IFwKKyAgfQogcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACiBwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKIHBrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKQEAgLTM3LDcgKzUzLDE5IEBACiBzdWJkaXIgPSBtYW4KIERJU1RfQ09NTU9OID0gJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbgogQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAotYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL200L2FzbWNmaS5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9hcHBlbmRfZmxhZy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9jY19tYXhvcHQubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYXhfY2ZsYWdzX3dhcm5fYWxsLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2NoZWNrX2NvbXBpbGVfZmxhZy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9jb21waWxlcl92ZW5kb3IubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYXhfY29uZmlndXJlX2FyZ3MubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYXhfZW5hYmxlX2J1aWxkZGlyLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2djY19hcmNoZmxhZy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9nY2NfeDg2X2NwdWlkLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2xpYnRvb2wubTQgJCh0b3Bfc3JjZGlyKS9tNC9sdG9wdGlvbnMubTQgXAorCSQodG9wX3NyY2RpcikvbTQvbHRzdWdhci5tNCAkKHRvcF9zcmNkaXIpL200L2x0dmVyc2lvbi5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9sdH5vYnNvbGV0ZS5tNCAkKHRvcF9zcmNkaXIpL2FjaW5jbHVkZS5tNCBcCiAJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKIGFtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCiAJJChBQ0xPQ0FMX000KQpAQCAtNDcsNiArNzUsMTEgQEAKIENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9CiBTT1VSQ0VTID0KIERJU1RfU09VUkNFUyA9CithbV9fY2FuX3J1bl9pbnN0YWxsaW5mbyA9IFwKKyAgY2FzZSAkJEFNX1VQREFURV9JTkZPX0RJUiBpbiBcCisgICAgbnxub3xOTykgZmFsc2U7OyBcCisgICAgKikgKGluc3RhbGwtaW5mbyAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMTs7IFwKKyAgZXNhYwogYW1fX3ZwYXRoX2Fkal9zZXR1cCA9IHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7CiBhbV9fdnBhdGhfYWRqID0gY2FzZSAkJHAgaW4gXAogICAgICQoc3JjZGlyKS8qKSBmPWBlY2hvICIkJHAiIHwgc2VkICJzfF4kJHNyY2RpcnN0cmlwL3x8ImA7OyBcCkBAIC02OCw2ICsxMDEsMTIgQEAKIGFtX19iYXNlX2xpc3QgPSBcCiAgIHNlZCAnJCQhTjskJCFOOyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjtzL1xuLyAvZycgfCBcCiAgIHNlZCAnJCQhTjskJCFOOyQkIU47JCQhTjtzL1xuLyAvZycKK2FtX191bmluc3RhbGxfZmlsZXNfZnJvbV9kaXIgPSB7IFwKKyAgdGVzdCAteiAiJCRmaWxlcyIgXAorICAgIHx8IHsgdGVzdCAhIC1kICIkJGRpciIgJiYgdGVzdCAhIC1mICIkJGRpciIgJiYgdGVzdCAhIC1yICIkJGRpciI7IH0gXAorICAgIHx8IHsgZWNobyAiICggY2QgJyQkZGlyJyAmJiBybSAtZiIgJCRmaWxlcyAiKSI7IFwKKyAgICAgICAgICQoYW1fX2NkKSAiJCRkaXIiICYmIHJtIC1mICQkZmlsZXM7IH07IFwKKyAgfQogbWFuM2RpciA9ICQobWFuZGlyKS9tYW4zCiBhbV9faW5zdGFsbGRpcnMgPSAiJChERVNURElSKSQobWFuM2RpcikiCiBOUk9GRiA9IG5yb2ZmCkBAIC03Niw2ICsxMTUsNyBAQAogQUNMT0NBTCA9IEBBQ0xPQ0FMQAogQUxMT0NBID0gQEFMTE9DQUAKIEFNVEFSID0gQEFNVEFSQAorQU1fTFRMREZMQUdTID0gQEFNX0xUTERGTEFHU0AKIEFNX1JVTlRFU1RGTEFHUyA9IEBBTV9SVU5URVNURkxBR1NACiBBUiA9IEBBUkAKIEFVVE9DT05GID0gQEFVVE9DT05GQApAQCAtOTMsNiArMTMzLDcgQEAKIENZR1BBVEhfVyA9IEBDWUdQQVRIX1dACiBERUZTID0gQERFRlNACiBERVBESVIgPSBAREVQRElSQAorRExMVE9PTCA9IEBETExUT09MQAogRFNZTVVUSUwgPSBARFNZTVVUSUxACiBEVU1QQklOID0gQERVTVBCSU5ACiBFQ0hPX0MgPSBARUNIT19DQApAQCAtMTAwLDYgKzE0MSw3IEBACiBFQ0hPX1QgPSBARUNIT19UQAogRUdSRVAgPSBARUdSRVBACiBFWEVFWFQgPSBARVhFRVhUQAorRkZJX0VYRUNfVFJBTVBPTElORV9UQUJMRSA9IEBGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFQAogRkdSRVAgPSBARkdSRVBACiBHUkVQID0gQEdSRVBACiBIQVZFX0xPTkdfRE9VQkxFID0gQEhBVkVfTE9OR19ET1VCTEVACkBAIC0xMTgsNiArMTYwLDcgQEAKIExUTElCT0JKUyA9IEBMVExJQk9CSlNACiBNQUlOVCA9IEBNQUlOVEAKIE1BS0VJTkZPID0gQE1BS0VJTkZPQAorTUFOSUZFU1RfVE9PTCA9IEBNQU5JRkVTVF9UT09MQAogTUtESVJfUCA9IEBNS0RJUl9QQAogTk0gPSBATk1ACiBOTUVESVQgPSBATk1FRElUQApAQCAtMTMwLDggKzE3MywxMCBAQAogUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKIFBBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAogUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVVJMID0gQFBBQ0tBR0VfVVJMQAogUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKIFBBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUFJURElBRyA9IEBQUlRESUFHQAogUkFOTElCID0gQFJBTkxJQkAKIFNFRCA9IEBTRURACiBTRVRfTUFLRSA9IEBTRVRfTUFLRUAKQEAgLTE0NCw2ICsxODksNyBAQAogYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAogYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAogYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9BUiA9IEBhY19jdF9BUkAKIGFjX2N0X0NDID0gQGFjX2N0X0NDQAogYWNfY3RfRFVNUEJJTiA9IEBhY19jdF9EVU1QQklOQAogYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACkBAIC0xNTEsNiArMTk3LDcgQEAKIGFtX19xdW90ZSA9IEBhbV9fcXVvdGVACiBhbV9fdGFyID0gQGFtX190YXJACiBhbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYXhfZW5hYmxlX2J1aWxkZGlyX3NlZCA9IEBheF9lbmFibGVfYnVpbGRkaXJfc2VkQAogYmluZGlyID0gQGJpbmRpckAKIGJ1aWxkID0gQGJ1aWxkQAogYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACkBAIC0xNzYsNyArMjIzLDYgQEAKIGxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKIGxvY2FsZWRpciA9IEBsb2NhbGVkaXJACiBsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1sdF9FQ0hPID0gQGx0X0VDSE9ACiBtYW5kaXIgPSBAbWFuZGlyQAogbWtkaXJfcCA9IEBta2Rpcl9wQAogb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQApAQCAtMTg3LDYgKzIzMyw3IEBACiBzYmluZGlyID0gQHNiaW5kaXJACiBzaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKIHNyY2RpciA9IEBzcmNkaXJACitzeXNfc3ltYm9sX3VuZGVyc2NvcmUgPSBAc3lzX3N5bWJvbF91bmRlcnNjb3JlQAogc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAogdGFyZ2V0ID0gQHRhcmdldEAKIHRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACkBAIC0xOTksOCArMjQ2LDggQEAKIHRvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACiB0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACiBBVVRPTUFLRV9PUFRJT05TID0gZm9yZWlnbgotRVhUUkFfRElTVCA9IGZmaS4zIGZmaV9jYWxsLjMgZmZpX3ByZXBfY2lmLjMKLW1hbl9NQU5TID0gZmZpLjMgZmZpX2NhbGwuMyBmZmlfcHJlcF9jaWYuMworRVhUUkFfRElTVCA9IGZmaS4zIGZmaV9jYWxsLjMgZmZpX3ByZXBfY2lmLjMgZmZpX3ByZXBfY2lmX3Zhci4zCittYW5fTUFOUyA9IGZmaS4zIGZmaV9jYWxsLjMgZmZpX3ByZXBfY2lmLjMgZmZpX3ByZXBfY2lmX3Zhci4zCiBhbGw6IGFsbC1hbQogCiAuU1VGRklYRVM6CkBAIC0yNDIsMTEgKzI4OSwxOCBAQAogCS1ybSAtcmYgLmxpYnMgX2xpYnMKIGluc3RhbGwtbWFuMzogJChtYW5fTUFOUykKIAlAJChOT1JNQUxfSU5TVEFMTCkKLQl0ZXN0IC16ICIkKG1hbjNkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChtYW4zZGlyKSIKLQlAbGlzdD0nJzsgdGVzdCAtbiAiJChtYW4zZGlyKSIgfHwgZXhpdCAwOyBcCi0JeyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkaSI7IGRvbmU7IFwKLQlsMj0nJChtYW5fTUFOUyknOyBmb3IgaSBpbiAkJGwyOyBkbyBlY2hvICIkJGkiOyBkb25lIHwgXAotCSAgc2VkIC1uICcvXC4zW2Etel0qJCQvcCc7IFwKKwlAbGlzdDE9Jyc7IFwKKwlsaXN0Mj0nJChtYW5fTUFOUyknOyBcCisJdGVzdCAtbiAiJChtYW4zZGlyKSIgXAorCSAgJiYgdGVzdCAtbiAiYGVjaG8gJCRsaXN0MSQkbGlzdDJgIiBcCisJICB8fCBleGl0IDA7IFwKKwllY2hvICIgJChNS0RJUl9QKSAnJChERVNURElSKSQobWFuM2RpciknIjsgXAorCSQoTUtESVJfUCkgIiQoREVTVERJUikkKG1hbjNkaXIpIiB8fCBleGl0IDE7IFwKKwl7IGZvciBpIGluICQkbGlzdDE7IGRvIGVjaG8gIiQkaSI7IGRvbmU7ICBcCisJaWYgdGVzdCAtbiAiJCRsaXN0MiI7IHRoZW4gXAorCSAgZm9yIGkgaW4gJCRsaXN0MjsgZG8gZWNobyAiJCRpIjsgZG9uZSBcCisJICAgIHwgc2VkIC1uICcvXC4zW2Etel0qJCQvcCc7IFwKKwlmaTsgXAogCX0gfCB3aGlsZSByZWFkIHA7IGRvIFwKIAkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAogCSAgZWNobyAiJCRkJCRwIjsgZWNobyAiJCRwIjsgXApAQCAtMjc1LDE1ICszMjksMTUgQEAKIAkgIHNlZCAtbiAnL1wuM1thLXpdKiQkL3AnOyBcCiAJfSB8IHNlZCAtZSAncywuKi8sLDtoO3MsLipcLiwsO3MsXlteM11bMC05YS16XSokJCwzLDt4JyBcCiAJICAgICAgLWUgJ3MsXC5bMC05YS16XSokJCwsOyQodHJhbnNmb3JtKTtHO3MsXG4sLiwnYDsgXAotCXRlc3QgLXogIiQkZmlsZXMiIHx8IHsgXAotCSAgZWNobyAiICggY2QgJyQoREVTVERJUikkKG1hbjNkaXIpJyAmJiBybSAtZiIgJCRmaWxlcyAiKSI7IFwKLQkgIGNkICIkKERFU1RESVIpJChtYW4zZGlyKSIgJiYgcm0gLWYgJCRmaWxlczsgfQorCWRpcj0nJChERVNURElSKSQobWFuM2RpciknOyAkKGFtX191bmluc3RhbGxfZmlsZXNfZnJvbV9kaXIpCiB0YWdzOiBUQUdTCiBUQUdTOgogCiBjdGFnczogQ1RBR1MKIENUQUdTOgogCitjc2NvcGUgY3Njb3BlbGlzdDoKKwogCiBkaXN0ZGlyOiAkKERJU1RGSUxFUykKIAlAbGlzdD0nJChNQU5TKSc7IGlmIHRlc3QgLW4gIiQkbGlzdCI7IHRoZW4gXApAQCAtMjkyLDEwICszNDYsMTAgQEAKIAkgICAgaWYgdGVzdCAtZiAiJCRkJCRwIjsgdGhlbiBlY2hvICIkJGQkJHAiOyBlbHNlIDo7IGZpOyBkb25lYDsgXAogCSAgaWYgdGVzdCAtbiAiJCRsaXN0IiAmJiBcCiAJICAgIGdyZXAgJ2FiIGhlbHAybWFuIGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIHRoaXMgcGFnZScgJCRsaXN0ID4vZGV2L251bGw7IHRoZW4gXAotCSAgICBlY2hvICJlcnJvcjogZm91bmQgbWFuIHBhZ2VzIGNvbnRhaW5pbmcgdGhlIFxgbWlzc2luZyBoZWxwMm1hbicgcmVwbGFjZW1lbnQgdGV4dDoiID4mMjsgXAorCSAgICBlY2hvICJlcnJvcjogZm91bmQgbWFuIHBhZ2VzIGNvbnRhaW5pbmcgdGhlICdtaXNzaW5nIGhlbHAybWFuJyByZXBsYWNlbWVudCB0ZXh0OiIgPiYyOyBcCiAJICAgIGdyZXAgLWwgJ2FiIGhlbHAybWFuIGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIHRoaXMgcGFnZScgJCRsaXN0IHwgc2VkICdzL14vICAgICAgICAgLycgPiYyOyBcCiAJICAgIGVjaG8gIiAgICAgICB0byBmaXggdGhlbSwgaW5zdGFsbCBoZWxwMm1hbiwgcmVtb3ZlIGFuZCByZWdlbmVyYXRlIHRoZSBtYW4gcGFnZXM7IiA+JjI7IFwKLQkgICAgZWNobyAiICAgICAgIHR5cGljYWxseSBcYG1ha2UgbWFpbnRhaW5lci1jbGVhbicgd2lsbCByZW1vdmUgdGhlbSIgPiYyOyBcCisJICAgIGVjaG8gIiAgICAgICB0eXBpY2FsbHkgJ21ha2UgbWFpbnRhaW5lci1jbGVhbicgd2lsbCByZW1vdmUgdGhlbSIgPiYyOyBcCiAJICAgIGV4aXQgMTsgXAogCSAgZWxzZSA6OyBmaTsgXAogCWVsc2UgOjsgZmkKQEAgLTM0NSwxMCArMzk5LDE1IEBACiAKIGluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCiBpbnN0YWxsLXN0cmlwOgotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKLQkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAotCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorCWlmIHRlc3QgLXogJyQoU1RSSVApJzsgdGhlbiBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgICAgICBpbnN0YWxsOyBcCisJZWxzZSBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgICAgIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciIGluc3RhbGw7IFwKKwlmaQogbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKIAogY2xlYW4tZ2VuZXJpYzoKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbWFuL2ZmaS4zIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9tYW4vZmZpLjMKaW5kZXggMThiNWQ1ZC4uMWYxZDMwMyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9tYW4vZmZpLjMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9tYW4vZmZpLjMKQEAgLTE2LDYgKzE2LDE1IEBACiAuRmEgImZmaV90eXBlICoqYXR5cGVzIgogLkZjCiAuRnQgdm9pZAorLkZvIGZmaV9wcmVwX2NpZl92YXIKKy5GYSAiZmZpX2NpZiAqY2lmIgorLkZhICJmZmlfYWJpIGFiaSIKKy5GYSAidW5zaWduZWQgaW50IG5maXhlZGFyZ3MiCisuRmEgInVuc2lnbmVkIGludCBudG90YWxhcmdzIgorLkZhICJmZmlfdHlwZSAqcnR5cGUiCisuRmEgImZmaV90eXBlICoqYXR5cGVzIgorLkZjCisuRnQgdm9pZAogLkZvIGZmaV9jYWxsCiAuRmEgImZmaV9jaWYgKmNpZiIKIC5GYSAidm9pZCAoKmZuKSh2b2lkKSIKQEAgLTI4LDQgKzM3LDUgQEAKIHRoZSBjYWxsZWQgZnVuY3Rpb24ncyBpbnRlcmZhY2UgYXQgY29tcGlsZSB0aW1lLgogLlNoIFNFRSBBTFNPCiAuWHIgZmZpX3ByZXBfY2lmIDMgLAorLlhyIGZmaV9wcmVwX2NpZl92YXIgMyAsCiAuWHIgZmZpX2NhbGwgMwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9tYW4vZmZpX3ByZXBfY2lmLjMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL21hbi9mZmlfcHJlcF9jaWYuMwppbmRleCA5NDM2YjMxLi5hYjJiZThhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL21hbi9mZmlfcHJlcF9jaWYuMworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL21hbi9mZmlfcHJlcF9jaWYuMwpAQCAtMzcsNyArMzcsOSBAQAogcG9pbnRzIHRvIGFuCiAuTm0gZmZpX3R5cGUKIHRoYXQgZGVzY3JpYmVzIHRoZSBkYXRhIHR5cGUsIHNpemUgYW5kIGFsaWdubWVudCBvZiB0aGUKLXJldHVybiB2YWx1ZS4KK3JldHVybiB2YWx1ZS4gTm90ZSB0aGF0IHRvIGNhbGwgYSB2YXJpYWRpYyBmdW5jdGlvbgorLk5tIGZmaV9wcmVwX2NpZl92YXIKK211c3QgYmUgdXNlZCBpbnN0ZWFkLgogLlNoIFJFVFVSTiBWQUxVRVMKIFVwb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLAogLk5tIGZmaV9wcmVwX2NpZgpAQCAtNTksOCArNjEsOCBAQAogLk5tIEZGSV9CQURfQUJJCiB3aWxsIGJlIHJldHVybmVkLiBBdmFpbGFibGUgQUJJcyBhcmUKIGRlZmluZWQgaW4KLS5ObSA8ZmZpdGFyZ2V0Lmg+Ci0uCisuTm0gPGZmaXRhcmdldC5oPiAuCiAuU2ggU0VFIEFMU08KIC5YciBmZmkgMyAsCi0uWHIgZmZpX2NhbGwgMyAKKy5YciBmZmlfY2FsbCAzICwKKy5YciBmZmlfcHJlcF9jaWZfdmFyIDMKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbWFuL2ZmaV9wcmVwX2NpZl92YXIuMyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbWFuL2ZmaV9wcmVwX2NpZl92YXIuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTE5ZDBiCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9tYW4vZmZpX3ByZXBfY2lmX3Zhci4zCkBAIC0wLDAgKzEsNzMgQEAKKy5EZCBKYW51YXJ5IDI1LCAyMDExCisuRHQgZmZpX3ByZXBfY2lmX3ZhciAzCisuU2ggTkFNRQorLk5tIGZmaV9wcmVwX2NpZl92YXIKKy5OZCBQcmVwYXJlIGEKKy5ObSBmZmlfY2lmCitzdHJ1Y3R1cmUgZm9yIHVzZSB3aXRoCisuTm0gZmZpX2NhbGwKK2ZvciB2YXJpYWRpYyBmdW5jdGlvbnMuCisuU2ggU1lOT1BTSVMKKy5JbiBmZmkuaAorLkZ0IGZmaV9zdGF0dXMKKy5GbyBmZmlfcHJlcF9jaWZfdmFyCisuRmEgImZmaV9jaWYgKmNpZiIKKy5GYSAiZmZpX2FiaSBhYmkiCisuRmEgInVuc2lnbmVkIGludCBuZml4ZWRhcmdzIgorLkZhICJ1bnNpZ25lZCBpbnQgbnRvdGFsYXJncyIKKy5GYSAiZmZpX3R5cGUgKnJ0eXBlIgorLkZhICJmZmlfdHlwZSAqKmF0eXBlcyIKKy5GYworLlNoIERFU0NSSVBUSU9OCitUaGUKKy5ObSBmZmlfcHJlcF9jaWZfdmFyCitmdW5jdGlvbiBwcmVwYXJlcyBhCisuTm0gZmZpX2NpZgorc3RydWN0dXJlIGZvciB1c2Ugd2l0aAorLk5tIGZmaV9jYWxsCitmb3IgdmFyaWFkaWMgZnVuY3Rpb25zLgorLkZhIGFiaQorc3BlY2lmaWVzIGEgc2V0IG9mIGNhbGxpbmcgY29udmVudGlvbnMgdG8gdXNlLgorLkZhIGF0eXBlcworaXMgYW4gYXJyYXkgb2YKKy5GYSBudG90YWxhcmdzCitwb2ludGVycyB0bworLk5tIGZmaV90eXBlCitzdHJ1Y3RzIHRoYXQgZGVzY3JpYmUgdGhlIGRhdGEgdHlwZSwgc2l6ZSBhbmQgYWxpZ25tZW50IG9mIGVhY2ggYXJndW1lbnQuCisuRmEgcnR5cGUKK3BvaW50cyB0byBhbgorLk5tIGZmaV90eXBlCit0aGF0IGRlc2NyaWJlcyB0aGUgZGF0YSB0eXBlLCBzaXplIGFuZCBhbGlnbm1lbnQgb2YgdGhlCityZXR1cm4gdmFsdWUuCisuRmEgbmZpeGVkYXJncworbXVzdCBjb250YWluIHRoZSBudW1iZXIgb2YgZml4ZWQgKG5vbi12YXJpYWRpYykgYXJndW1lbnRzLgorTm90ZSB0aGF0IHRvIGNhbGwgYSBub24tdmFyaWFkaWMgZnVuY3Rpb24KKy5ObSBmZmlfcHJlcF9jaWYKK211c3QgYmUgdXNlZC4KKy5TaCBSRVRVUk4gVkFMVUVTCitVcG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiwKKy5ObSBmZmlfcHJlcF9jaWZfdmFyCityZXR1cm5zCisuTm0gRkZJX09LIC4KK0l0IHdpbGwgcmV0dXJuCisuTm0gRkZJX0JBRF9UWVBFREVGCitpZgorLkZhIGNpZgoraXMKKy5ObSBOVUxMCitvcgorLkZhIGF0eXBlcworb3IKKy5GYSBydHlwZQoraXMgbWFsZm9ybWVkLiBJZgorLkZhIGFiaQorZG9lcyBub3QgcmVmZXIgdG8gYSB2YWxpZCBBQkksCisuTm0gRkZJX0JBRF9BQkkKK3dpbGwgYmUgcmV0dXJuZWQuIEF2YWlsYWJsZSBBQklzIGFyZQorZGVmaW5lZCBpbgorLk5tIDxmZml0YXJnZXQuaD4KKy4KKy5TaCBTRUUgQUxTTworLlhyIGZmaSAzICwKKy5YciBmZmlfY2FsbCAzICwKKy5YciBmZmlfcHJlcF9jaWYgMwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9tZGF0ZS1zaCBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbWRhdGUtc2gKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9taXNzaW5nIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9taXNzaW5nCmluZGV4IDg5NGU3ODYuLjI4MDU1ZDIgMTAwNzU1Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbWlzc2luZworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL21pc3NpbmcKQEAgLTEsMTAgKzEsMTAgQEAKICMhIC9iaW4vc2gKICMgQ29tbW9uIHN0dWIgZm9yIGEgZmV3IG1pc3NpbmcgR05VIHByb2dyYW1zIHdoaWxlIGluc3RhbGxpbmcuCiAKLXNjcmlwdHZlcnNpb249MjAwNS0wNi0wOC4yMQorc2NyaXB0dmVyc2lvbj0yMDA5LTA0LTI4LjIxOyAjIFVUQwogCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OSwgMjAwMCwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNQotIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTksIDIwMDAsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsCisjIDIwMDgsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAjIE9yaWdpbmFsbHkgYnkgRnJhbixjb2lzIFBpbmFyZCA8cGluYXJkQGlyby51bW9udHJlYWwuY2E+LCAxOTk2LgogCiAjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC0xOCw5ICsxOCw3IEBACiAjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAKICMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotIyAwMjExMC0xMzAxLCBVU0EuCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogCiAjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKICMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCkBAIC0zMyw2ICszMSw4IEBACiBmaQogCiBydW49Ogorc2VkX291dHB1dD0ncy8uKiAtLW91dHB1dFsgPV1cKFteIF0qXCkuKi9cMS9wJworc2VkX21pbnVzbz0ncy8uKiAtbyBcKFteIF0qXCkuKi9cMS9wJwogCiAjIEluIHRoZSBjYXNlcyB3aGVyZSB0aGlzIG1hdHRlcnMsIGBtaXNzaW5nJyBpcyBiZWluZyBydW4gaW4gdGhlCiAjIHNyY2RpciBhbHJlYWR5LgpAQCAtNDQsNyArNDQsNyBAQAogCiBtc2c9Im1pc3Npbmcgb24geW91ciBzeXN0ZW0iCiAKLWNhc2UgIiQxIiBpbgorY2FzZSAkMSBpbgogLS1ydW4pCiAgICMgVHJ5IHRvIHJ1biByZXF1ZXN0ZWQgcHJvZ3JhbSwgYW5kIGp1c3QgZXhpdCBpZiBpdCBzdWNjZWVkcy4KICAgcnVuPQpAQCAtNzcsNiArNzcsNyBAQAogICBhY2xvY2FsICAgICAgdG91Y2ggZmlsZSBcYGFjbG9jYWwubTQnCiAgIGF1dG9jb25mICAgICB0b3VjaCBmaWxlIFxgY29uZmlndXJlJwogICBhdXRvaGVhZGVyICAgdG91Y2ggZmlsZSBcYGNvbmZpZy5oLmluJworICBhdXRvbTR0ZSAgICAgdG91Y2ggdGhlIG91dHB1dCBmaWxlLCBvciBjcmVhdGUgYSBzdHViIG9uZQogICBhdXRvbWFrZSAgICAgdG91Y2ggYWxsIFxgTWFrZWZpbGUuaW4nIGZpbGVzCiAgIGJpc29uICAgICAgICBjcmVhdGUgXGB5LnRhYi5bY2hdJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLltjaF0KICAgZmxleCAgICAgICAgIGNyZWF0ZSBcYGxleC55eS5jJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLmMKQEAgLTg2LDYgKzg3LDkgQEAKICAgdGFyICAgICAgICAgIHRyeSB0YXIsIGdudXRhciwgZ3RhciwgdGhlbiB0YXIgd2l0aG91dCBub24tcG9ydGFibGUgZmxhZ3MKICAgeWFjYyAgICAgICAgIGNyZWF0ZSBcYHkudGFiLltjaF0nLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuW2NoXQogCitWZXJzaW9uIHN1ZmZpeGVzIHRvIFBST0dSQU0gYXMgd2VsbCBhcyB0aGUgcHJlZml4ZXMgXGBnbnUtJywgXGBnbnUnLCBhbmQKK1xgZycgYXJlIGlnbm9yZWQgd2hlbiBjaGVja2luZyB0aGUgbmFtZS4KKwogU2VuZCBidWcgcmVwb3J0cyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+LiIKICAgICBleGl0ICQ/CiAgICAgOzsKQEAgLTEwMywxNSArMTA3LDIyIEBACiAKIGVzYWMKIAorIyBub3JtYWxpemUgcHJvZ3JhbSBuYW1lIHRvIGNoZWNrIGZvci4KK3Byb2dyYW09YGVjaG8gIiQxIiB8IHNlZCAnCisgIHMvXmdudS0vLzsgdAorICBzL15nbnUvLzsgdAorICBzL15nLy87IHQnYAorCiAjIE5vdyBleGl0IGlmIHdlIGhhdmUgaXQsIGJ1dCBpdCBmYWlsZWQuICBBbHNvIGV4aXQgbm93IGlmIHdlCiAjIGRvbid0IGhhdmUgaXQgYW5kIC0tdmVyc2lvbiB3YXMgcGFzc2VkIChtb3N0IGxpa2VseSB0byBkZXRlY3QKLSMgdGhlIHByb2dyYW0pLgotY2FzZSAiJDEiIGluCi0gIGxleHx5YWNjKQorIyB0aGUgcHJvZ3JhbSkuICBUaGlzIGlzIGFib3V0IG5vbi1HTlUgcHJvZ3JhbXMsIHNvIHVzZSAkMSBub3QKKyMgJHByb2dyYW0uCitjYXNlICQxIGluCisgIGxleCp8eWFjYyopCiAgICAgIyBOb3QgR05VIHByb2dyYW1zLCB0aGV5IGRvbid0IGhhdmUgLS12ZXJzaW9uLgogICAgIDs7CiAKLSAgdGFyKQorICB0YXIqKQogICAgIGlmIHRlc3QgLW4gIiRydW4iOyB0aGVuCiAgICAgICAgZWNobyAxPiYyICJFUlJPUjogXGB0YXInIHJlcXVpcmVzIC0tcnVuIgogICAgICAgIGV4aXQgMQpAQCAtMTM1LDcgKzE0Niw3IEBACiAKICMgSWYgaXQgZG9lcyBub3QgZXhpc3QsIG9yIGZhaWxzIHRvIHJ1biAocG9zc2libHkgYW4gb3V0ZGF0ZWQgdmVyc2lvbiksCiAjIHRyeSB0byBlbXVsYXRlIGl0LgotY2FzZSAiJDEiIGluCitjYXNlICRwcm9ncmFtIGluCiAgIGFjbG9jYWwqKQogICAgIGVjaG8gMT4mMiAiXAogV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCkBAIC0xNDUsNyArMTU2LDcgQEAKICAgICB0b3VjaCBhY2xvY2FsLm00CiAgICAgOzsKIAotICBhdXRvY29uZikKKyAgYXV0b2NvbmYqKQogICAgIGVjaG8gMT4mMiAiXAogV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCiAgICAgICAgICB5b3UgbW9kaWZpZWQgXGAke2NvbmZpZ3VyZV9hY30nLiAgWW91IG1pZ2h0IHdhbnQgdG8gaW5zdGFsbCB0aGUKQEAgLTE1NCw3ICsxNjUsNyBAQAogICAgIHRvdWNoIGNvbmZpZ3VyZQogICAgIDs7CiAKLSAgYXV0b2hlYWRlcikKKyAgYXV0b2hlYWRlciopCiAgICAgZWNobyAxPiYyICJcCiBXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKICAgICAgICAgIHlvdSBtb2RpZmllZCBcYGFjY29uZmlnLmgnIG9yIFxgJHtjb25maWd1cmVfYWN9Jy4gIFlvdSBtaWdodCB3YW50CkBAIC0xNjQsNyArMTc1LDcgQEAKICAgICB0ZXN0IC16ICIkZmlsZXMiICYmIGZpbGVzPSJjb25maWcuaCIKICAgICB0b3VjaF9maWxlcz0KICAgICBmb3IgZiBpbiAkZmlsZXM7IGRvCi0gICAgICBjYXNlICIkZiIgaW4KKyAgICAgIGNhc2UgJGYgaW4KICAgICAgICo6KikgdG91Y2hfZmlsZXM9IiR0b3VjaF9maWxlcyAiYGVjaG8gIiRmIiB8CiAJCQkJICAgICAgIHNlZCAtZSAncy9eW146XSo6Ly8nIC1lICdzLzouKi8vJ2A7OwogICAgICAgKikgdG91Y2hfZmlsZXM9IiR0b3VjaF9maWxlcyAkZi5pbiI7OwpAQCAtMTg0LDcgKzE5NSw3IEBACiAJICAgd2hpbGUgcmVhZCBmOyBkbyB0b3VjaCAiJGYiOyBkb25lCiAgICAgOzsKIAotICBhdXRvbTR0ZSkKKyAgYXV0b200dGUqKQogICAgIGVjaG8gMT4mMiAiXAogV0FSTklORzogXGAkMScgaXMgbmVlZGVkLCBidXQgaXMgJG1zZy4KICAgICAgICAgIFlvdSBtaWdodCBoYXZlIG1vZGlmaWVkIHNvbWUgZmlsZXMgd2l0aG91dCBoYXZpbmcgdGhlCkBAIC0xOTIsOCArMjAzLDggQEAKICAgICAgICAgIFlvdSBjYW4gZ2V0IFxgJDEnIGFzIHBhcnQgb2YgXGBBdXRvY29uZicgZnJvbSBhbnkgR05VCiAgICAgICAgICBhcmNoaXZlIHNpdGUuIgogCi0gICAgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICdzLy4qLS1vdXRwdXRbID1dKlwoW14gXSpcKS4qL1wxL3AnYAotICAgIHRlc3QgLXogIiRmaWxlIiAmJiBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gJ3MvLiotb1sgXSpcKFteIF0qXCkuKi9cMS9wJ2AKKyAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfb3V0cHV0ImAKKyAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICIkc2VkX21pbnVzbyJgCiAgICAgaWYgdGVzdCAtZiAiJGZpbGUiOyB0aGVuCiAJdG91Y2ggJGZpbGUKICAgICBlbHNlCkBAIC0yMDcsODAgKzIxOCw3OCBAQAogICAgIGZpCiAgICAgOzsKIAotICBiaXNvbnx5YWNjKQorICBiaXNvbip8eWFjYyopCiAgICAgZWNobyAxPiYyICJcCiBXQVJOSU5HOiBcYCQxJyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKICAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLnknIGZpbGUuICBZb3UgbWF5IG5lZWQgdGhlIFxgQmlzb24nIHBhY2thZ2UKICAgICAgICAgIGluIG9yZGVyIGZvciB0aG9zZSBtb2RpZmljYXRpb25zIHRvIHRha2UgZWZmZWN0LiAgWW91IGNhbiBnZXQKICAgICAgICAgIFxgQmlzb24nIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgogICAgIHJtIC1mIHkudGFiLmMgeS50YWIuaAotICAgIGlmIFsgJCMgLW5lIDEgXTsgdGhlbgorICAgIGlmIHRlc3QgJCMgLW5lIDE7IHRoZW4KICAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCi0JY2FzZSAiJExBU1RBUkciIGluCisJY2FzZSAkTEFTVEFSRyBpbgogCSoueSkKIAkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL3kkL2MvJ2AKLQkgICAgaWYgWyAtZiAiJFNSQ0ZJTEUiIF07IHRoZW4KKwkgICAgaWYgdGVzdCAtZiAiJFNSQ0ZJTEUiOyB0aGVuCiAJICAgICAgICAgY3AgIiRTUkNGSUxFIiB5LnRhYi5jCiAJICAgIGZpCiAJICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy95JC9oLydgCi0JICAgIGlmIFsgLWYgIiRTUkNGSUxFIiBdOyB0aGVuCisJICAgIGlmIHRlc3QgLWYgIiRTUkNGSUxFIjsgdGhlbgogCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuaAogCSAgICBmaQogCSAgOzsKIAllc2FjCiAgICAgZmkKLSAgICBpZiBbICEgLWYgeS50YWIuaCBdOyB0aGVuCisgICAgaWYgdGVzdCAhIC1mIHkudGFiLmg7IHRoZW4KIAllY2hvID55LnRhYi5oCiAgICAgZmkKLSAgICBpZiBbICEgLWYgeS50YWIuYyBdOyB0aGVuCisgICAgaWYgdGVzdCAhIC1mIHkudGFiLmM7IHRoZW4KIAllY2hvICdtYWluKCkgeyByZXR1cm4gMDsgfScgPnkudGFiLmMKICAgICBmaQogICAgIDs7CiAKLSAgbGV4fGZsZXgpCisgIGxleCp8ZmxleCopCiAgICAgZWNobyAxPiYyICJcCiBXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKICAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLmwnIGZpbGUuICBZb3UgbWF5IG5lZWQgdGhlIFxgRmxleCcgcGFja2FnZQogICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAogICAgICAgICAgXGBGbGV4JyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKICAgICBybSAtZiBsZXgueXkuYwotICAgIGlmIFsgJCMgLW5lIDEgXTsgdGhlbgorICAgIGlmIHRlc3QgJCMgLW5lIDE7IHRoZW4KICAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCi0JY2FzZSAiJExBU1RBUkciIGluCisJY2FzZSAkTEFTVEFSRyBpbgogCSoubCkKIAkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL2wkL2MvJ2AKLQkgICAgaWYgWyAtZiAiJFNSQ0ZJTEUiIF07IHRoZW4KKwkgICAgaWYgdGVzdCAtZiAiJFNSQ0ZJTEUiOyB0aGVuCiAJICAgICAgICAgY3AgIiRTUkNGSUxFIiBsZXgueXkuYwogCSAgICBmaQogCSAgOzsKIAllc2FjCiAgICAgZmkKLSAgICBpZiBbICEgLWYgbGV4Lnl5LmMgXTsgdGhlbgorICAgIGlmIHRlc3QgISAtZiBsZXgueXkuYzsgdGhlbgogCWVjaG8gJ21haW4oKSB7IHJldHVybiAwOyB9JyA+bGV4Lnl5LmMKICAgICBmaQogICAgIDs7CiAKLSAgaGVscDJtYW4pCisgIGhlbHAybWFuKikKICAgICBlY2hvIDE+JjIgIlwKIFdBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgogCSB5b3UgbW9kaWZpZWQgYSBkZXBlbmRlbmN5IG9mIGEgbWFudWFsIHBhZ2UuICBZb3UgbWF5IG5lZWQgdGhlCiAJIFxgSGVscDJtYW4nIHBhY2thZ2UgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZQogCSBlZmZlY3QuICBZb3UgY2FuIGdldCBcYEhlbHAybWFuJyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKIAotICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi1vIFwoW14gXSpcKS4qL1wxL3AnYAotICAgIGlmIHRlc3QgLXogIiRmaWxlIjsgdGhlbgotCWZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi0tb3V0cHV0PVwoW14gXSpcKS4qL1wxL3AnYAotICAgIGZpCi0gICAgaWYgWyAtZiAiJGZpbGUiIF07IHRoZW4KKyAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfb3V0cHV0ImAKKyAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICIkc2VkX21pbnVzbyJgCisgICAgaWYgdGVzdCAtZiAiJGZpbGUiOyB0aGVuCiAJdG91Y2ggJGZpbGUKICAgICBlbHNlCiAJdGVzdCAteiAiJGZpbGUiIHx8IGV4ZWMgPiRmaWxlCiAJZWNobyAiLmFiIGhlbHAybWFuIGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIHRoaXMgcGFnZSIKLQlleGl0IDEKKwlleGl0ICQ/CiAgICAgZmkKICAgICA7OwogCi0gIG1ha2VpbmZvKQorICBtYWtlaW5mbyopCiAgICAgZWNobyAxPiYyICJcCiBXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKICAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLnRleGknIG9yIFxgLnRleGluZm8nIGZpbGUsIG9yIGFueSBvdGhlciBmaWxlCkBAIC0yODksMTEgKzI5OCwxNyBAQAogICAgICAgICAgRFUsIElSSVgpLiAgWW91IG1pZ2h0IHdhbnQgdG8gaW5zdGFsbCB0aGUgXGBUZXhpbmZvJyBwYWNrYWdlIG9yCiAgICAgICAgICB0aGUgXGBHTlUgbWFrZScgcGFja2FnZS4gIEdyYWIgZWl0aGVyIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgogICAgICMgVGhlIGZpbGUgdG8gdG91Y2ggaXMgdGhhdCBzcGVjaWZpZWQgd2l0aCAtbyAuLi4KLSAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gJ3MvLiotbyBcKFteIF0qXCkuKi9cMS9wJ2AKKyAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfb3V0cHV0ImAKKyAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICIkc2VkX21pbnVzbyJgCiAgICAgaWYgdGVzdCAteiAiJGZpbGUiOyB0aGVuCiAgICAgICAjIC4uLiBvciBpdCBpcyB0aGUgb25lIHNwZWNpZmllZCB3aXRoIEBzZXRmaWxlbmFtZSAuLi4KICAgICAgIGluZmlsZT1gZWNobyAiJCoiIHwgc2VkICdzLy4qIFwoW14gXSpcKSAqJC9cMS8nYAotICAgICAgZmlsZT1gc2VkIC1uICcvXkBzZXRmaWxlbmFtZS8geyBzLy4qIFwoW14gXSpcKSAqJC9cMS87IHA7IHE7IH0nICRpbmZpbGVgCisgICAgICBmaWxlPWBzZWQgLW4gJworCS9eQHNldGZpbGVuYW1lL3sKKwkgIHMvLiogXChbXiBdKlwpICokL1wxLworCSAgcAorCSAgcQorCX0nICRpbmZpbGVgCiAgICAgICAjIC4uLiBvciBpdCBpcyBkZXJpdmVkIGZyb20gdGhlIHNvdXJjZSBuYW1lIChkaXIvZi50ZXhpIGJlY29tZXMgZi5pbmZvKQogICAgICAgdGVzdCAteiAiJGZpbGUiICYmIGZpbGU9YGVjaG8gIiRpbmZpbGUiIHwgc2VkICdzLC4qLywsO3MsLlteLl0qJCwsJ2AuaW5mbwogICAgIGZpCkBAIC0zMDMsNyArMzE4LDcgQEAKICAgICB0b3VjaCAkZmlsZQogICAgIDs7CiAKLSAgdGFyKQorICB0YXIqKQogICAgIHNoaWZ0CiAKICAgICAjIFdlIGhhdmUgYWxyZWFkeSB0cmllZCB0YXIgaW4gdGhlIGdlbmVyaWMgcGFydC4KQEAgLTMxNywxMyArMzMyLDEzIEBACiAgICAgZmkKICAgICBmaXJzdGFyZz0iJDEiCiAgICAgaWYgc2hpZnQ7IHRoZW4KLQljYXNlICIkZmlyc3RhcmciIGluCisJY2FzZSAkZmlyc3RhcmcgaW4KIAkqbyopCiAJICAgIGZpcnN0YXJnPWBlY2hvICIkZmlyc3RhcmciIHwgc2VkIHMvby8vYAogCSAgICB0YXIgIiRmaXJzdGFyZyIgIiRAIiAmJiBleGl0IDAKIAkgICAgOzsKIAllc2FjCi0JY2FzZSAiJGZpcnN0YXJnIiBpbgorCWNhc2UgJGZpcnN0YXJnIGluCiAJKmgqKQogCSAgICBmaXJzdGFyZz1gZWNobyAiJGZpcnN0YXJnIiB8IHNlZCBzL2gvL2AKIAkgICAgdGFyICIkZmlyc3RhcmciICIkQCIgJiYgZXhpdCAwCkBAIC0zNTYsNSArMzcxLDYgQEAKICMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQogIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCiAjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgotIyB0aW1lLXN0YW1wLWVuZDogIiQiCisjIHRpbWUtc3RhbXAtdGltZS16b25lOiAiVVRDIgorIyB0aW1lLXN0YW1wLWVuZDogIjsgIyBVVEMiCiAjIEVuZDoKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbXN2Y2Muc2ggYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL21zdmNjLnNoCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggODMwMTgzOS4uZGNkYmVhYgotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL21zdmNjLnNoCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvbXN2Y2Muc2gKQEAgLTQyLDEzICs0MiwxMSBAQAogIyBmb3JtYXQgYW5kIHRyYW5zbGF0ZWQgaW50byBzb21ldGhpbmcgc2Vuc2libGUgZm9yIGNsIG9yIG1sLgogIwogCi0jIERpc2FibGUgc3BlY2lmaWMgd2FybmluZ3MsIGFuZCBlbmFibGUgd2FybmluZ3MtYXMtZXJyb3JzIHNvIHdlIGNhdGNoIGFueQotIyBtaXN0cmFuc2xhdGVkIGFyZ3MuCi1ub3dhcm49Ii13ZDQxMjcgLXdkNDgyMCAtd2Q0NzA2IC13ZDQxMDAgLXdkNDI1NSAtd2Q0NjY4IC13ZDQwNTMgLXdkNDMyNCIKLWFyZ3M9Ii1ub2xvZ28gLVczIC1XWCAkbm93YXJuIgorYXJncz0iLW5vbG9nbyAtVzMiCiBtZD0tTUQKIGNsPSJjbCIKIG1sPSJtbCIKK3NhZmVzZWg9Ii1zYWZlc2VoIgogb3V0cHV0PQogCiB3aGlsZSBbICQjIC1ndCAwIF0KQEAgLTY2LDE1ICs2NCwyOCBAQAogICAgIC1tNjQpCiAgICAgICBjbD0iY2wiICAgIyAiJE1TVkMveDg2X2FtZDY0L2NsIgogICAgICAgbWw9Im1sNjQiICMgIiRNU1ZDL3g4Nl9hbWQ2NC9tbDY0IgorICAgICAgc2FmZXNlaD0KKyAgICAgIHNoaWZ0IDEKKyAgICA7OworICAgIC1PMCkKKyAgICAgIGFyZ3M9IiRhcmdzIC1PZCIKICAgICAgIHNoaWZ0IDEKICAgICA7OwogICAgIC1PKikKLSAgICAgIGFyZ3M9IiRhcmdzICQxIgorICAgICAgIyBJZiB3ZSdyZSBvcHRpbWl6aW5nLCBtYWtlIHN1cmUgd2UgZXhwbGljaXRseSB0dXJuIG9uIHNvbWUgb3B0aW1pemF0aW9ucworICAgICAgIyB0aGF0IGFyZSBpbXBsaWNpdGx5IGRpc2FibGVkIGJ5IGRlYnVnIHN5bWJvbHMgKC1aaSkuCisgICAgICBhcmdzPSIkYXJncyAkMSAtT1BUOlJFRiAtT1BUOklDRiAtSU5DUkVNRU5UQUw6Tk8iCiAgICAgICBzaGlmdCAxCiAgICAgOzsKICAgICAtZykKLSAgICAgICMgQ2FuJ3Qgc3BlY2lmeSAtUlRDMSBvciAtWmkgaW4gb3B0LiAtR3kgaXMgb2suIFVzZSAtT1BUOlJFRj8KLSAgICAgIGFyZ3M9IiRhcmdzIC1EX0RFQlVHIC1SVEMxIC1aaSIKKyAgICAgICMgRW5hYmxlIGRlYnVnIHN5bWJvbCBnZW5lcmF0aW9uLgorICAgICAgYXJncz0iJGFyZ3MgLVppIC1ERUJVRyIKKyAgICAgIHNoaWZ0IDEKKyAgICA7OworICAgIC1ERkZJX0RFQlVHKQorICAgICAgIyBMaW5rIGFnYWluc3QgZGVidWcgQ1JUIGFuZCBlbmFibGUgcnVudGltZSBlcnJvciBjaGVja3MuCisgICAgICBhcmdzPSIkYXJncyAtUlRDMSIKKyAgICAgIGRlZmluZXM9IiRkZWZpbmVzICQxIgogICAgICAgbWQ9LU1EZAogICAgICAgc2hpZnQgMQogICAgIDs7CkBAIC0xMTEsNyArMTIyLDggQEAKICAgICAgIHNoaWZ0IDEKICAgICA7OwogICAgIC1XYWxsKQotICAgICAgYXJncz0iJGFyZ3MgLVdhbGwiCisgICAgICAjIC1XYWxsIG9uIE1TVkMgaXMgb3ZlcnplYWxvdXMsIGFuZCB3ZSBhbHJlYWR5IGJ1aWxkIHdpdGggLVczLiBOb3RoaW5nCisgICAgICAjIHRvIGRvIGhlcmUuCiAgICAgICBzaGlmdCAxCiAgICAgOzsKICAgICAtV2Vycm9yKQpAQCAtMTY2LDcgKzE3OCw3IEBACiAgICAgZWNobyAiJGNsIC1ub2xvZ28gLUVQICRpbmNsdWRlcyAkZGVmaW5lcyAkc3JjID4gJHBwc3JjIgogICAgICIkY2wiIC1ub2xvZ28gLUVQICRpbmNsdWRlcyAkZGVmaW5lcyAkc3JjID4gJHBwc3JjIHx8IGV4aXQgJD8KICAgICBvdXRwdXQ9IiQoZWNobyAkb3V0cHV0IHwgc2VkICdzJS9GW2RwYV1bXiBdKiUlZycpIgotICAgIGFyZ3M9Ii1ub2xvZ28gLXNhZmVzZWggJHNpbmdsZSAkb3V0cHV0ICRwcHNyYyIKKyAgICBhcmdzPSItbm9sb2dvICRzYWZlc2VoICRzaW5nbGUgJG91dHB1dCAkcHBzcmMiCiAKICAgICBlY2hvICIkbWwgJGFyZ3MiCiAgICAgZXZhbCAiXCIkbWxcIiAkYXJncyIKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2FhcmNoNjQvZmZpLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9hYXJjaDY0L2ZmaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MDU2NjUKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9hYXJjaDY0L2ZmaS5jCkBAIC0wLDAgKzEsMTA3NiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwLCAyMDExLCAyMDEyIEFSTSBMdGQuCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCitgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKK3dpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKK2Rpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCit0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCitpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKK0VYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKK0NMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCitUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPGZmaS5oPgorI2luY2x1ZGUgPGZmaV9jb21tb24uaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKiBTdGFjayBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgaW4gYnl0ZXMgKi8KKyNkZWZpbmUgQUFSQ0g2NF9TVEFDS19BTElHTiAxNgorCisjZGVmaW5lIE5fWF9BUkdfUkVHIDgKKyNkZWZpbmUgTl9WX0FSR19SRUcgOAorCisjZGVmaW5lIEFBUkNINjRfRkZJX1dJVEhfViAoMSA8PCBBQVJDSDY0X0ZGSV9XSVRIX1ZfQklUKQorCit1bmlvbiBfZAoreworICBVSU5UNjQgZDsKKyAgVUlOVDMyIHNbMl07Cit9OworCitzdHJ1Y3QgY2FsbF9jb250ZXh0Cit7CisgIFVJTlQ2NCB4IFtBQVJDSDY0X05fWFJFR107CisgIHN0cnVjdAorICB7CisgICAgdW5pb24gX2QgZFsyXTsKKyAgfSB2IFtBQVJDSDY0X05fVlJFR107Cit9OworCitzdGF0aWMgdm9pZCAqCitnZXRfeF9hZGRyIChzdHJ1Y3QgY2FsbF9jb250ZXh0ICpjb250ZXh0LCB1bnNpZ25lZCBuKQoreworICByZXR1cm4gJmNvbnRleHQtPnhbbl07Cit9CisKK3N0YXRpYyB2b2lkICoKK2dldF9zX2FkZHIgKHN0cnVjdCBjYWxsX2NvbnRleHQgKmNvbnRleHQsIHVuc2lnbmVkIG4pCit7CisjaWYgZGVmaW5lZCBfX0FBUkNINjRFQl9fCisgIHJldHVybiAmY29udGV4dC0+dltuXS5kWzFdLnNbMV07CisjZWxzZQorICByZXR1cm4gJmNvbnRleHQtPnZbbl0uZFswXS5zWzBdOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkICoKK2dldF9kX2FkZHIgKHN0cnVjdCBjYWxsX2NvbnRleHQgKmNvbnRleHQsIHVuc2lnbmVkIG4pCit7CisjaWYgZGVmaW5lZCBfX0FBUkNINjRFQl9fCisgIHJldHVybiAmY29udGV4dC0+dltuXS5kWzFdOworI2Vsc2UKKyAgcmV0dXJuICZjb250ZXh0LT52W25dLmRbMF07CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgKgorZ2V0X3ZfYWRkciAoc3RydWN0IGNhbGxfY29udGV4dCAqY29udGV4dCwgdW5zaWduZWQgbikKK3sKKyAgcmV0dXJuICZjb250ZXh0LT52W25dOworfQorCisvKiBSZXR1cm4gdGhlIG1lbW9yeSBsb2NhdGlvbiBhdCB3aGljaCBhIGJhc2ljIHR5cGUgd291bGQgcmVzaWRlCisgICB3ZXJlIGl0IHRvIGhhdmUgYmVlbiBzdG9yZWQgaW4gcmVnaXN0ZXIgbi4gICovCisKK3N0YXRpYyB2b2lkICoKK2dldF9iYXNpY190eXBlX2FkZHIgKHVuc2lnbmVkIHNob3J0IHR5cGUsIHN0cnVjdCBjYWxsX2NvbnRleHQgKmNvbnRleHQsCisJCSAgICAgdW5zaWduZWQgbikKK3sKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIEZGSV9UWVBFX0ZMT0FUOgorICAgICAgcmV0dXJuIGdldF9zX2FkZHIgKGNvbnRleHQsIG4pOworICAgIGNhc2UgRkZJX1RZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuIGdldF9kX2FkZHIgKGNvbnRleHQsIG4pOworICAgIGNhc2UgRkZJX1RZUEVfTE9OR0RPVUJMRToKKyAgICAgIHJldHVybiBnZXRfdl9hZGRyIChjb250ZXh0LCBuKTsKKyAgICBjYXNlIEZGSV9UWVBFX1VJTlQ4OgorICAgIGNhc2UgRkZJX1RZUEVfU0lOVDg6CisgICAgY2FzZSBGRklfVFlQRV9VSU5UMTY6CisgICAgY2FzZSBGRklfVFlQRV9TSU5UMTY6CisgICAgY2FzZSBGRklfVFlQRV9VSU5UMzI6CisgICAgY2FzZSBGRklfVFlQRV9TSU5UMzI6CisgICAgY2FzZSBGRklfVFlQRV9JTlQ6CisgICAgY2FzZSBGRklfVFlQRV9QT0lOVEVSOgorICAgIGNhc2UgRkZJX1RZUEVfVUlOVDY0OgorICAgIGNhc2UgRkZJX1RZUEVfU0lOVDY0OgorICAgICAgcmV0dXJuIGdldF94X2FkZHIgKGNvbnRleHQsIG4pOworICAgIGRlZmF1bHQ6CisgICAgICBGRklfQVNTRVJUICgwKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKworLyogUmV0dXJuIHRoZSBhbGlnbm1lbnQgd2lkdGggZm9yIGVhY2ggb2YgdGhlIGJhc2ljIHR5cGVzLiAgKi8KKworc3RhdGljIHNpemVfdAorZ2V0X2Jhc2ljX3R5cGVfYWxpZ25tZW50ICh1bnNpZ25lZCBzaG9ydCB0eXBlKQoreworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgRkZJX1RZUEVfRkxPQVQ6CisgICAgY2FzZSBGRklfVFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gc2l6ZW9mIChVSU5UNjQpOworICAgIGNhc2UgRkZJX1RZUEVfTE9OR0RPVUJMRToKKyAgICAgIHJldHVybiBzaXplb2YgKGxvbmcgZG91YmxlKTsKKyAgICBjYXNlIEZGSV9UWVBFX1VJTlQ4OgorICAgIGNhc2UgRkZJX1RZUEVfU0lOVDg6CisgICAgY2FzZSBGRklfVFlQRV9VSU5UMTY6CisgICAgY2FzZSBGRklfVFlQRV9TSU5UMTY6CisgICAgY2FzZSBGRklfVFlQRV9VSU5UMzI6CisgICAgY2FzZSBGRklfVFlQRV9JTlQ6CisgICAgY2FzZSBGRklfVFlQRV9TSU5UMzI6CisgICAgY2FzZSBGRklfVFlQRV9QT0lOVEVSOgorICAgIGNhc2UgRkZJX1RZUEVfVUlOVDY0OgorICAgIGNhc2UgRkZJX1RZUEVfU0lOVDY0OgorICAgICAgcmV0dXJuIHNpemVvZiAoVUlOVDY0KTsKKworICAgIGRlZmF1bHQ6CisgICAgICBGRklfQVNTRVJUICgwKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLyogUmV0dXJuIHRoZSBzaXplIGluIGJ5dGVzIGZvciBlYWNoIG9mIHRoZSBiYXNpYyB0eXBlcy4gICovCisKK3N0YXRpYyBzaXplX3QKK2dldF9iYXNpY190eXBlX3NpemUgKHVuc2lnbmVkIHNob3J0IHR5cGUpCit7CisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSBGRklfVFlQRV9GTE9BVDoKKyAgICAgIHJldHVybiBzaXplb2YgKFVJTlQzMik7CisgICAgY2FzZSBGRklfVFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gc2l6ZW9mIChVSU5UNjQpOworICAgIGNhc2UgRkZJX1RZUEVfTE9OR0RPVUJMRToKKyAgICAgIHJldHVybiBzaXplb2YgKGxvbmcgZG91YmxlKTsKKyAgICBjYXNlIEZGSV9UWVBFX1VJTlQ4OgorICAgICAgcmV0dXJuIHNpemVvZiAoVUlOVDgpOworICAgIGNhc2UgRkZJX1RZUEVfU0lOVDg6CisgICAgICByZXR1cm4gc2l6ZW9mIChTSU5UOCk7CisgICAgY2FzZSBGRklfVFlQRV9VSU5UMTY6CisgICAgICByZXR1cm4gc2l6ZW9mIChVSU5UMTYpOworICAgIGNhc2UgRkZJX1RZUEVfU0lOVDE2OgorICAgICAgcmV0dXJuIHNpemVvZiAoU0lOVDE2KTsKKyAgICBjYXNlIEZGSV9UWVBFX1VJTlQzMjoKKyAgICAgIHJldHVybiBzaXplb2YgKFVJTlQzMik7CisgICAgY2FzZSBGRklfVFlQRV9JTlQ6CisgICAgY2FzZSBGRklfVFlQRV9TSU5UMzI6CisgICAgICByZXR1cm4gc2l6ZW9mIChTSU5UMzIpOworICAgIGNhc2UgRkZJX1RZUEVfUE9JTlRFUjoKKyAgICBjYXNlIEZGSV9UWVBFX1VJTlQ2NDoKKyAgICAgIHJldHVybiBzaXplb2YgKFVJTlQ2NCk7CisgICAgY2FzZSBGRklfVFlQRV9TSU5UNjQ6CisgICAgICByZXR1cm4gc2l6ZW9mIChTSU5UNjQpOworCisgICAgZGVmYXVsdDoKKyAgICAgIEZGSV9BU1NFUlQgKDApOworICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitleHRlcm4gdm9pZAorZmZpX2NhbGxfU1lTViAodW5zaWduZWQgKCopKHN0cnVjdCBjYWxsX2NvbnRleHQgKmNvbnRleHQsIHVuc2lnbmVkIGNoYXIgKiwKKwkJCSAgICBleHRlbmRlZF9jaWYgKiksCisgICAgICAgICAgICAgICBzdHJ1Y3QgY2FsbF9jb250ZXh0ICpjb250ZXh0LAorICAgICAgICAgICAgICAgZXh0ZW5kZWRfY2lmICosCisgICAgICAgICAgICAgICB1bnNpZ25lZCwKKyAgICAgICAgICAgICAgIHZvaWQgKCpmbikodm9pZCkpOworCitleHRlcm4gdm9pZAorZmZpX2Nsb3N1cmVfU1lTViAoZmZpX2Nsb3N1cmUgKik7CisKKy8qIFRlc3QgZm9yIGFuIEZGSSBmbG9hdGluZyBwb2ludCByZXByZXNlbnRhdGlvbi4gICovCisKK3N0YXRpYyB1bnNpZ25lZAoraXNfZmxvYXRpbmdfdHlwZSAodW5zaWduZWQgc2hvcnQgdHlwZSkKK3sKKyAgcmV0dXJuICh0eXBlID09IEZGSV9UWVBFX0ZMT0FUIHx8IHR5cGUgPT0gRkZJX1RZUEVfRE9VQkxFCisJICB8fCB0eXBlID09IEZGSV9UWVBFX0xPTkdET1VCTEUpOworfQorCisvKiBUZXN0IGZvciBhIGhvbW9nZW5lb3VzIHN0cnVjdHVyZS4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAorZ2V0X2hvbW9nZW5lb3VzX3R5cGUgKGZmaV90eXBlICp0eSkKK3sKKyAgaWYgKHR5LT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCAmJiB0eS0+ZWxlbWVudHMpCisgICAgeworICAgICAgdW5zaWduZWQgaTsKKyAgICAgIHVuc2lnbmVkIHNob3J0IGNhbmRpZGF0ZV90eXBlCisJPSBnZXRfaG9tb2dlbmVvdXNfdHlwZSAodHktPmVsZW1lbnRzWzBdKTsKKyAgICAgIGZvciAoaSA9MTsgdHktPmVsZW1lbnRzW2ldOyBpKyspCisJeworCSAgdW5zaWduZWQgc2hvcnQgaXRlcmF0aW9uX3R5cGUgPSAwOworCSAgLyogSWYgd2UgaGF2ZSBhIG5lc3RlZCBzdHJ1Y3QsIHdlIG11c3QgZmluZCBpdHMgaG9tb2dlbmVvdXMgdHlwZS4KKwkgICAgIElmIHRoYXQgZml0cyB3aXRoIG91ciBjYW5kaWRhdGUgdHlwZSwgd2UgYXJlIHN0aWxsCisJICAgICBob21vZ2VuZW91cy4gICovCisJICBpZiAodHktPmVsZW1lbnRzW2ldLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVAorCSAgICAgICYmIHR5LT5lbGVtZW50c1tpXS0+ZWxlbWVudHMpCisJICAgIHsKKwkgICAgICBpdGVyYXRpb25fdHlwZSA9IGdldF9ob21vZ2VuZW91c190eXBlICh0eS0+ZWxlbWVudHNbaV0pOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpdGVyYXRpb25fdHlwZSA9IHR5LT5lbGVtZW50c1tpXS0+dHlwZTsKKwkgICAgfQorCisJICAvKiBJZiB3ZSBhcmUgbm90IGhvbW9nZW5lb3VzLCByZXR1cm4gRkZJX1RZUEVfU1RSVUNULiAgKi8KKwkgIGlmIChjYW5kaWRhdGVfdHlwZSAhPSBpdGVyYXRpb25fdHlwZSkKKwkgICAgcmV0dXJuIEZGSV9UWVBFX1NUUlVDVDsKKwl9CisgICAgICByZXR1cm4gY2FuZGlkYXRlX3R5cGU7CisgICAgfQorCisgIC8qIEJhc2UgY2FzZSwgd2UgaGF2ZSBubyBtb3JlIGxldmVscyBvZiBuZXN0aW5nLCBzbyB3ZQorICAgICBhcmUgYSBiYXNpYyB0eXBlLCBhbmQgc28sIHRyaXZpYWxseSBob21vZ2VuZW91cyBpbiB0aGF0IHR5cGUuICAqLworICByZXR1cm4gdHktPnR5cGU7Cit9CisKKy8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGhpbiBhIFNUUlVDVC4KKworICAgTm90ZSwgd2UgbXVzdCBoYW5kbGUgbmVzdGVkIHN0cnVjdHMuCisKKyAgIElmIHR5IGlzIG5vdCBhIFNUUlVDVCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIDAuICAqLworCitzdGF0aWMgdW5zaWduZWQKK2VsZW1lbnRfY291bnQgKGZmaV90eXBlICp0eSkKK3sKKyAgaWYgKHR5LT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCAmJiB0eS0+ZWxlbWVudHMpCisgICAgeworICAgICAgdW5zaWduZWQgbjsKKyAgICAgIHVuc2lnbmVkIGVsZW1zID0gMDsKKyAgICAgIGZvciAobiA9IDA7IHR5LT5lbGVtZW50c1tuXTsgbisrKQorCXsKKwkgIGlmICh0eS0+ZWxlbWVudHNbbl0tPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUCisJICAgICAgJiYgdHktPmVsZW1lbnRzW25dLT5lbGVtZW50cykKKwkgICAgZWxlbXMgKz0gZWxlbWVudF9jb3VudCAodHktPmVsZW1lbnRzW25dKTsKKwkgIGVsc2UKKwkgICAgZWxlbXMrKzsKKwl9CisgICAgICByZXR1cm4gZWxlbXM7CisgICAgfQorICByZXR1cm4gMDsKK30KKworLyogVGVzdCBmb3IgYSBob21vZ2VuZW91cyBmbG9hdGluZyBwb2ludCBhZ2dyZWdhdGUuCisKKyAgIEEgaG9tb2dlbmVvdXMgZmxvYXRpbmcgcG9pbnQgYWdncmVnYXRlIGlzIGEgaG9tb2dlbmVvdXMgYWdncmVnYXRlIG9mCisgICBhIGhhbGYtIHNpbmdsZS0gb3IgZG91YmxlLSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgdHlwZSB3aXRoIG9uZQorICAgdG8gZm91ciBlbGVtZW50cy4gIE5vdGUgdGhhdCB0aGlzIGluY2x1ZGVzIG5lc3RlZCBzdHJ1Y3RzIG9mIHRoZQorICAgYmFzaWMgdHlwZS4gICovCisKK3N0YXRpYyBpbnQKK2lzX2hmYSAoZmZpX3R5cGUgKnR5KQoreworICBpZiAodHktPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUCisgICAgICAmJiB0eS0+ZWxlbWVudHNbMF0KKyAgICAgICYmIGlzX2Zsb2F0aW5nX3R5cGUgKGdldF9ob21vZ2VuZW91c190eXBlICh0eSkpKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIG4gPSBlbGVtZW50X2NvdW50ICh0eSk7CisgICAgICByZXR1cm4gbiA+PSAxICYmIG4gPD0gNDsKKyAgICB9CisgIHJldHVybiAwOworfQorCisvKiBUZXN0IGlmIGFuIGZmaV90eXBlIGlzIGEgY2FuZGlkYXRlIGZvciBwYXNzaW5nIGluIGEgcmVnaXN0ZXIuCisKKyAgIFRoaXMgdGVzdCBkb2VzIG5vdCBjaGVjayB0aGF0IHN1ZmZpY2llbnQgcmVnaXN0ZXJzIG9mIHRoZQorICAgYXBwcm9wcmlhdGUgY2xhc3MgYXJlIGFjdHVhbGx5IGF2YWlsYWJsZSwgbWVyZWx5IHRoYXQgSUZGCisgICBzdWZmaWNpZW50IHJlZ2lzdGVycyBhcmUgYXZhaWxhYmxlIHRoZW4gdGhlIGFyZ3VtZW50IHdpbGwgYmUgcGFzc2VkCisgICBpbiByZWdpc3RlcihzKS4KKworICAgTm90ZSB0aGF0IGFuIGZmaV90eXBlIHRoYXQgaXMgZGVlbWVkIHRvIGJlIGEgcmVnaXN0ZXIgY2FuZGlkYXRlCisgICB3aWxsIGFsd2F5cyBiZSByZXR1cm5lZCBpbiByZWdpc3RlcnMuCisKKyAgIFJldHVybnMgMSBpZiBhIHJlZ2lzdGVyIGNhbmRpZGF0ZSBlbHNlIDAuICAqLworCitzdGF0aWMgaW50Citpc19yZWdpc3Rlcl9jYW5kaWRhdGUgKGZmaV90eXBlICp0eSkKK3sKKyAgc3dpdGNoICh0eS0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBGRklfVFlQRV9WT0lEOgorICAgIGNhc2UgRkZJX1RZUEVfRkxPQVQ6CisgICAgY2FzZSBGRklfVFlQRV9ET1VCTEU6CisgICAgY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFOgorICAgIGNhc2UgRkZJX1RZUEVfVUlOVDg6CisgICAgY2FzZSBGRklfVFlQRV9VSU5UMTY6CisgICAgY2FzZSBGRklfVFlQRV9VSU5UMzI6CisgICAgY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisgICAgY2FzZSBGRklfVFlQRV9QT0lOVEVSOgorICAgIGNhc2UgRkZJX1RZUEVfU0lOVDg6CisgICAgY2FzZSBGRklfVFlQRV9TSU5UMTY6CisgICAgY2FzZSBGRklfVFlQRV9TSU5UMzI6CisgICAgY2FzZSBGRklfVFlQRV9JTlQ6CisgICAgY2FzZSBGRklfVFlQRV9TSU5UNjQ6CisgICAgICByZXR1cm4gMTsKKworICAgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOgorICAgICAgaWYgKGlzX2hmYSAodHkpKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHR5LT5zaXplID4gMTYpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBUb28gbGFyZ2UuIFdpbGwgYmUgcmVwbGFjZWQgd2l0aCBhIHBvaW50ZXIgdG8gbWVtb3J5LiBUaGUKKyAgICAgICAgICAgICBwb2ludGVyIE1BWSBiZSBwYXNzZWQgaW4gYSByZWdpc3RlciwgYnV0IHRoZSB2YWx1ZSB3aWxsCisgICAgICAgICAgICAgbm90LiBUaGlzIHRlc3Qgc3BlY2lmaWNhbGx5IGZhaWxzIHNpbmNlIHRoZSBhcmd1bWVudCB3aWxsCisgICAgICAgICAgICAgbmV2ZXIgYmUgcGFzc2VkIGJ5IHZhbHVlIGluIHJlZ2lzdGVycy4gKi8KKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogTWlnaHQgYmUgcGFzc2VkIGluIHJlZ2lzdGVycyBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZgorICAgICAgICAgICAgIHJlZ2lzdGVycyByZXF1aXJlZC4gKi8KKyAgICAgICAgICByZXR1cm4gKHR5LT5zaXplICsgNykgLyA4IDwgTl9YX0FSR19SRUc7CisgICAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIEZGSV9BU1NFUlQgKDApOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBUZXN0IGlmIGFuIGZmaV90eXBlIGFyZ3VtZW50IG9yIHJlc3VsdCBpcyBhIGNhbmRpZGF0ZSBmb3IgYSB2ZWN0b3IKKyAgIHJlZ2lzdGVyLiAgKi8KKworc3RhdGljIGludAoraXNfdl9yZWdpc3Rlcl9jYW5kaWRhdGUgKGZmaV90eXBlICp0eSkKK3sKKyAgcmV0dXJuIGlzX2Zsb2F0aW5nX3R5cGUgKHR5LT50eXBlKQorCSAgIHx8ICh0eS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QgJiYgaXNfaGZhICh0eSkpOworfQorCisvKiBSZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvY2VkdXJlIGNhbGwgYXJndW1lbnQgbWFyc2hhbGxpbmcKKyAgIHN0YXRlLgorCisgICBUaGUgdGVyc2Ugc3RhdGUgdmFyaWFibGUgbmFtZXMgbWF0Y2ggdGhlIG5hbWVzIHVzZWQgaW4gdGhlIEFBUkNINjQKKyAgIFBDUy4gKi8KKworc3RydWN0IGFyZ19zdGF0ZQoreworICB1bnNpZ25lZCBuZ3JuOyAgICAgICAgICAgICAgICAvKiBOZXh0IGdlbmVyYWwtcHVycG9zZSByZWdpc3RlciBudW1iZXIuICovCisgIHVuc2lnbmVkIG5zcm47ICAgICAgICAgICAgICAgIC8qIE5leHQgdmVjdG9yIHJlZ2lzdGVyIG51bWJlci4gKi8KKyAgdW5zaWduZWQgbnNhYTsgICAgICAgICAgICAgICAgLyogTmV4dCBzdGFjayBvZmZzZXQuICovCit9OworCisvKiBJbml0aWFsaXplIGEgcHJvY2VkdXJlIGNhbGwgYXJndW1lbnQgbWFyc2hhbGxpbmcgc3RhdGUuICAqLworc3RhdGljIHZvaWQKK2FyZ19pbml0IChzdHJ1Y3QgYXJnX3N0YXRlICpzdGF0ZSwgdW5zaWduZWQgY2FsbF9mcmFtZV9zaXplKQoreworICBzdGF0ZS0+bmdybiA9IDA7CisgIHN0YXRlLT5uc3JuID0gMDsKKyAgc3RhdGUtPm5zYWEgPSAwOworfQorCisvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBhdmFpbGFibGUgY29uc2VjdXRpdmUgY29yZSBhcmd1bWVudAorICAgcmVnaXN0ZXJzLiAgKi8KKworc3RhdGljIHVuc2lnbmVkCithdmFpbGFibGVfeCAoc3RydWN0IGFyZ19zdGF0ZSAqc3RhdGUpCit7CisgIHJldHVybiBOX1hfQVJHX1JFRyAtIHN0YXRlLT5uZ3JuOworfQorCisvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBhdmFpbGFibGUgY29uc2VjdXRpdmUgdmVjdG9yIGFyZ3VtZW50CisgICByZWdpc3RlcnMuICAqLworCitzdGF0aWMgdW5zaWduZWQKK2F2YWlsYWJsZV92IChzdHJ1Y3QgYXJnX3N0YXRlICpzdGF0ZSkKK3sKKyAgcmV0dXJuIE5fVl9BUkdfUkVHIC0gc3RhdGUtPm5zcm47Cit9CisKK3N0YXRpYyB2b2lkICoKK2FsbG9jYXRlX3RvX3ggKHN0cnVjdCBjYWxsX2NvbnRleHQgKmNvbnRleHQsIHN0cnVjdCBhcmdfc3RhdGUgKnN0YXRlKQoreworICBGRklfQVNTRVJUIChzdGF0ZS0+bmdybiA8IE5fWF9BUkdfUkVHKQorICByZXR1cm4gZ2V0X3hfYWRkciAoY29udGV4dCwgKHN0YXRlLT5uZ3JuKSsrKTsKK30KKworc3RhdGljIHZvaWQgKgorYWxsb2NhdGVfdG9fcyAoc3RydWN0IGNhbGxfY29udGV4dCAqY29udGV4dCwgc3RydWN0IGFyZ19zdGF0ZSAqc3RhdGUpCit7CisgIEZGSV9BU1NFUlQgKHN0YXRlLT5uc3JuIDwgTl9WX0FSR19SRUcpCisgIHJldHVybiBnZXRfc19hZGRyIChjb250ZXh0LCAoc3RhdGUtPm5zcm4pKyspOworfQorCitzdGF0aWMgdm9pZCAqCithbGxvY2F0ZV90b19kIChzdHJ1Y3QgY2FsbF9jb250ZXh0ICpjb250ZXh0LCBzdHJ1Y3QgYXJnX3N0YXRlICpzdGF0ZSkKK3sKKyAgRkZJX0FTU0VSVCAoc3RhdGUtPm5zcm4gPCBOX1ZfQVJHX1JFRykKKyAgcmV0dXJuIGdldF9kX2FkZHIgKGNvbnRleHQsIChzdGF0ZS0+bnNybikrKyk7Cit9CisKK3N0YXRpYyB2b2lkICoKK2FsbG9jYXRlX3RvX3YgKHN0cnVjdCBjYWxsX2NvbnRleHQgKmNvbnRleHQsIHN0cnVjdCBhcmdfc3RhdGUgKnN0YXRlKQoreworICBGRklfQVNTRVJUIChzdGF0ZS0+bnNybiA8IE5fVl9BUkdfUkVHKQorICByZXR1cm4gZ2V0X3ZfYWRkciAoY29udGV4dCwgKHN0YXRlLT5uc3JuKSsrKTsKK30KKworLyogQWxsb2NhdGUgYW4gYWxpZ25lZCBzbG90IG9uIHRoZSBzdGFjayBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBpdC4gICovCitzdGF0aWMgdm9pZCAqCithbGxvY2F0ZV90b19zdGFjayAoc3RydWN0IGFyZ19zdGF0ZSAqc3RhdGUsIHZvaWQgKnN0YWNrLCB1bnNpZ25lZCBhbGlnbm1lbnQsCisJCSAgIHVuc2lnbmVkIHNpemUpCit7CisgIHZvaWQgKmFsbG9jYXRpb247CisKKyAgLyogUm91bmQgdXAgdGhlIE5TQUEgdG8gdGhlIGxhcmdlciBvZiA4IG9yIHRoZSBuYXR1cmFsCisgICAgIGFsaWdubWVudCBvZiB0aGUgYXJndW1lbnQncyB0eXBlLiAgKi8KKyAgc3RhdGUtPm5zYWEgPSBBTElHTiAoc3RhdGUtPm5zYWEsIGFsaWdubWVudCk7CisgIHN0YXRlLT5uc2FhID0gQUxJR04gKHN0YXRlLT5uc2FhLCBhbGlnbm1lbnQpOworICBzdGF0ZS0+bnNhYSA9IEFMSUdOIChzdGF0ZS0+bnNhYSwgOCk7CisKKyAgYWxsb2NhdGlvbiA9IHN0YWNrICsgc3RhdGUtPm5zYWE7CisKKyAgc3RhdGUtPm5zYWEgKz0gc2l6ZTsKKyAgcmV0dXJuIGFsbG9jYXRpb247Cit9CisKK3N0YXRpYyB2b2lkCitjb3B5X2Jhc2ljX3R5cGUgKHZvaWQgKmRlc3QsIHZvaWQgKnNvdXJjZSwgdW5zaWduZWQgc2hvcnQgdHlwZSkKK3sKKyAgLyogVGhpcyBpcyBuZWNjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IGJhc2ljIHR5cGVzIGFyZSBjb3BpZWQKKyAgICAgc2lnbiBleHRlbmRlZCB0byA2NC1iaXRzIGFzIGxpYmZmaSBleHBlY3RzLiAgKi8KKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIEZGSV9UWVBFX0ZMT0FUOgorICAgICAgKihmbG9hdCAqKSBkZXN0ID0gKihmbG9hdCAqKSBzb3VyY2U7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZGSV9UWVBFX0RPVUJMRToKKyAgICAgICooZG91YmxlICopIGRlc3QgPSAqKGRvdWJsZSAqKSBzb3VyY2U7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZGSV9UWVBFX0xPTkdET1VCTEU6CisgICAgICAqKGxvbmcgZG91YmxlICopIGRlc3QgPSAqKGxvbmcgZG91YmxlICopIHNvdXJjZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRkZJX1RZUEVfVUlOVDg6CisgICAgICAqKGZmaV9hcmcgKikgZGVzdCA9ICooVUlOVDggKikgc291cmNlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGRklfVFlQRV9TSU5UODoKKyAgICAgICooZmZpX3NhcmcgKikgZGVzdCA9ICooU0lOVDggKikgc291cmNlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGRklfVFlQRV9VSU5UMTY6CisgICAgICAqKGZmaV9hcmcgKikgZGVzdCA9ICooVUlOVDE2ICopIHNvdXJjZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRkZJX1RZUEVfU0lOVDE2OgorICAgICAgKihmZmlfc2FyZyAqKSBkZXN0ID0gKihTSU5UMTYgKikgc291cmNlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGRklfVFlQRV9VSU5UMzI6CisgICAgICAqKGZmaV9hcmcgKikgZGVzdCA9ICooVUlOVDMyICopIHNvdXJjZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRkZJX1RZUEVfSU5UOgorICAgIGNhc2UgRkZJX1RZUEVfU0lOVDMyOgorICAgICAgKihmZmlfc2FyZyAqKSBkZXN0ID0gKihTSU5UMzIgKikgc291cmNlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGRklfVFlQRV9QT0lOVEVSOgorICAgIGNhc2UgRkZJX1RZUEVfVUlOVDY0OgorICAgICAgKihmZmlfYXJnICopIGRlc3QgPSAqKFVJTlQ2NCAqKSBzb3VyY2U7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZGSV9UWVBFX1NJTlQ2NDoKKyAgICAgICooZmZpX3NhcmcgKikgZGVzdCA9ICooU0lOVDY0ICopIHNvdXJjZTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIEZGSV9BU1NFUlQgKDApOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2NvcHlfaGZhX3RvX3JlZ19vcl9zdGFjayAodm9pZCAqbWVtb3J5LAorCQkJICBmZmlfdHlwZSAqdHksCisJCQkgIHN0cnVjdCBjYWxsX2NvbnRleHQgKmNvbnRleHQsCisJCQkgIHVuc2lnbmVkIGNoYXIgKnN0YWNrLAorCQkJICBzdHJ1Y3QgYXJnX3N0YXRlICpzdGF0ZSkKK3sKKyAgdW5zaWduZWQgZWxlbXMgPSBlbGVtZW50X2NvdW50ICh0eSk7CisgIGlmIChhdmFpbGFibGVfdiAoc3RhdGUpIDwgZWxlbXMpCisgICAgeworICAgICAgLyogVGhlcmUgYXJlIGluc3VmZmljaWVudCBWIHJlZ2lzdGVycy4gRnVydGhlciBWIHJlZ2lzdGVyIGFsbG9jYXRpb25zCisJIGFyZSBwcmV2ZW50ZWQsIHRoZSBOU0FBIGlzIGFkanVzdGVkIChieSBhbGxvY2F0ZV90b19zdGFjayAoKSkKKwkgYW5kIHRoZSBhcmd1bWVudCBpcyBjb3BpZWQgdG8gbWVtb3J5IGF0IHRoZSBhZGp1c3RlZCBOU0FBLiAgKi8KKyAgICAgIHN0YXRlLT5uc3JuID0gTl9WX0FSR19SRUc7CisgICAgICBtZW1jcHkgKGFsbG9jYXRlX3RvX3N0YWNrIChzdGF0ZSwgc3RhY2ssIHR5LT5hbGlnbm1lbnQsIHR5LT5zaXplKSwKKwkgICAgICBtZW1vcnksCisJICAgICAgdHktPnNpemUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgdW5zaWduZWQgc2hvcnQgdHlwZSA9IGdldF9ob21vZ2VuZW91c190eXBlICh0eSk7CisgICAgICB1bnNpZ25lZCBlbGVtcyA9IGVsZW1lbnRfY291bnQgKHR5KTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBlbGVtczsgaSsrKQorCXsKKwkgIHZvaWQgKnJlZyA9IGFsbG9jYXRlX3RvX3YgKGNvbnRleHQsIHN0YXRlKTsKKwkgIGNvcHlfYmFzaWNfdHlwZSAocmVnLCBtZW1vcnksIHR5cGUpOworCSAgbWVtb3J5ICs9IGdldF9iYXNpY190eXBlX3NpemUgKHR5cGUpOworCX0KKyAgICB9Cit9CisKKy8qIEVpdGhlciBhbGxvY2F0ZSBhbiBhcHByb3ByaWF0ZSByZWdpc3RlciBmb3IgdGhlIGFyZ3VtZW50IHR5cGUsIG9yIGlmCisgICBub25lIGFyZSBhdmFpbGFibGUsIGFsbG9jYXRlIGEgc3RhY2sgc2xvdCBhbmQgcmV0dXJuIGEgcG9pbnRlcgorICAgdG8gdGhlIGFsbG9jYXRlZCBzcGFjZS4gICovCisKK3N0YXRpYyB2b2lkICoKK2FsbG9jYXRlX3RvX3JlZ2lzdGVyX29yX3N0YWNrIChzdHJ1Y3QgY2FsbF9jb250ZXh0ICpjb250ZXh0LAorCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKnN0YWNrLAorCQkJICAgICAgIHN0cnVjdCBhcmdfc3RhdGUgKnN0YXRlLAorCQkJICAgICAgIHVuc2lnbmVkIHNob3J0IHR5cGUpCit7CisgIHNpemVfdCBhbGlnbm1lbnQgPSBnZXRfYmFzaWNfdHlwZV9hbGlnbm1lbnQgKHR5cGUpOworICBzaXplX3Qgc2l6ZSA9IGFsaWdubWVudDsKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIEZGSV9UWVBFX0ZMT0FUOgorICAgICAgLyogVGhpcyBpcyB0aGUgb25seSBjYXNlIGZvciB3aGljaCB0aGUgYWxsb2NhdGVkIHN0YWNrIHNpemUKKwkgc2hvdWxkIG5vdCBtYXRjaCB0aGUgYWxpZ25tZW50IG9mIHRoZSB0eXBlLiAgKi8KKyAgICAgIHNpemUgPSBzaXplb2YgKFVJTlQzMik7CisgICAgICAvKiBGYWxsIHRocm91Z2guICAqLworICAgIGNhc2UgRkZJX1RZUEVfRE9VQkxFOgorICAgICAgaWYgKHN0YXRlLT5uc3JuIDwgTl9WX0FSR19SRUcpCisJcmV0dXJuIGFsbG9jYXRlX3RvX2QgKGNvbnRleHQsIHN0YXRlKTsKKyAgICAgIHN0YXRlLT5uc3JuID0gTl9WX0FSR19SRUc7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZGSV9UWVBFX0xPTkdET1VCTEU6CisgICAgICBpZiAoc3RhdGUtPm5zcm4gPCBOX1ZfQVJHX1JFRykKKwlyZXR1cm4gYWxsb2NhdGVfdG9fdiAoY29udGV4dCwgc3RhdGUpOworICAgICAgc3RhdGUtPm5zcm4gPSBOX1ZfQVJHX1JFRzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRkZJX1RZUEVfVUlOVDg6CisgICAgY2FzZSBGRklfVFlQRV9TSU5UODoKKyAgICBjYXNlIEZGSV9UWVBFX1VJTlQxNjoKKyAgICBjYXNlIEZGSV9UWVBFX1NJTlQxNjoKKyAgICBjYXNlIEZGSV9UWVBFX1VJTlQzMjoKKyAgICBjYXNlIEZGSV9UWVBFX1NJTlQzMjoKKyAgICBjYXNlIEZGSV9UWVBFX0lOVDoKKyAgICBjYXNlIEZGSV9UWVBFX1BPSU5URVI6CisgICAgY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisgICAgY2FzZSBGRklfVFlQRV9TSU5UNjQ6CisgICAgICBpZiAoc3RhdGUtPm5ncm4gPCBOX1hfQVJHX1JFRykKKwlyZXR1cm4gYWxsb2NhdGVfdG9feCAoY29udGV4dCwgc3RhdGUpOworICAgICAgc3RhdGUtPm5ncm4gPSBOX1hfQVJHX1JFRzsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBGRklfQVNTRVJUICgwKTsKKyAgICB9CisKKyAgICByZXR1cm4gYWxsb2NhdGVfdG9fc3RhY2sgKHN0YXRlLCBzdGFjaywgYWxpZ25tZW50LCBzaXplKTsKK30KKworLyogQ29weSBhIHZhbHVlIHRvIGFuIGFwcHJvcHJpYXRlIHJlZ2lzdGVyLCBvciBpZiBub25lIGFyZQorICAgYXZhaWxhYmxlLCB0byB0aGUgc3RhY2suICAqLworCitzdGF0aWMgdm9pZAorY29weV90b19yZWdpc3Rlcl9vcl9zdGFjayAoc3RydWN0IGNhbGxfY29udGV4dCAqY29udGV4dCwKKwkJCSAgIHVuc2lnbmVkIGNoYXIgKnN0YWNrLAorCQkJICAgc3RydWN0IGFyZ19zdGF0ZSAqc3RhdGUsCisJCQkgICB2b2lkICp2YWx1ZSwKKwkJCSAgIHVuc2lnbmVkIHNob3J0IHR5cGUpCit7CisgIGNvcHlfYmFzaWNfdHlwZSAoCisJICBhbGxvY2F0ZV90b19yZWdpc3Rlcl9vcl9zdGFjayAoY29udGV4dCwgc3RhY2ssIHN0YXRlLCB0eXBlKSwKKwkgIHZhbHVlLAorCSAgdHlwZSk7Cit9CisKKy8qIE1hcnNoYWxsIHRoZSBhcmd1bWVudHMgZnJvbSBGRkkgcmVwcmVzZW50YXRpb24gdG8gcHJvY2VkdXJlIGNhbGwKKyAgIGNvbnRleHQgYW5kIHN0YWNrLiAgKi8KKworc3RhdGljIHVuc2lnbmVkCithYXJjaDY0X3ByZXBfYXJncyAoc3RydWN0IGNhbGxfY29udGV4dCAqY29udGV4dCwgdW5zaWduZWQgY2hhciAqc3RhY2ssCisJCSAgIGV4dGVuZGVkX2NpZiAqZWNpZikKK3sKKyAgaW50IGk7CisgIHN0cnVjdCBhcmdfc3RhdGUgc3RhdGU7CisKKyAgYXJnX2luaXQgKCZzdGF0ZSwgQUxJR04oZWNpZi0+Y2lmLT5ieXRlcywgMTYpKTsKKworICBmb3IgKGkgPSAwOyBpIDwgZWNpZi0+Y2lmLT5uYXJnczsgaSsrKQorICAgIHsKKyAgICAgIGZmaV90eXBlICp0eSA9IGVjaWYtPmNpZi0+YXJnX3R5cGVzW2ldOworICAgICAgc3dpdGNoICh0eS0+dHlwZSkKKwl7CisJY2FzZSBGRklfVFlQRV9WT0lEOgorCSAgRkZJX0FTU0VSVCAoMCk7CisJICBicmVhazsKKworCS8qIElmIHRoZSBhcmd1bWVudCBpcyBhIGJhc2ljIHR5cGUgdGhlIGFyZ3VtZW50IGlzIGFsbG9jYXRlZCB0byBhbgorCSAgIGFwcHJvcHJpYXRlIHJlZ2lzdGVyLCBvciBpZiBub25lIGFyZSBhdmFpbGFibGUsIHRvIHRoZSBzdGFjay4gICovCisJY2FzZSBGRklfVFlQRV9GTE9BVDoKKwljYXNlIEZGSV9UWVBFX0RPVUJMRToKKwljYXNlIEZGSV9UWVBFX0xPTkdET1VCTEU6CisJY2FzZSBGRklfVFlQRV9VSU5UODoKKwljYXNlIEZGSV9UWVBFX1NJTlQ4OgorCWNhc2UgRkZJX1RZUEVfVUlOVDE2OgorCWNhc2UgRkZJX1RZUEVfU0lOVDE2OgorCWNhc2UgRkZJX1RZUEVfVUlOVDMyOgorCWNhc2UgRkZJX1RZUEVfSU5UOgorCWNhc2UgRkZJX1RZUEVfU0lOVDMyOgorCWNhc2UgRkZJX1RZUEVfUE9JTlRFUjoKKwljYXNlIEZGSV9UWVBFX1VJTlQ2NDoKKwljYXNlIEZGSV9UWVBFX1NJTlQ2NDoKKwkgIGNvcHlfdG9fcmVnaXN0ZXJfb3Jfc3RhY2sgKGNvbnRleHQsIHN0YWNrLCAmc3RhdGUsCisJCQkJICAgICBlY2lmLT5hdmFsdWVbaV0sIHR5LT50eXBlKTsKKwkgIGJyZWFrOworCisJY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisJICBpZiAoaXNfaGZhICh0eSkpCisJICAgIHsKKwkgICAgICBjb3B5X2hmYV90b19yZWdfb3Jfc3RhY2sgKGVjaWYtPmF2YWx1ZVtpXSwgdHksIGNvbnRleHQsCisJCQkJCXN0YWNrLCAmc3RhdGUpOworCSAgICB9CisJICBlbHNlIGlmICh0eS0+c2l6ZSA+IDE2KQorCSAgICB7CisJICAgICAgLyogSWYgdGhlIGFyZ3VtZW50IGlzIGEgY29tcG9zaXRlIHR5cGUgdGhhdCBpcyBsYXJnZXIgdGhhbiAxNgorCQkgYnl0ZXMsIHRoZW4gdGhlIGFyZ3VtZW50IGhhcyBiZWVuIGNvcGllZCB0byBtZW1vcnksIGFuZAorCQkgdGhlIGFyZ3VtZW50IGlzIHJlcGxhY2VkIGJ5IGEgcG9pbnRlciB0byB0aGUgY29weS4gICovCisKKwkgICAgICBjb3B5X3RvX3JlZ2lzdGVyX29yX3N0YWNrIChjb250ZXh0LCBzdGFjaywgJnN0YXRlLAorCQkJCQkgJihlY2lmLT5hdmFsdWVbaV0pLCBGRklfVFlQRV9QT0lOVEVSKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoYXZhaWxhYmxlX3ggKCZzdGF0ZSkgPj0gKHR5LT5zaXplICsgNykgLyA4KQorCSAgICB7CisJICAgICAgLyogSWYgdGhlIGFyZ3VtZW50IGlzIGEgY29tcG9zaXRlIHR5cGUgYW5kIHRoZSBzaXplIGluCisJCSBkb3VibGUtd29yZHMgaXMgbm90IG1vcmUgdGhhbiB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZQorCQkgWCByZWdpc3RlcnMsIHRoZW4gdGhlIGFyZ3VtZW50IGlzIGNvcGllZCBpbnRvIGNvbnNlY3V0aXZlCisJCSBYIHJlZ2lzdGVycy4gICovCisJICAgICAgaW50IGo7CisJICAgICAgZm9yIChqID0gMDsgaiA8ICh0eS0+c2l6ZSArIDcpIC8gODsgaisrKQorCQl7CisJCSAgbWVtY3B5IChhbGxvY2F0ZV90b194IChjb250ZXh0LCAmc3RhdGUpLAorCQkJICAmKCgoVUlOVDY0ICopIGVjaWYtPmF2YWx1ZVtpXSlbal0pLAorCQkJICBzaXplb2YgKFVJTlQ2NCkpOworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIE90aGVyd2lzZSwgdGhlcmUgYXJlIGluc3VmZmljaWVudCBYIHJlZ2lzdGVycy4gRnVydGhlciBYCisJCSByZWdpc3RlciBhbGxvY2F0aW9ucyBhcmUgcHJldmVudGVkLCB0aGUgTlNBQSBpcyBhZGp1c3RlZAorCQkgKGJ5IGFsbG9jYXRlX3RvX3N0YWNrICgpKSBhbmQgdGhlIGFyZ3VtZW50IGlzIGNvcGllZCB0bworCQkgbWVtb3J5IGF0IHRoZSBhZGp1c3RlZCBOU0FBLiAgKi8KKwkgICAgICBzdGF0ZS5uZ3JuID0gTl9YX0FSR19SRUc7CisKKwkgICAgICBtZW1jcHkgKGFsbG9jYXRlX3RvX3N0YWNrICgmc3RhdGUsIHN0YWNrLCB0eS0+YWxpZ25tZW50LAorCQkJCQkgdHktPnNpemUpLCBlY2lmLT5hdmFsdWUgKyBpLCB0eS0+c2l6ZSk7CisJICAgIH0KKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIEZGSV9BU1NFUlQgKDApOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICByZXR1cm4gZWNpZi0+Y2lmLT5hYXJjaDY0X2ZsYWdzOworfQorCitmZmlfc3RhdHVzCitmZmlfcHJlcF9jaWZfbWFjaGRlcCAoZmZpX2NpZiAqY2lmKQoreworICAvKiBSb3VuZCB0aGUgc3RhY2sgdXAgdG8gYSBtdWx0aXBsZSBvZiB0aGUgc3RhY2sgYWxpZ25tZW50IHJlcXVpcmVtZW50LiAqLworICBjaWYtPmJ5dGVzID0KKyAgICAoY2lmLT5ieXRlcyArIChBQVJDSDY0X1NUQUNLX0FMSUdOIC0gMSkpICYgfiAoQUFSQ0g2NF9TVEFDS19BTElHTiAtIDEpOworCisgIC8qIEluaXRpYWxpemUgb3VyIGZsYWdzLiBXZSBhcmUgaW50ZXJlc3RlZCBpZiB0aGlzIENJRiB3aWxsIHRvdWNoIGEKKyAgICAgdmVjdG9yIHJlZ2lzdGVyLCBpZiBzbyB3ZSB3aWxsIGVuYWJsZSBjb250ZXh0IHNhdmUgYW5kIGxvYWQgdG8KKyAgICAgdGhvc2UgcmVnaXN0ZXJzLCBvdGhlcndpc2Ugbm90LiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIGZyaWVuZGx5CisgICAgIHRvIGxhenkgZmxvYXQgY29udGV4dCBzd2l0Y2hpbmcgaW4gdGhlIGtlcm5lbC4gICovCisgIGNpZi0+YWFyY2g2NF9mbGFncyA9IDA7CisKKyAgaWYgKGlzX3ZfcmVnaXN0ZXJfY2FuZGlkYXRlIChjaWYtPnJ0eXBlKSkKKyAgICB7CisgICAgICBjaWYtPmFhcmNoNjRfZmxhZ3MgfD0gQUFSQ0g2NF9GRklfV0lUSF9WOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IGNpZi0+bmFyZ3M7IGkrKykKKyAgICAgICAgaWYgKGlzX3ZfcmVnaXN0ZXJfY2FuZGlkYXRlIChjaWYtPmFyZ190eXBlc1tpXSkpCisgICAgICAgICAgeworICAgICAgICAgICAgY2lmLT5hYXJjaDY0X2ZsYWdzIHw9IEFBUkNINjRfRkZJX1dJVEhfVjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIEZGSV9PSzsKK30KKworLyogQ2FsbCBhIGZ1bmN0aW9uIHdpdGggdGhlIHByb3ZpZGVkIGFyZ3VtZW50cyBhbmQgY2FwdHVyZSB0aGUgcmV0dXJuCisgICB2YWx1ZS4gICovCit2b2lkCitmZmlfY2FsbCAoZmZpX2NpZiAqY2lmLCB2b2lkICgqZm4pKHZvaWQpLCB2b2lkICpydmFsdWUsIHZvaWQgKiphdmFsdWUpCit7CisgIGV4dGVuZGVkX2NpZiBlY2lmOworCisgIGVjaWYuY2lmID0gY2lmOworICBlY2lmLmF2YWx1ZSA9IGF2YWx1ZTsKKyAgZWNpZi5ydmFsdWUgPSBydmFsdWU7CisKKyAgc3dpdGNoIChjaWYtPmFiaSkKKyAgICB7CisgICAgY2FzZSBGRklfU1lTVjoKKyAgICAgIHsKKyAgICAgICAgc3RydWN0IGNhbGxfY29udGV4dCBjb250ZXh0OworCXVuc2lnbmVkIHN0YWNrX2J5dGVzOworCisJLyogRmlndXJlIG91dCB0aGUgdG90YWwgYW1vdW50IG9mIHN0YWNrIHNwYWNlIHdlIG5lZWQsIHRoZQorCSAgIGFib3ZlIGNhbGwgZnJhbWUgc3BhY2UgbmVlZHMgdG8gYmUgMTYgYnl0ZXMgYWxpZ25lZCB0bworCSAgIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBvZiB0aGUgZmlyc3Qgb2JqZWN0IGluc2VydGVkIGluCisJICAgdGhhdCBzcGFjZSBoZW5jZSB0aGUgQUxJR04gYXBwbGllZCB0byBjaWYtPmJ5dGVzLiovCisJc3RhY2tfYnl0ZXMgPSBBTElHTihjaWYtPmJ5dGVzLCAxNik7CisKKwltZW1zZXQgKCZjb250ZXh0LCAwLCBzaXplb2YgKGNvbnRleHQpKTsKKyAgICAgICAgaWYgKGlzX3JlZ2lzdGVyX2NhbmRpZGF0ZSAoY2lmLT5ydHlwZSkpCisgICAgICAgICAgeworICAgICAgICAgICAgZmZpX2NhbGxfU1lTViAoYWFyY2g2NF9wcmVwX2FyZ3MsICZjb250ZXh0LCAmZWNpZiwgc3RhY2tfYnl0ZXMsIGZuKTsKKyAgICAgICAgICAgIHN3aXRjaCAoY2lmLT5ydHlwZS0+dHlwZSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICBjYXNlIEZGSV9UWVBFX1ZPSUQ6CisgICAgICAgICAgICAgIGNhc2UgRkZJX1RZUEVfRkxPQVQ6CisgICAgICAgICAgICAgIGNhc2UgRkZJX1RZUEVfRE9VQkxFOgorICAgICAgICAgICAgICBjYXNlIEZGSV9UWVBFX0xPTkdET1VCTEU6CisgICAgICAgICAgICAgIGNhc2UgRkZJX1RZUEVfVUlOVDg6CisgICAgICAgICAgICAgIGNhc2UgRkZJX1RZUEVfU0lOVDg6CisgICAgICAgICAgICAgIGNhc2UgRkZJX1RZUEVfVUlOVDE2OgorICAgICAgICAgICAgICBjYXNlIEZGSV9UWVBFX1NJTlQxNjoKKyAgICAgICAgICAgICAgY2FzZSBGRklfVFlQRV9VSU5UMzI6CisgICAgICAgICAgICAgIGNhc2UgRkZJX1RZUEVfU0lOVDMyOgorICAgICAgICAgICAgICBjYXNlIEZGSV9UWVBFX1BPSU5URVI6CisgICAgICAgICAgICAgIGNhc2UgRkZJX1RZUEVfVUlOVDY0OgorICAgICAgICAgICAgICBjYXNlIEZGSV9UWVBFX0lOVDoKKyAgICAgICAgICAgICAgY2FzZSBGRklfVFlQRV9TSU5UNjQ6CisJCXsKKwkJICB2b2lkICphZGRyID0gZ2V0X2Jhc2ljX3R5cGVfYWRkciAoY2lmLT5ydHlwZS0+dHlwZSwKKwkJCQkJCSAgICAmY29udGV4dCwgMCk7CisJCSAgY29weV9iYXNpY190eXBlIChydmFsdWUsIGFkZHIsIGNpZi0+cnR5cGUtPnR5cGUpOworCQkgIGJyZWFrOworCQl9CisKKyAgICAgICAgICAgICAgY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisgICAgICAgICAgICAgICAgaWYgKGlzX2hmYSAoY2lmLT5ydHlwZSkpCisJCSAgeworCQkgICAgaW50IGo7CisJCSAgICB1bnNpZ25lZCBzaG9ydCB0eXBlID0gZ2V0X2hvbW9nZW5lb3VzX3R5cGUgKGNpZi0+cnR5cGUpOworCQkgICAgdW5zaWduZWQgZWxlbXMgPSBlbGVtZW50X2NvdW50IChjaWYtPnJ0eXBlKTsKKwkJICAgIGZvciAoaiA9IDA7IGogPCBlbGVtczsgaisrKQorCQkgICAgICB7CisJCQl2b2lkICpyZWcgPSBnZXRfYmFzaWNfdHlwZV9hZGRyICh0eXBlLCAmY29udGV4dCwgaik7CisJCQljb3B5X2Jhc2ljX3R5cGUgKHJ2YWx1ZSwgcmVnLCB0eXBlKTsKKwkJCXJ2YWx1ZSArPSBnZXRfYmFzaWNfdHlwZV9zaXplICh0eXBlKTsKKwkJICAgICAgfQorCQkgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgoY2lmLT5ydHlwZS0+c2l6ZSArIDcpIC8gOCA8IE5fWF9BUkdfUkVHKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaXplID0gQUxJR04gKGNpZi0+cnR5cGUtPnNpemUsIHNpemVvZiAoVUlOVDY0KSk7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSAocnZhbHVlLCBnZXRfeF9hZGRyICgmY29udGV4dCwgMCksIHNpemUpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkZJX0FTU0VSVCAoMCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBGRklfQVNTRVJUICgwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIG1lbWNweSAoZ2V0X3hfYWRkciAoJmNvbnRleHQsIDgpLCAmcnZhbHVlLCBzaXplb2YgKFVJTlQ2NCkpOworICAgICAgICAgICAgZmZpX2NhbGxfU1lTViAoYWFyY2g2NF9wcmVwX2FyZ3MsICZjb250ZXh0LCAmZWNpZiwKKwkJCSAgIHN0YWNrX2J5dGVzLCBmbik7CisgICAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBGRklfQVNTRVJUICgwKTsKKyAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdHJhbXBvbGluZSBbXSA9Cit7IDB4NzAsIDB4MDAsIDB4MDAsIDB4NTgsCS8qIGxkcgl4MTYsIDFmCSovCisgIDB4OTEsIDB4MDAsIDB4MDAsIDB4MTAsCS8qIGFkcgl4MTcsIDJmCSovCisgIDB4MDAsIDB4MDIsIDB4MWYsIDB4ZDYJLyogYnIJeDE2CSovCit9OworCisvKiBCdWlsZCBhIHRyYW1wb2xpbmUuICAqLworCisjZGVmaW5lIEZGSV9JTklUX1RSQU1QT0xJTkUoVFJBTVAsRlVOLENUWCxGTEFHUykJCQlcCisgICh7dW5zaWduZWQgY2hhciAqX190cmFtcCA9ICh1bnNpZ25lZCBjaGFyKikoVFJBTVApOwkJCVwKKyAgICBVSU5UNjQgIF9fZnVuID0gKFVJTlQ2NCkoRlVOKTsJCQkJCVwKKyAgICBVSU5UNjQgIF9fY3R4ID0gKFVJTlQ2NCkoQ1RYKTsJCQkJCVwKKyAgICBVSU5UNjQgIF9fZmxhZ3MgPSAoVUlOVDY0KShGTEFHUyk7CQkJCQlcCisgICAgbWVtY3B5IChfX3RyYW1wLCB0cmFtcG9saW5lLCBzaXplb2YgKHRyYW1wb2xpbmUpKTsJCQlcCisgICAgbWVtY3B5IChfX3RyYW1wICsgMTIsICZfX2Z1biwgc2l6ZW9mIChfX2Z1bikpOwkJCVwKKyAgICBtZW1jcHkgKF9fdHJhbXAgKyAyMCwgJl9fY3R4LCBzaXplb2YgKF9fY3R4KSk7CQkJXAorICAgIG1lbWNweSAoX190cmFtcCArIDI4LCAmX19mbGFncywgc2l6ZW9mIChfX2ZsYWdzKSk7CQkJXAorICAgIF9fY2xlYXJfY2FjaGUoX190cmFtcCwgX190cmFtcCArIEZGSV9UUkFNUE9MSU5FX1NJWkUpOwkJXAorICB9KQorCitmZmlfc3RhdHVzCitmZmlfcHJlcF9jbG9zdXJlX2xvYyAoZmZpX2Nsb3N1cmUqIGNsb3N1cmUsCisgICAgICAgICAgICAgICAgICAgICAgZmZpX2NpZiogY2lmLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpmdW4pKGZmaV9jaWYqLHZvaWQqLHZvaWQqKix2b2lkKiksCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvZGVsb2MpCit7CisgIGlmIChjaWYtPmFiaSAhPSBGRklfU1lTVikKKyAgICByZXR1cm4gRkZJX0JBRF9BQkk7CisKKyAgRkZJX0lOSVRfVFJBTVBPTElORSAoJmNsb3N1cmUtPnRyYW1wWzBdLCAmZmZpX2Nsb3N1cmVfU1lTViwgY29kZWxvYywKKwkJICAgICAgIGNpZi0+YWFyY2g2NF9mbGFncyk7CisKKyAgY2xvc3VyZS0+Y2lmICA9IGNpZjsKKyAgY2xvc3VyZS0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOworICBjbG9zdXJlLT5mdW4gID0gZnVuOworCisgIHJldHVybiBGRklfT0s7Cit9CisKKy8qIFByaW1hcnkgaGFuZGxlciB0byBzZXR1cCBhbmQgaW52b2tlIGEgZnVuY3Rpb24gd2l0aGluIGEgY2xvc3VyZS4KKworICAgQSBjbG9zdXJlIHdoZW4gaW52b2tlZCBlbnRlcnMgdmlhIHRoZSBhc3NlbWJsZXIgd3JhcHBlcgorICAgZmZpX2Nsb3N1cmVfU1lTVigpLiBUaGUgd3JhcHBlciBhbGxvY2F0ZXMgYSBjYWxsIGNvbnRleHQgb24gdGhlCisgICBzdGFjaywgc2F2ZXMgdGhlIGludGVyZXN0aW5nIHJlZ2lzdGVycyAoZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YKKyAgIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24pIGludG8gdGhlIGNvbnRleHQgdGhlbiBwYXNzZXMgY29udHJvbCB0bworICAgZmZpX2Nsb3N1cmVfU1lTVl9pbm5lcigpIHBhc3NpbmcgdGhlIHNhdmVkIGNvbnRleHQgYW5kIGEgcG9pbnRlciB0bworICAgdGhlIHN0YWNrIGF0IHRoZSBwb2ludCBmZmlfY2xvc3VyZV9TWVNWKCkgd2FzIGludm9rZWQuCisKKyAgIE9uIHRoZSByZXR1cm4gcGF0aCB0aGUgYXNzZW1ibGVyIHdyYXBwZXIgd2lsbCByZWxvYWQgY2FsbCBjb250ZXh0CisgICByZWdzaXRlcnMuCisKKyAgIGZmaV9jbG9zdXJlX1NZU1ZfaW5uZXIoKSBtYXJzaGFsbHMgdGhlIGNhbGwgY29udGV4dCBpbnRvIGZmaSB2YWx1ZQorICAgZGVzcmlwdG9ycywgaW52b2tlcyB0aGUgd3JhcHBlZCBmdW5jdGlvbiwgdGhlbiBtYXJzaGFsbHMgdGhlIHJldHVybgorICAgdmFsdWUgYmFjayBpbnRvIHRoZSBjYWxsIGNvbnRleHQuICAqLworCit2b2lkCitmZmlfY2xvc3VyZV9TWVNWX2lubmVyIChmZmlfY2xvc3VyZSAqY2xvc3VyZSwgc3RydWN0IGNhbGxfY29udGV4dCAqY29udGV4dCwKKwkJCXZvaWQgKnN0YWNrKQoreworICBmZmlfY2lmICpjaWYgPSBjbG9zdXJlLT5jaWY7CisgIHZvaWQgKiphdmFsdWUgPSAodm9pZCoqKSBhbGxvY2EgKGNpZi0+bmFyZ3MgKiBzaXplb2YgKHZvaWQqKSk7CisgIHZvaWQgKnJ2YWx1ZSA9IE5VTEw7CisgIGludCBpOworICBzdHJ1Y3QgYXJnX3N0YXRlIHN0YXRlOworCisgIGFyZ19pbml0ICgmc3RhdGUsIEFMSUdOKGNpZi0+Ynl0ZXMsIDE2KSk7CisKKyAgZm9yIChpID0gMDsgaSA8IGNpZi0+bmFyZ3M7IGkrKykKKyAgICB7CisgICAgICBmZmlfdHlwZSAqdHkgPSBjaWYtPmFyZ190eXBlc1tpXTsKKworICAgICAgc3dpdGNoICh0eS0+dHlwZSkKKwl7CisJY2FzZSBGRklfVFlQRV9WT0lEOgorCSAgRkZJX0FTU0VSVCAoMCk7CisJICBicmVhazsKKworCWNhc2UgRkZJX1RZUEVfVUlOVDg6CisJY2FzZSBGRklfVFlQRV9TSU5UODoKKwljYXNlIEZGSV9UWVBFX1VJTlQxNjoKKwljYXNlIEZGSV9UWVBFX1NJTlQxNjoKKwljYXNlIEZGSV9UWVBFX1VJTlQzMjoKKwljYXNlIEZGSV9UWVBFX1NJTlQzMjoKKwljYXNlIEZGSV9UWVBFX0lOVDoKKwljYXNlIEZGSV9UWVBFX1BPSU5URVI6CisJY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisJY2FzZSBGRklfVFlQRV9TSU5UNjQ6CisJY2FzZSAgRkZJX1RZUEVfRkxPQVQ6CisJY2FzZSAgRkZJX1RZUEVfRE9VQkxFOgorCWNhc2UgIEZGSV9UWVBFX0xPTkdET1VCTEU6CisJICBhdmFsdWVbaV0gPSBhbGxvY2F0ZV90b19yZWdpc3Rlcl9vcl9zdGFjayAoY29udGV4dCwgc3RhY2ssCisJCQkJCQkgICAgICZzdGF0ZSwgdHktPnR5cGUpOworCSAgYnJlYWs7CisKKwljYXNlIEZGSV9UWVBFX1NUUlVDVDoKKwkgIGlmIChpc19oZmEgKHR5KSkKKwkgICAgeworCSAgICAgIHVuc2lnbmVkIG4gPSBlbGVtZW50X2NvdW50ICh0eSk7CisJICAgICAgaWYgKGF2YWlsYWJsZV92ICgmc3RhdGUpIDwgbikKKwkJeworCQkgIHN0YXRlLm5zcm4gPSBOX1ZfQVJHX1JFRzsKKwkJICBhdmFsdWVbaV0gPSBhbGxvY2F0ZV90b19zdGFjayAoJnN0YXRlLCBzdGFjaywgdHktPmFsaWdubWVudCwKKwkJCQkJCSB0eS0+c2l6ZSk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBzd2l0Y2ggKGdldF9ob21vZ2VuZW91c190eXBlICh0eSkpCisJCSAgICB7CisJCSAgICBjYXNlIEZGSV9UWVBFX0ZMT0FUOgorCQkgICAgICB7CisJCQkvKiBFZWVrISBXZSBuZWVkIGEgcG9pbnRlciB0byB0aGUgc3RydWN0dXJlLAorCQkJICAgaG93ZXZlciB0aGUgaG9tb2dlbmVvdXMgZmxvYXQgZWxlbWVudHMgYXJlCisJCQkgICBiZWluZyBwYXNzZWQgaW4gaW5kaXZpZHVhbCBTIHJlZ2lzdGVycywKKwkJCSAgIHRoZXJlZm9yZSB0aGUgc3RydWN0dXJlIGlzIG5vdCByZXByZXNlbnRlZCBhcworCQkJICAgYSBjb250aWd1b3VzIHNlcXVlbmNlIG9mIGJ5dGVzIGluIG91ciBzYXZlZAorCQkJICAgcmVnaXN0ZXIgY29udGV4dC4gV2UgbmVlZCB0byBmYWtlIHVwIGEgY29weQorCQkJICAgb2YgdGhlIHN0cnVjdHVyZSBsYXllZCBvdXQgaW4gbWVtb3J5CisJCQkgICBjb3JyZWN0bHkuIFRoZSBmYWtlIGNhbiBiZSB0b3NzZWQgb25jZSB0aGUKKwkJCSAgIGNsb3N1cmUgZnVuY3Rpb24gaGFzIHJldHVybmVkIGhlbmNlIGFsbG9jYSgpCisJCQkgICBpcyBzdWZmaWNpZW50LiAqLworCQkJaW50IGo7CisJCQlVSU5UMzIgKnAgPSBhdmFsdWVbaV0gPSBhbGxvY2EgKHR5LT5zaXplKTsKKwkJCWZvciAoaiA9IDA7IGogPCBlbGVtZW50X2NvdW50ICh0eSk7IGorKykKKwkJCSAgbWVtY3B5ICgmcFtqXSwKKwkJCQkgIGFsbG9jYXRlX3RvX3MgKGNvbnRleHQsICZzdGF0ZSksCisJCQkJICBzaXplb2YgKCpwKSk7CisJCQlicmVhazsKKwkJICAgICAgfQorCisJCSAgICBjYXNlIEZGSV9UWVBFX0RPVUJMRToKKwkJICAgICAgeworCQkJLyogRWVlayEgV2UgbmVlZCBhIHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSwKKwkJCSAgIGhvd2V2ZXIgdGhlIGhvbW9nZW5lb3VzIGZsb2F0IGVsZW1lbnRzIGFyZQorCQkJICAgYmVpbmcgcGFzc2VkIGluIGluZGl2aWR1YWwgUyByZWdpc3RlcnMsCisJCQkgICB0aGVyZWZvcmUgdGhlIHN0cnVjdHVyZSBpcyBub3QgcmVwcmVzZW50ZWQgYXMKKwkJCSAgIGEgY29udGlndW91cyBzZXF1ZW5jZSBvZiBieXRlcyBpbiBvdXIgc2F2ZWQKKwkJCSAgIHJlZ2lzdGVyIGNvbnRleHQuIFdlIG5lZWQgdG8gZmFrZSB1cCBhIGNvcHkKKwkJCSAgIG9mIHRoZSBzdHJ1Y3R1cmUgbGF5ZWQgb3V0IGluIG1lbW9yeQorCQkJICAgY29ycmVjdGx5LiBUaGUgZmFrZSBjYW4gYmUgdG9zc2VkIG9uY2UgdGhlCisJCQkgICBjbG9zdXJlIGZ1bmN0aW9uIGhhcyByZXR1cm5lZCBoZW5jZSBhbGxvY2EoKQorCQkJICAgaXMgc3VmZmljaWVudC4gKi8KKwkJCWludCBqOworCQkJVUlOVDY0ICpwID0gYXZhbHVlW2ldID0gYWxsb2NhICh0eS0+c2l6ZSk7CisJCQlmb3IgKGogPSAwOyBqIDwgZWxlbWVudF9jb3VudCAodHkpOyBqKyspCisJCQkgIG1lbWNweSAoJnBbal0sCisJCQkJICBhbGxvY2F0ZV90b19kIChjb250ZXh0LCAmc3RhdGUpLAorCQkJCSAgc2l6ZW9mICgqcCkpOworCQkJYnJlYWs7CisJCSAgICAgIH0KKworCQkgICAgY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFOgorCQkJICBtZW1jcHkgKCZhdmFsdWVbaV0sCisJCQkJICBhbGxvY2F0ZV90b192IChjb250ZXh0LCAmc3RhdGUpLAorCQkJCSAgc2l6ZW9mICgqYXZhbHVlKSk7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBkZWZhdWx0OgorCQkgICAgICBGRklfQVNTRVJUICgwKTsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAodHktPnNpemUgPiAxNikKKwkgICAgeworCSAgICAgIC8qIFJlcGxhY2UgQ29tcG9zaXRlIHR5cGUgb2Ygc2l6ZSBncmVhdGVyIHRoYW4gMTYgd2l0aCBhCisJCSBwb2ludGVyLiAgKi8KKwkgICAgICBtZW1jcHkgKCZhdmFsdWVbaV0sCisJCSAgICAgIGFsbG9jYXRlX3RvX3JlZ2lzdGVyX29yX3N0YWNrIChjb250ZXh0LCBzdGFjaywKKwkJCQkJCSAgICAgJnN0YXRlLCBGRklfVFlQRV9QT0lOVEVSKSwKKwkJICAgICAgc2l6ZW9mIChhdmFsdWVbaV0pKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoYXZhaWxhYmxlX3ggKCZzdGF0ZSkgPj0gKHR5LT5zaXplICsgNykgLyA4KQorCSAgICB7CisJICAgICAgYXZhbHVlW2ldID0gZ2V0X3hfYWRkciAoY29udGV4dCwgc3RhdGUubmdybik7CisJICAgICAgc3RhdGUubmdybiArPSAodHktPnNpemUgKyA3KSAvIDg7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHN0YXRlLm5ncm4gPSBOX1hfQVJHX1JFRzsKKworCSAgICAgIGF2YWx1ZVtpXSA9IGFsbG9jYXRlX3RvX3N0YWNrICgmc3RhdGUsIHN0YWNrLCB0eS0+YWxpZ25tZW50LAorCQkJCQkgICAgIHR5LT5zaXplKTsKKwkgICAgfQorCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgRkZJX0FTU0VSVCAoMCk7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIC8qIEZpZ3VyZSBvdXQgd2hlcmUgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHBhc3NlZCwgZWl0aGVyIGluCisgICAgIHJlZ2lzdGVycyBvciBpbiBhIG1lbW9yeSBibG9jayBhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlciBhbmQgcGFzc2VkCisgICAgIGluIHg4LiAgKi8KKworICBpZiAoaXNfcmVnaXN0ZXJfY2FuZGlkYXRlIChjaWYtPnJ0eXBlKSkKKyAgICB7CisgICAgICAvKiBSZWdpc3RlciBjYW5kaWRhdGVzIGFyZSAqYWx3YXlzKiByZXR1cm5lZCBpbiByZWdpc3RlcnMuICovCisKKyAgICAgIC8qIEFsbG9jYXRlIGEgc2NyYXRjaHBhZCBmb3IgdGhlIHJldHVybiB2YWx1ZSwgd2Ugd2lsbCBsZXQgdGhlCisgICAgICAgICBjYWxsZWUgc2NyaWJsZSB0aGUgcmVzdWx0IGludG8gdGhlIHNjcmF0Y2ggcGFkIHRoZW4gbW92ZSB0aGUKKyAgICAgICAgIGNvbnRlbnRzIGludG8gdGhlIGFwcHJvcHJpYXRlIHJldHVybiB2YWx1ZSBsb2NhdGlvbiBmb3IgdGhlCisgICAgICAgICBjYWxsIGNvbnZlbnRpb24uICAqLworICAgICAgcnZhbHVlID0gYWxsb2NhIChjaWYtPnJ0eXBlLT5zaXplKTsKKyAgICAgIChjbG9zdXJlLT5mdW4pIChjaWYsIHJ2YWx1ZSwgYXZhbHVlLCBjbG9zdXJlLT51c2VyX2RhdGEpOworCisgICAgICAvKiBDb3B5IHRoZSByZXR1cm4gdmFsdWUgaW50byB0aGUgY2FsbCBjb250ZXh0IHNvIHRoYXQgaXQgaXMgcmV0dXJuZWQKKyAgICAgICAgIGFzIGV4cGVjdGVkIHRvIG91ciBjYWxsZXIuICAqLworICAgICAgc3dpdGNoIChjaWYtPnJ0eXBlLT50eXBlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgRkZJX1RZUEVfVk9JRDoKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEZGSV9UWVBFX1VJTlQ4OgorICAgICAgICBjYXNlIEZGSV9UWVBFX1VJTlQxNjoKKyAgICAgICAgY2FzZSBGRklfVFlQRV9VSU5UMzI6CisgICAgICAgIGNhc2UgRkZJX1RZUEVfUE9JTlRFUjoKKyAgICAgICAgY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisgICAgICAgIGNhc2UgRkZJX1RZUEVfU0lOVDg6CisgICAgICAgIGNhc2UgRkZJX1RZUEVfU0lOVDE2OgorICAgICAgICBjYXNlIEZGSV9UWVBFX0lOVDoKKyAgICAgICAgY2FzZSBGRklfVFlQRV9TSU5UMzI6CisgICAgICAgIGNhc2UgRkZJX1RZUEVfU0lOVDY0OgorICAgICAgICBjYXNlIEZGSV9UWVBFX0ZMT0FUOgorICAgICAgICBjYXNlIEZGSV9UWVBFX0RPVUJMRToKKyAgICAgICAgY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFOgorCSAgeworCSAgICB2b2lkICphZGRyID0gZ2V0X2Jhc2ljX3R5cGVfYWRkciAoY2lmLT5ydHlwZS0+dHlwZSwgY29udGV4dCwgMCk7CisJICAgIGNvcHlfYmFzaWNfdHlwZSAoYWRkciwgcnZhbHVlLCBjaWYtPnJ0eXBlLT50eXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworCSAgfQorICAgICAgICBjYXNlIEZGSV9UWVBFX1NUUlVDVDoKKyAgICAgICAgICBpZiAoaXNfaGZhIChjaWYtPnJ0eXBlKSkKKwkgICAgeworCSAgICAgIGludCBpOworCSAgICAgIHVuc2lnbmVkIHNob3J0IHR5cGUgPSBnZXRfaG9tb2dlbmVvdXNfdHlwZSAoY2lmLT5ydHlwZSk7CisJICAgICAgdW5zaWduZWQgZWxlbXMgPSBlbGVtZW50X2NvdW50IChjaWYtPnJ0eXBlKTsKKwkgICAgICBmb3IgKGkgPSAwOyBpIDwgZWxlbXM7IGkrKykKKwkJeworCQkgIHZvaWQgKnJlZyA9IGdldF9iYXNpY190eXBlX2FkZHIgKHR5cGUsIGNvbnRleHQsIGkpOworCQkgIGNvcHlfYmFzaWNfdHlwZSAocmVnLCBydmFsdWUsIHR5cGUpOworCQkgIHJ2YWx1ZSArPSBnZXRfYmFzaWNfdHlwZV9zaXplICh0eXBlKTsKKwkJfQorCSAgICB9CisgICAgICAgICAgZWxzZSBpZiAoKGNpZi0+cnR5cGUtPnNpemUgKyA3KSAvIDggPCBOX1hfQVJHX1JFRykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdW5zaWduZWQgc2l6ZSA9IEFMSUdOIChjaWYtPnJ0eXBlLT5zaXplLCBzaXplb2YgKFVJTlQ2NCkpIDsKKyAgICAgICAgICAgICAgbWVtY3B5IChnZXRfeF9hZGRyIChjb250ZXh0LCAwKSwgcnZhbHVlLCBzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEZGSV9BU1NFUlQgKDApOworICAgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIEZGSV9BU1NFUlQgKDApOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbWVtY3B5ICgmcnZhbHVlLCBnZXRfeF9hZGRyIChjb250ZXh0LCA4KSwgc2l6ZW9mIChVSU5UNjQpKTsKKyAgICAgIChjbG9zdXJlLT5mdW4pIChjaWYsIHJ2YWx1ZSwgYXZhbHVlLCBjbG9zdXJlLT51c2VyX2RhdGEpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvYWFyY2g2NC9mZml0YXJnZXQuaCBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2FhcmNoNjQvZmZpdGFyZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYxYTM0OAotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2FhcmNoNjQvZmZpdGFyZ2V0LmgKQEAgLTAsMCArMSw1OSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwLCAyMDExLCAyMDEyIEFSTSBMdGQuCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCitgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKK3dpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKK2Rpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCit0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCitpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKK0VYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKK0NMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCitUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAqLworCisjaWZuZGVmIExJQkZGSV9UQVJHRVRfSAorI2RlZmluZSBMSUJGRklfVEFSR0VUX0gKKworI2lmbmRlZiBMSUJGRklfSAorI2Vycm9yICJQbGVhc2UgZG8gbm90IGluY2x1ZGUgZmZpdGFyZ2V0LmggZGlyZWN0bHkgaW50byB5b3VyIHNvdXJjZS4gIFVzZSBmZmkuaCBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIExJQkZGSV9BU00KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBmZmlfYXJnOwordHlwZWRlZiBzaWduZWQgbG9uZyBmZmlfc2FyZzsKKwordHlwZWRlZiBlbnVtIGZmaV9hYmkKKyAgeworICAgIEZGSV9GSVJTVF9BQkkgPSAwLAorICAgIEZGSV9TWVNWLAorICAgIEZGSV9MQVNUX0FCSSwKKyAgICBGRklfREVGQVVMVF9BQkkgPSBGRklfU1lTVgorICB9IGZmaV9hYmk7CisjZW5kaWYKKworLyogLS0tLSBEZWZpbml0aW9ucyBmb3IgY2xvc3VyZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBGRklfQ0xPU1VSRVMgMQorI2RlZmluZSBGRklfVFJBTVBPTElORV9TSVpFIDM2CisjZGVmaW5lIEZGSV9OQVRJVkVfUkFXX0FQSSAwCisKKy8qIC0tLS0gSW50ZXJuYWwgLS0tLSAqLworCisKKyNkZWZpbmUgRkZJX0VYVFJBX0NJRl9GSUVMRFMgdW5zaWduZWQgYWFyY2g2NF9mbGFncworCisjZGVmaW5lIEFBUkNINjRfRkZJX1dJVEhfVl9CSVQgMAorCisjZGVmaW5lIEFBUkNINjRfTl9YUkVHIDMyCisjZGVmaW5lIEFBUkNINjRfTl9WUkVHIDMyCisjZGVmaW5lIEFBUkNINjRfQ0FMTF9DT05URVhUX1NJWkUgKEFBUkNINjRfTl9YUkVHICogOCArIEFBUkNINjRfTl9WUkVHICogMTYpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvYWFyY2g2NC9zeXN2LlMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9hYXJjaDY0L3N5c3YuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGNkNDIxCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvYWFyY2g2NC9zeXN2LlMKQEAgLTAsMCArMSwzMDcgQEAKKy8qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCwgMjAxMSwgMjAxMiBBUk0gTHRkLgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKK2EgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCit3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCitkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KK3Blcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwordGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQoraW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCitFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCitDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKK1NPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgKi8KKworI2RlZmluZSBMSUJGRklfQVNNCisjaW5jbHVkZSA8ZmZpY29uZmlnLmg+CisjaW5jbHVkZSA8ZmZpLmg+CisKKyNkZWZpbmUgY2ZpX2FkanVzdF9jZmFfb2Zmc2V0KG9mZikJLmNmaV9hZGp1c3RfY2ZhX29mZnNldCBvZmYKKyNkZWZpbmUgY2ZpX3JlbF9vZmZzZXQocmVnLCBvZmYpCS5jZmlfcmVsX29mZnNldCByZWcsIG9mZgorI2RlZmluZSBjZmlfcmVzdG9yZShyZWcpCQkuY2ZpX3Jlc3RvcmUgcmVnCisjZGVmaW5lIGNmaV9kZWZfY2ZhX3JlZ2lzdGVyKHJlZykJLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyIHJlZworCisgICAgICAgIC50ZXh0CisgICAgICAgIC5nbG9ibCBmZmlfY2FsbF9TWVNWCisgICAgICAgIC50eXBlIGZmaV9jYWxsX1NZU1YsICNmdW5jdGlvbgorCisvKiBmZmlfY2FsbF9TWVNWKCkKKworICAgQ3JlYXRlIGEgc3RhY2sgZnJhbWUsIHNldHVwIGFuIGFyZ3VtZW50IGNvbnRleHQsIGNhbGwgdGhlIGNhbGxlZQorICAgYW5kIGV4dHJhY3QgdGhlIHJlc3VsdC4KKworICAgVGhlIG1heGltdW0gcmVxdWlyZWQgYXJndW1lbnQgc3RhY2sgc2l6ZSBpcyBwcm92aWRlZCwKKyAgIGZmaV9jYWxsX1NZU1YoKSBhbGxvY2F0ZXMgdGhhdCBzdGFjayBzcGFjZSB0aGVuIGNhbGxzIHRoZQorICAgcHJlcGFyZV9mbiB0byBwb3B1bGF0ZSByZWdpc3RlciBjb250ZXh0IGFuZCBzdGFjay4gIFRoZQorICAgYXJndW1lbnQgcGFzc2luZyByZWdpc3RlcnMgYXJlIGxvYWRlZCBmcm9tIHRoZSByZWdpc3RlcgorICAgY29udGV4dCBhbmQgdGhlIGNhbGxlZSBjYWxsZWQsIG9uIHJldHVybiB0aGUgcmVnaXN0ZXIgcGFzc2luZworICAgcmVnaXN0ZXIgYXJlIHNhdmVkIGJhY2sgdG8gdGhlIGNvbnRleHQuICBPdXIgY2FsbGVyIHdpbGwKKyAgIGV4dHJhY3QgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBmaW5hbCBzdGF0ZSBvZiB0aGUgc2F2ZWQKKyAgIHJlZ2lzdGVyIGNvbnRleHQuCisKKyAgIFByb3RvdHlwZToKKworICAgZXh0ZXJuIHVuc2lnbmVkCisgICBmZmlfY2FsbF9TWVNWICh2b2lkICgqKShzdHJ1Y3QgY2FsbF9jb250ZXh0ICpjb250ZXh0LCB1bnNpZ25lZCBjaGFyICosCisJCQkgICBleHRlbmRlZF9jaWYgKiksCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY2FsbF9jb250ZXh0ICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRfY2lmICosCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCByZXF1aXJlZF9zdGFja19zaXplLAorICAgICAgICAgICAgICAgICAgdm9pZCAoKmZuKSh2b2lkKSk7CisKKyAgIFRoZXJlZm9yZSBvbiBlbnRyeSB3ZSBoYXZlOgorCisgICB4MCBwcmVwYXJlX2ZuCisgICB4MSAmY29udGV4dAorICAgeDIgJmVjaWYKKyAgIHgzIGJ5dGVzCisgICB4NCBmbgorCisgICBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGZvbGxvd2luZyBzdGFjayBmcmFtZSBsYXlvdXQ6CisKKyAgID09CisgICAgICAgICAgICAgICAgc2F2ZWQgeDMwKGxyKQorICAgeDI5KGZwKS0+ICAgIHNhdmVkIHgyOShmcCkKKyAgICAgICAgICAgICAgICBzYXZlZCB4MjQKKyAgICAgICAgICAgICAgICBzYXZlZCB4MjMKKyAgICAgICAgICAgICAgICBzYXZlZCB4MjIKKyAgIHNwJyAgICAtPiAgICBzYXZlZCB4MjEKKyAgICAgICAgICAgICAgICAuLi4KKyAgIHNwICAgICAtPiAgICAoY29uc3RydWN0ZWQgY2FsbGVlIHN0YWNrIGFyZ3VtZW50cykKKyAgID09CisKKyAgIFZvaWxhISAqLworCisjZGVmaW5lIGZmaV9jYWxsX1NZU1ZfRlMgKDggKiA0KQorCisgICAgICAgIC5jZmlfc3RhcnRwcm9jCitmZmlfY2FsbF9TWVNWOgorICAgICAgICBzdHAgICAgIHgyOSwgeDMwLCBbc3AsICMtMTZdIQorCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoMTYpCisgICAgICAgIGNmaV9yZWxfb2Zmc2V0ICh4MjksIDApCisgICAgICAgIGNmaV9yZWxfb2Zmc2V0ICh4MzAsIDgpCisKKyAgICAgICAgbW92ICAgICB4MjksIHNwCisJY2ZpX2RlZl9jZmFfcmVnaXN0ZXIgKHgyOSkKKyAgICAgICAgc3ViICAgICBzcCwgc3AsICNmZmlfY2FsbF9TWVNWX0ZTCisKKyAgICAgICAgc3RwICAgICB4MjEsIHgyMiwgW3NwLCAwXQorICAgICAgICBjZmlfcmVsX29mZnNldCAoeDIxLCAwIC0gZmZpX2NhbGxfU1lTVl9GUykKKyAgICAgICAgY2ZpX3JlbF9vZmZzZXQgKHgyMiwgOCAtIGZmaV9jYWxsX1NZU1ZfRlMpCisKKyAgICAgICAgc3RwICAgICB4MjMsIHgyNCwgW3NwLCAxNl0KKyAgICAgICAgY2ZpX3JlbF9vZmZzZXQgKHgyMywgMTYgLSBmZmlfY2FsbF9TWVNWX0ZTKQorICAgICAgICBjZmlfcmVsX29mZnNldCAoeDI0LCAyNCAtIGZmaV9jYWxsX1NZU1ZfRlMpCisKKyAgICAgICAgbW92ICAgICB4MjEsIHgxCisgICAgICAgIG1vdiAgICAgeDIyLCB4MgorICAgICAgICBtb3YgICAgIHgyNCwgeDQKKworICAgICAgICAvKiBBbGxvY2F0ZSB0aGUgc3RhY2sgc3BhY2UgZm9yIHRoZSBhY3R1YWwgYXJndW1lbnRzLCBtYW55CisgICAgICAgICAgIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCBpbiByZWdpc3RlcnMsIGJ1dCB3ZSBhc3N1bWUKKyAgICAgICAgICAgd29yc3QgY2FzZSBhbmQgYWxsb2NhdGUgc3VmZmljaWVudCBzdGFjayBmb3IgQUxMIG9mCisgICAgICAgICAgIHRoZSBhcmd1bWVudHMuICAqLworICAgICAgICBzdWIgICAgIHNwLCBzcCwgeDMKKworICAgICAgICAvKiB1bnNpZ25lZCAoKnByZXBhcmVfZm4pIChzdHJ1Y3QgY2FsbF9jb250ZXh0ICpjb250ZXh0LAorCQkJCSAgIHVuc2lnbmVkIGNoYXIgKnN0YWNrLCBleHRlbmRlZF9jaWYgKmVjaWYpOworCSAqLworICAgICAgICBtb3YgICAgIHgyMywgeDAKKyAgICAgICAgbW92ICAgICB4MCwgeDEKKyAgICAgICAgbW92ICAgICB4MSwgc3AKKyAgICAgICAgLyogeDIgYWxyZWFkeSBpbiBwbGFjZSAqLworICAgICAgICBibHIgICAgIHgyMworCisgICAgICAgIC8qIFByZXNlcnZlIHRoZSBmbGFncyByZXR1cm5lZC4gICovCisgICAgICAgIG1vdiAgICAgeDIzLCB4MAorCisgICAgICAgIC8qIEZpZ3VyZSBvdXQgaWYgd2Ugc2hvdWxkIHRvdWNoIHRoZSB2ZWN0b3IgcmVnaXN0ZXJzLiAgKi8KKyAgICAgICAgdGJ6ICAgICB4MjMsICNBQVJDSDY0X0ZGSV9XSVRIX1ZfQklULCAxZgorCisgICAgICAgIC8qIExvYWQgdGhlIHZlY3RvciBhcmd1bWVudCBwYXNzaW5nIHJlZ2lzdGVycy4gICovCisgICAgICAgIGxkcCAgICAgcTAsIHExLCBbeDIxLCAjOCozMiArICAwXQorICAgICAgICBsZHAgICAgIHEyLCBxMywgW3gyMSwgIzgqMzIgKyAzMl0KKyAgICAgICAgbGRwICAgICBxNCwgcTUsIFt4MjEsICM4KjMyICsgNjRdCisgICAgICAgIGxkcCAgICAgcTYsIHE3LCBbeDIxLCAjOCozMiArIDk2XQorMToKKyAgICAgICAgLyogTG9hZCB0aGUgY29yZSBhcmd1bWVudCBwYXNzaW5nIHJlZ2lzdGVycy4gICovCisgICAgICAgIGxkcCAgICAgeDAsIHgxLCBbeDIxLCAgIzBdCisgICAgICAgIGxkcCAgICAgeDIsIHgzLCBbeDIxLCAjMTZdCisgICAgICAgIGxkcCAgICAgeDQsIHg1LCBbeDIxLCAjMzJdCisgICAgICAgIGxkcCAgICAgeDYsIHg3LCBbeDIxLCAjNDhdCisKKyAgICAgICAgLyogRG9uJ3QgZm9yZ2V0IHg4IHdoaWNoIG1heSBiZSBob2xkaW5nIHRoZSBhZGRyZXNzIG9mIGEgcmV0dXJuIGJ1ZmZlci4KKwkgKi8KKyAgICAgICAgbGRyICAgICB4OCwgICAgIFt4MjEsICM4KjhdCisKKyAgICAgICAgYmxyICAgICB4MjQKKworICAgICAgICAvKiBTYXZlIHRoZSBjb3JlIGFyZ3VtZW50IHBhc3NpbmcgcmVnaXN0ZXJzLiAgKi8KKyAgICAgICAgc3RwICAgICB4MCwgeDEsIFt4MjEsICAjMF0KKyAgICAgICAgc3RwICAgICB4MiwgeDMsIFt4MjEsICMxNl0KKyAgICAgICAgc3RwICAgICB4NCwgeDUsIFt4MjEsICMzMl0KKyAgICAgICAgc3RwICAgICB4NiwgeDcsIFt4MjEsICM0OF0KKworICAgICAgICAvKiBOb3RlIG5vdGhpbmcgdXNlZnVsIGV2ZXIgY29tZXMgYmFjayBpbiB4OCEgICovCisKKyAgICAgICAgLyogRmlndXJlIG91dCBpZiB3ZSBzaG91bGQgdG91Y2ggdGhlIHZlY3RvciByZWdpc3RlcnMuICAqLworICAgICAgICB0YnogICAgIHgyMywgI0FBUkNINjRfRkZJX1dJVEhfVl9CSVQsIDFmCisKKyAgICAgICAgLyogU2F2ZSB0aGUgdmVjdG9yIGFyZ3VtZW50IHBhc3NpbmcgcmVnaXN0ZXJzLiAgKi8KKyAgICAgICAgc3RwICAgICBxMCwgcTEsIFt4MjEsICM4KjMyICsgMF0KKyAgICAgICAgc3RwICAgICBxMiwgcTMsIFt4MjEsICM4KjMyICsgMzJdCisgICAgICAgIHN0cCAgICAgcTQsIHE1LCBbeDIxLCAjOCozMiArIDY0XQorICAgICAgICBzdHAgICAgIHE2LCBxNywgW3gyMSwgIzgqMzIgKyA5Nl0KKzE6CisgICAgICAgIC8qIEFsbCBkb25lLCB1bndpbmQgb3VyIHN0YWNrIGZyYW1lLiAgKi8KKyAgICAgICAgbGRwICAgICB4MjEsIHgyMiwgW3gyOSwgICMgLSBmZmlfY2FsbF9TWVNWX0ZTXQorICAgICAgICBjZmlfcmVzdG9yZSAoeDIxKQorICAgICAgICBjZmlfcmVzdG9yZSAoeDIyKQorCisgICAgICAgIGxkcCAgICAgeDIzLCB4MjQsIFt4MjksICAjIC0gZmZpX2NhbGxfU1lTVl9GUyArIDE2XQorICAgICAgICBjZmlfcmVzdG9yZSAoeDIzKQorICAgICAgICBjZmlfcmVzdG9yZSAoeDI0KQorCisgICAgICAgIG1vdiAgICAgc3AsIHgyOQorCWNmaV9kZWZfY2ZhX3JlZ2lzdGVyIChzcCkKKworICAgICAgICBsZHAgICAgIHgyOSwgeDMwLCBbc3BdLCAjMTYKKwljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC0xNikKKyAgICAgICAgY2ZpX3Jlc3RvcmUgKHgyOSkKKyAgICAgICAgY2ZpX3Jlc3RvcmUgKHgzMCkKKworICAgICAgICByZXQKKworICAgICAgICAuY2ZpX2VuZHByb2MKKyAgICAgICAgLnNpemUgZmZpX2NhbGxfU1lTViwgLi1mZmlfY2FsbF9TWVNWCisKKyNkZWZpbmUgZmZpX2Nsb3N1cmVfU1lTVl9GUyAoOCAqIDIgKyBBQVJDSDY0X0NBTExfQ09OVEVYVF9TSVpFKQorCisvKiBmZmlfY2xvc3VyZV9TWVNWCisKKyAgIENsb3N1cmUgaW52b2NhdGlvbiBnbHVlLiBUaGlzIGlzIHRoZSBsb3cgbGV2ZWwgY29kZSBpbnZva2VkIGRpcmVjdGx5IGJ5CisgICB0aGUgY2xvc3VyZSB0cmFtcG9saW5lIHRvIHNldHVwIGFuZCBjYWxsIGEgY2xvc3VyZS4KKworICAgT24gZW50cnkgeDE3IHBvaW50cyB0byBhIHN0cnVjdCB0cmFtcG9saW5lX2RhdGEsIHgxNiBoYXMgYmVlbiBjbG9iYmVyZWQKKyAgIGFsbCBvdGhlciByZWdpc3RlcnMgYXJlIHByZXNlcnZlZC4KKworICAgV2UgYWxsb2NhdGUgYSBjYWxsIGNvbnRleHQgYW5kIHNhdmUgdGhlIGFyZ3VtZW50IHBhc3NpbmcgcmVnaXN0ZXJzLAorICAgdGhlbiBpbnZva2VkIHRoZSBnZW5lcmljIEMgZmZpX2Nsb3N1cmVfU1lTVl9pbm5lcigpIGZ1bmN0aW9uIHRvIGRvIGFsbAorICAgdGhlIHJlYWwgd29yaywgb24gcmV0dXJuIHdlIGxvYWQgdGhlIHJlc3VsdCBwYXNzaW5nIHJlZ2lzdGVycyBiYWNrIGZyb20KKyAgIHRoZSBjYWxsIGNvbnRleHQuCisKKyAgIE9uIGVudHJ5CisKKyAgIGV4dGVybiB2b2lkCisgICBmZmlfY2xvc3VyZV9TWVNWIChzdHJ1Y3QgdHJhbXBvbGluZV9kYXRhICopOworCisgICBzdHJ1Y3QgdHJhbXBvbGluZV9kYXRhCisgICB7CisgICAgICAgIFVJTlQ2NCAqZmZpX2Nsb3N1cmU7CisgICAgICAgIFVJTlQ2NCBmbGFnczsKKyAgIH07CisKKyAgIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgZm9sbG93aW5nIHN0YWNrIGZyYW1lIGxheW91dDoKKworICAgPT0KKyAgICAgICAgICAgICAgICBzYXZlZCB4MzAobHIpCisgICB4MjkoZnApLT4gICAgc2F2ZWQgeDI5KGZwKQorICAgICAgICAgICAgICAgIHNhdmVkIHgyMgorICAgICAgICAgICAgICAgIHNhdmVkIHgyMQorICAgICAgICAgICAgICAgIC4uLgorICAgc3AgICAgIC0+ICAgIGNhbGxfY29udGV4dAorICAgPT0KKworICAgVm9pbGEhICAqLworCisgICAgICAgIC50ZXh0CisgICAgICAgIC5nbG9ibCBmZmlfY2xvc3VyZV9TWVNWCisgICAgICAgIC5jZmlfc3RhcnRwcm9jCitmZmlfY2xvc3VyZV9TWVNWOgorICAgICAgICBzdHAgICAgIHgyOSwgeDMwLCBbc3AsICMtMTZdIQorCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoMTYpCisgICAgICAgIGNmaV9yZWxfb2Zmc2V0ICh4MjksIDApCisgICAgICAgIGNmaV9yZWxfb2Zmc2V0ICh4MzAsIDgpCisKKyAgICAgICAgbW92ICAgICB4MjksIHNwCisKKyAgICAgICAgc3ViICAgICBzcCwgc3AsICNmZmlfY2xvc3VyZV9TWVNWX0ZTCisJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0IChmZmlfY2xvc3VyZV9TWVNWX0ZTKQorCisgICAgICAgIHN0cCAgICAgeDIxLCB4MjIsIFt4MjksICMtMTZdCisgICAgICAgIGNmaV9yZWxfb2Zmc2V0ICh4MjEsIDApCisgICAgICAgIGNmaV9yZWxfb2Zmc2V0ICh4MjIsIDgpCisKKyAgICAgICAgLyogTG9hZCB4MjEgd2l0aCAmY2FsbF9jb250ZXh0LiAgKi8KKyAgICAgICAgbW92ICAgICB4MjEsIHNwCisgICAgICAgIC8qIFByZXNlcnZlIG91ciBzdHJ1Y3QgdHJhbXBvbGluZV9kYXRhICogICovCisgICAgICAgIG1vdiAgICAgeDIyLCB4MTcKKworICAgICAgICAvKiBTYXZlIHRoZSByZXN0IG9mIHRoZSBhcmd1bWVudCBwYXNzaW5nIHJlZ2lzdGVycy4gICovCisgICAgICAgIHN0cCAgICAgeDAsIHgxLCBbeDIxLCAjMF0KKyAgICAgICAgc3RwICAgICB4MiwgeDMsIFt4MjEsICMxNl0KKyAgICAgICAgc3RwICAgICB4NCwgeDUsIFt4MjEsICMzMl0KKyAgICAgICAgc3RwICAgICB4NiwgeDcsIFt4MjEsICM0OF0KKyAgICAgICAgLyogRG9uJ3QgZm9yZ2V0IHdlIG1heSBoYXZlIGJlZW4gZ2l2ZW4gYSByZXN1bHQgc2NyYXRjaCBwYWQgYWRkcmVzcy4KKwkgKi8KKyAgICAgICAgc3RyICAgICB4OCwgICAgIFt4MjEsICM2NF0KKworICAgICAgICAvKiBGaWd1cmUgb3V0IGlmIHdlIHNob3VsZCB0b3VjaCB0aGUgdmVjdG9yIHJlZ2lzdGVycy4gICovCisgICAgICAgIGxkciAgICAgeDAsIFt4MjIsICM4XQorICAgICAgICB0YnogICAgIHgwLCAjQUFSQ0g2NF9GRklfV0lUSF9WX0JJVCwgMWYKKworICAgICAgICAvKiBTYXZlIHRoZSBhcmd1bWVudCBwYXNzaW5nIHZlY3RvciByZWdpc3RlcnMuICAqLworICAgICAgICBzdHAgICAgIHEwLCBxMSwgW3gyMSwgIzgqMzIgKyAwXQorICAgICAgICBzdHAgICAgIHEyLCBxMywgW3gyMSwgIzgqMzIgKyAzMl0KKyAgICAgICAgc3RwICAgICBxNCwgcTUsIFt4MjEsICM4KjMyICsgNjRdCisgICAgICAgIHN0cCAgICAgcTYsIHE3LCBbeDIxLCAjOCozMiArIDk2XQorMToKKyAgICAgICAgLyogTG9hZCAmZmZpX2Nsb3N1cmUuLiAgKi8KKyAgICAgICAgbGRyICAgICB4MCwgW3gyMiwgIzBdCisgICAgICAgIG1vdiAgICAgeDEsIHgyMQorICAgICAgICAvKiBDb21wdXRlIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3RhY2sgYXQgdGhlIHBvaW50IHRoYXQgdGhlCisgICAgICAgICAgIHRyYW1wb2xpbmUgd2FzIGNhbGxlZC4gICovCisgICAgICAgIGFkZCAgICAgeDIsIHgyOSwgIzE2CisKKyAgICAgICAgYmwgICAgICBmZmlfY2xvc3VyZV9TWVNWX2lubmVyCisKKyAgICAgICAgLyogRmlndXJlIG91dCBpZiB3ZSBzaG91bGQgdG91Y2ggdGhlIHZlY3RvciByZWdpc3RlcnMuICAqLworICAgICAgICBsZHIgICAgIHgwLCBbeDIyLCAjOF0KKyAgICAgICAgdGJ6ICAgICB4MCwgI0FBUkNINjRfRkZJX1dJVEhfVl9CSVQsIDFmCisKKyAgICAgICAgLyogTG9hZCB0aGUgcmVzdWx0IHBhc3NpbmcgdmVjdG9yIHJlZ2lzdGVycy4gICovCisgICAgICAgIGxkcCAgICAgcTAsIHExLCBbeDIxLCAjOCozMiArIDBdCisgICAgICAgIGxkcCAgICAgcTIsIHEzLCBbeDIxLCAjOCozMiArIDMyXQorICAgICAgICBsZHAgICAgIHE0LCBxNSwgW3gyMSwgIzgqMzIgKyA2NF0KKyAgICAgICAgbGRwICAgICBxNiwgcTcsIFt4MjEsICM4KjMyICsgOTZdCisxOgorICAgICAgICAvKiBMb2FkIHRoZSByZXN1bHQgcGFzc2luZyBjb3JlIHJlZ2lzdGVycy4gICovCisgICAgICAgIGxkcCAgICAgeDAsIHgxLCBbeDIxLCAgIzBdCisgICAgICAgIGxkcCAgICAgeDIsIHgzLCBbeDIxLCAjMTZdCisgICAgICAgIGxkcCAgICAgeDQsIHg1LCBbeDIxLCAjMzJdCisgICAgICAgIGxkcCAgICAgeDYsIHg3LCBbeDIxLCAjNDhdCisgICAgICAgIC8qIE5vdGUgbm90aGluZyB1c2VmdWxsIGlzIHJldHVybmVkIGluIHg4LiAgKi8KKworICAgICAgICAvKiBXZSBhcmUgZG9uZSwgdW53aW5kIG91ciBmcmFtZS4gICovCisgICAgICAgIGxkcCAgICAgeDIxLCB4MjIsIFt4MjksICAjLTE2XQorICAgICAgICBjZmlfcmVzdG9yZSAoeDIxKQorICAgICAgICBjZmlfcmVzdG9yZSAoeDIyKQorCisgICAgICAgIG1vdiAgICAgc3AsIHgyOQorCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLWZmaV9jbG9zdXJlX1NZU1ZfRlMpCisKKyAgICAgICAgbGRwICAgICB4MjksIHgzMCwgW3NwXSwgIzE2CisJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtMTYpCisgICAgICAgIGNmaV9yZXN0b3JlICh4MjkpCisgICAgICAgIGNmaV9yZXN0b3JlICh4MzApCisKKyAgICAgICAgcmV0CisgICAgICAgIC5jZmlfZW5kcHJvYworICAgICAgICAuc2l6ZSBmZmlfY2xvc3VyZV9TWVNWLCAuLWZmaV9jbG9zdXJlX1NZU1YKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2FscGhhL2ZmaS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvYWxwaGEvZmZpLmMKaW5kZXggOGQ2YjJiYS4uMTkyZjY5MSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvYWxwaGEvZmZpLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvYWxwaGEvZmZpLmMKQEAgLTEsNSArMSw2IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgZmZpLmMgLSBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDEsIDIwMDcsIDIwMDggIFJlZCBIYXQsIEluYy4KKyAgIGZmaS5jIC0gQ29weXJpZ2h0IChjKSAyMDEyICBBbnRob255IEdyZWVuCisgICAgICAgICAgIENvcHlyaWdodCAoYykgMTk5OCwgMjAwMSwgMjAwNywgMjAwOCAgUmVkIEhhdCwgSW5jLgogICAgCiAgICBBbHBoYSBGb3JlaWduIEZ1bmN0aW9uIEludGVyZmFjZSAKIApAQCAtMTc4LDYgKzE3OSw5IEBACiB7CiAgIHVuc2lnbmVkIGludCAqdHJhbXA7CiAKKyAgaWYgKGNpZi0+YWJpICE9IEZGSV9PU0YpCisgICAgcmV0dXJuIEZGSV9CQURfQUJJOworCiAgIHRyYW1wID0gKHVuc2lnbmVkIGludCAqKSAmY2xvc3VyZS0+dHJhbXBbMF07CiAgIHRyYW1wWzBdID0gMHg0N2ZiMDQwMTsJLyogbW92ICQyNywkMQkJKi8KICAgdHJhbXBbMV0gPSAweGE3N2IwMDEwOwkvKiBsZHEgJDI3LDE2KCQyNykJKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2FscGhhL2ZmaXRhcmdldC5oIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvYWxwaGEvZmZpdGFyZ2V0LmgKaW5kZXggN2QwNmViMC4uYWYxNDViYyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvYWxwaGEvZmZpdGFyZ2V0LmgKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvYWxwaGEvZmZpdGFyZ2V0LmgKQEAgLTEsNSArMSw2IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotQy0qLQotICAgZmZpdGFyZ2V0LmggLSBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMyAgUmVkIEhhdCwgSW5jLgorICAgZmZpdGFyZ2V0LmggLSBDb3B5cmlnaHQgKGMpIDIwMTIgIEFudGhvbnkgR3JlZW4KKyAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAxOTk2LTIwMDMgIFJlZCBIYXQsIEluYy4KICAgIFRhcmdldCBjb25maWd1cmF0aW9uIG1hY3JvcyBmb3IgQWxwaGEuCiAKICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwpAQCAtMjcsNiArMjgsMTAgQEAKICNpZm5kZWYgTElCRkZJX1RBUkdFVF9ICiAjZGVmaW5lIExJQkZGSV9UQVJHRVRfSAogCisjaWZuZGVmIExJQkZGSV9ICisjZXJyb3IgIlBsZWFzZSBkbyBub3QgaW5jbHVkZSBmZml0YXJnZXQuaCBkaXJlY3RseSBpbnRvIHlvdXIgc291cmNlLiAgVXNlIGZmaS5oIGluc3RlYWQuIgorI2VuZGlmCisKICNpZm5kZWYgTElCRkZJX0FTTQogdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgICAgIGZmaV9hcmc7CiB0eXBlZGVmIHNpZ25lZCBsb25nICAgICAgICAgICAgZmZpX3Nhcmc7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9hbHBoYS9vc2YuUyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2FscGhhL29zZi5TCmluZGV4IGQwZTc3ODIuLjZiOWY0ZGYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2FscGhhL29zZi5TCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2FscGhhL29zZi5TCkBAIC0xLDUgKzEsNSBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIG9zZi5TIC0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDAxLCAyMDA3LCAyMDA4IFJlZCBIYXQKKyAgIG9zZi5TIC0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDAxLCAyMDA3LCAyMDA4LCAyMDExIFJlZCBIYXQKICAgIAogICAgQWxwaGEvT1NGIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlIAogCkBAIC0yOTksMzMgKzI5OSw1MSBAQAogI2VuZGlmCiAKICNpZmRlZiBfX0VMRl9fCisjIGRlZmluZSBVQV9TSQkJLjRieXRlCisjIGRlZmluZSBGREVfRU5DT0RJTkcJMHgxYgkvKiBwY3JlbCBzZGF0YTQgKi8KKyMgZGVmaW5lIEZERV9FTkNPREUoWCkJLjRieXRlIFgtLgorIyBkZWZpbmUgRkRFX0FSQU5HRShYKQkuNGJ5dGUgWAorI2VsaWYgZGVmaW5lZCBfX29zZl9fCisjIGRlZmluZSBVQV9TSQkJLmFsaWduIDA7IC5sb25nCisjIGRlZmluZSBGREVfRU5DT0RJTkcJMHg1MAkvKiBhbGlnbmVkIGFic29sdXRlICovCisjIGRlZmluZSBGREVfRU5DT0RFKFgpCS5hbGlnbiAzOyAucXVhZCBYCisjIGRlZmluZSBGREVfQVJBTkdFKFgpCS5hbGlnbiAwOyAucXVhZCBYCisjZW5kaWYKKworI2lmZGVmIF9fRUxGX18KIAkuc2VjdGlvbgkuZWhfZnJhbWUsRUhfRlJBTUVfRkxBR1MsQHByb2diaXRzCisjZWxpZiBkZWZpbmVkIF9fb3NmX18KKwkuZGF0YQorCS5hbGlnbiAzCisJLmdsb2JsIF9HTE9CQUxfX0ZfZmZpX2NhbGxfb3NmCitfR0xPQkFMX19GX2ZmaV9jYWxsX29zZjoKKyNlbmRpZgogX19GUkFNRV9CRUdJTl9fOgotCS40Ynl0ZQkkTEVDSUUxLSRMU0NJRTEJIyBMZW5ndGggb2YgQ29tbW9uIEluZm9ybWF0aW9uIEVudHJ5CisJVUFfU0kJJExFQ0lFMS0kTFNDSUUxCSMgTGVuZ3RoIG9mIENvbW1vbiBJbmZvcm1hdGlvbiBFbnRyeQogJExTQ0lFMToKLQkuNGJ5dGUJMHgwCQkjIENJRSBJZGVudGlmaWVyIFRhZworCVVBX1NJCTB4MAkJIyBDSUUgSWRlbnRpZmllciBUYWcKIAkuYnl0ZQkweDEJCSMgQ0lFIFZlcnNpb24KIAkuYXNjaWkgInpSXDAiCQkjIENJRSBBdWdtZW50YXRpb24KIAkuYnl0ZQkweDEJCSMgdWxlYjEyOCAweDE7IENJRSBDb2RlIEFsaWdubWVudCBGYWN0b3IKIAkuYnl0ZQkweDc4CQkjIHNsZWIxMjggLTg7IENJRSBEYXRhIEFsaWdubWVudCBGYWN0b3IKIAkuYnl0ZQkyNgkJIyBDSUUgUkEgQ29sdW1uCiAJLmJ5dGUJMHgxCQkjIHVsZWIxMjggMHgxOyBBdWdtZW50YXRpb24gc2l6ZQotCS5ieXRlCTB4MWIJCSMgRkRFIEVuY29kaW5nIChwY3JlbCBzZGF0YTQpCisJLmJ5dGUJRkRFX0VOQ09ESU5HCSMgRkRFIEVuY29kaW5nCiAJLmJ5dGUJMHhjCQkjIERXX0NGQV9kZWZfY2ZhCiAJLmJ5dGUJMzAJCSMgdWxlYjEyOCBjb2x1bW4gMzAKIAkuYnl0ZQkwCQkjIHVsZWIxMjggb2Zmc2V0IDAKIAkuYWxpZ24gMwogJExFQ0lFMToKICRMU0ZERTE6Ci0JLjRieXRlCSRMRUZERTEtJExBU0ZERTEJCSMgRkRFIExlbmd0aAorCVVBX1NJCSRMRUZERTEtJExBU0ZERTEJCSMgRkRFIExlbmd0aAogJExBU0ZERTE6Ci0JLjRieXRlCSRMQVNGREUxLV9fRlJBTUVfQkVHSU5fXwkjIEZERSBDSUUgb2Zmc2V0Ci0JLjRieXRlCSRMRkIxLS4JCSMgRkRFIGluaXRpYWwgbG9jYXRpb24KLQkuNGJ5dGUJJExGRTEtJExGQjEJIyBGREUgYWRkcmVzcyByYW5nZQorCVVBX1NJCSRMQVNGREUxLV9fRlJBTUVfQkVHSU5fXwkjIEZERSBDSUUgb2Zmc2V0CisJRkRFX0VOQ09ERSgkTEZCMSkJCQkjIEZERSBpbml0aWFsIGxvY2F0aW9uCisJRkRFX0FSQU5HRSgkTEZFMS0kTEZCMSkJCQkjIEZERSBhZGRyZXNzIHJhbmdlCiAJLmJ5dGUJMHgwCQkjIHVsZWIxMjggMHgwOyBBdWdtZW50YXRpb24gc2l6ZQogCiAJLmJ5dGUJMHg0CQkjIERXX0NGQV9hZHZhbmNlX2xvYzQKLQkuNGJ5dGUJJExDRkkxLSRMRkIxCisJVUFfU0kJJExDRkkxLSRMRkIxCiAJLmJ5dGUJMHg5YQkJIyBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMjYKIAkuYnl0ZQk0CQkjIHVsZWIxMjggNCotOAogCS5ieXRlCTB4OGYJCSMgRFdfQ0ZBX29mZnNldCwgY29sdW1uIDE1CkBAIC0zMzUsMzIgKzM1MywzNSBAQAogCS5ieXRlCTMyCQkjIHVsZWIxMjggb2Zmc2V0IDMyCiAKIAkuYnl0ZQkweDQJCSMgRFdfQ0ZBX2FkdmFuY2VfbG9jNAotCS40Ynl0ZQkkTENGSTItJExDRkkxCisJVUFfU0kJJExDRkkyLSRMQ0ZJMQogCS5ieXRlCTB4ZGEJCSMgRFdfQ0ZBX3Jlc3RvcmUsIGNvbHVtbiAyNgogCS5hbGlnbiAzCiAkTEVGREUxOgogCiAkTFNGREUzOgotCS40Ynl0ZQkkTEVGREUzLSRMQVNGREUzCQkjIEZERSBMZW5ndGgKKwlVQV9TSQkkTEVGREUzLSRMQVNGREUzCQkjIEZERSBMZW5ndGgKICRMQVNGREUzOgotCS40Ynl0ZQkkTEFTRkRFMy1fX0ZSQU1FX0JFR0lOX18JIyBGREUgQ0lFIG9mZnNldAotCS40Ynl0ZQkkTEZCMi0uCQkjIEZERSBpbml0aWFsIGxvY2F0aW9uCi0JLjRieXRlCSRMRkUyLSRMRkIyCSMgRkRFIGFkZHJlc3MgcmFuZ2UKKwlVQV9TSQkkTEFTRkRFMy1fX0ZSQU1FX0JFR0lOX18JIyBGREUgQ0lFIG9mZnNldAorCUZERV9FTkNPREUoJExGQjIpCQkJIyBGREUgaW5pdGlhbCBsb2NhdGlvbgorCUZERV9BUkFOR0UoJExGRTItJExGQjIpCQkJIyBGREUgYWRkcmVzcyByYW5nZQogCS5ieXRlCTB4MAkJIyB1bGViMTI4IDB4MDsgQXVnbWVudGF0aW9uIHNpemUKIAogCS5ieXRlCTB4NAkJIyBEV19DRkFfYWR2YW5jZV9sb2M0Ci0JLjRieXRlCSRMQ0ZJNS0kTEZCMgorCVVBX1NJCSRMQ0ZJNS0kTEZCMgogCS5ieXRlCTB4ZQkJIyBEV19DRkFfZGVmX2NmYV9vZmZzZXQKIAkuYnl0ZQkweDgwLDB4MQkjIHVsZWIxMjggMTI4CiAKIAkuYnl0ZQkweDQJCSMgRFdfQ0ZBX2FkdmFuY2VfbG9jNAotCS40Ynl0ZQkkTENGSTYtJExDRkk1CisJVUFfU0kJJExDRkk2LSRMQ0ZJNQogCS5ieXRlCTB4OWEJCSMgRFdfQ0ZBX29mZnNldCwgY29sdW1uIDI2CiAJLmJ5dGUJMTYJCSMgdWxlYjEyOCBvZmZzZXQgMTYqLTgKIAkuYWxpZ24gMwogJExFRkRFMzoKLQotI2lmZGVmIF9fbGludXhfXwotCS5zZWN0aW9uCS5ub3RlLkdOVS1zdGFjaywiIixAcHJvZ2JpdHMKKyNpZiBkZWZpbmVkIF9fb3NmX18KKwkuYWxpZ24gMAorCS5sb25nCTAJCSMgRW5kIG9mIFRhYmxlCiAjZW5kaWYKKworI2lmIGRlZmluZWQgX19FTEZfXyAmJiBkZWZpbmVkIF9fbGludXhfXworCS5zZWN0aW9uCS5ub3RlLkdOVS1zdGFjaywiIixAcHJvZ2JpdHMKICNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvYXJtL2ZmaS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvYXJtL2ZmaS5jCmluZGV4IGY2YTY0NzUuLjNjY2NlYjkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2FybS9mZmkuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9hcm0vZmZpLmMKQEAgLTEsNiArMSwxMCBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIGZmaS5jIC0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4ICBSZWQgSGF0LCBJbmMuCi0gICAKKyAgIGZmaS5jIC0gQ29weXJpZ2h0IChjKSAyMDExIFRpbW90aHkgV2FsbAorICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMTEgUGxhdXNpYmxlIExhYnMgQ29vcGVyYXRpdmUsIEluYy4KKyAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDExIEFudGhvbnkgR3JlZW4KKwkgICBDb3B5cmlnaHQgKGMpIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgICAgICAgICAgIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCwgMjAxMSAgUmVkIEhhdCwgSW5jLgorCSAgIAogICAgQVJNIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlIAogCiAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKQEAgLTI5LDEyICszMywyMCBAQAogCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAKLS8qIGZmaV9wcmVwX2FyZ3MgaXMgY2FsbGVkIGJ5IHRoZSBhc3NlbWJseSByb3V0aW5lIG9uY2Ugc3RhY2sgc3BhY2UKLSAgIGhhcyBiZWVuIGFsbG9jYXRlZCBmb3IgdGhlIGZ1bmN0aW9uJ3MgYXJndW1lbnRzICovCisvKiBGb3J3YXJkIGRlY2xhcmVzLiAqLworc3RhdGljIGludCB2ZnBfdHlwZV9wIChmZmlfdHlwZSAqKTsKK3N0YXRpYyB2b2lkIGxheW91dF92ZnBfYXJncyAoZmZpX2NpZiAqKTsKIAotdm9pZCBmZmlfcHJlcF9hcmdzKGNoYXIgKnN0YWNrLCBleHRlbmRlZF9jaWYgKmVjaWYpCisvKiBmZmlfcHJlcF9hcmdzIGlzIGNhbGxlZCBieSB0aGUgYXNzZW1ibHkgcm91dGluZSBvbmNlIHN0YWNrIHNwYWNlCisgICBoYXMgYmVlbiBhbGxvY2F0ZWQgZm9yIHRoZSBmdW5jdGlvbidzIGFyZ3VtZW50cworICAgCisgICBUaGUgdmZwX3NwYWNlIHBhcmFtZXRlciBpcyB0aGUgbG9hZCBhcmVhIGZvciBWRlAgcmVncywgdGhlIHJldHVybgorICAgdmFsdWUgaXMgY2lmLT52ZnBfdXNlZCAod29yZCBiaXRzZXQgb2YgVkZQIHJlZ3MgdXNlZCBmb3IgcGFzc2luZworICAgYXJndW1lbnRzKS4gVGhlc2UgYXJlIG9ubHkgdXNlZCBmb3IgdGhlIFZGUCBoYXJkLWZsb2F0IEFCSS4KKyovCitpbnQgZmZpX3ByZXBfYXJncyhjaGFyICpzdGFjaywgZXh0ZW5kZWRfY2lmICplY2lmLCBmbG9hdCAqdmZwX3NwYWNlKQogewotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGksIHZpID0gMDsKICAgcmVnaXN0ZXIgdm9pZCAqKnBfYXJndjsKICAgcmVnaXN0ZXIgY2hhciAqYXJncDsKICAgcmVnaXN0ZXIgZmZpX3R5cGUgKipwX2FyZzsKQEAgLTUzLDEwICs2NSwzMSBAQAogICAgICAgIGktLSwgcF9hcmcrKykKICAgICB7CiAgICAgICBzaXplX3QgejsKKyAgICAgIHNpemVfdCBhbGlnbm1lbnQ7CisKKyAgICAgIC8qIEFsbG9jYXRlZCBpbiBWRlAgcmVnaXN0ZXJzLiAqLworICAgICAgaWYgKGVjaWYtPmNpZi0+YWJpID09IEZGSV9WRlAKKwkgICYmIHZpIDwgZWNpZi0+Y2lmLT52ZnBfbmFyZ3MgJiYgdmZwX3R5cGVfcCAoKnBfYXJnKSkKKwl7CisJICBmbG9hdCogdmZwX3Nsb3QgPSB2ZnBfc3BhY2UgKyBlY2lmLT5jaWYtPnZmcF9hcmdzW3ZpKytdOworCSAgaWYgKCgqcF9hcmcpLT50eXBlID09IEZGSV9UWVBFX0ZMT0FUKQorCSAgICAqKChmbG9hdCopdmZwX3Nsb3QpID0gKigoZmxvYXQqKSpwX2FyZ3YpOworCSAgZWxzZSBpZiAoKCpwX2FyZyktPnR5cGUgPT0gRkZJX1RZUEVfRE9VQkxFKQorCSAgICAqKChkb3VibGUqKXZmcF9zbG90KSA9ICooKGRvdWJsZSopKnBfYXJndik7CisJICBlbHNlCisJICAgIG1lbWNweSh2ZnBfc2xvdCwgKnBfYXJndiwgKCpwX2FyZyktPnNpemUpOworCSAgcF9hcmd2Kys7CisJICBjb250aW51ZTsKKwl9CiAKICAgICAgIC8qIEFsaWduIGlmIG5lY2Vzc2FyeSAqLwotICAgICAgaWYgKCgoKnBfYXJnKS0+YWxpZ25tZW50IC0gMSkgJiAodW5zaWduZWQpIGFyZ3ApIHsKLQlhcmdwID0gKGNoYXIgKikgQUxJR04oYXJncCwgKCpwX2FyZyktPmFsaWdubWVudCk7CisgICAgICBhbGlnbm1lbnQgPSAoKnBfYXJnKS0+YWxpZ25tZW50OworI2lmZGVmIF9XSU4zMl9XQ0UKKyAgICAgIGlmIChhbGlnbm1lbnQgPiA0KQorCWFsaWdubWVudCA9IDQ7CisjZW5kaWYKKyAgICAgIGlmICgoYWxpZ25tZW50IC0gMSkgJiAodW5zaWduZWQpIGFyZ3ApIHsKKwlhcmdwID0gKGNoYXIgKikgQUxJR04oYXJncCwgYWxpZ25tZW50KTsKICAgICAgIH0KIAogICAgICAgaWYgKCgqcF9hcmcpLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCkKQEAgLTEwMywxMyArMTM2LDE1IEBACiAJICBwX2FyZ3YrKzsKIAkgIGFyZ3AgKz0gejsKICAgICB9Ci0gIAotICByZXR1cm47CisKKyAgLyogSW5kaWNhdGUgdGhlIFZGUCByZWdpc3RlcnMgdXNlZC4gKi8KKyAgcmV0dXJuIGVjaWYtPmNpZi0+dmZwX3VzZWQ7CiB9CiAKIC8qIFBlcmZvcm0gbWFjaGluZSBkZXBlbmRlbnQgY2lmIHByb2Nlc3NpbmcgKi8KIGZmaV9zdGF0dXMgZmZpX3ByZXBfY2lmX21hY2hkZXAoZmZpX2NpZiAqY2lmKQogeworICBpbnQgdHlwZV9jb2RlOwogICAvKiBSb3VuZCB0aGUgc3RhY2sgdXAgdG8gYSBtdWx0aXBsZSBvZiA4IGJ5dGVzLiAgVGhpcyBpc24ndCBuZWVkZWQgCiAgICAgIGV2ZXJ5d2hlcmUsIGJ1dCBpdCBpcyBvbiBzb21lIHBsYXRmb3JtcywgYW5kIGl0IGRvZXNuJ3QgaGFybSBhbnl0aGluZwogICAgICB3aGVuIGl0IGlzbid0IG5lZWRlZC4gICovCkBAIC0xMzAsNyArMTY1LDE0IEBACiAgICAgICBicmVhazsKIAogICAgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOgotICAgICAgaWYgKGNpZi0+cnR5cGUtPnNpemUgPD0gNCkKKyAgICAgIGlmIChjaWYtPmFiaSA9PSBGRklfVkZQCisJICAmJiAodHlwZV9jb2RlID0gdmZwX3R5cGVfcCAoY2lmLT5ydHlwZSkpICE9IDApCisJeworCSAgLyogQSBDb21wb3NpdGUgVHlwZSBwYXNzZWQgaW4gVkZQIHJlZ2lzdGVycywgZWl0aGVyCisJICAgICBGRklfVFlQRV9TVFJVQ1RfVkZQX0ZMT0FUIG9yIEZGSV9UWVBFX1NUUlVDVF9WRlBfRE9VQkxFLiAqLworCSAgY2lmLT5mbGFncyA9ICh1bnNpZ25lZCkgdHlwZV9jb2RlOworCX0KKyAgICAgIGVsc2UgaWYgKGNpZi0+cnR5cGUtPnNpemUgPD0gNCkKIAkvKiBBIENvbXBvc2l0ZSBUeXBlIG5vdCBsYXJnZXIgdGhhbiA0IGJ5dGVzIGlzIHJldHVybmVkIGluIHIwLiAgKi8KIAljaWYtPmZsYWdzID0gKHVuc2lnbmVkKUZGSV9UWVBFX0lOVDsKICAgICAgIGVsc2UKQEAgLTE0NSwxMSArMTg3LDMwIEBACiAgICAgICBicmVhazsKICAgICB9CiAKKyAgLyogTWFwIG91dCB0aGUgcmVnaXN0ZXIgcGxhY2VtZW50cyBvZiBWRlAgcmVnaXN0ZXIgYXJncy4KKyAgICAgVGhlIFZGUCBoYXJkLWZsb2F0IGNhbGxpbmcgY29udmVudGlvbnMgYXJlIHNsaWdodGx5IG1vcmUgc29waGlzdGljYXRlZCB0aGFuCisgICAgIHRoZSBiYXNlIGNhbGxpbmcgY29udmVudGlvbnMsIHNvIHdlIGRvIGl0IGhlcmUgaW5zdGVhZCBvZiBpbiBmZmlfcHJlcF9hcmdzKCkuICovCisgIGlmIChjaWYtPmFiaSA9PSBGRklfVkZQKQorICAgIGxheW91dF92ZnBfYXJncyAoY2lmKTsKKwogICByZXR1cm4gRkZJX09LOwogfQogCi1leHRlcm4gdm9pZCBmZmlfY2FsbF9TWVNWKHZvaWQgKCopKGNoYXIgKiwgZXh0ZW5kZWRfY2lmICopLCBleHRlbmRlZF9jaWYgKiwKLQkJCSAgdW5zaWduZWQsIHVuc2lnbmVkLCB1bnNpZ25lZCAqLCB2b2lkICgqZm4pKHZvaWQpKTsKKy8qIFBlcmZvcm0gbWFjaGluZSBkZXBlbmRlbnQgY2lmIHByb2Nlc3NpbmcgZm9yIHZhcmlhZGljIGNhbGxzICovCitmZmlfc3RhdHVzIGZmaV9wcmVwX2NpZl9tYWNoZGVwX3ZhcihmZmlfY2lmICpjaWYsCisJCQkJICAgIHVuc2lnbmVkIGludCBuZml4ZWRhcmdzLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgbnRvdGFsYXJncykKK3sKKyAgLyogVkZQIHZhcmlhZGljIGNhbGxzIGFjdHVhbGx5IHVzZSB0aGUgU1lTViBBQkkgKi8KKyAgaWYgKGNpZi0+YWJpID09IEZGSV9WRlApCisJY2lmLT5hYmkgPSBGRklfU1lTVjsKKworICByZXR1cm4gZmZpX3ByZXBfY2lmX21hY2hkZXAoY2lmKTsKK30KKworLyogUHJvdG90eXBlcyBmb3IgYXNzZW1ibHkgZnVuY3Rpb25zLCBpbiBzeXN2LlMgKi8KK2V4dGVybiB2b2lkIGZmaV9jYWxsX1NZU1YgKHZvaWQgKCpmbikodm9pZCksIGV4dGVuZGVkX2NpZiAqLCB1bnNpZ25lZCwgdW5zaWduZWQsIHVuc2lnbmVkICopOworZXh0ZXJuIHZvaWQgZmZpX2NhbGxfVkZQICh2b2lkICgqZm4pKHZvaWQpLCBleHRlbmRlZF9jaWYgKiwgdW5zaWduZWQsIHVuc2lnbmVkLCB1bnNpZ25lZCAqKTsKIAogdm9pZCBmZmlfY2FsbChmZmlfY2lmICpjaWYsIHZvaWQgKCpmbikodm9pZCksIHZvaWQgKnJ2YWx1ZSwgdm9pZCAqKmF2YWx1ZSkKIHsKQEAgLTE1Nyw2ICsyMTgsOCBAQAogCiAgIGludCBzbWFsbF9zdHJ1Y3QgPSAoY2lmLT5mbGFncyA9PSBGRklfVFlQRV9JTlQgCiAJCSAgICAgICYmIGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKTsKKyAgaW50IHZmcF9zdHJ1Y3QgPSAoY2lmLT5mbGFncyA9PSBGRklfVFlQRV9TVFJVQ1RfVkZQX0ZMT0FUCisJCSAgICB8fCBjaWYtPmZsYWdzID09IEZGSV9UWVBFX1NUUlVDVF9WRlBfRE9VQkxFKTsKIAogICBlY2lmLmNpZiA9IGNpZjsKICAgZWNpZi5hdmFsdWUgPSBhdmFsdWU7CkBAIC0xNzMsMzggKzIzNiw1MyBAQAogICAgIH0KICAgZWxzZSBpZiAoc21hbGxfc3RydWN0KQogICAgIGVjaWYucnZhbHVlID0gJnRlbXA7CisgIGVsc2UgaWYgKHZmcF9zdHJ1Y3QpCisgICAgeworICAgICAgLyogTGFyZ2VzdCBjYXNlIGlzIGRvdWJsZSB4IDQuICovCisgICAgICBlY2lmLnJ2YWx1ZSA9IGFsbG9jYSgzMik7CisgICAgfQogICBlbHNlCiAgICAgZWNpZi5ydmFsdWUgPSBydmFsdWU7CiAKICAgc3dpdGNoIChjaWYtPmFiaSkgCiAgICAgewogICAgIGNhc2UgRkZJX1NZU1Y6Ci0gICAgICBmZmlfY2FsbF9TWVNWKGZmaV9wcmVwX2FyZ3MsICZlY2lmLCBjaWYtPmJ5dGVzLCBjaWYtPmZsYWdzLCBlY2lmLnJ2YWx1ZSwKLQkJICAgIGZuKTsKLQorICAgICAgZmZpX2NhbGxfU1lTViAoZm4sICZlY2lmLCBjaWYtPmJ5dGVzLCBjaWYtPmZsYWdzLCBlY2lmLnJ2YWx1ZSk7CiAgICAgICBicmVhazsKKworICAgIGNhc2UgRkZJX1ZGUDoKKyNpZmRlZiBfX0FSTV9FQUJJX18KKyAgICAgIGZmaV9jYWxsX1ZGUCAoZm4sICZlY2lmLCBjaWYtPmJ5dGVzLCBjaWYtPmZsYWdzLCBlY2lmLnJ2YWx1ZSk7CisgICAgICBicmVhazsKKyNlbmRpZgorCiAgICAgZGVmYXVsdDoKICAgICAgIEZGSV9BU1NFUlQoMCk7CiAgICAgICBicmVhazsKICAgICB9CiAgIGlmIChzbWFsbF9zdHJ1Y3QpCiAgICAgbWVtY3B5IChydmFsdWUsICZ0ZW1wLCBjaWYtPnJ0eXBlLT5zaXplKTsKKyAgZWxzZSBpZiAodmZwX3N0cnVjdCkKKyAgICBtZW1jcHkgKHJ2YWx1ZSwgZWNpZi5ydmFsdWUsIGNpZi0+cnR5cGUtPnNpemUpOwogfQogCiAvKiogcHJpdmF0ZSBtZW1iZXJzICoqLwogCiBzdGF0aWMgdm9pZCBmZmlfcHJlcF9pbmNvbWluZ19hcmdzX1NZU1YgKGNoYXIgKnN0YWNrLCB2b2lkICoqcmV0LAotCQkJCQkgdm9pZCoqIGFyZ3MsIGZmaV9jaWYqIGNpZik7CisJCQkJCSB2b2lkKiogYXJncywgZmZpX2NpZiogY2lmLCBmbG9hdCAqdmZwX3N0YWNrKTsKIAogdm9pZCBmZmlfY2xvc3VyZV9TWVNWIChmZmlfY2xvc3VyZSAqKTsKIAordm9pZCBmZmlfY2xvc3VyZV9WRlAgKGZmaV9jbG9zdXJlICopOworCiAvKiBUaGlzIGZ1bmN0aW9uIGlzIGp1bXBlZCB0byBieSB0aGUgdHJhbXBvbGluZSAqLwogCiB1bnNpZ25lZCBpbnQKLWZmaV9jbG9zdXJlX1NZU1ZfaW5uZXIgKGNsb3N1cmUsIHJlc3BwLCBhcmdzKQorZmZpX2Nsb3N1cmVfU1lTVl9pbm5lciAoY2xvc3VyZSwgcmVzcHAsIGFyZ3MsIHZmcF9hcmdzKQogICAgICBmZmlfY2xvc3VyZSAqY2xvc3VyZTsKICAgICAgdm9pZCAqKnJlc3BwOwogICAgICB2b2lkICphcmdzOworICAgICB2b2lkICp2ZnBfYXJnczsKIHsKICAgLy8gb3VyIHZhcmlvdXMgdGhpbmdzLi4uCiAgIGZmaV9jaWYgICAgICAgKmNpZjsKQEAgLTIxOSw3ICsyOTcsNyBAQAogICAgKiBhIHN0cnVjdHVyZSwgaXQgd2lsbCByZS1zZXQgUkVTUCB0byBwb2ludCB0byB0aGUKICAgICogc3RydWN0dXJlIHJldHVybiBhZGRyZXNzLiAgKi8KIAotICBmZmlfcHJlcF9pbmNvbWluZ19hcmdzX1NZU1YoYXJncywgcmVzcHAsIGFyZ19hcmVhLCBjaWYpOworICBmZmlfcHJlcF9pbmNvbWluZ19hcmdzX1NZU1YoYXJncywgcmVzcHAsIGFyZ19hcmVhLCBjaWYsIHZmcF9hcmdzKTsKIAogICAoY2xvc3VyZS0+ZnVuKSAoY2lmLCAqcmVzcHAsIGFyZ19hcmVhLCBjbG9zdXJlLT51c2VyX2RhdGEpOwogCkBAIC0yMjksMTAgKzMwNywxMiBAQAogLypALWV4cG9ydGhlYWRlckAqLwogc3RhdGljIHZvaWQgCiBmZmlfcHJlcF9pbmNvbWluZ19hcmdzX1NZU1YoY2hhciAqc3RhY2ssIHZvaWQgKipydmFsdWUsCi0JCQkgICAgdm9pZCAqKmF2YWx1ZSwgZmZpX2NpZiAqY2lmKQorCQkJICAgIHZvaWQgKiphdmFsdWUsIGZmaV9jaWYgKmNpZiwKKwkJCSAgICAvKiBVc2VkIG9ubHkgdW5kZXIgVkZQIGhhcmQtZmxvYXQgQUJJLiAqLworCQkJICAgIGZsb2F0ICp2ZnBfc3RhY2spCiAvKkA9ZXhwb3J0aGVhZGVyQCovCiB7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaSwgdmkgPSAwOwogICByZWdpc3RlciB2b2lkICoqcF9hcmd2OwogICByZWdpc3RlciBjaGFyICphcmdwOwogICByZWdpc3RlciBmZmlfdHlwZSAqKnBfYXJnOwpAQCAtMjQ5LDEwICszMjksMjMgQEAKICAgZm9yIChpID0gY2lmLT5uYXJncywgcF9hcmcgPSBjaWYtPmFyZ190eXBlczsgKGkgIT0gMCk7IGktLSwgcF9hcmcrKykKICAgICB7CiAgICAgICBzaXplX3QgejsKKyAgICAgIHNpemVfdCBhbGlnbm1lbnQ7CisgIAorICAgICAgaWYgKGNpZi0+YWJpID09IEZGSV9WRlAKKwkgICYmIHZpIDwgY2lmLT52ZnBfbmFyZ3MgJiYgdmZwX3R5cGVfcCAoKnBfYXJnKSkKKwl7CisJICAqcF9hcmd2KysgPSAodm9pZCopKHZmcF9zdGFjayArIGNpZi0+dmZwX2FyZ3NbdmkrK10pOworCSAgY29udGludWU7CisJfQogCi0gICAgICBzaXplX3QgYWxpZ25tZW50ID0gKCpwX2FyZyktPmFsaWdubWVudDsKKyAgICAgIGFsaWdubWVudCA9ICgqcF9hcmcpLT5hbGlnbm1lbnQ7CiAgICAgICBpZiAoYWxpZ25tZW50IDwgNCkKIAlhbGlnbm1lbnQgPSA0OworI2lmZGVmIF9XSU4zMl9XQ0UKKyAgICAgIGVsc2UKKwlpZiAoYWxpZ25tZW50ID4gNCkKKwkgIGFsaWdubWVudCA9IDQ7CisjZW5kaWYKICAgICAgIC8qIEFsaWduIGlmIG5lY2Vzc2FyeSAqLwogICAgICAgaWYgKChhbGlnbm1lbnQgLSAxKSAmICh1bnNpZ25lZCkgYXJncCkgewogCWFyZ3AgPSAoY2hhciAqKSBBTElHTihhcmdwLCBhbGlnbm1lbnQpOwpAQCAtMjczLDE4ICszNjYsMjM3IEBACiAKIC8qIEhvdyB0byBtYWtlIGEgdHJhbXBvbGluZS4gICovCiAKK2V4dGVybiB1bnNpZ25lZCBpbnQgZmZpX2FybV90cmFtcG9saW5lWzNdOworCisjaWYgRkZJX0VYRUNfVFJBTVBPTElORV9UQUJMRQorCisjaW5jbHVkZSA8bWFjaC9tYWNoLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK2V4dGVybiB2b2lkICpmZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlX3BhZ2U7CisKK3R5cGVkZWYgc3RydWN0IGZmaV90cmFtcG9saW5lX3RhYmxlIGZmaV90cmFtcG9saW5lX3RhYmxlOwordHlwZWRlZiBzdHJ1Y3QgZmZpX3RyYW1wb2xpbmVfdGFibGVfZW50cnkgZmZpX3RyYW1wb2xpbmVfdGFibGVfZW50cnk7CisKK3N0cnVjdCBmZmlfdHJhbXBvbGluZV90YWJsZSB7CisgIC8qIGNvbnRpZ2lvdXMgd3JpdGFibGUgYW5kIGV4ZWN1dGFibGUgcGFnZXMgKi8KKyAgdm1fYWRkcmVzc190IGNvbmZpZ19wYWdlOworICB2bV9hZGRyZXNzX3QgdHJhbXBvbGluZV9wYWdlOworCisgIC8qIGZyZWUgbGlzdCB0cmFja2luZyAqLworICB1aW50MTZfdCBmcmVlX2NvdW50OworICBmZmlfdHJhbXBvbGluZV90YWJsZV9lbnRyeSAqZnJlZV9saXN0OworICBmZmlfdHJhbXBvbGluZV90YWJsZV9lbnRyeSAqZnJlZV9saXN0X3Bvb2w7CisKKyAgZmZpX3RyYW1wb2xpbmVfdGFibGUgKnByZXY7CisgIGZmaV90cmFtcG9saW5lX3RhYmxlICpuZXh0OworfTsKKworc3RydWN0IGZmaV90cmFtcG9saW5lX3RhYmxlX2VudHJ5IHsKKyAgdm9pZCAqKCp0cmFtcG9saW5lKSgpOworICBmZmlfdHJhbXBvbGluZV90YWJsZV9lbnRyeSAqbmV4dDsKK307CisKKy8qIE92ZXJyaWRlIHRoZSBzdGFuZGFyZCBhcmNoaXRlY3R1cmUgdHJhbXBvbGluZSBzaXplICovCisvLyBYWFggVE9ETyAtIEZpeAorI3VuZGVmIEZGSV9UUkFNUE9MSU5FX1NJWkUKKyNkZWZpbmUgRkZJX1RSQU1QT0xJTkVfU0laRSAxMgorCisvKiBUaGUgdHJhbXBvbGluZSBjb25maWd1cmF0aW9uIGlzIHBsYWNlZCBhdCA0MDgwIGJ5dGVzIHByaW9yIHRvIHRoZSB0cmFtcG9saW5lJ3MgZW50cnkgcG9pbnQgKi8KKyNkZWZpbmUgRkZJX1RSQU1QT0xJTkVfQ09ERUxPQ19DT05GSUcoY29kZWxvYykgKCh2b2lkICoqKSAoKCh1aW50OF90ICopIGNvZGVsb2MpIC0gNDA4MCkpOworCisvKiBUaGUgZmlyc3QgMTYgYnl0ZXMgb2YgdGhlIGNvbmZpZyBwYWdlIGFyZSB1bnVzZWQsIGFzIHRoZXkgYXJlIHVuYWRkcmVzc2FibGUgZnJvbSB0aGUgdHJhbXBvbGluZSBwYWdlLiAqLworI2RlZmluZSBGRklfVFJBTVBPTElORV9DT05GSUdfUEFHRV9PRkZTRVQgMTYKKworLyogVG90YWwgbnVtYmVyIG9mIHRyYW1wb2xpbmVzIHRoYXQgZml0IGluIG9uZSB0cmFtcG9saW5lIHRhYmxlICovCisjZGVmaW5lIEZGSV9UUkFNUE9MSU5FX0NPVU5UICgoUEFHRV9TSVpFIC0gRkZJX1RSQU1QT0xJTkVfQ09ORklHX1BBR0VfT0ZGU0VUKSAvIEZGSV9UUkFNUE9MSU5FX1NJWkUpCisKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgZmZpX3RyYW1wb2xpbmVfbG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CitzdGF0aWMgZmZpX3RyYW1wb2xpbmVfdGFibGUgKmZmaV90cmFtcG9saW5lX3RhYmxlcyA9IE5VTEw7CisKK3N0YXRpYyBmZmlfdHJhbXBvbGluZV90YWJsZSAqCitmZmlfdHJhbXBvbGluZV90YWJsZV9hbGxvYyAoKQoreworICBmZmlfdHJhbXBvbGluZV90YWJsZSAqdGFibGUgPSBOVUxMOworCisgIC8qIExvb3AgdW50aWwgd2UgY2FuIGFsbG9jYXRlIHR3byBjb250aWdpb3VzIHBhZ2VzICovCisgIHdoaWxlICh0YWJsZSA9PSBOVUxMKSB7CisgICAgdm1fYWRkcmVzc190IGNvbmZpZ19wYWdlID0gMHgwOworICAgIGtlcm5fcmV0dXJuX3Qga3Q7CisKKyAgICAvKiBUcnkgdG8gYWxsb2NhdGUgdHdvIHBhZ2VzICovCisgICAga3QgPSB2bV9hbGxvY2F0ZSAobWFjaF90YXNrX3NlbGYgKCksICZjb25maWdfcGFnZSwgUEFHRV9TSVpFKjIsIFZNX0ZMQUdTX0FOWVdIRVJFKTsKKyAgICBpZiAoa3QgIT0gS0VSTl9TVUNDRVNTKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgInZtX2FsbG9jYXRlKCkgZmFpbHVyZTogJWQgYXQgJXM6JWRcbiIsIGt0LCBfX0ZJTEVfXywgX19MSU5FX18pOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogTm93IGRyb3AgdGhlIHNlY29uZCBoYWxmIG9mIHRoZSBhbGxvY2F0aW9uIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHRyYW1wb2xpbmUgdGFibGUgKi8KKyAgICB2bV9hZGRyZXNzX3QgdHJhbXBvbGluZV9wYWdlID0gY29uZmlnX3BhZ2UrUEFHRV9TSVpFOworICAgIGt0ID0gdm1fZGVhbGxvY2F0ZSAobWFjaF90YXNrX3NlbGYgKCksIHRyYW1wb2xpbmVfcGFnZSwgUEFHRV9TSVpFKTsKKyAgICBpZiAoa3QgIT0gS0VSTl9TVUNDRVNTKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgInZtX2RlYWxsb2NhdGUoKSBmYWlsdXJlOiAlZCBhdCAlczolZFxuIiwga3QsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBSZW1hcCB0aGUgdHJhbXBvbGluZSB0YWJsZSB0byBkaXJlY3RseSBmb2xsb3cgdGhlIGNvbmZpZyBwYWdlICovCisgICAgdm1fcHJvdF90IGN1cl9wcm90OworICAgIHZtX3Byb3RfdCBtYXhfcHJvdDsKKworICAgIGt0ID0gdm1fcmVtYXAgKG1hY2hfdGFza19zZWxmICgpLCAmdHJhbXBvbGluZV9wYWdlLCBQQUdFX1NJWkUsIDB4MCwgRkFMU0UsIG1hY2hfdGFza19zZWxmICgpLCAodm1fYWRkcmVzc190KSAmZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZV9wYWdlLCBGQUxTRSwgJmN1cl9wcm90LCAmbWF4X3Byb3QsIFZNX0lOSEVSSVRfU0hBUkUpOworCisgICAgLyogSWYgd2UgbG9zdCBhY2Nlc3MgdG8gdGhlIGRlc3RpbmF0aW9uIHRyYW1wb2xpbmUgcGFnZSwgZHJvcCBvdXIgY29uZmlnIGFsbG9jYXRpb24gbWFwcGluZyBhbmQgcmV0cnkgKi8KKyAgICBpZiAoa3QgIT0gS0VSTl9TVUNDRVNTKSB7CisgICAgICAvKiBMb2cgdW5leHBlY3RlZCBmYWlsdXJlcyAqLworICAgICAgaWYgKGt0ICE9IEtFUk5fTk9fU1BBQ0UpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ2bV9yZW1hcCgpIGZhaWx1cmU6ICVkIGF0ICVzOiVkXG4iLCBrdCwgX19GSUxFX18sIF9fTElORV9fKTsKKyAgICAgIH0KKworICAgICAgdm1fZGVhbGxvY2F0ZSAobWFjaF90YXNrX3NlbGYgKCksIGNvbmZpZ19wYWdlLCBQQUdFX1NJWkUpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLyogV2UgaGF2ZSB2YWxpZCB0cmFtcG9saW5lIGFuZCBjb25maWcgcGFnZXMgKi8KKyAgICB0YWJsZSA9IGNhbGxvYyAoMSwgc2l6ZW9mKGZmaV90cmFtcG9saW5lX3RhYmxlKSk7CisgICAgdGFibGUtPmZyZWVfY291bnQgPSBGRklfVFJBTVBPTElORV9DT1VOVDsKKyAgICB0YWJsZS0+Y29uZmlnX3BhZ2UgPSBjb25maWdfcGFnZTsKKyAgICB0YWJsZS0+dHJhbXBvbGluZV9wYWdlID0gdHJhbXBvbGluZV9wYWdlOworCisgICAgLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBmcmVlIGxpc3QgKi8KKyAgICB0YWJsZS0+ZnJlZV9saXN0X3Bvb2wgPSBjYWxsb2MoRkZJX1RSQU1QT0xJTkVfQ09VTlQsIHNpemVvZihmZmlfdHJhbXBvbGluZV90YWJsZV9lbnRyeSkpOworCisgICAgdWludDE2X3QgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGFibGUtPmZyZWVfY291bnQ7IGkrKykgeworICAgICAgZmZpX3RyYW1wb2xpbmVfdGFibGVfZW50cnkgKmVudHJ5ID0gJnRhYmxlLT5mcmVlX2xpc3RfcG9vbFtpXTsKKyAgICAgIGVudHJ5LT50cmFtcG9saW5lID0gKHZvaWQgKikgKHRhYmxlLT50cmFtcG9saW5lX3BhZ2UgKyAoaSAqIEZGSV9UUkFNUE9MSU5FX1NJWkUpKTsKKworICAgICAgaWYgKGkgPCB0YWJsZS0+ZnJlZV9jb3VudCAtIDEpCisgICAgICAgIGVudHJ5LT5uZXh0ID0gJnRhYmxlLT5mcmVlX2xpc3RfcG9vbFtpKzFdOworICAgIH0KKworICAgIHRhYmxlLT5mcmVlX2xpc3QgPSB0YWJsZS0+ZnJlZV9saXN0X3Bvb2w7CisgIH0KKworICByZXR1cm4gdGFibGU7Cit9CisKK3ZvaWQgKgorZmZpX2Nsb3N1cmVfYWxsb2MgKHNpemVfdCBzaXplLCB2b2lkICoqY29kZSkKK3sKKyAgLyogQ3JlYXRlIHRoZSBjbG9zdXJlICovCisgIGZmaV9jbG9zdXJlICpjbG9zdXJlID0gbWFsbG9jKHNpemUpOworICBpZiAoY2xvc3VyZSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZmZpX3RyYW1wb2xpbmVfbG9jayk7CisKKyAgLyogQ2hlY2sgZm9yIGFuIGFjdGl2ZSB0cmFtcG9saW5lIHRhYmxlIHdpdGggYXZhaWxhYmxlIGVudHJpZXMuICovCisgIGZmaV90cmFtcG9saW5lX3RhYmxlICp0YWJsZSA9IGZmaV90cmFtcG9saW5lX3RhYmxlczsKKyAgaWYgKHRhYmxlID09IE5VTEwgfHwgdGFibGUtPmZyZWVfbGlzdCA9PSBOVUxMKSB7CisgICAgdGFibGUgPSBmZmlfdHJhbXBvbGluZV90YWJsZV9hbGxvYyAoKTsKKyAgICBpZiAodGFibGUgPT0gTlVMTCkgeworICAgICAgZnJlZShjbG9zdXJlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIEluc2VydCB0aGUgbmV3IHRhYmxlIGF0IHRoZSB0b3Agb2YgdGhlIGxpc3QgKi8KKyAgICB0YWJsZS0+bmV4dCA9IGZmaV90cmFtcG9saW5lX3RhYmxlczsKKyAgICBpZiAodGFibGUtPm5leHQgIT0gTlVMTCkKKyAgICAgICAgdGFibGUtPm5leHQtPnByZXYgPSB0YWJsZTsKKworICAgIGZmaV90cmFtcG9saW5lX3RhYmxlcyA9IHRhYmxlOworICB9CisKKyAgLyogQ2xhaW0gdGhlIGZyZWUgZW50cnkgKi8KKyAgZmZpX3RyYW1wb2xpbmVfdGFibGVfZW50cnkgKmVudHJ5ID0gZmZpX3RyYW1wb2xpbmVfdGFibGVzLT5mcmVlX2xpc3Q7CisgIGZmaV90cmFtcG9saW5lX3RhYmxlcy0+ZnJlZV9saXN0ID0gZW50cnktPm5leHQ7CisgIGZmaV90cmFtcG9saW5lX3RhYmxlcy0+ZnJlZV9jb3VudC0tOworICBlbnRyeS0+bmV4dCA9IE5VTEw7CisKKyAgcHRocmVhZF9tdXRleF91bmxvY2soJmZmaV90cmFtcG9saW5lX2xvY2spOworCisgIC8qIEluaXRpYWxpemUgdGhlIHJldHVybiB2YWx1ZXMgKi8KKyAgKmNvZGUgPSBlbnRyeS0+dHJhbXBvbGluZTsKKyAgY2xvc3VyZS0+dHJhbXBvbGluZV90YWJsZSA9IHRhYmxlOworICBjbG9zdXJlLT50cmFtcG9saW5lX3RhYmxlX2VudHJ5ID0gZW50cnk7CisKKyAgcmV0dXJuIGNsb3N1cmU7Cit9CisKK3ZvaWQKK2ZmaV9jbG9zdXJlX2ZyZWUgKHZvaWQgKnB0cikKK3sKKyAgZmZpX2Nsb3N1cmUgKmNsb3N1cmUgPSBwdHI7CisKKyAgcHRocmVhZF9tdXRleF9sb2NrKCZmZmlfdHJhbXBvbGluZV9sb2NrKTsKKworICAvKiBGZXRjaCB0aGUgdGFibGUgYW5kIGVudHJ5IHJlZmVyZW5jZXMgKi8KKyAgZmZpX3RyYW1wb2xpbmVfdGFibGUgKnRhYmxlID0gY2xvc3VyZS0+dHJhbXBvbGluZV90YWJsZTsKKyAgZmZpX3RyYW1wb2xpbmVfdGFibGVfZW50cnkgKmVudHJ5ID0gY2xvc3VyZS0+dHJhbXBvbGluZV90YWJsZV9lbnRyeTsKKworICAvKiBSZXR1cm4gdGhlIGVudHJ5IHRvIHRoZSBmcmVlIGxpc3QgKi8KKyAgZW50cnktPm5leHQgPSB0YWJsZS0+ZnJlZV9saXN0OworICB0YWJsZS0+ZnJlZV9saXN0ID0gZW50cnk7CisgIHRhYmxlLT5mcmVlX2NvdW50Kys7CisKKyAgLyogSWYgYWxsIHRyYW1wb2xpbmVzIHdpdGhpbiB0aGlzIHRhYmxlIGFyZSBmcmVlLCBhbmQgYXQgbGVhc3Qgb25lIG90aGVyIHRhYmxlIGV4aXN0cywgZGVhbGxvY2F0ZQorICAgKiB0aGUgdGFibGUgKi8KKyAgaWYgKHRhYmxlLT5mcmVlX2NvdW50ID09IEZGSV9UUkFNUE9MSU5FX0NPVU5UICYmIGZmaV90cmFtcG9saW5lX3RhYmxlcyAhPSB0YWJsZSkgeworICAgIC8qIFJlbW92ZSBmcm9tIHRoZSBsaXN0ICovCisgICAgaWYgKHRhYmxlLT5wcmV2ICE9IE5VTEwpCisgICAgICB0YWJsZS0+cHJldi0+bmV4dCA9IHRhYmxlLT5uZXh0OworCisgICAgaWYgKHRhYmxlLT5uZXh0ICE9IE5VTEwpCisgICAgICB0YWJsZS0+bmV4dC0+cHJldiA9IHRhYmxlLT5wcmV2OworCisgICAgLyogRGVhbGxvY2F0ZSBwYWdlcyAqLworICAgIGtlcm5fcmV0dXJuX3Qga3Q7CisgICAga3QgPSB2bV9kZWFsbG9jYXRlIChtYWNoX3Rhc2tfc2VsZiAoKSwgdGFibGUtPmNvbmZpZ19wYWdlLCBQQUdFX1NJWkUpOworICAgIGlmIChrdCAhPSBLRVJOX1NVQ0NFU1MpCisgICAgICBmcHJpbnRmKHN0ZGVyciwgInZtX2RlYWxsb2NhdGUoKSBmYWlsdXJlOiAlZCBhdCAlczolZFxuIiwga3QsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisKKyAgICBrdCA9IHZtX2RlYWxsb2NhdGUgKG1hY2hfdGFza19zZWxmICgpLCB0YWJsZS0+dHJhbXBvbGluZV9wYWdlLCBQQUdFX1NJWkUpOworICAgIGlmIChrdCAhPSBLRVJOX1NVQ0NFU1MpCisgICAgICBmcHJpbnRmKHN0ZGVyciwgInZtX2RlYWxsb2NhdGUoKSBmYWlsdXJlOiAlZCBhdCAlczolZFxuIiwga3QsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisKKyAgICAvKiBEZWFsbG9jYXRlIGZyZWUgbGlzdCAqLworICAgIGZyZWUgKHRhYmxlLT5mcmVlX2xpc3RfcG9vbCk7CisgICAgZnJlZSAodGFibGUpOworICB9IGVsc2UgaWYgKGZmaV90cmFtcG9saW5lX3RhYmxlcyAhPSB0YWJsZSkgeworICAgIC8qIE90aGVyd2lzZSwgYnVtcCB0aGlzIHRhYmxlIHRvIHRoZSB0b3Agb2YgdGhlIGxpc3QgKi8KKyAgICB0YWJsZS0+cHJldiA9IE5VTEw7CisgICAgdGFibGUtPm5leHQgPSBmZmlfdHJhbXBvbGluZV90YWJsZXM7CisgICAgaWYgKGZmaV90cmFtcG9saW5lX3RhYmxlcyAhPSBOVUxMKQorICAgICAgZmZpX3RyYW1wb2xpbmVfdGFibGVzLT5wcmV2ID0gdGFibGU7CisKKyAgICBmZmlfdHJhbXBvbGluZV90YWJsZXMgPSB0YWJsZTsKKyAgfQorCisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgmZmZpX3RyYW1wb2xpbmVfbG9jayk7CisKKyAgLyogRnJlZSB0aGUgY2xvc3VyZSAqLworICBmcmVlIChjbG9zdXJlKTsKK30KKworI2Vsc2UKKwogI2RlZmluZSBGRklfSU5JVF9UUkFNUE9MSU5FKFRSQU1QLEZVTixDVFgpCQkJCVwKICh7IHVuc2lnbmVkIGNoYXIgKl9fdHJhbXAgPSAodW5zaWduZWQgY2hhciopKFRSQU1QKTsJCQlcCiAgICB1bnNpZ25lZCBpbnQgIF9fZnVuID0gKHVuc2lnbmVkIGludCkoRlVOKTsJCQkJXAogICAgdW5zaWduZWQgaW50ICBfX2N0eCA9ICh1bnNpZ25lZCBpbnQpKENUWCk7CQkJCVwKLSAgICoodW5zaWduZWQgaW50KikgJl9fdHJhbXBbMF0gPSAweGU5MmQwMDBmOyAvKiBzdG1mZCBzcCEsIHtyMC1yM30gKi8JXAotICAgKih1bnNpZ25lZCBpbnQqKSAmX190cmFtcFs0XSA9IDB4ZTU5ZjAwMDA7IC8qIGxkciByMCwgW3BjXSAqLwlcCi0gICAqKHVuc2lnbmVkIGludCopICZfX3RyYW1wWzhdID0gMHhlNTlmZjAwMDsgLyogbGRyIHBjLCBbcGNdICovCVwKKyAgIHVuc2lnbmVkIGNoYXIgKmluc25zID0gKHVuc2lnbmVkIGNoYXIgKikoQ1RYKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIG1lbWNweSAoX190cmFtcCwgZmZpX2FybV90cmFtcG9saW5lLCBzaXplb2YgZmZpX2FybV90cmFtcG9saW5lKTsgICAgIFwKICAgICoodW5zaWduZWQgaW50KikgJl9fdHJhbXBbMTJdID0gX19jdHg7CQkJCVwKICAgICoodW5zaWduZWQgaW50KikgJl9fdHJhbXBbMTZdID0gX19mdW47CQkJCVwKLSAgIF9fY2xlYXJfY2FjaGUoKCZfX3RyYW1wWzBdKSwgKCZfX3RyYW1wWzE5XSkpOwkJCVwKKyAgIF9fY2xlYXJfY2FjaGUoKCZfX3RyYW1wWzBdKSwgKCZfX3RyYW1wWzE5XSkpOyAvKiBDbGVhciBkYXRhIG1hcHBpbmcuICAqLyBcCisgICBfX2NsZWFyX2NhY2hlKGluc25zLCBpbnNucyArIDMgKiBzaXplb2YgKHVuc2lnbmVkIGludCkpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgaW5zdHJ1Y3Rpb24gICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZy4gICovICAgICAgICBcCiAgfSkKIAorI2VuZGlmCiAKIC8qIHRoZSBjaWYgbXVzdCBhbHJlYWR5IGJlIHByZXAnZWQgKi8KIApAQCAtMjk1LDE1ICs2MDcsMTUwIEBACiAJCSAgICAgIHZvaWQgKnVzZXJfZGF0YSwKIAkJICAgICAgdm9pZCAqY29kZWxvYykKIHsKLSAgRkZJX0FTU0VSVCAoY2lmLT5hYmkgPT0gRkZJX1NZU1YpOworICB2b2lkICgqY2xvc3VyZV9mdW5jKShmZmlfY2xvc3VyZSopID0gTlVMTDsKIAotICBGRklfSU5JVF9UUkFNUE9MSU5FICgmY2xvc3VyZS0+dHJhbXBbMF0sIFwKLQkJICAgICAgICZmZmlfY2xvc3VyZV9TWVNWLCAgXAotCQkgICAgICAgY29kZWxvYyk7CisgIGlmIChjaWYtPmFiaSA9PSBGRklfU1lTVikKKyAgICBjbG9zdXJlX2Z1bmMgPSAmZmZpX2Nsb3N1cmVfU1lTVjsKKyNpZmRlZiBfX0FSTV9FQUJJX18KKyAgZWxzZSBpZiAoY2lmLT5hYmkgPT0gRkZJX1ZGUCkKKyAgICBjbG9zdXJlX2Z1bmMgPSAmZmZpX2Nsb3N1cmVfVkZQOworI2VuZGlmCisgIGVsc2UKKyAgICByZXR1cm4gRkZJX0JBRF9BQkk7CiAgICAgCisjaWYgRkZJX0VYRUNfVFJBTVBPTElORV9UQUJMRQorICB2b2lkICoqY29uZmlnID0gRkZJX1RSQU1QT0xJTkVfQ09ERUxPQ19DT05GSUcoY29kZWxvYyk7CisgIGNvbmZpZ1swXSA9IGNsb3N1cmU7CisgIGNvbmZpZ1sxXSA9IGNsb3N1cmVfZnVuYzsKKyNlbHNlCisgIEZGSV9JTklUX1RSQU1QT0xJTkUgKCZjbG9zdXJlLT50cmFtcFswXSwgXAorCQkgICAgICAgY2xvc3VyZV9mdW5jLCAgXAorCQkgICAgICAgY29kZWxvYyk7CisjZW5kaWYKKwogICBjbG9zdXJlLT5jaWYgID0gY2lmOwogICBjbG9zdXJlLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CiAgIGNsb3N1cmUtPmZ1biAgPSBmdW47CiAKICAgcmV0dXJuIEZGSV9PSzsKIH0KKworLyogQmVsb3cgYXJlIHJvdXRpbmVzIGZvciBWRlAgaGFyZC1mbG9hdCBzdXBwb3J0LiAqLworCitzdGF0aWMgaW50IHJlY192ZnBfdHlwZV9wIChmZmlfdHlwZSAqdCwgaW50ICplbHQsIGludCAqZWxudW0pCit7CisgIHN3aXRjaCAodC0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBGRklfVFlQRV9GTE9BVDoKKyAgICBjYXNlIEZGSV9UWVBFX0RPVUJMRToKKyAgICAgICplbHQgPSAoaW50KSB0LT50eXBlOworICAgICAgKmVsbnVtID0gMTsKKyAgICAgIHJldHVybiAxOworCisgICAgY2FzZSBGRklfVFlQRV9TVFJVQ1RfVkZQX0ZMT0FUOgorICAgICAgKmVsdCA9IEZGSV9UWVBFX0ZMT0FUOworICAgICAgKmVsbnVtID0gdC0+c2l6ZSAvIHNpemVvZiAoZmxvYXQpOworICAgICAgcmV0dXJuIDE7CisKKyAgICBjYXNlIEZGSV9UWVBFX1NUUlVDVF9WRlBfRE9VQkxFOgorICAgICAgKmVsdCA9IEZGSV9UWVBFX0RPVUJMRTsKKyAgICAgICplbG51bSA9IHQtPnNpemUgLyBzaXplb2YgKGRvdWJsZSk7CisgICAgICByZXR1cm4gMTsKKworICAgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOjsKKyAgICAgIHsKKwlpbnQgYmFzZV9lbHQgPSAwLCB0b3RhbF9lbG51bSA9IDA7CisJZmZpX3R5cGUgKiplbCA9IHQtPmVsZW1lbnRzOworCXdoaWxlICgqZWwpCisJICB7CisJICAgIGludCBlbF9lbHQgPSAwLCBlbF9lbG51bSA9IDA7CisJICAgIGlmICghIHJlY192ZnBfdHlwZV9wICgqZWwsICZlbF9lbHQsICZlbF9lbG51bSkKKwkJfHwgKGJhc2VfZWx0ICYmIGJhc2VfZWx0ICE9IGVsX2VsdCkKKwkJfHwgdG90YWxfZWxudW0gKyBlbF9lbG51bSA+IDQpCisJICAgICAgcmV0dXJuIDA7CisJICAgIGJhc2VfZWx0ID0gZWxfZWx0OworCSAgICB0b3RhbF9lbG51bSArPSBlbF9lbG51bTsKKwkgICAgZWwrKzsKKwkgIH0KKwkqZWxudW0gPSB0b3RhbF9lbG51bTsKKwkqZWx0ID0gYmFzZV9lbHQ7CisJcmV0dXJuIDE7CisgICAgICB9CisgICAgZGVmYXVsdDogOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmZwX3R5cGVfcCAoZmZpX3R5cGUgKnQpCit7CisgIGludCBlbHQsIGVsbnVtOworICBpZiAocmVjX3ZmcF90eXBlX3AgKHQsICZlbHQsICZlbG51bSkpCisgICAgeworICAgICAgaWYgKHQtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKQorCXsKKwkgIGlmIChlbG51bSA9PSAxKQorCSAgICB0LT50eXBlID0gZWx0OworCSAgZWxzZQorCSAgICB0LT50eXBlID0gKGVsdCA9PSBGRklfVFlQRV9GTE9BVAorCQkgICAgICAgPyBGRklfVFlQRV9TVFJVQ1RfVkZQX0ZMT0FUCisJCSAgICAgICA6IEZGSV9UWVBFX1NUUlVDVF9WRlBfRE9VQkxFKTsKKwl9CisgICAgICByZXR1cm4gKGludCkgdC0+dHlwZTsKKyAgICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwbGFjZV92ZnBfYXJnIChmZmlfY2lmICpjaWYsIGZmaV90eXBlICp0KQoreworICBpbnQgcmVnID0gY2lmLT52ZnBfcmVnX2ZyZWU7CisgIGludCBucmVncyA9IHQtPnNpemUgLyBzaXplb2YgKGZsb2F0KTsKKyAgaW50IGFsaWduID0gKCh0LT50eXBlID09IEZGSV9UWVBFX1NUUlVDVF9WRlBfRkxPQVQKKwkJfHwgdC0+dHlwZSA9PSBGRklfVFlQRV9GTE9BVCkgPyAxIDogMik7CisgIC8qIEFsaWduIHJlZ2lzdGVyIG51bWJlci4gKi8KKyAgaWYgKChyZWcgJiAxKSAmJiBhbGlnbiA9PSAyKQorICAgIHJlZysrOworICB3aGlsZSAocmVnICsgbnJlZ3MgPD0gMTYpCisgICAgeworICAgICAgaW50IHMsIG5ld191c2VkID0gMDsKKyAgICAgIGZvciAocyA9IHJlZzsgcyA8IHJlZyArIG5yZWdzOyBzKyspCisJeworCSAgbmV3X3VzZWQgfD0gKDEgPDwgcyk7CisJICBpZiAoY2lmLT52ZnBfdXNlZCAmICgxIDw8IHMpKQorCSAgICB7CisJICAgICAgcmVnICs9IGFsaWduOworCSAgICAgIGdvdG8gbmV4dF9yZWc7CisJICAgIH0KKwl9CisgICAgICAvKiBGb3VuZCByZWdzIHRvIGFsbG9jYXRlLiAqLworICAgICAgY2lmLT52ZnBfdXNlZCB8PSBuZXdfdXNlZDsKKyAgICAgIGNpZi0+dmZwX2FyZ3NbY2lmLT52ZnBfbmFyZ3MrK10gPSByZWc7CisKKyAgICAgIC8qIFVwZGF0ZSB2ZnBfcmVnX2ZyZWUuICovCisgICAgICBpZiAoY2lmLT52ZnBfdXNlZCAmICgxIDw8IGNpZi0+dmZwX3JlZ19mcmVlKSkKKwl7CisJICByZWcgKz0gbnJlZ3M7CisJICB3aGlsZSAoY2lmLT52ZnBfdXNlZCAmICgxIDw8IHJlZykpCisJICAgIHJlZyArPSAxOworCSAgY2lmLT52ZnBfcmVnX2ZyZWUgPSByZWc7CisJfQorICAgICAgcmV0dXJuOworICAgIG5leHRfcmVnOiA7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBsYXlvdXRfdmZwX2FyZ3MgKGZmaV9jaWYgKmNpZikKK3sKKyAgaW50IGk7CisgIC8qIEluaXQgVkZQIGZpZWxkcyAqLworICBjaWYtPnZmcF91c2VkID0gMDsKKyAgY2lmLT52ZnBfbmFyZ3MgPSAwOworICBjaWYtPnZmcF9yZWdfZnJlZSA9IDA7CisgIG1lbXNldCAoY2lmLT52ZnBfYXJncywgLTEsIDE2KTsgLyogSW5pdCB0byAtMS4gKi8KKworICBmb3IgKGkgPSAwOyBpIDwgY2lmLT5uYXJnczsgaSsrKQorICAgIHsKKyAgICAgIGZmaV90eXBlICp0ID0gY2lmLT5hcmdfdHlwZXNbaV07CisgICAgICBpZiAodmZwX3R5cGVfcCAodCkpCisJcGxhY2VfdmZwX2FyZyAoY2lmLCB0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9hcm0vZmZpdGFyZ2V0LmggYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9hcm0vZmZpdGFyZ2V0LmgKaW5kZXggYTk1NzQyNi4uMjZkNDk0ZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvYXJtL2ZmaXRhcmdldC5oCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2FybS9mZml0YXJnZXQuaApAQCAtMSw1ICsxLDggQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi1DLSotCi0gICBmZml0YXJnZXQuaCAtIENvcHlyaWdodCAoYykgMTk5Ni0yMDAzICBSZWQgSGF0LCBJbmMuCisgICBmZml0YXJnZXQuaCAtIENvcHlyaWdodCAoYykgMjAxMiAgQW50aG9ueSBHcmVlbgorICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMTAgIENvZGVTb3VyY2VyeQorICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMyAgUmVkIEhhdCwgSW5jLgorCiAgICBUYXJnZXQgY29uZmlndXJhdGlvbiBtYWNyb3MgZm9yIEFSTS4KIAogICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCkBAIC0yNyw2ICszMCwxMCBAQAogI2lmbmRlZiBMSUJGRklfVEFSR0VUX0gKICNkZWZpbmUgTElCRkZJX1RBUkdFVF9ICiAKKyNpZm5kZWYgTElCRkZJX0gKKyNlcnJvciAiUGxlYXNlIGRvIG5vdCBpbmNsdWRlIGZmaXRhcmdldC5oIGRpcmVjdGx5IGludG8geW91ciBzb3VyY2UuICBVc2UgZmZpLmggaW5zdGVhZC4iCisjZW5kaWYKKwogI2lmbmRlZiBMSUJGRklfQVNNCiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICAgICAgZmZpX2FyZzsKIHR5cGVkZWYgc2lnbmVkIGxvbmcgICAgICAgICAgICBmZmlfc2FyZzsKQEAgLTM0LDExICs0MSwyNyBAQAogdHlwZWRlZiBlbnVtIGZmaV9hYmkgewogICBGRklfRklSU1RfQUJJID0gMCwKICAgRkZJX1NZU1YsCisgIEZGSV9WRlAsCisgIEZGSV9MQVNUX0FCSSwKKyNpZmRlZiBfX0FSTV9QQ1NfVkZQCisgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9WRlAsCisjZWxzZQogICBGRklfREVGQVVMVF9BQkkgPSBGRklfU1lTViwKLSAgRkZJX0xBU1RfQUJJID0gRkZJX0RFRkFVTFRfQUJJICsgMQorI2VuZGlmCiB9IGZmaV9hYmk7CiAjZW5kaWYKIAorI2RlZmluZSBGRklfRVhUUkFfQ0lGX0ZJRUxEUwkJCVwKKyAgaW50IHZmcF91c2VkOwkJCQkJXAorICBzaG9ydCB2ZnBfcmVnX2ZyZWUsIHZmcF9uYXJnczsJCVwKKyAgc2lnbmVkIGNoYXIgdmZwX2FyZ3NbMTZdCQkJXAorCisvKiBJbnRlcm5hbGx5IHVzZWQuICovCisjZGVmaW5lIEZGSV9UWVBFX1NUUlVDVF9WRlBfRkxPQVQgIChGRklfVFlQRV9MQVNUICsgMSkKKyNkZWZpbmUgRkZJX1RZUEVfU1RSVUNUX1ZGUF9ET1VCTEUgKEZGSV9UWVBFX0xBU1QgKyAyKQorCisjZGVmaW5lIEZGSV9UQVJHRVRfU1BFQ0lGSUNfVkFSSUFESUMKKwogLyogLS0tLSBEZWZpbml0aW9ucyBmb3IgY2xvc3VyZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogI2RlZmluZSBGRklfQ0xPU1VSRVMgMQpAQCAtNDYsNCArNjksMyBAQAogI2RlZmluZSBGRklfTkFUSVZFX1JBV19BUEkgMAogCiAjZW5kaWYKLQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvYXJtL2dlbnRyYW1wLnNoIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvYXJtL2dlbnRyYW1wLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc0ZjBiODYKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9hcm0vZ2VudHJhbXAuc2gKQEAgLTAsMCArMSwxMTggQEAKKyMhL2Jpbi9zaAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICBnZW50cmFtcC5zaCAtIENvcHlyaWdodCAoYykgMjAxMCwgUGxhdXNpYmxlIExhYnMgQ29vcGVyYXRpdmUsIEluYy4KKyMgIAorIyAgQVJNIFRyYW1wb2xpbmUgUGFnZSBHZW5lcmF0b3IKKyMKKyMgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworIyAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisjICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyMgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyMgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworIyAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisjICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorIyAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisjCisjICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorIyAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisjICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorIyAgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisjICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyMgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorIyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorIyAgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorIyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUFJPR05BTUU9JDAKKworIyBFYWNoIHRyYW1wb2xpbmUgaXMgZXhhY3RseSAzIGluc3RydWN0aW9ucywgb3IgMTIgYnl0ZXMuIElmIGFueSBvZiB0aGVzZSB2YWx1ZXMgY2hhbmdlLAorIyB0aGUgZW50aXJlIGFybSB0cmFtcG9saW5lIGltcGxlbWVudGF0aW9uIG11c3QgYmUgdXBkYXRlZCB0byBtYXRjaCwgdG9vLgorCisjIFNpemUgb2YgYW4gaW5kaXZpZHVhbCB0cmFtcG9saW5lLCBpbiBieXRlcworVFJBTVBPTElORV9TSVpFPTEyCisKKyMgUGFnZSBzaXplLCBpbiBieXRlcworUEFHRV9TSVpFPTQwOTYKKworIyBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSByZWFjaGFibGUgY29uZmlnIHBhZ2U7IFRoZSBmaXJzdCAxNiBieXRlcyBvZiB0aGUgY29uZmlnIHBhZ2UKKyMgYXJlIHVucmVhY2hhYmxlIGR1ZSB0byBvdXIgbWF4aW11bSBwYy1yZWxhdGl2ZSBsZHIgb2Zmc2V0LgorUEFHRV9BVkFJTD1gZXhwciAkUEFHRV9TSVpFIC0gMTZgCisKKyMgQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIG9mIGF2YWlsYWJsZSB0cmFtcG9saW5lcy4gCitUUkFNUE9MSU5FX0NPVU5UPWBleHByICRQQUdFX0FWQUlMIC8gJFRSQU1QT0xJTkVfU0laRWAKKworaGVhZGVyICgpIHsKKyAgICBlY2hvICIjIEdFTkVSQVRFRCBDT0RFIC0gRE8gTk9UIEVESVQiCisgICAgZWNobyAiIyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSAkUFJPR05BTUUiCisgICAgZWNobyAiIgorCisgICAgIyBXcml0ZSBvdXQgdGhlIGxpY2Vuc2UgaGVhZGVyCitjYXQgPDwgRU9GCisjICBDb3B5cmlnaHQgKGMpIDIwMTAsIFBsYXVzaWJsZSBMYWJzIENvb3BlcmF0aXZlLCBJbmMuCisjICAKKyMgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworIyAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisjICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyMgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyMgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworIyAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisjICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorIyAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisjCisjICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorIyAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisjICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorIyAgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisjICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyMgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorIyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorIyAgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorIyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRU9GCisKKyAgICAjIFdyaXRlIG91dCB0aGUgdHJhbXBvbGluZSB0YWJsZSwgYWxpZ25lZCB0byB0aGUgcGFnZSBib3VuZGFyeQorICAgIGVjaG8gIi50ZXh0IgorICAgIGVjaG8gIi5hbGlnbiAxMiIKKyAgICBlY2hvICIuZ2xvYmwgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGVfcGFnZSIKKyAgICBlY2hvICJfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZV9wYWdlOiIKK30KKworCisjIFdBUk5JTkcgLSBEb24ndCBtb2RpZnkgdGhlIHRyYW1wb2xpbmUgY29kZSBzaXplIHdpdGhvdXQgYWxzbyB1cGRhdGluZyB0aGUgcmVsZXZlbnQgbGliZmZpIGNvZGUKK3RyYW1wb2xpbmUgKCkgeworICAgIGNhdCA8PCBFTkQKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCitFTkQKK30KKworbWFpbiAoKSB7CisgICAgIyBXcml0ZSBvdXQgdGhlIGhlYWRlcgorICAgIGhlYWRlcgorCisgICAgIyBXcml0ZSBvdXQgdGhlIHRyYW1wb2xpbmVzCisgICAgbG9jYWwgaT0wCisgICAgd2hpbGUgWyAkaSAtbHQgJHtUUkFNUE9MSU5FX0NPVU5UfSBdOyBkbworICAgICAgICB0cmFtcG9saW5lCisgICAgICAgIGxvY2FsIGk9YGV4cHIgJGkgKyAxYAorICAgIGRvbmUKK30KKworbWFpbgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvYXJtL3N5c3YuUyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2FybS9zeXN2LlMKaW5kZXggOTA2NDMxOC4uZmIzOGNkNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvYXJtL3N5c3YuUworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9hcm0vc3lzdi5TCkBAIC0xLDUgKzEsNiBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIHN5c3YuUyAtIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBSZWQgSGF0LCBJbmMuCisgICBzeXN2LlMgLSBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDgsIDIwMTEgUmVkIEhhdCwgSW5jLgorCSAgICBDb3B5cmlnaHQgKGMpIDIwMTEgUGxhdXNpYmxlIExhYnMgQ29vcGVyYXRpdmUsIEluYy4KICAgIAogICAgQVJNIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlIAogCkBAIC0zOSw3ICs0MCwxMSBAQAogI2Vsc2UKICNkZWZpbmUgQ05BTUUoeCkgeAogI2VuZGlmCisjaWZkZWYgX19BUFBMRV9fCisjZGVmaW5lIEVOVFJZKHgpIC5nbG9ibCBfIyN4OyBfIyN4OgorI2Vsc2UKICNkZWZpbmUgRU5UUlkoeCkgLmdsb2JsIENOQU1FKHgpOyAudHlwZSBDTkFNRSh4KSwlZnVuY3Rpb247IENOQU1FKHgpOgorI2VuZGlmIC8qIF9fQVBQTEVfXyAqLwogI2VuZGlmCiAKICNpZmRlZiBfX0VMRl9fCkBAIC00OCw2ICs1MywxMiBAQAogI2RlZmluZSBMU1lNKHgpIHgKICNlbmRpZgogCisvKiBVc2UgdGhlIFNPRlRGUCByZXR1cm4gdmFsdWUgQUJJIG9uIE1hYyBPUyBYLCBhcyBwZXIgdGhlIGlPUyBBQkkKKyAgRnVuY3Rpb24gQ2FsbCBHdWlkZSAqLworI2lmZGVmIF9fQVBQTEVfXworI2RlZmluZSBfX1NPRlRGUF9fCisjZW5kaWYKKwogLyogV2UgbmVlZCBhIGJldHRlciB3YXkgb2YgdGVzdGluZyBmb3IgdGhpcywgYnV0IGZvciBub3csIHRoaXMgaXMgYWxsIAogICAgd2UgY2FuIGRvLiAgKi8KIEAgVGhpcyBzZWxlY3RzIHRoZSBtaW5pbXVtIGFyY2hpdGVjdHVyZSBsZXZlbCByZXF1aXJlZC4KQEAgLTEwNSwyMSArMTE2LDMzIEBACiAJLmFsaWduIDAKIAkudGh1bWIKIAkudGh1bWJfZnVuYworI2lmZGVmIF9fQVBQTEVfXworCUVOVFJZKCQwKQorI2Vsc2UKIAlFTlRSWShcbmFtZSkKKyNlbmRpZgogCWJ4CXBjCiAJbm9wCiAJLmFybQogCVVOV0lORCAuZm5zdGFydAogLyogQSBob29rIHRvIHRlbGwgZ2RiIHRoYXQgd2UndmUgc3dpdGNoZWQgdG8gQVJNIG1vZGUuICBBbHNvIHVzZWQgdG8gY2FsbAogICAgZGlyZWN0bHkgZnJvbSBvdGhlciBsb2NhbCBhcm0gcm91dGluZXMuICAqLwotX0xfX1xuYW1lOgkJCisjaWZkZWYgX19BUFBMRV9fCitfTF9fJDA6CisjZWxzZQorX0xfX1xuYW1lOgorI2VuZGlmCiAuZW5kbQogI2Vsc2UKIC5tYWNybwlBUk1fRlVOQ19TVEFSVCBuYW1lCiAJLnRleHQKIAkuYWxpZ24gMAogCS5hcm0KKyNpZmRlZiBfX0FQUExFX18KKwlFTlRSWSgkMCkKKyNlbHNlCiAJRU5UUlkoXG5hbWUpCisjZW5kaWYKIAlVTldJTkQgLmZuc3RhcnQKIC5lbmRtCiAjZW5kaWYKQEAgLTE0MSwxMyArMTY0LDExIEBACiAjZW5kaWYKIC5lbmRtCiAKLQogCUAgcjA6ICAgZmZpX3ByZXBfYXJncwogCUAgcjE6ICAgJmVjaWYKIAlAIHIyOiAgIGNpZi0+Ynl0ZXMKIAlAIHIzOiAgIGZpZy0+ZmxhZ3MKIAlAIHNwKzA6IGVjaWYucnZhbHVlCi0JQCBzcCs0OiBmbgogCiAJQCBUaGlzIGFzc3VtZXMgd2UgYXJlIHVzaW5nIGdhcy4KIEFSTV9GVU5DX1NUQVJUIGZmaV9jYWxsX1NZU1YKQEAgLTE2MiwyNCArMTgzLDIzIEBACiAJc3ViCXNwLCBmcCwgcjIKIAogCUAgUGxhY2UgYWxsIG9mIHRoZSBmZmlfcHJlcF9hcmdzIGluIHBvc2l0aW9uCi0JbW92CWlwLCByMAogCW1vdglyMCwgc3AKIAlAICAgICByMSBhbHJlYWR5IHNldAogCiAJQCBDYWxsIGZmaV9wcmVwX2FyZ3Moc3RhY2ssICZlY2lmKQotCWNhbGxfcmVnKGlwKQorCWJsCUNOQU1FKGZmaV9wcmVwX2FyZ3MpCiAKIAlAIG1vdmUgZmlyc3QgNCBwYXJhbWV0ZXJzIGluIHJlZ2lzdGVycwogCWxkbWlhCXNwLCB7cjAtcjN9CiAKIAlAIGFuZCBhZGp1c3Qgc3RhY2sKLQlsZHIJaXAsIFtmcCwgIzhdCi0gICAgICAgIGNtcAlpcCwgIzE2Ci0JbW92aHMJaXAsICMxNgotICAgICAgICBhZGQJc3AsIHNwLCBpcAorCXN1YglsciwgZnAsIHNwCUAgY2lmLT5ieXRlcyA9PSBmcCAtIHNwCisJbGRyCWlwLCBbZnBdCUAgbG9hZCBmbigpIGluIGFkdmFuY2UKKwljbXAJbHIsICMxNgorCW1vdmhzCWxyLCAjMTYKKwlhZGQJc3AsIHNwLCBscgogCiAJQCBjYWxsIChmbikgKC4uLikKLQlsZHIJaXAsIFtmcCwgIzI4XQogCWNhbGxfcmVnKGlwKQogCQogCUAgUmVtb3ZlIHRoZSBzcGFjZSB3ZSBwdXNoZWQgZm9yIHRoZSBhcmdzCkBAIC0yMjQsMTEgKzI0NCwxOSBAQAogI2VuZGlmCiAKIExTWU0oTGVwaWxvZ3VlKToKLQlSRVRMRE0JInIwLXIzLGZwIgorI2lmIGRlZmluZWQgKF9fSU5URVJXT1JLSU5HX18pCisJbGRtaWEgICBzcCEsIHtyMC1yMyxmcCwgbHJ9CisJYngJbHIKKyNlbHNlCisJbGRtaWEgICBzcCEsIHtyMC1yMyxmcCwgcGN9CisjZW5kaWYKIAogLmZmaV9jYWxsX1NZU1ZfZW5kOgogCVVOV0lORCAuZm5lbmQKKyNpZmRlZiBfX0VMRl9fCiAgICAgICAgIC5zaXplICAgIENOQU1FKGZmaV9jYWxsX1NZU1YpLC5mZmlfY2FsbF9TWVNWX2VuZC1DTkFNRShmZmlfY2FsbF9TWVNWKQorI2VuZGlmCisKIAogLyoKIAl1bnNpZ25lZCBpbnQgRkZJX0hJRERFTgpAQCAtMjQ0LDExICsyNzIsMTEgQEAKIAlzdG1mZAlzcCEsIHtpcCwgbHJ9CiAJVU5XSU5EIC5zYXZlCXtyMCwgbHJ9CiAJYWRkCXIyLCBzcCwgIzgKLQkucGFkICMxNgorCVVOV0lORCAucGFkICMxNgogCXN1YglzcCwgc3AsICMxNgogCXN0cglzcCwgW3NwLCAjOF0KIAlhZGQJcjEsIHNwLCAjOAotCWJsCWZmaV9jbG9zdXJlX1NZU1ZfaW5uZXIKKwlibAlDTkFNRShmZmlfY2xvc3VyZV9TWVNWX2lubmVyKQogCWNtcAlyMCwgI0ZGSV9UWVBFX0lOVAogCWJlcQkuTHJldGludAogCkBAIC0zMDAsNyArMzI4LDE3NyBAQAogCiAuZmZpX2Nsb3N1cmVfU1lTVl9lbmQ6CiAJVU5XSU5EIC5mbmVuZAorI2lmZGVmIF9fRUxGX18KICAgICAgICAgLnNpemUgICAgQ05BTUUoZmZpX2Nsb3N1cmVfU1lTViksLmZmaV9jbG9zdXJlX1NZU1ZfZW5kLUNOQU1FKGZmaV9jbG9zdXJlX1NZU1YpCisjZW5kaWYKKworCisvKiBCZWxvdyBhcmUgVkZQIGhhcmQtZmxvYXQgQUJJIGNhbGwgYW5kIGNsb3N1cmUgaW1wbGVtZW50YXRpb25zLgorICAgQWRkIFZGUCBGUFUgZGlyZWN0aXZlIGhlcmUuIFRoaXMgaXMgb25seSBjb21waWxlZCBpbnRvIHRoZSBsaWJyYXJ5CisgICB1bmRlciBFQUJJLiAgKi8KKyNpZmRlZiBfX0FSTV9FQUJJX18KKwkuZnB1CXZmcAorCisJQCByMDogICBmbgorCUAgcjE6ICAgJmVjaWYKKwlAIHIyOiAgIGNpZi0+Ynl0ZXMKKwlAIHIzOiAgIGZpZy0+ZmxhZ3MKKwlAIHNwKzA6IGVjaWYucnZhbHVlCisKK0FSTV9GVU5DX1NUQVJUIGZmaV9jYWxsX1ZGUAorCUAgU2F2ZSByZWdpc3RlcnMKKyAgICAgICAgc3RtZmQJc3AhLCB7cjAtcjMsIGZwLCBscn0KKwlVTldJTkQgLnNhdmUJe3IwLXIzLCBmcCwgbHJ9CisJbW92CWZwLCBzcAorCVVOV0lORCAuc2V0ZnAJZnAsIHNwCisKKwlAIE1ha2Ugcm9vbSBmb3IgYWxsIG9mIHRoZSBuZXcgYXJncy4KKwlzdWIJc3AsIHNwLCByMgorCisJQCBNYWtlIHJvb20gZm9yIGxvYWRpbmcgVkZQIGFyZ3MKKwlzdWIJc3AsIHNwLCAjNjQKKworCUAgUGxhY2UgYWxsIG9mIHRoZSBmZmlfcHJlcF9hcmdzIGluIHBvc2l0aW9uCisJbW92CXIwLCBzcAorCUAgICAgIHIxIGFscmVhZHkgc2V0CisJc3ViCXIyLCBmcCwgIzY0ICAgQCBWRlAgc2NyYXRjaCBzcGFjZQorCisJQCBDYWxsIGZmaV9wcmVwX2FyZ3Moc3RhY2ssICZlY2lmLCB2ZnBfc3BhY2UpCisJYmwJQ05BTUUoZmZpX3ByZXBfYXJncykKKworCUAgTG9hZCBWRlAgcmVnaXN0ZXIgYXJncyBpZiBuZWVkZWQKKwljbXAJcjAsICMwCisJYmVxCUxTWU0oTGJhc2VfYXJncykKKworCUAgTG9hZCBvbmx5IGQwIGlmIHBvc3NpYmxlCisJY21wCXIwLCAjMworCXN1YglpcCwgZnAsICM2NAorCWZsZGRsZQlkMCwgW2lwXQorCWZsZG1pYWRndAlpcCwge2QwLWQ3fQorCitMU1lNKExiYXNlX2FyZ3MpOgorCUAgbW92ZSBmaXJzdCA0IHBhcmFtZXRlcnMgaW4gcmVnaXN0ZXJzCisJbGRtaWEJc3AsIHtyMC1yM30KKworCUAgYW5kIGFkanVzdCBzdGFjaworCXN1YglsciwgaXAsIHNwCUAgY2lmLT5ieXRlcyA9PSAoZnAgLSA2NCkgLSBzcAorCWxkcglpcCwgW2ZwXQlAIGxvYWQgZm4oKSBpbiBhZHZhbmNlCisgICAgICAgIGNtcAlsciwgIzE2CisJbW92aHMJbHIsICMxNgorICAgICAgICBhZGQJc3AsIHNwLCBscgorCisJQCBjYWxsIChmbikgKC4uLikKKwljYWxsX3JlZyhpcCkKKworCUAgUmVtb3ZlIHRoZSBzcGFjZSB3ZSBwdXNoZWQgZm9yIHRoZSBhcmdzCisJbW92CXNwLCBmcAorCisJQCBMb2FkIHIyIHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IKKwlAIHRoZSByZXR1cm4gdmFsdWUKKwlsZHIJcjIsIFtzcCwgIzI0XQorCisJQCBMb2FkIHIzIHdpdGggdGhlIHJldHVybiB0eXBlIGNvZGUgCisJbGRyCXIzLCBbc3AsICMxMl0KKworCUAgSWYgdGhlIHJldHVybiB2YWx1ZSBwb2ludGVyIGlzIE5VTEwsCisJQCBhc3N1bWUgbm8gcmV0dXJuIHZhbHVlLgorCWNtcAlyMiwgIzAKKwliZXEJTFNZTShMZXBpbG9ndWVfdmZwKQorCisJY21wCXIzLCAjRkZJX1RZUEVfSU5UCisJc3RyZXEJcjAsIFtyMl0KKwliZXEJTFNZTShMZXBpbG9ndWVfdmZwKQorCisJY21wCXIzLCAjRkZJX1RZUEVfU0lOVDY0CisJc3RtZXFpYQlyMiwge3IwLCByMX0KKwliZXEJTFNZTShMZXBpbG9ndWVfdmZwKQorCisJY21wCXIzLCAjRkZJX1RZUEVfRkxPQVQKKwlmc3RzZXEJczAsIFtyMl0KKwliZXEJTFNZTShMZXBpbG9ndWVfdmZwKQorCQorCWNtcAlyMywgI0ZGSV9UWVBFX0RPVUJMRQorCWZzdGRlcQlkMCwgW3IyXQorCWJlcQlMU1lNKExlcGlsb2d1ZV92ZnApCisKKwljbXAJcjMsICNGRklfVFlQRV9TVFJVQ1RfVkZQX0ZMT0FUCisJY21wbmUJcjMsICNGRklfVFlQRV9TVFJVQ1RfVkZQX0RPVUJMRQorCWZzdG1pYWRlcQlyMiwge2QwLWQzfQorCitMU1lNKExlcGlsb2d1ZV92ZnApOgorCVJFVExETQkicjAtcjMsZnAiCisKKy5mZmlfY2FsbF9WRlBfZW5kOgorCVVOV0lORCAuZm5lbmQKKyAgICAgICAgLnNpemUgICAgQ05BTUUoZmZpX2NhbGxfVkZQKSwuZmZpX2NhbGxfVkZQX2VuZC1DTkFNRShmZmlfY2FsbF9WRlApCisKKworQVJNX0ZVTkNfU1RBUlQgZmZpX2Nsb3N1cmVfVkZQCisJZnN0bWZkZAlzcCEsIHtkMC1kN30KKwlAIHIwLXIzLCB0aGVuIGQwLWQ3CisJVU5XSU5EIC5wYWQgIzgwCisJYWRkCWlwLCBzcCwgIzgwCisJc3RtZmQJc3AhLCB7aXAsIGxyfQorCVVOV0lORCAuc2F2ZQl7cjAsIGxyfQorCWFkZAlyMiwgc3AsICM3MgorCWFkZAlyMywgc3AsICM4CisJVU5XSU5EIC5wYWQgIzcyCisJc3ViCXNwLCBzcCwgIzcyCisJc3RyCXNwLCBbc3AsICM2NF0KKwlhZGQJcjEsIHNwLCAjNjQKKwlibAlDTkFNRShmZmlfY2xvc3VyZV9TWVNWX2lubmVyKQorCisJY21wCXIwLCAjRkZJX1RZUEVfSU5UCisJYmVxCS5McmV0aW50X3ZmcAorCisJY21wCXIwLCAjRkZJX1RZUEVfRkxPQVQKKwliZXEJLkxyZXRmbG9hdF92ZnAKKworCWNtcAlyMCwgI0ZGSV9UWVBFX0RPVUJMRQorCWNtcG5lCXIwLCAjRkZJX1RZUEVfTE9OR0RPVUJMRQorCWJlcQkuTHJldGRvdWJsZV92ZnAKKworCWNtcAlyMCwgI0ZGSV9UWVBFX1NJTlQ2NAorCWJlcQkuTHJldGxvbmdsb25nX3ZmcAorCisJY21wCXIwLCAjRkZJX1RZUEVfU1RSVUNUX1ZGUF9GTE9BVAorCWJlcQkuTHJldGZsb2F0X3N0cnVjdF92ZnAKKworCWNtcAlyMCwgI0ZGSV9UWVBFX1NUUlVDVF9WRlBfRE9VQkxFCisJYmVxCS5McmV0ZG91YmxlX3N0cnVjdF92ZnAKKwkKKy5MY2xvc3VyZV9lcGlsb2d1ZV92ZnA6CisJYWRkCXNwLCBzcCwgIzcyCisJbGRtZmQJc3AsIHtzcCwgcGN9CisKKy5McmV0ZmxvYXRfdmZwOgorCWZsZHMJczAsIFtzcF0KKwliCS5MY2xvc3VyZV9lcGlsb2d1ZV92ZnAKKy5McmV0ZG91YmxlX3ZmcDoKKwlmbGRkCWQwLCBbc3BdCisJYgkuTGNsb3N1cmVfZXBpbG9ndWVfdmZwCisuTHJldGludF92ZnA6CisJbGRyCXIwLCBbc3BdCisJYgkuTGNsb3N1cmVfZXBpbG9ndWVfdmZwCisuTHJldGxvbmdsb25nX3ZmcDoKKwlsZG1pYQlzcCwge3IwLCByMX0KKwliCS5MY2xvc3VyZV9lcGlsb2d1ZV92ZnAKKy5McmV0ZmxvYXRfc3RydWN0X3ZmcDoKKwlmbGRtaWFkCXNwLCB7ZDAtZDF9CisJYgkuTGNsb3N1cmVfZXBpbG9ndWVfdmZwCisuTHJldGRvdWJsZV9zdHJ1Y3RfdmZwOgorCWZsZG1pYWQJc3AsIHtkMC1kM30KKwliCS5MY2xvc3VyZV9lcGlsb2d1ZV92ZnAKKworLmZmaV9jbG9zdXJlX1ZGUF9lbmQ6CisJVU5XSU5EIC5mbmVuZAorICAgICAgICAuc2l6ZSAgICBDTkFNRShmZmlfY2xvc3VyZV9WRlApLC5mZmlfY2xvc3VyZV9WRlBfZW5kLUNOQU1FKGZmaV9jbG9zdXJlX1ZGUCkKKyNlbmRpZgorCitFTlRSWShmZmlfYXJtX3RyYW1wb2xpbmUpCisJc3RtZmQgc3AhLCB7cjAtcjN9CisJbGRyIHIwLCBbcGNdCisJbGRyIHBjLCBbcGNdCiAKICNpZiBkZWZpbmVkIF9fRUxGX18gJiYgZGVmaW5lZCBfX2xpbnV4X18KIAkuc2VjdGlvbgkubm90ZS5HTlUtc3RhY2ssIiIsJXByb2diaXRzCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9hcm0vdHJhbXBvbGluZS5TIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvYXJtL3RyYW1wb2xpbmUuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzVlOGRlCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvYXJtL3RyYW1wb2xpbmUuUwpAQCAtMCwwICsxLDQ0NTAgQEAKKyMgR0VORVJBVEVEIENPREUgLSBETyBOT1QgRURJVAorIyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBzcmMvYXJtL2dlbnRyYW1wLnNoCisKKyMgIENvcHlyaWdodCAoYykgMjAxMCwgUGxhdXNpYmxlIExhYnMgQ29vcGVyYXRpdmUsIEluYy4KKyMgIAorIyAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisjICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyMgIFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyMgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyMgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworIyAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisjICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorIyAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisjCisjICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyMgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorIyAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyMgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorIyAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisjICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyMgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyMgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy50ZXh0CisuYWxpZ24gMTIKKy5nbG9ibCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZV9wYWdlCitfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZV9wYWdlOgorCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2F2cjMyL2ZmaS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvYXZyMzIvZmZpLmMKaW5kZXggMzlmYmEyYi4uM2Q0MzM5NyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvYXZyMzIvZmZpLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvYXZyMzIvZmZpLmMKQEAgLTEsNSArMSw2IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgZmZpLmMgLSBDb3B5cmlnaHQgKGMpIDIwMDkgIEJyYWRsZXkgU21pdGggPGJyYWRAYnJhZC1zbWl0aC5jby51az4KKyAgIGZmaS5jIC0gQ29weXJpZ2h0IChjKSAyMDExICBBbnRob255IEdyZWVuCisgICAgICAgICAgIENvcHlyaWdodCAoYykgMjAwOSAgQnJhZGxleSBTbWl0aCA8YnJhZEBicmFkLXNtaXRoLmNvLnVrPgogCiAgICBBVlIzMiBGb3JlaWduIEZ1bmN0aW9uIEludGVyZmFjZQogCkBAIC0zOTQsNyArMzk1LDggQEAKICAgICB2b2lkICgqZnVuKShmZmlfY2lmKiwgdm9pZCosIHZvaWQqKiwgdm9pZCopLCB2b2lkICp1c2VyX2RhdGEsCiAgICAgdm9pZCAqY29kZWxvYykKIHsKLSAgICBGRklfQVNTRVJUKGNpZi0+YWJpID09IEZGSV9TWVNWKTsKKyAgICBpZiAoY2lmLT5hYmkgIT0gRkZJX1NZU1YpCisgICAgICByZXR1cm4gRkZJX0JBRF9BQkk7CiAKICAgICB1bnNpZ25lZCBjaGFyICpfX3RyYW1wID0gKHVuc2lnbmVkIGNoYXIqKSgmY2xvc3VyZS0+dHJhbXBbMF0pOwogICAgIHVuc2lnbmVkIGludCAgX19mdW4gPSAodW5zaWduZWQgaW50KSgmZmZpX2Nsb3N1cmVfU1lTVik7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9hdnIzMi9mZml0YXJnZXQuaCBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2F2cjMyL2ZmaXRhcmdldC5oCmluZGV4IDFjNzk5YjEuLmQwYzc1ODYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2F2cjMyL2ZmaXRhcmdldC5oCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2F2cjMyL2ZmaXRhcmdldC5oCkBAIC0xLDUgKzEsNiBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLUMtKi0KLSAgIGZmaXRhcmdldC5oIC0gQ29weXJpZ2h0IChjKSAyMDA5ICBCcmFkbGV5IFNtaXRoIDxicmFkQGJyYWQtc21pdGguY28udWs+CisgICBmZml0YXJnZXQuaCAtIENvcHlyaWdodCAoYykgMjAxMiAgQW50aG9ueSBHcmVlbgorICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDkgIEJyYWRsZXkgU21pdGggPGJyYWRAYnJhZC1zbWl0aC5jby51az4KICAgIFRhcmdldCBjb25maWd1cmF0aW9uIG1hY3JvcyBmb3IgQVZSMzIuCiAKICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwpAQCAtMjcsNiArMjgsMTAgQEAKICNpZm5kZWYgTElCRkZJX1RBUkdFVF9ICiAjZGVmaW5lIExJQkZGSV9UQVJHRVRfSAogCisjaWZuZGVmIExJQkZGSV9ICisjZXJyb3IgIlBsZWFzZSBkbyBub3QgaW5jbHVkZSBmZml0YXJnZXQuaCBkaXJlY3RseSBpbnRvIHlvdXIgc291cmNlLiAgVXNlIGZmaS5oIGluc3RlYWQuIgorI2VuZGlmCisKICNpZm5kZWYgTElCRkZJX0FTTQogdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgICAgIGZmaV9hcmc7CiB0eXBlZGVmIHNpZ25lZCBsb25nICAgICAgICAgICAgZmZpX3Nhcmc7CkBAIC0zNCw4ICszOSw4IEBACiB0eXBlZGVmIGVudW0gZmZpX2FiaSB7CiAgIEZGSV9GSVJTVF9BQkkgPSAwLAogICBGRklfU1lTViwKLSAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX1NZU1YsCi0gIEZGSV9MQVNUX0FCSSA9IEZGSV9ERUZBVUxUX0FCSSArIDEKKyAgRkZJX0xBU1RfQUJJLAorICBGRklfREVGQVVMVF9BQkkgPSBGRklfU1lTVgogfSBmZmlfYWJpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2JmaW4vZmZpLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9iZmluL2ZmaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZWNjYzEKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9iZmluL2ZmaS5jCkBAIC0wLDAgKzEsMTk1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgZmZpLmMgLSBDb3B5cmlnaHQgKGMpIDIwMTIgIEFsZXhhbmRyZSBLLiBJLiBkZSBNZW5kb25jYSA8YWxleGFuZHJlLmtldW5lY2tlQGdtYWlsLmNvbT4KKworICAgQmxhY2tmaW4gRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UKKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICAgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICAgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpbmNsdWRlIDxmZmkuaD4KKyNpbmNsdWRlIDxmZmlfY29tbW9uLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKiBNYXhpbXVtIG51bWJlciBvZiBHUFJzIGF2YWlsYWJsZSBmb3IgYXJndW1lbnQgcGFzc2luZy4gICovCisjZGVmaW5lIE1BWF9HUFJBUkdTIDMKKworLyoKKyAqIFJldHVybiB0eXBlcworICovCisjZGVmaW5lIEZGSUJGSU5fUkVUX1ZPSUQgMAorI2RlZmluZSBGRklCRklOX1JFVF9CWVRFIDEKKyNkZWZpbmUgRkZJQkZJTl9SRVRfSEFMRldPUkQgMgorI2RlZmluZSBGRklCRklOX1JFVF9JTlQ2NCAzCisjZGVmaW5lIEZGSUJGSU5fUkVUX0lOVDMyIDQKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPVE9UWVBFICAgICAgICAgICoKKyAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgZmZpX3ByZXBfYXJncyh1bnNpZ25lZCBjaGFyICosIGV4dGVuZGVkX2NpZiAqKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAoQXNzZW1ibHkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK2V4dGVybiB2b2lkIGZmaV9jYWxsX1NZU1YodW5zaWduZWQsIGV4dGVuZGVkX2NpZiAqLCB2b2lkKCopKHVuc2lnbmVkIGNoYXIgKiwgZXh0ZW5kZWRfY2lmICopLCB1bnNpZ25lZCwgdm9pZCAqLCB2b2lkKCpmbikodm9pZCkpOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICBJbXBsZW1lbnRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgcmV0dXJuIHR5cGUgKHNpemUpIGJhc2VkIG9uIHR5cGUuCisgKi8KKworZmZpX3N0YXR1cyBmZmlfcHJlcF9jaWZfbWFjaGRlcChmZmlfY2lmICpjaWYpCit7CisgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAgICAqICAgUmV0dXJuIGhhbmRsaW5nICAgICAgICAgICAgICAgICoKKyAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIHN3aXRjaCAoY2lmLT5ydHlwZS0+dHlwZSkgeworICAgICAgY2FzZSBGRklfVFlQRV9WT0lEOgorICAgICAgICAgY2lmLT5mbGFncyA9IEZGSUJGSU5fUkVUX1ZPSUQ7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRkZJX1RZUEVfVUlOVDE2OgorICAgICAgY2FzZSBGRklfVFlQRV9TSU5UMTY6CisgICAgICAgICBjaWYtPmZsYWdzID0gRkZJQkZJTl9SRVRfSEFMRldPUkQ7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRkZJX1RZUEVfVUlOVDg6CisgICAgICAgICBjaWYtPmZsYWdzID0gRkZJQkZJTl9SRVRfQllURTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGRklfVFlQRV9JTlQ6CisgICAgICBjYXNlIEZGSV9UWVBFX1VJTlQzMjoKKyAgICAgIGNhc2UgRkZJX1RZUEVfU0lOVDMyOgorICAgICAgY2FzZSBGRklfVFlQRV9GTE9BVDoKKyAgICAgIGNhc2UgRkZJX1RZUEVfUE9JTlRFUjoKKyAgICAgIGNhc2UgRkZJX1RZUEVfU0lOVDg6CisgICAgICAgICBjaWYtPmZsYWdzID0gRkZJQkZJTl9SRVRfSU5UMzI7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRkZJX1RZUEVfU0lOVDY0OgorICAgICAgY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisgICAgICBjYXNlIEZGSV9UWVBFX0RPVUJMRToKKyAgICAgICAgICBjaWYtPmZsYWdzID0gRkZJQkZJTl9SRVRfSU5UNjQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZGSV9UWVBFX1NUUlVDVDoKKyAgICAgICAgIGlmIChjaWYtPnJ0eXBlLT5zaXplIDw9IDQpeworICAgICAgICAJIGNpZi0+ZmxhZ3MgPSBGRklCRklOX1JFVF9JTlQzMjsKKyAgICAgICAgIH1lbHNlIGlmIChjaWYtPnJ0eXBlLT5zaXplID09IDgpeworICAgICAgICAJIGNpZi0+ZmxhZ3MgPSBGRklCRklOX1JFVF9JTlQ2NDsKKyAgICAgICAgIH1lbHNleworICAgICAgICAJIC8vaXQgd2lsbCByZXR1cm4gdmlhIGEgaGlkZGVuIHBvaW50ZXIgaW4gUDAKKyAgICAgICAgCSBjaWYtPmZsYWdzID0gRkZJQkZJTl9SRVRfVk9JRDsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIEZGSV9BU1NFUlQoMCk7CisgICAgICAgICBicmVhazsKKyAgIH0KKyAgIHJldHVybiBGRklfT0s7Cit9CisKKy8qCisgKiBUaGlzIHdpbGwgcHJlcGFyZSB0aGUgYXJndW1lbnRzIGFuZCB3aWxsIGNhbGwgdGhlIGFzc2VtYmx5IHJvdXRpbmUKKyAqIGNpZiA9IHRoZSBjYWxsIGludGVyZmFjZQorICogZm4gPSB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCisgKiBydmFsdWUgPSB0aGUgcmV0dXJuIHZhbHVlCisgKiBhdmFsdWUgPSB0aGUgYXJndW1lbnRzCisgKi8KK3ZvaWQgZmZpX2NhbGwoZmZpX2NpZiAqY2lmLCB2b2lkKCpmbikodm9pZCksIHZvaWQgKnJ2YWx1ZSwgdm9pZCAqKmF2YWx1ZSkKK3sKKyAgIGludCByZXRfdHlwZSA9IGNpZi0+ZmxhZ3M7CisgICBleHRlbmRlZF9jaWYgZWNpZjsKKyAgIGVjaWYuY2lmID0gY2lmOworICAgZWNpZi5hdmFsdWUgPSBhdmFsdWU7CisgICBlY2lmLnJ2YWx1ZSA9IHJ2YWx1ZTsKKworICAgc3dpdGNoIChjaWYtPmFiaSkgeworICAgICAgY2FzZSBGRklfU1lTVjoKKyAgICAgICAgIGZmaV9jYWxsX1NZU1YoY2lmLT5ieXRlcywgJmVjaWYsIGZmaV9wcmVwX2FyZ3MsIHJldF90eXBlLCBlY2lmLnJ2YWx1ZSwgZm4pOworICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgRkZJX0FTU0VSVCgwKTsKKyAgICAgICAgIGJyZWFrOworICAgfQorfQorCisKKy8qCisqIFRoaXMgZnVuY3Rpb24gcHJlcGFyZXMgdGhlIHBhcmFtZXRlcnMgKGNvcGllcyB0aGVtIGZyb20gdGhlIGVjaWYgdG8gdGhlIHN0YWNrKQorKiAgdG8gY2FsbCB0aGUgZnVuY3Rpb24gKGZmaV9wcmVwX2FyZ3MgaXMgY2FsbGVkIGJ5IHRoZSBhc3NlbWJseSByb3V0aW5lIGluIGZpbGUKKyogIHN5c3YuUywgd2hpY2ggYWxzbyBjYWxscyB0aGUgYWN0dWFsIGZ1bmN0aW9uKQorKi8KK3ZvaWQgZmZpX3ByZXBfYXJncyh1bnNpZ25lZCBjaGFyICpzdGFjaywgZXh0ZW5kZWRfY2lmICplY2lmKQoreworICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGkgPSAwOworICAgdm9pZCAqKnBfYXJndjsKKyAgIHVuc2lnbmVkIGNoYXIgKmFyZ3A7CisgICBmZmlfdHlwZSAqKnBfYXJnOworICAgYXJncCA9IHN0YWNrOworICAgcF9hcmd2ID0gZWNpZi0+YXZhbHVlOworICAgZm9yIChpID0gZWNpZi0+Y2lmLT5uYXJncywgcF9hcmcgPSBlY2lmLT5jaWYtPmFyZ190eXBlczsKKyAgICAgICAgKGkgIT0gMCk7CisgICAgICAgIGktLSwgcF9hcmcrKykgeworICAgICAgc2l6ZV90IHo7CisgICAgICB6ID0gKCpwX2FyZyktPnNpemU7CisgICAgICBpZiAoeiA8IHNpemVvZihpbnQpKSB7CisgICAgICAgICB6ID0gc2l6ZW9mKGludCk7CisgICAgICAgICBzd2l0Y2ggKCgqcF9hcmcpLT50eXBlKSB7CisgICAgICAgICAgICBjYXNlIEZGSV9UWVBFX1NJTlQ4OiB7CisgICAgICAgICAgICAgICAgICBzaWduZWQgY2hhciB2ID0gKihTSU5UOCAqKSgqIHBfYXJndik7CisgICAgICAgICAgICAgICAgICBzaWduZWQgaW50IHQgPSB2OworICAgICAgICAgICAgICAgICAgKihzaWduZWQgaW50ICopIGFyZ3AgPSB0OworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZGSV9UWVBFX1VJTlQ4OiB7CisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHYgPSAqKFVJTlQ4ICopKCogcF9hcmd2KTsKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0ID0gdjsKKyAgICAgICAgICAgICAgICAgICoodW5zaWduZWQgaW50ICopIGFyZ3AgPSB0OworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZGSV9UWVBFX1NJTlQxNjoKKyAgICAgICAgICAgICAgICooc2lnbmVkIGludCAqKSBhcmdwID0gKHNpZ25lZCBpbnQpICogKFNJTlQxNiAqKSgqIHBfYXJndik7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRkZJX1RZUEVfVUlOVDE2OgorICAgICAgICAgICAgICAgKih1bnNpZ25lZCBpbnQgKikgYXJncCA9ICh1bnNpZ25lZCBpbnQpICogKFVJTlQxNiAqKSgqIHBfYXJndik7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOgorICAgICAgICAgICAgICAgbWVtY3B5KGFyZ3AsICpwX2FyZ3YsICgqcF9hcmcpLT5zaXplKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgIEZGSV9BU1NFUlQoMCk7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoeiA9PSBzaXplb2YoaW50KSkgeworICAgICAgICAgKih1bnNpZ25lZCBpbnQgKikgYXJncCA9ICh1bnNpZ25lZCBpbnQpICogKFVJTlQzMiAqKSgqIHBfYXJndik7CisgICAgICB9IGVsc2UgeworICAgICAgICAgbWVtY3B5KGFyZ3AsICpwX2FyZ3YsIHopOworICAgICAgfQorICAgICAgcF9hcmd2Kys7CisgICAgICBhcmdwICs9IHo7CisgICB9Cit9CisKKworCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9iZmluL2ZmaXRhcmdldC5oIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvYmZpbi9mZml0YXJnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTc1YzAxCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvYmZpbi9mZml0YXJnZXQuaApAQCAtMCwwICsxLDQzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgZmZpdGFyZ2V0LmggLSBDb3B5cmlnaHQgKGMpIDIwMTIgIEFsZXhhbmRyZSBLLiBJLiBkZSBNZW5kb25jYSA8YWxleGFuZHJlLmtldW5lY2tlQGdtYWlsLmNvbT4KKworICAgQmxhY2tmaW4gRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UKKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICAgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICAgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBMSUJGRklfVEFSR0VUX0gKKyNkZWZpbmUgTElCRkZJX1RBUkdFVF9ICisKKyNpZm5kZWYgTElCRkZJX0FTTQordHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgICAgIGZmaV9hcmc7Cit0eXBlZGVmIHNpZ25lZCAJIGxvbmcgICAgICAgICAgZmZpX3Nhcmc7CisKK3R5cGVkZWYgZW51bSBmZmlfYWJpIHsKKyAgRkZJX0ZJUlNUX0FCSSA9IDAsCisgIEZGSV9TWVNWLAorICBGRklfTEFTVF9BQkksCisgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9TWVNWCit9IGZmaV9hYmk7CisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2JmaW4vc3lzdi5TIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvYmZpbi9zeXN2LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU3YTE1MgotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2JmaW4vc3lzdi5TCkBAIC0wLDAgKzEsMTc3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgc3lzdi5TIC0gQ29weXJpZ2h0IChjKSAyMDEyICBBbGV4YW5kcmUgSy4gSS4gZGUgTWVuZG9uY2EgPGFsZXhhbmRyZS5rZXVuZWNrZUBnbWFpbC5jb20+CisKKyAgIEJsYWNrZmluIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTElCRkZJX0FTTQorI2luY2x1ZGUgPGZmaWNvbmZpZy5oPgorI2luY2x1ZGUgPGZmaS5oPgorCisudGV4dAorLmFsaWduIDQKKworCS8qCisJIFRoZXJlIGlzIGEgImZlYXR1cmUiIGluIHRoZSBiZmluIHRvb2xjaGFpbiB0aGF0IGl0IHB1dHMgYSBfIGJlZm9yZSBmdW5jaW9uIG5hbWVzCisJIHRoYXQncyB3aHkgdGhlIGZ1bmN0aW9uIGhlcmUgaXQncyBjYWxsZWQgX2ZmaV9jYWxsX1NZU1YgYW5kIG5vdCBmZmlfY2FsbF9TWVNWCisJICovCisJLmdsb2JhbCBfZmZpX2NhbGxfU1lTVjsKKwkudHlwZSBfZmZpX2NhbGxfU1lTViwgU1RUX0ZVTkM7CisJLmZ1bmMgZmZpX2NhbGxfU1lTVgorCisJLyoKKwljaWYtPmJ5dGVzICAJPSBSMAkoZnArOCkKKwkmZWNpZgkJCT0gUjEJKGZwKzEyKQorCWZmaV9wcmVwX2FyZ3MJPSBSMgkoZnArMTYpCisJcmV0X3R5cGUJCT0gc3RhY2sgKGZwKzIwKQorCWVjaWYucnZhbHVlCQk9IHN0YWNrIChmcCsyNCkKKwlmbgkJCQk9IHN0YWNrCShmcCsyOCkKKwkJCQkJICBnb3QJKGZwKzMyKQorICAgIFRoZXJlIGlzIHJvb20gZm9yIGltcHJvdmVtZW50IGhlcmUgKHdlIGNhbiB1c2UgdGVtcG9yYXJ5IHJlZ2lzdGVycworICAgICAgICBpbnN0ZWFkIG9mIHNhdmluZyB0aGUgdmFsdWVzIGluIHRoZSBtZW1vcnkpCisJUkVHUzoKKwkJUDUgPT4gU3RhY2sgcG9pbnRlciAoZnVuY3Rpb24gYXJndW1lbnRzKQorCQlSNSA9PiBjaWYtPmJ5dGVzCisJCVI0ID0+IHJldC0+dHlwZQorCisJCUZQLTIwID0gUDMKKwkJRlAtMTYgPSBTUCAocGFyYW1ldGVycyBhcmVhKQorCQlGUC0xMiA9IFNQICh0ZW1wKQorCQlGUC0wOCA9IGZ1bmN0aW9uIHJldHVybiBwYXJ0IDEgW1IwXQorCQlGUC0wNCA9IGZ1bmN0aW9uIHJldHVybiBwYXJ0IDIgW1IxXQorCSovCisKK19mZmlfY2FsbF9TWVNWOgorLnByb2xvZ3VlOgorCUxJTksgMjA7CisJW0ZQLTIwXSA9IFAzOworCVtGUCs4XSA9IFIwOworCVtGUCsxMl0gPSBSMTsKKwlbRlArMTZdID0gUjI7CisKKy5hbGxvY2F0ZV9zdGFjazoKKwkvL2Fsb2NhdGUgY2lmLT5ieXRlcyBpbnRvIHRoZSBzdGFjaworCVIxID0gW0ZQKzhdOworCVIwID0gU1A7CisJUjAgPSBSMCAtIFIxOworCVIxID0gNDsKKwlSMCA9IFIwIC0gUjE7CisJW0ZQLTEyXSA9IFNQOworCVNQID0gUjA7CisJW0ZQLTE2XSA9IFNQOworCisuY2FsbF9wcmVwX2FyZ3M6CisJLy9nZXQgdGhlIGFkZHIgb2YgcHJlcF9hcmdzCisJUDAgPSBbUDMgKyBfZmZpX3ByZXBfYXJnc0BGVU5DREVTQ19HT1QxN000XTsKKwlQMSA9IFtQMF07CisJUDMgPSBbUDArNF07CisJUjAgPSBbRlAtMTZdOy8vU1AgKHBhcmFtZXRlciBhcmVhKQorCVIxID0gW0ZQKzEyXTsvL2VjaWYKKwljYWxsIChQMSk7CisKKy5jYWxsX3VzZXJfZnVuY3Rpb246CisJLy9hanVzdCBTUCBzbyBhcyB0byBhbGxvdyB0aGUgdXNlciBmdW5jdGlvbiBhY2Nlc3MgdGhlIHBhcmFtZXRlcnMgb24gdGhlIHN0YWNrCisJU1AgPSBbRlAtMTZdOyAvL3BvaW50IHRvIGZ1bmN0aW9uIHBhcmFtZXRlcnMKKwlSMCA9IFtTUF07CisJUjEgPSBbU1ArNF07CisJUjIgPSBbU1ArOF07CisJLy9sb2FkIHVzZXIgZnVuY3Rpb24gYWRkcmVzcworCVAwID0gRlA7CisJUDAgKz0yODsKKwlQMSA9IFtQMF07CisJUDEgPSBbUDFdOworCVAzID0gW1AwKzRdOworCS8qCisJCUZvciBmdW5jdGlvbnMgcmV0dXJuaW5nIGFnZ3JlZ2F0ZSB2YWx1ZXMgKHN0cnVjdCkgb2NjdXB5aW5nIG1vcmUgdGhhbiA4IGJ5dGVzLAorCQl0aGUgY2FsbGVyIGFsbG9jYXRlcyB0aGUgcmV0dXJuIHZhbHVlIG9iamVjdCBvbiB0aGUgc3RhY2sgYW5kIHRoZSBhZGRyZXNzCisJCW9mIHRoaXMgb2JqZWN0IGlzIHBhc3NlZCB0byB0aGUgY2FsbGVlIGFzIGEgaGlkZGVuIGFyZ3VtZW50IGluIHJlZ2lzdGVyIFAwLgorCSovCisJUDAgPSBbRlArMjRdOworCisJY2FsbCAoUDEpOworCVNQID0gW0ZQLTEyXTsKKy5jb21wdXRlX3JldHVybjoKKwlQMiA9IFtGUC0yMF07CisJW0ZQLThdID0gUjA7CisJW0ZQLTRdID0gUjE7CisKKwlSMCA9IFtGUCsyMF07CisJUjEgPSBSMCA8PCAyOworCisJUjAgPSBbUDIrLnJldHRhYmxlQEdPVDE3TTRdOworCVIwID0gUjEgKyBSMDsKKwlQMiA9IFIwOworCVIxID0gW1AyXTsKKworCVAyID0gW0ZQKy0yMF07CisJUjAgPSBbUDIrLnJldHRhYmxlQEdPVDE3TTRdOworCVIwID0gUjEgKyBSMDsKKwlQMiA9IFIwOworCVIwID0gW0ZQLThdOworCVIxID0gW0ZQLTRdOworCWp1bXAgKFAyKTsKKworLyoKKyNkZWZpbmUgRkZJQkZJTl9SRVRfVk9JRCAwCisjZGVmaW5lIEZGSUJGSU5fUkVUX0JZVEUgMQorI2RlZmluZSBGRklCRklOX1JFVF9IQUxGV09SRCAyCisjZGVmaW5lIEZGSUJGSU5fUkVUX0lOVDY0IDMKKyNkZWZpbmUgRkZJQkZJTl9SRVRfSU5UMzIgNAorKi8KKy5hbGlnbiA0CisuYWxpZ24gNAorLnJldHRhYmxlOgorCS5kZCAuZXBpbG9ndWUgLSAucmV0dGFibGUKKwkuZGQJLnJieXRlIC0gLnJldHRhYmxlOworCS5kZAkucmhhbGZ3b3JkIC0gLnJldHRhYmxlOworCS5kZAkucmludDY0IC0gLnJldHRhYmxlOworCS5kZAkucmludDMyIC0gLnJldHRhYmxlOworCisucmJ5dGU6CisJUDAgPSBbRlArMjRdOworCVIwID0gUjAuQiAoWik7CisJW1AwXSA9IFIwOworCUpVTVAgLmVwaWxvZ3VlCisucmhhbGZ3b3JkOgorCVAwID0gW0ZQKzI0XTsKKwlSMCA9IFIwLkw7CisJW1AwXSA9IFIwOworCUpVTVAgLmVwaWxvZ3VlCisucmludDY0OgorCVAwID0gW0ZQKzI0XTsvLyAmcnZhbHVlCisJW1AwXSA9IFIwOworCVtQMCs0XSA9IFIxOworCUpVTVAgLmVwaWxvZ3VlCisucmludDMyOgorCVAwID0gW0ZQKzI0XTsKKwlbUDBdID0gUjA7CisuZXBpbG9ndWU6CisJUjAgPSBbRlArOF07CisJUjEgPSBbRlArMTJdOworCVIyID0gW0ZQKzE2XTsKKwlQMyA9IFtGUC0yMF07CisJVU5MSU5LOworCVJUUzsKKworLnNpemUgX2ZmaV9jYWxsX1NZU1YsLi1fZmZpX2NhbGxfU1lTVjsKKy5lbmRmdW5jCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9jbG9zdXJlcy5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvY2xvc3VyZXMuYwppbmRleCAwYjE1NmUwLi42Mjk4ZDZmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9jbG9zdXJlcy5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2Nsb3N1cmVzLmMKQEAgLTEsNiArMSw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgY2xvc3VyZXMuYyAtIENvcHlyaWdodCAoYykgMjAwNyAgUmVkIEhhdCwgSW5jLgotICAgQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jCisgICBjbG9zdXJlcy5jIC0gQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5LCAyMDEwICBSZWQgSGF0LCBJbmMuCisgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jCisgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDExIFBsYXVzaWJsZSBMYWJzIENvb3BlcmF0aXZlLCBJbmMuCiAKICAgIENvZGUgdG8gYWxsb2NhdGUgYW5kIGRlYWxsb2NhdGUgbWVtb3J5IGZvciBjbG9zdXJlcy4KIApAQCAtMzIsNyArMzMsNyBAQAogI2luY2x1ZGUgPGZmaS5oPgogI2luY2x1ZGUgPGZmaV9jb21tb24uaD4KIAotI2lmbmRlZiBGRklfTU1BUF9FWEVDX1dSSVQKKyNpZiAhRkZJX01NQVBfRVhFQ19XUklUICYmICFGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFCiAjIGlmIF9fZ251X2xpbnV4X18KIC8qIFRoaXMgbWFjcm8gaW5kaWNhdGVzIGl0IG1heSBiZSBmb3JiaWRkZW4gdG8gbWFwIGFub255bW91cyBtZW1vcnkKICAgIHdpdGggYm90aCB3cml0ZSBhbmQgZXhlY3V0ZSBwZXJtaXNzaW9uLiAgQ29kZSBjb21waWxlZCB3aGVuIHRoaXMKQEAgLTQ0LDcgKzQ1LDcgQEAKICMgIGRlZmluZSBGRklfTU1BUF9FWEVDX1dSSVQgMQogIyAgZGVmaW5lIEhBVkVfTU5URU5UIDEKICMgZW5kaWYKLSMgaWYgZGVmaW5lZChYODZfV0lOMzIpIHx8IGRlZmluZWQoWDg2X1dJTjY0KQorIyBpZiBkZWZpbmVkKFg4Nl9XSU4zMikgfHwgZGVmaW5lZChYODZfV0lONjQpIHx8IGRlZmluZWQoX19PUzJfXykKIC8qIFdpbmRvd3Mgc3lzdGVtcyBtYXkgaGF2ZSBEYXRhIEV4ZWN1dGlvbiBQcm90ZWN0aW9uIChERVApIGVuYWJsZWQsIAogICAgd2hpY2ggcmVxdWlyZXMgdGhlIHVzZSBvZiBWaXJ0dWFsTWFsbG9jL1ZpcnR1YWxGcmVlIHRvIGFsbG9jL2ZyZWUKICAgIGV4ZWN1dGFibGUgbWVtb3J5LiAqLwpAQCAtNjMsNyArNjQsMTEgQEAKIAogI2lmIEZGSV9DTE9TVVJFUwogCi0jIGlmIEZGSV9NTUFQX0VYRUNfV1JJVAorIyBpZiBGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFCisKKy8vIFBlci10YXJnZXQgaW1wbGVtZW50YXRpb247IEl0J3MgdW5jbGVhciB3aGF0IGNhbiByZWFzb25hYmxlIGJlIHNoYXJlZCBiZXR3ZWVuIHR3byBPUy9hcmNoaXRlY3R1cmUgaW1wbGVtZW50YXRpb25zLgorCisjIGVsaWYgRkZJX01NQVBfRVhFQ19XUklUIC8qICFGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFICovCiAKICNkZWZpbmUgVVNFX0xPQ0tTIDEKICNkZWZpbmUgVVNFX0RMX1BSRUZJWCAxCkBAIC0xNDYsNyArMTUxLDcgQEAKICAgICAgIHAgPSBzdHJjaHIgKHAgKyAxLCAnICcpOwogICAgICAgaWYgKHAgPT0gTlVMTCkKICAgICAgICAgYnJlYWs7Ci0gICAgICBpZiAoc3RybmNtcCAocCArIDEsICJzZWxpbnV4ZnMgIiwgMTApICE9IDApCisgICAgICBpZiAoc3RybmNtcCAocCArIDEsICJzZWxpbnV4ZnMgIiwgMTApID09IDApCiAgICAgICAgIHsKICAgICAgICAgICBmcmVlIChidWYpOwogICAgICAgICAgIGZjbG9zZSAoZik7CkBAIC0xNjcsNyArMTcyLDI2IEBACiAKICNlbmRpZiAvKiAhRkZJX01NQVBfRVhFQ19TRUxJTlVYICovCiAKLSNlbGlmIGRlZmluZWQgKF9fQ1lHV0lOX18pCisvKiBPbiBQYVggZW5hYmxlIGtlcm5lbHMgdGhhdCBoYXZlIE1QUk9URUNUIGVuYWJsZSB3ZSBjYW4ndCB1c2UgUFJPVF9FWEVDLiAqLworI2lmZGVmIEZGSV9NTUFQX0VYRUNfRU1VVFJBTVBfUEFYCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3N0YXRpYyBpbnQgZW11dHJhbXBfZW5hYmxlZCA9IC0xOworCitzdGF0aWMgaW50CitlbXV0cmFtcF9lbmFibGVkX2NoZWNrICh2b2lkKQoreworICBpZiAoZ2V0ZW52ICgiRkZJX0RJU0FCTEVfRU1VVFJBTVAiKSA9PSBOVUxMKQorICAgIHJldHVybiAxOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgaXNfZW11dHJhbXBfZW5hYmxlZCgpIChlbXV0cmFtcF9lbmFibGVkID49IDAgPyBlbXV0cmFtcF9lbmFibGVkIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChlbXV0cmFtcF9lbmFibGVkID0gZW11dHJhbXBfZW5hYmxlZF9jaGVjayAoKSkpCisjZW5kaWYgLyogRkZJX01NQVBfRVhFQ19FTVVUUkFNUF9QQVggKi8KKworI2VsaWYgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfX0lOVEVSSVgpCiAKICNpbmNsdWRlIDxzeXMvbW1hbi5oPgogCkBAIC0xNzYsNiArMjAwLDEwIEBACiAKICNlbmRpZiAvKiAhZGVmaW5lZChYODZfV0lOMzIpICYmICFkZWZpbmVkKFg4Nl9XSU42NCkgKi8KIAorI2lmbmRlZiBGRklfTU1BUF9FWEVDX0VNVVRSQU1QX1BBWAorI2RlZmluZSBpc19lbXV0cmFtcF9lbmFibGVkKCkgMAorI2VuZGlmIC8qIEZGSV9NTUFQX0VYRUNfRU1VVFJBTVBfUEFYICovCisKIC8qIERlY2xhcmUgYWxsIGZ1bmN0aW9ucyBkZWZpbmVkIGluIGRsbWFsbG9jLmMgYXMgc3RhdGljLiAgKi8KIHN0YXRpYyB2b2lkICpkbG1hbGxvYyhzaXplX3QpOwogc3RhdGljIHZvaWQgZGxmcmVlKHZvaWQqKTsKQEAgLTE5MywxMSArMjIxLDExIEBACiBzdGF0aWMgc2l6ZV90IGRsbWFsbG9jX3VzYWJsZV9zaXplKHZvaWQqKSBNQVlCRV9VTlVTRUQ7CiBzdGF0aWMgdm9pZCBkbG1hbGxvY19zdGF0cyh2b2lkKSBNQVlCRV9VTlVTRUQ7CiAKLSNpZiAhKGRlZmluZWQoWDg2X1dJTjMyKSB8fCBkZWZpbmVkKFg4Nl9XSU42NCkpIHx8IGRlZmluZWQgKF9fQ1lHV0lOX18pCisjaWYgIShkZWZpbmVkKFg4Nl9XSU4zMikgfHwgZGVmaW5lZChYODZfV0lONjQpIHx8IGRlZmluZWQoX19PUzJfXykpIHx8IGRlZmluZWQgKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQoX19JTlRFUklYKQogLyogVXNlIHRoZXNlIGZvciBtbWFwIGFuZCBtdW5tYXAgd2l0aGluIGRsbWFsbG9jLmMuICAqLwogc3RhdGljIHZvaWQgKmRsbW1hcCh2b2lkICosIHNpemVfdCwgaW50LCBpbnQsIGludCwgb2ZmX3QpOwogc3RhdGljIGludCBkbG11bm1hcCh2b2lkICosIHNpemVfdCk7Ci0jZW5kaWYgLyogIShkZWZpbmVkKFg4Nl9XSU4zMikgfHwgZGVmaW5lZChYODZfV0lONjQpKSB8fCBkZWZpbmVkIChfX0NZR1dJTl9fKSAqLworI2VuZGlmIC8qICEoZGVmaW5lZChYODZfV0lOMzIpIHx8IGRlZmluZWQoWDg2X1dJTjY0KSB8fCBkZWZpbmVkKF9fT1MyX18pKSB8fCBkZWZpbmVkIChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9fSU5URVJJWCkgKi8KIAogI2RlZmluZSBtbWFwIGRsbW1hcAogI2RlZmluZSBtdW5tYXAgZGxtdW5tYXAKQEAgLTIwNyw3ICsyMzUsNyBAQAogI3VuZGVmIG1tYXAKICN1bmRlZiBtdW5tYXAKIAotI2lmICEoZGVmaW5lZChYODZfV0lOMzIpIHx8IGRlZmluZWQoWDg2X1dJTjY0KSkgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykKKyNpZiAhKGRlZmluZWQoWDg2X1dJTjMyKSB8fCBkZWZpbmVkKFg4Nl9XSU42NCkgfHwgZGVmaW5lZChfX09TMl9fKSkgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfX0lOVEVSSVgpCiAKIC8qIEEgbXV0ZXggdXNlZCB0byBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gKmV4ZWMqIHZhcmlhYmxlcyBpbiB0aGlzIGZpbGUuICAqLwogc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBvcGVuX3RlbXBfZXhlY19maWxlX211dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKQEAgLTI5NCw3ICszMjIsNyBAQAogICAgICAgc3RydWN0IG1udGVudCBtbnQ7CiAgICAgICBjaGFyIGJ1ZltNQVhQQVRITEVOICogM107CiAKLSAgICAgIGlmIChnZXRtbnRlbnRfciAobGFzdF9tbnRlbnQsICZtbnQsIGJ1Ziwgc2l6ZW9mIChidWYpKSkKKyAgICAgIGlmIChnZXRtbnRlbnRfciAobGFzdF9tbnRlbnQsICZtbnQsIGJ1Ziwgc2l6ZW9mIChidWYpKSA9PSBOVUxMKQogCXJldHVybiAtMTsKIAogICAgICAgaWYgKGhhc21udG9wdCAoJm1udCwgInJvIikKQEAgLTQ1Myw2ICs0ODEsMTIgQEAKICAgcHJpbnRmICgibWFwcGluZyBpbiAlemlcbiIsIGxlbmd0aCk7CiAjZW5kaWYKIAorICBpZiAoZXhlY2ZkID09IC0xICYmIGlzX2VtdXRyYW1wX2VuYWJsZWQgKCkpCisgICAgeworICAgICAgcHRyID0gbW1hcCAoc3RhcnQsIGxlbmd0aCwgcHJvdCAmIH5QUk9UX0VYRUMsIGZsYWdzLCBmZCwgb2Zmc2V0KTsKKyAgICAgIHJldHVybiBwdHI7CisgICAgfQorCiAgIGlmIChleGVjZmQgPT0gLTEgJiYgIWlzX3NlbGludXhfZW5hYmxlZCAoKSkKICAgICB7CiAgICAgICBwdHIgPSBtbWFwIChzdGFydCwgbGVuZ3RoLCBwcm90IHwgUFJPVF9FWEVDLCBmbGFncywgZmQsIG9mZnNldCk7CkBAIC01MjIsNyArNTU2LDcgQEAKIH0KICNlbmRpZgogCi0jZW5kaWYgLyogIShkZWZpbmVkKFg4Nl9XSU4zMikgfHwgZGVmaW5lZChYODZfV0lONjQpKSB8fCBkZWZpbmVkIChfX0NZR1dJTl9fKSAqLworI2VuZGlmIC8qICEoZGVmaW5lZChYODZfV0lOMzIpIHx8IGRlZmluZWQoWDg2X1dJTjY0KSB8fCBkZWZpbmVkKF9fT1MyX18pKSB8fCBkZWZpbmVkIChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9fSU5URVJJWCkgKi8KIAogLyogQWxsb2NhdGUgYSBjaHVuayBvZiBtZW1vcnkgd2l0aCB0aGUgZ2l2ZW4gc2l6ZS4gIFJldHVybnMgYSBwb2ludGVyCiAgICB0byB0aGUgd3JpdGFibGUgYWRkcmVzcywgYW5kIHNldHMgKkNPREUgdG8gdGhlIGV4ZWN1dGFibGUKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2NyaXMvZmZpLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9jcmlzL2ZmaS5jCmluZGV4IGU5YzM5NTMuLmFhY2E1YjEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2NyaXMvZmZpLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvY3Jpcy9mZmkuYwpAQCAtMTUzLDIxICsxNTMsMjQgQEAKICAgcmV0dXJuIChzdHJ1Y3RfY291bnQpOwogfQogCi1mZmlfc3RhdHVzCi1mZmlfcHJlcF9jaWYgKGZmaV9jaWYgKiBjaWYsCi0JICAgICAgZmZpX2FiaSBhYmksIHVuc2lnbmVkIGludCBuYXJncywKLQkgICAgICBmZmlfdHlwZSAqIHJ0eXBlLCBmZmlfdHlwZSAqKiBhdHlwZXMpCitmZmlfc3RhdHVzIEZGSV9ISURERU4KK2ZmaV9wcmVwX2NpZl9jb3JlIChmZmlfY2lmICogY2lmLAorCSAgICAgICAgICAgZmZpX2FiaSBhYmksIHVuc2lnbmVkIGludCBpc3ZhcmlhZGljLAorCQkgICB1bnNpZ25lZCBpbnQgbmZpeGVkYXJncywgdW5zaWduZWQgaW50IG50b3RhbGFyZ3MsCisJICAgICAgICAgICBmZmlfdHlwZSAqIHJ0eXBlLCBmZmlfdHlwZSAqKiBhdHlwZXMpCiB7CiAgIHVuc2lnbmVkIGJ5dGVzID0gMDsKICAgdW5zaWduZWQgaW50IGk7CiAgIGZmaV90eXBlICoqcHRyOwogCiAgIEZGSV9BU1NFUlQgKGNpZiAhPSBOVUxMKTsKLSAgRkZJX0FTU0VSVCAoKGFiaSA+IEZGSV9GSVJTVF9BQkkpICYmIChhYmkgPD0gRkZJX0RFRkFVTFRfQUJJKSk7CisgIEZGSV9BU1NFUlQoKCFpc3ZhcmlhZGljKSB8fCAobmZpeGVkYXJncyA+PSAxKSk7CisgIEZGSV9BU1NFUlQobmZpeGVkYXJncyA8PSBudG90YWxhcmdzKTsKKyAgRkZJX0FTU0VSVCAoYWJpID4gRkZJX0ZJUlNUX0FCSSAmJiBhYmkgPCBGRklfTEFTVF9BQkkpOwogCiAgIGNpZi0+YWJpID0gYWJpOwogICBjaWYtPmFyZ190eXBlcyA9IGF0eXBlczsKLSAgY2lmLT5uYXJncyA9IG5hcmdzOworICBjaWYtPm5hcmdzID0gbnRvdGFsYXJnczsKICAgY2lmLT5ydHlwZSA9IHJ0eXBlOwogCiAgIGNpZi0+ZmxhZ3MgPSAwOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvY3Jpcy9mZml0YXJnZXQuaCBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2NyaXMvZmZpdGFyZ2V0LmgKaW5kZXggNDI1N2YxMC4uYjgzN2U5NyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvY3Jpcy9mZml0YXJnZXQuaAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9jcmlzL2ZmaXRhcmdldC5oCkBAIC0xLDUgKzEsNiBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLUMtKi0KLSAgIGZmaXRhcmdldC5oIC0gQ29weXJpZ2h0IChjKSAxOTk2LTIwMDMgIFJlZCBIYXQsIEluYy4KKyAgIGZmaXRhcmdldC5oIC0gQ29weXJpZ2h0IChjKSAyMDEyICBBbnRob255IEdyZWVuCisgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMTk5Ni0yMDAzICBSZWQgSGF0LCBJbmMuCiAgICBUYXJnZXQgY29uZmlndXJhdGlvbiBtYWNyb3MgZm9yIENSSVMuCiAKICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwpAQCAtMjcsNiArMjgsMTAgQEAKICNpZm5kZWYgTElCRkZJX1RBUkdFVF9ICiAjZGVmaW5lIExJQkZGSV9UQVJHRVRfSAogCisjaWZuZGVmIExJQkZGSV9ICisjZXJyb3IgIlBsZWFzZSBkbyBub3QgaW5jbHVkZSBmZml0YXJnZXQuaCBkaXJlY3RseSBpbnRvIHlvdXIgc291cmNlLiAgVXNlIGZmaS5oIGluc3RlYWQuIgorI2VuZGlmCisKICNpZm5kZWYgTElCRkZJX0FTTQogdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgICAgIGZmaV9hcmc7CiB0eXBlZGVmIHNpZ25lZCBsb25nICAgICAgICAgICAgZmZpX3Nhcmc7CkBAIC0zNCw4ICszOSw4IEBACiB0eXBlZGVmIGVudW0gZmZpX2FiaSB7CiAgIEZGSV9GSVJTVF9BQkkgPSAwLAogICBGRklfU1lTViwKLSAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX1NZU1YsCi0gIEZGSV9MQVNUX0FCSSA9IEZGSV9ERUZBVUxUX0FCSSArIDEKKyAgRkZJX0xBU1RfQUJJLAorICBGRklfREVGQVVMVF9BQkkgPSBGRklfU1lTVgogfSBmZmlfYWJpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2RsbWFsbG9jLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9kbG1hbGxvYy5jCmluZGV4IDU4MmRkYzMuLjI3NzM5NTMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2RsbWFsbG9jLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvZGxtYWxsb2MuYwpAQCAtNDY0LDYgKzQ2NCwxNCBAQAogI2RlZmluZSBfR05VX1NPVVJDRSAxCiAjZW5kaWYgIC8qIFdJTjMyICovCiAKKyNpZmRlZiBfX09TMl9fCisjZGVmaW5lIElOQ0xfRE9TCisjaW5jbHVkZSA8b3MyLmg+CisjZGVmaW5lIEhBVkVfTU1BUCAxCisjZGVmaW5lIEhBVkVfTU9SRUNPUkUgMAorI2RlZmluZSBMQUNLU19TWVNfTU1BTl9ICisjZW5kaWYgIC8qIF9fT1MyX18gKi8KKwogI2lmIGRlZmluZWQoREFSV0lOKSB8fCBkZWZpbmVkKF9EQVJXSU4pCiAvKiBNYWMgT1NYIGRvY3MgYWR2aXNlIG5vdCB0byB1c2Ugc2JyazsgaXQgc2VlbXMgYmV0dGVyIHRvIHVzZSBtbWFwICovCiAjaWZuZGVmIEhBVkVfTU9SRUNPUkUKQEAgLTYxOSw2ICs2MjcsOSBAQAogI2luY2x1ZGUgIi91c3IvaW5jbHVkZS9tYWxsb2MuaCIKICNlbHNlIC8qIEhBVkVfVVNSX0lOQ0xVREVfTUFMTE9DX0ggKi8KIAorLyogSFAtVVgncyBzdGRsaWIuaCByZWRlZmluZXMgbWFsbGluZm8gdW5sZXNzIF9TVFJVQ1RfTUFMTElORk8gaXMgZGVmaW5lZCAqLworI2RlZmluZSBfU1RSVUNUX01BTExJTkZPCisKIHN0cnVjdCBtYWxsaW5mbyB7CiAgIE1BTExJTkZPX0ZJRUxEX1RZUEUgYXJlbmE7ICAgIC8qIG5vbi1tbWFwcGVkIHNwYWNlIGFsbG9jYXRlZCBmcm9tIHN5c3RlbSAqLwogICBNQUxMSU5GT19GSUVMRF9UWVBFIG9yZGJsa3M7ICAvKiBudW1iZXIgb2YgZnJlZSBjaHVua3MgKi8KQEAgLTEyOTMsNyArMTMwNCw3IEBACiAjZGVmaW5lIElTX01NQVBQRURfQklUICAgICAgIChTSVpFX1RfT05FKQogI2RlZmluZSBVU0VfTU1BUF9CSVQgICAgICAgICAoU0laRV9UX09ORSkKIAotI2lmbmRlZiBXSU4zMgorI2lmICFkZWZpbmVkKFdJTjMyKSAmJiAhZGVmaW5lZCAoX19PUzJfXykKICNkZWZpbmUgQ0FMTF9NVU5NQVAoYSwgcykgICAgbXVubWFwKChhKSwgKHMpKQogI2RlZmluZSBNTUFQX1BST1QgICAgICAgICAgICAoUFJPVF9SRUFEfFBST1RfV1JJVEUpCiAjaWYgIWRlZmluZWQoTUFQX0FOT05ZTU9VUykgJiYgZGVmaW5lZChNQVBfQU5PTikKQEAgLTEzMTYsNiArMTMyNyw0MiBAQAogI2VuZGlmIC8qIE1BUF9BTk9OWU1PVVMgKi8KIAogI2RlZmluZSBESVJFQ1RfTU1BUChzKSAgICAgICBDQUxMX01NQVAocykKKworI2VsaWYgZGVmaW5lZChfX09TMl9fKQorCisvKiBPUy8yIE1NQVAgdmlhIERvc0FsbG9jTWVtICovCitzdGF0aWMgdm9pZCogb3MybW1hcChzaXplX3Qgc2l6ZSkgeworICB2b2lkKiBwdHI7CisgIGlmIChEb3NBbGxvY01lbSgmcHRyLCBzaXplLCBPQkpfQU5ZfFBBR19DT01NSVR8UEFHX1JFQUR8UEFHX1dSSVRFKSAmJgorICAgICAgRG9zQWxsb2NNZW0oJnB0ciwgc2l6ZSwgUEFHX0NPTU1JVHxQQUdfUkVBRHxQQUdfV1JJVEUpKQorICAgIHJldHVybiBNRkFJTDsKKyAgcmV0dXJuIHB0cjsKK30KKworI2RlZmluZSBvczJkaXJlY3RfbW1hcChuKSAgICAgb3MybW1hcChuKQorCisvKiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIHJlbGVhc2luZyBjb2FsZXNlZCBzZWdtZW50cyAqLworc3RhdGljIGludCBvczJtdW5tYXAodm9pZCogcHRyLCBzaXplX3Qgc2l6ZSkgeworICB3aGlsZSAoc2l6ZSkgeworICAgIFVMT05HIHVsU2l6ZSA9IHNpemU7CisgICAgVUxPTkcgdWxGbGFncyA9IDA7CisgICAgaWYgKERvc1F1ZXJ5TWVtKHB0ciwgJnVsU2l6ZSwgJnVsRmxhZ3MpICE9IDApCisgICAgICByZXR1cm4gLTE7CisgICAgaWYgKCh1bEZsYWdzICYgUEFHX0JBU0UpID09IDAgfHwodWxGbGFncyAmIFBBR19DT01NSVQpID09IDAgfHwKKyAgICAgICAgdWxTaXplID4gc2l6ZSkKKyAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoRG9zRnJlZU1lbShwdHIpICE9IDApCisgICAgICByZXR1cm4gLTE7CisgICAgcHRyID0gKCB2b2lkICogKSAoICggY2hhciAqICkgcHRyICsgdWxTaXplICk7CisgICAgc2l6ZSAtPSB1bFNpemU7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQ0FMTF9NTUFQKHMpICAgICAgICAgb3MybW1hcChzKQorI2RlZmluZSBDQUxMX01VTk1BUChhLCBzKSAgICBvczJtdW5tYXAoKGEpLCAocykpCisjZGVmaW5lIERJUkVDVF9NTUFQKHMpICAgICAgIG9zMmRpcmVjdF9tbWFwKHMpCisKICNlbHNlIC8qIFdJTjMyICovCiAKIC8qIFdpbjMyIE1NQVAgdmlhIFZpcnR1YWxBbGxvYyAqLwpAQCAtMTM5Miw3ICsxNDM5LDcgQEAKICAgICB1bmlxdWUgbXBhcmFtcyB2YWx1ZXMgYXJlIGluaXRpYWxpemVkIG9ubHkgb25jZS4KICovCiAKLSNpZm5kZWYgV0lOMzIKKyNpZiAhZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoX19PUzJfXykKIC8qIEJ5IGRlZmF1bHQgdXNlIHBvc2l4IGxvY2tzICovCiAjaW5jbHVkZSA8cHRocmVhZC5oPgogI2RlZmluZSBNTE9DS19UIHB0aHJlYWRfbXV0ZXhfdApAQCAtMTQwNiw2ICsxNDUzLDE2IEBACiAKIHN0YXRpYyBNTE9DS19UIG1hZ2ljX2luaXRfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwogCisjZWxpZiBkZWZpbmVkKF9fT1MyX18pCisjZGVmaW5lIE1MT0NLX1QgSE1UWAorI2RlZmluZSBJTklUSUFMX0xPQ0sobCkgICAgICBEb3NDcmVhdGVNdXRleFNlbSgwLCBsLCAwLCBGQUxTRSkKKyNkZWZpbmUgQUNRVUlSRV9MT0NLKGwpICAgICAgRG9zUmVxdWVzdE11dGV4U2VtKCpsLCBTRU1fSU5ERUZJTklURV9XQUlUKQorI2RlZmluZSBSRUxFQVNFX0xPQ0sobCkgICAgICBEb3NSZWxlYXNlTXV0ZXhTZW0oKmwpCisjaWYgSEFWRV9NT1JFQ09SRQorc3RhdGljIE1MT0NLX1QgbW9yZWNvcmVfbXV0ZXg7CisjZW5kaWYgLyogSEFWRV9NT1JFQ09SRSAqLworc3RhdGljIE1MT0NLX1QgbWFnaWNfaW5pdF9tdXRleDsKKwogI2Vsc2UgLyogV0lOMzIgKi8KIC8qCiAgICBCZWNhdXNlIGxvY2stcHJvdGVjdGVkIHJlZ2lvbnMgaGF2ZSBib3VuZGVkIHRpbWVzLCBhbmQgdGhlcmUKQEAgLTI0OTcsMTAgKzI1NTQsMTUgQEAKICAgICB9CiAgICAgUkVMRUFTRV9NQUdJQ19JTklUX0xPQ0soKTsKIAotI2lmbmRlZiBXSU4zMgorI2lmICFkZWZpbmVkKFdJTjMyKSAmJiAhZGVmaW5lZChfX09TMl9fKQogICAgIG1wYXJhbXMucGFnZV9zaXplID0gbWFsbG9jX2dldHBhZ2VzaXplOwogICAgIG1wYXJhbXMuZ3JhbnVsYXJpdHkgPSAoKERFRkFVTFRfR1JBTlVMQVJJVFkgIT0gMCk/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0dSQU5VTEFSSVRZIDogbXBhcmFtcy5wYWdlX3NpemUpOworI2VsaWYgZGVmaW5lZCAoX19PUzJfXykKKyAvKiBpZiBsb3ctbWVtb3J5IGlzIHVzZWQsIG9zMm11bm1hcCgpIHdvdWxkIGJyZWFrCisgICAgaWYgaXQgd2VyZSBhbnl0aGluZyBvdGhlciB0aGFuIDY0ayAqLworICAgIG1wYXJhbXMucGFnZV9zaXplID0gNDA5NnU7CisgICAgbXBhcmFtcy5ncmFudWxhcml0eSA9IDY1NTM2dTsKICNlbHNlIC8qIFdJTjMyICovCiAgICAgewogICAgICAgU1lTVEVNX0lORk8gc3lzdGVtX2luZm87CkBAIC00MTk3LDcgKzQyNTksNyBAQAogCiB2b2lkIGRsZnJlZSh2b2lkKiBtZW0pIHsKICAgLyoKLSAgICAgQ29uc29saWRhdGUgZnJlZWQgY2h1bmtzIHdpdGggcHJlY2VlZGluZyBvciBzdWNjZWVkaW5nIGJvcmRlcmluZworICAgICBDb25zb2xpZGF0ZSBmcmVlZCBjaHVua3Mgd2l0aCBwcmVjZWRpbmcgb3Igc3VjY2VlZGluZyBib3JkZXJpbmcKICAgICAgZnJlZSBjaHVua3MsIGlmIHRoZXkgZXhpc3QsIGFuZCB0aGVuIHBsYWNlIGluIGEgYmluLiAgSW50ZXJtaXhlZAogICAgICB3aXRoIHNwZWNpYWwgY2FzZXMgZm9yIHRvcCwgZHYsIG1tYXBwZWQgY2h1bmtzLCBhbmQgdXNhZ2UgZXJyb3JzLgogICAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvZnJ2L2ZmaXRhcmdldC5oIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvZnJ2L2ZmaXRhcmdldC5oCmluZGV4IDFjMzE5ZWEuLmQ0MjU0MGUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2Zydi9mZml0YXJnZXQuaAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9mcnYvZmZpdGFyZ2V0LmgKQEAgLTEsNSArMSw2IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotQy0qLQotICAgZmZpdGFyZ2V0LmggLSBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwNCAgUmVkIEhhdCwgSW5jLgorICAgZmZpdGFyZ2V0LmggLSBDb3B5cmlnaHQgKGMpIDIwMTIgIEFudGhvbnkgR3JlZW4KKyAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAxOTk2LTIwMDQgIFJlZCBIYXQsIEluYy4KICAgIFRhcmdldCBjb25maWd1cmF0aW9uIG1hY3JvcyBmb3IgRlItVgogCiAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKQEAgLTI3LDYgKzI4LDEwIEBACiAjaWZuZGVmIExJQkZGSV9UQVJHRVRfSAogI2RlZmluZSBMSUJGRklfVEFSR0VUX0gKIAorI2lmbmRlZiBMSUJGRklfSAorI2Vycm9yICJQbGVhc2UgZG8gbm90IGluY2x1ZGUgZmZpdGFyZ2V0LmggZGlyZWN0bHkgaW50byB5b3VyIHNvdXJjZS4gIFVzZSBmZmkuaCBpbnN0ZWFkLiIKKyNlbmRpZgorCiAvKiAtLS0tIFN5c3RlbSBzcGVjaWZpYyBjb25maWd1cmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAjaWZuZGVmIExJQkZGSV9BU00KQEAgLTM1LDEzICs0MCw5IEBACiAKIHR5cGVkZWYgZW51bSBmZmlfYWJpIHsKICAgRkZJX0ZJUlNUX0FCSSA9IDAsCi0KLSNpZmRlZiBGUlYKICAgRkZJX0VBQkksCi0gIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9FQUJJLAotI2VuZGlmCi0KLSAgRkZJX0xBU1RfQUJJID0gRkZJX0RFRkFVTFRfQUJJICsgMQorICBGRklfTEFTVF9BQkksCisgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9FQUJJCiB9IGZmaV9hYmk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvaWE2NC9mZmkuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2lhNjQvZmZpLmMKaW5kZXggM2Y4ZmNjNS4uOTUzM2VmNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvaWE2NC9mZmkuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9pYTY0L2ZmaS5jCkBAIC0xLDYgKzEsNyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIGZmaS5jIC0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA3LCAyMDA4IFJlZCBIYXQsIEluYy4KKyAgIGZmaS5jIC0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA3LCAyMDA4LCAyMDEyIFJlZCBIYXQsIEluYy4KIAkgICBDb3B5cmlnaHQgKGMpIDIwMDAgSGV3bGV0dCBQYWNrYXJkIENvbXBhbnkKKwkgICBDb3B5cmlnaHQgKGMpIDIwMTEgQW50aG9ueSBHcmVlbgogICAgCiAgICBJQTY0IEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlIAogCkBAIC0yMjUsNyArMjI2LDcgQEAKICAgaW50IGZsYWdzOwogCiAgIC8qIEFkanVzdCBjaWYtPmJ5dGVzIHRvIGluY2x1ZGUgc3BhY2UgZm9yIHRoZSBiaXRzIG9mIHRoZSBpYTY0X2FyZ3MgZnJhbWUKLSAgICAgdGhhdCBwcmVjZWVkcyB0aGUgaW50ZWdlciByZWdpc3RlciBwb3J0aW9uLiAgVGhlIGVzdGltYXRlIHRoYXQgdGhlIAorICAgICB0aGF0IHByZWNlZGVzIHRoZSBpbnRlZ2VyIHJlZ2lzdGVyIHBvcnRpb24uICBUaGUgZXN0aW1hdGUgdGhhdCB0aGUKICAgICAgZ2VuZXJpYyBiaXRzIGRpZCBmb3IgdGhlIGFyZ3VtZW50IHNwYWNlIHJlcXVpcmVkIGlzIGdvb2QgZW5vdWdoIGZvciB0aGUKICAgICAgaW50ZWdlciBjb21wb25lbnQuICAqLwogICBjaWYtPmJ5dGVzICs9IG9mZnNldG9mKHN0cnVjdCBpYTY0X2FyZ3MsIGdwX3JlZ3NbMF0pOwpAQCAtMzI0LDEzICszMjUsMTcgQEAKIAljYXNlIEZGSV9UWVBFX0ZMT0FUOgogCSAgaWYgKGdwY291bnQgPCA4ICYmIGZwY291bnQgPCA4KQogCSAgICBzdGZfc3BpbGwgKCZzdGFjay0+ZnBfcmVnc1tmcGNvdW50KytdLCAqKGZsb2F0ICopYXZhbHVlW2ldKTsKLQkgIHN0YWNrLT5ncF9yZWdzW2dwY291bnQrK10gPSAqKFVJTlQzMiAqKWF2YWx1ZVtpXTsKKwkgIHsKKwkgICAgVUlOVDMyIHRtcDsKKwkgICAgbWVtY3B5ICgmdG1wLCBhdmFsdWVbaV0sIHNpemVvZiAoVUlOVDMyKSk7CisJICAgIHN0YWNrLT5ncF9yZWdzW2dwY291bnQrK10gPSB0bXA7CisJICB9CiAJICBicmVhazsKIAogCWNhc2UgRkZJX1RZUEVfRE9VQkxFOgogCSAgaWYgKGdwY291bnQgPCA4ICYmIGZwY291bnQgPCA4KQogCSAgICBzdGZfc3BpbGwgKCZzdGFjay0+ZnBfcmVnc1tmcGNvdW50KytdLCAqKGRvdWJsZSAqKWF2YWx1ZVtpXSk7Ci0JICBzdGFjay0+Z3BfcmVnc1tncGNvdW50KytdID0gKihVSU5UNjQgKilhdmFsdWVbaV07CisJICBtZW1jcHkgKCZzdGFjay0+Z3BfcmVnc1tncGNvdW50KytdLCBhdmFsdWVbaV0sIHNpemVvZiAoVUlOVDY0KSk7CiAJICBicmVhazsKIAogCWNhc2UgRkZJX1RZUEVfTE9OR0RPVUJMRToKQEAgLTQyNSw3ICs0MzAsOCBAQAogICBzdHJ1Y3QgZmZpX2lhNjRfdHJhbXBvbGluZV9zdHJ1Y3QgKnRyYW1wOwogICBzdHJ1Y3QgaWE2NF9mZCAqZmQ7CiAKLSAgRkZJX0FTU0VSVCAoY2lmLT5hYmkgPT0gRkZJX1VOSVgpOworICBpZiAoY2lmLT5hYmkgIT0gRkZJX1VOSVgpCisgICAgcmV0dXJuIEZGSV9CQURfQUJJOwogCiAgIHRyYW1wID0gKHN0cnVjdCBmZmlfaWE2NF90cmFtcG9saW5lX3N0cnVjdCAqKWNsb3N1cmUtPnRyYW1wOwogICBmZCA9IChzdHJ1Y3QgaWE2NF9mZCAqKSh2b2lkICopZmZpX2Nsb3N1cmVfdW5peDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2lhNjQvZmZpdGFyZ2V0LmggYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9pYTY0L2ZmaXRhcmdldC5oCmluZGV4IGQ4NWMwNDkuLmU2OGNlYTYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2lhNjQvZmZpdGFyZ2V0LmgKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvaWE2NC9mZml0YXJnZXQuaApAQCAtMSw1ICsxLDYgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi1DLSotCi0gICBmZml0YXJnZXQuaCAtIENvcHlyaWdodCAoYykgMTk5Ni0yMDAzICBSZWQgSGF0LCBJbmMuCisgICBmZml0YXJnZXQuaCAtIENvcHlyaWdodCAoYykgMjAxMiAgQW50aG9ueSBHcmVlbgorICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMyAgUmVkIEhhdCwgSW5jLgogICAgVGFyZ2V0IGNvbmZpZ3VyYXRpb24gbWFjcm9zIGZvciBJQS02NC4KIAogICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCkBAIC0yNyw2ICsyOCwxMCBAQAogI2lmbmRlZiBMSUJGRklfVEFSR0VUX0gKICNkZWZpbmUgTElCRkZJX1RBUkdFVF9ICiAKKyNpZm5kZWYgTElCRkZJX0gKKyNlcnJvciAiUGxlYXNlIGRvIG5vdCBpbmNsdWRlIGZmaXRhcmdldC5oIGRpcmVjdGx5IGludG8geW91ciBzb3VyY2UuICBVc2UgZmZpLmggaW5zdGVhZC4iCisjZW5kaWYKKwogI2lmbmRlZiBMSUJGRklfQVNNCiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyAgICAgICAgICBmZmlfYXJnOwogdHlwZWRlZiBzaWduZWQgbG9uZyBsb25nICAgICAgICAgICAgZmZpX3Nhcmc7CkBAIC0zNCw4ICszOSw4IEBACiB0eXBlZGVmIGVudW0gZmZpX2FiaSB7CiAgIEZGSV9GSVJTVF9BQkkgPSAwLAogICBGRklfVU5JWCwgICAJLyogTGludXggYW5kIGFsbCBVbml4IHZhcmlhbnRzIHVzZSB0aGUgc2FtZSBjb252ZW50aW9ucwkqLwotICBGRklfREVGQVVMVF9BQkkgPSBGRklfVU5JWCwKLSAgRkZJX0xBU1RfQUJJID0gRkZJX0RFRkFVTFRfQUJJICsgMQorICBGRklfTEFTVF9BQkksCisgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9VTklYCiB9IGZmaV9hYmk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvamF2YV9yYXdfYXBpLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9qYXZhX3Jhd19hcGkuYwppbmRleCA5YzUzODNlLi41MjJjOGJmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9qYXZhX3Jhd19hcGkuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9qYXZhX3Jhd19hcGkuYwpAQCAtMzExLDcgKzMxMSw3IEBACiAgIGZmaV9yYXdfY2xvc3VyZSAqY2wgPSAoZmZpX3Jhd19jbG9zdXJlKil1c2VyX2RhdGE7CiAKICAgZmZpX2phdmFfcHRyYXJyYXlfdG9fcmF3IChjaWYsIGF2YWx1ZSwgcmF3KTsKLSAgKCpjbC0+ZnVuKSAoY2lmLCBydmFsdWUsIHJhdywgY2wtPnVzZXJfZGF0YSk7CisgICgqY2wtPmZ1bikgKGNpZiwgcnZhbHVlLCAoZmZpX3JhdyopcmF3LCBjbC0+dXNlcl9kYXRhKTsKICAgZmZpX2phdmFfcmF3X3RvX3J2YWx1ZSAoY2lmLCBydmFsdWUpOwogfQogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9tMzJyL2ZmaXRhcmdldC5oIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvbTMyci9mZml0YXJnZXQuaAppbmRleCA2YTc2MWY2Li42YzM0ODAxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9tMzJyL2ZmaXRhcmdldC5oCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL20zMnIvZmZpdGFyZ2V0LmgKQEAgLTEsNSArMSw2IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotQy0qLQotICAgZmZpdGFyZ2V0LmggLSBDb3B5cmlnaHQgKGMpIDIwMDQgIFJlbmVzYXMgVGVjaG5vbG9neS4KKyAgIGZmaXRhcmdldC5oIC0gQ29weXJpZ2h0IChjKSAyMDEyICBBbnRob255IEdyZWVuCisgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNCAgUmVuZXNhcyBUZWNobm9sb2d5LgogICAgVGFyZ2V0IGNvbmZpZ3VyYXRpb24gbWFjcm9zIGZvciBNMzJSLgogCiAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKQEAgLTI2LDYgKzI3LDEwIEBACiAjaWZuZGVmIExJQkZGSV9UQVJHRVRfSAogI2RlZmluZSBMSUJGRklfVEFSR0VUX0gKIAorI2lmbmRlZiBMSUJGRklfSAorI2Vycm9yICJQbGVhc2UgZG8gbm90IGluY2x1ZGUgZmZpdGFyZ2V0LmggZGlyZWN0bHkgaW50byB5b3VyIHNvdXJjZS4gIFVzZSBmZmkuaCBpbnN0ZWFkLiIKKyNlbmRpZgorCiAvKiAtLS0tIEdlbmVyaWMgdHlwZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAjaWZuZGVmIExJQkZGSV9BU00KQEAgLTM2LDggKzQxLDggQEAKICAgewogICAgIEZGSV9GSVJTVF9BQkkgPSAwLAogICAgIEZGSV9TWVNWLAotICAgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9TWVNWLAotICAgIEZGSV9MQVNUX0FCSSA9IEZGSV9ERUZBVUxUX0FCSSArIDEKKyAgICBGRklfTEFTVF9BQkksCisgICAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX1NZU1YKICAgfSBmZmlfYWJpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL202OGsvZmZpLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9tNjhrL2ZmaS5jCmluZGV4IDYwMGNmMjAuLjBkZWU5MzggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL202OGsvZmZpLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvbTY4ay9mZmkuYwpAQCAtMSw3ICsxLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmZmkuYwotICAgCi0gICBtNjhrIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlIAorCisgICBtNjhrIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAjaW5jbHVkZSA8ZmZpLmg+CkBAIC05LDggKzksMTcgQEAKIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2lmZGVmIF9fcnRlbXNfXwordm9pZCBydGVtc19jYWNoZV9mbHVzaF9tdWx0aXBsZV9kYXRhX2xpbmVzKCBjb25zdCB2b2lkICosIHNpemVfdCApOworI2Vsc2UKICNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2lmZGVmIF9fTUlOVF9fCisjaW5jbHVkZSA8bWludC9taW50YmluZC5oPgorI2luY2x1ZGUgPG1pbnQvc3N5c3RlbS5oPgorI2Vsc2UKICNpbmNsdWRlIDxhc20vY2FjaGVjdGwuaD4KKyNlbmRpZgorI2VuZGlmCiAKIHZvaWQgZmZpX2NhbGxfU1lTViAoZXh0ZW5kZWRfY2lmICosCiAJCSAgICB1bnNpZ25lZCwgdW5zaWduZWQsCkBAIC0zNSw4ICs0NCwxMiBAQAogCiAgIGFyZ3AgPSBzdGFjazsKIAotICBpZiAoZWNpZi0+Y2lmLT5ydHlwZS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QKLSAgICAgICYmICFlY2lmLT5jaWYtPmZsYWdzKQorICBpZiAoCisjaWZkZWYgX19NSU5UX18KKyAgICAgIChlY2lmLT5jaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX0xPTkdET1VCTEUpIHx8CisjZW5kaWYKKyAgICAgICgoKGVjaWYtPmNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKQorICAgICAgICAmJiAhZWNpZi0+Y2lmLT5mbGFncykpKQogICAgIHN0cnVjdF92YWx1ZV9wdHIgPSBlY2lmLT5ydmFsdWU7CiAgIGVsc2UKICAgICBzdHJ1Y3RfdmFsdWVfcHRyID0gTlVMTDsKQEAgLTQ3LDEyICs2MCwxMiBAQAogICAgICAgIGkgIT0gMDsKICAgICAgICBpLS0sIHBfYXJnKyspCiAgICAgewotICAgICAgc2l6ZV90IHo7CisgICAgICBzaXplX3QgeiA9ICgqcF9hcmcpLT5zaXplOworICAgICAgaW50IHR5cGUgPSAoKnBfYXJnKS0+dHlwZTsKIAotICAgICAgeiA9ICgqcF9hcmcpLT5zaXplOwogICAgICAgaWYgKHogPCBzaXplb2YgKGludCkpCiAJewotCSAgc3dpdGNoICgoKnBfYXJnKS0+dHlwZSkKKwkgIHN3aXRjaCAodHlwZSkKIAkgICAgewogCSAgICBjYXNlIEZGSV9UWVBFX1NJTlQ4OgogCSAgICAgICooc2lnbmVkIGludCAqKSBhcmdwID0gKHNpZ25lZCBpbnQpICooU0lOVDggKikgKnBfYXJndjsKQEAgLTcxLDcgKzg0LDE0IEBACiAJICAgICAgYnJlYWs7CiAKIAkgICAgY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisjaWZkZWYgX19NSU5UX18KKwkgICAgICBpZiAoeiA9PSAxIHx8IHogPT0gMikKKwkJbWVtY3B5IChhcmdwICsgMiwgKnBfYXJndiwgeik7CisgICAgICAgICAgICAgIGVsc2UKKwkJbWVtY3B5IChhcmdwLCAqcF9hcmd2LCB6KTsKKyNlbHNlCiAJICAgICAgbWVtY3B5IChhcmdwICsgc2l6ZW9mIChpbnQpIC0geiwgKnBfYXJndiwgeik7CisjZW5kaWYKIAkgICAgICBicmVhazsKIAogCSAgICBkZWZhdWx0OgpAQCAtMTAzLDYgKzEyMyw4IEBACiAjZGVmaW5lIENJRl9GTEFHU19QT0lOVEVSCTMyCiAjZGVmaW5lIENJRl9GTEFHU19TVFJVQ1QxCTY0CiAjZGVmaW5lIENJRl9GTEFHU19TVFJVQ1QyCTEyOAorI2RlZmluZSBDSUZfRkxBR1NfU0lOVDgJCTI1NgorI2RlZmluZSBDSUZfRkxBR1NfU0lOVDE2CTUxMgogCiAvKiBQZXJmb3JtIG1hY2hpbmUgZGVwZW5kZW50IGNpZiBwcm9jZXNzaW5nICovCiBmZmlfc3RhdHVzCkBAIC0xMTYsMTcgKzEzOCwzNCBAQAogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEZGSV9UWVBFX1NUUlVDVDoKKyAgICAgIGlmIChjaWYtPnJ0eXBlLT5lbGVtZW50c1swXS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QgJiYKKyAgICAgICAgICBjaWYtPnJ0eXBlLT5lbGVtZW50c1sxXSkKKyAgICAgICAgeworICAgICAgICAgIGNpZi0+ZmxhZ3MgPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgIHN3aXRjaCAoY2lmLT5ydHlwZS0+c2l6ZSkKIAl7CiAJY2FzZSAxOgorI2lmZGVmIF9fTUlOVF9fCisJICBjaWYtPmZsYWdzID0gQ0lGX0ZMQUdTX1NUUlVDVDI7CisjZWxzZQogCSAgY2lmLT5mbGFncyA9IENJRl9GTEFHU19TVFJVQ1QxOworI2VuZGlmCiAJICBicmVhazsKIAljYXNlIDI6CiAJICBjaWYtPmZsYWdzID0gQ0lGX0ZMQUdTX1NUUlVDVDI7CiAJICBicmVhazsKKyNpZmRlZiBfX01JTlRfXworCWNhc2UgMzoKKyNlbmRpZgogCWNhc2UgNDoKIAkgIGNpZi0+ZmxhZ3MgPSBDSUZfRkxBR1NfSU5UOwogCSAgYnJlYWs7CisjaWZkZWYgX19NSU5UX18KKwljYXNlIDc6CisjZW5kaWYKIAljYXNlIDg6CiAJICBjaWYtPmZsYWdzID0gQ0lGX0ZMQUdTX0RJTlQ7CiAJICBicmVhazsKQEAgLTE0NCw5ICsxODMsMTUgQEAKICAgICAgIGNpZi0+ZmxhZ3MgPSBDSUZfRkxBR1NfRE9VQkxFOwogICAgICAgYnJlYWs7CiAKKyNpZiAoRkZJX1RZUEVfTE9OR0RPVUJMRSAhPSBGRklfVFlQRV9ET1VCTEUpCiAgICAgY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFOgorI2lmZGVmIF9fTUlOVF9fCisgICAgICBjaWYtPmZsYWdzID0gMDsKKyNlbHNlCiAgICAgICBjaWYtPmZsYWdzID0gQ0lGX0ZMQUdTX0xET1VCTEU7CisjZW5kaWYKICAgICAgIGJyZWFrOworI2VuZGlmCiAKICAgICBjYXNlIEZGSV9UWVBFX1BPSU5URVI6CiAgICAgICBjaWYtPmZsYWdzID0gQ0lGX0ZMQUdTX1BPSU5URVI7CkBAIC0xNTcsNiArMjAyLDE0IEBACiAgICAgICBjaWYtPmZsYWdzID0gQ0lGX0ZMQUdTX0RJTlQ7CiAgICAgICBicmVhazsKIAorICAgIGNhc2UgRkZJX1RZUEVfU0lOVDE2OgorICAgICAgY2lmLT5mbGFncyA9IENJRl9GTEFHU19TSU5UMTY7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRkZJX1RZUEVfU0lOVDg6CisgICAgICBjaWYtPmZsYWdzID0gQ0lGX0ZMQUdTX1NJTlQ4OworICAgICAgYnJlYWs7CisKICAgICBkZWZhdWx0OgogICAgICAgY2lmLT5mbGFncyA9IENJRl9GTEFHU19JTlQ7CiAgICAgICBicmVhazsKQEAgLTIxMiw2ICsyNjUsMjYgQEAKICAgICAgIHNpemVfdCB6OwogCiAgICAgICB6ID0gKCpwX2FyZyktPnNpemU7CisjaWZkZWYgX19NSU5UX18KKyAgICAgIGlmIChjaWYtPmZsYWdzICYmCisgICAgICAgICAgY2lmLT5ydHlwZS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QgJiYKKyAgICAgICAgICAoeiA9PSAxIHx8IHogPT0gMikpCisgCXsKKwkgICpwX2FyZ3YgPSAodm9pZCAqKSAoYXJncCArIDIpOworCisJICB6ID0gNDsKKwl9CisgICAgICBlbHNlCisgICAgICBpZiAoY2lmLT5mbGFncyAmJgorICAgICAgICAgIGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUICYmCisgICAgICAgICAgKHogPT0gMyB8fCB6ID09IDQpKQorIAl7CisJICAqcF9hcmd2ID0gKHZvaWQgKikgKGFyZ3ApOworCisJICB6ID0gNDsKKwl9CisgICAgICBlbHNlCisjZW5kaWYKICAgICAgIGlmICh6IDw9IDQpCiAJewogCSAgKnBfYXJndiA9ICh2b2lkICopIChhcmdwICsgNCAtIHopOwpAQCAtMjU1LDE5ICszMjgsMzEgQEAKIAkJICAgICAgdm9pZCAqdXNlcl9kYXRhLAogCQkgICAgICB2b2lkICpjb2RlbG9jKQogewotICBGRklfQVNTRVJUIChjaWYtPmFiaSA9PSBGRklfU1lTVik7CisgIGlmIChjaWYtPmFiaSAhPSBGRklfU1lTVikKKyAgICByZXR1cm4gRkZJX0JBRF9BQkk7CiAKICAgKih1bnNpZ25lZCBzaG9ydCAqKWNsb3N1cmUtPnRyYW1wID0gMHgyMDdjOwogICAqKHZvaWQgKiopKGNsb3N1cmUtPnRyYW1wICsgMikgPSBjb2RlbG9jOwogICAqKHVuc2lnbmVkIHNob3J0ICopKGNsb3N1cmUtPnRyYW1wICsgNikgPSAweDRlZjk7Ci0gIGlmIChjaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVAotICAgICAgJiYgIWNpZi0+ZmxhZ3MpCisKKyAgaWYgKAorI2lmZGVmIF9fTUlOVF9fCisgICAgICAoY2lmLT5ydHlwZS0+dHlwZSA9PSBGRklfVFlQRV9MT05HRE9VQkxFKSB8fAorI2VuZGlmCisgICAgICAoKChjaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCkKKyAgICAgICAgICYmICFjaWYtPmZsYWdzKSkpCiAgICAgKih2b2lkICoqKShjbG9zdXJlLT50cmFtcCArIDgpID0gZmZpX2Nsb3N1cmVfc3RydWN0X1NZU1Y7CiAgIGVsc2UKICAgICAqKHZvaWQgKiopKGNsb3N1cmUtPnRyYW1wICsgOCkgPSBmZmlfY2xvc3VyZV9TWVNWOwogCisjaWZkZWYgX19ydGVtc19fCisgIHJ0ZW1zX2NhY2hlX2ZsdXNoX211bHRpcGxlX2RhdGFfbGluZXMoIGNvZGVsb2MsIEZGSV9UUkFNUE9MSU5FX1NJWkUgKTsKKyNlbGlmIGRlZmluZWQoX19NSU5UX18pCisgIFNzeXN0ZW0oU19GTFVTSENBQ0hFLCBjb2RlbG9jLCBGRklfVFJBTVBPTElORV9TSVpFKTsKKyNlbHNlCiAgIHN5c2NhbGwoU1lTX2NhY2hlZmx1c2gsIGNvZGVsb2MsIEZMVVNIX1NDT1BFX0xJTkUsCiAJICBGTFVTSF9DQUNIRV9CT1RILCBGRklfVFJBTVBPTElORV9TSVpFKTsKKyNlbmRpZgogCiAgIGNsb3N1cmUtPmNpZiAgPSBjaWY7CiAgIGNsb3N1cmUtPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKQEAgLTI3NSw0ICszNjAsMyBAQAogCiAgIHJldHVybiBGRklfT0s7CiB9Ci0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL202OGsvZmZpdGFyZ2V0LmggYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9tNjhrL2ZmaXRhcmdldC5oCmluZGV4IDYzMzcxN2IuLmU4MWRkZTIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL202OGsvZmZpdGFyZ2V0LmgKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvbTY4ay9mZml0YXJnZXQuaApAQCAtMSw1ICsxLDYgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi1DLSotCi0gICBmZml0YXJnZXQuaCAtIENvcHlyaWdodCAoYykgMTk5Ni0yMDAzICBSZWQgSGF0LCBJbmMuCisgICBmZml0YXJnZXQuaCAtIENvcHlyaWdodCAoYykgMjAxMiAgQW50aG9ueSBHcmVlbgorICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMyAgUmVkIEhhdCwgSW5jLgogICAgVGFyZ2V0IGNvbmZpZ3VyYXRpb24gbWFjcm9zIGZvciBNb3Rvcm9sYSA2OEsuCiAKICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwpAQCAtMjcsNiArMjgsMTAgQEAKICNpZm5kZWYgTElCRkZJX1RBUkdFVF9ICiAjZGVmaW5lIExJQkZGSV9UQVJHRVRfSAogCisjaWZuZGVmIExJQkZGSV9ICisjZXJyb3IgIlBsZWFzZSBkbyBub3QgaW5jbHVkZSBmZml0YXJnZXQuaCBkaXJlY3RseSBpbnRvIHlvdXIgc291cmNlLiAgVXNlIGZmaS5oIGluc3RlYWQuIgorI2VuZGlmCisKICNpZm5kZWYgTElCRkZJX0FTTQogdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgICAgIGZmaV9hcmc7CiB0eXBlZGVmIHNpZ25lZCBsb25nICAgICAgICAgICAgZmZpX3Nhcmc7CkBAIC0zNCw4ICszOSw4IEBACiB0eXBlZGVmIGVudW0gZmZpX2FiaSB7CiAgIEZGSV9GSVJTVF9BQkkgPSAwLAogICBGRklfU1lTViwKLSAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX1NZU1YsCi0gIEZGSV9MQVNUX0FCSSA9IEZGSV9ERUZBVUxUX0FCSSArIDEKKyAgRkZJX0xBU1RfQUJJLAorICBGRklfREVGQVVMVF9BQkkgPSBGRklfU1lTVgogfSBmZmlfYWJpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL202OGsvc3lzdi5TIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvbTY4ay9zeXN2LlMKaW5kZXggNTg4MjJlMC4uZWMyYjE0ZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvbTY4ay9zeXN2LlMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvbTY4ay9zeXN2LlMKQEAgLTEsOCArMSwxMSBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIHN5c3YuUyAtIENvcHlyaWdodCAoYykgMTk5OCBBbmRyZWFzIFNjaHdhYgotCSAgICBDb3B5cmlnaHQgKGMpIDIwMDggUmVkIEhhdCwgSW5jLiAKLSAgIAotICAgbTY4ayBGb3JlaWduIEZ1bmN0aW9uIEludGVyZmFjZSAKKwkKKyAgIHN5c3YuUyAtIENvcHlyaWdodCAoYykgMjAxMiBBbGFuIEhvdXJpaGFuZQorCSAgICBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTIgQW5kcmVhcyBTY2h3YWIKKwkgICAgQ29weXJpZ2h0IChjKSAyMDA4IFJlZCBIYXQsIEluYy4KKwkgICAgQ29weXJpZ2h0IChjKSAyMDEyIFRob3JzdGVuIEdsYXNlcgorCisgICBtNjhrIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlCiAKICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCkBAIC00MSwxMyArNDQsMTkgQEAKICNkZWZpbmUgQ0ZJX0VORFBST0MoKQogI2VuZGlmCiAKKyNpZmRlZiBfX01JTlRfXworI2RlZmluZSBDQUxMRlVOQyhmdW5jbmFtZSkgXyAjIyBmdW5jbmFtZQorI2Vsc2UKKyNkZWZpbmUgQ0FMTEZVTkMoZnVuY25hbWUpIGZ1bmNuYW1lCisjZW5kaWYKKwogCS50ZXh0CiAKLQkuZ2xvYmwJZmZpX2NhbGxfU1lTVgotCS50eXBlCWZmaV9jYWxsX1NZU1YsQGZ1bmN0aW9uCisJLmdsb2JsCUNBTExGVU5DKGZmaV9jYWxsX1NZU1YpCisJLnR5cGUJQ0FMTEZVTkMoZmZpX2NhbGxfU1lTViksQGZ1bmN0aW9uCiAJLmFsaWduCTQKIAotZmZpX2NhbGxfU1lTVjoKK0NBTExGVU5DKGZmaV9jYWxsX1NZU1YpOgogCUNGSV9TVEFSVFBST0MoKQogCWxpbmsJJWZwLCMwCiAJQ0ZJX09GRlNFVCgxNCwtOCkKQEAgLTYyLDE0ICs3MSwxOCBAQAogCW1vdmUubAk4KCVmcCksLSglc3ApCiAJcGVhCTQoJXNwKQogI2lmICFkZWZpbmVkIF9fUElDX18KLQlqc3IJZmZpX3ByZXBfYXJncworCWpzcglDQUxMRlVOQyhmZmlfcHJlcF9hcmdzKQogI2Vsc2UKLQlic3IubAlmZmlfcHJlcF9hcmdzQFBMVFBDCisJYnNyLmwJQ0FMTEZVTkMoZmZpX3ByZXBfYXJnc0BQTFRQQykKICNlbmRpZgogCWFkZHEubAkjOCwlc3AJCiAKIAl8IFBhc3MgcG9pbnRlciB0byBzdHJ1Y3QgdmFsdWUsIGlmIGFueQorI2lmZGVmIF9fTUlOVF9fCisJbW92ZS5sCSVkMCwlYTEKKyNlbHNlCiAJbW92ZS5sCSVhMCwlYTEKKyNlbmRpZgogCiAJfCBDYWxsIHRoZSBmdW5jdGlvbgogCW1vdmUubAkyNCglZnApLCVhMApAQCAtODUsNyArOTgsMTIgQEAKIAltb3ZlLmwJMTYoJWZwKSwlZDIKIAogCXwgSWYgdGhlIHJldHVybiB2YWx1ZSBwb2ludGVyIGlzIE5VTEwsIGFzc3VtZSBubyByZXR1cm4gdmFsdWUuCisJfCBOT1RFOiBPbiB0aGUgbWM2ODAwMCwgdHN0IG9uIGFuIGFkZHJlc3MgcmVnaXN0ZXIgaXMgbm90IHN1cHBvcnRlZC4KKyNpZiAhZGVmaW5lZChfX21jNjgwMjBfXykgJiYgIWRlZmluZWQoX19tYzY4MDMwX18pICYmICFkZWZpbmVkKF9fbWM2ODA0MF9fKSAmJiAhZGVmaW5lZChfX21jNjgwNjBfXykgJiYgIWRlZmluZWQoX19tY29sZGZpcmVfXykKKwljbXAudwkjMCwgJWExCisjZWxzZQogCXRzdC5sCSVhMQorI2VuZGlmCiAJamJlcQlub3JldHZhbAogCiAJYnRzdAkjMCwlZDIKQEAgLTEwMywyNSArMTIxLDQ0IEBACiByZXRmbG9hdDoKIAlidHN0CSMyLCVkMgogCWpiZXEJcmV0ZG91YmxlCisjaWYgZGVmaW5lZChfX01DNjg4ODFfXykgfHwgZGVmaW5lZChfX0hBVkVfNjg4ODFfXykKIAlmbW92ZS5zCSVmcDAsKCVhMSkKKyNlbHNlCisJbW92ZS5sCSVkMCwoJWExKQorI2VuZGlmCiAJamJyYQllcGlsb2d1ZQogCiByZXRkb3VibGU6CiAJYnRzdAkjMywlZDIKIAlqYmVxCXJldGxvbmdkb3VibGUKKyNpZiBkZWZpbmVkKF9fTUM2ODg4MV9fKSB8fCBkZWZpbmVkKF9fSEFWRV82ODg4MV9fKQogCWZtb3ZlLmQJJWZwMCwoJWExKQorI2Vsc2UKKwltb3ZlLmwJJWQwLCglYTEpKworCW1vdmUubAklZDEsKCVhMSkKKyNlbmRpZgogCWpicmEJZXBpbG9ndWUKIAogcmV0bG9uZ2RvdWJsZToKIAlidHN0CSM0LCVkMgogCWpiZXEJcmV0cG9pbnRlcgorI2lmIGRlZmluZWQoX19NQzY4ODgxX18pIHx8IGRlZmluZWQoX19IQVZFXzY4ODgxX18pCiAJZm1vdmUueAklZnAwLCglYTEpCisjZWxzZQorCW1vdmUubAklZDAsKCVhMSkrCisJbW92ZS5sCSVkMSwoJWExKSsKKwltb3ZlLmwJJWQyLCglYTEpCisjZW5kaWYKIAlqYnJhCWVwaWxvZ3VlCiAKIHJldHBvaW50ZXI6CiAJYnRzdAkjNSwlZDIKIAlqYmVxCXJldHN0cnVjdDEKKyNpZmRlZiBfX01JTlRfXworCW1vdmUubAklZDAsKCVhMSkKKyNlbHNlCiAJbW92ZS5sCSVhMCwoJWExKQorI2VuZGlmCiAJamJyYQllcGlsb2d1ZQogCiByZXRzdHJ1Y3QxOgpAQCAtMTMyLDggKzE2OSwyOCBAQAogCiByZXRzdHJ1Y3QyOgogCWJ0c3QJIzcsJWQyCi0JamJlcQlub3JldHZhbAorCWpiZXEJcmV0c2ludDgKIAltb3ZlLncJJWQwLCglYTEpCisJamJyYQllcGlsb2d1ZQorCityZXRzaW50ODoKKwlidHN0CSM4LCVkMgorCWpiZXEJcmV0c2ludDE2CisJfCBOT1RFOiBPbiB0aGUgbWM2ODAwMCwgZXh0YiBpcyBub3Qgc3VwcG9ydGVkLiA4LT4xNiwgdGhlbiAxNi0+MzIuCisjaWYgIWRlZmluZWQoX19tYzY4MDIwX18pICYmICFkZWZpbmVkKF9fbWM2ODAzMF9fKSAmJiAhZGVmaW5lZChfX21jNjgwNDBfXykgJiYgIWRlZmluZWQoX19tYzY4MDYwX18pICYmICFkZWZpbmVkKF9fbWNvbGRmaXJlX18pCisJZXh0LncJJWQwCisJZXh0LmwJJWQwCisjZWxzZQorCWV4dGIubAklZDAKKyNlbmRpZgorCW1vdmUubAklZDAsKCVhMSkKKwlqYnJhCWVwaWxvZ3VlCisKK3JldHNpbnQxNjoKKwlidHN0CSM5LCVkMgorCWpiZXEJbm9yZXR2YWwKKwlleHQubAklZDAKKwltb3ZlLmwJJWQwLCglYTEpCiAKIG5vcmV0dmFsOgogZXBpbG9ndWU6CkBAIC0xNDEsMTMgKzE5OCwxMyBAQAogCXVubGsJJWZwCiAJcnRzCiAJQ0ZJX0VORFBST0MoKQotCS5zaXplCWZmaV9jYWxsX1NZU1YsLi1mZmlfY2FsbF9TWVNWCisJLnNpemUJQ0FMTEZVTkMoZmZpX2NhbGxfU1lTViksLi1DQUxMRlVOQyhmZmlfY2FsbF9TWVNWKQogCi0JLmdsb2JsCWZmaV9jbG9zdXJlX1NZU1YKLQkudHlwZQlmZmlfY2xvc3VyZV9TWVNWLCBAZnVuY3Rpb24KKwkuZ2xvYmwJQ0FMTEZVTkMoZmZpX2Nsb3N1cmVfU1lTVikKKwkudHlwZQlDQUxMRlVOQyhmZmlfY2xvc3VyZV9TWVNWKSwgQGZ1bmN0aW9uCiAJLmFsaWduCTQKIAotZmZpX2Nsb3N1cmVfU1lTVjoKK0NBTExGVU5DKGZmaV9jbG9zdXJlX1NZU1YpOgogCUNGSV9TVEFSVFBST0MoKQogCWxpbmsJJWZwLCMtMTIKIAlDRklfT0ZGU0VUKDE0LC04KQpAQCAtMTU3LDE2ICsyMTQsMTggQEAKIAlwZWEJLTEyKCVmcCkKIAltb3ZlLmwJJWEwLC0oJXNwKQogI2lmICFkZWZpbmVkIF9fUElDX18KLQlqc3IJZmZpX2Nsb3N1cmVfU1lTVl9pbm5lcgorCWpzcglDQUxMRlVOQyhmZmlfY2xvc3VyZV9TWVNWX2lubmVyKQogI2Vsc2UKLQlic3IubAlmZmlfY2xvc3VyZV9TWVNWX2lubmVyQFBMVFBDCisJYnNyLmwJQ0FMTEZVTkMoZmZpX2Nsb3N1cmVfU1lTVl9pbm5lckBQTFRQQykKICNlbmRpZgogCiAJbHNyLmwJIzEsJWQwCiAJam5lCTFmCiAJamNjCS5MY2xzX2VwaWxvZ3VlCisJfCBDSUZfRkxBR1NfSU5UCiAJbW92ZS5sCS0xMiglZnApLCVkMAogLkxjbHNfZXBpbG9ndWU6CisJfCBubyBDSUZfRkxBR1NfKgogCXVubGsJJWZwCiAJcnRzCiAxOgpAQCAtMTc0LDQzICsyMzMsODAgQEAKIAlsc3IubAkjMiwlZDAKIAlqbmUJMWYKIAlqY3MJLkxjbHNfcmV0X2Zsb2F0CisJfCBDSUZfRkxBR1NfRElOVAogCW1vdmUubAkoJWEwKSssJWQwCiAJbW92ZS5sCSglYTApLCVkMQogCWpyYQkuTGNsc19lcGlsb2d1ZQogLkxjbHNfcmV0X2Zsb2F0OgorI2lmIGRlZmluZWQoX19NQzY4ODgxX18pIHx8IGRlZmluZWQoX19IQVZFXzY4ODgxX18pCiAJZm1vdmUucwkoJWEwKSwlZnAwCisjZWxzZQorCW1vdmUubAkoJWEwKSwlZDAKKyNlbmRpZgogCWpyYQkuTGNsc19lcGlsb2d1ZQogMToKIAlsc3IubAkjMiwlZDAKIAlqbmUJMWYKIAlqY3MJLkxjbHNfcmV0X2xkb3VibGUKKwl8IENJRl9GTEFHU19ET1VCTEUKKyNpZiBkZWZpbmVkKF9fTUM2ODg4MV9fKSB8fCBkZWZpbmVkKF9fSEFWRV82ODg4MV9fKQogCWZtb3ZlLmQJKCVhMCksJWZwMAorI2Vsc2UKKwltb3ZlLmwJKCVhMCkrLCVkMAorCW1vdmUubAkoJWEwKSwlZDEKKyNlbmRpZgogCWpyYQkuTGNsc19lcGlsb2d1ZQogLkxjbHNfcmV0X2xkb3VibGU6CisjaWYgZGVmaW5lZChfX01DNjg4ODFfXykgfHwgZGVmaW5lZChfX0hBVkVfNjg4ODFfXykKIAlmbW92ZS54CSglYTApLCVmcDAKKyNlbHNlCisJbW92ZS5sCSglYTApKywlZDAKKwltb3ZlLmwJKCVhMCkrLCVkMQorCW1vdmUubAkoJWEwKSwlZDIKKyNlbmRpZgogCWpyYQkuTGNsc19lcGlsb2d1ZQogMToKIAlsc3IubAkjMiwlZDAKLQlqbmUJLkxjbHNfcmV0X3N0cnVjdDIKKwlqbmUJMWYKIAlqY3MJLkxjbHNfcmV0X3N0cnVjdDEKKwl8IENJRl9GTEFHU19QT0lOVEVSCiAJbW92ZS5sCSglYTApLCVhMAogCW1vdmUubAklYTAsJWQwCiAJanJhCS5MY2xzX2VwaWxvZ3VlCiAuTGNsc19yZXRfc3RydWN0MToKIAltb3ZlLmIJKCVhMCksJWQwCiAJanJhCS5MY2xzX2VwaWxvZ3VlCi0uTGNsc19yZXRfc3RydWN0MjoKKzE6CisJbHNyLmwJIzIsJWQwCisJam5lCTFmCisJamNzCS5MY2xzX3JldF9zaW50OAorCXwgQ0lGX0ZMQUdTX1NUUlVDVDIKIAltb3ZlLncJKCVhMCksJWQwCiAJanJhCS5MY2xzX2VwaWxvZ3VlCisuTGNsc19yZXRfc2ludDg6CisJbW92ZS5sCSglYTApLCVkMAorCXwgTk9URTogT24gdGhlIG1jNjgwMDAsIGV4dGIgaXMgbm90IHN1cHBvcnRlZC4gOC0+MTYsIHRoZW4gMTYtPjMyLgorI2lmICFkZWZpbmVkKF9fbWM2ODAyMF9fKSAmJiAhZGVmaW5lZChfX21jNjgwMzBfXykgJiYgIWRlZmluZWQoX19tYzY4MDQwX18pICYmICFkZWZpbmVkKF9fbWM2ODA2MF9fKSAmJiAhZGVmaW5lZChfX21jb2xkZmlyZV9fKQorCWV4dC53CSVkMAorCWV4dC5sCSVkMAorI2Vsc2UKKwlleHRiLmwJJWQwCisjZW5kaWYKKwlqcmEJLkxjbHNfZXBpbG9ndWUKKzE6CisJfCBDSUZfRkxBR1NfU0lOVDE2CisJbW92ZS5sCSglYTApLCVkMAorCWV4dC5sCSVkMAorCWpyYQkuTGNsc19lcGlsb2d1ZQogCUNGSV9FTkRQUk9DKCkKIAotCS5zaXplCWZmaV9jbG9zdXJlX1NZU1YsLi1mZmlfY2xvc3VyZV9TWVNWCisJLnNpemUJQ0FMTEZVTkMoZmZpX2Nsb3N1cmVfU1lTViksLi1DQUxMRlVOQyhmZmlfY2xvc3VyZV9TWVNWKQogCi0JLmdsb2JsCWZmaV9jbG9zdXJlX3N0cnVjdF9TWVNWCi0JLnR5cGUJZmZpX2Nsb3N1cmVfc3RydWN0X1NZU1YsIEBmdW5jdGlvbgorCS5nbG9ibAlDQUxMRlVOQyhmZmlfY2xvc3VyZV9zdHJ1Y3RfU1lTVikKKwkudHlwZQlDQUxMRlVOQyhmZmlfY2xvc3VyZV9zdHJ1Y3RfU1lTViksIEBmdW5jdGlvbgogCS5hbGlnbgk0CiAKLWZmaV9jbG9zdXJlX3N0cnVjdF9TWVNWOgorQ0FMTEZVTkMoZmZpX2Nsb3N1cmVfc3RydWN0X1NZU1YpOgogCUNGSV9TVEFSVFBST0MoKQogCWxpbmsJJWZwLCMwCiAJQ0ZJX09GRlNFVCgxNCwtOCkKQEAgLTIyMCwxNCArMzE2LDE0IEBACiAJbW92ZS5sCSVhMSwtKCVzcCkKIAltb3ZlLmwJJWEwLC0oJXNwKQogI2lmICFkZWZpbmVkIF9fUElDX18KLQlqc3IJZmZpX2Nsb3N1cmVfU1lTVl9pbm5lcgorCWpzcglDQUxMRlVOQyhmZmlfY2xvc3VyZV9TWVNWX2lubmVyKQogI2Vsc2UKLQlic3IubAlmZmlfY2xvc3VyZV9TWVNWX2lubmVyQFBMVFBDCisJYnNyLmwJQ0FMTEZVTkMoZmZpX2Nsb3N1cmVfU1lTVl9pbm5lckBQTFRQQykKICNlbmRpZgogCXVubGsJJWZwCiAJcnRzCiAJQ0ZJX0VORFBST0MoKQotCS5zaXplCWZmaV9jbG9zdXJlX3N0cnVjdF9TWVNWLC4tZmZpX2Nsb3N1cmVfc3RydWN0X1NZU1YKKwkuc2l6ZQlDQUxMRlVOQyhmZmlfY2xvc3VyZV9zdHJ1Y3RfU1lTViksLi1DQUxMRlVOQyhmZmlfY2xvc3VyZV9zdHJ1Y3RfU1lTVikKIAogI2lmIGRlZmluZWQgX19FTEZfXyAmJiBkZWZpbmVkIF9fbGludXhfXwogCS5zZWN0aW9uCS5ub3RlLkdOVS1zdGFjaywiIixAcHJvZ2JpdHMKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL21ldGFnL2ZmaS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvbWV0YWcvZmZpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZiMzgzZQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL21ldGFnL2ZmaS5jCkBAIC0wLDAgKzEsMzMwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGZmaS5jIC0gQ29weXJpZ2h0IChjKSAyMDEzIEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcworCisgIE1ldGEgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UKKyAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAgSU4gTk8gRVZFTlQgU0hBTEwgU0lNT04gUE9TTkpBSyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxmZmkuaD4KKyNpbmNsdWRlIDxmZmlfY29tbW9uLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSBNSU4oYSxiKSAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisKKy8qCisgKiBmZmlfcHJlcF9hcmdzIGlzIGNhbGxlZCBieSB0aGUgYXNzZW1ibHkgcm91dGluZSBvbmNlIHN0YWNrIHNwYWNlIGhhcyBiZWVuCisgKiBhbGxvY2F0ZWQgZm9yIHRoZSBmdW5jdGlvbidzIGFyZ3VtZW50cworICovCisKK3Vuc2lnbmVkIGludCBmZmlfcHJlcF9hcmdzKGNoYXIgKnN0YWNrLCBleHRlbmRlZF9jaWYgKmVjaWYpCit7CisJcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7CisJcmVnaXN0ZXIgdm9pZCAqKnBfYXJndjsKKwlyZWdpc3RlciBjaGFyICphcmdwOworCXJlZ2lzdGVyIGZmaV90eXBlICoqcF9hcmc7CisKKwlhcmdwID0gc3RhY2s7CisKKwkvKiBTdG9yZSByZXR1cm4gdmFsdWUgKi8KKwlpZiAoIGVjaWYtPmNpZi0+ZmxhZ3MgPT0gRkZJX1RZUEVfU1RSVUNUICkgeworCQlhcmdwIC09IDQ7CisJCSoodm9pZCAqKikgYXJncCA9IGVjaWYtPnJ2YWx1ZTsKKwl9CisKKwlwX2FyZ3YgPSBlY2lmLT5hdmFsdWU7CisKKwkvKiBwb2ludCB0byBuZXh0IGxvY2F0aW9uICovCisJZm9yIChpID0gZWNpZi0+Y2lmLT5uYXJncywgcF9hcmcgPSBlY2lmLT5jaWYtPmFyZ190eXBlczsgKGkgIT0gMCk7IGktLSwgcF9hcmcrKywgcF9hcmd2KyspCisJeworCQlzaXplX3QgejsKKworCQkvKiBNb3ZlIGFyZ3AgdG8gYWRkcmVzcyBvZiBhcmd1bWVudCAqLworCQl6ID0gKCpwX2FyZyktPnNpemU7CisJCWFyZ3AgLT0gejsKKworCQkvKiBBbGlnbiBpZiBuZWNlc3NhcnkgKi8KKwkJYXJncCA9IChjaGFyICopIEFMSUdOX0RPV04oQUxJR05fRE9XTihhcmdwLCAoKnBfYXJnKS0+YWxpZ25tZW50KSwgNCk7CisKKwkJaWYgKHogPCBzaXplb2YoaW50KSkgeworCQkJeiA9IHNpemVvZihpbnQpOworCQkJc3dpdGNoICgoKnBfYXJnKS0+dHlwZSkKKwkJCXsKKwkJCWNhc2UgRkZJX1RZUEVfU0lOVDg6CisJCQkJKihzaWduZWQgaW50ICopIGFyZ3AgPSAoc2lnbmVkIGludCkqKFNJTlQ4ICopKCogcF9hcmd2KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRkZJX1RZUEVfVUlOVDg6CisJCQkJKih1bnNpZ25lZCBpbnQgKikgYXJncCA9ICh1bnNpZ25lZCBpbnQpKihVSU5UOCAqKSgqIHBfYXJndik7CisJCQkJYnJlYWs7CisJCQljYXNlIEZGSV9UWVBFX1NJTlQxNjoKKwkJCQkqKHNpZ25lZCBpbnQgKikgYXJncCA9IChzaWduZWQgaW50KSooU0lOVDE2ICopKCogcF9hcmd2KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRkZJX1RZUEVfVUlOVDE2OgorCQkJCSoodW5zaWduZWQgaW50ICopIGFyZ3AgPSAodW5zaWduZWQgaW50KSooVUlOVDE2ICopKCogcF9hcmd2KTsKKwkJCWNhc2UgRkZJX1RZUEVfU1RSVUNUOgorCQkJCW1lbWNweShhcmdwLCAqcF9hcmd2LCAoKnBfYXJnKS0+c2l6ZSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUZGSV9BU1NFUlQoMCk7CisJCQl9CisJCX0gZWxzZSBpZiAoIHogPT0gc2l6ZW9mKGludCkpIHsKKwkJCSoodW5zaWduZWQgaW50ICopIGFyZ3AgPSAodW5zaWduZWQgaW50KSooVUlOVDMyICopKCogcF9hcmd2KTsKKwkJfSBlbHNlIHsKKwkJCW1lbWNweShhcmdwLCAqcF9hcmd2LCB6KTsKKwkJfQorCX0KKworCS8qIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCBpbiByZWdpc3RlcnMsCisJICAgcGFkZGVkIHRvIGFuIDggYnl0ZSBib3VuZGFyeSB0byBwcmVzZXJ2ZSBzdGFjayBhbGlnbm1lbnQgKi8KKwlyZXR1cm4gQUxJR04oTUlOKHN0YWNrIC0gYXJncCwgNio0KSwgOCk7Cit9CisKKy8qIFBlcmZvcm0gbWFjaGluZSBkZXBlbmRlbnQgY2lmIHByb2Nlc3NpbmcgKi8KK2ZmaV9zdGF0dXMgZmZpX3ByZXBfY2lmX21hY2hkZXAoZmZpX2NpZiAqY2lmKQoreworCWZmaV90eXBlICoqcHRyOworCXVuc2lnbmVkIGksIGJ5dGVzID0gMDsKKworCWZvciAocHRyID0gY2lmLT5hcmdfdHlwZXMsIGkgPSBjaWYtPm5hcmdzOyBpID4gMDsgaS0tLCBwdHIrKykgeworCQlpZiAoKCpwdHIpLT5zaXplID09IDApCisJCQlyZXR1cm4gRkZJX0JBRF9UWVBFREVGOworCisJCS8qIFBlcmZvcm0gYSBzYW5pdHkgY2hlY2sgb24gdGhlIGFyZ3VtZW50IHR5cGUsIGRvIHRoaXMKKwkJICAgY2hlY2sgYWZ0ZXIgdGhlIGluaXRpYWxpemF0aW9uLiAgKi8KKwkJRkZJX0FTU0VSVF9WQUxJRF9UWVBFKCpwdHIpOworCisJCS8qIEFkZCBhbnkgcGFkZGluZyBpZiBuZWNlc3NhcnkgKi8KKwkJaWYgKCgoKnB0ciktPmFsaWdubWVudCAtIDEpICYgYnl0ZXMpCisJCQlieXRlcyA9IEFMSUdOKGJ5dGVzLCAoKnB0ciktPmFsaWdubWVudCk7CisKKwkJYnl0ZXMgKz0gQUxJR04oKCpwdHIpLT5zaXplLCA0KTsKKwl9CisKKwkvKiBFbnN1cmUgYXJnIHNwYWNlIGlzIGFsaWduZWQgdG8gYW4gOC1ieXRlIGJvdW5kYXJ5ICovCisJYnl0ZXMgPSBBTElHTihieXRlcywgOCk7CisKKwkvKiBNYWtlIHNwYWNlIGZvciB0aGUgcmV0dXJuIHN0cnVjdHVyZSBwb2ludGVyICovCisJaWYgKGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKSB7CisJCWJ5dGVzICs9IHNpemVvZih2b2lkKik7CisKKwkJLyogRW5zdXJlIHN0YWNrIGlzIGFsaWduZWQgdG8gYW4gOC1ieXRlIGJvdW5kYXJ5ICovCisJCWJ5dGVzID0gQUxJR04oYnl0ZXMsIDgpOworCX0KKworCWNpZi0+Ynl0ZXMgPSBieXRlczsKKworCS8qIFNldCB0aGUgcmV0dXJuIHR5cGUgZmxhZyAqLworCXN3aXRjaCAoY2lmLT5ydHlwZS0+dHlwZSkgeworCWNhc2UgRkZJX1RZUEVfVk9JRDoKKwljYXNlIEZGSV9UWVBFX0ZMT0FUOgorCWNhc2UgRkZJX1RZUEVfRE9VQkxFOgorCQljaWYtPmZsYWdzID0gKHVuc2lnbmVkKSBjaWYtPnJ0eXBlLT50eXBlOworCQlicmVhazsKKwljYXNlIEZGSV9UWVBFX1NJTlQ2NDoKKwljYXNlIEZGSV9UWVBFX1VJTlQ2NDoKKwkJY2lmLT5mbGFncyA9ICh1bnNpZ25lZCkgRkZJX1RZUEVfU0lOVDY0OworCQlicmVhazsKKwljYXNlIEZGSV9UWVBFX1NUUlVDVDoKKwkJLyogTWV0YSBjYW4gc3RvcmUgcmV0dXJuIHZhbHVlcyB3aGljaCBhcmUgPD0gNjQgYml0cyAqLworCQlpZiAoY2lmLT5ydHlwZS0+c2l6ZSA8PSA0KQorCQkJLyogUmV0dXJuZWQgdG8gRDBSZTAgYXMgMzItYml0IHZhbHVlICovCisJCQljaWYtPmZsYWdzID0gKHVuc2lnbmVkKUZGSV9UWVBFX0lOVDsKKwkJZWxzZSBpZiAoKGNpZi0+cnR5cGUtPnNpemUgPiA0KSAmJiAoY2lmLT5ydHlwZS0+c2l6ZSA8PSA4KSkKKwkJCS8qIFJldHVybmVkIHZhbHVlZCBpcyBzdG9yZWQgdG8gRDFSZTB8UjBSZTAgKi8KKwkJCWNpZi0+ZmxhZ3MgPSAodW5zaWduZWQpRkZJX1RZUEVfRE9VQkxFOworCQllbHNlCisJCQkvKiB2YWx1ZSBzdG9yZWQgaW4gbWVtb3J5ICovCisJCQljaWYtPmZsYWdzID0gKHVuc2lnbmVkKUZGSV9UWVBFX1NUUlVDVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY2lmLT5mbGFncyA9ICh1bnNpZ25lZClGRklfVFlQRV9JTlQ7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gRkZJX09LOworfQorCitleHRlcm4gdm9pZCBmZmlfY2FsbF9TWVNWKHZvaWQgKCpmbikodm9pZCksIGV4dGVuZGVkX2NpZiAqLCB1bnNpZ25lZCwgdW5zaWduZWQsIGRvdWJsZSAqKTsKKworLyoKKyAqIEV4cG9ydGVkIGluIEFQSS4gRW50cnkgcG9pbnQKKyAqIGNpZiAtPiBmZmlfY2lmIG9iamVjdAorICogZm4gLT4gZnVuY3Rpb24gcG9pbnRlcgorICogcnZhbHVlIC0+IHBvaW50ZXIgdG8gcmV0dXJuIHZhbHVlCisgKiBhdmFsdWUgLT4gdmVjdG9yIG9mIHZvaWQgKiBwb2ludGVycyBwb2ludGluZyB0byBtZW1vcnkgbG9jYXRpb25zIGhvbGRpbmcgdGhlCisgKiBhcmd1bWVudHMKKyAqLwordm9pZCBmZmlfY2FsbChmZmlfY2lmICpjaWYsIHZvaWQgKCpmbikodm9pZCksIHZvaWQgKnJ2YWx1ZSwgdm9pZCAqKmF2YWx1ZSkKK3sKKwlleHRlbmRlZF9jaWYgZWNpZjsKKworCWludCBzbWFsbF9zdHJ1Y3QgPSAoKChjaWYtPmZsYWdzID09IEZGSV9UWVBFX0lOVCkgfHwgKGNpZi0+ZmxhZ3MgPT0gRkZJX1RZUEVfRE9VQkxFKSkgJiYgKGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKSk7CisJZWNpZi5jaWYgPSBjaWY7CisJZWNpZi5hdmFsdWUgPSBhdmFsdWU7CisKKwlkb3VibGUgdGVtcDsKKworCS8qCisJICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBhIHN0cnVjdCBhbmQgd2UgZG9uJ3QgaGF2ZSBhIHJldHVybiB2YWx1ZSBhZGRyZXNzCisJICogdGhlbiB3ZSBuZWVkIHRvIG1ha2Ugb25lCisJICovCisKKwlpZiAoKHJ2YWx1ZSA9PSBOVUxMICkgJiYgKGNpZi0+ZmxhZ3MgPT0gRkZJX1RZUEVfU1RSVUNUKSkKKwkJZWNpZi5ydmFsdWUgPSBhbGxvY2EoY2lmLT5ydHlwZS0+c2l6ZSk7CisJZWxzZSBpZiAoc21hbGxfc3RydWN0KQorCQllY2lmLnJ2YWx1ZSA9ICZ0ZW1wOworCWVsc2UKKwkJZWNpZi5ydmFsdWUgPSBydmFsdWU7CisKKwlzd2l0Y2ggKGNpZi0+YWJpKSB7CisJY2FzZSBGRklfU1lTVjoKKwkJZmZpX2NhbGxfU1lTVihmbiwgJmVjaWYsIGNpZi0+Ynl0ZXMsIGNpZi0+ZmxhZ3MsIGVjaWYucnZhbHVlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRkZJX0FTU0VSVCgwKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHNtYWxsX3N0cnVjdCkKKwkJbWVtY3B5IChydmFsdWUsICZ0ZW1wLCBjaWYtPnJ0eXBlLT5zaXplKTsKK30KKworLyogcHJpdmF0ZSBtZW1iZXJzICovCisKK3N0YXRpYyB2b2lkIGZmaV9wcmVwX2luY29taW5nX2FyZ3NfU1lTViAoY2hhciAqLCB2b2lkICoqLCB2b2lkICoqLAorCWZmaV9jaWYqLCBmbG9hdCAqKTsKKwordm9pZCBmZmlfY2xvc3VyZV9TWVNWIChmZmlfY2xvc3VyZSAqKTsKKworLyogRG8gTk9UIGNoYW5nZSB0aGF0IHdpdGhvdXQgY2hhbmdpbmcgdGhlIEZGSV9UUkFNUE9MSU5FX1NJWkUgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgZmZpX21ldGFnX3RyYW1wb2xpbmVbMTBdOyAvKiAxMCBpbnN0cnVjdGlvbnMgKi8KKworLyogZW5kIG9mIHByaXZhdGUgbWVtYmVycyAqLworCisvKgorICogX190cmFtcDogdHJhbXBvbGluZSBtZW1vcnkgbG9jYXRpb24KKyAqIF9fZnVuOiBhc3NlbWJseSByb3V0aW5lCisgKiBfX2N0eDogbWVtb3J5IGxvY2F0aW9uIGZvciB3cmFwcGVyCisgKgorICogQXQgdGhpcyBwb2ludCwgdHJhbXBbMF0gPT0gX19jdHggIQorICovCit2b2lkIGZmaV9pbml0X3RyYW1wb2xpbmUodW5zaWduZWQgY2hhciAqX190cmFtcCwgdW5zaWduZWQgaW50IF9fZnVuLCB1bnNpZ25lZCBpbnQgX19jdHgpIHsKKwltZW1jcHkgKF9fdHJhbXAsIGZmaV9tZXRhZ190cmFtcG9saW5lLCBzaXplb2YoZmZpX21ldGFnX3RyYW1wb2xpbmUpKTsKKwkqKHVuc2lnbmVkIGludCopICZfX3RyYW1wWzQwXSA9IF9fY3R4OworCSoodW5zaWduZWQgaW50KikgJl9fdHJhbXBbNDRdID0gX19mdW47CisJLyogVGhpcyB3aWxsIGZsdXNoIHRoZSBpbnN0cnVjdGlvbiBjYWNoZSAqLworCV9fYnVpbHRpbl9tZXRhMl9jYWNoZXdkKCZfX3RyYW1wWzBdLCAxKTsKKwlfX2J1aWx0aW5fbWV0YTJfY2FjaGV3ZCgmX190cmFtcFs0N10sIDEpOworfQorCisKKworLyogdGhlIGNpZiBtdXN0IGFscmVhZHkgYmUgcHJlcGFyZWQgKi8KKworZmZpX3N0YXR1cworZmZpX3ByZXBfY2xvc3VyZV9sb2MgKGZmaV9jbG9zdXJlICpjbG9zdXJlLAorCWZmaV9jaWYqIGNpZiwKKwl2b2lkICgqZnVuKShmZmlfY2lmKix2b2lkKix2b2lkKiosdm9pZCopLAorCXZvaWQgKnVzZXJfZGF0YSwKKwl2b2lkICpjb2RlbG9jKQoreworCXZvaWQgKCpjbG9zdXJlX2Z1bmMpKGZmaV9jbG9zdXJlKikgPSBOVUxMOworCisJaWYgKGNpZi0+YWJpID09IEZGSV9TWVNWKQorCQljbG9zdXJlX2Z1bmMgPSAmZmZpX2Nsb3N1cmVfU1lTVjsKKwllbHNlCisJCXJldHVybiBGRklfQkFEX0FCSTsKKworCWZmaV9pbml0X3RyYW1wb2xpbmUoCisJCSh1bnNpZ25lZCBjaGFyKikmY2xvc3VyZS0+dHJhbXBbMF0sCisJCSh1bnNpZ25lZCBpbnQpY2xvc3VyZV9mdW5jLAorCQkodW5zaWduZWQgaW50KWNvZGVsb2MpOworCisJY2xvc3VyZS0+Y2lmID0gY2lmOworCWNsb3N1cmUtPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKwljbG9zdXJlLT5mdW4gPSBmdW47CisKKwlyZXR1cm4gRkZJX09LOworfQorCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMganVtcGVkIHRvIGJ5IHRoZSB0cmFtcG9saW5lICovCit1bnNpZ25lZCBpbnQgZmZpX2Nsb3N1cmVfU1lTVl9pbm5lciAoY2xvc3VyZSwgcmVzcHAsIGFyZ3MsIHZmcF9hcmdzKQorCWZmaV9jbG9zdXJlICpjbG9zdXJlOworCXZvaWQgKipyZXNwcDsKKwl2b2lkICphcmdzOworCXZvaWQgKnZmcF9hcmdzOworeworCWZmaV9jaWYgKmNpZjsKKwl2b2lkICoqYXJnX2FyZWE7CisKKwljaWYgPSBjbG9zdXJlLT5jaWY7CisJYXJnX2FyZWEgPSAodm9pZCoqKSBhbGxvY2EgKGNpZi0+bmFyZ3MgKiBzaXplb2YgKHZvaWQqKSk7CisKKwkvKgorCSAqIFRoaXMgY2FsbCB3aWxsIGluaXRpYWxpemUgQVJHX0FSRUEsIHN1Y2ggdGhhdCBlYWNoCisJICogZWxlbWVudCBpbiB0aGF0IGFycmF5IHBvaW50cyB0byB0aGUgY29ycmVzcG9uZGluZworCSAqIHZhbHVlIG9uIHRoZSBzdGFjazsgYW5kIGlmIHRoZSBmdW5jdGlvbiByZXR1cm5zCisJICogYSBzdHJ1Y3R1cmUsIGl0IHdpbGwgcmUtc2V0IFJFU1AgdG8gcG9pbnQgdG8gdGhlCisJICogc3RydWN0dXJlIHJldHVybiBhZGRyZXNzLgorCSAqLworCWZmaV9wcmVwX2luY29taW5nX2FyZ3NfU1lTVihhcmdzLCByZXNwcCwgYXJnX2FyZWEsIGNpZiwgdmZwX2FyZ3MpOworCisJKGNsb3N1cmUtPmZ1bikgKCBjaWYsICpyZXNwcCwgYXJnX2FyZWEsIGNsb3N1cmUtPnVzZXJfZGF0YSk7CisKKwlyZXR1cm4gY2lmLT5mbGFnczsKK30KKworc3RhdGljIHZvaWQgZmZpX3ByZXBfaW5jb21pbmdfYXJnc19TWVNWKGNoYXIgKnN0YWNrLCB2b2lkICoqcnZhbHVlLAorCXZvaWQgKiphdmFsdWUsIGZmaV9jaWYgKmNpZiwKKwlmbG9hdCAqdmZwX3N0YWNrKQoreworCXJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOworCXJlZ2lzdGVyIHZvaWQgKipwX2FyZ3Y7CisJcmVnaXN0ZXIgY2hhciAqYXJncDsKKwlyZWdpc3RlciBmZmlfdHlwZSAqKnBfYXJnOworCisJLyogc3RhY2sgcG9pbnRzIHRvIG9yaWdpbmFsIGFyZ3VtZW50cyAqLworCWFyZ3AgPSBzdGFjazsKKworCS8qIFN0b3JlIHJldHVybiB2YWx1ZSAqLworCWlmICggY2lmLT5mbGFncyA9PSBGRklfVFlQRV9TVFJVQ1QgKSB7CisJCWFyZ3AgLT0gNDsKKwkJKnJ2YWx1ZSA9ICoodm9pZCAqKikgYXJncDsKKwl9CisKKwlwX2FyZ3YgPSBhdmFsdWU7CisKKwlmb3IgKGkgPSBjaWYtPm5hcmdzLCBwX2FyZyA9IGNpZi0+YXJnX3R5cGVzOyAoaSAhPSAwKTsgaS0tLCBwX2FyZysrKSB7CisJCXNpemVfdCB6OworCQlzaXplX3QgYWxpZ25tZW50OworCisJCWFsaWdubWVudCA9ICgqcF9hcmcpLT5hbGlnbm1lbnQ7CisJCWlmIChhbGlnbm1lbnQgPCA0KQorCQkJYWxpZ25tZW50ID0gNDsKKwkJaWYgKChhbGlnbm1lbnQgLSAxKSAmICh1bnNpZ25lZClhcmdwKQorCQkJYXJncCA9IChjaGFyICopIEFMSUdOKGFyZ3AsIGFsaWdubWVudCk7CisKKwkJeiA9ICgqcF9hcmcpLT5zaXplOworCQkqcF9hcmd2ID0gKHZvaWQqKSBhcmdwOworCQlwX2FyZ3YrKzsKKwkJYXJncCAtPSB6OworCX0KKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9tZXRhZy9mZml0YXJnZXQuaCBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL21ldGFnL2ZmaXRhcmdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiOWRiZWIKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9tZXRhZy9mZml0YXJnZXQuaApAQCAtMCwwICsxLDUzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotQy0qLQorICAgZmZpdGFyZ2V0LmggLSBDb3B5cmlnaHQgKGMpIDIwMTMgSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzIEx0ZC4KKyAgIFRhcmdldCBjb25maWd1cmF0aW9uIG1hY3JvcyBmb3IgTWV0YQorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTElCRkZJX1RBUkdFVF9ICisjZGVmaW5lIExJQkZGSV9UQVJHRVRfSAorCisjaWZuZGVmIExJQkZGSV9ICisjZXJyb3IgIlBsZWFzZSBkbyBub3QgaW5jbHVkZSBmZml0YXJnZXQuaCBkaXJlY3RseSBpbnRvIHlvdXIgc291cmNlLiAgVXNlIGZmaS5oIGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgTElCRkZJX0FTTQordHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgICAgIGZmaV9hcmc7Cit0eXBlZGVmIHNpZ25lZCBsb25nICAgICAgICAgICAgZmZpX3Nhcmc7CisKK3R5cGVkZWYgZW51bSBmZmlfYWJpIHsKKyAgRkZJX0ZJUlNUX0FCSSA9IDAsCisgIEZGSV9TWVNWLAorICBGRklfREVGQVVMVF9BQkkgPSBGRklfU1lTViwKKyAgRkZJX0xBU1RfQUJJID0gRkZJX0RFRkFVTFRfQUJJICsgMSwKK30gZmZpX2FiaTsKKyNlbmRpZgorCisvKiAtLS0tIERlZmluaXRpb25zIGZvciBjbG9zdXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEZGSV9DTE9TVVJFUyAxCisjZGVmaW5lIEZGSV9UUkFNUE9MSU5FX1NJWkUgNDgKKyNkZWZpbmUgRkZJX05BVElWRV9SQVdfQVBJIDAKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL21ldGFnL3N5c3YuUyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL21ldGFnL3N5c3YuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGIyYTNiCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvbWV0YWcvc3lzdi5TCkBAIC0wLDAgKzEsMzExIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgc3lzdi5TIC0gQ29weXJpZ2h0IChjKSAyMDEzIEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcyBMdGQuCisKKyAgIE1ldGEgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UKKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIExJQkZGSV9BU00KKyNpbmNsdWRlIDxmZmljb25maWcuaD4KKyNpbmNsdWRlIDxmZmkuaD4KKyNpZmRlZiBIQVZFX01BQ0hJTkVfQVNNX0gKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorI2Vsc2UKKyNpZmRlZiBfX1VTRVJfTEFCRUxfUFJFRklYX18KKyNkZWZpbmUgQ09OQ0FUMShhLCBiKSBDT05DQVQyKGEsIGIpCisjZGVmaW5lIENPTkNBVDIoYSwgYikgYSAjIyBiCisKKy8qIFVzZSB0aGUgcmlnaHQgcHJlZml4IGZvciBnbG9iYWwgbGFiZWxzLiAqLworI2RlZmluZSBDTkFNRSh4KSBDT05DQVQxIChfX1VTRVJfTEFCRUxfUFJFRklYX18sIHgpCisjZWxzZQorI2RlZmluZSBDTkFNRSh4KSB4CisjZW5kaWYKKyNkZWZpbmUgRU5UUlkoeCkgLmdsb2JsIENOQU1FKHgpOyAudHlwZSBDTkFNRSh4KSwgJWZ1bmN0aW9uOyBDTkFNRSh4KToKKyNlbmRpZgorCisjaWZkZWYgX19FTEZfXworI2RlZmluZSBMU1lNKHgpIC54CisjZWxzZQorI2RlZmluZSBMU1lNKHgpIHgKKyNlbmRpZgorCisubWFjcm8gY2FsbF9yZWcgeD0KKwkudGV4dAorCS5iYWxpZ24gNAorCW1vdiBEMVJ0UCwgXHgKKwlzd2FwIEQxUnRQLCBQQworLmVuZG0KKworISBTYXZlIHJlZ2lzdGVyIGFyZ3VtZW50cworLm1hY3JvIFNBVkVfQVJHUworCS50ZXh0CisJLmJhbGlnbiA0CisJc2V0bAlbQTBTdFArK10sIEQwQXI2LCBEMUFyNQorCXNldGwJW0EwU3RQKytdLCBEMEFyNCwgRDFBcjMKKwlzZXRsCVtBMFN0UCsrXSwgRDBBcjIsIEQxQXIxCisuZW5kbQorCishIFNhdmUgcmV0cnVuLCBmcmFtZSBwb2ludGVyIGFuZCBvdGhlciByZWdzCisubWFjcm8gU0FWRV9SRUdTIHJlZ3M9CisJLnRleHQKKwkuYmFsaWduIDQKKwlzZXRsCVtBMFN0UCsrXSwgRDBGclQsIEQxUnRQCisJISBOZWVkcyB0byBiZSBhIHBhaXIgb2YgcmVncworCS5pZm5jICJccmVncyIsIiIKKwlzZXRsCVtBMFN0UCsrXSwgXHJlZ3MKKwkuZW5kaWYKKy5lbmRtCisKKyEgRGVjbGFyZSBhIGdsb2JhbCBmdW5jdGlvbgorLm1hY3JvIE1FVEFHX0ZVTkNfU1RBUlQgbmFtZQorCS50ZXh0CisJLmJhbGlnbiA0CisJRU5UUlkoXG5hbWUpCisuZW5kbQorCishIFJldHVybiByZWdpc3RlcnMgZnJvbSB0aGUgc3RhY2suIFJldmVyc2UgU0FWRV9SRUdTIG9wZXJhdGlvbgorLm1hY3JvIFJFVF9SRUdTIHJlZ3M9LCBjb25kPQorCS5pZm5jICJccmVncyIsICIiCisJZ2V0bAlccmVncywgWy0tQTBTdFBdCisJLmVuZGlmCisJZ2V0bAlEMEZyVCwgRDFSdFAsIFstLUEwU3RQXQorLmVuZG0KKworISBSZXR1cm4gYXJndW1lbnRzCisubWFjcm8gUkVUX0FSR1MKKwlnZXRsCUQwQXIyLCBEMUFyMSwgWy0tQTBTdFBdCisJZ2V0bAlEMEFyNCwgRDFBcjMsIFstLUEwU3RQXQorCWdldGwJRDBBcjYsIEQxQXI1LCBbLS1BMFN0UF0KKy5lbmRtCisKKworCSEgRDFBcjE6CWZuCisJISBEMEFyMjoJJmVjaWYKKwkhIEQxQXIzOgljaWYtPmJ5dGVzCisJISBEMEFyNDoJZmlnLT5mbGFncworCSEgRDFBcjU6CWVjaWYucnZhbHVlCisKKwkhIFRoaXMgYXNzdW1lcyB3ZSBhcmUgdXNpbmcgR05VIGFzCitNRVRBR19GVU5DX1NUQVJUIGZmaV9jYWxsX1NZU1YKKwkhIFNhdmUgYXJndW1lbnQgcmVnaXN0ZXJzCisKKwlTQVZFX0FSR1MKKworCSEgbmV3IGZyYW1lCisJbW92CUQwRnJULCBBMEZyUAorCWFkZCAgICAgQTBGclAsIEEwU3RQLCAjMAorCisJISBQcmVzZXJ2ZSB0aGUgb2xkIGZyYW1lIHBvaW50ZXIKKwlTQVZFX1JFR1MgIkQxLjUsIEQwLjUiCisKKwkhIE1ha2Ugcm9vbSBmb3IgbmV3IGFyZ3MuIGNpZnMtPmJ5dGVzIGlzIHRoZSB0b3RhbCBzcGFjZSBmb3IgaW5wdXQKKwkhIGFuZCByZXR1cm4gYXJndW1lbnRzCisKKwlhZGQJQTBTdFAsIEEwU3RQLCBEMUFyMworCisJISBQcmVzZXJ2ZSBjaWZzLT5ieXRlcyAmIGZuCisJbW92CUQwLjUsIEQxQXIzCisJbW92CUQxLjUsIEQxQXIxCisKKwkhIFBsYWNlIGFsbCBvZiB0aGUgZmZpX3ByZXBfYXJncyBpbiBwb3NpdGlvbgorCW1vdglEMUFyMSwgQTBTdFAKKworCSEgQ2FsbCBmZmlfcHJlcF9hcmdzKHN0YWNrLCAmZWNpZikKKyNpZmRlZiBfX1BJQ19fCisJY2FsbHIgIEQxUnRQLCBDTkFNRShmZmlfcHJlcF9hcmdzQFBMVCkKKyNlbHNlCisJY2FsbHIgIEQxUnRQLCBDTkFNRShmZmlfcHJlcF9hcmdzKQorI2VuZGlmCisKKwkhIFJlc3RvcmUgZm4gcG9pbnRlcgorCisJISBUaGUgZm9yZWlnbiBzdGFjayBzaG91bGQgbG9vayBsaWtlIHRoaXMKKwkhIFhYWFhYIFhYWFhYWCA8LS0tIHN0YWNrIHBvaW50ZXIKKwkhIEZuQXJnTiBydmFsdWUKKwkhIEZuQXJnTisyIEZuQXJnTisxCisJISBGbkFyZ04rNCBGbkFyZ04rMworCSEgLi4uLgorCSEKKworCSEgQTBTdFAgbm93IHBvaW50cyB0byB0aGUgZmlyc3QgKG9yIHJldHVybikgYXJndW1lbnQgKyA0CisKKwkhIFByZXNlcnZlIGNpZi0+Ynl0ZXMKKwlnZXRsCUQwQXIyLCBEMUFyMSwgWy0tQTBTdFBdCisJZ2V0bAlEMEFyNCwgRDFBcjMsIFstLUEwU3RQXQorCWdldGwJRDBBcjYsIEQxQXI1LCBbLS1BMFN0UF0KKworCSEgUGxhY2UgQTBTdFAgdG8gdGhlIGZpcnN0IGFyZ3VtZW50IGFnYWluCisJYWRkCUEwU3RQLCBBMFN0UCwgIzI0ICEgVGhhdCdzIGJlY2F1c2Ugd2UgbG9hZGVkIDYgcmVncyB4IDQgYnl0ZSBlYWNoCisKKwkhIEEwRnJQIHBvaW50cyB0byB0aGUgaW5pdGlhbCBzdGFjayB3aXRob3V0IHRoZSByZXNlcnZlZCBzcGFjZSBmb3IgdGhlCisJISBjaWZzLT5ieXRlcywgd2hpbHN0IEEwU3RQIHBvaW50cyB0byB0aGUgc3RhY2sgYWZ0ZXIgdGhlIHNwYWNlIGFsbG9jYXRpb24KKworCSEgZm4gd2FzIHRoZSBmaXJzdCBhcmd1bWVudCBvZiBmZmlfY2FsbF9TWVNWLgorCSEgVGhlIHN0YWNrIGF0IHRoaXMgcG9pbnQgbG9va3MgbGlrZSB0aGlzOgorCSEKKwkhIEEwU3RQKG9uIGVudHJ5IHRvIF9TWVNWKSAtPglBcmc2CUFyZzUgICAgIHwgbG93CisJIQkJCQlBcmc0CUFyZzMgICAgIHwKKwkhIAkJCQlBcmcyCUFyZzEgICAgIHwKKwkhIEEwRnJQIC0tLS0+CQkJRDBGcnRQCUQxUnRQICAgIHwKKwkhCQkJCUQxLjUJRDAuNQkgfAorCSEgQTBTdFAoYmYgcHJlcF9hcmdzKSAtPglGbkFyZ24JRm5BcmduLTEgfAorCSEJCQkJRm5BcmduLTJGbkFyZ24tMyB8CisJIQkJCQkuLi4uLi4uLi4uLi4uLi4uIHwgPD0gY2lmcy0+Ynl0ZXMKKwkhCQkJCUZuQXJnNCAgRm5BcmczCSB8CisJISBBMFN0UCAocHJ2X0EwU3RQK2NpZnMtPmJ5dGVzKSBGbkFyZzIgIEZuQXJnMSAgIHwgaGlnaAorCSEKKwkhIGZuIHdhcyBpbiBBcmcxIHNvIGl0J3MgbG9jYXRlZCBpbiBpbiBBMEZyUCsjLTB4QworCSEKKworCSEgRDBSZTAgY29udGFpbnMgdGhlIHNpemUgb2YgYXJndW1lbnRzIHN0b3JlZCBpbiByZWdpc3RlcnMKKwlzdWIJQTBTdFAsIEEwU3RQLCBEMFJlMAorCisJISBBcmcxIGlzIHRoZSBmdW5jdGlvbiBwb2ludGVyIGZvciB0aGUgZm9yZWlnbiBjYWxsLiBUaGlzIGhhcyBiZWVuCisJISBwcmVzZXJ2ZWQgaW4gRDEuNQorCisJISBUaW1lIHRvIGNhbGwgKGZuKS4gQXJndW1lbnRzIHNob3VsZCBiZSBsaWtlIHRoaXM6CisJISBBcmcxLUFyZzYgYXJlIGxvYWRlZCB0byByZWdzCisJISBUaGUgcmVzdCBvZiB0aGUgYXJndW1lbnRzIGFyZSBzdG9yZWQgaW4gc3RhY2sgcG9pbnRlZCBieSBBMFN0UAorCisJY2FsbF9yZWcgRDEuNQorCisJISBSZXNldCBzdGFjay4KKworCW1vdglBMFN0UCwgQTBGclAKKworCSEgTG9hZCBBcmcxIHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB0eXBlCisJISBUaGlzIHdhcyBzdG9yZWQgaW4gQXJnNQorCisJZ2V0ZAlEMUFyMSwgW0EwRnJQKyMtMjBdCisKKwkhIExvYWQgRDBBcjIgd2l0aCB0aGUgcmV0dXJuIHR5cGUgY29kZS4gVGhpcyB3YXMgc3RvcmVkIGluIEFyZzQgKGZsYWdzKQorCisJZ2V0ZAlEMEFyMiwgW0EwRnJQKyMtMTZdCisKKwkhIFdlIGFyZSByZWFkeSB0byBzdGFydCBwcm9jZXNzaW5nIHRoZSByZXR1cm4gdmFsdWUKKwkhIEQwUmUwIChhbmQgRDFSZTApIGhvbGQgdGhlIHJldHVybiB2YWx1ZQorCisJISBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIE5VTEwsIGFzc3VtZSBubyByZXR1cm4gdmFsdWUKKwljbXAJRDFBcjEsICMwCisJYmVxCUxTWU0oTGVwaWxvZ3VlKQorCisJISByZXR1cm4gSU5UCisJY21wCQlEMEFyMiwgI0ZGSV9UWVBFX0lOVAorCSEgU2FkbHksIHRoZXJlIGlzIG5vIHNldGR7Y2N9IGluc3RydWN0aW9uIHNvIHdlIG5lZWQgdG8gd29ya2Fyb3VuZCB0aGF0CisJYm5lCS5JTlQ2NAorCXNldGQJW0QxQXIxXSwgRDBSZTAKKwliCUxTWU0oTGVwaWxvZ3VlKQorCisJISByZXR1cm4gSU5UNjQKKy5JTlQ2NDoKKwljbXAJRDBBcjIsICNGRklfVFlQRV9TSU5UNjQKKwlzZXRsZXEJW0QxQXIxXSwgRDBSZTAsIEQxUmUwCisKKwkhIHJldHVybiBET1VCTEUKKwljbXAJRDBBcjIsICNGRklfVFlQRV9ET1VCTEUKKwlzZXRsCVtEMUFSMSsrXSwgRDBSZTAsIEQxUmUwCisKK0xTWU0oTGVwaWxvZ3VlKToKKwkhIEF0IHRoaXMgcG9pbnQsIHRoZSBzdGFjayBwb2ludGVyIHBvaW50cyByaWdodCBhZnRlciB0aGUgYXJndW1lbnQKKwkhIHNhdmVkIGFyZWEuIFdlIG5lZWQgdG8gcmVzdG9yZSA0IHJlZ3MsIHRoZXJlZm9yZSB3ZSBuZWVkIHRvIG1vdmUKKwkhIDE2IGJ5dGVzIGFoZWFkLgorCWFkZCAgICAgQTBTdFAsIEEwU3RQLCAjMTYKKwlSRVRfUkVHUyAiRDEuNSwgRDAuNSIKKwlSRVRfQVJHUworCWdldGQJRDBSZTAsIFtBMFN0UF0KKwltb3YgICAgIEEwRnJQLCBEMEZyVAorCXN3YXAJRDFSdFAsIFBDCisKKy5mZmlfY2FsbF9TWVNWX2VuZDoKKyAgICAgICAuc2l6ZSAgIENOQU1FKGZmaV9jYWxsX1NZU1YpLC5mZmlfY2FsbF9TWVNWX2VuZC1DTkFNRShmZmlfY2FsbF9TWVNWKQorCisKKy8qCisJKGNhbGxlZCBieSBmZmlfbWV0YWdfdHJhbXBvbGluZSkKKwl2b2lkIGZmaV9jbG9zdXJlX1NZU1YgKGZmaV9jbG9zdXJlKikKKworCShjYWxsZWQgYnkgZmZpX2Nsb3N1cmVfU1lTVikKKwl1bnNpZ25lZCBpbnQgRkZJX0hJRERFTgorCWZmaV9jbG9zdXJlX1NZU1ZfaW5uZXIgKGNsb3N1cmUscmVzcHAsIGFyZ3MpCisJCWZmaV9jbG9zdXJlICpjbG9zdXJlOworCQl2b2lkICoqcmVzcHA7CisJCXZvaWQgKmFyZ3M7CisqLworCitNRVRBR19GVU5DX1NUQVJUIGZmaV9jbG9zdXJlX1NZU1YKKwkhIFdlIGFzc3VtZSB0aGF0IEQxQXIxIGhvbGRzIHRoZSBhZGRyZXNzIG9mIHRoZQorCSEgZmZpX2Nsb3N1cmUgc3RydWN0LiBXZSB3aWxsIHVzZSB0aGF0IHRvIGZldGNoIHRoZQorCSEgYXJndW1lbnRzLiBUaGUgc3RhY2sgcG9pbnRlciBwb2ludHMgdG8gYW4gZW1wdHkgc3BhY2UKKwkhIGFuZCBpdCBpcyByZWFkeSB0byBzdG9yZSBtb3JlIGRhdGEuCisKKwkhIEQxQXIxIGlzIHJlYWR5CisJISBBbGxvY2F0ZSBzdGFjayBzcGFjZSBmb3IgcmV0dXJuIHZhbHVlCisJYWRkIEEwU3RQLCBBMFN0UCwgIzgKKwkhIFN0b3JlIGl0IHRvIEQwQXIyCisJc3ViIEQwQXIyLCBBMFN0UCwgIzgKKworCXN1YiBEMUFyMywgQTBGclAsICM0CisKKwkhIEQxQXIzIGNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIHRoZSBvcmlnaW5hbCBEMUFyMSBhcmd1bWVudAorCSEgV2UgbmVlZCB0byBzdWJ0cmFjdCAjNCBsYXRlciBvbgorCisJISBQcmV2ZXJ2ZSBEMEFyMgorCW1vdiBEMC41LCBEMEFyMgorCisjaWZkZWYgX19QSUNfXworCWNhbGxyIEQxUnRQLCBDTkFNRShmZmlfY2xvc3VyZV9TWVNWX2lubmVyQFBMVCkKKyNlbHNlCisJY2FsbHIgRDFSdFAsIENOQU1FKGZmaV9jbG9zdXJlX1NZU1ZfaW5uZXIpCisjZW5kaWYKKworCSEgQ2hlY2sgdGhlIHJldHVybiB2YWx1ZSBhbmQgc3RvcmUgaXQgdG8gRDAuNQorCWNtcCBEMFJlMCwgI0ZGSV9UWVBFX0lOVAorCWJlcSAuTHJldGludAorCWNtcCBEMFJlMCwgI0ZGSV9UWVBFX0RPVUJMRQorCWJlcSAuTHJldGRvdWJsZQorLkxjbG9zdXJlX2VwaWxvZ3VlOgorCXN1YiBBMFN0UCwgQTBTdFAsICM4CisJUkVUX1JFR1MgIkQxLjUsIEQwLjUiCisJUkVUX0FSR1MKKwlzd2FwCUQxUnRQLCBQQworCisuTHJldGludDoKKwlzZXRkIFtEMC41XSwgRDBSZTAKKwliIC5MY2xvc3VyZV9lcGlsb2d1ZQorLkxyZXRkb3VibGU6CisJc2V0bCBbRDAuNSsrXSwgRDBSZTAsIEQxUmUwCisJYiAuTGNsb3N1cmVfZXBpbG9ndWUKKy5mZmlfY2xvc3VyZV9TWVNWX2VuZDoKKy5zaXplIENOQU1FKGZmaV9jbG9zdXJlX1NZU1YpLC5mZmlfY2xvc3VyZV9TWVNWX2VuZC1DTkFNRShmZmlfY2xvc3VyZV9TWVNWKQorCisKK0VOVFJZKGZmaV9tZXRhZ190cmFtcG9saW5lKQorCVNBVkVfQVJHUworCSEgTmV3IGZyYW1lCisJbW92IEEwRnJQLCBBMFN0UAorCVNBVkVfUkVHUyAiRDEuNSwgRDAuNSIKKwltb3YgRDAuNSwgUEMKKwkhIExvYWQgRDFBcjEgdGhlIHZhbHVlIG9mIGZmaV9tZXRhZ190cmFtcG9saW5lCisJZ2V0ZCBEMUFyMSwgW0QwLjUgKyAjOF0KKwkhIEp1bXAgdG8gZmZpX2Nsb3N1cmVfU1lTVgorCWdldGQgUEMsIFtEMC41ICsgIzEyXQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvbWljcm9ibGF6ZS9mZmkuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL21pY3JvYmxhemUvZmZpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMxNTVjNQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL21pY3JvYmxhemUvZmZpLmMKQEAgLTAsMCArMSwzMjEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBmZmkuYyAtIENvcHlyaWdodCAoYykgMjAxMiwgMjAxMyBYaWxpbngsIEluYworCisgICBNaWNyb0JsYXplIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxmZmkuaD4KKyNpbmNsdWRlIDxmZmlfY29tbW9uLmg+CisKK2V4dGVybiB2b2lkIGZmaV9jYWxsX1NZU1Yodm9pZCAoKikodm9pZCosIGV4dGVuZGVkX2NpZiopLCBleHRlbmRlZF9jaWYqLAorCQl1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50Kiwgdm9pZCAoKmZuKSh2b2lkKSwKKwkJdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworCitleHRlcm4gdm9pZCBmZmlfY2xvc3VyZV9TWVNWKHZvaWQpOworCisjZGVmaW5lIFdPUkRfU0laRQkJCXNpemVvZih1bnNpZ25lZCBpbnQpCisjZGVmaW5lIEFSR1NfUkVHSVNURVJfU0laRQkoV09SRF9TSVpFICogNikKKyNkZWZpbmUgV09SRF9BTElHTih4KQkJQUxJR04oeCwgV09SRF9TSVpFKQorCisvKiBmZmlfcHJlcF9hcmdzIGlzIGNhbGxlZCBieSB0aGUgYXNzZW1ibHkgcm91dGluZSBvbmNlIHN0YWNrIHNwYWNlCisgICBoYXMgYmVlbiBhbGxvY2F0ZWQgZm9yIHRoZSBmdW5jdGlvbidzIGFyZ3VtZW50cyAqLwordm9pZCBmZmlfcHJlcF9hcmdzKHZvaWQqIHN0YWNrLCBleHRlbmRlZF9jaWYqIGVjaWYpCit7CisJdW5zaWduZWQgaW50IGk7CisJZmZpX3R5cGUqKiBwX2FyZzsKKwl2b2lkKiogcF9hcmd2OworCXZvaWQqIHN0YWNrX2FyZ3NfcCA9IHN0YWNrOworCisJcF9hcmd2ID0gZWNpZi0+YXZhbHVlOworCisJaWYgKGVjaWYgPT0gTlVMTCB8fCBlY2lmLT5jaWYgPT0gTlVMTCkgeworCQlyZXR1cm47IC8qIG5vIGRlc2NyaXB0aW9uIHRvIHByZXBhcmUgKi8KKwl9CisKKwlpZiAoKGVjaWYtPmNpZi0+cnR5cGUgIT0gTlVMTCkgJiYKKwkJCShlY2lmLT5jaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCkpCisJeworCQkvKiBpZiByZXR1cm4gdHlwZSBpcyBhIHN0cnVjdCB3aGljaCBpcyByZWZlcmVuY2VkIG9uIHRoZSBzdGFjay9yZWc1LAorCQkgKiBieSBhIHBvaW50ZXIuIFN0b3JlZCB0aGUgcmV0dXJuIHZhbHVlIHBvaW50ZXIgaW4gcjUuCisJCSAqLworCQljaGFyKiBhZGRyID0gc3RhY2tfYXJnc19wOworCQltZW1jcHkoYWRkciwgJihlY2lmLT5ydmFsdWUpLCBXT1JEX1NJWkUpOworCQlzdGFja19hcmdzX3AgKz0gV09SRF9TSVpFOworCX0KKworCWlmIChlY2lmLT5hdmFsdWUgPT0gTlVMTCkgeworCQlyZXR1cm47IC8qIG5vIGFyZ3VtZW50cyB0byBwcmVwYXJlICovCisJfQorCisJZm9yIChpID0gMCwgcF9hcmcgPSBlY2lmLT5jaWYtPmFyZ190eXBlczsgaSA8IGVjaWYtPmNpZi0+bmFyZ3M7CisJCQlpKyssIHBfYXJnKyspCisJeworCQlzaXplX3Qgc2l6ZSA9ICgqcF9hcmcpLT5zaXplOworCQlpbnQgdHlwZSA9ICgqcF9hcmcpLT50eXBlOworCQl2b2lkKiB2YWx1ZSA9IHBfYXJndltpXTsKKwkJY2hhciogYWRkciA9IHN0YWNrX2FyZ3NfcDsKKwkJaW50IGFsaWduZWRfc2l6ZSA9IFdPUkRfQUxJR04oc2l6ZSk7CisKKwkJLyogZm9yY2Ugd29yZCBhbGlnbm1lbnQgb24gdGhlIHN0YWNrICovCisJCXN0YWNrX2FyZ3NfcCArPSBhbGlnbmVkX3NpemU7CisJCQorCQlzd2l0Y2ggKHR5cGUpCisJCXsKKwkJCWNhc2UgRkZJX1RZUEVfVUlOVDg6CisJCQkJKih1bnNpZ25lZCBpbnQgKilhZGRyID0gKHVuc2lnbmVkIGludCkqKFVJTlQ4KikodmFsdWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBGRklfVFlQRV9TSU5UODoKKwkJCQkqKHNpZ25lZCBpbnQgKilhZGRyID0gKHNpZ25lZCBpbnQpKihTSU5UOCopKHZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRkZJX1RZUEVfVUlOVDE2OgorCQkJCSoodW5zaWduZWQgaW50ICopYWRkciA9ICh1bnNpZ25lZCBpbnQpKihVSU5UMTYqKSh2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEZGSV9UWVBFX1NJTlQxNjoKKwkJCQkqKHNpZ25lZCBpbnQgKilhZGRyID0gKHNpZ25lZCBpbnQpKihTSU5UMTYqKSh2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEZGSV9UWVBFX1NUUlVDVDoKKyNpZiBfX0JJR19FTkRJQU5fXworCQkJCS8qCisJCQkJICogTWljcm9CbGF6ZSB0b29sY2hhaW4gYXBwZWFycyB0byBlbWl0OgorCQkJCSAqIGJzcmxpIHI1LCByNSwgOCAoY2FsbGVyKQorCQkJCSAqIC4uLgorCQkJCSAqIDxicmFuY2ggdG8gY2FsbGVlPgorCQkJCSAqIC4uLgorCQkJCSAqIGJzbGxpIHI1LCByNSwgOCAoY2FsbGVlKQorCQkJCSAqIAorCQkJCSAqIEZvciBzdHJ1Y3RzIGxpa2UgInN0cnVjdCBhIHsgdWludDhfdCBhWzNdOyB9OyIsIHdoZW4gcGFzc2VkCisJCQkJICogYnkgdmFsdWUuCisJCQkJICoKKwkJCQkgKiBTdHJ1Y3RzIGxpa2UgInN0cnVjdCBiIHsgdWludDE2X3QgYTsgfTsiIGFyZSBhbHNvIGV4cGVjdGVkCisJCQkJICogdG8gYmUgcGFja2VkIHN0cmFuZ2VseSBpbiByZWdpc3RlcnMuCisJCQkJICoKKwkJCQkgKiBUaGlzIGFwcGVhcnMgdG8gYmUgYmVjYXVzZSB0aGUgbWljcm9ibGF6ZSB0b29sY2hhaW4gZXhwZWN0cworCQkJCSAqICJzdHJ1Y3QgYiA9PSB1aW50MTZfdCIsIHdoaWNoIGlzIG9ubHkgYW55IGlzc3VlIGZvciBiaWcKKwkJCQkgKiBlbmRpYW4uCisJCQkJICoKKwkJCQkgKiBUaGUgZm9sbG93aW5nIGlzIGEgd29yayBhcm91bmQgZm9yIGJpZy1lbmRpYW4gb25seSwgZm9yIHRoZQorCQkJCSAqIGFib3ZlIG1lbnRpb25lZCBjYXNlLCBpdCB3aWxsIHJlLWFsaWduIHRoZSBjb250ZW50cyBvZiBhCisJCQkJICogPD0gMy1ieXRlIHN0cnVjdCB2YWx1ZS4KKwkJCQkgKi8KKwkJCQlpZiAoc2l6ZSA8IFdPUkRfU0laRSkKKwkJCQl7CisJCQkJICBtZW1jcHkgKGFkZHIgKyAoV09SRF9TSVpFIC0gc2l6ZSksIHZhbHVlLCBzaXplKTsKKwkJCQkgIGJyZWFrOworCQkJCX0KKyNlbmRpZgorCQkJY2FzZSBGRklfVFlQRV9TSU5UMzI6CisJCQljYXNlIEZGSV9UWVBFX1VJTlQzMjoKKwkJCWNhc2UgRkZJX1RZUEVfRkxPQVQ6CisJCQljYXNlIEZGSV9UWVBFX1NJTlQ2NDoKKwkJCWNhc2UgRkZJX1RZUEVfVUlOVDY0OgorCQkJY2FzZSBGRklfVFlQRV9ET1VCTEU6CisJCQlkZWZhdWx0OgorCQkJCW1lbWNweShhZGRyLCB2YWx1ZSwgYWxpZ25lZF9zaXplKTsKKwkJfQorCX0KK30KKworZmZpX3N0YXR1cyBmZmlfcHJlcF9jaWZfbWFjaGRlcChmZmlfY2lmKiBjaWYpCit7CisJLyogY2hlY2sgQUJJICovCisJc3dpdGNoIChjaWYtPmFiaSkKKwl7CisJCWNhc2UgRkZJX1NZU1Y6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBGRklfQkFEX0FCSTsKKwl9CisJcmV0dXJuIEZGSV9PSzsKK30KKwordm9pZCBmZmlfY2FsbChmZmlfY2lmKiBjaWYsIHZvaWQgKCpmbikodm9pZCksIHZvaWQqIHJ2YWx1ZSwgdm9pZCoqIGF2YWx1ZSkKK3sKKwlleHRlbmRlZF9jaWYgZWNpZjsKKwllY2lmLmNpZiA9IGNpZjsKKwllY2lmLmF2YWx1ZSA9IGF2YWx1ZTsKKworCS8qIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYSBzdHJ1Y3QgYW5kIHdlIGRvbid0IGhhdmUgYSByZXR1cm4gKi8KKwkvKiB2YWx1ZSBhZGRyZXNzIHRoZW4gd2UgbmVlZCB0byBtYWtlIG9uZSAqLworCWlmICgocnZhbHVlID09IE5VTEwpICYmIChjaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCkpIHsKKwkJZWNpZi5ydmFsdWUgPSBhbGxvY2EoY2lmLT5ydHlwZS0+c2l6ZSk7CisJfSBlbHNlIHsKKwkJZWNpZi5ydmFsdWUgPSBydmFsdWU7CisJfQorCisJc3dpdGNoIChjaWYtPmFiaSkKKwl7CisJY2FzZSBGRklfU1lTVjoKKwkJZmZpX2NhbGxfU1lTVihmZmlfcHJlcF9hcmdzLCAmZWNpZiwgY2lmLT5ieXRlcywgY2lmLT5mbGFncywKKwkJCQllY2lmLnJ2YWx1ZSwgZm4sIGNpZi0+cnR5cGUtPnR5cGUsIGNpZi0+cnR5cGUtPnNpemUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlGRklfQVNTRVJUKDApOworCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgZmZpX2Nsb3N1cmVfY2FsbF9TWVNWKHZvaWQqIHJlZ2lzdGVyX2FyZ3MsIHZvaWQqIHN0YWNrX2FyZ3MsCisJCQlmZmlfY2xvc3VyZSogY2xvc3VyZSwgdm9pZCogcnZhbHVlLAorCQkJdW5zaWduZWQgaW50KiBydHlwZSwgdW5zaWduZWQgaW50KiByc2l6ZSkKK3sKKwkvKiBwcmVwYXJlIGFyZ3VtZW50cyBmb3IgY2xvc3VyZSBjYWxsICovCisJZmZpX2NpZiogY2lmID0gY2xvc3VyZS0+Y2lmOworCWZmaV90eXBlKiogYXJnX3R5cGVzID0gY2lmLT5hcmdfdHlwZXM7CisKKwkvKiByZS1hbGxvY2F0ZSBkYXRhIGZvciB0aGUgYXJncy4gVGhpcyBuZWVkcyB0byBiZSBkb25lIGluIG9yZGVyIHRvIGtlZXAKKwkgKiBtdWx0aS13b3JkIG9iamVjdHMgKGUuZy4gc3RydWN0cykgaW4gY29udGlnaW91cyBtZW1vcnkuIENhbGxlcnMgYXJlIG5vdAorCSAqIHJlcXVpcmVkIHRvIHN0b3JlIHRoZSB2YWx1ZSBvZiBhcmdzIGluIHRoZSBsb3dlciA2IHdvcmRzIGluIHRoZSBzdGFjaworCSAqIChhbHRob3VnaCB0aGV5IGFyZSBhbGxvY2F0ZWQgaW4gdGhlIHN0YWNrKS4KKwkgKi8KKwljaGFyKiBzdGFja2Nsb25lID0gYWxsb2NhKGNpZi0+Ynl0ZXMpOworCXZvaWQqKiBhdmFsdWUgPSBhbGxvY2EoY2lmLT5uYXJncyAqIHNpemVvZih2b2lkKikpOworCXZvaWQqIHN0cnVjdF9ydmFsdWUgPSBOVUxMOworCWNoYXIqIHB0ciA9IHN0YWNrY2xvbmU7CisJaW50IGk7CisKKwkvKiBjb3B5IHJlZ2lzdGVycyBpbnRvIHN0YWNrIGNsb25lICovCisJaW50IHJlZ2lzdGVyc191c2VkID0gY2lmLT5ieXRlczsKKwlpZiAocmVnaXN0ZXJzX3VzZWQgPiBBUkdTX1JFR0lTVEVSX1NJWkUpIHsKKwkJcmVnaXN0ZXJzX3VzZWQgPSBBUkdTX1JFR0lTVEVSX1NJWkU7CisJfQorCW1lbWNweShzdGFja2Nsb25lLCByZWdpc3Rlcl9hcmdzLCByZWdpc3RlcnNfdXNlZCk7CisKKwkvKiBjb3B5IHN0YWNrIGFsbG9jYXRlZCBhcmdzIGludG8gc3RhY2sgY2xvbmUgKi8KKwlpZiAoY2lmLT5ieXRlcyA+IEFSR1NfUkVHSVNURVJfU0laRSkgeworCQlpbnQgc3RhY2tfdXNlZCA9IGNpZi0+Ynl0ZXMgLSBBUkdTX1JFR0lTVEVSX1NJWkU7CisJCW1lbWNweShzdGFja2Nsb25lICsgQVJHU19SRUdJU1RFUl9TSVpFLCBzdGFja19hcmdzLCBzdGFja191c2VkKTsKKwl9CisKKwkvKiBwcmVzZXJ2ZSBzdHJ1Y3QgdHlwZSByZXR1cm4gcG9pbnRlciBwYXNzaW5nICovCisJaWYgKChjaWYtPnJ0eXBlICE9IE5VTEwpICYmIChjaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCkpIHsKKwkJc3RydWN0X3J2YWx1ZSA9ICooKHZvaWQqKilwdHIpOworCQlwdHIgKz0gV09SRF9TSVpFOworCX0KKworCS8qIHBvcHVsYXRlIGFyZyBwb2ludGVyIGxpc3QgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY2lmLT5uYXJnczsgaSsrKQorCXsKKwkJc3dpdGNoIChhcmdfdHlwZXNbaV0tPnR5cGUpCisJCXsKKwkJCWNhc2UgRkZJX1RZUEVfU0lOVDg6CisJCQljYXNlIEZGSV9UWVBFX1VJTlQ4OgorI2lmZGVmIF9fQklHX0VORElBTl9fCisJCQkJYXZhbHVlW2ldID0gcHRyICsgMzsKKyNlbHNlCisJCQkJYXZhbHVlW2ldID0gcHRyOworI2VuZGlmCisJCQkJYnJlYWs7CisJCQljYXNlIEZGSV9UWVBFX1NJTlQxNjoKKwkJCWNhc2UgRkZJX1RZUEVfVUlOVDE2OgorI2lmZGVmIF9fQklHX0VORElBTl9fCisJCQkJYXZhbHVlW2ldID0gcHRyICsgMjsKKyNlbHNlCisJCQkJYXZhbHVlW2ldID0gcHRyOworI2VuZGlmCisJCQkJYnJlYWs7CisJCQljYXNlIEZGSV9UWVBFX1NUUlVDVDoKKyNpZiBfX0JJR19FTkRJQU5fXworCQkJCS8qCisJCQkJICogV29yayBhcm91bmQgc3RyYW5nZSBBQkkgYmVoYXZpb3VyLgorCQkJCSAqIChzZWUgaW5mbyBpbiBmZmlfcHJlcF9hcmdzKQorCQkJCSAqLworCQkJCWlmIChhcmdfdHlwZXNbaV0tPnNpemUgPCBXT1JEX1NJWkUpCisJCQkJeworCQkJCSAgbWVtY3B5IChwdHIsIHB0ciArIChXT1JEX1NJWkUgLSBhcmdfdHlwZXNbaV0tPnNpemUpLCBhcmdfdHlwZXNbaV0tPnNpemUpOworCQkJCX0KKyNlbmRpZgorCQkJCWF2YWx1ZVtpXSA9ICh2b2lkKilwdHI7CisJCQkJYnJlYWs7CisJCQljYXNlIEZGSV9UWVBFX1VJTlQ2NDoKKwkJCWNhc2UgRkZJX1RZUEVfU0lOVDY0OgorCQkJY2FzZSBGRklfVFlQRV9ET1VCTEU6CisJCQkJYXZhbHVlW2ldID0gcHRyOworCQkJCWJyZWFrOworCQkJY2FzZSBGRklfVFlQRV9TSU5UMzI6CisJCQljYXNlIEZGSV9UWVBFX1VJTlQzMjoKKwkJCWNhc2UgRkZJX1RZUEVfRkxPQVQ6CisJCQlkZWZhdWx0OgorCQkJCS8qIGRlZmF1bHQgNC1ieXRlIGFyZ3VtZW50ICovCisJCQkJYXZhbHVlW2ldID0gcHRyOworCQkJCWJyZWFrOworCQl9CisJCXB0ciArPSBXT1JEX0FMSUdOKGFyZ190eXBlc1tpXS0+c2l6ZSk7CisJfQorCisJLyogc2V0IHRoZSByZXR1cm4gdHlwZSBpbmZvIHBhc3NlZCBiYWNrIHRvIHRoZSB3cmFwcGVyICovCisJKnJzaXplID0gY2lmLT5ydHlwZS0+c2l6ZTsKKwkqcnR5cGUgPSBjaWYtPnJ0eXBlLT50eXBlOworCWlmIChzdHJ1Y3RfcnZhbHVlICE9IE5VTEwpIHsKKwkJY2xvc3VyZS0+ZnVuKGNpZiwgc3RydWN0X3J2YWx1ZSwgYXZhbHVlLCBjbG9zdXJlLT51c2VyX2RhdGEpOworCQkvKiBjb3B5IHN0cnVjdCByZXR1cm4gcG9pbnRlciB2YWx1ZSBpbnRvIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSAqLworCQkqKCh2b2lkKiopcnZhbHVlKSA9IHN0cnVjdF9ydmFsdWU7CisJfSBlbHNlIHsKKwkJY2xvc3VyZS0+ZnVuKGNpZiwgcnZhbHVlLCBhdmFsdWUsIGNsb3N1cmUtPnVzZXJfZGF0YSk7CisJfQorfQorCitmZmlfc3RhdHVzIGZmaV9wcmVwX2Nsb3N1cmVfbG9jKAorCQlmZmlfY2xvc3VyZSogY2xvc3VyZSwgZmZpX2NpZiogY2lmLAorCQl2b2lkICgqZnVuKShmZmlfY2lmKiwgdm9pZCosIHZvaWQqKiwgdm9pZCopLAorCQl2b2lkKiB1c2VyX2RhdGEsIHZvaWQqIGNvZGVsb2MpCit7CisJdW5zaWduZWQgbG9uZyogdHJhbXAgPSAodW5zaWduZWQgbG9uZyopJihjbG9zdXJlLT50cmFtcFswXSk7CisJdW5zaWduZWQgbG9uZyBjbHMgPSAodW5zaWduZWQgbG9uZyljb2RlbG9jOworCXVuc2lnbmVkIGxvbmcgZm4gPSAwOworCXVuc2lnbmVkIGxvbmcgZm5fY2xvc3VyZV9jYWxsX3N5c3YgPSAodW5zaWduZWQgbG9uZylmZmlfY2xvc3VyZV9jYWxsX1NZU1Y7CisKKwljbG9zdXJlLT5jaWYgPSBjaWY7CisJY2xvc3VyZS0+ZnVuID0gZnVuOworCWNsb3N1cmUtPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKworCXN3aXRjaCAoY2lmLT5hYmkpCisJeworCWNhc2UgRkZJX1NZU1Y6CisJCWZuID0gKHVuc2lnbmVkIGxvbmcpZmZpX2Nsb3N1cmVfU1lTVjsKKworCQkvKiBsb2FkIHIxMSAodGVtcCkgd2l0aCBmbiAqLworCQkvKiBpbW0gZm4odXBwZXIpICovCisJCXRyYW1wWzBdID0gMHhiMDAwMDAwMCB8ICgoZm4gPj4gMTYpICYgMHhmZmZmKTsKKwkJLyogYWRkaWsgcjExLCByMCwgZm4obG93ZXIpICovCisJCXRyYW1wWzFdID0gMHgzMTYwMDAwMCB8IChmbiAmIDB4ZmZmZik7CisKKwkJLyogbG9hZCByMTIgKHRlbXApIHdpdGggY2xzICovCisJCS8qIGltbSBjbHModXBwZXIpICovCisJCXRyYW1wWzJdID0gMHhiMDAwMDAwMCB8ICgoY2xzID4+IDE2KSAmIDB4ZmZmZik7CisJCS8qIGFkZGlrIHIxMiwgcjAsIGNscyhsb3dlcikgKi8KKwkJdHJhbXBbM10gPSAweDMxODAwMDAwIHwgKGNscyAmIDB4ZmZmZik7CisKKwkJLyogbG9hZCByMyAodGVtcCkgd2l0aCBmZmlfY2xvc3VyZV9jYWxsX1NZU1YgKi8KKwkJLyogaW1tIGZuX2Nsb3N1cmVfY2FsbF9zeXN2KHVwcGVyKSAqLworCQl0cmFtcFs0XSA9IDB4YjAwMDAwMDAgfCAoKGZuX2Nsb3N1cmVfY2FsbF9zeXN2ID4+IDE2KSAmIDB4ZmZmZik7CisJCS8qIGFkZGlrIHIzLCByMCwgZm5fY2xvc3VyZV9jYWxsX3N5c3YobG93ZXIpICovCisJCXRyYW1wWzVdID0gMHgzMDYwMDAwMCB8IChmbl9jbG9zdXJlX2NhbGxfc3lzdiAmIDB4ZmZmZik7CisJCS8qIGJyYW5jaC9qdW1wIHRvIGFkZHJlc3Mgc3RvcmVkIGluIHIxMSAoZm4pICovCisJCXRyYW1wWzZdID0gMHg5ODA4NTgwMDsgLyogYnJhIHIxMSAqLworCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBGRklfQkFEX0FCSTsKKwl9CisJcmV0dXJuIEZGSV9PSzsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL21pY3JvYmxhemUvZmZpdGFyZ2V0LmggYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9taWNyb2JsYXplL2ZmaXRhcmdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZmE1YTQKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9taWNyb2JsYXplL2ZmaXRhcmdldC5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBmZml0YXJnZXQuaCAtIENvcHlyaWdodCAoYykgMjAxMiwgMjAxMyBYaWxpbngsIEluYworCisgICBUYXJnZXQgY29uZmlndXJhdGlvbiBtYWNyb3MgZm9yIE1pY3JvQmxhemUuCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTElCRkZJX1RBUkdFVF9ICisjZGVmaW5lIExJQkZGSV9UQVJHRVRfSAorCisjaWZuZGVmIExJQkZGSV9ICisjZXJyb3IgIlBsZWFzZSBkbyBub3QgaW5jbHVkZSBmZml0YXJnZXQuaCBkaXJlY3RseSBpbnRvIHlvdXIgc291cmNlLiAgVXNlIGZmaS5oIGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgTElCRkZJX0FTTQordHlwZWRlZiB1bnNpZ25lZCBsb25nCQkJZmZpX2FyZzsKK3R5cGVkZWYgc2lnbmVkIGxvbmcJCQlmZmlfc2FyZzsKKwordHlwZWRlZiBlbnVtIGZmaV9hYmkgeworCUZGSV9GSVJTVF9BQkkgPSAwLAorCUZGSV9TWVNWLAorCUZGSV9MQVNUX0FCSSwKKwlGRklfREVGQVVMVF9BQkkgPSBGRklfU1lTVgorfSBmZmlfYWJpOworI2VuZGlmCisKKy8qIERlZmluaXRpb25zIGZvciBjbG9zdXJlcyAqLworCisjZGVmaW5lIEZGSV9DTE9TVVJFUyAxCisjZGVmaW5lIEZGSV9OQVRJVkVfUkFXX0FQSSAwCisKKyNkZWZpbmUgRkZJX1RSQU1QT0xJTkVfU0laRSAoNCo4KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL21pY3JvYmxhemUvc3lzdi5TIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvbWljcm9ibGF6ZS9zeXN2LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ExOTVhNgotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL21pY3JvYmxhemUvc3lzdi5TCkBAIC0wLDAgKzEsMzAyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgc3lzdi5TIC0gQ29weXJpZ2h0IChjKSAyMDEyLCAyMDEzIFhpbGlueCwgSW5jCisKKyAgIE1pY3JvQmxhemUgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UKKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICAgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICAgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBMSUJGRklfQVNNCisjaW5jbHVkZSA8ZmZpY29uZmlnLmg+CisjaW5jbHVkZSA8ZmZpLmg+CisKKwkvKgorCSAqIGFyZ1swXSAocjUpICA9IGZmaV9wcmVwX2FyZ3MsCisJICogYXJnWzFdIChyNikgID0gJmVjaWYsCisJICogYXJnWzJdIChyNykgID0gY2lmLT5ieXRlcywKKwkgKiBhcmdbM10gKHI4KSAgPSBjaWYtPmZsYWdzLAorCSAqIGFyZ1s0XSAocjkpICA9IGVjaWYucnZhbHVlLAorCSAqIGFyZ1s1XSAocjEwKSA9IGZuCisJICogYXJnWzZdIChzcFswXSkgPSBjaWYtPnJ0eXBlLT50eXBlCisJICogYXJnWzddIChzcFs0XSkgPSBjaWYtPnJ0eXBlLT5zaXplCisJICovCisJLnRleHQKKwkuZ2xvYmwgZmZpX2NhbGxfU1lTVgorCS50eXBlIGZmaV9jYWxsX1NZU1YsIEBmdW5jdGlvbgorZmZpX2NhbGxfU1lTVjoKKwkvKiBwdXNoIGNhbGxlZSBzYXZlcyAqLworCWFkZGlrIHIxLCByMSwgLTIwCisJc3dpIHIxOSwgcjEsIDAgLyogRnJhbWUgUG9pbnRlciAqLworCXN3aSByMjAsIHIxLCA0IC8qIFBJQyByZWdpc3RlciAqLworCXN3aSByMjEsIHIxLCA4IC8qIFBJQyByZWdpc3RlciAqLworCXN3aSByMjIsIHIxLCAxMiAvKiBzYXZlIGZvciBsb2NhbHMgKi8KKwlzd2kgcjIzLCByMSwgMTYgLyogc2F2ZSBmb3IgbG9jYWxzICovCisJCisJLyogc2F2ZSB0aGUgcjUtcjEwIHJlZ2lzdGVycyBpbiB0aGUgc3RhY2sgKi8KKwlhZGRpayByMSwgcjEsIC0yNCAvKiBpbmNyZW1lbnQgc3AgdG8gc3RvcmUgNnggMzItYml0IHdvcmRzICovCisJc3dpIHI1LCByMSwgMAorCXN3aSByNiwgcjEsIDQKKwlzd2kgcjcsIHIxLCA4CisJc3dpIHI4LCByMSwgMTIKKwlzd2kgcjksIHIxLCAxNgorCXN3aSByMTAsIHIxLCAyMAorCisJLyogc2F2ZSBmdW5jdGlvbiBwb2ludGVyICovCisJYWRkaWsgcjMsIHI1LCAwIC8qIGNvcHkgZmZpX3ByZXBfYXJncyBpbnRvIHIzICovCisJYWRkaWsgcjIyLCByMSwgMCAvKiBzYXZlIHNwIGZvciB1bmFsbG9jYXRlZCBhcmdzIGludG8gcjIyIChjYWxsZWUtc2F2ZWQpICovCisJYWRkaWsgcjIzLCByMTAsIDAgLyogc2F2ZSBmdW5jdGlvbiBhZGRyZXNzIGludG8gcjIzIChjYWxsZWUtc2F2ZWQpICovCisKKwkvKiBwcmVwYXJlIHN0YWNrIHdpdGggYWxsb2NhdGlvbiBmb3IgbiAoYnl0ZXMgPSByNykgYXJncyAqLworCXJzdWIgcjEsIHI3LCByMSAvKiBzdWJ0cmFjdCBieXRlcyBmcm9tIHNwICovCisKKwkvKiBwcmVwIGFyZ3MgZm9yIGZmaV9wcmVwX2FyZ3MgY2FsbCAqLworCWFkZGlrIHI1LCByMSwgMCAvKiBzdG9yZSBzdGFjayBwb2ludGVyIGludG8gYXJnWzBdICovCisJLyogcjYgc3RpbGwgaG9sZHMgZWNpZiBmb3IgYXJnWzFdICovCisKKwkvKiBDYWxsIGZmaV9wcmVwX2FyZ3Moc3RhY2ssICZlY2lmKS4gKi8KKwlhZGRpayByMSwgcjEsIC00CisJc3dpIHIxNSwgcjEsIDAgLyogc3RvcmUgdGhlIGxpbmsgcmVnaXN0ZXIgaW4gdGhlIGZyYW1lICovCisJYnJhbGQgcjE1LCByMworCW5vcCAvKiBicmFuY2ggaGFzIGRlbGF5IHNsb3QgKi8KKwlsd2kgcjE1LCByMSwgMAorCWFkZGlrIHIxLCByMSwgNCAvKiByZXN0b3JlIHRoZSBsaW5rIHJlZ2lzdGVyIGZyb20gdGhlIGZyYW1lICovCisJLyogcmV0dXJucyBjYWxsaW5nIHN0YWNrIHBvaW50ZXIgbG9jYXRpb24gKi8KKworCS8qIHByZXBhcmUgYXJncyBmb3IgZm4gY2FsbCwgcHJlcF9hcmdzIHBvcHVsYXRlcyB0aGVtIG9udG8gdGhlIHN0YWNrICovCisJbHdpIHI1LCByMSwgMCAvKiBhcmdbMF0gKi8KKwlsd2kgcjYsIHIxLCA0IC8qIGFyZ1sxXSAqLworCWx3aSByNywgcjEsIDggLyogYXJnWzJdICovCisJbHdpIHI4LCByMSwgMTIgLyogYXJnWzNdICovCisJbHdpIHI5LCByMSwgMTYgLyogYXJnWzRdICovCisJbHdpIHIxMCwgcjEsIDIwIC8qIGFyZ1s1XSAqLworCisJLyogY2FsbCAoZm4pICguLi4pLiAqLworCWFkZGlrIHIxLCByMSwgLTQKKwlzd2kgcjE1LCByMSwgMCAvKiBzdG9yZSB0aGUgbGluayByZWdpc3RlciBpbiB0aGUgZnJhbWUgKi8KKwlicmFsZCByMTUsIHIyMworCW5vcCAvKiBicmFuY2ggaGFzIGRlbGF5IHNsb3QgKi8KKwlsd2kgcjE1LCByMSwgMAorCWFkZGlrIHIxLCByMSwgNCAvKiByZXN0b3JlIHRoZSBsaW5rIHJlZ2lzdGVyIGZyb20gdGhlIGZyYW1lICovCisKKwkvKiBSZW1vdmUgdGhlIHNwYWNlIHdlIHB1c2hlZCBmb3IgdGhlIGFyZ3MuICovCisJYWRkaWsgcjEsIHIyMiwgMCAvKiByZXN0b3JlIG9sZCBTUCAqLworCisJLyogcmVzdG9yZSB0aGlzIGZ1bmN0aW9ucyBwYXJhbWV0ZXJzICovCisJbHdpIHI1LCByMSwgMCAvKiBhcmdbMF0gKi8KKwlsd2kgcjYsIHIxLCA0IC8qIGFyZ1sxXSAqLworCWx3aSByNywgcjEsIDggLyogYXJnWzJdICovCisJbHdpIHI4LCByMSwgMTIgLyogYXJnWzNdICovCisJbHdpIHI5LCByMSwgMTYgLyogYXJnWzRdICovCisJbHdpIHIxMCwgcjEsIDIwIC8qIGFyZ1s1XSAqLworCWFkZGlrIHIxLCByMSwgMjQgLyogZGVjcmVtZW50IHNwIHRvIGRlLWFsbG9jYXRlIDZ4IDMyLWJpdCB3b3JkcyAqLworCisJLyogSWYgdGhlIHJldHVybiB2YWx1ZSBwb2ludGVyIGlzIE5VTEwsIGFzc3VtZSBubyByZXR1cm4gdmFsdWUuICovCisJYmVxaSByOSwgZmZpX2NhbGxfU1lTVl9lbmQKKworCWx3aSByMjIsIHIxLCA0OCAvKiBnZXQgcmV0dXJuIHR5cGUgKDIwIGZvciBsb2NhbHMgKyAyOCBmb3IgYXJnWzZdKSAqLworCWx3aSByMjMsIHIxLCA1MiAvKiBnZXQgcmV0dXJuIHNpemUgKDIwIGZvciBsb2NhbHMgKyAzMiBmb3IgYXJnWzddKSAgKi8KKwkKKwkvKiBDaGVjayBpZiByZXR1cm4gdHlwZSBpcyBhY3R1YWxseSBhIHN0cnVjdCwgZG8gbm90aGluZyAqLworCXJzdWJpIHIxMSwgcjIyLCBGRklfVFlQRV9TVFJVQ1QKKwliZXFpIHIxMSwgZmZpX2NhbGxfU1lTVl9lbmQKKworCS8qIFJldHVybiA4Yml0ICovCisJcnN1YmkgcjExLCByMjMsIDEKKwliZXFpIHIxMSwgZmZpX2NhbGxfU1lTVl9zdG9yZTgKKworCS8qIFJldHVybiAxNmJpdCAqLworCXJzdWJpIHIxMSwgcjIzLCAyCisJYmVxaSByMTEsIGZmaV9jYWxsX1NZU1Zfc3RvcmUxNgorCisJLyogUmV0dXJuIDMyYml0ICovCisJcnN1YmkgcjExLCByMjMsIDQKKwliZXFpIHIxMSwgZmZpX2NhbGxfU1lTVl9zdG9yZTMyCisKKwkvKiBSZXR1cm4gNjRiaXQgKi8KKwlyc3ViaSByMTEsIHIyMywgOAorCWJlcWkgcjExLCBmZmlfY2FsbF9TWVNWX3N0b3JlNjQKKworCS8qIERpZG50IG1hdGNoIGFueXRoaW5nICovCisJYnJpIGZmaV9jYWxsX1NZU1ZfZW5kCisKK2ZmaV9jYWxsX1NZU1Zfc3RvcmU2NDoKKwlzd2kgcjMsIHI5LCAwIC8qIHN0b3JlIHdvcmQgcjMgaW50byByZXR1cm4gdmFsdWUgKi8KKwlzd2kgcjQsIHI5LCA0IC8qIHN0b3JlIHdvcmQgcjQgaW50byByZXR1cm4gdmFsdWUgKi8KKwlicmkgZmZpX2NhbGxfU1lTVl9lbmQKKworZmZpX2NhbGxfU1lTVl9zdG9yZTMyOgorCXN3aSByMywgcjksIDAgLyogc3RvcmUgd29yZCByMyBpbnRvIHJldHVybiB2YWx1ZSAqLworCWJyaSBmZmlfY2FsbF9TWVNWX2VuZAorCitmZmlfY2FsbF9TWVNWX3N0b3JlMTY6CisjaWZkZWYgX19CSUdfRU5ESUFOX18KKwlzaGkgcjMsIHI5LCAyIC8qIHN0b3JlIGhhbGYtd29yZCByMyBpbnRvIHJldHVybiB2YWx1ZSAqLworI2Vsc2UKKwlzaGkgcjMsIHI5LCAwIC8qIHN0b3JlIGhhbGYtd29yZCByMyBpbnRvIHJldHVybiB2YWx1ZSAqLworI2VuZGlmCisJYnJpIGZmaV9jYWxsX1NZU1ZfZW5kCisKK2ZmaV9jYWxsX1NZU1Zfc3RvcmU4OgorI2lmZGVmIF9fQklHX0VORElBTl9fCisJc2JpIHIzLCByOSwgMyAvKiBzdG9yZSBieXRlIHIzIGludG8gcmV0dXJuIHZhbHVlICovCisjZWxzZQorCXNiaSByMywgcjksIDAgLyogc3RvcmUgYnl0ZSByMyBpbnRvIHJldHVybiB2YWx1ZSAqLworI2VuZGlmCisJYnJpIGZmaV9jYWxsX1NZU1ZfZW5kCisKK2ZmaV9jYWxsX1NZU1ZfZW5kOgorCS8qIGNhbGxlZSByZXN0b3JlcyAqLworCWx3aSByMTksIHIxLCAwIC8qIGZyYW1lIHBvaW50ZXIgKi8KKwlsd2kgcjIwLCByMSwgNCAvKiBQSUMgcmVnaXN0ZXIgKi8KKwlsd2kgcjIxLCByMSwgOCAvKiBQSUMgcmVnaXN0ZXIgKi8KKwlsd2kgcjIyLCByMSwgMTIKKwlsd2kgcjIzLCByMSwgMTYKKwlhZGRpayByMSwgcjEsIDIwCisKKwkvKiByZXR1cm4gZnJvbSBzdWItcm91dGluZSAod2l0aCBkZWxheSBzbG90KSAqLworCXJ0c2QgcjE1LCA4CisJbm9wCisKKwkuc2l6ZSBmZmlfY2FsbF9TWVNWLCAuIC0gZmZpX2NhbGxfU1lTVgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkvKgorCSAqIGFyZ3MgcGFzc2VkIGludG8gdGhpcyBmdW5jdGlvbiwgYXJlIHBhc3NlZCBkb3duIHRvIHRoZSBjYWxsZWUuCisJICogdGhpcyBmdW5jdGlvbiBpcyB0aGUgdGFyZ2V0IG9mIHRoZSBjbG9zdXJlIHRyYW1wb2xpbmUsIGFzIHN1Y2ggcjEyIGlzIAorCSAqIGEgcG9pbnRlciB0byB0aGUgY2xvc3VyZSBvYmplY3QuCisJICovCisJLnRleHQKKwkuZ2xvYmwgZmZpX2Nsb3N1cmVfU1lTVgorCS50eXBlIGZmaV9jbG9zdXJlX1NZU1YsIEBmdW5jdGlvbgorZmZpX2Nsb3N1cmVfU1lTVjoKKwkvKiBwdXNoIGNhbGxlZSBzYXZlcyAqLworCWFkZGlrIHIxMSwgcjEsIDI4IC8qIHNhdmUgc3RhY2sgYXJncyBzdGFydCBsb2NhdGlvbiAoZXhjbHVkaW5nIHJlZ3MvbGluaykgKi8KKwlhZGRpayByMSwgcjEsIC0xMgorCXN3aSByMTksIHIxLCAwIC8qIEZyYW1lIFBvaW50ZXIgKi8KKwlzd2kgcjIwLCByMSwgNCAvKiBQSUMgcmVnaXN0ZXIgKi8KKwlzd2kgcjIxLCByMSwgOCAvKiBQSUMgcmVnaXN0ZXIgKi8KKworCS8qIHN0b3JlIHJlZ2lzdGVyIGFyZ3Mgb24gc3RhY2sgKi8KKwlhZGRpayByMSwgcjEsIC0yNAorCXN3aSByNSwgcjEsIDAKKwlzd2kgcjYsIHIxLCA0CisJc3dpIHI3LCByMSwgOAorCXN3aSByOCwgcjEsIDEyCisJc3dpIHI5LCByMSwgMTYKKwlzd2kgcjEwLCByMSwgMjAKKworCS8qIHNldHVwIGFyZ3MgKi8KKwlhZGRpayByNSwgcjEsIDAgLyogcmVnaXN0ZXJfYXJncyAqLworCWFkZGlrIHI2LCByMTEsIDAgLyogc3RhY2tfYXJncyAqLworCWFkZGlrIHI3LCByMTIsIDAgLyogY2xvc3VyZSBvYmplY3QgKi8KKwlhZGRpayByMSwgcjEsIC04IC8qIGFsbG9jYXRlIHJldHVybiB2YWx1ZSAqLworCWFkZGlrIHI4LCByMSwgMCAvKiB2b2lkKiBydmFsdWUgKi8KKwlhZGRpayByMSwgcjEsIC04IC8qIGFsbG9jYXRlIGZvciByZXV0cm4gdHlwZS9zaXplIHZhbHVlcyAqLworCWFkZGlrIHI5LCByMSwgMCAvKiB2b2lkKiBydHlwZSAqLworCWFkZGlrIHIxMCwgcjEsIDQgLyogdm9pZCogcnNpemUgKi8KKworCS8qIGNhbGwgdGhlIHdyYXBfY2FsbCBmdW5jdGlvbiAqLworCWFkZGlrIHIxLCByMSwgLTI4IC8qIGFsbG9jYXRlIGFyZ3MgKyBsaW5rIHJlZyAqLworCXN3aSByMTUsIHIxLCAwIC8qIHN0b3JlIHRoZSBsaW5rIHJlZ2lzdGVyIGluIHRoZSBmcmFtZSAqLworCWJyYWxkIHIxNSwgcjMKKwlub3AgLyogYnJhbmNoIGhhcyBkZWxheSBzbG90ICovCisJbHdpIHIxNSwgcjEsIDAKKwlhZGRpayByMSwgcjEsIDI4IC8qIHJlc3RvcmUgdGhlIGxpbmsgcmVnaXN0ZXIgZnJvbSB0aGUgZnJhbWUgKi8KKworZmZpX2Nsb3N1cmVfU1lTVl9wcmVwYXJlX3JldHVybjoKKwlsd2kgcjksIHIxLCAwIC8qIHJ0eXBlICovCisJbHdpIHIxMCwgcjEsIDQgLyogcnNpemUgKi8KKwlhZGRpayByMSwgcjEsIDggLyogZGUtYWxsb2NhdGUgcmV0dXJuIGluZm8gdmFsdWVzICovCisKKwkvKiBDaGVjayBpZiByZXR1cm4gdHlwZSBpcyBhY3R1YWxseSBhIHN0cnVjdCwgc3RvcmUgNCBieXRlcyAqLworCXJzdWJpIHIxMSwgcjksIEZGSV9UWVBFX1NUUlVDVAorCWJlcWkgcjExLCBmZmlfY2xvc3VyZV9TWVNWX3N0b3JlMzIKKworCS8qIFJldHVybiA4Yml0ICovCisJcnN1YmkgcjExLCByMTAsIDEKKwliZXFpIHIxMSwgZmZpX2Nsb3N1cmVfU1lTVl9zdG9yZTgKKworCS8qIFJldHVybiAxNmJpdCAqLworCXJzdWJpIHIxMSwgcjEwLCAyCisJYmVxaSByMTEsIGZmaV9jbG9zdXJlX1NZU1Zfc3RvcmUxNgorCisJLyogUmV0dXJuIDMyYml0ICovCisJcnN1YmkgcjExLCByMTAsIDQKKwliZXFpIHIxMSwgZmZpX2Nsb3N1cmVfU1lTVl9zdG9yZTMyCisKKwkvKiBSZXR1cm4gNjRiaXQgKi8KKwlyc3ViaSByMTEsIHIxMCwgOAorCWJlcWkgcjExLCBmZmlfY2xvc3VyZV9TWVNWX3N0b3JlNjQKKworCS8qIERpZG50IG1hdGNoIGFueXRoaW5nICovCisJYnJpIGZmaV9jbG9zdXJlX1NZU1ZfZW5kCisKK2ZmaV9jbG9zdXJlX1NZU1Zfc3RvcmU2NDoKKwlsd2kgcjMsIHIxLCAwIC8qIHN0b3JlIHdvcmQgcjMgaW50byByZXR1cm4gdmFsdWUgKi8KKwlsd2kgcjQsIHIxLCA0IC8qIHN0b3JlIHdvcmQgcjQgaW50byByZXR1cm4gdmFsdWUgKi8KKwkvKiA2NCBiaXRzID09IDIgd29yZHMsIG5vIHNpZ24gZXh0ZW5kIG9jY3VycyAqLworCWJyaSBmZmlfY2xvc3VyZV9TWVNWX2VuZAorCitmZmlfY2xvc3VyZV9TWVNWX3N0b3JlMzI6CisJbHdpIHIzLCByMSwgMCAvKiBzdG9yZSB3b3JkIHIzIGludG8gcmV0dXJuIHZhbHVlICovCisJLyogMzIgYml0cyA9PSAxIHdvcmQsIG5vIHNpZ24gZXh0ZW5kIG9jY3VycyAqLworCWJyaSBmZmlfY2xvc3VyZV9TWVNWX2VuZAorCitmZmlfY2xvc3VyZV9TWVNWX3N0b3JlMTY6CisjaWZkZWYgX19CSUdfRU5ESUFOX18KKwlsaHVpIHIzLCByMSwgMiAvKiBzdG9yZSBoYWxmLXdvcmQgcjMgaW50byByZXR1cm4gdmFsdWUgKi8KKyNlbHNlCisJbGh1aSByMywgcjEsIDAgLyogc3RvcmUgaGFsZi13b3JkIHIzIGludG8gcmV0dXJuIHZhbHVlICovCisjZW5kaWYKKwlyc3ViaSByMTEsIHI5LCBGRklfVFlQRV9TSU5UMTYKKwlibmVpIHIxMSwgZmZpX2Nsb3N1cmVfU1lTVl9lbmQKKwlzZXh0MTYgcjMsIHIzIC8qIGZpeCBzaWduIGV4dGVuZCBvZiBzaW50OCAqLworCWJyaSBmZmlfY2xvc3VyZV9TWVNWX2VuZAorCitmZmlfY2xvc3VyZV9TWVNWX3N0b3JlODoKKyNpZmRlZiBfX0JJR19FTkRJQU5fXworCWxidWkgcjMsIHIxLCAzIC8qIHN0b3JlIGJ5dGUgcjMgaW50byByZXR1cm4gdmFsdWUgKi8KKyNlbHNlCisJbGJ1aSByMywgcjEsIDAgLyogc3RvcmUgYnl0ZSByMyBpbnRvIHJldHVybiB2YWx1ZSAqLworI2VuZGlmCisJcnN1YmkgcjExLCByOSwgRkZJX1RZUEVfU0lOVDgKKwlibmVpIHIxMSwgZmZpX2Nsb3N1cmVfU1lTVl9lbmQKKwlzZXh0OCByMywgcjMgLyogZml4IHNpZ24gZXh0ZW5kIG9mIHNpbnQ4ICovCisJYnJpIGZmaV9jbG9zdXJlX1NZU1ZfZW5kCisKK2ZmaV9jbG9zdXJlX1NZU1ZfZW5kOgorCWFkZGlrIHIxLCByMSwgOCAvKiBkZS1hbGxvY2F0ZSByZXR1cm4gdmFsdWUgKi8KKworCS8qIGRlLWFsbG9jYXRlIHN0b3JlZCBhcmdzICovCisJYWRkaWsgcjEsIHIxLCAyNAorCisJLyogY2FsbGVlIHJlc3RvcmVzICovCisJbHdpIHIxOSwgcjEsIDAgLyogZnJhbWUgcG9pbnRlciAqLworCWx3aSByMjAsIHIxLCA0IC8qIFBJQyByZWdpc3RlciAqLworCWx3aSByMjEsIHIxLCA4IC8qIFBJQyByZWdpc3RlciAqLworCWFkZGlrIHIxLCByMSwgMTIKKworCS8qIHJldHVybiBmcm9tIHN1Yi1yb3V0aW5lICh3aXRoIGRlbGF5IHNsb3QpICovCisJcnRzZCByMTUsIDgKKwlub3AKKworCS5zaXplIGZmaV9jbG9zdXJlX1NZU1YsIC4gLSBmZmlfY2xvc3VyZV9TWVNWCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9taXBzL2ZmaS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvbWlwcy9mZmkuYwppbmRleCBkNzE0Y2M5Li4wMzEyMWUzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9taXBzL2ZmaS5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL21pcHMvZmZpLmMKQEAgLTEsNiArMSw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgZmZpLmMgLSBDb3B5cmlnaHQgKGMpIDE5OTYsIDIwMDcsIDIwMDggIFJlZCBIYXQsIEluYy4KLSAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA4ICAgICAgIERhdmlkIERhbmV5CisgICBmZmkuYyAtIENvcHlyaWdodCAoYykgMjAxMSAgQW50aG9ueSBHcmVlbgorICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDggIERhdmlkIERhbmV5CisgICAgICAgICAgIENvcHlyaWdodCAoYykgMTk5NiwgMjAwNywgMjAwOCwgMjAxMSAgUmVkIEhhdCwgSW5jLgogICAgCiAgICBNSVBTIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlIAogCkBAIC0zNyw3ICszOCwxMSBAQAogI2VuZGlmCiAKICNpZm5kZWYgVVNFX19CVUlMVElOX19fQ0xFQVJfQ0FDSEUKLSNpbmNsdWRlIDxzeXMvY2FjaGVjdGwuaD4KKyMgIGlmIGRlZmluZWQoX19PcGVuQlNEX18pCisjICAgIGluY2x1ZGUgPG1pcHM2NC9zeXNhcmNoLmg+CisjICBlbHNlCisjICAgIGluY2x1ZGUgPHN5cy9jYWNoZWN0bC5oPgorIyAgZW5kaWYKICNlbmRpZgogCiAjaWZkZWYgRkZJX0RFQlVHCkBAIC02NjIsMTAgKzY2NywxOSBAQAogICBjaGFyICpjbGVhcl9sb2NhdGlvbiA9IChjaGFyICopIGNvZGVsb2M7CiAKICNpZiBkZWZpbmVkKEZGSV9NSVBTX08zMikKLSAgRkZJX0FTU0VSVChjaWYtPmFiaSA9PSBGRklfTzMyIHx8IGNpZi0+YWJpID09IEZGSV9PMzJfU09GVF9GTE9BVCk7CisgIGlmIChjaWYtPmFiaSAhPSBGRklfTzMyICYmIGNpZi0+YWJpICE9IEZGSV9PMzJfU09GVF9GTE9BVCkKKyAgICByZXR1cm4gRkZJX0JBRF9BQkk7CiAgIGZuID0gZmZpX2Nsb3N1cmVfTzMyOwotI2Vsc2UgLyogRkZJX01JUFNfTjMyICovCi0gIEZGSV9BU1NFUlQoY2lmLT5hYmkgPT0gRkZJX04zMiB8fCBjaWYtPmFiaSA9PSBGRklfTjY0KTsKKyNlbHNlCisjaWYgX01JUFNfU0lNID09X0FCSU4zMgorICBpZiAoY2lmLT5hYmkgIT0gRkZJX04zMgorICAgICAgJiYgY2lmLT5hYmkgIT0gRkZJX04zMl9TT0ZUX0ZMT0FUKQorICAgIHJldHVybiBGRklfQkFEX0FCSTsKKyNlbHNlCisgIGlmIChjaWYtPmFiaSAhPSBGRklfTjY0CisgICAgICAmJiBjaWYtPmFiaSAhPSBGRklfTjY0X1NPRlRfRkxPQVQpCisgICAgcmV0dXJuIEZGSV9CQURfQUJJOworI2VuZGlmCiAgIGZuID0gZmZpX2Nsb3N1cmVfTjMyOwogI2VuZGlmIC8qIEZGSV9NSVBTX08zMiAqLwogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9taXBzL2ZmaXRhcmdldC5oIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvbWlwcy9mZml0YXJnZXQuaAppbmRleCBjNWY0ZTA1Li43MTdkNjU5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9taXBzL2ZmaXRhcmdldC5oCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL21pcHMvZmZpdGFyZ2V0LmgKQEAgLTEsNSArMSw2IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotQy0qLQotICAgZmZpdGFyZ2V0LmggLSBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMyAgUmVkIEhhdCwgSW5jLgorICAgZmZpdGFyZ2V0LmggLSBDb3B5cmlnaHQgKGMpIDIwMTIgIEFudGhvbnkgR3JlZW4KKyAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAxOTk2LTIwMDMgIFJlZCBIYXQsIEluYy4KICAgIFRhcmdldCBjb25maWd1cmF0aW9uIG1hY3JvcyBmb3IgTUlQUy4KIAogICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCkBAIC0yNywxMSArMjgsMjMgQEAKICNpZm5kZWYgTElCRkZJX1RBUkdFVF9ICiAjZGVmaW5lIExJQkZGSV9UQVJHRVRfSAogCisjaWZuZGVmIExJQkZGSV9ICisjZXJyb3IgIlBsZWFzZSBkbyBub3QgaW5jbHVkZSBmZml0YXJnZXQuaCBkaXJlY3RseSBpbnRvIHlvdXIgc291cmNlLiAgVXNlIGZmaS5oIGluc3RlYWQuIgorI2VuZGlmCisKICNpZmRlZiBsaW51eAogIyBpbmNsdWRlIDxhc20vc2dpZGVmcy5oPgotI2Vsc2UKKyNlbGlmIGRlZmluZWQoX19ydGVtc19fKQorLyoKKyAqIFN1YnByb2dyYW0gY2FsbGluZyBjb252ZW50aW9uIC0gY29waWVkIGZyb20gc2dpZGVmcy5oCisgKi8KKyNkZWZpbmUgX01JUFNfU0lNX0FCSTMyCQkxCisjZGVmaW5lIF9NSVBTX1NJTV9OQUJJMzIJMgorI2RlZmluZSBfTUlQU19TSU1fQUJJNjQJCTMKKyNlbGlmICFkZWZpbmVkKF9fT3BlbkJTRF9fKQogIyBpbmNsdWRlIDxzZ2lkZWZzLmg+CiAjZW5kaWYKKwogIyAgaWZuZGVmIF9BQklOMzIKICMgICAgZGVmaW5lIF9BQklOMzIgX01JUFNfU0lNX05BQkkzMgogIyAgZW5kaWYKQEAgLTQzLDcgKzU2LDcgQEAKICMgIGVuZGlmCiAKICNpZiAhZGVmaW5lZChfTUlQU19TSU0pCi0tLSBzb21ldGhpbmcgaXMgdmVyeSB3cm9uZyAtLQorIyBlcnJvciAtLSBzb21ldGhpbmcgaXMgdmVyeSB3cm9uZyAtLQogI2Vsc2UKICMgIGlmIChfTUlQU19TSU09PV9BQklOMzIgJiYgZGVmaW5lZChfQUJJTjMyKSkgfHwgKF9NSVBTX1NJTT09X0FCSTY0ICYmIGRlZmluZWQoX0FCSTY0KSkKICMgICAgZGVmaW5lIEZGSV9NSVBTX04zMgpAQCAtNTEsNyArNjQsNyBAQAogIyAgICBpZiAoX01JUFNfU0lNPT1fQUJJTzMyICYmIGRlZmluZWQoX0FCSU8zMikpCiAjICAgICAgZGVmaW5lIEZGSV9NSVBTX08zMgogIyAgICBlbHNlCi0tLSB0aGlzIGlzIGFuIHVuc3VwcG9ydGVkIHBsYXRmb3JtIC0tCisjICAgICBlcnJvciAtLSB0aGlzIGlzIGFuIHVuc3VwcG9ydGVkIHBsYXRmb3JtIC0tCiAjICAgIGVuZGlmCiAjICBlbmRpZgogI2VuZGlmCkBAIC0xODYsMzAgKzE5OSwyOSBAQAogICBGRklfTzMyX1NPRlRfRkxPQVQsCiAgIEZGSV9OMzJfU09GVF9GTE9BVCwKICAgRkZJX042NF9TT0ZUX0ZMT0FULAorICBGRklfTEFTVF9BQkksCiAKICNpZmRlZiBGRklfTUlQU19PMzIKICNpZmRlZiBfX21pcHNfc29mdF9mbG9hdAotICBGRklfREVGQVVMVF9BQkkgPSBGRklfTzMyX1NPRlRfRkxPQVQsCisgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9PMzJfU09GVF9GTE9BVAogI2Vsc2UKLSAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX08zMiwKKyAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX08zMgogI2VuZGlmCiAjZWxzZQogIyBpZiBfTUlQU19TSU09PV9BQkk2NAogIyAgaWZkZWYgX19taXBzX3NvZnRfZmxvYXQKLSAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX042NF9TT0ZUX0ZMT0FULAorICBGRklfREVGQVVMVF9BQkkgPSBGRklfTjY0X1NPRlRfRkxPQVQKICMgIGVsc2UKLSAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX042NCwKKyAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX042NAogIyAgZW5kaWYKICMgZWxzZQogIyAgaWZkZWYgX19taXBzX3NvZnRfZmxvYXQKLSAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX04zMl9TT0ZUX0ZMT0FULAorICBGRklfREVGQVVMVF9BQkkgPSBGRklfTjMyX1NPRlRfRkxPQVQKICMgIGVsc2UKLSAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX04zMiwKKyAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX04zMgogIyAgZW5kaWYKICMgZW5kaWYKICNlbmRpZgotCi0gIEZGSV9MQVNUX0FCSSA9IEZGSV9ERUZBVUxUX0FCSSArIDEKIH0gZmZpX2FiaTsKIAogI2RlZmluZSBGRklfRVhUUkFfQ0lGX0ZJRUxEUyB1bnNpZ25lZCByc3RydWN0X2ZsYWcKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL21pcHMvbjMyLlMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9taXBzL24zMi5TCmluZGV4IGFlMjMwOTQuLmZmNGJiY2UgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL21pcHMvbjMyLlMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvbWlwcy9uMzIuUwpAQCAtNDMsNiArNDMsNyBAQAogI2lmZGVmIF9fR05VQ19fCiAJLmFiaWNhbGxzCiAjZW5kaWYKKwkuc2V0IG1pcHM0CiAJLnRleHQKIAkuYWxpZ24JMgogCS5nbG9ibAlmZmlfY2FsbF9OMzIKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL21veGllL2VhYmkuUyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL21veGllL2VhYmkuUwppbmRleCAzNzllYTRiLi5hYzdhY2ViIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9tb3hpZS9lYWJpLlMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvbW94aWUvZWFiaS5TCkBAIC0xLDcgKzEsNyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIGVhYmkuUyAtIENvcHlyaWdodCAoYykgMjAwNCAgQW50aG9ueSBHcmVlbgorICAgZWFiaS5TIC0gQ29weXJpZ2h0IChjKSAyMDEyLCAyMDEzICBBbnRob255IEdyZWVuCiAgICAKLSAgIEZSLVYgQXNzZW1ibHkgZ2x1ZS4KKyAgIE1veGllIEFzc2VtYmx5IGdsdWUuCiAKICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCkBAIC0zNCw5NSArMzQsNjggQEAKIAkuZ2xvYmwgZmZpX2NhbGxfRUFCSQogCS50eXBlIGZmaV9jYWxsX0VBQkksIEBmdW5jdGlvbgogCi0JIyBncjggOiAgIGZmaV9wcmVwX2FyZ3MKLQkjIGdyOSA6ICAgJmVjaWYKLQkjIGdyMTA6ICAgY2lmLT5ieXRlcwotCSMgZ3IxMTogICBmaWctPmZsYWdzCi0JIyBncjEyOiAgIGVjaWYucnZhbHVlCi0JIyBncjEzOiAgIGZuCisJIyAkcjAgOiAgIGZmaV9wcmVwX2FyZ3MKKwkjICRyMSA6ICAgJmVjaWYKKwkjICRyMiA6ICAgY2lmLT5ieXRlcworCSMgJHIzIDogICBmaWctPmZsYWdzCisJIyAkcjQgOiAgIGVjaWYucnZhbHVlCisJIyAkcjUgOiAgIGZuCiAJCi1mZmlfY2FsbF9FQUJJOgkKLQlhZGRpCXNwLCAjLTgwLCBzcAotCXN0aQlmcCwgQChzcCwgIzI0KQotCWFkZGkJc3AsICMyNCwgZnAKLQltb3ZzZwlsciwgZ3I1CitmZmlfY2FsbF9FQUJJOgorCXB1c2gJJHNwLCAkcjYKKwlwdXNoCSRzcCwgJHI3CisJcHVzaAkkc3AsICRyOAorCWRlYwkkc3AsIDI0CiAKLQkvKiBNYWtlIHJvb20gZm9yIHRoZSBuZXcgYXJndW1lbnRzLiAgKi8KLQkvKiBzdWJpCXNwLCBmcCwgZ3IxMCAqLwotCQotCS8qIFN0b3JlIHJldHVybiBhZGRyZXNzIGFuZCBpbmNvbWluZyBhcmdzIG9uIHN0YWNrLiAgKi8KLQlzdGkJZ3I1LCBAKGZwLCAjOCkKLQlzdGkJZ3I4LCBAKGZwLCAjLTQpCi0Jc3RpCWdyOSwgQChmcCwgIy04KQotCXN0aQlncjEwLCBAKGZwLCAjLTEyKQotCXN0aQlncjExLCBAKGZwLCAjLTE2KQotCXN0aQlncjEyLCBAKGZwLCAjLTIwKQotCXN0aQlncjEzLCBAKGZwLCAjLTI0KQotCi0Jc3ViICAgICBzcCwgZ3IxMCwgc3AKKwkvKiBTdG9yZSBpbmNvbWluZyBhcmdzIG9uIHN0YWNrLiAgKi8KKwlzdG8ubAkwKCRzcCksICRyMCAvKiBmZmlfcHJlcF9hcmdzICovCisJc3RvLmwJNCgkc3ApLCAkcjEgLyogZWNpZiAqLworCXN0by5sCTgoJHNwKSwgJHIyIC8qIGJ5dGVzICovCisJc3RvLmwJMTIoJHNwKSwgJHIzIC8qIGZsYWdzICovCisJc3RvLmwJMTYoJHNwKSwgJHI0IC8qICZydmFsdWUgKi8KKwlzdG8ubAkyMCgkc3ApLCAkcjUgLyogZm4gKi8KIAkKIAkvKiBDYWxsIGZmaV9wcmVwX2FyZ3MuICAqLwotCWxkaQlAKGZwLCAjLTQpLCBncjQKLQlhZGRpCXNwLCAjMCwgZ3I4Ci0JbGRpCUAoZnAsICMtOCksIGdyOQotI2lmZGVmIF9fRlJWX0ZEUElDX18KLQlsZGQJQChncjQsIGdyMCksIGdyMTQKLQljYWxsbAlAKGdyMTQsIGdyMCkKLSNlbHNlCi0JY2FsbGwJQChncjQsIGdyMCkKLSNlbmRpZgkKKwltb3YgCSRyNiwgJHI0IC8qIFNhdmUgcmVzdWx0IGJ1ZmZlciAqLworCW1vdgkkcjcsICRyNSAvKiBTYXZlIHRoZSB0YXJnZXQgZm4gKi8KKwltb3YJJHI4LCAkcjMgLyogU2F2ZSB0aGUgZmxhZ3MgKi8KKwlzdWIubAkkc3AsICRyMiAvKiBBbGxvY2F0ZSBzdGFjayBzcGFjZSAqLworCW1vdgkkcjAsICRzcCAvKiBXZSBjYW4gc3RvbXAgb3ZlciAkcjAgKi8KKwkvKiAkcjEgaXMgYWxyZWFkeSBzZXQgdXAgKi8KKwlqc3JhIAlmZmlfcHJlcF9hcmdzCiAKLQkvKiBmZmlfcHJlcF9hcmdzIHJldHVybnMgdGhlIG5ldyBzdGFjayBwb2ludGVyLiAgKi8KLQltb3YJZ3I4LCBncjQKLQkJCi0JbGRpCUAoc3AsICMwKSwgZ3I4Ci0JbGRpCUAoc3AsICM0KSwgZ3I5Ci0JbGRpCUAoc3AsICM4KSwgZ3IxMAotCWxkaQlAKHNwLCAjMTIpLCBncjExCi0JbGRpCUAoc3AsICMxNiksIGdyMTIKLQlsZGkJQChzcCwgIzIwKSwgZ3IxMwotCi0JLyogQWx3YXlzIGNvcHkgdGhlIHJldHVybiB2YWx1ZSBwb2ludGVyIGludG8gdGhlIGhpZGRlbgotCSAgIHBhcmFtZXRlciByZWdpc3Rlci4gIFRoaXMgaXMgb25seSBzdHJpY3RseSBuZWNlc3NhcnkKLQkgICB3aGVuIHdlJ3JlIHJldHVybmluZyBhbiBhZ2dyZWdhdGUgdHlwZSwgYnV0IGl0IGRvZXNuJ3QKLQkgICBodXJ0IHRvIGRvIHRoaXMgYWxsIHRoZSB0aW1lLCBhbmQgaXQgc2F2ZXMgYSBicmFuY2guICAqLwotCWxkaQlAKGZwLCAjLTIwKSwgZ3IzCi0KLQkvKiBVc2UgdGhlIGZmaV9wcmVwX2FyZ3MgcmV0dXJuIHZhbHVlIGZvciB0aGUgbmV3IHNwLiAgKi8KLQltb3YJZ3I0LCBzcAorCS8qIExvYWQgcmVnaXN0ZXIgYXJndW1lbnRzLiAgKi8KKwlsZG8ubAkkcjAsIDAoJHNwKQorCWxkby5sCSRyMSwgNCgkc3ApCisJbGRvLmwJJHIyLCA4KCRzcCkKKwlsZG8ubAkkcjMsIDEyKCRzcCkKKwlsZG8ubAkkcjQsIDE2KCRzcCkKKwlsZG8ubAkkcjUsIDIwKCRzcCkKIAkKIAkvKiBDYWxsIHRoZSB0YXJnZXQgZnVuY3Rpb24uICAqLwotCWxkaQlAKGZwLCAtMjQpLCBncjQKLSNpZmRlZiBfX0ZSVl9GRFBJQ19fCi0JbGRkCUAoZ3I0LCBncjApLCBncjE0Ci0JY2FsbGwJQChncjE0LCBncjApCi0jZWxzZQotCWNhbGxsCUAoZ3I0LCBncjApCi0jZW5kaWYJCisJanNyCSRyNwogCi0JLyogU3RvcmUgdGhlIHJlc3VsdC4gKi8KLQlsZGkJQChmcCwgIy0xNiksIGdyMTAgIC8qIGZpZy0+ZmxhZ3MgKi8KLQlsZGkJQChmcCwgIy0yMCksIGdyNCAgIC8qIGVjaWYucnZhbHVlICovCisJbGRpLmwJJHI3LCAweGZmZmZmZmZmCisJY21wCSRyOCwgJHI3CisJYmVxCXJldHN0cnVjdAogCi0JLyogSXMgdGhlIHJldHVybiB2YWx1ZSBzdG9yZWQgaW4gdHdvIHJlZ2lzdGVycz8gICovCi0JY21waQlncjEwLCAjOCwgaWNjMAotCWJuZQlpY2MwLCAwLCAuTDIKLQkvKiAgIFllcywgc2F2ZSB0aGVtLiAgKi8KLQlzdGkJZ3I4LCBAKGdyNCwgIzApCi0Jc3RpCWdyOSwgQChncjQsICM0KQotCWJyYQkuTDMKLS5MMjoKLQkvKiBJcyB0aGUgcmV0dXJuIHZhbHVlIGEgc3RydWN0dXJlPyAgKi8KLQljbXBpCWdyMTAsICMtMSwgaWNjMAotCWJlcQlpY2MwLCAwLCAuTDMKLQkvKiAgIE5vLCBzYXZlIGEgNCBieXRlIHJldHVybiB2YWx1ZS4gICovCi0Jc3RpCWdyOCwgQChncjQsICMwKQotLkwzOgkKKwlsZGkubAkkcjcsIDQKKwljbXAJJHI4LCAkcjcKKwliZ3QJcmV0MnJlZwogCi0JLyogUmVzdG9yZSB0aGUgc3RhY2ssIGFuZCByZXR1cm4uICAqLwotCWxkaQlAKGZwLCA4KSwgZ3I1Ci0JbGQJQChmcCwgZ3IwKSwgZnAKLQlhZGRpCXNwLCM4MCxzcAotCWptcGwJQChncjUsZ3IwKQorCXN0LmwJKCRyNiksICRyMAorCWptcGEJcmV0ZG9uZQorCityZXQycmVnOgkKKwlzdC5sCSgkcjYpLCAkcjAKKwlzdG8ubAk0KCRyNiksICRyMQorCityZXRzdHJ1Y3Q6CityZXRkb25lOgkKKwkvKiBSZXR1cm4uICAqLworCWxkby5sCSRyNiwgLTQoJGZwKQorCWxkby5sCSRyNywgLTgoJGZwKQorCWxkby5sCSRyOCwgLTEyKCRmcCkKKwlyZXQKIAkuc2l6ZSBmZmlfY2FsbF9FQUJJLCAuLWZmaV9jYWxsX0VBQkkKIAkKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL21veGllL2ZmaS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvbW94aWUvZmZpLmMKaW5kZXggNTRjYmJiOS4uNTQwYTA0MiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvbW94aWUvZmZpLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvbW94aWUvZmZpLmMKQEAgLTEsNSArMSw1IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgZmZpLmMgLSBDb3B5cmlnaHQgKEMpIDIwMDkgIEFudGhvbnkgR3JlZW4KKyAgIGZmaS5jIC0gQ29weXJpZ2h0IChDKSAyMDEyLCAyMDEzICBBbnRob255IEdyZWVuCiAgICAKICAgIE1veGllIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlIAogCkBAIC00Myw2ICs0MywxMiBAQAogICBwX2FyZ3YgPSBlY2lmLT5hdmFsdWU7CiAgIGFyZ3AgPSBzdGFjazsKIAorICBpZiAoZWNpZi0+Y2lmLT5ydHlwZS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QpCisgICAgeworICAgICAgKih2b2lkICoqKSBhcmdwID0gZWNpZi0+cnZhbHVlOworICAgICAgYXJncCArPSA0OworICAgIH0KKwogICBmb3IgKGkgPSBlY2lmLT5jaWYtPm5hcmdzLCBwX2FyZyA9IGVjaWYtPmNpZi0+YXJnX3R5cGVzOwogICAgICAgIChpICE9IDApOwogICAgICAgIGktLSwgcF9hcmcrKykKQEAgLTU2LDE3ICs2Miw2IEBACiAJICB6ID0gc2l6ZW9mKHZvaWQqKTsKIAkgICoodm9pZCAqKikgYXJncCA9ICpwX2FyZ3Y7CiAJfSAKLSAgICAgIC8qICAgICAgaWYgKCgqcF9hcmcpLT50eXBlID09IEZGSV9UWVBFX0ZMT0FUKQotCXsKLQkgIGlmIChjb3VudCA+IDI0KQotCSAgICB7Ci0JICAgICAgLy8gVGhpcyBpcyBnb2luZyBvbiB0aGUgc3RhY2suICBUdXJuIGl0IGludG8gYSBkb3VibGUuICAKLQkgICAgICAqKGRvdWJsZSAqKSBhcmdwID0gKGRvdWJsZSkgKihmbG9hdCopKCogcF9hcmd2KTsKLQkgICAgICB6ID0gc2l6ZW9mKGRvdWJsZSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgKih2b2lkICoqKSBhcmdwID0gKih2b2lkICoqKSgqIHBfYXJndik7Ci0JfSAgKi8KICAgICAgIGVsc2UgaWYgKHogPCBzaXplb2YoaW50KSkKIAl7CiAJICB6ID0gc2l6ZW9mKGludCk7CkBAIC0xNDcsOCArMTQyLDcgQEAKICAgICB9CiAgIGVsc2UKICAgICBlY2lmLnJ2YWx1ZSA9IHJ2YWx1ZTsKLSAgICAKLSAgCisKICAgc3dpdGNoIChjaWYtPmFiaSkgCiAgICAgewogICAgIGNhc2UgRkZJX0VBQkk6CkBAIC0xNjUsMTkgKzE1OSwyNSBAQAogCQkgICAgICAgdW5zaWduZWQgYXJnNCwgdW5zaWduZWQgYXJnNSwgdW5zaWduZWQgYXJnNikKIHsKICAgLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYSB0cmFtcG9saW5lLiAgVGhlIHRyYW1wb2xpbmUgc3Rvd3MgYQotICAgICBwb2ludGVyIHRvIHRoZSBmZmlfY2xvc3VyZSBvYmplY3QgaW4gZ3I3LiAgV2UgbXVzdCBzYXZlIHRoaXMKKyAgICAgcG9pbnRlciB0byB0aGUgZmZpX2Nsb3N1cmUgb2JqZWN0IGluICRyNy4gIFdlIG11c3Qgc2F2ZSB0aGlzCiAgICAgIHBvaW50ZXIgaW4gYSBwbGFjZSB0aGF0IHdpbGwgcGVyc2lzdCB3aGlsZSB3ZSBkbyBvdXIgd29yay4gICovCi0gIHJlZ2lzdGVyIGZmaV9jbG9zdXJlICpjcmVnIF9fYXNtX18gKCJncjciKTsKKyAgcmVnaXN0ZXIgZmZpX2Nsb3N1cmUgKmNyZWcgX19hc21fXyAoIiRyMTIiKTsKICAgZmZpX2Nsb3N1cmUgKmNsb3N1cmUgPSBjcmVnOwogCiAgIC8qIEFyZ3VtZW50cyB0aGF0IGRvbid0IGZpdCBpbiByZWdpc3RlcnMgYXJlIGZvdW5kIG9uIHRoZSBzdGFjawogICAgICBhdCBhIGZpeGVkIG9mZnNldCBhYm92ZSB0aGUgY3VycmVudCBmcmFtZSBwb2ludGVyLiAgKi8KLSAgcmVnaXN0ZXIgY2hhciAqZnJhbWVfcG9pbnRlciBfX2FzbV9fICgiZnAiKTsKLSAgY2hhciAqc3RhY2tfYXJncyA9IGZyYW1lX3BvaW50ZXIgKyAxNjsKKyAgcmVnaXN0ZXIgY2hhciAqZnJhbWVfcG9pbnRlciBfX2FzbV9fICgiJGZwIik7CisKKyAgLyogUG9pbnRlciB0byBhIHN0cnVjdCByZXR1cm4gdmFsdWUuICAqLworICB2b2lkICpzdHJ1Y3RfcnZhbHVlID0gKHZvaWQgKikgYXJnMTsKKworICAvKiA2IHdvcmRzIHJlc2VydmVkIGZvciByZWdpc3RlciBhcmdzICsgMyB3b3JkcyBmcm9tIGpzciAqLworICBjaGFyICpzdGFja19hcmdzID0gZnJhbWVfcG9pbnRlciArIDkqNDsgCiAKICAgLyogTGF5IHRoZSByZWdpc3RlciBhcmd1bWVudHMgZG93biBpbiBhIGNvbnRpbnVvdXMgY2h1bmsgb2YgbWVtb3J5LiAgKi8KICAgdW5zaWduZWQgcmVnaXN0ZXJfYXJnc1s2XSA9CiAgICAgeyBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1LCBhcmc2IH07CisgIGNoYXIgKnJlZ2lzdGVyX2FyZ3NfcHRyID0gKGNoYXIgKikgcmVnaXN0ZXJfYXJnczsKIAogICBmZmlfY2lmICpjaWYgPSBjbG9zdXJlLT5jaWY7CiAgIGZmaV90eXBlICoqYXJnX3R5cGVzID0gY2lmLT5hcmdfdHlwZXM7CkBAIC0xODUsNiArMTg1LDEyIEBACiAgIGNoYXIgKnB0ciA9IChjaGFyICopIHJlZ2lzdGVyX2FyZ3M7CiAgIGludCBpOwogCisgIC8qIHByZXNlcnZlIHN0cnVjdCB0eXBlIHJldHVybiBwb2ludGVyIHBhc3NpbmcgKi8KKyAgaWYgKChjaWYtPnJ0eXBlICE9IE5VTEwpICYmIChjaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCkpIHsKKyAgICBwdHIgKz0gNDsKKyAgICByZWdpc3Rlcl9hcmdzX3B0ciA9IChjaGFyICopJnJlZ2lzdGVyX2FyZ3NbMV07CisgIH0KKwogICAvKiBGaW5kIHRoZSBhZGRyZXNzIG9mIGVhY2ggYXJndW1lbnQuICAqLwogICBmb3IgKGkgPSAwOyBpIDwgY2lmLT5uYXJnczsgaSsrKQogICAgIHsKQEAgLTIwMSw2ICsyMDcsNyBAQAogCWNhc2UgRkZJX1RZUEVfU0lOVDMyOgogCWNhc2UgRkZJX1RZUEVfVUlOVDMyOgogCWNhc2UgRkZJX1RZUEVfRkxPQVQ6CisJY2FzZSBGRklfVFlQRV9QT0lOVEVSOgogCSAgYXZhbHVlW2ldID0gcHRyOwogCSAgYnJlYWs7CiAJY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CkBAIC0yMTYsMzAgKzIyMywyMSBAQAogCiAgICAgICAvKiBJZiB3ZSd2ZSBoYW5kbGVkIG1vcmUgYXJndW1lbnRzIHRoYW4gZml0IGluIHJlZ2lzdGVycywKIAkgc3RhcnQgbG9va2luZyBhdCB0aGUgdGhvc2UgcGFzc2VkIG9uIHRoZSBzdGFjay4gICovCi0gICAgICBpZiAocHRyID09ICgoY2hhciAqKXJlZ2lzdGVyX2FyZ3MgKyAoNio0KSkpCisgICAgICBpZiAocHRyID09ICZyZWdpc3Rlcl9hcmdzWzZdKQogCXB0ciA9IHN0YWNrX2FyZ3M7CiAgICAgfQogCiAgIC8qIEludm9rZSB0aGUgY2xvc3VyZS4gICovCi0gIGlmIChjaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCkKKyAgaWYgKGNpZi0+cnR5cGUgJiYgKGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKSkKICAgICB7Ci0gICAgICAvKiBUaGUgY2FsbGVyIGFsbG9jYXRlcyBzcGFjZSBmb3IgdGhlIHJldHVybiBzdHJ1Y3R1cmUsIGFuZAotICAgICAgIHBhc3NlcyBhIHBvaW50ZXIgdG8gdGhpcyBzcGFjZSBpbiBncjMuICBVc2UgdGhpcyB2YWx1ZSBkaXJlY3RseQotICAgICAgIGFzIHRoZSByZXR1cm4gdmFsdWUuICAqLwotICAgICAgcmVnaXN0ZXIgdm9pZCAqcmV0dXJuX3N0cnVjdF9wdHIgX19hc21fXygiZ3IzIik7Ci0gICAgICAoY2xvc3VyZS0+ZnVuKSAoY2lmLCByZXR1cm5fc3RydWN0X3B0ciwgYXZhbHVlLCBjbG9zdXJlLT51c2VyX2RhdGEpOworICAgICAgKGNsb3N1cmUtPmZ1bikgKGNpZiwgc3RydWN0X3J2YWx1ZSwgYXZhbHVlLCBjbG9zdXJlLT51c2VyX2RhdGEpOwogICAgIH0KICAgZWxzZQogICAgIHsKICAgICAgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgcmV0dXJuIHZhbHVlIGFuZCBjYWxsIHRoZSBmdW5jdGlvbi4gICovCiAgICAgICBsb25nIGxvbmcgcnZhbHVlOwogICAgICAgKGNsb3N1cmUtPmZ1bikgKGNpZiwgJnJ2YWx1ZSwgYXZhbHVlLCBjbG9zdXJlLT51c2VyX2RhdGEpOwotCi0gICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIDQtYnl0ZSBvciBzbWFsbGVyIHJlc3VsdHMgaW4gZ3I4LiAgOC1ieXRlCi0JIHZhbHVlcyBhbHNvIHVzZSBncjkuICBXZSBmaWxsIHRoZSBib3RoLCBldmVuIGZvciBzbWFsbCByZXR1cm4KLQkgdmFsdWVzLCBqdXN0IHRvIGF2b2lkIGEgYnJhbmNoLiAgKi8gCi0gICAgICBhc20gKCJsZGkgIEAoJTAsICMwKSwgZ3I4IiA6IDogInIiICgmcnZhbHVlKSk7Ci0gICAgICBhc20gKCJsZGkgIEAoJTAsICMwKSwgZ3I5IiA6IDogInIiICgmKChpbnQgKikgJnJ2YWx1ZSlbMV0pKTsKKyAgICAgIGFzbSAoIm1vdiAkcjEyLCAlMFxuIGxkLmwgJHIwLCAoJHIxMilcbiBsZG8ubCAkcjEsIDQoJHIxMikiIDogOiAiciIgKCZydmFsdWUpKTsKICAgICB9CiB9CiAKQEAgLTI1MCwyNyArMjQ4LDI1IEBACiAJCSAgICAgIHZvaWQgKnVzZXJfZGF0YSwKIAkJICAgICAgdm9pZCAqY29kZWxvYykKIHsKLSAgdW5zaWduZWQgaW50ICp0cmFtcCA9ICh1bnNpZ25lZCBpbnQgKikgJmNsb3N1cmUtPnRyYW1wWzBdOworICB1bnNpZ25lZCBzaG9ydCAqdHJhbXAgPSAodW5zaWduZWQgc2hvcnQgKikgJmNsb3N1cmUtPnRyYW1wWzBdOwogICB1bnNpZ25lZCBsb25nIGZuID0gKGxvbmcpIGZmaV9jbG9zdXJlX2VhYmk7CiAgIHVuc2lnbmVkIGxvbmcgY2xzID0gKGxvbmcpIGNvZGVsb2M7Ci0gIGludCBpOworCisgIGlmIChjaWYtPmFiaSAhPSBGRklfRUFCSSkKKyAgICByZXR1cm4gRkZJX0JBRF9BQkk7CiAKICAgZm4gPSAodW5zaWduZWQgbG9uZykgZmZpX2Nsb3N1cmVfZWFiaTsKIAotICB0cmFtcFswXSA9IDB4OGNmYzAwMDAgKyAoZm4gICYgMHhmZmZmKTsgLyogc2V0bG9zIGxvKGZuKSwgZ3I2ICAgICovCi0gIHRyYW1wWzFdID0gMHg4ZWZjMDAwMCArIChjbHMgJiAweGZmZmYpOyAvKiBzZXRsb3MgbG8oY2xzKSwgZ3I3ICAgKi8KLSAgdHJhbXBbMl0gPSAweDhjZjgwMDAwICsgKGZuICA+PiAxNik7CSAgLyogc2V0aGkgaGkoZm4pLCBncjYgICAgICovCi0gIHRyYW1wWzNdID0gMHg4ZWY4MDAwMCArIChjbHMgPj4gMTYpOyAgICAvKiBzZXRoaSBoaShjbHMpLCBncjcgICAgKi8KLSAgdHJhbXBbNF0gPSAweDgwMzAwMDA2OyAgICAgICAgICAgICAgICAgIC8qIGptcGwgQChncjAsIGdyNikgICAgICAqLworICB0cmFtcFswXSA9IDB4MDFlMDsgLyogbGRpLmwgJHI3LCAuLi4uICovCisgIHRyYW1wWzFdID0gY2xzID4+IDE2OworICB0cmFtcFsyXSA9IGNscyAmIDB4ZmZmZjsKKyAgdHJhbXBbM10gPSAweDFhMDA7IC8qIGptcGEgLi4uLiAqLworICB0cmFtcFs0XSA9IGZuID4+IDE2OworICB0cmFtcFs1XSA9IGZuICYgMHhmZmZmOwogCiAgIGNsb3N1cmUtPmNpZiA9IGNpZjsKICAgY2xvc3VyZS0+ZnVuID0gZnVuOwogICBjbG9zdXJlLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CiAKLSAgLyogQ2FjaGUgZmx1c2hpbmcuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgRkZJX1RSQU1QT0xJTkVfU0laRTsgaSsrKQotICAgIF9fYXNtX18gdm9sYXRpbGUgKCJkY2YgQCglMCwlMSlcblx0aWNpIEAoJTIsJTEpIiA6OiAiciIgKHRyYW1wKSwgInIiIChpKSwKLQkJICAgICAgInIiIChjb2RlbG9jKSk7Ci0KICAgcmV0dXJuIEZGSV9PSzsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL21veGllL2ZmaXRhcmdldC5oIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvbW94aWUvZmZpdGFyZ2V0LmgKaW5kZXggZjUzMDVkMS4uNjIzZTNlYyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvbW94aWUvZmZpdGFyZ2V0LmgKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvbW94aWUvZmZpdGFyZ2V0LmgKQEAgLTEsNSArMSw1IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotQy0qLQotICAgZmZpdGFyZ2V0LmggLSBDb3B5cmlnaHQgKGMpIDIwMDkgQW50aG9ueSBHcmVlbgorICAgZmZpdGFyZ2V0LmggLSBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTMgIEFudGhvbnkgR3JlZW4KICAgIFRhcmdldCBjb25maWd1cmF0aW9uIG1hY3JvcyBmb3IgTW94aWUKIAogICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCkBAIC0zNSwyMiArMzUsMTggQEAKIAogdHlwZWRlZiBlbnVtIGZmaV9hYmkgewogICBGRklfRklSU1RfQUJJID0gMCwKLQotI2lmZGVmIE1PWElFCiAgIEZGSV9FQUJJLAogICBGRklfREVGQVVMVF9BQkkgPSBGRklfRUFCSSwKLSNlbmRpZgotCiAgIEZGSV9MQVNUX0FCSSA9IEZGSV9ERUZBVUxUX0FCSSArIDEKIH0gZmZpX2FiaTsKICNlbmRpZgogCiAvKiAtLS0tIERlZmluaXRpb25zIGZvciBjbG9zdXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jZGVmaW5lIEZGSV9DTE9TVVJFUyAwCisjZGVmaW5lIEZGSV9DTE9TVVJFUyAxCiAjZGVmaW5lIEZGSV9OQVRJVkVfUkFXX0FQSSAwCiAKLS8qIFRyYW1wb2xpbmVzIGFyZSA1IDQtYnl0ZSBpbnN0cnVjdGlvbnMgbG9uZy4gICovCi0jZGVmaW5lIEZGSV9UUkFNUE9MSU5FX1NJWkUgKDUqNCkKKy8qIFRyYW1wb2xpbmVzIGFyZSAxMi1ieXRlcyBsb25nLiAgU2VlIGZmaV9wcmVwX2Nsb3N1cmVfbG9jLiAgKi8KKyNkZWZpbmUgRkZJX1RSQU1QT0xJTkVfU0laRSAoMTIpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcGEvZmZpLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wYS9mZmkuYwppbmRleCA2ZDc2MDZmLi40Y2UyYmM2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wYS9mZmkuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wYS9mZmkuYwpAQCAtMSw5ICsxLDExIEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgZmZpLmMgLSAoYykgMjAwMy0yMDA0IFJhbmRvbHBoIENodW5nIDx0YXVzcUBkZWJpYW4ub3JnPgorICAgZmZpLmMgLSAoYykgMjAxMSBBbnRob255IEdyZWVuCiAgICAgICAgICAgIChjKSAyMDA4IFJlZCBIYXQsIEluYy4KLQorCSAgIChjKSAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgICAgICAgICAoYykgMjAwMy0yMDA0IFJhbmRvbHBoIENodW5nIDx0YXVzcUBkZWJpYW4ub3JnPgorICAgICAgICAgICAKICAgIEhQUEEgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UKLSAgIEhQLVVYIFBBIEFCSSBzdXBwb3J0IChjKSAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgSFAtVVggUEEgQUJJIHN1cHBvcnQgCiAKICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCkBAIC02MzMsNyArNjM1LDggQEAKICAgVUlOVDMyICp0bXA7CiAjZW5kaWYKIAotICBGRklfQVNTRVJUIChjaWYtPmFiaSA9PSBGRklfUEEzMik7CisgIGlmIChjaWYtPmFiaSAhPSBGRklfUEEzMikKKyAgICByZXR1cm4gRkZJX0JBRF9BQkk7CiAKICAgLyogTWFrZSBhIHNtYWxsIHRyYW1wb2xpbmUgdGhhdCB3aWxsIGJyYW5jaCB0byBvdXIKICAgICAgaGFuZGxlciBmdW5jdGlvbi4gVXNlIFBDLXJlbGF0aXZlIGFkZHJlc3NpbmcuICAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcGEvZmZpdGFyZ2V0LmggYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wYS9mZml0YXJnZXQuaAppbmRleCAwMDFmODkxLi41ZTM2NGQzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wYS9mZml0YXJnZXQuaAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wYS9mZml0YXJnZXQuaApAQCAtMSw1ICsxLDYgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi1DLSotCi0gICBmZml0YXJnZXQuaCAtIENvcHlyaWdodCAoYykgMTk5Ni0yMDAzICBSZWQgSGF0LCBJbmMuCisgICBmZml0YXJnZXQuaCAtIENvcHlyaWdodCAoYykgMjAxMiAgQW50aG9ueSBHcmVlbgorICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMyAgUmVkIEhhdCwgSW5jLgogICAgVGFyZ2V0IGNvbmZpZ3VyYXRpb24gbWFjcm9zIGZvciBocHBhLgogCiAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKQEAgLTI3LDYgKzI4LDEwIEBACiAjaWZuZGVmIExJQkZGSV9UQVJHRVRfSAogI2RlZmluZSBMSUJGRklfVEFSR0VUX0gKIAorI2lmbmRlZiBMSUJGRklfSAorI2Vycm9yICJQbGVhc2UgZG8gbm90IGluY2x1ZGUgZmZpdGFyZ2V0LmggZGlyZWN0bHkgaW50byB5b3VyIHNvdXJjZS4gIFVzZSBmZmkuaCBpbnN0ZWFkLiIKKyNlbmRpZgorCiAvKiAtLS0tIFN5c3RlbSBzcGVjaWZpYyBjb25maWd1cmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAjaWZuZGVmIExJQkZGSV9BU00KQEAgLTM4LDIxICs0MywyMiBAQAogCiAjaWZkZWYgUEFfTElOVVgKICAgRkZJX1BBMzIsCi0gIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9QQTMyLAorICBGRklfTEFTVF9BQkksCisgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9QQTMyCiAjZW5kaWYKIAogI2lmZGVmIFBBX0hQVVgKICAgRkZJX1BBMzIsCi0gIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9QQTMyLAorICBGRklfTEFTVF9BQkksCisgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9QQTMyCiAjZW5kaWYKIAogI2lmZGVmIFBBNjRfSFBVWAogI2Vycm9yICJQQTY0X0hQVVggRkZJIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQiCiAgIEZGSV9QQTY0LAotICBGRklfREVGQVVMVF9BQkkgPSBGRklfUEE2NCwKKyAgRkZJX0xBU1RfQUJJLAorICBGRklfREVGQVVMVF9BQkkgPSBGRklfUEE2NAogI2VuZGlmCi0KLSAgRkZJX0xBU1RfQUJJID0gRkZJX0RFRkFVTFRfQUJJICsgMQogfSBmZmlfYWJpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvYWl4LlMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2FpeC5TCmluZGV4IGM2Zjg3NjQuLjM0OWU3OGMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvYWl4LlMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcG93ZXJwYy9haXguUwpAQCAtMSw1ICsxLDUgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICBhaXguUyAtIENvcHlyaWdodCAoYykgMjAwMiwyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgYWl4LlMgLSBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgICBiYXNlZCBvbiBkYXJ3aW4uUyBieSBKb2huIEhvcm5rdmlzdAogCiAgICBQb3dlclBDIEFzc2VtYmx5IGdsdWUuCkBAIC03OSw2ICs3OSw4IEBACiAJLnNldCBmMjAsMjAKIAkuc2V0IGYyMSwyMQogCisJLmV4dGVybiAuZmZpX3ByZXBfYXJncworCiAjZGVmaW5lIExJQkZGSV9BU00KICNpbmNsdWRlIDxmZmljb25maWcuaD4KICNpbmNsdWRlIDxmZmkuaD4KQEAgLTEyNSw2ICsxMjcsNyBAQAogCS8qIENhbGwgZmZpX3ByZXBfYXJncy4gICovCiAJbXIJcjQsIHIxCiAJYmwJLmZmaV9wcmVwX2FyZ3MKKwlub3AKIAogCS8qIE5vdyBkbyB0aGUgY2FsbC4gICovCiAJbGQJcjAsIDAocjI5KQpAQCAtMTM0LDcgKzEzNyw3IEBACiAJbXRjcmYJMHg0MCwgcjMxCiAJbXRjdHIJcjAKIAkvKiBMb2FkIGFsbCB0aG9zZSBhcmd1bWVudCByZWdpc3RlcnMuICAqLwotCS8vIFdlIGhhdmUgc2V0IHVwIGEgbmljZSBzdGFjayBmcmFtZSwganVzdCBsb2FkIGl0IGludG8gcmVnaXN0ZXJzLgorCS8qIFdlIGhhdmUgc2V0IHVwIGEgbmljZSBzdGFjayBmcmFtZSwganVzdCBsb2FkIGl0IGludG8gcmVnaXN0ZXJzLiAqLwogCWxkCXIzLCA0MCsoMSo4KShyMSkKIAlsZAlyNCwgNDArKDIqOCkocjEpCiAJbGQJcjUsIDQwKygzKjgpKHIxKQpAQCAtMTQ3LDcgKzE1MCw3IEBACiAKIEwxOgogCS8qIExvYWQgYWxsIHRoZSBGUCByZWdpc3RlcnMuICAqLwotCWJmCTYsTDIgLy8gMmYgKyAweDE4CisJYmYJNixMMiAvKiAyZiArIDB4MTggKi8KIAlsZmQJZjEsLTMyLSgxMyo4KShyMjgpCiAJbGZkCWYyLC0zMi0oMTIqOCkocjI4KQogCWxmZAlmMywtMzItKDExKjgpKHIyOCkKQEAgLTIyNiw2ICsyMjksNyBAQAogCS8qIENhbGwgZmZpX3ByZXBfYXJncy4gICovCiAJbXIJcjQsIHIxCiAJYmwJLmZmaV9wcmVwX2FyZ3MKKwlub3AKIAogCS8qIE5vdyBkbyB0aGUgY2FsbC4gICovCiAJbHd6CXIwLCAwKHIyOSkKQEAgLTIzNSw3ICsyMzksNyBAQAogCW10Y3JmCTB4NDAsIHIzMQogCW10Y3RyCXIwCiAJLyogTG9hZCBhbGwgdGhvc2UgYXJndW1lbnQgcmVnaXN0ZXJzLiAgKi8KLQkvLyBXZSBoYXZlIHNldCB1cCBhIG5pY2Ugc3RhY2sgZnJhbWUsIGp1c3QgbG9hZCBpdCBpbnRvIHJlZ2lzdGVycy4KKwkvKiBXZSBoYXZlIHNldCB1cCBhIG5pY2Ugc3RhY2sgZnJhbWUsIGp1c3QgbG9hZCBpdCBpbnRvIHJlZ2lzdGVycy4gKi8KIAlsd3oJcjMsIDIwKygxKjQpKHIxKQogCWx3eglyNCwgMjArKDIqNCkocjEpCiAJbHd6CXI1LCAyMCsoMyo0KShyMSkKQEAgLTI0OCw3ICsyNTIsNyBAQAogCiBMMToKIAkvKiBMb2FkIGFsbCB0aGUgRlAgcmVnaXN0ZXJzLiAgKi8KLQliZgk2LEwyIC8vIDJmICsgMHgxOAorCWJmCTYsTDIgLyogMmYgKyAweDE4ICovCiAJbGZkCWYxLC0xNi0oMTMqOCkocjI4KQogCWxmZAlmMiwtMTYtKDEyKjgpKHIyOCkKIAlsZmQJZjMsLTE2LSgxMSo4KShyMjgpCkBAIC0zMDMsNyArMzA3LDcgQEAKICNlbmRpZgogCS5sb25nIDAKIAkuYnl0ZSAwLDAsMCwxLDEyOCw0LDAsMAotLy9FTkQoZmZpX2NhbGxfQUlYKQorLyogRU5EKGZmaV9jYWxsX0FJWCkgKi8KIAogLmNzZWN0IC50ZXh0W1BSXQogCS5hbGlnbiAyCkBAIC0zMjEsNCArMzI1LDQgQEAKIAlibHIKIAkubG9uZyAwCiAJLmJ5dGUgMCwwLDAsMCwwLDAsMCwwCi0vL0VORChmZmlfY2FsbF9EQVJXSU4pCisvKiBFTkQoZmZpX2NhbGxfREFSV0lOKSAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcG93ZXJwYy9haXhfY2xvc3VyZS5TIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcG93ZXJwYy9haXhfY2xvc3VyZS5TCmluZGV4IDVjNzQ0NDguLmFhYmQzYzMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvYWl4X2Nsb3N1cmUuUworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2FpeF9jbG9zdXJlLlMKQEAgLTc5LDYgKzc5LDggQEAKIAkuc2V0IGYyMCwyMAogCS5zZXQgZjIxLDIxCiAKKwkuZXh0ZXJuIC5mZmlfY2xvc3VyZV9oZWxwZXJfREFSV0lOCisKICNkZWZpbmUgTElCRkZJX0FTTQogI2RlZmluZSBKVU1QVEFSR0VUKG5hbWUpIG5hbWUKICNkZWZpbmUgTCh4KSB4CkBAIC0xNjUsNiArMTY3LDcgQEAKIAogCS8qIGxvb2sgdXAgdGhlIHByb3BlciBzdGFydGluZyBwb2ludCBpbiB0YWJsZSAgKi8KIAkvKiBieSB1c2luZyByZXR1cm4gdHlwZSBhcyBvZmZzZXQgKi8KKwlsaHoJcjMsIDEwKHIzKQkvKiBsb2FkIHR5cGUgZnJvbSByZXR1cm4gdHlwZSAqLwogCWxkCXI0LCBMQy4uNjAoMikJLyogZ2V0IGFkZHJlc3Mgb2YganVtcCB0YWJsZSAqLwogCXNsZGkJcjMsIHIzLCA0CS8qIG5vdyBtdWx0aXBseSByZXR1cm4gdHlwZSBieSAxNiAqLwogCWxkCXIwLCAyNDArMTYocjEpCS8qIGxvYWQgcmV0dXJuIGFkZHJlc3MgKi8KQEAgLTMzNyw4ICszNDAsOSBAQAogCiAJLyogbG9vayB1cCB0aGUgcHJvcGVyIHN0YXJ0aW5nIHBvaW50IGluIHRhYmxlICAqLwogCS8qIGJ5IHVzaW5nIHJldHVybiB0eXBlIGFzIG9mZnNldCAqLworCWxoeglyMywgNihyMykJLyogbG9hZCB0eXBlIGZyb20gcmV0dXJuIHR5cGUgKi8KIAlsd3oJcjQsIExDLi42MCgyKQkvKiBnZXQgYWRkcmVzcyBvZiBqdW1wIHRhYmxlICovCi0Jc2x3aQlyMywgcjMsIDQJLyogbm93IG11bHRpcGx5IHJldHVybiB0eXBlIGJ5IDQgKi8KKwlzbHdpCXIzLCByMywgNAkvKiBub3cgbXVsdGlwbHkgcmV0dXJuIHR5cGUgYnkgMTYgKi8KIAlsd3oJcjAsIDE3Nis4KHIxKQkvKiBsb2FkIHJldHVybiBhZGRyZXNzICovCiAJYWRkCXIzLCByMywgcjQJLyogYWRkIGNvbnRlbnRzIG9mIHRhYmxlIHRvIHRhYmxlIGFkZHJlc3MgKi8KIAltdGN0cglyMwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcG93ZXJwYy9hc20uaCBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvYXNtLmgKaW5kZXggZTg2ZTZiMC4uOTk0ZjYyZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcG93ZXJwYy9hc20uaAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2FzbS5oCkBAIC00Miw3ICs0Miw3IEBACiAKIC8qIElmIGNvbXBpbGVkIGZvciBwcm9maWxpbmcsIGNhbGwgYF9tY291bnQnIGF0IHRoZSBzdGFydCBvZiBlYWNoIGZ1bmN0aW9uLiAgKi8KICNpZmRlZglQUk9GCi0vKiBUaGUgbWNvdW50IGNvZGUgcmVsaWVzIG9uIGEgdGhlIHJldHVybiBhZGRyZXNzIGJlaW5nIG9uIHRoZSBzdGFjaworLyogVGhlIG1jb3VudCBjb2RlIHJlbGllcyBvbiB0aGUgcmV0dXJuIGFkZHJlc3MgYmVpbmcgb24gdGhlIHN0YWNrCiAgICB0byBsb2NhdGUgb3VyIGNhbGxlciBhbmQgc28gaXQgY2FuIHJlc3RvcmUgaXQ7IHNvIHN0b3JlIG9uZSBqdXN0CiAgICBmb3IgaXRzIGJlbmVmaXQuICAqLwogI2lmZGVmIFBJQwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcG93ZXJwYy9kYXJ3aW4uUyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvZGFyd2luLlMKaW5kZXggZDhhMWRmNS4uNGY5ODdkYyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcG93ZXJwYy9kYXJ3aW4uUworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2Rhcndpbi5TCkBAIC0xLDYgKzEsNiBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGRhcndpbi5TIC0gQ29weXJpZ2h0IChjKSAyMDAwIEpvaG4gSG9ybmt2aXN0Ci0JICAgICAgQ29weXJpZ2h0IChjKSAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCSAgICAgIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KIAogICAgUG93ZXJQQyBBc3NlbWJseSBnbHVlLgogCkBAIC0yNCw1MSArMjQsOTIgQEAKICAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKKyNkZWZpbmUgTElCRkZJX0FTTQogI2lmIGRlZmluZWQoX19wcGM2NF9fKQogI2RlZmluZSBNT0RFX0NIT0lDRSh4LCB5KSB5CiAjZWxzZQogI2RlZmluZSBNT0RFX0NIT0lDRSh4LCB5KSB4CiAjZW5kaWYKIAotI2RlZmluZSBnX2xvbmcgIE1PREVfQ0hPSUNFKGxvbmcsIHF1YWQpICAgICAgICAgLyogdXNhZ2UgaXMgIi5nX2xvbmciICovCisjZGVmaW5lIG1hY2hpbmVfY2hvaWNlCU1PREVfQ0hPSUNFKHBwYzc0MDAscHBjNjQpCiAKLSNkZWZpbmUgTE9HMl9HUFJfQllURVMgIE1PREVfQ0hPSUNFKDIsMykgICAgICAgIC8qIGxvZzIoR1BSX0JZVEVTKSAqLworOyBEZWZpbmUgc29tZSBwc2V1ZG8tb3Bjb2RlcyBmb3Igc2l6ZS1pbmRlcGVuZGVudCBsb2FkICYgc3RvcmUgb2YgR1BScyAuLi4KKyNkZWZpbmUgbGd1CQlNT0RFX0NIT0lDRShsd3p1LCBsZHUpCisjZGVmaW5lIGxnCQlNT0RFX0NIT0lDRShsd3osbGQpCisjZGVmaW5lIHNnCQlNT0RFX0NIT0lDRShzdHcsc3RkKQorI2RlZmluZSBzZ3UJCU1PREVfQ0hPSUNFKHN0d3Usc3RkdSkKKyNkZWZpbmUgc2d1eAkJTU9ERV9DSE9JQ0Uoc3R3dXgsc3RkdXgpCiAKLSNkZWZpbmUgTElCRkZJX0FTTQorOyAuLi4gYW5kIHRoZSBzaXplIG9mIEdQUnMgYW5kIHRoZWlyIHN0b3JhZ2UgaW5kaWNhdG9yLgorI2RlZmluZSBHUFJfQllURVMJTU9ERV9DSE9JQ0UoNCw4KQorI2RlZmluZSBMT0cyX0dQUl9CWVRFUwlNT0RFX0NIT0lDRSgyLDMpCS8qIGxvZzIoR1BSX0JZVEVTKSAqLworI2RlZmluZSBnX2xvbmcJCU1PREVfQ0hPSUNFKGxvbmcsIHF1YWQpCS8qIHVzYWdlIGlzICIuZ19sb25nIiAqLworCis7IEZyb20gdGhlIEFCSSBkb2M6ICJNYWMgT1MgWCBBQkkgRnVuY3Rpb24gQ2FsbCBHdWlkZSIgVmVyc2lvbiAyMDA5LTAyLTA0LgorI2RlZmluZSBMSU5LQUdFX1NJWkUJTU9ERV9DSE9JQ0UoMjQsNDgpCisjZGVmaW5lIFBBUkFNX0FSRUEJTU9ERV9DSE9JQ0UoMzIsNjQpCisjZGVmaW5lIFNBVkVEX0xSX09GRlNFVAlNT0RFX0NIT0lDRSg4LDE2KQkvKiBzYXZlIHBvc2l0aW9uIGZvciBsciAqLworCisvKiBJZiB0aGVyZSBpcyBhbnkgRlAgc3R1ZmYgd2UgbWFrZSBzcGFjZSBmb3IgYWxsIG9mIHRoZSByZWdzLiAgKi8KKyNkZWZpbmUgU0FWRURfRlBSX0NPVU5UIDEzCisjZGVmaW5lIEZQUl9TSVpFCTgKKyNkZWZpbmUgUkVTVUxUX0JZVEVTCTE2CisKKy8qIFRoaXMgc2hvdWxkIGJlIGtlcHQgaW4gc3RlcCB3aXRoIHRoZSBzYW1lIHZhbHVlIGluIGZmaV9kYXJ3aW4uYy4gICovCisjZGVmaW5lIEFTTV9ORUVEU19SRUdJU1RFUlMgNAorI2RlZmluZSBTQVZFX1JFR1NfU0laRSAoQVNNX05FRURTX1JFR0lTVEVSUyAqIEdQUl9CWVRFUykKKwogI2luY2x1ZGUgPGZmaWNvbmZpZy5oPgogI2luY2x1ZGUgPGZmaS5oPgorCiAjZGVmaW5lIEpVTVBUQVJHRVQobmFtZSkgbmFtZQogI2RlZmluZSBMKHgpIHgKLS50ZXh0Ci0JLmFsaWduIDIKLS5nbG9ibCBfZmZpX3ByZXBfYXJncwogCi0udGV4dAorCS50ZXh0CiAJLmFsaWduIDIKLS5nbG9ibCBfZmZpX2NhbGxfREFSV0lOCi0udGV4dAorCS5nbG9ibCBfZmZpX3ByZXBfYXJncworCiAJLmFsaWduIDIKKwkuZ2xvYmwgX2ZmaV9jYWxsX0RBUldJTgorCisJLyogV2UgYXJyaXZlIGhlcmUgd2l0aDoKKwkgICByMyA9IHB0ciB0byBleHRlbmRlZCBjaWYuCisJICAgcjQgPSAtYnl0ZXMuCisJICAgcjUgPSBjaWYgZmxhZ3MuCisJICAgcjYgPSBwdHIgdG8gcmV0dXJuIHZhbHVlLgorCSAgIHI3ID0gZm4gcG9pbnRlciAodXNlciBmdW5jKS4KKwkgICByOCA9IGZuIHBvaW50ZXIgKGZmaV9wcmVwX2FyZ3MpLgorCSAgIHI5ID0gZmZpX3R5cGUqIGZvciB0aGUgcmV0IHZhbC4gICovCisKIF9mZmlfY2FsbF9EQVJXSU46Ci1MRkIwOgorTHN0YXJ0Y29kZToKIAltciAgIAlyMTIscjgJLyogV2Ugb25seSBuZWVkIHIxMiB1bnRpbCB0aGUgY2FsbCwKLQkJCSAgIHNvIGl0IGRvZXNuJ3QgaGF2ZSB0byBiZSBzYXZlZC4gICovCisJCQkgICBzbyBpdCBkb2VzIG5vdCBoYXZlIHRvIGJlIHNhdmVkLiAgKi8KIExGQjE6CiAJLyogU2F2ZSB0aGUgb2xkIHN0YWNrIHBvaW50ZXIgYXMgQVAuICAqLwogCW1yCXI4LHIxCiBMQ0ZJMDoKKwkKKwkvKiBTYXZlIHRoZSByZXR2YWwgdHlwZSBpbiBwYXJlbnRzIGZyYW1lLiAgKi8KKwlzZwlyOSwoTElOS0FHRV9TSVpFKzYqR1BSX0JZVEVTKShyOCkKKwogCS8qIEFsbG9jYXRlIHRoZSBzdGFjayBzcGFjZSB3ZSBuZWVkLiAgKi8KLQlzdHd1eAlyMSxyMSxyNAorCXNndXgJcjEscjEscjQKIAogCS8qIFNhdmUgcmVnaXN0ZXJzIHdlIHVzZS4gICovCiAJbWZscglyOQorCXNnCXI5LFNBVkVEX0xSX09GRlNFVChyOCkKIAotCXN0dwlyMjgsLTE2KHI4KQkKLQlzdHcJcjI5LC0xMihyOCkKLQlzdHcJcjMwLC04KHI4KQotCXN0dwlyMzEsLTQocjgpCisJc2cJcjI4LC0oNCAqIEdQUl9CWVRFUykocjgpCQorCXNnCXIyOSwtKDMgKiBHUFJfQllURVMpKHI4KQorCXNnCXIzMCwtKDIgKiBHUFJfQllURVMpKHI4KQorCXNnCXIzMSwtKCAgICBHUFJfQllURVMpKHI4KQogCi0Jc3R3CXI5LDgocjgpCi0Jc3R3CXIyLDIwKHIxKQorI2lmICFkZWZpbmVkKFBPV0VSUENfREFSV0lOKQorCS8qIFRoZSBUT0Mgc2xvdCBpcyByZXNlcnZlZCBpbiB0aGUgRGFyd2luIEFCSSBhbmQgcjIgaXMgdm9sYXRpbGUuICAqLworCXNnCXIyLCg1ICogR1BSX0JZVEVTKShyMSkKKyNlbmRpZgorCiBMQ0ZJMToKIAogCS8qIFNhdmUgYXJndW1lbnRzIG92ZXIgY2FsbC4gICovCkBAIC03NywxNCArMTE4LDE3IEBACiAJbXIJcjI5LHI3CS8qIGZ1bmN0aW9uIGFkZHJlc3MsICAqLwogCW1yCXIyOCxyOAkvKiBvdXIgQVAuICAqLwogTENGSTI6Ci0JLyogQ2FsbCBmZmlfcHJlcF9hcmdzLiAgKi8KKwkvKiBDYWxsIGZmaV9wcmVwX2FyZ3MuIHIzID0gZXh0ZW5kZWQgY2lmLCByNCA9IHN0YWNrIHB0ciBjb3B5LiAgKi8KIAltcglyNCxyMQogCWxpCXI5LDAKIAogCW10Y3RyCXIxMiAvKiByMTIgaG9sZHMgYWRkcmVzcyBvZiBfZmZpX3ByZXBfYXJncy4gICovCiAJYmN0cmwKLQlsd3ogICAgIHIyLDIwKHIxKQogCisjaWYgIWRlZmluZWQoUE9XRVJQQ19EQVJXSU4pCisJLyogVGhlIFRPQyBzbG90IGlzIHJlc2VydmVkIGluIHRoZSBEYXJ3aW4gQUJJIGFuZCByMiBpcyB2b2xhdGlsZS4gICovCisJbGcgICAgIHIyLCg1ICogR1BSX0JZVEVTKShyMSkKKyNlbmRpZgogCS8qIE5vdyBkbyB0aGUgY2FsbC4KIAkgICBTZXQgdXAgY3IxIHdpdGggYml0cyA0LTcgb2YgdGhlIGZsYWdzLiAgKi8KIAltdGNyZgkweDQwLHIzMQpAQCAtOTIsNzEgKzEzNiwxMzAgQEAKIAltdGN0cglyMjkKIAkvKiBMb2FkIGFsbCB0aG9zZSBhcmd1bWVudCByZWdpc3RlcnMuCiAJICAgV2UgaGF2ZSBzZXQgdXAgYSBuaWNlIHN0YWNrIGZyYW1lLCBqdXN0IGxvYWQgaXQgaW50byByZWdpc3RlcnMuICAqLwotCWx3eiAgICAgcjMsMjArKDEqNCkocjEpCi0JbHd6ICAgICByNCwyMCsoMio0KShyMSkKLQlsd3ogICAgIHI1LDIwKygzKjQpKHIxKQotCWx3eiAgICAgcjYsMjArKDQqNCkocjEpCisJbGcgICAgIHIzLCAoTElOS0FHRV9TSVpFICAgICAgICAgICAgICAgICkocjEpCisJbGcgICAgIHI0LCAoTElOS0FHRV9TSVpFICsgICAgIEdQUl9CWVRFUykocjEpCisJbGcgICAgIHI1LCAoTElOS0FHRV9TSVpFICsgMiAqIEdQUl9CWVRFUykocjEpCisJbGcgICAgIHI2LCAoTElOS0FHRV9TSVpFICsgMyAqIEdQUl9CWVRFUykocjEpCiAJbm9wCi0JbHd6ICAgICByNywyMCsoNSo0KShyMSkKLQlsd3ogICAgIHI4LDIwKyg2KjQpKHIxKQotCWx3eiAgICAgcjksMjArKDcqNCkocjEpCi0JbHd6ICAgICByMTAsMjArKDgqNCkocjEpCisJbGcgICAgIHI3LCAoTElOS0FHRV9TSVpFICsgNCAqIEdQUl9CWVRFUykocjEpCisJbGcgICAgIHI4LCAoTElOS0FHRV9TSVpFICsgNSAqIEdQUl9CWVRFUykocjEpCisJbGcgICAgIHI5LCAoTElOS0FHRV9TSVpFICsgNiAqIEdQUl9CWVRFUykocjEpCisJbGcgICAgIHIxMCwoTElOS0FHRV9TSVpFICsgNyAqIEdQUl9CWVRFUykocjEpCiAKIEwxOgotCS8qIExvYWQgYWxsIHRoZSBGUCByZWdpc3RlcnMuICAqLworCS8qIC4uLiBMb2FkIGFsbCB0aGUgRlAgcmVnaXN0ZXJzLiAgKi8KIAliZgk2LEwyCS8qIE5vIGZsb2F0cyB0byBsb2FkLiAgKi8KLQlsZmQJZjEsLTE2LSgxMyo4KShyMjgpCi0JbGZkCWYyLC0xNi0oMTIqOCkocjI4KQotCWxmZAlmMywtMTYtKDExKjgpKHIyOCkKLQlsZmQJZjQsLTE2LSgxMCo4KShyMjgpCisJbGZkCWYxLCAtU0FWRV9SRUdTX1NJWkUtKDEzKkZQUl9TSVpFKShyMjgpCisJbGZkCWYyLCAtU0FWRV9SRUdTX1NJWkUtKDEyKkZQUl9TSVpFKShyMjgpCisJbGZkCWYzLCAtU0FWRV9SRUdTX1NJWkUtKDExKkZQUl9TSVpFKShyMjgpCisJbGZkCWY0LCAtU0FWRV9SRUdTX1NJWkUtKDEwKkZQUl9TSVpFKShyMjgpCiAJbm9wCi0JbGZkCWY1LC0xNi0oOSo4KShyMjgpCi0JbGZkCWY2LC0xNi0oOCo4KShyMjgpCi0JbGZkCWY3LC0xNi0oNyo4KShyMjgpCi0JbGZkCWY4LC0xNi0oNio4KShyMjgpCisJbGZkCWY1LCAtU0FWRV9SRUdTX1NJWkUtKCA5KkZQUl9TSVpFKShyMjgpCisJbGZkCWY2LCAtU0FWRV9SRUdTX1NJWkUtKCA4KkZQUl9TSVpFKShyMjgpCisJbGZkCWY3LCAtU0FWRV9SRUdTX1NJWkUtKCA3KkZQUl9TSVpFKShyMjgpCisJbGZkCWY4LCAtU0FWRV9SRUdTX1NJWkUtKCA2KkZQUl9TSVpFKShyMjgpCiAJbm9wCi0JbGZkICAgICBmOSwtMTYtKDUqOCkocjI4KQotCWxmZCAgICAgZjEwLC0xNi0oNCo4KShyMjgpCi0JbGZkICAgICBmMTEsLTE2LSgzKjgpKHIyOCkKLQlsZmQgICAgIGYxMiwtMTYtKDIqOCkocjI4KQorCWxmZCAgICAgZjksIC1TQVZFX1JFR1NfU0laRS0oIDUqRlBSX1NJWkUpKHIyOCkKKwlsZmQgICAgIGYxMCwtU0FWRV9SRUdTX1NJWkUtKCA0KkZQUl9TSVpFKShyMjgpCisJbGZkICAgICBmMTEsLVNBVkVfUkVHU19TSVpFLSggMypGUFJfU0laRSkocjI4KQorCWxmZCAgICAgZjEyLC1TQVZFX1JFR1NfU0laRS0oIDIqRlBSX1NJWkUpKHIyOCkKIAlub3AKLQlsZmQgICAgIGYxMywtMTYtKDEqOCkocjI4KQorCWxmZCAgICAgZjEzLC1TQVZFX1JFR1NfU0laRS0oIDEqRlBSX1NJWkUpKHIyOCkKIAogTDI6CiAJbXIJcjEyLHIyOQkvKiBQdXQgdGhlIHRhcmdldCBhZGRyZXNzIGluIHIxMiBhcyBzcGVjaWZpZWQuICAqLwogCW10Y3RyICAJcjEyCiAJbm9wCiAJbm9wCisKIAkvKiBNYWtlIHRoZSBjYWxsLiAgKi8KIAliY3RybAogCiAJLyogTm93LCBkZWFsIHdpdGggdGhlIHJldHVybiB2YWx1ZS4gICovCi0JbXRjcmYJMHgwMSxyMzEKIAotCWJ0CTMwLEwoZG9uZV9yZXR1cm5fdmFsdWUpCi0JYnQJMjksTChmcF9yZXR1cm5fdmFsdWUpCi0Jc3R3CXIzLDAocjMwKQotCWJmCTI4LEwoZG9uZV9yZXR1cm5fdmFsdWUpCi0Jc3R3CXI0LDQocjMwKQorCS8qIG02NCBzdHJ1Y3R1cmUgcmV0dXJucyBjYW4gb2NjdXB5IHRoZSBzYW1lIHNldCBvZiByZWdpc3RlcnMgYXMKKwkgICB3b3VsZCBiZSB1c2VkIHRvIHBhc3Mgc3VjaCBhIHN0cnVjdHVyZSBhcyBhcmcwIC0gc28gdGFrZSBjYXJlIAorCSAgIG5vdCB0byBzdGVwIG9uIGFueSBwb3NzaWJseSBob3QgcmVncy4gICovCiAKLQkvKiBGYWxsIHRocm91Z2guICAqLworCS8qIEdldCB0aGUgZmxhZ3MuLiAqLworCW10Y3JmCTB4MDMscjMxIDsgd2UgbmVlZCBjNiAmIGNyNyBub3cuCisJOyBGTEFHX1JFVFVSTlNfTk9USElORyBhbHNvIGNvdmVycyBzdHJ1Y3QgcmV0LWJ5LXJlZi4KKwlidAkzMCxMKGRvbmVfcmV0dXJuX3ZhbHVlKQkgIDsgRkxBR19SRVRVUk5TX05PVEhJTkcKKwliZgkyNyxMKHNjYWxhcl9yZXR1cm5fdmFsdWUpIDsgbm90IEZMQUdfUkVUVVJOU19TVFJVQ1QKKwkKKwkvKiBPSywgc28gd2UgaGF2ZSBhIHN0cnVjdC4gICovCisjaWYgZGVmaW5lZChfX3BwYzY0X18pCisJYnQJMzEsTChtYXliZV9yZXR1cm5fMTI4KSA7IEZMQUdfUkVUVVJOU18xMjhCSVRTLCBzcGVjaWFsIGNhc2UgCiAKLUwoZG9uZV9yZXR1cm5fdmFsdWUpOgotCS8qIFJlc3RvcmUgdGhlIHJlZ2lzdGVycyB3ZSB1c2VkIGFuZCByZXR1cm4uICAqLwotCWx3eglyOSw4KHIyOCkKLQlsd3oJcjMxLC00KHIyOCkKLQltdGxyCXI5Ci0JbHd6CXIzMCwtOChyMjgpCi0JbHd6CXIyOSwtMTIocjI4KQotCWx3eglyMjgsLTE2KHIyOCkKLQlsd3oJcjEsMChyMSkKLQlibHIKKwkvKiBPSywgd2UgaGF2ZSB0byBtYXAgdGhlIHJldHVybiBiYWNrIHRvIGEgbWVtIHN0cnVjdC4KKwkgICBXZSBhcmUgYWJvdXQgdG8gdHJhbXBsZSB0aGUgcGFyZW50cyBwYXJhbSBhcmVhLCBzbyByZWNvdmVyIHRoZQorCSAgIHJldHVybiB0eXBlLiAgcjI5IGlzIGZyZWUsIHNpbmNlIHRoZSBjYWxsIGlzIGRvbmUuICAqLworCWxnCXIyOSwoTElOS0FHRV9TSVpFICsgNiAqIEdQUl9CWVRFUykocjI4KQorCisJc2cJcjMsIChMSU5LQUdFX1NJWkUgICAgICAgICAgICAgICAgKShyMjgpCisJc2cJcjQsIChMSU5LQUdFX1NJWkUgKyAgICAgR1BSX0JZVEVTKShyMjgpCisJc2cJcjUsIChMSU5LQUdFX1NJWkUgKyAyICogR1BSX0JZVEVTKShyMjgpCisJc2cJcjYsIChMSU5LQUdFX1NJWkUgKyAzICogR1BSX0JZVEVTKShyMjgpCisJbm9wCisJc2cJcjcsIChMSU5LQUdFX1NJWkUgKyA0ICogR1BSX0JZVEVTKShyMjgpCisJc2cJcjgsIChMSU5LQUdFX1NJWkUgKyA1ICogR1BSX0JZVEVTKShyMjgpCisJc2cJcjksIChMSU5LQUdFX1NJWkUgKyA2ICogR1BSX0JZVEVTKShyMjgpCisJc2cJcjEwLChMSU5LQUdFX1NJWkUgKyA3ICogR1BSX0JZVEVTKShyMjgpCisJLyogT0ssIHNvIGRvIHRoZSBibG9jayBtb3ZlIC0gd2UgdHJ1c3QgdGhhdCBtZW1jcHkgd2lsbCBub3QgdHJhbXBsZQorCSAgIHRoZSBmcHJzLi4uICAqLworCW1yIAlyMyxyMzAgOyBkZXN0CisJYWRkaQlyNCxyMjgsTElOS0FHRV9TSVpFIDsgc291cmNlCisJLyogVGhlIHNpemUgaXMgYSBzaXplX3QsIHNob3VsZCBiZSBsb25nLiAgKi8KKwlsZwlyNSwwKHIyOSkKKwkvKiBGaWd1cmUgb3V0IHNtYWxsIHN0cnVjdHMgKi8KKwljbXBpCTAscjUsNAorCWJndAlMMwk7IDEsIDIgYW5kIDQgYnl0ZXMgaGF2ZSBzcGVjaWFsIHJ1bGVzLgorCWNtcGkJMCxyNSwzCisJYmVxCUwzCTsgbm90IDMKKwlhZGRpCXI0LHI0LDgKKwlzdWJmCXI0LHI1LHI0CitMMzoKKwlibAlfbWVtY3B5CisJCisJLyogLi4uIGRvIHdlIG5lZWQgdGhlIEZQIHJlZ2lzdGVycz8gLSByZWNvdmVyIHRoZSBmbGFncy4uICovCisJbXRjcmYJMHgwMyxyMzEgOyB3ZSBuZWVkIGM2ICYgY3I3IG5vdy4KKwliZgkyOSxMKGRvbmVfcmV0dXJuX3ZhbHVlKQkvKiBObyBmbG9hdHMgaW4gdGhlIHN0cnVjdC4gICovCisJc3RmZAlmMSwgLVNBVkVfUkVHU19TSVpFLSgxMypGUFJfU0laRSkocjI4KQorCXN0ZmQJZjIsIC1TQVZFX1JFR1NfU0laRS0oMTIqRlBSX1NJWkUpKHIyOCkKKwlzdGZkCWYzLCAtU0FWRV9SRUdTX1NJWkUtKDExKkZQUl9TSVpFKShyMjgpCisJc3RmZAlmNCwgLVNBVkVfUkVHU19TSVpFLSgxMCpGUFJfU0laRSkocjI4KQorCW5vcAorCXN0ZmQJZjUsIC1TQVZFX1JFR1NfU0laRS0oIDkqRlBSX1NJWkUpKHIyOCkKKwlzdGZkCWY2LCAtU0FWRV9SRUdTX1NJWkUtKCA4KkZQUl9TSVpFKShyMjgpCisJc3RmZAlmNywgLVNBVkVfUkVHU19TSVpFLSggNypGUFJfU0laRSkocjI4KQorCXN0ZmQJZjgsIC1TQVZFX1JFR1NfU0laRS0oIDYqRlBSX1NJWkUpKHIyOCkKKwlub3AKKwlzdGZkCWY5LCAtU0FWRV9SRUdTX1NJWkUtKCA1KkZQUl9TSVpFKShyMjgpCisJc3RmZAlmMTAsLVNBVkVfUkVHU19TSVpFLSggNCpGUFJfU0laRSkocjI4KQorCXN0ZmQJZjExLC1TQVZFX1JFR1NfU0laRS0oIDMqRlBSX1NJWkUpKHIyOCkKKwlzdGZkCWYxMiwtU0FWRV9SRUdTX1NJWkUtKCAyKkZQUl9TSVpFKShyMjgpCisJbm9wCisJc3RmZAlmMTMsLVNBVkVfUkVHU19TSVpFLSggMSpGUFJfU0laRSkocjI4KQorCisJbXIJcjMscjI5CTsgZmZpX3R5cGUgKgorCW1yCXI0LHIzMAk7IGRlc3QKKwlhZGRpCXI1LHIyOCwtU0FWRV9SRUdTX1NJWkUtKDEzKkZQUl9TSVpFKSA7IGZwcnMKKwl4b3IJcjYscjYscjYKKwlzZwlyNiwoTElOS0FHRV9TSVpFICsgNyAqIEdQUl9CWVRFUykocjI4KQorCWFkZGkJcjYscjI4LChMSU5LQUdFX1NJWkUgKyA3ICogR1BSX0JZVEVTKSA7IHBvaW50IHRvIGEgemVyb2VkIGNvdW50ZXIuCisJYmwgCV9kYXJ3aW42NF9zdHJ1Y3RfZmxvYXRzX3RvX21lbQorCisJYiBMKGRvbmVfcmV0dXJuX3ZhbHVlKQorI2Vsc2UKKwlzdHcJcjMsMChyMzApIDsgbTMyIHRoZSBvbmx5IHN0cnVjdCByZXR1cm4gaW4gcmVnIGlzIDQgYnl0ZXMuCisjZW5kaWYKKwliIEwoZG9uZV9yZXR1cm5fdmFsdWUpCiAKIEwoZnBfcmV0dXJuX3ZhbHVlKToKIAkvKiBEbyB3ZSBoYXZlIGxvbmcgZG91YmxlIHRvIHN0b3JlPyAgKi8KLQliZgkzMSxMKGZkX3JldHVybl92YWx1ZSkKKwliZgkzMSxMKGZkX3JldHVybl92YWx1ZSkgOyBGTEFHX1JFVFVSTlNfMTI4QklUUwogCXN0ZmQJZjEsMChyMzApCi0Jc3RmZAlmMiw4KHIzMCkKKwlzdGZkCWYyLEZQUl9TSVpFKHIzMCkKIAliCUwoZG9uZV9yZXR1cm5fdmFsdWUpCiAKIEwoZmRfcmV0dXJuX3ZhbHVlKToKQEAgLTE3MCwyMSArMjczLDU3IEBACiAJc3RmcwlmMSwwKHIzMCkKIAliCUwoZG9uZV9yZXR1cm5fdmFsdWUpCiAKK0woc2NhbGFyX3JldHVybl92YWx1ZSk6CisJYnQJMjksTChmcF9yZXR1cm5fdmFsdWUpCTsgRkxBR19SRVRVUk5TX0ZQCisJOyBmZmlfYXJnIGlzIGRlZmluZWQgYXMgdW5zaWduZWQgbG9uZy4gCisJc2cJcjMsMChyMzApCQk7IFNhdmUgdGhlIHJlZy4KKwliZgkyOCxMKGRvbmVfcmV0dXJuX3ZhbHVlKSA7IG5vdCBGTEFHX1JFVFVSTlNfNjRCSVRTIAorCisjaWYgZGVmaW5lZChfX3BwYzY0X18pCitMKG1heWJlX3JldHVybl8xMjgpOgorCXN0ZAlyMywwKHIzMCkKKwliZgkzMSxMKGRvbmVfcmV0dXJuX3ZhbHVlKSA7IG5vdCBGTEFHX1JFVFVSTlNfMTI4QklUUyAKKwlzdGQJcjQsOChyMzApCisjZWxzZQorCXN0dwlyNCw0KHIzMCkKKyNlbmRpZgorCisJLyogRmFsbCB0aHJvdWdoLiAgKi8KKwkvKiBXZSB3YW50IHRoaXMgYXQgdGhlIGVuZCB0byBzaW1wbGlmeSBlaCBlcGlsb2cgY29tcHV0YXRpb24uICAqLworCitMKGRvbmVfcmV0dXJuX3ZhbHVlKToKKwkvKiBSZXN0b3JlIHRoZSByZWdpc3RlcnMgd2UgdXNlZCBhbmQgcmV0dXJuLiAgKi8KKwlsZwlyMjksU0FWRURfTFJfT0ZGU0VUKHIyOCkKKwk7IGVwaWxvZworCWxnCXIzMSwtKDEgKiBHUFJfQllURVMpKHIyOCkKKwltdGxyCXIyOQorCWxnCXIzMCwtKDIgKiBHUFJfQllURVMpKHIyOCkKKwlsZwlyMjksLSgzICogR1BSX0JZVEVTKShyMjgpCisJbGcJcjI4LC0oNCAqIEdQUl9CWVRFUykocjI4KQorCWxnCXIxLDAocjEpCisJYmxyCiBMRkUxOgorCS5hbGlnbgkxCiAvKiBFTkQoX2ZmaV9jYWxsX0RBUldJTikgICovCiAKIC8qIFByb3ZpZGUgYSBudWxsIGRlZmluaXRpb24gb2YgX2ZmaV9jYWxsX0FJWC4gICovCi0udGV4dAotCS5hbGlnbiAyCi0uZ2xvYmwgX2ZmaV9jYWxsX0FJWAotLnRleHQKKwkudGV4dAorCS5nbG9ibCBfZmZpX2NhbGxfQUlYCiAJLmFsaWduIDIKIF9mZmlfY2FsbF9BSVg6CiAJYmxyCiAvKiBFTkQoX2ZmaV9jYWxsX0FJWCkgICovCiAKLS5kYXRhCi0uc2VjdGlvbiBfX1RFWFQsX19laF9mcmFtZSxjb2FsZXNjZWQsbm9fdG9jK3N0cmlwX3N0YXRpY19zeW1zCisvKiBFSCBzdHVmZi4gICovCisKKyNkZWZpbmUgRUhfREFUQV9BTElHTl9GQUNUIE1PREVfQ0hPSUNFKDB4N2MsMHg3OCkKKworCS5zdGF0aWNfZGF0YQorCS5hbGlnbiBMT0cyX0dQUl9CWVRFUworTExGQjAkbm9uX2xhenlfcHRyOgorCS5nX2xvbmcgTHN0YXJ0Y29kZQorCisJLnNlY3Rpb24gX19URVhULF9fZWhfZnJhbWUsY29hbGVzY2VkLG5vX3RvYytzdHJpcF9zdGF0aWNfc3ltcytsaXZlX3N1cHBvcnQKIEVIX2ZyYW1lMToKIAkuc2V0CUwkc2V0JDAsTEVDSUUxLUxTQ0lFMQogCS5sb25nCUwkc2V0JDAJOyBMZW5ndGggb2YgQ29tbW9uIEluZm9ybWF0aW9uIEVudHJ5CkBAIC0xOTMsMTYgKzMzMiwxNyBAQAogCS5ieXRlCTB4MQk7IENJRSBWZXJzaW9uCiAJLmFzY2lpCSJ6UlwwIgk7IENJRSBBdWdtZW50YXRpb24KIAkuYnl0ZQkweDEJOyB1bGViMTI4IDB4MTsgQ0lFIENvZGUgQWxpZ25tZW50IEZhY3RvcgotCS5ieXRlCTB4N2MJOyBzbGViMTI4IC00OyBDSUUgRGF0YSBBbGlnbm1lbnQgRmFjdG9yCisJLmJ5dGUJRUhfREFUQV9BTElHTl9GQUNUIDsgc2xlYjEyOCAtNDsgQ0lFIERhdGEgQWxpZ25tZW50IEZhY3RvcgogCS5ieXRlCTB4NDEJOyBDSUUgUkEgQ29sdW1uCiAJLmJ5dGUJMHgxCTsgdWxlYjEyOCAweDE7IEF1Z21lbnRhdGlvbiBzaXplCi0JLmJ5dGUJMHg5MAk7IEZERSBFbmNvZGluZyAoaW5kaXJlY3QgcGNyZWwpCisJLmJ5dGUJMHgxMAk7IEZERSBFbmNvZGluZyAoaW5kaXJlY3QgcGNyZWwpCiAJLmJ5dGUJMHhjCTsgRFdfQ0ZBX2RlZl9jZmEKIAkuYnl0ZQkweDEJOyB1bGViMTI4IDB4MQogCS5ieXRlCTB4MAk7IHVsZWIxMjggMHgwCiAJLmFsaWduCUxPRzJfR1BSX0JZVEVTCiBMRUNJRTE6Ci0uZ2xvYmwgX2ZmaV9jYWxsX0RBUldJTi5laAorCisJLmdsb2JsIF9mZmlfY2FsbF9EQVJXSU4uZWgKIF9mZmlfY2FsbF9EQVJXSU4uZWg6CiBMU0ZERTE6CiAJLnNldAlMJHNldCQxLExFRkRFMS1MQVNGREUxCkBAIC0yMTAsMTEgKzM1MCwxMSBAQAogTEFTRkRFMToKIAkubG9uZwlMQVNGREUxLUVIX2ZyYW1lMSA7IEZERSBDSUUgb2Zmc2V0CiAJLmdfbG9uZwlMTEZCMCRub25fbGF6eV9wdHItLgk7IEZERSBpbml0aWFsIGxvY2F0aW9uCi0JLnNldAlMJHNldCQzLExGRTEtTEZCMAorCS5zZXQJTCRzZXQkMyxMRkUxLUxzdGFydGNvZGUKIAkuZ19sb25nCUwkc2V0JDMJOyBGREUgYWRkcmVzcyByYW5nZQogCS5ieXRlICAgMHgwICAgICA7IHVsZWIxMjggMHgwOyBBdWdtZW50YXRpb24gc2l6ZQogCS5ieXRlCTB4NAk7IERXX0NGQV9hZHZhbmNlX2xvYzQKLQkuc2V0CUwkc2V0JDQsTENGSTAtTEZCMQorCS5zZXQJTCRzZXQkNCxMQ0ZJMC1Mc3RhcnRjb2RlCiAJLmxvbmcJTCRzZXQkNAogCS5ieXRlCTB4ZAk7IERXX0NGQV9kZWZfY2ZhX3JlZ2lzdGVyCiAJLmJ5dGUJMHgwOAk7IHVsZWIxMjggMHgwOApAQCAtMjM5LDcgKzM3OSw1IEBACiAJLmJ5dGUJMHgxYwk7IHVsZWIxMjggMHgxYwogCS5hbGlnbiBMT0cyX0dQUl9CWVRFUwogTEVGREUxOgotLmRhdGEKLQkuYWxpZ24gTE9HMl9HUFJfQllURVMKLUxMRkIwJG5vbl9sYXp5X3B0cjoKLQkuZ19sb25nIExGQjAKKwkuYWxpZ24gMQorCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2Rhcndpbl9jbG9zdXJlLlMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2Rhcndpbl9jbG9zdXJlLlMKaW5kZXggNzk1OTgzOC4uM2Y2NzkwZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcG93ZXJwYy9kYXJ3aW5fY2xvc3VyZS5TCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvZGFyd2luX2Nsb3N1cmUuUwpAQCAtMSw2ICsxLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICBkYXJ3aW5fY2xvc3VyZS5TIC0gQ29weXJpZ2h0IChjKSAyMDAyLCAyMDAzLCAyMDA0LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuIGJhc2VkIG9uIHBwY19jbG9zdXJlLlMKKyAgIGRhcndpbl9jbG9zdXJlLlMgLSBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMTAsIAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIAorICAgYmFzZWQgb24gcHBjX2Nsb3N1cmUuUwogCiAgICBQb3dlclBDIEFzc2VtYmx5IGdsdWUuCiAKQEAgLTMzLDkxICszNCwxNzcgQEAKICNkZWZpbmUgTU9ERV9DSE9JQ0UoeCwgeSkgeAogI2VuZGlmCiAKLSNkZWZpbmUgbGd1ICAgICBNT0RFX0NIT0lDRShsd3p1LCBsZHUpCisjZGVmaW5lIG1hY2hpbmVfY2hvaWNlCU1PREVfQ0hPSUNFKHBwYzc0MDAscHBjNjQpCiAKLSNkZWZpbmUgZ19sb25nICBNT0RFX0NIT0lDRShsb25nLCBxdWFkKSAgICAgICAgIC8qIHVzYWdlIGlzICIuZ19sb25nIiAqLworOyBEZWZpbmUgc29tZSBwc2V1ZG8tb3Bjb2RlcyBmb3Igc2l6ZS1pbmRlcGVuZGVudCBsb2FkICYgc3RvcmUgb2YgR1BScyAuLi4KKyNkZWZpbmUgbGd1CQlNT0RFX0NIT0lDRShsd3p1LCBsZHUpCisjZGVmaW5lIGxnCQlNT0RFX0NIT0lDRShsd3osbGQpCisjZGVmaW5lIHNnCQlNT0RFX0NIT0lDRShzdHcsc3RkKQorI2RlZmluZSBzZ3UJCU1PREVfQ0hPSUNFKHN0d3Usc3RkdSkKIAotI2RlZmluZSBMT0cyX0dQUl9CWVRFUyAgTU9ERV9DSE9JQ0UoMiwzKSAgICAgICAgLyogbG9nMihHUFJfQllURVMpICovCis7IC4uLiBhbmQgdGhlIHNpemUgb2YgR1BScyBhbmQgdGhlaXIgc3RvcmFnZSBpbmRpY2F0b3IuCisjZGVmaW5lIEdQUl9CWVRFUwlNT0RFX0NIT0lDRSg0LDgpCisjZGVmaW5lIExPRzJfR1BSX0JZVEVTCU1PREVfQ0hPSUNFKDIsMykJLyogbG9nMihHUFJfQllURVMpICovCisjZGVmaW5lIGdfbG9uZwkJTU9ERV9DSE9JQ0UobG9uZywgcXVhZCkJLyogdXNhZ2UgaXMgIi5nX2xvbmciICovCisKKzsgRnJvbSB0aGUgQUJJIGRvYzogIk1hYyBPUyBYIEFCSSBGdW5jdGlvbiBDYWxsIEd1aWRlIiBWZXJzaW9uIDIwMDktMDItMDQuCisjZGVmaW5lIExJTktBR0VfU0laRQlNT0RFX0NIT0lDRSgyNCw0OCkKKyNkZWZpbmUgUEFSQU1fQVJFQQlNT0RFX0NIT0lDRSgzMiw2NCkKKworI2RlZmluZSBTQVZFRF9DUl9PRkZTRVQJTU9ERV9DSE9JQ0UoNCw4KQkvKiBzYXZlIHBvc2l0aW9uIGZvciBDUiAqLworI2RlZmluZSBTQVZFRF9MUl9PRkZTRVQJTU9ERV9DSE9JQ0UoOCwxNikJLyogc2F2ZSBwb3NpdGlvbiBmb3IgbHIgKi8KKworLyogV0FSTklORzogaWYgZmZpX3R5cGUgaXMgY2hhbmdlZC4uLiBoZXJlIGJlIG1vbnN0ZXJzLiAgCisgICBPZmZzZXRzIG9mIGl0ZW1zIHdpdGhpbiB0aGUgcmVzdWx0IHR5cGUuICAqLworI2RlZmluZSBGRklfVFlQRV9UWVBFCU1PREVfQ0hPSUNFKDYsMTApCisjZGVmaW5lIEZGSV9UWVBFX0VMRU0JTU9ERV9DSE9JQ0UoOCwxNikKKworI2RlZmluZSBTQVZFRF9GUFJfQ09VTlQgMTMKKyNkZWZpbmUgRlBSX1NJWkUJOAorLyogYmlnZ2VzdCBtNjQgc3RydWN0IHJldCBpcyA4R1BSUyArIDEzRlBSUyA9IDE2OCBieXRlcyAtIHJvdW5kZWQgdG8gMTZieXRlcyA9IDE3Ni4gKi8KKyNkZWZpbmUgUkVTVUxUX0JZVEVTCU1PREVfQ0hPSUNFKDE2LDE3NikKKworOyBUaGUgd2hvbGUgc3RhY2sgZnJhbWUgKipNVVNUKiogYmUgMTZieXRlLWFsaWduZWQuCisjZGVmaW5lIFNBVkVfU0laRSAoKChMSU5LQUdFX1NJWkUrUEFSQU1fQVJFQStTQVZFRF9GUFJfQ09VTlQqRlBSX1NJWkUrUkVTVUxUX0JZVEVTKSsxNSkgJiAtMTZMTCkKKyNkZWZpbmUgUEFEX1NJWkUgKFNBVkVfU0laRS0oTElOS0FHRV9TSVpFK1BBUkFNX0FSRUErU0FWRURfRlBSX0NPVU5UKkZQUl9TSVpFK1JFU1VMVF9CWVRFUykpCisKKyNkZWZpbmUgUEFSRU5UX1BBUk1fQkFTRSAoU0FWRV9TSVpFK0xJTktBR0VfU0laRSkKKyNkZWZpbmUgRlBfU0FWRV9CQVNFIChMSU5LQUdFX1NJWkUrUEFSQU1fQVJFQSkKKworI2lmIGRlZmluZWQoX19FTlZJUk9OTUVOVF9NQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRF9fKSAmJiBfX0VOVklST05NRU5UX01BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEX18gPj0gMTA1MAorOyBXZSBubyBsb25nZXIgbmVlZCB0aGUgcGljIHN5bWJvbCBzdHViIGZvciBEYXJ3aW4gPj0gOS4KKyNkZWZpbmUgQkxDTFNfSEVMUCBfZmZpX2Nsb3N1cmVfaGVscGVyX0RBUldJTgorI2RlZmluZSBTVFJVQ1RfUkVUVkFMVUVfUCBfZGFyd2luNjRfc3RydWN0X3JldF9ieV92YWx1ZV9wCisjZGVmaW5lIFBBU1NfU1RSX0ZMT0FUUyBfZGFyd2luNjRfcGFzc19zdHJ1Y3RfZmxvYXRzCisjdW5kZWYgV0FOVF9TVFVCCisjZWxzZQorI2RlZmluZSBCTENMU19IRUxQIExfZmZpX2Nsb3N1cmVfaGVscGVyX0RBUldJTiRzdHViCisjZGVmaW5lIFNUUlVDVF9SRVRWQUxVRV9QIExfZGFyd2luNjRfc3RydWN0X3JldF9ieV92YWx1ZV9wJHN0dWIKKyNkZWZpbmUgUEFTU19TVFJfRkxPQVRTIExfZGFyd2luNjRfcGFzc19zdHJ1Y3RfZmxvYXRzJHN0dWIKKyNkZWZpbmUgV0FOVF9TVFVCCisjZW5kaWYKKworLyogbTMyL202NAorCisgICBUaGUgc3RhY2sgbGF5b3V0IGxvb2tzIGxpa2UgdGhpczoKKworICAgfCAgIEFkZGl0aW9uYWwgcGFyYW1zLi4uCQkJfCB8ICAgICBIaWdoZXIgYWRkcmVzcworICAgfgkJCQkJCX4gfgorICAgfCAgIFBhcmFtZXRlcnMgICAgICAoYXQgbGVhc3QgOCo0Lzg9MzIvNjQpCXwgfCBOVU1fR1BSX0FSR19SRUdJU1RFUlMKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfAorICAgfCAgIFRPQz1SMiAoQUlYKSBSZXNlcnZlZCAoRGFyd2luKSAgIDQvOAl8IHwKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfAorICAgfCAgIFJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAyKjQvOAl8IHwKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfAorICAgfCAgIFNwYWNlIGZvciBjYWxsZWVgcyBMUgkJNC84CXwgfAorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8CisgICB8ICAgU2F2ZWQgQ1IgW2xvdyB3b3JkIGZvciBtNjRdICAgICAgNC84CXwgfAorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8CisgICB8ICAgQ3VycmVudCBiYWNrY2hhaW4gcG9pbnRlcgk0LzgJfC0vIFBhcmVudGBzIGZyYW1lLgorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCA8KyA8PDwgb24gZW50cnkgdG8KKyAgIHwgICBSZXN1bHQgQnl0ZXMJCSAgICAgICAxNi8xNzYJfCB8CisgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwKKyAgIH4gICBwYWRkaW5nIHRvIDE2LWJ5dGUgYWxpZ25tZW50CQl+IH4KKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfAorICAgfCAgIE5VTV9GUFJfQVJHX1JFR0lTVEVSUyBzbG90cwkJfCB8CisgICB8ICAgaGVyZSBmcDEzIC4uIGZwMQkJICAgICAgIDEzKjgJfCB8CisgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwKKyAgIHwgICBSMy4uUjEwCQkJICA4KjQvOD0zMi82NAl8IHwgTlVNX0dQUl9BUkdfUkVHSVNURVJTCisgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwKKyAgIHwgICBUT0M9UjIgKEFJWCkgUmVzZXJ2ZWQgKERhcndpbikgICA0LzgJfCB8CisgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwJc3RhY2sJfAorICAgfCAgIFJlc2VydmVkIFtjb21waWxlcixiaW5kZXJdICAgICAyKjQvOAl8IHwJZ3Jvd3MJfAorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8CWRvd24JVgorICAgfCAgIFNwYWNlIGZvciBjYWxsZWVzIExSCQk0LzgJfCB8CisgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwJbG93ZXIgYWRkcmVzc2VzCisgICB8ICAgU2F2ZWQgQ1IgW2xvdyB3b3JkIGZvciBtNjRdICAgICAgNC84CXwgfAorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8ICAgICBzdGFjayBwb2ludGVyIGhlcmUKKyAgIHwgICBDdXJyZW50IGJhY2tjaGFpbiBwb2ludGVyCTQvOAl8LS8JZHVyaW5nCisgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18ICAgPDw8CWNhbGwuCisKKyovCiAKIAkuZmlsZQkiZGFyd2luX2Nsb3N1cmUuUyIKLS50ZXh0Ci0JLmFsaWduIExPRzJfR1BSX0JZVEVTCi0uZ2xvYmwgX2ZmaV9jbG9zdXJlX0FTTQogCi0udGV4dAorCS5tYWNoaW5lIG1hY2hpbmVfY2hvaWNlCisKKwkudGV4dAorCS5nbG9ibCBfZmZpX2Nsb3N1cmVfQVNNCiAJLmFsaWduIExPRzJfR1BSX0JZVEVTCiBfZmZpX2Nsb3N1cmVfQVNNOgogTEZCMToKLQltZmxyCXIwCQkvKiBleHRyYWN0IHJldHVybiBhZGRyZXNzICAqLwotCXN0dwlyMCw4KHIxKQkvKiBzYXZlIHRoZSByZXR1cm4gYWRkcmVzcyAgKi8KK0xzdGFydGNvZGU6CisJbWZscglyMAkJCS8qIGV4dHJhY3QgcmV0dXJuIGFkZHJlc3MgICovCisJc2cJcjAsU0FWRURfTFJfT0ZGU0VUKHIxKQkvKiBzYXZlIHRoZSByZXR1cm4gYWRkcmVzcyAgKi8KIExDRkkwOgotCS8qIDI0IEJ5dGVzIChMaW5rYWdlIEFyZWEpCi0JICAgMzIgQnl0ZXMgKG91dGdvaW5nIHBhcmFtZXRlciBhcmVhLCBhbHdheXMgcmVzZXJ2ZWQpCi0JICAgMTA0IEJ5dGVzICgxMyo4IGZyb20gRlBSKQotCSAgIDE2IEJ5dGVzIChyZXN1bHQpCi0JICAgMTc2IEJ5dGVzICAqLwotCi0Jc3R3dQlyMSwtMTc2KHIxKQkvKiBza2lwIG92ZXIgY2FsbGVyIHNhdmUgYXJlYQotCQkJCWtlZXAgc3RhY2sgYWxpZ25lZCB0byAxNi4gICovCisJc2d1CXIxLC1TQVZFX1NJWkUocjEpCS8qIHNraXAgb3ZlciBjYWxsZXIgc2F2ZSBhcmVhCisJCQkJCWtlZXAgc3RhY2sgYWxpZ25lZCB0byAxNi4gICovCiBMQ0ZJMToKIAkvKiBXZSB3YW50IHRvIGJ1aWxkIHVwIGFuIGFyZWEgZm9yIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZAogCSAgIGluIHJlZ2lzdGVycy4gKGJvdGggZmxvYXRpbmcgcG9pbnQgYW5kIGludGVnZXIpICAqLwogCi0JLyogV2Ugc3RvcmUgZ3ByIDMgdG8gZ3ByIDEwIChhbGlnbmVkIHRvIDQpCi0JICAgaW4gdGhlIHBhcmVudHMgb3V0Z29pbmcgYXJlYS4gICovCi0Jc3R3ICAgcjMsMjAwKHIxKQotCXN0dyAgIHI0LDIwNChyMSkKLQlzdHcgICByNSwyMDgocjEpCi0Jc3R3ICAgcjYsMjEyKHIxKQotCXN0dyAgIHI3LDIxNihyMSkKLQlzdHcgICByOCwyMjAocjEpCi0Jc3R3ICAgcjksMjI0KHIxKQotCXN0dyAgIHIxMCwyMjgocjEpCisJLyogUHV0IGdwciAzIHRvIGdwciAxMCBpbiB0aGUgcGFyZW50cyBvdXRnb2luZyBhcmVhLi4uCisJICAgLi4uIHRoZSByZW1haW5kZXIgb2YgYW55IHBhcmFtcyB0aGF0IG92ZXJmbG93ZWQgdGhlIHJlZ3Mgd2lsbAorCSAgIGZvbGxvdyBoZXJlLiAgKi8KKwlzZwlyMywgKFBBUkVOVF9QQVJNX0JBU0UgICAgICAgICAgICAgICAgKShyMSkKKwlzZwlyNCwgKFBBUkVOVF9QQVJNX0JBU0UgKyBHUFJfQllURVMgICAgKShyMSkKKwlzZwlyNSwgKFBBUkVOVF9QQVJNX0JBU0UgKyBHUFJfQllURVMgKiAyKShyMSkKKwlzZwlyNiwgKFBBUkVOVF9QQVJNX0JBU0UgKyBHUFJfQllURVMgKiAzKShyMSkKKwlzZwlyNywgKFBBUkVOVF9QQVJNX0JBU0UgKyBHUFJfQllURVMgKiA0KShyMSkKKwlzZwlyOCwgKFBBUkVOVF9QQVJNX0JBU0UgKyBHUFJfQllURVMgKiA1KShyMSkKKwlzZwlyOSwgKFBBUkVOVF9QQVJNX0JBU0UgKyBHUFJfQllURVMgKiA2KShyMSkKKwlzZwlyMTAsKFBBUkVOVF9QQVJNX0JBU0UgKyBHUFJfQllURVMgKiA3KShyMSkKIAotCS8qIFdlIHNhdmUgZnByIDEgdG8gZnByIDEzLiAoYWxpZ25lZCB0byA4KSAgKi8KLQlzdGZkICBmMSw1NihyMSkKLQlzdGZkICBmMiw2NChyMSkKLQlzdGZkICBmMyw3MihyMSkKLQlzdGZkICBmNCw4MChyMSkKLQlzdGZkICBmNSw4OChyMSkKLQlzdGZkICBmNiw5NihyMSkKLQlzdGZkICBmNywxMDQocjEpCi0Jc3RmZCAgZjgsMTEyKHIxKQotCXN0ZmQgIGY5LDEyMChyMSkKLQlzdGZkICBmMTAsMTI4KHIxKQotCXN0ZmQgIGYxMSwxMzYocjEpCi0Jc3RmZCAgZjEyLDE0NChyMSkKLQlzdGZkICBmMTMsMTUyKHIxKQorCS8qIFdlIHNhdmUgZnByIDEgdG8gZnByIDE0IGluIG91ciBvd24gc2F2ZSBmcmFtZS4gICovCisJc3RmZAlmMSwgKEZQX1NBVkVfQkFTRSAgICAgICAgICAgICAgICAgKShyMSkKKwlzdGZkCWYyLCAoRlBfU0FWRV9CQVNFICsgIEZQUl9TSVpFICAgICApKHIxKQorCXN0ZmQJZjMsIChGUF9TQVZFX0JBU0UgKyAgRlBSX1NJWkUgKiAyICkocjEpCisJc3RmZAlmNCwgKEZQX1NBVkVfQkFTRSArICBGUFJfU0laRSAqIDMgKShyMSkKKwlzdGZkCWY1LCAoRlBfU0FWRV9CQVNFICsgIEZQUl9TSVpFICogNCApKHIxKQorCXN0ZmQJZjYsIChGUF9TQVZFX0JBU0UgKyAgRlBSX1NJWkUgKiA1ICkocjEpCisJc3RmZAlmNywgKEZQX1NBVkVfQkFTRSArICBGUFJfU0laRSAqIDYgKShyMSkKKwlzdGZkCWY4LCAoRlBfU0FWRV9CQVNFICsgIEZQUl9TSVpFICogNyApKHIxKQorCXN0ZmQJZjksIChGUF9TQVZFX0JBU0UgKyAgRlBSX1NJWkUgKiA4ICkocjEpCisJc3RmZAlmMTAsKEZQX1NBVkVfQkFTRSArICBGUFJfU0laRSAqIDkgKShyMSkKKwlzdGZkCWYxMSwoRlBfU0FWRV9CQVNFICsgIEZQUl9TSVpFICogMTApKHIxKQorCXN0ZmQJZjEyLChGUF9TQVZFX0JBU0UgKyAgRlBSX1NJWkUgKiAxMSkocjEpCisJc3RmZAlmMTMsKEZQX1NBVkVfQkFTRSArICBGUFJfU0laRSAqIDEyKShyMSkKIAogCS8qIFNldCB1cCByZWdpc3RlcnMgZm9yIHRoZSByb3V0aW5lIHRoYXQgYWN0dWFsbHkgZG9lcyB0aGUgd29yawogCSAgIGdldCB0aGUgY29udGV4dCBwb2ludGVyIGZyb20gdGhlIHRyYW1wb2xpbmUuICAqLwotCW1yIHIzLHIxMQorCW1yCXIzLHIxMQogCiAJLyogTm93IGxvYWQgdXAgdGhlIHBvaW50ZXIgdG8gdGhlIHJlc3VsdCBzdG9yYWdlLiAgKi8KLQlhZGRpIHI0LHIxLDE2MAorCWFkZGkJcjQscjEsKFNBVkVfU0laRS1SRVNVTFRfQllURVMpCiAKIAkvKiBOb3cgbG9hZCB1cCB0aGUgcG9pbnRlciB0byB0aGUgc2F2ZWQgZ3ByIHJlZ2lzdGVycy4gICovCi0JYWRkaSByNSxyMSwyMDAKKwlhZGRpCXI1LHIxLFBBUkVOVF9QQVJNX0JBU0UKIAogCS8qIE5vdyBsb2FkIHVwIHRoZSBwb2ludGVyIHRvIHRoZSBzYXZlZCBmcHIgcmVnaXN0ZXJzLiAgKi8KLQlhZGRpIHI2LHIxLDU2CisJYWRkaQlyNixyMSxGUF9TQVZFX0JBU0UKIAogCS8qIE1ha2UgdGhlIGNhbGwuICAqLwotCWJsCUxmZmlfY2xvc3VyZV9oZWxwZXJfREFSV0lOJHN0dWIKKwlibAlCTENMU19IRUxQCiAKLQkvKiBOb3cgcjMgY29udGFpbnMgdGhlIHJldHVybiB0eXBlCi0JICAgc28gdXNlIGl0IHRvIGxvb2sgdXAgaW4gYSB0YWJsZQorCS8qIHIzIGNvbnRhaW5zIHRoZSBydHlwZSBwb2ludGVyLi4uIHNhdmUgaXQgc2luY2Ugd2Ugd2lsbCBuZWVkCisJICAgaXQgbGF0ZXIuICAqLworCXNnCXIzLExJTktBR0VfU0laRShyMSkJOyBmZmlfdHlwZSAqIHJlc3VsdF90eXBlCisJbGcJcjAsMChyMykJCTsgc2l6ZSA9PiByMAorCWxoeglyMyxGRklfVFlQRV9UWVBFKHIzKQk7IHR5cGUgPT4gcjMKKworCS8qIFRoZSBoZWxwZXIgd2lsbCBoYXZlIGludGVyY2VwdGVkIHN0cnV0dXJlIHJldHVybnMgYW5kIGluc2VydGVkCisJICAgdGhlIGNhbGxlcmBzIGRlc3RpbmF0aW9uIGFkZHJlc3MgZm9yIHN0cnVjdHMgcmV0dXJuZWQgYnkgcmVmLiAgKi8KKworCS8qIHIzIGNvbnRhaW5zIHRoZSByZXR1cm4gdHlwZSAgc28gdXNlIGl0IHRvIGxvb2sgdXAgaW4gYSB0YWJsZQogCSAgIHNvIHdlIGtub3cgaG93IHRvIGRlYWwgd2l0aCBlYWNoIHR5cGUuICAqLwogCi0JLyogTG9vayB1cCB0aGUgcHJvcGVyIHN0YXJ0aW5nIHBvaW50IGluIHRhYmxlCi0JICAgYnkgdXNpbmcgcmV0dXJuIHR5cGUgYXMgb2Zmc2V0LiAgKi8KLQlhZGRpICByNSxyMSwxNjAJCSAgLyogR2V0IHBvaW50ZXIgdG8gcmVzdWx0cyBhcmVhLiAgKi8KLQlibCAgICBMZ2V0X3JldF90eXBlMF9hZGRyIC8qIEdldCBwb2ludGVyIHRvIExyZXRfdHlwZTAgaW50byBMUi4gICovCi0JbWZsciAgcjQJCSAgLyogTW92ZSB0byByNC4gICovCi0Jc2x3aSAgcjMscjMsNAkJICAvKiBOb3cgbXVsdGlwbHkgcmV0dXJuIHR5cGUgYnkgMTYuICAqLwotCWFkZCAgIHIzLHIzLHI0CQkgIC8qIEFkZCBjb250ZW50cyBvZiB0YWJsZSB0byB0YWJsZSBhZGRyZXNzLiAgKi8KLQltdGN0ciByMwotCWJjdHIJCQkgIC8qIEp1bXAgdG8gaXQuICAqLworCWFkZGkJcjUscjEsKFNBVkVfU0laRS1SRVNVTFRfQllURVMpIC8qIE90aGVyd2lzZSwgb3VyIHJldHVybiBpcyBoZXJlLiAgKi8KKwlibAlMZ2V0X3JldF90eXBlMF9hZGRyCS8qIEdldCBwb2ludGVyIHRvIExyZXRfdHlwZTAgaW50byBMUi4gICovCisJbWZscglyNAkJCS8qIE1vdmUgdG8gcjQuICAqLworCXNsd2kJcjMscjMsNAkJCS8qIE5vdyBtdWx0aXBseSByZXR1cm4gdHlwZSBieSAxNi4gICovCisJYWRkCXIzLHIzLHI0CQkvKiBBZGQgY29udGVudHMgb2YgdGFibGUgdG8gdGFibGUgYWRkcmVzcy4gICovCisJbXRjdHIJcjMKKwliY3RyCQkJIAkgLyogSnVtcCB0byBpdC4gICovCiBMRkUxOgogLyogRWFjaCBvZiB0aGUgcmV0X3R5cGVYIGNvZGUgZnJhZ21lbnRzIGhhcyB0byBiZSBleGFjdGx5IDE2IGJ5dGVzIGxvbmcKICAgICg0IGluc3RydWN0aW9ucykuIEZvciBjYWNoZSBlZmZlY3RpdmVuZXNzIHdlIGFsaWduIHRvIGEgMTYgYnl0ZSBib3VuZGFyeQpAQCAtMTQwLDcgKzIyNyw3IEBACiAKIC8qIGNhc2UgRkZJX1RZUEVfSU5UICAqLwogTHJldF90eXBlMToKLQlsd3oJcjMsMChyNSkKKwlsZwlyMywwKHI1KQogCWIJTGZpbmlzaAogCW5vcAogCW5vcApAQCAtMTY4LDg1ICsyNTUsMjI0IEBACiAKIC8qIGNhc2UgRkZJX1RZUEVfVUlOVDggICovCiBMcmV0X3R5cGU1OgorI2lmIGRlZmluZWQoX19wcGM2NF9fKQorCWxieglyMyw3KHI1KQorI2Vsc2UKIAlsYnoJcjMsMyhyNSkKKyNlbmRpZgogCWIJTGZpbmlzaAogCW5vcAogCW5vcAogCiAvKiBjYXNlIEZGSV9UWVBFX1NJTlQ4ICAqLwogTHJldF90eXBlNjoKKyNpZiBkZWZpbmVkKF9fcHBjNjRfXykKKwlsYnoJcjMsNyhyNSkKKyNlbHNlCiAJbGJ6CXIzLDMocjUpCisjZW5kaWYKIAlleHRzYglyMyxyMwogCWIJTGZpbmlzaAogCW5vcAogCiAvKiBjYXNlIEZGSV9UWVBFX1VJTlQxNiAgKi8KIExyZXRfdHlwZTc6CisjaWYgZGVmaW5lZChfX3BwYzY0X18pCisJbGh6CXIzLDYocjUpCisjZWxzZQogCWxoeglyMywyKHI1KQorI2VuZGlmCiAJYglMZmluaXNoCiAJbm9wCiAJbm9wCiAKIC8qIGNhc2UgRkZJX1RZUEVfU0lOVDE2ICAqLwogTHJldF90eXBlODoKKyNpZiBkZWZpbmVkKF9fcHBjNjRfXykKKwlsaGEJcjMsNihyNSkKKyNlbHNlCiAJbGhhCXIzLDIocjUpCisjZW5kaWYKIAliCUxmaW5pc2gKIAlub3AKIAlub3AKIAogLyogY2FzZSBGRklfVFlQRV9VSU5UMzIgICovCiBMcmV0X3R5cGU5OgorI2lmIGRlZmluZWQoX19wcGM2NF9fKQorCWx3eglyMyw0KHI1KQorI2Vsc2UKIAlsd3oJcjMsMChyNSkKKyNlbmRpZgogCWIJTGZpbmlzaAogCW5vcAogCW5vcAogCiAvKiBjYXNlIEZGSV9UWVBFX1NJTlQzMiAgKi8KIExyZXRfdHlwZTEwOgorI2lmIGRlZmluZWQoX19wcGM2NF9fKQorCWx3eglyMyw0KHI1KQorI2Vsc2UKIAlsd3oJcjMsMChyNSkKKyNlbmRpZgogCWIJTGZpbmlzaAogCW5vcAogCW5vcAogCiAvKiBjYXNlIEZGSV9UWVBFX1VJTlQ2NCAgKi8KIExyZXRfdHlwZTExOgorI2lmIGRlZmluZWQoX19wcGM2NF9fKQorCWxnCXIzLDAocjUpCisJYglMZmluaXNoCisJbm9wCisjZWxzZQogCWx3eglyMywwKHI1KQogCWx3eglyNCw0KHI1KQogCWIJTGZpbmlzaAorI2VuZGlmCiAJbm9wCiAKIC8qIGNhc2UgRkZJX1RZUEVfU0lOVDY0ICAqLwogTHJldF90eXBlMTI6CisjaWYgZGVmaW5lZChfX3BwYzY0X18pCisJbGcJcjMsMChyNSkKKwliCUxmaW5pc2gKKwlub3AKKyNlbHNlCiAJbHd6CXIzLDAocjUpCiAJbHd6CXI0LDQocjUpCiAJYglMZmluaXNoCisjZW5kaWYKIAlub3AKIAogLyogY2FzZSBGRklfVFlQRV9TVFJVQ1QgICovCiBMcmV0X3R5cGUxMzoKKyNpZiBkZWZpbmVkKF9fcHBjNjRfXykKKwlsZwlyMywwKHI1KQkJOyB3ZSBuZWVkIGF0IGxlYXN0IHRoaXMuLi4KKwljbXBpCTAscjAsNAorCWJndAlMc3RydWN0ZW5kCQk7IG5vdCBhIHNwZWNpYWwgc21hbGwgY2FzZQorCWIJTHNtYWxsc3RydWN0CQk7IHNlZSBpZiB3ZSBuZWVkIG1vcmUuCisjZWxzZQorCWNtcGkJMCxyMCw0CisJYmd0CUxmaW5pc2gJCTsgbm90IGJ5IHZhbHVlCisJbGcJcjMsMChyNSkKIAliCUxmaW5pc2gKLQlub3AKKyNlbmRpZgorLyogY2FzZSBGRklfVFlQRV9QT0lOVEVSICAqLworTHJldF90eXBlMTQ6CisJbGcJcjMsMChyNSkKKwliCUxmaW5pc2gKIAlub3AKIAlub3AKIAotLyogY2FzZSBGRklfVFlQRV9QT0lOVEVSICAqLwotTHJldF90eXBlMTQ6Ci0JbHd6CXIzLDAocjUpCi0JYglMZmluaXNoCi0Jbm9wCi0Jbm9wCisjaWYgZGVmaW5lZChfX3BwYzY0X18pCitMc21hbGxzdHJ1Y3Q6CisJYmVxCUxmb3VyCQkJOyBjb250aW51YXRpb24gb2YgTHJldDEzLgorCWNtcGkJMCxyMCwzCisJYmVxCUxmaW5pc2gJCQk7IGRvbmB0IGFkanVzdCB0aGlzIC0gY2FuYHQgYmUgYW55IGZsb2F0cyBoZXJlLi4uCisJc3JkaQlyMyxyMyw0OAorCWNtcGkJMCxyMCwyCisJYmVxCUxmaW5pc2gJCQk7IC4uIG9yIGhlcmUgLi4KKwlzcmRpCXIzLHIzLDgKKwliIAlMZmluaXNoCQkJOyAuLiBvciBoZXJlLgorCitMZm91cjoKKwlsZwlyNixMSU5LQUdFX1NJWkUocjEpCTsgZ2V0IHRoZSByZXN1bHQgdHlwZQorCWxnCXI2LEZGSV9UWVBFX0VMRU0ocjYpCTsgZWxlbWVudHMgYXJyYXkgcG9pbnRlcgorCWxnCXI2LDAocjYpCQk7IGZpcnN0IGVsZW1lbnQKKwlsaHoJcjAsRkZJX1RZUEVfVFlQRShyNikJOyBPSyBnbyB0aGUgdHlwZQorCWNtcGkJMCxyMCwyCQkJOyBGRklfVFlQRV9GTE9BVAorCWJuZQlMZm91cmludAorCWxmcwlmMSwwKHI1KQkJOyBqdXN0IG9uZSBmbG9hdCBpbiB0aGUgc3RydWN0LgorCWIgCUxmaW5pc2gKKworTGZvdXJpbnQ6CisJc3JkaQlyMyxyMywzMgkJOyBmb3VyIGJ5dGVzLgorCWIgCUxmaW5pc2gKKworTHN0cnVjdGVuZDoKKwlsZwlyMyxMSU5LQUdFX1NJWkUocjEpCTsgZ2V0IHRoZSByZXN1bHQgdHlwZQorCWJsCVNUUlVDVF9SRVRWQUxVRV9QCisJY21waQkwLHIzLDAKKwliZXEJTGZpbmlzaAkJCTsgbm9wZS4KKwkvKiBSZWNvdmVyIGEgcG9pbnRlciB0byB0aGUgcmVzdWx0cy4gICovCisJYWRkaQlyMTEscjEsKFNBVkVfU0laRS1SRVNVTFRfQllURVMpCisJbGcJcjMsMChyMTEpCQk7IHdlIG5lZWQgYXQgbGVhc3QgdGhpcy4uLgorCWxnCXI0LDgocjExKQorCWNtcGkJMCxyMCwxNgorCWJlcQlMZmluaXNoCQk7IHNwZWNpYWwgY2FzZSAxNiBieXRlcyB3ZSBkb24ndCBjb25zaWRlciBmbG9hdHMuCisKKwkvKiBPSywgZnJ1c3RyYXRpbmdseSwgdGhlIHByb2Nlc3Mgb2Ygc2F2aW5nIHRoZSBzdHJ1Y3QgdG8gbWVtIG1pZ2h0IGhhdmUKKwkgICBtZXNzZWQgd2l0aCB0aGUgRlBScywgc28gd2UgaGF2ZSB0byByZS1sb2FkIHRoZW0gOiguCisJICAgV2VgbGwgdXNlIG91ciBGUFJzIHNwYWNlIGFnYWluIC0gY2FsbGluZzogCisJICAgdm9pZCBkYXJ3aW42NF9wYXNzX3N0cnVjdF9mbG9hdHMgKGZmaV90eXBlICpzLCBjaGFyICpzcmMsIAorCQkJCQkgICAgIHVuc2lnbmVkICpuZnByLCBkb3VibGUgKipmcHJzKSAKKwkgICBXZWBsbCB0ZW1wb3JhcmlseSBwaW5jaCB0aGUgZmlyc3QgdHdvIHNsb3RzIG9mIHRoZSBwYXJhbSBhcmVhIGZvciBsb2NhbAorCSAgIHZhcnMgdXNlZCBieSB0aGUgcm91dGluZS4gICovCisJeG9yCXI2LHI2LHI2CisJYWRkaQlyNSxyMSxQQVJFTlRfUEFSTV9CQVNFCQk7IHNvbWUgc3BhY2UKKwlzZwlyNiwwKHI1KQkJCTsgKm5mcHIgemVyb2VkLgorCWFkZGkJcjYscjUsOAkJCQk7ICoqZnBycworCWFkZGkJcjMscjEsRlBfU0FWRV9CQVNFCQk7IHBvaW50ZXIgdG8gRlBScyBzcGFjZQorCXNnCXIzLDAocjYpCisJbXIJcjQscjExCQkJCTsgdGhlIHN0cnVjdCBpcyBoZXJlLi4uCisJbGcJcjMsTElOS0FHRV9TSVpFKHIxKQkJOyBmZmlfdHlwZSAqIHJlc3VsdF90eXBlLgorCWJsCVBBU1NfU1RSX0ZMT0FUUwkJCTsgZ2V0IHN0cnVjdCBmbG9hdHMgaW50byBGUFIgc2F2ZSBzcGFjZS4KKwkvKiBTZWUgaWYgd2UgdXNlZCBhbnkgZmxvYXRzICAqLworCWx3eglyMCwoU0FWRV9TSVpFLVJFU1VMVF9CWVRFUykocjEpCQorCWNtcGkJMCxyMCwwCisJYmVxCUxzdHJ1Y3RpbnRzCQkJOyBub3BlLgorCS8qIE9LIGxvYWQgYGVtIHVwLi4uICovCisJbGZkCWYxLCAoRlBfU0FWRV9CQVNFICAgICAgICAgICAgICAgICApKHIxKQorCWxmZAlmMiwgKEZQX1NBVkVfQkFTRSArICBGUFJfU0laRSAgICAgKShyMSkKKwlsZmQJZjMsIChGUF9TQVZFX0JBU0UgKyAgRlBSX1NJWkUgKiAyICkocjEpCisJbGZkCWY0LCAoRlBfU0FWRV9CQVNFICsgIEZQUl9TSVpFICogMyApKHIxKQorCWxmZAlmNSwgKEZQX1NBVkVfQkFTRSArICBGUFJfU0laRSAqIDQgKShyMSkKKwlsZmQJZjYsIChGUF9TQVZFX0JBU0UgKyAgRlBSX1NJWkUgKiA1ICkocjEpCisJbGZkCWY3LCAoRlBfU0FWRV9CQVNFICsgIEZQUl9TSVpFICogNiApKHIxKQorCWxmZAlmOCwgKEZQX1NBVkVfQkFTRSArICBGUFJfU0laRSAqIDcgKShyMSkKKwlsZmQJZjksIChGUF9TQVZFX0JBU0UgKyAgRlBSX1NJWkUgKiA4ICkocjEpCisJbGZkCWYxMCwoRlBfU0FWRV9CQVNFICsgIEZQUl9TSVpFICogOSApKHIxKQorCWxmZAlmMTEsKEZQX1NBVkVfQkFTRSArICBGUFJfU0laRSAqIDEwKShyMSkKKwlsZmQJZjEyLChGUF9TQVZFX0JBU0UgKyAgRlBSX1NJWkUgKiAxMSkocjEpCisJbGZkCWYxMywoRlBfU0FWRV9CQVNFICsgIEZQUl9TSVpFICogMTIpKHIxKQorCisJLyogcG9pbnQgYmFjayBhdCBvdXIgc2F2ZWQgc3RydWN0LiAgKi8KK0xzdHJ1Y3RpbnRzOgorCWFkZGkJcjExLHIxLChTQVZFX1NJWkUtUkVTVUxUX0JZVEVTKQorCWxnCXIzLDAocjExKQkJCTsgd2UgZW5kIHVwIHBpY2tpbmcgdGhlCisJbGcJcjQsOChyMTEpCQkJOyBmaXJzdCB0d28gYWdhaW4uCisJbGcJcjUsMTYocjExKQorCWxnCXI2LDI0KHIxMSkKKwlsZwlyNywzMihyMTEpCisJbGcJcjgsNDAocjExKQorCWxnCXI5LDQ4KHIxMSkKKwlsZwlyMTAsNTYocjExKQorI2VuZGlmCiAKIC8qIGNhc2UgZG9uZSAgKi8KIExmaW5pc2g6Ci0JYWRkaQlyMSxyMSwxNzYJLyogUmVzdG9yZSBzdGFjayBwb2ludGVyLiAgKi8KLQlsd3oJcjAsOChyMSkJLyogR2V0IHJldHVybiBhZGRyZXNzLiAgKi8KLQltdGxyCXIwCQkvKiBSZXNldCBsaW5rIHJlZ2lzdGVyLiAgKi8KKwlhZGRpCXIxLHIxLFNBVkVfU0laRQkJLyogUmVzdG9yZSBzdGFjayBwb2ludGVyLiAgKi8KKwlsZwlyMCxTQVZFRF9MUl9PRkZTRVQocjEpCS8qIEdldCByZXR1cm4gYWRkcmVzcy4gICovCisJbXRscglyMAkJCS8qIFJlc2V0IGxpbmsgcmVnaXN0ZXIuICAqLwogCWJscgotCitMZW5kY29kZToKKwkuYWxpZ24gMQorCQogLyogRU5EKGZmaV9jbG9zdXJlX0FTTSkgICovCiAKLS5kYXRhCi0uc2VjdGlvbiBfX1RFWFQsX19laF9mcmFtZSxjb2FsZXNjZWQsbm9fdG9jK3N0cmlwX3N0YXRpY19zeW1zK2xpdmVfc3VwcG9ydAorLyogRUggZnJhbWUgc3R1ZmYuICAqLworI2RlZmluZSBFSF9EQVRBX0FMSUdOX0ZBQ1QgTU9ERV9DSE9JQ0UoMHg3YywweDc4KQorLyogMTc2LCA0MDAgKi8KKyNkZWZpbmUgRUhfRlJBTUVfT0ZGU0VUQSBNT0RFX0NIT0lDRSgxNzYsMHg5MCkKKyNkZWZpbmUgRUhfRlJBTUVfT0ZGU0VUQiBNT0RFX0NIT0lDRSgxLDMpCisKKwkuc3RhdGljX2RhdGEKKwkuYWxpZ24gTE9HMl9HUFJfQllURVMKK0xMRkIxJG5vbl9sYXp5X3B0cjoKKwkuZ19sb25nIExzdGFydGNvZGUKKworCS5zZWN0aW9uIF9fVEVYVCxfX2VoX2ZyYW1lLGNvYWxlc2NlZCxub190b2Mrc3RyaXBfc3RhdGljX3N5bXMrbGl2ZV9zdXBwb3J0CiBFSF9mcmFtZTE6CiAJLnNldAlMJHNldCQwLExFQ0lFMS1MU0NJRTEKIAkubG9uZwlMJHNldCQwCTsgTGVuZ3RoIG9mIENvbW1vbiBJbmZvcm1hdGlvbiBFbnRyeQpAQCAtMjU1LDE2ICs0ODEsMTYgQEAKIAkuYnl0ZQkweDEJOyBDSUUgVmVyc2lvbgogCS5hc2NpaQkielJcMCIJOyBDSUUgQXVnbWVudGF0aW9uCiAJLmJ5dGUJMHgxCTsgdWxlYjEyOCAweDE7IENJRSBDb2RlIEFsaWdubWVudCBGYWN0b3IKLQkuYnl0ZQkweDdjCTsgc2xlYjEyOCAtNDsgQ0lFIERhdGEgQWxpZ25tZW50IEZhY3RvcgorCS5ieXRlCUVIX0RBVEFfQUxJR05fRkFDVCA7IHNsZWIxMjggLTQ7IENJRSBEYXRhIEFsaWdubWVudCBGYWN0b3IKIAkuYnl0ZQkweDQxCTsgQ0lFIFJBIENvbHVtbgogCS5ieXRlCTB4MQk7IHVsZWIxMjggMHgxOyBBdWdtZW50YXRpb24gc2l6ZQotCS5ieXRlCTB4OTAJOyBGREUgRW5jb2RpbmcgKGluZGlyZWN0IHBjcmVsKQorCS5ieXRlCTB4MTAJOyBGREUgRW5jb2RpbmcgKGluZGlyZWN0IHBjcmVsKQogCS5ieXRlCTB4Ywk7IERXX0NGQV9kZWZfY2ZhCiAJLmJ5dGUJMHgxCTsgdWxlYjEyOCAweDEKIAkuYnl0ZQkweDAJOyB1bGViMTI4IDB4MAogCS5hbGlnbglMT0cyX0dQUl9CWVRFUwogTEVDSUUxOgotLmdsb2JsIF9mZmlfY2xvc3VyZV9BU00uZWgKKwkuZ2xvYmwgX2ZmaV9jbG9zdXJlX0FTTS5laAogX2ZmaV9jbG9zdXJlX0FTTS5laDoKIExTRkRFMToKIAkuc2V0CUwkc2V0JDEsTEVGREUxLUxBU0ZERTEKQEAgLTI3Myw0NSArNDk5LDc4IEBACiBMQVNGREUxOgogCS5sb25nCUxBU0ZERTEtRUhfZnJhbWUxCTsgRkRFIENJRSBvZmZzZXQKIAkuZ19sb25nCUxMRkIxJG5vbl9sYXp5X3B0ci0uCTsgRkRFIGluaXRpYWwgbG9jYXRpb24KLQkuc2V0CUwkc2V0JDMsTEZFMS1MRkIxCisJLnNldAlMJHNldCQzLExGRTEtTHN0YXJ0Y29kZQogCS5nX2xvbmcJTCRzZXQkMwk7IEZERSBhZGRyZXNzIHJhbmdlCiAJLmJ5dGUgICAweDAgICAgIDsgdWxlYjEyOCAweDA7IEF1Z21lbnRhdGlvbiBzaXplCiAJLmJ5dGUJMHg0CTsgRFdfQ0ZBX2FkdmFuY2VfbG9jNAogCS5zZXQJTCRzZXQkMyxMQ0ZJMS1MQ0ZJMAogCS5sb25nCUwkc2V0JDMKIAkuYnl0ZQkweGUJOyBEV19DRkFfZGVmX2NmYV9vZmZzZXQKLQkuYnl0ZQkxNzYsMQk7IHVsZWIxMjggMTc2CisJLmJ5dGUJRUhfRlJBTUVfT0ZGU0VUQSxFSF9GUkFNRV9PRkZTRVRCCTsgdWxlYjEyOCAxNzYsMS8xOTAsMwogCS5ieXRlCTB4NAk7IERXX0NGQV9hZHZhbmNlX2xvYzQKLQkuc2V0CUwkc2V0JDQsTENGSTAtTEZCMQorCS5zZXQJTCRzZXQkNCxMQ0ZJMC1Mc3RhcnRjb2RlCiAJLmxvbmcJTCRzZXQkNAogCS5ieXRlICAgMHgxMSAgICA7IERXX0NGQV9vZmZzZXRfZXh0ZW5kZWRfc2YKIAkuYnl0ZQkweDQxCTsgdWxlYjEyOCAweDQxCiAJLmJ5dGUgICAweDdlICAgIDsgc2xlYjEyOCAtMgogCS5hbGlnbglMT0cyX0dQUl9CWVRFUwogTEVGREUxOgotLmRhdGEKLQkuYWxpZ24JTE9HMl9HUFJfQllURVMKLUxERkNNMDoKLS5zZWN0aW9uIF9fVEVYVCxfX3BpY3N5bWJvbHN0dWIxLHN5bWJvbF9zdHVicyxwdXJlX2luc3RydWN0aW9ucywzMgotCS5hbGlnbglMT0cyX0dQUl9CWVRFUwotTGZmaV9jbG9zdXJlX2hlbHBlcl9EQVJXSU4kc3R1YjoKLSNpZiAxCisJLmFsaWduIAkxCisKKyNpZmRlZiBXQU5UX1NUVUIKKwkuc2VjdGlvbiBfX1RFWFQsX19waWNzeW1ib2xzdHViMSxzeW1ib2xfc3R1YnMscHVyZV9pbnN0cnVjdGlvbnMsMzIKKwkuYWxpZ24gNQorTF9mZmlfY2xvc3VyZV9oZWxwZXJfREFSV0lOJHN0dWI6CiAJLmluZGlyZWN0X3N5bWJvbCBfZmZpX2Nsb3N1cmVfaGVscGVyX0RBUldJTgotCW1mbHIJcjAKLQliY2wJMjAsMzEsTE8kZmZpX2Nsb3N1cmVfaGVscGVyX0RBUldJTgotTE8kZmZpX2Nsb3N1cmVfaGVscGVyX0RBUldJTjoKLQltZmxyCXIxMQotCWFkZGlzCXIxMSxyMTEsaGExNihMX2ZmaV9jbG9zdXJlX2hlbHBlcl9EQVJXSU4kbGF6eV9wdHIgLSBMTyRmZmlfY2xvc3VyZV9oZWxwZXJfREFSV0lOKQotCW10bHIJcjAKLQlsZ3UJcjEyLGxvMTYoTF9mZmlfY2xvc3VyZV9oZWxwZXJfREFSV0lOJGxhenlfcHRyIC0gTE8kZmZpX2Nsb3N1cmVfaGVscGVyX0RBUldJTikocjExKQotCW10Y3RyCXIxMgorCW1mbHIgcjAKKwliY2wgMjAsMzEsIkwwMDAwMDAwMDAwMSRzcGIiCisiTDAwMDAwMDAwMDAxJHNwYiI6CisJbWZsciByMTEKKwlhZGRpcyByMTEscjExLGhhMTYoTF9mZmlfY2xvc3VyZV9oZWxwZXJfREFSV0lOJGxhenlfcHRyLSJMMDAwMDAwMDAwMDEkc3BiIikKKwltdGxyIHIwCisJbHd6dSByMTIsbG8xNihMX2ZmaV9jbG9zdXJlX2hlbHBlcl9EQVJXSU4kbGF6eV9wdHItIkwwMDAwMDAwMDAwMSRzcGIiKShyMTEpCisJbXRjdHIgcjEyCiAJYmN0cgotLmxhenlfc3ltYm9sX3BvaW50ZXIKKwkubGF6eV9zeW1ib2xfcG9pbnRlcgogTF9mZmlfY2xvc3VyZV9oZWxwZXJfREFSV0lOJGxhenlfcHRyOgogCS5pbmRpcmVjdF9zeW1ib2wgX2ZmaV9jbG9zdXJlX2hlbHBlcl9EQVJXSU4KLQkuZ19sb25nIGR5bGRfc3R1Yl9iaW5kaW5nX2hlbHBlcgorCS5nX2xvbmcJZHlsZF9zdHViX2JpbmRpbmdfaGVscGVyCisKKyNpZiBkZWZpbmVkKF9fcHBjNjRfXykKKwkuc2VjdGlvbiBfX1RFWFQsX19waWNzeW1ib2xzdHViMSxzeW1ib2xfc3R1YnMscHVyZV9pbnN0cnVjdGlvbnMsMzIKKwkuYWxpZ24gNQorTF9kYXJ3aW42NF9zdHJ1Y3RfcmV0X2J5X3ZhbHVlX3Akc3R1YjoKKwkuaW5kaXJlY3Rfc3ltYm9sIF9kYXJ3aW42NF9zdHJ1Y3RfcmV0X2J5X3ZhbHVlX3AKKwltZmxyIHIwCisJYmNsIDIwLDMxLCJMMDAwMDAwMDAwMDIkc3BiIgorIkwwMDAwMDAwMDAwMiRzcGIiOgorCW1mbHIgcjExCisJYWRkaXMgcjExLHIxMSxoYTE2KExfZGFyd2luNjRfc3RydWN0X3JldF9ieV92YWx1ZV9wJGxhenlfcHRyLSJMMDAwMDAwMDAwMDIkc3BiIikKKwltdGxyIHIwCisJbHd6dSByMTIsbG8xNihMX2RhcndpbjY0X3N0cnVjdF9yZXRfYnlfdmFsdWVfcCRsYXp5X3B0ci0iTDAwMDAwMDAwMDAyJHNwYiIpKHIxMSkKKwltdGN0ciByMTIKKwliY3RyCisJLmxhenlfc3ltYm9sX3BvaW50ZXIKK0xfZGFyd2luNjRfc3RydWN0X3JldF9ieV92YWx1ZV9wJGxhenlfcHRyOgorCS5pbmRpcmVjdF9zeW1ib2wgX2RhcndpbjY0X3N0cnVjdF9yZXRfYnlfdmFsdWVfcAorCS5nX2xvbmcJZHlsZF9zdHViX2JpbmRpbmdfaGVscGVyCisKKwkuc2VjdGlvbiBfX1RFWFQsX19waWNzeW1ib2xzdHViMSxzeW1ib2xfc3R1YnMscHVyZV9pbnN0cnVjdGlvbnMsMzIKKwkuYWxpZ24gNQorTF9kYXJ3aW42NF9wYXNzX3N0cnVjdF9mbG9hdHMkc3R1YjoKKwkuaW5kaXJlY3Rfc3ltYm9sIF9kYXJ3aW42NF9wYXNzX3N0cnVjdF9mbG9hdHMKKwltZmxyIHIwCisJYmNsIDIwLDMxLCJMMDAwMDAwMDAwMDMkc3BiIgorIkwwMDAwMDAwMDAwMyRzcGIiOgorCW1mbHIgcjExCisJYWRkaXMgcjExLHIxMSxoYTE2KExfZGFyd2luNjRfcGFzc19zdHJ1Y3RfZmxvYXRzJGxhenlfcHRyLSJMMDAwMDAwMDAwMDMkc3BiIikKKwltdGxyIHIwCisJbHd6dSByMTIsbG8xNihMX2RhcndpbjY0X3Bhc3Nfc3RydWN0X2Zsb2F0cyRsYXp5X3B0ci0iTDAwMDAwMDAwMDAzJHNwYiIpKHIxMSkKKwltdGN0ciByMTIKKwliY3RyCisJLmxhenlfc3ltYm9sX3BvaW50ZXIKK0xfZGFyd2luNjRfcGFzc19zdHJ1Y3RfZmxvYXRzJGxhenlfcHRyOgorCS5pbmRpcmVjdF9zeW1ib2wgX2RhcndpbjY0X3Bhc3Nfc3RydWN0X2Zsb2F0cworCS5nX2xvbmcJZHlsZF9zdHViX2JpbmRpbmdfaGVscGVyCisjICBlbmRpZgogI2VuZGlmCi0uZGF0YQotCS5hbGlnbiBMT0cyX0dQUl9CWVRFUwotTExGQjEkbm9uX2xhenlfcHRyOgotCS5nX2xvbmcgTEZCMQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcG93ZXJwYy9mZmkuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvZmZpLmMKaW5kZXggNzU3ODRhOS4uNTRmMjczMSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcG93ZXJwYy9mZmkuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2ZmaS5jCkBAIC0xLDcgKzEsOSBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIGZmaS5jIC0gQ29weXJpZ2h0IChjKSAxOTk4IEdlb2ZmcmV5IEtlYXRpbmcKLSAgIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYwotICAgQ29weXJpZ2h0IChDKSAyMDA4IFJlZCBIYXQsIEluYworICAgZmZpLmMgLSBDb3B5cmlnaHQgKEMpIDIwMTEgQW50aG9ueSBHcmVlbgorICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMTEgS3lsZSBNb2ZmZXR0CisgICAgICAgICAgIENvcHlyaWdodCAoQykgMjAwOCBSZWQgSGF0LCBJbmMKKyAgICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jCisJICAgQ29weXJpZ2h0IChjKSAxOTk4IEdlb2ZmcmV5IEtlYXRpbmcKIAogICAgUG93ZXJQQyBGb3JlaWduIEZ1bmN0aW9uIEludGVyZmFjZQogCkBAIC0zOSwzMiArNDEsMzMgQEAKICAgLyogVGhlIGFzc2VtYmx5IGRlcGVuZHMgb24gdGhlc2UgZXhhY3QgZmxhZ3MuICAqLwogICBGTEFHX1JFVFVSTlNfU01TVAk9IDEgPDwgKDMxLTMxKSwgLyogVXNlZCBmb3IgRkZJX1NZU1Ygc21hbGwgc3RydWN0cy4gICovCiAgIEZMQUdfUkVUVVJOU19OT1RISU5HICA9IDEgPDwgKDMxLTMwKSwgLyogVGhlc2UgZ28gaW4gY3I3ICovCisjaWZuZGVmIF9fTk9fRlBSU19fCiAgIEZMQUdfUkVUVVJOU19GUCAgICAgICA9IDEgPDwgKDMxLTI5KSwKKyNlbmRpZgogICBGTEFHX1JFVFVSTlNfNjRCSVRTICAgPSAxIDw8ICgzMS0yOCksCiAKICAgRkxBR19SRVRVUk5TXzEyOEJJVFMgID0gMSA8PCAoMzEtMjcpLCAvKiBjcjYgICovCisKICAgRkxBR19TWVNWX1NNU1RfUjQgICAgID0gMSA8PCAoMzEtMjYpLCAvKiB1c2UgcjQgZm9yIEZGSV9TWVNWIDggYnl0ZQogCQkJCQkgICBzdHJ1Y3RzLiAgKi8KICAgRkxBR19TWVNWX1NNU1RfUjMgICAgID0gMSA8PCAoMzEtMjUpLCAvKiB1c2UgcjMgZm9yIEZGSV9TWVNWIDQgYnl0ZQogCQkJCQkgICBzdHJ1Y3RzLiAgKi8KLSAgLyogQml0cyAoMzEtMjQpIHRocm91Z2ggKDMxLTE5KSBzdG9yZSBzaGlmdCB2YWx1ZSBmb3IgU01TVCAqLwogCiAgIEZMQUdfQVJHX05FRURTX0NPUFkgICA9IDEgPDwgKDMxLSA3KSwKKyNpZm5kZWYgX19OT19GUFJTX18KICAgRkxBR19GUF9BUkdVTUVOVFMgICAgID0gMSA8PCAoMzEtIDYpLCAvKiBjcjEuZXE7IHNwZWNpZmllZCBieSBBQkkgKi8KKyNlbmRpZgogICBGTEFHXzRfR1BSX0FSR1VNRU5UUyAgPSAxIDw8ICgzMS0gNSksCiAgIEZMQUdfUkVUVkFMX1JFRkVSRU5DRSA9IDEgPDwgKDMxLSA0KQogfTsKIAogLyogQWJvdXQgdGhlIFNZU1YgQUJJLiAgKi8KLXVuc2lnbmVkIGludCBOVU1fR1BSX0FSR19SRUdJU1RFUlMgPSA4OworI2RlZmluZSBBU01fTkVFRFNfUkVHSVNURVJTIDQKKyNkZWZpbmUgTlVNX0dQUl9BUkdfUkVHSVNURVJTIDgKICNpZm5kZWYgX19OT19GUFJTX18KLXVuc2lnbmVkIGludCBOVU1fRlBSX0FSR19SRUdJU1RFUlMgPSA4OwotI2Vsc2UKLXVuc2lnbmVkIGludCBOVU1fRlBSX0FSR19SRUdJU1RFUlMgPSAwOworIyBkZWZpbmUgTlVNX0ZQUl9BUkdfUkVHSVNURVJTIDgKICNlbmRpZgogCi1lbnVtIHsgQVNNX05FRURTX1JFR0lTVEVSUyA9IDQgfTsKLQogLyogZmZpX3ByZXBfYXJnc19TWVNWIGlzIGNhbGxlZCBieSB0aGUgYXNzZW1ibHkgcm91dGluZSBvbmNlIHN0YWNrIHNwYWNlCiAgICBoYXMgYmVlbiBhbGxvY2F0ZWQgZm9yIHRoZSBmdW5jdGlvbidzIGFyZ3VtZW50cy4KIApAQCAtMTEzLDEwICsxMTYsMTIgQEAKICAgdmFscCBncHJfYmFzZTsKICAgaW50IGludGFyZ19jb3VudDsKIAorI2lmbmRlZiBfX05PX0ZQUlNfXwogICAvKiAnZnByX2Jhc2UnIHBvaW50cyBhdCB0aGUgc3BhY2UgZm9yIGZwcjEsIGFuZCBncm93cyB1cHdhcmRzIGFzCiAgICAgIHdlIHVzZSBGUFIgcmVnaXN0ZXJzLiAgKi8KICAgdmFscCBmcHJfYmFzZTsKICAgaW50IGZwYXJnX2NvdW50OworI2VuZGlmCiAKICAgLyogJ2NvcHlfc3BhY2UnIGdyb3dzIGRvd24gYXMgd2UgcHV0IHN0cnVjdHVyZXMgaW4gaXQuICBJdCBzaG91bGQKICAgICAgc3RheSAxNi1ieXRlIGFsaWduZWQuICAqLwpAQCAtMTI1LDkgKzEzMCw4IEBACiAgIC8qICduZXh0X2FyZycgZ3Jvd3MgdXAgYXMgd2UgcHV0IHBhcmFtZXRlcnMgaW4gaXQuICAqLwogICB2YWxwIG5leHRfYXJnOwogCi0gIGludCBpLCBpaSBNQVlCRV9VTlVTRUQ7CisgIGludCBpOwogICBmZmlfdHlwZSAqKnB0cjsKLSAgZG91YmxlIGRvdWJsZV90bXA7CiAgIHVuaW9uIHsKICAgICB2b2lkICoqdjsKICAgICBjaGFyICoqYzsKQEAgLTE0MywyMSArMTQ3LDIzIEBACiAgIHNpemVfdCBzdHJ1Y3RfY29weV9zaXplOwogICB1bnNpZ25lZCBncHJ2YWx1ZTsKIAotICBpZiAoZWNpZi0+Y2lmLT5hYmkgPT0gRkZJX0xJTlVYX1NPRlRfRkxPQVQpCi0gICAgTlVNX0ZQUl9BUkdfUkVHSVNURVJTID0gMDsKLQogICBzdGFja3RvcC5jID0gKGNoYXIgKikgc3RhY2sgKyBieXRlczsKICAgZ3ByX2Jhc2UudSA9IHN0YWNrdG9wLnUgLSBBU01fTkVFRFNfUkVHSVNURVJTIC0gTlVNX0dQUl9BUkdfUkVHSVNURVJTOwogICBpbnRhcmdfY291bnQgPSAwOworI2lmbmRlZiBfX05PX0ZQUlNfXworICBkb3VibGUgZG91YmxlX3RtcDsKICAgZnByX2Jhc2UuZCA9IGdwcl9iYXNlLmQgLSBOVU1fRlBSX0FSR19SRUdJU1RFUlM7CiAgIGZwYXJnX2NvdW50ID0gMDsKICAgY29weV9zcGFjZS5jID0gKChmbGFncyAmIEZMQUdfRlBfQVJHVU1FTlRTKSA/IGZwcl9iYXNlLmMgOiBncHJfYmFzZS5jKTsKKyNlbHNlCisgIGNvcHlfc3BhY2UuYyA9IGdwcl9iYXNlLmM7CisjZW5kaWYKICAgbmV4dF9hcmcudSA9IHN0YWNrICsgMjsKIAogICAvKiBDaGVjayB0aGF0IGV2ZXJ5dGhpbmcgc3RhcnRzIGFsaWduZWQgcHJvcGVybHkuICAqLwotICBGRklfQVNTRVJUICgoKHVuc2lnbmVkKSAoY2hhciAqKSBzdGFjayAmIDB4RikgPT0gMCk7Ci0gIEZGSV9BU1NFUlQgKCgodW5zaWduZWQpIGNvcHlfc3BhY2UuYyAmIDB4RikgPT0gMCk7Ci0gIEZGSV9BU1NFUlQgKCgodW5zaWduZWQpIHN0YWNrdG9wLmMgJiAweEYpID09IDApOworICBGRklfQVNTRVJUICgoKHVuc2lnbmVkIGxvbmcpIChjaGFyICopIHN0YWNrICYgMHhGKSA9PSAwKTsKKyAgRkZJX0FTU0VSVCAoKCh1bnNpZ25lZCBsb25nKSBjb3B5X3NwYWNlLmMgJiAweEYpID09IDApOworICBGRklfQVNTRVJUICgoKHVuc2lnbmVkIGxvbmcpIHN0YWNrdG9wLmMgJiAweEYpID09IDApOwogICBGRklfQVNTRVJUICgoYnl0ZXMgJiAweEYpID09IDApOwogICBGRklfQVNTRVJUIChjb3B5X3NwYWNlLmMgPj0gbmV4dF9hcmcuYyk7CiAKQEAgLTE3NCwxMiArMTgwLDI4IEBACiAgICAgICAgaSA+IDA7CiAgICAgICAgaS0tLCBwdHIrKywgcF9hcmd2LnYrKykKICAgICB7Ci0gICAgICBzd2l0Y2ggKCgqcHRyKS0+dHlwZSkKLQl7CisgICAgICB1bnNpZ25lZCBzaG9ydCB0eXBlbnVtID0gKCpwdHIpLT50eXBlOworCisgICAgICAvKiBXZSBtYXkgbmVlZCB0byBoYW5kbGUgc29tZSB2YWx1ZXMgZGVwZW5kaW5nIG9uIEFCSSAqLworICAgICAgaWYgKGVjaWYtPmNpZi0+YWJpID09IEZGSV9MSU5VWF9TT0ZUX0ZMT0FUKSB7CisJCWlmICh0eXBlbnVtID09IEZGSV9UWVBFX0ZMT0FUKQorCQkJdHlwZW51bSA9IEZGSV9UWVBFX1VJTlQzMjsKKwkJaWYgKHR5cGVudW0gPT0gRkZJX1RZUEVfRE9VQkxFKQorCQkJdHlwZW51bSA9IEZGSV9UWVBFX1VJTlQ2NDsKKwkJaWYgKHR5cGVudW0gPT0gRkZJX1RZUEVfTE9OR0RPVUJMRSkKKwkJCXR5cGVudW0gPSBGRklfVFlQRV9VSU5UMTI4OworICAgICAgfSBlbHNlIGlmIChlY2lmLT5jaWYtPmFiaSAhPSBGRklfTElOVVgpIHsKKyNpZiBGRklfVFlQRV9MT05HRE9VQkxFICE9IEZGSV9UWVBFX0RPVUJMRQorCQlpZiAodHlwZW51bSA9PSBGRklfVFlQRV9MT05HRE9VQkxFKQorCQkJdHlwZW51bSA9IEZGSV9UWVBFX1NUUlVDVDsKKyNlbmRpZgorICAgICAgfQorCisgICAgICAvKiBOb3cgdGVzdCB0aGUgdHJhbnNsYXRlZCB2YWx1ZSAqLworICAgICAgc3dpdGNoICh0eXBlbnVtKSB7CisjaWZuZGVmIF9fTk9fRlBSU19fCiAJY2FzZSBGRklfVFlQRV9GTE9BVDoKIAkgIC8qIFdpdGggRkZJX0xJTlVYX1NPRlRfRkxPQVQgZmxvYXRzIGFyZSBoYW5kbGVkIGxpa2UgVUlOVDMyLiAgKi8KLQkgIGlmIChlY2lmLT5jaWYtPmFiaSA9PSBGRklfTElOVVhfU09GVF9GTE9BVCkKLQkgICAgZ290byBzb2Z0X2Zsb2F0X3ByZXA7CiAJICBkb3VibGVfdG1wID0gKipwX2FyZ3YuZjsKIAkgIGlmIChmcGFyZ19jb3VudCA+PSBOVU1fRlBSX0FSR19SRUdJU1RFUlMpCiAJICAgIHsKQEAgLTE5NSw4ICsyMTcsNiBAQAogCiAJY2FzZSBGRklfVFlQRV9ET1VCTEU6CiAJICAvKiBXaXRoIEZGSV9MSU5VWF9TT0ZUX0ZMT0FUIGRvdWJsZXMgYXJlIGhhbmRsZWQgbGlrZSBVSU5UNjQuICAqLwotCSAgaWYgKGVjaWYtPmNpZi0+YWJpID09IEZGSV9MSU5VWF9TT0ZUX0ZMT0FUKQotCSAgICBnb3RvIHNvZnRfZG91YmxlX3ByZXA7CiAJICBkb3VibGVfdG1wID0gKipwX2FyZ3YuZDsKIAogCSAgaWYgKGZwYXJnX2NvdW50ID49IE5VTV9GUFJfQVJHX1JFR0lTVEVSUykKQEAgLTIxOCw0MyArMjM4LDYgQEAKIAogI2lmIEZGSV9UWVBFX0xPTkdET1VCTEUgIT0gRkZJX1RZUEVfRE9VQkxFCiAJY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFOgotCSAgaWYgKChlY2lmLT5jaWYtPmFiaSAhPSBGRklfTElOVVgpCi0JCSYmIChlY2lmLT5jaWYtPmFiaSAhPSBGRklfTElOVVhfU09GVF9GTE9BVCkpCi0JICAgIGdvdG8gZG9fc3RydWN0OwotCSAgLyogVGhlIHNvZnQgZmxvYXQgQUJJIGZvciBsb25nIGRvdWJsZXMgd29ya3MgbGlrZSB0aGlzLAotCSAgICAgYSBsb25nIGRvdWJsZSBpcyBwYXNzZWQgaW4gZm91ciBjb25zZWN1dGl2ZSBncHJzIGlmIGF2YWlsYWJsZS4KLQkgICAgIEEgbWF4aW11bSBvZiAyIGxvbmcgZG91YmxlcyBjYW4gYmUgcGFzc2VkIGluIGdwcnMuCi0JICAgICBJZiB3ZSBkbyBub3QgaGF2ZSA0IGdwcnMgbGVmdCwgdGhlIGxvbmcgZG91YmxlIGlzIHBhc3NlZCBvbiB0aGUKLQkgICAgIHN0YWNrLCA0LWJ5dGUgYWxpZ25lZC4gICovCi0JICBpZiAoZWNpZi0+Y2lmLT5hYmkgPT0gRkZJX0xJTlVYX1NPRlRfRkxPQVQpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgaW50X3RtcCA9ICgqcF9hcmd2LnVpKVswXTsKLQkgICAgICBpZiAoaW50YXJnX2NvdW50ID49IE5VTV9HUFJfQVJHX1JFR0lTVEVSUyAtIDMpCi0JCXsKLQkJICBpZiAoaW50YXJnX2NvdW50IDwgTlVNX0dQUl9BUkdfUkVHSVNURVJTKQotCQkgICAgaW50YXJnX2NvdW50ICs9IE5VTV9HUFJfQVJHX1JFR0lTVEVSUyAtIGludGFyZ19jb3VudDsKLQkJICAqbmV4dF9hcmcudSA9IGludF90bXA7Ci0JCSAgbmV4dF9hcmcudSsrOwotCQkgIGZvciAoaWkgPSAxOyBpaSA8IDQ7IGlpKyspCi0JCSAgICB7Ci0JCSAgICAgIGludF90bXAgPSAoKnBfYXJndi51aSlbaWldOwotCQkgICAgICAqbmV4dF9hcmcudSA9IGludF90bXA7Ci0JCSAgICAgIG5leHRfYXJnLnUrKzsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgICpncHJfYmFzZS51KysgPSBpbnRfdG1wOwotCQkgIGZvciAoaWkgPSAxOyBpaSA8IDQ7IGlpKyspCi0JCSAgICB7Ci0JCSAgICAgIGludF90bXAgPSAoKnBfYXJndi51aSlbaWldOwotCQkgICAgICAqZ3ByX2Jhc2UudSsrID0gaW50X3RtcDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGludGFyZ19jb3VudCArPTQ7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewogCSAgICAgIGRvdWJsZV90bXAgPSAoKnBfYXJndi5kKVswXTsKIAogCSAgICAgIGlmIChmcGFyZ19jb3VudCA+PSBOVU1fRlBSX0FSR19SRUdJU1RFUlMgLSAxKQpAQCAtMjgwLDEzICsyNjMsNDAgQEAKIAogCSAgICAgIGZwYXJnX2NvdW50ICs9IDI7CiAJICAgICAgRkZJX0FTU0VSVCAoZmxhZ3MgJiBGTEFHX0ZQX0FSR1VNRU5UUyk7Ci0JICAgIH0KIAkgIGJyZWFrOwogI2VuZGlmCisjZW5kaWYgLyogaGF2ZSBGUFJzICovCisKKwkvKgorCSAqIFRoZSBzb2Z0IGZsb2F0IEFCSSBmb3IgbG9uZyBkb3VibGVzIHdvcmtzIGxpa2UgdGhpcywgYSBsb25nIGRvdWJsZQorCSAqIGlzIHBhc3NlZCBpbiBmb3VyIGNvbnNlY3V0aXZlIEdQUnMgaWYgYXZhaWxhYmxlLiAgQSBtYXhpbXVtIG9mIDIKKwkgKiBsb25nIGRvdWJsZXMgY2FuIGJlIHBhc3NlZCBpbiBncHJzLiAgSWYgd2UgZG8gbm90IGhhdmUgNCBHUFJzCisJICogbGVmdCwgdGhlIGxvbmcgZG91YmxlIGlzIHBhc3NlZCBvbiB0aGUgc3RhY2ssIDQtYnl0ZSBhbGlnbmVkLgorCSAqLworCWNhc2UgRkZJX1RZUEVfVUlOVDEyODogeworCQl1bnNpZ25lZCBpbnQgaW50X3RtcCA9ICgqcF9hcmd2LnVpKVswXTsKKwkJdW5zaWduZWQgaW50IGlpOworCQlpZiAoaW50YXJnX2NvdW50ID49IE5VTV9HUFJfQVJHX1JFR0lTVEVSUyAtIDMpIHsKKwkJCWlmIChpbnRhcmdfY291bnQgPCBOVU1fR1BSX0FSR19SRUdJU1RFUlMpCisJCQkJaW50YXJnX2NvdW50ICs9IE5VTV9HUFJfQVJHX1JFR0lTVEVSUyAtIGludGFyZ19jb3VudDsKKwkJCSoobmV4dF9hcmcudSsrKSA9IGludF90bXA7CisJCQlmb3IgKGlpID0gMTsgaWkgPCA0OyBpaSsrKSB7CisJCQkJaW50X3RtcCA9ICgqcF9hcmd2LnVpKVtpaV07CisJCQkJKihuZXh0X2FyZy51KyspID0gaW50X3RtcDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCSooZ3ByX2Jhc2UudSsrKSA9IGludF90bXA7CisJCQlmb3IgKGlpID0gMTsgaWkgPCA0OyBpaSsrKSB7CisJCQkJaW50X3RtcCA9ICgqcF9hcmd2LnVpKVtpaV07CisJCQkJKihncHJfYmFzZS51KyspID0gaW50X3RtcDsKKwkJCX0KKwkJfQorCQlpbnRhcmdfY291bnQgKz0gNDsKKwkJYnJlYWs7CisJfQogCiAJY2FzZSBGRklfVFlQRV9VSU5UNjQ6CiAJY2FzZSBGRklfVFlQRV9TSU5UNjQ6Ci0Jc29mdF9kb3VibGVfcHJlcDoKIAkgIGlmIChpbnRhcmdfY291bnQgPT0gTlVNX0dQUl9BUkdfUkVHSVNURVJTLTEpCiAJICAgIGludGFyZ19jb3VudCsrOwogCSAgaWYgKGludGFyZ19jb3VudCA+PSBOVU1fR1BSX0FSR19SRUdJU1RFUlMpCkBAIC0zMTksOSArMzI5LDYgQEAKIAkgIGJyZWFrOwogCiAJY2FzZSBGRklfVFlQRV9TVFJVQ1Q6Ci0jaWYgRkZJX1RZUEVfTE9OR0RPVUJMRSAhPSBGRklfVFlQRV9ET1VCTEUKLQlkb19zdHJ1Y3Q6Ci0jZW5kaWYKIAkgIHN0cnVjdF9jb3B5X3NpemUgPSAoKCpwdHIpLT5zaXplICsgMTUpICYgfjB4RjsKIAkgIGNvcHlfc3BhY2UuYyAtPSBzdHJ1Y3RfY29weV9zaXplOwogCSAgbWVtY3B5IChjb3B5X3NwYWNlLmMsICpwX2FyZ3YuYywgKCpwdHIpLT5zaXplKTsKQEAgLTM0OSw3ICszNTYsNiBAQAogCWNhc2UgRkZJX1RZUEVfVUlOVDMyOgogCWNhc2UgRkZJX1RZUEVfU0lOVDMyOgogCWNhc2UgRkZJX1RZUEVfUE9JTlRFUjoKLQlzb2Z0X2Zsb2F0X3ByZXA6CiAKIAkgIGdwcnZhbHVlID0gKipwX2FyZ3YudWk7CiAKQEAgLTM2Niw4ICszNzIsMTYgQEAKICAgLyogQ2hlY2sgdGhhdCB3ZSBkaWRuJ3Qgb3ZlcnJ1biB0aGUgc3RhY2suLi4gICovCiAgIEZGSV9BU1NFUlQgKGNvcHlfc3BhY2UuYyA+PSBuZXh0X2FyZy5jKTsKICAgRkZJX0FTU0VSVCAoZ3ByX2Jhc2UudSA8PSBzdGFja3RvcC51IC0gQVNNX05FRURTX1JFR0lTVEVSUyk7CisgIC8qIFRoZSBhc3NlcnQgYmVsb3cgaXMgdGVzdGluZyB0aGF0IHRoZSBudW1iZXIgb2YgaW50ZWdlciBhcmd1bWVudHMgYWdyZWVzCisgICAgIHdpdGggdGhlIG51bWJlciBmb3VuZCBpbiBmZmlfcHJlcF9jaWZfbWFjaGRlcCgpLiAgSG93ZXZlciwgaW50YXJnX2NvdW50CisgICAgIGlzIGluY3JlbWVuZXRlZCB3aGVuZXZlciB3ZSBwbGFjZSBhbiBGUCBhcmcgb24gdGhlIHN0YWNrLCBzbyBhY2NvdW50IGZvcgorICAgICB0aGF0IGJlZm9yZSBvdXIgYXNzZXJ0IHRlc3QuICAqLworI2lmbmRlZiBfX05PX0ZQUlNfXworICBpZiAoZnBhcmdfY291bnQgPiBOVU1fRlBSX0FSR19SRUdJU1RFUlMpCisgICAgaW50YXJnX2NvdW50IC09IGZwYXJnX2NvdW50IC0gTlVNX0ZQUl9BUkdfUkVHSVNURVJTOwogICBGRklfQVNTRVJUIChmcHJfYmFzZS51CiAJICAgICAgPD0gc3RhY2t0b3AudSAtIEFTTV9ORUVEU19SRUdJU1RFUlMgLSBOVU1fR1BSX0FSR19SRUdJU1RFUlMpOworI2VuZGlmCiAgIEZGSV9BU1NFUlQgKGZsYWdzICYgRkxBR180X0dQUl9BUkdVTUVOVFMgfHwgaW50YXJnX2NvdW50IDw9IDQpOwogfQogCkBAIC02MDQsOSArNjE4LDYgQEAKICAgdW5zaWduZWQgdHlwZSA9IGNpZi0+cnR5cGUtPnR5cGU7CiAgIHVuc2lnbmVkIHNpemUgPSBjaWYtPnJ0eXBlLT5zaXplOwogCi0gIGlmIChjaWYtPmFiaSA9PSBGRklfTElOVVhfU09GVF9GTE9BVCkKLSAgICBOVU1fRlBSX0FSR19SRUdJU1RFUlMgPSAwOwotCiAgIGlmIChjaWYtPmFiaSAhPSBGRklfTElOVVg2NCkKICAgICB7CiAgICAgICAvKiBBbGwgdGhlIG1hY2hpbmUtaW5kZXBlbmRlbnQgY2FsY3VsYXRpb24gb2YgY2lmLT5ieXRlcyB3aWxsIGJlIHdyb25nLgpAQCAtNjQ2LDEzICs2NTcsMjYgQEAKICAgICAgLSBTaW5nbGUvZG91YmxlIEZQIHZhbHVlcyBpbiBmcHIxLCBsb25nIGRvdWJsZSBpbiBmcHIxLGZwcjIuCiAgICAgIC0gc29mdC1mbG9hdCBmbG9hdC9kb3VibGVzIGFyZSB0cmVhdGVkIGFzIFVJTlQzMi9VSU5UNjQgcmVzcGVjdGl2bGV5LgogICAgICAtIHNvZnQtZmxvYXQgbG9uZyBkb3VibGVzIGFyZSByZXR1cm5lZCBpbiBncHIzLWdwcjYuICAqLworICAvKiBGaXJzdCB0cmFuc2xhdGUgZm9yIHNvZnRmbG9hdC9ub25saW51eCAqLworICBpZiAoY2lmLT5hYmkgPT0gRkZJX0xJTlVYX1NPRlRfRkxPQVQpIHsKKwlpZiAodHlwZSA9PSBGRklfVFlQRV9GTE9BVCkKKwkJdHlwZSA9IEZGSV9UWVBFX1VJTlQzMjsKKwlpZiAodHlwZSA9PSBGRklfVFlQRV9ET1VCTEUpCisJCXR5cGUgPSBGRklfVFlQRV9VSU5UNjQ7CisJaWYgKHR5cGUgPT0gRkZJX1RZUEVfTE9OR0RPVUJMRSkKKwkJdHlwZSA9IEZGSV9UWVBFX1VJTlQxMjg7CisgIH0gZWxzZSBpZiAoY2lmLT5hYmkgIT0gRkZJX0xJTlVYICYmIGNpZi0+YWJpICE9IEZGSV9MSU5VWDY0KSB7CisjaWYgRkZJX1RZUEVfTE9OR0RPVUJMRSAhPSBGRklfVFlQRV9ET1VCTEUKKwlpZiAodHlwZSA9PSBGRklfVFlQRV9MT05HRE9VQkxFKQorCQl0eXBlID0gRkZJX1RZUEVfU1RSVUNUOworI2VuZGlmCisgIH0KKwogICBzd2l0Y2ggKHR5cGUpCiAgICAgeworI2lmbmRlZiBfX05PX0ZQUlNfXwogI2lmIEZGSV9UWVBFX0xPTkdET1VCTEUgIT0gRkZJX1RZUEVfRE9VQkxFCiAgICAgY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFOgotICAgICAgaWYgKGNpZi0+YWJpICE9IEZGSV9MSU5VWCAmJiBjaWYtPmFiaSAhPSBGRklfTElOVVg2NAotCSYmIGNpZi0+YWJpICE9IEZGSV9MSU5VWF9TT0ZUX0ZMT0FUKQotCWdvdG8gYnlyZWY7CiAgICAgICBmbGFncyB8PSBGTEFHX1JFVFVSTlNfMTI4QklUUzsKICAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCiAjZW5kaWYKQEAgLTY2MCwxMSArNjg0LDEzIEBACiAgICAgICBmbGFncyB8PSBGTEFHX1JFVFVSTlNfNjRCSVRTOwogICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KICAgICBjYXNlIEZGSV9UWVBFX0ZMT0FUOgotICAgICAgLyogV2l0aCBGRklfTElOVVhfU09GVF9GTE9BVCBubyBmcCByZWdpc3RlcnMgYXJlIHVzZWQuICAqLwotICAgICAgaWYgKGNpZi0+YWJpICE9IEZGSV9MSU5VWF9TT0ZUX0ZMT0FUKQotCWZsYWdzIHw9IEZMQUdfUkVUVVJOU19GUDsKKyAgICAgIGZsYWdzIHw9IEZMQUdfUkVUVVJOU19GUDsKICAgICAgIGJyZWFrOworI2VuZGlmCiAKKyAgICBjYXNlIEZGSV9UWVBFX1VJTlQxMjg6CisgICAgICBmbGFncyB8PSBGTEFHX1JFVFVSTlNfMTI4QklUUzsKKyAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCiAgICAgY2FzZSBGRklfVFlQRV9VSU5UNjQ6CiAgICAgY2FzZSBGRklfVFlQRV9TSU5UNjQ6CiAgICAgICBmbGFncyB8PSBGTEFHX1JFVFVSTlNfNjRCSVRTOwpAQCAtNjk5LDkgKzcyNSw3IEBACiAJCX0KIAkgICAgfQogCX0KLSNpZiBGRklfVFlQRV9MT05HRE9VQkxFICE9IEZGSV9UWVBFX0RPVUJMRQotICAgIGJ5cmVmOgotI2VuZGlmCisKICAgICAgIGludGFyZ19jb3VudCsrOwogICAgICAgZmxhZ3MgfD0gRkxBR19SRVRWQUxfUkVGRVJFTkNFOwogICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KQEAgLTcyMiwzOSArNzQ2LDM2IEBACiAgICAgICAgU3R1ZmYgb24gdGhlIHN0YWNrIG5lZWRzIHRvIGtlZXAgcHJvcGVyIGFsaWdubWVudC4gICovCiAgICAgZm9yIChwdHIgPSBjaWYtPmFyZ190eXBlcywgaSA9IGNpZi0+bmFyZ3M7IGkgPiAwOyBpLS0sIHB0cisrKQogICAgICAgewotCXN3aXRjaCAoKCpwdHIpLT50eXBlKQotCSAgeworCXVuc2lnbmVkIHNob3J0IHR5cGVudW0gPSAoKnB0ciktPnR5cGU7CisKKwkvKiBXZSBtYXkgbmVlZCB0byBoYW5kbGUgc29tZSB2YWx1ZXMgZGVwZW5kaW5nIG9uIEFCSSAqLworCWlmIChjaWYtPmFiaSA9PSBGRklfTElOVVhfU09GVF9GTE9BVCkgeworCQlpZiAodHlwZW51bSA9PSBGRklfVFlQRV9GTE9BVCkKKwkJCXR5cGVudW0gPSBGRklfVFlQRV9VSU5UMzI7CisJCWlmICh0eXBlbnVtID09IEZGSV9UWVBFX0RPVUJMRSkKKwkJCXR5cGVudW0gPSBGRklfVFlQRV9VSU5UNjQ7CisJCWlmICh0eXBlbnVtID09IEZGSV9UWVBFX0xPTkdET1VCTEUpCisJCQl0eXBlbnVtID0gRkZJX1RZUEVfVUlOVDEyODsKKwl9IGVsc2UgaWYgKGNpZi0+YWJpICE9IEZGSV9MSU5VWCAmJiBjaWYtPmFiaSAhPSBGRklfTElOVVg2NCkgeworI2lmIEZGSV9UWVBFX0xPTkdET1VCTEUgIT0gRkZJX1RZUEVfRE9VQkxFCisJCWlmICh0eXBlbnVtID09IEZGSV9UWVBFX0xPTkdET1VCTEUpCisJCQl0eXBlbnVtID0gRkZJX1RZUEVfU1RSVUNUOworI2VuZGlmCisJfQorCisJc3dpdGNoICh0eXBlbnVtKSB7CisjaWZuZGVmIF9fTk9fRlBSU19fCiAJICBjYXNlIEZGSV9UWVBFX0ZMT0FUOgotCSAgICAvKiBXaXRoIEZGSV9MSU5VWF9TT0ZUX0ZMT0FUIGZsb2F0cyBhcmUgaGFuZGxlZCBsaWtlIFVJTlQzMi4gICovCi0JICAgIGlmIChjaWYtPmFiaSA9PSBGRklfTElOVVhfU09GVF9GTE9BVCkKLQkgICAgICBnb3RvIHNvZnRfZmxvYXRfY2lmOwogCSAgICBmcGFyZ19jb3VudCsrOwogCSAgICAvKiBmbG9hdGluZyBzaW5nbGVzIGFyZSBub3QgOC1hbGlnbmVkIG9uIHN0YWNrICovCiAJICAgIGJyZWFrOwogCiAjaWYgRkZJX1RZUEVfTE9OR0RPVUJMRSAhPSBGRklfVFlQRV9ET1VCTEUKIAkgIGNhc2UgRkZJX1RZUEVfTE9OR0RPVUJMRToKLQkgICAgaWYgKGNpZi0+YWJpICE9IEZGSV9MSU5VWCAmJiBjaWYtPmFiaSAhPSBGRklfTElOVVhfU09GVF9GTE9BVCkKLQkgICAgICBnb3RvIGRvX3N0cnVjdDsKLQkgICAgaWYgKGNpZi0+YWJpID09IEZGSV9MSU5VWF9TT0ZUX0ZMT0FUKQotCSAgICAgIHsKLQkJaWYgKGludGFyZ19jb3VudCA+PSBOVU1fR1BSX0FSR19SRUdJU1RFUlMgLSAzCi0JCSAgfHwgaW50YXJnX2NvdW50IDwgTlVNX0dQUl9BUkdfUkVHSVNURVJTKQotCQkgIC8qIEEgbG9uZyBkb3VibGUgaW4gRkZJX0xJTlVYX1NPRlRfRkxPQVQgY2FuIHVzZSBvbmx5Ci0JCSAgICAgYSBzZXQgb2YgZm91ciBjb25zZWN1dGl2ZSBncHJzLiBJZiB3ZSBoYXZlIG5vdCBlbm91Z2gsCi0JCSAgICAgd2UgaGF2ZSB0byBhZGp1c3QgdGhlIGludGFyZ19jb3VudCB2YWx1ZS4gICovCi0JCSAgaW50YXJnX2NvdW50ICs9IE5VTV9HUFJfQVJHX1JFR0lTVEVSUyAtIGludGFyZ19jb3VudDsKLQkJaW50YXJnX2NvdW50ICs9IDQ7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIGZwYXJnX2NvdW50Kys7CisJICAgIGZwYXJnX2NvdW50Kys7CiAJICAgIC8qIEZhbGwgdGhydSAqLwogI2VuZGlmCiAJICBjYXNlIEZGSV9UWVBFX0RPVUJMRToKLQkgICAgLyogV2l0aCBGRklfTElOVVhfU09GVF9GTE9BVCBkb3VibGVzIGFyZSBoYW5kbGVkIGxpa2UgVUlOVDY0LiAgKi8KLQkgICAgaWYgKGNpZi0+YWJpID09IEZGSV9MSU5VWF9TT0ZUX0ZMT0FUKQotCSAgICAgIGdvdG8gc29mdF9kb3VibGVfY2lmOwogCSAgICBmcGFyZ19jb3VudCsrOwogCSAgICAvKiBJZiB0aGlzIEZQIGFyZyBpcyBnb2luZyBvbiB0aGUgc3RhY2ssIGl0IG11c3QgYmUKIAkgICAgICAgOC1ieXRlLWFsaWduZWQuICAqLwpAQCAtNzYzLDEwICs3ODQsMjEgQEAKIAkJJiYgaW50YXJnX2NvdW50ICUgMiAhPSAwKQogCSAgICAgIGludGFyZ19jb3VudCsrOwogCSAgICBicmVhazsKKyNlbmRpZgorCSAgY2FzZSBGRklfVFlQRV9VSU5UMTI4OgorCQkvKgorCQkgKiBBIGxvbmcgZG91YmxlIGluIEZGSV9MSU5VWF9TT0ZUX0ZMT0FUIGNhbiB1c2Ugb25seSBhIHNldAorCQkgKiBvZiBmb3VyIGNvbnNlY3V0aXZlIGdwcnMuIElmIHdlIGRvIG5vdCBoYXZlIGVub3VnaCwgd2UKKwkJICogaGF2ZSB0byBhZGp1c3QgdGhlIGludGFyZ19jb3VudCB2YWx1ZS4KKwkJICovCisJCWlmIChpbnRhcmdfY291bnQgPj0gTlVNX0dQUl9BUkdfUkVHSVNURVJTIC0gMworCQkJCSYmIGludGFyZ19jb3VudCA8IE5VTV9HUFJfQVJHX1JFR0lTVEVSUykKKwkJCWludGFyZ19jb3VudCA9IE5VTV9HUFJfQVJHX1JFR0lTVEVSUzsKKwkJaW50YXJnX2NvdW50ICs9IDQ7CisJCWJyZWFrOwogCiAJICBjYXNlIEZGSV9UWVBFX1VJTlQ2NDoKIAkgIGNhc2UgRkZJX1RZUEVfU0lOVDY0OgotCSAgc29mdF9kb3VibGVfY2lmOgogCSAgICAvKiAnbG9uZyBsb25nJyBhcmd1bWVudHMgYXJlIHBhc3NlZCBhcyB0d28gd29yZHMsIGJ1dAogCSAgICAgICBlaXRoZXIgYm90aCB3b3JkcyBtdXN0IGZpdCBpbiByZWdpc3RlcnMgb3IgYm90aCBnbwogCSAgICAgICBvbiB0aGUgc3RhY2suICBJZiB0aGV5IGdvIG9uIHRoZSBzdGFjaywgdGhleSBtdXN0CkBAIC03ODMsOSArODE1LDYgQEAKIAkgICAgYnJlYWs7CiAKIAkgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOgotI2lmIEZGSV9UWVBFX0xPTkdET1VCTEUgIT0gRkZJX1RZUEVfRE9VQkxFCi0JICBkb19zdHJ1Y3Q6Ci0jZW5kaWYKIAkgICAgLyogV2UgbXVzdCBhbGxvY2F0ZSBzcGFjZSBmb3IgYSBjb3B5IG9mIHRoZXNlIHRvIGVuZm9yY2UKIAkgICAgICAgcGFzcy1ieS12YWx1ZS4gIFBhZCB0aGUgc3BhY2UgdXAgdG8gYSBtdWx0aXBsZSBvZiAxNgogCSAgICAgICBieXRlcyAodGhlIG1heGltdW0gYWxpZ25tZW50IHJlcXVpcmVkIGZvciBhbnl0aGluZyB1bmRlcgpAQCAtNzkzLDEyICs4MjIsMjAgQEAKIAkgICAgc3RydWN0X2NvcHlfc2l6ZSArPSAoKCpwdHIpLT5zaXplICsgMTUpICYgfjB4RjsKIAkgICAgLyogRmFsbCB0aHJvdWdoIChhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHBvaW50ZXIpLiAgKi8KIAotCSAgZGVmYXVsdDoKLQkgIHNvZnRfZmxvYXRfY2lmOgorCSAgY2FzZSBGRklfVFlQRV9QT0lOVEVSOgorCSAgY2FzZSBGRklfVFlQRV9JTlQ6CisJICBjYXNlIEZGSV9UWVBFX1VJTlQzMjoKKwkgIGNhc2UgRkZJX1RZUEVfU0lOVDMyOgorCSAgY2FzZSBGRklfVFlQRV9VSU5UMTY6CisJICBjYXNlIEZGSV9UWVBFX1NJTlQxNjoKKwkgIGNhc2UgRkZJX1RZUEVfVUlOVDg6CisJICBjYXNlIEZGSV9UWVBFX1NJTlQ4OgogCSAgICAvKiBFdmVyeXRoaW5nIGVsc2UgaXMgcGFzc2VkIGFzIGEgNC1ieXRlIHdvcmQgaW4gYSBHUFIsIGVpdGhlcgogCSAgICAgICB0aGUgb2JqZWN0IGl0c2VsZiBvciBhIHBvaW50ZXIgdG8gaXQuICAqLwogCSAgICBpbnRhcmdfY291bnQrKzsKIAkgICAgYnJlYWs7CisJICBkZWZhdWx0OgorCQlGRklfQVNTRVJUICgwKTsKIAkgIH0KICAgICAgIH0KICAgZWxzZQpAQCAtODI3LDE2ICs4NjQsMjkgQEAKIAkgICAgaW50YXJnX2NvdW50ICs9ICgoKnB0ciktPnNpemUgKyA3KSAvIDg7CiAJICAgIGJyZWFrOwogCi0JICBkZWZhdWx0OgorCSAgY2FzZSBGRklfVFlQRV9QT0lOVEVSOgorCSAgY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisJICBjYXNlIEZGSV9UWVBFX1NJTlQ2NDoKKwkgIGNhc2UgRkZJX1RZUEVfSU5UOgorCSAgY2FzZSBGRklfVFlQRV9VSU5UMzI6CisJICBjYXNlIEZGSV9UWVBFX1NJTlQzMjoKKwkgIGNhc2UgRkZJX1RZUEVfVUlOVDE2OgorCSAgY2FzZSBGRklfVFlQRV9TSU5UMTY6CisJICBjYXNlIEZGSV9UWVBFX1VJTlQ4OgorCSAgY2FzZSBGRklfVFlQRV9TSU5UODoKIAkgICAgLyogRXZlcnl0aGluZyBlbHNlIGlzIHBhc3NlZCBhcyBhIDgtYnl0ZSB3b3JkIGluIGEgR1BSLCBlaXRoZXIKIAkgICAgICAgdGhlIG9iamVjdCBpdHNlbGYgb3IgYSBwb2ludGVyIHRvIGl0LiAgKi8KIAkgICAgaW50YXJnX2NvdW50Kys7CiAJICAgIGJyZWFrOworCSAgZGVmYXVsdDoKKwkJRkZJX0FTU0VSVCAoMCk7CiAJICB9CiAgICAgICB9CiAKKyNpZm5kZWYgX19OT19GUFJTX18KICAgaWYgKGZwYXJnX2NvdW50ICE9IDApCiAgICAgZmxhZ3MgfD0gRkxBR19GUF9BUkdVTUVOVFM7CisjZW5kaWYKICAgaWYgKGludGFyZ19jb3VudCA+IDQpCiAgICAgZmxhZ3MgfD0gRkxBR180X0dQUl9BUkdVTUVOVFM7CiAgIGlmIChzdHJ1Y3RfY29weV9zaXplICE9IDApCkBAIC04NDQsMjEgKzg5NCwyNyBAQAogCiAgIGlmIChjaWYtPmFiaSAhPSBGRklfTElOVVg2NCkKICAgICB7CisjaWZuZGVmIF9fTk9fRlBSU19fCiAgICAgICAvKiBTcGFjZSBmb3IgdGhlIEZQUiByZWdpc3RlcnMsIGlmIG5lZWRlZC4gICovCiAgICAgICBpZiAoZnBhcmdfY291bnQgIT0gMCkKIAlieXRlcyArPSBOVU1fRlBSX0FSR19SRUdJU1RFUlMgKiBzaXplb2YgKGRvdWJsZSk7CisjZW5kaWYKIAogICAgICAgLyogU3RhY2sgc3BhY2UuICAqLwogICAgICAgaWYgKGludGFyZ19jb3VudCA+IE5VTV9HUFJfQVJHX1JFR0lTVEVSUykKIAlieXRlcyArPSAoaW50YXJnX2NvdW50IC0gTlVNX0dQUl9BUkdfUkVHSVNURVJTKSAqIHNpemVvZiAoaW50KTsKKyNpZm5kZWYgX19OT19GUFJTX18KICAgICAgIGlmIChmcGFyZ19jb3VudCA+IE5VTV9GUFJfQVJHX1JFR0lTVEVSUykKIAlieXRlcyArPSAoZnBhcmdfY291bnQgLSBOVU1fRlBSX0FSR19SRUdJU1RFUlMpICogc2l6ZW9mIChkb3VibGUpOworI2VuZGlmCiAgICAgfQogICBlbHNlCiAgICAgeworI2lmbmRlZiBfX05PX0ZQUlNfXwogICAgICAgLyogU3BhY2UgZm9yIHRoZSBGUFIgcmVnaXN0ZXJzLCBpZiBuZWVkZWQuICAqLwogICAgICAgaWYgKGZwYXJnX2NvdW50ICE9IDApCiAJYnl0ZXMgKz0gTlVNX0ZQUl9BUkdfUkVHSVNURVJTNjQgKiBzaXplb2YgKGRvdWJsZSk7CisjZW5kaWYKIAogICAgICAgLyogU3RhY2sgc3BhY2UuICAqLwogICAgICAgaWYgKGludGFyZ19jb3VudCA+IE5VTV9HUFJfQVJHX1JFR0lTVEVSUzY0KQpAQCAtODg2LDI4ICs5NDIsNDEgQEAKIHZvaWQKIGZmaV9jYWxsKGZmaV9jaWYgKmNpZiwgdm9pZCAoKmZuKSh2b2lkKSwgdm9pZCAqcnZhbHVlLCB2b2lkICoqYXZhbHVlKQogeworICAvKgorICAgKiBUaGUgZmluYWwgU1lTViBBQkkgc2F5cyB0aGF0IHN0cnVjdHVyZXMgc21hbGxlciBvciBlcXVhbCA4IGJ5dGVzCisgICAqIGFyZSByZXR1cm5lZCBpbiByMy9yNC4gVGhlIEZGSV9HQ0NfU1lTViBBQkkgaW5zdGVhZCByZXR1cm5zIHRoZW0KKyAgICogaW4gbWVtb3J5LgorICAgKgorICAgKiBKdXN0IHRvIGtlZXAgdGhpbmdzIHNpbXBsZSBmb3IgdGhlIGFzc2VtYmx5IGNvZGUsIHdlIHdpbGwgYWx3YXlzCisgICAqIGJvdW5jZS1idWZmZXIgc3RydWN0IHJldHVybiB2YWx1ZXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDggYnl0ZXMuCisgICAqIFRoaXMgYWxsb3dzIHRoZSBBU00gdG8gaGFuZGxlIFNZU1Ygc21hbGwgc3RydWN0dXJlcyBieSBkaXJlY3RseQorICAgKiB3cml0aW5nIHIzIGFuZCByNCB0byBtZW1vcnkgd2l0aG91dCB3b3JyeWluZyBhYm91dCBzdHJ1Y3Qgc2l6ZS4KKyAgICovCisgIHVuc2lnbmVkIGludCBzbXN0X2J1ZmZlclsyXTsKICAgZXh0ZW5kZWRfY2lmIGVjaWY7CisgIHVuc2lnbmVkIGludCByc2l6ZSA9IDA7CiAKICAgZWNpZi5jaWYgPSBjaWY7CiAgIGVjaWYuYXZhbHVlID0gYXZhbHVlOwogCi0gIC8qIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYSBzdHJ1Y3QgYW5kIHdlIGRvbid0IGhhdmUgYSByZXR1cm4JKi8KLSAgLyogdmFsdWUgYWRkcmVzcyB0aGVuIHdlIG5lZWQgdG8gbWFrZSBvbmUJCSAgICAgICAgKi8KLQotICBpZiAoKHJ2YWx1ZSA9PSBOVUxMKSAmJiAoY2lmLT5ydHlwZS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QpKQotICAgIHsKLSAgICAgIGVjaWYucnZhbHVlID0gYWxsb2NhKGNpZi0+cnR5cGUtPnNpemUpOwotICAgIH0KLSAgZWxzZQotICAgIGVjaWYucnZhbHVlID0gcnZhbHVlOwotCisgIC8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSB2YWxpZCBzdHJ1Y3QgcmV0dXJuIHZhbHVlICovCisgIGVjaWYucnZhbHVlID0gcnZhbHVlOworICBpZiAoY2lmLT5ydHlwZS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QpIHsKKyAgICByc2l6ZSA9IGNpZi0+cnR5cGUtPnNpemU7CisgICAgaWYgKHJzaXplIDw9IDgpCisgICAgICBlY2lmLnJ2YWx1ZSA9IHNtc3RfYnVmZmVyOworICAgIGVsc2UgaWYgKCFydmFsdWUpCisgICAgICBlY2lmLnJ2YWx1ZSA9IGFsbG9jYShyc2l6ZSk7CisgIH0KIAogICBzd2l0Y2ggKGNpZi0+YWJpKQogICAgIHsKICNpZm5kZWYgUE9XRVJQQzY0CisjIGlmbmRlZiBfX05PX0ZQUlNfXwogICAgIGNhc2UgRkZJX1NZU1Y6CiAgICAgY2FzZSBGRklfR0NDX1NZU1Y6CiAgICAgY2FzZSBGRklfTElOVVg6CisjIGVuZGlmCiAgICAgY2FzZSBGRklfTElOVVhfU09GVF9GTE9BVDoKICAgICAgIGZmaV9jYWxsX1NZU1YgKCZlY2lmLCAtY2lmLT5ieXRlcywgY2lmLT5mbGFncywgZWNpZi5ydmFsdWUsIGZuKTsKICAgICAgIGJyZWFrOwpAQCAtOTIwLDYgKzk4OSwxMCBAQAogICAgICAgRkZJX0FTU0VSVCAoMCk7CiAgICAgICBicmVhazsKICAgICB9CisKKyAgLyogQ2hlY2sgZm9yIGEgYm91bmNlLWJ1ZmZlcmVkIHJldHVybiB2YWx1ZSAqLworICBpZiAocnZhbHVlICYmIGVjaWYucnZhbHVlID09IHNtc3RfYnVmZmVyKQorICAgIG1lbWNweShydmFsdWUsIHNtc3RfYnVmZmVyLCByc2l6ZSk7CiB9CiAKIApAQCAtOTQ5LDE0ICsxMDIyLDE5IEBACiAjaWZkZWYgUE9XRVJQQzY0CiAgIHZvaWQgKip0cmFtcCA9ICh2b2lkICoqKSAmY2xvc3VyZS0+dHJhbXBbMF07CiAKLSAgRkZJX0FTU0VSVCAoY2lmLT5hYmkgPT0gRkZJX0xJTlVYNjQpOworICBpZiAoY2lmLT5hYmkgIT0gRkZJX0xJTlVYNjQpCisgICAgcmV0dXJuIEZGSV9CQURfQUJJOwogICAvKiBDb3B5IGZ1bmN0aW9uIGFkZHJlc3MgYW5kIFRPQyBmcm9tIGZmaV9jbG9zdXJlX0xJTlVYNjQuICAqLwogICBtZW1jcHkgKHRyYW1wLCAoY2hhciAqKSBmZmlfY2xvc3VyZV9MSU5VWDY0LCAxNik7CiAgIHRyYW1wWzJdID0gY29kZWxvYzsKICNlbHNlCiAgIHVuc2lnbmVkIGludCAqdHJhbXA7CiAKLSAgRkZJX0FTU0VSVCAoY2lmLT5hYmkgPT0gRkZJX0dDQ19TWVNWIHx8IGNpZi0+YWJpID09IEZGSV9TWVNWKTsKKyAgaWYgKCEgKGNpZi0+YWJpID09IEZGSV9HQ0NfU1lTViAKKwkgfHwgY2lmLT5hYmkgPT0gRkZJX1NZU1YKKwkgfHwgY2lmLT5hYmkgPT0gRkZJX0xJTlVYCisJIHx8IGNpZi0+YWJpID09IEZGSV9MSU5VWF9TT0ZUX0ZMT0FUKSkKKyAgICByZXR1cm4gRkZJX0JBRF9BQkk7CiAKICAgdHJhbXAgPSAodW5zaWduZWQgaW50ICopICZjbG9zdXJlLT50cmFtcFswXTsKICAgdHJhbXBbMF0gPSAweDdjMDgwMmE2OyAgLyogICBtZmxyICAgIHIwICovCkBAIC0xMDExLDMyICsxMDg5LDM4IEBACiAgIHZvaWQgKiogICAgICAgICAgYXZhbHVlOwogICBmZmlfdHlwZSAqKiAgICAgIGFyZ190eXBlczsKICAgbG9uZyAgICAgICAgICAgICBpLCBhdm47Ci0gIGxvbmcgICAgICAgICAgICAgbmY7ICAgLyogbnVtYmVyIG9mIGZsb2F0aW5nIHJlZ2lzdGVycyBhbHJlYWR5IHVzZWQgKi8KLSAgbG9uZyAgICAgICAgICAgICBuZzsgICAvKiBudW1iZXIgb2YgZ2VuZXJhbCByZWdpc3RlcnMgYWxyZWFkeSB1c2VkICovCi0gIGZmaV9jaWYgKiAgICAgICAgY2lmOwotICBkb3VibGUgICAgICAgICAgIHRlbXA7Ci0gIHVuc2lnbmVkICAgICAgICAgc2l6ZTsKKyNpZm5kZWYgX19OT19GUFJTX18KKyAgbG9uZyAgICAgICAgICAgICBuZiA9IDA7ICAgLyogbnVtYmVyIG9mIGZsb2F0aW5nIHJlZ2lzdGVycyBhbHJlYWR5IHVzZWQgKi8KKyNlbmRpZgorICBsb25nICAgICAgICAgICAgIG5nID0gMDsgICAvKiBudW1iZXIgb2YgZ2VuZXJhbCByZWdpc3RlcnMgYWxyZWFkeSB1c2VkICovCiAKLSAgY2lmID0gY2xvc3VyZS0+Y2lmOworICBmZmlfY2lmICpjaWYgPSBjbG9zdXJlLT5jaWY7CisgIHVuc2lnbmVkICAgICAgIHNpemUgICAgID0gY2lmLT5ydHlwZS0+c2l6ZTsKKyAgdW5zaWduZWQgc2hvcnQgcnR5cGVudW0gPSBjaWYtPnJ0eXBlLT50eXBlOworCiAgIGF2YWx1ZSA9IGFsbG9jYSAoY2lmLT5uYXJncyAqIHNpemVvZiAodm9pZCAqKSk7Ci0gIHNpemUgPSBjaWYtPnJ0eXBlLT5zaXplOwogCi0gIG5mID0gMDsKLSAgbmcgPSAwOworICAvKiBGaXJzdCB0cmFuc2xhdGUgZm9yIHNvZnRmbG9hdC9ub25saW51eCAqLworICBpZiAoY2lmLT5hYmkgPT0gRkZJX0xJTlVYX1NPRlRfRkxPQVQpIHsKKwlpZiAocnR5cGVudW0gPT0gRkZJX1RZUEVfRkxPQVQpCisJCXJ0eXBlbnVtID0gRkZJX1RZUEVfVUlOVDMyOworCWlmIChydHlwZW51bSA9PSBGRklfVFlQRV9ET1VCTEUpCisJCXJ0eXBlbnVtID0gRkZJX1RZUEVfVUlOVDY0OworCWlmIChydHlwZW51bSA9PSBGRklfVFlQRV9MT05HRE9VQkxFKQorCQlydHlwZW51bSA9IEZGSV9UWVBFX1VJTlQxMjg7CisgIH0gZWxzZSBpZiAoY2lmLT5hYmkgIT0gRkZJX0xJTlVYICYmIGNpZi0+YWJpICE9IEZGSV9MSU5VWDY0KSB7CisjaWYgRkZJX1RZUEVfTE9OR0RPVUJMRSAhPSBGRklfVFlQRV9ET1VCTEUKKwlpZiAocnR5cGVudW0gPT0gRkZJX1RZUEVfTE9OR0RPVUJMRSkKKwkJcnR5cGVudW0gPSBGRklfVFlQRV9TVFJVQ1Q7CisjZW5kaWYKKyAgfQorCiAKICAgLyogQ29weSB0aGUgY2FsbGVyJ3Mgc3RydWN0dXJlIHJldHVybiB2YWx1ZSBhZGRyZXNzIHNvIHRoYXQgdGhlIGNsb3N1cmUKICAgICAgcmV0dXJucyB0aGUgZGF0YSBkaXJlY3RseSB0byB0aGUgY2FsbGVyLgogICAgICBGb3IgRkZJX1NZU1YgdGhlIHJlc3VsdCBpcyBwYXNzZWQgaW4gcjMvcjQgaWYgdGhlIHN0cnVjdCBzaXplIGlzIGxlc3MKICAgICAgb3IgZXF1YWwgOCBieXRlcy4gICovCi0KLSAgaWYgKChjaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVAotICAgICAgICYmICEoKGNpZi0+YWJpID09IEZGSV9TWVNWKSAmJiAoc2l6ZSA8PSA4KSkpCi0jaWYgRkZJX1RZUEVfTE9OR0RPVUJMRSAhPSBGRklfVFlQRV9ET1VCTEUKLSAgICAgIHx8IChjaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX0xPTkdET1VCTEUKLQkgICYmIGNpZi0+YWJpICE9IEZGSV9MSU5VWCAmJiBjaWYtPmFiaSAhPSBGRklfTElOVVhfU09GVF9GTE9BVCkKLSNlbmRpZgotICAgICAgKQotICAgIHsKKyAgaWYgKHJ0eXBlbnVtID09IEZGSV9UWVBFX1NUUlVDVCAmJiAoKGNpZi0+YWJpICE9IEZGSV9TWVNWKSB8fCAoc2l6ZSA+IDgpKSkgewogICAgICAgcnZhbHVlID0gKHZvaWQgKikgKnBncjsKICAgICAgIG5nKys7CiAgICAgICBwZ3IrKzsKQEAgLTEwNDcsMTAgKzExMzEsMTA5IEBACiAgIGFyZ190eXBlcyA9IGNpZi0+YXJnX3R5cGVzOwogCiAgIC8qIEdyYWIgdGhlIGFkZHJlc3NlcyBvZiB0aGUgYXJndW1lbnRzIGZyb20gdGhlIHN0YWNrIGZyYW1lLiAgKi8KLSAgd2hpbGUgKGkgPCBhdm4pCi0gICAgewotICAgICAgc3dpdGNoIChhcmdfdHlwZXNbaV0tPnR5cGUpCi0JeworICB3aGlsZSAoaSA8IGF2bikgeworICAgICAgdW5zaWduZWQgc2hvcnQgdHlwZW51bSA9IGFyZ190eXBlc1tpXS0+dHlwZTsKKworICAgICAgLyogV2UgbWF5IG5lZWQgdG8gaGFuZGxlIHNvbWUgdmFsdWVzIGRlcGVuZGluZyBvbiBBQkkgKi8KKyAgICAgIGlmIChjaWYtPmFiaSA9PSBGRklfTElOVVhfU09GVF9GTE9BVCkgeworCQlpZiAodHlwZW51bSA9PSBGRklfVFlQRV9GTE9BVCkKKwkJCXR5cGVudW0gPSBGRklfVFlQRV9VSU5UMzI7CisJCWlmICh0eXBlbnVtID09IEZGSV9UWVBFX0RPVUJMRSkKKwkJCXR5cGVudW0gPSBGRklfVFlQRV9VSU5UNjQ7CisJCWlmICh0eXBlbnVtID09IEZGSV9UWVBFX0xPTkdET1VCTEUpCisJCQl0eXBlbnVtID0gRkZJX1RZUEVfVUlOVDEyODsKKyAgICAgIH0gZWxzZSBpZiAoY2lmLT5hYmkgIT0gRkZJX0xJTlVYICYmIGNpZi0+YWJpICE9IEZGSV9MSU5VWDY0KSB7CisjaWYgRkZJX1RZUEVfTE9OR0RPVUJMRSAhPSBGRklfVFlQRV9ET1VCTEUKKwkJaWYgKHR5cGVudW0gPT0gRkZJX1RZUEVfTE9OR0RPVUJMRSkKKwkJCXR5cGVudW0gPSBGRklfVFlQRV9TVFJVQ1Q7CisjZW5kaWYKKyAgICAgIH0KKworICAgICAgc3dpdGNoICh0eXBlbnVtKSB7CisjaWZuZGVmIF9fTk9fRlBSU19fCisJY2FzZSBGRklfVFlQRV9GTE9BVDoKKwkgIC8qIHVuZm9ydHVuYXRlbHkgZmxvYXQgdmFsdWVzIGFyZSBzdG9yZWQgYXMgZG91YmxlcworCSAgICogaW4gdGhlIGZmaV9jbG9zdXJlX1NZU1YgY29kZSAoc2luY2Ugd2UgZG9uJ3QgY2hlY2sKKwkgICAqIHRoZSB0eXBlIGluIHRoYXQgcm91dGluZSkuCisJICAgKi8KKworCSAgLyogdGhlcmUgYXJlIDggNjRiaXQgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzICovCisKKwkgIGlmIChuZiA8IDgpCisJICAgIHsKKwkgICAgICBkb3VibGUgdGVtcCA9IHBmci0+ZDsKKwkgICAgICBwZnItPmYgPSAoZmxvYXQpIHRlbXA7CisJICAgICAgYXZhbHVlW2ldID0gcGZyOworCSAgICAgIG5mKys7CisJICAgICAgcGZyKys7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIEZJWE1FPyBoZXJlIHdlIGFyZSByZWFsbHkgY2hhbmdpbmcgdGhlIHZhbHVlcworCSAgICAgICAqIHN0b3JlZCBpbiB0aGUgb3JpZ2luYWwgY2FsbGluZyByb3V0aW5lcyBvdXRnb2luZworCSAgICAgICAqIHBhcmFtZXRlciBzdGFjay4gIFRoaXMgaXMgcHJvYmFibHkgYSByZWFsbHkKKwkgICAgICAgKiBuYXVnaHR5IHRoaW5nIHRvIGRvIGJ1dC4uLgorCSAgICAgICAqLworCSAgICAgIGF2YWx1ZVtpXSA9IHBzdDsKKwkgICAgICBwc3QgKz0gMTsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlIEZGSV9UWVBFX0RPVUJMRToKKwkgIC8qIE9uIHRoZSBvdXRnb2luZyBzdGFjayBhbGwgdmFsdWVzIGFyZSBhbGlnbmVkIHRvIDggKi8KKwkgIC8qIHRoZXJlIGFyZSA4IDY0Yml0IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyAqLworCisJICBpZiAobmYgPCA4KQorCSAgICB7CisJICAgICAgYXZhbHVlW2ldID0gcGZyOworCSAgICAgIG5mKys7CisJICAgICAgcGZyKys7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICgoKGxvbmcpIHBzdCkgJiA0KQorCQlwc3QrKzsKKwkgICAgICBhdmFsdWVbaV0gPSBwc3Q7CisJICAgICAgcHN0ICs9IDI7CisJICAgIH0KKwkgIGJyZWFrOworCisjaWYgRkZJX1RZUEVfTE9OR0RPVUJMRSAhPSBGRklfVFlQRV9ET1VCTEUKKwljYXNlIEZGSV9UWVBFX0xPTkdET1VCTEU6CisJICBpZiAobmYgPCA3KQorCSAgICB7CisJICAgICAgYXZhbHVlW2ldID0gcGZyOworCSAgICAgIHBmciArPSAyOworCSAgICAgIG5mICs9IDI7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICgoKGxvbmcpIHBzdCkgJiA0KQorCQlwc3QrKzsKKwkgICAgICBhdmFsdWVbaV0gPSBwc3Q7CisJICAgICAgcHN0ICs9IDQ7CisJICAgICAgbmYgPSA4OworCSAgICB9CisJICBicmVhazsKKyNlbmRpZgorI2VuZGlmIC8qIGhhdmUgRlBSUyAqLworCisJY2FzZSBGRklfVFlQRV9VSU5UMTI4OgorCQkvKgorCQkgKiBUZXN0IGlmIGZvciB0aGUgd2hvbGUgbG9uZyBkb3VibGUsIDQgZ3BycyBhcmUgYXZhaWxhYmxlLgorCQkgKiBvdGhlcndpc2UgdGhlIHN0dWZmIGVuZHMgdXAgb24gdGhlIHN0YWNrLgorCQkgKi8KKwkJaWYgKG5nIDwgNSkgeworCQkJYXZhbHVlW2ldID0gcGdyOworCQkJcGdyICs9IDQ7CisJCQluZyArPSA0OworCQl9IGVsc2UgeworCQkJYXZhbHVlW2ldID0gcHN0OworCQkJcHN0ICs9IDQ7CisJCQluZyA9IDgrNDsKKwkJfQorCQlicmVhazsKKwogCWNhc2UgRkZJX1RZUEVfU0lOVDg6CiAJY2FzZSBGRklfVFlQRV9VSU5UODoKIAkgIC8qIHRoZXJlIGFyZSA4IGdwciByZWdpc3RlcnMgdXNlZCB0byBwYXNzIHZhbHVlcyAqLwpAQCAtMTA4Niw3ICsxMjY5LDYgQEAKIAljYXNlIEZGSV9UWVBFX1NJTlQzMjoKIAljYXNlIEZGSV9UWVBFX1VJTlQzMjoKIAljYXNlIEZGSV9UWVBFX1BPSU5URVI6Ci0Jc29mdF9mbG9hdF9jbG9zdXJlOgogCSAgLyogdGhlcmUgYXJlIDggZ3ByIHJlZ2lzdGVycyB1c2VkIHRvIHBhc3MgdmFsdWVzICovCiAJICBpZiAobmcgPCA4KQogCSAgICB7CkBAIC0xMTAyLDkgKzEyODQsNiBAQAogCSAgYnJlYWs7CiAKIAljYXNlIEZGSV9UWVBFX1NUUlVDVDoKLSNpZiBGRklfVFlQRV9MT05HRE9VQkxFICE9IEZGSV9UWVBFX0RPVUJMRQotCWRvX3N0cnVjdDoKLSNlbmRpZgogCSAgLyogU3RydWN0cyBhcmUgcGFzc2VkIGJ5IHJlZmVyZW5jZS4gVGhlIGFkZHJlc3Mgd2lsbCBhcHBlYXIgaW4gYQogCSAgICAgZ3ByIGlmIGl0IGlzIG9uZSBvZiB0aGUgZmlyc3QgOCBhcmd1bWVudHMuICAqLwogCSAgaWYgKG5nIDwgOCkKQEAgLTExMjIsNyArMTMwMSw2IEBACiAKIAljYXNlIEZGSV9UWVBFX1NJTlQ2NDoKIAljYXNlIEZGSV9UWVBFX1VJTlQ2NDoKLQlzb2Z0X2RvdWJsZV9jbG9zdXJlOgogCSAgLyogcGFzc2luZyBsb25nIGxvbmcgaW50cyBhcmUgY29tcGxleCwgdGhleSBtdXN0CiAJICAgKiBiZSBwYXNzZWQgaW4gc3VpdGFibGUgcmVnaXN0ZXIgcGFpcnMgc3VjaCBhcwogCSAgICogKHIzLHI0KSBvciAocjUscjYpIG9yIChyNixyNyksIG9yIChyNyxyOCkgb3IgKHI5LHIxMCkKQEAgLTExNTQsOTkgKzEzMzIsOCBAQAogCSAgICB9CiAJICBicmVhazsKIAotCWNhc2UgRkZJX1RZUEVfRkxPQVQ6Ci0JICAvKiBXaXRoIEZGSV9MSU5VWF9TT0ZUX0ZMT0FUIGZsb2F0cyBhcmUgaGFuZGxlZCBsaWtlIFVJTlQzMi4gICovCi0JICBpZiAoY2lmLT5hYmkgPT0gRkZJX0xJTlVYX1NPRlRfRkxPQVQpCi0JICAgIGdvdG8gc29mdF9mbG9hdF9jbG9zdXJlOwotCSAgLyogdW5mb3J0dW5hdGVseSBmbG9hdCB2YWx1ZXMgYXJlIHN0b3JlZCBhcyBkb3VibGVzCi0JICAgKiBpbiB0aGUgZmZpX2Nsb3N1cmVfU1lTViBjb2RlIChzaW5jZSB3ZSBkb24ndCBjaGVjawotCSAgICogdGhlIHR5cGUgaW4gdGhhdCByb3V0aW5lKS4KLQkgICAqLwotCi0JICAvKiB0aGVyZSBhcmUgOCA2NGJpdCBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgKi8KLQotCSAgaWYgKG5mIDwgOCkKLQkgICAgewotCSAgICAgIHRlbXAgPSBwZnItPmQ7Ci0JICAgICAgcGZyLT5mID0gKGZsb2F0KSB0ZW1wOwotCSAgICAgIGF2YWx1ZVtpXSA9IHBmcjsKLQkgICAgICBuZisrOwotCSAgICAgIHBmcisrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRT8gaGVyZSB3ZSBhcmUgcmVhbGx5IGNoYW5naW5nIHRoZSB2YWx1ZXMKLQkgICAgICAgKiBzdG9yZWQgaW4gdGhlIG9yaWdpbmFsIGNhbGxpbmcgcm91dGluZXMgb3V0Z29pbmcKLQkgICAgICAgKiBwYXJhbWV0ZXIgc3RhY2suICBUaGlzIGlzIHByb2JhYmx5IGEgcmVhbGx5Ci0JICAgICAgICogbmF1Z2h0eSB0aGluZyB0byBkbyBidXQuLi4KLQkgICAgICAgKi8KLQkgICAgICBhdmFsdWVbaV0gPSBwc3Q7Ci0JICAgICAgcHN0ICs9IDE7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBGRklfVFlQRV9ET1VCTEU6Ci0JICAvKiBXaXRoIEZGSV9MSU5VWF9TT0ZUX0ZMT0FUIGRvdWJsZXMgYXJlIGhhbmRsZWQgbGlrZSBVSU5UNjQuICAqLwotCSAgaWYgKGNpZi0+YWJpID09IEZGSV9MSU5VWF9TT0ZUX0ZMT0FUKQotCSAgICBnb3RvIHNvZnRfZG91YmxlX2Nsb3N1cmU7Ci0JICAvKiBPbiB0aGUgb3V0Z29pbmcgc3RhY2sgYWxsIHZhbHVlcyBhcmUgYWxpZ25lZCB0byA4ICovCi0JICAvKiB0aGVyZSBhcmUgOCA2NGJpdCBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgKi8KLQotCSAgaWYgKG5mIDwgOCkKLQkgICAgewotCSAgICAgIGF2YWx1ZVtpXSA9IHBmcjsKLQkgICAgICBuZisrOwotCSAgICAgIHBmcisrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoKChsb25nKSBwc3QpICYgNCkKLQkJcHN0Kys7Ci0JICAgICAgYXZhbHVlW2ldID0gcHN0OwotCSAgICAgIHBzdCArPSAyOwotCSAgICB9Ci0JICBicmVhazsKLQotI2lmIEZGSV9UWVBFX0xPTkdET1VCTEUgIT0gRkZJX1RZUEVfRE9VQkxFCi0JY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFOgotCSAgaWYgKGNpZi0+YWJpICE9IEZGSV9MSU5VWCAmJiBjaWYtPmFiaSAhPSBGRklfTElOVVhfU09GVF9GTE9BVCkKLQkgICAgZ290byBkb19zdHJ1Y3Q7Ci0JICBpZiAoY2lmLT5hYmkgPT0gRkZJX0xJTlVYX1NPRlRfRkxPQVQpCi0JICAgIHsgLyogVGVzdCBpZiBmb3IgdGhlIHdob2xlIGxvbmcgZG91YmxlLCA0IGdwcnMgYXJlIGF2YWlsYWJsZS4KLQkJIG90aGVyd2lzZSB0aGUgc3R1ZmYgZW5kcyB1cCBvbiB0aGUgc3RhY2suICAqLwotCSAgICAgIGlmIChuZyA8IDUpCi0JCXsKLQkJICBhdmFsdWVbaV0gPSBwZ3I7Ci0JCSAgcGdyICs9IDQ7Ci0JCSAgbmcgKz0gNDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGF2YWx1ZVtpXSA9IHBzdDsKLQkJICBwc3QgKz0gNDsKLQkJICBuZyA9IDg7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgaWYgKG5mIDwgNykKLQkgICAgewotCSAgICAgIGF2YWx1ZVtpXSA9IHBmcjsKLQkgICAgICBwZnIgKz0gMjsKLQkgICAgICBuZiArPSAyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoKChsb25nKSBwc3QpICYgNCkKLQkJcHN0Kys7Ci0JICAgICAgYXZhbHVlW2ldID0gcHN0OwotCSAgICAgIHBzdCArPSA0OwotCSAgICAgIG5mID0gODsKLQkgICAgfQotCSAgYnJlYWs7Ci0jZW5kaWYKLQogCWRlZmF1bHQ6Ci0JICBGRklfQVNTRVJUICgwKTsKKwkJRkZJX0FTU0VSVCAoMCk7CiAJfQogCiAgICAgICBpKys7CkBAIC0xMjYzLDM5ICsxMzUwLDkgQEAKICAgICAgYWxyZWFkeSB1c2VkIGFuZCB3ZSBuZXZlciBoYXZlIGEgc3RydWN0IHdpdGggc2l6ZSB6ZXJvLiBUaGF0IGlzIHRoZSByZWFzb24KICAgICAgZm9yIHRoZSBzdWJ0cmFjdGlvbiBvZiAxLiBTZWUgdGhlIGNvbW1lbnQgaW4gZmZpdGFyZ2V0LmggYWJvdXQgb3JkZXJpbmcuCiAgICovCi0gIGlmIChjaWYtPmFiaSA9PSBGRklfU1lTViAmJiBjaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVAotICAgICAgJiYgc2l6ZSA8PSA4KQorICBpZiAoY2lmLT5hYmkgPT0gRkZJX1NZU1YgJiYgcnR5cGVudW0gPT0gRkZJX1RZUEVfU1RSVUNUICYmIHNpemUgPD0gOCkKICAgICByZXR1cm4gKEZGSV9TWVNWX1RZUEVfU01BTExfU1RSVUNUIC0gMSkgKyBzaXplOwotI2lmIEZGSV9UWVBFX0xPTkdET1VCTEUgIT0gRkZJX1RZUEVfRE9VQkxFCi0gIGVsc2UgaWYgKGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfTE9OR0RPVUJMRQotCSAgICYmIGNpZi0+YWJpICE9IEZGSV9MSU5VWCAmJiBjaWYtPmFiaSAhPSBGRklfTElOVVhfU09GVF9GTE9BVCkKLSAgICByZXR1cm4gRkZJX1RZUEVfU1RSVUNUOwotI2VuZGlmCi0gIC8qIFdpdGggRkZJX0xJTlVYX1NPRlRfRkxPQVQgZmxvYXRzIGFuZCBkb3VibGVzIGFyZSBoYW5kbGVkIGxpa2UgVUlOVDMyCi0gICAgIHJlc3BlY3RpdmxleSBVSU5UNjQuICAqLwotICBpZiAoY2lmLT5hYmkgPT0gRkZJX0xJTlVYX1NPRlRfRkxPQVQpCi0gICAgewotICAgICAgc3dpdGNoIChjaWYtPnJ0eXBlLT50eXBlKQotCXsKLQljYXNlIEZGSV9UWVBFX0ZMT0FUOgotCSAgcmV0dXJuIEZGSV9UWVBFX1VJTlQzMjsKLQkgIGJyZWFrOwotCWNhc2UgRkZJX1RZUEVfRE9VQkxFOgotCSAgcmV0dXJuIEZGSV9UWVBFX1VJTlQ2NDsKLQkgIGJyZWFrOwotI2lmIEZGSV9UWVBFX0xPTkdET1VCTEUgIT0gRkZJX1RZUEVfRE9VQkxFCi0JY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFOgotCSAgcmV0dXJuIEZGSV9UWVBFX1VJTlQxMjg7Ci0JICBicmVhazsKLSNlbmRpZgotCWRlZmF1bHQ6Ci0JICByZXR1cm4gY2lmLT5ydHlwZS0+dHlwZTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIGNpZi0+cnR5cGUtPnR5cGU7Ci0gICAgfQorICByZXR1cm4gcnR5cGVudW07CiB9CiAKIGludCBGRklfSElEREVOIGZmaV9jbG9zdXJlX2hlbHBlcl9MSU5VWDY0IChmZmlfY2xvc3VyZSAqLCB2b2lkICosCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2ZmaV9kYXJ3aW4uYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvZmZpX2Rhcndpbi5jCmluZGV4IGQ4NGYxYzMuLjFkMWQ0OGMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvZmZpX2Rhcndpbi5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvZmZpX2Rhcndpbi5jCkBAIC0zLDcgKzMsNyBAQAogCiAgICBDb3B5cmlnaHQgKEMpIDE5OTggR2VvZmZyZXkgS2VhdGluZwogICAgQ29weXJpZ2h0IChDKSAyMDAxIEpvaG4gSG9ybmt2aXN0Ci0gICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDYsIDIwMDcsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDYsIDIwMDcsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAKICAgIEZGSSBzdXBwb3J0IGZvciBEYXJ3aW4gYW5kIEFJWC4KICAgIApAQCAtMzUsMTEgKzM1LDE3IEBACiBleHRlcm4gdm9pZCBmZmlfY2xvc3VyZV9BU00gKHZvaWQpOwogCiBlbnVtIHsKLSAgLyogVGhlIGFzc2VtYmx5IGRlcGVuZHMgb24gdGhlc2UgZXhhY3QgZmxhZ3MuICAqLwotICBGTEFHX1JFVFVSTlNfTk9USElORyAgPSAxIDw8ICgzMS0zMCksIC8qIFRoZXNlIGdvIGluIGNyNyAgKi8KLSAgRkxBR19SRVRVUk5TX0ZQICAgICAgID0gMSA8PCAoMzEtMjkpLAotICBGTEFHX1JFVFVSTlNfNjRCSVRTICAgPSAxIDw8ICgzMS0yOCksCi0gIEZMQUdfUkVUVVJOU18xMjhCSVRTICA9IDEgPDwgKDMxLTMxKSwKKyAgLyogVGhlIGFzc2VtYmx5IGRlcGVuZHMgb24gdGhlc2UgZXhhY3QgZmxhZ3MuICAKKyAgICAgRm9yIERhcndpbjY0ICh3aGVuIEZMQUdfUkVUVVJOU19TVFJVQ1QgaXMgc2V0KToKKyAgICAgICBGTEFHX1JFVFVSTlNfRlAgaW5kaWNhdGVzIHRoYXQgdGhlIHN0cnVjdHVyZSBlbWJlZHMgRlAgZGF0YS4KKyAgICAgICBGTEFHX1JFVFVSTlNfMTI4QklUUyBzaWduYWxzIGEgc3BlY2lhbCBzdHJ1Y3Qgc2l6ZSB0aGF0IGlzIG5vdAorICAgICAgIGV4cGFuZGVkIGZvciBmbG9hdCBjb250ZW50LiAgKi8KKyAgRkxBR19SRVRVUk5TXzEyOEJJVFMJPSAxIDw8ICgzMS0zMSksIC8qIFRoZXNlIGdvIGluIGNyNyAgKi8KKyAgRkxBR19SRVRVUk5TX05PVEhJTkcJPSAxIDw8ICgzMS0zMCksCisgIEZMQUdfUkVUVVJOU19GUAk9IDEgPDwgKDMxLTI5KSwKKyAgRkxBR19SRVRVUk5TXzY0QklUUwk9IDEgPDwgKDMxLTI4KSwKKworICBGTEFHX1JFVFVSTlNfU1RSVUNUCT0gMSA8PCAoMzEtMjcpLCAvKiBUaGlzIGdvZXMgaW4gY3I2ICAqLwogCiAgIEZMQUdfQVJHX05FRURTX0NPUFkgICA9IDEgPDwgKDMxLSA3KSwKICAgRkxBR19GUF9BUkdVTUVOVFMgICAgID0gMSA8PCAoMzEtIDYpLCAvKiBjcjEuZXE7IHNwZWNpZmllZCBieSBBQkkgICovCkBAIC01MCw0MyArNTYsNjEgQEAKIC8qIEFib3V0IHRoZSBEQVJXSU4gQUJJLiAgKi8KIGVudW0gewogICBOVU1fR1BSX0FSR19SRUdJU1RFUlMgPSA4LAotICBOVU1fRlBSX0FSR19SRUdJU1RFUlMgPSAxMworICBOVU1fRlBSX0FSR19SRUdJU1RFUlMgPSAxMywKKyAgTElOS0FHRV9BUkVBX0dQUlMgPSA2CiB9OwotZW51bSB7IEFTTV9ORUVEU19SRUdJU1RFUlMgPSA0IH07CisKK2VudW0geyBBU01fTkVFRFNfUkVHSVNURVJTID0gNCB9OyAvKiByMjgtcjMxICovCiAKIC8qIGZmaV9wcmVwX2FyZ3MgaXMgY2FsbGVkIGJ5IHRoZSBhc3NlbWJseSByb3V0aW5lIG9uY2Ugc3RhY2sgc3BhY2UKICAgIGhhcyBiZWVuIGFsbG9jYXRlZCBmb3IgdGhlIGZ1bmN0aW9uJ3MgYXJndW1lbnRzLgorICAgCisgICBtMzIvbTY0CiAKICAgIFRoZSBzdGFjayBsYXlvdXQgd2Ugd2FudCBsb29rcyBsaWtlIHRoaXM6CiAKICAgIHwgICBSZXR1cm4gYWRkcmVzcyBmcm9tIGZmaV9jYWxsX0RBUldJTiAgICAgIHwJaGlnaGVyIGFkZHJlc3NlcwogICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAotICAgfCAgIFByZXZpb3VzIGJhY2tjaGFpbiBwb2ludGVyCTQJfAlzdGFjayBwb2ludGVyIGhlcmUKKyAgIHwgICBQcmV2aW91cyBiYWNrY2hhaW4gcG9pbnRlcgk0LzgJfAlzdGFjayBwb2ludGVyIGhlcmUKICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw8KyA8PDwJb24gZW50cnkgdG8KLSAgIHwgICBTYXZlZCByMjgtcjMxCQkJNCo0CXwgfAlmZmlfY2FsbF9EQVJXSU4KKyAgIHwgICBBU01fTkVFRFNfUkVHSVNURVJTPXIyOC1yMzEgICA0Kig0LzgpCXwgfAlmZmlfY2FsbF9EQVJXSU4KICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfAotICAgfCAgIFBhcmFtZXRlcnMgICAgICAgICAgICAgKGF0IGxlYXN0IDgqND0zMikgfCB8CisgICB8ICAgV2hlbiB3ZSBoYXZlIGFueSBGUCBhY3Rpdml0eS4uLiB0aGUJfCB8CisgICB8ICAgRlBScyBvY2N1cHkgTlVNX0ZQUl9BUkdfUkVHSVNURVJTIHNsb3RzCXwgfAorICAgfCAgIGhlcmUgZnAxMyAuLiBmcDEgZnJvbSBoaWdoIHRvIGxvdyBhZGRyLgl8IHwKKyAgIH4JCQkJCQl+IH4KKyAgIHwgICBQYXJhbWV0ZXJzICAgICAgKGF0IGxlYXN0IDgqNC84PTMyLzY0KQl8IHwgTlVNX0dQUl9BUkdfUkVHSVNURVJTCiAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwKLSAgIHwgICBTcGFjZSBmb3IgR1BSMiAgICAgICAgICAgICAgICAgICA0ICAgICAgIHwgfAorICAgfCAgIFRPQz1SMiAoQUlYKSBSZXNlcnZlZCAoRGFyd2luKSAgIDQvOAl8IHwKICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfAlzdGFjawl8Ci0gICB8ICAgUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDIqNCAgICAgICB8IHwJZ3Jvd3MJfAorICAgfCAgIFJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAyKjQvOAl8IHwJZ3Jvd3MJfAogICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8CWRvd24JVgotICAgfCAgIFNwYWNlIGZvciBjYWxsZWUncyBMUgkJNAl8IHwKKyAgIHwgICBTcGFjZSBmb3IgY2FsbGVlJ3MgTFIJCTQvOAl8IHwKICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfAlsb3dlciBhZGRyZXNzZXMKLSAgIHwgICBTYXZlZCBDUiAgICAgICAgICAgICAgICAgICAgICAgICA0ICAgICAgIHwgfAorICAgfCAgIFNhdmVkIENSIFtsb3cgd29yZCBmb3IgbTY0XSAgICAgIDQvOAl8IHwKICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfCAgICAgc3RhY2sgcG9pbnRlciBoZXJlCi0gICB8ICAgQ3VycmVudCBiYWNrY2hhaW4gcG9pbnRlcgk0CXwtLwlkdXJpbmcKKyAgIHwgICBDdXJyZW50IGJhY2tjaGFpbiBwb2ludGVyCTQvOAl8LS8JZHVyaW5nCiAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18ICAgPDw8CWZmaV9jYWxsX0RBUldJTgogCiAgICAqLwogCisjaWYgZGVmaW5lZChQT1dFUlBDX0RBUldJTjY0KQorc3RhdGljIHZvaWQKK2RhcndpbjY0X3Bhc3Nfc3RydWN0X2J5X3ZhbHVlIAorICAoZmZpX3R5cGUgKiwgY2hhciAqLCB1bnNpZ25lZCwgdW5zaWduZWQgKiwgZG91YmxlICoqLCB1bnNpZ25lZCBsb25nICoqKTsKKyNlbmRpZgorCisvKiBUaGlzIGRlcGVuZHMgb24gR1BSX1NJWkUgPSBzaXplb2YgKHVuc2lnbmVkIGxvbmcpICovCisKIHZvaWQKIGZmaV9wcmVwX2FyZ3MgKGV4dGVuZGVkX2NpZiAqZWNpZiwgdW5zaWduZWQgbG9uZyAqY29uc3Qgc3RhY2spCiB7CiAgIGNvbnN0IHVuc2lnbmVkIGJ5dGVzID0gZWNpZi0+Y2lmLT5ieXRlczsKICAgY29uc3QgdW5zaWduZWQgZmxhZ3MgPSBlY2lmLT5jaWYtPmZsYWdzOwogICBjb25zdCB1bnNpZ25lZCBuYXJncyA9IGVjaWYtPmNpZi0+bmFyZ3M7CisjaWYgIWRlZmluZWQoUE9XRVJQQ19EQVJXSU42NCkgCiAgIGNvbnN0IGZmaV9hYmkgYWJpID0gZWNpZi0+Y2lmLT5hYmk7CisjZW5kaWYKIAogICAvKiAnc3RhY2t0b3AnIHBvaW50cyBhdCB0aGUgcHJldmlvdXMgYmFja2NoYWluIHBvaW50ZXIuICAqLwogICB1bnNpZ25lZCBsb25nICpjb25zdCBzdGFja3RvcCA9IHN0YWNrICsgKGJ5dGVzIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKQEAgLTk0LDE4ICsxMTgsMTkgQEAKICAgLyogJ2Zwcl9iYXNlJyBwb2ludHMgYXQgdGhlIHNwYWNlIGZvciBmcHIxLCBhbmQgZ3Jvd3MgdXB3YXJkcyBhcwogICAgICB3ZSB1c2UgRlBSIHJlZ2lzdGVycy4gICovCiAgIGRvdWJsZSAqZnByX2Jhc2UgPSAoZG91YmxlICopIChzdGFja3RvcCAtIEFTTV9ORUVEU19SRUdJU1RFUlMpIC0gTlVNX0ZQUl9BUkdfUkVHSVNURVJTOwotICBpbnQgZnBhcmdfY291bnQgPSAwOwotCisgIGludCBncF9jb3VudCA9IDAsIGZwYXJnX2NvdW50ID0gMDsKIAogICAvKiAnbmV4dF9hcmcnIGdyb3dzIHVwIGFzIHdlIHB1dCBwYXJhbWV0ZXJzIGluIGl0LiAgKi8KLSAgdW5zaWduZWQgbG9uZyAqbmV4dF9hcmcgPSBzdGFjayArIDY7IC8qIDYgcmVzZXJ2ZWQgcG9zaXRpb25zLiAgKi8KKyAgdW5zaWduZWQgbG9uZyAqbmV4dF9hcmcgPSBzdGFjayArIExJTktBR0VfQVJFQV9HUFJTOyAvKiA2IHJlc2VydmVkIHBvc2l0aW9ucy4gICovCiAKICAgaW50IGk7CiAgIGRvdWJsZSBkb3VibGVfdG1wOwogICB2b2lkICoqcF9hcmd2ID0gZWNpZi0+YXZhbHVlOwogICB1bnNpZ25lZCBsb25nIGdwcnZhbHVlOwogICBmZmlfdHlwZSoqIHB0ciA9IGVjaWYtPmNpZi0+YXJnX3R5cGVzOworI2lmICFkZWZpbmVkKFBPV0VSUENfREFSV0lONjQpIAogICBjaGFyICpkZXN0X2NweTsKKyNlbmRpZgogICB1bnNpZ25lZCBzaXplX2FsID0gMDsKIAogICAvKiBDaGVjayB0aGF0IGV2ZXJ5dGhpbmcgc3RhcnRzIGFsaWduZWQgcHJvcGVybHkuICAqLwpAQCAtMTMwLDI1ICsxNTUsMzAgQEAKIAkgICB0aGUgc2l6ZSBvZiB0aGUgZmxvYXRpbmctcG9pbnQgcGFyYW1ldGVyIGFyZSBza2lwcGVkLiAgKi8KIAljYXNlIEZGSV9UWVBFX0ZMT0FUOgogCSAgZG91YmxlX3RtcCA9ICooZmxvYXQgKikgKnBfYXJndjsKLQkgIGlmIChmcGFyZ19jb3VudCA+PSBOVU1fRlBSX0FSR19SRUdJU1RFUlMpCi0JICAgICooZG91YmxlICopbmV4dF9hcmcgPSBkb3VibGVfdG1wOwotCSAgZWxzZQorCSAgaWYgKGZwYXJnX2NvdW50IDwgTlVNX0ZQUl9BUkdfUkVHSVNURVJTKQogCSAgICAqZnByX2Jhc2UrKyA9IGRvdWJsZV90bXA7CisjaWYgZGVmaW5lZChQT1dFUlBDX0RBUldJTikKKwkgICooZmxvYXQgKiluZXh0X2FyZyA9ICooZmxvYXQgKikgKnBfYXJndjsKKyNlbHNlCisJICAqKGRvdWJsZSAqKW5leHRfYXJnID0gZG91YmxlX3RtcDsKKyNlbmRpZgogCSAgbmV4dF9hcmcrKzsKKwkgIGdwX2NvdW50Kys7CiAJICBmcGFyZ19jb3VudCsrOwogCSAgRkZJX0FTU0VSVChmbGFncyAmIEZMQUdfRlBfQVJHVU1FTlRTKTsKIAkgIGJyZWFrOwogCiAJY2FzZSBGRklfVFlQRV9ET1VCTEU6CiAJICBkb3VibGVfdG1wID0gKihkb3VibGUgKikgKnBfYXJndjsKLQkgIGlmIChmcGFyZ19jb3VudCA+PSBOVU1fRlBSX0FSR19SRUdJU1RFUlMpCi0JICAgICooZG91YmxlICopbmV4dF9hcmcgPSBkb3VibGVfdG1wOwotCSAgZWxzZQorCSAgaWYgKGZwYXJnX2NvdW50IDwgTlVNX0ZQUl9BUkdfUkVHSVNURVJTKQogCSAgICAqZnByX2Jhc2UrKyA9IGRvdWJsZV90bXA7CisJICAqKGRvdWJsZSAqKW5leHRfYXJnID0gZG91YmxlX3RtcDsKICNpZmRlZiBQT1dFUlBDNjQKIAkgIG5leHRfYXJnKys7CisJICBncF9jb3VudCsrOwogI2Vsc2UKIAkgIG5leHRfYXJnICs9IDI7CisJICBncF9jb3VudCArPSAyOwogI2VuZGlmCiAJICBmcGFyZ19jb3VudCsrOwogCSAgRkZJX0FTU0VSVChmbGFncyAmIEZMQUdfRlBfQVJHVU1FTlRTKTsKQEAgLTE1NywzMCArMTg3LDQxIEBACiAjaWYgRkZJX1RZUEVfTE9OR0RPVUJMRSAhPSBGRklfVFlQRV9ET1VCTEUKIAogCWNhc2UgRkZJX1RZUEVfTE9OR0RPVUJMRToKLSNpZmRlZiBQT1dFUlBDNjQKKyMgIGlmIGRlZmluZWQoUE9XRVJQQzY0KSAmJiAhZGVmaW5lZChQT1dFUlBDX0RBUldJTjY0KQorCSAgLyogPz8/IFRoaXMgd2lsbCBleGNlZWQgdGhlIHJlZ3MgY291bnQgd2hlbiB0aGUgdmFsdWUgc3RhcnRzIGF0IGZwMTMKKwkgICAgIGFuZCBpdCB3aWxsIG5vdCBwdXQgdGhlIGV4dHJhIGJpdCBvbiB0aGUgc3RhY2suICAqLwogCSAgaWYgKGZwYXJnX2NvdW50IDwgTlVNX0ZQUl9BUkdfUkVHSVNURVJTKQogCSAgICAqKGxvbmcgZG91YmxlICopIGZwcl9iYXNlKysgPSAqKGxvbmcgZG91YmxlICopICpwX2FyZ3Y7CiAJICBlbHNlCiAJICAgICoobG9uZyBkb3VibGUgKikgbmV4dF9hcmcgPSAqKGxvbmcgZG91YmxlICopICpwX2FyZ3Y7CiAJICBuZXh0X2FyZyArPSAyOwogCSAgZnBhcmdfY291bnQgKz0gMjsKLSNlbHNlCisjICBlbHNlCiAJICBkb3VibGVfdG1wID0gKChkb3VibGUgKikgKnBfYXJndilbMF07CiAJICBpZiAoZnBhcmdfY291bnQgPCBOVU1fRlBSX0FSR19SRUdJU1RFUlMpCiAJICAgICpmcHJfYmFzZSsrID0gZG91YmxlX3RtcDsKLQkgIGVsc2UKLQkgICAgKihkb3VibGUgKikgbmV4dF9hcmcgPSBkb3VibGVfdG1wOworCSAgKihkb3VibGUgKikgbmV4dF9hcmcgPSBkb3VibGVfdG1wOworIyAgICBpZiBkZWZpbmVkKFBPV0VSUENfREFSV0lONjQpCisJICBuZXh0X2FyZysrOworCSAgZ3BfY291bnQrKzsKKyMgICAgZWxzZQogCSAgbmV4dF9hcmcgKz0gMjsKKwkgIGdwX2NvdW50ICs9IDI7CisjICAgIGVuZGlmCiAJICBmcGFyZ19jb3VudCsrOwotCiAJICBkb3VibGVfdG1wID0gKChkb3VibGUgKikgKnBfYXJndilbMV07CiAJICBpZiAoZnBhcmdfY291bnQgPCBOVU1fRlBSX0FSR19SRUdJU1RFUlMpCiAJICAgICpmcHJfYmFzZSsrID0gZG91YmxlX3RtcDsKLQkgIGVsc2UKLQkgICAgKihkb3VibGUgKikgbmV4dF9hcmcgPSBkb3VibGVfdG1wOworCSAgKihkb3VibGUgKikgbmV4dF9hcmcgPSBkb3VibGVfdG1wOworIyAgICBpZiBkZWZpbmVkKFBPV0VSUENfREFSV0lONjQpCisJICBuZXh0X2FyZysrOworCSAgZ3BfY291bnQrKzsKKyMgICAgZWxzZQogCSAgbmV4dF9hcmcgKz0gMjsKKwkgIGdwX2NvdW50ICs9IDI7CisjICAgIGVuZGlmCiAJICBmcGFyZ19jb3VudCsrOwotI2VuZGlmCisjICBlbmRpZgogCSAgRkZJX0FTU0VSVChmbGFncyAmIEZMQUdfRlBfQVJHVU1FTlRTKTsKIAkgIGJyZWFrOwogI2VuZGlmCkBAIC0xOTIsNiArMjMzLDcgQEAKICNlbHNlCiAJICAqKGxvbmcgbG9uZyAqKSBuZXh0X2FyZyA9ICoobG9uZyBsb25nICopICpwX2FyZ3Y7CiAJICBuZXh0X2FyZyArPSAyOworCSAgZ3BfY291bnQgKz0gMjsKICNlbmRpZgogCSAgYnJlYWs7CiAJY2FzZSBGRklfVFlQRV9QT0lOVEVSOgpAQCAtMjExLDMyICsyNTMsMzUgQEAKIAkgIGdvdG8gcHV0Z3ByOwogCiAJY2FzZSBGRklfVFlQRV9TVFJVQ1Q6Ci0jaWZkZWYgUE9XRVJQQzY0Ci0JICBkZXN0X2NweSA9IChjaGFyICopIG5leHRfYXJnOwogCSAgc2l6ZV9hbCA9ICgqcHRyKS0+c2l6ZTsKLQkgIGlmICgoKnB0ciktPmVsZW1lbnRzWzBdLT50eXBlID09IDMpCi0JICAgIHNpemVfYWwgPSBBTElHTigoKnB0ciktPnNpemUsIDgpOwotCSAgaWYgKHNpemVfYWwgPCAzICYmIGFiaSA9PSBGRklfREFSV0lOKQotCSAgICBkZXN0X2NweSArPSA0IC0gc2l6ZV9hbDsKLQotCSAgbWVtY3B5ICgoY2hhciAqKSBkZXN0X2NweSwgKGNoYXIgKikgKnBfYXJndiwgc2l6ZV9hbCk7Ci0JICBuZXh0X2FyZyArPSAoc2l6ZV9hbCArIDcpIC8gODsKKyNpZiBkZWZpbmVkKFBPV0VSUENfREFSV0lONjQpCisJICBuZXh0X2FyZyA9ICh1bnNpZ25lZCBsb25nICopQUxJR04oKGNoYXIgKiluZXh0X2FyZywgKCpwdHIpLT5hbGlnbm1lbnQpOworCSAgZGFyd2luNjRfcGFzc19zdHJ1Y3RfYnlfdmFsdWUgKCpwdHIsIChjaGFyICopICpwX2FyZ3YsIAorCQkJCQkgKHVuc2lnbmVkKSBzaXplX2FsLAorCQkJCQkgKHVuc2lnbmVkIGludCAqKSAmZnBhcmdfY291bnQsCisJCQkJCSAmZnByX2Jhc2UsICZuZXh0X2FyZyk7CiAjZWxzZQogCSAgZGVzdF9jcHkgPSAoY2hhciAqKSBuZXh0X2FyZzsKIAorCSAgLyogSWYgdGhlIGZpcnN0IG1lbWJlciBvZiB0aGUgc3RydWN0IGlzIGEgZG91YmxlLCB0aGVuIGluY2x1ZGUgZW5vdWdoCisJICAgICBwYWRkaW5nIGluIHRoZSBzdHJ1Y3Qgc2l6ZSB0byBhbGlnbiBpdCB0byBkb3VibGUtd29yZC4gICovCisJICBpZiAoKCpwdHIpLT5lbGVtZW50c1swXS0+dHlwZSA9PSBGRklfVFlQRV9ET1VCTEUpCisJICAgIHNpemVfYWwgPSBBTElHTigoKnB0ciktPnNpemUsIDgpOworCisjICBpZiBkZWZpbmVkKFBPV0VSUEM2NCkgCisJICBGRklfQVNTRVJUIChhYmkgIT0gRkZJX0RBUldJTik7CisJICBtZW1jcHkgKChjaGFyICopIGRlc3RfY3B5LCAoY2hhciAqKSAqcF9hcmd2LCBzaXplX2FsKTsKKwkgIG5leHRfYXJnICs9IChzaXplX2FsICsgNykgLyA4OworIyAgZWxzZQogCSAgLyogU3RydWN0dXJlcyB0aGF0IG1hdGNoIHRoZSBiYXNpYyBtb2RlcyAoUUkgMSBieXRlLCBISSAyIGJ5dGVzLAogCSAgICAgU0kgNCBieXRlcykgYXJlIGFsaWduZWQgYXMgaWYgdGhleSB3ZXJlIHRob3NlIG1vZGVzLgogCSAgICAgU3RydWN0dXJlcyB3aXRoIDMgYnl0ZSBpbiBzaXplIGFyZSBwYWRkZWQgdXB3YXJkcy4gICovCi0JICBzaXplX2FsID0gKCpwdHIpLT5zaXplOwotCSAgLyogSWYgdGhlIGZpcnN0IG1lbWJlciBvZiB0aGUgc3RydWN0IGlzIGEgZG91YmxlLCB0aGVuIGFsaWduCi0JICAgICB0aGUgc3RydWN0IHRvIGRvdWJsZS13b3JkLiAgKi8KLQkgIGlmICgoKnB0ciktPmVsZW1lbnRzWzBdLT50eXBlID09IEZGSV9UWVBFX0RPVUJMRSkKLQkgICAgc2l6ZV9hbCA9IEFMSUdOKCgqcHRyKS0+c2l6ZSwgOCk7CiAJICBpZiAoc2l6ZV9hbCA8IDMgJiYgYWJpID09IEZGSV9EQVJXSU4pCiAJICAgIGRlc3RfY3B5ICs9IDQgLSBzaXplX2FsOwogCiAJICBtZW1jcHkoKGNoYXIgKikgZGVzdF9jcHksIChjaGFyICopICpwX2FyZ3YsIHNpemVfYWwpOwogCSAgbmV4dF9hcmcgKz0gKHNpemVfYWwgKyAzKSAvIDQ7CisjICBlbmRpZgogI2VuZGlmCiAJICBicmVhazsKIApAQCAtMjQ5LDYgKzI5NCw3IEBACiAJICBncHJ2YWx1ZSA9ICoodW5zaWduZWQgaW50ICopICpwX2FyZ3Y7CiAJcHV0Z3ByOgogCSAgKm5leHRfYXJnKysgPSBncHJ2YWx1ZTsKKwkgIGdwX2NvdW50Kys7CiAJICBicmVhazsKIAlkZWZhdWx0OgogCSAgYnJlYWs7CkBAIC0yNTYsMTQgKzMwMiwyNzUgQEAKICAgICB9CiAKICAgLyogQ2hlY2sgdGhhdCB3ZSBkaWRuJ3Qgb3ZlcnJ1biB0aGUgc3RhY2suLi4gICovCi0gIC8vRkZJX0FTU0VSVChncHJfYmFzZSA8PSBzdGFja3RvcCAtIEFTTV9ORUVEU19SRUdJU1RFUlMpOwotICAvL0ZGSV9BU1NFUlQoKHVuc2lnbmVkICopZnByX2Jhc2UKLSAgLy8JICAgICA8PSBzdGFja3RvcCAtIEFTTV9ORUVEU19SRUdJU1RFUlMgLSBOVU1fR1BSX0FSR19SRUdJU1RFUlMpOwotICAvL0ZGSV9BU1NFUlQoZmxhZ3MgJiBGTEFHXzRfR1BSX0FSR1VNRU5UUyB8fCBpbnRhcmdfY291bnQgPD0gNCk7CisgIC8qIEZGSV9BU1NFUlQoZ3ByX2Jhc2UgPD0gc3RhY2t0b3AgLSBBU01fTkVFRFNfUkVHSVNURVJTKTsKKyAgICAgRkZJX0FTU0VSVCgodW5zaWduZWQgKilmcHJfYmFzZQorICAgICAJICAgICA8PSBzdGFja3RvcCAtIEFTTV9ORUVEU19SRUdJU1RFUlMgLSBOVU1fR1BSX0FSR19SRUdJU1RFUlMpOworICAgICBGRklfQVNTRVJUKGZsYWdzICYgRkxBR180X0dQUl9BUkdVTUVOVFMgfHwgaW50YXJnX2NvdW50IDw9IDQpOyAgKi8KIH0KIAorI2lmIGRlZmluZWQoUE9XRVJQQ19EQVJXSU42NCkKKworLyogU2VlIGlmIHdlIGNhbiBwdXQgc29tZSBvZiB0aGUgc3RydWN0IGludG8gZnBycy4KKyAgIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZm9yIHN0cnVjdHVyZXMgb2Ygc2l6ZSAxNiBieXRlcywgc2luY2UgdGhlc2UgYXJlIG5vdAorICAgYnJva2VuIG91dCB0aGlzIHdheS4gICovCitzdGF0aWMgdm9pZAorZGFyd2luNjRfc2Nhbl9zdHJ1Y3RfZm9yX2Zsb2F0cyAoZmZpX3R5cGUgKnMsIHVuc2lnbmVkICpuZnByKQoreworICBpbnQgaTsKKworICBGRklfQVNTRVJUIChzLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCkKKworICBmb3IgKGkgPSAwOyBzLT5lbGVtZW50c1tpXSAhPSBOVUxMOyBpKyspCisgICAgeworICAgICAgZmZpX3R5cGUgKnAgPSBzLT5lbGVtZW50c1tpXTsKKyAgICAgIHN3aXRjaCAocC0+dHlwZSkKKwl7CisJICBjYXNlIEZGSV9UWVBFX1NUUlVDVDoKKwkgICAgZGFyd2luNjRfc2Nhbl9zdHJ1Y3RfZm9yX2Zsb2F0cyAocCwgbmZwcik7CisJICAgIGJyZWFrOworCSAgY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFOgorCSAgICAoKm5mcHIpICs9IDI7CisJICAgIGJyZWFrOworCSAgY2FzZSBGRklfVFlQRV9ET1VCTEU6CisJICBjYXNlIEZGSV9UWVBFX0ZMT0FUOgorCSAgICAoKm5mcHIpICs9IDE7CisJICAgIGJyZWFrOworCSAgZGVmYXVsdDoKKwkgICAgYnJlYWs7ICAgIAorCX0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK2RhcndpbjY0X3N0cnVjdF9zaXplX2V4Y2VlZHNfZ3Byc19wIChmZmlfdHlwZSAqcywgY2hhciAqc3JjLCB1bnNpZ25lZCAqbmZwcikKK3sKKyAgdW5zaWduZWQgc3RydWN0X29mZnNldD0wLCBpOworCisgIGZvciAoaSA9IDA7IHMtPmVsZW1lbnRzW2ldICE9IE5VTEw7IGkrKykKKyAgICB7CisgICAgICBjaGFyICppdGVtX2Jhc2U7CisgICAgICBmZmlfdHlwZSAqcCA9IHMtPmVsZW1lbnRzW2ldOworICAgICAgLyogRmluZCB0aGUgc3RhcnQgb2YgdGhpcyBpdGVtICgwIGZvciB0aGUgZmlyc3Qgb25lKS4gICovCisgICAgICBpZiAoaSA+IDApCisgICAgICAgIHN0cnVjdF9vZmZzZXQgPSBBTElHTihzdHJ1Y3Rfb2Zmc2V0LCBwLT5hbGlnbm1lbnQpOworCisgICAgICBpdGVtX2Jhc2UgPSBzcmMgKyBzdHJ1Y3Rfb2Zmc2V0OworCisgICAgICBzd2l0Y2ggKHAtPnR5cGUpCisJeworCSAgY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisJICAgIGlmIChkYXJ3aW42NF9zdHJ1Y3Rfc2l6ZV9leGNlZWRzX2dwcnNfcCAocCwgaXRlbV9iYXNlLCBuZnByKSkKKwkgICAgICByZXR1cm4gMTsKKwkgICAgYnJlYWs7CisJICBjYXNlIEZGSV9UWVBFX0xPTkdET1VCTEU6CisJICAgIGlmICgqbmZwciA+PSBOVU1fRlBSX0FSR19SRUdJU1RFUlMpCisJICAgICAgcmV0dXJuIDE7CisJICAgICgqbmZwcikgKz0gMTsKKwkgICAgaXRlbV9iYXNlICs9IDg7CisJICAvKiBGQUxMIFRIUk9VR0ggKi8KKwkgIGNhc2UgRkZJX1RZUEVfRE9VQkxFOgorCSAgICBpZiAoKm5mcHIgPj0gTlVNX0ZQUl9BUkdfUkVHSVNURVJTKQorCSAgICAgIHJldHVybiAxOworCSAgICAoKm5mcHIpICs9IDE7CisJICAgIGJyZWFrOworCSAgY2FzZSBGRklfVFlQRV9GTE9BVDoKKwkgICAgaWYgKCpuZnByID49IE5VTV9GUFJfQVJHX1JFR0lTVEVSUykKKwkgICAgICByZXR1cm4gMTsKKwkgICAgKCpuZnByKSArPSAxOworCSAgICBicmVhazsKKwkgIGRlZmF1bHQ6CisJICAgIC8qIElmIHdlIHRyeSBhbmQgcGxhY2UgYW55IGl0ZW0sIHRoYXQgaXMgbm9uLWZsb2F0LCBvbmNlIHdlJ3ZlCisJICAgICAgIGV4Y2VlZGVkIHRoZSA4IEdQUiBtYXJrLCB0aGVuIHdlIGNhbid0IGZpdCB0aGUgc3RydWN0LiAgKi8KKwkgICAgaWYgKCh1bnNpZ25lZCBsb25nKWl0ZW1fYmFzZSA+PSA4KjgpIAorCSAgICAgIHJldHVybiAxOworCSAgICBicmVhazsgICAgCisJfQorICAgICAgLyogbm93IGNvdW50IHRoZSBzaXplIG9mIHdoYXQgd2UganVzdCB1c2VkLiAgKi8KKyAgICAgIHN0cnVjdF9vZmZzZXQgKz0gcC0+c2l6ZTsKKyAgICB9CisgIHJldHVybiAwOworfQorCisvKiBDYW4gdGhpcyBzdHJ1Y3QgYmUgcmV0dXJuZWQgYnkgdmFsdWU/ICAqLworaW50IAorZGFyd2luNjRfc3RydWN0X3JldF9ieV92YWx1ZV9wIChmZmlfdHlwZSAqcykKK3sKKyAgdW5zaWduZWQgbmZwID0gMDsKKworICBGRklfQVNTRVJUIChzICYmIHMtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKTsKKyAgCisgIC8qIFRoZSBsYXJnZXN0IHN0cnVjdHVyZSB3ZSBjYW4gcmV0dXJuIGlzIDhsb25nICsgMTMgZG91Ymxlcy4gICovCisgIGlmIChzLT5zaXplID4gMTY4KQorICAgIHJldHVybiAwOworICAKKyAgLyogV2UgY2FuJ3QgcGFzcyBtb3JlIHRoYW4gMTMgZmxvYXRzLiAgKi8KKyAgZGFyd2luNjRfc2Nhbl9zdHJ1Y3RfZm9yX2Zsb2F0cyAocywgJm5mcCk7CisgIGlmIChuZnAgPiAxMykKKyAgICByZXR1cm4gMDsKKyAgCisgIC8qIElmIHRoZXJlIGFyZSBub3QgdG9vIG1hbnkgZmxvYXRzLCBhbmQgdGhlIHN0cnVjdCBpcworICAgICBzbWFsbCBlbm91Z2ggdG8gYWNjb21tb2RhdGUgaW4gdGhlIEdQUnMsIHRoZW4gaXQgbXVzdCBiZSBPSy4gICovCisgIGlmIChzLT5zaXplIDw9IDY0KQorICAgIHJldHVybiAxOworICAKKyAgLyogV2VsbCwgd2UgaGF2ZSB0byBsb29rIGhhcmRlci4gICovCisgIG5mcCA9IDA7CisgIGlmIChkYXJ3aW42NF9zdHJ1Y3Rfc2l6ZV9leGNlZWRzX2dwcnNfcCAocywgTlVMTCwgJm5mcCkpCisgICAgcmV0dXJuIDA7CisgIAorICByZXR1cm4gMTsKK30KKwordm9pZAorZGFyd2luNjRfcGFzc19zdHJ1Y3RfZmxvYXRzIChmZmlfdHlwZSAqcywgY2hhciAqc3JjLCAKKwkJCSAgICAgdW5zaWduZWQgKm5mcHIsIGRvdWJsZSAqKmZwcnMpCit7CisgIGludCBpOworICBkb3VibGUgKmZwcl9iYXNlID0gKmZwcnM7CisgIHVuc2lnbmVkIHN0cnVjdF9vZmZzZXQgPSAwOworCisgIC8qIFdlIGRvbid0IGFzc3VtZSBhbnl0aGluZyBhYm91dCB0aGUgYWxpZ25tZW50IG9mIHRoZSBzb3VyY2UuICAqLworICBmb3IgKGkgPSAwOyBzLT5lbGVtZW50c1tpXSAhPSBOVUxMOyBpKyspCisgICAgeworICAgICAgY2hhciAqaXRlbV9iYXNlOworICAgICAgZmZpX3R5cGUgKnAgPSBzLT5lbGVtZW50c1tpXTsKKyAgICAgIC8qIEZpbmQgdGhlIHN0YXJ0IG9mIHRoaXMgaXRlbSAoMCBmb3IgdGhlIGZpcnN0IG9uZSkuICAqLworICAgICAgaWYgKGkgPiAwKQorICAgICAgICBzdHJ1Y3Rfb2Zmc2V0ID0gQUxJR04oc3RydWN0X29mZnNldCwgcC0+YWxpZ25tZW50KTsKKyAgICAgIGl0ZW1fYmFzZSA9IHNyYyArIHN0cnVjdF9vZmZzZXQ7CisKKyAgICAgIHN3aXRjaCAocC0+dHlwZSkKKwl7CisJICBjYXNlIEZGSV9UWVBFX1NUUlVDVDoKKwkgICAgZGFyd2luNjRfcGFzc19zdHJ1Y3RfZmxvYXRzIChwLCBpdGVtX2Jhc2UsIG5mcHIsCisJCQkJCSAgICZmcHJfYmFzZSk7CisJICAgIGJyZWFrOworCSAgY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFOgorCSAgICBpZiAoKm5mcHIgPCBOVU1fRlBSX0FSR19SRUdJU1RFUlMpCisJICAgICAgKmZwcl9iYXNlKysgPSAqKGRvdWJsZSAqKWl0ZW1fYmFzZTsKKwkgICAgKCpuZnByKSArPSAxOworCSAgICBpdGVtX2Jhc2UgKz0gODsKKwkgIC8qIEZBTEwgVEhST1VHSCAqLworCSAgY2FzZSBGRklfVFlQRV9ET1VCTEU6CisJICAgIGlmICgqbmZwciA8IE5VTV9GUFJfQVJHX1JFR0lTVEVSUykKKwkgICAgICAqZnByX2Jhc2UrKyA9ICooZG91YmxlICopaXRlbV9iYXNlOworCSAgICAoKm5mcHIpICs9IDE7CisJICAgIGJyZWFrOworCSAgY2FzZSBGRklfVFlQRV9GTE9BVDoKKwkgICAgaWYgKCpuZnByIDwgTlVNX0ZQUl9BUkdfUkVHSVNURVJTKQorCSAgICAgICpmcHJfYmFzZSsrID0gKGRvdWJsZSkgKihmbG9hdCAqKWl0ZW1fYmFzZTsKKwkgICAgKCpuZnByKSArPSAxOworCSAgICBicmVhazsKKwkgIGRlZmF1bHQ6CisJICAgIGJyZWFrOyAgICAKKwl9CisgICAgICAvKiBub3cgY291bnQgdGhlIHNpemUgb2Ygd2hhdCB3ZSBqdXN0IHVzZWQuICAqLworICAgICAgc3RydWN0X29mZnNldCArPSBwLT5zaXplOworICAgIH0KKyAgLyogVXBkYXRlIHRoZSBzY29yZXMuICAqLworICAqZnBycyA9IGZwcl9iYXNlOworfQorCisvKiBEYXJ3aW42NCBzcGVjaWFsIHJ1bGVzLgorICAgQnJlYWsgb3V0IGEgc3RydWN0IGludG8gcGFyYW1zIGFuZCBmbG9hdCByZWdpc3RlcnMuICAqLworc3RhdGljIHZvaWQKK2RhcndpbjY0X3Bhc3Nfc3RydWN0X2J5X3ZhbHVlIChmZmlfdHlwZSAqcywgY2hhciAqc3JjLCB1bnNpZ25lZCBzaXplLAorCQkJICAgICAgIHVuc2lnbmVkICpuZnByLCBkb3VibGUgKipmcHJzLCB1bnNpZ25lZCBsb25nICoqYXJnKQoreworICB1bnNpZ25lZCBsb25nICpuZXh0X2FyZyA9ICphcmc7CisgIGNoYXIgKmRlc3RfY3B5ID0gKGNoYXIgKiluZXh0X2FyZzsKKworICBGRklfQVNTRVJUIChzLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCkKKworICBpZiAoIXNpemUpCisgICAgcmV0dXJuOworCisgIC8qIEZpcnN0Li4uIHNwZWNpYWwgY2FzZXMuICAqLworICBpZiAoc2l6ZSA8IDMKKyAgICAgIHx8IChzaXplID09IDQgCisJICAmJiBzLT5lbGVtZW50c1swXSAKKwkgICYmIHMtPmVsZW1lbnRzWzBdLT50eXBlICE9IEZGSV9UWVBFX0ZMT0FUKSkKKyAgICB7CisgICAgICAvKiBNdXN0IGJlIGF0IGxlYXN0IG9uZSBHUFIsIHBhZGRpbmcgaXMgdW5zcGVjaWZpZWQgaW4gdmFsdWUsIAorCSBsZXQncyBtYWtlIGl0IHplcm8uICAqLworICAgICAgKm5leHRfYXJnID0gMFVMOyAKKyAgICAgIGRlc3RfY3B5ICs9IDggLSBzaXplOworICAgICAgbWVtY3B5ICgoY2hhciAqKSBkZXN0X2NweSwgc3JjLCBzaXplKTsKKyAgICAgIG5leHRfYXJnKys7CisgICAgfQorICBlbHNlIGlmIChzaXplID09IDE2KQorICAgIHsKKyAgICAgIG1lbWNweSAoKGNoYXIgKikgZGVzdF9jcHksIHNyYywgc2l6ZSk7CisgICAgICBuZXh0X2FyZyArPSAyOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIG5vdyB0aGUgZ2VuZXJhbCBjYXNlLCB3ZSBjb25zaWRlciBlbWJlZGRlZCBmbG9hdHMuICAqLworICAgICAgbWVtY3B5ICgoY2hhciAqKSBkZXN0X2NweSwgc3JjLCBzaXplKTsKKyAgICAgIGRhcndpbjY0X3Bhc3Nfc3RydWN0X2Zsb2F0cyAocywgc3JjLCBuZnByLCBmcHJzKTsKKyAgICAgIG5leHRfYXJnICs9IChzaXplKzcpLzg7CisgICAgfQorICAgIAorICAqYXJnID0gbmV4dF9hcmc7Cit9CisKK2RvdWJsZSAqCitkYXJ3aW42NF9zdHJ1Y3RfZmxvYXRzX3RvX21lbSAoZmZpX3R5cGUgKnMsIGNoYXIgKmRlc3QsIGRvdWJsZSAqZnBycywgdW5zaWduZWQgKm5mKQoreworICBpbnQgaTsKKyAgdW5zaWduZWQgc3RydWN0X29mZnNldCA9IDA7CisKKyAgLyogV2UgZG9uJ3QgYXNzdW1lIGFueXRoaW5nIGFib3V0IHRoZSBhbGlnbm1lbnQgb2YgdGhlIHNvdXJjZS4gICovCisgIGZvciAoaSA9IDA7IHMtPmVsZW1lbnRzW2ldICE9IE5VTEw7IGkrKykKKyAgICB7CisgICAgICBjaGFyICppdGVtX2Jhc2U7CisgICAgICBmZmlfdHlwZSAqcCA9IHMtPmVsZW1lbnRzW2ldOworICAgICAgLyogRmluZCB0aGUgc3RhcnQgb2YgdGhpcyBpdGVtICgwIGZvciB0aGUgZmlyc3Qgb25lKS4gICovCisgICAgICBpZiAoaSA+IDApCisgICAgICAgIHN0cnVjdF9vZmZzZXQgPSBBTElHTihzdHJ1Y3Rfb2Zmc2V0LCBwLT5hbGlnbm1lbnQpOworICAgICAgaXRlbV9iYXNlID0gZGVzdCArIHN0cnVjdF9vZmZzZXQ7CisKKyAgICAgIHN3aXRjaCAocC0+dHlwZSkKKwl7CisJICBjYXNlIEZGSV9UWVBFX1NUUlVDVDoKKwkgICAgZnBycyA9IGRhcndpbjY0X3N0cnVjdF9mbG9hdHNfdG9fbWVtIChwLCBpdGVtX2Jhc2UsIGZwcnMsIG5mKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIEZGSV9UWVBFX0xPTkdET1VCTEU6CisJICAgIGlmICgqbmYgPCBOVU1fRlBSX0FSR19SRUdJU1RFUlMpCisJICAgICAgeworCQkqKGRvdWJsZSAqKWl0ZW1fYmFzZSA9ICpmcHJzKysgOworCQkoKm5mKSArPSAxOworCSAgICAgIH0KKwkgICAgaXRlbV9iYXNlICs9IDg7CisJICAvKiBGQUxMIFRIUk9VR0ggKi8KKwkgIGNhc2UgRkZJX1RZUEVfRE9VQkxFOgorCSAgICBpZiAoKm5mIDwgTlVNX0ZQUl9BUkdfUkVHSVNURVJTKQorCSAgICAgIHsKKwkJKihkb3VibGUgKilpdGVtX2Jhc2UgPSAqZnBycysrIDsKKwkJKCpuZikgKz0gMTsKKwkgICAgICB9CisJICAgIGJyZWFrOworCSAgY2FzZSBGRklfVFlQRV9GTE9BVDoKKwkgICAgaWYgKCpuZiA8IE5VTV9GUFJfQVJHX1JFR0lTVEVSUykKKwkgICAgICB7CisJCSooZmxvYXQgKilpdGVtX2Jhc2UgPSAoZmxvYXQpICpmcHJzKysgOworCQkoKm5mKSArPSAxOworCSAgICAgIH0KKwkgICAgYnJlYWs7CisJICBkZWZhdWx0OgorCSAgICBicmVhazsgICAgCisJfQorICAgICAgLyogbm93IGNvdW50IHRoZSBzaXplIG9mIHdoYXQgd2UganVzdCB1c2VkLiAgKi8KKyAgICAgIHN0cnVjdF9vZmZzZXQgKz0gcC0+c2l6ZTsKKyAgICB9CisgIHJldHVybiBmcHJzOworfQorCisjZW5kaWYKKwogLyogQWRqdXN0IHRoZSBzaXplIG9mIFMgdG8gYmUgY29ycmVjdCBmb3IgRGFyd2luLgotICAgT24gRGFyd2luLCB0aGUgZmlyc3QgZmllbGQgb2YgYSBzdHJ1Y3R1cmUgaGFzIG5hdHVyYWwgYWxpZ25tZW50LiAgKi8KKyAgIE9uIERhcndpbiBtMzIsIHRoZSBmaXJzdCBmaWVsZCBvZiBhIHN0cnVjdHVyZSBoYXMgbmF0dXJhbCBhbGlnbm1lbnQuICAKKyAgIE9uIERhcndpbiBtNjQsIGFsbCBmaWVsZHMgaGF2ZSBuYXR1cmFsIGFsaWdubWVudC4gICovCiAKIHN0YXRpYyB2b2lkCiBkYXJ3aW5fYWRqdXN0X2FnZ3JlZ2F0ZV9zaXplcyAoZmZpX3R5cGUgKnMpCkBAIC0yODAsMjIgKzU4NywyOSBAQAogICAgICAgaW50IGFsaWduOwogICAgICAgCiAgICAgICBwID0gcy0+ZWxlbWVudHNbaV07Ci0gICAgICBkYXJ3aW5fYWRqdXN0X2FnZ3JlZ2F0ZV9zaXplcyAocCk7Ci0gICAgICBpZiAoaSA9PSAwCi0JICAmJiAocC0+dHlwZSA9PSBGRklfVFlQRV9VSU5UNjQKLQkgICAgICB8fCBwLT50eXBlID09IEZGSV9UWVBFX1NJTlQ2NAotCSAgICAgIHx8IHAtPnR5cGUgPT0gRkZJX1RZUEVfRE9VQkxFCi0JICAgICAgfHwgcC0+YWxpZ25tZW50ID09IDgpKQotCWFsaWduID0gODsKKyAgICAgIGlmIChwLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCkKKwlkYXJ3aW5fYWRqdXN0X2FnZ3JlZ2F0ZV9zaXplcyAocCk7CisjaWYgZGVmaW5lZChQT1dFUlBDX0RBUldJTjY0KQorICAgICAgLyogTmF0dXJhbCBhbGlnbm1lbnQgZm9yIGFsbCBpdGVtcy4gICovCisgICAgICBhbGlnbiA9IHAtPmFsaWdubWVudDsKKyNlbHNlCisgICAgICAvKiBOYXRydWFsIGFsaWdubWVudCBmb3IgdGhlIGZpcnN0IGl0ZW0uLi4gKi8KKyAgICAgIGlmIChpID09IDApCisJYWxpZ24gPSBwLT5hbGlnbm1lbnQ7CiAgICAgICBlbHNlIGlmIChwLT5hbGlnbm1lbnQgPT0gMTYgfHwgcC0+YWxpZ25tZW50IDwgNCkKKwkvKiAuLiBzdWJzZXF1ZW50IGl0ZW1zIHdpdGggdmVjdG9yIG9yIGFsaWduIDwgNCBoYXZlIG5hdHVyYWwgYWxpZ24uICAqLwogCWFsaWduID0gcC0+YWxpZ25tZW50OwogICAgICAgZWxzZQorCS8qIC4uIG9yIGFsaWduIGlzIDQuICAqLwogCWFsaWduID0gNDsKKyNlbmRpZgorICAgICAgLyogUGFkLCBpZiBuZWNlc3NhcnksIGJlZm9yZSBhZGRpbmcgdGhlIGN1cnJlbnQgaXRlbS4gICovCiAgICAgICBzLT5zaXplID0gQUxJR04ocy0+c2l6ZSwgYWxpZ24pICsgcC0+c2l6ZTsKICAgICB9CiAgIAogICBzLT5zaXplID0gQUxJR04ocy0+c2l6ZSwgcy0+YWxpZ25tZW50KTsKICAgCisgIC8qIFRoaXMgc2hvdWxkIG5vdCBiZSBuZWNlc3Nhcnkgb24gbTY0LCBidXQgaGFybWxlc3MuICAqLwogICBpZiAocy0+ZWxlbWVudHNbMF0tPnR5cGUgPT0gRkZJX1RZUEVfVUlOVDY0CiAgICAgICB8fCBzLT5lbGVtZW50c1swXS0+dHlwZSA9PSBGRklfVFlQRV9TSU5UNjQKICAgICAgIHx8IHMtPmVsZW1lbnRzWzBdLT50eXBlID09IEZGSV9UWVBFX0RPVUJMRQpAQCAtMzQ0LDEwICs2NTgsMTAgQEAKIGZmaV9wcmVwX2NpZl9tYWNoZGVwIChmZmlfY2lmICpjaWYpCiB7CiAgIC8qIEFsbCB0aGlzIGlzIGZvciB0aGUgREFSV0lOIEFCSS4gICovCi0gIGludCBpOworICB1bnNpZ25lZCBpOwogICBmZmlfdHlwZSAqKnB0cjsKICAgdW5zaWduZWQgYnl0ZXM7Ci0gIGludCBmcGFyZ19jb3VudCA9IDAsIGludGFyZ19jb3VudCA9IDA7CisgIHVuc2lnbmVkIGZwYXJnX2NvdW50ID0gMCwgaW50YXJnX2NvdW50ID0gMDsKICAgdW5zaWduZWQgZmxhZ3MgPSAwOwogICB1bnNpZ25lZCBzaXplX2FsID0gMDsKIApAQCAtMzcyLDE2ICs2ODYsMjUgQEAKICAgLyogU3BhY2UgZm9yIHRoZSBmcmFtZSBwb2ludGVyLCBjYWxsZWUncyBMUiwgQ1IsIGV0YywgYW5kIGZvcgogICAgICB0aGUgYXNtJ3MgdGVtcCByZWdzLiAgKi8KIAotICBieXRlcyA9ICg2ICsgQVNNX05FRURTX1JFR0lTVEVSUykgKiBzaXplb2YobG9uZyk7CisgIGJ5dGVzID0gKExJTktBR0VfQVJFQV9HUFJTICsgQVNNX05FRURTX1JFR0lTVEVSUykgKiBzaXplb2YodW5zaWduZWQgbG9uZyk7CiAKLSAgLyogUmV0dXJuIHZhbHVlIGhhbmRsaW5nLiAgVGhlIHJ1bGVzIGFyZSBhcyBmb2xsb3dzOgorICAvKiBSZXR1cm4gdmFsdWUgaGFuZGxpbmcuICAKKyAgICBUaGUgcnVsZXMgbTMyIGFyZSBhcyBmb2xsb3dzOgogICAgICAtIDMyLWJpdCAob3IgbGVzcykgaW50ZWdlciB2YWx1ZXMgYXJlIHJldHVybmVkIGluIGdwcjM7Ci0gICAgIC0gU3RydWN0dXJlcyBvZiBzaXplIDw9IDQgYnl0ZXMgYWxzbyByZXR1cm5lZCBpbiBncHIzOwotICAgICAtIDY0LWJpdCBpbnRlZ2VyIHZhbHVlcyBhbmQgc3RydWN0dXJlcyBiZXR3ZWVuIDUgYW5kIDggYnl0ZXMgYXJlIHJldHVybmVkCi0gICAgICAgaW4gZ3ByMyBhbmQgZ3ByNDsKKyAgICAgLSBzdHJ1Y3R1cmVzIG9mIHNpemUgPD0gNCBieXRlcyBhbHNvIHJldHVybmVkIGluIGdwcjM7CisgICAgIC0gNjQtYml0IGludGVnZXIgdmFsdWVzIFs/Pz8gYW5kIHN0cnVjdHVyZXMgYmV0d2VlbiA1IGFuZCA4IGJ5dGVzXSBhcmUKKyAgICAgICByZXR1cm5lZCBpbiBncHIzIGFuZCBncHI0OwogICAgICAtIFNpbmdsZS9kb3VibGUgRlAgdmFsdWVzIGFyZSByZXR1cm5lZCBpbiBmcHIxOwogICAgICAtIExvbmcgZG91YmxlIEZQIChpZiBub3QgZXF1aXZhbGVudCB0byBkb3VibGUpIHZhbHVlcyBhcmUgcmV0dXJuZWQgaW4KICAgICAgICBmcHIxIGFuZCBmcHIyOworICAgICBtNjQ6CisgICAgIC0gNjQtYml0IG9yIHNtYWxsZXIgaW50ZWdyYWwgdmFsdWVzIGFyZSByZXR1cm5lZCBpbiBHUFIzCisgICAgIC0gU2luZ2xlL2RvdWJsZSBGUCB2YWx1ZXMgYXJlIHJldHVybmVkIGluIGZwcjE7CisgICAgIC0gTG9uZyBkb3VibGUgRlAgdmFsdWVzIGFyZSByZXR1cm5lZCBpbiBmcHIxIGFuZCBmcHIyOworICAgICBtNjQgU3RydWN0dXJlczoKKyAgICAgLSBJZiB0aGUgc3RydWN0dXJlIGNvdWxkIGJlIGFjY29tbW9kYXRlZCBpbiByZWdpc3RlcnMgd2VyZSBpdCB0byBiZSB0aGUKKyAgICAgICBmaXJzdCBhcmd1bWVudCB0byBhIHJvdXRpbmUsIHRoZW4gaXQgaXMgcmV0dXJuZWQgaW4gdGhvc2UgcmVnaXN0ZXJzLgorICAgICBtMzIvbTY0IHN0cnVjdHVyZXMgb3RoZXJ3aXNlOgogICAgICAtIExhcmdlciBzdHJ1Y3R1cmVzIHZhbHVlcyBhcmUgYWxsb2NhdGVkIHNwYWNlIGFuZCBhIHBvaW50ZXIgaXMgcGFzc2VkCiAgICAgICAgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LiAgKi8KICAgc3dpdGNoIChjaWYtPnJ0eXBlLT50eXBlKQpAQCAtNDEwLDkgKzczMyw0MiBAQAogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEZGSV9UWVBFX1NUUlVDVDoKKyNpZiBkZWZpbmVkKFBPV0VSUENfREFSV0lONjQpCisgICAgICB7CisJLyogQ2FuIHdlIGZpdCB0aGUgc3RydWN0IGludG8gcmVncz8gICovCisJaWYgKGRhcndpbjY0X3N0cnVjdF9yZXRfYnlfdmFsdWVfcCAoY2lmLT5ydHlwZSkpCisJICB7CisJICAgIHVuc2lnbmVkIG5mcHIgPSAwOworCSAgICBmbGFncyB8PSBGTEFHX1JFVFVSTlNfU1RSVUNUOworCSAgICBpZiAoY2lmLT5ydHlwZS0+c2l6ZSAhPSAxNikKKwkgICAgICBkYXJ3aW42NF9zY2FuX3N0cnVjdF9mb3JfZmxvYXRzIChjaWYtPnJ0eXBlLCAmbmZwcikgOworCSAgICBlbHNlCisJICAgICAgZmxhZ3MgfD0gRkxBR19SRVRVUk5TXzEyOEJJVFM7CisJICAgIC8qIFdpbGwgYmUgMCBmb3IgMTZieXRlIHN0cnVjdC4gICovCisJICAgIGlmIChuZnByKQorCSAgICAgIGZsYWdzIHw9IEZMQUdfUkVUVVJOU19GUDsKKwkgIH0KKwllbHNlIC8qIEJ5IHJlZi4gKi8KKwkgIHsKKwkgICAgZmxhZ3MgfD0gRkxBR19SRVRWQUxfUkVGRVJFTkNFOworCSAgICBmbGFncyB8PSBGTEFHX1JFVFVSTlNfTk9USElORzsKKwkgICAgaW50YXJnX2NvdW50Kys7CisJICB9CisgICAgICB9CisjZWxpZiBkZWZpbmVkKERBUldJTl9QUEMpCisgICAgICBpZiAoY2lmLT5ydHlwZS0+c2l6ZSA8PSA0KQorCWZsYWdzIHw9IEZMQUdfUkVUVVJOU19TVFJVQ1Q7CisgICAgICBlbHNlIC8qIGVsc2UgYnkgcmVmZXJlbmNlLiAgKi8KKwl7CisJICBmbGFncyB8PSBGTEFHX1JFVFZBTF9SRUZFUkVOQ0U7CisJICBmbGFncyB8PSBGTEFHX1JFVFVSTlNfTk9USElORzsKKwkgIGludGFyZ19jb3VudCsrOworCX0KKyNlbHNlIC8qIGFzc3VtZSB3ZSBwYXNzIGJ5IHJlZi4gICovCiAgICAgICBmbGFncyB8PSBGTEFHX1JFVFZBTF9SRUZFUkVOQ0U7CiAgICAgICBmbGFncyB8PSBGTEFHX1JFVFVSTlNfTk9USElORzsKICAgICAgIGludGFyZ19jb3VudCsrOworI2VuZGlmCiAgICAgICBicmVhazsKICAgICBjYXNlIEZGSV9UWVBFX1ZPSUQ6CiAgICAgICBmbGFncyB8PSBGTEFHX1JFVFVSTlNfTk9USElORzsKQEAgLTQyNSw1NyArNzgxLDgzIEBACiAKICAgLyogVGhlIGZpcnN0IE5VTV9HUFJfQVJHX1JFR0lTVEVSUyB3b3JkcyBvZiBpbnRlZ2VyIGFyZ3VtZW50cywgYW5kIHRoZQogICAgICBmaXJzdCBOVU1fRlBSX0FSR19SRUdJU1RFUlMgZnAgYXJndW1lbnRzLCBnbyBpbiByZWdpc3RlcnM7IHRoZSByZXN0Ci0gICAgIGdvZXMgb24gdGhlIHN0YWNrLiAgU3RydWN0dXJlcyBhcmUgcGFzc2VkIGFzIGEgcG9pbnRlciB0byBhIGNvcHkgb2YKLSAgICAgdGhlIHN0cnVjdHVyZS4gU3R1ZmYgb24gdGhlIHN0YWNrIG5lZWRzIHRvIGtlZXAgcHJvcGVyIGFsaWdubWVudC4gICovCisgICAgIGdvZXMgb24gdGhlIHN0YWNrLiAgCisgICAgID8/PyBTdHJ1Y3R1cmVzIGFyZSBwYXNzZWQgYXMgYSBwb2ludGVyIHRvIGEgY29weSBvZiB0aGUgc3RydWN0dXJlLiAKKyAgICAgU3R1ZmYgb24gdGhlIHN0YWNrIG5lZWRzIHRvIGtlZXAgcHJvcGVyIGFsaWdubWVudC4gIAorICAgICBGb3IgbTY0IHRoZSBjb3VudCBpcyBlZmZlY3RpdmVseSBvZiBoYWxmLUdQUnMuICAqLwogICBmb3IgKHB0ciA9IGNpZi0+YXJnX3R5cGVzLCBpID0gY2lmLT5uYXJnczsgaSA+IDA7IGktLSwgcHRyKyspCiAgICAgeworICAgICAgdW5zaWduZWQgYWxpZ25fd29yZHM7CiAgICAgICBzd2l0Y2ggKCgqcHRyKS0+dHlwZSkKIAl7CiAJY2FzZSBGRklfVFlQRV9GTE9BVDoKIAljYXNlIEZGSV9UWVBFX0RPVUJMRToKIAkgIGZwYXJnX2NvdW50Kys7CisjaWYgIWRlZmluZWQoUE9XRVJQQ19EQVJXSU42NCkKIAkgIC8qIElmIHRoaXMgRlAgYXJnIGlzIGdvaW5nIG9uIHRoZSBzdGFjaywgaXQgbXVzdCBiZQogCSAgICAgOC1ieXRlLWFsaWduZWQuICAqLwogCSAgaWYgKGZwYXJnX2NvdW50ID4gTlVNX0ZQUl9BUkdfUkVHSVNURVJTCi0JICAgICAgJiYgaW50YXJnX2NvdW50JTIgIT0gMCkKKwkgICAgICAmJiAoaW50YXJnX2NvdW50ICYgMHgwMSkgIT0gMCkKIAkgICAgaW50YXJnX2NvdW50Kys7CisjZW5kaWYKIAkgIGJyZWFrOwogCiAjaWYgRkZJX1RZUEVfTE9OR0RPVUJMRSAhPSBGRklfVFlQRV9ET1VCTEUKLQogCWNhc2UgRkZJX1RZUEVfTE9OR0RPVUJMRToKIAkgIGZwYXJnX2NvdW50ICs9IDI7CiAJICAvKiBJZiB0aGlzIEZQIGFyZyBpcyBnb2luZyBvbiB0aGUgc3RhY2ssIGl0IG11c3QgYmUKLQkgICAgIDgtYnl0ZS1hbGlnbmVkLiAgKi8KLQkgIGlmIChmcGFyZ19jb3VudCA+IE5VTV9GUFJfQVJHX1JFR0lTVEVSUwotCSAgICAgICYmIGludGFyZ19jb3VudCUyICE9IDApCi0JICAgIGludGFyZ19jb3VudCsrOwotCSAgaW50YXJnX2NvdW50ICs9MjsKKwkgICAgIDE2LWJ5dGUtYWxpZ25lZC4gICovCisJICBpZiAoZnBhcmdfY291bnQgPj0gTlVNX0ZQUl9BUkdfUkVHSVNURVJTKQorI2lmIGRlZmluZWQgKFBPV0VSUEM2NCkKKwkgICAgaW50YXJnX2NvdW50ID0gQUxJR04oaW50YXJnX2NvdW50LCAyKTsKKyNlbHNlCisJICAgIGludGFyZ19jb3VudCA9IEFMSUdOKGludGFyZ19jb3VudCwgNCk7CisjZW5kaWYKIAkgIGJyZWFrOwogI2VuZGlmCiAKIAljYXNlIEZGSV9UWVBFX1VJTlQ2NDoKIAljYXNlIEZGSV9UWVBFX1NJTlQ2NDoKKyNpZiBkZWZpbmVkKFBPV0VSUEM2NCkKKwkgIGludGFyZ19jb3VudCsrOworI2Vsc2UKIAkgIC8qICdsb25nIGxvbmcnIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGFzIHR3byB3b3JkcywgYnV0CiAJICAgICBlaXRoZXIgYm90aCB3b3JkcyBtdXN0IGZpdCBpbiByZWdpc3RlcnMgb3IgYm90aCBnbwogCSAgICAgb24gdGhlIHN0YWNrLiAgSWYgdGhleSBnbyBvbiB0aGUgc3RhY2ssIHRoZXkgbXVzdAogCSAgICAgYmUgOC1ieXRlLWFsaWduZWQuICAqLwogCSAgaWYgKGludGFyZ19jb3VudCA9PSBOVU1fR1BSX0FSR19SRUdJU1RFUlMtMQotCSAgICAgIHx8IChpbnRhcmdfY291bnQgPj0gTlVNX0dQUl9BUkdfUkVHSVNURVJTICYmIGludGFyZ19jb3VudCUyICE9IDApKQorCSAgICAgIHx8IChpbnRhcmdfY291bnQgPj0gTlVNX0dQUl9BUkdfUkVHSVNURVJTIAorCSAgICAgICAgICAmJiAoaW50YXJnX2NvdW50ICYgMHgwMSkgIT0gMCkpCiAJICAgIGludGFyZ19jb3VudCsrOwogCSAgaW50YXJnX2NvdW50ICs9IDI7CisjZW5kaWYKIAkgIGJyZWFrOwogCiAJY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CiAJICBzaXplX2FsID0gKCpwdHIpLT5zaXplOwotCSAgLyogSWYgdGhlIGZpcnN0IG1lbWJlciBvZiB0aGUgc3RydWN0IGlzIGEgZG91YmxlLCB0aGVuIGFsaWduCi0JICAgICB0aGUgc3RydWN0IHRvIGRvdWJsZS13b3JkLiAgKi8KLQkgIGlmICgoKnB0ciktPmVsZW1lbnRzWzBdLT50eXBlID09IEZGSV9UWVBFX0RPVUJMRSkKLQkgICAgc2l6ZV9hbCA9IEFMSUdOKCgqcHRyKS0+c2l6ZSwgOCk7Ci0jaWZkZWYgUE9XRVJQQzY0CisjaWYgZGVmaW5lZChQT1dFUlBDX0RBUldJTjY0KQorCSAgYWxpZ25fd29yZHMgPSAoKnB0ciktPmFsaWdubWVudCA+PiAzOworCSAgaWYgKGFsaWduX3dvcmRzKQorCSAgICBpbnRhcmdfY291bnQgPSBBTElHTihpbnRhcmdfY291bnQsIGFsaWduX3dvcmRzKTsKKwkgIC8qIEJhc2Ugc2l6ZSBvZiB0aGUgc3RydWN0LiAgKi8KIAkgIGludGFyZ19jb3VudCArPSAoc2l6ZV9hbCArIDcpIC8gODsKKwkgIC8qIElmIDE2IGJ5dGVzIHRoZW4gZG9uJ3Qgd29ycnkgYWJvdXQgZmxvYXRzLiAgKi8KKwkgIGlmIChzaXplX2FsICE9IDE2KQorCSAgICAvKiBTY2FuIHRocm91Z2ggZm9yIGZsb2F0cyB0byBiZSBwbGFjZWQgaW4gcmVncy4gICovCisJICAgIGRhcndpbjY0X3NjYW5fc3RydWN0X2Zvcl9mbG9hdHMgKCpwdHIsICZmcGFyZ19jb3VudCkgOwogI2Vsc2UKKwkgIGFsaWduX3dvcmRzID0gKCpwdHIpLT5hbGlnbm1lbnQgPj4gMjsKKwkgIGlmIChhbGlnbl93b3JkcykKKwkgICAgaW50YXJnX2NvdW50ID0gQUxJR04oaW50YXJnX2NvdW50LCBhbGlnbl93b3Jkcyk7CisJICAvKiBJZiB0aGUgZmlyc3QgbWVtYmVyIG9mIHRoZSBzdHJ1Y3QgaXMgYSBkb3VibGUsIHRoZW4gYWxpZ24KKwkgICAgIHRoZSBzdHJ1Y3QgdG8gZG91YmxlLXdvcmQuIAorCSAgaWYgKCgqcHRyKS0+ZWxlbWVudHNbMF0tPnR5cGUgPT0gRkZJX1RZUEVfRE9VQkxFKQorCSAgICBzaXplX2FsID0gQUxJR04oKCpwdHIpLT5zaXplLCA4KTsgKi8KKyMgIGlmZGVmIFBPV0VSUEM2NAorCSAgaW50YXJnX2NvdW50ICs9IChzaXplX2FsICsgNykgLyA4OworIyAgZWxzZQogCSAgaW50YXJnX2NvdW50ICs9IChzaXplX2FsICsgMykgLyA0OworIyAgZW5kaWYKICNlbmRpZgogCSAgYnJlYWs7CiAKQEAgLTQ5MCw5ICs4NzIsMTggQEAKICAgaWYgKGZwYXJnX2NvdW50ICE9IDApCiAgICAgZmxhZ3MgfD0gRkxBR19GUF9BUkdVTUVOVFM7CiAKKyNpZiBkZWZpbmVkKFBPV0VSUENfREFSV0lONjQpCisgIC8qIFNwYWNlIHRvIGltYWdlIHRoZSBGUFIgcmVnaXN0ZXJzLCBpZiBuZWVkZWQgLSB3aGljaCBpbmNsdWRlcyB3aGVuIHRoZXkgbWlnaHQgYmUKKyAgICAgdXNlZCBpbiBhIHN0cnVjdCByZXR1cm4uICAqLworICBpZiAoZnBhcmdfY291bnQgIT0gMCAKKyAgICAgIHx8ICgoZmxhZ3MgJiBGTEFHX1JFVFVSTlNfU1RSVUNUKQorCSAgICYmIChmbGFncyAmIEZMQUdfUkVUVVJOU19GUCkpKQorICAgIGJ5dGVzICs9IE5VTV9GUFJfQVJHX1JFR0lTVEVSUyAqIHNpemVvZihkb3VibGUpOworI2Vsc2UKICAgLyogU3BhY2UgZm9yIHRoZSBGUFIgcmVnaXN0ZXJzLCBpZiBuZWVkZWQuICAqLwogICBpZiAoZnBhcmdfY291bnQgIT0gMCkKICAgICBieXRlcyArPSBOVU1fRlBSX0FSR19SRUdJU1RFUlMgKiBzaXplb2YoZG91YmxlKTsKKyNlbmRpZgogCiAgIC8qIFN0YWNrIHNwYWNlLiAgKi8KICNpZmRlZiBQT1dFUlBDNjQKQEAgLTUwNiw3ICs4OTcsNyBAQAogICAgIGJ5dGVzICs9IE5VTV9HUFJfQVJHX1JFR0lTVEVSUyAqIHNpemVvZihsb25nKTsKIAogICAvKiBUaGUgc3RhY2sgc3BhY2UgYWxsb2NhdGVkIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgMTYgYnl0ZXMuICAqLwotICBieXRlcyA9IChieXRlcyArIDE1KSAmIH4weEY7CisgIGJ5dGVzID0gQUxJR04oYnl0ZXMsIDE2KSA7CiAKICAgY2lmLT5mbGFncyA9IGZsYWdzOwogICBjaWYtPmJ5dGVzID0gYnl0ZXM7CkBAIC01MTYsOCArOTA3LDkgQEAKIAogZXh0ZXJuIHZvaWQgZmZpX2NhbGxfQUlYKGV4dGVuZGVkX2NpZiAqLCBsb25nLCB1bnNpZ25lZCwgdW5zaWduZWQgKiwKIAkJCSB2b2lkICgqZm4pKHZvaWQpLCB2b2lkICgqZm4yKSh2b2lkKSk7CisKIGV4dGVybiB2b2lkIGZmaV9jYWxsX0RBUldJTihleHRlbmRlZF9jaWYgKiwgbG9uZywgdW5zaWduZWQsIHVuc2lnbmVkICosCi0JCQkgICAgdm9pZCAoKmZuKSh2b2lkKSwgdm9pZCAoKmZuMikodm9pZCkpOworCQkJICAgIHZvaWQgKCpmbikodm9pZCksIHZvaWQgKCpmbjIpKHZvaWQpLCBmZmlfdHlwZSopOwogCiB2b2lkCiBmZmlfY2FsbCAoZmZpX2NpZiAqY2lmLCB2b2lkICgqZm4pKHZvaWQpLCB2b2lkICpydmFsdWUsIHZvaWQgKiphdmFsdWUpCkBAIC01NDIsMTEgKzkzNCwxMSBAQAogICAgIHsKICAgICBjYXNlIEZGSV9BSVg6CiAgICAgICBmZmlfY2FsbF9BSVgoJmVjaWYsIC0obG9uZyljaWYtPmJ5dGVzLCBjaWYtPmZsYWdzLCBlY2lmLnJ2YWx1ZSwgZm4sCi0JCSAgIGZmaV9wcmVwX2FyZ3MpOworCQkgICBGRklfRk4oZmZpX3ByZXBfYXJncykpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBGRklfREFSV0lOOgogICAgICAgZmZpX2NhbGxfREFSV0lOKCZlY2lmLCAtKGxvbmcpY2lmLT5ieXRlcywgY2lmLT5mbGFncywgZWNpZi5ydmFsdWUsIGZuLAotCQkgICAgICBmZmlfcHJlcF9hcmdzKTsKKwkJICAgICAgRkZJX0ZOKGZmaV9wcmVwX2FyZ3MpLCBjaWYtPnJ0eXBlKTsKICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICBGRklfQVNTRVJUKDApOwpAQCAtNTY2LDU4ICs5NTgsNDggQEAKIH0gYWl4X2ZkOwogCiAvKiBoZXJlIEknZCBsaWtlIHRvIGFkZCB0aGUgc3RhY2sgZnJhbWUgbGF5b3V0IHdlIHVzZSBpbiBkYXJ3aW5fY2xvc3VyZS5TCi0gICBhbmQgYWl4X2Nsc291cmUuUworICAgYW5kIGFpeF9jbG9zdXJlLlMKIAotICAgU1AgcHJldmlvdXMgLT4gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgPC0tLSBjaGlsZCBmcmFtZQotCQkgIHwgYmFjayBjaGFpbiB0byBjYWxsZXIgNCAgICAgICAgICAgICAgICB8Ci0JCSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgNAotCQkgIHwgc2F2ZWQgQ1IgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0JCSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgOAotCQkgIHwgc2F2ZWQgTFIgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0JCSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgMTIKLQkJICB8IHJlc2VydmVkIGZvciBjb21waWxlcnMgNCAgICAgICAgICAgICAgfAotCQkgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIDE2Ci0JCSAgfCByZXNlcnZlZCBmb3IgYmluZGVycyA0ICAgICAgICAgICAgICAgIHwKLQkJICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAyMAotCQkgIHwgc2F2ZWQgVE9DIHBvaW50ZXIgNCAgICAgICAgICAgICAgICAgICB8Ci0JCSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgMjQKLQkJICB8IGFsd2F5cyByZXNlcnZlZCA4KjQ9MzIgKHByZXZpb3VzIEdQUnMpfAotCQkgIHwgYWNjb3JkaW5nIHRvIHRoZSBsaW5rYWdlIGNvbnZlbnRpb24gICB8Ci0JCSAgfCBmcm9tIEFJWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLQkJICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyA1NgotCQkgIHwgb3VyIEZQUiBhcmVhIDEzKjg9MTA0ICAgICAgICAgICAgICAgICB8Ci0JCSAgfCBmMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLQkJICB8IC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotCQkgIHwgZjEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0JCSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgMTYwCi0JCSAgfCByZXN1bHQgYXJlYSA4ICAgICAgICAgICAgICAgICAgICAgICAgIHwKLQkJICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAxNjgKLQkJICB8IGFsaWduZW1lbnQgdG8gdGhlIG5leHQgbXVsdGlwbGUgb2YgMTYgfAotU1AgY3VycmVudCAtLT4gICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgMTc2IDwtIHBhcmVudCBmcmFtZQotCQkgIHwgYmFjayBjaGFpbiB0byBjYWxsZXIgNCAgICAgICAgICAgICAgICB8Ci0JCSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgMTgwCi0JCSAgfCBzYXZlZCBDUiA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLQkJICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAxODQKLQkJICB8IHNhdmVkIExSIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotCQkgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIDE4OAotCQkgIHwgcmVzZXJ2ZWQgZm9yIGNvbXBpbGVycyA0ICAgICAgICAgICAgICB8Ci0JCSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgMTkyCi0JCSAgfCByZXNlcnZlZCBmb3IgYmluZGVycyA0ICAgICAgICAgICAgICAgIHwKLQkJICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAxOTYKLQkJICB8IHNhdmVkIFRPQyBwb2ludGVyIDQgICAgICAgICAgICAgICAgICAgfAotCQkgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIDIwMAotCQkgIHwgYWx3YXlzIHJlc2VydmVkIDgqND0zMiAgd2Ugc3RvcmUgb3VyICB8Ci0JCSAgfCBHUFJzIGhlcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLQkJICB8IHIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotCQkgIHwgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0JCSAgfCByMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLQkJICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAyMzIKLQkJICB8IG92ZXJmbG93IHBhcnQgICAgICAgICAgICAgICAgICAgICAgICAgfAotCQkgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIHh4eAotCQkgIHwgPz8/PyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0JCSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgeHh4CisgICBtMzIvbTY0CisKKyAgIFRoZSBzdGFjayBsYXlvdXQgbG9va3MgbGlrZSB0aGlzOgorCisgICB8ICAgQWRkaXRpb25hbCBwYXJhbXMuLi4JCQl8IHwgICAgIEhpZ2hlciBhZGRyZXNzCisgICB+CQkJCQkJfiB+CisgICB8ICAgUGFyYW1ldGVycyAgICAgIChhdCBsZWFzdCA4KjQvOD0zMi82NCkJfCB8IE5VTV9HUFJfQVJHX1JFR0lTVEVSUworICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8CisgICB8ICAgVE9DPVIyIChBSVgpIFJlc2VydmVkIChEYXJ3aW4pICAgNC84CXwgfAorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8CisgICB8ICAgUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDIqNC84CXwgfAorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8CisgICB8ICAgU3BhY2UgZm9yIGNhbGxlZSdzIExSCQk0LzgJfCB8CisgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwKKyAgIHwgICBTYXZlZCBDUiBbbG93IHdvcmQgZm9yIG02NF0gICAgICA0LzgJfCB8CisgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwKKyAgIHwgICBDdXJyZW50IGJhY2tjaGFpbiBwb2ludGVyCTQvOAl8LS8gUGFyZW50J3MgZnJhbWUuCisgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IDwrIDw8PCBvbiBlbnRyeSB0byBmZmlfY2xvc3VyZV9BU00KKyAgIHwgICBSZXN1bHQgQnl0ZXMJCQkxNgl8IHwKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfAorICAgfiAgIHBhZGRpbmcgdG8gMTYtYnl0ZSBhbGlnbm1lbnQJCX4gfgorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8CisgICB8ICAgTlVNX0ZQUl9BUkdfUkVHSVNURVJTIHNsb3RzCQl8IHwKKyAgIHwgICBoZXJlIGZwMTMgLi4gZnAxCQkgICAgICAgMTMqOAl8IHwKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfAorICAgfCAgIFIzLi5SMTAJCQkgIDgqNC84PTMyLzY0CXwgfCBOVU1fR1BSX0FSR19SRUdJU1RFUlMKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfAorICAgfCAgIFRPQz1SMiAoQUlYKSBSZXNlcnZlZCAoRGFyd2luKSAgIDQvOAl8IHwKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfAlzdGFjawl8CisgICB8ICAgUmVzZXJ2ZWQgW2NvbXBpbGVyLGJpbmRlcl0gICAgIDIqNC84CXwgfAlncm93cwl8CisgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwJZG93bglWCisgICB8ICAgU3BhY2UgZm9yIGNhbGxlZSdzIExSCQk0LzgJfCB8CisgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwJbG93ZXIgYWRkcmVzc2VzCisgICB8ICAgU2F2ZWQgQ1IgW2xvdyB3b3JkIGZvciBtNjRdICAgICAgNC84CXwgfAorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8ICAgICBzdGFjayBwb2ludGVyIGhlcmUKKyAgIHwgICBDdXJyZW50IGJhY2tjaGFpbiBwb2ludGVyCTQvOAl8LS8JZHVyaW5nCisgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18ICAgPDw8CWZmaV9jbG9zdXJlX0FTTS4KIAogKi8KKwogZmZpX3N0YXR1cwogZmZpX3ByZXBfY2xvc3VyZV9sb2MgKGZmaV9jbG9zdXJlKiBjbG9zdXJlLAogCQkgICAgICBmZmlfY2lmKiBjaWYsCkBAIC02MzEsMzAgKzEwMTMsNDQgQEAKIAogICBzd2l0Y2ggKGNpZi0+YWJpKQogICAgIHsKLSAgICBjYXNlIEZGSV9EQVJXSU46CisgICAgICBjYXNlIEZGSV9EQVJXSU46CiAKLSAgICAgIEZGSV9BU1NFUlQgKGNpZi0+YWJpID09IEZGSV9EQVJXSU4pOworCUZGSV9BU1NFUlQgKGNpZi0+YWJpID09IEZGSV9EQVJXSU4pOwogCi0gICAgICB0cmFtcCA9ICh1bnNpZ25lZCBpbnQgKikgJmNsb3N1cmUtPnRyYW1wWzBdOwotICAgICAgdHJhbXBbMF0gPSAweDdjMDgwMmE2OyAgLyogICBtZmxyICAgIHIwICAqLwotICAgICAgdHJhbXBbMV0gPSAweDQyOWYwMDBkOyAgLyogICBiY2wtICAgIDIwLDQqY3I3K3NvLDB4MTAgICovCi0gICAgICB0cmFtcFs0XSA9IDB4N2Q2ODAyYTY7ICAvKiAgIG1mbHIgICAgcjExICAqLwotICAgICAgdHJhbXBbNV0gPSAweDgxOGIwMDAwOyAgLyogICBsd3ogICAgIHIxMiwwKHIxMSkgZnVuY3Rpb24gYWRkcmVzcyAgKi8KLSAgICAgIHRyYW1wWzZdID0gMHg3YzA4MDNhNjsgIC8qICAgbXRsciAgICByMCAgICovCi0gICAgICB0cmFtcFs3XSA9IDB4N2Q4OTAzYTY7ICAvKiAgIG10Y3RyICAgcjEyICAqLwotICAgICAgdHJhbXBbOF0gPSAweDgxNmIwMDA0OyAgLyogICBsd3ogICAgIHIxMSw0KHIxMSkgc3RhdGljIGNoYWluICAqLwotICAgICAgdHJhbXBbOV0gPSAweDRlODAwNDIwOyAgLyogICBiY3RyICAqLwotICAgICAgdHJhbXBbMl0gPSAodW5zaWduZWQgbG9uZykgZmZpX2Nsb3N1cmVfQVNNOyAvKiBmdW5jdGlvbiAgKi8KLSAgICAgIHRyYW1wWzNdID0gKHVuc2lnbmVkIGxvbmcpIGNvZGVsb2M7IC8qIGNvbnRleHQgICovCisJdHJhbXAgPSAodW5zaWduZWQgaW50ICopICZjbG9zdXJlLT50cmFtcFswXTsKKyNpZiBkZWZpbmVkKFBPV0VSUENfREFSV0lONjQpCisJdHJhbXBbMF0gPSAweDdjMDgwMmE2OyAgLyogICBtZmxyICAgIHIwICAqLworCXRyYW1wWzFdID0gMHg0MjlmMDAxNTsgIC8qICAgYmNsLSAgICAyMCw0KmNyNytzbywgICsweDE4IChMMSkgICovCisJLyogV2UgcHV0IHRoZSBhZGRyZXNzZXMgaGVyZS4gICovCisJdHJhbXBbNl0gPSAweDdkNjgwMmE2OyAgLypMMTogICBtZmxyICAgIHIxMSAgKi8KKwl0cmFtcFs3XSA9IDB4ZTk4YjAwMDA7ICAvKiAgIGxkICAgICByMTIsMChyMTEpIGZ1bmN0aW9uIGFkZHJlc3MgICovCisJdHJhbXBbOF0gPSAweDdjMDgwM2E2OyAgLyogICBtdGxyICAgIHIwICAgKi8KKwl0cmFtcFs5XSA9IDB4N2Q4OTAzYTY7ICAvKiAgIG10Y3RyICAgcjEyICAqLworCXRyYW1wWzEwXSA9IDB4ZTk2YjAwMDg7ICAvKiAgIGx3eiAgICAgcjExLDgocjExKSBzdGF0aWMgY2hhaW4gICovCisJdHJhbXBbMTFdID0gMHg0ZTgwMDQyMDsgIC8qICAgYmN0ciAgKi8KIAotICAgICAgY2xvc3VyZS0+Y2lmID0gY2lmOwotICAgICAgY2xvc3VyZS0+ZnVuID0gZnVuOwotICAgICAgY2xvc3VyZS0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOworCSooKHVuc2lnbmVkIGxvbmcgKikmdHJhbXBbMl0pID0gKHVuc2lnbmVkIGxvbmcpIGZmaV9jbG9zdXJlX0FTTTsgLyogZnVuY3Rpb24gICovCisJKigodW5zaWduZWQgbG9uZyAqKSZ0cmFtcFs0XSkgPSAodW5zaWduZWQgbG9uZykgY29kZWxvYzsgLyogY29udGV4dCAgKi8KKyNlbHNlCisJdHJhbXBbMF0gPSAweDdjMDgwMmE2OyAgLyogICBtZmxyICAgIHIwICAqLworCXRyYW1wWzFdID0gMHg0MjlmMDAwZDsgIC8qICAgYmNsLSAgICAyMCw0KmNyNytzbywweDEwICAqLworCXRyYW1wWzRdID0gMHg3ZDY4MDJhNjsgIC8qICAgbWZsciAgICByMTEgICovCisJdHJhbXBbNV0gPSAweDgxOGIwMDAwOyAgLyogICBsd3ogICAgIHIxMiwwKHIxMSkgZnVuY3Rpb24gYWRkcmVzcyAgKi8KKwl0cmFtcFs2XSA9IDB4N2MwODAzYTY7ICAvKiAgIG10bHIgICAgcjAgICAqLworCXRyYW1wWzddID0gMHg3ZDg5MDNhNjsgIC8qICAgbXRjdHIgICByMTIgICovCisJdHJhbXBbOF0gPSAweDgxNmIwMDA0OyAgLyogICBsd3ogICAgIHIxMSw0KHIxMSkgc3RhdGljIGNoYWluICAqLworCXRyYW1wWzldID0gMHg0ZTgwMDQyMDsgIC8qICAgYmN0ciAgKi8KKwl0cmFtcFsyXSA9ICh1bnNpZ25lZCBsb25nKSBmZmlfY2xvc3VyZV9BU007IC8qIGZ1bmN0aW9uICAqLworCXRyYW1wWzNdID0gKHVuc2lnbmVkIGxvbmcpIGNvZGVsb2M7IC8qIGNvbnRleHQgICovCisjZW5kaWYKKwljbG9zdXJlLT5jaWYgPSBjaWY7CisJY2xvc3VyZS0+ZnVuID0gZnVuOworCWNsb3N1cmUtPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKIAotICAgICAgLyogRmx1c2ggdGhlIGljYWNoZS4gT25seSBuZWNlc3Nhcnkgb24gRGFyd2luLiAgKi8KLSAgICAgIGZsdXNoX3JhbmdlKGNvZGVsb2MsIEZGSV9UUkFNUE9MSU5FX1NJWkUpOworCS8qIEZsdXNoIHRoZSBpY2FjaGUuIE9ubHkgbmVjZXNzYXJ5IG9uIERhcndpbi4gICovCisJZmx1c2hfcmFuZ2UoY29kZWxvYywgRkZJX1RSQU1QT0xJTkVfU0laRSk7CiAKLSAgICAgIGJyZWFrOworCWJyZWFrOwogCiAgICAgY2FzZSBGRklfQUlYOgogCkBAIC02NjksMTAgKzEwNjUsMTAgQEAKICAgICAgIGNsb3N1cmUtPmNpZiA9IGNpZjsKICAgICAgIGNsb3N1cmUtPmZ1biA9IGZ1bjsKICAgICAgIGNsb3N1cmUtPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKyAgICAgIGJyZWFrOwogCiAgICAgZGVmYXVsdDoKLQotICAgICAgRkZJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBGRklfQkFEX0FCSTsKICAgICAgIGJyZWFrOwogICAgIH0KICAgcmV0dXJuIEZGSV9PSzsKQEAgLTcwOCw3ICsxMTA0LDcgQEAKICAgZG91YmxlIGQ7CiB9IGZmaV9kYmxmbDsKIAotaW50CitmZmlfdHlwZSAqCiBmZmlfY2xvc3VyZV9oZWxwZXJfREFSV0lOIChmZmlfY2xvc3VyZSAqLCB2b2lkICosCiAJCQkgICB1bnNpZ25lZCBsb25nICosIGZmaV9kYmxmbCAqKTsKIApAQCAtNzE5LDcgKzExMTUsNyBAQAogICAgdXAgc3BhY2UgZm9yIGEgcmV0dXJuIHZhbHVlLCBmZmlfY2xvc3VyZV9BU00gaW52b2tlcyB0aGUKICAgIGZvbGxvd2luZyBoZWxwZXIgZnVuY3Rpb24gdG8gZG8gbW9zdCBvZiB0aGUgd29yay4gICovCiAKLWludAorZmZpX3R5cGUgKgogZmZpX2Nsb3N1cmVfaGVscGVyX0RBUldJTiAoZmZpX2Nsb3N1cmUgKmNsb3N1cmUsIHZvaWQgKnJ2YWx1ZSwKIAkJCSAgIHVuc2lnbmVkIGxvbmcgKnBnciwgZmZpX2RibGZsICpwZnIpCiB7CkBAIC03NDEsMTYgKzExMzcsMzIgQEAKICAgZmZpX2NpZiAqICAgICAgICBjaWY7CiAgIGZmaV9kYmxmbCAqICAgICAgZW5kX3BmciA9IHBmciArIE5VTV9GUFJfQVJHX1JFR0lTVEVSUzsKICAgdW5zaWduZWQgICAgICAgICBzaXplX2FsOworI2lmIGRlZmluZWQoUE9XRVJQQ19EQVJXSU42NCkKKyAgdW5zaWduZWQgCSAgIGZwc3VzZWQgPSAwOworI2VuZGlmCiAKICAgY2lmID0gY2xvc3VyZS0+Y2lmOwogICBhdmFsdWUgPSBhbGxvY2EgKGNpZi0+bmFyZ3MgKiBzaXplb2Yodm9pZCAqKSk7CiAKLSAgLyogQ29weSB0aGUgY2FsbGVyJ3Mgc3RydWN0dXJlIHJldHVybiB2YWx1ZSBhZGRyZXNzIHNvIHRoYXQgdGhlIGNsb3N1cmUKLSAgICAgcmV0dXJucyB0aGUgZGF0YSBkaXJlY3RseSB0byB0aGUgY2FsbGVyLiAgKi8KICAgaWYgKGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKQogICAgIHsKKyNpZiBkZWZpbmVkKFBPV0VSUENfREFSV0lONjQpCisgICAgICBpZiAoIWRhcndpbjY0X3N0cnVjdF9yZXRfYnlfdmFsdWVfcCAoY2lmLT5ydHlwZSkpCisJeworICAgIAkgIC8qIFdvbid0IGZpdCBpbnRvIHRoZSByZWdzIC0gcmV0dXJuIGJ5IHJlZi4gICovCisJICBydmFsdWUgPSAodm9pZCAqKSAqcGdyOworCSAgcGdyKys7CisJfQorI2VsaWYgZGVmaW5lZChEQVJXSU5fUFBDKQorICAgICAgaWYgKGNpZi0+cnR5cGUtPnNpemUgPiA0KQorCXsKKwkgIHJ2YWx1ZSA9ICh2b2lkICopICpwZ3I7CisJICBwZ3IrKzsKKwl9CisjZWxzZSAvKiBhc3N1bWUgd2UgcmV0dXJuIGJ5IHJlZi4gICovCiAgICAgICBydmFsdWUgPSAodm9pZCAqKSAqcGdyOwogICAgICAgcGdyKys7CisjZW5kaWYKICAgICB9CiAKICAgaSA9IDA7CkBAIC03NjQsNyArMTE3Niw3IEBACiAJewogCWNhc2UgRkZJX1RZUEVfU0lOVDg6CiAJY2FzZSBGRklfVFlQRV9VSU5UODoKLSNpZmRlZiBQT1dFUlBDNjQKKyNpZiAgZGVmaW5lZChQT1dFUlBDNjQpCiAJICBhdmFsdWVbaV0gPSAoY2hhciAqKSBwZ3IgKyA3OwogI2Vsc2UKIAkgIGF2YWx1ZVtpXSA9IChjaGFyICopIHBnciArIDM7CkBAIC03NzQsNyArMTE4Niw3IEBACiAKIAljYXNlIEZGSV9UWVBFX1NJTlQxNjoKIAljYXNlIEZGSV9UWVBFX1VJTlQxNjoKLSNpZmRlZiBQT1dFUlBDNjQKKyNpZiAgZGVmaW5lZChQT1dFUlBDNjQpCiAJICBhdmFsdWVbaV0gPSAoY2hhciAqKSBwZ3IgKyA2OwogI2Vsc2UKIAkgIGF2YWx1ZVtpXSA9IChjaGFyICopIHBnciArIDI7CkBAIC03ODQsNyArMTE5Niw3IEBACiAKIAljYXNlIEZGSV9UWVBFX1NJTlQzMjoKIAljYXNlIEZGSV9UWVBFX1VJTlQzMjoKLSNpZmRlZiBQT1dFUlBDNjQKKyNpZiAgZGVmaW5lZChQT1dFUlBDNjQpCiAJICBhdmFsdWVbaV0gPSAoY2hhciAqKSBwZ3IgKyA0OwogI2Vsc2UKIAljYXNlIEZGSV9UWVBFX1BPSU5URVI6CkBAIC03OTQsMzQgKzEyMDYsNTMgQEAKIAkgIGJyZWFrOwogCiAJY2FzZSBGRklfVFlQRV9TVFJVQ1Q6Ci0jaWZkZWYgUE9XRVJQQzY0CiAJICBzaXplX2FsID0gYXJnX3R5cGVzW2ldLT5zaXplOwotCSAgaWYgKGFyZ190eXBlc1tpXS0+ZWxlbWVudHNbMF0tPnR5cGUgPT0gRkZJX1RZUEVfRE9VQkxFKQotCSAgICBzaXplX2FsID0gQUxJR04gKGFyZ190eXBlc1tpXS0+c2l6ZSwgOCk7Ci0JICBpZiAoc2l6ZV9hbCA8IDMgJiYgY2lmLT5hYmkgPT0gRkZJX0RBUldJTikKLQkgICAgYXZhbHVlW2ldID0gKHZvaWQgKikgcGdyICsgOCAtIHNpemVfYWw7Ci0JICBlbHNlCi0JICAgIGF2YWx1ZVtpXSA9ICh2b2lkICopIHBncjsKKyNpZiBkZWZpbmVkKFBPV0VSUENfREFSV0lONjQpCisJICBwZ3IgPSAodW5zaWduZWQgbG9uZyAqKUFMSUdOKChjaGFyICopcGdyLCBhcmdfdHlwZXNbaV0tPmFsaWdubWVudCk7CisJICBpZiAoc2l6ZV9hbCA8IDMgfHwgc2l6ZV9hbCA9PSA0KQorCSAgICB7CisJICAgICAgYXZhbHVlW2ldID0gKChjaGFyICopcGdyKSs4LXNpemVfYWw7CisJICAgICAgaWYgKGFyZ190eXBlc1tpXS0+ZWxlbWVudHNbMF0tPnR5cGUgPT0gRkZJX1RZUEVfRkxPQVQKKwkJICAmJiBmcHN1c2VkIDwgTlVNX0ZQUl9BUkdfUkVHSVNURVJTKQorCQl7CisJCSAgKihmbG9hdCAqKXBnciA9IChmbG9hdCkgKihkb3VibGUgKilwZnI7CisJCSAgcGZyKys7CisJCSAgZnBzdXNlZCsrOworCQl9CisJICAgIH0KKwkgIGVsc2UgCisJICAgIHsKKwkgICAgICBpZiAoc2l6ZV9hbCAhPSAxNikKKwkJcGZyID0gKGZmaV9kYmxmbCAqKSAKKwkJICAgIGRhcndpbjY0X3N0cnVjdF9mbG9hdHNfdG9fbWVtIChhcmdfdHlwZXNbaV0sIChjaGFyICopcGdyLAorCQkJCQkJICAgKGRvdWJsZSAqKXBmciwgJmZwc3VzZWQpOworCSAgICAgIGF2YWx1ZVtpXSA9IHBncjsKKwkgICAgfQogCSAgcGdyICs9IChzaXplX2FsICsgNykgLyA4OwogI2Vsc2UKLQkgIC8qIFN0cnVjdHVyZXMgdGhhdCBtYXRjaCB0aGUgYmFzaWMgbW9kZXMgKFFJIDEgYnl0ZSwgSEkgMiBieXRlcywKLQkgICAgIFNJIDQgYnl0ZXMpIGFyZSBhbGlnbmVkIGFzIGlmIHRoZXkgd2VyZSB0aG9zZSBtb2Rlcy4gICovCi0JICBzaXplX2FsID0gYXJnX3R5cGVzW2ldLT5zaXplOwogCSAgLyogSWYgdGhlIGZpcnN0IG1lbWJlciBvZiB0aGUgc3RydWN0IGlzIGEgZG91YmxlLCB0aGVuIGFsaWduCiAJICAgICB0aGUgc3RydWN0IHRvIGRvdWJsZS13b3JkLiAgKi8KIAkgIGlmIChhcmdfdHlwZXNbaV0tPmVsZW1lbnRzWzBdLT50eXBlID09IEZGSV9UWVBFX0RPVUJMRSkKIAkgICAgc2l6ZV9hbCA9IEFMSUdOKGFyZ190eXBlc1tpXS0+c2l6ZSwgOCk7CisjICBpZiBkZWZpbmVkKFBPV0VSUEM2NCkKKwkgIEZGSV9BU1NFUlQgKGNpZi0+YWJpICE9IEZGSV9EQVJXSU4pOworCSAgYXZhbHVlW2ldID0gcGdyOworCSAgcGdyICs9IChzaXplX2FsICsgNykgLyA4OworIyAgZWxzZQorCSAgLyogU3RydWN0dXJlcyB0aGF0IG1hdGNoIHRoZSBiYXNpYyBtb2RlcyAoUUkgMSBieXRlLCBISSAyIGJ5dGVzLAorCSAgICAgU0kgNCBieXRlcykgYXJlIGFsaWduZWQgYXMgaWYgdGhleSB3ZXJlIHRob3NlIG1vZGVzLiAgKi8KIAkgIGlmIChzaXplX2FsIDwgMyAmJiBjaWYtPmFiaSA9PSBGRklfREFSV0lOKQotCSAgICBhdmFsdWVbaV0gPSAodm9pZCopIHBnciArIDQgLSBzaXplX2FsOworCSAgICBhdmFsdWVbaV0gPSAoY2hhciopIHBnciArIDQgLSBzaXplX2FsOwogCSAgZWxzZQotCSAgICBhdmFsdWVbaV0gPSAodm9pZCopIHBncjsKKwkgICAgYXZhbHVlW2ldID0gcGdyOwogCSAgcGdyICs9IChzaXplX2FsICsgMykgLyA0OworIyAgZW5kaWYKICNlbmRpZgogCSAgYnJlYWs7CiAKIAljYXNlIEZGSV9UWVBFX1NJTlQ2NDoKIAljYXNlIEZGSV9UWVBFX1VJTlQ2NDoKLSNpZmRlZiBQT1dFUlBDNjQKKyNpZiAgZGVmaW5lZChQT1dFUlBDNjQpCiAJY2FzZSBGRklfVFlQRV9QT0lOVEVSOgogCSAgYXZhbHVlW2ldID0gcGdyOwogCSAgcGdyKys7CkBAIC05MjQsNSArMTM1NSw1IEBACiAgIChjbG9zdXJlLT5mdW4pIChjaWYsIHJ2YWx1ZSwgYXZhbHVlLCBjbG9zdXJlLT51c2VyX2RhdGEpOwogCiAgIC8qIFRlbGwgZmZpX2Nsb3N1cmVfQVNNIHRvIHBlcmZvcm0gcmV0dXJuIHR5cGUgcHJvbW90aW9ucy4gICovCi0gIHJldHVybiBjaWYtPnJ0eXBlLT50eXBlOworICByZXR1cm4gY2lmLT5ydHlwZTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvZmZpdGFyZ2V0LmggYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2ZmaXRhcmdldC5oCmluZGV4IGI0Zjk5MmUuLjNjOWRiNDkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvZmZpdGFyZ2V0LmgKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcG93ZXJwYy9mZml0YXJnZXQuaApAQCAtMSw2ICsxLDggQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi1DLSotCi0gICBmZml0YXJnZXQuaCAtIENvcHlyaWdodCAoYykgMTk5Ni0yMDAzICBSZWQgSGF0LCBJbmMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMKKyAgIGZmaXRhcmdldC5oIC0gQ29weXJpZ2h0IChjKSAyMDEyICBBbnRob255IEdyZWVuCisgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYworICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMyAgUmVkIEhhdCwgSW5jLgorCiAgICBUYXJnZXQgY29uZmlndXJhdGlvbiBtYWNyb3MgZm9yIFBvd2VyUEMuCiAKICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwpAQCAtMjgsMTUgKzMwLDI4IEBACiAjaWZuZGVmIExJQkZGSV9UQVJHRVRfSAogI2RlZmluZSBMSUJGRklfVEFSR0VUX0gKIAorI2lmbmRlZiBMSUJGRklfSAorI2Vycm9yICJQbGVhc2UgZG8gbm90IGluY2x1ZGUgZmZpdGFyZ2V0LmggZGlyZWN0bHkgaW50byB5b3VyIHNvdXJjZS4gIFVzZSBmZmkuaCBpbnN0ZWFkLiIKKyNlbmRpZgorCiAvKiAtLS0tIFN5c3RlbSBzcGVjaWZpYyBjb25maWd1cmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAjaWYgZGVmaW5lZCAoUE9XRVJQQykgJiYgZGVmaW5lZCAoX19wb3dlcnBjNjRfXykJLyogbGludXg2NCAqLworI2lmbmRlZiBQT1dFUlBDNjQKICNkZWZpbmUgUE9XRVJQQzY0Ci0jZWxpZiBkZWZpbmVkIChQT1dFUlBDX0RBUldJTikgJiYgZGVmaW5lZCAoX19wcGM2NF9fKQkvKiBEYXJ3aW4gKi8KKyNlbmRpZgorI2VsaWYgZGVmaW5lZCAoUE9XRVJQQ19EQVJXSU4pICYmIGRlZmluZWQgKF9fcHBjNjRfXykJLyogRGFyd2luNjQgKi8KKyNpZm5kZWYgUE9XRVJQQzY0CiAjZGVmaW5lIFBPV0VSUEM2NAorI2VuZGlmCisjaWZuZGVmIFBPV0VSUENfREFSV0lONjQKKyNkZWZpbmUgUE9XRVJQQ19EQVJXSU42NAorI2VuZGlmCiAjZWxpZiBkZWZpbmVkIChQT1dFUlBDX0FJWCkgJiYgZGVmaW5lZCAoX182NEJJVF9fKQkvKiBBSVg2NCAqLworI2lmbmRlZiBQT1dFUlBDNjQKICNkZWZpbmUgUE9XRVJQQzY0CiAjZW5kaWYKKyNlbmRpZgogCiAjaWZuZGVmIExJQkZGSV9BU00KIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICAgICBmZmlfYXJnOwpAQCAtNTEsMTggKzY2LDE0IEBACiAgIEZGSV9MSU5VWDY0LAogICBGRklfTElOVVgsCiAgIEZGSV9MSU5VWF9TT0ZUX0ZMT0FULAotIyBpZmRlZiBQT1dFUlBDNjQKKyMgaWYgZGVmaW5lZChQT1dFUlBDNjQpCiAgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9MSU5VWDY0LAotIyBlbHNlCi0jICBpZiAoIWRlZmluZWQoX19OT19GUFJTX18pICYmIChfX0xEQkxfTUFOVF9ESUdfXyA9PSAxMDYpKQotICBGRklfREVGQVVMVF9BQkkgPSBGRklfTElOVVgsCi0jICBlbHNlCi0jICAgaWZkZWYgX19OT19GUFJTX18KKyMgZWxpZiBkZWZpbmVkKF9fTk9fRlBSU19fKQogICBGRklfREVGQVVMVF9BQkkgPSBGRklfTElOVVhfU09GVF9GTE9BVCwKLSMgICBlbHNlCisjIGVsaWYgKF9fTERCTF9NQU5UX0RJR19fID09IDEwNikKKyAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX0xJTlVYLAorIyBlbHNlCiAgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9HQ0NfU1lTViwKLSMgICBlbmRpZgotIyAgZW5kaWYKICMgZW5kaWYKICNlbmRpZgogCkBAIC0xMDgsOSArMTE5LDEzIEBACiAjZGVmaW5lIEZGSV9TWVNWX1RZUEVfU01BTExfU1RSVUNUIChGRklfVFlQRV9MQVNUICsgMikKIAogI2lmIGRlZmluZWQoUE9XRVJQQzY0KSB8fCBkZWZpbmVkKFBPV0VSUENfQUlYKQotI2RlZmluZSBGRklfVFJBTVBPTElORV9TSVpFIDI0CisjICBpZiBkZWZpbmVkKFBPV0VSUENfREFSV0lONjQpCisjICAgIGRlZmluZSBGRklfVFJBTVBPTElORV9TSVpFIDQ4CisjICBlbHNlCisjICAgIGRlZmluZSBGRklfVFJBTVBPTElORV9TSVpFIDI0CisjICBlbmRpZgogI2Vsc2UgLyogUE9XRVJQQyB8fCBQT1dFUlBDX0FJWCAqLwotI2RlZmluZSBGRklfVFJBTVBPTElORV9TSVpFIDQwCisjICBkZWZpbmUgRkZJX1RSQU1QT0xJTkVfU0laRSA0MAogI2VuZGlmCiAKICNpZm5kZWYgTElCRkZJX0FTTQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcG93ZXJwYy9saW51eDY0LlMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2xpbnV4NjQuUwppbmRleCA1N2I1NmNiLi5mMjhkYTgxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2xpbnV4NjQuUworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2xpbnV4NjQuUwpAQCAtMzAsMTYgKzMwLDI1IEBACiAjaW5jbHVkZSA8ZmZpLmg+CiAKICNpZmRlZiBfX3Bvd2VycGM2NF9fCi0JLmhpZGRlbglmZmlfY2FsbF9MSU5VWDY0LCAuZmZpX2NhbGxfTElOVVg2NAotCS5nbG9ibAlmZmlfY2FsbF9MSU5VWDY0LCAuZmZpX2NhbGxfTElOVVg2NAorCS5oaWRkZW4JZmZpX2NhbGxfTElOVVg2NAorCS5nbG9ibAlmZmlfY2FsbF9MSU5VWDY0CiAJLnNlY3Rpb24JIi5vcGQiLCJhdyIKIAkuYWxpZ24JMwogZmZpX2NhbGxfTElOVVg2NDoKKyNpZmRlZiBfQ0FMTF9MSU5VWAorCS5xdWFkCS5MLmZmaV9jYWxsX0xJTlVYNjQsLlRPQy5AdG9jYmFzZSwwCisJLnR5cGUJZmZpX2NhbGxfTElOVVg2NCxAZnVuY3Rpb24KKwkudGV4dAorLkwuZmZpX2NhbGxfTElOVVg2NDoKKyNlbHNlCisJLmhpZGRlbgkuZmZpX2NhbGxfTElOVVg2NAorCS5nbG9ibAkuZmZpX2NhbGxfTElOVVg2NAogCS5xdWFkCS5mZmlfY2FsbF9MSU5VWDY0LC5UT0MuQHRvY2Jhc2UsMAogCS5zaXplCWZmaV9jYWxsX0xJTlVYNjQsMjQKIAkudHlwZQkuZmZpX2NhbGxfTElOVVg2NCxAZnVuY3Rpb24KIAkudGV4dAogLmZmaV9jYWxsX0xJTlVYNjQ6CisjZW5kaWYKIC5MRkIxOgogCW1mbHIJJXIwCiAJc3RkCSVyMjgsIC0zMiglcjEpCkBAIC01OCw3ICs2NywxMSBAQAogCiAJLyogQ2FsbCBmZmlfcHJlcF9hcmdzNjQuICAqLwogCW1yCSVyNCwgJXIxCisjaWZkZWYgX0NBTExfTElOVVgKKwlibAlmZmlfcHJlcF9hcmdzNjQKKyNlbHNlCiAJYmwJLmZmaV9wcmVwX2FyZ3M2NAorI2VuZGlmCiAKIAlsZAklcjAsIDAoJXIyOSkKIAlsZAklcjIsIDgoJXIyOSkKQEAgLTEzNyw3ICsxNTAsMTEgQEAKIC5MRkUxOgogCS5sb25nCTAKIAkuYnl0ZQkwLDEyLDAsMSwxMjgsNCwwLDAKKyNpZmRlZiBfQ0FMTF9MSU5VWAorCS5zaXplCWZmaV9jYWxsX0xJTlVYNjQsLi0uTC5mZmlfY2FsbF9MSU5VWDY0CisjZWxzZQogCS5zaXplCS5mZmlfY2FsbF9MSU5VWDY0LC4tLmZmaV9jYWxsX0xJTlVYNjQKKyNlbmRpZgogCiAJLnNlY3Rpb24JLmVoX2ZyYW1lLEVIX0ZSQU1FX0ZMQUdTLEBwcm9nYml0cwogLkxmcmFtZTE6CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2xpbnV4NjRfY2xvc3VyZS5TIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcG93ZXJwYy9saW51eDY0X2Nsb3N1cmUuUwppbmRleCBmN2FhMmM5Li5iMWUxMjE5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2xpbnV4NjRfY2xvc3VyZS5TCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvbGludXg2NF9jbG9zdXJlLlMKQEAgLTMyLDE2ICszMiwyNCBAQAogCiAjaWZkZWYgX19wb3dlcnBjNjRfXwogCUZGSV9ISURERU4gKGZmaV9jbG9zdXJlX0xJTlVYNjQpCi0JRkZJX0hJRERFTiAoLmZmaV9jbG9zdXJlX0xJTlVYNjQpCi0JLmdsb2JsICBmZmlfY2xvc3VyZV9MSU5VWDY0LCAuZmZpX2Nsb3N1cmVfTElOVVg2NAorCS5nbG9ibCAgZmZpX2Nsb3N1cmVfTElOVVg2NAogCS5zZWN0aW9uICAgICAgICAiLm9wZCIsImF3IgogCS5hbGlnbiAgMwogZmZpX2Nsb3N1cmVfTElOVVg2NDoKKyNpZmRlZiBfQ0FMTF9MSU5VWAorCS5xdWFkICAgLkwuZmZpX2Nsb3N1cmVfTElOVVg2NCwuVE9DLkB0b2NiYXNlLDAKKwkudHlwZSAgIGZmaV9jbG9zdXJlX0xJTlVYNjQsQGZ1bmN0aW9uCisJLnRleHQKKy5MLmZmaV9jbG9zdXJlX0xJTlVYNjQ6CisjZWxzZQorCUZGSV9ISURERU4gKC5mZmlfY2xvc3VyZV9MSU5VWDY0KQorCS5nbG9ibCAgLmZmaV9jbG9zdXJlX0xJTlVYNjQKIAkucXVhZCAgIC5mZmlfY2xvc3VyZV9MSU5VWDY0LC5UT0MuQHRvY2Jhc2UsMAogCS5zaXplICAgZmZpX2Nsb3N1cmVfTElOVVg2NCwyNAogCS50eXBlICAgLmZmaV9jbG9zdXJlX0xJTlVYNjQsQGZ1bmN0aW9uCiAJLnRleHQKIC5mZmlfY2xvc3VyZV9MSU5VWDY0OgorI2VuZGlmCiAuTEZCMToKIAkjIHNhdmUgZ2VuZXJhbCByZWdzIGludG8gcGFybSBzYXZlIGFyZWEKIAlzdGQJJXIzLCA0OCglcjEpCkBAIC05MSw3ICs5OSwxMSBAQAogCWFkZGkgJXI2LCAlcjEsIDEyOAogCiAJIyBtYWtlIHRoZSBjYWxsCisjaWZkZWYgX0NBTExfTElOVVgKKwlibCBmZmlfY2xvc3VyZV9oZWxwZXJfTElOVVg2NAorI2Vsc2UKIAlibCAuZmZpX2Nsb3N1cmVfaGVscGVyX0xJTlVYNjQKKyNlbmRpZgogLkxyZXQ6CiAKIAkjIG5vdyByMyBjb250YWlucyB0aGUgcmV0dXJuIHR5cGUKQEAgLTE5NCw3ICsyMDYsMTEgQEAKIC5MRkUxOgogCS5sb25nCTAKIAkuYnl0ZQkwLDEyLDAsMSwxMjgsMCwwLDAKKyNpZmRlZiBfQ0FMTF9MSU5VWAorCS5zaXplCWZmaV9jbG9zdXJlX0xJTlVYNjQsLi0uTC5mZmlfY2xvc3VyZV9MSU5VWDY0CisjZWxzZQogCS5zaXplCS5mZmlfY2xvc3VyZV9MSU5VWDY0LC4tLmZmaV9jbG9zdXJlX0xJTlVYNjQKKyNlbmRpZgogCiAJLnNlY3Rpb24JLmVoX2ZyYW1lLEVIX0ZSQU1FX0ZMQUdTLEBwcm9nYml0cwogLkxmcmFtZTE6CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL3BwY19jbG9zdXJlLlMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL3BwY19jbG9zdXJlLlMKaW5kZXggNTZmN2QxYS4uNDFmYjg4NSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcG93ZXJwYy9wcGNfY2xvc3VyZS5TCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvcHBjX2Nsb3N1cmUuUwpAQCAtMTIyLDIyICsxMjIsNDEgQEAKIAlibHIKIAogIyBjYXNlIEZGSV9UWVBFX0ZMT0FUCisjaWZuZGVmIF9fTk9fRlBSU19fCiAJbGZzICVmMSwxMTIrMCglcjEpCiAJbXRsciAlcjAKIAlhZGRpICVyMSwlcjEsMTQ0CisjZWxzZQorCW5vcAorCW5vcAorCW5vcAorI2VuZGlmCiAJYmxyCiAKICMgY2FzZSBGRklfVFlQRV9ET1VCTEUKKyNpZm5kZWYgX19OT19GUFJTX18KIAlsZmQgJWYxLDExMiswKCVyMSkKIAltdGxyICVyMAogCWFkZGkgJXIxLCVyMSwxNDQKKyNlbHNlCisJbm9wCisJbm9wCisJbm9wCisjZW5kaWYKIAlibHIKIAogIyBjYXNlIEZGSV9UWVBFX0xPTkdET1VCTEUKKyNpZm5kZWYgX19OT19GUFJTX18KIAlsZmQgJWYxLDExMiswKCVyMSkKIAlsZmQgJWYyLDExMis4KCVyMSkKIAltdGxyICVyMAogCWIgLkxmaW5pc2gKKyNlbHNlCisJbm9wCisJbm9wCisJbm9wCisJYmxyCisjZW5kaWYKIAogIyBjYXNlIEZGSV9UWVBFX1VJTlQ4CiAJbGJ6ICVyMywxMTIrMyglcjEpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL3N5c3YuUyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvc3lzdi5TCmluZGV4IDk2ZWEyMmIuLjVlZTNhMTkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvc3lzdi5TCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvc3lzdi5TCkBAIC04Myw2ICs4Myw3IEBACiAJbm9wCiAxOgogCisjaWZuZGVmIF9fTk9fRlBSU19fCiAJLyogTG9hZCBhbGwgdGhlIEZQIHJlZ2lzdGVycy4gICovCiAJYmYtCTYsMmYKIAlsZmQJJWYxLC0xNi0oOCo0KS0oOCo4KSglcjI4KQpAQCAtOTQsNiArOTUsNyBAQAogCWxmZAklZjYsLTE2LSg4KjQpLSgzKjgpKCVyMjgpCiAJbGZkCSVmNywtMTYtKDgqNCktKDIqOCkoJXIyOCkKIAlsZmQJJWY4LC0xNi0oOCo0KS0oMSo4KSglcjI4KQorI2VuZGlmCiAyOgogCiAJLyogTWFrZSB0aGUgY2FsbC4gICovCkBAIC0xMDMsNyArMTA1LDkgQEAKIAltdGNyZgkweDAxLCVyMzEgLyogY3I3ICAqLwogCWJ0LQkzMSxMKHNtYWxsX3N0cnVjdF9yZXR1cm5fdmFsdWUpCiAJYnQtCTMwLEwoZG9uZV9yZXR1cm5fdmFsdWUpCisjaWZuZGVmIF9fTk9fRlBSU19fCiAJYnQtCTI5LEwoZnBfcmV0dXJuX3ZhbHVlKQorI2VuZGlmCiAJc3R3CSVyMywwKCVyMzApCiAJYmYrCTI4LEwoZG9uZV9yZXR1cm5fdmFsdWUpCiAJc3R3CSVyNCw0KCVyMzApCkBAIC0xMjQsNiArMTI4LDcgQEAKIAlsd3oJJXIxLDAoJXIxKQogCWJscgogCisjaWZuZGVmIF9fTk9fRlBSU19fCiBMKGZwX3JldHVybl92YWx1ZSk6CiAJYmYJMjgsTChmbG9hdF9yZXR1cm5fdmFsdWUpCiAJc3RmZAklZjEsMCglcjMwKQpAQCAtMTM0LDYgKzEzOSw3IEBACiBMKGZsb2F0X3JldHVybl92YWx1ZSk6CiAJc3RmcwklZjEsMCglcjMwKQogCWIJTChkb25lX3JldHVybl92YWx1ZSkKKyNlbmRpZgogCiBMKHNtYWxsX3N0cnVjdF9yZXR1cm5fdmFsdWUpOgogCWV4dHJ3aQklcjYsJXIzMSwyLDE5ICAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIHBhZGRpbmcgPSBzaGlmdC84ICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wcmVwX2NpZi5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcHJlcF9jaWYuYwppbmRleCBjMWMzYjlhLi5lOGVjNWNmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wcmVwX2NpZi5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3ByZXBfY2lmLmMKQEAgLTEsNSArMSw2IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgcHJlcF9jaWYuYyAtIENvcHlyaWdodCAoYykgMTk5NiwgMTk5OCwgMjAwNyAgUmVkIEhhdCwgSW5jLgorICAgcHJlcF9jaWYuYyAtIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiAgQW50aG9ueSBHcmVlbgorICAgICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMTk5NiwgMTk5OCwgMjAwNyAgUmVkIEhhdCwgSW5jLgogCiAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKICAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQpAQCAtMzcsMTcgKzM4LDIxIEBACiB7CiAgIGZmaV90eXBlICoqcHRyOwogCi0gIEZGSV9BU1NFUlQoYXJnICE9IE5VTEwpOworICBpZiAoVU5MSUtFTFkoYXJnID09IE5VTEwgfHwgYXJnLT5lbGVtZW50cyA9PSBOVUxMKSkKKyAgICByZXR1cm4gRkZJX0JBRF9UWVBFREVGOwogCi0gIEZGSV9BU1NFUlQoYXJnLT5lbGVtZW50cyAhPSBOVUxMKTsKLSAgRkZJX0FTU0VSVChhcmctPnNpemUgPT0gMCk7Ci0gIEZGSV9BU1NFUlQoYXJnLT5hbGlnbm1lbnQgPT0gMCk7CisgIGFyZy0+c2l6ZSA9IDA7CisgIGFyZy0+YWxpZ25tZW50ID0gMDsKIAogICBwdHIgPSAmKGFyZy0+ZWxlbWVudHNbMF0pOwogCisgIGlmIChVTkxJS0VMWShwdHIgPT0gMCkpCisgICAgcmV0dXJuIEZGSV9CQURfVFlQRURFRjsKKwogICB3aGlsZSAoKCpwdHIpICE9IE5VTEwpCiAgICAgewotICAgICAgaWYgKCgoKnB0ciktPnNpemUgPT0gMCkgJiYgKGluaXRpYWxpemVfYWdncmVnYXRlKCgqcHRyKSkgIT0gRkZJX09LKSkKKyAgICAgIGlmIChVTkxJS0VMWSgoKCpwdHIpLT5zaXplID09IDApCisJCSAgICAmJiAoaW5pdGlhbGl6ZV9hZ2dyZWdhdGUoKCpwdHIpKSAhPSBGRklfT0spKSkKIAlyZXR1cm4gRkZJX0JBRF9UWVBFREVGOwogCiAgICAgICAvKiBQZXJmb3JtIGEgc2FuaXR5IGNoZWNrIG9uIHRoZSBhcmd1bWVudCB0eXBlICovCkBAIC04NSwxOSArOTAsMzggQEAKIC8qIFBlcmZvcm0gbWFjaGluZSBpbmRlcGVuZGVudCBmZmlfY2lmIHByZXBhcmF0aW9uLCB0aGVuIGNhbGwKICAgIG1hY2hpbmUgZGVwZW5kZW50IHJvdXRpbmUuICovCiAKLWZmaV9zdGF0dXMgZmZpX3ByZXBfY2lmKGZmaV9jaWYgKmNpZiwgZmZpX2FiaSBhYmksIHVuc2lnbmVkIGludCBuYXJncywKLQkJCWZmaV90eXBlICpydHlwZSwgZmZpX3R5cGUgKiphdHlwZXMpCisvKiBGb3Igbm9uIHZhcmlhZGljIGZ1bmN0aW9ucyBpc3ZhcmlhZGljIHNob3VsZCBiZSAwIGFuZAorICAgbmZpeGVkYXJncz09bnRvdGFsYXJncy4KKworICAgRm9yIHZhcmlhZGljIGNhbGxzLCBpc3ZhcmlhZGljIHNob3VsZCBiZSAxIGFuZCBuZml4ZWRhcmdzCisgICBhbmQgbnRvdGFsYXJncyBzZXQgYXMgYXBwcm9wcmlhdGUuIG5maXhlZGFyZ3MgbXVzdCBhbHdheXMgYmUgPj0xICovCisKKworZmZpX3N0YXR1cyBGRklfSElEREVOIGZmaV9wcmVwX2NpZl9jb3JlKGZmaV9jaWYgKmNpZiwgZmZpX2FiaSBhYmksCisJCQkgICAgIHVuc2lnbmVkIGludCBpc3ZhcmlhZGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmZpeGVkYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG50b3RhbGFyZ3MsCisJCQkgICAgIGZmaV90eXBlICpydHlwZSwgZmZpX3R5cGUgKiphdHlwZXMpCiB7CiAgIHVuc2lnbmVkIGJ5dGVzID0gMDsKICAgdW5zaWduZWQgaW50IGk7CiAgIGZmaV90eXBlICoqcHRyOwogCiAgIEZGSV9BU1NFUlQoY2lmICE9IE5VTEwpOwotICBGRklfQVNTRVJUKChhYmkgPiBGRklfRklSU1RfQUJJKSAmJiAoYWJpIDw9IEZGSV9ERUZBVUxUX0FCSSkpOworICBGRklfQVNTRVJUKCghaXN2YXJpYWRpYykgfHwgKG5maXhlZGFyZ3MgPj0gMSkpOworICBGRklfQVNTRVJUKG5maXhlZGFyZ3MgPD0gbnRvdGFsYXJncyk7CisKKyNpZm5kZWYgWDg2X1dJTjMyCisgIGlmICghIChhYmkgPiBGRklfRklSU1RfQUJJICYmIGFiaSA8IEZGSV9MQVNUX0FCSSkpCisgICAgcmV0dXJuIEZGSV9CQURfQUJJOworI2Vsc2UKKyAgaWYgKCEgKGFiaSA+IEZGSV9GSVJTVF9BQkkgJiYgYWJpIDwgRkZJX0xBU1RfQUJJIHx8IGFiaSA9PSBGRklfVEhJU0NBTEwpKQorICAgIHJldHVybiBGRklfQkFEX0FCSTsKKyNlbmRpZgogCiAgIGNpZi0+YWJpID0gYWJpOwogICBjaWYtPmFyZ190eXBlcyA9IGF0eXBlczsKLSAgY2lmLT5uYXJncyA9IG5hcmdzOworICBjaWYtPm5hcmdzID0gbnRvdGFsYXJnczsKICAgY2lmLT5ydHlwZSA9IHJ0eXBlOwogCiAgIGNpZi0+ZmxhZ3MgPSAwOwpAQCAtMTEwLDEyICsxMzQsMTkgQEAKICAgRkZJX0FTU0VSVF9WQUxJRF9UWVBFKGNpZi0+cnR5cGUpOwogCiAgIC8qIHg4NiwgeDg2LTY0IGFuZCBzMzkwIHN0YWNrIHNwYWNlIGFsbG9jYXRpb24gaXMgaGFuZGxlZCBpbiBwcmVwX21hY2hkZXAuICovCi0jaWYgIWRlZmluZWQgTTY4SyAmJiAhZGVmaW5lZCBfX2kzODZfXyAmJiAhZGVmaW5lZCBfX3g4Nl82NF9fICYmICFkZWZpbmVkIFMzOTAgJiYgIWRlZmluZWQgUEEKKyNpZiAhZGVmaW5lZCBNNjhLICYmICFkZWZpbmVkIFg4Nl9BTlkgJiYgIWRlZmluZWQgUzM5MCAmJiAhZGVmaW5lZCBQQQogICAvKiBNYWtlIHNwYWNlIGZvciB0aGUgcmV0dXJuIHN0cnVjdHVyZSBwb2ludGVyICovCiAgIGlmIChjaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVAogI2lmZGVmIFNQQVJDCiAgICAgICAmJiAoY2lmLT5hYmkgIT0gRkZJX1Y5IHx8IGNpZi0+cnR5cGUtPnNpemUgPiAzMikKICNlbmRpZgorI2lmZGVmIFRJTEUKKyAgICAgICYmIChjaWYtPnJ0eXBlLT5zaXplID4gMTAgKiBGRklfU0laRU9GX0FSRykKKyNlbmRpZgorI2lmZGVmIFhURU5TQQorICAgICAgJiYgKGNpZi0+cnR5cGUtPnNpemUgPiAxNikKKyNlbmRpZgorCiAgICAgICkKICAgICBieXRlcyA9IFNUQUNLX0FSR19TSVpFKHNpemVvZih2b2lkKikpOwogI2VuZGlmCkBAIC0xMzEsNyArMTYyLDcgQEAKIAkgY2hlY2sgYWZ0ZXIgdGhlIGluaXRpYWxpemF0aW9uLiAgKi8KICAgICAgIEZGSV9BU1NFUlRfVkFMSURfVFlQRSgqcHRyKTsKIAotI2lmICFkZWZpbmVkIF9faTM4Nl9fICYmICFkZWZpbmVkIF9feDg2XzY0X18gJiYgIWRlZmluZWQgUzM5MCAmJiAhZGVmaW5lZCBQQQorI2lmICFkZWZpbmVkIFg4Nl9BTlkgJiYgIWRlZmluZWQgUzM5MCAmJiAhZGVmaW5lZCBQQQogI2lmZGVmIFNQQVJDCiAgICAgICBpZiAoKCgqcHRyKS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QKIAkgICAmJiAoKCpwdHIpLT5zaXplID4gMTYgfHwgY2lmLT5hYmkgIT0gRkZJX1Y5KSkKQEAgLTE0NSw2ICsxNzYsMjAgQEAKIAkgIGlmICgoKCpwdHIpLT5hbGlnbm1lbnQgLSAxKSAmIGJ5dGVzKQogCSAgICBieXRlcyA9IEFMSUdOKGJ5dGVzLCAoKnB0ciktPmFsaWdubWVudCk7CiAKKyNpZmRlZiBUSUxFCisJICBpZiAoYnl0ZXMgPCAxMCAqIEZGSV9TSVpFT0ZfQVJHICYmCisJICAgICAgYnl0ZXMgKyBTVEFDS19BUkdfU0laRSgoKnB0ciktPnNpemUpID4gMTAgKiBGRklfU0laRU9GX0FSRykKKwkgICAgeworCSAgICAgIC8qIEFuIGFyZ3VtZW50IGlzIG5ldmVyIHNwbGl0IGJldHdlZW4gdGhlIDEwIHBhcmFtZXRlcgorCQkgcmVnaXN0ZXJzIGFuZCB0aGUgc3RhY2suICAqLworCSAgICAgIGJ5dGVzID0gMTAgKiBGRklfU0laRU9GX0FSRzsKKwkgICAgfQorI2VuZGlmCisjaWZkZWYgWFRFTlNBCisJICBpZiAoYnl0ZXMgPD0gNio0ICYmIGJ5dGVzICsgU1RBQ0tfQVJHX1NJWkUoKCpwdHIpLT5zaXplKSA+IDYqNCkKKwkgICAgYnl0ZXMgPSA2KjQ7CisjZW5kaWYKKwogCSAgYnl0ZXMgKz0gU1RBQ0tfQVJHX1NJWkUoKCpwdHIpLT5zaXplKTsKIAl9CiAjZW5kaWYKQEAgLTE1MywxMCArMTk4LDMxIEBACiAgIGNpZi0+Ynl0ZXMgPSBieXRlczsKIAogICAvKiBQZXJmb3JtIG1hY2hpbmUgZGVwZW5kZW50IGNpZiBwcm9jZXNzaW5nICovCisjaWZkZWYgRkZJX1RBUkdFVF9TUEVDSUZJQ19WQVJJQURJQworICBpZiAoaXN2YXJpYWRpYykKKwlyZXR1cm4gZmZpX3ByZXBfY2lmX21hY2hkZXBfdmFyKGNpZiwgbmZpeGVkYXJncywgbnRvdGFsYXJncyk7CisjZW5kaWYKKwogICByZXR1cm4gZmZpX3ByZXBfY2lmX21hY2hkZXAoY2lmKTsKIH0KICNlbmRpZiAvKiBub3QgX19DUklTX18gKi8KIAorZmZpX3N0YXR1cyBmZmlfcHJlcF9jaWYoZmZpX2NpZiAqY2lmLCBmZmlfYWJpIGFiaSwgdW5zaWduZWQgaW50IG5hcmdzLAorCQkJICAgICBmZmlfdHlwZSAqcnR5cGUsIGZmaV90eXBlICoqYXR5cGVzKQoreworICByZXR1cm4gZmZpX3ByZXBfY2lmX2NvcmUoY2lmLCBhYmksIDAsIG5hcmdzLCBuYXJncywgcnR5cGUsIGF0eXBlcyk7Cit9CisKK2ZmaV9zdGF0dXMgZmZpX3ByZXBfY2lmX3ZhcihmZmlfY2lmICpjaWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZpX2FiaSBhYmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5maXhlZGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG50b3RhbGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZpX3R5cGUgKnJ0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmaV90eXBlICoqYXR5cGVzKQoreworICByZXR1cm4gZmZpX3ByZXBfY2lmX2NvcmUoY2lmLCBhYmksIDEsIG5maXhlZGFyZ3MsIG50b3RhbGFyZ3MsIHJ0eXBlLCBhdHlwZXMpOworfQorCiAjaWYgRkZJX0NMT1NVUkVTCiAKIGZmaV9zdGF0dXMKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3MzOTAvZmZpLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9zMzkwL2ZmaS5jCmluZGV4IGNhMjY3NWIuLjhhZGI1YmMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3MzOTAvZmZpLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvczM5MC9mZmkuYwpAQCAtNzUwLDcgKzc1MCw4IEBACiAJCSAgICAgIHZvaWQgKnVzZXJfZGF0YSwKIAkJICAgICAgdm9pZCAqY29kZWxvYykKIHsKLSAgRkZJX0FTU0VSVCAoY2lmLT5hYmkgPT0gRkZJX1NZU1YpOworICBpZiAoY2lmLT5hYmkgIT0gRkZJX1NZU1YpCisgICAgcmV0dXJuIEZGSV9CQURfQUJJOwogCiAjaWZuZGVmIF9fczM5MHhfXwogICAqKHNob3J0ICopJmNsb3N1cmUtPnRyYW1wIFswXSA9IDB4MGQxMDsgICAvKiBiYXNyICVyMSwwICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9zMzkwL2ZmaXRhcmdldC5oIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvczM5MC9mZml0YXJnZXQuaAppbmRleCA3OGYzYzY1Li45N2ZhNWM0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9zMzkwL2ZmaXRhcmdldC5oCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3MzOTAvZmZpdGFyZ2V0LmgKQEAgLTEsNSArMSw2IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotQy0qLQotICAgZmZpdGFyZ2V0LmggLSBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMyAgUmVkIEhhdCwgSW5jLgorICAgZmZpdGFyZ2V0LmggLSBDb3B5cmlnaHQgKGMpIDIwMTIgIEFudGhvbnkgR3JlZW4KKyAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAxOTk2LTIwMDMgIFJlZCBIYXQsIEluYy4KICAgIFRhcmdldCBjb25maWd1cmF0aW9uIG1hY3JvcyBmb3IgUzM5MC4KIAogICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCkBAIC0yNyw5ICsyOCwxNSBAQAogI2lmbmRlZiBMSUJGRklfVEFSR0VUX0gKICNkZWZpbmUgTElCRkZJX1RBUkdFVF9ICiAKKyNpZm5kZWYgTElCRkZJX0gKKyNlcnJvciAiUGxlYXNlIGRvIG5vdCBpbmNsdWRlIGZmaXRhcmdldC5oIGRpcmVjdGx5IGludG8geW91ciBzb3VyY2UuICBVc2UgZmZpLmggaW5zdGVhZC4iCisjZW5kaWYKKwogI2lmIGRlZmluZWQgKF9fczM5MHhfXykKKyNpZm5kZWYgUzM5MFgKICNkZWZpbmUgUzM5MFgKICNlbmRpZgorI2VuZGlmCiAKIC8qIC0tLS0gU3lzdGVtIHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTQwLDggKzQ3LDggQEAKIHR5cGVkZWYgZW51bSBmZmlfYWJpIHsKICAgRkZJX0ZJUlNUX0FCSSA9IDAsCiAgIEZGSV9TWVNWLAotICBGRklfREVGQVVMVF9BQkkgPSBGRklfU1lTViwKLSAgRkZJX0xBU1RfQUJJID0gRkZJX0RFRkFVTFRfQUJJICsgMQorICBGRklfTEFTVF9BQkksCisgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9TWVNWCiB9IGZmaV9hYmk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvc2gvZmZpLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9zaC9mZmkuYwppbmRleCA2OWJkMDI1Li4zNTE1YjkxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9zaC9mZmkuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9zaC9mZmkuYwpAQCAtMSw1ICsxLDUgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICBmZmkuYyAtIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCBLYXogS29qaW1hCisgICBmZmkuYyAtIENvcHlyaWdodCAoYykgMjAwMi0yMDA4LCAyMDEyIEtheiBLb2ppbWEKICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA4IFJlZCBIYXQsIEluYy4KICAgIAogICAgU3VwZXJIIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlIApAQCAtNDYzLDcgKzQ2Myw4IEBACiAgIHVuc2lnbmVkIGludCAqdHJhbXA7CiAgIHVuc2lnbmVkIGludCBpbnNuOwogCi0gIEZGSV9BU1NFUlQgKGNpZi0+YWJpID09IEZGSV9HQ0NfU1lTVik7CisgIGlmIChjaWYtPmFiaSAhPSBGRklfU1lTVikKKyAgICByZXR1cm4gRkZJX0JBRF9BQkk7CiAKICAgdHJhbXAgPSAodW5zaWduZWQgaW50ICopICZjbG9zdXJlLT50cmFtcFswXTsKICAgLyogU2V0IFQgYml0IGlmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgc3RydWN0IHBvaW50ZWQgd2l0aCBSMi4gICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9zaC9mZml0YXJnZXQuaCBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3NoL2ZmaXRhcmdldC5oCmluZGV4IDIxOGFlM2QuLmEzNmJmNDIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3NoL2ZmaXRhcmdldC5oCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3NoL2ZmaXRhcmdldC5oCkBAIC0xLDUgKzEsNiBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLUMtKi0KLSAgIGZmaXRhcmdldC5oIC0gQ29weXJpZ2h0IChjKSAxOTk2LTIwMDMgIFJlZCBIYXQsIEluYy4KKyAgIGZmaXRhcmdldC5oIC0gQ29weXJpZ2h0IChjKSAyMDEyIEFudGhvbnkgR3JlZW4KKyAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAxOTk2LTIwMDMgIFJlZCBIYXQsIEluYy4KICAgIFRhcmdldCBjb25maWd1cmF0aW9uIG1hY3JvcyBmb3IgU3VwZXJILgogCiAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKQEAgLTI3LDYgKzI4LDEwIEBACiAjaWZuZGVmIExJQkZGSV9UQVJHRVRfSAogI2RlZmluZSBMSUJGRklfVEFSR0VUX0gKIAorI2lmbmRlZiBMSUJGRklfSAorI2Vycm9yICJQbGVhc2UgZG8gbm90IGluY2x1ZGUgZmZpdGFyZ2V0LmggZGlyZWN0bHkgaW50byB5b3VyIHNvdXJjZS4gIFVzZSBmZmkuaCBpbnN0ZWFkLiIKKyNlbmRpZgorCiAvKiAtLS0tIEdlbmVyaWMgdHlwZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAjaWZuZGVmIExJQkZGSV9BU00KQEAgLTM2LDggKzQxLDggQEAKIHR5cGVkZWYgZW51bSBmZmlfYWJpIHsKICAgRkZJX0ZJUlNUX0FCSSA9IDAsCiAgIEZGSV9TWVNWLAotICBGRklfREVGQVVMVF9BQkkgPSBGRklfU1lTViwKLSAgRkZJX0xBU1RfQUJJID0gRkZJX0RFRkFVTFRfQUJJICsgMQorICBGRklfTEFTVF9BQkksCisgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9TWVNWCiB9IGZmaV9hYmk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvc2g2NC9mZmkuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3NoNjQvZmZpLmMKaW5kZXggOGZiYzA1Yy4uMTIzYjg3YSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvc2g2NC9mZmkuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9zaDY0L2ZmaS5jCkBAIC0xLDUgKzEsNSBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIGZmaS5jIC0gQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA2LCAyMDA3IEtheiBLb2ppbWEKKyAgIGZmaS5jIC0gQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA2LCAyMDA3LCAyMDEyIEtheiBLb2ppbWEKICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA4IEFudGhvbnkgR3JlZW4KICAgIAogICAgU3VwZXJIIFNIbWVkaWEgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UgCkBAIC0zMDIsNyArMzAyLDggQEAKIHsKICAgdW5zaWduZWQgaW50ICp0cmFtcDsKIAotICBGRklfQVNTRVJUIChjaWYtPmFiaSA9PSBGRklfR0NDX1NZU1YpOworICBpZiAoY2lmLT5hYmkgIT0gRkZJX1NZU1YpCisgICAgcmV0dXJuIEZGSV9CQURfQUJJOwogCiAgIHRyYW1wID0gKHVuc2lnbmVkIGludCAqKSAmY2xvc3VyZS0+dHJhbXBbMF07CiAgIC8qIFNpbmNlIGZmaV9jbG9zdXJlIGlzIGFuIGFsaWduZWQgb2JqZWN0LCB0aGUgZmZpIHRyYW1wb2xpbmUgaXMKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3NoNjQvZmZpdGFyZ2V0LmggYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9zaDY0L2ZmaXRhcmdldC5oCmluZGV4IDRlOTIyZmMuLjA4YTZmZTkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3NoNjQvZmZpdGFyZ2V0LmgKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvc2g2NC9mZml0YXJnZXQuaApAQCAtMSw1ICsxLDYgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi1DLSotCi0gICBmZml0YXJnZXQuaCAtIENvcHlyaWdodCAoYykgMTk5Ni0yMDAzICBSZWQgSGF0LCBJbmMuCisgICBmZml0YXJnZXQuaCAtIENvcHlyaWdodCAoYykgMjAxMiAgQW50aG9ueSBHcmVlbgorICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMyAgUmVkIEhhdCwgSW5jLgogICAgVGFyZ2V0IGNvbmZpZ3VyYXRpb24gbWFjcm9zIGZvciBTdXBlckggLSBTSG1lZGlhLgogCiAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKQEAgLTI3LDYgKzI4LDEwIEBACiAjaWZuZGVmIExJQkZGSV9UQVJHRVRfSAogI2RlZmluZSBMSUJGRklfVEFSR0VUX0gKIAorI2lmbmRlZiBMSUJGRklfSAorI2Vycm9yICJQbGVhc2UgZG8gbm90IGluY2x1ZGUgZmZpdGFyZ2V0LmggZGlyZWN0bHkgaW50byB5b3VyIHNvdXJjZS4gIFVzZSBmZmkuaCBpbnN0ZWFkLiIKKyNlbmRpZgorCiAvKiAtLS0tIEdlbmVyaWMgdHlwZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAjaWZuZGVmIExJQkZGSV9BU00KQEAgLTM2LDggKzQxLDggQEAKIHR5cGVkZWYgZW51bSBmZmlfYWJpIHsKICAgRkZJX0ZJUlNUX0FCSSA9IDAsCiAgIEZGSV9TWVNWLAotICBGRklfREVGQVVMVF9BQkkgPSBGRklfU1lTViwKLSAgRkZJX0xBU1RfQUJJID0gRkZJX0RFRkFVTFRfQUJJICsgMQorICBGRklfTEFTVF9BQkksCisgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9TWVNWCiB9IGZmaV9hYmk7CiAKICNkZWZpbmUgRkZJX0VYVFJBX0NJRl9GSUVMRFMgbG9uZyBsb25nIGZsYWdzMgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvc3BhcmMvZmZpLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9zcGFyYy9mZmkuYwppbmRleCAxZDAxZjU5Li45ZjBmZGVkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9zcGFyYy9mZmkuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9zcGFyYy9mZmkuYwpAQCAtMSw1ICsxLDYgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICBmZmkuYyAtIENvcHlyaWdodCAoYykgMTk5NiwgMjAwMywgMjAwNCwgMjAwNywgMjAwOCBSZWQgSGF0LCBJbmMuCisgICBmZmkuYyAtIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMyBBbnRob255IEdyZWVuCisgICAgICAgICAgIENvcHlyaWdodCAoYykgMTk5NiwgMjAwMy0yMDA0LCAyMDA3LTIwMDggUmVkIEhhdCwgSW5jLgogICAgCiAgICBTUEFSQyBGb3JlaWduIEZ1bmN0aW9uIEludGVyZmFjZSAKIApAQCAtMzc1LDYgKzM3NiwxMCBAQAogCQkgICAgICAgdW5zaWduZWQsIHVuc2lnbmVkICosIHZvaWQgKCpmbikodm9pZCkpOwogI2VuZGlmCiAKKyNpZm5kZWYgX19HTlVDX18KK3ZvaWQgZmZpX2ZsdXNoX2ljYWNoZSAodm9pZCAqLCBzaXplX3QpOworI2VuZGlmCisKIHZvaWQgZmZpX2NhbGwoZmZpX2NpZiAqY2lmLCB2b2lkICgqZm4pKHZvaWQpLCB2b2lkICpydmFsdWUsIHZvaWQgKiphdmFsdWUpCiB7CiAgIGV4dGVuZGVkX2NpZiBlY2lmOwpAQCAtNDA2LDggKzQxMSw1NCBAQAogICAgICAgLyogV2UgZG9uJ3QgeWV0IHN1cHBvcnQgY2FsbGluZyAzMmJpdCBjb2RlIGZyb20gNjRiaXQgKi8KICAgICAgIEZGSV9BU1NFUlQoMCk7CiAjZWxzZQotICAgICAgZmZpX2NhbGxfdjgoZmZpX3ByZXBfYXJnc192OCwgJmVjaWYsIGNpZi0+Ynl0ZXMsIAotCQkgIGNpZi0+ZmxhZ3MsIHJ2YWx1ZSwgZm4pOworICAgICAgaWYgKHJ2YWx1ZSAmJiAoY2lmLT5ydHlwZS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QKKyNpZiBGRklfVFlQRV9MT05HRE9VQkxFICE9IEZGSV9UWVBFX0RPVUJMRQorCSAgfHwgY2lmLT5mbGFncyA9PSBGRklfVFlQRV9MT05HRE9VQkxFCisjZW5kaWYKKwkgICkpCisJeworCSAgLyogRm9yIHY4LCB3ZSBuZWVkIGFuICJ1bmltcCIgd2l0aCBzaXplIG9mIHJldHVybmluZyBzdHJ1Y3QgKi8KKwkgIC8qIGJlaGluZCAiY2FsbCIsIHNvIHdlIGFsbG9jIHNvbWUgZXhlY3V0YWJsZSBzcGFjZSBmb3IgaXQuICovCisJICAvKiBsNyBpcyB1c2VkLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB2OC5TIGRvZXNuJ3QgdXNlICVsNy4gICAqLworCSAgdW5zaWduZWQgaW50ICpjYWxsX3N0cnVjdCA9IE5VTEw7CisJICBmZmlfY2xvc3VyZV9hbGxvYygzMiwgKHZvaWQgKiopJmNhbGxfc3RydWN0KTsKKwkgIGlmIChjYWxsX3N0cnVjdCkKKwkgICAgeworCSAgICAgIHVuc2lnbmVkIGxvbmcgZiA9ICh1bnNpZ25lZCBsb25nKWZuOworCSAgICAgIGNhbGxfc3RydWN0WzBdID0gMHhhZTEwMDAxZjsJCSAvKiBtb3YgICAlaTcsICVsNwkgKi8KKwkgICAgICBjYWxsX3N0cnVjdFsxXSA9IDB4YmUxMDAwMGY7CQkgLyogbW92ICAgJW83LCAlaTcJICovCisJICAgICAgY2FsbF9zdHJ1Y3RbMl0gPSAweDAzMDAwMDAwIHwgZiA+PiAxMDsgICAgIC8qIHNldGhpICVoaShmbiksICVnMQkgKi8KKwkgICAgICBjYWxsX3N0cnVjdFszXSA9IDB4OWZjMDYwMDAgfCAoZiAmIDB4M2ZmKTsgLyogam1wICVnMSslbG8oZm4pLCAlbzcgKi8KKwkgICAgICBjYWxsX3N0cnVjdFs0XSA9IDB4MDEwMDAwMDA7CQkgLyogbm9wCQkJICovCisJICAgICAgaWYgKGNpZi0+cnR5cGUtPnNpemUgPCAweDdmKQorCQljYWxsX3N0cnVjdFs1XSA9IGNpZi0+cnR5cGUtPnNpemU7CSAvKiB1bmltcAkJICovCisJICAgICAgZWxzZQorCQljYWxsX3N0cnVjdFs1XSA9IDB4MDEwMDAwMDA7CSAgICAgCSAvKiBub3AJCQkgKi8KKwkgICAgICBjYWxsX3N0cnVjdFs2XSA9IDB4ODFjN2UwMDg7CQkgLyogcmV0CQkJICovCisJICAgICAgY2FsbF9zdHJ1Y3RbN10gPSAweGJlMTAwMDE3OwkJIC8qIG1vdiAgICVsNywgJWk3CSAqLworI2lmZGVmIF9fR05VQ19fCisJICAgICAgYXNtIHZvbGF0aWxlICgiaWZsdXNoICUwOyBpZmx1c2ggJTArODsgaWZsdXNoICUwKzE2OyBpZmx1c2ggJTArMjQiIDogOgorCQkJICAgICJyIiAoY2FsbF9zdHJ1Y3QpIDogIm1lbW9yeSIpOworCSAgICAgIC8qIFNQQVJDIHY4IHJlcXVpcmVzIDUgaW5zdHJ1Y3Rpb25zIGZvciBmbHVzaCB0byBiZSB2aXNpYmxlICovCisJICAgICAgYXNtIHZvbGF0aWxlICgibm9wOyBub3A7IG5vcDsgbm9wOyBub3AiKTsKKyNlbHNlCisJICAgICAgZmZpX2ZsdXNoX2ljYWNoZSAoY2FsbF9zdHJ1Y3QsIDMyKTsKKyNlbmRpZgorCSAgICAgIGZmaV9jYWxsX3Y4KGZmaV9wcmVwX2FyZ3NfdjgsICZlY2lmLCBjaWYtPmJ5dGVzLAorCQkJICBjaWYtPmZsYWdzLCBydmFsdWUsIGNhbGxfc3RydWN0KTsKKwkgICAgICBmZmlfY2xvc3VyZV9mcmVlKGNhbGxfc3RydWN0KTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgZmZpX2NhbGxfdjgoZmZpX3ByZXBfYXJnc192OCwgJmVjaWYsIGNpZi0+Ynl0ZXMsCisJCQkgIGNpZi0+ZmxhZ3MsIHJ2YWx1ZSwgZm4pOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGZmaV9jYWxsX3Y4KGZmaV9wcmVwX2FyZ3NfdjgsICZlY2lmLCBjaWYtPmJ5dGVzLAorCQkgICAgICBjaWYtPmZsYWdzLCBydmFsdWUsIGZuKTsKKwl9CiAjZW5kaWYKICAgICAgIGJyZWFrOwogICAgIGNhc2UgRkZJX1Y5OgpAQCAtNDI1LDcgKzQ3Niw2IEBACiAgICAgICBGRklfQVNTRVJUKDApOwogICAgICAgYnJlYWs7CiAgICAgfQotCiB9CiAKIApAQCAtNDQ3LDcgKzQ5Nyw4IEBACiAjaWZkZWYgU1BBUkM2NAogICAvKiBUcmFtcG9saW5lIGFkZHJlc3MgaXMgZXF1YWwgdG8gdGhlIGNsb3N1cmUgYWRkcmVzcy4gIFdlIHRha2UgYWR2YW50YWdlCiAgICAgIG9mIHRoYXQgdG8gcmVkdWNlIHRoZSB0cmFtcG9saW5lIHNpemUgYnkgOCBieXRlcy4gKi8KLSAgRkZJX0FTU0VSVCAoY2lmLT5hYmkgPT0gRkZJX1Y5KTsKKyAgaWYgKGNpZi0+YWJpICE9IEZGSV9WOSkKKyAgICByZXR1cm4gRkZJX0JBRF9BQkk7CiAgIGZuID0gKHVuc2lnbmVkIGxvbmcpIGZmaV9jbG9zdXJlX3Y5OwogICB0cmFtcFswXSA9IDB4ODM0MTQwMDA7CS8qIHJkCSVwYywgJWcxCSovCiAgIHRyYW1wWzFdID0gMHhjYTU4NjAxMDsJLyogbGR4CVslZzErMTZdLCAlZzUJKi8KQEAgLTQ1Niw3ICs1MDcsOCBAQAogICAqKCh1bnNpZ25lZCBsb25nICopICZ0cmFtcFs0XSkgPSBmbjsKICNlbHNlCiAgIHVuc2lnbmVkIGxvbmcgY3R4ID0gKHVuc2lnbmVkIGxvbmcpIGNvZGVsb2M7Ci0gIEZGSV9BU1NFUlQgKGNpZi0+YWJpID09IEZGSV9WOCk7CisgIGlmIChjaWYtPmFiaSAhPSBGRklfVjgpCisgICAgcmV0dXJuIEZGSV9CQURfQUJJOwogICBmbiA9ICh1bnNpZ25lZCBsb25nKSBmZmlfY2xvc3VyZV92ODsKICAgdHJhbXBbMF0gPSAweDAzMDAwMDAwIHwgZm4gPj4gMTA7CS8qIHNldGhpICVoaShmbiksICVnMQkqLwogICB0cmFtcFsxXSA9IDB4MDUwMDAwMDAgfCBjdHggPj4gMTA7CS8qIHNldGhpICVoaShjdHgpLCAlZzIJKi8KQEAgLTQ2OCwxMyArNTIwLDE3IEBACiAgIGNsb3N1cmUtPmZ1biA9IGZ1bjsKICAgY2xvc3VyZS0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOwogCi0gIC8qIEZsdXNoIHRoZSBJY2FjaGUuICBGSVhNRTogYWxpZ25tZW50IGlzbid0IGNlcnRhaW4sIGFzc3VtZSA4IGJ5dGVzICovCisgIC8qIEZsdXNoIHRoZSBJY2FjaGUuICBjbG9zdXJlIGlzIDggYnl0ZXMgYWxpZ25lZC4gICovCisjaWZkZWYgX19HTlVDX18KICNpZmRlZiBTUEFSQzY0Ci0gIGFzbSB2b2xhdGlsZSAoImZsdXNoCSUwIiA6IDogInIiIChjbG9zdXJlKSA6ICJtZW1vcnkiKTsKLSAgYXNtIHZvbGF0aWxlICgiZmx1c2gJJTAiIDogOiAiciIgKCgoY2hhciAqKSBjbG9zdXJlKSArIDgpIDogIm1lbW9yeSIpOworICBhc20gdm9sYXRpbGUgKCJmbHVzaAklMDsgZmx1c2ggJTArOCIgOiA6ICJyIiAoY2xvc3VyZSkgOiAibWVtb3J5Iik7CiAjZWxzZQotICBhc20gdm9sYXRpbGUgKCJpZmx1c2gJJTAiIDogOiAiciIgKGNsb3N1cmUpIDogIm1lbW9yeSIpOwotICBhc20gdm9sYXRpbGUgKCJpZmx1c2gJJTAiIDogOiAiciIgKCgoY2hhciAqKSBjbG9zdXJlKSArIDgpIDogIm1lbW9yeSIpOworICBhc20gdm9sYXRpbGUgKCJpZmx1c2gJJTA7IGlmbHVzaCAlMCs4IiA6IDogInIiIChjbG9zdXJlKSA6ICJtZW1vcnkiKTsKKyAgLyogU1BBUkMgdjggcmVxdWlyZXMgNSBpbnN0cnVjdGlvbnMgZm9yIGZsdXNoIHRvIGJlIHZpc2libGUgKi8KKyAgYXNtIHZvbGF0aWxlICgibm9wOyBub3A7IG5vcDsgbm9wOyBub3AiKTsKKyNlbmRpZgorI2Vsc2UKKyAgZmZpX2ZsdXNoX2ljYWNoZSAoY2xvc3VyZSwgMTYpOwogI2VuZGlmCiAKICAgcmV0dXJuIEZGSV9PSzsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3NwYXJjL2ZmaXRhcmdldC5oIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvc3BhcmMvZmZpdGFyZ2V0LmgKaW5kZXggMWExYTFhYy4uZDg5Zjc4NyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvc3BhcmMvZmZpdGFyZ2V0LmgKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvc3BhcmMvZmZpdGFyZ2V0LmgKQEAgLTEsNSArMSw2IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotQy0qLQotICAgZmZpdGFyZ2V0LmggLSBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMyAgUmVkIEhhdCwgSW5jLgorICAgZmZpdGFyZ2V0LmggLSBDb3B5cmlnaHQgKGMpIDIwMTIgIEFudGhvbnkgR3JlZW4KKyAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAxOTk2LTIwMDMgIFJlZCBIYXQsIEluYy4KICAgIFRhcmdldCBjb25maWd1cmF0aW9uIG1hY3JvcyBmb3IgU1BBUkMuCiAKICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwpAQCAtMjcsMTEgKzI4LDE3IEBACiAjaWZuZGVmIExJQkZGSV9UQVJHRVRfSAogI2RlZmluZSBMSUJGRklfVEFSR0VUX0gKIAorI2lmbmRlZiBMSUJGRklfSAorI2Vycm9yICJQbGVhc2UgZG8gbm90IGluY2x1ZGUgZmZpdGFyZ2V0LmggZGlyZWN0bHkgaW50byB5b3VyIHNvdXJjZS4gIFVzZSBmZmkuaCBpbnN0ZWFkLiIKKyNlbmRpZgorCiAvKiAtLS0tIFN5c3RlbSBzcGVjaWZpYyBjb25maWd1cmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAjaWYgZGVmaW5lZChfX2FyY2g2NF9fKSB8fCBkZWZpbmVkKF9fc3BhcmN2OSkKKyNpZm5kZWYgU1BBUkM2NAogI2RlZmluZSBTUEFSQzY0CiAjZW5kaWYKKyNlbmRpZgogCiAjaWZuZGVmIExJQkZGSV9BU00KIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICAgICBmZmlfYXJnOwpAQCAtNDIsMTIgKzQ5LDEyIEBACiAgIEZGSV9WOCwKICAgRkZJX1Y4UExVUywKICAgRkZJX1Y5LAorICBGRklfTEFTVF9BQkksCiAjaWZkZWYgU1BBUkM2NAotICBGRklfREVGQVVMVF9BQkkgPSBGRklfVjksCisgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9WOQogI2Vsc2UKLSAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX1Y4LAorICBGRklfREVGQVVMVF9BQkkgPSBGRklfVjgKICNlbmRpZgotICBGRklfTEFTVF9BQkkgPSBGRklfREVGQVVMVF9BQkkgKyAxCiB9IGZmaV9hYmk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvc3BhcmMvdjguUyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3NwYXJjL3Y4LlMKaW5kZXggYmVmMWI2OC4uNmJmN2FjMCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvc3BhcmMvdjguUworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9zcGFyYy92OC5TCkBAIC0xLDUgKzEsNiBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIHY4LlMgLSBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcsIDIwMDMsIDIwMDQsIDIwMDggUmVkIEhhdCwgSW5jLgorICAgdjguUyAtIENvcHlyaWdodCAoYykgMjAxMyAgVGhlIFdyaXR0ZW4gV29yZCwgSW5jLgorCSAgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3LCAyMDAzLCAyMDA0LCAyMDA4ICBSZWQgSGF0LCBJbmMuCiAgICAKICAgIFNQQVJDIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlIAogCkBAIC0zMSwxMSArMzIsMzkgQEAKICNkZWZpbmUgU1RBQ0tGUkFNRSA5NgkJLyogTWluaW11bSBzdGFjayBmcmFtZXNpemUgZm9yIFNQQVJDICovCiAjZGVmaW5lIEFSR1MgKDY0KzQpCQkvKiBPZmZzZXQgb2YgcmVnaXN0ZXIgYXJlYSBpbiBmcmFtZSAqLwogCi0udGV4dAorI2lmbmRlZiBfX0dOVUNfXwkKKwkudGV4dAorICAgICAgICAuYWxpZ24gOAorLmdsb2JsIGZmaV9mbHVzaF9pY2FjaGUKKy5nbG9ibCBfZmZpX2ZsdXNoX2ljYWNoZQorCitmZmlfZmx1c2hfaWNhY2hlOgorX2ZmaV9mbHVzaF9pY2FjaGU6CQorICAgICAgICBhZGQgJW8wLCAlbzEsICVvMgorI2lmZGVmIFNQQVJDNjQJCisxOglmbHVzaCAlbzAKKyNlbHNlCQorMToJaWZsdXNoICVvMAorI2VuZGlmCisJYWRkICVvMCwgOCwgJW8wCisJY21wICVvMCwgJW8yCisJYmx0IDFiCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJcmV0bAorCW5vcAorLmZmaV9mbHVzaF9pY2FjaGVfZW5kOgorCS5zaXplCWZmaV9mbHVzaF9pY2FjaGUsLmZmaV9mbHVzaF9pY2FjaGVfZW5kLWZmaV9mbHVzaF9pY2FjaGUKKyNlbmRpZgorCisJLnRleHQKICAgICAgICAgLmFsaWduIDgKIC5nbG9ibCBmZmlfY2FsbF92OAogLmdsb2JsIF9mZmlfY2FsbF92OAotCisJCiBmZmlfY2FsbF92ODoKIF9mZmlfY2FsbF92ODoKIC5MTEZCMToKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3NwYXJjL3Y5LlMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9zcGFyYy92OS5TCmluZGV4IDQ4OWZmMDIuLmJmMzFhMmIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3NwYXJjL3Y5LlMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvc3BhcmMvdjkuUwpAQCAtMzIsNyArMzIsNyBAQAogLyogT25seSBjb21waWxlIHRoaXMgaW4gZm9yIDY0Yml0IGJ1aWxkcywgYmVjYXVzZSBvdGhlcndpc2UgdGhlIG9iamVjdCBmaWxlCiAgICB3aWxsIGhhdmUgaW5wcm9wZXIgYXJjaGl0ZWN0dXJlIGR1ZSB0byB1c2VkIGluc3RydWN0aW9ucy4gICovCiAKLSNkZWZpbmUgU1RBQ0tGUkFNRSAxMjgJCS8qIE1pbmltdW0gc3RhY2sgZnJhbWVzaXplIGZvciBTUEFSQyAqLworI2RlZmluZSBTVEFDS0ZSQU1FIDE3NgkJLyogTWluaW11bSBzdGFjayBmcmFtZXNpemUgZm9yIFNQQVJDIDY0LWJpdCAqLwogI2RlZmluZSBTVEFDS19CSUFTIDIwNDcKICNkZWZpbmUgQVJHUyAoMTI4KQkJLyogT2Zmc2V0IG9mIHJlZ2lzdGVyIGFyZWEgaW4gZnJhbWUgKi8KIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvdGlsZS9mZmkuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3RpbGUvZmZpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E5NDQ2OQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3RpbGUvZmZpLmMKQEAgLTAsMCArMSwzNTUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBmZmkuYyAtIENvcHlyaWdodCAoYykgMjAxMiBUaWxlcmEgQ29ycC4KKworICAgVElMRSBGb3JlaWduIEZ1bmN0aW9uIEludGVyZmFjZQorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8ZmZpLmg+CisjaW5jbHVkZSA8ZmZpX2NvbW1vbi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGFyY2gvYWJpLmg+CisjaW5jbHVkZSA8YXJjaC9pY2FjaGUuaD4KKyNpbmNsdWRlIDxhcmNoL29wY29kZS5oPgorCisKKy8qIFRoZSBmaXJzdCAxMCByZWdpc3RlcnMgYXJlIHVzZWQgdG8gcGFzcyBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZXMuICovCisjZGVmaW5lIE5VTV9BUkdfUkVHUyAxMAorCisvKiBQZXJmb3JtcyBhIHJhdyBmdW5jdGlvbiBjYWxsIHdpdGggdGhlIGdpdmVuIE5VTV9BUkdfUkVHUyByZWdpc3RlciBhcmd1bWVudHMKKyAgIGFuZCB0aGUgc3BlY2lmaWVkIGFkZGl0aW9uYWwgc3RhY2sgYXJndW1lbnRzIChpZiBhbnkpLiAqLworZXh0ZXJuIHZvaWQgZmZpX2NhbGxfdGlsZShmZmlfc2FyZyByZWdfYXJnc1tOVU1fQVJHX1JFR1NdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmZmlfc2FyZyAqc3RhY2tfYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHN0YWNrX2FyZ3NfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpmbmFkZHIpKHZvaWQpKQorICBGRklfSElEREVOOworCisvKiBUaGlzIGhhbmRsZXMgdGhlIHJhdyBjYWxsIGZyb20gdGhlIGNsb3N1cmUgc3R1YiwgY2xlYW5pbmcgdXAgdGhlCisgICBwYXJhbWV0ZXJzIGFuZCBkZWxlZ2F0aW5nIHRvIGZmaV9jbG9zdXJlX3RpbGVfaW5uZXIuICovCitleHRlcm4gdm9pZCBmZmlfY2xvc3VyZV90aWxlKHZvaWQpIEZGSV9ISURERU47CisKKworZmZpX3N0YXR1cworZmZpX3ByZXBfY2lmX21hY2hkZXAoZmZpX2NpZiAqY2lmKQoreworICAvKiBXZSBhbHdheXMgYWxsb2NhdGUgcm9vbSBmb3IgYWxsIHJlZ2lzdGVycy4gRXZlbiBpZiB3ZSBkb24ndAorICAgICB1c2UgdGhlbSBhcyBwYXJhbWV0ZXJzLCB0aGV5IGdldCByZXR1cm5lZCBpbiB0aGUgc2FtZSBhcnJheQorICAgICBhcyBzdHJ1Y3QgcmV0dXJuIHZhbHVlcyBzbyB3ZSBuZWVkIHRvIG1ha2Ugcm9vbS4gKi8KKyAgaWYgKGNpZi0+Ynl0ZXMgPCBOVU1fQVJHX1JFR1MgKiBGRklfU0laRU9GX0FSRykKKyAgICBjaWYtPmJ5dGVzID0gTlVNX0FSR19SRUdTICogRkZJX1NJWkVPRl9BUkc7CisKKyAgaWYgKGNpZi0+cnR5cGUtPnNpemUgPiBOVU1fQVJHX1JFR1MgKiBGRklfU0laRU9GX0FSRykKKyAgICBjaWYtPmZsYWdzID0gRkZJX1RZUEVfU1RSVUNUOworICBlbHNlCisgICAgY2lmLT5mbGFncyA9IEZGSV9UWVBFX0lOVDsKKworICAvKiBOb3RoaW5nIHRvIGRvLiAqLworICByZXR1cm4gRkZJX09LOworfQorCisKK3N0YXRpYyBsb25nCithc3NpZ25fdG9fZmZpX2FyZyhmZmlfc2FyZyAqb3V0LCB2b2lkICppbiwgY29uc3QgZmZpX3R5cGUgKnR5cGUsCisgICAgICAgICAgICAgICAgICBpbnQgd3JpdGVfdG9fcmVnKQoreworICBzd2l0Y2ggKHR5cGUtPnR5cGUpCisgICAgeworICAgIGNhc2UgRkZJX1RZUEVfU0lOVDg6CisgICAgICAqb3V0ID0gKihTSU5UOCAqKWluOworICAgICAgcmV0dXJuIDE7CisKKyAgICBjYXNlIEZGSV9UWVBFX1VJTlQ4OgorICAgICAgKm91dCA9ICooVUlOVDggKilpbjsKKyAgICAgIHJldHVybiAxOworCisgICAgY2FzZSBGRklfVFlQRV9TSU5UMTY6CisgICAgICAqb3V0ID0gKihTSU5UMTYgKilpbjsKKyAgICAgIHJldHVybiAxOworCisgICAgY2FzZSBGRklfVFlQRV9VSU5UMTY6CisgICAgICAqb3V0ID0gKihVSU5UMTYgKilpbjsKKyAgICAgIHJldHVybiAxOworCisgICAgY2FzZSBGRklfVFlQRV9TSU5UMzI6CisgICAgY2FzZSBGRklfVFlQRV9VSU5UMzI6CisjaWZuZGVmIF9fTFA2NF9fCisgICAgY2FzZSBGRklfVFlQRV9QT0lOVEVSOgorI2VuZGlmCisgICAgICAvKiBOb3RlIHRoYXQgZXZlbiB1bnNpZ25lZCAzMi1iaXQgcXVhbnRpdGllcyBhcmUgc2lnbiBleHRlbmRlZAorICAgICAgICAgb24gdGlsZWd4IHdoZW4gc3RvcmVkIGluIGEgcmVnaXN0ZXIuICAqLworICAgICAgKm91dCA9ICooU0lOVDMyICopaW47CisgICAgICByZXR1cm4gMTsKKworICAgIGNhc2UgRkZJX1RZUEVfRkxPQVQ6CisjaWZkZWYgX190aWxlZ3hfXworICAgICAgaWYgKHdyaXRlX3RvX3JlZykKKyAgICAgICAgeworICAgICAgICAgIC8qIFByb3Blcmx5IHNpZ24gZXh0ZW5kIHRoZSB2YWx1ZS4gICovCisgICAgICAgICAgdW5pb24geyBmbG9hdCBmOyBTSU5UMzIgczMyOyB9IHZhbDsKKyAgICAgICAgICB2YWwuZiA9ICooZmxvYXQgKilpbjsKKyAgICAgICAgICAqb3V0ID0gdmFsLnMzMjsKKyAgICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICAqKGZsb2F0ICopb3V0ID0gKihmbG9hdCAqKWluOworICAgICAgICB9CisgICAgICByZXR1cm4gMTsKKworICAgIGNhc2UgRkZJX1RZUEVfU0lOVDY0OgorICAgIGNhc2UgRkZJX1RZUEVfVUlOVDY0OgorICAgIGNhc2UgRkZJX1RZUEVfRE9VQkxFOgorI2lmZGVmIF9fTFA2NF9fCisgICAgY2FzZSBGRklfVFlQRV9QT0lOVEVSOgorI2VuZGlmCisgICAgICAqKFVJTlQ2NCAqKW91dCA9ICooVUlOVDY0ICopaW47CisgICAgICByZXR1cm4gc2l6ZW9mKFVJTlQ2NCkgLyBGRklfU0laRU9GX0FSRzsKKworICAgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOgorICAgICAgbWVtY3B5KG91dCwgaW4sIHR5cGUtPnNpemUpOworICAgICAgcmV0dXJuICh0eXBlLT5zaXplICsgRkZJX1NJWkVPRl9BUkcgLSAxKSAvIEZGSV9TSVpFT0ZfQVJHOworCisgICAgY2FzZSBGRklfVFlQRV9WT0lEOgorICAgICAgLyogTXVzdCBiZSBhIHJldHVybiB0eXBlLiBOb3RoaW5nIHRvIGRvLiAqLworICAgICAgcmV0dXJuIDA7CisKKyAgICBkZWZhdWx0OgorICAgICAgRkZJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKKwordm9pZAorZmZpX2NhbGwoZmZpX2NpZiAqY2lmLCB2b2lkICgqZm4pKHZvaWQpLCB2b2lkICpydmFsdWUsIHZvaWQgKiphdmFsdWUpCit7CisgIGZmaV9zYXJnICogY29uc3QgYXJnX21lbSA9IGFsbG9jYShjaWYtPmJ5dGVzKTsKKyAgZmZpX3NhcmcgKiBjb25zdCByZWdfYXJncyA9IGFyZ19tZW07CisgIGZmaV9zYXJnICogY29uc3Qgc3RhY2tfYXJncyA9ICZyZWdfYXJnc1tOVU1fQVJHX1JFR1NdOworICBmZmlfc2FyZyAqYXJncCA9IGFyZ19tZW07CisgIGZmaV90eXBlICoqIGNvbnN0IGFyZ190eXBlcyA9IGNpZi0+YXJnX3R5cGVzOworICBjb25zdCBsb25nIG51bV9hcmdzID0gY2lmLT5uYXJnczsKKyAgbG9uZyBpOworCisgIGlmIChjaWYtPmZsYWdzID09IEZGSV9UWVBFX1NUUlVDVCkKKyAgICB7CisgICAgICAvKiBQYXNzIGEgaGlkZGVuIHBvaW50ZXIgdG8gdGhlIHJldHVybiB2YWx1ZS4gV2UgbWFrZSBzdXJlIHRoZXJlCisgICAgICAgICBpcyBzY3JhdGNoIHNwYWNlIGZvciB0aGUgY2FsbGVlIHRvIHN0b3JlIHRoZSByZXR1cm4gdmFsdWUgZXZlbiBpZgorICAgICAgICAgb3VyIGNhbGxlciBkb2Vzbid0IGNhcmUgYWJvdXQgaXQuICovCisgICAgICAqYXJncCsrID0gKGludHB0cl90KShydmFsdWUgPyBydmFsdWUgOiBhbGxvY2EoY2lmLT5ydHlwZS0+c2l6ZSkpOworCisgICAgICAvKiBObyBtb3JlIHdvcmsgbmVlZGVkIHRvIHJldHVybiBhbnl0aGluZy4gKi8KKyAgICAgIHJ2YWx1ZSA9IE5VTEw7CisgICAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBudW1fYXJnczsgaSsrKQorICAgIHsKKyAgICAgIGZmaV90eXBlICp0eXBlID0gYXJnX3R5cGVzW2ldOworICAgICAgdm9pZCAqIGNvbnN0IGFyZ19pbiA9IGF2YWx1ZVtpXTsKKyAgICAgIHB0cmRpZmZfdCBhcmdfd29yZCA9IGFyZ3AgLSBhcmdfbWVtOworCisjaWZuZGVmIF9fdGlsZWd4X18KKyAgICAgIC8qIERvdWJsZXdvcmQtYWxpZ25lZCB2YWx1ZXMgYXJlIGFsd2F5cyBpbiBhbiBldmVuLW51bWJlciByZWdpc3RlcgorICAgICAgICAgcGFpciwgb3IgZG91Ymxld29yZC1hbGlnbmVkIHN0YWNrIHNsb3QgaWYgb3V0IG9mIHJlZ2lzdGVycy4gKi8KKyAgICAgIGxvbmcgYWxpZ24gPSBhcmdfd29yZCAmICh0eXBlLT5hbGlnbm1lbnQgPiBGRklfU0laRU9GX0FSRyk7CisgICAgICBhcmdwICs9IGFsaWduOworICAgICAgYXJnX3dvcmQgKz0gYWxpZ247CisjZW5kaWYKKworICAgICAgaWYgKHR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKQorICAgICAgICB7CisgICAgICAgICAgY29uc3Qgc2l6ZV90IGFyZ19zaXplX2luX3dvcmRzID0KKyAgICAgICAgICAgICh0eXBlLT5zaXplICsgRkZJX1NJWkVPRl9BUkcgLSAxKSAvIEZGSV9TSVpFT0ZfQVJHOworCisgICAgICAgICAgaWYgKGFyZ193b3JkIDwgTlVNX0FSR19SRUdTICYmCisgICAgICAgICAgICAgIGFyZ193b3JkICsgYXJnX3NpemVfaW5fd29yZHMgPiBOVU1fQVJHX1JFR1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIEFyZ3MgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gcmVnaXN0ZXJzIGFuZCB0aGUgc3RhY2suICovCisgICAgICAgICAgICAgIGFyZ3AgPSBzdGFja19hcmdzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgbWVtY3B5KGFyZ3AsIGFyZ19pbiwgdHlwZS0+c2l6ZSk7CisgICAgICAgICAgYXJncCArPSBhcmdfc2l6ZV9pbl93b3JkczsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgYXJncCArPSBhc3NpZ25fdG9fZmZpX2FyZyhhcmdwLCBhcmdfaW4sIGFyZ190eXBlc1tpXSwgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogQWN0dWFsbHkgZG8gdGhlIGNhbGwuICovCisgIGZmaV9jYWxsX3RpbGUocmVnX2FyZ3MsIHN0YWNrX2FyZ3MsCisgICAgICAgICAgICAgICAgY2lmLT5ieXRlcyAtIChOVU1fQVJHX1JFR1MgKiBGRklfU0laRU9GX0FSRyksIGZuKTsKKworICBpZiAocnZhbHVlICE9IE5VTEwpCisgICAgYXNzaWduX3RvX2ZmaV9hcmcocnZhbHVlLCByZWdfYXJncywgY2lmLT5ydHlwZSwgMCk7Cit9CisKKworLyogVGVtcGxhdGUgY29kZSBmb3IgY2xvc3VyZS4gKi8KK2V4dGVybiBjb25zdCBVSU5UNjQgZmZpX3RlbXBsYXRlX3RyYW1wX3RpbGVbXSBGRklfSElEREVOOworCisKK2ZmaV9zdGF0dXMKK2ZmaV9wcmVwX2Nsb3N1cmVfbG9jIChmZmlfY2xvc3VyZSAqY2xvc3VyZSwKKyAgICAgICAgICAgICAgICAgICAgICBmZmlfY2lmICpjaWYsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmZ1bikoZmZpX2NpZiosIHZvaWQqLCB2b2lkKiosIHZvaWQqKSwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29kZWxvYykKK3sKKyNpZmRlZiBfX3RpbGVneF9fCisgIC8qIFRJTEUtR3ggKi8KKyAgU0lOVDY0IGM7CisgIFNJTlQ2NCBoOworICBpbnQgczsKKyAgVUlOVDY0ICpvdXQ7CisKKyAgaWYgKGNpZi0+YWJpICE9IEZGSV9VTklYKQorICAgIHJldHVybiBGRklfQkFEX0FCSTsKKworICBvdXQgPSAoVUlOVDY0ICopY2xvc3VyZS0+dHJhbXA7CisKKyAgYyA9IChpbnRwdHJfdCljbG9zdXJlOworICBoID0gKGludHB0cl90KWZmaV9jbG9zdXJlX3RpbGU7CisgIHMgPSAwOworCisgIC8qIEZpbmQgdGhlIHNtYWxsZXN0IHNoaWZ0IGNvdW50IHRoYXQgZG9lc24ndCBsb3NlIGluZm9ybWF0aW9uCisgICAgIChpLmUuIG5vIG5lZWQgdG8gZXhwbGljaXRseSBpbnNlcnQgaGlnaCBiaXRzIG9mIHRoZSBhZGRyZXNzIHRoYXQKKyAgICAgYXJlIGp1c3QgdGhlIHNpZ24gZXh0ZW5zaW9uIG9mIHRoZSBsb3cgYml0cykuICovCisgIHdoaWxlICgoYyA+PiBzKSAhPSAoU0lOVDE2KShjID4+IHMpIHx8IChoID4+IHMpICE9IChTSU5UMTYpKGggPj4gcykpCisgICAgcyArPSAxNjsKKworI2RlZmluZSBPUFMoYSwgYiwgc2hpZnQpIFwKKyAgKGNyZWF0ZV9JbW0xNl9YMCgoYSkgPj4gKHNoaWZ0KSkgfCBjcmVhdGVfSW1tMTZfWDEoKGIpID4+IChzaGlmdCkpKQorCisgIC8qIEVtaXQgdGhlIG1vdmVsaS4gKi8KKyAgKm91dCsrID0gZmZpX3RlbXBsYXRlX3RyYW1wX3RpbGVbMF0gfCBPUFMoYywgaCwgcyk7CisgIGZvciAocyAtPSAxNjsgcyA+PSAwOyBzIC09IDE2KQorICAgICpvdXQrKyA9IGZmaV90ZW1wbGF0ZV90cmFtcF90aWxlWzFdIHwgT1BTKGMsIGgsIHMpOworCisjdW5kZWYgT1BTCisKKyAgKm91dCsrID0gZmZpX3RlbXBsYXRlX3RyYW1wX3RpbGVbMl07CisKKyNlbHNlCisgIC8qIFRJTEVQcm8gKi8KKyAgVUlOVDY0ICpvdXQ7CisgIGludHB0cl90IGRlbHRhOworCisgIGlmIChjaWYtPmFiaSAhPSBGRklfVU5JWCkKKyAgICByZXR1cm4gRkZJX0JBRF9BQkk7CisKKyAgb3V0ID0gKFVJTlQ2NCAqKWNsb3N1cmUtPnRyYW1wOworICBkZWx0YSA9IChpbnRwdHJfdClmZmlfY2xvc3VyZV90aWxlIC0gKGludHB0cl90KWNvZGVsb2M7CisKKyAgKm91dCsrID0gZmZpX3RlbXBsYXRlX3RyYW1wX3RpbGVbMF0gfCBjcmVhdGVfSk9mZkxvbmdfWDEoZGVsdGEgPj4gMyk7CisjZW5kaWYKKworICBjbG9zdXJlLT5jaWYgPSBjaWY7CisgIGNsb3N1cmUtPmZ1biA9IGZ1bjsKKyAgY2xvc3VyZS0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOworCisgIGludmFsaWRhdGVfaWNhY2hlKGNsb3N1cmUtPnRyYW1wLCAoY2hhciAqKW91dCAtIGNsb3N1cmUtPnRyYW1wLAorICAgICAgICAgICAgICAgICAgICBnZXRwYWdlc2l6ZSgpKTsKKworICByZXR1cm4gRkZJX09LOworfQorCisKKy8qIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBhc3NlbWJseSB3cmFwcGVyIGZvciBjbG9zdXJlcy4gVGhpcyBkb2VzCisgICBhbGwgb2YgdGhlIHdvcmsuIE9uIGVudHJ5IHJlZ19hcmdzWzBdIGhvbGRzIHRoZSB2YWx1ZXMgdGhlIHJlZ2lzdGVycworICAgaGFkIHdoZW4gdGhlIGNsb3N1cmUgd2FzIGludm9rZWQuIE9uIHJldHVybiByZWdfYXJnc1sxXSBob2xkcyB0aGUgcmVnaXN0ZXIKKyAgIHZhbHVlcyB0byBiZSByZXR1cm5lZCB0byB0aGUgY2FsbGVyIChtYW55IG9mIHdoaWNoIG1heSBiZSBnYXJiYWdlKS4gKi8KK3ZvaWQgRkZJX0hJRERFTgorZmZpX2Nsb3N1cmVfdGlsZV9pbm5lcihmZmlfY2xvc3VyZSAqY2xvc3VyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmZpX3NhcmcgcmVnX2FyZ3NbMl1bTlVNX0FSR19SRUdTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmZpX3NhcmcgKnN0YWNrX2FyZ3MpCit7CisgIGZmaV9jaWYgKiBjb25zdCBjaWYgPSBjbG9zdXJlLT5jaWY7CisgIHZvaWQgKiogY29uc3QgYXZhbHVlID0gYWxsb2NhKGNpZi0+bmFyZ3MgKiBzaXplb2Yodm9pZCAqKSk7CisgIHZvaWQgKnJ2YWx1ZTsKKyAgZmZpX3R5cGUgKiogY29uc3QgYXJnX3R5cGVzID0gY2lmLT5hcmdfdHlwZXM7CisgIGZmaV9zYXJnICogY29uc3QgcmVnX2FyZ3NfaW4gPSByZWdfYXJnc1swXTsKKyAgZmZpX3NhcmcgKiBjb25zdCByZWdfYXJnc19vdXQgPSByZWdfYXJnc1sxXTsKKyAgZmZpX3NhcmcgKiBhcmdwOworICBsb25nIGksIGFyZ193b3JkLCBuYXJncyA9IGNpZi0+bmFyZ3M7CisgIC8qIFVzZSBhIHVuaW9uIHRvIGd1YXJhbnRlZSBwcm9wZXIgYWxpZ25tZW50IGZvciBkb3VibGUuICovCisgIHVuaW9uIHsgZmZpX3NhcmcgYXJnW05VTV9BUkdfUkVHU107IGRvdWJsZSBkOyBVSU5UNjQgdTY0OyB9IGNsb3N1cmVfcmV0OworCisgIC8qIFN0YXJ0IG91dCByZWFkaW5nIHJlZ2lzdGVyIGFyZ3VtZW50cy4gKi8KKyAgYXJncCA9IHJlZ19hcmdzX2luOworCisgIC8qIENvcHkgdGhlIGNhbGxlcidzIHN0cnVjdHVyZSByZXR1cm4gYWRkcmVzcyB0byB0aGF0IHRoZSBjbG9zdXJlCisgICAgIHJldHVybnMgdGhlIGRhdGEgZGlyZWN0bHkgdG8gdGhlIGNhbGxlci4gICovCisgIGlmIChjaWYtPmZsYWdzID09IEZGSV9UWVBFX1NUUlVDVCkKKyAgICB7CisgICAgICAvKiBSZXR1cm4gYnkgcmVmZXJlbmNlIHZpYSBoaWRkZW4gcG9pbnRlci4gKi8KKyAgICAgIHJ2YWx1ZSA9ICh2b2lkICopKGludHB0cl90KSphcmdwKys7CisgICAgICBhcmdfd29yZCA9IDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogUmV0dXJuIHRoZSB2YWx1ZSBpbiByZWdpc3RlcnMuICovCisgICAgICBydmFsdWUgPSAmY2xvc3VyZV9yZXQ7CisgICAgICBhcmdfd29yZCA9IDA7CisgICAgfQorCisgIC8qIEdyYWIgdGhlIGFkZHJlc3NlcyBvZiB0aGUgYXJndW1lbnRzLiAqLworICBmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykKKyAgICB7CisgICAgICBmZmlfdHlwZSAqIGNvbnN0IHR5cGUgPSBhcmdfdHlwZXNbaV07CisgICAgICBjb25zdCBzaXplX3QgYXJnX3NpemVfaW5fd29yZHMgPQorICAgICAgICAodHlwZS0+c2l6ZSArIEZGSV9TSVpFT0ZfQVJHIC0gMSkgLyBGRklfU0laRU9GX0FSRzsKKworI2lmbmRlZiBfX3RpbGVneF9fCisgICAgICAvKiBEb3VibGV3b3JkLWFsaWduZWQgdmFsdWVzIGFyZSBhbHdheXMgaW4gYW4gZXZlbi1udW1iZXIgcmVnaXN0ZXIKKyAgICAgICAgIHBhaXIsIG9yIGRvdWJsZXdvcmQtYWxpZ25lZCBzdGFjayBzbG90IGlmIG91dCBvZiByZWdpc3RlcnMuICovCisgICAgICBsb25nIGFsaWduID0gYXJnX3dvcmQgJiAodHlwZS0+YWxpZ25tZW50ID4gRkZJX1NJWkVPRl9BUkcpOworICAgICAgYXJncCArPSBhbGlnbjsKKyAgICAgIGFyZ193b3JkICs9IGFsaWduOworI2VuZGlmCisKKyAgICAgIGlmIChhcmdfd29yZCA9PSBOVU1fQVJHX1JFR1MgfHwKKyAgICAgICAgICAoYXJnX3dvcmQgPCBOVU1fQVJHX1JFR1MgJiYKKyAgICAgICAgICAgYXJnX3dvcmQgKyBhcmdfc2l6ZV9pbl93b3JkcyA+IE5VTV9BUkdfUkVHUykpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTd2l0Y2ggdG8gcmVhZGluZyBhcmd1bWVudHMgZnJvbSB0aGUgc3RhY2suICovCisgICAgICAgICAgYXJncCA9IHN0YWNrX2FyZ3M7CisgICAgICAgICAgYXJnX3dvcmQgPSBOVU1fQVJHX1JFR1M7CisgICAgICAgIH0KKworICAgICAgYXZhbHVlW2ldID0gYXJncDsKKyAgICAgIGFyZ3AgKz0gYXJnX3NpemVfaW5fd29yZHM7CisgICAgICBhcmdfd29yZCArPSBhcmdfc2l6ZV9pbl93b3JkczsKKyAgICB9CisKKyAgLyogSW52b2tlIHRoZSBjbG9zdXJlLiAgKi8KKyAgY2xvc3VyZS0+ZnVuKGNpZiwgcnZhbHVlLCBhdmFsdWUsIGNsb3N1cmUtPnVzZXJfZGF0YSk7CisKKyAgaWYgKGNpZi0+ZmxhZ3MgIT0gRkZJX1RZUEVfU1RSVUNUKQorICAgIHsKKyAgICAgIC8qIENhbm9uaWNhbGl6ZSBmb3IgcmVnaXN0ZXIgcmVwcmVzZW50YXRpb24uICovCisgICAgICBhc3NpZ25fdG9fZmZpX2FyZyhyZWdfYXJnc19vdXQsICZjbG9zdXJlX3JldCwgY2lmLT5ydHlwZSwgMSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvdGlsZS9mZml0YXJnZXQuaCBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3RpbGUvZmZpdGFyZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc5ZmI1ZAotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3RpbGUvZmZpdGFyZ2V0LmgKQEAgLTAsMCArMSw2NSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLUMtKi0KKyAgIGZmaXRhcmdldC5oIC0gQ29weXJpZ2h0IChjKSAyMDEyIFRpbGVyYSBDb3JwLgorICAgVGFyZ2V0IGNvbmZpZ3VyYXRpb24gbWFjcm9zIGZvciBUSUxFLgorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIExJQkZGSV9UQVJHRVRfSAorI2RlZmluZSBMSUJGRklfVEFSR0VUX0gKKworI2lmbmRlZiBMSUJGRklfSAorI2Vycm9yICJQbGVhc2UgZG8gbm90IGluY2x1ZGUgZmZpdGFyZ2V0LmggZGlyZWN0bHkgaW50byB5b3VyIHNvdXJjZS4gIFVzZSBmZmkuaCBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIExJQkZGSV9BU00KKworI2luY2x1ZGUgPGFyY2gvYWJpLmg+CisKK3R5cGVkZWYgdWludF9yZWdfdCBmZmlfYXJnOwordHlwZWRlZiBpbnRfcmVnX3QgIGZmaV9zYXJnOworCit0eXBlZGVmIGVudW0gZmZpX2FiaSB7CisgIEZGSV9GSVJTVF9BQkkgPSAwLAorICBGRklfVU5JWCwKKyAgRkZJX0xBU1RfQUJJLAorICBGRklfREVGQVVMVF9BQkkgPSBGRklfVU5JWAorfSBmZmlfYWJpOworI2VuZGlmCisKKy8qIC0tLS0gRGVmaW5pdGlvbnMgZm9yIGNsb3N1cmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIEZGSV9DTE9TVVJFUyAxCisKKyNpZmRlZiBfX3RpbGVneF9fCisvKiBXZSBhbHdheXMgcGFzcyA4LWJ5dGUgdmFsdWVzLCBldmVuIGluIC1tMzIgbW9kZS4gKi8KKyMgZGVmaW5lIEZGSV9TSVpFT0ZfQVJHIDgKKyMgaWZkZWYgX19MUDY0X18KKyMgIGRlZmluZSBGRklfVFJBTVBPTElORV9TSVpFICg4ICogNSkgIC8qIDUgYnVuZGxlcyAqLworIyBlbHNlCisjICBkZWZpbmUgRkZJX1RSQU1QT0xJTkVfU0laRSAoOCAqIDMpICAvKiAzIGJ1bmRsZXMgKi8KKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBGRklfU0laRU9GX0FSRyA0CisjIGRlZmluZSBGRklfVFJBTVBPTElORV9TSVpFIDggLyogMSBidW5kbGUgKi8KKyNlbmRpZgorI2RlZmluZSBGRklfTkFUSVZFX1JBV19BUEkgMAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3RpbGUvdGlsZS5TIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvdGlsZS90aWxlLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE4NmUxZgotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3RpbGUvdGlsZS5TCkBAIC0wLDAgKzEsMzYwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgdGlsZS5TIC0gQ29weXJpZ2h0IChjKSAyMDExIFRpbGVyYSBDb3JwLgorCisgICBUaWxlcmEgVElMRVBybyBhbmQgVElMRS1HeCBGb3JlaWduIEZ1bmN0aW9uIEludGVyZmFjZQorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIExJQkZGSV9BU00KKyNpbmNsdWRlIDxmZmljb25maWcuaD4KKyNpbmNsdWRlIDxmZmkuaD4KKworLyogTnVtYmVyIG9mIGJ5dGVzIGluIGEgcmVnaXN0ZXIuICovCisjZGVmaW5lIFJFR19TSVpFIEZGSV9TSVpFT0ZfQVJHCisKKy8qIE51bWJlciBvZiBieXRlcyBpbiBzdGFjayBsaW5rYWdlIGFyZWEgZm9yIGJhY2t0cmFjaW5nLgorCisgICBBIG5vdGUgYWJvdXQgdGhlIEFCSTogb24gZW50cnkgdG8gYSBwcm9jZWR1cmUsIHNwIHBvaW50cyB0byBhIHN0YWNrCisgICBzbG90IHdoZXJlIGl0IG11c3Qgc3BpbGwgdGhlIHJldHVybiBhZGRyZXNzIGlmIGl0J3Mgbm90IGEgbGVhZi4KKyAgIFJFR19TSVpFIGJ5dGVzIGJleW9uZCB0aGF0IGlzIGEgc2xvdCBvd25lZCBieSB0aGUgY2FsbGVyIHdoaWNoCisgICBjb250YWlucyB0aGUgc3AgdmFsdWUgdGhhdCB0aGUgY2FsbGVyIGhhZCB3aGVuIGl0IHdhcyBvcmlnaW5hbGx5CisgICBlbnRlcmVkIChpLmUuIHRoZSBjYWxsZXIncyBmcmFtZSBwb2ludGVyKS4gKi8KKyNkZWZpbmUgTElOS0FHRV9TSVpFICgyICogUkVHX1NJWkUpCisKKy8qIFRoZSBmaXJzdCAxMCByZWdpc3RlcnMgYXJlIHVzZWQgdG8gcGFzcyBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZXMuICovCisjZGVmaW5lIE5VTV9BUkdfUkVHUyAxMAorCisjaWZkZWYgX190aWxlZ3hfXworI2RlZmluZSBTVyBzdAorI2RlZmluZSBMVyBsZAorI2RlZmluZSBCR1pUIGJndHp0CisjZWxzZQorI2RlZmluZSBTVyBzdworI2RlZmluZSBMVyBsdworI2RlZmluZSBCR1pUIGJnenQKKyNlbmRpZgorCisKKy8qIHZvaWQgZmZpX2NhbGxfdGlsZSAoaW50X3JlZ190IHJlZ19hcmdzW05VTV9BUkdfUkVHU10sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludF9yZWdfdCAqc3RhY2tfYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzdGFja19hcmdzX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZm5hZGRyKSh2b2lkKSk7CisKKyAgICAgICAgT24gZW50cnksIFJFR19BUkdTIGNvbnRhaW4gdGhlIG91dGdvaW5nIHJlZ2lzdGVyIHZhbHVlcywKKyAgICAgICAgYW5kIFNUQUNLX0FSR1MgY29udGFpbnRzIFNUQUNLX0FSR19CWVRFUyBvZiBhZGRpdGlvbmFsIHZhbHVlcworICAgICAgICB0byBiZSBwYXNzZWQgb24gdGhlIHN0YWNrLiBJZiBTVEFDS19BUkdfQllURVMgaXMgemVybywgdGhlbgorICAgICAgICBTVEFDS19BUkdTIGlzIGlnbm9yZWQuCisKKyAgICAgICAgV2hlbiB0aGUgaW52b2tlZCBmdW5jdGlvbiByZXR1cm5zLCB0aGUgdmFsdWVzIG9mIHIwLXI5IGFyZQorICAgICAgICBibGluZGx5IHN0b3JlZCBiYWNrIGludG8gUkVHX0FSR1MgZm9yIHRoZSBjYWxsZXIgdG8gZXhhbWluZS4gKi8KKworICAgICAgICAuc2VjdGlvbiAudGV4dC5mZmlfY2FsbF90aWxlLCAiYXgiLCBAcHJvZ2JpdHMKKyAgICAgICAgLmFsaWduICA4CisgICAgICAgIC5nbG9ibCAgZmZpX2NhbGxfdGlsZQorICAgICAgICBGRklfSElEREVOKGZmaV9jYWxsX3RpbGUpCitmZmlfY2FsbF90aWxlOgorCisvKiBJbmNvbWluZyBhcmd1bWVudHMuICovCisjZGVmaW5lIFJFR19BUkdTICAgICAgICAgICAgICAgIHIwCisjZGVmaW5lIElOQ09NSU5HX1NUQUNLX0FSR1MgICAgIHIxCisjZGVmaW5lIFNUQUNLX0FSR19CWVRFUyAgICAgICAgIHIyCisjZGVmaW5lIE9SSUdfRk5BRERSICAgICAgICAgICAgIHIzCisKKy8qIFRlbXBvcmFyeSB2YWx1ZXMuICovCisjZGVmaW5lIEZSQU1FX1NJWkUgICAgICAgICAgICAgIHIxMAorI2RlZmluZSBUTVAgICAgICAgICAgICAgICAgICAgICByMTEKKyNkZWZpbmUgVE1QMiAgICAgICAgICAgICAgICAgICAgcjEyCisjZGVmaW5lIE9VVEdPSU5HX1NUQUNLX0FSR1MgICAgIHIxMworI2RlZmluZSBSRUdfQUREUl9QVFIgICAgICAgICAgICByMTQKKyNkZWZpbmUgUkVUVVJOX1JFR19BRERSICAgICAgICAgcjE1CisjZGVmaW5lIEZOQUREUiAgICAgICAgICAgICAgICAgIHIxNgorCisgICAgICAgIC5jZmlfc3RhcnRwcm9jCisgICAgICAgIHsKKyAgICAgICAgIC8qIFNhdmUgcmV0dXJuIGFkZHJlc3MuICovCisgICAgICAgICBTVyAgICAgc3AsIGxyCisgICAgICAgICAuY2ZpX29mZnNldCBsciwgMAorICAgICAgICAgLyogUHJlcGFyZSB0byBzcGlsbCBpbmNvbWluZyByNTIuICovCisgICAgICAgICBhZGRpICAgVE1QLCBzcCwgLVJFR19TSVpFCisgICAgICAgICAvKiBJbmNyZWFzZSBmcmFtZSBzaXplIHRvIGhhdmUgcm9vbSB0byBzcGlsbCByNTIgYW5kIFJFR19BUkdTLgorICAgICAgICAgICAgVGhlICs3IGlzIHRvIHJvdW5kIHVwIG1vZCA4LiAqLworICAgICAgICAgYWRkaSAgIEZSQU1FX1NJWkUsIFNUQUNLX0FSR19CWVRFUywgXAorICAgICAgICAgICAgICAgIFJFR19TSVpFICsgUkVHX1NJWkUgKyBMSU5LQUdFX1NJWkUgKyA3CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgLyogUm91bmQgc3RhY2sgZnJhbWUgc2l6ZSB0byBhIG11bHRpcGxlIG9mIDggdG8gc2F0aXNmeSBBQkkuICovCisgICAgICAgICBhbmRpICAgRlJBTUVfU0laRSwgRlJBTUVfU0laRSwgLTgKKyAgICAgICAgIC8qIENvbXB1dGUgd2hlcmUgdG8gc3BpbGwgUkVHX0FSR1MgdmFsdWUuICovCisgICAgICAgICBhZGRpICAgVE1QMiwgc3AsIC0oUkVHX1NJWkUgKiAyKQorICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgIC8qIFNwaWxsIGluY29taW5nIHI1Mi4gKi8KKyAgICAgICAgIFNXICAgICBUTVAsIHI1MgorICAgICAgICAgLmNmaV9vZmZzZXQgcjUyLCAtUkVHX1NJWkUKKyAgICAgICAgIC8qIFNldCB1cCBvdXIgZnJhbWUgcG9pbnRlci4gKi8KKyAgICAgICAgIG1vdmUgICByNTIsIHNwCisgICAgICAgICAuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIgcjUyCisgICAgICAgICAvKiBQdXNoIHN0YWNrIGZyYW1lLiAqLworICAgICAgICAgc3ViICAgIHNwLCBzcCwgRlJBTUVfU0laRQorICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgIC8qIFByZXBhcmUgdG8gc2V0IHVwIHN0YWNrIGxpbmthZ2UuICovCisgICAgICAgICBhZGRpICAgVE1QLCBzcCwgUkVHX1NJWkUKKyAgICAgICAgIC8qIFByZXBhcmUgdG8gbWVtY3B5IHN0YWNrIGFyZ3MuICovCisgICAgICAgICBhZGRpICAgT1VUR09JTkdfU1RBQ0tfQVJHUywgc3AsIExJTktBR0VfU0laRQorICAgICAgICAgLyogU2F2ZSBSRUdfQVJHUyB3aGljaCB3ZSB3aWxsIG5lZWQgYWZ0ZXIgd2UgY2FsbCB0aGUgc3Vicm91dGluZS4gKi8KKyAgICAgICAgIFNXICAgICBUTVAyLCBSRUdfQVJHUworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgIC8qIFNldCB1cCBsaW5rYWdlIGluZm8gdG8gaG9sZCBpbmNvbWluZyBzdGFjayBwb2ludGVyLiAqLworICAgICAgICAgU1cgICAgIFRNUCwgcjUyCisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgLyogU2tpcCBzdGFjayBhcmdzIG1lbWNweSBpZiB3ZSBkb24ndCBoYXZlIGFueSBzdGFjayBhcmdzIChjb21tb24pLiAqLworICAgICAgICAgYmxlenQgIFNUQUNLX0FSR19CWVRFUywgLkxkb25lX3N0YWNrX2FyZ3NfbWVtY3B5CisgICAgICAgIH0KKworLkxtZW1jcHlfc3RhY2tfYXJnczoKKyAgICAgICAgeworICAgICAgICAgLyogTG9hZCBpbmNvbWluZyBhcmd1bWVudCBmcm9tIHN0YWNrX2FyZ3MuICovCisgICAgICAgICBMVyAgICAgVE1QLCBJTkNPTUlOR19TVEFDS19BUkdTCisgICAgICAgICBhZGRpICAgSU5DT01JTkdfU1RBQ0tfQVJHUywgSU5DT01JTkdfU1RBQ0tfQVJHUywgUkVHX1NJWkUKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAvKiBTdG9yZSBzdGFjayBhcmd1bWVudCBpbnRvIG91dGdvaW5nIHN0YWNrIGFyZ3VtZW50IGFyZWEuICovCisgICAgICAgICBTVyAgICAgT1VUR09JTkdfU1RBQ0tfQVJHUywgVE1QCisgICAgICAgICBhZGRpICAgT1VUR09JTkdfU1RBQ0tfQVJHUywgT1VUR09JTkdfU1RBQ0tfQVJHUywgUkVHX1NJWkUKKyAgICAgICAgIGFkZGkgICBTVEFDS19BUkdfQllURVMsIFNUQUNLX0FSR19CWVRFUywgLVJFR19TSVpFCisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgQkdaVCAgIFNUQUNLX0FSR19CWVRFUywgLkxtZW1jcHlfc3RhY2tfYXJncworICAgICAgICB9CisuTGRvbmVfc3RhY2tfYXJnc19tZW1jcHk6CisKKyAgICAgICAgeworICAgICAgICAgLyogQ29weSBhc2lkZSBPUklHX0ZOQUREUiBzbyB3ZSBjYW4gb3ZlcndyaXRlIGl0cyByZWdpc3Rlci4gKi8KKyAgICAgICAgIG1vdmUgICBGTkFERFIsIE9SSUdfRk5BRERSCisgICAgICAgICAvKiBQcmVwYXJlIHRvIGxvYWQgYXJndW1lbnQgcmVnaXN0ZXJzLiAqLworICAgICAgICAgYWRkaSAgIFJFR19BRERSX1BUUiwgcjAsIFJFR19TSVpFCisgICAgICAgICAvKiBMb2FkIG91dGdvaW5nIHIwLiAqLworICAgICAgICAgTFcgICAgIHIwLCByMAorICAgICAgICB9CisKKyAgICAgICAgLyogTG9hZCB1cCBhcmd1bWVudCByZWdpc3RlcnMgZnJvbSB0aGUgUkVHX0FSR1MgYXJyYXkuICovCisjZGVmaW5lIExPQURfUkVHKFJFRywgUFRSKSBcCisgICAgICAgIHsgXAorICAgICAgICAgTFcgICAgIFJFRywgUFRSIDsgXAorICAgICAgICAgYWRkaSAgIFBUUiwgUFRSLCBSRUdfU0laRSBcCisgICAgICAgIH0KKworICAgICAgICBMT0FEX1JFRyhyMSwgUkVHX0FERFJfUFRSKQorICAgICAgICBMT0FEX1JFRyhyMiwgUkVHX0FERFJfUFRSKQorICAgICAgICBMT0FEX1JFRyhyMywgUkVHX0FERFJfUFRSKQorICAgICAgICBMT0FEX1JFRyhyNCwgUkVHX0FERFJfUFRSKQorICAgICAgICBMT0FEX1JFRyhyNSwgUkVHX0FERFJfUFRSKQorICAgICAgICBMT0FEX1JFRyhyNiwgUkVHX0FERFJfUFRSKQorICAgICAgICBMT0FEX1JFRyhyNywgUkVHX0FERFJfUFRSKQorICAgICAgICBMT0FEX1JFRyhyOCwgUkVHX0FERFJfUFRSKQorICAgICAgICBMT0FEX1JFRyhyOSwgUkVHX0FERFJfUFRSKQorCisgICAgICAgIHsKKyAgICAgICAgIC8qIENhbGwgdGhlIHN1YnJvdXRpbmUuICovCisgICAgICAgICBqYWxyICAgRk5BRERSCisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAvKiBSZXN0b3JlIG9yaWdpbmFsIGxyLiAqLworICAgICAgICAgTFcgICAgIGxyLCByNTIKKyAgICAgICAgIC8qIFByZXBhcmUgdG8gcmVjb3ZlciBBUkdTLCB3aGljaCB3ZSBzcGlsbGVkIGVhcmxpZXIuICovCisgICAgICAgICBhZGRpICAgVE1QLCByNTIsIC0oMiAqIFJFR19TSVpFKQorICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgIC8qIFJlc3RvcmUgQVJHUywgc28gd2UgY2FuIGZpbGwgaXQgaW4gd2l0aCB0aGUgcmV0dXJuIHJlZ3MgcjAtcjkuICovCisgICAgICAgICBMVyAgICAgUkVUVVJOX1JFR19BRERSLCBUTVAKKyAgICAgICAgIC8qIFByZXBhcmUgdG8gcmVzdG9yZSBvcmlnaW5hbCByNTIuICovCisgICAgICAgICBhZGRpICAgVE1QLCByNTIsIC1SRUdfU0laRQorICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgLyogUG9wIHN0YWNrIGZyYW1lLiAqLworICAgICAgICAgbW92ZSAgIHNwLCByNTIKKyAgICAgICAgIC8qIFJlc3RvcmUgb3JpZ2luYWwgcjUyLiAqLworICAgICAgICAgTFcgICAgIHI1MiwgVE1QCisgICAgICAgIH0KKworI2RlZmluZSBTVE9SRV9SRUcoUkVHLCBQVFIpIFwKKyAgICAgICAgeyBcCisgICAgICAgICBTVyAgICAgUFRSLCBSRUcgOyBcCisgICAgICAgICBhZGRpICAgUFRSLCBQVFIsIFJFR19TSVpFIFwKKyAgICAgICAgfQorCisgICAgICAgIC8qIFJldHVybiBhbGwgcmVnaXN0ZXIgdmFsdWVzIGJ5IHJlZmVyZW5jZS4gKi8KKyAgICAgICAgU1RPUkVfUkVHKHIwLCBSRVRVUk5fUkVHX0FERFIpCisgICAgICAgIFNUT1JFX1JFRyhyMSwgUkVUVVJOX1JFR19BRERSKQorICAgICAgICBTVE9SRV9SRUcocjIsIFJFVFVSTl9SRUdfQUREUikKKyAgICAgICAgU1RPUkVfUkVHKHIzLCBSRVRVUk5fUkVHX0FERFIpCisgICAgICAgIFNUT1JFX1JFRyhyNCwgUkVUVVJOX1JFR19BRERSKQorICAgICAgICBTVE9SRV9SRUcocjUsIFJFVFVSTl9SRUdfQUREUikKKyAgICAgICAgU1RPUkVfUkVHKHI2LCBSRVRVUk5fUkVHX0FERFIpCisgICAgICAgIFNUT1JFX1JFRyhyNywgUkVUVVJOX1JFR19BRERSKQorICAgICAgICBTVE9SRV9SRUcocjgsIFJFVFVSTl9SRUdfQUREUikKKyAgICAgICAgU1RPUkVfUkVHKHI5LCBSRVRVUk5fUkVHX0FERFIpCisKKyAgICAgICAgeworICAgICAgICAganJwICAgIGxyCisgICAgICAgIH0KKworICAgICAgICAuY2ZpX2VuZHByb2MKKyAgICAgICAgLnNpemUgZmZpX2NhbGxfdGlsZSwgLi1mZmlfY2FsbF90aWxlCisKKy8qIGZmaV9jbG9zdXJlX3RpbGUoLi4uKQorCisgICBPbiBlbnRyeSwgbHIgcG9pbnRzIHRvIHRoZSBjbG9zdXJlIHBsdXMgOCBieXRlcywgYW5kIHIxMAorICAgY29udGFpbnMgdGhlIGFjdHVhbCByZXR1cm4gYWRkcmVzcy4KKworICAgVGhpcyBmdW5jdGlvbiBzaW1wbHkgZHVtcHMgYWxsIHJlZ2lzdGVyIHBhcmFtZXRlcnMgaW50byBhIHN0YWNrIGFycmF5CisgICBhbmQgcGFzc2VzIHRoZSBjbG9zdXJlLCB0aGUgcmVnaXN0ZXJzIGFycmF5LCBhbmQgdGhlIHN0YWNrIGFyZ3VtZW50cworICAgdG8gQyBjb2RlIHRoYXQgZG9lcyBhbGwgb2YgdGhlIGFjdHVhbCBjbG9zdXJlIHByb2Nlc3NpbmcuICovCisKKyAgICAgICAgLnNlY3Rpb24gLnRleHQuZmZpX2Nsb3N1cmVfdGlsZSwgImF4IiwgQHByb2diaXRzCisgICAgICAgIC5hbGlnbiAgOAorICAgICAgICAuZ2xvYmwgIGZmaV9jbG9zdXJlX3RpbGUKKyAgICAgICAgRkZJX0hJRERFTihmZmlfY2xvc3VyZV90aWxlKQorCisgICAgICAgIC5jZmlfc3RhcnRwcm9jCisvKiBSb29tIHRvIHNwaWxsIGFsbCBOVU1fQVJHX1JFR1MgaW5jb21pbmcgcmVnaXN0ZXJzLCBwbHVzIGZyYW1lIGxpbmthZ2UuICovCisjZGVmaW5lIENMT1NVUkVfRlJBTUVfU0laRSAoKChOVU1fQVJHX1JFR1MgKiBSRUdfU0laRSAqIDIgKyBMSU5LQUdFX1NJWkUpICsgNykgJiAtOCkKK2ZmaV9jbG9zdXJlX3RpbGU6CisgICAgICAgIHsKKyNpZmRlZiBfX3RpbGVneF9fCisgICAgICAgICBzdCAgICAgc3AsIGxyCisgICAgICAgICAuY2ZpX29mZnNldCBsciwgMAorI2Vsc2UKKyAgICAgICAgIC8qIFNhdmUgcmV0dXJuIGFkZHJlc3MgKGluIHIxMCBkdWUgdG8gY2xvc3VyZSBzdHViIHdyYXBwZXIpLiAqLworICAgICAgICAgU1cgICAgIHNwLCByMTAKKyAgICAgICAgIC5jZmlfcmV0dXJuX2NvbHVtbiByMTAKKyAgICAgICAgIC5jZmlfb2Zmc2V0IHIxMCwgMAorI2VuZGlmCisgICAgICAgICAvKiBDb21wdXRlIGFkZHJlc3MgZm9yIHN0YWNrIGZyYW1lIGxpbmthZ2UuICovCisgICAgICAgICBhZGRsaSAgIHIxMCwgc3AsIC0oQ0xPU1VSRV9GUkFNRV9TSVpFIC0gUkVHX1NJWkUpCisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgLyogU2F2ZSBpbmNvbWluZyBzdGFjayBwb2ludGVyIGluIGxpbmthZ2UgYXJlYS4gKi8KKyAgICAgICAgIFNXICAgICByMTAsIHNwCisgICAgICAgICAuY2ZpX29mZnNldCBzcCwgLShDTE9TVVJFX0ZSQU1FX1NJWkUgLSBSRUdfU0laRSkKKyAgICAgICAgIC8qIFB1c2ggYSBuZXcgc3RhY2sgZnJhbWUuICovCisgICAgICAgICBhZGRsaSAgIHNwLCBzcCwgLUNMT1NVUkVfRlJBTUVfU0laRQorICAgICAgICAgLmNmaV9hZGp1c3RfY2ZhX29mZnNldCBDTE9TVVJFX0ZSQU1FX1NJWkUKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgIC8qIENyZWF0ZSBwb2ludGVyIHRvIHdoZXJlIHRvIHN0YXJ0IHNwaWxsaW5nIHJlZ2lzdGVycy4gKi8KKyAgICAgICAgIGFkZGkgICByMTAsIHNwLCBMSU5LQUdFX1NJWkUKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNwaWxsIGFsbCB0aGUgaW5jb21pbmcgcmVnaXN0ZXJzLiAqLworICAgICAgICBTVE9SRV9SRUcocjAsIHIxMCkKKyAgICAgICAgU1RPUkVfUkVHKHIxLCByMTApCisgICAgICAgIFNUT1JFX1JFRyhyMiwgcjEwKQorICAgICAgICBTVE9SRV9SRUcocjMsIHIxMCkKKyAgICAgICAgU1RPUkVfUkVHKHI0LCByMTApCisgICAgICAgIFNUT1JFX1JFRyhyNSwgcjEwKQorICAgICAgICBTVE9SRV9SRUcocjYsIHIxMCkKKyAgICAgICAgU1RPUkVfUkVHKHI3LCByMTApCisgICAgICAgIFNUT1JFX1JFRyhyOCwgcjEwKQorICAgICAgICB7CisgICAgICAgICAvKiBTYXZlIHI5LiAqLworICAgICAgICAgU1cgICAgIHIxMCwgcjkKKyNpZmRlZiBfX3RpbGVneF9fCisgICAgICAgICAvKiBQb2ludGVyIHRvIGNsb3N1cmUgaXMgcGFzc2VkIGluIHIxMS4gKi8KKyAgICAgICAgIG1vdmUgIHIwLCByMTEKKyNlbHNlCisgICAgICAgICAvKiBDb21wdXRlIHBvaW50ZXIgdG8gdGhlIGNsb3N1cmUgb2JqZWN0LiBCZWNhdXNlIHRoZSBjbG9zdXJlCisgICAgICAgICAgICBzdGFydHMgd2l0aCBhICJqYWwgZmZpX2Nsb3N1cmVfdGlsZSIsIHdlIGNhbiBqdXN0IHRha2UgdGhlCisgICAgICAgICAgICB2YWx1ZSBvZiBsciAoYSBwaG9ueSByZXR1cm4gYWRkcmVzcyBwb2ludGluZyBpbnRvIHRoZSBjbG9zdXJlKQorICAgICAgICAgICAgYW5kIHN1YnRyYWN0IDguICovCisgICAgICAgICBhZGRpICAgcjAsIGxyLCAtOAorI2VuZGlmCisgICAgICAgICAvKiBDb21wdXRlIGEgcG9pbnRlciB0byB0aGUgcmVnaXN0ZXIgYXJndW1lbnRzIHdlIGp1c3Qgc3BpbGxlZC4gKi8KKyAgICAgICAgIGFkZGkgICByMSwgc3AsIExJTktBR0VfU0laRQorICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgIC8qIENvbXB1dGUgYSBwb2ludGVyIHRvIHRoZSBleHRyYSBzdGFjayBhcmd1bWVudHMgKGlmIGFueSkuICovCisgICAgICAgICBhZGRsaSAgIHIyLCBzcCwgQ0xPU1VSRV9GUkFNRV9TSVpFICsgTElOS0FHRV9TSVpFCisgICAgICAgICAvKiBDYWxsIEMgY29kZSB0byBkZWFsIHdpdGggYWxsIG9mIHRoZSBncm90dHkgZGV0YWlscy4gKi8KKyAgICAgICAgIGphbCAgICBmZmlfY2xvc3VyZV90aWxlX2lubmVyCisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgYWRkbGkgICByMTAsIHNwLCBDTE9TVVJFX0ZSQU1FX1NJWkUKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAvKiBSZXN0b3JlIHRoZSByZXR1cm4gYWRkcmVzcy4gKi8KKyAgICAgICAgIExXICAgICBsciwgcjEwCisgICAgICAgICAvKiBDb21wdXRlIHBvaW50ZXIgdG8gcmVnaXN0ZXJzIGFycmF5LiAqLworICAgICAgICAgYWRkbGkgICByMTAsIHNwLCBMSU5LQUdFX1NJWkUgKyAoTlVNX0FSR19SRUdTICogUkVHX1NJWkUpCisgICAgICAgIH0KKyAgICAgICAgLyogUmV0dXJuIGFsbCB0aGUgcmVnaXN0ZXIgdmFsdWVzLCB3aGljaCBDIGNvZGUgbWF5IGhhdmUgc2V0LiAqLworICAgICAgICBMT0FEX1JFRyhyMCwgcjEwKQorICAgICAgICBMT0FEX1JFRyhyMSwgcjEwKQorICAgICAgICBMT0FEX1JFRyhyMiwgcjEwKQorICAgICAgICBMT0FEX1JFRyhyMywgcjEwKQorICAgICAgICBMT0FEX1JFRyhyNCwgcjEwKQorICAgICAgICBMT0FEX1JFRyhyNSwgcjEwKQorICAgICAgICBMT0FEX1JFRyhyNiwgcjEwKQorICAgICAgICBMT0FEX1JFRyhyNywgcjEwKQorICAgICAgICBMT0FEX1JFRyhyOCwgcjEwKQorICAgICAgICBMT0FEX1JFRyhyOSwgcjEwKQorICAgICAgICB7CisgICAgICAgICAvKiBQb3AgdGhlIGZyYW1lLiAqLworICAgICAgICAgYWRkbGkgICBzcCwgc3AsIENMT1NVUkVfRlJBTUVfU0laRQorICAgICAgICAganJwICAgIGxyCisgICAgICAgIH0KKworICAgICAgICAuY2ZpX2VuZHByb2MKKyAgICAgICAgLnNpemUgICBmZmlfY2xvc3VyZV90aWxlLCAuIC0gZmZpX2Nsb3N1cmVfdGlsZQorCisKKy8qIFdoYXQgZm9sbG93cyBhcmUgY29kZSB0ZW1wbGF0ZSBpbnN0cnVjdGlvbnMgdGhhdCBnZXQgY29waWVkIHRvIHRoZQorICAgY2xvc3VyZSB0cmFtcG9saW5lIGJ5IGZmaV9wcmVwX2Nsb3N1cmVfbG9jLiAgVGhlIHplcm9lZCBvcGVyYW5kcworICAgZ2V0IHJlcGxhY2VkIGJ5IHRoZWlyIHByb3BlciB2YWx1ZXMgYXQgcnVudGltZS4gKi8KKworICAgICAgICAuc2VjdGlvbiAudGV4dC5mZmlfdGVtcGxhdGVfdHJhbXBfdGlsZSwgImF4IiwgQHByb2diaXRzCisgICAgICAgIC5hbGlnbiAgOAorICAgICAgICAuZ2xvYmwgIGZmaV90ZW1wbGF0ZV90cmFtcF90aWxlCisgICAgICAgIEZGSV9ISURERU4oZmZpX3RlbXBsYXRlX3RyYW1wX3RpbGUpCitmZmlfdGVtcGxhdGVfdHJhbXBfdGlsZToKKyNpZmRlZiBfX3RpbGVneF9fCisgICAgICAgIHsKKyAgICAgICAgICBtb3ZlbGkgcjExLCAwIC8qIGJhY2twYXRjaGVkIHRvIGFkZHJlc3Mgb2YgY29udGFpbmluZyBjbG9zdXJlLiAqLworICAgICAgICAgIG1vdmVsaSByMTAsIDAgLyogYmFja3BhdGNoZWQgdG8gZmZpX2Nsb3N1cmVfdGlsZS4gKi8KKyAgICAgICAgfQorICAgICAgICAvKiBOb3RlOiB0aGUgZm9sbG93aW5nIGJ1bmRsZSBnZXRzIGdlbmVyYXRlZCBtdWx0aXBsZSB0aW1lcworICAgICAgICAgICBkZXBlbmRpbmcgb24gdGhlIHBvaW50ZXIgdmFsdWUgKGVzcC4gdXNlZnVsIGZvciAtbTMyIG1vZGUpLiAqLworICAgICAgICB7IHNobDE2aW5zbGkgcjExLCByMTEsIDAgOyBzaGwxNmluc2xpIHIxMCwgcjEwLCAwIH0KKyAgICAgICAgeyBpbmZvIDIrOCAvKiBmb3IgYmFja3RyYWNlcjogLT4gcGMgaW4gbHIsIGZyYW1lIHNpemUgMCAqLyA7IGpyIHIxMCB9CisjZWxzZQorICAgICAgICAvKiAnamFsIC4nIHlpZWxkcyBhIFBDLXJlbGF0aXZlIG9mZnNldCBvZiB6ZXJvIHNvIHdlIGNhbiBPUiBpbiB0aGUKKyAgICAgICAgICAgcmlnaHQgb2Zmc2V0IGF0IHJ1bnRpbWUuICovCisgICAgICAgIHsgbW92ZSByMTAsIGxyIDsgamFsIC4gLyogZmZpX2Nsb3N1cmVfdGlsZSAqLyB9CisjZW5kaWYKKworICAgICAgICAuc2l6ZSAgIGZmaV90ZW1wbGF0ZV90cmFtcF90aWxlLCAuIC0gZmZpX3RlbXBsYXRlX3RyYW1wX3RpbGUKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3g4Ni9mZmkuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3g4Ni9mZmkuYwppbmRleCA4MDQ5NjUzLi4wNjAwNDE0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvZmZpLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMveDg2L2ZmaS5jCkBAIC0zLDcgKzMsNyBAQAogICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDIgIFJhbmppdCBNYXRoZXcKICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAyICBCbyBUaG9yc2VuCiAgICAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMiAgUm9nZXIgU2F5bGUKLSAgICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDA4ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDA4LCAyMDEwICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KIAogICAgeDg2IEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlCiAKQEAgLTQ4LDEwICs0OCwxOCBAQAogICByZWdpc3RlciB2b2lkICoqcF9hcmd2OwogICByZWdpc3RlciBjaGFyICphcmdwOwogICByZWdpc3RlciBmZmlfdHlwZSAqKnBfYXJnOworI2lmZGVmIFg4Nl9XSU4zMgorICBzaXplX3QgcF9zdGFja19hcmdzWzJdOworICB2b2lkICpwX3N0YWNrX2RhdGFbMl07CisgIGNoYXIgKmFyZ3AyID0gc3RhY2s7CisgIGludCBzdGFja19hcmdzX2NvdW50ID0gMDsKKyAgaW50IGNhYmkgPSBlY2lmLT5jaWYtPmFiaTsKKyNlbmRpZgogCiAgIGFyZ3AgPSBzdGFjazsKIAotICBpZiAoZWNpZi0+Y2lmLT5mbGFncyA9PSBGRklfVFlQRV9TVFJVQ1QKKyAgaWYgKChlY2lmLT5jaWYtPmZsYWdzID09IEZGSV9UWVBFX1NUUlVDVAorICAgICAgIHx8IGVjaWYtPmNpZi0+ZmxhZ3MgPT0gRkZJX1RZUEVfTVNfU1RSVUNUKQogI2lmZGVmIFg4Nl9XSU42NAogICAgICAgJiYgKGVjaWYtPmNpZi0+cnR5cGUtPnNpemUgIT0gMSAmJiBlY2lmLT5jaWYtPnJ0eXBlLT5zaXplICE9IDIKICAgICAgICAgICAmJiBlY2lmLT5jaWYtPnJ0eXBlLT5zaXplICE9IDQgJiYgZWNpZi0+Y2lmLT5ydHlwZS0+c2l6ZSAhPSA4KQpAQCAtNTksNiArNjcsMTYgQEAKICAgICAgICkKICAgICB7CiAgICAgICAqKHZvaWQgKiopIGFyZ3AgPSBlY2lmLT5ydmFsdWU7CisjaWZkZWYgWDg2X1dJTjMyCisgICAgICAvKiBGb3IgZmFzdGNhbGwvdGhpc2NhbGwgdGhpcyBpcyBmaXJzdCByZWdpc3Rlci1wYXNzZWQKKyAgICAgICAgIGFyZ3VtZW50LiAgKi8KKyAgICAgIGlmIChjYWJpID09IEZGSV9USElTQ0FMTCB8fCBjYWJpID09IEZGSV9GQVNUQ0FMTCkKKwl7CisJICBwX3N0YWNrX2FyZ3Nbc3RhY2tfYXJnc19jb3VudF0gPSBzaXplb2YgKHZvaWQqKTsKKwkgIHBfc3RhY2tfZGF0YVtzdGFja19hcmdzX2NvdW50XSA9IGFyZ3A7CisJICArK3N0YWNrX2FyZ3NfY291bnQ7CisJfQorI2VuZGlmCiAgICAgICBhcmdwICs9IHNpemVvZih2b2lkKik7CiAgICAgfQogCkBAIC0xMzQsNiArMTUyLDI0IEBACiAgICAgICAgIHsKICAgICAgICAgICBtZW1jcHkoYXJncCwgKnBfYXJndiwgeik7CiAgICAgICAgIH0KKworI2lmZGVmIFg4Nl9XSU4zMgorICAgIC8qIEZvciB0aGlzY2FsbC9mYXN0Y2FsbCBjb252ZW50aW9uIHJlZ2lzdGVyLXBhc3NlZCBhcmd1bWVudHMKKyAgICAgICBhcmUgdGhlIGZpcnN0IHR3byBub25lLWZsb2F0aW5nLXBvaW50IGFyZ3VtZW50cyB3aXRoIGEgc2l6ZQorICAgICAgIHNtYWxsZXIgb3IgZXF1YWwgdG8gc2l6ZW9mICh2b2lkKikuICAqLworICAgIGlmICgoY2FiaSA9PSBGRklfVEhJU0NBTEwgJiYgc3RhY2tfYXJnc19jb3VudCA8IDEpCisgICAgICAgIHx8IChjYWJpID09IEZGSV9GQVNUQ0FMTCAmJiBzdGFja19hcmdzX2NvdW50IDwgMikpCisgICAgICB7CisJaWYgKHogPD0gNAorCSAgICAmJiAoKCpwX2FyZyktPnR5cGUgIT0gRkZJX1RZUEVfRkxPQVQKKwkgICAgICAgICYmICgqcF9hcmcpLT50eXBlICE9IEZGSV9UWVBFX1NUUlVDVCkpCisJICB7CisJICAgIHBfc3RhY2tfYXJnc1tzdGFja19hcmdzX2NvdW50XSA9IHo7CisJICAgIHBfc3RhY2tfZGF0YVtzdGFja19hcmdzX2NvdW50XSA9IGFyZ3A7CisJICAgICsrc3RhY2tfYXJnc19jb3VudDsKKwkgIH0KKyAgICAgIH0KKyNlbmRpZgogICAgICAgcF9hcmd2Kys7CiAjaWZkZWYgWDg2X1dJTjY0CiAgICAgICBhcmdwICs9ICh6ICsgc2l6ZW9mKHZvaWQqKSAtIDEpICYgfihzaXplb2Yodm9pZCopIC0gMSk7CkBAIC0xNDEsNyArMTc3LDQ1IEBACiAgICAgICBhcmdwICs9IHo7CiAjZW5kaWYKICAgICB9Ci0gIAorCisjaWZkZWYgWDg2X1dJTjMyCisgIC8qIFdlIG5lZWQgdG8gbW92ZSB0aGUgcmVnaXN0ZXItcGFzc2VkIGFyZ3VtZW50cyBmb3IgdGhpc2NhbGwvZmFzdGNhbGwKKyAgICAgb24gdG9wIG9mIHN0YWNrLCBzbyB0aGF0IHRob3NlIGNhbiBiZSBtb3ZlZCB0byByZWdpc3RlcnMgZWN4L2VkeCBieQorICAgICBjYWxsLWhhbmRsZXIuICAqLworICBpZiAoc3RhY2tfYXJnc19jb3VudCA+IDApCisgICAgeworICAgICAgc2l6ZV90IHp6ID0gKHBfc3RhY2tfYXJnc1swXSArIDMpICYgfjM7CisgICAgICBjaGFyICpoOworCisgICAgICAvKiBNb3ZlIGZpcnN0IGFyZ3VtZW50IHRvIHRvcC1zdGFjayBwb3NpdGlvbi4gICovCisgICAgICBpZiAocF9zdGFja19kYXRhWzBdICE9IGFyZ3AyKQorCXsKKwkgIGggPSBhbGxvY2EgKHp6ICsgMSk7CisJICBtZW1jcHkgKGgsIHBfc3RhY2tfZGF0YVswXSwgenopOworCSAgbWVtbW92ZSAoYXJncDIgKyB6eiwgYXJncDIsCisJICAgICAgICAgICAoc2l6ZV90KSAoKGNoYXIgKikgcF9zdGFja19kYXRhWzBdIC0gKGNoYXIqKWFyZ3AyKSk7CisJICBtZW1jcHkgKGFyZ3AyLCBoLCB6eik7CisJfQorCisgICAgICBhcmdwMiArPSB6ejsKKyAgICAgIC0tc3RhY2tfYXJnc19jb3VudDsKKyAgICAgIGlmICh6eiA+IDQpCisJc3RhY2tfYXJnc19jb3VudCA9IDA7CisKKyAgICAgIC8qIElmIHdlIGhhdmUgYSBzZWNvbmQgYXJndW1lbnQsIHRoZW4gbW92ZSBpdCBvbiB0b3AKKyAgICAgICAgIGFmdGVyIHRoZSBmaXJzdCBvbmUuICAqLworICAgICAgaWYgKHN0YWNrX2FyZ3NfY291bnQgPiAwICYmIHBfc3RhY2tfZGF0YVsxXSAhPSBhcmdwMikKKwl7CisJICB6eiA9IHBfc3RhY2tfYXJnc1sxXTsKKwkgIHp6ID0gKHp6ICsgMykgJiB+MzsKKwkgIGggPSBhbGxvY2EgKHp6ICsgMSk7CisJICBoID0gYWxsb2NhICh6eiArIDEpOworCSAgbWVtY3B5IChoLCBwX3N0YWNrX2RhdGFbMV0sIHp6KTsKKwkgIG1lbW1vdmUgKGFyZ3AyICsgenosIGFyZ3AyLCAoc2l6ZV90KSAoKGNoYXIqKSBwX3N0YWNrX2RhdGFbMV0gLSAoY2hhciopYXJncDIpKTsKKwkgIG1lbWNweSAoYXJncDIsIGgsIHp6KTsKKwl9CisgICAgfQorI2VuZGlmCiAgIHJldHVybjsKIH0KIApAQCAtMTU1LDEyICsyMjksMTAgQEAKICAgc3dpdGNoIChjaWYtPnJ0eXBlLT50eXBlKQogICAgIHsKICAgICBjYXNlIEZGSV9UWVBFX1ZPSUQ6Ci0jaWYgZGVmaW5lZChYODYpIHx8IGRlZmluZWQgKFg4Nl9XSU4zMikgfHwgZGVmaW5lZChYODZfRlJFRUJTRCkgfHwgZGVmaW5lZChYODZfREFSV0lOKSB8fCBkZWZpbmVkKFg4Nl9XSU42NCkKICAgICBjYXNlIEZGSV9UWVBFX1VJTlQ4OgogICAgIGNhc2UgRkZJX1RZUEVfVUlOVDE2OgogICAgIGNhc2UgRkZJX1RZUEVfU0lOVDg6CiAgICAgY2FzZSBGRklfVFlQRV9TSU5UMTY6Ci0jZW5kaWYKICNpZmRlZiBYODZfV0lONjQKICAgICBjYXNlIEZGSV9UWVBFX1VJTlQzMjoKICAgICBjYXNlIEZGSV9UWVBFX1NJTlQzMjoKQEAgLTIwOCw4ICsyODAsMTMgQEAKICAgICAgIGVsc2UKICNlbmRpZgogICAgICAgICB7Ci0gICAgICAgICAgY2lmLT5mbGFncyA9IEZGSV9UWVBFX1NUUlVDVDsKLSAgICAgICAgICAvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgcmV0dXJuIHZhbHVlIHBvaW50ZXIKKyNpZmRlZiBYODZfV0lOMzIKKyAgICAgICAgICBpZiAoY2lmLT5hYmkgPT0gRkZJX01TX0NERUNMKQorICAgICAgICAgICAgY2lmLT5mbGFncyA9IEZGSV9UWVBFX01TX1NUUlVDVDsKKyAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIGNpZi0+ZmxhZ3MgPSBGRklfVFlQRV9TVFJVQ1Q7CisgICAgICAgICAgLyogYWxsb2NhdGUgc3BhY2UgZm9yIHJldHVybiB2YWx1ZSBwb2ludGVyICovCiAgICAgICAgICAgY2lmLT5ieXRlcyArPSBBTElHTihzaXplb2Yodm9pZCopLCBGRklfU0laRU9GX0FSRyk7CiAgICAgICAgIH0KICAgICAgIGJyZWFrOwpAQCAtMjM0LDEzICszMTEsMTEgQEAKICAgICB9CiAKICNpZmRlZiBYODZfV0lONjQKLSAgLy8gZW5zdXJlIHNwYWNlIGZvciBzdG9yaW5nIGZvdXIgcmVnaXN0ZXJzCisgIC8qIGVuc3VyZSBzcGFjZSBmb3Igc3RvcmluZyBmb3VyIHJlZ2lzdGVycyAqLwogICBjaWYtPmJ5dGVzICs9IDQgKiBzaXplb2YoZmZpX2FyZyk7CiAjZW5kaWYKIAotI2lmZGVmIFg4Nl9EQVJXSU4KICAgY2lmLT5ieXRlcyA9IChjaWYtPmJ5dGVzICsgMTUpICYgfjB4RjsKLSNlbmRpZgogCiAgIHJldHVybiBGRklfT0s7CiB9CkBAIC0yNTIsNyArMzI3LDcgQEAKICNlbGlmIGRlZmluZWQoWDg2X1dJTjMyKQogZXh0ZXJuIHZvaWQKIGZmaV9jYWxsX3dpbjMyKHZvaWQgKCopKGNoYXIgKiwgZXh0ZW5kZWRfY2lmICopLCBleHRlbmRlZF9jaWYgKiwKLSAgICAgICAgICAgICAgIHVuc2lnbmVkLCB1bnNpZ25lZCwgdW5zaWduZWQgKiwgdm9pZCAoKmZuKSh2b2lkKSk7CisgICAgICAgICAgICAgICB1bnNpZ25lZCwgdW5zaWduZWQsIHVuc2lnbmVkLCB1bnNpZ25lZCAqLCB2b2lkICgqZm4pKHZvaWQpKTsKICNlbHNlCiBleHRlcm4gdm9pZCBmZmlfY2FsbF9TWVNWKHZvaWQgKCopKGNoYXIgKiwgZXh0ZW5kZWRfY2lmICopLCBleHRlbmRlZF9jaWYgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQsIHVuc2lnbmVkLCB1bnNpZ25lZCAqLCB2b2lkICgqZm4pKHZvaWQpKTsKQEAgLTI3OCw3ICszNTMsOCBAQAogICAgIH0KICNlbHNlCiAgIGlmIChydmFsdWUgPT0gTlVMTAotICAgICAgJiYgY2lmLT5mbGFncyA9PSBGRklfVFlQRV9TVFJVQ1QpCisgICAgICAmJiAoY2lmLT5mbGFncyA9PSBGRklfVFlQRV9TVFJVQ1QKKyAgICAgICAgICB8fCBjaWYtPmZsYWdzID09IEZGSV9UWVBFX01TX1NUUlVDVCkpCiAgICAgewogICAgICAgZWNpZi5ydmFsdWUgPSBhbGxvY2EoY2lmLT5ydHlwZS0+c2l6ZSk7CiAgICAgfQpAQCAtMjkxLDMzICszNjcsNDQgQEAKICAgICB7CiAjaWZkZWYgWDg2X1dJTjY0CiAgICAgY2FzZSBGRklfV0lONjQ6Ci0gICAgICB7Ci0gICAgICAgIC8vIE1ha2UgY29waWVzIG9mIGFsbCBzdHJ1Y3QgYXJndW1lbnRzCi0gICAgICAgIC8vIE5PVEU6IG5vdCBzdXJlIGlmIHJlc3BvbnNpYmlsaXR5IHNob3VsZCBiZSBoZXJlIG9yIGluIGNhbGxlcgotICAgICAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICAgICAgZm9yIChpPTA7IGkgPCBjaWYtPm5hcmdzO2krKykgewotICAgICAgICAgIHNpemVfdCBzaXplID0gY2lmLT5hcmdfdHlwZXNbaV0tPnNpemU7Ci0gICAgICAgICAgaWYgKChjaWYtPmFyZ190eXBlc1tpXS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QKLSAgICAgICAgICAgICAgICYmIChzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCAmJiBzaXplICE9IDgpKQotI2lmIEZGSV9UWVBFX0xPTkdET1VCTEUgIT0gRkZJX1RZUEVfRE9VQkxFCi0gICAgICAgICAgICAgIHx8IGNpZi0+YXJnX3R5cGVzW2ldLT50eXBlID09IEZGSV9UWVBFX0xPTkdET1VCTEUKLSNlbmRpZgotICAgICAgICAgICAgICApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHZvaWQgKmxvY2FsID0gYWxsb2NhKHNpemUpOwotICAgICAgICAgICAgICBtZW1jcHkobG9jYWwsIGF2YWx1ZVtpXSwgc2l6ZSk7Ci0gICAgICAgICAgICAgIGF2YWx1ZVtpXSA9IGxvY2FsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZmaV9jYWxsX3dpbjY0KGZmaV9wcmVwX2FyZ3MsICZlY2lmLCBjaWYtPmJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICBjaWYtPmZsYWdzLCBlY2lmLnJ2YWx1ZSwgZm4pOwotICAgICAgfQorICAgICAgZmZpX2NhbGxfd2luNjQoZmZpX3ByZXBfYXJncywgJmVjaWYsIGNpZi0+Ynl0ZXMsCisgICAgICAgICAgICAgICAgICAgICBjaWYtPmZsYWdzLCBlY2lmLnJ2YWx1ZSwgZm4pOwogICAgICAgYnJlYWs7CiAjZWxpZiBkZWZpbmVkKFg4Nl9XSU4zMikKICAgICBjYXNlIEZGSV9TWVNWOgogICAgIGNhc2UgRkZJX1NURENBTEw6Ci0gICAgICBmZmlfY2FsbF93aW4zMihmZmlfcHJlcF9hcmdzLCAmZWNpZiwgY2lmLT5ieXRlcywgY2lmLT5mbGFncywKLSAgICAgICAgICAgICAgICAgICAgIGVjaWYucnZhbHVlLCBmbik7CisgICAgY2FzZSBGRklfTVNfQ0RFQ0w6CisgICAgICBmZmlfY2FsbF93aW4zMihmZmlfcHJlcF9hcmdzLCAmZWNpZiwgY2lmLT5hYmksIGNpZi0+Ynl0ZXMsIGNpZi0+ZmxhZ3MsCisJCSAgICAgZWNpZi5ydmFsdWUsIGZuKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRkZJX1RISVNDQUxMOgorICAgIGNhc2UgRkZJX0ZBU1RDQUxMOgorICAgICAgeworCXVuc2lnbmVkIGludCBhYmkgPSBjaWYtPmFiaTsKKwl1bnNpZ25lZCBpbnQgaSwgcGFzc2VkX3JlZ3MgPSAwOworCisJaWYgKGNpZi0+ZmxhZ3MgPT0gRkZJX1RZUEVfU1RSVUNUKQorCSAgKytwYXNzZWRfcmVnczsKKworCWZvciAoaT0wOyBpIDwgY2lmLT5uYXJncyAmJiBwYXNzZWRfcmVncyA8IDI7aSsrKQorCSAgeworCSAgICBzaXplX3Qgc3o7CisKKwkgICAgaWYgKGNpZi0+YXJnX3R5cGVzW2ldLT50eXBlID09IEZGSV9UWVBFX0ZMT0FUCisJICAgICAgICB8fCBjaWYtPmFyZ190eXBlc1tpXS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QpCisJICAgICAgY29udGludWU7CisJICAgIHN6ID0gKGNpZi0+YXJnX3R5cGVzW2ldLT5zaXplICsgMykgJiB+MzsKKwkgICAgaWYgKHN6ID09IDAgfHwgc3ogPiA0KQorCSAgICAgIGNvbnRpbnVlOworCSAgICArK3Bhc3NlZF9yZWdzOworCSAgfQorCWlmIChwYXNzZWRfcmVncyA8IDIgJiYgYWJpID09IEZGSV9GQVNUQ0FMTCkKKwkgIGFiaSA9IEZGSV9USElTQ0FMTDsKKwlpZiAocGFzc2VkX3JlZ3MgPCAxICYmIGFiaSA9PSBGRklfVEhJU0NBTEwpCisJICBhYmkgPSBGRklfU1REQ0FMTDsKKyAgICAgICAgZmZpX2NhbGxfd2luMzIoZmZpX3ByZXBfYXJncywgJmVjaWYsIGFiaSwgY2lmLT5ieXRlcywgY2lmLT5mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgZWNpZi5ydmFsdWUsIGZuKTsKKyAgICAgIH0KICAgICAgIGJyZWFrOwogI2Vsc2UKICAgICBjYXNlIEZGSV9TWVNWOgpAQCAtMzM1LDcgKzQyMiw3IEBACiAvKiogcHJpdmF0ZSBtZW1iZXJzICoqLwogCiAvKiBUaGUgZm9sbG93aW5nIF9fYXR0cmlidXRlX18oKHJlZ3Bhcm0oMSkpKSBkZWNvcmF0aW9ucyB3aWxsIGhhdmUgbm8gZWZmZWN0Ci0gICBvbiBNU1ZDIC0gc3RhbmRhcmQgY2RlY2wgY29udmVudGlvbiBhcHBsaWVzLiAqLworICAgb24gTVNWQyBvciBTVU5QUk9fQyAtLSBzdGFuZGFyZCBjb252ZW50aW9ucyBhcHBseS4gKi8KIHN0YXRpYyB2b2lkIGZmaV9wcmVwX2luY29taW5nX2FyZ3NfU1lTViAoY2hhciAqc3RhY2ssIHZvaWQgKipyZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiBhcmdzLCBmZmlfY2lmKiBjaWYpOwogdm9pZCBGRklfSElEREVOIGZmaV9jbG9zdXJlX1NZU1YgKGZmaV9jbG9zdXJlICopCkBAIC0zNDUsOCArNDMyLDEyIEBACiB2b2lkIEZGSV9ISURERU4gZmZpX2Nsb3N1cmVfcmF3X1NZU1YgKGZmaV9yYXdfY2xvc3VyZSAqKQogICAgICBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgxKSkpOwogI2lmZGVmIFg4Nl9XSU4zMgordm9pZCBGRklfSElEREVOIGZmaV9jbG9zdXJlX3Jhd19USElTQ0FMTCAoZmZpX3Jhd19jbG9zdXJlICopCisgICAgIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDEpKSk7CiB2b2lkIEZGSV9ISURERU4gZmZpX2Nsb3N1cmVfU1REQ0FMTCAoZmZpX2Nsb3N1cmUgKikKICAgICAgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMSkpKTsKK3ZvaWQgRkZJX0hJRERFTiBmZmlfY2xvc3VyZV9USElTQ0FMTCAoZmZpX2Nsb3N1cmUgKikKKyAgICAgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMSkpKTsKICNlbmRpZgogI2lmZGVmIFg4Nl9XSU42NAogdm9pZCBGRklfSElEREVOIGZmaV9jbG9zdXJlX3dpbjY0IChmZmlfY2xvc3VyZSAqKTsKQEAgLTQyOCw3ICs1MTksOCBAQAogICAgIGFyZ3AgKz0gc2l6ZW9mKHZvaWQgKik7CiAgIH0KICNlbHNlCi0gIGlmICggY2lmLT5mbGFncyA9PSBGRklfVFlQRV9TVFJVQ1QgKSB7CisgIGlmICggY2lmLT5mbGFncyA9PSBGRklfVFlQRV9TVFJVQ1QKKyAgICAgICB8fCBjaWYtPmZsYWdzID09IEZGSV9UWVBFX01TX1NUUlVDVCApIHsKICAgICAqcnZhbHVlID0gKih2b2lkICoqKSBhcmdwOwogICAgIGFyZ3AgKz0gc2l6ZW9mKHZvaWQgKik7CiAgIH0KQEAgLTUwNiw2ICs1OTgsMzMgQEAKICAgICoodW5zaWduZWQgaW50KikgICZfX3RyYW1wWzZdID0gX19kaXM7IC8qIGptcCBfX2Z1biAgKi8gXAogIH0KIAorI2RlZmluZSBGRklfSU5JVF9UUkFNUE9MSU5FX1RISVNDQUxMKFRSQU1QLEZVTixDVFgsU0laRSkgXAoreyB1bnNpZ25lZCBjaGFyICpfX3RyYW1wID0gKHVuc2lnbmVkIGNoYXIqKShUUkFNUCk7IFwKKyAgIHVuc2lnbmVkIGludCAgX19mdW4gPSAodW5zaWduZWQgaW50KShGVU4pOyBcCisgICB1bnNpZ25lZCBpbnQgIF9fY3R4ID0gKHVuc2lnbmVkIGludCkoQ1RYKTsgXAorICAgdW5zaWduZWQgaW50ICBfX2RpcyA9IF9fZnVuIC0gKF9fY3R4ICsgNDkpOyAgXAorICAgdW5zaWduZWQgc2hvcnQgX19zaXplID0gKHVuc2lnbmVkIHNob3J0KShTSVpFKTsgXAorICAgKih1bnNpZ25lZCBpbnQgKikgJl9fdHJhbXBbMF0gPSAweDgzMjQwNDhiOwkvKiBtb3YgKCVlc3ApLCAlZWF4ICovIFwKKyAgICoodW5zaWduZWQgaW50ICopICZfX3RyYW1wWzRdID0gMHg0Yzg5MGNlYzsJLyogc3ViICQxMiwgJWVzcCAqLyBcCisgICAqKHVuc2lnbmVkIGludCAqKSAmX190cmFtcFs4XSA9IDB4MDQ4OTA0MjQ7CS8qIG1vdiAlZWN4LCA0KCVlc3ApICovIFwKKyAgICoodW5zaWduZWQgY2hhciopICZfX3RyYW1wWzEyXSA9IDB4MjQ7CS8qIG1vdiAlZWF4LCAoJWVzcCkgKi8gXAorICAgKih1bnNpZ25lZCBjaGFyKikgJl9fdHJhbXBbMTNdID0gMHhiODsgXAorICAgKih1bnNpZ25lZCBpbnQgKikgJl9fdHJhbXBbMTRdID0gX19zaXplOwkvKiBtb3YgX19zaXplLCAlZWF4ICovIFwKKyAgICoodW5zaWduZWQgaW50ICopICZfX3RyYW1wWzE4XSA9IDB4MDgyNDRjOGQ7CS8qIGxlYSA4KCVlc3ApLCAlZWN4ICovIFwKKyAgICoodW5zaWduZWQgaW50ICopICZfX3RyYW1wWzIyXSA9IDB4NDgwMmU4YzE7IC8qIHNociAkMiwgJWVheCA7IGRlYyAlZWF4ICovIFwKKyAgICoodW5zaWduZWQgc2hvcnQqKSAmX190cmFtcFsyNl0gPSAweDBiNzQ7CS8qIGp6IDFmICovIFwKKyAgICoodW5zaWduZWQgaW50ICopICZfX3RyYW1wWzI4XSA9IDB4ODkwODUxOGI7CS8qIDJiOiBtb3YgOCglZWN4KSwgJWVkeCAqLyBcCisgICAqKHVuc2lnbmVkIGludCAqKSAmX190cmFtcFszMl0gPSAweDA0YzE4MzExOyAvKiBtb3YgJWVkeCwgKCVlY3gpIDsgYWRkICQ0LCAlZWN4ICovIFwKKyAgICoodW5zaWduZWQgY2hhciopICZfX3RyYW1wWzM2XSA9IDB4NDg7CS8qIGRlYyAlZWF4ICovIFwKKyAgICoodW5zaWduZWQgc2hvcnQqKSAmX190cmFtcFszN10gPSAweGY1NzU7CS8qIGpueiAyYiA7IDFmOiAqLyBcCisgICAqKHVuc2lnbmVkIGNoYXIqKSAmX190cmFtcFszOV0gPSAweGI4OyBcCisgICAqKHVuc2lnbmVkIGludCopICAmX190cmFtcFs0MF0gPSBfX2N0eDsgLyogbW92bCBfX2N0eCwgJWVheCAqLyBcCisgICAqKHVuc2lnbmVkIGNoYXIgKikgICZfX3RyYW1wWzQ0XSA9IDB4ZTg7IFwKKyAgICoodW5zaWduZWQgaW50KikgICZfX3RyYW1wWzQ1XSA9IF9fZGlzOyAvKiBjYWxsIF9fZnVuICAqLyBcCisgICAqKHVuc2lnbmVkIGNoYXIqKSAgJl9fdHJhbXBbNDldID0gMHhjMjsgLyogcmV0ICAqLyBcCisgICAqKHVuc2lnbmVkIHNob3J0KikgICZfX3RyYW1wWzUwXSA9IChfX3NpemUgKyA4KTsgLyogcmV0IChfX3NpemUgKyA4KSAgKi8gXAorIH0KKwogI2RlZmluZSBGRklfSU5JVF9UUkFNUE9MSU5FX1NURENBTEwoVFJBTVAsRlVOLENUWCxTSVpFKSAgXAogeyB1bnNpZ25lZCBjaGFyICpfX3RyYW1wID0gKHVuc2lnbmVkIGNoYXIqKShUUkFNUCk7IFwKICAgIHVuc2lnbmVkIGludCAgX19mdW4gPSAodW5zaWduZWQgaW50KShGVU4pOyBcCkBAIC01NDgsMTIgKzY2NywyNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWNvZGVsb2MpOwogICAgIH0KICNpZmRlZiBYODZfV0lOMzIKKyAgZWxzZSBpZiAoY2lmLT5hYmkgPT0gRkZJX1RISVNDQUxMKQorICAgIHsKKyAgICAgIEZGSV9JTklUX1RSQU1QT0xJTkVfVEhJU0NBTEwgKCZjbG9zdXJlLT50cmFtcFswXSwKKwkJCQkgICAgJmZmaV9jbG9zdXJlX1RISVNDQUxMLAorCQkJCSAgICAodm9pZCopY29kZWxvYywKKwkJCQkgICAgY2lmLT5ieXRlcyk7CisgICAgfQogICBlbHNlIGlmIChjaWYtPmFiaSA9PSBGRklfU1REQ0FMTCkKICAgICB7CiAgICAgICBGRklfSU5JVF9UUkFNUE9MSU5FX1NURENBTEwgKCZjbG9zdXJlLT50cmFtcFswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZmaV9jbG9zdXJlX1NURENBTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiljb2RlbG9jLCBjaWYtPmJ5dGVzKTsKICAgICB9CisgIGVsc2UgaWYgKGNpZi0+YWJpID09IEZGSV9NU19DREVDTCkKKyAgICB7CisgICAgICBGRklfSU5JVF9UUkFNUE9MSU5FICgmY2xvc3VyZS0+dHJhbXBbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmZpX2Nsb3N1cmVfU1lTViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiljb2RlbG9jKTsKKyAgICB9CiAjZW5kaWYgLyogWDg2X1dJTjMyICovCiAjZW5kaWYgLyogIVg4Nl9XSU42NCAqLwogICBlbHNlCkBAIC01ODIsNiArNzE0LDkgQEAKICAgaW50IGk7CiAKICAgaWYgKGNpZi0+YWJpICE9IEZGSV9TWVNWKSB7CisjaWZkZWYgWDg2X1dJTjMyCisgICAgaWYgKGNpZi0+YWJpICE9IEZGSV9USElTQ0FMTCkKKyNlbmRpZgogICAgIHJldHVybiBGRklfQkFEX0FCSTsKICAgfQogCkBAIC01OTYsMTAgKzczMSwyMCBAQAogICAgICAgRkZJX0FTU0VSVCAoY2lmLT5hcmdfdHlwZXNbaV0tPnR5cGUgIT0gRkZJX1RZUEVfTE9OR0RPVUJMRSk7CiAgICAgfQogICAKLQorI2lmZGVmIFg4Nl9XSU4zMgorICBpZiAoY2lmLT5hYmkgPT0gRkZJX1NZU1YpCisgICAgeworI2VuZGlmCiAgIEZGSV9JTklUX1RSQU1QT0xJTkUgKCZjbG9zdXJlLT50cmFtcFswXSwgJmZmaV9jbG9zdXJlX3Jhd19TWVNWLAogICAgICAgICAgICAgICAgICAgICAgICBjb2RlbG9jKTsKLSAgICAKKyNpZmRlZiBYODZfV0lOMzIKKyAgICB9CisgIGVsc2UgaWYgKGNpZi0+YWJpID09IEZGSV9USElTQ0FMTCkKKyAgICB7CisgICAgICBGRklfSU5JVF9UUkFNUE9MSU5FX1RISVNDQUxMICgmY2xvc3VyZS0+dHJhbXBbMF0sICZmZmlfY2xvc3VyZV9yYXdfVEhJU0NBTEwsCisJCQkJICAgIGNvZGVsb2MsIGNpZi0+Ynl0ZXMpOworICAgIH0KKyNlbmRpZgogICBjbG9zdXJlLT5jaWYgID0gY2lmOwogICBjbG9zdXJlLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CiAgIGNsb3N1cmUtPmZ1biAgPSBmdW47CkBAIC02MzAsOCArNzc1LDkgQEAKICAgLyogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBhIHN0cnVjdCBhbmQgd2UgZG9uJ3QgaGF2ZSBhIHJldHVybiAqLwogICAvKiB2YWx1ZSBhZGRyZXNzIHRoZW4gd2UgbmVlZCB0byBtYWtlIG9uZSAgICAgICAgICAgICAgICAgICAgICovCiAKLSAgaWYgKChydmFsdWUgPT0gTlVMTCkgJiYgCi0gICAgICAoY2lmLT5ydHlwZS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QpKQorICBpZiAocnZhbHVlID09IE5VTEwKKyAgICAgICYmIChjaWYtPmZsYWdzID09IEZGSV9UWVBFX1NUUlVDVAorICAgICAgICAgIHx8IGNpZi0+ZmxhZ3MgPT0gRkZJX1RZUEVfTVNfU1RSVUNUKSkKICAgICB7CiAgICAgICBlY2lmLnJ2YWx1ZSA9IGFsbG9jYShjaWYtPnJ0eXBlLT5zaXplKTsKICAgICB9CkBAIC02NDQsOCArNzkwLDM4IEBACiAjaWZkZWYgWDg2X1dJTjMyCiAgICAgY2FzZSBGRklfU1lTVjoKICAgICBjYXNlIEZGSV9TVERDQUxMOgotICAgICAgZmZpX2NhbGxfd2luMzIoZmZpX3ByZXBfYXJnc19yYXcsICZlY2lmLCBjaWYtPmJ5dGVzLCBjaWYtPmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgZWNpZi5ydmFsdWUsIGZuKTsKKyAgICBjYXNlIEZGSV9NU19DREVDTDoKKyAgICAgIGZmaV9jYWxsX3dpbjMyKGZmaV9wcmVwX2FyZ3NfcmF3LCAmZWNpZiwgY2lmLT5hYmksIGNpZi0+Ynl0ZXMsIGNpZi0+ZmxhZ3MsCisJCSAgICAgZWNpZi5ydmFsdWUsIGZuKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRkZJX1RISVNDQUxMOgorICAgIGNhc2UgRkZJX0ZBU1RDQUxMOgorICAgICAgeworCXVuc2lnbmVkIGludCBhYmkgPSBjaWYtPmFiaTsKKwl1bnNpZ25lZCBpbnQgaSwgcGFzc2VkX3JlZ3MgPSAwOworCisJaWYgKGNpZi0+ZmxhZ3MgPT0gRkZJX1RZUEVfU1RSVUNUKQorCSAgKytwYXNzZWRfcmVnczsKKworCWZvciAoaT0wOyBpIDwgY2lmLT5uYXJncyAmJiBwYXNzZWRfcmVncyA8IDI7aSsrKQorCSAgeworCSAgICBzaXplX3Qgc3o7CisKKwkgICAgaWYgKGNpZi0+YXJnX3R5cGVzW2ldLT50eXBlID09IEZGSV9UWVBFX0ZMT0FUCisJICAgICAgICB8fCBjaWYtPmFyZ190eXBlc1tpXS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QpCisJICAgICAgY29udGludWU7CisJICAgIHN6ID0gKGNpZi0+YXJnX3R5cGVzW2ldLT5zaXplICsgMykgJiB+MzsKKwkgICAgaWYgKHN6ID09IDAgfHwgc3ogPiA0KQorCSAgICAgIGNvbnRpbnVlOworCSAgICArK3Bhc3NlZF9yZWdzOworCSAgfQorCWlmIChwYXNzZWRfcmVncyA8IDIgJiYgYWJpID09IEZGSV9GQVNUQ0FMTCkKKwkgIGNpZi0+YWJpID0gYWJpID0gRkZJX1RISVNDQUxMOworCWlmIChwYXNzZWRfcmVncyA8IDEgJiYgYWJpID09IEZGSV9USElTQ0FMTCkKKwkgIGNpZi0+YWJpID0gYWJpID0gRkZJX1NURENBTEw7CisgICAgICAgIGZmaV9jYWxsX3dpbjMyKGZmaV9wcmVwX2FyZ3NfcmF3LCAmZWNpZiwgYWJpLCBjaWYtPmJ5dGVzLCBjaWYtPmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICBlY2lmLnJ2YWx1ZSwgZm4pOworICAgICAgfQogICAgICAgYnJlYWs7CiAjZWxzZQogICAgIGNhc2UgRkZJX1NZU1Y6CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvZmZpNjQuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3g4Ni9mZmk2NC5jCmluZGV4IDA3YTI2MjcuLjIwMTRhZjIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3g4Ni9mZmk2NC5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3g4Ni9mZmk2NC5jCkBAIC0xLDcgKzEsOSBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIGZmaTY0LmMgLSBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDcgIEJvIFRob3JzZW4gPGJvQHN1c2UuZGU+Ci0gICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA4ICBSZWQgSGF0LCBJbmMuCi0gICAKKyAgIGZmaTY0LmMgLSBDb3B5cmlnaHQgKGMpIDIwMTMgIFRoZSBXcml0dGVuIFdvcmQsIEluYy4KKyAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMTEgIEFudGhvbnkgR3JlZW4KKyAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgIFJlZCBIYXQsIEluYy4KKyAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDcgIEJvIFRob3JzZW4gPGJvQHN1c2UuZGU+CisgICAgICAgICAgICAgCiAgICB4ODYtNjQgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UgCiAKICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwpAQCAtMzYsMTEgKzM4LDI5IEBACiAjZGVmaW5lIE1BWF9HUFJfUkVHUyA2CiAjZGVmaW5lIE1BWF9TU0VfUkVHUyA4CiAKKyNpZiBkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpCisjZGVmaW5lIFVJTlQxMjggX19tMTI4CisjZWxzZQorI2lmIGRlZmluZWQoX19TVU5QUk9fQykKKyNpbmNsdWRlIDxzdW5tZWRpYV90eXBlcy5oPgorI2RlZmluZSBVSU5UMTI4IF9fbTEyOGkKKyNlbHNlCisjZGVmaW5lIFVJTlQxMjggX19pbnQxMjhfdAorI2VuZGlmCisjZW5kaWYKKwordW5pb24gYmlnX2ludF91bmlvbgoreworICBVSU5UMzIgaTMyOworICBVSU5UNjQgaTY0OworICBVSU5UMTI4IGkxMjg7Cit9OworCiBzdHJ1Y3QgcmVnaXN0ZXJfYXJncwogewogICAvKiBSZWdpc3RlcnMgZm9yIGFyZ3VtZW50IHBhc3NpbmcuICAqLwogICBVSU5UNjQgZ3ByW01BWF9HUFJfUkVHU107Ci0gIF9faW50MTI4X3Qgc3NlW01BWF9TU0VfUkVHU107CisgIHVuaW9uIGJpZ19pbnRfdW5pb24gc3NlW01BWF9TU0VfUkVHU107IAogfTsKIAogZXh0ZXJuIHZvaWQgZmZpX2NhbGxfdW5peDY0ICh2b2lkICphcmdzLCB1bnNpZ25lZCBsb25nIGJ5dGVzLCB1bnNpZ25lZCBmbGFncywKQEAgLTM3OCw3ICszOTgsNyBAQAogCSAgaWYgKGFsaWduIDwgOCkKIAkgICAgYWxpZ24gPSA4OwogCi0JICBieXRlcyA9IEFMSUdOKGJ5dGVzLCBhbGlnbik7CisJICBieXRlcyA9IEFMSUdOIChieXRlcywgYWxpZ24pOwogCSAgYnl0ZXMgKz0gY2lmLT5hcmdfdHlwZXNbaV0tPnNpemU7CiAJfQogICAgICAgZWxzZQpAQCAtMzkwLDcgKzQxMCw3IEBACiAgIGlmIChzc2Vjb3VudCkKICAgICBmbGFncyB8PSAxIDw8IDExOwogICBjaWYtPmZsYWdzID0gZmxhZ3M7Ci0gIGNpZi0+Ynl0ZXMgPSBieXRlczsKKyAgY2lmLT5ieXRlcyA9IEFMSUdOIChieXRlcywgOCk7CiAKICAgcmV0dXJuIEZGSV9PSzsKIH0KQEAgLTQyNiw3ICs0NDYsNyBAQAogICAvKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHBhc3NlZCBpbiBtZW1vcnksIGFkZCB0aGUgcG9pbnRlciBhcyB0aGUKICAgICAgZmlyc3QgaW50ZWdlciBhcmd1bWVudC4gICovCiAgIGlmIChyZXRfaW5fbWVtb3J5KQotICAgIHJlZ19hcmdzLT5ncHJbZ3ByY291bnQrK10gPSAobG9uZykgcnZhbHVlOworICAgIHJlZ19hcmdzLT5ncHJbZ3ByY291bnQrK10gPSAodW5zaWduZWQgbG9uZykgcnZhbHVlOwogCiAgIGF2biA9IGNpZi0+bmFyZ3M7CiAgIGFyZ190eXBlcyA9IGNpZi0+YXJnX3R5cGVzOwpAQCAtNDY0LDE2ICs0ODQsMzMgQEAKIAkJewogCQljYXNlIFg4Nl82NF9JTlRFR0VSX0NMQVNTOgogCQljYXNlIFg4Nl82NF9JTlRFR0VSU0lfQ0xBU1M6Ci0JCSAgcmVnX2FyZ3MtPmdwcltncHJjb3VudF0gPSAwOwotCQkgIG1lbWNweSAoJnJlZ19hcmdzLT5ncHJbZ3ByY291bnRdLCBhLCBzaXplIDwgOCA/IHNpemUgOiA4KTsKKwkJICAvKiBTaWduLWV4dGVuZCBpbnRlZ2VyIGFyZ3VtZW50cyBwYXNzZWQgaW4gZ2VuZXJhbAorCQkgICAgIHB1cnBvc2UgcmVnaXN0ZXJzLCB0byBjb3BlIHdpdGggdGhlIGZhY3QgdGhhdAorCQkgICAgIExMVk0gaW5jb3JyZWN0bHkgYXNzdW1lcyB0aGF0IHRoaXMgd2lsbCBiZSBkb25lCisJCSAgICAgKHRoZSB4ODYtNjQgUFMgQUJJIGRvZXMgbm90IHNwZWNpZnkgdGhpcykuICovCisJCSAgc3dpdGNoIChhcmdfdHlwZXNbaV0tPnR5cGUpCisJCSAgICB7CisJCSAgICBjYXNlIEZGSV9UWVBFX1NJTlQ4OgorCQkgICAgICAqKFNJTlQ2NCAqKSZyZWdfYXJncy0+Z3ByW2dwcmNvdW50XSA9IChTSU5UNjQpICooKFNJTlQ4ICopIGEpOworCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgRkZJX1RZUEVfU0lOVDE2OgorCQkgICAgICAqKFNJTlQ2NCAqKSZyZWdfYXJncy0+Z3ByW2dwcmNvdW50XSA9IChTSU5UNjQpICooKFNJTlQxNiAqKSBhKTsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIEZGSV9UWVBFX1NJTlQzMjoKKwkJICAgICAgKihTSU5UNjQgKikmcmVnX2FyZ3MtPmdwcltncHJjb3VudF0gPSAoU0lOVDY0KSAqKChTSU5UMzIgKikgYSk7CisJCSAgICAgIGJyZWFrOworCQkgICAgZGVmYXVsdDoKKwkJICAgICAgcmVnX2FyZ3MtPmdwcltncHJjb3VudF0gPSAwOworCQkgICAgICBtZW1jcHkgKCZyZWdfYXJncy0+Z3ByW2dwcmNvdW50XSwgYSwgc2l6ZSA8IDggPyBzaXplIDogOCk7CisJCSAgICB9CiAJCSAgZ3ByY291bnQrKzsKIAkJICBicmVhazsKIAkJY2FzZSBYODZfNjRfU1NFX0NMQVNTOgogCQljYXNlIFg4Nl82NF9TU0VERl9DTEFTUzoKLQkJICByZWdfYXJncy0+c3NlW3NzZWNvdW50KytdID0gKihVSU5UNjQgKikgYTsKKwkJICByZWdfYXJncy0+c3NlW3NzZWNvdW50KytdLmk2NCA9ICooVUlOVDY0ICopIGE7CiAJCSAgYnJlYWs7CiAJCWNhc2UgWDg2XzY0X1NTRVNGX0NMQVNTOgotCQkgIHJlZ19hcmdzLT5zc2Vbc3NlY291bnQrK10gPSAqKFVJTlQzMiAqKSBhOworCQkgIHJlZ19hcmdzLT5zc2Vbc3NlY291bnQrK10uaTMyID0gKihVSU5UMzIgKikgYTsKIAkJICBicmVhazsKIAkJZGVmYXVsdDoKIAkJICBhYm9ydCgpOwpAQCAtNDk4LDEyICs1MzUsMjEgQEAKIHsKICAgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKnRyYW1wOwogCisgIC8qIFNhbml0eSBjaGVjayBvbiB0aGUgY2lmIEFCSS4gICovCisgIHsKKyAgICBpbnQgYWJpID0gY2lmLT5hYmk7CisgICAgaWYgKFVOTElLRUxZICghIChhYmkgPiBGRklfRklSU1RfQUJJICYmIGFiaSA8IEZGSV9MQVNUX0FCSSkpKQorICAgICAgcmV0dXJuIEZGSV9CQURfQUJJOworICB9CisKICAgdHJhbXAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikgJmNsb3N1cmUtPnRyYW1wWzBdOwogCiAgIHRyYW1wWzBdID0gMHhiYjQ5OwkJLyogbW92IDxjb2RlPiwgJXIxMQkqLwotICAqKHZvaWQgKiB2b2xhdGlsZSAqKSAmdHJhbXBbMV0gPSBmZmlfY2xvc3VyZV91bml4NjQ7CisgICooKHVuc2lnbmVkIGxvbmcgbG9uZyAqIHZvbGF0aWxlKSAmdHJhbXBbMV0pCisgICAgPSAodW5zaWduZWQgbG9uZykgZmZpX2Nsb3N1cmVfdW5peDY0OwogICB0cmFtcFs1XSA9IDB4YmE0OTsJCS8qIG1vdiA8ZGF0YT4sICVyMTAJKi8KLSAgKih2b2lkICogdm9sYXRpbGUgKikgJnRyYW1wWzZdID0gY29kZWxvYzsKKyAgKigodW5zaWduZWQgbG9uZyBsb25nICogdm9sYXRpbGUpICZ0cmFtcFs2XSkKKyAgICA9ICh1bnNpZ25lZCBsb25nKSBjb2RlbG9jOwogCiAgIC8qIFNldCB0aGUgY2FycnkgYml0IGlmZiB0aGUgZnVuY3Rpb24gdXNlcyBhbnkgc3NlIHJlZ2lzdGVycy4KICAgICAgVGhpcyBpcyBjbGMgb3Igc3RjLCB0b2dldGhlciB3aXRoIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBqbXAuICAqLwpAQCAtNTQyLDcgKzU4OCw3IEBACiAJewogCSAgLyogVGhlIHJldHVybiB2YWx1ZSBnb2VzIGluIG1lbW9yeS4gIEFycmFuZ2UgZm9yIHRoZSBjbG9zdXJlCiAJICAgICByZXR1cm4gdmFsdWUgdG8gZ28gZGlyZWN0bHkgYmFjayB0byB0aGUgb3JpZ2luYWwgY2FsbGVyLiAgKi8KLQkgIHJ2YWx1ZSA9ICh2b2lkICopIHJlZ19hcmdzLT5ncHJbZ3ByY291bnQrK107CisJICBydmFsdWUgPSAodm9pZCAqKSAodW5zaWduZWQgbG9uZykgcmVnX2FyZ3MtPmdwcltncHJjb3VudCsrXTsKIAkgIC8qIFdlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcgaW4gYXNtIGZvciB0aGUgcmV0dXJuLiAgKi8KIAkgIHJldCA9IEZGSV9UWVBFX1ZPSUQ7CiAJfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMveDg2L2ZmaXRhcmdldC5oIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMveDg2L2ZmaXRhcmdldC5oCmluZGV4IDg5YTg5ODMuLjQ2ZjI5NGMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3g4Ni9mZml0YXJnZXQuaAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvZmZpdGFyZ2V0LmgKQEAgLTEsNiArMSw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotQy0qLQotICAgZmZpdGFyZ2V0LmggLSBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMywgMjAxMCAgUmVkIEhhdCwgSW5jLgotICAgQ29weXJpZ2h0IChDKSAyMDA4ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIGZmaXRhcmdldC5oIC0gQ29weXJpZ2h0IChjKSAyMDEyICBBbnRob255IEdyZWVuCisgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMTk5Ni0yMDAzLCAyMDEwICBSZWQgSGF0LCBJbmMuCisgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMjAwOCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAKICAgIFRhcmdldCBjb25maWd1cmF0aW9uIG1hY3JvcyBmb3IgeDg2IGFuZCB4ODYtNjQuCiAKQEAgLTI5LDggKzMwLDE1IEBACiAjaWZuZGVmIExJQkZGSV9UQVJHRVRfSAogI2RlZmluZSBMSUJGRklfVEFSR0VUX0gKIAorI2lmbmRlZiBMSUJGRklfSAorI2Vycm9yICJQbGVhc2UgZG8gbm90IGluY2x1ZGUgZmZpdGFyZ2V0LmggZGlyZWN0bHkgaW50byB5b3VyIHNvdXJjZS4gIFVzZSBmZmkuaCBpbnN0ZWFkLiIKKyNlbmRpZgorCiAvKiAtLS0tIFN5c3RlbSBzcGVjaWZpYyBjb25maWd1cmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCisvKiBGb3IgY29kZSBjb21tb24gdG8gYWxsIHBsYXRmb3JtcyBvbiB4ODYgYW5kIHg4Nl82NC4gKi8KKyNkZWZpbmUgWDg2X0FOWQorCiAjaWYgZGVmaW5lZCAoWDg2XzY0KSAmJiBkZWZpbmVkIChfX2kzODZfXykKICN1bmRlZiBYODZfNjQKICNkZWZpbmUgWDg2CkBAIC0zOCw3ICs0Niw3IEBACiAKICNpZmRlZiBYODZfV0lONjQKICNkZWZpbmUgRkZJX1NJWkVPRl9BUkcgOAotI2RlZmluZSBVU0VfQlVJTFRJTl9GRlMgMCAvLyBub3QgeWV0IGltcGxlbWVudGVkIGluIG1pbmd3LTY0IAorI2RlZmluZSBVU0VfQlVJTFRJTl9GRlMgMCAvKiBub3QgeWV0IGltcGxlbWVudGVkIGluIG1pbmd3LTY0ICovCiAjZW5kaWYKIAogLyogLS0tLSBHZW5lcmljIHR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTUzLDkgKzYxLDE2IEBACiB0eXBlZGVmIGxvbmcgbG9uZyAgICAgICAgICAgICAgZmZpX3Nhcmc7CiAjZW5kaWYKICNlbHNlCisjaWYgZGVmaW5lZCBfX3g4Nl82NF9fICYmIGRlZmluZWQgX19JTFAzMl9fCisjZGVmaW5lIEZGSV9TSVpFT0ZfQVJHIDgKKyNkZWZpbmUgRkZJX1NJWkVPRl9KQVZBX1JBVyAgNAordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgICAgIGZmaV9hcmc7Cit0eXBlZGVmIGxvbmcgbG9uZyAgICAgICAgICAgICAgZmZpX3Nhcmc7CisjZWxzZQogdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgICAgIGZmaV9hcmc7CiB0eXBlZGVmIHNpZ25lZCBsb25nICAgICAgICAgICAgZmZpX3Nhcmc7CiAjZW5kaWYKKyNlbmRpZgogCiB0eXBlZGVmIGVudW0gZmZpX2FiaSB7CiAgIEZGSV9GSVJTVF9BQkkgPSAwLApAQCAtNjQsMjggKzc5LDMyIEBACiAjaWZkZWYgWDg2X1dJTjMyCiAgIEZGSV9TWVNWLAogICBGRklfU1REQ0FMTCwKLSAgLyogVE9ETzogQWRkIGZhc3RjYWxsIHN1cHBvcnQgZm9yIHRoZSBzYWtlIG9mIGNvbXBsZXRlbmVzcyAqLwotICBGRklfREVGQVVMVF9BQkkgPSBGRklfU1lTViwKKyAgRkZJX1RISVNDQUxMLAorICBGRklfRkFTVENBTEwsCisgIEZGSV9NU19DREVDTCwKKyAgRkZJX0xBU1RfQUJJLAorI2lmZGVmIF9NU0NfVkVSCisgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9NU19DREVDTAorI2Vsc2UKKyAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX1NZU1YKICNlbmRpZgogCi0jaWZkZWYgWDg2X1dJTjY0CisjZWxpZiBkZWZpbmVkKFg4Nl9XSU42NCkKICAgRkZJX1dJTjY0LAotICBGRklfREVGQVVMVF9BQkkgPSBGRklfV0lONjQsCi0jZWxzZQorICBGRklfTEFTVF9BQkksCisgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9XSU42NAogCisjZWxzZQogICAvKiAtLS0tIEludGVsIHg4NiBhbmQgQU1EIHg4Ni02NCAtICovCi0jaWYgIWRlZmluZWQoWDg2X1dJTjMyKSAmJiAoZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9faTM4NikgfHwgZGVmaW5lZChfX2FtZDY0KSkKICAgRkZJX1NZU1YsCiAgIEZGSV9VTklYNjQsICAgLyogVW5peCB2YXJpYW50cyBhbGwgdXNlIHRoZSBzYW1lIEFCSSBmb3IgeDg2LTY0ICAqLworICBGRklfTEFTVF9BQkksCiAjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX2kzODYpCi0gIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9TWVNWLAorICBGRklfREVGQVVMVF9BQkkgPSBGRklfU1lTVgogI2Vsc2UKLSAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX1VOSVg2NCwKKyAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX1VOSVg2NAogI2VuZGlmCiAjZW5kaWYKLSNlbmRpZiAvKiBYODZfV0lONjQgKi8KLQotICBGRklfTEFTVF9BQkkgPSBGRklfREVGQVVMVF9BQkkgKyAxCiB9IGZmaV9hYmk7CiAjZW5kaWYKIApAQCAtOTUsMTMgKzExNCwxNCBAQAogI2RlZmluZSBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfMUIgKEZGSV9UWVBFX0xBU1QgKyAxKQogI2RlZmluZSBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfMkIgKEZGSV9UWVBFX0xBU1QgKyAyKQogI2RlZmluZSBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfNEIgKEZGSV9UWVBFX0xBU1QgKyAzKQorI2RlZmluZSBGRklfVFlQRV9NU19TVFJVQ1QgICAgICAgKEZGSV9UWVBFX0xBU1QgKyA0KQogCiAjaWYgZGVmaW5lZCAoWDg2XzY0KSB8fCAoZGVmaW5lZCAoX194ODZfNjRfXykgJiYgZGVmaW5lZCAoWDg2X0RBUldJTikpCiAjZGVmaW5lIEZGSV9UUkFNUE9MSU5FX1NJWkUgMjQKICNkZWZpbmUgRkZJX05BVElWRV9SQVdfQVBJIDAKICNlbHNlCiAjaWZkZWYgWDg2X1dJTjMyCi0jZGVmaW5lIEZGSV9UUkFNUE9MSU5FX1NJWkUgMTMKKyNkZWZpbmUgRkZJX1RSQU1QT0xJTkVfU0laRSA1MgogI2Vsc2UKICNpZmRlZiBYODZfV0lONjQKICNkZWZpbmUgRkZJX1RSQU1QT0xJTkVfU0laRSAyOQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMveDg2L3N5c3YuUyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3g4Ni9zeXN2LlMKaW5kZXggZjRiNmMxZS4uM2JkNTQ3NyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMveDg2L3N5c3YuUworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvc3lzdi5TCkBAIC0xLDUgKzEsNiBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIHN5c3YuUyAtIENvcHlyaWdodCAoYykgMTk5NiwgMTk5OCwgMjAwMS0yMDAzLCAyMDA1LCAyMDA4ICBSZWQgSGF0LCBJbmMuCisgICBzeXN2LlMgLSBDb3B5cmlnaHQgKGMpIDIwMTMgIFRoZSBXcml0dGVuIFdvcmQsIEluYy4KKwkgIC0gQ29weXJpZ2h0IChjKSAxOTk2LDE5OTgsMjAwMS0yMDAzLDIwMDUsMjAwOCwyMDEwICBSZWQgSGF0LCBJbmMuCiAgICAKICAgIFg4NiBGb3JlaWduIEZ1bmN0aW9uIEludGVyZmFjZSAKIApAQCAtNDgsNiArNDksOSBAQAogCW1vdmwgIDE2KCVlYnApLCVlY3gKIAlzdWJsICAlZWN4LCVlc3AKIAorICAgICAgICAvKiBBbGlnbiB0aGUgc3RhY2sgcG9pbnRlciB0byAxNi1ieXRlcyAqLworICAgICAgICBhbmRsICAkMHhmZmZmZmZmMCwgJWVzcAorCiAJbW92bCAgJWVzcCwlZWF4CiAKIAkvKiBQbGFjZSBhbGwgb2YgdGhlIGZmaV9wcmVwX2FyZ3MgaW4gcG9zaXRpb24gICovCkBAIC0xNzgsOSArMTgyLDE5IEBACiAJbGVhbAktMjQoJWVicCksICVlZHgKIAltb3ZsCSVlZHgsIC0xMiglZWJwKQkvKiByZXNwICovCiAJbGVhbAk4KCVlYnApLCAlZWR4CisjaWZkZWYgX19TVU5QUk9fQworCS8qIFRoZSBTVU5QUk8gY29tcGlsZXIgZG9lc24ndCBzdXBwb3J0IEdDQydzIHJlZ3Bhcm0gZnVuY3Rpb24KKyAgCSAgIGF0dHJpYnV0ZSwgc28gd2UgaGF2ZSB0byBwYXNzIGFsbCB0aHJlZSBhcmd1bWVudHMgdG8KKwkgICBmZmlfY2xvc3VyZV9TWVNWX2lubmVyIG9uIHRoZSBzdGFjay4gICovCisJbW92bAklZWR4LCA4KCVlc3ApCS8qIGFyZ3MgPSBfX2J1aWx0aW5fZHdhcmZfY2ZhICgpICovCisJbGVhbAktMTIoJWVicCksICVlZHgKKwltb3ZsCSVlZHgsIDQoJWVzcCkJLyogJnJlc3AgKi8KKwltb3ZsICAgICVlYXgsICglZXNwKSAgICAvKiBjbG9zdXJlICovCisjZWxzZQogCW1vdmwJJWVkeCwgNCglZXNwKQkvKiBhcmdzID0gX19idWlsdGluX2R3YXJmX2NmYSAoKSAqLwogCWxlYWwJLTEyKCVlYnApLCAlZWR4CiAJbW92bAklZWR4LCAoJWVzcCkJLyogJnJlc3AgKi8KKyNlbmRpZgogI2lmIGRlZmluZWQgSEFWRV9ISURERU5fVklTSUJJTElUWV9BVFRSSUJVVEUgfHwgIWRlZmluZWQgX19QSUNfXwogCWNhbGwJZmZpX2Nsb3N1cmVfU1lTVl9pbm5lcgogI2Vsc2UKQEAgLTMyNSwyMyArMzM5LDU1IEBACiAJLnNpemUJZmZpX2Nsb3N1cmVfcmF3X1NZU1YsIC4tZmZpX2Nsb3N1cmVfcmF3X1NZU1YKICNlbmRpZgogCisjaWYgZGVmaW5lZCBfX0dOVUNfXworLyogT25seSBlbWl0IGR3YXJmIHVud2luZCBpbmZvIHdoZW4gYnVpbGRpbmcgd2l0aCBHTlUgdG9vbGNoYWluLiAgKi8KKworI2lmIGRlZmluZWQgX19QSUNfXworIyBpZiBkZWZpbmVkIF9fc3VuX18gJiYgZGVmaW5lZCBfX3N2cjRfXworLyogMzItYml0IFNvbGFyaXMgMi94ODYgdXNlcyBkYXRhcmVsIGVuY29kaW5nIGZvciBQSUMuICBHTlUgbGQgYmVmb3JlIDIuMjIKKyAgIGRvZXNuJ3QgY29ycmVjdGx5IHNvcnQgLmVoX2ZyYW1lX2hkciB3aXRoIG1peGVkIGVuY29kaW5ncywgc28gbWF0Y2ggdGhpcy4gICovCisjICBkZWZpbmUgRkRFX0VOQ09ESU5HCQkweDMwCS8qIGRhdGFyZWwgKi8KKyMgIGRlZmluZSBGREVfRU5DT0RFKFgpCQlYQEdPVE9GRgorIyBlbHNlCisjICBkZWZpbmUgRkRFX0VOQ09ESU5HCQkweDFiCS8qIHBjcmVsIHNkYXRhNCAqLworIyAgaWYgZGVmaW5lZCBIQVZFX0FTX1g4Nl9QQ1JFTAorIyAgIGRlZmluZSBGREVfRU5DT0RFKFgpCVgtLgorIyAgZWxzZQorIyAgIGRlZmluZSBGREVfRU5DT0RFKFgpCVhAcmVsCisjICBlbmRpZgorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIEZERV9FTkNPRElORwkJMAkvKiBhYnNvbHV0ZSAqLworIyBkZWZpbmUgRkRFX0VOQ09ERShYKQkJWAorI2VuZGlmCisKIAkuc2VjdGlvbgkuZWhfZnJhbWUsRUhfRlJBTUVfRkxBR1MsQHByb2diaXRzCiAuTGZyYW1lMToKIAkubG9uZwkuTEVDSUUxLS5MU0NJRTEJLyogTGVuZ3RoIG9mIENvbW1vbiBJbmZvcm1hdGlvbiBFbnRyeSAqLwogLkxTQ0lFMToKIAkubG9uZwkweDAJLyogQ0lFIElkZW50aWZpZXIgVGFnICovCiAJLmJ5dGUJMHgxCS8qIENJRSBWZXJzaW9uICovCisjaWZkZWYgSEFWRV9BU19BU0NJSV9QU0VVRE9fT1AKICNpZmRlZiBfX1BJQ19fCiAJLmFzY2lpICJ6UlwwIgkvKiBDSUUgQXVnbWVudGF0aW9uICovCiAjZWxzZQogCS5hc2NpaSAiXDAiCS8qIENJRSBBdWdtZW50YXRpb24gKi8KICNlbmRpZgorI2VsaWYgZGVmaW5lZCBIQVZFX0FTX1NUUklOR19QU0VVRE9fT1AKKyNpZmRlZiBfX1BJQ19fCisJLnN0cmluZyAielIiCS8qIENJRSBBdWdtZW50YXRpb24gKi8KKyNlbHNlCisJLnN0cmluZyAiIgkvKiBDSUUgQXVnbWVudGF0aW9uICovCisjZW5kaWYKKyNlbHNlCisjZXJyb3IgbWlzc2luZyAuYXNjaWkvLnN0cmluZworI2VuZGlmCiAJLmJ5dGUJMHgxCS8qIC51bGViMTI4IDB4MTsgQ0lFIENvZGUgQWxpZ25tZW50IEZhY3RvciAqLwogCS5ieXRlCTB4N2MJLyogLnNsZWIxMjggLTQ7IENJRSBEYXRhIEFsaWdubWVudCBGYWN0b3IgKi8KIAkuYnl0ZQkweDgJLyogQ0lFIFJBIENvbHVtbiAqLwogI2lmZGVmIF9fUElDX18KIAkuYnl0ZQkweDEJLyogLnVsZWIxMjggMHgxOyBBdWdtZW50YXRpb24gc2l6ZSAqLwotCS5ieXRlCTB4MWIJLyogRkRFIEVuY29kaW5nIChwY3JlbCBzZGF0YTQpICovCisJLmJ5dGUJRkRFX0VOQ09ESU5HCiAjZW5kaWYKIAkuYnl0ZQkweGMJLyogRFdfQ0ZBX2RlZl9jZmEgKi8KIAkuYnl0ZQkweDQJLyogLnVsZWIxMjggMHg0ICovCkBAIC0zNTQsMTQgKzQwMCw4IEBACiAJLmxvbmcJLkxFRkRFMS0uTEFTRkRFMQkvKiBGREUgTGVuZ3RoICovCiAuTEFTRkRFMToKIAkubG9uZwkuTEFTRkRFMS0uTGZyYW1lMQkvKiBGREUgQ0lFIG9mZnNldCAqLwotI2lmIGRlZmluZWQgX19QSUNfXyAmJiBkZWZpbmVkIEhBVkVfQVNfWDg2X1BDUkVMCi0JLmxvbmcJLkxGQjEtLgkvKiBGREUgaW5pdGlhbCBsb2NhdGlvbiAqLwotI2VsaWYgZGVmaW5lZCBfX1BJQ19fCi0JLmxvbmcJLkxGQjFAcmVsCi0jZWxzZQotCS5sb25nCS5MRkIxCi0jZW5kaWYKLQkubG9uZwkuTEZFMS0uTEZCMQkvKiBGREUgYWRkcmVzcyByYW5nZSAqLworCS5sb25nCUZERV9FTkNPREUoLkxGQjEpCS8qIEZERSBpbml0aWFsIGxvY2F0aW9uICovCisJLmxvbmcJLkxGRTEtLkxGQjEJCS8qIEZERSBhZGRyZXNzIHJhbmdlICovCiAjaWZkZWYgX19QSUNfXwogCS5ieXRlCTB4MAkvKiAudWxlYjEyOCAweDA7IEF1Z21lbnRhdGlvbiBzaXplICovCiAjZW5kaWYKQEAgLTM4MSwxNCArNDIxLDggQEAKIAkubG9uZwkuTEVGREUyLS5MQVNGREUyCS8qIEZERSBMZW5ndGggKi8KIC5MQVNGREUyOgogCS5sb25nCS5MQVNGREUyLS5MZnJhbWUxCS8qIEZERSBDSUUgb2Zmc2V0ICovCi0jaWYgZGVmaW5lZCBfX1BJQ19fICYmIGRlZmluZWQgSEFWRV9BU19YODZfUENSRUwKLQkubG9uZwkuTEZCMi0uCS8qIEZERSBpbml0aWFsIGxvY2F0aW9uICovCi0jZWxpZiBkZWZpbmVkIF9fUElDX18KLQkubG9uZwkuTEZCMkByZWwKLSNlbHNlCi0JLmxvbmcJLkxGQjIKLSNlbmRpZgotCS5sb25nCS5MRkUyLS5MRkIyCS8qIEZERSBhZGRyZXNzIHJhbmdlICovCisJLmxvbmcJRkRFX0VOQ09ERSguTEZCMikJLyogRkRFIGluaXRpYWwgbG9jYXRpb24gKi8KKwkubG9uZwkuTEZFMi0uTEZCMgkJLyogRkRFIGFkZHJlc3MgcmFuZ2UgKi8KICNpZmRlZiBfX1BJQ19fCiAJLmJ5dGUJMHgwCS8qIC51bGViMTI4IDB4MDsgQXVnbWVudGF0aW9uIHNpemUgKi8KICNlbmRpZgpAQCAtNDE3LDE0ICs0NTEsOCBAQAogCS5sb25nCS5MRUZERTMtLkxBU0ZERTMJLyogRkRFIExlbmd0aCAqLwogLkxBU0ZERTM6CiAJLmxvbmcJLkxBU0ZERTMtLkxmcmFtZTEJLyogRkRFIENJRSBvZmZzZXQgKi8KLSNpZiBkZWZpbmVkIF9fUElDX18gJiYgZGVmaW5lZCBIQVZFX0FTX1g4Nl9QQ1JFTAotCS5sb25nCS5MRkIzLS4JLyogRkRFIGluaXRpYWwgbG9jYXRpb24gKi8KLSNlbGlmIGRlZmluZWQgX19QSUNfXwotCS5sb25nCS5MRkIzQHJlbAotI2Vsc2UKLQkubG9uZwkuTEZCMwotI2VuZGlmCi0JLmxvbmcJLkxGRTMtLkxGQjMJLyogRkRFIGFkZHJlc3MgcmFuZ2UgKi8KKwkubG9uZwlGREVfRU5DT0RFKC5MRkIzKQkvKiBGREUgaW5pdGlhbCBsb2NhdGlvbiAqLworCS5sb25nCS5MRkUzLS5MRkIzCQkvKiBGREUgYWRkcmVzcyByYW5nZSAqLwogI2lmZGVmIF9fUElDX18KIAkuYnl0ZQkweDAJLyogLnVsZWIxMjggMHgwOyBBdWdtZW50YXRpb24gc2l6ZSAqLwogI2VuZGlmCkBAIC00NDYsNiArNDc0LDcgQEAKIC5MRUZERTM6CiAKICNlbmRpZgorI2VuZGlmCiAKICNlbmRpZiAvKiBpZm5kZWYgX194ODZfNjRfXyAqLwogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvdW5peDY0LlMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvdW5peDY0LlMKaW5kZXggZmUzZjRmZC4uZGNkNmJjNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMveDg2L3VuaXg2NC5TCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3g4Ni91bml4NjQuUwpAQCAtMSw2ICsxLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICB1bml4NjQuUyAtIENvcHlyaWdodCAoYykgMjAwMiAgQm8gVGhvcnNlbiA8Ym9Ac3VzZS5kZT4KLQkgICAgICBDb3B5cmlnaHQgKGMpIDIwMDggIFJlZCBIYXQsIEluYworICAgdW5peDY0LlMgLSBDb3B5cmlnaHQgKGMpIDIwMTMgIFRoZSBXcml0dGVuIFdvcmQsIEluYy4KKwkgICAgLSBDb3B5cmlnaHQgKGMpIDIwMDggIFJlZCBIYXQsIEluYworCSAgICAtIENvcHlyaWdodCAoYykgMjAwMiAgQm8gVGhvcnNlbiA8Ym9Ac3VzZS5kZT4KIAogICAgeDg2LTY0IEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlIAogCkBAIC0zMjQsNyArMzI1LDE0IEBACiAuTFVXOToKIAkuc2l6ZQlmZmlfY2xvc3VyZV91bml4NjQsLi1mZmlfY2xvc3VyZV91bml4NjQKIAorI2lmZGVmIF9fR05VQ19fCisvKiBPbmx5IGVtaXQgRFdBUkYgdW53aW5kIGluZm8gd2hlbiBidWlsZGluZyB3aXRoIHRoZSBHTlUgdG9vbGNoYWluLiAgKi8KKworI2lmZGVmIEhBVkVfQVNfWDg2XzY0X1VOV0lORF9TRUNUSU9OX1RZUEUKKwkuc2VjdGlvbgkuZWhfZnJhbWUsImEiLEB1bndpbmQKKyNlbHNlCiAJLnNlY3Rpb24JLmVoX2ZyYW1lLCJhIixAcHJvZ2JpdHMKKyNlbmRpZgogLkxmcmFtZTE6CiAJLmxvbmcJLkxFQ0lFMS0uTFNDSUUxCQkvKiBDSUUgTGVuZ3RoICovCiAuTFNDSUUxOgpAQCAtNDE1LDYgKzQyMyw4IEBACiAJLmFsaWduIDgKIC5MRUZERTM6CiAKKyNlbmRpZiAvKiBfX0dOVUNfXyAqLworCQogI2VuZGlmIC8qIF9feDg2XzY0X18gKi8KIAogI2lmIGRlZmluZWQgX19FTEZfXyAmJiBkZWZpbmVkIF9fbGludXhfXwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMveDg2L3dpbjMyLlMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvd2luMzIuUwppbmRleCBhYzFlZDZmLi4yNGI3YmJkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvd2luMzIuUworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvd2luMzIuUwpAQCAtNDUsNiArNDUsNyBAQAogZmZpX2NhbGxfd2luMzIgUFJPQyBORUFSLAogICAgIGZmaV9wcmVwX2FyZ3MgOiBORUFSIFBUUiBEV09SRCwKICAgICBlY2lmICAgICAgICAgIDogTkVBUiBQVFIgRFdPUkQsCisgICAgY2lmX2FiaSAgICAgICA6IERXT1JELAogICAgIGNpZl9ieXRlcyAgICAgOiBEV09SRCwKICAgICBjaWZfZmxhZ3MgICAgIDogRFdPUkQsCiAgICAgcnZhbHVlICAgICAgICA6IE5FQVIgUFRSIERXT1JELApAQCAtNjQsNiArNjUsMTkgQEAKICAgICAgICAgOzsgUmV0dXJuIHN0YWNrIHRvIHByZXZpb3VzIHN0YXRlIGFuZCBjYWxsIHRoZSBmdW5jdGlvbgogICAgICAgICBhZGQgIGVzcCwgOAogCisJOzsgSGFuZGxlIHRoaXNjYWxsIGFuZCBmYXN0Y2FsbAorCWNtcCBjaWZfYWJpLCAzIDs7IEZGSV9USElTQ0FMTAorCWp6IGRvX3RoaXNjYWxsCisJY21wIGNpZl9hYmksIDQgOzsgRkZJX0ZBU1RDQUxMCisJam56IGRvX3N0ZGNhbGwKKwltb3YgZWN4LCBEV09SRCBQVFIgW2VzcF0KKwltb3YgZWR4LCBEV09SRCBQVFIgW2VzcCs0XQorCWFkZCBlc3AsIDgKKwlqbXAgZG9fc3RkY2FsbAorZG9fdGhpc2NhbGw6CisJbW92IGVjeCwgRFdPUkQgUFRSIFtlc3BdCisJYWRkIGVzcCwgNAorZG9fc3RkY2FsbDoKICAgICAgICAgY2FsbCBmbgogCiAgICAgICAgIDs7IGNkZWNsOiAgIHdlIHJlc3RvcmUgZXNwIGluIHRoZSBlcGlsb2d1ZSwgc28gdGhlcmUncyBubyBuZWVkIHRvCkBAIC05NCwzMSArMTA4LDM3IEBACiAgICAgICAgIGRkIG9mZnNldCBjYV9yZXRmbG9hdCAgICAgICA7OyBGRklfVFlQRV9GTE9BVAogICAgICAgICBkZCBvZmZzZXQgY2FfcmV0ZG91YmxlICAgICAgOzsgRkZJX1RZUEVfRE9VQkxFCiAgICAgICAgIGRkIG9mZnNldCBjYV9yZXRsb25nZG91YmxlICA7OyBGRklfVFlQRV9MT05HRE9VQkxFCi0gICAgICAgIGRkIG9mZnNldCBjYV9yZXRpbnQ4ICAgICAgICA7OyBGRklfVFlQRV9VSU5UOAotICAgICAgICBkZCBvZmZzZXQgY2FfcmV0aW50OCAgICAgICAgOzsgRkZJX1RZUEVfU0lOVDgKLSAgICAgICAgZGQgb2Zmc2V0IGNhX3JldGludDE2ICAgICAgIDs7IEZGSV9UWVBFX1VJTlQxNgotICAgICAgICBkZCBvZmZzZXQgY2FfcmV0aW50MTYgICAgICAgOzsgRkZJX1RZUEVfU0lOVDE2CisgICAgICAgIGRkIG9mZnNldCBjYV9yZXR1aW50OCAgICAgICA7OyBGRklfVFlQRV9VSU5UOAorICAgICAgICBkZCBvZmZzZXQgY2FfcmV0c2ludDggICAgICAgOzsgRkZJX1RZUEVfU0lOVDgKKyAgICAgICAgZGQgb2Zmc2V0IGNhX3JldHVpbnQxNiAgICAgIDs7IEZGSV9UWVBFX1VJTlQxNgorICAgICAgICBkZCBvZmZzZXQgY2FfcmV0c2ludDE2ICAgICAgOzsgRkZJX1RZUEVfU0lOVDE2CiAgICAgICAgIGRkIG9mZnNldCBjYV9yZXRpbnQgICAgICAgICA7OyBGRklfVFlQRV9VSU5UMzIKICAgICAgICAgZGQgb2Zmc2V0IGNhX3JldGludCAgICAgICAgIDs7IEZGSV9UWVBFX1NJTlQzMgogICAgICAgICBkZCBvZmZzZXQgY2FfcmV0aW50NjQgICAgICAgOzsgRkZJX1RZUEVfVUlOVDY0CiAgICAgICAgIGRkIG9mZnNldCBjYV9yZXRpbnQ2NCAgICAgICA7OyBGRklfVFlQRV9TSU5UNjQKICAgICAgICAgZGQgb2Zmc2V0IGNhX2VwaWxvZ3VlICAgICAgIDs7IEZGSV9UWVBFX1NUUlVDVAogICAgICAgICBkZCBvZmZzZXQgY2FfcmV0aW50ICAgICAgICAgOzsgRkZJX1RZUEVfUE9JTlRFUgotICAgICAgICBkZCBvZmZzZXQgY2FfcmV0aW50OCAgICAgICAgOzsgRkZJX1RZUEVfU01BTExfU1RSVUNUXzFCCi0gICAgICAgIGRkIG9mZnNldCBjYV9yZXRpbnQxNiAgICAgICA7OyBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfMkIKKyAgICAgICAgZGQgb2Zmc2V0IGNhX3JldHN0cnVjdDFiICAgIDs7IEZGSV9UWVBFX1NNQUxMX1NUUlVDVF8xQgorICAgICAgICBkZCBvZmZzZXQgY2FfcmV0c3RydWN0MmIgICAgOzsgRkZJX1RZUEVfU01BTExfU1RSVUNUXzJCCiAgICAgICAgIGRkIG9mZnNldCBjYV9yZXRpbnQgICAgICAgICA7OyBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfNEIKKyAgICAgICAgZGQgb2Zmc2V0IGNhX2VwaWxvZ3VlICAgICAgIDs7IEZGSV9UWVBFX01TX1NUUlVDVAogCi1jYV9yZXRpbnQ4OgotICAgICAgICA7OyBMb2FkICVlY3ggd2l0aCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgcmV0dXJuIHZhbHVlCi0gICAgICAgIG1vdiAgIGVjeCwgcnZhbHVlCi0gICAgICAgIG1vdiAgIFtlY3ggKyAwXSwgYWwKLSAgICAgICAgam1wICAgY2FfZXBpbG9ndWUKKyAgICAgICAgLyogU2lnbi96ZXJvIGV4dGVuZCBhcyBhcHByb3ByaWF0ZS4gICovCitjYV9yZXR1aW50ODoKKyAgICAgICAgbW92enggZWF4LCBhbAorICAgICAgICBqbXAgICBjYV9yZXRpbnQKIAotY2FfcmV0aW50MTY6Ci0gICAgICAgIDs7IExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKLSAgICAgICAgbW92ICAgZWN4LCBydmFsdWUKLSAgICAgICAgbW92ICAgW2VjeCArIDBdLCBheAotICAgICAgICBqbXAgICBjYV9lcGlsb2d1ZQorY2FfcmV0c2ludDg6CisgICAgICAgIG1vdnN4IGVheCwgYWwKKyAgICAgICAgam1wICAgY2FfcmV0aW50CisKK2NhX3JldHVpbnQxNjoKKyAgICAgICAgbW92enggZWF4LCBheAorICAgICAgICBqbXAgICBjYV9yZXRpbnQKKworY2FfcmV0c2ludDE2OgorICAgICAgICBtb3ZzeCBlYXgsIGF4CisgICAgICAgIGptcCAgIGNhX3JldGludAogCiBjYV9yZXRpbnQ6CiAgICAgICAgIDs7IExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKQEAgLTE1MSwxMSArMTcxLDMxIEBACiAgICAgICAgIGZzdHAgIFRCWVRFIFBUUiBbZWN4XQogICAgICAgICBqbXAgICBjYV9lcGlsb2d1ZQogCitjYV9yZXRzdHJ1Y3QxYjoKKyAgICAgICAgOzsgTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZQorICAgICAgICBtb3YgICBlY3gsIHJ2YWx1ZQorICAgICAgICBtb3YgICBbZWN4ICsgMF0sIGFsCisgICAgICAgIGptcCAgIGNhX2VwaWxvZ3VlCisKK2NhX3JldHN0cnVjdDJiOgorICAgICAgICA7OyBMb2FkICVlY3ggd2l0aCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgcmV0dXJuIHZhbHVlCisgICAgICAgIG1vdiAgIGVjeCwgcnZhbHVlCisgICAgICAgIG1vdiAgIFtlY3ggKyAwXSwgYXgKKyAgICAgICAgam1wICAgY2FfZXBpbG9ndWUKKwogY2FfZXBpbG9ndWU6CiAgICAgICAgIDs7IEVwaWxvZ3VlIGNvZGUgaXMgYXV0b2dlbmVyYXRlZC4KICAgICAgICAgcmV0CiBmZmlfY2FsbF93aW4zMiBFTkRQCiAKK2ZmaV9jbG9zdXJlX1RISVNDQUxMIFBST0MgTkVBUiBGT1JDRUZSQU1FCisJc3ViCWVzcCwgNDAKKwlsZWEJZWR4LCBbZWJwIC0yNF0KKwltb3YJW2VicCAtIDEyXSwgZWR4CS8qIHJlc3AgKi8KKwlsZWEJZWR4LCBbZWJwICsgMTJdICAvKiBhY2NvdW50IGZvciBzdHViIHJldHVybiBhZGRyZXNzIG9uIHN0YWNrICovCisJam1wCXN0dWIKK2ZmaV9jbG9zdXJlX1RISVNDQUxMIEVORFAKKwogZmZpX2Nsb3N1cmVfU1lTViBQUk9DIE5FQVIgRk9SQ0VGUkFNRQogICAgIDs7IHRoZSBmZmlfY2xvc3VyZSBjdHggaXMgcGFzc2VkIGluIGVheCBieSB0aGUgdHJhbXBvbGluZS4KIApAQCAtMTYzLDYgKzIwMyw3IEBACiAgICAgICAgIGxlYSAgZWR4LCBbZWJwIC0gMjRdCiAgICAgICAgIG1vdiAgW2VicCAtIDEyXSwgZWR4ICAgICAgICAgOzsgcmVzcAogICAgICAgICBsZWEgIGVkeCwgW2VicCArIDhdCitzdHViOjoKICAgICAgICAgbW92ICBbZXNwICsgOF0sIGVkeCAgICAgICAgICA7OyBhcmdzCiAgICAgICAgIGxlYSAgZWR4LCBbZWJwIC0gMTJdCiAgICAgICAgIG1vdiAgW2VzcCArIDRdLCBlZHggICAgICAgICAgOzsgJnJlc3AKQEAgLTE3OSwyNiArMjIwLDM1IEBACiAgICAgICAgIGRkIG9mZnNldCBjc19yZXRmbG9hdCAgICAgICA7OyBGRklfVFlQRV9GTE9BVAogICAgICAgICBkZCBvZmZzZXQgY3NfcmV0ZG91YmxlICAgICAgOzsgRkZJX1RZUEVfRE9VQkxFCiAgICAgICAgIGRkIG9mZnNldCBjc19yZXRsb25nZG91YmxlICA7OyBGRklfVFlQRV9MT05HRE9VQkxFCi0gICAgICAgIGRkIG9mZnNldCBjc19yZXRpbnQ4ICAgICAgICA7OyBGRklfVFlQRV9VSU5UOAotICAgICAgICBkZCBvZmZzZXQgY3NfcmV0aW50OCAgICAgICAgOzsgRkZJX1RZUEVfU0lOVDgKLSAgICAgICAgZGQgb2Zmc2V0IGNzX3JldGludDE2ICAgICAgIDs7IEZGSV9UWVBFX1VJTlQxNgotICAgICAgICBkZCBvZmZzZXQgY3NfcmV0aW50MTYgICAgICAgOzsgRkZJX1RZUEVfU0lOVDE2CisgICAgICAgIGRkIG9mZnNldCBjc19yZXR1aW50OCAgICAgICA7OyBGRklfVFlQRV9VSU5UOAorICAgICAgICBkZCBvZmZzZXQgY3NfcmV0c2ludDggICAgICAgOzsgRkZJX1RZUEVfU0lOVDgKKyAgICAgICAgZGQgb2Zmc2V0IGNzX3JldHVpbnQxNiAgICAgIDs7IEZGSV9UWVBFX1VJTlQxNgorICAgICAgICBkZCBvZmZzZXQgY3NfcmV0c2ludDE2ICAgICAgOzsgRkZJX1RZUEVfU0lOVDE2CiAgICAgICAgIGRkIG9mZnNldCBjc19yZXRpbnQgICAgICAgICA7OyBGRklfVFlQRV9VSU5UMzIKICAgICAgICAgZGQgb2Zmc2V0IGNzX3JldGludCAgICAgICAgIDs7IEZGSV9UWVBFX1NJTlQzMgogICAgICAgICBkZCBvZmZzZXQgY3NfcmV0aW50NjQgICAgICAgOzsgRkZJX1RZUEVfVUlOVDY0CiAgICAgICAgIGRkIG9mZnNldCBjc19yZXRpbnQ2NCAgICAgICA7OyBGRklfVFlQRV9TSU5UNjQKICAgICAgICAgZGQgb2Zmc2V0IGNzX3JldHN0cnVjdCAgICAgIDs7IEZGSV9UWVBFX1NUUlVDVAogICAgICAgICBkZCBvZmZzZXQgY3NfcmV0aW50ICAgICAgICAgOzsgRkZJX1RZUEVfUE9JTlRFUgotICAgICAgICBkZCBvZmZzZXQgY3NfcmV0aW50OCAgICAgICAgOzsgRkZJX1RZUEVfU01BTExfU1RSVUNUXzFCCi0gICAgICAgIGRkIG9mZnNldCBjc19yZXRpbnQxNiAgICAgICA7OyBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfMkIKKyAgICAgICAgZGQgb2Zmc2V0IGNzX3JldHNpbnQ4ICAgICAgIDs7IEZGSV9UWVBFX1NNQUxMX1NUUlVDVF8xQgorICAgICAgICBkZCBvZmZzZXQgY3NfcmV0c2ludDE2ICAgICAgOzsgRkZJX1RZUEVfU01BTExfU1RSVUNUXzJCCiAgICAgICAgIGRkIG9mZnNldCBjc19yZXRpbnQgICAgICAgICA7OyBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfNEIKKyAgICAgICAgZGQgb2Zmc2V0IGNzX3JldG1zc3RydWN0ICAgIDs7IEZGSV9UWVBFX01TX1NUUlVDVAogCi1jc19yZXRpbnQ4OgotICAgICAgICBtb3YgICBhbCwgW2VjeF0KK2NzX3JldHVpbnQ4OgorICAgICAgICBtb3Z6eCBlYXgsIEJZVEUgUFRSIFtlY3hdCiAgICAgICAgIGptcCAgIGNzX2VwaWxvZ3VlCiAKLWNzX3JldGludDE2OgotICAgICAgICBtb3YgICBheCwgW2VjeF0KK2NzX3JldHNpbnQ4OgorICAgICAgICBtb3ZzeCBlYXgsIEJZVEUgUFRSIFtlY3hdCisgICAgICAgIGptcCAgIGNzX2VwaWxvZ3VlCisKK2NzX3JldHVpbnQxNjoKKyAgICAgICAgbW92enggZWF4LCBXT1JEIFBUUiBbZWN4XQorICAgICAgICBqbXAgICBjc19lcGlsb2d1ZQorCitjc19yZXRzaW50MTY6CisgICAgICAgIG1vdnN4IGVheCwgV09SRCBQVFIgW2VjeF0KICAgICAgICAgam1wICAgY3NfZXBpbG9ndWUKIAogY3NfcmV0aW50OgpAQCAtMjI3LDYgKzI3NywxMiBAQAogICAgICAgICA7OyBFcGlsb2d1ZSBjb2RlIGlzIGF1dG9nZW5lcmF0ZWQuCiAgICAgICAgIHJldAk0CiAKK2NzX3JldG1zc3RydWN0OgorICAgICAgICA7OyBDYWxsZXIgZXhwZWN0cyB1cyB0byByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSByZWFsIHJldHVybiB2YWx1ZS4KKyAgICAgICAgbW92ICAgZWF4LCBlY3gKKyAgICAgICAgOzsgQ2FsbGVyIGRvZXNuJ3QgZXhwZWN0cyB1cyB0byBwb3Agc3RydWN0IHJldHVybiB2YWx1ZSBwb2ludGVyIGhpZGRlbiBhcmcuCisgICAgICAgIGptcCAgIGNzX2VwaWxvZ3VlCisKIGNzX2VwaWxvZ3VlOgogICAgICAgICA7OyBFcGlsb2d1ZSBjb2RlIGlzIGF1dG9nZW5lcmF0ZWQuCiAgICAgICAgIHJldApAQCAtMjM5LDcgKzI5NSwxNiBAQAogI2RlZmluZSBSQVdfQ0xPU1VSRV9VU0VSX0RBVEFfT0ZGU0VUIChSQVdfQ0xPU1VSRV9GVU5fT0ZGU0VUICsgNCkKICNkZWZpbmUgQ0lGX0ZMQUdTX09GRlNFVCAyMAogCi1mZmlfY2xvc3VyZV9yYXdfU1lTViBQUk9DIE5FQVIgVVNFUyBlc2kKK2ZmaV9jbG9zdXJlX3Jhd19USElTQ0FMTCBQUk9DIE5FQVIgVVNFUyBlc2kgRk9SQ0VGUkFNRQorCXN1YiBlc3AsIDM2CisJbW92ICBlc2ksIFtlYXggKyBSQVdfQ0xPU1VSRV9DSUZfT0ZGU0VUXSAgICAgICAgOzsgY2xvc3VyZS0+Y2lmCisJbW92ICBlZHgsIFtlYXggKyBSQVdfQ0xPU1VSRV9VU0VSX0RBVEFfT0ZGU0VUXSAgOzsgY2xvc3VyZS0+dXNlcl9kYXRhCisJbW92IFtlc3AgKyAxMl0sIGVkeAorCWxlYSBlZHgsIFtlYnAgKyAxMl0KKwlqbXAgc3R1YnJhdworZmZpX2Nsb3N1cmVfcmF3X1RISVNDQUxMIEVORFAKKworZmZpX2Nsb3N1cmVfcmF3X1NZU1YgUFJPQyBORUFSIFVTRVMgZXNpIEZPUkNFRlJBTUUKICAgICA7OyB0aGUgZmZpX2Nsb3N1cmUgY3R4IGlzIHBhc3NlZCBpbiBlYXggYnkgdGhlIHRyYW1wb2xpbmUuCiAKICAgICAgICAgc3ViICBlc3AsIDQwCkBAIC0yNDcsNiArMzEyLDcgQEAKICAgICAgICAgbW92ICBlZHgsIFtlYXggKyBSQVdfQ0xPU1VSRV9VU0VSX0RBVEFfT0ZGU0VUXSAgOzsgY2xvc3VyZS0+dXNlcl9kYXRhCiAgICAgICAgIG1vdiAgW2VzcCArIDEyXSwgZWR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IHVzZXJfZGF0YQogICAgICAgICBsZWEgIGVkeCwgW2VicCArIDhdCitzdHVicmF3OjoKICAgICAgICAgbW92ICBbZXNwICsgOF0sIGVkeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgcmF3X2FyZ3MKICAgICAgICAgbGVhICBlZHgsIFtlYnAgLSAyNF0KICAgICAgICAgbW92ICBbZXNwICsgNF0sIGVkeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgJnJlcwpAQCAtMjY0LDI2ICszMzAsMzUgQEAKICAgICAgICAgZGQgb2Zmc2V0IGNyX3JldGZsb2F0ICAgICAgIDs7IEZGSV9UWVBFX0ZMT0FUCiAgICAgICAgIGRkIG9mZnNldCBjcl9yZXRkb3VibGUgICAgICA7OyBGRklfVFlQRV9ET1VCTEUKICAgICAgICAgZGQgb2Zmc2V0IGNyX3JldGxvbmdkb3VibGUgIDs7IEZGSV9UWVBFX0xPTkdET1VCTEUKLSAgICAgICAgZGQgb2Zmc2V0IGNyX3JldGludDggICAgICAgIDs7IEZGSV9UWVBFX1VJTlQ4Ci0gICAgICAgIGRkIG9mZnNldCBjcl9yZXRpbnQ4ICAgICAgICA7OyBGRklfVFlQRV9TSU5UOAotICAgICAgICBkZCBvZmZzZXQgY3JfcmV0aW50MTYgICAgICAgOzsgRkZJX1RZUEVfVUlOVDE2Ci0gICAgICAgIGRkIG9mZnNldCBjcl9yZXRpbnQxNiAgICAgICA7OyBGRklfVFlQRV9TSU5UMTYKKyAgICAgICAgZGQgb2Zmc2V0IGNyX3JldHVpbnQ4ICAgICAgIDs7IEZGSV9UWVBFX1VJTlQ4CisgICAgICAgIGRkIG9mZnNldCBjcl9yZXRzaW50OCAgICAgICA7OyBGRklfVFlQRV9TSU5UOAorICAgICAgICBkZCBvZmZzZXQgY3JfcmV0dWludDE2ICAgICAgOzsgRkZJX1RZUEVfVUlOVDE2CisgICAgICAgIGRkIG9mZnNldCBjcl9yZXRzaW50MTYgICAgICA7OyBGRklfVFlQRV9TSU5UMTYKICAgICAgICAgZGQgb2Zmc2V0IGNyX3JldGludCAgICAgICAgIDs7IEZGSV9UWVBFX1VJTlQzMgogICAgICAgICBkZCBvZmZzZXQgY3JfcmV0aW50ICAgICAgICAgOzsgRkZJX1RZUEVfU0lOVDMyCiAgICAgICAgIGRkIG9mZnNldCBjcl9yZXRpbnQ2NCAgICAgICA7OyBGRklfVFlQRV9VSU5UNjQKICAgICAgICAgZGQgb2Zmc2V0IGNyX3JldGludDY0ICAgICAgIDs7IEZGSV9UWVBFX1NJTlQ2NAogICAgICAgICBkZCBvZmZzZXQgY3JfZXBpbG9ndWUgICAgICAgOzsgRkZJX1RZUEVfU1RSVUNUCiAgICAgICAgIGRkIG9mZnNldCBjcl9yZXRpbnQgICAgICAgICA7OyBGRklfVFlQRV9QT0lOVEVSCi0gICAgICAgIGRkIG9mZnNldCBjcl9yZXRpbnQ4ICAgICAgICA7OyBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfMUIKLSAgICAgICAgZGQgb2Zmc2V0IGNyX3JldGludDE2ICAgICAgIDs7IEZGSV9UWVBFX1NNQUxMX1NUUlVDVF8yQgorICAgICAgICBkZCBvZmZzZXQgY3JfcmV0c2ludDggICAgICAgOzsgRkZJX1RZUEVfU01BTExfU1RSVUNUXzFCCisgICAgICAgIGRkIG9mZnNldCBjcl9yZXRzaW50MTYgICAgICA7OyBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfMkIKICAgICAgICAgZGQgb2Zmc2V0IGNyX3JldGludCAgICAgICAgIDs7IEZGSV9UWVBFX1NNQUxMX1NUUlVDVF80QgorICAgICAgICBkZCBvZmZzZXQgY3JfZXBpbG9ndWUgICAgICAgOzsgRkZJX1RZUEVfTVNfU1RSVUNUCiAKLWNyX3JldGludDg6Ci0gICAgICAgIG1vdiAgIGFsLCBbZWN4XQorY3JfcmV0dWludDg6CisgICAgICAgIG1vdnp4IGVheCwgQllURSBQVFIgW2VjeF0KICAgICAgICAgam1wICAgY3JfZXBpbG9ndWUKIAotY3JfcmV0aW50MTY6Ci0gICAgICAgIG1vdiAgIGF4LCBbZWN4XQorY3JfcmV0c2ludDg6CisgICAgICAgIG1vdnN4IGVheCwgQllURSBQVFIgW2VjeF0KKyAgICAgICAgam1wICAgY3JfZXBpbG9ndWUKKworY3JfcmV0dWludDE2OgorICAgICAgICBtb3Z6eCBlYXgsIFdPUkQgUFRSIFtlY3hdCisgICAgICAgIGptcCAgIGNyX2VwaWxvZ3VlCisKK2NyX3JldHNpbnQxNjoKKyAgICAgICAgbW92c3ggZWF4LCBXT1JEIFBUUiBbZWN4XQogICAgICAgICBqbXAgICBjcl9lcGlsb2d1ZQogCiBjcl9yZXRpbnQ6CkBAIC0zMzcsMjYgKzQxMiwzNCBAQAogICAgICAgICBkZCBvZmZzZXQgY2RfcmV0ZmxvYXQgICAgICAgOzsgRkZJX1RZUEVfRkxPQVQKICAgICAgICAgZGQgb2Zmc2V0IGNkX3JldGRvdWJsZSAgICAgIDs7IEZGSV9UWVBFX0RPVUJMRQogICAgICAgICBkZCBvZmZzZXQgY2RfcmV0bG9uZ2RvdWJsZSAgOzsgRkZJX1RZUEVfTE9OR0RPVUJMRQotICAgICAgICBkZCBvZmZzZXQgY2RfcmV0aW50OCAgICAgICAgOzsgRkZJX1RZUEVfVUlOVDgKLSAgICAgICAgZGQgb2Zmc2V0IGNkX3JldGludDggICAgICAgIDs7IEZGSV9UWVBFX1NJTlQ4Ci0gICAgICAgIGRkIG9mZnNldCBjZF9yZXRpbnQxNiAgICAgICA7OyBGRklfVFlQRV9VSU5UMTYKLSAgICAgICAgZGQgb2Zmc2V0IGNkX3JldGludDE2ICAgICAgIDs7IEZGSV9UWVBFX1NJTlQxNgorICAgICAgICBkZCBvZmZzZXQgY2RfcmV0dWludDggICAgICAgOzsgRkZJX1RZUEVfVUlOVDgKKyAgICAgICAgZGQgb2Zmc2V0IGNkX3JldHNpbnQ4ICAgICAgIDs7IEZGSV9UWVBFX1NJTlQ4CisgICAgICAgIGRkIG9mZnNldCBjZF9yZXR1aW50MTYgICAgICA7OyBGRklfVFlQRV9VSU5UMTYKKyAgICAgICAgZGQgb2Zmc2V0IGNkX3JldHNpbnQxNiAgICAgIDs7IEZGSV9UWVBFX1NJTlQxNgogICAgICAgICBkZCBvZmZzZXQgY2RfcmV0aW50ICAgICAgICAgOzsgRkZJX1RZUEVfVUlOVDMyCiAgICAgICAgIGRkIG9mZnNldCBjZF9yZXRpbnQgICAgICAgICA7OyBGRklfVFlQRV9TSU5UMzIKICAgICAgICAgZGQgb2Zmc2V0IGNkX3JldGludDY0ICAgICAgIDs7IEZGSV9UWVBFX1VJTlQ2NAogICAgICAgICBkZCBvZmZzZXQgY2RfcmV0aW50NjQgICAgICAgOzsgRkZJX1RZUEVfU0lOVDY0CiAgICAgICAgIGRkIG9mZnNldCBjZF9lcGlsb2d1ZSAgICAgICA7OyBGRklfVFlQRV9TVFJVQ1QKICAgICAgICAgZGQgb2Zmc2V0IGNkX3JldGludCAgICAgICAgIDs7IEZGSV9UWVBFX1BPSU5URVIKLSAgICAgICAgZGQgb2Zmc2V0IGNkX3JldGludDggICAgICAgIDs7IEZGSV9UWVBFX1NNQUxMX1NUUlVDVF8xQgotICAgICAgICBkZCBvZmZzZXQgY2RfcmV0aW50MTYgICAgICAgOzsgRkZJX1RZUEVfU01BTExfU1RSVUNUXzJCCisgICAgICAgIGRkIG9mZnNldCBjZF9yZXRzaW50OCAgICAgICA7OyBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfMUIKKyAgICAgICAgZGQgb2Zmc2V0IGNkX3JldHNpbnQxNiAgICAgIDs7IEZGSV9UWVBFX1NNQUxMX1NUUlVDVF8yQgogICAgICAgICBkZCBvZmZzZXQgY2RfcmV0aW50ICAgICAgICAgOzsgRkZJX1RZUEVfU01BTExfU1RSVUNUXzRCCiAKLWNkX3JldGludDg6Ci0gICAgICAgIG1vdiAgIGFsLCBbZWN4XQorY2RfcmV0dWludDg6CisgICAgICAgIG1vdnp4IGVheCwgQllURSBQVFIgW2VjeF0KICAgICAgICAgam1wICAgY2RfZXBpbG9ndWUKIAotY2RfcmV0aW50MTY6Ci0gICAgICAgIG1vdiAgIGF4LCBbZWN4XQorY2RfcmV0c2ludDg6CisgICAgICAgIG1vdnN4IGVheCwgQllURSBQVFIgW2VjeF0KKyAgICAgICAgam1wICAgY2RfZXBpbG9ndWUKKworY2RfcmV0dWludDE2OgorICAgICAgICBtb3Z6eCBlYXgsIFdPUkQgUFRSIFtlY3hdCisgICAgICAgIGptcCAgIGNkX2VwaWxvZ3VlCisKK2NkX3JldHNpbnQxNjoKKyAgICAgICAgbW92c3ggZWF4LCBXT1JEIFBUUiBbZWN4XQogICAgICAgICBqbXAgICBjZF9lcGlsb2d1ZQogCiBjZF9yZXRpbnQ6CkBAIC0zOTUsNyArNDc4LDkgQEAKICAgICAgICAgIyBUaGlzIGFzc3VtZXMgd2UgYXJlIHVzaW5nIGdhcy4KICAgICAgICAgLmJhbGlnbiAxNgogCS5nbG9ibAlfZmZpX2NhbGxfd2luMzIKKyNpZm5kZWYgX19PUzJfXwogCS5kZWYJX2ZmaV9jYWxsX3dpbjMyOwkuc2NsCTI7CS50eXBlCTMyOwkuZW5kZWYKKyNlbmRpZgogX2ZmaV9jYWxsX3dpbjMyOgogLkxGQjE6CiAgICAgICAgIHB1c2hsICVlYnAKQEAgLTQwMyw3ICs0ODgsNyBAQAogICAgICAgICBtb3ZsICAlZXNwLCVlYnAKIC5MQ0ZJMToKICAgICAgICAgIyBNYWtlIHJvb20gZm9yIGFsbCBvZiB0aGUgbmV3IGFyZ3MuCi0gICAgICAgIG1vdmwgIDE2KCVlYnApLCVlY3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBtb3ZsICAyMCglZWJwKSwlZWN4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgc3VibCAgJWVjeCwlZXNwCiAgCiAgICAgICAgIG1vdmwgICVlc3AsJWVheApAQCAtNDE1LDE5ICs1MDAsMzQgQEAKICAKICAgICAgICAgIyBSZXR1cm4gc3RhY2sgdG8gcHJldmlvdXMgc3RhdGUgYW5kIGNhbGwgdGhlIGZ1bmN0aW9uCiAgICAgICAgIGFkZGwgICQ4LCVlc3AKLSAKKworCSMgSGFuZGxlIGZhc3RjYWxsIGFuZCB0aGlzY2FsbAorCWNtcGwgJDMsIDE2KCVlYnApICAjIEZGSV9USElTQ0FMTAorCWp6IC5kb190aGlzY2FsbAorCWNtcGwgJDQsIDE2KCVlYnApICMgRkZJX0ZBU1RDQUxMCisJam56IC5kb19mbmNhbGwKKwltb3ZsICglZXNwKSwgJWVjeAorCW1vdmwgNCglZXNwKSwgJWVkeAorCWFkZGwgJDgsICVlc3AKKwlqbXAgLmRvX2ZuY2FsbAorLmRvX3RoaXNjYWxsOgorCW1vdmwgKCVlc3ApLCAlZWN4CisJYWRkbCAkNCwgJWVzcAorCisuZG9fZm5jYWxsOgorCSAKICAgICAgICAgIyBGSVhNRTogQWxpZ24gdGhlIHN0YWNrIHRvIGEgMTI4LWJpdCBib3VuZGFyeSB0byBhdm9pZAogICAgICAgICAjIHBvdGVudGlhbCBwZXJmb3JtYW5jZSBoaXRzLgogCi0gICAgICAgIGNhbGwgICoyOCglZWJwKQorICAgICAgICBjYWxsICAqMzIoJWVicCkKICAKICAgICAgICAgIyBzdGRjYWxsIGZ1bmN0aW9ucyBwb3AgYXJndW1lbnRzIG9mZiB0aGUgc3RhY2sgdGhlbXNlbHZlcwogCiAgICAgICAgICMgTG9hZCAlZWN4IHdpdGggdGhlIHJldHVybiB0eXBlIGNvZGUKLSAgICAgICAgbW92bCAgMjAoJWVicCksJWVjeAorICAgICAgICBtb3ZsICAyNCglZWJwKSwlZWN4CiAgCiAgICAgICAgICMgSWYgdGhlIHJldHVybiB2YWx1ZSBwb2ludGVyIGlzIE5VTEwsIGFzc3VtZSBubyByZXR1cm4gdmFsdWUuCi0gICAgICAgIGNtcGwgICQwLDI0KCVlYnApCisgICAgICAgIGNtcGwgICQwLDI4KCVlYnApCiAgICAgICAgIGpuZSAgIDBmCiAgCiAgICAgICAgICMgRXZlbiBpZiB0aGVyZSBpcyBubyBzcGFjZSBmb3IgdGhlIHJldHVybiB2YWx1ZSwgd2UgYXJlCkBAIC00NjAsNiArNTYwLDcgQEAKIAkubG9uZwkuTHJldHN0cnVjdDFiCQkvKiBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfMUIgKi8KIAkubG9uZwkuTHJldHN0cnVjdDJiCQkvKiBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfMkIgKi8KIAkubG9uZwkuTHJldHN0cnVjdDRiCQkvKiBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfNEIgKi8KKwkubG9uZwkuTHJldHN0cnVjdAkJLyogRkZJX1RZUEVfTVNfU1RSVUNUICovCiAxOgogCWFkZAklZWN4LCAlZWN4CiAJYWRkCSVlY3gsICVlY3gKQEAgLTQ4Niw1MCArNTg3LDUwIEBACiAKIC5McmV0aW50OgogICAgICAgICAjIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKLSAgICAgICAgbW92bCAgMjQoJWVicCksJWVjeAorICAgICAgICBtb3ZsICAyOCglZWJwKSwlZWN4CiAgICAgICAgIG1vdmwgICVlYXgsMCglZWN4KQogICAgICAgICBqbXAgICAuTGVwaWxvZ3VlCiAgCiAuTHJldGZsb2F0OgogICAgICAgICAgIyBMb2FkICVlY3ggd2l0aCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgcmV0dXJuIHZhbHVlCi0gICAgICAgIG1vdmwgIDI0KCVlYnApLCVlY3gKKyAgICAgICAgbW92bCAgMjgoJWVicCksJWVjeAogICAgICAgICBmc3RwcyAoJWVjeCkKICAgICAgICAgam1wICAgLkxlcGlsb2d1ZQogIAogLkxyZXRkb3VibGU6CiAgICAgICAgICMgTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZQotICAgICAgICBtb3ZsICAyNCglZWJwKSwlZWN4CisgICAgICAgIG1vdmwgIDI4KCVlYnApLCVlY3gKICAgICAgICAgZnN0cGwgKCVlY3gpCiAgICAgICAgIGptcCAgIC5MZXBpbG9ndWUKICAKIC5McmV0bG9uZ2RvdWJsZToKICAgICAgICAgIyBMb2FkICVlY3ggd2l0aCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgcmV0dXJuIHZhbHVlCi0gICAgICAgIG1vdmwgIDI0KCVlYnApLCVlY3gKKyAgICAgICAgbW92bCAgMjgoJWVicCksJWVjeAogICAgICAgICBmc3RwdCAoJWVjeCkKICAgICAgICAgam1wICAgLkxlcGlsb2d1ZQogIAogLkxyZXRpbnQ2NDoKICAgICAgICAgIyBMb2FkICVlY3ggd2l0aCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgcmV0dXJuIHZhbHVlCi0gICAgICAgIG1vdmwgIDI0KCVlYnApLCVlY3gKKyAgICAgICAgbW92bCAgMjgoJWVicCksJWVjeAogICAgICAgICBtb3ZsICAlZWF4LDAoJWVjeCkKICAgICAgICAgbW92bCAgJWVkeCw0KCVlY3gpCiAJam1wICAgLkxlcGlsb2d1ZQogCiAuTHJldHN0cnVjdDFiOgogICAgICAgICAjIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKLSAgICAgICAgbW92bCAgMjQoJWVicCksJWVjeAorICAgICAgICBtb3ZsICAyOCglZWJwKSwlZWN4CiAgICAgICAgIG1vdmIgICVhbCwwKCVlY3gpCiAgICAgICAgIGptcCAgIC5MZXBpbG9ndWUKICAKIC5McmV0c3RydWN0MmI6CiAgICAgICAgICMgTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZQotICAgICAgICBtb3ZsICAyNCglZWJwKSwlZWN4CisgICAgICAgIG1vdmwgIDI4KCVlYnApLCVlY3gKICAgICAgICAgbW92dyAgJWF4LDAoJWVjeCkKICAgICAgICAgam1wICAgLkxlcGlsb2d1ZQogCiAuTHJldHN0cnVjdDRiOgogICAgICAgICAjIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKLSAgICAgICAgbW92bCAgMjQoJWVicCksJWVjeAorICAgICAgICBtb3ZsICAyOCglZWJwKSwlZWN4CiAgICAgICAgIG1vdmwgICVlYXgsMCglZWN4KQogICAgICAgICBqbXAgICAuTGVwaWxvZ3VlCiAKQEAgLTU0MiwxMiArNjQzLDI3IEBACiAgICAgICAgIHBvcGwgJWVicAogICAgICAgICByZXQKIC5mZmlfY2FsbF93aW4zMl9lbmQ6CisgICAgICAgIC5iYWxpZ24gMTYKKwkuZ2xvYmwJX2ZmaV9jbG9zdXJlX1RISVNDQUxMCisjaWZuZGVmIF9fT1MyX18KKwkuZGVmCV9mZmlfY2xvc3VyZV9USElTQ0FMTDsJLnNjbAkyOwkudHlwZQkzMjsJLmVuZGVmCisjZW5kaWYKK19mZmlfY2xvc3VyZV9USElTQ0FMTDoKKwlwdXNobAklZWJwCisJbW92bAklZXNwLCAlZWJwCisJc3VibAkkNDAsICVlc3AKKwlsZWFsCS0yNCglZWJwKSwgJWVkeAorCW1vdmwJJWVkeCwgLTEyKCVlYnApCS8qIHJlc3AgKi8KKwlsZWFsCTEyKCVlYnApLCAlZWR4ICAvKiBhY2NvdW50IGZvciBzdHViIHJldHVybiBhZGRyZXNzIG9uIHN0YWNrICovCisJam1wCS5zdHViCiAuTEZFMToKIAogICAgICAgICAjIFRoaXMgYXNzdW1lcyB3ZSBhcmUgdXNpbmcgZ2FzLgogICAgICAgICAuYmFsaWduIDE2CiAJLmdsb2JsCV9mZmlfY2xvc3VyZV9TWVNWCisjaWZuZGVmIF9fT1MyX18KIAkuZGVmCV9mZmlfY2xvc3VyZV9TWVNWOwkuc2NsCTI7CS50eXBlCTMyOwkuZW5kZWYKKyNlbmRpZgogX2ZmaV9jbG9zdXJlX1NZU1Y6CiAuTEZCMzoKIAlwdXNobAklZWJwCkBAIC01NTgsNiArNjc0LDcgQEAKIAlsZWFsCS0yNCglZWJwKSwgJWVkeAogCW1vdmwJJWVkeCwgLTEyKCVlYnApCS8qIHJlc3AgKi8KIAlsZWFsCTgoJWVicCksICVlZHgKKy5zdHViOgogCW1vdmwJJWVkeCwgNCglZXNwKQkvKiBhcmdzID0gX19idWlsdGluX2R3YXJmX2NmYSAoKSAqLwogCWxlYWwJLTEyKCVlYnApLCAlZWR4CiAJbW92bAklZWR4LCAoJWVzcCkJLyogJnJlc3AgKi8KQEAgLTU4Niw2ICs3MDMsNyBAQAogCS5sb25nCS5MY2xzX3JldHN0cnVjdDEJLyogRkZJX1RZUEVfU01BTExfU1RSVUNUXzFCICovCiAJLmxvbmcJLkxjbHNfcmV0c3RydWN0MgkvKiBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfMkIgKi8KIAkubG9uZwkuTGNsc19yZXRzdHJ1Y3Q0CS8qIEZGSV9UWVBFX1NNQUxMX1NUUlVDVF80QiAqLworCS5sb25nCS5MY2xzX3JldG1zc3RydWN0CS8qIEZGSV9UWVBFX01TX1NUUlVDVCAqLwogCiAxOgogCWFkZAklZWF4LCAlZWF4CkBAIC02NTAsNiArNzY4LDEyIEBACiAJcG9wbAklZWJwCiAJcmV0CSQweDQKIAorLkxjbHNfcmV0bXNzdHJ1Y3Q6CisJIyBDYWxsZXIgZXhwZWN0cyB1cyB0byByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSByZWFsIHJldHVybiB2YWx1ZS4KKwltb3YJJWVjeCwgJWVheAorCSMgQ2FsbGVyIGRvZXNuJ3QgZXhwZWN0cyB1cyB0byBwb3Agc3RydWN0IHJldHVybiB2YWx1ZSBwb2ludGVyIGhpZGRlbiBhcmcuCisJam1wCS5MY2xzX2VwaWxvZ3VlCisKIC5MY2xzX25vcmV0dmFsOgogLkxjbHNfZXBpbG9ndWU6CiAJbW92bAklZWJwLCAlZXNwCkBAIC02NjQsMTEgKzc4OCwyNyBAQAogI2RlZmluZSBSQVdfQ0xPU1VSRV9GVU5fT0ZGU0VUIChSQVdfQ0xPU1VSRV9DSUZfT0ZGU0VUICsgNCkKICNkZWZpbmUgUkFXX0NMT1NVUkVfVVNFUl9EQVRBX09GRlNFVCAoUkFXX0NMT1NVUkVfRlVOX09GRlNFVCArIDQpCiAjZGVmaW5lIENJRl9GTEFHU19PRkZTRVQgMjAKLQorICAgICAgICAuYmFsaWduIDE2CisJLmdsb2JsCV9mZmlfY2xvc3VyZV9yYXdfVEhJU0NBTEwKKyNpZm5kZWYgX19PUzJfXworCS5kZWYJX2ZmaV9jbG9zdXJlX3Jhd19USElTQ0FMTDsJLnNjbAkyOwkudHlwZQkzMjsJLmVuZGVmCisjZW5kaWYKK19mZmlfY2xvc3VyZV9yYXdfVEhJU0NBTEw6CisJcHVzaGwJJWVicAorCW1vdmwJJWVzcCwgJWVicAorCXB1c2hsCSVlc2kKKwlzdWJsCSQzNiwgJWVzcAorCW1vdmwJUkFXX0NMT1NVUkVfQ0lGX09GRlNFVCglZWF4KSwgJWVzaQkgLyogY2xvc3VyZS0+Y2lmICovCisJbW92bAlSQVdfQ0xPU1VSRV9VU0VSX0RBVEFfT0ZGU0VUKCVlYXgpLCAlZWR4IC8qIGNsb3N1cmUtPnVzZXJfZGF0YSAqLworCW1vdmwJJWVkeCwgMTIoJWVzcCkJLyogdXNlcl9kYXRhICovCisJbGVhbAkxMiglZWJwKSwgJWVkeAkvKiBfX2J1aWx0aW5fZHdhcmZfY2ZhICgpICovCisJam1wCS5zdHVicmF3CiAgICAgICAgICMgVGhpcyBhc3N1bWVzIHdlIGFyZSB1c2luZyBnYXMuCiAgICAgICAgIC5iYWxpZ24gMTYKIAkuZ2xvYmwJX2ZmaV9jbG9zdXJlX3Jhd19TWVNWCisjaWZuZGVmIF9fT1MyX18KIAkuZGVmCV9mZmlfY2xvc3VyZV9yYXdfU1lTVjsJLnNjbAkyOwkudHlwZQkzMjsJLmVuZGVmCisjZW5kaWYKIF9mZmlfY2xvc3VyZV9yYXdfU1lTVjoKIC5MRkI0OgogCXB1c2hsCSVlYnAKQEAgLTY4Miw2ICs4MjIsNyBAQAogCW1vdmwJUkFXX0NMT1NVUkVfVVNFUl9EQVRBX09GRlNFVCglZWF4KSwgJWVkeCAvKiBjbG9zdXJlLT51c2VyX2RhdGEgKi8KIAltb3ZsCSVlZHgsIDEyKCVlc3ApCS8qIHVzZXJfZGF0YSAqLwogCWxlYWwJOCglZWJwKSwgJWVkeAkvKiBfX2J1aWx0aW5fZHdhcmZfY2ZhICgpICovCisuc3R1YnJhdzoKIAltb3ZsCSVlZHgsIDgoJWVzcCkJLyogcmF3X2FyZ3MgKi8KIAlsZWFsCS0yNCglZWJwKSwgJWVkeAogCW1vdmwJJWVkeCwgNCglZXNwKQkvKiAmcmVzICovCkBAIC03MTAsNiArODUxLDcgQEAKIAkubG9uZwkuTHJjbHNfcmV0c3RydWN0MQkvKiBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfMUIgKi8KIAkubG9uZwkuTHJjbHNfcmV0c3RydWN0MgkvKiBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfMkIgKi8KIAkubG9uZwkuTHJjbHNfcmV0c3RydWN0NAkvKiBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfNEIgKi8KKwkubG9uZwkuTHJjbHNfcmV0c3RydWN0CS8qIEZGSV9UWVBFX01TX1NUUlVDVCAqLwogMToKIAlhZGQJJWVheCwgJWVheAogCWFkZAklZWF4LCAlZWF4CkBAIC03ODQsNyArOTI2LDkgQEAKICAgICAgICAgIyBUaGlzIGFzc3VtZXMgd2UgYXJlIHVzaW5nIGdhcy4KIAkuYmFsaWduCTE2CiAJLmdsb2JsCV9mZmlfY2xvc3VyZV9TVERDQUxMCisjaWZuZGVmIF9fT1MyX18KIAkuZGVmCV9mZmlfY2xvc3VyZV9TVERDQUxMOwkuc2NsCTI7CS50eXBlCTMyOwkuZW5kZWYKKyNlbmRpZgogX2ZmaV9jbG9zdXJlX1NURENBTEw6CiAuTEZCNToKIAlwdXNobAklZWJwCkBAIC04OTAsNyArMTAzNCw5IEBACiAuZmZpX2Nsb3N1cmVfU1REQ0FMTF9lbmQ6CiAuTEZFNToKIAorI2lmbmRlZiBfX09TMl9fCiAJLnNlY3Rpb24JLmVoX2ZyYW1lLCJ3IgorI2VuZGlmCiAuTGZyYW1lMToKIC5MU0NJRTE6CiAJLmxvbmcJLkxFQ0lFMS0uTEFTQ0lFMSAgLyogTGVuZ3RoIG9mIENvbW1vbiBJbmZvcm1hdGlvbiBFbnRyeSAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMveDg2L3dpbjY0LlMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvd2luNjQuUwppbmRleCA2ZTkxODE4Li5mY2RiMjcwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvd2luNjQuUworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvd2luNjQuUwpAQCAtMjMyLDEwICsyMzIsMTggQEAKIGZmaV9jYWxsX3dpbjY0IEVORFAKIF9URVhUCUVORFMKIEVORAotI2Vsc2UgICAgICAgIAorCisjZWxzZQorCisjaWZkZWYgU1lNQk9MX1VOREVSU0NPUkUKKyNkZWZpbmUgU1lNQk9MX05BTUUobmFtZSkgXyMjbmFtZQorI2Vsc2UKKyNkZWZpbmUgU1lNQk9MX05BTUUobmFtZSkgbmFtZQorI2VuZGlmCisKIC50ZXh0CiAKLS5leHRlcm4gX2ZmaV9jbG9zdXJlX3dpbjY0X2lubmVyCisuZXh0ZXJuIFNZTUJPTF9OQU1FKGZmaV9jbG9zdXJlX3dpbjY0X2lubmVyKQogCiAjIGZmaV9jbG9zdXJlX3dpbjY0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlc2UgcmVnaXN0ZXJzIHNldDoKICMgICAgcmF4IHBvaW50cyB0byAnY2xvc3VyZScKQEAgLTI0Niw4ICsyNTQsOCBAQAogIyBjYWxsIGZmaV9jbG9zdXJlX3dpbjY0X2lubmVyIGZvciB0aGUgYWN0dWFsIHdvcmssIHRoZW4gcmV0dXJuIHRoZSByZXN1bHQuCiAjIAogCS5iYWxpZ24gMTYKLSAgICAgICAgLmdsb2JsIF9mZmlfY2xvc3VyZV93aW42NAkKLV9mZmlfY2xvc3VyZV93aW42NDogICAgIAorICAgICAgICAuZ2xvYmwgU1lNQk9MX05BTUUoZmZpX2Nsb3N1cmVfd2luNjQpCitTWU1CT0xfTkFNRShmZmlfY2xvc3VyZV93aW42NCk6CiAJIyBjb3B5IHJlZ2lzdGVyIGFyZ3VtZW50cyBvbnRvIHN0YWNrCiAJdGVzdAkkMSwlcjExCiAJam5lCS5MZmlyc3RfaXNfZmxvYXQJCkBAIC0yODcsNyArMjk1LDcgQEAKIAltb3YJJXJheCwgJXJjeAkjIGNvbnRleHQgaXMgZmlyc3QgcGFyYW1ldGVyCiAJbW92CSVyc3AsICVyZHgJIyBzdGFjayBpcyBzZWNvbmQgcGFyYW1ldGVyCiAJYWRkCSQ0OCwgJXJkeAkjIHBvaW50IHRvIHN0YXJ0IG9mIGFyZ3VtZW50cwotCW1vdgkkX2ZmaV9jbG9zdXJlX3dpbjY0X2lubmVyLCAlcmF4CisJbW92CSRTWU1CT0xfTkFNRShmZmlfY2xvc3VyZV93aW42NF9pbm5lciksICVyYXgKIAljYWxscQkqJXJheAkJIyBjYWxsIHRoZSByZWFsIGNsb3N1cmUgZnVuY3Rpb24KIAlhZGQJJDQwLCAlcnNwCiAJbW92cQklcmF4LCAleG1tMAkjIElmIHRoZSBjbG9zdXJlIHJldHVybmVkIGEgZmxvYXQsCkBAIC0yOTYsOCArMzA0LDggQEAKIC5mZmlfY2xvc3VyZV93aW42NF9lbmQ6CiAKIAkuYmFsaWduIDE2Ci0gICAgICAgIC5nbG9ibAlfZmZpX2NhbGxfd2luNjQKLV9mZmlfY2FsbF93aW42NDogICAgICAgIAorICAgICAgICAuZ2xvYmwJU1lNQk9MX05BTUUoZmZpX2NhbGxfd2luNjQpCitTWU1CT0xfTkFNRShmZmlfY2FsbF93aW42NCk6CiAgICAgICAgICMgY29weSByZWdpc3RlcnMgb250byBzdGFjawogCW1vdgklcjksMzIoJXJzcCkKIAltb3YJJXI4LDI0KCVyc3ApCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94dGVuc2EvZmZpLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94dGVuc2EvZmZpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ5NGRhZgotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3h0ZW5zYS9mZmkuYwpAQCAtMCwwICsxLDI5OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIGZmaS5jIC0gQ29weXJpZ2h0IChjKSAyMDEzIFRlbnNpbGljYSwgSW5jLgorCisgICBYVEVOU0EgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UKKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICAgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICAgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGZmaS5oPgorI2luY2x1ZGUgPGZmaV9jb21tb24uaD4KKworLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgb24gZW50cnkgdG8gZmZpX2NhbGwgLS0tLT4gICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2FsbGVyIHN0YWNrIGZyYW1lIGZvciByZWdpc3RlcnMgYTAtYTMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICBhZGRpdGlvbmFsIGFyZ3VtZW50cyAgICAgICAgICAgfAorICAgIGVudHJ5IG9mIHRoZSBmdW5jdGlvbiAtLS0+ICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIGNvcHkgb2YgZnVuY3Rpb24gYXJndW1lbnRzIGEyLWE3ICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgLSAgLSAgLSAgLSAgLSAgLSAgLSAgLSAgLSAgLSAgLSAgLSAgLSAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisKKyAgICBUaGUgYXJlYSBiZWxvdyB0aGUgZW50cnkgbGluZSBiZWNvbWVzIHRoZSBuZXcgc3RhY2sgZnJhbWUgZm9yIHRoZSBmdW5jdGlvbi4KKworKi8KKworCisjZGVmaW5lIEZGSV9UWVBFX1NUUlVDVF9SRUdTIEZGSV9UWVBFX0xBU1QKKworCitleHRlcm4gdm9pZCBmZmlfY2FsbF9TWVNWKHZvaWQgKnJ2YWx1ZSwgdW5zaWduZWQgcnNpemUsIHVuc2lnbmVkIGZsYWdzLAorCQkJICB2b2lkKCpmbikodm9pZCksIHVuc2lnbmVkIG5ieXRlcywgZXh0ZW5kZWRfY2lmKik7CitleHRlcm4gdm9pZCBmZmlfY2xvc3VyZV9TWVNWKHZvaWQpIEZGSV9ISURERU47CisKK2ZmaV9zdGF0dXMgZmZpX3ByZXBfY2lmX21hY2hkZXAoZmZpX2NpZiAqY2lmKQoreworICBzd2l0Y2goY2lmLT5ydHlwZS0+dHlwZSkgeworICAgIGNhc2UgRkZJX1RZUEVfU0lOVDg6CisgICAgY2FzZSBGRklfVFlQRV9VSU5UODoKKyAgICBjYXNlIEZGSV9UWVBFX1NJTlQxNjoKKyAgICBjYXNlIEZGSV9UWVBFX1VJTlQxNjoKKyAgICAgIGNpZi0+ZmxhZ3MgPSBjaWYtPnJ0eXBlLT50eXBlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGRklfVFlQRV9WT0lEOgorICAgIGNhc2UgRkZJX1RZUEVfRkxPQVQ6CisgICAgICBjaWYtPmZsYWdzID0gRkZJX1RZUEVfVUlOVDMyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGRklfVFlQRV9ET1VCTEU6CisgICAgY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisgICAgY2FzZSBGRklfVFlQRV9TSU5UNjQ6CisgICAgICBjaWYtPmZsYWdzID0gRkZJX1RZUEVfVUlOVDY0OyAvLyBjaWYtPnJ0eXBlLT50eXBlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisgICAgICBjaWYtPmZsYWdzID0gRkZJX1RZUEVfU1RSVUNUOyAvL19SRUdTOworICAgICAgLyogVXAgdG8gMTYgYnl0ZXMgYXJlIHJldHVybmVkIGluIHJlZ2lzdGVycyAqLworICAgICAgaWYgKGNpZi0+cnR5cGUtPnNpemUgPiA0ICogNCkgeworICAgICAgICAvKiByZXR1cm5lZCBzdHJ1Y3R1cmUgaXMgcmVmZXJlbmNlZCBieSBhIHJlZ2lzdGVyOyB1c2UgOCBieXRlcworICAgICAgICAgICAoaW5jbHVkaW5nIDQgYnl0ZXMgZm9yIHBvdGVudGlhbCBhZGRpdGlvbmFsIGFsaWdubWVudCkgKi8KKyAgICAgICAgY2lmLT5mbGFncyA9IEZGSV9UWVBFX1NUUlVDVDsJCisgICAgICAgIGNpZi0+Ynl0ZXMgKz0gODsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGNpZi0+ZmxhZ3MgPSBGRklfVFlQRV9VSU5UMzI7CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIFJvdW5kIHRoZSBzdGFjayB1cCB0byBhIGZ1bGwgNCByZWdpc3RlciBmcmFtZSwganVzdCBpbiBjYXNlCisgICAgICh3ZSB1c2UgdGhpcyBzaXplIGluIG1vdnNwKS4gVGhpcyB3YXksIGl0J3MgYWxzbyBhICBtdWx0aXBsZSBvZgorICAgICA4IGJ5dGVzIGZvciA2NC1iaXQgYXJndW1lbnRzLiAgKi8KKyAgY2lmLT5ieXRlcyA9IEFMSUdOKGNpZi0+Ynl0ZXMsIDE2KTsKKworICByZXR1cm4gRkZJX09LOworfQorCit2b2lkIGZmaV9wcmVwX2FyZ3MoZXh0ZW5kZWRfY2lmICplY2lmLCB1bnNpZ25lZCBjaGFyKiBzdGFjaykKK3sKKyAgdW5zaWduZWQgaW50IGk7CisgIHVuc2lnbmVkIGxvbmcgKmFkZHI7CisgIGZmaV90eXBlICoqcHRyOworCisgIHVuaW9uIHsKKyAgICB2b2lkICoqdjsKKyAgICBjaGFyICoqYzsKKyAgICBzaWduZWQgY2hhciAqKnNjOworICAgIHVuc2lnbmVkIGNoYXIgKip1YzsKKyAgICBzaWduZWQgc2hvcnQgKipzczsKKyAgICB1bnNpZ25lZCBzaG9ydCAqKnVzOworICAgIHVuc2lnbmVkIGludCAqKmk7CisgICAgbG9uZyBsb25nICoqbGw7CisgICAgZmxvYXQgKipmOworICAgIGRvdWJsZSAqKmQ7CisgIH0gcF9hcmd2OworCisgIC8qIFZlcmlmeSB0aGF0IGV2ZXJ5dGhpbmcgaXMgYWxpZ25lZCB1cCBwcm9wZXJseSAqLworICBGRklfQVNTRVJUICgoKHVuc2lnbmVkIGxvbmcpIHN0YWNrICYgMHg3KSA9PSAwKTsKKworICBwX2FyZ3YudiA9IGVjaWYtPmF2YWx1ZTsKKyAgYWRkciA9ICh1bnNpZ25lZCBsb25nKilzdGFjazsKKworICAvKiBzdHJ1Y3R1cmVzIHdpdGggYSBzaXplIGdyZWF0ZXIgdGhhbiAxNiBieXRlcyBhcmUgcGFzc2VkIGluIG1lbW9yeSAqLworICBpZiAoZWNpZi0+Y2lmLT5ydHlwZS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QgJiYgZWNpZi0+Y2lmLT5ydHlwZS0+c2l6ZSA+IDE2KQorICB7CisgICAgKmFkZHIrKyA9ICh1bnNpZ25lZCBsb25nKWVjaWYtPnJ2YWx1ZTsKKyAgfQorCisgIGZvciAoaSA9IGVjaWYtPmNpZi0+bmFyZ3MsIHB0ciA9IGVjaWYtPmNpZi0+YXJnX3R5cGVzOworICAgICAgIGkgPiAwOworICAgICAgIGktLSwgcHRyKyssIHBfYXJndi52KyspCisgIHsKKyAgICBzd2l0Y2ggKCgqcHRyKS0+dHlwZSkKKyAgICB7CisgICAgICBjYXNlIEZGSV9UWVBFX1NJTlQ4OgorICAgICAgICAqYWRkcisrID0gKipwX2FyZ3Yuc2M7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGRklfVFlQRV9VSU5UODoKKyAgICAgICAgKmFkZHIrKyA9ICoqcF9hcmd2LnVjOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRkZJX1RZUEVfU0lOVDE2OgorICAgICAgICAqYWRkcisrID0gKipwX2FyZ3Yuc3M7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGRklfVFlQRV9VSU5UMTY6CisgICAgICAgICphZGRyKysgPSAqKnBfYXJndi51czsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZGSV9UWVBFX0ZMT0FUOgorICAgICAgY2FzZSBGRklfVFlQRV9JTlQ6CisgICAgICBjYXNlIEZGSV9UWVBFX1VJTlQzMjoKKyAgICAgIGNhc2UgRkZJX1RZUEVfU0lOVDMyOgorICAgICAgY2FzZSBGRklfVFlQRV9QT0lOVEVSOgorICAgICAgICAqYWRkcisrID0gKipwX2FyZ3YuaTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZGSV9UWVBFX0RPVUJMRToKKyAgICAgIGNhc2UgRkZJX1RZUEVfVUlOVDY0OgorICAgICAgY2FzZSBGRklfVFlQRV9TSU5UNjQ6CisgICAgICAgIGlmICgoKHVuc2lnbmVkIGxvbmcpYWRkciAmIDQpICE9IDApCisgICAgICAgICAgYWRkcisrOworICAgICAgICAqKHVuc2lnbmVkIGxvbmcgbG9uZyopYWRkciA9ICoqcF9hcmd2LmxsOworCWFkZHIgKz0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykgLyBzaXplb2YgKGFkZHIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisgICAgICB7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgb2ZmczsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBzaXplOworCisgICAgICAgIGlmICgoKHVuc2lnbmVkIGxvbmcpYWRkciAmIDQpICE9IDAgJiYgKCpwdHIpLT5hbGlnbm1lbnQgPiA0KQorICAgICAgICAgIGFkZHIrKzsKKworICAgICAgICBvZmZzID0gKHVuc2lnbmVkIGxvbmcpIGFkZHIgLSAodW5zaWduZWQgbG9uZykgc3RhY2s7CisgICAgICAgIHNpemUgPSAoKnB0ciktPnNpemU7CisKKyAgICAgICAgLyogRW50aXJlIHN0cnVjdHVyZSBtdXN0IGZpdCB0aGUgYXJndW1lbnQgcmVnaXN0ZXJzIG9yIHJlZmVyZW5jZWQgKi8KKyAgICAgICAgaWYgKG9mZnMgPCBGRklfUkVHSVNURVJfTkFSR1MgKiA0CisgICAgICAgICAgICAmJiBvZmZzICsgc2l6ZSA+IEZGSV9SRUdJU1RFUl9OQVJHUyAqIDQpCisgICAgICAgICAgYWRkciA9ICh1bnNpZ25lZCBsb25nKikgKHN0YWNrICsgRkZJX1JFR0lTVEVSX05BUkdTICogNCk7CisKKyAgICAgICAgbWVtY3B5KChjaGFyKikgYWRkciwgKnBfYXJndi5jLCBzaXplKTsKKyAgICAgICAgYWRkciArPSAoc2l6ZSArIDMpIC8gNDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEZGSV9BU1NFUlQoMCk7CisgICAgfQorICB9Cit9CisKKwordm9pZCBmZmlfY2FsbChmZmlfY2lmKiBjaWYsIHZvaWQoKmZuKSh2b2lkKSwgdm9pZCAqcnZhbHVlLCB2b2lkICoqYXZhbHVlKQoreworICBleHRlbmRlZF9jaWYgZWNpZjsKKyAgdW5zaWduZWQgbG9uZyByc2l6ZSA9IGNpZi0+cnR5cGUtPnNpemU7CisgIGludCBmbGFncyA9IGNpZi0+ZmxhZ3M7CisgIHZvaWQgKmFsbG9jID0gTlVMTDsKKworICBlY2lmLmNpZiA9IGNpZjsKKyAgZWNpZi5hdmFsdWUgPSBhdmFsdWU7CisKKyAgLyogTm90ZSB0aGF0IGZvciBzdHJ1Y3R1cmVzIHRoYXQgYXJlIHJldHVybmVkIGluIHJlZ2lzdGVycyAoc2l6ZSA8PSAxNiBieXRlcykKKyAgICAgd2UgYWxsb2NhdGUgYSB0ZW1wb3JhcnkgYnVmZmVyIGFuZCB1c2UgbWVtY3B5IHRvIGNvcHkgaXQgdG8gdGhlIGZpbmFsIAorICAgICBkZXN0aW5hdGlvbi4gVGhlIHJlYXNvbiBpcyB0aGF0IHRoZSB0YXJnZXQgYWRkcmVzcyBtaWdodCBiZSBtaXNhbGlnbmVkIG9yCisgICAgIHRoZSBsZW5ndGggbm90IGEgbXVsdGlwbGUgb2YgNCBieXRlcy4gSGFuZGxpbmcgYWxsIHRob3NlIGNhc2VzIHdvdWxkIGJlCisgICAgIHZlcnkgY29tcGxleC4gICovCisKKyAgaWYgKGZsYWdzID09IEZGSV9UWVBFX1NUUlVDVCAmJiAocnNpemUgPD0gMTYgfHwgcnZhbHVlID09IE5VTEwpKQorICB7CisgICAgYWxsb2MgPSBhbGxvY2EoQUxJR04ocnNpemUsIDQpKTsKKyAgICBlY2lmLnJ2YWx1ZSA9IGFsbG9jOworICB9CisgIGVsc2UKKyAgeworICAgIGVjaWYucnZhbHVlID0gcnZhbHVlOworICB9CisKKyAgaWYgKGNpZi0+YWJpICE9IEZGSV9TWVNWKQorICAgIEZGSV9BU1NFUlQoMCk7CisKKyAgZmZpX2NhbGxfU1lTViAoZWNpZi5ydmFsdWUsIHJzaXplLCBjaWYtPmZsYWdzLCBmbiwgY2lmLT5ieXRlcywgJmVjaWYpOworCisgIGlmIChhbGxvYyAhPSBOVUxMICYmIHJ2YWx1ZSAhPSBOVUxMKQorICAgIG1lbWNweShydmFsdWUsIGFsbG9jLCByc2l6ZSk7Cit9CisKK2V4dGVybiB2b2lkIGZmaV90cmFtcG9saW5lKCk7CitleHRlcm4gdm9pZCBmZmlfY2FjaGVmbHVzaCh2b2lkKiBzdGFydCwgdm9pZCogZW5kKTsKKworZmZpX3N0YXR1cworZmZpX3ByZXBfY2xvc3VyZV9sb2MgKGZmaV9jbG9zdXJlKiBjbG9zdXJlLAorICAgICAgICAgICAgICAgICAgICAgIGZmaV9jaWYqIGNpZiwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZnVuKShmZmlfY2lmKiwgdm9pZCosIHZvaWQqKiwgdm9pZCopLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb2RlbG9jKQoreworICAvKiBjb3B5ZSB0cmFtcG9saW5lIHRvIHN0YWNrIGFuZCBwYXRjaCAnZmZpX2Nsb3N1cmVfU1lTVicgcG9pbnRlciAqLworICBtZW1jcHkoY2xvc3VyZS0+dHJhbXAsIGZmaV90cmFtcG9saW5lLCBGRklfVFJBTVBPTElORV9TSVpFKTsKKyAgKih1bnNpZ25lZCBpbnQqKSgmY2xvc3VyZS0+dHJhbXBbOF0pID0gKHVuc2lnbmVkIGludClmZmlfY2xvc3VyZV9TWVNWOworCisgIC8vIERvIHdlIGhhdmUgdGhpcyBmdW5jdGlvbj8KKyAgLy8gX19idWlsdGluX19fY2xlYXJfY2FjaGUoY2xvc2VyLT50cmFtcCwgY2xvc2VyLT50cmFtcCArIEZGSV9UUkFNUE9MSU5FX1NJWkUpCisgIGZmaV9jYWNoZWZsdXNoKGNsb3N1cmUtPnRyYW1wLCBjbG9zdXJlLT50cmFtcCArIEZGSV9UUkFNUE9MSU5FX1NJWkUpOworCisgIGNsb3N1cmUtPmNpZiA9IGNpZjsKKyAgY2xvc3VyZS0+ZnVuID0gZnVuOworICBjbG9zdXJlLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisgIHJldHVybiBGRklfT0s7IAorfQorCisKK2xvbmcgRkZJX0hJRERFTgorZmZpX2Nsb3N1cmVfU1lTVl9pbm5lcihmZmlfY2xvc3VyZSAqY2xvc3VyZSwgdm9pZCAqKnZhbHVlcywgdm9pZCAqcnZhbHVlKQoreworICBmZmlfY2lmICpjaWY7CisgIGZmaV90eXBlICoqYXJnX3R5cGVzOworICB2b2lkICoqYXZhbHVlOworICBpbnQgaSwgYXJlZzsKKworICBjaWYgPSBjbG9zdXJlLT5jaWY7CisgIGlmIChjaWYtPmFiaSAhPSBGRklfU1lTVikKKyAgICByZXR1cm4gRkZJX0JBRF9BQkk7CisKKyAgYXJlZyA9IDA7CisKKyAgaW50IHJ0eXBlID0gY2lmLT5ydHlwZS0+dHlwZTsKKyAgaWYgKHJ0eXBlID09IEZGSV9UWVBFX1NUUlVDVCAmJiBjaWYtPnJ0eXBlLT5zaXplID4gNCAqIDQpCisgIHsKKyAgICBydmFsdWUgPSAqdmFsdWVzOworICAgIGFyZWcrKzsKKyAgfQorCisgIGNpZiA9IGNsb3N1cmUtPmNpZjsgCisgIGFyZ190eXBlcyA9IGNpZi0+YXJnX3R5cGVzOworICBhdmFsdWUgPSBhbGxvY2EoY2lmLT5uYXJncyAqIHNpemVvZih2b2lkICopKTsKKworICBmb3IgKGkgPSAwOyBpIDwgY2lmLT5uYXJnczsgaSsrKQorICB7CisgICAgaWYgKGFyZ190eXBlc1tpXS0+YWxpZ25tZW50ID09IDggJiYgKGFyZWcgJiAxKSAhPSAwKQorICAgICAgYXJlZysrOworCisgICAgLy8gc2tpcCB0aGUgZW50cnkgMTYsYTEgZnJhbWV3b3JrLCBhZGQgMTYgYnl0ZXMgKDQgcmVnaXN0ZXJzKQorICAgIGlmIChhcmVnID09IEZGSV9SRUdJU1RFUl9OQVJHUykKKyAgICAgIGFyZWcgKz0gNDsKKworICAgIGlmIChhcmdfdHlwZXNbaV0tPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKQorICAgIHsKKyAgICAgIGludCBudW1yZWdzID0gKChhcmdfdHlwZXNbaV0tPnNpemUgKyAzKSAmIH4zKSAvIDQ7CisgICAgICBpZiAoYXJlZyA8IEZGSV9SRUdJU1RFUl9OQVJHUyAmJiBhcmVnICsgbnVtcmVncyA+IEZGSV9SRUdJU1RFUl9OQVJHUykKKyAgICAgICAgYXJlZyA9IEZGSV9SRUdJU1RFUl9OQVJHUyArIDQ7CisgICAgfQorCisgICAgYXZhbHVlW2ldID0gJnZhbHVlc1thcmVnXTsKKyAgICBhcmVnICs9IChhcmdfdHlwZXNbaV0tPnNpemUgKyAzKSAvIDQ7CisgIH0KKworICAoY2xvc3VyZS0+ZnVuKShjaWYsIHJ2YWx1ZSwgYXZhbHVlLCBjbG9zdXJlLT51c2VyX2RhdGEpOworCisgIHJldHVybiBydHlwZTsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3h0ZW5zYS9mZml0YXJnZXQuaCBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3h0ZW5zYS9mZml0YXJnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmE3MjhiCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMveHRlbnNhL2ZmaXRhcmdldC5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi1DLSotCisgICBmZml0YXJnZXQuaCAtIENvcHlyaWdodCAoYykgMjAxMyBUZW5zaWxpY2EsIEluYy4KKyAgIFRhcmdldCBjb25maWd1cmF0aW9uIG1hY3JvcyBmb3IgWFRFTlNBLgorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIExJQkZGSV9UQVJHRVRfSAorI2RlZmluZSBMSUJGRklfVEFSR0VUX0gKKworI2lmbmRlZiBMSUJGRklfSAorI2Vycm9yICJQbGVhc2UgZG8gbm90IGluY2x1ZGUgZmZpdGFyZ2V0LmggZGlyZWN0bHkgaW50byB5b3VyIHNvdXJjZS4gIFVzZSBmZmkuaCBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIExJQkZGSV9BU00KK3R5cGVkZWYgdW5zaWduZWQgbG9uZwlmZmlfYXJnOwordHlwZWRlZiBzaWduZWQgbG9uZwlmZmlfc2FyZzsKKwordHlwZWRlZiBlbnVtIGZmaV9hYmkgeworICBGRklfRklSU1RfQUJJID0gMCwKKyAgRkZJX1NZU1YsCisgIEZGSV9MQVNUX0FCSSwKKyAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX1NZU1YKK30gZmZpX2FiaTsKKyNlbmRpZgorCisjZGVmaW5lIEZGSV9SRUdJU1RFUl9OQVJHUwk2CisKKy8qIC0tLS0gRGVmaW5pdGlvbnMgZm9yIGNsb3N1cmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgRkZJX0NMT1NVUkVTIDEKKyNkZWZpbmUgRkZJX05BVElWRV9SQVdfQVBJIDAKKyNkZWZpbmUgRkZJX1RSQU1QT0xJTkVfU0laRSAyNAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3h0ZW5zYS9zeXN2LlMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94dGVuc2Evc3lzdi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZTZhMDkKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94dGVuc2Evc3lzdi5TCkBAIC0wLDAgKzEsMjUzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgc3lzdi5TIC0gQ29weXJpZ2h0IChjKSAyMDEzIFRlbnNpbGljYSwgSW5jLgorICAgCisgICBYVEVOU0EgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UgCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTElCRkZJX0FTTQorI2luY2x1ZGUgPGZmaWNvbmZpZy5oPgorI2luY2x1ZGUgPGZmaS5oPgorCisjZGVmaW5lIEVOVFJZKG5hbWUpIC50ZXh0OyAuZ2xvYmwgbmFtZTsgLnR5cGUgIG5hbWUsQGZ1bmN0aW9uOyAuYWxpZ24gNDsgbmFtZToKKyNkZWZpbmUgRU5EKG5hbWUpIC5zaXplIG5hbWUgLCAuIC0gbmFtZQorCisvKiBBc3NlcnQgdGhhdCB0aGUgdGFibGUgYmVsb3cgaXMgaW4gc3luYyB3aXRoIGZmaS5oLiAgKi8KKworI2lmCSAgIEZGSV9UWVBFX1VJTlQ4ICE9IDUgICAgICAgICAgXAorICAgICAgICB8fCBGRklfVFlQRV9TSU5UOCAhPSA2ICAgICAgICAgIFwKKyAgICAgICAgfHwgRkZJX1RZUEVfVUlOVDE2ICE9IDcgICAgICAgICBcCisgICAgICAgIHx8IEZGSV9UWVBFX1NJTlQxNiAhPSA4ICAgICAgICAgXAorICAgICAgICB8fCBGRklfVFlQRV9VSU5UMzIgIT0gOSAgICAgICAgIFwKKyAgICAgICAgfHwgRkZJX1RZUEVfU0lOVDMyICE9IDEwICAgICAgICBcCisgICAgICAgIHx8IEZGSV9UWVBFX1VJTlQ2NCAhPSAxMQorI2Vycm9yICJ4dGVuc2Evc3lzdi5TIG91dCBvZiBzeW5jIHdpdGggZmZpLmgiCisjZW5kaWYKKworCisvKiBmZmlfY2FsbF9TWVNWIChydmFsdWUsIHJieXRlcywgZmxhZ3MsICgqZm5hZGRyKSgpLCBieXRlcywgZWNpZikKKyAgICAgIHZvaWQgKnJ2YWx1ZTsgICAgICAgICAgICBhMgorICAgICAgdW5zaWduZWQgbG9uZyByYnl0ZXM7ICAgIGEzCisgICAgICB1bnNpZ25lZCBmbGFnczsgICAgICAgICAgYTQKKyAgICAgIHZvaWQgKCpmbmFkZHIpKCk7ICAgICAgICBhNQorICAgICAgdW5zaWduZWQgbG9uZyBieXRlczsgICAgIGE2CisgICAgICBleHRlbmRlZF9jaWYqIGVjaWYpICAgICAgYTcKKyovCisKK0VOVFJZKGZmaV9jYWxsX1NZU1YpCisKKwllbnRyeQlhMSwgMzIgICAgICAgICAgICAgICMgMzIgYnl0ZSBmcmFtZSBmb3IgdXNpbmcgY2FsbDggYmVsb3cKKworCW1vdglhMTAsIGE3ICAgICAgICAgICAgICMgYTEwKC0+YXJnMCk6IGVjaWYKKwlzdWIJYTExLCBhMSwgYTYgICAgICAgICAjIGExMSgtPmFyZzEpOiBzdGFjayBwb2ludGVyCisJbW92CWE3LCBhMSAgICAgICAgICAgICAgIyBmcAorCW1vdnNwCWExLCBhMTEgICAgICAgICAgICAgIyBzZXQgbmV3IHNwID0gb2xkX3NwIC0gYnl0ZXMKKworCW1vdmkJYTgsIGZmaV9wcmVwX2FyZ3MKKwljYWxseDgJYTggICAgICAgICAgICAgICAgICAjIGZmaV9wcmVwX2FyZ3MoZWNpZiwgc3RhY2spCisKKwkjIHByZXBhcmUgdG8gbW92ZSBzdGFjayBwb2ludGVyIGJhY2sgdXAgdG8gNiBhcmd1bWVudHMKKwkjIG5vdGUgdGhhdCAnYnl0ZXMnIGlzIGFscmVhZHkgYWxpZ25lZAorCisJbW92aQlhMTAsIDYqNCAKKwlzdWIJYTExLCBhNiwgYTEwCisJbW92Z2V6CWE2LCBhMTAsIGExMQorCWFkZAlhNiwgYTEsIGE2CisKKwkKKwkjIHdlIGNhbiBwYXNzIHVwIHRvIDYgYXJndW1lbnRzIGluIHJlZ2lzdGVycworCSMgZm9yIHNpbXBsaWNpdHksIGp1c3QgbG9hZCA2IGFyZ3VtZW50cworCSMgKHRoZSBzdGFjayBzaXplIGlzIGF0IGxlYXN0IDMyIGJ5dGVzLCBzbyBubyByaXNrIHRvIGNyb3NzIGJvdW5kYXJpZXMpCisKKwlsMzJpCWExMCwgYTEsIDAKKwlsMzJpCWExMSwgYTEsIDQKKwlsMzJpCWExMiwgYTEsIDgKKwlsMzJpCWExMywgYTEsIDEyCisJbDMyaQlhMTQsIGExLCAxNgorCWwzMmkJYTE1LCBhMSwgMjAKKworCSMgbW92ZSBzdGFjayBwb2ludGVyCisKKwltb3ZzcAlhMSwgYTYKKworCWNhbGx4OAlhNSAgICAgICAgICAgICAgICAgICMgKCpmbikoYXJncy4uLikKKworCSMgSGFuZGxlIHJldHVybiB2YWx1ZShzKQorCisJYmVxeglhMiwgLkxleGl0CisKKwltb3ZpCWE1LCBGRklfVFlQRV9TVFJVQ1QKKwlibmUJYTQsIGE1LCAuTHN0b3JlCisJbW92aQlhNSwgMTYKKwlibHQJYTUsIGEzLCAuTGV4aXQKKworCXMzMmkJYTEwLCBhMiwgMAorCWJsdGkJYTMsIDUsIC5MZXhpdAorCWFkZGkJYTMsIGEzLCAtMQorCXMzMmkJYTExLCBhMiwgNAorCWJsdGkJYTMsIDgsIC5MZXhpdAorCXMzMmkJYTEyLCBhMiwgOAorCWJsdGkJYTMsIDEyLCAuTGV4aXQKKwlzMzJpCWExMywgYTIsIDEyCisKKy5MZXhpdDoJcmV0dworCisuTHN0b3JlOgorCWFkZGkJYTQsIGE0LCAtRkZJX1RZUEVfVUlOVDgKKwliZ2VpCWE0LCA3LCAuTGV4aXQJIyBzaG91bGQgbmV2ZXIgaGFwcGVuCisJbW92aQlhNiwgc3RvcmVfY2FsbHMKKwlhZGQJYTQsIGE0LCBhNAorCWFkZHg0CWE2LCBhNCwgYTYJIyBzdG9yZV90YWJsZSArIGlkeCAqIDgKKwlqeAlhNgorCisJLmFsaWduCTgKK3N0b3JlX2NhbGxzOgorCSMgVUlOVDgKKwlzOGkJYTEwLCBhMiwgMAorCXJldHcKKworCSMgU0lOVDgKKwkuYWxpZ24JOAorCXM4aQlhMTAsIGEyLCAwCisJcmV0dworCisJIyBVSU5UMTYKKwkuYWxpZ24JOAorCXMxNmkJYTEwLCBhMiwgMAorCXJldHcKKworCSMgU0lOVDE2CisJLmFsaWduCTgKKwlzMTZpCWExMCwgYTIsIDAKKwlyZXR3CisKKwkjIFVJTlQzMgorCS5hbGlnbgk4CisJczMyaQlhMTAsIGEyLCAwCisJcmV0dworCisJIyBTSU5UMzIKKwkuYWxpZ24JOAorCXMzMmkJYTEwLCBhMiwgMAorCXJldHcKKworCSMgVUlOVDY0CisJLmFsaWduCTgKKwlzMzJpCWExMCwgYTIsIDAKKwlzMzJpCWExMSwgYTIsIDQKKwlyZXR3CisKK0VORChmZmlfY2FsbF9TWVNWKQorCisKKy8qCisgKiB2b2lkIGZmaV9jYWNoZWZsdXNoICh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKKyAqLworCisjZGVmaW5lIEVYVFJBX0FSR1NfU0laRQkyNAorCitFTlRSWShmZmlfY2FjaGVmbHVzaCkKKworCWVudHJ5CWExLCAxNgorCisxOglkaHdiaQlhMiwgMAorCWloaQlhMiwgMAorCWFkZGkJYTIsIGEyLCA0CisJYmx0CWEyLCBhMywgMWIKKworCXJldHcKKworRU5EKGZmaV9jYWNoZWZsdXNoKQorCisvKiBmZmlfdHJhbXBvbGluZSBpcyBjb3BpZWQgdG8gdGhlIHN0YWNrICovCisKK0VOVFJZKGZmaV90cmFtcG9saW5lKQorCisJZW50cnkJYTEsIDE2ICsgKEZGSV9SRUdJU1RFUl9OQVJHUyAqIDQpICsgKDQgKiA0KSAgICMgWyAwXQorCWoJMmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgWyAzXQorCS5hbGlnbgk0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbIDZdCisxOgkubG9uZwkwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbIDhdCisyOglsMzJyCWExNSwgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFsxMl0KKwlfbW92IAlhMTQsIGEwICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbMTVdCisJY2FsbHgwCWExNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFsxOF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbMjFdCitFTkQoZmZpX3RyYW1wb2xpbmUpCisKKy8qCisgKiBmZmlfY2xvc3VyZSgpCisgKgorICogYTA6ICBjbG9zdXJlICsgMjEKKyAqIGExNDogcmV0dXJuIGFkZHJlc3MgKGEwKQorICovCisKK0VOVFJZKGZmaV9jbG9zdXJlX1NZU1YpCisKKwkvKiBpbnRlbnRpb25hbGx5IG9taXR0aW5nIGVudHJ5IGhlcmUgKi8KKworCSMgcmVzdG9yZSByZXR1cm4gYWRkcmVzcyAoYTApIGFuZCBtb3ZlIHBvaW50ZXIgdG8gY2xvc3VyZSB0byBhMTAKKwlhZGRpCWExMCwgYTAsIC0yMQorCW1vdglhMCwgYTE0CisKKwkjIGFsbG93IHVwIHRvIDQgYXJndW1lbnRzIGFzIHJldHVybiB2YWx1ZXMKKwlhZGRpCWExMSwgYTEsIDQgKiA0CisKKwkjIHNhdmUgdXAgdG8gNiBhcmd1bWVudHMgdG8gc3RhY2sgKGFsbG9jYXRlZCBieSBlbnRyeSBiZWxvdykKKwlzMzJpCWEyLCBhMTEsICAwCisJczMyaQlhMywgYTExLCAgNAorCXMzMmkJYTQsIGExMSwgIDgKKwlzMzJpCWE1LCBhMTEsIDEyCisJczMyaQlhNiwgYTExLCAxNgorCXMzMmkJYTcsIGExMSwgMjAKKworCW1vdmkJYTgsIGZmaV9jbG9zdXJlX1NZU1ZfaW5uZXIKKwltb3YJYTEyLCBhMQorCWNhbGx4OAlhOAkJCSMgLi5faW5uZXIoKmNsb3N1cmUsICoqYXZhbHVlLCAqcnZhbHVlKQorCisJIyBsb2FkIHVwIHRvIGZvdXIgcmV0dXJuIGFyZ3VtZW50cworCWwzMmkJYTIsIGExLCAgMAorCWwzMmkJYTMsIGExLCAgNAorCWwzMmkJYTQsIGExLCAgOAorCWwzMmkJYTUsIGExLCAxMgorCisJIyAoc2lnbi0pZXh0ZW5kIHJldHVybiB2YWx1ZQorCW1vdmkJYTExLCBGRklfVFlQRV9VSU5UOAorCWJuZQlhMTAsIGExMSwgMWYKKwlleHR1aQlhMiwgYTIsIDAsIDgKKwlyZXR3CisKKzE6CW1vdmkJYTExLCBGRklfVFlQRV9TSU5UOAorCWJuZQlhMTAsIGExMSwgMWYKKwlzZXh0CWEyLCBhMiwgNworCXJldHcKKworMToJbW92aQlhMTEsIEZGSV9UWVBFX1VJTlQxNgorCWJuZQlhMTAsIGExMSwgMWYKKwlleHR1aQlhMiwgYTIsIDAsIDE2CisJcmV0dworCisxOgltb3ZpCWExMSwgRkZJX1RZUEVfU0lOVDE2CisJYm5lCWExMCwgYTExLCAxZgorCXNleHQJYTIsIGEyLCAxNQorCisxOglyZXR3CisKK0VORChmZmlfY2xvc3VyZV9TWVNWKQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zdGFtcC1oLmluIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zdGFtcC1oLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ODhmNzAKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3N0YW1wLWguaW4KQEAgLTAsMCArMSBAQAordGltZXN0YW1wCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9NYWtlZmlsZS5hbSBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL01ha2VmaWxlLmFtCmluZGV4IGVhZTNkNzQuLmVkYzZlNjEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL01ha2VmaWxlLmFtCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL01ha2VmaWxlLmFtCkBAIC0xMyw2OCArMTMsODIgQEAKIAogQU1fUlVOVEVTVEZMQUdTID0KIAorRVhUUkFfREVKQUdOVV9TSVRFX0NPTkZJRz0uLi9sb2NhbC5leHAKKwogQ0xFQU5GSUxFUyA9ICouZXhlIGNvcmUqICoubG9nICouc3VtCiAKLUVYVFJBX0RJU1QgPSBsaWJmZmkuc3BlY2lhbC9zcGVjaWFsLmV4cAlcCi1saWJmZmkuc3BlY2lhbC91bndpbmR0ZXN0X2ZmaV9jYWxsLmNjIGxpYmZmaS5zcGVjaWFsL3Vud2luZHRlc3QuY2MgXAotbGliZmZpLnNwZWNpYWwvZmZpdGVzdGN4eC5oIGNvbmZpZy9kZWZhdWx0LmV4cCBsaWIvdGFyZ2V0LWxpYnBhdGguZXhwIFwKLWxpYi9saWJmZmktZGcuZXhwIGxpYi93cmFwcGVyLmV4cCBsaWJmZmkuY2FsbC9mbG9hdC5jIFwKLWxpYmZmaS5jYWxsL2Nsc19tdWx0aV9zY2hhci5jIGxpYmZmaS5jYWxsL2Zsb2F0My5jIFwKLWxpYmZmaS5jYWxsL2Nsc18zXzFieXRlLmMgbGliZmZpLmNhbGwvc3RyZXRfbGFyZ2UyLmMgXAotbGliZmZpLmNhbGwvY2xzXzVfMV9ieXRlLmMgbGliZmZpLmNhbGwvc3RyZXRfbWVkaXVtLmMgXAotbGliZmZpLmNhbGwvcHJvbW90aW9uLmMgbGliZmZpLmNhbGwvY2xzX2RibHNfc3RydWN0LmMgXAotbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdC5jIGxpYmZmaS5jYWxsL2Nsb3N1cmVfZm4xLmMgXAotbGliZmZpLmNhbGwvY2xzXzRfMWJ5dGUuYyBsaWJmZmkuY2FsbC9jbHNfZmxvYXQuYyBcCi1saWJmZmkuY2FsbC9jbHNfMmJ5dGUuYyBsaWJmZmkuY2FsbC9jbG9zdXJlX2ZuNC5jIFwKLWxpYmZmaS5jYWxsL3JldHVybl9mbDIuYyBsaWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0Ny5jIFwKLWxpYmZmaS5jYWxsL2Nsc191aW50LmMgbGliZmZpLmNhbGwvY2xzX2FsaWduX3NpbnQ2NC5jIFwKLWxpYmZmaS5jYWxsL2Zsb2F0MS5jIGxpYmZmaS5jYWxsL2Nsc18xOWJ5dGUuYyBcCi1saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0MS5jIGxpYmZmaS5jYWxsL2Nsc180Ynl0ZS5jIFwKLWxpYmZmaS5jYWxsL3JldHVybl9mbDEuYyBsaWJmZmkuY2FsbC9jbHNfYWxpZ25fcG9pbnRlci5jIFwKLWxpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q0LmMgbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDMuYyBcCi1saWJmZmkuY2FsbC9zdHJ1Y3Q3LmMgbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDkuYyBcCi1saWJmZmkuY2FsbC9jbHNfc3Nob3J0LmMgbGliZmZpLmNhbGwvY2xzX3Vsb25nbG9uZy5jIFwKLWxpYmZmaS5jYWxsL2Nsc19wb2ludGVyX3N0YWNrLmMgbGliZmZpLmNhbGwvY2xzX211bHRpX3VjaGFyLmMgXAotbGliZmZpLmNhbGwvdGVzdGNsb3N1cmUuYyBsaWJmZmkuY2FsbC9jbHNfM2J5dGUxLmMgXAotbGliZmZpLmNhbGwvc3RydWN0Ni5jIGxpYmZmaS5jYWxsL3JldHVybl91Yy5jIGxpYmZmaS5jYWxsL3JldHVybl9sbDEuYyBcCi1saWJmZmkuY2FsbC9jbHNfdXNob3J0LmMgbGliZmZpLmNhbGwvc3RyZXRfbWVkaXVtMi5jIFwKLWxpYmZmaS5jYWxsL2Nsc19tdWx0aV91c2hvcnRjaGFyLmMgbGliZmZpLmNhbGwvcmV0dXJuX2RibDIuYyBcCi1saWJmZmkuY2FsbC9jbG9zdXJlX2xvY19mbjAuYyBsaWJmZmkuY2FsbC9yZXR1cm5fc2MuYyBcCi1saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0OC5jIGxpYmZmaS5jYWxsL2Nsc183XzFfYnl0ZS5jCVwKLWxpYmZmaS5jYWxsL3JldHVybl9sbC5jIGxpYmZmaS5jYWxsL2Nsc19wb2ludGVyLmMgXAotbGliZmZpLmNhbGwvZXJyX2JhZF9hYmkuYyBsaWJmZmkuY2FsbC9yZXR1cm5fZGJsMS5jIFwKLWxpYmZmaS5jYWxsL2NhbGwuZXhwIGxpYmZmaS5jYWxsL2ZmaXRlc3QuaCBsaWJmZmkuY2FsbC9zdHJsZW4uYwlcCi1saWJmZmkuY2FsbC9yZXR1cm5fc2wuYyBsaWJmZmkuY2FsbC9jbHNfMV8xYnl0ZS5jIFwKLWxpYmZmaS5jYWxsL3N0cnVjdDEuYyBsaWJmZmkuY2FsbC9jbHNfNjRieXRlLmMgbGliZmZpLmNhbGwvcmV0dXJuX3VsLmMgXAotbGliZmZpLmNhbGwvY2xzX2RvdWJsZS5jIGxpYmZmaS5jYWxsL21hbnlfd2luMzIuYyBcCi1saWJmZmkuY2FsbC9jbHNfMTZieXRlLmMgbGliZmZpLmNhbGwvY2xzX2FsaWduX2RvdWJsZS5jCVwKLWxpYmZmaS5jYWxsL2Nsc19hbGlnbl91aW50MTYuYyBsaWJmZmkuY2FsbC9jbHNfOWJ5dGUxLmMJXAotbGliZmZpLmNhbGwvY2xzX211bHRpX3NzaG9ydGNoYXIuYyBsaWJmZmkuY2FsbC9jbHNfbXVsdGlfdXNob3J0LmMgXAotbGliZmZpLmNhbGwvY2xvc3VyZV9zdGRjYWxsLmMgbGliZmZpLmNhbGwvcmV0dXJuX2ZsLmMgXAotbGliZmZpLmNhbGwvc3RybGVuX3dpbjMyLmMgbGliZmZpLmNhbGwvcmV0dXJuX2xkbC5jIFwKLWxpYmZmaS5jYWxsL2Nsc19hbGlnbl9mbG9hdC5jIGxpYmZmaS5jYWxsL3N0cnVjdDMuYyBcCi1saWJmZmkuY2FsbC9jbHNfdWNoYXIuYyBsaWJmZmkuY2FsbC9jbHNfc2ludC5jIGxpYmZmaS5jYWxsL2Zsb2F0Mi5jIFwKLWxpYmZmaS5jYWxsL2Nsc19hbGlnbl9sb25nZG91YmxlX3NwbGl0LmMgXAotbGliZmZpLmNhbGwvY2xzX2xvbmdkb3VibGVfdmEuYyBsaWJmZmkuY2FsbC9jbHNfbXVsdGlfc3Nob3J0LmMgXAotbGliZmZpLmNhbGwvc3RyZXRfbGFyZ2UuYyBsaWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDE2LmMgXAotbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDYuYyBsaWJmZmkuY2FsbC9jbHNfNWJ5dGUuYyBcCi1saWJmZmkuY2FsbC9yZXR1cm5fZGJsLmMgbGliZmZpLmNhbGwvY2xzXzIwYnl0ZS5jIFwKLWxpYmZmaS5jYWxsL2Nsc184Ynl0ZS5jIGxpYmZmaS5jYWxsL3B5b2JqYy10Yy5jCVwKLWxpYmZmaS5jYWxsL2Nsc18yNGJ5dGUuYyBsaWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZV9zcGxpdDIuYyBcCi1saWJmZmkuY2FsbC9jbHNfNl8xX2J5dGUuYyBsaWJmZmkuY2FsbC9jbHNfc2NoYXIuYyBcCi1saWJmZmkuY2FsbC9jbHNfMThieXRlLmMgbGliZmZpLmNhbGwvY2xvc3VyZV9mbjMuYyBcCi1saWJmZmkuY2FsbC9lcnJfYmFkX3R5cGVkZWYuYyBsaWJmZmkuY2FsbC9jbG9zdXJlX2ZuMi5jCVwKLWxpYmZmaS5jYWxsL3N0cnVjdDIuYyBsaWJmZmkuY2FsbC9jbHNfM2J5dGUyLmMgXAotbGliZmZpLmNhbGwvY2xzX2FsaWduX2xvbmdkb3VibGUuYyBsaWJmZmkuY2FsbC9jbHNfMjBieXRlMS5jIFwKLWxpYmZmaS5jYWxsL3JldHVybl9mbDMuYyBsaWJmZmkuY2FsbC9jbHNfYWxpZ25fdWludDMyLmMJXAotbGliZmZpLmNhbGwvcHJvYmxlbTEuYyBsaWJmZmkuY2FsbC9mbG9hdDQuYyBcCi1saWJmZmkuY2FsbC9jbHNfYWxpZ25fdWludDY0LmMgbGliZmZpLmNhbGwvc3RydWN0OS5jIFwKLWxpYmZmaS5jYWxsL2Nsb3N1cmVfZm41LmMgbGliZmZpLmNhbGwvY2xzX2FsaWduX3NpbnQzMi5jIFwKLWxpYmZmaS5jYWxsL2Nsb3N1cmVfZm4wLmMgbGliZmZpLmNhbGwvY2xvc3VyZV9mbjYuYyBcCi1saWJmZmkuY2FsbC9zdHJ1Y3Q0LmMgbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDIuYyBcCi1saWJmZmkuY2FsbC9jbHNfNmJ5dGUuYyBsaWJmZmkuY2FsbC9jbHNfN2J5dGUuYyBsaWJmZmkuY2FsbC9tYW55LmMgXAotbGliZmZpLmNhbGwvc3RydWN0OC5jIGxpYmZmaS5jYWxsL25lZ2ludC5jIGxpYmZmaS5jYWxsL3N0cnVjdDUuYyBcCi1saWJmZmkuY2FsbC9jbHNfMTJieXRlLmMgbGliZmZpLmNhbGwvY2xzX2RvdWJsZV92YS5jIFwKLWxpYmZmaS5jYWxsL2Nsc19sb25nZG91YmxlLmMgbGliZmZpLmNhbGwvY2xzXzlieXRlMi5jIFwKLWxpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QxMC5jIGxpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q1LmMgXAotbGliZmZpLmNhbGwvaHVnZV9zdHJ1Y3QuYworRVhUUkFfRElTVCA9IGNvbmZpZy9kZWZhdWx0LmV4cCBsaWJmZmkuY2FsbC9jbHNfMTlieXRlLmMJCVwKK2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9sb25nZG91YmxlX3NwbGl0LmMJCQkJXAorbGliZmZpLmNhbGwvY2xvc3VyZV9sb2NfZm4wLmMgbGliZmZpLmNhbGwvY2xzX3NjaGFyLmMJCQlcCitsaWJmZmkuY2FsbC9jbG9zdXJlX2ZuMS5jIGxpYmZmaS5jYWxsL21hbnkyX3dpbjMyLmMJCQlcCitsaWJmZmkuY2FsbC9yZXR1cm5fdWwuYyBsaWJmZmkuY2FsbC9jbHNfYWxpZ25fZG91YmxlLmMJCQlcCitsaWJmZmkuY2FsbC9yZXR1cm5fZmwyLmMgbGliZmZpLmNhbGwvY2xzXzFfMWJ5dGUuYwkJCVwKK2xpYmZmaS5jYWxsL2Nsc182NGJ5dGUuYyBsaWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0Ny5jCQkJXAorbGliZmZpLmNhbGwvY2xzX2FsaWduX3NpbnQzMi5jIGxpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QyLmMJCVwKK2xpYmZmaS5jYWxsL2ZmaXRlc3QuaCBsaWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0NC5jCQkJXAorbGliZmZpLmNhbGwvY2xzX211bHRpX3VzaG9ydC5jIGxpYmZmaS5jYWxsL3N0cnVjdDMuYwkJCVwKK2xpYmZmaS5jYWxsL2Nsc18zYnl0ZTEuYyBsaWJmZmkuY2FsbC9jbHNfMTZieXRlLmMJCQlcCitsaWJmZmkuY2FsbC9zdHJ1Y3Q4LmMgbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDguYwkJCVwKK2xpYmZmaS5jYWxsL2Nsc19tdWx0aV9zc2hvcnQuYyBsaWJmZmkuY2FsbC9jbHNfM2J5dGUyLmMJCQlcCitsaWJmZmkuY2FsbC9mYXN0dGhpczJfd2luMzIuYyBsaWJmZmkuY2FsbC9jbHNfcG9pbnRlci5jCQkJXAorbGliZmZpLmNhbGwvZXJyX2JhZF90eXBlZGVmLmMgbGliZmZpLmNhbGwvY2xzXzRfMWJ5dGUuYwkJCVwKK2xpYmZmaS5jYWxsL2Nsc185Ynl0ZTIuYyBsaWJmZmkuY2FsbC9jbHNfbXVsdGlfc2NoYXIuYwkJCVwKK2xpYmZmaS5jYWxsL3N0cmV0X21lZGl1bTIuYyBsaWJmZmkuY2FsbC9jbHNfNV8xX2J5dGUuYwkJCVwKK2xpYmZmaS5jYWxsL2NhbGwuZXhwIGxpYmZmaS5jYWxsL2Nsc19kb3VibGUuYwkJCQlcCitsaWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDE2LmMgbGliZmZpLmNhbGwvY2xzX3VpbnQuYwkJCVwKK2xpYmZmaS5jYWxsL3JldHVybl9sbDEuYyBsaWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0My5jCQkJXAorbGliZmZpLmNhbGwvY2xzXzIwYnl0ZTEuYyBsaWJmZmkuY2FsbC9jbG9zdXJlX2ZuNC5jCQkJXAorbGliZmZpLmNhbGwvY2xzX3VjaGFyLmMgbGliZmZpLmNhbGwvc3RydWN0Mi5jIGxpYmZmaS5jYWxsL2Nsc183Ynl0ZS5jCVwKK2xpYmZmaS5jYWxsL3N0cmxlbi5jIGxpYmZmaS5jYWxsL21hbnkuYyBsaWJmZmkuY2FsbC90ZXN0Y2xvc3VyZS5jCVwKK2xpYmZmaS5jYWxsL3JldHVybl9mbC5jIGxpYmZmaS5jYWxsL3N0cnVjdDUuYwkJCQlcCitsaWJmZmkuY2FsbC9jbHNfMTJieXRlLmMgbGliZmZpLmNhbGwvY2xzX211bHRpX3NzaG9ydGNoYXIuYwkJXAorbGliZmZpLmNhbGwvY2xzX2FsaWduX2xvbmdkb3VibGVfc3BsaXQyLmMgbGliZmZpLmNhbGwvcmV0dXJuX2RibDIuYwlcCitsaWJmZmkuY2FsbC9yZXR1cm5fZmwzLmMgbGliZmZpLmNhbGwvc3RyZXRfbWVkaXVtLmMJCQlcCitsaWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0Ni5jIGxpYmZmaS5jYWxsL2Nsb3N1cmVfZm4zLmMJCQlcCitsaWJmZmkuY2FsbC9mbG9hdDMuYyBsaWJmZmkuY2FsbC9tYW55Mi5jCQkJCVwKK2xpYmZmaS5jYWxsL2Nsb3N1cmVfc3RkY2FsbC5jIGxpYmZmaS5jYWxsL2Nsc19hbGlnbl91aW50MTYuYwkJXAorbGliZmZpLmNhbGwvY2xzXzlieXRlMS5jIGxpYmZmaS5jYWxsL2Nsb3N1cmVfZm42LmMJCQlcCitsaWJmZmkuY2FsbC9jbHNfZG91YmxlX3ZhLmMgbGliZmZpLmNhbGwvY2xzX2FsaWduX3BvaW50ZXIuYwkJXAorbGliZmZpLmNhbGwvY2xzX2FsaWduX2xvbmdkb3VibGUuYyBsaWJmZmkuY2FsbC9jbG9zdXJlX2ZuMi5jCQlcCitsaWJmZmkuY2FsbC9jbHNfc3Nob3J0LmMgbGliZmZpLmNhbGwvbWFueV93aW4zMi5jCQkJXAorbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdC5jIGxpYmZmaS5jYWxsL2Nsc18yMGJ5dGUuYwkJCVwKK2xpYmZmaS5jYWxsL2Nsc19sb25nZG91YmxlLmMgbGliZmZpLmNhbGwvY2xzX211bHRpX3VjaGFyLmMJCVwKK2xpYmZmaS5jYWxsL3JldHVybl91Yy5jIGxpYmZmaS5jYWxsL2Nsb3N1cmVfdGhpc2NhbGwuYwkJCVwKK2xpYmZmaS5jYWxsL2Nsc18xOGJ5dGUuYyBsaWJmZmkuY2FsbC9jbHNfOGJ5dGUuYwkJCVwKK2xpYmZmaS5jYWxsL3Byb21vdGlvbi5jIGxpYmZmaS5jYWxsL3N0cnVjdDFfd2luMzIuYwkJCVwKK2xpYmZmaS5jYWxsL3JldHVybl9kYmwuYyBsaWJmZmkuY2FsbC9jbHNfMjRieXRlLmMJCQlcCitsaWJmZmkuY2FsbC9zdHJ1Y3Q0LmMgbGliZmZpLmNhbGwvY2xzXzZieXRlLmMJCQkJXAorbGliZmZpLmNhbGwvY2xzX2FsaWduX3VpbnQzMi5jIGxpYmZmaS5jYWxsL2Zsb2F0LmMJCQlcCitsaWJmZmkuY2FsbC9mbG9hdDEuYyBsaWJmZmkuY2FsbC9mbG9hdF92YS5jIGxpYmZmaS5jYWxsL25lZ2ludC5jCVwKK2xpYmZmaS5jYWxsL3JldHVybl9kYmwxLmMgbGliZmZpLmNhbGwvY2xzXzNfMWJ5dGUuYwkJCVwKK2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9mbG9hdC5jIGxpYmZmaS5jYWxsL3JldHVybl9mbDEuYwkJCVwKK2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QxMC5jIGxpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q1LmMJCVwKK2xpYmZmaS5jYWxsL2Zhc3R0aGlzMV93aW4zMi5jIGxpYmZmaS5jYWxsL2Nsc19hbGlnbl9zaW50NjQuYwkJXAorbGliZmZpLmNhbGwvc3RyZXRfbGFyZ2UyLmMgbGliZmZpLmNhbGwvcmV0dXJuX3NsLmMJCQlcCitsaWJmZmkuY2FsbC9jbG9zdXJlX2ZuMC5jIGxpYmZmaS5jYWxsL2Nsc181Ynl0ZS5jCQkJXAorbGliZmZpLmNhbGwvY2xzXzJieXRlLmMgbGliZmZpLmNhbGwvZmxvYXQyLmMJCQkJXAorbGliZmZpLmNhbGwvY2xzX2RibHNfc3RydWN0LmMgbGliZmZpLmNhbGwvY2xzX3NpbnQuYwkJCVwKK2xpYmZmaS5jYWxsL3N0cmV0X2xhcmdlLmMgbGliZmZpLmNhbGwvY2xzX3Vsb25nbG9uZy5jCQkJXAorbGliZmZpLmNhbGwvY2xzX3VzaG9ydC5jIGxpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QxLmMJCQlcCitsaWJmZmkuY2FsbC9lcnJfYmFkX2FiaS5jIGxpYmZmaS5jYWxsL2Nsc19sb25nZG91YmxlX3ZhLmMJCVwKK2xpYmZmaS5jYWxsL2Nsc19mbG9hdC5jIGxpYmZmaS5jYWxsL2Nsc19wb2ludGVyX3N0YWNrLmMJCVwKK2xpYmZmaS5jYWxsL3B5b2JqYy10Yy5jIGxpYmZmaS5jYWxsL2Nsc19tdWx0aV91c2hvcnRjaGFyLmMJCVwKK2xpYmZmaS5jYWxsL3N0cnVjdDEuYyBsaWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0OS5jCQkJXAorbGliZmZpLmNhbGwvaHVnZV9zdHJ1Y3QuYyBsaWJmZmkuY2FsbC9wcm9ibGVtMS5jCQkJXAorbGliZmZpLmNhbGwvZmxvYXQ0LmMgbGliZmZpLmNhbGwvZmFzdHRoaXMzX3dpbjMyLmMJCQlcCitsaWJmZmkuY2FsbC9yZXR1cm5fbGRsLmMgbGliZmZpLmNhbGwvc3RybGVuMl93aW4zMi5jCQkJXAorbGliZmZpLmNhbGwvY2xvc3VyZV9mbjUuYyBsaWJmZmkuY2FsbC9zdHJ1Y3QyX3dpbjMyLmMJCQlcCitsaWJmZmkuY2FsbC9zdHJ1Y3Q2LmMgbGliZmZpLmNhbGwvcmV0dXJuX2xsLmMgbGliZmZpLmNhbGwvc3RydWN0OS5jCVwKK2xpYmZmaS5jYWxsL3JldHVybl9zYy5jIGxpYmZmaS5jYWxsL3N0cnVjdDcuYwkJCQlcCitsaWJmZmkuY2FsbC9jbHNfYWxpZ25fdWludDY0LmMgbGliZmZpLmNhbGwvY2xzXzRieXRlLmMJCQlcCitsaWJmZmkuY2FsbC9zdHJsZW5fd2luMzIuYyBsaWJmZmkuY2FsbC9jbHNfNl8xX2J5dGUuYwkJCVwKK2xpYmZmaS5jYWxsL2Nsc183XzFfYnl0ZS5jIGxpYmZmaS5zcGVjaWFsL3Vud2luZHRlc3QuY2MJCQlcCitsaWJmZmkuc3BlY2lhbC9zcGVjaWFsLmV4cCBsaWJmZmkuc3BlY2lhbC91bndpbmR0ZXN0X2ZmaV9jYWxsLmNjCVwKK2xpYmZmaS5zcGVjaWFsL2ZmaXRlc3RjeHguaCBsaWIvd3JhcHBlci5leHAgbGliL3RhcmdldC1saWJwYXRoLmV4cAlcCitsaWIvbGliZmZpLmV4cCBsaWJmZmkuY2FsbC9jbHNfc3RydWN0X3ZhMS5jCQkJCVwKK2xpYmZmaS5jYWxsL2Nsc191Y2hhcl92YS5jIGxpYmZmaS5jYWxsL2Nsc191aW50X3ZhLmMJCQlcCitsaWJmZmkuY2FsbC9jbHNfdWxvbmdfdmEuYyBsaWJmZmkuY2FsbC9jbHNfdXNob3J0X3ZhLmMJCQlcCitsaWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0MTEuYyBsaWJmZmkuY2FsbC91bmluaXRpYWxpemVkLmMJCVwKK2xpYmZmaS5jYWxsL3ZhXzEuYyBsaWJmZmkuY2FsbC92YV9zdHJ1Y3QxLmMgbGliZmZpLmNhbGwvdmFfc3RydWN0Mi5jCVwKK2xpYmZmaS5jYWxsL3ZhX3N0cnVjdDMuYworCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9NYWtlZmlsZS5pbiBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL01ha2VmaWxlLmluCmluZGV4IDY5OGM0NjEuLmEzYmEwNjYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL01ha2VmaWxlLmluCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL01ha2VmaWxlLmluCkBAIC0xLDkgKzEsOCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMSBmcm9tIE1ha2VmaWxlLmFtLgorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMi4yIGZyb20gTWFrZWZpbGUuYW0uCiAjIEBjb25maWd1cmVfaW5wdXRACiAKLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAotIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0jIEluYy4KKyMgQ29weXJpZ2h0IChDKSAxOTk0LTIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKICMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCiAjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCiAjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KQEAgLTE1LDYgKzE0LDIzIEBACiAKIEBTRVRfTUFLRUAKIFZQQVRIID0gQHNyY2RpckAKK2FtX19tYWtlX2RyeXJ1biA9IFwKKyAgeyBcCisgICAgYW1fX2RyeT1ubzsgXAorICAgIGNhc2UgJCRNQUtFRkxBR1MgaW4gXAorICAgICAgKlxcW1wgXAldKikgXAorICAgICAgICBlY2hvICdhbS0tZWNobzogOyBAZWNobyAiQU0iICBPSycgfCAkKE1BS0UpIC1mIC0gMj4vZGV2L251bGwgXAorICAgICAgICAgIHwgZ3JlcCAnXkFNIE9LJCQnID4vZGV2L251bGwgfHwgYW1fX2RyeT15ZXM7OyBcCisgICAgICAqKSBcCisgICAgICAgIGZvciBhbV9fZmxnIGluICQkTUFLRUZMQUdTOyBkbyBcCisgICAgICAgICAgY2FzZSAkJGFtX19mbGcgaW4gXAorICAgICAgICAgICAgKj0qfC0tKikgOzsgXAorICAgICAgICAgICAgKm4qKSBhbV9fZHJ5PXllczsgYnJlYWs7OyBcCisgICAgICAgICAgZXNhYzsgXAorICAgICAgICBkb25lOzsgXAorICAgIGVzYWM7IFwKKyAgICB0ZXN0ICQkYW1fX2RyeSA9IHllczsgXAorICB9CiBwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKIHBrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAogcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQApAQCAtMzcsNyArNTMsMTkgQEAKIHN1YmRpciA9IHRlc3RzdWl0ZQogRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluCiBBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00Ci1hbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2luY2x1ZGUubTQgXAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvbTQvYXNtY2ZpLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2FwcGVuZF9mbGFnLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2NjX21heG9wdC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9jZmxhZ3Nfd2Fybl9hbGwubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYXhfY2hlY2tfY29tcGlsZV9mbGFnLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2NvbXBpbGVyX3ZlbmRvci5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9jb25maWd1cmVfYXJncy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9lbmFibGVfYnVpbGRkaXIubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYXhfZ2NjX2FyY2hmbGFnLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2djY194ODZfY3B1aWQubTQgXAorCSQodG9wX3NyY2RpcikvbTQvbGlidG9vbC5tNCAkKHRvcF9zcmNkaXIpL200L2x0b3B0aW9ucy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9sdHN1Z2FyLm00ICQodG9wX3NyY2RpcikvbTQvbHR2ZXJzaW9uLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2x0fm9ic29sZXRlLm00ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKIAkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYwogYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKIAkkKEFDTE9DQUxfTTQpCkBAIC00NywxMiArNzUsMTggQEAKIENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9CiBTT1VSQ0VTID0KIERJU1RfU09VUkNFUyA9CithbV9fY2FuX3J1bl9pbnN0YWxsaW5mbyA9IFwKKyAgY2FzZSAkJEFNX1VQREFURV9JTkZPX0RJUiBpbiBcCisgICAgbnxub3xOTykgZmFsc2U7OyBcCisgICAgKikgKGluc3RhbGwtaW5mbyAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMTs7IFwKKyAgZXNhYwogREVKQVRPT0wgPSAkKFBBQ0tBR0UpCiBSVU5URVNUREVGQVVMVEZMQUdTID0gLS10b29sICQkdG9vbCAtLXNyY2RpciAkJHNyY2RpcgogRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKIEFDTE9DQUwgPSBAQUNMT0NBTEAKIEFMTE9DQSA9IEBBTExPQ0FACiBBTVRBUiA9IEBBTVRBUkAKK0FNX0xUTERGTEFHUyA9IEBBTV9MVExERkxBR1NACiBBTV9SVU5URVNURkxBR1MgPSAKIEFSID0gQEFSQAogQVVUT0NPTkYgPSBAQVVUT0NPTkZACkBAIC03MCw2ICsxMDQsNyBAQAogQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKIERFRlMgPSBAREVGU0AKIERFUERJUiA9IEBERVBESVJACitETExUT09MID0gQERMTFRPT0xACiBEU1lNVVRJTCA9IEBEU1lNVVRJTEAKIERVTVBCSU4gPSBARFVNUEJJTkAKIEVDSE9fQyA9IEBFQ0hPX0NACkBAIC03Nyw2ICsxMTIsNyBAQAogRUNIT19UID0gQEVDSE9fVEAKIEVHUkVQID0gQEVHUkVQQAogRVhFRVhUID0gQEVYRUVYVEAKK0ZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEUgPSBARkZJX0VYRUNfVFJBTVBPTElORV9UQUJMRUAKIEZHUkVQID0gQEZHUkVQQAogR1JFUCA9IEBHUkVQQAogSEFWRV9MT05HX0RPVUJMRSA9IEBIQVZFX0xPTkdfRE9VQkxFQApAQCAtOTUsNiArMTMxLDcgQEAKIExUTElCT0JKUyA9IEBMVExJQk9CSlNACiBNQUlOVCA9IEBNQUlOVEAKIE1BS0VJTkZPID0gQE1BS0VJTkZPQAorTUFOSUZFU1RfVE9PTCA9IEBNQU5JRkVTVF9UT09MQAogTUtESVJfUCA9IEBNS0RJUl9QQAogTk0gPSBATk1ACiBOTUVESVQgPSBATk1FRElUQApAQCAtMTA3LDggKzE0NCwxMCBAQAogUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKIFBBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAogUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVVJMID0gQFBBQ0tBR0VfVVJMQAogUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKIFBBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUFJURElBRyA9IEBQUlRESUFHQAogUkFOTElCID0gQFJBTkxJQkAKIFNFRCA9IEBTRURACiBTRVRfTUFLRSA9IEBTRVRfTUFLRUAKQEAgLTEyMSw2ICsxNjAsNyBAQAogYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAogYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAogYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9BUiA9IEBhY19jdF9BUkAKIGFjX2N0X0NDID0gQGFjX2N0X0NDQAogYWNfY3RfRFVNUEJJTiA9IEBhY19jdF9EVU1QQklOQAogYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACkBAIC0xMjgsNiArMTY4LDcgQEAKIGFtX19xdW90ZSA9IEBhbV9fcXVvdGVACiBhbV9fdGFyID0gQGFtX190YXJACiBhbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYXhfZW5hYmxlX2J1aWxkZGlyX3NlZCA9IEBheF9lbmFibGVfYnVpbGRkaXJfc2VkQAogYmluZGlyID0gQGJpbmRpckAKIGJ1aWxkID0gQGJ1aWxkQAogYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACkBAIC0xNTMsNyArMTk0LDYgQEAKIGxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKIGxvY2FsZWRpciA9IEBsb2NhbGVkaXJACiBsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1sdF9FQ0hPID0gQGx0X0VDSE9ACiBtYW5kaXIgPSBAbWFuZGlyQAogbWtkaXJfcCA9IEBta2Rpcl9wQAogb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQApAQCAtMTY0LDYgKzIwNCw3IEBACiBzYmluZGlyID0gQHNiaW5kaXJACiBzaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKIHNyY2RpciA9IEBzcmNkaXJACitzeXNfc3ltYm9sX3VuZGVyc2NvcmUgPSBAc3lzX3N5bWJvbF91bmRlcnNjb3JlQAogc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAogdGFyZ2V0ID0gQHRhcmdldEAKIHRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACkBAIC0xODYsNzAgKzIyNyw4MiBAQAogCSAgICAgICBlY2hvICQodG9wX3NyY2RpcikvLi4vZGVqYWdudS9ydW50ZXN0IDsgXAogCSAgICBlbHNlIGVjaG8gcnVudGVzdDsgZmlgCiAKK0VYVFJBX0RFSkFHTlVfU0lURV9DT05GSUcgPSAuLi9sb2NhbC5leHAKIENMRUFORklMRVMgPSAqLmV4ZSBjb3JlKiAqLmxvZyAqLnN1bQotRVhUUkFfRElTVCA9IGxpYmZmaS5zcGVjaWFsL3NwZWNpYWwuZXhwCVwKLWxpYmZmaS5zcGVjaWFsL3Vud2luZHRlc3RfZmZpX2NhbGwuY2MgbGliZmZpLnNwZWNpYWwvdW53aW5kdGVzdC5jYyBcCi1saWJmZmkuc3BlY2lhbC9mZml0ZXN0Y3h4LmggY29uZmlnL2RlZmF1bHQuZXhwIGxpYi90YXJnZXQtbGlicGF0aC5leHAgXAotbGliL2xpYmZmaS1kZy5leHAgbGliL3dyYXBwZXIuZXhwIGxpYmZmaS5jYWxsL2Zsb2F0LmMgXAotbGliZmZpLmNhbGwvY2xzX211bHRpX3NjaGFyLmMgbGliZmZpLmNhbGwvZmxvYXQzLmMgXAotbGliZmZpLmNhbGwvY2xzXzNfMWJ5dGUuYyBsaWJmZmkuY2FsbC9zdHJldF9sYXJnZTIuYyBcCi1saWJmZmkuY2FsbC9jbHNfNV8xX2J5dGUuYyBsaWJmZmkuY2FsbC9zdHJldF9tZWRpdW0uYyBcCi1saWJmZmkuY2FsbC9wcm9tb3Rpb24uYyBsaWJmZmkuY2FsbC9jbHNfZGJsc19zdHJ1Y3QuYyBcCi1saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0LmMgbGliZmZpLmNhbGwvY2xvc3VyZV9mbjEuYyBcCi1saWJmZmkuY2FsbC9jbHNfNF8xYnl0ZS5jIGxpYmZmaS5jYWxsL2Nsc19mbG9hdC5jIFwKLWxpYmZmaS5jYWxsL2Nsc18yYnl0ZS5jIGxpYmZmaS5jYWxsL2Nsb3N1cmVfZm40LmMgXAotbGliZmZpLmNhbGwvcmV0dXJuX2ZsMi5jIGxpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q3LmMgXAotbGliZmZpLmNhbGwvY2xzX3VpbnQuYyBsaWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDY0LmMgXAotbGliZmZpLmNhbGwvZmxvYXQxLmMgbGliZmZpLmNhbGwvY2xzXzE5Ynl0ZS5jIFwKLWxpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QxLmMgbGliZmZpLmNhbGwvY2xzXzRieXRlLmMgXAotbGliZmZpLmNhbGwvcmV0dXJuX2ZsMS5jIGxpYmZmaS5jYWxsL2Nsc19hbGlnbl9wb2ludGVyLmMgXAotbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDQuYyBsaWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0My5jIFwKLWxpYmZmaS5jYWxsL3N0cnVjdDcuYyBsaWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0OS5jIFwKLWxpYmZmaS5jYWxsL2Nsc19zc2hvcnQuYyBsaWJmZmkuY2FsbC9jbHNfdWxvbmdsb25nLmMgXAotbGliZmZpLmNhbGwvY2xzX3BvaW50ZXJfc3RhY2suYyBsaWJmZmkuY2FsbC9jbHNfbXVsdGlfdWNoYXIuYyBcCi1saWJmZmkuY2FsbC90ZXN0Y2xvc3VyZS5jIGxpYmZmaS5jYWxsL2Nsc18zYnl0ZTEuYyBcCi1saWJmZmkuY2FsbC9zdHJ1Y3Q2LmMgbGliZmZpLmNhbGwvcmV0dXJuX3VjLmMgbGliZmZpLmNhbGwvcmV0dXJuX2xsMS5jIFwKLWxpYmZmaS5jYWxsL2Nsc191c2hvcnQuYyBsaWJmZmkuY2FsbC9zdHJldF9tZWRpdW0yLmMgXAotbGliZmZpLmNhbGwvY2xzX211bHRpX3VzaG9ydGNoYXIuYyBsaWJmZmkuY2FsbC9yZXR1cm5fZGJsMi5jIFwKLWxpYmZmaS5jYWxsL2Nsb3N1cmVfbG9jX2ZuMC5jIGxpYmZmaS5jYWxsL3JldHVybl9zYy5jIFwKLWxpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q4LmMgbGliZmZpLmNhbGwvY2xzXzdfMV9ieXRlLmMJXAotbGliZmZpLmNhbGwvcmV0dXJuX2xsLmMgbGliZmZpLmNhbGwvY2xzX3BvaW50ZXIuYyBcCi1saWJmZmkuY2FsbC9lcnJfYmFkX2FiaS5jIGxpYmZmaS5jYWxsL3JldHVybl9kYmwxLmMgXAotbGliZmZpLmNhbGwvY2FsbC5leHAgbGliZmZpLmNhbGwvZmZpdGVzdC5oIGxpYmZmaS5jYWxsL3N0cmxlbi5jCVwKLWxpYmZmaS5jYWxsL3JldHVybl9zbC5jIGxpYmZmaS5jYWxsL2Nsc18xXzFieXRlLmMgXAotbGliZmZpLmNhbGwvc3RydWN0MS5jIGxpYmZmaS5jYWxsL2Nsc182NGJ5dGUuYyBsaWJmZmkuY2FsbC9yZXR1cm5fdWwuYyBcCi1saWJmZmkuY2FsbC9jbHNfZG91YmxlLmMgbGliZmZpLmNhbGwvbWFueV93aW4zMi5jIFwKLWxpYmZmaS5jYWxsL2Nsc18xNmJ5dGUuYyBsaWJmZmkuY2FsbC9jbHNfYWxpZ25fZG91YmxlLmMJXAotbGliZmZpLmNhbGwvY2xzX2FsaWduX3VpbnQxNi5jIGxpYmZmaS5jYWxsL2Nsc185Ynl0ZTEuYwlcCi1saWJmZmkuY2FsbC9jbHNfbXVsdGlfc3Nob3J0Y2hhci5jIGxpYmZmaS5jYWxsL2Nsc19tdWx0aV91c2hvcnQuYyBcCi1saWJmZmkuY2FsbC9jbG9zdXJlX3N0ZGNhbGwuYyBsaWJmZmkuY2FsbC9yZXR1cm5fZmwuYyBcCi1saWJmZmkuY2FsbC9zdHJsZW5fd2luMzIuYyBsaWJmZmkuY2FsbC9yZXR1cm5fbGRsLmMgXAotbGliZmZpLmNhbGwvY2xzX2FsaWduX2Zsb2F0LmMgbGliZmZpLmNhbGwvc3RydWN0My5jIFwKLWxpYmZmaS5jYWxsL2Nsc191Y2hhci5jIGxpYmZmaS5jYWxsL2Nsc19zaW50LmMgbGliZmZpLmNhbGwvZmxvYXQyLmMgXAotbGliZmZpLmNhbGwvY2xzX2FsaWduX2xvbmdkb3VibGVfc3BsaXQuYyBcCi1saWJmZmkuY2FsbC9jbHNfbG9uZ2RvdWJsZV92YS5jIGxpYmZmaS5jYWxsL2Nsc19tdWx0aV9zc2hvcnQuYyBcCi1saWJmZmkuY2FsbC9zdHJldF9sYXJnZS5jIGxpYmZmaS5jYWxsL2Nsc19hbGlnbl9zaW50MTYuYyBcCi1saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0Ni5jIGxpYmZmaS5jYWxsL2Nsc181Ynl0ZS5jIFwKLWxpYmZmaS5jYWxsL3JldHVybl9kYmwuYyBsaWJmZmkuY2FsbC9jbHNfMjBieXRlLmMgXAotbGliZmZpLmNhbGwvY2xzXzhieXRlLmMgbGliZmZpLmNhbGwvcHlvYmpjLXRjLmMJXAotbGliZmZpLmNhbGwvY2xzXzI0Ynl0ZS5jIGxpYmZmaS5jYWxsL2Nsc19hbGlnbl9sb25nZG91YmxlX3NwbGl0Mi5jIFwKLWxpYmZmaS5jYWxsL2Nsc182XzFfYnl0ZS5jIGxpYmZmaS5jYWxsL2Nsc19zY2hhci5jIFwKLWxpYmZmaS5jYWxsL2Nsc18xOGJ5dGUuYyBsaWJmZmkuY2FsbC9jbG9zdXJlX2ZuMy5jIFwKLWxpYmZmaS5jYWxsL2Vycl9iYWRfdHlwZWRlZi5jIGxpYmZmaS5jYWxsL2Nsb3N1cmVfZm4yLmMJXAotbGliZmZpLmNhbGwvc3RydWN0Mi5jIGxpYmZmaS5jYWxsL2Nsc18zYnl0ZTIuYyBcCi1saWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZS5jIGxpYmZmaS5jYWxsL2Nsc18yMGJ5dGUxLmMgXAotbGliZmZpLmNhbGwvcmV0dXJuX2ZsMy5jIGxpYmZmaS5jYWxsL2Nsc19hbGlnbl91aW50MzIuYwlcCi1saWJmZmkuY2FsbC9wcm9ibGVtMS5jIGxpYmZmaS5jYWxsL2Zsb2F0NC5jIFwKLWxpYmZmaS5jYWxsL2Nsc19hbGlnbl91aW50NjQuYyBsaWJmZmkuY2FsbC9zdHJ1Y3Q5LmMgXAotbGliZmZpLmNhbGwvY2xvc3VyZV9mbjUuYyBsaWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDMyLmMgXAotbGliZmZpLmNhbGwvY2xvc3VyZV9mbjAuYyBsaWJmZmkuY2FsbC9jbG9zdXJlX2ZuNi5jIFwKLWxpYmZmaS5jYWxsL3N0cnVjdDQuYyBsaWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0Mi5jIFwKLWxpYmZmaS5jYWxsL2Nsc182Ynl0ZS5jIGxpYmZmaS5jYWxsL2Nsc183Ynl0ZS5jIGxpYmZmaS5jYWxsL21hbnkuYyBcCi1saWJmZmkuY2FsbC9zdHJ1Y3Q4LmMgbGliZmZpLmNhbGwvbmVnaW50LmMgbGliZmZpLmNhbGwvc3RydWN0NS5jIFwKLWxpYmZmaS5jYWxsL2Nsc18xMmJ5dGUuYyBsaWJmZmkuY2FsbC9jbHNfZG91YmxlX3ZhLmMgXAotbGliZmZpLmNhbGwvY2xzX2xvbmdkb3VibGUuYyBsaWJmZmkuY2FsbC9jbHNfOWJ5dGUyLmMgXAotbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDEwLmMgbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDUuYyBcCi1saWJmZmkuY2FsbC9odWdlX3N0cnVjdC5jCitFWFRSQV9ESVNUID0gY29uZmlnL2RlZmF1bHQuZXhwIGxpYmZmaS5jYWxsL2Nsc18xOWJ5dGUuYwkJXAorbGliZmZpLmNhbGwvY2xzX2FsaWduX2xvbmdkb3VibGVfc3BsaXQuYwkJCQlcCitsaWJmZmkuY2FsbC9jbG9zdXJlX2xvY19mbjAuYyBsaWJmZmkuY2FsbC9jbHNfc2NoYXIuYwkJCVwKK2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4xLmMgbGliZmZpLmNhbGwvbWFueTJfd2luMzIuYwkJCVwKK2xpYmZmaS5jYWxsL3JldHVybl91bC5jIGxpYmZmaS5jYWxsL2Nsc19hbGlnbl9kb3VibGUuYwkJCVwKK2xpYmZmaS5jYWxsL3JldHVybl9mbDIuYyBsaWJmZmkuY2FsbC9jbHNfMV8xYnl0ZS5jCQkJXAorbGliZmZpLmNhbGwvY2xzXzY0Ynl0ZS5jIGxpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q3LmMJCQlcCitsaWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDMyLmMgbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDIuYwkJXAorbGliZmZpLmNhbGwvZmZpdGVzdC5oIGxpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q0LmMJCQlcCitsaWJmZmkuY2FsbC9jbHNfbXVsdGlfdXNob3J0LmMgbGliZmZpLmNhbGwvc3RydWN0My5jCQkJXAorbGliZmZpLmNhbGwvY2xzXzNieXRlMS5jIGxpYmZmaS5jYWxsL2Nsc18xNmJ5dGUuYwkJCVwKK2xpYmZmaS5jYWxsL3N0cnVjdDguYyBsaWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0OC5jCQkJXAorbGliZmZpLmNhbGwvY2xzX211bHRpX3NzaG9ydC5jIGxpYmZmaS5jYWxsL2Nsc18zYnl0ZTIuYwkJCVwKK2xpYmZmaS5jYWxsL2Zhc3R0aGlzMl93aW4zMi5jIGxpYmZmaS5jYWxsL2Nsc19wb2ludGVyLmMJCQlcCitsaWJmZmkuY2FsbC9lcnJfYmFkX3R5cGVkZWYuYyBsaWJmZmkuY2FsbC9jbHNfNF8xYnl0ZS5jCQkJXAorbGliZmZpLmNhbGwvY2xzXzlieXRlMi5jIGxpYmZmaS5jYWxsL2Nsc19tdWx0aV9zY2hhci5jCQkJXAorbGliZmZpLmNhbGwvc3RyZXRfbWVkaXVtMi5jIGxpYmZmaS5jYWxsL2Nsc181XzFfYnl0ZS5jCQkJXAorbGliZmZpLmNhbGwvY2FsbC5leHAgbGliZmZpLmNhbGwvY2xzX2RvdWJsZS5jCQkJCVwKK2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9zaW50MTYuYyBsaWJmZmkuY2FsbC9jbHNfdWludC5jCQkJXAorbGliZmZpLmNhbGwvcmV0dXJuX2xsMS5jIGxpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QzLmMJCQlcCitsaWJmZmkuY2FsbC9jbHNfMjBieXRlMS5jIGxpYmZmaS5jYWxsL2Nsb3N1cmVfZm40LmMJCQlcCitsaWJmZmkuY2FsbC9jbHNfdWNoYXIuYyBsaWJmZmkuY2FsbC9zdHJ1Y3QyLmMgbGliZmZpLmNhbGwvY2xzXzdieXRlLmMJXAorbGliZmZpLmNhbGwvc3RybGVuLmMgbGliZmZpLmNhbGwvbWFueS5jIGxpYmZmaS5jYWxsL3Rlc3RjbG9zdXJlLmMJXAorbGliZmZpLmNhbGwvcmV0dXJuX2ZsLmMgbGliZmZpLmNhbGwvc3RydWN0NS5jCQkJCVwKK2xpYmZmaS5jYWxsL2Nsc18xMmJ5dGUuYyBsaWJmZmkuY2FsbC9jbHNfbXVsdGlfc3Nob3J0Y2hhci5jCQlcCitsaWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZV9zcGxpdDIuYyBsaWJmZmkuY2FsbC9yZXR1cm5fZGJsMi5jCVwKK2xpYmZmaS5jYWxsL3JldHVybl9mbDMuYyBsaWJmZmkuY2FsbC9zdHJldF9tZWRpdW0uYwkJCVwKK2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q2LmMgbGliZmZpLmNhbGwvY2xvc3VyZV9mbjMuYwkJCVwKK2xpYmZmaS5jYWxsL2Zsb2F0My5jIGxpYmZmaS5jYWxsL21hbnkyLmMJCQkJXAorbGliZmZpLmNhbGwvY2xvc3VyZV9zdGRjYWxsLmMgbGliZmZpLmNhbGwvY2xzX2FsaWduX3VpbnQxNi5jCQlcCitsaWJmZmkuY2FsbC9jbHNfOWJ5dGUxLmMgbGliZmZpLmNhbGwvY2xvc3VyZV9mbjYuYwkJCVwKK2xpYmZmaS5jYWxsL2Nsc19kb3VibGVfdmEuYyBsaWJmZmkuY2FsbC9jbHNfYWxpZ25fcG9pbnRlci5jCQlcCitsaWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZS5jIGxpYmZmaS5jYWxsL2Nsb3N1cmVfZm4yLmMJCVwKK2xpYmZmaS5jYWxsL2Nsc19zc2hvcnQuYyBsaWJmZmkuY2FsbC9tYW55X3dpbjMyLmMJCQlcCitsaWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0LmMgbGliZmZpLmNhbGwvY2xzXzIwYnl0ZS5jCQkJXAorbGliZmZpLmNhbGwvY2xzX2xvbmdkb3VibGUuYyBsaWJmZmkuY2FsbC9jbHNfbXVsdGlfdWNoYXIuYwkJXAorbGliZmZpLmNhbGwvcmV0dXJuX3VjLmMgbGliZmZpLmNhbGwvY2xvc3VyZV90aGlzY2FsbC5jCQkJXAorbGliZmZpLmNhbGwvY2xzXzE4Ynl0ZS5jIGxpYmZmaS5jYWxsL2Nsc184Ynl0ZS5jCQkJXAorbGliZmZpLmNhbGwvcHJvbW90aW9uLmMgbGliZmZpLmNhbGwvc3RydWN0MV93aW4zMi5jCQkJXAorbGliZmZpLmNhbGwvcmV0dXJuX2RibC5jIGxpYmZmaS5jYWxsL2Nsc18yNGJ5dGUuYwkJCVwKK2xpYmZmaS5jYWxsL3N0cnVjdDQuYyBsaWJmZmkuY2FsbC9jbHNfNmJ5dGUuYwkJCQlcCitsaWJmZmkuY2FsbC9jbHNfYWxpZ25fdWludDMyLmMgbGliZmZpLmNhbGwvZmxvYXQuYwkJCVwKK2xpYmZmaS5jYWxsL2Zsb2F0MS5jIGxpYmZmaS5jYWxsL2Zsb2F0X3ZhLmMgbGliZmZpLmNhbGwvbmVnaW50LmMJXAorbGliZmZpLmNhbGwvcmV0dXJuX2RibDEuYyBsaWJmZmkuY2FsbC9jbHNfM18xYnl0ZS5jCQkJXAorbGliZmZpLmNhbGwvY2xzX2FsaWduX2Zsb2F0LmMgbGliZmZpLmNhbGwvcmV0dXJuX2ZsMS5jCQkJXAorbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDEwLmMgbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDUuYwkJXAorbGliZmZpLmNhbGwvZmFzdHRoaXMxX3dpbjMyLmMgbGliZmZpLmNhbGwvY2xzX2FsaWduX3NpbnQ2NC5jCQlcCitsaWJmZmkuY2FsbC9zdHJldF9sYXJnZTIuYyBsaWJmZmkuY2FsbC9yZXR1cm5fc2wuYwkJCVwKK2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4wLmMgbGliZmZpLmNhbGwvY2xzXzVieXRlLmMJCQlcCitsaWJmZmkuY2FsbC9jbHNfMmJ5dGUuYyBsaWJmZmkuY2FsbC9mbG9hdDIuYwkJCQlcCitsaWJmZmkuY2FsbC9jbHNfZGJsc19zdHJ1Y3QuYyBsaWJmZmkuY2FsbC9jbHNfc2ludC5jCQkJXAorbGliZmZpLmNhbGwvc3RyZXRfbGFyZ2UuYyBsaWJmZmkuY2FsbC9jbHNfdWxvbmdsb25nLmMJCQlcCitsaWJmZmkuY2FsbC9jbHNfdXNob3J0LmMgbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDEuYwkJCVwKK2xpYmZmaS5jYWxsL2Vycl9iYWRfYWJpLmMgbGliZmZpLmNhbGwvY2xzX2xvbmdkb3VibGVfdmEuYwkJXAorbGliZmZpLmNhbGwvY2xzX2Zsb2F0LmMgbGliZmZpLmNhbGwvY2xzX3BvaW50ZXJfc3RhY2suYwkJXAorbGliZmZpLmNhbGwvcHlvYmpjLXRjLmMgbGliZmZpLmNhbGwvY2xzX211bHRpX3VzaG9ydGNoYXIuYwkJXAorbGliZmZpLmNhbGwvc3RydWN0MS5jIGxpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q5LmMJCQlcCitsaWJmZmkuY2FsbC9odWdlX3N0cnVjdC5jIGxpYmZmaS5jYWxsL3Byb2JsZW0xLmMJCQlcCitsaWJmZmkuY2FsbC9mbG9hdDQuYyBsaWJmZmkuY2FsbC9mYXN0dGhpczNfd2luMzIuYwkJCVwKK2xpYmZmaS5jYWxsL3JldHVybl9sZGwuYyBsaWJmZmkuY2FsbC9zdHJsZW4yX3dpbjMyLmMJCQlcCitsaWJmZmkuY2FsbC9jbG9zdXJlX2ZuNS5jIGxpYmZmaS5jYWxsL3N0cnVjdDJfd2luMzIuYwkJCVwKK2xpYmZmaS5jYWxsL3N0cnVjdDYuYyBsaWJmZmkuY2FsbC9yZXR1cm5fbGwuYyBsaWJmZmkuY2FsbC9zdHJ1Y3Q5LmMJXAorbGliZmZpLmNhbGwvcmV0dXJuX3NjLmMgbGliZmZpLmNhbGwvc3RydWN0Ny5jCQkJCVwKK2xpYmZmaS5jYWxsL2Nsc19hbGlnbl91aW50NjQuYyBsaWJmZmkuY2FsbC9jbHNfNGJ5dGUuYwkJCVwKK2xpYmZmaS5jYWxsL3N0cmxlbl93aW4zMi5jIGxpYmZmaS5jYWxsL2Nsc182XzFfYnl0ZS5jCQkJXAorbGliZmZpLmNhbGwvY2xzXzdfMV9ieXRlLmMgbGliZmZpLnNwZWNpYWwvdW53aW5kdGVzdC5jYwkJCVwKK2xpYmZmaS5zcGVjaWFsL3NwZWNpYWwuZXhwIGxpYmZmaS5zcGVjaWFsL3Vud2luZHRlc3RfZmZpX2NhbGwuY2MJXAorbGliZmZpLnNwZWNpYWwvZmZpdGVzdGN4eC5oIGxpYi93cmFwcGVyLmV4cCBsaWIvdGFyZ2V0LWxpYnBhdGguZXhwCVwKK2xpYi9saWJmZmkuZXhwIGxpYmZmaS5jYWxsL2Nsc19zdHJ1Y3RfdmExLmMJCQkJXAorbGliZmZpLmNhbGwvY2xzX3VjaGFyX3ZhLmMgbGliZmZpLmNhbGwvY2xzX3VpbnRfdmEuYwkJCVwKK2xpYmZmaS5jYWxsL2Nsc191bG9uZ192YS5jIGxpYmZmaS5jYWxsL2Nsc191c2hvcnRfdmEuYwkJCVwKK2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QxMS5jIGxpYmZmaS5jYWxsL3VuaW5pdGlhbGl6ZWQuYwkJXAorbGliZmZpLmNhbGwvdmFfMS5jIGxpYmZmaS5jYWxsL3ZhX3N0cnVjdDEuYyBsaWJmZmkuY2FsbC92YV9zdHJ1Y3QyLmMJXAorbGliZmZpLmNhbGwvdmFfc3RydWN0My5jCiAKIGFsbDogYWxsLWFtCiAKQEAgLTI5Niw5ICszNDksMTEgQEAKIGN0YWdzOiBDVEFHUwogQ1RBR1M6CiAKK2NzY29wZSBjc2NvcGVsaXN0OgorCiAKIGNoZWNrLURFSkFHTlU6IHNpdGUuZXhwCi0Jc3JjZGlyPWAkKGFtX19jZCkgJChzcmNkaXIpICYmIHB3ZGA7IGV4cG9ydCBzcmNkaXI7IFwKKwlzcmNkaXI9JyQoc3JjZGlyKSc7IGV4cG9ydCBzcmNkaXI7IFwKIAlFWFBFQ1Q9JChFWFBFQ1QpOyBleHBvcnQgRVhQRUNUOyBcCiAJcnVudGVzdD0kKFJVTlRFU1QpOyBcCiAJaWYgJChTSEVMTCkgLWMgIiQkcnVudGVzdCAtLXZlcnNpb24iID4gL2Rldi9udWxsIDI+JjE7IHRoZW4gXApAQCAtMzA2LDE1ICszNjEsMTUgQEAKIAkgICAgaWYgJCRydW50ZXN0ICQoQU1fUlVOVEVTVEZMQUdTKSAkKFJVTlRFU1RERUZBVUxURkxBR1MpICQoUlVOVEVTVEZMQUdTKTsgXAogCSAgICB0aGVuIDo7IGVsc2UgZXhpdF9zdGF0dXM9MTsgZmk7IFwKIAkgIGRvbmU7IFwKLQllbHNlIGVjaG8gIldBUk5JTkc6IGNvdWxkIG5vdCBmaW5kIFxgcnVudGVzdCciIDE+JjI7IDo7XAorCWVsc2UgZWNobyAiV0FSTklORzogY291bGQgbm90IGZpbmQgJ3J1bnRlc3QnIiAxPiYyOyA6O1wKIAlmaTsgXAogCWV4aXQgJCRleGl0X3N0YXR1cwotc2l0ZS5leHA6IE1ha2VmaWxlCi0JQGVjaG8gJ01ha2luZyBhIG5ldyBzaXRlLmV4cCBmaWxlLi4uJworc2l0ZS5leHA6IE1ha2VmaWxlICQoRVhUUkFfREVKQUdOVV9TSVRFX0NPTkZJRykKKwlAZWNobyAnTWFraW5nIGEgbmV3IHNpdGUuZXhwIGZpbGUgLi4uJwogCUBlY2hvICcjIyB0aGVzZSB2YXJpYWJsZXMgYXJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IG1ha2UgIyMnID5zaXRlLnRtcAogCUBlY2hvICcjIERvIG5vdCBlZGl0IGhlcmUuICBJZiB5b3Ugd2lzaCB0byBvdmVycmlkZSB0aGVzZSB2YWx1ZXMnID4+c2l0ZS50bXAKIAlAZWNobyAnIyBlZGl0IHRoZSBsYXN0IHNlY3Rpb24nID4+c2l0ZS50bXAKLQlAZWNobyAnc2V0IHNyY2RpciAkKHNyY2RpciknID4+c2l0ZS50bXAKKwlAZWNobyAnc2V0IHNyY2RpciAiJChzcmNkaXIpIicgPj5zaXRlLnRtcAogCUBlY2hvICJzZXQgb2JqZGlyIGBwd2RgIiA+PnNpdGUudG1wCiAJQGVjaG8gJ3NldCBidWlsZF9hbGlhcyAiJChidWlsZF9hbGlhcykiJyA+PnNpdGUudG1wCiAJQGVjaG8gJ3NldCBidWlsZF90cmlwbGV0ICQoYnVpbGRfdHJpcGxldCknID4+c2l0ZS50bXAKQEAgLTMyMiw5ICszNzcsMTYgQEAKIAlAZWNobyAnc2V0IGhvc3RfdHJpcGxldCAkKGhvc3RfdHJpcGxldCknID4+c2l0ZS50bXAKIAlAZWNobyAnc2V0IHRhcmdldF9hbGlhcyAiJCh0YXJnZXRfYWxpYXMpIicgPj5zaXRlLnRtcAogCUBlY2hvICdzZXQgdGFyZ2V0X3RyaXBsZXQgJCh0YXJnZXRfdHJpcGxldCknID4+c2l0ZS50bXAKLQlAZWNobyAnIyMgQWxsIHZhcmlhYmxlcyBhYm92ZSBhcmUgZ2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZS4gRG8gTm90IEVkaXQgIyMnID4+c2l0ZS50bXAKLQlAdGVzdCAhIC1mIHNpdGUuZXhwIHx8IFwKLQkgIHNlZCAnMSwvXiMjIEFsbCB2YXJpYWJsZXMgYWJvdmUgYXJlLiojIy8gZCcgc2l0ZS5leHAgPj4gc2l0ZS50bXAKKwlAbGlzdD0nJChFWFRSQV9ERUpBR05VX1NJVEVfQ09ORklHKSc7IGZvciBmIGluICQkbGlzdDsgZG8gXAorCSAgZWNobyAiIyMgQmVnaW4gY29udGVudCBpbmNsdWRlZCBmcm9tIGZpbGUgJCRmLiAgRG8gbm90IG1vZGlmeS4gIyMiIFwKKwkgICAmJiBjYXQgYHRlc3QgLWYgIiQkZiIgfHwgZWNobyAnJChzcmNkaXIpLydgJCRmIFwKKwkgICAmJiBlY2hvICIjIyBFbmQgY29udGVudCBpbmNsdWRlZCBmcm9tIGZpbGUgJCRmLiAjIyIgXAorCSAgIHx8IGV4aXQgMTsgXAorCSBkb25lID4+IHNpdGUudG1wCisJQGVjaG8gIiMjIEVuZCBvZiBhdXRvLWdlbmVyYXRlZCBjb250ZW50OyB5b3UgY2FuIGVkaXQgZnJvbSBoZXJlLiAjIyIgPj4gc2l0ZS50bXAKKwlAaWYgdGVzdCAtZiBzaXRlLmV4cDsgdGhlbiBcCisJICAgc2VkIC1lICcxLC9eIyMgRW5kIG9mIGF1dG8tZ2VuZXJhdGVkIGNvbnRlbnQuKiMjL2QnIHNpdGUuZXhwID4+IHNpdGUudG1wOyBcCisJIGZpCiAJQC1ybSAtZiBzaXRlLmJhawogCUB0ZXN0ICEgLWYgc2l0ZS5leHAgfHwgbXYgc2l0ZS5leHAgc2l0ZS5iYWsKIAlAbXYgc2l0ZS50bXAgc2l0ZS5leHAKQEAgLTM4MCwxMCArNDQyLDE1IEBACiAKIGluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCiBpbnN0YWxsLXN0cmlwOgotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKLQkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAotCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorCWlmIHRlc3QgLXogJyQoU1RSSVApJzsgdGhlbiBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgICAgICBpbnN0YWxsOyBcCisJZWxzZSBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgICAgIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciIGluc3RhbGw7IFwKKwlmaQogbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKIAogY2xlYW4tZ2VuZXJpYzoKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYi9saWJmZmktZGcuZXhwIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliL2xpYmZmaS5leHAKc2ltaWxhcml0eSBpbmRleCA4MCUKcmVuYW1lIGZyb20gTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliL2xpYmZmaS1kZy5leHAKcmVuYW1lIHRvIE1vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYi9saWJmZmkuZXhwCmluZGV4IDgzOGEzMDYuLjFhYzJjMzYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYi9saWJmZmktZGcuZXhwCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYi9saWJmZmkuZXhwCkBAIC0xLDQgKzEsNCBAQAotIyAgIENvcHlyaWdodCAoQykgMjAwMywgMjAwNSwgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDUsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAKICMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTExLDggKzExLDggQEAKICMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICMKICMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKKyMgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogCiBwcm9jIGxvYWRfZ2NjX2xpYiB7IGZpbGVuYW1lIH0gewogICAgIGdsb2JhbCBzcmNkaXIKQEAgLTEwMSw5ICsxMDEsMTcgQEAKICAgICBnbG9iYWwgdG9vbF9yb290X2RpcgogICAgIGdsb2JhbCBsZF9saWJyYXJ5X3BhdGgKIAotICAgIHNldCBibGRkaXJmZmkgW3B3ZF0vLi4KKyAgICBnbG9iYWwgdXNpbmdfZ2NjCisKKyAgICBzZXQgYmxkZGlyZmZpIFtwd2RdLy4uIAogICAgIHZlcmJvc2UgImxpYmZmaSAkYmxkZGlyZmZpIgogCisgICAgIyBBcmUgd2UgYnVpbGRpbmcgd2l0aCBHQ0M/CisgICAgc2V0IHRtcCBbZ3JlcCAuLi9jb25maWcuc3RhdHVzICJHQ0M9J3llcyciXQorICAgIGlmIHsgW3N0cmluZyBtYXRjaCAkdG1wICJHQ0M9J3llcyciXSB9IHsKKworICAgICAgc2V0IHVzaW5nX2djYyAieWVzIgorCiAgICAgc2V0IGdjY2RpciBbbG9va2Zvcl9maWxlICR0b29sX3Jvb3RfZGlyIGdjYy9saWJnY2MuYV0KICAgICBpZiB7JGdjY2RpciAhPSAiIn0gewogCXNldCBnY2NkaXIgW2ZpbGUgZGlybmFtZSAkZ2NjZGlyXQpAQCAtMTI3LDYgKzEzNSwxMyBAQAogCSAgICB9CiAJfQogICAgIH0KKyAKKyAgICB9IGVsc2UgeworCisgICAgICBzZXQgdXNpbmdfZ2NjICJubyIKKworICAgIH0KKwogICAgICMgYWRkIHRoZSBsaWJyYXJ5IHBhdGggZm9yIGxpYmZmaS4KICAgICBhcHBlbmQgbGRfbGlicmFyeV9wYXRoICI6JHtibGRkaXJmZml9Ly5saWJzIgogCkBAIC0yMDMsNiArMjE4LDEwIEBACiAKICAgICBsYXBwZW5kIG9wdGlvbnMgImxpYnM9IC1sZmZpIgogCisgICAgaWYgeyBbc3RyaW5nIG1hdGNoICJhYXJjaDY0Ki0qLWxpbnV4KiIgJHRhcmdldF90cmlwbGV0XSB9IHsKKwlsYXBwZW5kIG9wdGlvbnMgImxpYnM9IC1scHRocmVhZCIKKyAgICB9CisKICAgICB2ZXJib3NlICJvcHRpb25zOiAkb3B0aW9ucyIKICAgICByZXR1cm4gW3RhcmdldF9jb21waWxlICRzb3VyY2UgJGRlc3QgJHR5cGUgJG9wdGlvbnNdCiB9CkBAIC0yNjYsNiArMjg1LDU2IEBACiAgICAgfQogfQogCitwcm9jIGNoZWNrLWZsYWdzIHsgYXJncyB9IHsKKworICAgICMgVGhlIGFyZ3MgYXJlIHdpdGhpbiBhbm90aGVyIGxpc3Q7IHB1bGwgdGhlbSBvdXQuCisgICAgc2V0IGFyZ3MgW2xpbmRleCAkYXJncyAwXQorCisgICAgIyBUaGUgbmV4dCB0d28gYXJndW1lbnRzIGFyZSBvcHRpb25hbC4gIElmIHRoZXkgd2VyZSBub3Qgc3BlY2lmaWVkLAorICAgICMgdXNlIHRoZSBkZWZhdWx0cy4KKyAgICBpZiB7IFtsbGVuZ3RoICRhcmdzXSA9PSAyIH0geworCWxhcHBlbmQgJGFyZ3MgW2xpc3QgIioiXQorICAgIH0KKyAgICBpZiB7IFtsbGVuZ3RoICRhcmdzXSA9PSAzIH0geworCWxhcHBlbmQgJGFyZ3MgW2xpc3QgIiJdCisgICAgfQorCisgICAgIyBJZiB0aGUgb3B0aW9uIHN0cmluZ3MgYXJlIHRoZSBkZWZhdWx0cywgb3IgdGhlIHNhbWUgYXMgdGhlCisgICAgIyBkZWZhdWx0cywgdGhlcmUgaXMgbm8gbmVlZCB0byBjYWxsIGNoZWNrX2NvbmRpdGlvbmFsX3hmYWlsIHRvCisgICAgIyBjb21wYXJlIHRoZW0gdG8gdGhlIGFjdHVhbCBvcHRpb25zLgorICAgIGlmIHsgW3N0cmluZyBjb21wYXJlIFtsaW5kZXggJGFyZ3MgMl0gIioiXSA9PSAwCisJICYmIFtzdHJpbmcgY29tcGFyZSBbbGluZGV4ICRhcmdzIDNdICIiIF0gPT0gMCB9IHsKKwlzZXQgcmVzdWx0IDEgICAgCisgICAgfSBlbHNlIHsKKwkjIFRoZSB0YXJnZXQgbGlzdCBtaWdodCBiZSBhbiBlZmZlY3RpdmUtdGFyZ2V0IGtleXdvcmQsIHNvIHJlcGxhY2UKKwkjIHRoZSBvcmlnaW5hbCBsaXN0IHdpdGggIiotKi0qIiwgc2luY2Ugd2UgYWxyZWFkeSBrbm93IGl0IG1hdGNoZXMuCisJc2V0IHJlc3VsdCBbY2hlY2tfY29uZGl0aW9uYWxfeGZhaWwgW2xyZXBsYWNlICRhcmdzIDEgMSAiKi0qLSoiXV0KKyAgICB9CisKKyAgICByZXR1cm4gJHJlc3VsdAorfQorCitwcm9jIGRnLXNraXAtaWYgeyBhcmdzIH0geworICAgICMgVmVyaWZ5IHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLiAgVGhlIGxhc3QgdHdvIGFyZSBvcHRpb25hbC4KKyAgICBzZXQgYXJncyBbbHJlcGxhY2UgJGFyZ3MgMCAwXQorICAgIGlmIHsgW2xsZW5ndGggJGFyZ3NdIDwgMiB8fCBbbGxlbmd0aCAkYXJnc10gPiA0IH0geworICAgICAgICBlcnJvciAiZGctc2tpcC1pZiAyOiBuZWVkIDIsIDMsIG9yIDQgYXJndW1lbnRzIgorICAgIH0KKworICAgICMgRG9uJ3QgYm90aGVyIGlmIHdlJ3JlIGFscmVhZHkgc2tpcHBpbmcgdGhlIHRlc3QuCisgICAgdXB2YXIgZGctZG8td2hhdCBkZy1kby13aGF0CisgICAgaWYgeyBbbGluZGV4ICR7ZGctZG8td2hhdH0gMV0gPT0gIk4iIH0geworICAgICAgcmV0dXJuCisgICAgfQorCisgICAgc2V0IHNlbGVjdG9yIFtsaXN0IHRhcmdldCBbbGluZGV4ICRhcmdzIDFdXQorICAgIGlmIHsgW2RnLXByb2Nlc3MtdGFyZ2V0ICRzZWxlY3Rvcl0gPT0gIlMiIH0geworICAgICAgICBpZiBbY2hlY2stZmxhZ3MgJGFyZ3NdIHsKKyAgICAgICAgICAgIHVwdmFyIGRnLWRvLXdoYXQgZGctZG8td2hhdAorICAgICAgICAgICAgc2V0IGRnLWRvLXdoYXQgW2xpc3QgW2xpbmRleCAke2RnLWRvLXdoYXR9IDBdICJOIiAiUCJdCisgICAgICAgIH0KKyAgICB9Cit9CiAKICMgV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBhZGRpdGlvbmFsX2ZpbGVzIGFuZCBhZGRpdGlvbmFsX3NvdXJjZXMKICMgYXJlIGJvdGggY2xlYXJlZCBvdXQgYWZ0ZXIgZXZlcnkgdGVzdC4gIEl0IGlzIG5vdCBlbm91Z2ggdG8gY2xlYXIKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYi90YXJnZXQtbGlicGF0aC5leHAgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWIvdGFyZ2V0LWxpYnBhdGguZXhwCmluZGV4IDg5OTlhYTQuLjZiN2JlYmEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYi90YXJnZXQtbGlicGF0aC5leHAKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliL3RhcmdldC1saWJwYXRoLmV4cApAQCAtMjUsNyArMjUsNyBAQAogc2V0IG9yaWdfbGRfbGlicmFyeV9wYXRoXzMyX3NhdmVkIDAKIHNldCBvcmlnX2xkX2xpYnJhcnlfcGF0aF82NF9zYXZlZCAwCiBzZXQgb3JpZ19keWxkX2xpYnJhcnlfcGF0aF9zYXZlZCAwCi0KK3NldCBvcmlnX3BhdGhfc2F2ZWQgMAogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgcHJvYyBzZXRfbGRfbGlicmFyeV9wYXRoX2Vudl92YXJzIHsgfQpAQCAtNDIsNiArNDIsNyBAQAogICBnbG9iYWwgb3JpZ19sZF9saWJyYXJ5X3BhdGhfMzJfc2F2ZWQKICAgZ2xvYmFsIG9yaWdfbGRfbGlicmFyeV9wYXRoXzY0X3NhdmVkCiAgIGdsb2JhbCBvcmlnX2R5bGRfbGlicmFyeV9wYXRoX3NhdmVkCisgIGdsb2JhbCBvcmlnX3BhdGhfc2F2ZWQKICAgZ2xvYmFsIG9yaWdfbGRfbGlicmFyeV9wYXRoCiAgIGdsb2JhbCBvcmlnX2xkX3J1bl9wYXRoCiAgIGdsb2JhbCBvcmlnX3NobGliX3BhdGgKQEAgLTUwLDYgKzUxLDcgQEAKICAgZ2xvYmFsIG9yaWdfbGRfbGlicmFyeV9wYXRoXzMyCiAgIGdsb2JhbCBvcmlnX2xkX2xpYnJhcnlfcGF0aF82NAogICBnbG9iYWwgb3JpZ19keWxkX2xpYnJhcnlfcGF0aAorICBnbG9iYWwgb3JpZ19wYXRoCiAgIGdsb2JhbCBHQ0NfRVhFQ19QUkVGSVgKIAogICAjIFNldCB0aGUgcmVsb2NhdGVkIGNvbXBpbGVyIHByZWZpeCwgYnV0IG9ubHkgaWYgdGhlIHVzZXIgaGFzbid0IHNwZWNpZmllZCBvbmUuCkBAIC0xMDAsNiArMTAyLDEwIEBACiAgICAgICBzZXQgb3JpZ19keWxkX2xpYnJhcnlfcGF0aCAiJGVudihEWUxEX0xJQlJBUllfUEFUSCkiCiAgICAgICBzZXQgb3JpZ19keWxkX2xpYnJhcnlfcGF0aF9zYXZlZCAxCiAgICAgfQorICAgIGlmIFtpbmZvIGV4aXN0cyBlbnYoUEFUSCldIHsKKyAgICAgIHNldCBvcmlnX3BhdGggIiRlbnYoUEFUSCkiCisgICAgICBzZXQgb3JpZ19wYXRoX3NhdmVkIDEKKyAgICB9CiAgIH0KIAogICAjIFdlIG5lZWQgdG8gc2V0IGxkIGxpYnJhcnkgcGF0aCBpbiB0aGUgZW52aXJvbm1lbnQuICBDdXJyZW50bHksCkBAIC0xNjksNiArMTc1LDEzIEBACiAgIH0gZWxzZSB7CiAgICAgc2V0ZW52IERZTERfTElCUkFSWV9QQVRIICIkbGRfbGlicmFyeV9wYXRoIgogICB9CisgIGlmIHsgW2lzdGFyZ2V0ICotKi1jeWd3aW4qXSB8fCBbaXN0YXJnZXQgKi0qLW1pbmd3Kl0gfSB7CisgICAgaWYgeyAkb3JpZ19wYXRoX3NhdmVkIH0geworICAgICAgc2V0ZW52IFBBVEggIiRsZF9saWJyYXJ5X3BhdGg6JG9yaWdfcGF0aCIKKyAgICB9IGVsc2UgeworICAgICAgc2V0ZW52IFBBVEggIiRsZF9saWJyYXJ5X3BhdGgiCisgICAgfQorICB9CiAKICAgdmVyYm9zZSAtbG9nICJzZXRfbGRfbGlicmFyeV9wYXRoX2Vudl92YXJzOiBsZF9saWJyYXJ5X3BhdGg9JGxkX2xpYnJhcnlfcGF0aCIKIH0KQEAgLTE4Nyw2ICsyMDAsNyBAQAogICBnbG9iYWwgb3JpZ19sZF9saWJyYXJ5X3BhdGhfMzJfc2F2ZWQKICAgZ2xvYmFsIG9yaWdfbGRfbGlicmFyeV9wYXRoXzY0X3NhdmVkCiAgIGdsb2JhbCBvcmlnX2R5bGRfbGlicmFyeV9wYXRoX3NhdmVkCisgIGdsb2JhbCBvcmlnX3BhdGhfc2F2ZWQKICAgZ2xvYmFsIG9yaWdfbGRfbGlicmFyeV9wYXRoCiAgIGdsb2JhbCBvcmlnX2xkX3J1bl9wYXRoCiAgIGdsb2JhbCBvcmlnX3NobGliX3BhdGgKQEAgLTE5NSw2ICsyMDksNyBAQAogICBnbG9iYWwgb3JpZ19sZF9saWJyYXJ5X3BhdGhfMzIKICAgZ2xvYmFsIG9yaWdfbGRfbGlicmFyeV9wYXRoXzY0CiAgIGdsb2JhbCBvcmlnX2R5bGRfbGlicmFyeV9wYXRoCisgIGdsb2JhbCBvcmlnX3BhdGgKIAogICBpZiB7ICRvcmlnX2Vudmlyb25tZW50X3NhdmVkID09IDAgfSB7CiAgICAgcmV0dXJuCkBAIC0yNDAsNiArMjU1LDExIEBACiAgIH0gZWxzZWlmIFtpbmZvIGV4aXN0cyBlbnYoRFlMRF9MSUJSQVJZX1BBVEgpXSB7CiAgICAgdW5zZXRlbnYgRFlMRF9MSUJSQVJZX1BBVEgKICAgfQorICBpZiB7ICRvcmlnX3BhdGhfc2F2ZWQgfSB7CisgICAgc2V0ZW52IFBBVEggIiRvcmlnX3BhdGgiCisgIH0gZWxzZWlmIFtpbmZvIGV4aXN0cyBlbnYoUEFUSCldIHsKKyAgICB1bnNldGVudiBQQVRICisgIH0KIH0KIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jYWxsLmV4cCBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2NhbGwuZXhwCmluZGV4IDFlOTk4NWUuLmMzMzQ2ODUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2NhbGwuZXhwCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2NhbGwuZXhwCkBAIC0xLDQgKzEsNCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIENvcHlyaWdodCAoQykgMjAwMywgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KIAogIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMTQsMjAgKzE0LDI1IEBACiAjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCiAjIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIAotIyBsaWJmZmkgdGVzdHN1aXRlIHRoYXQgdXNlcyB0aGUgJ2RnLmV4cCcgZHJpdmVyLgotCi1sb2FkX2xpYiBsaWJmZmktZGcuZXhwCi0KIGRnLWluaXQKIGxpYmZmaS1pbml0CiAKIGdsb2JhbCBzcmNkaXIgc3ViZGlyCiAKLWRnLXJ1bnRlc3QgW2xzb3J0IFtnbG9iIC1ub2NvbXBsYWluICRzcmNkaXIvJHN1YmRpci8qLlxbY1NcXV1dICItTzAgLVcgLVdhbGwiICIiCi1kZy1ydW50ZXN0IFtsc29ydCBbZ2xvYiAtbm9jb21wbGFpbiAkc3JjZGlyLyRzdWJkaXIvKi5cW2NTXF1dXSAiLU8yIiAiIgotZGctcnVudGVzdCBbbHNvcnQgW2dsb2IgLW5vY29tcGxhaW4gJHNyY2Rpci8kc3ViZGlyLyouXFtjU1xdXV0gIi1PMyIgIiIKLWRnLXJ1bnRlc3QgW2xzb3J0IFtnbG9iIC1ub2NvbXBsYWluICRzcmNkaXIvJHN1YmRpci8qLlxbY1NcXV1dICItT3MiICIiCi1kZy1ydW50ZXN0IFtsc29ydCBbZ2xvYiAtbm9jb21wbGFpbiAkc3JjZGlyLyRzdWJkaXIvKi5cW2NTXF1dXSAiLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIiAiIgoraWYgeyBbc3RyaW5nIG1hdGNoICR1c2luZ19nY2MgInllcyJdIH0geworCisgIGRnLXJ1bnRlc3QgW2xzb3J0IFtnbG9iIC1ub2NvbXBsYWluICRzcmNkaXIvJHN1YmRpci8qLlxbY1NcXV1dICItTzAgLVcgLVdhbGwiICIiCisgIGRnLXJ1bnRlc3QgW2xzb3J0IFtnbG9iIC1ub2NvbXBsYWluICRzcmNkaXIvJHN1YmRpci8qLlxbY1NcXV1dICItTzIiICIiCisgIGRnLXJ1bnRlc3QgW2xzb3J0IFtnbG9iIC1ub2NvbXBsYWluICRzcmNkaXIvJHN1YmRpci8qLlxbY1NcXV1dICItTzMiICIiCisgIGRnLXJ1bnRlc3QgW2xzb3J0IFtnbG9iIC1ub2NvbXBsYWluICRzcmNkaXIvJHN1YmRpci8qLlxbY1NcXV1dICItT3MiICIiCisgIGRnLXJ1bnRlc3QgW2xzb3J0IFtnbG9iIC1ub2NvbXBsYWluICRzcmNkaXIvJHN1YmRpci8qLlxbY1NcXV1dICItTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIiICIiCisgCit9IGVsc2UgeyAKKworICAjIEFzc3VtZSB3ZSBhcmUgdXNpbmcgdGhlIHZlbmRvciBjb21waWxlci4KKyAgZGctcnVudGVzdCBbbHNvcnQgW2dsb2IgLW5vY29tcGxhaW4gJHNyY2Rpci8kc3ViZGlyLyouXFtjU1xdXV0gIiIgIiIKKworfQogCiBkZy1maW5pc2gKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9zdGRjYWxsLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX3N0ZGNhbGwuYwppbmRleCA2YmZjYzFmLi4xNDA3ZjAyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX3N0ZGNhbGwuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX3N0ZGNhbGwuYwpAQCAtNDksOSArNDksMTcgQEAKICAgQ0hFQ0soZmZpX3ByZXBfY2xvc3VyZV9sb2MocGNsLCAmY2lmLCBjbG9zdXJlX3Rlc3Rfc3RkY2FsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgMyAvKiB1c2VyZGF0YSAqLywgY29kZSkgPT0gRkZJX09LKTsKIAorI2lmZGVmIF9NU0NfVkVSCisgIF9fYXNtIHsgbW92IHNwX3ByZSwgZXNwIH0KKyNlbHNlCiAgIGFzbSB2b2xhdGlsZSAoIiBtb3ZsICUlZXNwLCUwIiA6ICI9ZyIgKHNwX3ByZSkpOworI2VuZGlmCiAgIHJlcyA9ICgqKGNsb3N1cmVfdGVzdF90eXBlMCljb2RlKSgwLCAxLCAyLCAzKTsKKyNpZmRlZiBfTVNDX1ZFUgorICBfX2FzbSB7IG1vdiBzcF9wb3N0LCBlc3AgfQorI2Vsc2UKICAgYXNtIHZvbGF0aWxlICgiIG1vdmwgJSVlc3AsJTAiIDogIj1nIiAoc3BfcG9zdCkpOworI2VuZGlmCiAgIC8qIHsgZGctb3V0cHV0ICIwIDEgMiAzOiA5IiB9ICovCiAKICAgcHJpbnRmKCJyZXM6ICVkXG4iLHJlcyk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX3RoaXNjYWxsLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX3RoaXNjYWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY5MzY0OQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfdGhpc2NhbGwuYwpAQCAtMCwwICsxLDcyIEBACisvKiBBcmVhOgljbG9zdXJlX2NhbGwgKHRoaXNjYWxsIGNvbnZlbnRpb24pCisgICBQdXJwb3NlOglDaGVjayBoYW5kbGluZyB3aGVuIGNhbGxlciBleHBlY3RzIHRoaXNjYWxsIGNhbGxlZQorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOgk8a3RpZXR6QHJlZGhhdC5jb20+ICovCisKKy8qIHsgZGctZG8gcnVuIHsgdGFyZ2V0IGk/ODYtKi1jeWd3aW4qIGk/ODYtKi1taW5ndyogfSB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCitzdGF0aWMgdm9pZAorY2xvc3VyZV90ZXN0X3RoaXNjYWxsKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLCB2b2lkKiogYXJncywKKwkJICAgICAgdm9pZCogdXNlcmRhdGEpCit7CisgICooZmZpX2FyZyopcmVzcCA9CisgICAgKGludCkqKGludCAqKWFyZ3NbMF0gKyAoaW50KSgqKGludCAqKWFyZ3NbMV0pCisgICAgKyAoaW50KSgqKGludCAqKWFyZ3NbMl0pICArIChpbnQpKCooaW50ICopYXJnc1szXSkKKyAgICArIChpbnQpKGludHB0cl90KXVzZXJkYXRhOworCisgIHByaW50ZigiJWQgJWQgJWQgJWQ6ICVkXG4iLAorCSAoaW50KSooaW50ICopYXJnc1swXSwgKGludCkoKihpbnQgKilhcmdzWzFdKSwKKwkgKGludCkoKihpbnQgKilhcmdzWzJdKSwgKGludCkoKihpbnQgKilhcmdzWzNdKSwKKyAgICAgICAgIChpbnQpKihmZmlfYXJnICopcmVzcCk7CisKK30KKwordHlwZWRlZiBpbnQgKF9fdGhpc2NhbGwgKmNsb3N1cmVfdGVzdF90eXBlMCkoaW50LCBpbnQsIGludCwgaW50KTsKKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICB2b2lkICpjb2RlOworICBmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworICBmZmlfdHlwZSAqIGNsX2FyZ190eXBlc1sxN107CisgIGludCByZXM7CisgIHZvaWQqIHNwX3ByZTsKKyAgdm9pZCogc3BfcG9zdDsKKyAgY2hhciBidWZbMTAyNF07CisKKyAgY2xfYXJnX3R5cGVzWzBdID0gJmZmaV90eXBlX3VpbnQ7CisgIGNsX2FyZ190eXBlc1sxXSA9ICZmZmlfdHlwZV91aW50OworICBjbF9hcmdfdHlwZXNbMl0gPSAmZmZpX3R5cGVfdWludDsKKyAgY2xfYXJnX3R5cGVzWzNdID0gJmZmaV90eXBlX3VpbnQ7CisgIGNsX2FyZ190eXBlc1s0XSA9IE5VTEw7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgY2lmICovCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfVEhJU0NBTEwsIDQsCisJCSAgICAgJmZmaV90eXBlX3NpbnQsIGNsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsb3N1cmVfdGVzdF90aGlzY2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgMyAvKiB1c2VyZGF0YSAqLywgY29kZSkgPT0gRkZJX09LKTsKKworI2lmZGVmIF9NU0NfVkVSCisgIF9fYXNtIHsgbW92IHNwX3ByZSwgZXNwIH0KKyNlbHNlCisgIGFzbSB2b2xhdGlsZSAoIiBtb3ZsICUlZXNwLCUwIiA6ICI9ZyIgKHNwX3ByZSkpOworI2VuZGlmCisgIHJlcyA9ICgqKGNsb3N1cmVfdGVzdF90eXBlMCljb2RlKSgwLCAxLCAyLCAzKTsKKyNpZmRlZiBfTVNDX1ZFUgorICBfX2FzbSB7IG1vdiBzcF9wb3N0LCBlc3AgfQorI2Vsc2UKKyAgYXNtIHZvbGF0aWxlICgiIG1vdmwgJSVlc3AsJTAiIDogIj1nIiAoc3BfcG9zdCkpOworI2VuZGlmCisgIC8qIHsgZGctb3V0cHV0ICIwIDEgMiAzOiA5IiB9ICovCisKKyAgcHJpbnRmKCJyZXM6ICVkXG4iLHJlcyk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogOSIgfSAqLworCisgIHNwcmludGYoYnVmLCAibWlzbWF0Y2g6IHByZT0lcCB2cyBwb3N0PSVwIiwgc3BfcHJlLCBzcF9wb3N0KTsKKyAgcHJpbnRmKCJzdGFjayBwb2ludGVyICVzXG4iLCAoc3BfcHJlID09IHNwX3Bvc3QgPyAibWF0Y2giIDogYnVmKSk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnN0YWNrIHBvaW50ZXIgbWF0Y2giIH0gKi8KKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xMmJ5dGUuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xMmJ5dGUuYwppbmRleCBmMGEzMzRmLi5lYTA4MjVkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMTJieXRlLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzEyYnl0ZS5jCkBAIC00OSwxNSArNDksMTUgQEAKICAgZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlOwogICBmZmlfdHlwZSogZGJsX2FyZ190eXBlc1s1XTsKIAorICBzdHJ1Y3QgY2xzX3N0cnVjdF8xMmJ5dGUgaF9kYmwgPSB7IDcsIDQsIDkgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMTJieXRlIGpfZGJsID0geyAxLCA1LCAzIH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzEyYnl0ZSByZXNfZGJsOworCiAgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKICAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwogICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKIAotICBzdHJ1Y3QgY2xzX3N0cnVjdF8xMmJ5dGUgaF9kYmwgPSB7IDcsIDQsIDkgfTsKLSAgc3RydWN0IGNsc19zdHJ1Y3RfMTJieXRlIGpfZGJsID0geyAxLCA1LCAzIH07Ci0gIHN0cnVjdCBjbHNfc3RydWN0XzEyYnl0ZSByZXNfZGJsOwotCiAgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX3NpbnQ7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX3NpbnQ7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzJdID0gJmZmaV90eXBlX3NpbnQ7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMTZieXRlLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMTZieXRlLmMKaW5kZXggOWI5MjkyYS4uODlhMDhhMiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzE2Ynl0ZS5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xNmJ5dGUuYwpAQCAtNTAsMTUgKzUwLDE1IEBACiAgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZTsKICAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbNV07CiAKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMTZieXRlIGhfZGJsID0geyA3LCA4LjAsIDkgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMTZieXRlIGpfZGJsID0geyAxLCA5LjAsIDMgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMTZieXRlIHJlc19kYmw7CisKICAgY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOwogICBjbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKICAgY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CiAgIGNsc19zdHJ1Y3RfdHlwZS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzOwogCi0gIHN0cnVjdCBjbHNfc3RydWN0XzE2Ynl0ZSBoX2RibCA9IHsgNywgOC4wLCA5IH07Ci0gIHN0cnVjdCBjbHNfc3RydWN0XzE2Ynl0ZSBqX2RibCA9IHsgMSwgOS4wLCAzIH07Ci0gIHN0cnVjdCBjbHNfc3RydWN0XzE2Ynl0ZSByZXNfZGJsOwotCiAgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX3NpbnQ7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX2RvdWJsZTsKICAgY2xzX3N0cnVjdF9maWVsZHNbMl0gPSAmZmZpX3R5cGVfc2ludDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xOGJ5dGUuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xOGJ5dGUuYwppbmRleCA0MGM4YzZkLi45Zjc1ZGE4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMThieXRlLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzE4Ynl0ZS5jCkBAIC01NCwxNSArNTQsMTUgQEAKICAgZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlOwogICBmZmlfdHlwZSogZGJsX2FyZ190eXBlc1szXTsKIAorICBzdHJ1Y3QgY2xzX3N0cnVjdF8xOGJ5dGUgZ19kYmwgPSB7IDEuMCwgMTI3LCAxMjYsIDMuMCB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF8xOGJ5dGUgZl9kYmwgPSB7IDQuMCwgMTI1LCAxMjQsIDUuMCB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF8xOGJ5dGUgcmVzX2RibDsKKwogICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOwogICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKICAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CiAKLSAgc3RydWN0IGNsc19zdHJ1Y3RfMThieXRlIGdfZGJsID0geyAxLjAsIDEyNywgMTI2LCAzLjAgfTsKLSAgc3RydWN0IGNsc19zdHJ1Y3RfMThieXRlIGZfZGJsID0geyA0LjAsIDEyNSwgMTI0LCA1LjAgfTsKLSAgc3RydWN0IGNsc19zdHJ1Y3RfMThieXRlIHJlc19kYmw7Ci0KICAgY2xzX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfZG91YmxlOwogICBjbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV91Y2hhcjsKICAgY2xzX3N0cnVjdF9maWVsZHNbMl0gPSAmZmZpX3R5cGVfdWNoYXI7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMTlieXRlLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMTlieXRlLmMKaW5kZXggYWE2NDI0OC4uMjc4Nzk0YiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzE5Ynl0ZS5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xOWJ5dGUuYwpAQCAtNTcsMTUgKzU3LDE1IEBACiAgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZTsKICAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbM107CiAKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMTlieXRlIGdfZGJsID0geyAxLjAsIDEyNywgMTI2LCAzLjAsIDEyMCB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF8xOWJ5dGUgZl9kYmwgPSB7IDQuMCwgMTI1LCAxMjQsIDUuMCwgMTE5IH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzE5Ynl0ZSByZXNfZGJsOworCiAgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKICAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwogICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKIAotICBzdHJ1Y3QgY2xzX3N0cnVjdF8xOWJ5dGUgZ19kYmwgPSB7IDEuMCwgMTI3LCAxMjYsIDMuMCwgMTIwIH07Ci0gIHN0cnVjdCBjbHNfc3RydWN0XzE5Ynl0ZSBmX2RibCA9IHsgNC4wLCAxMjUsIDEyNCwgNS4wLCAxMTkgfTsKLSAgc3RydWN0IGNsc19zdHJ1Y3RfMTlieXRlIHJlc19kYmw7Ci0KICAgY2xzX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfZG91YmxlOwogICBjbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV91Y2hhcjsKICAgY2xzX3N0cnVjdF9maWVsZHNbMl0gPSAmZmZpX3R5cGVfdWNoYXI7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMV8xYnl0ZS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzFfMWJ5dGUuYwppbmRleCBiOTQwMmQ2Li44MjQ5MmMwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMV8xYnl0ZS5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xXzFieXRlLmMKQEAgLTUwLDE1ICs1MCwxNSBAQAogICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CiAgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzVdOwogCisgIHN0cnVjdCBjbHNfc3RydWN0XzFfMWJ5dGUgZ19kYmwgPSB7IDEyIH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzFfMWJ5dGUgZl9kYmwgPSB7IDE3OCB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF8xXzFieXRlIHJlc19kYmw7CisKICAgY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOwogICBjbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKICAgY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CiAgIGNsc19zdHJ1Y3RfdHlwZS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzOwogCi0gIHN0cnVjdCBjbHNfc3RydWN0XzFfMWJ5dGUgZ19kYmwgPSB7IDEyIH07Ci0gIHN0cnVjdCBjbHNfc3RydWN0XzFfMWJ5dGUgZl9kYmwgPSB7IDE3OCB9OwotICBzdHJ1Y3QgY2xzX3N0cnVjdF8xXzFieXRlIHJlc19kYmw7Ci0KICAgY2xzX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfdWNoYXI7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzIwYnl0ZS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzIwYnl0ZS5jCmluZGV4IDgwZGQ3YWMuLjNmOGJiMjggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18yMGJ5dGUuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMjBieXRlLmMKQEAgLTUwLDE1ICs1MCwxNSBAQAogICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CiAgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzVdOwogCisgIHN0cnVjdCBjbHNfc3RydWN0XzIwYnl0ZSBnX2RibCA9IHsgMS4wLCAyLjAsIDMgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMjBieXRlIGZfZGJsID0geyA0LjAsIDUuMCwgNyB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF8yMGJ5dGUgcmVzX2RibDsKKwogICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOwogICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKICAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CiAKLSAgc3RydWN0IGNsc19zdHJ1Y3RfMjBieXRlIGdfZGJsID0geyAxLjAsIDIuMCwgMyB9OwotICBzdHJ1Y3QgY2xzX3N0cnVjdF8yMGJ5dGUgZl9kYmwgPSB7IDQuMCwgNS4wLCA3IH07Ci0gIHN0cnVjdCBjbHNfc3RydWN0XzIwYnl0ZSByZXNfZGJsOwotCiAgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX2RvdWJsZTsKICAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfZG91YmxlOwogICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9ICZmZmlfdHlwZV9zaW50OwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzIwYnl0ZTEuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18yMGJ5dGUxLmMKaW5kZXggNTBiY2JiZi4uNjU2MjcyNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzIwYnl0ZTEuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMjBieXRlMS5jCkBAIC01MiwxNSArNTIsMTUgQEAKICAgZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlOwogICBmZmlfdHlwZSogZGJsX2FyZ190eXBlc1szXTsKIAorICBzdHJ1Y3QgY2xzX3N0cnVjdF8yMGJ5dGUgZ19kYmwgPSB7IDEsIDIuMCwgMy4wIH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzIwYnl0ZSBmX2RibCA9IHsgNCwgNS4wLCA3LjAgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMjBieXRlIHJlc19kYmw7CisKICAgY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOwogICBjbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKICAgY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CiAgIGNsc19zdHJ1Y3RfdHlwZS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzOwogCi0gIHN0cnVjdCBjbHNfc3RydWN0XzIwYnl0ZSBnX2RibCA9IHsgMSwgMi4wLCAzLjAgfTsKLSAgc3RydWN0IGNsc19zdHJ1Y3RfMjBieXRlIGZfZGJsID0geyA0LCA1LjAsIDcuMCB9OwotICBzdHJ1Y3QgY2xzX3N0cnVjdF8yMGJ5dGUgcmVzX2RibDsKLQogICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV9zaW50OwogICBjbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV9kb3VibGU7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzJdID0gJmZmaV90eXBlX2RvdWJsZTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18yNGJ5dGUuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18yNGJ5dGUuYwppbmRleCA0NmE2ZWI0Li4xZDgyZjZlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMjRieXRlLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzI0Ynl0ZS5jCkBAIC02MSwxNyArNjEsMTcgQEAKICAgZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlOwogICBmZmlfdHlwZSogZGJsX2FyZ190eXBlc1s1XTsKIAotICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7Ci0gIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOwotICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKLSAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7Ci0KICAgc3RydWN0IGNsc19zdHJ1Y3RfMjRieXRlIGVfZGJsID0geyA5LjAsIDIuMCwgNiwgNS4wIH07CiAgIHN0cnVjdCBjbHNfc3RydWN0XzI0Ynl0ZSBmX2RibCA9IHsgMS4wLCAyLjAsIDMsIDcuMCB9OwogICBzdHJ1Y3QgY2xzX3N0cnVjdF8yNGJ5dGUgZ19kYmwgPSB7IDQuMCwgNS4wLCA3LCA5LjAgfTsKICAgc3RydWN0IGNsc19zdHJ1Y3RfMjRieXRlIGhfZGJsID0geyA4LjAsIDYuMCwgMSwgNC4wIH07CiAgIHN0cnVjdCBjbHNfc3RydWN0XzI0Ynl0ZSByZXNfZGJsOwogCisgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKKwogICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV9kb3VibGU7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX2RvdWJsZTsKICAgY2xzX3N0cnVjdF9maWVsZHNbMl0gPSAmZmZpX3R5cGVfc2ludDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18yYnl0ZS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzJieXRlLmMKaW5kZXggMTAxZTEzMC4uODFiYjBhNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzJieXRlLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzJieXRlLmMKQEAgLTUwLDE1ICs1MCwxNSBAQAogICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CiAgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzVdOwogCisgIHN0cnVjdCBjbHNfc3RydWN0XzJieXRlIGdfZGJsID0geyAxMiwgMTI3IH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzJieXRlIGZfZGJsID0geyAxLCAxMyB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF8yYnl0ZSByZXNfZGJsOworCiAgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKICAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwogICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKIAotICBzdHJ1Y3QgY2xzX3N0cnVjdF8yYnl0ZSBnX2RibCA9IHsgMTIsIDEyNyB9OwotICBzdHJ1Y3QgY2xzX3N0cnVjdF8yYnl0ZSBmX2RibCA9IHsgMSwgMTMgfTsKLSAgc3RydWN0IGNsc19zdHJ1Y3RfMmJ5dGUgcmVzX2RibDsKLQogICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91Y2hhcjsKICAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfdWNoYXI7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzJdID0gTlVMTDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18zXzFieXRlLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfM18xYnl0ZS5jCmluZGV4IGZjNzgwYzMuLmI3ODI3NDYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18zXzFieXRlLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzNfMWJ5dGUuYwpAQCAtNTQsMTUgKzU0LDE1IEBACiAgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZTsKICAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbNV07CiAKKyAgc3RydWN0IGNsc19zdHJ1Y3RfM18xYnl0ZSBnX2RibCA9IHsgMTIsIDEzLCAxNCB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF8zXzFieXRlIGZfZGJsID0geyAxNzgsIDE3OSwgMTgwIH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzNfMWJ5dGUgcmVzX2RibDsKKwogICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOwogICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKICAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CiAKLSAgc3RydWN0IGNsc19zdHJ1Y3RfM18xYnl0ZSBnX2RibCA9IHsgMTIsIDEzLCAxNCB9OwotICBzdHJ1Y3QgY2xzX3N0cnVjdF8zXzFieXRlIGZfZGJsID0geyAxNzgsIDE3OSwgMTgwIH07Ci0gIHN0cnVjdCBjbHNfc3RydWN0XzNfMWJ5dGUgcmVzX2RibDsKLQogICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91Y2hhcjsKICAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfdWNoYXI7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzJdID0gJmZmaV90eXBlX3VjaGFyOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzNieXRlMS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzNieXRlMS5jCmluZGV4IDU3MDVjZTMuLmEwMmM0NjMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18zYnl0ZTEuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfM2J5dGUxLmMKQEAgLTUwLDE1ICs1MCwxNSBAQAogICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CiAgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzVdOwogCisgIHN0cnVjdCBjbHNfc3RydWN0XzNieXRlIGdfZGJsID0geyAxMiwgMTE5IH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzNieXRlIGZfZGJsID0geyAxLCAxNSB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF8zYnl0ZSByZXNfZGJsOworCiAgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKICAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwogICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKIAotICBzdHJ1Y3QgY2xzX3N0cnVjdF8zYnl0ZSBnX2RibCA9IHsgMTIsIDExOSB9OwotICBzdHJ1Y3QgY2xzX3N0cnVjdF8zYnl0ZSBmX2RibCA9IHsgMSwgMTUgfTsKLSAgc3RydWN0IGNsc19zdHJ1Y3RfM2J5dGUgcmVzX2RibDsKLQogICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91c2hvcnQ7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX3VjaGFyOwogICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9IE5VTEw7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfM2J5dGUyLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfM2J5dGUyLmMKaW5kZXggMDE3NzBhMC4uYzcyNTFjZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzNieXRlMi5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18zYnl0ZTIuYwpAQCAtNTAsMTUgKzUwLDE1IEBACiAgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZTsKICAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbNV07CiAKKyAgc3RydWN0IGNsc19zdHJ1Y3RfM2J5dGVfMSBnX2RibCA9IHsgMTUsIDEyNSB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF8zYnl0ZV8xIGZfZGJsID0geyA5LCAxOSB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF8zYnl0ZV8xIHJlc19kYmw7CisKICAgY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOwogICBjbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKICAgY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CiAgIGNsc19zdHJ1Y3RfdHlwZS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzOwogCi0gIHN0cnVjdCBjbHNfc3RydWN0XzNieXRlXzEgZ19kYmwgPSB7IDE1LCAxMjUgfTsKLSAgc3RydWN0IGNsc19zdHJ1Y3RfM2J5dGVfMSBmX2RibCA9IHsgOSwgMTkgfTsKLSAgc3RydWN0IGNsc19zdHJ1Y3RfM2J5dGVfMSByZXNfZGJsOwotCiAgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX3VjaGFyOwogICBjbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV91c2hvcnQ7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzJdID0gTlVMTDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc180XzFieXRlLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNF8xYnl0ZS5jCmluZGV4IGYzODA2ZDcuLjJkNmQ4YjYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc180XzFieXRlLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzRfMWJ5dGUuYwpAQCAtNTYsMTUgKzU2LDE1IEBACiAgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZTsKICAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbNV07CiAKKyAgc3RydWN0IGNsc19zdHJ1Y3RfNF8xYnl0ZSBnX2RibCA9IHsgMTIsIDEzLCAxNCwgMTUgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfNF8xYnl0ZSBmX2RibCA9IHsgMTc4LCAxNzksIDE4MCwgMTgxIH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzRfMWJ5dGUgcmVzX2RibDsKKwogICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOwogICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKICAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CiAKLSAgc3RydWN0IGNsc19zdHJ1Y3RfNF8xYnl0ZSBnX2RibCA9IHsgMTIsIDEzLCAxNCwgMTUgfTsKLSAgc3RydWN0IGNsc19zdHJ1Y3RfNF8xYnl0ZSBmX2RibCA9IHsgMTc4LCAxNzksIDE4MCwgMTgxIH07Ci0gIHN0cnVjdCBjbHNfc3RydWN0XzRfMWJ5dGUgcmVzX2RibDsKLQogICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91Y2hhcjsKICAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfdWNoYXI7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzJdID0gJmZmaV90eXBlX3VjaGFyOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzRieXRlLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNGJ5dGUuYwppbmRleCBhMWFiYTNjLi40YWMzNzg3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNGJ5dGUuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNGJ5dGUuYwpAQCAtNTAsMTUgKzUwLDE1IEBACiAgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZTsKICAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbNV07CiAKKyAgc3RydWN0IGNsc19zdHJ1Y3RfNGJ5dGUgZ19kYmwgPSB7IDEyNywgMTIwIH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzRieXRlIGZfZGJsID0geyAxMiwgMTI4IH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzRieXRlIHJlc19kYmw7CisKICAgY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOwogICBjbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKICAgY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CiAgIGNsc19zdHJ1Y3RfdHlwZS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzOwogCi0gIHN0cnVjdCBjbHNfc3RydWN0XzRieXRlIGdfZGJsID0geyAxMjcsIDEyMCB9OwotICBzdHJ1Y3QgY2xzX3N0cnVjdF80Ynl0ZSBmX2RibCA9IHsgMTIsIDEyOCB9OwotICBzdHJ1Y3QgY2xzX3N0cnVjdF80Ynl0ZSByZXNfZGJsOwotCiAgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX3VzaG9ydDsKICAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfdXNob3J0OwogICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9IE5VTEw7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNV8xX2J5dGUuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc181XzFfYnl0ZS5jCmluZGV4IDJjZWJhM2QuLmFkOWQ1MWMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc181XzFfYnl0ZS5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc181XzFfYnl0ZS5jCkBAIC01OCwxNSArNTgsMTUgQEAKICAgZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlOwogICBmZmlfdHlwZSogZGJsX2FyZ190eXBlc1s1XTsKIAorICBzdHJ1Y3QgY2xzX3N0cnVjdF81Ynl0ZSBnX2RibCA9IHsgMTI3LCAxMjAsIDEsIDMsIDQgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfNWJ5dGUgZl9kYmwgPSB7IDEyLCAxMjgsIDksIDMsIDQgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfNWJ5dGUgcmVzX2RibCA9IHsgMCwgMCwgMCwgMCwgMCB9OworCiAgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKICAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwogICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKIAotICBzdHJ1Y3QgY2xzX3N0cnVjdF81Ynl0ZSBnX2RibCA9IHsgMTI3LCAxMjAsIDEsIDMsIDQgfTsKLSAgc3RydWN0IGNsc19zdHJ1Y3RfNWJ5dGUgZl9kYmwgPSB7IDEyLCAxMjgsIDksIDMsIDQgfTsKLSAgc3RydWN0IGNsc19zdHJ1Y3RfNWJ5dGUgcmVzX2RibCA9IHsgMCwgMCwgMCwgMCwgMCB9OwotCiAgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX3VjaGFyOwogICBjbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV91Y2hhcjsKICAgY2xzX3N0cnVjdF9maWVsZHNbMl0gPSAmZmZpX3R5cGVfdWNoYXI7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNWJ5dGUuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc181Ynl0ZS5jCmluZGV4IDYxZDU5NWMuLjRlMGMwMDAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc181Ynl0ZS5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc181Ynl0ZS5jCkBAIC01MywxNSArNTMsMTUgQEAKICAgZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlOwogICBmZmlfdHlwZSogZGJsX2FyZ190eXBlc1s1XTsKIAorICBzdHJ1Y3QgY2xzX3N0cnVjdF81Ynl0ZSBnX2RibCA9IHsgMTI3LCAxMjAsIDEgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfNWJ5dGUgZl9kYmwgPSB7IDEyLCAxMjgsIDkgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfNWJ5dGUgcmVzX2RibCA9IHsgMCwgMCwgMCB9OworCiAgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKICAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwogICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKIAotICBzdHJ1Y3QgY2xzX3N0cnVjdF81Ynl0ZSBnX2RibCA9IHsgMTI3LCAxMjAsIDEgfTsKLSAgc3RydWN0IGNsc19zdHJ1Y3RfNWJ5dGUgZl9kYmwgPSB7IDEyLCAxMjgsIDkgfTsKLSAgc3RydWN0IGNsc19zdHJ1Y3RfNWJ5dGUgcmVzX2RibCA9IHsgMCwgMCwgMCB9OwotCiAgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX3VzaG9ydDsKICAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfdXNob3J0OwogICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9ICZmZmlfdHlwZV91Y2hhcjsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc182NGJ5dGUuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc182NGJ5dGUuYwppbmRleCA1NzZlYmUwLi5hNTVlZGMyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNjRieXRlLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzY0Ynl0ZS5jCkBAIC02NiwxNyArNjYsMTcgQEAKICAgZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlOwogICBmZmlfdHlwZSogZGJsX2FyZ190eXBlc1s1XTsKIAotICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7Ci0gIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOwotICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKLSAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7Ci0KICAgc3RydWN0IGNsc19zdHJ1Y3RfNjRieXRlIGVfZGJsID0geyA5LjAsIDIuMCwgNi4wLCA1LjAsIDMuMCwgNC4wLCA4LjAsIDEuMCB9OwogICBzdHJ1Y3QgY2xzX3N0cnVjdF82NGJ5dGUgZl9kYmwgPSB7IDEuMCwgMi4wLCAzLjAsIDcuMCwgMi4wLCA1LjAsIDYuMCwgNy4wIH07CiAgIHN0cnVjdCBjbHNfc3RydWN0XzY0Ynl0ZSBnX2RibCA9IHsgNC4wLCA1LjAsIDcuMCwgOS4wLCAxLjAsIDEuMCwgMi4wLCA5LjAgfTsKICAgc3RydWN0IGNsc19zdHJ1Y3RfNjRieXRlIGhfZGJsID0geyA4LjAsIDYuMCwgMS4wLCA0LjAsIDAuMCwgMy4wLCAzLjAsIDEuMCB9OwogICBzdHJ1Y3QgY2xzX3N0cnVjdF82NGJ5dGUgcmVzX2RibDsKIAorICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOworICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CisKICAgY2xzX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfZG91YmxlOwogICBjbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV9kb3VibGU7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzJdID0gJmZmaV90eXBlX2RvdWJsZTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc182XzFfYnl0ZS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzZfMV9ieXRlLmMKaW5kZXggOWYyZWZmNi4uYjRkY2RiYSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzZfMV9ieXRlLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzZfMV9ieXRlLmMKQEAgLTYwLDE1ICs2MCwxNSBAQAogICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CiAgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzVdOwogCisgIHN0cnVjdCBjbHNfc3RydWN0XzZieXRlIGdfZGJsID0geyAxMjcsIDEyMCwgMSwgMywgNCwgNSB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF82Ynl0ZSBmX2RibCA9IHsgMTIsIDEyOCwgOSwgMywgNCwgNSB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF82Ynl0ZSByZXNfZGJsID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CisKICAgY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOwogICBjbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKICAgY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CiAgIGNsc19zdHJ1Y3RfdHlwZS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzOwogCi0gIHN0cnVjdCBjbHNfc3RydWN0XzZieXRlIGdfZGJsID0geyAxMjcsIDEyMCwgMSwgMywgNCwgNSB9OwotICBzdHJ1Y3QgY2xzX3N0cnVjdF82Ynl0ZSBmX2RibCA9IHsgMTIsIDEyOCwgOSwgMywgNCwgNSB9OwotICBzdHJ1Y3QgY2xzX3N0cnVjdF82Ynl0ZSByZXNfZGJsID0geyAwLCAwLCAwLCAwLCAwLCAwIH07Ci0KICAgY2xzX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfdWNoYXI7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX3VjaGFyOwogICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9ICZmZmlfdHlwZV91Y2hhcjsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc182Ynl0ZS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzZieXRlLmMKaW5kZXggNzMyNTdiMC4uNzQwNjc4MCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzZieXRlLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzZieXRlLmMKQEAgLTU2LDE1ICs1NiwxNSBAQAogICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CiAgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzVdOwogCisgIHN0cnVjdCBjbHNfc3RydWN0XzZieXRlIGdfZGJsID0geyAxMjcsIDEyMCwgMSwgMTI4IH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzZieXRlIGZfZGJsID0geyAxMiwgMTI4LCA5LCAxMjcgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfNmJ5dGUgcmVzX2RibDsKKwogICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOwogICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKICAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CiAKLSAgc3RydWN0IGNsc19zdHJ1Y3RfNmJ5dGUgZ19kYmwgPSB7IDEyNywgMTIwLCAxLCAxMjggfTsKLSAgc3RydWN0IGNsc19zdHJ1Y3RfNmJ5dGUgZl9kYmwgPSB7IDEyLCAxMjgsIDksIDEyNyB9OwotICBzdHJ1Y3QgY2xzX3N0cnVjdF82Ynl0ZSByZXNfZGJsOwotCiAgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX3VzaG9ydDsKICAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfdXNob3J0OwogICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9ICZmZmlfdHlwZV91Y2hhcjsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc183XzFfYnl0ZS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzdfMV9ieXRlLmMKaW5kZXggNTBkMDljOS4uMTRhN2U5NiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzdfMV9ieXRlLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzdfMV9ieXRlLmMKQEAgLTYyLDE1ICs2MiwxNSBAQAogICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CiAgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzVdOwogCisgIHN0cnVjdCBjbHNfc3RydWN0XzdieXRlIGdfZGJsID0geyAxMjcsIDEyMCwgMSwgMywgNCwgNSwgNiB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF83Ynl0ZSBmX2RibCA9IHsgMTIsIDEyOCwgOSwgMywgNCwgNSwgNiB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF83Ynl0ZSByZXNfZGJsID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CisKICAgY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOwogICBjbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKICAgY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CiAgIGNsc19zdHJ1Y3RfdHlwZS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzOwogCi0gIHN0cnVjdCBjbHNfc3RydWN0XzdieXRlIGdfZGJsID0geyAxMjcsIDEyMCwgMSwgMywgNCwgNSwgNiB9OwotICBzdHJ1Y3QgY2xzX3N0cnVjdF83Ynl0ZSBmX2RibCA9IHsgMTIsIDEyOCwgOSwgMywgNCwgNSwgNiB9OwotICBzdHJ1Y3QgY2xzX3N0cnVjdF83Ynl0ZSByZXNfZGJsID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwIH07Ci0KICAgY2xzX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfdWNoYXI7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX3VjaGFyOwogICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9ICZmZmlfdHlwZV91Y2hhcjsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc183Ynl0ZS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzdieXRlLmMKaW5kZXggZjVjMDAwMC4uMTY0NWNjNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzdieXRlLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzdieXRlLmMKQEAgLTU1LDE1ICs1NSwxNSBAQAogICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CiAgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzVdOwogCisgIHN0cnVjdCBjbHNfc3RydWN0XzdieXRlIGdfZGJsID0geyAxMjcsIDEyMCwgMSwgMjU0IH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzdieXRlIGZfZGJsID0geyAxMiwgMTI4LCA5LCAyNTUgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfN2J5dGUgcmVzX2RibDsKKwogICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOwogICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKICAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CiAKLSAgc3RydWN0IGNsc19zdHJ1Y3RfN2J5dGUgZ19kYmwgPSB7IDEyNywgMTIwLCAxLCAyNTQgfTsKLSAgc3RydWN0IGNsc19zdHJ1Y3RfN2J5dGUgZl9kYmwgPSB7IDEyLCAxMjgsIDksIDI1NSB9OwotICBzdHJ1Y3QgY2xzX3N0cnVjdF83Ynl0ZSByZXNfZGJsOwotCiAgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX3VzaG9ydDsKICAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfdXNob3J0OwogICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9ICZmZmlfdHlwZV91Y2hhcjsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc184Ynl0ZS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzhieXRlLmMKaW5kZXggNGFhOTlkMS4uZjZjMWVhNSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzhieXRlLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzhieXRlLmMKQEAgLTQ5LDE1ICs0OSwxNSBAQAogICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CiAgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzVdOwogCisgIHN0cnVjdCBjbHNfc3RydWN0XzhieXRlIGdfZGJsID0geyAxLCAyLjAgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfOGJ5dGUgZl9kYmwgPSB7IDQsIDUuMCB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF84Ynl0ZSByZXNfZGJsOworCiAgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKICAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwogICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKIAotICBzdHJ1Y3QgY2xzX3N0cnVjdF84Ynl0ZSBnX2RibCA9IHsgMSwgMi4wIH07Ci0gIHN0cnVjdCBjbHNfc3RydWN0XzhieXRlIGZfZGJsID0geyA0LCA1LjAgfTsKLSAgc3RydWN0IGNsc19zdHJ1Y3RfOGJ5dGUgcmVzX2RibDsKLQogICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV9zaW50OwogICBjbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV9mbG9hdDsKICAgY2xzX3N0cnVjdF9maWVsZHNbMl0gPSBOVUxMOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzlieXRlMS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzlieXRlMS5jCmluZGV4IGNjNWU5ZDYuLjBiODU3MjIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc185Ynl0ZTEuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfOWJ5dGUxLmMKQEAgLTUwLDE1ICs1MCwxNSBAQAogICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CiAgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzNdOwogCisgIHN0cnVjdCBjbHNfc3RydWN0XzlieXRlIGhfZGJsID0geyA3LCA4LjB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF85Ynl0ZSBqX2RibCA9IHsgMSwgOS4wfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfOWJ5dGUgcmVzX2RibDsKKwogICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOwogICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKICAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CiAKLSAgc3RydWN0IGNsc19zdHJ1Y3RfOWJ5dGUgaF9kYmwgPSB7IDcsIDguMH07Ci0gIHN0cnVjdCBjbHNfc3RydWN0XzlieXRlIGpfZGJsID0geyAxLCA5LjB9OwotICBzdHJ1Y3QgY2xzX3N0cnVjdF85Ynl0ZSByZXNfZGJsOwotCiAgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX3NpbnQ7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX2RvdWJsZTsKICAgY2xzX3N0cnVjdF9maWVsZHNbMl0gPSBOVUxMOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzlieXRlMi5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzlieXRlMi5jCmluZGV4IDVjMGJhMGQuLmVkZjk5MWQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc185Ynl0ZTIuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfOWJ5dGUyLmMKQEAgLTUwLDE1ICs1MCwxNSBAQAogICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CiAgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzNdOwogCisgIHN0cnVjdCBjbHNfc3RydWN0XzlieXRlIGhfZGJsID0geyA3LjAsIDh9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF85Ynl0ZSBqX2RibCA9IHsgMS4wLCA5fTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfOWJ5dGUgcmVzX2RibDsKKwogICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOwogICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKICAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CiAKLSAgc3RydWN0IGNsc19zdHJ1Y3RfOWJ5dGUgaF9kYmwgPSB7IDcuMCwgOH07Ci0gIHN0cnVjdCBjbHNfc3RydWN0XzlieXRlIGpfZGJsID0geyAxLjAsIDl9OwotICBzdHJ1Y3QgY2xzX3N0cnVjdF85Ynl0ZSByZXNfZGJsOwotCiAgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX2RvdWJsZTsKICAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfc2ludDsKICAgY2xzX3N0cnVjdF9maWVsZHNbMl0gPSBOVUxMOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2RvdWJsZS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2RvdWJsZS5jCmluZGV4IDIyYjk0ZDUuLmFhZDVmM2MgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9kb3VibGUuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fZG91YmxlLmMKQEAgLTUyLDE1ICs1MiwxNSBAQAogICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CiAgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzVdOwogCisgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGdfZGJsID0geyAxMiwgNDk1MSwgMTI3IH07CisgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGZfZGJsID0geyAxLCA5MzIwLCAxMyB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiByZXNfZGJsOworCiAgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKICAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwogICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKIAotICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBnX2RibCA9IHsgMTIsIDQ5NTEsIDEyNyB9OwotICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBmX2RibCA9IHsgMSwgOTMyMCwgMTMgfTsKLSAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gcmVzX2RibDsKLQogICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91Y2hhcjsKICAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfZG91YmxlOwogICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9ICZmZmlfdHlwZV91Y2hhcjsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9mbG9hdC5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2Zsb2F0LmMKaW5kZXggNjI2MzdmMi4uMzdlMDg1NSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2Zsb2F0LmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2Zsb2F0LmMKQEAgLTUwLDE1ICs1MCwxNSBAQAogICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CiAgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzVdOwogCisgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGdfZGJsID0geyAxMiwgNDk1MSwgMTI3IH07CisgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGZfZGJsID0geyAxLCA5MzIwLCAxMyB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiByZXNfZGJsOworCiAgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKICAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwogICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKIAotICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBnX2RibCA9IHsgMTIsIDQ5NTEsIDEyNyB9OwotICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBmX2RibCA9IHsgMSwgOTMyMCwgMTMgfTsKLSAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gcmVzX2RibDsKLQogICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91Y2hhcjsKICAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfZmxvYXQ7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzJdID0gJmZmaV90eXBlX3VjaGFyOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2xvbmdkb3VibGUuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9sb25nZG91YmxlLmMKaW5kZXggYWYzODA2MC4uYjMzMjJkOCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2xvbmdkb3VibGUuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZS5jCkBAIC01MSwxNSArNTEsMTUgQEAKICAgZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlOwogICBmZmlfdHlwZSogZGJsX2FyZ190eXBlc1s1XTsKIAorICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBnX2RibCA9IHsgMTIsIDQ5NTEsIDEyNyB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBmX2RibCA9IHsgMSwgOTMyMCwgMTMgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gcmVzX2RibDsKKwogICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOwogICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKICAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CiAKLSAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gZ19kYmwgPSB7IDEyLCA0OTUxLCAxMjcgfTsKLSAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gZl9kYmwgPSB7IDEsIDkzMjAsIDEzIH07Ci0gIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIHJlc19kYmw7Ci0KICAgY2xzX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfdWNoYXI7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX2xvbmdkb3VibGU7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzJdID0gJmZmaV90eXBlX3VjaGFyOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2xvbmdkb3VibGVfc3BsaXQuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9sb25nZG91YmxlX3NwbGl0LmMKaW5kZXggNDI3NGFmMS4uMTVmOTM2NSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2xvbmdkb3VibGVfc3BsaXQuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZV9zcGxpdC5jCkBAIC02LDcgKzYsNyBAQAogCiAvKiB7IGRnLWV4Y2Vzcy1lcnJvcnMgIm5vIGxvbmcgZG91YmxlIGZvcm1hdCIgeyB4ZmFpbCB4ODZfNjQtKi1taW5ndyogeDg2XzY0LSotY3lnd2luKiB9IH0gKi8KIC8qIHsgZGctZG8gcnVuIHsgeGZhaWwgc3Ryb25nYXJtKi0qLSogeHNjYWxlKi0qLSogfSB9ICovCi0vKiB7IGRnLW9wdGlvbnMgLW1sb25nLWRvdWJsZS0xMjggeyB0YXJnZXQgcG93ZXJwYzY0Ki0qLSogfSB9ICovCisvKiB7IGRnLW9wdGlvbnMgLW1sb25nLWRvdWJsZS0xMjggeyB0YXJnZXQgcG93ZXJwYzY0Ki0qLWxpbnV4KiB9IH0gKi8KIC8qIHsgZGctb3V0cHV0ICIiIHsgeGZhaWwgeDg2XzY0LSotbWluZ3cqIHg4Nl82NC0qLWN5Z3dpbiogfSB9ICovCiAKICNpbmNsdWRlICJmZml0ZXN0LmgiCkBAIC04NywxNSArODcsMTUgQEAKIAlmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CiAJZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbM107CiAKKwlzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBnX2RibCA9IHsgMSwgMiwgMywgNCwgNSwgNiwgNyB9OworCXN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGZfZGJsID0geyA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQgfTsKKwlzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiByZXNfZGJsOworCiAJY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOwogCWNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOwogCWNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwogCWNsc19zdHJ1Y3RfdHlwZS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzOwogCi0Jc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gZ19kYmwgPSB7IDEsIDIsIDMsIDQsIDUsIDYsIDcgfTsKLQlzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBmX2RibCA9IHsgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0IH07Ci0Jc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gcmVzX2RibDsKLQogCWNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX2xvbmdkb3VibGU7CiAJY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfbG9uZ2RvdWJsZTsKIAljbHNfc3RydWN0X2ZpZWxkc1syXSA9ICZmZmlfdHlwZV9sb25nZG91YmxlOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2xvbmdkb3VibGVfc3BsaXQyLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZV9zcGxpdDIuYwppbmRleCAwODhmMGQzLi5jYTFjMzU2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZV9zcGxpdDIuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZV9zcGxpdDIuYwpAQCAtNyw3ICs3LDcgQEAKIAogLyogeyBkZy1leGNlc3MtZXJyb3JzICJubyBsb25nIGRvdWJsZSBmb3JtYXQiIHsgeGZhaWwgeDg2XzY0LSotbWluZ3cqIHg4Nl82NC0qLWN5Z3dpbiogfSB9ICovCiAvKiB7IGRnLWRvIHJ1biB7IHhmYWlsIHN0cm9uZ2FybSotKi0qIH0gfSAqLwotLyogeyBkZy1vcHRpb25zIC1tbG9uZy1kb3VibGUtMTI4IHsgdGFyZ2V0IHBvd2VycGM2NCotKi0qIH0gfSAqLworLyogeyBkZy1vcHRpb25zIC1tbG9uZy1kb3VibGUtMTI4IHsgdGFyZ2V0IHBvd2VycGM2NCotKi1saW51eCogfSB9ICovCiAvKiB7IGRnLW91dHB1dCAiIiB7IHhmYWlsIHg4Nl82NC0qLW1pbmd3KiB4ODZfNjQtKi1jeWd3aW4qIH0gfSAqLwogCiAjaW5jbHVkZSAiZmZpdGVzdC5oIgpAQCAtNjcsMTUgKzY3LDE1IEBACiAJZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlOwogCWZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzNdOwogCisJc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gZ19kYmwgPSB7IDEsIDIsIDMsIDQsIDUsIDYsIDcgfTsKKwlzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBmX2RibCA9IHsgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0IH07CisJc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gcmVzX2RibDsKKwogCWNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKIAljbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKIAljbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKIAljbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKIAotCXN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGdfZGJsID0geyAxLCAyLCAzLCA0LCA1LCA2LCA3IH07Ci0Jc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gZl9kYmwgPSB7IDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCB9OwotCXN0cnVjdCBjbHNfc3RydWN0X2FsaWduIHJlc19kYmw7Ci0KIAljbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV9sb25nZG91YmxlOwogCWNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX2xvbmdkb3VibGU7CiAJY2xzX3N0cnVjdF9maWVsZHNbMl0gPSAmZmZpX3R5cGVfbG9uZ2RvdWJsZTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9wb2ludGVyLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fcG9pbnRlci5jCmluZGV4IGNiYzRmOTUuLjhmYmYzNmEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9wb2ludGVyLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3BvaW50ZXIuYwpAQCAtNTQsMTUgKzU0LDE1IEBACiAgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZTsKICAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbNV07CiAKKyAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gZ19kYmwgPSB7IDEyLCAodm9pZCAqKTQ5NTEsIDEyNyB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBmX2RibCA9IHsgMSwgKHZvaWQgKik5MzIwLCAxMyB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiByZXNfZGJsOworCiAgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKICAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwogICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKIAotICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBnX2RibCA9IHsgMTIsICh2b2lkICopNDk1MSwgMTI3IH07Ci0gIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGZfZGJsID0geyAxLCAodm9pZCAqKTkzMjAsIDEzIH07Ci0gIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIHJlc19kYmw7Ci0KICAgY2xzX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfdWNoYXI7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX3BvaW50ZXI7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzJdID0gJmZmaV90eXBlX3VjaGFyOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3NpbnQxNi5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3NpbnQxNi5jCmluZGV4IDM4M2VhNDEuLjAzOWI4NzQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9zaW50MTYuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDE2LmMKQEAgLTUwLDE1ICs1MCwxNSBAQAogICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CiAgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzVdOwogCisgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGdfZGJsID0geyAxMiwgNDk1MSwgMTI3IH07CisgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGZfZGJsID0geyAxLCA5MzIwLCAxMyB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiByZXNfZGJsOworCiAgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKICAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwogICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKIAotICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBnX2RibCA9IHsgMTIsIDQ5NTEsIDEyNyB9OwotICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBmX2RibCA9IHsgMSwgOTMyMCwgMTMgfTsKLSAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gcmVzX2RibDsKLQogICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91Y2hhcjsKICAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfc3Nob3J0OwogICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9ICZmZmlfdHlwZV91Y2hhcjsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9zaW50MzIuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9zaW50MzIuYwppbmRleCA3MDVkNzhjLi5jOTZjNmQxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDMyLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3NpbnQzMi5jCkBAIC01MCwxNSArNTAsMTUgQEAKICAgZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlOwogICBmZmlfdHlwZSogZGJsX2FyZ190eXBlc1s1XTsKIAorICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBnX2RibCA9IHsgMTIsIDQ5NTEsIDEyNyB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBmX2RibCA9IHsgMSwgOTMyMCwgMTMgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gcmVzX2RibDsKKwogICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOwogICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKICAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CiAKLSAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gZ19kYmwgPSB7IDEyLCA0OTUxLCAxMjcgfTsKLSAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gZl9kYmwgPSB7IDEsIDkzMjAsIDEzIH07Ci0gIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIHJlc19kYmw7Ci0KICAgY2xzX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfdWNoYXI7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX3NpbnQ7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzJdID0gJmZmaV90eXBlX3VjaGFyOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3NpbnQ2NC5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3NpbnQ2NC5jCmluZGV4IDMxZDUzYWYuLjlhYTdiZGQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9zaW50NjQuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDY0LmMKQEAgLTUxLDE1ICs1MSwxNSBAQAogICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CiAgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzVdOwogCisgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGdfZGJsID0geyAxMiwgNDk1MSwgMTI3IH07CisgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGZfZGJsID0geyAxLCA5MzIwLCAxMyB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiByZXNfZGJsOworCiAgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKICAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwogICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKIAotICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBnX2RibCA9IHsgMTIsIDQ5NTEsIDEyNyB9OwotICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBmX2RibCA9IHsgMSwgOTMyMCwgMTMgfTsKLSAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gcmVzX2RibDsKLQogICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91Y2hhcjsKICAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfc2ludDY0OwogICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9ICZmZmlfdHlwZV91Y2hhcjsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl91aW50MTYuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl91aW50MTYuYwppbmRleCBjYjZiNzQ4Li45NzYyMGI3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fdWludDE2LmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3VpbnQxNi5jCkBAIC01MCwxNSArNTAsMTUgQEAKICAgZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlOwogICBmZmlfdHlwZSogZGJsX2FyZ190eXBlc1s1XTsKIAorICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBnX2RibCA9IHsgMTIsIDQ5NTEsIDEyNyB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBmX2RibCA9IHsgMSwgOTMyMCwgMTMgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gcmVzX2RibDsKKwogICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOwogICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKICAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CiAKLSAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gZ19kYmwgPSB7IDEyLCA0OTUxLCAxMjcgfTsKLSAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gZl9kYmwgPSB7IDEsIDkzMjAsIDEzIH07Ci0gIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIHJlc19kYmw7Ci0KICAgY2xzX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfdWNoYXI7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX3VzaG9ydDsKICAgY2xzX3N0cnVjdF9maWVsZHNbMl0gPSAmZmZpX3R5cGVfdWNoYXI7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fdWludDMyLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fdWludDMyLmMKaW5kZXggZTQ1M2QzZS4uNTc2NmZhZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3VpbnQzMi5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl91aW50MzIuYwpAQCAtNTAsMTUgKzUwLDE1IEBACiAgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZTsKICAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbNV07CiAKKyAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gZ19kYmwgPSB7IDEyLCA0OTUxLCAxMjcgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gZl9kYmwgPSB7IDEsIDkzMjAsIDEzIH07CisgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIHJlc19kYmw7CisKICAgY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOwogICBjbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKICAgY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CiAgIGNsc19zdHJ1Y3RfdHlwZS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzOwogCi0gIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGdfZGJsID0geyAxMiwgNDk1MSwgMTI3IH07Ci0gIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGZfZGJsID0geyAxLCA5MzIwLCAxMyB9OwotICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiByZXNfZGJsOwotCiAgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX3VjaGFyOwogICBjbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV91aW50OwogICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9ICZmZmlfdHlwZV91Y2hhcjsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl91aW50NjQuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl91aW50NjQuYwppbmRleCA0OTVjNzlmLi5hNTJjYjg5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fdWludDY0LmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3VpbnQ2NC5jCkBAIC01MiwxNSArNTIsMTUgQEAKICAgZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlOwogICBmZmlfdHlwZSogZGJsX2FyZ190eXBlc1s1XTsKIAorICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBnX2RibCA9IHsgMTIsIDQ5NTEsIDEyNyB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBmX2RibCA9IHsgMSwgOTMyMCwgMTMgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gcmVzX2RibDsKKwogICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOwogICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKICAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CiAKLSAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gZ19kYmwgPSB7IDEyLCA0OTUxLCAxMjcgfTsKLSAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gZl9kYmwgPSB7IDEsIDkzMjAsIDEzIH07Ci0gIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIHJlc19kYmw7Ci0KICAgY2xzX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfdWNoYXI7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX3VpbnQ2NDsKICAgY2xzX3N0cnVjdF9maWVsZHNbMl0gPSAmZmZpX3R5cGVfdWNoYXI7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZGJsc19zdHJ1Y3QuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19kYmxzX3N0cnVjdC5jCmluZGV4IDY2MGRhYmIuLmQ2NjM3OTEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19kYmxzX3N0cnVjdC5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19kYmxzX3N0cnVjdC5jCkBAIC0zNyw2ICszNyw4IEBACiAJZmZpX3R5cGUJdHMxX3R5cGU7CiAJZmZpX3R5cGUqCXRzMV90eXBlX2VsZW1lbnRzWzRdOwogCisJRGJscyBhcmcgPSB7IDEuMCwgMi4wIH07CisKIAl0czFfdHlwZS5zaXplID0gMDsKIAl0czFfdHlwZS5hbGlnbm1lbnQgPSAwOwogCXRzMV90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CkBAIC00OCw4ICs1MCw2IEBACiAKIAljbF9hcmdfdHlwZXNbMF0gPSAmdHMxX3R5cGU7CiAKLQlEYmxzIGFyZyA9IHsgMS4wLCAyLjAgfTsKLQogCS8qIEluaXRpYWxpemUgdGhlIGNpZiAqLwogCUNIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDEsCiAJCQkJICZmZmlfdHlwZV92b2lkLCBjbF9hcmdfdHlwZXMpID09IEZGSV9PSyk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZG91YmxlX3ZhLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZG91YmxlX3ZhLmMKaW5kZXggMDY5NTg3NC4uNDMxNjdiNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2RvdWJsZV92YS5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19kb3VibGVfdmEuYwpAQCAtNiw2ICs2LDggQEAKIAogLyogeyBkZy1kbyBydW4geyB4ZmFpbCBzdHJvbmdhcm0qLSotKiB4c2NhbGUqLSotKiB9IH0gKi8KIC8qIHsgZGctb3V0cHV0ICIiIHsgeGZhaWwgYXZyMzIqLSotKiB9IH0gKi8KKy8qIHsgZGctb3V0cHV0ICIiIHsgeGZhaWwgbWlwcy1zZ2ktaXJpeDYqIH0gfSBQUiBsaWJmZmkvNDY2NjAgKi8KKwogI2luY2x1ZGUgImZmaXRlc3QuaCIKIAogc3RhdGljIHZvaWQKQEAgLTM0LDcgKzM2LDggQEAKIAlhcmdfdHlwZXNbMV0gPSAmZmZpX3R5cGVfZG91YmxlOwogCWFyZ190eXBlc1syXSA9IE5VTEw7CiAKLQlDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAyLCAmZmZpX3R5cGVfc2ludCwKKwkvKiBUaGlzIHByaW50ZiBjYWxsIGlzIHZhcmlhZGljICovCisJQ0hFQ0soZmZpX3ByZXBfY2lmX3ZhcigmY2lmLCBGRklfREVGQVVMVF9BQkksIDEsIDIsICZmZmlfdHlwZV9zaW50LAogCQlhcmdfdHlwZXMpID09IEZGSV9PSyk7CiAKIAlhcmdzWzBdID0gJmZvcm1hdDsKQEAgLTQyLDE2ICs0NSwxOSBAQAogCWFyZ3NbMl0gPSBOVUxMOwogCiAJZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKHByaW50ZiksICZyZXMsIGFyZ3MpOwotCS8vIHsgZGctb3V0cHV0ICI3LjAiIH0KKwkvKiB7IGRnLW91dHB1dCAiNy4wIiB9ICovCiAJcHJpbnRmKCJyZXM6ICVkXG4iLCAoaW50KSByZXMpOwotCS8vIHsgZGctb3V0cHV0ICJcbnJlczogNCIgfQorCS8qIHsgZGctb3V0cHV0ICJcbnJlczogNCIgfSAqLworCisJLyogVGhlIGNhbGwgdG8gY2xzX2RvdWJsZV92YV9mbiBpcyBzdGF0aWMsIHNvIGhhdmUgdG8gdXNlIGEgbm9ybWFsIHByZXBfY2lmICovCisJQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMiwgJmZmaV90eXBlX3NpbnQsIGFyZ190eXBlcykgPT0gRkZJX09LKTsKIAogCUNIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xzX2RvdWJsZV92YV9mbiwgTlVMTCwgY29kZSkgPT0gRkZJX09LKTsKIAogCXJlcwk9ICgoaW50KCopKGNoYXIqLCBkb3VibGUpKShjb2RlKSkoZm9ybWF0LCBkb3VibGVBcmcpOwotCS8vIHsgZGctb3V0cHV0ICJcbjcuMCIgfQorCS8qIHsgZGctb3V0cHV0ICJcbjcuMCIgfSAqLwogCXByaW50ZigicmVzOiAlZFxuIiwgKGludCkgcmVzKTsKLQkvLyB7IGRnLW91dHB1dCAiXG5yZXM6IDQiIH0KKwkvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDQiIH0gKi8KIAogCWV4aXQoMCk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbG9uZ2RvdWJsZS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2xvbmdkb3VibGUuYwppbmRleCA1MmFmNmNmLi41ZGM5YWM3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbG9uZ2RvdWJsZS5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19sb25nZG91YmxlLmMKQEAgLTUsOCArNSwxMCBAQAogICAgT3JpZ2luYXRvcjoJQmxha2UgQ2hhZmZpbgkqLwogCiAvKiB7IGRnLWV4Y2Vzcy1lcnJvcnMgIm5vIGxvbmcgZG91YmxlIGZvcm1hdCIgeyB4ZmFpbCB4ODZfNjQtKi1taW5ndyogeDg2XzY0LSotY3lnd2luKiB9IH0gKi8KLS8qIHsgZGctZG8gcnVuIHsgeGZhaWwgYXJtKi0qLSogc3Ryb25nYXJtKi0qLSogeHNjYWxlKi0qLSogfSB9ICovCi0vKiB7IGRnLW9wdGlvbnMgLW1sb25nLWRvdWJsZS0xMjggeyB0YXJnZXQgcG93ZXJwYzY0Ki0qLSogfSB9ICovCisvKiBUaGlzIHRlc3QgaXMga25vd24gdG8gUEFTUyBvbiBhcm12N2wtdW5rbm93bi1saW51eC1nbnVlYWJpaGYsIHNvIEkgaGF2ZQorICAgcmVtb3ZlIHRoZSB4ZmFpbCBmb3IgYXJtKi0qLSogYmVsb3csIHVudGlsIHdlIGtub3cgbW9yZS4gICovCisvKiB7IGRnLWRvIHJ1biB7IHhmYWlsIHN0cm9uZ2FybSotKi0qIHhzY2FsZSotKi0qIH0gfSAqLworLyogeyBkZy1vcHRpb25zIC1tbG9uZy1kb3VibGUtMTI4IHsgdGFyZ2V0IHBvd2VycGM2NCotKi1saW51eCogfSB9ICovCiAvKiB7IGRnLW91dHB1dCAiIiB7IHhmYWlsIHg4Nl82NC0qLW1pbmd3KiB4ODZfNjQtKi1jeWd3aW4qIH0gfSAqLwogCiAjaW5jbHVkZSAiZmZpdGVzdC5oIgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2xvbmdkb3VibGVfdmEuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19sb25nZG91YmxlX3ZhLmMKaW5kZXggMzg1NjRjYi4uNzEyNmIxMyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2xvbmdkb3VibGVfdmEuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbG9uZ2RvdWJsZV92YS5jCkBAIC02LDYgKzYsOCBAQAogCiAvKiB7IGRnLWRvIHJ1biB7IHhmYWlsIHN0cm9uZ2FybSotKi0qIHhzY2FsZSotKi0qIH0gfSAqLwogLyogeyBkZy1vdXRwdXQgIiIgeyB4ZmFpbCBhdnIzMiotKi0qIHg4Nl82NC0qLW1pbmd3KiB9IH0gKi8KKy8qIHsgZGctb3V0cHV0ICIiIHsgeGZhaWwgbWlwcy1zZ2ktaXJpeDYqIH0gfSBQUiBsaWJmZmkvNDY2NjAgKi8KKwogI2luY2x1ZGUgImZmaXRlc3QuaCIKIAogc3RhdGljIHZvaWQKQEAgLTM0LDcgKzM2LDggQEAKIAlhcmdfdHlwZXNbMV0gPSAmZmZpX3R5cGVfbG9uZ2RvdWJsZTsKIAlhcmdfdHlwZXNbMl0gPSBOVUxMOwogCi0JQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMiwgJmZmaV90eXBlX3NpbnQsCisJLyogVGhpcyBwcmludGYgY2FsbCBpcyB2YXJpYWRpYyAqLworCUNIRUNLKGZmaV9wcmVwX2NpZl92YXIoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAxLCAyLCAmZmZpX3R5cGVfc2ludCwKIAkJYXJnX3R5cGVzKSA9PSBGRklfT0spOwogCiAJYXJnc1swXSA9ICZmb3JtYXQ7CkBAIC00MiwxNiArNDUsMjAgQEAKIAlhcmdzWzJdID0gTlVMTDsKIAogCWZmaV9jYWxsKCZjaWYsIEZGSV9GTihwcmludGYpLCAmcmVzLCBhcmdzKTsKLQkvLyB7IGRnLW91dHB1dCAiNy4wIiB9CisJLyogeyBkZy1vdXRwdXQgIjcuMCIgfSAqLwogCXByaW50ZigicmVzOiAlZFxuIiwgKGludCkgcmVzKTsKLQkvLyB7IGRnLW91dHB1dCAiXG5yZXM6IDQiIH0KKwkvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDQiIH0gKi8KKworCS8qIFRoZSBjYWxsIHRvIGNsc19sb25nZG91YmxlX3ZhX2ZuIGlzIHN0YXRpYywgc28gaGF2ZSB0byB1c2UgYSBub3JtYWwgcHJlcF9jaWYgKi8KKwlDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAyLCAmZmZpX3R5cGVfc2ludCwKKwkJYXJnX3R5cGVzKSA9PSBGRklfT0spOwogCiAJQ0hFQ0soZmZpX3ByZXBfY2xvc3VyZV9sb2MocGNsLCAmY2lmLCBjbHNfbG9uZ2RvdWJsZV92YV9mbiwgTlVMTCwgY29kZSkgPT0gRkZJX09LKTsKIAogCXJlcwk9ICgoaW50KCopKGNoYXIqLCBsb25nIGRvdWJsZSkpKGNvZGUpKShmb3JtYXQsIGxkQXJnKTsKLQkvLyB7IGRnLW91dHB1dCAiXG43LjAiIH0KKwkvKiB7IGRnLW91dHB1dCAiXG43LjAiIH0gKi8KIAlwcmludGYoInJlczogJWRcbiIsIChpbnQpIHJlcyk7Ci0JLy8geyBkZy1vdXRwdXQgIlxucmVzOiA0IiB9CisJLyogeyBkZy1vdXRwdXQgIlxucmVzOiA0IiB9ICovCiAKIAlleGl0KDApOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3BvaW50ZXIuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19wb2ludGVyLmMKaW5kZXggZmFkZDM1My4uZDgyYTg3YSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3BvaW50ZXIuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfcG9pbnRlci5jCkBAIC0zNSw3ICszNSw3IEBACiAgICAgICAgIHZvaWQgKmNvZGU7CiAJZmZpX2Nsb3N1cmUqCXBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKIAl2b2lkKgkJCWFyZ3NbM107Ci0vLwlmZmlfdHlwZQkJY2xzX3BvaW50ZXJfdHlwZTsKKwkvKglmZmlfdHlwZQkJY2xzX3BvaW50ZXJfdHlwZTsgKi8KIAlmZmlfdHlwZSoJCWFyZ190eXBlc1szXTsKIAogLyoJY2xzX3BvaW50ZXJfdHlwZS5zaXplID0gc2l6ZW9mKHZvaWQqKTsKQEAgLTY1LDcgKzY1LDcgQEAKIAogCUNIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xzX3BvaW50ZXJfZ24sIE5VTEwsIGNvZGUpID09IEZGSV9PSyk7CiAKLQlyZXMgPSAoZmZpX2FyZykoKHZvaWQqKCopKHZvaWQqLCB2b2lkKikpKGNvZGUpKShhcmcxLCBhcmcyKTsKKwlyZXMgPSAoZmZpX2FyZykodWludHB0cl90KSgodm9pZCooKikodm9pZCosIHZvaWQqKSkoY29kZSkpKGFyZzEsIGFyZzIpOwogCS8qIHsgZGctb3V0cHV0ICJcbjB4MTIzNDU2NzggMHg4OWFiY2RlZjogMHg5YmUwMjQ2NyIgfSAqLwogCXByaW50ZigicmVzOiAweCUwOHhcbiIsICh1bnNpZ25lZCBpbnQpIHJlcyk7CiAJLyogeyBkZy1vdXRwdXQgIlxucmVzOiAweDliZTAyNDY3IiB9ICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfcG9pbnRlcl9zdGFjay5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3BvaW50ZXJfc3RhY2suYwppbmRleCA2OTdmMjcxLi4xZjFkOTE1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfcG9pbnRlcl9zdGFjay5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19wb2ludGVyX3N0YWNrLmMKQEAgLTI4LDExICsyOCwxMiBAQAogCWNoYXIJCXRyYW1wbGU2CT0gdHJhbXBsZTQgKyAoKGNoYXIqKSZhMilbMV07CiAJbG9uZyBkb3VibGUJdHJhbXBsZTcJPSAoaW50cHRyX3QpdHJhbXBsZTUgKyAoaW50cHRyX3QpdHJhbXBsZTE7CiAJY2hhcgkJdHJhbXBsZTgJPSB0cmFtcGxlNiArIHRyYW1wbGUyOworCXZvaWQqCQlyZXN1bHQ7CiAKIAlkdW1teVZhcgk9IGR1bW15X2Z1bmModHJhbXBsZTEsIHRyYW1wbGUyLCB0cmFtcGxlMywgdHJhbXBsZTQsCiAJCXRyYW1wbGU1LCB0cmFtcGxlNiwgdHJhbXBsZTcsIHRyYW1wbGU4KTsKIAotCXZvaWQqCXJlc3VsdAk9ICh2b2lkKikoKGludHB0cl90KWExICsgKGludHB0cl90KWEyKTsKKwlyZXN1bHQJPSAodm9pZCopKChpbnRwdHJfdClhMSArIChpbnRwdHJfdClhMik7CiAKIAlwcmludGYoIjB4JTA4eCAweCUwOHg6IDB4JTA4eFxuIiwgCiAJICAgICAgICh1bnNpZ25lZCBpbnQpKHVpbnRwdHJfdCkgYTEsCkBAIC01MiwxMSArNTMsMTIgQEAKIAljaGFyCQl0cmFtcGxlNgk9IHRyYW1wbGU0ICsgKChjaGFyKikmYTIpWzFdOwogCWxvbmcgZG91YmxlCXRyYW1wbGU3CT0gKGludHB0cl90KXRyYW1wbGU1ICsgKGludHB0cl90KXRyYW1wbGUxOwogCWNoYXIJCXRyYW1wbGU4CT0gdHJhbXBsZTYgKyB0cmFtcGxlMjsKKwl2b2lkKgkJcmVzdWx0OwogCiAJZHVtbXlWYXIJPSBkdW1teV9mdW5jKHRyYW1wbGUxLCB0cmFtcGxlMiwgdHJhbXBsZTMsIHRyYW1wbGU0LAogCQl0cmFtcGxlNSwgdHJhbXBsZTYsIHRyYW1wbGU3LCB0cmFtcGxlOCk7CiAKLQl2b2lkKglyZXN1bHQJPSAodm9pZCopKChpbnRwdHJfdClhMSArIChpbnRwdHJfdClhMik7CisJcmVzdWx0CT0gKHZvaWQqKSgoaW50cHRyX3QpYTEgKyAoaW50cHRyX3QpYTIpOwogCiAJcHJpbnRmKCIweCUwOHggMHglMDh4OiAweCUwOHhcbiIsCiAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KShpbnRwdHJfdCkgYTEsCkBAIC05Niw3ICs5OCw3IEBACiAgICAgICAgIHZvaWQgKmNvZGU7CiAJZmZpX2Nsb3N1cmUqCXBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKIAl2b2lkKgkJCWFyZ3NbM107Ci0vLwlmZmlfdHlwZQkJY2xzX3BvaW50ZXJfdHlwZTsKKwkvKglmZmlfdHlwZQkJY2xzX3BvaW50ZXJfdHlwZTsgKi8KIAlmZmlfdHlwZSoJCWFyZ190eXBlc1szXTsKIAogLyoJY2xzX3BvaW50ZXJfdHlwZS5zaXplID0gc2l6ZW9mKHZvaWQqKTsKQEAgLTEyMywxOCArMTI1LDE4IEBACiAJZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKGNsc19wb2ludGVyX2ZuMSksICZyZXMsIGFyZ3MpOwogCiAJcHJpbnRmKCJyZXM6IDB4JTA4eFxuIiwgKHVuc2lnbmVkIGludCkgcmVzKTsKLQkvLyB7IGRnLW91dHB1dCAiXG4weDAxMjM0NTY3IDB4ODlhYmNkZWY6IDB4OGFjZjEzNTYiIH0KLQkvLyB7IGRnLW91dHB1dCAiXG4weDhhY2YxMzU2IDB4MDEyMzQ1Njc6IDB4OGJmMjU4YmQiIH0KLQkvLyB7IGRnLW91dHB1dCAiXG5yZXM6IDB4OGJmMjU4YmQiIH0KKwkvKiB7IGRnLW91dHB1dCAiXG4weDAxMjM0NTY3IDB4ODlhYmNkZWY6IDB4OGFjZjEzNTYiIH0gKi8KKwkvKiB7IGRnLW91dHB1dCAiXG4weDhhY2YxMzU2IDB4MDEyMzQ1Njc6IDB4OGJmMjU4YmQiIH0gKi8KKwkvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDB4OGJmMjU4YmQiIH0gKi8KIAogCUNIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xzX3BvaW50ZXJfZ24sIE5VTEwsIGNvZGUpID09IEZGSV9PSyk7CiAKLQlyZXMgPSAoZmZpX2FyZykoKHZvaWQqKCopKHZvaWQqLCB2b2lkKikpKGNvZGUpKShhcmcxLCBhcmcyKTsKKwlyZXMgPSAoZmZpX2FyZykodWludHB0cl90KSgodm9pZCooKikodm9pZCosIHZvaWQqKSkoY29kZSkpKGFyZzEsIGFyZzIpOwogCiAJcHJpbnRmKCJyZXM6IDB4JTA4eFxuIiwgKHVuc2lnbmVkIGludCkgcmVzKTsKLQkvLyB7IGRnLW91dHB1dCAiXG4weDAxMjM0NTY3IDB4ODlhYmNkZWY6IDB4OGFjZjEzNTYiIH0KLQkvLyB7IGRnLW91dHB1dCAiXG4weDhhY2YxMzU2IDB4MDEyMzQ1Njc6IDB4OGJmMjU4YmQiIH0KLQkvLyB7IGRnLW91dHB1dCAiXG5yZXM6IDB4OGJmMjU4YmQiIH0KKwkvKiB7IGRnLW91dHB1dCAiXG4weDAxMjM0NTY3IDB4ODlhYmNkZWY6IDB4OGFjZjEzNTYiIH0gKi8KKwkvKiB7IGRnLW91dHB1dCAiXG4weDhhY2YxMzU2IDB4MDEyMzQ1Njc6IDB4OGJmMjU4YmQiIH0gKi8KKwkvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDB4OGJmMjU4YmQiIH0gKi8KIAogCWV4aXQoMCk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfc3RydWN0X3ZhMS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3N0cnVjdF92YTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzVlZDk2Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3N0cnVjdF92YTEuYwpAQCAtMCwwICsxLDExNCBAQAorLyogQXJlYToJCWZmaV9jYWxsLCBjbG9zdXJlX2NhbGwKKyAgIFB1cnBvc2U6CQlUZXN0IGRvdWJsZXMgcGFzc2VkIGluIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3RzLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCQlub25lLgorICAgT3JpZ2luYXRvcjoJQmxha2UgQ2hhZmZpbiA2LzYvMjAwNwkgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworLyogeyBkZy1vdXRwdXQgIiIgeyB4ZmFpbCBhdnIzMiotKi0qIH0gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKworc3RydWN0IHNtYWxsX3RhZworeworICB1bnNpZ25lZCBjaGFyIGE7CisgIHVuc2lnbmVkIGNoYXIgYjsKK307CisKK3N0cnVjdCBsYXJnZV90YWcKK3sKKyAgdW5zaWduZWQgYTsKKyAgdW5zaWduZWQgYjsKKyAgdW5zaWduZWQgYzsKKyAgdW5zaWduZWQgZDsKKyAgdW5zaWduZWQgZTsKK307CisKK3N0YXRpYyB2b2lkCit0ZXN0X2ZuIChmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwKKwkgdm9pZCoqIGFyZ3MsIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCit7CisgIGludCBuID0gKihpbnQqKWFyZ3NbMF07CisgIHN0cnVjdCBzbWFsbF90YWcgczEgPSAqIChzdHJ1Y3Qgc21hbGxfdGFnICopIGFyZ3NbMV07CisgIHN0cnVjdCBsYXJnZV90YWcgbDEgPSAqIChzdHJ1Y3QgbGFyZ2VfdGFnICopIGFyZ3NbMl07CisgIHN0cnVjdCBzbWFsbF90YWcgczIgPSAqIChzdHJ1Y3Qgc21hbGxfdGFnICopIGFyZ3NbM107CisKKyAgcHJpbnRmICgiJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWRcbiIsIG4sIHMxLmEsIHMxLmIsCisJICBsMS5hLCBsMS5iLCBsMS5jLCBsMS5kLCBsMS5lLAorCSAgczIuYSwgczIuYik7CisgICogKGludCopIHJlc3AgPSA0MjsKK30KKworaW50CittYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgdm9pZCAqY29kZTsKKyAgZmZpX2Nsb3N1cmUgKnBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jIChzaXplb2YgKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworICBmZmlfdHlwZSogYXJnX3R5cGVzWzVdOworCisgIGZmaV9hcmcgcmVzID0gMDsKKworICBmZmlfdHlwZSBzX3R5cGU7CisgIGZmaV90eXBlICpzX3R5cGVfZWxlbWVudHNbM107CisKKyAgZmZpX3R5cGUgbF90eXBlOworICBmZmlfdHlwZSAqbF90eXBlX2VsZW1lbnRzWzZdOworCisgIHN0cnVjdCBzbWFsbF90YWcgczE7CisgIHN0cnVjdCBzbWFsbF90YWcgczI7CisgIHN0cnVjdCBsYXJnZV90YWcgbDE7CisKKyAgaW50IHNpOworCisgIHNfdHlwZS5zaXplID0gMDsKKyAgc190eXBlLmFsaWdubWVudCA9IDA7CisgIHNfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBzX3R5cGUuZWxlbWVudHMgPSBzX3R5cGVfZWxlbWVudHM7CisKKyAgc190eXBlX2VsZW1lbnRzWzBdID0gJmZmaV90eXBlX3VjaGFyOworICBzX3R5cGVfZWxlbWVudHNbMV0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIHNfdHlwZV9lbGVtZW50c1syXSA9IE5VTEw7CisKKyAgbF90eXBlLnNpemUgPSAwOworICBsX3R5cGUuYWxpZ25tZW50ID0gMDsKKyAgbF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIGxfdHlwZS5lbGVtZW50cyA9IGxfdHlwZV9lbGVtZW50czsKKworICBsX3R5cGVfZWxlbWVudHNbMF0gPSAmZmZpX3R5cGVfdWludDsKKyAgbF90eXBlX2VsZW1lbnRzWzFdID0gJmZmaV90eXBlX3VpbnQ7CisgIGxfdHlwZV9lbGVtZW50c1syXSA9ICZmZmlfdHlwZV91aW50OworICBsX3R5cGVfZWxlbWVudHNbM10gPSAmZmZpX3R5cGVfdWludDsKKyAgbF90eXBlX2VsZW1lbnRzWzRdID0gJmZmaV90eXBlX3VpbnQ7CisgIGxfdHlwZV9lbGVtZW50c1s1XSA9IE5VTEw7CisKKyAgYXJnX3R5cGVzWzBdID0gJmZmaV90eXBlX3NpbnQ7CisgIGFyZ190eXBlc1sxXSA9ICZzX3R5cGU7CisgIGFyZ190eXBlc1syXSA9ICZsX3R5cGU7CisgIGFyZ190eXBlc1szXSA9ICZzX3R5cGU7CisgIGFyZ190eXBlc1s0XSA9IE5VTEw7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmX3ZhcigmY2lmLCBGRklfREVGQVVMVF9BQkksIDEsIDQsICZmZmlfdHlwZV9zaW50LAorCQkJIGFyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBzaSA9IDQ7CisgIHMxLmEgPSA1OworICBzMS5iID0gNjsKKworICBzMi5hID0gMjA7CisgIHMyLmIgPSAyMTsKKworICBsMS5hID0gMTA7CisgIGwxLmIgPSAxMTsKKyAgbDEuYyA9IDEyOworICBsMS5kID0gMTM7CisgIGwxLmUgPSAxNDsKKworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIHRlc3RfZm4sIE5VTEwsIGNvZGUpID09IEZGSV9PSyk7CisKKyAgcmVzID0gKChpbnQgKCopKGludCwgLi4uKSkoY29kZSkpKHNpLCBzMSwgbDEsIHMyKTsKKyAgLyogeyBkZy1vdXRwdXQgIjQgNSA2IDEwIDExIDEyIDEzIDE0IDIwIDIxIiB9ICovCisgIHByaW50ZigicmVzOiAlZFxuIiwgKGludCkgcmVzKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiA0MiIgfSAqLworCisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdWNoYXJfdmEuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc191Y2hhcl92YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OTFjNWIKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdWNoYXJfdmEuYwpAQCAtMCwwICsxLDQ0IEBACisvKiBBcmVhOgljbG9zdXJlX2NhbGwKKyAgIFB1cnBvc2U6CVRlc3QgYW5vbnltb3VzIHVuc2lnbmVkIGNoYXIgYXJndW1lbnQuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CUFSTSBMdGQuICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBUOworCitzdGF0aWMgdm9pZCBjbHNfcmV0X1RfZm4oZmZpX2NpZiogY2lmIF9fVU5VU0VEX18sIHZvaWQqIHJlc3AsIHZvaWQqKiBhcmdzLAorCQkJIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCisgeworICAgKihmZmlfYXJnICopcmVzcCA9ICooVCAqKWFyZ3NbMF07CisKKyAgIHByaW50ZigiJWQ6ICVkICVkXG4iLCAoaW50KSgqKGZmaV9hcmcgKilyZXNwKSwgKihUICopYXJnc1swXSwgKihUICopYXJnc1sxXSk7CisgfQorCit0eXBlZGVmIFQgKCpjbHNfcmV0X1QpKFQsIC4uLik7CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgdm9pZCAqY29kZTsKKyAgZmZpX2Nsb3N1cmUgKnBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKKyAgZmZpX3R5cGUgKiBjbF9hcmdfdHlwZXNbM107CisgIFQgcmVzOworCisgIGNsX2FyZ190eXBlc1swXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xfYXJnX3R5cGVzWzFdID0gJmZmaV90eXBlX3VjaGFyOworICBjbF9hcmdfdHlwZXNbMl0gPSBOVUxMOworCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWZfdmFyKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMSwgMiwKKwkJCSAmZmZpX3R5cGVfdWNoYXIsIGNsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsc19yZXRfVF9mbiwgTlVMTCwgY29kZSkgID09IEZGSV9PSyk7CisgIHJlcyA9ICgoKChjbHNfcmV0X1QpY29kZSkoNjcsIDQpKSk7CisgIC8qIHsgZGctb3V0cHV0ICI2NzogNjcgNCIgfSAqLworICBwcmludGYoInJlczogJWRcbiIsIHJlcyk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogNjciIH0gKi8KKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc191aW50X3ZhLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdWludF92YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MGZkZGQKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdWludF92YS5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qIEFyZWE6CWNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJVGVzdCBhbm9ueW1vdXMgdW5zaWduZWQgaW50IGFyZ3VtZW50LgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOglBUk0gTHRkLiAqLworCisvKiB7IGRnLWRvIHJ1biB9ICovCisKKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3R5cGVkZWYgdW5zaWduZWQgaW50IFQ7CisKK3N0YXRpYyB2b2lkIGNsc19yZXRfVF9mbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsCisJCQkgdm9pZCogdXNlcmRhdGEgX19VTlVTRURfXykKKyB7CisgICAqKFQgKilyZXNwID0gKihUICopYXJnc1swXTsKKworICAgcHJpbnRmKCIlZDogJWQgJWRcbiIsICooVCAqKXJlc3AsICooVCAqKWFyZ3NbMF0sICooVCAqKWFyZ3NbMV0pOworIH0KKwordHlwZWRlZiBUICgqY2xzX3JldF9UKShULCAuLi4pOworCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKmNvZGU7CisgIGZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisgIGZmaV90eXBlICogY2xfYXJnX3R5cGVzWzNdOworICBUIHJlczsKKworICBjbF9hcmdfdHlwZXNbMF0gPSAmZmZpX3R5cGVfdWludDsKKyAgY2xfYXJnX3R5cGVzWzFdID0gJmZmaV90eXBlX3VpbnQ7CisgIGNsX2FyZ190eXBlc1syXSA9IE5VTEw7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgY2lmICovCisgIENIRUNLKGZmaV9wcmVwX2NpZl92YXIoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAxLCAyLAorCQkJICZmZmlfdHlwZV91aW50LCBjbF9hcmdfdHlwZXMpID09IEZGSV9PSyk7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2xvc3VyZV9sb2MocGNsLCAmY2lmLCBjbHNfcmV0X1RfZm4sIE5VTEwsIGNvZGUpICA9PSBGRklfT0spOworICByZXMgPSAoKCgoY2xzX3JldF9UKWNvZGUpKDY3LCA0KSkpOworICAvKiB7IGRnLW91dHB1dCAiNjc6IDY3IDQiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkXG4iLCByZXMpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDY3IiB9ICovCisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdWxvbmdfdmEuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc191bG9uZ192YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMTUwODIKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdWxvbmdfdmEuYwpAQCAtMCwwICsxLDQ1IEBACisvKiBBcmVhOgljbG9zdXJlX2NhbGwKKyAgIFB1cnBvc2U6CVRlc3QgYW5vbnltb3VzIHVuc2lnbmVkIGxvbmcgYXJndW1lbnQuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CUFSTSBMdGQuICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKworI2luY2x1ZGUgImZmaXRlc3QuaCIKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIFQ7CisKK3N0YXRpYyB2b2lkIGNsc19yZXRfVF9mbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsCisJCQkgdm9pZCogdXNlcmRhdGEgX19VTlVTRURfXykKKyB7CisgICAqKFQgKilyZXNwID0gKihUICopYXJnc1swXTsKKworICAgcHJpbnRmKCIlbGQ6ICVsZCAlbGRcbiIsICooVCAqKXJlc3AsICooVCAqKWFyZ3NbMF0sICooVCAqKWFyZ3NbMV0pOworIH0KKwordHlwZWRlZiBUICgqY2xzX3JldF9UKShULCAuLi4pOworCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKmNvZGU7CisgIGZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisgIGZmaV90eXBlICogY2xfYXJnX3R5cGVzWzNdOworICBUIHJlczsKKworICBjbF9hcmdfdHlwZXNbMF0gPSAmZmZpX3R5cGVfdWxvbmc7CisgIGNsX2FyZ190eXBlc1sxXSA9ICZmZmlfdHlwZV91bG9uZzsKKyAgY2xfYXJnX3R5cGVzWzJdID0gTlVMTDsKKworICAvKiBJbml0aWFsaXplIHRoZSBjaWYgKi8KKyAgQ0hFQ0soZmZpX3ByZXBfY2lmX3ZhcigmY2lmLCBGRklfREVGQVVMVF9BQkksIDEsIDIsCisJCQkgJmZmaV90eXBlX3Vsb25nLCBjbF9hcmdfdHlwZXMpID09IEZGSV9PSyk7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2xvc3VyZV9sb2MocGNsLCAmY2lmLCBjbHNfcmV0X1RfZm4sIE5VTEwsIGNvZGUpICA9PSBGRklfT0spOworICByZXMgPSAoKCgoY2xzX3JldF9UKWNvZGUpKDY3LCA0KSkpOworICAvKiB7IGRnLW91dHB1dCAiNjc6IDY3IDQiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVsZFxuIiwgcmVzKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiA2NyIgfSAqLworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3Vsb25nbG9uZy5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3Vsb25nbG9uZy5jCmluZGV4IDIzNWFiNDQuLjYyZjJjYWUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc191bG9uZ2xvbmcuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdWxvbmdsb25nLmMKQEAgLTExLDcgKzExLDcgQEAKIHN0YXRpYyB2b2lkIGNsc19yZXRfdWxvbmdsb25nX2ZuKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLAogCQkJCSB2b2lkKiogYXJncywgdm9pZCogdXNlcmRhdGEgX19VTlVTRURfXykKIHsKLSAgKih1bnNpZ25lZCBsb25nIGxvbmcgKilyZXNwPSAgKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzBdOworICAqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKXJlc3A9IDB4ZmZmZmZmZmZmZmZmZmZmTEwgXiAqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFyZ3NbMF07CiAKICAgcHJpbnRmKCIlIiBQUkl1TEwgIjogJSIgUFJJdUxMICJcbiIsKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzBdLAogCSAqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKShyZXNwKSk7CkBAIC0zNCwxNCArMzQsMTQgQEAKIAkJICAgICAmZmZpX3R5cGVfdWludDY0LCBjbF9hcmdfdHlwZXMpID09IEZGSV9PSyk7CiAgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xzX3JldF91bG9uZ2xvbmdfZm4sIE5VTEwsIGNvZGUpICA9PSBGRklfT0spOwogICByZXMgPSAoKigoY2xzX3JldF91bG9uZ2xvbmcpY29kZSkpKDIxNExMKTsKLSAgLyogeyBkZy1vdXRwdXQgIjIxNDogMjE0IiB9ICovCisgIC8qIHsgZGctb3V0cHV0ICIyMTQ6IDExNTI5MjE1MDQ2MDY4NDY3NjEiIH0gKi8KICAgcHJpbnRmKCJyZXM6ICUiIFBSSWRMTCAiXG4iLCByZXMpOwotICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDIxNCIgfSAqLworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDExNTI5MjE1MDQ2MDY4NDY3NjEiIH0gKi8KIAogICByZXMgPSAoKigoY2xzX3JldF91bG9uZ2xvbmcpY29kZSkpKDkyMjMzNzIwMzU4NTQ3NzU4MDhMTCk7Ci0gIC8qIHsgZGctb3V0cHV0ICJcbjkyMjMzNzIwMzU4NTQ3NzU4MDg6IDkyMjMzNzIwMzU4NTQ3NzU4MDgiIH0gKi8KKyAgLyogeyBkZy1vdXRwdXQgIlxuOTIyMzM3MjAzNTg1NDc3NTgwODogODA3MDQ1MDUzMzI0NzkyODgzMSIgfSAqLwogICBwcmludGYoInJlczogJSIgUFJJZExMICJcbiIsIHJlcyk7Ci0gIC8qIHsgZGctb3V0cHV0ICJcbnJlczogOTIyMzM3MjAzNTg1NDc3NTgwOCIgfSAqLworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDgwNzA0NTA1MzMyNDc5Mjg4MzEiIH0gKi8KIAogICBleGl0KDApOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3VzaG9ydF92YS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3VzaG9ydF92YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YWExMDYKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdXNob3J0X3ZhLmMKQEAgLTAsMCArMSw0NCBAQAorLyogQXJlYToJY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOglUZXN0IGFub255bW91cyB1bnNpZ25lZCBzaG9ydCBhcmd1bWVudC4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJQVJNIEx0ZC4gKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBUOworCitzdGF0aWMgdm9pZCBjbHNfcmV0X1RfZm4oZmZpX2NpZiogY2lmIF9fVU5VU0VEX18sIHZvaWQqIHJlc3AsIHZvaWQqKiBhcmdzLAorCQkJIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCisgeworICAgKihmZmlfYXJnICopcmVzcCA9ICooVCAqKWFyZ3NbMF07CisKKyAgIHByaW50ZigiJWQ6ICVkICVkXG4iLCAoaW50KSgqKGZmaV9hcmcgKilyZXNwKSwgKihUICopYXJnc1swXSwgKihUICopYXJnc1sxXSk7CisgfQorCit0eXBlZGVmIFQgKCpjbHNfcmV0X1QpKFQsIC4uLik7CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgdm9pZCAqY29kZTsKKyAgZmZpX2Nsb3N1cmUgKnBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKKyAgZmZpX3R5cGUgKiBjbF9hcmdfdHlwZXNbM107CisgIFQgcmVzOworCisgIGNsX2FyZ190eXBlc1swXSA9ICZmZmlfdHlwZV91c2hvcnQ7CisgIGNsX2FyZ190eXBlc1sxXSA9ICZmZmlfdHlwZV91c2hvcnQ7CisgIGNsX2FyZ190eXBlc1syXSA9IE5VTEw7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgY2lmICovCisgIENIRUNLKGZmaV9wcmVwX2NpZl92YXIoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAxLCAyLAorCQkJICZmZmlfdHlwZV91c2hvcnQsIGNsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsc19yZXRfVF9mbiwgTlVMTCwgY29kZSkgID09IEZGSV9PSyk7CisgIHJlcyA9ICgoKChjbHNfcmV0X1QpY29kZSkoNjcsIDQpKSk7CisgIC8qIHsgZGctb3V0cHV0ICI2NzogNjcgNCIgfSAqLworICBwcmludGYoInJlczogJWRcbiIsIHJlcyk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogNjciIH0gKi8KKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Vycl9iYWRfYWJpLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9lcnJfYmFkX2FiaS5jCmluZGV4IGEyMWEzZmQuLmY1YTczMTcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Vycl9iYWRfYWJpLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvZXJyX2JhZF9hYmkuYwpAQCAtNCw3ICs0LDggQEAKICAgIFBSOgkJCW5vbmUuCiAgICBPcmlnaW5hdG9yOglCbGFrZSBDaGFmZmluIDYvNi8yMDA3CSAqLwogCi0vKiB7IGRnLWRvIHJ1biB7IHhmYWlsICotKi0qIH0gfSAqLworLyogeyBkZy1kbyBydW4gfSAqLworCiAjaW5jbHVkZSAiZmZpdGVzdC5oIgogCiBzdGF0aWMgdm9pZApAQCAtMTcsMTEgKzE4LDkgQEAKIAlmZmlfY2lmIGNpZjsKICAgICAgICAgdm9pZCAqY29kZTsKIAlmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOwotCXZvaWQqIGFyZ3NbMV07CiAJZmZpX3R5cGUqIGFyZ190eXBlc1sxXTsKIAogCWFyZ190eXBlc1swXSA9IE5VTEw7Ci0JYXJnc1swXSA9IE5VTEw7CiAKIAlDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgMjU1LCAwLCAmZmZpX3R5cGVfdm9pZCwKIAkJYXJnX3R5cGVzKSA9PSBGRklfQkFEX0FCSSk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9lcnJfYmFkX3R5cGVkZWYuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Vycl9iYWRfdHlwZWRlZi5jCmluZGV4IGJkMmZjNTQuLmJmNjAxNjEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Vycl9iYWRfdHlwZWRlZi5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Vycl9iYWRfdHlwZWRlZi5jCkBAIC00LDcgKzQsOCBAQAogICAgUFI6CQkJbm9uZS4KICAgIE9yaWdpbmF0b3I6CUJsYWtlIENoYWZmaW4gNi82LzIwMDcJICovCiAKLS8qIHsgZGctZG8gcnVuIHsgeGZhaWwgKi0qLSogfSB9ICovCisvKiB7IGRnLWRvIHJ1biB9ICovCisKICNpbmNsdWRlICJmZml0ZXN0LmgiCiAKIGludCBtYWluICh2b2lkKQpAQCAtMTIsMTAgKzEzLDEwIEBACiAJZmZpX2NpZiBjaWY7CiAJZmZpX3R5cGUqIGFyZ190eXBlc1sxXTsKIAotCWFyZ190eXBlc1swXSA9IE5VTEw7Ci0KIAlmZmlfdHlwZQliYWRUeXBlCT0gZmZpX3R5cGVfdm9pZDsKIAorCWFyZ190eXBlc1swXSA9IE5VTEw7CisKIAliYWRUeXBlLnNpemUgPSAwOwogCiAJQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMCwgJmJhZFR5cGUsCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9mYXN0dGhpczFfd2luMzIuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Zhc3R0aGlzMV93aW4zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYzQ3MjQKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9mYXN0dGhpczFfd2luMzIuYwpAQCAtMCwwICsxLDUwIEBACisvKiBBcmVhOglmZmlfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgZmFzdGNhbGwgZmN0IGNhbGwgb24gWDg2X1dJTjMyIHN5c3RlbXMuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CUZyb20gdGhlIG9yaWdpbmFsIGZmaXRlc3QuYyAgKi8KKworLyogeyBkZy1kbyBydW4geyB0YXJnZXQgaT84Ni0qLWN5Z3dpbiogaT84Ni0qLW1pbmd3KiB9IH0gKi8KKworI2luY2x1ZGUgImZmaXRlc3QuaCIKKworc3RhdGljIHNpemVfdCBfX0ZBU1RDQUxMX18gbXlfZmFzdGNhbGxfZihjaGFyICpzLCBmbG9hdCBhKQoreworICByZXR1cm4gKHNpemVfdCkgKChpbnQpIHN0cmxlbihzKSArIChpbnQpIGEpOworfQorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIGZmaV90eXBlICphcmdzW01BWF9BUkdTXTsKKyAgdm9pZCAqdmFsdWVzW01BWF9BUkdTXTsKKyAgZmZpX2FyZyByaW50OworICBjaGFyICpzOworICBmbG9hdCB2MjsKKyAgYXJnc1swXSA9ICZmZmlfdHlwZV9wb2ludGVyOworICBhcmdzWzFdID0gJmZmaV90eXBlX2Zsb2F0OworICB2YWx1ZXNbMF0gPSAodm9pZCopICZzOworICB2YWx1ZXNbMV0gPSAodm9pZCopICZ2MjsKKyAgCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0ZBU1RDQUxMLCAyLAorCQkgICAgICAgJmZmaV90eXBlX3NpbnQsIGFyZ3MpID09IEZGSV9PSyk7CisgIAorICBzID0gImEiOworICB2MiA9IDAuMDsKKyAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKG15X2Zhc3RjYWxsX2YpLCAmcmludCwgdmFsdWVzKTsKKyAgQ0hFQ0socmludCA9PSAxKTsKKyAgCisgIHMgPSAiMTIzNDU2NyI7CisgIHYyID0gLTEuMDsKKyAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKG15X2Zhc3RjYWxsX2YpLCAmcmludCwgdmFsdWVzKTsKKyAgQ0hFQ0socmludCA9PSA2KTsKKyAgCisgIHMgPSAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NSI7CisgIHYyID0gMS4wOworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4obXlfZmFzdGNhbGxfZiksICZyaW50LCB2YWx1ZXMpOworICBDSEVDSyhyaW50ID09IDI2KTsKKyAgCisgIHByaW50ZigiZmFzdGNhbGwgZmN0MSB0ZXN0cyBwYXNzZWRcbiIpOworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmFzdHRoaXMyX3dpbjMyLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9mYXN0dGhpczJfd2luMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmRkMGUxCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmFzdHRoaXMyX3dpbjMyLmMKQEAgLTAsMCArMSw1MCBAQAorLyogQXJlYToJZmZpX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIGZhc3RjYWxsIGZjdCBjYWxsIG9uIFg4Nl9XSU4zMiBzeXN0ZW1zLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOglGcm9tIHRoZSBvcmlnaW5hbCBmZml0ZXN0LmMgICovCisKKy8qIHsgZGctZG8gcnVuIHsgdGFyZ2V0IGk/ODYtKi1jeWd3aW4qIGk/ODYtKi1taW5ndyogfSB9ICovCisKKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3N0YXRpYyBzaXplX3QgX19GQVNUQ0FMTF9fIG15X2Zhc3RjYWxsX2YoZmxvYXQgYSwgY2hhciAqcykKK3sKKyAgcmV0dXJuIChzaXplX3QpICgoaW50KSBzdHJsZW4ocykgKyAoaW50KSBhKTsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICBmZmlfdHlwZSAqYXJnc1tNQVhfQVJHU107CisgIHZvaWQgKnZhbHVlc1tNQVhfQVJHU107CisgIGZmaV9hcmcgcmludDsKKyAgY2hhciAqczsKKyAgZmxvYXQgdjI7CisgIGFyZ3NbMV0gPSAmZmZpX3R5cGVfcG9pbnRlcjsKKyAgYXJnc1swXSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgdmFsdWVzWzFdID0gKHZvaWQqKSAmczsKKyAgdmFsdWVzWzBdID0gKHZvaWQqKSAmdjI7CisgIAorICAvKiBJbml0aWFsaXplIHRoZSBjaWYgKi8KKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9GQVNUQ0FMTCwgMiwKKwkJICAgICAgICZmZmlfdHlwZV9zaW50LCBhcmdzKSA9PSBGRklfT0spOworICAKKyAgcyA9ICJhIjsKKyAgdjIgPSAwLjA7CisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihteV9mYXN0Y2FsbF9mKSwgJnJpbnQsIHZhbHVlcyk7CisgIENIRUNLKHJpbnQgPT0gMSk7CisgIAorICBzID0gIjEyMzQ1NjciOworICB2MiA9IC0xLjA7CisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihteV9mYXN0Y2FsbF9mKSwgJnJpbnQsIHZhbHVlcyk7CisgIENIRUNLKHJpbnQgPT0gNik7CisgIAorICBzID0gIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDUiOworICB2MiA9IDEuMDsKKyAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKG15X2Zhc3RjYWxsX2YpLCAmcmludCwgdmFsdWVzKTsKKyAgQ0hFQ0socmludCA9PSAyNik7CisgIAorICBwcmludGYoImZhc3RjYWxsIGZjdDIgdGVzdHMgcGFzc2VkXG4iKTsKKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Zhc3R0aGlzM193aW4zMi5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmFzdHRoaXMzX3dpbjMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVkNjA2ZAotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Zhc3R0aGlzM193aW4zMi5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qIEFyZWE6CWZmaV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBmYXN0Y2FsbCBmIGNhbGwgb24gWDg2X1dJTjMyIHN5c3RlbXMuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CUZyb20gdGhlIG9yaWdpbmFsIGZmaXRlc3QuYyAgKi8KKworLyogeyBkZy1kbyBydW4geyB0YXJnZXQgaT84Ni0qLWN5Z3dpbiogaT84Ni0qLW1pbmd3KiB9IH0gKi8KKworI2luY2x1ZGUgImZmaXRlc3QuaCIKKworc3RhdGljIHNpemVfdCBfX0ZBU1RDQUxMX18gbXlfZmFzdGNhbGxfZihmbG9hdCBhLCBjaGFyICpzLCBpbnQgaSkKK3sKKyAgcmV0dXJuIChzaXplX3QpICgoaW50KSBzdHJsZW4ocykgKyAoaW50KSBhICsgaSk7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgZmZpX3R5cGUgKmFyZ3NbTUFYX0FSR1NdOworICB2b2lkICp2YWx1ZXNbTUFYX0FSR1NdOworICBmZmlfYXJnIHJpbnQ7CisgIGNoYXIgKnM7CisgIGludCB2MTsKKyAgZmxvYXQgdjI7CisgIGFyZ3NbMl0gPSAmZmZpX3R5cGVfc2ludDsKKyAgYXJnc1sxXSA9ICZmZmlfdHlwZV9wb2ludGVyOworICBhcmdzWzBdID0gJmZmaV90eXBlX2Zsb2F0OworICB2YWx1ZXNbMl0gPSAodm9pZCopICZ2MTsKKyAgdmFsdWVzWzFdID0gKHZvaWQqKSAmczsKKyAgdmFsdWVzWzBdID0gKHZvaWQqKSAmdjI7CisgIAorICAvKiBJbml0aWFsaXplIHRoZSBjaWYgKi8KKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9GQVNUQ0FMTCwgMywKKwkJICAgICAgICZmZmlfdHlwZV9zaW50LCBhcmdzKSA9PSBGRklfT0spOworICAKKyAgcyA9ICJhIjsKKyAgdjEgPSAxOworICB2MiA9IDAuMDsKKyAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKG15X2Zhc3RjYWxsX2YpLCAmcmludCwgdmFsdWVzKTsKKyAgQ0hFQ0socmludCA9PSAyKTsKKyAgCisgIHMgPSAiMTIzNDU2NyI7CisgIHYyID0gLTEuMDsKKyAgdjEgPSAtMjsKKyAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKG15X2Zhc3RjYWxsX2YpLCAmcmludCwgdmFsdWVzKTsKKyAgQ0hFQ0socmludCA9PSA0KTsKKyAgCisgIHMgPSAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NSI7CisgIHYyID0gMS4wOworICB2MSA9IDI7CisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihteV9mYXN0Y2FsbF9mKSwgJnJpbnQsIHZhbHVlcyk7CisgIENIRUNLKHJpbnQgPT0gMjgpOworICAKKyAgcHJpbnRmKCJmYXN0Y2FsbCBmY3QzIHRlc3RzIHBhc3NlZFxuIik7CisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9mZml0ZXN0LmggYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9mZml0ZXN0LmgKaW5kZXggMmNiOTg0OS4uMTM2YTdhNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmZpdGVzdC5oCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2ZmaXRlc3QuaApAQCAtMTUsNyArMTUsNyBAQAogCiAjZGVmaW5lIE1BWF9BUkdTIDI1NgogCi0jZGVmaW5lIENIRUNLKHgpICEoeCkgPyBhYm9ydCgpIDogMAorI2RlZmluZSBDSEVDSyh4KSAhKHgpID8gKGFib3J0KCksIDEpIDogMAogCiAvKiBEZWZpbmUgX19VTlVTRURfXyB0aGF0IGFsc28gb3RoZXIgY29tcGlsZXJzIHRoYW4gZ2NjIGNhbiBydW4gdGhlIHRlc3RzLiAgKi8KICN1bmRlZiBfX1VOVVNFRF9fCkBAIC0yNSw2ICsyNSwxNCBAQAogI2RlZmluZSBfX1VOVVNFRF9fCiAjZW5kaWYKIAorLyogRGVmaW5lIF9fRkFTVENBTExfXyBzbyB0aGF0IG90aGVyIGNvbXBpbGVycyB0aGFuIGdjYyBjYW4gcnVuIHRoZSB0ZXN0cy4gICovCisjdW5kZWYgX19GQVNUQ0FMTF9fCisjaWYgZGVmaW5lZCBfTVNDX1ZFUgorI2RlZmluZSBfX0ZBU1RDQUxMX18gX19mYXN0Y2FsbAorI2Vsc2UKKyNkZWZpbmUgX19GQVNUQ0FMTF9fIF9fYXR0cmlidXRlX18oKGZhc3RjYWxsKSkKKyNlbmRpZgorCiAvKiBQcmVmZXIgTUFQX0FOT04oWU1PVVMpIHRvIC9kZXYvemVybywgc2luY2Ugd2UgZG9uJ3QgbmVlZCB0byBrZWVwIGEKICAgIGZpbGUgb3Blbi4gICovCiAjaWZkZWYgSEFWRV9NTUFQX0FOT04KQEAgLTY3LDYgKzc1LDggQEAKICNkZWZpbmUgUFJJZExMICJsZCIKICN1bmRlZiBQUkl1TEwKICNkZWZpbmUgUFJJdUxMICJsdSIKKyNkZWZpbmUgUFJJZDggImhkIgorI2RlZmluZSBQUkl1OCAiaHUiCiAjZGVmaW5lIFBSSWQ2NCAibGQiCiAjZGVmaW5lIFBSSXU2NCAibHUiCiAjZGVmaW5lIFBSSXVQVFIgImx1IgpAQCAtNzcsNiArODcsMjggQEAKICNkZWZpbmUgUFJJdVBUUiAibHUiCiAjZW5kaWYKIAorLyogSVJJWCBrbHVkZ2UuICAqLworI2lmIGRlZmluZWQoX19zZ2kpCisvKiBJUklYIDYuNSA8aW50dHlwZXMuaD4gcHJvdmlkZXMgYWxsIGRlZmluaXRpb25zLCBidXQgb25seSBmb3IgQzk5CisgICBjb21waWxhdGlvbnMuICAqLworI2RlZmluZSBQUklkOCAiaGhkIgorI2RlZmluZSBQUkl1OCAiaGh1IgorI2lmIChfTUlQU19TWkxPTkcgPT0gMzIpCisjZGVmaW5lIFBSSWQ2NCAibGxkIgorI2RlZmluZSBQUkl1NjQgImxsdSIKKyNlbmRpZgorLyogVGhpcyBkb2Vzbid0IG1hdGNoIDxpbnR0eXBlcy5oPiwgd2hpY2ggYWx3YXlzIGhhcyAibGxkIiBoZXJlLCBidXQgdGhlCisgICBhcmd1bWVudHMgYXJlIHVpbnQ2NF90LCBpbnQ2NF90LCB3aGljaCBhcmUgdW5zaWduZWQgbG9uZywgbG9uZyBmb3IKKyAgIDY0LWJpdCBpbiA8c2dpZGVmcy5oPi4gICovCisjaWYgKF9NSVBTX1NaTE9ORyA9PSA2NCkKKyNkZWZpbmUgUFJJZDY0ICJsZCIKKyNkZWZpbmUgUFJJdTY0ICJsdSIKKyNlbmRpZgorLyogVGhpcyBkb2Vzbid0IG1hdGNoIDxpbnR0eXBlcy5oPiwgd2hpY2ggaGFzICJ1IiBoZXJlLCBidXQgdGhlIGFyZ3VtZW50cworICAgYXJlIHVpbnRwdHJfdCwgd2hpY2ggaXMgYWx3YXlzIHVuc2lnbmVkIGxvbmcuICAqLworI2RlZmluZSBQUkl1UFRSICJsdSIKKyNlbmRpZgorCiAvKiBTb2xhcmlzIDwgMTAga2x1ZGdlLiAgKi8KICNpZiBkZWZpbmVkKF9fc3VuX18pICYmIGRlZmluZWQoX19zdnI0X18pICYmICFkZWZpbmVkKFBSSXVQVFIpCiAjaWYgZGVmaW5lZChfX2FyY2g2NF9fKSB8fCBkZWZpbmVkIChfX3g4Nl82NF9fKQpAQCAtODYsNDQgKzExOCwxNSBAQAogI2VuZGlmCiAjZW5kaWYKIAotI2lmZGVmIFVTSU5HX01NQVAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqCi1hbGxvY2F0ZV9tbWFwIChzaXplX3Qgc2l6ZSkKLXsKLSAgdm9pZCAqcGFnZTsKLSNpZiBkZWZpbmVkIChIQVZFX01NQVBfREVWX1pFUk8pCi0gIHN0YXRpYyBpbnQgZGV2X3plcm9fZmQgPSAtMTsKKy8qIE1TVkMga2x1ZGdlLiAgKi8KKyNpZiBkZWZpbmVkIF9NU0NfVkVSCisjZGVmaW5lIFBSSXVQVFIgImx1IgorI2RlZmluZSBQUkl1OCAidSIKKyNkZWZpbmUgUFJJZDggImQiCisjZGVmaW5lIFBSSXU2NCAiSTY0dSIKKyNkZWZpbmUgUFJJZDY0ICJJNjRkIgogI2VuZGlmCiAKLSNpZmRlZiBIQVZFX01NQVBfREVWX1pFUk8KLSAgaWYgKGRldl96ZXJvX2ZkID09IC0xKQotICAgIHsKLSAgICAgIGRldl96ZXJvX2ZkID0gb3BlbiAoIi9kZXYvemVybyIsIE9fUkRPTkxZKTsKLSAgICAgIGlmIChkZXZfemVyb19mZCA9PSAtMSkKLQl7Ci0JICBwZXJyb3IgKCJvcGVuIC9kZXYvemVybzogJW0iKTsKLQkgIGV4aXQgKDEpOwotCX0KLSAgICB9Ci0jZW5kaWYKLQotCi0jaWZkZWYgSEFWRV9NTUFQX0FOT04KLSAgcGFnZSA9IG1tYXAgKE5VTEwsIHNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUgfCBQUk9UX0VYRUMsCi0JICAgICAgIE1BUF9QUklWQVRFIHwgTUFQX0FOT05ZTU9VUywgLTEsIDApOwotI2VuZGlmCi0jaWZkZWYgSEFWRV9NTUFQX0RFVl9aRVJPCi0gIHBhZ2UgPSBtbWFwIChOVUxMLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFIHwgUFJPVF9FWEVDLAotCSAgICAgICBNQVBfUFJJVkFURSwgZGV2X3plcm9fZmQsIDApOwotI2VuZGlmCi0KLSAgaWYgKHBhZ2UgPT0gKHZvaWQgKikgTUFQX0ZBSUxFRCkKLSAgICB7Ci0gICAgICBwZXJyb3IgKCJ2aXJ0dWFsIG1lbW9yeSBleGhhdXN0ZWQiKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICByZXR1cm4gcGFnZTsKLX0KLQorI2lmbmRlZiBQUkl1UFRSCisjZGVmaW5lIFBSSXVQVFIgInUiCiAjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Zsb2F0X3ZhLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9mbG9hdF92YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhY2ZmOTEKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9mbG9hdF92YS5jCkBAIC0wLDAgKzEsMTA3IEBACisvKiBBcmVhOiAgICAgICAgZnAgYW5kIHZhcmlhZGljcworICAgUHVycG9zZTogICAgIGNoZWNrIGZwIGlucHV0cyBhbmQgcmV0dXJucyB3b3JrIG9uIHZhcmlhZGljcywgZXZlbiB0aGUgZml4ZWQgcGFyYW1zCisgICBMaW1pdGF0aW9uczogTm9uZQorICAgUFI6ICAgICAgICAgIG5vbmUKKyAgIE9yaWdpbmF0b3I6ICA8ZGF2aWQuZ2lsYmVydEBsaW5hcm8ub3JnPiAyMDExLTAxLTI1CisKKyAgIEludGVuZGVkIHRvIHN0cmVzcyB0aGUgZGlmZmVyZW5jZSBpbiBBQkkgb24gQVJNIHZmcAorKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKKy8qIHByaW50cyBvdXQgYWxsIHRoZSBwYXJhbWV0ZXJzLCBhbmQgcmV0dXJucyB0aGUgc3VtIG9mIHRoZW0gYWxsLgorICogJ3gnIGlzIHRoZSBudW1iZXIgb2YgdmFyaWFkaWMgcGFyYW1ldGVycyBhbGwgb2Ygd2hpY2ggYXJlIGRvdWJsZSBpbiB0aGlzIHRlc3QKKyAqLworZG91YmxlIGZsb2F0X3ZhX2ZuKHVuc2lnbmVkIGludCB4LCBkb3VibGUgeSwuLi4pCit7CisgIGRvdWJsZSB0b3RhbD0wLjA7CisgIHZhX2xpc3QgYXA7CisgIHVuc2lnbmVkIGludCBpOworCisgIHRvdGFsKz0oZG91YmxlKXg7CisgIHRvdGFsKz15OworCisgIHByaW50ZigiJXU6ICUuMWYgOiIsIHgsIHkpOworCisgIHZhX3N0YXJ0KGFwLCB5KTsKKyAgZm9yKGk9MDtpPHg7aSsrKQorICB7CisgICAgZG91YmxlIGFyZz12YV9hcmcoYXAsIGRvdWJsZSk7CisgICAgdG90YWwrPWFyZzsKKyAgICBwcmludGYoIiAlZDolLjFmICIsIGksIGFyZyk7CisgIH0KKyAgdmFfZW5kKGFwKTsKKworICBwcmludGYoIiB0b3RhbDogJS4xZlxuIiwgdG90YWwpOworCisgIHJldHVybiB0b3RhbDsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgICAgY2lmOworCisgIGZmaV90eXBlICAgICphcmdfdHlwZXNbNV07CisgIHZvaWQgICAgICAgICp2YWx1ZXNbNV07CisgIGRvdWJsZSAgICAgICAgZG91Ymxlc1s1XTsKKyAgdW5zaWduZWQgaW50IGZpcnN0YXJnOworICBkb3VibGUgICAgICAgIHJlc2ZwOworCisgIC8qIEZpcnN0IHRlc3QsIHBhc3MgZmxvYXRfdmFfZm4oMCwyLjApIC0gbm90ZSB0aGVyZSBhcmUgbm8gYWN0dWFsCisgICAqIHZhcmlhZGljIHBhcmFtZXRlcnMsIGJ1dCBpdCdzIGRlY2xhcmVkIHZhcmlhZGljIHNvIHRoZSBBQkkgbWF5IGJlCisgICAqIGRpZmZlcmVudC4gKi8KKyAgLyogQ2FsbCBpdCBzdGF0aWNhbGx5IGFuZCB0aGVuIHZpYSBmZmkgKi8KKyAgcmVzZnA9ZmxvYXRfdmFfZm4oMCwyLjApOworICAvKiB7IGRnLW91dHB1dCAiMDogMi4wIDogdG90YWw6IDIuMCIgfSAqLworICBwcmludGYoImNvbXBpbGVkOiAlLjFmXG4iLCByZXNmcCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbmNvbXBpbGVkOiAyLjAiIH0gKi8KKworICBhcmdfdHlwZXNbMF0gPSAmZmZpX3R5cGVfdWludDsKKyAgYXJnX3R5cGVzWzFdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgYXJnX3R5cGVzWzJdID0gTlVMTDsKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmX3ZhcigmY2lmLCBGRklfREVGQVVMVF9BQkksIDIsIDIsCisgICAgICAgICZmZmlfdHlwZV9kb3VibGUsIGFyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBmaXJzdGFyZyA9IDA7CisgIGRvdWJsZXNbMF0gPSAyLjA7CisgIHZhbHVlc1swXSA9ICZmaXJzdGFyZzsKKyAgdmFsdWVzWzFdID0gJmRvdWJsZXNbMF07CisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihmbG9hdF92YV9mbiksICZyZXNmcCwgdmFsdWVzKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxuMDogMi4wIDogdG90YWw6IDIuMCIgfSAqLworICBwcmludGYoImZmaTogJS4xZlxuIiwgcmVzZnApOworICAvKiB7IGRnLW91dHB1dCAiXG5mZmk6IDIuMCIgfSAqLworCisgIC8qIFNlY29uZCB0ZXN0LCBmbG9hdF92YV9mbigyLDIuMCwzLjAsNC4wKSwgbm93IHdpdGggdmFyaWFkaWMgcGFyYW1zICovCisgIC8qIENhbGwgaXQgc3RhdGljYWxseSBhbmQgdGhlbiB2aWEgZmZpICovCisgIHJlc2ZwPWZsb2F0X3ZhX2ZuKDIsMi4wLDMuMCw0LjApOworICAvKiB7IGRnLW91dHB1dCAiXG4yOiAyLjAgOiAwOjMuMCAgMTo0LjAgIHRvdGFsOiAxMS4wIiB9ICovCisgIHByaW50ZigiY29tcGlsZWQ6ICUuMWZcbiIsIHJlc2ZwKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxuY29tcGlsZWQ6IDExLjAiIH0gKi8KKworICBhcmdfdHlwZXNbMF0gPSAmZmZpX3R5cGVfdWludDsKKyAgYXJnX3R5cGVzWzFdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgYXJnX3R5cGVzWzJdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgYXJnX3R5cGVzWzNdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgYXJnX3R5cGVzWzRdID0gTlVMTDsKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmX3ZhcigmY2lmLCBGRklfREVGQVVMVF9BQkksIDIsIDQsCisgICAgICAgICZmZmlfdHlwZV9kb3VibGUsIGFyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBmaXJzdGFyZyA9IDI7CisgIGRvdWJsZXNbMF0gPSAyLjA7CisgIGRvdWJsZXNbMV0gPSAzLjA7CisgIGRvdWJsZXNbMl0gPSA0LjA7CisgIHZhbHVlc1swXSA9ICZmaXJzdGFyZzsKKyAgdmFsdWVzWzFdID0gJmRvdWJsZXNbMF07CisgIHZhbHVlc1syXSA9ICZkb3VibGVzWzFdOworICB2YWx1ZXNbM10gPSAmZG91Ymxlc1syXTsKKyAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKGZsb2F0X3ZhX2ZuKSwgJnJlc2ZwLCB2YWx1ZXMpOworICAvKiB7IGRnLW91dHB1dCAiXG4yOiAyLjAgOiAwOjMuMCAgMTo0LjAgIHRvdGFsOiAxMS4wIiB9ICovCisgIHByaW50ZigiZmZpOiAlLjFmXG4iLCByZXNmcCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbmZmaTogMTEuMCIgfSAqLworCisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9odWdlX3N0cnVjdC5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvaHVnZV9zdHJ1Y3QuYwppbmRleCA5Y2ZmYjcxLi42NTdmZTU0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9odWdlX3N0cnVjdC5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2h1Z2Vfc3RydWN0LmMKQEAgLTcsNyArNyw4IEBACiAKIC8qIHsgZGctZXhjZXNzLWVycm9ycyAiIiB7IHRhcmdldCB4ODZfNjQtKi1taW5ndyogeDg2XzY0LSotY3lnd2luKiB9IH0gKi8KIC8qIHsgZGctZG8gcnVuIHsgeGZhaWwgc3Ryb25nYXJtKi0qLSogeHNjYWxlKi0qLSogfSB9ICovCi0vKiB7IGRnLW9wdGlvbnMgLW1sb25nLWRvdWJsZS0xMjggeyB0YXJnZXQgcG93ZXJwYzY0Ki0qLSogfSB9ICovCisvKiB7IGRnLW9wdGlvbnMgLW1sb25nLWRvdWJsZS0xMjggeyB0YXJnZXQgcG93ZXJwYzY0Ki0qLWxpbnV4KiB9IH0gKi8KKy8qIHsgZGctb3B0aW9ucyAtV2Zvcm1hdD0wIHsgdGFyZ2V0IG1veGllKi0qLWVsZiB9IH0gKi8KIC8qIHsgZGctb3V0cHV0ICIiIHsgeGZhaWwgeDg2XzY0LSotbWluZ3cqIHg4Nl82NC0qLWN5Z3dpbiogfSB9ICovCiAKICNpbmNsdWRlICJmZml0ZXN0LmgiCkBAIC0xMjksMTQgKzEzMCwxNCBAQAogCQkJdWk2NF80ICsgNCwgc2k2NF80ICsgNCwgZl80ICsgNCwgZF80ICsgNCwgbGRfNCArIDQsIChjaGFyKikoKGludHB0cl90KXBfNCArIDQpLCAKIAkJdWk4XzUgKyA1LCBzaThfNSArIDV9OwogCi0JcHJpbnRmKCIlaGh1ICVoaGQgJWh1ICVoZCAldSAlZCAlIiBQUkl1NjQgIiAlIiBQUklkNjQgIiAlLjBmICUuMGYgJS4wTGYgJSNseCAiCi0JCSIlaGh1ICVoaGQgJWh1ICVoZCAldSAlZCAlIiBQUkl1NjQgIiAlIiBQUklkNjQgIiAlLjBmICUuMGYgJS4wTGYgJSNseCAiCi0JCSIlaGh1ICVoaGQgJWh1ICVoZCAldSAlZCAlIiBQUkl1NjQgIiAlIiBQUklkNjQgIiAlLjBmICUuMGYgJS4wTGYgJSNseCAiCi0JCSIlaGh1ICVoaGQgJWh1ICVoZCAldSAlZCAlIiBQUkl1NjQgIiAlIiBQUklkNjQgIiAlLjBmICUuMGYgJS4wTGYgJSNseCAlaGh1ICVoaGQ6ICIKLQkJIiVoaHUgJWhoZCAlaHUgJWhkICV1ICVkICUiIFBSSXU2NCAiICUiIFBSSWQ2NCAiICUuMGYgJS4wZiAlLjBMZiAlI2x4ICIKLQkJIiVoaHUgJWhoZCAlaHUgJWhkICV1ICVkICUiIFBSSXU2NCAiICUiIFBSSWQ2NCAiICUuMGYgJS4wZiAlLjBMZiAlI2x4ICIKLQkJIiVoaHUgJWhoZCAlaHUgJWhkICV1ICVkICUiIFBSSXU2NCAiICUiIFBSSWQ2NCAiICUuMGYgJS4wZiAlLjBMZiAlI2x4ICIKLQkJIiVoaHUgJWhoZCAlaHUgJWhkICV1ICVkICUiIFBSSXU2NCAiICUiIFBSSWQ2NCAiICUuMGYgJS4wZiAlLjBMZiAlI2x4ICVoaHUgJWhoZFxuIiwKKwlwcmludGYoIiUiIFBSSXU4ICIgJSIgUFJJZDggIiAlaHUgJWhkICV1ICVkICUiIFBSSXU2NCAiICUiIFBSSWQ2NCAiICUuMGYgJS4wZiAlLjBMZiAlI2x4ICIKKwkJIiUiIFBSSXU4ICIgJSIgUFJJZDggIiAlaHUgJWhkICV1ICVkICUiIFBSSXU2NCAiICUiIFBSSWQ2NCAiICUuMGYgJS4wZiAlLjBMZiAlI2x4ICIKKwkJIiUiIFBSSXU4ICIgJSIgUFJJZDggIiAlaHUgJWhkICV1ICVkICUiIFBSSXU2NCAiICUiIFBSSWQ2NCAiICUuMGYgJS4wZiAlLjBMZiAlI2x4ICIKKwkJIiUiIFBSSXU4ICIgJSIgUFJJZDggIiAlaHUgJWhkICV1ICVkICUiIFBSSXU2NCAiICUiIFBSSWQ2NCAiICUuMGYgJS4wZiAlLjBMZiAlI2x4ICUiIFBSSXU4ICIgJSIgUFJJZDggIjogIgorCQkiJSIgUFJJdTggIiAlIiBQUklkOCAiICVodSAlaGQgJXUgJWQgJSIgUFJJdTY0ICIgJSIgUFJJZDY0ICIgJS4wZiAlLjBmICUuMExmICUjbHggIgorCQkiJSIgUFJJdTggIiAlIiBQUklkOCAiICVodSAlaGQgJXUgJWQgJSIgUFJJdTY0ICIgJSIgUFJJZDY0ICIgJS4wZiAlLjBmICUuMExmICUjbHggIgorCQkiJSIgUFJJdTggIiAlIiBQUklkOCAiICVodSAlaGQgJXUgJWQgJSIgUFJJdTY0ICIgJSIgUFJJZDY0ICIgJS4wZiAlLjBmICUuMExmICUjbHggIgorCQkiJSIgUFJJdTggIiAlIiBQUklkOCAiICVodSAlaGQgJXUgJWQgJSIgUFJJdTY0ICIgJSIgUFJJZDY0ICIgJS4wZiAlLjBmICUuMExmICUjbHggJSIgUFJJdTggIiAlIiBQUklkOCAiXG4iLAogCSAgICAgICB1aThfMSwgc2k4XzEsIHVpMTZfMSwgc2kxNl8xLCB1aTMyXzEsIHNpMzJfMSwgdWk2NF8xLCBzaTY0XzEsIGZfMSwgZF8xLCBsZF8xLCAodW5zaWduZWQgbG9uZylwXzEsCiAJCXVpOF8yLCBzaThfMiwgdWkxNl8yLCBzaTE2XzIsIHVpMzJfMiwgc2kzMl8yLCB1aTY0XzIsIHNpNjRfMiwgZl8yLCBkXzIsIGxkXzIsICh1bnNpZ25lZCBsb25nKXBfMiwKIAkJdWk4XzMsIHNpOF8zLCB1aTE2XzMsIHNpMTZfMywgdWkzMl8zLCBzaTMyXzMsIHVpNjRfMywgc2k2NF8zLCBmXzMsIGRfMywgbGRfMywgKHVuc2lnbmVkIGxvbmcpcF8zLApAQCAtMjI5LDYgKzIzMCwxOSBAQAogCWZmaV90eXBlKglzdF9maWVsZHNbNTFdOwogCUJpZ1N0cnVjdAlyZXRWYWw7CiAKKwl1aW50OF90CQl1aTgJCT0gMTsKKwlpbnQ4X3QJCXNpOAkJPSAyOworCXVpbnQxNl90CXVpMTYJPSAzOworCWludDE2X3QJCXNpMTYJPSA0OworCXVpbnQzMl90CXVpMzIJPSA1OworCWludDMyX3QJCXNpMzIJPSA2OworCXVpbnQ2NF90CXVpNjQJPSA3OworCWludDY0X3QJCXNpNjQJPSA4OworCWZsb2F0CQlmCQk9IDk7CisJZG91YmxlCQlkCQk9IDEwOworCWxvbmcgZG91YmxlCWxkCQk9IDExOworCWNoYXIqCQlwCQk9IChjaGFyKikweDEyMzQ1Njc4OworCiAJbWVtc2V0ICgmcmV0VmFsLCAwLCBzaXplb2YocmV0VmFsKSk7CiAKIAlyZXRfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CkBAIC0yNTEsMTkgKzI2NSw2IEBACiAKIAlzdF9maWVsZHNbNTBdID0gTlVMTDsKIAotCXVpbnQ4X3QJCXVpOAkJPSAxOwotCWludDhfdAkJc2k4CQk9IDI7Ci0JdWludDE2X3QJdWkxNgk9IDM7Ci0JaW50MTZfdAkJc2kxNgk9IDQ7Ci0JdWludDMyX3QJdWkzMgk9IDU7Ci0JaW50MzJfdAkJc2kzMgk9IDY7Ci0JdWludDY0X3QJdWk2NAk9IDc7Ci0JaW50NjRfdAkJc2k2NAk9IDg7Ci0JZmxvYXQJCWYJCT0gOTsKLQlkb3VibGUJCWQJCT0gMTA7Ci0JbG9uZyBkb3VibGUJbGQJCT0gMTE7Ci0JY2hhcioJCXAJCT0gKGNoYXIqKTB4MTIzNDU2Nzg7Ci0KIAlhcmdUeXBlc1swXQkJPSBhcmdUeXBlc1sxMl0JPSBhcmdUeXBlc1syNF0JPSBhcmdUeXBlc1szNl0JPSBhcmdUeXBlc1s0OF0JPSAmZmZpX3R5cGVfdWludDg7CiAJYXJnVmFsdWVzWzBdCT0gYXJnVmFsdWVzWzEyXQk9IGFyZ1ZhbHVlc1syNF0JPSBhcmdWYWx1ZXNbMzZdCT0gYXJnVmFsdWVzWzQ4XQk9ICZ1aTg7CiAJYXJnVHlwZXNbMV0JCT0gYXJnVHlwZXNbMTNdCT0gYXJnVHlwZXNbMjVdCT0gYXJnVHlwZXNbMzddCT0gYXJnVHlwZXNbNDldCT0gJmZmaV90eXBlX3NpbnQ4OwpAQCAtMjk1LDExICsyOTYsMTEgQEAKIAlDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCA1MCwgJnJldF9zdHJ1Y3RfdHlwZSwgYXJnVHlwZXMpID09IEZGSV9PSyk7CiAKIAlmZmlfY2FsbCgmY2lmLCBGRklfRk4odGVzdF9sYXJnZV9mbiksICZyZXRWYWwsIGFyZ1ZhbHVlcyk7Ci0JLy8geyBkZy1vdXRwdXQgIjEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDB4MTIzNDU2NzggMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMHgxMjM0NTY3OCAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAweDEyMzQ1Njc4IDEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDB4MTIzNDU2NzggMSAyOiAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMHgxMjM0NTY3OSAzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDEzIDB4MTIzNDU2N2EgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMHgxMjM0NTY3YiA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMTUgMHgxMjM0NTY3YyA2IDciIH0KLQlwcmludGYoInJlczogJWhodSAlaGhkICVodSAlaGQgJXUgJWQgJSIgUFJJdTY0ICIgJSIgUFJJZDY0ICIgJS4wZiAlLjBmICUuMExmICUjbHggIgotCQkiJWhodSAlaGhkICVodSAlaGQgJXUgJWQgJSIgUFJJdTY0ICIgJSIgUFJJZDY0ICIgJS4wZiAlLjBmICUuMExmICUjbHggIgotCQkiJWhodSAlaGhkICVodSAlaGQgJXUgJWQgJSIgUFJJdTY0ICIgJSIgUFJJZDY0ICIgJS4wZiAlLjBmICUuMExmICUjbHggIgotCQkiJWhodSAlaGhkICVodSAlaGQgJXUgJWQgJSIgUFJJdTY0ICIgJSIgUFJJZDY0ICIgJS4wZiAlLjBmICUuMExmICUjbHggJWhodSAlaGhkXG4iLAorCS8qIHsgZGctb3V0cHV0ICIxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAweDEyMzQ1Njc4IDEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDB4MTIzNDU2NzggMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMHgxMjM0NTY3OCAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAweDEyMzQ1Njc4IDEgMjogMiAzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDB4MTIzNDU2NzkgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxMyAweDEyMzQ1NjdhIDQgNSA2IDcgOCA5IDEwIDExIDEyIDEzIDE0IDB4MTIzNDU2N2IgNSA2IDcgOCA5IDEwIDExIDEyIDEzIDE0IDE1IDB4MTIzNDU2N2MgNiA3IiB9ICovCisJcHJpbnRmKCJyZXM6ICUiIFBSSXU4ICIgJSIgUFJJZDggIiAlaHUgJWhkICV1ICVkICUiIFBSSXU2NCAiICUiIFBSSWQ2NCAiICUuMGYgJS4wZiAlLjBMZiAlI2x4ICIKKwkJIiUiIFBSSXU4ICIgJSIgUFJJZDggIiAlaHUgJWhkICV1ICVkICUiIFBSSXU2NCAiICUiIFBSSWQ2NCAiICUuMGYgJS4wZiAlLjBMZiAlI2x4ICIKKwkJIiUiIFBSSXU4ICIgJSIgUFJJZDggIiAlaHUgJWhkICV1ICVkICUiIFBSSXU2NCAiICUiIFBSSWQ2NCAiICUuMGYgJS4wZiAlLjBMZiAlI2x4ICIKKwkJIiUiIFBSSXU4ICIgJSIgUFJJZDggIiAlaHUgJWhkICV1ICVkICUiIFBSSXU2NCAiICUiIFBSSWQ2NCAiICUuMGYgJS4wZiAlLjBMZiAlI2x4ICUiIFBSSXU4ICIgJSIgUFJJZDggIlxuIiwKIAkJcmV0VmFsLmEsIHJldFZhbC5iLCByZXRWYWwuYywgcmV0VmFsLmQsIHJldFZhbC5lLCByZXRWYWwuZiwKIAkgICAgICAgcmV0VmFsLmcsIHJldFZhbC5oLCByZXRWYWwuaSwgcmV0VmFsLmosIHJldFZhbC5rLCAodW5zaWduZWQgbG9uZylyZXRWYWwubCwKIAkJcmV0VmFsLm0sIHJldFZhbC5uLCByZXRWYWwubywgcmV0VmFsLnAsIHJldFZhbC5xLCByZXRWYWwuciwKQEAgLTMwOCw3ICszMDksNyBAQAogCSAgICAgICByZXRWYWwuZWUsIHJldFZhbC5mZiwgcmV0VmFsLmdnLCByZXRWYWwuaGgsIHJldFZhbC5paSwgKHVuc2lnbmVkIGxvbmcpcmV0VmFsLmpqLAogCQlyZXRWYWwua2ssIHJldFZhbC5sbCwgcmV0VmFsLm1tLCByZXRWYWwubm4sIHJldFZhbC5vbywgcmV0VmFsLnBwLAogCSAgICAgICByZXRWYWwucXEsIHJldFZhbC5yciwgcmV0VmFsLnNzLCByZXRWYWwudHQsIHJldFZhbC51dSwgKHVuc2lnbmVkIGxvbmcpcmV0VmFsLnZ2LCByZXRWYWwud3csIHJldFZhbC54eCk7Ci0JLy8geyBkZy1vdXRwdXQgIlxucmVzOiAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMHgxMjM0NTY3OSAzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDEzIDB4MTIzNDU2N2EgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMHgxMjM0NTY3YiA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMTUgMHgxMjM0NTY3YyA2IDciIH0KKwkvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAweDEyMzQ1Njc5IDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMHgxMjM0NTY3YSA0IDUgNiA3IDggOSAxMCAxMSAxMiAxMyAxNCAweDEyMzQ1NjdiIDUgNiA3IDggOSAxMCAxMSAxMiAxMyAxNCAxNSAweDEyMzQ1NjdjIDYgNyIgfSAqLwogCiAJQ0hFQ0soZmZpX3ByZXBfY2xvc3VyZV9sb2MocGNsLCAmY2lmLCBjbHNfbGFyZ2VfZm4sIE5VTEwsIGNvZGUpID09IEZGSV9PSyk7CiAKQEAgLTMyMywxMSArMzI0LDExIEBACiAJCXVpOCwgc2k4LCB1aTE2LCBzaTE2LCB1aTMyLCBzaTMyLCB1aTY0LCBzaTY0LCBmLCBkLCBsZCwgcCwKIAkJdWk4LCBzaTgsIHVpMTYsIHNpMTYsIHVpMzIsIHNpMzIsIHVpNjQsIHNpNjQsIGYsIGQsIGxkLCBwLAogCQl1aTgsIHNpOCk7Ci0JLy8geyBkZy1vdXRwdXQgIlxuMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMHgxMjM0NTY3OCAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAweDEyMzQ1Njc4IDEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDB4MTIzNDU2NzggMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMHgxMjM0NTY3OCAxIDI6IDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAweDEyMzQ1Njc5IDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMHgxMjM0NTY3YSA0IDUgNiA3IDggOSAxMCAxMSAxMiAxMyAxNCAweDEyMzQ1NjdiIDUgNiA3IDggOSAxMCAxMSAxMiAxMyAxNCAxNSAweDEyMzQ1NjdjIDYgNyIgfQotCXByaW50ZigicmVzOiAlaGh1ICVoaGQgJWh1ICVoZCAldSAlZCAlIiBQUkl1NjQgIiAlIiBQUklkNjQgIiAlLjBmICUuMGYgJS4wTGYgJSNseCAiCi0JCSIlaGh1ICVoaGQgJWh1ICVoZCAldSAlZCAlIiBQUkl1NjQgIiAlIiBQUklkNjQgIiAlLjBmICUuMGYgJS4wTGYgJSNseCAiCi0JCSIlaGh1ICVoaGQgJWh1ICVoZCAldSAlZCAlIiBQUkl1NjQgIiAlIiBQUklkNjQgIiAlLjBmICUuMGYgJS4wTGYgJSNseCAiCi0JCSIlaGh1ICVoaGQgJWh1ICVoZCAldSAlZCAlIiBQUkl1NjQgIiAlIiBQUklkNjQgIiAlLjBmICUuMGYgJS4wTGYgJSNseCAlaGh1ICVoaGRcbiIsCisJLyogeyBkZy1vdXRwdXQgIlxuMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMHgxMjM0NTY3OCAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAweDEyMzQ1Njc4IDEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDB4MTIzNDU2NzggMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMHgxMjM0NTY3OCAxIDI6IDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAweDEyMzQ1Njc5IDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMHgxMjM0NTY3YSA0IDUgNiA3IDggOSAxMCAxMSAxMiAxMyAxNCAweDEyMzQ1NjdiIDUgNiA3IDggOSAxMCAxMSAxMiAxMyAxNCAxNSAweDEyMzQ1NjdjIDYgNyIgfSAqLworCXByaW50ZigicmVzOiAlIiBQUkl1OCAiICUiIFBSSWQ4ICIgJWh1ICVoZCAldSAlZCAlIiBQUkl1NjQgIiAlIiBQUklkNjQgIiAlLjBmICUuMGYgJS4wTGYgJSNseCAiCisJCSIlIiBQUkl1OCAiICUiIFBSSWQ4ICIgJWh1ICVoZCAldSAlZCAlIiBQUkl1NjQgIiAlIiBQUklkNjQgIiAlLjBmICUuMGYgJS4wTGYgJSNseCAiCisJCSIlIiBQUkl1OCAiICUiIFBSSWQ4ICIgJWh1ICVoZCAldSAlZCAlIiBQUkl1NjQgIiAlIiBQUklkNjQgIiAlLjBmICUuMGYgJS4wTGYgJSNseCAiCisJCSIlIiBQUkl1OCAiICUiIFBSSWQ4ICIgJWh1ICVoZCAldSAlZCAlIiBQUkl1NjQgIiAlIiBQUklkNjQgIiAlLjBmICUuMGYgJS4wTGYgJSNseCAlIiBQUkl1OCAiICUiIFBSSWQ4ICJcbiIsCiAJCXJldFZhbC5hLCByZXRWYWwuYiwgcmV0VmFsLmMsIHJldFZhbC5kLCByZXRWYWwuZSwgcmV0VmFsLmYsCiAJICAgICAgIHJldFZhbC5nLCByZXRWYWwuaCwgcmV0VmFsLmksIHJldFZhbC5qLCByZXRWYWwuaywgKHVuc2lnbmVkIGxvbmcpcmV0VmFsLmwsCiAJCXJldFZhbC5tLCByZXRWYWwubiwgcmV0VmFsLm8sIHJldFZhbC5wLCByZXRWYWwucSwgcmV0VmFsLnIsCkBAIC0zMzYsNyArMzM3LDcgQEAKIAkgICAgICAgcmV0VmFsLmVlLCByZXRWYWwuZmYsIHJldFZhbC5nZywgcmV0VmFsLmhoLCByZXRWYWwuaWksICh1bnNpZ25lZCBsb25nKXJldFZhbC5qaiwKIAkJcmV0VmFsLmtrLCByZXRWYWwubGwsIHJldFZhbC5tbSwgcmV0VmFsLm5uLCByZXRWYWwub28sIHJldFZhbC5wcCwKIAkgICAgICAgcmV0VmFsLnFxLCByZXRWYWwucnIsIHJldFZhbC5zcywgcmV0VmFsLnR0LCByZXRWYWwudXUsICh1bnNpZ25lZCBsb25nKXJldFZhbC52diwgcmV0VmFsLnd3LCByZXRWYWwueHgpOwotCS8vIHsgZGctb3V0cHV0ICJcbnJlczogMiAzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDB4MTIzNDU2NzkgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxMyAweDEyMzQ1NjdhIDQgNSA2IDcgOCA5IDEwIDExIDEyIDEzIDE0IDB4MTIzNDU2N2IgNSA2IDcgOCA5IDEwIDExIDEyIDEzIDE0IDE1IDB4MTIzNDU2N2MgNiA3IiB9CisJLyogeyBkZy1vdXRwdXQgIlxucmVzOiAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMHgxMjM0NTY3OSAzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDEzIDB4MTIzNDU2N2EgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMHgxMjM0NTY3YiA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMTUgMHgxMjM0NTY3YyA2IDciIH0gKi8KIAogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbWFueTIuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL21hbnkyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThlYWM2MAotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL21hbnkyLmMKQEAgLTAsMCArMSw1NyBAQAorLyogQXJlYTogICAgICAgIGZmaV9jYWxsCisgICBQdXJwb3NlOiAgICAgQ2hlY2sgdWludDhfdCBhcmd1bWVudHMuCisgICBMaW1pdGF0aW9uczogbm9uZS4KKyAgIFBSOiAgICAgICAgICBQUjQ1Njc3LgorICAgT3JpZ2luYXRvcjogIERhbiBXaXR0ZSA8ZHdpdHRlQGdtYWlsLmNvbT4gMjAxMDA5MTYgICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKworI2luY2x1ZGUgImZmaXRlc3QuaCIKKworI2RlZmluZSBOQVJHUyA3CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1ODsKKworI2lmZGVmIF9fR05VQ19fCitfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCisjZW5kaWYKK3VpbnQ4X3QKK2ZvbyAodWludDhfdCBhLCB1aW50OF90IGIsIHVpbnQ4X3QgYywgdWludDhfdCBkLAorICAgICB1aW50OF90IGUsIHVpbnQ4X3QgZiwgdWludDhfdCBnKQoreworICByZXR1cm4gYSArIGIgKyBjICsgZCArIGUgKyBmICsgZzsKK30KKwordWludDhfdAorYmFyICh1aW50OF90IGEsIHVpbnQ4X3QgYiwgdWludDhfdCBjLCB1aW50OF90IGQsCisgICAgIHVpbnQ4X3QgZSwgdWludDhfdCBmLCB1aW50OF90IGcpCit7CisgIHJldHVybiBmb28gKGEsIGIsIGMsIGQsIGUsIGYsIGcpOworfQorCitpbnQKK21haW4gKHZvaWQpCit7CisgIGZmaV90eXBlICpmZml0eXBlc1tOQVJHU107CisgIGludCBpOworICBmZmlfY2lmIGNpZjsKKyAgZmZpX2FyZyByZXN1bHQgPSAwOworICB1aW50OF90IGFyZ3NbTkFSR1NdOworICB2b2lkICphcmdwdHJzW05BUkdTXTsKKworICBmb3IgKGkgPSAwOyBpIDwgTkFSR1M7ICsraSkKKyAgICBmZml0eXBlc1tpXSA9ICZmZmlfdHlwZV91aW50ODsKKworICBDSEVDSyAoZmZpX3ByZXBfY2lmICgmY2lmLCBGRklfREVGQVVMVF9BQkksIE5BUkdTLAorCQkgICAgICAgJmZmaV90eXBlX3VpbnQ4LCBmZml0eXBlcykgPT0gRkZJX09LKTsKKworICBmb3IgKGkgPSAwOyBpIDwgTkFSR1M7ICsraSkKKyAgICB7CisgICAgICBhcmdzW2ldID0gaTsKKyAgICAgIGFyZ3B0cnNbaV0gPSAmYXJnc1tpXTsKKyAgICB9CisgIGZmaV9jYWxsICgmY2lmLCBGRklfRk4gKGJhciksICZyZXN1bHQsIGFyZ3B0cnMpOworCisgIENIRUNLIChyZXN1bHQgPT0gMjEpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL21hbnkyX3dpbjMyLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9tYW55Ml93aW4zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZGJlNGQKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9tYW55Ml93aW4zMi5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qIEFyZWE6CWZmaV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBzdGRjYWxsIG1hbnkgY2FsbCBvbiBYODZfV0lOMzIgc3lzdGVtcy4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJRnJvbSB0aGUgb3JpZ2luYWwgZmZpdGVzdC5jICAqLworCisvKiB7IGRnLWRvIHJ1biB7IHRhcmdldCBpPzg2LSotY3lnd2luKiBpPzg2LSotbWluZ3cqIH0gfSAqLworCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorI2luY2x1ZGUgPGZsb2F0Lmg+CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChmYXN0Y2FsbCkpIGZhc3RjYWxsX21hbnkoZmxvYXQgZjEsCisJCQkJCQkgICBmbG9hdCBmMiwKKwkJCQkJCSAgIGZsb2F0IGYzLAorCQkJCQkJICAgZmxvYXQgZjQsCisJCQkJCQkgICBmbG9hdCBmNSwKKwkJCQkJCSAgIGZsb2F0IGY2LAorCQkJCQkJICAgZmxvYXQgZjcsCisJCQkJCQkgICBmbG9hdCBmOCwKKwkJCQkJCSAgIGZsb2F0IGY5LAorCQkJCQkJICAgZmxvYXQgZjEwLAorCQkJCQkJICAgZmxvYXQgZjExLAorCQkJCQkJICAgZmxvYXQgZjEyLAorCQkJCQkJICAgZmxvYXQgZjEzKQoreworICByZXR1cm4gKChmMS9mMitmMy9mNCtmNS9mNitmNy9mOCtmOS9mMTArZjExL2YxMikgKiBmMTMpOworfQorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIGZmaV90eXBlICphcmdzWzEzXTsKKyAgdm9pZCAqdmFsdWVzWzEzXTsKKyAgZmxvYXQgZmFbMTNdOworICBmbG9hdCBmLCBmZjsKKyAgdW5zaWduZWQgbG9uZyB1bDsKKworICBmb3IgKHVsID0gMDsgdWwgPCAxMzsgdWwrKykKKyAgICB7CisgICAgICBhcmdzW3VsXSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgICAgIHZhbHVlc1t1bF0gPSAmZmFbdWxdOworCWZhW3VsXSA9IChmbG9hdCkgdWw7CisgICAgfQorCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0ZBU1RDQUxMLCAxMywKKwkJICAgICAmZmZpX3R5cGVfZmxvYXQsIGFyZ3MpID09IEZGSV9PSyk7CisKKyAgZmYgPSAgZmFzdGNhbGxfbWFueShmYVswXSwgZmFbMV0sCisJCSAgICAgZmFbMl0sIGZhWzNdLAorCQkgICAgIGZhWzRdLCBmYVs1XSwKKwkJICAgICBmYVs2XSwgZmFbN10sCisJCSAgICAgZmFbOF0sIGZhWzldLAorCQkgICAgIGZhWzEwXSwgZmFbMTFdLCBmYVsxMl0pOworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihmYXN0Y2FsbF9tYW55KSwgJmYsIHZhbHVlcyk7CisKKyAgaWYgKGYgLSBmZiA8IEZMVF9FUFNJTE9OKQorICAgIHByaW50ZigiZmFzdGNhbGwgbWFueSBhcmcgdGVzdHMgb2shXG4iKTsKKyAgZWxzZQorICAgIENIRUNLKDApOworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVnaW50LmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZWdpbnQuYwppbmRleCAzMTY4MTEzLi42ZTJmMjZmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZWdpbnQuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZWdpbnQuYwpAQCAtNSw3ICs1LDYgQEAKICAgIE9yaWdpbmF0b3I6CUZyb20gdGhlIG9yaWdpbmFsIGZmaXRlc3QuYyAgKi8KIAogLyogeyBkZy1kbyBydW4gfSAqLwotLyogeyBkZy1vcHRpb25zIC1PMiB9ICovCiAKICNpbmNsdWRlICJmZml0ZXN0LmgiCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QuYwppbmRleCA4YWE1MjdlLi5jMTVlM2EwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0LmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdC5jCkBAIC03Nyw2ICs3NywxMiBAQAogICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGUsIGNsc19zdHJ1Y3RfdHlwZTEsIGNsc19zdHJ1Y3RfdHlwZTI7CiAgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzVdOwogCisgIHN0cnVjdCBjbHNfc3RydWN0XzE2Ynl0ZTEgZV9kYmwgPSB7IDkuMCwgMi4wLCA2fTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMTZieXRlMiBmX2RibCA9IHsgMSwgMi4wLCAzLjB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF9jb21iaW5lZCBnX2RibCA9IHt7NC4wLCA1LjAsIDZ9LAorCQkJCSAgICAgIHszLCAxLjAsIDguMH19OworICBzdHJ1Y3QgY2xzX3N0cnVjdF9jb21iaW5lZCByZXNfZGJsOworCiAgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKICAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwpAQCAtOTIsMTIgKzk4LDYgQEAKICAgY2xzX3N0cnVjdF90eXBlMi50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwogICBjbHNfc3RydWN0X3R5cGUyLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHMyOwogCi0gIHN0cnVjdCBjbHNfc3RydWN0XzE2Ynl0ZTEgZV9kYmwgPSB7IDkuMCwgMi4wLCA2fTsKLSAgc3RydWN0IGNsc19zdHJ1Y3RfMTZieXRlMiBmX2RibCA9IHsgMSwgMi4wLCAzLjB9OwotICBzdHJ1Y3QgY2xzX3N0cnVjdF9jb21iaW5lZCBnX2RibCA9IHt7NC4wLCA1LjAsIDZ9LAotCQkJCSAgICAgIHszLCAxLjAsIDguMH19OwotICBzdHJ1Y3QgY2xzX3N0cnVjdF9jb21iaW5lZCByZXNfZGJsOwotCiAgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX2RvdWJsZTsKICAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfZmxvYXQ7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzJdID0gJmZmaV90eXBlX3NpbnQ7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0MS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDEuYwppbmRleCAyYTlmNTE1Li40NzdhNmI5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0MS5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QxLmMKQEAgLTgxLDYgKzgxLDEzIEBACiAgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZSwgY2xzX3N0cnVjdF90eXBlMSwgY2xzX3N0cnVjdF90eXBlMjsKICAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbNV07CiAKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMTZieXRlMSBlX2RibCA9IHsgOS4wLCAyLjAsIDZ9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF8xNmJ5dGUyIGZfZGJsID0geyAxLCAyLjAsIDMuMH07CisgIHN0cnVjdCBjbHNfc3RydWN0X2NvbWJpbmVkIGdfZGJsID0ge3s0LjAsIDUuMCwgNn0sCisJCQkJICAgICAgezMsIDEuMCwgOC4wfX07CisgIHN0cnVjdCBjbHNfc3RydWN0XzE2Ynl0ZTEgaF9kYmwgPSB7IDMuMCwgMi4wLCA0fTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfY29tYmluZWQgcmVzX2RibDsKKwogICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOwogICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKQEAgLTk2LDEzICsxMDMsNiBAQAogICBjbHNfc3RydWN0X3R5cGUyLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CiAgIGNsc19zdHJ1Y3RfdHlwZTIuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczI7CiAKLSAgc3RydWN0IGNsc19zdHJ1Y3RfMTZieXRlMSBlX2RibCA9IHsgOS4wLCAyLjAsIDZ9OwotICBzdHJ1Y3QgY2xzX3N0cnVjdF8xNmJ5dGUyIGZfZGJsID0geyAxLCAyLjAsIDMuMH07Ci0gIHN0cnVjdCBjbHNfc3RydWN0X2NvbWJpbmVkIGdfZGJsID0ge3s0LjAsIDUuMCwgNn0sCi0JCQkJICAgICAgezMsIDEuMCwgOC4wfX07Ci0gIHN0cnVjdCBjbHNfc3RydWN0XzE2Ynl0ZTEgaF9kYmwgPSB7IDMuMCwgMi4wLCA0fTsKLSAgc3RydWN0IGNsc19zdHJ1Y3RfY29tYmluZWQgcmVzX2RibDsKLQogICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV9kb3VibGU7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX2Zsb2F0OwogICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9ICZmZmlfdHlwZV9zaW50OwpAQCAtMTU2LDYgKzE1Niw2IEBACiAgIENIRUNLKCByZXNfZGJsLmUuaWkgPT0gKGVfZGJsLmMgKyBmX2RibC5paSArIGdfZGJsLmUuaWkpKTsKICAgQ0hFQ0soIHJlc19kYmwuZS5kZCA9PSAoZV9kYmwuYSArIGZfZGJsLmRkICsgZ19kYmwuZS5kZCkpOwogICBDSEVDSyggcmVzX2RibC5lLmZmID09IChlX2RibC5iICsgZl9kYmwuZmYgKyBnX2RibC5lLmZmKSk7Ci0gIC8vICBDSEVDSyggMSA9PSAwKTsKKyAgLyogIENIRUNLKCAxID09IDApOyAqLwogICBleGl0KDApOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDEwLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0MTAuYwppbmRleCBkNmE3MThiLi4zNGE3NGU3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0MTAuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0MTAuYwpAQCAtNjcsNiArNjcsMTIgQEAKICAgZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlLCBjbHNfc3RydWN0X3R5cGUxLCBjbHNfc3RydWN0X3R5cGUyOwogICBmZmlfdHlwZSogZGJsX2FyZ190eXBlc1s0XTsKIAorICBzdHJ1Y3QgQSBlX2RibCA9IHsgMUxMLCA3fTsKKyAgc3RydWN0IEIgZl9kYmwgPSB7IDk5LCB7MTJMTCAsIDEyN30sIDI1NX07CisgIHN0cnVjdCBDIGdfZGJsID0geyAyTEwsIDl9OworCisgIHN0cnVjdCBCIHJlc19kYmw7CisKICAgY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOwogICBjbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKICAgY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CkBAIC04MiwxMiArODgsNiBAQAogICBjbHNfc3RydWN0X3R5cGUyLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CiAgIGNsc19zdHJ1Y3RfdHlwZTIuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczI7CiAKLSAgc3RydWN0IEEgZV9kYmwgPSB7IDFMTCwgN307Ci0gIHN0cnVjdCBCIGZfZGJsID0geyA5OSwgezEyTEwgLCAxMjd9LCAyNTV9OwotICBzdHJ1Y3QgQyBnX2RibCA9IHsgMkxMLCA5fTsKLQotICBzdHJ1Y3QgQiByZXNfZGJsOwotCiAgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX3VpbnQ2NDsKICAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfdWNoYXI7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzJdID0gTlVMTDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QxMS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNlNjk0OAotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QxMS5jCkBAIC0wLDAgKzEsMTIxIEBACisvKiBBcmVhOglmZmlfY2FsbCwgY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBwYXJhbWV0ZXIgcGFzc2luZyB3aXRoIG5lc3RlZCBzdHJ1Y3RzCisJCW9mIGEgc2luZ2xlIHR5cGUuICBUaGlzIHRlc3RzIHRoZSBzcGVjaWFsIGNhc2VzCisJCWZvciBob21vZ2Vub3VzIGZsb2F0aW5nLXBvaW50IGFnZ3JlZ2F0ZXMgaW4gdGhlCisJCUFBcmNoNjQgUENTLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOiAgQVJNIEx0ZC4gICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3R5cGVkZWYgc3RydWN0IEEgeworICBmbG9hdCBhX3g7CisgIGZsb2F0IGFfeTsKK30gQTsKKwordHlwZWRlZiBzdHJ1Y3QgQiB7CisgIGZsb2F0IGJfeDsKKyAgZmxvYXQgYl95OworfSBCOworCit0eXBlZGVmIHN0cnVjdCBDIHsKKyAgQSBhOworICBCIGI7Cit9IEM7CisKK3N0YXRpYyBDIENfZm4gKGludCB4LCBpbnQgeSwgaW50IHosIEMgc291cmNlLCBpbnQgaSwgaW50IGosIGludCBrKQoreworICBDIHJlc3VsdDsKKyAgcmVzdWx0LmEuYV94ID0gc291cmNlLmEuYV94OworICByZXN1bHQuYS5hX3kgPSBzb3VyY2UuYS5hX3k7CisgIHJlc3VsdC5iLmJfeCA9IHNvdXJjZS5iLmJfeDsKKyAgcmVzdWx0LmIuYl95ID0gc291cmNlLmIuYl95OworCisgIHByaW50ZiAoIiVkLCAlZCwgJWQsICVkLCAlZCwgJWRcbiIsIHgsIHksIHosIGksIGosIGspOworCisgIHByaW50ZiAoIiUuMWYsICUuMWYsICUuMWYsICUuMWYsICIKKwkgICIlLjFmLCAlLjFmLCAlLjFmLCAlLjFmXG4iLAorCSAgc291cmNlLmEuYV94LCBzb3VyY2UuYS5hX3ksCisJICBzb3VyY2UuYi5iX3gsIHNvdXJjZS5iLmJfeSwKKwkgIHJlc3VsdC5hLmFfeCwgcmVzdWx0LmEuYV95LAorCSAgcmVzdWx0LmIuYl94LCByZXN1bHQuYi5iX3kpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKworICBmZmlfdHlwZSogc3RydWN0X2ZpZWxkc19zb3VyY2VfYVszXTsKKyAgZmZpX3R5cGUqIHN0cnVjdF9maWVsZHNfc291cmNlX2JbM107CisgIGZmaV90eXBlKiBzdHJ1Y3RfZmllbGRzX3NvdXJjZV9jWzNdOworICBmZmlfdHlwZSogYXJnX3R5cGVzWzhdOworCisgIGZmaV90eXBlIHN0cnVjdF90eXBlX2EsIHN0cnVjdF90eXBlX2IsIHN0cnVjdF90eXBlX2M7CisKKyAgc3RydWN0IEEgc291cmNlX2ZsZF9hID0gezEuMCwgMi4wfTsKKyAgc3RydWN0IEIgc291cmNlX2ZsZF9iID0gezQuMCwgOC4wfTsKKyAgaW50IGsgPSAxOworCisgIHN0cnVjdCBDIHJlc3VsdDsKKyAgc3RydWN0IEMgc291cmNlID0ge3NvdXJjZV9mbGRfYSwgc291cmNlX2ZsZF9ifTsKKworICBzdHJ1Y3RfdHlwZV9hLnNpemUgPSAwOworICBzdHJ1Y3RfdHlwZV9hLmFsaWdubWVudCA9IDA7CisgIHN0cnVjdF90eXBlX2EudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgc3RydWN0X3R5cGVfYS5lbGVtZW50cyA9IHN0cnVjdF9maWVsZHNfc291cmNlX2E7CisKKyAgc3RydWN0X3R5cGVfYi5zaXplID0gMDsKKyAgc3RydWN0X3R5cGVfYi5hbGlnbm1lbnQgPSAwOworICBzdHJ1Y3RfdHlwZV9iLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIHN0cnVjdF90eXBlX2IuZWxlbWVudHMgPSBzdHJ1Y3RfZmllbGRzX3NvdXJjZV9iOworCisgIHN0cnVjdF90eXBlX2Muc2l6ZSA9IDA7CisgIHN0cnVjdF90eXBlX2MuYWxpZ25tZW50ID0gMDsKKyAgc3RydWN0X3R5cGVfYy50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBzdHJ1Y3RfdHlwZV9jLmVsZW1lbnRzID0gc3RydWN0X2ZpZWxkc19zb3VyY2VfYzsKKworICBzdHJ1Y3RfZmllbGRzX3NvdXJjZV9hWzBdID0gJmZmaV90eXBlX2Zsb2F0OworICBzdHJ1Y3RfZmllbGRzX3NvdXJjZV9hWzFdID0gJmZmaV90eXBlX2Zsb2F0OworICBzdHJ1Y3RfZmllbGRzX3NvdXJjZV9hWzJdID0gTlVMTDsKKworICBzdHJ1Y3RfZmllbGRzX3NvdXJjZV9iWzBdID0gJmZmaV90eXBlX2Zsb2F0OworICBzdHJ1Y3RfZmllbGRzX3NvdXJjZV9iWzFdID0gJmZmaV90eXBlX2Zsb2F0OworICBzdHJ1Y3RfZmllbGRzX3NvdXJjZV9iWzJdID0gTlVMTDsKKworICBzdHJ1Y3RfZmllbGRzX3NvdXJjZV9jWzBdID0gJnN0cnVjdF90eXBlX2E7CisgIHN0cnVjdF9maWVsZHNfc291cmNlX2NbMV0gPSAmc3RydWN0X3R5cGVfYjsKKyAgc3RydWN0X2ZpZWxkc19zb3VyY2VfY1syXSA9IE5VTEw7CisKKyAgYXJnX3R5cGVzWzBdID0gJmZmaV90eXBlX3NpbnQzMjsKKyAgYXJnX3R5cGVzWzFdID0gJmZmaV90eXBlX3NpbnQzMjsKKyAgYXJnX3R5cGVzWzJdID0gJmZmaV90eXBlX3NpbnQzMjsKKyAgYXJnX3R5cGVzWzNdID0gJnN0cnVjdF90eXBlX2M7CisgIGFyZ190eXBlc1s0XSA9ICZmZmlfdHlwZV9zaW50MzI7CisgIGFyZ190eXBlc1s1XSA9ICZmZmlfdHlwZV9zaW50MzI7CisgIGFyZ190eXBlc1s2XSA9ICZmZmlfdHlwZV9zaW50MzI7CisgIGFyZ190eXBlc1s3XSA9IE5VTEw7CisKKyAgdm9pZCAqYXJnc1s3XTsKKyAgYXJnc1swXSA9ICZrOworICBhcmdzWzFdID0gJms7CisgIGFyZ3NbMl0gPSAmazsKKyAgYXJnc1szXSA9ICZzb3VyY2U7CisgIGFyZ3NbNF0gPSAmazsKKyAgYXJnc1s1XSA9ICZrOworICBhcmdzWzZdID0gJms7CisgIENIRUNLIChmZmlfcHJlcF9jaWYgKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgNywgJnN0cnVjdF90eXBlX2MsCisJCSAgICAgICBhcmdfdHlwZXMpID09IEZGSV9PSyk7CisKKyAgZmZpX2NhbGwgKCZjaWYsIEZGSV9GTiAoQ19mbiksICZyZXN1bHQsIGFyZ3MpOworICAvKiB7IGRnLW91dHB1dCAiMSwgMSwgMSwgMSwgMSwgMVxuIiB9ICovCisgIC8qIHsgZGctb3V0cHV0ICIxLjAsIDIuMCwgNC4wLCA4LjAsIDEuMCwgMi4wLCA0LjAsIDguMCIgfSAqLworICBDSEVDSyAocmVzdWx0LmEuYV94ID09IHNvdXJjZS5hLmFfeCk7CisgIENIRUNLIChyZXN1bHQuYS5hX3kgPT0gc291cmNlLmEuYV95KTsKKyAgQ0hFQ0sgKHJlc3VsdC5iLmJfeCA9PSBzb3VyY2UuYi5iX3gpOworICBDSEVDSyAocmVzdWx0LmIuYl95ID09IHNvdXJjZS5iLmJfeSk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDIuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QyLmMKaW5kZXggZGUxNTg0Yy4uNjkyNjhjZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDIuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0Mi5jCkBAIC01Nyw2ICs1NywxMSBAQAogICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGUsIGNsc19zdHJ1Y3RfdHlwZTE7CiAgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzNdOwogCisgIHN0cnVjdCBBIGVfZGJsID0geyAxLCA3fTsKKyAgc3RydWN0IEIgZl9kYmwgPSB7ezEyICwgMTI3fSwgOTl9OworCisgIHN0cnVjdCBCIHJlc19kYmw7CisKICAgY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOwogICBjbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKICAgY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CkBAIC02NywxMSArNzIsNiBAQAogICBjbHNfc3RydWN0X3R5cGUxLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CiAgIGNsc19zdHJ1Y3RfdHlwZTEuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczE7CiAKLSAgc3RydWN0IEEgZV9kYmwgPSB7IDEsIDd9OwotICBzdHJ1Y3QgQiBmX2RibCA9IHt7MTIgLCAxMjd9LCA5OX07Ci0KLSAgc3RydWN0IEIgcmVzX2RibDsKLQogICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91bG9uZzsKICAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfdWNoYXI7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzJdID0gTlVMTDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QzLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0My5jCmluZGV4IDU4YWE4NTMuLmFiMThjYWQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QzLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDMuYwpAQCAtNTgsNiArNTgsMTEgQEAKICAgZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlLCBjbHNfc3RydWN0X3R5cGUxOwogICBmZmlfdHlwZSogZGJsX2FyZ190eXBlc1szXTsKIAorICBzdHJ1Y3QgQSBlX2RibCA9IHsgMUxMLCA3fTsKKyAgc3RydWN0IEIgZl9kYmwgPSB7ezEyTEwgLCAxMjd9LCA5OX07CisKKyAgc3RydWN0IEIgcmVzX2RibDsKKwogICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOwogICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKQEAgLTY4LDExICs3Myw2IEBACiAgIGNsc19zdHJ1Y3RfdHlwZTEudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKICAgY2xzX3N0cnVjdF90eXBlMS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzMTsKIAotICBzdHJ1Y3QgQSBlX2RibCA9IHsgMUxMLCA3fTsKLSAgc3RydWN0IEIgZl9kYmwgPSB7ezEyTEwgLCAxMjd9LCA5OX07Ci0KLSAgc3RydWN0IEIgcmVzX2RibDsKLQogICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91aW50NjQ7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX3VjaGFyOwogICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9IE5VTEw7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0NC5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDQuYwppbmRleCA5OGU0OTFlLi4yZmZiNGQ2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0NC5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q0LmMKQEAgLTU4LDYgKzU4LDExIEBACiAgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZSwgY2xzX3N0cnVjdF90eXBlMTsKICAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbM107CiAKKyAgc3RydWN0IEEgZV9kYmwgPSB7IDEuMCwgN307CisgIHN0cnVjdCBCIGZfZGJsID0ge3sxMi4wICwgMTI3fSwgOTl9OworCisgIHN0cnVjdCBCIHJlc19kYmw7CisKICAgY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOwogICBjbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKICAgY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CkBAIC02OCwxMSArNzMsNiBAQAogICBjbHNfc3RydWN0X3R5cGUxLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CiAgIGNsc19zdHJ1Y3RfdHlwZTEuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczE7CiAKLSAgc3RydWN0IEEgZV9kYmwgPSB7IDEuMCwgN307Ci0gIHN0cnVjdCBCIGZfZGJsID0ge3sxMi4wICwgMTI3fSwgOTl9OwotCi0gIHN0cnVjdCBCIHJlc19kYmw7Ci0KICAgY2xzX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfZG91YmxlOwogICBjbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV91Y2hhcjsKICAgY2xzX3N0cnVjdF9maWVsZHNbMl0gPSBOVUxMOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDUuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q1LmMKaW5kZXggZDhlMzUzNy4uNmM3OTg0NSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDUuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0NS5jCkBAIC01OCw2ICs1OCwxMSBAQAogICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGUsIGNsc19zdHJ1Y3RfdHlwZTE7CiAgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzNdOwogCisgIHN0cnVjdCBBIGVfZGJsID0geyAxLjAsIDd9OworICBzdHJ1Y3QgQiBmX2RibCA9IHt7MTIuMCAsIDEyN30sIDk5fTsKKworICBzdHJ1Y3QgQiByZXNfZGJsOworCiAgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKICAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwpAQCAtNjgsMTEgKzczLDYgQEAKICAgY2xzX3N0cnVjdF90eXBlMS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwogICBjbHNfc3RydWN0X3R5cGUxLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHMxOwogCi0gIHN0cnVjdCBBIGVfZGJsID0geyAxLjAsIDd9OwotICBzdHJ1Y3QgQiBmX2RibCA9IHt7MTIuMCAsIDEyN30sIDk5fTsKLQotICBzdHJ1Y3QgQiByZXNfZGJsOwotCiAgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX2xvbmdkb3VibGU7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX3VjaGFyOwogICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9IE5VTEw7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0Ni5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDYuYwppbmRleCAyZjJiMjVhLi41OWQzNTc5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0Ni5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q2LmMKQEAgLTY2LDYgKzY2LDEyIEBACiAgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZSwgY2xzX3N0cnVjdF90eXBlMSwgY2xzX3N0cnVjdF90eXBlMjsKICAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbNF07CiAKKyAgc3RydWN0IEEgZV9kYmwgPSB7IDEuMCwgN307CisgIHN0cnVjdCBCIGZfZGJsID0ge3sxMi4wICwgMTI3fSwgOTl9OworICBzdHJ1Y3QgQyBnX2RibCA9IHsgMiwgOX07CisKKyAgc3RydWN0IEIgcmVzX2RibDsKKwogICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOwogICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKQEAgLTgxLDEyICs4Nyw2IEBACiAgIGNsc19zdHJ1Y3RfdHlwZTIudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKICAgY2xzX3N0cnVjdF90eXBlMi5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzMjsKIAotICBzdHJ1Y3QgQSBlX2RibCA9IHsgMS4wLCA3fTsKLSAgc3RydWN0IEIgZl9kYmwgPSB7ezEyLjAgLCAxMjd9LCA5OX07Ci0gIHN0cnVjdCBDIGdfZGJsID0geyAyLCA5fTsKLQotICBzdHJ1Y3QgQiByZXNfZGJsOwotCiAgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX2RvdWJsZTsKICAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfdWNoYXI7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzJdID0gTlVMTDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q3LmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0Ny5jCmluZGV4IDE0YzcwMjMuLjI3NTk1ZTYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q3LmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDcuYwpAQCAtNTgsNiArNTgsMTEgQEAKICAgZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlLCBjbHNfc3RydWN0X3R5cGUxOwogICBmZmlfdHlwZSogZGJsX2FyZ190eXBlc1szXTsKIAorICBzdHJ1Y3QgQSBlX2RibCA9IHsgMUxMLCA3fTsKKyAgc3RydWN0IEIgZl9kYmwgPSB7ezEyLjAgLCAxMjd9LCA5OX07CisKKyAgc3RydWN0IEIgcmVzX2RibDsKKwogICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOwogICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKQEAgLTY4LDExICs3Myw2IEBACiAgIGNsc19zdHJ1Y3RfdHlwZTEudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKICAgY2xzX3N0cnVjdF90eXBlMS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzMTsKIAotICBzdHJ1Y3QgQSBlX2RibCA9IHsgMUxMLCA3fTsKLSAgc3RydWN0IEIgZl9kYmwgPSB7ezEyLjAgLCAxMjd9LCA5OX07Ci0KLSAgc3RydWN0IEIgcmVzX2RibDsKLQogICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91aW50NjQ7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX3VjaGFyOwogICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9IE5VTEw7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0OC5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDguYwppbmRleCBiYjc3ZWFkLi4wZTZjNjgyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0OC5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q4LmMKQEAgLTY2LDYgKzY2LDEyIEBACiAgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZSwgY2xzX3N0cnVjdF90eXBlMSwgY2xzX3N0cnVjdF90eXBlMjsKICAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbNF07CiAKKyAgc3RydWN0IEEgZV9kYmwgPSB7IDFMTCwgN307CisgIHN0cnVjdCBCIGZfZGJsID0ge3sxMkxMICwgMTI3fSwgOTl9OworICBzdHJ1Y3QgQyBnX2RibCA9IHsgMkxMLCA5fTsKKworICBzdHJ1Y3QgQiByZXNfZGJsOworCiAgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKICAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwpAQCAtODEsMTIgKzg3LDYgQEAKICAgY2xzX3N0cnVjdF90eXBlMi50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwogICBjbHNfc3RydWN0X3R5cGUyLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHMyOwogCi0gIHN0cnVjdCBBIGVfZGJsID0geyAxTEwsIDd9OwotICBzdHJ1Y3QgQiBmX2RibCA9IHt7MTJMTCAsIDEyN30sIDk5fTsKLSAgc3RydWN0IEMgZ19kYmwgPSB7IDJMTCwgOX07Ci0KLSAgc3RydWN0IEIgcmVzX2RibDsKLQogICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91aW50NjQ7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX3VjaGFyOwogICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9IE5VTEw7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0OS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDkuYwppbmRleCBlOWY1NDFjLi41ZjdhYzY3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0OS5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q5LmMKQEAgLTY2LDYgKzY2LDEyIEBACiAgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZSwgY2xzX3N0cnVjdF90eXBlMSwgY2xzX3N0cnVjdF90eXBlMjsKICAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbNF07CiAKKyAgc3RydWN0IEEgZV9kYmwgPSB7IDEsIDdMTH07CisgIHN0cnVjdCBCIGZfZGJsID0ge3sxMi4wICwgMTI3fSwgOTl9OworICBzdHJ1Y3QgQyBnX2RibCA9IHsgMiwgOX07CisKKyAgc3RydWN0IEIgcmVzX2RibDsKKwogICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CiAgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOwogICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKQEAgLTgxLDEyICs4Nyw2IEBACiAgIGNsc19zdHJ1Y3RfdHlwZTIudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKICAgY2xzX3N0cnVjdF90eXBlMi5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzMjsKIAotICBzdHJ1Y3QgQSBlX2RibCA9IHsgMSwgN0xMfTsKLSAgc3RydWN0IEIgZl9kYmwgPSB7ezEyLjAgLCAxMjd9LCA5OX07Ci0gIHN0cnVjdCBDIGdfZGJsID0geyAyLCA5fTsKLQotICBzdHJ1Y3QgQiByZXNfZGJsOwotCiAgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX3VjaGFyOwogICBjbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV91aW50NjQ7CiAgIGNsc19zdHJ1Y3RfZmllbGRzWzJdID0gTlVMTDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9kYmwuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9kYmwuYwppbmRleCAxYWFiNDAzLi5mZDA3ZTUwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fZGJsLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvcmV0dXJuX2RibC5jCkBAIC05LDYgKzksNyBAQAogCiBzdGF0aWMgZG91YmxlIHJldHVybl9kYmwoZG91YmxlIGRibCkKIHsKKyAgcHJpbnRmICgiJWZcbiIsIGRibCk7CiAgIHJldHVybiAyICogZGJsOwogfQogaW50IG1haW4gKHZvaWQpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fc2MuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9zYy5jCmluZGV4IDE5NjA4ZWUuLmEzNmNmM2UgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9zYy5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9zYy5jCkBAIC0zMCw3ICszMCw3IEBACiAgICAgICAgc2MgPCAoc2lnbmVkIGNoYXIpIDEyNzsgc2MrKykKICAgICB7CiAgICAgICBmZmlfY2FsbCgmY2lmLCBGRklfRk4ocmV0dXJuX3NjKSwgJnJpbnQsIHZhbHVlcyk7Ci0gICAgICBDSEVDSyhyaW50ID09IChmZmlfYXJnKSBzYyk7CisgICAgICBDSEVDSygoc2lnbmVkIGNoYXIpcmludCA9PSBzYyk7CiAgICAgfQogICBleGl0KDApOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvcmV0dXJuX3VjLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fdWMuYwppbmRleCAwN2M0NWRlLi42ZmU1NTQ2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fdWMuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fdWMuYwpAQCAtMzIsNyArMzIsNyBAQAogICAgICAgIHVjIDwgKHVuc2lnbmVkIGNoYXIpICdceGZmJzsgdWMrKykKICAgICB7CiAgICAgICBmZmlfY2FsbCgmY2lmLCBGRklfRk4ocmV0dXJuX3VjKSwgJnJpbnQsIHZhbHVlcyk7Ci0gICAgICBDSEVDSyhyaW50ID09IChzaWduZWQgaW50KSB1Yyk7CisgICAgICBDSEVDSygodW5zaWduZWQgY2hhcilyaW50ID09IHVjKTsKICAgICB9CiAgIGV4aXQoMCk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJldF9sYXJnZS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RyZXRfbGFyZ2UuYwppbmRleCAyM2E5M2I5Li43MWMyNDY5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJldF9sYXJnZS5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cmV0X2xhcmdlLmMKQEAgLTksOCArOSw4IEBACiAvKiB7IGRnLWRvIHJ1biB7IHhmYWlsIHN0cm9uZ2FybSotKi0qIHhzY2FsZSotKi0qICB9IH0gKi8KICNpbmNsdWRlICJmZml0ZXN0LmgiCiAKLS8vIDEzIEZQUnM6IDEwNCBieXRlcwotLy8gMTQgRlBSczogMTEyIGJ5dGVzCisvKiAxMyBGUFJzOiAxMDQgYnl0ZXMgKi8KKy8qIDE0IEZQUnM6IDExMiBieXRlcyAqLwogCiB0eXBlZGVmIHN0cnVjdCBzdHJ1Y3RfMTA4Ynl0ZSB7CiAJZG91YmxlIGE7CkBAIC04MiwxNyArODIsMTcgQEAKIAlmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CiAJZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbNV07CiAKLQljbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7Ci0JY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7Ci0JY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7Ci0JY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7Ci0KIAlzdHJ1Y3RfMTA4Ynl0ZSBlX2RibCA9IHsgOS4wLCAyLjAsIDYuMCwgNS4wLCAzLjAsIDQuMCwgOC4wLCAxLjAsIDEuMCwgMi4wLCAzLjAsIDcuMCwgMi4wLCA3IH07CiAJc3RydWN0XzEwOGJ5dGUgZl9kYmwgPSB7IDEuMCwgMi4wLCAzLjAsIDcuMCwgMi4wLCA1LjAsIDYuMCwgNy4wLCA0LjAsIDUuMCwgNy4wLCA5LjAsIDEuMCwgNCB9OwogCXN0cnVjdF8xMDhieXRlIGdfZGJsID0geyA0LjAsIDUuMCwgNy4wLCA5LjAsIDEuMCwgMS4wLCAyLjAsIDkuMCwgOC4wLCA2LjAsIDEuMCwgNC4wLCAwLjAsIDMgfTsKIAlzdHJ1Y3RfMTA4Ynl0ZSBoX2RibCA9IHsgOC4wLCA2LjAsIDEuMCwgNC4wLCAwLjAsIDMuMCwgMy4wLCAxLjAsIDkuMCwgMi4wLCA2LjAsIDUuMCwgMy4wLCAyIH07CiAJc3RydWN0XzEwOGJ5dGUgcmVzX2RibDsKIAorCWNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKKwljbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKKwljbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKwljbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKKwogCWNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX2RvdWJsZTsKIAljbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV9kb3VibGU7CiAJY2xzX3N0cnVjdF9maWVsZHNbMl0gPSAmZmZpX3R5cGVfZG91YmxlOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RyZXRfbGFyZ2UyLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJldF9sYXJnZTIuYwppbmRleCBlMjU5OWQyLi5kOWM3NTBlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJldF9sYXJnZTIuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJldF9sYXJnZTIuYwpAQCAtOSw4ICs5LDggQEAKIC8qIHsgZGctZG8gcnVuIHsgeGZhaWwgc3Ryb25nYXJtKi0qLSogeHNjYWxlKi0qLSogIH0gfSAqLwogI2luY2x1ZGUgImZmaXRlc3QuaCIKIAotLy8gMTMgRlBSczogMTA0IGJ5dGVzCi0vLyAxNCBGUFJzOiAxMTIgYnl0ZXMKKy8qIDEzIEZQUnM6IDEwNCBieXRlcyAqLworLyogMTQgRlBSczogMTEyIGJ5dGVzICovCiAKIHR5cGVkZWYgc3RydWN0IHN0cnVjdF8xMTZieXRlIHsKIAlkb3VibGUgYTsKQEAgLTg0LDE3ICs4NCwxNyBAQAogCWZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZTsKIAlmZmlfdHlwZSogZGJsX2FyZ190eXBlc1s1XTsKIAotCWNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKLQljbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKLQljbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKLQljbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKLQogCXN0cnVjdF8xMTZieXRlIGVfZGJsID0geyA5LjAsIDIuMCwgNi4wLCA1LjAsIDMuMCwgNC4wLCA4LjAsIDEuMCwgMS4wLCAyLjAsIDMuMCwgNy4wLCAyLjAsIDUuMCwgNyB9OwogCXN0cnVjdF8xMTZieXRlIGZfZGJsID0geyAxLjAsIDIuMCwgMy4wLCA3LjAsIDIuMCwgNS4wLCA2LjAsIDcuMCwgNC4wLCA1LjAsIDcuMCwgOS4wLCAxLjAsIDYuMCwgNCB9OwogCXN0cnVjdF8xMTZieXRlIGdfZGJsID0geyA0LjAsIDUuMCwgNy4wLCA5LjAsIDEuMCwgMS4wLCAyLjAsIDkuMCwgOC4wLCA2LjAsIDEuMCwgNC4wLCAwLjAsIDcuMCwgMyB9OwogCXN0cnVjdF8xMTZieXRlIGhfZGJsID0geyA4LjAsIDYuMCwgMS4wLCA0LjAsIDAuMCwgMy4wLCAzLjAsIDEuMCwgOS4wLCAyLjAsIDYuMCwgNS4wLCAzLjAsIDguMCwgMiB9OwogCXN0cnVjdF8xMTZieXRlIHJlc19kYmw7CiAKKwljbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CisJY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CisJY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisJY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CisKIAljbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV9kb3VibGU7CiAJY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfZG91YmxlOwogCWNsc19zdHJ1Y3RfZmllbGRzWzJdID0gJmZmaV90eXBlX2RvdWJsZTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cmV0X21lZGl1bS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RyZXRfbWVkaXVtLmMKaW5kZXggMWZjNmE5ZS4uOTczZWUwMiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RyZXRfbWVkaXVtLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RyZXRfbWVkaXVtLmMKQEAgLTY4LDE3ICs2OCwxNyBAQAogCWZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZTsKIAlmZmlfdHlwZSogZGJsX2FyZ190eXBlc1s1XTsKIAotCWNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKLQljbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKLQljbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKLQljbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKLQogCXN0cnVjdF83MmJ5dGUgZV9kYmwgPSB7IDkuMCwgMi4wLCA2LjAsIDUuMCwgMy4wLCA0LjAsIDguMCwgMS4wLCA3LjAgfTsKIAlzdHJ1Y3RfNzJieXRlIGZfZGJsID0geyAxLjAsIDIuMCwgMy4wLCA3LjAsIDIuMCwgNS4wLCA2LjAsIDcuMCwgNC4wIH07CiAJc3RydWN0XzcyYnl0ZSBnX2RibCA9IHsgNC4wLCA1LjAsIDcuMCwgOS4wLCAxLjAsIDEuMCwgMi4wLCA5LjAsIDMuMCB9OwogCXN0cnVjdF83MmJ5dGUgaF9kYmwgPSB7IDguMCwgNi4wLCAxLjAsIDQuMCwgMC4wLCAzLjAsIDMuMCwgMS4wLCAyLjAgfTsKIAlzdHJ1Y3RfNzJieXRlIHJlc19kYmw7CiAKKwljbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CisJY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CisJY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisJY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CisKIAljbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV9kb3VibGU7CiAJY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfZG91YmxlOwogCWNsc19zdHJ1Y3RfZmllbGRzWzJdID0gJmZmaV90eXBlX2RvdWJsZTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cmV0X21lZGl1bTIuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cmV0X21lZGl1bTIuYwppbmRleCBjYjJmMmZiLi44NDMyM2QxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJldF9tZWRpdW0yLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RyZXRfbWVkaXVtMi5jCkBAIC02OSwxNyArNjksMTcgQEAKIAlmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CiAJZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbNV07CiAKLQljbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7Ci0JY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7Ci0JY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7Ci0JY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7Ci0KIAlzdHJ1Y3RfNzJieXRlIGVfZGJsID0geyA5LjAsIDIuMCwgNi4wLCA1LjAsIDMuMCwgNC4wLCA4LjAsIDEuMCwgNyB9OwogCXN0cnVjdF83MmJ5dGUgZl9kYmwgPSB7IDEuMCwgMi4wLCAzLjAsIDcuMCwgMi4wLCA1LjAsIDYuMCwgNy4wLCA0IH07CiAJc3RydWN0XzcyYnl0ZSBnX2RibCA9IHsgNC4wLCA1LjAsIDcuMCwgOS4wLCAxLjAsIDEuMCwgMi4wLCA5LjAsIDMgfTsKIAlzdHJ1Y3RfNzJieXRlIGhfZGJsID0geyA4LjAsIDYuMCwgMS4wLCA0LjAsIDAuMCwgMy4wLCAzLjAsIDEuMCwgMiB9OwogCXN0cnVjdF83MmJ5dGUgcmVzX2RibDsKIAorCWNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKKwljbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKKwljbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKwljbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKKwogCWNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX2RvdWJsZTsKIAljbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV9kb3VibGU7CiAJY2xzX3N0cnVjdF9maWVsZHNbMl0gPSAmZmZpX3R5cGVfZG91YmxlOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RybGVuMl93aW4zMi5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RybGVuMl93aW4zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkODEwNjEKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJsZW4yX3dpbjMyLmMKQEAgLTAsMCArMSw0NCBAQAorLyogQXJlYToJZmZpX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIGZhc3RjYWxsIHN0cmxlbiBjYWxsIG9uIFg4Nl9XSU4zMiBzeXN0ZW1zLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOglGcm9tIHRoZSBvcmlnaW5hbCBmZml0ZXN0LmMgICovCisKKy8qIHsgZGctZG8gcnVuIHsgdGFyZ2V0IGk/ODYtKi1jeWd3aW4qIGk/ODYtKi1taW5ndyogfSB9ICovCisKKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3N0YXRpYyBzaXplX3QgX19GQVNUQ0FMTF9fIG15X2Zhc3RjYWxsX3N0cmxlbihjaGFyICpzKQoreworICByZXR1cm4gKHN0cmxlbihzKSk7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgZmZpX3R5cGUgKmFyZ3NbTUFYX0FSR1NdOworICB2b2lkICp2YWx1ZXNbTUFYX0FSR1NdOworICBmZmlfYXJnIHJpbnQ7CisgIGNoYXIgKnM7CisgIGFyZ3NbMF0gPSAmZmZpX3R5cGVfcG9pbnRlcjsKKyAgdmFsdWVzWzBdID0gKHZvaWQqKSAmczsKKyAgCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0ZBU1RDQUxMLCAxLAorCQkgICAgICAgJmZmaV90eXBlX3NpbnQsIGFyZ3MpID09IEZGSV9PSyk7CisgIAorICBzID0gImEiOworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4obXlfZmFzdGNhbGxfc3RybGVuKSwgJnJpbnQsIHZhbHVlcyk7CisgIENIRUNLKHJpbnQgPT0gMSk7CisgIAorICBzID0gIjEyMzQ1NjciOworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4obXlfZmFzdGNhbGxfc3RybGVuKSwgJnJpbnQsIHZhbHVlcyk7CisgIENIRUNLKHJpbnQgPT0gNyk7CisgIAorICBzID0gIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDUiOworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4obXlfZmFzdGNhbGxfc3RybGVuKSwgJnJpbnQsIHZhbHVlcyk7CisgIENIRUNLKHJpbnQgPT0gMjUpOworICAKKyAgcHJpbnRmKCJmYXN0Y2FsbCBzdHJsZW4gdGVzdHMgcGFzc2VkXG4iKTsKKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cnVjdDEuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cnVjdDEuYwppbmRleCBlYTc2Yzg1Li5iZmMyM2Y2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3QxLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0MS5jCkBAIC0zMCw2ICszMCwxMyBAQAogICB2b2lkICp2YWx1ZXNbTUFYX0FSR1NdOwogICBmZmlfdHlwZSB0czFfdHlwZTsKICAgZmZpX3R5cGUgKnRzMV90eXBlX2VsZW1lbnRzWzRdOworCisgIHRlc3Rfc3RydWN0dXJlXzEgdHMxX2FyZzsKKworICAvKiBUaGlzIGlzIGEgaGFjayB0byBnZXQgYSBwcm9wZXJseSBhbGlnbmVkIHJlc3VsdCBidWZmZXIgKi8KKyAgdGVzdF9zdHJ1Y3R1cmVfMSAqdHMxX3Jlc3VsdCA9CisgICAgKHRlc3Rfc3RydWN0dXJlXzEgKikgbWFsbG9jIChzaXplb2YodGVzdF9zdHJ1Y3R1cmVfMSkpOworCiAgIHRzMV90eXBlLnNpemUgPSAwOwogICB0czFfdHlwZS5hbGlnbm1lbnQgPSAwOwogICB0czFfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwpAQCAtMzksMTEgKzQ2LDYgQEAKICAgdHMxX3R5cGVfZWxlbWVudHNbMl0gPSAmZmZpX3R5cGVfdWludDsKICAgdHMxX3R5cGVfZWxlbWVudHNbM10gPSBOVUxMOwogICAKLSAgdGVzdF9zdHJ1Y3R1cmVfMSB0czFfYXJnOwotICAvKiBUaGlzIGlzIGEgaGFjayB0byBnZXQgYSBwcm9wZXJseSBhbGlnbmVkIHJlc3VsdCBidWZmZXIgKi8KLSAgdGVzdF9zdHJ1Y3R1cmVfMSAqdHMxX3Jlc3VsdCA9IAotICAgICh0ZXN0X3N0cnVjdHVyZV8xICopIG1hbGxvYyAoc2l6ZW9mKHRlc3Rfc3RydWN0dXJlXzEpKTsKLSAgCiAgIGFyZ3NbMF0gPSAmdHMxX3R5cGU7CiAgIHZhbHVlc1swXSA9ICZ0czFfYXJnOwogICAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cnVjdDFfd2luMzIuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cnVjdDFfd2luMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzU2ZjVhCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0MV93aW4zMi5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qIEFyZWE6CWZmaV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBzdHJ1Y3R1cmVzIHdpdGggZmFzdGNhbGwvdGhpc2NhbGwgY29udmVudGlvbi4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJRnJvbSB0aGUgb3JpZ2luYWwgZmZpdGVzdC5jICAqLworCisvKiB7IGRnLWRvIHJ1biB7IHRhcmdldCBpPzg2LSotY3lnd2luKiBpPzg2LSotbWluZ3cqIH0gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdW5zaWduZWQgY2hhciB1YzsKKyAgZG91YmxlIGQ7CisgIHVuc2lnbmVkIGludCB1aTsKK30gdGVzdF9zdHJ1Y3R1cmVfMTsKKworc3RhdGljIHRlc3Rfc3RydWN0dXJlXzEgX19GQVNUQ0FMTF9fIHN0cnVjdDEodGVzdF9zdHJ1Y3R1cmVfMSB0cykKK3sKKyAgdHMudWMrKzsKKyAgdHMuZC0tOworICB0cy51aSsrOworCisgIHJldHVybiB0czsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICBmZmlfdHlwZSAqYXJnc1tNQVhfQVJHU107CisgIHZvaWQgKnZhbHVlc1tNQVhfQVJHU107CisgIGZmaV90eXBlIHRzMV90eXBlOworICBmZmlfdHlwZSAqdHMxX3R5cGVfZWxlbWVudHNbNF07CisKKyAgdGVzdF9zdHJ1Y3R1cmVfMSB0czFfYXJnOworCisgIC8qIFRoaXMgaXMgYSBoYWNrIHRvIGdldCBhIHByb3Blcmx5IGFsaWduZWQgcmVzdWx0IGJ1ZmZlciAqLworICB0ZXN0X3N0cnVjdHVyZV8xICp0czFfcmVzdWx0ID0KKyAgICAodGVzdF9zdHJ1Y3R1cmVfMSAqKSBtYWxsb2MgKHNpemVvZih0ZXN0X3N0cnVjdHVyZV8xKSk7CisKKyAgdHMxX3R5cGUuc2l6ZSA9IDA7CisgIHRzMV90eXBlLmFsaWdubWVudCA9IDA7CisgIHRzMV90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIHRzMV90eXBlLmVsZW1lbnRzID0gdHMxX3R5cGVfZWxlbWVudHM7CisgIHRzMV90eXBlX2VsZW1lbnRzWzBdID0gJmZmaV90eXBlX3VjaGFyOworICB0czFfdHlwZV9lbGVtZW50c1sxXSA9ICZmZmlfdHlwZV9kb3VibGU7CisgIHRzMV90eXBlX2VsZW1lbnRzWzJdID0gJmZmaV90eXBlX3VpbnQ7CisgIHRzMV90eXBlX2VsZW1lbnRzWzNdID0gTlVMTDsKKyAgCisgIGFyZ3NbMF0gPSAmdHMxX3R5cGU7CisgIHZhbHVlc1swXSA9ICZ0czFfYXJnOworICAKKyAgLyogSW5pdGlhbGl6ZSB0aGUgY2lmICovCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfRkFTVENBTEwsIDEsIAorCQkgICAgICZ0czFfdHlwZSwgYXJncykgPT0gRkZJX09LKTsKKyAgCisgIHRzMV9hcmcudWMgPSAnXHgwMSc7CisgIHRzMV9hcmcuZCA9IDMuMTQxNTk7CisgIHRzMV9hcmcudWkgPSA1NTU7CisKKyAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKHN0cnVjdDEpLCB0czFfcmVzdWx0LCB2YWx1ZXMpOworICAKKyAgQ0hFQ0sodHMxX3Jlc3VsdC0+dWkgPT0gNTU2KTsKKyAgQ0hFQ0sodHMxX3Jlc3VsdC0+ZCA9PSAzLjE0MTU5IC0gMSk7CisgCisgIGZyZWUgKHRzMV9yZXN1bHQpOworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0Mi5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0Mi5jCmluZGV4IDE0YmM5ZmQuLmQ4NTM4NWUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cnVjdDIuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3QyLmMKQEAgLTI5LDYgKzI5LDExIEBACiAgIHRlc3Rfc3RydWN0dXJlXzIgdHMyX2FyZzsKICAgZmZpX3R5cGUgdHMyX3R5cGU7CiAgIGZmaV90eXBlICp0czJfdHlwZV9lbGVtZW50c1szXTsKKworICAvKiBUaGlzIGlzIGEgaGFjayB0byBnZXQgYSBwcm9wZXJseSBhbGlnbmVkIHJlc3VsdCBidWZmZXIgKi8KKyAgdGVzdF9zdHJ1Y3R1cmVfMiAqdHMyX3Jlc3VsdCA9CisgICAgKHRlc3Rfc3RydWN0dXJlXzIgKikgbWFsbG9jIChzaXplb2YodGVzdF9zdHJ1Y3R1cmVfMikpOworCiAgIHRzMl90eXBlLnNpemUgPSAwOwogICB0czJfdHlwZS5hbGlnbm1lbnQgPSAwOwogICB0czJfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwpAQCAtMzcsMTEgKzQyLDYgQEAKICAgdHMyX3R5cGVfZWxlbWVudHNbMV0gPSAmZmZpX3R5cGVfZG91YmxlOwogICB0czJfdHlwZV9lbGVtZW50c1syXSA9IE5VTEw7CiAKLSAgCi0gIC8qIFRoaXMgaXMgYSBoYWNrIHRvIGdldCBhIHByb3Blcmx5IGFsaWduZWQgcmVzdWx0IGJ1ZmZlciAqLwotICB0ZXN0X3N0cnVjdHVyZV8yICp0czJfcmVzdWx0ID0gCi0gICAgKHRlc3Rfc3RydWN0dXJlXzIgKikgbWFsbG9jIChzaXplb2YodGVzdF9zdHJ1Y3R1cmVfMikpOwotICAKICAgYXJnc1swXSA9ICZ0czJfdHlwZTsKICAgdmFsdWVzWzBdID0gJnRzMl9hcmc7CiAgIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0Ml93aW4zMi5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0Ml93aW4zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMDIyODUKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3QyX3dpbjMyLmMKQEAgLTAsMCArMSw2NyBAQAorLyogQXJlYToJZmZpX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIHN0cnVjdHVyZXMgaW4gZmFzdGNhbGwvc3RkY2FsbCBmdW5jdGlvbgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOglGcm9tIHRoZSBvcmlnaW5hbCBmZml0ZXN0LmMgICovCisKKy8qIHsgZGctZG8gcnVuIHsgdGFyZ2V0IGk/ODYtKi1jeWd3aW4qIGk/ODYtKi1taW5ndyogfSB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCit0eXBlZGVmIHN0cnVjdAoreworICBkb3VibGUgZDE7CisgIGRvdWJsZSBkMjsKK30gdGVzdF9zdHJ1Y3R1cmVfMjsKKworc3RhdGljIHRlc3Rfc3RydWN0dXJlXzIgX19GQVNUQ0FMTF9fIHN0cnVjdDIodGVzdF9zdHJ1Y3R1cmVfMiB0cykKK3sKKyAgdHMuZDEtLTsKKyAgdHMuZDItLTsKKworICByZXR1cm4gdHM7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgZmZpX3R5cGUgKmFyZ3NbTUFYX0FSR1NdOworICB2b2lkICp2YWx1ZXNbTUFYX0FSR1NdOworICB0ZXN0X3N0cnVjdHVyZV8yIHRzMl9hcmc7CisgIGZmaV90eXBlIHRzMl90eXBlOworICBmZmlfdHlwZSAqdHMyX3R5cGVfZWxlbWVudHNbM107CisKKyAgLyogVGhpcyBpcyBhIGhhY2sgdG8gZ2V0IGEgcHJvcGVybHkgYWxpZ25lZCByZXN1bHQgYnVmZmVyICovCisgIHRlc3Rfc3RydWN0dXJlXzIgKnRzMl9yZXN1bHQgPQorICAgICh0ZXN0X3N0cnVjdHVyZV8yICopIG1hbGxvYyAoc2l6ZW9mKHRlc3Rfc3RydWN0dXJlXzIpKTsKKworICB0czJfdHlwZS5zaXplID0gMDsKKyAgdHMyX3R5cGUuYWxpZ25tZW50ID0gMDsKKyAgdHMyX3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgdHMyX3R5cGUuZWxlbWVudHMgPSB0czJfdHlwZV9lbGVtZW50czsKKyAgdHMyX3R5cGVfZWxlbWVudHNbMF0gPSAmZmZpX3R5cGVfZG91YmxlOworICB0czJfdHlwZV9lbGVtZW50c1sxXSA9ICZmZmlfdHlwZV9kb3VibGU7CisgIHRzMl90eXBlX2VsZW1lbnRzWzJdID0gTlVMTDsKKworICBhcmdzWzBdID0gJnRzMl90eXBlOworICB2YWx1ZXNbMF0gPSAmdHMyX2FyZzsKKyAgCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0ZBU1RDQUxMLCAxLCAmdHMyX3R5cGUsIGFyZ3MpID09IEZGSV9PSyk7CisgIAorICB0czJfYXJnLmQxID0gNS41NTsKKyAgdHMyX2FyZy5kMiA9IDYuNjY7CisgIAorICBwcmludGYgKCIlZ1xuIiwgdHMyX2FyZy5kMSk7CisgIHByaW50ZiAoIiVnXG4iLCB0czJfYXJnLmQyKTsKKyAgCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihzdHJ1Y3QyKSwgdHMyX3Jlc3VsdCwgdmFsdWVzKTsKKyAgCisgIHByaW50ZiAoIiVnXG4iLCB0czJfcmVzdWx0LT5kMSk7CisgIHByaW50ZiAoIiVnXG4iLCB0czJfcmVzdWx0LT5kMik7CisgIAorICBDSEVDSyh0czJfcmVzdWx0LT5kMSA9PSA1LjU1IC0gMSk7CisgIENIRUNLKHRzMl9yZXN1bHQtPmQyID09IDYuNjYgLSAxKTsKKyAgCisgIGZyZWUgKHRzMl9yZXN1bHQpOworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0My5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0My5jCmluZGV4IGUwYmIwOWIuLmRlODgzYzIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cnVjdDMuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3QzLmMKQEAgLTI3LDYgKzI3LDExIEBACiAgIGludCBjb21wYXJlX3ZhbHVlOwogICBmZmlfdHlwZSB0czNfdHlwZTsKICAgZmZpX3R5cGUgKnRzM190eXBlX2VsZW1lbnRzWzJdOworCisgIHRlc3Rfc3RydWN0dXJlXzMgdHMzX2FyZzsKKyAgdGVzdF9zdHJ1Y3R1cmVfMyAqdHMzX3Jlc3VsdCA9CisgICAgKHRlc3Rfc3RydWN0dXJlXzMgKikgbWFsbG9jIChzaXplb2YodGVzdF9zdHJ1Y3R1cmVfMykpOworCiAgIHRzM190eXBlLnNpemUgPSAwOwogICB0czNfdHlwZS5hbGlnbm1lbnQgPSAwOwogICB0czNfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwpAQCAtMzQsMTAgKzM5LDYgQEAKICAgdHMzX3R5cGVfZWxlbWVudHNbMF0gPSAmZmZpX3R5cGVfc2ludDsKICAgdHMzX3R5cGVfZWxlbWVudHNbMV0gPSBOVUxMOwogCi0gIHRlc3Rfc3RydWN0dXJlXzMgdHMzX2FyZzsKLSAgdGVzdF9zdHJ1Y3R1cmVfMyAqdHMzX3Jlc3VsdCA9IAotICAgICh0ZXN0X3N0cnVjdHVyZV8zICopIG1hbGxvYyAoc2l6ZW9mKHRlc3Rfc3RydWN0dXJlXzMpKTsKLSAgCiAgIGFyZ3NbMF0gPSAmdHMzX3R5cGU7CiAgIHZhbHVlc1swXSA9ICZ0czNfYXJnOwogICAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cnVjdDQuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cnVjdDQuYwppbmRleCAwYWQwYTgzLi40OGUwMzQ5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3Q0LmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0NC5jCkBAIC0yOCwyMSArMjgsMjIgQEAKICAgdm9pZCAqdmFsdWVzW01BWF9BUkdTXTsKICAgZmZpX3R5cGUgdHM0X3R5cGU7CiAgIGZmaV90eXBlICp0czRfdHlwZV9lbGVtZW50c1s0XTsgIAorCisgIHRlc3Rfc3RydWN0dXJlXzQgdHM0X2FyZzsKKworICAvKiBUaGlzIGlzIGEgaGFjayB0byBnZXQgYSBwcm9wZXJseSBhbGlnbmVkIHJlc3VsdCBidWZmZXIgKi8KKyAgdGVzdF9zdHJ1Y3R1cmVfNCAqdHM0X3Jlc3VsdCA9CisgICAgKHRlc3Rfc3RydWN0dXJlXzQgKikgbWFsbG9jIChzaXplb2YodGVzdF9zdHJ1Y3R1cmVfNCkpOworCiAgIHRzNF90eXBlLnNpemUgPSAwOwogICB0czRfdHlwZS5hbGlnbm1lbnQgPSAwOwogICB0czRfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwotICB0ZXN0X3N0cnVjdHVyZV80IHRzNF9hcmc7CiAgIHRzNF90eXBlLmVsZW1lbnRzID0gdHM0X3R5cGVfZWxlbWVudHM7CiAgIHRzNF90eXBlX2VsZW1lbnRzWzBdID0gJmZmaV90eXBlX3VpbnQ7CiAgIHRzNF90eXBlX2VsZW1lbnRzWzFdID0gJmZmaV90eXBlX3VpbnQ7CiAgIHRzNF90eXBlX2VsZW1lbnRzWzJdID0gJmZmaV90eXBlX3VpbnQ7CiAgIHRzNF90eXBlX2VsZW1lbnRzWzNdID0gTlVMTDsKIAotICAKLSAgLyogVGhpcyBpcyBhIGhhY2sgdG8gZ2V0IGEgcHJvcGVybHkgYWxpZ25lZCByZXN1bHQgYnVmZmVyICovCi0gIHRlc3Rfc3RydWN0dXJlXzQgKnRzNF9yZXN1bHQgPSAKLSAgICAodGVzdF9zdHJ1Y3R1cmVfNCAqKSBtYWxsb2MgKHNpemVvZih0ZXN0X3N0cnVjdHVyZV80KSk7Ci0gIAogICBhcmdzWzBdID0gJnRzNF90eXBlOwogICB2YWx1ZXNbMF0gPSAmdHM0X2FyZzsKICAgCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3Q1LmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3Q1LmMKaW5kZXggYzAzY2M5Ny4uMjhiMWYwYyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0NS5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cnVjdDUuYwpAQCAtMjcsNiArMjcsMTMgQEAKICAgdm9pZCAqdmFsdWVzW01BWF9BUkdTXTsKICAgZmZpX3R5cGUgdHM1X3R5cGU7CiAgIGZmaV90eXBlICp0czVfdHlwZV9lbGVtZW50c1szXTsKKworICB0ZXN0X3N0cnVjdHVyZV81IHRzNV9hcmcxLCB0czVfYXJnMjsKKworICAvKiBUaGlzIGlzIGEgaGFjayB0byBnZXQgYSBwcm9wZXJseSBhbGlnbmVkIHJlc3VsdCBidWZmZXIgKi8KKyAgdGVzdF9zdHJ1Y3R1cmVfNSAqdHM1X3Jlc3VsdCA9CisgICAgKHRlc3Rfc3RydWN0dXJlXzUgKikgbWFsbG9jIChzaXplb2YodGVzdF9zdHJ1Y3R1cmVfNSkpOworCiAgIHRzNV90eXBlLnNpemUgPSAwOwogICB0czVfdHlwZS5hbGlnbm1lbnQgPSAwOwogICB0czVfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwpAQCAtMzUsMTIgKzQyLDYgQEAKICAgdHM1X3R5cGVfZWxlbWVudHNbMV0gPSAmZmZpX3R5cGVfc2NoYXI7CiAgIHRzNV90eXBlX2VsZW1lbnRzWzJdID0gTlVMTDsKIAotICB0ZXN0X3N0cnVjdHVyZV81IHRzNV9hcmcxLCB0czVfYXJnMjsKLSAgCi0gIC8qIFRoaXMgaXMgYSBoYWNrIHRvIGdldCBhIHByb3Blcmx5IGFsaWduZWQgcmVzdWx0IGJ1ZmZlciAqLwotICB0ZXN0X3N0cnVjdHVyZV81ICp0czVfcmVzdWx0ID0gCi0gICAgKHRlc3Rfc3RydWN0dXJlXzUgKikgbWFsbG9jIChzaXplb2YodGVzdF9zdHJ1Y3R1cmVfNSkpOwotICAKICAgYXJnc1swXSA9ICZ0czVfdHlwZTsKICAgYXJnc1sxXSA9ICZ0czVfdHlwZTsKICAgdmFsdWVzWzBdID0gJnRzNV9hcmcxOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0Ni5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0Ni5jCmluZGV4IDgzZGI5YWYuLjBlMjY3NDYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cnVjdDYuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3Q2LmMKQEAgLTI3LDYgKzI3LDEzIEBACiAgIHZvaWQgKnZhbHVlc1tNQVhfQVJHU107CiAgIGZmaV90eXBlIHRzNl90eXBlOwogICBmZmlfdHlwZSAqdHM2X3R5cGVfZWxlbWVudHNbM107CisKKyAgdGVzdF9zdHJ1Y3R1cmVfNiB0czZfYXJnOworCisgIC8qIFRoaXMgaXMgYSBoYWNrIHRvIGdldCBhIHByb3Blcmx5IGFsaWduZWQgcmVzdWx0IGJ1ZmZlciAqLworICB0ZXN0X3N0cnVjdHVyZV82ICp0czZfcmVzdWx0ID0KKyAgICAodGVzdF9zdHJ1Y3R1cmVfNiAqKSBtYWxsb2MgKHNpemVvZih0ZXN0X3N0cnVjdHVyZV82KSk7CisKICAgdHM2X3R5cGUuc2l6ZSA9IDA7CiAgIHRzNl90eXBlLmFsaWdubWVudCA9IDA7CiAgIHRzNl90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CkBAIC0zNSwxMyArNDIsNiBAQAogICB0czZfdHlwZV9lbGVtZW50c1sxXSA9ICZmZmlfdHlwZV9kb3VibGU7CiAgIHRzNl90eXBlX2VsZW1lbnRzWzJdID0gTlVMTDsKIAotCi0gIHRlc3Rfc3RydWN0dXJlXzYgdHM2X2FyZzsKLQotICAvKiBUaGlzIGlzIGEgaGFjayB0byBnZXQgYSBwcm9wZXJseSBhbGlnbmVkIHJlc3VsdCBidWZmZXIgKi8KLSAgdGVzdF9zdHJ1Y3R1cmVfNiAqdHM2X3Jlc3VsdCA9IAotICAgICh0ZXN0X3N0cnVjdHVyZV82ICopIG1hbGxvYyAoc2l6ZW9mKHRlc3Rfc3RydWN0dXJlXzYpKTsKLSAgCiAgIGFyZ3NbMF0gPSAmdHM2X3R5cGU7CiAgIHZhbHVlc1swXSA9ICZ0czZfYXJnOwogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3Q3LmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3Q3LmMKaW5kZXggNThhYWM0Yy4uOGYyYmJmZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0Ny5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cnVjdDcuYwpAQCAtMjksNiArMjksMTMgQEAKICAgdm9pZCAqdmFsdWVzW01BWF9BUkdTXTsKICAgZmZpX3R5cGUgdHM3X3R5cGU7CiAgIGZmaV90eXBlICp0czdfdHlwZV9lbGVtZW50c1s0XTsKKworICB0ZXN0X3N0cnVjdHVyZV83IHRzN19hcmc7CisKKyAgLyogVGhpcyBpcyBhIGhhY2sgdG8gZ2V0IGEgcHJvcGVybHkgYWxpZ25lZCByZXN1bHQgYnVmZmVyICovCisgIHRlc3Rfc3RydWN0dXJlXzcgKnRzN19yZXN1bHQgPQorICAgICh0ZXN0X3N0cnVjdHVyZV83ICopIG1hbGxvYyAoc2l6ZW9mKHRlc3Rfc3RydWN0dXJlXzcpKTsKKwogICB0czdfdHlwZS5zaXplID0gMDsKICAgdHM3X3R5cGUuYWxpZ25tZW50ID0gMDsKICAgdHM3X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKQEAgLTM4LDEzICs0NSw2IEBACiAgIHRzN190eXBlX2VsZW1lbnRzWzJdID0gJmZmaV90eXBlX2RvdWJsZTsKICAgdHM3X3R5cGVfZWxlbWVudHNbM10gPSBOVUxMOwogCi0KLSAgdGVzdF9zdHJ1Y3R1cmVfNyB0czdfYXJnOwotICAKLSAgLyogVGhpcyBpcyBhIGhhY2sgdG8gZ2V0IGEgcHJvcGVybHkgYWxpZ25lZCByZXN1bHQgYnVmZmVyICovCi0gIHRlc3Rfc3RydWN0dXJlXzcgKnRzN19yZXN1bHQgPSAKLSAgICAodGVzdF9zdHJ1Y3R1cmVfNyAqKSBtYWxsb2MgKHNpemVvZih0ZXN0X3N0cnVjdHVyZV83KSk7Ci0gIAogICBhcmdzWzBdID0gJnRzN190eXBlOwogICB2YWx1ZXNbMF0gPSAmdHM3X2FyZzsKICAgCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3Q4LmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3Q4LmMKaW5kZXggYzc3M2FjNy4uMjY2ZTFmMCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0OC5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cnVjdDguYwpAQCAtMzEsNiArMzEsMTMgQEAKICAgdm9pZCAqdmFsdWVzW01BWF9BUkdTXTsKICAgZmZpX3R5cGUgdHM4X3R5cGU7CiAgIGZmaV90eXBlICp0czhfdHlwZV9lbGVtZW50c1s1XTsKKworICB0ZXN0X3N0cnVjdHVyZV84IHRzOF9hcmc7CisKKyAgLyogVGhpcyBpcyBhIGhhY2sgdG8gZ2V0IGEgcHJvcGVybHkgYWxpZ25lZCByZXN1bHQgYnVmZmVyICovCisgIHRlc3Rfc3RydWN0dXJlXzggKnRzOF9yZXN1bHQgPQorICAgICh0ZXN0X3N0cnVjdHVyZV84ICopIG1hbGxvYyAoc2l6ZW9mKHRlc3Rfc3RydWN0dXJlXzgpKTsKKwogICB0czhfdHlwZS5zaXplID0gMDsKICAgdHM4X3R5cGUuYWxpZ25tZW50ID0gMDsKICAgdHM4X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKQEAgLTQxLDEyICs0OCw2IEBACiAgIHRzOF90eXBlX2VsZW1lbnRzWzNdID0gJmZmaV90eXBlX2Zsb2F0OwogICB0czhfdHlwZV9lbGVtZW50c1s0XSA9IE5VTEw7CiAKLSAgdGVzdF9zdHJ1Y3R1cmVfOCB0czhfYXJnOwotICAKLSAgLyogVGhpcyBpcyBhIGhhY2sgdG8gZ2V0IGEgcHJvcGVybHkgYWxpZ25lZCByZXN1bHQgYnVmZmVyICovCi0gIHRlc3Rfc3RydWN0dXJlXzggKnRzOF9yZXN1bHQgPSAKLSAgICAodGVzdF9zdHJ1Y3R1cmVfOCAqKSBtYWxsb2MgKHNpemVvZih0ZXN0X3N0cnVjdHVyZV84KSk7Ci0gIAogICBhcmdzWzBdID0gJnRzOF90eXBlOwogICB2YWx1ZXNbMF0gPSAmdHM4X2FyZzsKICAgCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3Q5LmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3Q5LmMKaW5kZXggZjMwMDkxZi4uZWZlYjcxNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0OS5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cnVjdDkuYwpAQCAtMjgsNiArMjgsMTMgQEAKICAgdm9pZCAqdmFsdWVzW01BWF9BUkdTXTsKICAgZmZpX3R5cGUgdHM5X3R5cGU7CiAgIGZmaV90eXBlICp0czlfdHlwZV9lbGVtZW50c1szXTsKKworICB0ZXN0X3N0cnVjdHVyZV85IHRzOV9hcmc7CisKKyAgLyogVGhpcyBpcyBhIGhhY2sgdG8gZ2V0IGEgcHJvcGVybHkgYWxpZ25lZCByZXN1bHQgYnVmZmVyICovCisgIHRlc3Rfc3RydWN0dXJlXzkgKnRzOV9yZXN1bHQgPQorICAgICh0ZXN0X3N0cnVjdHVyZV85ICopIG1hbGxvYyAoc2l6ZW9mKHRlc3Rfc3RydWN0dXJlXzkpKTsKKwogICB0czlfdHlwZS5zaXplID0gMDsKICAgdHM5X3R5cGUuYWxpZ25tZW50ID0gMDsKICAgdHM5X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKQEAgLTM2LDEyICs0Myw2IEBACiAgIHRzOV90eXBlX2VsZW1lbnRzWzFdID0gJmZmaV90eXBlX3NpbnQ7CiAgIHRzOV90eXBlX2VsZW1lbnRzWzJdID0gTlVMTDsKIAotICB0ZXN0X3N0cnVjdHVyZV85IHRzOV9hcmc7Ci0gIAotICAvKiBUaGlzIGlzIGEgaGFjayB0byBnZXQgYSBwcm9wZXJseSBhbGlnbmVkIHJlc3VsdCBidWZmZXIgKi8KLSAgdGVzdF9zdHJ1Y3R1cmVfOSAqdHM5X3Jlc3VsdCA9IAotICAgICh0ZXN0X3N0cnVjdHVyZV85ICopIG1hbGxvYyAoc2l6ZW9mKHRlc3Rfc3RydWN0dXJlXzkpKTsKLSAgCiAgIGFyZ3NbMF0gPSAmdHM5X3R5cGU7CiAgIHZhbHVlc1swXSA9ICZ0czlfYXJnOwogICAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3Rlc3RjbG9zdXJlLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC90ZXN0Y2xvc3VyZS5jCmluZGV4IDE2MWNjODkuLmNhMzEwNTYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3Rlc3RjbG9zdXJlLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvdGVzdGNsb3N1cmUuYwpAQCAtNDMsMTMgKzQzLDEzIEBACiAgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZTA7CiAgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzVdOwogCisgIHN0cnVjdCBjbHNfc3RydWN0X2NvbWJpbmVkIGdfZGJsID0gezQuMCwgNS4wLCAxLjAsIDguMH07CisKICAgY2xzX3N0cnVjdF90eXBlMC5zaXplID0gMDsKICAgY2xzX3N0cnVjdF90eXBlMC5hbGlnbm1lbnQgPSAwOwogICBjbHNfc3RydWN0X3R5cGUwLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CiAgIGNsc19zdHJ1Y3RfdHlwZTAuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczA7CiAKLSAgc3RydWN0IGNsc19zdHJ1Y3RfY29tYmluZWQgZ19kYmwgPSB7NC4wLCA1LjAsIDEuMCwgOC4wfTsKLQogICBjbHNfc3RydWN0X2ZpZWxkczBbMF0gPSAmZmZpX3R5cGVfZmxvYXQ7CiAgIGNsc19zdHJ1Y3RfZmllbGRzMFsxXSA9ICZmZmlfdHlwZV9mbG9hdDsKICAgY2xzX3N0cnVjdF9maWVsZHMwWzJdID0gJmZmaV90eXBlX2Zsb2F0OwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvdW5pbml0aWFsaXplZC5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvdW5pbml0aWFsaXplZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMGQ4MzAKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC91bmluaXRpYWxpemVkLmMKQEAgLTAsMCArMSw2MSBAQAorLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdW5zaWduZWQgY2hhciB1YzsKKyAgZG91YmxlIGQ7CisgIHVuc2lnbmVkIGludCB1aTsKK30gdGVzdF9zdHJ1Y3R1cmVfMTsKKworc3RhdGljIHRlc3Rfc3RydWN0dXJlXzEgc3RydWN0MSh0ZXN0X3N0cnVjdHVyZV8xIHRzKQoreworICB0cy51YysrOworICB0cy5kLS07CisgIHRzLnVpKys7CisKKyAgcmV0dXJuIHRzOworfQorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIGZmaV90eXBlICphcmdzW01BWF9BUkdTXTsKKyAgdm9pZCAqdmFsdWVzW01BWF9BUkdTXTsKKyAgZmZpX3R5cGUgdHMxX3R5cGU7CisgIGZmaV90eXBlICp0czFfdHlwZV9lbGVtZW50c1s0XTsKKworICBtZW1zZXQoJmNpZiwgMSwgc2l6ZW9mKGNpZikpOworICB0czFfdHlwZS5zaXplID0gMDsKKyAgdHMxX3R5cGUuYWxpZ25tZW50ID0gMDsKKyAgdHMxX3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgdHMxX3R5cGUuZWxlbWVudHMgPSB0czFfdHlwZV9lbGVtZW50czsKKyAgdHMxX3R5cGVfZWxlbWVudHNbMF0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIHRzMV90eXBlX2VsZW1lbnRzWzFdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgdHMxX3R5cGVfZWxlbWVudHNbMl0gPSAmZmZpX3R5cGVfdWludDsKKyAgdHMxX3R5cGVfZWxlbWVudHNbM10gPSBOVUxMOworCisgIHRlc3Rfc3RydWN0dXJlXzEgdHMxX2FyZzsKKyAgLyogVGhpcyBpcyBhIGhhY2sgdG8gZ2V0IGEgcHJvcGVybHkgYWxpZ25lZCByZXN1bHQgYnVmZmVyICovCisgIHRlc3Rfc3RydWN0dXJlXzEgKnRzMV9yZXN1bHQgPQorICAgICh0ZXN0X3N0cnVjdHVyZV8xICopIG1hbGxvYyAoc2l6ZW9mKHRlc3Rfc3RydWN0dXJlXzEpKTsKKworICBhcmdzWzBdID0gJnRzMV90eXBlOworICB2YWx1ZXNbMF0gPSAmdHMxX2FyZzsKKworICAvKiBJbml0aWFsaXplIHRoZSBjaWYgKi8KKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMSwKKwkJICAgICAmdHMxX3R5cGUsIGFyZ3MpID09IEZGSV9PSyk7CisKKyAgdHMxX2FyZy51YyA9ICdceDAxJzsKKyAgdHMxX2FyZy5kID0gMy4xNDE1OTsKKyAgdHMxX2FyZy51aSA9IDU1NTsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4oc3RydWN0MSksIHRzMV9yZXN1bHQsIHZhbHVlcyk7CisKKyAgQ0hFQ0sodHMxX3Jlc3VsdC0+dWkgPT0gNTU2KTsKKyAgQ0hFQ0sodHMxX3Jlc3VsdC0+ZCA9PSAzLjE0MTU5IC0gMSk7CisKKyAgZnJlZSAodHMxX3Jlc3VsdCk7CisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC92YV8xLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC92YV8xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y0ZGQ4NQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3ZhXzEuYwpAQCAtMCwwICsxLDE5NiBAQAorLyogQXJlYToJCWZmaV9jYWxsCisgICBQdXJwb3NlOgkJVGVzdCBwYXNzaW5nIHN0cnVjdCBpbiB2YXJpYWJsZSBhcmd1bWVudCBsaXN0cy4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CSAgICAgICAgQVJNIEx0ZC4gKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworLyogeyBkZy1vdXRwdXQgIiIgeyB4ZmFpbCBhdnIzMiotKi0qIH0gfSAqLworCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitzdHJ1Y3Qgc21hbGxfdGFnCit7CisgIHVuc2lnbmVkIGNoYXIgYTsKKyAgdW5zaWduZWQgY2hhciBiOworfTsKKworc3RydWN0IGxhcmdlX3RhZworeworICB1bnNpZ25lZCBhOworICB1bnNpZ25lZCBiOworICB1bnNpZ25lZCBjOworICB1bnNpZ25lZCBkOworICB1bnNpZ25lZCBlOworfTsKKworc3RhdGljIGludAordGVzdF9mbiAoaW50IG4sIC4uLikKK3sKKyAgdmFfbGlzdCBhcDsKKyAgc3RydWN0IHNtYWxsX3RhZyBzMTsKKyAgc3RydWN0IHNtYWxsX3RhZyBzMjsKKyAgc3RydWN0IGxhcmdlX3RhZyBsOworICB1bnNpZ25lZCBjaGFyIHVjOworICBzaWduZWQgY2hhciBzYzsKKyAgdW5zaWduZWQgc2hvcnQgdXM7CisgIHNpZ25lZCBzaG9ydCBzczsKKyAgdW5zaWduZWQgaW50IHVpOworICBzaWduZWQgaW50IHNpOworICB1bnNpZ25lZCBsb25nIHVsOworICBzaWduZWQgbG9uZyBzbDsKKyAgZmxvYXQgZjsKKyAgZG91YmxlIGQ7CisKKyAgdmFfc3RhcnQgKGFwLCBuKTsKKyAgczEgPSB2YV9hcmcgKGFwLCBzdHJ1Y3Qgc21hbGxfdGFnKTsKKyAgbCA9IHZhX2FyZyAoYXAsIHN0cnVjdCBsYXJnZV90YWcpOworICBzMiA9IHZhX2FyZyAoYXAsIHN0cnVjdCBzbWFsbF90YWcpOworCisgIHVjID0gdmFfYXJnIChhcCwgdW5zaWduZWQpOworICBzYyA9IHZhX2FyZyAoYXAsIHNpZ25lZCk7CisKKyAgdXMgPSB2YV9hcmcgKGFwLCB1bnNpZ25lZCk7CisgIHNzID0gdmFfYXJnIChhcCwgc2lnbmVkKTsKKworICB1aSA9IHZhX2FyZyAoYXAsIHVuc2lnbmVkIGludCk7CisgIHNpID0gdmFfYXJnIChhcCwgc2lnbmVkIGludCk7CisKKyAgdWwgPSB2YV9hcmcgKGFwLCB1bnNpZ25lZCBsb25nKTsKKyAgc2wgPSB2YV9hcmcgKGFwLCBzaWduZWQgbG9uZyk7CisKKyAgZiA9IHZhX2FyZyAoYXAsIGRvdWJsZSk7CS8qIEMgc3RhbmRhcmQgcHJvbW90ZXMgZmxvYXQtPmRvdWJsZQorCQkJCSAgIHdoZW4gYW5vbnltb3VzICovCisgIGQgPSB2YV9hcmcgKGFwLCBkb3VibGUpOworCisgIHByaW50ZiAoIiV1ICV1ICV1ICV1ICV1ICV1ICV1ICV1ICV1IHVjPSV1IHNjPSVkICV1ICVkICV1ICVkICVsdSAlbGQgJWYgJWZcbiIsCisJICBzMS5hLCBzMS5iLCBsLmEsIGwuYiwgbC5jLCBsLmQsIGwuZSwKKwkgIHMyLmEsIHMyLmIsCisJICB1Yywgc2MsCisJICB1cywgc3MsCisJICB1aSwgc2ksCisJICB1bCwgc2wsCisJICBmLCBkKTsKKyAgdmFfZW5kIChhcCk7CisgIHJldHVybiBuICsgMTsKK30KKworaW50CittYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgdm9pZCogYXJnc1sxNV07CisgIGZmaV90eXBlKiBhcmdfdHlwZXNbMTVdOworCisgIGZmaV90eXBlIHNfdHlwZTsKKyAgZmZpX3R5cGUgKnNfdHlwZV9lbGVtZW50c1szXTsKKworICBmZmlfdHlwZSBsX3R5cGU7CisgIGZmaV90eXBlICpsX3R5cGVfZWxlbWVudHNbNl07CisKKyAgc3RydWN0IHNtYWxsX3RhZyBzMTsKKyAgc3RydWN0IHNtYWxsX3RhZyBzMjsKKyAgc3RydWN0IGxhcmdlX3RhZyBsMTsKKworICBpbnQgbjsKKyAgaW50IHJlczsKKworICB1bnNpZ25lZCBjaGFyIHVjOworICBzaWduZWQgY2hhciBzYzsKKyAgdW5zaWduZWQgc2hvcnQgdXM7CisgIHNpZ25lZCBzaG9ydCBzczsKKyAgdW5zaWduZWQgaW50IHVpOworICBzaWduZWQgaW50IHNpOworICB1bnNpZ25lZCBsb25nIHVsOworICBzaWduZWQgbG9uZyBzbDsKKyAgZG91YmxlIGQxOworICBkb3VibGUgZjE7CisKKyAgc190eXBlLnNpemUgPSAwOworICBzX3R5cGUuYWxpZ25tZW50ID0gMDsKKyAgc190eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIHNfdHlwZS5lbGVtZW50cyA9IHNfdHlwZV9lbGVtZW50czsKKworICBzX3R5cGVfZWxlbWVudHNbMF0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIHNfdHlwZV9lbGVtZW50c1sxXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgc190eXBlX2VsZW1lbnRzWzJdID0gTlVMTDsKKworICBsX3R5cGUuc2l6ZSA9IDA7CisgIGxfdHlwZS5hbGlnbm1lbnQgPSAwOworICBsX3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgbF90eXBlLmVsZW1lbnRzID0gbF90eXBlX2VsZW1lbnRzOworCisgIGxfdHlwZV9lbGVtZW50c1swXSA9ICZmZmlfdHlwZV91aW50OworICBsX3R5cGVfZWxlbWVudHNbMV0gPSAmZmZpX3R5cGVfdWludDsKKyAgbF90eXBlX2VsZW1lbnRzWzJdID0gJmZmaV90eXBlX3VpbnQ7CisgIGxfdHlwZV9lbGVtZW50c1szXSA9ICZmZmlfdHlwZV91aW50OworICBsX3R5cGVfZWxlbWVudHNbNF0gPSAmZmZpX3R5cGVfdWludDsKKyAgbF90eXBlX2VsZW1lbnRzWzVdID0gTlVMTDsKKworICBhcmdfdHlwZXNbMF0gPSAmZmZpX3R5cGVfc2ludDsKKyAgYXJnX3R5cGVzWzFdID0gJnNfdHlwZTsKKyAgYXJnX3R5cGVzWzJdID0gJmxfdHlwZTsKKyAgYXJnX3R5cGVzWzNdID0gJnNfdHlwZTsKKyAgYXJnX3R5cGVzWzRdID0gJmZmaV90eXBlX3VjaGFyOworICBhcmdfdHlwZXNbNV0gPSAmZmZpX3R5cGVfc2NoYXI7CisgIGFyZ190eXBlc1s2XSA9ICZmZmlfdHlwZV91c2hvcnQ7CisgIGFyZ190eXBlc1s3XSA9ICZmZmlfdHlwZV9zc2hvcnQ7CisgIGFyZ190eXBlc1s4XSA9ICZmZmlfdHlwZV91aW50OworICBhcmdfdHlwZXNbOV0gPSAmZmZpX3R5cGVfc2ludDsKKyAgYXJnX3R5cGVzWzEwXSA9ICZmZmlfdHlwZV91bG9uZzsKKyAgYXJnX3R5cGVzWzExXSA9ICZmZmlfdHlwZV9zbG9uZzsKKyAgYXJnX3R5cGVzWzEyXSA9ICZmZmlfdHlwZV9kb3VibGU7CisgIGFyZ190eXBlc1sxM10gPSAmZmZpX3R5cGVfZG91YmxlOworICBhcmdfdHlwZXNbMTRdID0gTlVMTDsKKworICBDSEVDSyhmZmlfcHJlcF9jaWZfdmFyKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMSwgMTQsICZmZmlfdHlwZV9zaW50LCBhcmdfdHlwZXMpID09IEZGSV9PSyk7CisKKyAgczEuYSA9IDU7CisgIHMxLmIgPSA2OworCisgIGwxLmEgPSAxMDsKKyAgbDEuYiA9IDExOworICBsMS5jID0gMTI7CisgIGwxLmQgPSAxMzsKKyAgbDEuZSA9IDE0OworCisgIHMyLmEgPSA3OworICBzMi5iID0gODsKKworICBuID0gNDE7CisKKyAgdWMgPSA5OworICBzYyA9IDEwOworICB1cyA9IDExOworICBzcyA9IDEyOworICB1aSA9IDEzOworICBzaSA9IDE0OworICB1bCA9IDE1OworICBzbCA9IDE2OworICBmMSA9IDIuMTI7CisgIGQxID0gMy4xMzsKKworICBhcmdzWzBdID0gJm47CisgIGFyZ3NbMV0gPSAmczE7CisgIGFyZ3NbMl0gPSAmbDE7CisgIGFyZ3NbM10gPSAmczI7CisgIGFyZ3NbNF0gPSAmdWM7CisgIGFyZ3NbNV0gPSAmc2M7CisgIGFyZ3NbNl0gPSAmdXM7CisgIGFyZ3NbN10gPSAmc3M7CisgIGFyZ3NbOF0gPSAmdWk7CisgIGFyZ3NbOV0gPSAmc2k7CisgIGFyZ3NbMTBdID0gJnVsOworICBhcmdzWzExXSA9ICZzbDsKKyAgYXJnc1sxMl0gPSAmZjE7CisgIGFyZ3NbMTNdID0gJmQxOworICBhcmdzWzE0XSA9IE5VTEw7CisKKyAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKHRlc3RfZm4pLCAmcmVzLCBhcmdzKTsKKyAgLyogeyBkZy1vdXRwdXQgIjUgNiAxMCAxMSAxMiAxMyAxNCA3IDggdWM9OSBzYz0xMCAxMSAxMiAxMyAxNCAxNSAxNiAyLjEyMDAwMCAzLjEzMDAwMCIgfSAqLworICBwcmludGYoInJlczogJWRcbiIsIChpbnQpIHJlcyk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogNDIiIH0gKi8KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3ZhX3N0cnVjdDEuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3ZhX3N0cnVjdDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWQxZjEwCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvdmFfc3RydWN0MS5jCkBAIC0wLDAgKzEsMTIxIEBACisvKiBBcmVhOgkJZmZpX2NhbGwKKyAgIFB1cnBvc2U6CQlUZXN0IHBhc3Npbmcgc3RydWN0IGluIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3RzLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCQlub25lLgorICAgT3JpZ2luYXRvcjogQVJNIEx0ZC4gKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworLyogeyBkZy1vdXRwdXQgIiIgeyB4ZmFpbCBhdnIzMiotKi0qIH0gfSAqLworCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitzdHJ1Y3Qgc21hbGxfdGFnCit7CisgIHVuc2lnbmVkIGNoYXIgYTsKKyAgdW5zaWduZWQgY2hhciBiOworfTsKKworc3RydWN0IGxhcmdlX3RhZworeworICB1bnNpZ25lZCBhOworICB1bnNpZ25lZCBiOworICB1bnNpZ25lZCBjOworICB1bnNpZ25lZCBkOworICB1bnNpZ25lZCBlOworfTsKKworc3RhdGljIGludAordGVzdF9mbiAoaW50IG4sIC4uLikKK3sKKyAgdmFfbGlzdCBhcDsKKyAgc3RydWN0IHNtYWxsX3RhZyBzMTsKKyAgc3RydWN0IHNtYWxsX3RhZyBzMjsKKyAgc3RydWN0IGxhcmdlX3RhZyBsOworCisgIHZhX3N0YXJ0IChhcCwgbik7CisgIHMxID0gdmFfYXJnIChhcCwgc3RydWN0IHNtYWxsX3RhZyk7CisgIGwgPSB2YV9hcmcgKGFwLCBzdHJ1Y3QgbGFyZ2VfdGFnKTsKKyAgczIgPSB2YV9hcmcgKGFwLCBzdHJ1Y3Qgc21hbGxfdGFnKTsKKyAgcHJpbnRmICgiJXUgJXUgJXUgJXUgJXUgJXUgJXUgJXUgJXVcbiIsIHMxLmEsIHMxLmIsIGwuYSwgbC5iLCBsLmMsIGwuZCwgbC5lLAorCSAgczIuYSwgczIuYik7CisgIHZhX2VuZCAoYXApOworICByZXR1cm4gbiArIDE7Cit9CisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQqIGFyZ3NbNV07CisgIGZmaV90eXBlKiBhcmdfdHlwZXNbNV07CisKKyAgZmZpX3R5cGUgc190eXBlOworICBmZmlfdHlwZSAqc190eXBlX2VsZW1lbnRzWzNdOworCisgIGZmaV90eXBlIGxfdHlwZTsKKyAgZmZpX3R5cGUgKmxfdHlwZV9lbGVtZW50c1s2XTsKKworICBzdHJ1Y3Qgc21hbGxfdGFnIHMxOworICBzdHJ1Y3Qgc21hbGxfdGFnIHMyOworICBzdHJ1Y3QgbGFyZ2VfdGFnIGwxOworCisgIGludCBuOworICBpbnQgcmVzOworCisgIHNfdHlwZS5zaXplID0gMDsKKyAgc190eXBlLmFsaWdubWVudCA9IDA7CisgIHNfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBzX3R5cGUuZWxlbWVudHMgPSBzX3R5cGVfZWxlbWVudHM7CisKKyAgc190eXBlX2VsZW1lbnRzWzBdID0gJmZmaV90eXBlX3VjaGFyOworICBzX3R5cGVfZWxlbWVudHNbMV0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIHNfdHlwZV9lbGVtZW50c1syXSA9IE5VTEw7CisKKyAgbF90eXBlLnNpemUgPSAwOworICBsX3R5cGUuYWxpZ25tZW50ID0gMDsKKyAgbF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIGxfdHlwZS5lbGVtZW50cyA9IGxfdHlwZV9lbGVtZW50czsKKworICBsX3R5cGVfZWxlbWVudHNbMF0gPSAmZmZpX3R5cGVfdWludDsKKyAgbF90eXBlX2VsZW1lbnRzWzFdID0gJmZmaV90eXBlX3VpbnQ7CisgIGxfdHlwZV9lbGVtZW50c1syXSA9ICZmZmlfdHlwZV91aW50OworICBsX3R5cGVfZWxlbWVudHNbM10gPSAmZmZpX3R5cGVfdWludDsKKyAgbF90eXBlX2VsZW1lbnRzWzRdID0gJmZmaV90eXBlX3VpbnQ7CisgIGxfdHlwZV9lbGVtZW50c1s1XSA9IE5VTEw7CisKKyAgYXJnX3R5cGVzWzBdID0gJmZmaV90eXBlX3NpbnQ7CisgIGFyZ190eXBlc1sxXSA9ICZzX3R5cGU7CisgIGFyZ190eXBlc1syXSA9ICZsX3R5cGU7CisgIGFyZ190eXBlc1szXSA9ICZzX3R5cGU7CisgIGFyZ190eXBlc1s0XSA9IE5VTEw7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmX3ZhcigmY2lmLCBGRklfREVGQVVMVF9BQkksIDEsIDQsICZmZmlfdHlwZV9zaW50LCBhcmdfdHlwZXMpID09IEZGSV9PSyk7CisKKyAgczEuYSA9IDU7CisgIHMxLmIgPSA2OworCisgIGwxLmEgPSAxMDsKKyAgbDEuYiA9IDExOworICBsMS5jID0gMTI7CisgIGwxLmQgPSAxMzsKKyAgbDEuZSA9IDE0OworCisgIHMyLmEgPSA3OworICBzMi5iID0gODsKKworICBuID0gNDE7CisKKyAgYXJnc1swXSA9ICZuOworICBhcmdzWzFdID0gJnMxOworICBhcmdzWzJdID0gJmwxOworICBhcmdzWzNdID0gJnMyOworICBhcmdzWzRdID0gTlVMTDsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4odGVzdF9mbiksICZyZXMsIGFyZ3MpOworICAvKiB7IGRnLW91dHB1dCAiNSA2IDEwIDExIDEyIDEzIDE0IDcgOCIgfSAqLworICBwcmludGYoInJlczogJWRcbiIsIChpbnQpIHJlcyk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogNDIiIH0gKi8KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3ZhX3N0cnVjdDIuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3ZhX3N0cnVjdDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmY1YjljCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvdmFfc3RydWN0Mi5jCkBAIC0wLDAgKzEsMTIzIEBACisvKiBBcmVhOgkJZmZpX2NhbGwKKyAgIFB1cnBvc2U6CQlUZXN0IHBhc3Npbmcgc3RydWN0IGluIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3RzLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCQlub25lLgorICAgT3JpZ2luYXRvcjogQVJNIEx0ZC4gKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworLyogeyBkZy1vdXRwdXQgIiIgeyB4ZmFpbCBhdnIzMiotKi0qIH0gfSAqLworCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitzdHJ1Y3Qgc21hbGxfdGFnCit7CisgIHVuc2lnbmVkIGNoYXIgYTsKKyAgdW5zaWduZWQgY2hhciBiOworfTsKKworc3RydWN0IGxhcmdlX3RhZworeworICB1bnNpZ25lZCBhOworICB1bnNpZ25lZCBiOworICB1bnNpZ25lZCBjOworICB1bnNpZ25lZCBkOworICB1bnNpZ25lZCBlOworfTsKKworc3RhdGljIHN0cnVjdCBzbWFsbF90YWcKK3Rlc3RfZm4gKGludCBuLCAuLi4pCit7CisgIHZhX2xpc3QgYXA7CisgIHN0cnVjdCBzbWFsbF90YWcgczE7CisgIHN0cnVjdCBzbWFsbF90YWcgczI7CisgIHN0cnVjdCBsYXJnZV90YWcgbDsKKworICB2YV9zdGFydCAoYXAsIG4pOworICBzMSA9IHZhX2FyZyAoYXAsIHN0cnVjdCBzbWFsbF90YWcpOworICBsID0gdmFfYXJnIChhcCwgc3RydWN0IGxhcmdlX3RhZyk7CisgIHMyID0gdmFfYXJnIChhcCwgc3RydWN0IHNtYWxsX3RhZyk7CisgIHByaW50ZiAoIiV1ICV1ICV1ICV1ICV1ICV1ICV1ICV1ICV1XG4iLCBzMS5hLCBzMS5iLCBsLmEsIGwuYiwgbC5jLCBsLmQsIGwuZSwKKwkgIHMyLmEsIHMyLmIpOworICB2YV9lbmQgKGFwKTsKKyAgczEuYSArPSBzMi5hOworICBzMS5iICs9IHMyLmI7CisgIHJldHVybiBzMTsKK30KKworaW50CittYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgdm9pZCogYXJnc1s1XTsKKyAgZmZpX3R5cGUqIGFyZ190eXBlc1s1XTsKKworICBmZmlfdHlwZSBzX3R5cGU7CisgIGZmaV90eXBlICpzX3R5cGVfZWxlbWVudHNbM107CisKKyAgZmZpX3R5cGUgbF90eXBlOworICBmZmlfdHlwZSAqbF90eXBlX2VsZW1lbnRzWzZdOworCisgIHN0cnVjdCBzbWFsbF90YWcgczE7CisgIHN0cnVjdCBzbWFsbF90YWcgczI7CisgIHN0cnVjdCBsYXJnZV90YWcgbDE7CisKKyAgaW50IG47CisgIHN0cnVjdCBzbWFsbF90YWcgcmVzOworCisgIHNfdHlwZS5zaXplID0gMDsKKyAgc190eXBlLmFsaWdubWVudCA9IDA7CisgIHNfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBzX3R5cGUuZWxlbWVudHMgPSBzX3R5cGVfZWxlbWVudHM7CisKKyAgc190eXBlX2VsZW1lbnRzWzBdID0gJmZmaV90eXBlX3VjaGFyOworICBzX3R5cGVfZWxlbWVudHNbMV0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIHNfdHlwZV9lbGVtZW50c1syXSA9IE5VTEw7CisKKyAgbF90eXBlLnNpemUgPSAwOworICBsX3R5cGUuYWxpZ25tZW50ID0gMDsKKyAgbF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIGxfdHlwZS5lbGVtZW50cyA9IGxfdHlwZV9lbGVtZW50czsKKworICBsX3R5cGVfZWxlbWVudHNbMF0gPSAmZmZpX3R5cGVfdWludDsKKyAgbF90eXBlX2VsZW1lbnRzWzFdID0gJmZmaV90eXBlX3VpbnQ7CisgIGxfdHlwZV9lbGVtZW50c1syXSA9ICZmZmlfdHlwZV91aW50OworICBsX3R5cGVfZWxlbWVudHNbM10gPSAmZmZpX3R5cGVfdWludDsKKyAgbF90eXBlX2VsZW1lbnRzWzRdID0gJmZmaV90eXBlX3VpbnQ7CisgIGxfdHlwZV9lbGVtZW50c1s1XSA9IE5VTEw7CisKKyAgYXJnX3R5cGVzWzBdID0gJmZmaV90eXBlX3NpbnQ7CisgIGFyZ190eXBlc1sxXSA9ICZzX3R5cGU7CisgIGFyZ190eXBlc1syXSA9ICZsX3R5cGU7CisgIGFyZ190eXBlc1szXSA9ICZzX3R5cGU7CisgIGFyZ190eXBlc1s0XSA9IE5VTEw7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmX3ZhcigmY2lmLCBGRklfREVGQVVMVF9BQkksIDEsIDQsICZzX3R5cGUsIGFyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBzMS5hID0gNTsKKyAgczEuYiA9IDY7CisKKyAgbDEuYSA9IDEwOworICBsMS5iID0gMTE7CisgIGwxLmMgPSAxMjsKKyAgbDEuZCA9IDEzOworICBsMS5lID0gMTQ7CisKKyAgczIuYSA9IDc7CisgIHMyLmIgPSA4OworCisgIG4gPSA0MTsKKworICBhcmdzWzBdID0gJm47CisgIGFyZ3NbMV0gPSAmczE7CisgIGFyZ3NbMl0gPSAmbDE7CisgIGFyZ3NbM10gPSAmczI7CisgIGFyZ3NbNF0gPSBOVUxMOworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTih0ZXN0X2ZuKSwgJnJlcywgYXJncyk7CisgIC8qIHsgZGctb3V0cHV0ICI1IDYgMTAgMTEgMTIgMTMgMTQgNyA4IiB9ICovCisgIHByaW50ZigicmVzOiAlZCAlZFxuIiwgcmVzLmEsIHJlcy5iKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAxMiAxNCIgfSAqLworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvdmFfc3RydWN0My5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvdmFfc3RydWN0My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMjdlN2YKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC92YV9zdHJ1Y3QzLmMKQEAgLTAsMCArMSwxMjUgQEAKKy8qIEFyZWE6CQlmZmlfY2FsbAorICAgUHVycG9zZToJCVRlc3QgcGFzc2luZyBzdHJ1Y3QgaW4gdmFyaWFibGUgYXJndW1lbnQgbGlzdHMuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJCW5vbmUuCisgICBPcmlnaW5hdG9yOglBUk0gTHRkLiAqLworCisvKiB7IGRnLWRvIHJ1biB9ICovCisvKiB7IGRnLW91dHB1dCAiIiB7IHhmYWlsIGF2cjMyKi0qLSogfSB9ICovCisKKyNpbmNsdWRlICJmZml0ZXN0LmgiCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK3N0cnVjdCBzbWFsbF90YWcKK3sKKyAgdW5zaWduZWQgY2hhciBhOworICB1bnNpZ25lZCBjaGFyIGI7Cit9OworCitzdHJ1Y3QgbGFyZ2VfdGFnCit7CisgIHVuc2lnbmVkIGE7CisgIHVuc2lnbmVkIGI7CisgIHVuc2lnbmVkIGM7CisgIHVuc2lnbmVkIGQ7CisgIHVuc2lnbmVkIGU7Cit9OworCitzdGF0aWMgc3RydWN0IGxhcmdlX3RhZwordGVzdF9mbiAoaW50IG4sIC4uLikKK3sKKyAgdmFfbGlzdCBhcDsKKyAgc3RydWN0IHNtYWxsX3RhZyBzMTsKKyAgc3RydWN0IHNtYWxsX3RhZyBzMjsKKyAgc3RydWN0IGxhcmdlX3RhZyBsOworCisgIHZhX3N0YXJ0IChhcCwgbik7CisgIHMxID0gdmFfYXJnIChhcCwgc3RydWN0IHNtYWxsX3RhZyk7CisgIGwgPSB2YV9hcmcgKGFwLCBzdHJ1Y3QgbGFyZ2VfdGFnKTsKKyAgczIgPSB2YV9hcmcgKGFwLCBzdHJ1Y3Qgc21hbGxfdGFnKTsKKyAgcHJpbnRmICgiJXUgJXUgJXUgJXUgJXUgJXUgJXUgJXUgJXVcbiIsIHMxLmEsIHMxLmIsIGwuYSwgbC5iLCBsLmMsIGwuZCwgbC5lLAorCSAgczIuYSwgczIuYik7CisgIHZhX2VuZCAoYXApOworICBsLmEgKz0gczEuYTsKKyAgbC5iICs9IHMxLmI7CisgIGwuYyArPSBzMi5hOworICBsLmQgKz0gczIuYjsKKyAgcmV0dXJuIGw7Cit9CisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQqIGFyZ3NbNV07CisgIGZmaV90eXBlKiBhcmdfdHlwZXNbNV07CisKKyAgZmZpX3R5cGUgc190eXBlOworICBmZmlfdHlwZSAqc190eXBlX2VsZW1lbnRzWzNdOworCisgIGZmaV90eXBlIGxfdHlwZTsKKyAgZmZpX3R5cGUgKmxfdHlwZV9lbGVtZW50c1s2XTsKKworICBzdHJ1Y3Qgc21hbGxfdGFnIHMxOworICBzdHJ1Y3Qgc21hbGxfdGFnIHMyOworICBzdHJ1Y3QgbGFyZ2VfdGFnIGwxOworCisgIGludCBuOworICBzdHJ1Y3QgbGFyZ2VfdGFnIHJlczsKKworICBzX3R5cGUuc2l6ZSA9IDA7CisgIHNfdHlwZS5hbGlnbm1lbnQgPSAwOworICBzX3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgc190eXBlLmVsZW1lbnRzID0gc190eXBlX2VsZW1lbnRzOworCisgIHNfdHlwZV9lbGVtZW50c1swXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgc190eXBlX2VsZW1lbnRzWzFdID0gJmZmaV90eXBlX3VjaGFyOworICBzX3R5cGVfZWxlbWVudHNbMl0gPSBOVUxMOworCisgIGxfdHlwZS5zaXplID0gMDsKKyAgbF90eXBlLmFsaWdubWVudCA9IDA7CisgIGxfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBsX3R5cGUuZWxlbWVudHMgPSBsX3R5cGVfZWxlbWVudHM7CisKKyAgbF90eXBlX2VsZW1lbnRzWzBdID0gJmZmaV90eXBlX3VpbnQ7CisgIGxfdHlwZV9lbGVtZW50c1sxXSA9ICZmZmlfdHlwZV91aW50OworICBsX3R5cGVfZWxlbWVudHNbMl0gPSAmZmZpX3R5cGVfdWludDsKKyAgbF90eXBlX2VsZW1lbnRzWzNdID0gJmZmaV90eXBlX3VpbnQ7CisgIGxfdHlwZV9lbGVtZW50c1s0XSA9ICZmZmlfdHlwZV91aW50OworICBsX3R5cGVfZWxlbWVudHNbNV0gPSBOVUxMOworCisgIGFyZ190eXBlc1swXSA9ICZmZmlfdHlwZV9zaW50OworICBhcmdfdHlwZXNbMV0gPSAmc190eXBlOworICBhcmdfdHlwZXNbMl0gPSAmbF90eXBlOworICBhcmdfdHlwZXNbM10gPSAmc190eXBlOworICBhcmdfdHlwZXNbNF0gPSBOVUxMOworCisgIENIRUNLKGZmaV9wcmVwX2NpZl92YXIoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAxLCA0LCAmbF90eXBlLCBhcmdfdHlwZXMpID09IEZGSV9PSyk7CisKKyAgczEuYSA9IDU7CisgIHMxLmIgPSA2OworCisgIGwxLmEgPSAxMDsKKyAgbDEuYiA9IDExOworICBsMS5jID0gMTI7CisgIGwxLmQgPSAxMzsKKyAgbDEuZSA9IDE0OworCisgIHMyLmEgPSA3OworICBzMi5iID0gODsKKworICBuID0gNDE7CisKKyAgYXJnc1swXSA9ICZuOworICBhcmdzWzFdID0gJnMxOworICBhcmdzWzJdID0gJmwxOworICBhcmdzWzNdID0gJnMyOworICBhcmdzWzRdID0gTlVMTDsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4odGVzdF9mbiksICZyZXMsIGFyZ3MpOworICAvKiB7IGRnLW91dHB1dCAiNSA2IDEwIDExIDEyIDEzIDE0IDcgOCIgfSAqLworICBwcmludGYoInJlczogJWQgJWQgJWQgJWQgJWRcbiIsIHJlcy5hLCByZXMuYiwgcmVzLmMsIHJlcy5kLCByZXMuZSk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogMTUgMTcgMTkgMjEgMTQiIH0gKi8KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5zcGVjaWFsL2ZmaXRlc3RjeHguaCBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5zcGVjaWFsL2ZmaXRlc3RjeHguaAppbmRleCA4M2Y1NDQyLi5jNmRhN2VmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuc3BlY2lhbC9mZml0ZXN0Y3h4LmgKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLnNwZWNpYWwvZmZpdGVzdGN4eC5oCkBAIC01Myw0NCArNTMsMyBAQAogI2RlZmluZSBQUkl1TEwgImxsdSIKICNlbmRpZgogCi0jaWZkZWYgVVNJTkdfTU1BUAotc3RhdGljIGlubGluZSB2b2lkICoKLWFsbG9jYXRlX21tYXAgKHNpemVfdCBzaXplKQotewotICB2b2lkICpwYWdlOwotI2lmIGRlZmluZWQgKEhBVkVfTU1BUF9ERVZfWkVSTykKLSAgc3RhdGljIGludCBkZXZfemVyb19mZCA9IC0xOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX01NQVBfREVWX1pFUk8KLSAgaWYgKGRldl96ZXJvX2ZkID09IC0xKQotICAgIHsKLSAgICAgIGRldl96ZXJvX2ZkID0gb3BlbiAoIi9kZXYvemVybyIsIE9fUkRPTkxZKTsKLSAgICAgIGlmIChkZXZfemVyb19mZCA9PSAtMSkKLQl7Ci0JICBwZXJyb3IgKCJvcGVuIC9kZXYvemVybzogJW0iKTsKLQkgIGV4aXQgKDEpOwotCX0KLSAgICB9Ci0jZW5kaWYKLQotCi0jaWZkZWYgSEFWRV9NTUFQX0FOT04KLSAgcGFnZSA9IG1tYXAgKE5VTEwsIHNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUgfCBQUk9UX0VYRUMsCi0JICAgICAgIE1BUF9QUklWQVRFIHwgTUFQX0FOT05ZTU9VUywgLTEsIDApOwotI2VuZGlmCi0jaWZkZWYgSEFWRV9NTUFQX0RFVl9aRVJPCi0gIHBhZ2UgPSBtbWFwIChOVUxMLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFIHwgUFJPVF9FWEVDLAotCSAgICAgICBNQVBfUFJJVkFURSwgZGV2X3plcm9fZmQsIDApOwotI2VuZGlmCi0KLSAgaWYgKHBhZ2UgPT0gKGNoYXIgKikgTUFQX0ZBSUxFRCkKLSAgICB7Ci0gICAgICBwZXJyb3IgKCJ2aXJ0dWFsIG1lbW9yeSBleGhhdXN0ZWQiKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICByZXR1cm4gcGFnZTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuc3BlY2lhbC9zcGVjaWFsLmV4cCBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5zcGVjaWFsL3NwZWNpYWwuZXhwCmluZGV4IGUxNjdlODYuLmYxYTVmYTYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5zcGVjaWFsL3NwZWNpYWwuZXhwCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5zcGVjaWFsL3NwZWNpYWwuZXhwCkBAIC0xLDQgKzEsNCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIENvcHlyaWdodCAoQykgMjAwMywgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KIAogIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMTQsOCArMTQsNiBAQAogIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQogIyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAKLWxvYWRfbGliIGxpYmZmaS1kZy5leHAKLQogZGctaW5pdAogbGliZmZpLWluaXQKIApAQCAtMjUsMTAgKzIzLDE0IEBACiAKIHNldCBjeHhfb3B0aW9ucyAiIC1zaGFyZWQtbGliZ2NjIC1sc3RkYysrIgogCi1kZy1ydW50ZXN0IFtsc29ydCBbZ2xvYiAtbm9jb21wbGFpbiAkc3JjZGlyLyRzdWJkaXIvKi5jY11dICRjeHhfb3B0aW9ucyAiLU8wIC1XIC1XYWxsIgotZGctcnVudGVzdCBbbHNvcnQgW2dsb2IgLW5vY29tcGxhaW4gJHNyY2Rpci8kc3ViZGlyLyouY2NdXSAkY3h4X29wdGlvbnMgIi1PMiIKLWRnLXJ1bnRlc3QgW2xzb3J0IFtnbG9iIC1ub2NvbXBsYWluICRzcmNkaXIvJHN1YmRpci8qLmNjXV0gJGN4eF9vcHRpb25zICItTzMiCi1kZy1ydW50ZXN0IFtsc29ydCBbZ2xvYiAtbm9jb21wbGFpbiAkc3JjZGlyLyRzdWJkaXIvKi5jY11dICRjeHhfb3B0aW9ucyAiLU9zIgoraWYgeyBbc3RyaW5nIG1hdGNoICR1c2luZ19nY2MgInllcyJdIH0geworCisgIGRnLXJ1bnRlc3QgW2xzb3J0IFtnbG9iIC1ub2NvbXBsYWluICRzcmNkaXIvJHN1YmRpci8qLmNjXV0gJGN4eF9vcHRpb25zICItTzAgLVcgLVdhbGwiCisgIGRnLXJ1bnRlc3QgW2xzb3J0IFtnbG9iIC1ub2NvbXBsYWluICRzcmNkaXIvJHN1YmRpci8qLmNjXV0gJGN4eF9vcHRpb25zICItTzIiCisgIGRnLXJ1bnRlc3QgW2xzb3J0IFtnbG9iIC1ub2NvbXBsYWluICRzcmNkaXIvJHN1YmRpci8qLmNjXV0gJGN4eF9vcHRpb25zICItTzMiCisgIGRnLXJ1bnRlc3QgW2xzb3J0IFtnbG9iIC1ub2NvbXBsYWluICRzcmNkaXIvJHN1YmRpci8qLmNjXV0gJGN4eF9vcHRpb25zICItT3MiCisKK30KIAogZGctZmluaXNoCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5zcGVjaWFsL3Vud2luZHRlc3QuY2MgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuc3BlY2lhbC91bndpbmR0ZXN0LmNjCmluZGV4IGQ3ZmZkNGEuLmE3OGY0ZTcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5zcGVjaWFsL3Vud2luZHRlc3QuY2MKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLnNwZWNpYWwvdW53aW5kdGVzdC5jYwpAQCAtNSw2ICs1LDcgQEAKICAgIE9yaWdpbmF0b3I6CUplZmYgU3R1cm0gPGpzdHVybUBvbmUtcG9pbnQuY29tPiAgKi8KIAogLyogeyBkZy1kbyBydW4gfSAqLworCiAjaW5jbHVkZSAiZmZpdGVzdGN4eC5oIgogCiAjaWYgZGVmaW5lZCBIQVZFX1NURElOVF9ICmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuc3BlY2lhbC91bndpbmR0ZXN0X2ZmaV9jYWxsLmNjIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLnNwZWNpYWwvdW53aW5kdGVzdF9mZmlfY2FsbC5jYwppbmRleCAyOTczOWNkLi41NzE5MWYyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuc3BlY2lhbC91bndpbmR0ZXN0X2ZmaV9jYWxsLmNjCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5zcGVjaWFsL3Vud2luZHRlc3RfZmZpX2NhbGwuY2MKQEAgLTUsNiArNSw3IEBACiAgICBPcmlnaW5hdG9yOglBbmRyZWFzIFRvYmxlciA8YW5kcmVhc3RAZ2NjLmdudS5vcmc+IDIwMDYxMjEzICAqLwogCiAvKiB7IGRnLWRvIHJ1biB9ICovCisKICNpbmNsdWRlICJmZml0ZXN0Y3h4LmgiCiAKIHN0YXRpYyBpbnQgY2hlY2tpbmcoaW50IGEgX19VTlVTRURfXywgc2hvcnQgYiBfX1VOVVNFRF9fLApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXhpbmZvLnRleCBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvdGV4aW5mby50ZXgKaW5kZXggZmYyYzQwNi4uYTVhN2IyYiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS90ZXhpbmZvLnRleAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3RleGluZm8udGV4CkBAIC0xLDE4ICsxLDE4IEBACiAlIHRleGluZm8udGV4IC0tIFRlWCBtYWNyb3MgdG8gaGFuZGxlIFRleGluZm8gZmlsZXMuCi0lCislIAogJSBMb2FkIHBsYWluIGlmIG5lY2Vzc2FyeSwgaS5lLiwgaWYgcnVubmluZyB1bmRlciBpbml0ZXguCiBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBmbXRuYW1lXGVuZGNzbmFtZVxyZWxheFxpbnB1dCBwbGFpblxmaQogJQotXGRlZlx0ZXhpbmZvdmVyc2lvbnsyMDA1LTA3LTA1LjE5fQorXGRlZlx0ZXhpbmZvdmVyc2lvbnsyMDEyLTA2LTA1LjE0fQogJQotJSBDb3B5cmlnaHQgKEMpIDE5ODUsIDE5ODYsIDE5ODgsIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsCi0lIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgRnJlZSBTb2Z0d2FyZQotJSBGb3VuZGF0aW9uLCBJbmMuCislIENvcHlyaWdodCAxOTg1LCAxOTg2LCAxOTg4LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LAorJSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LAorJSAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogJQotJSBUaGlzIHRleGluZm8udGV4IGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCislIFRoaXMgdGV4aW5mby50ZXggZmlsZSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICUgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSUgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAotJSB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCislIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZQorJSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogJQogJSBUaGlzIHRleGluZm8udGV4IGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCiAlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKQEAgLTIwLDkgKzIwLDcgQEAKICUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogJQogJSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotJSBhbG9uZyB3aXRoIHRoaXMgdGV4aW5mby50ZXggZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlCi0lIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCi0lIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorJSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICUKICUgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgd2hlbiB0aGlzIGZpbGUgaXMgcmVhZCBieSBUZVggd2hlbiBwcm9jZXNzaW5nCiAlIGEgVGV4aW5mbyBzb3VyY2UgZG9jdW1lbnQsIHlvdSBtYXkgdXNlIHRoZSByZXN1bHQgd2l0aG91dApAQCAtMzAsOSArMjgsOSBAQAogJQogJSBQbGVhc2UgdHJ5IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0ZXhpbmZvLnRleCBiZWZvcmUgc3VibWl0dGluZyBidWcKICUgcmVwb3J0czsgeW91IGNhbiBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIGZyb206Ci0lICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL3RleGluZm8vICh0aGUgVGV4aW5mbyBob21lIHBhZ2UpLCBvcgotJSAgIGZ0cDovL3R1Zy5vcmcvdGV4L3RleGluZm8udGV4Ci0lICAgICAoYW5kIGFsbCBDVEFOIG1pcnJvcnMsIHNlZSBodHRwOi8vd3d3LmN0YW4ub3JnKS4KKyUgICBodHRwOi8vZnRwLmdudS5vcmcvZ251L3RleGluZm8vICh0aGUgVGV4aW5mbyByZWxlYXNlIGFyZWEpLCBvcgorJSAgIGh0dHA6Ly9mdHBtaXJyb3IuZ251Lm9yZy90ZXhpbmZvLyAoc2FtZSwgdmlhIGEgbWlycm9yKSwgb3IKKyUgICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvdGV4aW5mby8gKHRoZSBUZXhpbmZvIGhvbWUgcGFnZSkKICUgVGhlIHRleGluZm8udGV4IGluIGFueSBnaXZlbiBkaXN0cmlidXRpb24gY291bGQgd2VsbCBiZSBvdXQKICUgb2YgZGF0ZSwgc28gaWYgdGhhdCdzIHdoYXQgeW91J3JlIHVzaW5nLCBwbGVhc2UgY2hlY2suCiAlCkBAIC02Nyw3ICs2NSw2IEBACiBcZXZlcnlqb2J7XG1lc3NhZ2V7W1RleGluZm8gdmVyc2lvbiBcdGV4aW5mb3ZlcnNpb25dfSUKICAgXGNhdGNvZGVgKz1cYWN0aXZlIFxjYXRjb2RlYFxfPVxhY3RpdmV9CiAKLVxtZXNzYWdle0Jhc2ljcyx9CiBcY2hhcmRlZlxvdGhlcj0xMgogCiAlIFdlIG5ldmVyIHdhbnQgcGxhaW4ncyBcb3V0ZXIgZGVmaW5pdGlvbiBvZiBcKyBpbiBUZXhpbmZvLgpAQCAtOTUsMTAgKzkyLDEzIEBACiBcbGV0XHB0ZXhuZXd3cml0ZVxuZXd3cml0ZQogXGxldFxwdGV4bm9pbmRlbnQ9XG5vaW5kZW50CiBcbGV0XHB0ZXhwbHVzPSsKK1xsZXRccHRleHJhZ2dlZHJpZ2h0PVxyYWdnZWRyaWdodAogXGxldFxwdGV4cmJyYWNlPVx9CiBcbGV0XHB0ZXhzbGFzaD1cLwogXGxldFxwdGV4c3Rhcj1cKgogXGxldFxwdGV4dD1cdAorXGxldFxwdGV4dG9wPVx0b3AKK3tcY2F0Y29kZWBcJz1cYWN0aXZlIFxnbG9iYWxcbGV0XHB0ZXhxdW90ZXJpZ2h0J30lIGFjdGl2ZSBpbiBwbGFpbidzIG1hdGggbW9kZQogCiAlIElmIHRoaXMgY2hhcmFjdGVyIGFwcGVhcnMgaW4gYW4gZXJyb3IgbWVzc2FnZSBvciBoZWxwIHN0cmluZywgaXQKICUgc3RhcnRzIGEgbmV3IGxpbmUgaW4gdGhlIG91dHB1dC4KQEAgLTExNiwxMCArMTE2LDExIEBACiAlIFNldCB1cCBmaXhlZCB3b3JkcyBmb3IgRW5nbGlzaCBpZiBub3QgYWxyZWFkeSBzZXQuCiBcaWZ4XHB1dHdvcmRBcHBlbmRpeFx1bmRlZmluZWQgIFxnZGVmXHB1dHdvcmRBcHBlbmRpeHtBcHBlbmRpeH1cZmkKIFxpZnhccHV0d29yZENoYXB0ZXJcdW5kZWZpbmVkICAgXGdkZWZccHV0d29yZENoYXB0ZXJ7Q2hhcHRlcn1cZmkKK1xpZnhccHV0d29yZGVycm9yXHVuZGVmaW5lZCAgICAgXGdkZWZccHV0d29yZGVycm9ye2Vycm9yfVxmaQogXGlmeFxwdXR3b3JkZmlsZVx1bmRlZmluZWQgICAgICBcZ2RlZlxwdXR3b3JkZmlsZXtmaWxlfVxmaQogXGlmeFxwdXR3b3JkaW5cdW5kZWZpbmVkICAgICAgICBcZ2RlZlxwdXR3b3JkaW57aW59XGZpCi1caWZ4XHB1dHdvcmRJbmRleElzRW1wdHlcdW5kZWZpbmVkICAgICBcZ2RlZlxwdXR3b3JkSW5kZXhJc0VtcHR5eyhJbmRleCBpcyBlbXB0eSl9XGZpCi1caWZ4XHB1dHdvcmRJbmRleE5vbmV4aXN0ZW50XHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkSW5kZXhOb25leGlzdGVudHsoSW5kZXggaXMgbm9uZXhpc3RlbnQpfVxmaQorXGlmeFxwdXR3b3JkSW5kZXhJc0VtcHR5XHVuZGVmaW5lZCAgICAgICBcZ2RlZlxwdXR3b3JkSW5kZXhJc0VtcHR5eyhJbmRleCBpcyBlbXB0eSl9XGZpCitcaWZ4XHB1dHdvcmRJbmRleE5vbmV4aXN0ZW50XHVuZGVmaW5lZCAgIFxnZGVmXHB1dHdvcmRJbmRleE5vbmV4aXN0ZW50eyhJbmRleCBpcyBub25leGlzdGVudCl9XGZpCiBcaWZ4XHB1dHdvcmRJbmZvXHVuZGVmaW5lZCAgICAgIFxnZGVmXHB1dHdvcmRJbmZve0luZm99XGZpCiBcaWZ4XHB1dHdvcmRJbnN0YW5jZVZhcmlhYmxlb2ZcdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRJbnN0YW5jZVZhcmlhYmxlb2Z7SW5zdGFuY2UgVmFyaWFibGUgb2Z9XGZpCiBcaWZ4XHB1dHdvcmRNZXRob2Rvblx1bmRlZmluZWQgIFxnZGVmXHB1dHdvcmRNZXRob2RvbntNZXRob2Qgb259XGZpCkBAIC0xNTMsMjggKzE1NCwyNSBAQAogXGlmeFxwdXR3b3JkRGVmb3B0XHVuZGVmaW5lZCAgICBcZ2RlZlxwdXR3b3JkRGVmb3B0e1VzZXIgT3B0aW9ufVxmaQogXGlmeFxwdXR3b3JkRGVmZnVuY1x1bmRlZmluZWQgICBcZ2RlZlxwdXR3b3JkRGVmZnVuY3tGdW5jdGlvbn1cZmkKIAotJSBJbiBzb21lIG1hY3Jvcywgd2UgY2Fubm90IHVzZSB0aGUgYFw/IG5vdGF0aW9uLS0tdGhlIGxlZnQgcXVvdGUgaXMKLSUgaW4gc29tZSBjYXNlcyB0aGUgZXNjYXBlIGNoYXIuCi1cY2hhcmRlZlxiYWNrQ2hhciAgPSBgXFwKKyUgU2luY2UgdGhlIGNhdGVnb3J5IG9mIHNwYWNlIGlzIG5vdCBrbm93biwgd2UgaGF2ZSB0byBiZSBjYXJlZnVsLgorXGNoYXJkZWZcc3BhY2VjYXQgPSAxMAorXGRlZlxzcGFjZWlzc3BhY2V7XGNhdGNvZGVgXCA9XHNwYWNlY2F0fQorCislIHNvbWV0aW1lcyBjaGFyYWN0ZXJzIGFyZSBhY3RpdmUsIHNvIHdlIG5lZWQgY29udHJvbCBzZXF1ZW5jZXMuCitcY2hhcmRlZlxhbXBDaGFyICAgPSBgXCYKIFxjaGFyZGVmXGNvbG9uQ2hhciA9IGBcOgogXGNoYXJkZWZcY29tbWFDaGFyID0gYFwsCitcY2hhcmRlZlxkYXNoQ2hhciAgPSBgXC0KIFxjaGFyZGVmXGRvdENoYXIgICA9IGBcLgogXGNoYXJkZWZcZXhjbGFtQ2hhcj0gYFwhCi1cY2hhcmRlZlxwbHVzQ2hhciAgPSBgXCsKK1xjaGFyZGVmXGhhc2hDaGFyICA9IGBcIworXGNoYXJkZWZcbHF1b3RlQ2hhcj0gYFxgCiBcY2hhcmRlZlxxdWVzdENoYXIgPSBgXD8KK1xjaGFyZGVmXHJxdW90ZUNoYXI9IGBcJwogXGNoYXJkZWZcc2VtaUNoYXIgID0gYFw7CitcY2hhcmRlZlxzbGFzaENoYXIgPSBgXC8KIFxjaGFyZGVmXHVuZGVyQ2hhciA9IGBcXwogCi1cY2hhcmRlZlxzcGFjZUNoYXIgPSBgXCAlCi1cY2hhcmRlZlxzcGFjZWNhdCA9IDEwCi1cZGVmXHNwYWNlaXNzcGFjZXtcY2F0Y29kZVxzcGFjZUNoYXI9XHNwYWNlY2F0fQotCi17JSBmb3IgaGVscCB3aXRoIGRlYnVnZ2luZy4KLSAlIGV4YW1wbGUgdXNhZ2U6IFxleHBhbmRhZnRlclxzaG93XGFjdGl2ZWJhY2tzbGFzaAotIFxjYXRjb2RlYFwhID0gMCBcY2F0Y29kZWBcXCA9IFxhY3RpdmUKLSAhZ2xvYmFsIWRlZiFhY3RpdmViYWNrc2xhc2h7XH0KLX0KLQogJSBJZ25vcmUgYSB0b2tlbi4KICUKIFxkZWZcZ29iYmxlIzF7fQpAQCAtMjAzLDM2ICsyMDEsNyBAQAogJSB0aGF0IG1hcmsgb3ZlcmZ1bGwgYm94ZXMgKGluIGNhc2UgeW91IGhhdmUgZGVjaWRlZAogJSB0aGF0IHRoZSB0ZXh0IGxvb2tzIG9rIGV2ZW4gdGhvdWdoIGl0IHBhc3NlcyB0aGUgbWFyZ2luKS4KICUKLVxkZWZcZmluYWxvdXR7XG92ZXJmdWxscnVsZT0wcHR9Ci0KLSUgQHwgaW5zZXJ0cyBhIGNoYW5nZWJhciB0byB0aGUgbGVmdCBvZiB0aGUgY3VycmVudCBsaW5lLiAgSXQgc2hvdWxkCi0lIHN1cnJvdW5kIGFueSBjaGFuZ2VkIHRleHQuICBUaGlzIGFwcHJvYWNoIGRvZXMgKm5vdCogd29yayBpZiB0aGUKLSUgY2hhbmdlIHNwYW5zIG1vcmUgdGhhbiB0d28gbGluZXMgb2Ygb3V0cHV0LiAgVG8gaGFuZGxlIHRoYXQsIHdlIHdvdWxkCi0lIGhhdmUgYWRvcHQgYSBtdWNoIG1vcmUgZGlmZmljdWx0IGFwcHJvYWNoIChwdXR0aW5nIG1hcmtzIGludG8gdGhlIG1haW4KLSUgdmVydGljYWwgbGlzdCBmb3IgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGVhY2ggY2hhbmdlKS4KLSUKLVxkZWZcfHslCi0gICUgXHZhZGp1c3QgY2FuIG9ubHkgYmUgdXNlZCBpbiBob3Jpem9udGFsIG1vZGUuCi0gIFxsZWF2ZXZtb2RlCi0gICUKLSAgJSBBcHBlbmQgdGhpcyB2ZXJ0aWNhbCBtb2RlIG1hdGVyaWFsIGFmdGVyIHRoZSBjdXJyZW50IGxpbmUgaW4gdGhlIG91dHB1dC4KLSAgXHZhZGp1c3R7JQotICAgICUgV2Ugd2FudCB0byBpbnNlcnQgYSBydWxlIHdpdGggdGhlIGhlaWdodCBhbmQgZGVwdGggb2YgdGhlIGN1cnJlbnQKLSAgICAlIGxlYWRpbmc7IHRoYXQgaXMgZXhhY3RseSB3aGF0IFxzdHJ1dGJveCBpcyBzdXBwb3NlZCB0byByZWNvcmQuCi0gICAgXHZza2lwLVxiYXNlbGluZXNraXAKLSAgICAlCi0gICAgJSBcdmFkanVzdC1pdGVtcyBhcmUgaW5zZXJ0ZWQgYXQgdGhlIGxlZnQgZWRnZSBvZiB0aGUgdHlwZS4gIFNvCi0gICAgJSB0aGUgXGxsYXAgaGVyZSBtb3ZlcyBvdXQgaW50byB0aGUgbGVmdC1oYW5kIG1hcmdpbi4KLSAgICBcbGxhcHslCi0gICAgICAlCi0gICAgICAlIEZvciBhIHRoaWNrZXIgb3IgdGhpbm5lciBiYXIsIGNoYW5nZSB0aGUgYDFwdCcuCi0gICAgICBcdnJ1bGUgaGVpZ2h0XGJhc2VsaW5lc2tpcCB3aWR0aDFwdAotICAgICAgJQotICAgICAgJSBUaGlzIGlzIHRoZSBzcGFjZSBiZXR3ZWVuIHRoZSBiYXIgYW5kIHRoZSB0ZXh0LgotICAgICAgXGhza2lwIDEycHQKLSAgICB9JQotICB9JQotfQorXGRlZlxmaW5hbG91dHtcb3ZlcmZ1bGxydWxlPTBwdCB9CiAKICUgU29tZXRpbWVzIGl0IGlzIGNvbnZlbmllbnQgdG8gaGF2ZSBldmVyeXRoaW5nIGluIHRoZSB0cmFuc2NyaXB0IGZpbGUKICUgYW5kIG5vdGhpbmcgb24gdGhlIHRlcm1pbmFsLiAgV2UgZG9uJ3QganVzdCBjYWxsIFx0cmFjaW5nYWxsIGhlcmUsCkBAIC0yNTAsNyArMjE5LDcgQEAKICAgXHRyYWNpbmdtYWNyb3MyCiAgIFx0cmFjaW5ncmVzdG9yZXMxCiAgIFxzaG93Ym94YnJlYWR0aFxtYXhkaW1lbiBcc2hvd2JveGRlcHRoXG1heGRpbWVuCi0gIFxpZnhcZVRlWHZlcnNpb25cdW5kZWZpbmVkXGVsc2UgJSBldGV4IGdpdmVzIHVzIG1vcmUgbG9nZ2luZworICBcaWZ4XGVUZVh2ZXJzaW9uXHRoaXNpc3VuZGVmaW5lZFxlbHNlICUgZXRleCBnaXZlcyB1cyBtb3JlIGxvZ2dpbmcKICAgICBcdHJhY2luZ3NjYW50b2tlbnMxCiAgICAgXHRyYWNpbmdpZnMxCiAgICAgXHRyYWNpbmdncm91cHMxCkBAIC0yNjEsNiArMjMwLDEzIEBACiAgIFxlcnJvcmNvbnRleHRsaW5lczE2CiB9JQogCislIEBlcnJvcm1zZ3tNU0d9LiAgRG8gdGhlIGluZGV4LWxpa2UgZXhwYW5zaW9ucyBvbiBNU0csIGJ1dCBpZiB0aGluZ3MKKyUgYXJlbid0IHBlcmZlY3QsIGl0J3Mgbm90IHRoZSBlbmQgb2YgdGhlIHdvcmxkLCBiZWluZyBhbiBlcnJvciBtZXNzYWdlLAorJSBhZnRlciBhbGwuCislIAorXGRlZlxlcnJvcm1zZ3tcYmVnaW5ncm91cCBcaW5kZXhub2ZvbnRzIFxkb2Vycm9ybXNnfQorXGRlZlxkb2Vycm9ybXNnIzF7XGVycm1lc3NhZ2V7IzF9fQorCiAlIGFkZCBjaGVjayBmb3IgXGxhc3RwZW5hbHR5IHRvIHBsYWluJ3MgZGVmaW5pdGlvbnMuICBJZiB0aGUgbGFzdCB0aGluZwogJSB3ZSBkaWQgd2FzIGEgXG5vYnJlYWssIHdlIGRvbid0IHdhbnQgdG8gaW5zZXJ0IG1vcmUgc3BhY2UuCiAlCkBAIC0yNzEsNyArMjQ3LDYgQEAKIFxkZWZcYmlnYnJlYWt7XGlmbnVtXGxhc3RwZW5hbHR5PDEwMDAwXHBhclxpZmRpbVxsYXN0c2tpcDxcYmlnc2tpcGFtb3VudAogICBccmVtb3ZlbGFzdHNraXBccGVuYWx0eS0yMDBcYmlnc2tpcFxmaVxmaX0KIAotJSBGb3IgQGNyb3BtYXJrcyBjb21tYW5kLgogJSBEbyBAY3JvcG1hcmtzIHRvIGdldCBjcm9wIG1hcmtzLgogJQogXG5ld2lmXGlmY3JvcG1hcmtzCkBAIC0yODUsNiArMjYwLDUwIEBACiBcbmV3ZGltZW5cY29ybmVydGhpY2sgXGNvcm5lcnRoaWNrPS4zcHQKIFxuZXdkaW1lblx0b3BhbmRib3R0b21tYXJnaW4gXHRvcGFuZGJvdHRvbW1hcmdpbj0uNzVpbgogCislIE91dHB1dCBhIG1hcmsgd2hpY2ggc2V0cyBcdGhpc2NoYXB0ZXIsIFx0aGlzc2VjdGlvbiBhbmQgXHRoaXNjb2xvci4KKyUgV2UgZHVtcCBldmVyeXRoaW5nIHRvZ2V0aGVyIGJlY2F1c2Ugd2Ugb25seSBoYXZlIG9uZSBraW5kIG9mIG1hcmsuCislIFRoaXMgd29ya3MgYmVjYXVzZSB3ZSBvbmx5IHVzZSBcYm90bWFyayAvIFx0b3BtYXJrLCBub3QgXGZpcnN0bWFyay4KKyUKKyUgQSBtYXJrIGNvbnRhaW5zIGEgc3ViZXhwcmVzc2lvbiBvZiB0aGUgXGlmY2FzZSAuLi4gXGZpIGNvbnN0cnVjdC4KKyUgXGdldCptYXJrcyBtYWNyb3MgYmVsb3cgZXh0cmFjdCB0aGUgbmVlZGVkIHBhcnQgdXNpbmcgXGlmY2FzZS4KKyUKKyUgQW5vdGhlciBjb21wbGljYXRpb24gaXMgdG8gbGV0IHRoZSB1c2VyIGNob29zZSB3aGV0aGVyIFx0aGlzY2hhcHRlcgorJSAoXHRoaXNzZWN0aW9uKSByZWZlcnMgdG8gdGhlIGNoYXB0ZXIgKHNlY3Rpb24pIGluIGVmZmVjdCBhdCB0aGUgdG9wCislIG9mIGEgcGFnZSwgb3IgdGhhdCBhdCB0aGUgYm90dG9tIG9mIGEgcGFnZS4gIFRoZSBzb2x1dGlvbiBpcworJSBkZXNjcmliZWQgb24gcGFnZSAyNjAgb2YgVGhlIFRlWGJvb2suICBJdCBpbnZvbHZlcyBvdXRwdXR0aW5nIHR3bworJSBtYXJrcyBmb3IgdGhlIHNlY3Rpb25pbmcgbWFjcm9zLCBvbmUgYmVmb3JlIHRoZSBzZWN0aW9uIGJyZWFrLCBhbmQKKyUgb25lIGFmdGVyLiAgSSB3b24ndCBwcmV0ZW5kIEkgY2FuIGRlc2NyaWJlIHRoaXMgYmV0dGVyIHRoYW4gREVLLi4uCitcZGVmXGRvbWFya3slCisgIFx0b2tzMD1cZXhwYW5kYWZ0ZXJ7XGxhc3RjaGFwdGVyZGVmc30lCisgIFx0b2tzMj1cZXhwYW5kYWZ0ZXJ7XGxhc3RzZWN0aW9uZGVmc30lCisgIFx0b2tzND1cZXhwYW5kYWZ0ZXJ7XHByZXZjaGFwdGVyZGVmc30lCisgIFx0b2tzNj1cZXhwYW5kYWZ0ZXJ7XHByZXZzZWN0aW9uZGVmc30lCisgIFx0b2tzOD1cZXhwYW5kYWZ0ZXJ7XGxhc3Rjb2xvcmRlZnN9JQorICBcbWFya3slCisgICAgICAgICAgICAgICAgICAgXHRoZVx0b2tzMCBcdGhlXHRva3MyCisgICAgICBcbm9leHBhbmRcb3IgXHRoZVx0b2tzNCBcdGhlXHRva3M2CisgICAgXG5vZXhwYW5kXGVsc2UgXHRoZVx0b2tzOAorICB9JQorfQorJSBcdG9wbWFyayBkb2Vzbid0IHdvcmsgZm9yIHRoZSB2ZXJ5IGZpcnN0IGNoYXB0ZXIgKGFmdGVyIHRoZSB0aXRsZQorJSBwYWdlIG9yIHRoZSBjb250ZW50cyksIHNvIHdlIHVzZSBcZmlyc3RtYXJrIHRoZXJlIC0tIHRoaXMgZ2V0cyB1cworJSB0aGUgbWFyayB3aXRoIHRoZSBjaGFwdGVyIGRlZnMsIHVubGVzcyB0aGUgdXNlciBzbmVha3MgaW4sIGUuZy4sCislIEBzZXRjb2xvciAob3IgQHVybCwgb3IgQGxpbmssIGV0Yy4pIGJldHdlZW4gQGNvbnRlbnRzIGFuZCB0aGUgdmVyeQorJSBmaXJzdCBAY2hhcHRlci4KK1xkZWZcZ2V0dG9waGVhZGluZ21hcmtzeyUKKyAgXGlmY2FzZTBcdG9wbWFya1xmaQorICBcaWZ4XHRoaXNjaGFwdGVyXGVtcHR5IFxpZmNhc2UwXGZpcnN0bWFya1xmaSBcZmkKK30KK1xkZWZcZ2V0Ym90dG9taGVhZGluZ21hcmtze1xpZmNhc2UxXGJvdG1hcmtcZml9CitcZGVmXGdldGNvbG9ybWFya3N7XGlmY2FzZTJcdG9wbWFya1xmaX0KKworJSBBdm9pZCAidW5kZWZpbmVkIGNvbnRyb2wgc2VxdWVuY2UiIGVycm9ycy4KK1xkZWZcbGFzdGNoYXB0ZXJkZWZze30KK1xkZWZcbGFzdHNlY3Rpb25kZWZze30KK1xkZWZccHJldmNoYXB0ZXJkZWZze30KK1xkZWZccHJldnNlY3Rpb25kZWZze30KK1xkZWZcbGFzdGNvbG9yZGVmc3t9CisKICUgTWFpbiBvdXRwdXQgcm91dGluZS4KIFxjaGFyZGVmXFBBR0UgPSAyNTUKIFxvdXRwdXQgPSB7XG9uZXBhZ2VvdXR7XHBhZ2Vjb250ZW50c1xQQUdFfX0KQEAgLTMwMiw3ICszMjEsOSBAQAogICAlCiAgICUgRG8gdGhpcyBvdXRzaWRlIG9mIHRoZSBcc2hpcG91dCBzbyBAY29kZSBldGMuIHdpbGwgYmUgZXhwYW5kZWQgaW4KICAgJSB0aGUgaGVhZGxpbmUgYXMgdGhleSBzaG91bGQgYmUsIG5vdCB0YWtlbiBsaXRlcmFsbHkgKG91dHB1dHRpbmcgJydjb2RlKS4KKyAgXGlmb2RkXHBhZ2VubyBcZ2V0b2RkaGVhZGluZ21hcmtzIFxlbHNlIFxnZXRldmVuaGVhZGluZ21hcmtzIFxmaQogICBcc2V0Ym94XGhlYWRsaW5lYm94ID0gXHZib3h7XGxldFxoc2l6ZT1ccGFnZXdpZHRoIFxtYWtlaGVhZGxpbmV9JQorICBcaWZvZGRccGFnZW5vIFxnZXRvZGRmb290aW5nbWFya3MgXGVsc2UgXGdldGV2ZW5mb290aW5nbWFya3MgXGZpCiAgIFxzZXRib3hcZm9vdGxpbmVib3ggPSBcdmJveHtcbGV0XGhzaXplPVxwYWdld2lkdGggXG1ha2Vmb290bGluZX0lCiAgICUKICAgeyUKQEAgLTMxMSw2ICszMzIsMTMgQEAKICAgICAlIGJlZm9yZSB0aGUgXHNoaXBvdXQgcnVucy4KICAgICAlCiAgICAgXGluZGV4ZHVtbWllcyAgICAgICAgICUgZG9uJ3QgZXhwYW5kIGNvbW1hbmRzIGluIHRoZSBvdXRwdXQuCisgICAgXG5vcm1hbHR1cm5vZmZhY3RpdmUgICUgXCBpbiBpbmRleCBlbnRyaWVzIG11c3Qgbm90IHN0YXkgXCwgZS5nLiwgaWYKKyAgICAgICAgICAgICAgICUgdGhlIHBhZ2UgYnJlYWsgaGFwcGVucyB0byBiZSBpbiB0aGUgbWlkZGxlIG9mIGFuIGV4YW1wbGUuCisgICAgICAgICAgICAgICAlIFdlIGRvbid0IHdhbnQgLnZyIChvciB3aGF0ZXZlcikgZW50cmllcyBsaWtlIHRoaXM6CisgICAgICAgICAgICAgICAlIFxlbnRyeXt7XHR0IFxpbmRleGJhY2tzbGFzaCB9YWNyb255bX17MzJ9e1xjb2RlIHtcYWNyb255bX19CisgICAgICAgICAgICAgICAlICJcYWNyb255bSIgd29uJ3Qgd29yayB3aGVuIGl0J3MgcmVhZCBiYWNrIGluOworICAgICAgICAgICAgICAgJSBpdCBuZWVkcyB0byBiZQorICAgICAgICAgICAgICAgJSB7XGNvZGUge3tcdHQgXGJhY2tzbGFzaGN1cmZvbnQgfWFjcm9ueW19CiAgICAgXHNoaXBvdXRcdmJveHslCiAgICAgICAlIERvIHRoaXMgZWFybHkgc28gcGRmIHJlZmVyZW5jZXMgZ28gdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFnZS4KICAgICAgIFxpZnBkZm1ha2VwYWdlZGVzdCBccGRmZGVzdCBuYW1le1x0aGVccGFnZW5vfSB4eXpcZmkKQEAgLTMzOCw5ICszNjYsOSBAQAogICAgICAgXHBhZ2Vib2R5eyMxfSUKICAgICAgIFxpZmRpbVxodFxmb290bGluZWJveCA+IDBwdAogICAgICAgICAlIE9ubHkgbGVhdmUgdGhpcyBzcGFjZSBpZiB0aGUgZm9vdGxpbmUgaXMgbm9uZW1wdHkuCi0gICAgICAgICUgKFdlIGxlc3NlbmVkIFx2c2l6ZSBmb3IgaXQgaW4gXG9kZGZvb3Rpbmd4eHguKQorICAgICAgICAlIChXZSBsZXNzZW5lZCBcdnNpemUgZm9yIGl0IGluIFxvZGRmb290aW5neXl5LikKICAgICAgICAgJSBUaGUgXGJhc2VsaW5lc2tpcD0yNHB0IGluIHBsYWluJ3MgXG1ha2Vmb290bGluZSBoYXMgbm8gZWZmZWN0LgotICAgICAgICBcdnNraXAgMlxiYXNlbGluZXNraXAKKyAgICAgICAgXHZza2lwIDI0cHQKICAgICAgICAgXHVudmJveFxmb290bGluZWJveAogICAgICAgXGZpCiAgICAgICAlCkBAIC0zNzQsNyArNDAyLDcgQEAKICUgbWFyZ2luYWwgaGFja3MsIGp1aGFAdmlpc2EudXVjcCAoSnVoYSBUYWthbGEpCiBcaWZ2b2lkXG1hcmdpblxlbHNlICUgbWFyZ2luYWwgaW5mbyBpcyBwcmVzZW50CiAgIFxybGFwe1xrZXJuXGhzaXplXHZib3ggdG9cekB7XGtlcm4xcHRcYm94XG1hcmdpbiBcdnNzfX1cZmkKLVxkaW1lbkA9XGRwIzEgXHVudmJveCMxCitcZGltZW5APVxkcCMxXHJlbGF4IFx1bnZib3gjMVxyZWxheAogXGlmdm9pZFxmb290aW5zXGVsc2VcdnNraXBcc2tpcFxmb290aW5zXGZvb3Rub3RlcnVsZSBcdW52Ym94XGZvb3RpbnNcZmkKIFxpZnJAZ2dlZGJvdHRvbSBca2Vybi1cZGltZW5AIFx2ZmlsIFxmaX0KIH0KQEAgLTM5Niw3ICs0MjQsNyBAQAogJQogXGRlZlxwYXJzZWFyZ3tccGFyc2Vhcmd1c2luZ3t9fQogXGRlZlxwYXJzZWFyZ3VzaW5nIzEjMnslCi0gIFxkZWZcbmV4dHsjMn0lCisgIFxkZWZcYXJndG9ydW57IzJ9JQogICBcYmVnaW5ncm91cAogICAgIFxvYmV5bGluZXMKICAgICBcc3BhY2Vpc3NwYWNlCkBAIC00MTUsNyArNDQzLDcgQEAKIFxkZWZcYXJncmVtb3ZlY29tbWVudCMxXGNvbW1lbnQjMlxBcmdUZXJte1xhcmdyZW1vdmVjICMxXGNcQXJnVGVybX0KIFxkZWZcYXJncmVtb3ZlYyMxXGMjMlxBcmdUZXJte1xhcmdjaGVja3NwYWNlcyMxXF5eTVxBcmdUZXJtfQogCi0lIEVhY2ggb2NjdXJlbmNlIG9mIGBcXl5NJyBvciBgPHNwYWNlPlxeXk0nIGlzIHJlcGxhY2VkIGJ5IGEgc2luZ2xlIHNwYWNlLgorJSBFYWNoIG9jY3VycmVuY2Ugb2YgYFxeXk0nIG9yIGA8c3BhY2U+XF5eTScgaXMgcmVwbGFjZWQgYnkgYSBzaW5nbGUgc3BhY2UuCiAlCiAlIFxhcmdyZW1vdmVjIG1pZ2h0IGxlYXZlIHVzIHdpdGggdHJhaWxpbmcgc3BhY2UsIGUuZy4sCiAlICAgIEBlbmQgaXRlbWl6ZSAgQGMgZm9vCkBAIC00MjcsOCArNDU1LDcgQEAKIFxkZWZcYXJnY2hlY2tzcGFjZXNZIzFcXl5NIzJcXl5NIzNcQXJnVGVybXslCiAgIFxkZWZcdGVtcHsjM30lCiAgIFxpZnhcdGVtcFxlbXB0eQotICAgICUgV2UgY2Fubm90IHVzZSBcbmV4dCBoZXJlLCBhcyBpdCBob2xkcyB0aGUgbWFjcm8gdG8gcnVuOwotICAgICUgdGh1cyB3ZSByZXVzZSBcdGVtcC4KKyAgICAlIERvIG5vdCB1c2UgXG5leHQsIHBlcmhhcHMgdGhlIGNhbGxlciBvZiBccGFyc2VhcmcgdXNlcyBpdDsgcmV1c2UgXHRlbXA6CiAgICAgXGxldFx0ZW1wXGZpbmlzaHBhcnNlYXJnCiAgIFxlbHNlCiAgICAgXGxldFx0ZW1wXGFyZ2NoZWNrc3BhY2VzCkBAIC00NDAsMTQgKzQ2NywxNCBAQAogJSBJZiBhIF9kZWxpbWl0ZWRfIGFyZ3VtZW50IGlzIGVuY2xvc2VkIGluIGJyYWNlcywgdGhleSBnZXQgc3RyaXBwZWQ7IHNvCiAlIHRvIGdldCBfZXhhY3RseV8gdGhlIHJlc3Qgb2YgdGhlIGxpbmUsIHdlIGhhZCB0byBwcmV2ZW50IHN1Y2ggc2l0dWF0aW9uLgogJSBXZSBwcmVwZW5kZWQgYW4gXGVtcHR5IHRva2VuIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBhbmQgd2UgZXhwYW5kIGl0IG5vdywKLSUganVzdCBiZWZvcmUgcGFzc2luZyB0aGUgY29udHJvbCB0byBcbmV4dC4KLSUgKFNpbWlsYXJpbHksIHdlIGhhdmUgdG8gdGhpbmsgYWJvdXQgIzMgb2YgXGFyZ2NoZWNrc3BhY2VzWSBhYm92ZTogaXQgaXMKKyUganVzdCBiZWZvcmUgcGFzc2luZyB0aGUgY29udHJvbCB0byBcYXJndG9ydW4uCislIChTaW1pbGFybHksIHdlIGhhdmUgdG8gdGhpbmsgYWJvdXQgIzMgb2YgXGFyZ2NoZWNrc3BhY2VzWSBhYm92ZTogaXQgaXMKICUgZWl0aGVyIHRoZSBudWxsIHN0cmluZywgb3IgaXQgZW5kcyB3aXRoIFxeXk0tLS10aHVzIHRoZXJlIGlzIG5vIGRhbmdlcgogJSB0aGF0IGEgcGFpciBvZiBicmFjZXMgd291bGQgYmUgc3RyaXBwZWQuCiAlCiAlIEJ1dCBmaXJzdCwgd2UgaGF2ZSB0byByZW1vdmUgdGhlIHRyYWlsaW5nIHNwYWNlIHRva2VuLgogJQotXGRlZlxmaW5pc2hwYXJzZWFyZyMxIFxBcmdUZXJte1xleHBhbmRhZnRlclxuZXh0XGV4cGFuZGFmdGVyeyMxfX0KK1xkZWZcZmluaXNocGFyc2VhcmcjMSBcQXJnVGVybXtcZXhwYW5kYWZ0ZXJcYXJndG9ydW5cZXhwYW5kYWZ0ZXJ7IzF9fQogCiAlIFxwYXJzZWFyZ2RlZlxmb297Li4ufQogJQlpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8KQEAgLTQ5OCwxMiArNTI1LDEyIEBACiAlIHVzZWQgdG8gY2hlY2sgd2hldGhlciB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBpcyB0aGUgb25lIGV4cGVjdGVkLgogJQogJSBOb24tZmFsc2UgY29uZGl0aW9uYWxzIChAaWZ0ZXgsIEBpZnNldCkgZG9uJ3QgZml0IGludG8gdGhpcywgc28gdGhleQotJSBhcmUgbm90IHRyZWF0ZWQgYXMgZW52aXJvbWVudHM7IHRoZXkgZG9uJ3Qgb3BlbiBhIGdyb3VwLiAgKFRoZQorJSBhcmUgbm90IHRyZWF0ZWQgYXMgZW52aXJvbm1lbnRzOyB0aGV5IGRvbid0IG9wZW4gYSBncm91cC4gIChUaGUKICUgaW1wbGVtZW50YXRpb24gb2YgQGVuZCB0YWtlcyBjYXJlIG5vdCB0byBjYWxsIFxlbmRncm91cCBpbiB0aGlzCiAlIHNwZWNpYWwgY2FzZS4pCiAKIAotJSBBdCBydW50aW1lLCBlbnZpcm9ubWVudHMgc3RhcnQgd2l0aCB0aGlzOgorJSBBdCBydW4tdGltZSwgZW52aXJvbm1lbnRzIHN0YXJ0IHdpdGggdGhpczoKIFxkZWZcc3RhcnRlbnZpcm9ubWVudCMxe1xiZWdpbmdyb3VwXGRlZlx0aGlzZW52eyMxfX0KICUgaW5pdGlhbGl6ZQogXGxldFx0aGlzZW52XGVtcHR5CkBAIC01MjEsNyArNTQ4LDcgQEAKICAgXGZpCiB9CiAKLSUgRXZpcm9ubWVudCBtaXNtYXRjaCwgIzEgZXhwZWN0ZWQ6CislIEVudmlyb25tZW50IG1pc21hdGNoLCAjMSBleHBlY3RlZDoKIFxkZWZcYmFkZW52ZXJyeyUKICAgXGVycmhlbHAgPSBcRU1zaW1wbGUKICAgXGVycm1lc3NhZ2V7VGhpcyBjb21tYW5kIGNhbiBhcHBlYXIgb25seSBcaW5lbnZpcm9ubWVudFx0ZW1wLApAQCAtNTI5LDcgKzU1Niw3IEBACiB9CiBcZGVmXGluZW52aXJvbm1lbnQjMXslCiAgIFxpZngjMVxlbXB0eQotICAgIG91dCBvZiBhbnkgZW52aXJvbm1lbnQlCisgICAgb3V0c2lkZSBvZiBhbnkgZW52aXJvbm1lbnQlCiAgIFxlbHNlCiAgICAgaW4gZW52aXJvbm1lbnQgXGV4cGFuZGFmdGVyXHN0cmluZyMxJQogICBcZmkKQEAgLTU0MSw3ICs1NjgsNyBAQAogXHBhcnNlYXJnZGVmXGVuZHslCiAgIFxpZiAxXGNzbmFtZSBpc2NvbmQuIzFcZW5kY3NuYW1lCiAgIFxlbHNlCi0gICAgJSBUaGUgZ2VuZXJhbCB3b3JkaW5nIG9mIFxiYWRlbnZlcnIgbWF5IG5vdCBiZSBpZGVhbCwgYnV0Li4uIC0ta2FzYWwsIDA2bm92MDMKKyAgICAlIFRoZSBnZW5lcmFsIHdvcmRpbmcgb2YgXGJhZGVudmVyciBtYXkgbm90IGJlIGlkZWFsLgogICAgIFxleHBhbmRhZnRlclxjaGVja2Vudlxjc25hbWUjMVxlbmRjc25hbWUKICAgICBcY3NuYW1lIEUjMVxlbmRjc25hbWUKICAgICBcZW5kZ3JvdXAKQEAgLTU1MSw4NSArNTc4LDYgQEAKIFxuZXdoZWxwXEVNc2ltcGxle1ByZXNzIFJFVFVSTiB0byBjb250aW51ZS59CiAKIAotJSUgU2ltcGxlIHNpbmdsZS1jaGFyYWN0ZXIgQCBjb21tYW5kcwotCi0lIEBAIHByaW50cyBhbiBACi0lIEtsdWRnZSB0aGlzIHVudGlsIHRoZSBmb250cyBhcmUgcmlnaHQgKGdycikuCi1cZGVmXEB7e1x0dFxjaGFyNjR9fQotCi0lIFRoaXMgaXMgdHVybmVkIG9mZiBiZWNhdXNlIGl0IHdhcyBuZXZlciBkb2N1bWVudGVkCi0lIGFuZCB5b3UgY2FuIHVzZSBAd3suLi59IGFyb3VuZCBhIHF1b3RlIHRvIHN1cHByZXNzIGxpZ2F0dXJlcy4KLSUlIERlZmluZSBAYCBhbmQgQCcgdG8gYmUgdGhlIHNhbWUgYXMgYCBhbmQgJwotJSUgYnV0IHN1cHByZXNzaW5nIGxpZ2F0dXJlcy4KLSVcZGVmXGB7e2B9fQotJVxkZWZcJ3t7J319Ci0KLSUgVXNlZCB0byBnZW5lcmF0ZSBxdW90ZWQgYnJhY2VzLgotXGRlZlxteWxicmFjZSB7e1x0dFxjaGFyMTIzfX0KLVxkZWZcbXlyYnJhY2Uge3tcdHRcY2hhcjEyNX19Ci1cbGV0XHs9XG15bGJyYWNlCi1cbGV0XH09XG15cmJyYWNlCi1cYmVnaW5ncm91cAotICAlIERlZmluaXRpb25zIHRvIHByb2R1Y2UgXHsgYW5kIFx9IGNvbW1hbmRzIGZvciBpbmRpY2VzLAotICAlIGFuZCBAeyBhbmQgQH0gZm9yIHRoZSBhdXgvdG9jIGZpbGVzLgotICBcY2F0Y29kZWBceyA9IFxvdGhlciBcY2F0Y29kZWBcfSA9IFxvdGhlcgotICBcY2F0Y29kZWBcWyA9IDEgXGNhdGNvZGVgXF0gPSAyCi0gIFxjYXRjb2RlYFwhID0gMCBcY2F0Y29kZWBcXCA9IFxvdGhlcgotICAhZ2RlZiFsYnJhY2VjbWRbXHtdJQotICAhZ2RlZiFyYnJhY2VjbWRbXH1dJQotICAhZ2RlZiFsYnJhY2VhdGNtZFtAe10lCi0gICFnZGVmIXJicmFjZWF0Y21kW0B9XSUKLSFlbmRncm91cAotCi0lIEBjb21tYXt9IHRvIGF2b2lkICwgcGFyc2luZyBwcm9ibGVtcy4KLVxsZXRcY29tbWEgPSAsCi0KLSUgQWNjZW50czogQCwgQGRvdGFjY2VudCBAcmluZ2FjY2VudCBAdWJhcmFjY2VudCBAdWRvdGFjY2VudAotJSBPdGhlcnMgYXJlIGRlZmluZWQgYnkgcGxhaW4gVGVYOiBAYCBAJyBAIiBAXiBAfiBAPSBAdSBAdiBASC4KLVxsZXRcLCA9IFxjCi1cbGV0XGRvdGFjY2VudCA9IFwuCi1cZGVmXHJpbmdhY2NlbnQjMXt7XGFjY2VudDIzICMxfX0KLVxsZXRcdGllYWNjZW50ID0gXHQKLVxsZXRcdWJhcmFjY2VudCA9IFxiCi1cbGV0XHVkb3RhY2NlbnQgPSBcZAotCi0lIE90aGVyIHNwZWNpYWwgY2hhcmFjdGVyczogQHF1ZXN0aW9uZG93biBAZXhjbGFtZG93biBAb3JkZiBAb3JkbQotJSBQbGFpbiBUZVggZGVmaW5lczogQEFBIEBBRSBATyBAT0UgQEwgKHBsdXMgbG93ZXJjYXNlIHZlcnNpb25zKSBAc3MuCi1cZGVmXHF1ZXN0aW9uZG93bns/YH0KLVxkZWZcZXhjbGFtZG93bnshYH0KLVxkZWZcb3JkZntcbGVhdmV2bW9kZVxyYWlzZTFleFxoYm94e1xzZWxlY3Rmb250c1xsbGxzaXplIFx1bmRlcmJhcnthfX19Ci1cZGVmXG9yZG17XGxlYXZldm1vZGVccmFpc2UxZXhcaGJveHtcc2VsZWN0Zm9udHNcbGxsc2l6ZSBcdW5kZXJiYXJ7b319fQotCi0lIERvdGxlc3MgaSBhbmQgZG90bGVzcyBqLCB1c2VkIGZvciBhY2NlbnRzLgotXGRlZlxpbWFjcm97aX0KLVxkZWZcam1hY3Jve2p9Ci1cZGVmXGRvdGxlc3MjMXslCi0gIFxkZWZcdGVtcHsjMX0lCi0gIFxpZnhcdGVtcFxpbWFjcm8gXHB0ZXhpCi0gIFxlbHNlXGlmeFx0ZW1wXGptYWNybyBcagotICBcZWxzZSBcZXJybWVzc2FnZXtAZG90bGVzcyBjYW4gYmUgdXNlZCBvbmx5IHdpdGggaSBvciBqfSUKLSAgXGZpXGZpCi19Ci0KLSUgVGhlIFxUZVh7fSBsb2dvLCBhcyBpbiBwbGFpbiwgYnV0IHJlc2V0dGluZyB0aGUgc3BhY2luZyBzbyB0aGF0IGEKLSUgcGVyaW9kIGZvbGxvd2luZyBjb3VudHMgYXMgZW5kaW5nIGEgc2VudGVuY2UuICAoSWRlYSBmb3VuZCBpbiBsYXRleC4pCi0lCi1cZWRlZlxUZVh7XFRlWCBcc3BhY2VmYWN0b3I9MTAwMCB9Ci0KLSUgQExhVGVYe30gbG9nby4gIE5vdCBxdWl0ZSB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSBkZWZpbml0aW9uIGluCi0lIGxhdGV4Lmx0eCwgc2luY2Ugd2UgdXNlIGEgZGlmZmVyZW50IGZvbnQgZm9yIHRoZSByYWlzZWQgQTsgaXQncyBtb3N0Ci0lIGNvbnZlbmllbnQgZm9yIHVzIHRvIHVzZSBhbiBleHBsaWNpdGx5IHNtYWxsZXIgZm9udCwgcmF0aGVyIHRoYW4gdXNpbmcKLSUgdGhlIFxzY3JpcHRzdHlsZSBmb250IChzaW5jZSB3ZSBkb24ndCByZXNldCBcc2NyaXB0c3R5bGUgYW5kCi0lIFxzY3JpcHRzY3JpcHRzdHlsZSkuCi0lCi1cZGVmXExhVGVYeyUKLSAgTFxrZXJuLS4zNmVtCi0gIHtcc2V0Ym94MD1caGJveHtUfSUKLSAgIFx2Ym94IHRvIFxodDB7XGhib3h7XHNlbGVjdGZvbnRzXGxsbHNpemUgQX1cdnNzfX0lCi0gIFxrZXJuLS4xNWVtCi0gIFxUZVgKLX0KLQogJSBCZSBzdXJlIHdlJ3JlIGluIGhvcml6b250YWwgbW9kZSB3aGVuIGRvaW5nIGEgdGllLCBzaW5jZSB3ZSBtYWtlIHNwYWNlCiAlIGVxdWl2YWxlbnQgdG8gdGhpcyBpbiBAZXhhbXBsZS1saWtlIGVudmlyb25tZW50cy4gT3RoZXJ3aXNlLCBhIHNwYWNlCiAlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIHdpbGwgc3RhcnQgd2l0aCBccGVuYWx0eSAtLSBhbmQKQEAgLTY2MSw3ICs2MDksNyBAQAogXGRlZlw/ez9cc3BhY2VmYWN0b3I9XGVuZG9mc2VudGVuY2VzcGFjZWZhY3RvclxzcGFjZX0KIAogJSBAZnJlbmNoc3BhY2luZyBvbnxvZmYgIHNheXMgd2hldGhlciB0byBwdXQgZXh0cmEgc3BhY2UgYWZ0ZXIgcHVuY3R1YXRpb24uCi0lIAorJQogXGRlZlxvbndvcmR7b259CiBcZGVmXG9mZndvcmR7b2ZmfQogJQpAQCAtNjcxLDcgKzYxOSw3IEBACiAgIFxlbHNlXGlmeFx0ZW1wXG9mZndvcmQgXHBsYWlubm9uZnJlbmNoc3BhY2luZwogICBcZWxzZQogICAgIFxlcnJoZWxwID0gXEVNc2ltcGxlCi0gICAgXGVycm1lc3NhZ2V7VW5rbm93biBAZnJlbmNoc3BhY2luZyBvcHRpb24gYFx0ZW1wJywgbXVzdCBiZSBvbi9vZmZ9JQorICAgIFxlcnJtZXNzYWdle1Vua25vd24gQGZyZW5jaHNwYWNpbmcgb3B0aW9uIGBcdGVtcCcsIG11c3QgYmUgb258b2ZmfSUKICAgXGZpXGZpCiB9CiAKQEAgLTc1MywxNSArNzAxLDYgQEAKIAogXG5ld2RpbWVuXG1pbCAgXG1pbD0wLjAwMWluCiAKLSUgT2xkIGRlZmluaXRpb24tLWRpZG4ndCB3b3JrLgotJVxwYXJzZWFyZ2RlZlxuZWVke1xwYXIgJQotJSUgVGhpcyBtZXRob2QgdHJpZXMgdG8gbWFrZSBUZVggYnJlYWsgdGhlIHBhZ2UgbmF0dXJhbGx5Ci0lJSBpZiB0aGUgZGVwdGggb2YgdGhlIGJveCBkb2VzIG5vdCBmaXQuCi0le1xiYXNlbGluZXNraXA9MHB0JQotJVx2dG9wIHRvICMxXG1pbHtcdmZpbH1ca2VybiAtIzFcbWlsXG5vYnJlYWsKLSVccHJldmRlcHRoPS0xMDAwcHQKLSV9fQotCiBccGFyc2VhcmdkZWZcbmVlZHslCiAgICUgRW5zdXJlIHZlcnRpY2FsIG1vZGUsIHNvIHdlIGRvbid0IG1ha2UgYSBiaWcgYm94IGluIHRoZSBtaWRkbGUgb2YgYQogICAlIHBhcmFncmFwaC4KQEAgLTgyNSw3ICs3NjQsNyBAQAogCiAlIEBpbm1hcmdpbntXSElDSH17VEVYVH0gcHV0cyBURVhUIGluIHRoZSBXSElDSCBtYXJnaW4gbmV4dCB0byB0aGUgY3VycmVudAogJSBwYXJhZ3JhcGguICBGb3IgbW9yZSBnZW5lcmFsIHB1cnBvc2VzLCB1c2UgdGhlIFxtYXJnaW4gaW5zZXJ0aW9uCi0lIGNsYXNzLiAgV0hJQ0ggaXMgYGwnIG9yIGByJy4KKyUgY2xhc3MuICBXSElDSCBpcyBgbCcgb3IgYHInLiAgTm90IGRvY3VtZW50ZWQsIHdyaXR0ZW4gZm9yIGdhd2sgbWFudWFsLgogJQogXG5ld3NraXBcaW5tYXJnaW5zcGFjaW5nIFxpbm1hcmdpbnNwYWNpbmc9MWNtCiBcZGVmXHN0cnV0ZGVwdGh7XGRwXHN0cnV0Ym94fQpAQCAtODcyLDE1ICs4MTEsNTEgQEAKICAgXHRlbXAKIH0KIAotJSBAaW5jbHVkZSBmaWxlICAgIGluc2VydCB0ZXh0IG9mIHRoYXQgZmlsZSBhcyBpbnB1dC4KKyUgQHwgaW5zZXJ0cyBhIGNoYW5nZWJhciB0byB0aGUgbGVmdCBvZiB0aGUgY3VycmVudCBsaW5lLiAgSXQgc2hvdWxkCislIHN1cnJvdW5kIGFueSBjaGFuZ2VkIHRleHQuICBUaGlzIGFwcHJvYWNoIGRvZXMgKm5vdCogd29yayBpZiB0aGUKKyUgY2hhbmdlIHNwYW5zIG1vcmUgdGhhbiB0d28gbGluZXMgb2Ygb3V0cHV0LiAgVG8gaGFuZGxlIHRoYXQsIHdlIHdvdWxkCislIGhhdmUgYWRvcHQgYSBtdWNoIG1vcmUgZGlmZmljdWx0IGFwcHJvYWNoIChwdXR0aW5nIG1hcmtzIGludG8gdGhlIG1haW4KKyUgdmVydGljYWwgbGlzdCBmb3IgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGVhY2ggY2hhbmdlKS4gIFRoaXMgY29tbWFuZAorJSBpcyBub3QgZG9jdW1lbnRlZCwgbm90IHN1cHBvcnRlZCwgYW5kIGRvZXNuJ3Qgd29yay4KKyUKK1xkZWZcfHslCisgICUgXHZhZGp1c3QgY2FuIG9ubHkgYmUgdXNlZCBpbiBob3Jpem9udGFsIG1vZGUuCisgIFxsZWF2ZXZtb2RlCisgICUKKyAgJSBBcHBlbmQgdGhpcyB2ZXJ0aWNhbCBtb2RlIG1hdGVyaWFsIGFmdGVyIHRoZSBjdXJyZW50IGxpbmUgaW4gdGhlIG91dHB1dC4KKyAgXHZhZGp1c3R7JQorICAgICUgV2Ugd2FudCB0byBpbnNlcnQgYSBydWxlIHdpdGggdGhlIGhlaWdodCBhbmQgZGVwdGggb2YgdGhlIGN1cnJlbnQKKyAgICAlIGxlYWRpbmc7IHRoYXQgaXMgZXhhY3RseSB3aGF0IFxzdHJ1dGJveCBpcyBzdXBwb3NlZCB0byByZWNvcmQuCisgICAgXHZza2lwLVxiYXNlbGluZXNraXAKKyAgICAlCisgICAgJSBcdmFkanVzdC1pdGVtcyBhcmUgaW5zZXJ0ZWQgYXQgdGhlIGxlZnQgZWRnZSBvZiB0aGUgdHlwZS4gIFNvCisgICAgJSB0aGUgXGxsYXAgaGVyZSBtb3ZlcyBvdXQgaW50byB0aGUgbGVmdC1oYW5kIG1hcmdpbi4KKyAgICBcbGxhcHslCisgICAgICAlCisgICAgICAlIEZvciBhIHRoaWNrZXIgb3IgdGhpbm5lciBiYXIsIGNoYW5nZSB0aGUgYDFwdCcuCisgICAgICBcdnJ1bGUgaGVpZ2h0XGJhc2VsaW5lc2tpcCB3aWR0aDFwdAorICAgICAgJQorICAgICAgJSBUaGlzIGlzIHRoZSBzcGFjZSBiZXR3ZWVuIHRoZSBiYXIgYW5kIHRoZSB0ZXh0LgorICAgICAgXGhza2lwIDEycHQKKyAgICB9JQorICB9JQorfQorCislIEBpbmNsdWRlIEZJTEUgLS0gXGlucHV0IHRleHQgb2YgRklMRS4KICUKIFxkZWZcaW5jbHVkZXtccGFyc2Vhcmd1c2luZ1xmaWxlbmFtZWNhdGNvZGVzXGluY2x1ZGV6enp9CiBcZGVmXGluY2x1ZGV6enojMXslCiAgIFxwdXNodGhpc2ZpbGVzdGFjawogICBcZGVmXHRoaXNmaWxleyMxfSUKICAgeyUKLSAgICBcbWFrZXZhbHVlZXhwYW5kYWJsZQotICAgIFxkZWZcdGVtcHtcaW5wdXQgIzEgfSUKKyAgICBcbWFrZXZhbHVlZXhwYW5kYWJsZSAgJSB3ZSB3YW50IHRvIGV4cGFuZCBhbnkgQHZhbHVlIGluIEZJTEUuCisgICAgXHR1cm5vZmZhY3RpdmUgICAgICAgICUgYW5kIGFsbG93IHNwZWNpYWwgY2hhcmFjdGVycyBpbiB0aGUgZXhwYW5zaW9uCisgICAgXGluZGV4bm9mb250cyAgICAgICAgICUgQWxsb3cgYEBAJyBhbmQgb3RoZXIgd2VpcmQgdGhpbmdzIGluIGZpbGUgbmFtZXMuCisgICAgXHdsb2d7dGV4aW5mby50ZXg6IGRvaW5nIEBpbmNsdWRlIG9mICMxXl5KfSUKKyAgICBcZWRlZlx0ZW1we1xub2V4cGFuZFxpbnB1dCAjMSB9JQorICAgICUKKyAgICAlIFRoaXMgdHJpY2tlcnkgaXMgdG8gcmVhZCBGSUxFIG91dHNpZGUgb2YgYSBncm91cCwgaW4gY2FzZSBpdCBtYWtlcworICAgICUgZGVmaW5pdGlvbnMsIGV0Yy4KICAgICBcZXhwYW5kYWZ0ZXIKICAgfVx0ZW1wCiAgIFxwb3B0aGlzZmlsZXN0YWNrCkBAIC04OTUsNiArODcwLDggQEAKICAgXGNhdGNvZGVgPj1cb3RoZXIKICAgXGNhdGNvZGVgKz1cb3RoZXIKICAgXGNhdGNvZGVgLT1cb3RoZXIKKyAgXGNhdGNvZGVgXGA9XG90aGVyCisgIFxjYXRjb2RlYFwnPVxvdGhlcgogfQogCiBcZGVmXHB1c2h0aGlzZmlsZXN0YWNreyUKQEAgLTkxMCw3ICs4ODcsNyBAQAogXGRlZlxwb3B0aGlzZmlsZXN0YWNre1xlcnJ0aGlzZmlsZXN0YWNrZW1wdHl9CiBcZGVmXGVycnRoaXNmaWxlc3RhY2tlbXB0eXtcZXJybWVzc2FnZXtJbnRlcm5hbCBlcnJvcjoKICAgdGhlIHN0YWNrIG9mIGZpbGVuYW1lcyBpcyBlbXB0eS59fQotCislCiBcZGVmXHRoaXNmaWxle30KIAogJSBAY2VudGVyIGxpbmUKQEAgLTkxOCwzNiArODk1LDQ2IEBACiAlCiBccGFyc2VhcmdkZWZcY2VudGVyeyUKICAgXGlmaG1vZGUKLSAgICBcbGV0XG5leHRcY2VudGVySAorICAgIFxsZXRcY2VudGVyc3ViXGNlbnRlckgKICAgXGVsc2UKLSAgICBcbGV0XG5leHRcY2VudGVyVgorICAgIFxsZXRcY2VudGVyc3ViXGNlbnRlclYKICAgXGZpCi0gIFxuZXh0e1xoZmlsIFxpZ25vcmVzcGFjZXMjMVx1bnNraXAgXGhmaWx9JQorICBcY2VudGVyc3Vie1xoZmlsIFxpZ25vcmVzcGFjZXMjMVx1bnNraXAgXGhmaWx9JQorICBcbGV0XGNlbnRlcnN1YlxyZWxheCAlIGRvbid0IGxldCB0aGUgZGVmaW5pdGlvbiBwZXJzaXN0LCBqdXN0IGluIGNhc2UKIH0KLVxkZWZcY2VudGVySCMxeyUKLSAgeyUKLSAgICBcaGZpbFxicmVhawotICAgIFxhZHZhbmNlXGhzaXplIGJ5IC1cbGVmdHNraXAKLSAgICBcYWR2YW5jZVxoc2l6ZSBieSAtXHJpZ2h0c2tpcAotICAgIFxsaW5leyMxfSUKLSAgICBcYnJlYWsKLSAgfSUKK1xkZWZcY2VudGVySCMxe3slCisgIFxoZmlsXGJyZWFrCisgIFxhZHZhbmNlXGhzaXplIGJ5IC1cbGVmdHNraXAKKyAgXGFkdmFuY2VcaHNpemUgYnkgLVxyaWdodHNraXAKKyAgXGxpbmV7IzF9JQorICBcYnJlYWsKK319CislCitcbmV3Y291bnRcY2VudGVycGVuYWx0eQorXGRlZlxjZW50ZXJWIzF7JQorICAlIFRoZSBpZGVhIGhlcmUgaXMgdGhlIHNhbWUgYXMgaW4gXHN0YXJ0ZGVmdW4sIFxjYXJ0b3VjaGUsIGV0Yy46IGlmCisgICUgQGNlbnRlciBpcyB0aGUgZmlyc3QgdGhpbmcgYWZ0ZXIgYSBzZWN0aW9uIGhlYWRpbmcsIHdlIG5lZWQgdG8gd2lwZQorICAlIG91dCB0aGUgbmVnYXRpdmUgcGFyc2tpcCBpbnNlcnRlZCBieSBcc2VjdGlvbmhlYWRpbmcsIGJ1dCBzdGlsbAorICAlIHByZXZlbnQgYSBwYWdlIGJyZWFrIGhlcmUuCisgIFxjZW50ZXJwZW5hbHR5ID0gXGxhc3RwZW5hbHR5CisgIFxpZm51bVxjZW50ZXJwZW5hbHR5PjEwMDAwIFx2c2tpcFxwYXJza2lwIFxmaQorICBcaWZudW1cY2VudGVycGVuYWx0eT45OTk5IFxwZW5hbHR5XGNlbnRlcnBlbmFsdHkgXGZpCisgIFxsaW5le1xrZXJuXGxlZnRza2lwICMxXGtlcm5ccmlnaHRza2lwfSUKIH0KLVxkZWZcY2VudGVyViMxe1xsaW5le1xrZXJuXGxlZnRza2lwICMxXGtlcm5ccmlnaHRza2lwfX0KIAogJSBAc3AgbiAgIG91dHB1dHMgbiBsaW5lcyBvZiB2ZXJ0aWNhbCBzcGFjZQotCislCiBccGFyc2VhcmdkZWZcc3B7XHZza2lwICMxXGJhc2VsaW5lc2tpcH0KIAogJSBAY29tbWVudCAuLi5saW5lIHdoaWNoIGlzIGlnbm9yZWQuLi4KICUgQGMgaXMgdGhlIHNhbWUgYXMgQGNvbW1lbnQKICUgQGlnbm9yZSAuLi4gQGVuZCBpZ25vcmUgIGlzIGFub3RoZXIgd2F5IHRvIHdyaXRlIGEgY29tbWVudAotCislCiBcZGVmXGNvbW1lbnR7XGJlZ2luZ3JvdXAgXGNhdGNvZGVgXF5eTT1cb3RoZXIlCiBcY2F0Y29kZWBcQD1cb3RoZXIgXGNhdGNvZGVgXHs9XG90aGVyIFxjYXRjb2RlYFx9PVxvdGhlciUKIFxjb21tZW50eHh4fQoge1xjYXRjb2RlYFxeXk09XG90aGVyIFxnZGVmXGNvbW1lbnR4eHgjMV5eTXtcZW5kZ3JvdXB9fQotCislCiBcbGV0XGM9XGNvbW1lbnQKIAogJSBAcGFyYWdyYXBoaW5kZW50IE5DSEFSUwpAQCAtMTA0MCw4NiArMTAyNyw2IEBACiB9CiAKIAotJSBAYXNpcyBqdXN0IHlpZWxkcyBpdHMgYXJndW1lbnQuICBVc2VkIHdpdGggQHRhYmxlLCBmb3IgZXhhbXBsZS4KLSUKLVxkZWZcYXNpcyMxeyMxfQotCi0lIEBtYXRoIG91dHB1dHMgaXRzIGFyZ3VtZW50IGluIG1hdGggbW9kZS4KLSUKLSUgT25lIGNvbXBsaWNhdGlvbjogXyB1c3VhbGx5IG1lYW5zIHN1YnNjcmlwdHMsIGJ1dCBpdCBjb3VsZCBhbHNvIG1lYW4KLSUgYW4gYWN0dWFsIF8gY2hhcmFjdGVyLCBhcyBpbiBAbWF0aHtAdmFye3NvbWVfdmFyaWFibGV9ICsgMX0uICBTbyBtYWtlCi0lIF8gYWN0aXZlLCBhbmQgZGlzdGluZ3Vpc2ggYnkgc2VlaW5nIGlmIHRoZSBjdXJyZW50IGZhbWlseSBpcyBcc2xmYW0sCi0lIHdoaWNoIGlzIHdoYXQgQHZhciB1c2VzLgotewotICBcY2F0Y29kZVx1bmRlckNoYXIgPSBcYWN0aXZlCi0gIFxnZGVmXG1hdGh1bmRlcnNjb3JleyUKLSAgICBcY2F0Y29kZVx1bmRlckNoYXI9XGFjdGl2ZQotICAgIFxkZWZfe1xpZm51bVxmYW09XHNsZmFtIFxfXGVsc2Vcc2JcZml9JQotICB9Ci19Ci0lIEFub3RoZXIgY29tcGxpY2F0aW9uOiB3ZSB3YW50IFxcIChhbmQgQFwpIHRvIG91dHB1dCBhIFwgY2hhcmFjdGVyLgotJSBGWUksIHBsYWluLnRleCB1c2VzIFxcIGFzIGEgdGVtcG9yYXJ5IGNvbnRyb2wgc2VxdWVuY2UgKHdoeT8pLCBidXQKLSUgdGhpcyBpcyBub3QgYWR2ZXJ0aXNlZCBhbmQgd2UgZG9uJ3QgY2FyZS4gIFRleGluZm8gZG9lcyBub3QKLSUgb3RoZXJ3aXNlIGRlZmluZSBAXC4KLSUKLSUgVGhlIFxtYXRoY2hhciBpcyBjbGFzcz0wPW9yZGluYXJ5LCBmYW1pbHk9Nz10dGZhbSwgcG9zaXRpb249NUM9XC4KLVxkZWZcbWF0aGJhY2tzbGFzaHtcaWZudW1cZmFtPVx0dGZhbSBcbWF0aGNoYXIiMDc1QyBcZWxzZVxiYWNrc2xhc2ggXGZpfQotJQotXGRlZlxtYXRoeyUKLSAgXHRleAotICBcbWF0aHVuZGVyc2NvcmUKLSAgXGxldFxcID0gXG1hdGhiYWNrc2xhc2gKLSAgXG1hdGhhY3RpdmUKLSAgJFxmaW5pc2htYXRoCi19Ci1cZGVmXGZpbmlzaG1hdGgjMXsjMSRcZW5kZ3JvdXB9ICAlIENsb3NlIHRoZSBncm91cCBvcGVuZWQgYnkgXHRleC4KLQotJSBTb21lIGFjdGl2ZSBjaGFyYWN0ZXJzIChzdWNoIGFzIDwpIGFyZSBzcGFjZWQgZGlmZmVyZW50bHkgaW4gbWF0aC4KLSUgV2UgaGF2ZSB0byByZXNldCB0aGVpciBkZWZpbml0aW9ucyBpbiBjYXNlIHRoZSBAbWF0aCB3YXMgYW4gYXJndW1lbnQKLSUgdG8gYSBjb21tYW5kIHdoaWNoIHNldHMgdGhlIGNhdGNvZGVzIChzdWNoIGFzIEBpdGVtIG9yIEBzZWN0aW9uKS4KLSUKLXsKLSAgXGNhdGNvZGVgXiA9IFxhY3RpdmUKLSAgXGNhdGNvZGVgPCA9IFxhY3RpdmUKLSAgXGNhdGNvZGVgPiA9IFxhY3RpdmUKLSAgXGNhdGNvZGVgKyA9IFxhY3RpdmUKLSAgXGdkZWZcbWF0aGFjdGl2ZXslCi0gICAgXGxldF4gPSBccHRleGhhdAotICAgIFxsZXQ8ID0gXHB0ZXhsZXNzCi0gICAgXGxldD4gPSBccHRleGd0cgotICAgIFxsZXQrID0gXHB0ZXhwbHVzCi0gIH0KLX0KLQotJSBAYnVsbGV0IGFuZCBAbWludXMgbmVlZCB0aGUgc2FtZSB0cmVhdG1lbnQgYXMgQG1hdGgsIGp1c3QgYWJvdmUuCi1cZGVmXGJ1bGxldHskXHB0ZXhidWxsZXQkfQotXGRlZlxtaW51c3skLSR9Ci0KLSUgQGRvdHN7fSBvdXRwdXRzIGFuIGVsbGlwc2lzIHVzaW5nIHRoZSBjdXJyZW50IGZvbnQuCi0lIFdlIGRvIC41ZW0gcGVyIHBlcmlvZCBzbyB0aGF0IGl0IGhhcyB0aGUgc2FtZSBzcGFjaW5nIGluIGEgdHlwZXdyaXRlcgotJSBmb250IGFzIHRocmVlIGFjdHVhbCBwZXJpb2QgY2hhcmFjdGVycy4KLSUKLVxkZWZcZG90c3slCi0gIFxsZWF2ZXZtb2RlCi0gIFxoYm94IHRvIDEuNWVteyUKLSAgICBcaHNraXAgMHB0IHBsdXMgMC4yNWZpbAotICAgIC5caGZpbC5caGZpbC4lCi0gICAgXGhza2lwIDBwdCBwbHVzIDAuNWZpbAotICB9JQotfQotCi0lIEBlbmRkb3Rze30gaXMgYW4gZW5kLW9mLXNlbnRlbmNlIGVsbGlwc2lzLgotJQotXGRlZlxlbmRkb3RzeyUKLSAgXGRvdHMKLSAgXHNwYWNlZmFjdG9yPVxlbmRvZnNlbnRlbmNlc3BhY2VmYWN0b3IKLX0KLQotJSBAY29tbWF7fSBpcyBzbyBjb21tYXMgY2FuIGJlIGluc2VydGVkIGludG8gdGV4dCB3aXRob3V0IG1lc3NpbmcgdXAKLSUgVGV4aW5mbydzIHBhcnNpbmcuCi0lCi1cbGV0XGNvbW1hID0gLAotCiAlIEByZWZpbGwgaXMgYSBuby1vcC4KIFxsZXRccmVmaWxsPVxyZWxheAogCkBAIC0xMTg0LDkgKzEwOTEsOCBAQAogXG5ld2lmXGlmcGRmbWFrZXBhZ2VkZXN0CiAKICUgd2hlbiBwZGZ0ZXggaXMgcnVuIGluIGR2aSBtb2RlLCBccGRmb3V0cHV0IGlzIGRlZmluZWQgKHNvIFxwZGZvdXRwdXQ9MQotJSBjYW4gYmUgc2V0KS4gIFNvIHdlIHRlc3QgZm9yIFxyZWxheCBhbmQgMCBhcyB3ZWxsIGFzIFx1bmRlZmluZWQsCi0lIGJvcnJvd2VkIGZyb20gaWZwZGYuc3R5LgotXGlmeFxwZGZvdXRwdXRcdW5kZWZpbmVkCislIGNhbiBiZSBzZXQpLiAgU28gd2UgdGVzdCBmb3IgXHJlbGF4IGFuZCAwIGFzIHdlbGwgYXMgYmVpbmcgdW5kZWZpbmVkLgorXGlmeFxwZGZvdXRwdXRcdGhpc2lzdW5kZWZpbmVkCiBcZWxzZQogICBcaWZ4XHBkZm91dHB1dFxyZWxheAogICBcZWxzZQpAQCAtMTE5Nyw5OSArMTEwMywxNTYgQEAKICAgXGZpCiBcZmkKIAotJSBQREYgdXNlcyBQb3N0U2NyaXB0IHN0cmluZyBjb25zdGFudHMgZm9yIHRoZSBuYW1lcyBvZiB4cmVmIHRhcmdldHMsIHRvCislIFBERiB1c2VzIFBvc3RTY3JpcHQgc3RyaW5nIGNvbnN0YW50cyBmb3IgdGhlIG5hbWVzIG9mIHhyZWYgdGFyZ2V0cywKICUgZm9yIGRpc3BsYXkgaW4gdGhlIG91dGxpbmVzLCBhbmQgaW4gb3RoZXIgcGxhY2VzLiAgVGh1cywgd2UgaGF2ZSB0bwogJSBkb3VibGUgYW55IGJhY2tzbGFzaGVzLiAgT3RoZXJ3aXNlLCBhIG5hbWUgbGlrZSAiXG5vZGUiIHdpbGwgYmUKICUgaW50ZXJwcmV0ZWQgYXMgYSBuZXdsaW5lIChcbiksIGZvbGxvd2VkIGJ5IG8sIGQsIGUuICBOb3QgZ29vZC4KLSUgaHR0cDovL3d3dy5udGcubmwvcGlwZXJtYWlsL250Zy1wZGZ0ZXgvMjAwNC1KdWx5LzAwMDY1NC5odG1sCi0lIChhbmQgcmVsYXRlZCBtZXNzYWdlcywgdGhlIGZpbmFsIG91dGNvbWUgaXMgdGhhdCBpdCBpcyB1cCB0byB0aGUgVGVYCi0lIHVzZXIgdG8gZG91YmxlIHRoZSBiYWNrc2xhc2hlcyBhbmQgb3RoZXJ3aXNlIG1ha2UgdGhlIHN0cmluZyB2YWxpZCwgc28KLSUgdGhhdCdzIHdlIGRvKS4KLQotJSBkb3VibGUgYWN0aXZlIGJhY2tzbGFzaGVzLgogJSAKLXtcY2F0Y29kZWBcQD0wIFxjYXRjb2RlYFxcPVxhY3RpdmUKLSBAZ2RlZkBhY3RpdmViYWNrc2xhc2h7QGNhdGNvZGVgQFw9QGFjdGl2ZSBAb3RoZXJiYWNrc2xhc2h9Ci0gQGdkZWZAYWN0aXZlYmFja3NsYXNoZG91YmxleyUKLSAgIEBjYXRjb2RlQGJhY2tDaGFyPUBhY3RpdmUKLSAgIEBsZXRcPUBkb3VibGViYWNrc2xhc2h9CislIFNlZSBodHRwOi8vd3d3Lm50Zy5ubC9waXBlcm1haWwvbnRnLXBkZnRleC8yMDA0LUp1bHkvMDAwNjU0Lmh0bWwgYW5kCislIHJlbGF0ZWQgbWVzc2FnZXMuICBUaGUgZmluYWwgb3V0Y29tZSBpcyB0aGF0IGl0IGlzIHVwIHRvIHRoZSBUZVggdXNlcgorJSB0byBkb3VibGUgdGhlIGJhY2tzbGFzaGVzIGFuZCBvdGhlcndpc2UgbWFrZSB0aGUgc3RyaW5nIHZhbGlkLCBzbworJSB0aGF0J3Mgd2hhdCB3ZSBkby4gIHBkZnRleCAxLjMwLjAgKGNhLjIwMDUpIGludHJvZHVjZWQgYSBwcmltaXRpdmUgdG8KKyUgZG8gdGhpcyByZWxpYWJseSwgc28gd2UgdXNlIGl0LgorCislICMxIGlzIGEgY29udHJvbCBzZXF1ZW5jZSBpbiB3aGljaCB0byBkbyB0aGUgcmVwbGFjZW1lbnRzLAorJSB3aGljaCB3ZSBceGRlZi4KK1xkZWZcdHhpZXNjYXBlcGRmIzF7JQorICBcaWZ4XHBkZmVzY2FwZXN0cmluZ1x0aGlzaXN1bmRlZmluZWQKKyAgICAlIE5vIHByaW1pdGl2ZSBhdmFpbGFibGU7IHNob3VsZCB3ZSBnaXZlIGEgd2FybmluZyBvciBsb2c/CisgICAgJSBNYW55IHRpbWVzIGl0IHdvbid0IG1hdHRlci4KKyAgXGVsc2UKKyAgICAlIFRoZSBleHBhbmRhYmxlIFxwZGZlc2NhcGVzdHJpbmcgcHJpbWl0aXZlIGVzY2FwZXMgcGFyZW50aGVzZXMsCisgICAgJSBiYWNrc2xhc2hlcywgYW5kIG90aGVyIHNwZWNpYWwgY2hhcnMuCisgICAgXHhkZWYjMXtccGRmZXNjYXBlc3RyaW5neyMxfX0lCisgIFxmaQogfQogCi0lIFRvIGhhbmRsZSBwYXJlbnMsIHdlIG11c3QgYWRvcHQgYSBkaWZmZXJlbnQgYXBwcm9hY2gsIHNpbmNlIHBhcmVucyBhcmUKLSUgbm90IGFjdGl2ZSBjaGFyYWN0ZXJzLiAgaHlwZXJyZWYuZHR4ICh3aGljaCBoYXMgdGhlIHNhbWUgcHJvYmxlbSBhcwotJSB1cykgaGFuZGxlcyBpdCB3aXRoIHRoaXMgYW1hemluZyBtYWNybyB0byByZXBsYWNlIHRva2Vucy4gIEkndmUKLSUgdGlua2VyZWQgd2l0aCBpdCBhIGxpdHRsZSBmb3IgdGV4aW5mbywgYnV0IGl0J3MgZGVmaW5pdGVseSBmcm9tIHRoZXJlLgotJSAKLSUgIzEgaXMgdGhlIHRva2VucyB0byByZXBsYWNlLgotJSAjMiBpcyB0aGUgcmVwbGFjZW1lbnQuCi0lICMzIGlzIHRoZSBjb250cm9sIHNlcXVlbmNlIHdpdGggdGhlIHN0cmluZy4KLSUgCi1cZGVmXEh5UHNkU3Vic3QjMSMyIzN7JQotICBcZGVmXEh5UHNkUmVwbGFjZSMjMSMxIyMyXEVORHslCi0gICAgIyMxJQotICAgIFxpZnhcXCMjMlxcJQotICAgIFxlbHNlCi0gICAgICAjMiUKLSAgICAgIFxIeVJldHVybkFmdGVyRml7JQotICAgICAgICBcSHlQc2RSZXBsYWNlIyMyXEVORAotICAgICAgfSUKLSAgICBcZmkKLSAgfSUKLSAgXHhkZWYjM3tcZXhwYW5kYWZ0ZXJcSHlQc2RSZXBsYWNlIzMjMVxFTkR9JQotfQotXGxvbmdcZGVmXEh5UmV0dXJuQWZ0ZXJGaSMxXGZpe1xmaSMxfQotCi0lICMxIGlzIGEgY29udHJvbCBzZXF1ZW5jZSBpbiB3aGljaCB0byBkbyB0aGUgcmVwbGFjZW1lbnRzLgotXGRlZlxiYWNrc2xhc2hwYXJlbnMjMXslCi0gIFx4ZGVmIzF7IzF9JSByZWRlZmluZSBpdCBhcyBpdHMgZXhwYW5zaW9uOyB0aGUgZGVmaW5pdGlvbiBpcyBzaW1wbHkKLSAgICAgICAgICAgICAlIFxsYXN0bm9kZSB3aGVuIGNhbGxlZCBmcm9tIFxzZXRyZWYgLT4gXHBkZm1rZGVzdC4KLSAgXEh5UHNkU3Vic3R7KH17XGJhY2tzbGFzaGxwYXJlbn17IzF9JQotICBcSHlQc2RTdWJzdHspfXtcYmFja3NsYXNocnBhcmVufXsjMX0lCi19Ci0KLXtcY2F0Y29kZVxleGNsYW1DaGFyID0gMCBcY2F0Y29kZVxiYWNrQ2hhciA9IFxvdGhlcgotICFnZGVmIWJhY2tzbGFzaGxwYXJlbntcKH0lCi0gIWdkZWYhYmFja3NsYXNocnBhcmVue1wpfSUKLX0KK1xuZXdoZWxwXG5vcGRmaW1hZ2VoZWxwe1RleGluZm8gc3VwcG9ydHMgLnBuZywgLmpwZywgLmpwZWcsIGFuZCAucGRmIGltYWdlcword2l0aCBQREYgb3V0cHV0LCBhbmQgbm9uZSBvZiB0aG9zZSBmb3JtYXRzIGNvdWxkIGJlIGZvdW5kLiAgKC5lcHMgY2Fubm90CitiZSBzdXBwb3J0ZWQgZHVlIHRvIHRoZSBkZXNpZ24gb2YgdGhlIFBERiBmb3JtYXQ7IHVzZSByZWd1bGFyIFRlWCAoRFZJCitvdXRwdXQpIGZvciB0aGF0Lil9CiAKIFxpZnBkZgotICBcaW5wdXQgcGRmY29sb3IKLSAgXHBkZmNhdGFsb2d7L1BhZ2VNb2RlIC9Vc2VPdXRsaW5lc30lCisgICUKKyAgJSBDb2xvciBtYW5pcHVsYXRpb24gbWFjcm9zIGJhc2VkIG9uIHBkZmNvbG9yLnRleCwKKyAgJSBleGNlcHQgdXNpbmcgcmdiIGluc3RlYWQgb2YgY215azsgdGhlIGxhdHRlciBpcyBzYWlkIHRvIHJlbmRlciBhcyBhCisgICUgdmVyeSBkYXJrIGdyYXkgb24tc2NyZWVuIGFuZCBhIHZlcnkgZGFyayBoYWxmdG9uZSBpbiBwcmludCwgaW5zdGVhZAorICAlIG9mIGFjdHVhbCBibGFjay4KKyAgXGRlZlxyZ2JEYXJrUmVkezAuNTAgMC4wOSAwLjEyfQorICBcZGVmXHJnYkJsYWNrezAgMCAwfQorICAlCisgICUgayBzZXRzIHRoZSBjb2xvciBmb3IgZmlsbGluZyAodXN1YWwgdGV4dCwgZXRjLik7CisgICUgSyBzZXRzIHRoZSBjb2xvciBmb3Igc3Ryb2tpbmcgKHRoaW4gcnVsZXMsIGUuZy4sIG5vcm1hbCBfJ3MpLgorICBcZGVmXHBkZnNldGNvbG9yIzF7XHBkZmxpdGVyYWx7IzEgcmcgICMxIFJHfX0KKyAgJQorICAlIFNldCBjb2xvciwgYW5kIGNyZWF0ZSBhIG1hcmsgd2hpY2ggZGVmaW5lcyBcdGhpc2NvbG9yIGFjY29yZGluZ2x5LAorICAlIHNvIHRoYXQgXG1ha2VoZWFkbGluZSBrbm93cyB3aGljaCBjb2xvciB0byByZXN0b3JlLgorICBcZGVmXHNldGNvbG9yIzF7JQorICAgIFx4ZGVmXGxhc3Rjb2xvcmRlZnN7XGdkZWZcbm9leHBhbmRcdGhpc2NvbG9yeyMxfX0lCisgICAgXGRvbWFyaworICAgIFxwZGZzZXRjb2xvcnsjMX0lCisgIH0KKyAgJQorICBcZGVmXG1haW5jb2xvcntccmdiQmxhY2t9CisgIFxwZGZzZXRjb2xvcntcbWFpbmNvbG9yfQorICBcZWRlZlx0aGlzY29sb3J7XG1haW5jb2xvcn0KKyAgXGRlZlxsYXN0Y29sb3JkZWZze30KKyAgJQorICBcZGVmXG1ha2Vmb290bGluZXslCisgICAgXGJhc2VsaW5lc2tpcDI0cHQKKyAgICBcbGluZXtccGRmc2V0Y29sb3J7XG1haW5jb2xvcn1cdGhlXGZvb3RsaW5lfSUKKyAgfQorICAlCisgIFxkZWZcbWFrZWhlYWRsaW5leyUKKyAgICBcdmJveCB0byAwcHR7JQorICAgICAgXHZza2lwLTIyLjVwdAorICAgICAgXGxpbmV7JQorICAgICAgICBcdmJveCB0bzguNXB0e30lCisgICAgICAgICUgRXh0cmFjdCBcdGhpc2NvbG9yIGRlZmluaXRpb24gZnJvbSB0aGUgbWFya3MuCisgICAgICAgIFxnZXRjb2xvcm1hcmtzCisgICAgICAgICUgVHlwZXNldCB0aGUgaGVhZGxpbmUgd2l0aCBcbWFpbmNvbG9yLCB0aGVuIHJlc3RvcmUgdGhlIGNvbG9yLgorICAgICAgICBccGRmc2V0Y29sb3J7XG1haW5jb2xvcn1cdGhlXGhlYWRsaW5lXHBkZnNldGNvbG9ye1x0aGlzY29sb3J9JQorICAgICAgfSUKKyAgICAgIFx2c3MKKyAgICB9JQorICAgIFxub2ludGVybGluZXNraXAKKyAgfQorICAlCisgICUKKyAgXHBkZmNhdGFsb2d7L1BhZ2VNb2RlIC9Vc2VPdXRsaW5lc30KKyAgJQorICAlICMxIGlzIGltYWdlIG5hbWUsICMyIHdpZHRoIChtaWdodCBiZSBlbXB0eS93aGl0ZXNwYWNlKSwgIzMgaGVpZ2h0IChkaXR0bykuCiAgIFxkZWZcZG9wZGZpbWFnZSMxIzIjM3slCi0gICAgXGRlZlxpbWFnZXdpZHRoeyMyfSUKLSAgICBcZGVmXGltYWdlaGVpZ2h0eyMzfSUKLSAgICAlIHdpdGhvdXQgXGltbWVkaWF0ZSwgcGRmdGV4IHNlZyBmYXVsdHMgd2hlbiB0aGUgc2FtZSBpbWFnZSBpcworICAgIFxkZWZccGRmaW1hZ2V3aWR0aHsjMn1cc2V0Ym94MCA9IFxoYm94e1xpZ25vcmVzcGFjZXMgIzJ9JQorICAgIFxkZWZccGRmaW1hZ2VoZWlnaHR7IzN9XHNldGJveDIgPSBcaGJveHtcaWdub3Jlc3BhY2VzICMzfSUKKyAgICAlCisgICAgJSBwZGZ0ZXggKGFuZCB0aGUgUERGIGZvcm1hdCkgc3VwcG9ydCAucGRmLCAucG5nLCAuanBnIChhbW9uZworICAgICUgb3RoZXJzKS4gIExldCdzIHRyeSBpbiB0aGF0IG9yZGVyLCBQREYgZmlyc3Qgc2luY2UgaWYKKyAgICAlIHNvbWVvbmUgaGFzIGEgc2NhbGFibGUgaW1hZ2UsIHByZXN1bWFibHkgYmV0dGVyIHRvIHVzZSB0aGF0IHRoYW4gYQorICAgICUgYml0bWFwLgorICAgIFxsZXRccGRmaW1nZXh0PVxlbXB0eQorICAgIFxiZWdpbmdyb3VwCisgICAgICBcb3BlbmluIDEgIzEucGRmIFxpZmVvZiAxCisgICAgICAgIFxvcGVuaW4gMSAjMS5QREYgXGlmZW9mIDEKKyAgICAgICAgICBcb3BlbmluIDEgIzEucG5nIFxpZmVvZiAxCisgICAgICAgICAgICBcb3BlbmluIDEgIzEuanBnIFxpZmVvZiAxCisgICAgICAgICAgICAgIFxvcGVuaW4gMSAjMS5qcGVnIFxpZmVvZiAxCisgICAgICAgICAgICAgICAgXG9wZW5pbiAxICMxLkpQRyBcaWZlb2YgMQorICAgICAgICAgICAgICAgICAgXGVycmhlbHAgPSBcbm9wZGZpbWFnZWhlbHAKKyAgICAgICAgICAgICAgICAgIFxlcnJtZXNzYWdle0NvdWxkIG5vdCBmaW5kIGltYWdlIGZpbGUgIzEgZm9yIHBkZn0lCisgICAgICAgICAgICAgICAgXGVsc2UgXGdkZWZccGRmaW1nZXh0e0pQR30lCisgICAgICAgICAgICAgICAgXGZpCisgICAgICAgICAgICAgIFxlbHNlIFxnZGVmXHBkZmltZ2V4dHtqcGVnfSUKKyAgICAgICAgICAgICAgXGZpCisgICAgICAgICAgICBcZWxzZSBcZ2RlZlxwZGZpbWdleHR7anBnfSUKKyAgICAgICAgICAgIFxmaQorICAgICAgICAgIFxlbHNlIFxnZGVmXHBkZmltZ2V4dHtwbmd9JQorICAgICAgICAgIFxmaQorICAgICAgICBcZWxzZSBcZ2RlZlxwZGZpbWdleHR7UERGfSUKKyAgICAgICAgXGZpCisgICAgICBcZWxzZSBcZ2RlZlxwZGZpbWdleHR7cGRmfSUKKyAgICAgIFxmaQorICAgICAgXGNsb3NlaW4gMQorICAgIFxlbmRncm91cAorICAgICUKKyAgICAlIHdpdGhvdXQgXGltbWVkaWF0ZSwgYW5jaWVudCBwZGZ0ZXggc2VnIGZhdWx0cyB3aGVuIHRoZSBzYW1lIGltYWdlIGlzCiAgICAgJSBpbmNsdWRlZCB0d2ljZS4gIChWZXJzaW9uIDMuMTQxNTktcHJlLTEuMC11bm9mZmljaWFsLTIwMDEwNzA0LikKICAgICBcaWZudW1ccGRmdGV4dmVyc2lvbiA8IDE0CiAgICAgICBcaW1tZWRpYXRlXHBkZmltYWdlCiAgICAgXGVsc2UKICAgICAgIFxpbW1lZGlhdGVccGRmeGltYWdlCiAgICAgXGZpCi0gICAgICBcaWZ4XGVtcHR5XGltYWdld2lkdGhcZWxzZSB3aWR0aCBcaW1hZ2V3aWR0aCBcZmkKLSAgICAgIFxpZnhcZW1wdHlcaW1hZ2VoZWlnaHRcZWxzZSBoZWlnaHQgXGltYWdlaGVpZ2h0IFxmaQorICAgICAgXGlmZGltIFx3ZDAgPjBwdCB3aWR0aCBccGRmaW1hZ2V3aWR0aCBcZmkKKyAgICAgIFxpZmRpbSBcd2QyID4wcHQgaGVpZ2h0IFxwZGZpbWFnZWhlaWdodCBcZmkKICAgICAgIFxpZm51bVxwZGZ0ZXh2ZXJzaW9uPDEzCi0gICAgICAgICAjMS5wZGYlCisgICAgICAgICAjMS5ccGRmaW1nZXh0CiAgICAgICAgXGVsc2UKLSAgICAgICAgIHsjMS5wZGZ9JQorICAgICAgICAgeyMxLlxwZGZpbWdleHR9JQogICAgICAgIFxmaQogICAgIFxpZm51bVxwZGZ0ZXh2ZXJzaW9uIDwgMTQgXGVsc2UKICAgICAgIFxwZGZyZWZ4aW1hZ2UgXHBkZmxhc3R4aW1hZ2UKICAgICBcZml9CisgICUKICAgXGRlZlxwZGZta2Rlc3QjMXt7JQogICAgICUgV2UgaGF2ZSB0byBzZXQgZHVtbWllcyBzbyBjb21tYW5kcyBzdWNoIGFzIEBjb2RlLCBhbmQgY2hhcmFjdGVycwogICAgICUgc3VjaCBhcyBcLCBhcmVuJ3QgZXhwYW5kZWQgd2hlbiBwcmVzZW50IGluIGEgc2VjdGlvbiB0aXRsZS4KLSAgICBcYXRkdW1taWVzCi0gICAgXGFjdGl2ZWJhY2tzbGFzaGRvdWJsZQorICAgIFxpbmRleG5vZm9udHMKKyAgICBcdHVybm9mZmFjdGl2ZQorICAgIFxtYWtldmFsdWVleHBhbmRhYmxlCiAgICAgXGRlZlxwZGZkZXN0bmFtZXsjMX0lCi0gICAgXGJhY2tzbGFzaHBhcmVuc1xwZGZkZXN0bmFtZQotICAgIFxwZGZkZXN0IG5hbWV7XHBkZmRlc3RuYW1lfSB4eXolCi0gIH19JQorICAgIFx0eGllc2NhcGVwZGZccGRmZGVzdG5hbWUKKyAgICBcc2FmZXdoYXRzaXR7XHBkZmRlc3QgbmFtZXtccGRmZGVzdG5hbWV9IHh5en0lCisgIH19CiAgICUKICAgJSB1c2VkIHRvIG1hcmsgdGFyZ2V0IG5hbWVzOyBtdXN0IGJlIGV4cGFuZGFibGUuCi0gIFxkZWZccGRmbWtwZ24jMXsjMX0lCisgIFxkZWZccGRmbWtwZ24jMXsjMX0KICAgJQotICBcbGV0XGxpbmtjb2xvciA9IFxCbHVlICAlIHdhcyBDeWFuLCBidXQgdGhhdCBzZWVtcyBsaWdodD8KLSAgXGRlZlxlbmRsaW5re1xCbGFja1xwZGZlbmRsaW5rfQorICAlIGJ5IGRlZmF1bHQsIHVzZSBhIGNvbG9yIHRoYXQgaXMgZGFyayBlbm91Z2ggdG8gcHJpbnQgb24gcGFwZXIgYXMKKyAgJSBuZWFybHkgYmxhY2ssIGJ1dCBzdGlsbCBkaXN0aW5ndWlzaGFibGUgZm9yIG9ubGluZSB2aWV3aW5nLgorICBcZGVmXHVybGNvbG9ye1xyZ2JEYXJrUmVkfQorICBcZGVmXGxpbmtjb2xvcntccmdiRGFya1JlZH0KKyAgXGRlZlxlbmRsaW5re1xzZXRjb2xvcntcbWFpbmNvbG9yfVxwZGZlbmRsaW5rfQorICAlCiAgICUgQWRkaW5nIG91dGxpbmVzIHRvIFBERjsgbWFjcm9zIGZvciBjYWxjdWxhdGluZyBzdHJ1Y3R1cmUgb2Ygb3V0bGluZXMKICAgJSBjb21lIGZyb20gUGV0ciBPbHNhawogICBcZGVmXGV4cG51bWJlciMxe1xleHBhbmRhZnRlclxpZnhcY3NuYW1lIzFcZW5kY3NuYW1lXHJlbGF4IDAlCkBAIC0xMzA5LDI5ICsxMjcyLDI0IEBACiAgICAgJSBwYWdlIG51bWJlci4gIFdlIGNvdWxkIGdlbmVyYXRlIGEgZGVzdGluYXRpb24gZm9yIHRoZSBzZWN0aW9uCiAgICAgJSB0ZXh0IGluIHRoZSBjYXNlIHdoZXJlIGEgc2VjdGlvbiBoYXMgbm8gbm9kZSwgYnV0IGl0IGRvZXNuJ3QKICAgICAlIHNlZW0gd29ydGggdGhlIHRyb3VibGUsIHNpbmNlIG1vc3QgZG9jdW1lbnRzIGFyZSBub3JtYWxseSBzdHJ1Y3R1cmVkLgotICAgIFxkZWZccGRmb3V0bGluZWRlc3R7IzN9JQorICAgIFxlZGVmXHBkZm91dGxpbmVkZXN0eyMzfSUKICAgICBcaWZ4XHBkZm91dGxpbmVkZXN0XGVtcHR5CiAgICAgICBcZGVmXHBkZm91dGxpbmVkZXN0eyM0fSUKICAgICBcZWxzZQotICAgICAgJSBEb3VibGVkIGJhY2tzbGFzaGVzIGluIHRoZSBuYW1lLgotICAgICAge1xhY3RpdmViYWNrc2xhc2hkb3VibGUgXHhkZWZccGRmb3V0bGluZWRlc3R7IzN9JQotICAgICAgIFxiYWNrc2xhc2hwYXJlbnNccGRmb3V0bGluZWRlc3R9JQorICAgICAgXHR4aWVzY2FwZXBkZlxwZGZvdXRsaW5lZGVzdAogICAgIFxmaQogICAgICUKLSAgICAlIEFsc28gZG91YmxlIHRoZSBiYWNrc2xhc2hlcyBpbiB0aGUgZGlzcGxheSBzdHJpbmcuCi0gICAge1xhY3RpdmViYWNrc2xhc2hkb3VibGUgXHhkZWZccGRmb3V0bGluZXRleHR7IzF9JQotICAgICBcYmFja3NsYXNocGFyZW5zXHBkZm91dGxpbmV0ZXh0fSUKKyAgICAlIEFsc28gZXNjYXBlIFBERiBjaGFycyBpbiB0aGUgZGlzcGxheSBzdHJpbmcuCisgICAgXGVkZWZccGRmb3V0bGluZXRleHR7IzF9JQorICAgIFx0eGllc2NhcGVwZGZccGRmb3V0bGluZXRleHQKICAgICAlCiAgICAgXHBkZm91dGxpbmUgZ290byBuYW1le1xwZGZta3BnbntccGRmb3V0bGluZWRlc3R9fSMye1xwZGZvdXRsaW5ldGV4dH0lCiAgIH0KICAgJQogICBcZGVmXHBkZm1ha2VvdXRsaW5lc3slCiAgICAgXGJlZ2luZ3JvdXAKLSAgICAgICUgVGhhbmgncyBoYWNrIC8gcHJvcGVyIGJyYWNlcyBpbiBib29rbWFya3MKLSAgICAgIFxlZGVmXG15bGJyYWNle1xpZnRydWUgXHN0cmluZ3tcZWxzZX1cZml9XGxldFx7PVxteWxicmFjZQotICAgICAgXGVkZWZcbXlyYnJhY2V7XGlmZmFsc2V7XGVsc2Vcc3RyaW5nfVxmaX1cbGV0XH09XG15cmJyYWNlCi0gICAgICAlCiAgICAgICAlIFJlYWQgdG9jIHNpbGVudGx5LCB0byBnZXQgY291bnRzIG9mIHN1YmVudHJpZXMgZm9yIFxwZGZvdXRsaW5lLgorICAgICAgXGRlZlxwYXJ0ZW50cnkjIzEjIzIjIzMjIzR7fSUgaWdub3JlIHBhcnRzIGluIHRoZSBvdXRsaW5lcwogICAgICAgXGRlZlxudW1jaGFwZW50cnkjIzEjIzIjIzMjIzR7JQogCVxkZWZcdGhpc2NoYXBudW17IyMyfSUKIAlcZGVmXHRoaXNzZWNudW17MH0lCkBAIC0xMzg1LDM1ICsxMzQzLDYzIEBACiAgICAgICAlIExhdGluIDIgKDB4ZWEpIGdldHMgdHJhbnNsYXRlZCB0byBhIHwgY2hhcmFjdGVyLiAgSW5mbyBmcm9tCiAgICAgICAlIFN0YXN6ZWsgV2F3cnlraWV3aWN6LCAxOSBKYW4gMjAwNCAwNDowOToyNCArMDEwMC4KICAgICAgICUKLSAgICAgICUgeHggdG8gZG8gdGhpcyByaWdodCwgd2UgaGF2ZSB0byB0cmFuc2xhdGUgOC1iaXQgY2hhcmFjdGVycyB0bwotICAgICAgJSB0aGVpciAiYmVzdCIgZXF1aXZhbGVudCwgYmFzZWQgb24gdGhlIEBkb2N1bWVudGVuY29kaW5nLiAgUmlnaHQKLSAgICAgICUgbm93LCBJIGd1ZXNzIHdlJ2xsIGp1c3QgbGV0IHRoZSBwZGYgcmVhZGVyIGhhdmUgaXRzIHdheS4KKyAgICAgICUgVE9ETyB0aGlzIHJpZ2h0LCB3ZSBoYXZlIHRvIHRyYW5zbGF0ZSA4LWJpdCBjaGFyYWN0ZXJzIHRvCisgICAgICAlIHRoZWlyICJiZXN0IiBlcXVpdmFsZW50LCBiYXNlZCBvbiB0aGUgQGRvY3VtZW50ZW5jb2RpbmcuICBUb28KKyAgICAgICUgbXVjaCB3b3JrIGZvciB0b28gbGl0dGxlIHJldHVybi4gIEp1c3QgdXNlIHRoZSBBU0NJSSBlcXVpdmFsZW50cworICAgICAgJSB3ZSB1c2UgZm9yIHRoZSBpbmRleCBzb3J0IHN0cmluZ3MuCisgICAgICAlIAogICAgICAgXGluZGV4bm9mb250cwogICAgICAgXHNldHVwZGF0YWZpbGUKLSAgICAgIFxhY3RpdmViYWNrc2xhc2gKLSAgICAgIFxpbnB1dCBcam9ibmFtZS50b2MKKyAgICAgICUgV2UgY2FuIGhhdmUgbm9ybWFsIGJyYWNlIGNoYXJhY3RlcnMgaW4gdGhlIFBERiBvdXRsaW5lcywgdW5saWtlCisgICAgICAlIFRleGluZm8gaW5kZXggZmlsZXMuICBTbyBzZXQgdGhhdCB1cC4KKyAgICAgIFxkZWZce3tcbGJyYWNlY2hhcmxpdGVyYWx9JQorICAgICAgXGRlZlx9e1xyYnJhY2VjaGFybGl0ZXJhbH0lCisgICAgICBcY2F0Y29kZWBcXD1cYWN0aXZlIFxvdGhlcmJhY2tzbGFzaAorICAgICAgXGlucHV0IFx0b2NyZWFkZmlsZW5hbWUKICAgICBcZW5kZ3JvdXAKICAgfQorICB7XGNhdGNvZGVgWz0xIFxjYXRjb2RlYF09MgorICAgXGNhdGNvZGVgez1cb3RoZXIgXGNhdGNvZGVgfT1cb3RoZXIKKyAgIFxnZGVmXGxicmFjZWNoYXJsaXRlcmFsW3tdJQorICAgXGdkZWZccmJyYWNlY2hhcmxpdGVyYWxbfV0lCisgIF0KICAgJQogICBcZGVmXHNraXBzcGFjZXMjMXtcZGVmXFBQeyMxfVxkZWZcRHt8fSUKICAgICBcaWZ4XFBQXERcbGV0XG5leHRzcFxyZWxheAogICAgIFxlbHNlXGxldFxuZXh0c3Bcc2tpcHNwYWNlcwotICAgICAgXGlmeFxwXHNwYWNlXGVsc2VcYWRkdG9rZW5ze1xmaWxlbmFtZX17XFBQfSUKLSAgICAgICAgXGFkdmFuY2VcZmlsZW5hbWVsZW5ndGggYnkgMQotICAgICAgXGZpCisgICAgICBcYWRkdG9rZW5ze1xmaWxlbmFtZX17XFBQfSUKKyAgICAgIFxhZHZhbmNlXGZpbGVuYW1lbGVuZ3RoIGJ5IDEKICAgICBcZmkKICAgICBcbmV4dHNwfQotICBcZGVmXGdldGZpbGVuYW1lIzF7XGZpbGVuYW1lbGVuZ3RoPTBcZXhwYW5kYWZ0ZXJcc2tpcHNwYWNlcyMxfFxyZWxheH0KKyAgXGRlZlxnZXRmaWxlbmFtZSMxeyUKKyAgICBcZmlsZW5hbWVsZW5ndGg9MAorICAgICUgSWYgd2UgZG9uJ3QgZXhwYW5kIHRoZSBhcmd1bWVudCBub3csIFxza2lwc3BhY2VzIHdpbGwgZ2V0CisgICAgJSBzbmFnZ2VkIG9uIHRoaW5ncyBsaWtlICJAdmFsdWV7Zm9vfSIuCisgICAgXGVkZWZcdGVtcHsjMX0lCisgICAgXGV4cGFuZGFmdGVyXHNraXBzcGFjZXNcdGVtcHxccmVsYXgKKyAgfQogICBcaWZudW1ccGRmdGV4dmVyc2lvbiA8IDE0CiAgICAgXGxldCBcc3RhcnRsaW5rIFxwZGZhbm5vdGxpbmsKICAgXGVsc2UKICAgICBcbGV0IFxzdGFydGxpbmsgXHBkZnN0YXJ0bGluawogICBcZmkKKyAgJSBtYWtlIGEgbGl2ZSB1cmwgaW4gcGRmIG91dHB1dC4KICAgXGRlZlxwZGZ1cmwjMXslCiAgICAgXGJlZ2luZ3JvdXAKLSAgICAgIFxub3JtYWx0dXJub2ZmYWN0aXZlXGRlZlxAe0B9JQorICAgICAgJSBpdCBzZWVtcyB3ZSByZWFsbHkgbmVlZCB5ZXQgYW5vdGhlciBzZXQgb2YgZHVtbWllczsgaGF2ZSBub3QKKyAgICAgICUgdHJpZWQgdG8gZmlndXJlIG91dCB3aGF0IGVhY2ggY29tbWFuZCBzaG91bGQgZG8gaW4gdGhlIGNvbnRleHQKKyAgICAgICUgb2YgQHVybC4gIGZvciBub3csIGp1c3QgbWFrZSBALyBhIG5vLW9wLCB0aGF0J3MgdGhlIG9ubHkgb25lCisgICAgICAlIHBlb3BsZSBoYXZlIGFjdHVhbGx5IHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoLgorICAgICAgJQorICAgICAgXG5vcm1hbHR1cm5vZmZhY3RpdmUKKyAgICAgIFxkZWZcQHtAfSUKKyAgICAgIFxsZXRcLz1cZW1wdHkKICAgICAgIFxtYWtldmFsdWVleHBhbmRhYmxlCi0gICAgICBcbGVhdmV2bW9kZVxSZWQKKyAgICAgICUgZG8gd2Ugd2FudCB0byBnbyBzbyBmYXIgYXMgdG8gdXNlIFxpbmRleG5vZm9udHMgaW5zdGVhZCBvZiBqdXN0CisgICAgICAlIHNwZWNpYWwtY2FzaW5nIFx2YXIgaGVyZT8KKyAgICAgIFxkZWZcdmFyIyMxeyMjMX0lCisgICAgICAlCisgICAgICBcbGVhdmV2bW9kZVxzZXRjb2xvcntcdXJsY29sb3J9JQogICAgICAgXHN0YXJ0bGluayBhdHRyey9Cb3JkZXIgWzAgMCAwXX0lCiAgICAgICAgIHVzZXJ7L1N1YnR5cGUgL0xpbmsgL0EgPDwgL1MgL1VSSSAvVVJJICgjMSkgPj59JQogICAgIFxlbmRncm91cH0KQEAgLTE0NDAsMTMgKzE0MjYsMTUgQEAKICAgICB7XG5vZXhwYW5kXHBkZmxpbmt7XHRoZVx0b2tzQ319XHRva3NDPXt9XGdsb2JhbFxjb3VudEE9MH0KICAgXGRlZlxwZGZsaW5rIzF7JQogICAgIFxzdGFydGxpbmsgYXR0cnsvQm9yZGVyIFswIDAgMF19IGdvdG8gbmFtZXtccGRmbWtwZ257IzF9fQotICAgIFxsaW5rY29sb3IgIzFcZW5kbGlua30KKyAgICBcc2V0Y29sb3J7XGxpbmtjb2xvcn0jMVxlbmRsaW5rfQogICBcZGVmXGRvbmV7XGVkZWZcc3R7XGdsb2JhbFxub2V4cGFuZFx0b2tzQT17XHRoZVx0b2tzQn19XHN0fQogXGVsc2UKKyAgJSBub24tcGRmIG1vZGUKICAgXGxldFxwZGZta2Rlc3QgPSBcZ29iYmxlCiAgIFxsZXRccGRmdXJsID0gXGdvYmJsZQogICBcbGV0XGVuZGxpbmsgPSBccmVsYXgKLSAgXGxldFxsaW5rY29sb3IgPSBccmVsYXgKKyAgXGxldFxzZXRjb2xvciA9IFxnb2JibGUKKyAgXGxldFxwZGZzZXRjb2xvciA9IFxnb2JibGUKICAgXGxldFxwZGZtYWtlb3V0bGluZXMgPSBccmVsYXgKIFxmaSAgJSBcaWZ4XHBkZm91dHB1dAogCkBAIC0xNDcyLDYgKzE0NjAsMTAgQEAKIFxkZWZcYmZ7XGZhbT1cYmZmYW0gXHNldGZvbnRzdHlsZXtiZn19XGRlZlxiZnN0eWxlbmFtZXtiZn0KIFxkZWZcdHR7XGZhbT1cdHRmYW0gXHNldGZvbnRzdHlsZXt0dH19CiAKKyUgVW5mb3J0dW5hdGVseSwgd2UgaGF2ZSB0byBvdmVycmlkZSB0aGlzIGZvciB0aXRsZXMgYW5kIHRoZSBsaWtlLCBzaW5jZQorJSBpbiB0aG9zZSBjYXNlcyAicm0iIGlzIGJvbGQuICBTaWdoLgorXGRlZlxybWlzYm9sZHtccm1cZGVmXGN1cmZvbnRzdHlsZXtiZn19CisKICUgVGV4aW5mbyBzb3J0IG9mIHN1cHBvcnRzIHRoZSBzYW5zIHNlcmlmIGZvbnQgc3R5bGUsIHdoaWNoIHBsYWluIFRlWCBkb2VzIG5vdC4KICUgU28gd2Ugc2V0IHVwIGEgXHNmLgogXG5ld2ZhbVxzZmZhbQpAQCAtMTQ4MSw4ICsxNDczLDYgQEAKICUgV2UgZG9uJ3QgbmVlZCBtYXRoIGZvciB0aGlzIGZvbnQgc3R5bGUuCiBcZGVmXHR0c2x7XHNldGZvbnRzdHlsZXt0dHNsfX0KIAotJSBEZWZhdWx0IGxlYWRpbmcuCi1cbmV3ZGltZW5cdGV4dGxlYWRpbmcgIFx0ZXh0bGVhZGluZyA9IDEzLjJwdAogCiAlIFNldCB0aGUgYmFzZWxpbmVza2lwIHRvICMxLCBhbmQgdGhlIGxpbmVza2lwIGFuZCBzdHJ1dCBzaXplCiAlIGNvcnJlc3BvbmRpbmdseS4gIFRoZXJlIGlzIG5vIGRlZXAgbWVhbmluZyBiZWhpbmQgdGhlc2UgbWFnaWMgbnVtYmVycwpAQCAtMTQ5Miw4ICsxNDgyLDEzIEBACiBcZGVmXHN0cnV0aGVpZ2h0cGVyY2VudHsuNzA4MzN9CiBcZGVmXHN0cnV0ZGVwdGhwZXJjZW50IHsuMjkxNjd9CiAlCislIGNhbiBnZXQgYSBzb3J0IG9mIHBvb3IgbWFuJ3MgZG91YmxlIHNwYWNpbmcgYnkgcmVkZWZpbmluZyB0aGlzLgorXGRlZlxiYXNlbGluZWZhY3RvcnsxfQorJQorXG5ld2RpbWVuXHRleHRsZWFkaW5nCiBcZGVmXHNldGxlYWRpbmcjMXslCi0gIFxub3JtYWxiYXNlbGluZXNraXAgPSAjMVxyZWxheAorICBcZGltZW4wID0gIzFccmVsYXgKKyAgXG5vcm1hbGJhc2VsaW5lc2tpcCA9IFxiYXNlbGluZWZhY3RvclxkaW1lbjAKICAgXG5vcm1hbGxpbmVza2lwID0gXGxpbmVza2lwZmFjdG9yXG5vcm1hbGJhc2VsaW5lc2tpcAogICBcbm9ybWFsYmFzZWxpbmVzCiAgIFxzZXRib3hcc3RydXRib3ggPVxoYm94eyUKQEAgLTE1MDIsMjAgKzE0OTcsMjk1IEBACiAgIH0lCiB9CiAKLSUgU2V0IHRoZSBmb250IG1hY3JvICMxIHRvIHRoZSBmb250IG5hbWVkICMyLCBhZGRpbmcgb24gdGhlCi0lIHNwZWNpZmllZCBmb250IHByZWZpeCAobm9ybWFsbHkgYGNtJykuCi0lICMzIGlzIHRoZSBmb250J3MgZGVzaWduIHNpemUsICM0IGlzIGEgc2NhbGUgZmFjdG9yCi1cZGVmXHNldGZvbnQjMSMyIzMjNHtcZm9udCMxPVxmb250cHJlZml4IzIjMyBzY2FsZWQgIzR9CislIFBERiBDTWFwcy4gIFNlZSBhbHNvIExhVGVYJ3MgdDEuY21hcC4KKyUKKyUgZG8gbm90aGluZyB3aXRoIHRoaXMgYnkgZGVmYXVsdC4KK1xleHBhbmRhZnRlclxsZXRcY3NuYW1lIGNtYXBPVDFcZW5kY3NuYW1lXGdvYmJsZQorXGV4cGFuZGFmdGVyXGxldFxjc25hbWUgY21hcE9UMUlUXGVuZGNzbmFtZVxnb2JibGUKK1xleHBhbmRhZnRlclxsZXRcY3NuYW1lIGNtYXBPVDFUVFxlbmRjc25hbWVcZ29iYmxlCisKKyUgaWYgd2UgYXJlIHByb2R1Y2luZyBwZGYsIGFuZCB3ZSBoYXZlIFxwZGZmb250YXR0ciwgdGhlbiBkZWZpbmUgY21hcHMuCislIChccGRmZm9udGF0dHIgd2FzIGludHJvZHVjZWQgbWFueSB5ZWFycyBhZ28sIGJ1dCBwZW9wbGUgc3RpbGwgcnVuCislIG9sZGVyIHBkZnRleCdzOyBpdCdzIGVhc3kgdG8gY29uZGl0aW9uYWxpemUsIHNvIHdlIGRvLikKK1xpZnBkZiBcaWZ4XHBkZmZvbnRhdHRyXHRoaXNpc3VuZGVmaW5lZCBcZWxzZQorICBcYmVnaW5ncm91cAorICAgIFxjYXRjb2RlYFxeXk09XGFjdGl2ZSBcZGVmXl5Ne15eSn0lIE91dHB1dCBsaW5lIGVuZGluZ3MgYXMgdGhlIF5eSiBjaGFyLgorICAgIFxjYXRjb2RlYFwlPTEyIFxpbW1lZGlhdGVccGRmb2JqIHN0cmVhbSB7JSFQUy1BZG9iZS0zLjAgUmVzb3VyY2UtQ01hcAorJSVEb2N1bWVudE5lZWRlZFJlc291cmNlczogUHJvY1NldCAoQ0lESW5pdCkKKyUlSW5jbHVkZVJlc291cmNlOiBQcm9jU2V0IChDSURJbml0KQorJSVCZWdpblJlc291cmNlOiBDTWFwIChUZVgtT1QxLTApCislJVRpdGxlOiAoVGVYLU9UMS0wIFRlWCBPVDEgMCkKKyUlVmVyc2lvbjogMS4wMDAKKyUlRW5kQ29tbWVudHMKKy9DSURJbml0IC9Qcm9jU2V0IGZpbmRyZXNvdXJjZSBiZWdpbgorMTIgZGljdCBiZWdpbgorYmVnaW5jbWFwCisvQ0lEU3lzdGVtSW5mbworPDwgL1JlZ2lzdHJ5IChUZVgpCisvT3JkZXJpbmcgKE9UMSkKKy9TdXBwbGVtZW50IDAKKz4+IGRlZgorL0NNYXBOYW1lIC9UZVgtT1QxLTAgZGVmCisvQ01hcFR5cGUgMiBkZWYKKzEgYmVnaW5jb2Rlc3BhY2VyYW5nZQorPDAwPiA8N0Y+CitlbmRjb2Rlc3BhY2VyYW5nZQorOCBiZWdpbmJmcmFuZ2UKKzwwMD4gPDAxPiA8MDM5Mz4KKzwwOT4gPDBBPiA8MDNBOD4KKzwyMz4gPDI2PiA8MDAyMz4KKzwyOD4gPDNCPiA8MDAyOD4KKzwzRj4gPDVCPiA8MDAzRj4KKzw1RD4gPDVFPiA8MDA1RD4KKzw2MT4gPDdBPiA8MDA2MT4KKzw3Qj4gPDdDPiA8MjAxMz4KK2VuZGJmcmFuZ2UKKzQwIGJlZ2luYmZjaGFyCis8MDI+IDwwMzk4PgorPDAzPiA8MDM5Qj4KKzwwND4gPDAzOUU+Cis8MDU+IDwwM0EwPgorPDA2PiA8MDNBMz4KKzwwNz4gPDAzRDI+Cis8MDg+IDwwM0E2PgorPDBCPiA8MDA2NjAwNjY+Cis8MEM+IDwwMDY2MDA2OT4KKzwwRD4gPDAwNjYwMDZDPgorPDBFPiA8MDA2NjAwNjYwMDY5PgorPDBGPiA8MDA2NjAwNjYwMDZDPgorPDEwPiA8MDEzMT4KKzwxMT4gPDAyMzc+Cis8MTI+IDwwMDYwPgorPDEzPiA8MDBCND4KKzwxND4gPDAyQzc+Cis8MTU+IDwwMkQ4PgorPDE2PiA8MDBBRj4KKzwxNz4gPDAyREE+Cis8MTg+IDwwMEI4PgorPDE5PiA8MDBERj4KKzwxQT4gPDAwRTY+Cis8MUI+IDwwMTUzPgorPDFDPiA8MDBGOD4KKzwxRD4gPDAwQzY+Cis8MUU+IDwwMTUyPgorPDFGPiA8MDBEOD4KKzwyMT4gPDAwMjE+Cis8MjI+IDwyMDFEPgorPDI3PiA8MjAxOT4KKzwzQz4gPDAwQTE+Cis8M0Q+IDwwMDNEPgorPDNFPiA8MDBCRj4KKzw1Qz4gPDIwMUM+Cis8NUY+IDwwMkQ5PgorPDYwPiA8MjAxOD4KKzw3RD4gPDAyREQ+Cis8N0U+IDwwMDdFPgorPDdGPiA8MDBBOD4KK2VuZGJmY2hhcgorZW5kY21hcAorQ01hcE5hbWUgY3VycmVudGRpY3QgL0NNYXAgZGVmaW5lcmVzb3VyY2UgcG9wCitlbmQKK2VuZAorJSVFbmRSZXNvdXJjZQorJSVFT0YKKyAgICB9XGVuZGdyb3VwCisgIFxleHBhbmRhZnRlclxlZGVmXGNzbmFtZSBjbWFwT1QxXGVuZGNzbmFtZSMxeyUKKyAgICBccGRmZm9udGF0dHIjMXsvVG9Vbmljb2RlIFx0aGVccGRmbGFzdG9ialxzcGFjZSAwIFJ9JQorICB9JQorJQorJSBcY21hcE9UMUlUCisgIFxiZWdpbmdyb3VwCisgICAgXGNhdGNvZGVgXF5eTT1cYWN0aXZlIFxkZWZeXk17Xl5KfSUgT3V0cHV0IGxpbmUgZW5kaW5ncyBhcyB0aGUgXl5KIGNoYXIuCisgICAgXGNhdGNvZGVgXCU9MTIgXGltbWVkaWF0ZVxwZGZvYmogc3RyZWFtIHslIVBTLUFkb2JlLTMuMCBSZXNvdXJjZS1DTWFwCislJURvY3VtZW50TmVlZGVkUmVzb3VyY2VzOiBQcm9jU2V0IChDSURJbml0KQorJSVJbmNsdWRlUmVzb3VyY2U6IFByb2NTZXQgKENJREluaXQpCislJUJlZ2luUmVzb3VyY2U6IENNYXAgKFRlWC1PVDFJVC0wKQorJSVUaXRsZTogKFRlWC1PVDFJVC0wIFRlWCBPVDFJVCAwKQorJSVWZXJzaW9uOiAxLjAwMAorJSVFbmRDb21tZW50cworL0NJREluaXQgL1Byb2NTZXQgZmluZHJlc291cmNlIGJlZ2luCisxMiBkaWN0IGJlZ2luCitiZWdpbmNtYXAKKy9DSURTeXN0ZW1JbmZvCis8PCAvUmVnaXN0cnkgKFRlWCkKKy9PcmRlcmluZyAoT1QxSVQpCisvU3VwcGxlbWVudCAwCis+PiBkZWYKKy9DTWFwTmFtZSAvVGVYLU9UMUlULTAgZGVmCisvQ01hcFR5cGUgMiBkZWYKKzEgYmVnaW5jb2Rlc3BhY2VyYW5nZQorPDAwPiA8N0Y+CitlbmRjb2Rlc3BhY2VyYW5nZQorOCBiZWdpbmJmcmFuZ2UKKzwwMD4gPDAxPiA8MDM5Mz4KKzwwOT4gPDBBPiA8MDNBOD4KKzwyNT4gPDI2PiA8MDAyNT4KKzwyOD4gPDNCPiA8MDAyOD4KKzwzRj4gPDVCPiA8MDAzRj4KKzw1RD4gPDVFPiA8MDA1RD4KKzw2MT4gPDdBPiA8MDA2MT4KKzw3Qj4gPDdDPiA8MjAxMz4KK2VuZGJmcmFuZ2UKKzQyIGJlZ2luYmZjaGFyCis8MDI+IDwwMzk4PgorPDAzPiA8MDM5Qj4KKzwwND4gPDAzOUU+Cis8MDU+IDwwM0EwPgorPDA2PiA8MDNBMz4KKzwwNz4gPDAzRDI+Cis8MDg+IDwwM0E2PgorPDBCPiA8MDA2NjAwNjY+Cis8MEM+IDwwMDY2MDA2OT4KKzwwRD4gPDAwNjYwMDZDPgorPDBFPiA8MDA2NjAwNjYwMDY5PgorPDBGPiA8MDA2NjAwNjYwMDZDPgorPDEwPiA8MDEzMT4KKzwxMT4gPDAyMzc+Cis8MTI+IDwwMDYwPgorPDEzPiA8MDBCND4KKzwxND4gPDAyQzc+Cis8MTU+IDwwMkQ4PgorPDE2PiA8MDBBRj4KKzwxNz4gPDAyREE+Cis8MTg+IDwwMEI4PgorPDE5PiA8MDBERj4KKzwxQT4gPDAwRTY+Cis8MUI+IDwwMTUzPgorPDFDPiA8MDBGOD4KKzwxRD4gPDAwQzY+Cis8MUU+IDwwMTUyPgorPDFGPiA8MDBEOD4KKzwyMT4gPDAwMjE+Cis8MjI+IDwyMDFEPgorPDIzPiA8MDAyMz4KKzwyND4gPDAwQTM+Cis8Mjc+IDwyMDE5PgorPDNDPiA8MDBBMT4KKzwzRD4gPDAwM0Q+Cis8M0U+IDwwMEJGPgorPDVDPiA8MjAxQz4KKzw1Rj4gPDAyRDk+Cis8NjA+IDwyMDE4PgorPDdEPiA8MDJERD4KKzw3RT4gPDAwN0U+Cis8N0Y+IDwwMEE4PgorZW5kYmZjaGFyCitlbmRjbWFwCitDTWFwTmFtZSBjdXJyZW50ZGljdCAvQ01hcCBkZWZpbmVyZXNvdXJjZSBwb3AKK2VuZAorZW5kCislJUVuZFJlc291cmNlCislJUVPRgorICAgIH1cZW5kZ3JvdXAKKyAgXGV4cGFuZGFmdGVyXGVkZWZcY3NuYW1lIGNtYXBPVDFJVFxlbmRjc25hbWUjMXslCisgICAgXHBkZmZvbnRhdHRyIzF7L1RvVW5pY29kZSBcdGhlXHBkZmxhc3RvYmpcc3BhY2UgMCBSfSUKKyAgfSUKKyUKKyUgXGNtYXBPVDFUVAorICBcYmVnaW5ncm91cAorICAgIFxjYXRjb2RlYFxeXk09XGFjdGl2ZSBcZGVmXl5Ne15eSn0lIE91dHB1dCBsaW5lIGVuZGluZ3MgYXMgdGhlIF5eSiBjaGFyLgorICAgIFxjYXRjb2RlYFwlPTEyIFxpbW1lZGlhdGVccGRmb2JqIHN0cmVhbSB7JSFQUy1BZG9iZS0zLjAgUmVzb3VyY2UtQ01hcAorJSVEb2N1bWVudE5lZWRlZFJlc291cmNlczogUHJvY1NldCAoQ0lESW5pdCkKKyUlSW5jbHVkZVJlc291cmNlOiBQcm9jU2V0IChDSURJbml0KQorJSVCZWdpblJlc291cmNlOiBDTWFwIChUZVgtT1QxVFQtMCkKKyUlVGl0bGU6IChUZVgtT1QxVFQtMCBUZVggT1QxVFQgMCkKKyUlVmVyc2lvbjogMS4wMDAKKyUlRW5kQ29tbWVudHMKKy9DSURJbml0IC9Qcm9jU2V0IGZpbmRyZXNvdXJjZSBiZWdpbgorMTIgZGljdCBiZWdpbgorYmVnaW5jbWFwCisvQ0lEU3lzdGVtSW5mbworPDwgL1JlZ2lzdHJ5IChUZVgpCisvT3JkZXJpbmcgKE9UMVRUKQorL1N1cHBsZW1lbnQgMAorPj4gZGVmCisvQ01hcE5hbWUgL1RlWC1PVDFUVC0wIGRlZgorL0NNYXBUeXBlIDIgZGVmCisxIGJlZ2luY29kZXNwYWNlcmFuZ2UKKzwwMD4gPDdGPgorZW5kY29kZXNwYWNlcmFuZ2UKKzUgYmVnaW5iZnJhbmdlCis8MDA+IDwwMT4gPDAzOTM+Cis8MDk+IDwwQT4gPDAzQTg+Cis8MjE+IDwyNj4gPDAwMjE+Cis8Mjg+IDw1Rj4gPDAwMjg+Cis8NjE+IDw3RT4gPDAwNjE+CitlbmRiZnJhbmdlCiszMiBiZWdpbmJmY2hhcgorPDAyPiA8MDM5OD4KKzwwMz4gPDAzOUI+Cis8MDQ+IDwwMzlFPgorPDA1PiA8MDNBMD4KKzwwNj4gPDAzQTM+Cis8MDc+IDwwM0QyPgorPDA4PiA8MDNBNj4KKzwwQj4gPDIxOTE+Cis8MEM+IDwyMTkzPgorPDBEPiA8MDAyNz4KKzwwRT4gPDAwQTE+Cis8MEY+IDwwMEJGPgorPDEwPiA8MDEzMT4KKzwxMT4gPDAyMzc+Cis8MTI+IDwwMDYwPgorPDEzPiA8MDBCND4KKzwxND4gPDAyQzc+Cis8MTU+IDwwMkQ4PgorPDE2PiA8MDBBRj4KKzwxNz4gPDAyREE+Cis8MTg+IDwwMEI4PgorPDE5PiA8MDBERj4KKzwxQT4gPDAwRTY+Cis8MUI+IDwwMTUzPgorPDFDPiA8MDBGOD4KKzwxRD4gPDAwQzY+Cis8MUU+IDwwMTUyPgorPDFGPiA8MDBEOD4KKzwyMD4gPDI0MjM+Cis8Mjc+IDwyMDE5PgorPDYwPiA8MjAxOD4KKzw3Rj4gPDAwQTg+CitlbmRiZmNoYXIKK2VuZGNtYXAKK0NNYXBOYW1lIGN1cnJlbnRkaWN0IC9DTWFwIGRlZmluZXJlc291cmNlIHBvcAorZW5kCitlbmQKKyUlRW5kUmVzb3VyY2UKKyUlRU9GCisgICAgfVxlbmRncm91cAorICBcZXhwYW5kYWZ0ZXJcZWRlZlxjc25hbWUgY21hcE9UMVRUXGVuZGNzbmFtZSMxeyUKKyAgICBccGRmZm9udGF0dHIjMXsvVG9Vbmljb2RlIFx0aGVccGRmbGFzdG9ialxzcGFjZSAwIFJ9JQorICB9JQorXGZpXGZpCisKKworJSBTZXQgdGhlIGZvbnQgbWFjcm8gIzEgdG8gdGhlIGZvbnQgbmFtZWQgXGZvbnRwcmVmaXgjMi4KKyUgIzMgaXMgdGhlIGZvbnQncyBkZXNpZ24gc2l6ZSwgIzQgaXMgYSBzY2FsZSBmYWN0b3IsICM1IGlzIHRoZSBDTWFwCislIGVuY29kaW5nIChvbmx5IE9UMSwgT1QxSVQgYW5kIE9UMVRUIGFyZSBhbGxvd2VkLCBvciBlbXB0eSB0byBvbWl0KS4KKyUgRXhhbXBsZToKKyUgIzEgPSBcdGV4dHJtCislICMyID0gXHJtc2hhcGUKKyUgIzMgPSAxMAorJSAjNCA9IFxtYWlubWFnc3RlcAorJSAjNSA9IE9UMQorJQorXGRlZlxzZXRmb250IzEjMiMzIzQjNXslCisgIFxmb250IzE9XGZvbnRwcmVmaXgjMiMzIHNjYWxlZCAjNAorICBcY3NuYW1lIGNtYXAjNVxlbmRjc25hbWUjMSUKK30KKyUgVGhpcyBpcyB3aGF0IGdldHMgY2FsbGVkIHdoZW4gIzUgb2YgXHNldGZvbnQgaXMgZW1wdHkuCitcbGV0XGNtYXBcZ29iYmxlCislCislIChlbmQgb2YgY21hcHMpCiAKICUgVXNlIGNtIGFzIHRoZSBkZWZhdWx0IGZvbnQgcHJlZml4LgogJSBUbyBzcGVjaWZ5IHRoZSBmb250IHByZWZpeCwgeW91IG11c3QgZGVmaW5lIFxmb250cHJlZml4CiAlIGJlZm9yZSB5b3UgcmVhZCBpbiB0ZXhpbmZvLnRleC4KLVxpZnhcZm9udHByZWZpeFx1bmRlZmluZWQKK1xpZnhcZm9udHByZWZpeFx0aGlzaXN1bmRlZmluZWQKIFxkZWZcZm9udHByZWZpeHtjbX0KIFxmaQogJSBTdXBwb3J0IGZvbnQgZmFtaWxpZXMgdGhhdCBkb24ndCB1c2UgdGhlIHNhbWUgbmFtaW5nIHNjaGVtZSBhcyBDTS4KIFxkZWZccm1zaGFwZXtyfQotXGRlZlxybWJzaGFwZXtieH0gICAgICAgICAgICAgICAld2hlcmUgdGhlIG5vcm1hbCBmYWNlIGlzIGJvbGQKK1xkZWZccm1ic2hhcGV7Ynh9ICAgICAgICAgICAgICAgJSB3aGVyZSB0aGUgbm9ybWFsIGZhY2UgaXMgYm9sZAogXGRlZlxiZnNoYXBle2J9CiBcZGVmXGJ4c2hhcGV7Ynh9CiBcZGVmXHR0c2hhcGV7dHR9CkBAIC0xNTMwLDExOCArMTgwMCwyOTEgQEAKIFxkZWZcc2NzaGFwZXtjc2N9CiBcZGVmXHNjYnNoYXBle2NzY30KIAorJSBEZWZpbml0aW9ucyBmb3IgYSBtYWluIHRleHQgc2l6ZSBvZiAxMXB0LiAgKFRoZSBkZWZhdWx0IGluIFRleGluZm8uKQorJQorXGRlZlxkZWZpbmV0ZXh0Zm9udHNpemV4aXslCiAlIFRleHQgZm9udHMgKDExLjJwdCwgbWFnc3RlcDEpLgogXGRlZlx0ZXh0bm9taW5hbHNpemV7MTFwdH0KIFxlZGVmXG1haW5tYWdzdGVwe1xtYWdzdGVwaGFsZn0KLVxzZXRmb250XHRleHRybVxybXNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Ci1cc2V0Zm9udFx0ZXh0dHRcdHRzaGFwZXsxMH17XG1haW5tYWdzdGVwfQotXHNldGZvbnRcdGV4dGJmXGJmc2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KLVxzZXRmb250XHRleHRpdFxpdHNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Ci1cc2V0Zm9udFx0ZXh0c2xcc2xzaGFwZXsxMH17XG1haW5tYWdzdGVwfQotXHNldGZvbnRcdGV4dHNmXHNmc2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KLVxzZXRmb250XHRleHRzY1xzY3NoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Ci1cc2V0Zm9udFx0ZXh0dHRzbFx0dHNsc2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KK1xzZXRmb250XHRleHRybVxybXNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9e09UMX0KK1xzZXRmb250XHRleHR0dFx0dHNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9e09UMVRUfQorXHNldGZvbnRcdGV4dGJmXGJmc2hhcGV7MTB9e1xtYWlubWFnc3RlcH17T1QxfQorXHNldGZvbnRcdGV4dGl0XGl0c2hhcGV7MTB9e1xtYWlubWFnc3RlcH17T1QxSVR9Citcc2V0Zm9udFx0ZXh0c2xcc2xzaGFwZXsxMH17XG1haW5tYWdzdGVwfXtPVDF9Citcc2V0Zm9udFx0ZXh0c2Zcc2ZzaGFwZXsxMH17XG1haW5tYWdzdGVwfXtPVDF9Citcc2V0Zm9udFx0ZXh0c2Ncc2NzaGFwZXsxMH17XG1haW5tYWdzdGVwfXtPVDF9Citcc2V0Zm9udFx0ZXh0dHRzbFx0dHNsc2hhcGV7MTB9e1xtYWlubWFnc3RlcH17T1QxVFR9CiBcZm9udFx0ZXh0aT1jbW1pMTAgc2NhbGVkIFxtYWlubWFnc3RlcAogXGZvbnRcdGV4dHN5PWNtc3kxMCBzY2FsZWQgXG1haW5tYWdzdGVwCitcZGVmXHRleHRlY3NpemV7MTA5NX0KIAogJSBBIGZldyBmb250cyBmb3IgQGRlZnVuIG5hbWVzIGFuZCBhcmdzLgotXHNldGZvbnRcZGVmYmZcYmZzaGFwZXsxMH17XG1hZ3N0ZXAxfQotXHNldGZvbnRcZGVmdHRcdHRzaGFwZXsxMH17XG1hZ3N0ZXAxfQotXHNldGZvbnRcZGVmdHRzbFx0dHNsc2hhcGV7MTB9e1xtYWdzdGVwMX0KK1xzZXRmb250XGRlZmJmXGJmc2hhcGV7MTB9e1xtYWdzdGVwMX17T1QxfQorXHNldGZvbnRcZGVmdHRcdHRzaGFwZXsxMH17XG1hZ3N0ZXAxfXtPVDFUVH0KK1xzZXRmb250XGRlZnR0c2xcdHRzbHNoYXBlezEwfXtcbWFnc3RlcDF9e09UMVRUfQogXGRlZlxkZntcbGV0XHRlbnR0PVxkZWZ0dCBcbGV0XHRlbmJmID0gXGRlZmJmIFxsZXRcdGVudHRzbD1cZGVmdHRzbCBcYmZ9CiAKICUgRm9udHMgZm9yIGluZGljZXMsIGZvb3Rub3Rlcywgc21hbGwgZXhhbXBsZXMgKDlwdCkuCiBcZGVmXHNtYWxsbm9taW5hbHNpemV7OXB0fQotXHNldGZvbnRcc21hbGxybVxybXNoYXBlezl9ezEwMDB9Ci1cc2V0Zm9udFxzbWFsbHR0XHR0c2hhcGV7OX17MTAwMH0KLVxzZXRmb250XHNtYWxsYmZcYmZzaGFwZXsxMH17OTAwfQotXHNldGZvbnRcc21hbGxpdFxpdHNoYXBlezl9ezEwMDB9Ci1cc2V0Zm9udFxzbWFsbHNsXHNsc2hhcGV7OX17MTAwMH0KLVxzZXRmb250XHNtYWxsc2Zcc2ZzaGFwZXs5fXsxMDAwfQotXHNldGZvbnRcc21hbGxzY1xzY3NoYXBlezEwfXs5MDB9Ci1cc2V0Zm9udFxzbWFsbHR0c2xcdHRzbHNoYXBlezEwfXs5MDB9Citcc2V0Zm9udFxzbWFsbHJtXHJtc2hhcGV7OX17MTAwMH17T1QxfQorXHNldGZvbnRcc21hbGx0dFx0dHNoYXBlezl9ezEwMDB9e09UMVRUfQorXHNldGZvbnRcc21hbGxiZlxiZnNoYXBlezEwfXs5MDB9e09UMX0KK1xzZXRmb250XHNtYWxsaXRcaXRzaGFwZXs5fXsxMDAwfXtPVDFJVH0KK1xzZXRmb250XHNtYWxsc2xcc2xzaGFwZXs5fXsxMDAwfXtPVDF9Citcc2V0Zm9udFxzbWFsbHNmXHNmc2hhcGV7OX17MTAwMH17T1QxfQorXHNldGZvbnRcc21hbGxzY1xzY3NoYXBlezEwfXs5MDB9e09UMX0KK1xzZXRmb250XHNtYWxsdHRzbFx0dHNsc2hhcGV7MTB9ezkwMH17T1QxVFR9CiBcZm9udFxzbWFsbGk9Y21taTkKIFxmb250XHNtYWxsc3k9Y21zeTkKK1xkZWZcc21hbGxlY3NpemV7MDkwMH0KIAogJSBGb250cyBmb3Igc21hbGwgZXhhbXBsZXMgKDhwdCkuCiBcZGVmXHNtYWxsZXJub21pbmFsc2l6ZXs4cHR9Ci1cc2V0Zm9udFxzbWFsbGVycm1ccm1zaGFwZXs4fXsxMDAwfQotXHNldGZvbnRcc21hbGxlcnR0XHR0c2hhcGV7OH17MTAwMH0KLVxzZXRmb250XHNtYWxsZXJiZlxiZnNoYXBlezEwfXs4MDB9Ci1cc2V0Zm9udFxzbWFsbGVyaXRcaXRzaGFwZXs4fXsxMDAwfQotXHNldGZvbnRcc21hbGxlcnNsXHNsc2hhcGV7OH17MTAwMH0KLVxzZXRmb250XHNtYWxsZXJzZlxzZnNoYXBlezh9ezEwMDB9Ci1cc2V0Zm9udFxzbWFsbGVyc2Ncc2NzaGFwZXsxMH17ODAwfQotXHNldGZvbnRcc21hbGxlcnR0c2xcdHRzbHNoYXBlezEwfXs4MDB9Citcc2V0Zm9udFxzbWFsbGVycm1ccm1zaGFwZXs4fXsxMDAwfXtPVDF9Citcc2V0Zm9udFxzbWFsbGVydHRcdHRzaGFwZXs4fXsxMDAwfXtPVDFUVH0KK1xzZXRmb250XHNtYWxsZXJiZlxiZnNoYXBlezEwfXs4MDB9e09UMX0KK1xzZXRmb250XHNtYWxsZXJpdFxpdHNoYXBlezh9ezEwMDB9e09UMUlUfQorXHNldGZvbnRcc21hbGxlcnNsXHNsc2hhcGV7OH17MTAwMH17T1QxfQorXHNldGZvbnRcc21hbGxlcnNmXHNmc2hhcGV7OH17MTAwMH17T1QxfQorXHNldGZvbnRcc21hbGxlcnNjXHNjc2hhcGV7MTB9ezgwMH17T1QxfQorXHNldGZvbnRcc21hbGxlcnR0c2xcdHRzbHNoYXBlezEwfXs4MDB9e09UMVRUfQogXGZvbnRcc21hbGxlcmk9Y21taTgKIFxmb250XHNtYWxsZXJzeT1jbXN5OAorXGRlZlxzbWFsbGVyZWNzaXplezA4MDB9CiAKICUgRm9udHMgZm9yIHRpdGxlIHBhZ2UgKDIwLjRwdCk6CiBcZGVmXHRpdGxlbm9taW5hbHNpemV7MjBwdH0KLVxzZXRmb250XHRpdGxlcm1ccm1ic2hhcGV7MTJ9e1xtYWdzdGVwM30KLVxzZXRmb250XHRpdGxlaXRcaXRic2hhcGV7MTB9e1xtYWdzdGVwNH0KLVxzZXRmb250XHRpdGxlc2xcc2xic2hhcGV7MTB9e1xtYWdzdGVwNH0KLVxzZXRmb250XHRpdGxldHRcdHRic2hhcGV7MTJ9e1xtYWdzdGVwM30KLVxzZXRmb250XHRpdGxldHRzbFx0dHNsc2hhcGV7MTB9e1xtYWdzdGVwNH0KLVxzZXRmb250XHRpdGxlc2Zcc2Zic2hhcGV7MTd9e1xtYWdzdGVwMX0KK1xzZXRmb250XHRpdGxlcm1ccm1ic2hhcGV7MTJ9e1xtYWdzdGVwM317T1QxfQorXHNldGZvbnRcdGl0bGVpdFxpdGJzaGFwZXsxMH17XG1hZ3N0ZXA0fXtPVDFJVH0KK1xzZXRmb250XHRpdGxlc2xcc2xic2hhcGV7MTB9e1xtYWdzdGVwNH17T1QxfQorXHNldGZvbnRcdGl0bGV0dFx0dGJzaGFwZXsxMn17XG1hZ3N0ZXAzfXtPVDFUVH0KK1xzZXRmb250XHRpdGxldHRzbFx0dHNsc2hhcGV7MTB9e1xtYWdzdGVwNH17T1QxVFR9Citcc2V0Zm9udFx0aXRsZXNmXHNmYnNoYXBlezE3fXtcbWFnc3RlcDF9e09UMX0KIFxsZXRcdGl0bGViZj1cdGl0bGVybQotXHNldGZvbnRcdGl0bGVzY1xzY2JzaGFwZXsxMH17XG1hZ3N0ZXA0fQorXHNldGZvbnRcdGl0bGVzY1xzY2JzaGFwZXsxMH17XG1hZ3N0ZXA0fXtPVDF9CiBcZm9udFx0aXRsZWk9Y21taTEyIHNjYWxlZCBcbWFnc3RlcDMKIFxmb250XHRpdGxlc3k9Y21zeTEwIHNjYWxlZCBcbWFnc3RlcDQKLVxkZWZcYXV0aG9ycm17XHNlY3JtfQotXGRlZlxhdXRob3J0dHtcc2VjdHR9CitcZGVmXHRpdGxlZWNzaXplezIwNzR9CiAKICUgQ2hhcHRlciAoYW5kIHVubnVtYmVyZWQpIGZvbnRzICgxNy4yOHB0KS4KIFxkZWZcY2hhcG5vbWluYWxzaXplezE3cHR9Ci1cc2V0Zm9udFxjaGFwcm1ccm1ic2hhcGV7MTJ9e1xtYWdzdGVwMn0KLVxzZXRmb250XGNoYXBpdFxpdGJzaGFwZXsxMH17XG1hZ3N0ZXAzfQotXHNldGZvbnRcY2hhcHNsXHNsYnNoYXBlezEwfXtcbWFnc3RlcDN9Ci1cc2V0Zm9udFxjaGFwdHRcdHRic2hhcGV7MTJ9e1xtYWdzdGVwMn0KLVxzZXRmb250XGNoYXB0dHNsXHR0c2xzaGFwZXsxMH17XG1hZ3N0ZXAzfQotXHNldGZvbnRcY2hhcHNmXHNmYnNoYXBlezE3fXsxMDAwfQorXHNldGZvbnRcY2hhcHJtXHJtYnNoYXBlezEyfXtcbWFnc3RlcDJ9e09UMX0KK1xzZXRmb250XGNoYXBpdFxpdGJzaGFwZXsxMH17XG1hZ3N0ZXAzfXtPVDFJVH0KK1xzZXRmb250XGNoYXBzbFxzbGJzaGFwZXsxMH17XG1hZ3N0ZXAzfXtPVDF9Citcc2V0Zm9udFxjaGFwdHRcdHRic2hhcGV7MTJ9e1xtYWdzdGVwMn17T1QxVFR9Citcc2V0Zm9udFxjaGFwdHRzbFx0dHNsc2hhcGV7MTB9e1xtYWdzdGVwM317T1QxVFR9Citcc2V0Zm9udFxjaGFwc2Zcc2Zic2hhcGV7MTd9ezEwMDB9e09UMX0KIFxsZXRcY2hhcGJmPVxjaGFwcm0KLVxzZXRmb250XGNoYXBzY1xzY2JzaGFwZXsxMH17XG1hZ3N0ZXAzfQorXHNldGZvbnRcY2hhcHNjXHNjYnNoYXBlezEwfXtcbWFnc3RlcDN9e09UMX0KIFxmb250XGNoYXBpPWNtbWkxMiBzY2FsZWQgXG1hZ3N0ZXAyCiBcZm9udFxjaGFwc3k9Y21zeTEwIHNjYWxlZCBcbWFnc3RlcDMKK1xkZWZcY2hhcGVjc2l6ZXsxNzI4fQogCiAlIFNlY3Rpb24gZm9udHMgKDE0LjRwdCkuCiBcZGVmXHNlY25vbWluYWxzaXplezE0cHR9Ci1cc2V0Zm9udFxzZWNybVxybWJzaGFwZXsxMn17XG1hZ3N0ZXAxfQotXHNldGZvbnRcc2VjaXRcaXRic2hhcGV7MTB9e1xtYWdzdGVwMn0KLVxzZXRmb250XHNlY3NsXHNsYnNoYXBlezEwfXtcbWFnc3RlcDJ9Ci1cc2V0Zm9udFxzZWN0dFx0dGJzaGFwZXsxMn17XG1hZ3N0ZXAxfQotXHNldGZvbnRcc2VjdHRzbFx0dHNsc2hhcGV7MTB9e1xtYWdzdGVwMn0KLVxzZXRmb250XHNlY3NmXHNmYnNoYXBlezEyfXtcbWFnc3RlcDF9Citcc2V0Zm9udFxzZWNybVxybWJzaGFwZXsxMn17XG1hZ3N0ZXAxfXtPVDF9Citcc2V0Zm9udFxzZWNpdFxpdGJzaGFwZXsxMH17XG1hZ3N0ZXAyfXtPVDFJVH0KK1xzZXRmb250XHNlY3NsXHNsYnNoYXBlezEwfXtcbWFnc3RlcDJ9e09UMX0KK1xzZXRmb250XHNlY3R0XHR0YnNoYXBlezEyfXtcbWFnc3RlcDF9e09UMVRUfQorXHNldGZvbnRcc2VjdHRzbFx0dHNsc2hhcGV7MTB9e1xtYWdzdGVwMn17T1QxVFR9Citcc2V0Zm9udFxzZWNzZlxzZmJzaGFwZXsxMn17XG1hZ3N0ZXAxfXtPVDF9CiBcbGV0XHNlY2JmXHNlY3JtCi1cc2V0Zm9udFxzZWNzY1xzY2JzaGFwZXsxMH17XG1hZ3N0ZXAyfQorXHNldGZvbnRcc2Vjc2Ncc2Nic2hhcGV7MTB9e1xtYWdzdGVwMn17T1QxfQogXGZvbnRcc2VjaT1jbW1pMTIgc2NhbGVkIFxtYWdzdGVwMQogXGZvbnRcc2Vjc3k9Y21zeTEwIHNjYWxlZCBcbWFnc3RlcDIKK1xkZWZcc2VjZWNzaXplezE0NDB9CiAKICUgU3Vic2VjdGlvbiBmb250cyAoMTMuMTVwdCkuCiBcZGVmXHNzZWNub21pbmFsc2l6ZXsxM3B0fQotXHNldGZvbnRcc3NlY3JtXHJtYnNoYXBlezEyfXtcbWFnc3RlcGhhbGZ9Ci1cc2V0Zm9udFxzc2VjaXRcaXRic2hhcGV7MTB9ezEzMTV9Ci1cc2V0Zm9udFxzc2Vjc2xcc2xic2hhcGV7MTB9ezEzMTV9Ci1cc2V0Zm9udFxzc2VjdHRcdHRic2hhcGV7MTJ9e1xtYWdzdGVwaGFsZn0KLVxzZXRmb250XHNzZWN0dHNsXHR0c2xzaGFwZXsxMH17MTMxNX0KLVxzZXRmb250XHNzZWNzZlxzZmJzaGFwZXsxMn17XG1hZ3N0ZXBoYWxmfQorXHNldGZvbnRcc3NlY3JtXHJtYnNoYXBlezEyfXtcbWFnc3RlcGhhbGZ9e09UMX0KK1xzZXRmb250XHNzZWNpdFxpdGJzaGFwZXsxMH17MTMxNX17T1QxSVR9Citcc2V0Zm9udFxzc2Vjc2xcc2xic2hhcGV7MTB9ezEzMTV9e09UMX0KK1xzZXRmb250XHNzZWN0dFx0dGJzaGFwZXsxMn17XG1hZ3N0ZXBoYWxmfXtPVDFUVH0KK1xzZXRmb250XHNzZWN0dHNsXHR0c2xzaGFwZXsxMH17MTMxNX17T1QxVFR9Citcc2V0Zm9udFxzc2Vjc2Zcc2Zic2hhcGV7MTJ9e1xtYWdzdGVwaGFsZn17T1QxfQogXGxldFxzc2VjYmZcc3NlY3JtCi1cc2V0Zm9udFxzc2Vjc2Ncc2Nic2hhcGV7MTB9ezEzMTV9Citcc2V0Zm9udFxzc2Vjc2Ncc2Nic2hhcGV7MTB9ezEzMTV9e09UMX0KIFxmb250XHNzZWNpPWNtbWkxMiBzY2FsZWQgXG1hZ3N0ZXBoYWxmCiBcZm9udFxzc2Vjc3k9Y21zeTEwIHNjYWxlZCAxMzE1CitcZGVmXHNzZWNlY3NpemV7MTIwMH0KIAogJSBSZWR1Y2VkIGZvbnRzIGZvciBAYWNybyBpbiB0ZXh0ICgxMHB0KS4KIFxkZWZccmVkdWNlZG5vbWluYWxzaXplezEwcHR9Ci1cc2V0Zm9udFxyZWR1Y2Vkcm1ccm1zaGFwZXsxMH17MTAwMH0KLVxzZXRmb250XHJlZHVjZWR0dFx0dHNoYXBlezEwfXsxMDAwfQotXHNldGZvbnRccmVkdWNlZGJmXGJmc2hhcGV7MTB9ezEwMDB9Ci1cc2V0Zm9udFxyZWR1Y2VkaXRcaXRzaGFwZXsxMH17MTAwMH0KLVxzZXRmb250XHJlZHVjZWRzbFxzbHNoYXBlezEwfXsxMDAwfQotXHNldGZvbnRccmVkdWNlZHNmXHNmc2hhcGV7MTB9ezEwMDB9Ci1cc2V0Zm9udFxyZWR1Y2Vkc2Ncc2NzaGFwZXsxMH17MTAwMH0KLVxzZXRmb250XHJlZHVjZWR0dHNsXHR0c2xzaGFwZXsxMH17MTAwMH0KK1xzZXRmb250XHJlZHVjZWRybVxybXNoYXBlezEwfXsxMDAwfXtPVDF9Citcc2V0Zm9udFxyZWR1Y2VkdHRcdHRzaGFwZXsxMH17MTAwMH17T1QxVFR9Citcc2V0Zm9udFxyZWR1Y2VkYmZcYmZzaGFwZXsxMH17MTAwMH17T1QxfQorXHNldGZvbnRccmVkdWNlZGl0XGl0c2hhcGV7MTB9ezEwMDB9e09UMUlUfQorXHNldGZvbnRccmVkdWNlZHNsXHNsc2hhcGV7MTB9ezEwMDB9e09UMX0KK1xzZXRmb250XHJlZHVjZWRzZlxzZnNoYXBlezEwfXsxMDAwfXtPVDF9Citcc2V0Zm9udFxyZWR1Y2Vkc2Ncc2NzaGFwZXsxMH17MTAwMH17T1QxfQorXHNldGZvbnRccmVkdWNlZHR0c2xcdHRzbHNoYXBlezEwfXsxMDAwfXtPVDFUVH0KIFxmb250XHJlZHVjZWRpPWNtbWkxMAogXGZvbnRccmVkdWNlZHN5PWNtc3kxMAorXGRlZlxyZWR1Y2VkZWNzaXplezEwMDB9CisKK1x0ZXh0bGVhZGluZyA9IDEzLjJwdCAlIGxpbmUgc3BhY2luZyBmb3IgMTFwdCBDTQorXHRleHRmb250cyAgICAgICAgICAgICUgcmVzZXQgdGhlIGN1cnJlbnQgZm9udHMKK1xybQorfSAlIGVuZCBvZiAxMXB0IHRleHQgZm9udCBzaXplIGRlZmluaXRpb25zLCBcZGVmaW5ldGV4dGZvbnRzaXpleGkKKworCislIERlZmluaXRpb25zIHRvIG1ha2UgdGhlIG1haW4gdGV4dCBiZSAxMHB0IENvbXB1dGVyIE1vZGVybiwgd2l0aAorJSBzZWN0aW9uLCBjaGFwdGVyLCBldGMuLCBzaXplcyBmb2xsb3dpbmcgc3VpdC4gIFRoaXMgaXMgZm9yIHRoZSBHTlUKKyUgUHJlc3MgcHJpbnRpbmcgb2YgdGhlIEVtYWNzIDIyIG1hbnVhbC4gIE1heWJlIG90aGVyIG1hbnVhbHMgaW4gdGhlCislIGZ1dHVyZS4gIFVzZWQgd2l0aCBAc21hbGxib29rLCB3aGljaCBzZXRzIHRoZSBsZWFkaW5nIHRvIDEycHQuCislCitcZGVmXGRlZmluZXRleHRmb250c2l6ZXh7JQorJSBUZXh0IGZvbnRzICgxMHB0KS4KK1xkZWZcdGV4dG5vbWluYWxzaXplezEwcHR9CitcZWRlZlxtYWlubWFnc3RlcHsxMDAwfQorXHNldGZvbnRcdGV4dHJtXHJtc2hhcGV7MTB9e1xtYWlubWFnc3RlcH17T1QxfQorXHNldGZvbnRcdGV4dHR0XHR0c2hhcGV7MTB9e1xtYWlubWFnc3RlcH17T1QxVFR9Citcc2V0Zm9udFx0ZXh0YmZcYmZzaGFwZXsxMH17XG1haW5tYWdzdGVwfXtPVDF9Citcc2V0Zm9udFx0ZXh0aXRcaXRzaGFwZXsxMH17XG1haW5tYWdzdGVwfXtPVDFJVH0KK1xzZXRmb250XHRleHRzbFxzbHNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9e09UMX0KK1xzZXRmb250XHRleHRzZlxzZnNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9e09UMX0KK1xzZXRmb250XHRleHRzY1xzY3NoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9e09UMX0KK1xzZXRmb250XHRleHR0dHNsXHR0c2xzaGFwZXsxMH17XG1haW5tYWdzdGVwfXtPVDFUVH0KK1xmb250XHRleHRpPWNtbWkxMCBzY2FsZWQgXG1haW5tYWdzdGVwCitcZm9udFx0ZXh0c3k9Y21zeTEwIHNjYWxlZCBcbWFpbm1hZ3N0ZXAKK1xkZWZcdGV4dGVjc2l6ZXsxMDAwfQorCislIEEgZmV3IGZvbnRzIGZvciBAZGVmdW4gbmFtZXMgYW5kIGFyZ3MuCitcc2V0Zm9udFxkZWZiZlxiZnNoYXBlezEwfXtcbWFnc3RlcGhhbGZ9e09UMX0KK1xzZXRmb250XGRlZnR0XHR0c2hhcGV7MTB9e1xtYWdzdGVwaGFsZn17T1QxVFR9Citcc2V0Zm9udFxkZWZ0dHNsXHR0c2xzaGFwZXsxMH17XG1hZ3N0ZXBoYWxmfXtPVDFUVH0KK1xkZWZcZGZ7XGxldFx0ZW50dD1cZGVmdHQgXGxldFx0ZW5iZiA9IFxkZWZiZiBcbGV0XHRlbnR0c2w9XGRlZnR0c2wgXGJmfQorCislIEZvbnRzIGZvciBpbmRpY2VzLCBmb290bm90ZXMsIHNtYWxsIGV4YW1wbGVzICg5cHQpLgorXGRlZlxzbWFsbG5vbWluYWxzaXplezlwdH0KK1xzZXRmb250XHNtYWxscm1ccm1zaGFwZXs5fXsxMDAwfXtPVDF9Citcc2V0Zm9udFxzbWFsbHR0XHR0c2hhcGV7OX17MTAwMH17T1QxVFR9Citcc2V0Zm9udFxzbWFsbGJmXGJmc2hhcGV7MTB9ezkwMH17T1QxfQorXHNldGZvbnRcc21hbGxpdFxpdHNoYXBlezl9ezEwMDB9e09UMUlUfQorXHNldGZvbnRcc21hbGxzbFxzbHNoYXBlezl9ezEwMDB9e09UMX0KK1xzZXRmb250XHNtYWxsc2Zcc2ZzaGFwZXs5fXsxMDAwfXtPVDF9Citcc2V0Zm9udFxzbWFsbHNjXHNjc2hhcGV7MTB9ezkwMH17T1QxfQorXHNldGZvbnRcc21hbGx0dHNsXHR0c2xzaGFwZXsxMH17OTAwfXtPVDFUVH0KK1xmb250XHNtYWxsaT1jbW1pOQorXGZvbnRcc21hbGxzeT1jbXN5OQorXGRlZlxzbWFsbGVjc2l6ZXswOTAwfQorCislIEZvbnRzIGZvciBzbWFsbCBleGFtcGxlcyAoOHB0KS4KK1xkZWZcc21hbGxlcm5vbWluYWxzaXplezhwdH0KK1xzZXRmb250XHNtYWxsZXJybVxybXNoYXBlezh9ezEwMDB9e09UMX0KK1xzZXRmb250XHNtYWxsZXJ0dFx0dHNoYXBlezh9ezEwMDB9e09UMVRUfQorXHNldGZvbnRcc21hbGxlcmJmXGJmc2hhcGV7MTB9ezgwMH17T1QxfQorXHNldGZvbnRcc21hbGxlcml0XGl0c2hhcGV7OH17MTAwMH17T1QxSVR9Citcc2V0Zm9udFxzbWFsbGVyc2xcc2xzaGFwZXs4fXsxMDAwfXtPVDF9Citcc2V0Zm9udFxzbWFsbGVyc2Zcc2ZzaGFwZXs4fXsxMDAwfXtPVDF9Citcc2V0Zm9udFxzbWFsbGVyc2Ncc2NzaGFwZXsxMH17ODAwfXtPVDF9Citcc2V0Zm9udFxzbWFsbGVydHRzbFx0dHNsc2hhcGV7MTB9ezgwMH17T1QxVFR9CitcZm9udFxzbWFsbGVyaT1jbW1pOAorXGZvbnRcc21hbGxlcnN5PWNtc3k4CitcZGVmXHNtYWxsZXJlY3NpemV7MDgwMH0KKworJSBGb250cyBmb3IgdGl0bGUgcGFnZSAoMjAuNHB0KToKK1xkZWZcdGl0bGVub21pbmFsc2l6ZXsyMHB0fQorXHNldGZvbnRcdGl0bGVybVxybWJzaGFwZXsxMn17XG1hZ3N0ZXAzfXtPVDF9Citcc2V0Zm9udFx0aXRsZWl0XGl0YnNoYXBlezEwfXtcbWFnc3RlcDR9e09UMUlUfQorXHNldGZvbnRcdGl0bGVzbFxzbGJzaGFwZXsxMH17XG1hZ3N0ZXA0fXtPVDF9Citcc2V0Zm9udFx0aXRsZXR0XHR0YnNoYXBlezEyfXtcbWFnc3RlcDN9e09UMVRUfQorXHNldGZvbnRcdGl0bGV0dHNsXHR0c2xzaGFwZXsxMH17XG1hZ3N0ZXA0fXtPVDFUVH0KK1xzZXRmb250XHRpdGxlc2Zcc2Zic2hhcGV7MTd9e1xtYWdzdGVwMX17T1QxfQorXGxldFx0aXRsZWJmPVx0aXRsZXJtCitcc2V0Zm9udFx0aXRsZXNjXHNjYnNoYXBlezEwfXtcbWFnc3RlcDR9e09UMX0KK1xmb250XHRpdGxlaT1jbW1pMTIgc2NhbGVkIFxtYWdzdGVwMworXGZvbnRcdGl0bGVzeT1jbXN5MTAgc2NhbGVkIFxtYWdzdGVwNAorXGRlZlx0aXRsZWVjc2l6ZXsyMDc0fQorCislIENoYXB0ZXIgZm9udHMgKDE0LjRwdCkuCitcZGVmXGNoYXBub21pbmFsc2l6ZXsxNHB0fQorXHNldGZvbnRcY2hhcHJtXHJtYnNoYXBlezEyfXtcbWFnc3RlcDF9e09UMX0KK1xzZXRmb250XGNoYXBpdFxpdGJzaGFwZXsxMH17XG1hZ3N0ZXAyfXtPVDFJVH0KK1xzZXRmb250XGNoYXBzbFxzbGJzaGFwZXsxMH17XG1hZ3N0ZXAyfXtPVDF9Citcc2V0Zm9udFxjaGFwdHRcdHRic2hhcGV7MTJ9e1xtYWdzdGVwMX17T1QxVFR9Citcc2V0Zm9udFxjaGFwdHRzbFx0dHNsc2hhcGV7MTB9e1xtYWdzdGVwMn17T1QxVFR9Citcc2V0Zm9udFxjaGFwc2Zcc2Zic2hhcGV7MTJ9e1xtYWdzdGVwMX17T1QxfQorXGxldFxjaGFwYmZcY2hhcHJtCitcc2V0Zm9udFxjaGFwc2Ncc2Nic2hhcGV7MTB9e1xtYWdzdGVwMn17T1QxfQorXGZvbnRcY2hhcGk9Y21taTEyIHNjYWxlZCBcbWFnc3RlcDEKK1xmb250XGNoYXBzeT1jbXN5MTAgc2NhbGVkIFxtYWdzdGVwMgorXGRlZlxjaGFwZWNzaXplezE0NDB9CisKKyUgU2VjdGlvbiBmb250cyAoMTJwdCkuCitcZGVmXHNlY25vbWluYWxzaXplezEycHR9Citcc2V0Zm9udFxzZWNybVxybWJzaGFwZXsxMn17MTAwMH17T1QxfQorXHNldGZvbnRcc2VjaXRcaXRic2hhcGV7MTB9e1xtYWdzdGVwMX17T1QxSVR9Citcc2V0Zm9udFxzZWNzbFxzbGJzaGFwZXsxMH17XG1hZ3N0ZXAxfXtPVDF9Citcc2V0Zm9udFxzZWN0dFx0dGJzaGFwZXsxMn17MTAwMH17T1QxVFR9Citcc2V0Zm9udFxzZWN0dHNsXHR0c2xzaGFwZXsxMH17XG1hZ3N0ZXAxfXtPVDFUVH0KK1xzZXRmb250XHNlY3NmXHNmYnNoYXBlezEyfXsxMDAwfXtPVDF9CitcbGV0XHNlY2JmXHNlY3JtCitcc2V0Zm9udFxzZWNzY1xzY2JzaGFwZXsxMH17XG1hZ3N0ZXAxfXtPVDF9CitcZm9udFxzZWNpPWNtbWkxMgorXGZvbnRcc2Vjc3k9Y21zeTEwIHNjYWxlZCBcbWFnc3RlcDEKK1xkZWZcc2VjZWNzaXplezEyMDB9CisKKyUgU3Vic2VjdGlvbiBmb250cyAoMTBwdCkuCitcZGVmXHNzZWNub21pbmFsc2l6ZXsxMHB0fQorXHNldGZvbnRcc3NlY3JtXHJtYnNoYXBlezEwfXsxMDAwfXtPVDF9Citcc2V0Zm9udFxzc2VjaXRcaXRic2hhcGV7MTB9ezEwMDB9e09UMUlUfQorXHNldGZvbnRcc3NlY3NsXHNsYnNoYXBlezEwfXsxMDAwfXtPVDF9Citcc2V0Zm9udFxzc2VjdHRcdHRic2hhcGV7MTB9ezEwMDB9e09UMVRUfQorXHNldGZvbnRcc3NlY3R0c2xcdHRzbHNoYXBlezEwfXsxMDAwfXtPVDFUVH0KK1xzZXRmb250XHNzZWNzZlxzZmJzaGFwZXsxMH17MTAwMH17T1QxfQorXGxldFxzc2VjYmZcc3NlY3JtCitcc2V0Zm9udFxzc2Vjc2Ncc2Nic2hhcGV7MTB9ezEwMDB9e09UMX0KK1xmb250XHNzZWNpPWNtbWkxMAorXGZvbnRcc3NlY3N5PWNtc3kxMAorXGRlZlxzc2VjZWNzaXplezEwMDB9CisKKyUgUmVkdWNlZCBmb250cyBmb3IgQGFjcm8gaW4gdGV4dCAoOXB0KS4KK1xkZWZccmVkdWNlZG5vbWluYWxzaXplezlwdH0KK1xzZXRmb250XHJlZHVjZWRybVxybXNoYXBlezl9ezEwMDB9e09UMX0KK1xzZXRmb250XHJlZHVjZWR0dFx0dHNoYXBlezl9ezEwMDB9e09UMVRUfQorXHNldGZvbnRccmVkdWNlZGJmXGJmc2hhcGV7MTB9ezkwMH17T1QxfQorXHNldGZvbnRccmVkdWNlZGl0XGl0c2hhcGV7OX17MTAwMH17T1QxSVR9Citcc2V0Zm9udFxyZWR1Y2Vkc2xcc2xzaGFwZXs5fXsxMDAwfXtPVDF9Citcc2V0Zm9udFxyZWR1Y2Vkc2Zcc2ZzaGFwZXs5fXsxMDAwfXtPVDF9Citcc2V0Zm9udFxyZWR1Y2Vkc2Ncc2NzaGFwZXsxMH17OTAwfXtPVDF9Citcc2V0Zm9udFxyZWR1Y2VkdHRzbFx0dHNsc2hhcGV7MTB9ezkwMH17T1QxVFR9CitcZm9udFxyZWR1Y2VkaT1jbW1pOQorXGZvbnRccmVkdWNlZHN5PWNtc3k5CitcZGVmXHJlZHVjZWRlY3NpemV7MDkwMH0KKworXGRpdmlkZVxwYXJza2lwIGJ5IDIgICUgcmVkdWNlIHNwYWNlIGJldHdlZW4gcGFyYWdyYXBocworXHRleHRsZWFkaW5nID0gMTJwdCAgICUgbGluZSBzcGFjaW5nIGZvciAxMHB0IENNCitcdGV4dGZvbnRzICAgICAgICAgICAgJSByZXNldCB0aGUgY3VycmVudCBmb250cworXHJtCit9ICUgZW5kIG9mIDEwcHQgdGV4dCBmb250IHNpemUgZGVmaW5pdGlvbnMsIFxkZWZpbmV0ZXh0Zm9udHNpemV4CisKKworJSBXZSBwcm92aWRlIHRoZSB1c2VyLWxldmVsIGNvbW1hbmQKKyUgICBAZm9udHRleHRzaXplIDEwCislIChvciAxMSkgdG8gcmVkZWZpbmUgdGhlIHRleHQgZm9udCBzaXplLiAgcHQgaXMgYXNzdW1lZC4KKyUKK1xkZWZceGl3b3JkezExfQorXGRlZlx4d29yZHsxMH0KK1xkZWZceHdvcmRwdHsxMHB0fQorJQorXHBhcnNlYXJnZGVmXGZvbnR0ZXh0c2l6ZXslCisgIFxkZWZcdGV4dHNpemVhcmd7IzF9JQorICAlXHdsb2d7ZG9pbmcgQGZvbnR0ZXh0c2l6ZSBcdGV4dHNpemVhcmd9JQorICAlCisgICUgU2V0IFxnbG9iYWxkZWZzIHNvIHRoYXQgZG9jdW1lbnRzIGNhbiB1c2UgdGhpcyBpbnNpZGUgQHRleCwgc2luY2UKKyAgJSBtYWtlaW5mbyA0LjggZG9lcyBub3Qgc3VwcG9ydCBpdCwgYnV0IHdlIG5lZWQgaXQgbm9uZXRoZWxlc3MuCisgICUKKyBcYmVnaW5ncm91cCBcZ2xvYmFsZGVmcz0xCisgIFxpZnhcdGV4dHNpemVhcmdceHdvcmQgXGRlZmluZXRleHRmb250c2l6ZXgKKyAgXGVsc2UgXGlmeFx0ZXh0c2l6ZWFyZ1x4aXdvcmQgXGRlZmluZXRleHRmb250c2l6ZXhpCisgIFxlbHNlCisgICAgXGVycmhlbHA9XEVNc2ltcGxlCisgICAgXGVycm1lc3NhZ2V7QGZvbnR0ZXh0c2l6ZSBvbmx5IHN1cHBvcnRzIGAxMCcgb3IgYDExJywgbm90IGBcdGV4dHNpemVhcmcnfQorICBcZmlcZmkKKyBcZW5kZ3JvdXAKK30KKwogCiAlIEluIG9yZGVyIGZvciB0aGUgZm9udCBjaGFuZ2VzIHRvIGFmZmVjdCBtb3N0IG1hdGggc3ltYm9scyBhbmQgbGV0dGVycywKICUgd2UgaGF2ZSB0byBkZWZpbmUgdGhlIFx0ZXh0Zm9udCBvZiB0aGUgc3RhbmRhcmQgZmFtaWxpZXMuICBTaW5jZQpAQCAtMTY4MSw4ICsyMTI0LDggQEAKICAgXGxldFx0ZW50dHNsPVx0aXRsZXR0c2wKICAgXGRlZlxjdXJmb250c2l6ZXt0aXRsZX0lCiAgIFxkZWZcbHNpemV7Y2hhcH1cZGVmXGxsbHNpemV7c3Vic2VjfSUKLSAgXHJlc2V0bWF0aGZvbnRzIFxzZXRsZWFkaW5nezI1cHR9fQotXGRlZlx0aXRsZWZvbnQjMXt7XHRpdGxlZm9udHNccm0gIzF9fQorICBccmVzZXRtYXRoZm9udHMgXHNldGxlYWRpbmd7MjdwdH19CitcZGVmXHRpdGxlZm9udCMxe3tcdGl0bGVmb250c1xybWlzYm9sZCAjMX19CiBcZGVmXGNoYXBmb250c3slCiAgIFxsZXRcdGVucm09XGNoYXBybSBcbGV0XHRlbml0PVxjaGFwaXQgXGxldFx0ZW5zbD1cY2hhcHNsCiAgIFxsZXRcdGVuYmY9XGNoYXBiZiBcbGV0XHRlbnR0PVxjaGFwdHQgXGxldFxzbWFsbGNhcHM9XGNoYXBzYwpAQCAtMTczMyw2ICsyMTc2LDE2IEBACiAgIFxkZWZcbHNpemV7c21hbGxlcn1cZGVmXGxsbHNpemV7c21hbGxlcn0lCiAgIFxyZXNldG1hdGhmb250cyBcc2V0bGVhZGluZ3s5LjVwdH19CiAKKyUgRm9udHMgZm9yIHNob3J0IHRhYmxlIG9mIGNvbnRlbnRzLgorXHNldGZvbnRcc2hvcnRjb250cm1ccm1zaGFwZXsxMn17MTAwMH17T1QxfQorXHNldGZvbnRcc2hvcnRjb250YmZcYmZzaGFwZXsxMH17XG1hZ3N0ZXAxfXtPVDF9ICAlIG5vIGNtYjEyCitcc2V0Zm9udFxzaG9ydGNvbnRzbFxzbHNoYXBlezEyfXsxMDAwfXtPVDF9Citcc2V0Zm9udFxzaG9ydGNvbnR0dFx0dHNoYXBlezEyfXsxMDAwfXtPVDFUVH0KKworJSBEZWZpbmUgdGhlc2UganVzdCBzbyB0aGV5IGNhbiBiZSBlYXNpbHkgY2hhbmdlZCBmb3Igb3RoZXIgZm9udHMuCitcZGVmXGFuZ2xlbGVmdHskXGxhbmdsZSR9CitcZGVmXGFuZ2xlcmlnaHR7JFxyYW5nbGUkfQorCiAlIFNldCB0aGUgZm9udHMgdG8gdXNlIHdpdGggdGhlIEBzbWFsbC4uLiBlbnZpcm9ubWVudHMuCiBcbGV0XHNtYWxsZXhhbXBsZWZvbnRzID0gXHNtYWxsZm9udHMKIApAQCAtMTc0Niw1MyArMjE5OSwyMTUgQEAKICUKICUgQnkgdGhlIHdheSwgZm9yIGNvbXBhcmlzb24sIGhlcmUncyB3aGF0IGZpdHMgd2l0aCBAZXhhbXBsZSAoMTBwdCk6CiAlICAgOC41eDExPTcxICBzbWFsbGJvb2s9NjAgIGE0PTc1ICBhNT01OAotJQotJSBJIHdpc2ggdGhlIFVTQSB1c2VkIEE0IHBhcGVyLgogJSAtLWthcmwsIDI0amFuMDMuCiAKLQogJSBTZXQgdXAgdGhlIGRlZmF1bHQgZm9udHMsIHNvIHdlIGNhbiB1c2UgdGhlbSBmb3IgY3JlYXRpbmcgYm94ZXMuCiAlCi1cdGV4dGZvbnRzIFxybQorXGRlZmluZXRleHRmb250c2l6ZXhpCiAKLSUgRGVmaW5lIHRoZXNlIHNvIHRoZXkgY2FuIGJlIGVhc2lseSBjaGFuZ2VkIGZvciBvdGhlciBmb250cy4KLVxkZWZcYW5nbGVsZWZ0eyRcbGFuZ2xlJH0KLVxkZWZcYW5nbGVyaWdodHskXHJhbmdsZSR9CisKK1xtZXNzYWdle21hcmt1cCx9CisKKyUgQ2hlY2sgaWYgd2UgYXJlIGN1cnJlbnRseSB1c2luZyBhIHR5cGV3cml0ZXIgZm9udC4gIFNpbmNlIGFsbCB0aGUKKyUgQ29tcHV0ZXIgTW9kZXJuIHR5cGV3cml0ZXIgZm9udHMgaGF2ZSB6ZXJvIGludGVyd29yZCBzdHJldGNoIChhbmQKKyUgc2hyaW5rKSwgYW5kIGl0IGlzIHJlYXNvbmFibGUgdG8gZXhwZWN0IGFsbCB0eXBld3JpdGVyIGZvbnRzIHRvIGhhdmUKKyUgdGhpcyBwcm9wZXJ0eSwgd2UgY2FuIGNoZWNrIHRoYXQgZm9udCBwYXJhbWV0ZXIuCislCitcZGVmXGlmbW9ub3NwYWNle1xpZmRpbVxmb250ZGltZW4zXGZvbnQ9MHB0IH0KKworJSBNYXJrdXAgc3R5bGUgaW5mcmFzdHJ1Y3R1cmUuICBcZGVmbWFya3Vwc3R5bGVzZXR1cFxJTklUTUFDUk8gd2lsbAorJSBkZWZpbmUgYW5kIHJlZ2lzdGVyIFxJTklUTUFDUk8gdG8gYmUgY2FsbGVkIG9uIG1hcmt1cCBzdHlsZSBjaGFuZ2VzLgorJSBcSU5JVE1BQ1JPIGNhbiBjaGVjayBcY3VycmVudG1hcmt1cHN0eWxlIGZvciB0aGUgaW5uZXJtb3N0CislIHN0eWxlIGFuZCB0aGUgc2V0IG9mIFxpZm1hcmt1cFNUWUxFIHN3aXRjaGVzIGZvciBhbGwgc3R5bGVzCislIGN1cnJlbnRseSBpbiBlZmZlY3QuCitcbmV3aWZcaWZtYXJrdXB2YXIKK1xuZXdpZlxpZm1hcmt1cHNhbXAKK1xuZXdpZlxpZm1hcmt1cGtleQorJVxuZXdpZlxpZm1hcmt1cGZpbGUgJSBAZmlsZSA9PSBAc2FtcC4KKyVcbmV3aWZcaWZtYXJrdXBvcHRpb24gJSBAb3B0aW9uID09IEBzYW1wLgorXG5ld2lmXGlmbWFya3VwY29kZQorXG5ld2lmXGlmbWFya3Vwa2JkCislXG5ld2lmXGlmbWFya3VwZW52ICUgQGVudiA9PSBAY29kZS4KKyVcbmV3aWZcaWZtYXJrdXBjb21tYW5kICUgQGNvbW1hbmQgPT0gQGNvZGUuCitcbmV3aWZcaWZtYXJrdXB0ZXggJSBAdGV4IChhbmQgcGFydCBvZiBAbWF0aCwgZm9yIG5vdykuCitcbmV3aWZcaWZtYXJrdXBleGFtcGxlCitcbmV3aWZcaWZtYXJrdXB2ZXJiCitcbmV3aWZcaWZtYXJrdXB2ZXJiYXRpbQorCitcbGV0XGN1cnJlbnRtYXJrdXBzdHlsZVxlbXB0eQorCitcZGVmXHNldHVwbWFya3Vwc3R5bGUjMXslCisgIFxjc25hbWUgbWFya3VwIzF0cnVlXGVuZGNzbmFtZQorICBcZGVmXGN1cnJlbnRtYXJrdXBzdHlsZXsjMX0lCisgIFxtYXJrdXBzdHlsZXNldHVwCit9CisKK1xsZXRcbWFya3Vwc3R5bGVzZXR1cFxlbXB0eQorCitcZGVmXGRlZm1hcmt1cHN0eWxlc2V0dXAjMXslCisgIFxleHBhbmRhZnRlclxkZWZcZXhwYW5kYWZ0ZXJcbWFya3Vwc3R5bGVzZXR1cAorICAgIFxleHBhbmRhZnRlcntcbWFya3Vwc3R5bGVzZXR1cCAjMX0lCisgIFxkZWYjMSUKK30KKworJSBNYXJrdXAgc3R5bGUgc2V0dXAgZm9yIGxlZnQgYW5kIHJpZ2h0IHF1b3Rlcy4KK1xkZWZtYXJrdXBzdHlsZXNldHVwXG1hcmt1cHNldHVwbHF7JQorICBcZXhwYW5kYWZ0ZXJcbGV0XGV4cGFuZGFmdGVyIFx0ZW1wCisgICAgXGNzbmFtZSBtYXJrdXBzZXR1cGxxXGN1cnJlbnRtYXJrdXBzdHlsZVxlbmRjc25hbWUKKyAgXGlmeFx0ZW1wXHJlbGF4IFxtYXJrdXBzZXR1cGxxZGVmYXVsdCBcZWxzZSBcdGVtcCBcZmkKK30KKworXGRlZm1hcmt1cHN0eWxlc2V0dXBcbWFya3Vwc2V0dXBycXslCisgIFxleHBhbmRhZnRlclxsZXRcZXhwYW5kYWZ0ZXIgXHRlbXAKKyAgICBcY3NuYW1lIG1hcmt1cHNldHVwcnFcY3VycmVudG1hcmt1cHN0eWxlXGVuZGNzbmFtZQorICBcaWZ4XHRlbXBccmVsYXggXG1hcmt1cHNldHVwcnFkZWZhdWx0IFxlbHNlIFx0ZW1wIFxmaQorfQorCit7CitcY2F0Y29kZWBcJz1cYWN0aXZlCitcY2F0Y29kZWBcYD1cYWN0aXZlCisKK1xnZGVmXG1hcmt1cHNldHVwbHFkZWZhdWx0e1xsZXRgXGxxfQorXGdkZWZcbWFya3Vwc2V0dXBycWRlZmF1bHR7XGxldCdccnF9CisKK1xnZGVmXG1hcmt1cHNldGNvZGVxdW90ZWxlZnR7XGxldGBcY29kZXF1b3RlbGVmdH0KK1xnZGVmXG1hcmt1cHNldGNvZGVxdW90ZXJpZ2h0e1xsZXQnXGNvZGVxdW90ZXJpZ2h0fQorCitcZ2RlZlxtYXJrdXBzZXRub2xpZ2F0dXJlc3F1b3RlbGVmdHtcbGV0YFxub2xpZ2F0dXJlc3F1b3RlbGVmdH0KK30KKworXGxldFxtYXJrdXBzZXR1cGxxY29kZSBcbWFya3Vwc2V0Y29kZXF1b3RlbGVmdAorXGxldFxtYXJrdXBzZXR1cHJxY29kZSBcbWFya3Vwc2V0Y29kZXF1b3RlcmlnaHQKKyUKK1xsZXRcbWFya3Vwc2V0dXBscWV4YW1wbGUgXG1hcmt1cHNldGNvZGVxdW90ZWxlZnQKK1xsZXRcbWFya3Vwc2V0dXBycWV4YW1wbGUgXG1hcmt1cHNldGNvZGVxdW90ZXJpZ2h0CislCitcbGV0XG1hcmt1cHNldHVwbHFzYW1wIFxtYXJrdXBzZXRjb2RlcXVvdGVsZWZ0CitcbGV0XG1hcmt1cHNldHVwcnFzYW1wIFxtYXJrdXBzZXRjb2RlcXVvdGVyaWdodAorJQorXGxldFxtYXJrdXBzZXR1cGxxdmVyYiBcbWFya3Vwc2V0Y29kZXF1b3RlbGVmdAorXGxldFxtYXJrdXBzZXR1cHJxdmVyYiBcbWFya3Vwc2V0Y29kZXF1b3RlcmlnaHQKKyUKK1xsZXRcbWFya3Vwc2V0dXBscXZlcmJhdGltIFxtYXJrdXBzZXRjb2RlcXVvdGVsZWZ0CitcbGV0XG1hcmt1cHNldHVwcnF2ZXJiYXRpbSBcbWFya3Vwc2V0Y29kZXF1b3RlcmlnaHQKKworXGxldFxtYXJrdXBzZXR1cGxxa2JkIFxtYXJrdXBzZXRub2xpZ2F0dXJlc3F1b3RlbGVmdAorCislIEFsbG93IGFuIG9wdGlvbiB0byBub3QgdXNlIHJlZ3VsYXIgZGlyZWN0ZWQgcmlnaHQgcXVvdGUvYXBvc3Ryb3BoZQorJSAoY2hhciAweDI3KSwgYnV0IGluc3RlYWQgdGhlIHVuZGlyZWN0ZWQgcXVvdGUgZnJvbSBjbXR0IChjaGFyIDB4MGQpLgorJSBUaGUgdW5kaXJlY3RlZCBxdW90ZSBpcyB1Z2x5LCBzbyBkb24ndCBtYWtlIGl0IHRoZSBkZWZhdWx0LCBidXQgaXQKKyUgd29ya3MgZm9yIHBhc3Rpbmcgd2l0aCBtb3JlIHBkZiB2aWV3ZXJzIChhdCBsZWFzdCBldmluY2UpLCB0aGUKKyUgbGlseXBvbmQgZGV2ZWxvcGVycyByZXBvcnQuICB4cGRmIGRvZXMgd29yayB3aXRoIHRoZSByZWd1bGFyIDB4MjcuCislCitcZGVmXGNvZGVxdW90ZXJpZ2h0eyUKKyAgXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgU0VUdHhpY29kZXF1b3RldW5kaXJlY3RlZFxlbmRjc25hbWVccmVsYXgKKyAgICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBTRVRjb2RlcXVvdGV1bmRpcmVjdGVkXGVuZGNzbmFtZVxyZWxheAorICAgICAgJyUKKyAgICBcZWxzZSBcY2hhcicxNSBcZmkKKyAgXGVsc2UgXGNoYXInMTUgXGZpCit9CislCislIGFuZCBhIHNpbWlsYXIgb3B0aW9uIGZvciB0aGUgbGVmdCBxdW90ZSBjaGFyIHZzLiBhIGdyYXZlIGFjY2VudC4KKyUgTW9kZXJuIGZvbnRzIGRpc3BsYXkgQVNDSUkgMHg2MCBhcyBhIGdyYXZlIGFjY2VudCwgc28gc29tZSBwZW9wbGUgbGlrZQorJSB0aGUgY29kZSBlbnZpcm9ubWVudHMgdG8gZG8gbGlrZXdpc2UuCislCitcZGVmXGNvZGVxdW90ZWxlZnR7JQorICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBTRVR0eGljb2RlcXVvdGViYWNrdGlja1xlbmRjc25hbWVccmVsYXgKKyAgICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBTRVRjb2RlcXVvdGViYWNrdGlja1xlbmRjc25hbWVccmVsYXgKKyAgICAgICUgW0tudXRoXSBwcC4gMzgwLDM4MSwzOTEKKyAgICAgICUgXHJlbGF4IGRpc2FibGVzIFNwYW5pc2ggbGlnYXR1cmVzID9gIGFuZCAhYCBvZiBcdHQgZm9udC4KKyAgICAgIFxyZWxheGAlCisgICAgXGVsc2UgXGNoYXInMjIgXGZpCisgIFxlbHNlIFxjaGFyJzIyIFxmaQorfQorCislIENvbW1hbmRzIHRvIHNldCB0aGUgcXVvdGUgb3B0aW9ucy4KKyUgCitccGFyc2VhcmdkZWZcY29kZXF1b3RldW5kaXJlY3RlZHslCisgIFxkZWZcdGVtcHsjMX0lCisgIFxpZnhcdGVtcFxvbndvcmQKKyAgICBcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSBTRVR0eGljb2RlcXVvdGV1bmRpcmVjdGVkXGVuZGNzbmFtZQorICAgICAgPSB0JQorICBcZWxzZVxpZnhcdGVtcFxvZmZ3b3JkCisgICAgXGV4cGFuZGFmdGVyXGxldFxjc25hbWUgU0VUdHhpY29kZXF1b3RldW5kaXJlY3RlZFxlbmRjc25hbWUKKyAgICAgID0gXHJlbGF4CisgIFxlbHNlCisgICAgXGVycmhlbHAgPSBcRU1zaW1wbGUKKyAgICBcZXJybWVzc2FnZXtVbmtub3duIEBjb2RlcXVvdGV1bmRpcmVjdGVkIHZhbHVlIGBcdGVtcCcsIG11c3QgYmUgb258b2ZmfSUKKyAgXGZpXGZpCit9CislCitccGFyc2VhcmdkZWZcY29kZXF1b3RlYmFja3RpY2t7JQorICBcZGVmXHRlbXB7IzF9JQorICBcaWZ4XHRlbXBcb253b3JkCisgICAgXGV4cGFuZGFmdGVyXGxldFxjc25hbWUgU0VUdHhpY29kZXF1b3RlYmFja3RpY2tcZW5kY3NuYW1lCisgICAgICA9IHQlCisgIFxlbHNlXGlmeFx0ZW1wXG9mZndvcmQKKyAgICBcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSBTRVR0eGljb2RlcXVvdGViYWNrdGlja1xlbmRjc25hbWUKKyAgICAgID0gXHJlbGF4CisgIFxlbHNlCisgICAgXGVycmhlbHAgPSBcRU1zaW1wbGUKKyAgICBcZXJybWVzc2FnZXtVbmtub3duIEBjb2RlcXVvdGViYWNrdGljayB2YWx1ZSBgXHRlbXAnLCBtdXN0IGJlIG9ufG9mZn0lCisgIFxmaVxmaQorfQorCislIFtLbnV0aF0gcHAuIDM4MCwzODEsMzkxLCBkaXNhYmxlIFNwYW5pc2ggbGlnYXR1cmVzID9gIGFuZCAhYCBvZiBcdHQgZm9udC4KK1xkZWZcbm9saWdhdHVyZXNxdW90ZWxlZnR7XHJlbGF4XGxxfQogCiAlIENvdW50IGRlcHRoIGluIGZvbnQtY2hhbmdlcywgZm9yIGVycm9yIGNoZWNrcwogXG5ld2NvdW50XGZvbnRkZXB0aCBcZm9udGRlcHRoPTAKIAotJSBGb250cyBmb3Igc2hvcnQgdGFibGUgb2YgY29udGVudHMuCi1cc2V0Zm9udFxzaG9ydGNvbnRybVxybXNoYXBlezEyfXsxMDAwfQotXHNldGZvbnRcc2hvcnRjb250YmZcYmZzaGFwZXsxMH17XG1hZ3N0ZXAxfSAgJSBubyBjbWIxMgotXHNldGZvbnRcc2hvcnRjb250c2xcc2xzaGFwZXsxMn17MTAwMH0KLVxzZXRmb250XHNob3J0Y29udHR0XHR0c2hhcGV7MTJ9ezEwMDB9CislIEZvbnQgY29tbWFuZHMuCiAKLSUlIEFkZCBzY3JpYmUtbGlrZSBmb250IGVudmlyb25tZW50cywgcGx1cyBAbCBmb3IgaW5saW5lIGxpc3AgKHVzdWFsbHkgc2FucwotJSUgc2VyaWYpIGFuZCBAaWkgZm9yIFRlWCBpdGFsaWMKKyUgIzEgaXMgdGhlIGZvbnQgY29tbWFuZCAoXHNsIG9yIFxpdCksICMyIGlzIHRoZSB0ZXh0IHRvIHNsYW50LgorJSBJZiB3ZSBhcmUgaW4gYSBtb25vc3BhY2VkIGVudmlyb25tZW50LCBob3dldmVyLCAxKSBhbHdheXMgdXNlIFx0dHNsLAorJSBhbmQgMikgZG8gbm90IGFkZCBhbiBpdGFsaWMgY29ycmVjdGlvbi4KK1xkZWZcZG9zbWFydHNsYW50IzEjMnslCisgIFxpZnVzaW5ndHQgCisgICAge3tcdHRzbCAjMn1cbGV0XG5leHQ9XHJlbGF4fSUKKyAgICB7XGRlZlxuZXh0e3sjMSMyfVxmdXR1cmVsZXRcbmV4dFxzbWFydGl0YWxpY2NvcnJlY3Rpb259fSUKKyAgXG5leHQKK30KK1xkZWZcc21hcnRzbGFudGVke1xkb3NtYXJ0c2xhbnRcc2x9CitcZGVmXHNtYXJ0aXRhbGlje1xkb3NtYXJ0c2xhbnRcaXR9CiAKLSUgXHNtYXJ0aXRhbGlje0FSR30gb3V0cHV0cyBhcmcgaW4gaXRhbGljcywgZm9sbG93ZWQgYnkgYW4gaXRhbGljIGNvcnJlY3Rpb24KLSUgdW5sZXNzIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyIGlzIHN1Y2ggYXMgbm90IHRvIG5lZWQgb25lLgotXGRlZlxzbWFydGl0YWxpY3h7XGlmeFxuZXh0LFxlbHNlXGlmeFxuZXh0LVxlbHNlXGlmeFxuZXh0LlxlbHNlCi0gICAgICAgICAgICAgICAgICAgIFxwdGV4c2xhc2hcZmlcZmlcZml9Ci1cZGVmXHNtYXJ0c2xhbnRlZCMxe3tcaWZ1c2luZ3R0XHR0c2xcc2wgIzF9XGZ1dHVyZWxldFxuZXh0XHNtYXJ0aXRhbGljeH0KLVxkZWZcc21hcnRpdGFsaWMjMXt7XGlmdXNpbmd0dFx0dHNsXGl0ICMxfVxmdXR1cmVsZXRcbmV4dFxzbWFydGl0YWxpY3h9CislIE91dHB1dCBhbiBpdGFsaWMgY29ycmVjdGlvbiB1bmxlc3MgXG5leHQgKHByZXN1bWVkIHRvIGJlIHRoZSBmb2xsb3dpbmcKKyUgY2hhcmFjdGVyKSBpcyBzdWNoIGFzIG5vdCB0byBuZWVkIG9uZS4KK1xkZWZcc21hcnRpdGFsaWNjb3JyZWN0aW9ueyUKKyAgXGlmeFxuZXh0LCUKKyAgXGVsc2VcaWZ4XG5leHQtJQorICBcZWxzZVxpZnhcbmV4dC4lCisgIFxlbHNlXHB0ZXhzbGFzaAorICBcZmlcZmlcZmkKKyAgXGFmdGVyc21hcnRpYworfQogCi0lIGxpa2UgXHNtYXJ0c2xhbnRlZCBleGNlcHQgdW5jb25kaXRpb25hbGx5IHVzZXMgXHR0c2wuCislIGxpa2UgXHNtYXJ0c2xhbnRlZCBleGNlcHQgdW5jb25kaXRpb25hbGx5IHVzZXMgXHR0c2wsIGFuZCBubyBpYy4KICUgQHZhciBpcyBzZXQgdG8gdGhpcyBmb3IgZGVmdW4gYXJndW1lbnRzLgotXGRlZlx0dHNsYW50ZWQjMXt7XHR0c2wgIzF9XGZ1dHVyZWxldFxuZXh0XHNtYXJ0aXRhbGljeH0KK1xkZWZcdHRzbGFudGVkIzF7e1x0dHNsICMxfX0KIAotJSBsaWtlIFxzbWFydHNsYW50ZWQgZXhjZXB0IHVuY29uZGl0aW9uYWxseSB1c2UgXHNsLiAgV2UgbmV2ZXIgd2FudAorJSBAY2l0ZSBpcyBsaWtlIFxzbWFydHNsYW50ZWQgZXhjZXB0IHVuY29uZGl0aW9uYWxseSB1c2UgXHNsLiAgV2UgbmV2ZXIgd2FudAogJSB0dHNsIGZvciBib29rIHRpdGxlcywgZG8gd2U/Ci1cZGVmXGNpdGUjMXt7XHNsICMxfVxmdXR1cmVsZXRcbmV4dFxzbWFydGl0YWxpY3h9CitcZGVmXGNpdGUjMXt7XHNsICMxfVxmdXR1cmVsZXRcbmV4dFxzbWFydGl0YWxpY2NvcnJlY3Rpb259CisKK1xkZWZcYWZ0ZXJzbWFydGlje30KK1xkZWZcdmFyIzF7JQorICBcbGV0XHNhdmVhZnRlcnNtYXJ0aWMgPSBcYWZ0ZXJzbWFydGljCisgIFxkZWZcYWZ0ZXJzbWFydGlje1xudWxsXGxldFxhZnRlcnNtYXJ0aWM9XHNhdmVhZnRlcnNtYXJ0aWN9JQorICBcc21hcnRzbGFudGVkeyMxfSUKK30KIAogXGxldFxpPVxzbWFydGl0YWxpYwogXGxldFxzbGFudGVkPVxzbWFydHNsYW50ZWQKLVxsZXRcdmFyPVxzbWFydHNsYW50ZWQKIFxsZXRcZGZuPVxzbWFydHNsYW50ZWQKIFxsZXRcZW1waD1cc21hcnRpdGFsaWMKIAotJSBAYiwgZXhwbGljaXQgYm9sZC4KKyUgRXhwbGljaXQgZm9udCBjaGFuZ2VzOiBAciwgQHNjLCB1bmRvY3VtZW50ZWQgQGlpLgorXGRlZlxyIzF7e1xybSAjMX19ICAgICAgICAgICAgICAlIHJvbWFuIGZvbnQKK1xkZWZcc2MjMXt7XHNtYWxsY2FwcyMxfX0gICAgICAgJSBzbWFsbGNhcHMgZm9udAorXGRlZlxpaSMxe3tcaXQgIzF9fSAgICAgICAgICAgICAlIGl0YWxpYyBmb250CisKKyUgQGIsIGV4cGxpY2l0IGJvbGQuICBBbHNvIEBzdHJvbmcuCiBcZGVmXGIjMXt7XGJmICMxfX0KIFxsZXRcc3Ryb25nPVxiCiAKQEAgLTE4MjQsMjEgKzI0MzksMzUgQEAKIFxjYXRjb2RlYEA9XG90aGVyCiBcZGVmXGVuZG9mc2VudGVuY2VzcGFjZWZhY3RvcnszMDAwfSUgZGVmYXVsdAogCislIEB0LCBleHBsaWNpdCB0eXBld3JpdGVyLgogXGRlZlx0IzF7JQogICB7XHR0IFxyYXdiYWNrc2xhc2ggXHBsYWluZnJlbmNoc3BhY2luZyAjMX0lCiAgIFxudWxsCiB9Ci1cZGVmXHNhbXAjMXtgXHRjbG9zZXsjMX0nXG51bGx9Ci1cc2V0Zm9udFxrZXlybVxybXNoYXBlezh9ezEwMDB9Ci1cZm9udFxrZXlzeT1jbXN5OQotXGRlZlxrZXkjMXt7XGtleXJtXHRleHRmb250Mj1ca2V5c3kgXGxlYXZldm1vZGVcaGJveHslCi0gIFxyYWlzZTAuNHB0XGhib3h7XGFuZ2xlbGVmdH1ca2Vybi0uMDhlbVx2dG9weyUKLSAgICBcdmJveHtcaHJ1bGVca2Vybi0wLjRwdAotICAgICBcaGJveHtccmFpc2UwLjRwdFxoYm94e1x2cGhhbnRvbXtcYW5nbGVsZWZ0fX0jMX19JQotICAgIFxrZXJuLTAuNHB0XGhydWxlfSUKLSAgXGtlcm4tLjA2ZW1ccmFpc2UwLjRwdFxoYm94e1xhbmdsZXJpZ2h0fX19fQotJSBUaGUgb2xkIGRlZmluaXRpb24sIHdpdGggbm8gbG96ZW5nZToKLSVcZGVmXGtleSAjMXt7XHR0c2wgXG5vaHlwaGVuYXRpb24gXHVwcGVyY2FzZXsjMX19XG51bGx9CisKKyUgQHNhbXAuCitcZGVmXHNhbXAjMXt7XHNldHVwbWFya3Vwc3R5bGV7c2FtcH1cbHFcdGNsb3NleyMxfVxycVxudWxsfX0KKworJSBkZWZpbml0aW9uIG9mIEBrZXkgdGhhdCBwcm9kdWNlcyBhIGxvemVuZ2UuICBEb2Vzbid0IGFkanVzdCB0byB0ZXh0IHNpemUuCislXHNldGZvbnRca2V5cm1ccm1zaGFwZXs4fXsxMDAwfXtPVDF9CislXGZvbnRca2V5c3k9Y21zeTkKKyVcZGVmXGtleSMxe3tca2V5cm1cdGV4dGZvbnQyPVxrZXlzeSBcbGVhdmV2bW9kZVxoYm94eyUKKyUgIFxyYWlzZTAuNHB0XGhib3h7XGFuZ2xlbGVmdH1ca2Vybi0uMDhlbVx2dG9weyUKKyUgICAgXHZib3h7XGhydWxlXGtlcm4tMC40cHQKKyUgICAgIFxoYm94e1xyYWlzZTAuNHB0XGhib3h7XHZwaGFudG9te1xhbmdsZWxlZnR9fSMxfX0lCislICAgIFxrZXJuLTAuNHB0XGhydWxlfSUKKyUgIFxrZXJuLS4wNmVtXHJhaXNlMC40cHRcaGJveHtcYW5nbGVyaWdodH19fX0KKworJSBkZWZpbml0aW9uIG9mIEBrZXkgd2l0aCBubyBsb3plbmdlLiAgSWYgdGhlIGN1cnJlbnQgZm9udCBpcyBhbHJlYWR5CislIG1vbm9zcGFjZSwgZG9uJ3QgY2hhbmdlIGl0OyB0aGF0IHdheSwgd2UgcmVzcGVjdCBAa2JkaW5wdXRzdHlsZS4gIEJ1dAorJSBpZiBpdCBpc24ndCBtb25vc3BhY2UsIHRoZW4gdXNlIFx0dC4KKyUKK1xkZWZca2V5IzF7e1xzZXR1cG1hcmt1cHN0eWxle2tleX0lCisgIFxub2h5cGhlbmF0aW9uCisgIFxpZm1vbm9zcGFjZVxlbHNlXHR0XGZpCisgICMxfVxudWxsfQorCislIGN0cmwgaXMgbm8gbG9uZ2VyIGEgVGV4aW5mbyBjb21tYW5kLgogXGRlZlxjdHJsICMxe3tcdHQgXHJhd2JhY2tzbGFzaCBcaGF0fSMxfQogCiAlIEBmaWxlLCBAb3B0aW9uIGFyZSB0aGUgc2FtZSBhcyBAc2FtcC4KQEAgLTE4NjUsNyArMjQ5NCw3IEBACiAgICAgXHBsYWluZnJlbmNoc3BhY2luZwogICAgICMxJQogICB9JQotICBcbnVsbAorICBcbnVsbCAlIHJlc2V0IHNwYWNlZmFjdG9yIHRvIDEwMDAKIH0KIAogJSBXZSAqbXVzdCogdHVybiBvbiBoeXBoZW5hdGlvbiBhdCBgLScgYW5kIGBfJyBpbiBAY29kZS4KQEAgLTE4NzgsMTEgKzI1MDcsMTQgQEAKICUgYW5kIGFycmFuZ2UgZXhwbGljaXRseSB0byBoeXBoZW5hdGUgYXQgYSBkYXNoLgogJSAgLS0gcm1zLgogewotICBcY2F0Y29kZWBcLT1cYWN0aXZlCi0gIFxjYXRjb2RlYFxfPVxhY3RpdmUKKyAgXGNhdGNvZGVgXC09XGFjdGl2ZSBcY2F0Y29kZWBcXz1cYWN0aXZlCisgIFxjYXRjb2RlYFwnPVxhY3RpdmUgXGNhdGNvZGVgXGA9XGFjdGl2ZQorICBcZ2xvYmFsXGxldCc9XHJxIFxnbG9iYWxcbGV0YD1cbHEgICUgZGVmYXVsdCBkZWZpbml0aW9ucwogICAlCiAgIFxnbG9iYWxcZGVmXGNvZGV7XGJlZ2luZ3JvdXAKLSAgICBcY2F0Y29kZWBcLT1cYWN0aXZlICBcY2F0Y29kZWBcXz1cYWN0aXZlCisgICAgXHNldHVwbWFya3Vwc3R5bGV7Y29kZX0lCisgICAgJSBUaGUgZm9sbG93aW5nIHNob3VsZCByZWFsbHkgYmUgbW92ZWQgaW50byBcc2V0dXBtYXJrdXBzdHlsZSBoYW5kbGVycy4KKyAgICBcY2F0Y29kZVxkYXNoQ2hhcj1cYWN0aXZlICBcY2F0Y29kZVx1bmRlckNoYXI9XGFjdGl2ZQogICAgIFxpZmFsbG93Y29kZWJyZWFrcwogICAgICBcbGV0LVxjb2RlZGFzaAogICAgICBcbGV0X1xjb2RldW5kZXIKQEAgLTE4OTQsNiArMjUyNiw4IEBACiAgIH0KIH0KIAorXGRlZlxjb2RleCAjMXtcdGNsb3NleyMxfVxlbmRncm91cH0KKwogXGRlZlxyZWFsZGFzaHstfQogXGRlZlxjb2RlZGFzaHstXGRpc2NyZXRpb25hcnl7fXt9e319CiBcZGVmXGNvZGV1bmRlcnslCkBAIC0xOTA3LDEzICsyNTQxLDEyIEBACiAgICAgICAgICAgICAgXGRpc2NyZXRpb25hcnl7fXt9e319JQogICAgICAgICAgICAge1xffSUKIH0KLVxkZWZcY29kZXggIzF7XHRjbG9zZXsjMX1cZW5kZ3JvdXB9CiAKICUgQW4gYWRkaXRpb25hbCBjb21wbGljYXRpb246IHRoZSBhYm92ZSB3aWxsIGFsbG93IGJyZWFrcyBhZnRlciwgZS5nLiwKICUgZWFjaCBvZiB0aGUgZm91ciB1bmRlcnNjb3JlcyBpbiBfX3R5cGVvZl9fLiAgVGhpcyBpcyB1bmRlc2lyYWJsZSBpbgogJSBzb21lIG1hbnVhbHMsIGVzcGVjaWFsbHkgaWYgdGhleSBkb24ndCBoYXZlIGxvbmcgaWRlbnRpZmllcnMgaW4KICUgZ2VuZXJhbC4gIEBhbGxvd2NvZGVicmVha3MgcHJvdmlkZXMgYSB3YXkgdG8gY29udHJvbCB0aGlzLgotJSAKKyUKIFxuZXdpZlxpZmFsbG93Y29kZWJyZWFrcyAgXGFsbG93Y29kZWJyZWFrc3RydWUKIAogXGRlZlxrZXl3b3JkdHJ1ZXt0cnVlfQpAQCAtMTkyNyw1NSArMjU2MCwxOCBAQAogICAgIFxhbGxvd2NvZGVicmVha3NmYWxzZQogICBcZWxzZQogICAgIFxlcnJoZWxwID0gXEVNc2ltcGxlCi0gICAgXGVycm1lc3NhZ2V7VW5rbm93biBAYWxsb3djb2RlYnJlYWtzIG9wdGlvbiBgXHR4aWFyZyd9JQorICAgIFxlcnJtZXNzYWdle1Vua25vd24gQGFsbG93Y29kZWJyZWFrcyBvcHRpb24gYFx0eGlhcmcnLCBtdXN0IGJlIHRydWV8ZmFsc2V9JQogICBcZmlcZmkKIH0KIAotJSBAa2JkIGlzIGxpa2UgQGNvZGUsIGV4Y2VwdCB0aGF0IGlmIHRoZSBhcmd1bWVudCBpcyBqdXN0IG9uZSBAa2V5IGNvbW1hbmQsCi0lIHRoZW4gQGtiZCBoYXMgbm8gZWZmZWN0LgotCi0lIEBrYmRpbnB1dHN0eWxlIC0tIGFyZyBpcyBgZGlzdGluY3QnIChAa2JkIHVzZXMgc2xhbnRlZCB0dHkgZm9udCBhbHdheXMpLAotJSAgIGBleGFtcGxlJyAoQGtiZCB1c2VzIHR0c2wgb25seSBpbnNpZGUgb2YgQGV4YW1wbGUgYW5kIGZyaWVuZHMpLAotJSAgIG9yIGBjb2RlJyAoQGtiZCB1c2VzIG5vcm1hbCB0dHkgZm9udCBhbHdheXMpLgotXHBhcnNlYXJnZGVmXGtiZGlucHV0c3R5bGV7JQotICBcZGVmXHR4aWFyZ3sjMX0lCi0gIFxpZnhcdHhpYXJnXHdvcmRkaXN0aW5jdAotICAgIFxnZGVmXGtiZGV4YW1wbGVmb250e1x0dHNsfVxnZGVmXGtiZGZvbnR7XHR0c2x9JQotICBcZWxzZVxpZnhcdHhpYXJnXHdvcmRleGFtcGxlCi0gICAgXGdkZWZca2JkZXhhbXBsZWZvbnR7XHR0c2x9XGdkZWZca2JkZm9udHtcdHR9JQotICBcZWxzZVxpZnhcdHhpYXJnXHdvcmRjb2RlCi0gICAgXGdkZWZca2JkZXhhbXBsZWZvbnR7XHR0fVxnZGVmXGtiZGZvbnR7XHR0fSUKLSAgXGVsc2UKLSAgICBcZXJyaGVscCA9IFxFTXNpbXBsZQotICAgIFxlcnJtZXNzYWdle1Vua25vd24gQGtiZGlucHV0c3R5bGUgb3B0aW9uIGBcdHhpYXJnJ30lCi0gIFxmaVxmaVxmaQotfQotXGRlZlx3b3JkZGlzdGluY3R7ZGlzdGluY3R9Ci1cZGVmXHdvcmRleGFtcGxle2V4YW1wbGV9Ci1cZGVmXHdvcmRjb2Rle2NvZGV9Ci0KLSUgRGVmYXVsdCBpcyBgZGlzdGluY3QuJwotXGtiZGlucHV0c3R5bGUgZGlzdGluY3QKLQotXGRlZlx4a2V5e1xrZXl9Ci1cZGVmXGtiZGZvbyMxIzIjM1xwYXJ7XGRlZlxvbmV7IzF9XGRlZlx0aHJlZXsjM31cZGVmXHRocmVleHs/P30lCi1caWZ4XG9uZVx4a2V5XGlmeFx0aHJlZXhcdGhyZWUgXGtleXsjMn0lCi1cZWxzZXtcdGNsb3Nle1xrYmRmb250XGxvb2t9fVxmaQotXGVsc2V7XHRjbG9zZXtca2JkZm9udFxsb29rfX1cZml9Ci0KLSUgRm9yIEBpbmRpY2F0ZXVybCwgQGVudiwgQGNvbW1hbmQgcXVvdGVzIHNlZW0gdW5uZWNlc3NhcnksIHNvIHVzZSBcY29kZS4KLVxsZXRcaW5kaWNhdGV1cmw9XGNvZGUKLVxsZXRcZW52PVxjb2RlCi1cbGV0XGNvbW1hbmQ9XGNvZGUKLQogJSBAdXJlZiAoYWJicmV2aWF0aW9uIGZvciBgdXJscmVmJykgdGFrZXMgYW4gb3B0aW9uYWwgKGNvbW1hLXNlcGFyYXRlZCkKICUgc2Vjb25kIGFyZ3VtZW50IHNwZWNpZnlpbmcgdGhlIHRleHQgdG8gZGlzcGxheSBhbmQgYW4gb3B0aW9uYWwgdGhpcmQKICUgYXJnIGFzIHRleHQgdG8gZGlzcGxheSBpbnN0ZWFkIG9mIChyYXRoZXIgdGhhbiBpbiBhZGRpdGlvbiB0bykgdGhlIHVybAotJSBpdHNlbGYuICBGaXJzdCAobWFuZGF0b3J5KSBhcmcgaXMgdGhlIHVybC4gIFBlcmhhcHMgZXZlbnR1YWxseSBwdXQgaW4KLSUgYSBoeXBlcnRleCBcc3BlY2lhbCBoZXJlLgotJQotXGRlZlx1cmVmIzF7XGRvdXJlZiAjMSwsLFxmaW5pc2h9Ci1cZGVmXGRvdXJlZiMxLCMyLCMzLCM0XGZpbmlzaHtcYmVnaW5ncm91cAorJSBpdHNlbGYuICBGaXJzdCAobWFuZGF0b3J5KSBhcmcgaXMgdGhlIHVybC4KKyUgKFRoaXMgXHVyZWZub2JyZWFrIGRlZmluaXRpb24gaXNuJ3QgdXNlZCBub3csIGxlYXZpbmcgaXQgZm9yIGEgd2hpbGUKKyUgZm9yIGNvbXBhcmlzb24uKQorXGRlZlx1cmVmbm9icmVhayMxe1xkb3VyZWZub2JyZWFrICMxLCwsXGZpbmlzaH0KK1xkZWZcZG91cmVmbm9icmVhayMxLCMyLCMzLCM0XGZpbmlzaHtcYmVnaW5ncm91cAogICBcdW5zZXBzcGFjZXMKICAgXHBkZnVybHsjMX0lCiAgIFxzZXRib3gwID0gXGhib3h7XGlnbm9yZXNwYWNlcyAjM30lCkBAIC0xOTk2LDYgKzI1OTIsMTAzIEBACiAgIFxlbmRsaW5rCiBcZW5kZ3JvdXB9CiAKKyUgVGhpcyBcdXJlZmJyZWFrIGRlZmluaXRpb24gaXMgdGhlIGFjdGl2ZSBvbmUuCitcZGVmXHVyZWZicmVha3tcYmVnaW5ncm91cCBcdXJlZmNhdGNvZGVzIFxkb3VyZWZicmVha30KK1xsZXRcdXJlZj1cdXJlZmJyZWFrCitcZGVmXGRvdXJlZmJyZWFrIzF7XHVyZWZicmVha2ZpbmlzaCAjMSwsLFxmaW5pc2h9CitcZGVmXHVyZWZicmVha2ZpbmlzaCMxLCMyLCMzLCM0XGZpbmlzaHslIGRvZXNuJ3Qgd29yayBpbiBAZXhhbXBsZQorICBcdW5zZXBzcGFjZXMKKyAgXHBkZnVybHsjMX0lCisgIFxzZXRib3gwID0gXGhib3h7XGlnbm9yZXNwYWNlcyAjM30lCisgIFxpZmRpbVx3ZDAgPiAwcHQKKyAgICBcdW5oYm94MCAlIHRoaXJkIGFyZyBnaXZlbiwgc2hvdyBvbmx5IHRoYXQKKyAgXGVsc2UKKyAgICBcc2V0Ym94MCA9IFxoYm94e1xpZ25vcmVzcGFjZXMgIzJ9JQorICAgIFxpZmRpbVx3ZDAgPiAwcHQKKyAgICAgIFxpZnBkZgorICAgICAgICBcdW5oYm94MCAgICAgICAgICAgICAlIFBERjogMm5kIGFyZyBnaXZlbiwgc2hvdyBvbmx5IGl0CisgICAgICBcZWxzZQorICAgICAgICBcdW5oYm94MFwgKFx1cmVmY29kZXsjMX0pJSBEVkk6IDJuZCBhcmcgZ2l2ZW4sIHNob3cgYm90aCBpdCBhbmQgdXJsCisgICAgICBcZmkKKyAgICBcZWxzZQorICAgICAgXHVyZWZjb2RleyMxfSUgb25seSB1cmwgZ2l2ZW4sIHNvIHNob3cgaXQKKyAgICBcZmkKKyAgXGZpCisgIFxlbmRsaW5rCitcZW5kZ3JvdXB9CisKKyUgQWxsb3cgbGluZSBicmVha3MgYXJvdW5kIG9ubHkgYSBmZXcgY2hhcmFjdGVycyAob25seSkuCitcZGVmXHVyZWZjYXRjb2Rlc3slCisgIFxjYXRjb2RlXGFtcENoYXI9XGFjdGl2ZSAgIFxjYXRjb2RlXGRvdENoYXI9XGFjdGl2ZQorICBcY2F0Y29kZVxoYXNoQ2hhcj1cYWN0aXZlICBcY2F0Y29kZVxxdWVzdENoYXI9XGFjdGl2ZQorICBcY2F0Y29kZVxzbGFzaENoYXI9XGFjdGl2ZQorfQoreworICBcdXJlZmNhdGNvZGVzCisgICUKKyAgXGdsb2JhbFxkZWZcdXJlZmNvZGV7XGJlZ2luZ3JvdXAKKyAgICBcc2V0dXBtYXJrdXBzdHlsZXtjb2RlfSUKKyAgICBcdXJlZmNhdGNvZGVzCisgICAgXGxldCZcdXJlZmNvZGVhbXAKKyAgICBcbGV0Llx1cmVmY29kZWRvdAorICAgIFxsZXQjXHVyZWZjb2RlaGFzaAorICAgIFxsZXQ/XHVyZWZjb2RlcXVlc3QKKyAgICBcbGV0L1x1cmVmY29kZXNsYXNoCisgICAgXGNvZGV4CisgIH0KKyAgJQorICAlIEJ5IGRlZmF1bHQsIHRoZXkgYXJlIGp1c3QgcmVndWxhciBjaGFyYWN0ZXJzLgorICBcZ2xvYmFsXGRlZiZ7XG5vcm1hbGFtcH0KKyAgXGdsb2JhbFxkZWYue1xub3JtYWxkb3R9CisgIFxnbG9iYWxcZGVmI3tcbm9ybWFsaGFzaH0KKyAgXGdsb2JhbFxkZWY/e1xub3JtYWxxdWVzdH0KKyAgXGdsb2JhbFxkZWYve1xub3JtYWxzbGFzaH0KK30KKworJSB3ZSBwdXQgYSBsaXR0bGUgc3RyZXRjaCBiZWZvcmUgYW5kIGFmdGVyIHRoZSBicmVha2FibGUgY2hhcnMsIHRvIGhlbHAKKyUgbGluZSBicmVha2luZyBvZiBsb25nIHVybCdzLiAgVGhlIHVuZXF1YWwgc2tpcHMgbWFrZSBsb29rIGJldHRlciBpbgorJSBjbXR0IGF0IGxlYXN0LCBlc3BlY2lhbGx5IGZvciBkb3RzLgorXGRlZlx1cmVmcHJlc3RyZXRjaHtcdXJlZnByZWJyZWFrIFxoc2tpcDBwdCBwbHVzLjEzZW0gfQorXGRlZlx1cmVmcG9zdHN0cmV0Y2h7XHVyZWZwb3N0YnJlYWsgXGhza2lwMHB0IHBsdXMuMWVtIH0KKyUKK1xkZWZcdXJlZmNvZGVhbXB7XHVyZWZwcmVzdHJldGNoIFwmXHVyZWZwb3N0c3RyZXRjaH0KK1xkZWZcdXJlZmNvZGVkb3R7XHVyZWZwcmVzdHJldGNoIC5cdXJlZnBvc3RzdHJldGNofQorXGRlZlx1cmVmY29kZWhhc2h7XHVyZWZwcmVzdHJldGNoIFwjXHVyZWZwb3N0c3RyZXRjaH0KK1xkZWZcdXJlZmNvZGVxdWVzdHtcdXJlZnByZXN0cmV0Y2ggP1x1cmVmcG9zdHN0cmV0Y2h9CitcZGVmXHVyZWZjb2Rlc2xhc2h7XGZ1dHVyZWxldFxuZXh0XHVyZWZjb2Rlc2xhc2hmaW5pc2h9Cit7CisgIFxjYXRjb2RlYFwvPVxhY3RpdmUKKyAgXGdsb2JhbFxkZWZcdXJlZmNvZGVzbGFzaGZpbmlzaHslCisgICAgXHVyZWZwcmVzdHJldGNoIFxzbGFzaENoYXIKKyAgICAlIEFsbG93IGxpbmUgYnJlYWsgb25seSBhZnRlciB0aGUgZmluYWwgLyBpbiBhIHNlcXVlbmNlIG9mCisgICAgJSBzbGFzaGVzLCB0byBhdm9pZCBsaW5lIGJyZWFrIGJldHdlZW4gdGhlIHNsYXNoZXMgaW4gaHR0cDovLy4KKyAgICBcaWZ4XG5leHQvXGVsc2UgXHVyZWZwb3N0c3RyZXRjaCBcZmkKKyAgfQorfQorCislIE9uZSBtb3JlIGNvbXBsaWNhdGlvbjogYnkgZGVmYXVsdCB3ZSdsbCBicmVhayBhZnRlciB0aGUgc3BlY2lhbAorJSBjaGFyYWN0ZXJzLCBidXQgc29tZSBwZW9wbGUgbGlrZSB0byBicmVhayBiZWZvcmUgdGhlIHNwZWNpYWwgY2hhcnMsIHNvCislIGFsbG93IHRoYXQuICBBbHNvIGFsbG93IG5vIGJyZWFraW5nIGF0IGFsbCwgZm9yIG1hbnVhbCBjb250cm9sLgorJSAKK1xwYXJzZWFyZ2RlZlx1cmVmYnJlYWtzdHlsZXslCisgIFxkZWZcdHhpYXJneyMxfSUKKyAgXGlmeFx0eGlhcmdcd29yZG5vbmUKKyAgICBcZGVmXHVyZWZwcmVicmVha3tcbm9icmVha31cZGVmXHVyZWZwb3N0YnJlYWt7XG5vYnJlYWt9CisgIFxlbHNlXGlmeFx0eGlhcmdcd29yZGJlZm9yZQorICAgIFxkZWZcdXJlZnByZWJyZWFre1xhbGxvd2JyZWFrfVxkZWZcdXJlZnBvc3RicmVha3tcbm9icmVha30KKyAgXGVsc2VcaWZ4XHR4aWFyZ1x3b3JkYWZ0ZXIKKyAgICBcZGVmXHVyZWZwcmVicmVha3tcbm9icmVha31cZGVmXHVyZWZwb3N0YnJlYWt7XGFsbG93YnJlYWt9CisgIFxlbHNlCisgICAgXGVycmhlbHAgPSBcRU1zaW1wbGUKKyAgICBcZXJybWVzc2FnZXtVbmtub3duIEB1cmVmYnJlYWtzdHlsZSBzZXR0aW5nIGBcdHhpYXJnJ30lCisgIFxmaVxmaVxmaQorfQorXGRlZlx3b3JkYWZ0ZXJ7YWZ0ZXJ9CitcZGVmXHdvcmRiZWZvcmV7YmVmb3JlfQorXGRlZlx3b3Jkbm9uZXtub25lfQorCitcdXJlZmJyZWFrc3R5bGUgYWZ0ZXIKKwogJSBAdXJsIHN5bm9ueW0gZm9yIEB1cmVmLCBzaW5jZSB0aGF0J3MgaG93IGV2ZXJ5b25lIHVzZXMgaXQuCiAlCiBcbGV0XHVybD1cdXJlZgpAQCAtMjAxNywzNCArMjcxMCw2NSBAQAogICBcbGV0XGVtYWlsPVx1cmVmCiBcZmkKIAotJSBDaGVjayBpZiB3ZSBhcmUgY3VycmVudGx5IHVzaW5nIGEgdHlwZXdyaXRlciBmb250LiAgU2luY2UgYWxsIHRoZQotJSBDb21wdXRlciBNb2Rlcm4gdHlwZXdyaXRlciBmb250cyBoYXZlIHplcm8gaW50ZXJ3b3JkIHN0cmV0Y2ggKGFuZAotJSBzaHJpbmspLCBhbmQgaXQgaXMgcmVhc29uYWJsZSB0byBleHBlY3QgYWxsIHR5cGV3cml0ZXIgZm9udHMgdG8gaGF2ZQotJSB0aGlzIHByb3BlcnR5LCB3ZSBjYW4gY2hlY2sgdGhhdCBmb250IHBhcmFtZXRlci4KLSUKLVxkZWZcaWZtb25vc3BhY2V7XGlmZGltXGZvbnRkaW1lbjNcZm9udD0wcHQgfQorJSBAa2JkIGlzIGxpa2UgQGNvZGUsIGV4Y2VwdCB0aGF0IGlmIHRoZSBhcmd1bWVudCBpcyBqdXN0IG9uZSBAa2V5IGNvbW1hbmQsCislIHRoZW4gQGtiZCBoYXMgbm8gZWZmZWN0LgorXGRlZlxrYmQjMXt7XHNldHVwbWFya3Vwc3R5bGV7a2JkfVxkZWZcbG9va3sjMX1cZXhwYW5kYWZ0ZXJca2JkZm9vXGxvb2s/P1xwYXJ9fQorCislIEBrYmRpbnB1dHN0eWxlIC0tIGFyZyBpcyBgZGlzdGluY3QnIChAa2JkIHVzZXMgc2xhbnRlZCB0dHkgZm9udCBhbHdheXMpLAorJSAgIGBleGFtcGxlJyAoQGtiZCB1c2VzIHR0c2wgb25seSBpbnNpZGUgb2YgQGV4YW1wbGUgYW5kIGZyaWVuZHMpLAorJSAgIG9yIGBjb2RlJyAoQGtiZCB1c2VzIG5vcm1hbCB0dHkgZm9udCBhbHdheXMpLgorXHBhcnNlYXJnZGVmXGtiZGlucHV0c3R5bGV7JQorICBcZGVmXHR4aWFyZ3sjMX0lCisgIFxpZnhcdHhpYXJnXHdvcmRkaXN0aW5jdAorICAgIFxnZGVmXGtiZGV4YW1wbGVmb250e1x0dHNsfVxnZGVmXGtiZGZvbnR7XHR0c2x9JQorICBcZWxzZVxpZnhcdHhpYXJnXHdvcmRleGFtcGxlCisgICAgXGdkZWZca2JkZXhhbXBsZWZvbnR7XHR0c2x9XGdkZWZca2JkZm9udHtcdHR9JQorICBcZWxzZVxpZnhcdHhpYXJnXHdvcmRjb2RlCisgICAgXGdkZWZca2JkZXhhbXBsZWZvbnR7XHR0fVxnZGVmXGtiZGZvbnR7XHR0fSUKKyAgXGVsc2UKKyAgICBcZXJyaGVscCA9IFxFTXNpbXBsZQorICAgIFxlcnJtZXNzYWdle1Vua25vd24gQGtiZGlucHV0c3R5bGUgc2V0dGluZyBgXHR4aWFyZyd9JQorICBcZmlcZmlcZmkKK30KK1xkZWZcd29yZGRpc3RpbmN0e2Rpc3RpbmN0fQorXGRlZlx3b3JkZXhhbXBsZXtleGFtcGxlfQorXGRlZlx3b3JkY29kZXtjb2RlfQorCislIERlZmF1bHQgaXMgYGRpc3RpbmN0Jy4KK1xrYmRpbnB1dHN0eWxlIGRpc3RpbmN0CisKK1xkZWZceGtleXtca2V5fQorXGRlZlxrYmRmb28jMSMyIzNccGFye1xkZWZcb25leyMxfVxkZWZcdGhyZWV7IzN9XGRlZlx0aHJlZXh7Pz99JQorXGlmeFxvbmVceGtleVxpZnhcdGhyZWV4XHRocmVlIFxrZXl7IzJ9JQorXGVsc2V7XHRjbG9zZXtca2JkZm9udFxzZXR1cG1hcmt1cHN0eWxle2tiZH1cbG9va319XGZpCitcZWxzZXtcdGNsb3Nle1xrYmRmb250XHNldHVwbWFya3Vwc3R5bGV7a2JkfVxsb29rfX1cZml9CisKKyUgRm9yIEBpbmRpY2F0ZXVybCwgQGVudiwgQGNvbW1hbmQgcXVvdGVzIHNlZW0gdW5uZWNlc3NhcnksIHNvIHVzZSBcY29kZS4KK1xsZXRcaW5kaWNhdGV1cmw9XGNvZGUKK1xsZXRcZW52PVxjb2RlCitcbGV0XGNvbW1hbmQ9XGNvZGUKKworJSBAY2xpY2tzZXF1ZW5jZXtGaWxlIEBjbGlja3t9IE9wZW4gLi4ufQorXGRlZlxjbGlja3NlcXVlbmNlIzF7XGJlZ2luZ3JvdXAgIzFcZW5kZ3JvdXB9CisKKyUgQGNsaWNrc3R5bGUgQGFycm93ICAgKGJ5IGRlZmF1bHQpCitccGFyc2VhcmdkZWZcY2xpY2tzdHlsZXtcZGVmXGNsaWNreyMxfX0KK1xkZWZcY2xpY2t7XGFycm93fQogCiAlIFR5cGVzZXQgYSBkaW1lbnNpb24sIGUuZy4sIGBpbicgb3IgYHB0Jy4gIFRoZSBvbmx5IHJlYXNvbiBmb3IgdGhlCiAlIGFyZ3VtZW50IGlzIHRvIG1ha2UgdGhlIGlucHV0IGxvb2sgcmlnaHQ6IEBkbW57cHR9IGluc3RlYWQgb2YgQGRtbnt9cHQuCiAlCiBcZGVmXGRtbiMxe1x0aGluc3BhY2UgIzF9CiAKLVxkZWZca2JkIzF7XGRlZlxsb29reyMxfVxleHBhbmRhZnRlclxrYmRmb29cbG9vaz8/XHBhcn0KLQogJSBAbCB3YXMgbmV2ZXIgZG9jdW1lbnRlZCB0byBtZWFuIGBgc3dpdGNoIHRvIHRoZSBMaXNwIGZvbnQnJywKICUgYW5kIGl0IGlzIG5vdCB1c2VkIGFzIHN1Y2ggaW4gYW55IG1hbnVhbCBJIGNhbiBmaW5kLiAgV2UgbmVlZCBpdCBmb3IKICUgUG9saXNoIHN1cHByZXNzZWQtbC4gIC0ta2FybCwgMjJzZXA5Ni4KICVcZGVmXGwjMXt7XGxpICMxfVxudWxsfQogCi0lIEV4cGxpY2l0IGZvbnQgY2hhbmdlczogQHIsIEBzYywgdW5kb2N1bWVudGVkIEBpaS4KLVxkZWZcciMxe3tccm0gIzF9fSAgICAgICAgICAgICAgJSByb21hbiBmb250Ci1cZGVmXHNjIzF7e1xzbWFsbGNhcHMjMX19ICAgICAgICUgc21hbGxjYXBzIGZvbnQKLVxkZWZcaWkjMXt7XGl0ICMxfX0gICAgICAgICAgICAgJSBpdGFsaWMgZm9udAotCiAlIEBhY3JvbnltIGZvciAiRkJJIiwgIk5BVE8iLCBhbmQgdGhlIGxpa2UuCiAlIFdlIHByaW50IHRoaXMgb25lIHBvaW50IHNpemUgc21hbGxlciwgc2luY2UgaXQncyBpbnRlbmRlZCBmb3IKICUgYWxsLXVwcGVyY2FzZS4KLSUgCislCiBcZGVmXGFjcm9ueW0jMXtcZG9hY3JvbnltICMxLCxcZmluaXNofQogXGRlZlxkb2Fjcm9ueW0jMSwjMiwjM1xmaW5pc2h7JQogICB7XHNlbGVjdGZvbnRzXGxzaXplICMxfSUKQEAgLTIwNTIsMTEgKzI3NzYsMTIgQEAKICAgXGlmeFx0ZW1wXGVtcHR5IFxlbHNlCiAgICAgXHNwYWNlICh7XHVuc2Vwc3BhY2VzIFxpZ25vcmVzcGFjZXMgXHRlbXAgXHVuc2tpcH0pJQogICBcZmkKKyAgXG51bGwgJSByZXNldCBcc3BhY2VmYWN0b3I9MTAwMAogfQogCiAlIEBhYmJyIGZvciAiQ29tcHV0LiBKLiIgYW5kIHRoZSBsaWtlLgogJSBObyBmb250IGNoYW5nZSwgYnV0IGRvbid0IGRvIGVuZC1vZi1zZW50ZW5jZSBzcGFjaW5nLgotJSAKKyUKIFxkZWZcYWJiciMxe1xkb2FiYnIgIzEsLFxmaW5pc2h9CiBcZGVmXGRvYWJiciMxLCMyLCMzXGZpbmlzaHslCiAgIHtccGxhaW5mcmVuY2hzcGFjaW5nICMxfSUKQEAgLTIwNjQsOCArMjc4OSwyNTUgQEAKICAgXGlmeFx0ZW1wXGVtcHR5IFxlbHNlCiAgICAgXHNwYWNlICh7XHVuc2Vwc3BhY2VzIFxpZ25vcmVzcGFjZXMgXHRlbXAgXHVuc2tpcH0pJQogICBcZmkKKyAgXG51bGwgJSByZXNldCBcc3BhY2VmYWN0b3I9MTAwMAogfQogCislIEBhc2lzIGp1c3QgeWllbGRzIGl0cyBhcmd1bWVudC4gIFVzZWQgd2l0aCBAdGFibGUsIGZvciBleGFtcGxlLgorJQorXGRlZlxhc2lzIzF7IzF9CisKKyUgQG1hdGggb3V0cHV0cyBpdHMgYXJndW1lbnQgaW4gbWF0aCBtb2RlLgorJQorJSBPbmUgY29tcGxpY2F0aW9uOiBfIHVzdWFsbHkgbWVhbnMgc3Vic2NyaXB0cywgYnV0IGl0IGNvdWxkIGFsc28gbWVhbgorJSBhbiBhY3R1YWwgXyBjaGFyYWN0ZXIsIGFzIGluIEBtYXRoe0B2YXJ7c29tZV92YXJpYWJsZX0gKyAxfS4gIFNvIG1ha2UKKyUgXyBhY3RpdmUsIGFuZCBkaXN0aW5ndWlzaCBieSBzZWVpbmcgaWYgdGhlIGN1cnJlbnQgZmFtaWx5IGlzIFxzbGZhbSwKKyUgd2hpY2ggaXMgd2hhdCBAdmFyIHVzZXMuCit7CisgIFxjYXRjb2RlYFxfID0gXGFjdGl2ZQorICBcZ2RlZlxtYXRodW5kZXJzY29yZXslCisgICAgXGNhdGNvZGVgXF89XGFjdGl2ZQorICAgIFxkZWZfe1xpZm51bVxmYW09XHNsZmFtIFxfXGVsc2Vcc2JcZml9JQorICB9Cit9CislIEFub3RoZXIgY29tcGxpY2F0aW9uOiB3ZSB3YW50IFxcIChhbmQgQFwpIHRvIG91dHB1dCBhIG1hdGggKG9yIHR0KSBcLgorJSBGWUksIHBsYWluLnRleCB1c2VzIFxcIGFzIGEgdGVtcG9yYXJ5IGNvbnRyb2wgc2VxdWVuY2UgKGZvciBubworJSBwYXJ0aWN1bGFyIHJlYXNvbiksIGJ1dCB0aGlzIGlzIG5vdCBhZHZlcnRpc2VkIGFuZCB3ZSBkb24ndCBjYXJlLgorJQorJSBUaGUgXG1hdGhjaGFyIGlzIGNsYXNzPTA9b3JkaW5hcnksIGZhbWlseT03PXR0ZmFtLCBwb3NpdGlvbj01Qz1cLgorXGRlZlxtYXRoYmFja3NsYXNoe1xpZm51bVxmYW09XHR0ZmFtIFxtYXRoY2hhciIwNzVDIFxlbHNlXGJhY2tzbGFzaCBcZml9CislCitcZGVmXG1hdGh7JQorICBcdGV4CisgIFxtYXRodW5kZXJzY29yZQorICBcbGV0XFwgPSBcbWF0aGJhY2tzbGFzaAorICBcbWF0aGFjdGl2ZQorICAlIG1ha2UgdGhlIHRleGluZm8gYWNjZW50IGNvbW1hbmRzIHdvcmsgaW4gbWF0aCBtb2RlCisgIFxsZXRcIj1cZGRvdAorICBcbGV0XCc9XGFjdXRlCisgIFxsZXRcPT1cYmFyCisgIFxsZXRcXj1caGF0CisgIFxsZXRcYD1cZ3JhdmUKKyAgXGxldFx1PVxicmV2ZQorICBcbGV0XHY9XGNoZWNrCisgIFxsZXRcfj1cdGlsZGUKKyAgXGxldFxkb3RhY2NlbnQ9XGRvdAorICAkXGZpbmlzaG1hdGgKK30KK1xkZWZcZmluaXNobWF0aCMxeyMxJFxlbmRncm91cH0gICUgQ2xvc2UgdGhlIGdyb3VwIG9wZW5lZCBieSBcdGV4LgorCislIFNvbWUgYWN0aXZlIGNoYXJhY3RlcnMgKHN1Y2ggYXMgPCkgYXJlIHNwYWNlZCBkaWZmZXJlbnRseSBpbiBtYXRoLgorJSBXZSBoYXZlIHRvIHJlc2V0IHRoZWlyIGRlZmluaXRpb25zIGluIGNhc2UgdGhlIEBtYXRoIHdhcyBhbiBhcmd1bWVudAorJSB0byBhIGNvbW1hbmQgd2hpY2ggc2V0cyB0aGUgY2F0Y29kZXMgKHN1Y2ggYXMgQGl0ZW0gb3IgQHNlY3Rpb24pLgorJQoreworICBcY2F0Y29kZWBeID0gXGFjdGl2ZQorICBcY2F0Y29kZWA8ID0gXGFjdGl2ZQorICBcY2F0Y29kZWA+ID0gXGFjdGl2ZQorICBcY2F0Y29kZWArID0gXGFjdGl2ZQorICBcY2F0Y29kZWAnID0gXGFjdGl2ZQorICBcZ2RlZlxtYXRoYWN0aXZleyUKKyAgICBcbGV0XiA9IFxwdGV4aGF0CisgICAgXGxldDwgPSBccHRleGxlc3MKKyAgICBcbGV0PiA9IFxwdGV4Z3RyCisgICAgXGxldCsgPSBccHRleHBsdXMKKyAgICBcbGV0JyA9IFxwdGV4cXVvdGVyaWdodAorICB9Cit9CisKKyUgQGlubGluZWZtdHtGTVROQU1FLFBST0NFU1NFRC1URVhUfSBhbmQgQGlubGluZXJhd3tGTVROQU1FLFJBVy1URVhUfS4KKyUgSWdub3JlIHVubGVzcyBGTVROQU1FID09IHRleDsgdGhlbiBpdCBpcyBsaWtlIEBpZnRleCBhbmQgQHRleCwKKyUgZXhjZXB0IHNwZWNpZmllZCBhcyBhIG5vcm1hbCBicmFjZWQgYXJnLCBzbyBubyBuZXdsaW5lcyB0byB3b3JyeSBhYm91dC4KKyUgCitcZGVmXG91dGZtdG5hbWV0ZXh7dGV4fQorJQorXGxvbmdcZGVmXGlubGluZWZtdCMxe1xkb2lubGluZWZtdCAjMSxcZmluaXNofQorXGxvbmdcZGVmXGRvaW5saW5lZm10IzEsIzIsXGZpbmlzaHslCisgIFxkZWZcaW5saW5lZm10bmFtZXsjMX0lCisgIFxpZnhcaW5saW5lZm10bmFtZVxvdXRmbXRuYW1ldGV4IFxpZ25vcmVzcGFjZXMgIzJcZmkKK30KKyUgRm9yIHJhdywgbXVzdCBzd2l0Y2ggaW50byBAdGV4IGJlZm9yZSBwYXJzaW5nIHRoZSBhcmd1bWVudCwgdG8gYXZvaWQKKyUgc2V0dGluZyBjYXRjb2RlcyBwcmVtYXR1cmVseS4gIERvaW5nIGl0IHRoaXMgd2F5IG1lYW5zIHRoYXQsIGZvcgorJSBleGFtcGxlLCBAaW5saW5lcmF3e2h0bWwsIGZvb3tiYXJ9IGdldHMgYSBwYXJzZSBlcnJvciBpbnN0ZWFkIG9mIGJlaW5nCislIGlnbm9yZWQuICBCdXQgdGhpcyBpc24ndCBpbXBvcnRhbnQgYmVjYXVzZSBpZiBwZW9wbGUgd2FudCBhIGxpdGVyYWwKKyUgKnJpZ2h0KiBicmFjZSB0aGV5IHdvdWxkIGhhdmUgdG8gdXNlIGEgY29tbWFuZCBhbnl3YXksIHNvIHRoZXkgbWF5IGFzCislIHdlbGwgdXNlIGEgY29tbWFuZCB0byBnZXQgYSBsZWZ0IGJyYWNlIHRvby4gIFdlIGNvdWxkIHJlLXVzZSB0aGUKKyUgZGVsaW1pdGVyIGNoYXJhY3RlciBpZGVhIGZyb20gXHZlcmIsIGJ1dCBpdCBzZWVtcyBsaWtlIG92ZXJraWxsLgorJSAKK1xsb25nXGRlZlxpbmxpbmVyYXd7XHRleCBcZG9pbmxpbmVyYXd9CitcbG9uZ1xkZWZcZG9pbmxpbmVyYXcjMXtcZG9pbmxpbmVyYXd0d28gIzEsXGZpbmlzaH0KK1xkZWZcZG9pbmxpbmVyYXd0d28jMSwjMixcZmluaXNoeyUKKyAgXGRlZlxpbmxpbmVyYXduYW1leyMxfSUKKyAgXGlmeFxpbmxpbmVyYXduYW1lXG91dGZtdG5hbWV0ZXggXGlnbm9yZXNwYWNlcyAjMlxmaQorICBcZW5kZ3JvdXAgJSBjbG9zZSBncm91cCBvcGVuZWQgYnkgXHRleC4KK30KKworCitcbWVzc2FnZXtnbHlwaHMsfQorJSBhbmQgbG9nb3MuCisKKyUgQEAgcHJpbnRzIGFuIEAsIGFzIGRvZXMgQGF0Y2hhcnt9LgorXGRlZlxAe1xjaGFyNjQgfQorXGxldFxhdGNoYXI9XEAKKworJSBAeyBAfSBAbGJyYWNlY2hhcnt9IEByYnJhY2VjaGFye30gYWxsIGdlbmVyYXRlIGJyYWNlIGNoYXJhY3RlcnMuCislIFVubGVzcyB3ZSdyZSBpbiB0eXBld3JpdGVyLCB1c2UgXGVjZm9udCBiZWNhdXNlIHRoZSBDTSB0ZXh0IGZvbnRzIGRvCislIG5vdCBoYXZlIGJyYWNlcywgYW5kIHdlIGRvbid0IHdhbnQgdG8gc3dpdGNoIGludG8gbWF0aC4KK1xkZWZcbXlsYnJhY2V7e1xpZm1vbm9zcGFjZVxlbHNlXGVjZm9udFxmaSBcY2hhcjEyM319CitcZGVmXG15cmJyYWNle3tcaWZtb25vc3BhY2VcZWxzZVxlY2ZvbnRcZmkgXGNoYXIxMjV9fQorXGxldFx7PVxteWxicmFjZSBcbGV0XGxicmFjZWNoYXI9XHsKK1xsZXRcfT1cbXlyYnJhY2UgXGxldFxyYnJhY2VjaGFyPVx9CitcYmVnaW5ncm91cAorICAlIERlZmluaXRpb25zIHRvIHByb2R1Y2UgXHsgYW5kIFx9IGNvbW1hbmRzIGZvciBpbmRpY2VzLAorICAlIGFuZCBAeyBhbmQgQH0gZm9yIHRoZSBhdXgvdG9jIGZpbGVzLgorICBcY2F0Y29kZWBceyA9IFxvdGhlciBcY2F0Y29kZWBcfSA9IFxvdGhlcgorICBcY2F0Y29kZWBcWyA9IDEgXGNhdGNvZGVgXF0gPSAyCisgIFxjYXRjb2RlYFwhID0gMCBcY2F0Y29kZWBcXCA9IFxvdGhlcgorICAhZ2RlZiFsYnJhY2VjbWRbXHtdJQorICAhZ2RlZiFyYnJhY2VjbWRbXH1dJQorICAhZ2RlZiFsYnJhY2VhdGNtZFtAe10lCisgICFnZGVmIXJicmFjZWF0Y21kW0B9XSUKKyFlbmRncm91cAorCislIEBjb21tYXt9IHRvIGF2b2lkICwgcGFyc2luZyBwcm9ibGVtcy4KK1xsZXRcY29tbWEgPSAsCisKKyUgQWNjZW50czogQCwgQGRvdGFjY2VudCBAcmluZ2FjY2VudCBAdWJhcmFjY2VudCBAdWRvdGFjY2VudAorJSBPdGhlcnMgYXJlIGRlZmluZWQgYnkgcGxhaW4gVGVYOiBAYCBAJyBAIiBAXiBAfiBAPSBAdSBAdiBASC4KK1xsZXRcLCA9IFxwdGV4YworXGxldFxkb3RhY2NlbnQgPSBccHRleGRvdAorXGRlZlxyaW5nYWNjZW50IzF7e1xhY2NlbnQyMyAjMX19CitcbGV0XHRpZWFjY2VudCA9IFxwdGV4dAorXGxldFx1YmFyYWNjZW50ID0gXHB0ZXhiCitcbGV0XHVkb3RhY2NlbnQgPSBcZAorCislIE90aGVyIHNwZWNpYWwgY2hhcmFjdGVyczogQHF1ZXN0aW9uZG93biBAZXhjbGFtZG93biBAb3JkZiBAb3JkbQorJSBQbGFpbiBUZVggZGVmaW5lczogQEFBIEBBRSBATyBAT0UgQEwgKHBsdXMgbG93ZXJjYXNlIHZlcnNpb25zKSBAc3MuCitcZGVmXHF1ZXN0aW9uZG93bns/YH0KK1xkZWZcZXhjbGFtZG93bnshYH0KK1xkZWZcb3JkZntcbGVhdmV2bW9kZVxyYWlzZTFleFxoYm94e1xzZWxlY3Rmb250c1xsbGxzaXplIFx1bmRlcmJhcnthfX19CitcZGVmXG9yZG17XGxlYXZldm1vZGVccmFpc2UxZXhcaGJveHtcc2VsZWN0Zm9udHNcbGxsc2l6ZSBcdW5kZXJiYXJ7b319fQorCislIERvdGxlc3MgaSBhbmQgZG90bGVzcyBqLCB1c2VkIGZvciBhY2NlbnRzLgorXGRlZlxpbWFjcm97aX0KK1xkZWZcam1hY3Jve2p9CitcZGVmXGRvdGxlc3MjMXslCisgIFxkZWZcdGVtcHsjMX0lCisgIFxpZnhcdGVtcFxpbWFjcm8gXGlmbW1vZGVcaW1hdGggXGVsc2VccHRleGkgXGZpCisgIFxlbHNlXGlmeFx0ZW1wXGptYWNybyBcaWZtbW9kZVxqbWF0aCBcZWxzZVxqIFxmaQorICBcZWxzZSBcZXJybWVzc2FnZXtAZG90bGVzcyBjYW4gYmUgdXNlZCBvbmx5IHdpdGggaSBvciBqfSUKKyAgXGZpXGZpCit9CisKKyUgVGhlIFxUZVh7fSBsb2dvLCBhcyBpbiBwbGFpbiwgYnV0IHJlc2V0dGluZyB0aGUgc3BhY2luZyBzbyB0aGF0IGEKKyUgcGVyaW9kIGZvbGxvd2luZyBjb3VudHMgYXMgZW5kaW5nIGEgc2VudGVuY2UuICAoSWRlYSBmb3VuZCBpbiBsYXRleC4pCislCitcZWRlZlxUZVh7XFRlWCBcc3BhY2VmYWN0b3I9MTAwMCB9CisKKyUgQExhVGVYe30gbG9nby4gIE5vdCBxdWl0ZSB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSBkZWZpbml0aW9uIGluCislIGxhdGV4Lmx0eCwgc2luY2Ugd2UgdXNlIGEgZGlmZmVyZW50IGZvbnQgZm9yIHRoZSByYWlzZWQgQTsgaXQncyBtb3N0CislIGNvbnZlbmllbnQgZm9yIHVzIHRvIHVzZSBhbiBleHBsaWNpdGx5IHNtYWxsZXIgZm9udCwgcmF0aGVyIHRoYW4gdXNpbmcKKyUgdGhlIFxzY3JpcHRzdHlsZSBmb250IChzaW5jZSB3ZSBkb24ndCByZXNldCBcc2NyaXB0c3R5bGUgYW5kCislIFxzY3JpcHRzY3JpcHRzdHlsZSkuCislCitcZGVmXExhVGVYeyUKKyAgTFxrZXJuLS4zNmVtCisgIHtcc2V0Ym94MD1caGJveHtUfSUKKyAgIFx2Ym94IHRvIFxodDB7XGhib3h7JQorICAgICBcaWZ4XHRleHRub21pbmFsc2l6ZVx4d29yZHB0CisgICAgICAgJSBmb3IgMTBwdCBydW5uaW5nIHRleHQsIFxsbGxzaXplICg4cHQpIGlzIHRvbyBzbWFsbCBmb3IgdGhlIEEgaW4gTGFUZVguCisgICAgICAgJSBSZXZlcnQgdG8gcGxhaW4ncyBcc2NyaXB0c2l6ZSwgd2hpY2ggaXMgN3B0LgorICAgICAgIFxjb3VudDI1NT1cdGhlXGZhbSAkXGZhbVxjb3VudDI1NSBcc2NyaXB0c3R5bGUgQSQlCisgICAgIFxlbHNlCisgICAgICAgJSBGb3IgMTFwdCwgd2UgY2FuIHVzZSBvdXIgbGxsc2l6ZS4KKyAgICAgICBcc2VsZWN0Zm9udHNcbGxsc2l6ZSBBJQorICAgICBcZmkKKyAgICAgfSUKKyAgICAgXHZzcworICB9fSUKKyAgXGtlcm4tLjE1ZW0KKyAgXFRlWAorfQorCislIFNvbWUgbWF0aCBtb2RlIHN5bWJvbHMuCitcZGVmXGJ1bGxldHskXHB0ZXhidWxsZXQkfQorXGRlZlxnZXF7XGlmbW1vZGUgXGdlXGVsc2UgJFxnZSRcZml9CitcZGVmXGxlcXtcaWZtbW9kZSBcbGVcZWxzZSAkXGxlJFxmaX0KK1xkZWZcbWludXN7XGlmbW1vZGUgLVxlbHNlICQtJFxmaX0KKworJSBAZG90c3t9IG91dHB1dHMgYW4gZWxsaXBzaXMgdXNpbmcgdGhlIGN1cnJlbnQgZm9udC4KKyUgV2UgZG8gLjVlbSBwZXIgcGVyaW9kIHNvIHRoYXQgaXQgaGFzIHRoZSBzYW1lIHNwYWNpbmcgaW4gdGhlIGNtCislIHR5cGV3cml0ZXIgZm9udHMgYXMgdGhyZWUgYWN0dWFsIHBlcmlvZCBjaGFyYWN0ZXJzOyBvbiB0aGUgb3RoZXIgaGFuZCwKKyUgaW4gb3RoZXIgdHlwZXdyaXRlciBmb250cyB0aHJlZSBwZXJpb2RzIGFyZSB3aWRlciB0aGFuIDEuNWVtLiAgU28gZG8KKyUgd2hpY2hldmVyIGlzIGxhcmdlci4KKyUKK1xkZWZcZG90c3slCisgIFxsZWF2ZXZtb2RlCisgIFxzZXRib3gwPVxoYm94ey4uLn0lIGdldCB3aWR0aCBvZiB0aHJlZSBwZXJpb2RzCisgIFxpZmRpbVx3ZDAgPiAxLjVlbQorICAgIFxkaW1lbjAgPSBcd2QwCisgIFxlbHNlCisgICAgXGRpbWVuMCA9IDEuNWVtCisgIFxmaQorICBcaGJveCB0byBcZGltZW4weyUKKyAgICBcaHNraXAgMHB0IHBsdXMuMjVmaWwKKyAgICAuXGhza2lwIDBwdCBwbHVzMWZpbAorICAgIC5caHNraXAgMHB0IHBsdXMxZmlsCisgICAgLlxoc2tpcCAwcHQgcGx1cy41ZmlsCisgIH0lCit9CisKKyUgQGVuZGRvdHN7fSBpcyBhbiBlbmQtb2Ytc2VudGVuY2UgZWxsaXBzaXMuCislCitcZGVmXGVuZGRvdHN7JQorICBcZG90cworICBcc3BhY2VmYWN0b3I9XGVuZG9mc2VudGVuY2VzcGFjZWZhY3RvcgorfQorCislIEBwb2ludHt9LCBAcmVzdWx0e30sIEBleHBhbnNpb257fSwgQHByaW50e30sIEBlcXVpdnt9LgorJQorJSBTaW5jZSB0aGVzZSBjaGFyYWN0ZXJzIGFyZSB1c2VkIGluIGV4YW1wbGVzLCB0aGV5IHNob3VsZCBiZSBhbiBldmVuIG51bWJlciBvZgorJSBcdHQgd2lkdGhzLiBFYWNoIFx0dCBjaGFyYWN0ZXIgaXMgMWVuLCBzbyB0d28gbWFrZXMgaXQgMWVtLgorJQorXGRlZlxwb2ludHskXHN0YXIkfQorXGRlZlxhcnJvd3tcbGVhdmV2bW9kZVxyYWlzZS4wNWV4XGhib3ggdG8gMWVte1xoZmlsJFxyaWdodGFycm93JFxoZmlsfX0KK1xkZWZccmVzdWx0e1xsZWF2ZXZtb2RlXHJhaXNlLjA1ZXhcaGJveCB0byAxZW17XGhmaWwkXFJpZ2h0YXJyb3ckXGhmaWx9fQorXGRlZlxleHBhbnNpb257XGxlYXZldm1vZGVcaGJveCB0byAxZW17XGhmaWwkXG1hcHN0byRcaGZpbH19CitcZGVmXHByaW50e1xsZWF2ZXZtb2RlXGxvd2VyLjFleFxoYm94IHRvIDFlbXtcaGZpbCRcZGFzaHYkXGhmaWx9fQorXGRlZlxlcXVpdntcbGVhdmV2bW9kZVxoYm94IHRvIDFlbXtcaGZpbCRccHRleGVxdWl2JFxoZmlsfX0KKworJSBUaGUgQGVycm9ye30gY29tbWFuZC4KKyUgQWRhcHRlZCBmcm9tIHRoZSBUZVhib29rJ3MgXGJveGl0LgorJQorXG5ld2JveFxlcnJvcmJveAorJQore1x0ZW50dCBcZ2xvYmFsXGRpbWVuMCA9IDNlbX0lIFdpZHRoIG9mIHRoZSBib3guCitcZGltZW4yID0gLjU1cHQgJSBUaGlja25lc3Mgb2YgcnVsZXMKKyUgVGhlIHRleHQuIChgcicgaXMgb3BlbiBvbiB0aGUgcmlnaHQsIGBlJyBzb21ld2hhdCBsZXNzIHNvIG9uIHRoZSBsZWZ0LikKK1xzZXRib3gwID0gXGhib3h7XGtlcm4tLjc1cHQgXHJlZHVjZWRzZiBccHV0d29yZGVycm9yXGtlcm4tMS41cHR9CislCitcc2V0Ym94XGVycm9yYm94PVxoYm94IHRvIFxkaW1lbjB7XGhmaWwKKyAgIFxoc2l6ZSA9IFxkaW1lbjAgXGFkdmFuY2VcaHNpemUgYnkgLTUuOHB0ICUgU3BhY2UgdG8gbGVmdCtyaWdodC4KKyAgIFxhZHZhbmNlXGhzaXplIGJ5IC0yXGRpbWVuMiAlIFJ1bGVzLgorICAgXHZib3h7JQorICAgICAgXGhydWxlIGhlaWdodFxkaW1lbjIKKyAgICAgIFxoYm94e1x2cnVsZSB3aWR0aFxkaW1lbjIgXGtlcm4zcHQgICAgICAgICAgJSBTcGFjZSB0byBsZWZ0IG9mIHRleHQuCisgICAgICAgICBcdnRvcHtca2VybjIuNHB0IFxib3gwIFxrZXJuMi40cHR9JSBTcGFjZSBhYm92ZS9iZWxvdy4KKyAgICAgICAgIFxrZXJuM3B0XHZydWxlIHdpZHRoXGRpbWVuMn0lIFNwYWNlIHRvIHJpZ2h0LgorICAgICAgXGhydWxlIGhlaWdodFxkaW1lbjJ9CisgICAgXGhmaWx9CislCitcZGVmXGVycm9ye1xsZWF2ZXZtb2RlXGxvd2VyLjdleFxjb3B5XGVycm9yYm94fQorCiAlIEBwb3VuZHN7fSBpcyBhIHN0ZXJsaW5nIHNpZ24sIHdoaWNoIEtudXRoIHB1dCBpbiB0aGUgQ00gaXRhbGljIGZvbnQuCiAlCiBcZGVmXHBvdW5kc3t7XGl0XCR9fQpAQCAtMjA3NSw0OSArMzA0NywxMTMgQEAKICUgVGhlaWxpbmcsIHdoaWNoIHN1cHBvcnQgcmVndWxhciwgc2xhbnRlZCwgYm9sZCBhbmQgYm9sZCBzbGFudGVkIChhbmQKICUgIm91dGxpbmVkIiAoYmxhY2tib2FyZCBib2FyZCwgc29ydCBvZikgdmVyc2lvbnMsIHdoaWNoIHdlIGRvbid0IG5lZWQpLgogJSBJdCBpcyBhdmFpbGFibGUgZnJvbSBodHRwOi8vd3d3LmN0YW4ub3JnL3RleC1hcmNoaXZlL2ZvbnRzL2V1cm9zeW0uCi0lIAorJQogJSBBbHRob3VnaCBvbmx5IHJlZ3VsYXIgaXMgdGhlIHRydWx5IG9mZmljaWFsIEV1cm8gc3ltYm9sLCB3ZSBpZ25vcmUKICUgdGhhdC4gIFRoZSBFdXJvIGlzIGRlc2lnbmVkIHRvIGJlIHNsaWdodGx5IHRhbGxlciB0aGFuIHRoZSByZWd1bGFyCiAlIGZvbnQgaGVpZ2h0LgotJSAKKyUKICUgZmV5bXIgLSByZWd1bGFyCiAlIGZleW1vIC0gc2xhbnRlZAogJSBmZXliciAtIGJvbGQKICUgZmV5Ym8gLSBib2xkIHNsYW50ZWQKLSUgCislCiAlIFRoZXJlIGlzIG5vIGdvb2QgKGZyZWUpIHR5cGV3cml0ZXIgdmVyc2lvbiwgdG8gbXkga25vd2xlZGdlLgogJSBBIGZleW1yMTAgZXVybyBpcyB+Ny4zcHQgd2lkZSwgd2hpbGUgYSBub3JtYWwgY210dDEwIGNoYXIgaXMgfjUuMjVwdCB3aWRlLgogJSBIbW0uCi0lIAorJQogJSBBbHNvIGRvZXNuJ3Qgd29yayBpbiBtYXRoLiAgRG8gd2UgbmVlZCB0byBkbyBtYXRoIHdpdGggZXVybyBzeW1ib2xzPwogJSBIb3BlIG5vdC4KLSUgCi0lIAorJQorJQogXGRlZlxldXJve3tcZXVyb2ZvbnQgZX19CiBcZGVmXGV1cm9mb250eyUKICAgJSBXZSBzZXQgdGhlIGZvbnQgYXQgZWFjaCBjb21tYW5kLCByYXRoZXIgdGhhbiBwcmVkZWZpbmluZyBpdCBpbgogICAlIFx0ZXh0Zm9udHMgYW5kIHRoZSBvdGhlciBmb250LXN3aXRjaGluZyBjb21tYW5kcywgc28gdGhhdAogICAlIGluc3RhbGxhdGlvbnMgd2hpY2ggbmV2ZXIgbmVlZCB0aGUgc3ltYm9sIGRvbid0IGhhdmUgdG8gaGF2ZSB0aGUKICAgJSBmb250IGluc3RhbGxlZC4KLSAgJSAKKyAgJQogICAlIFRoZXJlIGlzIG9ubHkgb25lIGRlc2lnbmVkIHNpemUgKG5vbWluYWwgMTBwdCksIHNvIHdlIGFsd2F5cyBzY2FsZQogICAlIHRoYXQgdG8gdGhlIGN1cnJlbnQgbm9taW5hbCBzaXplLgotICAlIAorICAlCiAgICUgQnkgdGhlIHdheSwgc2ltcGx5IHVzaW5nICJhdCAxZW0iIHdvcmtzIGZvciBjbXIxMCBhbmQgdGhlIGxpa2UsIGJ1dAogICAlIGRvZXMgbm90IHdvcmsgZm9yIGNtYngxMCBhbmQgb3RoZXIgZXh0ZW5kZWQvc2hydW5rZW4gZm9udHMuCi0gICUgCisgICUKICAgXGRlZlxldXJvc2l6ZXtcY3NuYW1lXGN1cmZvbnRzaXplIG5vbWluYWxzaXplXGVuZGNzbmFtZX0lCiAgICUKLSAgXGlmeFxjdXJmb250c3R5bGVcYmZzdHlsZW5hbWUgCisgIFxpZnhcY3VyZm9udHN0eWxlXGJmc3R5bGVuYW1lCiAgICAgJSBib2xkOgogICAgIFxmb250XHRoaXNldXJvZm9udCA9IFxpZnVzaW5naXR7ZmV5Ym8xMH17ZmV5YnIxMH0gYXQgXGV1cm9zaXplCi0gIFxlbHNlIAorICBcZWxzZQogICAgICUgcmVndWxhcjoKICAgICBcZm9udFx0aGlzZXVyb2ZvbnQgPSBcaWZ1c2luZ2l0e2ZleW1vMTB9e2ZleW1yMTB9IGF0IFxldXJvc2l6ZQogICBcZmkKICAgXHRoaXNldXJvZm9udAogfQogCislIEdseXBocyBmcm9tIHRoZSBFQyBmb250cy4gIFdlIGRvbid0IHVzZSBcbGV0IGZvciB0aGUgYWxpYXNlcywgYmVjYXVzZQorJSBzb21ldGltZXMgd2UgcmVkZWZpbmUgdGhlIG9yaWdpbmFsIG1hY3JvLCBhbmQgdGhlIGFsaWFzIHNob3VsZCByZWZsZWN0CislIHRoZSByZWRlZmluaXRpb24uCislCislIFVzZSBMYVRlWCBuYW1lcyBmb3IgdGhlIEljZWxhbmRpYyBsZXR0ZXJzLgorXGRlZlxESHt7XGVjZm9udCBcY2hhciJEMH19ICUgRXRoCitcZGVmXGRoe3tcZWNmb250IFxjaGFyIkYwfX0gJSBldGgKK1xkZWZcVEh7e1xlY2ZvbnQgXGNoYXIiREV9fSAlIFRob3JuCitcZGVmXHRoe3tcZWNmb250IFxjaGFyIkZFfX0gJSB0aG9ybgorJQorXGRlZlxndWlsbGVtZXRsZWZ0e3tcZWNmb250IFxjaGFyIjEzfX0KK1xkZWZcZ3VpbGxlbW90bGVmdHtcZ3VpbGxlbWV0bGVmdH0KK1xkZWZcZ3VpbGxlbWV0cmlnaHR7e1xlY2ZvbnQgXGNoYXIiMTR9fQorXGRlZlxndWlsbGVtb3RyaWdodHtcZ3VpbGxlbWV0cmlnaHR9CitcZGVmXGd1aWxzaW5nbGxlZnR7e1xlY2ZvbnQgXGNoYXIiMEV9fQorXGRlZlxndWlsc2luZ2xyaWdodHt7XGVjZm9udCBcY2hhciIwRn19CitcZGVmXHF1b3RlZGJsYmFzZXt7XGVjZm9udCBcY2hhciIxMn19CitcZGVmXHF1b3Rlc2luZ2xiYXNle3tcZWNmb250IFxjaGFyIjBEfX0KKyUKKyUgVGhpcyBwb3NpdGlvbmluZyBpcyBub3QgcGVyZmVjdCAoc2VlIHRoZSBvZ29uZWsgTGFUZVggcGFja2FnZSksIGJ1dAorJSB3ZSBoYXZlIHRoZSBwcmVjb21wb3NlZCBnbHlwaHMgZm9yIHRoZSBtb3N0IGNvbW1vbiBjYXNlcy4gIFdlIHB1dCB0aGUKKyUgdGVzdHMgdG8gdXNlIHRob3NlIGdseXBocyBpbiB0aGUgc2luZ2xlIFxvZ29uZWsgbWFjcm8gc28gd2UgaGF2ZSBmZXdlcgorJSBkdW1teSBkZWZpbml0aW9ucyB0byB3b3JyeSBhYm91dCBmb3IgaW5kZXggZW50cmllcywgZXRjLgorJQorJSBvZ29uZWsgaXMgYWxzbyB1c2VkIHdpdGggb3RoZXIgbGV0dGVycyBpbiBMaXRodWFuaWFuIChJT1UpLCBidXQgdXNpbmcKKyUgdGhlIHByZWNvbXBvc2VkIGdseXBocyBmb3IgdGhvc2UgaXMgbm90IHNvIGVhc3kgc2luY2UgdGhleSBhcmVuJ3QgaW4KKyUgdGhlIHNhbWUgRUMgZm9udC4KK1xkZWZcb2dvbmVrIzF7eyUKKyAgXGRlZlx0ZW1weyMxfSUKKyAgXGlmeFx0ZW1wXG1hY3JvY2hhckFcQW9nb25laworICBcZWxzZVxpZnhcdGVtcFxtYWNyb2NoYXJhXGFvZ29uZWsKKyAgXGVsc2VcaWZ4XHRlbXBcbWFjcm9jaGFyRVxFb2dvbmVrCisgIFxlbHNlXGlmeFx0ZW1wXG1hY3JvY2hhcmVcZW9nb25laworICBcZWxzZQorICAgIFxlY2ZvbnQgXHNldGJveDA9XGhib3h7IzF9JQorICAgIFxpZmRpbVxodDA9MWV4XGFjY2VudCIwQyAjMSUKKyAgICBcZWxzZVxvb2FsaWdue1x1bmhib3gwXGNyY3JcaGlkZXdpZHRoXGNoYXIiMEMgXGhpZGV3aWR0aH0lCisgICAgXGZpCisgIFxmaVxmaVxmaVxmaQorICB9JQorfQorXGRlZlxBb2dvbmVre3tcZWNmb250IFxjaGFyIjgxfX1cZGVmXG1hY3JvY2hhckF7QX0KK1xkZWZcYW9nb25la3t7XGVjZm9udCBcY2hhciJBMX19XGRlZlxtYWNyb2NoYXJhe2F9CitcZGVmXEVvZ29uZWt7e1xlY2ZvbnQgXGNoYXIiODZ9fVxkZWZcbWFjcm9jaGFyRXtFfQorXGRlZlxlb2dvbmVre3tcZWNmb250IFxjaGFyIkE2fX1cZGVmXG1hY3JvY2hhcmV7ZX0KKyUKKyUgVXNlIHRoZSBlYyogZm9udHMgKGNtLXN1cGVyIGluIG91dGxpbmUgZm9ybWF0KSBmb3Igbm9uLUNNIGdseXBocy4KK1xkZWZcZWNmb250eyUKKyAgJSBXZSBjYW4ndCBkaXN0aW5ndWlzaCBzZXJpZi9zYW5zIGFuZCBpdGFsaWMvc2xhbnRlZCwgYnV0IHRoaXMKKyAgJSBpcyB1c2VkIGZvciBjcnVkZSBoYWNrcyBhbnl3YXkgKGxpa2UgYWRkaW5nIEZyZW5jaCBhbmQgR2VybWFuCisgICUgcXVvdGVzIHRvIGRvY3VtZW50cyB0eXBlc2V0IHdpdGggQ00sIHdoZXJlIHdlIGxvc2Uga2VybmluZyksIHNvCisgICUgaG9wZWZ1bGx5IG5vYm9keSB3aWxsIG5vdGljZS9jYXJlLgorICBcZWRlZlxlY3NpemV7XGNzbmFtZVxjdXJmb250c2l6ZSBlY3NpemVcZW5kY3NuYW1lfSUKKyAgXGVkZWZcbm9taW5hbHNpemV7XGNzbmFtZVxjdXJmb250c2l6ZSBub21pbmFsc2l6ZVxlbmRjc25hbWV9JQorICBcaWZ4XGN1cmZvbnRzdHlsZVxiZnN0eWxlbmFtZQorICAgICUgYm9sZDoKKyAgICBcZm9udFx0aGlzZWNmb250ID0gZWNiXGlmdXNpbmdpdHtpfXt4fVxlY3NpemUgXHNwYWNlIGF0IFxub21pbmFsc2l6ZQorICBcZWxzZQorICAgICUgcmVndWxhcjoKKyAgICBcZm9udFx0aGlzZWNmb250ID0gZWNcaWZ1c2luZ2l0e3RpfXtybX1cZWNzaXplIFxzcGFjZSBhdCBcbm9taW5hbHNpemUKKyAgXGZpCisgIFx0aGlzZWNmb250Cit9CisKICUgQHJlZ2lzdGVyZWRzeW1ib2wgLSBSIGluIGEgY2lyY2xlLiAgVGhlIGZvbnQgZm9yIHRoZSBSIHNob3VsZCByZWFsbHkKICUgYmUgc21hbGxlciB5ZXQsIGJ1dCBsbGxzaXplIGlzIHRoZSBiZXN0IHdlIGNhbiBkbyBmb3Igbm93LgogJSBBZGFwdGVkIGZyb20gdGhlIHBsYWluLnRleCBkZWZpbml0aW9uIG9mIFxjb3B5cmlnaHQuCkBAIC0yMTI4LDE0ICszMTY0LDI0IEBACiAgICAgfSQlCiB9CiAKKyUgQHRleHRkZWdyZWUgLSB0aGUgbm9ybWFsIGRlZ3JlZXMgc2lnbi4KKyUKK1xkZWZcdGV4dGRlZ3JlZXskXlxjaXJjJH0KKwogJSBMYXVyZW50IFNpZWJlbm1hbm4gcmVwb3J0cyBcT3JiIHVuZGVmaW5lZCB3aXRoOgogJSAgVGV4dHVyZXMgMS43LjcgKHByZWxvYWRlZCBmb3JtYXQ9cGxhaW4gOTMuMTAuMTQpICAoNjhLKSAgMTYgQVBSIDIwMDQgMDI6MzgKICUgc28gd2UnbGwgZGVmaW5lIGl0IGlmIG5lY2Vzc2FyeS4KLSUgCi1caWZ4XE9yYlx1bmRlZmluZWQKKyUKK1xpZnhcT3JiXHRoaXNpc3VuZGVmaW5lZAogXGRlZlxPcmJ7XG1hdGhoZXhib3gyMER9CiBcZmkKIAorJSBRdW90ZXMuCitcY2hhcmRlZlxxdW90ZWRibGxlZnQ9IjVDCitcY2hhcmRlZlxxdW90ZWRibHJpZ2h0PWBcIgorXGNoYXJkZWZccXVvdGVsZWZ0PWBcYAorXGNoYXJkZWZccXVvdGVyaWdodD1gXCcKKwogCiBcbWVzc2FnZXtwYWdlIGhlYWRpbmdzLH0KIApAQCAtMjE1NCw4ICszMjAwLDkgQEAKIFxuZXdpZlxpZnNldHNob3J0Y29udGVudHNhZnRlcnRpdGxlcGFnZQogIFxsZXRcc2V0c2hvcnRjb250ZW50c2FmdGVydGl0bGVwYWdlID0gXHNldHNob3J0Y29udGVudHNhZnRlcnRpdGxlcGFnZXRydWUKIAotXHBhcnNlYXJnZGVmXHNob3J0dGl0bGVwYWdle1xiZWdpbmdyb3VwXGhib3h7fVx2c2tpcCAxLjVpbiBcY2hhcHJtIFxjZW50ZXJsaW5leyMxfSUKLSAgICAgICAgXGVuZGdyb3VwXHBhZ2VcaGJveHt9XHBhZ2V9CitccGFyc2VhcmdkZWZcc2hvcnR0aXRsZXBhZ2V7JQorICBcYmVnaW5ncm91cCBcaGJveHt9XHZza2lwIDEuNWluIFxjaGFwcm0gXGNlbnRlcmxpbmV7IzF9JQorICBcZW5kZ3JvdXBccGFnZVxoYm94e31ccGFnZX0KIAogXGVudmRlZlx0aXRsZXBhZ2V7JQogICAlIE9wZW4gb25lIGV4dHJhIGdyb3VwLCBhcyB3ZSB3YW50IHRvIGNsb3NlIGl0IGluIHRoZSBtaWRkbGUgb2YgXEV0aXRsZXBhZ2UuCkBAIC0yMjE1LDE3ICszMjYyLDE0IEBACiAgIFxmaW5pc2hlZHRpdGxlcGFnZXRydWUKIH0KIAotJSUlIE1hY3JvcyB0byBiZSB1c2VkIHdpdGhpbiBAdGl0bGVwYWdlOgorJSBNYWNyb3MgdG8gYmUgdXNlZCB3aXRoaW4gQHRpdGxlcGFnZToKIAogXGxldFxzdWJ0aXRsZXJtPVx0ZW5ybQogXGRlZlxzdWJ0aXRsZWZvbnR7XHN1YnRpdGxlcm0gXG5vcm1hbGJhc2VsaW5lc2tpcCA9IDEzcHQgXG5vcm1hbGJhc2VsaW5lc30KIAotXGRlZlxhdXRob3Jmb250e1xhdXRob3JybSBcbm9ybWFsYmFzZWxpbmVza2lwID0gMTZwdCBcbm9ybWFsYmFzZWxpbmVzCi0JCVxsZXRcdHQ9XGF1dGhvcnR0fQotCiBccGFyc2VhcmdkZWZcdGl0bGV7JQogICBcY2hlY2tlbnZcdGl0bGVwYWdlCi0gIFxsZWZ0bGluZXtcdGl0bGVmb250c1xybSAjMX0KKyAgXGxlZnRsaW5le1x0aXRsZWZvbnRzXHJtaXNib2xkICMxfQogICAlIHByaW50IGEgcnVsZSBhdCB0aGUgcGFnZSBib3R0b20gYWxzby4KICAgXGZpbmlzaGVkdGl0bGVwYWdlZmFsc2UKICAgXHZza2lwNHB0IFxocnVsZSBoZWlnaHQgNHB0IHdpZHRoIFxoc2l6ZSBcdnNraXA0cHQKQEAgLTIyNDYsMTIgKzMyOTAsMTIgQEAKICAgXGVsc2UKICAgICBcY2hlY2tlbnZcdGl0bGVwYWdlCiAgICAgXGlmc2VlbmF1dGhvclxlbHNlIFx2c2tpcCAwcHQgcGx1cyAxZmlsbGwgXHNlZW5hdXRob3J0cnVlIFxmaQotICAgIHtcYXV0aG9yZm9udCBcbGVmdGxpbmV7IzF9fSUKKyAgICB7XHNlY2ZvbnRzXHJtaXNib2xkIFxsZWZ0bGluZXsjMX19JQogICBcZmkKIH0KIAogCi0lJSUgU2V0IHVwIHBhZ2UgaGVhZGluZ3MgYW5kIGZvb3RpbmdzLgorJSBTZXQgdXAgcGFnZSBoZWFkaW5ncyBhbmQgZm9vdGluZ3MuCiAKIFxsZXRcdGhpc3BhZ2U9XGZvbGlvCiAKQEAgLTIyOTksMTIgKzMzNDMsMzkgQEAKICAgJQogICAlIExlYXZlIHNvbWUgc3BhY2UgZm9yIHRoZSBmb290bGluZS4gIEhvcGVmdWxseSBvayB0byBhc3N1bWUKICAgJSBAZXZlbmZvb3Rpbmcgd2lsbCBub3QgYmUgdXNlZCBieSBpdHNlbGYuCi0gIFxnbG9iYWxcYWR2YW5jZVxwYWdlaGVpZ2h0IGJ5IC1cYmFzZWxpbmVza2lwCi0gIFxnbG9iYWxcYWR2YW5jZVx2c2l6ZSBieSAtXGJhc2VsaW5lc2tpcAorICBcZ2xvYmFsXGFkdmFuY2VccGFnZWhlaWdodCBieSAtMTJwdAorICBcZ2xvYmFsXGFkdmFuY2VcdnNpemUgYnkgLTEycHQKIH0KIAogXHBhcnNlYXJnZGVmXGV2ZXJ5Zm9vdGluZ3tcb2RkZm9vdGluZ3h4eHsjMX1cZXZlbmZvb3Rpbmd4eHh7IzF9fQogCislIEBldmVuaGVhZGluZ21hcmtzIHRvcCAgICAgXHRoaXNjaGFwdGVyIDwtIGNoYXB0ZXIgYXQgdGhlIHRvcCBvZiBhIHBhZ2UKKyUgQGV2ZW5oZWFkaW5nbWFya3MgYm90dG9tICBcdGhpc2NoYXB0ZXIgPC0gY2hhcHRlciBhdCB0aGUgYm90dG9tIG9mIGEgcGFnZQorJQorJSBUaGUgc2FtZSBzZXQgb2YgYXJndW1lbnRzIGZvcjoKKyUKKyUgQG9kZGhlYWRpbmdtYXJrcworJSBAZXZlbmZvb3RpbmdtYXJrcworJSBAb2RkZm9vdGluZ21hcmtzCislIEBldmVyeWhlYWRpbmdtYXJrcworJSBAZXZlcnlmb290aW5nbWFya3MKKworXGRlZlxldmVuaGVhZGluZ21hcmtze1xoZWFkaW5nbWFya3N7ZXZlbn17aGVhZGluZ319CitcZGVmXG9kZGhlYWRpbmdtYXJrc3tcaGVhZGluZ21hcmtze29kZH17aGVhZGluZ319CitcZGVmXGV2ZW5mb290aW5nbWFya3N7XGhlYWRpbmdtYXJrc3tldmVufXtmb290aW5nfX0KK1xkZWZcb2RkZm9vdGluZ21hcmtze1xoZWFkaW5nbWFya3N7b2RkfXtmb290aW5nfX0KK1xkZWZcZXZlcnloZWFkaW5nbWFya3MjMSB7XGhlYWRpbmdtYXJrc3tldmVufXtoZWFkaW5nfXsjMX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgXGhlYWRpbmdtYXJrc3tvZGR9e2hlYWRpbmd9eyMxfSB9CitcZGVmXGV2ZXJ5Zm9vdGluZ21hcmtzIzEge1xoZWFkaW5nbWFya3N7ZXZlbn17Zm9vdGluZ317IzF9CisgICAgICAgICAgICAgICAgICAgICAgICAgIFxoZWFkaW5nbWFya3N7b2RkfXtmb290aW5nfXsjMX0gfQorJSAjMSA9IGV2ZW4vb2RkLCAjMiA9IGhlYWRpbmcvZm9vdGluZywgIzMgPSB0b3AvYm90dG9tLgorXGRlZlxoZWFkaW5nbWFya3MjMSMyIzMgeyUKKyAgXGV4cGFuZGFmdGVyXGxldFxleHBhbmRhZnRlclx0ZW1wIFxjc25hbWUgZ2V0IzNoZWFkaW5nbWFya3NcZW5kY3NuYW1lCisgIFxnbG9iYWxcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSBnZXQjMSMybWFya3NcZW5kY3NuYW1lIFx0ZW1wCit9CisKK1xldmVyeWhlYWRpbmdtYXJrcyBib3R0b20KK1xldmVyeWZvb3RpbmdtYXJrcyBib3R0b20KIAogJSBAaGVhZGluZ3MgZG91YmxlICAgICAgdHVybnMgaGVhZGluZ3Mgb24gZm9yIGRvdWJsZS1zaWRlZCBwcmludGluZy4KICUgQGhlYWRpbmdzIHNpbmdsZSAgICAgIHR1cm5zIGhlYWRpbmdzIG9uIGZvciBzaW5nbGUtc2lkZWQgcHJpbnRpbmcuCkBAIC0yMzE4LDEwICszMzg5LDE0IEBACiAKIFxkZWZcaGVhZGluZ3MgIzEge1xjc25hbWUgSEVBRElOR1MjMVxlbmRjc25hbWV9CiAKLVxkZWZcSEVBRElOR1NvZmZ7JQotXGdsb2JhbFxldmVuaGVhZGxpbmU9e1xoZmlsfSBcZ2xvYmFsXGV2ZW5mb290bGluZT17XGhmaWx9Ci1cZ2xvYmFsXG9kZGhlYWRsaW5lPXtcaGZpbH0gXGdsb2JhbFxvZGRmb290bGluZT17XGhmaWx9fQotXEhFQURJTkdTb2ZmCitcZGVmXGhlYWRpbmdzb2ZmeyUgbm9uLWdsb2JhbCBoZWFkaW5ncyBlbGltaW5hdGlvbgorICBcZXZlbmhlYWRsaW5lPXtcaGZpbH1cZXZlbmZvb3RsaW5lPXtcaGZpbH0lCisgICBcb2RkaGVhZGxpbmU9e1xoZmlsfVxvZGRmb290bGluZT17XGhmaWx9JQorfQorCitcZGVmXEhFQURJTkdTb2Zme3tcZ2xvYmFsZGVmcz0xIFxoZWFkaW5nc29mZn19ICUgZ2xvYmFsIHNldHRpbmcKK1xIRUFESU5HU29mZiAgJSBpdCdzIHRoZSBkZWZhdWx0CisKICUgV2hlbiB3ZSB0dXJuIGhlYWRpbmdzIG9uLCBzZXQgdGhlIHBhZ2UgbnVtYmVyIHRvIDEuCiAlIEZvciBkb3VibGUtc2lkZWQgcHJpbnRpbmcsIHB1dCBjdXJyZW50IGZpbGUgbmFtZSBpbiBsb3dlciBsZWZ0IGNvcm5lciwKICUgY2hhcHRlciBuYW1lIG9uIGluc2lkZSB0b3Agb2YgcmlnaHQgaGFuZCBwYWdlcywgZG9jdW1lbnQKQEAgLTIzNzIsNyArMzQ0Nyw3IEBACiAlIFRoaXMgcHJvZHVjZXMgRGF5IE1vbnRoIFllYXIgc3R5bGUgb2Ygb3V0cHV0LgogJSBPbmx5IGRlZmluZSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLCBpbiBjYXNlIGEgdHhpLT8/LnRleCBmaWxlIGhhcyBzZXQKICUgdXAgYSBkaWZmZXJlbnQgZm9ybWF0IChlLmcuLCB0eGktY3MudGV4IGRvZXMgdGhpcykuCi1caWZ4XHRvZGF5XHVuZGVmaW5lZAorXGlmeFx0b2RheVx0aGlzaXN1bmRlZmluZWQKIFxkZWZcdG9kYXl7JQogICBcbnVtYmVyXGRheVxzcGFjZQogICBcaWZjYXNlXG1vbnRoCkBAIC0yNDMzLDcgKzM1MDgsNyBAQAogICAgIFxiZWdpbmdyb3VwCiAgICAgICBcYWR2YW5jZVxsZWZ0c2tpcCBieS1cdGFibGVpbmRlbnQKICAgICAgIFxhZHZhbmNlXGhzaXplIGJ5XHRhYmxlaW5kZW50Ci0gICAgICBcYWR2YW5jZVxyaWdodHNraXAgYnkwcHQgcGx1czFmaWwKKyAgICAgIFxhZHZhbmNlXHJpZ2h0c2tpcCBieTBwdCBwbHVzMWZpbFxyZWxheAogICAgICAgXGxlYXZldm1vZGVcdW5oYm94MFxwYXIKICAgICBcZW5kZ3JvdXAKICAgICAlCkBAIC0yNDQ3LDcgKzM1MjIsNyBAQAogICAgICUgY2F1c2UgdGhlIGV4YW1wbGUgYW5kIHRoZSBpdGVtIHRvIGNyYXNoIHRvZ2V0aGVyLiAgU28gd2UgdXNlIHRoaXMKICAgICAlIGJpemFycmUgdmFsdWUgb2YgMTAwMDEgYXMgYSBzaWduYWwgdG8gXGFib3ZlZW52YnJlYWsgdG8gaW5zZXJ0CiAgICAgJSBccGFyc2tpcCBnbHVlIGFmdGVyIGFsbC4gIFNlY3Rpb24gdGl0bGVzIGFyZSBoYW5kbGVkIHRoaXMgd2F5IGFsc28uCi0gICAgJSAKKyAgICAlCiAgICAgXHBlbmFsdHkgMTAwMDEKICAgICBcZW5kZ3JvdXAKICAgICBcaXRlbXhuZWVkc25lZ2F0aXZldnNraXBmYWxzZQpAQCAtMjU0MSw5ICszNjE2LDE4IEBACiAgIFxwYXJpbmRlbnQ9MHB0CiAgIFxwYXJza2lwPVxzbWFsbHNraXBhbW91bnQKICAgXGlmZGltXHBhcnNraXA9MHB0IFxwYXJza2lwPTJwdCBcZmkKKyAgJQorICAlIFRyeSB0eXBlc2V0dGluZyB0aGUgaXRlbSBtYXJrIHRoYXQgaWYgdGhlIGRvY3VtZW50IGVycm9uZW91c2x5IHNheXMKKyAgJSBzb21ldGhpbmcgbGlrZSBAaXRlbWl6ZSBAc2FtcCAoaW50ZW5kaW5nIEB0YWJsZSksIHRoZXJlJ3MgYW4gZXJyb3IKKyAgJSByaWdodCBhd2F5IGF0IHRoZSBAaXRlbWl6ZS4gIEl0J3Mgbm90IHRoZSBiZXN0IGVycm9yIG1lc3NhZ2UgaW4gdGhlCisgICUgd29ybGQsIGJ1dCBpdCdzIGJldHRlciB0aGFuIGxlYXZpbmcgaXQgdG8gdGhlIEBpdGVtLiAgVGhpcyBtZWFucyBpZgorICAlIHRoZSB1c2VyIHdhbnRzIGFuIGVtcHR5IG1hcmssIHRoZXkgaGF2ZSB0byBzYXkgQHd7fSBub3QganVzdCBAdy4KICAgXGRlZlxpdGVtY29udGVudHN7IzF9JQorICBcc2V0Ym94MCA9IFxoYm94e1xpdGVtY29udGVudHN9JQorICAlCiAgICUgQGl0ZW1pemUgd2l0aCBubyBhcmcgaXMgZXF1aXZhbGVudCB0byBAaXRlbWl6ZSBAYnVsbGV0LgogICBcaWZ4XGl0ZW1jb250ZW50c1xlbXB0eVxkZWZcaXRlbWNvbnRlbnRze1xidWxsZXR9XGZpCisgICUKICAgXGxldFxpdGVtPVxpdGVtaXplaXRlbQogfQogCkBAIC0yNTY0LDYgKzM2NDgsNyBAQAogICAgXGlmbnVtXGxhc3RwZW5hbHR5PDEwMDAwIFxwYXJza2lwPTBpbiBcZmkKICAgIFxub2luZGVudAogICAgXGhib3ggdG8gMHB0e1xoc3MgXGl0ZW1jb250ZW50cyBca2VyblxpdGVtbWFyZ2lufSUKKyAgICUKICAgIFx2YWRqdXN0e1xwZW5hbHR5IDEyMDB9fSUgbm90IGdvb2QgdG8gYnJlYWsgYWZ0ZXIgZmlyc3QgbGluZSBvZiBpdGVtLgogICBcZmx1c2hjcgogfQpAQCAtMjc4NSwxMiArMzg3MCwxOSBAQAogJQogJSBAaGVhZGl0ZW0gc3RhcnRzIGEgaGVhZGluZyByb3csIHdoaWNoIHdlIHR5cGVzZXQgaW4gYm9sZC4KICUgQXNzaWdubWVudHMgaGF2ZSB0byBiZSBnbG9iYWwgc2luY2Ugd2UgYXJlIGluc2lkZSB0aGUgaW1wbGljaXQgZ3JvdXAKLSUgb2YgYW4gYWxpZ25tZW50IGVudHJ5LiAgTm90ZSB0aGF0IFxldmVyeWNyIHJlc2V0cyBcZXZlcnl0YWIuCi1cZGVmXGhlYWRpdGVte1xjaGVja2VudlxtdWx0aXRhYmxlIFxjcmNyIFxnbG9iYWxcZXZlcnl0YWI9e1xiZn1cdGhlXGV2ZXJ5dGFifSUKKyUgb2YgYW4gYWxpZ25tZW50IGVudHJ5LiAgXGV2ZXJ5Y3IgcmVzZXRzIFxldmVyeXRhYiBzbyB3ZSBkb24ndCBoYXZlIHRvCislIHVuZG8gaXQgb3Vyc2VsdmVzLgorXGRlZlxoZWFkaXRlbWZvbnR7XGJ9JSBmb3IgcGVvcGxlIHRvIHVzZSBpbiB0aGUgdGVtcGxhdGUgcm93OyBub3QgY2hhbmdlYWJsZQorXGRlZlxoZWFkaXRlbXslCisgIFxjaGVja2VudlxtdWx0aXRhYmxlCisgIFxjcmNyCisgIFxnbG9iYWxcZXZlcnl0YWI9e1xiZn0lIGNhbid0IHVzZSBcaGVhZGl0ZW1mb250IHNpbmNlIHRoZSBwYXJzaW5nIGRpZmZlcnMKKyAgXHRoZVxldmVyeXRhYiAlIGZvciB0aGUgZmlyc3QgaXRlbQorfSUKICUKICUgQSBcdGFiIHVzZWQgdG8gaW5jbHVkZSBcaHNraXAxc3AuICBCdXQgdGhlbiB0aGUgc3BhY2UgaW4gYSB0ZW1wbGF0ZQogJSBsaW5lIGlzIG5vdCBlbm91Z2guICBUaGF0IGlzIGJhZC4gIFNvIGxldCdzIGdvIGJhY2sgdG8ganVzdCBgJicgdW50aWwKLSUgd2UgZW5jb3VudGVyIHRoZSBwcm9ibGVtIGl0IHdhcyBpbnRlbmRlZCB0byBzb2x2ZSBhZ2Fpbi4KKyUgd2UgYWdhaW4gZW5jb3VudGVyIHRoZSBwcm9ibGVtIHRoZSAxc3Agd2FzIGludGVuZGVkIHRvIHNvbHZlLgogJQkJCQkJLS1rYXJsLCBuYXRoYW5AYWNtLm9yZywgMjBhcHI5OS4KIFxkZWZcdGFie1xjaGVja2VudlxtdWx0aXRhYmxlICZcdGhlXGV2ZXJ5dGFifSUKIApAQCAtMjkwMiwxOCArMzk5NCwxOCBAQAogXHNldGJveDA9XHZib3h7WH1cZ2xvYmFsXG11bHRpdGFibGVsaW5lc3BhY2U9XHRoZVxiYXNlbGluZXNraXAKIFxnbG9iYWxcYWR2YW5jZVxtdWx0aXRhYmxlbGluZXNwYWNlIGJ5LVxodDAKIFxmaQotJSUgVGVzdCB0byBzZWUgaWYgcGFyc2tpcCBpcyBsYXJnZXIgdGhhbiBzcGFjZSBiZXR3ZWVuIGxpbmVzIG9mCi0lJSB0YWJsZS4gSWYgbm90LCBkbyBub3RoaW5nLgotJSUgICAgICAgIElmIHNvLCBzZXQgdG8gc2FtZSBkaW1lbnNpb24gYXMgbXVsdGl0YWJsZWxpbmVzcGFjZS4KKyUgVGVzdCB0byBzZWUgaWYgcGFyc2tpcCBpcyBsYXJnZXIgdGhhbiBzcGFjZSBiZXR3ZWVuIGxpbmVzIG9mCislIHRhYmxlLiBJZiBub3QsIGRvIG5vdGhpbmcuCislICAgICAgICBJZiBzbywgc2V0IHRvIHNhbWUgZGltZW5zaW9uIGFzIG11bHRpdGFibGVsaW5lc3BhY2UuCiBcaWZkaW1cbXVsdGl0YWJsZXBhcnNraXA+XG11bHRpdGFibGVsaW5lc3BhY2UKIFxnbG9iYWxcbXVsdGl0YWJsZXBhcnNraXA9XG11bHRpdGFibGVsaW5lc3BhY2UKLVxnbG9iYWxcYWR2YW5jZVxtdWx0aXRhYmxlcGFyc2tpcC03cHQgJSUgdG8ga2VlcCBwYXJza2lwIHNvbWV3aGF0IHNtYWxsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSUgdGhhbiBza2lwIGJldHdlZW4gbGluZXMgaW4gdGhlIHRhYmxlLgorXGdsb2JhbFxhZHZhbmNlXG11bHRpdGFibGVwYXJza2lwLTdwdCAlIHRvIGtlZXAgcGFyc2tpcCBzb21ld2hhdCBzbWFsbGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgdGhhbiBza2lwIGJldHdlZW4gbGluZXMgaW4gdGhlIHRhYmxlLgogXGZpJQogXGlmZGltXG11bHRpdGFibGVwYXJza2lwPTBwdAogXGdsb2JhbFxtdWx0aXRhYmxlcGFyc2tpcD1cbXVsdGl0YWJsZWxpbmVzcGFjZQotXGdsb2JhbFxhZHZhbmNlXG11bHRpdGFibGVwYXJza2lwLTdwdCAlJSB0byBrZWVwIHBhcnNraXAgc29tZXdoYXQgc21hbGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlJSB0aGFuIHNraXAgYmV0d2VlbiBsaW5lcyBpbiB0aGUgdGFibGUuCitcZ2xvYmFsXGFkdmFuY2VcbXVsdGl0YWJsZXBhcnNraXAtN3B0ICUgdG8ga2VlcCBwYXJza2lwIHNvbWV3aGF0IHNtYWxsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSB0aGFuIHNraXAgYmV0d2VlbiBsaW5lcyBpbiB0aGUgdGFibGUuCiBcZml9CiAKIApAQCAtMjk1OSw2ICs0MDUxLDcgQEAKIAogXGRlZlxkb2lnbm9yZSMxe1xiZWdpbmdyb3VwCiAgICUgU2NhbiBpbiBgYHZlcmJhdGltJycgbW9kZToKKyAgXG9iZXlsaW5lcwogICBcY2F0Y29kZWBcQCA9IFxvdGhlcgogICBcY2F0Y29kZWBceyA9IFxvdGhlcgogICBcY2F0Y29kZWBcfSA9IFxvdGhlcgpAQCAtMjk3OSwxNiArNDA3MiwxNiBAQAogICBcZ2RlZlxkb2RvaWdub3JlIzF7JQogICAgICUgIzEgY29udGFpbnMgdGhlIGNvbW1hbmQgbmFtZSBhcyBhIHN0cmluZywgZS5nLiwgYGlmaW5mbycuCiAgICAgJQotICAgICUgRGVmaW5lIGEgY29tbWFuZCB0byBmaW5kIHRoZSBuZXh0IGBAZW5kICMxJywgd2hpY2ggbXVzdCBiZSBvbiBhIGxpbmUKLSAgICAlIGJ5IGl0c2VsZi4KLSAgICBcbG9uZ1xkZWZcZG9pZ25vcmV0ZXh0IyMxXl5NQGVuZCAjMXtcZG9pZ25vcmV0ZXh0eXl5IyMxXl5NQCMxXF9TVE9QX30lCisgICAgJSBEZWZpbmUgYSBjb21tYW5kIHRvIGZpbmQgdGhlIG5leHQgYEBlbmQgIzEnLgorICAgIFxsb25nXGRlZlxkb2lnbm9yZXRleHQjIzFeXk1AZW5kICMxeyUKKyAgICAgIFxkb2lnbm9yZXRleHR5eXkjIzFeXk1AIzFcX1NUT1BffSUKKyAgICAlCiAgICAgJSBBbmQgdGhpcyBjb21tYW5kIHRvIGZpbmQgYW5vdGhlciAjMSBjb21tYW5kLCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEKICAgICAlIGxpbmUuICAoT3RoZXJ3aXNlLCB3ZSB3b3VsZCBjb25zaWRlciBhIGxpbmUgYEBjIEBpZnNldCcsIGZvcgogICAgICUgZXhhbXBsZSwgdG8gY291bnQgYXMgYW4gQGlmc2V0IGZvciBuZXN0aW5nLikKICAgICBcbG9uZ1xkZWZcZG9pZ25vcmV0ZXh0eXl5IyMxXl5NQCMxIyMyXF9TVE9QX3tcZG9pZ25vcmV5eXl7IyMyfVxfU1RPUF99JQogICAgICUKICAgICAlIEFuZCBub3cgZXhwYW5kIHRoYXQgY29tbWFuZC4KLSAgICBcb2JleWxpbmVzICUKICAgICBcZG9pZ25vcmV0ZXh0IF5eTSUKICAgfSUKIH0KQEAgLTMwMTgsNyArNDExMSwxMiBAQAogfQogCiAlIEZpbmlzaCBvZmYgaWdub3JlZCB0ZXh0LgotXGRlZlxlbmRkb2lnbm9yZXtcZW5kZ3JvdXBcaWdub3Jlc3BhY2VzfQoreyBcb2JleWxpbmVzJQorICAlIElnbm9yZSBhbnl0aGluZyBhZnRlciB0aGUgbGFzdCBgQGVuZCAjMSc7IHRoaXMgbWF0dGVycyBpbiB2ZXJiYXRpbQorICAlIGVudmlyb25tZW50cywgd2hlcmUgb3RoZXJ3aXNlIHRoZSBuZXdsaW5lIGFmdGVyIGFuIGlnbm9yZWQgY29uZGl0aW9uYWwKKyAgJSB3b3VsZCByZXN1bHQgaW4gYSBibGFuayBsaW5lIGluIHRoZSBvdXRwdXQuCisgIFxnZGVmXGVuZGRvaWdub3JlIzFeXk17XGVuZGdyb3VwXGlnbm9yZXNwYWNlc30lCit9CiAKIAogJSBAc2V0IFZBUiBzZXRzIHRoZSB2YXJpYWJsZSBWQVIgdG8gYW4gZW1wdHkgdmFsdWUuCkBAIC0zMTgzLDExICs0MjgxLDExIEBACiBcZGVmXGRvc3luaW5kZXgjMSMyIzN7JQogICAlIE9ubHkgZG8gXGNsb3Nlb3V0IGlmIHdlIGhhdmVuJ3QgYWxyZWFkeSBkb25lIGl0LCBlbHNlIHdlJ2xsIGVuZCB1cAogICAlIGNsb3NpbmcgdGhlIHRhcmdldCBpbmRleC4KLSAgXGV4cGFuZGFmdGVyIFxpZnhcY3NuYW1lIGRvbmVzeW5pbmRleCMyXGVuZGNzbmFtZSBcdW5kZWZpbmVkCisgIFxleHBhbmRhZnRlciBcaWZ4XGNzbmFtZSBkb25lc3luaW5kZXgjMlxlbmRjc25hbWUgXHJlbGF4CiAgICAgJSBUaGUgXGNsb3Nlb3V0IGhlbHBzIHJlZHVjZSB1bm5lY2Vzc2FyeSBvcGVuIGZpbGVzOyB0aGUgbGltaXQgb24gdGhlCiAgICAgJSBBY29ybiBSSVNDIE9TIGlzIGEgbWVyZSAxNiBmaWxlcy4KICAgICBcZXhwYW5kYWZ0ZXJcY2xvc2VvdXRcY3NuYW1lIzJpbmRmaWxlXGVuZGNzbmFtZQotICAgIFxleHBhbmRhZnRlclxsZXRcY3NuYW1lXGRvbmVzeW5pbmRleCMyXGVuZGNzbmFtZSA9IDEKKyAgICBcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSBkb25lc3luaW5kZXgjMlxlbmRjc25hbWUgPSAxCiAgIFxmaQogICAlIHJlZGVmaW5lIFxmb29pbmRmaWxlOgogICBcZXhwYW5kYWZ0ZXJcbGV0XGV4cGFuZGFmdGVyXHRlbXBcZXhwYW5kYWZ0ZXI9XGNzbmFtZSMzaW5kZmlsZVxlbmRjc25hbWUKQEAgLTMyMjEsMTEgKzQzMTksNDEgQEAKICAgXGVzY2FwZWNoYXIgPSBgXFwgICAgICUgdXNlIGJhY2tzbGFzaCBpbiBvdXRwdXQgZmlsZXMuCiAgIFxkZWZcQHtAfSUgY2hhbmdlIHRvIEBAIHdoZW4gd2Ugc3dpdGNoIHRvIEAgYXMgZXNjYXBlIGNoYXIgaW4gaW5kZXggZmlsZXMuCiAgIFxkZWZcIHtccmVhbGJhY2tzbGFzaFxzcGFjZSB9JQotICAlIE5lZWQgdGhlc2UgaW4gY2FzZSBcdGV4IGlzIGluIGVmZmVjdCBhbmQgXHsgaXMgYSBcZGVsaW1pdGVyIGFnYWluLgotICAlIEJ1dCBjYW4ndCB1c2UgXGxicmFjZWNtZCBhbmQgXHJicmFjZWNtZCBiZWNhdXNlIHRleGluZGV4IGFzc3VtZXMKLSAgJSBicmFjZXMgYW5kIGJhY2tzbGFzaGVzIGFyZSB1c2VkIG9ubHkgYXMgZGVsaW1pdGVycy4KLSAgXGxldFx7ID0gXG15bGJyYWNlCi0gIFxsZXRcfSA9IFxteXJicmFjZQorICAlCisgICUgTmVlZCB0aGVzZSB1bmV4cGFuZGFibGUgKGJlY2F1c2Ugd2UgZGVmaW5lIFx0dCBhcyBhIGR1bW15KQorICAlIGRlZmluaXRpb25zIHdoZW4gQHsgb3IgQH0gYXBwZWFyIGluIGluZGV4IGVudHJ5IHRleHQuICBBbHNvLCBtb3JlCisgICUgY29tcGxpY2F0ZWQsIHdoZW4gXHRleCBpcyBpbiBlZmZlY3QgYW5kIFx7IGlzIGEgXGRlbGltaXRlciBhZ2Fpbi4KKyAgJSBXZSBjYW4ndCB1c2UgXGxicmFjZWNtZCBhbmQgXHJicmFjZWNtZCBiZWNhdXNlIHRleGluZGV4IGFzc3VtZXMKKyAgJSBicmFjZXMgYW5kIGJhY2tzbGFzaGVzIGFyZSB1c2VkIG9ubHkgYXMgZGVsaW1pdGVycy4gIFBlcmhhcHMgd2UKKyAgJSBzaG91bGQgZGVmaW5lIEBsYnJhY2UgYW5kIEByYnJhY2UgY29tbWFuZHMgYSBsYSBAY29tbWEuCisgIFxkZWZce3t7XHR0XGNoYXIxMjN9fSUKKyAgXGRlZlx9e3tcdHRcY2hhcjEyNX19JQorICAlCisgICUgSSBkb24ndCBlbnRpcmVseSB1bmRlcnN0YW5kIHRoaXMsIGJ1dCB3aGVuIGFuIGluZGV4IGVudHJ5IGlzCisgICUgZ2VuZXJhdGVkIGZyb20gYSBtYWNybyBjYWxsLCB0aGUgXGVuZGlucHV0IHdoaWNoIFxzY2FubWFjcm8gaW5zZXJ0cworICAlIGNhdXNlcyBwcm9jZXNzaW5nIHRvIGJlIHByZW1hdHVyZWx5IHRlcm1pbmF0ZWQuICBUaGlzIGlzLAorICAlIGFwcGFyZW50bHksIGJlY2F1c2UgXGluZGV4c29ydHRtcCBpcyBmdWxseSBleHBhbmRlZCwgYW5kIFxlbmRpbnB1dAorICAlIGlzIGFuIGV4cGFuZGFibGUgY29tbWFuZC4gIFRoZSByZWRlZmluaXRpb24gYmVsb3cgbWFrZXMgXGVuZGlucHV0CisgICUgZGlzYXBwZWFyIGFsdG9nZXRoZXIgZm9yIHRoYXQgcHVycG9zZSAtLSBhbHRob3VnaCBsb2dnaW5nIHNob3dzIHRoYXQKKyAgJSBwcm9jZXNzaW5nIGNvbnRpbnVlcyB0byBzb21lIGZ1cnRoZXIgcG9pbnQuICBPbiB0aGUgb3RoZXIgaGFuZCwgaXQKKyAgJSBzZWVtcyBcZW5kaW5wdXQgZG9lcyBub3QgaHVydCBpbiB0aGUgcHJpbnRlZCBpbmRleCBhcmcsIHNpbmNlIHRoYXQKKyAgJSBpcyBzdGlsbCBnZXR0aW5nIHdyaXR0ZW4gd2l0aG91dCBhcHBhcmVudCBoYXJtLgorICAlCisgICUgU2FtcGxlIHNvdXJjZSAobWFjLWlkeDMudGV4LCByZXBvcnRlZCBieSBHcmFoYW0gUGVyY2l2YWwgdG8KKyAgJSBoZWxwLXRleGluZm8sIDIybWF5MDYpOgorICAlIEBtYWNybyBmdW5pbmRleCB7V09SRH0KKyAgJSBAZmluZGV4IHh5egorICAlIEBlbmQgbWFjcm8KKyAgJSAuLi4KKyAgJSBAZnVuaW5kZXggY29tbXRlc3QKKyAgJQorICAlIFRoZSBhYm92ZSBpcyBub3QgZW5vdWdoIHRvIHJlcHJvZHVjZSB0aGUgYnVnLCBidXQgaXQgZ2l2ZXMgdGhlIGZsYXZvci4KKyAgJQorICAlIFNhbXBsZSB3aGF0c2l0IHJlc3VsdGluZzoKKyAgJSAuQHdyaXRlM3tcZW50cnl7eHl6fXtAZm9saW8gfXtAY29kZSB7eHl6QGVuZGlucHV0IH19fQorICAlCisgICUgU286CisgIFxsZXRcZW5kaW5wdXQgPSBcZW1wdHkKICAgJQogICAlIERvIHRoZSByZWRlZmluaXRpb25zLgogICBcY29tbW9uZHVtbWllcwpAQCAtMzI0NCw2ICs0MzcyLDcgQEAKICAgJQogICAlIERvIHRoZSByZWRlZmluaXRpb25zLgogICBcY29tbW9uZHVtbWllcworICBcb3RoZXJiYWNrc2xhc2gKIH0KIAogJSBDYWxsZWQgZnJvbSBcaW5kZXhkdW1taWVzIGFuZCBcYXRkdW1taWVzLgpAQCAtMzI1MSw3ICs0MzgwLDcgQEAKIFxkZWZcY29tbW9uZHVtbWllc3slCiAgICUKICAgJSBcZGVmaW5lZHVtbXl3b3JkIGRlZmluZXMgXCMxIGFzIFxzdHJpbmdcIzFcc3BhY2UsIHRodXMgZWZmZWN0aXZlbHkKLSAgJSBwcmV2ZW50aW5nIGl0cyBleHBhbnNpb24uICBUaGlzIGlzIHVzZWQgb25seSBmb3IgY29udHJvbCUgd29yZHMsCisgICUgcHJldmVudGluZyBpdHMgZXhwYW5zaW9uLiAgVGhpcyBpcyB1c2VkIG9ubHkgZm9yIGNvbnRyb2wgd29yZHMsCiAgICUgbm90IGNvbnRyb2wgbGV0dGVycywgYmVjYXVzZSB0aGUgXHNwYWNlIHdvdWxkIGJlIGluY29ycmVjdCBmb3IKICAgJSBjb250cm9sIGNoYXJhY3RlcnMsIGJ1dCBpcyBuZWVkZWQgdG8gc2VwYXJhdGUgdGhlIGNvbnRyb2wgd29yZAogICAlIGZyb20gd2hhdGV2ZXIgZm9sbG93cy4KQEAgLTMyNzAsMjMgKzQzOTksMjggQEAKICAgXGNvbW1vbmR1bW1pZXNub2ZvbnRzCiAgICUKICAgXGRlZmluZWR1bW15bGV0dGVyXF8lCisgIFxkZWZpbmVkdW1teWxldHRlclwtJQogICAlCiAgICUgTm9uLUVuZ2xpc2ggbGV0dGVycy4KICAgXGRlZmluZWR1bW15d29yZFxBQQogICBcZGVmaW5lZHVtbXl3b3JkXEFFCisgIFxkZWZpbmVkdW1teXdvcmRcREgKICAgXGRlZmluZWR1bW15d29yZFxMCi0gIFxkZWZpbmVkdW1teXdvcmRcT0UKICAgXGRlZmluZWR1bW15d29yZFxPCisgIFxkZWZpbmVkdW1teXdvcmRcT0UKKyAgXGRlZmluZWR1bW15d29yZFxUSAogICBcZGVmaW5lZHVtbXl3b3JkXGFhCiAgIFxkZWZpbmVkdW1teXdvcmRcYWUKLSAgXGRlZmluZWR1bW15d29yZFxsCi0gIFxkZWZpbmVkdW1teXdvcmRcb2UKLSAgXGRlZmluZWR1bW15d29yZFxvCi0gIFxkZWZpbmVkdW1teXdvcmRcc3MKKyAgXGRlZmluZWR1bW15d29yZFxkaAogICBcZGVmaW5lZHVtbXl3b3JkXGV4Y2xhbWRvd24KLSAgXGRlZmluZWR1bW15d29yZFxxdWVzdGlvbmRvd24KKyAgXGRlZmluZWR1bW15d29yZFxsCisgIFxkZWZpbmVkdW1teXdvcmRcbworICBcZGVmaW5lZHVtbXl3b3JkXG9lCiAgIFxkZWZpbmVkdW1teXdvcmRcb3JkZgogICBcZGVmaW5lZHVtbXl3b3JkXG9yZG0KKyAgXGRlZmluZWR1bW15d29yZFxxdWVzdGlvbmRvd24KKyAgXGRlZmluZWR1bW15d29yZFxzcworICBcZGVmaW5lZHVtbXl3b3JkXHRoCiAgICUKICAgJSBBbHRob3VnaCB0aGVzZSBpbnRlcm5hbCBjb21tYW5kcyBzaG91bGRuJ3Qgc2hvdyB1cCwgc29tZXRpbWVzIHRoZXkgZG8uCiAgIFxkZWZpbmVkdW1teXdvcmRcYmYKQEAgLTMzMDIsMjEgKzQ0MzYsMzkgQEAKICAgXGRlZmluZWR1bW15d29yZFxUZVgKICAgJQogICAlIEFzc29ydGVkIHNwZWNpYWwgY2hhcmFjdGVycy4KKyAgXGRlZmluZWR1bW15d29yZFxhcnJvdwogICBcZGVmaW5lZHVtbXl3b3JkXGJ1bGxldAogICBcZGVmaW5lZHVtbXl3b3JkXGNvbW1hCiAgIFxkZWZpbmVkdW1teXdvcmRcY29weXJpZ2h0CiAgIFxkZWZpbmVkdW1teXdvcmRccmVnaXN0ZXJlZHN5bWJvbAogICBcZGVmaW5lZHVtbXl3b3JkXGRvdHMKICAgXGRlZmluZWR1bW15d29yZFxlbmRkb3RzCisgIFxkZWZpbmVkdW1teXdvcmRcZW50cnlicmVhawogICBcZGVmaW5lZHVtbXl3b3JkXGVxdWl2CiAgIFxkZWZpbmVkdW1teXdvcmRcZXJyb3IKICAgXGRlZmluZWR1bW15d29yZFxldXJvCiAgIFxkZWZpbmVkdW1teXdvcmRcZXhwYW5zaW9uCisgIFxkZWZpbmVkdW1teXdvcmRcZ2VxCisgIFxkZWZpbmVkdW1teXdvcmRcZ3VpbGxlbWV0bGVmdAorICBcZGVmaW5lZHVtbXl3b3JkXGd1aWxsZW1ldHJpZ2h0CisgIFxkZWZpbmVkdW1teXdvcmRcZ3VpbHNpbmdsbGVmdAorICBcZGVmaW5lZHVtbXl3b3JkXGd1aWxzaW5nbHJpZ2h0CisgIFxkZWZpbmVkdW1teXdvcmRcbGJyYWNlY2hhcgorICBcZGVmaW5lZHVtbXl3b3JkXGxlcQogICBcZGVmaW5lZHVtbXl3b3JkXG1pbnVzCisgIFxkZWZpbmVkdW1teXdvcmRcb2dvbmVrCiAgIFxkZWZpbmVkdW1teXdvcmRccG91bmRzCiAgIFxkZWZpbmVkdW1teXdvcmRccG9pbnQKICAgXGRlZmluZWR1bW15d29yZFxwcmludAorICBcZGVmaW5lZHVtbXl3b3JkXHF1b3RlZGJsYmFzZQorICBcZGVmaW5lZHVtbXl3b3JkXHF1b3RlZGJsbGVmdAorICBcZGVmaW5lZHVtbXl3b3JkXHF1b3RlZGJscmlnaHQKKyAgXGRlZmluZWR1bW15d29yZFxxdW90ZWxlZnQKKyAgXGRlZmluZWR1bW15d29yZFxxdW90ZXJpZ2h0CisgIFxkZWZpbmVkdW1teXdvcmRccXVvdGVzaW5nbGJhc2UKKyAgXGRlZmluZWR1bW15d29yZFxyYnJhY2VjaGFyCiAgIFxkZWZpbmVkdW1teXdvcmRccmVzdWx0CisgIFxkZWZpbmVkdW1teXdvcmRcdGV4dGRlZ3JlZQogICAlCiAgICUgV2Ugd2FudCB0byBkaXNhYmxlIGFsbCBtYWNyb3Mgc28gdGhhdCB0aGV5IGFyZSBub3QgZXhwYW5kZWQgYnkgXHdyaXRlLgogICBcbWFjcm9saXN0CkBAIC0zMzMwLDYzICs0NDgyLDcyIEBACiAKICUgXGNvbW1vbmR1bW1pZXNub2ZvbnRzOiBjb21tb24gdG8gXGNvbW1vbmR1bW1pZXMgYW5kIFxpbmRleG5vZm9udHMuCiAlCi0lIEJldHRlciBoYXZlIHRoaXMgd2l0aG91dCBhY3RpdmUgY2hhcnMuCi17Ci0gIFxjYXRjb2RlYFx+PVxvdGhlcgotICBcZ2RlZlxjb21tb25kdW1taWVzbm9mb250c3slCi0gICAgJSBDb250cm9sIGxldHRlcnMgYW5kIGFjY2VudHMuCi0gICAgXGRlZmluZWR1bW15bGV0dGVyXCElCi0gICAgXGRlZmluZWR1bW15YWNjZW50XCIlCi0gICAgXGRlZmluZWR1bW15YWNjZW50XCclCi0gICAgXGRlZmluZWR1bW15bGV0dGVyXColCi0gICAgXGRlZmluZWR1bW15YWNjZW50XCwlCi0gICAgXGRlZmluZWR1bW15bGV0dGVyXC4lCi0gICAgXGRlZmluZWR1bW15bGV0dGVyXC8lCi0gICAgXGRlZmluZWR1bW15bGV0dGVyXDolCi0gICAgXGRlZmluZWR1bW15YWNjZW50XD0lCi0gICAgXGRlZmluZWR1bW15bGV0dGVyXD8lCi0gICAgXGRlZmluZWR1bW15YWNjZW50XF4lCi0gICAgXGRlZmluZWR1bW15YWNjZW50XGAlCi0gICAgXGRlZmluZWR1bW15YWNjZW50XH4lCi0gICAgXGRlZmluZWR1bW15d29yZFx1Ci0gICAgXGRlZmluZWR1bW15d29yZFx2Ci0gICAgXGRlZmluZWR1bW15d29yZFxICi0gICAgXGRlZmluZWR1bW15d29yZFxkb3RhY2NlbnQKLSAgICBcZGVmaW5lZHVtbXl3b3JkXHJpbmdhY2NlbnQKLSAgICBcZGVmaW5lZHVtbXl3b3JkXHRpZWFjY2VudAotICAgIFxkZWZpbmVkdW1teXdvcmRcdWJhcmFjY2VudAotICAgIFxkZWZpbmVkdW1teXdvcmRcdWRvdGFjY2VudAotICAgIFxkZWZpbmVkdW1teXdvcmRcZG90bGVzcwotICAgICUKLSAgICAlIFRleGluZm8gZm9udCBjb21tYW5kcy4KLSAgICBcZGVmaW5lZHVtbXl3b3JkXGIKLSAgICBcZGVmaW5lZHVtbXl3b3JkXGkKLSAgICBcZGVmaW5lZHVtbXl3b3JkXHIKLSAgICBcZGVmaW5lZHVtbXl3b3JkXHNjCi0gICAgXGRlZmluZWR1bW15d29yZFx0Ci0gICAgJQotICAgICUgQ29tbWFuZHMgdGhhdCB0YWtlIGFyZ3VtZW50cy4KLSAgICBcZGVmaW5lZHVtbXl3b3JkXGFjcm9ueW0KLSAgICBcZGVmaW5lZHVtbXl3b3JkXGNpdGUKLSAgICBcZGVmaW5lZHVtbXl3b3JkXGNvZGUKLSAgICBcZGVmaW5lZHVtbXl3b3JkXGNvbW1hbmQKLSAgICBcZGVmaW5lZHVtbXl3b3JkXGRmbgotICAgIFxkZWZpbmVkdW1teXdvcmRcZW1waAotICAgIFxkZWZpbmVkdW1teXdvcmRcZW52Ci0gICAgXGRlZmluZWR1bW15d29yZFxmaWxlCi0gICAgXGRlZmluZWR1bW15d29yZFxrYmQKLSAgICBcZGVmaW5lZHVtbXl3b3JkXGtleQotICAgIFxkZWZpbmVkdW1teXdvcmRcbWF0aAotICAgIFxkZWZpbmVkdW1teXdvcmRcb3B0aW9uCi0gICAgXGRlZmluZWR1bW15d29yZFxzYW1wCi0gICAgXGRlZmluZWR1bW15d29yZFxzdHJvbmcKLSAgICBcZGVmaW5lZHVtbXl3b3JkXHRpZQotICAgIFxkZWZpbmVkdW1teXdvcmRcdXJlZgotICAgIFxkZWZpbmVkdW1teXdvcmRcdXJsCi0gICAgXGRlZmluZWR1bW15d29yZFx2YXIKLSAgICBcZGVmaW5lZHVtbXl3b3JkXHZlcmIKLSAgICBcZGVmaW5lZHVtbXl3b3JkXHcKLSAgfQorXGRlZlxjb21tb25kdW1taWVzbm9mb250c3slCisgICUgQ29udHJvbCBsZXR0ZXJzIGFuZCBhY2NlbnRzLgorICBcZGVmaW5lZHVtbXlsZXR0ZXJcISUKKyAgXGRlZmluZWR1bW15YWNjZW50XCIlCisgIFxkZWZpbmVkdW1teWFjY2VudFwnJQorICBcZGVmaW5lZHVtbXlsZXR0ZXJcKiUKKyAgXGRlZmluZWR1bW15YWNjZW50XCwlCisgIFxkZWZpbmVkdW1teWxldHRlclwuJQorICBcZGVmaW5lZHVtbXlsZXR0ZXJcLyUKKyAgXGRlZmluZWR1bW15bGV0dGVyXDolCisgIFxkZWZpbmVkdW1teWFjY2VudFw9JQorICBcZGVmaW5lZHVtbXlsZXR0ZXJcPyUKKyAgXGRlZmluZWR1bW15YWNjZW50XF4lCisgIFxkZWZpbmVkdW1teWFjY2VudFxgJQorICBcZGVmaW5lZHVtbXlhY2NlbnRcfiUKKyAgXGRlZmluZWR1bW15d29yZFx1CisgIFxkZWZpbmVkdW1teXdvcmRcdgorICBcZGVmaW5lZHVtbXl3b3JkXEgKKyAgXGRlZmluZWR1bW15d29yZFxkb3RhY2NlbnQKKyAgXGRlZmluZWR1bW15d29yZFxvZ29uZWsKKyAgXGRlZmluZWR1bW15d29yZFxyaW5nYWNjZW50CisgIFxkZWZpbmVkdW1teXdvcmRcdGllYWNjZW50CisgIFxkZWZpbmVkdW1teXdvcmRcdWJhcmFjY2VudAorICBcZGVmaW5lZHVtbXl3b3JkXHVkb3RhY2NlbnQKKyAgXGRlZmluZWR1bW15d29yZFxkb3RsZXNzCisgICUKKyAgJSBUZXhpbmZvIGZvbnQgY29tbWFuZHMuCisgIFxkZWZpbmVkdW1teXdvcmRcYgorICBcZGVmaW5lZHVtbXl3b3JkXGkKKyAgXGRlZmluZWR1bW15d29yZFxyCisgIFxkZWZpbmVkdW1teXdvcmRcc2Fuc3NlcmlmCisgIFxkZWZpbmVkdW1teXdvcmRcc2MKKyAgXGRlZmluZWR1bW15d29yZFxzbGFudGVkCisgIFxkZWZpbmVkdW1teXdvcmRcdAorICAlCisgICUgQ29tbWFuZHMgdGhhdCB0YWtlIGFyZ3VtZW50cy4KKyAgXGRlZmluZWR1bW15d29yZFxhYmJyCisgIFxkZWZpbmVkdW1teXdvcmRcYWNyb255bQorICBcZGVmaW5lZHVtbXl3b3JkXGFuY2hvcgorICBcZGVmaW5lZHVtbXl3b3JkXGNpdGUKKyAgXGRlZmluZWR1bW15d29yZFxjb2RlCisgIFxkZWZpbmVkdW1teXdvcmRcY29tbWFuZAorICBcZGVmaW5lZHVtbXl3b3JkXGRmbgorICBcZGVmaW5lZHVtbXl3b3JkXGRtbgorICBcZGVmaW5lZHVtbXl3b3JkXGVtYWlsCisgIFxkZWZpbmVkdW1teXdvcmRcZW1waAorICBcZGVmaW5lZHVtbXl3b3JkXGVudgorICBcZGVmaW5lZHVtbXl3b3JkXGZpbGUKKyAgXGRlZmluZWR1bW15d29yZFxpbWFnZQorICBcZGVmaW5lZHVtbXl3b3JkXGluZGljYXRldXJsCisgIFxkZWZpbmVkdW1teXdvcmRcaW5mb3JlZgorICBcZGVmaW5lZHVtbXl3b3JkXGtiZAorICBcZGVmaW5lZHVtbXl3b3JkXGtleQorICBcZGVmaW5lZHVtbXl3b3JkXG1hdGgKKyAgXGRlZmluZWR1bW15d29yZFxvcHRpb24KKyAgXGRlZmluZWR1bW15d29yZFxweHJlZgorICBcZGVmaW5lZHVtbXl3b3JkXHJlZgorICBcZGVmaW5lZHVtbXl3b3JkXHNhbXAKKyAgXGRlZmluZWR1bW15d29yZFxzdHJvbmcKKyAgXGRlZmluZWR1bW15d29yZFx0aWUKKyAgXGRlZmluZWR1bW15d29yZFx1cmVmCisgIFxkZWZpbmVkdW1teXdvcmRcdXJsCisgIFxkZWZpbmVkdW1teXdvcmRcdmFyCisgIFxkZWZpbmVkdW1teXdvcmRcdmVyYgorICBcZGVmaW5lZHVtbXl3b3JkXHcKKyAgXGRlZmluZWR1bW15d29yZFx4cmVmCiB9CiAKICUgXGluZGV4bm9mb250cyBpcyB1c2VkIHdoZW4gb3V0cHV0dGluZyB0aGUgc3RyaW5ncyB0byBzb3J0IHRoZSBpbmRleApAQCAtMzM5OSw3ICs0NTYwLDcgQEAKICAgXGRlZlxkZWZpbmVkdW1teWFjY2VudCMjMXtcbGV0IyMxXGFzaXN9JQogICAlIFdlIGNhbiBqdXN0IGlnbm9yZSBvdGhlciBjb250cm9sIGxldHRlcnMuCiAgIFxkZWZcZGVmaW5lZHVtbXlsZXR0ZXIjIzF7XGxldCMjMVxlbXB0eX0lCi0gICUgSG9wZWZ1bGx5LCBhbGwgY29udHJvbCB3b3JkcyBjYW4gYmVjb21lIEBhc2lzLgorICAlIEFsbCBjb250cm9sIHdvcmRzIGJlY29tZSBAYXNpcyBieSBkZWZhdWx0OyBvdmVycmlkZXMgYmVsb3cuCiAgIFxsZXRcZGVmaW5lZHVtbXl3b3JkXGRlZmluZWR1bW15YWNjZW50CiAgICUKICAgXGNvbW1vbmR1bW1pZXNub2ZvbnRzCkBAIC0zNDExLDYwICs0NTcyLDk1IEBACiAgICUKICAgXGRlZlwgeyB9JQogICBcZGVmXEB7QH0lCi0gICUgaG93IHRvIGhhbmRsZSBicmFjZXM/CiAgIFxkZWZcX3tcbm9ybWFsdW5kZXJzY29yZX0lCisgIFxkZWZcLXt9JSBALSBzaG91bGRuJ3QgYWZmZWN0IHNvcnRpbmcKKyAgJQorICAlIFVuZm9ydHVuYXRlbHksIHRleGluZGV4IGlzIG5vdCBwcmVwYXJlZCB0byBoYW5kbGUgYnJhY2VzIGluIHRoZQorICAlIGNvbnRlbnQgYXQgYWxsLiAgU28gZm9yIGluZGV4IHNvcnRpbmcsIHdlIG1hcCBAeyBhbmQgQH0gdG8gc3RyaW5ncworICAlIHN0YXJ0aW5nIHdpdGggfCwgc2luY2UgdGhhdCBBU0NJSSBjaGFyYWN0ZXIgaXMgYmV0d2VlbiBBU0NJSSB7IGFuZCB9LgorICBcZGVmXHt7fGF9JQorICBcZGVmXGxicmFjZWNoYXJ7fGF9JQorICAlCisgIFxkZWZcfXt8Yn0lCisgIFxkZWZccmJyYWNlY2hhcnt8Yn0lCiAgICUKICAgJSBOb24tRW5nbGlzaCBsZXR0ZXJzLgogICBcZGVmXEFBe0FBfSUKICAgXGRlZlxBRXtBRX0lCisgIFxkZWZcREh7RFpafSUKICAgXGRlZlxMe0x9JQogICBcZGVmXE9Fe09FfSUKICAgXGRlZlxPe099JQorICBcZGVmXFRIe1paWn0lCiAgIFxkZWZcYWF7YWF9JQogICBcZGVmXGFle2FlfSUKKyAgXGRlZlxkaHtkenp9JQorICBcZGVmXGV4Y2xhbWRvd257IX0lCiAgIFxkZWZcbHtsfSUKICAgXGRlZlxvZXtvZX0lCi0gIFxkZWZcb3tvfSUKLSAgXGRlZlxzc3tzc30lCi0gIFxkZWZcZXhjbGFtZG93bnshfSUKLSAgXGRlZlxxdWVzdGlvbmRvd257P30lCiAgIFxkZWZcb3JkZnthfSUKICAgXGRlZlxvcmRte299JQorICBcZGVmXG97b30lCisgIFxkZWZccXVlc3Rpb25kb3duez99JQorICBcZGVmXHNze3NzfSUKKyAgXGRlZlx0aHt6enp9JQogICAlCiAgIFxkZWZcTGFUZVh7TGFUZVh9JQogICBcZGVmXFRlWHtUZVh9JQogICAlCiAgICUgQXNzb3J0ZWQgc3BlY2lhbCBjaGFyYWN0ZXJzLgogICAlIChUaGUgZm9sbG93aW5nIHt9IHdpbGwgZW5kIHVwIGluIHRoZSBzb3J0IHN0cmluZywgYnV0IHRoYXQncyBvay4pCisgIFxkZWZcYXJyb3d7LT59JQogICBcZGVmXGJ1bGxldHtidWxsZXR9JQogICBcZGVmXGNvbW1heyx9JQogICBcZGVmXGNvcHlyaWdodHtjb3B5cmlnaHR9JQotICBcZGVmXHJlZ2lzdGVyZWRzeW1ib2x7Un0lCiAgIFxkZWZcZG90c3suLi59JQogICBcZGVmXGVuZGRvdHN7Li4ufSUKICAgXGRlZlxlcXVpdns9PX0lCiAgIFxkZWZcZXJyb3J7ZXJyb3J9JQogICBcZGVmXGV1cm97ZXVyb30lCiAgIFxkZWZcZXhwYW5zaW9uez09Pn0lCisgIFxkZWZcZ2Vxez49fSUKKyAgXGRlZlxndWlsbGVtZXRsZWZ0ezw8fSUKKyAgXGRlZlxndWlsbGVtZXRyaWdodHs+Pn0lCisgIFxkZWZcZ3VpbHNpbmdsbGVmdHs8fSUKKyAgXGRlZlxndWlsc2luZ2xyaWdodHs+fSUKKyAgXGRlZlxsZXF7PD19JQogICBcZGVmXG1pbnVzey19JQotICBcZGVmXHBvdW5kc3twb3VuZHN9JQogICBcZGVmXHBvaW50ey59JQorICBcZGVmXHBvdW5kc3twb3VuZHN9JQogICBcZGVmXHByaW50ey18fSUKKyAgXGRlZlxxdW90ZWRibGJhc2V7In0lCisgIFxkZWZccXVvdGVkYmxsZWZ0eyJ9JQorICBcZGVmXHF1b3RlZGJscmlnaHR7In0lCisgIFxkZWZccXVvdGVsZWZ0e2B9JQorICBcZGVmXHF1b3RlcmlnaHR7J30lCisgIFxkZWZccXVvdGVzaW5nbGJhc2V7LH0lCisgIFxkZWZccmVnaXN0ZXJlZHN5bWJvbHtSfSUKICAgXGRlZlxyZXN1bHR7PT59JQorICBcZGVmXHRleHRkZWdyZWV7b30lCisgICUKKyAgXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgU0VUdHhpaW5kZXhscXVvdGVpZ25vcmVcZW5kY3NuYW1lXHJlbGF4CisgIFxlbHNlIFxpbmRleGxxdW90ZWlnbm9yZSBcZmkKICAgJQogICAlIFdlIG5lZWQgdG8gZ2V0IHJpZCBvZiBhbGwgbWFjcm9zLCBsZWF2aW5nIG9ubHkgdGhlIGFyZ3VtZW50cyAoaWYgcHJlc2VudCkuCiAgICUgT2YgY291cnNlIHRoaXMgaXMgbm90IG5lYXJseSBjb3JyZWN0LCBidXQgaXQgaXMgdGhlIGJlc3Qgd2UgY2FuIGRvIGZvciBub3cuCiAgICUgbWFrZWluZm8gZG9lcyBub3QgZXhwYW5kIG1hY3JvcyBpbiB0aGUgYXJndW1lbnQgdG8gQGRlZmZuLCB3aGljaCBlbmRzIHVwCiAgICUgd3JpdGluZyBhbiBpbmRleCBlbnRyeSwgYW5kIHRleGluZGV4IGlzbid0IHByZXBhcmVkIGZvciBhbiBpbmRleCBzb3J0IGVudHJ5CiAgICUgdGhhdCBzdGFydHMgd2l0aCBcLgotICAlIAorICAlCiAgICUgU2luY2UgbWFjcm8gaW52b2NhdGlvbnMgYXJlIGZvbGxvd2VkIGJ5IGJyYWNlcywgd2UgY2FuIGp1c3QgcmVkZWZpbmUgdGhlbQogICAlIHRvIHRha2UgYSBzaW5nbGUgVGVYIGFyZ3VtZW50LiAgVGhlIGNhc2Ugb2YgYSBtYWNybyBpbnZvY2F0aW9uIHRoYXQKICAgJSBnb2VzIHRvIGVuZC1vZi1saW5lIGlzIG5vdCBoYW5kbGVkLgotICAlIAorICAlCiAgIFxtYWNyb2xpc3QKIH0KIAorJSBVbmRvY3VtZW50ZWQgKGZvciBGU0ZTIDJuZCBlZC4pOiBAc2V0IHR4aWluZGV4bHF1b3RlaWdub3JlIG1ha2VzIHVzCislIGlnbm9yZSBsZWZ0IHF1b3RlcyBpbiB0aGUgc29ydCB0ZXJtLgore1xjYXRjb2RlYFxgPVxhY3RpdmUKKyBcZ2RlZlxpbmRleGxxdW90ZWlnbm9yZXtcbGV0YD1cZW1wdHl9fQorCiBcbGV0XGluZGV4YmFja3NsYXNoPTAgICVvdmVycmlkZGVuIGR1cmluZyBccHJpbnRpbmRleC4KIFxsZXRcU0VUbWFyZ2luaW5kZXg9XHJlbGF4ICUgcHV0IGluZGV4IGVudHJpZXMgaW4gbWFyZ2luICh1bmRvY3VtZW50ZWQpPwogCkBAIC0zNDkwLDExICs0Njg2LDcgQEAKICAgICAlCiAgICAgXGVkZWZcd3JpdGV0b3tcY3NuYW1lIzFpbmRmaWxlXGVuZGNzbmFtZX0lCiAgICAgJQotICAgIFxpZnZtb2RlCi0gICAgICBcZG9zdWJpbmRzYW5pdGl6ZQotICAgIFxlbHNlCi0gICAgICBcZG9zdWJpbmR3cml0ZQotICAgIFxmaQorICAgIFxzYWZld2hhdHNpdFxkb3N1YmluZHdyaXRlCiAgIH0lCiAgIFxmaQogfQpAQCAtMzUzMSwxMyArNDcyMywxMyBAQAogICBcdGVtcAogfQogCi0lIFRha2UgY2FyZSBvZiB1bndhbnRlZCBwYWdlIGJyZWFrczoKKyUgVGFrZSBjYXJlIG9mIHVud2FudGVkIHBhZ2UgYnJlYWtzL3NraXBzIGFyb3VuZCBhIHdoYXRzaXQ6CiAlCiAlIElmIGEgc2tpcCBpcyB0aGUgbGFzdCB0aGluZyBvbiB0aGUgbGlzdCBub3csIHByZXNlcnZlIGl0CiAlIGJ5IGJhY2tpbmcgdXAgYnkgXGxhc3Rza2lwLCBkb2luZyB0aGUgXHdyaXRlLCB0aGVuIGluc2VydGluZwogJSB0aGUgc2tpcCBhZ2Fpbi4gIE90aGVyd2lzZSwgdGhlIHdoYXRzaXQgZ2VuZXJhdGVkIGJ5IHRoZQotJSBcd3JpdGUgd2lsbCBtYWtlIFxsYXN0c2tpcCB6ZXJvLiAgVGhlIHJlc3VsdCBpcyB0aGF0IHNlcXVlbmNlcwotJSBsaWtlIHRoaXM6CislIFx3cml0ZSBvciBccGRmZGVzdCB3aWxsIG1ha2UgXGxhc3Rza2lwIHplcm8uICBUaGUgcmVzdWx0IGlzIHRoYXQKKyUgc2VxdWVuY2VzIGxpa2UgdGhpczoKICUgQGVuZCBkZWZ1bgogJSBAdGluZGV4IHdoYXRldmVyCiAlIEBkZWZ1biAuLi4KQEAgLTM1NjEsMjUgKzQ3NTMsMzAgQEAKICUKIFxlZGVmXHplcm9za2lwbWFjcm97XGV4cGFuZGFmdGVyXHRoZVxjc25hbWUgekBza2lwXGVuZGNzbmFtZX0KICUKK1xuZXdza2lwXHdoYXRzaXRza2lwCitcbmV3Y291bnRcd2hhdHNpdHBlbmFsdHkKKyUKICUgLi4uLCByZWFkeSwgR086CiAlCi1cZGVmXGRvc3ViaW5kc2FuaXRpemV7JQorXGRlZlxzYWZld2hhdHNpdCMxe1xpZmhtb2RlCisgICMxJQorIFxlbHNlCiAgICUgXGxhc3Rza2lwIGFuZCBcbGFzdHBlbmFsdHkgY2Fubm90IGJvdGggYmUgbm9uemVybyBzaW11bHRhbmVvdXNseS4KLSAgXHNraXAwID0gXGxhc3Rza2lwCisgIFx3aGF0c2l0c2tpcCA9IFxsYXN0c2tpcAogICBcZWRlZlxsYXN0c2tpcG1hY3Jve1x0aGVcbGFzdHNraXB9JQotICBcY291bnQyNTUgPSBcbGFzdHBlbmFsdHkKKyAgXHdoYXRzaXRwZW5hbHR5ID0gXGxhc3RwZW5hbHR5CiAgICUKICAgJSBJZiBcbGFzdHNraXAgaXMgbm9uemVybywgdGhhdCBtZWFucyB0aGUgbGFzdCBpdGVtIHdhcyBhCiAgICUgc2tpcC4gIEFuZCBzaW5jZSBhIHNraXAgaXMgZGlzY2FyZGFibGUsIHRoYXQgbWVhbnMgdGhpcwotICAlIC1cc2tpcDAgZ2x1ZSB3ZSdyZSBpbnNlcnRpbmcgaXMgcHJlY2VkZWQgYnkgYQorICAlIC1cd2hhdHNpdHNraXAgZ2x1ZSB3ZSdyZSBpbnNlcnRpbmcgaXMgcHJlY2VkZWQgYnkgYQogICAlIG5vbi1kaXNjYXJkYWJsZSBpdGVtLCB0aGVyZWZvcmUgaXQgaXMgbm90IGEgcG90ZW50aWFsCiAgICUgYnJlYWtwb2ludCwgdGhlcmVmb3JlIG5vIFxub2JyZWFrIG5lZWRlZC4KICAgXGlmeFxsYXN0c2tpcG1hY3JvXHplcm9za2lwbWFjcm8KICAgXGVsc2UKLSAgICBcdnNraXAtXHNraXAwCisgICAgXHZza2lwLVx3aGF0c2l0c2tpcAogICBcZmkKICAgJQotICBcZG9zdWJpbmR3cml0ZQorICAjMSUKICAgJQogICBcaWZ4XGxhc3Rza2lwbWFjcm9cemVyb3NraXBtYWNybwogICAgICUgSWYgXGxhc3Rza2lwIHdhcyB6ZXJvLCBwZXJoYXBzIHRoZSBsYXN0IGl0ZW0gd2FzIGEgcGVuYWx0eSwgYW5kCkBAIC0zNTg3LDIwICs0Nzg0LDE5IEBACiAgICAgJSB0byByZS1pbnNlcnQgdGhlIHNhbWUgcGVuYWx0eSAodmFsdWVzID4xMDAwMCBhcmUgdXNlZCBmb3IgdmFyaW91cwogICAgICUgc2lnbmFscyk7IHNpbmNlIHdlIGp1c3QgaW5zZXJ0ZWQgYSBub24tZGlzY2FyZGFibGUgaXRlbSwgYW55CiAgICAgJSBmb2xsb3dpbmcgZ2x1ZSAoc3VjaCBhcyBhIFxwYXJza2lwKSB3b3VsZCBiZSBhIGJyZWFrcG9pbnQuICBGb3IgZXhhbXBsZToKLSAgICAlIAogICAgICUgICBAZGVmZm4gZGVmZm4td2hhdGV2ZXIKICAgICAlICAgQHZpbmRleCBpbmRleC13aGF0ZXZlcgogICAgICUgICBEZXNjcmlwdGlvbi4KICAgICAlIHdvdWxkIGFsbG93IGEgYnJlYWsgYmV0d2VlbiB0aGUgaW5kZXgtd2hhdGV2ZXIgd2hhdHNpdAogICAgICUgYW5kIHRoZSAiRGVzY3JpcHRpb24uIiBwYXJhZ3JhcGguCi0gICAgXGlmbnVtXGNvdW50MjU1Pjk5OTkgXHBlbmFsdHlcY291bnQyNTUgXGZpCisgICAgXGlmbnVtXHdoYXRzaXRwZW5hbHR5Pjk5OTkgXHBlbmFsdHlcd2hhdHNpdHBlbmFsdHkgXGZpCiAgIFxlbHNlCiAgICAgJSBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgd2UgaGFkIGEgbm9uemVybyBcbGFzdHNraXAsCiAgICAgJSB0aGlzIG1ha2UtdXAgZ2x1ZSB3b3VsZCBiZSBwcmVjZWRlZCBieSBhIG5vbi1kaXNjYXJkYWJsZSBpdGVtCiAgICAgJSAodGhlIHdoYXRzaXQgZnJvbSB0aGUgXHdyaXRlKSwgc28gd2UgbXVzdCBpbnNlcnQgYSBcbm9icmVhay4KLSAgICBcbm9icmVha1x2c2tpcFxza2lwMAorICAgIFxub2JyZWFrXHZza2lwXHdoYXRzaXRza2lwCiAgIFxmaQotfQorXGZpfQogCiAlIFRoZSBpbmRleCBlbnRyeSB3cml0dGVuIGluIHRoZSBmaWxlIGFjdHVhbGx5IGxvb2tzIGxpa2UKICUgIFxlbnRyeSB7c29ydHN0cmluZ317cGFnZX17dG9waWN9CkBAIC0zNjQyLDYgKzQ4MzgsNyBAQAogICAlCiAgIFxzbWFsbGZvbnRzIFxybQogICBcdG9sZXJhbmNlID0gOTUwMAorICBccGxhaW5mcmVuY2hzcGFjaW5nCiAgIFxldmVyeXBhciA9IHt9JSBkb24ndCB3YW50IHRoZSBca2VyblwtcGFyaW5kZW50IGZyb20gaW5kZW50YXRpb24gc3VwcHJlc3Npb24uCiAgICUKICAgJSBTZWUgaWYgdGhlIGluZGV4IGZpbGUgZXhpc3RzIGFuZCBpcyBub25lbXB0eS4KQEAgLTM3MTUsMTAgKzQ5MTIsOSBAQAogJQogJSBBIHN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiB3b3VsZCBzdGFydCBsaWtlIHRoaXM6CiAlCVxkZWZcZW50cnkjMSMyey4uLgotJSBCdXQgdGhpcyBmcm96ZXMgdGhlIGNhdGNvZGVzIGluIHRoZSBhcmd1bWVudCwgYW5kIGNhbiBjYXVzZSBwcm9ibGVtcyB0bworJSBCdXQgdGhpcyBmcmVlemVzIHRoZSBjYXRjb2RlcyBpbiB0aGUgYXJndW1lbnQsIGFuZCBjYW4gY2F1c2UgcHJvYmxlbXMgdG8KICUgQGNvZGUsIHdoaWNoIHNldHMgLSBhY3RpdmUuICBUaGlzIHByb2JsZW0gd2FzIGZpeGVkIGJ5IGEga2x1ZGdlLS0tCiAlIGBgLScnIHdhcyBhY3RpdmUgdGhyb3VnaG91dCB3aG9sZSBpbmRleCwgYnV0IHRoaXMgaXNuJ3QgcmVhbGx5IHJpZ2h0LgotJQogJSBUaGUgcmlnaHQgc29sdXRpb24gaXMgdG8gcHJldmVudCBcZW50cnkgZnJvbSBzd2FsbG93aW5nIHRoZSB3aG9sZSB0ZXh0LgogJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0ta2FzYWwsIDIxbm92MDMKIFxkZWZcZW50cnl7JQpAQCAtMzc1NSwxMCArNDk1MSwxNyBAQAogICAgICUgY29sdW1ucy4KICAgICBcdnNraXAgMHB0IHBsdXMxcHQKICAgICAlCisgICAgJSBXaGVuIHJlYWRpbmcgdGhlIHRleHQgb2YgZW50cnksIGNvbnZlcnQgZXhwbGljaXQgbGluZSBicmVha3MKKyAgICAlIGZyb20gQCogaW50byBzcGFjZXMuICBUaGUgdXNlciBtaWdodCBnaXZlIHRoZXNlIGluIGxvbmcgc2VjdGlvbgorICAgICUgdGl0bGVzLCBmb3IgaW5zdGFuY2UuCisgICAgXGRlZlwqe1x1bnNraXBcc3BhY2VcaWdub3Jlc3BhY2VzfSUKKyAgICBcZGVmXGVudHJ5YnJlYWt7XGhmaWxcYnJlYWt9JQorICAgICUKICAgICAlIFN3YWxsb3cgdGhlIGxlZnQgYnJhY2Ugb2YgdGhlIHRleHQgKGZpcnN0IHBhcmFtZXRlcik6CiAgICAgXGFmdGVyYXNzaWdubWVudFxkb2VudHJ5CiAgICAgXGxldFx0ZW1wID0KIH0KK1xkZWZcZW50cnlicmVha3tcdW5za2lwXHNwYWNlXGlnbm9yZXNwYWNlc30lCiBcZGVmXGRvZW50cnl7JQogICAgIFxiZ3JvdXAgJSBJbnN0ZWFkIG9mIHRoZSBzd2FsbG93ZWQgYnJhY2UuCiAgICAgICBcbm9pbmRlbnQKQEAgLTM3NzEsMTEgKzQ5NzQsOCBAQAogICAgICUgVGhlIGZvbGxvd2luZyBpcyBrbHVkZ2VkIHRvIG5vdCBvdXRwdXQgYSBsaW5lIG9mIGRvdHMgaW4gdGhlIGluZGV4IGlmCiAgICAgJSB0aGVyZSBhcmUgbm8gcGFnZSBudW1iZXJzLiAgVGhlIG5leHQgcGVyc29uIHdobyBicmVha3MgdGhpcyB3aWxsIGJlCiAgICAgJSBjdXJzZWQgYnkgYSBVbml4IGRhZW1vbi4KLSAgICBcZGVmXHRlbXBhe3tccm0gfX0lCi0gICAgXGRlZlx0ZW1wYnsjMX0lCi0gICAgXGVkZWZcdGVtcGN7XHRlbXBhfSUKLSAgICBcZWRlZlx0ZW1wZHtcdGVtcGJ9JQotICAgIFxpZnhcdGVtcGNcdGVtcGQKKyAgICBcc2V0Ym94XGJveEEgPSBcaGJveHsjMX0lCisgICAgXGlmZGltXHdkXGJveEEgPSAwcHQKICAgICAgIFwgJQogICAgIFxlbHNlCiAgICAgICAlCkBAIC0zNzk5LDkgKzQ5OTksOSBAQAogICBcZW5kZ3JvdXAKIH0KIAotJSBMaWtlIFxkb3RmaWxsIGV4Y2VwdCB0YWtlcyBhdCBsZWFzdCAxIGVtLgorJSBMaWtlIHBsYWluLnRleCdzIFxkb3RmaWxsLCBleGNlcHQgdXNlcyB1cCBhdCBsZWFzdCAxIGVtLgogXGRlZlxpbmRleGRvdGZpbGx7XGNsZWFkZXJzCi0gIFxoYm94eyRcbWF0aHN1cnJvdW5kPTBwdCBcbWtlcm4xLjVtdSAke1xpdCAufSQgXG1rZXJuMS41bXUkfVxoc2tpcCAxZW0gcGx1cyAxZmlsbH0KKyAgXGhib3h7JFxtYXRoc3Vycm91bmQ9MHB0IFxta2VybjEuNW11Llxta2VybjEuNW11JH1caHNraXAgMWVtIHBsdXMgMWZpbGx9CiAKIFxkZWZccHJpbWFyeSAjMXtcbGluZXsjMVxoZmlsfX0KIApAQCAtMzkxMSw2ICs1MTExLDM0IEBACiAlCiAlIEFsbCBkb25lIHdpdGggZG91YmxlIGNvbHVtbnMuCiBcZGVmXGVuZGRvdWJsZWNvbHVtbnN7JQorICAlIFRoZSBmb2xsb3dpbmcgcGVuYWx0eSBlbnN1cmVzIHRoYXQgdGhlIHBhZ2UgYnVpbGRlciBpcyBleGVyY2lzZWQKKyAgJSBfYmVmb3JlXyB3ZSBjaGFuZ2UgdGhlIG91dHB1dCByb3V0aW5lLiAgVGhpcyBpcyBuZWNlc3NhcnkgaW4gdGhlCisgICUgZm9sbG93aW5nIHNpdHVhdGlvbjoKKyAgJQorICAlIFRoZSBsYXN0IHNlY3Rpb24gb2YgdGhlIGluZGV4IGNvbnNpc3RzIG9ubHkgb2YgYSBzaW5nbGUgZW50cnkuCisgICUgQmVmb3JlIHRoaXMgc2VjdGlvbiwgXHBhZ2V0b3RhbCBpcyBsZXNzIHRoYW4gXHBhZ2Vnb2FsLCBzbyBubworICAlIGJyZWFrIG9jY3VycyBiZWZvcmUgdGhlIGxhc3Qgc2VjdGlvbiBzdGFydHMuICBIb3dldmVyLCB0aGUgbGFzdAorICAlIHNlY3Rpb24sIGNvbnNpc3Rpbmcgb2YgXGluaXRpYWwgYW5kIHRoZSBzaW5nbGUgXGVudHJ5LCBkb2VzIG5vdAorICAlIGZpdCBvbiB0aGUgcGFnZSBhbmQgaGFzIHRvIGJlIGJyb2tlbiBvZmYuICBXaXRob3V0IHRoZSBmb2xsb3dpbmcKKyAgJSBwZW5hbHR5IHRoZSBwYWdlIGJ1aWxkZXIgd2lsbCBub3QgYmUgZXhlcmNpc2VkIHVudGlsIFxlamVjdAorICAlIGJlbG93LCBhbmQgYnkgdGhhdCB0aW1lIHdlJ2xsIGFscmVhZHkgaGF2ZSBjaGFuZ2VkIHRoZSBvdXRwdXQKKyAgJSByb3V0aW5lIHRvIHRoZSBcYmFsYW5jZWNvbHVtbnMgdmVyc2lvbiwgc28gdGhlIG5leHQtdG8tbGFzdAorICAlIGRvdWJsZS1jb2x1bW4gcGFnZSB3aWxsIGJlIHByb2Nlc3NlZCB3aXRoIFxiYWxhbmNlY29sdW1ucywgd2hpY2gKKyAgJSBpcyB3cm9uZzogIFRoZSB0d28gY29sdW1ucyB3aWxsIGdvIHRvIHRoZSBtYWluIHZlcnRpY2FsIGxpc3QsIHdpdGgKKyAgJSB0aGUgYnJva2VuLW9mZiBzZWN0aW9uIGluIHRoZSByZWNlbnQgY29udHJpYnV0aW9ucy4gIEFzIHNvb24gYXMKKyAgJSB0aGUgb3V0cHV0IHJvdXRpbmUgZmluaXNoZXMsIFRlWCBzdGFydHMgcmVjb25zaWRlcmluZyB0aGUgcGFnZQorICAlIGJyZWFrLiAgVGhlIHR3byBjb2x1bW5zIGFuZCB0aGUgYnJva2VuLW9mZiBzZWN0aW9uIGJvdGggZml0IG9uIHRoZQorICAlIHBhZ2UsIGJlY2F1c2UgdGhlIHR3byBjb2x1bW5zIG5vdyB0YWtlIHVwIG9ubHkgaGFsZiBvZiB0aGUgcGFnZQorICAlIGdvYWwuICBXaGVuIFRlWCBzZWVzIFxlamVjdCBmcm9tIGJlbG93IHdoaWNoIGZvbGxvd3MgdGhlIGZpbmFsCisgICUgc2VjdGlvbiwgaXQgaW52b2tlcyB0aGUgbmV3IG91dHB1dCByb3V0aW5lIHRoYXQgd2UndmUgc2V0IGFmdGVyCisgICUgXGJhbGFuY2Vjb2x1bW5zIGJlbG93OyBcb25lcGFnZW91dCB3aWxsIHRyeSB0byBmaXQgdGhlIHR3byBjb2x1bW5zCisgICUgYW5kIHRoZSBmaW5hbCBzZWN0aW9uIGludG8gdGhlIHZib3ggb2YgXHBhZ2VoZWlnaHQgKHNlZQorICAlIFxwYWdlYm9keSksIGNhdXNpbmcgYW4gb3ZlcmZ1bGwgYm94LgorICAlCisgICUgTm90ZSB0aGF0IGdsdWUgd29uJ3Qgd29yayBoZXJlLCBiZWNhdXNlIGdsdWUgZG9lcyBub3QgZXhlcmNpc2UgdGhlCisgICUgcGFnZSBidWlsZGVyLCB1bmxpa2UgcGVuYWx0aWVzIChzZWUgVGhlIFRlWGJvb2ssIHBwLiAyODAtMjgxKS4KKyAgXHBlbmFsdHkwCisgICUKICAgXG91dHB1dCA9IHslCiAgICAgJSBTcGxpdCB0aGUgbGFzdCBvZiB0aGUgZG91YmxlLWNvbHVtbiBtYXRlcmlhbC4gIExlYXZlIGl0IG9uIHRoZQogICAgICUgY3VycmVudCBwYWdlLCBubyBhdXRvbWF0aWMgcGFnZSBicmVhay4KQEAgLTM5NjYsNyArNTE5NCwyMiBAQAogXG1lc3NhZ2V7c2VjdGlvbmluZyx9CiAlIENoYXB0ZXJzLCBzZWN0aW9ucywgZXRjLgogCi0lIFx1bm51bWJlcmVkbm8gaXMgYW4gb3h5bW9yb24sIG9mIGNvdXJzZS4gIEJ1dCB3ZSBjb3VudCB0aGUgdW5udW1iZXJlZAorJSBMZXQncyBzdGFydCB3aXRoIEBwYXJ0LgorXG91dGVyXHBhcnNlYXJnZGVmXHBhcnR7XHBhcnR6enp7IzF9fQorXGRlZlxwYXJ0enp6IzF7JQorICBcY2hhcG9kZHBhZ2UKKyAgXG51bGwKKyAgXHZza2lwLjNcdnNpemUgICUgbW92ZSBpdCBkb3duIG9uIHRoZSBwYWdlIGEgYml0CisgIFxiZWdpbmdyb3VwCisgICAgXG5vaW5kZW50IFx0aXRsZWZvbnRzXHJtaXNib2xkICMxXHBhciAlIHRoZSB0ZXh0CisgICAgXGxldFxsYXN0bm9kZT1cZW1wdHkgICAgICAlIG5vIG5vZGUgdG8gYXNzb2NpYXRlIHdpdGgKKyAgICBcd3JpdGV0b2NlbnRyeXtwYXJ0fXsjMX17fSUgYnV0IHB1dCBpdCBpbiB0aGUgdG9jCisgICAgXGhlYWRpbmdzb2ZmICAgICAgICAgICAgICAlIG5vIGhlYWRsaW5lIG9yIGZvb3RsaW5lIG9uIHRoZSBwYXJ0IHBhZ2UKKyAgICBcY2hhcG9kZHBhZ2UKKyAgXGVuZGdyb3VwCit9CisKKyUgXHVubnVtYmVyZWRubyBpcyBhbiBveHltb3Jvbi4gIEJ1dCB3ZSBjb3VudCB0aGUgdW5udW1iZXJlZAogJSBzZWN0aW9ucyBzbyB0aGF0IHdlIGNhbiByZWZlciB0byB0aGVtIHVuYW1iaWd1b3VzbHkgaW4gdGhlIHBkZgogJSBvdXRsaW5lcyBieSB0aGVpciAic2VjdGlvbiBudW1iZXIiLiAgV2UgYXZvaWQgY29sbGlzaW9ucyB3aXRoIGNoYXB0ZXIKICUgbnVtYmVycyBieSBzdGFydGluZyB0aGVtIGF0IDEwMDAwLiAgKElmIGEgZG9jdW1lbnQgZXZlciBoYXMgMTAwMDAKQEAgLTQwMjAsMTEgKzUyNjMsMTUgQEAKICAgXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpCiAgIFxmaVxmaVxmaVxmaVxmaVxmaVxmaVxmaVxmaVxmaVxmaVxmaVxmaX0KIAotJSBFYWNoIEBjaGFwdGVyIGRlZmluZXMgdGhpcyBhcyB0aGUgbmFtZSBvZiB0aGUgY2hhcHRlci4KLSUgcGFnZSBoZWFkaW5ncyBhbmQgZm9vdGluZ3MgY2FuIHVzZSBpdC4gIEBzZWN0aW9uIGRvZXMgbGlrZXdpc2UuCi0lIEhvd2V2ZXIsIHRoZXkgYXJlIG5vdCByZWxpYWJsZSwgYmVjYXVzZSB3ZSBkb24ndCB1c2UgbWFya3MuCislIEVhY2ggQGNoYXB0ZXIgZGVmaW5lcyB0aGVzZSAodXNpbmcgbWFya3MpIGFzIHRoZSBudW1iZXIrbmFtZSwgbnVtYmVyCislIGFuZCBuYW1lIG9mIHRoZSBjaGFwdGVyLiAgUGFnZSBoZWFkaW5ncyBhbmQgZm9vdGluZ3MgY2FuIHVzZQorJSB0aGVzZS4gIEBzZWN0aW9uIGRvZXMgbGlrZXdpc2UuCiBcZGVmXHRoaXNjaGFwdGVye30KK1xkZWZcdGhpc2NoYXB0ZXJudW17fQorXGRlZlx0aGlzY2hhcHRlcm5hbWV7fQogXGRlZlx0aGlzc2VjdGlvbnt9CitcZGVmXHRoaXNzZWN0aW9ubnVte30KK1xkZWZcdGhpc3NlY3Rpb25uYW1le30KIAogXG5ld2NvdW50XGFic3NlY2xldmVsICUgdXNlZCB0byBjYWxjdWxhdGUgcHJvcGVyIGhlYWRpbmcgbGV2ZWwKIFxuZXdjb3VudFxzZWNiYXNlXHNlY2Jhc2U9MCAlIEByYWlzZXNlY3Rpb25zL0Bsb3dlcnNlY3Rpb25zIG1vZGlmeSB0aGlzIGNvdW50CkBAIC00MDQxLDggKzUyODgsOCBAQAogXGNoYXJkZWZcbWF4c2VjbGV2ZWwgPSAzCiAlCiAlIEEgbnVtYmVyZWQgc2VjdGlvbiB3aXRoaW4gYW4gdW5udW1iZXJlZCBjaGFuZ2VzIHRvIHVubnVtYmVyZWQgdG9vLgotJSBUbyBhY2hpdmUgdGhpcywgcmVtZW1iZXIgdGhlICJiaWdnZXN0IiB1bm51bS4gc2VjLiB3ZSBhcmUgY3VycmVudGx5IGluOgotXGNoYXJkZWZcdW5tbGV2ZWwgPSBcbWF4c2VjbGV2ZWwKKyUgVG8gYWNoaWV2ZSB0aGlzLCByZW1lbWJlciB0aGUgImJpZ2dlc3QiIHVubnVtLiBzZWMuIHdlIGFyZSBjdXJyZW50bHkgaW46CitcY2hhcmRlZlx1bm5sZXZlbCA9IFxtYXhzZWNsZXZlbAogJQogJSBUcmFjZSB3aGV0aGVyIHRoZSBjdXJyZW50IGNoYXB0ZXIgaXMgYW4gYXBwZW5kaXggb3Igbm90OgogJSBcY2hhcGhlYWR0eXBlIGlzICJOIiBvciAiQSIsIHVubnVtYmVyZWQgY2hhcHRlcnMgYXJlIGlnbm9yZWQuCkBAIC00MDY3LDggKzUzMTQsOCBAQAogICAlIFRoZSBoZWFkaW5nIHR5cGU6CiAgIFxkZWZcaGVhZHR5cGV7IzF9JQogICBcaWYgXGhlYWR0eXBlIFUlCi0gICAgXGlmbnVtIFxhYnNzZWNsZXZlbCA8IFx1bm1sZXZlbAotICAgICAgXGNoYXJkZWZcdW5tbGV2ZWwgPSBcYWJzc2VjbGV2ZWwKKyAgICBcaWZudW0gXGFic3NlY2xldmVsIDwgXHVubmxldmVsCisgICAgICBcY2hhcmRlZlx1bm5sZXZlbCA9IFxhYnNzZWNsZXZlbAogICAgIFxmaQogICBcZWxzZQogICAgICUgQ2hlY2sgZm9yIGFwcGVuZGl4IHNlY3Rpb25zOgpAQCAtNDA4MCwxMCArNTMyNywxMCBAQAogICAgICAgXGZpXGZpCiAgICAgXGZpCiAgICAgJSBDaGVjayBmb3IgbnVtYmVyZWQgd2l0aGluIHVubnVtYmVyZWQ6Ci0gICAgXGlmbnVtIFxhYnNzZWNsZXZlbCA+IFx1bm1sZXZlbAorICAgIFxpZm51bSBcYWJzc2VjbGV2ZWwgPiBcdW5ubGV2ZWwKICAgICAgIFxkZWZcaGVhZHR5cGV7VX0lCiAgICAgXGVsc2UKLSAgICAgIFxjaGFyZGVmXHVubWxldmVsID0gMworICAgICAgXGNoYXJkZWZcdW5ubGV2ZWwgPSAzCiAgICAgXGZpCiAgIFxmaQogICAlIE5vdyBwcmludCB0aGUgaGVhZGluZzoKQEAgLTQxMzcsNyArNTM4NCw5IEBACiAgIFxnZGVmXGNoYXBsZXZlbHByZWZpeHtcdGhlXGNoYXBuby59JQogICBccmVzZXRhbGxmbG9hdG5vcwogICAlCi0gIFxtZXNzYWdle1xwdXR3b3JkQ2hhcHRlclxzcGFjZSBcdGhlXGNoYXBub30lCisgICUgXHB1dHdvcmRDaGFwdGVyIGNhbiBjb250YWluIGNvbXBsZXggdGhpbmdzIGluIHRyYW5zbGF0aW9ucy4KKyAgXHRva3MwPVxleHBhbmRhZnRlcntccHV0d29yZENoYXB0ZXJ9JQorICBcbWVzc2FnZXtcdGhlXHRva3MwIFxzcGFjZSBcdGhlXGNoYXBub30lCiAgICUKICAgJSBXcml0ZSB0aGUgYWN0dWFsIGhlYWRpbmcuCiAgIFxjaGFwbWFjcm97IzF9e1ludW1iZXJlZH17XHRoZVxjaGFwbm99JQpAQCAtNDE0OCwxNSArNTM5NywxNyBAQAogICBcZ2xvYmFsXGxldFxzdWJzdWJzZWN0aW9uID0gXG51bWJlcmVkc3Vic3Vic2VjCiB9CiAKLVxvdXRlclxwYXJzZWFyZ2RlZlxhcHBlbmRpeHtcYXBwaGVhZDB7IzF9fSAlIG5vcm1hbGx5IGFwcGhlYWQwIGNhbGxzIGFwcGVuZGl4enp6Citcb3V0ZXJccGFyc2VhcmdkZWZcYXBwZW5kaXh7XGFwcGhlYWQweyMxfX0gJSBub3JtYWxseSBjYWxscyBhcHBlbmRpeHp6egorJQogXGRlZlxhcHBlbmRpeHp6eiMxeyUKICAgXGdsb2JhbFxzZWNubz0wIFxnbG9iYWxcc3Vic2Vjbm89MCBcZ2xvYmFsXHN1YnN1YnNlY25vPTAKICAgICBcZ2xvYmFsXGFkdmFuY2VcYXBwZW5kaXhubyBieSAxCiAgIFxnZGVmXGNoYXBsZXZlbHByZWZpeHtcYXBwZW5kaXhsZXR0ZXIufSUKICAgXHJlc2V0YWxsZmxvYXRub3MKICAgJQotICBcZGVmXGFwcGVuZGl4bnVte1xwdXR3b3JkQXBwZW5kaXhcc3BhY2UgXGFwcGVuZGl4bGV0dGVyfSUKLSAgXG1lc3NhZ2V7XGFwcGVuZGl4bnVtfSUKKyAgJSBccHV0d29yZEFwcGVuZGl4IGNhbiBjb250YWluIGNvbXBsZXggdGhpbmdzIGluIHRyYW5zbGF0aW9ucy4KKyAgXHRva3MwPVxleHBhbmRhZnRlcntccHV0d29yZEFwcGVuZGl4fSUKKyAgXG1lc3NhZ2V7XHRoZVx0b2tzMCBcc3BhY2UgXGFwcGVuZGl4bGV0dGVyfSUKICAgJQogICBcY2hhcG1hY3JveyMxfXtZYXBwZW5kaXh9e1xhcHBlbmRpeGxldHRlcn0lCiAgICUKQEAgLTQxNjUsNyArNTQxNiw4IEBACiAgIFxnbG9iYWxcbGV0XHN1YnN1YnNlY3Rpb24gPSBcYXBwZW5kaXhzdWJzdWJzZWMKIH0KIAotXG91dGVyXHBhcnNlYXJnZGVmXHVubnVtYmVyZWR7XHVubm1oZWFkMHsjMX19ICUgbm9ybWFsbHkgdW5ubWhlYWQwIGNhbGxzIHVubnVtYmVyZWR6enoKKyUgbm9ybWFsbHkgdW5ubWhlYWQwIGNhbGxzIHVubnVtYmVyZWR6eno6Citcb3V0ZXJccGFyc2VhcmdkZWZcdW5udW1iZXJlZHtcdW5ubWhlYWQweyMxfX0KIFxkZWZcdW5udW1iZXJlZHp6eiMxeyUKICAgXGdsb2JhbFxzZWNubz0wIFxnbG9iYWxcc3Vic2Vjbm89MCBcZ2xvYmFsXHN1YnN1YnNlY25vPTAKICAgICBcZ2xvYmFsXGFkdmFuY2VcdW5udW1iZXJlZG5vIGJ5IDEKQEAgLTQyMDksNDAgKzU0NjEsNDcgQEAKIFxsZXRcdG9wXHVubnVtYmVyZWQKIAogJSBTZWN0aW9ucy4KKyUgCiBcb3V0ZXJccGFyc2VhcmdkZWZcbnVtYmVyZWRzZWN7XG51bWhlYWQxeyMxfX0gJSBub3JtYWxseSBjYWxscyBzZWN6enoKIFxkZWZcc2Vjenp6IzF7JQogICBcZ2xvYmFsXHN1YnNlY25vPTAgXGdsb2JhbFxzdWJzdWJzZWNubz0wICBcZ2xvYmFsXGFkdmFuY2Vcc2Vjbm8gYnkgMQogICBcc2VjdGlvbmhlYWRpbmd7IzF9e3NlY317WW51bWJlcmVkfXtcdGhlXGNoYXBuby5cdGhlXHNlY25vfSUKIH0KIAotXG91dGVyXHBhcnNlYXJnZGVmXGFwcGVuZGl4c2VjdGlvbntcYXBwaGVhZDF7IzF9fSAlIG5vcm1hbGx5IGNhbGxzIGFwcGVuZGl4c2VjdGlvbnp6egorJSBub3JtYWxseSBjYWxscyBhcHBlbmRpeHNlY3Rpb256eno6Citcb3V0ZXJccGFyc2VhcmdkZWZcYXBwZW5kaXhzZWN0aW9ue1xhcHBoZWFkMXsjMX19CiBcZGVmXGFwcGVuZGl4c2VjdGlvbnp6eiMxeyUKICAgXGdsb2JhbFxzdWJzZWNubz0wIFxnbG9iYWxcc3Vic3Vic2Vjbm89MCAgXGdsb2JhbFxhZHZhbmNlXHNlY25vIGJ5IDEKICAgXHNlY3Rpb25oZWFkaW5neyMxfXtzZWN9e1lhcHBlbmRpeH17XGFwcGVuZGl4bGV0dGVyLlx0aGVcc2Vjbm99JQogfQogXGxldFxhcHBlbmRpeHNlY1xhcHBlbmRpeHNlY3Rpb24KIAotXG91dGVyXHBhcnNlYXJnZGVmXHVubnVtYmVyZWRzZWN7XHVubm1oZWFkMXsjMX19ICUgbm9ybWFsbHkgY2FsbHMgdW5udW1iZXJlZHNlY3p6egorJSBub3JtYWxseSBjYWxscyB1bm51bWJlcmVkc2Vjenp6OgorXG91dGVyXHBhcnNlYXJnZGVmXHVubnVtYmVyZWRzZWN7XHVubm1oZWFkMXsjMX19CiBcZGVmXHVubnVtYmVyZWRzZWN6enojMXslCiAgIFxnbG9iYWxcc3Vic2Vjbm89MCBcZ2xvYmFsXHN1YnN1YnNlY25vPTAgIFxnbG9iYWxcYWR2YW5jZVxzZWNubyBieSAxCiAgIFxzZWN0aW9uaGVhZGluZ3sjMX17c2VjfXtZbm90aGluZ317XHRoZVx1bm51bWJlcmVkbm8uXHRoZVxzZWNub30lCiB9CiAKICUgU3Vic2VjdGlvbnMuCi1cb3V0ZXJccGFyc2VhcmdkZWZcbnVtYmVyZWRzdWJzZWN7XG51bWhlYWQyeyMxfX0gJSBub3JtYWxseSBjYWxscyBudW1iZXJlZHN1YnNlY3p6egorJSAKKyUgbm9ybWFsbHkgY2FsbHMgbnVtYmVyZWRzdWJzZWN6eno6Citcb3V0ZXJccGFyc2VhcmdkZWZcbnVtYmVyZWRzdWJzZWN7XG51bWhlYWQyeyMxfX0KIFxkZWZcbnVtYmVyZWRzdWJzZWN6enojMXslCiAgIFxnbG9iYWxcc3Vic3Vic2Vjbm89MCAgXGdsb2JhbFxhZHZhbmNlXHN1YnNlY25vIGJ5IDEKICAgXHNlY3Rpb25oZWFkaW5neyMxfXtzdWJzZWN9e1ludW1iZXJlZH17XHRoZVxjaGFwbm8uXHRoZVxzZWNuby5cdGhlXHN1YnNlY25vfSUKIH0KIAotXG91dGVyXHBhcnNlYXJnZGVmXGFwcGVuZGl4c3Vic2Vje1xhcHBoZWFkMnsjMX19ICUgbm9ybWFsbHkgY2FsbHMgYXBwZW5kaXhzdWJzZWN6enoKKyUgbm9ybWFsbHkgY2FsbHMgYXBwZW5kaXhzdWJzZWN6eno6Citcb3V0ZXJccGFyc2VhcmdkZWZcYXBwZW5kaXhzdWJzZWN7XGFwcGhlYWQyeyMxfX0KIFxkZWZcYXBwZW5kaXhzdWJzZWN6enojMXslCiAgIFxnbG9iYWxcc3Vic3Vic2Vjbm89MCAgXGdsb2JhbFxhZHZhbmNlXHN1YnNlY25vIGJ5IDEKICAgXHNlY3Rpb25oZWFkaW5neyMxfXtzdWJzZWN9e1lhcHBlbmRpeH0lCiAgICAgICAgICAgICAgICAgIHtcYXBwZW5kaXhsZXR0ZXIuXHRoZVxzZWNuby5cdGhlXHN1YnNlY25vfSUKIH0KIAotXG91dGVyXHBhcnNlYXJnZGVmXHVubnVtYmVyZWRzdWJzZWN7XHVubm1oZWFkMnsjMX19ICVub3JtYWxseSBjYWxscyB1bm51bWJlcmVkc3Vic2Vjenp6CislIG5vcm1hbGx5IGNhbGxzIHVubnVtYmVyZWRzdWJzZWN6eno6Citcb3V0ZXJccGFyc2VhcmdkZWZcdW5udW1iZXJlZHN1YnNlY3tcdW5ubWhlYWQyeyMxfX0KIFxkZWZcdW5udW1iZXJlZHN1YnNlY3p6eiMxeyUKICAgXGdsb2JhbFxzdWJzdWJzZWNubz0wICBcZ2xvYmFsXGFkdmFuY2Vcc3Vic2Vjbm8gYnkgMQogICBcc2VjdGlvbmhlYWRpbmd7IzF9e3N1YnNlY317WW5vdGhpbmd9JQpAQCAtNDI1MCwyMSArNTUwOSwyNSBAQAogfQogCiAlIFN1YnN1YnNlY3Rpb25zLgotXG91dGVyXHBhcnNlYXJnZGVmXG51bWJlcmVkc3Vic3Vic2Vje1xudW1oZWFkM3sjMX19ICUgbm9ybWFsbHkgbnVtYmVyZWRzdWJzdWJzZWN6enoKKyUgCislIG5vcm1hbGx5IG51bWJlcmVkc3Vic3Vic2Vjenp6OgorXG91dGVyXHBhcnNlYXJnZGVmXG51bWJlcmVkc3Vic3Vic2Vje1xudW1oZWFkM3sjMX19CiBcZGVmXG51bWJlcmVkc3Vic3Vic2Vjenp6IzF7JQogICBcZ2xvYmFsXGFkdmFuY2Vcc3Vic3Vic2Vjbm8gYnkgMQogICBcc2VjdGlvbmhlYWRpbmd7IzF9e3N1YnN1YnNlY317WW51bWJlcmVkfSUKICAgICAgICAgICAgICAgICAge1x0aGVcY2hhcG5vLlx0aGVcc2Vjbm8uXHRoZVxzdWJzZWNuby5cdGhlXHN1YnN1YnNlY25vfSUKIH0KIAotXG91dGVyXHBhcnNlYXJnZGVmXGFwcGVuZGl4c3Vic3Vic2Vje1xhcHBoZWFkM3sjMX19ICUgbm9ybWFsbHkgYXBwZW5kaXhzdWJzdWJzZWN6enoKKyUgbm9ybWFsbHkgYXBwZW5kaXhzdWJzdWJzZWN6eno6Citcb3V0ZXJccGFyc2VhcmdkZWZcYXBwZW5kaXhzdWJzdWJzZWN7XGFwcGhlYWQzeyMxfX0KIFxkZWZcYXBwZW5kaXhzdWJzdWJzZWN6enojMXslCiAgIFxnbG9iYWxcYWR2YW5jZVxzdWJzdWJzZWNubyBieSAxCiAgIFxzZWN0aW9uaGVhZGluZ3sjMX17c3Vic3Vic2VjfXtZYXBwZW5kaXh9JQogICAgICAgICAgICAgICAgICB7XGFwcGVuZGl4bGV0dGVyLlx0aGVcc2Vjbm8uXHRoZVxzdWJzZWNuby5cdGhlXHN1YnN1YnNlY25vfSUKIH0KIAotXG91dGVyXHBhcnNlYXJnZGVmXHVubnVtYmVyZWRzdWJzdWJzZWN7XHVubm1oZWFkM3sjMX19ICVub3JtYWxseSB1bm51bWJlcmVkc3Vic3Vic2Vjenp6CislIG5vcm1hbGx5IHVubnVtYmVyZWRzdWJzdWJzZWN6eno6Citcb3V0ZXJccGFyc2VhcmdkZWZcdW5udW1iZXJlZHN1YnN1YnNlY3tcdW5ubWhlYWQzeyMxfX0KIFxkZWZcdW5udW1iZXJlZHN1YnN1YnNlY3p6eiMxeyUKICAgXGdsb2JhbFxhZHZhbmNlXHN1YnN1YnNlY25vIGJ5IDEKICAgXHNlY3Rpb25oZWFkaW5neyMxfXtzdWJzdWJzZWN9e1lub3RoaW5nfSUKQEAgLTQyODgsNyArNTU1MSw2IEBACiAlICAgICAgIDMpIExpa2V3aXNlLCBoZWFkaW5ncyBsb29rIGJlc3QgaWYgbm8gXHBhcmluZGVudCBpcyB1c2VkLCBhbmQKICUgICAgICAgICAgaWYganVzdGlmaWNhdGlvbiBpcyBub3QgYXR0ZW1wdGVkLiAgSGVuY2UgXHJhZ2dlZHJpZ2h0LgogCi0KIFxkZWZcbWFqb3JoZWFkaW5neyUKICAge1xhZHZhbmNlXGNoYXBoZWFkaW5nc2tpcCBieSAxMHB0IFxjaGFwYnJlYWsgfSUKICAgXHBhcnNlYXJnXGNoYXBoZWFkaW5nenp6CkBAIC00Mjk3LDggKzU1NTksOCBAQAogXGRlZlxjaGFwaGVhZGluZ3tcY2hhcGJyZWFrIFxwYXJzZWFyZ1xjaGFwaGVhZGluZ3p6en0KIFxkZWZcY2hhcGhlYWRpbmd6enojMXslCiAgIHtcY2hhcGZvbnRzIFx2Ym94e1xoeXBoZW5wZW5hbHR5PTEwMDAwXHRvbGVyYW5jZT01MDAwCi0gICAgICAgICAgICAgICAgICAgIFxwYXJpbmRlbnQ9MHB0XHJhZ2dlZHJpZ2h0Ci0gICAgICAgICAgICAgICAgICAgIFxybSAjMVxoZmlsbH19JQorICAgICAgICAgICAgICAgICAgICBccGFyaW5kZW50PTBwdFxwdGV4cmFnZ2VkcmlnaHQKKyAgICAgICAgICAgICAgICAgICAgXHJtaXNib2xkICMxXGhmaWxsfX0lCiAgIFxiaWdza2lwIFxwYXJccGVuYWx0eSAyMDBccmVsYXgKICAgXHN1cHByZXNzZmlyc3RwYXJhZ3JhcGhpbmRlbnQKIH0KQEAgLTQzMTUsMTcgKzU1NzcsMjggQEAKICUgKGluY2x1ZGluZyB3aGl0ZXNwYWNlLCBsaW5lYnJlYWtpbmcsIGV0Yy4gYXJvdW5kIGl0KSwKICUgZ2l2ZW4gYWxsIHRoZSBpbmZvcm1hdGlvbiBpbiBjb252ZW5pZW50LCBwYXJzZWQgZm9ybS4KIAotJSUlIEFyZ3MgYXJlIHRoZSBza2lwIGFuZCBwZW5hbHR5ICh1c3VhbGx5IG5lZ2F0aXZlKQorJSBBcmdzIGFyZSB0aGUgc2tpcCBhbmQgcGVuYWx0eSAodXN1YWxseSBuZWdhdGl2ZSkKIFxkZWZcZG9icmVhayMxIzJ7XHBhclxpZmRpbVxsYXN0c2tpcDwjMVxyZW1vdmVsYXN0c2tpcFxwZW5hbHR5IzJcdnNraXAjMVxmaX0KIAotJSUlIERlZmluZSBwbGFpbiBjaGFwdGVyIHN0YXJ0cywgYW5kIHBhZ2Ugb24vb2ZmIHN3aXRjaGluZyBmb3IgaXQKICUgUGFyYW1ldGVyIGNvbnRyb2xsaW5nIHNraXAgYmVmb3JlIGNoYXB0ZXIgaGVhZGluZ3MgKGlmIG5lZWRlZCkKLQogXG5ld3NraXBcY2hhcGhlYWRpbmdza2lwCiAKKyUgRGVmaW5lIHBsYWluIGNoYXB0ZXIgc3RhcnRzLCBhbmQgcGFnZSBvbi9vZmYgc3dpdGNoaW5nIGZvciBpdC4KIFxkZWZcY2hhcGJyZWFre1xkb2JyZWFrIFxjaGFwaGVhZGluZ3NraXAgey00MDAwfX0KIFxkZWZcY2hhcHBhZ2Vye1xwYXJcdmZpbGxcc3VwZXJlamVjdH0KLVxkZWZcY2hhcG9kZHBhZ2V7XGNoYXBwYWdlciBcaWZvZGRccGFnZW5vIFxlbHNlIFxoYm94IHRvIDBwdHt9IFxjaGFwcGFnZXJcZml9CislIEJlY2F1c2UgXGRvbWFyayBpcyBjYWxsZWQgYmVmb3JlIFxjaGFwb2RkcGFnZSwgdGhlIGZpbGxlciBwYWdlIHdpbGwKKyUgZ2V0IHRoZSBoZWFkaW5ncyBmb3IgdGhlIG5leHQgY2hhcHRlciwgd2hpY2ggaXMgd3JvbmcuICBCdXQgd2UgZG9uJ3QKKyUgY2FyZSAtLSB3ZSBqdXN0IGRpc2FibGUgYWxsIGhlYWRpbmdzIG9uIHRoZSBmaWxsZXIgcGFnZS4KK1xkZWZcY2hhcG9kZHBhZ2V7JQorICBcY2hhcHBhZ2VyCisgIFxpZm9kZFxwYWdlbm8gXGVsc2UKKyAgICBcYmVnaW5ncm91cAorICAgICAgXGhlYWRpbmdzb2ZmCisgICAgICBcbnVsbAorICAgICAgXGNoYXBwYWdlcgorICAgIFxlbmRncm91cAorICBcZmkKK30KIAogXGRlZlxzZXRjaGFwdGVybmV3cGFnZSAjMSB7XGNzbmFtZSBDSEFQUEFHIzFcZW5kY3NuYW1lfQogCkBAIC00MzU5LDQxICs1NjMyLDc4IEBACiBcZGVmXFlhcHBlbmRpeGtleXdvcmR7WWFwcGVuZGl4fQogJQogXGRlZlxjaGFwbWFjcm8jMSMyIzN7JQorICAlIEluc2VydCB0aGUgZmlyc3QgbWFyayBiZWZvcmUgdGhlIGhlYWRpbmcgYnJlYWsgKHNlZSBub3RlcyBmb3IgXGRvbWFyaykuCisgIFxsZXRccHJldmNoYXB0ZXJkZWZzPVxsYXN0Y2hhcHRlcmRlZnMKKyAgXGxldFxwcmV2c2VjdGlvbmRlZnM9XGxhc3RzZWN0aW9uZGVmcworICBcZ2RlZlxsYXN0c2VjdGlvbmRlZnN7XGdkZWZcdGhpc3NlY3Rpb25uYW1le31cZ2RlZlx0aGlzc2VjdGlvbm51bXt9JQorICAgICAgICAgICAgICAgICAgICAgICAgXGdkZWZcdGhpc3NlY3Rpb257fX0lCisgICUKKyAgXGRlZlx0ZW1wdHlwZXsjMn0lCisgIFxpZnhcdGVtcHR5cGVcWW5vdGhpbmdrZXl3b3JkCisgICAgXGdkZWZcbGFzdGNoYXB0ZXJkZWZze1xnZGVmXHRoaXNjaGFwdGVybmFtZXsjMX1cZ2RlZlx0aGlzY2hhcHRlcm51bXt9JQorICAgICAgICAgICAgICAgICAgICAgICAgICBcZ2RlZlx0aGlzY2hhcHRlcntcdGhpc2NoYXB0ZXJuYW1lfX0lCisgIFxlbHNlXGlmeFx0ZW1wdHlwZVxZb21pdGZyb210b2NrZXl3b3JkCisgICAgXGdkZWZcbGFzdGNoYXB0ZXJkZWZze1xnZGVmXHRoaXNjaGFwdGVybmFtZXsjMX1cZ2RlZlx0aGlzY2hhcHRlcm51bXt9JQorICAgICAgICAgICAgICAgICAgICAgICAgICBcZ2RlZlx0aGlzY2hhcHRlcnt9fSUKKyAgXGVsc2VcaWZ4XHRlbXB0eXBlXFlhcHBlbmRpeGtleXdvcmQKKyAgICBcdG9rczA9eyMxfSUKKyAgICBceGRlZlxsYXN0Y2hhcHRlcmRlZnN7JQorICAgICAgXGdkZWZcbm9leHBhbmRcdGhpc2NoYXB0ZXJuYW1le1x0aGVcdG9rczB9JQorICAgICAgXGdkZWZcbm9leHBhbmRcdGhpc2NoYXB0ZXJudW17XGFwcGVuZGl4bGV0dGVyfSUKKyAgICAgICUgXG5vZXhwYW5kXHB1dHdvcmRBcHBlbmRpeCBhdm9pZHMgZXhwYW5kaW5nIGluZGlnZXN0aWJsZQorICAgICAgJSBjb21tYW5kcyBpbiBzb21lIG9mIHRoZSB0cmFuc2xhdGlvbnMuCisgICAgICBcZ2RlZlxub2V4cGFuZFx0aGlzY2hhcHRlcntcbm9leHBhbmRccHV0d29yZEFwcGVuZGl4e30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxub2V4cGFuZFx0aGlzY2hhcHRlcm51bToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxub2V4cGFuZFx0aGlzY2hhcHRlcm5hbWV9JQorICAgIH0lCisgIFxlbHNlCisgICAgXHRva3MwPXsjMX0lCisgICAgXHhkZWZcbGFzdGNoYXB0ZXJkZWZzeyUKKyAgICAgIFxnZGVmXG5vZXhwYW5kXHRoaXNjaGFwdGVybmFtZXtcdGhlXHRva3MwfSUKKyAgICAgIFxnZGVmXG5vZXhwYW5kXHRoaXNjaGFwdGVybnVte1x0aGVcY2hhcG5vfSUKKyAgICAgICUgXG5vZXhwYW5kXHB1dHdvcmRDaGFwdGVyIGF2b2lkcyBleHBhbmRpbmcgaW5kaWdlc3RpYmxlCisgICAgICAlIGNvbW1hbmRzIGluIHNvbWUgb2YgdGhlIHRyYW5zbGF0aW9ucy4KKyAgICAgIFxnZGVmXG5vZXhwYW5kXHRoaXNjaGFwdGVye1xub2V4cGFuZFxwdXR3b3JkQ2hhcHRlcnt9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbm9leHBhbmRcdGhpc2NoYXB0ZXJudW06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbm9leHBhbmRcdGhpc2NoYXB0ZXJuYW1lfSUKKyAgICB9JQorICBcZmlcZmlcZmkKKyAgJQorICAlIE91dHB1dCB0aGUgbWFyay4gIFBhc3MgaXQgdGhyb3VnaCBcc2FmZXdoYXRzaXQsIHRvIHRha2UgY2FyZSBvZgorICAlIHRoZSBwcmVjZWRpbmcgc3BhY2UuCisgIFxzYWZld2hhdHNpdFxkb21hcmsKKyAgJQorICAlIEluc2VydCB0aGUgY2hhcHRlciBoZWFkaW5nIGJyZWFrLgogICBccGNoYXBzZXBtYWNybworICAlCisgICUgTm93IHRoZSBzZWNvbmQgbWFyaywgYWZ0ZXIgdGhlIGhlYWRpbmcgYnJlYWsuICBObyBicmVhayBwb2ludHMKKyAgJSBiZXR3ZWVuIGhlcmUgYW5kIHRoZSBoZWFkaW5nLgorICBcbGV0XHByZXZjaGFwdGVyZGVmcz1cbGFzdGNoYXB0ZXJkZWZzCisgIFxsZXRccHJldnNlY3Rpb25kZWZzPVxsYXN0c2VjdGlvbmRlZnMKKyAgXGRvbWFyaworICAlCiAgIHslCi0gICAgXGNoYXBmb250cyBccm0KKyAgICBcY2hhcGZvbnRzIFxybWlzYm9sZAogICAgICUKLSAgICAlIEhhdmUgdG8gZGVmaW5lIFx0aGlzc2VjdGlvbiBiZWZvcmUgY2FsbGluZyBcZG9ub2RlcmVmLCBiZWNhdXNlIHRoZQorICAgICUgSGF2ZSB0byBkZWZpbmUgXGxhc3RzZWN0aW9uIGJlZm9yZSBjYWxsaW5nIFxkb25vZGVyZWYsIGJlY2F1c2UgdGhlCiAgICAgJSB4cmVmIGNvZGUgZXZlbnR1YWxseSB1c2VzIGl0LiAgT24gdGhlIG90aGVyIGhhbmQsIGl0IGhhcyB0byBiZSBjYWxsZWQKICAgICAlIGFmdGVyIFxwY2hhcHNlcG1hY3JvLCBvciB0aGUgaGVhZGxpbmUgd2lsbCBjaGFuZ2UgdG9vIHNvb24uCi0gICAgXGdkZWZcdGhpc3NlY3Rpb257IzF9JQotICAgIFxnZGVmXHRoaXNjaGFwdGVybmFtZXsjMX0lCisgICAgXGdkZWZcbGFzdHNlY3Rpb257IzF9JQogICAgICUKICAgICAlIE9ubHkgaW5zZXJ0IHRoZSBzZXBhcmF0aW5nIHNwYWNlIGlmIHdlIGhhdmUgYSBjaGFwdGVyL2FwcGVuZGl4CiAgICAgJSBudW1iZXIsIGFuZCBkb24ndCBwcmludCB0aGUgdW5udW1iZXJlZCBgYG51bWJlcicnLgotICAgIFxkZWZcdGVtcHR5cGV7IzJ9JQogICAgIFxpZnhcdGVtcHR5cGVcWW5vdGhpbmdrZXl3b3JkCiAgICAgICBcc2V0Ym94MCA9IFxoYm94e30lCiAgICAgICBcZGVmXHRvY3R5cGV7dW5uY2hhcH0lCi0gICAgICBcZ2RlZlx0aGlzY2hhcHRlcnsjMX0lCiAgICAgXGVsc2VcaWZ4XHRlbXB0eXBlXFlvbWl0ZnJvbXRvY2tleXdvcmQKICAgICAgIFxzZXRib3gwID0gXGhib3h7fSUgY29udGVudHMgbGlrZSB1bm51bWJlcmVkLCBidXQgbm8gdG9jIGVudHJ5CiAgICAgICBcZGVmXHRvY3R5cGV7b21pdH0lCi0gICAgICBcZ2RlZlx0aGlzY2hhcHRlcnt9JQogICAgIFxlbHNlXGlmeFx0ZW1wdHlwZVxZYXBwZW5kaXhrZXl3b3JkCiAgICAgICBcc2V0Ym94MCA9IFxoYm94e1xwdXR3b3JkQXBwZW5kaXh7fSAjM1xlbnNwYWNlfSUKICAgICAgIFxkZWZcdG9jdHlwZXthcHB9JQotICAgICAgJSBXZSBkb24ndCBzdWJzdGl0dXRlIHRoZSBhY3R1YWwgY2hhcHRlciBuYW1lIGludG8gXHRoaXNjaGFwdGVyCi0gICAgICAlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCBpdHMgbWFjcm9zIGV2YWx1YXRlZCBub3cuICBBbmQgd2UgZG9uJ3QKLSAgICAgICUgdXNlIFx0aGlzc2VjdGlvbiBiZWNhdXNlIHRoYXQgY2hhbmdlcyB3aXRoIGVhY2ggc2VjdGlvbi4KLSAgICAgICUKLSAgICAgIFx4ZGVmXHRoaXNjaGFwdGVye1xwdXR3b3JkQXBwZW5kaXh7fSBcYXBwZW5kaXhsZXR0ZXI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBcbm9leHBhbmRcdGhpc2NoYXB0ZXJuYW1lfSUKICAgICBcZWxzZQogICAgICAgXHNldGJveDAgPSBcaGJveHsjM1xlbnNwYWNlfSUKICAgICAgIFxkZWZcdG9jdHlwZXtudW1jaGFwfSUKLSAgICAgIFx4ZGVmXHRoaXNjaGFwdGVye1xwdXR3b3JkQ2hhcHRlcnt9IFx0aGVcY2hhcG5vOgotICAgICAgICAgICAgICAgICAgICAgICAgXG5vZXhwYW5kXHRoaXNjaGFwdGVybmFtZX0lCiAgICAgXGZpXGZpXGZpCiAgICAgJQogICAgICUgV3JpdGUgdGhlIHRvYyBlbnRyeSBmb3IgdGhpcyBjaGFwdGVyLiAgTXVzdCBjb21lIGJlZm9yZSB0aGUKQEAgLTQ0MDksNyArNTcxOSw4IEBACiAgICAgXGRvbm9kZXJlZnsjMn0lCiAgICAgJQogICAgICUgVHlwZXNldCB0aGUgYWN0dWFsIGhlYWRpbmcuCi0gICAgXHZib3h7XGh5cGhlbnBlbmFsdHk9MTAwMDAgXHRvbGVyYW5jZT01MDAwIFxwYXJpbmRlbnQ9MHB0IFxyYWdnZWRyaWdodAorICAgIFxub2JyZWFrICUgQXZvaWQgcGFnZSBicmVha3MgYXQgdGhlIGludGVybGluZSBnbHVlLgorICAgIFx2Ym94e1xoeXBoZW5wZW5hbHR5PTEwMDAwIFx0b2xlcmFuY2U9NTAwMCBccGFyaW5kZW50PTBwdCBccHRleHJhZ2dlZHJpZ2h0CiAgICAgICAgICAgXGhhbmdpbmRlbnQ9XHdkMCBcY2VudGVycGFyYW1ldGVyc21heWJlCiAgICAgICAgICAgXHVuaGJveDAgIzFccGFyfSUKICAgfSUKQEAgLTQ0MzMsOCArNTc0NCw4IEBACiAlCiBcZGVmXHVubmNoZm9wZW4gIzF7JQogXGNoYXBvZGRwYWdlIHtcY2hhcGZvbnRzIFx2Ym94e1xoeXBoZW5wZW5hbHR5PTEwMDAwXHRvbGVyYW5jZT01MDAwCi0gICAgICAgICAgICAgICAgICAgICAgIFxwYXJpbmRlbnQ9MHB0XHJhZ2dlZHJpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgIFxybSAjMVxoZmlsbH19XGJpZ3NraXAgXHBhclxub2JyZWFrCisgICAgICAgICAgICAgICAgICAgICAgIFxwYXJpbmRlbnQ9MHB0XHB0ZXhyYWdnZWRyaWdodAorICAgICAgICAgICAgICAgICAgICAgICBccm1pc2JvbGQgIzFcaGZpbGx9fVxiaWdza2lwIFxwYXJcbm9icmVhawogfQogXGRlZlxjaGZvcGVuICMxIzJ7XGNoYXBvZGRwYWdlIHtcY2hhcGZvbnRzCiBcdmJveCB0byAzaW57XHZmaWwgXGhib3ggdG9caHNpemV7XGhmaWwgIzJ9IFxoYm94IHRvXGhzaXple1xoZmlsICMxfSBcdmZpbH19JQpAQCAtNDQ0Myw3ICs1NzU0LDcgQEAKIFxkZWZcY2VudGVyY2hmb3BlbiAjMXslCiBcY2hhcG9kZHBhZ2Uge1xjaGFwZm9udHMgXHZib3h7XGh5cGhlbnBlbmFsdHk9MTAwMDBcdG9sZXJhbmNlPTUwMDAKICAgICAgICAgICAgICAgICAgICAgICAgXHBhcmluZGVudD0wcHQKLSAgICAgICAgICAgICAgICAgICAgICAgXGhmaWxsIHtccm0gIzF9XGhmaWxsfX1cYmlnc2tpcCBccGFyXG5vYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgXGhmaWxsIHtccm1pc2JvbGQgIzF9XGhmaWxsfX1cYmlnc2tpcCBccGFyXG5vYnJlYWsKIH0KIFxkZWZcQ0hBUEZvcGVueyUKICAgXGdsb2JhbFxsZXRcY2hhcG1hY3JvPVxjaGZvcGVuCkBAIC00NDcxLDQ3ICs1NzgyLDExMCBAQAogJSB0aGUgc2VjdGlvbiB0eXBlIGZvciB4cmVmcyAoWW51bWJlcmVkLCBZbm90aGluZywgWWFwcGVuZGl4KSwgIzQgaXMgdGhlCiAlIHNlY3Rpb24gbnVtYmVyLgogJQorXGRlZlxzZWNrZXl3b3Jke3NlY30KKyUKIFxkZWZcc2VjdGlvbmhlYWRpbmcjMSMyIzMjNHslCiAgIHslCisgICAgXGNoZWNrZW52e30lIHNob3VsZCBub3QgYmUgaW4gYW4gZW52aXJvbm1lbnQuCisgICAgJQogICAgICUgU3dpdGNoIHRvIHRoZSByaWdodCBzZXQgb2YgZm9udHMuCi0gICAgXGNzbmFtZSAjMmZvbnRzXGVuZGNzbmFtZSBccm0KKyAgICBcY3NuYW1lICMyZm9udHNcZW5kY3NuYW1lIFxybWlzYm9sZAorICAgICUKKyAgICBcZGVmXHNlY3Rpb25sZXZlbHsjMn0lCisgICAgXGRlZlx0ZW1wdHlwZXsjM30lCisgICAgJQorICAgICUgSW5zZXJ0IGZpcnN0IG1hcmsgYmVmb3JlIHRoZSBoZWFkaW5nIGJyZWFrIChzZWUgbm90ZXMgZm9yIFxkb21hcmspLgorICAgIFxsZXRccHJldnNlY3Rpb25kZWZzPVxsYXN0c2VjdGlvbmRlZnMKKyAgICBcaWZ4XHRlbXB0eXBlXFlub3RoaW5na2V5d29yZAorICAgICAgXGlmeFxzZWN0aW9ubGV2ZWxcc2Vja2V5d29yZAorICAgICAgICBcZ2RlZlxsYXN0c2VjdGlvbmRlZnN7XGdkZWZcdGhpc3NlY3Rpb25uYW1leyMxfVxnZGVmXHRoaXNzZWN0aW9ubnVte30lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcZ2RlZlx0aGlzc2VjdGlvbntcdGhpc3NlY3Rpb25uYW1lfX0lCisgICAgICBcZmkKKyAgICBcZWxzZVxpZnhcdGVtcHR5cGVcWW9taXRmcm9tdG9ja2V5d29yZAorICAgICAgJSBEb24ndCByZWRlZmluZSBcdGhpc3NlY3Rpb24uCisgICAgXGVsc2VcaWZ4XHRlbXB0eXBlXFlhcHBlbmRpeGtleXdvcmQKKyAgICAgIFxpZnhcc2VjdGlvbmxldmVsXHNlY2tleXdvcmQKKyAgICAgICAgXHRva3MwPXsjMX0lCisgICAgICAgIFx4ZGVmXGxhc3RzZWN0aW9uZGVmc3slCisgICAgICAgICAgXGdkZWZcbm9leHBhbmRcdGhpc3NlY3Rpb25uYW1le1x0aGVcdG9rczB9JQorICAgICAgICAgIFxnZGVmXG5vZXhwYW5kXHRoaXNzZWN0aW9ubnVteyM0fSUKKyAgICAgICAgICAlIFxub2V4cGFuZFxwdXR3b3JkU2VjdGlvbiBhdm9pZHMgZXhwYW5kaW5nIGluZGlnZXN0aWJsZQorICAgICAgICAgICUgY29tbWFuZHMgaW4gc29tZSBvZiB0aGUgdHJhbnNsYXRpb25zLgorICAgICAgICAgIFxnZGVmXG5vZXhwYW5kXHRoaXNzZWN0aW9ue1xub2V4cGFuZFxwdXR3b3JkU2VjdGlvbnt9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5vZXhwYW5kXHRoaXNzZWN0aW9ubnVtOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxub2V4cGFuZFx0aGlzc2VjdGlvbm5hbWV9JQorICAgICAgICB9JQorICAgICAgXGZpCisgICAgXGVsc2UKKyAgICAgIFxpZnhcc2VjdGlvbmxldmVsXHNlY2tleXdvcmQKKyAgICAgICAgXHRva3MwPXsjMX0lCisgICAgICAgIFx4ZGVmXGxhc3RzZWN0aW9uZGVmc3slCisgICAgICAgICAgXGdkZWZcbm9leHBhbmRcdGhpc3NlY3Rpb25uYW1le1x0aGVcdG9rczB9JQorICAgICAgICAgIFxnZGVmXG5vZXhwYW5kXHRoaXNzZWN0aW9ubnVteyM0fSUKKyAgICAgICAgICAlIFxub2V4cGFuZFxwdXR3b3JkU2VjdGlvbiBhdm9pZHMgZXhwYW5kaW5nIGluZGlnZXN0aWJsZQorICAgICAgICAgICUgY29tbWFuZHMgaW4gc29tZSBvZiB0aGUgdHJhbnNsYXRpb25zLgorICAgICAgICAgIFxnZGVmXG5vZXhwYW5kXHRoaXNzZWN0aW9ue1xub2V4cGFuZFxwdXR3b3JkU2VjdGlvbnt9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5vZXhwYW5kXHRoaXNzZWN0aW9ubnVtOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxub2V4cGFuZFx0aGlzc2VjdGlvbm5hbWV9JQorICAgICAgICB9JQorICAgICAgXGZpCisgICAgXGZpXGZpXGZpCisgICAgJQorICAgICUgR28gaW50byB2ZXJ0aWNhbCBtb2RlLiAgVXN1YWxseSB3ZSdsbCBhbHJlYWR5IGJlIHRoZXJlLCBidXQgd2UKKyAgICAlIGRvbid0IHdhbnQgdGhlIGZvbGxvd2luZyB3aGF0c2l0IHRvIGVuZCB1cCBpbiBhIHByZWNlZGluZyBwYXJhZ3JhcGgKKyAgICAlIGlmIHRoZSBkb2N1bWVudCBkaWRuJ3QgaGFwcGVuIHRvIGhhdmUgYSBibGFuayBsaW5lLgorICAgIFxwYXIKKyAgICAlCisgICAgJSBPdXRwdXQgdGhlIG1hcmsuICBQYXNzIGl0IHRocm91Z2ggXHNhZmV3aGF0c2l0LCB0byB0YWtlIGNhcmUgb2YKKyAgICAlIHRoZSBwcmVjZWRpbmcgc3BhY2UuCisgICAgXHNhZmV3aGF0c2l0XGRvbWFyawogICAgICUKICAgICAlIEluc2VydCBzcGFjZSBhYm92ZSB0aGUgaGVhZGluZy4KICAgICBcY3NuYW1lICMyaGVhZGluZ2JyZWFrXGVuZGNzbmFtZQogICAgICUKLSAgICAlIE9ubHkgaW5zZXJ0IHRoZSBzcGFjZSBhZnRlciB0aGUgbnVtYmVyIGlmIHdlIGhhdmUgYSBzZWN0aW9uIG51bWJlci4KLSAgICBcZGVmXHNlY3Rpb25sZXZlbHsjMn0lCi0gICAgXGRlZlx0ZW1wdHlwZXsjM30lCisgICAgJSBOb3cgdGhlIHNlY29uZCBtYXJrLCBhZnRlciB0aGUgaGVhZGluZyBicmVhay4gIE5vIGJyZWFrIHBvaW50cworICAgICUgYmV0d2VlbiBoZXJlIGFuZCB0aGUgaGVhZGluZy4KKyAgICBcbGV0XHByZXZzZWN0aW9uZGVmcz1cbGFzdHNlY3Rpb25kZWZzCisgICAgXGRvbWFyawogICAgICUKKyAgICAlIE9ubHkgaW5zZXJ0IHRoZSBzcGFjZSBhZnRlciB0aGUgbnVtYmVyIGlmIHdlIGhhdmUgYSBzZWN0aW9uIG51bWJlci4KICAgICBcaWZ4XHRlbXB0eXBlXFlub3RoaW5na2V5d29yZAogICAgICAgXHNldGJveDAgPSBcaGJveHt9JQogICAgICAgXGRlZlx0b2N0eXBle3Vubn0lCi0gICAgICBcZ2RlZlx0aGlzc2VjdGlvbnsjMX0lCisgICAgICBcZ2RlZlxsYXN0c2VjdGlvbnsjMX0lCiAgICAgXGVsc2VcaWZ4XHRlbXB0eXBlXFlvbWl0ZnJvbXRvY2tleXdvcmQKICAgICAgICUgZm9yIEBoZWFkaW5ncyAtLSBubyBzZWN0aW9uIG51bWJlciwgZG9uJ3QgaW5jbHVkZSBpbiB0b2MsCi0gICAgICAlIGFuZCBkb24ndCByZWRlZmluZSBcdGhpc3NlY3Rpb24uCisgICAgICAlIGFuZCBkb24ndCByZWRlZmluZSBcbGFzdHNlY3Rpb24uCiAgICAgICBcc2V0Ym94MCA9IFxoYm94e30lCiAgICAgICBcZGVmXHRvY3R5cGV7b21pdH0lCiAgICAgICBcbGV0XHNlY3Rpb25sZXZlbD1cZW1wdHkKICAgICBcZWxzZVxpZnhcdGVtcHR5cGVcWWFwcGVuZGl4a2V5d29yZAogICAgICAgXHNldGJveDAgPSBcaGJveHsjNFxlbnNwYWNlfSUKICAgICAgIFxkZWZcdG9jdHlwZXthcHB9JQotICAgICAgXGdkZWZcdGhpc3NlY3Rpb257IzF9JQorICAgICAgXGdkZWZcbGFzdHNlY3Rpb257IzF9JQogICAgIFxlbHNlCiAgICAgICBcc2V0Ym94MCA9IFxoYm94eyM0XGVuc3BhY2V9JQogICAgICAgXGRlZlx0b2N0eXBle251bX0lCi0gICAgICBcZ2RlZlx0aGlzc2VjdGlvbnsjMX0lCisgICAgICBcZ2RlZlxsYXN0c2VjdGlvbnsjMX0lCiAgICAgXGZpXGZpXGZpCiAgICAgJQotICAgICUgV3JpdGUgdGhlIHRvYyBlbnRyeSAoYmVmb3JlIFxkb25vZGVyZWYpLiAgU2VlIGNvbW1lbnRzIGluIFxjaGZwbGFpbi4KKyAgICAlIFdyaXRlIHRoZSB0b2MgZW50cnkgKGJlZm9yZSBcZG9ub2RlcmVmKS4gIFNlZSBjb21tZW50cyBpbiBcY2hhcG1hY3JvLgogICAgIFx3cml0ZXRvY2VudHJ5e1x0b2N0eXBlXHNlY3Rpb25sZXZlbH17IzF9eyM0fSUKICAgICAlCiAgICAgJSBXcml0ZSB0aGUgbm9kZSByZWZlcmVuY2UgKD0gcGRmIGRlc3RpbmF0aW9uIGZvciBwZGZ0ZXgpLgotICAgICUgQWdhaW4sIHNlZSBjb21tZW50cyBpbiBcY2hmcGxhaW4uCisgICAgJSBBZ2Fpbiwgc2VlIGNvbW1lbnRzIGluIFxjaGFwbWFjcm8uCiAgICAgXGRvbm9kZXJlZnsjM30lCiAgICAgJQorICAgICUgSW50ZXJsaW5lIGdsdWUgd2lsbCBiZSBpbnNlcnRlZCB3aGVuIHRoZSB2Ym94IGlzIGNvbXBsZXRlZC4KKyAgICAlIFRoYXQgZ2x1ZSB3aWxsIGJlIGEgdmFsaWQgYnJlYWtwb2ludCBmb3IgdGhlIHBhZ2UsIHNpbmNlIGl0J2xsIGJlCisgICAgJSBwcmVjZWRlZCBieSBhIHdoYXRzaXQgKHVzdWFsbHkgZnJvbSB0aGUgXGRvbm9kZXJlZiwgb3IgZnJvbSB0aGUKKyAgICAlIFx3cml0ZXRvY2VudHJ5IGlmIHRoZXJlIHdhcyBubyBub2RlKS4gIFdlIGRvbid0IHdhbnQgdG8gYWxsb3cgdGhhdAorICAgICUgYnJlYWssIHNpbmNlIHRoZW4gdGhlIHdoYXRzaXRzIGNvdWxkIGVuZCB1cCBvbiBwYWdlIG4gd2hpbGUgdGhlCisgICAgJSBzZWN0aW9uIGlzIG9uIHBhZ2UgbisxLCB0aHVzIHRvYy9ldGMuIGFyZSB3cm9uZy4gIERlYmlhbiBidWcgMjc2MDAwLgorICAgIFxub2JyZWFrCisgICAgJQogICAgICUgT3V0cHV0IHRoZSBhY3R1YWwgc2VjdGlvbiBoZWFkaW5nLgotICAgIFx2Ym94e1xoeXBoZW5wZW5hbHR5PTEwMDAwIFx0b2xlcmFuY2U9NTAwMCBccGFyaW5kZW50PTBwdCBccmFnZ2VkcmlnaHQKKyAgICBcdmJveHtcaHlwaGVucGVuYWx0eT0xMDAwMCBcdG9sZXJhbmNlPTUwMDAgXHBhcmluZGVudD0wcHQgXHB0ZXhyYWdnZWRyaWdodAogICAgICAgICAgIFxoYW5naW5kZW50PVx3ZDAgICUgemVybyBpZiBubyBzZWN0aW9uIG51bWJlcgogICAgICAgICAgIFx1bmhib3gwICMxfSUKICAgfSUKQEAgLTQ1MjUsMTUgKzU4OTksMTUgQEAKICAgJQogICAlIFdlJ2xsIGFsbW9zdCBjZXJ0YWlubHkgc3RhcnQgYSBwYXJhZ3JhcGggbmV4dCwgc28gZG9uJ3QgbGV0IHRoYXQKICAgJSBnbHVlIGFjY3VtdWxhdGUuICAoTm90IGEgYnJlYWtwb2ludCBiZWNhdXNlIGl0J3MgcHJlY2VkZWQgYnkgYQotICAlIGRpc2NhcmRhYmxlIGl0ZW0uKQorICAlIGRpc2NhcmRhYmxlIGl0ZW0uKSAgSG93ZXZlciwgd2hlbiBhIHBhcmFncmFwaCBpcyBub3Qgc3RhcnRlZCBuZXh0CisgICUgKFxzdGFydGRlZnVuLCBcY2FydG91Y2hlLCBcY2VudGVyLCBldGMuKSwgdGhpcyBuZWVkcyB0byBiZSB3aXBlZCBvdXQKKyAgJSBvciB0aGUgbmVnYXRpdmUgZ2x1ZSB3aWxsIGNhdXNlIHdlaXJkbHkgd3Jvbmcgb3V0cHV0LCB0eXBpY2FsbHkKKyAgJSBvYnNjdXJpbmcgdGhlIHNlY3Rpb24gaGVhZGluZyB3aXRoIHNvbWV0aGluZyBlbHNlLgogICBcdnNraXAtXHBhcnNraXAKLSAgJSAKLSAgJSBUaGlzIGlzIHB1cmVseSBzbyB0aGUgbGFzdCBpdGVtIG9uIHRoZSBsaXN0IGlzIGEga25vd24gXHBlbmFsdHkgPgotICAlIDEwMDAwLiAgVGhpcyBpcyBzbyBcc3RhcnRkZWZ1biBjYW4gYXZvaWQgYWxsb3dpbmcgYnJlYWtwb2ludHMgYWZ0ZXIKLSAgJSBzZWN0aW9uIGhlYWRpbmdzLiAgT3RoZXJ3aXNlLCBpdCB3b3VsZCBpbnNlcnQgYSB2YWxpZCBicmVha3BvaW50IGJldHdlZW46Ci0gICUgCi0gICUgICBAc2VjdGlvbiBzZWMtd2hhdGV2ZXIKLSAgJSAgIEBkZWZmbiBkZWYtd2hhdGV2ZXIKKyAgJQorICAlIFRoaXMgaXMgc28gdGhlIGxhc3QgaXRlbSBvbiB0aGUgbWFpbiB2ZXJ0aWNhbCBsaXN0IGlzIGEga25vd24KKyAgJSBccGVuYWx0eSA+IDEwMDAwLCBzbyBcc3RhcnRkZWZ1biwgZXRjLiwgY2FuIHJlY29nbml6ZSB0aGUgc2l0dWF0aW9uCisgICUgYW5kIGRvIHRoZSBuZWVkZnVsLgogICBccGVuYWx0eSAxMDAwMQogfQogCkBAIC00NTcyLDcgKzU5NDYsNyBAQAogICAgICAgIFxlZGVmXHRlbXB7JQogICAgICAgICAgXHdyaXRlXHRvY2ZpbGV7QCMxZW50cnl7IzJ9eyMzfXtcbGFzdG5vZGV9e1xub2V4cGFuZFxmb2xpb319fSUKICAgICAgICBcdGVtcAotICAgICAgfQorICAgICAgfSUKICAgICBcZmkKICAgXGZpCiAgICUKQEAgLTQ1ODksNyArNTk2Myw3IEBACiAlIFRoZXNlIGNoYXJhY3RlcnMgZG8gbm90IHByaW50IHByb3Blcmx5IGluIHRoZSBDb21wdXRlciBNb2Rlcm4gcm9tYW4KICUgZm9udHMsIHNvIHdlIG11c3QgdGFrZSBzcGVjaWFsIGNhcmUuICBUaGlzIGlzIG1vcmUgb3IgbGVzcyByZWR1bmRhbnQKICUgd2l0aCB0aGUgVGV4aW5mbyBpbnB1dCBmb3JtYXQgc2V0dXAgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUuCi0lIAorJQogXGRlZlxhY3RpdmVjYXRjb2Rlc3slCiAgIFxjYXRjb2RlYFwiPVxhY3RpdmUKICAgXGNhdGNvZGVgXCQ9XGFjdGl2ZQpAQCAtNDYwNyw3ICs1OTgxLDcgQEAKIFxkZWZccmVhZHRvY2ZpbGV7JQogICBcc2V0dXBkYXRhZmlsZQogICBcYWN0aXZlY2F0Y29kZXMKLSAgXGlucHV0IFxqb2JuYW1lLnRvYworICBcaW5wdXQgXHRvY3JlYWRmaWxlbmFtZQogfQogCiBcbmV3c2tpcFxjb250ZW50c3JpZ2h0bWFyZ2luIFxjb250ZW50c3JpZ2h0bWFyZ2luPTFpbgpAQCAtNDYyNiw3ICs2MDAwLDYgQEAKICAgJQogICAlIERvbid0IG5lZWQgdG8gcHV0IGBDb250ZW50cycgb3IgYFNob3J0IENvbnRlbnRzJyBpbiB0aGUgaGVhZGxpbmUuCiAgICUgSXQgaXMgYWJ1bmRhbnRseSBjbGVhciB3aGF0IHRoZXkgYXJlLgotICBcZGVmXHRoaXNjaGFwdGVye30lCiAgIFxjaGFwbWFjcm97IzF9e1lvbWl0ZnJvbXRvY317fSUKICAgJQogICBcc2F2ZXBhZ2VubyA9IFxwYWdlbm8KQEAgLTQ2MzgsMTEgKzYwMTEsMTYgQEAKICAgICBcaWZudW0gXHBhZ2Vubz4wIFxnbG9iYWxccGFnZW5vID0gXGxhc3RuZWdhdGl2ZXBhZ2VubyBcZmkKIH0KIAorJSByZWRlZmluZWQgZm9yIHRoZSB0d28tdm9sdW1lIGxpc3ByZWYuICBXZSBhbHdheXMgb3V0cHV0IG9uCislIFxqb2JuYW1lLnRvYyBldmVuIGlmIHRoaXMgaXMgcmVkZWZpbmVkLgorJQorXGRlZlx0b2NyZWFkZmlsZW5hbWV7XGpvYm5hbWUudG9jfQogCiAlIE5vcm1hbCAobG9uZykgdG9jLgorJQogXGRlZlxjb250ZW50c3slCiAgIFxzdGFydGNvbnRlbnRze1xwdXR3b3JkVE9DfSUKLSAgICBcb3BlbmluIDEgXGpvYm5hbWUudG9jCisgICAgXG9wZW5pbiAxIFx0b2NyZWFkZmlsZW5hbWVcc3BhY2UKICAgICBcaWZlb2YgMSBcZWxzZQogICAgICAgXHJlYWR0b2NmaWxlCiAgICAgXGZpCkBAIC00NjYxLDYgKzYwMzksNyBAQAogXGRlZlxzdW1tYXJ5Y29udGVudHN7JQogICBcc3RhcnRjb250ZW50c3tccHV0d29yZFNob3J0VE9DfSUKICAgICAlCisgICAgXGxldFxwYXJ0ZW50cnkgPSBcc2hvcnRwYXJ0ZW50cnkKICAgICBcbGV0XG51bWNoYXBlbnRyeSA9IFxzaG9ydGNoYXBlbnRyeQogICAgIFxsZXRcYXBwZW50cnkgPSBcc2hvcnRjaGFwZW50cnkKICAgICBcbGV0XHVubmNoYXBlbnRyeSA9IFxzaG9ydHVubmNoYXBlbnRyeQpAQCAtNDY4MCw3ICs2MDU5LDcgQEAKICAgICBcbGV0XG51bXN1YnN1YnNlY2VudHJ5ID0gXG51bXNlY2VudHJ5CiAgICAgXGxldFxhcHBzdWJzdWJzZWNlbnRyeSA9IFxudW1zZWNlbnRyeQogICAgIFxsZXRcdW5uc3Vic3Vic2VjZW50cnkgPSBcbnVtc2VjZW50cnkKLSAgICBcb3BlbmluIDEgXGpvYm5hbWUudG9jCisgICAgXG9wZW5pbiAxIFx0b2NyZWFkZmlsZW5hbWVcc3BhY2UKICAgICBcaWZlb2YgMSBcZWxzZQogICAgICAgXHJlYWR0b2NmaWxlCiAgICAgXGZpCkBAIC00NzE2LDYgKzYwOTUsMTkgQEAKICUgVGhlIGxhc3QgYXJndW1lbnQgaXMgdGhlIHBhZ2UgbnVtYmVyLgogJSBUaGUgYXJndW1lbnRzIGluIGJldHdlZW4gYXJlIHRoZSBjaGFwdGVyIG51bWJlciwgc2VjdGlvbiBudW1iZXIsIC4uLgogCislIFBhcnRzLCBpbiB0aGUgbWFpbiBjb250ZW50cy4gIFJlcGxhY2UgdGhlIHBhcnQgbnVtYmVyLCB3aGljaCBkb2Vzbid0CislIGV4aXN0LCB3aXRoIGFuIGVtcHR5IGJveC4gIExldCdzIGhvcGUgYWxsIHRoZSBudW1iZXJzIGhhdmUgdGhlIHNhbWUgd2lkdGguCislIEFsc28gaWdub3JlIHRoZSBwYWdlIG51bWJlciwgd2hpY2ggaXMgY29udmVudGlvbmFsbHkgbm90IHByaW50ZWQuCitcZGVmXG51bWVyYWxib3h7XHNldGJveDA9XGhib3h7OH1caGJveCB0byBcd2Qwe1xoZmlsfX0KK1xkZWZccGFydGVudHJ5IzEjMiMzIzR7XGRvY2hhcGVudHJ5e1xudW1lcmFsYm94XGxhYmVsc3BhY2UjMX17fX0KKyUKKyUgUGFydHMsIGluIHRoZSBzaG9ydCB0b2MuCitcZGVmXHNob3J0cGFydGVudHJ5IzEjMiMzIzR7JQorICBccGVuYWx0eS0zMDAKKyAgXHZza2lwLjVcYmFzZWxpbmVza2lwIHBsdXMuMTVcYmFzZWxpbmVza2lwIG1pbnVzLjFcYmFzZWxpbmVza2lwCisgIFxzaG9ydGNoYXBlbnRyeXt7XGJmICMxfX17XG51bWVyYWxib3h9e317fSUKK30KKwogJSBDaGFwdGVycywgaW4gdGhlIG1haW4gY29udGVudHMuCiBcZGVmXG51bWNoYXBlbnRyeSMxIzIjMyM0e1xkb2NoYXBlbnRyeXsjMlxsYWJlbHNwYWNlIzF9eyM0fX0KICUKQEAgLTQ4MDUsNDUgKzYxOTcsMTIgQEAKIFxtZXNzYWdle2Vudmlyb25tZW50cyx9CiAlIEBmb28gLi4uIEBlbmQgZm9vLgogCi0lIEBwb2ludHt9LCBAcmVzdWx0e30sIEBleHBhbnNpb257fSwgQHByaW50e30sIEBlcXVpdnt9LgotJQotJSBTaW5jZSB0aGVzZSBjaGFyYWN0ZXJzIGFyZSB1c2VkIGluIGV4YW1wbGVzLCBpdCBzaG91bGQgYmUgYW4gZXZlbiBudW1iZXIgb2YKLSUgXHR0IHdpZHRocy4gRWFjaCBcdHQgY2hhcmFjdGVyIGlzIDFlbiwgc28gdHdvIG1ha2VzIGl0IDFlbS4KLSUKLVxkZWZccG9pbnR7JFxzdGFyJH0KLVxkZWZccmVzdWx0e1xsZWF2ZXZtb2RlXHJhaXNlLjE1ZXhcaGJveCB0byAxZW17XGhmaWwkXFJpZ2h0YXJyb3ckXGhmaWx9fQotXGRlZlxleHBhbnNpb257XGxlYXZldm1vZGVccmFpc2UuMWV4XGhib3ggdG8gMWVte1xoZmlsJFxtYXBzdG8kXGhmaWx9fQotXGRlZlxwcmludHtcbGVhdmV2bW9kZVxsb3dlci4xZXhcaGJveCB0byAxZW17XGhmaWwkXGRhc2h2JFxoZmlsfX0KLVxkZWZcZXF1aXZ7XGxlYXZldm1vZGVcbG93ZXIuMWV4XGhib3ggdG8gMWVte1xoZmlsJFxwdGV4ZXF1aXYkXGhmaWx9fQotCi0lIFRoZSBAZXJyb3J7fSBjb21tYW5kLgotJSBBZGFwdGVkIGZyb20gdGhlIFRlWGJvb2sncyBcYm94aXQuCi0lCi1cbmV3Ym94XGVycm9yYm94Ci0lCi17XHRlbnR0IFxnbG9iYWxcZGltZW4wID0gM2VtfSUgV2lkdGggb2YgdGhlIGJveC4KLVxkaW1lbjIgPSAuNTVwdCAlIFRoaWNrbmVzcyBvZiBydWxlcwotJSBUaGUgdGV4dC4gKGByJyBpcyBvcGVuIG9uIHRoZSByaWdodCwgYGUnIHNvbWV3aGF0IGxlc3Mgc28gb24gdGhlIGxlZnQuKQotXHNldGJveDAgPSBcaGJveHtca2Vybi0uNzVwdCBcdGVuc2YgZXJyb3Jca2Vybi0xLjVwdH0KLSUKLVxzZXRib3hcZXJyb3Jib3g9XGhib3ggdG8gXGRpbWVuMHtcaGZpbAotICAgXGhzaXplID0gXGRpbWVuMCBcYWR2YW5jZVxoc2l6ZSBieSAtNS44cHQgJSBTcGFjZSB0byBsZWZ0K3JpZ2h0LgotICAgXGFkdmFuY2VcaHNpemUgYnkgLTJcZGltZW4yICUgUnVsZXMuCi0gICBcdmJveHslCi0gICAgICBcaHJ1bGUgaGVpZ2h0XGRpbWVuMgotICAgICAgXGhib3h7XHZydWxlIHdpZHRoXGRpbWVuMiBca2VybjNwdCAgICAgICAgICAlIFNwYWNlIHRvIGxlZnQgb2YgdGV4dC4KLSAgICAgICAgIFx2dG9we1xrZXJuMi40cHQgXGJveDAgXGtlcm4yLjRwdH0lIFNwYWNlIGFib3ZlL2JlbG93LgotICAgICAgICAgXGtlcm4zcHRcdnJ1bGUgd2lkdGhcZGltZW4yfSUgU3BhY2UgdG8gcmlnaHQuCi0gICAgICBcaHJ1bGUgaGVpZ2h0XGRpbWVuMn0KLSAgICBcaGZpbH0KLSUKLVxkZWZcZXJyb3J7XGxlYXZldm1vZGVcbG93ZXIuN2V4XGNvcHlcZXJyb3Jib3h9Ci0KLSUgQHRleCAuLi4gQGVuZCB0ZXggICAgZXNjYXBlcyBpbnRvIHJhdyBUZXggdGVtcG9yYXJpbHkuCislIEB0ZXggLi4uIEBlbmQgdGV4ICAgIGVzY2FwZXMgaW50byByYXcgVGVYIHRlbXBvcmFyaWx5LgogJSBPbmUgZXhjZXB0aW9uOiBAIGlzIHN0aWxsIGFuIGVzY2FwZSBjaGFyYWN0ZXIsIHNvIHRoYXQgQGVuZCB0ZXggd29ya3MuCi0lIEJ1dCBcQCBvciBAQCB3aWxsIGdldCBhIHBsYWluIHRleCBAIGNoYXJhY3Rlci4KKyUgQnV0IFxAIG9yIEBAIHdpbGwgZ2V0IGEgcGxhaW4gQCBjaGFyYWN0ZXIuCiAKIFxlbnZkZWZcdGV4eyUKKyAgXHNldHVwbWFya3Vwc3R5bGV7dGV4fSUKICAgXGNhdGNvZGUgYFxcPTAgXGNhdGNvZGUgYFx7PTEgXGNhdGNvZGUgYFx9PTIKICAgXGNhdGNvZGUgYFwkPTMgXGNhdGNvZGUgYFwmPTQgXGNhdGNvZGUgYFwjPTYKICAgXGNhdGNvZGUgYFxePTcgXGNhdGNvZGUgYFxfPTggXGNhdGNvZGUgYFx+PVxhY3RpdmUgXGxldH49XHRpZQpAQCAtNDg1Myw4ICs2MjEyLDE0IEBACiAgIFxjYXRjb2RlIGBcfD1cb3RoZXIKICAgXGNhdGNvZGUgYFw8PVxvdGhlcgogICBcY2F0Y29kZSBgXD49XG90aGVyCisgIFxjYXRjb2RlYFxgPVxvdGhlcgorICBcY2F0Y29kZWBcJz1cb3RoZXIKICAgXGVzY2FwZWNoYXI9YFxcCiAgICUKKyAgJSAnIGlzIGFjdGl2ZSBpbiBtYXRoIG1vZGUgKG1hdGhjb2RlIjgwMDApLiAgU28gcmVzZXQgaXQsIGFuZCBhbGwgb3VyCisgICUgb3RoZXIgbWF0aCBhY3RpdmUgY2hhcmFjdGVycyAoanVzdCBpbiBjYXNlKSwgdG8gcGxhaW4ncyBkZWZpbml0aW9ucy4KKyAgXG1hdGhhY3RpdmUKKyAgJQogICBcbGV0XGI9XHB0ZXhiCiAgIFxsZXRcYnVsbGV0PVxwdGV4YnVsbGV0CiAgIFxsZXRcYz1ccHRleGMKQEAgLTQ4NzIsNiArNjIzNyw3IEBACiAgIFxsZXRcLz1ccHRleHNsYXNoCiAgIFxsZXRcKj1ccHRleHN0YXIKICAgXGxldFx0PVxwdGV4dAorICBcZXhwYW5kYWZ0ZXIgXGxldFxjc25hbWUgdG9wXGVuZGNzbmFtZT1ccHRleHRvcCAgJSBvdXRlcgogICBcbGV0XGZyZW5jaHNwYWNpbmc9XHBsYWluZnJlbmNoc3BhY2luZwogICAlCiAgIFxkZWZcZW5kbGRvdHN7XG1hdGhpbm5lcntcbGRvdHNcbGRvdHNcbGRvdHNcbGRvdHN9fSUKQEAgLTQ5NTcsNiArNjMyMywxMiBAQAogICBcbm9ybWJza2lwPVxiYXNlbGluZXNraXAgXG5vcm1wc2tpcD1ccGFyc2tpcCBcbm9ybWxza2lwPVxsaW5lc2tpcAogICAlIEZsYWcgdG8gdGVsbCBAbGlzcCwgZXRjLiwgbm90IHRvIG5hcnJvdyBtYXJnaW4uCiAgIFxsZXRcbm9uYXJyb3dpbmcgPSB0JQorICAlCisgICUgSWYgdGhpcyBjYXJ0b3VjaGUgZGlyZWN0bHkgZm9sbG93cyBhIHNlY3Rpb25pbmcgY29tbWFuZCwgd2UgbmVlZCB0aGUKKyAgJSBccGFyc2tpcCBnbHVlIChiYWNrc3BhY2VkIG92ZXIgYnkgZGVmYXVsdCkgb3IgdGhlIGNhcnRvdWNoZSBjYW4KKyAgJSBjb2xsaWRlIHdpdGggdGhlIHNlY3Rpb24gaGVhZGluZy4KKyAgXGlmbnVtXGxhc3RwZW5hbHR5PjEwMDAwIFx2c2tpcFxwYXJza2lwIFxwZW5hbHR5XGxhc3RwZW5hbHR5IFxmaQorICAlCiAgIFx2Ym94XGJncm91cAogICAgICAgXGJhc2VsaW5lc2tpcD0wcHRccGFyc2tpcD0wcHRcbGluZXNraXA9MHB0CiAgICAgICBcY2FydHRvcApAQCAtNDk3MCw3ICs2MzQyLDcgQEAKIAkgICAgICBcbGluZXNraXA9XG5vcm1sc2tpcAogCSAgICAgIFxwYXJza2lwPVxub3JtcHNraXAKIAkgICAgICBcdnNraXAgLVxwYXJza2lwCi0JICAgICAgXGNvbW1lbnQgJSBGb3IgZXhwbGFuYXRpb24sIHNlZSB0aGUgZW5kIG9mIFxkZWZcZ3JvdXAuCisJICAgICAgXGNvbW1lbnQgJSBGb3IgZXhwbGFuYXRpb24sIHNlZSB0aGUgZW5kIG9mIGRlZlxncm91cC4KIH0KIFxkZWZcRWNhcnRvdWNoZXslCiAgICAgICAgICAgICAgIFxpZmhtb2RlXHBhclxmaQpAQCAtNDk4Nyw2ICs2MzU5LDcgQEAKIAogJSBUaGlzIG1hY3JvIGlzIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGFsbCB0aGUgQGV4YW1wbGUgdmFyaWFudHMsCiAlIGluc2lkZSBhIGdyb3VwLgorXG5ld2RpbWVuXG5vbmZpbGxwYXJpbmRlbnQKIFxkZWZcbm9uZmlsbHN0YXJ0eyUKICAgXGFib3ZlZW52YnJlYWsKICAgXGhmdXp6ID0gMTJwdCAlIERvbid0IGJlIGZ1c3N5CkBAIC00OTk0LDcgKzYzNjcsMTIgQEAKICAgXGxldFxwYXIgPSBcbGlzcHBhciAlIGRvbid0IGlnbm9yZSBibGFuayBsaW5lcwogICBcb2JleWxpbmVzICUgZWFjaCBsaW5lIG9mIGlucHV0IGlzIGEgbGluZSBvZiBvdXRwdXQKICAgXHBhcnNraXAgPSAwcHQKKyAgJSBUdXJuIG9mZiBwYXJhZ3JhcGggaW5kZW50YXRpb24gYnV0IHJlZGVmaW5lIFxpbmRlbnQgdG8gZW11bGF0ZQorICAlIHRoZSBub3JtYWwgXGluZGVudC4KKyAgXG5vbmZpbGxwYXJpbmRlbnQ9XHBhcmluZGVudAogICBccGFyaW5kZW50ID0gMHB0CisgIFxsZXRcaW5kZW50XG5vbmZpbGxpbmRlbnQKKyAgJQogICBcZW1lcmdlbmN5c3RyZXRjaCA9IDBwdCAlIGRvbid0IHRyeSB0byBhdm9pZCBvdmVyZnVsbCBib3hlcwogICBcaWZ4XG5vbmFycm93aW5nXHJlbGF4CiAgICAgXGFkdmFuY2UgXGxlZnRza2lwIGJ5IFxsaXNwbmFycm93aW5nCkBAIC01MDA1LDYgKzYzODMsMjQgQEAKICAgXGxldFxleGRlbnQ9XG5vZmlsbGV4ZGVudAogfQogCitcYmVnaW5ncm91cAorXG9iZXlzcGFjZXMKKyUgV2Ugd2FudCB0byBzd2FsbG93IHNwYWNlcyAoYnV0IG5vdCBvdGhlciB0b2tlbnMpIGFmdGVyIHRoZSBmYWtlCislIEBpbmRlbnQgaW4gb3VyIG5vbmZpbGwtZW52aXJvbm1lbnRzLCB3aGVyZSBzcGFjZXMgYXJlIG5vcm1hbGx5CislIGFjdGl2ZSBhbmQgc2V0IHRvIEB0aWUsIHJlc3VsdGluZyBpbiB0aGVtIG5vdCBiZWluZyBpZ25vcmVkIGFmdGVyCislIEBpbmRlbnQuCitcZ2RlZlxub25maWxsaW5kZW50e1xmdXR1cmVsZXRcdGVtcFxub25maWxsaW5kZW50Y2hlY2t9JQorXGdkZWZcbm9uZmlsbGluZGVudGNoZWNreyUKK1xpZnhcdGVtcCAlCitcZXhwYW5kYWZ0ZXJcbm9uZmlsbGluZGVudGdvYmJsZSUKK1xlbHNlJQorXGxlYXZldm1vZGVcbm9uZmlsbGluZGVudGJveCUKK1xmaSUKK30lCitcZW5kZ3JvdXAKK1xkZWZcbm9uZmlsbGluZGVudGdvYmJsZSMxe1xub25maWxsaW5kZW50fQorXGRlZlxub25maWxsaW5kZW50Ym94e1xoYm94IHRvIFxub25maWxscGFyaW5kZW50e1xoc3N9fQorCiAlIElmIHlvdSB3YW50IGFsbCBleGFtcGxlcyBldGMuIHNtYWxsOiBAc2V0IGRpc3BlbnZzaXplIHNtYWxsLgogJSBJZiB5b3Ugd2FudCBldmVuIHNtYWxsIGV4YW1wbGVzIHRoZSBmdWxsIHNpemU6IEBzZXQgZGlzcGVudnNpemUgbm9zbWFsbC4KICUgVGhpcyBhZmZlY3RzIHRoZSBmb2xsb3dpbmcgZGlzcGxheWVkIGVudmlyb25tZW50czoKQEAgLTUwMTUsNTMgKzY0MTEsNTkgQEAKIFxsZXRcU0VUZGlzcGVudnNpemVccmVsYXgKIFxkZWZcc2V0bm9ybWFsZGlzcGVudnslCiAgIFxpZnhcU0VUZGlzcGVudnNpemVcc21hbGx3b3JkCisgICAgJSBlbmQgcGFyYWdyYXBoIGZvciBzYWtlIG9mIGxlYWRpbmcsIGluIGNhc2UgZG9jdW1lbnQgaGFzIG5vIGJsYW5rCisgICAgJSBsaW5lLiAgVGhpcyBpcyByZWR1bmRhbnQgd2l0aCB3aGF0IGhhcHBlbnMgaW4gXGFib3ZlZW52YnJlYWssIGJ1dAorICAgICUgd2UgbmVlZCB0byBkbyBpdCBiZWZvcmUgY2hhbmdpbmcgdGhlIGZvbnRzLCBhbmQgaXQncyBpbmNvbnZlbmllbnQKKyAgICAlIHRvIGNoYW5nZSB0aGUgZm9udHMgYWZ0ZXJ3YXJkLgorICAgIFxpZm51bSBcbGFzdHBlbmFsdHk9MTAwMDAgXGVsc2UgXGVuZGdyYWYgXGZpCiAgICAgXHNtYWxsZXhhbXBsZWZvbnRzIFxybQogICBcZmkKIH0KIFxkZWZcc2V0c21hbGxkaXNwZW52eyUKICAgXGlmeFxTRVRkaXNwZW52c2l6ZVxub3NtYWxsd29yZAogICBcZWxzZQorICAgIFxpZm51bSBcbGFzdHBlbmFsdHk9MTAwMDAgXGVsc2UgXGVuZGdyYWYgXGZpCiAgICAgXHNtYWxsZXhhbXBsZWZvbnRzIFxybQogICBcZmkKIH0KIAogJSBXZSBvZnRlbiBkZWZpbmUgdHdvIGVudmlyb25tZW50cywgQGZvbyBhbmQgQHNtYWxsZm9vLgotJSBMZXQncyBkbyBpdCBieSBvbmUgY29tbWFuZDoKLVxkZWZcbWFrZWRpc3BlbnYgIzEjMnsKLSAgXGV4cGFuZGFmdGVyXGVudmRlZlxjc25hbWUjMVxlbmRjc25hbWUge1xzZXRub3JtYWxkaXNwZW52ICMyfQotICBcZXhwYW5kYWZ0ZXJcZW52ZGVmXGNzbmFtZSBzbWFsbCMxXGVuZGNzbmFtZSB7XHNldHNtYWxsZGlzcGVudiAjMn0KKyUgTGV0J3MgZG8gaXQgaW4gb25lIGNvbW1hbmQuICAjMSBpcyB0aGUgZW52IG5hbWUsICMyIHRoZSBkZWZpbml0aW9uLgorXGRlZlxtYWtlZGlzcGVudmRlZiMxIzJ7JQorICBcZXhwYW5kYWZ0ZXJcZW52ZGVmXGNzbmFtZSMxXGVuZGNzbmFtZSB7XHNldG5vcm1hbGRpc3BlbnYgIzJ9JQorICBcZXhwYW5kYWZ0ZXJcZW52ZGVmXGNzbmFtZSBzbWFsbCMxXGVuZGNzbmFtZSB7XHNldHNtYWxsZGlzcGVudiAjMn0lCiAgIFxleHBhbmRhZnRlclxsZXRcY3NuYW1lIEUjMVxlbmRjc25hbWUgXGFmdGVyZW52YnJlYWsKICAgXGV4cGFuZGFmdGVyXGxldFxjc25hbWUgRXNtYWxsIzFcZW5kY3NuYW1lIFxhZnRlcmVudmJyZWFrCiB9CiAKLSUgRGVmaW5lIHR3byBzeW5vbnltczoKLVxkZWZcbWFrZXR3b2Rpc3BlbnZzICMxIzIjM3sKLSAgXG1ha2VkaXNwZW52eyMxfXsjM30KLSAgXG1ha2VkaXNwZW52eyMyfXsjM30KKyUgRGVmaW5lIHR3byBlbnZpcm9ubWVudCBzeW5vbnltcyAoIzEgYW5kICMyKSBmb3IgYW4gZW52aXJvbm1lbnQuCitcZGVmXG1ha2V0d29kaXNwZW52ZGVmIzEjMiMzeyUKKyAgXG1ha2VkaXNwZW52ZGVmeyMxfXsjM30lCisgIFxtYWtlZGlzcGVudmRlZnsjMn17IzN9JQogfQotCi0lIEBsaXNwOiBpbmRlbnRlZCwgbmFycm93ZWQsIHR5cGV3cml0ZXIgZm9udDsgQGV4YW1wbGU6IHNhbWUgYXMgQGxpc3AuCislCislIEBsaXNwOiBpbmRlbnRlZCwgbmFycm93ZWQsIHR5cGV3cml0ZXIgZm9udDsKKyUgQGV4YW1wbGU6IHNhbWUgYXMgQGxpc3AuCiAlCiAlIEBzbWFsbGV4YW1wbGUgYW5kIEBzbWFsbGxpc3A6IHVzZSBzbWFsbGVyIGZvbnRzLgogJSBPcmlnaW5hbGx5IGNvbnRyaWJ1dGVkIGJ5IFBhdmVsQHhlcm94LgogJQotXG1ha2V0d29kaXNwZW52cyB7bGlzcH17ZXhhbXBsZX17JQorXG1ha2V0d29kaXNwZW52ZGVme2xpc3B9e2V4YW1wbGV9eyUKICAgXG5vbmZpbGxzdGFydAotICBcdHQKKyAgXHR0XHNldHVwbWFya3Vwc3R5bGV7ZXhhbXBsZX0lCiAgIFxsZXRca2JkZm9udCA9IFxrYmRleGFtcGxlZm9udCAlIEFsbG93IEBrYmQgdG8gZG8gc29tZXRoaW5nIHNwZWNpYWwuCi0gIFxnb2JibGUgICAgICAgJSBlYXQgcmV0dXJuCisgIFxnb2JibGUgJSBlYXQgcmV0dXJuCiB9Ci0KICUgQGRpc3BsYXkvQHNtYWxsZGlzcGxheTogc2FtZSBhcyBAbGlzcCBleGNlcHQga2VlcCBjdXJyZW50IGZvbnQuCiAlCi1cbWFrZWRpc3BlbnYge2Rpc3BsYXl9eyUKK1xtYWtlZGlzcGVudmRlZntkaXNwbGF5fXslCiAgIFxub25maWxsc3RhcnQKICAgXGdvYmJsZQogfQogCiAlIEBmb3JtYXQvQHNtYWxsZm9ybWF0OiBzYW1lIGFzIEBkaXNwbGF5IGV4Y2VwdCBkb24ndCBuYXJyb3cgbWFyZ2lucy4KICUKLVxtYWtlZGlzcGVudntmb3JtYXR9eyUKK1xtYWtlZGlzcGVudmRlZntmb3JtYXR9eyUKICAgXGxldFxub25hcnJvd2luZyA9IHQlCiAgIFxub25maWxsc3RhcnQKICAgXGdvYmJsZQpAQCAtNTA4MCwxOCArNjQ4Miw0NCBAQAogXGVudmRlZlxmbHVzaHJpZ2h0eyUKICAgXGxldFxub25hcnJvd2luZyA9IHQlCiAgIFxub25maWxsc3RhcnQKLSAgXGFkdmFuY2VcbGVmdHNraXAgYnkgMHB0IHBsdXMgMWZpbGwKKyAgXGFkdmFuY2VcbGVmdHNraXAgYnkgMHB0IHBsdXMgMWZpbGxccmVsYXgKICAgXGdvYmJsZQogfQogXGxldFxFZmx1c2hyaWdodCA9IFxhZnRlcmVudmJyZWFrCiAKIAorJSBAcmFnZ2VkcmlnaHQgZG9lcyBtb3JlLW9yLWxlc3Mgbm9ybWFsIGxpbmUgYnJlYWtpbmcgYnV0IG5vIHJpZ2h0CislIGp1c3RpZmljYXRpb24uICBGcm9tIHBsYWluLnRleC4KK1xlbnZkZWZccmFnZ2VkcmlnaHR7JQorICBccmlnaHRza2lwMHB0IHBsdXMyZW0gXHNwYWNlc2tpcC4zMzMzZW0gXHhzcGFjZXNraXAuNWVtXHJlbGF4Cit9CitcbGV0XEVyYWdnZWRyaWdodFxwYXIKKworXGVudmRlZlxyYWdnZWRsZWZ0eyUKKyAgXHBhcmluZGVudD0wcHQgXGxlZnRza2lwMHB0IHBsdXMyZW0KKyAgXHNwYWNlc2tpcC4zMzMzZW0gXHhzcGFjZXNraXAuNWVtIFxwYXJmaWxsc2tpcD0wcHQKKyAgXGhiYWRuZXNzPTEwMDAwICUgTGFzdCBsaW5lIHdpbGwgdXN1YWxseSBiZSB1bmRlcmZ1bGwsIHNvIHR1cm4gb2ZmCisgICAgICAgICAgICAgICAgICAlIGJhZG5lc3MgcmVwb3J0aW5nLgorfQorXGxldFxFcmFnZ2VkbGVmdFxwYXIKKworXGVudmRlZlxyYWdnZWRjZW50ZXJ7JQorICBccGFyaW5kZW50PTBwdCBccmlnaHRza2lwMHB0IHBsdXMxZW0gXGxlZnRza2lwMHB0IHBsdXMxZW0KKyAgXHNwYWNlc2tpcC4zMzMzZW0gXHhzcGFjZXNraXAuNWVtIFxwYXJmaWxsc2tpcD0wcHQKKyAgXGhiYWRuZXNzPTEwMDAwICUgTGFzdCBsaW5lIHdpbGwgdXN1YWxseSBiZSB1bmRlcmZ1bGwsIHNvIHR1cm4gb2ZmCisgICAgICAgICAgICAgICAgICAlIGJhZG5lc3MgcmVwb3J0aW5nLgorfQorXGxldFxFcmFnZ2VkY2VudGVyXHBhcgorCisKICUgQHF1b3RhdGlvbiBkb2VzIG5vcm1hbCBsaW5lYnJlYWtpbmcgKGhlbmNlIHdlIGNhbid0IHVzZSBcbm9uZmlsbHN0YXJ0KQogJSBhbmQgbmFycm93cyB0aGUgbWFyZ2lucy4gIFdlIGtlZXAgXHBhcnNraXAgbm9uemVybyBpbiBnZW5lcmFsLCBzaW5jZQogJSB3ZSdyZSBkb2luZyBub3JtYWwgZmlsbGluZy4gIFNvLCB3aGVuIHVzaW5nIFxhYm92ZWVudmJyZWFrIGFuZAogJSBcYWZ0ZXJlbnZicmVhaywgdGVtcG9yYXJpbHkgbWFrZSBccGFyc2tpcCAwLgogJQotXGVudmRlZlxxdW90YXRpb257JQorXG1ha2VkaXNwZW52ZGVme3F1b3RhdGlvbn17XHF1b3RhdGlvbnN0YXJ0fQorJQorXGRlZlxxdW90YXRpb25zdGFydHslCiAgIHtccGFyc2tpcD0wcHQgXGFib3ZlZW52YnJlYWt9JSBiZWNhdXNlIFxhYm92ZWVudmJyZWFrIGluc2VydHMgXHBhcnNraXAKICAgXHBhcmluZGVudD0wcHQKICAgJQpAQCAtNTExMSwxMiArNjUzOSwxMyBAQAogJQogXGRlZlxFcXVvdGF0aW9ueyUKICAgXHBhcgotICBcaWZ4XHF1b3RhdGlvbmF1dGhvclx1bmRlZmluZWRcZWxzZQorICBcaWZ4XHF1b3RhdGlvbmF1dGhvclx0aGlzaXN1bmRlZmluZWRcZWxzZQogICAgICUgaW5kZW50IGEgYml0LgogICAgIFxsZWZ0bGluZXtca2VybiAyXGxlZnRza2lwIFxzbCAtLS1ccXVvdGF0aW9uYXV0aG9yfSUKICAgXGZpCiAgIHtccGFyc2tpcD0wcHQgXGFmdGVyZW52YnJlYWt9JQogfQorXGRlZlxFc21hbGxxdW90YXRpb257XEVxdW90YXRpb259CiAKICUgSWYgd2UncmUgZ2l2ZW4gYW4gYXJndW1lbnQsIHR5cGVzZXQgaXQgaW4gYm9sZCB3aXRoIGEgY29sb24gYWZ0ZXIuCiBcZGVmXHF1b3RhdGlvbmxhYmVsIzF7JQpAQCAtNTE0MSwxOCArNjU3MCwxNiBAQAogICBcZG9cIFxkb1xcXGRvXHtcZG9cfVxkb1wkXGRvXCYlCiAgIFxkb1wjXGRvXF5cZG9cXl5LXGRvXF9cZG9cXl5BXGRvXCVcZG9cfiUKICAgXGRvXDxcZG9cPlxkb1x8XGRvXEBcZG8rXGRvXCIlCisgICUgRG9uJ3QgZG8gdGhlIHF1b3RlcyAtLSBpZiB3ZSBkbywgQHNldCB0eGljb2RlcXVvdGV1bmRpcmVjdGVkIGFuZAorICAlIEBzZXQgdHhpY29kZXF1b3RlYmFja3RpY2sgd2lsbCBub3QgaGF2ZSBlZmZlY3Qgb24gQHZlcmIgYW5kCisgICUgQHZlcmJhdGltLCBhbmQgP2AgYW5kICFgIGxpZ2F0dXJlcyB3b24ndCBnZXQgZGlzYWJsZWQuCisgICVcZG9cYFxkb1wnJQogfQogJQogJSBbS251dGhdIHAuIDM4MAogXGRlZlx1bmNhdGNvZGVzcGVjaWFsc3slCiAgIFxkZWZcZG8jIzF7XGNhdGNvZGVgIyMxPVxvdGhlcn1cZG9zcGVjaWFsc30KICUKLSUgW0tudXRoXSBwcC4gMzgwLDM4MSwzOTEKLSUgRGlzYWJsZSBTcGFuaXNoIGxpZ2F0dXJlcyA/YCBhbmQgIWAgb2YgXHR0IGZvbnQKLVxiZWdpbmdyb3VwCi0gIFxjYXRjb2RlYFxgPVxhY3RpdmVcZ2RlZmB7XHJlbGF4XGxxfQotXGVuZGdyb3VwCi0lCiAlIFNldHVwIGZvciB0aGUgQHZlcmIgY29tbWFuZC4KICUKICUgRWlnaHQgc3BhY2VzIGZvciBhIHRhYgpAQCAtNTE2NCw3ICs2NTkxLDcgQEAKIFxkZWZcc2V0dXB2ZXJieyUKICAgXHR0ICAlIGVhc2llc3QgKGFuZCBjb252ZW50aW9uYWxseSB1c2VkKSBmb250IGZvciB2ZXJiYXRpbQogICBcZGVmXHBhcntcbGVhdmV2bW9kZVxlbmRncmFmfSUKLSAgXGNhdGNvZGVgXGA9XGFjdGl2ZQorICBcc2V0dXBtYXJrdXBzdHlsZXt2ZXJifSUKICAgXHRhYmVpZ2h0c3BhY2VzCiAgICUgUmVzcGVjdCBsaW5lIGJyZWFrcywKICAgJSBwcmludCBzcGVjaWFsIHN5bWJvbHMgYXMgdGhlbXNlbHZlcywgYW5kCkBAIC01MTc1LDM1ICs2NjAyLDQ2IEBACiAKICUgU2V0dXAgZm9yIHRoZSBAdmVyYmF0aW0gZW52aXJvbm1lbnQKICUKLSUgUmVhbCB0YWIgZXhwYW5zaW9uCislIFJlYWwgdGFiIGV4cGFuc2lvbi4KIFxuZXdkaW1lblx0YWJ3IFxzZXRib3gwPVxoYm94e1x0dFxzcGFjZX0gXHRhYnc9OFx3ZDAgJSB0YWIgYW1vdW50CiAlCi1cZGVmXHN0YXJ0dGFiYm94e1xzZXRib3gwPVxoYm94XGJncm91cH0KKyUgV2UgdHlwZXNldCBlYWNoIGxpbmUgb2YgdGhlIHZlcmJhdGltIGluIGFuIFxoYm94LCBzbyB3ZSBjYW4gaGFuZGxlCislIHRhYnMuICBUaGUgXGdsb2JhbCBpcyBpbiBjYXNlIHRoZSB2ZXJiYXRpbSBsaW5lIHN0YXJ0cyB3aXRoIGFuIGFjY2VudCwKKyUgb3Igc29tZSBvdGhlciBjb21tYW5kIHRoYXQgc3RhcnRzIHdpdGggYSBiZWdpbi1ncm91cC4gIE90aGVyd2lzZSwgdGhlCislIGVudGlyZSBcdmVyYmJveCB3b3VsZCBkaXNhcHBlYXIgYXQgdGhlIGNvcnJlc3BvbmRpbmcgZW5kLWdyb3VwLCBiZWZvcmUKKyUgaXQgaXMgdHlwZXNldC4gIE1lYW53aGlsZSwgd2UgY2FuJ3QgaGF2ZSBuZXN0ZWQgdmVyYmF0aW0gY29tbWFuZHMKKyUgKGNhbiB3ZT8pLCBzbyB0aGUgXGdsb2JhbCB3b24ndCBiZSBvdmVyd3JpdGluZyBpdHNlbGYuCitcbmV3Ym94XHZlcmJib3gKK1xkZWZcc3RhcnR0YWJib3h7XGdsb2JhbFxzZXRib3hcdmVyYmJveD1caGJveFxiZ3JvdXB9CislCiBcYmVnaW5ncm91cAogICBcY2F0Y29kZWBcXl5JPVxhY3RpdmUKICAgXGdkZWZcdGFiZXhwYW5keyUKICAgICBcY2F0Y29kZWBcXl5JPVxhY3RpdmUKICAgICBcZGVmXl5Je1xsZWF2ZXZtb2RlXGVncm91cAotICAgICAgXGRpbWVuMD1cd2QwICUgdGhlIHdpZHRoIHNvIGZhciwgb3Igc2luY2UgdGhlIHByZXZpb3VzIHRhYgotICAgICAgXGRpdmlkZVxkaW1lbjAgYnlcdGFidwotICAgICAgXG11bHRpcGx5XGRpbWVuMCBieVx0YWJ3ICUgY29tcHV0ZSBwcmV2aW91cyBtdWx0aXBsZSBvZiBcdGFidwotICAgICAgXGFkdmFuY2VcZGltZW4wIGJ5XHRhYncgICUgYWR2YW5jZSB0byBuZXh0IG11bHRpcGxlIG9mIFx0YWJ3Ci0gICAgICBcd2QwPVxkaW1lbjAgXGJveDAgXHN0YXJ0dGFiYm94CisgICAgICBcZGltZW5cdmVyYmJveD1cd2RcdmVyYmJveCAlIHRoZSB3aWR0aCBzbyBmYXIsIG9yIHNpbmNlIHRoZSBwcmV2aW91cyB0YWIKKyAgICAgIFxkaXZpZGVcZGltZW5cdmVyYmJveCBieVx0YWJ3CisgICAgICBcbXVsdGlwbHlcZGltZW5cdmVyYmJveCBieVx0YWJ3ICUgY29tcHV0ZSBwcmV2aW91cyBtdWx0aXBsZSBvZiBcdGFidworICAgICAgXGFkdmFuY2VcZGltZW5cdmVyYmJveCBieVx0YWJ3ICAlIGFkdmFuY2UgdG8gbmV4dCBtdWx0aXBsZSBvZiBcdGFidworICAgICAgXHdkXHZlcmJib3g9XGRpbWVuXHZlcmJib3ggXGJveFx2ZXJiYm94IFxzdGFydHRhYmJveAogICAgIH0lCiAgIH0KIFxlbmRncm91cAorCislIHN0YXJ0IHRoZSB2ZXJiYXRpbSBlbnZpcm9ubWVudC4KIFxkZWZcc2V0dXB2ZXJiYXRpbXslCiAgIFxsZXRcbm9uYXJyb3dpbmcgPSB0JQogICBcbm9uZmlsbHN0YXJ0Ci0gICUgRWFzaWVzdCAoYW5kIGNvbnZlbnRpb25hbGx5IHVzZWQpIGZvbnQgZm9yIHZlcmJhdGltCi0gIFx0dAotICBcZGVmXHBhcntcbGVhdmV2bW9kZVxlZ3JvdXBcYm94MFxlbmRncmFmfSUKLSAgXGNhdGNvZGVgXGA9XGFjdGl2ZQorICBcdHQgJSBlYXNpZXN0IChhbmQgY29udmVudGlvbmFsbHkgdXNlZCkgZm9udCBmb3IgdmVyYmF0aW0KKyAgJSBUaGUgXGxlYXZldm1vZGUgaGVyZSBpcyBmb3IgYmxhbmsgbGluZXMuICBPdGhlcndpc2UsIHdlIHdvdWxkCisgICUgbmV2ZXIgXHN0YXJ0dGFib3ggYW5kIHRoZSBcZWdyb3VwIHdvdWxkIGVuZCB2ZXJiYXRpbSBtb2RlLgorICBcZGVmXHBhcntcbGVhdmV2bW9kZVxlZ3JvdXBcYm94XHZlcmJib3hcZW5kZ3JhZn0lCiAgIFx0YWJleHBhbmQKKyAgXHNldHVwbWFya3Vwc3R5bGV7dmVyYmF0aW19JQogICAlIFJlc3BlY3QgbGluZSBicmVha3MsCiAgICUgcHJpbnQgc3BlY2lhbCBzeW1ib2xzIGFzIHRoZW1zZWx2ZXMsIGFuZAotICAlIG1ha2UgZWFjaCBzcGFjZSBjb3VudAotICAlIG11c3QgZG8gaW4gdGhpcyBvcmRlcjoKKyAgJSBtYWtlIGVhY2ggc3BhY2UgY291bnQuCisgICUgTXVzdCBkbyBpbiB0aGlzIG9yZGVyOgogICBcb2JleWxpbmVzIFx1bmNhdGNvZGVzcGVjaWFscyBcc2Vwc3BhY2VzCiAgIFxldmVyeXBhcntcc3RhcnR0YWJib3h9JQogfQpAQCAtNTI1OSw2ICs2Njk3LDggQEAKICAgeyUKICAgICBcbWFrZXZhbHVlZXhwYW5kYWJsZQogICAgIFxzZXR1cHZlcmJhdGltCisgICAgXGluZGV4bm9mb250cyAgICAgICAlIEFsbG93IGBAQCcgYW5kIG90aGVyIHdlaXJkIHRoaW5ncyBpbiBmaWxlIG5hbWVzLgorICAgIFx3bG9ne3RleGluZm8udGV4OiBkb2luZyBAdmVyYmF0aW1pbmNsdWRlIG9mICMxXl5KfSUKICAgICBcaW5wdXQgIzEKICAgICBcYWZ0ZXJlbnZicmVhawogICB9JQpAQCAtNTI4NCwyNyArNjcyNCwzNSBAQAogICBcZW5kZ3JvdXAKIH0KIAorCiBcbWVzc2FnZXtkZWZ1bnMsfQogJSBAZGVmdW4gZXRjLgogCiBcbmV3c2tpcFxkZWZib2R5aW5kZW50IFxkZWZib2R5aW5kZW50PS40aW4KIFxuZXdza2lwXGRlZmFyZ3NpbmRlbnQgXGRlZmFyZ3NpbmRlbnQ9NTBwdAogXG5ld3NraXBcZGVmbGFzdGFyZ21hcmdpbiBcZGVmbGFzdGFyZ21hcmdpbj0xOHB0CitcbmV3Y291bnRcZGVmdW5wZW5hbHR5CiAKICUgU3RhcnQgdGhlIHByb2Nlc3Npbmcgb2YgQGRlZmZuOgogXGRlZlxzdGFydGRlZnVueyUKICAgXGlmbnVtXGxhc3RwZW5hbHR5PDEwMDAwCiAgICAgXG1lZGJyZWFrCisgICAgXGRlZnVucGVuYWx0eT0xMDAwMyAlIFdpbGwga2VlcCB0aGlzIEBkZWZmbiB0b2dldGhlciB3aXRoIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgJSBmb2xsb3dpbmcgQGRlZiBjb21tYW5kLCBzZWUgYmVsb3cuCiAgIFxlbHNlCiAgICAgJSBJZiB0aGVyZSBhcmUgdHdvIEBkZWYgY29tbWFuZHMgaW4gYSByb3csIHdlJ2xsIGhhdmUgYSBcbm9icmVhaywKICAgICAlIHdoaWNoIGlzIHRoZXJlIHRvIGtlZXAgdGhlIGZ1bmN0aW9uIGRlc2NyaXB0aW9uIHRvZ2V0aGVyIHdpdGggaXRzCiAgICAgJSBoZWFkZXIuICBCdXQgaWYgdGhlcmUncyBub3RoaW5nIGJ1dCBoZWFkZXJzLCB3ZSBuZWVkIHRvIGFsbG93IGEKICAgICAlIGJyZWFrIHNvbWV3aGVyZS4gIENoZWNrIHNwZWNpZmljYWxseSBmb3IgcGVuYWx0eSAxMDAwMiwgaW5zZXJ0ZWQKLSAgICAlIGJ5IFxkZWZhcmdzY29tbW9uZW5kaW5nLCBpbnN0ZWFkIG9mIDEwMDAwLCBzaW5jZSB0aGUgc2VjdGlvbmluZworICAgICUgYnkgXHByaW50ZGVmdW5saW5lLCBpbnN0ZWFkIG9mIDEwMDAwLCBzaW5jZSB0aGUgc2VjdGlvbmluZwogICAgICUgY29tbWFuZHMgYWxzbyBpbnNlcnQgYSBub2JyZWFrIHBlbmFsdHksIGFuZCB3ZSBkb24ndCB3YW50IHRvIGFsbG93CiAgICAgJSBhIGJyZWFrIGJldHdlZW4gYSBzZWN0aW9uIGhlYWRpbmcgYW5kIGEgZGVmdW4uCi0gICAgJSAKLSAgICBcaWZudW1cbGFzdHBlbmFsdHk9MTAwMDIgXHBlbmFsdHkyMDAwIFxmaQorICAgICUKKyAgICAlIEFzIGEgZnVydGhlciByZWZpbmVtZW50LCB3ZSBhdm9pZCAiY2x1YiIgaGVhZGVycyBieSBzaWduYWxsaW5nCisgICAgJSB3aXRoIHBlbmFsdHkgb2YgMTAwMDMgYWZ0ZXIgdGhlIHZlcnkgZmlyc3QgQGRlZmZuIGluIHRoZQorICAgICUgc2VxdWVuY2UgKHNlZSBhYm92ZSksIGFuZCBwZW5hbHR5IG9mIDEwMDAyIGFmdGVyIGFueSBmb2xsb3dpbmcKKyAgICAlIEBkZWYgY29tbWFuZC4KKyAgICBcaWZudW1cbGFzdHBlbmFsdHk9MTAwMDIgXHBlbmFsdHkyMDAwIFxlbHNlIFxkZWZ1bnBlbmFsdHk9MTAwMDIgXGZpCiAgICAgJQogICAgICUgU2ltaWxhcmx5LCBhZnRlciBhIHNlY3Rpb24gaGVhZGluZywgZG8gbm90IGFsbG93IGEgYnJlYWsuCiAgICAgJSBCdXQgZG8gaW5zZXJ0IHRoZSBnbHVlLgpAQCAtNTMyMiw3ICs2NzcwLDcgQEAKICAgJQogICAlIEFzIGFib3ZlLCBhbGxvdyBsaW5lIGJyZWFrIGlmIHdlIGhhdmUgbXVsdGlwbGUgeCBoZWFkZXJzIGluIGEgcm93LgogICAlIEl0J3Mgbm90IGEgZ3JlYXQgcGxhY2UsIHRob3VnaC4KLSAgXGlmbnVtXGxhc3RwZW5hbHR5PTEwMDAyIFxwZW5hbHR5MzAwMCBcZmkKKyAgXGlmbnVtXGxhc3RwZW5hbHR5PTEwMDAyIFxwZW5hbHR5MzAwMCBcZWxzZSBcZGVmdW5wZW5hbHR5PTEwMDAyIFxmaQogICAlCiAgICUgQW5kIG5vdywgaXQncyB0aW1lIHRvIHJldXNlIHRoZSBib2R5IG9mIHRoZSBvcmlnaW5hbCBkZWZ1bjoKICAgXGV4cGFuZGFmdGVyXGdvYmJsZWRlZnVuIzElCkBAIC01MzM3LDEwICs2Nzg1LDEwIEBACiAgICAgIzEjMiBcZW5kaGVhZGVyCiAgICAgJSBjb21tb24gZW5kaW5nOgogICAgIFxpbnRlcmxpbmVwZW5hbHR5ID0gMTAwMDAKLSAgICBcYWR2YW5jZVxyaWdodHNraXAgYnkgMHB0IHBsdXMgMWZpbAorICAgIFxhZHZhbmNlXHJpZ2h0c2tpcCBieSAwcHQgcGx1cyAxZmlsXHJlbGF4CiAgICAgXGVuZGdyYWYKICAgICBcbm9icmVha1x2c2tpcCAtXHBhcnNraXAKLSAgICBccGVuYWx0eSAxMDAwMiAgJSBzaWduYWwgdG8gXHN0YXJ0ZGVmdW4gYW5kIFxkb2RlZnVueAorICAgIFxwZW5hbHR5XGRlZnVucGVuYWx0eSAgJSBzaWduYWwgdG8gXHN0YXJ0ZGVmdW4gYW5kIFxkb2RlZnVueAogICAgICUgU29tZSBvZiB0aGUgQGRlZnVuLXR5cGUgdGFncyBkbyBub3QgZW5hYmxlIG1hZ2ljIHBhcmVudGhlc2VzLAogICAgICUgcmVuZGVyaW5nIHRoZSBmb2xsb3dpbmcgY2hlY2sgcmVkdW5kYW50LiAgQnV0IHdlIGRvbid0IG9wdGltaXplLgogICAgIFxjaGVja3BhcmVuY291bnRzCkBAIC01MzUwLDcgKzY3OTgsNyBAQAogXGRlZlxFZGVmdW57XGVuZGdyYWZcbWVkYnJlYWt9CiAKICUgXG1ha2VkZWZ1bntkZWZmbn0gY3JlYXRlcyBcZGVmZm4sIFxkZWZmbnggYW5kIFxFZGVmZm47Ci0lIHRoZSBvbmx5IHRoaW5nIHJlbWFpbm5pZyBpcyB0byBkZWZpbmUgXGRlZmZuaGVhZGVyLgorJSB0aGUgb25seSB0aGluZyByZW1haW5pbmcgaXMgdG8gZGVmaW5lIFxkZWZmbmhlYWRlci4KICUKIFxkZWZcbWFrZWRlZnVuIzF7JQogICBcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSBFIzFcZW5kY3NuYW1lID0gXEVkZWZ1bgpAQCAtNTM2NywxMyArNjgxNSwzNiBAQAogXGRlZlxkb21ha2VkZWZ1biMxIzIjM3slCiAgIFxlbnZkZWYjMXslCiAgICAgXHN0YXJ0ZGVmdW4KKyAgICBcZG9pbmd0eXBlZm5mYWxzZSAgICAlIGRpc3Rpbmd1aXNoIHR5cGVkIGZ1bmN0aW9ucyBmcm9tIGFsbCBlbHNlCiAgICAgXHBhcnNlYXJndXNpbmdcYWN0aXZlcGFyZW5ze1xwcmludGRlZnVubGluZSMzfSUKICAgfSUKICAgXGRlZiMye1xkb2RlZnVueCMxfSUKICAgXGRlZiMzJQogfQogCi0lJSUgVW50eXBlZCBmdW5jdGlvbnM6CitcbmV3aWZcaWZkb2luZ3R5cGVmbiAgICAgICAlIGRvaW5nIHR5cGVkIGZ1bmN0aW9uPworXG5ld2lmXGlmcmV0dHlwZW93bmxpbmUgICAgJSB0eXBlc2V0IHJldHVybiB0eXBlIG9uIGl0cyBvd24gbGluZT8KKworJSBAZGVmdHlwZWZubmV3bGluZSBvbnxvZmYgc2F5cyB3aGV0aGVyIHRoZSByZXR1cm4gdHlwZSBvZiB0eXBlZCBmdW5jdGlvbnMKKyUgYXJlIHByaW50ZWQgb24gdGhlaXIgb3duIGxpbmUuICBUaGlzIGFmZmVjdHMgQGRlZnR5cGVmbiwgQGRlZnR5cGVmdW4sCislIEBkZWZ0eXBlb3AsIGFuZCBAZGVmdHlwZW1ldGhvZC4KKyUgCitccGFyc2VhcmdkZWZcZGVmdHlwZWZubmV3bGluZXslCisgIFxkZWZcdGVtcHsjMX0lCisgIFxpZnhcdGVtcFxvbndvcmQKKyAgICBcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSBTRVR0eGlkZWZ0eXBlZm5ubFxlbmRjc25hbWUKKyAgICAgID0gXGVtcHR5CisgIFxlbHNlXGlmeFx0ZW1wXG9mZndvcmQKKyAgICBcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSBTRVR0eGlkZWZ0eXBlZm5ubFxlbmRjc25hbWUKKyAgICAgID0gXHJlbGF4CisgIFxlbHNlCisgICAgXGVycmhlbHAgPSBcRU1zaW1wbGUKKyAgICBcZXJybWVzc2FnZXtVbmtub3duIEB0eGlkZWZ0eXBlZm5ubCB2YWx1ZSBgXHRlbXAnLAorICAgICAgICAgICAgICAgIG11c3QgYmUgb258b2ZmfSUKKyAgXGZpXGZpCit9CisKKyUgVW50eXBlZCBmdW5jdGlvbnM6CiAKICUgQGRlZmZuIGNhdGVnb3J5IG5hbWUgYXJncwogXG1ha2VkZWZ1bntkZWZmbn17XGRlZmZuZ2VuZXJhbHt9fQpAQCAtNTM5Miw3ICs2ODYzLDcgQEAKICAgXGRlZm5hbWV7IzJ9e317IzN9XG1hZ2ljYW1wXGRlZnVuYXJnc3sjNFx1bnNraXB9JQogfQogCi0lJSUgVHlwZWQgZnVuY3Rpb25zOgorJSBUeXBlZCBmdW5jdGlvbnM6CiAKICUgQGRlZnR5cGVmbiBjYXRlZ29yeSB0eXBlIG5hbWUgYXJncwogXG1ha2VkZWZ1bntkZWZ0eXBlZm59e1xkZWZ0eXBlZm5nZW5lcmFse319CkBAIC01NDA3LDEwICs2ODc4LDExIEBACiAlCiBcZGVmXGRlZnR5cGVmbmdlbmVyYWwjMSMyICMzICM0ICM1XGVuZGhlYWRlcnslCiAgIFxkb3N1YmluZHtmbn17XGNvZGV7IzR9fXsjMX0lCisgIFxkb2luZ3R5cGVmbnRydWUKICAgXGRlZm5hbWV7IzJ9eyMzfXsjNH1cZGVmdW5hcmdzeyM1XHVuc2tpcH0lCiB9CiAKLSUlJSBUeXBlZCB2YXJpYWJsZXM6CislIFR5cGVkIHZhcmlhYmxlczoKIAogJSBAZGVmdHlwZXZyIGNhdGVnb3J5IHR5cGUgdmFyIGFyZ3MKIFxtYWtlZGVmdW57ZGVmdHlwZXZyfXtcZGVmdHlwZWN2Z2VuZXJhbHt9fQpAQCAtNTQyOCw3ICs2OTAwLDcgQEAKICAgXGRlZm5hbWV7IzJ9eyMzfXsjNH1cZGVmdW5hcmdzeyM1XHVuc2tpcH0lCiB9CiAKLSUlJSBVbnR5cGVkIHZhcmlhYmxlczoKKyUgVW50eXBlZCB2YXJpYWJsZXM6CiAKICUgQGRlZnZyIGNhdGVnb3J5IHZhciBhcmdzCiBcbWFrZWRlZnVue2RlZnZyfSMxIHtcZGVmdHlwZXZyaGVhZGVyeyMxfSB7fSB9CkBAIC01NDM5LDcgKzY5MTEsOCBAQAogJSBcZGVmY3ZvZiB7Y2F0ZWdvcnkgb2Z9Y2xhc3MgdmFyIGFyZ3MKIFxkZWZcZGVmY3ZvZiMxIzIge1xkZWZ0eXBlY3ZvZnsjMX0jMiB7fSB9CiAKLSUlJSBUeXBlOgorJSBUeXBlczoKKwogJSBAZGVmdHAgY2F0ZWdvcnkgbmFtZSBhcmdzCiBcbWFrZWRlZnVue2RlZnRwfSMxICMyICMzXGVuZGhlYWRlcnslCiAgIFxkb2luZHt0cH17XGNvZGV7IzJ9fSUKQEAgLTU0NjcsMjUgKzY5NDAsNDkgQEAKICUgV2UgYXJlIGZvbGxvd2VkIGJ5IChidXQgbm90IHBhc3NlZCkgdGhlIGFyZ3VtZW50cywgaWYgYW55LgogJQogXGRlZlxkZWZuYW1lIzEjMiMzeyUKKyAgXHBhcgogICAlIEdldCB0aGUgdmFsdWVzIG9mIFxsZWZ0c2tpcCBhbmQgXHJpZ2h0c2tpcCBhcyB0aGV5IHdlcmUgb3V0c2lkZSB0aGUgQGRlZi4uLgogICBcYWR2YW5jZVxsZWZ0c2tpcCBieSAtXGRlZmJvZHlpbmRlbnQKICAgJQotICAlIEhvdyB3ZSdsbCBmb3JtYXQgdGhlIHR5cGUgbmFtZS4gIFB1dHRpbmcgaXQgaW4gYnJhY2tldHMgaGVscHMKKyAgJSBEZXRlcm1pbmUgaWYgd2UgYXJlIHR5cGVzZXR0aW5nIHRoZSByZXR1cm4gdHlwZSBvZiBhIHR5cGVkIGZ1bmN0aW9uCisgICUgb24gYSBsaW5lIGJ5IGl0c2VsZi4KKyAgXHJldHR5cGVvd25saW5lZmFsc2UKKyAgXGlmZG9pbmd0eXBlZm4gICUgZG9pbmcgYSB0eXBlZCBmdW5jdGlvbiBzcGVjaWZpY2FsbHk/CisgICAgJSB0aGVuIGNoZWNrIHVzZXIgb3B0aW9uIGZvciBwdXR0aW5nIHJldHVybiB0eXBlIG9uIGl0cyBvd24gbGluZToKKyAgICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBTRVR0eGlkZWZ0eXBlZm5ubFxlbmRjc25hbWVccmVsYXggXGVsc2UKKyAgICAgIFxyZXR0eXBlb3dubGluZXRydWUKKyAgICBcZmkKKyAgXGZpCisgICUKKyAgJSBIb3cgd2UnbGwgZm9ybWF0IHRoZSBjYXRlZ29yeSBuYW1lLiAgUHV0dGluZyBpdCBpbiBicmFja2V0cyBoZWxwcwogICAlIGRpc3Rpbmd1aXNoIGl0IGZyb20gdGhlIGJvZHkgdGV4dCB0aGF0IG1heSBlbmQgdXAgb24gdGhlIG5leHQgbGluZQogICAlIGp1c3QgYmVsb3cgaXQuCiAgIFxkZWZcdGVtcHsjMX0lCiAgIFxzZXRib3gwPVxoYm94e1xrZXJuXGRlZmxhc3RhcmdtYXJnaW4gXGlmeFx0ZW1wXGVtcHR5XGVsc2UgW1xybVx0ZW1wXVxmaX0KICAgJQotICAlIEZpZ3VyZSBvdXQgbGluZSBzaXplcyBmb3IgdGhlIHBhcmFncmFwaCBzaGFwZS4KKyAgJSBGaWd1cmUgb3V0IGxpbmUgc2l6ZXMgZm9yIHRoZSBwYXJhZ3JhcGggc2hhcGUuICBXZSdsbCBhbHdheXMgaGF2ZSBhdAorICAlIGxlYXN0IHR3by4KKyAgXHRlbXBudW0gPSAyCisgICUKICAgJSBUaGUgZmlyc3QgbGluZSBuZWVkcyBzcGFjZSBmb3IgXGJveDA7IGJ1dCBpZiBccmlnaHRza2lwIGlzIG5vbnplcm8sCiAgICUgd2UgbmVlZCBvbmx5IHNwYWNlIGZvciB0aGUgcGFydCBvZiBcYm94MCB3aGljaCBleGNlZWRzIGl0OgogICBcZGltZW4wPVxoc2l6ZSAgXGFkdmFuY2VcZGltZW4wIGJ5IC1cd2QwICBcYWR2YW5jZVxkaW1lbjAgYnkgXHJpZ2h0c2tpcAorICAlCisgICUgSWYgZG9pbmcgYSByZXR1cm4gdHlwZSBvbiBpdHMgb3duIGxpbmUsIHdlJ2xsIGhhdmUgYW5vdGhlciBsaW5lLgorICBcaWZyZXR0eXBlb3dubGluZQorICAgIFxhZHZhbmNlXHRlbXBudW0gYnkgMQorICAgIFxkZWZcbWF5YmVzaGFwZWxpbmV7MGluIFxoc2l6ZX0lCisgIFxlbHNlCisgICAgXGRlZlxtYXliZXNoYXBlbGluZXt9JQorICBcZmkKKyAgJQogICAlIFRoZSBjb250aW51YXRpb25zOgogICBcZGltZW4yPVxoc2l6ZSAgXGFkdmFuY2VcZGltZW4yIGJ5IC1cZGVmYXJnc2luZGVudAotICAlIChwbGFpbi50ZXggc2F5cyB0aGF0IFxkaW1lbjEgc2hvdWxkIGJlIHVzZWQgb25seSBhcyBnbG9iYWwuKQotICBccGFyc2hhcGUgMiAwaW4gXGRpbWVuMCBcZGVmYXJnc2luZGVudCBcZGltZW4yCiAgICUKLSAgJSBQdXQgdGhlIHR5cGUgbmFtZSB0byB0aGUgcmlnaHQgbWFyZ2luLgorICAlIFRoZSBmaW5hbCBwYXJhZ3JhcGggc2hhcGU6CisgIFxwYXJzaGFwZSBcdGVtcG51bSAgMGluIFxkaW1lbjAgIFxtYXliZXNoYXBlbGluZSAgXGRlZmFyZ3NpbmRlbnQgXGRpbWVuMgorICAlCisgICUgUHV0IHRoZSBjYXRlZ29yeSBuYW1lIGF0IHRoZSByaWdodCBtYXJnaW4uCiAgIFxub2luZGVudAogICBcaGJveCB0byAwcHR7JQogICAgIFxoZmlsXGJveDAgXGtlcm4tXGhzaXplCkBAIC01NTA3LDggKzcwMDQsMTYgQEAKICAgICAlIC4gdGhpcyBzdGlsbCBkb2VzIG5vdCBmaXggdGhlID9gIGFuZCAhYCBsaWdhdHVyZXMsIGJ1dCBzbyBmYXIgbm8KICAgICAlICAgb25lIGhhcyBtYWRlIGlkZW50aWZpZXJzIHVzaW5nIHRoZW0gOikuCiAgICAgXGRmIFx0dAotICAgIFxkZWZcdGVtcHsjMn0lIHJldHVybiB2YWx1ZSB0eXBlCi0gICAgXGlmeFx0ZW1wXGVtcHR5XGVsc2UgXHRjbG9zZXtcdGVtcH0gXGZpCisgICAgXGRlZlx0ZW1weyMyfSUgdGV4dCBvZiB0aGUgcmV0dXJuIHR5cGUKKyAgICBcaWZ4XHRlbXBcZW1wdHlcZWxzZQorICAgICAgXHRjbG9zZXtcdGVtcH0lIHR5cGVzZXQgdGhlIHJldHVybiB0eXBlCisgICAgICBcaWZyZXR0eXBlb3dubGluZQorICAgICAgICAlIHB1dCByZXR1cm4gdHlwZSBvbiBpdHMgb3duIGxpbmU7IHByb2hpYml0IGxpbmUgYnJlYWsgZm9sbG93aW5nOgorICAgICAgICBcaGZpbFx2YWRqdXN0e1xub2JyZWFrfVxicmVhayAgCisgICAgICBcZWxzZQorICAgICAgICBcc3BhY2UgICUgdHlwZSBvbiBzYW1lIGxpbmUsIHNvIGp1c3QgZm9sbG93ZWQgYnkgYSBzcGFjZQorICAgICAgXGZpCisgICAgXGZpICAgICAgICAgICAlIG5vIHJldHVybiB0eXBlCiAgICAgIzMlIG91dHB1dCBmdW5jdGlvbiBuYW1lCiAgIH0lCiAgIHtccm1cZW5za2lwfSUgaHNraXAgMC41IGVtIG9mIFx0ZW5ybQpAQCAtNTUyOSw3ICs3MDM0LDcgQEAKICAgJQogICAlIE9uIHRoZSBvdGhlciBoYW5kLCBpZiBhbiBhcmd1bWVudCBoYXMgdHdvIGRhc2hlcyAoZm9yIGluc3RhbmNlKSwgd2UKICAgJSB3YW50IGEgd2F5IHRvIGdldCB0dHNsLiAgTGV0J3MgdHJ5IEB2YXIgZm9yIHRoYXQuCi0gIFxsZXRcdmFyPVx0dHNsYW50ZWQKKyAgXGRlZlx2YXIjIzF7e1xzZXR1cG1hcmt1cHN0eWxle3Zhcn1cdHRzbGFudGVkeyMjMX19fSUKICAgIzElCiAgIFxzbFxoeXBoZW5jaGFyXGZvbnQ9NDUKIH0KQEAgLTU2MDksMTIgKzcxMTQsMTQgQEAKICAgXGlmbnVtXHBhcmVuY291bnQ9MCBcZWxzZSBcYmFkcGFyZW5jb3VudCBcZmkKICAgXGlmbnVtXGJyYWNrY291bnQ9MCBcZWxzZSBcYmFkYnJhY2tjb3VudCBcZmkKIH0KKyUgdGhlc2Ugc2hvdWxkIG5vdCB1c2UgXGVycm1lc3NhZ2U7IHRoZSBnbGliYyBtYW51YWwsIGF0IGxlYXN0LCBhY3R1YWxseQorJSBoYXMgc3VjaCBjb25zdHJ1Y3RzICh3aGVuIGRvY3VtZW50aW5nIGZ1bmN0aW9uIHBvaW50ZXJzKS4KIFxkZWZcYmFkcGFyZW5jb3VudHslCi0gIFxlcnJtZXNzYWdle1VuYmFsYW5jZWQgcGFyZW50aGVzZXMgaW4gQGRlZn0lCisgIFxtZXNzYWdle1dhcm5pbmc6IHVuYmFsYW5jZWQgcGFyZW50aGVzZXMgaW4gQGRlZi4uLn0lCiAgIFxnbG9iYWxccGFyZW5jb3VudD0wCiB9CiBcZGVmXGJhZGJyYWNrY291bnR7JQotICBcZXJybWVzc2FnZXtVbmJhbGFuY2VkIHNxdWFyZSBicmFjZXMgaW4gQGRlZn0lCisgIFxtZXNzYWdle1dhcm5pbmc6IHVuYmFsYW5jZWQgc3F1YXJlIGJyYWNrZXRzIGluIEBkZWYuLi59JQogICBcZ2xvYmFsXGJyYWNrY291bnQ9MAogfQogCkBAIC01NjI0LDcgKzcxMzEsNyBAQAogCiAlIFRvIGRvIHRoaXMgcmlnaHQgd2UgbmVlZCBhIGZlYXR1cmUgb2YgZS1UZVgsIFxzY2FudG9rZW5zLAogJSB3aGljaCB3ZSBhcnJhbmdlIHRvIGVtdWxhdGUgd2l0aCBhIHRlbXBvcmFyeSBmaWxlIGluIG9yZGluYXJ5IFRlWC4KLVxpZnhcZVRlWHZlcnNpb25cdW5kZWZpbmVkCitcaWZ4XGVUZVh2ZXJzaW9uXHRoaXNpc3VuZGVmaW5lZAogICBcbmV3d3JpdGVcbWFjc2NyaWJibGUKICAgXGRlZlxzY2FudG9rZW5zIzF7JQogICAgIFx0b2tzMD17IzF9JQpAQCAtNTYzNSwyNiArNzE0MiwzMCBAQAogICB9CiBcZmkKIAotXGRlZlxzY2FubWFjcm8jMXslCi0gIFxiZWdpbmdyb3VwCi0gICAgXG5ld2xpbmVjaGFyYFxeXk0KLSAgICBcbGV0XHhlYXRzcGFjZXNcZWF0c3BhY2VzCi0gICAgJSBVbmRvIGNhdGNvZGUgY2hhbmdlcyBvZiBcc3RhcnRjb250ZW50cyBhbmQgXGRvcHJpbnRpbmRleAotICAgICUgV2hlbiBjYWxsZWQgZnJvbSBAaW5zZXJ0Y29weWluZyBvciAoc2hvcnQpY2FwdGlvbiwgd2UgbmVlZCBhY3RpdmUKLSAgICAlIGJhY2tzbGFzaCB0byBnZXQgaXQgcHJpbnRlZCBjb3JyZWN0bHkuICBQcmV2aW91c2x5LCB3ZSBoYWQKLSAgICAlIFxjYXRjb2RlYFxcPVxvdGhlciBpbnN0ZWFkLiAgV2UnbGwgc2VlIHdoZXRoZXIgYSBwcm9ibGVtIGFwcGVhcnMKLSAgICAlIHdpdGggbWFjcm8gZXhwYW5zaW9uLgkJCQktLWthc2FsLCAxOWF1ZzA0Ci0gICAgXGNhdGNvZGVgXEA9MCBcY2F0Y29kZWBcXD1cYWN0aXZlIFxlc2NhcGVjaGFyPWBcQAotICAgICUgLi4uIGFuZCBcZXhhbXBsZQotICAgIFxzcGFjZWlzc3BhY2UKLSAgICAlCi0gICAgJSBBcHBlbmQgXGVuZGlucHV0IHRvIG1ha2Ugc3VyZSB0aGF0IFRlWCBkb2VzIG5vdCBzZWUgdGhlIGVuZGluZyBuZXdsaW5lLgotICAgICUKLSAgICAlIEkndmUgdmVyaWZpZWQgdGhhdCBpdCBpcyBuZWNlc3NhcnkgYm90aCBmb3IgZS1UZVggYW5kIGZvciBvcmRpbmFyeSBUZVgKLSAgICAlCQkJCQkJCS0ta2FzYWwsIDI5bm92MDMKLSAgICBcc2NhbnRva2Vuc3sjMVxlbmRpbnB1dH0lCi0gIFxlbmRncm91cAotfQorXGRlZlxzY2FubWFjcm8jMXtcYmVnaW5ncm91cAorICBcbmV3bGluZWNoYXJgXF5eTQorICBcbGV0XHhlYXRzcGFjZXNcZWF0c3BhY2VzCisgICUKKyAgJSBVbmRvIGNhdGNvZGUgY2hhbmdlcyBvZiBcc3RhcnRjb250ZW50cyBhbmQgXGRvcHJpbnRpbmRleAorICAlIFdoZW4gY2FsbGVkIGZyb20gQGluc2VydGNvcHlpbmcgb3IgKHNob3J0KWNhcHRpb24sIHdlIG5lZWQgYWN0aXZlCisgICUgYmFja3NsYXNoIHRvIGdldCBpdCBwcmludGVkIGNvcnJlY3RseS4gIFByZXZpb3VzbHksIHdlIGhhZAorICAlIFxjYXRjb2RlYFxcPVxvdGhlciBpbnN0ZWFkLiAgV2UnbGwgc2VlIHdoZXRoZXIgYSBwcm9ibGVtIGFwcGVhcnMKKyAgJSB3aXRoIG1hY3JvIGV4cGFuc2lvbi4JCQkJLS1rYXNhbCwgMTlhdWcwNAorICBcY2F0Y29kZWBcQD0wIFxjYXRjb2RlYFxcPVxhY3RpdmUgXGVzY2FwZWNoYXI9YFxACisgICUKKyAgJSAuLi4gYW5kIGZvciBcZXhhbXBsZToKKyAgXHNwYWNlaXNzcGFjZQorICAlCisgICUgVGhlIFxlbXB0eSBoZXJlIGNhdXNlcyBhIGZvbGxvd2luZyBjYXRjb2RlIDUgbmV3bGluZSB0byBiZSBlYXRlbiBhcworICAlIHBhcnQgb2YgcmVhZGluZyB3aGl0ZXNwYWNlIGFmdGVyIGEgY29udHJvbCBzZXF1ZW5jZS4gIEl0IGRvZXMgbm90CisgICUgZWF0IGEgY2F0Y29kZSAxMyBuZXdsaW5lLiAgVGhlcmUncyBubyBnb29kIHdheSB0byBoYW5kbGUgdGhlIHR3bworICAlIGNhc2VzICh1bnRyaWVkOiBtYXliZSBlLVRlWCdzIFxldmVyeWVvZiBjb3VsZCBoZWxwLCB0aG91Z2ggcGxhaW4gVGVYCisgICUgd291bGQgdGhlbiBoYXZlIGRpZmZlcmVudCBiZWhhdmlvcikuICBTZWUgdGhlIE1hY3JvIERldGFpbHMgbm9kZSBpbgorICAlIHRoZSBtYW51YWwgZm9yIHRoZSB3b3JrYXJvdW5kIHdlIHJlY29tbWVuZCBmb3IgbWFjcm9zIGFuZAorICAlIGxpbmUtb3JpZW50ZWQgY29tbWFuZHMuCisgICUgCisgIFxzY2FudG9rZW5zeyMxXGVtcHR5fSUKK1xlbmRncm91cH0KIAogXGRlZlxzY2FuZXhwIzF7JQogICBcZWRlZlx0ZW1we1xub2V4cGFuZFxzY2FubWFjcm97IzF9fSUKQEAgLTU2ODIsNyArNzE5Myw3IEBACiAlIFRoaXMgZG9lcyBcbGV0ICMxID0gIzIsIHdpdGggXGNzbmFtZXM7IHRoYXQgaXMsCiAlICAgXGxldCBcY3NuYW1lIzFcZW5kY3NuYW1lID0gXGNzbmFtZSMyXGVuZGNzbmFtZQogJSAoZXhjZXB0IG9mIGNvdXJzZSB3ZSBoYXZlIHRvIHBsYXkgZXhwYW5zaW9uIGdhbWVzKS4KLSUgCislCiBcZGVmXGNzbGV0IzEjMnslCiAgIFxleHBhbmRhZnRlclxsZXQKICAgXGNzbmFtZSMxXGV4cGFuZGFmdGVyXGVuZGNzbmFtZQpAQCAtNTcwOCwxMyArNzIxOSwxOCBAQAogCiAlIE1hY3JvIGJvZGllcyBhcmUgYWJzb3JiZWQgYXMgYW4gYXJndW1lbnQgaW4gYSBjb250ZXh0IHdoZXJlCiAlIGFsbCBjaGFyYWN0ZXJzIGFyZSBjYXRjb2RlIDEwLCAxMSBvciAxMiwgZXhjZXB0IFwgd2hpY2ggaXMgYWN0aXZlCi0lIChhcyBpbiBub3JtYWwgdGV4aW5mbykuIEl0IGlzIG5lY2Vzc2FyeSB0byBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YgXC4KLQorJSAoYXMgaW4gbm9ybWFsIHRleGluZm8pLiBJdCBpcyBuZWNlc3NhcnkgdG8gY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mIFwKKyUgdG8gcmVjb2duaXplIG1hY3JvIGFyZ3VtZW50czsgdGhpcyBpcyB0aGUgam9iIG9mIFxtYm9keWJhY2tzbGFzaC4KKyUKKyUgTm9uLUFTQ0lJIGVuY29kaW5ncyBtYWtlIDgtYml0IGNoYXJhY3RlcnMgYWN0aXZlLCBzbyB1bi1hY3RpdmF0ZQorJSB0aGVtIHRvIGF2b2lkIHRoZWlyIGV4cGFuc2lvbi4gIE11c3QgZG8gdGhpcyBub24tZ2xvYmFsbHksIHRvCislIGNvbmZpbmUgdGhlIGNoYW5nZSB0byB0aGUgY3VycmVudCBncm91cC4KKyUKICUgSXQncyBuZWNlc3NhcnkgdG8gaGF2ZSBoYXJkIENScyB3aGVuIHRoZSBtYWNybyBpcyBleGVjdXRlZC4gVGhpcyBpcwotJSBkb25lIGJ5ICBtYWtpbmcgXl5NIChcZW5kbGluZWNoYXIpIGNhdGNvZGUgMTIgd2hlbiByZWFkaW5nIHRoZSBtYWNybworJSBkb25lIGJ5IG1ha2luZyBeXk0gKFxlbmRsaW5lY2hhcikgY2F0Y29kZSAxMiB3aGVuIHJlYWRpbmcgdGhlIG1hY3JvCiAlIGJvZHksIGFuZCB0aGVuIG1ha2luZyBpdCB0aGUgXG5ld2xpbmVjaGFyIGluIFxzY2FubWFjcm8uCi0KLVxkZWZcc2NhbmN0eHR7JQorJQorXGRlZlxzY2FuY3R4dHslIHVzZWQgYXMgc3Vicm91dGluZQogICBcY2F0Y29kZWBcIj1cb3RoZXIKICAgXGNhdGNvZGVgXCs9XG90aGVyCiAgIFxjYXRjb2RlYFw8PVxvdGhlcgpAQCAtNTcyNCwxNSArNzI0MCwxNiBAQAogICBcY2F0Y29kZWBcXz1cb3RoZXIKICAgXGNhdGNvZGVgXHw9XG90aGVyCiAgIFxjYXRjb2RlYFx+PVxvdGhlcgorICBcaWZ4XGRlY2xhcmVkZW5jb2RpbmdcYXNjaWkgXGVsc2UgXHNldG5vbmFzY2lpY2hhcnNjYXRjb2Rlbm9uZ2xvYmFsXG90aGVyIFxmaQogfQogCi1cZGVmXHNjYW5hcmdjdHh0eyUKK1xkZWZcc2NhbmFyZ2N0eHR7JSB1c2VkIGZvciBjb3B5aW5nIGFuZCBjYXB0aW9ucywgbm90IG1hY3Jvcy4KICAgXHNjYW5jdHh0CiAgIFxjYXRjb2RlYFxcPVxvdGhlcgogICBcY2F0Y29kZWBcXl5NPVxvdGhlcgogfQogCi1cZGVmXG1hY3JvYm9keWN0eHR7JQorXGRlZlxtYWNyb2JvZHljdHh0eyUgdXNlZCBmb3IgQG1hY3JvIGRlZmluaXRpb25zCiAgIFxzY2FuY3R4dAogICBcY2F0Y29kZWBcez1cb3RoZXIKICAgXGNhdGNvZGVgXH09XG90aGVyCkBAIC01NzQwLDMyICs3MjU3LDU2IEBACiAgIFx1c2VtYm9keWJhY2tzbGFzaAogfQogCi1cZGVmXG1hY3JvYXJnY3R4dHslCitcZGVmXG1hY3JvYXJnY3R4dHslIHVzZWQgd2hlbiBzY2FubmluZyBpbnZvY2F0aW9ucwogICBcc2NhbmN0eHQKLSAgXGNhdGNvZGVgXFw9XG90aGVyCisgIFxjYXRjb2RlYFxcPTAKIH0KKyUgd2h5IGNhdGNvZGUgMCBmb3IgXCBpbiB0aGUgYWJvdmU/ICBUbyByZWNvZ25pemUgXFwgXHsgXH0gYXMgImVzY2FwZXMiCislIGZvciB0aGUgc2luZ2xlIGNoYXJhY3RlcnMgXCB7IH0uICBUaHVzLCB3ZSBlbmQgdXAgd2l0aCB0aGUgImNvbW1hbmRzIgorJSB0aGF0IHdvdWxkIGJlIHdyaXR0ZW4gQFwgQHsgQH0gaW4gYSBUZXhpbmZvIGRvY3VtZW50LgorJSAKKyUgV2UgYWxyZWFkeSBoYXZlIEB7IGFuZCBAfS4gIEZvciBAXCwgd2UgZGVmaW5lIGl0IGhlcmUsIGFuZCBvbmx5IGZvcgorJSB0aGlzIHB1cnBvc2UsIHRvIHByb2R1Y2UgYSB0eXBld3JpdGVyIGJhY2tzbGFzaCAoc28sIHRoZSBAXCB0aGF0IHdlCislIGRlZmluZSBmb3IgQG1hdGggY2FuJ3QgYmUgdXNlZCB3aXRoIEBtYWNybyBjYWxscyk6CislCitcZGVmXFx7XG5vcm1hbGJhY2tzbGFzaH0lCislIAorJSBXZSB3b3VsZCBsaWtlIHRvIGRvIHRoaXMgZm9yIFwsIHRvbywgc2luY2UgdGhhdCBpcyB3aGF0IG1ha2VpbmZvIGRvZXMuCislIEJ1dCBpdCBpcyBub3QgcG9zc2libGUsIGJlY2F1c2UgVGV4aW5mbyBhbHJlYWR5IGhhcyBhIGNvbW1hbmQgQCwgZm9yIGEKKyUgY2VkaWxsYSBhY2NlbnQuICBEb2N1bWVudHMgbXVzdCB1c2UgQGNvbW1he30gaW5zdGVhZC4KKyUKKyUgXGFueXRoaW5nZWxzZSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYW4gZXJyb3Igb2Ygc29tZSBraW5kLgorCiAKICUgXG1ib2R5YmFja3NsYXNoIGlzIHRoZSBkZWZpbml0aW9uIG9mIFwgaW4gQG1hY3JvIGJvZGllcy4KICUgSXQgbWFwcyBcZm9vXCA9PiBcY3NuYW1lIG1hY2FyZy5mb29cZW5kY3NuYW1lID0+ICNOCiAlIHdoZXJlIE4gaXMgdGhlIG1hY3JvIHBhcmFtZXRlciBudW1iZXIuCiAlIFdlIGRlZmluZSBcY3NuYW1lIG1hY2FyZy5cZW5kY3NuYW1lIHRvIGJlIFxyZWFsYmFja3NsYXNoLCBzbwogJSBcXCBpbiBtYWNybyByZXBsYWNlbWVudCB0ZXh0IGdldHMgeW91IGEgYmFja3NsYXNoLgotCislCiB7XGNhdGNvZGVgQD0wIEBjYXRjb2RlYEBcPUBhY3RpdmUKICBAZ2RlZkB1c2VtYm9keWJhY2tzbGFzaHtAbGV0XD1AbWJvZHliYWNrc2xhc2h9CiAgQGdkZWZAbWJvZHliYWNrc2xhc2gjMVx7QGNzbmFtZSBtYWNhcmcuIzFAZW5kY3NuYW1lfQogfQogXGV4cGFuZGFmdGVyXGRlZlxjc25hbWUgbWFjYXJnLlxlbmRjc25hbWV7XHJlYWxiYWNrc2xhc2h9CiAKK1xkZWZcbWFyZ2JhY2tzbGFzaCMxe1xjaGFyYFwjMSB9CisKIFxkZWZcbWFjcm97XHJlY3Vyc2l2ZWZhbHNlXHBhcnNlYXJnXG1hY3JveHh4fQogXGRlZlxybWFjcm97XHJlY3Vyc2l2ZXRydWVccGFyc2VhcmdcbWFjcm94eHh9CiAKIFxkZWZcbWFjcm94eHgjMXslCi0gIFxnZXRhcmdzeyMxfSUgICAgICAgICAgIG5vdyBcbWFjbmFtZSBpcyB0aGUgbWFjbmFtZSBhbmQgXGFyZ2wgdGhlIGFyZ2xpc3QKKyAgXGdldGFyZ3N7IzF9JSBub3cgXG1hY25hbWUgaXMgdGhlIG1hY25hbWUgYW5kIFxhcmdsIHRoZSBhcmdsaXN0CiAgIFxpZnhcYXJnbFxlbXB0eSAgICAgICAlIG5vIGFyZ3VtZW50cwotICAgICBccGFyYW1ubz0wJQorICAgICBccGFyYW1ubz0wXHJlbGF4CiAgIFxlbHNlCiAgICAgIFxleHBhbmRhZnRlclxwYXJzZW1hcmdkZWYgXGFyZ2w7JQorICAgICBcaWZccGFyYW1ubz4yNTZccmVsYXgKKyAgICAgICBcaWZ4XGVUZVh2ZXJzaW9uXHRoaXNpc3VuZGVmaW5lZAorICAgICAgICAgXGVycmhlbHAgPSBcRU1zaW1wbGUKKyAgICAgICAgIFxlcnJtZXNzYWdle1lvdSBuZWVkIGVUZVggdG8gY29tcGlsZSBhIGZpbGUgd2l0aCBtYWNyb3Mgd2l0aCBtb3JlIHRoYW4gMjU2IGFyZ3VtZW50c30KKyAgICAgICBcZmkKKyAgICAgXGZpCiAgIFxmaQogICBcaWYxXGNzbmFtZSBpc21hY3JvLlx0aGVcbWFjbmFtZVxlbmRjc25hbWUKICAgICAgXG1lc3NhZ2V7V2FybmluZzogcmVkZWZpbmluZyBcdGhlXG1hY25hbWV9JQpAQCAtNTgxMiw0NiArNzM1MywyNjkgQEAKICUgYW4gb3BlbmluZyBicmFjZSwgYW5kIHRoYXQgb3BlbmluZyBicmFjZSBpcyBub3QgY29uc3VtZWQuCiBcZGVmXGdldGFyZ3MjMXtcZ2V0YXJnc3h4eCMxe319CiBcZGVmXGdldGFyZ3N4eHgjMSN7XGdldG1hY25hbWUgIzEgXHJlbGF4XGdldG1hY2FyZ3N9Ci1cZGVmXGdldG1hY25hbWUgIzEgIzJccmVsYXh7XG1hY25hbWU9eyMxfX0KK1xkZWZcZ2V0bWFjbmFtZSMxICMyXHJlbGF4e1xtYWNuYW1lPXsjMX19CiBcZGVmXGdldG1hY2FyZ3MjMXtcZGVmXGFyZ2x7IzF9fQogCi0lIFBhcnNlIHRoZSBvcHRpb25hbCB7cGFyYW1zfSBsaXN0LiAgU2V0IHVwIFxwYXJhbW5vIGFuZCBccGFyYW1saXN0Ci0lIHNvIFxkZWZtYWNybyBrbm93cyB3aGF0IHRvIGRvLiAgRGVmaW5lIFxtYWNhcmcuYmxhaCBmb3IgZWFjaCBibGFoCi0lIGluIHRoZSBwYXJhbXMgbGlzdCwgdG8gYmUgIyNOIHdoZXJlIE4gaXMgdGhlIHBvc2l0aW9uIGluIHRoYXQgbGlzdC4KLSUgVGhhdCBnZXRzIHVzZWQgYnkgXG1ib2R5YmFja3NsYXNoIChhYm92ZSkuCislIEZvciBtYWNybyBwcm9jZXNzaW5nIG1ha2UgQCBhIGxldHRlciBzbyB0aGF0IHdlIGNhbiBtYWtlIFRleGluZm8gcHJpdmF0ZSBtYWNybyBuYW1lcy4KK1xlZGVmXHRleGlhdGNhdGNvZGV7XHRoZVxjYXRjb2RlYFxAfQorXGNhdGNvZGUgYEA9MTFccmVsYXgKIAorJSBQYXJzZSB0aGUgb3B0aW9uYWwge3BhcmFtc30gbGlzdC4gIFNldCB1cCBccGFyYW1ubyBhbmQgXHBhcmFtbGlzdAorJSBzbyBcZGVmbWFjcm8ga25vd3Mgd2hhdCB0byBkby4gIERlZmluZSBcbWFjYXJnLkJMQUggZm9yIGVhY2ggQkxBSAorJSBpbiB0aGUgcGFyYW1zIGxpc3QgdG8gc29tZSBob29rIHdoZXJlIHRoZSBhcmd1bWVudCBzaSB0byBiZSBleHBhbmRlZC4gIElmCislIHRoZXJlIGFyZSBsZXNzIHRoYW4gMTAgYXJndW1lbnRzIHRoYXQgaG9vayBpcyB0byBiZSByZXBsYWNlZCBieSAjI04gd2hlcmUgTgorJSBpcyB0aGUgcG9zaXRpb24gaW4gdGhhdCBsaXN0LCB0aGF0IGlzIHRvIHNheSB0aGUgbWFjcm8gYXJndW1lbnRzIGFyZSB0byBiZQorJSBkZWZpbmVkIGBhIGxhIFRlWCBpbiB0aGUgbWFjcm8gYm9keS4gIAorJQorJSBUaGF0IGdldHMgdXNlZCBieSBcbWJvZHliYWNrc2xhc2ggKGFib3ZlKS4KKyUKICUgV2UgbmVlZCB0byBnZXQgYG1hY3JvIHBhcmFtZXRlciBjaGFyICMnIGludG8gc2V2ZXJhbCBkZWZpbml0aW9ucy4KLSUgVGhlIHRlY2huaXF1ZSB1c2VkIGlzIHN0b2xlbiBmcm9tIExhVGVYOiAgbGV0IFxoYXNoIGJlIHNvbWV0aGluZworJSBUaGUgdGVjaG5pcXVlIHVzZWQgaXMgc3RvbGVuIGZyb20gTGFUZVg6IGxldCBcaGFzaCBiZSBzb21ldGhpbmcKICUgdW5leHBhbmRhYmxlLCBpbnNlcnQgdGhhdCB3aGVyZXZlciB5b3UgbmVlZCBhICMsIGFuZCB0aGVuIHJlZGVmaW5lCiAlIGl0IHRvICMganVzdCBiZWZvcmUgdXNpbmcgdGhlIHRva2VuIGxpc3QgcHJvZHVjZWQuCiAlCiAlIFRoZSBzYW1lIHRlY2huaXF1ZSBpcyB1c2VkIHRvIHByb3RlY3QgXGVhdHNwYWNlcyB0aWxsIGp1c3QgYmVmb3JlCiAlIHRoZSBtYWNybyBpcyB1c2VkLgotCi1cZGVmXHBhcnNlbWFyZ2RlZiMxO3tccGFyYW1ubz0wXGRlZlxwYXJhbWxpc3R7fSUKLSAgICAgICAgXGxldFxoYXNoXHJlbGF4XGxldFx4ZWF0c3BhY2VzXHJlbGF4XHBhcnNlbWFyZ2RlZnh4eCMxLDssfQorJQorJSBJZiB0aGVyZSBhcmUgMTAgb3IgbW9yZSBhcmd1bWVudHMsIGEgZGlmZmVyZW50IHRlY2huaXF1ZSBpcyB1c2VkLCB3aGVyZSB0aGUKKyUgaG9vayByZW1haW5zIGluIHRoZSBib2R5LCBhbmQgd2hlbiBtYWNybyBpcyB0byBiZSBleHBhbmRlZCB0aGUgYm9keSBpcworJSBwcm9jZXNzZWQgYWdhaW4gdG8gcmVwbGFjZSB0aGUgYXJndW1lbnRzLgorJQorJSBJbiB0aGF0IGNhc2UsIHRoZSBob29rIGlzIFx0aGVcdG9rcyBOLTEsIGFuZCB3ZSBzaW1wbHkgc2V0IFx0b2tzIE4tMSB0byB0aGUKKyUgYXJndW1lbnQgTiB2YWx1ZSBhbmQgdGhlbiBcZWRlZiAgdGhlIGJvZHkgKG5vdGhpbmcgZWxzZSB3aWxsIGV4cGFuZCBiZWNhdXNlIG9mCislIHRoZSBjYXRjb2RlIHJlZ2ltZSB1bmRlcndoaWNoIHRoZSBib2R5IHdhcyBpbnB1dCkuCislCislIElmIHlvdSBjb21waWxlIHdpdGggVGVYIChub3QgZVRlWCksIGFuZCB5b3UgaGF2ZSBtYWNyb3Mgd2l0aCAxMCBvciBtb3JlCislIGFyZ3VtZW50cywgeW91IG5lZWQgdGhhdCBubyBtYWNybyBoYXMgbW9yZSB0aGFuIDI1NiBhcmd1bWVudHMsIG90aGVyd2lzZSBhbgorJSBlcnJvciBpcyBwcm9kdWNlZC4KK1xkZWZccGFyc2VtYXJnZGVmIzE7eyUKKyAgXHBhcmFtbm89MFxkZWZccGFyYW1saXN0e30lCisgIFxsZXRcaGFzaFxyZWxheAorICBcbGV0XHhlYXRzcGFjZXNccmVsYXgKKyAgXHBhcnNlbWFyZ2RlZnh4eCMxLDssJQorICAlIEluIGNhc2UgdGhhdCB0aGVyZSBhcmUgMTAgb3IgbW9yZSBhcmd1bWVudHMgd2UgcGFyc2UgYWdhaW4gdGhlIGFyZ3VtZW50cworICAlIGxpc3QgdG8gc2V0IG5ldyBkZWZpbml0aW9ucyBmb3IgdGhlIFxtYWNhcmcuQkxBSCBtYWNyb3MgY29ycmVzcG9uZGluZyB0bworICAlIGVhY2ggQkxBSCBhcmd1bWVudC4gSXQgd2FzIGFueWhvdyBuZWVkZWQgdG8gcGFyc2UgYWxyZWFkeSBvbmNlIHRoaXMgbGlzdAorICAlIGluIG9yZGVyIHRvIGNvdW50IHRoZSBhcmd1bWVudHMsIGFuZCBhcyBtYWNyb3Mgd2l0aCBhdCBtb3N0IDkgYXJndW1lbnRzCisgICUgYXJlIGJ5IGZhciBtb3JlIGZyZXF1ZW50IHRoYW4gbWFjcm8gd2l0aCAxMCBvciBtb3JlIGFyZ3VtZW50cywgZGVmaW5pbmcKKyAgJSB0d2ljZSB0aGUgXG1hY2FyZy5CTEFIIG1hY3JvcyBkb2VzIG5vdCBjb3N0IHRvbyBtdWNoIHByb2Nlc3NpbmcgcG93ZXIuCisgIFxpZm51bVxwYXJhbW5vPDEwXHJlbGF4XGVsc2UKKyAgICBccGFyYW1ubzBccmVsYXgKKyAgICBccGFyc2VtbWFueWFyZ2RlZkBAIzEsOywlIDEwIG9yIG1vcmUgYXJndW1lbnRzCisgIFxmaQorfQogXGRlZlxwYXJzZW1hcmdkZWZ4eHgjMSx7JQogICBcaWYjMTtcbGV0XG5leHQ9XHJlbGF4CiAgIFxlbHNlIFxsZXRcbmV4dD1ccGFyc2VtYXJnZGVmeHh4Ci0gICAgXGFkdmFuY2VccGFyYW1ubyBieSAxJQorICAgIFxhZHZhbmNlXHBhcmFtbm8gYnkgMQogICAgIFxleHBhbmRhZnRlclxlZGVmXGNzbmFtZSBtYWNhcmcuXGVhdHNwYWNlc3sjMX1cZW5kY3NuYW1lCiAgICAgICAgIHtceGVhdHNwYWNlc3tcaGFzaFx0aGVccGFyYW1ub319JQogICAgIFxlZGVmXHBhcmFtbGlzdHtccGFyYW1saXN0XGhhc2hcdGhlXHBhcmFtbm8sfSUKICAgXGZpXG5leHR9CiAKK1xkZWZccGFyc2VtbWFueWFyZ2RlZkBAIzEseyUKKyAgXGlmIzE7XGxldFxuZXh0PVxyZWxheAorICBcZWxzZSAKKyAgICBcbGV0XG5leHQ9XHBhcnNlbW1hbnlhcmdkZWZAQAorICAgIFxlZGVmXHRlbXBie1xlYXRzcGFjZXN7IzF9fSUKKyAgICBcZXhwYW5kYWZ0ZXJcZGVmXGV4cGFuZGFmdGVyXHRlbXBhCisgICAgICAgXGV4cGFuZGFmdGVye1xjc25hbWUgbWFjYXJnLlx0ZW1wYlxlbmRjc25hbWV9JQorICAgICUgTm90ZSB0aGF0IHdlIG5lZWQgc29tZSBleHRyYSBcbm9leHBhbmRcbm9leHBhbmQsIHRoaXMgaXMgYmVjYXVzZSB3ZQorICAgICUgZG9uJ3Qgd2FudCBcdGhlICB0byBiZSBleHBhbmRlZCBpbiB0aGUgXHBhcnNlcm1hY2JvZHkgIGFzIGl0IHVzZXMgYW4KKyAgICAlIFx4ZGVmIC4KKyAgICBcZXhwYW5kYWZ0ZXJcZWRlZlx0ZW1wYQorICAgICAge1xub2V4cGFuZFxub2V4cGFuZFxub2V4cGFuZFx0aGVcdG9rc1x0aGVccGFyYW1ub30lCisgICAgXGFkdmFuY2VccGFyYW1ubyBieSAxXHJlbGF4CisgIFxmaVxuZXh0fQorCiAlIFRoZXNlIHR3byBjb21tYW5kcyByZWFkIHJlY3Vyc2l2ZSBhbmQgbm9ucmVjdXJzaXZlIG1hY3JvIGJvZGllcy4KICUgKFRoZXkncmUgZGlmZmVyZW50IHNpbmNlIHJlYyBhbmQgbm9ucmVjIG1hY3JvcyBlbmQgZGlmZmVyZW50bHkuKQorJQogCitcY2F0Y29kZSBgXEBcdGV4aWF0Y2F0Y29kZQogXGxvbmdcZGVmXHBhcnNlbWFjYm9keSMxQGVuZCBtYWNybyUKIHtceGRlZlx0ZW1we1xlYXRjcnsjMX19XGVuZGdyb3VwXGRlZm1hY3JvfSUKIFxsb25nXGRlZlxwYXJzZXJtYWNib2R5IzFAZW5kIHJtYWNybyUKIHtceGRlZlx0ZW1we1xlYXRjcnsjMX19XGVuZGdyb3VwXGRlZm1hY3JvfSUKK1xjYXRjb2RlIGBcQD0xMVxyZWxheAogCi0lIFRoaXMgZGVmaW5lcyB0aGUgbWFjcm8gaXRzZWxmLiBUaGVyZSBhcmUgc2l4IGNhc2VzOiByZWN1cnNpdmUgYW5kCi0lIG5vbnJlY3Vyc2l2ZSBtYWNyb3Mgb2YgemVybywgb25lLCBhbmQgbWFueSBhcmd1bWVudHMuCitcbGV0XGVuZGFyZ3NAXHJlbGF4CitcbGV0XG5pbEBccmVsYXgKK1xkZWZcbmlsbUB7XG5pbEB9JQorXGxvbmdcZGVmXG5pbGxtQHtcbmlsQH0lCisKKyUgVGhpcyBtYWNybyBpcyBleHBhbmRlZCBkdXJpbmcgdGhlIFRleGluZm8gbWFjcm8gZXhwYW5zaW9uLCBub3QgZHVyaW5nIGl0cworJSBkZWZpbml0aW9uLiAgSXQgZ2V0cyBhbGwgdGhlIGFyZ3VtZW50cyB2YWx1ZXMgYW5kIGFzc2lnbnMgdGhlbSB0byBtYWNyb3MKKyUgbWFjYXJnLkFSR05BTUUKKyUKKyUgIzEgaXMgdGhlIG1hY3JvIG5hbWUKKyUgIzIgaXMgdGhlIGxpc3Qgb2YgYXJndW1lbnQgbmFtZXMKKyUgIzMgaXMgdGhlIGxpc3Qgb2YgYXJndW1lbnQgdmFsdWVzCitcZGVmXGdldGFyZ3ZhbHNAIzEjMiMzeyUKKyAgXGRlZlxtYWNhcmdkZWZsaXN0QHt9JQorICBcZGVmXHNhdmVwYXJhbWxpc3RAeyMyfSUgTmVlZCB0byBrZWVwIGEgY29weSBmb3IgcGFyYW1ldGVyIGV4cGFuc2lvbi4KKyAgXGRlZlxwYXJhbWxpc3R7IzIsXG5pbEB9JQorICBcZGVmXG1hY3JvbmFtZXsjMX0lCisgIFxiZWdpbmdyb3VwCisgIFxtYWNyb2FyZ2N0eHQKKyAgXGRlZlxhcmd2YWx1ZWxpc3R7IzMsXG5pbEB9JQorICBcZGVmXEB0ZW1wYXsjM30lCisgIFxpZnhcQHRlbXBhXGVtcHR5CisgICAgXHNldGVtcHR5YXJndmFsdWVzQAorICBcZWxzZQorICAgIFxnZXRhcmd2YWxzQEAKKyAgXGZpCit9CisKKyUgCitcZGVmXGdldGFyZ3ZhbHNAQHslCisgIFxpZnhccGFyYW1saXN0XG5pbG1ACisgICAgICAlIFNvbWUgc2FuaXR5IGNoZWNrIG5lZWRlZCBoZXJlIHRoYXQgXGFyZ3ZhbHVlbGlzdCBpcyBhbHNvIGVtcHR5LgorICAgICAgXGlmeFxhcmd2YWx1ZWxpc3RcbmlsbG1ACisgICAgICBcZWxzZQorICAgICAgICBcZXJyaGVscCA9IFxFTXNpbXBsZQorICAgICAgICBcZXJybWVzc2FnZXtUb28gbWFueSBhcmd1bWVudHMgaW4gbWFjcm8gYFxtYWNyb25hbWUnIX0lCisgICAgICBcZmkKKyAgICAgIFxsZXRcbmV4dFxtYWNhcmdleHBhbmRpbmJvZHlACisgIFxlbHNlCisgICAgXGlmeFxhcmd2YWx1ZWxpc3RcbmlsbG1ACisgICAgICAgJSBObyBtb3JlIGFyZ3VtZW50cyB2YWx1ZXMgcGFzc2VkIHRvIG1hY3JvLiAgU2V0IHJlbWFpbmluZyBuYW1lZC1hcmcKKyAgICAgICAlIG1hY3JvcyB0byBlbXB0eS4KKyAgICAgICBcbGV0XG5leHRcc2V0ZW1wdHlhcmd2YWx1ZXNACisgICAgXGVsc2UKKyAgICAgICUgcG9wIGN1cnJlbnQgYXJnIG5hbWUgaW50byBcQHRlbXBiCisgICAgICBcZGVmXEB0ZW1wYSMjMXtccG9wQHtcQHRlbXBifXtccGFyYW1saXN0fSMjMVxlbmRhcmdzQH0lCisgICAgICBcZXhwYW5kYWZ0ZXJcQHRlbXBhXGV4cGFuZGFmdGVye1xwYXJhbWxpc3R9JQorICAgICAgICUgcG9wIGN1cnJlbnQgYXJndW1lbnQgdmFsdWUgaW50byBcQHRlbXBjCisgICAgICBcZGVmXEB0ZW1wYSMjMXtcbG9uZ3BvcEB7XEB0ZW1wY317XGFyZ3ZhbHVlbGlzdH0jIzFcZW5kYXJnc0B9JQorICAgICAgXGV4cGFuZGFmdGVyXEB0ZW1wYVxleHBhbmRhZnRlcntcYXJndmFsdWVsaXN0fSUKKyAgICAgICAlIEhlcmUgXEB0ZW1wYiBpcyB0aGUgY3VycmVudCBhcmcgbmFtZSBhbmQgXEB0ZW1wYyBpcyB0aGUgY3VycmVudCBhcmcgdmFsdWUuCisgICAgICAgJSBGaXJzdCBwbGFjZSB0aGUgbmV3IGFyZ3VtZW50IG1hY3JvIGRlZmluaXRpb24gaW50byBcQHRlbXBkCisgICAgICAgXGV4cGFuZGFmdGVyXG1hY25hbWVcZXhwYW5kYWZ0ZXJ7XEB0ZW1wY30lCisgICAgICAgXGV4cGFuZGFmdGVyXGxldFxjc25hbWUgbWFjYXJnLlxAdGVtcGJcZW5kY3NuYW1lXHJlbGF4CisgICAgICAgXGV4cGFuZGFmdGVyXGRlZlxleHBhbmRhZnRlclxAdGVtcGVcZXhwYW5kYWZ0ZXJ7JQorICAgICAgICAgXGNzbmFtZSBtYWNhcmcuXEB0ZW1wYlxlbmRjc25hbWV9JQorICAgICAgIFxlZGVmXEB0ZW1wZHtcbG9uZ1xkZWZcQHRlbXBle1x0aGVcbWFjbmFtZX19JQorICAgICAgIFxwdXNoQFxAdGVtcGRcbWFjYXJnZGVmbGlzdEAKKyAgICAgICBcbGV0XG5leHRcZ2V0YXJndmFsc0BACisgICAgXGZpCisgIFxmaQorICBcbmV4dAorfQorCitcZGVmXHB1c2hAIzEjMnslCisgIFxleHBhbmRhZnRlclxleHBhbmRhZnRlclxleHBhbmRhZnRlclxkZWYKKyAgXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyIzIlCisgIFxleHBhbmRhZnRlclxleHBhbmRhZnRlclxleHBhbmRhZnRlcnslCisgIFxleHBhbmRhZnRlciMxIzJ9JQorfQorCislIFJlcGxhY2UgYXJndW1lbnRzIGJ5IHRoZWlyIHZhbHVlcyBpbiB0aGUgbWFjcm8gYm9keSwgYW5kIHBsYWNlIHRoZSByZXN1bHQKKyUgaW4gbWFjcm8gXEB0ZW1wYQorXGRlZlxtYWN2YWxzdG9hcmdzQHslCisgICUgIFRvIGRvIHRoaXMgd2UgdXNlIHRoZSBwcm9wZXJ0eSB0aGF0IHRva2VuIHJlZ2lzdGVycyB0aGF0IGFyZSBcdGhlJ2VkCisgICUgd2l0aGluIGFuIFxlZGVmICBleHBhbmQgb25seSBvbmNlLiBTbyB3ZSBhcmUgZ29pbmcgdG8gcGxhY2UgYWxsIGFyZ3VtZW50CisgICUgdmFsdWVzIGludG8gcmVzcGVjdGl2ZSB0b2tlbiByZWdpc3RlcnMuCisgICUKKyAgJSBGaXJzdCB3ZSBzYXZlIHRoZSB0b2tlbiBjb250ZXh0LCBhbmQgaW5pdGlhbGl6ZSBhcmd1bWVudCBudW1iZXJpbmcuCisgIFxiZWdpbmdyb3VwCisgICAgXHBhcmFtbm8wXHJlbGF4CisgICAgJSBUaGVuLCBmb3IgZWFjaCBhcmd1bWVudCBudW1iZXIgI04sIHdlIHBsYWNlIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50CisgICAgJSB2YWx1ZSBpbnRvIGEgbmV3IHRva2VuIGxpc3QgcmVnaXN0ZXIgXHRva3MjTgorICAgIFxleHBhbmRhZnRlclxwdXRhcmdzaW50b2tlbnNAXHNhdmVwYXJhbWxpc3RALDssJQorICAgICUgVGhlbiwgd2UgZXhwYW5kIHRoZSBib2R5IHNvIHRoYXQgYXJndW1lbnQgYXJlIHJlcGxhY2VkIGJ5IHRoZWlyCisgICAgJSB2YWx1ZXMuIFRoZSB0cmljayBmb3IgdmFsdWVzIG5vdCB0byBiZSBleHBhbmRlZCB0aGVtc2VsdmVzIGlzIHRoYXQgdGhleQorICAgICUgYXJlIHdpdGhpbiB0b2tlbnMgYW5kIHRoYXQgdG9rZW5zIGV4cGFuZCBvbmx5IG9uY2UgaW4gYW4gXGVkZWYgLgorICAgIFxlZGVmXEB0ZW1wY3tcY3NuYW1lIG1hYy5cbWFjcm9uYW1lIC5ib2R5XGVuZGNzbmFtZX0lCisgICAgJSBOb3cgd2UgcmVzdG9yZSB0aGUgdG9rZW4gc3RhY2sgcG9pbnRlciB0byBmcmVlIHRoZSB0b2tlbiBsaXN0IHJlZ2lzdGVycworICAgICUgd2hpY2ggd2UgaGF2ZSB1c2VkLCBidXQgd2UgbWFrZSBzdXJlIHRoYXQgZXhwYW5kZWQgYm9keSBpcyBzYXZlZCBhZnRlcgorICAgICUgZ3JvdXAuCisgICAgXGV4cGFuZGFmdGVyCisgIFxlbmRncm91cAorICBcZXhwYW5kYWZ0ZXJcZGVmXGV4cGFuZGFmdGVyXEB0ZW1wYVxleHBhbmRhZnRlcntcQHRlbXBjfSUKKyAgfQorCitcZGVmXG1hY2FyZ2V4cGFuZGluYm9keUB7JSAKKyAgJSUgRGVmaW5lIHRoZSBuYW1lZC1tYWNybyBvdXRzaWRlIG9mIHRoaXMgZ3JvdXAgYW5kIHRoZW4gY2xvc2UgdGhpcyBncm91cC4gCisgIFxleHBhbmRhZnRlcgorICBcZW5kZ3JvdXAKKyAgXG1hY2FyZ2RlZmxpc3RACisgICUgRmlyc3QgdGhlIHJlcGxhY2UgaW4gYm9keSB0aGUgbWFjcm8gYXJndW1lbnRzIGJ5IHRoZWlyIHZhbHVlcywgdGhlIHJlc3VsdAorICAlIGlzIGluIFxAdGVtcGEgLgorICBcbWFjdmFsc3RvYXJnc0AKKyAgJSBUaGVuIHdlIHBvaW50IGF0IHRoZSBcbm9yZWN1cnNlIG9yIFxnb2JibGUgKGZvciByZWN1cnNpdmUpIG1hY3JvIHZhbHVlCisgICUgd2l0aCBcQHRlbXBiIC4KKyAgXGV4cGFuZGFmdGVyXGxldFxleHBhbmRhZnRlclxAdGVtcGJcY3NuYW1lIG1hYy5cbWFjcm9uYW1lIC5yZWN1cnNlXGVuZGNzbmFtZQorICAlIERlcGVuZGluZyBvbiB3aGV0aGVyIGl0IGlzIHJlY3Vyc2l2ZSBvciBub3QsIHdlIG5lZWQgc29tZSB0YWlsaW5nCisgICUgXGVncm91cCAuCisgIFxpZnhcQHRlbXBiXGdvYmJsZQorICAgICBcbGV0XEB0ZW1wY1xyZWxheAorICBcZWxzZQorICAgICBcbGV0XEB0ZW1wY1xlZ3JvdXAKKyAgXGZpCisgICUgQW5kIG5vdyB3ZSBkbyB0aGUgcmVhbCBqb2I6CisgIFxlZGVmXEB0ZW1wZHtcbm9leHBhbmRcQHRlbXBie1xtYWNyb25hbWV9XG5vZXhwYW5kXHNjYW5tYWNyb3tcQHRlbXBhfVxAdGVtcGN9JQorICBcQHRlbXBkCit9CisKK1xkZWZccHV0YXJnc2ludG9rZW5zQCMxLHslCisgIFxpZiMxO1xsZXRcbmV4dFxyZWxheAorICBcZWxzZQorICAgIFxsZXRcbmV4dFxwdXRhcmdzaW50b2tlbnNACisgICAgJSBGaXJzdCB3ZSBhbGxvY2F0ZSB0aGUgbmV3IHRva2VuIGxpc3QgcmVnaXN0ZXIsIGFuZCBnaXZlIGl0IGEgdGVtcG9yYXJ5CisgICAgJSBhbGlhcyBcQHRlbXBiIC4KKyAgICBcdG9rc2RlZlxAdGVtcGJcdGhlXHBhcmFtbm8KKyAgICAlIFRoZW4gd2UgcGxhY2UgdGhlIGFyZ3VtZW50IHZhbHVlIGludG8gdGhhdCB0b2tlbiBsaXN0IHJlZ2lzdGVyLgorICAgIFxleHBhbmRhZnRlclxsZXRcZXhwYW5kYWZ0ZXJcQHRlbXBhXGNzbmFtZSBtYWNhcmcuIzFcZW5kY3NuYW1lCisgICAgXGV4cGFuZGFmdGVyXEB0ZW1wYlxleHBhbmRhZnRlcntcQHRlbXBhfSUKKyAgICBcYWR2YW5jZVxwYXJhbW5vIGJ5IDFccmVsYXgKKyAgXGZpCisgIFxuZXh0Cit9CisKKyUgU2F2ZSB0aGUgdG9rZW4gc3RhY2sgcG9pbnRlciBpbnRvIG1hY3JvICMxCitcZGVmXHRleGlzYXZldG9rc3N0YWNrcG9pbnQjMXtcZWRlZiMxe1x0aGVcQGNjbHZpfX0KKyUgUmVzdG9yZSB0aGUgdG9rZW4gc3RhY2sgcG9pbnRlciBmcm9tIG51bWJlciBpbiBtYWNybyAjMQorXGRlZlx0ZXhpcmVzdG9yZXRva3NzdGFja3BvaW50IzF7XGV4cGFuZGFmdGVyXG1hdGhjaGFyZGVmXGV4cGFuZGFmdGVyXEBjY2x2aSMxXHJlbGF4fQorJSBuZXd0b2tzIHRoYXQgY2FuIGJlIHVzZWQgbm9uIFxvdXRlciAuCitcZGVmXHRleGlub25vdXRlcm5ld3Rva3N7XGFsbG9jQCA1XHRva3MgXHRva3NkZWYgXEBjY2x2aX0KKworJSBUYWlsaW5nIG1pc3NpbmcgYXJndW1lbnRzIGFyZSBzZXQgdG8gZW1wdHkKK1xkZWZcc2V0ZW1wdHlhcmd2YWx1ZXNAeyUKKyAgXGlmeFxwYXJhbWxpc3RcbmlsbUAKKyAgICBcbGV0XG5leHRcbWFjYXJnZXhwYW5kaW5ib2R5QAorICBcZWxzZQorICAgIFxleHBhbmRhZnRlclxzZXRlbXB0eWFyZ3ZhbHVlc3BhcnNlckBccGFyYW1saXN0XGVuZGFyZ3NACisgICAgXGxldFxuZXh0XHNldGVtcHR5YXJndmFsdWVzQAorICBcZmkKKyAgXG5leHQKK30KKworXGRlZlxzZXRlbXB0eWFyZ3ZhbHVlc3BhcnNlckAjMSwjMlxlbmRhcmdzQHslCisgIFxleHBhbmRhZnRlclxkZWZcZXhwYW5kYWZ0ZXJcQHRlbXBhXGV4cGFuZGFmdGVyeyUKKyAgICBcZXhwYW5kYWZ0ZXJcZGVmXGNzbmFtZSBtYWNhcmcuIzFcZW5kY3NuYW1le319JQorICBccHVzaEBcQHRlbXBhXG1hY2FyZ2RlZmxpc3RACisgIFxkZWZccGFyYW1saXN0eyMyfSUKK30KKworJSAjMSBpcyB0aGUgZWxlbWVudCB0YXJnZXQgbWFjcm8KKyUgIzIgaXMgdGhlIGxpc3QgbWFjcm8KKyUgIzMsIzRcZW5kYXJnc0AgaXMgdGhlIGxpc3QgdmFsdWUKK1xkZWZccG9wQCMxIzIjMywjNFxlbmRhcmdzQHslCisgICBcZGVmIzF7IzN9JQorICAgXGRlZiMyeyM0fSUKK30KK1xsb25nXGRlZlxsb25ncG9wQCMxIzIjMywjNFxlbmRhcmdzQHslCisgICBcbG9uZ1xkZWYjMXsjM30lCisgICBcbG9uZ1xkZWYjMnsjNH0lCit9CisKKyUgVGhpcyBkZWZpbmVzIGEgVGV4aW5mbyBAbWFjcm8uIFRoZXJlIGFyZSBlaWdodCBjYXNlczogcmVjdXJzaXZlIGFuZAorJSBub25yZWN1cnNpdmUgbWFjcm9zIG9mIHplcm8sIG9uZSwgdXAgdG8gbmluZSwgYW5kIG1hbnkgYXJndW1lbnRzLgogJSBNdWNoIG1hZ2ljIHdpdGggXGV4cGFuZGFmdGVyIGhlcmUuCiAlIFx4ZGVmIGlzIHVzZWQgc28gdGhhdCBtYWNybyBkZWZpbml0aW9ucyB3aWxsIHN1cnZpdmUgdGhlIGZpbGUKICUgdGhleSdyZSBkZWZpbmVkIGluOyBAaW5jbHVkZSByZWFkcyB0aGUgZmlsZSBpbnNpZGUgYSBncm91cC4KKyUKIFxkZWZcZGVmbWFjcm97JQogICBcbGV0XGhhc2g9IyMlIGNvbnZlcnQgcGxhY2Vob2xkZXJzIHRvIG1hY3JvIHBhcmFtZXRlciBjaGFycwogICBcaWZyZWN1cnNpdmUKQEAgLTU4NjYsMTcgKzc2MzAsMjUgQEAKICAgICAgICAgIFxleHBhbmRhZnRlclxub2V4cGFuZFxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZX0lCiAgICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZSMjMXslCiAgICAgICAgICBcZWdyb3VwXG5vZXhwYW5kXHNjYW5tYWNyb3tcdGVtcH19JQotICAgIFxlbHNlICUgbWFueQotICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lXGVuZGNzbmFtZXslCi0gICAgICAgICBcYmdyb3VwXG5vZXhwYW5kXG1hY3JvYXJnY3R4dAotICAgICAgICAgXG5vZXhwYW5kXGNzbmFtZVx0aGVcbWFjbmFtZSB4eFxlbmRjc25hbWV9JQotICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lIHh4XGVuZGNzbmFtZSMjMXslCi0gICAgICAgICAgXGV4cGFuZGFmdGVyXG5vZXhwYW5kXGNzbmFtZVx0aGVcbWFjbmFtZSB4eHhcZW5kY3NuYW1lICMjMSx9JQotICAgICAgXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyCi0gICAgICBcZXhwYW5kYWZ0ZXJceGRlZgotICAgICAgXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyCi0gICAgICAgIFxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZQotICAgICAgICAgIFxwYXJhbWxpc3R7XGVncm91cFxub2V4cGFuZFxzY2FubWFjcm97XHRlbXB9fSUKKyAgICBcZWxzZQorICAgICAgXGlmbnVtXHBhcmFtbm88MTBccmVsYXggJSBhdCBtb3N0IDkKKyAgICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lXGVuZGNzbmFtZXslCisgICAgICAgICAgIFxiZ3JvdXBcbm9leHBhbmRcbWFjcm9hcmdjdHh0CisgICAgICAgICAgIFxub2V4cGFuZFxjc25hbWVcdGhlXG1hY25hbWUgeHhcZW5kY3NuYW1lfSUKKyAgICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lIHh4XGVuZGNzbmFtZSMjMXslCisgICAgICAgICAgICBcZXhwYW5kYWZ0ZXJcbm9leHBhbmRcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWUgIyMxLH0lCisgICAgICAgIFxleHBhbmRhZnRlclxleHBhbmRhZnRlcgorICAgICAgICBcZXhwYW5kYWZ0ZXJceGRlZgorICAgICAgICBcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXIKKyAgICAgICAgICBcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWUKKyAgICAgICAgICAgIFxwYXJhbWxpc3R7XGVncm91cFxub2V4cGFuZFxzY2FubWFjcm97XHRlbXB9fSUKKyAgICAgIFxlbHNlICUgMTAgb3IgbW9yZQorICAgICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWVcZW5kY3NuYW1leyUKKyAgICAgICAgICBcbm9leHBhbmRcZ2V0YXJndmFsc0B7XHRoZVxtYWNuYW1lfXtcYXJnbH0lCisgICAgICAgIH0lICAgIAorICAgICAgICBcZ2xvYmFsXGV4cGFuZGFmdGVyXGxldFxjc25hbWUgbWFjLlx0aGVcbWFjbmFtZSAuYm9keVxlbmRjc25hbWVcdGVtcAorICAgICAgICBcZ2xvYmFsXGV4cGFuZGFmdGVyXGxldFxjc25hbWUgbWFjLlx0aGVcbWFjbmFtZSAucmVjdXJzZVxlbmRjc25hbWVcZ29iYmxlCisgICAgICBcZmkKICAgICBcZmkKICAgXGVsc2UKICAgICBcaWZjYXNlXHBhcmFtbm8KQEAgLTU4OTMsMzkgKzc2NjUsNTEgQEAKICAgICAgICAgXGVncm91cAogICAgICAgICBcbm9leHBhbmRcbm9yZWN1cnNle1x0aGVcbWFjbmFtZX0lCiAgICAgICAgIFxub2V4cGFuZFxzY2FubWFjcm97XHRlbXB9XGVncm91cH0lCi0gICAgXGVsc2UgJSBtYW55Ci0gICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWVcZW5kY3NuYW1leyUKLSAgICAgICAgIFxiZ3JvdXBcbm9leHBhbmRcbWFjcm9hcmdjdHh0Ci0gICAgICAgICBcZXhwYW5kYWZ0ZXJcbm9leHBhbmRcY3NuYW1lXHRoZVxtYWNuYW1lIHh4XGVuZGNzbmFtZX0lCi0gICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWUgeHhcZW5kY3NuYW1lIyMxeyUKLSAgICAgICAgICBcZXhwYW5kYWZ0ZXJcbm9leHBhbmRcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWUgIyMxLH0lCi0gICAgICBcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXIKLSAgICAgIFxleHBhbmRhZnRlclx4ZGVmCi0gICAgICBcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXIKLSAgICAgIFxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZQotICAgICAgXHBhcmFtbGlzdHslCi0gICAgICAgICAgXGVncm91cAotICAgICAgICAgIFxub2V4cGFuZFxub3JlY3Vyc2V7XHRoZVxtYWNuYW1lfSUKLSAgICAgICAgICBcbm9leHBhbmRcc2Nhbm1hY3Jve1x0ZW1wfVxlZ3JvdXB9JQorICAgIFxlbHNlICUgYXQgbW9zdCA5CisgICAgICBcaWZudW1ccGFyYW1ubzwxMFxyZWxheAorICAgICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWVcZW5kY3NuYW1leyUKKyAgICAgICAgICAgXGJncm91cFxub2V4cGFuZFxtYWNyb2FyZ2N0eHQKKyAgICAgICAgICAgXGV4cGFuZGFmdGVyXG5vZXhwYW5kXGNzbmFtZVx0aGVcbWFjbmFtZSB4eFxlbmRjc25hbWV9JQorICAgICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWUgeHhcZW5kY3NuYW1lIyMxeyUKKyAgICAgICAgICAgIFxleHBhbmRhZnRlclxub2V4cGFuZFxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZSAjIzEsfSUKKyAgICAgICAgXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyCisgICAgICAgIFxleHBhbmRhZnRlclx4ZGVmCisgICAgICAgIFxleHBhbmRhZnRlclxleHBhbmRhZnRlcgorICAgICAgICBcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWUKKyAgICAgICAgXHBhcmFtbGlzdHslCisgICAgICAgICAgICBcZWdyb3VwCisgICAgICAgICAgICBcbm9leHBhbmRcbm9yZWN1cnNle1x0aGVcbWFjbmFtZX0lCisgICAgICAgICAgICBcbm9leHBhbmRcc2Nhbm1hY3Jve1x0ZW1wfVxlZ3JvdXB9JQorICAgICAgXGVsc2UgJSAxMCBvciBtb3JlOgorICAgICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWVcZW5kY3NuYW1leyUKKyAgICAgICAgICBcbm9leHBhbmRcZ2V0YXJndmFsc0B7XHRoZVxtYWNuYW1lfXtcYXJnbH0lCisgICAgICAgIH0lCisgICAgICAgIFxnbG9iYWxcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSBtYWMuXHRoZVxtYWNuYW1lIC5ib2R5XGVuZGNzbmFtZVx0ZW1wCisgICAgICAgIFxnbG9iYWxcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSBtYWMuXHRoZVxtYWNuYW1lIC5yZWN1cnNlXGVuZGNzbmFtZVxub3JlY3Vyc2UKKyAgICAgIFxmaQogICAgIFxmaQogICBcZml9CiAKK1xjYXRjb2RlIGBcQFx0ZXhpYXRjYXRjb2RlXHJlbGF4CisKIFxkZWZcbm9yZWN1cnNlIzF7XGJncm91cFxjc2xldHsjMX17bWFjc2F2ZS4jMX19CiAKICUgXGJyYWNlb3JsaW5lIGRlY2lkZXMgd2hldGhlciB0aGUgbmV4dCBub253aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBhCiAlIHsuICBJZiBzbyBpdCByZWFkcyB1cCB0byB0aGUgY2xvc2luZyB9LCBpZiBub3QsIGl0IHJlYWRzIHRoZSB3aG9sZQogJSBsaW5lLiAgV2hhdGV2ZXIgd2FzIHJlYWQgaXMgdGhlbiBmZWQgdG8gdGhlIG5leHQgY29udHJvbCBzZXF1ZW5jZQotJSBhcyBhbiBhcmd1bWVudCAoYnkgXHBhcnNlYnJhY2Ugb3IgXHBhcnNlYXJnKQotXGRlZlxicmFjZW9ybGluZSMxe1xsZXRcbmV4dD0jMVxmdXR1cmVsZXRcbmNoYXJcYnJhY2VvcmxpbmV4eHh9CislIGFzIGFuIGFyZ3VtZW50IChieSBccGFyc2VicmFjZSBvciBccGFyc2VhcmcpLgorJSAKK1xkZWZcYnJhY2VvcmxpbmUjMXtcbGV0XG1hY25hbWV4eHg9IzFcZnV0dXJlbGV0XG5jaGFyXGJyYWNlb3JsaW5leHh4fQogXGRlZlxicmFjZW9ybGluZXh4eHslCiAgIFxpZnhcbmNoYXJcYmdyb3VwXGVsc2UKICAgICBcZXhwYW5kYWZ0ZXJccGFyc2VhcmcKLSAgXGZpIFxuZXh0fQorICBcZmkgXG1hY25hbWV4eHh9CiAKIAogJSBAYWxpYXMuCiAlIFdlIG5lZWQgc29tZSB0cmlja2VyeSB0byByZW1vdmUgdGhlIG9wdGlvbmFsIHNwYWNlcyBhcm91bmQgdGhlIGVxdWFsCi0lIHNpZ24uICBKdXN0IG1ha2UgdGhlbSBhY3RpdmUgYW5kIHRoZW4gZXhwYW5kIHRoZW0gYWxsIHRvIG5vdGhpbmcuCislIHNpZ24uICBNYWtlIHRoZW0gYWN0aXZlIGFuZCB0aGVuIGV4cGFuZCB0aGVtIGFsbCB0byBub3RoaW5nLgorJQogXGRlZlxhbGlhc3tccGFyc2Vhcmd1c2luZ1xvYmV5c3BhY2VzXGFsaWFzeHh4fQogXGRlZlxhbGlhc3h4eCAjMXtcYWxpYXN5eXkjMVxyZWxheH0KIFxkZWZcYWxpYXN5eXkgIzE9IzJccmVsYXh7JQpAQCAtNTk0MSwxMyArNzcyNSwxMyBAQAogXG1lc3NhZ2V7Y3Jvc3MgcmVmZXJlbmNlcyx9CiAKIFxuZXd3cml0ZVxhdXhmaWxlCi0KIFxuZXdpZlxpZmhhdmV4cmVmcyAgICAlIFRydWUgaWYgeHJlZiB2YWx1ZXMgYXJlIGtub3duLgogXG5ld2lmXGlmd2FybmVkeHJlZnMgICUgVHJ1ZSBpZiB3ZSB3YXJuZWQgb25jZSB0aGF0IHRoZXkgYXJlbid0IGtub3duLgogCiAlIEBpbmZvcmVmIGlzIHJlbGF0aXZlbHkgc2ltcGxlLgogXGRlZlxpbmZvcmVmICMxe1xpbmZvcmVmenp6ICMxLCwsLCoqfQotXGRlZlxpbmZvcmVmenp6ICMxLCMyLCMzLCM0Kip7XHB1dHdvcmRTZWV7fSBccHV0d29yZEluZm97fSBccHV0d29yZGZpbGV7fSBcZmlsZXtcaWdub3Jlc3BhY2VzICMze319LAorXGRlZlxpbmZvcmVmenp6ICMxLCMyLCMzLCM0Kip7JQorICBccHV0d29yZFNlZXt9IFxwdXR3b3JkSW5mb3t9IFxwdXR3b3JkZmlsZXt9IFxmaWxle1xpZ25vcmVzcGFjZXMgIzN7fX0sCiAgIG5vZGUgXHNhbXB7XGlnbm9yZXNwYWNlcyMxe319fQogCiAlIEBub2RlJ3Mgb25seSBqb2IgaW4gVGVYIGlzIHRvIGRlZmluZSBcbGFzdG5vZGUsIHdoaWNoIGlzIHVzZWQgaW4KQEAgLTU5ODYsNyArNzc3MCw3IEBACiAKICUgXHNldHJlZntOQU1FfXtTTlR9IGRlZmluZXMgYSBjcm9zcy1yZWZlcmVuY2UgcG9pbnQgTkFNRSAoYSBub2RlIG9yIGFuCiAlIGFuY2hvciksIHdoaWNoIGNvbnNpc3RzIG9mIHRocmVlIHBhcnRzOgotJSAxKSBOQU1FLXRpdGxlIC0gdGhlIGN1cnJlbnQgc2VjdGlvbmluZyBuYW1lIHRha2VuIGZyb20gXHRoaXNzZWN0aW9uLAorJSAxKSBOQU1FLXRpdGxlIC0gdGhlIGN1cnJlbnQgc2VjdGlvbmluZyBuYW1lIHRha2VuIGZyb20gXGxhc3RzZWN0aW9uLAogJSAgICAgICAgICAgICAgICAgb3IgdGhlIGFuY2hvciBuYW1lLgogJSAyKSBOQU1FLXNudCAgIC0gc2VjdGlvbiBudW1iZXIgYW5kIHR5cGUsIHBhc3NlZCBhcyB0aGUgU05UIGFyZywgb3IKICUgICAgICAgICAgICAgICAgIGVtcHR5IGZvciBhbmNob3JzLgpAQCAtNjAwNSwxNCArNzc4OSwzNSBAQAogCVx3cml0ZVxhdXhmaWxle0B4cmRlZnsjMS0lICMxIG9mIFxzZXRyZWYsIGV4cGFuZGVkIGJ5IHRoZSBcZWRlZgogCSAgIyMxfXsjIzJ9fSUgdGhlc2UgYXJlIHBhcmFtZXRlcnMgb2YgXHdyaXRleHJkZWYKICAgICAgIH0lCi0gICAgICBcdG9rczAgPSBcZXhwYW5kYWZ0ZXJ7XHRoaXNzZWN0aW9ufSUKKyAgICAgIFx0b2tzMCA9IFxleHBhbmRhZnRlcntcbGFzdHNlY3Rpb259JQogICAgICAgXGltbWVkaWF0ZSBcd3JpdGV4cmRlZnt0aXRsZX17XHRoZVx0b2tzMCB9JQogICAgICAgXGltbWVkaWF0ZSBcd3JpdGV4cmRlZntzbnR9e1xjc25hbWUgIzJcZW5kY3NuYW1lfSUgXFludW1iZXJlZCBldGMuCi0gICAgICBcd3JpdGV4cmRlZntwZ317XGZvbGlvfSUgd2lsbCBiZSB3cml0dGVuIGxhdGVyLCBkdXJpbmcgXHNoaXBvdXQKKyAgICAgIFxzYWZld2hhdHNpdHtcd3JpdGV4cmRlZntwZ317XGZvbGlvfX0lIHdpbGwgYmUgd3JpdHRlbiBsYXRlciwgYXQgXHNoaXBvdXQKICAgICB9JQogICBcZmkKIH0KIAorJSBAeHJlZmF1dG9zZWN0aW9udGl0bGUgb258b2ZmIHNheXMgd2hldGhlciBAc2VjdGlvbihpbmcpIG5hbWVzIGFyZSB1c2VkCislIGF1dG9tYXRpY2FsbHkgaW4geHJlZnMsIGlmIHRoZSB0aGlyZCBhcmcgaXMgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkLgorJSBUaGlzIHdhcyBwcm92aWRlZCBhcyBhICJzZWNyZXQiIEBzZXQgeHJlZi1hdXRvbWF0aWMtc2VjdGlvbi10aXRsZQorJSB2YXJpYWJsZSwgbm93IGl0J3Mgb2ZmaWNpYWwuCislIAorXHBhcnNlYXJnZGVmXHhyZWZhdXRvbWF0aWNzZWN0aW9udGl0bGV7JQorICBcZGVmXHRlbXB7IzF9JQorICBcaWZ4XHRlbXBcb253b3JkCisgICAgXGV4cGFuZGFmdGVyXGxldFxjc25hbWUgU0VUeHJlZi1hdXRvbWF0aWMtc2VjdGlvbi10aXRsZVxlbmRjc25hbWUKKyAgICAgID0gXGVtcHR5CisgIFxlbHNlXGlmeFx0ZW1wXG9mZndvcmQKKyAgICBcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSBTRVR4cmVmLWF1dG9tYXRpYy1zZWN0aW9uLXRpdGxlXGVuZGNzbmFtZQorICAgICAgPSBccmVsYXgKKyAgXGVsc2UKKyAgICBcZXJyaGVscCA9IFxFTXNpbXBsZQorICAgIFxlcnJtZXNzYWdle1Vua25vd24gQHhyZWZhdXRvbWF0aWNzZWN0aW9udGl0bGUgdmFsdWUgYFx0ZW1wJywKKyAgICAgICAgICAgICAgICBtdXN0IGJlIG9ufG9mZn0lCisgIFxmaVxmaQorfQorCislIAwKICUgQHhyZWYsIEBweHJlZiwgYW5kIEByZWYgZ2VuZXJhdGUgY3Jvc3MtcmVmZXJlbmNlcy4gIEZvciBceHJlZlgsICMxIGlzCiAlIHRoZSBub2RlIG5hbWUsICMyIHRoZSBuYW1lIG9mIHRoZSBJbmZvIGNyb3NzLXJlZmVyZW5jZSwgIzMgdGhlIHByaW50ZWQKICUgbm9kZSBuYW1lLCAjNCB0aGUgbmFtZSBvZiB0aGUgSW5mbyBmaWxlLCAjNSB0aGUgbmFtZSBvZiB0aGUgcHJpbnRlZApAQCAtNjAyMSwyNiArNzgyNiw0MSBAQAogXGRlZlxweHJlZiMxe1xwdXR3b3Jkc2Vle30gXHhyZWZYWyMxLCwsLCwsLF19CiBcZGVmXHhyZWYjMXtccHV0d29yZFNlZXt9IFx4cmVmWFsjMSwsLCwsLCxdfQogXGRlZlxyZWYjMXtceHJlZlhbIzEsLCwsLCwsXX0KKyUKK1xuZXdib3hcdG9wcmVmYm94CitcbmV3Ym94XHByaW50ZWRyZWZuYW1lYm94CitcbmV3Ym94XGluZm9maWxlbmFtZWJveAorXG5ld2JveFxwcmludGVkbWFudWFsYm94CislCiBcZGVmXHhyZWZYWyMxLCMyLCMzLCM0LCM1LCM2XXtcYmVnaW5ncm91cAogICBcdW5zZXBzcGFjZXMKLSAgXGRlZlxwcmludGVkbWFudWFse1xpZ25vcmVzcGFjZXMgIzV9JQorICAlCisgICUgR2V0IGFyZ3Mgd2l0aG91dCBsZWFkaW5nL3RyYWlsaW5nIHNwYWNlcy4KICAgXGRlZlxwcmludGVkcmVmbmFtZXtcaWdub3Jlc3BhY2VzICMzfSUKLSAgXHNldGJveDE9XGhib3h7XHByaW50ZWRtYW51YWxcdW5za2lwfSUKLSAgXHNldGJveDA9XGhib3h7XHByaW50ZWRyZWZuYW1lXHVuc2tpcH0lCi0gIFxpZmRpbSBcd2QwID0gMHB0CisgIFxzZXRib3hccHJpbnRlZHJlZm5hbWVib3ggPSBcaGJveHtccHJpbnRlZHJlZm5hbWVcdW5za2lwfSUKKyAgJQorICBcZGVmXGluZm9maWxlbmFtZXtcaWdub3Jlc3BhY2VzICM0fSUKKyAgXHNldGJveFxpbmZvZmlsZW5hbWVib3ggPSBcaGJveHtcaW5mb2ZpbGVuYW1lXHVuc2tpcH0lCisgICUKKyAgXGRlZlxwcmludGVkbWFudWFse1xpZ25vcmVzcGFjZXMgIzV9JQorICBcc2V0Ym94XHByaW50ZWRtYW51YWxib3ggID0gXGhib3h7XHByaW50ZWRtYW51YWxcdW5za2lwfSUKKyAgJQorICAlIElmIHRoZSBwcmludGVkIHJlZmVyZW5jZSBuYW1lIChhcmcgIzMpIHdhcyBub3QgZXhwbGljaXRseSBnaXZlbiBpbgorICAlIHRoZSBAeHJlZiwgZmlndXJlIG91dCB3aGF0IHdlIHdhbnQgdG8gdXNlLgorICBcaWZkaW0gXHdkXHByaW50ZWRyZWZuYW1lYm94ID0gMHB0CiAgICAgJSBObyBwcmludGVkIG5vZGUgbmFtZSB3YXMgZXhwbGljaXRseSBnaXZlbi4KLSAgICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBTRVR4cmVmLWF1dG9tYXRpYy1zZWN0aW9uLXRpdGxlXGVuZGNzbmFtZVxyZWxheAotICAgICAgJSBVc2UgdGhlIG5vZGUgbmFtZSBpbnNpZGUgdGhlIHNxdWFyZSBicmFja2V0cy4KKyAgICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBTRVR4cmVmLWF1dG9tYXRpYy1zZWN0aW9uLXRpdGxlXGVuZGNzbmFtZSBccmVsYXgKKyAgICAgICUgTm90IGF1dG8gc2VjdGlvbi10aXRsZTogdXNlIG5vZGUgbmFtZSBpbnNpZGUgdGhlIHNxdWFyZSBicmFja2V0cy4KICAgICAgIFxkZWZccHJpbnRlZHJlZm5hbWV7XGlnbm9yZXNwYWNlcyAjMX0lCiAgICAgXGVsc2UKLSAgICAgICUgVXNlIHRoZSBhY3R1YWwgY2hhcHRlci9zZWN0aW9uIHRpdGxlIGFwcGVhciBpbnNpZGUKLSAgICAgICUgdGhlIHNxdWFyZSBicmFja2V0cy4gIFVzZSB0aGUgcmVhbCBzZWN0aW9uIHRpdGxlIGlmIHdlIGhhdmUgaXQuCi0gICAgICBcaWZkaW0gXHdkMSA+IDBwdAotICAgICAgICAlIEl0IGlzIGluIGFub3RoZXIgbWFudWFsLCBzbyB3ZSBkb24ndCBoYXZlIGl0LgorICAgICAgJSBBdXRvIHNlY3Rpb24tdGl0bGU6IHVzZSBjaGFwdGVyL3NlY3Rpb24gdGl0bGUgaW5zaWRlCisgICAgICAlIHRoZSBzcXVhcmUgYnJhY2tldHMgaWYgd2UgaGF2ZSBpdC4KKyAgICAgIFxpZmRpbSBcd2RccHJpbnRlZG1hbnVhbGJveCA+IDBwdAorICAgICAgICAlIEl0IGlzIGluIGFub3RoZXIgbWFudWFsLCBzbyB3ZSBkb24ndCBoYXZlIGl0OyB1c2Ugbm9kZSBuYW1lLgogICAgICAgICBcZGVmXHByaW50ZWRyZWZuYW1le1xpZ25vcmVzcGFjZXMgIzF9JQogICAgICAgXGVsc2UKICAgICAgICAgXGlmaGF2ZXhyZWZzCi0gICAgICAgICAgJSBXZSBrbm93IHRoZSByZWFsIHRpdGxlIGlmIHdlIGhhdmUgdGhlIHhyZWYgdmFsdWVzLgorICAgICAgICAgICUgV2UgKHNob3VsZCkga25vdyB0aGUgcmVhbCB0aXRsZSBpZiB3ZSBoYXZlIHRoZSB4cmVmIHZhbHVlcy4KICAgICAgICAgICBcZGVmXHByaW50ZWRyZWZuYW1le1xyZWZ4eyMxLXRpdGxlfXt9fSUKICAgICAgICAgXGVsc2UKICAgICAgICAgICAlIE90aGVyd2lzZSBqdXN0IGNvcHkgdGhlIEluZm8gbm9kZSBuYW1lLgpAQCAtNjA1MiwyMiArNzg3MiwzMiBAQAogICAlCiAgICUgTWFrZSBsaW5rIGluIHBkZiBvdXRwdXQuCiAgIFxpZnBkZgotICAgIFxsZWF2ZXZtb2RlCi0gICAgXGdldGZpbGVuYW1leyM0fSUKLSAgICB7XHR1cm5vZmZhY3RpdmUKLSAgICAgJSBTZWUgY29tbWVudHMgYXQgXGFjdGl2ZWJhY2tzbGFzaGRvdWJsZS4KLSAgICAge1xhY3RpdmViYWNrc2xhc2hkb3VibGUgXHhkZWZccGRmeHJlZmRlc3R7IzF9JQotICAgICAgXGJhY2tzbGFzaHBhcmVuc1xwZGZ4cmVmZGVzdH0lCisgICAge1xpbmRleG5vZm9udHMKKyAgICAgXHR1cm5vZmZhY3RpdmUKKyAgICAgXG1ha2V2YWx1ZWV4cGFuZGFibGUKKyAgICAgJSBUaGlzIGV4cGFuZHMgdG9rZW5zLCBzbyBkbyBpdCBhZnRlciBtYWtpbmcgY2F0Y29kZSBjaGFuZ2VzLCBzbyBfCisgICAgICUgZXRjLiBkb24ndCBnZXQgdGhlaXIgVGVYIGRlZmluaXRpb25zLiAgVGhpcyBpZ25vcmVzIGFsbCBzcGFjZXMgaW4KKyAgICAgJSAjNCwgaW5jbHVkaW5nICh3cm9uZ2x5KSB0aG9zZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBmaWxlbmFtZS4KKyAgICAgXGdldGZpbGVuYW1leyM0fSUKICAgICAgJQotICAgICBcaWZudW1cZmlsZW5hbWVsZW5ndGg+MAotICAgICAgIFxzdGFydGxpbmsgYXR0cnsvQm9yZGVyIFswIDAgMF19JQotICAgICAgICAgZ290byBmaWxle1x0aGVcZmlsZW5hbWUucGRmfSBuYW1le1xwZGZ4cmVmZGVzdH0lCisgICAgICUgVGhpcyAod3JvbmdseSkgZG9lcyBub3QgdGFrZSBhY2NvdW50IG9mIGxlYWRpbmcgb3IgdHJhaWxpbmcKKyAgICAgJSBzcGFjZXMgaW4gIzEsIHdoaWNoIHNob3VsZCBiZSBpZ25vcmVkLgorICAgICBcZWRlZlxwZGZ4cmVmZGVzdHsjMX0lCisgICAgIFxpZnhccGRmeHJlZmRlc3RcZW1wdHkKKyAgICAgICBcZGVmXHBkZnhyZWZkZXN0e1RvcH0lIG5vIGVtcHR5IHRhcmdldHMKICAgICAgXGVsc2UKLSAgICAgICBcc3RhcnRsaW5rIGF0dHJ7L0JvcmRlciBbMCAwIDBdfSUKLSAgICAgICAgIGdvdG8gbmFtZXtccGRmbWtwZ257XHBkZnhyZWZkZXN0fX0lCisgICAgICAgXHR4aWVzY2FwZXBkZlxwZGZ4cmVmZGVzdCAgJSBlc2NhcGUgUERGIHNwZWNpYWwgY2hhcnMKKyAgICAgXGZpCisgICAgICUKKyAgICAgXGxlYXZldm1vZGUKKyAgICAgXHN0YXJ0bGluayBhdHRyey9Cb3JkZXIgWzAgMCAwXX0lCisgICAgIFxpZm51bVxmaWxlbmFtZWxlbmd0aD4wCisgICAgICAgZ290byBmaWxle1x0aGVcZmlsZW5hbWUucGRmfSBuYW1le1xwZGZ4cmVmZGVzdH0lCisgICAgIFxlbHNlCisgICAgICAgZ290byBuYW1le1xwZGZta3BnbntccGRmeHJlZmRlc3R9fSUKICAgICAgXGZpCiAgICAgfSUKLSAgICBcbGlua2NvbG9yCisgICAgXHNldGNvbG9ye1xsaW5rY29sb3J9JQogICBcZmkKICAgJQogICAlIEZsb2F0IHJlZmVyZW5jZXMgYXJlIHByaW50ZWQgY29tcGxldGVseSBkaWZmZXJlbnRseTogIkZpZ3VyZSAxLjIiCkBAIC02MDg0LDI5ICs3OTE0LDQyIEBACiAgIFxpZmZsb2F0XFh0aGlzcmVmdGl0bGUKICAgICAlIElmIHRoZSB1c2VyIHNwZWNpZmllZCB0aGUgcHJpbnQgbmFtZSAodGhpcmQgYXJnKSB0byB0aGUgcmVmLAogICAgICUgcHJpbnQgaXQgaW5zdGVhZCBvZiBvdXIgdXN1YWwgIkZpZ3VyZSAxLjIiLgotICAgIFxpZmRpbVx3ZDAgPSAwcHQKLSAgICAgIFxyZWZ4eyMxLXNudH0lCisgICAgXGlmZGltXHdkXHByaW50ZWRyZWZuYW1lYm94ID0gMHB0CisgICAgICBccmVmeHsjMS1zbnR9e30lCiAgICAgXGVsc2UKICAgICAgIFxwcmludGVkcmVmbmFtZQogICAgIFxmaQogICAgICUKLSAgICAlIGlmIHRoZSB1c2VyIGFsc28gZ2F2ZSB0aGUgcHJpbnRlZCBtYW51YWwgbmFtZSAoZmlmdGggYXJnKSwgYXBwZW5kCisgICAgJSBJZiB0aGUgdXNlciBhbHNvIGdhdmUgdGhlIHByaW50ZWQgbWFudWFsIG5hbWUgKGZpZnRoIGFyZyksIGFwcGVuZAogICAgICUgImluIE1BTlVBTE5BTUUiLgotICAgIFxpZmRpbSBcd2QxID4gMHB0CisgICAgXGlmZGltIFx3ZFxwcmludGVkbWFudWFsYm94ID4gMHB0CiAgICAgICBcc3BhY2UgXHB1dHdvcmRpbnt9IFxjaXRle1xwcmludGVkbWFudWFsfSUKICAgICBcZmkKICAgXGVsc2UKICAgICAlIG5vZGUvYW5jaG9yIChub24tZmxvYXQpIHJlZmVyZW5jZXMuCisgICAgJSAKKyAgICAlIElmIHdlIHVzZSBcdW5oYm94IHRvIHByaW50IHRoZSBub2RlIG5hbWVzLCBUZVggZG9lcyBub3QgaW5zZXJ0CisgICAgJSBlbXB0eSBkaXNjcmV0aW9uYXJpZXMgYWZ0ZXIgaHlwaGVucywgd2hpY2ggbWVhbnMgdGhhdCBpdCB3aWxsIG5vdAorICAgICUgZmluZCBhIGxpbmUgYnJlYWsgYXQgYSBoeXBoZW4gaW4gYSBub2RlIG5hbWVzLiAgU2luY2Ugc29tZSBtYW51YWxzCisgICAgJSBhcmUgYmVzdCB3cml0dGVuIHdpdGggZmFpcmx5IGxvbmcgbm9kZSBuYW1lcywgY29udGFpbmluZyBoeXBoZW5zLAorICAgICUgdGhpcyBpcyBhIGxvc3MuICBUaGVyZWZvcmUsIHdlIGdpdmUgdGhlIHRleHQgb2YgdGhlIG5vZGUgbmFtZQorICAgICUgYWdhaW4sIHNvIGl0IGlzIGFzIGlmIFRlWCBpcyBzZWVpbmcgaXQgZm9yIHRoZSBmaXJzdCB0aW1lLgorICAgICUgCisgICAgXGlmZGltIFx3ZFxwcmludGVkbWFudWFsYm94ID4gMHB0CisgICAgICAlIENyb3NzLW1hbnVhbCByZWZlcmVuY2Ugd2l0aCBhIHByaW50ZWQgbWFudWFsIG5hbWUuCisgICAgICAlIAorICAgICAgXGNyb3NzbWFudWFseHJlZntcY2l0ZXtccHJpbnRlZG1hbnVhbFx1bnNraXB9fSUKICAgICAlCi0gICAgJSBJZiB3ZSB1c2UgXHVuaGJveDAgYW5kIFx1bmhib3gxIHRvIHByaW50IHRoZSBub2RlIG5hbWVzLCBUZVggZG9lcyBub3QKLSAgICAlIGluc2VydCBlbXB0eSBkaXNjcmV0aW9uYXJpZXMgYWZ0ZXIgaHlwaGVucywgd2hpY2ggbWVhbnMgdGhhdCBpdCB3aWxsCi0gICAgJSBub3QgZmluZCBhIGxpbmUgYnJlYWsgYXQgYSBoeXBoZW4gaW4gYSBub2RlIG5hbWVzLiAgU2luY2Ugc29tZSBtYW51YWxzCi0gICAgJSBhcmUgYmVzdCB3cml0dGVuIHdpdGggZmFpcmx5IGxvbmcgbm9kZSBuYW1lcywgY29udGFpbmluZyBoeXBoZW5zLCB0aGlzCi0gICAgJSBpcyBhIGxvc3MuICBUaGVyZWZvcmUsIHdlIGdpdmUgdGhlIHRleHQgb2YgdGhlIG5vZGUgbmFtZSBhZ2Fpbiwgc28gaXQKLSAgICAlIGlzIGFzIGlmIFRlWCBpcyBzZWVpbmcgaXQgZm9yIHRoZSBmaXJzdCB0aW1lLgotICAgIFxpZmRpbSBcd2QxID4gMHB0Ci0gICAgICBccHV0d29yZHNlY3Rpb257fSBgYFxwcmludGVkcmVmbmFtZScnIFxwdXR3b3JkaW57fSBcY2l0ZXtccHJpbnRlZG1hbnVhbH0lCisgICAgXGVsc2VcaWZkaW0gXHdkXGluZm9maWxlbmFtZWJveCA+IDBwdAorICAgICAgJSBDcm9zcy1tYW51YWwgcmVmZXJlbmNlIHdpdGggb25seSBhbiBpbmZvIGZpbGVuYW1lIChhcmcgNCksIG5vCisgICAgICAlIHByaW50ZWQgbWFudWFsIG5hbWUgKGFyZyA1KS4gIFRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMKKyAgICAgICUgdGhlIGNhc2UgYWJvdmU7IHdlIG91dHB1dCB0aGUgZmlsZW5hbWUsIHNpbmNlIHdlIGhhdmUgbm90aGluZyBlbHNlLgorICAgICAgJSAKKyAgICAgIFxjcm9zc21hbnVhbHhyZWZ7XGNvZGV7XGluZm9maWxlbmFtZVx1bnNraXB9fSUKKyAgICAlCiAgICAgXGVsc2UKKyAgICAgICUgUmVmZXJlbmNlIHdpdGhpbiB0aGlzIG1hbnVhbC4KKyAgICAgICUKICAgICAgICUgXyAoZm9yIGV4YW1wbGUpIGhhcyB0byBiZSB0aGUgY2hhcmFjdGVyIF8gZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGUKICAgICAgICUgY29udHJvbCBzZXF1ZW5jZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBub2RlLCBidXQgaXQgaGFzIHRvIGV4cGFuZAogICAgICAgJSBpbnRvIHRoZSB1c3VhbCBcbGVhdmV2bW9kZS4uLlx2cnVsZSBzdHVmZiBmb3IgcHVycG9zZXMgb2YKQEAgLTYxMTgsNyArNzk2MSw3IEBACiAgICAgICAgXHNldGJveDIgPSBcaGJveHtcaWdub3Jlc3BhY2VzIFxyZWZ4eyMxLXNudH17fX0lCiAgICAgICAgXGlmZGltIFx3ZDIgPiAwcHQgXHJlZnh7IzEtc250fVxzcGFjZVxmaQogICAgICAgfSUKLSAgICAgICUgb3V0cHV0IHRoZSBgW215bm9kZV0nIHZpYSBhIG1hY3JvIHNvIGl0IGNhbiBiZSBvdmVycmlkZGVuLgorICAgICAgJSBvdXRwdXQgdGhlIGBbbXlub2RlXScgdmlhIHRoZSBtYWNybyBiZWxvdyBzbyBpdCBjYW4gYmUgb3ZlcnJpZGRlbi4KICAgICAgIFx4cmVmcHJpbnRub2RlbmFtZVxwcmludGVkcmVmbmFtZQogICAgICAgJQogICAgICAgJSBCdXQgd2UgYWx3YXlzIHdhbnQgYSBjb21tYSBhbmQgYSBzcGFjZToKQEAgLTYxMjYsMTEgKzc5NjksMzcgQEAKICAgICAgICUKICAgICAgICUgb3V0cHV0IHRoZSBgcGFnZSAzJy4KICAgICAgIFx0dXJub2ZmYWN0aXZlIFxwdXR3b3JkcGFnZVx0aWVccmVmeHsjMS1wZ317fSUKLSAgICBcZmkKKyAgICBcZmlcZmkKICAgXGZpCiAgIFxlbmRsaW5rCiBcZW5kZ3JvdXB9CiAKKyUgT3V0cHV0IGEgY3Jvc3MtbWFudWFsIHhyZWYgdG8gIzEuICBVc2VkIGp1c3QgYWJvdmUgKHR3aWNlKS4KKyUgCislIE9ubHkgaW5jbHVkZSB0aGUgdGV4dCAiU2VjdGlvbiBgYGZvbycnIGluIiBpZiB0aGUgZm9vIGlzIG5laXRoZXIKKyUgbWlzc2luZyBvciBUb3AuICBUaHVzLCBAeHJlZnssLCxmb28sVGhlIEZvbyBNYW51YWx9IG91dHB1dHMgc2ltcGx5CislICJzZWUgVGhlIEZvbyBNYW51YWwiLCB0aGUgaWRlYSBiZWluZyB0byByZWZlciB0byB0aGUgd2hvbGUgbWFudWFsLgorJSAKKyUgQnV0LCB0aGlzIGJlaW5nIFRlWCwgd2UgY2FuJ3QgZWFzaWx5IGNvbXBhcmUgb3VyIG5vZGUgbmFtZSBhZ2FpbnN0IHRoZQorJSBzdHJpbmcgIlRvcCIgd2hpbGUgaWdub3JpbmcgdGhlIHBvc3NpYmxlIHNwYWNlcyBiZWZvcmUgYW5kIGFmdGVyIGluCislIHRoZSBpbnB1dC4gIEJ5IGFkZGluZyB0aGUgYXJiaXRyYXJ5IDdzcCBiZWxvdywgd2UgbWFrZSBpdCBtdWNoIGxlc3MKKyUgbGlrZWx5IHRoYXQgYSByZWFsIG5vZGUgbmFtZSB3b3VsZCBoYXZlIHRoZSBzYW1lIHdpZHRoIGFzICJUb3AiIChlLmcuLAorJSBpbiBhIG1vbm9zcGFjZWQgZm9udCkuICBIb3BlZnVsbHkgaXQgd2lsbCBuZXZlciBoYXBwZW4gaW4gcHJhY3RpY2UuCislIAorJSBGb3IgdGhlIHNhbWUgYmFzaWMgcmVhc29uLCB3ZSByZXR5cGVzZXQgdGhlICJUb3AiIGF0IGV2ZXJ5CislIHJlZmVyZW5jZSwgc2luY2UgdGhlIGN1cnJlbnQgZm9udCBpcyBpbmRldGVybWluYXRlLgorJSAKK1xkZWZcY3Jvc3NtYW51YWx4cmVmIzF7JQorICBcc2V0Ym94XHRvcHJlZmJveCA9IFxoYm94e1RvcFxrZXJuN3NwfSUKKyAgXHNldGJveDIgPSBcaGJveHtcaWdub3Jlc3BhY2VzIFxwcmludGVkcmVmbmFtZSBcdW5za2lwIFxrZXJuN3NwfSUKKyAgXGlmZGltIFx3ZDIgPiA3c3AgICUgbm9uZW1wdHk/CisgICAgXGlmZGltIFx3ZDIgPSBcd2RcdG9wcmVmYm94IFxlbHNlICAlIHNhbWUgYXMgVG9wPworICAgICAgXHB1dHdvcmRTZWN0aW9ue30gYGBccHJpbnRlZHJlZm5hbWUnJyBccHV0d29yZGlue31cc3BhY2UKKyAgICBcZmkKKyAgXGZpCisgICMxJQorfQorCiAlIFRoaXMgbWFjcm8gaXMgY2FsbGVkIGZyb20gXHhyZWZYIGZvciB0aGUgYFtub2RlbmFtZV0nIHBhcnQgb2YgeHJlZgogJSBvdXRwdXQuICBJdCdzIGEgc2VwYXJhdGUgbWFjcm8gb25seSBzbyBpdCBjYW4gYmUgY2hhbmdlZCBtb3JlIGVhc2lseSwKICUgc2luY2Ugc3F1YXJlIGJyYWNrZXRzIGRvbid0IHdvcmsgd2VsbCBpbiBzb21lIGRvY3VtZW50cy4gIFBhcnRpY3VsYXJseQpAQCAtNjE4MSw3ICs4MDUwLDggQEAKICAgICBcYW5nbGVsZWZ0IHVuXC1kZVwtZmluZWRcYW5nbGVyaWdodAogICAgIFxpZmxpbmtzCiAgICAgICBcaWZoYXZleHJlZnMKLSAgICAgICAgXG1lc3NhZ2V7XGxpbmVudW1iZXIgVW5kZWZpbmVkIGNyb3NzIHJlZmVyZW5jZSBgIzEnLn0lCisgICAgICAgIHtcdG9rczAgPSB7IzF9JSBhdm9pZCBleHBhbnNpb24gb2YgcG9zc2libHktY29tcGxleCB2YWx1ZQorICAgICAgICAgXG1lc3NhZ2V7XGxpbmVudW1iZXIgVW5kZWZpbmVkIGNyb3NzIHJlZmVyZW5jZSBgXHRoZVx0b2tzMCcufX0lCiAgICAgICBcZWxzZQogICAgICAgICBcaWZ3YXJuZWR4cmVmc1xlbHNlCiAgICAgICAgICAgXGdsb2JhbFx3YXJuZWR4cmVmc3RydWUKQEAgLTYyMDEsMTAgKzgwNzEsMTggQEAKICUgY29sbGlzaW9ucykuICBCdXQgaWYgdGhpcyBpcyBhIGZsb2F0IHR5cGUsIHdlIGhhdmUgbW9yZSB3b3JrIHRvIGRvLgogJQogXGRlZlx4cmRlZiMxIzJ7JQotICBcZXhwYW5kYWZ0ZXJcZ2RlZlxjc25hbWUgWFIjMVxlbmRjc25hbWV7IzJ9JSByZW1lbWJlciB0aGlzIHhyZWYgdmFsdWUuCisgIHslIFRoZSBub2RlIG5hbWUgbWlnaHQgY29udGFpbiA4LWJpdCBjaGFyYWN0ZXJzLCB3aGljaCBpbiBvdXIgY3VycmVudAorICAgJSBpbXBsZW1lbnRhdGlvbiBhcmUgY2hhbmdlZCB0byBjb21tYW5kcyBsaWtlIEAnZS4gIERvbid0IGxldCB0aGVzZQorICAgJSBtZXNzIHVwIHRoZSBjb250cm9sIHNlcXVlbmNlIG5hbWUuCisgICAgXGluZGV4bm9mb250cworICAgIFx0dXJub2ZmYWN0aXZlCisgICAgXHhkZWZcc2FmZXhyZWZuYW1leyMxfSUKKyAgfSUKKyAgJQorICBcZXhwYW5kYWZ0ZXJcZ2RlZlxjc25hbWUgWFJcc2FmZXhyZWZuYW1lXGVuZGNzbmFtZXsjMn0lIHJlbWVtYmVyIHRoaXMgeHJlZgogICAlCiAgICUgV2FzIHRoYXQgeHJlZiBjb250cm9sIHNlcXVlbmNlIHRoYXQgd2UganVzdCBkZWZpbmVkIGZvciBhIGZsb2F0PwotICBcZXhwYW5kYWZ0ZXJcaWZmbG9hdFxjc25hbWUgWFIjMVxlbmRjc25hbWUKKyAgXGV4cGFuZGFmdGVyXGlmZmxvYXRcY3NuYW1lIFhSXHNhZmV4cmVmbmFtZVxlbmRjc25hbWUKICAgICAlIGl0IHdhcyBhIGZsb2F0LCBhbmQgd2UgaGF2ZSB0aGUgKHNhZmUpIGZsb2F0IHR5cGUgaW4gXGlmZmxvYXR0eXBlLgogICAgIFxleHBhbmRhZnRlclxsZXRcZXhwYW5kYWZ0ZXJcZmxvYXRsaXN0CiAgICAgICBcY3NuYW1lIGZsb2F0bGlzdFxpZmZsb2F0dHlwZVxlbmRjc25hbWUKQEAgLTYyMTksNyArODA5Nyw4IEBACiAgICAgJQogICAgICUgUmVtZW1iZXIgdGhpcyB4cmVmIGluIHRoZSBjb250cm9sIHNlcXVlbmNlIFxmbG9hdGxpc3RGTE9BVFRZUEUsCiAgICAgJSBmb3IgbGF0ZXIgdXNlIGluIFxsaXN0b2ZmbG9hdHMuCi0gICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lIGZsb2F0bGlzdFxpZmZsb2F0dHlwZVxlbmRjc25hbWV7XHRoZVx0b2tzMHsjMX19JQorICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZSBmbG9hdGxpc3RcaWZmbG9hdHR5cGVcZW5kY3NuYW1le1x0aGVcdG9rczAKKyAgICAgIHtcc2FmZXhyZWZuYW1lfX0lCiAgIFxmaQogfQogCkBAIC02MzIzLDYgKzgyMDIsNyBAQAogICBcaW5wdXRcam9ibmFtZS4jMQogXGVuZGdyb3VwfQogCisKIFxtZXNzYWdle2luc2VydGlvbnMsfQogJSBpbmNsdWRpbmcgZm9vdG5vdGVzLgogCkBAIC02MzM1LDcgKzgyMTUsNyBAQAogJSBzcGFjZSB0byBwcmV2ZW50IHN0cmFuZ2UgZXhwYW5zaW9uIGVycm9ycy4pCiBcZGVmXHN1cGVyZWplY3R7XHBhclxwZW5hbHR5IC0yMDAwMFxmb290bm90ZW5vID0wIH0KIAotJSBAZm9vdG5vdGVzdHlsZSBpcyBtZWFuaW5nZnVsIGZvciBpbmZvIG91dHB1dCBvbmx5LgorJSBAZm9vdG5vdGVzdHlsZSBpcyBtZWFuaW5nZnVsIGZvciBJbmZvIG91dHB1dCBvbmx5LgogXGxldFxmb290bm90ZXN0eWxlPVxjb21tZW50CiAKIHtcY2F0Y29kZSBgXEA9MTEKQEAgLTYzOTgsNiArODI3OCw4IEBACiAgICUgZXhwYW5kcyBpbnRvIGEgYm94LCBpdCBtdXN0IGNvbWUgd2l0aGluIHRoZSBwYXJhZ3JhcGgsIGxlc3QgaXQKICAgJSBwcm92aWRlIGEgcGxhY2Ugd2hlcmUgVGVYIGNhbiBzcGxpdCB0aGUgZm9vdG5vdGUuCiAgIFxmb290c3RydXQKKyAgJQorICAlIEludm9rZSByZXN0IG9mIHBsYWluIFRlWCBmb290bm90ZSByb3V0aW5lLgogICBcZnV0dXJlbGV0XG5leHRcZm9AdAogfQogfSVlbmQgXGNhdGNvZGUgYFxAPTExCkBAIC02NDA1LDcgKzgyODcsNyBAQAogJSBJbiBjYXNlIGEgQGZvb3Rub3RlIGFwcGVhcnMgaW4gYSB2Ym94LCBzYXZlIHRoZSBmb290bm90ZSB0ZXh0IGFuZCBjcmVhdGUKICUgdGhlIHJlYWwgXGluc2VydCBqdXN0IGFmdGVyIHRoZSB2Ym94IGZpbmlzaGVkLiAgT3RoZXJ3aXNlLCB0aGUgaW5zZXJ0aW9uCiAlIHdvdWxkIGJlIGxvc3QuCi0lIFNpbWlsYXJpbHksIGlmIGEgQGZvb3Rub3RlIGFwcGVhcnMgaW5zaWRlIGFuIGFsaWdubWVudCwgc2F2ZSB0aGUgZm9vdG5vdGUKKyUgU2ltaWxhcmx5LCBpZiBhIEBmb290bm90ZSBhcHBlYXJzIGluc2lkZSBhbiBhbGlnbm1lbnQsIHNhdmUgdGhlIGZvb3Rub3RlCiAlIHRleHQgdG8gYSBib3ggYW5kIG1ha2UgdGhlIFxpbnNlcnQgd2hlbiBhIHJvdyBvZiB0aGUgdGFibGUgaXMgZmluaXNoZWQuCiAlIEFuZCB0aGUgc2FtZSBjYW4gYmUgZG9uZSBmb3Igb3RoZXIgaW5zZXJ0IGNsYXNzZXMuICAtLWthc2FsLCAxNm5vdjAzLgogCkBAIC02NDg1LDcgKzgzNjcsNyBAQAogICBpdCBmcm9tIGZ0cDovL3R1Zy5vcmcvdGV4L2Vwc2YudGV4Ln0KICUKIFxkZWZcaW1hZ2UjMXslCi0gIFxpZnhcZXBzZmJveFx1bmRlZmluZWQKKyAgXGlmeFxlcHNmYm94XHRoaXNpc3VuZGVmaW5lZAogICAgIFxpZndhcm5lZG5vZXBzZiBcZWxzZQogICAgICAgXGVycmhlbHAgPSBcbm9lcHNmaGVscAogICAgICAgXGVycm1lc3NhZ2V7ZXBzZi50ZXggbm90IGZvdW5kLCBpbWFnZXMgd2lsbCBiZSBpZ25vcmVkfSUKQEAgLTY1MDEsNyArODM4Myw3IEBACiAlICMyIGlzIChvcHRpb25hbCkgd2lkdGgsICMzIGlzIChvcHRpb25hbCkgaGVpZ2h0LgogJSAjNCBpcyAoaWdub3JlZCBvcHRpb25hbCkgaHRtbCBhbHQgdGV4dC4KICUgIzUgaXMgKGlnbm9yZWQgb3B0aW9uYWwpIGV4dGVuc2lvbi4KLSUgIzYgaXMganVzdCB0aGUgdXN1YWwgZXh0cmEgaWdub3JlZCBhcmcgZm9yIHBhcnNpbmcgdGhpcyBzdHVmZi4KKyUgIzYgaXMganVzdCB0aGUgdXN1YWwgZXh0cmEgaWdub3JlZCBhcmcgZm9yIHBhcnNpbmcgc3R1ZmYuCiBcbmV3aWZcaWZpbWFnZXZtb2RlCiBcZGVmXGltYWdleHh4IzEsIzIsIzMsIzQsIzUsIzZcZmluaXNoe1xiZWdpbmdyb3VwCiAgIFxjYXRjb2RlYFxeXk0gPSA1ICAgICAlIGluIGNhc2Ugd2UncmUgaW5zaWRlIGFuIGV4YW1wbGUKQEAgLTY1MDksMTUgKzgzOTEsMzAgQEAKICAgJSBJZiB0aGUgaW1hZ2UgaXMgYnkgaXRzZWxmLCBjZW50ZXIgaXQuCiAgIFxpZnZtb2RlCiAgICAgXGltYWdldm1vZGV0cnVlCi0gICAgXG5vYnJlYWtcYmlnc2tpcAorICBcZWxzZSBcaWZ4XGNlbnRlcnN1YlxjZW50ZXJWCisgICAgJSBmb3IgQGNlbnRlciBAaW1hZ2UsIHdlIG5lZWQgYSB2Ym94IHNvIHdlIGNhbiBoYXZlIG91ciB2ZXJ0aWNhbCBzcGFjZQorICAgIFxpbWFnZXZtb2RldHJ1ZQorICAgIFx2Ym94XGJncm91cCAlIHZib3ggaGFzIGJldHRlciBiZWhhdmlvciB0aGFuIHZ0b3AgaGVyZXYKKyAgXGZpXGZpCisgICUKKyAgXGlmaW1hZ2V2bW9kZQorICAgIFxub2JyZWFrXG1lZHNraXAKICAgICAlIFVzdWFsbHkgd2UnbGwgaGF2ZSB0ZXh0IGFmdGVyIHRoZSBpbWFnZSB3aGljaCB3aWxsIGluc2VydAogICAgICUgXHBhcnNraXAgZ2x1ZSwgc28gaW5zZXJ0IGl0IGhlcmUgdG9vIHRvIGVxdWFsaXplIHRoZSBzcGFjZQogICAgICUgYWJvdmUgYW5kIGJlbG93LgogICAgIFxub2JyZWFrXHZza2lwXHBhcnNraXAKICAgICBcbm9icmVhawotICAgIFxsaW5lXGJncm91cFxoc3MKICAgXGZpCiAgICUKKyAgJSBMZWF2ZSB2ZXJ0aWNhbCBtb2RlIHNvIHRoYXQgaW5kZW50YXRpb24gZnJvbSBhbiBlbmNsb3NpbmcKKyAgJSAgZW52aXJvbm1lbnQgc3VjaCBhcyBAcXVvdGF0aW9uIGlzIHJlc3BlY3RlZC4KKyAgJSBIb3dldmVyLCBpZiB3ZSdyZSBhdCB0aGUgdG9wIGxldmVsLCB3ZSBkb24ndCB3YW50IHRoZQorICAlICBub3JtYWwgcGFyYWdyYXBoIGluZGVudGF0aW9uLgorICAlIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB3ZSBhcmUgaW4gdGhlIGNhc2Ugb2YgQGNlbnRlciBAaW1hZ2UsIHdlIGRvbid0CisgICUgIHdhbnQgdG8gc3RhcnQgYSBwYXJhZ3JhcGgsIHdoaWNoIHdpbGwgY3JlYXRlIGEgaHNpemUtd2lkdGggYm94IGFuZAorICAlICBlcmFkaWNhdGUgdGhlIGNlbnRlcmluZy4KKyAgXGlmeFxjZW50ZXJzdWJcY2VudGVyVlxlbHNlIFxub2luZGVudCBcZmkKKyAgJQogICAlIE91dHB1dCB0aGUgaW1hZ2UuCiAgIFxpZnBkZgogICAgIFxkb3BkZmltYWdleyMxfXsjMn17IzN9JQpAQCAtNjUyOCw3ICs4NDI1LDEwIEBACiAgICAgXGVwc2Zib3h7IzEuZXBzfSUKICAgXGZpCiAgICUKLSAgXGlmaW1hZ2V2bW9kZSBcaHNzIFxlZ3JvdXAgXGJpZ2JyZWFrIFxmaSAgJSBzcGFjZSBhZnRlciB0aGUgaW1hZ2UKKyAgXGlmaW1hZ2V2bW9kZQorICAgIFxtZWRza2lwICAlIHNwYWNlIGFmdGVyIGEgc3RhbmRhbG9uZSBpbWFnZQorICBcZmkgIAorICBcaWZ4XGNlbnRlcnN1YlxjZW50ZXJWIFxlZ3JvdXAgXGZpCiBcZW5kZ3JvdXB9CiAKIApAQCAtNjU5NSwxMyArODQ5NSwxMyBAQAogICAgICAgXGdsb2JhbFxhZHZhbmNlXGZsb2F0bm8gYnkgMQogICAgICAgJQogICAgICAgeyUKLSAgICAgICAgJSBUaGlzIG1hZ2ljIHZhbHVlIGZvciBcdGhpc3NlY3Rpb24gaXMgb3V0cHV0IGJ5IFxzZXRyZWYgYXMgdGhlCisgICAgICAgICUgVGhpcyBtYWdpYyB2YWx1ZSBmb3IgXGxhc3RzZWN0aW9uIGlzIG91dHB1dCBieSBcc2V0cmVmIGFzIHRoZQogICAgICAgICAlIFhSRUZMQUJFTC10aXRsZSB2YWx1ZS4gIFx4cmVmWCB1c2VzIGl0IHRvIGRpc3Rpbmd1aXNoIGZsb2F0CiAgICAgICAgICUgbGFiZWxzICh3aGljaCBoYXZlIGEgY29tcGxldGVseSBkaWZmZXJlbnQgb3V0cHV0IGZvcm1hdCkgZnJvbQogICAgICAgICAlIG5vZGUgYW5kIGFuY2hvciBsYWJlbHMuICBBbmQgXHhyZGVmIHVzZXMgaXQgdG8gY29uc3RydWN0IHRoZQogICAgICAgICAlIGxpc3RzIG9mIGZsb2F0cy4KICAgICAgICAgJQotICAgICAgICBcZWRlZlx0aGlzc2VjdGlvbntcZmxvYXRtYWdpYz1cc2FmZWZsb2F0dHlwZX0lCisgICAgICAgIFxlZGVmXGxhc3RzZWN0aW9ue1xmbG9hdG1hZ2ljPVxzYWZlZmxvYXR0eXBlfSUKICAgICAgICAgXHNldHJlZntcZmxvYXRsYWJlbH17WWZsb2F0fSUKICAgICAgIH0lCiAgICAgXGZpCkBAIC02NjY5LDYgKzg1NjksNyBAQAogICAgICAgJSBjYXB0aW9uIGlmIHNwZWNpZmllZCwgZWxzZSB0aGUgZnVsbCBjYXB0aW9uIGlmIHNwZWNpZmllZCwgZWxzZSBub3RoaW5nLgogICAgICAgeyUKICAgICAgICAgXGF0ZHVtbWllcworICAgICAgICAlCiAgICAgICAgICUgc2luY2Ugd2UgcmVhZCB0aGUgY2FwdGlvbiB0ZXh0IGluIHRoZSBtYWNybyB3b3JsZCwgd2hlcmUgXl5NCiAgICAgICAgICUgaXMgdHVybmVkIGludG8gYSBub3JtYWwgY2hhcmFjdGVyLCB3ZSBoYXZlIHRvIHNjYW4gaXQgYmFjaywgc28KICAgICAgICAgJSB3ZSBkb24ndCB3cml0ZSB0aGUgbGl0ZXJhbCB0aHJlZSBjaGFyYWN0ZXJzICJeXk0iIGludG8gdGhlIGF1eCBmaWxlLgpAQCAtNjY4OSw4ICs4NTkwLDkgQEAKICAgJQogICAlIHBsYWNlIHRoZSBjYXB0dXJlZCBpbnNlcnRzCiAgICUKLSAgJSBCRVdBUkU6IHdoZW4gdGhlIGZsb2F0cyBzdGFydCBmbG9hdCwgd2UgaGF2ZSB0byBpc3N1ZSB3YXJuaW5nIHdoZW5ldmVyIGFuCi0gICUgaW5zZXJ0IGFwcGVhcnMgaW5zaWRlIGEgZmxvYXQgd2hpY2ggY291bGQgcG9zc2libHkgZmxvYXQuIC0ta2FzYWwsIDI2bWF5MDQKKyAgJSBCRVdBUkU6IHdoZW4gdGhlIGZsb2F0cyBzdGFydCBmbG9hdGluZywgd2UgaGF2ZSB0byBpc3N1ZSB3YXJuaW5nCisgICUgd2hlbmV2ZXIgYW4gaW5zZXJ0IGFwcGVhcnMgaW5zaWRlIGEgZmxvYXQgd2hpY2ggY291bGQgcG9zc2libHkKKyAgJSBmbG9hdC4gLS1rYXNhbCwgMjZtYXkwNAogICAlCiAgIFxjaGVja2luc2VydHMKIH0KQEAgLTY3MzQsNyArODYzNiw3IEBACiAKICUgIzEgaXMgdGhlIGNvbnRyb2wgc2VxdWVuY2Ugd2UgYXJlIHBhc3NlZDsgd2UgZXhwYW5kIGludG8gYSBjb25kaXRpb25hbAogJSB3aGljaCBpcyB0cnVlIGlmICMxIHJlcHJlc2VudHMgYSBmbG9hdCByZWYuICBUaGF0IGlzLCB0aGUgbWFnaWMKLSUgXHRoaXNzZWN0aW9uIHZhbHVlIHdoaWNoIHdlIFxzZXRyZWYgYWJvdmUuCislIFxsYXN0c2VjdGlvbiB2YWx1ZSB3aGljaCB3ZSBcc2V0cmVmIGFib3ZlLgogJQogXGRlZlxpZmZsb2F0IzF7XGV4cGFuZGFmdGVyXGRvaWZmbG9hdCMxPT1cZmluaXNofQogJQpAQCAtNjc5NSwzOSArODY5Nyw5MDkgQEAKICAgXHdyaXRlZW50cnkKIH19CiAKLVxtZXNzYWdle2xvY2FsaXphdGlvbix9Ci0lIGFuZCBpMThuLgogCi0lIEBkb2N1bWVudGxhbmd1YWdlIGlzIHVzdWFsbHkgZ2l2ZW4gdmVyeSBlYXJseSwganVzdCBhZnRlcgotJSBAc2V0ZmlsZW5hbWUuICBJZiBkb25lIHRvbyBsYXRlLCBpdCBtYXkgbm90IG92ZXJyaWRlIGV2ZXJ5dGhpbmcKLSUgcHJvcGVybHkuICBTaW5nbGUgYXJndW1lbnQgaXMgdGhlIGxhbmd1YWdlIGFiYnJldmlhdGlvbi4KLSUgSXQgd291bGQgYmUgbmljZSBpZiB3ZSBjb3VsZCBzZXQgdXAgYSBoeXBoZW5hdGlvbiBmaWxlIGhlcmUuCitcbWVzc2FnZXtsb2NhbGl6YXRpb24sfQorCislIEZvciBzaW5nbGUtbGFuZ3VhZ2UgZG9jdW1lbnRzLCBAZG9jdW1lbnRsYW5ndWFnZSBpcyB1c3VhbGx5IGdpdmVuIHZlcnkKKyUgZWFybHksIGp1c3QgYWZ0ZXIgQGRvY3VtZW50ZW5jb2RpbmcuICBTaW5nbGUgYXJndW1lbnQgaXMgdGhlIGxhbmd1YWdlCislIChkZSkgb3IgbG9jYWxlIChkZV9ERSkgYWJicmV2aWF0aW9uLgogJQotXHBhcnNlYXJnZGVmXGRvY3VtZW50bGFuZ3VhZ2V7JQoreworICBcY2F0Y29kZWBcXyA9IFxhY3RpdmUKKyAgXGdsb2JhbGRlZnM9MQorXHBhcnNlYXJnZGVmXGRvY3VtZW50bGFuZ3VhZ2V7XGJlZ2luZ3JvdXAKKyAgXGxldF89XG5vcm1hbHVuZGVyc2NvcmUgICUgbm9ybWFsIF8gY2hhcmFjdGVyIGZvciBmaWxlbmFtZXMKICAgXHRleCAlIHJlYWQgdHhpLT8/LnRleCBmaWxlIGluIHBsYWluIFRlWC4KLSAgICAlIFJlYWQgdGhlIGZpbGUgaWYgaXQgZXhpc3RzLgorICAgICUgUmVhZCB0aGUgZmlsZSBieSB0aGUgbmFtZSB0aGV5IHBhc3NlZCBpZiBpdCBleGlzdHMuCiAgICAgXG9wZW5pbiAxIHR4aS0jMS50ZXgKICAgICBcaWZlb2YgMQotICAgICAgXGVycmhlbHAgPSBcbm9sYW5naGVscAotICAgICAgXGVycm1lc3NhZ2V7Q2Fubm90IHJlYWQgbGFuZ3VhZ2UgZmlsZSB0eGktIzEudGV4fSUKKyAgICAgIFxkb2N1bWVudGxhbmd1YWdldHJ5d2l0aG91dHVuZGVyc2NvcmV7IzFfXGZpbmlzaH0lCiAgICAgXGVsc2UKKyAgICAgIFxnbG9iYWxkZWZzID0gMSAgJSBldmVyeXRoaW5nIGluIHRoZSB0eGktTEwgZmlsZXMgbmVlZHMgdG8gcGVyc2lzdAogICAgICAgXGlucHV0IHR4aS0jMS50ZXgKICAgICBcZmkKICAgICBcY2xvc2VpbiAxCi0gIFxlbmRncm91cAotfQotXG5ld2hlbHBcbm9sYW5naGVscHtUaGUgZ2l2ZW4gbGFuZ3VhZ2UgZGVmaW5pdGlvbiBmaWxlIGNhbm5vdCBiZSBmb3VuZCBvcgotaXMgZW1wdHkuICBNYXliZSB5b3UgbmVlZCB0byBpbnN0YWxsIGl0PyAgSW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5Ci1zaG91bGQgd29yayBpZiBub3doZXJlIGVsc2UgZG9lcy59Ci0KLQotJSBAZG9jdW1lbnRlbmNvZGluZyBzaG91bGQgY2hhbmdlIHNvbWV0aGluZyBpbiBUZVggZXZlbnR1YWxseSwgbW9zdAotJSBsaWtlbHksIGJ1dCBmb3Igbm93IGp1c3QgcmVjb2duaXplIGl0LgotXGxldFxkb2N1bWVudGVuY29kaW5nID0gXGNvbW1lbnQKLQotCi0lIFBhZ2Ugc2l6ZSBwYXJhbWV0ZXJzLgorICBcZW5kZ3JvdXAgJSBlbmQgcmF3IFRlWAorXGVuZGdyb3VwfQogJQorJSBJZiB0aGV5IHBhc3NlZCBkZV9ERSwgYW5kIHR4aS1kZV9ERS50ZXggZG9lc24ndCBleGlzdCwKKyUgdHJ5IHR4aS1kZS50ZXguCislCitcZ2RlZlxkb2N1bWVudGxhbmd1YWdldHJ5d2l0aG91dHVuZGVyc2NvcmUjMV8jMlxmaW5pc2h7JQorICBcb3BlbmluIDEgdHhpLSMxLnRleAorICBcaWZlb2YgMQorICAgIFxlcnJoZWxwID0gXG5vbGFuZ2hlbHAKKyAgICBcZXJybWVzc2FnZXtDYW5ub3QgcmVhZCBsYW5ndWFnZSBmaWxlIHR4aS0jMS50ZXh9JQorICBcZWxzZQorICAgIFxnbG9iYWxkZWZzID0gMSAgJSBldmVyeXRoaW5nIGluIHRoZSB0eGktTEwgZmlsZXMgbmVlZHMgdG8gcGVyc2lzdAorICAgIFxpbnB1dCB0eGktIzEudGV4CisgIFxmaQorICBcY2xvc2VpbiAxCit9Cit9JSBlbmQgb2Ygc3BlY2lhbCBfIGNhdGNvZGUKKyUKK1xuZXdoZWxwXG5vbGFuZ2hlbHB7VGhlIGdpdmVuIGxhbmd1YWdlIGRlZmluaXRpb24gZmlsZSBjYW5ub3QgYmUgZm91bmQgb3IKK2lzIGVtcHR5LiAgTWF5YmUgeW91IG5lZWQgdG8gaW5zdGFsbCBpdD8gIFB1dHRpbmcgaXQgaW4gdGhlIGN1cnJlbnQKK2RpcmVjdG9yeSBzaG91bGQgd29yayBpZiBub3doZXJlIGVsc2UgZG9lcy59CisKKyUgVGhpcyBtYWNybyBpcyBjYWxsZWQgZnJvbSB0eGktPz8udGV4IGZpbGVzOyB0aGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlCislIFxsYW5ndWFnZSBuYW1lIHRvIHNldCAod2l0aG91dCB0aGUgIlxsYW5nQCIgcHJlZml4KSwgdGhlIHNlY29uZCBhbmQKKyUgdGhpcmQgYXJncyBhcmUgXHtsZWZ0LHJpZ2h0fWh5cGhlbm1pbi4KKyUKKyUgVGhlIGxhbmd1YWdlIG5hbWVzIHRvIHBhc3MgYXJlIGRldGVybWluZWQgd2hlbiB0aGUgZm9ybWF0IGlzIGJ1aWx0LgorJSBTZWUgdGhlIGV0ZXgubG9nIGZpbGUgY3JlYXRlZCBhdCB0aGF0IHRpbWUsIGUuZy4sCislIC91c3IvbG9jYWwvdGV4bGl2ZS8yMDA4L3RleG1mLXZhci93ZWIyYy9wZGZ0ZXgvZXRleC5sb2cuCislCislIFdpdGggVGVYIExpdmUgMjAwOCwgZXRleCBub3cgaW5jbHVkZXMgaHlwaGVuYXRpb24gcGF0dGVybnMgZm9yIGFsbAorJSBhdmFpbGFibGUgbGFuZ3VhZ2VzLiAgVGhpcyBtZWFucyB3ZSBjYW4gc3VwcG9ydCBoeXBoZW5hdGlvbiBpbgorJSBUZXhpbmZvLCBhdCBsZWFzdCB0byBzb21lIGV4dGVudC4gIChUaGlzIHN0aWxsIGRvZXNuJ3Qgc29sdmUgdGhlCislIGFjY2VudGVkIGNoYXJhY3RlcnMgcHJvYmxlbS4pCislCitcY2F0Y29kZWBAPTExCitcZGVmXHR4aXNldGxhbmd1YWdlIzEjMiMzeyUKKyAgJSBkbyBub3Qgc2V0IHRoZSBsYW5ndWFnZSBpZiB0aGUgbmFtZSBpcyB1bmRlZmluZWQgaW4gdGhlIGN1cnJlbnQgVGVYLgorICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBsYW5nQCMxXGVuZGNzbmFtZSBccmVsYXgKKyAgICBcbWVzc2FnZXtubyBwYXR0ZXJucyBmb3IgIzF9JQorICBcZWxzZQorICAgIFxnbG9iYWxcbGFuZ3VhZ2UgPSBcY3NuYW1lIGxhbmdAIzFcZW5kY3NuYW1lCisgIFxmaQorICAlIGJ1dCB0aGVyZSBpcyBubyBoYXJtIGluIGFkanVzdGluZyB0aGUgaHlwaGVubWluIHZhbHVlcyByZWdhcmRsZXNzLgorICBcZ2xvYmFsXGxlZnRoeXBoZW5taW4gPSAjMlxyZWxheAorICBcZ2xvYmFsXHJpZ2h0aHlwaGVubWluID0gIzNccmVsYXgKK30KKworJSBIZWxwZXJzIGZvciBlbmNvZGluZ3MuCislIFNldCB0aGUgY2F0Y29kZSBvZiBjaGFyYWN0ZXJzIDEyOCB0aHJvdWdoIDI1NSB0byB0aGUgc3BlY2lmaWVkIG51bWJlci4KKyUKK1xkZWZcc2V0bm9uYXNjaWljaGFyc2NhdGNvZGUjMXslCisgICBcY291bnQyNTU9MTI4CisgICBcbG9vcFxpZm51bVxjb3VudDI1NTwyNTYKKyAgICAgIFxnbG9iYWxcY2F0Y29kZVxjb3VudDI1NT0jMVxyZWxheAorICAgICAgXGFkdmFuY2VcY291bnQyNTUgYnkgMQorICAgXHJlcGVhdAorfQorCitcZGVmXHNldG5vbmFzY2lpY2hhcnNjYXRjb2Rlbm9uZ2xvYmFsIzF7JQorICAgXGNvdW50MjU1PTEyOAorICAgXGxvb3BcaWZudW1cY291bnQyNTU8MjU2CisgICAgICBcY2F0Y29kZVxjb3VudDI1NT0jMVxyZWxheAorICAgICAgXGFkdmFuY2VcY291bnQyNTUgYnkgMQorICAgXHJlcGVhdAorfQorCislIEBkb2N1bWVudGVuY29kaW5nIHNldHMgdGhlIGRlZmluaXRpb24gb2Ygbm9uLUFTQ0lJIGNoYXJhY3RlcnMKKyUgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcuCislCitccGFyc2VhcmdkZWZcZG9jdW1lbnRlbmNvZGluZ3slCisgICUgRW5jb2RpbmcgYmVpbmcgZGVjbGFyZWQgZm9yIHRoZSBkb2N1bWVudC4KKyAgXGRlZlxkZWNsYXJlZGVuY29kaW5ne1xjc25hbWUgIzEuZW5jXGVuZGNzbmFtZX0lCisgICUKKyAgJSBTdXBwb3J0ZWQgZW5jb2RpbmdzOiBuYW1lcyBjb252ZXJ0ZWQgdG8gdG9rZW5zIGluIG9yZGVyIHRvIGJlIGFibGUKKyAgJSB0byBjb21wYXJlIHRoZW0gd2l0aCBcaWZ4LgorICBcZGVmXGFzY2lpe1xjc25hbWUgVVMtQVNDSUkuZW5jXGVuZGNzbmFtZX0lCisgIFxkZWZcbGF0bmluZXtcY3NuYW1lIElTTy04ODU5LTE1LmVuY1xlbmRjc25hbWV9JQorICBcZGVmXGxhdG9uZXtcY3NuYW1lIElTTy04ODU5LTEuZW5jXGVuZGNzbmFtZX0lCisgIFxkZWZcbGF0dHdve1xjc25hbWUgSVNPLTg4NTktMi5lbmNcZW5kY3NuYW1lfSUKKyAgXGRlZlx1dGZlaWdodHtcY3NuYW1lIFVURi04LmVuY1xlbmRjc25hbWV9JQorICAlCisgIFxpZnggXGRlY2xhcmVkZW5jb2RpbmcgXGFzY2lpCisgICAgIFxhc2NpaWNoYXJkZWZzCisgICUKKyAgXGVsc2UgXGlmeCBcZGVjbGFyZWRlbmNvZGluZyBcbGF0dHdvCisgICAgIFxzZXRub25hc2NpaWNoYXJzY2F0Y29kZVxhY3RpdmUKKyAgICAgXGxhdHR3b2NoYXJkZWZzCisgICUKKyAgXGVsc2UgXGlmeCBcZGVjbGFyZWRlbmNvZGluZyBcbGF0b25lCisgICAgIFxzZXRub25hc2NpaWNoYXJzY2F0Y29kZVxhY3RpdmUKKyAgICAgXGxhdG9uZWNoYXJkZWZzCisgICUKKyAgXGVsc2UgXGlmeCBcZGVjbGFyZWRlbmNvZGluZyBcbGF0bmluZQorICAgICBcc2V0bm9uYXNjaWljaGFyc2NhdGNvZGVcYWN0aXZlCisgICAgIFxsYXRuaW5lY2hhcmRlZnMKKyAgJQorICBcZWxzZSBcaWZ4IFxkZWNsYXJlZGVuY29kaW5nIFx1dGZlaWdodAorICAgICBcc2V0bm9uYXNjaWljaGFyc2NhdGNvZGVcYWN0aXZlCisgICAgIFx1dGZlaWdodGNoYXJkZWZzCisgICUKKyAgXGVsc2UKKyAgICBcbWVzc2FnZXtVbmtub3duIGRvY3VtZW50IGVuY29kaW5nICMxLCBpZ25vcmluZy59JQorICAlCisgIFxmaSAlIHV0ZmVpZ2h0CisgIFxmaSAlIGxhdG5pbmUKKyAgXGZpICUgbGF0b25lCisgIFxmaSAlIGxhdHR3bworICBcZmkgJSBhc2NpaQorfQorCislIEEgbWVzc2FnZSB0byBiZSBsb2dnZWQgd2hlbiB1c2luZyBhIGNoYXJhY3RlciB0aGF0IGlzbid0IGF2YWlsYWJsZQorJSB0aGUgZGVmYXVsdCBmb250IGVuY29kaW5nIChPVDEpLgorJQorXGRlZlxtaXNzaW5nY2hhcm1zZyMxe1xtZXNzYWdle0NoYXJhY3RlciBtaXNzaW5nIGluIE9UMSBlbmNvZGluZzogIzEufX0KKworJSBUYWtlIGFjY291bnQgb2YgXGMgKHBsYWluKSB2cy4gXCwgKFRleGluZm8pIGRpZmZlcmVuY2UuCitcZGVmXGNlZGlsbGEjMXtcaWZ4XGNccHRleGNcY3sjMX1cZWxzZVwseyMxfVxmaX0KKworJSBGaXJzdCwgbWFrZSBhY3RpdmUgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgaW4gb3JkZXIgZm9yIHRoZW0gdG8gYmUKKyUgY29ycmVjdGx5IGNhdGVnb3JpemVkIHdoZW4gVGVYIHJlYWRzIHRoZSByZXBsYWNlbWVudCB0ZXh0IG9mCislIG1hY3JvcyBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXIgZGVmaW5pdGlvbnMuCitcc2V0bm9uYXNjaWljaGFyc2NhdGNvZGVcYWN0aXZlCislCislIExhdGluMSAoSVNPLTg4NTktMSkgY2hhcmFjdGVyIGRlZmluaXRpb25zLgorXGRlZlxsYXRvbmVjaGFyZGVmc3slCisgIFxnZGVmXl5hMHtcdGllfQorICBcZ2RlZl5eYTF7XGV4Y2xhbWRvd259CisgIFxnZGVmXl5hMntcbWlzc2luZ2NoYXJtc2d7Q0VOVCBTSUdOfX0KKyAgXGdkZWZeXmEze3tccG91bmRzfX0KKyAgXGdkZWZeXmE0e1xtaXNzaW5nY2hhcm1zZ3tDVVJSRU5DWSBTSUdOfX0KKyAgXGdkZWZeXmE1e1xtaXNzaW5nY2hhcm1zZ3tZRU4gU0lHTn19CisgIFxnZGVmXl5hNntcbWlzc2luZ2NoYXJtc2d7QlJPS0VOIEJBUn19CisgIFxnZGVmXl5hN3tcU30KKyAgXGdkZWZeXmE4e1wie319CisgIFxnZGVmXl5hOXtcY29weXJpZ2h0fQorICBcZ2RlZl5eYWF7XG9yZGZ9CisgIFxnZGVmXl5hYntcZ3VpbGxlbWV0bGVmdH0KKyAgXGdkZWZeXmFjeyRcbG5vdCR9CisgIFxnZGVmXl5hZHtcLX0KKyAgXGdkZWZeXmFle1xyZWdpc3RlcmVkc3ltYm9sfQorICBcZ2RlZl5eYWZ7XD17fX0KKyAgJQorICBcZ2RlZl5eYjB7XHRleHRkZWdyZWV9CisgIFxnZGVmXl5iMXskXHBtJH0KKyAgXGdkZWZeXmIyeyReMiR9CisgIFxnZGVmXl5iM3skXjMkfQorICBcZ2RlZl5eYjR7XCd7fX0KKyAgXGdkZWZeXmI1eyRcbXUkfQorICBcZ2RlZl5eYjZ7XFB9CisgICUKKyAgXGdkZWZeXmI3eyReLiR9CisgIFxnZGVmXl5iOHtcY2VkaWxsYVwgfQorICBcZ2RlZl5eYjl7JF4xJH0KKyAgXGdkZWZeXmJhe1xvcmRtfQorICAlCisgIFxnZGVmXl5iYntcZ3VpbGxlbWV0cmlnaHR9CisgIFxnZGVmXl5iY3skMVxvdmVyNCR9CisgIFxnZGVmXl5iZHskMVxvdmVyMiR9CisgIFxnZGVmXl5iZXskM1xvdmVyNCR9CisgIFxnZGVmXl5iZntccXVlc3Rpb25kb3dufQorICAlCisgIFxnZGVmXl5jMHtcYEF9CisgIFxnZGVmXl5jMXtcJ0F9CisgIFxnZGVmXl5jMntcXkF9CisgIFxnZGVmXl5jM3tcfkF9CisgIFxnZGVmXl5jNHtcIkF9CisgIFxnZGVmXl5jNXtccmluZ2FjY2VudCBBfQorICBcZ2RlZl5eYzZ7XEFFfQorICBcZ2RlZl5eYzd7XGNlZGlsbGEgQ30KKyAgXGdkZWZeXmM4e1xgRX0KKyAgXGdkZWZeXmM5e1wnRX0KKyAgXGdkZWZeXmNhe1xeRX0KKyAgXGdkZWZeXmNie1wiRX0KKyAgXGdkZWZeXmNje1xgSX0KKyAgXGdkZWZeXmNke1wnSX0KKyAgXGdkZWZeXmNle1xeSX0KKyAgXGdkZWZeXmNme1wiSX0KKyAgJQorICBcZ2RlZl5eZDB7XERIfQorICBcZ2RlZl5eZDF7XH5OfQorICBcZ2RlZl5eZDJ7XGBPfQorICBcZ2RlZl5eZDN7XCdPfQorICBcZ2RlZl5eZDR7XF5PfQorICBcZ2RlZl5eZDV7XH5PfQorICBcZ2RlZl5eZDZ7XCJPfQorICBcZ2RlZl5eZDd7JFx0aW1lcyR9CisgIFxnZGVmXl5kOHtcT30KKyAgXGdkZWZeXmQ5e1xgVX0KKyAgXGdkZWZeXmRhe1wnVX0KKyAgXGdkZWZeXmRie1xeVX0KKyAgXGdkZWZeXmRje1wiVX0KKyAgXGdkZWZeXmRke1wnWX0KKyAgXGdkZWZeXmRle1xUSH0KKyAgXGdkZWZeXmRme1xzc30KKyAgJQorICBcZ2RlZl5eZTB7XGBhfQorICBcZ2RlZl5eZTF7XCdhfQorICBcZ2RlZl5eZTJ7XF5hfQorICBcZ2RlZl5eZTN7XH5hfQorICBcZ2RlZl5eZTR7XCJhfQorICBcZ2RlZl5eZTV7XHJpbmdhY2NlbnQgYX0KKyAgXGdkZWZeXmU2e1xhZX0KKyAgXGdkZWZeXmU3e1xjZWRpbGxhIGN9CisgIFxnZGVmXl5lOHtcYGV9CisgIFxnZGVmXl5lOXtcJ2V9CisgIFxnZGVmXl5lYXtcXmV9CisgIFxnZGVmXl5lYntcImV9CisgIFxnZGVmXl5lY3tcYHtcZG90bGVzcyBpfX0KKyAgXGdkZWZeXmVke1wne1xkb3RsZXNzIGl9fQorICBcZ2RlZl5eZWV7XF57XGRvdGxlc3MgaX19CisgIFxnZGVmXl5lZntcIntcZG90bGVzcyBpfX0KKyAgJQorICBcZ2RlZl5eZjB7XGRofQorICBcZ2RlZl5eZjF7XH5ufQorICBcZ2RlZl5eZjJ7XGBvfQorICBcZ2RlZl5eZjN7XCdvfQorICBcZ2RlZl5eZjR7XF5vfQorICBcZ2RlZl5eZjV7XH5vfQorICBcZ2RlZl5eZjZ7XCJvfQorICBcZ2RlZl5eZjd7JFxkaXYkfQorICBcZ2RlZl5eZjh7XG99CisgIFxnZGVmXl5mOXtcYHV9CisgIFxnZGVmXl5mYXtcJ3V9CisgIFxnZGVmXl5mYntcXnV9CisgIFxnZGVmXl5mY3tcInV9CisgIFxnZGVmXl5mZHtcJ3l9CisgIFxnZGVmXl5mZXtcdGh9CisgIFxnZGVmXl5mZntcInl9Cit9CisKKyUgTGF0aW45IChJU08tODg1OS0xNSkgZW5jb2RpbmcgY2hhcmFjdGVyIGRlZmluaXRpb25zLgorXGRlZlxsYXRuaW5lY2hhcmRlZnN7JQorICAlIEVuY29kaW5nIGlzIGFsbW9zdCBpZGVudGljYWwgdG8gTGF0aW4xLgorICBcbGF0b25lY2hhcmRlZnMKKyAgJQorICBcZ2RlZl5eYTR7XGV1cm99CisgIFxnZGVmXl5hNntcdiBTfQorICBcZ2RlZl5eYTh7XHYgc30KKyAgXGdkZWZeXmI0e1x2IFp9CisgIFxnZGVmXl5iOHtcdiB6fQorICBcZ2RlZl5eYmN7XE9FfQorICBcZ2RlZl5eYmR7XG9lfQorICBcZ2RlZl5eYmV7XCJZfQorfQorCislIExhdGluMiAoSVNPLTg4NTktMikgY2hhcmFjdGVyIGRlZmluaXRpb25zLgorXGRlZlxsYXR0d29jaGFyZGVmc3slCisgIFxnZGVmXl5hMHtcdGllfQorICBcZ2RlZl5eYTF7XG9nb25la3tBfX0KKyAgXGdkZWZeXmEye1x1e319CisgIFxnZGVmXl5hM3tcTH0KKyAgXGdkZWZeXmE0e1xtaXNzaW5nY2hhcm1zZ3tDVVJSRU5DWSBTSUdOfX0KKyAgXGdkZWZeXmE1e1x2IEx9CisgIFxnZGVmXl5hNntcJ1N9CisgIFxnZGVmXl5hN3tcU30KKyAgXGdkZWZeXmE4e1wie319CisgIFxnZGVmXl5hOXtcdiBTfQorICBcZ2RlZl5eYWF7XGNlZGlsbGEgU30KKyAgXGdkZWZeXmFie1x2IFR9CisgIFxnZGVmXl5hY3tcJ1p9CisgIFxnZGVmXl5hZHtcLX0KKyAgXGdkZWZeXmFle1x2IFp9CisgIFxnZGVmXl5hZntcZG90YWNjZW50IFp9CisgICUKKyAgXGdkZWZeXmIwe1x0ZXh0ZGVncmVlfQorICBcZ2RlZl5eYjF7XG9nb25la3thfX0KKyAgXGdkZWZeXmIye1xvZ29uZWt7IH19CisgIFxnZGVmXl5iM3tcbH0KKyAgXGdkZWZeXmI0e1wne319CisgIFxnZGVmXl5iNXtcdiBsfQorICBcZ2RlZl5eYjZ7XCdzfQorICBcZ2RlZl5eYjd7XHZ7fX0KKyAgXGdkZWZeXmI4e1xjZWRpbGxhXCB9CisgIFxnZGVmXl5iOXtcdiBzfQorICBcZ2RlZl5eYmF7XGNlZGlsbGEgc30KKyAgXGdkZWZeXmJie1x2IHR9CisgIFxnZGVmXl5iY3tcJ3p9CisgIFxnZGVmXl5iZHtcSHt9fQorICBcZ2RlZl5eYmV7XHYgen0KKyAgXGdkZWZeXmJme1xkb3RhY2NlbnQgen0KKyAgJQorICBcZ2RlZl5eYzB7XCdSfQorICBcZ2RlZl5eYzF7XCdBfQorICBcZ2RlZl5eYzJ7XF5BfQorICBcZ2RlZl5eYzN7XHUgQX0KKyAgXGdkZWZeXmM0e1wiQX0KKyAgXGdkZWZeXmM1e1wnTH0KKyAgXGdkZWZeXmM2e1wnQ30KKyAgXGdkZWZeXmM3e1xjZWRpbGxhIEN9CisgIFxnZGVmXl5jOHtcdiBDfQorICBcZ2RlZl5eYzl7XCdFfQorICBcZ2RlZl5eY2F7XG9nb25la3tFfX0KKyAgXGdkZWZeXmNie1wiRX0KKyAgXGdkZWZeXmNje1x2IEV9CisgIFxnZGVmXl5jZHtcJ0l9CisgIFxnZGVmXl5jZXtcXkl9CisgIFxnZGVmXl5jZntcdiBEfQorICAlCisgIFxnZGVmXl5kMHtcREh9CisgIFxnZGVmXl5kMXtcJ059CisgIFxnZGVmXl5kMntcdiBOfQorICBcZ2RlZl5eZDN7XCdPfQorICBcZ2RlZl5eZDR7XF5PfQorICBcZ2RlZl5eZDV7XEggT30KKyAgXGdkZWZeXmQ2e1wiT30KKyAgXGdkZWZeXmQ3eyRcdGltZXMkfQorICBcZ2RlZl5eZDh7XHYgUn0KKyAgXGdkZWZeXmQ5e1xyaW5nYWNjZW50IFV9CisgIFxnZGVmXl5kYXtcJ1V9CisgIFxnZGVmXl5kYntcSCBVfQorICBcZ2RlZl5eZGN7XCJVfQorICBcZ2RlZl5eZGR7XCdZfQorICBcZ2RlZl5eZGV7XGNlZGlsbGEgVH0KKyAgXGdkZWZeXmRme1xzc30KKyAgJQorICBcZ2RlZl5eZTB7XCdyfQorICBcZ2RlZl5eZTF7XCdhfQorICBcZ2RlZl5eZTJ7XF5hfQorICBcZ2RlZl5eZTN7XHUgYX0KKyAgXGdkZWZeXmU0e1wiYX0KKyAgXGdkZWZeXmU1e1wnbH0KKyAgXGdkZWZeXmU2e1wnY30KKyAgXGdkZWZeXmU3e1xjZWRpbGxhIGN9CisgIFxnZGVmXl5lOHtcdiBjfQorICBcZ2RlZl5eZTl7XCdlfQorICBcZ2RlZl5eZWF7XG9nb25la3tlfX0KKyAgXGdkZWZeXmVie1wiZX0KKyAgXGdkZWZeXmVje1x2IGV9CisgIFxnZGVmXl5lZHtcJ3tcZG90bGVzc3tpfX19CisgIFxnZGVmXl5lZXtcXntcZG90bGVzc3tpfX19CisgIFxnZGVmXl5lZntcdiBkfQorICAlCisgIFxnZGVmXl5mMHtcZGh9CisgIFxnZGVmXl5mMXtcJ259CisgIFxnZGVmXl5mMntcdiBufQorICBcZ2RlZl5eZjN7XCdvfQorICBcZ2RlZl5eZjR7XF5vfQorICBcZ2RlZl5eZjV7XEggb30KKyAgXGdkZWZeXmY2e1wib30KKyAgXGdkZWZeXmY3eyRcZGl2JH0KKyAgXGdkZWZeXmY4e1x2IHJ9CisgIFxnZGVmXl5mOXtccmluZ2FjY2VudCB1fQorICBcZ2RlZl5eZmF7XCd1fQorICBcZ2RlZl5eZmJ7XEggdX0KKyAgXGdkZWZeXmZje1widX0KKyAgXGdkZWZeXmZke1wneX0KKyAgXGdkZWZeXmZle1xjZWRpbGxhIHR9CisgIFxnZGVmXl5mZntcZG90YWNjZW50e319Cit9CisKKyUgVVRGLTggY2hhcmFjdGVyIGRlZmluaXRpb25zLgorJQorJSBUaGlzIGNvZGUgdG8gc3VwcG9ydCBVVEYtOCBpcyBiYXNlZCBvbiBMYVRlWCdzIHV0ZjguZGVmLCB3aXRoIHNvbWUKKyUgY2hhbmdlcyBmb3IgVGV4aW5mbyBjb252ZW50aW9ucy4gIEl0IGlzIGluY2x1ZGVkIGhlcmUgdW5kZXIgdGhlIEdQTCBieQorJSBwZXJtaXNzaW9uIGZyb20gRnJhbmsgTWl0dGVsYmFjaCBhbmQgdGhlIExhVGVYIHRlYW0uCislCitcbmV3Y291bnRcY291bnRVVEZ4CitcbmV3Y291bnRcY291bnRVVEZ5CitcbmV3Y291bnRcY291bnRVVEZ6CisKK1xnZGVmXFVURnZpaWlUd29PY3RldHMjMSMye1xleHBhbmRhZnRlcgorICAgXFVURnZpaWlEZWZpbmVkXGNzbmFtZSB1ODojMVxzdHJpbmcgIzJcZW5kY3NuYW1lfQorJQorXGdkZWZcVVRGdmlpaVRocmVlT2N0ZXRzIzEjMiMze1xleHBhbmRhZnRlcgorICAgXFVURnZpaWlEZWZpbmVkXGNzbmFtZSB1ODojMVxzdHJpbmcgIzJcc3RyaW5nICMzXGVuZGNzbmFtZX0KKyUKK1xnZGVmXFVURnZpaWlGb3VyT2N0ZXRzIzEjMiMzIzR7XGV4cGFuZGFmdGVyCisgICBcVVRGdmlpaURlZmluZWRcY3NuYW1lIHU4OiMxXHN0cmluZyAjMlxzdHJpbmcgIzNcc3RyaW5nICM0XGVuZGNzbmFtZX0KKworXGdkZWZcVVRGdmlpaURlZmluZWQjMXslCisgIFxpZnggIzFccmVsYXgKKyAgICBcbWVzc2FnZXtcbGluZW51bWJlciBVbmljb2RlIGNoYXIgXHN0cmluZyAjMSBub3QgZGVmaW5lZCBmb3IgVGV4aW5mb30lCisgIFxlbHNlCisgICAgXGV4cGFuZGFmdGVyICMxJQorICBcZmkKK30KKworXGJlZ2luZ3JvdXAKKyAgXGNhdGNvZGVgXH4xMworICBcY2F0Y29kZWBcIjEyCisKKyAgXGRlZlxVVEZ2aWlpTG9vcHslCisgICAgXGdsb2JhbFxjYXRjb2RlXGNvdW50VVRGeFxhY3RpdmUKKyAgICBcdWNjb2RlYFx+XGNvdW50VVRGeAorICAgIFx1cHBlcmNhc2VcZXhwYW5kYWZ0ZXJ7XFVURnZpaWlUbXB9JQorICAgIFxhZHZhbmNlXGNvdW50VVRGeCBieSAxCisgICAgXGlmbnVtXGNvdW50VVRGeCA8IFxjb3VudFVURnkKKyAgICAgIFxleHBhbmRhZnRlclxVVEZ2aWlpTG9vcAorICAgIFxmaX0KKworICBcY291bnRVVEZ4ID0gIkMyCisgIFxjb3VudFVURnkgPSAiRTAKKyAgXGRlZlxVVEZ2aWlpVG1weyUKKyAgICBceGRlZn57XG5vZXhwYW5kXFVURnZpaWlUd29PY3RldHNcc3RyaW5nfn19CisgIFxVVEZ2aWlpTG9vcAorCisgIFxjb3VudFVURnggPSAiRTAKKyAgXGNvdW50VVRGeSA9ICJGMAorICBcZGVmXFVURnZpaWlUbXB7JQorICAgIFx4ZGVmfntcbm9leHBhbmRcVVRGdmlpaVRocmVlT2N0ZXRzXHN0cmluZ359fQorICBcVVRGdmlpaUxvb3AKKworICBcY291bnRVVEZ4ID0gIkYwCisgIFxjb3VudFVURnkgPSAiRjQKKyAgXGRlZlxVVEZ2aWlpVG1weyUKKyAgICBceGRlZn57XG5vZXhwYW5kXFVURnZpaWlGb3VyT2N0ZXRzXHN0cmluZ359fQorICBcVVRGdmlpaUxvb3AKK1xlbmRncm91cAorCitcYmVnaW5ncm91cAorICBcY2F0Y29kZWBcIj0xMgorICBcY2F0Y29kZWBcPD0xMgorICBcY2F0Y29kZWBcLj0xMgorICBcY2F0Y29kZWBcLD0xMgorICBcY2F0Y29kZWBcOz0xMgorICBcY2F0Y29kZWBcIT0xMgorICBcY2F0Y29kZWBcfj0xMworCisgIFxnZGVmXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyIzEjMnslCisgICAgXGNvdW50VVRGeiA9ICIjMVxyZWxheAorICAgICVcd2xvZ3tcc3BhY2Vcc3BhY2UgZGVmaW5pbmcgVW5pY29kZSBjaGFyIFUrIzEgKGRlY2ltYWwgXHRoZVxjb3VudFVURnopfSUKKyAgICBcYmVnaW5ncm91cAorICAgICAgXHBhcnNlWE1MQ2hhcnJlZgorICAgICAgXGRlZlxVVEZ2aWlpVHdvT2N0ZXRzIyMxIyMyeyUKKyAgICAgICAgXGNzbmFtZSB1ODojIzFcc3RyaW5nICMjMlxlbmRjc25hbWV9JQorICAgICAgXGRlZlxVVEZ2aWlpVGhyZWVPY3RldHMjIzEjIzIjIzN7JQorICAgICAgICBcY3NuYW1lIHU4OiMjMVxzdHJpbmcgIyMyXHN0cmluZyAjIzNcZW5kY3NuYW1lfSUKKyAgICAgIFxkZWZcVVRGdmlpaUZvdXJPY3RldHMjIzEjIzIjIzMjIzR7JQorICAgICAgICBcY3NuYW1lIHU4OiMjMVxzdHJpbmcgIyMyXHN0cmluZyAjIzNcc3RyaW5nICMjNFxlbmRjc25hbWV9JQorICAgICAgXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyCisgICAgICAgXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyCisgICAgICAgXGdkZWZcVVRGdmlpaVRtcHsjMn0lCisgICAgXGVuZGdyb3VwfQorCisgIFxnZGVmXHBhcnNlWE1MQ2hhcnJlZnslCisgICAgXGlmbnVtXGNvdW50VVRGeiA8ICJBMFxyZWxheAorICAgICAgXGVycmhlbHAgPSBcRU1zaW1wbGUKKyAgICAgIFxlcnJtZXNzYWdle0Nhbm5vdCBkZWZpbmUgVW5pY29kZSBjaGFyIHZhbHVlIDwgMDBBMH0lCisgICAgXGVsc2VcaWZudW1cY291bnRVVEZ6IDwgIjgwMFxyZWxheAorICAgICAgXHBhcnNlVVRGdmlpaUEsJQorICAgICAgXHBhcnNlVVRGdmlpaUIgQ1xVVEZ2aWlpVHdvT2N0ZXRzLiwlCisgICAgXGVsc2VcaWZudW1cY291bnRVVEZ6IDwgIjEwMDAwXHJlbGF4CisgICAgICBccGFyc2VVVEZ2aWlpQTslCisgICAgICBccGFyc2VVVEZ2aWlpQSwlCisgICAgICBccGFyc2VVVEZ2aWlpQiBFXFVURnZpaWlUaHJlZU9jdGV0cy57LDt9JQorICAgIFxlbHNlCisgICAgICBccGFyc2VVVEZ2aWlpQTslCisgICAgICBccGFyc2VVVEZ2aWlpQSwlCisgICAgICBccGFyc2VVVEZ2aWlpQSElCisgICAgICBccGFyc2VVVEZ2aWlpQiBGXFVURnZpaWlGb3VyT2N0ZXRzLnshLDt9JQorICAgIFxmaVxmaVxmaQorICB9CisKKyAgXGdkZWZccGFyc2VVVEZ2aWlpQSMxeyUKKyAgICBcY291bnRVVEZ4ID0gXGNvdW50VVRGegorICAgIFxkaXZpZGVcY291bnRVVEZ6IGJ5IDY0CisgICAgXGNvdW50VVRGeSA9IFxjb3VudFVURnoKKyAgICBcbXVsdGlwbHlcY291bnRVVEZ6IGJ5IDY0CisgICAgXGFkdmFuY2VcY291bnRVVEZ4IGJ5IC1cY291bnRVVEZ6CisgICAgXGFkdmFuY2VcY291bnRVVEZ4IGJ5IDEyOAorICAgIFx1Y2NvZGUgYCMxXGNvdW50VVRGeAorICAgIFxjb3VudFVURnogPSBcY291bnRVVEZ5fQorCisgIFxnZGVmXHBhcnNlVVRGdmlpaUIjMSMyIzMjNHslCisgICAgXGFkdmFuY2VcY291bnRVVEZ6IGJ5ICIjMTBccmVsYXgKKyAgICBcdWNjb2RlIGAjM1xjb3VudFVURnoKKyAgICBcdXBwZXJjYXNle1xnZGVmXFVURnZpaWlUbXB7IzIjMyM0fX19CitcZW5kZ3JvdXAKKworXGRlZlx1dGZlaWdodGNoYXJkZWZzeyUKKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwQTB9e1x0aWV9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMEExfXtcZXhjbGFtZG93bn0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwQTN9e1xwb3VuZHN9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMEE4fXtcInsgfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwQTl9e1xjb3B5cmlnaHR9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMEFBfXtcb3JkZn0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwQUJ9e1xndWlsbGVtZXRsZWZ0fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDBBRH17XC19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMEFFfXtccmVnaXN0ZXJlZHN5bWJvbH0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwQUZ9e1w9eyB9fQorCisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMEIwfXtccmluZ2FjY2VudHsgfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwQjR9e1wneyB9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDBCOH17XGNlZGlsbGF7IH19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMEJBfXtcb3JkbX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwQkJ9e1xndWlsbGVtZXRyaWdodH0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwQkZ9e1xxdWVzdGlvbmRvd259CisKKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwQzB9e1xgQX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwQzF9e1wnQX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwQzJ9e1xeQX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwQzN9e1x+QX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwQzR9e1wiQX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwQzV9e1xBQX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwQzZ9e1xBRX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwQzd9e1xjZWRpbGxhe0N9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDBDOH17XGBFfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDBDOX17XCdFfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDBDQX17XF5FfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDBDQn17XCJFfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDBDQ317XGBJfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDBDRH17XCdJfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDBDRX17XF5JfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDBDRn17XCJJfQorCisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMEQwfXtcREh9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMEQxfXtcfk59CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMEQyfXtcYE99CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMEQzfXtcJ099CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMEQ0fXtcXk99CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMEQ1fXtcfk99CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMEQ2fXtcIk99CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMEQ4fXtcT30KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwRDl9e1xgVX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwREF9e1wnVX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwREJ9e1xeVX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwREN9e1wiVX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwRER9e1wnWX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwREV9e1xUSH0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwREZ9e1xzc30KKworICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDBFMH17XGBhfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDBFMX17XCdhfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDBFMn17XF5hfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDBFM317XH5hfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDBFNH17XCJhfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDBFNX17XGFhfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDBFNn17XGFlfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDBFN317XGNlZGlsbGF7Y319CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMEU4fXtcYGV9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMEU5fXtcJ2V9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMEVBfXtcXmV9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMEVCfXtcImV9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMEVDfXtcYHtcZG90bGVzc3tpfX19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMEVEfXtcJ3tcZG90bGVzc3tpfX19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMEVFfXtcXntcZG90bGVzc3tpfX19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMEVGfXtcIntcZG90bGVzc3tpfX19CisKKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwRjB9e1xkaH0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwRjF9e1x+bn0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwRjJ9e1xgb30KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwRjN9e1wnb30KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwRjR9e1xeb30KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwRjV9e1x+b30KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwRjZ9e1wib30KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAwRjh9e1xvfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDBGOX17XGB1fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDBGQX17XCd1fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDBGQn17XF51fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDBGQ317XCJ1fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDBGRH17XCd5fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDBGRX17XHRofQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDBGRn17XCJ5fQorCisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTAwfXtcPUF9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTAxfXtcPWF9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTAyfXtcdXtBfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxMDN9e1x1e2F9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDEwNH17XG9nb25la3tBfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxMDV9e1xvZ29uZWt7YX19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTA2fXtcJ0N9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTA3fXtcJ2N9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTA4fXtcXkN9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTA5fXtcXmN9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTE4fXtcb2dvbmVre0V9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDExOX17XG9nb25la3tlfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxMEF9e1xkb3RhY2NlbnR7Q319CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTBCfXtcZG90YWNjZW50e2N9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDEwQ317XHZ7Q319CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTBEfXtcdntjfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxMEV9e1x2e0R9fQorCisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTEyfXtcPUV9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTEzfXtcPWV9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTE0fXtcdXtFfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxMTV9e1x1e2V9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDExNn17XGRvdGFjY2VudHtFfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxMTd9e1xkb3RhY2NlbnR7ZX19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTFBfXtcdntFfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxMUJ9e1x2e2V9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDExQ317XF5HfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDExRH17XF5nfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDExRX17XHV7R319CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTFGfXtcdXtnfX0KKworICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDEyMH17XGRvdGFjY2VudHtHfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxMjF9e1xkb3RhY2NlbnR7Z319CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTI0fXtcXkh9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTI1fXtcXmh9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTI4fXtcfkl9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTI5fXtcfntcZG90bGVzc3tpfX19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTJBfXtcPUl9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTJCfXtcPXtcZG90bGVzc3tpfX19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTJDfXtcdXtJfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxMkR9e1x1e1xkb3RsZXNze2l9fX0KKworICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDEzMH17XGRvdGFjY2VudHtJfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxMzF9e1xkb3RsZXNze2l9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDEzMn17SUp9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTMzfXtpan0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxMzR9e1xeSn0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxMzV9e1xee1xkb3RsZXNze2p9fX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxMzl9e1wnTH0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxM0F9e1wnbH0KKworICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDE0MX17XEx9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTQyfXtcbH0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxNDN9e1wnTn0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxNDR9e1wnbn0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxNDd9e1x2e059fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDE0OH17XHZ7bn19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTRDfXtcPU99CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTREfXtcPW99CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTRFfXtcdXtPfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxNEZ9e1x1e299fQorCisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTUwfXtcSHtPfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxNTF9e1xIe299fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDE1Mn17XE9FfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDE1M317XG9lfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDE1NH17XCdSfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDE1NX17XCdyfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDE1OH17XHZ7Un19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTU5fXtcdntyfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxNUF9e1wnU30KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxNUJ9e1wnc30KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxNUN9e1xeU30KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxNUR9e1xec30KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxNUV9e1xjZWRpbGxhe1N9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDE1Rn17XGNlZGlsbGF7c319CisKKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxNjB9e1x2e1N9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDE2MX17XHZ7c319CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTYyfXtcY2VkaWxsYXt0fX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxNjN9e1xjZWRpbGxhe1R9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDE2NH17XHZ7VH19CisKKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxNjh9e1x+VX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxNjl9e1x+dX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxNkF9e1w9VX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxNkJ9e1w9dX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxNkN9e1x1e1V9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDE2RH17XHV7dX19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTZFfXtccmluZ2FjY2VudHtVfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxNkZ9e1xyaW5nYWNjZW50e3V9fQorCisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTcwfXtcSHtVfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxNzF9e1xIe3V9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDE3NH17XF5XfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDE3NX17XF53fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDE3Nn17XF5ZfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDE3N317XF55fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDE3OH17XCJZfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDE3OX17XCdafQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDE3QX17XCd6fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDE3Qn17XGRvdGFjY2VudHtafX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxN0N9e1xkb3RhY2NlbnR7en19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMTdEfXtcdntafX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxN0V9e1x2e3p9fQorCisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMUM0fXtEXHZ7Wn19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMUM1fXtEXHZ7en19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMUM2fXtkXHZ7en19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMUM3fXtMSn0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxQzh9e0xqfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDFDOX17bGp9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMUNBfXtOSn0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxQ0J9e05qfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDFDQ317bmp9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMUNEfXtcdntBfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxQ0V9e1x2e2F9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDFDRn17XHZ7SX19CisKKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxRDB9e1x2e1xkb3RsZXNze2l9fX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxRDF9e1x2e099fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDFEMn17XHZ7b319CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMUQzfXtcdntVfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxRDR9e1x2e3V9fQorCisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMUUyfXtcPXtcQUV9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDFFM317XD17XGFlfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxRTZ9e1x2e0d9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDFFN317XHZ7Z319CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMUU4fXtcdntLfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxRTl9e1x2e2t9fQorCisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMUYwfXtcdntcZG90bGVzc3tqfX19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMUYxfXtEWn0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxRjJ9e0R6fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDFGM317ZHp9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMUY0fXtcJ0d9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMUY1fXtcJ2d9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMUY4fXtcYE59CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMUY5fXtcYG59CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMUZDfXtcJ3tcQUV9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDFGRH17XCd7XGFlfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxRkV9e1wne1xPfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAxRkZ9e1wne1xvfX0KKworICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDIxRX17XHZ7SH19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMjFGfXtcdntofX0KKworICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDIyNn17XGRvdGFjY2VudHtBfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAyMjd9e1xkb3RhY2NlbnR7YX19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMjI4fXtcY2VkaWxsYXtFfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAyMjl9e1xjZWRpbGxhe2V9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MDIyRX17XGRvdGFjY2VudHtPfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAyMkZ9e1xkb3RhY2NlbnR7b319CisKKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAyMzJ9e1w9WX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAyMzN9e1w9eX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezAyMzd9e1xkb3RsZXNze2p9fQorCisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnswMkRCfXtcb2dvbmVreyB9fQorCisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTAyfXtcZG90YWNjZW50e0J9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUUwM317XGRvdGFjY2VudHtifX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFMDR9e1x1ZG90YWNjZW50e0J9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUUwNX17XHVkb3RhY2NlbnR7Yn19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTA2fXtcdWJhcmFjY2VudHtCfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFMDd9e1x1YmFyYWNjZW50e2J9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUUwQX17XGRvdGFjY2VudHtEfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFMEJ9e1xkb3RhY2NlbnR7ZH19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTBDfXtcdWRvdGFjY2VudHtEfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFMER9e1x1ZG90YWNjZW50e2R9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUUwRX17XHViYXJhY2NlbnR7RH19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTBGfXtcdWJhcmFjY2VudHtkfX0KKworICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUUxRX17XGRvdGFjY2VudHtGfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFMUZ9e1xkb3RhY2NlbnR7Zn19CisKKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFMjB9e1w9R30KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFMjF9e1w9Z30KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFMjJ9e1xkb3RhY2NlbnR7SH19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTIzfXtcZG90YWNjZW50e2h9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUUyNH17XHVkb3RhY2NlbnR7SH19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTI1fXtcdWRvdGFjY2VudHtofX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFMjZ9e1wiSH0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFMjd9e1wiaH0KKworICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUUzMH17XCdLfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUUzMX17XCdrfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUUzMn17XHVkb3RhY2NlbnR7S319CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTMzfXtcdWRvdGFjY2VudHtrfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFMzR9e1x1YmFyYWNjZW50e0t9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUUzNX17XHViYXJhY2NlbnR7a319CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTM2fXtcdWRvdGFjY2VudHtMfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFMzd9e1x1ZG90YWNjZW50e2x9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUUzQX17XHViYXJhY2NlbnR7TH19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTNCfXtcdWJhcmFjY2VudHtsfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFM0V9e1wnTX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFM0Z9e1wnbX0KKworICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUU0MH17XGRvdGFjY2VudHtNfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFNDF9e1xkb3RhY2NlbnR7bX19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTQyfXtcdWRvdGFjY2VudHtNfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFNDN9e1x1ZG90YWNjZW50e219fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUU0NH17XGRvdGFjY2VudHtOfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFNDV9e1xkb3RhY2NlbnR7bn19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTQ2fXtcdWRvdGFjY2VudHtOfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFNDd9e1x1ZG90YWNjZW50e259fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUU0OH17XHViYXJhY2NlbnR7Tn19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTQ5fXtcdWJhcmFjY2VudHtufX0KKworICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUU1NH17XCdQfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUU1NX17XCdwfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUU1Nn17XGRvdGFjY2VudHtQfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFNTd9e1xkb3RhY2NlbnR7cH19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTU4fXtcZG90YWNjZW50e1J9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUU1OX17XGRvdGFjY2VudHtyfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFNUF9e1x1ZG90YWNjZW50e1J9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUU1Qn17XHVkb3RhY2NlbnR7cn19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTVFfXtcdWJhcmFjY2VudHtSfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFNUZ9e1x1YmFyYWNjZW50e3J9fQorCisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTYwfXtcZG90YWNjZW50e1N9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUU2MX17XGRvdGFjY2VudHtzfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFNjJ9e1x1ZG90YWNjZW50e1N9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUU2M317XHVkb3RhY2NlbnR7c319CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTZBfXtcZG90YWNjZW50e1R9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUU2Qn17XGRvdGFjY2VudHt0fX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFNkN9e1x1ZG90YWNjZW50e1R9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUU2RH17XHVkb3RhY2NlbnR7dH19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTZFfXtcdWJhcmFjY2VudHtUfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFNkZ9e1x1YmFyYWNjZW50e3R9fQorCisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTdDfXtcflZ9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTdEfXtcfnZ9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTdFfXtcdWRvdGFjY2VudHtWfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFN0Z9e1x1ZG90YWNjZW50e3Z9fQorCisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTgwfXtcYFd9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTgxfXtcYHd9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTgyfXtcJ1d9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTgzfXtcJ3d9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTg0fXtcIld9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTg1fXtcInd9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTg2fXtcZG90YWNjZW50e1d9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUU4N317XGRvdGFjY2VudHt3fX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFODh9e1x1ZG90YWNjZW50e1d9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUU4OX17XHVkb3RhY2NlbnR7d319CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRThBfXtcZG90YWNjZW50e1h9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUU4Qn17XGRvdGFjY2VudHt4fX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFOEN9e1wiWH0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFOER9e1wieH0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFOEV9e1xkb3RhY2NlbnR7WX19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRThGfXtcZG90YWNjZW50e3l9fQorCisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTkwfXtcXlp9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTkxfXtcXnp9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTkyfXtcdWRvdGFjY2VudHtafX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFOTN9e1x1ZG90YWNjZW50e3p9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUU5NH17XHViYXJhY2NlbnR7Wn19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTk1fXtcdWJhcmFjY2VudHt6fX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFOTZ9e1x1YmFyYWNjZW50e2h9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUU5N317XCJ0fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUU5OH17XHJpbmdhY2NlbnR7d319CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRTk5fXtccmluZ2FjY2VudHt5fX0KKworICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUVBMH17XHVkb3RhY2NlbnR7QX19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRUExfXtcdWRvdGFjY2VudHthfX0KKworICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUVCOH17XHVkb3RhY2NlbnR7RX19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRUI5fXtcdWRvdGFjY2VudHtlfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFQkN9e1x+RX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFQkR9e1x+ZX0KKworICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUVDQX17XHVkb3RhY2NlbnR7SX19CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRUNCfXtcdWRvdGFjY2VudHtpfX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFQ0N9e1x1ZG90YWNjZW50e099fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUVDRH17XHVkb3RhY2NlbnR7b319CisKKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFRTR9e1x1ZG90YWNjZW50e1V9fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MUVFNX17XHVkb3RhY2NlbnR7dX19CisKKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFRjJ9e1xgWX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFRjN9e1xgeX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezFFRjR9e1x1ZG90YWNjZW50e1l9fQorCisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRUY4fXtcfll9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsxRUY5fXtcfnl9CisKKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezIwMTN9ey0tfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MjAxNH17LS0tfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MjAxOH17XHF1b3RlbGVmdH0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezIwMTl9e1xxdW90ZXJpZ2h0fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MjAxQX17XHF1b3Rlc2luZ2xiYXNlfQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MjAxQ317XHF1b3RlZGJsbGVmdH0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezIwMUR9e1xxdW90ZWRibHJpZ2h0fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MjAxRX17XHF1b3RlZGJsYmFzZX0KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezIwMjJ9e1xidWxsZXR9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsyMDI2fXtcZG90c30KKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezIwMzl9e1xndWlsc2luZ2xsZWZ0fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MjAzQX17XGd1aWxzaW5nbHJpZ2h0fQorICBcRGVjbGFyZVVuaWNvZGVDaGFyYWN0ZXJ7MjBBQ317XGV1cm99CisKKyAgXERlY2xhcmVVbmljb2RlQ2hhcmFjdGVyezIxOTJ9e1xleHBhbnNpb259CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsyMUQyfXtccmVzdWx0fQorCisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsyMjEyfXtcbWludXN9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsyMjE3fXtccG9pbnR9CisgIFxEZWNsYXJlVW5pY29kZUNoYXJhY3RlcnsyMjYxfXtcZXF1aXZ9Cit9JSBlbmQgb2YgXHV0ZmVpZ2h0Y2hhcmRlZnMKKworCislIFVTLUFTQ0lJIGNoYXJhY3RlciBkZWZpbml0aW9ucy4KK1xkZWZcYXNjaWljaGFyZGVmc3slIG5vdGhpbmcgbmVlZCBiZSBkb25lCisgICBccmVsYXgKK30KKworJSBNYWtlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIHByaW50YWJsZSBhZ2FpbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCislIGV4aXN0aW5nIFRleGluZm8gZG9jdW1lbnRzIHRoYXQgbWF5IHVzZSB0aGVtLCBldmVuIHdpdGhvdXQgZGVjbGFyaW5nIGEKKyUgZG9jdW1lbnQgZW5jb2RpbmcuCislCitcc2V0bm9uYXNjaWljaGFyc2NhdGNvZGUgXG90aGVyCisKKworXG1lc3NhZ2V7Zm9ybWF0dGluZyx9CisKIFxuZXdkaW1lblxkZWZhdWx0cGFyaW5kZW50IFxkZWZhdWx0cGFyaW5kZW50ID0gMTVwdAogCiBcY2hhcGhlYWRpbmdza2lwID0gMTVwdCBwbHVzIDRwdCBtaW51cyAycHQKQEAgLTY4MzcsMTAgKzk2MDksMTAgQEAKICUgUHJldmVudCB1bmRlcmZ1bGwgdmJveCBlcnJvciBtZXNzYWdlcy4KIFx2YmFkbmVzcyA9IDEwMDAwCiAKLSUgRG9uJ3QgYmUgc28gZmluaWNreSBhYm91dCB1bmRlcmZ1bGwgaGJveGVzLCBlaXRoZXIuCi1caGJhZG5lc3MgPSAyMDAwCislIERvbid0IGJlIHZlcnkgZmluaWNreSBhYm91dCB1bmRlcmZ1bGwgaGJveGVzLCBlaXRoZXIuCitcaGJhZG5lc3MgPSA2NjY2CiAKLSUgRm9sbG93aW5nIEdlb3JnZSBCdXNoLCBqdXN0IGdldCByaWQgb2Ygd2lkb3dzIGFuZCBvcnBoYW5zLgorJSBGb2xsb3dpbmcgR2VvcmdlIEJ1c2gsIGdldCByaWQgb2Ygd2lkb3dzIGFuZCBvcnBoYW5zLgogXHdpZG93cGVuYWx0eT0xMDAwMAogXGNsdWJwZW5hbHR5PTEwMDAwCiAKQEAgLTY4ODcsNiArOTY1OSwxMCBAQAogICBcaWZwZGYKICAgICBccGRmcGFnZWhlaWdodCAjN1xyZWxheAogICAgIFxwZGZwYWdld2lkdGggIzhccmVsYXgKKyAgICAlIGlmIHdlIGRvbid0IHJlc2V0IHRoZXNlLCB0aGV5IHdpbGwgcmVtYWluIGF0ICIxIHRydWUgaW4iIG9mCisgICAgJSB3aGF0ZXZlciBsYXlvdXQgcGRmdGV4IHdhcyBkdW1wZWQgd2l0aC4KKyAgICBccGRmaG9yaWdpbiA9IDEgdHJ1ZSBpbgorICAgIFxwZGZ2b3JpZ2luID0gMSB0cnVlIGluCiAgIFxmaQogICAlCiAgIFxzZXRsZWFkaW5ne1x0ZXh0bGVhZGluZ30KQEAgLTY5MDEsNyArOTY3Nyw3IEBACiAgIFx0ZXh0bGVhZGluZyA9IDEzLjJwdAogICAlCiAgICUgSWYgcGFnZSBpcyBub3RoaW5nIGJ1dCB0ZXh0LCBtYWtlIGl0IGNvbWUgb3V0IGV2ZW4uCi0gIFxpbnRlcm5hbHBhZ2VzaXplc3s0NlxiYXNlbGluZXNraXB9ezZpbn0lCisgIFxpbnRlcm5hbHBhZ2VzaXplc3s2MDcuMnB0fXs2aW59JSB0aGF0J3MgNDYgbGluZXMKICAgICAgICAgICAgICAgICAgICAge1x2b2Zmc2V0fXsuMjVpbn0lCiAgICAgICAgICAgICAgICAgICAgIHtcYmluZGluZ29mZnNldH17MzZwdH0lCiAgICAgICAgICAgICAgICAgICAgIHsxMWlufXs4LjVpbn0lCkBAIC02OTEzLDcgKzk2ODksNyBAQAogICBcdGV4dGxlYWRpbmcgPSAxMnB0CiAgICUKICAgXGludGVybmFscGFnZXNpemVzezcuNWlufXs1aW59JQotICAgICAgICAgICAgICAgICAgICB7XHZvZmZzZXR9ey4yNWlufSUKKyAgICAgICAgICAgICAgICAgICAgey0uMmlufXswaW59JQogICAgICAgICAgICAgICAgICAgICB7XGJpbmRpbmdvZmZzZXR9ezE2cHR9JQogICAgICAgICAgICAgICAgICAgICB7OS4yNWlufXs3aW59JQogICAlCkBAIC02OTU3LDcgKzk3MzMsNyBAQAogICAlIFxnbG9iYWxcbm9ybWFsb2Zmc2V0ID0gLTZtbQogICAlIFxnbG9iYWxcYmluZGluZ29mZnNldCA9IDEwbW0KICAgJSBAZW5kIHRleAotICBcaW50ZXJuYWxwYWdlc2l6ZXN7NTFcYmFzZWxpbmVza2lwfXsxNjBtbX0KKyAgXGludGVybmFscGFnZXNpemVzezY3My4ycHR9ezE2MG1tfSUgdGhhdCdzIDUxIGxpbmVzCiAgICAgICAgICAgICAgICAgICAgIHtcdm9mZnNldH17XGhvZmZzZXR9JQogICAgICAgICAgICAgICAgICAgICB7XGJpbmRpbmdvZmZzZXR9ezQ0cHR9JQogICAgICAgICAgICAgICAgICAgICB7Mjk3bW19ezIxMG1tfSUKQEAgLTcwMjIsNyArOTc5OCw3IEBACiAgIFxwYXJza2lwID0gM3B0IHBsdXMgMnB0IG1pbnVzIDFwdAogICBcc2V0bGVhZGluZ3tcdGV4dGxlYWRpbmd9JQogICAlCi0gIFxkaW1lbjAgPSAjMQorICBcZGltZW4wID0gIzFccmVsYXgKICAgXGFkdmFuY2VcZGltZW4wIGJ5IFx2b2Zmc2V0CiAgICUKICAgXGRpbWVuMiA9IFxoc2l6ZQpAQCAtNzA0MSwyNSArOTgxNywyMSBAQAogCiBcbWVzc2FnZXthbmQgdHVybmluZyBvbiB0ZXhpbmZvIGlucHV0IGZvcm1hdC59CiAKK1xkZWZeXkx7XHBhcn0gJSByZW1vdmUgXG91dGVyLCBzbyBeTCBjYW4gYXBwZWFyIGluIGFuIEBjb21tZW50CisKKyUgREVMIGlzIGEgY29tbWVudCBjaGFyYWN0ZXIsIGluIGNhc2UgQGMgZG9lcyBub3Qgc3VmZmljZS4KK1xjYXRjb2RlYFxeXj8gPSAxNAorCiAlIERlZmluZSBtYWNyb3MgdG8gb3V0cHV0IHZhcmlvdXMgY2hhcmFjdGVycyB3aXRoIGNhdGNvZGUgZm9yIG5vcm1hbCB0ZXh0LgotXGNhdGNvZGVgXCI9XG90aGVyCi1cY2F0Y29kZWBcfj1cb3RoZXIKLVxjYXRjb2RlYFxePVxvdGhlcgotXGNhdGNvZGVgXF89XG90aGVyCi1cY2F0Y29kZWBcfD1cb3RoZXIKLVxjYXRjb2RlYFw8PVxvdGhlcgotXGNhdGNvZGVgXD49XG90aGVyCi1cY2F0Y29kZWBcKz1cb3RoZXIKLVxjYXRjb2RlYFwkPVxvdGhlcgotXGRlZlxub3JtYWxkb3VibGVxdW90ZXsifQotXGRlZlxub3JtYWx0aWxkZXt+fQotXGRlZlxub3JtYWxjYXJldHtefQotXGRlZlxub3JtYWx1bmRlcnNjb3Jle199Ci1cZGVmXG5vcm1hbHZlcnRpY2FsYmFye3x9Ci1cZGVmXG5vcm1hbGxlc3N7PH0KLVxkZWZcbm9ybWFsZ3JlYXRlcns+fQotXGRlZlxub3JtYWxwbHVzeyt9Ci1cZGVmXG5vcm1hbGRvbGxhcnskfSUkIGZvbnQtbG9jayBmaXgKK1xjYXRjb2RlYFwiPVxvdGhlciBcZGVmXG5vcm1hbGRvdWJsZXF1b3RleyJ9CitcY2F0Y29kZWBcJD1cb3RoZXIgXGRlZlxub3JtYWxkb2xsYXJ7JH0lJCBmb250LWxvY2sgZml4CitcY2F0Y29kZWBcKz1cb3RoZXIgXGRlZlxub3JtYWxwbHVzeyt9CitcY2F0Y29kZWBcPD1cb3RoZXIgXGRlZlxub3JtYWxsZXNzezx9CitcY2F0Y29kZWBcPj1cb3RoZXIgXGRlZlxub3JtYWxncmVhdGVyez59CitcY2F0Y29kZWBcXj1cb3RoZXIgXGRlZlxub3JtYWxjYXJldHtefQorXGNhdGNvZGVgXF89XG90aGVyIFxkZWZcbm9ybWFsdW5kZXJzY29yZXtffQorXGNhdGNvZGVgXHw9XG90aGVyIFxkZWZcbm9ybWFsdmVydGljYWxiYXJ7fH0KK1xjYXRjb2RlYFx+PVxvdGhlciBcZGVmXG5vcm1hbHRpbGRle359CiAKICUgVGhpcyBtYWNybyBpcyB1c2VkIHRvIG1ha2UgYSBjaGFyYWN0ZXIgcHJpbnQgb25lIHdheSBpbiBcdHQKICUgKHdoZXJlIGl0IGNhbiBwcm9iYWJseSBiZSBvdXRwdXQgYXMtaXMpLCBhbmQgYW5vdGhlciB3YXkgaW4gb3RoZXIgZm9udHMsCkBAIC03MTE3LDYgKzk4ODksMTMgQEAKICUgXG90aGVyaWZ5YWN0aXZlIGlzIGNhbGxlZCBuZWFyIHRoZSBlbmQgb2YgdGhpcyBmaWxlLgogXGRlZlxvdGhlcmlmeWFjdGl2ZXtcY2F0Y29kZWArPVxvdGhlciBcY2F0Y29kZWBcXz1cb3RoZXJ9CiAKKyUgVXNlZCBzb21ldGltZXMgdG8gdHVybiBvZmYgKGVmZmVjdGl2ZWx5KSB0aGUgYWN0aXZlIGNoYXJhY3RlcnMgZXZlbiBhZnRlcgorJSBwYXJzaW5nIHRoZW0uCitcZGVmXHR1cm5vZmZhY3RpdmV7JQorICBcbm9ybWFsdHVybm9mZmFjdGl2ZQorICBcb3RoZXJiYWNrc2xhc2gKK30KKwogXGNhdGNvZGVgXEA9MAogCiAlIFxiYWNrc2xhc2hjdXJmb250IG91dHB1dHMgb25lIGJhY2tzbGFzaCBjaGFyYWN0ZXIgaW4gY3VycmVudCBmb250LApAQCAtNzEyNCw0NSArOTkwMyw1MiBAQAogXGdsb2JhbFxjaGFyZGVmXGJhY2tzbGFzaGN1cmZvbnQ9YFxcCiBcZ2xvYmFsXGxldFxyYXdiYWNrc2xhc2h4eD1cYmFja3NsYXNoY3VyZm9udCAgJSBsZXQgZXhpc3RpbmcgLj8/cyBmaWxlcyB3b3JrCiAKLSUgXHJhd2JhY2tzbGFzaCBkZWZpbmVzIGFuIGFjdGl2ZSBcIHRvIGRvIFxiYWNrc2xhc2hjdXJmb250LgotJSBcb3RoZXJiYWNrc2xhc2ggZGVmaW5lcyBhbiBhY3RpdmUgXCB0byBiZSBhIGxpdGVyYWwgYFwnIGNoYXJhY3RlciB3aXRoCi0lIGNhdGNvZGUgb3RoZXIuCi17XGNhdGNvZGVgXFw9XGFjdGl2ZQotIEBnZGVmQHJhd2JhY2tzbGFzaHtAbGV0XD1AYmFja3NsYXNoY3VyZm9udH0KLSBAZ2RlZkBvdGhlcmJhY2tzbGFzaHtAbGV0XD1AcmVhbGJhY2tzbGFzaH0KLX0KLQogJSBccmVhbGJhY2tzbGFzaCBpcyBhbiBhY3R1YWwgY2hhcmFjdGVyIGBcJyB3aXRoIGNhdGNvZGUgb3RoZXIsIGFuZAogJSBcZG91YmxlYmFja3NsYXNoIGlzIHR3byBvZiB0aGVtIChmb3IgdGhlIHBkZiBvdXRsaW5lcykuCiB7XGNhdGNvZGVgXFw9XG90aGVyIEBnZGVmQHJlYWxiYWNrc2xhc2h7XH0gQGdkZWZAZG91YmxlYmFja3NsYXNoe1xcfX0KIAotJSBcbm9ybWFsYmFja3NsYXNoIG91dHB1dHMgb25lIGJhY2tzbGFzaCBpbiBmaXhlZCB3aWR0aCBmb250LgotXGRlZlxub3JtYWxiYWNrc2xhc2h7e1x0dFxiYWNrc2xhc2hjdXJmb250fX0KKyUgSW4gdGV4aW5mbywgYmFja3NsYXNoIGlzIGFuIGFjdGl2ZSBjaGFyYWN0ZXI7IGl0IHByaW50cyB0aGUgYmFja3NsYXNoCislIGluIGZpeGVkIHdpZHRoIGZvbnQuCitcY2F0Y29kZWBcXD1cYWN0aXZlICAlIEAgZm9yIGVzY2FwZSBjaGFyIGZyb20gbm93IG9uLgogCi1cY2F0Y29kZWBcXD1cYWN0aXZlCislIFRoZSBzdG9yeSBoZXJlIGlzIHRoYXQgaW4gbWF0aCBtb2RlLCB0aGUgXGNoYXIgb2YgXGJhY2tzbGFzaGN1cmZvbnQKKyUgZW5kcyB1cCBwcmludGluZyB0aGUgcm9tYW4gXCBmcm9tIHRoZSBtYXRoIHN5bWJvbCBmb250IChiZWNhdXNlIFxjaGFyCislIGluIG1hdGggbW9kZSB1c2VzIHRoZSBcbWF0aGNvZGUsIGFuZCBwbGFpbi50ZXggc2V0cworJSBcbWF0aGNvZGVgXFw9IjAyNkUpLiAgSXQgc2VlbXMgYmV0dGVyIGZvciBAYmFja3NsYXNoY2hhcnt9IHRvIGFsd2F5cworJSBwcmludCBhIHR5cGV3cml0ZXIgYmFja3NsYXNoLCBoZW5jZSB3ZSB1c2UgYW4gZXhwbGljaXQgXG1hdGhjaGFyLAorJSB3aGljaCBpcyB0aGUgZGVjaW1hbCBlcXVpdmFsZW50IG9mICI3MTVjIChjbGFzcyA3LCBlLmcuLCB1c2UgXGZhbTsKKyUgaWdub3JlZCBmYW1pbHkgdmFsdWU7IGNoYXIgcG9zaXRpb24gIjVDKS4gIFdlIGNhbid0IHVzZSAiIGZvciB0aGUKKyUgdXN1YWwgaGV4IHZhbHVlIGJlY2F1c2UgaXQgaGFzIGFscmVhZHkgYmVlbiBtYWRlIGFjdGl2ZS4KK0BkZWZAbm9ybWFsYmFja3NsYXNoe3tAdHQgQGlmbW1vZGUgQG1hdGhjaGFyMjkwMjAgQGVsc2UgQGJhY2tzbGFzaGN1cmZvbnQgQGZpfX0KK0BsZXRAYmFja3NsYXNoY2hhciA9IEBub3JtYWxiYWNrc2xhc2ggJSBAYmFja3NsYXNoY2hhcnt9IGlzIGZvciB1c2VyIGRvY3VtZW50cy4KIAotJSBVc2VkIHNvbWV0aW1lcyB0byB0dXJuIG9mZiAoZWZmZWN0aXZlbHkpIHRoZSBhY3RpdmUgY2hhcmFjdGVycwotJSBldmVuIGFmdGVyIHBhcnNpbmcgdGhlbS4KLUBkZWZAdHVybm9mZmFjdGl2ZXslCislIE9uIHN0YXJ0dXAsIEBmaXhiYWNrc2xhc2ggYXNzaWduczoKKyUgIEBsZXQgXCA9IEBub3JtYWxiYWNrc2xhc2gKKyUgXHJhd2JhY2tzbGFzaCBkZWZpbmVzIGFuIGFjdGl2ZSBcIHRvIGRvIFxiYWNrc2xhc2hjdXJmb250LgorJSBcb3RoZXJiYWNrc2xhc2ggZGVmaW5lcyBhbiBhY3RpdmUgXCB0byBiZSBhIGxpdGVyYWwgYFwnIGNoYXJhY3RlciB3aXRoCislIGNhdGNvZGUgb3RoZXIuICBXZSBzd2l0Y2ggYmFjayBhbmQgZm9ydGggYmV0d2VlbiB0aGVzZS4KK0BnZGVmQHJhd2JhY2tzbGFzaHtAbGV0XD1AYmFja3NsYXNoY3VyZm9udH0KK0BnZGVmQG90aGVyYmFja3NsYXNoe0BsZXRcPUByZWFsYmFja3NsYXNofQorCislIFNhbWUgYXMgQHR1cm5vZmZhY3RpdmUgZXhjZXB0IG91dHB1dHMgXCBhcyB7XHR0XGNoYXJgXFx9IGluc3RlYWQgb2YKKyUgdGhlIGxpdGVyYWwgY2hhcmFjdGVyIGBcJy4KKyUKK0BkZWZAbm9ybWFsdHVybm9mZmFjdGl2ZXslCiAgIEBsZXQiPUBub3JtYWxkb3VibGVxdW90ZQotICBAbGV0XD1AcmVhbGJhY2tzbGFzaAotICBAbGV0fj1Abm9ybWFsdGlsZGUKKyAgQGxldCQ9QG5vcm1hbGRvbGxhciAlJCBmb250LWxvY2sgZml4CisgIEBsZXQrPUBub3JtYWxwbHVzCisgIEBsZXQ8PUBub3JtYWxsZXNzCisgIEBsZXQ+PUBub3JtYWxncmVhdGVyCisgIEBsZXRcPUBub3JtYWxiYWNrc2xhc2gKICAgQGxldF49QG5vcm1hbGNhcmV0CiAgIEBsZXRfPUBub3JtYWx1bmRlcnNjb3JlCiAgIEBsZXR8PUBub3JtYWx2ZXJ0aWNhbGJhcgotICBAbGV0PD1Abm9ybWFsbGVzcwotICBAbGV0Pj1Abm9ybWFsZ3JlYXRlcgotICBAbGV0Kz1Abm9ybWFscGx1cwotICBAbGV0JD1Abm9ybWFsZG9sbGFyICUkIGZvbnQtbG9jayBmaXgKKyAgQGxldH49QG5vcm1hbHRpbGRlCisgIEBtYXJrdXBzZXR1cGxxZGVmYXVsdAorICBAbWFya3Vwc2V0dXBycWRlZmF1bHQKICAgQHVuc2Vwc3BhY2VzCiB9CiAKLSUgU2FtZSBhcyBAdHVybm9mZmFjdGl2ZSBleGNlcHQgb3V0cHV0cyBcIGFzIHtcdHRcY2hhcmBcXH0gaW5zdGVhZCBvZgotJSB0aGUgbGl0ZXJhbCBjaGFyYWN0ZXIgYFwnLiAgKFRodXMsIFwgaXMgbm90IGV4cGFuZGFibGUgd2hlbiB0aGlzIGlzIGluCi0lIGVmZmVjdC4pCi0lCi1AZGVmQG5vcm1hbHR1cm5vZmZhY3RpdmV7QHR1cm5vZmZhY3RpdmUgQGxldFw9QG5vcm1hbGJhY2tzbGFzaH0KLQogJSBNYWtlIF8gYW5kICsgXG90aGVyIGNoYXJhY3RlcnMsIHRlbXBvcmFyaWx5LgogJSBUaGlzIGlzIGNhbmNlbGVkIGJ5IEBmaXhiYWNrc2xhc2guCiBAb3RoZXJpZnlhY3RpdmUKQEAgLTcxNzUsNyArOTk2MSw3IEBACiBAZ2xvYmFsQGxldFwgPSBAZWF0aW5wdXQKIAogJSBPbiB0aGUgb3RoZXIgaGFuZCwgcGVyaGFwcyB0aGUgZmlsZSBkaWQgbm90IGhhdmUgYSBgXGlucHV0IHRleGluZm8nLiBUaGVuCi0lIHRoZSBmaXJzdCBgXHsgaW4gdGhlIGZpbGUgd291bGQgY2F1c2UgYW4gZXJyb3IuIFRoaXMgbWFjcm8gdHJpZXMgdG8gZml4CislIHRoZSBmaXJzdCBgXCcgaW4gdGhlIGZpbGUgd291bGQgY2F1c2UgYW4gZXJyb3IuIFRoaXMgbWFjcm8gdHJpZXMgdG8gZml4CiAlIHRoYXQsIGFzc3VtaW5nIGl0IGlzIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IGBcJyBjb3VsZCBwbGF1c2libHkgb2NjdXIuCiAlIEFsc28gdHVybiBiYWNrIG9uIGFjdGl2ZSBjaGFyYWN0ZXJzIHRoYXQgbWlnaHQgYXBwZWFyIGluIHRoZSBpbnB1dAogJSBmaWxlIG5hbWUsIGluIGNhc2Ugbm90IHVzaW5nIGEgcHJlLWR1bXBlZCBmb3JtYXQuCkBAIC03MTg5LDExICs5OTc1LDI4IEBACiAlIFNheSBAZm9vLCBub3QgXGZvbywgaW4gZXJyb3IgbWVzc2FnZXMuCiBAZXNjYXBlY2hhciA9IGBAQAogCi0lIFRoZXNlIGxvb2sgb2sgaW4gYWxsIGZvbnRzLCBzbyBqdXN0IG1ha2UgdGhlbSBub3Qgc3BlY2lhbC4KLUBjYXRjb2RlYEAmID0gQG90aGVyCi1AY2F0Y29kZWBAIyA9IEBvdGhlcgotQGNhdGNvZGVgQCUgPSBAb3RoZXIKKyUgVGhlc2UgKGFsb25nIHdpdGggJiBhbmQgIykgYXJlIG1hZGUgYWN0aXZlIGZvciB1cmwtYnJlYWtpbmcsIHNvIG5lZWQKKyUgYWN0aXZlIGRlZmluaXRpb25zIGFzIHRoZSBub3JtYWwgY2hhcmFjdGVycy4KK0BkZWZAbm9ybWFsZG90ey59CitAZGVmQG5vcm1hbHF1ZXN0ez99CitAZGVmQG5vcm1hbHNsYXNoey99CiAKKyUgVGhlc2UgbG9vayBvayBpbiBhbGwgZm9udHMsIHNvIGp1c3QgbWFrZSB0aGVtIG5vdCBzcGVjaWFsLgorJSBAaGFzaGNoYXJ7fSBnZXRzIGl0cyBvd24gdXNlci1sZXZlbCBjb21tYW5kLCBiZWNhdXNlIG9mICNsaW5lLgorQGNhdGNvZGVgQCYgPSBAb3RoZXIgQGRlZkBub3JtYWxhbXB7Jn0KK0BjYXRjb2RlYEAjID0gQG90aGVyIEBkZWZAbm9ybWFsaGFzaHsjfQorQGNhdGNvZGVgQCUgPSBAb3RoZXIgQGRlZkBub3JtYWxwZXJjZW50eyV9CisKK0BsZXQgQGhhc2hjaGFyID0gQG5vcm1hbGhhc2gKKworQGMgRmluYWxseSwgbWFrZSBgIGFuZCAnIGFjdGl2ZSwgc28gdGhhdCB0eGljb2RlcXVvdGV1bmRpcmVjdGVkIGFuZAorQGMgdHhpY29kZXF1b3RlYmFja3RpY2sgd29yayByaWdodCBpbiwgZS5nLiwgQHd7QGNvZGV7YGZvbyd9fS4gIElmIHdlCitAYyBkb24ndCBtYWtlIGAgYW5kICcgYWN0aXZlLCBAY29kZSB3aWxsIG5vdCBnZXQgdGhlbSBhcyBhY3RpdmUgY2hhcnMuCitAYyBEbyB0aGlzIGxhc3Qgb2YgYWxsIHNpbmNlIHdlIHVzZSBgIGluIHRoZSBwcmV2aW91cyBAY2F0Y29kZSBhc3NpZ25tZW50cy4KK0BjYXRjb2RlYEAnPUBhY3RpdmUKK0BjYXRjb2RlYEBgPUBhY3RpdmUKK0BtYXJrdXBzZXR1cGxxZGVmYXVsdAorQG1hcmt1cHNldHVwcnFkZWZhdWx0CiAKIEBjIExvY2FsIHZhcmlhYmxlczoKIEBjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfb3N4L3g4Ni9kYXJ3aW42NC5TIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9vc3gveDg2L2RhcndpbjY0LlMKaW5kZXggZWJhNDUxZS4uMTY1ZDQ2OSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9vc3gveDg2L2RhcndpbjY0LlMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9vc3gveDg2L2RhcndpbjY0LlMKQEAgLTQ1LDYgKzQ1LDcgQEAKIF9mZmlfY2FsbF91bml4NjQ6CiBMVVcwOgogIG1vdnEgICglcnNwKSwgJXIxMCAgICAvKiBMb2FkIHJldHVybiBhZGRyZXNzLiAgKi8KKyBtb3ZxICAlcmRpLCAlcjEyICAgIC8qIFNhdmUgYSBjb3B5IG9mIHRoZSByZWdpc3RlciBhcmVhLiAqLwogIGxlYXEgICglcmRpLCAlcnNpKSwgJXJheCAgLyogRmluZCBsb2NhbCBzdGFjayBiYXNlLiAgKi8KICBtb3ZxICAlcmR4LCAoJXJheCkgICAgLyogU2F2ZSBmbGFncy4gICovCiAgbW92cSAgJXJjeCwgOCglcmF4KSAgIC8qIFNhdmUgcmFkZHIuICAqLwpAQCAtNTIsNyArNTMsOCBAQAogIG1vdnEgICVyMTAsIDI0KCVyYXgpICAgIC8qIFJlbG9jYXRlIHJldHVybiBhZGRyZXNzLiAgKi8KICBtb3ZxICAlcmF4LCAlcmJwICAgIC8qIEZpbmFsaXplIGxvY2FsIHN0YWNrIGZyYW1lLiAgKi8KIExVVzE6Ci0gbW92cSAgJXJkaSwgJXIxMCAgICAvKiBTYXZlIGEgY29weSBvZiB0aGUgcmVnaXN0ZXIgYXJlYS4gKi8KKyAvKiBtb3ZxICAlcmRpLCAlcjEwICAgIC8vIFNhdmUgYSBjb3B5IG9mIHRoZSByZWdpc3RlciBhcmVhLiAqLworIG1vdnEgICVyMTIsICVyMTAKICBtb3ZxICAlcjgsICVyMTEgICAvKiBTYXZlIGEgY29weSBvZiB0aGUgdGFyZ2V0IGZuLiAgKi8KICBtb3ZsICAlcjlkLCAlZWF4ICAgIC8qIFNldCBudW1iZXIgb2YgU1NFIHJlZ2lzdGVycy4gICovCiAKQEAgLTI1NSw3ICsyNTcsNyBAQAogIHJldAogIC5hbGlnbiAgMwogTGxkX2ludDg6Ci0gbW92emJsICAtMjQoJXJzcCksICVlYXgKKyBtb3Z6YmwgIC0yNCglcnNwKSwgJWVheCAKICByZXQKICAuYWxpZ24gIDMKIExsZF9pbnQxNjoKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfb3N4L3g4Ni94ODYtZGFyd2luLlMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX29zeC94ODYveDg2LWRhcndpbi5TCmluZGV4IDZjODVlYTYuLjkyNWE4NDEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfb3N4L3g4Ni94ODYtZGFyd2luLlMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9vc3gveDg2L3g4Ni1kYXJ3aW4uUwpAQCAtMTk4LDggKzE5OCwxMiBAQAogCWplCUxjbHNfcmV0bGRvdWJsZQogCWNtcGwJJEZGSV9UWVBFX1NJTlQ2NCwgJWVheAogCWplCUxjbHNfcmV0bGxvbmcKKwljbXBsCSRGRklfVFlQRV9VSU5UOCwgJWVheAorCWplCUxjbHNfcmV0c3RydWN0MQogCWNtcGwJJEZGSV9UWVBFX1NJTlQ4LCAlZWF4CiAJamUJTGNsc19yZXRzdHJ1Y3QxCisJY21wbAkkRkZJX1RZUEVfVUlOVDE2LCAlZWF4CisJamUJTGNsc19yZXRzdHJ1Y3QyCiAJY21wbAkkRkZJX1RZUEVfU0lOVDE2LCAlZWF4CiAJamUJTGNsc19yZXRzdHJ1Y3QyCiAJY21wbAkkRkZJX1RZUEVfU1RSVUNULCAlZWF4CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX29zeC94ODYveDg2LWZmaTY0LmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX29zeC94ODYveDg2LWZmaTY0LmMKaW5kZXggZDRhNWNjMS4uMDZmZWFmMiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9vc3gveDg2L3g4Ni1mZmk2NC5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfb3N4L3g4Ni94ODYtZmZpNjQuYwpAQCAtMTUyLDEyICsxNTIsNDIgQEAKIAkJY2FzZSBGRklfVFlQRV9VSU5UNjQ6CiAJCWNhc2UgRkZJX1RZUEVfU0lOVDY0OgogCQljYXNlIEZGSV9UWVBFX1BPSU5URVI6CisjaWYgMAogCQkJaWYgKGJ5dGVfb2Zmc2V0ICsgdHlwZS0+c2l6ZSA8PSA0KQogCQkJCWNsYXNzZXNbMF0gPSBYODZfNjRfSU5URUdFUlNJX0NMQVNTOwogCQkJZWxzZQogCQkJCWNsYXNzZXNbMF0gPSBYODZfNjRfSU5URUdFUl9DTEFTUzsKIAogCQkJcmV0dXJuIDE7CisjZWxzZQorCQl7CisJCQlpbnQgc2l6ZSA9IGJ5dGVfb2Zmc2V0ICsgdHlwZS0+c2l6ZTsKKworCQkJaWYgKHNpemUgPD0gNCkKKwkJCXsKKwkJCQljbGFzc2VzWzBdID0gWDg2XzY0X0lOVEVHRVJTSV9DTEFTUzsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCWVsc2UgaWYgKHNpemUgPD0gOCkKKwkJCXsKKwkJCQljbGFzc2VzWzBdID0gWDg2XzY0X0lOVEVHRVJfQ0xBU1M7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQllbHNlIGlmIChzaXplIDw9IDEyKQorCQkJeworCQkJCWNsYXNzZXNbMF0gPSBYODZfNjRfSU5URUdFUl9DTEFTUzsKKwkJCQljbGFzc2VzWzFdID0gWDg2XzY0X0lOVEVHRVJTSV9DTEFTUzsKKwkJCQlyZXR1cm4gMjsKKwkJCX0KKwkJCWVsc2UgaWYgKHNpemUgPD0gMTYpCisJCQl7CisJCQkJY2xhc3Nlc1swXSA9IGNsYXNzZXNbMV0gPSBYODZfNjRfSU5URUdFUlNJX0NMQVNTOworCQkJCXJldHVybiAyOworCQkJfQorCQkJZWxzZQorCQkJCUZGSV9BU1NFUlQgKDApOworCQl9CisjZW5kaWYKIAogCQljYXNlIEZGSV9UWVBFX0ZMT0FUOgogCQkJaWYgKGJ5dGVfb2Zmc2V0ID09IDApCkBAIC0yMTMsNiArMjQzLDIxIEBACiAJCQkJYnl0ZV9vZmZzZXQgKz0gKCpwdHIpLT5zaXplOwogCQkJfQogCisJCQlpZiAod29yZHMgPiAyKQorCQkJeworCQkJCS8qIFdoZW4gc2l6ZSA+IDE2IGJ5dGVzLCBpZiB0aGUgZmlyc3Qgb25lIGlzbid0CisJCQkgICAgICAgICAgIFg4Nl82NF9TU0VfQ0xBU1Mgb3IgYW55IG90aGVyIG9uZXMgYXJlbid0CisJCQkgICAgICAgICAgIFg4Nl82NF9TU0VVUF9DTEFTUywgZXZlcnl0aGluZyBzaG91bGQgYmUgcGFzc2VkIGluCisJCQkgICAgICAgICAgIG1lbW9yeS4gICovCisJCQkJaWYgKGNsYXNzZXNbMF0gIT0gWDg2XzY0X1NTRV9DTEFTUykKKwkJCQkJcmV0dXJuIDA7CisKKwkJCQlmb3IgKGkgPSAxOyBpIDwgd29yZHM7IGkrKykKKwkJCQkJaWYgKGNsYXNzZXNbaV0gIT0gWDg2XzY0X1NTRVVQX0NMQVNTKQorCQkJCQkJcmV0dXJuIDA7CisJCQl9CisKKwogCQkJLyogRmluYWwgbWVyZ2VyIGNsZWFudXAuICAqLwogCQkJZm9yIChpID0gMDsgaSA8IHdvcmRzOyBpKyspCiAJCQl7CkBAIC0yMjQsMTMgKzI2OSwyMCBAQAogCQkJCS8qCVRoZSBYODZfNjRfU1NFVVBfQ0xBU1Mgc2hvdWxkIGJlIGFsd2F5cyBwcmVjZWRlZCBieQogCQkJCQlYODZfNjRfU1NFX0NMQVNTLiAgKi8KIAkJCQlpZiAoY2xhc3Nlc1tpXSA9PSBYODZfNjRfU1NFVVBfQ0xBU1MKLQkJCQkJJiYgKGkgPT0gMCB8fCBjbGFzc2VzW2kgLSAxXSAhPSBYODZfNjRfU1NFX0NMQVNTKSkKKwkJCQkJJiYgY2xhc3Nlc1tpIC0gMV0gIT0gWDg2XzY0X1NTRV9DTEFTUworCQkJCQkmJiBjbGFzc2VzW2kgLSAxXSAhPSBYODZfNjRfU1NFVVBfQ0xBU1MpCisJCQkJeworCQkJCQlGRklfQVNTRVJUKGkgIT0gMCk7CiAJCQkJCWNsYXNzZXNbaV0gPSBYODZfNjRfU1NFX0NMQVNTOworCQkJCX0KIAogCQkJCS8qICBYODZfNjRfWDg3VVBfQ0xBU1Mgc2hvdWxkIGJlIHByZWNlZGVkIGJ5IFg4Nl82NF9YODdfQ0xBU1MuICAqLwogCQkJCWlmIChjbGFzc2VzW2ldID09IFg4Nl82NF9YODdVUF9DTEFTUwotCQkJCQkmJiAoaSA9PSAwIHx8IGNsYXNzZXNbaSAtIDFdICE9IFg4Nl82NF9YODdfQ0xBU1MpKQorCQkJCQkmJiBjbGFzc2VzW2kgLSAxXSAhPSBYODZfNjRfWDg3X0NMQVNTKQorCQkJCXsKKwkJCQkJRkZJX0FTU0VSVChpICE9IDApOwogCQkJCQljbGFzc2VzW2ldID0gWDg2XzY0X1NTRV9DTEFTUzsKKwkJCQl9CiAJCQl9CiAKIAkJCXJldHVybiB3b3JkczsKQEAgLTM2OSw2ICs0MjEsNyBAQAogCiAJY2lmLT5mbGFncyA9IGZsYWdzOwogCWNpZi0+Ynl0ZXMgPSBieXRlczsKKwljaWYtPmJ5dGVzID0gQUxJR04oYnl0ZXMsOCk7CiAKIAlyZXR1cm4gRkZJX09LOwogfQpAQCAtNDQ5LDcgKzUwMiw2MSBAQAogCQkJCQljYXNlIFg4Nl82NF9JTlRFR0VSX0NMQVNTOgogCQkJCQljYXNlIFg4Nl82NF9JTlRFR0VSU0lfQ0xBU1M6CiAJCQkJCQlyZWdfYXJncy0+Z3ByW2dwcmNvdW50XSA9IDA7Ci0JCQkJCQltZW1jcHkgKCZyZWdfYXJncy0+Z3ByW2dwcmNvdW50XSwgYSwgc2l6ZSA8IDggPyBzaXplIDogOCk7CisJCQkJCQlzd2l0Y2ggKGFyZ190eXBlc1tpXS0+dHlwZSkgeworCQkJCQkJY2FzZSBGRklfVFlQRV9TSU5UODoKKwkJCQkJCSAgIHsKKwkJCQkJCQlpbnQ4X3Qgc2hvcnR2YWwgPSAqKGludDhfdCopYTsKKwkJCQkJCQlpbnQ2NF90ICBhY3R2YWwgPSAoaW50NjRfdClzaG9ydHZhbDsKKwkJCQkJCQlyZWdfYXJncy0+Z3ByW2dwcmNvdW50XSA9IGFjdHZhbDsKKwkJCQkJCQkvKm1lbWNweSAoJnJlZ19hcmdzLT5ncHJbZ3ByY291bnRdLCAmYWN0dmFsLCA4KTsqLworCQkJCQkJCWJyZWFrOworCQkJCQkJICAgfQorCisJCQkJCQljYXNlIEZGSV9UWVBFX1NJTlQxNjoKKwkJCQkJCSAgIHsKKwkJCQkJCQlpbnQxNl90IHNob3J0dmFsID0gKihpbnQxNl90KilhOworCQkJCQkJCWludDY0X3QgIGFjdHZhbCA9IChpbnQ2NF90KXNob3J0dmFsOworCQkJCQkJCW1lbWNweSAoJnJlZ19hcmdzLT5ncHJbZ3ByY291bnRdLCAmYWN0dmFsLCA4KTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCSAgIH0KKworCQkJCQkJY2FzZSBGRklfVFlQRV9TSU5UMzI6CisJCQkJCQkgICB7CisJCQkJCQkJaW50MzJfdCBzaG9ydHZhbCA9ICooaW50MzJfdCopYTsKKwkJCQkJCQlpbnQ2NF90ICBhY3R2YWwgPSAoaW50NjRfdClzaG9ydHZhbDsKKwkJCQkJCQltZW1jcHkgKCZyZWdfYXJncy0+Z3ByW2dwcmNvdW50XSwgJmFjdHZhbCwgOCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQkgICB9CisKKwkJCQkJCWNhc2UgRkZJX1RZUEVfVUlOVDg6CisJCQkJCQkgICB7CisJCQkJCQkJdV9pbnQ4X3Qgc2hvcnR2YWwgPSAqKHVfaW50OF90KilhOworCQkJCQkJCXVfaW50NjRfdCAgYWN0dmFsID0gKHVfaW50NjRfdClzaG9ydHZhbDsKKwkJCQkJCQkvKm1lbWNweSAoJnJlZ19hcmdzLT5ncHJbZ3ByY291bnRdLCAmYWN0dmFsLCA4KTsqLworCQkJCQkJCXJlZ19hcmdzLT5ncHJbZ3ByY291bnRdID0gYWN0dmFsOworCQkJCQkJCWJyZWFrOworCQkJCQkJICAgfQorCisJCQkJCQljYXNlIEZGSV9UWVBFX1VJTlQxNjoKKwkJCQkJCSAgIHsKKwkJCQkJCQl1X2ludDE2X3Qgc2hvcnR2YWwgPSAqKHVfaW50MTZfdCopYTsKKwkJCQkJCQl1X2ludDY0X3QgIGFjdHZhbCA9ICh1X2ludDY0X3Qpc2hvcnR2YWw7CisJCQkJCQkJbWVtY3B5ICgmcmVnX2FyZ3MtPmdwcltncHJjb3VudF0sICZhY3R2YWwsIDgpOworCQkJCQkJCWJyZWFrOworCQkJCQkJICAgfQorCisJCQkJCQljYXNlIEZGSV9UWVBFX1VJTlQzMjoKKwkJCQkJCSAgIHsKKwkJCQkJCQl1X2ludDMyX3Qgc2hvcnR2YWwgPSAqKHVfaW50MzJfdCopYTsKKwkJCQkJCQl1X2ludDY0X3QgIGFjdHZhbCA9ICh1X2ludDY0X3Qpc2hvcnR2YWw7CisJCQkJCQkJbWVtY3B5ICgmcmVnX2FyZ3MtPmdwcltncHJjb3VudF0sICZhY3R2YWwsIDgpOworCQkJCQkJCWJyZWFrOworCQkJCQkJICAgfQorCisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCS8vbWVtY3B5ICgmcmVnX2FyZ3MtPmdwcltncHJjb3VudF0sIGEsIHNpemUgPCA4ID8gc2l6ZSA6IDgpOworCQkJCQkJCXJlZ19hcmdzLT5ncHJbZ3ByY291bnRdID0gKihpbnQ2NF90KilhOworCQkJCQkJfQogCQkJCQkJZ3ByY291bnQrKzsKIAkJCQkJCWJyZWFrOwogCkBAIC01MDUsMTIgKzYxMiwxNSBAQAogCXJldHVybiBGRklfT0s7CiB9CiAKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdtaXNzaW5nLXByb3RvdHlwZXMiCiBpbnQKIGZmaV9jbG9zdXJlX3VuaXg2NF9pbm5lcigKIAlmZmlfY2xvc3VyZSoJY2xvc3VyZSwKIAl2b2lkKgkJCXJ2YWx1ZSwKIAlSZWdpc3RlckFyZ3MqCXJlZ19hcmdzLAogCWNoYXIqCQkJYXJncCkKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKIHsKIAlmZmlfY2lmKgljaWYgPSBjbG9zdXJlLT5jaWY7CiAJdm9pZCoqCQlhdmFsdWUgPSBhbGxvY2EoY2lmLT5uYXJncyAqIHNpemVvZih2b2lkICopKTsKQEAgLTYyMSw0ICs3MzEsNCBAQAogCXJldHVybiByZXQ7CiB9CiAKLSNlbmRpZiAvKiBfX3g4Nl82NF9fICovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorI2VuZGlmIC8qIF9feDg2XzY0X18gKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfb3N4L3g4Ni94ODYtZmZpX2Rhcndpbi5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9vc3gveDg2L3g4Ni1mZmlfZGFyd2luLmMKaW5kZXggYzlhMzA2ZS4uNzA2ZWEwZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9vc3gveDg2L3g4Ni1mZmlfZGFyd2luLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9vc3gveDg2L3g4Ni1mZmlfZGFyd2luLmMKQEAgLTM1LDYgKzM1LDggQEAKIC8qIGZmaV9wcmVwX2FyZ3MgaXMgY2FsbGVkIGJ5IHRoZSBhc3NlbWJseSByb3V0aW5lIG9uY2Ugc3RhY2sgc3BhY2UKICBoYXMgYmVlbiBhbGxvY2F0ZWQgZm9yIHRoZSBmdW5jdGlvbidzIGFyZ3VtZW50cyAqLwogCit2b2lkIGZmaV9wcmVwX2FyZ3MoY2hhciAqc3RhY2ssIGV4dGVuZGVkX2NpZiAqZWNpZik7CisKIHZvaWQgZmZpX3ByZXBfYXJncyhjaGFyICpzdGFjaywgZXh0ZW5kZWRfY2lmICplY2lmKQogewogICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwpAQCAtNDMzLDQgKzQzNSw0IEBACiB9CiAKICNlbmRpZgotI2VuZGlmCS8vIF9faTM4Nl9fClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorI2VuZGlmCS8vIF9faTM4Nl9fCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvc3RnZGljdC5jIGIvTW9kdWxlcy9fY3R5cGVzL3N0Z2RpY3QuYwppbmRleCA3NzMyMzNmLi45NWZhMGY1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvc3RnZGljdC5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9zdGdkaWN0LmMKQEAgLTM0Myw3ICszNDMsNyBAQAogCiAgICAgaXNQYWNrZWQgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHR5cGUsICJfcGFja18iKTsKICAgICBpZiAoaXNQYWNrZWQpIHsKLSAgICAgICAgcGFjayA9IFB5SW50X0FzTG9uZyhpc1BhY2tlZCk7CisgICAgICAgIHBhY2sgPSBfUHlJbnRfQXNJbnQoaXNQYWNrZWQpOwogICAgICAgICBpZiAocGFjayA8IDAgfHwgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICAgICAgUHlfWERFQ1JFRihpc1BhY2tlZCk7CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKQEAgLTUxOCw3ICs1MTgsMTIgQEAKICAgICAgICAgICAgIHNwcmludGYoYnVmLCAiJXM6JXM6IiwgZmllbGRmbXQsIGZpZWxkbmFtZSk7CiAKICAgICAgICAgICAgIHB0ciA9IHN0Z2RpY3QtPmZvcm1hdDsKLSAgICAgICAgICAgIHN0Z2RpY3QtPmZvcm1hdCA9IF9jdHlwZXNfYWxsb2NfZm9ybWF0X3N0cmluZyhzdGdkaWN0LT5mb3JtYXQsIGJ1Zik7CisgICAgICAgICAgICBpZiAoZGljdC0+c2hhcGUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHN0Z2RpY3QtPmZvcm1hdCA9IF9jdHlwZXNfYWxsb2NfZm9ybWF0X3N0cmluZ193aXRoX3NoYXBlKAorICAgICAgICAgICAgICAgICAgICBkaWN0LT5uZGltLCBkaWN0LT5zaGFwZSwgc3RnZGljdC0+Zm9ybWF0LCBidWYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGdkaWN0LT5mb3JtYXQgPSBfY3R5cGVzX2FsbG9jX2Zvcm1hdF9zdHJpbmcoc3RnZGljdC0+Zm9ybWF0LCBidWYpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgUHlNZW1fRnJlZShwdHIpOwogICAgICAgICAgICAgUHlNZW1fRnJlZShidWYpOwogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdXJzZXNfcGFuZWwuYyBiL01vZHVsZXMvX2N1cnNlc19wYW5lbC5jCmluZGV4IDA0YTBhMjguLmJkZDVjZjAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N1cnNlc19wYW5lbC5jCisrKyBiL01vZHVsZXMvX2N1cnNlc19wYW5lbC5jCkBAIC0yOTMsOSArMjkzLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogUHlDdXJzZXNQYW5lbF9zZXRfcGFuZWxfdXNlcnB0cihQeUN1cnNlc1BhbmVsT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb2JqKQogeworICAgIFB5T2JqZWN0ICpvbGRvYmo7CisgICAgaW50IHJjOworICAgIFB5Q3Vyc2VzSW5pdGlhbGlzZWQ7CiAgICAgUHlfSU5DUkVGKG9iaik7Ci0gICAgcmV0dXJuIFB5Q3Vyc2VzQ2hlY2tFUlIoc2V0X3BhbmVsX3VzZXJwdHIoc2VsZi0+cGFuLCAodm9pZCopb2JqKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0X3BhbmVsX3VzZXJwdHIiKTsKKyAgICBvbGRvYmogPSAoUHlPYmplY3QgKikgcGFuZWxfdXNlcnB0cihzZWxmLT5wYW4pOworICAgIHJjID0gc2V0X3BhbmVsX3VzZXJwdHIoc2VsZi0+cGFuLCAodm9pZCopb2JqKTsKKyAgICBpZiAocmMgPT0gRVJSKSB7CisgICAgICAgIC8qIEluIGNhc2Ugb2YgYW4gbmN1cnNlcyBlcnJvciwgZGVjcmVmIHRoZSBuZXcgb2JqZWN0IGFnYWluICovCisgICAgICAgIFB5X0RFQ1JFRihvYmopOworICAgIH0KKyAgICBQeV9YREVDUkVGKG9sZG9iaik7CisgICAgcmV0dXJuIFB5Q3Vyc2VzQ2hlY2tFUlIocmMsICJzZXRfcGFuZWxfdXNlcnB0ciIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3Vyc2VzbW9kdWxlLmMgYi9Nb2R1bGVzL19jdXJzZXNtb2R1bGUuYwppbmRleCA1ZjI2YzdmLi5iOTE0ZTVmNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3Vyc2VzbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fY3Vyc2VzbW9kdWxlLmMKQEAgLTg4NSw3ICs4ODUsOSBAQAogICAgIH0KICAgICBpZiAocnRuID09IEVSUikgewogICAgICAgICAvKiBnZXRjaCgpIHJldHVybnMgRVJSIGluIG5vZGVsYXkgbW9kZSAqLwotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlDdXJzZXNFcnJvciwgIm5vIGlucHV0Iik7CisgICAgICAgIFB5RXJyX0NoZWNrU2lnbmFscygpOworICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlDdXJzZXNFcnJvciwgIm5vIGlucHV0Iik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0gZWxzZSBpZiAocnRuPD0yNTUpIHsKICAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImMiLCBydG4pOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZWxlbWVudHRyZWUuYyBiL01vZHVsZXMvX2VsZW1lbnR0cmVlLmMKaW5kZXggMzc5YWEwMS4uM2U5ZjlkZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fZWxlbWVudHRyZWUuYworKysgYi9Nb2R1bGVzL19lbGVtZW50dHJlZS5jCkBAIC0yMzM4LDcgKzIzMzgsMTAgQEAKICAgICBQeU9iamVjdCogc3ByZWZpeCA9IE5VTEw7CiAgICAgUHlPYmplY3QqIHN1cmkgPSBOVUxMOwogCi0gICAgc3VyaSA9IG1ha2VzdHJpbmcodXJpLCBzdHJsZW4odXJpKSk7CisgICAgaWYgKHVyaSkKKyAgICAgICAgc3VyaSA9IG1ha2VzdHJpbmcodXJpLCBzdHJsZW4odXJpKSk7CisgICAgZWxzZQorICAgICAgICBzdXJpID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoIiIsIDApOwogICAgIGlmICghc3VyaSkKICAgICAgICAgcmV0dXJuOwogCkBAIC0yNDI3LDYgKzI0MzAsOCBAQAogCiAgICAgaWYgKFB5VW5pY29kZV9HRVRfU0laRSh1KSAhPSAyNTYpIHsKICAgICAgICAgUHlfREVDUkVGKHUpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtdWx0aS1ieXRlIGVuY29kaW5ncyBhcmUgbm90IHN1cHBvcnRlZCIpOwogICAgICAgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUjsKICAgICB9CiAKQEAgLTI3MzQsMTAgKzI3MzksMTAgQEAKICAgICB0YXJnZXQtPmV2ZW50cyA9IGV2ZW50czsKIAogICAgIC8qIGNsZWFyIG91dCBleGlzdGluZyBldmVudHMgKi8KLSAgICBQeV9YREVDUkVGKHRhcmdldC0+c3RhcnRfZXZlbnRfb2JqKTsgdGFyZ2V0LT5zdGFydF9ldmVudF9vYmogPSBOVUxMOwotICAgIFB5X1hERUNSRUYodGFyZ2V0LT5lbmRfZXZlbnRfb2JqKTsgdGFyZ2V0LT5lbmRfZXZlbnRfb2JqID0gTlVMTDsKLSAgICBQeV9YREVDUkVGKHRhcmdldC0+c3RhcnRfbnNfZXZlbnRfb2JqKTsgdGFyZ2V0LT5zdGFydF9uc19ldmVudF9vYmogPSBOVUxMOwotICAgIFB5X1hERUNSRUYodGFyZ2V0LT5lbmRfbnNfZXZlbnRfb2JqKTsgdGFyZ2V0LT5lbmRfbnNfZXZlbnRfb2JqID0gTlVMTDsKKyAgICBQeV9DTEVBUih0YXJnZXQtPnN0YXJ0X2V2ZW50X29iaik7CisgICAgUHlfQ0xFQVIodGFyZ2V0LT5lbmRfZXZlbnRfb2JqKTsKKyAgICBQeV9DTEVBUih0YXJnZXQtPnN0YXJ0X25zX2V2ZW50X29iaik7CisgICAgUHlfQ0xFQVIodGFyZ2V0LT5lbmRfbnNfZXZlbnRfb2JqKTsKIAogICAgIGlmIChldmVudF9zZXQgPT0gUHlfTm9uZSkgewogICAgICAgICAvKiBkZWZhdWx0IGlzICJlbmQiIG9ubHkgKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2Z1bmN0b29sc21vZHVsZS5jIGIvTW9kdWxlcy9fZnVuY3Rvb2xzbW9kdWxlLmMKaW5kZXggYWE5ZWFlZS4uNjM5N2JhOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fZnVuY3Rvb2xzbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fZnVuY3Rvb2xzbW9kdWxlLmMKQEAgLTI5MCwxMCArMjkwLDEwIEBACiB9CiAKIFB5T2JqZWN0ICoKLXBhcnRpYWxfc2V0c3RhdGUocGFydGlhbG9iamVjdCAqcHRvLCBQeU9iamVjdCAqYXJncykKK3BhcnRpYWxfc2V0c3RhdGUocGFydGlhbG9iamVjdCAqcHRvLCBQeU9iamVjdCAqc3RhdGUpCiB7CiAgICAgUHlPYmplY3QgKmZuLCAqZm5hcmdzLCAqa3csICpkaWN0OwotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiKE9PT08pOl9fc2V0c3RhdGVfXyIsCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHN0YXRlLCAiT09PTyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbiwgJmZuYXJncywgJmt3LCAmZGljdCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIFB5X1hERUNSRUYocHRvLT5mbik7CkBAIC0zMTcsNyArMzE3LDcgQEAKIAogc3RhdGljIFB5TWV0aG9kRGVmIHBhcnRpYWxfbWV0aG9kc1tdID0gewogICAgIHsiX19yZWR1Y2VfXyIsIChQeUNGdW5jdGlvbilwYXJ0aWFsX3JlZHVjZSwgTUVUSF9OT0FSR1N9LAotICAgIHsiX19zZXRzdGF0ZV9fIiwgKFB5Q0Z1bmN0aW9uKXBhcnRpYWxfc2V0c3RhdGUsIE1FVEhfVkFSQVJHU30sCisgICAgeyJfX3NldHN0YXRlX18iLCAoUHlDRnVuY3Rpb24pcGFydGlhbF9zZXRzdGF0ZSwgTUVUSF9PfSwKICAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faGFzaG9wZW5zc2wuYyBiL01vZHVsZXMvX2hhc2hvcGVuc3NsLmMKaW5kZXggYWE5ZGQ0ZS4uNzExNmVlYiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faGFzaG9wZW5zc2wuYworKysgYi9Nb2R1bGVzL19oYXNob3BlbnNzbC5jCkBAIC0zNyw2ICszNyw4IEBACiAKIC8qIEVWUCBpcyB0aGUgcHJlZmVycmVkIGludGVyZmFjZSB0byBoYXNoaW5nIGluIE9wZW5TU0wgKi8KICNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvaG1hYy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CiAKICNkZWZpbmUgTVVOQ0hfU0laRSBJTlRfTUFYCiAKQEAgLTY3LDcgKzY5LDcgQEAKIAogCiAjZGVmaW5lIERFRklORV9DT05TVFNfRk9SX05FVyhOYW1lKSAgXAotICAgIHN0YXRpYyBQeU9iamVjdCAqQ09OU1RfICMjIE5hbWUgIyMgX25hbWVfb2JqOyBcCisgICAgc3RhdGljIFB5T2JqZWN0ICpDT05TVF8gIyMgTmFtZSAjIyBfbmFtZV9vYmogPSBOVUxMOyBcCiAgICAgc3RhdGljIEVWUF9NRF9DVFggQ09OU1RfbmV3XyAjIyBOYW1lICMjIF9jdHg7IFwKICAgICBzdGF0aWMgRVZQX01EX0NUWCAqQ09OU1RfbmV3XyAjIyBOYW1lICMjIF9jdHhfcCA9IE5VTEw7CiAKQEAgLTQ3Nyw2ICs0NzksNyBAQAogICAgIH0KIAogICAgIGlmICghUHlBcmdfUGFyc2UobmFtZV9vYmosICJzIiwgJm5hbWUpKSB7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXcpOwogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAibmFtZSBtdXN0IGJlIGEgc3RyaW5nIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTQ5MCw2ICs0OTMsMjI1IEBACiAgICAgcmV0dXJuIHJldF9vYmo7CiB9CiAKKworI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MTAwMDAwMDAgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19ITUFDKSBcCisgICAgICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fU0hBKSkKKworI2RlZmluZSBQWV9QQktERjJfSE1BQyAxCisKKy8qIEltcHJvdmVkIGltcGxlbWVudGF0aW9uIG9mIFBLQ1M1X1BCS0RGMl9ITUFDKCkKKyAqCisgKiBQS0NTNV9QQktERjJfSE1BQ19mYXN0KCkgaGFzaGVzIHRoZSBwYXNzd29yZCBleGFjdGx5IG9uZSB0aW1lIGluc3RlYWQgb2YKKyAqIGBpdGVyYCB0aW1lcy4gVG9kYXkgKDIwMTMpIHRoZSBpdGVyYXRpb24gY291bnQgaXMgdHlwaWNhbGx5IDEwMCwwMDAgb3IKKyAqIG1vcmUuIFRoZSBpbXByb3ZlZCBhbGdvcml0aG0gaXMgbm90IHN1YmplY3QgdG8gYSBEZW5pYWwtb2YtU2VydmljZQorICogdnVsbmVyYWJpbGl0eSB3aXRoIG92ZXJseSBsYXJnZSBwYXNzd29yZHMuCisgKgorICogQWxzbyBPcGVuU1NMIDwgMS4wIGRvbid0IHByb3ZpZGUgUEtDUzVfUEJLREYyX0hNQUMoKSwgb25seQorICogUEtDUzVfUEJLREYyX1NIQTEuCisgKi8KK3N0YXRpYyBpbnQKK1BLQ1M1X1BCS0RGMl9ITUFDX2Zhc3QoY29uc3QgY2hhciAqcGFzcywgaW50IHBhc3NsZW4sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNhbHQsIGludCBzYWx0bGVuLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRlciwgY29uc3QgRVZQX01EICpkaWdlc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBrZXlsZW4sIHVuc2lnbmVkIGNoYXIgKm91dCkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGRpZ3RtcFtFVlBfTUFYX01EX1NJWkVdLCAqcCwgaXRtcFs0XTsKKyAgICBpbnQgY3BsZW4sIGosIGssIHRrZXlsZW4sIG1kbGVuOworICAgIHVuc2lnbmVkIGxvbmcgaSA9IDE7CisgICAgSE1BQ19DVFggaGN0eF90cGwsIGhjdHg7CisKKyAgICBtZGxlbiA9IEVWUF9NRF9zaXplKGRpZ2VzdCk7CisgICAgaWYgKG1kbGVuIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBITUFDX0NUWF9pbml0KCZoY3R4X3RwbCk7CisgICAgSE1BQ19DVFhfaW5pdCgmaGN0eCk7CisgICAgcCA9IG91dDsKKyAgICB0a2V5bGVuID0ga2V5bGVuOworICAgIGlmICghSE1BQ19Jbml0X2V4KCZoY3R4X3RwbCwgcGFzcywgcGFzc2xlbiwgZGlnZXN0LCBOVUxMKSkgeworICAgICAgICBITUFDX0NUWF9jbGVhbnVwKCZoY3R4X3RwbCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB3aGlsZSh0a2V5bGVuKSB7CisgICAgICAgIGlmKHRrZXlsZW4gPiBtZGxlbikKKyAgICAgICAgICAgIGNwbGVuID0gbWRsZW47CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNwbGVuID0gdGtleWxlbjsKKyAgICAgICAgLyogV2UgYXJlIHVubGlrZWx5IHRvIGV2ZXIgdXNlIG1vcmUgdGhhbiAyNTYgYmxvY2tzICg1MTIwIGJpdHMhKQorICAgICAgICAgKiBidXQganVzdCBpbiBjYXNlLi4uCisgICAgICAgICAqLworICAgICAgICBpdG1wWzBdID0gKHVuc2lnbmVkIGNoYXIpKChpID4+IDI0KSAmIDB4ZmYpOworICAgICAgICBpdG1wWzFdID0gKHVuc2lnbmVkIGNoYXIpKChpID4+IDE2KSAmIDB4ZmYpOworICAgICAgICBpdG1wWzJdID0gKHVuc2lnbmVkIGNoYXIpKChpID4+IDgpICYgMHhmZik7CisgICAgICAgIGl0bXBbM10gPSAodW5zaWduZWQgY2hhcikoaSAmIDB4ZmYpOworICAgICAgICBpZiAoIUhNQUNfQ1RYX2NvcHkoJmhjdHgsICZoY3R4X3RwbCkpIHsKKyAgICAgICAgICAgIEhNQUNfQ1RYX2NsZWFudXAoJmhjdHhfdHBsKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmICghSE1BQ19VcGRhdGUoJmhjdHgsIHNhbHQsIHNhbHRsZW4pCisgICAgICAgICAgICAgICAgfHwgIUhNQUNfVXBkYXRlKCZoY3R4LCBpdG1wLCA0KQorICAgICAgICAgICAgICAgIHx8ICFITUFDX0ZpbmFsKCZoY3R4LCBkaWd0bXAsIE5VTEwpKSB7CisgICAgICAgICAgICBITUFDX0NUWF9jbGVhbnVwKCZoY3R4X3RwbCk7CisgICAgICAgICAgICBITUFDX0NUWF9jbGVhbnVwKCZoY3R4KTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIEhNQUNfQ1RYX2NsZWFudXAoJmhjdHgpOworICAgICAgICBtZW1jcHkocCwgZGlndG1wLCBjcGxlbik7CisgICAgICAgIGZvciAoaiA9IDE7IGogPCBpdGVyOyBqKyspIHsKKyAgICAgICAgICAgIGlmICghSE1BQ19DVFhfY29weSgmaGN0eCwgJmhjdHhfdHBsKSkgeworICAgICAgICAgICAgICAgIEhNQUNfQ1RYX2NsZWFudXAoJmhjdHhfdHBsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghSE1BQ19VcGRhdGUoJmhjdHgsIGRpZ3RtcCwgbWRsZW4pCisgICAgICAgICAgICAgICAgICAgIHx8ICFITUFDX0ZpbmFsKCZoY3R4LCBkaWd0bXAsIE5VTEwpKSB7CisgICAgICAgICAgICAgICAgSE1BQ19DVFhfY2xlYW51cCgmaGN0eF90cGwpOworICAgICAgICAgICAgICAgIEhNQUNfQ1RYX2NsZWFudXAoJmhjdHgpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSE1BQ19DVFhfY2xlYW51cCgmaGN0eCk7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgY3BsZW47IGsrKykgeworICAgICAgICAgICAgICAgIHBba10gXj0gZGlndG1wW2tdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRrZXlsZW4tPSBjcGxlbjsKKyAgICAgICAgaSsrOworICAgICAgICBwKz0gY3BsZW47CisgICAgfQorICAgIEhNQUNfQ1RYX2NsZWFudXAoJmhjdHhfdHBsKTsKKyAgICByZXR1cm4gMTsKK30KKworLyogTENPVl9FWENMX1NUQVJUICovCitzdGF0aWMgUHlPYmplY3QgKgorX3NldEV4Y2VwdGlvbihQeU9iamVjdCAqZXhjKQoreworICAgIHVuc2lnbmVkIGxvbmcgZXJyY29kZTsKKyAgICBjb25zdCBjaGFyICpsaWIsICpmdW5jLCAqcmVhc29uOworCisgICAgZXJyY29kZSA9IEVSUl9wZWVrX2xhc3RfZXJyb3IoKTsKKyAgICBpZiAoIWVycmNvZGUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKGV4YywgInVua25vd24gcmVhc29ucyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgRVJSX2NsZWFyX2Vycm9yKCk7CisKKyAgICBsaWIgPSBFUlJfbGliX2Vycm9yX3N0cmluZyhlcnJjb2RlKTsKKyAgICBmdW5jID0gRVJSX2Z1bmNfZXJyb3Jfc3RyaW5nKGVycmNvZGUpOworICAgIHJlYXNvbiA9IEVSUl9yZWFzb25fZXJyb3Jfc3RyaW5nKGVycmNvZGUpOworCisgICAgaWYgKGxpYiAmJiBmdW5jKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChleGMsICJbJXM6ICVzXSAlcyIsIGxpYiwgZnVuYywgcmVhc29uKTsKKyAgICB9CisgICAgZWxzZSBpZiAobGliKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChleGMsICJbJXNdICVzIiwgbGliLCByZWFzb24pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKGV4YywgcmVhc29uKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisvKiBMQ09WX0VYQ0xfU1RPUCAqLworCitQeURvY19TVFJWQVIocGJrZGYyX2htYWNfX2RvY19fLAorInBia2RmMl9obWFjKGhhc2hfbmFtZSwgcGFzc3dvcmQsIHNhbHQsIGl0ZXJhdGlvbnMsIGRrbGVuPU5vbmUpIC0+IGtleVxuXAorXG5cCitQYXNzd29yZCBiYXNlZCBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbiAyIChQS0NTICM1IHYyLjApIHdpdGggSE1BQyBhc1xuXAorcHNldWRvcmFuZG9tIGZ1bmN0aW9uLiIpOworCitzdGF0aWMgUHlPYmplY3QgKgorcGJrZGYyX2htYWMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkaWN0KQoreworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiaGFzaF9uYW1lIiwgInBhc3N3b3JkIiwgInNhbHQiLCAiaXRlcmF0aW9ucyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJka2xlbiIsIE5VTEx9OworICAgIFB5T2JqZWN0ICprZXlfb2JqID0gTlVMTCwgKmRrbGVuX29iaiA9IFB5X05vbmU7CisgICAgY2hhciAqbmFtZSwgKmtleTsKKyAgICBQeV9idWZmZXIgcGFzc3dvcmQsIHNhbHQ7CisgICAgbG9uZyBpdGVyYXRpb25zLCBka2xlbjsKKyAgICBpbnQgcmV0dmFsOworICAgIGNvbnN0IEVWUF9NRCAqZGlnZXN0OworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkaWN0LCAic3MqcypsfE86cGJrZGYyX2htYWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJm5hbWUsICZwYXNzd29yZCwgJnNhbHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZXJhdGlvbnMsICZka2xlbl9vYmopKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGRpZ2VzdCA9IEVWUF9nZXRfZGlnZXN0YnluYW1lKG5hbWUpOworICAgIGlmIChkaWdlc3QgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInVuc3VwcG9ydGVkIGhhc2ggdHlwZSIpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBpZiAocGFzc3dvcmQubGVuID4gSU5UX01BWCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwYXNzd29yZCBpcyB0b28gbG9uZy4iKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgaWYgKHNhbHQubGVuID4gSU5UX01BWCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzYWx0IGlzIHRvbyBsb25nLiIpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBpZiAoaXRlcmF0aW9ucyA8IDEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiaXRlcmF0aW9uIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuIik7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBpZiAoaXRlcmF0aW9ucyA+IElOVF9NQVgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiaXRlcmF0aW9uIHZhbHVlIGlzIHRvbyBncmVhdC4iKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgaWYgKGRrbGVuX29iaiA9PSBQeV9Ob25lKSB7CisgICAgICAgIGRrbGVuID0gRVZQX01EX3NpemUoZGlnZXN0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBka2xlbiA9IFB5TG9uZ19Bc0xvbmcoZGtsZW5fb2JqKTsKKyAgICAgICAgaWYgKChka2xlbiA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGRrbGVuIDwgMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJrZXkgbGVuZ3RoIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuIik7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBpZiAoZGtsZW4gPiBJTlRfTUFYKSB7CisgICAgICAgIC8qIElOVF9NQVggaXMgYWx3YXlzIHNtYWxsZXIgdGhhbiBka0xlbiBtYXggKDJeMzIgLSAxKSAqIGhMZW4gKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAia2V5IGxlbmd0aCBpcyB0b28gZ3JlYXQuIik7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIGtleV9vYmogPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGRrbGVuKTsKKyAgICBpZiAoa2V5X29iaiA9PSBOVUxMKSB7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBrZXkgPSBQeUJ5dGVzX0FTX1NUUklORyhrZXlfb2JqKTsKKworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByZXR2YWwgPSBQS0NTNV9QQktERjJfSE1BQ19mYXN0KChjaGFyKilwYXNzd29yZC5idWYsIChpbnQpcGFzc3dvcmQubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilzYWx0LmJ1ZiwgKGludClzYWx0LmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdGlvbnMsIGRpZ2VzdCwgZGtsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKWtleSk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKworICAgIGlmICghcmV0dmFsKSB7CisgICAgICAgIFB5X0NMRUFSKGtleV9vYmopOworICAgICAgICBfc2V0RXhjZXB0aW9uKFB5RXhjX1ZhbHVlRXJyb3IpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgZW5kOgorICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBhc3N3b3JkKTsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZzYWx0KTsKKyAgICByZXR1cm4ga2V5X29iajsKK30KKworI2VuZGlmCisKIC8qCiAgKiAgVGhpcyBtYWNybyBnZW5lcmF0ZXMgY29uc3RydWN0b3IgZnVuY3Rpb24gZGVmaW5pdGlvbnMgZm9yIHNwZWNpZmljCiAgKiAgaGFzaCBhbGdvcml0aG1zLiAgVGhlc2UgY29uc3RydWN0b3JzIGFyZSBtdWNoIGZhc3RlciB0aGFuIGNhbGxpbmcKQEAgLTUyNCwxMiArNzQ2LDE1IEBACiAgICAgICAgICAgICAgICAgICAiIGhhc2ggb2JqZWN0OyBvcHRpb25hbGx5IGluaXRpYWxpemVkIHdpdGggYSBzdHJpbmciKSBcCiAgICAgfQogCi0vKiB1c2VkIGluIHRoZSBpbml0IGZ1bmN0aW9uIHRvIHNldHVwIGEgY29uc3RydWN0b3IgKi8KKy8qIHVzZWQgaW4gdGhlIGluaXQgZnVuY3Rpb24gdG8gc2V0dXAgYSBjb25zdHJ1Y3RvcjogaW5pdGlhbGl6ZSBPcGVuU1NMCisgICBjb25zdHJ1Y3RvciBjb25zdGFudHMgaWYgdGhleSBoYXZlbid0IGJlZW4gaW5pdGlhbGl6ZWQgYWxyZWFkeS4gICovCiAjZGVmaW5lIElOSVRfQ09OU1RSVUNUT1JfQ09OU1RBTlRTKE5BTUUpICBkbyB7IFwKKyAgICBpZiAoQ09OU1RfICMjIE5BTUUgIyMgX25hbWVfb2JqID09IE5VTEwpIHsgXAogICAgIENPTlNUXyAjIyBOQU1FICMjIF9uYW1lX29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoI05BTUUpOyBcCi0gICAgaWYgKEVWUF9nZXRfZGlnZXN0YnluYW1lKCNOQU1FKSkgeyBcCi0gICAgICAgIENPTlNUX25ld18gIyMgTkFNRSAjIyBfY3R4X3AgPSAmQ09OU1RfbmV3XyAjIyBOQU1FICMjIF9jdHg7IFwKLSAgICAgICAgRVZQX0RpZ2VzdEluaXQoQ09OU1RfbmV3XyAjIyBOQU1FICMjIF9jdHhfcCwgRVZQX2dldF9kaWdlc3RieW5hbWUoI05BTUUpKTsgXAorICAgICAgICBpZiAoRVZQX2dldF9kaWdlc3RieW5hbWUoI05BTUUpKSB7IFwKKyAgICAgICAgICAgIENPTlNUX25ld18gIyMgTkFNRSAjIyBfY3R4X3AgPSAmQ09OU1RfbmV3XyAjIyBOQU1FICMjIF9jdHg7IFwKKyAgICAgICAgICAgIEVWUF9EaWdlc3RJbml0KENPTlNUX25ld18gIyMgTkFNRSAjIyBfY3R4X3AsIEVWUF9nZXRfZGlnZXN0YnluYW1lKCNOQU1FKSk7IFwKKyAgICAgICAgfSBcCiAgICAgfSBcCiB9IHdoaWxlICgwKTsKIApAQCAtNTU0LDYgKzc3OSwxMCBAQAogICAgIENPTlNUUlVDVE9SX01FVEhfREVGKHNoYTM4NCksCiAgICAgQ09OU1RSVUNUT1JfTUVUSF9ERUYoc2hhNTEyKSwKICNlbmRpZgorI2lmZGVmIFBZX1BCS0RGMl9ITUFDCisgICAgeyJwYmtkZjJfaG1hYyIsIChQeUNGdW5jdGlvbilwYmtkZjJfaG1hYywgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCisgICAgIHBia2RmMl9obWFjX19kb2NfX30sCisjZW5kaWYKICAgICB7TlVMTCwgICAgICBOVUxMfSAgICAgICAgICAgIC8qIFNlbnRpbmVsICovCiB9OwogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19oZWFwcW1vZHVsZS5jIGIvTW9kdWxlcy9faGVhcHFtb2R1bGUuYwppbmRleCA0OTUxMTRiLi4zMGNlZGI5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19oZWFwcW1vZHVsZS5jCisrKyBiL01vZHVsZXMvX2hlYXBxbW9kdWxlLmMKQEAgLTM1LDEyICszNSwxNCBAQAogc3RhdGljIGludAogX3NpZnRkb3duKFB5TGlzdE9iamVjdCAqaGVhcCwgUHlfc3NpemVfdCBzdGFydHBvcywgUHlfc3NpemVfdCBwb3MpCiB7Ci0gICAgUHlPYmplY3QgKm5ld2l0ZW0sICpwYXJlbnQ7CisgICAgUHlPYmplY3QgKm5ld2l0ZW0sICpwYXJlbnQsICpvbGRpdGVtOwogICAgIGludCBjbXA7CiAgICAgUHlfc3NpemVfdCBwYXJlbnRwb3M7CisgICAgUHlfc3NpemVfdCBzaXplOwogCiAgICAgYXNzZXJ0KFB5TGlzdF9DaGVjayhoZWFwKSk7Ci0gICAgaWYgKHBvcyA+PSBQeUxpc3RfR0VUX1NJWkUoaGVhcCkpIHsKKyAgICBzaXplID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOworICAgIGlmIChwb3MgPj0gc2l6ZSkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtNTcsMTIgKzU5LDI0IEBACiAgICAgICAgICAgICBQeV9ERUNSRUYobmV3aXRlbSk7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgIT0gUHlMaXN0X0dFVF9TSVpFKGhlYXApKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYobmV3aXRlbSk7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaXN0IGNoYW5nZWQgc2l6ZSBkdXJpbmcgaXRlcmF0aW9uIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KICAgICAgICAgaWYgKGNtcCA9PSAwKQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIFB5X0lOQ1JFRihwYXJlbnQpOwotICAgICAgICBQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOworICAgICAgICBvbGRpdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcyk7CiAgICAgICAgIFB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIHBhcmVudCk7CisgICAgICAgIFB5X0RFQ1JFRihvbGRpdGVtKTsKICAgICAgICAgcG9zID0gcGFyZW50cG9zOworICAgICAgICBpZiAoc2l6ZSAhPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpc3QgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb24iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQogICAgIH0KICAgICBQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOwogICAgIFB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIG5ld2l0ZW0pOwpAQCAtNzIsMTIgKzg2LDE0IEBACiBzdGF0aWMgaW50CiBfc2lmdHVwKFB5TGlzdE9iamVjdCAqaGVhcCwgUHlfc3NpemVfdCBwb3MpCiB7Ci0gICAgUHlfc3NpemVfdCBzdGFydHBvcywgZW5kcG9zLCBjaGlsZHBvcywgcmlnaHRwb3M7CisgICAgUHlfc3NpemVfdCBzdGFydHBvcywgZW5kcG9zLCBjaGlsZHBvcywgcmlnaHRwb3MsIGxpbWl0OwogICAgIGludCBjbXA7Ci0gICAgUHlPYmplY3QgKm5ld2l0ZW0sICp0bXA7CisgICAgUHlPYmplY3QgKm5ld2l0ZW0sICp0bXAsICpvbGRpdGVtOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKIAogICAgIGFzc2VydChQeUxpc3RfQ2hlY2soaGVhcCkpOwotICAgIGVuZHBvcyA9IFB5TGlzdF9HRVRfU0laRShoZWFwKTsKKyAgICBzaXplID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOworICAgIGVuZHBvcyA9IHNpemU7CiAgICAgc3RhcnRwb3MgPSBwb3M7CiAgICAgaWYgKHBvcyA+PSBlbmRwb3MpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsKQEAgLTg3LDkgKzEwMywxMCBAQAogICAgIFB5X0lOQ1JFRihuZXdpdGVtKTsKIAogICAgIC8qIEJ1YmJsZSB1cCB0aGUgc21hbGxlciBjaGlsZCB1bnRpbCBoaXR0aW5nIGEgbGVhZi4gKi8KLSAgICBjaGlsZHBvcyA9IDIqcG9zICsgMTsgICAgLyogbGVmdG1vc3QgY2hpbGQgcG9zaXRpb24gICovCi0gICAgd2hpbGUgKGNoaWxkcG9zIDwgZW5kcG9zKSB7CisgICAgbGltaXQgPSBlbmRwb3MgLyAyOyAgICAgICAgICAvKiBzbWFsbGVzdCBwb3MgdGhhdCBoYXMgbm8gY2hpbGQgKi8KKyAgICB3aGlsZSAocG9zIDwgbGltaXQpIHsKICAgICAgICAgLyogU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIHNtYWxsZXIgY2hpbGQuICAgKi8KKyAgICAgICAgY2hpbGRwb3MgPSAyKnBvcyArIDE7ICAgIC8qIGxlZnRtb3N0IGNoaWxkIHBvc2l0aW9uICAqLwogICAgICAgICByaWdodHBvcyA9IGNoaWxkcG9zICsgMTsKICAgICAgICAgaWYgKHJpZ2h0cG9zIDwgZW5kcG9zKSB7CiAgICAgICAgICAgICBjbXAgPSBjbXBfbHQoCkBAIC0xMDIsMTYgKzExOSwyNyBAQAogICAgICAgICAgICAgaWYgKGNtcCA9PSAwKQogICAgICAgICAgICAgICAgIGNoaWxkcG9zID0gcmlnaHRwb3M7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgIT0gUHlMaXN0X0dFVF9TSVpFKGhlYXApKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYobmV3aXRlbSk7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaXN0IGNoYW5nZWQgc2l6ZSBkdXJpbmcgaXRlcmF0aW9uIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KICAgICAgICAgLyogTW92ZSB0aGUgc21hbGxlciBjaGlsZCB1cC4gKi8KICAgICAgICAgdG1wID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIGNoaWxkcG9zKTsKICAgICAgICAgUHlfSU5DUkVGKHRtcCk7Ci0gICAgICAgIFB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7CisgICAgICAgIG9sZGl0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKTsKICAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgdG1wKTsKKyAgICAgICAgUHlfREVDUkVGKG9sZGl0ZW0pOwogICAgICAgICBwb3MgPSBjaGlsZHBvczsKLSAgICAgICAgY2hpbGRwb3MgPSAyKnBvcyArIDE7CisgICAgICAgIGlmIChzaXplICE9IFB5TGlzdF9HRVRfU0laRShoZWFwKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGlzdCBjaGFuZ2VkIHNpemUgZHVyaW5nIGl0ZXJhdGlvbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CiAgICAgfQogCi0gICAgLyogVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYW5kIGJ1YmJsZQorICAgIC8qIFRoZSBsZWFmIGF0IHBvcyBpcyBlbXB0eSBub3cuICBQdXQgbmV3aXRlbSB0aGVyZSwgYW5kIGJ1YmJsZQogICAgICAgIGl0IHVwIHRvIGl0cyBmaW5hbCByZXN0aW5nIHBsYWNlIChieSBzaWZ0aW5nIGl0cyBwYXJlbnRzIGRvd24pLiAqLwogICAgIFB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7CiAgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgbmV3aXRlbSk7CkBAIC0xNDEsNyArMTY5LDcgQEAKIH0KIAogUHlEb2NfU1RSVkFSKGhlYXBwdXNoX2RvYywKLSJQdXNoIGl0ZW0gb250byBoZWFwLCBtYWludGFpbmluZyB0aGUgaGVhcCBpbnZhcmlhbnQuIik7CisiaGVhcHB1c2goaGVhcCwgaXRlbSkgLT4gTm9uZS4gUHVzaCBpdGVtIG9udG8gaGVhcCwgbWFpbnRhaW5pbmcgdGhlIGhlYXAgaW52YXJpYW50LiIpOwogCiBzdGF0aWMgUHlPYmplY3QgKgogaGVhcHBvcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmhlYXApCkBAIC0yMDksNyArMjM3LDcgQEAKIH0KIAogUHlEb2NfU1RSVkFSKGhlYXByZXBsYWNlX2RvYywKLSJQb3AgYW5kIHJldHVybiB0aGUgY3VycmVudCBzbWFsbGVzdCB2YWx1ZSwgYW5kIGFkZCB0aGUgbmV3IGl0ZW0uXG5cCisiaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSkgLT4gdmFsdWUuIFBvcCBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IHNtYWxsZXN0IHZhbHVlLCBhbmQgYWRkIHRoZSBuZXcgaXRlbS5cblwKIFxuXAogVGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGhlYXBwb3AoKSBmb2xsb3dlZCBieSBoZWFwcHVzaCgpLCBhbmQgY2FuIGJlXG5cCiBtb3JlIGFwcHJvcHJpYXRlIHdoZW4gdXNpbmcgYSBmaXhlZC1zaXplIGhlYXAuICBOb3RlIHRoYXQgdGhlIHZhbHVlXG5cCkBAIC0yNTYsNyArMjg0LDcgQEAKIH0KIAogUHlEb2NfU1RSVkFSKGhlYXBwdXNocG9wX2RvYywKLSJQdXNoIGl0ZW0gb24gdGhlIGhlYXAsIHRoZW4gcG9wIGFuZCByZXR1cm4gdGhlIHNtYWxsZXN0IGl0ZW1cblwKKyJoZWFwcHVzaHBvcChoZWFwLCBpdGVtKSAtPiB2YWx1ZS4gUHVzaCBpdGVtIG9uIHRoZSBoZWFwLCB0aGVuIHBvcCBhbmQgcmV0dXJuIHRoZSBzbWFsbGVzdCBpdGVtXG5cCiBmcm9tIHRoZSBoZWFwLiBUaGUgY29tYmluZWQgYWN0aW9uIHJ1bnMgbW9yZSBlZmZpY2llbnRseSB0aGFuXG5cCiBoZWFwcHVzaCgpIGZvbGxvd2VkIGJ5IGEgc2VwYXJhdGUgY2FsbCB0byBoZWFwcG9wKCkuIik7CiAKQEAgLTQxMSw3ICs0MzksNyBAQAogc3RhdGljIGludAogX3NpZnR1cG1heChQeUxpc3RPYmplY3QgKmhlYXAsIFB5X3NzaXplX3QgcG9zKQogewotICAgIFB5X3NzaXplX3Qgc3RhcnRwb3MsIGVuZHBvcywgY2hpbGRwb3MsIHJpZ2h0cG9zOworICAgIFB5X3NzaXplX3Qgc3RhcnRwb3MsIGVuZHBvcywgY2hpbGRwb3MsIHJpZ2h0cG9zLCBsaW1pdDsKICAgICBpbnQgY21wOwogICAgIFB5T2JqZWN0ICpuZXdpdGVtLCAqdG1wOwogCkBAIC00MjYsOSArNDU0LDEwIEBACiAgICAgUHlfSU5DUkVGKG5ld2l0ZW0pOwogCiAgICAgLyogQnViYmxlIHVwIHRoZSBzbWFsbGVyIGNoaWxkIHVudGlsIGhpdHRpbmcgYSBsZWFmLiAqLwotICAgIGNoaWxkcG9zID0gMipwb3MgKyAxOyAgICAvKiBsZWZ0bW9zdCBjaGlsZCBwb3NpdGlvbiAgKi8KLSAgICB3aGlsZSAoY2hpbGRwb3MgPCBlbmRwb3MpIHsKKyAgICBsaW1pdCA9IGVuZHBvcyAvIDI7ICAgICAgICAgIC8qIHNtYWxsZXN0IHBvcyB0aGF0IGhhcyBubyBjaGlsZCAqLworICAgIHdoaWxlIChwb3MgPCBsaW1pdCkgewogICAgICAgICAvKiBTZXQgY2hpbGRwb3MgdG8gaW5kZXggb2Ygc21hbGxlciBjaGlsZC4gICAqLworICAgICAgICBjaGlsZHBvcyA9IDIqcG9zICsgMTsgICAgLyogbGVmdG1vc3QgY2hpbGQgcG9zaXRpb24gICovCiAgICAgICAgIHJpZ2h0cG9zID0gY2hpbGRwb3MgKyAxOwogICAgICAgICBpZiAocmlnaHRwb3MgPCBlbmRwb3MpIHsKICAgICAgICAgICAgIGNtcCA9IGNtcF9sdCgKQEAgLTQ0NywxMCArNDc2LDkgQEAKICAgICAgICAgUHlfREVDUkVGKFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpKTsKICAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgdG1wKTsKICAgICAgICAgcG9zID0gY2hpbGRwb3M7Ci0gICAgICAgIGNoaWxkcG9zID0gMipwb3MgKyAxOwogICAgIH0KIAotICAgIC8qIFRoZSBsZWFmIGF0IHBvcyBpcyBlbXB0eSBub3cuICBQdXQgbmV3aXRlbSB0aGVyZSwgYW5kIGFuZCBidWJibGUKKyAgICAvKiBUaGUgbGVhZiBhdCBwb3MgaXMgZW1wdHkgbm93LiAgUHV0IG5ld2l0ZW0gdGhlcmUsIGFuZCBidWJibGUKICAgICAgICBpdCB1cCB0byBpdHMgZmluYWwgcmVzdGluZyBwbGFjZSAoYnkgc2lmdGluZyBpdHMgcGFyZW50cyBkb3duKS4gKi8KICAgICBQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOwogICAgIFB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIG5ld2l0ZW0pOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faW8vX2lvbW9kdWxlLmMgYi9Nb2R1bGVzL19pby9faW9tb2R1bGUuYwppbmRleCA2ZDcxMjFjLi4yOWRiMTY0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19pby9faW9tb2R1bGUuYworKysgYi9Nb2R1bGVzL19pby9faW9tb2R1bGUuYwpAQCAtNTgsOCArNTgsOCBAQAogIlxuIgogIkF0IHRoZSB0b3Agb2YgdGhlIEkvTyBoaWVyYXJjaHkgaXMgdGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgSU9CYXNlLiBJdFxuIgogImRlZmluZXMgdGhlIGJhc2ljIGludGVyZmFjZSB0byBhIHN0cmVhbS4gTm90ZSwgaG93ZXZlciwgdGhhdCB0aGVyZSBpcyBub1xuIgotInNlcGVyYXRpb24gYmV0d2VlbiByZWFkaW5nIGFuZCB3cml0aW5nIHRvIHN0cmVhbXM7IGltcGxlbWVudGF0aW9ucyBhcmVcbiIKLSJhbGxvd2VkIHRvIHRocm93IGFuIElPRXJyb3IgaWYgdGhleSBkbyBub3Qgc3VwcG9ydCBhIGdpdmVuIG9wZXJhdGlvbi5cbiIKKyJzZXBhcmF0aW9uIGJldHdlZW4gcmVhZGluZyBhbmQgd3JpdGluZyB0byBzdHJlYW1zOyBpbXBsZW1lbnRhdGlvbnMgYXJlXG4iCisiYWxsb3dlZCB0byByYWlzZSBhbiBJT0Vycm9yIGlmIHRoZXkgZG8gbm90IHN1cHBvcnQgYSBnaXZlbiBvcGVyYXRpb24uXG4iCiAiXG4iCiAiRXh0ZW5kaW5nIElPQmFzZSBpcyBSYXdJT0Jhc2Ugd2hpY2ggZGVhbHMgc2ltcGx5IHdpdGggdGhlIHJlYWRpbmcgYW5kXG4iCiAid3JpdGluZyBvZiByYXcgYnl0ZXMgdG8gYSBzdHJlYW0uIEZpbGVJTyBzdWJjbGFzc2VzIFJhd0lPQmFzZSB0byBwcm92aWRlXG4iCkBAIC0zMDAsOSArMzAwLDEwIEBACiAgICAgaW50IHRleHQgPSAwLCBiaW5hcnkgPSAwLCB1bml2ZXJzYWwgPSAwOwogCiAgICAgY2hhciByYXdtb2RlWzVdLCAqbTsKLSAgICBpbnQgbGluZV9idWZmZXJpbmcsIGlzYXR0eTsKKyAgICBpbnQgbGluZV9idWZmZXJpbmc7CisgICAgbG9uZyBpc2F0dHk7CiAKLSAgICBQeU9iamVjdCAqcmF3LCAqbW9kZW9iaiA9IE5VTEwsICpidWZmZXIgPSBOVUxMLCAqd3JhcHBlciA9IE5VTEw7CisgICAgUHlPYmplY3QgKnJhdywgKm1vZGVvYmogPSBOVUxMLCAqYnVmZmVyLCAqd3JhcHBlciwgKnJlc3VsdCA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xzaXp6emk6b3BlbiIsIGt3bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZSwgJm1vZGUsICZidWZmZXJpbmcsCkBAIC00MTUsNiArNDE2LDcgQEAKIAkJCQkiT3NpIiwgZmlsZSwgcmF3bW9kZSwgY2xvc2VmZCk7CiAgICAgaWYgKHJhdyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSByYXc7CiAKICAgICBtb2Rlb2JqID0gUHlVbmljb2RlX0Zyb21TdHJpbmcobW9kZSk7CiAgICAgaWYgKG1vZGVvYmogPT0gTlVMTCkKQEAgLTQ0MywxMiArNDQ1LDEyIEBACiAjaWZkZWYgSEFWRV9TVFJVQ1RfU1RBVF9TVF9CTEtTSVpFCiAgICAgICAgIHsKICAgICAgICAgICAgIHN0cnVjdCBzdGF0IHN0OwotICAgICAgICAgICAgbG9uZyBmaWxlbm87CisgICAgICAgICAgICBpbnQgZmlsZW5vOwogICAgICAgICAgICAgUHlPYmplY3QgKnJlcyA9IFB5T2JqZWN0X0NhbGxNZXRob2QocmF3LCAiZmlsZW5vIiwgTlVMTCk7CiAgICAgICAgICAgICBpZiAocmVzID09IE5VTEwpCiAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKIAotICAgICAgICAgICAgZmlsZW5vID0gUHlJbnRfQXNMb25nKHJlcyk7CisgICAgICAgICAgICBmaWxlbm8gPSBfUHlJbnRfQXNJbnQocmVzKTsKICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOwogICAgICAgICAgICAgaWYgKGZpbGVubyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CkBAIC00NzMsNyArNDc1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIFB5X0RFQ1JFRihtb2Rlb2JqKTsKLSAgICAgICAgcmV0dXJuIHJhdzsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgICAvKiB3cmFwcyBpbnRvIGEgYnVmZmVyZWQgZmlsZSAqLwpAQCAtNDk0LDE1ICs0OTYsMTYgQEAKIAogICAgICAgICBidWZmZXIgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oQnVmZmVyZWRfY2xhc3MsICJPaSIsIHJhdywgYnVmZmVyaW5nKTsKICAgICB9Ci0gICAgUHlfQ0xFQVIocmF3KTsKICAgICBpZiAoYnVmZmVyID09IE5VTEwpCiAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgcmVzdWx0ID0gYnVmZmVyOworICAgIFB5X0RFQ1JFRihyYXcpOwogCiAKICAgICAvKiBpZiBiaW5hcnksIHJldHVybnMgdGhlIGJ1ZmZlcmVkIGZpbGUgKi8KICAgICBpZiAoYmluYXJ5KSB7CiAgICAgICAgIFB5X0RFQ1JFRihtb2Rlb2JqKTsKLSAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgICAvKiB3cmFwcyBpbnRvIGEgVGV4dElPV3JhcHBlciAqLwpAQCAtNTExLDIwICs1MTQsMzIgQEAKIAkJCQkgICAgYnVmZmVyLAogCQkJCSAgICBlbmNvZGluZywgZXJyb3JzLCBuZXdsaW5lLAogCQkJCSAgICBsaW5lX2J1ZmZlcmluZyk7Ci0gICAgUHlfQ0xFQVIoYnVmZmVyKTsKICAgICBpZiAod3JhcHBlciA9PSBOVUxMKQogICAgICAgICBnb3RvIGVycm9yOworICAgIHJlc3VsdCA9IHdyYXBwZXI7CisgICAgUHlfREVDUkVGKGJ1ZmZlcik7CiAKICAgICBpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyh3cmFwcGVyLCAibW9kZSIsIG1vZGVvYmopIDwgMCkKICAgICAgICAgZ290byBlcnJvcjsKICAgICBQeV9ERUNSRUYobW9kZW9iaik7Ci0gICAgcmV0dXJuIHdyYXBwZXI7CisgICAgcmV0dXJuIHJlc3VsdDsKIAogICBlcnJvcjoKLSAgICBQeV9YREVDUkVGKHJhdyk7CisgICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpleGMsICp2YWwsICp0YiwgKmNsb3NlX3Jlc3VsdDsKKyAgICAgICAgUHlFcnJfRmV0Y2goJmV4YywgJnZhbCwgJnRiKTsKKyAgICAgICAgY2xvc2VfcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChyZXN1bHQsICJjbG9zZSIsIE5VTEwpOworICAgICAgICBpZiAoY2xvc2VfcmVzdWx0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihjbG9zZV9yZXN1bHQpOworICAgICAgICAgICAgUHlFcnJfUmVzdG9yZShleGMsIHZhbCwgdGIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlfWERFQ1JFRihleGMpOworICAgICAgICAgICAgUHlfWERFQ1JFRih2YWwpOworICAgICAgICAgICAgUHlfWERFQ1JFRih0Yik7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgfQogICAgIFB5X1hERUNSRUYobW9kZW9iaik7Ci0gICAgUHlfWERFQ1JFRihidWZmZXIpOwotICAgIFB5X1hERUNSRUYod3JhcHBlcik7CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAMCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19pby9faW9tb2R1bGUuaCBiL01vZHVsZXMvX2lvL19pb21vZHVsZS5oCmluZGV4IDBmYTUzOTEuLmMyODJlNjEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL19pb21vZHVsZS5oCisrKyBiL01vZHVsZXMvX2lvL19pb21vZHVsZS5oCkBAIC01Nyw2ICs1NywxMSBAQAogICAgIGludCB0cmFuc2xhdGVkLCBpbnQgdW5pdmVyc2FsLCBQeU9iamVjdCAqcmVhZG5sLAogICAgIFB5X1VOSUNPREUgKnN0YXJ0LCBQeV9VTklDT0RFICplbmQsIFB5X3NzaXplX3QgKmNvbnN1bWVkKTsKIAorLyogUmV0dXJuIDEgaWYgYW4gRW52aXJvbm1lbnRFcnJvciB3aXRoIGVycm5vID09IEVJTlRSIGlzIHNldCAoYW5kIHRoZW4KKyAgIGNsZWFycyB0aGUgZXJyb3IgaW5kaWNhdG9yKSwgMCBvdGhlcndpc2UuCisgICBTaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiBQeUVycl9PY2N1cnJlZCgpIGlzIHRydWUuCisqLworZXh0ZXJuIGludCBfUHlJT190cmFwX2VpbnRyKHZvaWQpOwogCiAjZGVmaW5lIERFRkFVTFRfQlVGRkVSX1NJWkUgKDggKiAxMDI0KSAgLyogYnl0ZXMgKi8KIApAQCAtNzIsNyArNzcsNyBAQAogICAgIFB5T2JqZWN0ICpmaWxlbmFtZTsgLyogTm90IHVzZWQsIGJ1dCBwYXJ0IG9mIHRoZSBJT0Vycm9yIG9iamVjdCAqLwogICAgIFB5X3NzaXplX3Qgd3JpdHRlbjsKIH0gUHlCbG9ja2luZ0lPRXJyb3JPYmplY3Q7Ci1QeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX0Jsb2NraW5nSU9FcnJvcjsKK2V4dGVybiBQeU9iamVjdCAqUHlFeGNfQmxvY2tpbmdJT0Vycm9yOwogCiAvKgogICogT2Zmc2V0IHR5cGUgZm9yIHBvc2l0aW9uaW5nLgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faW8vYnVmZmVyZWRpby5jIGIvTW9kdWxlcy9faW8vYnVmZmVyZWRpby5jCmluZGV4IDliNDAzZDkuLjc1OGVkZjQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL2J1ZmZlcmVkaW8uYworKysgYi9Nb2R1bGVzL19pby9idWZmZXJlZGlvLmMKQEAgLTM4Niw2ICszODYsMTcgQEAKICAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCitzdGF0aWMgUHlPYmplY3QgKgorYnVmZmVyZWRfc2l6ZW9mKGJ1ZmZlcmVkICpzZWxmLCB2b2lkICp1bnVzZWQpCit7CisgICAgUHlfc3NpemVfdCByZXM7CisKKyAgICByZXMgPSBzaXplb2YoYnVmZmVyZWQpOworICAgIGlmIChzZWxmLT5idWZmZXIpCisgICAgICAgIHJlcyArPSBzZWxmLT5idWZmZXJfc2l6ZTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Tc2l6ZV90KHJlcyk7Cit9CisKIHN0YXRpYyBpbnQKIGJ1ZmZlcmVkX3RyYXZlcnNlKGJ1ZmZlcmVkICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKQEAgLTQ0NCw3ICs0NTUsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1ZmZlcmVkX2Nsb3NlKGJ1ZmZlcmVkICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzID0gTlVMTCwgKmV4YyA9IE5VTEwsICp2YWwsICp0YjsKICAgICBpbnQgcjsKIAogICAgIENIRUNLX0lOSVRJQUxJWkVEKHNlbGYpCkBAIC00NjQsMTMgKzQ3NSwyNSBAQAogICAgIHJlcyA9IFB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzKChQeU9iamVjdCAqKXNlbGYsIF9QeUlPX3N0cl9mbHVzaCwgTlVMTCk7CiAgICAgaWYgKCFFTlRFUl9CVUZGRVJFRChzZWxmKSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKHJlcyA9PSBOVUxMKSB7Ci0gICAgICAgIGdvdG8gZW5kOwotICAgIH0KLSAgICBQeV9YREVDUkVGKHJlcyk7CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICBQeUVycl9GZXRjaCgmZXhjLCAmdmFsLCAmdGIpOworICAgIGVsc2UKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CiAKICAgICByZXMgPSBQeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJncyhzZWxmLT5yYXcsIF9QeUlPX3N0cl9jbG9zZSwgTlVMTCk7CiAKKyAgICBpZiAoZXhjICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHJlcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBQeV9DTEVBUihyZXMpOworICAgICAgICAgICAgUHlFcnJfUmVzdG9yZShleGMsIHZhbCwgdGIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlfREVDUkVGKGV4Yyk7CisgICAgICAgICAgICBQeV9YREVDUkVGKHZhbCk7CisgICAgICAgICAgICBQeV9YREVDUkVGKHRiKTsKKyAgICAgICAgfQorICAgIH0KKwogZW5kOgogICAgIExFQVZFX0JVRkZFUkVEKHNlbGYpCiAgICAgcmV0dXJuIHJlczsKQEAgLTY5OSw4ICs3MjIsOCBAQAogICAgY2xlYXJzIHRoZSBlcnJvciBpbmRpY2F0b3IpLCAwIG90aGVyd2lzZS4KICAgIFNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIFB5RXJyX09jY3VycmVkKCkgaXMgdHJ1ZS4KICovCi1zdGF0aWMgaW50Ci1fdHJhcF9laW50cih2b2lkKQoraW50CitfUHlJT190cmFwX2VpbnRyKHZvaWQpCiB7CiAgICAgc3RhdGljIFB5T2JqZWN0ICplaW50cl9pbnQgPSBOVUxMOwogICAgIFB5T2JqZWN0ICp0eXAsICp2YWwsICp0YjsKQEAgLTEyODUsNyArMTMwOCw3IEBACiAgICAgKi8KICAgICBkbyB7CiAgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzKHNlbGYtPnJhdywgX1B5SU9fc3RyX3JlYWRpbnRvLCBtZW1vYmosIE5VTEwpOwotICAgIH0gd2hpbGUgKHJlcyA9PSBOVUxMICYmIF90cmFwX2VpbnRyKCkpOworICAgIH0gd2hpbGUgKHJlcyA9PSBOVUxMICYmIF9QeUlPX3RyYXBfZWludHIoKSk7CiAgICAgUHlfREVDUkVGKG1lbW9iaik7CiAgICAgaWYgKHJlcyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gLTE7CkBAIC0xNTYwLDYgKzE1ODMsNyBAQAogICAgIHsic2VlayIsIChQeUNGdW5jdGlvbilidWZmZXJlZF9zZWVrLCBNRVRIX1ZBUkFSR1N9LAogICAgIHsidGVsbCIsIChQeUNGdW5jdGlvbilidWZmZXJlZF90ZWxsLCBNRVRIX05PQVJHU30sCiAgICAgeyJ0cnVuY2F0ZSIsIChQeUNGdW5jdGlvbilidWZmZXJlZF90cnVuY2F0ZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7Il9fc2l6ZW9mX18iLCAoUHlDRnVuY3Rpb24pYnVmZmVyZWRfc2l6ZW9mLCBNRVRIX05PQVJHU30sCiAgICAge05VTEwsIE5VTEx9CiB9OwogCkBAIC0xNjU5LDcgKzE2ODMsNyBAQAogICAgIHNlbGYtPm9rID0gMDsKICAgICBzZWxmLT5kZXRhY2hlZCA9IDA7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xubjpCdWZmZXJlZFJlYWRlciIsIGt3bGlzdCwKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xubjpCdWZmZXJlZFdyaXRlciIsIGt3bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmF3LCAmYnVmZmVyX3NpemUsICZtYXhfYnVmZmVyX3NpemUpKSB7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CkBAIC0xNzExLDcgKzE3MzUsNyBAQAogICAgICAgICBlcnJubyA9IDA7CiAgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzKHNlbGYtPnJhdywgX1B5SU9fc3RyX3dyaXRlLCBtZW1vYmosIE5VTEwpOwogICAgICAgICBlcnJudW0gPSBlcnJubzsKLSAgICB9IHdoaWxlIChyZXMgPT0gTlVMTCAmJiBfdHJhcF9laW50cigpKTsKKyAgICB9IHdoaWxlIChyZXMgPT0gTlVMTCAmJiBfUHlJT190cmFwX2VpbnRyKCkpOwogICAgIFB5X0RFQ1JFRihtZW1vYmopOwogICAgIGlmIChyZXMgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMTk1Miw2ICsxOTc2LDcgQEAKICAgICB7ImZsdXNoIiwgKFB5Q0Z1bmN0aW9uKWJ1ZmZlcmVkX2ZsdXNoLCBNRVRIX05PQVJHU30sCiAgICAgeyJzZWVrIiwgKFB5Q0Z1bmN0aW9uKWJ1ZmZlcmVkX3NlZWssIE1FVEhfVkFSQVJHU30sCiAgICAgeyJ0ZWxsIiwgKFB5Q0Z1bmN0aW9uKWJ1ZmZlcmVkX3RlbGwsIE1FVEhfTk9BUkdTfSwKKyAgICB7Il9fc2l6ZW9mX18iLCAoUHlDRnVuY3Rpb24pYnVmZmVyZWRfc2l6ZW9mLCBNRVRIX05PQVJHU30sCiAgICAge05VTEwsIE5VTEx9CiB9OwogCkBAIC0yMTA0LDkgKzIxMjksMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfZm9yd2FyZF9jYWxsKGJ1ZmZlcmVkICpzZWxmLCBjb25zdCBjaGFyICpuYW1lLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQeU9iamVjdCAqZnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7Ci0gICAgUHlPYmplY3QgKnJldDsKKyAgICBQeU9iamVjdCAqZnVuYywgKnJldDsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkkvTyBvcGVyYXRpb24gb24gdW5pbml0aWFsaXplZCBvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCisgICAgZnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CiAgICAgaWYgKGZ1bmMgPT0gTlVMTCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTIyOTEsNyArMjMyMSw3IEBACiAgICAgc2VsZi0+b2sgPSAwOwogICAgIHNlbGYtPmRldGFjaGVkID0gMDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfG5uOkJ1ZmZlcmVkUmVhZGVyIiwga3dsaXN0LAorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfG5uOkJ1ZmZlcmVkUmFuZG9tIiwga3dsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyYXcsICZidWZmZXJfc2l6ZSwgJm1heF9idWZmZXJfc2l6ZSkpIHsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTIzNDcsNiArMjM3Nyw3IEBACiAgICAgeyJyZWFkbGluZSIsIChQeUNGdW5jdGlvbilidWZmZXJlZF9yZWFkbGluZSwgTUVUSF9WQVJBUkdTfSwKICAgICB7InBlZWsiLCAoUHlDRnVuY3Rpb24pYnVmZmVyZWRfcGVlaywgTUVUSF9WQVJBUkdTfSwKICAgICB7IndyaXRlIiwgKFB5Q0Z1bmN0aW9uKWJ1ZmZlcmVkd3JpdGVyX3dyaXRlLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiX19zaXplb2ZfXyIsIChQeUNGdW5jdGlvbilidWZmZXJlZF9zaXplb2YsIE1FVEhfTk9BUkdTfSwKICAgICB7TlVMTCwgTlVMTH0KIH07CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL2J5dGVzaW8uYyBiL01vZHVsZXMvX2lvL2J5dGVzaW8uYwppbmRleCA1MWZhZDIxLi42NDk4MzIwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19pby9ieXRlc2lvLmMKKysrIGIvTW9kdWxlcy9faW8vYnl0ZXNpby5jCkBAIC0xMDYsNyArMTA2LDcgQEAKIH0KIAogLyogSW50ZXJuYWwgcm91dGluZSBmb3Igd3JpdGluZyBhIHN0cmluZyBvZiBieXRlcyB0byB0aGUgYnVmZmVyIG9mIGEgQnl0ZXNJTwotICAgb2JqZWN0LiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JvdGUsIG9yIC0xIG9uIGVycm9yLiAqLworICAgb2JqZWN0LiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwgb3IgLTEgb24gZXJyb3IuICovCiBzdGF0aWMgUHlfc3NpemVfdAogd3JpdGVfYnl0ZXMoYnl0ZXNpbyAqc2VsZiwgY29uc3QgY2hhciAqYnl0ZXMsIFB5X3NzaXplX3QgbGVuKQogewpAQCAtMTU2LDEwICsxNTYsMjAgQEAKICAgICB9CiB9CiAKK1B5RG9jX1NUUlZBUihyZWFkYWJsZV9kb2MsCisicmVhZGFibGUoKSAtPiBib29sLiBSZXR1cm5zIFRydWUgaWYgdGhlIElPIG9iamVjdCBjYW4gYmUgcmVhZC4iKTsKKworUHlEb2NfU1RSVkFSKHdyaXRhYmxlX2RvYywKKyJ3cml0YWJsZSgpIC0+IGJvb2wuIFJldHVybnMgVHJ1ZSBpZiB0aGUgSU8gb2JqZWN0IGNhbiBiZSB3cml0dGVuLiIpOworCitQeURvY19TVFJWQVIoc2Vla2FibGVfZG9jLAorInNlZWthYmxlKCkgLT4gYm9vbC4gUmV0dXJucyBUcnVlIGlmIHRoZSBJTyBvYmplY3QgY2FuIGJlIHNlZWtlZC4iKTsKKwogLyogR2VuZXJpYyBnZXR0ZXIgZm9yIHRoZSB3cml0YWJsZSwgcmVhZGFibGUgYW5kIHNlZWthYmxlIHByb3BlcnRpZXMgKi8KIHN0YXRpYyBQeU9iamVjdCAqCi1yZXR1cm5fdHJ1ZShieXRlc2lvICpzZWxmKQorcmV0dXJuX25vdF9jbG9zZWQoYnl0ZXNpbyAqc2VsZikKIHsKKyAgICBDSEVDS19DTE9TRUQoc2VsZik7CiAgICAgUHlfUkVUVVJOX1RSVUU7CiB9CiAKQEAgLTc5NCw2ICs4MDQsMTcgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIFB5T2JqZWN0ICoKK2J5dGVzaW9fc2l6ZW9mKGJ5dGVzaW8gKnNlbGYsIHZvaWQgKnVudXNlZCkKK3sKKyAgICBQeV9zc2l6ZV90IHJlczsKKworICAgIHJlcyA9IHNpemVvZihieXRlc2lvKTsKKyAgICBpZiAoc2VsZi0+YnVmKQorICAgICAgICByZXMgKz0gc2VsZi0+YnVmX3NpemU7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChyZXMpOworfQorCiBzdGF0aWMgaW50CiBieXRlc2lvX3RyYXZlcnNlKGJ5dGVzaW8gKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewpAQCAtODE2LDkgKzgzNyw5IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIGJ5dGVzaW9fbWV0aG9kc1tdID0gewotICAgIHsicmVhZGFibGUiLCAgIChQeUNGdW5jdGlvbilyZXR1cm5fdHJ1ZSwgICAgICAgIE1FVEhfTk9BUkdTLCBOVUxMfSwKLSAgICB7InNlZWthYmxlIiwgICAoUHlDRnVuY3Rpb24pcmV0dXJuX3RydWUsICAgICAgICBNRVRIX05PQVJHUywgTlVMTH0sCi0gICAgeyJ3cml0YWJsZSIsICAgKFB5Q0Z1bmN0aW9uKXJldHVybl90cnVlLCAgICAgICAgTUVUSF9OT0FSR1MsIE5VTEx9LAorICAgIHsicmVhZGFibGUiLCAgIChQeUNGdW5jdGlvbilyZXR1cm5fbm90X2Nsb3NlZCwgIE1FVEhfTk9BUkdTLCByZWFkYWJsZV9kb2N9LAorICAgIHsic2Vla2FibGUiLCAgIChQeUNGdW5jdGlvbilyZXR1cm5fbm90X2Nsb3NlZCwgIE1FVEhfTk9BUkdTLCBzZWVrYWJsZV9kb2N9LAorICAgIHsid3JpdGFibGUiLCAgIChQeUNGdW5jdGlvbilyZXR1cm5fbm90X2Nsb3NlZCwgIE1FVEhfTk9BUkdTLCB3cml0YWJsZV9kb2N9LAogICAgIHsiY2xvc2UiLCAgICAgIChQeUNGdW5jdGlvbilieXRlc2lvX2Nsb3NlLCAgICAgIE1FVEhfTk9BUkdTLCBjbG9zZV9kb2N9LAogICAgIHsiZmx1c2giLCAgICAgIChQeUNGdW5jdGlvbilieXRlc2lvX2ZsdXNoLCAgICAgIE1FVEhfTk9BUkdTLCBmbHVzaF9kb2N9LAogICAgIHsiaXNhdHR5IiwgICAgIChQeUNGdW5jdGlvbilieXRlc2lvX2lzYXR0eSwgICAgIE1FVEhfTk9BUkdTLCBpc2F0dHlfZG9jfSwKQEAgLTgzNSw2ICs4NTYsNyBAQAogICAgIHsidHJ1bmNhdGUiLCAgIChQeUNGdW5jdGlvbilieXRlc2lvX3RydW5jYXRlLCAgIE1FVEhfVkFSQVJHUywgdHJ1bmNhdGVfZG9jfSwKICAgICB7Il9fZ2V0c3RhdGVfXyIsICAoUHlDRnVuY3Rpb24pYnl0ZXNpb19nZXRzdGF0ZSwgIE1FVEhfTk9BUkdTLCBOVUxMfSwKICAgICB7Il9fc2V0c3RhdGVfXyIsICAoUHlDRnVuY3Rpb24pYnl0ZXNpb19zZXRzdGF0ZSwgIE1FVEhfTywgTlVMTH0sCisgICAgeyJfX3NpemVvZl9fIiwgKFB5Q0Z1bmN0aW9uKWJ5dGVzaW9fc2l6ZW9mLCAgICAgTUVUSF9OT0FSR1MsIE5VTEx9LAogICAgIHtOVUxMLCBOVUxMfSAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL2ZpbGVpby5jIGIvTW9kdWxlcy9faW8vZmlsZWlvLmMKaW5kZXggMDA0ODI0MC4uNjg5MGVjMyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vZmlsZWlvLmMKKysrIGIvTW9kdWxlcy9faW8vZmlsZWlvLmMKQEAgLTQ3LDYgKzQ3LDcgQEAKICAgICBpbnQgZmQ7CiAgICAgdW5zaWduZWQgaW50IHJlYWRhYmxlIDogMTsKICAgICB1bnNpZ25lZCBpbnQgd3JpdGFibGUgOiAxOworICAgIHVuc2lnbmVkIGludCBhcHBlbmRpbmcgOiAxOwogICAgIHNpZ25lZCBpbnQgc2Vla2FibGUgOiAyOyAvKiAtMSBtZWFucyB1bmtub3duICovCiAgICAgdW5zaWduZWQgaW50IGNsb3NlZmQgOiAxOwogICAgIFB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsKQEAgLTEyNCw2ICsxMjUsNyBAQAogICAgICAgICBzZWxmLT5mZCA9IC0xOwogICAgICAgICBzZWxmLT5yZWFkYWJsZSA9IDA7CiAgICAgICAgIHNlbGYtPndyaXRhYmxlID0gMDsKKyAgICAgICAgc2VsZi0+YXBwZW5kaW5nID0gMDsKICAgICAgICAgc2VsZi0+c2Vla2FibGUgPSAtMTsKICAgICAgICAgc2VsZi0+Y2xvc2VmZCA9IDE7CiAgICAgICAgIHNlbGYtPndlYWtyZWZsaXN0ID0gTlVMTDsKQEAgLTEzNywyMiArMTM5LDE1IEBACiAgICBkaXJlY3Rvcmllcywgc28gd2UgbmVlZCBhIGNoZWNrLiAgKi8KIAogc3RhdGljIGludAotZGlyY2hlY2soZmlsZWlvKiBzZWxmLCBjb25zdCBjaGFyICpuYW1lKQorZGlyY2hlY2soZmlsZWlvKiBzZWxmLCBQeU9iamVjdCAqbmFtZW9iaikKIHsKICNpZiBkZWZpbmVkKEhBVkVfRlNUQVQpICYmIGRlZmluZWQoU19JRkRJUikgJiYgZGVmaW5lZChFSVNESVIpCiAgICAgc3RydWN0IHN0YXQgYnVmOwogICAgIGlmIChzZWxmLT5mZCA8IDApCiAgICAgICAgIHJldHVybiAwOwogICAgIGlmIChmc3RhdChzZWxmLT5mZCwgJmJ1ZikgPT0gMCAmJiBTX0lTRElSKGJ1Zi5zdF9tb2RlKSkgewotICAgICAgICBjaGFyICptc2cgPSBzdHJlcnJvcihFSVNESVIpOwotICAgICAgICBQeU9iamVjdCAqZXhjOwotICAgICAgICBpZiAoaW50ZXJuYWxfY2xvc2Uoc2VsZikpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAgICAgZXhjID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKFB5RXhjX0lPRXJyb3IsICIoaXNzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFSVNESVIsIG1zZywgbmFtZSk7Ci0gICAgICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y19JT0Vycm9yLCBleGMpOwotICAgICAgICBQeV9YREVDUkVGKGV4Yyk7CisgICAgICAgIGVycm5vID0gRUlTRElSOworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWVPYmplY3QoUHlFeGNfSU9FcnJvciwgbmFtZW9iaik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAjZW5kaWYKQEAgLTE5MSwxNiArMTg2LDIxIEBACiAgICAgUHlfVU5JQ09ERSAqd2lkZW5hbWUgPSBOVUxMOwogI2VuZGlmCiAgICAgaW50IHJldCA9IDA7Ci0gICAgaW50IHJ3YSA9IDAsIHBsdXMgPSAwLCBhcHBlbmQgPSAwOworICAgIGludCByd2EgPSAwLCBwbHVzID0gMDsKICAgICBpbnQgZmxhZ3MgPSAwOwogICAgIGludCBmZCA9IC0xOwogICAgIGludCBjbG9zZWZkID0gMTsKKyAgICBpbnQgZmRfaXNfb3duID0gMDsKIAogICAgIGFzc2VydChQeUZpbGVJT19DaGVjayhvc2VsZikpOwogICAgIGlmIChzZWxmLT5mZCA+PSAwKSB7Ci0gICAgICAgIC8qIEhhdmUgdG8gY2xvc2UgdGhlIGV4aXN0aW5nIGZpbGUgZmlyc3QuICovCi0gICAgICAgIGlmIChpbnRlcm5hbF9jbG9zZShzZWxmKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChzZWxmLT5jbG9zZWZkKSB7CisgICAgICAgICAgICAvKiBIYXZlIHRvIGNsb3NlIHRoZSBleGlzdGluZyBmaWxlIGZpcnN0LiAqLworICAgICAgICAgICAgaWYgKGludGVybmFsX2Nsb3NlKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2VsZi0+ZmQgPSAtMTsKICAgICB9CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xzaTpmaWxlaW8iLApAQCAtMjEzLDcgKzIxMyw3IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBmZCA9IFB5TG9uZ19Bc0xvbmcobmFtZW9iaik7CisgICAgZmQgPSBfUHlMb25nX0FzSW50KG5hbWVvYmopOwogICAgIGlmIChmZCA8IDApIHsKICAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKQEAgLTI4MSw4ICsyODEsOCBAQAogICAgICAgICAgICAgICAgIGdvdG8gYmFkX21vZGU7CiAgICAgICAgICAgICByd2EgPSAxOwogICAgICAgICAgICAgc2VsZi0+d3JpdGFibGUgPSAxOwotICAgICAgICAgICAgZmxhZ3MgfD0gT19DUkVBVDsKLSAgICAgICAgICAgIGFwcGVuZCA9IDE7CisgICAgICAgICAgICBzZWxmLT5hcHBlbmRpbmcgPSAxOworICAgICAgICAgICAgZmxhZ3MgfD0gT19BUFBFTkQgfCBPX0NSRUFUOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgJ2InOgogICAgICAgICAgICAgYnJlYWs7CkBAIC0zMTMsMTEgKzMxMyw2IEBACiAgICAgZmxhZ3MgfD0gT19CSU5BUlk7CiAjZW5kaWYKIAotI2lmZGVmIE9fQVBQRU5ECi0gICAgaWYgKGFwcGVuZCkKLSAgICAgICAgZmxhZ3MgfD0gT19BUFBFTkQ7Ci0jZW5kaWYKLQogICAgIGlmIChmZCA+PSAwKSB7CiAgICAgICAgIGlmIChjaGVja19mZChmZCkpCiAgICAgICAgICAgICBnb3RvIGVycm9yOwpAQCAtMzQxLDYgKzMzNiw3IEBACiAjZW5kaWYKICAgICAgICAgICAgIHNlbGYtPmZkID0gb3BlbihuYW1lLCBmbGFncywgMDY2Nik7CiAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGZkX2lzX293biA9IDE7CiAgICAgICAgIGlmIChzZWxmLT5mZCA8IDApIHsKICNpZmRlZiBNU19XSU5ET1dTCiAgICAgICAgICAgICBpZiAod2lkZW5hbWUgIT0gTlVMTCkKQEAgLTM1MCwzMSArMzQ2LDI5IEBACiAgICAgICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lKFB5RXhjX0lPRXJyb3IsIG5hbWUpOwogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQotICAgICAgICBpZihkaXJjaGVjayhzZWxmLCBuYW1lKSA8IDApCi0gICAgICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KKyAgICBpZiAoZGlyY2hlY2soc2VsZiwgbmFtZW9iaikgPCAwKQorICAgICAgICBnb3RvIGVycm9yOwogCiAgICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopc2VsZiwgIm5hbWUiLCBuYW1lb2JqKSA8IDApCiAgICAgICAgIGdvdG8gZXJyb3I7CiAKLSAgICBpZiAoYXBwZW5kKSB7CisgICAgaWYgKHNlbGYtPmFwcGVuZGluZykgewogICAgICAgICAvKiBGb3IgY29uc2lzdGVudCBiZWhhdmlvdXIsIHdlIGV4cGxpY2l0bHkgc2VlayB0byB0aGUKICAgICAgICAgICAgZW5kIG9mIGZpbGUgKG90aGVyd2lzZSwgaXQgbWlnaHQgYmUgZG9uZSBvbmx5IG9uIHRoZQogICAgICAgICAgICBmaXJzdCB3cml0ZSgpKS4gKi8KICAgICAgICAgUHlPYmplY3QgKnBvcyA9IHBvcnRhYmxlX2xzZWVrKHNlbGYtPmZkLCBOVUxMLCAyKTsKLSAgICAgICAgaWYgKHBvcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoY2xvc2VmZCkgewotICAgICAgICAgICAgICAgIGNsb3NlKHNlbGYtPmZkKTsKLSAgICAgICAgICAgICAgICBzZWxmLT5mZCA9IC0xOwotICAgICAgICAgICAgfQorICAgICAgICBpZiAocG9zID09IE5VTEwpCiAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9CiAgICAgICAgIFB5X0RFQ1JFRihwb3MpOwogICAgIH0KIAogICAgIGdvdG8gZG9uZTsKIAogIGVycm9yOgorICAgIGlmICghZmRfaXNfb3duKQorICAgICAgICBzZWxmLT5mZCA9IC0xOworCiAgICAgcmV0ID0gLTE7CiAKICBkb25lOgpAQCAtNTMzLDcgKzUyNyw3IEBACiB7CiAgICAgUHlPYmplY3QgKnJlc3VsdDsKICAgICBQeV9zc2l6ZV90IHRvdGFsID0gMDsKLSAgICBpbnQgbjsKKyAgICBQeV9zc2l6ZV90IG47CiAKICAgICBpZiAoc2VsZi0+ZmQgPCAwKQogICAgICAgICByZXR1cm4gZXJyX2Nsb3NlZCgpOwpAQCAtNTU1LDI3ICs1NDksMzcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChQeUJ5dGVzX0dFVF9TSVpFKHJlc3VsdCkgPCAoUHlfc3NpemVfdCluZXdzaXplKSB7Ci0gICAgICAgICAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZyZXN1bHQsIG5ld3NpemUpIDwgMCkgewotICAgICAgICAgICAgICAgIGlmICh0b3RhbCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJlc3VsdCwgbmV3c2l6ZSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOyAvKiByZXN1bHQgaGFzIGJlZW4gZnJlZWQgKi8KICAgICAgICAgfQogICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgbiA9IG5ld3NpemUgLSB0b3RhbDsKKyNpZiBkZWZpbmVkKE1TX1dJTjY0KSB8fCBkZWZpbmVkKE1TX1dJTkRPV1MpCisgICAgICAgIGlmIChuID4gSU5UX01BWCkKKyAgICAgICAgICAgIG4gPSBJTlRfTUFYOwogICAgICAgICBuID0gcmVhZChzZWxmLT5mZCwKICAgICAgICAgICAgICAgICAgUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KSArIHRvdGFsLAotICAgICAgICAgICAgICAgICBuZXdzaXplIC0gdG90YWwpOworICAgICAgICAgICAgICAgICAoaW50KW4pOworI2Vsc2UKKyAgICAgICAgbiA9IHJlYWQoc2VsZi0+ZmQsCisgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKHJlc3VsdCkgKyB0b3RhbCwKKyAgICAgICAgICAgICAgICAgbik7CisjZW5kaWYKICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICAgICAgICAgaWYgKG4gPT0gMCkKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgIGlmICh0b3RhbCA+IDApCi0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlFcnJfQ2hlY2tTaWduYWxzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChlcnJubyA9PSBFQUdBSU4pIHsKKyAgICAgICAgICAgICAgICBpZiAodG90YWwgPiAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKICAgICAgICAgICAgICAgICBQeV9SRVRVUk5fTk9ORTsKICAgICAgICAgICAgIH0KQEAgLTU4OSw3ICs1OTMsNiBAQAogICAgIGlmIChQeUJ5dGVzX0dFVF9TSVpFKHJlc3VsdCkgPiB0b3RhbCkgewogICAgICAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZyZXN1bHQsIHRvdGFsKSA8IDApIHsKICAgICAgICAgICAgIC8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYnV0IGp1c3QgaW4gY2FzZSAqLwotICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgIH0KQEAgLTY0NiwxMCArNjQ5LDggQEAKICAgICB9CiAKICAgICBpZiAobiAhPSBzaXplKSB7Ci0gICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJmJ5dGVzLCBuKSA8IDApIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihieXRlcyk7CisgICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJmJ5dGVzLCBuKSA8IDApCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiAoUHlPYmplY3QgKikgYnl0ZXM7CkBAIC04ODUsNyArODg2LDEzIEBACiBzdGF0aWMgY2hhciAqCiBtb2RlX3N0cmluZyhmaWxlaW8gKnNlbGYpCiB7Ci0gICAgaWYgKHNlbGYtPnJlYWRhYmxlKSB7CisgICAgaWYgKHNlbGYtPmFwcGVuZGluZykgeworICAgICAgICBpZiAoc2VsZi0+cmVhZGFibGUpCisgICAgICAgICAgICByZXR1cm4gImFiKyI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAiYWIiOworICAgIH0KKyAgICBlbHNlIGlmIChzZWxmLT5yZWFkYWJsZSkgewogICAgICAgICBpZiAoc2VsZi0+d3JpdGFibGUpCiAgICAgICAgICAgICByZXR1cm4gInJiKyI7CiAgICAgICAgIGVsc2UKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL2lvYmFzZS5jIGIvTW9kdWxlcy9faW8vaW9iYXNlLmMKaW5kZXggMTc2NzYxZC4uYWI2OTExZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vaW9iYXNlLmMKKysrIGIvTW9kdWxlcy9faW8vaW9iYXNlLmMKQEAgLTQxLDggKzQxLDggQEAKICAgICAiYnl0ZXMuIGJ5dGVhcnJheXMgYXJlIGFjY2VwdGVkIHRvbywgYW5kIGluIHNvbWUgY2FzZXMgKHN1Y2ggYXNcbiIKICAgICAicmVhZGludG8pIG5lZWRlZC4gVGV4dCBJL08gY2xhc3NlcyB3b3JrIHdpdGggc3RyIGRhdGEuXG4iCiAgICAgIlxuIgotICAgICJOb3RlIHRoYXQgY2FsbGluZyBhbnkgbWV0aG9kIChldmVuIGlucXVpcmllcykgb24gYSBjbG9zZWQgc3RyZWFtIGlzXG4iCi0gICAgInVuZGVmaW5lZC4gSW1wbGVtZW50YXRpb25zIG1heSByYWlzZSBJT0Vycm9yIGluIHRoaXMgY2FzZS5cbiIKKyAgICAiTm90ZSB0aGF0IGNhbGxpbmcgYW55IG1ldGhvZCAoZXhjZXB0IGFkZGl0aW9uYWwgY2FsbHMgdG8gY2xvc2UoKSxcbiIKKyAgICAid2hpY2ggYXJlIGlnbm9yZWQpIG9uIGEgY2xvc2VkIHN0cmVhbSBzaG91bGQgcmFpc2UgYSBWYWx1ZUVycm9yLlxuIgogICAgICJcbiIKICAgICAiSU9CYXNlIChhbmQgaXRzIHN1YmNsYXNzZXMpIHN1cHBvcnQgdGhlIGl0ZXJhdG9yIHByb3RvY29sLCBtZWFuaW5nXG4iCiAgICAgInRoYXQgYW4gSU9CYXNlIG9iamVjdCBjYW4gYmUgaXRlcmF0ZWQgb3ZlciB5aWVsZGluZyB0aGUgbGluZXMgaW4gYVxuIgpAQCAtNzQsNyArNzQsNyBAQAogUHlEb2NfU1RSVkFSKGlvYmFzZV9zZWVrX2RvYywKICAgICAiQ2hhbmdlIHN0cmVhbSBwb3NpdGlvbi5cbiIKICAgICAiXG4iCi0gICAgIkNoYW5nZSB0aGUgc3RyZWFtIHBvc2l0aW9uIHRvIGJ5dGUgb2Zmc2V0IG9mZnNldC4gb2Zmc2V0IGlzXG4iCisgICAgIkNoYW5nZSB0aGUgc3RyZWFtIHBvc2l0aW9uIHRvIHRoZSBnaXZlbiBieXRlIG9mZnNldC4gVGhlIG9mZnNldCBpc1xuIgogICAgICJpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUgcG9zaXRpb24gaW5kaWNhdGVkIGJ5IHdoZW5jZS4gIFZhbHVlc1xuIgogICAgICJmb3Igd2hlbmNlIGFyZTpcbiIKICAgICAiXG4iCkBAIC00MzcsNyArNDM3LDcgQEAKICAgICAiXG4iCiAgICAgIklmIGxpbWl0IGlzIHNwZWNpZmllZCwgYXQgbW9zdCBsaW1pdCBieXRlcyB3aWxsIGJlIHJlYWQuXG4iCiAgICAgIlxuIgotICAgICJUaGUgbGluZSB0ZXJtaW5hdG9yIGlzIGFsd2F5cyBiJ1xuJyBmb3IgYmluYXJ5IGZpbGVzOyBmb3IgdGV4dFxuIgorICAgICJUaGUgbGluZSB0ZXJtaW5hdG9yIGlzIGFsd2F5cyBiJ1xcbicgZm9yIGJpbmFyeSBmaWxlczsgZm9yIHRleHRcbiIKICAgICAiZmlsZXMsIHRoZSBuZXdsaW5lcyBhcmd1bWVudCB0byBvcGVuIGNhbiBiZSB1c2VkIHRvIHNlbGVjdCB0aGUgbGluZVxuIgogICAgICJ0ZXJtaW5hdG9yKHMpIHJlY29nbml6ZWQuXG4iKTsKIApAQCAtNDY4LDggKzQ2OCwxNCBAQAogCiAgICAgICAgIGlmIChoYXNfcGVlaykgewogICAgICAgICAgICAgUHlPYmplY3QgKnJlYWRhaGVhZCA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc2VsZiwgInBlZWsiLCAiaSIsIDEpOwotICAgICAgICAgICAgaWYgKHJlYWRhaGVhZCA9PSBOVUxMKQorICAgICAgICAgICAgaWYgKHJlYWRhaGVhZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLyogTk9URTogUHlFcnJfU2V0RnJvbUVycm5vKCkgY2FsbHMgUHlFcnJfQ2hlY2tTaWduYWxzKCkKKyAgICAgICAgICAgICAgICAgICB3aGVuIEVJTlRSIG9jY3VycyBzbyB3ZSBuZWVkbid0IGRvIGl0IG91cnNlbHZlcy4gKi8KKyAgICAgICAgICAgICAgICBpZiAoX1B5SU9fdHJhcF9laW50cigpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIVB5Qnl0ZXNfQ2hlY2socmVhZGFoZWFkKSkgewogICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JT0Vycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGVlaygpIHNob3VsZCBoYXZlIHJldHVybmVkIGEgYnl0ZXMgb2JqZWN0LCAiCkBAIC01MDIsOCArNTA4LDE0IEBACiAgICAgICAgIH0KIAogICAgICAgICBiID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzZWxmLCAicmVhZCIsICJuIiwgbnJlYWRhaGVhZCk7Ci0gICAgICAgIGlmIChiID09IE5VTEwpCisgICAgICAgIGlmIChiID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIE5PVEU6IFB5RXJyX1NldEZyb21FcnJubygpIGNhbGxzIFB5RXJyX0NoZWNrU2lnbmFscygpCisgICAgICAgICAgICAgICB3aGVuIEVJTlRSIG9jY3VycyBzbyB3ZSBuZWVkbid0IGRvIGl0IG91cnNlbHZlcy4gKi8KKyAgICAgICAgICAgIGlmIChfUHlJT190cmFwX2VpbnRyKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQogICAgICAgICBpZiAoIVB5Qnl0ZXNfQ2hlY2soYikpIHsKICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JT0Vycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkKCkgc2hvdWxkIGhhdmUgcmV0dXJuZWQgYSBieXRlcyBvYmplY3QsICIKQEAgLTY0OCw3ICs2NjAsMTAgQEAKICAgICAgICAgICAgICAgICBicmVhazsgLyogU3RvcCBJdGVyYXRpb24gKi8KICAgICAgICAgfQogCi0gICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzKHNlbGYsIF9QeUlPX3N0cl93cml0ZSwgbGluZSwgTlVMTCk7CisgICAgICAgIHJlcyA9IE5VTEw7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzKHNlbGYsIF9QeUlPX3N0cl93cml0ZSwgbGluZSwgTlVMTCk7CisgICAgICAgIH0gd2hpbGUgKHJlcyA9PSBOVUxMICYmIF9QeUlPX3RyYXBfZWludHIoKSk7CiAgICAgICAgIFB5X0RFQ1JFRihsaW5lKTsKICAgICAgICAgaWYgKHJlcyA9PSBOVUxMKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlcik7CkBAIC04MTEsNiArODI2LDExIEBACiAgICAgICAgIFB5T2JqZWN0ICpkYXRhID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzZWxmLCAicmVhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaSIsIERFRkFVTFRfQlVGRkVSX1NJWkUpOwogICAgICAgICBpZiAoIWRhdGEpIHsKKyAgICAgICAgICAgIC8qIE5PVEU6IFB5RXJyX1NldEZyb21FcnJubygpIGNhbGxzIFB5RXJyX0NoZWNrU2lnbmFscygpCisgICAgICAgICAgICAgICB3aGVuIEVJTlRSIG9jY3VycyBzbyB3ZSBuZWVkbid0IGRvIGl0IG91cnNlbHZlcy4gKi8KKyAgICAgICAgICAgIGlmIChfUHlJT190cmFwX2VpbnRyKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIFB5X0RFQ1JFRihjaHVua3MpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL3N0cmluZ2lvLmMgYi9Nb2R1bGVzL19pby9zdHJpbmdpby5jCmluZGV4IGUzZGU3NTEuLjU5YTM5MDUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL3N0cmluZ2lvLmMKKysrIGIvTW9kdWxlcy9faW8vc3RyaW5naW8uYwpAQCAtNjMyLDEwICs2MzIsMjEgQEAKIH0KIAogLyogUHJvcGVydGllcyBhbmQgcHNldWRvLXByb3BlcnRpZXMgKi8KKworUHlEb2NfU1RSVkFSKHN0cmluZ2lvX3JlYWRhYmxlX2RvYywKKyJyZWFkYWJsZSgpIC0+IGJvb2wuIFJldHVybnMgVHJ1ZSBpZiB0aGUgSU8gb2JqZWN0IGNhbiBiZSByZWFkLiIpOworCitQeURvY19TVFJWQVIoc3RyaW5naW9fd3JpdGFibGVfZG9jLAorIndyaXRhYmxlKCkgLT4gYm9vbC4gUmV0dXJucyBUcnVlIGlmIHRoZSBJTyBvYmplY3QgY2FuIGJlIHdyaXR0ZW4uIik7CisKK1B5RG9jX1NUUlZBUihzdHJpbmdpb19zZWVrYWJsZV9kb2MsCisic2Vla2FibGUoKSAtPiBib29sLiBSZXR1cm5zIFRydWUgaWYgdGhlIElPIG9iamVjdCBjYW4gYmUgc2Vla2VkLiIpOworCiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5naW9fc2Vla2FibGUoc3RyaW5naW8gKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogICAgIENIRUNLX0lOSVRJQUxJWkVEKHNlbGYpOworICAgIENIRUNLX0NMT1NFRChzZWxmKTsKICAgICBQeV9SRVRVUk5fVFJVRTsKIH0KIApAQCAtNjQzLDYgKzY1NCw3IEBACiBzdHJpbmdpb19yZWFkYWJsZShzdHJpbmdpbyAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgQ0hFQ0tfSU5JVElBTElaRUQoc2VsZik7CisgICAgQ0hFQ0tfQ0xPU0VEKHNlbGYpOwogICAgIFB5X1JFVFVSTl9UUlVFOwogfQogCkBAIC02NTAsNiArNjYyLDcgQEAKIHN0cmluZ2lvX3dyaXRhYmxlKHN0cmluZ2lvICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKICAgICBDSEVDS19JTklUSUFMSVpFRChzZWxmKTsKKyAgICBDSEVDS19DTE9TRUQoc2VsZik7CiAgICAgUHlfUkVUVVJOX1RSVUU7CiB9CiAKQEAgLTgxNyw5ICs4MzAsOSBAQAogICAgIHsic2VlayIsICAgICAoUHlDRnVuY3Rpb24pc3RyaW5naW9fc2VlaywgICAgIE1FVEhfVkFSQVJHUywgc3RyaW5naW9fc2Vla19kb2N9LAogICAgIHsid3JpdGUiLCAgICAoUHlDRnVuY3Rpb24pc3RyaW5naW9fd3JpdGUsICAgIE1FVEhfTywgICAgICAgc3RyaW5naW9fd3JpdGVfZG9jfSwKIAotICAgIHsic2Vla2FibGUiLCAoUHlDRnVuY3Rpb24pc3RyaW5naW9fc2Vla2FibGUsIE1FVEhfTk9BUkdTfSwKLSAgICB7InJlYWRhYmxlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2lvX3JlYWRhYmxlLCBNRVRIX05PQVJHU30sCi0gICAgeyJ3cml0YWJsZSIsIChQeUNGdW5jdGlvbilzdHJpbmdpb193cml0YWJsZSwgTUVUSF9OT0FSR1N9LAorICAgIHsic2Vla2FibGUiLCAoUHlDRnVuY3Rpb24pc3RyaW5naW9fc2Vla2FibGUsIE1FVEhfTk9BUkdTLCBzdHJpbmdpb19zZWVrYWJsZV9kb2N9LAorICAgIHsicmVhZGFibGUiLCAoUHlDRnVuY3Rpb24pc3RyaW5naW9fcmVhZGFibGUsIE1FVEhfTk9BUkdTLCBzdHJpbmdpb19yZWFkYWJsZV9kb2N9LAorICAgIHsid3JpdGFibGUiLCAoUHlDRnVuY3Rpb24pc3RyaW5naW9fd3JpdGFibGUsIE1FVEhfTk9BUkdTLCBzdHJpbmdpb193cml0YWJsZV9kb2N9LAogCiAgICAgeyJfX2dldHN0YXRlX18iLCAoUHlDRnVuY3Rpb24pc3RyaW5naW9fZ2V0c3RhdGUsIE1FVEhfTk9BUkdTfSwKICAgICB7Il9fc2V0c3RhdGVfXyIsIChQeUNGdW5jdGlvbilzdHJpbmdpb19zZXRzdGF0ZSwgTUVUSF9PfSwKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL3RleHRpby5jIGIvTW9kdWxlcy9faW8vdGV4dGlvLmMKaW5kZXggYzVkN2I4NS4uNjgwMjc1OCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vdGV4dGlvLmMKKysrIGIvTW9kdWxlcy9faW8vdGV4dGlvLmMKQEAgLTIzNiw2ICsyMzYsMjEgQEAKICAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCitzdGF0aWMgaW50CitjaGVja19kZWNvZGVkKFB5T2JqZWN0ICpkZWNvZGVkKQoreworICAgIGlmIChkZWNvZGVkID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhkZWNvZGVkKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImRlY29kZXIgc2hvdWxkIHJldHVybiBhIHN0cmluZyByZXN1bHQsIG5vdCAnJS4yMDBzJyIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKGRlY29kZWQpLT50cF9uYW1lKTsKKyAgICAgICAgUHlfREVDUkVGKGRlY29kZWQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCiAjZGVmaW5lIFNFRU5fQ1IgICAxCiAjZGVmaW5lIFNFRU5fTEYgICAyCiAjZGVmaW5lIFNFRU5fQ1JMRiA0CkBAIC0yNjUsMTUgKzI4MCw5IEBACiAgICAgICAgIFB5X0lOQ1JFRihvdXRwdXQpOwogICAgIH0KIAotICAgIGlmIChvdXRwdXQgPT0gTlVMTCkKKyAgICBpZiAoY2hlY2tfZGVjb2RlZChvdXRwdXQpIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhvdXRwdXQpKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiZGVjb2RlciBzaG91bGQgcmV0dXJuIGEgc3RyaW5nIHJlc3VsdCIpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQogICAgIG91dHB1dF9sZW4gPSBQeVVuaWNvZGVfR0VUX1NJWkUob3V0cHV0KTsKICAgICBpZiAoc2VsZi0+cGVuZGluZ2NyICYmIChmaW5hbCB8fCBvdXRwdXRfbGVuID4gMCkpIHsKICAgICAgICAgUHlfVU5JQ09ERSAqb3V0OwpAQCAtNjIyLDE1ICs2MzEsMjIgQEAKICAgICAiZXJyb3JzIGRldGVybWluZXMgdGhlIHN0cmljdG5lc3Mgb2YgZW5jb2RpbmcgYW5kIGRlY29kaW5nIChzZWUgdGhlXG4iCiAgICAgImNvZGVjcy5yZWdpc3RlcikgYW5kIGRlZmF1bHRzIHRvIFwic3RyaWN0XCIuXG4iCiAgICAgIlxuIgotICAgICJuZXdsaW5lIGNhbiBiZSBOb25lLCAnJywgJ1xcbicsICdcXHInLCBvciAnXFxyXFxuJy4gIEl0IGNvbnRyb2xzIHRoZVxuIgotICAgICJoYW5kbGluZyBvZiBsaW5lIGVuZGluZ3MuIElmIGl0IGlzIE5vbmUsIHVuaXZlcnNhbCBuZXdsaW5lcyBpc1xuIgotICAgICJlbmFibGVkLiAgV2l0aCB0aGlzIGVuYWJsZWQsIG9uIGlucHV0LCB0aGUgbGluZXMgZW5kaW5ncyAnXFxuJywgJ1xccicsXG4iCi0gICAgIm9yICdcXHJcXG4nIGFyZSB0cmFuc2xhdGVkIHRvICdcXG4nIGJlZm9yZSBiZWluZyByZXR1cm5lZCB0byB0aGVcbiIKLSAgICAiY2FsbGVyLiBDb252ZXJzZWx5LCBvbiBvdXRwdXQsICdcXG4nIGlzIHRyYW5zbGF0ZWQgdG8gdGhlIHN5c3RlbVxuIgotICAgICJkZWZhdWx0IGxpbmUgc2VwZXJhdG9yLCBvcy5saW5lc2VwLiBJZiBuZXdsaW5lIGlzIGFueSBvdGhlciBvZiBpdHNcbiIKLSAgICAibGVnYWwgdmFsdWVzLCB0aGF0IG5ld2xpbmUgYmVjb21lcyB0aGUgbmV3bGluZSB3aGVuIHRoZSBmaWxlIGlzIHJlYWRcbiIKLSAgICAiYW5kIGl0IGlzIHJldHVybmVkIHVudHJhbnNsYXRlZC4gT24gb3V0cHV0LCAnXFxuJyBpcyBjb252ZXJ0ZWQgdG8gdGhlXG4iCi0gICAgIm5ld2xpbmUuXG4iCisgICAgIm5ld2xpbmUgY29udHJvbHMgaG93IGxpbmUgZW5kaW5ncyBhcmUgaGFuZGxlZC4gSXQgY2FuIGJlIE5vbmUsICcnLFxuIgorICAgICInXFxuJywgJ1xccicsIGFuZCAnXFxyXFxuJy4gIEl0IHdvcmtzIGFzIGZvbGxvd3M6XG4iCisgICAgIlxuIgorICAgICIqIE9uIGlucHV0LCBpZiBuZXdsaW5lIGlzIE5vbmUsIHVuaXZlcnNhbCBuZXdsaW5lcyBtb2RlIGlzXG4iCisgICAgIiAgZW5hYmxlZC4gTGluZXMgaW4gdGhlIGlucHV0IGNhbiBlbmQgaW4gJ1xcbicsICdcXHInLCBvciAnXFxyXFxuJywgYW5kXG4iCisgICAgIiAgdGhlc2UgYXJlIHRyYW5zbGF0ZWQgaW50byAnXFxuJyBiZWZvcmUgYmVpbmcgcmV0dXJuZWQgdG8gdGhlXG4iCisgICAgIiAgY2FsbGVyLiBJZiBpdCBpcyAnJywgdW5pdmVyc2FsIG5ld2xpbmUgbW9kZSBpcyBlbmFibGVkLCBidXQgbGluZVxuIgorICAgICIgIGVuZGluZ3MgYXJlIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgdW50cmFuc2xhdGVkLiBJZiBpdCBoYXMgYW55IG9mXG4iCisgICAgIiAgdGhlIG90aGVyIGxlZ2FsIHZhbHVlcywgaW5wdXQgbGluZXMgYXJlIG9ubHkgdGVybWluYXRlZCBieSB0aGUgZ2l2ZW5cbiIKKyAgICAiICBzdHJpbmcsIGFuZCB0aGUgbGluZSBlbmRpbmcgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciB1bnRyYW5zbGF0ZWQuXG4iCisgICAgIlxuIgorICAgICIqIE9uIG91dHB1dCwgaWYgbmV3bGluZSBpcyBOb25lLCBhbnkgJ1xcbicgY2hhcmFjdGVycyB3cml0dGVuIGFyZVxuIgorICAgICIgIHRyYW5zbGF0ZWQgdG8gdGhlIHN5c3RlbSBkZWZhdWx0IGxpbmUgc2VwYXJhdG9yLCBvcy5saW5lc2VwLiBJZlxuIgorICAgICIgIG5ld2xpbmUgaXMgJycsIG5vIHRyYW5zbGF0aW9uIHRha2VzIHBsYWNlLiBJZiBuZXdsaW5lIGlzIGFueSBvZiB0aGVcbiIKKyAgICAiICBvdGhlciBsZWdhbCB2YWx1ZXMsIGFueSAnXFxuJyBjaGFyYWN0ZXJzIHdyaXR0ZW4gYXJlIHRyYW5zbGF0ZWQgdG9cbiIKKyAgICAiICB0aGUgZ2l2ZW4gc3RyaW5nLlxuIgogICAgICJcbiIKICAgICAiSWYgbGluZV9idWZmZXJpbmcgaXMgVHJ1ZSwgYSBjYWxsIHRvIGZsdXNoIGlzIGltcGxpZWQgd2hlbiBhIGNhbGwgdG9cbiIKICAgICAid3JpdGUgY29udGFpbnMgYSBuZXdsaW5lIGNoYXJhY3Rlci4iCkBAIC0xMDA2LDggKzEwMjIsMTEgQEAKICAgICByZXMgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGJ1ZmZlciwgInNlZWthYmxlIiwgTlVMTCk7CiAgICAgaWYgKHJlcyA9PSBOVUxMKQogICAgICAgICBnb3RvIGVycm9yOwotICAgIHNlbGYtPnNlZWthYmxlID0gc2VsZi0+dGVsbGluZyA9IFB5T2JqZWN0X0lzVHJ1ZShyZXMpOworICAgIHIgPSBQeU9iamVjdF9Jc1RydWUocmVzKTsKICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICBpZiAociA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgc2VsZi0+c2Vla2FibGUgPSBzZWxmLT50ZWxsaW5nID0gcjsKIAogICAgIHNlbGYtPmVuY29kaW5nX3N0YXJ0X29mX3N0cmVhbSA9IDA7CiAgICAgaWYgKHNlbGYtPnNlZWthYmxlICYmIHNlbGYtPmVuY29kZXIpIHsKQEAgLTEyMDMsOCArMTIyMiwxMSBAQAogICAgIFB5X0RFQ1JFRihwZW5kaW5nKTsKICAgICBpZiAoYiA9PSBOVUxMKQogICAgICAgICByZXR1cm4gLTE7Ci0gICAgcmV0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZE9iakFyZ3Moc2VsZi0+YnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeUlPX3N0cl93cml0ZSwgYiwgTlVMTCk7CisgICAgcmV0ID0gTlVMTDsKKyAgICBkbyB7CisgICAgICAgIHJldCA9IFB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzKHNlbGYtPmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5SU9fc3RyX3dyaXRlLCBiLCBOVUxMKTsKKyAgICB9IHdoaWxlIChyZXQgPT0gTlVMTCAmJiBfUHlJT190cmFwX2VpbnRyKCkpOwogICAgIFB5X0RFQ1JFRihiKTsKICAgICBpZiAocmV0ID09IE5VTEwpCiAgICAgICAgIHJldHVybiAtMTsKQEAgLTE0MDQsNyArMTQyNiwxMiBAQAogICAgIFB5X0RFQ1JFRihjaHVua19zaXplKTsKICAgICBpZiAoaW5wdXRfY2h1bmsgPT0gTlVMTCkKICAgICAgICAgZ290byBmYWlsOwotICAgIGFzc2VydChQeUJ5dGVzX0NoZWNrKGlucHV0X2NodW5rKSk7CisgICAgaWYgKCFQeUJ5dGVzX0NoZWNrKGlucHV0X2NodW5rKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgInVuZGVybHlpbmcgcmVhZDEoKSBzaG91bGQgaGF2ZSByZXR1cm5lZCBhIGJ5dGVzIG9iamVjdCwgIgorICAgICAgICAgICAgICAgICAgICAgIm5vdCAnJS4yMDBzJyIsIFB5X1RZUEUoaW5wdXRfY2h1bmspLT50cF9uYW1lKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KIAogICAgIGVvZiA9IChQeUJ5dGVzX1NpemUoaW5wdXRfY2h1bmspID09IDApOwogCkBAIC0xNDE3LDggKzE0NDQsNyBAQAogICAgICAgICAgICAgX1B5SU9fc3RyX2RlY29kZSwgaW5wdXRfY2h1bmssIGVvZiA/IFB5X1RydWUgOiBQeV9GYWxzZSwgTlVMTCk7CiAgICAgfQogCi0gICAgLyogVE9ETyBzYW5pdHkgY2hlY2s6IGlzaW5zdGFuY2UoZGVjb2RlZF9jaGFycywgdW5pY29kZSkgKi8KLSAgICBpZiAoZGVjb2RlZF9jaGFycyA9PSBOVUxMKQorICAgIGlmIChjaGVja19kZWNvZGVkKGRlY29kZWRfY2hhcnMpIDwgMCkKICAgICAgICAgZ290byBmYWlsOwogICAgIHRleHRpb3dyYXBwZXJfc2V0X2RlY29kZWRfY2hhcnMoc2VsZiwgZGVjb2RlZF9jaGFycyk7CiAgICAgaWYgKFB5VW5pY29kZV9HRVRfU0laRShkZWNvZGVkX2NoYXJzKSA+IDApCkBAIC0xNDMxLDcgKzE0NTcsMTQgQEAKICAgICAgICAgUHlPYmplY3QgKm5leHRfaW5wdXQgPSBQeU51bWJlcl9BZGQoZGVjX2J1ZmZlciwgaW5wdXRfY2h1bmspOwogICAgICAgICBpZiAobmV4dF9pbnB1dCA9PSBOVUxMKQogICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICBhc3NlcnQgKFB5Qnl0ZXNfQ2hlY2sobmV4dF9pbnB1dCkpOworICAgICAgICBpZiAoIVB5Qnl0ZXNfQ2hlY2sobmV4dF9pbnB1dCkpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImRlY29kZXIgZ2V0c3RhdGUoKSBzaG91bGQgaGF2ZSByZXR1cm5lZCBhIGJ5dGVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0LCBub3QgJyUuMjAwcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUobmV4dF9pbnB1dCktPnRwX25hbWUpOworICAgICAgICAgICAgUHlfREVDUkVGKG5leHRfaW5wdXQpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CiAgICAgICAgIFB5X0RFQ1JFRihkZWNfYnVmZmVyKTsKICAgICAgICAgUHlfQ0xFQVIoc2VsZi0+c25hcHNob3QpOwogICAgICAgICBzZWxmLT5zbmFwc2hvdCA9IFB5X0J1aWxkVmFsdWUoIk5OIiwgZGVjX2ZsYWdzLCBuZXh0X2lucHV0KTsKQEAgLTE0NzcsNyArMTUxMCw3IEBACiAgICAgICAgIGRlY29kZWQgPSBQeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJncyhzZWxmLT5kZWNvZGVyLCBfUHlJT19zdHJfZGVjb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMsIFB5X1RydWUsIE5VTEwpOwogICAgICAgICBQeV9ERUNSRUYoYnl0ZXMpOwotICAgICAgICBpZiAoZGVjb2RlZCA9PSBOVUxMKQorICAgICAgICBpZiAoY2hlY2tfZGVjb2RlZChkZWNvZGVkKSA8IDApCiAgICAgICAgICAgICBnb3RvIGZhaWw7CiAKICAgICAgICAgcmVzdWx0ID0gdGV4dGlvd3JhcHBlcl9nZXRfZGVjb2RlZF9jaGFycyhzZWxmLCAtMSk7CkBAIC0xNTA4LDggKzE1NDEsMTQgQEAKICAgICAgICAgLyogS2VlcCByZWFkaW5nIGNodW5rcyB1bnRpbCB3ZSBoYXZlIG4gY2hhcmFjdGVycyB0byByZXR1cm4gKi8KICAgICAgICAgd2hpbGUgKHJlbWFpbmluZyA+IDApIHsKICAgICAgICAgICAgIHJlcyA9IHRleHRpb3dyYXBwZXJfcmVhZF9jaHVuayhzZWxmKTsKLSAgICAgICAgICAgIGlmIChyZXMgPCAwKQorICAgICAgICAgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgICAgICAgICAvKiBOT1RFOiBQeUVycl9TZXRGcm9tRXJybm8oKSBjYWxscyBQeUVycl9DaGVja1NpZ25hbHMoKQorICAgICAgICAgICAgICAgICAgIHdoZW4gRUlOVFIgb2NjdXJzIHNvIHdlIG5lZWRuJ3QgZG8gaXQgb3Vyc2VsdmVzLiAqLworICAgICAgICAgICAgICAgIGlmIChfUHlJT190cmFwX2VpbnRyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChyZXMgPT0gMCkgIC8qIEVPRiAqLwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgaWYgKGNodW5rcyA9PSBOVUxMKSB7CkBAIC0xNjY4LDggKzE3MDcsMTQgQEAKICAgICAgICAgd2hpbGUgKCFzZWxmLT5kZWNvZGVkX2NoYXJzIHx8CiAgICAgICAgICAgICAgICAhUHlVbmljb2RlX0dFVF9TSVpFKHNlbGYtPmRlY29kZWRfY2hhcnMpKSB7CiAgICAgICAgICAgICByZXMgPSB0ZXh0aW93cmFwcGVyX3JlYWRfY2h1bmsoc2VsZik7Ci0gICAgICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgICAgICAgICAgLyogTk9URTogUHlFcnJfU2V0RnJvbUVycm5vKCkgY2FsbHMgUHlFcnJfQ2hlY2tTaWduYWxzKCkKKyAgICAgICAgICAgICAgICAgICB3aGVuIEVJTlRSIG9jY3VycyBzbyB3ZSBuZWVkbid0IGRvIGl0IG91cnNlbHZlcy4gKi8KKyAgICAgICAgICAgICAgICBpZiAoX1B5SU9fdHJhcF9laW50cigpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHJlcyA9PSAwKQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yMDg1LDcgKzIxMzAsMTQgQEAKICAgICAgICAgaWYgKGlucHV0X2NodW5rID09IE5VTEwpCiAgICAgICAgICAgICBnb3RvIGZhaWw7CiAKLSAgICAgICAgYXNzZXJ0IChQeUJ5dGVzX0NoZWNrKGlucHV0X2NodW5rKSk7CisgICAgICAgIGlmICghUHlCeXRlc19DaGVjayhpbnB1dF9jaHVuaykpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgInVuZGVybHlpbmcgcmVhZCgpIHNob3VsZCBoYXZlIHJldHVybmVkIGEgYnl0ZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJvYmplY3QsIG5vdCAnJS4yMDBzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShpbnB1dF9jaHVuayktPnRwX25hbWUpOworICAgICAgICAgICAgUHlfREVDUkVGKGlucHV0X2NodW5rKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQogCiAgICAgICAgIHNlbGYtPnNuYXBzaG90ID0gUHlfQnVpbGRWYWx1ZSgiaU4iLCBjb29raWUuZGVjX2ZsYWdzLCBpbnB1dF9jaHVuayk7CiAgICAgICAgIGlmIChzZWxmLT5zbmFwc2hvdCA9PSBOVUxMKSB7CkBAIC0yMDk2LDcgKzIxNDgsNyBAQAogICAgICAgICBkZWNvZGVkID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzZWxmLT5kZWNvZGVyLCAiZGVjb2RlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9pIiwgaW5wdXRfY2h1bmssIChpbnQpY29va2llLm5lZWRfZW9mKTsKIAotICAgICAgICBpZiAoZGVjb2RlZCA9PSBOVUxMKQorICAgICAgICBpZiAoY2hlY2tfZGVjb2RlZChkZWNvZGVkKSA8IDApCiAgICAgICAgICAgICBnb3RvIGZhaWw7CiAKICAgICAgICAgdGV4dGlvd3JhcHBlcl9zZXRfZGVjb2RlZF9jaGFycyhzZWxmLCBkZWNvZGVkKTsKQEAgLTIyMTksMTAgKzIyNzEsOSBAQAogICAgICAgICBpbnQgZGVjX2ZsYWdzOwogCiAgICAgICAgIFB5T2JqZWN0ICpkZWNvZGVkID0gUHlPYmplY3RfQ2FsbE1ldGhvZCgKLSAgICAgICAgICAgIHNlbGYtPmRlY29kZXIsICJkZWNvZGUiLCAicyMiLCBpbnB1dCwgMSk7Ci0gICAgICAgIGlmIChkZWNvZGVkID09IE5VTEwpCisgICAgICAgICAgICBzZWxmLT5kZWNvZGVyLCAiZGVjb2RlIiwgInMjIiwgaW5wdXQsIChQeV9zc2l6ZV90KTEpOworICAgICAgICBpZiAoY2hlY2tfZGVjb2RlZChkZWNvZGVkKSA8IDApCiAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIGFzc2VydCAoUHlVbmljb2RlX0NoZWNrKGRlY29kZWQpKTsKICAgICAgICAgY2hhcnNfZGVjb2RlZCArPSBQeVVuaWNvZGVfR0VUX1NJWkUoZGVjb2RlZCk7CiAgICAgICAgIFB5X0RFQ1JFRihkZWNvZGVkKTsKIApAQCAtMjI1NCw5ICsyMzA1LDggQEAKICAgICAgICAgLyogV2UgZGlkbid0IGdldCBlbm91Z2ggZGVjb2RlZCBkYXRhOyBzaWduYWwgRU9GIHRvIGdldCBtb3JlLiAqLwogICAgICAgICBQeU9iamVjdCAqZGVjb2RlZCA9IFB5T2JqZWN0X0NhbGxNZXRob2QoCiAgICAgICAgICAgICBzZWxmLT5kZWNvZGVyLCAiZGVjb2RlIiwgInNpIiwgIiIsIC8qIGZpbmFsID0gKi8gMSk7Ci0gICAgICAgIGlmIChkZWNvZGVkID09IE5VTEwpCisgICAgICAgIGlmIChjaGVja19kZWNvZGVkKGRlY29kZWQpIDwgMCkKICAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgYXNzZXJ0IChQeVVuaWNvZGVfQ2hlY2soZGVjb2RlZCkpOwogICAgICAgICBjaGFyc19kZWNvZGVkICs9IFB5VW5pY29kZV9HRVRfU0laRShkZWNvZGVkKTsKICAgICAgICAgUHlfREVDUkVGKGRlY29kZWQpOwogICAgICAgICBjb29raWUubmVlZF9lb2YgPSAxOwpAQCAtMjQxNSwxOSArMjQ2NSwzMSBAQAogICAgIFB5X0RFQ1JFRihyZXMpOwogICAgIGlmIChyIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgCisKICAgICBpZiAociA+IDApIHsKICAgICAgICAgUHlfUkVUVVJOX05PTkU7IC8qIHN0cmVhbSBhbHJlYWR5IGNsb3NlZCAqLwogICAgIH0KICAgICBlbHNlIHsKKyAgICAgICAgUHlPYmplY3QgKmV4YyA9IE5VTEwsICp2YWwsICp0YjsKICAgICAgICAgcmVzID0gUHlPYmplY3RfQ2FsbE1ldGhvZCgoUHlPYmplY3QgKilzZWxmLCAiZmx1c2giLCBOVUxMKTsKLSAgICAgICAgaWYgKHJlcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQorICAgICAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgICAgICBQeUVycl9GZXRjaCgmZXhjLCAmdmFsLCAmdGIpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKIAotICAgICAgICByZXR1cm4gUHlPYmplY3RfQ2FsbE1ldGhvZChzZWxmLT5idWZmZXIsICJjbG9zZSIsIE5VTEwpOworICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHNlbGYtPmJ1ZmZlciwgImNsb3NlIiwgTlVMTCk7CisgICAgICAgIGlmIChleGMgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKHJlcyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfQ0xFQVIocmVzKTsKKyAgICAgICAgICAgICAgICBQeUVycl9SZXN0b3JlKGV4YywgdmFsLCB0Yik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZXhjKTsKKyAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHZhbCk7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRih0Yik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2pzb24uYyBiL01vZHVsZXMvX2pzb24uYwppbmRleCA2YjMyMWU1Li5jOTEzNDA5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19qc29uLmMKKysrIGIvTW9kdWxlcy9fanNvbi5jCkBAIC01MjQsMTYgKzUyNCwxMCBAQAogICAgICAgICAgICAgfQogI2lmZGVmIFB5X1VOSUNPREVfV0lERQogICAgICAgICAgICAgLyogU3Vycm9nYXRlIHBhaXIgKi8KLSAgICAgICAgICAgIGlmICgoYyAmIDB4ZmMwMCkgPT0gMHhkODAwKSB7CisgICAgICAgICAgICBpZiAoKGMgJiAweGZjMDApID09IDB4ZDgwMCAmJiBlbmQgKyA2IDwgbGVuICYmCisgICAgICAgICAgICAgICAgYnVmW25leHQrK10gPT0gJ1xcJyAmJgorICAgICAgICAgICAgICAgIGJ1ZltuZXh0KytdID09ICd1JykgewogICAgICAgICAgICAgICAgIFB5X1VOSUNPREUgYzIgPSAwOwotICAgICAgICAgICAgICAgIGlmIChlbmQgKyA2ID49IGxlbikgewotICAgICAgICAgICAgICAgICAgICByYWlzZV9lcnJtc2coIlVucGFpcmVkIGhpZ2ggc3Vycm9nYXRlIiwgcHlzdHIsIGVuZCAtIDUpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGJhaWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChidWZbbmV4dCsrXSAhPSAnXFwnIHx8IGJ1ZltuZXh0KytdICE9ICd1JykgewotICAgICAgICAgICAgICAgICAgICByYWlzZV9lcnJtc2coIlVucGFpcmVkIGhpZ2ggc3Vycm9nYXRlIiwgcHlzdHIsIGVuZCAtIDUpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGJhaWw7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVuZCArPSA2OwogICAgICAgICAgICAgICAgIC8qIERlY29kZSA0IGhleCBkaWdpdHMgKi8KICAgICAgICAgICAgICAgICBmb3IgKDsgbmV4dCA8IGVuZDsgbmV4dCsrKSB7CkBAIC01NTQsMTUgKzU0OCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKGMyICYgMHhmYzAwKSAhPSAweGRjMDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmFpc2VfZXJybXNnKCJVbnBhaXJlZCBoaWdoIHN1cnJvZ2F0ZSIsIHB5c3RyLCBlbmQgLSA1KTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBiYWlsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjID0gMHgxMDAwMCArICgoKGMgLSAweGQ4MDApIDw8IDEwKSB8IChjMiAtIDB4ZGMwMCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoKGMgJiAweGZjMDApID09IDB4ZGMwMCkgewotICAgICAgICAgICAgICAgIHJhaXNlX2Vycm1zZygiVW5wYWlyZWQgbG93IHN1cnJvZ2F0ZSIsIHB5c3RyLCBlbmQgLSA1KTsKLSAgICAgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgICAgICAgaWYgKChjMiAmIDB4ZmMwMCkgPT0gMHhkYzAwKQorICAgICAgICAgICAgICAgICAgICBjID0gMHgxMDAwMCArICgoKGMgLSAweGQ4MDApIDw8IDEwKSB8IChjMiAtIDB4ZGMwMCkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZW5kIC09IDY7CiAgICAgICAgICAgICB9CiAjZW5kaWYKICAgICAgICAgfQpAQCAtNzAzLDE2ICs2OTIsOSBAQAogICAgICAgICAgICAgfQogI2lmZGVmIFB5X1VOSUNPREVfV0lERQogICAgICAgICAgICAgLyogU3Vycm9nYXRlIHBhaXIgKi8KLSAgICAgICAgICAgIGlmICgoYyAmIDB4ZmMwMCkgPT0gMHhkODAwKSB7CisgICAgICAgICAgICBpZiAoKGMgJiAweGZjMDApID09IDB4ZDgwMCAmJiBlbmQgKyA2IDwgbGVuICYmCisgICAgICAgICAgICAgICAgYnVmW25leHQrK10gPT0gJ1xcJyAmJiBidWZbbmV4dCsrXSA9PSAndScpIHsKICAgICAgICAgICAgICAgICBQeV9VTklDT0RFIGMyID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoZW5kICsgNiA+PSBsZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgcmFpc2VfZXJybXNnKCJVbnBhaXJlZCBoaWdoIHN1cnJvZ2F0ZSIsIHB5c3RyLCBlbmQgLSA1KTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBiYWlsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYnVmW25leHQrK10gIT0gJ1xcJyB8fCBidWZbbmV4dCsrXSAhPSAndScpIHsKLSAgICAgICAgICAgICAgICAgICAgcmFpc2VfZXJybXNnKCJVbnBhaXJlZCBoaWdoIHN1cnJvZ2F0ZSIsIHB5c3RyLCBlbmQgLSA1KTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBiYWlsOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbmQgKz0gNjsKICAgICAgICAgICAgICAgICAvKiBEZWNvZGUgNCBoZXggZGlnaXRzICovCiAgICAgICAgICAgICAgICAgZm9yICg7IG5leHQgPCBlbmQ7IG5leHQrKykgewpAQCAtNzMzLDE1ICs3MTUsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhaWw7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChjMiAmIDB4ZmMwMCkgIT0gMHhkYzAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlX2Vycm1zZygiVW5wYWlyZWQgaGlnaCBzdXJyb2dhdGUiLCBweXN0ciwgZW5kIC0gNSk7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYyA9IDB4MTAwMDAgKyAoKChjIC0gMHhkODAwKSA8PCAxMCkgfCAoYzIgLSAweGRjMDApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKChjICYgMHhmYzAwKSA9PSAweGRjMDApIHsKLSAgICAgICAgICAgICAgICByYWlzZV9lcnJtc2coIlVucGFpcmVkIGxvdyBzdXJyb2dhdGUiLCBweXN0ciwgZW5kIC0gNSk7Ci0gICAgICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgICAgICAgIGlmICgoYzIgJiAweGZjMDApID09IDB4ZGMwMCkKKyAgICAgICAgICAgICAgICAgICAgYyA9IDB4MTAwMDAgKyAoKChjIC0gMHhkODAwKSA8PCAxMCkgfCAoYzIgLSAweGRjMDApKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGVuZCAtPSA2OwogICAgICAgICAgICAgfQogI2VuZGlmCiAgICAgICAgIH0KQEAgLTEwMzIsNyArMTAwOSw3IEBACiAgICAgICAgIHdoaWxlIChpZHggPD0gZW5kX2lkeCkgewogICAgICAgICAgICAgLyogcmVhZCBrZXkgKi8KICAgICAgICAgICAgIGlmIChzdHJbaWR4XSAhPSAnIicpIHsKLSAgICAgICAgICAgICAgICByYWlzZV9lcnJtc2coIkV4cGVjdGluZyBwcm9wZXJ0eSBuYW1lIiwgcHlzdHIsIGlkeCk7CisgICAgICAgICAgICAgICAgcmFpc2VfZXJybXNnKCJFeHBlY3RpbmcgcHJvcGVydHkgbmFtZSBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzIiwgcHlzdHIsIGlkeCk7CiAgICAgICAgICAgICAgICAgZ290byBiYWlsOwogICAgICAgICAgICAgfQogICAgICAgICAgICAga2V5ID0gc2NhbnN0cmluZ191bmljb2RlKHB5c3RyLCBpZHggKyAxLCBzdHJpY3QsICZuZXh0X2lkeCk7CkBAIC0xMDQzLDcgKzEwMjAsNyBAQAogICAgICAgICAgICAgLyogc2tpcCB3aGl0ZXNwYWNlIGJldHdlZW4ga2V5IGFuZCA6IGRlbGltaXRlciwgcmVhZCA6LCBza2lwIHdoaXRlc3BhY2UgKi8KICAgICAgICAgICAgIHdoaWxlIChpZHggPD0gZW5kX2lkeCAmJiBJU19XSElURVNQQUNFKHN0cltpZHhdKSkgaWR4Kys7CiAgICAgICAgICAgICBpZiAoaWR4ID4gZW5kX2lkeCB8fCBzdHJbaWR4XSAhPSAnOicpIHsKLSAgICAgICAgICAgICAgICByYWlzZV9lcnJtc2coIkV4cGVjdGluZyA6IGRlbGltaXRlciIsIHB5c3RyLCBpZHgpOworICAgICAgICAgICAgICAgIHJhaXNlX2Vycm1zZygiRXhwZWN0aW5nICc6JyBkZWxpbWl0ZXIiLCBweXN0ciwgaWR4KTsKICAgICAgICAgICAgICAgICBnb3RvIGJhaWw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZHgrKzsKQEAgLTEwNzUsNyArMTA1Miw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIGlmIChzdHJbaWR4XSAhPSAnLCcpIHsKLSAgICAgICAgICAgICAgICByYWlzZV9lcnJtc2coIkV4cGVjdGluZyAsIGRlbGltaXRlciIsIHB5c3RyLCBpZHgpOworICAgICAgICAgICAgICAgIHJhaXNlX2Vycm1zZygiRXhwZWN0aW5nICcsJyBkZWxpbWl0ZXIiLCBweXN0ciwgaWR4KTsKICAgICAgICAgICAgICAgICBnb3RvIGJhaWw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZHgrKzsKQEAgLTEyMzYsNyArMTIxMyw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIGlmIChzdHJbaWR4XSAhPSAnLCcpIHsKLSAgICAgICAgICAgICAgICByYWlzZV9lcnJtc2coIkV4cGVjdGluZyAsIGRlbGltaXRlciIsIHB5c3RyLCBpZHgpOworICAgICAgICAgICAgICAgIHJhaXNlX2Vycm1zZygiRXhwZWN0aW5nICcsJyBkZWxpbWl0ZXIiLCBweXN0ciwgaWR4KTsKICAgICAgICAgICAgICAgICBnb3RvIGJhaWw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZHgrKzsKQEAgLTE0OTEsNiArMTQ2OCwxMCBAQAogICAgIFB5T2JqZWN0ICpyZXM7CiAgICAgY2hhciAqc3RyID0gUHlTdHJpbmdfQVNfU1RSSU5HKHB5c3RyKTsKICAgICBQeV9zc2l6ZV90IGxlbmd0aCA9IFB5U3RyaW5nX0dFVF9TSVpFKHB5c3RyKTsKKyAgICBpZiAoaWR4IDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImlkeCBjYW5ub3QgYmUgbmVnYXRpdmUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICAgIGlmIChpZHggPj0gbGVuZ3RoKSB7CiAgICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfU3RvcEl0ZXJhdGlvbik7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTU3OCw2ICsxNTU5LDEwIEBACiAgICAgUHlPYmplY3QgKnJlczsKICAgICBQeV9VTklDT0RFICpzdHIgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShweXN0cik7CiAgICAgUHlfc3NpemVfdCBsZW5ndGggPSBQeVVuaWNvZGVfR0VUX1NJWkUocHlzdHIpOworICAgIGlmIChpZHggPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiaWR4IGNhbm5vdCBiZSBuZWdhdGl2ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgICAgaWYgKGlkeCA+PSBsZW5ndGgpIHsKICAgICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19TdG9wSXRlcmF0aW9uKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xNzI1LDggKzE3MTAsMTUgQEAKICAgICAgICAgUHlfREVDUkVGKHMtPmVuY29kaW5nKTsKICAgICAgICAgcy0+ZW5jb2RpbmcgPSB0bXA7CiAgICAgfQotICAgIGlmIChzLT5lbmNvZGluZyA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhzLT5lbmNvZGluZykpCisgICAgaWYgKHMtPmVuY29kaW5nID09IE5VTEwpCiAgICAgICAgIGdvdG8gYmFpbDsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHMtPmVuY29kaW5nKSkgeworCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisJCSAgICAgImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcsIG5vdCAlLjgwcyIsCisJCSAgICAgUHlfVFlQRShzLT5lbmNvZGluZyktPnRwX25hbWUpOworCWdvdG8gYmFpbDsKKyAgICB9CisgICAgICAgCiAKICAgICAvKiBBbGwgb2YgdGhlc2Ugd2lsbCBmYWlsICJncmFjZWZ1bGx5IiBzbyB3ZSBkb24ndCBuZWVkIHRvIHZlcmlmeSB0aGVtICovCiAgICAgcy0+c3RyaWN0ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhjdHgsICJzdHJpY3QiKTsKQEAgLTIyMTcsOCArMjIwOSw2IEBACiAgICAgc3RhdGljIFB5T2JqZWN0ICplbXB0eV9hcnJheSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmlkZW50ID0gTlVMTDsKICAgICBQeU9iamVjdCAqc19mYXN0ID0gTlVMTDsKLSAgICBQeV9zc2l6ZV90IG51bV9pdGVtczsKLSAgICBQeU9iamVjdCAqKnNlcV9pdGVtczsKICAgICBQeV9zc2l6ZV90IGk7CiAKICAgICBpZiAob3Blbl9hcnJheSA9PSBOVUxMIHx8IGNsb3NlX2FycmF5ID09IE5VTEwgfHwgZW1wdHlfYXJyYXkgPT0gTlVMTCkgewpAQCAtMjIzMiw4ICsyMjIyLDcgQEAKICAgICBzX2Zhc3QgPSBQeVNlcXVlbmNlX0Zhc3Qoc2VxLCAiX2l0ZXJlbmNvZGVfbGlzdCBuZWVkcyBhIHNlcXVlbmNlIik7CiAgICAgaWYgKHNfZmFzdCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gLTE7Ci0gICAgbnVtX2l0ZW1zID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9TSVpFKHNfZmFzdCk7Ci0gICAgaWYgKG51bV9pdGVtcyA9PSAwKSB7CisgICAgaWYgKFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShzX2Zhc3QpID09IDApIHsKICAgICAgICAgUHlfREVDUkVGKHNfZmFzdCk7CiAgICAgICAgIHJldHVybiBQeUxpc3RfQXBwZW5kKHJ2YWwsIGVtcHR5X2FycmF5KTsKICAgICB9CkBAIC0yMjU0LDcgKzIyNDMsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc2VxX2l0ZW1zID0gUHlTZXF1ZW5jZV9GYXN0X0lURU1TKHNfZmFzdCk7CiAgICAgaWYgKFB5TGlzdF9BcHBlbmQocnZhbCwgb3Blbl9hcnJheSkpCiAgICAgICAgIGdvdG8gYmFpbDsKICAgICBpZiAocy0+aW5kZW50ICE9IFB5X05vbmUpIHsKQEAgLTIyNjYsOCArMjI1NCw4IEBACiAgICAgICAgICAgICBidWYgKz0gbmV3bGluZV9pbmRlbnQKICAgICAgICAgKi8KICAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bV9pdGVtczsgaSsrKSB7Ci0gICAgICAgIFB5T2JqZWN0ICpvYmogPSBzZXFfaXRlbXNbaV07CisgICAgZm9yIChpID0gMDsgaSA8IFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShzX2Zhc3QpOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKm9iaiA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfSVRFTShzX2Zhc3QsIGkpOwogICAgICAgICBpZiAoaSkgewogICAgICAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQocnZhbCwgcy0+aXRlbV9zZXBhcmF0b3IpKQogICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX21hdGguYyBiL01vZHVsZXMvX21hdGguYwppbmRleCAyZmVmNDgxLi5mZTc1YTM2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19tYXRoLmMKKysrIGIvTW9kdWxlcy9fbWF0aC5jCkBAIC0xODksNiArMTg5LDI3IEBACiAgICBzaWduaWZpY2FudCBsb3NzIG9mIHByZWNpc2lvbiB0aGF0IGFyaXNlcyBmcm9tIGRpcmVjdCBldmFsdWF0aW9uIHdoZW4geCBpcwogICAgc21hbGwuICovCiAKKyNpZmRlZiBIQVZFX0xPRzFQCisKK2RvdWJsZQorX1B5X2xvZzFwKGRvdWJsZSB4KQoreworICAgIC8qIFNvbWUgcGxhdGZvcm1zIHN1cHBseSBhIGxvZzFwIGZ1bmN0aW9uIGJ1dCBkb24ndCByZXNwZWN0IHRoZSBzaWduIG9mCisgICAgICAgemVybzogIGxvZzFwKC0wLjApIGdpdmVzIDAuMCBpbnN0ZWFkIG9mIHRoZSBjb3JyZWN0IHJlc3VsdCBvZiAtMC4wLgorCisgICAgICAgVG8gc2F2ZSBmaWRkbGluZyB3aXRoIGNvbmZpZ3VyZSB0ZXN0cyBhbmQgcGxhdGZvcm0gY2hlY2tzLCB3ZSBoYW5kbGUgdGhlCisgICAgICAgc3BlY2lhbCBjYXNlIG9mIHplcm8gaW5wdXQgZGlyZWN0bHkgb24gYWxsIHBsYXRmb3Jtcy4KKyAgICAqLworICAgIGlmICh4ID09IDAuMCkgeworICAgICAgICByZXR1cm4geDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBsb2cxcCh4KTsKKyAgICB9Cit9CisKKyNlbHNlCisKIGRvdWJsZQogX1B5X2xvZzFwKGRvdWJsZSB4KQogewpAQCAtMjMwLDMgKzI1MSw1IEBACiAgICAgICAgIHJldHVybiBsb2coMS4reCk7CiAgICAgfQogfQorCisjZW5kaWYgLyogaWZkZWYgSEFWRV9MT0cxUCAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fbWF0aC5oIGIvTW9kdWxlcy9fbWF0aC5oCmluZGV4IGMwY2VlY2UuLmNmMDc5YWQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX21hdGguaAorKysgYi9Nb2R1bGVzL19tYXRoLmgKQEAgLTM2LDEwICszNiw2IEBACiAjZGVmaW5lIG1fZXhwbTEgX1B5X2V4cG0xCiAjZW5kaWYKIAotI2lmZGVmIEhBVkVfTE9HMVAKLSNkZWZpbmUgbV9sb2cxcCBsb2cxcAotI2Vsc2UKLS8qIGlmIHRoZSBzeXN0ZW0gZG9lc24ndCBoYXZlIGxvZzFwLCB1c2UgdGhlIHN1YnN0aXR1dGUKLSAgIGZ1bmN0aW9uIGRlZmluZWQgaW4gTW9kdWxlcy9fbWF0aC5jLiAqLworLyogVXNlIHRoZSBzdWJzdGl0dXRlIGZyb20gX21hdGguYyBvbiBhbGwgcGxhdGZvcm1zOgorICAgaXQgaW5jbHVkZXMgd29ya2Fyb3VuZHMgZm9yIGJ1Z2d5IGhhbmRsaW5nIG9mIHplcm9zLiAqLwogI2RlZmluZSBtX2xvZzFwIF9QeV9sb2cxcAotI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19tdWx0aXByb2Nlc3NpbmcvbXVsdGlwcm9jZXNzaW5nLmMgYi9Nb2R1bGVzL19tdWx0aXByb2Nlc3NpbmcvbXVsdGlwcm9jZXNzaW5nLmMKaW5kZXggMzFhOGRhOC4uZDE5MmEwNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL211bHRpcHJvY2Vzc2luZy5jCisrKyBiL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9tdWx0aXByb2Nlc3NpbmcuYwpAQCAtOCw3ICs4LDcgQEAKIAogI2luY2x1ZGUgIm11bHRpcHJvY2Vzc2luZy5oIgogCi0jaWZkZWYgU0NNX1JJR0hUUworI2lmIChkZWZpbmVkKENNU0dfTEVOKSAmJiBkZWZpbmVkKFNDTV9SSUdIVFMpKQogICAgICNkZWZpbmUgSEFWRV9GRF9UUkFOU0ZFUiAxCiAjZWxzZQogICAgICNkZWZpbmUgSEFWRV9GRF9UUkFOU0ZFUiAwCkBAIC02Myw3ICs2Myw3IEBACiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAidW5rb3duIGVycm9yIG51bWJlciAlZCIsIG51bSk7CisgICAgICAgICAgICAgICAgICAgICAidW5rbm93biBlcnJvciBudW1iZXIgJWQiLCBudW0pOwogICAgIH0KICAgICByZXR1cm4gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9zZW1hcGhvcmUuYyBiL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9zZW1hcGhvcmUuYwppbmRleCA1YmRhMWNlLi5iOWU4ZjM0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19tdWx0aXByb2Nlc3Npbmcvc2VtYXBob3JlLmMKKysrIGIvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL3NlbWFwaG9yZS5jCkBAIC0xOTcsNiArMTk3LDEzIEBACiAjZGVmaW5lIFNFTV9HRVRWQUxVRShzZW0sIHB2YWwpIHNlbV9nZXR2YWx1ZShzZW0sIHB2YWwpCiAjZGVmaW5lIFNFTV9VTkxJTksobmFtZSkgc2VtX3VubGluayhuYW1lKQogCisvKiBPUyBYIDEwLjQgZGVmaW5lcyBTRU1fRkFJTEVEIGFzIC0xIGluc3RlYWQgb2YgKHNlbV90ICopLTE7ICB0aGlzIGdpdmVzCisgICBjb21waWxlciB3YXJuaW5ncywgYW5kIChwb3RlbnRpYWxseSkgdW5kZWZpbmVkIGJlaGF2aW91ci4gKi8KKyNpZmRlZiBfX0FQUExFX18KKyMgIHVuZGVmIFNFTV9GQUlMRUQKKyMgIGRlZmluZSBTRU1fRkFJTEVEICgoc2VtX3QgKiktMSkKKyNlbmRpZgorCiAjaWZuZGVmIEhBVkVfU0VNX1VOTElOSwogIyAgZGVmaW5lIHNlbV91bmxpbmsobmFtZSkgMAogI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19tdWx0aXByb2Nlc3Npbmcvc29ja2V0X2Nvbm5lY3Rpb24uYyBiL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9zb2NrZXRfY29ubmVjdGlvbi5jCmluZGV4IDdlYmYzMzguLmJkYjBhMzIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9zb2NrZXRfY29ubmVjdGlvbi5jCisrKyBiL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9zb2NrZXRfY29ubmVjdGlvbi5jCkBAIC04LDYgKzgsMTAgQEAKIAogI2luY2x1ZGUgIm11bHRpcHJvY2Vzc2luZy5oIgogCisjaWYgZGVmaW5lZChIQVZFX1BPTEwpICYmICFkZWZpbmVkKEhBVkVfQlJPS0VOX1BPTEwpCisjICBpbmNsdWRlICJwb2xsLmgiCisjZW5kaWYKKwogI2lmZGVmIE1TX1dJTkRPV1MKICMgIGRlZmluZSBXUklURShoLCBidWZmZXIsIGxlbmd0aCkgc2VuZCgoU09DS0VUKWgsIGJ1ZmZlciwgbGVuZ3RoLCAwKQogIyAgZGVmaW5lIFJFQUQoaCwgYnVmZmVyLCBsZW5ndGgpIHJlY3YoKFNPQ0tFVCloLCBidWZmZXIsIGxlbmd0aCwgMCkKQEAgLTE5LDYgKzIzLDIxIEBACiAjZW5kaWYKIAogLyoKKyAqIFdyYXBwZXIgZm9yIFB5RXJyX0NoZWNrU2lnbmFscygpIHdoaWNoIGNhbiBiZSBjYWxsZWQgd2l0aG91dCB0aGUgR0lMCisgKi8KKworc3RhdGljIGludAorY2hlY2tfc2lnbmFscyh2b2lkKQoreworICAgIFB5R0lMU3RhdGVfU1RBVEUgc3RhdGU7CisgICAgaW50IHJlczsKKyAgICBzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CisgICAgcmVzID0gUHlFcnJfQ2hlY2tTaWduYWxzKCk7CisgICAgUHlHSUxTdGF0ZV9SZWxlYXNlKHN0YXRlKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKgogICogU2VuZCBzdHJpbmcgdG8gZmlsZSBkZXNjcmlwdG9yCiAgKi8KIApAQCAtMzAsOCArNDksMTQgQEAKIAogICAgIHdoaWxlIChsZW5ndGggPiAwKSB7CiAgICAgICAgIHJlcyA9IFdSSVRFKGgsIHAsIGxlbmd0aCk7Ci0gICAgICAgIGlmIChyZXMgPCAwKQorICAgICAgICBpZiAocmVzIDwgMCkgeworICAgICAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoZWNrX3NpZ25hbHMoKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNUF9FWENFUFRJT05fSEFTX0JFRU5fU0VUOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE1QX1NPQ0tFVF9FUlJPUjsKKyAgICAgICAgfQogICAgICAgICBsZW5ndGggLT0gcmVzOwogICAgICAgICBwICs9IHJlczsKICAgICB9CkBAIC01MiwxMiArNzcsMTYgQEAKIAogICAgIHdoaWxlIChyZW1haW5pbmcgPiAwKSB7CiAgICAgICAgIHRlbXAgPSBSRUFEKGgsIHAsIHJlbWFpbmluZyk7Ci0gICAgICAgIGlmICh0ZW1wIDw9IDApIHsKLSAgICAgICAgICAgIGlmICh0ZW1wID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlbWFpbmluZyA9PSBsZW5ndGggPwotICAgICAgICAgICAgICAgICAgICBNUF9FTkRfT0ZfRklMRSA6IE1QX0VBUkxZX0VORF9PRl9GSUxFOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wOworICAgICAgICBpZiAodGVtcCA8IDApIHsKKyAgICAgICAgICAgIGlmIChlcnJubyA9PSBFSU5UUikgeworICAgICAgICAgICAgICAgIGlmIChjaGVja19zaWduYWxzKCkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTVBfRVhDRVBUSU9OX0hBU19CRUVOX1NFVDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0ZW1wOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHRlbXAgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHJlbWFpbmluZyA9PSBsZW5ndGggPyBNUF9FTkRfT0ZfRklMRSA6IE1QX0VBUkxZX0VORF9PRl9GSUxFOwogICAgICAgICB9CiAgICAgICAgIHJlbWFpbmluZyAtPSB0ZW1wOwogICAgICAgICBwICs9IHRlbXA7CkBAIC0xMTcsNyArMTQ2LDcgQEAKIGNvbm5fcmVjdl9zdHJpbmcoQ29ubmVjdGlvbk9iamVjdCAqY29ubiwgY2hhciAqYnVmZmVyLAogICAgICAgICAgICAgICAgICBzaXplX3QgYnVmbGVuZ3RoLCBjaGFyICoqbmV3YnVmZmVyLCBzaXplX3QgbWF4bGVuZ3RoKQogewotICAgIGludCByZXM7CisgICAgUHlfc3NpemVfdCByZXM7CiAgICAgVUlOVDMyIHVsZW5ndGg7CiAKICAgICAqbmV3YnVmZmVyID0gTlVMTDsKQEAgLTEzMiwyMCArMTYxLDIzIEBACiAgICAgaWYgKHVsZW5ndGggPiBtYXhsZW5ndGgpCiAgICAgICAgIHJldHVybiBNUF9CQURfTUVTU0FHRV9MRU5HVEg7CiAKLSAgICBpZiAodWxlbmd0aCA8PSBidWZsZW5ndGgpIHsKLSAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotICAgICAgICByZXMgPSBfY29ubl9yZWN2YWxsKGNvbm4tPmhhbmRsZSwgYnVmZmVyLCAoc2l6ZV90KXVsZW5ndGgpOwotICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwotICAgICAgICByZXR1cm4gcmVzIDwgMCA/IHJlcyA6IHVsZW5ndGg7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKm5ld2J1ZmZlciA9IFB5TWVtX01hbGxvYygoc2l6ZV90KXVsZW5ndGgpOwotICAgICAgICBpZiAoKm5ld2J1ZmZlciA9PSBOVUxMKQorICAgIGlmICh1bGVuZ3RoID4gYnVmbGVuZ3RoKSB7CisgICAgICAgICpuZXdidWZmZXIgPSBidWZmZXIgPSBQeU1lbV9NYWxsb2MoKHNpemVfdCl1bGVuZ3RoKTsKKyAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQogICAgICAgICAgICAgcmV0dXJuIE1QX01FTU9SWV9FUlJPUjsKLSAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotICAgICAgICByZXMgPSBfY29ubl9yZWN2YWxsKGNvbm4tPmhhbmRsZSwgKm5ld2J1ZmZlciwgKHNpemVfdCl1bGVuZ3RoKTsKLSAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKLSAgICAgICAgcmV0dXJuIHJlcyA8IDAgPyAoUHlfc3NpemVfdClyZXMgOiAoUHlfc3NpemVfdCl1bGVuZ3RoOwogICAgIH0KKworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByZXMgPSBfY29ubl9yZWN2YWxsKGNvbm4tPmhhbmRsZSwgYnVmZmVyLCAoc2l6ZV90KXVsZW5ndGgpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisKKyAgICBpZiAocmVzID49IDApIHsKKyAgICAgICAgcmVzID0gKFB5X3NzaXplX3QpdWxlbmd0aDsKKyAgICB9IGVsc2UgaWYgKCpuZXdidWZmZXIgIT0gTlVMTCkgeworICAgICAgICBQeU1lbV9GcmVlKCpuZXdidWZmZXIpOworICAgICAgICAqbmV3YnVmZmVyID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKIH0KIAogLyoKQEAgLTE1NSw2ICsxODcsNDEgQEAKIHN0YXRpYyBpbnQKIGNvbm5fcG9sbChDb25uZWN0aW9uT2JqZWN0ICpjb25uLCBkb3VibGUgdGltZW91dCwgUHlUaHJlYWRTdGF0ZSAqX3NhdmUpCiB7CisjaWYgZGVmaW5lZChIQVZFX1BPTEwpICYmICFkZWZpbmVkKEhBVkVfQlJPS0VOX1BPTEwpCisgICAgaW50IHJlczsKKyAgICBzdHJ1Y3QgcG9sbGZkIHA7CisKKyAgICBwLmZkID0gKGludCljb25uLT5oYW5kbGU7CisgICAgcC5ldmVudHMgPSBQT0xMSU4gfCBQT0xMUFJJOworICAgIHAucmV2ZW50cyA9IDA7CisKKyAgICBpZiAodGltZW91dCA8IDApIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgcmVzID0gcG9sbCgmcCwgMSwgLTEpOworICAgICAgICB9IHdoaWxlIChyZXMgPCAwICYmIGVycm5vID09IEVJTlRSKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXMgPSBwb2xsKCZwLCAxLCAoaW50KSh0aW1lb3V0ICogMTAwMCArIDAuNSkpOworICAgICAgICBpZiAocmVzIDwgMCAmJiBlcnJubyA9PSBFSU5UUikgeworICAgICAgICAgICAgLyogV2Ugd2VyZSBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbC4gIEp1c3QgaW5kaWNhdGUgYQorICAgICAgICAgICAgICAgdGltZW91dCBldmVuIHRob3VnaCB3ZSBhcmUgZWFybHkuICovCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICByZXR1cm4gTVBfU09DS0VUX0VSUk9SOworICAgIH0gZWxzZSBpZiAocC5yZXZlbnRzICYgKFBPTExOVkFMfFBPTExFUlIpKSB7CisgICAgICAgIFB5X0JMT0NLX1RIUkVBRFMKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsICJwb2xsKCkgZ2F2ZSBQT0xMTlZBTCBvciBQT0xMRVJSIik7CisgICAgICAgIFB5X1VOQkxPQ0tfVEhSRUFEUworICAgICAgICByZXR1cm4gTVBfRVhDRVBUSU9OX0hBU19CRUVOX1NFVDsKKyAgICB9IGVsc2UgaWYgKHAucmV2ZW50cyAhPSAwKSB7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0gZWxzZSB7CisgICAgICAgIGFzc2VydChyZXMgPT0gMCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisjZWxzZQogICAgIGludCByZXM7CiAgICAgZmRfc2V0IHJmZHM7CiAKQEAgLTE3NCwxMiArMjQxLDE5IEBACiAgICAgRkRfU0VUKChTT0NLRVQpY29ubi0+aGFuZGxlLCAmcmZkcyk7CiAKICAgICBpZiAodGltZW91dCA8IDAuMCkgewotICAgICAgICByZXMgPSBzZWxlY3QoKGludCljb25uLT5oYW5kbGUrMSwgJnJmZHMsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICBkbyB7CisgICAgICAgICAgICByZXMgPSBzZWxlY3QoKGludCljb25uLT5oYW5kbGUrMSwgJnJmZHMsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICB9IHdoaWxlIChyZXMgPCAwICYmIGVycm5vID09IEVJTlRSKTsKICAgICB9IGVsc2UgewogICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKICAgICAgICAgdHYudHZfc2VjID0gKGxvbmcpdGltZW91dDsKICAgICAgICAgdHYudHZfdXNlYyA9IChsb25nKSgodGltZW91dCAtIHR2LnR2X3NlYykgKiAxZTYgKyAwLjUpOwogICAgICAgICByZXMgPSBzZWxlY3QoKGludCljb25uLT5oYW5kbGUrMSwgJnJmZHMsIE5VTEwsIE5VTEwsICZ0dik7CisgICAgICAgIGlmIChyZXMgPCAwICYmIGVycm5vID09IEVJTlRSKSB7CisgICAgICAgICAgICAvKiBXZSB3ZXJlIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsLiAgSnVzdCBpbmRpY2F0ZSBhCisgICAgICAgICAgICAgICB0aW1lb3V0IGV2ZW4gdGhvdWdoIHdlIGFyZSBlYXJseS4gKi8KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChyZXMgPCAwKSB7CkBAIC0xOTAsNiArMjY0LDcgQEAKICAgICAgICAgYXNzZXJ0KHJlcyA9PSAwKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KKyNlbmRpZgogfQogCiAvKgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL3dpbjMyX2Z1bmN0aW9ucy5jIGIvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL3dpbjMyX2Z1bmN0aW9ucy5jCmluZGV4IDE2NjZhYTkuLjk0MjU5MjkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy93aW4zMl9mdW5jdGlvbnMuYworKysgYi9Nb2R1bGVzL19tdWx0aXByb2Nlc3Npbmcvd2luMzJfZnVuY3Rpb25zLmMKQEAgLTI0NCw2ICsyNDQsNyBAQAogICAgIFB5X0lOQ1JFRigmV2luMzJUeXBlKTsKIAogICAgIFdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIEVSUk9SX0FMUkVBRFlfRVhJU1RTKTsKKyAgICBXSU4zMl9DT05TVEFOVChGX0RXT1JELCBFUlJPUl9OT19EQVRBKTsKICAgICBXSU4zMl9DT05TVEFOVChGX0RXT1JELCBFUlJPUl9QSVBFX0JVU1kpOwogICAgIFdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIEVSUk9SX1BJUEVfQ09OTkVDVEVEKTsKICAgICBXSU4zMl9DT05TVEFOVChGX0RXT1JELCBFUlJPUl9TRU1fVElNRU9VVCk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19yYW5kb21tb2R1bGUuYyBiL01vZHVsZXMvX3JhbmRvbW1vZHVsZS5jCmluZGV4IDA4YzIyNzcuLjhiYjllMzcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3JhbmRvbW1vZHVsZS5jCisrKyBiL01vZHVsZXMvX3JhbmRvbW1vZHVsZS5jCkBAIC00MDAsNyArNDAwLDcgQEAKICAgICBsb25nIGksIGo7CiAgICAgUHlPYmplY3QgKmlvYmo7CiAgICAgUHlPYmplY3QgKnJlbW9iajsKLSAgICB1bnNpZ25lZCBsb25nICptdCwgdG1wOworICAgIHVuc2lnbmVkIGxvbmcgKm10LCB0bXAsIG5vbnplcm87CiAKICAgICBpZiAoIVB5SW50X0NoZWNrKG4pICYmICFQeUxvbmdfQ2hlY2sobikpIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImp1bXBhaGVhZCByZXF1aXJlcyBhbiAiCkBAIC00MjcsOCArNDI3LDIzIEBACiAgICAgICAgIG10W2pdID0gdG1wOwogICAgIH0KIAotICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspCisgICAgbm9uemVybyA9IDA7CisgICAgZm9yIChpID0gMTsgaSA8IE47IGkrKykgewogICAgICAgICBtdFtpXSArPSBpKzE7CisgICAgICAgIG10W2ldICY9IDB4ZmZmZmZmZmZVTDsgLyogZm9yIFdPUkRTSVpFID4gMzIgbWFjaGluZXMgKi8KKyAgICAgICAgbm9uemVybyB8PSBtdFtpXTsKKyAgICB9CisKKyAgICAvKiBFbnN1cmUgdGhlIHN0YXRlIGlzIG5vbnplcm86IGluIHRoZSB1bmxpa2VseSBldmVudCB0aGF0IG10WzFdIHRocm91Z2gKKyAgICAgICBtdFtOLTFdIGFyZSBhbGwgemVybywgc2V0IHRoZSBNU0Igb2YgbXRbMF0gKHNlZSBpc3N1ZSAjMTQ1OTEpLiBJbiB0aGUKKyAgICAgICBub3JtYWwgY2FzZSwgd2UgZmFsbCBiYWNrIHRvIHRoZSBwcmUtaXNzdWUgMTQ1OTEgYmVoYXZpb3VyIGZvciBtdFswXS4gKi8KKyAgICBpZiAobm9uemVybykgeworICAgICAgICBtdFswXSArPSAxOworICAgICAgICBtdFswXSAmPSAweGZmZmZmZmZmVUw7IC8qIGZvciBXT1JEU0laRSA+IDMyIG1hY2hpbmVzICovCisgICAgfQorICAgIGVsc2UgeworICAgICAgICBtdFswXSA9IDB4ODAwMDAwMDBVTDsKKyAgICB9CiAKICAgICBzZWxmLT5pbmRleCA9IE47CiAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uYyBiL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmMKaW5kZXggNzY2NjU4MC4uN2E4YTVhMSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uYworKysgYi9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5jCkBAIC0xNTIsNyArMTUyLDEwIEBACiAgICAgICAgIFB5X0lOQ1JFRihpc29sYXRpb25fbGV2ZWwpOwogICAgIH0KICAgICBzZWxmLT5pc29sYXRpb25fbGV2ZWwgPSBOVUxMOwotICAgIHB5c3FsaXRlX2Nvbm5lY3Rpb25fc2V0X2lzb2xhdGlvbl9sZXZlbChzZWxmLCBpc29sYXRpb25fbGV2ZWwpOworICAgIGlmIChweXNxbGl0ZV9jb25uZWN0aW9uX3NldF9pc29sYXRpb25fbGV2ZWwoc2VsZiwgaXNvbGF0aW9uX2xldmVsKSA8IDApIHsKKyAgICAgICAgUHlfREVDUkVGKGlzb2xhdGlvbl9sZXZlbCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAgICAgUHlfREVDUkVGKGlzb2xhdGlvbl9sZXZlbCk7CiAKICAgICBzZWxmLT5zdGF0ZW1lbnRfY2FjaGUgPSAocHlzcWxpdGVfQ2FjaGUqKVB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QqKSZweXNxbGl0ZV9DYWNoZVR5cGUsICJPaSIsIHNlbGYsIGNhY2hlZF9zdGF0ZW1lbnRzKTsKQEAgLTM2Niw4ICszNjksNyBAQAogICAgICAgICBpZiAoc2VsZi0+YXBzd19jb25uZWN0aW9uKSB7CiAgICAgICAgICAgICByZXQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHNlbGYtPmFwc3dfY29ubmVjdGlvbiwgImNsb3NlIiwgIiIpOwogICAgICAgICAgICAgUHlfWERFQ1JFRihyZXQpOwotICAgICAgICAgICAgUHlfWERFQ1JFRihzZWxmLT5hcHN3X2Nvbm5lY3Rpb24pOwotICAgICAgICAgICAgc2VsZi0+YXBzd19jb25uZWN0aW9uID0gTlVMTDsKKyAgICAgICAgICAgIFB5X0NMRUFSKHNlbGYtPmFwc3dfY29ubmVjdGlvbik7CiAgICAgICAgICAgICBzZWxmLT5kYiA9IE5VTEw7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCkBAIC01MzgsMzkgKzU0MCw0MCBAQAogICAgIH0KIH0KIAotdm9pZCBfcHlzcWxpdGVfc2V0X3Jlc3VsdChzcWxpdGUzX2NvbnRleHQqIGNvbnRleHQsIFB5T2JqZWN0KiBweV92YWwpCitzdGF0aWMgaW50CitfcHlzcWxpdGVfc2V0X3Jlc3VsdChzcWxpdGUzX2NvbnRleHQqIGNvbnRleHQsIFB5T2JqZWN0KiBweV92YWwpCiB7Ci0gICAgbG9uZyBsb25ndmFsOwotICAgIGNvbnN0IGNoYXIqIGJ1ZmZlcjsKLSAgICBQeV9zc2l6ZV90IGJ1ZmxlbjsKLSAgICBQeU9iamVjdCogc3RyaW5ndmFsOwotCi0gICAgaWYgKCghcHlfdmFsKSB8fCBQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgIHNxbGl0ZTNfcmVzdWx0X251bGwoY29udGV4dCk7Ci0gICAgfSBlbHNlIGlmIChweV92YWwgPT0gUHlfTm9uZSkgeworICAgIGlmIChweV92YWwgPT0gUHlfTm9uZSkgewogICAgICAgICBzcWxpdGUzX3Jlc3VsdF9udWxsKGNvbnRleHQpOwogICAgIH0gZWxzZSBpZiAoUHlJbnRfQ2hlY2socHlfdmFsKSkgewotICAgICAgICBsb25ndmFsID0gUHlJbnRfQXNMb25nKHB5X3ZhbCk7Ci0gICAgICAgIHNxbGl0ZTNfcmVzdWx0X2ludDY0KGNvbnRleHQsIChQWV9MT05HX0xPTkcpbG9uZ3ZhbCk7CisgICAgICAgIHNxbGl0ZTNfcmVzdWx0X2ludDY0KGNvbnRleHQsIChzcWxpdGVfaW50NjQpUHlJbnRfQXNMb25nKHB5X3ZhbCkpOworICAgIH0gZWxzZSBpZiAoUHlMb25nX0NoZWNrKHB5X3ZhbCkpIHsKKyAgICAgICAgc3FsaXRlX2ludDY0IHZhbHVlID0gX3B5c3FsaXRlX2xvbmdfYXNfaW50NjQocHlfdmFsKTsKKyAgICAgICAgaWYgKHZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHNxbGl0ZTNfcmVzdWx0X2ludDY0KGNvbnRleHQsIHZhbHVlKTsKICAgICB9IGVsc2UgaWYgKFB5RmxvYXRfQ2hlY2socHlfdmFsKSkgewogICAgICAgICBzcWxpdGUzX3Jlc3VsdF9kb3VibGUoY29udGV4dCwgUHlGbG9hdF9Bc0RvdWJsZShweV92YWwpKTsKICAgICB9IGVsc2UgaWYgKFB5QnVmZmVyX0NoZWNrKHB5X3ZhbCkpIHsKKyAgICAgICAgY29uc3QgY2hhciogYnVmZmVyOworICAgICAgICBQeV9zc2l6ZV90IGJ1ZmxlbjsKICAgICAgICAgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihweV92YWwsICZidWZmZXIsICZidWZsZW4pICE9IDApIHsKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiY291bGQgbm90IGNvbnZlcnQgQkxPQiB0byBidWZmZXIiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNxbGl0ZTNfcmVzdWx0X2Jsb2IoY29udGV4dCwgYnVmZmVyLCBidWZsZW4sIFNRTElURV9UUkFOU0lFTlQpOworICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CisgICAgICAgIHNxbGl0ZTNfcmVzdWx0X2Jsb2IoY29udGV4dCwgYnVmZmVyLCBidWZsZW4sIFNRTElURV9UUkFOU0lFTlQpOwogICAgIH0gZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2socHlfdmFsKSkgewogICAgICAgICBzcWxpdGUzX3Jlc3VsdF90ZXh0KGNvbnRleHQsIFB5U3RyaW5nX0FzU3RyaW5nKHB5X3ZhbCksIC0xLCBTUUxJVEVfVFJBTlNJRU5UKTsKICAgICB9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhweV92YWwpKSB7Ci0gICAgICAgIHN0cmluZ3ZhbCA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcocHlfdmFsKTsKLSAgICAgICAgaWYgKHN0cmluZ3ZhbCkgewotICAgICAgICAgICAgc3FsaXRlM19yZXN1bHRfdGV4dChjb250ZXh0LCBQeVN0cmluZ19Bc1N0cmluZyhzdHJpbmd2YWwpLCAtMSwgU1FMSVRFX1RSQU5TSUVOVCk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoc3RyaW5ndmFsKTsKLSAgICAgICAgfQorICAgICAgICBQeU9iamVjdCAqIHN0cmluZ3ZhbCA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcocHlfdmFsKTsKKyAgICAgICAgaWYgKCFzdHJpbmd2YWwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHNxbGl0ZTNfcmVzdWx0X3RleHQoY29udGV4dCwgUHlTdHJpbmdfQXNTdHJpbmcoc3RyaW5ndmFsKSwgLTEsIFNRTElURV9UUkFOU0lFTlQpOworICAgICAgICBQeV9ERUNSRUYoc3RyaW5ndmFsKTsKICAgICB9IGVsc2UgewotICAgICAgICAvKiBUT0RPOiByYWlzZSBlcnJvciAqLworICAgICAgICByZXR1cm4gLTE7CiAgICAgfQorICAgIHJldHVybiAwOwogfQogCiBQeU9iamVjdCogX3B5c3FsaXRlX2J1aWxkX3B5X3BhcmFtcyhzcWxpdGUzX2NvbnRleHQgKmNvbnRleHQsIGludCBhcmdjLCBzcWxpdGUzX3ZhbHVlKiogYXJndikKQEAgLTU4MCw3ICs1ODMsNiBAQAogICAgIHNxbGl0ZTNfdmFsdWUqIGN1cl92YWx1ZTsKICAgICBQeU9iamVjdCogY3VyX3B5X3ZhbHVlOwogICAgIGNvbnN0IGNoYXIqIHZhbF9zdHI7Ci0gICAgUFlfTE9OR19MT05HIHZhbF9pbnQ7CiAgICAgUHlfc3NpemVfdCBidWZsZW47CiAgICAgdm9pZCogcmF3X2J1ZmZlcjsKIApAQCAtNTkzLDggKzU5NSw3IEBACiAgICAgICAgIGN1cl92YWx1ZSA9IGFyZ3ZbaV07CiAgICAgICAgIHN3aXRjaCAoc3FsaXRlM192YWx1ZV90eXBlKGFyZ3ZbaV0pKSB7CiAgICAgICAgICAgICBjYXNlIFNRTElURV9JTlRFR0VSOgotICAgICAgICAgICAgICAgIHZhbF9pbnQgPSBzcWxpdGUzX3ZhbHVlX2ludDY0KGN1cl92YWx1ZSk7Ci0gICAgICAgICAgICAgICAgY3VyX3B5X3ZhbHVlID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpdmFsX2ludCk7CisgICAgICAgICAgICAgICAgY3VyX3B5X3ZhbHVlID0gX3B5c3FsaXRlX2xvbmdfZnJvbV9pbnQ2NChzcWxpdGUzX3ZhbHVlX2ludDY0KGN1cl92YWx1ZSkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBTUUxJVEVfRkxPQVQ6CiAgICAgICAgICAgICAgICAgY3VyX3B5X3ZhbHVlID0gUHlGbG9hdF9Gcm9tRG91YmxlKHNxbGl0ZTNfdmFsdWVfZG91YmxlKGN1cl92YWx1ZSkpOwpAQCAtNjQ1LDYgKzY0Niw3IEBACiAgICAgUHlPYmplY3QqIGFyZ3M7CiAgICAgUHlPYmplY3QqIHB5X2Z1bmM7CiAgICAgUHlPYmplY3QqIHB5X3JldHZhbCA9IE5VTEw7CisgICAgaW50IG9rOwogCiAjaWZkZWYgV0lUSF9USFJFQUQKICAgICBQeUdJTFN0YXRlX1NUQVRFIHRocmVhZHN0YXRlOwpAQCAtNjYwLDEwICs2NjIsMTIgQEAKICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwogICAgIH0KIAorICAgIG9rID0gMDsKICAgICBpZiAocHlfcmV0dmFsKSB7Ci0gICAgICAgIF9weXNxbGl0ZV9zZXRfcmVzdWx0KGNvbnRleHQsIHB5X3JldHZhbCk7CisgICAgICAgIG9rID0gX3B5c3FsaXRlX3NldF9yZXN1bHQoY29udGV4dCwgcHlfcmV0dmFsKSA9PSAwOwogICAgICAgICBQeV9ERUNSRUYocHlfcmV0dmFsKTsKLSAgICB9IGVsc2UgeworICAgIH0KKyAgICBpZiAoIW9rKSB7CiAgICAgICAgIGlmIChfZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MpIHsKICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC03NDMsOCArNzQ3LDkgQEAKIAogdm9pZCBfcHlzcWxpdGVfZmluYWxfY2FsbGJhY2soc3FsaXRlM19jb250ZXh0KiBjb250ZXh0KQogewotICAgIFB5T2JqZWN0KiBmdW5jdGlvbl9yZXN1bHQgPSBOVUxMOworICAgIFB5T2JqZWN0KiBmdW5jdGlvbl9yZXN1bHQ7CiAgICAgUHlPYmplY3QqKiBhZ2dyZWdhdGVfaW5zdGFuY2U7CisgICAgaW50IG9rOwogCiAjaWZkZWYgV0lUSF9USFJFQUQKICAgICBQeUdJTFN0YXRlX1NUQVRFIHRocmVhZHN0YXRlOwpAQCAtNzYxLDIxICs3NjYsMjMgQEAKICAgICB9CiAKICAgICBmdW5jdGlvbl9yZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKCphZ2dyZWdhdGVfaW5zdGFuY2UsICJmaW5hbGl6ZSIsICIiKTsKLSAgICBpZiAoIWZ1bmN0aW9uX3Jlc3VsdCkgeworICAgIFB5X0RFQ1JFRigqYWdncmVnYXRlX2luc3RhbmNlKTsKKworICAgIG9rID0gMDsKKyAgICBpZiAoZnVuY3Rpb25fcmVzdWx0KSB7CisgICAgICAgIG9rID0gX3B5c3FsaXRlX3NldF9yZXN1bHQoY29udGV4dCwgZnVuY3Rpb25fcmVzdWx0KSA9PSAwOworICAgICAgICBQeV9ERUNSRUYoZnVuY3Rpb25fcmVzdWx0KTsKKyAgICB9CisgICAgaWYgKCFvaykgewogICAgICAgICBpZiAoX2VuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzKSB7CiAgICAgICAgICAgICBQeUVycl9QcmludCgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICAgfQogICAgICAgICBfc3FsaXRlM19yZXN1bHRfZXJyb3IoY29udGV4dCwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnZmluYWxpemUnIG1ldGhvZCByYWlzZWQgZXJyb3IiLCAtMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgX3B5c3FsaXRlX3NldF9yZXN1bHQoY29udGV4dCwgZnVuY3Rpb25fcmVzdWx0KTsKICAgICB9CiAKIGVycm9yOgotICAgIFB5X1hERUNSRUYoKmFnZ3JlZ2F0ZV9pbnN0YW5jZSk7Ci0gICAgUHlfWERFQ1JFRihmdW5jdGlvbl9yZXN1bHQpOwotCiAjaWZkZWYgV0lUSF9USFJFQUQKICAgICBQeUdJTFN0YXRlX1JlbGVhc2UodGhyZWFkc3RhdGUpOwogI2VuZGlmCkBAIC05MzIsNyArOTM5LDkgQEAKICAgICAgICAgcmMgPSBTUUxJVEVfREVOWTsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAoUHlJbnRfQ2hlY2socmV0KSkgewotICAgICAgICAgICAgcmMgPSAoaW50KVB5SW50X0FzTG9uZyhyZXQpOworICAgICAgICAgICAgcmMgPSBfUHlJbnRfQXNJbnQocmV0KTsKKyAgICAgICAgICAgIGlmIChyYyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIHJjID0gU1FMSVRFX0RFTlk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByYyA9IFNRTElURV9ERU5ZOwogICAgICAgICB9CkBAIC05NjQsNyArOTczLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qIGFib3J0IHF1ZXJ5IGlmIGVycm9yIG9jY3VycmVkICovCi0gICAgICAgIHJjID0gMTsgCisgICAgICAgIHJjID0gMTsKICAgICB9IGVsc2UgewogICAgICAgICByYyA9IChpbnQpUHlPYmplY3RfSXNUcnVlKHJldCk7CiAgICAgICAgIFB5X0RFQ1JFRihyZXQpOwpAQCAtMTMzNCw2ICsxMzQzLDcgQEAKICAgICBQeUdJTFN0YXRlX1NUQVRFIGdpbHN0YXRlOwogI2VuZGlmCiAgICAgUHlPYmplY3QqIHJldHZhbCA9IE5VTEw7CisgICAgbG9uZyBsb25ndmFsOwogICAgIGludCByZXN1bHQgPSAwOwogI2lmZGVmIFdJVEhfVEhSRUFECiAgICAgZ2lsc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOwpAQCAtMTM1NywxMCArMTM2NywxNyBAQAogICAgICAgICBnb3RvIGZpbmFsbHk7CiAgICAgfQogCi0gICAgcmVzdWx0ID0gUHlJbnRfQXNMb25nKHJldHZhbCk7Ci0gICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICBsb25ndmFsID0gUHlMb25nX0FzTG9uZ0FuZE92ZXJmbG93KHJldHZhbCwgJnJlc3VsdCk7CisgICAgaWYgKGxvbmd2YWwgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICByZXN1bHQgPSAwOwogICAgIH0KKyAgICBlbHNlIGlmICghcmVzdWx0KSB7CisgICAgICAgIGlmIChsb25ndmFsID4gMCkKKyAgICAgICAgICAgIHJlc3VsdCA9IDE7CisgICAgICAgIGVsc2UgaWYgKGxvbmd2YWwgPCAwKQorICAgICAgICAgICAgcmVzdWx0ID0gLTE7CisgICAgfQogCiBmaW5hbGx5OgogICAgIFB5X1hERUNSRUYoc3RyaW5nMSk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmMgYi9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmMKaW5kZXggOTRjM2Y0MC4uM2I4NDQ4NCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5jCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuYwpAQCAtMjYsMTQgKzI2LDYgQEAKICNpbmNsdWRlICJ1dGlsLmgiCiAjaW5jbHVkZSAic3FsaXRlY29tcGF0LmgiCiAKLS8qIHVzZWQgdG8gZGVjaWRlIHdldGhlciB0byBjYWxsIFB5SW50X0Zyb21Mb25nIG9yIFB5TG9uZ19Gcm9tTG9uZ0xvbmcgKi8KLSNpZm5kZWYgSU5UMzJfTUlOCi0jZGVmaW5lIElOVDMyX01JTiAoLTIxNDc0ODM2NDcgLSAxKQotI2VuZGlmCi0jaWZuZGVmIElOVDMyX01BWAotI2RlZmluZSBJTlQzMl9NQVggMjE0NzQ4MzY0NwotI2VuZGlmCi0KIFB5T2JqZWN0KiBweXNxbGl0ZV9jdXJzb3JfaXRlcm5leHQocHlzcWxpdGVfQ3Vyc29yKiBzZWxmKTsKIAogc3RhdGljIGNoYXIqIGVycm1zZ19mZXRjaF9hY3Jvc3Nfcm9sbGJhY2sgPSAiQ3Vyc29yIG5lZWRlZCB0byBiZSByZXNldCBiZWNhdXNlIG9mIGNvbW1pdC9yb2xsYmFjayBhbmQgY2FuIG5vIGxvbmdlciBiZSBmZXRjaGVkIGZyb20uIjsKQEAgLTIzOSw4ICsyMzEsNyBAQAogICAgICAgICAgICAgaWYgKGNvbnZlcnRlciAhPSBQeV9Ob25lKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGNvbnZlcnRlcik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBQeV9YREVDUkVGKHNlbGYtPnJvd19jYXN0X21hcCk7Ci0gICAgICAgICAgICBzZWxmLT5yb3dfY2FzdF9tYXAgPSBOVUxMOworICAgICAgICAgICAgUHlfQ0xFQVIoc2VsZi0+cm93X2Nhc3RfbWFwKTsKIAogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CkBAIC0yNjgsMTYgKzI1OSwxNyBAQAogICAgIH0KIH0KIAotUHlPYmplY3QqIHB5c3FsaXRlX3VuaWNvZGVfZnJvbV9zdHJpbmcoY29uc3QgY2hhciogdmFsX3N0ciwgaW50IG9wdGltaXplKQorUHlPYmplY3QqIHB5c3FsaXRlX3VuaWNvZGVfZnJvbV9zdHJpbmcoY29uc3QgY2hhciogdmFsX3N0ciwgUHlfc3NpemVfdCBzaXplLCBpbnQgb3B0aW1pemUpCiB7CiAgICAgY29uc3QgY2hhciogY2hlY2s7CisgICAgUHlfc3NpemVfdCBwb3M7CiAgICAgaW50IGlzX2FzY2lpID0gMDsKIAogICAgIGlmIChvcHRpbWl6ZSkgewogICAgICAgICBpc19hc2NpaSA9IDE7CiAKICAgICAgICAgY2hlY2sgPSB2YWxfc3RyOwotICAgICAgICB3aGlsZSAoKmNoZWNrKSB7CisgICAgICAgIGZvciAocG9zID0gMDsgcG9zIDwgc2l6ZTsgcG9zKyspIHsKICAgICAgICAgICAgIGlmICgqY2hlY2sgJiAweDgwKSB7CiAgICAgICAgICAgICAgICAgaXNfYXNjaWkgPSAwOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjg4LDkgKzI4MCw5IEBACiAgICAgfQogCiAgICAgaWYgKGlzX2FzY2lpKSB7Ci0gICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHZhbF9zdHIpOworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUodmFsX3N0ciwgc2l6ZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9EZWNvZGVVVEY4KHZhbF9zdHIsIHN0cmxlbih2YWxfc3RyKSwgTlVMTCk7CisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRGVjb2RlVVRGOCh2YWxfc3RyLCBzaXplLCBOVUxMKTsKICAgICB9CiB9CiAKQEAgLTMwNiw3ICsyOTgsNiBAQAogICAgIFB5T2JqZWN0KiByb3c7CiAgICAgUHlPYmplY3QqIGl0ZW0gPSBOVUxMOwogICAgIGludCBjb2x0eXBlOwotICAgIFBZX0xPTkdfTE9ORyBpbnR2YWw7CiAgICAgUHlPYmplY3QqIGNvbnZlcnRlcjsKICAgICBQeU9iamVjdCogY29udmVydGVkOwogICAgIFB5X3NzaXplX3QgbmJ5dGVzOwpAQCAtMzY1LDIwICszNTYsMTYgQEAKICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgICAgICAgICAgICAgY29udmVydGVkID0gUHlfTm9uZTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdHlwZSA9PSBTUUxJVEVfSU5URUdFUikgewotICAgICAgICAgICAgICAgIGludHZhbCA9IHNxbGl0ZTNfY29sdW1uX2ludDY0KHNlbGYtPnN0YXRlbWVudC0+c3QsIGkpOwotICAgICAgICAgICAgICAgIGlmIChpbnR2YWwgPCBJTlQzMl9NSU4gfHwgaW50dmFsID4gSU5UMzJfTUFYKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcoaW50dmFsKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBQeUludF9Gcm9tTG9uZygobG9uZylpbnR2YWwpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBfcHlzcWxpdGVfbG9uZ19mcm9tX2ludDY0KHNxbGl0ZTNfY29sdW1uX2ludDY0KHNlbGYtPnN0YXRlbWVudC0+c3QsIGkpKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdHlwZSA9PSBTUUxJVEVfRkxPQVQpIHsKICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBQeUZsb2F0X0Zyb21Eb3VibGUoc3FsaXRlM19jb2x1bW5fZG91YmxlKHNlbGYtPnN0YXRlbWVudC0+c3QsIGkpKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdHlwZSA9PSBTUUxJVEVfVEVYVCkgewogICAgICAgICAgICAgICAgIHZhbF9zdHIgPSAoY29uc3QgY2hhciopc3FsaXRlM19jb2x1bW5fdGV4dChzZWxmLT5zdGF0ZW1lbnQtPnN0LCBpKTsKKyAgICAgICAgICAgICAgICBuYnl0ZXMgPSBzcWxpdGUzX2NvbHVtbl9ieXRlcyhzZWxmLT5zdGF0ZW1lbnQtPnN0LCBpKTsKICAgICAgICAgICAgICAgICBpZiAoKHNlbGYtPmNvbm5lY3Rpb24tPnRleHRfZmFjdG9yeSA9PSAoUHlPYmplY3QqKSZQeVVuaWNvZGVfVHlwZSkKICAgICAgICAgICAgICAgICAgICAgfHwgKHNlbGYtPmNvbm5lY3Rpb24tPnRleHRfZmFjdG9yeSA9PSBweXNxbGl0ZV9PcHRpbWl6ZWRVbmljb2RlKSkgewogCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IHB5c3FsaXRlX3VuaWNvZGVfZnJvbV9zdHJpbmcodmFsX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgY29udmVydGVkID0gcHlzcWxpdGVfdW5pY29kZV9mcm9tX3N0cmluZyh2YWxfc3RyLCBuYnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5jb25uZWN0aW9uLT50ZXh0X2ZhY3RvcnkgPT0gcHlzcWxpdGVfT3B0aW1pemVkVW5pY29kZSA/IDEgOiAwKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnZlcnRlZCkgewpAQCAtMzkxLDkgKzM3OCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfT3BlcmF0aW9uYWxFcnJvciwgYnVmKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZi0+Y29ubmVjdGlvbi0+dGV4dF9mYWN0b3J5ID09IChQeU9iamVjdCopJlB5U3RyaW5nX1R5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udmVydGVkID0gUHlTdHJpbmdfRnJvbVN0cmluZyh2YWxfc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgY29udmVydGVkID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUodmFsX3N0ciwgbmJ5dGVzKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oc2VsZi0+Y29ubmVjdGlvbi0+dGV4dF9mYWN0b3J5LCAicyIsIHZhbF9zdHIpOworICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oc2VsZi0+Y29ubmVjdGlvbi0+dGV4dF9mYWN0b3J5LCAicyMiLCB2YWxfc3RyLCBuYnl0ZXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLyogY29sdHlwZSA9PSBTUUxJVEVfQkxPQiAqLwpAQCAtNDQxLDkgKzQyOCwxNCBAQAogICAgIGlmIChjdXItPmNsb3NlZCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfUHJvZ3JhbW1pbmdFcnJvciwgIkNhbm5vdCBvcGVyYXRlIG9uIGEgY2xvc2VkIGN1cnNvci4iKTsKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHB5c3FsaXRlX2NoZWNrX3RocmVhZChjdXItPmNvbm5lY3Rpb24pICYmIHB5c3FsaXRlX2NoZWNrX2Nvbm5lY3Rpb24oY3VyLT5jb25uZWN0aW9uKTsKICAgICB9CisKKyAgICBpZiAoY3VyLT5sb2NrZWQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX1Byb2dyYW1taW5nRXJyb3IsICJSZWN1cnNpdmUgdXNlIG9mIGN1cnNvcnMgbm90IGFsbG93ZWQuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiBweXNxbGl0ZV9jaGVja190aHJlYWQoY3VyLT5jb25uZWN0aW9uKSAmJiBweXNxbGl0ZV9jaGVja19jb25uZWN0aW9uKGN1ci0+Y29ubmVjdGlvbik7CiB9CiAKIFB5T2JqZWN0KiBfcHlzcWxpdGVfcXVlcnlfZXhlY3V0ZShweXNxbGl0ZV9DdXJzb3IqIHNlbGYsIGludCBtdWx0aXBsZSwgUHlPYmplY3QqIGFyZ3MpCkBAIC00NTksMzQgKzQ1MSwzMyBAQAogICAgIFB5T2JqZWN0KiBmdW5jX2FyZ3M7CiAgICAgUHlPYmplY3QqIHJlc3VsdDsKICAgICBpbnQgbnVtY29sczsKLSAgICBQWV9MT05HX0xPTkcgbGFzdHJvd2lkOwogICAgIGludCBzdGF0ZW1lbnRfdHlwZTsKICAgICBQeU9iamVjdCogZGVzY3JpcHRvcjsKICAgICBQeU9iamVjdCogc2Vjb25kX2FyZ3VtZW50ID0gTlVMTDsKICAgICBpbnQgYWxsb3dfOGJpdF9jaGFyczsKIAogICAgIGlmICghY2hlY2tfY3Vyc29yKHNlbGYpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAorICAgIHNlbGYtPmxvY2tlZCA9IDE7CiAgICAgc2VsZi0+cmVzZXQgPSAwOwogCiAgICAgLyogTWFrZSBzaG9vdGluZyB5b3Vyc2VsZiBpbiB0aGUgZm9vdCB3aXRoIG5vdCB1dGYtOCBkZWNvZGFibGUgOC1iaXQtc3RyaW5ncyBoYXJkZXIgKi8KICAgICBhbGxvd184Yml0X2NoYXJzID0gKChzZWxmLT5jb25uZWN0aW9uLT50ZXh0X2ZhY3RvcnkgIT0gKFB5T2JqZWN0KikmUHlVbmljb2RlX1R5cGUpICYmCiAgICAgICAgIChzZWxmLT5jb25uZWN0aW9uLT50ZXh0X2ZhY3RvcnkgIT0gcHlzcWxpdGVfT3B0aW1pemVkVW5pY29kZSkpOwogCi0gICAgUHlfWERFQ1JFRihzZWxmLT5uZXh0X3Jvdyk7Ci0gICAgc2VsZi0+bmV4dF9yb3cgPSBOVUxMOworICAgIFB5X0NMRUFSKHNlbGYtPm5leHRfcm93KTsKIAogICAgIGlmIChtdWx0aXBsZSkgewogICAgICAgICAvKiBleGVjdXRlbWFueSgpICovCiAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT08iLCAmb3BlcmF0aW9uLCAmc2Vjb25kX2FyZ3VtZW50KSkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayhvcGVyYXRpb24pICYmICFQeVVuaWNvZGVfQ2hlY2sob3BlcmF0aW9uKSkgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJvcGVyYXRpb24gcGFyYW1ldGVyIG11c3QgYmUgc3RyIG9yIHVuaWNvZGUiKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChQeUl0ZXJfQ2hlY2soc2Vjb25kX2FyZ3VtZW50KSkgewpAQCAtNDk3LDIzICs0ODgsMjMgQEAKICAgICAgICAgICAgIC8qIHNlcXVlbmNlICovCiAgICAgICAgICAgICBwYXJhbWV0ZXJzX2l0ZXIgPSBQeU9iamVjdF9HZXRJdGVyKHNlY29uZF9hcmd1bWVudCk7CiAgICAgICAgICAgICBpZiAoIXBhcmFtZXRlcnNfaXRlcikgewotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICAvKiBleGVjdXRlKCkgKi8KICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8iLCAmb3BlcmF0aW9uLCAmc2Vjb25kX2FyZ3VtZW50KSkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayhvcGVyYXRpb24pICYmICFQeVVuaWNvZGVfQ2hlY2sob3BlcmF0aW9uKSkgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJvcGVyYXRpb24gcGFyYW1ldGVyIG11c3QgYmUgc3RyIG9yIHVuaWNvZGUiKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogCiAgICAgICAgIHBhcmFtZXRlcnNfbGlzdCA9IFB5TGlzdF9OZXcoMCk7CiAgICAgICAgIGlmICghcGFyYW1ldGVyc19saXN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoc2Vjb25kX2FyZ3VtZW50ID09IE5VTEwpIHsKQEAgLTczOSwxMCArNzMwLDExIEBACiAKICAgICAgICAgUHlfREVDUkVGKHNlbGYtPmxhc3Ryb3dpZCk7CiAgICAgICAgIGlmICghbXVsdGlwbGUgJiYgc3RhdGVtZW50X3R5cGUgPT0gU1RBVEVNRU5UX0lOU0VSVCkgeworICAgICAgICAgICAgc3FsaXRlX2ludDY0IGxhc3Ryb3dpZDsKICAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICAgICAgICAgIGxhc3Ryb3dpZCA9IHNxbGl0ZTNfbGFzdF9pbnNlcnRfcm93aWQoc2VsZi0+Y29ubmVjdGlvbi0+ZGIpOwogICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKLSAgICAgICAgICAgIHNlbGYtPmxhc3Ryb3dpZCA9IFB5SW50X0Zyb21Mb25nKChsb25nKWxhc3Ryb3dpZCk7CisgICAgICAgICAgICBzZWxmLT5sYXN0cm93aWQgPSBfcHlzcWxpdGVfbG9uZ19mcm9tX2ludDY0KGxhc3Ryb3dpZCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgICAgICAgICBzZWxmLT5sYXN0cm93aWQgPSBQeV9Ob25lOwpAQCAtNzU5LDcgKzc1MSw4IEBACiAgICAgICogUk9MTEJBQ0sgY291bGQgaGF2ZSBoYXBwZW5lZCAqLwogICAgICNpZmRlZiBTUUxJVEVfVkVSU0lPTl9OVU1CRVIKICAgICAjaWYgU1FMSVRFX1ZFUlNJT05fTlVNQkVSID49IDMwMDIwMDIKLSAgICBzZWxmLT5jb25uZWN0aW9uLT5pblRyYW5zYWN0aW9uID0gIXNxbGl0ZTNfZ2V0X2F1dG9jb21taXQoc2VsZi0+Y29ubmVjdGlvbi0+ZGIpOworICAgIGlmIChzZWxmLT5jb25uZWN0aW9uICYmIHNlbGYtPmNvbm5lY3Rpb24tPmRiKQorICAgICAgICBzZWxmLT5jb25uZWN0aW9uLT5pblRyYW5zYWN0aW9uID0gIXNxbGl0ZTNfZ2V0X2F1dG9jb21taXQoc2VsZi0+Y29ubmVjdGlvbi0+ZGIpOwogICAgICNlbmRpZgogICAgICNlbmRpZgogCkBAIC03NjgsNiArNzYxLDggQEAKICAgICBQeV9YREVDUkVGKHBhcmFtZXRlcnNfaXRlcik7CiAgICAgUHlfWERFQ1JFRihwYXJhbWV0ZXJzX2xpc3QpOwogCisgICAgc2VsZi0+bG9ja2VkID0gMDsKKwogICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIHNlbGYtPnJvd2NvdW50ID0gLTFMOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTg5OSw4ICs4OTQsNyBAQAogICAgIGlmICghc2VsZi0+bmV4dF9yb3cpIHsKICAgICAgICAgIGlmIChzZWxmLT5zdGF0ZW1lbnQpIHsKICAgICAgICAgICAgICh2b2lkKXB5c3FsaXRlX3N0YXRlbWVudF9yZXNldChzZWxmLT5zdGF0ZW1lbnQpOwotICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYtPnN0YXRlbWVudCk7Ci0gICAgICAgICAgICBzZWxmLT5zdGF0ZW1lbnQgPSBOVUxMOworICAgICAgICAgICAgUHlfQ0xFQVIoc2VsZi0+c3RhdGVtZW50KTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmggYi9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmgKaW5kZXggODJmNTk3Mi4uY2Y1Mzg5YyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5oCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuaApAQCAtNDIsNiArNDIsNyBAQAogICAgIHB5c3FsaXRlX1N0YXRlbWVudCogc3RhdGVtZW50OwogICAgIGludCBjbG9zZWQ7CiAgICAgaW50IHJlc2V0OworICAgIGludCBsb2NrZWQ7CiAgICAgaW50IGluaXRpYWxpemVkOwogCiAgICAgLyogdGhlIG5leHQgcm93IHRvIGJlIHJldHVybmVkLCBOVUxMIGlmIG5vIG5leHQgcm93IGF2YWlsYWJsZSAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL3Jvdy5jIGIvTW9kdWxlcy9fc3FsaXRlL3Jvdy5jCmluZGV4IDQ4MGI0ODIuLmZmNTI1NjAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9yb3cuYworKysgYi9Nb2R1bGVzL19zcWxpdGUvcm93LmMKQEAgLTY0LDkgKzY0LDE2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK1B5T2JqZWN0KiBweXNxbGl0ZV9yb3dfaXRlbShweXNxbGl0ZV9Sb3cqIHNlbGYsIFB5X3NzaXplX3QgaWR4KQoreworICAgUHlPYmplY3QqIGl0ZW0gPSBQeVR1cGxlX0dldEl0ZW0oc2VsZi0+ZGF0YSwgaWR4KTsKKyAgIFB5X1hJTkNSRUYoaXRlbSk7CisgICByZXR1cm4gaXRlbTsKK30KKwogUHlPYmplY3QqIHB5c3FsaXRlX3Jvd19zdWJzY3JpcHQocHlzcWxpdGVfUm93KiBzZWxmLCBQeU9iamVjdCogaWR4KQogewotICAgIGxvbmcgX2lkeDsKKyAgICBQeV9zc2l6ZV90IF9pZHg7CiAgICAgY2hhcioga2V5OwogICAgIGludCBuaXRlbXMsIGk7CiAgICAgY2hhciogY29tcGFyZV9rZXk7CkBAIC03OCwxMSArODUsMTcgQEAKIAogICAgIGlmIChQeUludF9DaGVjayhpZHgpKSB7CiAgICAgICAgIF9pZHggPSBQeUludF9Bc0xvbmcoaWR4KTsKKyAgICAgICAgaWYgKF9pZHggPCAwKQorICAgICAgICAgICBfaWR4ICs9IFB5VHVwbGVfR0VUX1NJWkUoc2VsZi0+ZGF0YSk7CiAgICAgICAgIGl0ZW0gPSBQeVR1cGxlX0dldEl0ZW0oc2VsZi0+ZGF0YSwgX2lkeCk7CiAgICAgICAgIFB5X1hJTkNSRUYoaXRlbSk7CiAgICAgICAgIHJldHVybiBpdGVtOwogICAgIH0gZWxzZSBpZiAoUHlMb25nX0NoZWNrKGlkeCkpIHsKLSAgICAgICAgX2lkeCA9IFB5TG9uZ19Bc0xvbmcoaWR4KTsKKyAgICAgICAgX2lkeCA9IFB5TnVtYmVyX0FzU3NpemVfdChpZHgsIFB5RXhjX0luZGV4RXJyb3IpOworICAgICAgICBpZiAoX2lkeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChfaWR4IDwgMCkKKyAgICAgICAgICAgX2lkeCArPSBQeVR1cGxlX0dFVF9TSVpFKHNlbGYtPmRhdGEpOwogICAgICAgICBpdGVtID0gUHlUdXBsZV9HZXRJdGVtKHNlbGYtPmRhdGEsIF9pZHgpOwogICAgICAgICBQeV9YSU5DUkVGKGl0ZW0pOwogICAgICAgICByZXR1cm4gaXRlbTsKQEAgLTE5OSw2ICsyMTIsMTQgQEAKICAgICAvKiBtcF9hc3Nfc3Vic2NyaXB0ICovIChvYmpvYmphcmdwcm9jKTAsCiB9OwogCitzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgcHlzcWxpdGVfcm93X2FzX3NlcXVlbmNlID0geworICAgLyogc3FfbGVuZ3RoICovICAgICAgICAgKGxlbmZ1bmMpcHlzcWxpdGVfcm93X2xlbmd0aCwKKyAgIC8qIHNxX2NvbmNhdCAqLyAgICAgICAgIDAsCisgICAvKiBzcV9yZXBlYXQgKi8gICAgICAgICAwLAorICAgLyogc3FfaXRlbSAqLyAgICAgICAgICAgKHNzaXplYXJnZnVuYylweXNxbGl0ZV9yb3dfaXRlbSwKK307CisKKwogc3RhdGljIFB5TWV0aG9kRGVmIHB5c3FsaXRlX3Jvd19tZXRob2RzW10gPSB7CiAgICAgeyJrZXlzIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX3Jvd19rZXlzLCBNRVRIX05PQVJHUywKICAgICAgICAgUHlEb2NfU1RSKCJSZXR1cm5zIHRoZSBrZXlzIG9mIHRoZSByb3cuIil9LApAQCAtMjUyLDUgKzI3Myw2IEBACiB7CiAgICAgcHlzcWxpdGVfUm93VHlwZS50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKICAgICBweXNxbGl0ZV9Sb3dUeXBlLnRwX2FzX21hcHBpbmcgPSAmcHlzcWxpdGVfcm93X2FzX21hcHBpbmc7CisgICAgcHlzcWxpdGVfUm93VHlwZS50cF9hc19zZXF1ZW5jZSA9ICZweXNxbGl0ZV9yb3dfYXNfc2VxdWVuY2U7CiAgICAgcmV0dXJuIFB5VHlwZV9SZWFkeSgmcHlzcWxpdGVfUm93VHlwZSk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvc3RhdGVtZW50LmMgYi9Nb2R1bGVzL19zcWxpdGUvc3RhdGVtZW50LmMKaW5kZXggOWQwOGYyYi4uN2E3YTYwZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL3N0YXRlbWVudC5jCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9zdGF0ZW1lbnQuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKICNpbmNsdWRlICJtaWNyb3Byb3RvY29scy5oIgogI2luY2x1ZGUgInByZXBhcmVfcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJ1dGlsLmgiCiAjaW5jbHVkZSAic3FsaXRlY29tcGF0LmgiCiAKIC8qIHByb3RvdHlwZXMgKi8KQEAgLTEwMSw4ICsxMDIsNiBAQAogaW50IHB5c3FsaXRlX3N0YXRlbWVudF9iaW5kX3BhcmFtZXRlcihweXNxbGl0ZV9TdGF0ZW1lbnQqIHNlbGYsIGludCBwb3MsIFB5T2JqZWN0KiBwYXJhbWV0ZXIsIGludCBhbGxvd184Yml0X2NoYXJzKQogewogICAgIGludCByYyA9IFNRTElURV9PSzsKLSAgICBsb25nIGxvbmd2YWw7Ci0gICAgUFlfTE9OR19MT05HIGxvbmdsb25ndmFsOwogICAgIGNvbnN0IGNoYXIqIGJ1ZmZlcjsKICAgICBjaGFyKiBzdHJpbmc7CiAgICAgUHlfc3NpemVfdCBidWZsZW47CkBAIC0xNTMsMjYgKzE1MiwzMCBAQAogICAgIH0KIAogICAgIHN3aXRjaCAocGFyYW10eXBlKSB7Ci0gICAgICAgIGNhc2UgVFlQRV9JTlQ6Ci0gICAgICAgICAgICBsb25ndmFsID0gUHlJbnRfQXNMb25nKHBhcmFtZXRlcik7Ci0gICAgICAgICAgICByYyA9IHNxbGl0ZTNfYmluZF9pbnQ2NChzZWxmLT5zdCwgcG9zLCAoc3FsaXRlX2ludDY0KWxvbmd2YWwpOworICAgICAgICBjYXNlIFRZUEVfSU5UOiB7CisgICAgICAgICAgICBsb25nIGxvbmd2YWwgPSBQeUludF9Bc0xvbmcocGFyYW1ldGVyKTsKKyAgICAgICAgICAgIHJjID0gc3FsaXRlM19iaW5kX2ludDY0KHNlbGYtPnN0LCBwb3MsIGxvbmd2YWwpOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFlQRV9MT05HOgotICAgICAgICAgICAgbG9uZ2xvbmd2YWwgPSBQeUxvbmdfQXNMb25nTG9uZyhwYXJhbWV0ZXIpOwotICAgICAgICAgICAgLyogaW4gdGhlIG92ZXJmbG93IGVycm9yIGNhc2UsIGxvbmdsb25ndmFsIGlzIC0xLCBhbmQgYW4gZXhjZXB0aW9uIGlzIHNldCAqLwotICAgICAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfaW50NjQoc2VsZi0+c3QsIHBvcywgKHNxbGl0ZV9pbnQ2NClsb25nbG9uZ3ZhbCk7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUWVBFX0xPTkc6IHsKKyAgICAgICAgICAgIHNxbGl0ZV9pbnQ2NCB2YWx1ZSA9IF9weXNxbGl0ZV9sb25nX2FzX2ludDY0KHBhcmFtZXRlcik7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJjID0gc3FsaXRlM19iaW5kX2ludDY0KHNlbGYtPnN0LCBwb3MsIChzcWxpdGVfaW50NjQpdmFsdWUpOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgICAgY2FzZSBUWVBFX0ZMT0FUOgogICAgICAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfZG91YmxlKHNlbGYtPnN0LCBwb3MsIFB5RmxvYXRfQXNEb3VibGUocGFyYW1ldGVyKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBUWVBFX1NUUklORzoKLSAgICAgICAgICAgIHN0cmluZyA9IFB5U3RyaW5nX0FTX1NUUklORyhwYXJhbWV0ZXIpOwotICAgICAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfdGV4dChzZWxmLT5zdCwgcG9zLCBzdHJpbmcsIC0xLCBTUUxJVEVfVFJBTlNJRU5UKTsKKyAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShwYXJhbWV0ZXIsICZzdHJpbmcsICZidWZsZW4pOworICAgICAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfdGV4dChzZWxmLT5zdCwgcG9zLCBzdHJpbmcsIGJ1ZmxlbiwgU1FMSVRFX1RSQU5TSUVOVCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBUWVBFX1VOSUNPREU6CiAgICAgICAgICAgICBzdHJpbmd2YWwgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHBhcmFtZXRlcik7Ci0gICAgICAgICAgICBzdHJpbmcgPSBQeVN0cmluZ19Bc1N0cmluZyhzdHJpbmd2YWwpOwotICAgICAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfdGV4dChzZWxmLT5zdCwgcG9zLCBzdHJpbmcsIC0xLCBTUUxJVEVfVFJBTlNJRU5UKTsKKyAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShzdHJpbmd2YWwsICZzdHJpbmcsICZidWZsZW4pOworICAgICAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfdGV4dChzZWxmLT5zdCwgcG9zLCBzdHJpbmcsIGJ1ZmxlbiwgU1FMSVRFX1RSQU5TSUVOVCk7CiAgICAgICAgICAgICBQeV9ERUNSRUYoc3RyaW5ndmFsKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFRZUEVfQlVGRkVSOgpAQCAtMTk4LDcgKzIwMSw3IEBACiAgICAgICAgIHJldHVybiAxOwogICAgIH0KIAotICAgIGlmIChQeUludF9DaGVja0V4YWN0KG9iaikgfHwgUHlMb25nX0NoZWNrRXhhY3Qob2JqKSAKKyAgICBpZiAoUHlJbnRfQ2hlY2tFeGFjdChvYmopIHx8IFB5TG9uZ19DaGVja0V4YWN0KG9iaikKICAgICAgICAgICAgIHx8IFB5RmxvYXRfQ2hlY2tFeGFjdChvYmopIHx8IFB5U3RyaW5nX0NoZWNrRXhhY3Qob2JqKQogICAgICAgICAgICAgfHwgUHlVbmljb2RlX0NoZWNrRXhhY3Qob2JqKSB8fCBQeUJ1ZmZlcl9DaGVjayhvYmopKSB7CiAgICAgICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL3V0aWwuYyBiL01vZHVsZXMvX3NxbGl0ZS91dGlsLmMKaW5kZXggNmI1N2I3Ni4uYTI0ZGQ4YyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL3V0aWwuYworKysgYi9Nb2R1bGVzL19zcWxpdGUvdXRpbC5jCkBAIC0xMDQsMyArMTA0LDY5IEBACiAgICAgcmV0dXJuIGVycm9yY29kZTsKIH0KIAorI2lmZGVmIFdPUkRTX0JJR0VORElBTgorIyBkZWZpbmUgSVNfTElUVExFX0VORElBTiAwCisjZWxzZQorIyBkZWZpbmUgSVNfTElUVExFX0VORElBTiAxCisjZW5kaWYKKworUHlPYmplY3QgKgorX3B5c3FsaXRlX2xvbmdfZnJvbV9pbnQ2NChzcWxpdGVfaW50NjQgdmFsdWUpCit7CisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKyMgaWYgU0laRU9GX0xPTkdfTE9ORyA8IDgKKyAgICBpZiAodmFsdWUgPiBQWV9MTE9OR19NQVggfHwgdmFsdWUgPCBQWV9MTE9OR19NSU4pIHsKKyAgICAgICAgcmV0dXJuIF9QeUxvbmdfRnJvbUJ5dGVBcnJheSgmdmFsdWUsIHNpemVvZih2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfTElUVExFX0VORElBTiwgMSAvKiBzaWduZWQgKi8pOworICAgIH0KKyMgZW5kaWYKKyMgaWYgU0laRU9GX0xPTkcgPCBTSVpFT0ZfTE9OR19MT05HCisgICAgaWYgKHZhbHVlID4gTE9OR19NQVggfHwgdmFsdWUgPCBMT05HX01JTikKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcodmFsdWUpOworIyBlbmRpZgorI2Vsc2UKKyMgaWYgU0laRU9GX0xPTkcgPCA4CisgICAgaWYgKHZhbHVlID4gTE9OR19NQVggfHwgdmFsdWUgPCBMT05HX01JTikgeworICAgICAgICByZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KCZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU19MSVRUTEVfRU5ESUFOLCAxIC8qIHNpZ25lZCAqLyk7CisgICAgfQorIyBlbmRpZgorI2VuZGlmCisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbHVlKTsKK30KKworc3FsaXRlX2ludDY0CitfcHlzcWxpdGVfbG9uZ19hc19pbnQ2NChQeU9iamVjdCAqIHB5X3ZhbCkKK3sKKyAgICBpbnQgb3ZlcmZsb3c7CisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKyAgICBQWV9MT05HX0xPTkcgdmFsdWUgPSBQeUxvbmdfQXNMb25nTG9uZ0FuZE92ZXJmbG93KHB5X3ZhbCwgJm92ZXJmbG93KTsKKyNlbHNlCisgICAgbG9uZyB2YWx1ZSA9IFB5TG9uZ19Bc0xvbmdBbmRPdmVyZmxvdyhweV92YWwsICZvdmVyZmxvdyk7CisjZW5kaWYKKyAgICBpZiAodmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghb3ZlcmZsb3cpIHsKKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworIyBpZiBTSVpFT0ZfTE9OR19MT05HID4gOAorICAgICAgICBpZiAoLTB4ODAwMDAwMDAwMDAwMDAwMExMIDw9IHZhbHVlICYmIHZhbHVlIDw9IDB4N0ZGRkZGRkZGRkZGRkZGRkxMKQorIyBlbmRpZgorI2Vsc2UKKyMgaWYgU0laRU9GX0xPTkcgPiA4CisgICAgICAgIGlmICgtMHg4MDAwMDAwMDAwMDAwMDAwTCA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAweDdGRkZGRkZGRkZGRkZGRkZMKQorIyBlbmRpZgorI2VuZGlmCisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIGVsc2UgaWYgKHNpemVvZih2YWx1ZSkgPCBzaXplb2Yoc3FsaXRlX2ludDY0KSkgeworICAgICAgICBzcWxpdGVfaW50NjQgaW50NjR2YWw7CisgICAgICAgIGlmIChfUHlMb25nX0FzQnl0ZUFycmF5KChQeUxvbmdPYmplY3QgKilweV92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopJmludDY0dmFsLCBzaXplb2YoaW50NjR2YWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU19MSVRUTEVfRU5ESUFOLCAxIC8qIHNpZ25lZCAqLykgPj0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGludDY0dmFsOworICAgICAgICB9CisgICAgfQorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAiUHl0aG9uIGludCB0b28gbGFyZ2UgdG8gY29udmVydCB0byBTUUxpdGUgSU5URUdFUiIpOworICAgIHJldHVybiAtMTsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS91dGlsLmggYi9Nb2R1bGVzL19zcWxpdGUvdXRpbC5oCmluZGV4IDQyNjkwMDMuLjRjM2IyYzcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS91dGlsLmgKKysrIGIvTW9kdWxlcy9fc3FsaXRlL3V0aWwuaApAQCAtMzUsNCArMzUsOCBAQAogICogUmV0dXJucyB0aGUgZXJyb3IgY29kZSAoMCBtZWFucyBubyBlcnJvciBvY2N1cnJlZCkuCiAgKi8KIGludCBfcHlzcWxpdGVfc2V0ZXJyb3Ioc3FsaXRlMyogZGIsIHNxbGl0ZTNfc3RtdCogc3QpOworCitQeU9iamVjdCAqIF9weXNxbGl0ZV9sb25nX2Zyb21faW50NjQoc3FsaXRlX2ludDY0IHZhbHVlKTsKK3NxbGl0ZV9pbnQ2NCBfcHlzcWxpdGVfbG9uZ19hc19pbnQ2NChQeU9iamVjdCAqIHZhbHVlKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcmUuYyBiL01vZHVsZXMvX3NyZS5jCmluZGV4IGNkOTU5MTcuLmQ4OGMxM2YgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NyZS5jCisrKyBiL01vZHVsZXMvX3NyZS5jCkBAIC0yNzIsNyArMjcyLDcgQEAKICAgICBpZiAoY3Vyc2l6ZSA8IG1pbnNpemUpIHsKICAgICAgICAgdm9pZCogc3RhY2s7CiAgICAgICAgIGN1cnNpemUgPSBtaW5zaXplK21pbnNpemUvNCsxMDI0OwotICAgICAgICBUUkFDRSgoImFsbG9jYXRlL2dyb3cgc3RhY2sgJWRcbiIsIGN1cnNpemUpKTsKKyAgICAgICAgVFJBQ0UoKCJhbGxvY2F0ZS9ncm93IHN0YWNrICUiIFBZX0ZPUk1BVF9TSVpFX1QgImRcbiIsIGN1cnNpemUpKTsKICAgICAgICAgc3RhY2sgPSBQeU1lbV9SRUFMTE9DKHN0YXRlLT5kYXRhX3N0YWNrLCBjdXJzaXplKTsKICAgICAgICAgaWYgKCFzdGFjaykgewogICAgICAgICAgICAgZGF0YV9zdGFja19kZWFsbG9jKHN0YXRlKTsKQEAgLTQ1OSw3ICs0NTksNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgLyogPENIQVJTRVQ+IDxiaXRtYXA+ICgzMiBiaXRzIHBlciBjb2RlIHdvcmQpICovCi0gICAgICAgICAgICAgICAgaWYgKGNoIDwgMjU2ICYmIChzZXRbY2ggPj4gNV0gJiAoMSA8PCAoY2ggJiAzMSkpKSkKKyAgICAgICAgICAgICAgICBpZiAoY2ggPCAyNTYgJiYgKHNldFtjaCA+PiA1XSAmICgxdSA8PCAoY2ggJiAzMSkpKSkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9rOwogICAgICAgICAgICAgICAgIHNldCArPSA4OwogICAgICAgICAgICAgfQpAQCAtNDk4LDcgKzQ5OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGJsb2NrID0gLTE7CiAgICAgICAgICAgICAgICAgc2V0ICs9IDY0OwogICAgICAgICAgICAgICAgIGlmIChibG9jayA+PTAgJiYKLSAgICAgICAgICAgICAgICAgICAgKHNldFtibG9jayo4ICsgKChjaCAmIDI1NSk+PjUpXSAmICgxIDw8IChjaCAmIDMxKSkpKQorICAgICAgICAgICAgICAgICAgICAoc2V0W2Jsb2NrKjggKyAoKGNoICYgMjU1KT4+NSldICYgKDF1IDw8IChjaCAmIDMxKSkpKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2s7CiAgICAgICAgICAgICAgICAgc2V0ICs9IGNvdW50Kjg7CiAgICAgICAgICAgICB9CkBAIC01MjQsNyArNTI0LDcgQEAKICAgICBQeV9zc2l6ZV90IGk7CiAKICAgICAvKiBhZGp1c3QgZW5kICovCi0gICAgaWYgKG1heGNvdW50IDwgZW5kIC0gcHRyICYmIG1heGNvdW50ICE9IDY1NTM1KQorICAgIGlmIChtYXhjb3VudCA8IGVuZCAtIHB0ciAmJiBtYXhjb3VudCAhPSBTUkVfTUFYUkVQRUFUKQogICAgICAgICBlbmQgPSBwdHIgKyBtYXhjb3VudDsKIAogICAgIHN3aXRjaCAocGF0dGVyblswXSkgewpAQCAtNTkyLDEyICs1OTIsMTMgQEAKICAgICAgICAgICAgIGlmICghaSkKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBUUkFDRSgoInwlcHwlcHxDT1VOVCAlZFxuIiwgcGF0dGVybiwgcHRyLAorICAgICAgICBUUkFDRSgoInwlcHwlcHxDT1VOVCAlIiBQWV9GT1JNQVRfU0laRV9UICJkXG4iLCBwYXR0ZXJuLCBwdHIsCiAgICAgICAgICAgICAgICAoU1JFX0NIQVIqKSBzdGF0ZS0+cHRyIC0gcHRyKSk7CiAgICAgICAgIHJldHVybiAoU1JFX0NIQVIqKSBzdGF0ZS0+cHRyIC0gcHRyOwogICAgIH0KIAotICAgIFRSQUNFKCgifCVwfCVwfENPVU5UICVkXG4iLCBwYXR0ZXJuLCBwdHIsIHB0ciAtIChTUkVfQ0hBUiopIHN0YXRlLT5wdHIpKTsKKyAgICBUUkFDRSgoInwlcHwlcHxDT1VOVCAlIiBQWV9GT1JNQVRfU0laRV9UICJkXG4iLCBwYXR0ZXJuLCBwdHIsCisgICAgICAgICAgIHB0ciAtIChTUkVfQ0hBUiopIHN0YXRlLT5wdHIpKTsKICAgICByZXR1cm4gcHRyIC0gKFNSRV9DSEFSKikgc3RhdGUtPnB0cjsKIH0KIApAQCAtNjg0LDkgKzY4NSwxMCBAQAogI2RlZmluZSBEQVRBX1NUQUNLX0FMTE9DKHN0YXRlLCB0eXBlLCBwdHIpIFwKIGRvIHsgXAogICAgIGFsbG9jX3BvcyA9IHN0YXRlLT5kYXRhX3N0YWNrX2Jhc2U7IFwKLSAgICBUUkFDRSgoImFsbG9jYXRpbmcgJXMgaW4gJWQgKCVkKVxuIiwgXAorICAgIFRSQUNFKCgiYWxsb2NhdGluZyAlcyBpbiAlIiBQWV9GT1JNQVRfU0laRV9UICJkICIgXAorICAgICAgICAgICAiKCUiIFBZX0ZPUk1BVF9TSVpFX1QgImQpXG4iLCBcCiAgICAgICAgICAgIFNGWSh0eXBlKSwgYWxsb2NfcG9zLCBzaXplb2YodHlwZSkpKTsgXAotICAgIGlmIChzdGF0ZS0+ZGF0YV9zdGFja19zaXplIDwgYWxsb2NfcG9zK3NpemVvZih0eXBlKSkgeyBcCisgICAgaWYgKHNpemVvZih0eXBlKSA+IHN0YXRlLT5kYXRhX3N0YWNrX3NpemUgLSBhbGxvY19wb3MpIHsgXAogICAgICAgICBpbnQgaiA9IGRhdGFfc3RhY2tfZ3JvdyhzdGF0ZSwgc2l6ZW9mKHR5cGUpKTsgXAogICAgICAgICBpZiAoaiA8IDApIHJldHVybiBqOyBcCiAgICAgICAgIGlmIChjdHhfcG9zICE9IC0xKSBcCkBAIC02OTgsMTUgKzcwMCwxNiBAQAogCiAjZGVmaW5lIERBVEFfU1RBQ0tfTE9PS1VQX0FUKHN0YXRlLCB0eXBlLCBwdHIsIHBvcykgXAogZG8geyBcCi0gICAgVFJBQ0UoKCJsb29raW5nIHVwICVzIGF0ICVkXG4iLCBTRlkodHlwZSksIHBvcykpOyBcCisgICAgVFJBQ0UoKCJsb29raW5nIHVwICVzIGF0ICUiIFBZX0ZPUk1BVF9TSVpFX1QgImRcbiIsIFNGWSh0eXBlKSwgcG9zKSk7IFwKICAgICBwdHIgPSAodHlwZSopKHN0YXRlLT5kYXRhX3N0YWNrK3Bvcyk7IFwKIH0gd2hpbGUgKDApCiAKICNkZWZpbmUgREFUQV9TVEFDS19QVVNIKHN0YXRlLCBkYXRhLCBzaXplKSBcCiBkbyB7IFwKLSAgICBUUkFDRSgoImNvcHkgZGF0YSBpbiAlcCB0byAlZCAoJWQpXG4iLCBcCisgICAgVFJBQ0UoKCJjb3B5IGRhdGEgaW4gJXAgdG8gJSIgUFlfRk9STUFUX1NJWkVfVCAiZCAiIFwKKyAgICAgICAgICAgIiglIiBQWV9GT1JNQVRfU0laRV9UICJkKVxuIiwgXAogICAgICAgICAgICBkYXRhLCBzdGF0ZS0+ZGF0YV9zdGFja19iYXNlLCBzaXplKSk7IFwKLSAgICBpZiAoc3RhdGUtPmRhdGFfc3RhY2tfc2l6ZSA8IHN0YXRlLT5kYXRhX3N0YWNrX2Jhc2Urc2l6ZSkgeyBcCisgICAgaWYgKHNpemUgPiBzdGF0ZS0+ZGF0YV9zdGFja19zaXplIC0gc3RhdGUtPmRhdGFfc3RhY2tfYmFzZSkgeyBcCiAgICAgICAgIGludCBqID0gZGF0YV9zdGFja19ncm93KHN0YXRlLCBzaXplKTsgXAogICAgICAgICBpZiAoaiA8IDApIHJldHVybiBqOyBcCiAgICAgICAgIGlmIChjdHhfcG9zICE9IC0xKSBcCkBAIC03MTgsNyArNzIxLDggQEAKIAogI2RlZmluZSBEQVRBX1NUQUNLX1BPUChzdGF0ZSwgZGF0YSwgc2l6ZSwgZGlzY2FyZCkgXAogZG8geyBcCi0gICAgVFJBQ0UoKCJjb3B5IGRhdGEgdG8gJXAgZnJvbSAlZCAoJWQpXG4iLCBcCisgICAgVFJBQ0UoKCJjb3B5IGRhdGEgdG8gJXAgZnJvbSAlIiBQWV9GT1JNQVRfU0laRV9UICJkICIgXAorICAgICAgICAgICAiKCUiIFBZX0ZPUk1BVF9TSVpFX1QgImQpXG4iLCBcCiAgICAgICAgICAgIGRhdGEsIHN0YXRlLT5kYXRhX3N0YWNrX2Jhc2Utc2l6ZSwgc2l6ZSkpOyBcCiAgICAgbWVtY3B5KGRhdGEsIHN0YXRlLT5kYXRhX3N0YWNrK3N0YXRlLT5kYXRhX3N0YWNrX2Jhc2Utc2l6ZSwgc2l6ZSk7IFwKICAgICBpZiAoZGlzY2FyZCkgXApAQCAtNzI3LDcgKzczMSw4IEBACiAKICNkZWZpbmUgREFUQV9TVEFDS19QT1BfRElTQ0FSRChzdGF0ZSwgc2l6ZSkgXAogZG8geyBcCi0gICAgVFJBQ0UoKCJkaXNjYXJkIGRhdGEgZnJvbSAlZCAoJWQpXG4iLCBcCisgICAgVFJBQ0UoKCJkaXNjYXJkIGRhdGEgZnJvbSAlIiBQWV9GT1JNQVRfU0laRV9UICJkICIgXAorICAgICAgICAgICAiKCUiIFBZX0ZPUk1BVF9TSVpFX1QgImQpXG4iLCBcCiAgICAgICAgICAgIHN0YXRlLT5kYXRhX3N0YWNrX2Jhc2Utc2l6ZSwgc2l6ZSkpOyBcCiAgICAgc3RhdGUtPmRhdGFfc3RhY2tfYmFzZSAtPSBzaXplOyBcCiB9IHdoaWxlKDApCkBAIC04MzEsOCArODM2LDkgQEAKICAgICAgICAgLyogb3B0aW1pemF0aW9uIGluZm8gYmxvY2sgKi8KICAgICAgICAgLyogPElORk8+IDwxPXNraXA+IDwyPWZsYWdzPiA8Mz1taW4+IC4uLiAqLwogICAgICAgICBpZiAoY3R4LT5wYXR0ZXJuWzNdICYmIChlbmQgLSBjdHgtPnB0cikgPCBjdHgtPnBhdHRlcm5bM10pIHsKLSAgICAgICAgICAgIFRSQUNFKCgicmVqZWN0IChnb3QgJWQgY2hhcnMsIG5lZWQgJWQpXG4iLAotICAgICAgICAgICAgICAgICAgIChlbmQgLSBjdHgtPnB0ciksIGN0eC0+cGF0dGVyblszXSkpOworICAgICAgICAgICAgVFJBQ0UoKCJyZWplY3QgKGdvdCAlIiBQWV9GT1JNQVRfU0laRV9UICJkIGNoYXJzLCAiCisgICAgICAgICAgICAgICAgICAgIm5lZWQgJSIgUFlfRk9STUFUX1NJWkVfVCAiZClcbiIsCisgICAgICAgICAgICAgICAgICAgKGVuZCAtIGN0eC0+cHRyKSwgKFB5X3NzaXplX3QpIGN0eC0+cGF0dGVyblszXSkpOwogICAgICAgICAgICAgUkVUVVJOX0ZBSUxVUkU7CiAgICAgICAgIH0KICAgICAgICAgY3R4LT5wYXR0ZXJuICs9IGN0eC0+cGF0dGVyblsxXSArIDE7CkBAIC0xMDI4LDcgKzEwMzQsNyBAQAogICAgICAgICAgICAgVFJBQ0UoKCJ8JXB8JXB8UkVQRUFUX09ORSAlZCAlZFxuIiwgY3R4LT5wYXR0ZXJuLCBjdHgtPnB0ciwKICAgICAgICAgICAgICAgICAgICBjdHgtPnBhdHRlcm5bMV0sIGN0eC0+cGF0dGVyblsyXSkpOwogCi0gICAgICAgICAgICBpZiAoY3R4LT5wdHIgKyBjdHgtPnBhdHRlcm5bMV0gPiBlbmQpCisgICAgICAgICAgICBpZiAoKFB5X3NzaXplX3QpIGN0eC0+cGF0dGVyblsxXSA+IGVuZCAtIGN0eC0+cHRyKQogICAgICAgICAgICAgICAgIFJFVFVSTl9GQUlMVVJFOyAvKiBjYW5ub3QgbWF0Y2ggKi8KIAogICAgICAgICAgICAgc3RhdGUtPnB0ciA9IGN0eC0+cHRyOwpAQCAtMTExMSw3ICsxMTE3LDcgQEAKICAgICAgICAgICAgIFRSQUNFKCgifCVwfCVwfE1JTl9SRVBFQVRfT05FICVkICVkXG4iLCBjdHgtPnBhdHRlcm4sIGN0eC0+cHRyLAogICAgICAgICAgICAgICAgICAgIGN0eC0+cGF0dGVyblsxXSwgY3R4LT5wYXR0ZXJuWzJdKSk7CiAKLSAgICAgICAgICAgIGlmIChjdHgtPnB0ciArIGN0eC0+cGF0dGVyblsxXSA+IGVuZCkKKyAgICAgICAgICAgIGlmICgoUHlfc3NpemVfdCkgY3R4LT5wYXR0ZXJuWzFdID4gZW5kIC0gY3R4LT5wdHIpCiAgICAgICAgICAgICAgICAgUkVUVVJOX0ZBSUxVUkU7IC8qIGNhbm5vdCBtYXRjaCAqLwogCiAgICAgICAgICAgICBzdGF0ZS0+cHRyID0gY3R4LT5wdHI7CkBAIC0xMTM5LDcgKzExNDUsNyBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvKiBnZW5lcmFsIGNhc2UgKi8KICAgICAgICAgICAgICAgICBMQVNUTUFSS19TQVZFKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChQeV9zc2l6ZV90KWN0eC0+cGF0dGVyblsyXSA9PSA2NTUzNQorICAgICAgICAgICAgICAgIHdoaWxlICgoUHlfc3NpemVfdCljdHgtPnBhdHRlcm5bMl0gPT0gU1JFX01BWFJFUEVBVAogICAgICAgICAgICAgICAgICAgICAgICB8fCBjdHgtPmNvdW50IDw9IChQeV9zc2l6ZV90KWN0eC0+cGF0dGVyblsyXSkgewogICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+cHRyID0gY3R4LT5wdHI7CiAgICAgICAgICAgICAgICAgICAgIERPX0pVTVAoSlVNUF9NSU5fUkVQRUFUX09ORSxqdW1wX21pbl9yZXBlYXRfb25lLApAQCAtMTIwNywxMCArMTIxMywxMCBAQAogCiAgICAgICAgICAgICBjdHgtPmNvdW50ID0gY3R4LT51LnJlcC0+Y291bnQrMTsKIAotICAgICAgICAgICAgVFJBQ0UoKCJ8JXB8JXB8TUFYX1VOVElMICVkXG4iLCBjdHgtPnBhdHRlcm4sCisgICAgICAgICAgICBUUkFDRSgoInwlcHwlcHxNQVhfVU5USUwgJSIgUFlfRk9STUFUX1NJWkVfVCAiZFxuIiwgY3R4LT5wYXR0ZXJuLAogICAgICAgICAgICAgICAgICAgIGN0eC0+cHRyLCBjdHgtPmNvdW50KSk7CiAKLSAgICAgICAgICAgIGlmIChjdHgtPmNvdW50IDwgY3R4LT51LnJlcC0+cGF0dGVyblsxXSkgeworICAgICAgICAgICAgaWYgKGN0eC0+Y291bnQgPCAoUHlfc3NpemVfdCkgY3R4LT51LnJlcC0+cGF0dGVyblsxXSkgewogICAgICAgICAgICAgICAgIC8qIG5vdCBlbm91Z2ggbWF0Y2hlcyAqLwogICAgICAgICAgICAgICAgIGN0eC0+dS5yZXAtPmNvdW50ID0gY3R4LT5jb3VudDsKICAgICAgICAgICAgICAgICBET19KVU1QKEpVTVBfTUFYX1VOVElMXzEsIGp1bXBfbWF4X3VudGlsXzEsCkBAIC0xMjI0LDggKzEyMzAsOCBAQAogICAgICAgICAgICAgICAgIFJFVFVSTl9GQUlMVVJFOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoKGN0eC0+Y291bnQgPCBjdHgtPnUucmVwLT5wYXR0ZXJuWzJdIHx8Ci0gICAgICAgICAgICAgICAgY3R4LT51LnJlcC0+cGF0dGVyblsyXSA9PSA2NTUzNSkgJiYKKyAgICAgICAgICAgIGlmICgoY3R4LT5jb3VudCA8IChQeV9zc2l6ZV90KSBjdHgtPnUucmVwLT5wYXR0ZXJuWzJdIHx8CisgICAgICAgICAgICAgICAgY3R4LT51LnJlcC0+cGF0dGVyblsyXSA9PSBTUkVfTUFYUkVQRUFUKSAmJgogICAgICAgICAgICAgICAgIHN0YXRlLT5wdHIgIT0gY3R4LT51LnJlcC0+bGFzdF9wdHIpIHsKICAgICAgICAgICAgICAgICAvKiB3ZSBtYXkgaGF2ZSBlbm91Z2ggbWF0Y2hlcywgYnV0IGlmIHdlIGNhbgogICAgICAgICAgICAgICAgICAgIG1hdGNoIGFub3RoZXIgaXRlbSwgZG8gc28gKi8KQEAgLTEyNzAsMTAgKzEyNzYsMTAgQEAKIAogICAgICAgICAgICAgY3R4LT5jb3VudCA9IGN0eC0+dS5yZXAtPmNvdW50KzE7CiAKLSAgICAgICAgICAgIFRSQUNFKCgifCVwfCVwfE1JTl9VTlRJTCAlZCAlcFxuIiwgY3R4LT5wYXR0ZXJuLAorICAgICAgICAgICAgVFJBQ0UoKCJ8JXB8JXB8TUlOX1VOVElMICUiIFBZX0ZPUk1BVF9TSVpFX1QgImQgJXBcbiIsIGN0eC0+cGF0dGVybiwKICAgICAgICAgICAgICAgICAgICBjdHgtPnB0ciwgY3R4LT5jb3VudCwgY3R4LT51LnJlcC0+cGF0dGVybikpOwogCi0gICAgICAgICAgICBpZiAoY3R4LT5jb3VudCA8IGN0eC0+dS5yZXAtPnBhdHRlcm5bMV0pIHsKKyAgICAgICAgICAgIGlmIChjdHgtPmNvdW50IDwgKFB5X3NzaXplX3QpIGN0eC0+dS5yZXAtPnBhdHRlcm5bMV0pIHsKICAgICAgICAgICAgICAgICAvKiBub3QgZW5vdWdoIG1hdGNoZXMgKi8KICAgICAgICAgICAgICAgICBjdHgtPnUucmVwLT5jb3VudCA9IGN0eC0+Y291bnQ7CiAgICAgICAgICAgICAgICAgRE9fSlVNUChKVU1QX01JTl9VTlRJTF8xLCBqdW1wX21pbl91bnRpbF8xLApAQCAtMTMwMiwxMyArMTMwOCwxOCBAQAogCiAgICAgICAgICAgICBMQVNUTUFSS19SRVNUT1JFKCk7CiAKLSAgICAgICAgICAgIGlmIChjdHgtPmNvdW50ID49IGN0eC0+dS5yZXAtPnBhdHRlcm5bMl0KLSAgICAgICAgICAgICAgICAmJiBjdHgtPnUucmVwLT5wYXR0ZXJuWzJdICE9IDY1NTM1KQorICAgICAgICAgICAgaWYgKChjdHgtPmNvdW50ID49IChQeV9zc2l6ZV90KSBjdHgtPnUucmVwLT5wYXR0ZXJuWzJdCisgICAgICAgICAgICAgICAgJiYgY3R4LT51LnJlcC0+cGF0dGVyblsyXSAhPSBTUkVfTUFYUkVQRUFUKSB8fAorICAgICAgICAgICAgICAgIHN0YXRlLT5wdHIgPT0gY3R4LT51LnJlcC0+bGFzdF9wdHIpCiAgICAgICAgICAgICAgICAgUkVUVVJOX0ZBSUxVUkU7CiAKICAgICAgICAgICAgIGN0eC0+dS5yZXAtPmNvdW50ID0gY3R4LT5jb3VudDsKKyAgICAgICAgICAgIC8qIHplcm8td2lkdGggbWF0Y2ggcHJvdGVjdGlvbiAqLworICAgICAgICAgICAgREFUQV9QVVNIKCZjdHgtPnUucmVwLT5sYXN0X3B0cik7CisgICAgICAgICAgICBjdHgtPnUucmVwLT5sYXN0X3B0ciA9IHN0YXRlLT5wdHI7CiAgICAgICAgICAgICBET19KVU1QKEpVTVBfTUlOX1VOVElMXzMsanVtcF9taW5fdW50aWxfMywKICAgICAgICAgICAgICAgICAgICAgY3R4LT51LnJlcC0+cGF0dGVybiszKTsKKyAgICAgICAgICAgIERBVEFfUE9QKCZjdHgtPnUucmVwLT5sYXN0X3B0cik7CiAgICAgICAgICAgICBpZiAocmV0KSB7CiAgICAgICAgICAgICAgICAgUkVUVVJOX09OX0VSUk9SKHJldCk7CiAgICAgICAgICAgICAgICAgUkVUVVJOX1NVQ0NFU1M7CkBAIC0xNDc4LDcgKzE0ODksOCBAQAogICAgICAgICAgICAgVFJBQ0UoKCJ8JXB8JXB8SlVNUF9BU1NFUlRfTk9UXG4iLCBjdHgtPnBhdHRlcm4sIGN0eC0+cHRyKSk7CiAgICAgICAgICAgICBnb3RvIGp1bXBfYXNzZXJ0X25vdDsKICAgICAgICAgY2FzZSBKVU1QX05PTkU6Ci0gICAgICAgICAgICBUUkFDRSgoInwlcHwlcHxSRVRVUk4gJWRcbiIsIGN0eC0+cGF0dGVybiwgY3R4LT5wdHIsIHJldCkpOworICAgICAgICAgICAgVFJBQ0UoKCJ8JXB8JXB8UkVUVVJOICUiIFBZX0ZPUk1BVF9TSVpFX1QgImRcbiIsIGN0eC0+cGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICBjdHgtPnB0ciwgcmV0KSk7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKQEAgLTE1MjcsNyArMTUzOSw4IEBACiAgICAgICAgIHBhdHRlcm4gKz0gMSArIHBhdHRlcm5bMV07CiAgICAgfQogCi0gICAgVFJBQ0UoKCJwcmVmaXggPSAlcCAlZCAlZFxuIiwgcHJlZml4LCBwcmVmaXhfbGVuLCBwcmVmaXhfc2tpcCkpOworICAgIFRSQUNFKCgicHJlZml4ID0gJXAgJSIgUFlfRk9STUFUX1NJWkVfVCAiZCAlIiBQWV9GT1JNQVRfU0laRV9UICJkXG4iLAorICAgICAgICAgICBwcmVmaXgsIHByZWZpeF9sZW4sIHByZWZpeF9za2lwKSk7CiAgICAgVFJBQ0UoKCJjaGFyc2V0ID0gJXBcbiIsIGNoYXJzZXQpKTsKIAogI2lmIGRlZmluZWQoVVNFX0ZBU1RfU0VBUkNIKQpAQCAtMTYzNiw3ICsxNjQ5LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzcmVfY29kZXNpemUoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0gICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzaXplb2YoU1JFX0NPREUpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNpemVfdChzaXplb2YoU1JFX0NPREUpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTE4NjIsMTggKzE4NzUsNjIgQEAKICAgICBQeU9iamVjdF9ERUwoc2VsZik7CiB9CiAKK3N0YXRpYyBpbnQKK2NoZWNrX2FyZ3Nfc2l6ZShjb25zdCBjaGFyICpuYW1lLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3LCBpbnQgbikKK3sKKyAgICBQeV9zc2l6ZV90IG0gPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpICsgKGt3ID8gUHlEaWN0X1NpemUoa3cpIDogMCk7CisgICAgaWYgKG0gPD0gbikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgIiVzKCkgdGFrZXMgYXQgbW9zdCAlZCBwb3NpdGlvbmFsIGFyZ3VtZW50cyAoJXpkIGdpdmVuKSIsCisgICAgICAgICAgICAgICAgIG5hbWUsIG4sIG0pOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgUHlPYmplY3QqCitmaXhfc3RyaW5nX3BhcmFtKFB5T2JqZWN0ICpzdHJpbmcsIFB5T2JqZWN0ICpzdHJpbmcyLCBjb25zdCBjaGFyICpvbGRuYW1lKQoreworICAgIGlmIChzdHJpbmcyICE9IE5VTEwpIHsKKyAgICAgICAgY2hhciBidWZbMTAwXTsKKyAgICAgICAgaWYgKHN0cmluZyAhPSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJBcmd1bWVudCBnaXZlbiBieSBuYW1lICgnJXMnKSBhbmQgcG9zaXRpb24gKDEpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvbGRuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHNwcmludGYoYnVmLCAiVGhlICclcycga2V5d29yZCBwYXJhbWV0ZXIgbmFtZSBpcyBkZXByZWNhdGVkLiAgIgorICAgICAgICAgICAgICAgICAgICAgIlVzZSAnc3RyaW5nJyBpbnN0ZWFkLiIsIG9sZG5hbWUpOworICAgICAgICBpZiAoUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIGJ1ZikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBzdHJpbmcyOworICAgIH0KKyAgICBpZiAoc3RyaW5nID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJSZXF1aXJlZCBhcmd1bWVudCAnc3RyaW5nJyAocG9zIDEpIG5vdCBmb3VuZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHN0cmluZzsKK30KKwogc3RhdGljIFB5T2JqZWN0KgogcGF0dGVybl9tYXRjaChQYXR0ZXJuT2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3KQogewogICAgIFNSRV9TVEFURSBzdGF0ZTsKICAgICBpbnQgc3RhdHVzOwogCi0gICAgUHlPYmplY3QqIHN0cmluZzsKKyAgICBQeU9iamVjdCAqc3RyaW5nID0gTlVMTCwgKnN0cmluZzIgPSBOVUxMOwogICAgIFB5X3NzaXplX3Qgc3RhcnQgPSAwOwogICAgIFB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7Ci0gICAgc3RhdGljIGNoYXIqIGt3bGlzdFtdID0geyAicGF0dGVybiIsICJwb3MiLCAiZW5kcG9zIiwgTlVMTCB9OwotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiT3xubjptYXRjaCIsIGt3bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyaW5nLCAmc3RhcnQsICZlbmQpKQorICAgIHN0YXRpYyBjaGFyKiBrd2xpc3RbXSA9IHsgInN0cmluZyIsICJwb3MiLCAiZW5kcG9zIiwgInBhdHRlcm4iLCBOVUxMIH07CisgICAgaWYgKCFjaGVja19hcmdzX3NpemUoIm1hdGNoIiwgYXJncywga3csIDMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAifE9ubk86bWF0Y2giLCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmluZywgJnN0YXJ0LCAmZW5kLCAmc3RyaW5nMikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgc3RyaW5nID0gZml4X3N0cmluZ19wYXJhbShzdHJpbmcsIHN0cmluZzIsICJwYXR0ZXJuIik7CisgICAgaWYgKCFzdHJpbmcpCiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgc3RyaW5nID0gc3RhdGVfaW5pdCgmc3RhdGUsIHNlbGYsIHN0cmluZywgc3RhcnQsIGVuZCk7CkBAIC0xOTA3LDEyICsxOTY0LDE5IEBACiAgICAgU1JFX1NUQVRFIHN0YXRlOwogICAgIGludCBzdGF0dXM7CiAKLSAgICBQeU9iamVjdCogc3RyaW5nOworICAgIFB5T2JqZWN0ICpzdHJpbmcgPSBOVUxMLCAqc3RyaW5nMiA9IE5VTEw7CiAgICAgUHlfc3NpemVfdCBzdGFydCA9IDA7CiAgICAgUHlfc3NpemVfdCBlbmQgPSBQWV9TU0laRV9UX01BWDsKLSAgICBzdGF0aWMgY2hhcioga3dsaXN0W10gPSB7ICJwYXR0ZXJuIiwgInBvcyIsICJlbmRwb3MiLCBOVUxMIH07Ci0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJPfG5uOnNlYXJjaCIsIGt3bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyaW5nLCAmc3RhcnQsICZlbmQpKQorICAgIHN0YXRpYyBjaGFyKiBrd2xpc3RbXSA9IHsgInN0cmluZyIsICJwb3MiLCAiZW5kcG9zIiwgInBhdHRlcm4iLCBOVUxMIH07CisgICAgaWYgKCFjaGVja19hcmdzX3NpemUoInNlYXJjaCIsIGFyZ3MsIGt3LCAzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxPbm5POnNlYXJjaCIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyaW5nLCAmc3RhcnQsICZlbmQsICZzdHJpbmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBzdHJpbmcgPSBmaXhfc3RyaW5nX3BhcmFtKHN0cmluZywgc3RyaW5nMiwgInBhdHRlcm4iKTsKKyAgICBpZiAoIXN0cmluZykKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBzdHJpbmcgPSBzdGF0ZV9pbml0KCZzdGF0ZSwgc2VsZiwgc3RyaW5nLCBzdGFydCwgZW5kKTsKQEAgLTIwNDIsMTIgKzIxMDYsMTkgQEAKICAgICBpbnQgc3RhdHVzOwogICAgIFB5X3NzaXplX3QgaSwgYiwgZTsKIAotICAgIFB5T2JqZWN0KiBzdHJpbmc7CisgICAgUHlPYmplY3QgKnN0cmluZyA9IE5VTEwsICpzdHJpbmcyID0gTlVMTDsKICAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMDsKICAgICBQeV9zc2l6ZV90IGVuZCA9IFBZX1NTSVpFX1RfTUFYOwotICAgIHN0YXRpYyBjaGFyKiBrd2xpc3RbXSA9IHsgInNvdXJjZSIsICJwb3MiLCAiZW5kcG9zIiwgTlVMTCB9OwotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiT3xubjpmaW5kYWxsIiwga3dsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJpbmcsICZzdGFydCwgJmVuZCkpCisgICAgc3RhdGljIGNoYXIqIGt3bGlzdFtdID0geyAic3RyaW5nIiwgInBvcyIsICJlbmRwb3MiLCAic291cmNlIiwgTlVMTCB9OworICAgIGlmICghY2hlY2tfYXJnc19zaXplKCJmaW5kYWxsIiwgYXJncywga3csIDMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAifE9ubk86ZmluZGFsbCIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyaW5nLCAmc3RhcnQsICZlbmQsICZzdHJpbmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBzdHJpbmcgPSBmaXhfc3RyaW5nX3BhcmFtKHN0cmluZywgc3RyaW5nMiwgInNvdXJjZSIpOworICAgIGlmICghc3RyaW5nKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHN0cmluZyA9IHN0YXRlX2luaXQoJnN0YXRlLCBzZWxmLCBzdHJpbmcsIHN0YXJ0LCBlbmQpOwpAQCAtMjE3MiwxMSArMjI0MywxOCBAQAogICAgIFB5X3NzaXplX3QgaTsKICAgICB2b2lkKiBsYXN0OwogCi0gICAgUHlPYmplY3QqIHN0cmluZzsKKyAgICBQeU9iamVjdCAqc3RyaW5nID0gTlVMTCwgKnN0cmluZzIgPSBOVUxMOwogICAgIFB5X3NzaXplX3QgbWF4c3BsaXQgPSAwOwotICAgIHN0YXRpYyBjaGFyKiBrd2xpc3RbXSA9IHsgInNvdXJjZSIsICJtYXhzcGxpdCIsIE5VTEwgfTsKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk98bjpzcGxpdCIsIGt3bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyaW5nLCAmbWF4c3BsaXQpKQorICAgIHN0YXRpYyBjaGFyKiBrd2xpc3RbXSA9IHsgInN0cmluZyIsICJtYXhzcGxpdCIsICJzb3VyY2UiLCBOVUxMIH07CisgICAgaWYgKCFjaGVja19hcmdzX3NpemUoInNwbGl0IiwgYXJncywga3csIDIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAifE9uTzpzcGxpdCIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyaW5nLCAmbWF4c3BsaXQsICZzdHJpbmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBzdHJpbmcgPSBmaXhfc3RyaW5nX3BhcmFtKHN0cmluZywgc3RyaW5nMiwgInNvdXJjZSIpOworICAgIGlmICghc3RyaW5nKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHN0cmluZyA9IHN0YXRlX2luaXQoJnN0YXRlLCBzZWxmLCBzdHJpbmcsIDAsIFBZX1NTSVpFX1RfTUFYKTsKQEAgLTI0NDgsNyArMjUyNiw3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKHN1Ym4pCi0gICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJOaSIsIGl0ZW0sIG4pOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTm4iLCBpdGVtLCBuKTsKIAogICAgIHJldHVybiBpdGVtOwogCkBAIC0yNTQ2LDcgKzI2MjQsNyBAQAogUHlEb2NfU1RSVkFSKHBhdHRlcm5fc2VhcmNoX2RvYywKICJzZWFyY2goc3RyaW5nWywgcG9zWywgZW5kcG9zXV0pIC0tPiBtYXRjaCBvYmplY3Qgb3IgTm9uZS5cblwKICAgICBTY2FuIHRocm91Z2ggc3RyaW5nIGxvb2tpbmcgZm9yIGEgbWF0Y2gsIGFuZCByZXR1cm4gYSBjb3JyZXNwb25kaW5nXG5cCi0gICAgTWF0Y2hPYmplY3QgaW5zdGFuY2UuIFJldHVybiBOb25lIGlmIG5vIHBvc2l0aW9uIGluIHRoZSBzdHJpbmcgbWF0Y2hlcy4iKTsKKyAgICBtYXRjaCBvYmplY3QgaW5zdGFuY2UuIFJldHVybiBOb25lIGlmIG5vIHBvc2l0aW9uIGluIHRoZSBzdHJpbmcgbWF0Y2hlcy4iKTsKIAogUHlEb2NfU1RSVkFSKHBhdHRlcm5fc3BsaXRfZG9jLAogInNwbGl0KHN0cmluZ1ssIG1heHNwbGl0ID0gMF0pICAtLT4gbGlzdC5cblwKQEAgLTI2NzUsNiArMjc1MywxMyBAQAogICAgICAgICBQeU9iamVjdCAqbyA9IFB5TGlzdF9HRVRfSVRFTShjb2RlLCBpKTsKICAgICAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZSA9IFB5SW50X0NoZWNrKG8pID8gKHVuc2lnbmVkIGxvbmcpUHlJbnRfQXNMb25nKG8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQeUxvbmdfQXNVbnNpZ25lZExvbmcobyk7CisgICAgICAgIGlmICh2YWx1ZSA9PSAodW5zaWduZWQgbG9uZyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19PdmVyZmxvd0Vycm9yKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVndWxhciBleHByZXNzaW9uIGNvZGUgc2l6ZSBsaW1pdCBleGNlZWRlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgICAgc2VsZi0+Y29kZVtpXSA9IChTUkVfQ09ERSkgdmFsdWU7CiAgICAgICAgIGlmICgodW5zaWduZWQgbG9uZykgc2VsZi0+Y29kZVtpXSAhPSB2YWx1ZSkgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCkBAIC0yNzMzLDggKzI4MTgsNyBAQAogICAgIFxfX19fX19fX19cX19fX18vICAgICAgICAvCiAgICAgICAgICAgICAgICBcX19fX19fX19fX19fLwogCi0gICBJdCBhbHNvIGhlbHBzIHRoYXQgU1JFX0NPREUgaXMgYWx3YXlzIGFuIHVuc2lnbmVkIHR5cGUsIGVpdGhlciAyIGJ5dGVzIG9yIDQKLSAgIGJ5dGVzIHdpZGUgKHRoZSBsYXR0ZXIgaWYgUHl0aG9uIGlzIGNvbXBpbGVkIGZvciAid2lkZSIgdW5pY29kZSBzdXBwb3J0KS4KKyAgIEl0IGFsc28gaGVscHMgdGhhdCBTUkVfQ09ERSBpcyBhbHdheXMgYW4gdW5zaWduZWQgdHlwZS4KICovCiAKIC8qIERlZmluaW5nIHRoaXMgb25lIGVuYWJsZXMgdHJhY2luZyBvZiB0aGUgdmFsaWRhdG9yICovCkBAIC0yNzcyLDcgKzI4NTYsNyBAQAogICAgICAgICBza2lwID0gKmNvZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIFZUUkFDRSgoIiVsdSAoc2tpcCB0byAlcClcbiIsICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXNraXAsIGNvZGUrc2tpcCkpOyAgICAgICAgXAotICAgICAgICBpZiAoY29kZStza2lwLWFkaiA8IGNvZGUgfHwgY29kZStza2lwLWFkaiA+IGVuZClcCisgICAgICAgIGlmIChza2lwLWFkaiA+IGVuZC1jb2RlKSAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgIEZBSUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBjb2RlKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSB3aGlsZSAoMCkKQEAgLTI4MDUsNyArMjg4OSw3IEBACiAKICAgICAgICAgY2FzZSBTUkVfT1BfQ0hBUlNFVDoKICAgICAgICAgICAgIG9mZnNldCA9IDMyL3NpemVvZihTUkVfQ09ERSk7IC8qIDMyLWJ5dGUgYml0bWFwICovCi0gICAgICAgICAgICBpZiAoY29kZStvZmZzZXQgPCBjb2RlIHx8IGNvZGUrb2Zmc2V0ID4gZW5kKQorICAgICAgICAgICAgaWYgKG9mZnNldCA+IGVuZC1jb2RlKQogICAgICAgICAgICAgICAgIEZBSUw7CiAgICAgICAgICAgICBjb2RlICs9IG9mZnNldDsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjgxMyw3ICsyODk3LDcgQEAKICAgICAgICAgY2FzZSBTUkVfT1BfQklHQ0hBUlNFVDoKICAgICAgICAgICAgIEdFVF9BUkc7IC8qIE51bWJlciBvZiBibG9ja3MgKi8KICAgICAgICAgICAgIG9mZnNldCA9IDI1Ni9zaXplb2YoU1JFX0NPREUpOyAvKiAyNTYtYnl0ZSB0YWJsZSAqLwotICAgICAgICAgICAgaWYgKGNvZGUrb2Zmc2V0IDwgY29kZSB8fCBjb2RlK29mZnNldCA+IGVuZCkKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPiBlbmQtY29kZSkKICAgICAgICAgICAgICAgICBGQUlMOwogICAgICAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgZWFjaCBieXRlIHBvaW50cyB0byBhIHZhbGlkIGJsb2NrICovCiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKQEAgLTI4MjIsNyArMjkwNiw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjb2RlICs9IG9mZnNldDsKICAgICAgICAgICAgIG9mZnNldCA9IGFyZyAqIDMyL3NpemVvZihTUkVfQ09ERSk7IC8qIDMyLWJ5dGUgYml0bWFwIHRpbWVzIGFyZyAqLwotICAgICAgICAgICAgaWYgKGNvZGUrb2Zmc2V0IDwgY29kZSB8fCBjb2RlK29mZnNldCA+IGVuZCkKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPiBlbmQtY29kZSkKICAgICAgICAgICAgICAgICBGQUlMOwogICAgICAgICAgICAgY29kZSArPSBvZmZzZXQ7CiAgICAgICAgICAgICBicmVhazsKQEAgLTI5NzMsMTEgKzMwNTcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgR0VUX0FSRzsgcHJlZml4X2xlbiA9IGFyZzsKICAgICAgICAgICAgICAgICAgICAgR0VUX0FSRzsgLyogcHJlZml4IHNraXAgKi8KICAgICAgICAgICAgICAgICAgICAgLyogSGVyZSBjb21lcyB0aGUgcHJlZml4IHN0cmluZyAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoY29kZStwcmVmaXhfbGVuIDwgY29kZSB8fCBjb2RlK3ByZWZpeF9sZW4gPiBuZXdjb2RlKQorICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4X2xlbiA+IG5ld2NvZGUtY29kZSkKICAgICAgICAgICAgICAgICAgICAgICAgIEZBSUw7CiAgICAgICAgICAgICAgICAgICAgIGNvZGUgKz0gcHJlZml4X2xlbjsKICAgICAgICAgICAgICAgICAgICAgLyogQW5kIGhlcmUgY29tZXMgdGhlIG92ZXJsYXAgdGFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUrcHJlZml4X2xlbiA8IGNvZGUgfHwgY29kZStwcmVmaXhfbGVuID4gbmV3Y29kZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeF9sZW4gPiBuZXdjb2RlLWNvZGUpCiAgICAgICAgICAgICAgICAgICAgICAgICBGQUlMOwogICAgICAgICAgICAgICAgICAgICAvKiBFYWNoIG92ZXJsYXAgdmFsdWUgc2hvdWxkIGJlIDwgcHJlZml4X2xlbiAqLwogICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJlZml4X2xlbjsgaSsrKSB7CkBAIC0zMDM1LDEwICszMTE5LDggQEAKICAgICAgICAgICAgICAgICBHRVRfQVJHOyBtYXggPSBhcmc7CiAgICAgICAgICAgICAgICAgaWYgKG1pbiA+IG1heCkKICAgICAgICAgICAgICAgICAgICAgRkFJTDsKLSNpZmRlZiBQeV9VTklDT0RFX1dJREUKLSAgICAgICAgICAgICAgICBpZiAobWF4ID4gNjU1MzUpCisgICAgICAgICAgICAgICAgaWYgKG1heCA+IFNSRV9NQVhSRVBFQVQpCiAgICAgICAgICAgICAgICAgICAgIEZBSUw7Ci0jZW5kaWYKICAgICAgICAgICAgICAgICBpZiAoIV92YWxpZGF0ZV9pbm5lcihjb2RlLCBjb2RlK3NraXAtNCwgZ3JvdXBzKSkKICAgICAgICAgICAgICAgICAgICAgRkFJTDsKICAgICAgICAgICAgICAgICBjb2RlICs9IHNraXAtNDsKQEAgLTMwNTYsMTAgKzMxMzgsOCBAQAogICAgICAgICAgICAgICAgIEdFVF9BUkc7IG1heCA9IGFyZzsKICAgICAgICAgICAgICAgICBpZiAobWluID4gbWF4KQogICAgICAgICAgICAgICAgICAgICBGQUlMOwotI2lmZGVmIFB5X1VOSUNPREVfV0lERQotICAgICAgICAgICAgICAgIGlmIChtYXggPiA2NTUzNSkKKyAgICAgICAgICAgICAgICBpZiAobWF4ID4gU1JFX01BWFJFUEVBVCkKICAgICAgICAgICAgICAgICAgICAgRkFJTDsKLSNlbmRpZgogICAgICAgICAgICAgICAgIGlmICghX3ZhbGlkYXRlX2lubmVyKGNvZGUsIGNvZGUrc2tpcC0zLCBncm91cHMpKQogICAgICAgICAgICAgICAgICAgICBGQUlMOwogICAgICAgICAgICAgICAgIGNvZGUgKz0gc2tpcC0zOwpAQCAtMzExMCw3ICszMTkwLDcgQEAKICAgICAgICAgICAgICAgIHRvIGFsbG93IGFyYml0cmFyeSBqdW1wcyBhbnl3aGVyZSBpbiB0aGUgY29kZTsgc28gd2UganVzdCBsb29rCiAgICAgICAgICAgICAgICBmb3IgYSBKVU1QIG9wY29kZSBwcmVjZWRpbmcgb3VyIHNraXAgdGFyZ2V0LgogICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChza2lwID49IDMgJiYgY29kZStza2lwLTMgPj0gY29kZSAmJgorICAgICAgICAgICAgaWYgKHNraXAgPj0gMyAmJiBza2lwLTMgPCBlbmQtY29kZSAmJgogICAgICAgICAgICAgICAgIGNvZGVbc2tpcC0zXSA9PSBTUkVfT1BfSlVNUCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBWVFJBQ0UoKCJib3RoIHRoZW4gYW5kIGVsc2UgcGFydHMgcHJlc2VudFxuIikpOwpAQCAtMzM4Niw3ICszNDY2LDcgQEAKICAgICB9CiAKICAgICAvKiBtYXJrIGlzIC0xIGlmIGdyb3VwIGlzIHVuZGVmaW5lZCAqLwotICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc2VsZi0+bWFya1tpbmRleCoyXSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHNlbGYtPm1hcmtbaW5kZXgqMl0pOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCkBAIC0zNDA5LDcgKzM0ODksNyBAQAogICAgIH0KIAogICAgIC8qIG1hcmsgaXMgLTEgaWYgZ3JvdXAgaXMgdW5kZWZpbmVkICovCi0gICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzZWxmLT5tYXJrW2luZGV4KjIrMV0pOworICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChzZWxmLT5tYXJrW2luZGV4KjIrMV0pOwogfQogCiBMT0NBTChQeU9iamVjdCopCkBAIC0zNTQyLDE0ICszNjIyLDU0IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBtYXRjaF9tZXRob2RzW10gPSB7Ci0gICAgeyJncm91cCIsIChQeUNGdW5jdGlvbikgbWF0Y2hfZ3JvdXAsIE1FVEhfVkFSQVJHU30sCi0gICAgeyJzdGFydCIsIChQeUNGdW5jdGlvbikgbWF0Y2hfc3RhcnQsIE1FVEhfVkFSQVJHU30sCi0gICAgeyJlbmQiLCAoUHlDRnVuY3Rpb24pIG1hdGNoX2VuZCwgTUVUSF9WQVJBUkdTfSwKLSAgICB7InNwYW4iLCAoUHlDRnVuY3Rpb24pIG1hdGNoX3NwYW4sIE1FVEhfVkFSQVJHU30sCi0gICAgeyJncm91cHMiLCAoUHlDRnVuY3Rpb24pIG1hdGNoX2dyb3VwcywgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFN9LAotICAgIHsiZ3JvdXBkaWN0IiwgKFB5Q0Z1bmN0aW9uKSBtYXRjaF9ncm91cGRpY3QsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTfSwKLSAgICB7ImV4cGFuZCIsIChQeUNGdW5jdGlvbikgbWF0Y2hfZXhwYW5kLCBNRVRIX099LAorUHlEb2NfU1RSVkFSKG1hdGNoX2RvYywKKyJUaGUgcmVzdWx0IG9mIHJlLm1hdGNoKCkgYW5kIHJlLnNlYXJjaCgpLlxuXAorTWF0Y2ggb2JqZWN0cyBhbHdheXMgaGF2ZSBhIGJvb2xlYW4gdmFsdWUgb2YgVHJ1ZS4iKTsKKworUHlEb2NfU1RSVkFSKG1hdGNoX2dyb3VwX2RvYywKKyJncm91cChbZ3JvdXAxLCAuLi5dKSAtPiBzdHIgb3IgdHVwbGUuXG5cCisgICAgUmV0dXJuIHN1Ymdyb3VwKHMpIG9mIHRoZSBtYXRjaCBieSBpbmRpY2VzIG9yIG5hbWVzLlxuXAorICAgIEZvciAwIHJldHVybnMgdGhlIGVudGlyZSBtYXRjaC4iKTsKKworUHlEb2NfU1RSVkFSKG1hdGNoX3N0YXJ0X2RvYywKKyJzdGFydChbZ3JvdXA9MF0pIC0+IGludC5cblwKKyAgICBSZXR1cm4gaW5kZXggb2YgdGhlIHN0YXJ0IG9mIHRoZSBzdWJzdHJpbmcgbWF0Y2hlZCBieSBncm91cC4iKTsKKworUHlEb2NfU1RSVkFSKG1hdGNoX2VuZF9kb2MsCisiZW5kKFtncm91cD0wXSkgLT4gaW50LlxuXAorICAgIFJldHVybiBpbmRleCBvZiB0aGUgZW5kIG9mIHRoZSBzdWJzdHJpbmcgbWF0Y2hlZCBieSBncm91cC4iKTsKKworUHlEb2NfU1RSVkFSKG1hdGNoX3NwYW5fZG9jLAorInNwYW4oW2dyb3VwXSkgLT4gdHVwbGUuXG5cCisgICAgRm9yIE1hdGNoT2JqZWN0IG0sIHJldHVybiB0aGUgMi10dXBsZSAobS5zdGFydChncm91cCksIG0uZW5kKGdyb3VwKSkuIik7CisKK1B5RG9jX1NUUlZBUihtYXRjaF9ncm91cHNfZG9jLAorImdyb3VwcyhbZGVmYXVsdD1Ob25lXSkgLT4gdHVwbGUuXG5cCisgICAgUmV0dXJuIGEgdHVwbGUgY29udGFpbmluZyBhbGwgdGhlIHN1Ymdyb3VwcyBvZiB0aGUgbWF0Y2gsIGZyb20gMS5cblwKKyAgICBUaGUgZGVmYXVsdCBhcmd1bWVudCBpcyB1c2VkIGZvciBncm91cHNcblwKKyAgICB0aGF0IGRpZCBub3QgcGFydGljaXBhdGUgaW4gdGhlIG1hdGNoIik7CisKK1B5RG9jX1NUUlZBUihtYXRjaF9ncm91cGRpY3RfZG9jLAorImdyb3VwZGljdChbZGVmYXVsdD1Ob25lXSkgLT4gZGljdC5cblwKKyAgICBSZXR1cm4gYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgYWxsIHRoZSBuYW1lZCBzdWJncm91cHMgb2YgdGhlIG1hdGNoLFxuXAorICAgIGtleWVkIGJ5IHRoZSBzdWJncm91cCBuYW1lLiBUaGUgZGVmYXVsdCBhcmd1bWVudCBpcyB1c2VkIGZvciBncm91cHNcblwKKyAgICB0aGF0IGRpZCBub3QgcGFydGljaXBhdGUgaW4gdGhlIG1hdGNoIik7CisKK1B5RG9jX1NUUlZBUihtYXRjaF9leHBhbmRfZG9jLAorImV4cGFuZCh0ZW1wbGF0ZSkgLT4gc3RyLlxuXAorICAgIFJldHVybiB0aGUgc3RyaW5nIG9idGFpbmVkIGJ5IGRvaW5nIGJhY2tzbGFzaCBzdWJzdGl0dXRpb25cblwKKyAgICBvbiB0aGUgc3RyaW5nIHRlbXBsYXRlLCBhcyBkb25lIGJ5IHRoZSBzdWIoKSBtZXRob2QuIik7CisKK3N0YXRpYyBQeU1ldGhvZERlZiBtYXRjaF9tZXRob2RzW10gPSB7CisgICAgeyJncm91cCIsIChQeUNGdW5jdGlvbikgbWF0Y2hfZ3JvdXAsIE1FVEhfVkFSQVJHUywgbWF0Y2hfZ3JvdXBfZG9jfSwKKyAgICB7InN0YXJ0IiwgKFB5Q0Z1bmN0aW9uKSBtYXRjaF9zdGFydCwgTUVUSF9WQVJBUkdTLCBtYXRjaF9zdGFydF9kb2N9LAorICAgIHsiZW5kIiwgKFB5Q0Z1bmN0aW9uKSBtYXRjaF9lbmQsIE1FVEhfVkFSQVJHUywgbWF0Y2hfZW5kX2RvY30sCisgICAgeyJzcGFuIiwgKFB5Q0Z1bmN0aW9uKSBtYXRjaF9zcGFuLCBNRVRIX1ZBUkFSR1MsIG1hdGNoX3NwYW5fZG9jfSwKKyAgICB7Imdyb3VwcyIsIChQeUNGdW5jdGlvbikgbWF0Y2hfZ3JvdXBzLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywKKyAgICAgICAgbWF0Y2hfZ3JvdXBzX2RvY30sCisgICAgeyJncm91cGRpY3QiLCAoUHlDRnVuY3Rpb24pIG1hdGNoX2dyb3VwZGljdCwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCisgICAgICAgIG1hdGNoX2dyb3VwZGljdF9kb2N9LAorICAgIHsiZXhwYW5kIiwgKFB5Q0Z1bmN0aW9uKSBtYXRjaF9leHBhbmQsIE1FVEhfTywgbWF0Y2hfZXhwYW5kX2RvY30sCiAgICAgeyJfX2NvcHlfXyIsIChQeUNGdW5jdGlvbikgbWF0Y2hfY29weSwgTUVUSF9OT0FSR1N9LAogICAgIHsiX19kZWVwY29weV9fIiwgKFB5Q0Z1bmN0aW9uKSBtYXRjaF9kZWVwY29weSwgTUVUSF9PfSwKICAgICB7TlVMTCwgTlVMTH0KQEAgLTM1NTksNyArMzY3OSw3IEBACiBtYXRjaF9sYXN0aW5kZXhfZ2V0KE1hdGNoT2JqZWN0ICpzZWxmKQogewogICAgIGlmIChzZWxmLT5sYXN0aW5kZXggPj0gMCkKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHNlbGYtPmxhc3RpbmRleCk7CisgICAgICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChzZWxmLT5sYXN0aW5kZXgpOwogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICByZXR1cm4gUHlfTm9uZTsKIH0KQEAgLTM2MjksNyArMzc0OSw3IEBACiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwogICAgIFB5X1RQRkxBR1NfREVGQVVMVCwKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgbWF0Y2hfZG9jLCAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwpAQCAtMzg5NSw2ICs0MDE1LDEyIEBACiAgICAgICAgIFB5X0RFQ1JFRih4KTsKICAgICB9CiAKKyAgICB4ID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoU1JFX01BWFJFUEVBVCk7CisgICAgaWYgKHgpIHsKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BWFJFUEVBVCIsIHgpOworICAgICAgICBQeV9ERUNSRUYoeCk7CisgICAgfQorCiAgICAgeCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoY29weXJpZ2h0KTsKICAgICBpZiAoeCkgewogICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiY29weXJpZ2h0IiwgeCk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zc2wuYyBiL01vZHVsZXMvX3NzbC5jCmluZGV4IGJlY2Y2YTUuLjc1MmIwMzMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NzbC5jCisrKyBiL01vZHVsZXMvX3NzbC5jCkBAIC0xOCw2ICsxOCw4IEBACiAKICNpZmRlZiBXSVRIX1RIUkVBRAogI2luY2x1ZGUgInB5dGhyZWFkLmgiCisKKwogI2RlZmluZSBQeVNTTF9CRUdJTl9BTExPV19USFJFQURTIHsgXAogICAgICAgICAgICAgUHlUaHJlYWRTdGF0ZSAqX3NhdmUgPSBOVUxMOyAgXAogICAgICAgICAgICAgaWYgKF9zc2xfbG9ja3NfY291bnQ+MCkge19zYXZlID0gUHlFdmFsX1NhdmVUaHJlYWQoKTt9CkBAIC0yNzEsNiArMjczLDcgQEAKICAgICBjaGFyICplcnJzdHIgPSBOVUxMOwogICAgIGludCByZXQ7CiAgICAgaW50IHZlcmlmaWNhdGlvbl9tb2RlOworICAgIGxvbmcgb3B0aW9uczsKIAogICAgIHNlbGYgPSBQeU9iamVjdF9OZXcoUHlTU0xPYmplY3QsICZQeVNTTF9UeXBlKTsgLyogQ3JlYXRlIG5ldyBvYmplY3QgKi8KICAgICBpZiAoc2VsZiA9PSBOVUxMKQpAQCAtMjgxLDYgKzI4NCw3IEBACiAgICAgc2VsZi0+c3NsID0gTlVMTDsKICAgICBzZWxmLT5jdHggPSBOVUxMOwogICAgIHNlbGYtPlNvY2tldCA9IE5VTEw7CisgICAgc2VsZi0+c2h1dGRvd25fc2Vlbl96ZXJvID0gMDsKIAogICAgIC8qIE1ha2Ugc3VyZSB0aGUgU1NMIGVycm9yIHN0YXRlIGlzIGluaXRpYWxpemVkICovCiAgICAgKHZvaWQpIEVSUl9nZXRfc3RhdGUoKTsKQEAgLTM2OSw3ICszNzMsMTAgQEAKICAgICB9CiAKICAgICAvKiBzc2wgY29tcGF0aWJpbGl0eSAqLwotICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoc2VsZi0+Y3R4LCBTU0xfT1BfQUxMKTsKKyAgICBvcHRpb25zID0gU1NMX09QX0FMTCAmIH5TU0xfT1BfRE9OVF9JTlNFUlRfRU1QVFlfRlJBR01FTlRTOworICAgIGlmIChwcm90b192ZXJzaW9uICE9IFBZX1NTTF9WRVJTSU9OX1NTTDIpCisgICAgICAgIG9wdGlvbnMgfD0gU1NMX09QX05PX1NTTHYyOworICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoc2VsZi0+Y3R4LCBvcHRpb25zKTsKIAogICAgIHZlcmlmaWNhdGlvbl9tb2RlID0gU1NMX1ZFUklGWV9OT05FOwogICAgIGlmIChjZXJ0cmVxID09IFBZX1NTTF9DRVJUX09QVElPTkFMKQpAQCAtNjQzLDE1ICs2NTAsMjAgQEAKICAgICAgICAgICAgIGdvdG8gZmFpbDE7CiAgICAgfQogICAgIC8qIG5vdywgdGhlcmUncyB0eXBpY2FsbHkgYSBkYW5nbGluZyBSRE4gKi8KLSAgICBpZiAoKHJkbiAhPSBOVUxMKSAmJiAoUHlMaXN0X1NpemUocmRuKSA+IDApKSB7Ci0gICAgICAgIHJkbnQgPSBQeUxpc3RfQXNUdXBsZShyZG4pOwotICAgICAgICBQeV9ERUNSRUYocmRuKTsKLSAgICAgICAgaWYgKHJkbnQgPT0gTlVMTCkKLSAgICAgICAgICAgIGdvdG8gZmFpbDA7Ci0gICAgICAgIHJldGNvZGUgPSBQeUxpc3RfQXBwZW5kKGRuLCByZG50KTsKLSAgICAgICAgUHlfREVDUkVGKHJkbnQpOwotICAgICAgICBpZiAocmV0Y29kZSA8IDApCi0gICAgICAgICAgICBnb3RvIGZhaWwwOworICAgIGlmIChyZG4gIT0gTlVMTCkgeworICAgICAgICBpZiAoUHlMaXN0X0dFVF9TSVpFKHJkbikgPiAwKSB7CisgICAgICAgICAgICByZG50ID0gUHlMaXN0X0FzVHVwbGUocmRuKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZG4pOworICAgICAgICAgICAgaWYgKHJkbnQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWwwOworICAgICAgICAgICAgcmV0Y29kZSA9IFB5TGlzdF9BcHBlbmQoZG4sIHJkbnQpOworICAgICAgICAgICAgUHlfREVDUkVGKHJkbnQpOworICAgICAgICAgICAgaWYgKHJldGNvZGUgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmRuKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qIGNvbnZlcnQgbGlzdCB0byB0dXBsZSAqLwpAQCAtNjgwLDcgKzY5Miw3IEBACiAKICAgICBpbnQgaSwgajsKICAgICBQeU9iamVjdCAqcGVlcl9hbHRfbmFtZXMgPSBQeV9Ob25lOwotICAgIFB5T2JqZWN0ICp2LCAqdDsKKyAgICBQeU9iamVjdCAqdiA9IE5VTEwsICp0OwogICAgIFg1MDlfRVhURU5TSU9OICpleHQgPSBOVUxMOwogICAgIEdFTkVSQUxfTkFNRVMgKm5hbWVzID0gTlVMTDsKICAgICBHRU5FUkFMX05BTUUgKm5hbWU7CkBAIC03MzIsMTMgKzc0NCwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHQtPnZhbHVlLT5sZW5ndGgpKTsKIAogICAgICAgICBmb3IoaiA9IDA7IGogPCBza19HRU5FUkFMX05BTUVfbnVtKG5hbWVzKTsgaisrKSB7Ci0KICAgICAgICAgICAgIC8qIGdldCBhIHJlbmRlcmluZyBvZiBlYWNoIG5hbWUgaW4gdGhlIHNldCBvZiBuYW1lcyAqLworICAgICAgICAgICAgaW50IGdudHlwZTsKKyAgICAgICAgICAgIEFTTjFfU1RSSU5HICphcyA9IE5VTEw7CiAKICAgICAgICAgICAgIG5hbWUgPSBza19HRU5FUkFMX05BTUVfdmFsdWUobmFtZXMsIGopOwotICAgICAgICAgICAgaWYgKG5hbWUtPnR5cGUgPT0gR0VOX0RJUk5BTUUpIHsKLQotICAgICAgICAgICAgICAgIC8qIHdlIHNwZWNpYWwtY2FzZSBEaXJOYW1lIGFzIGEgdHVwbGUgb2YgdHVwbGVzIG9mIGF0dHJpYnV0ZXMgKi8KKyAgICAgICAgICAgIGdudHlwZSA9IG5hbWUtPnR5cGU7CisgICAgICAgICAgICBzd2l0Y2ggKGdudHlwZSkgeworICAgICAgICAgICAgY2FzZSBHRU5fRElSTkFNRToKKyAgICAgICAgICAgICAgICAvKiB3ZSBzcGVjaWFsLWNhc2UgRGlyTmFtZSBhcyBhIHR1cGxlIG9mCisgICAgICAgICAgICAgICAgICAgdHVwbGVzIG9mIGF0dHJpYnV0ZXMgKi8KIAogICAgICAgICAgICAgICAgIHQgPSBQeVR1cGxlX05ldygyKTsKICAgICAgICAgICAgICAgICBpZiAodCA9PSBOVUxMKSB7CkBAIC03NTgsMTEgKzc3Myw2MSBAQAogICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0odCwgMSwgdik7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjYXNlIEdFTl9FTUFJTDoKKyAgICAgICAgICAgIGNhc2UgR0VOX0ROUzoKKyAgICAgICAgICAgIGNhc2UgR0VOX1VSSToKKyAgICAgICAgICAgICAgICAvKiBHRU5FUkFMX05BTUVfcHJpbnQoKSBkb2Vzbid0IGhhbmRsZSBOVUxMIGJ5dGVzIGluIEFTTjFfc3RyaW5nCisgICAgICAgICAgICAgICAgICAgY29ycmVjdGx5LCBDVkUtMjAxMy00MjM4ICovCisgICAgICAgICAgICAgICAgdCA9IFB5VHVwbGVfTmV3KDIpOworICAgICAgICAgICAgICAgIGlmICh0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGdudHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgR0VOX0VNQUlMOgorICAgICAgICAgICAgICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiZW1haWwiKTsKKyAgICAgICAgICAgICAgICAgICAgYXMgPSBuYW1lLT5kLnJmYzgyMk5hbWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR0VOX0ROUzoKKyAgICAgICAgICAgICAgICAgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIkROUyIpOworICAgICAgICAgICAgICAgICAgICBhcyA9IG5hbWUtPmQuZE5TTmFtZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHRU5fVVJJOgorICAgICAgICAgICAgICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiVVJJIik7CisgICAgICAgICAgICAgICAgICAgIGFzID0gbmFtZS0+ZC51bmlmb3JtUmVzb3VyY2VJZGVudGlmaWVyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh0LCAwLCB2KTsKKyAgICAgICAgICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilBU04xX1NUUklOR19kYXRhKGFzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOMV9TVFJJTkdfbGVuZ3RoKGFzKSk7CisgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh0LCAxLCB2KTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAvKiBmb3IgZXZlcnl0aGluZyBlbHNlLCB3ZSB1c2UgdGhlIE9wZW5TU0wgcHJpbnQgZm9ybSAqLwotCisgICAgICAgICAgICAgICAgc3dpdGNoIChnbnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgZm9yIG5ldyBnZW5lcmFsIG5hbWUgdHlwZSAqLworICAgICAgICAgICAgICAgICAgICBjYXNlIEdFTl9PVEhFUk5BTUU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgR0VOX1g0MDA6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgR0VOX0VESVBBUlRZOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEdFTl9JUEFERDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBHRU5fUklEOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUHlFcnJfV2FybihQeUV4Y19SdW50aW1lV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIGdlbmVyYWwgbmFtZSB0eXBlIikgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgKHZvaWQpIEJJT19yZXNldChiaW9idWYpOwogICAgICAgICAgICAgICAgIEdFTkVSQUxfTkFNRV9wcmludChiaW9idWYsIG5hbWUpOwogICAgICAgICAgICAgICAgIGxlbiA9IEJJT19nZXRzKGJpb2J1ZiwgYnVmLCBzaXplb2YoYnVmKS0xKTsKQEAgLTc4OCw2ICs4NTMsNyBAQAogICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0odCwgMSwgdik7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8qIGFuZCBhZGQgdGhhdCByZW5kZXJpbmcgdG8gdGhlIGxpc3QgKi8KQEAgLTk5OSw2ICsxMDY1LDcgQEAKICAgICBpbnQgbGVuOwogICAgIGludCB2ZXJpZmljYXRpb247CiAgICAgUHlPYmplY3QgKmJpbmFyeV9tb2RlID0gUHlfTm9uZTsKKyAgICBpbnQgYjsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifE86cGVlcl9jZXJ0aWZpY2F0ZSIsICZiaW5hcnlfbW9kZSkpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTAwNiw3ICsxMDczLDEwIEBACiAgICAgaWYgKCFzZWxmLT5wZWVyX2NlcnQpCiAgICAgICAgIFB5X1JFVFVSTl9OT05FOwogCi0gICAgaWYgKFB5T2JqZWN0X0lzVHJ1ZShiaW5hcnlfbW9kZSkpIHsKKyAgICBiID0gUHlPYmplY3RfSXNUcnVlKGJpbmFyeV9tb2RlKTsKKyAgICBpZiAoYiA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChiKSB7CiAgICAgICAgIC8qIHJldHVybiBjZXJ0IGluIERFUi1lbmNvZGVkIGZvcm1hdCAqLwogCiAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ5dGVzX2J1ZiA9IE5VTEw7CkBAIC0xMTgyLDYgKzEyNTIsMTIgQEAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqOndyaXRlIiwgJmJ1ZikpCiAgICAgICAgIHJldHVybiBOVUxMOwogCisgICAgaWYgKGJ1Zi5sZW4gPiBJTlRfTUFYKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgInN0cmluZyBsb25nZXIgdGhhbiAlZCBieXRlcyIsIElOVF9NQVgpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKwogICAgIC8qIGp1c3QgaW4gY2FzZSB0aGUgYmxvY2tpbmcgc3RhdGUgb2YgdGhlIHNvY2tldCBoYXMgYmVlbiBjaGFuZ2VkICovCiAgICAgbm9uYmxvY2tpbmcgPSAoc2VsZi0+U29ja2V0LT5zb2NrX3RpbWVvdXQgPj0gMC4wKTsKICAgICBCSU9fc2V0X25iaW8oU1NMX2dldF9yYmlvKHNlbGYtPnNzbCksIG5vbmJsb2NraW5nKTsKQEAgLTEyMDMsNyArMTI3OSw3IEBACiAgICAgfQogICAgIGRvIHsKICAgICAgICAgUHlTU0xfQkVHSU5fQUxMT1dfVEhSRUFEUwotICAgICAgICBsZW4gPSBTU0xfd3JpdGUoc2VsZi0+c3NsLCBidWYuYnVmLCBidWYubGVuKTsKKyAgICAgICAgbGVuID0gU1NMX3dyaXRlKHNlbGYtPnNzbCwgYnVmLmJ1ZiwgKGludClidWYubGVuKTsKICAgICAgICAgZXJyID0gU1NMX2dldF9lcnJvcihzZWxmLT5zc2wsIGxlbik7CiAgICAgICAgIFB5U1NMX0VORF9BTExPV19USFJFQURTCiAgICAgICAgIGlmIChQeUVycl9DaGVja1NpZ25hbHMoKSkgewpAQCAtMTM4NSw3ICsxNDYxLDcgQEAKICAgICAgICAgICogT3RoZXJ3aXNlIE9wZW5TU0wgbWlnaHQgcmVhZCBpbiB0b28gbXVjaCBkYXRhLAogICAgICAgICAgKiBlYXRpbmcgY2xlYXIgdGV4dCBkYXRhIHRoYXQgaGFwcGVucyB0byBiZQogICAgICAgICAgKiB0cmFuc21pdHRlZCBhZnRlciB0aGUgU1NMIHNodXRkb3duLgotICAgICAgICAgKiBTaG91bGQgYmUgc2FmZSB0byBjYWxsIHJlcGVhdGVkbHkgZXZlcnl0aW1lIHRoaXMKKyAgICAgICAgICogU2hvdWxkIGJlIHNhZmUgdG8gY2FsbCByZXBlYXRlZGx5IGV2ZXJ5IHRpbWUgdGhpcwogICAgICAgICAgKiBmdW5jdGlvbiBpcyB1c2VkIGFuZCB0aGUgc2h1dGRvd25fc2Vlbl96ZXJvICE9IDAKICAgICAgICAgICogY29uZGl0aW9uIGlzIG1ldC4KICAgICAgICAgICovCkBAIC0xNTQ5LDkgKzE2MjUsMTAgQEAKIFxuXAogUXVlcmllcyB0aGUgZW50cm9weSBnYXRoZXIgZGFlbW9uIChFR0QpIG9uIHRoZSBzb2NrZXQgbmFtZWQgYnkgJ3BhdGgnLlxuXAogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgcmVhZC4gIFJhaXNlcyBTU0xFcnJvciBpZiBjb25uZWN0aW9uIHRvIEVHRFxuXAotZmFpbHMgb3IgaWYgaXQgZG9lcyBwcm92aWRlIGVub3VnaCBkYXRhIHRvIHNlZWQgUFJORy4iKTsKK2ZhaWxzIG9yIGlmIGl0IGRvZXMgbm90IHByb3ZpZGUgZW5vdWdoIGRhdGEgdG8gc2VlZCBQUk5HLiIpOwogCi0jZW5kaWYKKyNlbmRpZiAvKiBIQVZFX09QRU5TU0xfUkFORCAqLworCiAKIC8qIExpc3Qgb2YgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IHRoaXMgbW9kdWxlLiAqLwogCkBAIC0xNTc5LDkgKzE2NTYsMjEgQEAKIAogc3RhdGljIFB5VGhyZWFkX3R5cGVfbG9jayAqX3NzbF9sb2NrcyA9IE5VTEw7CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIF9zc2xfdGhyZWFkX2lkX2Z1bmN0aW9uICh2b2lkKSB7CisjaWYgT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDEwMDAwMDAwCisvKiB1c2UgbmV3IENSWVBUT19USFJFQURJRCBBUEkuICovCitzdGF0aWMgdm9pZAorX3NzbF90aHJlYWRpZF9jYWxsYmFjayhDUllQVE9fVEhSRUFESUQgKmlkKQoreworICAgIENSWVBUT19USFJFQURJRF9zZXRfbnVtZXJpYyhpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpKTsKK30KKyNlbHNlCisvKiBkZXByZWNhdGVkIENSWVBUT19zZXRfaWRfY2FsbGJhY2soKSBBUEkuICovCitzdGF0aWMgdW5zaWduZWQgbG9uZworX3NzbF90aHJlYWRfaWRfZnVuY3Rpb24gKHZvaWQpIHsKICAgICByZXR1cm4gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOwogfQorI2VuZGlmCiAKIHN0YXRpYyB2b2lkIF9zc2xfdGhyZWFkX2xvY2tpbmdfZnVuY3Rpb24gKGludCBtb2RlLCBpbnQgbiwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpIHsKICAgICAvKiB0aGlzIGZ1bmN0aW9uIGlzIG5lZWRlZCB0byBwZXJmb3JtIGxvY2tpbmcgb24gc2hhcmVkIGRhdGEKQEAgLTE2MzIsNyArMTcyMSwxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIENSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayhfc3NsX3RocmVhZF9sb2NraW5nX2Z1bmN0aW9uKTsKKyNpZiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MTAwMDAwMDAKKyAgICAgICAgQ1JZUFRPX1RIUkVBRElEX3NldF9jYWxsYmFjayhfc3NsX3RocmVhZGlkX2NhbGxiYWNrKTsKKyNlbHNlCiAgICAgICAgIENSWVBUT19zZXRfaWRfY2FsbGJhY2soX3NzbF90aHJlYWRfaWRfZnVuY3Rpb24pOworI2VuZGlmCiAgICAgfQogICAgIHJldHVybiAxOwogfQpAQCAtMTc0Nyw0ICsxODQwLDUgQEAKICAgICByID0gUHlTdHJpbmdfRnJvbVN0cmluZyhTU0xlYXlfdmVyc2lvbihTU0xFQVlfVkVSU0lPTikpOwogICAgIGlmIChyID09IE5VTEwgfHwgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJPUEVOU1NMX1ZFUlNJT04iLCByKSkKICAgICAgICAgcmV0dXJuOworCiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zdHJ1Y3QuYyBiL01vZHVsZXMvX3N0cnVjdC5jCmluZGV4IGMxNThlYmEuLmYwMzU4NDcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3N0cnVjdC5jCisrKyBiL01vZHVsZXMvX3N0cnVjdC5jCkBAIC0xMzcxLDEzICsxMzcxLDI4IEBACiAKICAgICBhc3NlcnQoUHlTdHJ1Y3RfQ2hlY2soc2VsZikpOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIlM6U3RydWN0Iiwga3dsaXN0LAorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPOlN0cnVjdCIsIGt3bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb19mb3JtYXQpKQogICAgICAgICByZXR1cm4gLTE7CiAKLSAgICBQeV9JTkNSRUYob19mb3JtYXQpOwotICAgIFB5X0NMRUFSKHNvc2VsZi0+c19mb3JtYXQpOwotICAgIHNvc2VsZi0+c19mb3JtYXQgPSBvX2Zvcm1hdDsKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2sob19mb3JtYXQpKSB7CisgICAgICAgIFB5X0lOQ1JFRihvX2Zvcm1hdCk7CisgICAgICAgIFB5X0NMRUFSKHNvc2VsZi0+c19mb3JtYXQpOworICAgICAgICBzb3NlbGYtPnNfZm9ybWF0ID0gb19mb3JtYXQ7CisgICAgfQorICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhvX2Zvcm1hdCkpIHsKKyAgICAgICAgUHlPYmplY3QgKnN0ciA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcob19mb3JtYXQsICJhc2NpaSIsIE5VTEwpOworICAgICAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5X0NMRUFSKHNvc2VsZi0+c19mb3JtYXQpOworICAgICAgICBzb3NlbGYtPnNfZm9ybWF0ID0gc3RyOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJTdHJ1Y3QoKSBhcmd1bWVudCAxIG11c3QgYmUgc3RyaW5nLCBub3QgJXMiLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShvX2Zvcm1hdCktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCiAgICAgcmV0ID0gcHJlcGFyZV9zKHNvc2VsZik7CiAgICAgcmV0dXJuIHJldDsKQEAgLTE0MzksNiArMTQ1NCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc191bnBhY2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICppbnB1dHN0cikKIHsKKyAgICBQeV9idWZmZXIgYnVmOwogICAgIGNoYXIgKnN0YXJ0OwogICAgIFB5X3NzaXplX3QgbGVuOwogICAgIFB5T2JqZWN0ICphcmdzPU5VTEwsICpyZXN1bHQ7CkBAIC0xNDU0LDEyICsxNDcwLDE3IEBACiAgICAgYXJncyA9IFB5VHVwbGVfUGFjaygxLCBpbnB1dHN0cik7CiAgICAgaWYgKGFyZ3MgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzp1bnBhY2siLCAmc3RhcnQsICZsZW4pKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyo6dW5wYWNrIiwgJmJ1ZikpCiAgICAgICAgIGdvdG8gZmFpbDsKLSAgICBpZiAoc29zZWxmLT5zX3NpemUgIT0gbGVuKQorICAgIHN0YXJ0ID0gYnVmLmJ1ZjsKKyAgICBsZW4gPSBidWYubGVuOworICAgIGlmIChzb3NlbGYtPnNfc2l6ZSAhPSBsZW4pIHsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmKTsKICAgICAgICAgZ290byBmYWlsOworICAgIH0KICAgICByZXN1bHQgPSBzX3VucGFja19pbnRlcm5hbChzb3NlbGYsIHN0YXJ0KTsKICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmKTsKICAgICByZXR1cm4gcmVzdWx0OwogCiBmYWlsOgpAQCAtMTQ4MiwyNCArMTUwMywyNCBAQAogc191bnBhY2tfZnJvbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewogICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiYnVmZmVyIiwgIm9mZnNldCIsIDB9OwotI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0gICAgc3RhdGljIGNoYXIgKmZtdCA9ICJ6I3xpOnVucGFja19mcm9tIjsKLSNlbHNlCi0gICAgc3RhdGljIGNoYXIgKmZtdCA9ICJ6I3xuOnVucGFja19mcm9tIjsKLSNlbmRpZgorICAgIHN0YXRpYyBjaGFyICpmbXQgPSAieip8bjp1bnBhY2tfZnJvbSI7CisgICAgUHlfYnVmZmVyIGJ1ZjsKICAgICBQeV9zc2l6ZV90IGJ1ZmZlcl9sZW4gPSAwLCBvZmZzZXQgPSAwOwogICAgIGNoYXIgKmJ1ZmZlciA9IE5VTEw7CiAgICAgUHlTdHJ1Y3RPYmplY3QgKnNvc2VsZiA9IChQeVN0cnVjdE9iamVjdCAqKXNlbGY7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKICAgICBhc3NlcnQoUHlTdHJ1Y3RfQ2hlY2soc2VsZikpOwogICAgIGFzc2VydChzb3NlbGYtPnNfY29kZXMgIT0gTlVMTCk7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCBmbXQsIGt3bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyLCAmYnVmZmVyX2xlbiwgJm9mZnNldCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZiwgJm9mZnNldCkpCiAgICAgICAgIHJldHVybiBOVUxMOwotCisgICAgYnVmZmVyID0gYnVmLmJ1ZjsKKyAgICBidWZmZXJfbGVuID0gYnVmLmxlbjsKICAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFN0cnVjdEVycm9yLAogICAgICAgICAgICAgInVucGFja19mcm9tIHJlcXVpcmVzIGEgYnVmZmVyIGFyZ3VtZW50Iik7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmJ1Zik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtMTUxMCw5ICsxNTMxLDEyIEBACiAgICAgICAgIFB5RXJyX0Zvcm1hdChTdHJ1Y3RFcnJvciwKICAgICAgICAgICAgICJ1bnBhY2tfZnJvbSByZXF1aXJlcyBhIGJ1ZmZlciBvZiBhdCBsZWFzdCAlemQgYnl0ZXMiLAogICAgICAgICAgICAgc29zZWxmLT5zX3NpemUpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWYpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgcmV0dXJuIHNfdW5wYWNrX2ludGVybmFsKHNvc2VsZiwgYnVmZmVyICsgb2Zmc2V0KTsKKyAgICByZXN1bHQgPSBzX3VucGFja19pbnRlcm5hbChzb3NlbGYsIGJ1ZmZlciArIG9mZnNldCk7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAKQEAgLTE2MDMsNyArMTYyNyw3IEBACiAgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgIT0gc29zZWxmLT5zX2xlbikKICAgICB7CiAgICAgICAgIFB5RXJyX0Zvcm1hdChTdHJ1Y3RFcnJvciwKLSAgICAgICAgICAgICJwYWNrIHJlcXVpcmVzIGV4YWN0bHkgJXpkIGFyZ3VtZW50cyIsIHNvc2VsZi0+c19sZW4pOworICAgICAgICAgICAgInBhY2sgZXhwZWN0ZWQgJXpkIGl0ZW1zIGZvciBwYWNraW5nIChnb3QgJXpkKSIsIHNvc2VsZi0+c19sZW4sIFB5VHVwbGVfR0VUX1NJWkUoYXJncykpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTE2NDIsOSArMTY2NiwxOSBAQAogICAgIGFzc2VydChzb3NlbGYtPnNfY29kZXMgIT0gTlVMTCk7CiAgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgIT0gKHNvc2VsZi0+c19sZW4gKyAyKSkKICAgICB7Ci0gICAgICAgIFB5RXJyX0Zvcm1hdChTdHJ1Y3RFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJwYWNrX2ludG8gcmVxdWlyZXMgZXhhY3RseSAlemQgYXJndW1lbnRzIiwKLSAgICAgICAgICAgICAgICAgICAgIChzb3NlbGYtPnNfbGVuICsgMikpOworICAgICAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAwKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicGFja19pbnRvIGV4cGVjdGVkIGJ1ZmZlciBhcmd1bWVudCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMSkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFN0cnVjdEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInBhY2tfaW50byBleHBlY3RlZCBvZmZzZXQgYXJndW1lbnQiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChTdHJ1Y3RFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrX2ludG8gZXhwZWN0ZWQgJXpkIGl0ZW1zIGZvciBwYWNraW5nIChnb3QgJXpkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBzb3NlbGYtPnNfbGVuLCAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSAtIDIpKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTE2OTMsNiArMTcyNywxOCBAQAogICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChzZWxmLT5zX3NpemUpOwogfQogCitQeURvY19TVFJWQVIoc19zaXplb2ZfX2RvY19fLAorIlMuX19zaXplb2ZfXygpIC0+IHNpemUgb2YgUyBpbiBtZW1vcnksIGluIGJ5dGVzIik7CisKK3N0YXRpYyBQeU9iamVjdCAqCitzX3NpemVvZihQeVN0cnVjdE9iamVjdCAqc2VsZiwgdm9pZCAqdW51c2VkKQoreworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKworICAgIHNpemUgPSBzaXplb2YoUHlTdHJ1Y3RPYmplY3QpICsgc2l6ZW9mKGZvcm1hdGNvZGUpICogKHNlbGYtPnNfbGVuICsgMSk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChzaXplKTsKK30KKwogLyogTGlzdCBvZiBmdW5jdGlvbnMgKi8KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBzX21ldGhvZHNbXSA9IHsKQEAgLTE3MDEsNiArMTc0Nyw3IEBACiAgICAgeyJ1bnBhY2siLCAgICAgICAgICBzX3VucGFjaywgICAgICAgTUVUSF9PLCBzX3VucGFja19fZG9jX199LAogICAgIHsidW5wYWNrX2Zyb20iLCAgICAgKFB5Q0Z1bmN0aW9uKXNfdW5wYWNrX2Zyb20sIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAogICAgICAgICAgICAgICAgICAgICBzX3VucGFja19mcm9tX19kb2NfX30sCisgICAgeyJfX3NpemVvZl9fIiwgICAgICAoUHlDRnVuY3Rpb24pc19zaXplb2YsIE1FVEhfTk9BUkdTLCBzX3NpemVvZl9fZG9jX199LAogICAgIHtOVUxMLCAgICAgICBOVUxMfSAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fdGVzdGNhcGltb2R1bGUuYyBiL01vZHVsZXMvX3Rlc3RjYXBpbW9kdWxlLmMKaW5kZXggZjE5NjhlMi4uZTQ4ODVkMSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fdGVzdGNhcGltb2R1bGUuYworKysgYi9Nb2R1bGVzL190ZXN0Y2FwaW1vZHVsZS5jCkBAIC0xMTE4LDcgKzExMTgsNyBAQAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidSN8cyIsICZ1bmljb2RlLCAmbGVuZ3RoLCAmZXJyb3JzKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBkZWNpbWFsX2xlbmd0aCA9IGxlbmd0aCAqIDc7IC8qIGxlbignJiM4MzY0OycpICovCisgICAgZGVjaW1hbF9sZW5ndGggPSBsZW5ndGggKiAxMDsgLyogbGVuKCcmIzExMTQxMTE7JykgKi8KICAgICBkZWNpbWFsID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBkZWNpbWFsX2xlbmd0aCk7CiAgICAgaWYgKGRlY2ltYWwgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xNjg3LDYgKzE2ODcsOTYgQEAKICAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAorI2lmZGVmIFdJVEhfVEhSRUFECit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlUaHJlYWRfdHlwZV9sb2NrIHN0YXJ0X2V2ZW50OworICAgIFB5VGhyZWFkX3R5cGVfbG9jayBleGl0X2V2ZW50OworICAgIFB5T2JqZWN0ICpjYWxsYmFjazsKK30gdGVzdF9jX3RocmVhZF90OworCitzdGF0aWMgdm9pZAordGVtcG9yYXJ5X2NfdGhyZWFkKHZvaWQgKmRhdGEpCit7CisgICAgdGVzdF9jX3RocmVhZF90ICp0ZXN0X2NfdGhyZWFkID0gZGF0YTsKKyAgICBQeUdJTFN0YXRlX1NUQVRFIHN0YXRlOworICAgIFB5T2JqZWN0ICpyZXM7CisKKyAgICBQeVRocmVhZF9yZWxlYXNlX2xvY2sodGVzdF9jX3RocmVhZC0+c3RhcnRfZXZlbnQpOworCisgICAgLyogQWxsb2NhdGUgYSBQeXRob24gdGhyZWFkIHN0YXRlIGZvciB0aGlzIHRocmVhZCAqLworICAgIHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKKworICAgIHJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbih0ZXN0X2NfdGhyZWFkLT5jYWxsYmFjaywgIiIsIE5VTEwpOworICAgIFB5X0NMRUFSKHRlc3RfY190aHJlYWQtPmNhbGxiYWNrKTsKKworICAgIGlmIChyZXMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9QcmludCgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgfQorCisgICAgLyogRGVzdHJveSB0aGUgUHl0aG9uIHRocmVhZCBzdGF0ZSBmb3IgdGhpcyB0aHJlYWQgKi8KKyAgICBQeUdJTFN0YXRlX1JlbGVhc2Uoc3RhdGUpOworCisgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHRlc3RfY190aHJlYWQtPmV4aXRfZXZlbnQpOworCisgICAgUHlUaHJlYWRfZXhpdF90aHJlYWQoKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK2NhbGxfaW5fdGVtcG9yYXJ5X2NfdGhyZWFkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqY2FsbGJhY2spCit7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgICAgdGVzdF9jX3RocmVhZF90IHRlc3RfY190aHJlYWQ7CisgICAgbG9uZyB0aHJlYWQ7CisKKyAgICBQeUV2YWxfSW5pdFRocmVhZHMoKTsKKworICAgIHRlc3RfY190aHJlYWQuc3RhcnRfZXZlbnQgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisgICAgdGVzdF9jX3RocmVhZC5leGl0X2V2ZW50ID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOworICAgIHRlc3RfY190aHJlYWQuY2FsbGJhY2sgPSBOVUxMOworICAgIGlmICghdGVzdF9jX3RocmVhZC5zdGFydF9ldmVudCB8fCAhdGVzdF9jX3RocmVhZC5leGl0X2V2ZW50KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjb3VsZCBub3QgYWxsb2NhdGUgbG9jayIpOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgUHlfSU5DUkVGKGNhbGxiYWNrKTsKKyAgICB0ZXN0X2NfdGhyZWFkLmNhbGxiYWNrID0gY2FsbGJhY2s7CisKKyAgICBQeVRocmVhZF9hY3F1aXJlX2xvY2sodGVzdF9jX3RocmVhZC5zdGFydF9ldmVudCwgMSk7CisgICAgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHRlc3RfY190aHJlYWQuZXhpdF9ldmVudCwgMSk7CisKKyAgICB0aHJlYWQgPSBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKHRlbXBvcmFyeV9jX3RocmVhZCwgJnRlc3RfY190aHJlYWQpOworICAgIGlmICh0aHJlYWQgPT0gLTEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgInVuYWJsZSB0byBzdGFydCB0aGUgdGhyZWFkIik7CisgICAgICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayh0ZXN0X2NfdGhyZWFkLnN0YXJ0X2V2ZW50KTsKKyAgICAgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHRlc3RfY190aHJlYWQuZXhpdF9ldmVudCk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBQeVRocmVhZF9hY3F1aXJlX2xvY2sodGVzdF9jX3RocmVhZC5zdGFydF9ldmVudCwgMSk7CisgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHRlc3RfY190aHJlYWQuc3RhcnRfZXZlbnQpOworCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBQeVRocmVhZF9hY3F1aXJlX2xvY2sodGVzdF9jX3RocmVhZC5leGl0X2V2ZW50LCAxKTsKKyAgICAgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHRlc3RfY190aHJlYWQuZXhpdF9ldmVudCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXMgPSBQeV9Ob25lOworCitleGl0OgorICAgIFB5X0NMRUFSKHRlc3RfY190aHJlYWQuY2FsbGJhY2spOworICAgIGlmICh0ZXN0X2NfdGhyZWFkLnN0YXJ0X2V2ZW50KQorICAgICAgICBQeVRocmVhZF9mcmVlX2xvY2sodGVzdF9jX3RocmVhZC5zdGFydF9ldmVudCk7CisgICAgaWYgKHRlc3RfY190aHJlYWQuZXhpdF9ldmVudCkKKyAgICAgICAgUHlUaHJlYWRfZnJlZV9sb2NrKHRlc3RfY190aHJlYWQuZXhpdF9ldmVudCk7CisgICAgcmV0dXJuIHJlczsKK30KKyNlbmRpZiAgIC8qIFdJVEhfVEhSRUFEICovCisKKwogc3RhdGljIFB5TWV0aG9kRGVmIFRlc3RNZXRob2RzW10gPSB7CiAgICAgeyJyYWlzZV9leGNlcHRpb24iLCAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbiwgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCiAgICAgeyJ0ZXN0X2NvbmZpZyIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbil0ZXN0X2NvbmZpZywgICAgICAgIE1FVEhfTk9BUkdTfSwKQEAgLTE3NDUsNiArMTgzNSwxMCBAQAogICAgIHsibWFrZV9leGNlcHRpb25fd2l0aF9kb2MiLCAoUHlDRnVuY3Rpb24pbWFrZV9leGNlcHRpb25fd2l0aF9kb2MsCiAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFN9LAogICAgIHsic2VxdWVuY2VfZGVsaXRlbSIsIChQeUNGdW5jdGlvbilzZXF1ZW5jZV9kZWxpdGVtLCBNRVRIX1ZBUkFSR1N9LAorI2lmZGVmIFdJVEhfVEhSRUFECisgICAgeyJjYWxsX2luX3RlbXBvcmFyeV9jX3RocmVhZCIsIGNhbGxfaW5fdGVtcG9yYXJ5X2NfdGhyZWFkLCBNRVRIX08sCisgICAgIFB5RG9jX1NUUigic2V0X2Vycm9yX2NsYXNzKGVycm9yX2NsYXNzKSAtPiBOb25lIil9LAorI2VuZGlmCiAgICAge05VTEwsIE5VTEx9IC8qIHNlbnRpbmVsICovCiB9OwogCkBAIC0xODEzLDcgKzE5MDcsNyBAQAogICAgICAgICA7CiAgICAgdGVzdF9zdHJ1Y3RtZW1iZXJzICpvYjsKICAgICBjb25zdCBjaGFyICpzID0gTlVMTDsKLSAgICBQeV9zc2l6ZV90IHN0cmluZ19sZW4gPSAwOworICAgIGludCBzdHJpbmdfbGVuID0gMDsKICAgICBvYiA9IFB5T2JqZWN0X05ldyh0ZXN0X3N0cnVjdG1lbWJlcnMsIHR5cGUpOwogICAgIGlmIChvYiA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3RraW50ZXIuYyBiL01vZHVsZXMvX3RraW50ZXIuYwppbmRleCA0MGM4YmUyLi5mZTM1ODgyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL190a2ludGVyLmMKKysrIGIvTW9kdWxlcy9fdGtpbnRlci5jCkBAIC00Nyw2ICs0NywxMCBAQAogI2RlZmluZSBQeUJvb2xfRnJvbUxvbmcgICAgICAgUHlJbnRfRnJvbUxvbmcKICNlbmRpZgogCisjZGVmaW5lIENIRUNLX1NJWkUoc2l6ZSwgZWxlbXNpemUpIFwKKyAgICAoKHNpemVfdCkoc2l6ZSkgPD0gKHNpemVfdClJTlRfTUFYICYmIFwKKyAgICAgKHNpemVfdCkoc2l6ZSkgPD0gVUlOVF9NQVggLyAoc2l6ZV90KShlbGVtc2l6ZSkpCisKIC8qIFN0YXJ0aW5nIHdpdGggVGNsIDguNCwgbWFueSBBUElzIG9mZmVyIGNvbnN0LWNvcnJlY3RuZXNzLiAgVW5mb3J0dW5hdGVseSwKICAgIG1ha2luZyBfdGtpbnRlciBjb3JyZWN0IGZvciB0aGlzIEFQSSBtZWFucyB0byBicmVhayBlYXJsaWVyCiAgICB2ZXJzaW9ucy4gVVNFX0NPTVBBVF9DT05TVCBhbGxvd3MgdG8gbWFrZSBfdGtpbnRlciB3b3JrIHdpdGggYm90aCA4LjQgYW5kCkBAIC0zNzgsNyArMzgyLDcgQEAKICAgICBjaGFyICoqYXJndiA9IE5VTEw7CiAgICAgaW50IGZ2U3RvcmVbQVJHU1pdOwogICAgIGludCAqZnYgPSBOVUxMOwotICAgIGludCBhcmdjID0gMCwgZnZjID0gMCwgaTsKKyAgICBQeV9zc2l6ZV90IGFyZ2MgPSAwLCBmdmMgPSAwLCBpOwogICAgIGNoYXIgKnJlcyA9IE5VTEw7CiAKICAgICBpZiAoISh0bXAgPSBQeUxpc3RfTmV3KDApKSkKQEAgLTQwMCw4ICs0MDQsMTIgQEAKICAgICAgICAgYXJnYyA9IFB5VHVwbGVfU2l6ZShhcmdzKTsKIAogICAgICAgICBpZiAoYXJnYyA+IEFSR1NaKSB7Ci0gICAgICAgICAgICBhcmd2ID0gKGNoYXIgKiopY2thbGxvYyhhcmdjICogc2l6ZW9mKGNoYXIgKikpOwotICAgICAgICAgICAgZnYgPSAoaW50ICopY2thbGxvYyhhcmdjICogc2l6ZW9mKGludCkpOworICAgICAgICAgICAgaWYgKCFDSEVDS19TSVpFKGFyZ2MsIHNpemVvZihjaGFyICopKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAidHVwbGUgaXMgdG9vIGxvbmciKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcmd2ID0gKGNoYXIgKiopY2thbGxvYygoc2l6ZV90KWFyZ2MgKiBzaXplb2YoY2hhciAqKSk7CisgICAgICAgICAgICBmdiA9IChpbnQgKilja2FsbG9jKChzaXplX3QpYXJnYyAqIHNpemVvZihpbnQpKTsKICAgICAgICAgICAgIGlmIChhcmd2ID09IE5VTEwgfHwgZnYgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OwpAQCAtNDQ4LDYgKzQ1Niw3MCBAQAogCiAKIAorI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKK3N0YXRpYyBQeU9iamVjdCAqCit1bmljb2RlX0Zyb21UY2xTdHJpbmdBbmRTaXplKGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3Qgc2l6ZSkKK3sKKyAgICBQeU9iamVjdCAqciA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KHMsIHNpemUsIE5VTEwpOworICAgIGlmICghciAmJiBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1VuaWNvZGVEZWNvZGVFcnJvcikpIHsKKyAgICAgICAgLyogVGNsIGVuY29kZXMgbnVsbCBjaGFyYWN0ZXIgYXMgXHhjMFx4ODAgKi8KKyAgICAgICAgaWYgKG1lbWNocihzLCAnXHhjMCcsIHNpemUpKSB7CisgICAgICAgICAgICBjaGFyICpidWYsICpxOworICAgICAgICAgICAgY29uc3QgY2hhciAqZSA9IHMgKyBzaXplOworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIHEgPSBidWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhzaXplKTsKKyAgICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAocyAhPSBlKSB7CisgICAgICAgICAgICAgICAgaWYgKHMgKyAxICE9IGUgJiYgc1swXSA9PSAnXHhjMCcgJiYgc1sxXSA9PSAnXHg4MCcpIHsKKyAgICAgICAgICAgICAgICAgICAgKnErKyA9ICdcMCc7CisgICAgICAgICAgICAgICAgICAgIHMgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqcSsrID0gKnMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMgPSBidWY7CisgICAgICAgICAgICBzaXplID0gcSAtIHM7CisgICAgICAgICAgICByID0gUHlVbmljb2RlX0RlY29kZVVURjgocywgc2l6ZSwgTlVMTCk7CisgICAgICAgICAgICBQeU1lbV9GcmVlKGJ1Zik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHI7Cit9CisjZW5kaWYKKworc3RhdGljIFB5T2JqZWN0ICoKK2Zyb21UY2xTdHJpbmdBbmRTaXplKGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3Qgc2l6ZSkKK3sKKyAgICBQeU9iamVjdCAqcjsKKyNpZmRlZiBQeV9VU0lOR19VTklDT0RFCisgICAgUHlfc3NpemVfdCBpOworICAgIC8qIElmIFRjbCBzdHJpbmcgY29udGFpbnMgYW55IGJ5dGVzIHdpdGggdGhlIHRvcCBiaXQgc2V0LAorICAgICAgICBpdCdzIFVURi04IGFuZCB3ZSBzaG91bGQgZGVjb2RlIGl0IHRvIFVuaWNvZGUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICBpZiAoc1tpXSAmIDB4ODApCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAoaSAhPSBzaXplKSB7CisgICAgICAgIC8qIEl0IGlzbid0IGFuIEFTQ0lJIHN0cmluZy4gKi8KKyAgICAgICAgciA9IHVuaWNvZGVfRnJvbVRjbFN0cmluZ0FuZFNpemUocywgc2l6ZSk7CisgICAgICAgIGlmIChyKQorICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgfQorI2VuZGlmCisgICAgciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIHNpemUpOworICAgIHJldHVybiByOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorZnJvbVRjbFN0cmluZyhjb25zdCBjaGFyICpzKQoreworICAgIHJldHVybiBmcm9tVGNsU3RyaW5nQW5kU2l6ZShzLCBzdHJsZW4ocykpOworfQorCisKIHN0YXRpYyBQeU9iamVjdCAqCiBTcGxpdChjaGFyICpsaXN0KQogewpAQCAtNTQ3LDYgKzYxOSwzMyBAQAogICAgICAgICAgICAgcmV0dXJuIFNwbGl0KFB5U3RyaW5nX0FzU3RyaW5nKGFyZykpOwogICAgICAgICAvKiBGYWxsIHRocm91Z2gsIHJldHVybmluZyBhcmcuICovCiAgICAgfQorICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhhcmcpKSB7CisgICAgICAgIGludCBhcmdjOworICAgICAgICBjaGFyICoqYXJndjsKKyAgICAgICAgY2hhciAqbGlzdDsKKyAgICAgICAgUHlPYmplY3QgKnMgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKGFyZyk7CisKKyAgICAgICAgaWYgKHMgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfSU5DUkVGKGFyZyk7CisgICAgICAgICAgICByZXR1cm4gYXJnOworICAgICAgICB9CisgICAgICAgIGxpc3QgPSBQeVN0cmluZ19Bc1N0cmluZyhzKTsKKworICAgICAgICBpZiAobGlzdCA9PSBOVUxMIHx8CisgICAgICAgICAgICBUY2xfU3BsaXRMaXN0KChUY2xfSW50ZXJwICopTlVMTCwgbGlzdCwgJmFyZ2MsICZhcmd2KSAhPSBUQ0xfT0spIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihhcmcpOworICAgICAgICAgICAgcmV0dXJuIGFyZzsKKyAgICAgICAgfQorICAgICAgICBUY2xfRnJlZShGUkVFQ0FTVCBhcmd2KTsKKyAgICAgICAgaWYgKGFyZ2MgPiAxKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdiA9IFNwbGl0KGxpc3QpOworICAgICAgICAgICAgUHlfREVDUkVGKHMpOworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHMpOworICAgICAgICAvKiBGYWxsIHRocm91Z2gsIHJldHVybmluZyBhcmcuICovCisgICAgfQogICAgIFB5X0lOQ1JFRihhcmcpOwogICAgIHJldHVybiBhcmc7CiB9CkBAIC04MDYsMjcgKzkwNSwxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFB5VGNsT2JqZWN0X3N0cmluZyhQeVRjbE9iamVjdCAqc2VsZiwgdm9pZCAqaWdub3JlZCkKIHsKLSAgICBjaGFyICpzOwotICAgIGludCBpLCBsZW47CiAgICAgaWYgKCFzZWxmLT5zdHJpbmcpIHsKLSAgICAgICAgcyA9IFRjbF9HZXRTdHJpbmdGcm9tT2JqKHNlbGYtPnZhbHVlLCAmbGVuKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotICAgICAgICAgICAgaWYgKHNbaV0gJiAweDgwKQotICAgICAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLSAgICAgICAgaWYgKGkgPT0gbGVuKQotICAgICAgICAgICAgLyogSXQgaXMgYW4gQVNDSUkgc3RyaW5nLiAqLwotICAgICAgICAgICAgc2VsZi0+c3RyaW5nID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBzZWxmLT5zdHJpbmcgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOChzLCBsZW4sICJzdHJpY3QiKTsKLSAgICAgICAgICAgIGlmICghc2VsZi0+c3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgICAgICAgICBzZWxmLT5zdHJpbmcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0jZWxzZQotICAgICAgICBzZWxmLT5zdHJpbmcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4pOwotI2VuZGlmCisgICAgICAgIGludCBsZW47CisgICAgICAgIGNoYXIgKnMgPSBUY2xfR2V0U3RyaW5nRnJvbU9iaihzZWxmLT52YWx1ZSwgJmxlbik7CisgICAgICAgIHNlbGYtPnN0cmluZyA9IGZyb21UY2xTdHJpbmdBbmRTaXplKHMsIGxlbik7CiAgICAgICAgIGlmICghc2VsZi0+c3RyaW5nKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtODQ4LDcgKzkzMCw3IEBACiAgICAgfQogICAgIC8qIFhYWCBDb3VsZCBjaGFjaGUgcmVzdWx0IGlmIGl0IGlzIG5vbi1BU0NJSS4gKi8KICAgICBzID0gVGNsX0dldFN0cmluZ0Zyb21PYmooc2VsZi0+dmFsdWUsICZsZW4pOwotICAgIHJldHVybiBQeVVuaWNvZGVfRGVjb2RlVVRGOChzLCBsZW4sICJzdHJpY3QiKTsKKyAgICByZXR1cm4gdW5pY29kZV9Gcm9tVGNsU3RyaW5nQW5kU2l6ZShzLCBsZW4pOwogfQogI2VuZGlmCiAKQEAgLTk0MSw2ICsxMDIzLDE2IEBACiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pc19nYyovCiB9OwogCisjaWYgUFlfU0laRV9NQVggPiBJTlRfTUFYCisjZGVmaW5lIENIRUNLX1NUUklOR19MRU5HVEgocykgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChzICE9IE5VTEwgJiYgc3RybGVuKHMpID49IElOVF9NQVgpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInN0cmluZyBpcyB0b28gbG9uZyIpOyBcCisgICAgICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgQ0hFQ0tfU1RSSU5HX0xFTkdUSChzKQorI2VuZGlmCisKIHN0YXRpYyBUY2xfT2JqKgogQXNPYmooUHlPYmplY3QgKnZhbHVlKQogewpAQCAtOTU2LDEyICsxMDQ4LDE4IEBACiAgICAgZWxzZSBpZiAoUHlGbG9hdF9DaGVjayh2YWx1ZSkpCiAgICAgICAgIHJldHVybiBUY2xfTmV3RG91YmxlT2JqKFB5RmxvYXRfQVNfRE9VQkxFKHZhbHVlKSk7CiAgICAgZWxzZSBpZiAoUHlUdXBsZV9DaGVjayh2YWx1ZSkpIHsKLSAgICAgICAgVGNsX09iaiAqKmFyZ3YgPSAoVGNsX09iaioqKQotICAgICAgICAgICAgY2thbGxvYyhQeVR1cGxlX1NpemUodmFsdWUpKnNpemVvZihUY2xfT2JqKikpOwotICAgICAgICBpbnQgaTsKKyAgICAgICAgVGNsX09iaiAqKmFyZ3Y7CisgICAgICAgIFB5X3NzaXplX3Qgc2l6ZSwgaTsKKworICAgICAgICBzaXplID0gUHlUdXBsZV9TaXplKHZhbHVlKTsKKyAgICAgICAgaWYgKCFDSEVDS19TSVpFKHNpemUsIHNpemVvZihUY2xfT2JqICopKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJ0dXBsZSBpcyB0b28gbG9uZyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYXJndiA9IChUY2xfT2JqICoqKSBja2FsbG9jKCgoc2l6ZV90KXNpemUpICogc2l6ZW9mKFRjbF9PYmogKikpOwogICAgICAgICBpZighYXJndikKICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgZm9yKGk9MDtpPFB5VHVwbGVfU2l6ZSh2YWx1ZSk7aSsrKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQogICAgICAgICAgIGFyZ3ZbaV0gPSBBc09iaihQeVR1cGxlX0dldEl0ZW0odmFsdWUsaSkpOwogICAgICAgICByZXN1bHQgPSBUY2xfTmV3TGlzdE9iaihQeVR1cGxlX1NpemUodmFsdWUpLCBhcmd2KTsKICAgICAgICAgY2tmcmVlKEZSRUVDQVNUIGFyZ3YpOwpAQCAtOTc2LDcgKzEwNzQsMTQgQEAKICNpZiBkZWZpbmVkKFB5X1VOSUNPREVfV0lERSkgJiYgVENMX1VURl9NQVggPT0gMwogICAgICAgICBUY2xfVW5pQ2hhciAqb3V0YnVmID0gTlVMTDsKICAgICAgICAgUHlfc3NpemVfdCBpOwotICAgICAgICBzaXplX3QgYWxsb2NzaXplID0gKChzaXplX3Qpc2l6ZSkgKiBzaXplb2YoVGNsX1VuaUNoYXIpOworICAgICAgICBzaXplX3QgYWxsb2NzaXplOworICAgICAgICBpZiAoIUNIRUNLX1NJWkUoc2l6ZSwgc2l6ZW9mKFRjbF9VbmlDaGFyKSkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAic3RyaW5nIGlzIHRvbyBsb25nIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZW9mKFB5X1VOSUNPREUpID09IHNpemVvZihUY2xfVW5pQ2hhcikpCisgICAgICAgICAgICByZXR1cm4gVGNsX05ld1VuaWNvZGVPYmooaW5idWYsIHNpemUpOworICAgICAgICBhbGxvY3NpemUgPSAoKHNpemVfdClzaXplKSAqIHNpemVvZihUY2xfVW5pQ2hhcik7CiAgICAgICAgIGlmIChhbGxvY3NpemUgPj0gc2l6ZSkKICAgICAgICAgICAgIG91dGJ1ZiA9IChUY2xfVW5pQ2hhciopY2thbGxvYyhhbGxvY3NpemUpOwogICAgICAgICAvKiBFbHNlIG92ZXJmbG93IG9jY3VycmVkLCBhbmQgd2UgdGFrZSB0aGUgbmV4dCBleGl0ICovCkBAIC05ODcsOCArMTA5MiwxMCBAQAogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoaW5idWZbaV0gPj0gMHgxMDAwMCkgewogICAgICAgICAgICAgICAgIC8qIFRjbCBkb2Vzbid0IGRvIFVURi0xNiwgeWV0LiAqLwotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5zdXBwb3J0ZWQgY2hhcmFjdGVyIik7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFRraW50ZXJfVGNsRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGFyYWN0ZXIgVSsleCBpcyBhYm92ZSB0aGUgcmFuZ2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFUrMDAwMC1VK0ZGRkYpIGFsbG93ZWQgYnkgVGNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClpbmJ1ZltpXSk7CiAgICAgICAgICAgICAgICAgY2tmcmVlKEZSRUVDQVNUIG91dGJ1Zik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CkBAIC0xMDI1LDMwICsxMTMyLDcgQEAKICAgICBUa2FwcE9iamVjdCAqYXBwID0gKFRrYXBwT2JqZWN0Kil0a2FwcDsKIAogICAgIGlmICh2YWx1ZS0+dHlwZVB0ciA9PSBOVUxMKSB7Ci0gICAgICAgIC8qIElmIHRoZSByZXN1bHQgY29udGFpbnMgYW55IGJ5dGVzIHdpdGggdGhlIHRvcCBiaXQgc2V0LAotICAgICAgICAgICBpdCdzIFVURi04IGFuZCB3ZSBzaG91bGQgZGVjb2RlIGl0IHRvIFVuaWNvZGUgKi8KLSNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0gICAgICAgIGludCBpOwotICAgICAgICBjaGFyICpzID0gdmFsdWUtPmJ5dGVzOwotICAgICAgICBpbnQgbGVuID0gdmFsdWUtPmxlbmd0aDsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAodmFsdWUtPmJ5dGVzW2ldICYgMHg4MCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpID09IHZhbHVlLT5sZW5ndGgpCi0gICAgICAgICAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4pOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qIENvbnZlcnQgVVRGLTggdG8gVW5pY29kZSBzdHJpbmcgKi8KLSAgICAgICAgICAgIHJlc3VsdCA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KHMsIGxlbiwgInN0cmljdCIpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0jZWxzZQotICAgICAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSh2YWx1ZS0+Ynl0ZXMsIHZhbHVlLT5sZW5ndGgpOwotI2VuZGlmCisgICAgICAgIHJlc3VsdCA9IGZyb21UY2xTdHJpbmdBbmRTaXplKHZhbHVlLT5ieXRlcywgdmFsdWUtPmxlbmd0aCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCkBAIC0xMTY5LDcgKzEyNTMsNyBAQAogVGthcHBfQ2FsbEFyZ3MoUHlPYmplY3QgKmFyZ3MsIFRjbF9PYmoqKiBvYmpTdG9yZSwgaW50ICpwb2JqYykKIHsKICAgICBUY2xfT2JqICoqb2JqdiA9IG9ialN0b3JlOwotICAgIGludCBvYmpjID0gMCwgaTsKKyAgICBQeV9zc2l6ZV90IG9iamMgPSAwLCBpOwogICAgIGlmIChhcmdzID09IE5VTEwpCiAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi87CiAKQEAgLTExODQsNyArMTI2OCwxMSBAQAogICAgICAgICBvYmpjID0gUHlUdXBsZV9TaXplKGFyZ3MpOwogCiAgICAgICAgIGlmIChvYmpjID4gQVJHU1opIHsKLSAgICAgICAgICAgIG9ianYgPSAoVGNsX09iaiAqKilja2FsbG9jKG9iamMgKiBzaXplb2YoY2hhciAqKSk7CisgICAgICAgICAgICBpZiAoIUNIRUNLX1NJWkUob2JqYywgc2l6ZW9mKFRjbF9PYmogKikpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJ0dXBsZSBpcyB0b28gbG9uZyIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2JqdiA9IChUY2xfT2JqICoqKWNrYWxsb2MoKChzaXplX3Qpb2JqYykgKiBzaXplb2YoVGNsX09iaiAqKSk7CiAgICAgICAgICAgICBpZiAob2JqdiA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgICAgICAgICBvYmpjID0gMDsKQEAgLTEyMjEsOCArMTMwOSw4IEBACiBUa2FwcF9DYWxsUmVzdWx0KFRrYXBwT2JqZWN0ICpzZWxmKQogewogICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIFRjbF9PYmogKnZhbHVlID0gVGNsX0dldE9ialJlc3VsdChzZWxmLT5pbnRlcnApOwogICAgIGlmKHNlbGYtPndhbnRvYmplY3RzKSB7Ci0gICAgICAgIFRjbF9PYmogKnZhbHVlID0gVGNsX0dldE9ialJlc3VsdChzZWxmLT5pbnRlcnApOwogICAgICAgICAvKiBOb3Qgc3VyZSB3aGV0aGVyIHRoZSBJbmNyUmVmIGlzIG5lY2Vzc2FyeSwgYnV0IHNvbWV0aGluZwogICAgICAgICAgICBtYXkgb3ZlcndyaXRlIHRoZSBpbnRlcnByZXRlciByZXN1bHQgd2hpbGUgd2UgYXJlCiAgICAgICAgICAgIGNvbnZlcnRpbmcgaXQuICovCkBAIC0xMjMwLDMzICsxMzE4LDkgQEAKICAgICAgICAgcmVzID0gRnJvbU9iaigoUHlPYmplY3QqKXNlbGYsIHZhbHVlKTsKICAgICAgICAgVGNsX0RlY3JSZWZDb3VudCh2YWx1ZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgY29uc3QgY2hhciAqcyA9IFRjbF9HZXRTdHJpbmdSZXN1bHQoc2VsZi0+aW50ZXJwKTsKLSAgICAgICAgY29uc3QgY2hhciAqcCA9IHM7Ci0KLSAgICAgICAgLyogSWYgdGhlIHJlc3VsdCBjb250YWlucyBhbnkgYnl0ZXMgd2l0aCB0aGUgdG9wIGJpdCBzZXQsCi0gICAgICAgICAgIGl0J3MgVVRGLTggYW5kIHdlIHNob3VsZCBkZWNvZGUgaXQgdG8gVW5pY29kZSAqLwotI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLSAgICAgICAgd2hpbGUgKCpwICE9ICdcMCcpIHsKLSAgICAgICAgICAgIGlmICgqcCAmIDB4ODApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBwKys7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKnAgPT0gJ1wwJykKLSAgICAgICAgICAgIHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIChpbnQpKHAtcykpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qIENvbnZlcnQgVVRGLTggdG8gVW5pY29kZSBzdHJpbmcgKi8KLSAgICAgICAgICAgIHAgPSBzdHJjaHIocCwgJ1wwJyk7Ci0gICAgICAgICAgICByZXMgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOChzLCAoaW50KShwLXMpLCAic3RyaWN0Iik7Ci0gICAgICAgICAgICBpZiAocmVzID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICAgICAgICAgIHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIChpbnQpKHAtcykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0jZWxzZQotICAgICAgICBwID0gc3RyY2hyKHAsICdcMCcpOwotICAgICAgICByZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCAoaW50KShwLXMpKTsKLSNlbmRpZgorICAgICAgICBpbnQgbGVuOworICAgICAgICBjb25zdCBjaGFyICpzID0gVGNsX0dldFN0cmluZ0Zyb21PYmoodmFsdWUsICZsZW4pOworICAgICAgICByZXMgPSBmcm9tVGNsU3RyaW5nQW5kU2l6ZShzLCBsZW4pOwogICAgIH0KICAgICByZXR1cm4gcmVzOwogfQpAQCAtMTQzNCw2ICsxNDk4LDcgQEAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZXZhbCIsICZzY3JpcHQpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAorICAgIENIRUNLX1NUUklOR19MRU5HVEgoc2NyaXB0KTsKICAgICBDSEVDS19UQ0xfQVBQQVJUTUVOVDsKIAogICAgIEVOVEVSX1RDTApAQCAtMTQ4MCw2ICsxNTQ1LDcgQEAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZXZhbGZpbGUiLCAmZmlsZU5hbWUpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAorICAgIENIRUNLX1NUUklOR19MRU5HVEgoZmlsZU5hbWUpOwogICAgIENIRUNLX1RDTF9BUFBBUlRNRU5UOwogCiAgICAgRU5URVJfVENMCkBAIC0xNTAxLDkgKzE1NjcsMTAgQEAKICAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKICAgICBpbnQgZXJyOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJnNjcmlwdCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnJlY29yZCIsICZzY3JpcHQpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAorICAgIENIRUNLX1NUUklOR19MRU5HVEgoc2NyaXB0KTsKICAgICBDSEVDS19UQ0xfQVBQQVJUTUVOVDsKIAogICAgIEVOVEVSX1RDTApAQCAtMTUyNCw2ICsxNTkxLDcgQEAKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczphZGRlcnJvcmluZm8iLCAmbXNnKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0hFQ0tfU1RSSU5HX0xFTkdUSChtc2cpOwogICAgIENIRUNLX1RDTF9BUFBBUlRNRU5UOwogCiAgICAgRU5URVJfVENMCkBAIC0xNTU5LDE2ICsxNjI3LDI4IEBACiBzdGF0aWMgaW50CiB2YXJuYW1lX2NvbnZlcnRlcihQeU9iamVjdCAqaW4sIHZvaWQgKl9vdXQpCiB7CisgICAgY2hhciAqczsKICAgICBjaGFyICoqb3V0ID0gKGNoYXIqKilfb3V0OwogICAgIGlmIChQeVN0cmluZ19DaGVjayhpbikpIHsKLSAgICAgICAgKm91dCA9IFB5U3RyaW5nX0FzU3RyaW5nKGluKTsKKyAgICAgICAgaWYgKFB5U3RyaW5nX1NpemUoaW4pID4gSU5UX01BWCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJzdHJpbmcgaXMgdG9vIGxvbmciKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHMgPSBQeVN0cmluZ19Bc1N0cmluZyhpbik7CisgICAgICAgIGlmIChzdHJsZW4ocykgIT0gUHlTdHJpbmdfU2l6ZShpbikpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibnVsbCBjaGFyYWN0ZXIgaW4gc3RyaW5nIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAqb3V0ID0gczsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogICAgIGlmIChQeVRjbE9iamVjdF9DaGVjayhpbikpIHsKICAgICAgICAgKm91dCA9IFB5VGNsT2JqZWN0X1RjbFN0cmluZyhpbik7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KLSAgICAvKiBYWFg6IFNob3VsZCBnaXZlIGRpYWdub3N0aWNzLiAqLworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJtdXN0IGJlIHN0ciBvciBUY2xfT2JqLCBub3QgJS41MHMiLAorICAgICAgICAgICAgICAgICBpbi0+b2JfdHlwZS0+dHBfbmFtZSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTE2NTQsOCArMTczNCwxMSBAQAogICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOwogICAgIFRjbF9PYmogKm5ld3ZhbCwgKm9rOwogCi0gICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mTzpzZXR2YXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZhcm5hbWVfY29udmVydGVyLCAmbmFtZTEsICZuZXdWYWx1ZSkpIHsKKyAgICBzd2l0Y2ggKFB5VHVwbGVfR0VUX1NJWkUoYXJncykpIHsKKyAgICBjYXNlIDI6CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZPOnNldHZhciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJuYW1lX2NvbnZlcnRlciwgJm5hbWUxLCAmbmV3VmFsdWUpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIC8qIFhYWCBBY3F1aXJlIHRjbCBsb2NrPz8/ICovCiAgICAgICAgIG5ld3ZhbCA9IEFzT2JqKG5ld1ZhbHVlKTsKICAgICAgICAgaWYgKG5ld3ZhbCA9PSBOVUxMKQpAQCAtMTY3MSwyNyArMTc1NCwyOSBAQAogICAgICAgICAgICAgUHlfSU5DUkVGKHJlcyk7CiAgICAgICAgIH0KICAgICAgICAgTEVBVkVfT1ZFUkxBUF9UQ0wKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzc086c2V0dmFyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUxLCAmbmFtZTIsICZuZXdWYWx1ZSkpIHsKLSAgICAgICAgICAgIC8qIFhYWCBtdXN0IGhvbGQgdGNsIGxvY2sgYWxyZWFkeT8/PyAqLwotICAgICAgICAgICAgbmV3dmFsID0gQXNPYmoobmV3VmFsdWUpOwotICAgICAgICAgICAgRU5URVJfVENMCi0gICAgICAgICAgICBvayA9IFRjbF9TZXRWYXIyRXgoVGthcHBfSW50ZXJwKHNlbGYpLCBuYW1lMSwgbmFtZTIsIG5ld3ZhbCwgZmxhZ3MpOwotICAgICAgICAgICAgRU5URVJfT1ZFUkxBUAotICAgICAgICAgICAgaWYgKCFvaykKLSAgICAgICAgICAgICAgICBUa2ludGVyX0Vycm9yKHNlbGYpOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gUHlfTm9uZTsKLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYocmVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExFQVZFX09WRVJMQVBfVENMCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzc086c2V0dmFyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lMSwgJm5hbWUyLCAmbmV3VmFsdWUpKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIENIRUNLX1NUUklOR19MRU5HVEgobmFtZTEpOworICAgICAgICBDSEVDS19TVFJJTkdfTEVOR1RIKG5hbWUyKTsKKyAgICAgICAgLyogWFhYIG11c3QgaG9sZCB0Y2wgbG9jayBhbHJlYWR5Pz8/ICovCisgICAgICAgIG5ld3ZhbCA9IEFzT2JqKG5ld1ZhbHVlKTsKKyAgICAgICAgRU5URVJfVENMCisgICAgICAgIG9rID0gVGNsX1NldFZhcjJFeChUa2FwcF9JbnRlcnAoc2VsZiksIG5hbWUxLCBuYW1lMiwgbmV3dmFsLCBmbGFncyk7CisgICAgICAgIEVOVEVSX09WRVJMQVAKKyAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICAgIFRraW50ZXJfRXJyb3Ioc2VsZik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmVzID0gUHlfTm9uZTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihyZXMpOwogICAgICAgICB9CisgICAgICAgIExFQVZFX09WRVJMQVBfVENMCisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJzZXR2YXIgcmVxdWlyZXMgMiB0byAzIGFyZ3VtZW50cyIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgcmV0dXJuIHJlczsKIH0KQEAgLTE3MjEsNiArMTgwNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcm5hbWVfY29udmVydGVyLCAmbmFtZTEsICZuYW1lMikpCiAgICAgICAgIHJldHVybiBOVUxMOwogCisgICAgQ0hFQ0tfU1RSSU5HX0xFTkdUSChuYW1lMik7CiAgICAgRU5URVJfVENMCiAgICAgdHJlcyA9IFRjbF9HZXRWYXIyRXgoVGthcHBfSW50ZXJwKHNlbGYpLCBuYW1lMSwgbmFtZTIsIGZsYWdzKTsKICAgICBFTlRFUl9PVkVSTEFQCkBAIC0xNzMxLDcgKzE4MTcsOSBAQAogICAgICAgICAgICAgcmVzID0gRnJvbU9iaihzZWxmLCB0cmVzKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoVGNsX0dldFN0cmluZyh0cmVzKSk7CisgICAgICAgICAgICBpbnQgbGVuOworICAgICAgICAgICAgY2hhciAqcyA9IFRjbF9HZXRTdHJpbmdGcm9tT2JqKHRyZXMsICZsZW4pOworICAgICAgICAgICAgcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuKTsKICAgICAgICAgfQogICAgIH0KICAgICBMRUFWRV9PVkVSTEFQX1RDTApAQCAtMTc2Miw2ICsxODUwLDggQEAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8czp1bnNldHZhciIsICZuYW1lMSwgJm5hbWUyKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKKyAgICBDSEVDS19TVFJJTkdfTEVOR1RIKG5hbWUxKTsKKyAgICBDSEVDS19TVFJJTkdfTEVOR1RIKG5hbWUyKTsKICAgICBFTlRFUl9UQ0wKICAgICBjb2RlID0gVGNsX1Vuc2V0VmFyMihUa2FwcF9JbnRlcnAoc2VsZiksIG5hbWUxLCBuYW1lMiwgZmxhZ3MpOwogICAgIEVOVEVSX09WRVJMQVAKQEAgLTE4MDYsNiArMTg5Niw3IEBACiAgICAgfQogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpnZXRpbnQiLCAmcykpCiAgICAgICAgIHJldHVybiBOVUxMOworICAgIENIRUNLX1NUUklOR19MRU5HVEgocyk7CiAgICAgaWYgKFRjbF9HZXRJbnQoVGthcHBfSW50ZXJwKHNlbGYpLCBzLCAmdikgPT0gVENMX0VSUk9SKQogICAgICAgICByZXR1cm4gVGtpbnRlcl9FcnJvcihzZWxmKTsKICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHYpOwpAQCAtMTgyNiw2ICsxOTE3LDcgQEAKICAgICB9CiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldGRvdWJsZSIsICZzKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0hFQ0tfU1RSSU5HX0xFTkdUSChzKTsKICAgICBpZiAoVGNsX0dldERvdWJsZShUa2FwcF9JbnRlcnAoc2VsZiksIHMsICZ2KSA9PSBUQ0xfRVJST1IpCiAgICAgICAgIHJldHVybiBUa2ludGVyX0Vycm9yKHNlbGYpOwogICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJkIiwgdik7CkBAIC0xODQ2LDYgKzE5MzgsNyBAQAogICAgIH0KICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6Z2V0Ym9vbGVhbiIsICZzKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0hFQ0tfU1RSSU5HX0xFTkdUSChzKTsKICAgICBpZiAoVGNsX0dldEJvb2xlYW4oVGthcHBfSW50ZXJwKHNlbGYpLCBzLCAmdikgPT0gVENMX0VSUk9SKQogICAgICAgICByZXR1cm4gVGtpbnRlcl9FcnJvcihzZWxmKTsKICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHYpOwpAQCAtMTg2MSw2ICsxOTU0LDcgQEAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZXhwcnN0cmluZyIsICZzKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKKyAgICBDSEVDS19TVFJJTkdfTEVOR1RIKHMpOwogICAgIENIRUNLX1RDTF9BUFBBUlRNRU5UOwogCiAgICAgRU5URVJfVENMCkBAIC0xODY5LDcgKzE5NjMsNyBAQAogICAgIGlmIChyZXR2YWwgPT0gVENMX0VSUk9SKQogICAgICAgICByZXMgPSBUa2ludGVyX0Vycm9yKHNlbGYpOwogICAgIGVsc2UKLSAgICAgICAgcmVzID0gUHlfQnVpbGRWYWx1ZSgicyIsIFRrYXBwX1Jlc3VsdChzZWxmKSk7CisgICAgICAgIHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoVGthcHBfUmVzdWx0KHNlbGYpKTsKICAgICBMRUFWRV9PVkVSTEFQX1RDTAogICAgIHJldHVybiByZXM7CiB9CkBAIC0xODg1LDYgKzE5NzksNyBAQAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpleHBybG9uZyIsICZzKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKKyAgICBDSEVDS19TVFJJTkdfTEVOR1RIKHMpOwogICAgIENIRUNLX1RDTF9BUFBBUlRNRU5UOwogCiAgICAgRU5URVJfVENMCkBAIC0xOTA4LDYgKzIwMDMsNyBAQAogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmV4cHJkb3VibGUiLCAmcykpCiAgICAgICAgIHJldHVybiBOVUxMOworICAgIENIRUNLX1NUUklOR19MRU5HVEgocyk7CiAgICAgQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7CiAgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiVGthcHBfRXhwckRvdWJsZSIsIHJldHVybiAwKQogICAgIEVOVEVSX1RDTApAQCAtMTkzMiw2ICsyMDI4LDcgQEAKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpleHByYm9vbGVhbiIsICZzKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0hFQ0tfU1RSSU5HX0xFTkdUSChzKTsKICAgICBDSEVDS19UQ0xfQVBQQVJUTUVOVDsKICAgICBFTlRFUl9UQ0wKICAgICByZXR2YWwgPSBUY2xfRXhwckJvb2xlYW4oVGthcHBfSW50ZXJwKHNlbGYpLCBzLCAmdik7CkBAIC0xOTUyLDE5ICsyMDQ5LDM5IEBACiAgICAgY2hhciAqbGlzdDsKICAgICBpbnQgYXJnYzsKICAgICBjaGFyICoqYXJndjsKLSAgICBQeU9iamVjdCAqdjsKKyAgICBQeU9iamVjdCAqYXJnLCAqdjsKICAgICBpbnQgaTsKIAotICAgIGlmIChQeVR1cGxlX1NpemUoYXJncykgPT0gMSkgewotICAgICAgICB2ID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDApOwotICAgICAgICBpZiAoUHlUdXBsZV9DaGVjayh2KSkgewotICAgICAgICAgICAgUHlfSU5DUkVGKHYpOwotICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOnNwbGl0bGlzdCIsICZhcmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlUY2xPYmplY3RfQ2hlY2soYXJnKSkgeworICAgICAgICBpbnQgb2JqYzsKKyAgICAgICAgVGNsX09iaiAqKm9ianY7CisgICAgICAgIGlmIChUY2xfTGlzdE9iakdldEVsZW1lbnRzKFRrYXBwX0ludGVycChzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQeVRjbE9iamVjdCopYXJnKS0+dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYmpjLCAmb2JqdikgPT0gVENMX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gVGtpbnRlcl9FcnJvcihzZWxmKTsKICAgICAgICAgfQorICAgICAgICBpZiAoISh2ID0gUHlUdXBsZV9OZXcob2JqYykpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvYmpjOyBpKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpzID0gRnJvbU9iaihzZWxmLCBvYmp2W2ldKTsKKyAgICAgICAgICAgIGlmICghcyB8fCBQeVR1cGxlX1NldEl0ZW0odiwgaSwgcykpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHY7CiAgICAgfQorICAgIGlmIChQeVR1cGxlX0NoZWNrKGFyZykpIHsKKyAgICAgICAgUHlfSU5DUkVGKGFyZyk7CisgICAgICAgIHJldHVybiBhcmc7CisgICAgfQorCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJldDpzcGxpdGxpc3QiLCAidXRmLTgiLCAmbGlzdCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCisgICAgQ0hFQ0tfU1RSSU5HX0xFTkdUSChsaXN0KTsKICAgICBpZiAoVGNsX1NwbGl0TGlzdChUa2FwcF9JbnRlcnAoc2VsZiksIGxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgJmFyZ2MsICZhcmd2KSA9PSBUQ0xfRVJST1IpICB7CiAgICAgICAgIFB5TWVtX0ZyZWUobGlzdCk7CkBAIC0xOTkyLDE4ICsyMTA5LDQxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfU3BsaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIFB5T2JqZWN0ICp2OworICAgIFB5T2JqZWN0ICphcmcsICp2OwogICAgIGNoYXIgKmxpc3Q7CiAKLSAgICBpZiAoUHlUdXBsZV9TaXplKGFyZ3MpID09IDEpIHsKLSAgICAgICAgUHlPYmplY3QqIG8gPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7Ci0gICAgICAgIGlmIChQeVR1cGxlX0NoZWNrKG8pKSB7Ci0gICAgICAgICAgICBvID0gU3BsaXRPYmoobyk7Ci0gICAgICAgICAgICByZXR1cm4gbzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86c3BsaXQiLCAmYXJnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5VGNsT2JqZWN0X0NoZWNrKGFyZykpIHsKKyAgICAgICAgVGNsX09iaiAqdmFsdWUgPSAoKFB5VGNsT2JqZWN0KilhcmcpLT52YWx1ZTsKKyAgICAgICAgaW50IG9iamM7CisgICAgICAgIFRjbF9PYmogKipvYmp2OworICAgICAgICBpbnQgaTsKKyAgICAgICAgaWYgKFRjbF9MaXN0T2JqR2V0RWxlbWVudHMoVGthcHBfSW50ZXJwKHNlbGYpLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iamMsICZvYmp2KSA9PSBUQ0xfRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBGcm9tT2JqKHNlbGYsIHZhbHVlKTsKICAgICAgICAgfQorICAgICAgICBpZiAob2JqYyA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgICAgICBpZiAob2JqYyA9PSAxKQorICAgICAgICAgICAgcmV0dXJuIEZyb21PYmooc2VsZiwgb2JqdlswXSk7CisgICAgICAgIGlmICghKHYgPSBQeVR1cGxlX05ldyhvYmpjKSkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG9iamM7IGkrKykgeworICAgICAgICAgICAgUHlPYmplY3QgKnMgPSBGcm9tT2JqKHNlbGYsIG9ianZbaV0pOworICAgICAgICAgICAgaWYgKCFzIHx8IFB5VHVwbGVfU2V0SXRlbSh2LCBpLCBzKSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdjsKICAgICB9CisgICAgaWYgKFB5VHVwbGVfQ2hlY2soYXJnKSkKKyAgICAgICAgcmV0dXJuIFNwbGl0T2JqKGFyZyk7CisKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0OnNwbGl0IiwgInV0Zi04IiwgJmxpc3QpKQogICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDSEVDS19TVFJJTkdfTEVOR1RIKGxpc3QpOwogICAgIHYgPSBTcGxpdChsaXN0KTsKICAgICBQeU1lbV9GcmVlKGxpc3QpOwogICAgIHJldHVybiB2OwpAQCAtMjA2NSw3ICsyMjA1LDcgQEAKICAgICAgICAgcmV0dXJuIFB5dGhvbkNtZF9FcnJvcihpbnRlcnApOwogCiAgICAgZm9yIChpID0gMDsgaSA8IChhcmdjIC0gMSk7IGkrKykgewotICAgICAgICBQeU9iamVjdCAqcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoYXJndltpICsgMV0pOworICAgICAgICBQeU9iamVjdCAqcyA9IGZyb21UY2xTdHJpbmcoYXJndltpICsgMV0pOwogICAgICAgICBpZiAoIXMgfHwgUHlUdXBsZV9TZXRJdGVtKGFyZywgaSwgcykpIHsKICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmcpOwogICAgICAgICAgICAgcmV0dXJuIFB5dGhvbkNtZF9FcnJvcihpbnRlcnApOwpAQCAtMjE0OSw2ICsyMjg5LDcgQEAKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic086Y3JlYXRlY29tbWFuZCIsICZjbWROYW1lLCAmZnVuYykpCiAgICAgICAgIHJldHVybiBOVUxMOworICAgIENIRUNLX1NUUklOR19MRU5HVEgoY21kTmFtZSk7CiAgICAgaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGZ1bmMpKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjb21tYW5kIG5vdCBjYWxsYWJsZSIpOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTIyMTIsNiArMjM1Myw3IEBACiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZGVsZXRlY29tbWFuZCIsICZjbWROYW1lKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0hFQ0tfU1RSSU5HX0xFTkdUSChjbWROYW1lKTsKIAogI2lmZGVmIFdJVEhfVEhSRUFECiAgICAgaWYgKHNlbGYtPnRocmVhZGVkICYmIHNlbGYtPnRocmVhZF9pZCAhPSBUY2xfR2V0Q3VycmVudFRocmVhZCgpKSB7CkBAIC0yNzIxLDcgKzI4NjMsNyBAQAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmludGVycGFkZHIiKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpVGthcHBfSW50ZXJwKHNlbGYpKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Wb2lkUHRyKFRrYXBwX0ludGVycChzZWxmKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0yNzk3LDYgKzI5MzksMzMgQEAKICAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAorLyogQ29udmVydCBQeXRob24gc3RyaW5nIG9yIGFueSBidWZmZXIgY29tcGF0aWJsZSBvYmplY3QgdG8gVGNsIGJ5dGUtYXJyYXkKKyAqIG9iamVjdC4gIFVzZSBpdCB0byBwYXNzIGJpbmFyeSBkYXRhIChlLmcuIGltYWdlJ3MgZGF0YSkgdG8gVGNsL1RrIGNvbW1hbmRzLgorICovCitzdGF0aWMgUHlPYmplY3QgKgorVGthcHBfQ3JlYXRlQnl0ZUFycmF5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBQeV9idWZmZXIgdmlldzsKKyAgICBUY2xfT2JqKiBvYmo7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqOl9jcmVhdGVieXRlYXJyYXkiLCAmdmlldykpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKHZpZXcubGVuID49IElOVF9NQVgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJzdHJpbmcgaXMgdG9vIGxvbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG9iaiA9IFRjbF9OZXdCeXRlQXJyYXlPYmoodmlldy5idWYsIChpbnQpdmlldy5sZW4pOworICAgIGlmIChvYmogPT0gTlVMTCkgeworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3KTsKKyAgICAgICAgcmV0dXJuIFRraW50ZXJfRXJyb3Ioc2VsZik7CisgICAgfQorICAgIHJlcyA9IG5ld1B5VGNsT2JqZWN0KG9iaik7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmlldyk7CisgICAgcmV0dXJuIHJlczsKK30KKwogCiAvKioqKiBUa2FwcCBNZXRob2QgTGlzdCAqKioqLwogCkBAIC0yODM5LDYgKzMwMDgsNyBAQAogICAgIHsicXVpdCIsICAgICAgICAgICAgICAgICAgIFRrYXBwX1F1aXQsIE1FVEhfVkFSQVJHU30sCiAgICAgeyJpbnRlcnBhZGRyIiwgICAgICAgICBUa2FwcF9JbnRlcnBBZGRyLCBNRVRIX1ZBUkFSR1N9LAogICAgIHsibG9hZHRrIiwgICAgICAgICAgICAgICAgIFRrYXBwX1RrSW5pdCwgTUVUSF9OT0FSR1N9LAorICAgIHsiX2NyZWF0ZWJ5dGVhcnJheSIsICAgICAgIFRrYXBwX0NyZWF0ZUJ5dGVBcnJheSwgTUVUSF9WQVJBUkdTfSwKICAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICBOVUxMfQogfTsKIApAQCAtMzAyMCw2ICszMTkwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmFjdGl2ZSwgJndhbnRvYmplY3RzLCAmd2FudFRrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAmc3luYywgJnVzZSkpCiAgICAgICAgIHJldHVybiBOVUxMOworICAgIENIRUNLX1NUUklOR19MRU5HVEgoc2NyZWVuTmFtZSk7CisgICAgQ0hFQ0tfU1RSSU5HX0xFTkdUSChiYXNlTmFtZSk7CisgICAgQ0hFQ0tfU1RSSU5HX0xFTkdUSChjbGFzc05hbWUpOworICAgIENIRUNLX1NUUklOR19MRU5HVEgodXNlKTsKIAogICAgIHJldHVybiAoUHlPYmplY3QgKikgVGthcHBfTmV3KHNjcmVlbk5hbWUsIGJhc2VOYW1lLCBjbGFzc05hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3RpdmUsIHdhbnRvYmplY3RzLCAgICAgd2FudFRrLApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9hcnJheW1vZHVsZS5jIGIvTW9kdWxlcy9hcnJheW1vZHVsZS5jCmluZGV4IGE4NjBmNTcuLjVhOTI4NjIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvYXJyYXltb2R1bGUuYworKysgYi9Nb2R1bGVzL2FycmF5bW9kdWxlLmMKQEAgLTE1MzMsNiArMTUzMywxOSBAQAogUHlEb2NfU1RSVkFSKHJlZHVjZV9kb2MsICJSZXR1cm4gc3RhdGUgaW5mb3JtYXRpb24gZm9yIHBpY2tsaW5nLiIpOwogCiBzdGF0aWMgUHlPYmplY3QgKgorYXJyYXlfc2l6ZW9mKGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKQoreworICAgIFB5X3NzaXplX3QgcmVzOworICAgIHJlcyA9IHNpemVvZihhcnJheW9iamVjdCkgKyBzZWxmLT5hbGxvY2F0ZWQgKiBzZWxmLT5vYl9kZXNjci0+aXRlbXNpemU7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChyZXMpOworfQorCitQeURvY19TVFJWQVIoc2l6ZW9mX2RvYywKKyJfX3NpemVvZl9fKCkgLT4gaW50XG5cCitcblwKK1NpemUgb2YgdGhlIGFycmF5IGluIG1lbW9yeSwgaW4gYnl0ZXMuIik7CisKK3N0YXRpYyBQeU9iamVjdCAqCiBhcnJheV9nZXRfdHlwZWNvZGUoYXJyYXlvYmplY3QgKmEsIHZvaWQgKmNsb3N1cmUpCiB7CiAgICAgY2hhciB0YyA9IGEtPm9iX2Rlc2NyLT50eXBlY29kZTsKQEAgLTE2MDYsNiArMTYxOSw4IEBACiAjZW5kaWYKICAgICB7IndyaXRlIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilhcnJheV90b2ZpbGVfYXNfd3JpdGUsICAgICBNRVRIX08sCiAgICAgIHRvZmlsZV9kb2N9LAorICAgIHsiX19zaXplb2ZfXyIsICAgICAgKFB5Q0Z1bmN0aW9uKWFycmF5X3NpemVvZiwgICAgICBNRVRIX05PQVJHUywKKyAgICAgc2l6ZW9mX2RvY30sCiAgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvYXVkaW9vcC5jIGIvTW9kdWxlcy9hdWRpb29wLmMKaW5kZXggZmI2OWVkMy4uOGEzYTI3NSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9hdWRpb29wLmMKKysrIGIvTW9kdWxlcy9hdWRpb29wLmMKQEAgLTI0LDYgKzI0LDIxIEBACiAjZW5kaWYKICNlbmRpZgogCitzdGF0aWMgY29uc3QgaW50IG1heHZhbHNbXSA9IHswLCAweDdGLCAweDdGRkYsIDB4N0ZGRkZGLCAweDdGRkZGRkZGfTsKK3N0YXRpYyBjb25zdCBpbnQgbWludmFsc1tdID0gezAsIC0weDgwLCAtMHg4MDAwLCAtMHg4MDAwMDAsIC0weDgwMDAwMDAwfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbWFza3NbXSA9IHswLCAweEZGLCAweEZGRkYsIDB4RkZGRkZGLCAweEZGRkZGRkZGfTsKKworc3RhdGljIGludAorZmJvdW5kKGRvdWJsZSB2YWwsIGRvdWJsZSBtaW52YWwsIGRvdWJsZSBtYXh2YWwpCit7CisgICAgaWYgKHZhbCA+IG1heHZhbCkKKyAgICAgICAgdmFsID0gbWF4dmFsOworICAgIGVsc2UgaWYgKHZhbCA8IG1pbnZhbCArIDEpCisgICAgICAgIHZhbCA9IG1pbnZhbDsKKyAgICByZXR1cm4gdmFsOworfQorCisKIC8qIENvZGUgc2hhbWVsZXNzbHkgc3RvbGVuIGZyb20gc294LCAxMi4xNy43LCBnNzExLmMKICoqIChjKSBDcmFpZyBSZWVzZSwgSm9lIENhbXBiZWxsIGFuZCBKZWZmIFBvc2thbnplciAxOTg5ICovCiAKQEAgLTM0NSw3ICszNjAsNyBAQAogICAgIHNpZ25lZCBjaGFyICpjcDsKICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOwogICAgIGludCBpOwotICAgIGludCBtYXggPSAwOworICAgIHVuc2lnbmVkIGludCBhYnN2YWwsIG1heCA9IDA7CiAKICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6bWF4IiwgJmNwLCAmbGVuLCAmc2l6ZSkgKQogICAgICAgICByZXR1cm4gMDsKQEAgLTM1NSwxMCArMzcwLDE0IEBACiAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7CiAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOwogICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOwotICAgICAgICBpZiAoIHZhbCA8IDAgKSB2YWwgPSAoLXZhbCk7Ci0gICAgICAgIGlmICggdmFsID4gbWF4ICkgbWF4ID0gdmFsOworICAgICAgICBpZiAodmFsIDwgMCkgYWJzdmFsID0gKC12YWwpOworICAgICAgICBlbHNlIGFic3ZhbCA9IHZhbDsKKyAgICAgICAgaWYgKGFic3ZhbCA+IG1heCkgbWF4ID0gYWJzdmFsOwogICAgIH0KLSAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcobWF4KTsKKyAgICBpZiAobWF4IDw9IElOVF9NQVgpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhtYXgpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKG1heCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0zNjcsNyArMzg2LDcgQEAKICAgICBzaWduZWQgY2hhciAqY3A7CiAgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKICAgICBpbnQgaTsKLSAgICBpbnQgbWluID0gMHg3ZmZmZmZmZiwgbWF4ID0gLTB4N2ZmZmZmZmY7CisgICAgaW50IG1pbiA9IDB4N2ZmZmZmZmYsIG1heCA9IC0weDgwMDAwMDAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6bWlubWF4IiwgJmNwLCAmbGVuLCAmc2l6ZSkpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNDA0LDcgKzQyMyw3IEBACiAgICAgaWYgKCBsZW4gPT0gMCApCiAgICAgICAgIHZhbCA9IDA7CiAgICAgZWxzZQotICAgICAgICB2YWwgPSAoaW50KShhdmcgLyAoZG91YmxlKShsZW4vc2l6ZSkpOworICAgICAgICB2YWwgPSAoaW50KWZsb29yKGF2ZyAvIChkb3VibGUpKGxlbi9zaXplKSk7CiAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CiB9CiAKQEAgLTQxNCw2ICs0MzMsNyBAQAogICAgIHNpZ25lZCBjaGFyICpjcDsKICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOwogICAgIGludCBpOworICAgIHVuc2lnbmVkIGludCByZXM7CiAgICAgZG91YmxlIHN1bV9zcXVhcmVzID0gMC4wOwogCiAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOnJtcyIsICZjcCwgJmxlbiwgJnNpemUpICkKQEAgLTQyNywxMCArNDQ3LDEzIEBACiAgICAgICAgIHN1bV9zcXVhcmVzICs9IChkb3VibGUpdmFsKihkb3VibGUpdmFsOwogICAgIH0KICAgICBpZiAoIGxlbiA9PSAwICkKLSAgICAgICAgdmFsID0gMDsKKyAgICAgICAgcmVzID0gMDsKICAgICBlbHNlCi0gICAgICAgIHZhbCA9IChpbnQpc3FydChzdW1fc3F1YXJlcyAvIChkb3VibGUpKGxlbi9zaXplKSk7Ci0gICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CisgICAgICAgIHJlcyA9ICh1bnNpZ25lZCBpbnQpc3FydChzdW1fc3F1YXJlcyAvIChkb3VibGUpKGxlbi9zaXplKSk7CisgICAgaWYgKHJlcyA8PSBJTlRfTUFYKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcocmVzKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyhyZXMpOwogfQogCiBzdGF0aWMgZG91YmxlIF9zdW0yKHNob3J0ICphLCBzaG9ydCAqYiwgaW50IGxlbikKQEAgLTYyMCw1MiArNjQzLDQ5IEBACiAgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMCwgcHJldnZhbCA9IDAsIHByZXZleHRyZW1ldmFsaWQgPSAwLAogICAgICAgICBwcmV2ZXh0cmVtZSA9IDA7CiAgICAgaW50IGk7Ci0gICAgZG91YmxlIGF2ZyA9IDAuMDsKLSAgICBpbnQgZGlmZiwgcHJldmRpZmYsIGV4dHJlbWVkaWZmLCBuZXh0cmVtZSA9IDA7CisgICAgZG91YmxlIHN1bSA9IDAuMDsKKyAgICB1bnNpZ25lZCBpbnQgYXZnOworICAgIGludCBkaWZmLCBwcmV2ZGlmZiwgbmV4dHJlbWUgPSAwOwogCiAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOmF2Z3BwIiwgJmNwLCAmbGVuLCAmc2l6ZSkgKQogICAgICAgICByZXR1cm4gMDsKICAgICBpZiAoIWF1ZGlvb3BfY2hlY2tfcGFyYW1ldGVycyhsZW4sIHNpemUpKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAvKiBDb21wdXRlIGZpcnN0IGRlbHRhIHZhbHVlIGFoZWFkLiBBbHNvIGF1dG9tYXRpY2FsbHkgbWFrZXMgdXMKLSAgICAqKiBza2lwIHRoZSBmaXJzdCBleHRyZW1lIHZhbHVlCi0gICAgKi8KKyAgICBpZiAobGVuIDw9IHNpemUqMikKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKDApOwogICAgIGlmICggc2l6ZSA9PSAxICkgICAgICBwcmV2dmFsID0gKGludCkqQ0hBUlAoY3AsIDApOwogICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSBwcmV2dmFsID0gKGludCkqU0hPUlRQKGNwLCAwKTsKICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgcHJldnZhbCA9IChpbnQpKkxPTkdQKGNwLCAwKTsKLSAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIHNpemUpOwotICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIHNpemUpOwotICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgc2l6ZSk7Ci0gICAgcHJldmRpZmYgPSB2YWwgLSBwcmV2dmFsOwotCisgICAgcHJldmRpZmYgPSAxNzsgLyogQW55dGhpbmcgIT0gMCwgMSAqLwogICAgIGZvciAoIGk9c2l6ZTsgaTxsZW47IGkrPSBzaXplKSB7CiAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7CiAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOwogICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOwotICAgICAgICBkaWZmID0gdmFsIC0gcHJldnZhbDsKLSAgICAgICAgaWYgKCBkaWZmKnByZXZkaWZmIDwgMCApIHsKLSAgICAgICAgICAgIC8qIERlcml2YXRpdmUgY2hhbmdlZCBzaWduLiBDb21wdXRlIGRpZmZlcmVuY2UgdG8gbGFzdAotICAgICAgICAgICAgKiogZXh0cmVtZSB2YWx1ZSBhbmQgcmVtZW1iZXIuCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCBwcmV2ZXh0cmVtZXZhbGlkICkgewotICAgICAgICAgICAgICAgIGV4dHJlbWVkaWZmID0gcHJldnZhbCAtIHByZXZleHRyZW1lOwotICAgICAgICAgICAgICAgIGlmICggZXh0cmVtZWRpZmYgPCAwICkKLSAgICAgICAgICAgICAgICAgICAgZXh0cmVtZWRpZmYgPSAtZXh0cmVtZWRpZmY7Ci0gICAgICAgICAgICAgICAgYXZnICs9IGV4dHJlbWVkaWZmOwotICAgICAgICAgICAgICAgIG5leHRyZW1lKys7CisgICAgICAgIGlmICh2YWwgIT0gcHJldnZhbCkgeworICAgICAgICAgICAgZGlmZiA9IHZhbCA8IHByZXZ2YWw7CisgICAgICAgICAgICBpZiAocHJldmRpZmYgPT0gIWRpZmYpIHsKKyAgICAgICAgICAgICAgICAvKiBEZXJpdmF0aXZlIGNoYW5nZWQgc2lnbi4gQ29tcHV0ZSBkaWZmZXJlbmNlIHRvIGxhc3QKKyAgICAgICAgICAgICAgICAqKiBleHRyZW1lIHZhbHVlIGFuZCByZW1lbWJlci4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChwcmV2ZXh0cmVtZXZhbGlkKSB7CisgICAgICAgICAgICAgICAgICAgIHN1bSArPSBmYWJzKChkb3VibGUpcHJldnZhbCAtIChkb3VibGUpcHJldmV4dHJlbWUpOworICAgICAgICAgICAgICAgICAgICBuZXh0cmVtZSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmV2ZXh0cmVtZXZhbGlkID0gMTsKKyAgICAgICAgICAgICAgICBwcmV2ZXh0cmVtZSA9IHByZXZ2YWw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmV2ZXh0cmVtZXZhbGlkID0gMTsKLSAgICAgICAgICAgIHByZXZleHRyZW1lID0gcHJldnZhbDsKLSAgICAgICAgfQotICAgICAgICBwcmV2dmFsID0gdmFsOwotICAgICAgICBpZiAoIGRpZmYgIT0gMCApCisgICAgICAgICAgICBwcmV2dmFsID0gdmFsOwogICAgICAgICAgICAgcHJldmRpZmYgPSBkaWZmOworICAgICAgICB9CiAgICAgfQogICAgIGlmICggbmV4dHJlbWUgPT0gMCApCi0gICAgICAgIHZhbCA9IDA7CisgICAgICAgIGF2ZyA9IDA7CiAgICAgZWxzZQotICAgICAgICB2YWwgPSAoaW50KShhdmcgLyAoZG91YmxlKW5leHRyZW1lKTsKLSAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKKyAgICAgICAgYXZnID0gKHVuc2lnbmVkIGludCkoc3VtIC8gKGRvdWJsZSluZXh0cmVtZSk7CisgICAgaWYgKGF2ZyA8PSBJTlRfTUFYKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoYXZnKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyhhdmcpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtNjc1LDQ4ICs2OTUsNTAgQEAKICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwLCBwcmV2dmFsID0gMCwgcHJldmV4dHJlbWV2YWxpZCA9IDAsCiAgICAgICAgIHByZXZleHRyZW1lID0gMDsKICAgICBpbnQgaTsKLSAgICBpbnQgbWF4ID0gMDsKLSAgICBpbnQgZGlmZiwgcHJldmRpZmYsIGV4dHJlbWVkaWZmOworICAgIHVuc2lnbmVkIGludCBtYXggPSAwLCBleHRyZW1lZGlmZjsKKyAgICBpbnQgZGlmZiwgcHJldmRpZmY7CiAKICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6bWF4cHAiLCAmY3AsICZsZW4sICZzaXplKSApCiAgICAgICAgIHJldHVybiAwOwogICAgIGlmICghYXVkaW9vcF9jaGVja19wYXJhbWV0ZXJzKGxlbiwgc2l6ZSkpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIC8qIENvbXB1dGUgZmlyc3QgZGVsdGEgdmFsdWUgYWhlYWQuIEFsc28gYXV0b21hdGljYWxseSBtYWtlcyB1cwotICAgICoqIHNraXAgdGhlIGZpcnN0IGV4dHJlbWUgdmFsdWUKLSAgICAqLworICAgIGlmIChsZW4gPD0gc2l6ZSkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKDApOwogICAgIGlmICggc2l6ZSA9PSAxICkgICAgICBwcmV2dmFsID0gKGludCkqQ0hBUlAoY3AsIDApOwogICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSBwcmV2dmFsID0gKGludCkqU0hPUlRQKGNwLCAwKTsKICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgcHJldnZhbCA9IChpbnQpKkxPTkdQKGNwLCAwKTsKLSAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIHNpemUpOwotICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIHNpemUpOwotICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgc2l6ZSk7Ci0gICAgcHJldmRpZmYgPSB2YWwgLSBwcmV2dmFsOwotCisgICAgcHJldmRpZmYgPSAxNzsgLyogQW55dGhpbmcgIT0gMCwgMSAqLwogICAgIGZvciAoIGk9c2l6ZTsgaTxsZW47IGkrPSBzaXplKSB7CiAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7CiAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOwogICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOwotICAgICAgICBkaWZmID0gdmFsIC0gcHJldnZhbDsKLSAgICAgICAgaWYgKCBkaWZmKnByZXZkaWZmIDwgMCApIHsKLSAgICAgICAgICAgIC8qIERlcml2YXRpdmUgY2hhbmdlZCBzaWduLiBDb21wdXRlIGRpZmZlcmVuY2UgdG8KLSAgICAgICAgICAgICoqIGxhc3QgZXh0cmVtZSB2YWx1ZSBhbmQgcmVtZW1iZXIuCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCBwcmV2ZXh0cmVtZXZhbGlkICkgewotICAgICAgICAgICAgICAgIGV4dHJlbWVkaWZmID0gcHJldnZhbCAtIHByZXZleHRyZW1lOwotICAgICAgICAgICAgICAgIGlmICggZXh0cmVtZWRpZmYgPCAwICkKLSAgICAgICAgICAgICAgICAgICAgZXh0cmVtZWRpZmYgPSAtZXh0cmVtZWRpZmY7Ci0gICAgICAgICAgICAgICAgaWYgKCBleHRyZW1lZGlmZiA+IG1heCApCi0gICAgICAgICAgICAgICAgICAgIG1heCA9IGV4dHJlbWVkaWZmOworICAgICAgICBpZiAodmFsICE9IHByZXZ2YWwpIHsKKyAgICAgICAgICAgIGRpZmYgPSB2YWwgPCBwcmV2dmFsOworICAgICAgICAgICAgaWYgKHByZXZkaWZmID09ICFkaWZmKSB7CisgICAgICAgICAgICAgICAgLyogRGVyaXZhdGl2ZSBjaGFuZ2VkIHNpZ24uIENvbXB1dGUgZGlmZmVyZW5jZSB0bworICAgICAgICAgICAgICAgICoqIGxhc3QgZXh0cmVtZSB2YWx1ZSBhbmQgcmVtZW1iZXIuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAocHJldmV4dHJlbWV2YWxpZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocHJldnZhbCA8IHByZXZleHRyZW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmVtZWRpZmYgPSAodW5zaWduZWQgaW50KXByZXZleHRyZW1lIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClwcmV2dmFsOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBleHRyZW1lZGlmZiA9ICh1bnNpZ25lZCBpbnQpcHJldnZhbCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpcHJldmV4dHJlbWU7CisgICAgICAgICAgICAgICAgICAgIGlmICggZXh0cmVtZWRpZmYgPiBtYXggKQorICAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gZXh0cmVtZWRpZmY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByZXZleHRyZW1ldmFsaWQgPSAxOworICAgICAgICAgICAgICAgIHByZXZleHRyZW1lID0gcHJldnZhbDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByZXZleHRyZW1ldmFsaWQgPSAxOwotICAgICAgICAgICAgcHJldmV4dHJlbWUgPSBwcmV2dmFsOwotICAgICAgICB9Ci0gICAgICAgIHByZXZ2YWwgPSB2YWw7Ci0gICAgICAgIGlmICggZGlmZiAhPSAwICkKKyAgICAgICAgICAgIHByZXZ2YWwgPSB2YWw7CiAgICAgICAgICAgICBwcmV2ZGlmZiA9IGRpZmY7CisgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKG1heCk7CisgICAgaWYgKG1heCA8PSBJTlRfTUFYKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcobWF4KTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyhtYXgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtNzQ5LDcgKzc3MSw3IEBACiB7CiAgICAgc2lnbmVkIGNoYXIgKmNwLCAqbmNwOwogICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7Ci0gICAgZG91YmxlIGZhY3RvciwgZnZhbCwgbWF4dmFsOworICAgIGRvdWJsZSBmYWN0b3IsIGZ2YWwsIG1heHZhbCwgbWludmFsOwogICAgIFB5T2JqZWN0ICpydjsKICAgICBpbnQgaTsKIApAQCAtNzU4LDEzICs3ODAsOCBAQAogICAgIGlmICghYXVkaW9vcF9jaGVja19wYXJhbWV0ZXJzKGxlbiwgc2l6ZSkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgaWYgKCBzaXplID09IDEgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmOwotICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmY7Ci0gICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIG1heHZhbCA9IChkb3VibGUpIDB4N2ZmZmZmZmY7Ci0gICAgZWxzZSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIG1heHZhbCA9IChkb3VibGUpIG1heHZhbHNbc2l6ZV07CisgICAgbWludmFsID0gKGRvdWJsZSkgbWludmFsc1tzaXplXTsKIAogICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKTsKICAgICBpZiAoIHJ2ID09IDAgKQpAQCAtNzc3LDkgKzc5NCw3IEBACiAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOwogICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOwogICAgICAgICBmdmFsID0gKGRvdWJsZSl2YWwqZmFjdG9yOwotICAgICAgICBpZiAoIGZ2YWwgPiBtYXh2YWwgKSBmdmFsID0gbWF4dmFsOwotICAgICAgICBlbHNlIGlmICggZnZhbCA8IC1tYXh2YWwgKSBmdmFsID0gLW1heHZhbDsKLSAgICAgICAgdmFsID0gKGludClmdmFsOworICAgICAgICB2YWwgPSAoaW50KWZsb29yKGZib3VuZChmdmFsLCBtaW52YWwsIG1heHZhbCkpOwogICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpdmFsOwogICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkpID0gKHNob3J0KXZhbDsKICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKXZhbDsKQEAgLTc5Miw3ICs4MDcsNyBAQAogewogICAgIHNpZ25lZCBjaGFyICpjcCwgKm5jcDsKICAgICBpbnQgbGVuLCBzaXplLCB2YWwxID0gMCwgdmFsMiA9IDA7Ci0gICAgZG91YmxlIGZhYzEsIGZhYzIsIGZ2YWwsIG1heHZhbDsKKyAgICBkb3VibGUgZmFjMSwgZmFjMiwgZnZhbCwgbWF4dmFsLCBtaW52YWw7CiAgICAgUHlPYmplY3QgKnJ2OwogICAgIGludCBpOwogCkBAIC04MDYsMTMgKzgyMSw4IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGlmICggc2l6ZSA9PSAxICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZjsKLSAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmOwotICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmZmZmZmOwotICAgIGVsc2UgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICBtYXh2YWwgPSAoZG91YmxlKSBtYXh2YWxzW3NpemVdOworICAgIG1pbnZhbCA9IChkb3VibGUpIG1pbnZhbHNbc2l6ZV07CiAKICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbi8yKTsKICAgICBpZiAoIHJ2ID09IDAgKQpAQCAtODI4LDkgKzgzOCw3IEBACiAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwyID0gKGludCkqU0hPUlRQKGNwLCBpKzIpOwogICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsMiA9IChpbnQpKkxPTkdQKGNwLCBpKzQpOwogICAgICAgICBmdmFsID0gKGRvdWJsZSl2YWwxKmZhYzEgKyAoZG91YmxlKXZhbDIqZmFjMjsKLSAgICAgICAgaWYgKCBmdmFsID4gbWF4dmFsICkgZnZhbCA9IG1heHZhbDsKLSAgICAgICAgZWxzZSBpZiAoIGZ2YWwgPCAtbWF4dmFsICkgZnZhbCA9IC1tYXh2YWw7Ci0gICAgICAgIHZhbDEgPSAoaW50KWZ2YWw7CisgICAgICAgIHZhbDEgPSAoaW50KWZsb29yKGZib3VuZChmdmFsLCBtaW52YWwsIG1heHZhbCkpOwogICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaS8yKSA9IChzaWduZWQgY2hhcil2YWwxOwogICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkvMikgPSAoc2hvcnQpdmFsMTsKICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkvMik9IChQeV9JbnQzMil2YWwxOwpAQCAtODQzLDcgKzg1MSw3IEBACiB7CiAgICAgc2lnbmVkIGNoYXIgKmNwLCAqbmNwOwogICAgIGludCBsZW4sIHNpemUsIHZhbDEsIHZhbDIsIHZhbCA9IDA7Ci0gICAgZG91YmxlIGZhYzEsIGZhYzIsIGZ2YWwsIG1heHZhbDsKKyAgICBkb3VibGUgZmFjMSwgZmFjMiwgZnZhbCwgbWF4dmFsLCBtaW52YWw7CiAgICAgUHlPYmplY3QgKnJ2OwogICAgIGludCBpOwogCkBAIC04NTMsMTMgKzg2MSw4IEBACiAgICAgaWYgKCFhdWRpb29wX2NoZWNrX3BhcmFtZXRlcnMobGVuLCBzaXplKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBpZiAoIHNpemUgPT0gMSApIG1heHZhbCA9IChkb3VibGUpIDB4N2Y7Ci0gICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIG1heHZhbCA9IChkb3VibGUpIDB4N2ZmZjsKLSAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmZmZmZjsKLSAgICBlbHNlIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgbWF4dmFsID0gKGRvdWJsZSkgbWF4dmFsc1tzaXplXTsKKyAgICBtaW52YWwgPSAoZG91YmxlKSBtaW52YWxzW3NpemVdOwogCiAgICAgaWYgKGxlbiA+IElOVF9NQVgvMikgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCkBAIC04NzksMTQgKzg4MiwxMCBAQAogICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOwogCiAgICAgICAgIGZ2YWwgPSAoZG91YmxlKXZhbCpmYWMxOwotICAgICAgICBpZiAoIGZ2YWwgPiBtYXh2YWwgKSBmdmFsID0gbWF4dmFsOwotICAgICAgICBlbHNlIGlmICggZnZhbCA8IC1tYXh2YWwgKSBmdmFsID0gLW1heHZhbDsKLSAgICAgICAgdmFsMSA9IChpbnQpZnZhbDsKKyAgICAgICAgdmFsMSA9IChpbnQpZmxvb3IoZmJvdW5kKGZ2YWwsIG1pbnZhbCwgbWF4dmFsKSk7CiAKICAgICAgICAgZnZhbCA9IChkb3VibGUpdmFsKmZhYzI7Ci0gICAgICAgIGlmICggZnZhbCA+IG1heHZhbCApIGZ2YWwgPSBtYXh2YWw7Ci0gICAgICAgIGVsc2UgaWYgKCBmdmFsIDwgLW1heHZhbCApIGZ2YWwgPSAtbWF4dmFsOwotICAgICAgICB2YWwyID0gKGludClmdmFsOworICAgICAgICB2YWwyID0gKGludClmbG9vcihmYm91bmQoZnZhbCwgbWludmFsLCBtYXh2YWwpKTsKIAogICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSoyKSA9IChzaWduZWQgY2hhcil2YWwxOwogICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkqMikgPSAoc2hvcnQpdmFsMTsKQEAgLTkwMyw3ICs5MDIsNyBAQAogYXVkaW9vcF9hZGQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogICAgIHNpZ25lZCBjaGFyICpjcDEsICpjcDIsICpuY3A7Ci0gICAgaW50IGxlbjEsIGxlbjIsIHNpemUsIHZhbDEgPSAwLCB2YWwyID0gMCwgbWF4dmFsLCBuZXd2YWw7CisgICAgaW50IGxlbjEsIGxlbjIsIHNpemUsIHZhbDEgPSAwLCB2YWwyID0gMCwgbWludmFsLCBtYXh2YWwsIG5ld3ZhbDsKICAgICBQeU9iamVjdCAqcnY7CiAgICAgaW50IGk7CiAKQEAgLTkxNywxMyArOTE2LDggQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgaWYgKCBzaXplID09IDEgKSBtYXh2YWwgPSAweDdmOwotICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSBtYXh2YWwgPSAweDdmZmY7Ci0gICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIG1heHZhbCA9IDB4N2ZmZmZmZmY7Ci0gICAgZWxzZSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIG1heHZhbCA9IG1heHZhbHNbc2l6ZV07CisgICAgbWludmFsID0gbWludmFsc1tzaXplXTsKIAogICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuMSk7CiAgICAgaWYgKCBydiA9PSAwICkKQEAgLTkzOSwxMiArOTMzLDE5IEBACiAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwyID0gKGludCkqU0hPUlRQKGNwMiwgaSk7CiAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwyID0gKGludCkqTE9OR1AoY3AyLCBpKTsKIAotICAgICAgICBuZXd2YWwgPSB2YWwxICsgdmFsMjsKLSAgICAgICAgLyogdHJ1bmNhdGUgaW4gY2FzZSBvZiBvdmVyZmxvdyAqLwotICAgICAgICBpZiAobmV3dmFsID4gbWF4dmFsKSBuZXd2YWwgPSBtYXh2YWw7Ci0gICAgICAgIGVsc2UgaWYgKG5ld3ZhbCA8IC1tYXh2YWwpIG5ld3ZhbCA9IC1tYXh2YWw7Ci0gICAgICAgIGVsc2UgaWYgKHNpemUgPT0gNCAmJiAobmV3dmFsXnZhbDEpIDwgMCAmJiAobmV3dmFsXnZhbDIpIDwgMCkKLSAgICAgICAgICAgIG5ld3ZhbCA9IHZhbDEgPiAwID8gbWF4dmFsIDogLSBtYXh2YWw7CisgICAgICAgIGlmIChzaXplIDwgNCkgeworICAgICAgICAgICAgbmV3dmFsID0gdmFsMSArIHZhbDI7CisgICAgICAgICAgICAvKiB0cnVuY2F0ZSBpbiBjYXNlIG9mIG92ZXJmbG93ICovCisgICAgICAgICAgICBpZiAobmV3dmFsID4gbWF4dmFsKQorICAgICAgICAgICAgICAgIG5ld3ZhbCA9IG1heHZhbDsKKyAgICAgICAgICAgIGVsc2UgaWYgKG5ld3ZhbCA8IG1pbnZhbCkKKyAgICAgICAgICAgICAgICBuZXd2YWwgPSBtaW52YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBkb3VibGUgZnZhbCA9IChkb3VibGUpdmFsMSArIChkb3VibGUpdmFsMjsKKyAgICAgICAgICAgIC8qIHRydW5jYXRlIGluIGNhc2Ugb2Ygb3ZlcmZsb3cgKi8KKyAgICAgICAgICAgIG5ld3ZhbCA9IChpbnQpZmxvb3IoZmJvdW5kKGZ2YWwsIG1pbnZhbCwgbWF4dmFsKSk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpbmV3dmFsOwogICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkpID0gKHNob3J0KW5ld3ZhbDsKQEAgLTk1Nyw3ICs5NTgsOCBAQAogYXVkaW9vcF9iaWFzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKICAgICBzaWduZWQgY2hhciAqY3AsICpuY3A7Ci0gICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKKyAgICBpbnQgbGVuLCBzaXplOworICAgIHVuc2lnbmVkIGludCB2YWwgPSAwLCBtYXNrOwogICAgIFB5T2JqZWN0ICpydjsKICAgICBpbnQgaTsKICAgICBpbnQgYmlhczsKQEAgLTk3NCwxNSArOTc2LDIwIEBACiAgICAgICAgIHJldHVybiAwOwogICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKIAorICAgIG1hc2sgPSBtYXNrc1tzaXplXTsKIAogICAgIGZvciAoIGk9MDsgaSA8IGxlbjsgaSArPSBzaXplICkgewotICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOwotICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLSAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9ICh1bnNpZ25lZCBpbnQpKHVuc2lnbmVkIGNoYXIpKkNIQVJQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9ICh1bnNpZ25lZCBpbnQpKHVuc2lnbmVkIHNob3J0KSpTSE9SVFAoY3AsIGkpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKHVuc2lnbmVkIGludCkoUHlfVUludDMyKSpMT05HUChjcCwgaSk7CiAKLSAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGkpID0gKHNpZ25lZCBjaGFyKSh2YWwrYmlhcyk7Ci0gICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSkgPSAoc2hvcnQpKHZhbCtiaWFzKTsKLSAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKSh2YWwrYmlhcyk7CisgICAgICAgIHZhbCArPSAodW5zaWduZWQgaW50KWJpYXM7CisgICAgICAgIC8qIHdyYXAgYXJvdW5kIGluIGNhc2Ugb2Ygb3ZlcmZsb3cgKi8KKyAgICAgICAgdmFsICY9IG1hc2s7CisKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGkpID0gKHNpZ25lZCBjaGFyKSh1bnNpZ25lZCBjaGFyKXZhbDsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKSA9IChzaG9ydCkodW5zaWduZWQgc2hvcnQpdmFsOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSkgPSAoUHlfSW50MzIpKFB5X1VJbnQzMil2YWw7CiAgICAgfQogICAgIHJldHVybiBydjsKIH0KQEAgLTEwMDksMTUgKzEwMTYsMTUgQEAKICAgICBuY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKIAogICAgIGZvciAoIGk9MDsgaSA8IGxlbjsgaSArPSBzaXplICkgewotICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKChpbnQpKkNIQVJQKGNwLCBpKSkgPDwgODsKLSAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0gICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoKGludCkqTE9OR1AoY3AsIGkpKSA+PiAxNjsKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9ICgoaW50KSpDSEFSUChjcCwgaSkpIDw8IDI0OworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKChpbnQpKlNIT1JUUChjcCwgaSkpIDw8IDE2OworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOwogCiAgICAgICAgIGogPSBsZW4gLSBpIC0gc2l6ZTsKIAotICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaikgPSAoc2lnbmVkIGNoYXIpKHZhbCA+PiA4KTsKLSAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBqKSA9IChzaG9ydCkodmFsKTsKLSAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGopID0gKFB5X0ludDMyKSh2YWw8PDE2KTsKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGopID0gKHNpZ25lZCBjaGFyKSh2YWwgPj4gMjQpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGopID0gKHNob3J0KSh2YWwgPj4gMTYpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaikgPSAoUHlfSW50MzIpdmFsOwogICAgIH0KICAgICByZXR1cm4gcnY7CiB9CkBAIC0xMDUxLDEzICsxMDU4LDEzIEBACiAgICAgbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CiAKICAgICBmb3IgKCBpPTAsIGo9MDsgaSA8IGxlbjsgaSArPSBzaXplLCBqICs9IHNpemUyICkgewotICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKChpbnQpKkNIQVJQKGNwLCBpKSkgPDwgODsKLSAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0gICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoKGludCkqTE9OR1AoY3AsIGkpKSA+PiAxNjsKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9ICgoaW50KSpDSEFSUChjcCwgaSkpIDw8IDI0OworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKChpbnQpKlNIT1JUUChjcCwgaSkpIDw8IDE2OworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOwogCi0gICAgICAgIGlmICggc2l6ZTIgPT0gMSApICAqQ0hBUlAobmNwLCBqKSA9IChzaWduZWQgY2hhcikodmFsID4+IDgpOwotICAgICAgICBlbHNlIGlmICggc2l6ZTIgPT0gMiApICpTSE9SVFAobmNwLCBqKSA9IChzaG9ydCkodmFsKTsKLSAgICAgICAgZWxzZSBpZiAoIHNpemUyID09IDQgKSAqTE9OR1AobmNwLCBqKSA9IChQeV9JbnQzMikodmFsPDwxNik7CisgICAgICAgIGlmICggc2l6ZTIgPT0gMSApICAqQ0hBUlAobmNwLCBqKSA9IChzaWduZWQgY2hhcikodmFsID4+IDI0KTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUyID09IDIgKSAqU0hPUlRQKG5jcCwgaikgPSAoc2hvcnQpKHZhbCA+PiAxNik7CisgICAgICAgIGVsc2UgaWYgKCBzaXplMiA9PSA0ICkgKkxPTkdQKG5jcCwgaikgPSAoUHlfSW50MzIpdmFsOwogICAgIH0KICAgICByZXR1cm4gcnY7CiB9CkBAIC0xMTIwLDYgKzExMjcsMTAgQEAKICAgICBkID0gZ2NkKGlucmF0ZSwgb3V0cmF0ZSk7CiAgICAgaW5yYXRlIC89IGQ7CiAgICAgb3V0cmF0ZSAvPSBkOworICAgIC8qIGRpdmlkZSB3ZWlnaHRBIGFuZCB3ZWlnaHRCIGJ5IHRoZWlyIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yICovCisgICAgZCA9IGdjZCh3ZWlnaHRBLCB3ZWlnaHRCKTsKKyAgICB3ZWlnaHRBIC89IGQ7CisgICAgd2VpZ2h0QSAvPSBkOwogCiAgICAgaWYgKChzaXplX3QpbmNoYW5uZWxzID4gUFlfU0laRV9NQVgvc2l6ZW9mKGludCkpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLApAQCAtMTE1OSw3ICsxMTcwLDkgQEAKICAgICB9CiAKICAgICAvKiBzdHIgPC0gU3BhY2UgZm9yIHRoZSBvdXRwdXQgYnVmZmVyLiAqLwotICAgIHsKKyAgICBpZiAobGVuID09IDApCisgICAgICAgIHN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDApOworICAgIGVsc2UgewogICAgICAgICAvKiBUaGVyZSBhcmUgbGVuIGlucHV0IGZyYW1lcywgc28gd2UgbmVlZCAobWF0aGVtYXRpY2FsbHkpCiAgICAgICAgICAgIGNlaWxpbmcobGVuKm91dHJhdGUvaW5yYXRlKSBvdXRwdXQgZnJhbWVzLCBhbmQgZWFjaCBmcmFtZQogICAgICAgICAgICByZXF1aXJlcyBieXRlc19wZXJfZnJhbWUgYnl0ZXMuICBDb21wdXRpbmcgdGhpcwpAQCAtMTE3NCwxMiArMTE4NywxMSBAQAogICAgICAgICBlbHNlCiAgICAgICAgICAgICBzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSAqIG91dHJhdGUgKiBieXRlc19wZXJfZnJhbWUpOwotCi0gICAgICAgIGlmIChzdHIgPT0gTlVMTCkgewotICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAotICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIG1lbW9yeSBmb3Igb3V0cHV0IGJ1ZmZlciIpOwotICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICB9CisgICAgfQorICAgIGlmIChzdHIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCisgICAgICAgICAgICAibm90IGVub3VnaCBtZW1vcnkgZm9yIG91dHB1dCBidWZmZXIiKTsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICBuY3AgPSBQeVN0cmluZ19Bc1N0cmluZyhzdHIpOwogCkBAIC0xMjE0LDMyICsxMjI2LDMyIEBACiAgICAgICAgICAgICBmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbmNoYW5uZWxzOyBjaGFuKyspIHsKICAgICAgICAgICAgICAgICBwcmV2X2lbY2hhbl0gPSBjdXJfaVtjaGFuXTsKICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAxKQotICAgICAgICAgICAgICAgICAgICBjdXJfaVtjaGFuXSA9ICgoaW50KSpDSEFSUChjcCwgMCkpIDw8IDg7CisgICAgICAgICAgICAgICAgICAgIGN1cl9pW2NoYW5dID0gKChpbnQpKkNIQVJQKGNwLCAwKSkgPDwgMjQ7CiAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAyKQotICAgICAgICAgICAgICAgICAgICBjdXJfaVtjaGFuXSA9IChpbnQpKlNIT1JUUChjcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIGN1cl9pW2NoYW5dID0gKChpbnQpKlNIT1JUUChjcCwgMCkpIDw8IDE2OwogICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gNCkKLSAgICAgICAgICAgICAgICAgICAgY3VyX2lbY2hhbl0gPSAoKGludCkqTE9OR1AoY3AsIDApKSA+PiAxNjsKKyAgICAgICAgICAgICAgICAgICAgY3VyX2lbY2hhbl0gPSAoaW50KSpMT05HUChjcCwgMCk7CiAgICAgICAgICAgICAgICAgY3AgKz0gc2l6ZTsKICAgICAgICAgICAgICAgICAvKiBpbXBsZW1lbnRzIGEgc2ltcGxlIGRpZ2l0YWwgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgY3VyX2lbY2hhbl0gPQotICAgICAgICAgICAgICAgICAgICAod2VpZ2h0QSAqIGN1cl9pW2NoYW5dICsKLSAgICAgICAgICAgICAgICAgICAgIHdlaWdodEIgKiBwcmV2X2lbY2hhbl0pIC8KLSAgICAgICAgICAgICAgICAgICAgKHdlaWdodEEgKyB3ZWlnaHRCKTsKKyAgICAgICAgICAgICAgICBjdXJfaVtjaGFuXSA9IChpbnQpKAorICAgICAgICAgICAgICAgICAgICAoKGRvdWJsZSl3ZWlnaHRBICogKGRvdWJsZSljdXJfaVtjaGFuXSArCisgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKXdlaWdodEIgKiAoZG91YmxlKXByZXZfaVtjaGFuXSkgLworICAgICAgICAgICAgICAgICAgICAoKGRvdWJsZSl3ZWlnaHRBICsgKGRvdWJsZSl3ZWlnaHRCKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBsZW4tLTsKICAgICAgICAgICAgIGQgKz0gb3V0cmF0ZTsKICAgICAgICAgfQogICAgICAgICB3aGlsZSAoZCA+PSAwKSB7CiAgICAgICAgICAgICBmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbmNoYW5uZWxzOyBjaGFuKyspIHsKLSAgICAgICAgICAgICAgICBjdXJfbyA9IChwcmV2X2lbY2hhbl0gKiBkICsKLSAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfaVtjaGFuXSAqIChvdXRyYXRlIC0gZCkpIC8KLSAgICAgICAgICAgICAgICAgICAgb3V0cmF0ZTsKKyAgICAgICAgICAgICAgICBjdXJfbyA9IChpbnQpKCgoZG91YmxlKXByZXZfaVtjaGFuXSAqIChkb3VibGUpZCArCisgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSljdXJfaVtjaGFuXSAqIChkb3VibGUpKG91dHJhdGUgLSBkKSkgLworICAgICAgICAgICAgICAgICAgICAoZG91YmxlKW91dHJhdGUpOwogICAgICAgICAgICAgICAgIGlmIChzaXplID09IDEpCi0gICAgICAgICAgICAgICAgICAgICpDSEFSUChuY3AsIDApID0gKHNpZ25lZCBjaGFyKShjdXJfbyA+PiA4KTsKKyAgICAgICAgICAgICAgICAgICAgKkNIQVJQKG5jcCwgMCkgPSAoc2lnbmVkIGNoYXIpKGN1cl9vID4+IDI0KTsKICAgICAgICAgICAgICAgICBlbHNlIGlmIChzaXplID09IDIpCi0gICAgICAgICAgICAgICAgICAgICpTSE9SVFAobmNwLCAwKSA9IChzaG9ydCkoY3VyX28pOworICAgICAgICAgICAgICAgICAgICAqU0hPUlRQKG5jcCwgMCkgPSAoc2hvcnQpKGN1cl9vID4+IDE2KTsKICAgICAgICAgICAgICAgICBlbHNlIGlmIChzaXplID09IDQpCi0gICAgICAgICAgICAgICAgICAgICpMT05HUChuY3AsIDApID0gKFB5X0ludDMyKShjdXJfbzw8MTYpOworICAgICAgICAgICAgICAgICAgICAqTE9OR1AobmNwLCAwKSA9IChQeV9JbnQzMikoY3VyX28pOwogICAgICAgICAgICAgICAgIG5jcCArPSBzaXplOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZCAtPSBpbnJhdGU7CkBAIC0xMjk4LDcgKzEzMTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSkgKQogICAgICAgICByZXR1cm4gMDsKIAotICAgIGlmICghYXVkaW9vcF9jaGVja19wYXJhbWV0ZXJzKGxlbiwgc2l6ZSkpCisgICAgaWYgKCFhdWRpb29wX2NoZWNrX3NpemUoc2l6ZSkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKGxlbiA+IElOVF9NQVgvc2l6ZSkgewpAQCAtMTM2Nyw3ICsxMzc5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcCwgJmxlbiwgJnNpemUpICkKICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBpZiAoIWF1ZGlvb3BfY2hlY2tfcGFyYW1ldGVycyhsZW4sIHNpemUpKQorICAgIGlmICghYXVkaW9vcF9jaGVja19zaXplKHNpemUpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChsZW4gPiBJTlRfTUFYL3NpemUpIHsKQEAgLTE1MDksNyArMTUyMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplLCAmc3RhdGUpICkKICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBpZiAoIWF1ZGlvb3BfY2hlY2tfcGFyYW1ldGVycyhsZW4sIHNpemUpKQorICAgIGlmICghYXVkaW9vcF9jaGVja19zaXplKHNpemUpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIC8qIERlY29kZSBzdGF0ZSwgc2hvdWxkIGhhdmUgKHZhbHVlLCBzdGVwKSAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9iaW5hc2NpaS5jIGIvTW9kdWxlcy9iaW5hc2NpaS5jCmluZGV4IDgzMzRmZTUuLjBiNDkyZDUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvYmluYXNjaWkuYworKysgYi9Nb2R1bGVzL2JpbmFzY2lpLmMKQEAgLTMyMCwxMiArMzIwLDEwIEBACiAgICAgfQogICAgICphc2NpaV9kYXRhKysgPSAnXG4nOyAgICAgICAvKiBBcHBlbmQgYSBjb3VydGVzeSBuZXdsaW5lICovCiAKLSAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcnYsCisgICAgLyogcnYgaXMgY2xlYXJlZCBvbiBlcnJvciAqLworICAgICh2b2lkKV9QeVN0cmluZ19SZXNpemUoJnJ2LAogICAgICAgICAgICAgICAgICAgICAgICAoYXNjaWlfZGF0YSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FTX1NUUklORyhydikpKSA8IDApIHsKLSAgICAgICAgUHlfREVDUkVGKHJ2KTsKLSAgICAgICAgcnYgPSBOVUxMOwotICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKHJ2KSkpOwogICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBiaW4pOwogICAgIHJldHVybiBydjsKIH0KQEAgLTQ1MiwxMCArNDUwLDggQEAKICAgICAqKiBzdHJpbmcgaW5zdGVhZDsgX1B5U3RyaW5nX1Jlc2l6ZSgpIHdvbid0IGRvIHRoaXMgZm9yIHVzLgogICAgICovCiAgICAgaWYgKGJpbl9sZW4gPiAwKSB7Ci0gICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZydiwgYmluX2xlbikgPCAwKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYocnYpOwotICAgICAgICAgICAgcnYgPSBOVUxMOwotICAgICAgICB9CisgICAgICAgIC8qIHJ2IGlzIGNsZWFyZWQgb24gZXJyb3IgKi8KKyAgICAgICAgKHZvaWQpX1B5U3RyaW5nX1Jlc2l6ZSgmcnYsIGJpbl9sZW4pOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgUHlfREVDUkVGKHJ2KTsKQEAgLTUyMiwxMiArNTE4LDEwIEBACiAgICAgfQogICAgICphc2NpaV9kYXRhKysgPSAnXG4nOyAgICAgICAvKiBBcHBlbmQgYSBjb3VydGVzeSBuZXdsaW5lICovCiAKLSAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcnYsCisgICAgLyogcnYgaXMgY2xlYXJlZCBvbiBlcnJvciAqLworICAgICh2b2lkKV9QeVN0cmluZ19SZXNpemUoJnJ2LAogICAgICAgICAgICAgICAgICAgICAgICAoYXNjaWlfZGF0YSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FTX1NUUklORyhydikpKSA8IDApIHsKLSAgICAgICAgUHlfREVDUkVGKHJ2KTsKLSAgICAgICAgcnYgPSBOVUxMOwotICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKHJ2KSkpOwogICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwogICAgIHJldHVybiBydjsKIH0KQEAgLTYwMSwxMyArNTk1LDEwIEBACiAgICAgICAgIFB5X0RFQ1JFRihydik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KKyAgICAvKiBydiBpcyBjbGVhcmVkIG9uIGVycm9yICovCiAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnJ2LAogICAgICAgICAgICAgICAgICAgICAgICAoYmluX2RhdGEgLQotICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcocnYpKSkgPCAwKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihydik7Ci0gICAgICAgIHJ2ID0gTlVMTDsKLSAgICB9Ci0gICAgaWYgKHJ2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FTX1NUUklORyhydikpKSA9PSAwKSB7CiAgICAgICAgIFB5T2JqZWN0ICpycnYgPSBQeV9CdWlsZFZhbHVlKCJPaSIsIHJ2LCBkb25lKTsKICAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGFzY2lpKTsKICAgICAgICAgUHlfREVDUkVGKHJ2KTsKQEAgLTY3MiwxMiArNjYzLDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnJ2LAorICAgIC8qIHJ2IGlzIGNsZWFyZWQgb24gZXJyb3IgKi8KKyAgICAodm9pZClfUHlTdHJpbmdfUmVzaXplKCZydiwKICAgICAgICAgICAgICAgICAgICAgICAgKG91dF9kYXRhIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKHJ2KSkpIDwgMCkgewotICAgICAgICBQeV9ERUNSRUYocnYpOwotICAgICAgICBydiA9IE5VTEw7Ci0gICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcocnYpKSk7CiAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CiAgICAgcmV0dXJuIHJ2OwogfQpAQCAtNzI5LDEyICs3MTgsMTAgQEAKICAgICAgICAgbGVmdGNoYXIgPDw9ICg2LWxlZnRiaXRzKTsKICAgICAgICAgKmFzY2lpX2RhdGErKyA9IHRhYmxlX2IyYV9ocXhbbGVmdGNoYXIgJiAweDNmXTsKICAgICB9Ci0gICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnJ2LAorICAgIC8qIHJ2IGlzIGNsZWFyZWQgb24gZXJyb3IgKi8KKyAgICAodm9pZClfUHlTdHJpbmdfUmVzaXplKCZydiwKICAgICAgICAgICAgICAgICAgICAgICAgKGFzY2lpX2RhdGEgLQotICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcocnYpKSkgPCAwKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihydik7Ci0gICAgICAgIHJ2ID0gTlVMTDsKLSAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FTX1NUUklORyhydikpKTsKICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYmluKTsKICAgICByZXR1cm4gcnY7CiB9CkBAIC03OTYsNyArNzgzLDcgQEAKICAgICAgICAgICAgICBpZiAoIC0tb3V0X2xlbl9sZWZ0IDwgMCApIHsgXAogICAgICAgICAgICAgICAgICAgICAgIGlmICggb3V0X2xlbiA+IFBZX1NTSVpFX1RfTUFYIC8gMikgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7IFwKICAgICAgICAgICAgICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcnYsIDIqb3V0X2xlbikgPCAwKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICB7IFB5X0RFQ1JFRihydik7IFB5QnVmZmVyX1JlbGVhc2UoJnBpbik7IHJldHVybiBOVUxMOyB9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgUHlCdWZmZXJfUmVsZWFzZSgmcGluKTsgcmV0dXJuIE5VTEw7IH0gXAogICAgICAgICAgICAgICAgICAgICAgIG91dF9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcocnYpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG91dF9sZW47IFwKICAgICAgICAgICAgICAgICAgICAgICBvdXRfbGVuX2xlZnQgPSBvdXRfbGVuLTE7IFwKQEAgLTg0NiwxMiArODMzLDEwIEBACiAgICAgICAgICAgICBPVVRCWVRFKGluX2J5dGUpOwogICAgICAgICB9CiAgICAgfQotICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZydiwKKyAgICAvKiBydiBpcyBjbGVhcmVkIG9uIGVycm9yICovCisgICAgKHZvaWQpX1B5U3RyaW5nX1Jlc2l6ZSgmcnYsCiAgICAgICAgICAgICAgICAgICAgICAgIChvdXRfZGF0YSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FTX1NUUklORyhydikpKSA8IDApIHsKLSAgICAgICAgUHlfREVDUkVGKHJ2KTsKLSAgICAgICAgcnYgPSBOVUxMOwotICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKHJ2KSkpOwogICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBpbik7CiAgICAgcmV0dXJuIHJ2OwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9ic2RkYi5oIGIvTW9kdWxlcy9ic2RkYi5oCmluZGV4IGEzYTY4N2IuLjg0MDVhZmEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvYnNkZGIuaAorKysgYi9Nb2R1bGVzL2JzZGRiLmgKQEAgLTYxLDcgKzYxLDcgQEAKICAqCiAgKiBodHRwOi8vd3d3LnB5dGhvbi5vcmcvcGVwcy9wZXAtMDI5MS5odG1sCiAgKgotICogVGhpcyBtb2R1bGUgY29udGFpbnMgNiB0eXBlczoKKyAqIFRoaXMgbW9kdWxlIGNvbnRhaW5zIDcgdHlwZXM6CiAgKgogICogREIgICAgICAgICAgIChEYXRhYmFzZSkKICAqIERCQ3Vyc29yICAgICAoRGF0YWJhc2UgQ3Vyc29yKQpAQCAtNjksNiArNjksNyBAQAogICogREJUeG4gICAgICAgIChBbiBleHBsaWNpdCBkYXRhYmFzZSB0cmFuc2FjdGlvbikKICAqIERCTG9jayAgICAgICAoQSBsb2NrIGhhbmRsZSkKICAqIERCU2VxdWVuY2UgICAoU2VxdWVuY2UpCisgKiBEQlNpdGUgICAgICAgKFNpdGUpCiAgKgogICogTmV3IGRhdGF0eXBlczoKICAqCkBAIC0xMDksNyArMTEwLDcgQEAKICNlcnJvciAiZWVrISBEQlZFUiBjYW4ndCBoYW5kbGUgbWlub3IgdmVyc2lvbnMgPiA5IgogI2VuZGlmCiAKLSNkZWZpbmUgUFlfQlNEREJfVkVSU0lPTiAiNC44LjQuMSIKKyNkZWZpbmUgUFlfQlNEREJfVkVSU0lPTiAiNS4zLjAiCiAKIC8qIFB5dGhvbiBvYmplY3QgZGVmaW5pdGlvbnMgKi8KIApAQCAtMTI5LDYgKzEzMCw5IEBACiBzdHJ1Y3QgREJMb2dDdXJzb3JPYmplY3Q7IC8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KIHN0cnVjdCBEQlR4bk9iamVjdDsgICAgICAgLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLwogc3RydWN0IERCU2VxdWVuY2VPYmplY3Q7ICAvKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCisjaWYgKERCVkVSID49IDUyKQorc3RydWN0IERCU2l0ZU9iamVjdDsgICAgICAvKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCisjZW5kaWYKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKQEAgLTE0MCw2ICsxNDQsOSBAQAogICAgIHN0cnVjdCBEQk9iamVjdCAqY2hpbGRyZW5fZGJzOwogICAgIHN0cnVjdCBEQlR4bk9iamVjdCAqY2hpbGRyZW5fdHhuczsKICAgICBzdHJ1Y3QgREJMb2dDdXJzb3JPYmplY3QgKmNoaWxkcmVuX2xvZ2N1cnNvcnM7CisjaWYgKERCVkVSID49IDUyKQorICAgIHN0cnVjdCBEQlNpdGVPYmplY3QgKmNoaWxkcmVuX3NpdGVzOworI2VuZGlmCiAgICAgUHlPYmplY3QgICAgICAgICpwcml2YXRlX29iajsKICAgICBQeU9iamVjdCAgICAgICAgKnJlcF90cmFuc3BvcnQ7CiAgICAgUHlPYmplY3QgICAgICAgICppbl93ZWFrcmVmbGlzdDsgLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KQEAgLTE1NCwxNSArMTYxLDE0IEBACiAgICAgc3RydWN0IGJlaGF2aW91ckZsYWdzIG1vZHVsZUZsYWdzOwogICAgIHN0cnVjdCBEQlR4bk9iamVjdCAqdHhuOwogICAgIHN0cnVjdCBEQkN1cnNvck9iamVjdCAqY2hpbGRyZW5fY3Vyc29yczsKLSNpZiAoREJWRVIgPj00MykKICAgICBzdHJ1Y3QgREJTZXF1ZW5jZU9iamVjdCAqY2hpbGRyZW5fc2VxdWVuY2VzOwotI2VuZGlmCiAgICAgc3RydWN0IERCT2JqZWN0ICoqc2libGluZ19wcmV2X3A7CiAgICAgc3RydWN0IERCT2JqZWN0ICpzaWJsaW5nX25leHQ7CiAgICAgc3RydWN0IERCT2JqZWN0ICoqc2libGluZ19wcmV2X3BfdHhuOwogICAgIHN0cnVjdCBEQk9iamVjdCAqc2libGluZ19uZXh0X3R4bjsKICAgICBQeU9iamVjdCogICAgICAgYXNzb2NpYXRlQ2FsbGJhY2s7CiAgICAgUHlPYmplY3QqICAgICAgIGJ0Q29tcGFyZUNhbGxiYWNrOworICAgIFB5T2JqZWN0KiAgICAgICBkdXBDb21wYXJlQ2FsbGJhY2s7CSAgICAKICAgICBpbnQgICAgICAgICAgICAgcHJpbWFyeURCVHlwZTsKICAgICBQeU9iamVjdCAgICAgICAgKnByaXZhdGVfb2JqOwogICAgIFB5T2JqZWN0ICAgICAgICAqaW5fd2Vha3JlZmxpc3Q7IC8qIExpc3Qgb2Ygd2VhayByZWZlcmVuY2VzICovCkBAIC0yMDcsNiArMjEzLDE2IEBACiAgICAgUHlPYmplY3QgICAgICAgICppbl93ZWFrcmVmbGlzdDsgLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KIH0gREJMb2dDdXJzb3JPYmplY3Q7CiAKKyNpZiAoREJWRVIgPj0gNTIpCit0eXBlZGVmIHN0cnVjdCBEQlNpdGVPYmplY3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBEQl9TSVRFICAgICAgICAgKnNpdGU7CisgICAgREJFbnZPYmplY3QgICAgICplbnY7CisgICAgc3RydWN0IERCU2l0ZU9iamVjdCAqKnNpYmxpbmdfcHJldl9wOworICAgIHN0cnVjdCBEQlNpdGVPYmplY3QgKnNpYmxpbmdfbmV4dDsKKyAgICBQeU9iamVjdCAgICAqaW5fd2Vha3JlZmxpc3Q7IC8qIExpc3Qgb2Ygd2VhayByZWZlcmVuY2VzICovCit9IERCU2l0ZU9iamVjdDsKKyNlbmRpZgogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRApAQCAtMjE2LDcgKzIzMiw2IEBACiB9IERCTG9ja09iamVjdDsKIAogCi0jaWYgKERCVkVSID49IDQzKQogdHlwZWRlZiBzdHJ1Y3QgREJTZXF1ZW5jZU9iamVjdCB7CiAgICAgUHlPYmplY3RfSEVBRAogICAgIERCX1NFUVVFTkNFKiAgICAgc2VxdWVuY2U7CkBAIC0yMjgsNyArMjQzLDYgQEAKICAgICBzdHJ1Y3QgREJTZXF1ZW5jZU9iamVjdCAqc2libGluZ19uZXh0X3R4bjsKICAgICBQeU9iamVjdCAgICAgICAgKmluX3dlYWtyZWZsaXN0OyAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLwogfSBEQlNlcXVlbmNlT2JqZWN0OwotI2VuZGlmCiAKIAogLyogQVBJIHN0cnVjdHVyZSBmb3IgdXNlIGJ5IEMgY29kZSAqLwpAQCAtMjM2LDcgKzI1MCw3IEBACiAvKiBUbyBhY2Nlc3MgdGhlIHN0cnVjdHVyZSBmcm9tIGFuIGV4dGVybmFsIG1vZHVsZSwgdXNlIGNvZGUgbGlrZSB0aGUKICAgIGZvbGxvd2luZyAoZXJyb3IgY2hlY2tpbmcgbWlzc2VkIG91dCBmb3IgY2xhcml0eSk6CiAKLSAgICAgLy8gSWYgeW91IGFyZSB1c2luZyBQeXRob24gYmVmb3JlIDMuMjoKKyAgICAgLy8gSWYgeW91IGFyZSB1c2luZyBQeXRob24gYmVmb3JlIDIuNzoKICAgICAgQlNEREJfYXBpKiBic2RkYl9hcGk7CiAgICAgIFB5T2JqZWN0KiAgbW9kOwogICAgICBQeU9iamVjdCogIGNvYmo7CkBAIC0yNDksNyArMjYzLDcgQEAKICAgICAgUHlfREVDUkVGKG1vZCk7CiAKIAotICAgICAvLyBJZiB5b3UgYXJlIHVzaW5nIFB5dGhvbiAzLjIgb3IgdXA6CisgICAgIC8vIElmIHlvdSBhcmUgdXNpbmcgUHl0aG9uIDIuNyBvciB1cDogKGV4Y2VwdCBQeXRob24gMy4wLCB1bnN1cHBvcnRlZCkKICAgICAgQlNEREJfYXBpKiBic2RkYl9hcGk7CiAKICAgICAgLy8gVXNlICJic2RkYjMuX3B5YnNkZGIuYXBpIiBpZiB5b3UncmUgdXNpbmcKQEAgLTI1NywxMCArMjcxLDE0IEBACiAgICAgIGJzZGRiX2FwaSA9ICh2b2lkICoqKVB5Q2Fwc3VsZV9JbXBvcnQoImJzZGRiLl9ic2RkYi5hcGkiLCAxKTsKIAogCisgICBDaGVjayAiYXBpX3ZlcnNpb24iIG51bWJlciBiZWZvcmUgdHJ5aW5nIHRvIHVzZSB0aGUgQVBJLgorCiAgICBUaGUgc3RydWN0dXJlJ3MgbWVtYmVycyBtdXN0IG5vdCBiZSBjaGFuZ2VkLgogKi8KIAorI2RlZmluZSBQWUJTRERCX0FQSV9WRVJTSU9OIDEKIHR5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgYXBpX3ZlcnNpb247CiAgICAgLyogVHlwZSBvYmplY3RzICovCiAgICAgUHlUeXBlT2JqZWN0KiBkYl90eXBlOwogICAgIFB5VHlwZU9iamVjdCogZGJjdXJzb3JfdHlwZTsKQEAgLTI2OCw5ICsyODYsNyBAQAogICAgIFB5VHlwZU9iamVjdCogZGJlbnZfdHlwZTsKICAgICBQeVR5cGVPYmplY3QqIGRidHhuX3R5cGU7CiAgICAgUHlUeXBlT2JqZWN0KiBkYmxvY2tfdHlwZTsKLSNpZiAoREJWRVIgPj0gNDMpCiAgICAgUHlUeXBlT2JqZWN0KiBkYnNlcXVlbmNlX3R5cGU7Ci0jZW5kaWYKIAogICAgIC8qIEZ1bmN0aW9ucyAqLwogICAgIGludCAoKm1ha2VEQkVycm9yKShpbnQgZXJyKTsKQEAgLTI4OSw5ICszMDUsOSBAQAogI2RlZmluZSBEQkVudk9iamVjdF9DaGVjayh2KSAgICAoKHYpLT5vYl90eXBlID09IGJzZGRiX2FwaS0+ZGJlbnZfdHlwZSkKICNkZWZpbmUgREJUeG5PYmplY3RfQ2hlY2sodikgICAgKCh2KS0+b2JfdHlwZSA9PSBic2RkYl9hcGktPmRidHhuX3R5cGUpCiAjZGVmaW5lIERCTG9ja09iamVjdF9DaGVjayh2KSAgICgodiktPm9iX3R5cGUgPT0gYnNkZGJfYXBpLT5kYmxvY2tfdHlwZSkKLSNpZiAoREJWRVIgPj0gNDMpCi0jZGVmaW5lIERCU2VxdWVuY2VPYmplY3RfQ2hlY2sodikgICgodiktPm9iX3R5cGUgPT0gYnNkZGJfYXBpLT5kYnNlcXVlbmNlX3R5cGUpCi0jZW5kaWYKKyNkZWZpbmUgREJTZXF1ZW5jZU9iamVjdF9DaGVjayh2KSAgXAorICAgICgoYnNkZGJfYXBpLT5kYnNlcXVlbmNlX3R5cGUpICYmIFwKKyAgICAgICAgKCh2KS0+b2JfdHlwZSA9PSBic2RkYl9hcGktPmRic2VxdWVuY2VfdHlwZSkpCiAKICNlbmRpZiAvKiBDT01QSUxJTkdfQlNEREJfQyAqLwogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2J6Mm1vZHVsZS5jIGIvTW9kdWxlcy9iejJtb2R1bGUuYwppbmRleCA5YzU5YzA0Li5hZTc0OWVlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2J6Mm1vZHVsZS5jCisrKyBiL01vZHVsZXMvYnoybW9kdWxlLmMKQEAgLTQxLDIzICs0MSw4IEBACiAjZGVmaW5lIE1PREVfUkVBRF9FT0YgMgogI2RlZmluZSBNT0RFX1dSSVRFICAgIDMKIAotI2RlZmluZSBCWjJGaWxlT2JqZWN0X0NoZWNrKHYpICAoUHlfVFlQRSh2KSA9PSAmQloyRmlsZV9UeXBlKQogCi0KLSNpZmRlZiBCWl9DT05GSUdfRVJST1IKLQotI2lmIFNJWkVPRl9MT05HID49IDgKLSNkZWZpbmUgQlpTX1RPVEFMX09VVChienMpIFwKLSAgICAoKChsb25nKWJ6cy0+dG90YWxfb3V0X2hpMzIgPDwgMzIpICsgYnpzLT50b3RhbF9vdXRfbG8zMikKLSNlbGlmIFNJWkVPRl9MT05HX0xPTkcgPj0gOAotI2RlZmluZSBCWlNfVE9UQUxfT1VUKGJ6cykgXAotICAgICgoKFBZX0xPTkdfTE9ORylienMtPnRvdGFsX291dF9oaTMyIDw8IDMyKSArIGJ6cy0+dG90YWxfb3V0X2xvMzIpCi0jZWxzZQotI2RlZmluZSBCWlNfVE9UQUxfT1VUKGJ6cykgXAotICAgIGJ6cy0+dG90YWxfb3V0X2xvMzIKLSNlbmRpZgotCi0jZWxzZSAvKiAhIEJaX0NPTkZJR19FUlJPUiAqLworI2lmbmRlZiBCWl9DT05GSUdfRVJST1IKIAogI2RlZmluZSBCWjJfYnpSZWFkIGJ6UmVhZAogI2RlZmluZSBCWjJfYnpSZWFkT3BlbiBielJlYWRPcGVuCkBAIC03Miw4ICs1Nyw2IEBACiAjZGVmaW5lIEJaMl9iekRlY29tcHJlc3NJbml0IGJ6RGVjb21wcmVzc0luaXQKICNkZWZpbmUgQloyX2J6RGVjb21wcmVzc0VuZCBiekRlY29tcHJlc3NFbmQKIAotI2RlZmluZSBCWlNfVE9UQUxfT1VUKGJ6cykgYnpzLT50b3RhbF9vdXQKLQogI2VuZGlmIC8qICEgQlpfQ09ORklHX0VSUk9SICovCiAKIApAQCAtOTAsNiArNzMsOCBAQAogI2RlZmluZSBSRUxFQVNFX0xPQ0sob2JqKQogI2VuZGlmCiAKKyNkZWZpbmUgTUlOKFgsIFkpICgoKFgpIDwgKFkpKSA/IChYKSA6IChZKSkKKwogLyogQml0cyBpbiBmX25ld2xpbmV0eXBlcyAqLwogI2RlZmluZSBORVdMSU5FX1VOS05PV04gMCAgICAgICAvKiBObyBuZXdsaW5lIHNlZW4sIHlldCAqLwogI2RlZmluZSBORVdMSU5FX0NSIDEgICAgICAgICAgICAvKiBcciBuZXdsaW5lIHNlZW4gKi8KQEAgLTIzNCw2ICsyMTksMjAgQEAKICAgICByZXR1cm4gY3VycmVudHNpemUgKyAoY3VycmVudHNpemUgPj4gMykgKyA2OwogfQogCitzdGF0aWMgaW50CitVdGlsX0dyb3dCdWZmZXIoUHlPYmplY3QgKipidWYpCit7CisgICAgc2l6ZV90IHNpemUgPSBQeVN0cmluZ19HRVRfU0laRSgqYnVmKTsKKyAgICBzaXplX3QgbmV3X3NpemUgPSBVdGlsX05ld0J1ZmZlclNpemUoc2l6ZSk7CisgICAgaWYgKG5ld19zaXplID4gc2l6ZSkgeworICAgICAgICByZXR1cm4gX1B5U3RyaW5nX1Jlc2l6ZShidWYsIG5ld19zaXplKTsKKyAgICB9IGVsc2UgeyAgLyogb3ZlcmZsb3cgKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIGJ1ZmZlciAtIG91dHB1dCB0b28gbGFyZ2UiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKwogLyogVGhpcyBpcyBhIGhhY2tlZCB2ZXJzaW9uIG9mIFB5dGhvbidzIGZpbGVvYmplY3QuYzpnZXRfbGluZSgpLiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIFV0aWxfR2V0TGluZShCWjJGaWxlT2JqZWN0ICpmLCBpbnQgbikKQEAgLTczMyw3ICs3MzIsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgLyogR3JvdyB0aGUgYmlnIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJmJpZ19idWZmZXIsIGJ1ZmZlcnNpemUpOworICAgICAgICAgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZiaWdfYnVmZmVyLCBidWZmZXJzaXplKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgICAgICBidWZmZXIgPSBQeVN0cmluZ19BU19TVFJJTkcoYmlnX2J1ZmZlcik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTEyMDcsMTIgKzEyMDcsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCwgTlVMTCk7CiAgICAgICAgICAgICBicmVhazsKICAgICB9Ci0gICAgaWYgKHNlbGYtPmZwKSB7Ci0gICAgICAgIFB5RmlsZV9EZWNVc2VDb3VudCgoUHlGaWxlT2JqZWN0ICopc2VsZi0+ZmlsZSk7Ci0gICAgICAgIHNlbGYtPmZwID0gTlVMTDsKKyAgICBpZiAoc2VsZi0+ZmlsZSkgeworICAgICAgICBpZiAoc2VsZi0+ZnApCisgICAgICAgICAgICBQeUZpbGVfRGVjVXNlQ291bnQoKFB5RmlsZU9iamVjdCAqKXNlbGYtPmZpbGUpOworICAgICAgICByZXQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHNlbGYtPmZpbGUsICJjbG9zZSIsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0ID0gUHlfTm9uZTsKICAgICB9CisgICAgc2VsZi0+ZnAgPSBOVUxMOwogICAgIHNlbGYtPm1vZGUgPSBNT0RFX0NMT1NFRDsKLSAgICByZXQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHNlbGYtPmZpbGUsICJjbG9zZSIsIE5VTEwpOwogICAgIGlmIChiemVycm9yICE9IEJaX09LKSB7CiAgICAgICAgIFV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKICAgICAgICAgUHlfWERFQ1JFRihyZXQpOwpAQCAtMTQ4MCwxMCArMTQ4NCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsIE5VTEwpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIGlmIChzZWxmLT5mcCkgeworICAgIGlmIChzZWxmLT5mcCAhPSBOVUxMICYmIHNlbGYtPmZpbGUgIT0gTlVMTCkKICAgICAgICAgUHlGaWxlX0RlY1VzZUNvdW50KChQeUZpbGVPYmplY3QgKilzZWxmLT5maWxlKTsKLSAgICAgICAgc2VsZi0+ZnAgPSBOVUxMOwotICAgIH0KKyAgICBzZWxmLT5mcCA9IE5VTEw7CiAgICAgVXRpbF9Ecm9wUmVhZEFoZWFkKHNlbGYpOwogICAgIFB5X1hERUNSRUYoc2VsZi0+ZmlsZSk7CiAgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKQEAgLTE2MDgsMjAgKzE2MTEsMTYgQEAKIEJaMkNvbXBfY29tcHJlc3MoQloyQ29tcE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgUHlfYnVmZmVyIHBkYXRhOwotICAgIGNoYXIgKmRhdGE7Ci0gICAgaW50IGRhdGFzaXplOwotICAgIGludCBidWZzaXplID0gU01BTExDSFVOSzsKLSAgICBQWV9MT05HX0xPTkcgdG90YWxvdXQ7CisgICAgc2l6ZV90IGlucHV0X2xlZnQ7CisgICAgc2l6ZV90IG91dHB1dF9zaXplID0gMDsKICAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKICAgICBiel9zdHJlYW0gKmJ6cyA9ICZzZWxmLT5ienM7CiAgICAgaW50IGJ6ZXJyb3I7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqOmNvbXByZXNzIiwgJnBkYXRhKSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgZGF0YSA9IHBkYXRhLmJ1ZjsKLSAgICBkYXRhc2l6ZSA9IHBkYXRhLmxlbjsKIAotICAgIGlmIChkYXRhc2l6ZSA9PSAwKSB7CisgICAgaWYgKHBkYXRhLmxlbiA9PSAwKSB7CiAgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOwogICAgIH0KQEAgLTE2MzMsNDAgKzE2MzIsNTIgQEAKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKLSAgICByZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBidWZzaXplKTsKKyAgICByZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBTTUFMTENIVU5LKTsKICAgICBpZiAoIXJldCkKICAgICAgICAgZ290byBlcnJvcjsKIAotICAgIGJ6cy0+bmV4dF9pbiA9IGRhdGE7Ci0gICAgYnpzLT5hdmFpbF9pbiA9IGRhdGFzaXplOwotICAgIGJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KTsKLSAgICBienMtPmF2YWlsX291dCA9IGJ1ZnNpemU7CisgICAgYnpzLT5uZXh0X2luID0gcGRhdGEuYnVmOworICAgIGJ6cy0+YXZhaWxfaW4gPSBNSU4ocGRhdGEubGVuLCBVSU5UX01BWCk7CisgICAgaW5wdXRfbGVmdCA9IHBkYXRhLmxlbiAtIGJ6cy0+YXZhaWxfaW47CiAKLSAgICB0b3RhbG91dCA9IEJaU19UT1RBTF9PVVQoYnpzKTsKKyAgICBienMtPm5leHRfb3V0ID0gQlVGKHJldCk7CisgICAgYnpzLT5hdmFpbF9vdXQgPSBQeVN0cmluZ19HRVRfU0laRShyZXQpOwogCiAgICAgZm9yICg7OykgeworICAgICAgICBjaGFyICpzYXZlZF9uZXh0X291dDsKKwogICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHNhdmVkX25leHRfb3V0ID0gYnpzLT5uZXh0X291dDsKICAgICAgICAgYnplcnJvciA9IEJaMl9iekNvbXByZXNzKGJ6cywgQlpfUlVOKTsKKyAgICAgICAgb3V0cHV0X3NpemUgKz0gYnpzLT5uZXh0X291dCAtIHNhdmVkX25leHRfb3V0OwogICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworCiAgICAgICAgIGlmIChiemVycm9yICE9IEJaX1JVTl9PSykgewogICAgICAgICAgICAgVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOwogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQotICAgICAgICBpZiAoYnpzLT5hdmFpbF9pbiA9PSAwKQotICAgICAgICAgICAgYnJlYWs7IC8qIG5vIG1vcmUgaW5wdXQgZGF0YSAqLworICAgICAgICBpZiAoYnpzLT5hdmFpbF9pbiA9PSAwKSB7CisgICAgICAgICAgICBpZiAoaW5wdXRfbGVmdCA9PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBubyBtb3JlIGlucHV0IGRhdGEgKi8KKyAgICAgICAgICAgIGJ6cy0+YXZhaWxfaW4gPSBNSU4oaW5wdXRfbGVmdCwgVUlOVF9NQVgpOworICAgICAgICAgICAgaW5wdXRfbGVmdCAtPSBienMtPmF2YWlsX2luOworICAgICAgICB9CiAgICAgICAgIGlmIChienMtPmF2YWlsX291dCA9PSAwKSB7Ci0gICAgICAgICAgICBidWZzaXplID0gVXRpbF9OZXdCdWZmZXJTaXplKGJ1ZnNpemUpOwotICAgICAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnJldCwgYnVmc2l6ZSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgQloyX2J6Q29tcHJlc3NFbmQoYnpzKTsKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlcl9sZWZ0ID0gUHlTdHJpbmdfR0VUX1NJWkUocmV0KSAtIG91dHB1dF9zaXplOworICAgICAgICAgICAgaWYgKGJ1ZmZlcl9sZWZ0ID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoVXRpbF9Hcm93QnVmZmVyKCZyZXQpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBCWjJfYnpDb21wcmVzc0VuZChienMpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBienMtPm5leHRfb3V0ID0gQlVGKHJldCkgKyBvdXRwdXRfc2l6ZTsKKyAgICAgICAgICAgICAgICBidWZmZXJfbGVmdCA9IFB5U3RyaW5nX0dFVF9TSVpFKHJldCkgLSBvdXRwdXRfc2l6ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KSArIChCWlNfVE9UQUxfT1VUKGJ6cykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRvdGFsb3V0KTsKLSAgICAgICAgICAgIGJ6cy0+YXZhaWxfb3V0ID0gYnVmc2l6ZSAtIChienMtPm5leHRfb3V0IC0gQlVGKHJldCkpOworICAgICAgICAgICAgYnpzLT5hdmFpbF9vdXQgPSBNSU4oYnVmZmVyX2xlZnQsIFVJTlRfTUFYKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIF9QeVN0cmluZ19SZXNpemUoJnJldCwgKFB5X3NzaXplX3QpKEJaU19UT1RBTF9PVVQoYnpzKSAtIHRvdGFsb3V0KSk7CisgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnJldCwgb3V0cHV0X3NpemUpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKIAogICAgIFJFTEVBU0VfTE9DSyhzZWxmKTsKICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7CkBAIC0xNjg5LDMzICsxNzAwLDM0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogQloyQ29tcF9mbHVzaChCWjJDb21wT2JqZWN0ICpzZWxmKQogewotICAgIGludCBidWZzaXplID0gU01BTExDSFVOSzsKKyAgICBzaXplX3Qgb3V0cHV0X3NpemUgPSAwOwogICAgIFB5T2JqZWN0ICpyZXQgPSBOVUxMOwogICAgIGJ6X3N0cmVhbSAqYnpzID0gJnNlbGYtPmJ6czsKLSAgICBQWV9MT05HX0xPTkcgdG90YWxvdXQ7CiAgICAgaW50IGJ6ZXJyb3I7CiAKICAgICBBQ1FVSVJFX0xPQ0soc2VsZik7CiAgICAgaWYgKCFzZWxmLT5ydW5uaW5nKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAib2JqZWN0IHdhcyBhbHJlYWR5ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbHVzaGVkIik7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAib2JqZWN0IHdhcyBhbHJlYWR5IGZsdXNoZWQiKTsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAgICAgc2VsZi0+cnVubmluZyA9IDA7CiAKLSAgICByZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBidWZzaXplKTsKKyAgICByZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBTTUFMTENIVU5LKTsKICAgICBpZiAoIXJldCkKICAgICAgICAgZ290byBlcnJvcjsKIAogICAgIGJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KTsKLSAgICBienMtPmF2YWlsX291dCA9IGJ1ZnNpemU7Ci0KLSAgICB0b3RhbG91dCA9IEJaU19UT1RBTF9PVVQoYnpzKTsKKyAgICBienMtPmF2YWlsX291dCA9IFB5U3RyaW5nX0dFVF9TSVpFKHJldCk7CiAKICAgICBmb3IgKDs7KSB7CisgICAgICAgIGNoYXIgKnNhdmVkX25leHRfb3V0OworCiAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgc2F2ZWRfbmV4dF9vdXQgPSBienMtPm5leHRfb3V0OwogICAgICAgICBiemVycm9yID0gQloyX2J6Q29tcHJlc3MoYnpzLCBCWl9GSU5JU0gpOworICAgICAgICBvdXRwdXRfc2l6ZSArPSBienMtPm5leHRfb3V0IC0gc2F2ZWRfbmV4dF9vdXQ7CiAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisKICAgICAgICAgaWYgKGJ6ZXJyb3IgPT0gQlpfU1RSRUFNX0VORCkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0gZWxzZSBpZiAoYnplcnJvciAhPSBCWl9GSU5JU0hfT0spIHsKQEAgLTE3MjMsMTggKzE3MzUsMjAgQEAKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGJ6cy0+YXZhaWxfb3V0ID09IDApIHsKLSAgICAgICAgICAgIGJ1ZnNpemUgPSBVdGlsX05ld0J1ZmZlclNpemUoYnVmc2l6ZSk7Ci0gICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCBidWZzaXplKSA8IDApCi0gICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgIGJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KTsKLSAgICAgICAgICAgIGJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KSArIChCWlNfVE9UQUxfT1VUKGJ6cykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRvdGFsb3V0KTsKLSAgICAgICAgICAgIGJ6cy0+YXZhaWxfb3V0ID0gYnVmc2l6ZSAtIChienMtPm5leHRfb3V0IC0gQlVGKHJldCkpOworICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlcl9sZWZ0ID0gUHlTdHJpbmdfR0VUX1NJWkUocmV0KSAtIG91dHB1dF9zaXplOworICAgICAgICAgICAgaWYgKGJ1ZmZlcl9sZWZ0ID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoVXRpbF9Hcm93QnVmZmVyKCZyZXQpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICBienMtPm5leHRfb3V0ID0gQlVGKHJldCkgKyBvdXRwdXRfc2l6ZTsKKyAgICAgICAgICAgICAgICBidWZmZXJfbGVmdCA9IFB5U3RyaW5nX0dFVF9TSVpFKHJldCkgLSBvdXRwdXRfc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ6cy0+YXZhaWxfb3V0ID0gTUlOKGJ1ZmZlcl9sZWZ0LCBVSU5UX01BWCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoYnpzLT5hdmFpbF9vdXQgIT0gMCkKLSAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCAoUHlfc3NpemVfdCkoQlpTX1RPVEFMX09VVChienMpIC0gdG90YWxvdXQpKTsKKyAgICBpZiAob3V0cHV0X3NpemUgIT0gUHlTdHJpbmdfR0VUX1NJWkUocmV0KSkKKyAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnJldCwgb3V0cHV0X3NpemUpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAKICAgICBSRUxFQVNFX0xPQ0soc2VsZik7CiAgICAgcmV0dXJuIHJldDsKQEAgLTE4OTksMTggKzE5MTMsMTQgQEAKIEJaMkRlY29tcF9kZWNvbXByZXNzKEJaMkRlY29tcE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgUHlfYnVmZmVyIHBkYXRhOwotICAgIGNoYXIgKmRhdGE7Ci0gICAgaW50IGRhdGFzaXplOwotICAgIGludCBidWZzaXplID0gU01BTExDSFVOSzsKLSAgICBQWV9MT05HX0xPTkcgdG90YWxvdXQ7CisgICAgc2l6ZV90IGlucHV0X2xlZnQ7CisgICAgc2l6ZV90IG91dHB1dF9zaXplID0gMDsKICAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKICAgICBiel9zdHJlYW0gKmJ6cyA9ICZzZWxmLT5ienM7CiAgICAgaW50IGJ6ZXJyb3I7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqOmRlY29tcHJlc3MiLCAmcGRhdGEpKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBkYXRhID0gcGRhdGEuYnVmOwotICAgIGRhdGFzaXplID0gcGRhdGEubGVuOwogCiAgICAgQUNRVUlSRV9MT0NLKHNlbGYpOwogICAgIGlmICghc2VsZi0+cnVubmluZykgewpAQCAtMTkxOSw1MiArMTkyOSw2NSBAQAogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAotICAgIHJldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJ1ZnNpemUpOworICAgIHJldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIFNNQUxMQ0hVTkspOwogICAgIGlmICghcmV0KQogICAgICAgICBnb3RvIGVycm9yOwogCi0gICAgYnpzLT5uZXh0X2luID0gZGF0YTsKLSAgICBienMtPmF2YWlsX2luID0gZGF0YXNpemU7Ci0gICAgYnpzLT5uZXh0X291dCA9IEJVRihyZXQpOwotICAgIGJ6cy0+YXZhaWxfb3V0ID0gYnVmc2l6ZTsKKyAgICBienMtPm5leHRfaW4gPSBwZGF0YS5idWY7CisgICAgYnpzLT5hdmFpbF9pbiA9IE1JTihwZGF0YS5sZW4sIFVJTlRfTUFYKTsKKyAgICBpbnB1dF9sZWZ0ID0gcGRhdGEubGVuIC0gYnpzLT5hdmFpbF9pbjsKIAotICAgIHRvdGFsb3V0ID0gQlpTX1RPVEFMX09VVChienMpOworICAgIGJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KTsKKyAgICBienMtPmF2YWlsX291dCA9IFB5U3RyaW5nX0dFVF9TSVpFKHJldCk7CiAKICAgICBmb3IgKDs7KSB7CisgICAgICAgIGNoYXIgKnNhdmVkX25leHRfb3V0OworCiAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgc2F2ZWRfbmV4dF9vdXQgPSBienMtPm5leHRfb3V0OwogICAgICAgICBiemVycm9yID0gQloyX2J6RGVjb21wcmVzcyhienMpOworICAgICAgICBvdXRwdXRfc2l6ZSArPSBienMtPm5leHRfb3V0IC0gc2F2ZWRfbmV4dF9vdXQ7CiAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisKICAgICAgICAgaWYgKGJ6ZXJyb3IgPT0gQlpfU1RSRUFNX0VORCkgewotICAgICAgICAgICAgaWYgKGJ6cy0+YXZhaWxfaW4gIT0gMCkgeworICAgICAgICAgICAgc2VsZi0+cnVubmluZyA9IDA7CisgICAgICAgICAgICBpbnB1dF9sZWZ0ICs9IGJ6cy0+YXZhaWxfaW47CisgICAgICAgICAgICBpZiAoaW5wdXRfbGVmdCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYtPnVudXNlZF9kYXRhKTsKICAgICAgICAgICAgICAgICBzZWxmLT51bnVzZWRfZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ6cy0+bmV4dF9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnpzLT5hdmFpbF9pbik7CisgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ6cy0+bmV4dF9pbiwgaW5wdXRfbGVmdCk7CisgICAgICAgICAgICAgICAgaWYgKHNlbGYtPnVudXNlZF9kYXRhID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZWxmLT5ydW5uaW5nID0gMDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGlmIChiemVycm9yICE9IEJaX09LKSB7CiAgICAgICAgICAgICBVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9Ci0gICAgICAgIGlmIChienMtPmF2YWlsX2luID09IDApCi0gICAgICAgICAgICBicmVhazsgLyogbm8gbW9yZSBpbnB1dCBkYXRhICovCisgICAgICAgIGlmIChienMtPmF2YWlsX2luID09IDApIHsKKyAgICAgICAgICAgIGlmIChpbnB1dF9sZWZ0ID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7IC8qIG5vIG1vcmUgaW5wdXQgZGF0YSAqLworICAgICAgICAgICAgYnpzLT5hdmFpbF9pbiA9IE1JTihpbnB1dF9sZWZ0LCBVSU5UX01BWCk7CisgICAgICAgICAgICBpbnB1dF9sZWZ0IC09IGJ6cy0+YXZhaWxfaW47CisgICAgICAgIH0KICAgICAgICAgaWYgKGJ6cy0+YXZhaWxfb3V0ID09IDApIHsKLSAgICAgICAgICAgIGJ1ZnNpemUgPSBVdGlsX05ld0J1ZmZlclNpemUoYnVmc2l6ZSk7Ci0gICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCBidWZzaXplKSA8IDApIHsKLSAgICAgICAgICAgICAgICBCWjJfYnpEZWNvbXByZXNzRW5kKGJ6cyk7Ci0gICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIHNpemVfdCBidWZmZXJfbGVmdCA9IFB5U3RyaW5nX0dFVF9TSVpFKHJldCkgLSBvdXRwdXRfc2l6ZTsKKyAgICAgICAgICAgIGlmIChidWZmZXJfbGVmdCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKFV0aWxfR3Jvd0J1ZmZlcigmcmV0KSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQloyX2J6RGVjb21wcmVzc0VuZChienMpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBienMtPm5leHRfb3V0ID0gQlVGKHJldCkgKyBvdXRwdXRfc2l6ZTsKKyAgICAgICAgICAgICAgICBidWZmZXJfbGVmdCA9IFB5U3RyaW5nX0dFVF9TSVpFKHJldCkgLSBvdXRwdXRfc2l6ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KTsKLSAgICAgICAgICAgIGJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KSArIChCWlNfVE9UQUxfT1VUKGJ6cykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRvdGFsb3V0KTsKLSAgICAgICAgICAgIGJ6cy0+YXZhaWxfb3V0ID0gYnVmc2l6ZSAtIChienMtPm5leHRfb3V0IC0gQlVGKHJldCkpOworICAgICAgICAgICAgYnpzLT5hdmFpbF9vdXQgPSBNSU4oYnVmZmVyX2xlZnQsIFVJTlRfTUFYKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChienMtPmF2YWlsX291dCAhPSAwKQotICAgICAgICBfUHlTdHJpbmdfUmVzaXplKCZyZXQsIChQeV9zc2l6ZV90KShCWlNfVE9UQUxfT1VUKGJ6cykgLSB0b3RhbG91dCkpOworICAgIGlmIChvdXRwdXRfc2l6ZSAhPSBQeVN0cmluZ19HRVRfU0laRShyZXQpKQorICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCBvdXRwdXRfc2l6ZSkgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKIAogICAgIFJFTEVBU0VfTE9DSyhzZWxmKTsKICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7CkBAIC0yMTExLDEwICsyMTM0LDEwIEBACiBiejJfY29tcHJlc3MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIGludCBjb21wcmVzc2xldmVsPTk7CisgICAgaW50IGFjdGlvbjsKICAgICBQeV9idWZmZXIgcGRhdGE7Ci0gICAgY2hhciAqZGF0YTsKLSAgICBpbnQgZGF0YXNpemU7Ci0gICAgaW50IGJ1ZnNpemU7CisgICAgc2l6ZV90IGlucHV0X2xlZnQ7CisgICAgc2l6ZV90IG91dHB1dF9zaXplID0gMDsKICAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKICAgICBiel9zdHJlYW0gX2J6czsKICAgICBiel9zdHJlYW0gKmJ6cyA9ICZfYnpzOwpAQCAtMjEyNSw4ICsyMTQ4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2xpc3QsICZwZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3NsZXZlbCkpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGRhdGEgPSBwZGF0YS5idWY7Ci0gICAgZGF0YXNpemUgPSBwZGF0YS5sZW47CiAKICAgICBpZiAoY29tcHJlc3NsZXZlbCA8IDEgfHwgY29tcHJlc3NsZXZlbCA+IDkpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCkBAIC0yMTM1LDExICsyMTU2LDcgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgLyogQ29uZm9ybWluZyB0byBiejIgbWFudWFsLCB0aGlzIGlzIGxhcmdlIGVub3VnaCB0byBmaXQgY29tcHJlc3NlZAotICAgICAqIGRhdGEgaW4gb25lIHNob3QuIFdlIHdpbGwgY2hlY2sgaXQgbGF0ZXIgYW55d2F5LiAqLwotICAgIGJ1ZnNpemUgPSBkYXRhc2l6ZSArIChkYXRhc2l6ZS8xMDArMSkgKyA2MDA7Ci0KLSAgICByZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBidWZzaXplKTsKKyAgICByZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBTTUFMTENIVU5LKTsKICAgICBpZiAoIXJldCkgewogICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjE0NywxMCArMjE2NCwxMiBAQAogCiAgICAgbWVtc2V0KGJ6cywgMCwgc2l6ZW9mKGJ6X3N0cmVhbSkpOwogCi0gICAgYnpzLT5uZXh0X2luID0gZGF0YTsKLSAgICBienMtPmF2YWlsX2luID0gZGF0YXNpemU7CisgICAgYnpzLT5uZXh0X2luID0gcGRhdGEuYnVmOworICAgIGJ6cy0+YXZhaWxfaW4gPSBNSU4ocGRhdGEubGVuLCBVSU5UX01BWCk7CisgICAgaW5wdXRfbGVmdCA9IHBkYXRhLmxlbiAtIGJ6cy0+YXZhaWxfaW47CisKICAgICBienMtPm5leHRfb3V0ID0gQlVGKHJldCk7Ci0gICAgYnpzLT5hdmFpbF9vdXQgPSBidWZzaXplOworICAgIGJ6cy0+YXZhaWxfb3V0ID0gUHlTdHJpbmdfR0VUX1NJWkUocmV0KTsKIAogICAgIGJ6ZXJyb3IgPSBCWjJfYnpDb21wcmVzc0luaXQoYnpzLCBjb21wcmVzc2xldmVsLCAwLCAwKTsKICAgICBpZiAoYnplcnJvciAhPSBCWl9PSykgewpAQCAtMjE2MCwzNiArMjE3OSw1MyBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKKyAgICBhY3Rpb24gPSBpbnB1dF9sZWZ0ID4gMCA/IEJaX1JVTiA6IEJaX0ZJTklTSDsKKwogICAgIGZvciAoOzspIHsKKyAgICAgICAgY2hhciAqc2F2ZWRfbmV4dF9vdXQ7CisKICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotICAgICAgICBiemVycm9yID0gQloyX2J6Q29tcHJlc3MoYnpzLCBCWl9GSU5JU0gpOworICAgICAgICBzYXZlZF9uZXh0X291dCA9IGJ6cy0+bmV4dF9vdXQ7CisgICAgICAgIGJ6ZXJyb3IgPSBCWjJfYnpDb21wcmVzcyhienMsIGFjdGlvbik7CisgICAgICAgIG91dHB1dF9zaXplICs9IGJ6cy0+bmV4dF9vdXQgLSBzYXZlZF9uZXh0X291dDsKICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKwogICAgICAgICBpZiAoYnplcnJvciA9PSBCWl9TVFJFQU1fRU5EKSB7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIGlmIChiemVycm9yICE9IEJaX0ZJTklTSF9PSykgeworICAgICAgICB9IGVsc2UgaWYgKGJ6ZXJyb3IgIT0gQlpfUlVOX09LICYmIGJ6ZXJyb3IgIT0gQlpfRklOSVNIX09LKSB7CiAgICAgICAgICAgICBCWjJfYnpDb21wcmVzc0VuZChienMpOwogICAgICAgICAgICAgVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOwogICAgICAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwogICAgICAgICAgICAgUHlfREVDUkVGKHJldCk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICBpZiAoYnpzLT5hdmFpbF9vdXQgPT0gMCkgewotICAgICAgICAgICAgYnVmc2l6ZSA9IFV0aWxfTmV3QnVmZmVyU2l6ZShidWZzaXplKTsKLSAgICAgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXQsIGJ1ZnNpemUpIDwgMCkgewotICAgICAgICAgICAgICAgIEJaMl9iekNvbXByZXNzRW5kKGJ6cyk7Ci0gICAgICAgICAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXQpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoYWN0aW9uID09IEJaX1JVTiAmJiBienMtPmF2YWlsX2luID09IDApIHsKKyAgICAgICAgICAgIGlmIChpbnB1dF9sZWZ0ID09IDApIHsKKyAgICAgICAgICAgICAgICBhY3Rpb24gPSBCWl9GSU5JU0g7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ6cy0+YXZhaWxfaW4gPSBNSU4oaW5wdXRfbGVmdCwgVUlOVF9NQVgpOworICAgICAgICAgICAgICAgIGlucHV0X2xlZnQgLT0gYnpzLT5hdmFpbF9pbjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KSArIEJaU19UT1RBTF9PVVQoYnpzKTsKLSAgICAgICAgICAgIGJ6cy0+YXZhaWxfb3V0ID0gYnVmc2l6ZSAtIChienMtPm5leHRfb3V0IC0gQlVGKHJldCkpOworICAgICAgICB9CisgICAgICAgIGlmIChienMtPmF2YWlsX291dCA9PSAwKSB7CisgICAgICAgICAgICBzaXplX3QgYnVmZmVyX2xlZnQgPSBQeVN0cmluZ19HRVRfU0laRShyZXQpIC0gb3V0cHV0X3NpemU7CisgICAgICAgICAgICBpZiAoYnVmZmVyX2xlZnQgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChVdGlsX0dyb3dCdWZmZXIoJnJldCkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIEJaMl9iekNvbXByZXNzRW5kKGJ6cyk7CisgICAgICAgICAgICAgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KSArIG91dHB1dF9zaXplOworICAgICAgICAgICAgICAgIGJ1ZmZlcl9sZWZ0ID0gUHlTdHJpbmdfR0VUX1NJWkUocmV0KSAtIG91dHB1dF9zaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnpzLT5hdmFpbF9vdXQgPSBNSU4oYnVmZmVyX2xlZnQsIFVJTlRfTUFYKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChienMtPmF2YWlsX291dCAhPSAwKQotICAgICAgICBfUHlTdHJpbmdfUmVzaXplKCZyZXQsIChQeV9zc2l6ZV90KUJaU19UT1RBTF9PVVQoYnpzKSk7Ci0gICAgQloyX2J6Q29tcHJlc3NFbmQoYnpzKTsKKyAgICBpZiAob3V0cHV0X3NpemUgIT0gUHlTdHJpbmdfR0VUX1NJWkUocmV0KSkKKyAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCBvdXRwdXRfc2l6ZSk7ICAvKiBTZXRzIHJldCB0byBOVUxMIG9uIGZhaWx1cmUuICovCiAKKyAgICBCWjJfYnpDb21wcmVzc0VuZChienMpOwogICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKICAgICByZXR1cm4gcmV0OwogfQpAQCAtMjIwNSw5ICsyMjQxLDggQEAKIGJ6Ml9kZWNvbXByZXNzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKICAgICBQeV9idWZmZXIgcGRhdGE7Ci0gICAgY2hhciAqZGF0YTsKLSAgICBpbnQgZGF0YXNpemU7Ci0gICAgaW50IGJ1ZnNpemUgPSBTTUFMTENIVU5LOworICAgIHNpemVfdCBpbnB1dF9sZWZ0OworICAgIHNpemVfdCBvdXRwdXRfc2l6ZSA9IDA7CiAgICAgUHlPYmplY3QgKnJldDsKICAgICBiel9zdHJlYW0gX2J6czsKICAgICBiel9zdHJlYW0gKmJ6cyA9ICZfYnpzOwpAQCAtMjIxNSwxNSArMjI1MCwxMyBAQAogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKjpkZWNvbXByZXNzIiwgJnBkYXRhKSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgZGF0YSA9IHBkYXRhLmJ1ZjsKLSAgICBkYXRhc2l6ZSA9IHBkYXRhLmxlbjsKIAotICAgIGlmIChkYXRhc2l6ZSA9PSAwKSB7CisgICAgaWYgKHBkYXRhLmxlbiA9PSAwKSB7CiAgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOwogICAgIH0KIAotICAgIHJldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJ1ZnNpemUpOworICAgIHJldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIFNNQUxMQ0hVTkspOwogICAgIGlmICghcmV0KSB7CiAgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yMjMxLDEwICsyMjY0LDEyIEBACiAKICAgICBtZW1zZXQoYnpzLCAwLCBzaXplb2YoYnpfc3RyZWFtKSk7CiAKLSAgICBienMtPm5leHRfaW4gPSBkYXRhOwotICAgIGJ6cy0+YXZhaWxfaW4gPSBkYXRhc2l6ZTsKKyAgICBienMtPm5leHRfaW4gPSBwZGF0YS5idWY7CisgICAgYnpzLT5hdmFpbF9pbiA9IE1JTihwZGF0YS5sZW4sIFVJTlRfTUFYKTsKKyAgICBpbnB1dF9sZWZ0ID0gcGRhdGEubGVuIC0gYnpzLT5hdmFpbF9pbjsKKwogICAgIGJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KTsKLSAgICBienMtPmF2YWlsX291dCA9IGJ1ZnNpemU7CisgICAgYnpzLT5hdmFpbF9vdXQgPSBQeVN0cmluZ19HRVRfU0laRShyZXQpOwogCiAgICAgYnplcnJvciA9IEJaMl9iekRlY29tcHJlc3NJbml0KGJ6cywgMCwgMCk7CiAgICAgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKQEAgLTIyNDUsOSArMjI4MCwxNCBAQAogICAgIH0KIAogICAgIGZvciAoOzspIHsKKyAgICAgICAgY2hhciAqc2F2ZWRfbmV4dF9vdXQ7CisKICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBzYXZlZF9uZXh0X291dCA9IGJ6cy0+bmV4dF9vdXQ7CiAgICAgICAgIGJ6ZXJyb3IgPSBCWjJfYnpEZWNvbXByZXNzKGJ6cyk7CisgICAgICAgIG91dHB1dF9zaXplICs9IGJ6cy0+bmV4dF9vdXQgLSBzYXZlZF9uZXh0X291dDsKICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKwogICAgICAgICBpZiAoYnplcnJvciA9PSBCWl9TVFJFQU1fRU5EKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfSBlbHNlIGlmIChiemVycm9yICE9IEJaX09LKSB7CkBAIC0yMjU4LDMxICsyMjk4LDM3IEBACiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgICAgICBpZiAoYnpzLT5hdmFpbF9pbiA9PSAwKSB7Ci0gICAgICAgICAgICBCWjJfYnpEZWNvbXByZXNzRW5kKGJ6cyk7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY291bGRuJ3QgZmluZCBlbmQgb2Ygc3RyZWFtIik7Ci0gICAgICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYocmV0KTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChienMtPmF2YWlsX291dCA9PSAwKSB7Ci0gICAgICAgICAgICBidWZzaXplID0gVXRpbF9OZXdCdWZmZXJTaXplKGJ1ZnNpemUpOwotICAgICAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnJldCwgYnVmc2l6ZSkgPCAwKSB7CisgICAgICAgICAgICBpZiAoaW5wdXRfbGVmdCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgQloyX2J6RGVjb21wcmVzc0VuZChienMpOworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY291bGRuJ3QgZmluZCBlbmQgb2Ygc3RyZWFtIik7CiAgICAgICAgICAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXQpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYnpzLT5uZXh0X291dCA9IEJVRihyZXQpICsgQlpTX1RPVEFMX09VVChienMpOwotICAgICAgICAgICAgYnpzLT5hdmFpbF9vdXQgPSBidWZzaXplIC0gKGJ6cy0+bmV4dF9vdXQgLSBCVUYocmV0KSk7CisgICAgICAgICAgICBienMtPmF2YWlsX2luID0gTUlOKGlucHV0X2xlZnQsIFVJTlRfTUFYKTsKKyAgICAgICAgICAgIGlucHV0X2xlZnQgLT0gYnpzLT5hdmFpbF9pbjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnpzLT5hdmFpbF9vdXQgPT0gMCkgeworICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlcl9sZWZ0ID0gUHlTdHJpbmdfR0VUX1NJWkUocmV0KSAtIG91dHB1dF9zaXplOworICAgICAgICAgICAgaWYgKGJ1ZmZlcl9sZWZ0ID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoVXRpbF9Hcm93QnVmZmVyKCZyZXQpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBCWjJfYnpEZWNvbXByZXNzRW5kKGJ6cyk7CisgICAgICAgICAgICAgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KSArIG91dHB1dF9zaXplOworICAgICAgICAgICAgICAgIGJ1ZmZlcl9sZWZ0ID0gUHlTdHJpbmdfR0VUX1NJWkUocmV0KSAtIG91dHB1dF9zaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnpzLT5hdmFpbF9vdXQgPSBNSU4oYnVmZmVyX2xlZnQsIFVJTlRfTUFYKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChienMtPmF2YWlsX291dCAhPSAwKQotICAgICAgICBfUHlTdHJpbmdfUmVzaXplKCZyZXQsIChQeV9zc2l6ZV90KUJaU19UT1RBTF9PVVQoYnpzKSk7CisgICAgaWYgKG91dHB1dF9zaXplICE9IFB5U3RyaW5nX0dFVF9TSVpFKHJldCkpCisgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJnJldCwgb3V0cHV0X3NpemUpOyAgLyogU2V0cyByZXQgdG8gTlVMTCBvbiBmYWlsdXJlLiAqLworCiAgICAgQloyX2J6RGVjb21wcmVzc0VuZChienMpOwogICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKLQogICAgIHJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvY1BpY2tsZS5jIGIvTW9kdWxlcy9jUGlja2xlLmMKaW5kZXggNDhiNTA3NS4uMTAxOTllYiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jUGlja2xlLmMKKysrIGIvTW9kdWxlcy9jUGlja2xlLmMKQEAgLTEzOSwxNSArMTM5LDE1IEBACiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9IRUFECi0gICAgaW50IGxlbmd0aDsgICAgICAgICAvKiBudW1iZXIgb2YgaW5pdGlhbCBzbG90cyBpbiBkYXRhIGN1cnJlbnRseSB1c2VkICovCi0gICAgaW50IHNpemU7ICAgICAgICAgICAvKiBudW1iZXIgb2Ygc2xvdHMgaW4gZGF0YSBhbGxvY2F0ZWQgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aDsgIC8qIG51bWJlciBvZiBpbml0aWFsIHNsb3RzIGluIGRhdGEgY3VycmVudGx5IHVzZWQgKi8KKyAgICBQeV9zc2l6ZV90IHNpemU7ICAgIC8qIG51bWJlciBvZiBzbG90cyBpbiBkYXRhIGFsbG9jYXRlZCAqLwogICAgIFB5T2JqZWN0ICoqZGF0YTsKIH0gUGRhdGE7CiAKIHN0YXRpYyB2b2lkCiBQZGF0YV9kZWFsbG9jKFBkYXRhICpzZWxmKQogewotICAgIGludCBpOworICAgIFB5X3NzaXplX3QgaTsKICAgICBQeU9iamVjdCAqKnA7CiAKICAgICBmb3IgKGkgPSBzZWxmLT5sZW5ndGgsIHAgPSBzZWxmLT5kYXRhOyAtLWkgPj0gMDsgcCsrKSB7CkBAIC0xOTMsOSArMTkzLDkgQEAKICAqIG51bWJlciBvZiBpdGVtcywgdGhpcyBpcyBhIChub24tZXJyb25lb3VzKSBOT1AuCiAgKi8KIHN0YXRpYyBpbnQKLVBkYXRhX2NsZWFyKFBkYXRhICpzZWxmLCBpbnQgY2xlYXJ0bykKK1BkYXRhX2NsZWFyKFBkYXRhICpzZWxmLCBQeV9zc2l6ZV90IGNsZWFydG8pCiB7Ci0gICAgaW50IGk7CisgICAgUHlfc3NpemVfdCBpOwogICAgIFB5T2JqZWN0ICoqcDsKIAogICAgIGlmIChjbGVhcnRvIDwgMCkgcmV0dXJuIHN0YWNrVW5kZXJmbG93KCk7CkBAIC0yMTQsMTggKzIxNCwxNyBAQAogc3RhdGljIGludAogUGRhdGFfZ3JvdyhQZGF0YSAqc2VsZikKIHsKLSAgICBpbnQgYmlnZ2VyOwotICAgIHNpemVfdCBuYnl0ZXM7CisgICAgUHlfc3NpemVfdCBiaWdnZXI7CisgICAgUHlfc3NpemVfdCBuYnl0ZXM7CisKICAgICBQeU9iamVjdCAqKnRtcDsKIAorICAgIGlmIChzZWxmLT5zaXplID4gKFBZX1NTSVpFX1RfTUFYID4+IDEpKQorICAgICAgICBnb3RvIG5vbWVtb3J5OwogICAgIGJpZ2dlciA9IHNlbGYtPnNpemUgPDwgMTsKLSAgICBpZiAoYmlnZ2VyIDw9IDApICAgICAgICAgICAgLyogd2FzIDAsIG9yIG5ldyB2YWx1ZSBvdmVyZmxvd3MgKi8KKyAgICBpZiAoYmlnZ2VyID4gKFBZX1NTSVpFX1RfTUFYIC8gc2l6ZW9mKFB5T2JqZWN0ICopKSkKICAgICAgICAgZ290byBub21lbW9yeTsKLSAgICBpZiAoKGludCkoc2l6ZV90KWJpZ2dlciAhPSBiaWdnZXIpCi0gICAgICAgIGdvdG8gbm9tZW1vcnk7Ci0gICAgbmJ5dGVzID0gKHNpemVfdCliaWdnZXIgKiBzaXplb2YoUHlPYmplY3QgKik7Ci0gICAgaWYgKG5ieXRlcyAvIHNpemVvZihQeU9iamVjdCAqKSAhPSAoc2l6ZV90KWJpZ2dlcikKLSAgICAgICAgZ290byBub21lbW9yeTsKKyAgICBuYnl0ZXMgPSBiaWdnZXIgKiBzaXplb2YoUHlPYmplY3QgKik7CiAgICAgdG1wID0gcmVhbGxvYyhzZWxmLT5kYXRhLCBuYnl0ZXMpOwogICAgIGlmICh0bXAgPT0gTlVMTCkKICAgICAgICAgZ290byBub21lbW9yeTsKQEAgLTI4MCwxMCArMjc5LDEwIEBACiAKIAogc3RhdGljIFB5T2JqZWN0ICoKLVBkYXRhX3BvcFR1cGxlKFBkYXRhICpzZWxmLCBpbnQgc3RhcnQpCitQZGF0YV9wb3BUdXBsZShQZGF0YSAqc2VsZiwgUHlfc3NpemVfdCBzdGFydCkKIHsKICAgICBQeU9iamVjdCAqcjsKLSAgICBpbnQgaSwgaiwgbDsKKyAgICBQeV9zc2l6ZV90IGksIGosIGw7CiAKICAgICBsID0gc2VsZi0+bGVuZ3RoLXN0YXJ0OwogICAgIHIgPSBQeVR1cGxlX05ldyhsKTsKQEAgLTI5NywxMCArMjk2LDEwIEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1QZGF0YV9wb3BMaXN0KFBkYXRhICpzZWxmLCBpbnQgc3RhcnQpCitQZGF0YV9wb3BMaXN0KFBkYXRhICpzZWxmLCBQeV9zc2l6ZV90IHN0YXJ0KQogewogICAgIFB5T2JqZWN0ICpyOwotICAgIGludCBpLCBqLCBsOworICAgIFB5X3NzaXplX3QgaSwgaiwgbDsKIAogICAgIGw9c2VsZi0+bGVuZ3RoLXN0YXJ0OwogICAgIGlmICghKCByPVB5TGlzdF9OZXcobCkpKSAgcmV0dXJuIE5VTEw7CkBAIC0zMjUsOCArMzI0LDcgQEAKIAogI2RlZmluZSBGUkVFX0FSR19UVVAoc2VsZikgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBpZiAoUHlfUkVGQ05UKHNlbGYtPmFyZykgPiAxKSB7ICAgICAgICAgICAgICAgICBcCi0gICAgICBQeV9ERUNSRUYoc2VsZi0+YXJnKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgc2VsZi0+YXJnPU5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFB5X0NMRUFSKHNlbGYtPmFyZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9CiAKQEAgLTM0Nyw5ICszNDUsOSBAQAogICAgIGludCBiaW47CiAKICAgICBpbnQgZmFzdDsgLyogRmFzdCBtb2RlIGRvZXNuJ3Qgc2F2ZSBpbiBtZW1vLCBkb24ndCB1c2UgaWYgY2lyYyByZWYgKi8KLSAgICBpbnQgKCp3cml0ZV9mdW5jKShzdHJ1Y3QgUGlja2xlcm9iamVjdCAqLCBjb25zdCBjaGFyICosIFB5X3NzaXplX3QpOworICAgIFB5X3NzaXplX3QgKCp3cml0ZV9mdW5jKShzdHJ1Y3QgUGlja2xlcm9iamVjdCAqLCBjb25zdCBjaGFyICosIFB5X3NzaXplX3QpOwogICAgIGNoYXIgKndyaXRlX2J1ZjsKLSAgICBpbnQgYnVmX3NpemU7CisgICAgUHlfc3NpemVfdCBidWZfc2l6ZTsKICAgICBQeU9iamVjdCAqZGlzcGF0Y2hfdGFibGU7CiAgICAgaW50IGZhc3RfY29udGFpbmVyOyAvKiBjb3VudCBuZXN0ZWQgY29udGFpbmVyIGR1bXBzICovCiAgICAgUHlPYmplY3QgKmZhc3RfbWVtbzsKQEAgLTM3MywxMiArMzcxLDEyIEBACiAgICAgUHlPYmplY3QgKm1hcms7CiAgICAgUHlPYmplY3QgKnBlcnNfZnVuYzsKICAgICBQeU9iamVjdCAqbGFzdF9zdHJpbmc7Ci0gICAgaW50ICptYXJrczsKLSAgICBpbnQgbnVtX21hcmtzOwotICAgIGludCBtYXJrc19zaXplOworICAgIFB5X3NzaXplX3QgKm1hcmtzOworICAgIFB5X3NzaXplX3QgbnVtX21hcmtzOworICAgIFB5X3NzaXplX3QgbWFya3Nfc2l6ZTsKICAgICBQeV9zc2l6ZV90ICgqcmVhZF9mdW5jKShzdHJ1Y3QgVW5waWNrbGVyb2JqZWN0ICosIGNoYXIgKiosIFB5X3NzaXplX3QpOwogICAgIFB5X3NzaXplX3QgKCpyZWFkbGluZV9mdW5jKShzdHJ1Y3QgVW5waWNrbGVyb2JqZWN0ICosIGNoYXIgKiopOwotICAgIGludCBidWZfc2l6ZTsKKyAgICBQeV9zc2l6ZV90IGJ1Zl9zaXplOwogICAgIGNoYXIgKmJ1ZjsKICAgICBQeU9iamVjdCAqZmluZF9jbGFzczsKIH0gVW5waWNrbGVyb2JqZWN0OwpAQCAtNDI0LDcgKzQyMiw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBQeV9zc2l6ZV90CiB3cml0ZV9maWxlKFBpY2tsZXJvYmplY3QgKnNlbGYsIGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3QgIG4pCiB7CiAgICAgc2l6ZV90IG5ieXRlc3dyaXR0ZW47CkBAIC00MzMsMTEgKzQzMSw2IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIGlmIChuID4gSU5UX01BWCkgewotICAgICAgICAvKiBTdHJpbmcgdG9vIGxhcmdlICovCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KICAgICBQeUZpbGVfSW5jVXNlQ291bnQoKFB5RmlsZU9iamVjdCAqKXNlbGYtPmZpbGUpOwogICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICBuYnl0ZXN3cml0dGVuID0gZndyaXRlKHMsIHNpemVvZihjaGFyKSwgbiwgc2VsZi0+ZnApOwpAQCAtNDQ4LDQwICs0NDEsNDQgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIHJldHVybiAoaW50KW47CisgICAgcmV0dXJuIG47CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBQeV9zc2l6ZV90CiB3cml0ZV9jU3RyaW5nSU8oUGlja2xlcm9iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCAgbikKIHsKKyAgICBQeV9zc2l6ZV90IGxlbiA9IG47CisKICAgICBpZiAocyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAorICAgIHdoaWxlIChuID4gSU5UX01BWCkgeworICAgICAgICBpZiAoUHljU3RyaW5nSU8tPmN3cml0ZSgoUHlPYmplY3QgKilzZWxmLT5maWxlLCBzLCBJTlRfTUFYKSAhPSBJTlRfTUFYKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgbiAtPSBJTlRfTUFYOworICAgIH0KKwogICAgIGlmIChQeWNTdHJpbmdJTy0+Y3dyaXRlKChQeU9iamVjdCAqKXNlbGYtPmZpbGUsIHMsIG4pICE9IG4pIHsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIHJldHVybiAoaW50KW47CisgICAgcmV0dXJuIGxlbjsKIH0KIAotc3RhdGljIGludAorc3RhdGljIFB5X3NzaXplX3QKIHdyaXRlX25vbmUoUGlja2xlcm9iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCAgbikKIHsKICAgICBpZiAocyA9PSBOVUxMKSByZXR1cm4gMDsKLSAgICBpZiAobiA+IElOVF9NQVgpIHJldHVybiAtMTsKLSAgICByZXR1cm4gKGludCluOworICAgIHJldHVybiBuOwogfQogCi1zdGF0aWMgaW50Ci13cml0ZV9vdGhlcihQaWNrbGVyb2JqZWN0ICpzZWxmLCBjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90ICBfbikKK3N0YXRpYyBQeV9zc2l6ZV90Cit3cml0ZV9vdGhlcihQaWNrbGVyb2JqZWN0ICpzZWxmLCBjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90ICBuKQogewogICAgIFB5T2JqZWN0ICpweV9zdHIgPSAwLCAqanVuayA9IDA7Ci0gICAgaW50IG47CiAKLSAgICBpZiAoX24gPiBJTlRfTUFYKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgbiA9IChpbnQpX247CiAgICAgaWYgKHMgPT0gTlVMTCkgewogICAgICAgICBpZiAoISggc2VsZi0+YnVmX3NpemUgKSkgIHJldHVybiAwOwogICAgICAgICBweV9zdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT53cml0ZV9idWYsCkBAIC00OTAsNyArNDg3LDcgQEAKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICAgIGlmIChzZWxmLT5idWZfc2l6ZSAmJiAobiArIHNlbGYtPmJ1Zl9zaXplKSA+IFdSSVRFX0JVRl9TSVpFKSB7CisgICAgICAgIGlmIChzZWxmLT5idWZfc2l6ZSAmJiBuID4gV1JJVEVfQlVGX1NJWkUgLSBzZWxmLT5idWZfc2l6ZSkgewogICAgICAgICAgICAgaWYgKHdyaXRlX290aGVyKHNlbGYsIE5VTEwsIDApIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KQEAgLTUzMSw3ICs1MjgsNyBAQAogICAgIHNpemVfdCBuYnl0ZXNyZWFkOwogCiAgICAgaWYgKHNlbGYtPmJ1Zl9zaXplID09IDApIHsKLSAgICAgICAgaW50IHNpemU7CisgICAgICAgIFB5X3NzaXplX3Qgc2l6ZTsKIAogICAgICAgICBzaXplID0gKChuIDwgMzIpID8gMzIgOiBuKTsKICAgICAgICAgaWYgKCEoIHNlbGYtPmJ1ZiA9IChjaGFyICopbWFsbG9jKHNpemUpKSkgewpAQCAtNTc1LDcgKzU3Miw3IEBACiBzdGF0aWMgUHlfc3NpemVfdAogcmVhZGxpbmVfZmlsZShVbnBpY2tsZXJvYmplY3QgKnNlbGYsIGNoYXIgKipzKQogewotICAgIGludCBpOworICAgIFB5X3NzaXplX3QgaTsKIAogICAgIGlmIChzZWxmLT5idWZfc2l6ZSA9PSAwKSB7CiAgICAgICAgIGlmICghKCBzZWxmLT5idWYgPSAoY2hhciAqKW1hbGxvYyg0MCkpKSB7CkBAIC01ODcsNyArNTg0LDcgQEAKIAogICAgIGkgPSAwOwogICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGludCBiaWdnZXI7CisgICAgICAgIFB5X3NzaXplX3QgYmlnZ2VyOwogICAgICAgICBjaGFyICpuZXdidWY7CiAgICAgICAgIGZvciAoOyBpIDwgKHNlbGYtPmJ1Zl9zaXplIC0gMSk7IGkrKykgewogICAgICAgICAgICAgaWYgKGZlb2Yoc2VsZi0+ZnApIHx8CkBAIC01OTcsMTMgKzU5NCwxMyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBpICsgMTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBiaWdnZXIgPSBzZWxmLT5idWZfc2l6ZSA8PCAxOwotICAgICAgICBpZiAoYmlnZ2VyIDw9IDApIHsgICAgICAgICAgICAgIC8qIG92ZXJmbG93ICovCisgICAgICAgIGlmIChzZWxmLT5idWZfc2l6ZSA+IChQWV9TU0laRV9UX01BWCA+PiAxKSkgewogICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQorICAgICAgICBiaWdnZXIgPSBzZWxmLT5idWZfc2l6ZSA8PCAxOwogICAgICAgICBuZXdidWYgPSAoY2hhciAqKXJlYWxsb2Moc2VsZi0+YnVmLCBiaWdnZXIpOwotICAgICAgICBpZiAoIW5ld2J1ZikgIHsKKyAgICAgICAgaWYgKG5ld2J1ZiA9PSBOVUxMKSAgewogICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQpAQCAtNjE2LDMwICs2MTMsNjMgQEAKIHN0YXRpYyBQeV9zc2l6ZV90CiByZWFkX2NTdHJpbmdJTyhVbnBpY2tsZXJvYmplY3QgKnNlbGYsIGNoYXIgKipzLCBQeV9zc2l6ZV90ICBuKQogewotICAgIGNoYXIgKnB0cjsKKyAgICBQeV9zc2l6ZV90IGxlbiA9IG47CisgICAgY2hhciAqc3RhcnQsICplbmQgPSBOVUxMOwogCi0gICAgaWYgKFB5Y1N0cmluZ0lPLT5jcmVhZCgoUHlPYmplY3QgKilzZWxmLT5maWxlLCAmcHRyLCBuKSAhPSBuKSB7Ci0gICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfRU9GRXJyb3IpOwotICAgICAgICByZXR1cm4gLTE7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaW50IGs7CisgICAgICAgIGNoYXIgKnB0cjsKKyAgICAgICAgaWYgKG4gPiBJTlRfTUFYKQorICAgICAgICAgICAgayA9IElOVF9NQVg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGsgPSAoaW50KW47CisgICAgICAgIGlmIChQeWNTdHJpbmdJTy0+Y3JlYWQoKFB5T2JqZWN0ICopc2VsZi0+ZmlsZSwgJnB0ciwgaykgIT0gaykgeworICAgICAgICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19FT0ZFcnJvcik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVuZCA9PSBOVUxMKQorICAgICAgICAgICAgc3RhcnQgPSBwdHI7CisgICAgICAgIGVsc2UgaWYgKHB0ciAhPSBlbmQpIHsKKyAgICAgICAgICAgIC8qIG5vbi1jb250aW51b3VzIGFyZWEgKi8KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobiA8PSBJTlRfTUFYKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGVuZCA9IHB0ciArIElOVF9NQVg7CisgICAgICAgIG4gLT0gSU5UX01BWDsKICAgICB9CiAKLSAgICAqcyA9IHB0cjsKKyAgICAqcyA9IHN0YXJ0OwogCi0gICAgcmV0dXJuIG47CisgICAgcmV0dXJuIGxlbjsKIH0KIAogCiBzdGF0aWMgUHlfc3NpemVfdAogcmVhZGxpbmVfY1N0cmluZ0lPKFVucGlja2xlcm9iamVjdCAqc2VsZiwgY2hhciAqKnMpCiB7Ci0gICAgUHlfc3NpemVfdCBuOwotICAgIGNoYXIgKnB0cjsKKyAgICBQeV9zc2l6ZV90IG4gPSAwOworICAgIGNoYXIgKnN0YXJ0ID0gTlVMTCwgKmVuZCA9IE5VTEw7CiAKLSAgICBpZiAoKG4gPSBQeWNTdHJpbmdJTy0+Y3JlYWRsaW5lKChQeU9iamVjdCAqKXNlbGYtPmZpbGUsICZwdHIpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGludCBrOworICAgICAgICBjaGFyICpwdHI7CisgICAgICAgIGlmICgoayA9IFB5Y1N0cmluZ0lPLT5jcmVhZGxpbmUoKFB5T2JqZWN0ICopc2VsZi0+ZmlsZSwgJnB0cikpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG4gKz0gazsKKyAgICAgICAgaWYgKGVuZCA9PSBOVUxMKQorICAgICAgICAgICAgc3RhcnQgPSBwdHI7CisgICAgICAgIGVsc2UgaWYgKHB0ciAhPSBlbmQpIHsKKyAgICAgICAgICAgIC8qIG5vbi1jb250aW51b3VzIGFyZWEgKi8KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoayA9PSAwIHx8IHB0cltrIC0gMV0gPT0gJ1xuJykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBlbmQgPSBwdHIgKyBrOwogICAgIH0KIAotICAgICpzID0gcHRyOworICAgICpzID0gc3RhcnQ7CiAKICAgICByZXR1cm4gbjsKIH0KQEAgLTcwMCw3ICs3MzAsNyBAQAogICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZnJlZSgpJ2luZyB0aGUgcmV0dXJuIHZhbHVlLgogICovCiBzdGF0aWMgY2hhciAqCi1weXN0cm5kdXAoY29uc3QgY2hhciAqcywgaW50IG4pCitweXN0cm5kdXAoY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBuKQogewogICAgIGNoYXIgKnIgPSAoY2hhciAqKW1hbGxvYyhuKzEpOwogICAgIGlmIChyID09IE5VTEwpCkBAIC03MTUsNyArNzQ1LDcgQEAKIGdldChQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaWQpCiB7CiAgICAgUHlPYmplY3QgKnZhbHVlLCAqbXY7Ci0gICAgbG9uZyBjX3ZhbHVlOworICAgIFB5X3NzaXplX3QgY192YWx1ZTsKICAgICBjaGFyIHNbMzBdOwogICAgIHNpemVfdCBsZW47CiAKQEAgLTczNSw3ICs3NjUsOCBAQAogCiAgICAgaWYgKCFzZWxmLT5iaW4pIHsKICAgICAgICAgc1swXSA9IEdFVDsKLSAgICAgICAgUHlPU19zbnByaW50ZihzICsgMSwgc2l6ZW9mKHMpIC0gMSwgIiVsZFxuIiwgY192YWx1ZSk7CisgICAgICAgIFB5T1Nfc25wcmludGYocyArIDEsIHNpemVvZihzKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgIiUiIFBZX0ZPUk1BVF9TSVpFX1QgImRcbiIsIGNfdmFsdWUpOwogICAgICAgICBsZW4gPSBzdHJsZW4ocyk7CiAgICAgfQogICAgIGVsc2UgaWYgKFBkYXRhX0NoZWNrKHNlbGYtPmZpbGUpKSB7CkBAIC03ODAsOCArODExLDcgQEAKIHB1dDIoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iKQogewogICAgIGNoYXIgY19zdHJbMzBdOwotICAgIGludCBwOwotICAgIHNpemVfdCBsZW47CisgICAgUHlfc3NpemVfdCBsZW4sIHA7CiAgICAgaW50IHJlcyA9IC0xOwogICAgIFB5T2JqZWN0ICpweV9vYl9pZCA9IDAsICptZW1vX2xlbiA9IDAsICp0ID0gMDsKIApAQCAtODE4LDcgKzg0OCw4IEBACiAKICAgICBpZiAoIXNlbGYtPmJpbikgewogICAgICAgICBjX3N0clswXSA9IFBVVDsKLSAgICAgICAgUHlPU19zbnByaW50ZihjX3N0ciArIDEsIHNpemVvZihjX3N0cikgLSAxLCAiJWRcbiIsIHApOworICAgICAgICBQeU9TX3NucHJpbnRmKGNfc3RyICsgMSwgc2l6ZW9mKGNfc3RyKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgIiUiIFBZX0ZPUk1BVF9TSVpFX1QgImRcbiIsIHApOwogICAgICAgICBsZW4gPSBzdHJsZW4oY19zdHIpOwogICAgIH0KICAgICBlbHNlIGlmIChQZGF0YV9DaGVjayhzZWxmLT5maWxlKSkgewpAQCAtOTk0LDcgKzEwMjUsNyBAQAogewogICAgIGNoYXIgY19zdHJbMzJdOwogICAgIGxvbmcgbCA9IFB5SW50X0FTX0xPTkcoKFB5SW50T2JqZWN0ICopYXJncyk7Ci0gICAgaW50IGxlbiA9IDA7CisgICAgUHlfc3NpemVfdCBsZW4gPSAwOwogCiAgICAgaWYgKCFzZWxmLT5iaW4KICNpZiBTSVpFT0ZfTE9ORyA+IDQKQEAgLTEyMDEsNyArMTIzMiw3IEBACiBzdGF0aWMgaW50CiBzYXZlX3N0cmluZyhQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50IGRvcHV0KQogewotICAgIGludCBzaXplLCBsZW47CisgICAgUHlfc3NpemVfdCBzaXplLCBsZW47CiAgICAgUHlPYmplY3QgKnJlcHI9MDsKIAogICAgIGlmICgoc2l6ZSA9IFB5U3RyaW5nX1NpemUoYXJncykpIDwgMCkKQEAgLTE0NDgsNyArMTQ3OSw3IEBACiBzdGF0aWMgaW50CiBzdG9yZV90dXBsZV9lbGVtZW50cyhQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdCwgaW50IGxlbikKIHsKLSAgICBpbnQgaTsKKyAgICBQeV9zc2l6ZV90IGk7CiAgICAgaW50IHJlcyA9IC0xOyAgICAgICAvKiBndWlsdHkgdW50aWwgcHJvdmVkIGlubm9jZW50ICovCiAKICAgICBhc3NlcnQoUHlUdXBsZV9TaXplKHQpID09IGxlbik7CkBAIC0xNDc3LDcgKzE1MDgsNyBAQAogc2F2ZV90dXBsZShQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKICAgICBQeU9iamVjdCAqcHlfdHVwbGVfaWQgPSBOVUxMOwotICAgIGludCBsZW4sIGk7CisgICAgUHlfc3NpemVfdCBsZW4sIGk7CiAgICAgaW50IHJlcyA9IC0xOwogCiAgICAgc3RhdGljIGNoYXIgdHVwbGUgPSBUVVBMRTsKQEAgLTE2OTAsNyArMTcyMSw3IEBACiB7CiAgICAgaW50IHJlcyA9IC0xOwogICAgIGNoYXIgc1szXTsKLSAgICBpbnQgbGVuOworICAgIFB5X3NzaXplX3QgbGVuOwogICAgIFB5T2JqZWN0ICppdGVyOwogCiAgICAgaWYgKHNlbGYtPmZhc3QgJiYgIWZhc3Rfc2F2ZV9lbnRlcihzZWxmLCBhcmdzKSkKQEAgLTE5NDMsNyArMTk3NCw3IEBACiB7CiAgICAgaW50IHJlcyA9IC0xOwogICAgIGNoYXIgc1szXTsKLSAgICBpbnQgbGVuOworICAgIFB5X3NzaXplX3QgbGVuOwogCiAgICAgaWYgKHNlbGYtPmZhc3QgJiYgIWZhc3Rfc2F2ZV9lbnRlcihzZWxmLCBhcmdzKSkKICAgICAgICAgZ290byBmaW5hbGx5OwpAQCAtMjAyNyw3ICsyMDU4LDcgQEAKIAogICAgIGlmICgoZ2V0aW5pdGFyZ3NfZnVuYyA9IFB5T2JqZWN0X0dldEF0dHIoYXJncywgX19nZXRpbml0YXJnc19fX3N0cikpKSB7CiAgICAgICAgIFB5T2JqZWN0ICplbGVtZW50ID0gMDsKLSAgICAgICAgaW50IGksIGxlbjsKKyAgICAgICAgUHlfc3NpemVfdCBpLCBsZW47CiAKICAgICAgICAgaWYgKCEoIGNsYXNzX2FyZ3MgPQogICAgICAgICAgICAgICAgUHlPYmplY3RfQ2FsbChnZXRpbml0YXJnc19mdW5jLCBlbXB0eV90dXBsZSwgTlVMTCkpKQpAQCAtMjI4OSw3ICsyMzIwLDggQEAKIHNhdmVfcGVycyhQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmYpCiB7CiAgICAgUHlPYmplY3QgKnBpZCA9IDA7Ci0gICAgaW50IHNpemUsIHJlcyA9IC0xOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICBpbnQgcmVzID0gLTE7CiAKICAgICBzdGF0aWMgY2hhciBwZXJzaWQgPSBQRVJTSUQsIGJpbnBlcnNpZCA9IEJJTlBFUlNJRDsKIApAQCAtMjQzMSw3ICsyNDYzLDcgQEAKICAgICBpZiAodXNlX25ld29iaikgewogICAgICAgICBQeU9iamVjdCAqY2xzOwogICAgICAgICBQeU9iamVjdCAqbmV3YXJndHVwOwotICAgICAgICBpbnQgbiwgaTsKKyAgICAgICAgUHlfc3NpemVfdCBuLCBpOwogCiAgICAgICAgIC8qIFNhbml0eSBjaGVja3MuICovCiAgICAgICAgIG4gPSBQeVR1cGxlX1NpemUoYXJndHVwKTsKQEAgLTI4MTUsNyArMjg0Nyw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogUGlja2xlX2dldHZhbHVlKFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIGludCBsLCBpLCByc2l6ZSwgc3NpemUsIGNsZWFyPTEsIGxtOworICAgIFB5X3NzaXplX3QgbCwgaSwgcnNpemUsIHNzaXplLCBjbGVhcj0xLCBsbTsKICAgICBsb25nIGlrOwogICAgIFB5T2JqZWN0ICprLCAqcjsKICAgICBjaGFyICpzLCAqcCwgKmhhdmVfZ2V0OwpAQCAtMzMxNCw3ICszMzQ2LDcgQEAKICAgICByZXR1cm4gZ2xvYmFsOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgUHlfc3NpemVfdAogbWFya2VyKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKICAgICBpZiAoc2VsZi0+bnVtX21hcmtzIDwgMSkgewpAQCAtMzM0NSw3ICszMzc3LDggQEAKIHsKICAgICBQeU9iamVjdCAqcHlfaW50ID0gMDsKICAgICBjaGFyICplbmRwdHIsICpzOwotICAgIGludCBsZW4sIHJlcyA9IC0xOworICAgIFB5X3NzaXplX3QgbGVuOworICAgIGludCByZXMgPSAtMTsKICAgICBsb25nIGw7CiAKICAgICBpZiAoKGxlbiA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA8IDApIHJldHVybiAtMTsKQEAgLTM0NzcsNyArMzUxMCw4IEBACiB7CiAgICAgUHlPYmplY3QgKmwgPSAwOwogICAgIGNoYXIgKmVuZCwgKnM7Ci0gICAgaW50IGxlbiwgcmVzID0gLTE7CisgICAgUHlfc3NpemVfdCBsZW47CisgICAgaW50IHJlcyA9IC0xOwogCiAgICAgaWYgKChsZW4gPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPCAwKSByZXR1cm4gLTE7CiAgICAgaWYgKGxlbiA8IDIpIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKQEAgLTM1NDEsNyArMzU3NSw4IEBACiB7CiAgICAgUHlPYmplY3QgKnB5X2Zsb2F0ID0gMDsKICAgICBjaGFyICplbmRwdHIsICpzOwotICAgIGludCBsZW4sIHJlcyA9IC0xOworICAgIFB5X3NzaXplX3QgbGVuOworICAgIGludCByZXMgPSAtMTsKICAgICBkb3VibGUgZDsKIAogICAgIGlmICgobGVuID0gc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykpIDwgMCkgcmV0dXJuIC0xOwpAQCAtMzU5Nyw3ICszNjMyLDggQEAKIGxvYWRfc3RyaW5nKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKICAgICBQeU9iamVjdCAqc3RyID0gMDsKLSAgICBpbnQgbGVuLCByZXMgPSAtMTsKKyAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICBpbnQgcmVzID0gLTE7CiAgICAgY2hhciAqcywgKnA7CiAKICAgICBpZiAoKGxlbiA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA8IDApIHJldHVybiAtMTsKQEAgLTM2MDYsMTcgKzM2NDIsMTkgQEAKIAogCiAgICAgLyogU3RyaXAgb3V0ZXJtb3N0IHF1b3RlcyAqLwotICAgIHdoaWxlIChzW2xlbi0xXSA8PSAnICcpCisgICAgd2hpbGUgKGxlbiA+IDAgJiYgc1tsZW4tMV0gPD0gJyAnKQogICAgICAgICBsZW4tLTsKLSAgICBpZihzWzBdPT0nIicgJiYgc1tsZW4tMV09PSciJyl7CisgICAgaWYgKGxlbiA+IDEgJiYgc1swXT09JyInICYmIHNbbGVuLTFdPT0nIicpIHsKICAgICAgICAgc1tsZW4tMV0gPSAnXDAnOwogICAgICAgICBwID0gcyArIDEgOwogICAgICAgICBsZW4gLT0gMjsKLSAgICB9IGVsc2UgaWYoc1swXT09J1wnJyAmJiBzW2xlbi0xXT09J1wnJyl7CisgICAgfQorICAgIGVsc2UgaWYgKGxlbiA+IDEgJiYgc1swXT09J1wnJyAmJiBzW2xlbi0xXT09J1wnJykgewogICAgICAgICBzW2xlbi0xXSA9ICdcMCc7CiAgICAgICAgIHAgPSBzICsgMSA7CiAgICAgICAgIGxlbiAtPSAyOwotICAgIH0gZWxzZQorICAgIH0KKyAgICBlbHNlCiAgICAgICAgIGdvdG8gaW5zZWN1cmU7CiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0zNjM5LDcgKzM2NzcsNyBAQAogbG9hZF9iaW5zdHJpbmcoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewogICAgIFB5T2JqZWN0ICpweV9zdHJpbmcgPSAwOwotICAgIGxvbmcgbDsKKyAgICBQeV9zc2l6ZV90IGw7CiAgICAgY2hhciAqczsKIAogICAgIGlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnMsIDQpIDwgMCkgcmV0dXJuIC0xOwpAQCAtMzY5MSwyMCArMzcyOSwxNyBAQAogbG9hZF91bmljb2RlKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKICAgICBQeU9iamVjdCAqc3RyID0gMDsKLSAgICBpbnQgbGVuLCByZXMgPSAtMTsKKyAgICBQeV9zc2l6ZV90IGxlbjsKICAgICBjaGFyICpzOwogCiAgICAgaWYgKChsZW4gPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPCAwKSByZXR1cm4gLTE7CiAgICAgaWYgKGxlbiA8IDEpIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKIAogICAgIGlmICghKCBzdHIgPSBQeVVuaWNvZGVfRGVjb2RlUmF3VW5pY29kZUVzY2FwZShzLCBsZW4gLSAxLCBOVUxMKSkpCi0gICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgcmV0dXJuIC0xOwogCiAgICAgUERBVEFfUFVTSChzZWxmLT5zdGFjaywgc3RyLCAtMSk7CiAgICAgcmV0dXJuIDA7Ci0KLSAgZmluYWxseToKLSAgICByZXR1cm4gcmVzOwogfQogI2VuZGlmCiAKQEAgLTM3MTQsNyArMzc0OSw3IEBACiBsb2FkX2JpbnVuaWNvZGUoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewogICAgIFB5T2JqZWN0ICp1bmljb2RlOwotICAgIGxvbmcgbDsKKyAgICBQeV9zc2l6ZV90IGw7CiAgICAgY2hhciAqczsKIAogICAgIGlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnMsIDQpIDwgMCkgcmV0dXJuIC0xOwpAQCAtMzc0NSw3ICszNzgwLDcgQEAKIGxvYWRfdHVwbGUoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewogICAgIFB5T2JqZWN0ICp0dXA7Ci0gICAgaW50IGk7CisgICAgUHlfc3NpemVfdCBpOwogCiAgICAgaWYgKChpID0gbWFya2VyKHNlbGYpKSA8IDApIHJldHVybiAtMTsKICAgICBpZiAoISggdHVwPVBkYXRhX3BvcFR1cGxlKHNlbGYtPnN0YWNrLCBpKSkpICByZXR1cm4gLTE7CkBAIC0zNzk4LDcgKzM4MzMsNyBAQAogbG9hZF9saXN0KFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKICAgICBQeU9iamVjdCAqbGlzdCA9IDA7Ci0gICAgaW50IGk7CisgICAgUHlfc3NpemVfdCBpOwogCiAgICAgaWYgKChpID0gbWFya2VyKHNlbGYpKSA8IDApIHJldHVybiAtMTsKICAgICBpZiAoISggbGlzdD1QZGF0YV9wb3BMaXN0KHNlbGYtPnN0YWNrLCBpKSkpICByZXR1cm4gLTE7CkBAIC0zODEwLDcgKzM4NDUsNyBAQAogbG9hZF9kaWN0KFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKICAgICBQeU9iamVjdCAqZGljdCwgKmtleSwgKnZhbHVlOwotICAgIGludCBpLCBqLCBrOworICAgIFB5X3NzaXplX3QgaSwgaiwgazsKIAogICAgIGlmICgoaSA9IG1hcmtlcihzZWxmKSkgPCAwKSByZXR1cm4gLTE7CiAgICAgaj1zZWxmLT5zdGFjay0+bGVuZ3RoOwpAQCAtMzg4Niw3ICszOTIxLDcgQEAKIGxvYWRfb2JqKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKICAgICBQeU9iamVjdCAqY2xhc3MsICp0dXAsICpvYmo9MDsKLSAgICBpbnQgaTsKKyAgICBQeV9zc2l6ZV90IGk7CiAKICAgICBpZiAoKGkgPSBtYXJrZXIoc2VsZikpIDwgMCkgcmV0dXJuIC0xOwogICAgIGlmICghKCB0dXA9UGRhdGFfcG9wVHVwbGUoc2VsZi0+c3RhY2ssIGkrMSkpKSAgcmV0dXJuIC0xOwpAQCAtMzkwNyw3ICszOTQyLDcgQEAKIGxvYWRfaW5zdChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7CiAgICAgUHlPYmplY3QgKnR1cCwgKmNsYXNzPTAsICpvYmo9MCwgKm1vZHVsZV9uYW1lLCAqY2xhc3NfbmFtZTsKLSAgICBpbnQgaSwgbGVuOworICAgIFB5X3NzaXplX3QgaSwgbGVuOwogICAgIGNoYXIgKnM7CiAKICAgICBpZiAoKGkgPSBtYXJrZXIoc2VsZikpIDwgMCkgcmV0dXJuIC0xOwpAQCAtMzk5Myw3ICs0MDI4LDcgQEAKIGxvYWRfZ2xvYmFsKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKICAgICBQeU9iamVjdCAqY2xhc3MgPSAwLCAqbW9kdWxlX25hbWUgPSAwLCAqY2xhc3NfbmFtZSA9IDA7Ci0gICAgaW50IGxlbjsKKyAgICBQeV9zc2l6ZV90IGxlbjsKICAgICBjaGFyICpzOwogCiAgICAgaWYgKChsZW4gPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPCAwKSByZXR1cm4gLTE7CkBAIC00MDI0LDcgKzQwNTksNyBAQAogbG9hZF9wZXJzaWQoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewogICAgIFB5T2JqZWN0ICpwaWQgPSAwOwotICAgIGludCBsZW47CisgICAgUHlfc3NpemVfdCBsZW47CiAgICAgY2hhciAqczsKIAogICAgIGlmIChzZWxmLT5wZXJzX2Z1bmMpIHsKQEAgLTQxMDIsNyArNDEzNyw3IEBACiBzdGF0aWMgaW50CiBsb2FkX3BvcChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0gICAgaW50IGxlbiA9IHNlbGYtPnN0YWNrLT5sZW5ndGg7CisgICAgUHlfc3NpemVfdCBsZW4gPSBzZWxmLT5zdGFjay0+bGVuZ3RoOwogCiAgICAgLyogTm90ZSB0aGF0IHdlIHNwbGl0IHRoZSAocGlja2xlLnB5KSBzdGFjayBpbnRvIHR3byBzdGFja3MsCiAgICAgICAgYW4gb2JqZWN0IHN0YWNrIGFuZCBhIG1hcmsgc3RhY2suIFdlIGhhdmUgdG8gYmUgY2xldmVyIGFuZApAQCAtNDEyNyw3ICs0MTYyLDcgQEAKIHN0YXRpYyBpbnQKIGxvYWRfcG9wX21hcmsoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotICAgIGludCBpOworICAgIFB5X3NzaXplX3QgaTsKIAogICAgIGlmICgoaSA9IG1hcmtlcihzZWxmKSkgPCAwKQogICAgICAgICByZXR1cm4gLTE7CkBAIC00MTQyLDcgKzQxNzcsNyBAQAogbG9hZF9kdXAoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewogICAgIFB5T2JqZWN0ICpsYXN0OwotICAgIGludCBsZW47CisgICAgUHlfc3NpemVfdCBsZW47CiAKICAgICBpZiAoKGxlbiA9IHNlbGYtPnN0YWNrLT5sZW5ndGgpIDw9IDApIHJldHVybiBzdGFja1VuZGVyZmxvdygpOwogICAgIGxhc3Q9c2VsZi0+c3RhY2stPmRhdGFbbGVuLTFdOwpAQCAtNDE1Niw3ICs0MTkxLDcgQEAKIGxvYWRfZ2V0KFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKICAgICBQeU9iamVjdCAqcHlfc3RyID0gMCwgKnZhbHVlID0gMDsKLSAgICBpbnQgbGVuOworICAgIFB5X3NzaXplX3QgbGVuOwogICAgIGNoYXIgKnM7CiAgICAgaW50IHJjOwogCkBAIC00MjE0LDcgKzQyNDksNyBAQAogICAgIFB5T2JqZWN0ICpweV9rZXkgPSAwLCAqdmFsdWUgPSAwOwogICAgIHVuc2lnbmVkIGNoYXIgYzsKICAgICBjaGFyICpzOwotICAgIGxvbmcga2V5OworICAgIFB5X3NzaXplX3Qga2V5OwogICAgIGludCByYzsKIAogICAgIGlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnMsIDQpIDwgMCkgcmV0dXJuIC0xOwpAQCAtNDMxNyw3ICs0MzUyLDcgQEAKIGxvYWRfcHV0KFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKICAgICBQeU9iamVjdCAqcHlfc3RyID0gMCwgKnZhbHVlID0gMDsKLSAgICBpbnQgbGVuLCBsOworICAgIFB5X3NzaXplX3QgbGVuLCBsOwogICAgIGNoYXIgKnM7CiAKICAgICBpZiAoKGwgPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPCAwKSByZXR1cm4gLTE7CkBAIC00MzM3LDcgKzQzNzIsNyBAQAogICAgIFB5T2JqZWN0ICpweV9rZXkgPSAwLCAqdmFsdWUgPSAwOwogICAgIHVuc2lnbmVkIGNoYXIga2V5OwogICAgIGNoYXIgKnM7Ci0gICAgaW50IGxlbjsKKyAgICBQeV9zc2l6ZV90IGxlbjsKIAogICAgIGlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnMsIDEpIDwgMCkgcmV0dXJuIC0xOwogICAgIGlmICghKCAobGVuPXNlbGYtPnN0YWNrLT5sZW5ndGgpID4gMCApKSAgcmV0dXJuIHN0YWNrVW5kZXJmbG93KCk7CkBAIC00MzU2LDEwICs0MzkxLDEwIEBACiBsb2FkX2xvbmdfYmlucHV0KFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKICAgICBQeU9iamVjdCAqcHlfa2V5ID0gMCwgKnZhbHVlID0gMDsKLSAgICBsb25nIGtleTsKKyAgICBQeV9zc2l6ZV90IGtleTsKICAgICB1bnNpZ25lZCBjaGFyIGM7CiAgICAgY2hhciAqczsKLSAgICBpbnQgbGVuOworICAgIFB5X3NzaXplX3QgbGVuOwogCiAgICAgaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgNCkgPCAwKSByZXR1cm4gLTE7CiAgICAgaWYgKCEoIGxlbj1zZWxmLT5zdGFjay0+bGVuZ3RoICkpICByZXR1cm4gc3RhY2tVbmRlcmZsb3coKTsKQEAgLTQzODIsMTAgKzQ0MTcsMTAgQEAKIAogCiBzdGF0aWMgaW50Ci1kb19hcHBlbmQoVW5waWNrbGVyb2JqZWN0ICpzZWxmLCBpbnQgIHgpCitkb19hcHBlbmQoVW5waWNrbGVyb2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90ICB4KQogewogICAgIFB5T2JqZWN0ICp2YWx1ZSA9IDAsICpsaXN0ID0gMCwgKmFwcGVuZF9tZXRob2QgPSAwOwotICAgIGludCBsZW4sIGk7CisgICAgUHlfc3NpemVfdCBsZW4sIGk7CiAKICAgICBsZW49c2VsZi0+c3RhY2stPmxlbmd0aDsKICAgICBpZiAoISggbGVuID49IHggJiYgeCA+IDAgKSkgIHJldHVybiBzdGFja1VuZGVyZmxvdygpOwpAQCAtNDQ1MSwxMSArNDQ4NiwxMSBAQAogfQogCiAKLXN0YXRpYyBpbnQKLWRvX3NldGl0ZW1zKFVucGlja2xlcm9iamVjdCAqc2VsZiwgaW50ICB4KQorc3RhdGljIFB5X3NzaXplX3QKK2RvX3NldGl0ZW1zKFVucGlja2xlcm9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCB4KQogewogICAgIFB5T2JqZWN0ICp2YWx1ZSA9IDAsICprZXkgPSAwLCAqZGljdCA9IDA7Ci0gICAgaW50IGxlbiwgaSwgcj0wOworICAgIFB5X3NzaXplX3QgbGVuLCBpLCByPTA7CiAKICAgICBpZiAoISggKGxlbj1zZWxmLT5zdGFjay0+bGVuZ3RoKSA+PSB4CiAgICAgICAgICAgICYmIHggPiAwICkpICByZXR1cm4gc3RhY2tVbmRlcmZsb3coKTsKQEAgLTQ0OTYsOCArNDUzMSw4IEBACiAgICAgUHlPYmplY3QgKnN0YXRlLCAqaW5zdCwgKnNsb3RzdGF0ZTsKICAgICBQeU9iamVjdCAqX19zZXRzdGF0ZV9fOwogICAgIFB5T2JqZWN0ICpkX2tleSwgKmRfdmFsdWU7Ci0gICAgUHlfc3NpemVfdCBpOwogICAgIGludCByZXMgPSAtMTsKKyAgICBQeV9zc2l6ZV90IGk7CiAKICAgICAvKiBTdGFjayBpcyAuLi4gaW5zdGFuY2UsIHN0YXRlLiAgV2Ugd2FudCB0byBsZWF2ZSBpbnN0YW5jZSBhdAogICAgICAqIHRoZSBzdGFjayB0b3AsIHBvc3NpYmx5IG11dGF0ZWQgdmlhIGluc3RhbmNlLl9fc2V0c3RhdGVfXyhzdGF0ZSkuCkBAIC00NTk2LDcgKzQ2MzEsNyBAQAogc3RhdGljIGludAogbG9hZF9tYXJrKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLSAgICBpbnQgczsKKyAgICBQeV9zc2l6ZV90IHM7CiAKICAgICAvKiBOb3RlIHRoYXQgd2Ugc3BsaXQgdGhlIChwaWNrbGUucHkpIHN0YWNrIGludG8gdHdvIHN0YWNrcywgYW4KICAgICAgICBvYmplY3Qgc3RhY2sgYW5kIGEgbWFyayBzdGFjay4gSGVyZSB3ZSBwdXNoIGEgbWFyayBvbnRvIHRoZQpAQCAtNDYwNCwxNCArNDYzOSwxNCBAQAogICAgICovCiAKICAgICBpZiAoKHNlbGYtPm51bV9tYXJrcyArIDEpID49IHNlbGYtPm1hcmtzX3NpemUpIHsKLSAgICAgICAgaW50ICptYXJrczsKKyAgICAgICAgUHlfc3NpemVfdCAqbWFya3M7CiAgICAgICAgIHM9c2VsZi0+bWFya3Nfc2l6ZSsyMDsKICAgICAgICAgaWYgKHMgPD0gc2VsZi0+bnVtX21hcmtzKSBzPXNlbGYtPm51bV9tYXJrcyArIDE7CiAgICAgICAgIGlmIChzZWxmLT5tYXJrcyA9PSBOVUxMKQotICAgICAgICAgICAgbWFya3M9KGludCAqKW1hbGxvYyhzICogc2l6ZW9mKGludCkpOworICAgICAgICAgICAgbWFya3M9KFB5X3NzaXplX3QgKiltYWxsb2MocyAqIHNpemVvZihQeV9zc2l6ZV90KSk7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1hcmtzPShpbnQgKilyZWFsbG9jKHNlbGYtPm1hcmtzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyAqIHNpemVvZihpbnQpKTsKKyAgICAgICAgICAgIG1hcmtzPShQeV9zc2l6ZV90ICopcmVhbGxvYyhzZWxmLT5tYXJrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICogc2l6ZW9mKFB5X3NzaXplX3QpKTsKICAgICAgICAgaWYgKCFtYXJrcykgewogICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKQEAgLTQ5ODEsNyArNTAxNiw3IEBACiBzdGF0aWMgaW50CiBub2xvYWRfb2JqKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLSAgICBpbnQgaTsKKyAgICBQeV9zc2l6ZV90IGk7CiAKICAgICBpZiAoKGkgPSBtYXJrZXIoc2VsZikpIDwgMCkgcmV0dXJuIC0xOwogICAgIHJldHVybiBQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgaSsxKTsKQEAgLTQ5OTEsNyArNTAyNiw3IEBACiBzdGF0aWMgaW50CiBub2xvYWRfaW5zdChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0gICAgaW50IGk7CisgICAgUHlfc3NpemVfdCBpOwogICAgIGNoYXIgKnM7CiAKICAgICBpZiAoKGkgPSBtYXJrZXIoc2VsZikpIDwgMCkgcmV0dXJuIC0xOwpAQCAtNTA2OCw3ICs1MTAzLDcgQEAKIHN0YXRpYyBpbnQKIG5vbG9hZF9hcHBlbmRzKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLSAgICBpbnQgaTsKKyAgICBQeV9zc2l6ZV90IGk7CiAgICAgaWYgKChpID0gbWFya2VyKHNlbGYpKSA8IDApIHJldHVybiAtMTsKICAgICByZXR1cm4gUGRhdGFfY2xlYXIoc2VsZi0+c3RhY2ssIGkpOwogfQpAQCAtNTA4Miw3ICs1MTE3LDcgQEAKIHN0YXRpYyBpbnQKIG5vbG9hZF9zZXRpdGVtcyhVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0gICAgaW50IGk7CisgICAgUHlfc3NpemVfdCBpOwogICAgIGlmICgoaSA9IG1hcmtlcihzZWxmKSkgPCAwKSByZXR1cm4gLTE7CiAgICAgcmV0dXJuIFBkYXRhX2NsZWFyKHNlbGYtPnN0YWNrLCBpKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvY1N0cmluZ0lPLmMgYi9Nb2R1bGVzL2NTdHJpbmdJTy5jCmluZGV4IDg5ZjFkZDYuLjViNzg3ODkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY1N0cmluZ0lPLmMKKysrIGIvTW9kdWxlcy9jU3RyaW5nSU8uYwpAQCAtNjYsOSArNjYsNyBAQAogICBQeU9iamVjdF9IRUFECiAgIGNoYXIgKmJ1ZjsKICAgUHlfc3NpemVfdCBwb3MsIHN0cmluZ19zaXplOwotICAvKiBXZSBzdG9yZSBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IGhlcmUgaW4gb3JkZXIgdG8ga2VlcAotICAgICB0aGUgYnVmZmVyIGFsaXZlIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgdGhlIElvYmplY3QuICovCi0gIFB5T2JqZWN0ICpwYnVmOworICAgIFB5X2J1ZmZlciBwYnVmOwogfSBJb2JqZWN0OwogCiAvKiBJT29iamVjdCAoY29tbW9uKSBtZXRob2RzICovCkBAIC0xMjcsMTIgKzEyNSwxNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIElPX2dldHZhbChJT29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsKICAgICBQeU9iamVjdCAqdXNlX3Bvcz1QeV9Ob25lOworICAgIGludCBiOwogICAgIFB5X3NzaXplX3QgczsKIAogICAgIGlmICghSU9fX29wZW5jaGVjayhzZWxmKSkgcmV0dXJuIE5VTEw7CiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCJnZXR2YWwiLCAwLCAxLCZ1c2VfcG9zKSkgcmV0dXJuIE5VTEw7CiAKLSAgICBpZiAoUHlPYmplY3RfSXNUcnVlKHVzZV9wb3MpKSB7CisgICAgYiA9IFB5T2JqZWN0X0lzVHJ1ZSh1c2VfcG9zKTsKKyAgICBpZiAoYiA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChiKSB7CiAgICAgICAgICAgICAgIHM9c2VsZi0+cG9zOwogICAgICAgICAgICAgICBpZiAocyA+IHNlbGYtPnN0cmluZ19zaXplKSBzPXNlbGYtPnN0cmluZ19zaXplOwogICAgIH0KQEAgLTE2NiwxMCArMTY4LDE1IEBACiAgICAgICAgIG4gPSBsOwogICAgICAgICBpZiAobiA8IDApIG49MDsKICAgICB9CisgICAgaWYgKG4gPiBJTlRfTUFYKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImxlbmd0aCB0b28gbGFyZ2UiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAogICAgICpvdXRwdXQ9KChJT29iamVjdCopc2VsZiktPmJ1ZiArICgoSU9vYmplY3QqKXNlbGYpLT5wb3M7CiAgICAgKChJT29iamVjdCopc2VsZiktPnBvcyArPSBuOwotICAgIHJldHVybiBuOworICAgIHJldHVybiAoaW50KW47CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xODgsMjYgKzE5NSwzMCBAQAogCiBzdGF0aWMgaW50CiBJT19jcmVhZGxpbmUoUHlPYmplY3QgKnNlbGYsIGNoYXIgKipvdXRwdXQpIHsKLSAgICBjaGFyICpuLCAqczsKLSAgICBQeV9zc2l6ZV90IGw7CisgICAgY2hhciAqbiwgKnN0YXJ0LCAqZW5kOworICAgIFB5X3NzaXplX3QgbGVuOwogCiAgICAgaWYgKCFJT19fb3BlbmNoZWNrKElPT09CSkVDVChzZWxmKSkpIHJldHVybiAtMTsKIAotICAgIGZvciAobiA9ICgoSU9vYmplY3QqKXNlbGYpLT5idWYgKyAoKElPb2JqZWN0KilzZWxmKS0+cG9zLAotICAgICAgICAgICBzID0gKChJT29iamVjdCopc2VsZiktPmJ1ZiArICgoSU9vYmplY3QqKXNlbGYpLT5zdHJpbmdfc2l6ZTsKLSAgICAgICAgIG4gPCBzICYmICpuICE9ICdcbic7IG4rKyk7CisgICAgbiA9IHN0YXJ0ID0gKChJT29iamVjdCopc2VsZiktPmJ1ZiArICgoSU9vYmplY3QqKXNlbGYpLT5wb3M7CisgICAgZW5kID0gKChJT29iamVjdCopc2VsZiktPmJ1ZiArICgoSU9vYmplY3QqKXNlbGYpLT5zdHJpbmdfc2l6ZTsKKyAgICB3aGlsZSAobiA8IGVuZCAmJiAqbiAhPSAnXG4nKQorICAgICAgICBuKys7CiAKLSAgICBpZiAobiA8IHMpIG4rKzsKKyAgICBpZiAobiA8IGVuZCkgbisrOwogCi0gICAgKm91dHB1dD0oKElPb2JqZWN0KilzZWxmKS0+YnVmICsgKChJT29iamVjdCopc2VsZiktPnBvczsKLSAgICBsID0gbiAtICgoSU9vYmplY3QqKXNlbGYpLT5idWYgLSAoKElPb2JqZWN0KilzZWxmKS0+cG9zOworICAgIGxlbiA9IG4gLSBzdGFydDsKKyAgICBpZiAobGVuID4gSU5UX01BWCkKKyAgICAgICAgbGVuID0gSU5UX01BWDsKIAotICAgIGFzc2VydChJT09PQkpFQ1Qoc2VsZiktPnBvcyA8PSBQWV9TU0laRV9UX01BWCAtIGwpOworICAgICpvdXRwdXQ9c3RhcnQ7CisKKyAgICBhc3NlcnQoSU9PT0JKRUNUKHNlbGYpLT5wb3MgPD0gUFlfU1NJWkVfVF9NQVggLSBsZW4pOwogICAgIGFzc2VydChJT09PQkpFQ1Qoc2VsZiktPnBvcyA+PSAwKTsKICAgICBhc3NlcnQoSU9PT0JKRUNUKHNlbGYpLT5zdHJpbmdfc2l6ZSA+PSAwKTsKIAotICAgICgoSU9vYmplY3QqKXNlbGYpLT5wb3MgKz0gbDsKLSAgICByZXR1cm4gKGludClsOworICAgICgoSU9vYmplY3QqKXNlbGYpLT5wb3MgKz0gbGVuOworICAgIHJldHVybiAoaW50KWxlbjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTIzNSw5ICsyNDYsOSBAQAogICAgIGludCBuOwogICAgIGNoYXIgKm91dHB1dDsKICAgICBQeU9iamVjdCAqcmVzdWx0LCAqbGluZTsKLSAgICBpbnQgaGludCA9IDAsIGxlbmd0aCA9IDA7CisgICAgUHlfc3NpemVfdCBoaW50ID0gMCwgbGVuZ3RoID0gMDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6cmVhZGxpbmVzIiwgJmhpbnQpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxuOnJlYWRsaW5lcyIsICZoaW50KSkgcmV0dXJuIE5VTEw7CiAKICAgICByZXN1bHQgPSBQeUxpc3RfTmV3KDApOwogICAgIGlmICghcmVzdWx0KQpAQCAtMzczLDMxICszODQsNDEgQEAKIAogCiBzdGF0aWMgaW50Ci1PX2N3cml0ZShQeU9iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqYywgUHlfc3NpemVfdCAgbCkgewotICAgIFB5X3NzaXplX3QgbmV3bDsKK09fY3dyaXRlKFB5T2JqZWN0ICpzZWxmLCBjb25zdCBjaGFyICpjLCBQeV9zc2l6ZV90ICBsZW4pIHsKKyAgICBQeV9zc2l6ZV90IG5ld3BvczsKICAgICBPb2JqZWN0ICpvc2VsZjsKICAgICBjaGFyICpuZXdidWY7CiAKICAgICBpZiAoIUlPX19vcGVuY2hlY2soSU9PT0JKRUNUKHNlbGYpKSkgcmV0dXJuIC0xOwogICAgIG9zZWxmID0gKE9vYmplY3QgKilzZWxmOwogCi0gICAgbmV3bCA9IG9zZWxmLT5wb3MrbDsKLSAgICBpZiAobmV3bCA+PSBvc2VsZi0+YnVmX3NpemUpIHsKLSAgICAgICAgb3NlbGYtPmJ1Zl9zaXplICo9IDI7Ci0gICAgICAgIGlmIChvc2VsZi0+YnVmX3NpemUgPD0gbmV3bCkgewotICAgICAgICAgICAgYXNzZXJ0KG5ld2wgKyAxIDwgSU5UX01BWCk7Ci0gICAgICAgICAgICBvc2VsZi0+YnVmX3NpemUgPSAoaW50KShuZXdsKzEpOworICAgIGlmIChsZW4gPiBJTlRfTUFYKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImxlbmd0aCB0b28gbGFyZ2UiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBhc3NlcnQobGVuID49IDApOworICAgIGlmIChvc2VsZi0+cG9zID49IFBZX1NTSVpFX1RfTUFYIC0gbGVuKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5ldyBwb3NpdGlvbiB0b28gbGFyZ2UiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBuZXdwb3MgPSBvc2VsZi0+cG9zICsgbGVuOworICAgIGlmIChuZXdwb3MgPj0gb3NlbGYtPmJ1Zl9zaXplKSB7CisgICAgICAgIHNpemVfdCBuZXdzaXplID0gb3NlbGYtPmJ1Zl9zaXplOworICAgICAgICBuZXdzaXplICo9IDI7CisgICAgICAgIGlmIChuZXdzaXplIDw9IChzaXplX3QpbmV3cG9zIHx8IG5ld3NpemUgPiBQWV9TU0laRV9UX01BWCkgeworICAgICAgICAgICAgYXNzZXJ0KG5ld3BvcyA8IFBZX1NTSVpFX1RfTUFYIC0gMSk7CisgICAgICAgICAgICBuZXdzaXplID0gbmV3cG9zICsgMTsKICAgICAgICAgfQotICAgICAgICBuZXdidWYgPSAoY2hhciopcmVhbGxvYyhvc2VsZi0+YnVmLCBvc2VsZi0+YnVmX3NpemUpOworICAgICAgICBuZXdidWYgPSAoY2hhciopcmVhbGxvYyhvc2VsZi0+YnVmLCBuZXdzaXplKTsKICAgICAgICAgaWYgKCFuZXdidWYpIHsKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwib3V0IG9mIG1lbW9yeSIpOwotICAgICAgICAgICAgZnJlZShvc2VsZi0+YnVmKTsKLSAgICAgICAgICAgIG9zZWxmLT5idWYgPSAwOwotICAgICAgICAgICAgb3NlbGYtPmJ1Zl9zaXplID0gb3NlbGYtPnBvcyA9IDA7CiAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG9zZWxmLT5idWZfc2l6ZSA9IChQeV9zc2l6ZV90KW5ld3NpemU7CiAgICAgICAgIG9zZWxmLT5idWYgPSBuZXdidWY7Ci0gICAgICB9CisgICAgfQogCiAgICAgaWYgKG9zZWxmLT5zdHJpbmdfc2l6ZSA8IG9zZWxmLT5wb3MpIHsKICAgICAgICAgLyogSW4gY2FzZSBvZiBvdmVyc2VlaywgcGFkIHdpdGggbnVsbCBieXRlcyB0aGUgYnVmZmVyIHJlZ2lvbiBiZXR3ZWVuCkBAIC00MTIsMjYgKzQzMywyNyBAQAogICAgICAgICAgICAgICAgKG9zZWxmLT5wb3MgLSBvc2VsZi0+c3RyaW5nX3NpemUpICogc2l6ZW9mKGNoYXIpKTsKICAgICB9CiAKLSAgICBtZW1jcHkob3NlbGYtPmJ1Zitvc2VsZi0+cG9zLGMsbCk7CisgICAgbWVtY3B5KG9zZWxmLT5idWYgKyBvc2VsZi0+cG9zLCBjLCBsZW4pOwogCi0gICAgYXNzZXJ0KG9zZWxmLT5wb3MgKyBsIDwgSU5UX01BWCk7Ci0gICAgb3NlbGYtPnBvcyArPSAoaW50KWw7CisgICAgb3NlbGYtPnBvcyA9IG5ld3BvczsKIAogICAgIGlmIChvc2VsZi0+c3RyaW5nX3NpemUgPCBvc2VsZi0+cG9zKSB7CiAgICAgICAgIG9zZWxmLT5zdHJpbmdfc2l6ZSA9IG9zZWxmLT5wb3M7CiAgICAgfQogCi0gICAgcmV0dXJuIChpbnQpbDsKKyAgICByZXR1cm4gKGludClsZW47CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBPX3dyaXRlKE9vYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKSB7Ci0gICAgY2hhciAqYzsKLSAgICBpbnQgbDsKKyAgICBQeV9idWZmZXIgYnVmOworICAgIGludCByZXN1bHQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInQjOndyaXRlIiwgJmMsICZsKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKjp3cml0ZSIsICZidWYpKSByZXR1cm4gTlVMTDsKIAotICAgIGlmIChPX2N3cml0ZSgoUHlPYmplY3QqKXNlbGYsYyxsKSA8IDApIHJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IE9fY3dyaXRlKChQeU9iamVjdCopc2VsZiwgYnVmLmJ1ZiwgYnVmLmxlbik7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmKTsKKyAgICBpZiAocmVzdWx0IDwgMCkgcmV0dXJuIE5VTEw7CiAKICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgcmV0dXJuIFB5X05vbmU7CkBAIC01ODQsNyArNjA2LDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIElfY2xvc2UoSW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkgewotICAgIFB5X0NMRUFSKHNlbGYtPnBidWYpOworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnNlbGYtPnBidWYpOwogICAgIHNlbGYtPmJ1ZiA9IE5VTEw7CiAKICAgICBzZWxmLT5wb3MgPSBzZWxmLT5zdHJpbmdfc2l6ZSA9IDA7CkBAIC02MTMsNyArNjM1LDcgQEAKIAogc3RhdGljIHZvaWQKIElfZGVhbGxvYyhJb2JqZWN0ICpzZWxmKSB7Ci0gIFB5X1hERUNSRUYoc2VsZi0+cGJ1Zik7CisgIFB5QnVmZmVyX1JlbGVhc2UoJnNlbGYtPnBidWYpOwogICBQeU9iamVjdF9EZWwoc2VsZik7CiB9CiAKQEAgLTY1OCwyNSArNjgwLDI2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmV3SW9iamVjdChQeU9iamVjdCAqcykgewogICBJb2JqZWN0ICpzZWxmOwotICBjaGFyICpidWY7Ci0gIFB5X3NzaXplX3Qgc2l6ZTsKKyAgUHlfYnVmZmVyIGJ1ZjsKKyAgUHlPYmplY3QgKmFyZ3M7CisgIGludCByZXN1bHQ7CiAKLSAgaWYgKFB5VW5pY29kZV9DaGVjayhzKSkgewotICAgIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIocywgKGNvbnN0IGNoYXIgKiopJmJ1ZiwgJnNpemUpICE9IDApCisgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCIoTykiLCBzKTsKKyAgaWYgKGFyZ3MgPT0gTlVMTCkKICAgICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGVsc2UgaWYgKFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcihzLCAoY29uc3Qgdm9pZCAqKikmYnVmLCAmc2l6ZSkpIHsKLSAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0ZWQgcmVhZCBidWZmZXIsICUuMjAwcyBmb3VuZCIsCi0gICAgICAgICAgICAgICAgIHMtPm9iX3R5cGUtPnRwX25hbWUpOwotICAgIHJldHVybiBOVUxMOwotICB9CisgIHJlc3VsdCA9IFB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqOlN0cmluZ0lPIiwgJmJ1Zik7CisgIFB5X0RFQ1JFRihhcmdzKTsKKyAgaWYgKCFyZXN1bHQpCisgICAgICByZXR1cm4gTlVMTDsKIAogICBzZWxmID0gUHlPYmplY3RfTmV3KElvYmplY3QsICZJdHlwZSk7Ci0gIGlmICghc2VsZikgcmV0dXJuIE5VTEw7Ci0gIFB5X0lOQ1JFRihzKTsKLSAgc2VsZi0+YnVmPWJ1ZjsKLSAgc2VsZi0+c3RyaW5nX3NpemU9c2l6ZTsKLSAgc2VsZi0+cGJ1Zj1zOworICBpZiAoIXNlbGYpIHsKKyAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmJ1Zik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBzZWxmLT5idWY9YnVmLmJ1ZjsKKyAgc2VsZi0+c3RyaW5nX3NpemU9YnVmLmxlbjsKKyAgc2VsZi0+cGJ1Zj1idWY7CiAgIHNlbGYtPnBvcz0wOwogCiAgIHJldHVybiAoUHlPYmplY3QqKXNlbGY7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NkbW9kdWxlLmMgYi9Nb2R1bGVzL2NkbW9kdWxlLmMKaW5kZXggOGRmYjc2OS4uOWVlOWIwYiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jZG1vZHVsZS5jCisrKyBiL01vZHVsZXMvY2Rtb2R1bGUuYwpAQCAtNTM1LDEwICs1MzUsOCBAQAogCiAgICAgLyogbm8gc2Vuc2UgaW4ga2VlcGluZyB0aGUgY2FsbGJhY2tzLCBzbyByZW1vdmUgdGhlbSAqLwogICAgIGZvciAoaSA9IDA7IGkgPCBOQ0FMTEJBQ0tTOyBpKyspIHsKLSAgICAgICAgUHlfWERFQ1JFRihzZWxmLT5vYl9jZGNhbGxiYWNrc1tpXS5vYl9jZGNhbGxiYWNrKTsKLSAgICAgICAgc2VsZi0+b2JfY2RjYWxsYmFja3NbaV0ub2JfY2RjYWxsYmFjayA9IE5VTEw7Ci0gICAgICAgIFB5X1hERUNSRUYoc2VsZi0+b2JfY2RjYWxsYmFja3NbaV0ub2JfY2RjYWxsYmFja2FyZyk7Ci0gICAgICAgIHNlbGYtPm9iX2NkY2FsbGJhY2tzW2ldLm9iX2NkY2FsbGJhY2thcmcgPSBOVUxMOworICAgICAgICBQeV9DTEVBUihzZWxmLT5vYl9jZGNhbGxiYWNrc1tpXS5vYl9jZGNhbGxiYWNrKTsKKyAgICAgICAgUHlfQ0xFQVIoc2VsZi0+b2JfY2RjYWxsYmFja3NbaV0ub2JfY2RjYWxsYmFja2FyZyk7CiAgICAgfQogCiAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwpAQCAtNTg4LDExICs1ODYsOSBAQAogCiAgICAgQ0RyZW1vdmVjYWxsYmFjayhzZWxmLT5vYl9jZHBhcnNlciwgKENEREFUQVRZUEVTKSB0eXBlKTsKIAotICAgIFB5X1hERUNSRUYoc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFjayk7Ci0gICAgc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFjayA9IE5VTEw7CisgICAgUHlfQ0xFQVIoc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFjayk7CiAKLSAgICBQeV9YREVDUkVGKHNlbGYtPm9iX2NkY2FsbGJhY2tzW3R5cGVdLm9iX2NkY2FsbGJhY2thcmcpOwotICAgIHNlbGYtPm9iX2NkY2FsbGJhY2tzW3R5cGVdLm9iX2NkY2FsbGJhY2thcmcgPSBOVUxMOworICAgIFB5X0NMRUFSKHNlbGYtPm9iX2NkY2FsbGJhY2tzW3R5cGVdLm9iX2NkY2FsbGJhY2thcmcpOwogCiAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgIHJldHVybiBQeV9Ob25lOwpAQCAtNjY4LDEwICs2NjQsOCBAQAogICAgIGludCBpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IE5DQUxMQkFDS1M7IGkrKykgewotICAgICAgICBQeV9YREVDUkVGKHNlbGYtPm9iX2NkY2FsbGJhY2tzW2ldLm9iX2NkY2FsbGJhY2spOwotICAgICAgICBzZWxmLT5vYl9jZGNhbGxiYWNrc1tpXS5vYl9jZGNhbGxiYWNrID0gTlVMTDsKLSAgICAgICAgUHlfWERFQ1JFRihzZWxmLT5vYl9jZGNhbGxiYWNrc1tpXS5vYl9jZGNhbGxiYWNrYXJnKTsKLSAgICAgICAgc2VsZi0+b2JfY2RjYWxsYmFja3NbaV0ub2JfY2RjYWxsYmFja2FyZyA9IE5VTEw7CisgICAgICAgIFB5X0NMRUFSKHNlbGYtPm9iX2NkY2FsbGJhY2tzW2ldLm9iX2NkY2FsbGJhY2spOworICAgICAgICBQeV9DTEVBUihzZWxmLT5vYl9jZGNhbGxiYWNrc1tpXS5vYl9jZGNhbGxiYWNrYXJnKTsKICAgICB9CiAgICAgQ0RkZWxldGVwYXJzZXIoc2VsZi0+b2JfY2RwYXJzZXIpOwogICAgIFB5T2JqZWN0X0RlbChzZWxmKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvY21hdGhtb2R1bGUuYyBiL01vZHVsZXMvY21hdGhtb2R1bGUuYwppbmRleCAwZGM2YmRiLi41NzIwNjc4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NtYXRobW9kdWxlLmMKKysrIGIvTW9kdWxlcy9jbWF0aG1vZHVsZS5jCkBAIC0xMDA2LDYgKzEwMDYsMTMgQEAKICAgICAgICAgZWxzZQogICAgICAgICAgICAgZXJybm8gPSAwOwogICAgIH0KKyAgICBlbHNlIGlmIChwaGkgPT0gMC4wKSB7CisgICAgICAgIC8qIFdvcmthcm91bmQgZm9yIGJ1Z2d5IHJlc3VsdHMgd2l0aCBwaGk9LTAuMCBvbiBPUyBYIDEwLjguICBTZWUKKyAgICAgICAgICAgYnVncy5weXRob24ub3JnL2lzc3VlMTg1MTMuICovCisgICAgICAgIHoucmVhbCA9IHI7CisgICAgICAgIHouaW1hZyA9IHIgKiBwaGk7CisgICAgICAgIGVycm5vID0gMDsKKyAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIHoucmVhbCA9IHIgKiBjb3MocGhpKTsKICAgICAgICAgei5pbWFnID0gciAqIHNpbihwaGkpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9kYm1tb2R1bGUuYyBiL01vZHVsZXMvZGJtbW9kdWxlLmMKaW5kZXggZjljOTlhOC4uOGIxNmRlZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9kYm1tb2R1bGUuYworKysgYi9Nb2R1bGVzL2RibW1vZHVsZS5jCkBAIC0xNjgsMTEgKzE2OCwxMyBAQAogZGJtX2NvbnRhaW5zKHJlZ2lzdGVyIGRibW9iamVjdCAqZHAsIFB5T2JqZWN0ICp2KQogewogICAgIGRhdHVtIGtleSwgdmFsOworICAgIGNoYXIgKnB0cjsKKyAgICBQeV9zc2l6ZV90IHNpemU7CiAKLSAgICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKHYsIChjaGFyICoqKSZrZXkuZHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeV9zc2l6ZV90ICopJmtleS5kc2l6ZSkpIHsKKyAgICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKHYsICZwdHIsICZzaXplKSkKICAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KKyAgICBrZXkuZHB0ciA9IHB0cjsKKyAgICBrZXkuZHNpemUgPSBzaXplOwogCiAgICAgLyogRXhwYW5kIGNoZWNrX2RibW9iamVjdF9vcGVuIHRvIHJldHVybiAtMSAqLwogICAgIGlmIChkcC0+ZGlfZGJtID09IE5VTEwpIHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvZXJybm9tb2R1bGUuYyBiL01vZHVsZXMvZXJybm9tb2R1bGUuYwppbmRleCA2OGMzYzQ5Li44N2ViYWIwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2Vycm5vbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9lcnJub21vZHVsZS5jCkBAIC03ODMsNiArNzgzLDkgQEAKICNpZmRlZiBXU0FOCiAgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FOIiwgV1NBTiwgIkVycm9yIFdTQU4iKTsKICNlbmRpZgorI2lmZGVmIEVOT1RTVVAKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1RTVVAiLCBFTk9UU1VQLCAiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgogCiAgICAgUHlfREVDUkVGKGRlKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvZXhwYXQvQ09QWUlORyBiL01vZHVsZXMvZXhwYXQvQ09QWUlORwppbmRleCBmYzk3YjAyLi5kY2I0NTA2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2V4cGF0L0NPUFlJTkcKKysrIGIvTW9kdWxlcy9leHBhdC9DT1BZSU5HCkBAIC0xLDUgKzEsNiBAQAogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwIFRoYWkgT3BlbiBTb3VyY2UgU29mdHdhcmUgQ2VudGVyIEx0ZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBDbGFyayBDb29wZXIKK0NvcHlyaWdodCAoYykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBFeHBhdCBtYWludGFpbmVycy4KIAogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKZGlmZiAtLWdpdCBhL01vZHVsZXMvZXhwYXQvYW1pZ2Fjb25maWcuaCBiL01vZHVsZXMvZXhwYXQvYW1pZ2Fjb25maWcuaAppbmRleCA2NzgxYTcxLi44NmM2MTE1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2V4cGF0L2FtaWdhY29uZmlnLmgKKysrIGIvTW9kdWxlcy9leHBhdC9hbWlnYWNvbmZpZy5oCkBAIC0xMCw2NiArMTAsMTIgQEAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Y2hlY2suaD4gaGVhZGVyIGZpbGUuICovCiAjdW5kZWYgSEFWRV9DSEVDS19ICiAKLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZGxmY24uaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9ETEZDTl9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfRkNOVExfSCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cGFnZXNpemUnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKLQogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtZW1tb3ZlJyBmdW5jdGlvbi4gKi8KICNkZWZpbmUgSEFWRV9NRU1NT1ZFIDEKIAotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9NRU1PUllfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAqLwotI3VuZGVmIEhBVkVfTU1BUAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQotCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KICNkZWZpbmUgSEFWRV9VTklTVERfSCAxCiAKLS8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLwotI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiZXhwYXQtYnVnc0BtYWlsLmxpYmV4cGF0Lm9yZyIKLQotLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLwotI2RlZmluZSBQQUNLQUdFX05BTUUgImV4cGF0IgotCi0vKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCi0jZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJleHBhdCAxLjk1LjgiCi0KLS8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX1RBUk5BTUUKLQotLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KLSNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIxLjk1LjgiCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLwotI2RlZmluZSBTVERDX0hFQURFUlMgMQotCiAvKiB3aGV0aGVyIGJ5dGVvcmRlciBpcyBiaWdlbmRpYW4gKi8KICNkZWZpbmUgV09SRFNfQklHRU5ESUFOCiAKQEAgLTgzLDE0ICsyOSw0IEBACiAvKiBEZWZpbmUgdG8gbWFrZSBYTUwgTmFtZXNwYWNlcyBmdW5jdGlvbmFsaXR5IGF2YWlsYWJsZS4gKi8KICNkZWZpbmUgWE1MX05TCiAKLS8qIERlZmluZSB0byBlbXB0eSBpZiBgY29uc3QnIGRvZXMgbm90IGNvbmZvcm0gdG8gQU5TSSBDLiAqLwotI3VuZGVmIGNvbnN0Ci0KLS8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2VzIG5vdCBkZWZpbmUuICovCi0jdW5kZWYgb2ZmX3QKLQotLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2VzIG5vdCBkZWZpbmUuICovCi0jdW5kZWYgc2l6ZV90Ci0KLQogI2VuZGlmICAvKiBBTUlHQUNPTkZJR19IICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2V4cGF0L2FzY2lpLmggYi9Nb2R1bGVzL2V4cGF0L2FzY2lpLmgKaW5kZXggMzM3ZTViYi4uZDEwNTMwYiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9leHBhdC9hc2NpaS5oCisrKyBiL01vZHVsZXMvZXhwYXQvYXNjaWkuaApAQCAtODMsMyArODMsMTAgQEAKICNkZWZpbmUgQVNDSUlfTFNRQiAweDVCCiAjZGVmaW5lIEFTQ0lJX1JTUUIgMHg1RAogI2RlZmluZSBBU0NJSV9VTkRFUlNDT1JFIDB4NUYKKyNkZWZpbmUgQVNDSUlfTFBBUkVOIDB4MjgKKyNkZWZpbmUgQVNDSUlfUlBBUkVOIDB4MjkKKyNkZWZpbmUgQVNDSUlfRkYgMHgwQworI2RlZmluZSBBU0NJSV9TTEFTSCAweDJGCisjZGVmaW5lIEFTQ0lJX0hBU0ggMHgyMworI2RlZmluZSBBU0NJSV9QSVBFIDB4N0MKKyNkZWZpbmUgQVNDSUlfQ09NTUEgMHgyQwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9leHBhdC9leHBhdC5oIGIvTW9kdWxlcy9leHBhdC9leHBhdC5oCmluZGV4IGNmMTEzZWUuLjA2YjVkZTAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZXhwYXQvZXhwYXQuaAorKysgYi9Nb2R1bGVzL2V4cGF0L2V4cGF0LmgKQEAgLTc0Miw2ICs3NDIsMjkgQEAKIFhNTFBBUlNFQVBJKGludCkKIFhNTF9HZXRJZEF0dHJpYnV0ZUluZGV4KFhNTF9QYXJzZXIgcGFyc2VyKTsKIAorI2lmZGVmIFhNTF9BVFRSX0lORk8KKy8qIFNvdXJjZSBmaWxlIGJ5dGUgb2Zmc2V0cyBmb3IgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgYXR0cmlidXRlIG5hbWVzIGFuZCB2YWx1ZXMuCisgICBUaGUgdmFsdWUgaW5kaWNlcyBhcmUgZXhjbHVzaXZlIG9mIHN1cnJvdW5kaW5nIHF1b3RlczsgdGh1cyBpbiBhIFVURi04IHNvdXJjZQorICAgZmlsZSBhbiBhdHRyaWJ1dGUgdmFsdWUgb2YgImJsYWgiIHdpbGwgeWllbGQ6CisgICBpbmZvLT52YWx1ZUVuZCAtIGluZm8tPnZhbHVlU3RhcnQgPSA0IGJ5dGVzLgorKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgWE1MX0luZGV4ICBuYW1lU3RhcnQ7ICAvKiBPZmZzZXQgdG8gYmVnaW5uaW5nIG9mIHRoZSBhdHRyaWJ1dGUgbmFtZS4gKi8KKyAgWE1MX0luZGV4ICBuYW1lRW5kOyAgICAvKiBPZmZzZXQgYWZ0ZXIgdGhlIGF0dHJpYnV0ZSBuYW1lJ3MgbGFzdCBieXRlLiAqLworICBYTUxfSW5kZXggIHZhbHVlU3RhcnQ7IC8qIE9mZnNldCB0byBiZWdpbm5pbmcgb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZS4gKi8KKyAgWE1MX0luZGV4ICB2YWx1ZUVuZDsgICAvKiBPZmZzZXQgYWZ0ZXIgdGhlIGF0dHJpYnV0ZSB2YWx1ZSdzIGxhc3QgYnl0ZS4gKi8KK30gWE1MX0F0dHJJbmZvOworCisvKiBSZXR1cm5zIGFuIGFycmF5IG9mIFhNTF9BdHRySW5mbyBzdHJ1Y3R1cmVzIGZvciB0aGUgYXR0cmlidXRlL3ZhbHVlIHBhaXJzCisgICBwYXNzZWQgaW4gbGFzdCBjYWxsIHRvIHRoZSBYTUxfU3RhcnRFbGVtZW50SGFuZGxlciB0aGF0IHdlcmUgc3BlY2lmaWVkCisgICBpbiB0aGUgc3RhcnQtdGFnIHJhdGhlciB0aGFuIGRlZmF1bHRlZC4gRWFjaCBhdHRyaWJ1dGUvdmFsdWUgcGFpciBjb3VudHMKKyAgIGFzIDE7IHRodXMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBhcnJheSBpcworICAgWE1MX0dldFNwZWNpZmllZEF0dHJpYnV0ZUNvdW50KHBhcnNlcikgLyAyLgorKi8KK1hNTFBBUlNFQVBJKGNvbnN0IFhNTF9BdHRySW5mbyAqKQorWE1MX0dldEF0dHJpYnV0ZUluZm8oWE1MX1BhcnNlciBwYXJzZXIpOworI2VuZGlmCisKIC8qIFBhcnNlcyBzb21lIGlucHV0LiBSZXR1cm5zIFhNTF9TVEFUVVNfRVJST1IgaWYgYSBmYXRhbCBlcnJvciBpcwogICAgZGV0ZWN0ZWQuICBUaGUgbGFzdCBjYWxsIHRvIFhNTF9QYXJzZSBtdXN0IGhhdmUgaXNGaW5hbCB0cnVlOyBsZW4KICAgIG1heSBiZSB6ZXJvIGZvciB0aGlzIGNhbGwgKG9yIGFueSBvdGhlcikuCkBAIC04ODMsNiArOTA2LDE3IEBACiBYTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nKFhNTF9QYXJzZXIgcGFyc2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIFhNTF9QYXJhbUVudGl0eVBhcnNpbmcgcGFyc2luZyk7CiAKKy8qIFNldHMgdGhlIGhhc2ggc2FsdCB0byB1c2UgZm9yIGludGVybmFsIGhhc2ggY2FsY3VsYXRpb25zLgorICAgSGVscHMgaW4gcHJldmVudGluZyBEb1MgYXR0YWNrcyBiYXNlZCBvbiBwcmVkaWN0aW5nIGhhc2gKKyAgIGZ1bmN0aW9uIGJlaGF2aW9yLiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBwYXJzaW5nIGlzIHN0YXJ0ZWQuCisgICBSZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bCwgMCB3aGVuIGNhbGxlZCBhZnRlciBwYXJzaW5nIGhhcyBzdGFydGVkLgorKi8KK1hNTFBBUlNFQVBJKGludCkKK1hNTF9TZXRIYXNoU2FsdChYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGhhc2hfc2FsdCk7CisKKyNkZWZpbmUgWE1MX0hBU19TRVRfSEFTSF9TQUxUICAvKiBQeXRob24gT25seTogRGVmaW5lZCBmb3IgcHlleHBhdC5jLiAqLworCiAvKiBJZiBYTUxfUGFyc2Ugb3IgWE1MX1BhcnNlQnVmZmVyIGhhdmUgcmV0dXJuZWQgWE1MX1NUQVRVU19FUlJPUiwgdGhlbgogICAgWE1MX0dldEVycm9yQ29kZSByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvci4KICovCkBAIC05ODMsNyArMTAxNyw5IEBACiAgIFhNTF9GRUFUVVJFX01JTl9TSVpFLAogICBYTUxfRkVBVFVSRV9TSVpFT0ZfWE1MX0NIQVIsCiAgIFhNTF9GRUFUVVJFX1NJWkVPRl9YTUxfTENIQVIsCi0gIFhNTF9GRUFUVVJFX05TCisgIFhNTF9GRUFUVVJFX05TLAorICBYTUxfRkVBVFVSRV9MQVJHRV9TSVpFLAorICBYTUxfRkVBVFVSRV9BVFRSX0lORk8KICAgLyogQWRkaXRpb25hbCBmZWF0dXJlcyBtdXN0IGJlIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhpcyBlbnVtLiAqLwogfTsKIApAQCAtMTAwMyw3ICsxMDM5LDcgQEAKICAgIGNoYW5nZSB0byBtYWpvciBvciBtaW5vciB2ZXJzaW9uLgogKi8KICNkZWZpbmUgWE1MX01BSk9SX1ZFUlNJT04gMgotI2RlZmluZSBYTUxfTUlOT1JfVkVSU0lPTiAwCisjZGVmaW5lIFhNTF9NSU5PUl9WRVJTSU9OIDEKICNkZWZpbmUgWE1MX01JQ1JPX1ZFUlNJT04gMAogCiAjaWZkZWYgX19jcGx1c3BsdXMKZGlmZiAtLWdpdCBhL01vZHVsZXMvZXhwYXQvZXhwYXRfZXh0ZXJuYWwuaCBiL01vZHVsZXMvZXhwYXQvZXhwYXRfZXh0ZXJuYWwuaAppbmRleCBmMDU0MDE0Li5mMzM3ZTFjIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2V4cGF0L2V4cGF0X2V4dGVybmFsLmgKKysrIGIvTW9kdWxlcy9leHBhdC9leHBhdF9leHRlcm5hbC5oCkBAIC0zOCw5ICszOCw5IEBACiAgICBzeXN0ZW0gaGVhZGVycyBtYXkgYXNzdW1lIHRoZSBjZGVjbCBjb252ZW50aW9uLgogKi8KICNpZm5kZWYgWE1MQ0FMTAotI2lmIGRlZmluZWQoWE1MX1VTRV9NU0NfRVhURU5TSU9OUykKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQogI2RlZmluZSBYTUxDQUxMIF9fY2RlY2wKLSNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19pMzg2KQorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2kzODYpICYmICFkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpCiAjZGVmaW5lIFhNTENBTEwgX19hdHRyaWJ1dGVfXygoY2RlY2wpKQogI2Vsc2UKIC8qIEZvciBhbnkgcGxhdGZvcm0gd2hpY2ggdXNlcyB0aGlzIGRlZmluaXRpb24gYW5kIHN1cHBvcnRzIG1vcmUgdGhhbgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9leHBhdC9pbnRlcm5hbC5oIGIvTW9kdWxlcy9leHBhdC9pbnRlcm5hbC5oCmluZGV4IGZmMDU2YzYuLmRkNTQ1NDggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZXhwYXQvaW50ZXJuYWwuaAorKysgYi9Nb2R1bGVzL2V4cGF0L2ludGVybmFsLmgKQEAgLTIwLDcgKzIwLDcgQEAKICAgICAgICAgIGFuZCB0aGVyZWZvcmUgc3ViamVjdCB0byBjaGFuZ2UuCiAqLwogCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2kzODZfXykKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9faTM4Nl9fKSAmJiAhZGVmaW5lZChfX01JTkdXMzJfXykKIC8qIFdlJ2xsIHVzZSB0aGlzIHZlcnNpb24gYnkgZGVmYXVsdCBvbmx5IHdoZXJlIHdlIGtub3cgaXQgaGVscHMuCiAKICAgIHJlZ3Bhcm0oKSBnZW5lcmF0ZXMgd2FybmluZ3Mgb24gU29sYXJpcyBib3hlcy4gICBTZWUgU0YgYnVnICM2OTI4NzguCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2V4cGF0L3B5ZXhwYXRucy5oIGIvTW9kdWxlcy9leHBhdC9weWV4cGF0bnMuaAppbmRleCA3ZmJkMzQxLi4yZjJmNGY5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2V4cGF0L3B5ZXhwYXRucy5oCisrKyBiL01vZHVsZXMvZXhwYXQvcHlleHBhdG5zLmgKQEAgLTk3LDYgKzk3LDcgQEAKICNkZWZpbmUgWE1MX1NldEVudGl0eURlY2xIYW5kbGVyICAgICAgICBQeUV4cGF0X1hNTF9TZXRFbnRpdHlEZWNsSGFuZGxlcgogI2RlZmluZSBYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIFB5RXhwYXRfWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlcgogI2RlZmluZSBYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnICBQeUV4cGF0X1hNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcKKyNkZWZpbmUgWE1MX1NldEhhc2hTYWx0ICAgICAgICAgICAgICAgICBQeUV4cGF0X1hNTF9TZXRIYXNoU2FsdAogI2RlZmluZSBYTUxfU2V0TmFtZXNwYWNlRGVjbEhhbmRsZXIgICAgIFB5RXhwYXRfWE1MX1NldE5hbWVzcGFjZURlY2xIYW5kbGVyCiAjZGVmaW5lIFhNTF9TZXROb3RhdGlvbkRlY2xIYW5kbGVyICAgICAgUHlFeHBhdF9YTUxfU2V0Tm90YXRpb25EZWNsSGFuZGxlcgogI2RlZmluZSBYTUxfU2V0Tm90U3RhbmRhbG9uZUhhbmRsZXIgICAgIFB5RXhwYXRfWE1MX1NldE5vdFN0YW5kYWxvbmVIYW5kbGVyCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2V4cGF0L3dhdGNvbWNvbmZpZy5oIGIvTW9kdWxlcy9leHBhdC93YXRjb21jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjA1ZTNmCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9leHBhdC93YXRjb21jb25maWcuaApAQCAtMCwwICsxLDQ3IEBACisvKiBleHBhdF9jb25maWcuaCBmb3IgdXNlIHdpdGggT3BlbiBXYXRjb20gMS41IGFuZCBhYm92ZS4gICovCisKKyNpZm5kZWYgV0FUQ09NQ09ORklHX0gKKyNkZWZpbmUgV0FUQ09NQ09ORklHX0gKKworI2lmZGVmIF9fTlRfXworI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjaW5jbHVkZSA8d2luZG93cy5oPgorI3VuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNlbmRpZgorCisvKiAxMjM0ID0gTElMX0VORElBTiwgNDMyMSA9IEJJR0VORElBTiAqLworI2RlZmluZSBCWVRFT1JERVIgMTIzNAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1lbW1vdmUnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX01FTU1PVkUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9VTklTVERfSCAxCisKKy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLworI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiZXhwYXQtYnVnc0BtYWlsLmxpYmV4cGF0Lm9yZyIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX05BTUUgImV4cGF0IgorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJleHBhdCAyLjAuMCIKKworLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfVEFSTkFNRQorCisvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIjIuMC4wIgorCisvKiBEZWZpbmUgdG8gc3BlY2lmeSBob3cgbXVjaCBjb250ZXh0IHRvIHJldGFpbiBhcm91bmQgdGhlIGN1cnJlbnQgcGFyc2UKKyAgIHBvaW50LiAqLworI2RlZmluZSBYTUxfQ09OVEVYVF9CWVRFUyAxMDI0CisKKy8qIERlZmluZSB0byBtYWtlIHBhcmFtZXRlciBlbnRpdHkgcGFyc2luZyBmdW5jdGlvbmFsaXR5IGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgWE1MX0RURCAxCisKKy8qIERlZmluZSB0byBtYWtlIFhNTCBOYW1lc3BhY2VzIGZ1bmN0aW9uYWxpdHkgYXZhaWxhYmxlLiAqLworI2RlZmluZSBYTUxfTlMgMQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9leHBhdC94bWxwYXJzZS5jIGIvTW9kdWxlcy9leHBhdC94bWxwYXJzZS5jCmluZGV4IDEwNTk1OGIuLmYzNWFhMzYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZXhwYXQveG1scGFyc2UuYworKysgYi9Nb2R1bGVzL2V4cGF0L3htbHBhcnNlLmMKQEAgLTIsMjIgKzIsMjcgQEAKICAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBjb3B5aW5nIHBlcm1pc3Npb24uCiAqLwogCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+ICAgICAgICAgICAgICAgICAgICAgLyogbWVtc2V0KCksIG1lbWNweSgpICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+ICAgICAgICAgICAgICAgICAgICAgLyogVUlOVF9NQVggKi8KKyNpbmNsdWRlIDx0aW1lLmg+ICAgICAgICAgICAgICAgICAgICAgICAvKiB0aW1lKCkgKi8KKwogI2RlZmluZSBYTUxfQlVJTERJTkdfRVhQQVQgMQogCiAjaWZkZWYgQ09NUElMRURfRlJPTV9EU1AKICNpbmNsdWRlICJ3aW5jb25maWcuaCIKICNlbGlmIGRlZmluZWQoTUFDT1NfQ0xBU1NJQykKICNpbmNsdWRlICJtYWNjb25maWcuaCIKLSNlbGlmIGRlZmluZWQoX19hbWlnYW9zNF9fKQorI2VsaWYgZGVmaW5lZChfX2FtaWdhb3NfXykKICNpbmNsdWRlICJhbWlnYWNvbmZpZy5oIgorI2VsaWYgZGVmaW5lZChfX1dBVENPTUNfXykKKyNpbmNsdWRlICJ3YXRjb21jb25maWcuaCIKICNlbGlmIGRlZmluZWQoSEFWRV9FWFBBVF9DT05GSUdfSCkKICNpbmNsdWRlIDxleHBhdF9jb25maWcuaD4KICNlbmRpZiAvKiBuZGVmIENPTVBJTEVEX0ZST01fRFNQICovCiAKLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4gICAgICAgICAgICAgICAgICAgICAvKiBtZW1zZXQoKSwgbWVtY3B5KCkgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQorI2luY2x1ZGUgImFzY2lpLmgiCiAjaW5jbHVkZSAiZXhwYXQuaCIKIAogI2lmZGVmIFhNTF9VTklDT0RFCkBAIC0yNiw3ICszMSw4IEBACiAjZGVmaW5lIFhtbEdldEludGVybmFsRW5jb2RpbmcgWG1sR2V0VXRmMTZJbnRlcm5hbEVuY29kaW5nCiAjZGVmaW5lIFhtbEdldEludGVybmFsRW5jb2RpbmdOUyBYbWxHZXRVdGYxNkludGVybmFsRW5jb2RpbmdOUwogI2RlZmluZSBYbWxFbmNvZGUgWG1sVXRmMTZFbmNvZGUKLSNkZWZpbmUgTVVTVF9DT05WRVJUKGVuYywgcykgKCEoZW5jKS0+aXNVdGYxNiB8fCAoKCh1bnNpZ25lZCBsb25nKXMpICYgMSkpCisvKiBVc2luZyBwb2ludGVyIHN1YnRyYWN0aW9uIHRvIGNvbnZlcnQgdG8gaW50ZWdlciB0eXBlLiAqLworI2RlZmluZSBNVVNUX0NPTlZFUlQoZW5jLCBzKSAoIShlbmMpLT5pc1V0ZjE2IHx8ICgoKGNoYXIgKikocykgLSAoY2hhciAqKU5VTEwpICYgMSkpCiB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IElDSEFSOwogI2Vsc2UKICNkZWZpbmUgWE1MX0VOQ09ERV9NQVggWE1MX1VURjhfRU5DT0RFX01BWApAQCAtMzIzLDE1ICszMjksMTUgQEAKIHN0YXRpYyBlbnVtIFhNTF9FcnJvcgogaW5pdGlhbGl6ZUVuY29kaW5nKFhNTF9QYXJzZXIgcGFyc2VyKTsKIHN0YXRpYyBlbnVtIFhNTF9FcnJvcgotZG9Qcm9sb2coWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnMsIAotICAgICAgICAgY29uc3QgY2hhciAqZW5kLCBpbnQgdG9rLCBjb25zdCBjaGFyICpuZXh0LCBjb25zdCBjaGFyICoqbmV4dFB0ciwgCitkb1Byb2xvZyhYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcywKKyAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwgaW50IHRvaywgY29uc3QgY2hhciAqbmV4dCwgY29uc3QgY2hhciAqKm5leHRQdHIsCiAgICAgICAgICBYTUxfQm9vbCBoYXZlTW9yZSk7CiBzdGF0aWMgZW51bSBYTUxfRXJyb3IKLXByb2Nlc3NJbnRlcm5hbEVudGl0eShYTUxfUGFyc2VyIHBhcnNlciwgRU5USVRZICplbnRpdHksIAorcHJvY2Vzc0ludGVybmFsRW50aXR5KFhNTF9QYXJzZXIgcGFyc2VyLCBFTlRJVFkgKmVudGl0eSwKICAgICAgICAgICAgICAgICAgICAgICBYTUxfQm9vbCBiZXR3ZWVuRGVjbCk7CiBzdGF0aWMgZW51bSBYTUxfRXJyb3IKIGRvQ29udGVudChYTUxfUGFyc2VyIHBhcnNlciwgaW50IHN0YXJ0VGFnTGV2ZWwsIGNvbnN0IEVOQ09ESU5HICplbmMsCi0gICAgICAgICAgY29uc3QgY2hhciAqc3RhcnQsIGNvbnN0IGNoYXIgKmVuZCwgY29uc3QgY2hhciAqKmVuZFB0ciwgCisgICAgICAgICAgY29uc3QgY2hhciAqc3RhcnQsIGNvbnN0IGNoYXIgKmVuZCwgY29uc3QgY2hhciAqKmVuZFB0ciwKICAgICAgICAgICBYTUxfQm9vbCBoYXZlTW9yZSk7CiBzdGF0aWMgZW51bSBYTUxfRXJyb3IKIGRvQ2RhdGFTZWN0aW9uKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBFTkNPRElORyAqLCBjb25zdCBjaGFyICoqc3RhcnRQdHIsCkBAIC0zNDksNyArMzU1LDcgQEAKIGFkZEJpbmRpbmcoWE1MX1BhcnNlciBwYXJzZXIsIFBSRUZJWCAqcHJlZml4LCBjb25zdCBBVFRSSUJVVEVfSUQgKmF0dElkLAogICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqdXJpLCBCSU5ESU5HICoqYmluZGluZ3NQdHIpOwogc3RhdGljIGludAotZGVmaW5lQXR0cmlidXRlKEVMRU1FTlRfVFlQRSAqdHlwZSwgQVRUUklCVVRFX0lEICosIFhNTF9Cb29sIGlzQ2RhdGEsIAorZGVmaW5lQXR0cmlidXRlKEVMRU1FTlRfVFlQRSAqdHlwZSwgQVRUUklCVVRFX0lEICosIFhNTF9Cb29sIGlzQ2RhdGEsCiAgICAgICAgICAgICAgICAgWE1MX0Jvb2wgaXNJZCwgY29uc3QgWE1MX0NoYXIgKmRmbHRWYWx1ZSwgWE1MX1BhcnNlciBwYXJzZXIpOwogc3RhdGljIGVudW0gWE1MX0Vycm9yCiBzdG9yZUF0dHJpYnV0ZVZhbHVlKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBFTkNPRElORyAqLCBYTUxfQm9vbCBpc0NkYXRhLApAQCAtMzg3LDEyICszOTMsMTMgQEAKIHN0YXRpYyB2b2lkCiBkdGREZXN0cm95KERURCAqcCwgWE1MX0Jvb2wgaXNEb2NFbnRpdHksIGNvbnN0IFhNTF9NZW1vcnlfSGFuZGxpbmdfU3VpdGUgKm1zKTsKIHN0YXRpYyBpbnQKLWR0ZENvcHkoRFREICpuZXdEdGQsIGNvbnN0IERURCAqb2xkRHRkLCBjb25zdCBYTUxfTWVtb3J5X0hhbmRsaW5nX1N1aXRlICptcyk7CitkdGRDb3B5KFhNTF9QYXJzZXIgb2xkUGFyc2VyLAorICAgICAgICBEVEQgKm5ld0R0ZCwgY29uc3QgRFREICpvbGREdGQsIGNvbnN0IFhNTF9NZW1vcnlfSGFuZGxpbmdfU3VpdGUgKm1zKTsKIHN0YXRpYyBpbnQKLWNvcHlFbnRpdHlUYWJsZShIQVNIX1RBQkxFICosIFNUUklOR19QT09MICosIGNvbnN0IEhBU0hfVEFCTEUgKik7Ci0KK2NvcHlFbnRpdHlUYWJsZShYTUxfUGFyc2VyIG9sZFBhcnNlciwKKyAgICAgICAgICAgICAgICBIQVNIX1RBQkxFICosIFNUUklOR19QT09MICosIGNvbnN0IEhBU0hfVEFCTEUgKik7CiBzdGF0aWMgTkFNRUQgKgotbG9va3VwKEhBU0hfVEFCTEUgKnRhYmxlLCBLRVkgbmFtZSwgc2l6ZV90IGNyZWF0ZVNpemUpOworbG9va3VwKFhNTF9QYXJzZXIgcGFyc2VyLCBIQVNIX1RBQkxFICp0YWJsZSwgS0VZIG5hbWUsIHNpemVfdCBjcmVhdGVTaXplKTsKIHN0YXRpYyB2b2lkIEZBU1RDQUxMCiBoYXNoVGFibGVJbml0KEhBU0hfVEFCTEUgKiwgY29uc3QgWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZSAqbXMpOwogc3RhdGljIHZvaWQgRkFTVENBTEwgaGFzaFRhYmxlQ2xlYXIoSEFTSF9UQUJMRSAqKTsKQEAgLTQyNSwxMSArNDMyLDE1IEBACiBnZXRFbGVtZW50VHlwZShYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgRU5DT0RJTkcgKmVuYywKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kKTsKIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2VuZXJhdGVfaGFzaF9zZWNyZXRfc2FsdCh2b2lkKTsKK3N0YXRpYyBYTUxfQm9vbCBzdGFydFBhcnNpbmcoWE1MX1BhcnNlciBwYXJzZXIpOworCiBzdGF0aWMgWE1MX1BhcnNlcgogcGFyc2VyQ3JlYXRlKGNvbnN0IFhNTF9DaGFyICplbmNvZGluZ05hbWUsCiAgICAgICAgICAgICAgY29uc3QgWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZSAqbWVtc3VpdGUsCiAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5hbWVTZXAsCiAgICAgICAgICAgICAgRFREICpkdGQpOworCiBzdGF0aWMgdm9pZAogcGFyc2VySW5pdChYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgWE1MX0NoYXIgKmVuY29kaW5nTmFtZSk7CiAKQEAgLTUyOSw2ICs1NDAsOSBAQAogICBOU19BVFQgKm1fbnNBdHRzOwogICB1bnNpZ25lZCBsb25nIG1fbnNBdHRzVmVyc2lvbjsKICAgdW5zaWduZWQgY2hhciBtX25zQXR0c1Bvd2VyOworI2lmZGVmIFhNTF9BVFRSX0lORk8KKyAgWE1MX0F0dHJJbmZvICptX2F0dEluZm87CisjZW5kaWYKICAgUE9TSVRJT04gbV9wb3NpdGlvbjsKICAgU1RSSU5HX1BPT0wgbV90ZW1wUG9vbDsKICAgU1RSSU5HX1BPT0wgbV90ZW1wMlBvb2w7CkBAIC01NDIsNiArNTU2LDcgQEAKICAgWE1MX0Jvb2wgbV91c2VGb3JlaWduRFREOwogICBlbnVtIFhNTF9QYXJhbUVudGl0eVBhcnNpbmcgbV9wYXJhbUVudGl0eVBhcnNpbmc7CiAjZW5kaWYKKyAgdW5zaWduZWQgbG9uZyBtX2hhc2hfc2VjcmV0X3NhbHQ7CiB9OwogCiAjZGVmaW5lIE1BTExPQyhzKSAocGFyc2VyLT5tX21lbS5tYWxsb2NfZmNuKChzKSkpCkBAIC02MzYsNiArNjUxLDcgQEAKICNkZWZpbmUgbnNBdHRzIChwYXJzZXItPm1fbnNBdHRzKQogI2RlZmluZSBuc0F0dHNWZXJzaW9uIChwYXJzZXItPm1fbnNBdHRzVmVyc2lvbikKICNkZWZpbmUgbnNBdHRzUG93ZXIgKHBhcnNlci0+bV9uc0F0dHNQb3dlcikKKyNkZWZpbmUgYXR0SW5mbyAocGFyc2VyLT5tX2F0dEluZm8pCiAjZGVmaW5lIHRlbXBQb29sIChwYXJzZXItPm1fdGVtcFBvb2wpCiAjZGVmaW5lIHRlbXAyUG9vbCAocGFyc2VyLT5tX3RlbXAyUG9vbCkKICNkZWZpbmUgZ3JvdXBDb25uZWN0b3IgKHBhcnNlci0+bV9ncm91cENvbm5lY3RvcikKQEAgLTY0OSw2ICs2NjUsNyBAQAogI2RlZmluZSB1c2VGb3JlaWduRFREIChwYXJzZXItPm1fdXNlRm9yZWlnbkRURCkKICNkZWZpbmUgcGFyYW1FbnRpdHlQYXJzaW5nIChwYXJzZXItPm1fcGFyYW1FbnRpdHlQYXJzaW5nKQogI2VuZGlmIC8qIFhNTF9EVEQgKi8KKyNkZWZpbmUgaGFzaF9zZWNyZXRfc2FsdCAocGFyc2VyLT5tX2hhc2hfc2VjcmV0X3NhbHQpCiAKIFhNTF9QYXJzZXIgWE1MQ0FMTAogWE1MX1BhcnNlckNyZWF0ZShjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmdOYW1lKQpAQCAtNjY1LDI4ICs2ODIsNDMgQEAKIH0KIAogc3RhdGljIGNvbnN0IFhNTF9DaGFyIGltcGxpY2l0Q29udGV4dFtdID0gewotICAneCcsICdtJywgJ2wnLCAnPScsICdoJywgJ3QnLCAndCcsICdwJywgJzonLCAnLycsICcvJywKLSAgJ3cnLCAndycsICd3JywgJy4nLCAndycsICczJywgJy4nLCAnbycsICdyJywgJ2cnLCAnLycsCi0gICdYJywgJ00nLCAnTCcsICcvJywgJzEnLCAnOScsICc5JywgJzgnLCAnLycsCi0gICduJywgJ2EnLCAnbScsICdlJywgJ3MnLCAncCcsICdhJywgJ2MnLCAnZScsICdcMCcKKyAgQVNDSUlfeCwgQVNDSUlfbSwgQVNDSUlfbCwgQVNDSUlfRVFVQUxTLCBBU0NJSV9oLCBBU0NJSV90LCBBU0NJSV90LCBBU0NJSV9wLAorICBBU0NJSV9DT0xPTiwgQVNDSUlfU0xBU0gsIEFTQ0lJX1NMQVNILCBBU0NJSV93LCBBU0NJSV93LCBBU0NJSV93LAorICBBU0NJSV9QRVJJT0QsIEFTQ0lJX3csIEFTQ0lJXzMsIEFTQ0lJX1BFUklPRCwgQVNDSUlfbywgQVNDSUlfciwgQVNDSUlfZywKKyAgQVNDSUlfU0xBU0gsIEFTQ0lJX1gsIEFTQ0lJX00sIEFTQ0lJX0wsIEFTQ0lJX1NMQVNILCBBU0NJSV8xLCBBU0NJSV85LAorICBBU0NJSV85LCBBU0NJSV84LCBBU0NJSV9TTEFTSCwgQVNDSUlfbiwgQVNDSUlfYSwgQVNDSUlfbSwgQVNDSUlfZSwKKyAgQVNDSUlfcywgQVNDSUlfcCwgQVNDSUlfYSwgQVNDSUlfYywgQVNDSUlfZSwgJ1wwJwogfTsKIAorc3RhdGljIHVuc2lnbmVkIGxvbmcKK2dlbmVyYXRlX2hhc2hfc2VjcmV0X3NhbHQodm9pZCkKK3sKKyAgdW5zaWduZWQgaW50IHNlZWQgPSB0aW1lKE5VTEwpICUgVUlOVF9NQVg7CisgIHNyYW5kKHNlZWQpOworICByZXR1cm4gcmFuZCgpOworfQorCitzdGF0aWMgWE1MX0Jvb2wgIC8qIG9ubHkgdmFsaWQgZm9yIHJvb3QgcGFyc2VyICovCitzdGFydFBhcnNpbmcoWE1MX1BhcnNlciBwYXJzZXIpCit7CisgICAgLyogaGFzaCBmdW5jdGlvbnMgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgc2V0Q29udGV4dCgpIGlzIGNhbGxlZCAqLworICAgIGlmIChoYXNoX3NlY3JldF9zYWx0ID09IDApCisgICAgICBoYXNoX3NlY3JldF9zYWx0ID0gZ2VuZXJhdGVfaGFzaF9zZWNyZXRfc2FsdCgpOworICAgIGlmIChucykgeworICAgICAgLyogaW1wbGljaXQgY29udGV4dCBvbmx5IHNldCBmb3Igcm9vdCBwYXJzZXIsIHNpbmNlIGNoaWxkCisgICAgICAgICBwYXJzZXJzIChpLmUuIGV4dGVybmFsIGVudGl0eSBwYXJzZXJzKSB3aWxsIGluaGVyaXQgaXQKKyAgICAgICovCisgICAgICByZXR1cm4gc2V0Q29udGV4dChwYXJzZXIsIGltcGxpY2l0Q29udGV4dCk7CisgICAgfQorICAgIHJldHVybiBYTUxfVFJVRTsKK30KKwogWE1MX1BhcnNlciBYTUxDQUxMCiBYTUxfUGFyc2VyQ3JlYXRlX01NKGNvbnN0IFhNTF9DaGFyICplbmNvZGluZ05hbWUsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9NZW1vcnlfSGFuZGxpbmdfU3VpdGUgKm1lbXN1aXRlLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbmFtZVNlcCkKIHsKLSAgWE1MX1BhcnNlciBwYXJzZXIgPSBwYXJzZXJDcmVhdGUoZW5jb2RpbmdOYW1lLCBtZW1zdWl0ZSwgbmFtZVNlcCwgTlVMTCk7Ci0gIGlmIChwYXJzZXIgIT0gTlVMTCAmJiBucykgewotICAgIC8qIGltcGxpY2l0IGNvbnRleHQgb25seSBzZXQgZm9yIHJvb3QgcGFyc2VyLCBzaW5jZSBjaGlsZAotICAgICAgIHBhcnNlcnMgKGkuZS4gZXh0ZXJuYWwgZW50aXR5IHBhcnNlcnMpIHdpbGwgaW5oZXJpdCBpdAotICAgICovCi0gICAgaWYgKCFzZXRDb250ZXh0KHBhcnNlciwgaW1wbGljaXRDb250ZXh0KSkgewotICAgICAgWE1MX1BhcnNlckZyZWUocGFyc2VyKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgfQotICByZXR1cm4gcGFyc2VyOworICByZXR1cm4gcGFyc2VyQ3JlYXRlKGVuY29kaW5nTmFtZSwgbWVtc3VpdGUsIG5hbWVTZXAsIE5VTEwpOwogfQogCiBzdGF0aWMgWE1MX1BhcnNlcgpAQCAtNzMxLDkgKzc2MywyMCBAQAogICAgIEZSRUUocGFyc2VyKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQorI2lmZGVmIFhNTF9BVFRSX0lORk8KKyAgYXR0SW5mbyA9IChYTUxfQXR0ckluZm8qKU1BTExPQyhhdHRzU2l6ZSAqIHNpemVvZihYTUxfQXR0ckluZm8pKTsKKyAgaWYgKGF0dEluZm8gPT0gTlVMTCkgeworICAgIEZSRUUoYXR0cyk7CisgICAgRlJFRShwYXJzZXIpOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKICAgZGF0YUJ1ZiA9IChYTUxfQ2hhciAqKU1BTExPQyhJTklUX0RBVEFfQlVGX1NJWkUgKiBzaXplb2YoWE1MX0NoYXIpKTsKICAgaWYgKGRhdGFCdWYgPT0gTlVMTCkgewogICAgIEZSRUUoYXR0cyk7CisjaWZkZWYgWE1MX0FUVFJfSU5GTworICAgIEZSRUUoYXR0SW5mbyk7CisjZW5kaWYKICAgICBGUkVFKHBhcnNlcik7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KQEAgLTc0Niw2ICs3ODksOSBAQAogICAgIGlmIChfZHRkID09IE5VTEwpIHsKICAgICAgIEZSRUUoZGF0YUJ1Zik7CiAgICAgICBGUkVFKGF0dHMpOworI2lmZGVmIFhNTF9BVFRSX0lORk8KKyAgICAgIEZSRUUoYXR0SW5mbyk7CisjZW5kaWYKICAgICAgIEZSRUUocGFyc2VyKTsKICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTc2MSw3ICs4MDcsNyBAQAogICB1bmtub3duRW5jb2RpbmdIYW5kbGVyID0gTlVMTDsKICAgdW5rbm93bkVuY29kaW5nSGFuZGxlckRhdGEgPSBOVUxMOwogCi0gIG5hbWVzcGFjZVNlcGFyYXRvciA9ICchJzsKKyAgbmFtZXNwYWNlU2VwYXJhdG9yID0gQVNDSUlfRVhDTDsKICAgbnMgPSBYTUxfRkFMU0U7CiAgIG5zX3RyaXBsZXRzID0gWE1MX0ZBTFNFOwogCkBAIC04NjAsNiArOTA2LDcgQEAKICAgdXNlRm9yZWlnbkRURCA9IFhNTF9GQUxTRTsKICAgcGFyYW1FbnRpdHlQYXJzaW5nID0gWE1MX1BBUkFNX0VOVElUWV9QQVJTSU5HX05FVkVSOwogI2VuZGlmCisgIGhhc2hfc2VjcmV0X3NhbHQgPSAwOwogfQogCiAvKiBtb3ZlcyBsaXN0IG9mIGJpbmRpbmdzIHRvIGZyZWVCaW5kaW5nTGlzdCAqLwpAQCAtOTA3LDcgKzk1NCw3IEBACiAgIHBvb2xDbGVhcigmdGVtcDJQb29sKTsKICAgcGFyc2VySW5pdChwYXJzZXIsIGVuY29kaW5nTmFtZSk7CiAgIGR0ZFJlc2V0KF9kdGQsICZwYXJzZXItPm1fbWVtKTsKLSAgcmV0dXJuIHNldENvbnRleHQocGFyc2VyLCBpbXBsaWNpdENvbnRleHQpOworICByZXR1cm4gWE1MX1RSVUU7CiB9CiAKIGVudW0gWE1MX1N0YXR1cyBYTUxDQUxMCkBAIC05NzYsNiArMTAyMywxMiBAQAogICBpbnQgb2xkSW5FbnRpdHlWYWx1ZSA9IHByb2xvZ1N0YXRlLmluRW50aXR5VmFsdWU7CiAjZW5kaWYKICAgWE1MX0Jvb2wgb2xkbnNfdHJpcGxldHMgPSBuc190cmlwbGV0czsKKyAgLyogTm90ZSB0aGF0IHRoZSBuZXcgcGFyc2VyIHNoYXJlcyB0aGUgc2FtZSBoYXNoIHNlY3JldCBhcyB0aGUgb2xkCisgICAgIHBhcnNlciwgc28gdGhhdCBkdGRDb3B5IGFuZCBjb3B5RW50aXR5VGFibGUgY2FuIGxvb2t1cCB2YWx1ZXMKKyAgICAgZnJvbSBoYXNoIHRhYmxlcyBhc3NvY2lhdGVkIHdpdGggZWl0aGVyIHBhcnNlciB3aXRob3V0IHVzIGhhdmluZworICAgICB0byB3b3JyeSB3aGljaCBoYXNoIHNlY3JldHMgZWFjaCB0YWJsZSBoYXMuCisgICovCisgIHVuc2lnbmVkIGxvbmcgb2xkaGFzaF9zZWNyZXRfc2FsdCA9IGhhc2hfc2VjcmV0X3NhbHQ7CiAKICNpZmRlZiBYTUxfRFRECiAgIGlmICghY29udGV4dCkKQEAgLTEwMjksMTMgKzEwODIsMTQgQEAKICAgICBleHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcgPSBvbGRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmc7CiAgIGRlZmF1bHRFeHBhbmRJbnRlcm5hbEVudGl0aWVzID0gb2xkRGVmYXVsdEV4cGFuZEludGVybmFsRW50aXRpZXM7CiAgIG5zX3RyaXBsZXRzID0gb2xkbnNfdHJpcGxldHM7CisgIGhhc2hfc2VjcmV0X3NhbHQgPSBvbGRoYXNoX3NlY3JldF9zYWx0OwogICBwYXJlbnRQYXJzZXIgPSBvbGRQYXJzZXI7CiAjaWZkZWYgWE1MX0RURAogICBwYXJhbUVudGl0eVBhcnNpbmcgPSBvbGRQYXJhbUVudGl0eVBhcnNpbmc7CiAgIHByb2xvZ1N0YXRlLmluRW50aXR5VmFsdWUgPSBvbGRJbkVudGl0eVZhbHVlOwogICBpZiAoY29udGV4dCkgewogI2VuZGlmIC8qIFhNTF9EVEQgKi8KLSAgICBpZiAoIWR0ZENvcHkoX2R0ZCwgb2xkRHRkLCAmcGFyc2VyLT5tX21lbSkKKyAgICBpZiAoIWR0ZENvcHkob2xkUGFyc2VyLCBfZHRkLCBvbGREdGQsICZwYXJzZXItPm1fbWVtKQogICAgICAgfHwgIXNldENvbnRleHQocGFyc2VyLCBjb250ZXh0KSkgewogICAgICAgWE1MX1BhcnNlckZyZWUocGFyc2VyKTsKICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTEyNCw2ICsxMTc4LDkgQEAKICNlbmRpZiAvKiBYTUxfRFREICovCiAgICAgZHRkRGVzdHJveShfZHRkLCAoWE1MX0Jvb2wpIXBhcmVudFBhcnNlciwgJnBhcnNlci0+bV9tZW0pOwogICBGUkVFKCh2b2lkICopYXR0cyk7CisjaWZkZWYgWE1MX0FUVFJfSU5GTworICBGUkVFKCh2b2lkICopYXR0SW5mbyk7CisjZW5kaWYKICAgRlJFRShncm91cENvbm5lY3Rvcik7CiAgIEZSRUUoYnVmZmVyKTsKICAgRlJFRShkYXRhQnVmKTsKQEAgLTEyMDQsNiArMTI2MSwxNCBAQAogICByZXR1cm4gaWRBdHRJbmRleDsKIH0KIAorI2lmZGVmIFhNTF9BVFRSX0lORk8KK2NvbnN0IFhNTF9BdHRySW5mbyAqIFhNTENBTEwKK1hNTF9HZXRBdHRyaWJ1dGVJbmZvKFhNTF9QYXJzZXIgcGFyc2VyKQoreworICByZXR1cm4gYXR0SW5mbzsKK30KKyNlbmRpZgorCiB2b2lkIFhNTENBTEwKIFhNTF9TZXRFbGVtZW50SGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKICAgICAgICAgICAgICAgICAgICAgICBYTUxfU3RhcnRFbGVtZW50SGFuZGxlciBzdGFydCwKQEAgLTE0MjAsNiArMTQ4NSwxNyBAQAogI2VuZGlmCiB9CiAKK2ludCBYTUxDQUxMCitYTUxfU2V0SGFzaFNhbHQoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBoYXNoX3NhbHQpCit7CisgIC8qIGJsb2NrIGFmdGVyIFhNTF9QYXJzZSgpL1hNTF9QYXJzZUJ1ZmZlcigpIGhhcyBiZWVuIGNhbGxlZCAqLworICBpZiAocHNfcGFyc2luZyA9PSBYTUxfUEFSU0lORyB8fCBwc19wYXJzaW5nID09IFhNTF9TVVNQRU5ERUQpCisgICAgcmV0dXJuIDA7CisgIGhhc2hfc2VjcmV0X3NhbHQgPSBoYXNoX3NhbHQ7CisgIHJldHVybiAxOworfQorCiBlbnVtIFhNTF9TdGF0dXMgWE1MQ0FMTAogWE1MX1BhcnNlKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBjaGFyICpzLCBpbnQgbGVuLCBpbnQgaXNGaW5hbCkKIHsKQEAgLTE0MzAsNiArMTUwNiwxMSBAQAogICBjYXNlIFhNTF9GSU5JU0hFRDoKICAgICBlcnJvckNvZGUgPSBYTUxfRVJST1JfRklOSVNIRUQ7CiAgICAgcmV0dXJuIFhNTF9TVEFUVVNfRVJST1I7CisgIGNhc2UgWE1MX0lOSVRJQUxJWkVEOgorICAgIGlmIChwYXJlbnRQYXJzZXIgPT0gTlVMTCAmJiAhc3RhcnRQYXJzaW5nKHBhcnNlcikpIHsKKyAgICAgIGVycm9yQ29kZSA9IFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUjsKKyAgICB9CiAgIGRlZmF1bHQ6CiAgICAgcHNfcGFyc2luZyA9IFhNTF9QQVJTSU5HOwogICB9CkBAIC0xNDUzLDcgKzE1MzQsNyBAQAogICAgICAgICBYbWxVcGRhdGVQb3NpdGlvbihlbmNvZGluZywgcG9zaXRpb25QdHIsIGJ1ZmZlclB0ciwgJnBvc2l0aW9uKTsKICAgICAgICAgcG9zaXRpb25QdHIgPSBidWZmZXJQdHI7CiAgICAgICAgIHJldHVybiBYTUxfU1RBVFVTX1NVU1BFTkRFRDsKLSAgICAgIGNhc2UgWE1MX0lOSVRJQUxJWkVEOiAKKyAgICAgIGNhc2UgWE1MX0lOSVRJQUxJWkVEOgogICAgICAgY2FzZSBYTUxfUEFSU0lORzoKICAgICAgICAgcHNfcGFyc2luZyA9IFhNTF9GSU5JU0hFRDsKICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCkBAIC0xNDg4LDExICsxNTY5LDEzIEBACiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBYTUxfSU5JVElBTElaRUQ6CiAgICAgICBjYXNlIFhNTF9QQVJTSU5HOgotICAgICAgICByZXN1bHQgPSBYTUxfU1RBVFVTX09LOwogICAgICAgICBpZiAoaXNGaW5hbCkgewogICAgICAgICAgIHBzX3BhcnNpbmcgPSBYTUxfRklOSVNIRUQ7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICByZXR1cm4gWE1MX1NUQVRVU19PSzsKICAgICAgICAgfQorICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXN1bHQgPSBYTUxfU1RBVFVTX09LOwogICAgICAgfQogICAgIH0KIApAQCAtMTUwNywxNSArMTU5MCwxMSBAQAogICAgICAgICAgICAgICAgIDogKGNoYXIgKilSRUFMTE9DKGJ1ZmZlciwgbGVuICogMikpOwogICAgICAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAgICAgICAgICAgZXJyb3JDb2RlID0gWE1MX0VSUk9SX05PX01FTU9SWTsKLSAgICAgICAgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBidWZmZXIgPSB0ZW1wOwotICAgICAgICBpZiAoIWJ1ZmZlcikgewotICAgICAgICAgIGVycm9yQ29kZSA9IFhNTF9FUlJPUl9OT19NRU1PUlk7CiAgICAgICAgICAgZXZlbnRQdHIgPSBldmVudEVuZFB0ciA9IE5VTEw7CiAgICAgICAgICAgcHJvY2Vzc29yID0gZXJyb3JQcm9jZXNzb3I7CiAgICAgICAgICAgcmV0dXJuIFhNTF9TVEFUVVNfRVJST1I7CiAgICAgICAgIH0KKyAgICAgICAgYnVmZmVyID0gdGVtcDsKICAgICAgICAgYnVmZmVyTGltID0gYnVmZmVyICsgbGVuICogMjsKICAgICAgIH0KICAgICAgIG1lbWNweShidWZmZXIsIGVuZCwgbkxlZnRPdmVyKTsKQEAgLTE1NTMsNiArMTYzMiwxMSBAQAogICBjYXNlIFhNTF9GSU5JU0hFRDoKICAgICBlcnJvckNvZGUgPSBYTUxfRVJST1JfRklOSVNIRUQ7CiAgICAgcmV0dXJuIFhNTF9TVEFUVVNfRVJST1I7CisgIGNhc2UgWE1MX0lOSVRJQUxJWkVEOgorICAgIGlmIChwYXJlbnRQYXJzZXIgPT0gTlVMTCAmJiAhc3RhcnRQYXJzaW5nKHBhcnNlcikpIHsKKyAgICAgIGVycm9yQ29kZSA9IFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUjsKKyAgICB9CiAgIGRlZmF1bHQ6CiAgICAgcHNfcGFyc2luZyA9IFhNTF9QQVJTSU5HOwogICB9CkBAIC0xNTc2LDcgKzE2NjAsNyBAQAogICAgIGNhc2UgWE1MX1NVU1BFTkRFRDoKICAgICAgIHJlc3VsdCA9IFhNTF9TVEFUVVNfU1VTUEVOREVEOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYTUxfSU5JVElBTElaRUQ6IAorICAgIGNhc2UgWE1MX0lOSVRJQUxJWkVEOgogICAgIGNhc2UgWE1MX1BBUlNJTkc6CiAgICAgICBpZiAoaXNGaW5hbCkgewogICAgICAgICBwc19wYXJzaW5nID0gWE1MX0ZJTklTSEVEOwpAQCAtMTY2Niw2ICsxNzUwLDggQEAKICAgICAgIGJ1ZmZlclB0ciA9IGJ1ZmZlciA9IG5ld0J1ZjsKICNlbmRpZiAgLyogbm90IGRlZmluZWQgWE1MX0NPTlRFWFRfQllURVMgKi8KICAgICB9CisgICAgZXZlbnRQdHIgPSBldmVudEVuZFB0ciA9IE5VTEw7CisgICAgcG9zaXRpb25QdHIgPSBOVUxMOwogICB9CiAgIHJldHVybiBidWZmZXJFbmQ7CiB9CkBAIC0xNzIzLDcgKzE4MDksNyBAQAogICAgIGNhc2UgWE1MX1NVU1BFTkRFRDoKICAgICAgIHJlc3VsdCA9IFhNTF9TVEFUVVNfU1VTUEVOREVEOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYTUxfSU5JVElBTElaRUQ6IAorICAgIGNhc2UgWE1MX0lOSVRJQUxJWkVEOgogICAgIGNhc2UgWE1MX1BBUlNJTkc6CiAgICAgICBpZiAocHNfZmluYWxCdWZmZXIpIHsKICAgICAgICAgcHNfcGFyc2luZyA9IFhNTF9GSU5JU0hFRDsKQEAgLTE5NDgsNiArMjAzNCwxMiBAQAogI2lmZGVmIFhNTF9OUwogICAgIHtYTUxfRkVBVFVSRV9OUywgICAgICAgICAgICAgICBYTUxfTCgiWE1MX05TIiksIDB9LAogI2VuZGlmCisjaWZkZWYgWE1MX0xBUkdFX1NJWkUKKyAgICB7WE1MX0ZFQVRVUkVfTEFSR0VfU0laRSwgICAgICAgWE1MX0woIlhNTF9MQVJHRV9TSVpFIiksIDB9LAorI2VuZGlmCisjaWZkZWYgWE1MX0FUVFJfSU5GTworICAgIHtYTUxfRkVBVFVSRV9BVFRSX0lORk8sICAgICAgICBYTUxfTCgiWE1MX0FUVFJfSU5GTyIpLCAwfSwKKyNlbmRpZgogICAgIHtYTUxfRkVBVFVSRV9FTkQsICAgICAgICAgICAgICBOVUxMLCAwfQogICB9OwogCkBAIC0yMDEwLDcgKzIxMDIsNyBAQAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsCiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiplbmRQdHIpCiB7Ci0gIGVudW0gWE1MX0Vycm9yIHJlc3VsdCA9IGRvQ29udGVudChwYXJzZXIsIDAsIGVuY29kaW5nLCBzdGFydCwgZW5kLCAKKyAgZW51bSBYTUxfRXJyb3IgcmVzdWx0ID0gZG9Db250ZW50KHBhcnNlciwgMCwgZW5jb2RpbmcsIHN0YXJ0LCBlbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRQdHIsIChYTUxfQm9vbCkhcHNfZmluYWxCdWZmZXIpOwogICBpZiAocmVzdWx0ID09IFhNTF9FUlJPUl9OT05FKSB7CiAgICAgaWYgKCFzdG9yZVJhd05hbWVzKHBhcnNlcikpCkBAIC0yMDkyLDcgKzIxODQsNyBAQAogICAgICAgaWYgKHJlc3VsdCAhPSBYTUxfRVJST1JfTk9ORSkKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgIHN3aXRjaCAocHNfcGFyc2luZykgewotICAgICAgY2FzZSBYTUxfU1VTUEVOREVEOiAKKyAgICAgIGNhc2UgWE1MX1NVU1BFTkRFRDoKICAgICAgICAgKmVuZFB0ciA9IG5leHQ7CiAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKICAgICAgIGNhc2UgWE1MX0ZJTklTSEVEOgpAQCAtMjEyNiw3ICsyMjE4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmVuZFB0cikKIHsKLSAgZW51bSBYTUxfRXJyb3IgcmVzdWx0ID0gZG9Db250ZW50KHBhcnNlciwgMSwgZW5jb2RpbmcsIHN0YXJ0LCBlbmQsIAorICBlbnVtIFhNTF9FcnJvciByZXN1bHQgPSBkb0NvbnRlbnQocGFyc2VyLCAxLCBlbmNvZGluZywgc3RhcnQsIGVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFB0ciwgKFhNTF9Cb29sKSFwc19maW5hbEJ1ZmZlcik7CiAgIGlmIChyZXN1bHQgPT0gWE1MX0VSUk9SX05PTkUpIHsKICAgICBpZiAoIXN0b3JlUmF3TmFtZXMocGFyc2VyKSkKQEAgLTIxNDUsNyArMjIzNyw3IEBACiAgICAgICAgICAgWE1MX0Jvb2wgaGF2ZU1vcmUpCiB7CiAgIC8qIHNhdmUgb25lIGxldmVsIG9mIGluZGlyZWN0aW9uICovCi0gIERURCAqIGNvbnN0IGR0ZCA9IF9kdGQ7ICAKKyAgRFREICogY29uc3QgZHRkID0gX2R0ZDsKIAogICBjb25zdCBjaGFyICoqZXZlbnRQUDsKICAgY29uc3QgY2hhciAqKmV2ZW50RW5kUFA7CkBAIC0yMTc2LDggKzIyNjgsOCBAQAogICAgICAgfQogICAgICAgZWxzZSBpZiAoZGVmYXVsdEhhbmRsZXIpCiAgICAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHMsIGVuZCk7Ci0gICAgICAvKiBXZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgZmluYWwgYnVmZmVyLCBzaG91bGQgd2UgY2hlY2sgZm9yIAotICAgICAgICAgWE1MX1NVU1BFTkRFRCwgWE1MX0ZJTklTSEVEPyAKKyAgICAgIC8qIFdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBmaW5hbCBidWZmZXIsIHNob3VsZCB3ZSBjaGVjayBmb3IKKyAgICAgICAgIFhNTF9TVVNQRU5ERUQsIFhNTF9GSU5JU0hFRD8KICAgICAgICovCiAgICAgICBpZiAoc3RhcnRUYWdMZXZlbCA9PSAwKQogICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX0VMRU1FTlRTOwpAQCAtMjIzMSw3ICsyMzIzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCAtIGVuYy0+bWluQnl0ZXNQZXJDaGFyKTsKICAgICAgICAgaWYgKCFuYW1lKQogICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOwotICAgICAgICBlbnRpdHkgPSAoRU5USVRZICopbG9va3VwKCZkdGQtPmdlbmVyYWxFbnRpdGllcywgbmFtZSwgMCk7CisgICAgICAgIGVudGl0eSA9IChFTlRJVFkgKilsb29rdXAocGFyc2VyLCAmZHRkLT5nZW5lcmFsRW50aXRpZXMsIG5hbWUsIDApOwogICAgICAgICBwb29sRGlzY2FyZCgmZHRkLT5wb29sKTsKICAgICAgICAgLyogRmlyc3QsIGRldGVybWluZSBpZiBhIGNoZWNrIGZvciBhbiBleGlzdGluZyBkZWNsYXJhdGlvbiBpcyBuZWVkZWQ7CiAgICAgICAgICAgIGlmIHllcywgY2hlY2sgdGhhdCB0aGUgZW50aXR5IGV4aXN0cywgYW5kIHRoYXQgaXQgaXMgaW50ZXJuYWwsCkBAIC0yNTI4LDggKzI2MjAsOCBAQAogICAgICAgfQogICAgICAgZWxzZSBpZiAoZGVmYXVsdEhhbmRsZXIpCiAgICAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHMsIGVuZCk7Ci0gICAgICAvKiBXZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgZmluYWwgYnVmZmVyLCBzaG91bGQgd2UgY2hlY2sgZm9yIAotICAgICAgICAgWE1MX1NVU1BFTkRFRCwgWE1MX0ZJTklTSEVEPyAKKyAgICAgIC8qIFdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBmaW5hbCBidWZmZXIsIHNob3VsZCB3ZSBjaGVjayBmb3IKKyAgICAgICAgIFhNTF9TVVNQRU5ERUQsIFhNTF9GSU5JU0hFRD8KICAgICAgICovCiAgICAgICBpZiAoc3RhcnRUYWdMZXZlbCA9PSAwKSB7CiAgICAgICAgICpldmVudFBQID0gZW5kOwpAQCAtMjU0MiwyNiArMjYzNCwyOSBAQAogICAgICAgKm5leHRQdHIgPSBlbmQ7CiAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CiAgICAgY2FzZSBYTUxfVE9LX0RBVEFfQ0hBUlM6Ci0gICAgICBpZiAoY2hhcmFjdGVyRGF0YUhhbmRsZXIpIHsKLSAgICAgICAgaWYgKE1VU1RfQ09OVkVSVChlbmMsIHMpKSB7Ci0gICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgSUNIQVIgKmRhdGFQdHIgPSAoSUNIQVIgKilkYXRhQnVmOwotICAgICAgICAgICAgWG1sQ29udmVydChlbmMsICZzLCBuZXh0LCAmZGF0YVB0ciwgKElDSEFSICopZGF0YUJ1ZkVuZCk7Ci0gICAgICAgICAgICAqZXZlbnRFbmRQUCA9IHM7Ci0gICAgICAgICAgICBjaGFyYWN0ZXJEYXRhSGFuZGxlcihoYW5kbGVyQXJnLCBkYXRhQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoZGF0YVB0ciAtIChJQ0hBUiAqKWRhdGFCdWYpKTsKLSAgICAgICAgICAgIGlmIChzID09IG5leHQpCi0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgKmV2ZW50UFAgPSBzOworICAgICAgeworICAgICAgICBYTUxfQ2hhcmFjdGVyRGF0YUhhbmRsZXIgY2hhckRhdGFIYW5kbGVyID0gY2hhcmFjdGVyRGF0YUhhbmRsZXI7CisgICAgICAgIGlmIChjaGFyRGF0YUhhbmRsZXIpIHsKKyAgICAgICAgICBpZiAoTVVTVF9DT05WRVJUKGVuYywgcykpIHsKKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgSUNIQVIgKmRhdGFQdHIgPSAoSUNIQVIgKilkYXRhQnVmOworICAgICAgICAgICAgICBYbWxDb252ZXJ0KGVuYywgJnMsIG5leHQsICZkYXRhUHRyLCAoSUNIQVIgKilkYXRhQnVmRW5kKTsKKyAgICAgICAgICAgICAgKmV2ZW50RW5kUFAgPSBzOworICAgICAgICAgICAgICBjaGFyRGF0YUhhbmRsZXIoaGFuZGxlckFyZywgZGF0YUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGRhdGFQdHIgLSAoSUNIQVIgKilkYXRhQnVmKSk7CisgICAgICAgICAgICAgIGlmIChzID09IG5leHQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICpldmVudFBQID0gczsKKyAgICAgICAgICAgIH0KICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgY2hhckRhdGFIYW5kbGVyKGhhbmRsZXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFhNTF9DaGFyICopcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSgoWE1MX0NoYXIgKiluZXh0IC0gKFhNTF9DaGFyICopcykpOwogICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBjaGFyYWN0ZXJEYXRhSGFuZGxlcihoYW5kbGVyQXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChYTUxfQ2hhciAqKXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKFhNTF9DaGFyICopbmV4dCAtIChYTUxfQ2hhciAqKXMpKTsKKyAgICAgICAgZWxzZSBpZiAoZGVmYXVsdEhhbmRsZXIpCisgICAgICAgICAgcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuYywgcywgbmV4dCk7CiAgICAgICB9Ci0gICAgICBlbHNlIGlmIChkZWZhdWx0SGFuZGxlcikKLSAgICAgICAgcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuYywgcywgbmV4dCk7CiAgICAgICBicmVhazsKICAgICBjYXNlIFhNTF9UT0tfUEk6CiAgICAgICBpZiAoIXJlcG9ydFByb2Nlc3NpbmdJbnN0cnVjdGlvbihwYXJzZXIsIGVuYywgcywgbmV4dCkpCkBAIC0yNTc4LDcgKzI2NzMsNyBAQAogICAgIH0KICAgICAqZXZlbnRQUCA9IHMgPSBuZXh0OwogICAgIHN3aXRjaCAocHNfcGFyc2luZykgewotICAgIGNhc2UgWE1MX1NVU1BFTkRFRDogCisgICAgY2FzZSBYTUxfU1VTUEVOREVEOgogICAgICAgKm5leHRQdHIgPSBuZXh0OwogICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOwogICAgIGNhc2UgWE1MX0ZJTklTSEVEOgpAQCAtMjYxOCwxMiArMjcxMywxMiBAQAogICBjb25zdCBYTUxfQ2hhciAqbG9jYWxQYXJ0OwogCiAgIC8qIGxvb2t1cCB0aGUgZWxlbWVudCB0eXBlIG5hbWUgKi8KLSAgZWxlbWVudFR5cGUgPSAoRUxFTUVOVF9UWVBFICopbG9va3VwKCZkdGQtPmVsZW1lbnRUeXBlcywgdGFnTmFtZVB0ci0+c3RyLDApOworICBlbGVtZW50VHlwZSA9IChFTEVNRU5UX1RZUEUgKilsb29rdXAocGFyc2VyLCAmZHRkLT5lbGVtZW50VHlwZXMsIHRhZ05hbWVQdHItPnN0ciwwKTsKICAgaWYgKCFlbGVtZW50VHlwZSkgewogICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lID0gcG9vbENvcHlTdHJpbmcoJmR0ZC0+cG9vbCwgdGFnTmFtZVB0ci0+c3RyKTsKICAgICBpZiAoIW5hbWUpCiAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKLSAgICBlbGVtZW50VHlwZSA9IChFTEVNRU5UX1RZUEUgKilsb29rdXAoJmR0ZC0+ZWxlbWVudFR5cGVzLCBuYW1lLAorICAgIGVsZW1lbnRUeXBlID0gKEVMRU1FTlRfVFlQRSAqKWxvb2t1cChwYXJzZXIsICZkdGQtPmVsZW1lbnRUeXBlcywgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEVMRU1FTlRfVFlQRSkpOwogICAgIGlmICghZWxlbWVudFR5cGUpCiAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKQEAgLTI2MzcsMjMgKzI3MzIsNDQgQEAKICAgaWYgKG4gKyBuRGVmYXVsdEF0dHMgPiBhdHRzU2l6ZSkgewogICAgIGludCBvbGRBdHRzU2l6ZSA9IGF0dHNTaXplOwogICAgIEFUVFJJQlVURSAqdGVtcDsKKyNpZmRlZiBYTUxfQVRUUl9JTkZPCisgICAgWE1MX0F0dHJJbmZvICp0ZW1wMjsKKyNlbmRpZgogICAgIGF0dHNTaXplID0gbiArIG5EZWZhdWx0QXR0cyArIElOSVRfQVRUU19TSVpFOwogICAgIHRlbXAgPSAoQVRUUklCVVRFICopUkVBTExPQygodm9pZCAqKWF0dHMsIGF0dHNTaXplICogc2l6ZW9mKEFUVFJJQlVURSkpOwogICAgIGlmICh0ZW1wID09IE5VTEwpCiAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKICAgICBhdHRzID0gdGVtcDsKKyNpZmRlZiBYTUxfQVRUUl9JTkZPCisgICAgdGVtcDIgPSAoWE1MX0F0dHJJbmZvICopUkVBTExPQygodm9pZCAqKWF0dEluZm8sIGF0dHNTaXplICogc2l6ZW9mKFhNTF9BdHRySW5mbykpOworICAgIGlmICh0ZW1wMiA9PSBOVUxMKQorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgYXR0SW5mbyA9IHRlbXAyOworI2VuZGlmCiAgICAgaWYgKG4gPiBvbGRBdHRzU2l6ZSkKICAgICAgIFhtbEdldEF0dHJpYnV0ZXMoZW5jLCBhdHRTdHIsIG4sIGF0dHMpOwogICB9CiAKICAgYXBwQXR0cyA9IChjb25zdCBYTUxfQ2hhciAqKilhdHRzOwogICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgQVRUUklCVVRFICpjdXJyQXR0ID0gJmF0dHNbaV07CisjaWZkZWYgWE1MX0FUVFJfSU5GTworICAgIFhNTF9BdHRySW5mbyAqY3VyckF0dEluZm8gPSAmYXR0SW5mb1tpXTsKKyNlbmRpZgogICAgIC8qIGFkZCB0aGUgbmFtZSBhbmQgdmFsdWUgdG8gdGhlIGF0dHJpYnV0ZSBsaXN0ICovCi0gICAgQVRUUklCVVRFX0lEICphdHRJZCA9IGdldEF0dHJpYnV0ZUlkKHBhcnNlciwgZW5jLCBhdHRzW2ldLm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHNbaV0ubmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFhtbE5hbWVMZW5ndGgoZW5jLCBhdHRzW2ldLm5hbWUpKTsKKyAgICBBVFRSSUJVVEVfSUQgKmF0dElkID0gZ2V0QXR0cmlidXRlSWQocGFyc2VyLCBlbmMsIGN1cnJBdHQtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJBdHQtPm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBYbWxOYW1lTGVuZ3RoKGVuYywgY3VyckF0dC0+bmFtZSkpOwogICAgIGlmICghYXR0SWQpCiAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyNpZmRlZiBYTUxfQVRUUl9JTkZPCisgICAgY3VyckF0dEluZm8tPm5hbWVTdGFydCA9IHBhcnNlRW5kQnl0ZUluZGV4IC0gKHBhcnNlRW5kUHRyIC0gY3VyckF0dC0+bmFtZSk7CisgICAgY3VyckF0dEluZm8tPm5hbWVFbmQgPSBjdXJyQXR0SW5mby0+bmFtZVN0YXJ0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbE5hbWVMZW5ndGgoZW5jLCBjdXJyQXR0LT5uYW1lKTsKKyAgICBjdXJyQXR0SW5mby0+dmFsdWVTdGFydCA9IHBhcnNlRW5kQnl0ZUluZGV4IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyc2VFbmRQdHIgLSBjdXJyQXR0LT52YWx1ZVB0cik7CisgICAgY3VyckF0dEluZm8tPnZhbHVlRW5kID0gcGFyc2VFbmRCeXRlSW5kZXggLSAocGFyc2VFbmRQdHIgLSBjdXJyQXR0LT52YWx1ZUVuZCk7CisjZW5kaWYKICAgICAvKiBEZXRlY3QgZHVwbGljYXRlIGF0dHJpYnV0ZXMgYnkgdGhlaXIgUU5hbWVzLiBUaGlzIGRvZXMgbm90IHdvcmsgd2hlbgogICAgICAgIG5hbWVzcGFjZSBwcm9jZXNzaW5nIGlzIHR1cm5lZCBvbiBhbmQgZGlmZmVyZW50IHByZWZpeGVzIGZvciB0aGUgc2FtZQogICAgICAgIG5hbWVzcGFjZSBhcmUgdXNlZC4gRm9yIHRoaXMgY2FzZSB3ZSBoYXZlIGEgY2hlY2sgZnVydGhlciBkb3duLgpAQCAtMjc5MiwxMSArMjkwOCw5IEBACiAgICAgICBpZiAoc1stMV0gPT0gMikgeyAgLyogcHJlZml4ZWQgKi8KICAgICAgICAgQVRUUklCVVRFX0lEICppZDsKICAgICAgICAgY29uc3QgQklORElORyAqYjsKLSAgICAgICAgdW5zaWduZWQgbG9uZyB1cmlIYXNoID0gMDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyB1cmlIYXNoID0gaGFzaF9zZWNyZXRfc2FsdDsKICAgICAgICAgKChYTUxfQ2hhciAqKXMpWy0xXSA9IDA7ICAvKiBjbGVhciBmbGFnICovCi0gICAgICAgIGlkID0gKEFUVFJJQlVURV9JRCAqKWxvb2t1cCgmZHRkLT5hdHRyaWJ1dGVJZHMsIHMsIDApOwotICAgICAgICBpZiAoIWlkKQotICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICBpZCA9IChBVFRSSUJVVEVfSUQgKilsb29rdXAocGFyc2VyLCAmZHRkLT5hdHRyaWJ1dGVJZHMsIHMsIDApOwogICAgICAgICBiID0gaWQtPnByZWZpeC0+YmluZGluZzsKICAgICAgICAgaWYgKCFiKQogICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfVU5CT1VORF9QUkVGSVg7CkBAIC0yODA4LDcgKzI5MjIsNyBAQAogICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CiAgICAgICAgICAgdXJpSGFzaCA9IENIQVJfSEFTSCh1cmlIYXNoLCBjKTsKICAgICAgICAgfQotICAgICAgICB3aGlsZSAoKnMrKyAhPSBYTUxfVCgnOicpKQorICAgICAgICB3aGlsZSAoKnMrKyAhPSBYTUxfVChBU0NJSV9DT0xPTikpCiAgICAgICAgICAgOwogICAgICAgICBkbyB7ICAvKiBjb3BpZXMgbnVsbCB0ZXJtaW5hdG9yICovCiAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgYyA9ICpzOwpAQCAtMjgxOCw3ICsyOTMyLDcgQEAKICAgICAgICAgfSB3aGlsZSAoKnMrKyk7CiAKICAgICAgICAgeyAvKiBDaGVjayBoYXNoIHRhYmxlIGZvciBkdXBsaWNhdGUgb2YgZXhwYW5kZWQgbmFtZSAodXJpTmFtZSkuCi0gICAgICAgICAgICAgRGVyaXZlZCBmcm9tIGNvZGUgaW4gbG9va3VwKEhBU0hfVEFCTEUgKnRhYmxlLCAuLi4pLgorICAgICAgICAgICAgIERlcml2ZWQgZnJvbSBjb2RlIGluIGxvb2t1cChwYXJzZXIsIEhBU0hfVEFCTEUgKnRhYmxlLCAuLi4pLgogICAgICAgICAgICovCiAgICAgICAgICAgdW5zaWduZWQgY2hhciBzdGVwID0gMDsKICAgICAgICAgICB1bnNpZ25lZCBsb25nIG1hc2sgPSBuc0F0dHNTaXplIC0gMTsKQEAgLTI4ODIsNyArMjk5Niw3IEBACiAgICAgaWYgKCFiaW5kaW5nKQogICAgICAgcmV0dXJuIFhNTF9FUlJPUl9VTkJPVU5EX1BSRUZJWDsKICAgICBsb2NhbFBhcnQgPSB0YWdOYW1lUHRyLT5zdHI7Ci0gICAgd2hpbGUgKCpsb2NhbFBhcnQrKyAhPSBYTUxfVCgnOicpKQorICAgIHdoaWxlICgqbG9jYWxQYXJ0KysgIT0gWE1MX1QoQVNDSUlfQ09MT04pKQogICAgICAgOwogICB9CiAgIGVsc2UgaWYgKGR0ZC0+ZGVmYXVsdFByZWZpeC5iaW5kaW5nKSB7CkBAIC0yOTM3LDI1ICszMDUxLDI5IEBACiAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICp1cmksIEJJTkRJTkcgKipiaW5kaW5nc1B0cikKIHsKICAgc3RhdGljIGNvbnN0IFhNTF9DaGFyIHhtbE5hbWVzcGFjZVtdID0gewotICAgICdoJywgJ3QnLCAndCcsICdwJywgJzonLCAnLycsICcvJywKLSAgICAndycsICd3JywgJ3cnLCAnLicsICd3JywgJzMnLCAnLicsICdvJywgJ3InLCAnZycsICcvJywKLSAgICAnWCcsICdNJywgJ0wnLCAnLycsICcxJywgJzknLCAnOScsICc4JywgJy8nLAotICAgICduJywgJ2EnLCAnbScsICdlJywgJ3MnLCAncCcsICdhJywgJ2MnLCAnZScsICdcMCcKKyAgICBBU0NJSV9oLCBBU0NJSV90LCBBU0NJSV90LCBBU0NJSV9wLCBBU0NJSV9DT0xPTiwgQVNDSUlfU0xBU0gsIEFTQ0lJX1NMQVNILAorICAgIEFTQ0lJX3csIEFTQ0lJX3csIEFTQ0lJX3csIEFTQ0lJX1BFUklPRCwgQVNDSUlfdywgQVNDSUlfMywgQVNDSUlfUEVSSU9ELAorICAgIEFTQ0lJX28sIEFTQ0lJX3IsIEFTQ0lJX2csIEFTQ0lJX1NMQVNILCBBU0NJSV9YLCBBU0NJSV9NLCBBU0NJSV9MLAorICAgIEFTQ0lJX1NMQVNILCBBU0NJSV8xLCBBU0NJSV85LCBBU0NJSV85LCBBU0NJSV84LCBBU0NJSV9TTEFTSCwKKyAgICBBU0NJSV9uLCBBU0NJSV9hLCBBU0NJSV9tLCBBU0NJSV9lLCBBU0NJSV9zLCBBU0NJSV9wLCBBU0NJSV9hLCBBU0NJSV9jLAorICAgIEFTQ0lJX2UsICdcMCcKICAgfTsKLSAgc3RhdGljIGNvbnN0IGludCB4bWxMZW4gPSAKKyAgc3RhdGljIGNvbnN0IGludCB4bWxMZW4gPQogICAgIChpbnQpc2l6ZW9mKHhtbE5hbWVzcGFjZSkvc2l6ZW9mKFhNTF9DaGFyKSAtIDE7CiAgIHN0YXRpYyBjb25zdCBYTUxfQ2hhciB4bWxuc05hbWVzcGFjZVtdID0gewotICAgICdoJywgJ3QnLCAndCcsICdwJywgJzonLCAnLycsICcvJywKLSAgICAndycsICd3JywgJ3cnLCAnLicsICd3JywgJzMnLCAnLicsICdvJywgJ3InLCAnZycsICcvJywKLSAgICAnMicsICcwJywgJzAnLCAnMCcsICcvJywgJ3gnLCAnbScsICdsJywgJ24nLCAncycsICcvJywgJ1wwJworICAgIEFTQ0lJX2gsIEFTQ0lJX3QsIEFTQ0lJX3QsIEFTQ0lJX3AsIEFTQ0lJX0NPTE9OLCBBU0NJSV9TTEFTSCwgQVNDSUlfU0xBU0gsCisgICAgQVNDSUlfdywgQVNDSUlfdywgQVNDSUlfdywgQVNDSUlfUEVSSU9ELCBBU0NJSV93LCBBU0NJSV8zLCBBU0NJSV9QRVJJT0QsCisgICAgQVNDSUlfbywgQVNDSUlfciwgQVNDSUlfZywgQVNDSUlfU0xBU0gsIEFTQ0lJXzIsIEFTQ0lJXzAsIEFTQ0lJXzAsCisgICAgQVNDSUlfMCwgQVNDSUlfU0xBU0gsIEFTQ0lJX3gsIEFTQ0lJX20sIEFTQ0lJX2wsIEFTQ0lJX24sIEFTQ0lJX3MsCisgICAgQVNDSUlfU0xBU0gsICdcMCcKICAgfTsKLSAgc3RhdGljIGNvbnN0IGludCB4bWxuc0xlbiA9IAorICBzdGF0aWMgY29uc3QgaW50IHhtbG5zTGVuID0KICAgICAoaW50KXNpemVvZih4bWxuc05hbWVzcGFjZSkvc2l6ZW9mKFhNTF9DaGFyKSAtIDE7CiAKICAgWE1MX0Jvb2wgbXVzdEJlWE1MID0gWE1MX0ZBTFNFOwogICBYTUxfQm9vbCBpc1hNTCA9IFhNTF9UUlVFOwogICBYTUxfQm9vbCBpc1hNTE5TID0gWE1MX1RSVUU7Ci0gIAorCiAgIEJJTkRJTkcgKmI7CiAgIGludCBsZW47CiAKQEAgLTI5NjQsMTMgKzMwODIsMTMgQEAKICAgICByZXR1cm4gWE1MX0VSUk9SX1VOREVDTEFSSU5HX1BSRUZJWDsKIAogICBpZiAocHJlZml4LT5uYW1lCi0gICAgICAmJiBwcmVmaXgtPm5hbWVbMF0gPT0gWE1MX1QoJ3gnKQotICAgICAgJiYgcHJlZml4LT5uYW1lWzFdID09IFhNTF9UKCdtJykKLSAgICAgICYmIHByZWZpeC0+bmFtZVsyXSA9PSBYTUxfVCgnbCcpKSB7CisgICAgICAmJiBwcmVmaXgtPm5hbWVbMF0gPT0gWE1MX1QoQVNDSUlfeCkKKyAgICAgICYmIHByZWZpeC0+bmFtZVsxXSA9PSBYTUxfVChBU0NJSV9tKQorICAgICAgJiYgcHJlZml4LT5uYW1lWzJdID09IFhNTF9UKEFTQ0lJX2wpKSB7CiAKICAgICAvKiBOb3QgYWxsb3dlZCB0byBiaW5kIHhtbG5zICovCi0gICAgaWYgKHByZWZpeC0+bmFtZVszXSA9PSBYTUxfVCgnbicpCi0gICAgICAgICYmIHByZWZpeC0+bmFtZVs0XSA9PSBYTUxfVCgncycpCisgICAgaWYgKHByZWZpeC0+bmFtZVszXSA9PSBYTUxfVChBU0NJSV9uKQorICAgICAgICAmJiBwcmVmaXgtPm5hbWVbNF0gPT0gWE1MX1QoQVNDSUlfcykKICAgICAgICAgJiYgcHJlZml4LT5uYW1lWzVdID09IFhNTF9UKCdcMCcpKQogICAgICAgcmV0dXJuIFhNTF9FUlJPUl9SRVNFUlZFRF9QUkVGSVhfWE1MTlM7CiAKQEAgLTI5ODIsNyArMzEwMCw3IEBACiAgICAgaWYgKGlzWE1MICYmIChsZW4gPiB4bWxMZW4gfHwgdXJpW2xlbl0gIT0geG1sTmFtZXNwYWNlW2xlbl0pKQogICAgICAgaXNYTUwgPSBYTUxfRkFMU0U7CiAKLSAgICBpZiAoIW11c3RCZVhNTCAmJiBpc1hNTE5TIAorICAgIGlmICghbXVzdEJlWE1MICYmIGlzWE1MTlMKICAgICAgICAgJiYgKGxlbiA+IHhtbG5zTGVuIHx8IHVyaVtsZW5dICE9IHhtbG5zTmFtZXNwYWNlW2xlbl0pKQogICAgICAgaXNYTUxOUyA9IFhNTF9GQUxTRTsKICAgfQpAQCAtMzEyNCwyNiArMzI0MiwyOSBAQAogICAgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgWE1MX1RPS19EQVRBX0NIQVJTOgotICAgICAgaWYgKGNoYXJhY3RlckRhdGFIYW5kbGVyKSB7Ci0gICAgICAgIGlmIChNVVNUX0NPTlZFUlQoZW5jLCBzKSkgewotICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgIElDSEFSICpkYXRhUHRyID0gKElDSEFSICopZGF0YUJ1ZjsKLSAgICAgICAgICAgIFhtbENvbnZlcnQoZW5jLCAmcywgbmV4dCwgJmRhdGFQdHIsIChJQ0hBUiAqKWRhdGFCdWZFbmQpOwotICAgICAgICAgICAgKmV2ZW50RW5kUFAgPSBuZXh0OwotICAgICAgICAgICAgY2hhcmFjdGVyRGF0YUhhbmRsZXIoaGFuZGxlckFyZywgZGF0YUJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGRhdGFQdHIgLSAoSUNIQVIgKilkYXRhQnVmKSk7Ci0gICAgICAgICAgICBpZiAocyA9PSBuZXh0KQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICpldmVudFBQID0gczsKKyAgICAgIHsKKyAgICAgICAgWE1MX0NoYXJhY3RlckRhdGFIYW5kbGVyIGNoYXJEYXRhSGFuZGxlciA9IGNoYXJhY3RlckRhdGFIYW5kbGVyOworICAgICAgICBpZiAoY2hhckRhdGFIYW5kbGVyKSB7CisgICAgICAgICAgaWYgKE1VU1RfQ09OVkVSVChlbmMsIHMpKSB7CisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgIElDSEFSICpkYXRhUHRyID0gKElDSEFSICopZGF0YUJ1ZjsKKyAgICAgICAgICAgICAgWG1sQ29udmVydChlbmMsICZzLCBuZXh0LCAmZGF0YVB0ciwgKElDSEFSICopZGF0YUJ1ZkVuZCk7CisgICAgICAgICAgICAgICpldmVudEVuZFBQID0gbmV4dDsKKyAgICAgICAgICAgICAgY2hhckRhdGFIYW5kbGVyKGhhbmRsZXJBcmcsIGRhdGFCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShkYXRhUHRyIC0gKElDSEFSICopZGF0YUJ1ZikpOworICAgICAgICAgICAgICBpZiAocyA9PSBuZXh0KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAqZXZlbnRQUCA9IHM7CisgICAgICAgICAgICB9CiAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNoYXJEYXRhSGFuZGxlcihoYW5kbGVyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChYTUxfQ2hhciAqKXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKFhNTF9DaGFyICopbmV4dCAtIChYTUxfQ2hhciAqKXMpKTsKICAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgY2hhcmFjdGVyRGF0YUhhbmRsZXIoaGFuZGxlckFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWE1MX0NoYXIgKilzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKChYTUxfQ2hhciAqKW5leHQgLSAoWE1MX0NoYXIgKilzKSk7CisgICAgICAgIGVsc2UgaWYgKGRlZmF1bHRIYW5kbGVyKQorICAgICAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHMsIG5leHQpOwogICAgICAgfQotICAgICAgZWxzZSBpZiAoZGVmYXVsdEhhbmRsZXIpCi0gICAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHMsIG5leHQpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBYTUxfVE9LX0lOVkFMSUQ6CiAgICAgICAqZXZlbnRQUCA9IG5leHQ7CkBAIC0zMTkwLDcgKzMzMTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiplbmRQdHIpCiB7Ci0gIGVudW0gWE1MX0Vycm9yIHJlc3VsdCA9IGRvSWdub3JlU2VjdGlvbihwYXJzZXIsIGVuY29kaW5nLCAmc3RhcnQsIGVuZCwgCisgIGVudW0gWE1MX0Vycm9yIHJlc3VsdCA9IGRvSWdub3JlU2VjdGlvbihwYXJzZXIsIGVuY29kaW5nLCAmc3RhcnQsIGVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFB0ciwgKFhNTF9Cb29sKSFwc19maW5hbEJ1ZmZlcik7CiAgIGlmIChyZXN1bHQgIT0gWE1MX0VSUk9SX05PTkUpCiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTM0NzIsNyArMzU5Myw3IEBACiAgIGNvbnN0IGNoYXIgKm5leHQgPSBzdGFydDsKICAgZXZlbnRQdHIgPSBzdGFydDsKIAotICBmb3IgKDs7KSB7ICAKKyAgZm9yICg7OykgewogICAgIHRvayA9IFhtbFByb2xvZ1RvayhlbmNvZGluZywgc3RhcnQsIGVuZCwgJm5leHQpOwogICAgIGV2ZW50RW5kUHRyID0gbmV4dDsKICAgICBpZiAodG9rIDw9IDApIHsKQEAgLTM1MDAsNyArMzYyMSw3IEBACiAgICAgICBpZiAocmVzdWx0ICE9IFhNTF9FUlJPUl9OT05FKQogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgc3dpdGNoIChwc19wYXJzaW5nKSB7Ci0gICAgICBjYXNlIFhNTF9TVVNQRU5ERUQ6IAorICAgICAgY2FzZSBYTUxfU1VTUEVOREVEOgogICAgICAgICAqbmV4dFB0ciA9IG5leHQ7CiAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKICAgICAgIGNhc2UgWE1MX0ZJTklTSEVEOgpAQCAtMzU2NSw3ICszNjg2LDcgQEAKICAgfQogCiAgIHByb2Nlc3NvciA9IHByb2xvZ1Byb2Nlc3NvcjsKLSAgcmV0dXJuIGRvUHJvbG9nKHBhcnNlciwgZW5jb2RpbmcsIHMsIGVuZCwgdG9rLCBuZXh0LCAKKyAgcmV0dXJuIGRvUHJvbG9nKHBhcnNlciwgZW5jb2RpbmcsIHMsIGVuZCwgdG9rLCBuZXh0LAogICAgICAgICAgICAgICAgICAgbmV4dFB0ciwgKFhNTF9Cb29sKSFwc19maW5hbEJ1ZmZlcik7CiB9CiAKQEAgLTM2MTUsNyArMzczNiw3IEBACiB7CiAgIGNvbnN0IGNoYXIgKm5leHQgPSBzOwogICBpbnQgdG9rID0gWG1sUHJvbG9nVG9rKGVuY29kaW5nLCBzLCBlbmQsICZuZXh0KTsKLSAgcmV0dXJuIGRvUHJvbG9nKHBhcnNlciwgZW5jb2RpbmcsIHMsIGVuZCwgdG9rLCBuZXh0LCAKKyAgcmV0dXJuIGRvUHJvbG9nKHBhcnNlciwgZW5jb2RpbmcsIHMsIGVuZCwgdG9rLCBuZXh0LAogICAgICAgICAgICAgICAgICAgbmV4dFB0ciwgKFhNTF9Cb29sKSFwc19maW5hbEJ1ZmZlcik7CiB9CiAKQEAgLTM2MzAsMjYgKzM3NTEsMzAgQEAKICAgICAgICAgIFhNTF9Cb29sIGhhdmVNb3JlKQogewogI2lmZGVmIFhNTF9EVEQKLSAgc3RhdGljIGNvbnN0IFhNTF9DaGFyIGV4dGVybmFsU3Vic2V0TmFtZVtdID0geyAnIycgLCAnXDAnIH07CisgIHN0YXRpYyBjb25zdCBYTUxfQ2hhciBleHRlcm5hbFN1YnNldE5hbWVbXSA9IHsgQVNDSUlfSEFTSCAsICdcMCcgfTsKICNlbmRpZiAvKiBYTUxfRFREICovCi0gIHN0YXRpYyBjb25zdCBYTUxfQ2hhciBhdHlwZUNEQVRBW10gPSB7ICdDJywgJ0QnLCAnQScsICdUJywgJ0EnLCAnXDAnIH07Ci0gIHN0YXRpYyBjb25zdCBYTUxfQ2hhciBhdHlwZUlEW10gPSB7ICdJJywgJ0QnLCAnXDAnIH07Ci0gIHN0YXRpYyBjb25zdCBYTUxfQ2hhciBhdHlwZUlEUkVGW10gPSB7ICdJJywgJ0QnLCAnUicsICdFJywgJ0YnLCAnXDAnIH07Ci0gIHN0YXRpYyBjb25zdCBYTUxfQ2hhciBhdHlwZUlEUkVGU1tdID0geyAnSScsICdEJywgJ1InLCAnRScsICdGJywgJ1MnLCAnXDAnIH07Ci0gIHN0YXRpYyBjb25zdCBYTUxfQ2hhciBhdHlwZUVOVElUWVtdID0geyAnRScsICdOJywgJ1QnLCAnSScsICdUJywgJ1knLCAnXDAnIH07Ci0gIHN0YXRpYyBjb25zdCBYTUxfQ2hhciBhdHlwZUVOVElUSUVTW10gPQotICAgICAgeyAnRScsICdOJywgJ1QnLCAnSScsICdUJywgJ0knLCAnRScsICdTJywgJ1wwJyB9OworICBzdGF0aWMgY29uc3QgWE1MX0NoYXIgYXR5cGVDREFUQVtdID0KKyAgICAgIHsgQVNDSUlfQywgQVNDSUlfRCwgQVNDSUlfQSwgQVNDSUlfVCwgQVNDSUlfQSwgJ1wwJyB9OworICBzdGF0aWMgY29uc3QgWE1MX0NoYXIgYXR5cGVJRFtdID0geyBBU0NJSV9JLCBBU0NJSV9ELCAnXDAnIH07CisgIHN0YXRpYyBjb25zdCBYTUxfQ2hhciBhdHlwZUlEUkVGW10gPQorICAgICAgeyBBU0NJSV9JLCBBU0NJSV9ELCBBU0NJSV9SLCBBU0NJSV9FLCBBU0NJSV9GLCAnXDAnIH07CisgIHN0YXRpYyBjb25zdCBYTUxfQ2hhciBhdHlwZUlEUkVGU1tdID0KKyAgICAgIHsgQVNDSUlfSSwgQVNDSUlfRCwgQVNDSUlfUiwgQVNDSUlfRSwgQVNDSUlfRiwgQVNDSUlfUywgJ1wwJyB9OworICBzdGF0aWMgY29uc3QgWE1MX0NoYXIgYXR5cGVFTlRJVFlbXSA9CisgICAgICB7IEFTQ0lJX0UsIEFTQ0lJX04sIEFTQ0lJX1QsIEFTQ0lJX0ksIEFTQ0lJX1QsIEFTQ0lJX1ksICdcMCcgfTsKKyAgc3RhdGljIGNvbnN0IFhNTF9DaGFyIGF0eXBlRU5USVRJRVNbXSA9IHsgQVNDSUlfRSwgQVNDSUlfTiwKKyAgICAgIEFTQ0lJX1QsIEFTQ0lJX0ksIEFTQ0lJX1QsIEFTQ0lJX0ksIEFTQ0lJX0UsIEFTQ0lJX1MsICdcMCcgfTsKICAgc3RhdGljIGNvbnN0IFhNTF9DaGFyIGF0eXBlTk1UT0tFTltdID0gewotICAgICAgJ04nLCAnTScsICdUJywgJ08nLCAnSycsICdFJywgJ04nLCAnXDAnIH07Ci0gIHN0YXRpYyBjb25zdCBYTUxfQ2hhciBhdHlwZU5NVE9LRU5TW10gPSB7Ci0gICAgICAnTicsICdNJywgJ1QnLCAnTycsICdLJywgJ0UnLCAnTicsICdTJywgJ1wwJyB9OwotICBzdGF0aWMgY29uc3QgWE1MX0NoYXIgbm90YXRpb25QcmVmaXhbXSA9IHsKLSAgICAgICdOJywgJ08nLCAnVCcsICdBJywgJ1QnLCAnSScsICdPJywgJ04nLCAnKCcsICdcMCcgfTsKLSAgc3RhdGljIGNvbnN0IFhNTF9DaGFyIGVudW1WYWx1ZVNlcFtdID0geyAnfCcsICdcMCcgfTsKLSAgc3RhdGljIGNvbnN0IFhNTF9DaGFyIGVudW1WYWx1ZVN0YXJ0W10gPSB7ICcoJywgJ1wwJyB9OworICAgICAgQVNDSUlfTiwgQVNDSUlfTSwgQVNDSUlfVCwgQVNDSUlfTywgQVNDSUlfSywgQVNDSUlfRSwgQVNDSUlfTiwgJ1wwJyB9OworICBzdGF0aWMgY29uc3QgWE1MX0NoYXIgYXR5cGVOTVRPS0VOU1tdID0geyBBU0NJSV9OLCBBU0NJSV9NLCBBU0NJSV9ULAorICAgICAgQVNDSUlfTywgQVNDSUlfSywgQVNDSUlfRSwgQVNDSUlfTiwgQVNDSUlfUywgJ1wwJyB9OworICBzdGF0aWMgY29uc3QgWE1MX0NoYXIgbm90YXRpb25QcmVmaXhbXSA9IHsgQVNDSUlfTiwgQVNDSUlfTywgQVNDSUlfVCwKKyAgICAgIEFTQ0lJX0EsIEFTQ0lJX1QsIEFTQ0lJX0ksIEFTQ0lJX08sIEFTQ0lJX04sIEFTQ0lJX0xQQVJFTiwgJ1wwJyB9OworICBzdGF0aWMgY29uc3QgWE1MX0NoYXIgZW51bVZhbHVlU2VwW10gPSB7IEFTQ0lJX1BJUEUsICdcMCcgfTsKKyAgc3RhdGljIGNvbnN0IFhNTF9DaGFyIGVudW1WYWx1ZVN0YXJ0W10gPSB7IEFTQ0lJX0xQQVJFTiwgJ1wwJyB9OwogCiAgIC8qIHNhdmUgb25lIGxldmVsIG9mIGluZGlyZWN0aW9uICovCi0gIERURCAqIGNvbnN0IGR0ZCA9IF9kdGQ7IAorICBEVEQgKiBjb25zdCBkdGQgPSBfZHRkOwogCiAgIGNvbnN0IGNoYXIgKipldmVudFBQOwogICBjb25zdCBjaGFyICoqZXZlbnRFbmRQUDsKQEAgLTM3NTYsNyArMzg4MSw4IEBACiAgICAgY2FzZSBYTUxfUk9MRV9ET0NUWVBFX1BVQkxJQ19JRDoKICNpZmRlZiBYTUxfRFRECiAgICAgICB1c2VGb3JlaWduRFREID0gWE1MX0ZBTFNFOwotICAgICAgZGVjbEVudGl0eSA9IChFTlRJVFkgKilsb29rdXAoJmR0ZC0+cGFyYW1FbnRpdGllcywKKyAgICAgIGRlY2xFbnRpdHkgPSAoRU5USVRZICopbG9va3VwKHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdGQtPnBhcmFtRW50aXRpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbFN1YnNldE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRU5USVRZKSk7CiAgICAgICBpZiAoIWRlY2xFbnRpdHkpCkBAIC0zNzY0LDE1ICszODkwLDE3IEBACiAjZW5kaWYgLyogWE1MX0RURCAqLwogICAgICAgZHRkLT5oYXNQYXJhbUVudGl0eVJlZnMgPSBYTUxfVFJVRTsKICAgICAgIGlmIChzdGFydERvY3R5cGVEZWNsSGFuZGxlcikgeworICAgICAgICBYTUxfQ2hhciAqcHViSWQ7CiAgICAgICAgIGlmICghWG1sSXNQdWJsaWNJZChlbmMsIHMsIG5leHQsIGV2ZW50UFApKQogICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfUFVCTElDSUQ7Ci0gICAgICAgIGRvY3R5cGVQdWJpZCA9IHBvb2xTdG9yZVN0cmluZygmdGVtcFBvb2wsIGVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgKyBlbmMtPm1pbkJ5dGVzUGVyQ2hhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgLSBlbmMtPm1pbkJ5dGVzUGVyQ2hhcik7Ci0gICAgICAgIGlmICghZG9jdHlwZVB1YmlkKQorICAgICAgICBwdWJJZCA9IHBvb2xTdG9yZVN0cmluZygmdGVtcFBvb2wsIGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyArIGVuYy0+bWluQnl0ZXNQZXJDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IC0gZW5jLT5taW5CeXRlc1BlckNoYXIpOworICAgICAgICBpZiAoIXB1YklkKQogICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOwotICAgICAgICBub3JtYWxpemVQdWJsaWNJZCgoWE1MX0NoYXIgKilkb2N0eXBlUHViaWQpOworICAgICAgICBub3JtYWxpemVQdWJsaWNJZChwdWJJZCk7CiAgICAgICAgIHBvb2xGaW5pc2goJnRlbXBQb29sKTsKKyAgICAgICAgZG9jdHlwZVB1YmlkID0gcHViSWQ7CiAgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CiAgICAgICAgIGdvdG8gYWxyZWFkeUNoZWNrZWQ7CiAgICAgICB9CkBAIC0zODExLDcgKzM5MzksOCBAQAogICAgICAgICBYTUxfQm9vbCBoYWRQYXJhbUVudGl0eVJlZnMgPSBkdGQtPmhhc1BhcmFtRW50aXR5UmVmczsKICAgICAgICAgZHRkLT5oYXNQYXJhbUVudGl0eVJlZnMgPSBYTUxfVFJVRTsKICAgICAgICAgaWYgKHBhcmFtRW50aXR5UGFyc2luZyAmJiBleHRlcm5hbEVudGl0eVJlZkhhbmRsZXIpIHsKLSAgICAgICAgICBFTlRJVFkgKmVudGl0eSA9IChFTlRJVFkgKilsb29rdXAoJmR0ZC0+cGFyYW1FbnRpdGllcywKKyAgICAgICAgICBFTlRJVFkgKmVudGl0eSA9IChFTlRJVFkgKilsb29rdXAocGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHRkLT5wYXJhbUVudGl0aWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbFN1YnNldE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihFTlRJVFkpKTsKICAgICAgICAgICBpZiAoIWVudGl0eSkKQEAgLTM4MjYsOCArMzk1NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5LT5wdWJsaWNJZCkpCiAgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0VYVEVSTkFMX0VOVElUWV9IQU5ETElORzsKICAgICAgICAgICBpZiAoZHRkLT5wYXJhbUVudGl0eVJlYWQpIHsKLSAgICAgICAgICAgIGlmICghZHRkLT5zdGFuZGFsb25lICYmIAotICAgICAgICAgICAgICAgIG5vdFN0YW5kYWxvbmVIYW5kbGVyICYmIAorICAgICAgICAgICAgaWYgKCFkdGQtPnN0YW5kYWxvbmUgJiYKKyAgICAgICAgICAgICAgICBub3RTdGFuZGFsb25lSGFuZGxlciAmJgogICAgICAgICAgICAgICAgICFub3RTdGFuZGFsb25lSGFuZGxlcihoYW5kbGVyQXJnKSkKICAgICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT1RfU1RBTkRBTE9ORTsKICAgICAgICAgICB9CkBAIC0zODU1LDcgKzM5ODQsNyBAQAogICAgICAgICBYTUxfQm9vbCBoYWRQYXJhbUVudGl0eVJlZnMgPSBkdGQtPmhhc1BhcmFtRW50aXR5UmVmczsKICAgICAgICAgZHRkLT5oYXNQYXJhbUVudGl0eVJlZnMgPSBYTUxfVFJVRTsKICAgICAgICAgaWYgKHBhcmFtRW50aXR5UGFyc2luZyAmJiBleHRlcm5hbEVudGl0eVJlZkhhbmRsZXIpIHsKLSAgICAgICAgICBFTlRJVFkgKmVudGl0eSA9IChFTlRJVFkgKilsb29rdXAoJmR0ZC0+cGFyYW1FbnRpdGllcywKKyAgICAgICAgICBFTlRJVFkgKmVudGl0eSA9IChFTlRJVFkgKilsb29rdXAocGFyc2VyLCAmZHRkLT5wYXJhbUVudGl0aWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbFN1YnNldE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihFTlRJVFkpKTsKICAgICAgICAgICBpZiAoIWVudGl0eSkKQEAgLTM5NTUsMTEgKzQwODQsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgcGFyc2VyKSkKICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKICAgICAgICAgaWYgKGF0dGxpc3REZWNsSGFuZGxlciAmJiBkZWNsQXR0cmlidXRlVHlwZSkgewotICAgICAgICAgIGlmICgqZGVjbEF0dHJpYnV0ZVR5cGUgPT0gWE1MX1QoJygnKQotICAgICAgICAgICAgICB8fCAoKmRlY2xBdHRyaWJ1dGVUeXBlID09IFhNTF9UKCdOJykKLSAgICAgICAgICAgICAgICAgICYmIGRlY2xBdHRyaWJ1dGVUeXBlWzFdID09IFhNTF9UKCdPJykpKSB7CisgICAgICAgICAgaWYgKCpkZWNsQXR0cmlidXRlVHlwZSA9PSBYTUxfVChBU0NJSV9MUEFSRU4pCisgICAgICAgICAgICAgIHx8ICgqZGVjbEF0dHJpYnV0ZVR5cGUgPT0gWE1MX1QoQVNDSUlfTikKKyAgICAgICAgICAgICAgICAgICYmIGRlY2xBdHRyaWJ1dGVUeXBlWzFdID09IFhNTF9UKEFTQ0lJX08pKSkgewogICAgICAgICAgICAgLyogRW51bWVyYXRlZCBvciBOb3RhdGlvbiB0eXBlICovCi0gICAgICAgICAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKCZ0ZW1wUG9vbCwgWE1MX1QoJyknKSkKKyAgICAgICAgICAgIGlmICghcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCBYTUxfVChBU0NJSV9SUEFSRU4pKQogICAgICAgICAgICAgICAgIHx8ICFwb29sQXBwZW5kQ2hhcigmdGVtcFBvb2wsIFhNTF9UKCdcMCcpKSkKICAgICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CiAgICAgICAgICAgICBkZWNsQXR0cmlidXRlVHlwZSA9IHRlbXBQb29sLnN0YXJ0OwpAQCAtMzk5MiwxMSArNDEyMSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsQXR0cmlidXRlSXNDZGF0YSwgWE1MX0ZBTFNFLCBhdHRWYWwsIHBhcnNlcikpCiAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CiAgICAgICAgIGlmIChhdHRsaXN0RGVjbEhhbmRsZXIgJiYgZGVjbEF0dHJpYnV0ZVR5cGUpIHsKLSAgICAgICAgICBpZiAoKmRlY2xBdHRyaWJ1dGVUeXBlID09IFhNTF9UKCcoJykKLSAgICAgICAgICAgICAgfHwgKCpkZWNsQXR0cmlidXRlVHlwZSA9PSBYTUxfVCgnTicpCi0gICAgICAgICAgICAgICAgICAmJiBkZWNsQXR0cmlidXRlVHlwZVsxXSA9PSBYTUxfVCgnTycpKSkgeworICAgICAgICAgIGlmICgqZGVjbEF0dHJpYnV0ZVR5cGUgPT0gWE1MX1QoQVNDSUlfTFBBUkVOKQorICAgICAgICAgICAgICB8fCAoKmRlY2xBdHRyaWJ1dGVUeXBlID09IFhNTF9UKEFTQ0lJX04pCisgICAgICAgICAgICAgICAgICAmJiBkZWNsQXR0cmlidXRlVHlwZVsxXSA9PSBYTUxfVChBU0NJSV9PKSkpIHsKICAgICAgICAgICAgIC8qIEVudW1lcmF0ZWQgb3IgTm90YXRpb24gdHlwZSAqLwotICAgICAgICAgICAgaWYgKCFwb29sQXBwZW5kQ2hhcigmdGVtcFBvb2wsIFhNTF9UKCcpJykpCisgICAgICAgICAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKCZ0ZW1wUG9vbCwgWE1MX1QoQVNDSUlfUlBBUkVOKSkKICAgICAgICAgICAgICAgICB8fCAhcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCBYTUxfVCgnXDAnKSkpCiAgICAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOwogICAgICAgICAgICAgZGVjbEF0dHJpYnV0ZVR5cGUgPSB0ZW1wUG9vbC5zdGFydDsKQEAgLTQwNjksNyArNDE5OCw4IEBACiAgICAgICBicmVhazsKICNlbHNlIC8qIFhNTF9EVEQgKi8KICAgICAgIGlmICghZGVjbEVudGl0eSkgewotICAgICAgICBkZWNsRW50aXR5ID0gKEVOVElUWSAqKWxvb2t1cCgmZHRkLT5wYXJhbUVudGl0aWVzLAorICAgICAgICBkZWNsRW50aXR5ID0gKEVOVElUWSAqKWxvb2t1cChwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdGQtPnBhcmFtRW50aXRpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsU3Vic2V0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEVOVElUWSkpOwogICAgICAgICBpZiAoIWRlY2xFbnRpdHkpCkBAIC00MTQ0LDcgKzQyNzQsNyBAQAogICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lID0gcG9vbFN0b3JlU3RyaW5nKCZkdGQtPnBvb2wsIGVuYywgcywgbmV4dCk7CiAgICAgICAgICAgaWYgKCFuYW1lKQogICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7Ci0gICAgICAgICAgZGVjbEVudGl0eSA9IChFTlRJVFkgKilsb29rdXAoJmR0ZC0+Z2VuZXJhbEVudGl0aWVzLCBuYW1lLAorICAgICAgICAgIGRlY2xFbnRpdHkgPSAoRU5USVRZICopbG9va3VwKHBhcnNlciwgJmR0ZC0+Z2VuZXJhbEVudGl0aWVzLCBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihFTlRJVFkpKTsKICAgICAgICAgICBpZiAoIWRlY2xFbnRpdHkpCiAgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKQEAgLTQxNzYsNyArNDMwNiw3IEBACiAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lID0gcG9vbFN0b3JlU3RyaW5nKCZkdGQtPnBvb2wsIGVuYywgcywgbmV4dCk7CiAgICAgICAgIGlmICghbmFtZSkKICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKLSAgICAgICAgZGVjbEVudGl0eSA9IChFTlRJVFkgKilsb29rdXAoJmR0ZC0+cGFyYW1FbnRpdGllcywKKyAgICAgICAgZGVjbEVudGl0eSA9IChFTlRJVFkgKilsb29rdXAocGFyc2VyLCAmZHRkLT5wYXJhbUVudGl0aWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHNpemVvZihFTlRJVFkpKTsKICAgICAgICAgaWYgKCFkZWNsRW50aXR5KQogICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOwpAQCAtNDI2NSw3ICs0Mzk1LDcgQEAKICAgICAgIHN3aXRjaCAodG9rKSB7CiAgICAgICBjYXNlIFhNTF9UT0tfUEFSQU1fRU5USVRZX1JFRjoKICAgICAgICAgLyogUEUgcmVmZXJlbmNlcyBpbiBpbnRlcm5hbCBzdWJzZXQgYXJlCi0gICAgICAgICAgIG5vdCBhbGxvd2VkIHdpdGhpbiBkZWNsYXJhdGlvbnMuICovICAKKyAgICAgICAgICAgbm90IGFsbG93ZWQgd2l0aGluIGRlY2xhcmF0aW9ucy4gKi8KICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9QQVJBTV9FTlRJVFlfUkVGOwogICAgICAgY2FzZSBYTUxfVE9LX1hNTF9ERUNMOgogICAgICAgICByZXR1cm4gWE1MX0VSUk9SX01JU1BMQUNFRF9YTUxfUEk7CkBAIC00MzIzLDE0ICs0NDUzLDE0IEBACiAgICAgICB9CiAgICAgICBicmVhazsKICAgICBjYXNlIFhNTF9ST0xFX0dST1VQX1NFUVVFTkNFOgotICAgICAgaWYgKGdyb3VwQ29ubmVjdG9yW3Byb2xvZ1N0YXRlLmxldmVsXSA9PSAnfCcpCisgICAgICBpZiAoZ3JvdXBDb25uZWN0b3JbcHJvbG9nU3RhdGUubGV2ZWxdID09IEFTQ0lJX1BJUEUpCiAgICAgICAgIHJldHVybiBYTUxfRVJST1JfU1lOVEFYOwotICAgICAgZ3JvdXBDb25uZWN0b3JbcHJvbG9nU3RhdGUubGV2ZWxdID0gJywnOworICAgICAgZ3JvdXBDb25uZWN0b3JbcHJvbG9nU3RhdGUubGV2ZWxdID0gQVNDSUlfQ09NTUE7CiAgICAgICBpZiAoZHRkLT5pbl9lbGRlY2wgJiYgZWxlbWVudERlY2xIYW5kbGVyKQogICAgICAgICBoYW5kbGVEZWZhdWx0ID0gWE1MX0ZBTFNFOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBYTUxfUk9MRV9HUk9VUF9DSE9JQ0U6Ci0gICAgICBpZiAoZ3JvdXBDb25uZWN0b3JbcHJvbG9nU3RhdGUubGV2ZWxdID09ICcsJykKKyAgICAgIGlmIChncm91cENvbm5lY3Rvcltwcm9sb2dTdGF0ZS5sZXZlbF0gPT0gQVNDSUlfQ09NTUEpCiAgICAgICAgIHJldHVybiBYTUxfRVJST1JfU1lOVEFYOwogICAgICAgaWYgKGR0ZC0+aW5fZWxkZWNsCiAgICAgICAgICAgJiYgIWdyb3VwQ29ubmVjdG9yW3Byb2xvZ1N0YXRlLmxldmVsXQpAQCAtNDM0Miw3ICs0NDcyLDcgQEAKICAgICAgICAgaWYgKGVsZW1lbnREZWNsSGFuZGxlcikKICAgICAgICAgICBoYW5kbGVEZWZhdWx0ID0gWE1MX0ZBTFNFOwogICAgICAgfQotICAgICAgZ3JvdXBDb25uZWN0b3JbcHJvbG9nU3RhdGUubGV2ZWxdID0gJ3wnOworICAgICAgZ3JvdXBDb25uZWN0b3JbcHJvbG9nU3RhdGUubGV2ZWxdID0gQVNDSUlfUElQRTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgWE1MX1JPTEVfUEFSQU1fRU5USVRZX1JFRjoKICNpZmRlZiBYTUxfRFRECkBAIC00MzU4LDcgKzQ0ODgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IC0gZW5jLT5taW5CeXRlc1BlckNoYXIpOwogICAgICAgICBpZiAoIW5hbWUpCiAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7Ci0gICAgICAgIGVudGl0eSA9IChFTlRJVFkgKilsb29rdXAoJmR0ZC0+cGFyYW1FbnRpdGllcywgbmFtZSwgMCk7CisgICAgICAgIGVudGl0eSA9IChFTlRJVFkgKilsb29rdXAocGFyc2VyLCAmZHRkLT5wYXJhbUVudGl0aWVzLCBuYW1lLCAwKTsKICAgICAgICAgcG9vbERpc2NhcmQoJmR0ZC0+cG9vbCk7CiAgICAgICAgIC8qIGZpcnN0LCBkZXRlcm1pbmUgaWYgYSBjaGVjayBmb3IgYW4gZXhpc3RpbmcgZGVjbGFyYXRpb24gaXMgbmVlZGVkOwogICAgICAgICAgICBpZiB5ZXMsIGNoZWNrIHRoYXQgdGhlIGVudGl0eSBleGlzdHMsIGFuZCB0aGF0IGl0IGlzIGludGVybmFsLApAQCAtNDM4Niw3ICs0NTE2LDcgQEAKICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX1JFQ1VSU0lWRV9FTlRJVFlfUkVGOwogICAgICAgICBpZiAoZW50aXR5LT50ZXh0UHRyKSB7CiAgICAgICAgICAgZW51bSBYTUxfRXJyb3IgcmVzdWx0OwotICAgICAgICAgIFhNTF9Cb29sIGJldHdlZW5EZWNsID0gCisgICAgICAgICAgWE1MX0Jvb2wgYmV0d2VlbkRlY2wgPQogICAgICAgICAgICAgKHJvbGUgPT0gWE1MX1JPTEVfUEFSQU1fRU5USVRZX1JFRiA/IFhNTF9UUlVFIDogWE1MX0ZBTFNFKTsKICAgICAgICAgICByZXN1bHQgPSBwcm9jZXNzSW50ZXJuYWxFbnRpdHkocGFyc2VyLCBlbnRpdHksIGJldHdlZW5EZWNsKTsKICAgICAgICAgICBpZiAocmVzdWx0ICE9IFhNTF9FUlJPUl9OT05FKQpAQCAtNDU4MSw3ICs0NzExLDcgQEAKICAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHMsIG5leHQpOwogCiAgICAgc3dpdGNoIChwc19wYXJzaW5nKSB7Ci0gICAgY2FzZSBYTUxfU1VTUEVOREVEOiAKKyAgICBjYXNlIFhNTF9TVVNQRU5ERUQ6CiAgICAgICAqbmV4dFB0ciA9IG5leHQ7CiAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CiAgICAgY2FzZSBYTUxfRklOSVNIRUQ6CkBAIC00NjUxLDcgKzQ3ODEsNyBAQAogICAgIH0KICAgICBldmVudFB0ciA9IHMgPSBuZXh0OwogICAgIHN3aXRjaCAocHNfcGFyc2luZykgewotICAgIGNhc2UgWE1MX1NVU1BFTkRFRDogCisgICAgY2FzZSBYTUxfU1VTUEVOREVEOgogICAgICAgKm5leHRQdHIgPSBuZXh0OwogICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOwogICAgIGNhc2UgWE1MX0ZJTklTSEVEOgpAQCAtNDY5NCwxMiArNDgyNCwxMiBAQAogI2lmZGVmIFhNTF9EVEQKICAgaWYgKGVudGl0eS0+aXNfcGFyYW0pIHsKICAgICBpbnQgdG9rID0gWG1sUHJvbG9nVG9rKGludGVybmFsRW5jb2RpbmcsIHRleHRTdGFydCwgdGV4dEVuZCwgJm5leHQpOwotICAgIHJlc3VsdCA9IGRvUHJvbG9nKHBhcnNlciwgaW50ZXJuYWxFbmNvZGluZywgdGV4dFN0YXJ0LCB0ZXh0RW5kLCB0b2ssIAorICAgIHJlc3VsdCA9IGRvUHJvbG9nKHBhcnNlciwgaW50ZXJuYWxFbmNvZGluZywgdGV4dFN0YXJ0LCB0ZXh0RW5kLCB0b2ssCiAgICAgICAgICAgICAgICAgICAgICAgbmV4dCwgJm5leHQsIFhNTF9GQUxTRSk7CiAgIH0KLSAgZWxzZSAKKyAgZWxzZQogI2VuZGlmIC8qIFhNTF9EVEQgKi8KLSAgICByZXN1bHQgPSBkb0NvbnRlbnQocGFyc2VyLCB0YWdMZXZlbCwgaW50ZXJuYWxFbmNvZGluZywgdGV4dFN0YXJ0LCAKKyAgICByZXN1bHQgPSBkb0NvbnRlbnQocGFyc2VyLCB0YWdMZXZlbCwgaW50ZXJuYWxFbmNvZGluZywgdGV4dFN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RW5kLCAmbmV4dCwgWE1MX0ZBTFNFKTsKIAogICBpZiAocmVzdWx0ID09IFhNTF9FUlJPUl9OT05FKSB7CkBAIC00NzM5LDEzICs0ODY5LDEzIEBACiAjaWZkZWYgWE1MX0RURAogICBpZiAoZW50aXR5LT5pc19wYXJhbSkgewogICAgIGludCB0b2sgPSBYbWxQcm9sb2dUb2soaW50ZXJuYWxFbmNvZGluZywgdGV4dFN0YXJ0LCB0ZXh0RW5kLCAmbmV4dCk7Ci0gICAgcmVzdWx0ID0gZG9Qcm9sb2cocGFyc2VyLCBpbnRlcm5hbEVuY29kaW5nLCB0ZXh0U3RhcnQsIHRleHRFbmQsIHRvaywgCisgICAgcmVzdWx0ID0gZG9Qcm9sb2cocGFyc2VyLCBpbnRlcm5hbEVuY29kaW5nLCB0ZXh0U3RhcnQsIHRleHRFbmQsIHRvaywKICAgICAgICAgICAgICAgICAgICAgICBuZXh0LCAmbmV4dCwgWE1MX0ZBTFNFKTsKICAgfQogICBlbHNlCiAjZW5kaWYgLyogWE1MX0RURCAqLwotICAgIHJlc3VsdCA9IGRvQ29udGVudChwYXJzZXIsIG9wZW5FbnRpdHktPnN0YXJ0VGFnTGV2ZWwsIGludGVybmFsRW5jb2RpbmcsIAotICAgICAgICAgICAgICAgICAgICAgICB0ZXh0U3RhcnQsIHRleHRFbmQsICZuZXh0LCBYTUxfRkFMU0UpOyAgCisgICAgcmVzdWx0ID0gZG9Db250ZW50KHBhcnNlciwgb3BlbkVudGl0eS0+c3RhcnRUYWdMZXZlbCwgaW50ZXJuYWxFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgdGV4dFN0YXJ0LCB0ZXh0RW5kLCAmbmV4dCwgWE1MX0ZBTFNFKTsKIAogICBpZiAocmVzdWx0ICE9IFhNTF9FUlJPUl9OT05FKQogICAgIHJldHVybiByZXN1bHQ7CkBAIC00NzY2LDcgKzQ4OTYsNyBAQAogICAgIGludCB0b2s7CiAgICAgcHJvY2Vzc29yID0gcHJvbG9nUHJvY2Vzc29yOwogICAgIHRvayA9IFhtbFByb2xvZ1RvayhlbmNvZGluZywgcywgZW5kLCAmbmV4dCk7Ci0gICAgcmV0dXJuIGRvUHJvbG9nKHBhcnNlciwgZW5jb2RpbmcsIHMsIGVuZCwgdG9rLCBuZXh0LCBuZXh0UHRyLCAKKyAgICByZXR1cm4gZG9Qcm9sb2cocGFyc2VyLCBlbmNvZGluZywgcywgZW5kLCB0b2ssIG5leHQsIG5leHRQdHIsCiAgICAgICAgICAgICAgICAgICAgIChYTUxfQm9vbCkhcHNfZmluYWxCdWZmZXIpOwogICB9CiAgIGVsc2UKQEAgLTQ3NzUsOCArNDkwNSw4IEBACiAgICAgcHJvY2Vzc29yID0gY29udGVudFByb2Nlc3NvcjsKICAgICAvKiBzZWUgZXh0ZXJuYWxFbnRpdHlDb250ZW50UHJvY2Vzc29yIHZzIGNvbnRlbnRQcm9jZXNzb3IgKi8KICAgICByZXR1cm4gZG9Db250ZW50KHBhcnNlciwgcGFyZW50UGFyc2VyID8gMSA6IDAsIGVuY29kaW5nLCBzLCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICBuZXh0UHRyLCAoWE1MX0Jvb2wpIXBzX2ZpbmFsQnVmZmVyKTsgCi0gIH0gIAorICAgICAgICAgICAgICAgICAgICAgbmV4dFB0ciwgKFhNTF9Cb29sKSFwc19maW5hbEJ1ZmZlcik7CisgIH0KIH0KIAogc3RhdGljIGVudW0gWE1MX0Vycm9yIFBUUkNBTEwKQEAgLTQ4ODIsNyArNTAxMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCAtIGVuYy0+bWluQnl0ZXNQZXJDaGFyKTsKICAgICAgICAgaWYgKCFuYW1lKQogICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOwotICAgICAgICBlbnRpdHkgPSAoRU5USVRZICopbG9va3VwKCZkdGQtPmdlbmVyYWxFbnRpdGllcywgbmFtZSwgMCk7CisgICAgICAgIGVudGl0eSA9IChFTlRJVFkgKilsb29rdXAocGFyc2VyLCAmZHRkLT5nZW5lcmFsRW50aXRpZXMsIG5hbWUsIDApOwogICAgICAgICBwb29sRGlzY2FyZCgmdGVtcDJQb29sKTsKICAgICAgICAgLyogRmlyc3QsIGRldGVybWluZSBpZiBhIGNoZWNrIGZvciBhbiBleGlzdGluZyBkZWNsYXJhdGlvbiBpcyBuZWVkZWQ7CiAgICAgICAgICAgIGlmIHllcywgY2hlY2sgdGhhdCB0aGUgZW50aXR5IGV4aXN0cywgYW5kIHRoYXQgaXQgaXMgaW50ZXJuYWwuCkBAIC00OTI5LDcgKzUwNTksNyBAQAogICAgICAgICBpZiAoIWVudGl0eS0+dGV4dFB0cikgewogICAgICAgICAgIGlmIChlbmMgPT0gZW5jb2RpbmcpCiAgICAgICAgICAgICBldmVudFB0ciA9IHB0cjsKLSAgICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9BVFRSSUJVVEVfRVhURVJOQUxfRU5USVRZX1JFRjsKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0FUVFJJQlVURV9FWFRFUk5BTF9FTlRJVFlfUkVGOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewogICAgICAgICAgIGVudW0gWE1MX0Vycm9yIHJlc3VsdDsKQEAgLTQ5OTEsNyArNTEyMSw3IEBACiAgICAgICAgICAgcmVzdWx0ID0gWE1MX0VSUk9SX05PX01FTU9SWTsKICAgICAgICAgICBnb3RvIGVuZEVudGl0eVZhbHVlOwogICAgICAgICB9Ci0gICAgICAgIGVudGl0eSA9IChFTlRJVFkgKilsb29rdXAoJmR0ZC0+cGFyYW1FbnRpdGllcywgbmFtZSwgMCk7CisgICAgICAgIGVudGl0eSA9IChFTlRJVFkgKilsb29rdXAocGFyc2VyLCAmZHRkLT5wYXJhbUVudGl0aWVzLCBuYW1lLCAwKTsKICAgICAgICAgcG9vbERpc2NhcmQoJnRlbXBQb29sKTsKICAgICAgICAgaWYgKCFlbnRpdHkpIHsKICAgICAgICAgICAvKiBub3QgYSB3ZWxsLWZvcm1lZG5lc3MgZXJyb3IgLSBzZWUgWE1MIDEuMDogV0ZDIEVudGl0eSBEZWNsYXJlZCAqLwpAQCAtNTI3Miw3ICs1NDAyLDcgQEAKICAgRFREICogY29uc3QgZHRkID0gX2R0ZDsgIC8qIHNhdmUgb25lIGxldmVsIG9mIGluZGlyZWN0aW9uICovCiAgIGNvbnN0IFhNTF9DaGFyICpuYW1lOwogICBmb3IgKG5hbWUgPSBlbGVtZW50VHlwZS0+bmFtZTsgKm5hbWU7IG5hbWUrKykgewotICAgIGlmICgqbmFtZSA9PSBYTUxfVCgnOicpKSB7CisgICAgaWYgKCpuYW1lID09IFhNTF9UKEFTQ0lJX0NPTE9OKSkgewogICAgICAgUFJFRklYICpwcmVmaXg7CiAgICAgICBjb25zdCBYTUxfQ2hhciAqczsKICAgICAgIGZvciAocyA9IGVsZW1lbnRUeXBlLT5uYW1lOyBzICE9IG5hbWU7IHMrKykgewpAQCAtNTI4MSw3ICs1NDExLDcgQEAKICAgICAgIH0KICAgICAgIGlmICghcG9vbEFwcGVuZENoYXIoJmR0ZC0+cG9vbCwgWE1MX1QoJ1wwJykpKQogICAgICAgICByZXR1cm4gMDsKLSAgICAgIHByZWZpeCA9IChQUkVGSVggKilsb29rdXAoJmR0ZC0+cHJlZml4ZXMsIHBvb2xTdGFydCgmZHRkLT5wb29sKSwKKyAgICAgIHByZWZpeCA9IChQUkVGSVggKilsb29rdXAocGFyc2VyLCAmZHRkLT5wcmVmaXhlcywgcG9vbFN0YXJ0KCZkdGQtPnBvb2wpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUFJFRklYKSk7CiAgICAgICBpZiAoIXByZWZpeCkKICAgICAgICAgcmV0dXJuIDA7CkBAIC01MzEwLDcgKzU0NDAsNyBAQAogICAgIHJldHVybiBOVUxMOwogICAvKiBza2lwIHF1b3RhdGlvbiBtYXJrIC0gaXRzIHN0b3JhZ2Ugd2lsbCBiZSByZS11c2VkIChsaWtlIGluIG5hbWVbLTFdKSAqLwogICArK25hbWU7Ci0gIGlkID0gKEFUVFJJQlVURV9JRCAqKWxvb2t1cCgmZHRkLT5hdHRyaWJ1dGVJZHMsIG5hbWUsIHNpemVvZihBVFRSSUJVVEVfSUQpKTsKKyAgaWQgPSAoQVRUUklCVVRFX0lEICopbG9va3VwKHBhcnNlciwgJmR0ZC0+YXR0cmlidXRlSWRzLCBuYW1lLCBzaXplb2YoQVRUUklCVVRFX0lEKSk7CiAgIGlmICghaWQpCiAgICAgcmV0dXJuIE5VTEw7CiAgIGlmIChpZC0+bmFtZSAhPSBuYW1lKQpAQCAtNTMxOSwyMyArNTQ0OSwyMyBAQAogICAgIHBvb2xGaW5pc2goJmR0ZC0+cG9vbCk7CiAgICAgaWYgKCFucykKICAgICAgIDsKLSAgICBlbHNlIGlmIChuYW1lWzBdID09IFhNTF9UKCd4JykKLSAgICAgICAgJiYgbmFtZVsxXSA9PSBYTUxfVCgnbScpCi0gICAgICAgICYmIG5hbWVbMl0gPT0gWE1MX1QoJ2wnKQotICAgICAgICAmJiBuYW1lWzNdID09IFhNTF9UKCduJykKLSAgICAgICAgJiYgbmFtZVs0XSA9PSBYTUxfVCgncycpCi0gICAgICAgICYmIChuYW1lWzVdID09IFhNTF9UKCdcMCcpIHx8IG5hbWVbNV0gPT0gWE1MX1QoJzonKSkpIHsKKyAgICBlbHNlIGlmIChuYW1lWzBdID09IFhNTF9UKEFTQ0lJX3gpCisgICAgICAgICYmIG5hbWVbMV0gPT0gWE1MX1QoQVNDSUlfbSkKKyAgICAgICAgJiYgbmFtZVsyXSA9PSBYTUxfVChBU0NJSV9sKQorICAgICAgICAmJiBuYW1lWzNdID09IFhNTF9UKEFTQ0lJX24pCisgICAgICAgICYmIG5hbWVbNF0gPT0gWE1MX1QoQVNDSUlfcykKKyAgICAgICAgJiYgKG5hbWVbNV0gPT0gWE1MX1QoJ1wwJykgfHwgbmFtZVs1XSA9PSBYTUxfVChBU0NJSV9DT0xPTikpKSB7CiAgICAgICBpZiAobmFtZVs1XSA9PSBYTUxfVCgnXDAnKSkKICAgICAgICAgaWQtPnByZWZpeCA9ICZkdGQtPmRlZmF1bHRQcmVmaXg7CiAgICAgICBlbHNlCi0gICAgICAgIGlkLT5wcmVmaXggPSAoUFJFRklYICopbG9va3VwKCZkdGQtPnByZWZpeGVzLCBuYW1lICsgNiwgc2l6ZW9mKFBSRUZJWCkpOworICAgICAgICBpZC0+cHJlZml4ID0gKFBSRUZJWCAqKWxvb2t1cChwYXJzZXIsICZkdGQtPnByZWZpeGVzLCBuYW1lICsgNiwgc2l6ZW9mKFBSRUZJWCkpOwogICAgICAgaWQtPnhtbG5zID0gWE1MX1RSVUU7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgaW50IGk7CiAgICAgICBmb3IgKGkgPSAwOyBuYW1lW2ldOyBpKyspIHsKICAgICAgICAgLyogYXR0cmlidXRlcyB3aXRob3V0IHByZWZpeCBhcmUgKm5vdCogaW4gdGhlIGRlZmF1bHQgbmFtZXNwYWNlICovCi0gICAgICAgIGlmIChuYW1lW2ldID09IFhNTF9UKCc6JykpIHsKKyAgICAgICAgaWYgKG5hbWVbaV0gPT0gWE1MX1QoQVNDSUlfQ09MT04pKSB7CiAgICAgICAgICAgaW50IGo7CiAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGk7IGorKykgewogICAgICAgICAgICAgaWYgKCFwb29sQXBwZW5kQ2hhcigmZHRkLT5wb29sLCBuYW1lW2pdKSkKQEAgLTUzNDMsMTAgKzU0NzMsOCBAQAogICAgICAgICAgIH0KICAgICAgICAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKCZkdGQtPnBvb2wsIFhNTF9UKCdcMCcpKSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgIGlkLT5wcmVmaXggPSAoUFJFRklYICopbG9va3VwKCZkdGQtPnByZWZpeGVzLCBwb29sU3RhcnQoJmR0ZC0+cG9vbCksCisgICAgICAgICAgaWQtPnByZWZpeCA9IChQUkVGSVggKilsb29rdXAocGFyc2VyLCAmZHRkLT5wcmVmaXhlcywgcG9vbFN0YXJ0KCZkdGQtPnBvb2wpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihQUkVGSVgpKTsKLSAgICAgICAgICBpZiAoIWlkLT5wcmVmaXgpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICBpZiAoaWQtPnByZWZpeC0+bmFtZSA9PSBwb29sU3RhcnQoJmR0ZC0+cG9vbCkpCiAgICAgICAgICAgICBwb29sRmluaXNoKCZkdGQtPnBvb2wpOwogICAgICAgICAgIGVsc2UKQEAgLTUzNTksNyArNTQ4Nyw3IEBACiAgIHJldHVybiBpZDsKIH0KIAotI2RlZmluZSBDT05URVhUX1NFUCBYTUxfVCgnXGYnKQorI2RlZmluZSBDT05URVhUX1NFUCBYTUxfVChBU0NJSV9GRikKIAogc3RhdGljIGNvbnN0IFhNTF9DaGFyICoKIGdldENvbnRleHQoWE1MX1BhcnNlciBwYXJzZXIpCkBAIC01MzcxLDcgKzU0OTksNyBAQAogICBpZiAoZHRkLT5kZWZhdWx0UHJlZml4LmJpbmRpbmcpIHsKICAgICBpbnQgaTsKICAgICBpbnQgbGVuOwotICAgIGlmICghcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCBYTUxfVCgnPScpKSkKKyAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKCZ0ZW1wUG9vbCwgWE1MX1QoQVNDSUlfRVFVQUxTKSkpCiAgICAgICByZXR1cm4gTlVMTDsKICAgICBsZW4gPSBkdGQtPmRlZmF1bHRQcmVmaXguYmluZGluZy0+dXJpTGVuOwogICAgIGlmIChuYW1lc3BhY2VTZXBhcmF0b3IpCkBAIC01Mzk3LDcgKzU1MjUsNyBAQAogICAgIGZvciAocyA9IHByZWZpeC0+bmFtZTsgKnM7IHMrKykKICAgICAgIGlmICghcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCAqcykpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmICghcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCBYTUxfVCgnPScpKSkKKyAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKCZ0ZW1wUG9vbCwgWE1MX1QoQVNDSUlfRVFVQUxTKSkpCiAgICAgICByZXR1cm4gTlVMTDsKICAgICBsZW4gPSBwcmVmaXgtPmJpbmRpbmctPnVyaUxlbjsKICAgICBpZiAobmFtZXNwYWNlU2VwYXJhdG9yKQpAQCAtNTQ0MSw3ICs1NTY5LDcgQEAKICAgICAgIEVOVElUWSAqZTsKICAgICAgIGlmICghcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCBYTUxfVCgnXDAnKSkpCiAgICAgICAgIHJldHVybiBYTUxfRkFMU0U7Ci0gICAgICBlID0gKEVOVElUWSAqKWxvb2t1cCgmZHRkLT5nZW5lcmFsRW50aXRpZXMsIHBvb2xTdGFydCgmdGVtcFBvb2wpLCAwKTsKKyAgICAgIGUgPSAoRU5USVRZICopbG9va3VwKHBhcnNlciwgJmR0ZC0+Z2VuZXJhbEVudGl0aWVzLCBwb29sU3RhcnQoJnRlbXBQb29sKSwgMCk7CiAgICAgICBpZiAoZSkKICAgICAgICAgZS0+b3BlbiA9IFhNTF9UUlVFOwogICAgICAgaWYgKCpzICE9IFhNTF9UKCdcMCcpKQpAQCAtNTQ0OSwxNCArNTU3NywxNCBAQAogICAgICAgY29udGV4dCA9IHM7CiAgICAgICBwb29sRGlzY2FyZCgmdGVtcFBvb2wpOwogICAgIH0KLSAgICBlbHNlIGlmICgqcyA9PSBYTUxfVCgnPScpKSB7CisgICAgZWxzZSBpZiAoKnMgPT0gWE1MX1QoQVNDSUlfRVFVQUxTKSkgewogICAgICAgUFJFRklYICpwcmVmaXg7CiAgICAgICBpZiAocG9vbExlbmd0aCgmdGVtcFBvb2wpID09IDApCiAgICAgICAgIHByZWZpeCA9ICZkdGQtPmRlZmF1bHRQcmVmaXg7CiAgICAgICBlbHNlIHsKICAgICAgICAgaWYgKCFwb29sQXBwZW5kQ2hhcigmdGVtcFBvb2wsIFhNTF9UKCdcMCcpKSkKICAgICAgICAgICByZXR1cm4gWE1MX0ZBTFNFOwotICAgICAgICBwcmVmaXggPSAoUFJFRklYICopbG9va3VwKCZkdGQtPnByZWZpeGVzLCBwb29sU3RhcnQoJnRlbXBQb29sKSwKKyAgICAgICAgcHJlZml4ID0gKFBSRUZJWCAqKWxvb2t1cChwYXJzZXIsICZkdGQtPnByZWZpeGVzLCBwb29sU3RhcnQoJnRlbXBQb29sKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUFJFRklYKSk7CiAgICAgICAgIGlmICghcHJlZml4KQogICAgICAgICAgIHJldHVybiBYTUxfRkFMU0U7CkBAIC01NjIwLDcgKzU3NDgsNyBAQAogICAgVGhlIG5ldyBEVEQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KICovCiBzdGF0aWMgaW50Ci1kdGRDb3B5KERURCAqbmV3RHRkLCBjb25zdCBEVEQgKm9sZER0ZCwgY29uc3QgWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZSAqbXMpCitkdGRDb3B5KFhNTF9QYXJzZXIgb2xkUGFyc2VyLCBEVEQgKm5ld0R0ZCwgY29uc3QgRFREICpvbGREdGQsIGNvbnN0IFhNTF9NZW1vcnlfSGFuZGxpbmdfU3VpdGUgKm1zKQogewogICBIQVNIX1RBQkxFX0lURVIgaXRlcjsKIApAQCAtNTYzNSw3ICs1NzYzLDcgQEAKICAgICBuYW1lID0gcG9vbENvcHlTdHJpbmcoJihuZXdEdGQtPnBvb2wpLCBvbGRQLT5uYW1lKTsKICAgICBpZiAoIW5hbWUpCiAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoIWxvb2t1cCgmKG5ld0R0ZC0+cHJlZml4ZXMpLCBuYW1lLCBzaXplb2YoUFJFRklYKSkpCisgICAgaWYgKCFsb29rdXAob2xkUGFyc2VyLCAmKG5ld0R0ZC0+cHJlZml4ZXMpLCBuYW1lLCBzaXplb2YoUFJFRklYKSkpCiAgICAgICByZXR1cm4gMDsKICAgfQogCkBAIC01NjU3LDcgKzU3ODUsNyBAQAogICAgIGlmICghbmFtZSkKICAgICAgIHJldHVybiAwOwogICAgICsrbmFtZTsKLSAgICBuZXdBID0gKEFUVFJJQlVURV9JRCAqKWxvb2t1cCgmKG5ld0R0ZC0+YXR0cmlidXRlSWRzKSwgbmFtZSwKKyAgICBuZXdBID0gKEFUVFJJQlVURV9JRCAqKWxvb2t1cChvbGRQYXJzZXIsICYobmV3RHRkLT5hdHRyaWJ1dGVJZHMpLCBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihBVFRSSUJVVEVfSUQpKTsKICAgICBpZiAoIW5ld0EpCiAgICAgICByZXR1cm4gMDsKQEAgLTU2NjcsNyArNTc5NSw3IEBACiAgICAgICBpZiAob2xkQS0+cHJlZml4ID09ICZvbGREdGQtPmRlZmF1bHRQcmVmaXgpCiAgICAgICAgIG5ld0EtPnByZWZpeCA9ICZuZXdEdGQtPmRlZmF1bHRQcmVmaXg7CiAgICAgICBlbHNlCi0gICAgICAgIG5ld0EtPnByZWZpeCA9IChQUkVGSVggKilsb29rdXAoJihuZXdEdGQtPnByZWZpeGVzKSwKKyAgICAgICAgbmV3QS0+cHJlZml4ID0gKFBSRUZJWCAqKWxvb2t1cChvbGRQYXJzZXIsICYobmV3RHRkLT5wcmVmaXhlcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkQS0+cHJlZml4LT5uYW1lLCAwKTsKICAgICB9CiAgIH0KQEAgLTU2ODYsNyArNTgxNCw3IEBACiAgICAgbmFtZSA9IHBvb2xDb3B5U3RyaW5nKCYobmV3RHRkLT5wb29sKSwgb2xkRS0+bmFtZSk7CiAgICAgaWYgKCFuYW1lKQogICAgICAgcmV0dXJuIDA7Ci0gICAgbmV3RSA9IChFTEVNRU5UX1RZUEUgKilsb29rdXAoJihuZXdEdGQtPmVsZW1lbnRUeXBlcyksIG5hbWUsCisgICAgbmV3RSA9IChFTEVNRU5UX1RZUEUgKilsb29rdXAob2xkUGFyc2VyLCAmKG5ld0R0ZC0+ZWxlbWVudFR5cGVzKSwgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRUxFTUVOVF9UWVBFKSk7CiAgICAgaWYgKCFuZXdFKQogICAgICAgcmV0dXJuIDA7CkBAIC01NzAwLDE0ICs1ODI4LDE0IEBACiAgICAgfQogICAgIGlmIChvbGRFLT5pZEF0dCkKICAgICAgIG5ld0UtPmlkQXR0ID0gKEFUVFJJQlVURV9JRCAqKQotICAgICAgICAgIGxvb2t1cCgmKG5ld0R0ZC0+YXR0cmlidXRlSWRzKSwgb2xkRS0+aWRBdHQtPm5hbWUsIDApOworICAgICAgICAgIGxvb2t1cChvbGRQYXJzZXIsICYobmV3RHRkLT5hdHRyaWJ1dGVJZHMpLCBvbGRFLT5pZEF0dC0+bmFtZSwgMCk7CiAgICAgbmV3RS0+YWxsb2NEZWZhdWx0QXR0cyA9IG5ld0UtPm5EZWZhdWx0QXR0cyA9IG9sZEUtPm5EZWZhdWx0QXR0czsKICAgICBpZiAob2xkRS0+cHJlZml4KQotICAgICAgbmV3RS0+cHJlZml4ID0gKFBSRUZJWCAqKWxvb2t1cCgmKG5ld0R0ZC0+cHJlZml4ZXMpLAorICAgICAgbmV3RS0+cHJlZml4ID0gKFBSRUZJWCAqKWxvb2t1cChvbGRQYXJzZXIsICYobmV3RHRkLT5wcmVmaXhlcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZEUtPnByZWZpeC0+bmFtZSwgMCk7CiAgICAgZm9yIChpID0gMDsgaSA8IG5ld0UtPm5EZWZhdWx0QXR0czsgaSsrKSB7CiAgICAgICBuZXdFLT5kZWZhdWx0QXR0c1tpXS5pZCA9IChBVFRSSUJVVEVfSUQgKikKLSAgICAgICAgICBsb29rdXAoJihuZXdEdGQtPmF0dHJpYnV0ZUlkcyksIG9sZEUtPmRlZmF1bHRBdHRzW2ldLmlkLT5uYW1lLCAwKTsKKyAgICAgICAgICBsb29rdXAob2xkUGFyc2VyLCAmKG5ld0R0ZC0+YXR0cmlidXRlSWRzKSwgb2xkRS0+ZGVmYXVsdEF0dHNbaV0uaWQtPm5hbWUsIDApOwogICAgICAgbmV3RS0+ZGVmYXVsdEF0dHNbaV0uaXNDZGF0YSA9IG9sZEUtPmRlZmF1bHRBdHRzW2ldLmlzQ2RhdGE7CiAgICAgICBpZiAob2xkRS0+ZGVmYXVsdEF0dHNbaV0udmFsdWUpIHsKICAgICAgICAgbmV3RS0+ZGVmYXVsdEF0dHNbaV0udmFsdWUKQEAgLTU3MjEsMTMgKzU4NDksMTUgQEAKICAgfQogCiAgIC8qIENvcHkgdGhlIGVudGl0eSB0YWJsZXMuICovCi0gIGlmICghY29weUVudGl0eVRhYmxlKCYobmV3RHRkLT5nZW5lcmFsRW50aXRpZXMpLAorICBpZiAoIWNvcHlFbnRpdHlUYWJsZShvbGRQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICYobmV3RHRkLT5nZW5lcmFsRW50aXRpZXMpLAogICAgICAgICAgICAgICAgICAgICAgICAmKG5ld0R0ZC0+cG9vbCksCiAgICAgICAgICAgICAgICAgICAgICAgICYob2xkRHRkLT5nZW5lcmFsRW50aXRpZXMpKSkKICAgICAgIHJldHVybiAwOwogCiAjaWZkZWYgWE1MX0RURAotICBpZiAoIWNvcHlFbnRpdHlUYWJsZSgmKG5ld0R0ZC0+cGFyYW1FbnRpdGllcyksCisgIGlmICghY29weUVudGl0eVRhYmxlKG9sZFBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgJihuZXdEdGQtPnBhcmFtRW50aXRpZXMpLAogICAgICAgICAgICAgICAgICAgICAgICAmKG5ld0R0ZC0+cG9vbCksCiAgICAgICAgICAgICAgICAgICAgICAgICYob2xkRHRkLT5wYXJhbUVudGl0aWVzKSkpCiAgICAgICByZXR1cm4gMDsKQEAgLTU3NTAsNyArNTg4MCw4IEBACiB9ICAvKiBFbmQgZHRkQ29weSAqLwogCiBzdGF0aWMgaW50Ci1jb3B5RW50aXR5VGFibGUoSEFTSF9UQUJMRSAqbmV3VGFibGUsCitjb3B5RW50aXR5VGFibGUoWE1MX1BhcnNlciBvbGRQYXJzZXIsCisgICAgICAgICAgICAgICAgSEFTSF9UQUJMRSAqbmV3VGFibGUsCiAgICAgICAgICAgICAgICAgU1RSSU5HX1BPT0wgKm5ld1Bvb2wsCiAgICAgICAgICAgICAgICAgY29uc3QgSEFTSF9UQUJMRSAqb2xkVGFibGUpCiB7CkBAIC01NzY5LDcgKzU5MDAsNyBAQAogICAgIG5hbWUgPSBwb29sQ29weVN0cmluZyhuZXdQb29sLCBvbGRFLT5uYW1lKTsKICAgICBpZiAoIW5hbWUpCiAgICAgICByZXR1cm4gMDsKLSAgICBuZXdFID0gKEVOVElUWSAqKWxvb2t1cChuZXdUYWJsZSwgbmFtZSwgc2l6ZW9mKEVOVElUWSkpOworICAgIG5ld0UgPSAoRU5USVRZICopbG9va3VwKG9sZFBhcnNlciwgbmV3VGFibGUsIG5hbWUsIHNpemVvZihFTlRJVFkpKTsKICAgICBpZiAoIW5ld0UpCiAgICAgICByZXR1cm4gMDsKICAgICBpZiAob2xkRS0+c3lzdGVtSWQpIHsKQEAgLTU4MjcsMTYgKzU5NTgsMTYgQEAKIH0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgRkFTVENBTEwKLWhhc2goS0VZIHMpCitoYXNoKFhNTF9QYXJzZXIgcGFyc2VyLCBLRVkgcykKIHsKLSAgdW5zaWduZWQgbG9uZyBoID0gMDsKKyAgdW5zaWduZWQgbG9uZyBoID0gaGFzaF9zZWNyZXRfc2FsdDsKICAgd2hpbGUgKCpzKQogICAgIGggPSBDSEFSX0hBU0goaCwgKnMrKyk7CiAgIHJldHVybiBoOwogfQogCiBzdGF0aWMgTkFNRUQgKgotbG9va3VwKEhBU0hfVEFCTEUgKnRhYmxlLCBLRVkgbmFtZSwgc2l6ZV90IGNyZWF0ZVNpemUpCitsb29rdXAoWE1MX1BhcnNlciBwYXJzZXIsIEhBU0hfVEFCTEUgKnRhYmxlLCBLRVkgbmFtZSwgc2l6ZV90IGNyZWF0ZVNpemUpCiB7CiAgIHNpemVfdCBpOwogICBpZiAodGFibGUtPnNpemUgPT0gMCkgewpAQCAtNTg1MywxMCArNTk4NCwxMCBAQAogICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIG1lbXNldCh0YWJsZS0+diwgMCwgdHNpemUpOwotICAgIGkgPSBoYXNoKG5hbWUpICYgKCh1bnNpZ25lZCBsb25nKXRhYmxlLT5zaXplIC0gMSk7CisgICAgaSA9IGhhc2gocGFyc2VyLCBuYW1lKSAmICgodW5zaWduZWQgbG9uZyl0YWJsZS0+c2l6ZSAtIDEpOwogICB9CiAgIGVsc2UgewotICAgIHVuc2lnbmVkIGxvbmcgaCA9IGhhc2gobmFtZSk7CisgICAgdW5zaWduZWQgbG9uZyBoID0gaGFzaChwYXJzZXIsIG5hbWUpOwogICAgIHVuc2lnbmVkIGxvbmcgbWFzayA9ICh1bnNpZ25lZCBsb25nKXRhYmxlLT5zaXplIC0gMTsKICAgICB1bnNpZ25lZCBjaGFyIHN0ZXAgPSAwOwogICAgIGkgPSBoICYgbWFzazsKQEAgLTU4ODIsNyArNjAxMyw3IEBACiAgICAgICBtZW1zZXQobmV3ViwgMCwgdHNpemUpOwogICAgICAgZm9yIChpID0gMDsgaSA8IHRhYmxlLT5zaXplOyBpKyspCiAgICAgICAgIGlmICh0YWJsZS0+dltpXSkgewotICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbmV3SGFzaCA9IGhhc2godGFibGUtPnZbaV0tPm5hbWUpOworICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbmV3SGFzaCA9IGhhc2gocGFyc2VyLCB0YWJsZS0+dltpXS0+bmFtZSk7CiAgICAgICAgICAgc2l6ZV90IGogPSBuZXdIYXNoICYgbmV3TWFzazsKICAgICAgICAgICBzdGVwID0gMDsKICAgICAgICAgICB3aGlsZSAobmV3VltqXSkgewpAQCAtNjEwMywxMiArNjIzNCwxMyBAQAogICB9CiAgIGlmIChwb29sLT5ibG9ja3MgJiYgcG9vbC0+c3RhcnQgPT0gcG9vbC0+YmxvY2tzLT5zKSB7CiAgICAgaW50IGJsb2NrU2l6ZSA9IChpbnQpKHBvb2wtPmVuZCAtIHBvb2wtPnN0YXJ0KSoyOwotICAgIHBvb2wtPmJsb2NrcyA9IChCTE9DSyAqKQorICAgIEJMT0NLICp0ZW1wID0gKEJMT0NLICopCiAgICAgICBwb29sLT5tZW0tPnJlYWxsb2NfZmNuKHBvb2wtPmJsb2NrcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9mZnNldG9mKEJMT0NLLCBzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBibG9ja1NpemUgKiBzaXplb2YoWE1MX0NoYXIpKSk7Ci0gICAgaWYgKHBvb2wtPmJsb2NrcyA9PSBOVUxMKQorICAgIGlmICh0ZW1wID09IE5VTEwpCiAgICAgICByZXR1cm4gWE1MX0ZBTFNFOworICAgIHBvb2wtPmJsb2NrcyA9IHRlbXA7CiAgICAgcG9vbC0+YmxvY2tzLT5zaXplID0gYmxvY2tTaXplOwogICAgIHBvb2wtPnB0ciA9IHBvb2wtPmJsb2Nrcy0+cyArIChwb29sLT5wdHIgLSBwb29sLT5zdGFydCk7CiAgICAgcG9vbC0+c3RhcnQgPSBwb29sLT5ibG9ja3MtPnM7CkBAIC02MjU3LDcgKzYzODksNyBAQAogCiAgIGlmICghbmFtZSkKICAgICByZXR1cm4gTlVMTDsKLSAgcmV0ID0gKEVMRU1FTlRfVFlQRSAqKSBsb29rdXAoJmR0ZC0+ZWxlbWVudFR5cGVzLCBuYW1lLCBzaXplb2YoRUxFTUVOVF9UWVBFKSk7CisgIHJldCA9IChFTEVNRU5UX1RZUEUgKikgbG9va3VwKHBhcnNlciwgJmR0ZC0+ZWxlbWVudFR5cGVzLCBuYW1lLCBzaXplb2YoRUxFTUVOVF9UWVBFKSk7CiAgIGlmICghcmV0KQogICAgIHJldHVybiBOVUxMOwogICBpZiAocmV0LT5uYW1lICE9IG5hbWUpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2V4cGF0L3htbHJvbGUuYyBiL01vZHVsZXMvZXhwYXQveG1scm9sZS5jCmluZGV4IDE1ZDRkOGYuLjQ0NzcyZTIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZXhwYXQveG1scm9sZS5jCisrKyBiL01vZHVsZXMvZXhwYXQveG1scm9sZS5jCkBAIC0yLDIwICsyLDIyIEBACiAgICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgY29weWluZyBwZXJtaXNzaW9uLgogKi8KIAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCiAjaWZkZWYgQ09NUElMRURfRlJPTV9EU1AKICNpbmNsdWRlICJ3aW5jb25maWcuaCIKICNlbGlmIGRlZmluZWQoTUFDT1NfQ0xBU1NJQykKICNpbmNsdWRlICJtYWNjb25maWcuaCIKLSNlbGlmIGRlZmluZWQoX19hbWlnYW9zNF9fKQorI2VsaWYgZGVmaW5lZChfX2FtaWdhb3NfXykKICNpbmNsdWRlICJhbWlnYWNvbmZpZy5oIgorI2VsaWYgZGVmaW5lZChfX1dBVENPTUNfXykKKyNpbmNsdWRlICJ3YXRjb21jb25maWcuaCIKICNlbHNlCiAjaWZkZWYgSEFWRV9FWFBBVF9DT05GSUdfSAogI2luY2x1ZGUgPGV4cGF0X2NvbmZpZy5oPgogI2VuZGlmCiAjZW5kaWYgLyogbmRlZiBDT01QSUxFRF9GUk9NX0RTUCAqLwogCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KICNpbmNsdWRlICJleHBhdF9leHRlcm5hbC5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAieG1scm9sZS5oIgpAQCAtNTMsMTIgKzU1LDE2IEBACiAgICAgQVNDSUlfSSwgQVNDSUlfRCwgQVNDSUlfUiwgQVNDSUlfRSwgQVNDSUlfRiwgJ1wwJyB9Owogc3RhdGljIGNvbnN0IGNoYXIgS1dfSURSRUZTW10gPSB7CiAgICAgQVNDSUlfSSwgQVNDSUlfRCwgQVNDSUlfUiwgQVNDSUlfRSwgQVNDSUlfRiwgQVNDSUlfUywgJ1wwJyB9OworI2lmZGVmIFhNTF9EVEQKIHN0YXRpYyBjb25zdCBjaGFyIEtXX0lHTk9SRVtdID0gewogICAgIEFTQ0lJX0ksIEFTQ0lJX0csIEFTQ0lJX04sIEFTQ0lJX08sIEFTQ0lJX1IsIEFTQ0lJX0UsICdcMCcgfTsKKyNlbmRpZgogc3RhdGljIGNvbnN0IGNoYXIgS1dfSU1QTElFRFtdID0gewogICAgIEFTQ0lJX0ksIEFTQ0lJX00sIEFTQ0lJX1AsIEFTQ0lJX0wsIEFTQ0lJX0ksIEFTQ0lJX0UsIEFTQ0lJX0QsICdcMCcgfTsKKyNpZmRlZiBYTUxfRFRECiBzdGF0aWMgY29uc3QgY2hhciBLV19JTkNMVURFW10gPSB7CiAgICAgQVNDSUlfSSwgQVNDSUlfTiwgQVNDSUlfQywgQVNDSUlfTCwgQVNDSUlfVSwgQVNDSUlfRCwgQVNDSUlfRSwgJ1wwJyB9OworI2VuZGlmCiBzdGF0aWMgY29uc3QgY2hhciBLV19OREFUQVtdID0gewogICAgIEFTQ0lJX04sIEFTQ0lJX0QsIEFTQ0lJX0EsIEFTQ0lJX1QsIEFTQ0lJX0EsICdcMCcgfTsKIHN0YXRpYyBjb25zdCBjaGFyIEtXX05NVE9LRU5bXSA9IHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvZXhwYXQveG1sdG9rLmMgYi9Nb2R1bGVzL2V4cGF0L3htbHRvay5jCmluZGV4IGRiOTIyNDcuLmI5Y2Q3YTQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZXhwYXQveG1sdG9rLmMKKysrIGIvTW9kdWxlcy9leHBhdC94bWx0b2suYwpAQCAtMiwyMCArMiwyMiBAQAogICAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIGNvcHlpbmcgcGVybWlzc2lvbi4KICovCiAKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKwogI2lmZGVmIENPTVBJTEVEX0ZST01fRFNQCiAjaW5jbHVkZSAid2luY29uZmlnLmgiCiAjZWxpZiBkZWZpbmVkKE1BQ09TX0NMQVNTSUMpCiAjaW5jbHVkZSAibWFjY29uZmlnLmgiCi0jZWxpZiBkZWZpbmVkKF9fYW1pZ2FvczRfXykKKyNlbGlmIGRlZmluZWQoX19hbWlnYW9zX18pCiAjaW5jbHVkZSAiYW1pZ2Fjb25maWcuaCIKKyNlbGlmIGRlZmluZWQoX19XQVRDT01DX18pCisjaW5jbHVkZSAid2F0Y29tY29uZmlnLmgiCiAjZWxzZQogI2lmZGVmIEhBVkVfRVhQQVRfQ09ORklHX0gKICNpbmNsdWRlIDxleHBhdF9jb25maWcuaD4KICNlbmRpZgogI2VuZGlmIC8qIG5kZWYgQ09NUElMRURfRlJPTV9EU1AgKi8KIAotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCiAjaW5jbHVkZSAiZXhwYXRfZXh0ZXJuYWwuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgInhtbHRvay5oIgpAQCAtMjk1LDcgKzI5Nyw5IEBACiAjZW5kaWYKIAogI2RlZmluZSBQUkVGSVgoaWRlbnQpIG5vcm1hbF8gIyMgaWRlbnQKKyNkZWZpbmUgWE1MX1RPS19JTVBMX0MKICNpbmNsdWRlICJ4bWx0b2tfaW1wbC5jIgorI3VuZGVmIFhNTF9UT0tfSU1QTF9DCiAKICN1bmRlZiBNSU5CUEMKICN1bmRlZiBCWVRFX1RZUEUKQEAgLTY5Miw3ICs2OTYsOSBAQAogI2RlZmluZSBJU19OTVNUUlRfQ0hBUihlbmMsIHAsIG4pICgwKQogI2RlZmluZSBJU19OTVNUUlRfQ0hBUl9NSU5CUEMoZW5jLCBwKSBMSVRUTEUyX0lTX05NU1RSVF9DSEFSX01JTkJQQyhlbmMsIHApCiAKKyNkZWZpbmUgWE1MX1RPS19JTVBMX0MKICNpbmNsdWRlICJ4bWx0b2tfaW1wbC5jIgorI3VuZGVmIFhNTF9UT0tfSU1QTF9DCiAKICN1bmRlZiBNSU5CUEMKICN1bmRlZiBCWVRFX1RZUEUKQEAgLTgzMSw3ICs4MzcsOSBAQAogI2RlZmluZSBJU19OTVNUUlRfQ0hBUihlbmMsIHAsIG4pICgwKQogI2RlZmluZSBJU19OTVNUUlRfQ0hBUl9NSU5CUEMoZW5jLCBwKSBCSUcyX0lTX05NU1RSVF9DSEFSX01JTkJQQyhlbmMsIHApCiAKKyNkZWZpbmUgWE1MX1RPS19JTVBMX0MKICNpbmNsdWRlICJ4bWx0b2tfaW1wbC5jIgorI3VuZGVmIFhNTF9UT0tfSU1QTF9DCiAKICN1bmRlZiBNSU5CUEMKICN1bmRlZiBCWVRFX1RZUEUKQEAgLTEzMzcsNyArMTM0NSw3IEBACiBFTkNPRElORyAqCiBYbWxJbml0VW5rbm93bkVuY29kaW5nKHZvaWQgKm1lbSwKICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgQ09OVkVSVEVSIGNvbnZlcnQsIAorICAgICAgICAgICAgICAgICAgICAgICBDT05WRVJURVIgY29udmVydCwKICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEpCiB7CiAgIGludCBpOwpAQCAtMTU3Niw3ICsxNTg0LDcgQEAKICAgICAgIGlmIChwdHJbMF0gPT0gJ1wwJykgewogICAgICAgICAvKiAwIGlzbid0IGEgbGVnYWwgZGF0YSBjaGFyYWN0ZXIuIEZ1cnRoZXJtb3JlIGEgZG9jdW1lbnQKICAgICAgICAgICAgZW50aXR5IGNhbiBvbmx5IHN0YXJ0IHdpdGggQVNDSUkgY2hhcmFjdGVycy4gIFNvIHRoZSBvbmx5Ci0gICAgICAgICAgIHdheSB0aGlzIGNhbiBmYWlsIHRvIGJlIGJpZy1lbmRpYW4gVVRGLTE2IGlmIGl0IGl0J3MgYW4KKyAgICAgICAgICAgd2F5IHRoaXMgY2FuIGZhaWwgdG8gYmUgYmlnLWVuZGlhbiBVVEYtMTYgaXMgaWYgaXQgaXMgYW4KICAgICAgICAgICAgZXh0ZXJuYWwgcGFyc2VkIGdlbmVyYWwgZW50aXR5IHRoYXQncyBsYWJlbGxlZCBhcwogICAgICAgICAgICBVVEYtMTZMRS4KICAgICAgICAgKi8KQEAgLTE2MTAsNyArMTYxOCw5IEBACiAKICNkZWZpbmUgTlMoeCkgeAogI2RlZmluZSBucyh4KSB4CisjZGVmaW5lIFhNTF9UT0tfTlNfQwogI2luY2x1ZGUgInhtbHRva19ucy5jIgorI3VuZGVmIFhNTF9UT0tfTlNfQwogI3VuZGVmIE5TCiAjdW5kZWYgbnMKIApAQCAtMTYxOSw3ICsxNjI5LDkgQEAKICNkZWZpbmUgTlMoeCkgeCAjIyBOUwogI2RlZmluZSBucyh4KSB4ICMjIF9ucwogCisjZGVmaW5lIFhNTF9UT0tfTlNfQwogI2luY2x1ZGUgInhtbHRva19ucy5jIgorI3VuZGVmIFhNTF9UT0tfTlNfQwogCiAjdW5kZWYgTlMKICN1bmRlZiBucwpAQCAtMTYyNyw3ICsxNjM5LDcgQEAKIEVOQ09ESU5HICoKIFhtbEluaXRVbmtub3duRW5jb2RpbmdOUyh2b2lkICptZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDT05WRVJURVIgY29udmVydCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVkVSVEVSIGNvbnZlcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEpCiB7CiAgIEVOQ09ESU5HICplbmMgPSBYbWxJbml0VW5rbm93bkVuY29kaW5nKG1lbSwgdGFibGUsIGNvbnZlcnQsIHVzZXJEYXRhKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvZXhwYXQveG1sdG9rX2ltcGwuYyBiL01vZHVsZXMvZXhwYXQveG1sdG9rX2ltcGwuYwppbmRleCBmNzkzYTZiLi45YzI4OTViIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2V4cGF0L3htbHRva19pbXBsLmMKKysrIGIvTW9kdWxlcy9leHBhdC94bWx0b2tfaW1wbC5jCkBAIC0yLDYgKzIsOSBAQAogICAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIGNvcHlpbmcgcGVybWlzc2lvbi4KICovCiAKKy8qIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCEgKi8KKyNpZmRlZiBYTUxfVE9LX0lNUExfQworCiAjaWZuZGVmIElTX0lOVkFMSURfQ0hBUgogI2RlZmluZSBJU19JTlZBTElEX0NIQVIoZW5jLCBwdHIsIG4pICgwKQogI2VuZGlmCkBAIC04ODIsNyArODg1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKm5leHRUb2tQdHIpCiB7CiAgIGlmIChwdHIgPT0gZW5kKQotICAgIHJldHVybiAtWE1MX1RPS19QRVJDRU5UOworICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7CiAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgewogICBDSEVDS19OTVNUUlRfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKICAgY2FzZSBCVF9TOiBjYXNlIEJUX0xGOiBjYXNlIEJUX0NSOiBjYXNlIEJUX1BFUkNOVDoKQEAgLTE3NzcsMyArMTc4MCw0IEBACiAjdW5kZWYgQ0hFQ0tfTk1TVFJUX0NBU0UKICN1bmRlZiBDSEVDS19OTVNUUlRfQ0FTRVMKIAorI2VuZGlmIC8qIFhNTF9UT0tfSU1QTF9DICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2V4cGF0L3htbHRva19ucy5jIGIvTW9kdWxlcy9leHBhdC94bWx0b2tfbnMuYwppbmRleCBkMmY4OTM4Li5jM2I4OGZkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2V4cGF0L3htbHRva19ucy5jCisrKyBiL01vZHVsZXMvZXhwYXQveG1sdG9rX25zLmMKQEAgLTEsMyArMSwxMCBAQAorLyogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5IFRoYWkgT3BlbiBTb3VyY2UgU29mdHdhcmUgQ2VudGVyIEx0ZAorICAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIGNvcHlpbmcgcGVybWlzc2lvbi4KKyovCisKKy8qIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCEgKi8KKyNpZmRlZiBYTUxfVE9LX05TX0MKKwogY29uc3QgRU5DT0RJTkcgKgogTlMoWG1sR2V0VXRmOEludGVybmFsRW5jb2RpbmcpKHZvaWQpCiB7CkBAIC0xMDQsMyArMTExLDUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhbG9uZSk7CiB9CisKKyNlbmRpZiAvKiBYTUxfVE9LX05TX0MgKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvZmNudGxtb2R1bGUuYyBiL01vZHVsZXMvZmNudGxtb2R1bGUuYwppbmRleCA5OTc4NjdhLi40MWIzY2RlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2ZjbnRsbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9mY250bG1vZHVsZS5jCkBAIC0yNyw3ICsyNyw3IEBACiB9CiAKIAotLyogZmNudGwoZmQsIG9wdCwgW2FyZ10pICovCisvKiBmY250bChmZCwgb3AsIFthcmddKSAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgogZmNudGxfZmNudGwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQpAQCAtNzcsMTEgKzc3LDEyIEBACiB9CiAKIFB5RG9jX1NUUlZBUihmY250bF9kb2MsCi0iZmNudGwoZmQsIG9wdCwgW2FyZ10pXG5cCisiZmNudGwoZmQsIG9wLCBbYXJnXSlcblwKIFxuXAotUGVyZm9ybSB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbiBvbiBmaWxlIGRlc2NyaXB0b3IgZmQuICBUaGUgb3BlcmF0aW9uXG5cCi1pcyBkZWZpbmVkIGJ5IG9wIGFuZCBpcyBvcGVyYXRpbmcgc3lzdGVtIGRlcGVuZGVudC4gIFRoZXNlIGNvbnN0YW50cyBhcmVcblwKLWF2YWlsYWJsZSBmcm9tIHRoZSBmY250bCBtb2R1bGUuICBUaGUgYXJndW1lbnQgYXJnIGlzIG9wdGlvbmFsLCBhbmRcblwKK1BlcmZvcm0gdGhlIG9wZXJhdGlvbiBvcCBvbiBmaWxlIGRlc2NyaXB0b3IgZmQuICBUaGUgdmFsdWVzIHVzZWRcblwKK2ZvciBvcCBhcmUgb3BlcmF0aW5nIHN5c3RlbSBkZXBlbmRlbnQsIGFuZCBhcmUgYXZhaWxhYmxlXG5cCithcyBjb25zdGFudHMgaW4gdGhlIGZjbnRsIG1vZHVsZSwgdXNpbmcgdGhlIHNhbWUgbmFtZXMgYXMgdXNlZCBpblxuXAordGhlIHJlbGV2YW50IEMgaGVhZGVyIGZpbGVzLiAgVGhlIGFyZ3VtZW50IGFyZyBpcyBvcHRpb25hbCwgYW5kXG5cCiBkZWZhdWx0cyB0byAwOyBpdCBtYXkgYmUgYW4gaW50IG9yIGEgc3RyaW5nLiAgSWYgYXJnIGlzIGdpdmVuIGFzIGEgc3RyaW5nLFxuXAogdGhlIHJldHVybiB2YWx1ZSBvZiBmY250bCBpcyBhIHN0cmluZyBvZiB0aGF0IGxlbmd0aCwgY29udGFpbmluZyB0aGVcblwKIHJlc3VsdGluZyB2YWx1ZSBwdXQgaW4gdGhlIGFyZyBidWZmZXIgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBUaGUgbGVuZ3RoXG5cCkBAIC05MCw3ICs5MSw3IEBACiBjb3JyZXNwb25kaW5nIHRvIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZjbnRsIGNhbGwgaW4gdGhlIEMgY29kZS4iKTsKIAogCi0vKiBpb2N0bChmZCwgb3B0LCBbYXJnXSkgKi8KKy8qIGlvY3RsKGZkLCBvcCwgW2FyZ10pICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmY250bF9pb2N0bChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCkBAIC0xMDQsNyArMTA1LDcgQEAKICAgICAgICB3aGVyZWFzIHRoZSBzeXN0ZW0gZXhwZWN0cyBpdCB0byBiZSBhIDMyYml0IGJpdCBmaWVsZCB2YWx1ZQogICAgICAgIHJlZ2FyZGxlc3Mgb2YgaXQgYmVpbmcgcGFzc2VkIGFzIGFuIGludCBvciB1bnNpZ25lZCBsb25nIG9uCiAgICAgICAgdmFyaW91cyBwbGF0Zm9ybXMuICBTZWUgdGhlIHRlcm1pb3MuVElPQ1NXSU5TWiBjb25zdGFudCBhY3Jvc3MKLSAgICAgICBwbGF0Zm9ybXMgZm9yIGFuIGV4YW1wbGUgb2YgdGhpc2UuCisgICAgICAgcGxhdGZvcm1zIGZvciBhbiBleGFtcGxlIG9mIHRoaXMuCiAKICAgICAgICBJZiBhbnkgb2YgdGhlIDY0Yml0IHBsYXRmb3JtcyBldmVyIGRlY2lkZSB0byB1c2UgbW9yZSB0aGFuIDMyYml0cwogICAgICAgIGluIHRoZWlyIHVuc2lnbmVkIGxvbmcgaW9jdGwgY29kZXMgdGhpcyB3aWxsIGJyZWFrIGFuZCBuZWVkCkBAIC0yMTIsMTEgKzIxMywxMiBAQAogfQogCiBQeURvY19TVFJWQVIoaW9jdGxfZG9jLAotImlvY3RsKGZkLCBvcHRbLCBhcmdbLCBtdXRhdGVfZmxhZ11dKVxuXAorImlvY3RsKGZkLCBvcFssIGFyZ1ssIG11dGF0ZV9mbGFnXV0pXG5cCiBcblwKLVBlcmZvcm0gdGhlIHJlcXVlc3RlZCBvcGVyYXRpb24gb24gZmlsZSBkZXNjcmlwdG9yIGZkLiAgVGhlIG9wZXJhdGlvbiBpc1xuXAotZGVmaW5lZCBieSBvcHQgYW5kIGlzIG9wZXJhdGluZyBzeXN0ZW0gZGVwZW5kZW50LiAgVHlwaWNhbGx5IHRoZXNlIGNvZGVzIGFyZVxuXAotcmV0cmlldmVkIGZyb20gdGhlIGZjbnRsIG9yIHRlcm1pb3MgbGlicmFyeSBtb2R1bGVzLlxuXAorUGVyZm9ybSB0aGUgb3BlcmF0aW9uIG9wIG9uIGZpbGUgZGVzY3JpcHRvciBmZC4gIFRoZSB2YWx1ZXMgdXNlZCBmb3Igb3BcblwKK2FyZSBvcGVyYXRpbmcgc3lzdGVtIGRlcGVuZGVudCwgYW5kIGFyZSBhdmFpbGFibGUgYXMgY29uc3RhbnRzIGluIHRoZVxuXAorZmNudGwgb3IgdGVybWlvcyBsaWJyYXJ5IG1vZHVsZXMsIHVzaW5nIHRoZSBzYW1lIG5hbWVzIGFzIHVzZWQgaW4gdGhlXG5cCityZWxldmFudCBDIGhlYWRlciBmaWxlcy5cblwKIFxuXAogVGhlIGFyZ3VtZW50IGFyZyBpcyBvcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIDA7IGl0IG1heSBiZSBhbiBpbnQgb3IgYVxuXAogYnVmZmVyIGNvbnRhaW5pbmcgY2hhcmFjdGVyIGRhdGEgKG1vc3QgbGlrZWx5IGEgc3RyaW5nIG9yIGFuIGFycmF5KS4gXG5cCkBAIC0yOTksNyArMzAxLDcgQEAKICJmbG9jayhmZCwgb3BlcmF0aW9uKVxuXAogXG5cCiBQZXJmb3JtIHRoZSBsb2NrIG9wZXJhdGlvbiBvcCBvbiBmaWxlIGRlc2NyaXB0b3IgZmQuICBTZWUgdGhlIFVuaXggXG5cCi1tYW51YWwgcGFnZSBmb3IgZmxvY2soMykgZm9yIGRldGFpbHMuICAoT24gc29tZSBzeXN0ZW1zLCB0aGlzIGZ1bmN0aW9uIGlzXG5cCittYW51YWwgcGFnZSBmb3IgZmxvY2soMikgZm9yIGRldGFpbHMuICAoT24gc29tZSBzeXN0ZW1zLCB0aGlzIGZ1bmN0aW9uIGlzXG5cCiBlbXVsYXRlZCB1c2luZyBmY250bCgpLikiKTsKIAogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2ZsbW9kdWxlLmMgYi9Nb2R1bGVzL2ZsbW9kdWxlLmMKaW5kZXggYjVhNzhjZi4uMGRkZjYwMCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9mbG1vZHVsZS5jCisrKyBiL01vZHVsZXMvZmxtb2R1bGUuYwpAQCAtOTcsMTAgKzk3LDggQEAKIHsKICAgICBpbnQgaSwgbjsKIAotICAgIFB5X1hERUNSRUYoZy0+b2JfY2FsbGJhY2spOwotICAgIGctPm9iX2NhbGxiYWNrID0gTlVMTDsKLSAgICBQeV9YREVDUkVGKGctPm9iX2NhbGxiYWNrX2FyZyk7Ci0gICAgZy0+b2JfY2FsbGJhY2tfYXJnID0gTlVMTDsKKyAgICBQeV9DTEVBUihnLT5vYl9jYWxsYmFjayk7CisgICAgUHlfQ0xFQVIoZy0+b2JfY2FsbGJhY2tfYXJnKTsKICAgICBpZiAoYWxsZ2VuZXJpY3MgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuOyAvKiBObyBvYmplY3RzIGtub3duIHlldCAqLwogICAgIG4gPSBQeUxpc3RfU2l6ZShhbGxnZW5lcmljcyk7CkBAIC0xMzIsMTAgKzEzMCw4IEBACiAgICAgICAgICAgICAvKiBUaGUgb2JqZWN0IGlzIG5vdyB1bnJlYWNoYWJsZSBmb3IKICAgICAgICAgICAgICAgIGRvX2Zvcm1zIGFuZCBjaGVja19mb3Jtcywgc28KICAgICAgICAgICAgICAgIGRlbGV0ZSBpdCBmcm9tIHRoZSBsaXN0IG9mIGtub3duIG9iamVjdHMgKi8KLSAgICAgICAgICAgIFB5X1hERUNSRUYoZy0+b2JfY2FsbGJhY2spOwotICAgICAgICAgICAgZy0+b2JfY2FsbGJhY2sgPSBOVUxMOwotICAgICAgICAgICAgUHlfWERFQ1JFRihnLT5vYl9jYWxsYmFja19hcmcpOwotICAgICAgICAgICAgZy0+b2JfY2FsbGJhY2tfYXJnID0gTlVMTDsKKyAgICAgICAgICAgIFB5X0NMRUFSKGctPm9iX2NhbGxiYWNrKTsKKyAgICAgICAgICAgIFB5X0NMRUFSKGctPm9iX2NhbGxiYWNrX2FyZyk7CiAgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbShhbGxnZW5lcmljcywgaSwgKFB5T2JqZWN0ICopTlVMTCk7CiAgICAgICAgICAgICBuZnJlZXNsb3RzKys7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvZ2Ntb2R1bGUuYyBiL01vZHVsZXMvZ2Ntb2R1bGUuYwppbmRleCAzODRjNDdkLi45MTZlNDgxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2djbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9nY21vZHVsZS5jCkBAIC0xMTEsNiArMTExLDQ2IEBACiAgICAgaHR0cDovL21haWwucHl0aG9uLm9yZy9waXBlcm1haWwvcHl0aG9uLWRldi8yMDA4LUp1bmUvMDgwNTc5Lmh0bWwKICovCiAKKy8qCisgICBOT1RFOiBhYm91dCB1bnRyYWNraW5nIG9mIG11dGFibGUgb2JqZWN0cy4KKworICAgQ2VydGFpbiB0eXBlcyBvZiBjb250YWluZXIgY2Fubm90IHBhcnRpY2lwYXRlIGluIGEgcmVmZXJlbmNlIGN5Y2xlLCBhbmQKKyAgIHNvIGRvIG5vdCBuZWVkIHRvIGJlIHRyYWNrZWQgYnkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLiBVbnRyYWNraW5nIHRoZXNlCisgICBvYmplY3RzIHJlZHVjZXMgdGhlIGNvc3Qgb2YgZ2FyYmFnZSBjb2xsZWN0aW9ucy4gSG93ZXZlciwgZGV0ZXJtaW5pbmcKKyAgIHdoaWNoIG9iamVjdHMgbWF5IGJlIHVudHJhY2tlZCBpcyBub3QgZnJlZSwgYW5kIHRoZSBjb3N0cyBtdXN0IGJlCisgICB3ZWlnaGVkIGFnYWluc3QgdGhlIGJlbmVmaXRzIGZvciBnYXJiYWdlIGNvbGxlY3Rpb24uCisKKyAgIFRoZXJlIGFyZSB0d28gcG9zc2libGUgc3RyYXRlZ2llcyBmb3Igd2hlbiB0byB1bnRyYWNrIGEgY29udGFpbmVyOgorCisgICBpKSBXaGVuIHRoZSBjb250YWluZXIgaXMgY3JlYXRlZC4KKyAgIGlpKSBXaGVuIHRoZSBjb250YWluZXIgaXMgZXhhbWluZWQgYnkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLgorCisgICBUdXBsZXMgY29udGFpbmluZyBvbmx5IGltbXV0YWJsZSBvYmplY3RzIChpbnRlZ2Vycywgc3RyaW5ncyBldGMsIGFuZAorICAgcmVjdXJzaXZlbHksIHR1cGxlcyBvZiBpbW11dGFibGUgb2JqZWN0cykgZG8gbm90IG5lZWQgdG8gYmUgdHJhY2tlZC4KKyAgIFRoZSBpbnRlcnByZXRlciBjcmVhdGVzIGEgbGFyZ2UgbnVtYmVyIG9mIHR1cGxlcywgbWFueSBvZiB3aGljaCB3aWxsCisgICBub3Qgc3Vydml2ZSB1bnRpbCBnYXJiYWdlIGNvbGxlY3Rpb24uIEl0IGlzIHRoZXJlZm9yZSBub3Qgd29ydGh3aGlsZQorICAgdG8gdW50cmFjayBlbGlnaWJsZSB0dXBsZXMgYXQgY3JlYXRpb24gdGltZS4KKworICAgSW5zdGVhZCwgYWxsIHR1cGxlcyBleGNlcHQgdGhlIGVtcHR5IHR1cGxlIGFyZSB0cmFja2VkIHdoZW4gY3JlYXRlZC4KKyAgIER1cmluZyBnYXJiYWdlIGNvbGxlY3Rpb24gaXQgaXMgZGV0ZXJtaW5lZCB3aGV0aGVyIGFueSBzdXJ2aXZpbmcgdHVwbGVzCisgICBjYW4gYmUgdW50cmFja2VkLiBBIHR1cGxlIGNhbiBiZSB1bnRyYWNrZWQgaWYgYWxsIG9mIGl0cyBjb250ZW50cyBhcmUKKyAgIGFscmVhZHkgbm90IHRyYWNrZWQuIFR1cGxlcyBhcmUgZXhhbWluZWQgZm9yIHVudHJhY2tpbmcgaW4gYWxsIGdhcmJhZ2UKKyAgIGNvbGxlY3Rpb24gY3ljbGVzLiBJdCBtYXkgdGFrZSBtb3JlIHRoYW4gb25lIGN5Y2xlIHRvIHVudHJhY2sgYSB0dXBsZS4KKworICAgRGljdGlvbmFyaWVzIGNvbnRhaW5pbmcgb25seSBpbW11dGFibGUgb2JqZWN0cyBhbHNvIGRvIG5vdCBuZWVkIHRvIGJlCisgICB0cmFja2VkLiBEaWN0aW9uYXJpZXMgYXJlIHVudHJhY2tlZCB3aGVuIGNyZWF0ZWQuIElmIGEgdHJhY2tlZCBpdGVtIGlzCisgICBpbnNlcnRlZCBpbnRvIGEgZGljdGlvbmFyeSAoZWl0aGVyIGFzIGEga2V5IG9yIHZhbHVlKSwgdGhlIGRpY3Rpb25hcnkKKyAgIGJlY29tZXMgdHJhY2tlZC4gRHVyaW5nIGEgZnVsbCBnYXJiYWdlIGNvbGxlY3Rpb24gKGFsbCBnZW5lcmF0aW9ucyksCisgICB0aGUgY29sbGVjdG9yIHdpbGwgdW50cmFjayBhbnkgZGljdGlvbmFyaWVzIHdob3NlIGNvbnRlbnRzIGFyZSBub3QKKyAgIHRyYWNrZWQuCisKKyAgIFRoZSBtb2R1bGUgcHJvdmlkZXMgdGhlIHB5dGhvbiBmdW5jdGlvbiBpc190cmFja2VkKG9iaiksIHdoaWNoIHJldHVybnMKKyAgIHRoZSBDVVJSRU5UIHRyYWNraW5nIHN0YXR1cyBvZiB0aGUgb2JqZWN0LiBTdWJzZXF1ZW50IGdhcmJhZ2UKKyAgIGNvbGxlY3Rpb25zIG1heSBjaGFuZ2UgdGhlIHRyYWNraW5nIHN0YXR1cyBvZiB0aGUgb2JqZWN0LgorCisgICBVbnRyYWNraW5nIG9mIGNlcnRhaW4gY29udGFpbmVycyB3YXMgaW50cm9kdWNlZCBpbiBpc3N1ZSAjNDY4OCwgYW5kCisgICB0aGUgYWxnb3JpdGhtIHdhcyByZWZpbmVkIGluIHJlc3BvbnNlIHRvIGlzc3VlICMxNDc3NS4KKyovCiAKIC8qIHNldCBmb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uICovCiAjZGVmaW5lIERFQlVHX1NUQVRTICAgICAgICAgICAgICgxPDwwKSAvKiBwcmludCBjb2xsZWN0aW9uIHN0YXRpc3RpY3MgKi8KQEAgLTQzNiw5ICs0NzYsNiBAQAogICAgICAgICAgICAgaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdChvcCkpIHsKICAgICAgICAgICAgICAgICBfUHlUdXBsZV9NYXliZVVudHJhY2sob3ApOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoUHlEaWN0X0NoZWNrRXhhY3Qob3ApKSB7Ci0gICAgICAgICAgICAgICAgX1B5RGljdF9NYXliZVVudHJhY2sob3ApOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgLyogVGhpcyAqbWF5KiBiZSB1bnJlYWNoYWJsZS4gIFRvIG1ha2UgcHJvZ3Jlc3MsCkBAIC00NzgsNiArNTE1LDIwIEBACiAgICAgICAgIHJldHVybiAwOwogfQogCisvKiBUcnkgdG8gdW50cmFjayBhbGwgY3VycmVudGx5IHRyYWNrZWQgZGljdGlvbmFyaWVzICovCitzdGF0aWMgdm9pZAordW50cmFja19kaWN0cyhQeUdDX0hlYWQgKmhlYWQpCit7CisgICAgUHlHQ19IZWFkICpuZXh0LCAqZ2MgPSBoZWFkLT5nYy5nY19uZXh0OworICAgIHdoaWxlIChnYyAhPSBoZWFkKSB7CisgICAgICAgIFB5T2JqZWN0ICpvcCA9IEZST01fR0MoZ2MpOworICAgICAgICBuZXh0ID0gZ2MtPmdjLmdjX25leHQ7CisgICAgICAgIGlmIChQeURpY3RfQ2hlY2tFeGFjdChvcCkpCisgICAgICAgICAgICBfUHlEaWN0X01heWJlVW50cmFjayhvcCk7CisgICAgICAgIGdjID0gbmV4dDsKKyAgICB9Cit9CisKIC8qIE1vdmUgdGhlIG9iamVjdHMgaW4gdW5yZWFjaGFibGUgd2l0aCBfX2RlbF9fIG1ldGhvZHMgaW50byBgZmluYWxpemVyc2AuCiAgKiBPYmplY3RzIG1vdmVkIGludG8gYGZpbmFsaXplcnNgIGhhdmUgZ2NfcmVmcyBzZXQgdG8gR0NfUkVBQ0hBQkxFOyB0aGUKICAqIG9iamVjdHMgcmVtYWluaW5nIGluIHVucmVhY2hhYmxlIGFyZSBsZWZ0IGF0IEdDX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFLgpAQCAtODkwLDYgKzk0MSw5IEBACiAgICAgICAgIGdjX2xpc3RfbWVyZ2UoeW91bmcsIG9sZCk7CiAgICAgfQogICAgIGVsc2UgeworICAgICAgICAvKiBXZSBvbmx5IHVudHJhY2sgZGljdHMgaW4gZnVsbCBjb2xsZWN0aW9ucywgdG8gYXZvaWQgcXVhZHJhdGljCisgICAgICAgICAgIGRpY3QgYnVpbGQtdXAuIFNlZSBpc3N1ZSAjMTQ3NzUuICovCisgICAgICAgIHVudHJhY2tfZGljdHMoeW91bmcpOwogICAgICAgICBsb25nX2xpdmVkX3BlbmRpbmcgPSAwOwogICAgICAgICBsb25nX2xpdmVkX3RvdGFsID0gZ2NfbGlzdF9zaXplKHlvdW5nKTsKICAgICB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2dldGFkZHJpbmZvLmMgYi9Nb2R1bGVzL2dldGFkZHJpbmZvLmMKaW5kZXggMWQwYmZiYi4uOWQwNTRkMCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9nZXRhZGRyaW5mby5jCisrKyBiL01vZHVsZXMvZ2V0YWRkcmluZm8uYwpAQCAtNDMwLDcgKzQzMCw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAjaWZkZWYgRU5BQkxFX0lQVjYKICAgICAgICAgICAgIGNhc2UgQUZfSU5FVDY6Ci0gICAgICAgICAgICAgICAgcGZ4ID0gKChzdHJ1Y3QgaW42X2FkZHIgKilwdG9uKS0+czZfYWRkcjhbMF07CisgICAgICAgICAgICAgICAgcGZ4ID0gKChzdHJ1Y3QgaW42X2FkZHIgKilwdG9uKS0+czZfYWRkclswXTsKICAgICAgICAgICAgICAgICBpZiAocGZ4ID09IDAgfHwgcGZ4ID09IDB4ZmUgfHwgcGZ4ID09IDB4ZmYpCiAgICAgICAgICAgICAgICAgICAgIHBhaS0+YWlfZmxhZ3MgJj0gfkFJX0NBTk9OTkFNRTsKICAgICAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL01vZHVsZXMvZ2V0bmFtZWluZm8uYyBiL01vZHVsZXMvZ2V0bmFtZWluZm8uYwppbmRleCA3ODkyYWU5Li5mNzk4NWM5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2dldG5hbWVpbmZvLmMKKysrIGIvTW9kdWxlcy9nZXRuYW1laW5mby5jCkBAIC0xNjEsNyArMTYxLDcgQEAKICAgICAgICAgYnJlYWs7CiAjaWZkZWYgRU5BQkxFX0lQVjYKICAgICBjYXNlIEFGX0lORVQ2OgotICAgICAgICBwZnggPSAoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYSktPnNpbjZfYWRkci5zNl9hZGRyOFswXTsKKyAgICAgICAgcGZ4ID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2EpLT5zaW42X2FkZHIuczZfYWRkclswXTsKICAgICAgICAgaWYgKHBmeCA9PSAwIHx8IHBmeCA9PSAweGZlIHx8IHBmeCA9PSAweGZmKQogICAgICAgICAgICAgZmxhZ3MgfD0gTklfTlVNRVJJQ0hPU1Q7CiAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9nZXRwYXRoLmMgYi9Nb2R1bGVzL2dldHBhdGguYwppbmRleCA5ZmFhZmEzLi5kZTk2ZDQ3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2dldHBhdGguYworKysgYi9Nb2R1bGVzL2dldHBhdGguYwpAQCAtMzM1LDEyICszMzUsMjcgQEAKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogCi0gICAgLyogQ2hlY2sgdG8gc2VlIGlmIGFyZ3ZbMF0gaXMgaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeSAqLworICAgIC8qIENoZWNrIHRvIHNlZSBpZiBhcmd2WzBdIGlzIGluIHRoZSBidWlsZCBkaXJlY3RvcnkuICJweWJ1aWxkZGlyLnR4dCIKKyAgICAgICBpcyB3cml0dGVuIGJ5IHNldHVwLnB5IGFuZCBjb250YWlucyB0aGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgbG9jYXRpb24KKyAgICAgICBvZiBzaGFyZWQgbGlicmFyeSBtb2R1bGVzLiAqLwogICAgIHN0cmNweShleGVjX3ByZWZpeCwgYXJndjBfcGF0aCk7Ci0gICAgam9pbnBhdGgoZXhlY19wcmVmaXgsICJNb2R1bGVzL1NldHVwIik7CisgICAgam9pbnBhdGgoZXhlY19wcmVmaXgsICJweWJ1aWxkZGlyLnR4dCIpOwogICAgIGlmIChpc2ZpbGUoZXhlY19wcmVmaXgpKSB7Ci0gICAgICAgIHJlZHVjZShleGVjX3ByZWZpeCk7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICAgIEZJTEUgKmYgPSBmb3BlbihleGVjX3ByZWZpeCwgInIiKTsKKyAgICAgIGlmIChmID09IE5VTEwpCisJZXJybm8gPSAwOworICAgICAgZWxzZSB7CisJY2hhciByZWxfYnVpbGRkaXJfcGF0aFtNQVhQQVRITEVOKzFdOworCXNpemVfdCBuOworCW4gPSBmcmVhZChyZWxfYnVpbGRkaXJfcGF0aCwgMSwgTUFYUEFUSExFTiwgZik7CisJcmVsX2J1aWxkZGlyX3BhdGhbbl0gPSAnXDAnOworCWZjbG9zZShmKTsKKwlpZiAobiA+PSAwKSB7CisJICBzdHJjcHkoZXhlY19wcmVmaXgsIGFyZ3YwX3BhdGgpOworCSAgam9pbnBhdGgoZXhlY19wcmVmaXgsIHJlbF9idWlsZGRpcl9wYXRoKTsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgICB9CiAgICAgfQogCiAgICAgLyogU2VhcmNoIGZyb20gYXJndjBfcGF0aCwgdW50aWwgcm9vdCBpcyBmb3VuZCAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9ncnBtb2R1bGUuYyBiL01vZHVsZXMvZ3JwbW9kdWxlLmMKaW5kZXggMDdkZTg4MC4uMDQwZDhiMCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9ncnBtb2R1bGUuYworKysgYi9Nb2R1bGVzL2dycG1vZHVsZS5jCkBAIC0zLDE1ICszLDE1IEBACiAKICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlICJzdHJ1Y3RzZXEuaCIKKyNpbmNsdWRlICJwb3NpeG1vZHVsZS5oIgogCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8Z3JwLmg+CiAKIHN0YXRpYyBQeVN0cnVjdFNlcXVlbmNlX0ZpZWxkIHN0cnVjdF9ncm91cF90eXBlX2ZpZWxkc1tdID0gewogICAgeyJncl9uYW1lIiwgImdyb3VwIG5hbWUifSwKICAgIHsiZ3JfcGFzc3dkIiwgInBhc3N3b3JkIn0sCi0gICB7ImdyX2dpZCIsICJncm91cCBpZCJ9LCAKLSAgIHsiZ3JfbWVtIiwgImdyb3VwIG1lbWViZXJzIn0sIAorICAgeyJncl9naWQiLCAiZ3JvdXAgaWQifSwKKyAgIHsiZ3JfbWVtIiwgImdyb3VwIG1lbWJlcnMifSwKICAgIHswfQogfTsKIApAQCAtNzAsNyArNzAsNyBAQAogCSAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgfQogI2VuZGlmCi0gICAgU0VUKHNldEluZGV4KyssIFB5SW50X0Zyb21Mb25nKChsb25nKSBwLT5ncl9naWQpKTsKKyAgICBTRVQoc2V0SW5kZXgrKywgX1B5SW50X0Zyb21HaWQocC0+Z3JfZ2lkKSk7CiAgICAgU0VUKHNldEluZGV4KyssIHcpOwogI3VuZGVmIFNFVAogCkBAIC04NiwxNyArODYsMjUgQEAKIGdycF9nZXRncmdpZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnB5b19pZCkKIHsKICAgICBQeU9iamVjdCAqcHlfaW50X2lkOwotICAgIHVuc2lnbmVkIGludCBnaWQ7CisgICAgZ2lkX3QgZ2lkOwogICAgIHN0cnVjdCBncm91cCAqcDsKIAogICAgIHB5X2ludF9pZCA9IFB5TnVtYmVyX0ludChweW9faWQpOwogICAgIGlmICghcHlfaW50X2lkKQotCSAgICByZXR1cm4gTlVMTDsKLSAgICBnaWQgPSBQeUludF9BU19MT05HKHB5X2ludF9pZCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIV9QeV9HaWRfQ29udmVydGVyKHB5X2ludF9pZCwgJmdpZCkpIHsKKyAgICAgICAgUHlfREVDUkVGKHB5X2ludF9pZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICAgICBQeV9ERUNSRUYocHlfaW50X2lkKTsKIAogICAgIGlmICgocCA9IGdldGdyZ2lkKGdpZCkpID09IE5VTEwpIHsKLQlQeUVycl9Gb3JtYXQoUHlFeGNfS2V5RXJyb3IsICJnZXRncmdpZCgpOiBnaWQgbm90IGZvdW5kOiAlZCIsIGdpZCk7CisgICAgICAgIGlmIChnaWQgPCAwKQorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0tleUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRncmdpZCgpOiBnaWQgbm90IGZvdW5kOiAlbGQiLCAobG9uZylnaWQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfS2V5RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImdldGdyZ2lkKCk6IGdpZCBub3QgZm91bmQ6ICVsdSIsICh1bnNpZ25lZCBsb25nKWdpZCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICByZXR1cm4gbWtncmVudChwKTsKQEAgLTExMyw3ICsxMjEsNyBAQAogICAgIGlmICghcHlfc3RyX25hbWUpCiAJICAgIHJldHVybiBOVUxMOwogICAgIG5hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcocHlfc3RyX25hbWUpOwotICAgIAorCiAgICAgaWYgKChwID0gZ2V0Z3JuYW0obmFtZSkpID09IE5VTEwpIHsKIAlQeUVycl9Gb3JtYXQoUHlFeGNfS2V5RXJyb3IsICJnZXRncm5hbSgpOiBuYW1lIG5vdCBmb3VuZDogJXMiLCBuYW1lKTsKIAlQeV9ERUNSRUYocHlfc3RyX25hbWUpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9pdGVydG9vbHNtb2R1bGUuYyBiL01vZHVsZXMvaXRlcnRvb2xzbW9kdWxlLmMKaW5kZXggYjUxY2NmOS4uY2Q0NWViOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9pdGVydG9vbHNtb2R1bGUuYworKysgYi9Nb2R1bGVzL2l0ZXJ0b29sc21vZHVsZS5jCkBAIC00MDEsMTQgKzQwMSwzMSBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZAordGVlZGF0YW9iamVjdF9zYWZlX2RlY3JlZihQeU9iamVjdCAqb2JqKQoreworICAgIHdoaWxlIChvYmogJiYgUHlfVFlQRShvYmopID09ICZ0ZWVkYXRhb2JqZWN0X3R5cGUgJiYKKyAgICAgICAgICAgUHlfUkVGQ05UKG9iaikgPT0gMSkgeworICAgICAgICBQeU9iamVjdCAqbmV4dGxpbmsgPSAoKHRlZWRhdGFvYmplY3QgKilvYmopLT5uZXh0bGluazsKKyAgICAgICAgKCh0ZWVkYXRhb2JqZWN0ICopb2JqKS0+bmV4dGxpbmsgPSBOVUxMOworICAgICAgICBQeV9ERUNSRUYob2JqKTsKKyAgICAgICAgb2JqID0gbmV4dGxpbms7CisgICAgfQorICAgIFB5X1hERUNSRUYob2JqKTsKK30KKwogc3RhdGljIGludAogdGVlZGF0YW9iamVjdF9jbGVhcih0ZWVkYXRhb2JqZWN0ICp0ZG8pCiB7CiAgICAgaW50IGk7CisgICAgUHlPYmplY3QgKnRtcDsKKwogICAgIFB5X0NMRUFSKHRkby0+aXQpOwogICAgIGZvciAoaT0wIDsgaTx0ZG8tPm51bXJlYWQgOyBpKyspCiAgICAgICAgIFB5X0NMRUFSKHRkby0+dmFsdWVzW2ldKTsKLSAgICBQeV9DTEVBUih0ZG8tPm5leHRsaW5rKTsKKyAgICB0bXAgPSB0ZG8tPm5leHRsaW5rOworICAgIHRkby0+bmV4dGxpbmsgPSBOVUxMOworICAgIHRlZWRhdGFvYmplY3Rfc2FmZV9kZWNyZWYodG1wKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNDc1LDYgKzQ5Miw4IEBACiAKICAgICBpZiAodG8tPmluZGV4ID49IExJTktDRUxMUykgewogICAgICAgICBsaW5rID0gdGVlZGF0YW9iamVjdF9qdW1wbGluayh0by0+ZGF0YW9iaik7CisgICAgICAgIGlmIChsaW5rID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgUHlfREVDUkVGKHRvLT5kYXRhb2JqKTsKICAgICAgICAgdG8tPmRhdGFvYmogPSAodGVlZGF0YW9iamVjdCAqKWxpbms7CiAgICAgICAgIHRvLT5pbmRleCA9IDA7CkBAIC05MDMsMTEgKzkyMiwxMyBAQAogICAgICAgICB9CiAgICAgICAgIG9rID0gUHlPYmplY3RfSXNUcnVlKGdvb2QpOwogICAgICAgICBQeV9ERUNSRUYoZ29vZCk7Ci0gICAgICAgIGlmICghb2spIHsKKyAgICAgICAgaWYgKG9rID09IDApIHsKICAgICAgICAgICAgIGx6LT5zdGFydCA9IDE7CiAgICAgICAgICAgICByZXR1cm4gaXRlbTsKICAgICAgICAgfQogICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgIGlmIChvayA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiB9CiAKQEAgLTEwNDMsMTAgKzEwNjQsMTEgQEAKICAgICB9CiAgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUoZ29vZCk7CiAgICAgUHlfREVDUkVGKGdvb2QpOwotICAgIGlmIChvaykKKyAgICBpZiAob2sgPiAwKQogICAgICAgICByZXR1cm4gaXRlbTsKICAgICBQeV9ERUNSRUYoaXRlbSk7Ci0gICAgbHotPnN0b3AgPSAxOworICAgIGlmIChvayA9PSAwKQorICAgICAgICBsei0+c3RvcCA9IDE7CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTEyMTksMTkgKzEyNDEsMjIgQEAKICAgICBQeV9zc2l6ZV90IG9sZG5leHQ7CiAgICAgUHlPYmplY3QgKigqaXRlcm5leHQpKFB5T2JqZWN0ICopOwogCisgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCiAgICAgaXRlcm5leHQgPSAqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0OwogICAgIHdoaWxlIChsei0+Y250IDwgbHotPm5leHQpIHsKICAgICAgICAgaXRlbSA9IGl0ZXJuZXh0KGl0KTsKICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgZ290byBlbXB0eTsKICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOwogICAgICAgICBsei0+Y250Kys7CiAgICAgfQogICAgIGlmIChzdG9wICE9IC0xICYmIGx6LT5jbnQgPj0gc3RvcCkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGdvdG8gZW1wdHk7CiAgICAgaXRlbSA9IGl0ZXJuZXh0KGl0KTsKICAgICBpZiAoaXRlbSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZ290byBlbXB0eTsKICAgICBsei0+Y250Kys7CiAgICAgb2xkbmV4dCA9IGx6LT5uZXh0OwogICAgIC8qIFRoZSAoc2l6ZV90KSBjYXN0IGJlbG93IGF2b2lkcyB0aGUgZGFuZ2VyIG9mIHVuZGVmaW5lZApAQCAtMTI0MCw2ICsxMjY1LDEwIEBACiAgICAgaWYgKGx6LT5uZXh0IDwgb2xkbmV4dCB8fCAoc3RvcCAhPSAtMSAmJiBsei0+bmV4dCA+IHN0b3ApKQogICAgICAgICBsei0+bmV4dCA9IHN0b3A7CiAgICAgcmV0dXJuIGl0ZW07CisKK2VtcHR5OgorICAgIFB5X0NMRUFSKGx6LT5pdCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihpc2xpY2VfZG9jLApAQCAtMzAwMSw5ICszMDMwLDExIEBACiAgICAgICAgICAgICBvayA9IFB5T2JqZWN0X0lzVHJ1ZShnb29kKTsKICAgICAgICAgICAgIFB5X0RFQ1JFRihnb29kKTsKICAgICAgICAgfQotICAgICAgICBpZiAob2spCisgICAgICAgIGlmIChvayA+IDApCiAgICAgICAgICAgICByZXR1cm4gaXRlbTsKICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICBpZiAob2sgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogfQogCkBAIC0zMTQ0LDkgKzMxNzUsMTEgQEAKICAgICAgICAgICAgIG9rID0gUHlPYmplY3RfSXNUcnVlKGdvb2QpOwogICAgICAgICAgICAgUHlfREVDUkVGKGdvb2QpOwogICAgICAgICB9Ci0gICAgICAgIGlmICghb2spCisgICAgICAgIGlmIChvayA9PSAwKQogICAgICAgICAgICAgcmV0dXJuIGl0ZW07CiAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgaWYgKG9rIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIH0KIApAQCAtMzQwMCwxMCArMzQzMywxMCBAQAogUmV0dXJuIGEgY291bnQgb2JqZWN0IHdob3NlIC5uZXh0KCkgbWV0aG9kIHJldHVybnMgY29uc2VjdXRpdmUgdmFsdWVzLlxuXAogRXF1aXZhbGVudCB0bzpcblxuXAogICAgIGRlZiBjb3VudChmaXJzdHZhbD0wLCBzdGVwPTEpOlxuXAotICAgIHggPSBmaXJzdHZhbFxuXAotICAgIHdoaWxlIDE6XG5cCi0gICAgICAgIHlpZWxkIHhcblwKLSAgICAgICAgeCArPSBzdGVwXG4iKTsKKyAgICAgICAgeCA9IGZpcnN0dmFsXG5cCisgICAgICAgIHdoaWxlIDE6XG5cCisgICAgICAgICAgICB5aWVsZCB4XG5cCisgICAgICAgICAgICB4ICs9IHN0ZXBcbiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGNvdW50X3R5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCkBAIC0zNjUwLDE0ICszNjgzLDE3IEBACiB7CiAgICAgcmVwZWF0b2JqZWN0ICpybzsKICAgICBQeU9iamVjdCAqZWxlbWVudDsKLSAgICBQeV9zc2l6ZV90IGNudCA9IC0xOworICAgIFB5X3NzaXplX3QgY250ID0gLTEsIG5fa3dkcyA9IDA7CiAgICAgc3RhdGljIGNoYXIgKmt3YXJnc1tdID0geyJvYmplY3QiLCAidGltZXMiLCBOVUxMfTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfG46cmVwZWF0Iiwga3dhcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50LCAmY250KSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBpZiAoUHlUdXBsZV9TaXplKGFyZ3MpID09IDIgJiYgY250IDwgMCkKKyAgICBpZiAoa3dkcyAhPSBOVUxMKQorICAgICAgICBuX2t3ZHMgPSBQeURpY3RfU2l6ZShrd2RzKTsKKyAgICAvKiBEb2VzIHVzZXIgc3VwcGx5IHRpbWVzIGFyZ3VtZW50PyAqLworICAgIGlmICgoUHlUdXBsZV9TaXplKGFyZ3MpICsgbl9rd2RzID09IDIpICYmIGNudCA8IDApCiAgICAgICAgIGNudCA9IDA7CiAKICAgICBybyA9IChyZXBlYXRvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvbWFpbi5jIGIvTW9kdWxlcy9tYWluLmMKaW5kZXggYTEzZDE2Ni4uZWY5YjI0NSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9tYWluLmMKKysrIGIvTW9kdWxlcy9tYWluLmMKQEAgLTQwLDcgKzQwLDcgQEAKIHN0YXRpYyBpbnQgIG9yaWdfYXJnYzsKIAogLyogY29tbWFuZCBsaW5lIG9wdGlvbnMgKi8KLSNkZWZpbmUgQkFTRV9PUFRTICIzYkJjOmRFaGlKbTpPUTpzU3R1VXZWVzp4WD8iCisjZGVmaW5lIEJBU0VfT1BUUyAiM2JCYzpkRWhpSm06T1E6UnNTdHVVdlZXOnhYPyIKIAogI2lmbmRlZiBSSVNDT1MKICNkZWZpbmUgUFJPR1JBTV9PUFRTIEJBU0VfT1BUUwpAQCAtNzEsNiArNzEsOSBAQAogLW0gbW9kIDogcnVuIGxpYnJhcnkgbW9kdWxlIGFzIGEgc2NyaXB0ICh0ZXJtaW5hdGVzIG9wdGlvbiBsaXN0KVxuXAogLU8gICAgIDogb3B0aW1pemUgZ2VuZXJhdGVkIGJ5dGVjb2RlIHNsaWdodGx5OyBhbHNvIFBZVEhPTk9QVElNSVpFPXhcblwKIC1PTyAgICA6IHJlbW92ZSBkb2Mtc3RyaW5ncyBpbiBhZGRpdGlvbiB0byB0aGUgLU8gb3B0aW1pemF0aW9uc1xuXAorLVIgICAgIDogdXNlIGEgcHNldWRvLXJhbmRvbSBzYWx0IHRvIG1ha2UgaGFzaCgpIHZhbHVlcyBvZiB2YXJpb3VzIHR5cGVzIGJlXG5cCisgICAgICAgICB1bnByZWRpY3RhYmxlIGJldHdlZW4gc2VwYXJhdGUgaW52b2NhdGlvbnMgb2YgdGhlIGludGVycHJldGVyLCBhc1xuXAorICAgICAgICAgYSBkZWZlbnNlIGFnYWluc3QgZGVuaWFsLW9mLXNlcnZpY2UgYXR0YWNrc1xuXAogLVEgYXJnIDogZGl2aXNpb24gb3B0aW9uczogLVFvbGQgKGRlZmF1bHQpLCAtUXdhcm4sIC1Rd2FybmFsbCwgLVFuZXdcblwKIC1zICAgICA6IGRvbid0IGFkZCB1c2VyIHNpdGUgZGlyZWN0b3J5IHRvIHN5cy5wYXRoOyBhbHNvIFBZVEhPTk5PVVNFUlNJVEVcblwKIC1TICAgICA6IGRvbid0IGltcGx5ICdpbXBvcnQgc2l0ZScgb24gaW5pdGlhbGl6YXRpb25cblwKQEAgLTEwMiw2ICsxMDUsMTIgQEAKIFBZVEhPTkNBU0VPSyA6IGlnbm9yZSBjYXNlIGluICdpbXBvcnQnIHN0YXRlbWVudHMgKFdpbmRvd3MpLlxuXAogUFlUSE9OSU9FTkNPRElORzogRW5jb2RpbmdbOmVycm9yc10gdXNlZCBmb3Igc3RkaW4vc3Rkb3V0L3N0ZGVyci5cblwKICI7CitzdGF0aWMgY2hhciAqdXNhZ2VfNiA9ICJcCitQWVRIT05IQVNIU0VFRDogaWYgdGhpcyB2YXJpYWJsZSBpcyBzZXQgdG8gJ3JhbmRvbScsIHRoZSBlZmZlY3QgaXMgdGhlIHNhbWVcblwKKyAgIGFzIHNwZWNpZnlpbmcgdGhlIC1SIG9wdGlvbjogYSByYW5kb20gdmFsdWUgaXMgdXNlZCB0byBzZWVkIHRoZSBoYXNoZXMgb2ZcblwKKyAgIHN0ciwgYnl0ZXMgYW5kIGRhdGV0aW1lIG9iamVjdHMuICBJdCBjYW4gYWxzbyBiZSBzZXQgdG8gYW4gaW50ZWdlclxuXAorICAgaW4gdGhlIHJhbmdlIFswLDQyOTQ5NjcyOTVdIHRvIGdldCBoYXNoIHZhbHVlcyB3aXRoIGEgcHJlZGljdGFibGUgc2VlZC5cblwKKyI7CiAKIAogc3RhdGljIGludApAQCAtMTE4LDYgKzEyNyw3IEBACiAgICAgICAgIGZwdXRzKHVzYWdlXzMsIGYpOwogICAgICAgICBmcHJpbnRmKGYsIHVzYWdlXzQsIERFTElNKTsKICAgICAgICAgZnByaW50ZihmLCB1c2FnZV81LCBERUxJTSwgUFlUSE9OSE9NRUhFTFApOworICAgICAgICBmcHV0cyh1c2FnZV82LCBmKTsKICAgICB9CiAjaWYgZGVmaW5lZChfX1ZNUykKICAgICBpZiAoZXhpdGNvZGUgPT0gMCkgewpAQCAtMjUyLDcgKzI2MiwzNCBAQAogICAgIFB5X1JJU0NPU1dpbXBGbGFnID0gMDsKICNlbmRpZgogCisgICAgLyogSGFzaCByYW5kb21pemF0aW9uIG5lZWRlZCBlYXJseSBmb3IgYWxsIHN0cmluZyBvcGVyYXRpb25zCisgICAgICAgKGluY2x1ZGluZyAtVyBhbmQgLVggb3B0aW9ucykuICovCisgICAgX1B5T1Nfb3B0ZXJyID0gMDsgIC8qIHByZXZlbnQgcHJpbnRpbmcgdGhlIGVycm9yIGluIDFzdCBwYXNzICovCisgICAgd2hpbGUgKChjID0gX1B5T1NfR2V0T3B0KGFyZ2MsIGFyZ3YsIFBST0dSQU1fT1BUUykpICE9IEVPRikgeworICAgICAgICBpZiAoYyA9PSAnbScgfHwgYyA9PSAnYycpIHsKKyAgICAgICAgICAgIC8qIC1jIC8gLW0gaXMgdGhlIGxhc3Qgb3B0aW9uOiBmb2xsb3dpbmcgYXJndW1lbnRzIGFyZQorICAgICAgICAgICAgICAgbm90IGludGVycHJldGVyIG9wdGlvbnMuICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgY2FzZSAnRSc6CisgICAgICAgICAgICBQeV9JZ25vcmVFbnZpcm9ubWVudEZsYWcrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdSJzoKKyAgICAgICAgICAgIFB5X0hhc2hSYW5kb21pemF0aW9uRmxhZysrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogVGhlIHZhcmlhYmxlIGlzIG9ubHkgdGVzdGVkIGZvciBleGlzdGVuY2UgaGVyZTsgX1B5UmFuZG9tX0luaXQgd2lsbAorICAgICAgIGNoZWNrIGl0cyB2YWx1ZSBmdXJ0aGVyLiAqLworICAgIGlmICghUHlfSGFzaFJhbmRvbWl6YXRpb25GbGFnICYmCisgICAgICAgIChwID0gUHlfR0VURU5WKCJQWVRIT05IQVNIU0VFRCIpKSAmJiAqcCAhPSAnXDAnKQorICAgICAgICBQeV9IYXNoUmFuZG9taXphdGlvbkZsYWcgPSAxOworCisgICAgX1B5UmFuZG9tX0luaXQoKTsKKwogICAgIFB5U3lzX1Jlc2V0V2Fybk9wdGlvbnMoKTsKKyAgICBfUHlPU19SZXNldEdldE9wdCgpOwogCiAgICAgd2hpbGUgKChjID0gX1B5T1NfR2V0T3B0KGFyZ2MsIGFyZ3YsIFBST0dSQU1fT1BUUykpICE9IEVPRikgewogICAgICAgICBpZiAoYyA9PSAnYycpIHsKQEAgLTM0Niw3ICszODMsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAnRSc6Ci0gICAgICAgICAgICBQeV9JZ25vcmVFbnZpcm9ubWVudEZsYWcrKzsKKyAgICAgICAgICAgIC8qIEFscmVhZHkgaGFuZGxlZCBhYm92ZSAqLwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAndCc6CkBAIC0zODksNiArNDI2LDEwIEBACiAgICAgICAgICAgICBQeVN5c19BZGRXYXJuT3B0aW9uKF9QeU9TX29wdGFyZyk7CiAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICBjYXNlICdSJzoKKyAgICAgICAgICAgIC8qIEFscmVhZHkgaGFuZGxlZCBhYm92ZSAqLworICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgLyogVGhpcyBzcGFjZSByZXNlcnZlZCBmb3Igb3RoZXIgb3B0aW9ucyAqLwogCiAgICAgICAgIGRlZmF1bHQ6CkBAIC01NDMsNyArNTg0LDcgQEAKICAgICAgICAgc3RzID0gUHlSdW5fU2ltcGxlU3RyaW5nRmxhZ3MoY29tbWFuZCwgJmNmKSAhPSAwOwogICAgICAgICBmcmVlKGNvbW1hbmQpOwogICAgIH0gZWxzZSBpZiAobW9kdWxlKSB7Ci0gICAgICAgIHN0cyA9IFJ1bk1vZHVsZShtb2R1bGUsIDEpOworICAgICAgICBzdHMgPSAoUnVuTW9kdWxlKG1vZHVsZSwgMSkgIT0gMCk7CiAgICAgICAgIGZyZWUobW9kdWxlKTsKICAgICB9CiAgICAgZWxzZSB7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL21hdGhtb2R1bGUuYyBiL01vZHVsZXMvbWF0aG1vZHVsZS5jCmluZGV4IGNkNzRiMGQuLjg0NWZiOWIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvbWF0aG1vZHVsZS5jCisrKyBiL01vZHVsZXMvbWF0aG1vZHVsZS5jCkBAIC0xMjc3LDIzICsxMjc3LDMzIEBACiB7CiAgICAgLyogSWYgaXQgaXMgbG9uZywgZG8gaXQgb3Vyc2VsdmVzLiAqLwogICAgIGlmIChQeUxvbmdfQ2hlY2soYXJnKSkgewotICAgICAgICBkb3VibGUgeDsKKyAgICAgICAgZG91YmxlIHgsIHJlc3VsdDsKICAgICAgICAgUHlfc3NpemVfdCBlOwotICAgICAgICB4ID0gX1B5TG9uZ19GcmV4cCgoUHlMb25nT2JqZWN0ICopYXJnLCAmZSk7Ci0gICAgICAgIGlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICBpZiAoeCA8PSAwLjApIHsKKworICAgICAgICAvKiBOZWdhdGl2ZSBvciB6ZXJvIGlucHV0cyBnaXZlIGEgVmFsdWVFcnJvci4gKi8KKyAgICAgICAgaWYgKFB5X1NJWkUoYXJnKSA8PSAwKSB7CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF0aCBkb21haW4gZXJyb3IiKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgbG9nKDEpLCB0byBtYWtlIHN1cmUgd2UgZ2V0IGFuCi0gICAgICAgICAgIGV4YWN0IHJlc3VsdCB0aGVyZS4gKi8KLSAgICAgICAgaWYgKGUgPT0gMSAmJiB4ID09IDAuNSkKLSAgICAgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoMC4wKTsKLSAgICAgICAgLyogVmFsdWUgaXMgfj0geCAqIDIqKmUsIHNvIHRoZSBsb2cgfj0gbG9nKHgpICsgbG9nKDIpICogZS4gKi8KLSAgICAgICAgeCA9IGZ1bmMoeCkgKyBmdW5jKDIuMCkgKiBlOwotICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOworCisgICAgICAgIHggPSBQeUxvbmdfQXNEb3VibGUoYXJnKTsKKyAgICAgICAgaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfT3ZlcmZsb3dFcnJvcikpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAvKiBIZXJlIHRoZSBjb252ZXJzaW9uIHRvIGRvdWJsZSBvdmVyZmxvd2VkLCBidXQgaXQncyBwb3NzaWJsZQorICAgICAgICAgICAgICAgdG8gY29tcHV0ZSB0aGUgbG9nIGFueXdheS4gIENsZWFyIHRoZSBleGNlcHRpb24gYW5kIGNvbnRpbnVlLiAqLworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIHggPSBfUHlMb25nX0ZyZXhwKChQeUxvbmdPYmplY3QgKilhcmcsICZlKTsKKyAgICAgICAgICAgIGlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIC8qIFZhbHVlIGlzIH49IHggKiAyKiplLCBzbyB0aGUgbG9nIH49IGxvZyh4KSArIGxvZygyKSAqIGUuICovCisgICAgICAgICAgICByZXN1bHQgPSBmdW5jKHgpICsgZnVuYygyLjApICogZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICAvKiBTdWNjZXNzZnVsbHkgY29udmVydGVkIHggdG8gYSBkb3VibGUuICovCisgICAgICAgICAgICByZXN1bHQgPSBmdW5jKHgpOworICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHJlc3VsdCk7CiAgICAgfQogCiAgICAgLyogRWxzZSBsZXQgbGlibSBoYW5kbGUgaXQgYnkgaXRzZWxmLiAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9tZDVtb2R1bGUuYyBiL01vZHVsZXMvbWQ1bW9kdWxlLmMKaW5kZXggMDY4M2VmNS4uMTAzZGExNCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9tZDVtb2R1bGUuYworKysgYi9Nb2R1bGVzL21kNW1vZHVsZS5jCkBAIC01MSwxMiArNTEsMjUgQEAKIG1kNV91cGRhdGUobWQ1b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKICAgICBQeV9idWZmZXIgdmlldzsKKyAgICBQeV9zc2l6ZV90IG47CisgICAgdW5zaWduZWQgY2hhciAqYnVmOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKjp1cGRhdGUiLCAmdmlldykpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgbWQ1X2FwcGVuZCgmc2VsZi0+bWQ1LCAodW5zaWduZWQgY2hhciopdmlldy5idWYsCi0gICAgICAgICAgICAgICBQeV9TQUZFX0RPV05DQVNUKHZpZXcubGVuLCBQeV9zc2l6ZV90LCB1bnNpZ25lZCBpbnQpKTsKKyAgICBuID0gdmlldy5sZW47CisgICAgYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgdmlldy5idWY7CisgICAgd2hpbGUgKG4gPiAwKSB7CisgICAgICAgIFB5X3NzaXplX3QgbmJ5dGVzOworICAgICAgICBpZiAobiA+IElOVF9NQVgpCisgICAgICAgICAgICBuYnl0ZXMgPSBJTlRfTUFYOworICAgICAgICBlbHNlCisgICAgICAgICAgICBuYnl0ZXMgPSBuOworICAgICAgICBtZDVfYXBwZW5kKCZzZWxmLT5tZDUsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICBQeV9TQUZFX0RPV05DQVNUKG5ieXRlcywgUHlfc3NpemVfdCwgdW5zaWduZWQgaW50KSk7CisgICAgICAgIGJ1ZiArPSBuYnl0ZXM7CisgICAgICAgIG4gLT0gbmJ5dGVzOworICAgIH0KIAogICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXcpOwogICAgIFB5X1JFVFVSTl9OT05FOwpAQCAtMjYyLDYgKzI3NSw4IEBACiB7CiAgICAgbWQ1b2JqZWN0ICptZDVwOwogICAgIFB5X2J1ZmZlciB2aWV3ID0geyAwIH07CisgICAgUHlfc3NpemVfdCBuOworICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifHMqOm5ldyIsICZ2aWV3KSkKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yNzEsOSArMjg2LDE4IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGlmICh2aWV3LmxlbiA+IDApIHsKLSAgICAgICAgbWQ1X2FwcGVuZCgmbWQ1cC0+bWQ1LCAodW5zaWduZWQgY2hhciopdmlldy5idWYsCi0gICAgICAgICAgICAgICBQeV9TQUZFX0RPV05DQVNUKHZpZXcubGVuLCBQeV9zc2l6ZV90LCB1bnNpZ25lZCBpbnQpKTsKKyAgICBuID0gdmlldy5sZW47CisgICAgYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgdmlldy5idWY7CisgICAgd2hpbGUgKG4gPiAwKSB7CisgICAgICAgIFB5X3NzaXplX3QgbmJ5dGVzOworICAgICAgICBpZiAobiA+IElOVF9NQVgpCisgICAgICAgICAgICBuYnl0ZXMgPSBJTlRfTUFYOworICAgICAgICBlbHNlCisgICAgICAgICAgICBuYnl0ZXMgPSBuOworICAgICAgICBtZDVfYXBwZW5kKCZtZDVwLT5tZDUsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICBQeV9TQUZFX0RPV05DQVNUKG5ieXRlcywgUHlfc3NpemVfdCwgdW5zaWduZWQgaW50KSk7CisgICAgICAgIGJ1ZiArPSBuYnl0ZXM7CisgICAgICAgIG4gLT0gbmJ5dGVzOwogICAgIH0KICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3KTsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9tbWFwbW9kdWxlLmMgYi9Nb2R1bGVzL21tYXBtb2R1bGUuYwppbmRleCBhNTAyN2Y1Li42N2U0MDAwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL21tYXBtb2R1bGUuYworKysgYi9Nb2R1bGVzL21tYXBtb2R1bGUuYwpAQCAtMTE4OCwxOSArMTE4OCwyMiBAQAogIyAgZW5kaWYKICAgICBpZiAoZmQgIT0gLTEgJiYgZnN0YXQoZmQsICZzdCkgPT0gMCAmJiBTX0lTUkVHKHN0LnN0X21vZGUpKSB7CiAgICAgICAgIGlmIChtYXBfc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICBvZmZfdCBjYWxjX3NpemU7CisgICAgICAgICAgICBpZiAoc3Quc3Rfc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgbW1hcCBhbiBlbXB0eSBmaWxlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAob2Zmc2V0ID49IHN0LnN0X3NpemUpIHsKICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1tYXAgb2Zmc2V0IGlzIGdyZWF0ZXIgdGhhbiBmaWxlIHNpemUiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhbGNfc2l6ZSA9IHN0LnN0X3NpemUgLSBvZmZzZXQ7Ci0gICAgICAgICAgICBtYXBfc2l6ZSA9IGNhbGNfc2l6ZTsKLSAgICAgICAgICAgIGlmIChtYXBfc2l6ZSAhPSBjYWxjX3NpemUpIHsKKyAgICAgICAgICAgIGlmIChzdC5zdF9zaXplIC0gb2Zmc2V0ID4gUFlfU1NJWkVfVF9NQVgpIHsKICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtbWFwIGxlbmd0aCBpcyB0b28gbGFyZ2UiKTsKLSAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFwX3NpemUgPSAoUHlfc3NpemVfdCkgKHN0LnN0X3NpemUgLSBvZmZzZXQpOwogICAgICAgICB9IGVsc2UgaWYgKG9mZnNldCArIChzaXplX3QpbWFwX3NpemUgPiBzdC5zdF9zaXplKSB7CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW1hcCBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIGZpbGUgc2l6ZSIpOwpAQCAtMTM4MywxNyArMTM4NiwyNSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzaXplID0gKCgoUFlfTE9OR19MT05HKSBoaWdoKSA8PCAzMikgKyBsb3c7CisgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgbW1hcCBhbiBlbXB0eSBmaWxlIik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG1fb2JqKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gc2l6ZSkgewogICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW1hcCBvZmZzZXQgaXMgZ3JlYXRlciB0aGFuIGZpbGUgc2l6ZSIpOwogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihtX29iaik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob2Zmc2V0IC0gc2l6ZSA+IFBZX1NTSVpFX1RfTUFYKQotICAgICAgICAgICAgICAgIC8qIE1hcCBhcmVhIHRvbyBsYXJnZSB0byBmaXQgaW4gbWVtb3J5ICovCi0gICAgICAgICAgICAgICAgbV9vYmotPnNpemUgPSAoUHlfc3NpemVfdCkgLTE7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbV9vYmotPnNpemUgPSAoUHlfc3NpemVfdCkgKHNpemUgLSBvZmZzZXQpOworICAgICAgICAgICAgaWYgKHNpemUgLSBvZmZzZXQgPiBQWV9TU0laRV9UX01BWCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW1hcCBsZW5ndGggaXMgdG9vIGxhcmdlIik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG1fb2JqKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fb2JqLT5zaXplID0gKFB5X3NzaXplX3QpIChzaXplIC0gb2Zmc2V0KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1fb2JqLT5zaXplID0gbWFwX3NpemU7CiAgICAgICAgICAgICBzaXplID0gb2Zmc2V0ICsgbWFwX3NpemU7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL29wZXJhdG9yLmMgYi9Nb2R1bGVzL29wZXJhdG9yLmMKaW5kZXggMjc0ZDhhYS4uMzc1NTkyYyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9vcGVyYXRvci5jCisrKyBiL01vZHVsZXMvb3BlcmF0b3IuYwpAQCAtMjM1LDYgKzIzNSwxMzIgQEAKICNkZWZpbmUgc3BhbTJvKE9QLEFMVE9QLERPQykgeyNPUCwgb3BfIyNPUCwgTUVUSF9PLCBQeURvY19TVFIoRE9DKX0sIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsjQUxUT1AsIG9wXyMjT1AsIE1FVEhfTywgUHlEb2NfU1RSKERPQyl9LAogCisKKworLyogY29tcGFyZV9kaWdlc3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIHRpbWluZyBzYWZlIGNvbXBhcmUKKyAqCisgKiBSZXR1cm5zIDEgb2YgdGhlIHN0cmluZ3MgYXJlIGVxdWFsLgorICogSW4gY2FzZSBvZiBsZW4oYSkgIT0gbGVuKGIpIHRoZSBmdW5jdGlvbiB0cmllcyB0byBrZWVwIHRoZSB0aW1pbmcKKyAqIGRlcGVuZGVudCBvbiB0aGUgbGVuZ3RoIG9mIGIuIENQVSBjYWNoZSBsb2NhbGx5IG1heSBzdGlsbCBhbHRlciB0aW1pbmcKKyAqIGEgYml0LgorICovCitzdGF0aWMgaW50CitfdHNjbXAoY29uc3QgdW5zaWduZWQgY2hhciAqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqYiwKKyAgICAgICAgUHlfc3NpemVfdCBsZW5fYSwgUHlfc3NpemVfdCBsZW5fYikKK3sKKyAgICAvKiBUaGUgdm9sYXRpbGUgdHlwZSBkZWNsYXJhdGlvbnMgbWFrZSBzdXJlIHRoYXQgdGhlIGNvbXBpbGVyIGhhcyBubworICAgICAqIGNoYW5jZSB0byBvcHRpbWl6ZSBhbmQgZm9sZCB0aGUgY29kZSBpbiBhbnkgd2F5IHRoYXQgbWF5IGNoYW5nZQorICAgICAqIHRoZSB0aW1pbmcuCisgICAgICovCisgICAgdm9sYXRpbGUgUHlfc3NpemVfdCBsZW5ndGg7CisgICAgdm9sYXRpbGUgY29uc3QgdW5zaWduZWQgY2hhciAqbGVmdDsKKyAgICB2b2xhdGlsZSBjb25zdCB1bnNpZ25lZCBjaGFyICpyaWdodDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgdW5zaWduZWQgY2hhciByZXN1bHQ7CisKKyAgICAvKiBsb29wIGNvdW50IGRlcGVuZHMgb24gbGVuZ3RoIG9mIGIgKi8KKyAgICBsZW5ndGggPSBsZW5fYjsKKyAgICBsZWZ0ID0gTlVMTDsKKyAgICByaWdodCA9IGI7CisKKyAgICAvKiBkb24ndCB1c2UgZWxzZSBoZXJlIHRvIGtlZXAgdGhlIGFtb3VudCBvZiBDUFUgaW5zdHJ1Y3Rpb25zIGNvbnN0YW50LAorICAgICAqIHZvbGF0aWxlIGZvcmNlcyByZS1ldmFsdWF0aW9uCisgICAgICogICovCisgICAgaWYgKGxlbl9hID09IGxlbmd0aCkgeworICAgICAgICBsZWZ0ID0gKigodm9sYXRpbGUgY29uc3QgdW5zaWduZWQgY2hhcioqKSZhKTsKKyAgICAgICAgcmVzdWx0ID0gMDsKKyAgICB9CisgICAgaWYgKGxlbl9hICE9IGxlbmd0aCkgeworICAgICAgICBsZWZ0ID0gYjsKKyAgICAgICAgcmVzdWx0ID0gMTsKKyAgICB9CisKKyAgICBmb3IgKGk9MDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgIHJlc3VsdCB8PSAqbGVmdCsrIF4gKnJpZ2h0Kys7CisgICAgfQorCisgICAgcmV0dXJuIChyZXN1bHQgPT0gMCk7Cit9CisKK1B5RG9jX1NUUlZBUihjb21wYXJlX2RpZ2VzdF9fZG9jX18sCisiY29tcGFyZV9kaWdlc3QoYSwgYikgLT4gYm9vbFxuIgorIlxuIgorIlJldHVybiAnYSA9PSBiJy4gIFRoaXMgZnVuY3Rpb24gdXNlcyBhbiBhcHByb2FjaCBkZXNpZ25lZCB0byBwcmV2ZW50XG4iCisidGltaW5nIGFuYWx5c2lzLCBtYWtpbmcgaXQgYXBwcm9wcmlhdGUgZm9yIGNyeXB0b2dyYXBoeS5cbiIKKyJhIGFuZCBiIG11c3QgYm90aCBiZSBvZiB0aGUgc2FtZSB0eXBlOiBlaXRoZXIgc3RyIChBU0NJSSBvbmx5KSxcbiIKKyJvciBhbnkgdHlwZSB0aGF0IHN1cHBvcnRzIHRoZSBidWZmZXIgcHJvdG9jb2wgKGUuZy4gYnl0ZXMpLlxuIgorIlxuIgorIk5vdGU6IElmIGEgYW5kIGIgYXJlIG9mIGRpZmZlcmVudCBsZW5ndGhzLCBvciBpZiBhbiBlcnJvciBvY2N1cnMsXG4iCisiYSB0aW1pbmcgYXR0YWNrIGNvdWxkIHRoZW9yZXRpY2FsbHkgcmV2ZWFsIGluZm9ybWF0aW9uIGFib3V0IHRoZVxuIgorInR5cGVzIGFuZCBsZW5ndGhzIG9mIGEgYW5kIGItLWJ1dCBub3QgdGhlaXIgdmFsdWVzLlxuIik7CisKK3N0YXRpYyBQeU9iamVjdCoKK2NvbXBhcmVfZGlnZXN0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBQeU9iamVjdCAqYSwgKmI7CisgICAgaW50IHJjOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPTzpjb21wYXJlX2RpZ2VzdCIsICZhLCAmYikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogVW5pY29kZSBzdHJpbmcgKi8KKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKGEpICYmIFB5VW5pY29kZV9DaGVjayhiKSkgeworICAgICAgICByYyA9IF90c2NtcCgoY29uc3QgdW5zaWduZWQgY2hhciAqKVB5VW5pY29kZV9BU19EQVRBKGEpLAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciAqKVB5VW5pY29kZV9BU19EQVRBKGIpLAorICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0RBVEFfU0laRShhKSwKKyAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9EQVRBX1NJWkUoYikpOworICAgIH0KKyAgICAvKiBmYWxsYmFjayB0byBidWZmZXIgaW50ZXJmYWNlIGZvciBieXRlcywgYnl0ZXNhcnJheSBhbmQgb3RoZXIgKi8KKyAgICBlbHNlIHsKKyAgICAgICAgUHlfYnVmZmVyIHZpZXdfYTsKKyAgICAgICAgUHlfYnVmZmVyIHZpZXdfYjsKKworICAgICAgICBpZiAoUHlPYmplY3RfQ2hlY2tCdWZmZXIoYSkgPT0gMCAmJiBQeU9iamVjdF9DaGVja0J1ZmZlcihiKSA9PSAwKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGVzKHMpIG9yIGNvbWJpbmF0aW9uIG9mIHR5cGVzOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIiclLjEwMHMnIGFuZCAnJS4xMDBzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShhKS0+dHBfbmFtZSwgUHlfVFlQRShiKS0+dHBfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoYSwgJnZpZXdfYSwgUHlCVUZfU0lNUExFKSA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpZXdfYS5uZGltID4gMSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0J1ZmZlckVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCdWZmZXIgbXVzdCBiZSBzaW5nbGUgZGltZW5zaW9uIik7CisgICAgICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3X2EpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKGIsICZ2aWV3X2IsIFB5QlVGX1NJTVBMRSkgPT0gLTEpIHsKKyAgICAgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXdfYSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlld19iLm5kaW0gPiAxKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQnVmZmVyRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJ1ZmZlciBtdXN0IGJlIHNpbmdsZSBkaW1lbnNpb24iKTsKKyAgICAgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXdfYSk7CisgICAgICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3X2IpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICByYyA9IF90c2NtcCgoY29uc3QgdW5zaWduZWQgY2hhciopdmlld19hLmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKXZpZXdfYi5idWYsCisgICAgICAgICAgICAgICAgICAgIHZpZXdfYS5sZW4sCisgICAgICAgICAgICAgICAgICAgIHZpZXdfYi5sZW4pOworCisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXdfYSk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXdfYik7CisgICAgfQorCisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyYyk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgb3BlcmF0b3JfbWV0aG9kc1tdID0gewogCiBzcGFtMW8oaXNDYWxsYWJsZSwKQEAgLTMxOCw2ICs0NDQsOCBAQAogc3BhbTIoZ3QsX19ndF9fLCAiZ3QoYSwgYikgLS0gU2FtZSBhcyBhPmIuIikKIHNwYW0yKGdlLF9fZ2VfXywgImdlKGEsIGIpIC0tIFNhbWUgYXMgYT49Yi4iKQogCisgICAgeyJfY29tcGFyZV9kaWdlc3QiLCAoUHlDRnVuY3Rpb24pY29tcGFyZV9kaWdlc3QsIE1FVEhfVkFSQVJHUywKKyAgICAgY29tcGFyZV9kaWdlc3RfX2RvY19ffSwKICAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogCiB9OwpAQCAtNDEyLDggKzU0MCw4IEBACiAiaXRlbWdldHRlcihpdGVtLCAuLi4pIC0tPiBpdGVtZ2V0dGVyIG9iamVjdFxuXAogXG5cCiBSZXR1cm4gYSBjYWxsYWJsZSBvYmplY3QgdGhhdCBmZXRjaGVzIHRoZSBnaXZlbiBpdGVtKHMpIGZyb20gaXRzIG9wZXJhbmQuXG5cCi1BZnRlciwgZj1pdGVtZ2V0dGVyKDIpLCB0aGUgY2FsbCBmKHIpIHJldHVybnMgclsyXS5cblwKLUFmdGVyLCBnPWl0ZW1nZXR0ZXIoMiw1LDMpLCB0aGUgY2FsbCBnKHIpIHJldHVybnMgKHJbMl0sIHJbNV0sIHJbM10pIik7CitBZnRlciBmID0gaXRlbWdldHRlcigyKSwgdGhlIGNhbGwgZihyKSByZXR1cm5zIHJbMl0uXG5cCitBZnRlciBnID0gaXRlbWdldHRlcigyLCA1LCAzKSwgdGhlIGNhbGwgZyhyKSByZXR1cm5zIChyWzJdLCByWzVdLCByWzNdKSIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGl0ZW1nZXR0ZXJfdHlwZSA9IHsKICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKQEAgLTU5Miw5ICs3MjAsOSBAQAogImF0dHJnZXR0ZXIoYXR0ciwgLi4uKSAtLT4gYXR0cmdldHRlciBvYmplY3RcblwKIFxuXAogUmV0dXJuIGEgY2FsbGFibGUgb2JqZWN0IHRoYXQgZmV0Y2hlcyB0aGUgZ2l2ZW4gYXR0cmlidXRlKHMpIGZyb20gaXRzIG9wZXJhbmQuXG5cCi1BZnRlciwgZj1hdHRyZ2V0dGVyKCduYW1lJyksIHRoZSBjYWxsIGYocikgcmV0dXJucyByLm5hbWUuXG5cCi1BZnRlciwgZz1hdHRyZ2V0dGVyKCduYW1lJywgJ2RhdGUnKSwgdGhlIGNhbGwgZyhyKSByZXR1cm5zIChyLm5hbWUsIHIuZGF0ZSkuXG5cCi1BZnRlciwgaD1hdHRyZ2V0dGVyKCduYW1lLmZpcnN0JywgJ25hbWUubGFzdCcpLCB0aGUgY2FsbCBoKHIpIHJldHVybnNcblwKK0FmdGVyIGYgPSBhdHRyZ2V0dGVyKCduYW1lJyksIHRoZSBjYWxsIGYocikgcmV0dXJucyByLm5hbWUuXG5cCitBZnRlciBnID0gYXR0cmdldHRlcignbmFtZScsICdkYXRlJyksIHRoZSBjYWxsIGcocikgcmV0dXJucyAoci5uYW1lLCByLmRhdGUpLlxuXAorQWZ0ZXIgaCA9IGF0dHJnZXR0ZXIoJ25hbWUuZmlyc3QnLCAnbmFtZS5sYXN0JyksIHRoZSBjYWxsIGgocikgcmV0dXJuc1xuXAogKHIubmFtZS5maXJzdCwgci5uYW1lLmxhc3QpLiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGF0dHJnZXR0ZXJfdHlwZSA9IHsKQEAgLTcyNCw4ICs4NTIsOCBAQAogIm1ldGhvZGNhbGxlcihuYW1lLCAuLi4pIC0tPiBtZXRob2RjYWxsZXIgb2JqZWN0XG5cCiBcblwKIFJldHVybiBhIGNhbGxhYmxlIG9iamVjdCB0aGF0IGNhbGxzIHRoZSBnaXZlbiBtZXRob2Qgb24gaXRzIG9wZXJhbmQuXG5cCi1BZnRlciwgZiA9IG1ldGhvZGNhbGxlcignbmFtZScpLCB0aGUgY2FsbCBmKHIpIHJldHVybnMgci5uYW1lKCkuXG5cCi1BZnRlciwgZyA9IG1ldGhvZGNhbGxlcignbmFtZScsICdkYXRlJywgZm9vPTEpLCB0aGUgY2FsbCBnKHIpIHJldHVybnNcblwKK0FmdGVyIGYgPSBtZXRob2RjYWxsZXIoJ25hbWUnKSwgdGhlIGNhbGwgZihyKSByZXR1cm5zIHIubmFtZSgpLlxuXAorQWZ0ZXIgZyA9IG1ldGhvZGNhbGxlcignbmFtZScsICdkYXRlJywgZm9vPTEpLCB0aGUgY2FsbCBnKHIpIHJldHVybnNcblwKIHIubmFtZSgnZGF0ZScsIGZvbz0xKS4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBtZXRob2RjYWxsZXJfdHlwZSA9IHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvb3NzYXVkaW9kZXYuYyBiL01vZHVsZXMvb3NzYXVkaW9kZXYuYwppbmRleCA2NDdhMjFlLi4yODRjYzYxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL29zc2F1ZGlvZGV2LmMKKysrIGIvTW9kdWxlcy9vc3NhdWRpb2Rldi5jCkBAIC0yMTUsNyArMjE1LDcgQEAKICAqLwogCiAvKiBfZG9faW9jdGxfMSgpIGlzIGEgcHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb24gdXNlZCBmb3IgdGhlIE9TUyBpb2N0bHMgLS0KLSAgIFNORENUTF9EU1Bfe1NFVEZNVCxDSEFOTkVMUyxTUEVFRH0gLS0gdGhhdCB0aGF0IGFyZSBjYWxsZWQgZnJvbSBDCisgICBTTkRDVExfRFNQX3tTRVRGTVQsQ0hBTk5FTFMsU1BFRUR9IC0tIHRoYXQgYXJlIGNhbGxlZCBmcm9tIEMKICAgIGxpa2UgdGhpczoKICAgICAgaW9jdGwoZmQsIFNORENUTF9EU1BfY21kLCAmYXJnKQogCkBAIC00OTAsNyArNDkwLDYgQEAKIHsKICAgICBpbnQgd2FudGVkX2ZtdCwgd2FudGVkX2NoYW5uZWxzLCB3YW50ZWRfcmF0ZSwgc3RyaWN0PTA7CiAgICAgaW50IGZtdCwgY2hhbm5lbHMsIHJhdGU7Ci0gICAgUHlPYmplY3QgKiBydjsgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiB0dXBsZSAoZm10LCBjaGFubmVscywgcmF0ZSkgKi8KIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpfGk6c2V0cGFyYW1ldGVycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YW50ZWRfZm10LCAmd2FudGVkX2NoYW5uZWxzLCAmd2FudGVkX3JhdGUsCkBAIC01MzIsMTMgKzUzMSw3IEBACiAKICAgICAvKiBDb25zdHJ1Y3QgdGhlIHJldHVybiB2YWx1ZTogYSAoZm10LCBjaGFubmVscywgcmF0ZSkgdHVwbGUgdGhhdAogICAgICAgIHRlbGxzIHdoYXQgdGhlIGF1ZGlvIGhhcmR3YXJlIHdhcyBhY3R1YWxseSBzZXQgdG8uICovCi0gICAgcnYgPSBQeVR1cGxlX05ldygzKTsKLSAgICBpZiAocnYgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgUHlUdXBsZV9TRVRfSVRFTShydiwgMCwgUHlJbnRfRnJvbUxvbmcoZm10KSk7Ci0gICAgUHlUdXBsZV9TRVRfSVRFTShydiwgMSwgUHlJbnRfRnJvbUxvbmcoY2hhbm5lbHMpKTsKLSAgICBQeVR1cGxlX1NFVF9JVEVNKHJ2LCAyLCBQeUludF9Gcm9tTG9uZyhyYXRlKSk7Ci0gICAgcmV0dXJuIHJ2OworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoaWlpKSIsIGZtdCwgY2hhbm5lbHMsIHJhdGUpOwogfQogCiBzdGF0aWMgaW50CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3BhcnNlcm1vZHVsZS5jIGIvTW9kdWxlcy9wYXJzZXJtb2R1bGUuYwppbmRleCA2MzI0NzVjLi5lYjJkNjAwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3BhcnNlcm1vZHVsZS5jCisrKyBiL01vZHVsZXMvcGFyc2VybW9kdWxlLmMKQEAgLTE2OSw5ICsxNjksMzMgQEAKIAogCiBzdGF0aWMgdm9pZCBwYXJzZXJfZnJlZShQeVNUX09iamVjdCAqc3QpOworc3RhdGljIFB5T2JqZWN0KiBwYXJzZXJfc2l6ZW9mKFB5U1RfT2JqZWN0ICosIHZvaWQgKik7CiBzdGF0aWMgaW50IHBhcnNlcl9jb21wYXJlKFB5U1RfT2JqZWN0ICpsZWZ0LCBQeVNUX09iamVjdCAqcmlnaHQpOwogc3RhdGljIFB5T2JqZWN0ICpwYXJzZXJfZ2V0YXR0cihQeU9iamVjdCAqc2VsZiwgY2hhciAqbmFtZSk7CitzdGF0aWMgUHlPYmplY3QqIHBhcnNlcl9jb21waWxlc3QoUHlTVF9PYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CitzdGF0aWMgUHlPYmplY3QqIHBhcnNlcl9pc2V4cHIoUHlTVF9PYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CitzdGF0aWMgUHlPYmplY3QqIHBhcnNlcl9pc3N1aXRlKFB5U1RfT2JqZWN0ICosIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworc3RhdGljIFB5T2JqZWN0KiBwYXJzZXJfc3QybGlzdChQeVNUX09iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK3N0YXRpYyBQeU9iamVjdCogcGFyc2VyX3N0MnR1cGxlKFB5U1RfT2JqZWN0ICosIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwogCisjZGVmaW5lIFBVQkxJQ19NRVRIT0RfVFlQRSAoTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMpCisKK3N0YXRpYyBQeU1ldGhvZERlZgorcGFyc2VyX21ldGhvZHNbXSA9IHsKKyAgICB7ImNvbXBpbGUiLCAgICAgICAgIChQeUNGdW5jdGlvbilwYXJzZXJfY29tcGlsZXN0LCAgUFVCTElDX01FVEhPRF9UWVBFLAorICAgICAgICBQeURvY19TVFIoIkNvbXBpbGUgdGhpcyBTVCBvYmplY3QgaW50byBhIGNvZGUgb2JqZWN0LiIpfSwKKyAgICB7ImlzZXhwciIsICAgICAgICAgIChQeUNGdW5jdGlvbilwYXJzZXJfaXNleHByLCAgICAgUFVCTElDX01FVEhPRF9UWVBFLAorICAgICAgICBQeURvY19TVFIoIkRldGVybWluZXMgaWYgdGhpcyBTVCBvYmplY3Qgd2FzIGNyZWF0ZWQgZnJvbSBhbiBleHByZXNzaW9uLiIpfSwKKyAgICB7Imlzc3VpdGUiLCAgICAgICAgIChQeUNGdW5jdGlvbilwYXJzZXJfaXNzdWl0ZSwgICAgUFVCTElDX01FVEhPRF9UWVBFLAorICAgICAgICBQeURvY19TVFIoIkRldGVybWluZXMgaWYgdGhpcyBTVCBvYmplY3Qgd2FzIGNyZWF0ZWQgZnJvbSBhIHN1aXRlLiIpfSwKKyAgICB7InRvbGlzdCIsICAgICAgICAgIChQeUNGdW5jdGlvbilwYXJzZXJfc3QybGlzdCwgICAgUFVCTElDX01FVEhPRF9UWVBFLAorICAgICAgICBQeURvY19TVFIoIkNyZWF0ZXMgYSBsaXN0LXRyZWUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBTVC4iKX0sCisgICAgeyJ0b3R1cGxlIiwgICAgICAgICAoUHlDRnVuY3Rpb24pcGFyc2VyX3N0MnR1cGxlLCAgIFBVQkxJQ19NRVRIT0RfVFlQRSwKKyAgICAgICAgUHlEb2NfU1RSKCJDcmVhdGVzIGEgdHVwbGUtdHJlZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFNULiIpfSwKKyAgICB7Il9fc2l6ZW9mX18iLCAgICAgIChQeUNGdW5jdGlvbilwYXJzZXJfc2l6ZW9mLCAgICAgTUVUSF9OT0FSR1MsCisgICAgICAgIFB5RG9jX1NUUigiUmV0dXJucyBzaXplIGluIG1lbW9yeSwgaW4gYnl0ZXMuIil9LAorICAgIHtOVUxMLCBOVUxMLCAwLCBOVUxMfQorfTsKIAogc3RhdGljCiBQeVR5cGVPYmplY3QgUHlTVF9UeXBlID0gewpAQCAtMjAwLDcgKzIyNCwxNCBAQAogICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICAgICAgICAgICAgICovCiAKICAgICAvKiBfX2RvY19fICovCi0gICAgIkludGVybWVkaWF0ZSByZXByZXNlbnRhdGlvbiBvZiBhIFB5dGhvbiBwYXJzZSB0cmVlLiIKKyAgICAiSW50ZXJtZWRpYXRlIHJlcHJlc2VudGF0aW9uIG9mIGEgUHl0aG9uIHBhcnNlIHRyZWUuIiwKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIHBhcnNlcl9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KIH07ICAvKiBQeVNUX1R5cGUgKi8KIAogCkBAIC0zMTksMTAgKzM1MCwxNCBAQAogICAgICAgICBpbnQgbGluZW5vID0gMDsKICAgICAgICAgaW50IGNvbF9vZmZzZXQgPSAwOwogICAgICAgICBpZiAobGluZV9vcHRpb24gIT0gTlVMTCkgewotICAgICAgICAgICAgbGluZW5vID0gKFB5T2JqZWN0X0lzVHJ1ZShsaW5lX29wdGlvbikgIT0gMCkgPyAxIDogMDsKKyAgICAgICAgICAgIGxpbmVubyA9IFB5T2JqZWN0X0lzVHJ1ZShsaW5lX29wdGlvbik7CisgICAgICAgICAgICBpZiAobGluZW5vIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgICAgICBpZiAoY29sX29wdGlvbiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBjb2xfb2Zmc2V0ID0gKFB5T2JqZWN0X0lzVHJ1ZShjb2xfb3B0aW9uKSAhPSAwKSA/IDEgOiAwOworICAgICAgICAgICAgY29sX29mZnNldCA9IFB5T2JqZWN0X0lzVHJ1ZShjb2xfb3B0aW9uKTsKKyAgICAgICAgICAgIGlmIChjb2xfb2Zmc2V0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgICAgICAvKgogICAgICAgICAgKiAgQ29udmVydCBTVCBpbnRvIGEgdHVwbGUgcmVwcmVzZW50YXRpb24uICBVc2UgR3VpZG8ncyBmdW5jdGlvbiwKQEAgLTM3MCwxMCArNDA1LDE0IEBACiAgICAgICAgIGludCBsaW5lbm8gPSAwOwogICAgICAgICBpbnQgY29sX29mZnNldCA9IDA7CiAgICAgICAgIGlmIChsaW5lX29wdGlvbiAhPSAwKSB7Ci0gICAgICAgICAgICBsaW5lbm8gPSBQeU9iamVjdF9Jc1RydWUobGluZV9vcHRpb24pID8gMSA6IDA7CisgICAgICAgICAgICBsaW5lbm8gPSBQeU9iamVjdF9Jc1RydWUobGluZV9vcHRpb24pOworICAgICAgICAgICAgaWYgKGxpbmVubyA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGNvbF9vcHRpb24gIT0gTlVMTCkgewotICAgICAgICAgICAgY29sX29mZnNldCA9IChQeU9iamVjdF9Jc1RydWUoY29sX29wdGlvbikgIT0gMCkgPyAxIDogMDsKKyAgICAgICAgaWYgKGNvbF9vcHRpb24gIT0gMCkgeworICAgICAgICAgICAgY29sX29mZnNldCA9IFB5T2JqZWN0X0lzVHJ1ZShjb2xfb3B0aW9uKTsKKyAgICAgICAgICAgIGlmIChjb2xfb2Zmc2V0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgICAgICAvKgogICAgICAgICAgKiAgQ29udmVydCBTVCBpbnRvIGEgdHVwbGUgcmVwcmVzZW50YXRpb24uICBVc2UgR3VpZG8ncyBmdW5jdGlvbiwKQEAgLTQ5NCwyNSArNTMzLDYgQEAKIH0KIAogCi0jZGVmaW5lIFBVQkxJQ19NRVRIT0RfVFlQRSAoTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMpCi0KLXN0YXRpYyBQeU1ldGhvZERlZgotcGFyc2VyX21ldGhvZHNbXSA9IHsKLSAgICB7ImNvbXBpbGUiLCAgICAgICAgIChQeUNGdW5jdGlvbilwYXJzZXJfY29tcGlsZXN0LCAgUFVCTElDX01FVEhPRF9UWVBFLAotICAgICAgICBQeURvY19TVFIoIkNvbXBpbGUgdGhpcyBTVCBvYmplY3QgaW50byBhIGNvZGUgb2JqZWN0LiIpfSwKLSAgICB7ImlzZXhwciIsICAgICAgICAgIChQeUNGdW5jdGlvbilwYXJzZXJfaXNleHByLCAgICAgUFVCTElDX01FVEhPRF9UWVBFLAotICAgICAgICBQeURvY19TVFIoIkRldGVybWluZXMgaWYgdGhpcyBTVCBvYmplY3Qgd2FzIGNyZWF0ZWQgZnJvbSBhbiBleHByZXNzaW9uLiIpfSwKLSAgICB7Imlzc3VpdGUiLCAgICAgICAgIChQeUNGdW5jdGlvbilwYXJzZXJfaXNzdWl0ZSwgICAgUFVCTElDX01FVEhPRF9UWVBFLAotICAgICAgICBQeURvY19TVFIoIkRldGVybWluZXMgaWYgdGhpcyBTVCBvYmplY3Qgd2FzIGNyZWF0ZWQgZnJvbSBhIHN1aXRlLiIpfSwKLSAgICB7InRvbGlzdCIsICAgICAgICAgIChQeUNGdW5jdGlvbilwYXJzZXJfc3QybGlzdCwgICAgUFVCTElDX01FVEhPRF9UWVBFLAotICAgICAgICBQeURvY19TVFIoIkNyZWF0ZXMgYSBsaXN0LXRyZWUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBTVC4iKX0sCi0gICAgeyJ0b3R1cGxlIiwgICAgICAgICAoUHlDRnVuY3Rpb24pcGFyc2VyX3N0MnR1cGxlLCAgIFBVQkxJQ19NRVRIT0RfVFlQRSwKLSAgICAgICAgUHlEb2NfU1RSKCJDcmVhdGVzIGEgdHVwbGUtdHJlZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFNULiIpfSwKLQotICAgIHtOVUxMLCBOVUxMLCAwLCBOVUxMfQotfTsKLQotCiBzdGF0aWMgUHlPYmplY3QqCiBwYXJzZXJfZ2V0YXR0cihQeU9iamVjdCAqc2VsZiwgY2hhciAqbmFtZSkKIHsKQEAgLTY3OCw3ICs2OTgsNyBAQAogICAgICAgICAgICAgZXJyX3N0cmluZygicGFyc2UgdHJlZSBkb2VzIG5vdCB1c2UgYSB2YWxpZCBzdGFydCBzeW1ib2wiKTsKICAgICAgICAgfQogICAgIH0KLSAgICAvKiAgTWFrZSBzdXJlIHdlIHRocm93IGFuIGV4Y2VwdGlvbiBvbiBhbGwgZXJyb3JzLiAgV2Ugc2hvdWxkIG5ldmVyCisgICAgLyogIE1ha2Ugc3VyZSB3ZSByYWlzZSBhbiBleGNlcHRpb24gb24gYWxsIGVycm9ycy4gIFdlIHNob3VsZCBuZXZlcgogICAgICAqICBnZXQgdGhpcywgYnV0IHdlJ2QgZG8gd2VsbCB0byBiZSBzdXJlIHNvbWV0aGluZyBpcyBkb25lLgogICAgICAqLwogICAgIGlmIChzdCA9PSBOVUxMICYmICFQeUVycl9PY2N1cnJlZCgpKQpAQCAtNjk1LDYgKzcxNSwxNSBAQAogICAgIHJldHVybiBwYXJzZXJfdHVwbGUyc3Qoc2VsZiwgYXJncywga3cpOwogfQogCitzdGF0aWMgUHlPYmplY3QgKgorcGFyc2VyX3NpemVvZihQeVNUX09iamVjdCAqc3QsIHZvaWQgKnVudXNlZCkKK3sKKyAgICBQeV9zc2l6ZV90IHJlczsKKworICAgIHJlcyA9IHNpemVvZihQeVNUX09iamVjdCkgKyBfUHlOb2RlX1NpemVPZihzdC0+c3Rfbm9kZSk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChyZXMpOworfQorCiAKIC8qICBub2RlKiBidWlsZF9ub2RlX2NoaWxkcmVuKCkKICAqCkBAIC03ODQsNyArODEzLDcgQEAKICAgICAgICAgZWxzZSBpZiAoIUlTTk9OVEVSTUlOQUwodHlwZSkpIHsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiAgSXQgaGFzIHRvIGJlIG9uZSBvciB0aGUgb3RoZXI7IHRoaXMgaXMgYW4gZXJyb3IuCi0gICAgICAgICAgICAgKiAgVGhyb3cgYW4gZXhjZXB0aW9uLgorICAgICAgICAgICAgICogIFJhaXNlIGFuIGV4Y2VwdGlvbi4KICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgUHlPYmplY3QgKmVyciA9IFB5X0J1aWxkVmFsdWUoIm9zIiwgZWxlbSwgInVua25vd24gbm9kZSB0eXBlLiIpOwogICAgICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KHBhcnNlcl9lcnJvciwgZXJyKTsKQEAgLTgzNCw3ICs4NjMsNyBAQAogICAgIGlmIChJU1RFUk1JTkFMKG51bSkpIHsKICAgICAgICAgLyoKICAgICAgICAgICogIFRoZSB0dXBsZSBpcyBzaW1wbGUsIGJ1dCBpdCBkb2Vzbid0IHN0YXJ0IHdpdGggYSBzdGFydCBzeW1ib2wuCi0gICAgICAgICAqICBUaHJvdyBhbiBleGNlcHRpb24gbm93IGFuZCBiZSBkb25lIHdpdGggaXQuCisgICAgICAgICAqICBSYWlzZSBhbiBleGNlcHRpb24gbm93IGFuZCBiZSBkb25lIHdpdGggaXQuCiAgICAgICAgICAqLwogICAgICAgICB0dXBsZSA9IFB5X0J1aWxkVmFsdWUoIm9zIiwgdHVwbGUsCiAgICAgICAgICAgICAgICAgICAgICJJbGxlZ2FsIHN5bnRheC10cmVlOyBjYW5ub3Qgc3RhcnQgd2l0aCB0ZXJtaW5hbCBzeW1ib2wuIik7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmMgYi9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmMKaW5kZXggZjI0OWUxZS4uY2Q0NjcyYyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9wb3NpeG1vZHVsZS5jCisrKyBiL01vZHVsZXMvcG9zaXhtb2R1bGUuYwpAQCAtMjcsNiArMjcsOSBAQAogCiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAjaW5jbHVkZSAic3RydWN0c2VxLmgiCisjaWZuZGVmIE1TX1dJTkRPV1MKKyNpbmNsdWRlICJwb3NpeG1vZHVsZS5oIgorI2VuZGlmCiAKICNpZiBkZWZpbmVkKF9fVk1TKQogIyAgICBpbmNsdWRlIDx1bml4aW8uaD4KQEAgLTM0Nyw5ICszNTAsMTMzIEBACiAjZW5kaWYKICNlbmRpZgogCisKKyNpZm5kZWYgTVNfV0lORE9XUworUHlPYmplY3QgKgorX1B5SW50X0Zyb21VaWQodWlkX3QgdWlkKQoreworICAgIGlmICh1aWQgPD0gTE9OR19NQVgpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh1aWQpOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh1aWQpOworfQorCitQeU9iamVjdCAqCitfUHlJbnRfRnJvbUdpZChnaWRfdCBnaWQpCit7CisgICAgaWYgKGdpZCA8PSBMT05HX01BWCkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGdpZCk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKGdpZCk7Cit9CisKK2ludAorX1B5X1VpZF9Db252ZXJ0ZXIoUHlPYmplY3QgKm9iaiwgdm9pZCAqcCkKK3sKKyAgICBpbnQgb3ZlcmZsb3c7CisgICAgbG9uZyByZXN1bHQ7CisgICAgaWYgKFB5RmxvYXRfQ2hlY2sob2JqKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXIgYXJndW1lbnQgZXhwZWN0ZWQsIGdvdCBmbG9hdCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmVzdWx0ID0gUHlMb25nX0FzTG9uZ0FuZE92ZXJmbG93KG9iaiwgJm92ZXJmbG93KTsKKyAgICBpZiAob3ZlcmZsb3cgPCAwKQorICAgICAgICBnb3RvIE92ZXJmbG93RG93bjsKKyAgICBpZiAoIW92ZXJmbG93ICYmIHJlc3VsdCA9PSAtMSkgeworICAgICAgICAvKiBlcnJvciBvciAtMSAqLworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAqKHVpZF90ICopcCA9ICh1aWRfdCktMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIHVuc2lnbmVkIHVpZF90ICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgdXJlc3VsdDsKKyAgICAgICAgaWYgKG92ZXJmbG93ID4gMCkgeworICAgICAgICAgICAgdXJlc3VsdCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyhvYmopOworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19PdmVyZmxvd0Vycm9yKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBPdmVyZmxvd1VwOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHJlc3VsdCA8IDApCisgICAgICAgICAgICAgICAgZ290byBPdmVyZmxvd0Rvd247CisgICAgICAgICAgICB1cmVzdWx0ID0gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChzaXplb2YodWlkX3QpIDwgc2l6ZW9mKGxvbmcpICYmCisgICAgICAgICAgICAodW5zaWduZWQgbG9uZykodWlkX3QpdXJlc3VsdCAhPSB1cmVzdWx0KQorICAgICAgICAgICAgZ290byBPdmVyZmxvd1VwOworICAgICAgICAqKHVpZF90ICopcCA9ICh1aWRfdCl1cmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gMTsKKworT3ZlcmZsb3dEb3duOgorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAidXNlciBpZCBpcyBsZXNzIHRoYW4gbWluaW11bSIpOworICAgIHJldHVybiAwOworCitPdmVyZmxvd1VwOgorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAidXNlciBpZCBpcyBncmVhdGVyIHRoYW4gbWF4aW11bSIpOworICAgIHJldHVybiAwOworfQorCitpbnQKK19QeV9HaWRfQ29udmVydGVyKFB5T2JqZWN0ICpvYmosIHZvaWQgKnApCit7CisgICAgaW50IG92ZXJmbG93OworICAgIGxvbmcgcmVzdWx0OworICAgIGlmIChQeUZsb2F0X0NoZWNrKG9iaikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlZ2VyIGFyZ3VtZW50IGV4cGVjdGVkLCBnb3QgZmxvYXQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJlc3VsdCA9IFB5TG9uZ19Bc0xvbmdBbmRPdmVyZmxvdyhvYmosICZvdmVyZmxvdyk7CisgICAgaWYgKG92ZXJmbG93IDwgMCkKKyAgICAgICAgZ290byBPdmVyZmxvd0Rvd247CisgICAgaWYgKCFvdmVyZmxvdyAmJiByZXN1bHQgPT0gLTEpIHsKKyAgICAgICAgLyogZXJyb3Igb3IgLTEgKi8KKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgKihnaWRfdCAqKXAgPSAoZ2lkX3QpLTE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiB1bnNpZ25lZCBnaWRfdCAqLworICAgICAgICB1bnNpZ25lZCBsb25nIHVyZXN1bHQ7CisgICAgICAgIGlmIChvdmVyZmxvdyA+IDApIHsKKyAgICAgICAgICAgIHVyZXN1bHQgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcob2JqKTsKKyAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfT3ZlcmZsb3dFcnJvcikpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gT3ZlcmZsb3dVcDsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gT3ZlcmZsb3dEb3duOworICAgICAgICAgICAgdXJlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZW9mKGdpZF90KSA8IHNpemVvZihsb25nKSAmJgorICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKGdpZF90KXVyZXN1bHQgIT0gdXJlc3VsdCkKKyAgICAgICAgICAgIGdvdG8gT3ZlcmZsb3dVcDsKKyAgICAgICAgKihnaWRfdCAqKXAgPSAoZ2lkX3QpdXJlc3VsdDsKKyAgICB9CisgICAgcmV0dXJuIDE7CisKK092ZXJmbG93RG93bjoKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImdyb3VwIGlkIGlzIGxlc3MgdGhhbiBtaW5pbXVtIik7CisgICAgcmV0dXJuIDA7CisKK092ZXJmbG93VXA6CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJncm91cCBpZCBpcyBncmVhdGVyIHRoYW4gbWF4aW11bSIpOworICAgIHJldHVybiAwOworfQorI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KKworCiAjaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA+PSAxNDAwCiAvKiBNaWNyb3NvZnQgQ1JUIGluIFZTMjAwNSBhbmQgaGlnaGVyIHdpbGwgdmVyaWZ5IHRoYXQgYSBmaWxlaGFuZGxlIGlzCi0gKiB2YWxpZCBhbmQgdGhyb3cgYW4gYXNzZXJ0aW9uIGlmIGl0IGlzbid0LgorICogdmFsaWQgYW5kIHJhaXNlIGFuIGFzc2VydGlvbiBpZiBpdCBpc24ndC4KICAqIE5vcm1hbGx5LCBhbiBpbnZhbGlkIGZkIGlzIGxpa2VseSB0byBiZSBhIEMgcHJvZ3JhbSBlcnJvciBhbmQgdGhlcmVmb3JlCiAgKiBhbiBhc3NlcnRpb24gY2FuIGJlIHVzZWZ1bCwgYnV0IGl0IGRvZXMgY29udHJhZGljdCB0aGUgUE9TSVggc3RhbmRhcmQKICAqIHdoaWNoIGZvciB3cml0ZSgyKSBzdGF0ZXM6CkBAIC00NDEsOSArNTY4LDEwIEBACiAjZW5kaWYKIAogLyogUmV0dXJuIGEgZGljdGlvbmFyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBQT1NJWCBlbnZpcm9ubWVudCB0YWJsZSAqLwotI2lmZGVmIFdJVEhfTkVYVF9GUkFNRVdPUksKKyNpZiBkZWZpbmVkKFdJVEhfTkVYVF9GUkFNRVdPUkspIHx8IChkZWZpbmVkKF9fQVBQTEVfXykgJiYgZGVmaW5lZChQeV9FTkFCTEVfU0hBUkVEKSkKIC8qIE9uIERhcndpbi9NYWNPU1ggYSBzaGFyZWQgbGlicmFyeSBvciBmcmFtZXdvcmsgaGFzIG5vIGFjY2VzcyB0bwotKiogZW52aXJvbiBkaXJlY3RseSwgd2UgbXVzdCBvYnRhaW4gaXQgd2l0aCBfTlNHZXRFbnZpcm9uKCkuCisqKiBlbnZpcm9uIGRpcmVjdGx5LCB3ZSBtdXN0IG9idGFpbiBpdCB3aXRoIF9OU0dldEVudmlyb24oKS4gU2VlIGFsc28KKyoqIG1hbiBlbnZpcm9uKDcpLgogKi8KICNpbmNsdWRlIDxjcnRfZXh0ZXJucy5oPgogc3RhdGljIGNoYXIgKiplbnZpcm9uOwpAQCAtNDYzLDcgKzU5MSw3IEBACiAgICAgZCA9IFB5RGljdF9OZXcoKTsKICAgICBpZiAoZCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSNpZmRlZiBXSVRIX05FWFRfRlJBTUVXT1JLCisjaWYgZGVmaW5lZChXSVRIX05FWFRfRlJBTUVXT1JLKSB8fCAoZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoUHlfRU5BQkxFX1NIQVJFRCkpCiAgICAgaWYgKGVudmlyb24gPT0gTlVMTCkKICAgICAgICAgZW52aXJvbiA9ICpfTlNHZXRFbnZpcm9uKCk7CiAjZW5kaWYKQEAgLTEzMDUsOCArMTQzMywxMyBAQAogICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgMiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpc3QtPnN0X2RldikpOwogI2VuZGlmCiAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCAzLCBQeUludF9Gcm9tTG9uZygobG9uZylzdC0+c3RfbmxpbmspKTsKLSAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDQsIFB5SW50X0Zyb21Mb25nKChsb25nKXN0LT5zdF91aWQpKTsKLSAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDUsIFB5SW50X0Zyb21Mb25nKChsb25nKXN0LT5zdF9naWQpKTsKKyNpZiBkZWZpbmVkKE1TX1dJTkRPV1MpCisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCA0LCBQeUludF9Gcm9tTG9uZygwKSk7CisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCA1LCBQeUludF9Gcm9tTG9uZygwKSk7CisjZWxzZQorICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgNCwgX1B5SW50X0Zyb21VaWQoc3QtPnN0X3VpZCkpOworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgNSwgX1B5SW50X0Zyb21HaWQoc3QtPnN0X2dpZCkpOworI2VuZGlmCiAjaWZkZWYgSEFWRV9MQVJHRUZJTEVfU1VQUE9SVAogICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKFBZX0xPTkdfTE9ORylzdC0+c3Rfc2l6ZSkpOwpAQCAtMTg4MywxNCArMjAxNiwxNiBAQAogcG9zaXhfY2hvd24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogICAgIGNoYXIgKnBhdGggPSBOVUxMOwotICAgIGxvbmcgdWlkLCBnaWQ7CisgICAgdWlkX3QgdWlkOworICAgIGdpZF90IGdpZDsKICAgICBpbnQgcmVzOwotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZXRsbDpjaG93biIsCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJldE8mTyY6Y2hvd24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nLCAmcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpZCwgJmdpZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9VaWRfQ29udmVydGVyLCAmdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlfR2lkX0NvbnZlcnRlciwgJmdpZCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLSAgICByZXMgPSBjaG93bihwYXRoLCAodWlkX3QpIHVpZCwgKGdpZF90KSBnaWQpOworICAgIHJlcyA9IGNob3duKHBhdGgsIHVpZCwgZ2lkKTsKICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogICAgIGlmIChyZXMgPCAwKQogICAgICAgICByZXR1cm4gcG9zaXhfZXJyb3Jfd2l0aF9hbGxvY2F0ZWRfZmlsZW5hbWUocGF0aCk7CkBAIC0xOTEwLDEyICsyMDQ1LDE1IEBACiBwb3NpeF9mY2hvd24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogICAgIGludCBmZDsKLSAgICBsb25nIHVpZCwgZ2lkOworICAgIHVpZF90IHVpZDsKKyAgICBnaWRfdCBnaWQ7CiAgICAgaW50IHJlczsKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlsbDpjaG93biIsICZmZCwgJnVpZCwgJmdpZCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTyZPJjpmY2hvd24iLCAmZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9VaWRfQ29udmVydGVyLCAmdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlfR2lkX0NvbnZlcnRlciwgJmdpZCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLSAgICByZXMgPSBmY2hvd24oZmQsICh1aWRfdCkgdWlkLCAoZ2lkX3QpIGdpZCk7CisgICAgcmVzID0gZmNob3duKGZkLCB1aWQsIGdpZCk7CiAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICAgICBpZiAocmVzIDwgMCkKICAgICAgICAgcmV0dXJuIHBvc2l4X2Vycm9yKCk7CkBAIC0xOTMzLDE0ICsyMDcxLDE2IEBACiBwb3NpeF9sY2hvd24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogICAgIGNoYXIgKnBhdGggPSBOVUxMOwotICAgIGxvbmcgdWlkLCBnaWQ7CisgICAgdWlkX3QgdWlkOworICAgIGdpZF90IGdpZDsKICAgICBpbnQgcmVzOwotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZXRsbDpsY2hvd24iLAorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZXRPJk8mOmxjaG93biIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcsICZwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlkLCAmZ2lkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5X1VpZF9Db252ZXJ0ZXIsICZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9HaWRfQ29udmVydGVyLCAmZ2lkKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotICAgIHJlcyA9IGxjaG93bihwYXRoLCAodWlkX3QpIHVpZCwgKGdpZF90KSBnaWQpOworICAgIHJlcyA9IGxjaG93bihwYXRoLCB1aWQsIGdpZCk7CiAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICAgICBpZiAocmVzIDwgMCkKICAgICAgICAgcmV0dXJuIHBvc2l4X2Vycm9yX3dpdGhfYWxsb2NhdGVkX2ZpbGVuYW1lKHBhdGgpOwpAQCAtMTk1Niw3ICsyMDk2LDkgQEAKICJnZXRjd2QoKSAtPiBwYXRoXG5cblwKIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuIik7CiAKLSNpZiAoZGVmaW5lZChfX3N1bikgJiYgZGVmaW5lZChfX1NWUjQpKSB8fCBkZWZpbmVkKF9fT3BlbkJTRF9fKQorI2lmIChkZWZpbmVkKF9fc3VuKSAmJiBkZWZpbmVkKF9fU1ZSNCkpIHx8IFwKKyAgICAgZGVmaW5lZChfX09wZW5CU0RfXykgICAgICAgICAgICAgICB8fCBcCisgICAgIGRlZmluZWQoX19OZXRCU0RfXykKIC8qIElzc3VlIDkxODU6IGdldGN3ZCgpIHJldHVybnMgTlVMTC9FUkFOR0UgaW5kZWZpbml0ZWx5LiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIHBvc2l4X2dldGN3ZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJncykKQEAgLTM4NDEsNyArMzk4Myw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcG9zaXhfZ2V0ZWdpZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJncykKIHsKLSAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpZ2V0ZWdpZCgpKTsKKyAgICByZXR1cm4gX1B5SW50X0Zyb21HaWQoZ2V0ZWdpZCgpKTsKIH0KICNlbmRpZgogCkBAIC0zODU0LDcgKzM5OTYsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHBvc2l4X2dldGV1aWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpub2FyZ3MpCiB7Ci0gICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWdldGV1aWQoKSk7CisgICAgcmV0dXJuIF9QeUludF9Gcm9tVWlkKGdldGV1aWQoKSk7CiB9CiAjZW5kaWYKIApAQCAtMzg2Nyw3ICs0MDA5LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBwb3NpeF9nZXRnaWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpub2FyZ3MpCiB7Ci0gICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWdldGdpZCgpKTsKKyAgICByZXR1cm4gX1B5SW50X0Zyb21HaWQoZ2V0Z2lkKCkpOwogfQogI2VuZGlmCiAKQEAgLTM5MTIsNiArNDA1NCwzNCBAQAogICAgIGdpZF90KiBhbHRfZ3JvdXBsaXN0ID0gZ3JvdXBsaXN0OwogICAgIGludCBuOwogCisjaWZkZWYgX19BUFBMRV9fCisgICAgLyogSXNzdWUgIzE3NTU3OiBBcyBvZiBPUyBYIDEwLjgsIGdldGdyb3VwcygyKSBubyBsb25nZXIgcmFpc2VzIEVJTlZBTCBpZgorICAgICAqIHRoZXJlIGFyZSBtb3JlIGdyb3VwcyB0aGFuIGNhbiBmaXQgaW4gZ3JvdXBsaXN0LiAgVGhlcmVmb3JlLCBvbiBPUyBYCisgICAgICogYWx3YXlzIGZpcnN0IGNhbGwgZ2V0Z3JvdXBzIHdpdGggbGVuZ3RoIDAgdG8gZ2V0IHRoZSBhY3R1YWwgbnVtYmVyCisgICAgICogb2YgZ3JvdXBzLgorICAgICAqLworICAgIG4gPSBnZXRncm91cHMoMCwgTlVMTCk7CisgICAgaWYgKG4gPCAwKSB7CisgICAgICAgIHJldHVybiBwb3NpeF9lcnJvcigpOworICAgIH0gZWxzZSBpZiAobiA8PSBNQVhfR1JPVVBTKSB7CisgICAgICAgIC8qIGdyb3VwcyB3aWxsIGZpdCBpbiBleGlzdGluZyBhcnJheSAqLworICAgICAgICBhbHRfZ3JvdXBsaXN0ID0gZ3JvdXBsaXN0OworICAgIH0gZWxzZSB7CisgICAgICAgIGFsdF9ncm91cGxpc3QgPSBQeU1lbV9NYWxsb2MobiAqIHNpemVvZihnaWRfdCkpOworICAgICAgICBpZiAoYWx0X2dyb3VwbGlzdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgICAgICAgIHJldHVybiBwb3NpeF9lcnJvcigpOworICAgICAgICB9CisgICAgfQorCisgICAgbiA9IGdldGdyb3VwcyhuLCBhbHRfZ3JvdXBsaXN0KTsKKyAgICBpZiAobiA9PSAtMSkgeworICAgICAgICBpZiAoYWx0X2dyb3VwbGlzdCAhPSBncm91cGxpc3QpIHsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUoYWx0X2dyb3VwbGlzdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBvc2l4X2Vycm9yKCk7CisgICAgfQorI2Vsc2UKICAgICBuID0gZ2V0Z3JvdXBzKE1BWF9HUk9VUFMsIGdyb3VwbGlzdCk7CiAgICAgaWYgKG4gPCAwKSB7CiAgICAgICAgIGlmIChlcnJubyA9PSBFSU5WQUwpIHsKQEAgLTM5MzgsMTEgKzQxMDgsMTMgQEAKICAgICAgICAgICAgIHJldHVybiBwb3NpeF9lcnJvcigpOwogICAgICAgICB9CiAgICAgfQorI2VuZGlmCisKICAgICByZXN1bHQgPSBQeUxpc3RfTmV3KG4pOwogICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgewogICAgICAgICBpbnQgaTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICAgICAgUHlPYmplY3QgKm8gPSBQeUludF9Gcm9tTG9uZygobG9uZylhbHRfZ3JvdXBsaXN0W2ldKTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpvID0gX1B5SW50X0Zyb21HaWQoYWx0X2dyb3VwbGlzdFtpXSk7CiAgICAgICAgICAgICBpZiAobyA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gTlVMTDsKQEAgLTM5NzEsMTIgKzQxNDMsMjIgQEAKIHBvc2l4X2luaXRncm91cHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogICAgIGNoYXIgKnVzZXJuYW1lOwotICAgIGxvbmcgZ2lkOworI2lmZGVmIF9fQVBQTEVfXworICAgIGludCBnaWQ7CisjZWxzZQorICAgIGdpZF90IGdpZDsKKyNlbmRpZgogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzbDppbml0Z3JvdXBzIiwgJnVzZXJuYW1lLCAmZ2lkKSkKKyNpZmRlZiBfX0FQUExFX18KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNpOmluaXRncm91cHMiLCAmdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZnaWQpKQorI2Vsc2UKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNPJjppbml0Z3JvdXBzIiwgJnVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlfR2lkX0NvbnZlcnRlciwgJmdpZCkpCisjZW5kaWYKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBpZiAoaW5pdGdyb3Vwcyh1c2VybmFtZSwgKGdpZF90KSBnaWQpID09IC0xKQorICAgIGlmIChpbml0Z3JvdXBzKHVzZXJuYW1lLCBnaWQpID09IC0xKQogICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOwogCiAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwpAQCAtNDA5MCw3ICs0MjcyLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBwb3NpeF9nZXR1aWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpub2FyZ3MpCiB7Ci0gICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWdldHVpZCgpKTsKKyAgICByZXR1cm4gX1B5SW50X0Zyb21VaWQoZ2V0dWlkKCkpOwogfQogI2VuZGlmCiAKQEAgLTQyMjYsNiArNDQwOCw3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgYXR0cmlidXRlcyA9IEdldEZpbGVBdHRyaWJ1dGVzQShwYXRoKTsKKyAgICBQeU1lbV9GcmVlKHBhdGgpOwogICAgIGlmIChhdHRyaWJ1dGVzID09IElOVkFMSURfRklMRV9BVFRSSUJVVEVTKQogICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CiAKQEAgLTU3MzYsMTUgKzU5MTksOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHBvc2l4X3NldHVpZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgbG9uZyB1aWRfYXJnOwogICAgIHVpZF90IHVpZDsKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw6c2V0dWlkIiwgJnVpZF9hcmcpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyY6c2V0dWlkIiwgX1B5X1VpZF9Db252ZXJ0ZXIsICZ1aWQpKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB1aWQgPSB1aWRfYXJnOwotICAgIGlmICh1aWQgIT0gdWlkX2FyZykgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInVzZXIgaWQgdG9vIGJpZyIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAgICAgaWYgKHNldHVpZCh1aWQpIDwgMCkKICAgICAgICAgcmV0dXJuIHBvc2l4X2Vycm9yKCk7CiAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwpAQCAtNTc2MSwxNSArNTkzOCw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcG9zaXhfc2V0ZXVpZCAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIGxvbmcgZXVpZF9hcmc7CiAgICAgdWlkX3QgZXVpZDsKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmZXVpZF9hcmcpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyY6c2V0ZXVpZCIsIF9QeV9VaWRfQ29udmVydGVyLCAmZXVpZCkpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGV1aWQgPSBldWlkX2FyZzsKLSAgICBpZiAoZXVpZCAhPSBldWlkX2FyZykgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInVzZXIgaWQgdG9vIGJpZyIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAgICAgaWYgKHNldGV1aWQoZXVpZCkgPCAwKSB7CiAgICAgICAgIHJldHVybiBwb3NpeF9lcnJvcigpOwogICAgIH0gZWxzZSB7CkBAIC01Nzg3LDE1ICs1OTU4LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBwb3NpeF9zZXRlZ2lkIChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgbG9uZyBlZ2lkX2FyZzsKICAgICBnaWRfdCBlZ2lkOwotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZlZ2lkX2FyZykpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJjpzZXRlZ2lkIiwgX1B5X0dpZF9Db252ZXJ0ZXIsICZlZ2lkKSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgZWdpZCA9IGVnaWRfYXJnOwotICAgIGlmIChlZ2lkICE9IGVnaWRfYXJnKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAiZ3JvdXAgaWQgdG9vIGJpZyIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAgICAgaWYgKHNldGVnaWQoZWdpZCkgPCAwKSB7CiAgICAgICAgIHJldHVybiBwb3NpeF9lcnJvcigpOwogICAgIH0gZWxzZSB7CkBAIC01ODEzLDIzICs1OTc4LDExIEBACiBzdGF0aWMgUHlPYmplY3QgKgogcG9zaXhfc2V0cmV1aWQgKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBsb25nIHJ1aWRfYXJnLCBldWlkX2FyZzsKICAgICB1aWRfdCBydWlkLCBldWlkOwotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGwiLCAmcnVpZF9hcmcsICZldWlkX2FyZykpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mOnNldHJldWlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5X1VpZF9Db252ZXJ0ZXIsICZydWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlfVWlkX0NvbnZlcnRlciwgJmV1aWQpKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAocnVpZF9hcmcgPT0gLTEpCi0gICAgICAgIHJ1aWQgPSAodWlkX3QpLTE7ICAvKiBsZXQgdGhlIGNvbXBpbGVyIGNob29zZSBob3cgLTEgZml0cyAqLwotICAgIGVsc2UKLSAgICAgICAgcnVpZCA9IHJ1aWRfYXJnOyAgLyogb3RoZXJ3aXNlLCBhc3NpZ24gZnJvbSBvdXIgbG9uZyAqLwotICAgIGlmIChldWlkX2FyZyA9PSAtMSkKLSAgICAgICAgZXVpZCA9ICh1aWRfdCktMTsKLSAgICBlbHNlCi0gICAgICAgIGV1aWQgPSBldWlkX2FyZzsKLSAgICBpZiAoKGV1aWRfYXJnICE9IC0xICYmIGV1aWQgIT0gZXVpZF9hcmcpIHx8Ci0gICAgICAgIChydWlkX2FyZyAhPSAtMSAmJiBydWlkICE9IHJ1aWRfYXJnKSkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInVzZXIgaWQgdG9vIGJpZyIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAgICAgaWYgKHNldHJldWlkKHJ1aWQsIGV1aWQpIDwgMCkgewogICAgICAgICByZXR1cm4gcG9zaXhfZXJyb3IoKTsKICAgICB9IGVsc2UgewpAQCAtNTg0NywyMyArNjAwMCwxMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHBvc2l4X3NldHJlZ2lkIChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgbG9uZyByZ2lkX2FyZywgZWdpZF9hcmc7CiAgICAgZ2lkX3QgcmdpZCwgZWdpZDsKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxsIiwgJnJnaWRfYXJnLCAmZWdpZF9hcmcpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZPJjpzZXRyZWdpZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9HaWRfQ29udmVydGVyLCAmcmdpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5X0dpZF9Db252ZXJ0ZXIsICZlZ2lkKSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKHJnaWRfYXJnID09IC0xKQotICAgICAgICByZ2lkID0gKGdpZF90KS0xOyAgLyogbGV0IHRoZSBjb21waWxlciBjaG9vc2UgaG93IC0xIGZpdHMgKi8KLSAgICBlbHNlCi0gICAgICAgIHJnaWQgPSByZ2lkX2FyZzsgIC8qIG90aGVyd2lzZSwgYXNzaWduIGZyb20gb3VyIGxvbmcgKi8KLSAgICBpZiAoZWdpZF9hcmcgPT0gLTEpCi0gICAgICAgIGVnaWQgPSAoZ2lkX3QpLTE7Ci0gICAgZWxzZQotICAgICAgICBlZ2lkID0gZWdpZF9hcmc7Ci0gICAgaWYgKChlZ2lkX2FyZyAhPSAtMSAmJiBlZ2lkICE9IGVnaWRfYXJnKSB8fAotICAgICAgICAocmdpZF9hcmcgIT0gLTEgJiYgcmdpZCAhPSByZ2lkX2FyZykpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJncm91cCBpZCB0b28gYmlnIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KICAgICBpZiAoc2V0cmVnaWQocmdpZCwgZWdpZCkgPCAwKSB7CiAgICAgICAgIHJldHVybiBwb3NpeF9lcnJvcigpOwogICAgIH0gZWxzZSB7CkBAIC01ODgxLDE1ICs2MDIyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBwb3NpeF9zZXRnaWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIGxvbmcgZ2lkX2FyZzsKICAgICBnaWRfdCBnaWQ7Ci0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOnNldGdpZCIsICZnaWRfYXJnKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mOnNldGdpZCIsIF9QeV9HaWRfQ29udmVydGVyLCAmZ2lkKSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgZ2lkID0gZ2lkX2FyZzsKLSAgICBpZiAoZ2lkICE9IGdpZF9hcmcpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJncm91cCBpZCB0b28gYmlnIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KICAgICBpZiAoc2V0Z2lkKGdpZCkgPCAwKQogICAgICAgICByZXR1cm4gcG9zaXhfZXJyb3IoKTsKICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CkBAIC01OTIyLDM1ICs2MDU3LDEzIEBACiAgICAgICAgIGVsZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0oZ3JvdXBzLCBpKTsKICAgICAgICAgaWYgKCFlbGVtKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGlmICghUHlJbnRfQ2hlY2soZWxlbSkpIHsKLSAgICAgICAgICAgIGlmICghUHlMb25nX0NoZWNrKGVsZW0pKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyb3VwcyBtdXN0IGJlIGludGVnZXJzIik7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHggPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcoZWxlbSk7Ci0gICAgICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncm91cCBpZCB0b28gYmlnIik7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGdyb3VwbGlzdFtpXSA9IHg7Ci0gICAgICAgICAgICAgICAgLyogcmVhZCBiYWNrIHRvIHNlZSBpZiBpdCBmaXRzIGluIGdpZF90ICovCi0gICAgICAgICAgICAgICAgaWYgKGdyb3VwbGlzdFtpXSAhPSB4KSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3JvdXAgaWQgdG9vIGJpZyIpOwotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKCFQeUludF9DaGVjayhlbGVtKSAmJiAhUHlMb25nX0NoZWNrKGVsZW0pKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncm91cHMgbXVzdCBiZSBpbnRlZ2VycyIpOworICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsb25nIHggID0gUHlJbnRfQXNMb25nKGVsZW0pOwotICAgICAgICAgICAgZ3JvdXBsaXN0W2ldID0geDsKLSAgICAgICAgICAgIGlmIChncm91cGxpc3RbaV0gIT0geCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncm91cCBpZCB0b28gYmlnIik7CisgICAgICAgICAgICBpZiAoIV9QeV9HaWRfQ29udmVydGVyKGVsZW0sICZncm91cGxpc3RbaV0pKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQpAQCAtNjQ2OCw4ICs2NTgxLDEyIEBACiAiY2xvc2UoZmQpXG5cblwKIENsb3NlIGEgZmlsZSBkZXNjcmlwdG9yIChmb3IgbG93IGxldmVsIElPKS4iKTsKIAorLyoKK1RoZSB1bmRlcnNjb3JlIGF0IGVuZCBvZiBmdW5jdGlvbiBuYW1lIGF2b2lkcyBhIG5hbWUgY2xhc2ggd2l0aCB0aGUgbGliYworZnVuY3Rpb24gcG9zaXhfY2xvc2UuCisqLwogc3RhdGljIFB5T2JqZWN0ICoKLXBvc2l4X2Nsb3NlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3Bvc2l4X2Nsb3NlXyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgaW50IGZkLCByZXM7CiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOmNsb3NlIiwgJmZkKSkKQEAgLTY1NTAsNyArNjY2Nyw4IEBACiAKIFB5RG9jX1NUUlZBUihwb3NpeF9sc2Vla19fZG9jX18sCiAibHNlZWsoZmQsIHBvcywgaG93KSAtPiBuZXdwb3NcblxuXAotU2V0IHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIGEgZmlsZSBkZXNjcmlwdG9yLiIpOworU2V0IHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIGEgZmlsZSBkZXNjcmlwdG9yLlxuXAorUmV0dXJuIHRoZSBuZXcgY3Vyc29yIHBvc2l0aW9uIGluIGJ5dGVzLCBzdGFydGluZyBmcm9tIHRoZSBiZWdpbm5pbmcuIik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBwb3NpeF9sc2VlayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCkBAIC02NzMxLDggKzY4NDksMzUgQEAKICAgICAgICAgUHlNZW1fRlJFRShtb2RlKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGlmICghX1B5VmVyaWZ5X2ZkKGZkKSkKKyAgICBpZiAoIV9QeVZlcmlmeV9mZChmZCkpIHsKKyAgICAgICAgUHlNZW1fRlJFRShtb2RlKTsKICAgICAgICAgcmV0dXJuIHBvc2l4X2Vycm9yKCk7CisgICAgfQorI2lmIGRlZmluZWQoSEFWRV9GU1RBVCkgJiYgZGVmaW5lZChTX0lGRElSKSAmJiBkZWZpbmVkKEVJU0RJUikKKyAgICB7CisgICAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICAgICAgY29uc3QgY2hhciAqbXNnOworICAgICAgICBQeU9iamVjdCAqZXhjOworICAgICAgICBpZiAoZnN0YXQoZmQsICZidWYpID09IDAgJiYgU19JU0RJUihidWYuc3RfbW9kZSkpIHsKKyAgICAgICAgICAgIFB5TWVtX0ZSRUUobW9kZSk7CisgICAgICAgICAgICBtc2cgPSBzdHJlcnJvcihFSVNESVIpOworICAgICAgICAgICAgZXhjID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKFB5RXhjX0lPRXJyb3IsICIoaXNPKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUlTRElSLCBtc2csICI8ZmRvcGVuPiIpOworICAgICAgICAgICAgaWYgKGV4YykgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y19JT0Vycm9yLCBleGMpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihleGMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICAvKiBUaGUgZHVtbXkgZmlsZW5hbWUgdXNlZCBoZXJlIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIHZhbHVlCisgICAgICAgdGVzdGVkIGFnYWluc3QgaW4gZ3ppcC5HemlwRmlsZS5fX2luaXRfXygpIC0gc2VlIGlzc3VlICMxMzc4MS4gKi8KKyAgICBmID0gUHlGaWxlX0Zyb21GaWxlKE5VTEwsICI8ZmRvcGVuPiIsIG9yZ21vZGUsIGZjbG9zZSk7CisgICAgaWYgKGYgPT0gTlVMTCkgeworICAgICAgICBQeU1lbV9GUkVFKG1vZGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogI2lmICFkZWZpbmVkKE1TX1dJTkRPV1MpICYmIGRlZmluZWQoSEFWRV9GQ05UTF9IKQogICAgIGlmIChtb2RlWzBdID09ICdhJykgewpAQCAtNjc1NSw5ICs2OTAwLDkgQEAKICAgICBQeU1lbV9GUkVFKG1vZGUpOwogICAgIGlmIChmcCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gcG9zaXhfZXJyb3IoKTsKLSAgICBmID0gUHlGaWxlX0Zyb21GaWxlKGZwLCAiPGZkb3Blbj4iLCBvcmdtb2RlLCBmY2xvc2UpOwotICAgIGlmIChmICE9IE5VTEwpCi0gICAgICAgIFB5RmlsZV9TZXRCdWZTaXplKGYsIGJ1ZnNpemUpOworICAgIC8qIFdlIG5vdyBrbm93IHdlIHdpbGwgc3VjY2VlZCwgc28gaW5pdGlhbGl6ZSB0aGUgZmlsZSBvYmplY3QuICovCisgICAgKChQeUZpbGVPYmplY3QgKilmKS0+Zl9mcCA9IGZwOworICAgIFB5RmlsZV9TZXRCdWZTaXplKGYsIGJ1ZnNpemUpOwogICAgIHJldHVybiBmOwogfQogCkBAIC04NTM2LDExNyArODY4MSwzNSBAQAogfQogI2VuZGlmCiAKLSNpZmRlZiBNU19XSU5ET1dTCi0KLVB5RG9jX1NUUlZBUih3aW4zMl91cmFuZG9tX19kb2NfXywKK1B5RG9jX1NUUlZBUihwb3NpeF91cmFuZG9tX19kb2NfXywKICJ1cmFuZG9tKG4pIC0+IHN0clxuXG5cCi1SZXR1cm4gYSBzdHJpbmcgb2YgbiByYW5kb20gYnl0ZXMgc3VpdGFibGUgZm9yIGNyeXB0b2dyYXBoaWMgdXNlLiIpOworUmV0dXJuIG4gcmFuZG9tIGJ5dGVzIHN1aXRhYmxlIGZvciBjcnlwdG9ncmFwaGljIHVzZS4iKTsKIAotdHlwZWRlZiBCT09MIChXSU5BUEkgKkNSWVBUQUNRVUlSRUNPTlRFWFRBKShIQ1JZUFRQUk9WICpwaFByb3YsXAotICAgICAgICAgICAgICBMUENTVFIgcHN6Q29udGFpbmVyLCBMUENTVFIgcHN6UHJvdmlkZXIsIERXT1JEIGR3UHJvdlR5cGUsXAotICAgICAgICAgICAgICBEV09SRCBkd0ZsYWdzICk7Ci10eXBlZGVmIEJPT0wgKFdJTkFQSSAqQ1JZUFRHRU5SQU5ET00pKEhDUllQVFBST1YgaFByb3YsIERXT1JEIGR3TGVuLFwKLSAgICAgICAgICAgICAgQllURSAqcGJCdWZmZXIgKTsKLQotc3RhdGljIENSWVBUR0VOUkFORE9NIHBDcnlwdEdlblJhbmRvbSA9IE5VTEw7Ci0vKiBUaGlzIGhhbmRsZSBpcyBuZXZlciBleHBsaWNpdGx5IHJlbGVhc2VkLiBJbnN0ZWFkLCB0aGUgb3BlcmF0aW5nCi0gICBzeXN0ZW0gd2lsbCByZWxlYXNlIGl0IHdoZW4gdGhlIHByb2Nlc3MgdGVybWluYXRlcy4gKi8KLXN0YXRpYyBIQ1JZUFRQUk9WIGhDcnlwdFByb3YgPSAwOwotCi1zdGF0aWMgUHlPYmplY3QqCi13aW4zMl91cmFuZG9tKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3N0YXRpYyBQeU9iamVjdCAqCitwb3NpeF91cmFuZG9tKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBpbnQgaG93TWFueTsKLSAgICBQeU9iamVjdCogcmVzdWx0OworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIGludCByZXQ7CiAKLSAgICAvKiBSZWFkIGFyZ3VtZW50cyAqLwotICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6dXJhbmRvbSIsICZob3dNYW55KSkKKyAgICAgLyogUmVhZCBhcmd1bWVudHMgKi8KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm46dXJhbmRvbSIsICZzaXplKSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKGhvd01hbnkgPCAwKQorICAgIGlmIChzaXplIDwgMCkKICAgICAgICAgcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWdhdGl2ZSBhcmd1bWVudCBub3QgYWxsb3dlZCIpOworICAgIHJlc3VsdCA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2l6ZSk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIGlmIChoQ3J5cHRQcm92ID09IDApIHsKLSAgICAgICAgSElOU1RBTkNFIGhBZHZBUEkzMiA9IE5VTEw7Ci0gICAgICAgIENSWVBUQUNRVUlSRUNPTlRFWFRBIHBDcnlwdEFjcXVpcmVDb250ZXh0ID0gTlVMTDsKLQotICAgICAgICAvKiBPYnRhaW4gaGFuZGxlIHRvIHRoZSBETEwgY29udGFpbmluZyBDcnlwdG9BUEkKLSAgICAgICAgICAgVGhpcyBzaG91bGQgbm90IGZhaWwgICAgICAgICAqLwotICAgICAgICBoQWR2QVBJMzIgPSBHZXRNb2R1bGVIYW5kbGUoImFkdmFwaTMyLmRsbCIpOwotICAgICAgICBpZihoQWR2QVBJMzIgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiB3aW4zMl9lcnJvcigiR2V0TW9kdWxlSGFuZGxlIiwgTlVMTCk7Ci0KLSAgICAgICAgLyogT2J0YWluIHBvaW50ZXJzIHRvIHRoZSBDcnlwdG9BUEkgZnVuY3Rpb25zCi0gICAgICAgICAgIFRoaXMgd2lsbCBmYWlsIG9uIHNvbWUgZWFybHkgdmVyc2lvbnMgb2YgV2luOTUgKi8KLSAgICAgICAgcENyeXB0QWNxdWlyZUNvbnRleHQgPSAoQ1JZUFRBQ1FVSVJFQ09OVEVYVEEpR2V0UHJvY0FkZHJlc3MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFkdkFQSTMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDcnlwdEFjcXVpcmVDb250ZXh0QSIpOwotICAgICAgICBpZiAocENyeXB0QWNxdWlyZUNvbnRleHQgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyeXB0QWNxdWlyZUNvbnRleHRBIG5vdCBmb3VuZCIpOwotCi0gICAgICAgIHBDcnlwdEdlblJhbmRvbSA9IChDUllQVEdFTlJBTkRPTSlHZXRQcm9jQWRkcmVzcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWR2QVBJMzIsICJDcnlwdEdlblJhbmRvbSIpOwotICAgICAgICBpZiAocENyeXB0R2VuUmFuZG9tID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gUHlFcnJfRm9ybWF0KFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDcnlwdEdlblJhbmRvbSBub3QgZm91bmQiKTsKLQotICAgICAgICAvKiBBY3F1aXJlIGNvbnRleHQgKi8KLSAgICAgICAgaWYgKCEgcENyeXB0QWNxdWlyZUNvbnRleHQoJmhDcnlwdFByb3YsIE5VTEwsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1ZfUlNBX0ZVTEwsIENSWVBUX1ZFUklGWUNPTlRFWFQpKQotICAgICAgICAgICAgcmV0dXJuIHdpbjMyX2Vycm9yKCJDcnlwdEFjcXVpcmVDb250ZXh0IiwgTlVMTCk7Ci0gICAgfQotCi0gICAgLyogQWxsb2NhdGUgYnl0ZXMgKi8KLSAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBob3dNYW55KTsKLSAgICBpZiAocmVzdWx0ICE9IE5VTEwpIHsKLSAgICAgICAgLyogR2V0IHJhbmRvbSBkYXRhICovCi0gICAgICAgIG1lbXNldChQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KSwgMCwgaG93TWFueSk7IC8qIHplcm8gc2VlZCAqLwotICAgICAgICBpZiAoISBwQ3J5cHRHZW5SYW5kb20oaENyeXB0UHJvdiwgaG93TWFueSwgKHVuc2lnbmVkIGNoYXIqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCkpKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKLSAgICAgICAgICAgIHJldHVybiB3aW4zMl9lcnJvcigiQ3J5cHRHZW5SYW5kb20iLCBOVUxMKTsKLSAgICAgICAgfQorICAgIHJldCA9IF9QeU9TX1VSYW5kb20oUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfR0VUX1NJWkUocmVzdWx0KSk7CisgICAgaWYgKHJldCA9PSAtMSkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9Ci0jZW5kaWYKLQotI2lmZGVmIF9fVk1TCi0vKiBVc2Ugb3BlbnNzbCByYW5kb20gcm91dGluZSAqLwotI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgotUHlEb2NfU1RSVkFSKHZtc191cmFuZG9tX19kb2NfXywKLSJ1cmFuZG9tKG4pIC0+IHN0clxuXG5cCi1SZXR1cm4gYSBzdHJpbmcgb2YgbiByYW5kb20gYnl0ZXMgc3VpdGFibGUgZm9yIGNyeXB0b2dyYXBoaWMgdXNlLiIpOwotCi1zdGF0aWMgUHlPYmplY3QqCi12bXNfdXJhbmRvbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCi17Ci0gICAgaW50IGhvd01hbnk7Ci0gICAgUHlPYmplY3QqIHJlc3VsdDsKLQotICAgIC8qIFJlYWQgYXJndW1lbnRzICovCi0gICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTp1cmFuZG9tIiwgJmhvd01hbnkpKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAoaG93TWFueSA8IDApCi0gICAgICAgIHJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmVnYXRpdmUgYXJndW1lbnQgbm90IGFsbG93ZWQiKTsKLQotICAgIC8qIEFsbG9jYXRlIGJ5dGVzICovCi0gICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgaG93TWFueSk7Ci0gICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7Ci0gICAgICAgIC8qIEdldCByYW5kb20gZGF0YSAqLwotICAgICAgICBpZiAoUkFORF9wc2V1ZG9fYnl0ZXMoKHVuc2lnbmVkIGNoYXIqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3dNYW55KSA8IDApIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkFORF9wc2V1ZG9fYnl0ZXMiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotI2VuZGlmCiAKICNpZmRlZiBIQVZFX1NFVFJFU1VJRAogUHlEb2NfU1RSVkFSKHBvc2l4X3NldHJlc3VpZF9fZG9jX18sCkBAIC04NjU2LDkgKzg3MTksMTEgQEAKIHN0YXRpYyBQeU9iamVjdCoKIHBvc2l4X3NldHJlc3VpZCAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIC8qIFdlIGFzc3VtZSB1aWRfdCBpcyBubyBsYXJnZXIgdGhhbiBhIGxvbmcuICovCi0gICAgbG9uZyBydWlkLCBldWlkLCBzdWlkOwotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGxsIiwgJnJ1aWQsICZldWlkLCAmc3VpZCkpCisgICAgdWlkX3QgcnVpZCwgZXVpZCwgc3VpZDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mTyZPJjpzZXRyZXN1aWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlfVWlkX0NvbnZlcnRlciwgJnJ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9VaWRfQ29udmVydGVyLCAmZXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5X1VpZF9Db252ZXJ0ZXIsICZzdWlkKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaWYgKHNldHJlc3VpZChydWlkLCBldWlkLCBzdWlkKSA8IDApCiAgICAgICAgIHJldHVybiBwb3NpeF9lcnJvcigpOwpAQCAtODY3NCw5ICs4NzM5LDExIEBACiBzdGF0aWMgUHlPYmplY3QqCiBwb3NpeF9zZXRyZXNnaWQgKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAvKiBXZSBhc3N1bWUgdWlkX3QgaXMgbm8gbGFyZ2VyIHRoYW4gYSBsb25nLiAqLwotICAgIGxvbmcgcmdpZCwgZWdpZCwgc2dpZDsKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxsbCIsICZyZ2lkLCAmZWdpZCwgJnNnaWQpKQorICAgIGdpZF90IHJnaWQsIGVnaWQsIHNnaWQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mTyY6c2V0cmVzZ2lkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5X0dpZF9Db252ZXJ0ZXIsICZyZ2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlfR2lkX0NvbnZlcnRlciwgJmVnaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9HaWRfQ29udmVydGVyLCAmc2dpZCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGlmIChzZXRyZXNnaWQocmdpZCwgZWdpZCwgc2dpZCkgPCAwKQogICAgICAgICByZXR1cm4gcG9zaXhfZXJyb3IoKTsKQEAgLTg2OTMsMTQgKzg3NjAsMTEgQEAKIHBvc2l4X2dldHJlc3VpZCAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpub2FyZ3MpCiB7CiAgICAgdWlkX3QgcnVpZCwgZXVpZCwgc3VpZDsKLSAgICBsb25nIGxfcnVpZCwgbF9ldWlkLCBsX3N1aWQ7CiAgICAgaWYgKGdldHJlc3VpZCgmcnVpZCwgJmV1aWQsICZzdWlkKSA8IDApCiAgICAgICAgIHJldHVybiBwb3NpeF9lcnJvcigpOwotICAgIC8qIEZvcmNlIHRoZSB2YWx1ZXMgaW50byBsb25nJ3MgYXMgd2UgZG9uJ3Qga25vdyB0aGUgc2l6ZSBvZiB1aWRfdC4gKi8KLSAgICBsX3J1aWQgPSBydWlkOwotICAgIGxfZXVpZCA9IGV1aWQ7Ci0gICAgbF9zdWlkID0gc3VpZDsKLSAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGxsbCkiLCBsX3J1aWQsIGxfZXVpZCwgbF9zdWlkKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKE5OTikiLCBfUHlJbnRfRnJvbVVpZChydWlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlJbnRfRnJvbVVpZChldWlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlJbnRfRnJvbVVpZChzdWlkKSk7CiB9CiAjZW5kaWYKIApAQCAtODcxMywxNCArODc3NywxMSBAQAogcG9zaXhfZ2V0cmVzZ2lkIChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJncykKIHsKICAgICB1aWRfdCByZ2lkLCBlZ2lkLCBzZ2lkOwotICAgIGxvbmcgbF9yZ2lkLCBsX2VnaWQsIGxfc2dpZDsKICAgICBpZiAoZ2V0cmVzZ2lkKCZyZ2lkLCAmZWdpZCwgJnNnaWQpIDwgMCkKICAgICAgICAgcmV0dXJuIHBvc2l4X2Vycm9yKCk7Ci0gICAgLyogRm9yY2UgdGhlIHZhbHVlcyBpbnRvIGxvbmcncyBhcyB3ZSBkb24ndCBrbm93IHRoZSBzaXplIG9mIHVpZF90LiAqLwotICAgIGxfcmdpZCA9IHJnaWQ7Ci0gICAgbF9lZ2lkID0gZWdpZDsKLSAgICBsX3NnaWQgPSBzZ2lkOwotICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIobGxsKSIsIGxfcmdpZCwgbF9lZ2lkLCBsX3NnaWQpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoTk5OKSIsIF9QeUludF9Gcm9tR2lkKHJnaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeUludF9Gcm9tR2lkKGVnaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeUludF9Gcm9tR2lkKHNnaWQpKTsKIH0KICNlbmRpZgogCkBAIC04OTI5LDcgKzg5OTAsNyBAQAogICAgIHsidGNzZXRwZ3JwIiwgICAgICAgcG9zaXhfdGNzZXRwZ3JwLCBNRVRIX1ZBUkFSR1MsIHBvc2l4X3Rjc2V0cGdycF9fZG9jX199LAogI2VuZGlmIC8qIEhBVkVfVENTRVRQR1JQICovCiAgICAgeyJvcGVuIiwgICAgICAgICAgICBwb3NpeF9vcGVuLCBNRVRIX1ZBUkFSR1MsIHBvc2l4X29wZW5fX2RvY19ffSwKLSAgICB7ImNsb3NlIiwgICAgICAgICAgIHBvc2l4X2Nsb3NlLCBNRVRIX1ZBUkFSR1MsIHBvc2l4X2Nsb3NlX19kb2NfX30sCisgICAgeyJjbG9zZSIsICAgICAgICAgICBwb3NpeF9jbG9zZV8sIE1FVEhfVkFSQVJHUywgcG9zaXhfY2xvc2VfX2RvY19ffSwKICAgICB7ImNsb3NlcmFuZ2UiLCAgICAgIHBvc2l4X2Nsb3NlcmFuZ2UsIE1FVEhfVkFSQVJHUywgcG9zaXhfY2xvc2VyYW5nZV9fZG9jX199LAogICAgIHsiZHVwIiwgICAgICAgICAgICAgcG9zaXhfZHVwLCBNRVRIX1ZBUkFSR1MsIHBvc2l4X2R1cF9fZG9jX199LAogICAgIHsiZHVwMiIsICAgICAgICAgICAgcG9zaXhfZHVwMiwgTUVUSF9WQVJBUkdTLCBwb3NpeF9kdXAyX19kb2NfX30sCkBAIC05MDMzLDEyICs5MDk0LDYgQEAKICNpZmRlZiBIQVZFX0dFVExPQURBVkcKICAgICB7ImdldGxvYWRhdmciLCAgICAgIHBvc2l4X2dldGxvYWRhdmcsIE1FVEhfTk9BUkdTLCBwb3NpeF9nZXRsb2FkYXZnX19kb2NfX30sCiAjZW5kaWYKLSAjaWZkZWYgTVNfV0lORE9XUwotICAgIHsidXJhbmRvbSIsIHdpbjMyX3VyYW5kb20sIE1FVEhfVkFSQVJHUywgd2luMzJfdXJhbmRvbV9fZG9jX199LAotICNlbmRpZgotICNpZmRlZiBfX1ZNUwotICAgIHsidXJhbmRvbSIsIHZtc191cmFuZG9tLCBNRVRIX1ZBUkFSR1MsIHZtc191cmFuZG9tX19kb2NfX30sCi0gI2VuZGlmCiAjaWZkZWYgSEFWRV9TRVRSRVNVSUQKICAgICB7InNldHJlc3VpZCIsICAgICAgIHBvc2l4X3NldHJlc3VpZCwgTUVUSF9WQVJBUkdTLCBwb3NpeF9zZXRyZXN1aWRfX2RvY19ffSwKICNlbmRpZgpAQCAtOTA1MSw3ICs5MTA2LDcgQEAKICNpZmRlZiBIQVZFX0dFVFJFU0dJRAogICAgIHsiZ2V0cmVzZ2lkIiwgICAgICAgcG9zaXhfZ2V0cmVzZ2lkLCBNRVRIX05PQVJHUywgcG9zaXhfZ2V0cmVzZ2lkX19kb2NfX30sCiAjZW5kaWYKLQorICAgIHsidXJhbmRvbSIsICAgICAgICAgcG9zaXhfdXJhbmRvbSwgICBNRVRIX1ZBUkFSR1MsIHBvc2l4X3VyYW5kb21fX2RvY19ffSwKICAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvcG9zaXhtb2R1bGUuaCBiL01vZHVsZXMvcG9zaXhtb2R1bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODRlMDYzCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9wb3NpeG1vZHVsZS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qIERlY2xhcmF0aW9ucyBzaGFyZWQgYmV0d2VlbiB0aGUgZGlmZmVyZW50IFBPU0lYLXJlbGF0ZWQgbW9kdWxlcyAqLworCisjaWZuZGVmIFB5X1BPU0lYTU9EVUxFX0gKKyNkZWZpbmUgUHlfUE9TSVhNT0RVTEVfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpZm5kZWYgUHlfTElNSVRFRF9BUEkKKyNpZm5kZWYgTVNfV0lORE9XUworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlJbnRfRnJvbVVpZCh1aWRfdCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeUludF9Gcm9tR2lkKGdpZF90KTsKK1B5QVBJX0ZVTkMoaW50KSBfUHlfVWlkX0NvbnZlcnRlcihQeU9iamVjdCAqLCB2b2lkICopOworUHlBUElfRlVOQyhpbnQpIF9QeV9HaWRfQ29udmVydGVyKFB5T2JqZWN0ICosIHZvaWQgKik7CisjZW5kaWYgLyogTVNfV0lORE9XUyAqLworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X1BPU0lYTU9EVUxFX0ggKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvcHdkbW9kdWxlLmMgYi9Nb2R1bGVzL3B3ZG1vZHVsZS5jCmluZGV4IDY3MjljODQuLmMyOTA3ZjYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvcHdkbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9wd2Rtb2R1bGUuYwpAQCAtMyw4ICszLDggQEAKIAogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgInN0cnVjdHNlcS5oIgorI2luY2x1ZGUgInBvc2l4bW9kdWxlLmgiCiAKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxwd2QuaD4KIAogc3RhdGljIFB5U3RydWN0U2VxdWVuY2VfRmllbGQgc3RydWN0X3B3ZF90eXBlX2ZpZWxkc1tdID0gewpAQCAtNzMsOCArNzMsOCBAQAogI2Vsc2UKICAgICBTRVRTKHNldEluZGV4KyssIHAtPnB3X3Bhc3N3ZCk7CiAjZW5kaWYKLSAgICBTRVRJKHNldEluZGV4KyssIHAtPnB3X3VpZCk7Ci0gICAgU0VUSShzZXRJbmRleCsrLCBwLT5wd19naWQpOworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgc2V0SW5kZXgrKywgX1B5SW50X0Zyb21VaWQocC0+cHdfdWlkKSk7CisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCBzZXRJbmRleCsrLCBfUHlJbnRfRnJvbUdpZChwLT5wd19naWQpKTsKICNpZmRlZiBfX1ZNUwogICAgIFNFVFMoc2V0SW5kZXgrKywgIiIpOwogI2Vsc2UKQEAgLTEwMywxMyArMTAzLDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogcHdkX2dldHB3dWlkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICB1bnNpZ25lZCBpbnQgdWlkOworICAgIHVpZF90IHVpZDsKICAgICBzdHJ1Y3QgcGFzc3dkICpwOwotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSTpnZXRwd3VpZCIsICZ1aWQpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyY6Z2V0cHd1aWQiLCBfUHlfVWlkX0NvbnZlcnRlciwgJnVpZCkpIHsKKyAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfT3ZlcmZsb3dFcnJvcikpCisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfS2V5RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImdldHB3dWlkKCk6IHVpZCBub3QgZm91bmQiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICAgIGlmICgocCA9IGdldHB3dWlkKHVpZCkpID09IE5VTEwpIHsKLSAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0tleUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgImdldHB3dWlkKCk6IHVpZCBub3QgZm91bmQ6ICVkIiwgdWlkKTsKKyAgICAgICAgaWYgKHVpZCA8IDApCisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfS2V5RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImdldHB3dWlkKCk6IHVpZCBub3QgZm91bmQ6ICVsZCIsIChsb25nKXVpZCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19LZXlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0cHd1aWQoKTogdWlkIG5vdCBmb3VuZDogJWx1IiwgKHVuc2lnbmVkIGxvbmcpdWlkKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIHJldHVybiBta3B3ZW50KHApOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9weWV4cGF0LmMgYi9Nb2R1bGVzL3B5ZXhwYXQuYwppbmRleCAzZDA0Y2E4Li5hOTVjMzg4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3B5ZXhwYXQuYworKysgYi9Nb2R1bGVzL3B5ZXhwYXQuYwpAQCAtOTc2LDcgKzk3Niw3IEBACiAgICAgICAgIHZvaWQgKmJ1ZiA9IFhNTF9HZXRCdWZmZXIoc2VsZi0+aXRzZWxmLCBCVUZfU0laRSk7CiAgICAgICAgIGlmIChidWYgPT0gTlVMTCkgewogICAgICAgICAgICAgUHlfWERFQ1JFRihyZWFkbWV0aG9kKTsKLSAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIGdldF9wYXJzZV9yZXN1bHQoc2VsZiwgMCk7CiAgICAgICAgIH0KIAogICAgICAgICBieXRlc19yZWFkID0gcmVhZGluc3QoYnVmLCBCVUZfU0laRSwgcmVhZG1ldGhvZCk7CkBAIC0xMTc0LDEzICsxMTc0LDE2IEBACiB4bWxwYXJzZV9Vc2VGb3JlaWduRFREKHhtbHBhcnNlb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKICAgICBQeU9iamVjdCAqZmxhZ29iaiA9IE5VTEw7Ci0gICAgWE1MX0Jvb2wgZmxhZyA9IFhNTF9UUlVFOworICAgIGludCBmbGFnID0gMTsKICAgICBlbnVtIFhNTF9FcnJvciByYzsKLSAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJVc2VGb3JlaWduRFREIiwgMCwgMSwgJmZsYWdvYmopKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifE86VXNlRm9yZWlnbkRURCIsICZmbGFnb2JqKSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKGZsYWdvYmogIT0gTlVMTCkKLSAgICAgICAgZmxhZyA9IFB5T2JqZWN0X0lzVHJ1ZShmbGFnb2JqKSA/IFhNTF9UUlVFIDogWE1MX0ZBTFNFOwotICAgIHJjID0gWE1MX1VzZUZvcmVpZ25EVEQoc2VsZi0+aXRzZWxmLCBmbGFnKTsKKyAgICBpZiAoZmxhZ29iaiAhPSBOVUxMKSB7CisgICAgICAgIGZsYWcgPSBQeU9iamVjdF9Jc1RydWUoZmxhZ29iaik7CisgICAgICAgIGlmIChmbGFnIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByYyA9IFhNTF9Vc2VGb3JlaWduRFREKHNlbGYtPml0c2VsZiwgZmxhZyA/IFhNTF9UUlVFIDogWE1MX0ZBTFNFKTsKICAgICBpZiAocmMgIT0gWE1MX0VSUk9SX05PTkUpIHsKICAgICAgICAgcmV0dXJuIHNldF9lcnJvcihzZWxmLCByYyk7CiAgICAgfQpAQCAtMTI0OSw2ICsxMjUyLDEzIEBACiAgICAgaWYgKF91X3N0cmluZyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gcmVzdWx0OwogCisgICAgaWYgKFB5VW5pY29kZV9HRVRfU0laRShfdV9zdHJpbmcpICE9IDI1NikgeworICAgICAgICBQeV9ERUNSRUYoX3Vfc3RyaW5nKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibXVsdGktYnl0ZSBlbmNvZGluZ3MgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKICAgICAgICAgLyogU3R1cGlkIHRvIGFjY2VzcyBkaXJlY3RseSwgYnV0IGZhc3QgKi8KICAgICAgICAgUHlfVU5JQ09ERSBjID0gX3Vfc3RyaW5nLT5zdHJbaV07CkBAIC0xMzAyLDYgKzEzMTIsMTMgQEAKICAgICBlbHNlIHsKICAgICAgICAgc2VsZi0+aXRzZWxmID0gWE1MX1BhcnNlckNyZWF0ZShlbmNvZGluZyk7CiAgICAgfQorI2lmICgoWE1MX01BSk9SX1ZFUlNJT04gPj0gMikgJiYgKFhNTF9NSU5PUl9WRVJTSU9OID49IDEpKSB8fCBkZWZpbmVkKFhNTF9IQVNfU0VUX0hBU0hfU0FMVCkKKyAgICAvKiBUaGlzIGZlYXR1cmUgd2FzIGFkZGVkIHVwc3RyZWFtIGluIGxpYmV4cGF0IDIuMS4wLiAgT3VyIGV4cGF0IGNvcHkKKyAgICAgKiBoYXMgYSBiYWNrcG9ydCBvZiB0aGlzIGZlYXR1cmUgd2hlcmUgd2UgYWxzbyBkZWZpbmUgWE1MX0hBU19TRVRfSEFTSF9TQUxUCisgICAgICogdG8gaW5kaWNhdGUgdGhhdCB3ZSBjYW4gc3RpbGwgdXNlIGl0LiAqLworICAgIFhNTF9TZXRIYXNoU2FsdChzZWxmLT5pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKV9QeV9IYXNoU2VjcmV0LnByZWZpeCk7CisjZW5kaWYKICAgICBzZWxmLT5pbnRlcm4gPSBpbnRlcm47CiAgICAgUHlfWElOQ1JFRihzZWxmLT5pbnRlcm4pOwogI2lmZGVmIFB5X1RQRkxBR1NfSEFWRV9HQwpAQCAtMTU0Miw3ICsxNTU5LDEwIEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgaWYgKHN0cmNtcChuYW1lLCAiYnVmZmVyX3RleHQiKSA9PSAwKSB7Ci0gICAgICAgIGlmIChQeU9iamVjdF9Jc1RydWUodikpIHsKKyAgICAgICAgaW50IGIgPSBQeU9iamVjdF9Jc1RydWUodik7CisgICAgICAgIGlmIChiIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGIpIHsKICAgICAgICAgICAgIGlmIChzZWxmLT5idWZmZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHNlbGYtPmJ1ZmZlciA9IG1hbGxvYyhzZWxmLT5idWZmZXJfc2l6ZSk7CiAgICAgICAgICAgICAgICAgaWYgKHNlbGYtPmJ1ZmZlciA9PSBOVUxMKSB7CkBAIC0xNTYxLDM5ICsxNTgxLDM5IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBpZiAoc3RyY21wKG5hbWUsICJuYW1lc3BhY2VfcHJlZml4ZXMiKSA9PSAwKSB7Ci0gICAgICAgIGlmIChQeU9iamVjdF9Jc1RydWUodikpCi0gICAgICAgICAgICBzZWxmLT5uc19wcmVmaXhlcyA9IDE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNlbGYtPm5zX3ByZWZpeGVzID0gMDsKKyAgICAgICAgaW50IGIgPSBQeU9iamVjdF9Jc1RydWUodik7CisgICAgICAgIGlmIChiIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgc2VsZi0+bnNfcHJlZml4ZXMgPSBiOwogICAgICAgICBYTUxfU2V0UmV0dXJuTlNUcmlwbGV0KHNlbGYtPml0c2VsZiwgc2VsZi0+bnNfcHJlZml4ZXMpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgaWYgKHN0cmNtcChuYW1lLCAib3JkZXJlZF9hdHRyaWJ1dGVzIikgPT0gMCkgewotICAgICAgICBpZiAoUHlPYmplY3RfSXNUcnVlKHYpKQotICAgICAgICAgICAgc2VsZi0+b3JkZXJlZF9hdHRyaWJ1dGVzID0gMTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc2VsZi0+b3JkZXJlZF9hdHRyaWJ1dGVzID0gMDsKKyAgICAgICAgaW50IGIgPSBQeU9iamVjdF9Jc1RydWUodik7CisgICAgICAgIGlmIChiIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgc2VsZi0+b3JkZXJlZF9hdHRyaWJ1dGVzID0gYjsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIGlmIChzdHJjbXAobmFtZSwgInJldHVybnNfdW5pY29kZSIpID09IDApIHsKLSAgICAgICAgaWYgKFB5T2JqZWN0X0lzVHJ1ZSh2KSkgeworICAgICAgICBpbnQgYiA9IFB5T2JqZWN0X0lzVHJ1ZSh2KTsKKyAgICAgICAgaWYgKGIgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogI2lmbmRlZiBQeV9VU0lOR19VTklDT0RFCisgICAgICAgIGlmIChiKSB7CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5pY29kZSBzdXBwb3J0IG5vdCBhdmFpbGFibGUiKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKLSNlbHNlCi0gICAgICAgICAgICBzZWxmLT5yZXR1cm5zX3VuaWNvZGUgPSAxOwotI2VuZGlmCiAgICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc2VsZi0+cmV0dXJuc191bmljb2RlID0gMDsKKyNlbmRpZgorICAgICAgICBzZWxmLT5yZXR1cm5zX3VuaWNvZGUgPSBiOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgaWYgKHN0cmNtcChuYW1lLCAic3BlY2lmaWVkX2F0dHJpYnV0ZXMiKSA9PSAwKSB7Ci0gICAgICAgIGlmIChQeU9iamVjdF9Jc1RydWUodikpCi0gICAgICAgICAgICBzZWxmLT5zcGVjaWZpZWRfYXR0cmlidXRlcyA9IDE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNlbGYtPnNwZWNpZmllZF9hdHRyaWJ1dGVzID0gMDsKKyAgICAgICAgaW50IGIgPSBQeU9iamVjdF9Jc1RydWUodik7CisgICAgICAgIGlmIChiIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgc2VsZi0+c3BlY2lmaWVkX2F0dHJpYnV0ZXMgPSBiOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvcmVhZGxpbmUuYyBiL01vZHVsZXMvcmVhZGxpbmUuYwppbmRleCBiNWUyNThkLi4yMGExNmM1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3JlYWRsaW5lLmMKKysrIGIvTW9kdWxlcy9yZWFkbGluZS5jCkBAIC01NCwxNCArNTQsMTYgQEAKICAqIHdpdGggdGhlICJyZWFsIiByZWFkbGluZSBhbmQgY2Fubm90IGJlIGRldGVjdGVkIGF0IGNvbXBpbGUtdGltZSwKICAqIGhlbmNlIHdlIHVzZSBhIHJ1bnRpbWUgY2hlY2sgdG8gZGV0ZWN0IGlmIHdlJ3JlIHVzaW5nIGxpYmVkaXQKICAqCi0gKiBDdXJyZW50bHkgdGhlcmUgaXMgb25lIGtub3cgQVBJIGluY29tcGF0aWJpbGl0eToKKyAqIEN1cnJlbnRseSB0aGVyZSBpcyBvbmUga25vd24gQVBJIGluY29tcGF0aWJpbGl0eToKICAqIC0gJ2dldF9oaXN0b3J5JyBoYXMgYSAxLWJhc2VkIGluZGV4IHdpdGggR05VIHJlYWRsaW5lLCBhbmQgYSAwLWJhc2VkCi0gKiAgIGluZGV4IHdpdGggbGliZWRpdCdzIGVtdWxhdGlvbi4KKyAqICAgaW5kZXggd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBsaWJlZGl0J3MgZW11bGF0aW9uLgogICogLSBOb3RlIHRoYXQgcmVwbGFjZV9oaXN0b3J5IGFuZCByZW1vdmVfaGlzdG9yeSB1c2UgYSAwLWJhc2VkIGluZGV4Ci0gKiAgIHdpdGggYm90aCBpbXBsZW1lbnRhdGlvbi4KKyAqICAgd2l0aCBib3RoIGltcGxlbWVudGF0aW9ucy4KICAqLwogc3RhdGljIGludCB1c2luZ19saWJlZGl0X2VtdWxhdGlvbiA9IDA7CiBzdGF0aWMgY29uc3QgY2hhciBsaWJlZGl0X3ZlcnNpb25fdGFnW10gPSAiRWRpdExpbmUgd3JhcHBlciI7CisKK3N0YXRpYyBpbnQgbGliZWRpdF9oaXN0b3J5X3N0YXJ0ID0gMDsKICNlbmRpZiAvKiBfX0FQUExFX18gKi8KIAogc3RhdGljIHZvaWQKQEAgLTY5LDYgKzcxLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fbWF0Y2hlcywgaW50IG1heF9sZW5ndGgpOwogCiAKKy8qIE1lbW9yeSBhbGxvY2F0ZWQgZm9yIHJsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMKKyAgIChzZWUgaXNzdWUgIzE3Mjg5IGZvciB0aGUgbW90aXZhdGlvbikuICovCitzdGF0aWMgY2hhciAqY29tcGxldGVyX3dvcmRfYnJlYWtfY2hhcmFjdGVyczsKKwogLyogRXhwb3J0ZWQgZnVuY3Rpb24gdG8gc2VuZCBvbmUgbGluZSB0byByZWFkbGluZSdzIGluaXQgZmlsZSBwYXJzZXIgKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTIwMCw4ICsyMDYsNyBAQAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBidWYsICZmdW5jdGlvbikpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGlmIChmdW5jdGlvbiA9PSBQeV9Ob25lKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoKmhvb2tfdmFyKTsKLSAgICAgICAgKmhvb2tfdmFyID0gTlVMTDsKKyAgICAgICAgUHlfQ0xFQVIoKmhvb2tfdmFyKTsKICAgICB9CiAgICAgZWxzZSBpZiAoUHlDYWxsYWJsZV9DaGVjayhmdW5jdGlvbikpIHsKICAgICAgICAgUHlPYmplY3QgKnRtcCA9ICpob29rX3ZhcjsKQEAgLTM0NCwxMiArMzQ5LDIwIEBACiB7CiAgICAgY2hhciAqYnJlYWtfY2hhcnM7CiAKLSAgICBpZighUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpzZXRfY29tcGxldGVyX2RlbGltcyIsICZicmVha19jaGFycykpIHsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6c2V0X2NvbXBsZXRlcl9kZWxpbXMiLCAmYnJlYWtfY2hhcnMpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBmcmVlKCh2b2lkKilybF9jb21wbGV0ZXJfd29yZF9icmVha19jaGFyYWN0ZXJzKTsKLSAgICBybF9jb21wbGV0ZXJfd29yZF9icmVha19jaGFyYWN0ZXJzID0gc3RyZHVwKGJyZWFrX2NoYXJzKTsKLSAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICAvKiBLZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGluIHRoZSBtb2R1bGUgc3RhdGUgaW4gY2FzZQorICAgICAgIHNvbWUgb3RoZXIgbW9kdWxlIG1vZGlmaWVzIHJsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMKKyAgICAgICAoc2VlIGlzc3VlICMxNzI4OSkuICovCisgICAgZnJlZShjb21wbGV0ZXJfd29yZF9icmVha19jaGFyYWN0ZXJzKTsKKyAgICBjb21wbGV0ZXJfd29yZF9icmVha19jaGFyYWN0ZXJzID0gc3RyZHVwKGJyZWFrX2NoYXJzKTsKKyAgICBpZiAoY29tcGxldGVyX3dvcmRfYnJlYWtfY2hhcmFjdGVycykgeworICAgICAgICBybF9jb21wbGV0ZXJfd29yZF9icmVha19jaGFyYWN0ZXJzID0gY29tcGxldGVyX3dvcmRfYnJlYWtfY2hhcmFjdGVyczsKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2Nfc2V0X2NvbXBsZXRlcl9kZWxpbXMsCkBAIC01NDMsMjEgKzU1NiwyMSBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICNpZmRlZiAgX19BUFBMRV9fCiAgICAgaWYgKHVzaW5nX2xpYmVkaXRfZW11bGF0aW9uKSB7Ci0gICAgICAgIC8qIExpYmVkaXQgZW11bGF0aW9uIHVzZXMgMC1iYXNlZCBpbmRleGVzLAotICAgICAgICAgKiB0aGUgcmVhbCBvbmUgdXNlcyAxLWJhc2VkIGluZGV4ZXMsCi0gICAgICAgICAqIGFkanVzdCB0aGUgaW5kZXggdG8gZW5zdXJlIHRoYXQgUHl0aG9uCi0gICAgICAgICAqIGNvZGUgZG9lc24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZQotICAgICAgICAgKiBkaWZmZXJlbmNlLgorICAgICAgICAvKiBPbGRlciB2ZXJzaW9ucyBvZiBsaWJlZGl0J3MgcmVhZGxpbmUgZW11bGF0aW9uCisgICAgICAgICAqIHVzZSAwLWJhc2VkIGluZGV4ZXMsIHdoaWxlIHJlYWRsaW5lIGFuZCBuZXdlcgorICAgICAgICAgKiB2ZXJzaW9ucyBvZiBsaWJlZGl0IHVzZSAxLWJhc2VkIGluZGV4ZXMuCiAgICAgICAgICAqLwogICAgICAgICBpbnQgbGVuZ3RoID0gX3B5X2dldF9oaXN0b3J5X2xlbmd0aCgpOwotICAgICAgICBpZHggLS07CisKKyAgICAgICAgaWR4ID0gaWR4IC0gMSArIGxpYmVkaXRfaGlzdG9yeV9zdGFydDsKIAogICAgICAgICAvKgogICAgICAgICAgKiBBcHBsZSdzIHJlYWRsaW5lIGVtdWxhdGlvbiBjcmFzaGVzIHdoZW4KICAgICAgICAgICogdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZSwgdGhlcmVmb3JlCiAgICAgICAgICAqIHRlc3QgZm9yIHRoYXQgYW5kIGZhaWwgZ3JhY2VmdWxseS4KICAgICAgICAgICovCi0gICAgICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSBsZW5ndGgpIHsKKyAgICAgICAgaWYgKGlkeCA8ICgwICsgbGliZWRpdF9oaXN0b3J5X3N0YXJ0KQorICAgICAgICAgICAgICAgIHx8IGlkeCA+PSAobGVuZ3RoICsgbGliZWRpdF9oaXN0b3J5X3N0YXJ0KSkgewogICAgICAgICAgICAgUHlfUkVUVVJOX05PTkU7CiAgICAgICAgIH0KICAgICB9CkBAIC03MzYsMTQgKzc0OSwyMiBAQAogfQogCiBzdGF0aWMgaW50CisjaWYgZGVmaW5lZChfUkxfRlVOQ1RJT05fVFlQRURFRikKIG9uX3N0YXJ0dXBfaG9vayh2b2lkKQorI2Vsc2UKK29uX3N0YXJ0dXBfaG9vaygpCisjZW5kaWYKIHsKICAgICByZXR1cm4gb25faG9vayhzdGFydHVwX2hvb2spOwogfQogCiAjaWZkZWYgSEFWRV9STF9QUkVfSU5QVVRfSE9PSwogc3RhdGljIGludAorI2lmIGRlZmluZWQoX1JMX0ZVTkNUSU9OX1RZUEVERUYpCiBvbl9wcmVfaW5wdXRfaG9vayh2b2lkKQorI2Vsc2UKK29uX3ByZV9pbnB1dF9ob29rKCkKKyNlbmRpZgogewogICAgIHJldHVybiBvbl9ob29rKHByZV9pbnB1dF9ob29rKTsKIH0KQEAgLTgzOCw3ICs4NTksNyBAQAogICogYmVmb3JlIGNhbGxpbmcgdGhlIG5vcm1hbCBjb21wbGV0ZXIgKi8KIAogc3RhdGljIGNoYXIgKioKLWZsZXhfY29tcGxldGUoY2hhciAqdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kKQorZmxleF9jb21wbGV0ZShjb25zdCBjaGFyICp0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQpCiB7CiAjaWZkZWYgSEFWRV9STF9DT01QTEVUSU9OX0FQUEVORF9DSEFSQUNURVIKICAgICBybF9jb21wbGV0aW9uX2FwcGVuZF9jaGFyYWN0ZXIgPSdcMCc7CkBAIC04NjYsMTEgKzg4NywyMiBAQAogI2VuZGlmCiAKICNpZmRlZiBfX0FQUExFX18KLSAgICAvKiB0aGUgbGliZWRpdCByZWFkbGluZSBlbXVsYXRpb24gcmVzZXRzIGtleSBiaW5kaW5ncyBldGMgCisgICAgLyogdGhlIGxpYmVkaXQgcmVhZGxpbmUgZW11bGF0aW9uIHJlc2V0cyBrZXkgYmluZGluZ3MgZXRjCiAgICAgICogd2hlbiBjYWxsaW5nIHJsX2luaXRpYWxpemUuICBTbyBjYWxsIGl0IHVwZnJvbnQKICAgICAgKi8KICAgICBpZiAodXNpbmdfbGliZWRpdF9lbXVsYXRpb24pCiAgICAgICAgIHJsX2luaXRpYWxpemUoKTsKKworICAgIC8qIERldGVjdCBpZiBsaWJlZGl0J3MgcmVhZGxpbmUgZW11bGF0aW9uIHVzZXMgMC1iYXNlZAorICAgICAqIGluZGV4aW5nIG9yIDEtYmFzZWQgaW5kZXhpbmcuCisgICAgICovCisgICAgYWRkX2hpc3RvcnkoIjEiKTsKKyAgICBpZiAoaGlzdG9yeV9nZXQoMSkgPT0gTlVMTCkgeworICAgICAgICBsaWJlZGl0X2hpc3Rvcnlfc3RhcnQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGxpYmVkaXRfaGlzdG9yeV9zdGFydCA9IDE7CisgICAgfQorICAgIGNsZWFyX2hpc3RvcnkoKTsKICNlbmRpZiAvKiBfX0FQUExFX18gKi8KIAogICAgIHVzaW5nX2hpc3RvcnkoKTsKQEAgLTg4NiwxOSArOTE4LDM1IEBACiAgICAgcmxfYmluZF9rZXlfaW5fbWFwICgnXHQnLCBybF9jb21wbGV0ZSwgZW1hY3NfbWV0YV9rZXltYXApOwogICAgIHJsX2JpbmRfa2V5X2luX21hcCAoJ1wwMzMnLCBybF9jb21wbGV0ZSwgZW1hY3NfbWV0YV9rZXltYXApOwogICAgIC8qIFNldCBvdXIgaG9vayBmdW5jdGlvbnMgKi8KLSAgICBybF9zdGFydHVwX2hvb2sgPSAoRnVuY3Rpb24gKilvbl9zdGFydHVwX2hvb2s7CisgICAgcmxfc3RhcnR1cF9ob29rID0gb25fc3RhcnR1cF9ob29rOwogI2lmZGVmIEhBVkVfUkxfUFJFX0lOUFVUX0hPT0sKLSAgICBybF9wcmVfaW5wdXRfaG9vayA9IChGdW5jdGlvbiAqKW9uX3ByZV9pbnB1dF9ob29rOworICAgIHJsX3ByZV9pbnB1dF9ob29rID0gb25fcHJlX2lucHV0X2hvb2s7CiAjZW5kaWYKICAgICAvKiBTZXQgb3VyIGNvbXBsZXRpb24gZnVuY3Rpb24gKi8KLSAgICBybF9hdHRlbXB0ZWRfY29tcGxldGlvbl9mdW5jdGlvbiA9IChDUFBGdW5jdGlvbiAqKWZsZXhfY29tcGxldGU7CisgICAgcmxfYXR0ZW1wdGVkX2NvbXBsZXRpb25fZnVuY3Rpb24gPSBmbGV4X2NvbXBsZXRlOwogICAgIC8qIFNldCBQeXRob24gd29yZCBicmVhayBjaGFyYWN0ZXJzICovCi0gICAgcmxfY29tcGxldGVyX3dvcmRfYnJlYWtfY2hhcmFjdGVycyA9CisgICAgY29tcGxldGVyX3dvcmRfYnJlYWtfY2hhcmFjdGVycyA9CisgICAgICAgIHJsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMgPQogICAgICAgICBzdHJkdXAoIiBcdFxuYH4hQCMkJV4mKigpLT0rW3tdfVxcfDs6J1wiLDw+Lz8iKTsKICAgICAgICAgLyogQWxsIG5vbmFscGhhbnVtcyBleGNlcHQgJy4nICovCiAKICAgICBiZWdpZHggPSBQeUludF9Gcm9tTG9uZygwTCk7CiAgICAgZW5kaWR4ID0gUHlJbnRfRnJvbUxvbmcoMEwpOworCisjaWZuZGVmIF9fQVBQTEVfXworICAgIGlmICghaXNhdHR5KFNURE9VVF9GSUxFTk8pKSB7CisgICAgICAgIC8qIElzc3VlICMxOTg4NDogc3Rkb3V0IGlzIG5vIGEgdGVybWluYWwuIERpc2FibGUgbWV0YSBtb2RpZmllcgorICAgICAgICAgICBrZXlzIHRvIG5vdCB3cml0ZSB0aGUgQU5TSSBzZXF1ZW5jZSAiXDAzM1sxMDM0aCIgaW50byBzdGRvdXQuIE9uCisgICAgICAgICAgIHRlcm1pbmFscyBzdXBwb3J0aW5nIDggYml0IGNoYXJhY3RlcnMgbGlrZSBURVJNPXh0ZXJtLTI1NmNvbG9yCisgICAgICAgICAgICh3aGljaCBpcyBub3cgdGhlIGRlZmF1bHQgRmVkb3JhIHNpbmNlIEZlZG9yYSAxOCksIHRoZSBtZXRhIGtleSBpcworICAgICAgICAgICB1c2VkIHRvIGVuYWJsZSBzdXBwb3J0IG9mIDggYml0IGNoYXJhY3RlcnMgKEFOU0kgc2VxdWVuY2UKKyAgICAgICAgICAgIlwwMzNbMTAzNGgiKS4KKworICAgICAgICAgICBXaXRoIGxpYmVkaXQsIHRoaXMgY2FsbCBtYWtlcyByZWFkbGluZSgpIGNyYXNoLiAqLworICAgICAgICBybF92YXJpYWJsZV9iaW5kICgiZW5hYmxlLW1ldGEta2V5IiwgIm9mZiIpOworICAgIH0KKyNlbmRpZgorCiAgICAgLyogSW5pdGlhbGl6ZSAoYWxsb3dzIC5pbnB1dHJjIHRvIG92ZXJyaWRlKQogICAgICAqCiAgICAgICogWFhYOiBBIGJ1ZyBpbiB0aGUgcmVhZGxpbmUtMi4yIGxpYnJhcnkgY2F1c2VzIGEgbWVtb3J5IGxlYWsKQEAgLTkwNiwxMSArOTU0LDExIEBACiAgICAgICovCiAjaWZkZWYgX19BUFBMRV9fCiAgICAgaWYgKHVzaW5nX2xpYmVkaXRfZW11bGF0aW9uKQotCXJsX3JlYWRfaW5pdF9maWxlKE5VTEwpOworICAgICAgICBybF9yZWFkX2luaXRfZmlsZShOVUxMKTsKICAgICBlbHNlCiAjZW5kaWYgLyogX19BUFBMRV9fICovCiAgICAgICAgIHJsX2luaXRpYWxpemUoKTsKLSAgICAKKwogICAgIFJFU1RPUkVfTE9DQUxFKHNhdmVkX2xvY2FsZSkKIH0KIApAQCAtMTA3NywxMSArMTEyNSw4IEBACiAgICAgICAgIGlmIChsZW5ndGggPiAwKQogI2lmZGVmIF9fQVBQTEVfXwogICAgICAgICAgICAgaWYgKHVzaW5nX2xpYmVkaXRfZW11bGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBMaWJlZGl0J3MgZW11bGF0aW9uIHVzZXMgMC1iYXNlZCBpbmRleGVzLAotICAgICAgICAgICAgICAgICAqIHRoZSByZWFsIHJlYWRsaW5lIHVzZXMgMS1iYXNlZCBpbmRleGVzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGxpbmUgPSBoaXN0b3J5X2dldChsZW5ndGggLSAxKS0+bGluZTsKKyAgICAgICAgICAgICAgICAvKiBoYW5kbGUgb2xkZXIgMC1iYXNlZCBvciBuZXdlciAxLWJhc2VkIGluZGV4aW5nICovCisgICAgICAgICAgICAgICAgbGluZSA9IGhpc3RvcnlfZ2V0KGxlbmd0aCArIGxpYmVkaXRfaGlzdG9yeV9zdGFydCAtIDEpLT5saW5lOwogICAgICAgICAgICAgfSBlbHNlCiAjZW5kaWYgLyogX19BUFBMRV9fICovCiAgICAgICAgICAgICBsaW5lID0gaGlzdG9yeV9nZXQobGVuZ3RoKS0+bGluZTsKQEAgLTExMzcsOCArMTE4Miw2IEBACiAgICAgaWYgKG0gPT0gTlVMTCkKICAgICAgICAgcmV0dXJuOwogCi0KLQogICAgIFB5T1NfUmVhZGxpbmVGdW5jdGlvblBvaW50ZXIgPSBjYWxsX3JlYWRsaW5lOwogICAgIHNldHVwX3JlYWRsaW5lKCk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3Jlc291cmNlLmMgYi9Nb2R1bGVzL3Jlc291cmNlLmMKaW5kZXggOTk5M2I5My4uNTNhNmMzZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9yZXNvdXJjZS5jCisrKyBiL01vZHVsZXMvcmVzb3VyY2UuYwpAQCAtMTQ1LDEwICsxNDUsOSBAQAogewogICAgIHN0cnVjdCBybGltaXQgcmw7CiAgICAgaW50IHJlc291cmNlOwotICAgIFB5T2JqZWN0ICpjdXJvYmosICptYXhvYmo7CisgICAgUHlPYmplY3QgKmxpbWl0cywgKmN1cm9iaiwgKm1heG9iajsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaShPTyk6c2V0cmxpbWl0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc291cmNlLCAmY3Vyb2JqLCAmbWF4b2JqKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPOnNldHJsaW1pdCIsICZyZXNvdXJjZSwgJmxpbWl0cykpCiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKHJlc291cmNlIDwgMCB8fCByZXNvdXJjZSA+PSBSTElNX05MSU1JVFMpIHsKQEAgLTE1NywyMyArMTU2LDM2IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAorICAgIGxpbWl0cyA9IFB5U2VxdWVuY2VfVHVwbGUobGltaXRzKTsKKyAgICBpZiAoIWxpbWl0cykKKyAgICAgICAgLyogSGVyZSBsaW1pdHMgaXMgYSBib3Jyb3dlZCByZWZlcmVuY2UgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShsaW1pdHMpICE9IDIpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgYSB0dXBsZSBvZiAyIGludGVnZXJzIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIGN1cm9iaiA9IFB5VHVwbGVfR0VUX0lURU0obGltaXRzLCAwKTsKKyAgICBtYXhvYmogPSBQeVR1cGxlX0dFVF9JVEVNKGxpbWl0cywgMSk7CisKICNpZiAhZGVmaW5lZChIQVZFX0xBUkdFRklMRV9TVVBQT1JUKQogICAgIHJsLnJsaW1fY3VyID0gUHlJbnRfQXNMb25nKGN1cm9iaik7CiAgICAgaWYgKHJsLnJsaW1fY3VyID09IChybGltX3QpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgcmwucmxpbV9tYXggPSBQeUludF9Bc0xvbmcobWF4b2JqKTsKICAgICBpZiAocmwucmxpbV9tYXggPT0gKHJsaW1fdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZ290byBlcnJvcjsKICNlbHNlCiAgICAgLyogVGhlIGxpbWl0cyBhcmUgcHJvYmFibHkgYmlnZ2VyIHRoYW4gYSBsb25nICovCiAgICAgcmwucmxpbV9jdXIgPSBQeUxvbmdfQ2hlY2soY3Vyb2JqKSA/CiAgICAgICAgIFB5TG9uZ19Bc0xvbmdMb25nKGN1cm9iaikgOiBQeUludF9Bc0xvbmcoY3Vyb2JqKTsKICAgICBpZiAocmwucmxpbV9jdXIgPT0gKHJsaW1fdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZ290byBlcnJvcjsKICAgICBybC5ybGltX21heCA9IFB5TG9uZ19DaGVjayhtYXhvYmopID8KICAgICAgICAgUHlMb25nX0FzTG9uZ0xvbmcobWF4b2JqKSA6IFB5SW50X0FzTG9uZyhtYXhvYmopOwogICAgIGlmIChybC5ybGltX21heCA9PSAocmxpbV90KS0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBnb3RvIGVycm9yOwogI2VuZGlmCiAKICAgICBybC5ybGltX2N1ciA9IHJsLnJsaW1fY3VyICYgUkxJTV9JTkZJTklUWTsKQEAgLTE4NywxMCArMTk5LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhbGxvd2VkIHRvIHJhaXNlIG1heGltdW0gbGltaXQiKTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFJlc291cmNlRXJyb3IpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZ290byBlcnJvcjsKICAgICB9CisgICAgUHlfREVDUkVGKGxpbWl0cyk7CiAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgIHJldHVybiBQeV9Ob25lOworCisgIGVycm9yOgorICAgIFB5X0RFQ1JFRihsaW1pdHMpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zZWxlY3Rtb2R1bGUuYyBiL01vZHVsZXMvc2VsZWN0bW9kdWxlLmMKaW5kZXggNWE4NTgwYy4uMjcwN2IwNSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zZWxlY3Rtb2R1bGUuYworKysgYi9Nb2R1bGVzL3NlbGVjdG1vZHVsZS5jCkBAIC03MSw4ICs3MSw3IEBACiB7CiAgICAgaW50IGk7CiAgICAgZm9yIChpID0gMDsgaSA8IEZEX1NFVFNJWkUgKyAxICYmIGZkMm9ialtpXS5zZW50aW5lbCA+PSAwOyBpKyspIHsKLSAgICAgICAgUHlfWERFQ1JFRihmZDJvYmpbaV0ub2JqKTsKLSAgICAgICAgZmQyb2JqW2ldLm9iaiA9IE5VTEw7CisgICAgICAgIFB5X0NMRUFSKGZkMm9ialtpXS5vYmopOwogICAgIH0KICAgICBmZDJvYmpbMF0uc2VudGluZWwgPSAtMTsKIH0KQEAgLTg3LDcgKzg2LDYgQEAKICAgICBpbnQgaTsKICAgICBpbnQgbWF4ID0gLTE7CiAgICAgaW50IGluZGV4ID0gMDsKLSAgICBpbnQgbGVuID0gLTE7CiAgICAgUHlPYmplY3QqIGZhc3Rfc2VxID0gTlVMTDsKICAgICBQeU9iamVjdCogbyA9IE5VTEw7CiAKQEAgLTk4LDkgKzk2LDcgQEAKICAgICBpZiAoIWZhc3Rfc2VxKQogICAgICAgICByZXR1cm4gLTE7CiAKLSAgICBsZW4gPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUoZmFzdF9zZXEpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSAgeworICAgIGZvciAoaSA9IDA7IGkgPCBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUoZmFzdF9zZXEpOyBpKyspICB7CiAgICAgICAgIFNPQ0tFVCB2OwogCiAgICAgICAgIC8qIGFueSBpbnRlcnZlbmluZyBmaWxlbm8oKSBjYWxscyBjb3VsZCBkZWNyIHRoaXMgcmVmY250ICovCkBAIC0zMjEsNiArMzE3LDcgQEAKICAgICBpbnQgdWZkX3VwdG9kYXRlOwogICAgIGludCB1ZmRfbGVuOwogICAgIHN0cnVjdCBwb2xsZmQgKnVmZHM7CisgICAgaW50IHBvbGxfcnVubmluZzsKIH0gcG9sbE9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBwb2xsX1R5cGU7CkBAIC0zNDYsMTQgKzM0MywzNSBAQAogCiAgICAgaSA9IHBvcyA9IDA7CiAgICAgd2hpbGUgKFB5RGljdF9OZXh0KHNlbGYtPmRpY3QsICZwb3MsICZrZXksICZ2YWx1ZSkpIHsKLSAgICAgICAgc2VsZi0+dWZkc1tpXS5mZCA9IFB5SW50X0FzTG9uZyhrZXkpOwotICAgICAgICBzZWxmLT51ZmRzW2ldLmV2ZW50cyA9IChzaG9ydClQeUludF9Bc0xvbmcodmFsdWUpOworICAgICAgICBhc3NlcnQoaSA8IHNlbGYtPnVmZF9sZW4pOworICAgICAgICAvKiBOZXZlciBvdmVyZmxvdyAqLworICAgICAgICBzZWxmLT51ZmRzW2ldLmZkID0gKGludClQeUludF9Bc0xvbmcoa2V5KTsKKyAgICAgICAgc2VsZi0+dWZkc1tpXS5ldmVudHMgPSAoc2hvcnQpKHVuc2lnbmVkIHNob3J0KVB5SW50X0FzTG9uZyh2YWx1ZSk7CiAgICAgICAgIGkrKzsKICAgICB9CisgICAgYXNzZXJ0KGkgPT0gc2VsZi0+dWZkX2xlbik7CiAgICAgc2VsZi0+dWZkX3VwdG9kYXRlID0gMTsKICAgICByZXR1cm4gMTsKIH0KIAorc3RhdGljIGludAordXNob3J0X2NvbnZlcnRlcihQeU9iamVjdCAqb2JqLCB2b2lkICpwdHIpCit7CisgICAgdW5zaWduZWQgbG9uZyB1dmFsOworCisgICAgdXZhbCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyhvYmopOworICAgIGlmICh1dmFsID09ICh1bnNpZ25lZCBsb25nKS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICh1dmFsID4gVVNIUlRfTUFYKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiBpbnQgdG9vIGxhcmdlIGZvciBDIHVuc2lnbmVkIHNob3J0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgICoodW5zaWduZWQgc2hvcnQgKilwdHIgPSBQeV9TQUZFX0RPV05DQVNUKHV2YWwsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIHNob3J0KTsKKyAgICByZXR1cm4gMTsKK30KKwogUHlEb2NfU1RSVkFSKHBvbGxfcmVnaXN0ZXJfZG9jLAogInJlZ2lzdGVyKGZkIFssIGV2ZW50bWFza10gKSAtPiBOb25lXG5cblwKIFJlZ2lzdGVyIGEgZmlsZSBkZXNjcmlwdG9yIHdpdGggdGhlIHBvbGxpbmcgb2JqZWN0LlxuXApAQCAtMzY1LDEyICszODMsMTIgQEAKIHBvbGxfcmVnaXN0ZXIocG9sbE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgUHlPYmplY3QgKm8sICprZXksICp2YWx1ZTsKLSAgICBpbnQgZmQsIGV2ZW50cyA9IFBPTExJTiB8IFBPTExQUkkgfCBQT0xMT1VUOworICAgIGludCBmZDsKKyAgICB1bnNpZ25lZCBzaG9ydCBldmVudHMgPSBQT0xMSU4gfCBQT0xMUFJJIHwgUE9MTE9VVDsKICAgICBpbnQgZXJyOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfGk6cmVnaXN0ZXIiLCAmbywgJmV2ZW50cykpIHsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyY6cmVnaXN0ZXIiLCAmbywgdXNob3J0X2NvbnZlcnRlciwgJmV2ZW50cykpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KIAogICAgIGZkID0gUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcihvKTsKICAgICBpZiAoZmQgPT0gLTEpIHJldHVybiBOVUxMOwpAQCAtNDA4LDEyICs0MjYsMTIgQEAKIHBvbGxfbW9kaWZ5KHBvbGxPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpvLCAqa2V5LCAqdmFsdWU7Ci0gICAgaW50IGZkLCBldmVudHM7CisgICAgaW50IGZkOworICAgIHVuc2lnbmVkIHNob3J0IGV2ZW50czsKICAgICBpbnQgZXJyOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPaTptb2RpZnkiLCAmbywgJmV2ZW50cykpIHsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PJjptb2RpZnkiLCAmbywgdXNob3J0X2NvbnZlcnRlciwgJmV2ZW50cykpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KIAogICAgIGZkID0gUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcihvKTsKICAgICBpZiAoZmQgPT0gLTEpIHJldHVybiBOVUxMOwpAQCAtNTA2LDIyICs1MjQsMzMgQEAKICAgICAgICAgdG91dCA9IFB5TnVtYmVyX0ludCh0b3V0KTsKICAgICAgICAgaWYgKCF0b3V0KQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIHRpbWVvdXQgPSBQeUludF9Bc0xvbmcodG91dCk7CisgICAgICAgIHRpbWVvdXQgPSBfUHlJbnRfQXNJbnQodG91dCk7CiAgICAgICAgIFB5X0RFQ1JFRih0b3V0KTsKICAgICAgICAgaWYgKHRpbWVvdXQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAorICAgIC8qIEF2b2lkIGNvbmN1cnJlbnQgcG9sbCgpIGludm9jYXRpb24sIGlzc3VlIDg4NjUgKi8KKyAgICBpZiAoc2VsZi0+cG9sbF9ydW5uaW5nKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY29uY3VycmVudCBwb2xsKCkgaW52b2NhdGlvbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKICAgICAvKiBFbnN1cmUgdGhlIHVmZCBhcnJheSBpcyB1cCB0byBkYXRlICovCiAgICAgaWYgKCFzZWxmLT51ZmRfdXB0b2RhdGUpCiAgICAgICAgIGlmICh1cGRhdGVfdWZkX2FycmF5KHNlbGYpID09IDApCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAorICAgIHNlbGYtPnBvbGxfcnVubmluZyA9IDE7CisKICAgICAvKiBjYWxsIHBvbGwoKSAqLwogICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICBwb2xsX3Jlc3VsdCA9IHBvbGwoc2VsZi0+dWZkcywgc2VsZi0+dWZkX2xlbiwgdGltZW91dCk7CiAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAorICAgIHNlbGYtPnBvbGxfcnVubmluZyA9IDA7CisKICAgICBpZiAocG9sbF9yZXN1bHQgPCAwKSB7CiAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhTZWxlY3RFcnJvcik7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNTk4LDYgKzYyNyw3IEBACiAgICAgICAgYXJyYXkgcG9pbnRlZCB0byBieSB1ZmRzIG1hdGNoZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaWN0aW9uYXJ5LiAqLwogICAgIHNlbGYtPnVmZF91cHRvZGF0ZSA9IDA7CiAgICAgc2VsZi0+dWZkcyA9IE5VTEw7CisgICAgc2VsZi0+cG9sbF9ydW5uaW5nID0gMDsKICAgICBzZWxmLT5kaWN0ID0gUHlEaWN0X05ldygpOwogICAgIGlmIChzZWxmLT5kaWN0ID09IE5VTEwpIHsKICAgICAgICAgUHlfREVDUkVGKHNlbGYpOwpAQCAtMTIwMiw2ICsxMjMyLDIzIEBACiAjICAgZXJyb3IgdWludHB0cl90IGRvZXMgbm90IG1hdGNoIGludCwgbG9uZywgb3IgbG9uZyBsb25nIQogI2VuZGlmCiAKKy8qCisgKiBrZXZlbnQgaXMgbm90IHN0YW5kYXJkIGFuZCBpdHMgbWVtYmVycyB2YXJ5IGFjcm9zcyBCU0RzLgorICovCisjaWYgIWRlZmluZWQoX19PcGVuQlNEX18pCisjICAgZGVmaW5lIElERU5UX1RZUEUJVF9VSU5UUFRSVAorIyAgIGRlZmluZSBJREVOVF9DQVNUCVB5X2ludHB0cl90CisjICAgZGVmaW5lIERBVEFfVFlQRQlUX0lOVFBUUlQKKyMgICBkZWZpbmUgREFUQV9GTVRfVU5JVCBJTlRQVFJUX0ZNVF9VTklUCisjICAgZGVmaW5lIElERU5UX0FzVHlwZQlQeUxvbmdfQXNVaW50cHRyX3QKKyNlbHNlCisjICAgZGVmaW5lIElERU5UX1RZUEUJVF9VSU5UCisjICAgZGVmaW5lIElERU5UX0NBU1QJaW50CisjICAgZGVmaW5lIERBVEFfVFlQRQlUX0lOVAorIyAgIGRlZmluZSBEQVRBX0ZNVF9VTklUICJpIgorIyAgIGRlZmluZSBJREVOVF9Bc1R5cGUJUHlMb25nX0FzVW5zaWduZWRMb25nCisjZW5kaWYKKwogLyogVW5mb3J0dW5hdGVseSwgd2UgY2FuJ3Qgc3RvcmUgcHl0aG9uIG9iamVjdHMgaW4gdWRhdGEsIGJlY2F1c2UKICAqIGtldmVudHMgaW4gdGhlIGtlcm5lbCBjYW4gYmUgcmVtb3ZlZCB3aXRob3V0IHdhcm5pbmcsIHdoaWNoIHdvdWxkCiAgKiBmb3JldmVyIGxvc2UgdGhlIHJlZmNvdW50IG9uIHRoZSBvYmplY3Qgc3RvcmVkIHdpdGggaXQuCkBAIC0xMjA5LDExICsxMjU2LDExIEBACiAKICNkZWZpbmUgS1FfT0ZGKHgpIG9mZnNldG9mKGtxdWV1ZV9ldmVudF9PYmplY3QsIHgpCiBzdGF0aWMgc3RydWN0IFB5TWVtYmVyRGVmIGtxdWV1ZV9ldmVudF9tZW1iZXJzW10gPSB7Ci0gICAgeyJpZGVudCIsICAgICAgICAgICBUX1VJTlRQVFJULCAgICAgS1FfT0ZGKGUuaWRlbnQpfSwKKyAgICB7ImlkZW50IiwgICAgICAgICAgIElERU5UX1RZUEUsICAgICBLUV9PRkYoZS5pZGVudCl9LAogICAgIHsiZmlsdGVyIiwgICAgICAgICAgVF9TSE9SVCwgICAgICAgIEtRX09GRihlLmZpbHRlcil9LAogICAgIHsiZmxhZ3MiLCAgICAgICAgICAgVF9VU0hPUlQsICAgICAgIEtRX09GRihlLmZsYWdzKX0sCiAgICAgeyJmZmxhZ3MiLCAgICAgICAgICBUX1VJTlQsICAgICAgICAgS1FfT0ZGKGUuZmZsYWdzKX0sCi0gICAgeyJkYXRhIiwgICAgICAgICAgICBUX0lOVFBUUlQsICAgICAgS1FfT0ZGKGUuZGF0YSl9LAorICAgIHsiZGF0YSIsICAgICAgICAgICAgREFUQV9UWVBFLCAgICAgIEtRX09GRihlLmRhdGEpfSwKICAgICB7InVkYXRhIiwgICAgICAgICAgIFRfVUlOVFBUUlQsICAgICBLUV9PRkYoZS51ZGF0YSl9LAogICAgIHtOVUxMfSAvKiBTZW50aW5lbCAqLwogfTsKQEAgLTEyMzksNyArMTI4Niw3IEBACiAgICAgUHlPYmplY3QgKnBmZDsKICAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImlkZW50IiwgImZpbHRlciIsICJmbGFncyIsICJmZmxhZ3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSIsICJ1ZGF0YSIsIE5VTEx9OwotICAgIHN0YXRpYyBjaGFyICpmbXQgPSAiT3xoaGkiIElOVFBUUlRfRk1UX1VOSVQgVUlOVFBUUlRfRk1UX1VOSVQgIjprZXZlbnQiOworICAgIHN0YXRpYyBjaGFyICpmbXQgPSAiT3xoSEkiIERBVEFfRk1UX1VOSVQgVUlOVFBUUlRfRk1UX1VOSVQgIjprZXZlbnQiOwogCiAgICAgRVZfU0VUKCYoc2VsZi0+ZSksIDAsIEVWRklMVF9SRUFELCBFVl9BREQsIDAsIDAsIDApOyAvKiBkZWZhdWx0cyAqLwogCkBAIC0xMjQ5LDggKzEyOTYsMTIgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGlmIChQeUxvbmdfQ2hlY2socGZkKSkgewotICAgICAgICBzZWxmLT5lLmlkZW50ID0gUHlMb25nX0FzVWludHB0cl90KHBmZCk7CisgICAgaWYgKFB5TG9uZ19DaGVjayhwZmQpCisjaWYgSURFTlRfVFlQRSA9PSBUX1VJTlQKKwkmJiBQeUxvbmdfQXNVbnNpZ25lZExvbmcocGZkKSA8PSBVSU5UX01BWAorI2VuZGlmCisgICAgKSB7CisgICAgICAgIHNlbGYtPmUuaWRlbnQgPSBJREVOVF9Bc1R5cGUocGZkKTsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIHNlbGYtPmUuaWRlbnQgPSBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yKHBmZCk7CkBAIC0xMjc4LDEwICsxMzI5LDEwIEBACiAgICAgICAgICAgICBQeV9UWVBFKHMpLT50cF9uYW1lLCBQeV9UWVBFKG8pLT50cF9uYW1lKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGlmICgoKHJlc3VsdCA9IHMtPmUuaWRlbnQgLSBvLT5lLmlkZW50KSA9PSAwKSAmJgorICAgIGlmICgoKHJlc3VsdCA9IChJREVOVF9DQVNUKShzLT5lLmlkZW50IC0gby0+ZS5pZGVudCkpID09IDApICYmCiAgICAgICAgICgocmVzdWx0ID0gcy0+ZS5maWx0ZXIgLSBvLT5lLmZpbHRlcikgPT0gMCkgJiYKICAgICAgICAgKChyZXN1bHQgPSBzLT5lLmZsYWdzIC0gby0+ZS5mbGFncykgPT0gMCkgJiYKLSAgICAgICAgKChyZXN1bHQgPSBzLT5lLmZmbGFncyAtIG8tPmUuZmZsYWdzKSA9PSAwKSAmJgorICAgICAgICAoKHJlc3VsdCA9IChpbnQpKHMtPmUuZmZsYWdzIC0gby0+ZS5mZmxhZ3MpKSA9PSAwKSAmJgogICAgICAgICAoKHJlc3VsdCA9IHMtPmUuZGF0YSAtIG8tPmUuZGF0YSkgPT0gMCkgJiYKICAgICAgICAgKChyZXN1bHQgPSBzLT5lLnVkYXRhIC0gby0+ZS51ZGF0YSkgPT0gMCkKICAgICAgICApIHsKQEAgLTE3MzYsNyArMTc4Nyw3IEBACiAKIHN0YXRpYyBQeU1ldGhvZERlZiBzZWxlY3RfbWV0aG9kc1tdID0gewogICAgIHsic2VsZWN0IiwgICAgICAgICAgc2VsZWN0X3NlbGVjdCwgIE1FVEhfVkFSQVJHUywgICBzZWxlY3RfZG9jfSwKLSNpZmRlZiBIQVZFX1BPTEwKKyNpZiBkZWZpbmVkKEhBVkVfUE9MTCkgJiYgIWRlZmluZWQoSEFWRV9CUk9LRU5fUE9MTCkKICAgICB7InBvbGwiLCAgICAgICAgICAgIHNlbGVjdF9wb2xsLCAgICBNRVRIX05PQVJHUywgICAgcG9sbF9kb2N9LAogI2VuZGlmIC8qIEhBVkVfUE9MTCAqLwogICAgIHswLCAgICAgICAgIDB9LCAgICAgLyogc2VudGluZWwgKi8KQEAgLTE3NjgsNyArMTgxOSw3IEBACiAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBJUEVfQlVGIiwgUElQRV9CVUYpOwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKEhBVkVfUE9MTCkKKyNpZiBkZWZpbmVkKEhBVkVfUE9MTCkgJiYgIWRlZmluZWQoSEFWRV9CUk9LRU5fUE9MTCkKICNpZmRlZiBfX0FQUExFX18KICAgICBpZiAoc2VsZWN0X2hhdmVfYnJva2VuX3BvbGwoKSkgewogICAgICAgICBpZiAoUHlPYmplY3RfRGVsQXR0clN0cmluZyhtLCAicG9sbCIpID09IC0xKSB7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3NoYW1vZHVsZS5jIGIvTW9kdWxlcy9zaGFtb2R1bGUuYwppbmRleCBhODZlNzIyLi42NTYyMDhkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3NoYW1vZHVsZS5jCisrKyBiL01vZHVsZXMvc2hhbW9kdWxlLmMKQEAgLTQyOSwxMiArNDI5LDI1IEBACiBTSEFfdXBkYXRlKFNIQW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgUHlfYnVmZmVyIHZpZXc7CisgICAgUHlfc3NpemVfdCBuOworICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyo6dXBkYXRlIiwgJnZpZXcpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIHNoYV91cGRhdGUoc2VsZiwgKHVuc2lnbmVkIGNoYXIqKXZpZXcuYnVmLAotICAgICAgICAgICAgICAgUHlfU0FGRV9ET1dOQ0FTVCh2aWV3LmxlbiwgUHlfc3NpemVfdCwgdW5zaWduZWQgaW50KSk7CisgICAgbiA9IHZpZXcubGVuOworICAgIGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIHZpZXcuYnVmOworICAgIHdoaWxlIChuID4gMCkgeworICAgICAgICBQeV9zc2l6ZV90IG5ieXRlczsKKyAgICAgICAgaWYgKG4gPiBJTlRfTUFYKQorICAgICAgICAgICAgbmJ5dGVzID0gSU5UX01BWDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbmJ5dGVzID0gbjsKKyAgICAgICAgc2hhX3VwZGF0ZShzZWxmLCBidWYsCisgICAgICAgICAgICAgICAgICAgUHlfU0FGRV9ET1dOQ0FTVChuYnl0ZXMsIFB5X3NzaXplX3QsIHVuc2lnbmVkIGludCkpOworICAgICAgICBidWYgKz0gbmJ5dGVzOworICAgICAgICBuIC09IG5ieXRlczsKKyAgICB9CiAKICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3KTsKICAgICBQeV9SRVRVUk5fTk9ORTsKQEAgLTUzNiw2ICs1NDksOCBAQAogICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsic3RyaW5nIiwgTlVMTH07CiAgICAgU0hBb2JqZWN0ICpuZXc7CiAgICAgUHlfYnVmZmVyIHZpZXcgPSB7IDAgfTsKKyAgICBQeV9zc2l6ZV90IG47CisgICAgdW5zaWduZWQgY2hhciAqYnVmOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkaWN0LCAifHMqOm5ldyIsIGt3bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmlldykpIHsKQEAgLTU1NCwxMCArNTY5LDIxIEBACiAgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXcpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgaWYgKHZpZXcubGVuID4gMCkgewotICAgICAgICBzaGFfdXBkYXRlKG5ldywgKHVuc2lnbmVkIGNoYXIqKXZpZXcuYnVmLAotICAgICAgICAgICAgICAgICAgIFB5X1NBRkVfRE9XTkNBU1Qodmlldy5sZW4sIFB5X3NzaXplX3QsIHVuc2lnbmVkIGludCkpOworCisgICAgbiA9IHZpZXcubGVuOworICAgIGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIHZpZXcuYnVmOworICAgIHdoaWxlIChuID4gMCkgeworICAgICAgICBQeV9zc2l6ZV90IG5ieXRlczsKKyAgICAgICAgaWYgKG4gPiBJTlRfTUFYKQorICAgICAgICAgICAgbmJ5dGVzID0gSU5UX01BWDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbmJ5dGVzID0gbjsKKyAgICAgICAgc2hhX3VwZGF0ZShuZXcsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICBQeV9TQUZFX0RPV05DQVNUKG5ieXRlcywgUHlfc3NpemVfdCwgdW5zaWduZWQgaW50KSk7CisgICAgICAgIGJ1ZiArPSBuYnl0ZXM7CisgICAgICAgIG4gLT0gbmJ5dGVzOwogICAgIH0KKwogICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXcpOwogCiAgICAgcmV0dXJuIChQeU9iamVjdCAqKW5ldzsKZGlmZiAtLWdpdCBhL01vZHVsZXMvc2lnbmFsbW9kdWxlLmMgYi9Nb2R1bGVzL3NpZ25hbG1vZHVsZS5jCmluZGV4IGYzMDZiYmEuLjE4NGIzYTkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc2lnbmFsbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9zaWduYWxtb2R1bGUuYwpAQCAtMzIxLDcgKzMyMSwxMCBAQAogICAgIEhhbmRsZXJzW3NpZ19udW1dLnRyaXBwZWQgPSAwOwogICAgIFB5X0lOQ1JFRihvYmopOwogICAgIEhhbmRsZXJzW3NpZ19udW1dLmZ1bmMgPSBvYmo7Ci0gICAgcmV0dXJuIG9sZF9oYW5kbGVyOworICAgIGlmIChvbGRfaGFuZGxlciAhPSBOVUxMKQorICAgICAgICByZXR1cm4gb2xkX2hhbmRsZXI7CisgICAgZWxzZQorICAgICAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKHNpZ25hbF9kb2MsCkBAIC0zNDksOCArMzUyLDEzIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBvbGRfaGFuZGxlciA9IEhhbmRsZXJzW3NpZ19udW1dLmZ1bmM7Ci0gICAgUHlfSU5DUkVGKG9sZF9oYW5kbGVyKTsKLSAgICByZXR1cm4gb2xkX2hhbmRsZXI7CisgICAgaWYgKG9sZF9oYW5kbGVyICE9IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKG9sZF9oYW5kbGVyKTsKKyAgICAgICAgcmV0dXJuIG9sZF9oYW5kbGVyOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CisgICAgfQogfQogCiBQeURvY19TVFJWQVIoZ2V0c2lnbmFsX2RvYywKQEAgLTQwNyw3ICs0MTUsNyBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAjZW5kaWYKLSAgICBpZiAoZmQgIT0gLTEgJiYgZnN0YXQoZmQsICZidWYpICE9IDApIHsKKyAgICBpZiAoZmQgIT0gLTEgJiYgKCFfUHlWZXJpZnlfZmQoZmQpIHx8IGZzdGF0KGZkLCAmYnVmKSAhPSAwKSkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImludmFsaWQgZmQiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtOTcyLDE0ICs5ODAsMzIgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQKK19jbGVhcl9wZW5kaW5nX3NpZ25hbHModm9pZCkKK3sKKyAgICBpbnQgaTsKKyAgICBpZiAoIWlzX3RyaXBwZWQpCisgICAgICAgIHJldHVybjsKKyAgICBpc190cmlwcGVkID0gMDsKKyAgICBmb3IgKGkgPSAxOyBpIDwgTlNJRzsgKytpKSB7CisgICAgICAgIEhhbmRsZXJzW2ldLnRyaXBwZWQgPSAwOworICAgIH0KK30KKwogdm9pZAogUHlPU19BZnRlckZvcmsodm9pZCkKIHsKKyAgICAvKiBDbGVhciB0aGUgc2lnbmFsIGZsYWdzIGFmdGVyIGZvcmtpbmcgc28gdGhhdCB0aGV5IGFyZW4ndCBoYW5kbGVkCisgICAgICogaW4gYm90aCBwcm9jZXNzZXMgaWYgdGhleSBjYW1lIGluIGp1c3QgYmVmb3JlIHRoZSBmb3JrKCkgYnV0IGJlZm9yZQorICAgICAqIHRoZSBpbnRlcnByZXRlciBoYWQgYW4gb3Bwb3J0dW5pdHkgdG8gY2FsbCB0aGUgaGFuZGxlcnMuICBpc3N1ZTk1MzUuICovCisgICAgX2NsZWFyX3BlbmRpbmdfc2lnbmFscygpOwogI2lmZGVmIFdJVEhfVEhSRUFECisgICAgLyogUHlUaHJlYWRfUmVJbml0VExTKCkgbXVzdCBiZSBjYWxsZWQgZWFybHksIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBUTFMgQVBJCisgICAgICogY2FuIGJlIGNhbGxlZCBzYWZlbHkuICovCisgICAgUHlUaHJlYWRfUmVJbml0VExTKCk7CiAgICAgUHlFdmFsX1JlSW5pdFRocmVhZHMoKTsKICAgICBtYWluX3RocmVhZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKICAgICBtYWluX3BpZCA9IGdldHBpZCgpOwogICAgIF9QeUltcG9ydF9SZUluaXRMb2NrKCk7Ci0gICAgUHlUaHJlYWRfUmVJbml0VExTKCk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvc29ja2V0bW9kdWxlLmMgYi9Nb2R1bGVzL3NvY2tldG1vZHVsZS5jCmluZGV4IDI3OWEwOTAuLjAxMjdhNmMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc29ja2V0bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9zb2NrZXRtb2R1bGUuYwpAQCAtOTIsNiArOTIsMTEgQEAKIAogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgorI2luY2x1ZGUgInRpbWVmdW5jcy5oIgorCisjaWZuZGVmIElOVkFMSURfU09DS0VUIC8qIE1TIGRlZmluZXMgdGhpcyAqLworI2RlZmluZSBJTlZBTElEX1NPQ0tFVCAoLTEpCisjZW5kaWYKIAogI3VuZGVmIE1BWAogI2RlZmluZSBNQVgoeCwgeSkgKCh4KSA8ICh5KSA/ICh5KSA6ICh4KSkKQEAgLTQ3Myw2ICs0NzgsMTcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAorI2lmZGVmIE1TX1dJTkRPV1MKKyNpZm5kZWYgV1NBRUFHQUlOCisjZGVmaW5lIFdTQUVBR0FJTiBXU0FFV09VTERCTE9DSworI2VuZGlmCisjZGVmaW5lIENIRUNLX0VSUk5PKGV4cGVjdGVkKSBcCisgICAgKFdTQUdldExhc3RFcnJvcigpID09IFdTQSAjIyBleHBlY3RlZCkKKyNlbHNlCisjZGVmaW5lIENIRUNLX0VSUk5PKGV4cGVjdGVkKSBcCisgICAgKGVycm5vID09IGV4cGVjdGVkKQorI2VuZGlmCisKIC8qIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIHJhaXNlIGFuIGVycm9yIGFjY29yZGluZyB0byBlcnJubwogICAgYW5kIHJldHVybiBhIE5VTEwgcG9pbnRlciBmcm9tIGEgZnVuY3Rpb24uICovCiAKQEAgLTY2MSw3ICs2NzcsNyBAQAogICAgYWZ0ZXIgdGhleSd2ZSByZWFjcXVpcmVkIHRoZSBpbnRlcnByZXRlciBsb2NrLgogICAgUmV0dXJucyAxIG9uIHRpbWVvdXQsIC0xIG9uIGVycm9yLCAwIG90aGVyd2lzZS4gKi8KIHN0YXRpYyBpbnQKLWludGVybmFsX3NlbGVjdChQeVNvY2tldFNvY2tPYmplY3QgKnMsIGludCB3cml0aW5nKQoraW50ZXJuYWxfc2VsZWN0X2V4KFB5U29ja2V0U29ja09iamVjdCAqcywgaW50IHdyaXRpbmcsIGRvdWJsZSBpbnRlcnZhbCkKIHsKICAgICBpbnQgbjsKIApAQCAtNjczLDYgKzY4OSwxMCBAQAogICAgIGlmIChzLT5zb2NrX2ZkIDwgMCkKICAgICAgICAgcmV0dXJuIDA7CiAKKyAgICAvKiBIYW5kbGluZyB0aGlzIGNvbmRpdGlvbiBoZXJlIHNpbXBsaWZpZXMgdGhlIHNlbGVjdCBsb29wcyAqLworICAgIGlmIChpbnRlcnZhbCA8IDAuMCkKKyAgICAgICAgcmV0dXJuIDE7CisKICAgICAvKiBQcmVmZXIgcG9sbCwgaWYgYXZhaWxhYmxlLCBzaW5jZSB5b3UgY2FuIHBvbGwoKSBhbnkgZmQKICAgICAgKiB3aGljaCBjYW4ndCBiZSBkb25lIHdpdGggc2VsZWN0KCkuICovCiAjaWZkZWYgSEFWRV9QT0xMCkBAIC02ODQsNyArNzA0LDcgQEAKICAgICAgICAgcG9sbGZkLmV2ZW50cyA9IHdyaXRpbmcgPyBQT0xMT1VUIDogUE9MTElOOwogCiAgICAgICAgIC8qIHMtPnNvY2tfdGltZW91dCBpcyBpbiBzZWNvbmRzLCB0aW1lb3V0IGluIG1zICovCi0gICAgICAgIHRpbWVvdXQgPSAoaW50KShzLT5zb2NrX3RpbWVvdXQgKiAxMDAwICsgMC41KTsKKyAgICAgICAgdGltZW91dCA9IChpbnQpKGludGVydmFsICogMTAwMCArIDAuNSk7CiAgICAgICAgIG4gPSBwb2xsKCZwb2xsZmQsIDEsIHRpbWVvdXQpOwogICAgIH0KICNlbHNlCkBAIC02OTIsOCArNzEyLDggQEAKICAgICAgICAgLyogQ29uc3RydWN0IHRoZSBhcmd1bWVudHMgdG8gc2VsZWN0ICovCiAgICAgICAgIGZkX3NldCBmZHM7CiAgICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgICAgICB0di50dl9zZWMgPSAoaW50KXMtPnNvY2tfdGltZW91dDsKLSAgICAgICAgdHYudHZfdXNlYyA9IChpbnQpKChzLT5zb2NrX3RpbWVvdXQgLSB0di50dl9zZWMpICogMWU2KTsKKyAgICAgICAgdHYudHZfc2VjID0gKGludClpbnRlcnZhbDsKKyAgICAgICAgdHYudHZfdXNlYyA9IChpbnQpKChpbnRlcnZhbCAtIHR2LnR2X3NlYykgKiAxZTYpOwogICAgICAgICBGRF9aRVJPKCZmZHMpOwogICAgICAgICBGRF9TRVQocy0+c29ja19mZCwgJmZkcyk7CiAKQEAgLTcxMiw2ICs3MzIsNDggQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludAoraW50ZXJuYWxfc2VsZWN0KFB5U29ja2V0U29ja09iamVjdCAqcywgaW50IHdyaXRpbmcpCit7CisgICAgcmV0dXJuIGludGVybmFsX3NlbGVjdF9leChzLCB3cml0aW5nLCBzLT5zb2NrX3RpbWVvdXQpOworfQorCisvKgorICAgVHdvIG1hY3JvcyBmb3IgYXV0b21hdGljIHJldHJ5IG9mIHNlbGVjdCgpIGluIGNhc2Ugb2YgZmFsc2UgcG9zaXRpdmVzCisgICAoZm9yIGV4YW1wbGUsIHNlbGVjdCgpIGNvdWxkIGluZGljYXRlIGEgc29ja2V0IGlzIHJlYWR5IGZvciByZWFkaW5nCisgICAgYnV0IHRoZSBkYXRhIHRoZW4gZGlzY2FyZGVkIGJ5IHRoZSBPUyBiZWNhdXNlIG9mIGEgd3JvbmcgY2hlY2tzdW0pLgorICAgSGVyZSBpcyBhbiBleGFtcGxlIG9mIHVzZToKKworICAgIEJFR0lOX1NFTEVDVF9MT09QKHMpCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3RfZXgocywgMCwgaW50ZXJ2YWwpOworICAgIGlmICghdGltZW91dCkKKyAgICAgICAgb3V0bGVuID0gcmVjdihzLT5zb2NrX2ZkLCBjYnVmLCBsZW4sIGZsYWdzKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmICh0aW1lb3V0ID09IDEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF90aW1lb3V0LCAidGltZWQgb3V0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgRU5EX1NFTEVDVF9MT09QKHMpCisqLworI2RlZmluZSBCRUdJTl9TRUxFQ1RfTE9PUChzKSBcCisgICAgeyBcCisgICAgICAgIGRvdWJsZSBkZWFkbGluZSwgaW50ZXJ2YWwgPSBzLT5zb2NrX3RpbWVvdXQ7IFwKKyAgICAgICAgaW50IGhhc190aW1lb3V0ID0gcy0+c29ja190aW1lb3V0ID4gMC4wOyBcCisgICAgICAgIGlmIChoYXNfdGltZW91dCkgeyBcCisgICAgICAgICAgICBkZWFkbGluZSA9IF9QeVRpbWVfRmxvYXRUaW1lKCkgKyBzLT5zb2NrX3RpbWVvdXQ7IFwKKyAgICAgICAgfSBcCisgICAgICAgIHdoaWxlICgxKSB7IFwKKyAgICAgICAgICAgIGVycm5vID0gMDsKKworI2RlZmluZSBFTkRfU0VMRUNUX0xPT1AocykgXAorICAgICAgICAgICAgaWYgKCFoYXNfdGltZW91dCB8fCBcCisgICAgICAgICAgICAgICAgKCFDSEVDS19FUlJOTyhFV09VTERCTE9DSykgJiYgIUNIRUNLX0VSUk5PKEVBR0FJTikpKSBcCisgICAgICAgICAgICAgICAgYnJlYWs7IFwKKyAgICAgICAgICAgIGludGVydmFsID0gZGVhZGxpbmUgLSBfUHlUaW1lX0Zsb2F0VGltZSgpOyBcCisgICAgICAgIH0gXAorICAgIH0KKwogLyogSW5pdGlhbGl6ZSBhIG5ldyBzb2NrZXQgb2JqZWN0LiAqLwogCiBzdGF0aWMgZG91YmxlIGRlZmF1bHR0aW1lb3V0ID0gLTEuMDsgLyogRGVmYXVsdCB0aW1lb3V0IGZvciBuZXcgc29ja2V0cyAqLwpAQCAtNzYxLDcgKzgyMyw3IEBACiAvKiBMb2NrIHRvIGFsbG93IHB5dGhvbiBpbnRlcnByZXRlciB0byBjb250aW51ZSwgYnV0IG9ubHkgYWxsb3cgb25lCiAgICB0aHJlYWQgdG8gYmUgaW4gZ2V0aG9zdGJ5bmFtZSBvciBnZXRhZGRyaW5mbyAqLwogI2lmIGRlZmluZWQoVVNFX0dFVEhPU1RCWU5BTUVfTE9DSykgfHwgZGVmaW5lZChVU0VfR0VUQUREUklORk9fTE9DSykKLVB5VGhyZWFkX3R5cGVfbG9jayBuZXRkYl9sb2NrOworc3RhdGljIFB5VGhyZWFkX3R5cGVfbG9jayBuZXRkYl9sb2NrOwogI2VuZGlmCiAKIApAQCAtMTAyOCwxMCArMTA5MCwxMCBAQAogICAgICAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKICAgICAgICAgaWYgKGFkZHJvYmopIHsKICAgICAgICAgICAgIGEgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKWFkZHI7Ci0gICAgICAgICAgICByZXQgPSBQeV9CdWlsZFZhbHVlKCJPaWlpIiwKKyAgICAgICAgICAgIHJldCA9IFB5X0J1aWxkVmFsdWUoIk9pSUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyb2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudG9ocyhhLT5zaW42X3BvcnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5zaW42X2Zsb3dpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudG9obChhLT5zaW42X2Zsb3dpbmZvKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+c2luNl9zY29wZV9pZCk7CiAgICAgICAgICAgICBQeV9ERUNSRUYoYWRkcm9iaik7CiAgICAgICAgIH0KQEAgLTEyODIsNyArMTM0NCw4IEBACiAgICAgewogICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42KiBhZGRyOwogICAgICAgICBjaGFyICpob3N0OwotICAgICAgICBpbnQgcG9ydCwgZmxvd2luZm8sIHNjb3BlX2lkLCByZXN1bHQ7CisgICAgICAgIGludCBwb3J0LCByZXN1bHQ7CisgICAgICAgIHVuc2lnbmVkIGludCBmbG93aW5mbywgc2NvcGVfaWQ7CiAgICAgICAgIGZsb3dpbmZvID0gc2NvcGVfaWQgPSAwOwogICAgICAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdCgKQEAgLTEyOTIsNyArMTM1NSw3IEBACiAgICAgICAgICAgICAgICAgUHlfVFlQRShhcmdzKS0+dHBfbmFtZSk7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQotICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0aXxpaSIsCisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZXRpfElJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZG5hIiwgJmhvc3QsICZwb3J0LCAmZmxvd2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NvcGVfaWQpKSB7CiAgICAgICAgICAgICByZXR1cm4gMDsKQEAgLTEzMDksOSArMTM3MiwxNSBAQAogICAgICAgICAgICAgICAgICJnZXRzb2NrYWRkcmFyZzogcG9ydCBtdXN0IGJlIDAtNjU1MzUuIik7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQorICAgICAgICBpZiAoZmxvd2luZm8gPiAweGZmZmZmKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAiZ2V0c29ja2FkZHJhcmc6IGZsb3dpbmZvIG11c3QgYmUgMC0xMDQ4NTc1LiIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KICAgICAgICAgYWRkci0+c2luNl9mYW1pbHkgPSBzLT5zb2NrX2ZhbWlseTsKICAgICAgICAgYWRkci0+c2luNl9wb3J0ID0gaHRvbnMoKHNob3J0KXBvcnQpOwotICAgICAgICBhZGRyLT5zaW42X2Zsb3dpbmZvID0gZmxvd2luZm87CisgICAgICAgIGFkZHItPnNpbjZfZmxvd2luZm8gPSBodG9ubChmbG93aW5mbyk7CiAgICAgICAgIGFkZHItPnNpbjZfc2NvcGVfaWQgPSBzY29wZV9pZDsKICAgICAgICAgKmxlbl9yZXQgPSBzaXplb2YgKmFkZHI7CiAgICAgICAgIHJldHVybiAxOwpAQCAtMTY0MCwxNyArMTcwOSwxNCBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBtZW1zZXQoJmFkZHJidWYsIDAsIGFkZHJsZW4pOwogCi0jaWZkZWYgTVNfV0lORE9XUwogICAgIG5ld2ZkID0gSU5WQUxJRF9TT0NLRVQ7Ci0jZWxzZQotICAgIG5ld2ZkID0gLTE7Ci0jZW5kaWYKIAogICAgIGlmICghSVNfU0VMRUNUQUJMRShzKSkKICAgICAgICAgcmV0dXJuIHNlbGVjdF9lcnJvcigpOwogCisgICAgQkVHSU5fU0VMRUNUX0xPT1AocykKICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCi0gICAgdGltZW91dCA9IGludGVybmFsX3NlbGVjdChzLCAwKTsKKyAgICB0aW1lb3V0ID0gaW50ZXJuYWxfc2VsZWN0X2V4KHMsIDAsIGludGVydmFsKTsKICAgICBpZiAoIXRpbWVvdXQpCiAgICAgICAgIG5ld2ZkID0gYWNjZXB0KHMtPnNvY2tfZmQsIFNBUzJTQSgmYWRkcmJ1ZiksICZhZGRybGVuKTsKICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwpAQCAtMTY1OSwxMiArMTcyNSw5IEBACiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CisgICAgRU5EX1NFTEVDVF9MT09QKHMpCiAKLSNpZmRlZiBNU19XSU5ET1dTCiAgICAgaWYgKG5ld2ZkID09IElOVkFMSURfU09DS0VUKQotI2Vsc2UKLSAgICBpZiAobmV3ZmQgPCAwKQotI2VuZGlmCiAgICAgICAgIHJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKIAogICAgIC8qIENyZWF0ZSB0aGUgbmV3IG9iamVjdCB3aXRoIHVuc3BlY2lmaWVkIGZhbWlseSwKQEAgLTE3MDYsNyArMTc2OSw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja19zZXRibG9ja2luZyhQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmcpCiB7Ci0gICAgaW50IGJsb2NrOworICAgIGxvbmcgYmxvY2s7CiAKICAgICBibG9jayA9IFB5SW50X0FzTG9uZyhhcmcpOwogICAgIGlmIChibG9jayA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQpAQCAtMjIzNiw3ICsyMjk5LDcgQEAKICAgICBpbnQgYmFja2xvZzsKICAgICBpbnQgcmVzOwogCi0gICAgYmFja2xvZyA9IFB5SW50X0FzTG9uZyhhcmcpOworICAgIGJhY2tsb2cgPSBfUHlJbnRfQXNJbnQoYXJnKTsKICAgICBpZiAoYmFja2xvZyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCkBAIC0yMzQ4LDggKzI0MTEsOSBAQAogICAgIH0KIAogI2lmbmRlZiBfX1ZNUworICAgIEJFR0lOX1NFTEVDVF9MT09QKHMpCiAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotICAgIHRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3QocywgMCk7CisgICAgdGltZW91dCA9IGludGVybmFsX3NlbGVjdF9leChzLCAwLCBpbnRlcnZhbCk7CiAgICAgaWYgKCF0aW1lb3V0KQogICAgICAgICBvdXRsZW4gPSByZWN2KHMtPnNvY2tfZmQsIGNidWYsIGxlbiwgZmxhZ3MpOwogICAgIFB5X0VORF9BTExPV19USFJFQURTCkBAIC0yMzU4LDYgKzI0MjIsNyBAQAogICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KKyAgICBFTkRfU0VMRUNUX0xPT1AocykKICAgICBpZiAob3V0bGVuIDwgMCkgewogICAgICAgICAvKiBOb3RlOiB0aGUgY2FsbCB0byBlcnJvcmhhbmRsZXIoKSBBTFdBWVMgaW5kaXJlY3RseSByZXR1cm5lZAogICAgICAgICAgICBOVUxMLCBzbyBpZ25vcmUgaXRzIHJldHVybiB2YWx1ZSAqLwpAQCAtMjM3OSw4ICsyNDQ0LDkgQEAKICAgICAgICAgICAgIHNlZ21lbnQgPSByZW1haW5pbmc7CiAgICAgICAgIH0KIAorICAgICAgICBCRUdJTl9TRUxFQ1RfTE9PUChzKQogICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCi0gICAgICAgIHRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3QocywgMCk7CisgICAgICAgIHRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3RfZXgocywgMCwgaW50ZXJ2YWwpOwogICAgICAgICBpZiAoIXRpbWVvdXQpCiAgICAgICAgICAgICBucmVhZCA9IHJlY3Yocy0+c29ja19mZCwgcmVhZF9idWYsIHNlZ21lbnQsIGZsYWdzKTsKICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKQEAgLTIzODksNiArMjQ1NSw4IEBACiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQorICAgICAgICBFTkRfU0VMRUNUX0xPT1AocykKKwogICAgICAgICBpZiAobnJlYWQgPCAwKSB7CiAgICAgICAgICAgICBzLT5lcnJvcmhhbmRsZXIoKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKQEAgLTI1NTIsOSArMjYyMCwxMCBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCisgICAgQkVHSU5fU0VMRUNUX0xPT1AocykKICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgbWVtc2V0KCZhZGRyYnVmLCAwLCBhZGRybGVuKTsKLSAgICB0aW1lb3V0ID0gaW50ZXJuYWxfc2VsZWN0KHMsIDApOworICAgIHRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3RfZXgocywgMCwgaW50ZXJ2YWwpOwogICAgIGlmICghdGltZW91dCkgewogI2lmbmRlZiBNU19XSU5ET1dTCiAjaWYgZGVmaW5lZChQWU9TX09TMikgJiYgIWRlZmluZWQoUFlDQ19HQ0MpCkBAIC0yNTc1LDYgKzI2NDQsNyBAQAogICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KKyAgICBFTkRfU0VMRUNUX0xPT1AocykKICAgICBpZiAobiA8IDApIHsKICAgICAgICAgcy0+ZXJyb3JoYW5kbGVyKCk7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTI2NTgsNyArMjcyOCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3ZsZW4sICZmbGFncykpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGJ1ZmxlbiA9IGJ1Zi5sZW47Ci0gICAgYXNzZXJ0KGJ1Zi5idWYgIT0gMCAmJiBidWZsZW4gPiAwKTsKIAogICAgIGlmIChyZWN2bGVuIDwgMCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKQEAgLTI2NjgsNiArMjczNywxMCBAQAogICAgIGlmIChyZWN2bGVuID09IDApIHsKICAgICAgICAgLyogSWYgbmJ5dGVzIHdhcyBub3Qgc3BlY2lmaWVkLCB1c2UgdGhlIGJ1ZmZlcidzIGxlbmd0aCAqLwogICAgICAgICByZWN2bGVuID0gYnVmbGVuOworICAgIH0gZWxzZSBpZiAocmVjdmxlbiA+IGJ1ZmxlbikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJuYnl0ZXMgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciIpOworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAogICAgIHJlYWRsZW4gPSBzb2NrX3JlY3Zmcm9tX2d1dHMocywgYnVmLmJ1ZiwgcmVjdmxlbiwgZmxhZ3MsICZhZGRyKTsKQEAgLTI3MTIsOCArMjc4NSw5IEBACiAgICAgYnVmID0gcGJ1Zi5idWY7CiAgICAgbGVuID0gcGJ1Zi5sZW47CiAKKyAgICBCRUdJTl9TRUxFQ1RfTE9PUChzKQogICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLSAgICB0aW1lb3V0ID0gaW50ZXJuYWxfc2VsZWN0KHMsIDEpOworICAgIHRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3RfZXgocywgMSwgaW50ZXJ2YWwpOwogICAgIGlmICghdGltZW91dCkKICNpZmRlZiBfX1ZNUwogICAgICAgICBuID0gc2VuZHNlZ21lbnRlZChzLT5zb2NrX2ZkLCBidWYsIGxlbiwgZmxhZ3MpOwpAQCAtMjcyMSwxMyArMjc5NSwxNCBAQAogICAgICAgICBuID0gc2VuZChzLT5zb2NrX2ZkLCBidWYsIGxlbiwgZmxhZ3MpOwogI2VuZGlmCiAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQotICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwotCiAgICAgaWYgKHRpbWVvdXQgPT0gMSkgeworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF90aW1lb3V0LCAidGltZWQgb3V0Iik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KKyAgICBFTkRfU0VMRUNUX0xPT1AocykKKworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwogICAgIGlmIChuIDwgMCkKICAgICAgICAgcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOwogICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyluKTsKQEAgLTI3NjEsOCArMjgzNiw5IEBACiAgICAgfQogCiAgICAgZG8geworICAgICAgICBCRUdJTl9TRUxFQ1RfTE9PUChzKQogICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCi0gICAgICAgIHRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3QocywgMSk7CisgICAgICAgIHRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3RfZXgocywgMSwgaW50ZXJ2YWwpOwogICAgICAgICBuID0gLTE7CiAgICAgICAgIGlmICghdGltZW91dCkgewogI2lmZGVmIF9fVk1TCkBAIC0yNzc3LDYgKzI4NTMsNyBAQAogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF90aW1lb3V0LCAidGltZWQgb3V0Iik7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQorICAgICAgICBFTkRfU0VMRUNUX0xPT1AocykKICAgICAgICAgLyogUHlFcnJfQ2hlY2tTaWduYWxzKCkgbWlnaHQgY2hhbmdlIGVycm5vICovCiAgICAgICAgIHNhdmVkX2Vycm5vID0gZXJybm87CiAgICAgICAgIC8qIFdlIG11c3QgcnVuIG91ciBzaWduYWwgaGFuZGxlcnMgYmVmb3JlIGxvb3BpbmcgYWdhaW4uCkBAIC0yODU2LDE3ICsyOTMzLDIwIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAorICAgIEJFR0lOX1NFTEVDVF9MT09QKHMpCiAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotICAgIHRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3QocywgMSk7CisgICAgdGltZW91dCA9IGludGVybmFsX3NlbGVjdF9leChzLCAxLCBpbnRlcnZhbCk7CiAgICAgaWYgKCF0aW1lb3V0KQogICAgICAgICBuID0gc2VuZHRvKHMtPnNvY2tfZmQsIGJ1ZiwgbGVuLCBmbGFncywgU0FTMlNBKCZhZGRyYnVmKSwgYWRkcmxlbik7CiAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwogICAgIGlmICh0aW1lb3V0ID09IDEpIHsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CisgICAgRU5EX1NFTEVDVF9MT09QKHMpCisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CiAgICAgaWYgKG4gPCAwKQogICAgICAgICByZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7CiAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKW4pOwpAQCAtMjg4Nyw3ICsyOTY3LDcgQEAKICAgICBpbnQgaG93OwogICAgIGludCByZXM7CiAKLSAgICBob3cgPSBQeUludF9Bc0xvbmcoYXJnKTsKKyAgICBob3cgPSBfUHlJbnRfQXNJbnQoYXJnKTsKICAgICBpZiAoaG93ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKQEAgLTMwNDMsOCArMzEyMywxMyBAQAogc29ja19yZXByKFB5U29ja2V0U29ja09iamVjdCAqcykKIHsKICAgICBjaGFyIGJ1Zls1MTJdOworICAgIGxvbmcgc29ja19mZDsKKyAgICAvKiBPbiBXaW5kb3dzLCB0aGlzIHRlc3QgaXMgbmVlZGVkIGJlY2F1c2UgU09DS0VUX1QgaXMgdW5zaWduZWQgKi8KKyAgICBpZiAocy0+c29ja19mZCA9PSBJTlZBTElEX1NPQ0tFVCkgeworICAgICAgICBzb2NrX2ZkID0gLTE7CisgICAgfQogI2lmIFNJWkVPRl9TT0NLRVRfVCA+IFNJWkVPRl9MT05HCi0gICAgaWYgKHMtPnNvY2tfZmQgPiBMT05HX01BWCkgeworICAgIGVsc2UgaWYgKHMtPnNvY2tfZmQgPiBMT05HX01BWCkgewogICAgICAgICAvKiB0aGlzIGNhbiBvY2N1ciBvbiBXaW42NCwgYW5kIGFjdHVhbGx5IHRoZXJlIGlzIGEgc3BlY2lhbAogICAgICAgICAgICB1Z2x5IHByaW50ZiBmb3JtYXR0ZXIgZm9yIGRlY2ltYWwgcG9pbnRlciBsZW5ndGggaW50ZWdlcgogICAgICAgICAgICBwcmludGluZywgb25seSBib3RoZXIgaWYgbmVjZXNzYXJ5Ki8KQEAgLTMwNTQsMTAgKzMxMzksMTIgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogI2VuZGlmCisgICAgZWxzZQorICAgICAgICBzb2NrX2ZkID0gKGxvbmcpcy0+c29ja19mZDsKICAgICBQeU9TX3NucHJpbnRmKAogICAgICAgICBidWYsIHNpemVvZihidWYpLAogICAgICAgICAiPHNvY2tldCBvYmplY3QsIGZkPSVsZCwgZmFtaWx5PSVkLCB0eXBlPSVkLCBwcm90b2NvbD0lZD4iLAotICAgICAgICAobG9uZylzLT5zb2NrX2ZkLCBzLT5zb2NrX2ZhbWlseSwKKyAgICAgICAgc29ja19mZCwgcy0+c29ja19mYW1pbHksCiAgICAgICAgIHMtPnNvY2tfdHlwZSwKICAgICAgICAgcy0+c29ja19wcm90byk7CiAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKQEAgLTMxMDEsMTIgKzMxODgsNyBAQAogICAgIGZkID0gc29ja2V0KGZhbWlseSwgdHlwZSwgcHJvdG8pOwogICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLSNpZmRlZiBNU19XSU5ET1dTCi0gICAgaWYgKGZkID09IElOVkFMSURfU09DS0VUKQotI2Vsc2UKLSAgICBpZiAoZmQgPCAwKQotI2VuZGlmCi0gICAgeworICAgIGlmIChmZCA9PSBJTlZBTElEX1NPQ0tFVCkgewogICAgICAgICBzZXRfZXJyb3IoKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTQwODMsMTcgKzQxNjUsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRhZGRyaW5mbygpIGFyZ3VtZW50IDEgbXVzdCBiZSBzdHJpbmcgb3IgTm9uZSIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgaWYgKFB5SW50X0NoZWNrKHBvYmopKSB7Ci0gICAgICAgIFB5T1Nfc25wcmludGYocGJ1Ziwgc2l6ZW9mKHBidWYpLCAiJWxkIiwgUHlJbnRfQXNMb25nKHBvYmopKTsKKyAgICBpZiAoUHlJbnRfQ2hlY2socG9iaikgfHwgUHlMb25nX0NoZWNrKHBvYmopKSB7CisgICAgICAgIGxvbmcgdmFsdWUgPSBQeUxvbmdfQXNMb25nKHBvYmopOworICAgICAgICBpZiAodmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeU9TX3NucHJpbnRmKHBidWYsIHNpemVvZihwYnVmKSwgIiVsZCIsIHZhbHVlKTsKICAgICAgICAgcHB0ciA9IHBidWY7CiAgICAgfSBlbHNlIGlmIChQeVN0cmluZ19DaGVjayhwb2JqKSkgewogICAgICAgICBwcHRyID0gUHlTdHJpbmdfQXNTdHJpbmcocG9iaik7CiAgICAgfSBlbHNlIGlmIChwb2JqID09IFB5X05vbmUpIHsKICAgICAgICAgcHB0ciA9IChjaGFyICopTlVMTDsKICAgICB9IGVsc2UgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAiSW50IG9yIFN0cmluZyBleHBlY3RlZCIpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImdldGFkZHJpbmZvKCkgYXJndW1lbnQgMiBtdXN0IGJlIGludGVnZXIgb3Igc3RyaW5nIik7CiAgICAgICAgIGdvdG8gZXJyOwogICAgIH0KKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgZGVmaW5lZChBSV9OVU1FUklDU0VSVikKKyAgICBpZiAoKGZsYWdzICYgQUlfTlVNRVJJQ1NFUlYpICYmIChwcHRyID09IE5VTEwgfHwgKHBwdHJbMF0gPT0gJzAnICYmIHBwdHJbMV0gPT0gMCkpKSB7CisgICAgICAgIC8qIE9uIE9TWCB1cHRvIGF0IGxlYXN0IE9TWCAxMC44IGdldGFkZHJpbmZvIGNyYXNoZXMKKwkgKiBpZiBBSV9OVU1FUklDU0VSViBpcyBzZXQgYW5kIHRoZSBzZXJ2bmFtZSBpcyBOVUxMIG9yICIwIi4KKwkgKiBUaGlzIHdvcmthcm91bmQgYXZvaWRzIGEgc2VnZmF1bHQgaW4gbGlic3lzdGVtLgorCSAqLworICAgICAgICBwcHRyID0gIjAwIjsKKyAgICB9CisjZW5kaWYKICAgICBtZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKICAgICBoaW50cy5haV9mYW1pbHkgPSBmYW1pbHk7CiAgICAgaGludHMuYWlfc29ja3R5cGUgPSBzb2NrdHlwZTsKQEAgLTQxNTYsNyArNDI1MSw4IEBACiAgICAgUHlPYmplY3QgKnNhID0gKFB5T2JqZWN0ICopTlVMTDsKICAgICBpbnQgZmxhZ3M7CiAgICAgY2hhciAqaG9zdHA7Ci0gICAgaW50IHBvcnQsIGZsb3dpbmZvLCBzY29wZV9pZDsKKyAgICBpbnQgcG9ydDsKKyAgICB1bnNpZ25lZCBpbnQgZmxvd2luZm8sIHNjb3BlX2lkOwogICAgIGNoYXIgaGJ1ZltOSV9NQVhIT1NUXSwgcGJ1ZltOSV9NQVhTRVJWXTsKICAgICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXMgPSBOVUxMOwogICAgIGludCBlcnJvcjsKQEAgLTQxNzAsOSArNDI2NiwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgImdldG5hbWVpbmZvKCkgYXJndW1lbnQgMSBtdXN0IGJlIGEgdHVwbGUiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShzYSwgInNpfGlpIiwKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoc2EsICJzaXxJSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZob3N0cCwgJnBvcnQsICZmbG93aW5mbywgJnNjb3BlX2lkKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGZsb3dpbmZvID4gMHhmZmZmZikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJnZXRzb2NrYWRkcmFyZzogZmxvd2luZm8gbXVzdCBiZSAwLTEwNDg1NzUuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICAgICBQeU9TX3NucHJpbnRmKHBidWYsIHNpemVvZihwYnVmKSwgIiVkIiwgcG9ydCk7CiAgICAgbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CiAgICAgaGludHMuYWlfZmFtaWx5ID0gQUZfVU5TUEVDOwpAQCAtNDIwNiw3ICs0MzA3LDcgQEAKICAgICAgICAgewogICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42OwogICAgICAgICBzaW42ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilyZXMtPmFpX2FkZHI7Ci0gICAgICAgIHNpbjYtPnNpbjZfZmxvd2luZm8gPSBmbG93aW5mbzsKKyAgICAgICAgc2luNi0+c2luNl9mbG93aW5mbyA9IGh0b25sKGZsb3dpbmZvKTsKICAgICAgICAgc2luNi0+c2luNl9zY29wZV9pZCA9IHNjb3BlX2lkOwogICAgICAgICBicmVhazsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zcmUuaCBiL01vZHVsZXMvc3JlLmgKaW5kZXggZDRhZjA1Yy4uMjJhMmQ1ZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zcmUuaAorKysgYi9Nb2R1bGVzL3NyZS5oCkBAIC0xNCwxMSArMTQsMjEgQEAKICNpbmNsdWRlICJzcmVfY29uc3RhbnRzLmgiCiAKIC8qIHNpemUgb2YgYSBjb2RlIHdvcmQgKG11c3QgYmUgdW5zaWduZWQgc2hvcnQgb3IgbGFyZ2VyLCBhbmQKLSAgIGxhcmdlIGVub3VnaCB0byBob2xkIGEgUHlfVU5JQ09ERSBjaGFyYWN0ZXIpICovCi0jaWZkZWYgUHlfVU5JQ09ERV9XSURFCi0jZGVmaW5lIFNSRV9DT0RFIFB5X1VDUzQKKyAgIGxhcmdlIGVub3VnaCB0byBob2xkIGEgVUNTNCBjaGFyYWN0ZXIpICovCisjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQorIyBkZWZpbmUgU1JFX0NPREUgUHlfVUNTNAorIyBpZiBTSVpFT0ZfU0laRV9UID4gNAorIyAgZGVmaW5lIFNSRV9NQVhSRVBFQVQgKH4oU1JFX0NPREUpMCkKKyMgZWxzZQorIyAgZGVmaW5lIFNSRV9NQVhSRVBFQVQgKChTUkVfQ09ERSlQWV9TU0laRV9UX01BWCkKKyMgZW5kaWYKICNlbHNlCi0jZGVmaW5lIFNSRV9DT0RFIHVuc2lnbmVkIHNob3J0CisjIGRlZmluZSBTUkVfQ09ERSB1bnNpZ25lZCBpbnQKKyMgaWYgU0laRU9GX1NJWkVfVCA+IFNJWkVPRl9JTlQKKyMgIGRlZmluZSBTUkVfTUFYUkVQRUFUICh+KFNSRV9DT0RFKTApCisjIGVsc2UKKyMgIGRlZmluZSBTUkVfTUFYUkVQRUFUICgoU1JFX0NPREUpUFlfU1NJWkVfVF9NQVgpCisjIGVuZGlmCiAjZW5kaWYKIAogdHlwZWRlZiBzdHJ1Y3QgewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zdHJvcG1vZHVsZS5jIGIvTW9kdWxlcy9zdHJvcG1vZHVsZS5jCmluZGV4IDQ2ODRiYWYuLjkxM2JlZjggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc3Ryb3Btb2R1bGUuYworKysgYi9Nb2R1bGVzL3N0cm9wbW9kdWxlLmMKQEAgLTU5Myw3ICs1OTMsNyBAQAogICAgIGNoYXIqIGU7CiAgICAgY2hhciogcDsKICAgICBjaGFyKiBxOwotICAgIFB5X3NzaXplX3QgaSwgaiwgb2xkX2o7CisgICAgUHlfc3NpemVfdCBpLCBqOwogICAgIFB5T2JqZWN0KiBvdXQ7CiAgICAgY2hhciogc3RyaW5nOwogICAgIFB5X3NzaXplX3Qgc3RyaW5nbGVuOwpAQCAtNjEwLDMwICs2MTAsMjkgQEAKICAgICB9CiAKICAgICAvKiBGaXJzdCBwYXNzOiBkZXRlcm1pbmUgc2l6ZSBvZiBvdXRwdXQgc3RyaW5nICovCi0gICAgaSA9IGogPSBvbGRfaiA9IDA7IC8qIGo6IGN1cnJlbnQgY29sdW1uOyBpOiB0b3RhbCBvZiBwcmV2aW91cyBsaW5lcyAqLworICAgIGkgPSBqID0gMDsgLyogajogY3VycmVudCBjb2x1bW47IGk6IHRvdGFsIG9mIHByZXZpb3VzIGxpbmVzICovCiAgICAgZSA9IHN0cmluZyArIHN0cmluZ2xlbjsKICAgICBmb3IgKHAgPSBzdHJpbmc7IHAgPCBlOyBwKyspIHsKICAgICAgICAgaWYgKCpwID09ICdcdCcpIHsKLSAgICAgICAgICAgIGogKz0gdGFic2l6ZSAtIChqJXRhYnNpemUpOwotICAgICAgICAgICAgaWYgKG9sZF9qID4gaikgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3IHN0cmluZyBpcyB0b28gbG9uZyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2xkX2ogPSBqOworICAgICAgICAgICAgUHlfc3NpemVfdCBpbmNyID0gdGFic2l6ZSAtIChqJXRhYnNpemUpOworICAgICAgICAgICAgaWYgKGogPiBQWV9TU0laRV9UX01BWCAtIGluY3IpCisgICAgICAgICAgICAgICAgZ290byBvdmVyZmxvdzsKKyAgICAgICAgICAgIGogKz0gaW5jcjsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChqID4gUFlfU1NJWkVfVF9NQVggLSAxKQorICAgICAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3c7CiAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICBpZiAoKnAgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgIGlmIChpID4gUFlfU1NJWkVfVF9NQVggLSBqKQorICAgICAgICAgICAgICAgICAgICBnb3RvIG92ZXJmbG93OwogICAgICAgICAgICAgICAgIGkgKz0gajsKICAgICAgICAgICAgICAgICBqID0gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICgoaSArIGopIDwgMCkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgIm5ldyBzdHJpbmcgaXMgdG9vIGxvbmciKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQorICAgIGlmIChpID4gUFlfU1NJWkVfVF9NQVggLSBqKQorICAgICAgICBnb3RvIG92ZXJmbG93OwogCiAgICAgLyogU2Vjb25kIHBhc3M6IGNyZWF0ZSBvdXRwdXQgc3RyaW5nIGFuZCBmaWxsIGl0ICovCiAgICAgb3V0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgaStqKTsKQEAgLTY1OCw2ICs2NTcsOSBAQAogICAgIH0KIAogICAgIHJldHVybiBvdXQ7CisgIG92ZXJmbG93OgorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAicmVzdWx0IGlzIHRvbyBsb25nIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zdm1vZHVsZS5jIGIvTW9kdWxlcy9zdm1vZHVsZS5jCmluZGV4IDZlNDE5Y2UuLjE1MTkwNjUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc3Ztb2R1bGUuYworKysgYi9Nb2R1bGVzL3N2bW9kdWxlLmMKQEAgLTI3OSw4ICsyNzksNyBAQAogICAgICAgICAgICAgKHZvaWQpc3ZVbmxvY2tDYXB0dXJlRGF0YShzZWxmLT5vYl9zdmlkZW8tPm9iX3N2aWRlbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+b2JfY2FwdHVyZSk7CiAgICAgICAgIHNlbGYtPm9iX2NhcHR1cmUgPSBOVUxMOwotICAgICAgICBQeV9ERUNSRUYoc2VsZi0+b2Jfc3ZpZGVvKTsKLSAgICAgICAgc2VsZi0+b2Jfc3ZpZGVvID0gTlVMTDsKKyAgICAgICAgUHlfQ0xFQVIoc2VsZi0+b2Jfc3ZpZGVvKTsKICAgICB9CiAgICAgUHlPYmplY3RfRGVsKHNlbGYpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zeW10YWJsZW1vZHVsZS5jIGIvTW9kdWxlcy9zeW10YWJsZW1vZHVsZS5jCmluZGV4IDYwZjliYTkuLmVkMmJjYzcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc3ltdGFibGVtb2R1bGUuYworKysgYi9Nb2R1bGVzL3N5bXRhYmxlbW9kdWxlLmMKQEAgLTMzLDcgKzMzLDcgQEAKICAgICBzdCA9IFB5X1N5bXRhYmxlU3RyaW5nKHN0ciwgZmlsZW5hbWUsIHN0YXJ0KTsKICAgICBpZiAoc3QgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgdCA9IHN0LT5zdF9zeW1ib2xzOworICAgIHQgPSAoUHlPYmplY3QgKilzdC0+c3RfdG9wOwogICAgIFB5X0lOQ1JFRih0KTsKICAgICBQeU1lbV9GcmVlKCh2b2lkICopc3QtPnN0X2Z1dHVyZSk7CiAgICAgUHlTeW10YWJsZV9GcmVlKHN0KTsKQEAgLTUyLDYgKzUyLDkgQEAKIHsKICAgICBQeU9iamVjdCAqbTsKIAorICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5U1RFbnRyeV9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKwogICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfc3ltdGFibGUiLCBzeW10YWJsZV9tZXRob2RzKTsKICAgICBpZiAobSA9PSBOVUxMKQogICAgICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3RocmVhZG1vZHVsZS5jIGIvTW9kdWxlcy90aHJlYWRtb2R1bGUuYwppbmRleCA0ZTQxMDg1Li5lZmM1ZDdmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3RocmVhZG1vZHVsZS5jCisrKyBiL01vZHVsZXMvdGhyZWFkbW9kdWxlLmMKQEAgLTU2LDEyICs1NiwxMiBAQAogfQogCiBQeURvY19TVFJWQVIoYWNxdWlyZV9kb2MsCi0iYWNxdWlyZShbd2FpdF0pIC0+IE5vbmUgb3IgYm9vbFxuXAorImFjcXVpcmUoW3dhaXRdKSAtPiBib29sXG5cCiAoYWNxdWlyZV9sb2NrKCkgaXMgYW4gb2Jzb2xldGUgc3lub255bSlcblwKIFxuXAogTG9jayB0aGUgbG9jay4gIFdpdGhvdXQgYXJndW1lbnQsIHRoaXMgYmxvY2tzIGlmIHRoZSBsb2NrIGlzIGFscmVhZHlcblwKIGxvY2tlZCAoZXZlbiBieSB0aGUgc2FtZSB0aHJlYWQpLCB3YWl0aW5nIGZvciBhbm90aGVyIHRocmVhZCB0byByZWxlYXNlXG5cCi10aGUgbG9jaywgYW5kIHJldHVybiBOb25lIG9uY2UgdGhlIGxvY2sgaXMgYWNxdWlyZWQuXG5cCit0aGUgbG9jaywgYW5kIHJldHVybiBUcnVlIG9uY2UgdGhlIGxvY2sgaXMgYWNxdWlyZWQuXG5cCiBXaXRoIGFuIGFyZ3VtZW50LCB0aGlzIHdpbGwgb25seSBibG9jayBpZiB0aGUgYXJndW1lbnQgaXMgdHJ1ZSxcblwKIGFuZCB0aGUgcmV0dXJuIHZhbHVlIHJlZmxlY3RzIHdoZXRoZXIgdGhlIGxvY2sgaXMgYWNxdWlyZWQuXG5cCiBUaGUgYmxvY2tpbmcgb3BlcmF0aW9uIGlzIG5vdCBpbnRlcnJ1cHRpYmxlLiIpOwpAQCAtNjE4LDYgKzYxOCw4IEBACiAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICpmaWxlOworICAgICAgICAgICAgUHlPYmplY3QgKmV4YywgKnZhbHVlLCAqdGI7CisgICAgICAgICAgICBQeUVycl9GZXRjaCgmZXhjLCAmdmFsdWUsICZ0Yik7CiAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigKICAgICAgICAgICAgICAgICAiVW5oYW5kbGVkIGV4Y2VwdGlvbiBpbiB0aHJlYWQgc3RhcnRlZCBieSAiKTsKICAgICAgICAgICAgIGZpbGUgPSBQeVN5c19HZXRPYmplY3QoInN0ZGVyciIpOwpAQCAtNjI2LDYgKzYyOCw3IEBACiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgUHlPYmplY3RfUHJpbnQoYm9vdC0+ZnVuYywgc3RkZXJyLCAwKTsKICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJcbiIpOworICAgICAgICAgICAgUHlFcnJfUmVzdG9yZShleGMsIHZhbHVlLCB0Yik7CiAgICAgICAgICAgICBQeUVycl9QcmludEV4KDApOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy90aW1lbW9kdWxlLmMgYi9Nb2R1bGVzL3RpbWVtb2R1bGUuYwppbmRleCAzOTdjZjhjLi4xMmM0M2IwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3RpbWVtb2R1bGUuYworKysgYi9Nb2R1bGVzL3RpbWVtb2R1bGUuYwpAQCAtOTYsNyArOTYsNyBAQAogc3RhdGljIGRvdWJsZSBmbG9hdHRpbWUodm9pZCk7CiAKIC8qIEZvciBZMksgY2hlY2sgKi8KLXN0YXRpYyBQeU9iamVjdCAqbW9kZGljdDsKK3N0YXRpYyBQeU9iamVjdCAqbW9kZGljdCA9IE5VTEw7CiAKIC8qIEV4cG9zZWQgaW4gdGltZWZ1bmNzLmguICovCiB0aW1lX3QKQEAgLTg1OCw2ICs4NTgsMTEgQEAKICAgICAvKiBBY2NlcHQgMi1kaWdpdCBkYXRlcyB1bmxlc3MgUFlUSE9OWTJLIGlzIHNldCBhbmQgbm9uLWVtcHR5ICovCiAgICAgcCA9IFB5X0dFVEVOVigiUFlUSE9OWTJLIik7CiAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImFjY2VwdDJkeWVhciIsIChsb25nKSAoIXAgfHwgISpwKSk7CisgICAgLyogSWYgYW4gZW1iZWRkZWQgaW50ZXJwcmV0ZXIgaXMgc2h1dGRvd24gYW5kIHJlaW5pdGlhbGl6ZWQgdGhlIG9sZAorICAgICAgIG1vZGRpY3Qgd2FzIG5vdCBkZWNyZWZlZCBvbiBzaHV0ZG93biBhbmQgdGhlIG5leHQgaW1wb3J0IG9mIHRoaXMKKyAgICAgICBtb2R1bGUgbGVhZHMgdG8gYSBsZWFrLiAgQ29uZGl0aW9uYWxseSBkZWNyZWYgaGVyZSB0byBwcmV2ZW50IHRoYXQuCisgICAgKi8KKyAgICBQeV9YREVDUkVGKG1vZGRpY3QpOwogICAgIC8qIFNxdWlycmVsIGF3YXkgdGhlIG1vZHVsZSdzIGRpY3Rpb25hcnkgZm9yIHRoZSB5MmsgY2hlY2sgKi8KICAgICBtb2RkaWN0ID0gUHlNb2R1bGVfR2V0RGljdChtKTsKICAgICBQeV9JTkNSRUYobW9kZGljdCk7CkBAIC0xMDUxLDQgKzEwNTYsOSBAQAogICAgIHJldHVybiAwOwogfQogCi0KKy8qIGV4cG9ydCBmbG9hdHRpbWUgdG8gc29ja2V0bW9kdWxlLmMgKi8KK1B5QVBJX0ZVTkMoZG91YmxlKQorX1B5VGltZV9GbG9hdFRpbWUodm9pZCkKK3sKKyAgICByZXR1cm4gZmxvYXR0aW1lKCk7Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3VuaWNvZGVkYXRhLmMgYi9Nb2R1bGVzL3VuaWNvZGVkYXRhLmMKaW5kZXggMTQ0NWE5NS4uNmY5YzdlOCAxMDA2NDQKLS0tIGEvTW9kdWxlcy91bmljb2RlZGF0YS5jCisrKyBiL01vZHVsZXMvdW5pY29kZWRhdGEuYwpAQCAtMjc0LDcgKzI3NCw3IEBACiBQeURvY19TVFJWQVIodW5pY29kZWRhdGFfYmlkaXJlY3Rpb25hbF9fZG9jX18sCiAiYmlkaXJlY3Rpb25hbCh1bmljaHIpXG5cCiBcblwKLVJldHVybnMgdGhlIGJpZGlyZWN0aW9uYWwgY2F0ZWdvcnkgYXNzaWduZWQgdG8gdGhlIFVuaWNvZGUgY2hhcmFjdGVyXG5cCitSZXR1cm5zIHRoZSBiaWRpcmVjdGlvbmFsIGNsYXNzIGFzc2lnbmVkIHRvIHRoZSBVbmljb2RlIGNoYXJhY3RlclxuXAogdW5pY2hyIGFzIHN0cmluZy4gSWYgbm8gc3VjaCB2YWx1ZSBpcyBkZWZpbmVkLCBhbiBlbXB0eSBzdHJpbmcgaXNcblwKIHJldHVybmVkLiIpOwogCkBAIC01MDYsNyArNTA2LDcgQEAKIAogICAgIHN0YWNrcHRyID0gMDsKICAgICBpc2l6ZSA9IFB5VW5pY29kZV9HRVRfU0laRShpbnB1dCk7Ci0gICAgLyogT3ZlcmFsbG9jYXRlIGF0bW9zdCAxMCBjaGFyYWN0ZXJzLiAqLworICAgIC8qIE92ZXJhbGxvY2F0ZSBhdCBtb3N0IDEwIGNoYXJhY3RlcnMuICovCiAgICAgc3BhY2UgPSAoaXNpemUgPiAxMCA/IDEwIDogaXNpemUpICsgaXNpemU7CiAgICAgcmVzdWx0ID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIHNwYWNlKTsKICAgICBpZiAoIXJlc3VsdCkKQEAgLTUyMCw3ICs1MjAsNyBAQAogICAgICAgICB3aGlsZShzdGFja3B0cikgewogICAgICAgICAgICAgUHlfVU5JQ09ERSBjb2RlID0gc3RhY2tbLS1zdGFja3B0cl07CiAgICAgICAgICAgICAvKiBIYW5ndWwgRGVjb21wb3NpdGlvbiBhZGRzIHRocmVlIGNoYXJhY3RlcnMgaW4KLSAgICAgICAgICAgICAgIGEgc2luZ2xlIHN0ZXAsIHNvIHdlIG5lZWQgYXRsZWFzdCB0aGF0IG11Y2ggcm9vbS4gKi8KKyAgICAgICAgICAgICAgIGEgc2luZ2xlIHN0ZXAsIHNvIHdlIG5lZWQgYXQgbGVhc3QgdGhhdCBtdWNoIHJvb20uICovCiAgICAgICAgICAgICBpZiAoc3BhY2UgPCAzKSB7CiAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBuZXdzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUocmVzdWx0KSArIDEwOwogICAgICAgICAgICAgICAgIHNwYWNlICs9IDEwOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy96aXBpbXBvcnQuYyBiL01vZHVsZXMvemlwaW1wb3J0LmMKaW5kZXggYjdhMWI4ZC4uNzI0MGNiNCAxMDA2NDQKLS0tIGEvTW9kdWxlcy96aXBpbXBvcnQuYworKysgYi9Nb2R1bGVzL3ppcGltcG9ydC5jCkBAIC03MDksNyArNzA5LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAiJyUuMjAwcyciLCBhcmNoaXZlKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGZzZWVrKGZwLCAtMjIsIFNFRUtfRU5EKTsKKworICAgIGlmIChmc2VlayhmcCwgLTIyLCBTRUVLX0VORCkgPT0gLTEpIHsKKyAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFppcEltcG9ydEVycm9yLCAiY2FuJ3QgcmVhZCBaaXAgZmlsZTogJXMiLCBhcmNoaXZlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICAgIGhlYWRlcl9wb3NpdGlvbiA9IGZ0ZWxsKGZwKTsKICAgICBpZiAoZnJlYWQoZW5kb2ZfY2VudHJhbF9kaXIsIDEsIDIyLCBmcCkgIT0gMjIpIHsKICAgICAgICAgZmNsb3NlKGZwKTsKQEAgLTc0MywxMSArNzQ4LDEzIEBACiAgICAgICAgIFB5T2JqZWN0ICp0OwogICAgICAgICBpbnQgZXJyOwogCi0gICAgICAgIGZzZWVrKGZwLCBoZWFkZXJfb2Zmc2V0LCAwKTsgIC8qIFN0YXJ0IG9mIGZpbGUgaGVhZGVyICovCisgICAgICAgIGlmIChmc2VlayhmcCwgaGVhZGVyX29mZnNldCwgMCkgPT0gLTEpICAvKiBTdGFydCBvZiBmaWxlIGhlYWRlciAqLworICAgICAgICAgICAgZ290byBmc2Vla19lcnJvcjsKICAgICAgICAgbCA9IFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKGZwKTsKICAgICAgICAgaWYgKGwgIT0gMHgwMjAxNEI1MCkKICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgLyogQmFkOiBDZW50cmFsIERpciBGaWxlIEhlYWRlciAqLwotICAgICAgICBmc2VlayhmcCwgaGVhZGVyX29mZnNldCArIDEwLCAwKTsKKyAgICAgICAgaWYgKGZzZWVrKGZwLCBoZWFkZXJfb2Zmc2V0ICsgMTAsIDApID09IC0xKQorICAgICAgICAgICAgZ290byBmc2Vla19lcnJvcjsKICAgICAgICAgY29tcHJlc3MgPSBQeU1hcnNoYWxfUmVhZFNob3J0RnJvbUZpbGUoZnApOwogICAgICAgICB0aW1lID0gUHlNYXJzaGFsX1JlYWRTaG9ydEZyb21GaWxlKGZwKTsKICAgICAgICAgZGF0ZSA9IFB5TWFyc2hhbF9SZWFkU2hvcnRGcm9tRmlsZShmcCk7CkBAIC03NTgsNyArNzY1LDggQEAKICAgICAgICAgaGVhZGVyX3NpemUgPSA0NiArIG5hbWVfc2l6ZSArCiAgICAgICAgICAgIFB5TWFyc2hhbF9SZWFkU2hvcnRGcm9tRmlsZShmcCkgKwogICAgICAgICAgICBQeU1hcnNoYWxfUmVhZFNob3J0RnJvbUZpbGUoZnApOwotICAgICAgICBmc2VlayhmcCwgaGVhZGVyX29mZnNldCArIDQyLCAwKTsKKyAgICAgICAgaWYgKGZzZWVrKGZwLCBoZWFkZXJfb2Zmc2V0ICsgNDIsIDApID09IC0xKQorICAgICAgICAgICAgZ290byBmc2Vla19lcnJvcjsKICAgICAgICAgZmlsZV9vZmZzZXQgPSBQeU1hcnNoYWxfUmVhZExvbmdGcm9tRmlsZShmcCkgKyBhcmNfb2Zmc2V0OwogICAgICAgICBpZiAobmFtZV9zaXplID4gTUFYUEFUSExFTikKICAgICAgICAgICAgIG5hbWVfc2l6ZSA9IE1BWFBBVEhMRU47CkBAIC03OTAsNiArNzk4LDExIEBACiAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIjIHppcGltcG9ydDogZm91bmQgJWxkIG5hbWVzIGluICVzXG4iLAogICAgICAgICAgICAgY291bnQsIGFyY2hpdmUpOwogICAgIHJldHVybiBmaWxlczsKK2ZzZWVrX2Vycm9yOgorICAgIGZjbG9zZShmcCk7CisgICAgUHlfWERFQ1JFRihmaWxlcyk7CisgICAgUHlFcnJfRm9ybWF0KFppcEltcG9ydEVycm9yLCAiY2FuJ3QgcmVhZCBaaXAgZmlsZTogJXMiLCBhcmNoaXZlKTsKKyAgICByZXR1cm4gTlVMTDsKIGVycm9yOgogICAgIGZjbG9zZShmcCk7CiAgICAgUHlfWERFQ1JFRihmaWxlcyk7CkBAIC04NTcsNyArODcwLDEyIEBACiAgICAgfQogCiAgICAgLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBsb2NhbCBmaWxlIGhlYWRlciBpcyBjb3JyZWN0ICovCi0gICAgZnNlZWsoZnAsIGZpbGVfb2Zmc2V0LCAwKTsKKyAgICBpZiAoZnNlZWsoZnAsIGZpbGVfb2Zmc2V0LCAwKSA9PSAtMSkgeworICAgICAgICBmY2xvc2UoZnApOworICAgICAgICBQeUVycl9Gb3JtYXQoWmlwSW1wb3J0RXJyb3IsICJjYW4ndCByZWFkIFppcCBmaWxlOiAlcyIsIGFyY2hpdmUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKICAgICBsID0gUHlNYXJzaGFsX1JlYWRMb25nRnJvbUZpbGUoZnApOwogICAgIGlmIChsICE9IDB4MDQwMzRCNTApIHsKICAgICAgICAgLyogQmFkOiBMb2NhbCBGaWxlIEhlYWRlciAqLwpAQCAtODY3LDcgKzg4NSwxMiBAQAogICAgICAgICBmY2xvc2UoZnApOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgZnNlZWsoZnAsIGZpbGVfb2Zmc2V0ICsgMjYsIDApOworICAgIGlmIChmc2VlayhmcCwgZmlsZV9vZmZzZXQgKyAyNiwgMCkgPT0gLTEpIHsKKyAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFppcEltcG9ydEVycm9yLCAiY2FuJ3QgcmVhZCBaaXAgZmlsZTogJXMiLCBhcmNoaXZlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCiAgICAgbCA9IDMwICsgUHlNYXJzaGFsX1JlYWRTaG9ydEZyb21GaWxlKGZwKSArCiAgICAgICAgIFB5TWFyc2hhbF9SZWFkU2hvcnRGcm9tRmlsZShmcCk7ICAgICAgICAvKiBsb2NhbCBoZWFkZXIgc2l6ZSAqLwogICAgIGZpbGVfb2Zmc2V0ICs9IGw7ICAgICAgICAgICAvKiBTdGFydCBvZiBmaWxlIGRhdGEgKi8KQEAgLTg4MSw4ICs5MDQsMTMgQEAKICAgICBidWYgPSBQeVN0cmluZ19Bc1N0cmluZyhyYXdfZGF0YSk7CiAKICAgICBlcnIgPSBmc2VlayhmcCwgZmlsZV9vZmZzZXQsIDApOwotICAgIGlmIChlcnIgPT0gMCkKKyAgICBpZiAoZXJyID09IDApIHsKICAgICAgICAgYnl0ZXNfcmVhZCA9IGZyZWFkKGJ1ZiwgMSwgZGF0YV9zaXplLCBmcCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFppcEltcG9ydEVycm9yLCAiY2FuJ3QgcmVhZCBaaXAgZmlsZTogJXMiLCBhcmNoaXZlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICAgIGZjbG9zZShmcCk7CiAgICAgaWYgKGVyciB8fCBieXRlc19yZWFkICE9IGRhdGFfc2l6ZSkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwKZGlmZiAtLWdpdCBhL01vZHVsZXMvemxpYi9kZWZsYXRlLmMgYi9Nb2R1bGVzL3psaWIvZGVmbGF0ZS5jCmluZGV4IDI5Y2UxZjYuLjRjNmRmMDAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvemxpYi9kZWZsYXRlLmMKKysrIGIvTW9kdWxlcy96bGliL2RlZmxhdGUuYwpAQCAtMTYzLDcgKzE2Myw3IEBACiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogVXBkYXRlIGEgaGFzaCB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBpbnB1dCBieXRlCi0gKiBJTiAgYXNzZXJ0aW9uOiBhbGwgY2FsbHMgdG8gdG8gVVBEQVRFX0hBU0ggYXJlIG1hZGUgd2l0aCBjb25zZWN1dGl2ZQorICogSU4gIGFzc2VydGlvbjogYWxsIGNhbGxzIHRvIFVQREFURV9IQVNIIGFyZSBtYWRlIHdpdGggY29uc2VjdXRpdmUKICAqICAgIGlucHV0IGNoYXJhY3RlcnMsIHNvIHRoYXQgYSBydW5uaW5nIGhhc2gga2V5IGNhbiBiZSBjb21wdXRlZCBmcm9tIHRoZQogICogICAgcHJldmlvdXMga2V5IGluc3RlYWQgb2YgY29tcGxldGUgcmVjYWxjdWxhdGlvbiBlYWNoIHRpbWUuCiAgKi8KQEAgLTE3Niw3ICsxNzYsNyBAQAogICogdGhlIHByZXZpb3VzIGxlbmd0aCBvZiB0aGUgaGFzaCBjaGFpbi4KICAqIElmIHRoaXMgZmlsZSBpcyBjb21waWxlZCB3aXRoIC1ERkFTVEVTVCwgdGhlIGNvbXByZXNzaW9uIGxldmVsIGlzIGZvcmNlZAogICogdG8gMSwgYW5kIG5vIGhhc2ggY2hhaW5zIGFyZSBtYWludGFpbmVkLgotICogSU4gIGFzc2VydGlvbjogYWxsIGNhbGxzIHRvIHRvIElOU0VSVF9TVFJJTkcgYXJlIG1hZGUgd2l0aCBjb25zZWN1dGl2ZQorICogSU4gIGFzc2VydGlvbjogYWxsIGNhbGxzIHRvIElOU0VSVF9TVFJJTkcgYXJlIG1hZGUgd2l0aCBjb25zZWN1dGl2ZQogICogICAgaW5wdXQgY2hhcmFjdGVycyBhbmQgdGhlIGZpcnN0IE1JTl9NQVRDSCBieXRlcyBvZiBzdHIgYXJlIHZhbGlkCiAgKiAgICAoZXhjZXB0IGZvciB0aGUgbGFzdCBNSU5fTUFUQ0gtMSBieXRlcyBvZiB0aGUgaW5wdXQgZmlsZSkuCiAgKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvemxpYi96bGliLmggYi9Nb2R1bGVzL3psaWIvemxpYi5oCmluZGV4IDAyMjgxNzkuLmZkYTdiMTkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvemxpYi96bGliLmgKKysrIGIvTW9kdWxlcy96bGliL3psaWIuaApAQCAtNzY0LDcgKzc2NCw3IEBACiAgICAgaW5mbGF0ZVN5bmMgcmV0dXJucyBaX09LIGlmIGEgZnVsbCBmbHVzaCBwb2ludCBoYXMgYmVlbiBmb3VuZCwgWl9CVUZfRVJST1IKICAgaWYgbm8gbW9yZSBpbnB1dCB3YXMgcHJvdmlkZWQsIFpfREFUQV9FUlJPUiBpZiBubyBmbHVzaCBwb2ludCBoYXMgYmVlbiBmb3VuZCwKICAgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdHJ1Y3R1cmUgd2FzIGluY29uc2lzdGVudC4gSW4gdGhlIHN1Y2Nlc3MKLSAgY2FzZSwgdGhlIGFwcGxpY2F0aW9uIG1heSBzYXZlIHRoZSBjdXJyZW50IGN1cnJlbnQgdmFsdWUgb2YgdG90YWxfaW4gd2hpY2gKKyAgY2FzZSwgdGhlIGFwcGxpY2F0aW9uIG1heSBzYXZlIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRvdGFsX2luIHdoaWNoCiAgIGluZGljYXRlcyB3aGVyZSB2YWxpZCBjb21wcmVzc2VkIGRhdGEgd2FzIGZvdW5kLiBJbiB0aGUgZXJyb3IgY2FzZSwgdGhlCiAgIGFwcGxpY2F0aW9uIG1heSByZXBlYXRlZGx5IGNhbGwgaW5mbGF0ZVN5bmMsIHByb3ZpZGluZyBtb3JlIGlucHV0IGVhY2ggdGltZSwKICAgdW50aWwgc3VjY2VzcyBvciBlbmQgb2YgdGhlIGlucHV0IGRhdGEuCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3psaWJtb2R1bGUuYyBiL01vZHVsZXMvemxpYm1vZHVsZS5jCmluZGV4IDAzNWFhOGUuLjUxOWFmOTQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvemxpYm1vZHVsZS5jCisrKyBiL01vZHVsZXMvemxpYm1vZHVsZS5jCkBAIC0xMDEsNyArMTAxLDcgQEAKIFB5RG9jX1NUUlZBUihjb21wcmVzc29ial9fZG9jX18sCiAiY29tcHJlc3NvYmooW2xldmVsXSkgLS0gUmV0dXJuIGEgY29tcHJlc3NvciBvYmplY3QuXG4iCiAiXG4iCi0iT3B0aW9uYWwgYXJnIGxldmVsIGlzIHRoZSBjb21wcmVzc2lvbiBsZXZlbCwgaW4gMS05LiIpOworIk9wdGlvbmFsIGFyZyBsZXZlbCBpcyB0aGUgY29tcHJlc3Npb24gbGV2ZWwsIGluIDAtOS4iKTsKIAogUHlEb2NfU1RSVkFSKGRlY29tcHJlc3NvYmpfX2RvY19fLAogImRlY29tcHJlc3NvYmooW3diaXRzXSkgLS0gUmV0dXJuIGEgZGVjb21wcmVzc29yIG9iamVjdC5cbiIKQEAgLTEzMiw3ICsxMzIsNyBAQAogUHlEb2NfU1RSVkFSKGNvbXByZXNzX19kb2NfXywKICJjb21wcmVzcyhzdHJpbmdbLCBsZXZlbF0pIC0tIFJldHVybmVkIGNvbXByZXNzZWQgc3RyaW5nLlxuIgogIlxuIgotIk9wdGlvbmFsIGFyZyBsZXZlbCBpcyB0aGUgY29tcHJlc3Npb24gbGV2ZWwsIGluIDEtOS4iKTsKKyJPcHRpb25hbCBhcmcgbGV2ZWwgaXMgdGhlIGNvbXByZXNzaW9uIGxldmVsLCBpbiAwLTkuIik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeVpsaWJfY29tcHJlc3MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQpAQCAtNDY3LDYgKzQ2Nyw0OSBAQAogICAgIHJldHVybiBSZXRWYWw7CiB9CiAKKy8qIEhlbHBlciBmb3Igb2JqZGVjb21wcmVzcygpIGFuZCB1bmZsdXNoKCkuIFNhdmVzIGFueSB1bmNvbnN1bWVkIGlucHV0IGRhdGEgaW4KKyAgIHNlbGYtPnVudXNlZF9kYXRhIG9yIHNlbGYtPnVuY29uc3VtZWRfdGFpbCwgYXMgYXBwcm9wcmlhdGUuICovCitzdGF0aWMgaW50CitzYXZlX3VuY29uc3VtZWRfaW5wdXQoY29tcG9iamVjdCAqc2VsZiwgaW50IGVycikKK3sKKyAgICBpZiAoZXJyID09IFpfU1RSRUFNX0VORCkgeworICAgICAgICAvKiBUaGUgZW5kIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgaGFzIGJlZW4gcmVhY2hlZC4gU3RvcmUgdGhlIGxlZnRvdmVyCisgICAgICAgICAgIGlucHV0IGRhdGEgaW4gc2VsZi0+dW51c2VkX2RhdGEuICovCisgICAgICAgIGlmIChzZWxmLT56c3QuYXZhaWxfaW4gPiAwKSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IG9sZF9zaXplID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZi0+dW51c2VkX2RhdGEpOworICAgICAgICAgICAgUHlfc3NpemVfdCBuZXdfc2l6ZTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpuZXdfZGF0YTsKKyAgICAgICAgICAgIGlmIChzZWxmLT56c3QuYXZhaWxfaW4gPiBQWV9TU0laRV9UX01BWCAtIG9sZF9zaXplKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXdfc2l6ZSA9IG9sZF9zaXplICsgc2VsZi0+enN0LmF2YWlsX2luOworICAgICAgICAgICAgbmV3X2RhdGEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuZXdfc2l6ZSk7CisgICAgICAgICAgICBpZiAobmV3X2RhdGEgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBQeV9NRU1DUFkoUHlTdHJpbmdfQVNfU1RSSU5HKG5ld19kYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoc2VsZi0+dW51c2VkX2RhdGEpLCBvbGRfc2l6ZSk7CisgICAgICAgICAgICBQeV9NRU1DUFkoUHlTdHJpbmdfQVNfU1RSSU5HKG5ld19kYXRhKSArIG9sZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnpzdC5uZXh0X2luLCBzZWxmLT56c3QuYXZhaWxfaW4pOworICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYtPnVudXNlZF9kYXRhKTsKKyAgICAgICAgICAgIHNlbGYtPnVudXNlZF9kYXRhID0gbmV3X2RhdGE7CisgICAgICAgICAgICBzZWxmLT56c3QuYXZhaWxfaW4gPSAwOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzZWxmLT56c3QuYXZhaWxfaW4gPiAwIHx8IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYtPnVuY29uc3VtZWRfdGFpbCkpIHsKKyAgICAgICAgLyogVGhpcyBjb2RlIGhhbmRsZXMgdHdvIGRpc3RpbmN0IGNhc2VzOgorICAgICAgICAgICAxLiBPdXRwdXQgbGltaXQgd2FzIHJlYWNoZWQuIFNhdmUgbGVmdG92ZXIgaW5wdXQgaW4gdW5jb25zdW1lZF90YWlsLgorICAgICAgICAgICAyLiBBbGwgaW5wdXQgZGF0YSB3YXMgY29uc3VtZWQuIENsZWFyIHVuY29uc3VtZWRfdGFpbC4gKi8KKyAgICAgICAgUHlPYmplY3QgKm5ld19kYXRhID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAgICAgICAgICAgKGNoYXIgKilzZWxmLT56c3QubmV4dF9pbiwgc2VsZi0+enN0LmF2YWlsX2luKTsKKyAgICAgICAgaWYgKG5ld19kYXRhID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmLT51bmNvbnN1bWVkX3RhaWwpOworICAgICAgICBzZWxmLT51bmNvbnN1bWVkX3RhaWwgPSBuZXdfZGF0YTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKIFB5RG9jX1NUUlZBUihkZWNvbXBfZGVjb21wcmVzc19fZG9jX18sCiAiZGVjb21wcmVzcyhkYXRhLCBtYXhfbGVuZ3RoKSAtLSBSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgZGVjb21wcmVzc2VkXG4iCiAidmVyc2lvbiBvZiB0aGUgZGF0YS5cbiIKQEAgLTU0MSw0MyArNTg0LDIwIEBACiAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAgICAgfQogCi0gICAgaWYobWF4X2xlbmd0aCkgewotICAgICAgICAvKiBOb3QgYWxsIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgY291bGQgYmUgYWNjb21tb2RhdGVkIGluIGEgYnVmZmVyIG9mCi0gICAgICAgICAgIHRoZSBzcGVjaWZpZWQgc2l6ZS4gUmV0dXJuIHRoZSB1bmNvbnN1bWVkIHRhaWwgaW4gYW4gYXR0cmlidXRlLiAqLwotICAgICAgICBQeV9ERUNSRUYoc2VsZi0+dW5jb25zdW1lZF90YWlsKTsKLSAgICAgICAgc2VsZi0+dW5jb25zdW1lZF90YWlsID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilzZWxmLT56c3QubmV4dF9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+enN0LmF2YWlsX2luKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc2VsZi0+dW5jb25zdW1lZF90YWlsKSA+IDApIHsKLSAgICAgICAgLyogQWxsIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgd2FzIGNvbnN1bWVkLiBDbGVhciB1bmNvbnN1bWVkX3RhaWwuICovCi0gICAgICAgIFB5X0RFQ1JFRihzZWxmLT51bmNvbnN1bWVkX3RhaWwpOwotICAgICAgICBzZWxmLT51bmNvbnN1bWVkX3RhaWwgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgiIiwgMCk7Ci0gICAgfQotICAgIGlmKCFzZWxmLT51bmNvbnN1bWVkX3RhaWwpIHsKKyAgICBpZiAoc2F2ZV91bmNvbnN1bWVkX2lucHV0KHNlbGYsIGVycikgPCAwKSB7CiAgICAgICAgIFB5X0RFQ1JFRihSZXRWYWwpOwogICAgICAgICBSZXRWYWwgPSBOVUxMOwogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAotICAgIC8qIFRoZSBlbmQgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBoYXMgYmVlbiByZWFjaGVkLCBzbyBzZXQgdGhlCi0gICAgICAgdW51c2VkX2RhdGEgYXR0cmlidXRlIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHJlbWFpbmRlciBvZiB0aGUKLSAgICAgICBkYXRhIGluIHRoZSBzdHJpbmcuICBOb3RlIHRoYXQgdGhpcyBpcyBhbHNvIGEgbG9naWNhbCBwbGFjZSB0byBjYWxsCi0gICAgICAgaW5mbGF0ZUVuZCwgYnV0IHRoZSBvbGQgYmVoYXZpb3VyIG9mIG9ubHkgY2FsbGluZyBpdCBvbiBmbHVzaCgpIGlzCi0gICAgICAgcHJlc2VydmVkLgotICAgICovCi0gICAgaWYgKGVyciA9PSBaX1NUUkVBTV9FTkQpIHsKLSAgICAgICAgUHlfWERFQ1JFRihzZWxmLT51bnVzZWRfZGF0YSk7ICAvKiBGcmVlIG9yaWdpbmFsIGVtcHR5IHN0cmluZyAqLwotICAgICAgICBzZWxmLT51bnVzZWRfZGF0YSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAotICAgICAgICAgICAgKGNoYXIgKilzZWxmLT56c3QubmV4dF9pbiwgc2VsZi0+enN0LmF2YWlsX2luKTsKLSAgICAgICAgaWYgKHNlbGYtPnVudXNlZF9kYXRhID09IE5VTEwpIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihSZXRWYWwpOwotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQorICAgIC8qIFRoaXMgaXMgdGhlIGxvZ2ljYWwgcGxhY2UgdG8gY2FsbCBpbmZsYXRlRW5kLCBidXQgdGhlIG9sZCBiZWhhdmlvdXIgb2YKKyAgICAgICBvbmx5IGNhbGxpbmcgaXQgb24gZmx1c2goKSBpcyBwcmVzZXJ2ZWQuICovCisKKyAgICBpZiAoZXJyICE9IFpfU1RSRUFNX0VORCAmJiBlcnIgIT0gWl9PSyAmJiBlcnIgIT0gWl9CVUZfRVJST1IpIHsKICAgICAgICAgLyogV2Ugd2lsbCBvbmx5IGdldCBaX0JVRl9FUlJPUiBpZiB0aGUgb3V0cHV0IGJ1ZmZlciB3YXMgZnVsbAogICAgICAgICAgICBidXQgdGhlcmUgd2Fzbid0IG1vcmUgb3V0cHV0IHdoZW4gd2UgdHJpZWQgYWdhaW4sIHNvIGl0IGlzCiAgICAgICAgICAgIG5vdCBhbiBlcnJvciBjb25kaXRpb24uCiAgICAgICAgICovCi0gICAgfSBlbHNlIGlmIChlcnIgIT0gWl9PSyAmJiBlcnIgIT0gWl9CVUZfRVJST1IpIHsKICAgICAgICAgemxpYl9lcnJvcihzZWxmLT56c3QsIGVyciwgIndoaWxlIGRlY29tcHJlc3NpbmciKTsKICAgICAgICAgUHlfREVDUkVGKFJldFZhbCk7CiAgICAgICAgIFJldFZhbCA9IE5VTEw7CkBAIC04MTAsNiArODMwLDggQEAKICAgICBFTlRFUl9aTElCCiAKICAgICBzdGFydF90b3RhbF9vdXQgPSBzZWxmLT56c3QudG90YWxfb3V0OworICAgIHNlbGYtPnpzdC5hdmFpbF9pbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYtPnVuY29uc3VtZWRfdGFpbCk7CisgICAgc2VsZi0+enN0Lm5leHRfaW4gPSAoQnl0ZSAqKVB5U3RyaW5nX0FTX1NUUklORyhzZWxmLT51bmNvbnN1bWVkX3RhaWwpOwogICAgIHNlbGYtPnpzdC5hdmFpbF9vdXQgPSBsZW5ndGg7CiAgICAgc2VsZi0+enN0Lm5leHRfb3V0ID0gKEJ5dGUgKilQeVN0cmluZ19BU19TVFJJTkcocmV0dmFsKTsKIApAQCAtODMxLDYgKzg1MywxMiBAQAogICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogICAgIH0KIAorICAgIGlmIChzYXZlX3VuY29uc3VtZWRfaW5wdXQoc2VsZiwgZXJyKSA8IDApIHsKKyAgICAgICAgUHlfREVDUkVGKHJldHZhbCk7CisgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCiAgICAgLyogSWYgZmx1c2htb2RlIGlzIFpfRklOSVNILCB3ZSBhbHNvIGhhdmUgdG8gY2FsbCBkZWZsYXRlRW5kKCkgdG8gZnJlZQogICAgICAgIHZhcmlvdXMgZGF0YSBzdHJ1Y3R1cmVzLiBOb3RlIHdlIHNob3VsZCBvbmx5IGdldCBaX1NUUkVBTV9FTkQgd2hlbgogICAgICAgIGZsdXNobW9kZSBpcyBaX0ZJTklTSCAqLwpAQCAtODQ0LDYgKzg3Miw3IEBACiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAgICAgfQorCiAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0dmFsLCBzZWxmLT56c3QudG90YWxfb3V0IC0gc3RhcnRfdG90YWxfb3V0KTsKIAogZXJyb3I6CkBAIC0xMDEwLDcgKzEwMzksNyBAQAogInpsaWIgbGlicmFyeSwgd2hpY2ggaXMgYmFzZWQgb24gR05VIHppcC5cbiIKICJcbiIKICJhZGxlcjMyKHN0cmluZ1ssIHN0YXJ0XSkgLS0gQ29tcHV0ZSBhbiBBZGxlci0zMiBjaGVja3N1bS5cbiIKLSJjb21wcmVzcyhzdHJpbmdbLCBsZXZlbF0pIC0tIENvbXByZXNzIHN0cmluZywgd2l0aCBjb21wcmVzc2lvbiBsZXZlbCBpbiAxLTkuXG4iCisiY29tcHJlc3Moc3RyaW5nWywgbGV2ZWxdKSAtLSBDb21wcmVzcyBzdHJpbmcsIHdpdGggY29tcHJlc3Npb24gbGV2ZWwgaW4gMC05LlxuIgogImNvbXByZXNzb2JqKFtsZXZlbF0pIC0tIFJldHVybiBhIGNvbXByZXNzb3Igb2JqZWN0LlxuIgogImNyYzMyKHN0cmluZ1ssIHN0YXJ0XSkgLS0gQ29tcHV0ZSBhIENSQy0zMiBjaGVja3N1bS5cbiIKICJkZWNvbXByZXNzKHN0cmluZyxbd2JpdHNdLFtidWZzaXplXSkgLS0gRGVjb21wcmVzc2VzIGEgY29tcHJlc3NlZCBzdHJpbmcuXG4iCmRpZmYgLS1naXQgYS9PYmplY3RzL2Fic3RyYWN0LmMgYi9PYmplY3RzL2Fic3RyYWN0LmMKaW5kZXggODFjMTllMS4uNTcwN2ViMiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9hYnN0cmFjdC5jCisrKyBiL09iamVjdHMvYWJzdHJhY3QuYwpAQCAtMTI2LDcgKzEyNiw3IEBACiAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgIHJldHVybiBkZWZhdWx0dmFsdWU7CiAgICAgfQotICAgIHJ2ID0gUHlMb25nX0NoZWNrKHJvKSA/IFB5TG9uZ19Bc1NzaXplX3Qocm8pIDogZGVmYXVsdHZhbHVlOworICAgIHJ2ID0gUHlOdW1iZXJfQ2hlY2socm8pID8gUHlJbnRfQXNTc2l6ZV90KHJvKSA6IGRlZmF1bHR2YWx1ZTsKICAgICBQeV9ERUNSRUYocm8pOwogICAgIHJldHVybiBydjsKIH0KQEAgLTI2MTcsMTAgKzI2MTcsOCBAQAogICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOwogCiAgICAgZnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobywgbmFtZSk7Ci0gICAgaWYgKGZ1bmMgPT0gTlVMTCkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgaWYgKGZ1bmMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZnVuYykpIHsKICAgICAgICAgdHlwZV9lcnJvcigiYXR0cmlidXRlIG9mIHR5cGUgJyUuMjAwcycgaXMgbm90IGNhbGxhYmxlIiwgZnVuYyk7CkBAIC0yNjU2LDEwICsyNjU0LDggQEAKICAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKIAogICAgIGZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG8sIG5hbWUpOwotICAgIGlmIChmdW5jID09IE5VTEwpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBuYW1lKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIGlmIChmdW5jID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGZ1bmMpKSB7CiAgICAgICAgIHR5cGVfZXJyb3IoImF0dHJpYnV0ZSBvZiB0eXBlICclLjIwMHMnIGlzIG5vdCBjYWxsYWJsZSIsIGZ1bmMpOwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9idWZmZXJvYmplY3QuYyBiL09iamVjdHMvYnVmZmVyb2JqZWN0LmMKaW5kZXggMGY3ZTc2My4uYmNmYWI3MSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9idWZmZXJvYmplY3QuYworKysgYi9PYmplY3RzL2J1ZmZlcm9iamVjdC5jCkBAIC04OCw3ICs4OCw3IEBACiAgICAgICAgICAgICAqc2l6ZSA9IGNvdW50OwogICAgICAgICBlbHNlCiAgICAgICAgICAgICAqc2l6ZSA9IHNlbGYtPmJfc2l6ZTsKLSAgICAgICAgaWYgKG9mZnNldCArICpzaXplID4gY291bnQpCisgICAgICAgIGlmICgqc2l6ZSA+IGNvdW50IC0gb2Zmc2V0KQogICAgICAgICAgICAgKnNpemUgPSBjb3VudCAtIG9mZnNldDsKICAgICB9CiAgICAgcmV0dXJuIDE7CkBAIC0zMzQsMTAgKzMzNCwyMCBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgcCA9ICh1bnNpZ25lZCBjaGFyICopIHB0cjsKICAgICBsZW4gPSBzaXplOwotICAgIHggPSAqcCA8PCA3OworICAgIC8qCisgICAgICBXZSBtYWtlIHRoZSBoYXNoIG9mIHRoZSBlbXB0eSBidWZmZXIgYmUgMCwgcmF0aGVyIHRoYW4gdXNpbmcKKyAgICAgIChwcmVmaXggXiBzdWZmaXgpLCBzaW5jZSB0aGlzIHNsaWdodGx5IG9iZnVzY2F0ZXMgdGhlIGhhc2ggc2VjcmV0CisgICAgKi8KKyAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgc2VsZi0+Yl9oYXNoID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHggPSBfUHlfSGFzaFNlY3JldC5wcmVmaXg7CisgICAgeCBePSAqcCA8PCA3OwogICAgIHdoaWxlICgtLWxlbiA+PSAwKQogICAgICAgICB4ID0gKDEwMDAwMDMqeCkgXiAqcCsrOwogICAgIHggXj0gc2l6ZTsKKyAgICB4IF49IF9QeV9IYXNoU2VjcmV0LnN1ZmZpeDsKICAgICBpZiAoeCA9PSAtMSkKICAgICAgICAgeCA9IC0yOwogICAgIHNlbGYtPmJfaGFzaCA9IHg7CkBAIC03OTIsNiArODAyLDE2IEBACiAgICAgcmV0dXJuIHNpemU7CiB9CiAKK3N0YXRpYyBpbnQgYnVmZmVyX2dldGJ1ZmZlcihQeUJ1ZmZlck9iamVjdCAqc2VsZiwgUHlfYnVmZmVyICpidWYsIGludCBmbGFncykKK3sKKyAgICB2b2lkICpwdHI7CisgICAgUHlfc3NpemVfdCBzaXplOworICAgIGlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gUHlCdWZmZXJfRmlsbEluZm8oYnVmLCAoUHlPYmplY3QqKXNlbGYsIHB0ciwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+Yl9yZWFkb25seSwgZmxhZ3MpOworfQorCiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgYnVmZmVyX2FzX3NlcXVlbmNlID0gewogICAgIChsZW5mdW5jKWJ1ZmZlcl9sZW5ndGgsIC8qc3FfbGVuZ3RoKi8KICAgICAoYmluYXJ5ZnVuYylidWZmZXJfY29uY2F0LCAvKnNxX2NvbmNhdCovCkBAIC04MTMsNiArODMzLDcgQEAKICAgICAod3JpdGVidWZmZXJwcm9jKWJ1ZmZlcl9nZXR3cml0ZWJ1ZiwKICAgICAoc2VnY291bnRwcm9jKWJ1ZmZlcl9nZXRzZWdjb3VudCwKICAgICAoY2hhcmJ1ZmZlcnByb2MpYnVmZmVyX2dldGNoYXJidWYsCisgICAgKGdldGJ1ZmZlcnByb2MpYnVmZmVyX2dldGJ1ZmZlciwKIH07CiAKIFB5VHlwZU9iamVjdCBQeUJ1ZmZlcl9UeXBlID0gewpAQCAtODM1LDcgKzg1Niw3IEBACiAgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KICAgICAmYnVmZmVyX2FzX2J1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwotICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HRVRDSEFSQlVGRkVSLCAvKiB0cF9mbGFncyAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HRVRDSEFSQlVGRkVSIHwgUHlfVFBGTEFHU19IQVZFX05FV0JVRkZFUiwgLyogdHBfZmxhZ3MgKi8KICAgICBidWZmZXJfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCmRpZmYgLS1naXQgYS9PYmplY3RzL2J5dGVhcnJheW9iamVjdC5jIGIvT2JqZWN0cy9ieXRlYXJyYXlvYmplY3QuYwppbmRleCBhNDBjMGFiLi5mZDBjZTdjIDEwMDY0NAotLS0gYS9PYmplY3RzL2J5dGVhcnJheW9iamVjdC5jCisrKyBiL09iamVjdHMvYnl0ZWFycmF5b2JqZWN0LmMKQEAgLTYzNiw4ICs2MzYsMTQgQEAKICAgICAgICAgbmVlZGVkID0gMDsKICAgICB9CiAgICAgZWxzZSBpZiAodmFsdWVzID09IChQeU9iamVjdCAqKXNlbGYgfHwgIVB5Qnl0ZUFycmF5X0NoZWNrKHZhbHVlcykpIHsKLSAgICAgICAgLyogTWFrZSBhIGNvcHkgYW5kIGNhbGwgdGhpcyBmdW5jdGlvbiByZWN1cnNpdmVseSAqLwogICAgICAgICBpbnQgZXJyOworICAgICAgICBpZiAoUHlOdW1iZXJfQ2hlY2sodmFsdWVzKSB8fCBQeVVuaWNvZGVfQ2hlY2sodmFsdWVzKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FuIGFzc2lnbiBvbmx5IGJ5dGVzLCBidWZmZXJzLCBvciBpdGVyYWJsZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZiBpbnRzIGluIHJhbmdlKDAsIDI1NikiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICAvKiBNYWtlIGEgY29weSBhbmQgY2FsbCB0aGlzIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5ICovCiAgICAgICAgIHZhbHVlcyA9IFB5Qnl0ZUFycmF5X0Zyb21PYmplY3QodmFsdWVzKTsKICAgICAgICAgaWYgKHZhbHVlcyA9PSBOVUxMKQogICAgICAgICAgICAgcmV0dXJuIC0xOwpAQCAtOTg4LDEwICs5OTQsOCBAQAogICAgICAgICAgICAqcCsrID0gKnF1b3RlX3Bvc3RmaXgrKzsKICAgICAgICAgfQogICAgICAgICAqcCA9ICdcMCc7Ci0gICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZ2LCAocCAtIFB5U3RyaW5nX0FTX1NUUklORyh2KSkpKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYodik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQorICAgICAgICAvKiB2IGlzIGNsZWFyZWQgb24gZXJyb3IgKi8KKyAgICAgICAgKHZvaWQpX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgKHAgLSBQeVN0cmluZ19BU19TVFJJTkcodikpKTsKICAgICAgICAgcmV0dXJuIHY7CiAgICAgfQogfQpAQCAtMjI5Niw4ICsyMzAwLDEwIEBACiAgICAgfQogCiAgICAgYnl0ZWFycmF5X29iaiA9IFB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJ1Zl9zaXplKTsKLSAgICBpZiAoYnl0ZWFycmF5X29iaiA9PSBOVUxMKQorICAgIGlmIChieXRlYXJyYXlfb2JqID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGl0KTsKICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICAgIGJ1ZiA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhieXRlYXJyYXlfb2JqKTsKIAogICAgIHdoaWxlICgoaXRlbSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgewpAQCAtMjMzMCw4ICsyMzM2LDEwIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGlmIChieXRlYXJyYXlfc2V0c2xpY2Uoc2VsZiwgUHlfU0laRShzZWxmKSwgUHlfU0laRShzZWxmKSwgYnl0ZWFycmF5X29iaikgPT0gLTEpCisgICAgaWYgKGJ5dGVhcnJheV9zZXRzbGljZShzZWxmLCBQeV9TSVpFKHNlbGYpLCBQeV9TSVpFKHNlbGYpLCBieXRlYXJyYXlfb2JqKSA9PSAtMSkgeworICAgICAgICBQeV9ERUNSRUYoYnl0ZWFycmF5X29iaik7CiAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICAgICBQeV9ERUNSRUYoYnl0ZWFycmF5X29iaik7CiAKICAgICBQeV9SRVRVUk5fTk9ORTsKQEAgLTI2NDUsNyArMjY1Myw3IEBACiB9CiAKIFB5RG9jX1NUUlZBUihzcGxpdGxpbmVzX19kb2NfXywKLSJCLnNwbGl0bGluZXMoW2tlZXBlbmRzXSkgLT4gbGlzdCBvZiBsaW5lc1xuXAorIkIuc3BsaXRsaW5lcyhrZWVwZW5kcz1GYWxzZSkgLT4gbGlzdCBvZiBsaW5lc1xuXAogXG5cCiBSZXR1cm4gYSBsaXN0IG9mIHRoZSBsaW5lcyBpbiBCLCBicmVha2luZyBhdCBsaW5lIGJvdW5kYXJpZXMuXG5cCiBMaW5lIGJyZWFrcyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgbGlzdCB1bmxlc3Mga2VlcGVuZHNcblwKZGlmZiAtLWdpdCBhL09iamVjdHMvY2xhc3NvYmplY3QuYyBiL09iamVjdHMvY2xhc3NvYmplY3QuYwppbmRleCAxNjE5MDZhLi42MzZkMTc4IDEwMDY0NAotLS0gYS9PYmplY3RzL2NsYXNzb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9jbGFzc29iamVjdC5jCkBAIC00LDcgKzQsNyBAQAogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgogCi0vKiBGcmVlIGxpc3QgZm9yIG1ldGhvZCBvYmplY3RzIHRvIHNhZmUgbWFsbG9jL2ZyZWUgb3ZlcmhlYWQKKy8qIEZyZWUgbGlzdCBmb3IgbWV0aG9kIG9iamVjdHMgdG8gc2F2ZSBtYWxsb2MvZnJlZSBvdmVyaGVhZAogICogVGhlIGltX3NlbGYgZWxlbWVudCBpcyB1c2VkIHRvIGNoYWluIHRoZSBlbGVtZW50cy4KICAqLwogc3RhdGljIFB5TWV0aG9kT2JqZWN0ICpmcmVlX2xpc3Q7CkBAIC0yMjUsMTAgKzIyNSwxNiBAQAogY2xhc3NfZ2V0YXR0cihyZWdpc3RlciBQeUNsYXNzT2JqZWN0ICpvcCwgUHlPYmplY3QgKm5hbWUpCiB7CiAgICAgcmVnaXN0ZXIgUHlPYmplY3QgKnY7Ci0gICAgcmVnaXN0ZXIgY2hhciAqc25hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKTsKKyAgICByZWdpc3RlciBjaGFyICpzbmFtZTsKICAgICBQeUNsYXNzT2JqZWN0ICprbGFzczsKICAgICBkZXNjcmdldGZ1bmMgZjsKIAorICAgIGlmICghUHlTdHJpbmdfQ2hlY2sobmFtZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgYSBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc25hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKTsKICAgICBpZiAoc25hbWVbMF0gPT0gJ18nICYmIHNuYW1lWzFdID09ICdfJykgewogICAgICAgICBpZiAoc3RyY21wKHNuYW1lLCAiX19kaWN0X18iKSA9PSAwKSB7CiAgICAgICAgICAgICBpZiAoUHlFdmFsX0dldFJlc3RyaWN0ZWQoKSkgewpAQCAtMzM2LDYgKzM0MiwxMCBAQAogICAgICAgICAgICAgICAgICAgICJjbGFzc2VzIGFyZSByZWFkLW9ubHkgaW4gcmVzdHJpY3RlZCBtb2RlIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CisgICAgaWYgKCFQeVN0cmluZ19DaGVjayhuYW1lKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBhIHN0cmluZyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogICAgIHNuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcobmFtZSk7CiAgICAgaWYgKHNuYW1lWzBdID09ICdfJyAmJiBzbmFtZVsxXSA9PSAnXycpIHsKICAgICAgICAgUHlfc3NpemVfdCBuID0gUHlTdHJpbmdfU2l6ZShuYW1lKTsKQEAgLTY5OSw3ICs3MDksMTQgQEAKIGluc3RhbmNlX2dldGF0dHIxKHJlZ2lzdGVyIFB5SW5zdGFuY2VPYmplY3QgKmluc3QsIFB5T2JqZWN0ICpuYW1lKQogewogICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICp2OwotICAgIHJlZ2lzdGVyIGNoYXIgKnNuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcobmFtZSk7CisgICAgcmVnaXN0ZXIgY2hhciAqc25hbWU7CisKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKG5hbWUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIGEgc3RyaW5nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcobmFtZSk7CiAgICAgaWYgKHNuYW1lWzBdID09ICdfJyAmJiBzbmFtZVsxXSA9PSAnXycpIHsKICAgICAgICAgaWYgKHN0cmNtcChzbmFtZSwgIl9fZGljdF9fIikgPT0gMCkgewogICAgICAgICAgICAgaWYgKFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKQEAgLTgxMCw3ICs4MjcsMTQgQEAKIGluc3RhbmNlX3NldGF0dHIoUHlJbnN0YW5jZU9iamVjdCAqaW5zdCwgUHlPYmplY3QgKm5hbWUsIFB5T2JqZWN0ICp2KQogewogICAgIFB5T2JqZWN0ICpmdW5jLCAqYXJncywgKnJlcywgKnRtcDsKLSAgICBjaGFyICpzbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKG5hbWUpOworICAgIGNoYXIgKnNuYW1lOworCisgICAgaWYgKCFQeVN0cmluZ19DaGVjayhuYW1lKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBhIHN0cmluZyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgc25hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKTsKICAgICBpZiAoc25hbWVbMF0gPT0gJ18nICYmIHNuYW1lWzFdID09ICdfJykgewogICAgICAgICBQeV9zc2l6ZV90IG4gPSBQeVN0cmluZ19TaXplKG5hbWUpOwogICAgICAgICBpZiAoc25hbWVbbi0xXSA9PSAnXycgJiYgc25hbWVbbi0yXSA9PSAnXycpIHsKZGlmZiAtLWdpdCBhL09iamVjdHMvY29tcGxleG9iamVjdC5jIGIvT2JqZWN0cy9jb21wbGV4b2JqZWN0LmMKaW5kZXggNjc3YWMwZS4uNWVlMGMxNSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9jb21wbGV4b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9jb21wbGV4b2JqZWN0LmMKQEAgLTg4NSw3ICs4ODUsNyBAQAogUHlEb2NfU1RSVkFSKGNvbXBsZXhfY29uanVnYXRlX2RvYywKICJjb21wbGV4LmNvbmp1Z2F0ZSgpIC0+IGNvbXBsZXhcbiIKICJcbiIKLSJSZXR1cm5zIHRoZSBjb21wbGV4IGNvbmp1Z2F0ZSBvZiBpdHMgYXJndW1lbnQuICgzLTRqKS5jb25qdWdhdGUoKSA9PSAzKzRqLiIpOworIlJldHVybiB0aGUgY29tcGxleCBjb25qdWdhdGUgb2YgaXRzIGFyZ3VtZW50LiAoMy00aikuY29uanVnYXRlKCkgPT0gMys0ai4iKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbXBsZXhfZ2V0bmV3YXJncyhQeUNvbXBsZXhPYmplY3QgKnYpCkBAIC04OTcsNyArODk3LDcgQEAKIFB5RG9jX1NUUlZBUihjb21wbGV4X19mb3JtYXRfX2RvYywKICJjb21wbGV4Ll9fZm9ybWF0X18oKSAtPiBzdHJcbiIKICJcbiIKLSJDb252ZXJ0cyB0byBhIHN0cmluZyBhY2NvcmRpbmcgdG8gZm9ybWF0X3NwZWMuIik7CisiQ29udmVydCB0byBhIHN0cmluZyBhY2NvcmRpbmcgdG8gZm9ybWF0X3NwZWMuIik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21wbGV4X19mb3JtYXRfXyhQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCmRpZmYgLS1naXQgYS9PYmplY3RzL2Rlc2Nyb2JqZWN0LmMgYi9PYmplY3RzL2Rlc2Nyb2JqZWN0LmMKaW5kZXggOGU3ZWE3ZC4uM2U5YjAzNCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9kZXNjcm9iamVjdC5jCisrKyBiL09iamVjdHMvZGVzY3JvYmplY3QuYwpAQCAtMjU0LDE0ICsyNTQsNTEgQEAKIGNsYXNzbWV0aG9kZGVzY3JfY2FsbChQeU1ldGhvZERlc2NyT2JqZWN0ICpkZXNjciwgUHlPYmplY3QgKmFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmt3ZHMpCiB7Ci0gICAgUHlPYmplY3QgKmZ1bmMsICpyZXN1bHQ7CisgICAgUHlfc3NpemVfdCBhcmdjOworICAgIFB5T2JqZWN0ICpzZWxmLCAqZnVuYywgKnJlc3VsdDsKIAotICAgIGZ1bmMgPSBQeUNGdW5jdGlvbl9OZXcoZGVzY3ItPmRfbWV0aG9kLCAoUHlPYmplY3QgKilkZXNjci0+ZF90eXBlKTsKKyAgICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYWNjZXB0YWJsZSBhcyAnc2VsZicgKi8KKyAgICBhc3NlcnQoUHlUdXBsZV9DaGVjayhhcmdzKSk7CisgICAgYXJnYyA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CisgICAgaWYgKGFyZ2MgPCAxKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRvciAnJXMnIG9mICclLjEwMHMnICIKKyAgICAgICAgICAgICAgICAgICAgICJvYmplY3QgbmVlZHMgYW4gYXJndW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgZGVzY3JfbmFtZSgoUHlEZXNjck9iamVjdCAqKWRlc2NyKSwKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyLT5kX3R5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc2VsZiA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgaWYgKCFQeVR5cGVfQ2hlY2soc2VsZikpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdG9yICclcycgcmVxdWlyZXMgYSB0eXBlICIKKyAgICAgICAgICAgICAgICAgICAgICJidXQgcmVjZWl2ZWQgYSAnJS4xMDBzJyIsCisgICAgICAgICAgICAgICAgICAgICBkZXNjcl9uYW1lKChQeURlc2NyT2JqZWN0ICopZGVzY3IpLAorICAgICAgICAgICAgICAgICAgICAgc2VsZi0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIVB5VHlwZV9Jc1N1YnR5cGUoKFB5VHlwZU9iamVjdCAqKXNlbGYsIGRlc2NyLT5kX3R5cGUpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRvciAnJXMnICIKKyAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlcyBhIHN1YnR5cGUgb2YgJyUuMTAwcycgIgorICAgICAgICAgICAgICAgICAgICAgImJ1dCByZWNlaXZlZCAnJS4xMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyX25hbWUoKFB5RGVzY3JPYmplY3QgKilkZXNjciksCisgICAgICAgICAgICAgICAgICAgICBkZXNjci0+ZF90eXBlLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgc2VsZi0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZ1bmMgPSBQeUNGdW5jdGlvbl9OZXcoZGVzY3ItPmRfbWV0aG9kLCBzZWxmKTsKICAgICBpZiAoZnVuYyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLQorICAgIGFyZ3MgPSBQeVR1cGxlX0dldFNsaWNlKGFyZ3MsIDEsIGFyZ2MpOworICAgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgICAgcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoZnVuYywgYXJncywga3dkcyk7CiAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCkBAIC0xMzI2LDIxICsxMzYzLDI1IEBACiAiXG4iCiAiZmdldCBpcyBhIGZ1bmN0aW9uIHRvIGJlIHVzZWQgZm9yIGdldHRpbmcgYW4gYXR0cmlidXRlIHZhbHVlLCBhbmQgbGlrZXdpc2VcbiIKICJmc2V0IGlzIGEgZnVuY3Rpb24gZm9yIHNldHRpbmcsIGFuZCBmZGVsIGEgZnVuY3Rpb24gZm9yIGRlbCdpbmcsIGFuXG4iCi0iYXR0cmlidXRlLiAgVHlwaWNhbCB1c2UgaXMgdG8gZGVmaW5lIGEgbWFuYWdlZCBhdHRyaWJ1dGUgeDpcbiIKKyJhdHRyaWJ1dGUuICBUeXBpY2FsIHVzZSBpcyB0byBkZWZpbmUgYSBtYW5hZ2VkIGF0dHJpYnV0ZSB4OlxuXG4iCiAiY2xhc3MgQyhvYmplY3QpOlxuIgogIiAgICBkZWYgZ2V0eChzZWxmKTogcmV0dXJuIHNlbGYuX3hcbiIKICIgICAgZGVmIHNldHgoc2VsZiwgdmFsdWUpOiBzZWxmLl94ID0gdmFsdWVcbiIKICIgICAgZGVmIGRlbHgoc2VsZik6IGRlbCBzZWxmLl94XG4iCiAiICAgIHggPSBwcm9wZXJ0eShnZXR4LCBzZXR4LCBkZWx4LCBcIkknbSB0aGUgJ3gnIHByb3BlcnR5LlwiKVxuIgogIlxuIgotIkRlY29yYXRvcnMgbWFrZSBkZWZpbmluZyBuZXcgcHJvcGVydGllcyBvciBtb2RpZnlpbmcgZXhpc3Rpbmcgb25lcyBlYXN5OlxuIgorIkRlY29yYXRvcnMgbWFrZSBkZWZpbmluZyBuZXcgcHJvcGVydGllcyBvciBtb2RpZnlpbmcgZXhpc3Rpbmcgb25lcyBlYXN5OlxuXG4iCiAiY2xhc3MgQyhvYmplY3QpOlxuIgogIiAgICBAcHJvcGVydHlcbiIKLSIgICAgZGVmIHgoc2VsZik6IHJldHVybiBzZWxmLl94XG4iCisiICAgIGRlZiB4KHNlbGYpOlxuIgorIiAgICAgICAgXCJJIGFtIHRoZSAneCcgcHJvcGVydHkuXCJcbiIKKyIgICAgICAgIHJldHVybiBzZWxmLl94XG4iCiAiICAgIEB4LnNldHRlclxuIgotIiAgICBkZWYgeChzZWxmLCB2YWx1ZSk6IHNlbGYuX3ggPSB2YWx1ZVxuIgorIiAgICBkZWYgeChzZWxmLCB2YWx1ZSk6XG4iCisiICAgICAgICBzZWxmLl94ID0gdmFsdWVcbiIKICIgICAgQHguZGVsZXRlclxuIgotIiAgICBkZWYgeChzZWxmKTogZGVsIHNlbGYuX3hcbiIKKyIgICAgZGVmIHgoc2VsZik6XG4iCisiICAgICAgICBkZWwgc2VsZi5feFxuIgogKTsKIAogc3RhdGljIGludApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9kaWN0b2JqZWN0LmMgYi9PYmplY3RzL2RpY3RvYmplY3QuYwppbmRleCBmMmViZjQ1Li4zOWU3MDM1IDEwMDY0NAotLS0gYS9PYmplY3RzL2RpY3RvYmplY3QuYworKysgYi9PYmplY3RzL2RpY3RvYmplY3QuYwpAQCAtNTAyLDI3ICs1MDIsMTYgQEAKICAgICBfUHlPYmplY3RfR0NfVU5UUkFDSyhvcCk7CiB9CiAKLQogLyoKLUludGVybmFsIHJvdXRpbmUgdG8gaW5zZXJ0IGEgbmV3IGl0ZW0gaW50byB0aGUgdGFibGUuCi1Vc2VkIGJvdGggYnkgdGhlIGludGVybmFsIHJlc2l6ZSByb3V0aW5lIGFuZCBieSB0aGUgcHVibGljIGluc2VydCByb3V0aW5lLgotRWF0cyBhIHJlZmVyZW5jZSB0byBrZXkgYW5kIG9uZSB0byB2YWx1ZS4KLVJldHVybnMgLTEgaWYgYW4gZXJyb3Igb2NjdXJyZWQsIG9yIDAgb24gc3VjY2Vzcy4KK0ludGVybmFsIHJvdXRpbmUgdG8gaW5zZXJ0IGEgbmV3IGl0ZW0gaW50byB0aGUgdGFibGUgd2hlbiB5b3UgaGF2ZSBlbnRyeSBvYmplY3QuCitVc2VkIGJ5IGluc2VydGRpY3QuCiAqLwogc3RhdGljIGludAotaW5zZXJ0ZGljdChyZWdpc3RlciBQeURpY3RPYmplY3QgKm1wLCBQeU9iamVjdCAqa2V5LCBsb25nIGhhc2gsIFB5T2JqZWN0ICp2YWx1ZSkKK2luc2VydGRpY3RfYnlfZW50cnkocmVnaXN0ZXIgUHlEaWN0T2JqZWN0ICptcCwgUHlPYmplY3QgKmtleSwgbG9uZyBoYXNoLAorICAgICAgICAgICAgICAgICAgICBQeURpY3RFbnRyeSAqZXAsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKICAgICBQeU9iamVjdCAqb2xkX3ZhbHVlOwotICAgIHJlZ2lzdGVyIFB5RGljdEVudHJ5ICplcDsKLSAgICB0eXBlZGVmIFB5RGljdEVudHJ5ICooKmxvb2t1cGZ1bmMpKFB5RGljdE9iamVjdCAqLCBQeU9iamVjdCAqLCBsb25nKTsKIAotICAgIGFzc2VydChtcC0+bWFfbG9va3VwICE9IE5VTEwpOwotICAgIGVwID0gbXAtPm1hX2xvb2t1cChtcCwga2V5LCBoYXNoKTsKLSAgICBpZiAoZXAgPT0gTlVMTCkgewotICAgICAgICBQeV9ERUNSRUYoa2V5KTsKLSAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KICAgICBNQUlOVEFJTl9UUkFDS0lORyhtcCwga2V5LCB2YWx1ZSk7CiAgICAgaWYgKGVwLT5tZV92YWx1ZSAhPSBOVUxMKSB7CiAgICAgICAgIG9sZF92YWx1ZSA9IGVwLT5tZV92YWx1ZTsKQEAgLTU0NSw2ICs1MzQsMjggQEAKICAgICByZXR1cm4gMDsKIH0KIAorCisvKgorSW50ZXJuYWwgcm91dGluZSB0byBpbnNlcnQgYSBuZXcgaXRlbSBpbnRvIHRoZSB0YWJsZS4KK1VzZWQgYm90aCBieSB0aGUgaW50ZXJuYWwgcmVzaXplIHJvdXRpbmUgYW5kIGJ5IHRoZSBwdWJsaWMgaW5zZXJ0IHJvdXRpbmUuCitFYXRzIGEgcmVmZXJlbmNlIHRvIGtleSBhbmQgb25lIHRvIHZhbHVlLgorUmV0dXJucyAtMSBpZiBhbiBlcnJvciBvY2N1cnJlZCwgb3IgMCBvbiBzdWNjZXNzLgorKi8KK3N0YXRpYyBpbnQKK2luc2VydGRpY3QocmVnaXN0ZXIgUHlEaWN0T2JqZWN0ICptcCwgUHlPYmplY3QgKmtleSwgbG9uZyBoYXNoLCBQeU9iamVjdCAqdmFsdWUpCit7CisgICAgcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmVwOworCisgICAgYXNzZXJ0KG1wLT5tYV9sb29rdXAgIT0gTlVMTCk7CisgICAgZXAgPSBtcC0+bWFfbG9va3VwKG1wLCBrZXksIGhhc2gpOworICAgIGlmIChlcCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBpbnNlcnRkaWN0X2J5X2VudHJ5KG1wLCBrZXksIGhhc2gsIGVwLCB2YWx1ZSk7Cit9CisKIC8qCiBJbnRlcm5hbCByb3V0aW5lIHVzZWQgYnkgZGljdHJlc2l6ZSgpIHRvIGluc2VydCBhbiBpdGVtIHdoaWNoIGlzCiBrbm93biB0byBiZSBhYnNlbnQgZnJvbSB0aGUgZGljdC4gIFRoaXMgcm91dGluZSBhbHNvIGFzc3VtZXMgdGhhdApAQCAtNzM4LDQyICs3NDksMjYgQEAKICAgICByZXR1cm4gZXAtPm1lX3ZhbHVlOwogfQogCi0vKiBDQVVUSU9OOiBQeURpY3RfU2V0SXRlbSgpIG11c3QgZ3VhcmFudGVlIHRoYXQgaXQgd29uJ3QgcmVzaXplIHRoZQotICogZGljdGlvbmFyeSBpZiBpdCdzIG1lcmVseSByZXBsYWNpbmcgdGhlIHZhbHVlIGZvciBhbiBleGlzdGluZyBrZXkuCi0gKiBUaGlzIG1lYW5zIHRoYXQgaXQncyBzYWZlIHRvIGxvb3Agb3ZlciBhIGRpY3Rpb25hcnkgd2l0aCBQeURpY3RfTmV4dCgpCi0gKiBhbmQgb2NjYXNpb25hbGx5IHJlcGxhY2UgYSB2YWx1ZSAtLSBidXQgeW91IGNhbid0IGluc2VydCBuZXcga2V5cyBvcgotICogcmVtb3ZlIHRoZW0uCi0gKi8KLWludAotUHlEaWN0X1NldEl0ZW0ocmVnaXN0ZXIgUHlPYmplY3QgKm9wLCBQeU9iamVjdCAqa2V5LCBQeU9iamVjdCAqdmFsdWUpCitzdGF0aWMgaW50CitkaWN0X3NldF9pdGVtX2J5X2hhc2hfb3JfZW50cnkocmVnaXN0ZXIgUHlPYmplY3QgKm9wLCBQeU9iamVjdCAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgaGFzaCwgUHlEaWN0RW50cnkgKmVwLCBQeU9iamVjdCAqdmFsdWUpCiB7CiAgICAgcmVnaXN0ZXIgUHlEaWN0T2JqZWN0ICptcDsKLSAgICByZWdpc3RlciBsb25nIGhhc2g7CiAgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBuX3VzZWQ7CiAKLSAgICBpZiAoIVB5RGljdF9DaGVjayhvcCkpIHsKLSAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgYXNzZXJ0KGtleSk7Ci0gICAgYXNzZXJ0KHZhbHVlKTsKICAgICBtcCA9IChQeURpY3RPYmplY3QgKilvcDsKLSAgICBpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpKSB7Ci0gICAgICAgIGhhc2ggPSAoKFB5U3RyaW5nT2JqZWN0ICopa2V5KS0+b2Jfc2hhc2g7Ci0gICAgICAgIGlmIChoYXNoID09IC0xKQotICAgICAgICAgICAgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7Ci0gICAgICAgIGlmIChoYXNoID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KICAgICBhc3NlcnQobXAtPm1hX2ZpbGwgPD0gbXAtPm1hX21hc2spOyAgLyogYXQgbGVhc3Qgb25lIGVtcHR5IHNsb3QgKi8KICAgICBuX3VzZWQgPSBtcC0+bWFfdXNlZDsKICAgICBQeV9JTkNSRUYodmFsdWUpOwogICAgIFB5X0lOQ1JFRihrZXkpOwotICAgIGlmIChpbnNlcnRkaWN0KG1wLCBrZXksIGhhc2gsIHZhbHVlKSAhPSAwKQotICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGVwID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGluc2VydGRpY3QobXAsIGtleSwgaGFzaCwgdmFsdWUpICE9IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoaW5zZXJ0ZGljdF9ieV9lbnRyeShtcCwga2V5LCBoYXNoLCBlcCwgdmFsdWUpICE9IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQogICAgIC8qIElmIHdlIGFkZGVkIGEga2V5LCB3ZSBjYW4gc2FmZWx5IHJlc2l6ZS4gIE90aGVyd2lzZSBqdXN0IHJldHVybiEKICAgICAgKiBJZiBmaWxsID49IDIvMyBzaXplLCBhZGp1c3Qgc2l6ZS4gIE5vcm1hbGx5LCB0aGlzIGRvdWJsZXMgb3IKICAgICAgKiBxdWFkdXBsZXMgdGhlIHNpemUsIGJ1dCBpdCdzIGFsc28gcG9zc2libGUgZm9yIHRoZSBkaWN0IHRvIHNocmluawpAQCAtNzkzLDYgKzc4OCwzNiBAQAogICAgIHJldHVybiBkaWN0cmVzaXplKG1wLCAobXAtPm1hX3VzZWQgPiA1MDAwMCA/IDIgOiA0KSAqIG1wLT5tYV91c2VkKTsKIH0KIAorLyogQ0FVVElPTjogUHlEaWN0X1NldEl0ZW0oKSBtdXN0IGd1YXJhbnRlZSB0aGF0IGl0IHdvbid0IHJlc2l6ZSB0aGUKKyAqIGRpY3Rpb25hcnkgaWYgaXQncyBtZXJlbHkgcmVwbGFjaW5nIHRoZSB2YWx1ZSBmb3IgYW4gZXhpc3Rpbmcga2V5LgorICogVGhpcyBtZWFucyB0aGF0IGl0J3Mgc2FmZSB0byBsb29wIG92ZXIgYSBkaWN0aW9uYXJ5IHdpdGggUHlEaWN0X05leHQoKQorICogYW5kIG9jY2FzaW9uYWxseSByZXBsYWNlIGEgdmFsdWUgLS0gYnV0IHlvdSBjYW4ndCBpbnNlcnQgbmV3IGtleXMgb3IKKyAqIHJlbW92ZSB0aGVtLgorICovCitpbnQKK1B5RGljdF9TZXRJdGVtKHJlZ2lzdGVyIFB5T2JqZWN0ICpvcCwgUHlPYmplY3QgKmtleSwgUHlPYmplY3QgKnZhbHVlKQoreworICAgIHJlZ2lzdGVyIGxvbmcgaGFzaDsKKworICAgIGlmICghUHlEaWN0X0NoZWNrKG9wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBhc3NlcnQoa2V5KTsKKyAgICBhc3NlcnQodmFsdWUpOworICAgIGlmIChQeVN0cmluZ19DaGVja0V4YWN0KGtleSkpIHsKKyAgICAgICAgaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKilrZXkpLT5vYl9zaGFzaDsKKyAgICAgICAgaWYgKGhhc2ggPT0gLTEpCisgICAgICAgICAgICBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKKyAgICAgICAgaWYgKGhhc2ggPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBkaWN0X3NldF9pdGVtX2J5X2hhc2hfb3JfZW50cnkob3AsIGtleSwgaGFzaCwgTlVMTCwgdmFsdWUpOworfQorCiBpbnQKIFB5RGljdF9EZWxJdGVtKFB5T2JqZWN0ICpvcCwgUHlPYmplY3QgKmtleSkKIHsKQEAgLTEzMjgsNDkgKzEzNTMsNTAgQEAKICAgICBpZiAoZCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIGlmIChQeURpY3RfQ2hlY2tFeGFjdChkKSAmJiBQeURpY3RfQ2hlY2tFeGFjdChzZXEpKSB7Ci0gICAgICAgIFB5RGljdE9iamVjdCAqbXAgPSAoUHlEaWN0T2JqZWN0ICopZDsKLSAgICAgICAgUHlPYmplY3QgKm9sZHZhbHVlOwotICAgICAgICBQeV9zc2l6ZV90IHBvcyA9IDA7Ci0gICAgICAgIFB5T2JqZWN0ICprZXk7Ci0gICAgICAgIGxvbmcgaGFzaDsKKyAgICBpZiAoUHlEaWN0X0NoZWNrRXhhY3QoZCkgJiYgKChQeURpY3RPYmplY3QgKilkKS0+bWFfdXNlZCA9PSAwKSB7CisgICAgICAgIGlmIChQeURpY3RfQ2hlY2tFeGFjdChzZXEpKSB7CisgICAgICAgICAgICBQeURpY3RPYmplY3QgKm1wID0gKFB5RGljdE9iamVjdCAqKWQ7CisgICAgICAgICAgICBQeU9iamVjdCAqb2xkdmFsdWU7CisgICAgICAgICAgICBQeV9zc2l6ZV90IHBvcyA9IDA7CisgICAgICAgICAgICBQeU9iamVjdCAqa2V5OworICAgICAgICAgICAgbG9uZyBoYXNoOwogCi0gICAgICAgIGlmIChkaWN0cmVzaXplKG1wLCBQeV9TSVpFKHNlcSkpKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoZCk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlIChfUHlEaWN0X05leHQoc2VxLCAmcG9zLCAma2V5LCAmb2xkdmFsdWUsICZoYXNoKSkgewotICAgICAgICAgICAgUHlfSU5DUkVGKGtleSk7Ci0gICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOwotICAgICAgICAgICAgaWYgKGluc2VydGRpY3QobXAsIGtleSwgaGFzaCwgdmFsdWUpKSB7CisgICAgICAgICAgICBpZiAoZGljdHJlc2l6ZShtcCwgUHlfU0laRShzZXEpKSkgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihkKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2hpbGUgKF9QeURpY3RfTmV4dChzZXEsICZwb3MsICZrZXksICZvbGR2YWx1ZSwgJmhhc2gpKSB7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGtleSk7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0ZGljdChtcCwga2V5LCBoYXNoLCB2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gZDsKLSAgICB9CisgICAgICAgIGlmIChQeUFueVNldF9DaGVja0V4YWN0KHNlcSkpIHsKKyAgICAgICAgICAgIFB5RGljdE9iamVjdCAqbXAgPSAoUHlEaWN0T2JqZWN0ICopZDsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgcG9zID0gMDsKKyAgICAgICAgICAgIFB5T2JqZWN0ICprZXk7CisgICAgICAgICAgICBsb25nIGhhc2g7CiAKLSAgICBpZiAoUHlEaWN0X0NoZWNrRXhhY3QoZCkgJiYgUHlBbnlTZXRfQ2hlY2tFeGFjdChzZXEpKSB7Ci0gICAgICAgIFB5RGljdE9iamVjdCAqbXAgPSAoUHlEaWN0T2JqZWN0ICopZDsKLSAgICAgICAgUHlfc3NpemVfdCBwb3MgPSAwOwotICAgICAgICBQeU9iamVjdCAqa2V5OwotICAgICAgICBsb25nIGhhc2g7Ci0KLSAgICAgICAgaWYgKGRpY3RyZXNpemUobXAsIFB5U2V0X0dFVF9TSVpFKHNlcSkpKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoZCk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlIChfUHlTZXRfTmV4dEVudHJ5KHNlcSwgJnBvcywgJmtleSwgJmhhc2gpKSB7Ci0gICAgICAgICAgICBQeV9JTkNSRUYoa2V5KTsKLSAgICAgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7Ci0gICAgICAgICAgICBpZiAoaW5zZXJ0ZGljdChtcCwga2V5LCBoYXNoLCB2YWx1ZSkpIHsKKyAgICAgICAgICAgIGlmIChkaWN0cmVzaXplKG1wLCBQeVNldF9HRVRfU0laRShzZXEpKSkgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihkKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2hpbGUgKF9QeVNldF9OZXh0RW50cnkoc2VxLCAmcG9zLCAma2V5LCAmaGFzaCkpIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoa2V5KTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICAgICAgICAgIGlmIChpbnNlcnRkaWN0KG1wLCBrZXksIGhhc2gsIHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkOwogICAgIH0KIAogICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOwpAQCAtMTk1Nyw5ICsxOTgzLDkgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdmFsID0gZXAtPm1lX3ZhbHVlOwogICAgIGlmICh2YWwgPT0gTlVMTCkgewotICAgICAgICB2YWwgPSBmYWlsb2JqOwotICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oKFB5T2JqZWN0KiltcCwga2V5LCBmYWlsb2JqKSkKLSAgICAgICAgICAgIHZhbCA9IE5VTEw7CisgICAgICAgIGlmIChkaWN0X3NldF9pdGVtX2J5X2hhc2hfb3JfZW50cnkoKFB5T2JqZWN0KiltcCwga2V5LCBoYXNoLCBlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsb2JqKSA9PSAwKQorICAgICAgICAgICAgdmFsID0gZmFpbG9iajsKICAgICB9CiAgICAgUHlfWElOQ1JFRih2YWwpOwogICAgIHJldHVybiB2YWw7CkBAIC0yMTY3LDkgKzIxOTMsOSBAQAogIkQudmFsdWVzKCkgLT4gbGlzdCBvZiBEJ3MgdmFsdWVzIik7CiAKIFB5RG9jX1NUUlZBUih1cGRhdGVfX2RvY19fLAotIkQudXBkYXRlKEUsICoqRikgLT4gTm9uZS4gIFVwZGF0ZSBEIGZyb20gZGljdC9pdGVyYWJsZSBFIGFuZCBGLlxuIgotIklmIEUgaGFzIGEgLmtleXMoKSBtZXRob2QsIGRvZXM6ICAgICBmb3IgayBpbiBFOiBEW2tdID0gRVtrXVxuXAotSWYgRSBsYWNrcyAua2V5cygpIG1ldGhvZCwgZG9lczogICAgIGZvciAoaywgdikgaW4gRTogRFtrXSA9IHZcblwKKyJELnVwZGF0ZShbRSwgXSoqRikgLT4gTm9uZS4gIFVwZGF0ZSBEIGZyb20gZGljdC9pdGVyYWJsZSBFIGFuZCBGLlxuIgorIklmIEUgcHJlc2VudCBhbmQgaGFzIGEgLmtleXMoKSBtZXRob2QsIGRvZXM6ICAgICBmb3IgayBpbiBFOiBEW2tdID0gRVtrXVxuXAorSWYgRSBwcmVzZW50IGFuZCBsYWNrcyAua2V5cygpIG1ldGhvZCwgZG9lczogICAgIGZvciAoaywgdikgaW4gRTogRFtrXSA9IHZcblwKIEluIGVpdGhlciBjYXNlLCB0aGlzIGlzIGZvbGxvd2VkIGJ5OiBmb3IgayBpbiBGOiBEW2tdID0gRltrXSIpOwogCiBQeURvY19TVFJWQVIoZnJvbWtleXNfX2RvY19fLApAQCAtMjg5Myw2ICsyOTE5LDEwIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgc2VxX3N0ciA9IFB5T2JqZWN0X1JlcHIoc2VxKTsKKyAgICBpZiAoc2VxX3N0ciA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihzZXEpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiJXMoJXMpIiwgUHlfVFlQRShkdiktPnRwX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoc2VxX3N0cikpOwogICAgIFB5X0RFQ1JFRihzZXFfc3RyKTsKZGlmZiAtLWdpdCBhL09iamVjdHMvZXhjZXB0aW9ucy5jIGIvT2JqZWN0cy9leGNlcHRpb25zLmMKaW5kZXggNzExYzg3ZC4uZTE2NTUyOCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9leGNlcHRpb25zLmMKKysrIGIvT2JqZWN0cy9leGNlcHRpb25zLmMKQEAgLTMwNiw3ICszMDYsOCBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIHNlcSA9IFB5U2VxdWVuY2VfVHVwbGUodmFsKTsKLSAgICBpZiAoIXNlcSkgcmV0dXJuIC0xOworICAgIGlmICghc2VxKQorICAgICAgICByZXR1cm4gLTE7CiAgICAgUHlfQ0xFQVIoc2VsZi0+YXJncyk7CiAgICAgc2VsZi0+YXJncyA9IHNlcTsKICAgICByZXR1cm4gMDsKQEAgLTM0OCw4ICszNDksNyBAQAogICAgICAgICAgICAgaWYgKFB5RGljdF9EZWxJdGVtU3RyaW5nKHNlbGYtPmRpY3QsICJtZXNzYWdlIikgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotICAgICAgICBQeV9YREVDUkVGKHNlbGYtPm1lc3NhZ2UpOwotICAgICAgICBzZWxmLT5tZXNzYWdlID0gTlVMTDsKKyAgICAgICAgUHlfQ0xFQVIoc2VsZi0+bWVzc2FnZSk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIApAQCAtNzczLDcgKzc3Myw4IEBACiAgICAgICogZmlsZSBuYW1lIGdpdmVuIHRvIEVudmlyb25tZW50RXJyb3IuICovCiAgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMiAmJiBzZWxmLT5maWxlbmFtZSkgewogICAgICAgICBhcmdzID0gUHlUdXBsZV9OZXcoMyk7Ci0gICAgICAgIGlmICghYXJncykgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmICghYXJncykKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgICAgIHRtcCA9IFB5VHVwbGVfR0VUX0lURU0oc2VsZi0+YXJncywgMCk7CiAgICAgICAgIFB5X0lOQ1JFRih0bXApOwpAQCAtMTA3MSw3ICsxMDcyLDggQEAKICAgICBpZiAobGVuYXJncyA9PSAyKSB7CiAgICAgICAgIGluZm8gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDEpOwogICAgICAgICBpbmZvID0gUHlTZXF1ZW5jZV9UdXBsZShpbmZvKTsKLSAgICAgICAgaWYgKCFpbmZvKSByZXR1cm4gLTE7CisgICAgICAgIGlmICghaW5mbykKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAogICAgICAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShpbmZvKSAhPSA0KSB7CiAgICAgICAgICAgICAvKiBub3QgYSB2ZXJ5IGdvb2QgZXJyb3IgbWVzc2FnZSwgYnV0IGl0J3Mgd2hhdCBQeXRob24gMi40IGdpdmVzICovCkBAIC0xMTY3LDkgKzExNjksMTEgQEAKICAgICAgICAgc3RyID0gUHlPYmplY3RfU3RyKHNlbGYtPm1zZyk7CiAgICAgZWxzZQogICAgICAgICBzdHIgPSBQeU9iamVjdF9TdHIoUHlfTm9uZSk7Ci0gICAgaWYgKCFzdHIpIHJldHVybiBOVUxMOworICAgIGlmICghc3RyKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICAvKiBEb24ndCBmaWRkbGUgd2l0aCBub24tc3RyaW5nIHJldHVybiAoc2hvdWxkbid0IGhhcHBlbiBhbnl3YXkpICovCi0gICAgaWYgKCFQeVN0cmluZ19DaGVjayhzdHIpKSByZXR1cm4gc3RyOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2soc3RyKSkKKyAgICAgICAgcmV0dXJuIHN0cjsKIAogICAgIC8qIFhYWCAtLSBkbyBhbGwgdGhlIGFkZGl0aW9uYWwgZm9ybWF0dGluZyB3aXRoIGZpbGVuYW1lIGFuZAogICAgICAgIGxpbmVubyBoZXJlICovCkBAIC0xNjQ0LDYgKzE2NDgsMTAgQEAKICAgICBQeU9iamVjdCAqcmVhc29uX3N0ciA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmVuY29kaW5nX3N0ciA9IE5VTEw7CiAKKyAgICBpZiAoIXVzZWxmLT5vYmplY3QpCisgICAgICAgIC8qIE5vdCBwcm9wZXJseSBpbml0aWFsaXplZC4gKi8KKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tU3RyaW5nKCIiKTsKKwogICAgIC8qIEdldCByZWFzb24gYW5kIGVuY29kaW5nIGFzIHN0cmluZ3MsIHdoaWNoIHRoZXkgbWlnaHQgbm90IGJlIGlmCiAgICAgICAgdGhleSd2ZSBiZWVuIG1vZGlmaWVkIGFmdGVyIHdlIHdlcmUgY29udHJ1Y3RlZC4gKi8KICAgICByZWFzb25fc3RyID0gUHlPYmplY3RfU3RyKHVzZWxmLT5yZWFzb24pOwpAQCAtMTcyOSw2ICsxNzM3LDEwIEBACiAgICAgUHlPYmplY3QgKnJlYXNvbl9zdHIgPSBOVUxMOwogICAgIFB5T2JqZWN0ICplbmNvZGluZ19zdHIgPSBOVUxMOwogCisgICAgaWYgKCF1c2VsZi0+b2JqZWN0KQorICAgICAgICAvKiBOb3QgcHJvcGVybHkgaW5pdGlhbGl6ZWQuICovCisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVN0cmluZygiIik7CisKICAgICAvKiBHZXQgcmVhc29uIGFuZCBlbmNvZGluZyBhcyBzdHJpbmdzLCB3aGljaCB0aGV5IG1pZ2h0IG5vdCBiZSBpZgogICAgICAgIHRoZXkndmUgYmVlbiBtb2RpZmllZCBhZnRlciB3ZSB3ZXJlIGNvbnRydWN0ZWQuICovCiAgICAgcmVhc29uX3N0ciA9IFB5T2JqZWN0X1N0cih1c2VsZi0+cmVhc29uKTsKQEAgLTE4MjYsNiArMTgzOCwxMCBAQAogICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpyZWFzb25fc3RyID0gTlVMTDsKIAorICAgIGlmICghdXNlbGYtPm9iamVjdCkKKyAgICAgICAgLyogTm90IHByb3Blcmx5IGluaXRpYWxpemVkLiAqLworICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21TdHJpbmcoIiIpOworCiAgICAgLyogR2V0IHJlYXNvbiBhcyBhIHN0cmluZywgd2hpY2ggaXQgbWlnaHQgbm90IGJlIGlmIGl0J3MgYmVlbgogICAgICAgIG1vZGlmaWVkIGFmdGVyIHdlIHdlcmUgY29udHJ1Y3RlZC4gKi8KICAgICByZWFzb25fc3RyID0gUHlPYmplY3RfU3RyKHVzZWxmLT5yZWFzb24pOwpAQCAtMjExMSw3ICsyMTI3LDggQEAKIAogICAgIG0gPSBQeV9Jbml0TW9kdWxlNCgiZXhjZXB0aW9ucyIsIGZ1bmN0aW9ucywgZXhjZXB0aW9uc19kb2MsCiAgICAgICAgIChQeU9iamVjdCAqKU5VTEwsIFBZVEhPTl9BUElfVkVSU0lPTik7Ci0gICAgaWYgKG0gPT0gTlVMTCkgcmV0dXJuOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAogICAgIGJsdGlubW9kID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJfX2J1aWx0aW5fXyIpOwogICAgIGlmIChibHRpbm1vZCA9PSBOVUxMKQpAQCAtMjIwMyw3ICsyMjIwLDYgQEAKICAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoImluaXQgb2YgcHJlLWFsbG9jYXRlZCBSdW50aW1lRXJyb3IgZmFpbGVkIik7CiAgICAgICAgIFB5X0RFQ1JFRihhcmdzX3R1cGxlKTsKICAgICB9Ci0KICAgICBQeV9ERUNSRUYoYmx0aW5tb2QpOwogfQogCmRpZmYgLS1naXQgYS9PYmplY3RzL2ZpbGVvYmplY3QuYyBiL09iamVjdHMvZmlsZW9iamVjdC5jCmluZGV4IDczN2ViYjcuLjU1OTQwNTggMTAwNjQ0Ci0tLSBhL09iamVjdHMvZmlsZW9iamVjdC5jCisrKyBiL09iamVjdHMvZmlsZW9iamVjdC5jCkBAIC00OTMsOSArNDkzLDEwIEBACiBQeU9iamVjdCAqCiBQeUZpbGVfRnJvbVN0cmluZyhjaGFyICpuYW1lLCBjaGFyICptb2RlKQogeworICAgIGV4dGVybiBpbnQgZmNsb3NlKEZJTEUgKik7CiAgICAgUHlGaWxlT2JqZWN0ICpmOwogCi0gICAgZiA9IChQeUZpbGVPYmplY3QgKilQeUZpbGVfRnJvbUZpbGUoKEZJTEUgKilOVUxMLCBuYW1lLCBtb2RlLCBOVUxMKTsKKyAgICBmID0gKFB5RmlsZU9iamVjdCAqKVB5RmlsZV9Gcm9tRmlsZSgoRklMRSAqKU5VTEwsIG5hbWUsIG1vZGUsIGZjbG9zZSk7CiAgICAgaWYgKGYgIT0gTlVMTCkgewogICAgICAgICBpZiAob3Blbl90aGVfZmlsZShmLCBuYW1lLCBtb2RlKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYoZik7CkBAIC02MzUsMTEgKzYzNiwxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbGVfcmVwcihQeUZpbGVPYmplY3QgKmYpCiB7CisgICAgUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgUHlPYmplY3QgKm5hbWUgPSBOVUxMOwogICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soZi0+Zl9uYW1lKSkgewogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLSAgICAgICAgUHlPYmplY3QgKnJldCA9IE5VTEw7Ci0gICAgICAgIFB5T2JqZWN0ICpuYW1lID0gUHlVbmljb2RlX0FzVW5pY29kZUVzY2FwZVN0cmluZyhmLT5mX25hbWUpOwotICAgICAgICBjb25zdCBjaGFyICpuYW1lX3N0ciA9IG5hbWUgPyBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKSA6ICI/IjsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZV9zdHI7CisgICAgICAgIG5hbWUgPSBQeVVuaWNvZGVfQXNVbmljb2RlRXNjYXBlU3RyaW5nKGYtPmZfbmFtZSk7CisgICAgICAgIG5hbWVfc3RyID0gbmFtZSA/IFB5U3RyaW5nX0FzU3RyaW5nKG5hbWUpIDogIj8iOwogICAgICAgICByZXQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8JXMgZmlsZSB1JyVzJywgbW9kZSAnJXMnIGF0ICVwPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5mX2ZwID09IE5VTEwgPyAiY2xvc2VkIiA6ICJvcGVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfc3RyLApAQCAtNjQ5LDExICs2NTIsMTYgQEAKICAgICAgICAgcmV0dXJuIHJldDsKICNlbmRpZgogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8JXMgZmlsZSAnJXMnLCBtb2RlICclcycgYXQgJXA+IiwKKyAgICAgICAgbmFtZSA9IFB5T2JqZWN0X1JlcHIoZi0+Zl9uYW1lKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8JXMgZmlsZSAlcywgbW9kZSAnJXMnIGF0ICVwPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5mX2ZwID09IE5VTEwgPyAiY2xvc2VkIiA6ICJvcGVuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKGYtPmZfbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKGYtPmZfbW9kZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmKTsKKyAgICAgICAgUHlfWERFQ1JFRihuYW1lKTsKKyAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiB9CiAKQEAgLTEwNzIsMTIgKzEwODAsMjMgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgYnl0ZXNyZWFkID0gMDsKICAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCBpbnRlcnJ1cHRlZDsKICAgICAgICAgRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCiAgICAgICAgIGVycm5vID0gMDsKICAgICAgICAgY2h1bmtzaXplID0gUHlfVW5pdmVyc2FsTmV3bGluZUZyZWFkKEJVRih2KSArIGJ5dGVzcmVhZCwKICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnNpemUgLSBieXRlc3JlYWQsIGYtPmZfZnAsIChQeU9iamVjdCAqKWYpOworICAgICAgICBpbnRlcnJ1cHRlZCA9IGZlcnJvcihmLT5mX2ZwKSAmJiBlcnJubyA9PSBFSU5UUjsKICAgICAgICAgRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQorICAgICAgICBpZiAoaW50ZXJydXB0ZWQpIHsKKyAgICAgICAgICAgIGNsZWFyZXJyKGYtPmZfZnApOworICAgICAgICAgICAgaWYgKFB5RXJyX0NoZWNrU2lnbmFscygpKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIGlmIChjaHVua3NpemUgPT0gMCkgeworICAgICAgICAgICAgaWYgKGludGVycnVwdGVkKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgaWYgKCFmZXJyb3IoZi0+Zl9mcCkpCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjbGVhcmVycihmLT5mX2ZwKTsKQEAgLTEwOTIsNyArMTExMSw3IEBACiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgICAgICBieXRlc3JlYWQgKz0gY2h1bmtzaXplOwotICAgICAgICBpZiAoYnl0ZXNyZWFkIDwgYnVmZmVyc2l6ZSkgeworICAgICAgICBpZiAoYnl0ZXNyZWFkIDwgYnVmZmVyc2l6ZSAmJiAhaW50ZXJydXB0ZWQpIHsKICAgICAgICAgICAgIGNsZWFyZXJyKGYtPmZfZnApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTExMzMsMTIgKzExNTIsMjMgQEAKICAgICBudG9kbyA9IHBidWYubGVuOwogICAgIG5kb25lID0gMDsKICAgICB3aGlsZSAobnRvZG8gPiAwKSB7CisgICAgICAgIGludCBpbnRlcnJ1cHRlZDsKICAgICAgICAgRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCiAgICAgICAgIGVycm5vID0gMDsKICAgICAgICAgbm5vdyA9IFB5X1VuaXZlcnNhbE5ld2xpbmVGcmVhZChwdHIrbmRvbmUsIG50b2RvLCBmLT5mX2ZwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKWYpOworICAgICAgICBpbnRlcnJ1cHRlZCA9IGZlcnJvcihmLT5mX2ZwKSAmJiBlcnJubyA9PSBFSU5UUjsKICAgICAgICAgRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQorICAgICAgICBpZiAoaW50ZXJydXB0ZWQpIHsKKyAgICAgICAgICAgIGNsZWFyZXJyKGYtPmZfZnApOworICAgICAgICAgICAgaWYgKFB5RXJyX0NoZWNrU2lnbmFscygpKSB7CisgICAgICAgICAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgaWYgKG5ub3cgPT0gMCkgeworICAgICAgICAgICAgaWYgKGludGVycnVwdGVkKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgaWYgKCFmZXJyb3IoZi0+Zl9mcCkpCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CkBAIC0xNDI2LDggKzE0NTYsMjUgQEAKICAgICAgICAgICAgICAgICAqYnVmKysgPSBjOwogICAgICAgICAgICAgICAgIGlmIChjID09ICdcbicpIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCBjID09IEVPRiAmJiBza2lwbmV4dGxmICkKLSAgICAgICAgICAgICAgICBuZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUjsKKyAgICAgICAgICAgIGlmIChjID09IEVPRikgeworICAgICAgICAgICAgICAgIGlmIChmZXJyb3IoZnApICYmIGVycm5vID09IEVJTlRSKSB7CisgICAgICAgICAgICAgICAgICAgIEZVTkxPQ0tGSUxFKGZwKTsKKyAgICAgICAgICAgICAgICAgICAgRklMRV9BQk9SVF9BTExPV19USFJFQURTKGYpCisgICAgICAgICAgICAgICAgICAgIGYtPmZfbmV3bGluZXR5cGVzID0gbmV3bGluZXR5cGVzOworICAgICAgICAgICAgICAgICAgICBmLT5mX3NraXBuZXh0bGYgPSBza2lwbmV4dGxmOworCisgICAgICAgICAgICAgICAgICAgIGlmIChQeUVycl9DaGVja1NpZ25hbHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogV2UgZXhlY3V0ZWQgUHl0aG9uIHNpZ25hbCBoYW5kbGVycyBhbmQgZ290IG5vIGV4Y2VwdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICogTm93IGJhY2sgdG8gcmVhZGluZyB0aGUgbGluZSB3aGVyZSB3ZSBsZWZ0IG9mZi4gKi8KKyAgICAgICAgICAgICAgICAgICAgY2xlYXJlcnIoZnApOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNraXBuZXh0bGYpCisgICAgICAgICAgICAgICAgICAgIG5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgLyogSWYgbm90IHVuaXZlcnNhbCBuZXdsaW5lcyB1c2UgdGhlIG5vcm1hbCBsb29wICovCiAgICAgICAgIHdoaWxlICgoYyA9IEdFVEMoZnApKSAhPSBFT0YgJiYKICAgICAgICAgICAgICAgICgqYnVmKysgPSBjKSAhPSAnXG4nICYmCkBAIC0xNDQxLDYgKzE0ODgsMTYgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBpZiAoYyA9PSBFT0YpIHsKICAgICAgICAgICAgIGlmIChmZXJyb3IoZnApKSB7CisgICAgICAgICAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChQeUVycl9DaGVja1NpZ25hbHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogV2UgZXhlY3V0ZWQgUHl0aG9uIHNpZ25hbCBoYW5kbGVycyBhbmQgZ290IG5vIGV4Y2VwdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICogTm93IGJhY2sgdG8gcmVhZGluZyB0aGUgbGluZSB3aGVyZSB3ZSBsZWZ0IG9mZi4gKi8KKyAgICAgICAgICAgICAgICAgICAgY2xlYXJlcnIoZnApOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwogICAgICAgICAgICAgICAgIGNsZWFyZXJyKGZwKTsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CkBAIC0xNjE2LDcgKzE2NzMsNyBAQAogICAgIHNpemVfdCB0b3RhbHJlYWQgPSAwOwogICAgIGNoYXIgKnAsICpxLCAqZW5kOwogICAgIGludCBlcnI7Ci0gICAgaW50IHNob3J0cmVhZCA9IDA7CisgICAgaW50IHNob3J0cmVhZCA9IDA7ICAvKiBib29sLCBkaWQgdGhlIHByZXZpb3VzIHJlYWQgY29tZSB1cCBzaG9ydD8gKi8KIAogICAgIGlmIChmLT5mX2ZwID09IE5VTEwpCiAgICAgICAgIHJldHVybiBlcnJfY2xvc2VkKCk7CkBAIC0xNjQ2LDYgKzE3MDMsMTQgQEAKICAgICAgICAgICAgIHNpemVoaW50ID0gMDsKICAgICAgICAgICAgIGlmICghZmVycm9yKGYtPmZfZnApKQogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX0NoZWNrU2lnbmFscygpKSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNsZWFyZXJyKGYtPmZfZnApOworICAgICAgICAgICAgICAgIHNob3J0cmVhZCA9IDA7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CiAgICAgICAgICAgICBjbGVhcmVycihmLT5mX2ZwKTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CkBAIC0xNzM5LDYgKzE4MDQsNyBAQAogICAgIGNvbnN0IGNoYXIgKnM7CiAgICAgUHlfc3NpemVfdCBuLCBuMjsKICAgICBQeU9iamVjdCAqZW5jb2RlZCA9IE5VTEw7CisgICAgaW50IGVycl9mbGFnID0gMCwgZXJyOwogCiAgICAgaWYgKGYtPmZfZnAgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIGVycl9jbG9zZWQoKTsKQEAgLTE3NTEsNyArMTgxNyw2IEBACiAgICAgICAgIG4gPSBwYnVmLmxlbjsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLCAqZXJyb3JzOwogICAgICAgICBQeU9iamVjdCAqdGV4dDsKICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIiwgJnRleHQpKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xNzU5LDcgKzE4MjQsOSBAQAogICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2sodGV4dCkpIHsKICAgICAgICAgICAgIHMgPSBQeVN0cmluZ19BU19TVFJJTkcodGV4dCk7CiAgICAgICAgICAgICBuID0gUHlTdHJpbmdfR0VUX1NJWkUodGV4dCk7CisjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQogICAgICAgICB9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayh0ZXh0KSkgeworICAgICAgICAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsICplcnJvcnM7CiAgICAgICAgICAgICBpZiAoZi0+Zl9lbmNvZGluZyAhPSBQeV9Ob25lKQogICAgICAgICAgICAgICAgIGVuY29kaW5nID0gUHlTdHJpbmdfQVNfU1RSSU5HKGYtPmZfZW5jb2RpbmcpOwogICAgICAgICAgICAgZWxzZQpAQCAtMTc3Myw2ICsxODQwLDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIHMgPSBQeVN0cmluZ19BU19TVFJJTkcoZW5jb2RlZCk7CiAgICAgICAgICAgICBuID0gUHlTdHJpbmdfR0VUX1NJWkUoZW5jb2RlZCk7CisjZW5kaWYKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIodGV4dCwgJnMsICZuKSkKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTE3ODIsMTEgKzE4NTAsMTYgQEAKICAgICBGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKICAgICBlcnJubyA9IDA7CiAgICAgbjIgPSBmd3JpdGUocywgMSwgbiwgZi0+Zl9mcCk7CisgICAgaWYgKG4yICE9IG4gfHwgZmVycm9yKGYtPmZfZnApKSB7CisgICAgICAgIGVycl9mbGFnID0gMTsKKyAgICAgICAgZXJyID0gZXJybm87CisgICAgfQogICAgIEZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKICAgICBQeV9YREVDUkVGKGVuY29kZWQpOwogICAgIGlmIChmLT5mX2JpbmFyeSkKICAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7Ci0gICAgaWYgKG4yICE9IG4pIHsKKyAgICBpZiAoZXJyX2ZsYWcpIHsKKyAgICAgICAgZXJybm8gPSBlcnI7CiAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKICAgICAgICAgY2xlYXJlcnIoZi0+Zl9mcCk7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTg2OCwxMyArMTk0MSwxMyBAQAogICAgICAgICAgICAgUHlPYmplY3QgKnYgPSBQeUxpc3RfR0VUX0lURU0obGlzdCwgaSk7CiAgICAgICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmZmVyOwotICAgICAgICAgICAgICAgIGlmICgoKGYtPmZfYmluYXJ5ICYmCi0gICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3RfQXNSZWFkQnVmZmVyKHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB2b2lkKiopJmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcih2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbikpKSB7CisgICAgICAgICAgICAgICAgaW50IHJlczsKKyAgICAgICAgICAgICAgICBpZiAoZi0+Zl9iaW5hcnkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gUHlPYmplY3RfQXNSZWFkQnVmZmVyKHYsIChjb25zdCB2b2lkKiopJmJ1ZmZlciwgJmxlbik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gUHlPYmplY3RfQXNDaGFyQnVmZmVyKHYsICZidWZmZXIsICZsZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmVzKSB7CiAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCiAgICAgICAgICAgICAid3JpdGVsaW5lcygpIGFyZ3VtZW50IG11c3QgYmUgYSBzZXF1ZW5jZSBvZiBzdHJpbmdzIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKQEAgLTI1OTIsMTAgKzI2NjUsMTAgQEAKICAgICBQeU9iamVjdCAqbWV0aDsKIAogICAgIGlmIChQeUludF9DaGVjayhvKSkgewotICAgICAgICBmZCA9IFB5SW50X0FzTG9uZyhvKTsKKyAgICAgICAgZmQgPSBfUHlJbnRfQXNJbnQobyk7CiAgICAgfQogICAgIGVsc2UgaWYgKFB5TG9uZ19DaGVjayhvKSkgewotICAgICAgICBmZCA9IFB5TG9uZ19Bc0xvbmcobyk7CisgICAgICAgIGZkID0gX1B5TG9uZ19Bc0ludChvKTsKICAgICB9CiAgICAgZWxzZSBpZiAoKG1ldGggPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG8sICJmaWxlbm8iKSkgIT0gTlVMTCkKICAgICB7CkBAIC0yNjA1LDExICsyNjc4LDExIEBACiAgICAgICAgICAgICByZXR1cm4gLTE7CiAKICAgICAgICAgaWYgKFB5SW50X0NoZWNrKGZubykpIHsKLSAgICAgICAgICAgIGZkID0gUHlJbnRfQXNMb25nKGZubyk7CisgICAgICAgICAgICBmZCA9IF9QeUludF9Bc0ludChmbm8pOwogICAgICAgICAgICAgUHlfREVDUkVGKGZubyk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAoUHlMb25nX0NoZWNrKGZubykpIHsKLSAgICAgICAgICAgIGZkID0gUHlMb25nX0FzTG9uZyhmbm8pOworICAgICAgICAgICAgZmQgPSBfUHlMb25nX0FzSW50KGZubyk7CiAgICAgICAgICAgICBQeV9ERUNSRUYoZm5vKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKZGlmZiAtLWdpdCBhL09iamVjdHMvZmxvYXRvYmplY3QuYyBiL09iamVjdHMvZmxvYXRvYmplY3QuYwppbmRleCA2M2I3YzE3Li4yYmVjMGZiIDEwMDY0NAotLS0gYS9PYmplY3RzL2Zsb2F0b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9mbG9hdG9iamVjdC5jCkBAIC0xMDg2LDYgKzEwODYsMTYgQEAKICAgICBjaGFyICpidWYsICpidWZfZW5kLCBzaG9ydGJ1ZlsxMDBdLCAqbXlidWY9c2hvcnRidWY7CiAgICAgaW50IGRlY3B0LCBzaWduLCB2YWwsIGhhbGZ3YXlfY2FzZTsKICAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBfUHlfU0VUXzUzQklUX1BSRUNJU0lPTl9IRUFERVI7CisKKyAgICAvKiBFYXN5IHBhdGggZm9yIHRoZSBjb21tb24gY2FzZSBuZGlnaXRzID09IDAuICovCisgICAgaWYgKG5kaWdpdHMgPT0gMCkgeworICAgICAgICByb3VuZGVkID0gcm91bmQoeCk7CisgICAgICAgIGlmIChmYWJzKHJvdW5kZWQgLSB4KSA9PSAwLjUpCisgICAgICAgICAgICAvKiBoYWxmd2F5IGJldHdlZW4gdHdvIGludGVnZXJzOyB1c2Ugcm91bmQtYXdheS1mcm9tLXplcm8gKi8KKyAgICAgICAgICAgIHJvdW5kZWQgPSB4ICsgKHggPiAwLjAgPyAwLjUgOiAtMC41KTsKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShyb3VuZGVkKTsKKyAgICB9CiAKICAgICAvKiBUaGUgYmFzaWMgaWRlYSBpcyB2ZXJ5IHNpbXBsZTogY29udmVydCBhbmQgcm91bmQgdGhlIGRvdWJsZSB0byBhCiAgICAgICAgZGVjaW1hbCBzdHJpbmcgdXNpbmcgX1B5X2RnX2R0b2EsIHRoZW4gY29udmVydCB0aGF0IGRlY2ltYWwgc3RyaW5nCkBAIC0xMTQyLDcgKzExNTIsOSBAQAogICAgICAgICBoYWxmd2F5X2Nhc2UgPSAwOwogCiAgICAgLyogcm91bmQgdG8gYSBkZWNpbWFsIHN0cmluZzsgdXNlIGFuIGV4dHJhIHBsYWNlIGZvciBoYWxmd2F5IGNhc2UgKi8KKyAgICBfUHlfU0VUXzUzQklUX1BSRUNJU0lPTl9TVEFSVDsKICAgICBidWYgPSBfUHlfZGdfZHRvYSh4LCAzLCBuZGlnaXRzK2hhbGZ3YXlfY2FzZSwgJmRlY3B0LCAmc2lnbiwgJmJ1Zl9lbmQpOworICAgIF9QeV9TRVRfNTNCSVRfUFJFQ0lTSU9OX0VORDsKICAgICBpZiAoYnVmID09IE5VTEwpIHsKICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xMTg2LDcgKzExOTgsOSBAQAogCiAgICAgLyogYW5kIGNvbnZlcnQgdGhlIHJlc3VsdGluZyBzdHJpbmcgYmFjayB0byBhIGRvdWJsZSAqLwogICAgIGVycm5vID0gMDsKKyAgICBfUHlfU0VUXzUzQklUX1BSRUNJU0lPTl9TVEFSVDsKICAgICByb3VuZGVkID0gX1B5X2RnX3N0cnRvZChteWJ1ZiwgTlVMTCk7CisgICAgX1B5X1NFVF81M0JJVF9QUkVDSVNJT05fRU5EOwogICAgIGlmIChlcnJubyA9PSBFUkFOR0UgJiYgZmFicyhyb3VuZGVkKSA+PSAxLikKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAicm91bmRlZCB2YWx1ZSB0b28gbGFyZ2UgdG8gcmVwcmVzZW50Iik7CkBAIC0xNzY5LDkgKzE3ODMsOSBAQAogUHlEb2NfU1RSVkFSKGZsb2F0X2FzX2ludGVnZXJfcmF0aW9fZG9jLAogImZsb2F0LmFzX2ludGVnZXJfcmF0aW8oKSAtPiAoaW50LCBpbnQpXG4iCiAiXG4iCi0iUmV0dXJucyBhIHBhaXIgb2YgaW50ZWdlcnMsIHdob3NlIHJhdGlvIGlzIGV4YWN0bHkgZXF1YWwgdG8gdGhlIG9yaWdpbmFsXG4iCisiUmV0dXJuIGEgcGFpciBvZiBpbnRlZ2Vycywgd2hvc2UgcmF0aW8gaXMgZXhhY3RseSBlcXVhbCB0byB0aGUgb3JpZ2luYWxcbiIKICJmbG9hdCBhbmQgd2l0aCBhIHBvc2l0aXZlIGRlbm9taW5hdG9yLlxuIgotIlJhaXNlcyBPdmVyZmxvd0Vycm9yIG9uIGluZmluaXRpZXMgYW5kIGEgVmFsdWVFcnJvciBvbiBOYU5zLlxuIgorIlJhaXNlIE92ZXJmbG93RXJyb3Igb24gaW5maW5pdGllcyBhbmQgYSBWYWx1ZUVycm9yIG9uIE5hTnMuXG4iCiAiXG4iCiAiPj4+ICgxMC4wKS5hc19pbnRlZ2VyX3JhdGlvKClcbiIKICIoMTAsIDEpXG4iCkBAIC0xOTU2LDcgKzE5NzAsNyBAQAogIidJRUVFLCBiaWctZW5kaWFuJyBvciAnSUVFRSwgbGl0dGxlLWVuZGlhbicsIGFuZCBpbiBhZGRpdGlvbiBjYW4gb25seSBiZVxuIgogIm9uZSBvZiB0aGUgbGF0dGVyIHR3byBpZiBpdCBhcHBlYXJzIHRvIG1hdGNoIHRoZSB1bmRlcmx5aW5nIEMgcmVhbGl0eS5cbiIKICJcbiIKLSJPdmVycmlkZXMgdGhlIGF1dG9tYXRpYyBkZXRlcm1pbmF0aW9uIG9mIEMtbGV2ZWwgZmxvYXRpbmcgcG9pbnQgdHlwZS5cbiIKKyJPdmVycmlkZSB0aGUgYXV0b21hdGljIGRldGVybWluYXRpb24gb2YgQy1sZXZlbCBmbG9hdGluZyBwb2ludCB0eXBlLlxuIgogIlRoaXMgYWZmZWN0cyBob3cgZmxvYXRzIGFyZSBjb252ZXJ0ZWQgdG8gYW5kIGZyb20gYmluYXJ5IHN0cmluZ3MuIik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0yMDAzLDkgKzIwMTcsOSBAQAogCiBzdGF0aWMgUHlNZXRob2REZWYgZmxvYXRfbWV0aG9kc1tdID0gewogICAgIHsiY29uanVnYXRlIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWZsb2F0X2Zsb2F0LCAgICAgICBNRVRIX05PQVJHUywKLSAgICAgIlJldHVybnMgc2VsZiwgdGhlIGNvbXBsZXggY29uanVnYXRlIG9mIGFueSBmbG9hdC4ifSwKKyAgICAgIlJldHVybiBzZWxmLCB0aGUgY29tcGxleCBjb25qdWdhdGUgb2YgYW55IGZsb2F0LiJ9LAogICAgIHsiX190cnVuY19fIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWZsb2F0X3RydW5jLCBNRVRIX05PQVJHUywKLSAgICAgIlJldHVybnMgdGhlIEludGVncmFsIGNsb3Nlc3QgdG8geCBiZXR3ZWVuIDAgYW5kIHguIn0sCisgICAgICJSZXR1cm4gdGhlIEludGVncmFsIGNsb3Nlc3QgdG8geCBiZXR3ZWVuIDAgYW5kIHguIn0sCiAgICAgeyJhc19pbnRlZ2VyX3JhdGlvIiwgKFB5Q0Z1bmN0aW9uKWZsb2F0X2FzX2ludGVnZXJfcmF0aW8sIE1FVEhfTk9BUkdTLAogICAgICBmbG9hdF9hc19pbnRlZ2VyX3JhdGlvX2RvY30sCiAgICAgeyJmcm9taGV4IiwgKFB5Q0Z1bmN0aW9uKWZsb2F0X2Zyb21oZXgsCkBAIC0yMDEzLDE0ICsyMDI3LDE0IEBACiAgICAgeyJoZXgiLCAoUHlDRnVuY3Rpb24pZmxvYXRfaGV4LAogICAgICBNRVRIX05PQVJHUywgZmxvYXRfaGV4X2RvY30sCiAgICAgeyJpc19pbnRlZ2VyIiwgICAgICAoUHlDRnVuY3Rpb24pZmxvYXRfaXNfaW50ZWdlciwgIE1FVEhfTk9BUkdTLAotICAgICAiUmV0dXJucyBUcnVlIGlmIHRoZSBmbG9hdCBpcyBhbiBpbnRlZ2VyLiJ9LAorICAgICAiUmV0dXJuIFRydWUgaWYgdGhlIGZsb2F0IGlzIGFuIGludGVnZXIuIn0sCiAjaWYgMAogICAgIHsiaXNfaW5mIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZsb2F0X2lzX2luZiwgICAgICBNRVRIX05PQVJHUywKLSAgICAgIlJldHVybnMgVHJ1ZSBpZiB0aGUgZmxvYXQgaXMgcG9zaXRpdmUgb3IgbmVnYXRpdmUgaW5maW5pdGUuIn0sCisgICAgICJSZXR1cm4gVHJ1ZSBpZiB0aGUgZmxvYXQgaXMgcG9zaXRpdmUgb3IgbmVnYXRpdmUgaW5maW5pdGUuIn0sCiAgICAgeyJpc19maW5pdGUiLCAgICAgICAoUHlDRnVuY3Rpb24pZmxvYXRfaXNfZmluaXRlLCAgIE1FVEhfTk9BUkdTLAotICAgICAiUmV0dXJucyBUcnVlIGlmIHRoZSBmbG9hdCBpcyBmaW5pdGUsIG5laXRoZXIgaW5maW5pdGUgbm9yIE5hTi4ifSwKKyAgICAgIlJldHVybiBUcnVlIGlmIHRoZSBmbG9hdCBpcyBmaW5pdGUsIG5laXRoZXIgaW5maW5pdGUgbm9yIE5hTi4ifSwKICAgICB7ImlzX25hbiIsICAgICAgICAgIChQeUNGdW5jdGlvbilmbG9hdF9pc19uYW4sICAgICAgTUVUSF9OT0FSR1MsCi0gICAgICJSZXR1cm5zIFRydWUgaWYgdGhlIGZsb2F0IGlzIG5vdCBhIG51bWJlciAoTmFOKS4ifSwKKyAgICAgIlJldHVybiBUcnVlIGlmIHRoZSBmbG9hdCBpcyBub3QgYSBudW1iZXIgKE5hTikuIn0sCiAjZW5kaWYKICAgICB7Il9fZ2V0bmV3YXJnc19fIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZsb2F0X2dldG5ld2FyZ3MsICBNRVRIX05PQVJHU30sCiAgICAgeyJfX2dldGZvcm1hdF9fIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilmbG9hdF9nZXRmb3JtYXQsCmRpZmYgLS1naXQgYS9PYmplY3RzL2ZyYW1lb2JqZWN0LmMgYi9PYmplY3RzL2ZyYW1lb2JqZWN0LmMKaW5kZXggYTM0NzZjZi4uZjllNGEwZSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9mcmFtZW9iamVjdC5jCisrKyBiL09iamVjdHMvZnJhbWVvYmplY3QuYwpAQCAtMjE0LDYgKzIxNCw3IEBACiAgICAgICAgIGNhc2UgU0VUVVBfTE9PUDoKICAgICAgICAgY2FzZSBTRVRVUF9FWENFUFQ6CiAgICAgICAgIGNhc2UgU0VUVVBfRklOQUxMWToKKyAgICAgICAgY2FzZSBTRVRVUF9XSVRIOgogICAgICAgICAgICAgYmxvY2tzdGFja1tibG9ja3N0YWNrX3RvcCsrXSA9IGFkZHI7CiAgICAgICAgICAgICBpbl9maW5hbGx5W2Jsb2Nrc3RhY2tfdG9wLTFdID0gMDsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjIxLDcgKzIyMiw3IEBACiAgICAgICAgIGNhc2UgUE9QX0JMT0NLOgogICAgICAgICAgICAgYXNzZXJ0KGJsb2Nrc3RhY2tfdG9wID4gMCk7CiAgICAgICAgICAgICBzZXR1cF9vcCA9IGNvZGVbYmxvY2tzdGFja1tibG9ja3N0YWNrX3RvcC0xXV07Ci0gICAgICAgICAgICBpZiAoc2V0dXBfb3AgPT0gU0VUVVBfRklOQUxMWSkgeworICAgICAgICAgICAgaWYgKHNldHVwX29wID09IFNFVFVQX0ZJTkFMTFkgfHwgc2V0dXBfb3AgPT0gU0VUVVBfV0lUSCkgewogICAgICAgICAgICAgICAgIGluX2ZpbmFsbHlbYmxvY2tzdGFja190b3AtMV0gPSAxOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CkBAIC0yMzYsNyArMjM3LDcgQEAKICAgICAgICAgICAgICAqIGJlIHNlZWluZyBzdWNoIGFuIEVORF9GSU5BTExZLikgKi8KICAgICAgICAgICAgIGlmIChibG9ja3N0YWNrX3RvcCA+IDApIHsKICAgICAgICAgICAgICAgICBzZXR1cF9vcCA9IGNvZGVbYmxvY2tzdGFja1tibG9ja3N0YWNrX3RvcC0xXV07Ci0gICAgICAgICAgICAgICAgaWYgKHNldHVwX29wID09IFNFVFVQX0ZJTkFMTFkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2V0dXBfb3AgPT0gU0VUVVBfRklOQUxMWSB8fCBzZXR1cF9vcCA9PSBTRVRVUF9XSVRIKSB7CiAgICAgICAgICAgICAgICAgICAgIGJsb2Nrc3RhY2tfdG9wLS07CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjk4LDYgKzI5OSw3IEBACiAgICAgICAgIGNhc2UgU0VUVVBfTE9PUDoKICAgICAgICAgY2FzZSBTRVRVUF9FWENFUFQ6CiAgICAgICAgIGNhc2UgU0VUVVBfRklOQUxMWToKKyAgICAgICAgY2FzZSBTRVRVUF9XSVRIOgogICAgICAgICAgICAgZGVsdGFfaWJsb2NrKys7CiAgICAgICAgICAgICBicmVhazsKIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9mdW5jb2JqZWN0LmMgYi9PYmplY3RzL2Z1bmNvYmplY3QuYwppbmRleCBhZDBmNDI3Li41MWI2YzlkIDEwMDY0NAotLS0gYS9PYmplY3RzL2Z1bmNvYmplY3QuYworKysgYi9PYmplY3RzL2Z1bmNvYmplY3QuYwpAQCAtNzg0LDkgKzc4NCw3IEBACiBzdGF0aWMgaW50CiBzbV9jbGVhcihzdGF0aWNtZXRob2QgKnNtKQogewotICAgIFB5X1hERUNSRUYoc20tPnNtX2NhbGxhYmxlKTsKLSAgICBzbS0+c21fY2FsbGFibGUgPSBOVUxMOwotCisgICAgUHlfQ0xFQVIoc20tPnNtX2NhbGxhYmxlKTsKICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9nZW5vYmplY3QuYyBiL09iamVjdHMvZ2Vub2JqZWN0LmMKaW5kZXggYWY4MTJjMC4uMDgyZTAzYyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9nZW5vYmplY3QuYworKysgYi9PYmplY3RzL2dlbm9iamVjdC5jCkBAIC03Niw2ICs3Niw3IEBACiAKICAgICAvKiBHZW5lcmF0b3JzIGFsd2F5cyByZXR1cm4gdG8gdGhlaXIgbW9zdCByZWNlbnQgY2FsbGVyLCBub3QKICAgICAgKiBuZWNlc3NhcmlseSB0aGVpciBjcmVhdG9yLiAqLworICAgIGYtPmZfdHN0YXRlID0gdHN0YXRlOwogICAgIFB5X1hJTkNSRUYodHN0YXRlLT5mcmFtZSk7CiAgICAgYXNzZXJ0KGYtPmZfYmFjayA9PSBOVUxMKTsKICAgICBmLT5mX2JhY2sgPSB0c3RhdGUtPmZyYW1lOwpAQCAtODksNiArOTAsOCBAQAogICAgICAqIGN5Y2xlLiAqLwogICAgIGFzc2VydChmLT5mX2JhY2sgPT0gdHN0YXRlLT5mcmFtZSk7CiAgICAgUHlfQ0xFQVIoZi0+Zl9iYWNrKTsKKyAgICAvKiBDbGVhciB0aGUgYm9ycm93ZWQgcmVmZXJlbmNlIHRvIHRoZSB0aHJlYWQgc3RhdGUgKi8KKyAgICBmLT5mX3RzdGF0ZSA9IE5VTEw7CiAKICAgICAvKiBJZiB0aGUgZ2VuZXJhdG9yIGp1c3QgcmV0dXJuZWQgKGFzIG9wcG9zZWQgdG8geWllbGRpbmcpLCBzaWduYWwKICAgICAgKiB0aGF0IHRoZSBnZW5lcmF0b3IgaXMgZXhoYXVzdGVkLiAqLwpAQCAtMTIwLDcgKzEyMyw3IEBACiB9CiAKIFB5RG9jX1NUUlZBUihjbG9zZV9kb2MsCi0iY2xvc2UoYXJnKSAtPiByYWlzZSBHZW5lcmF0b3JFeGl0IGluc2lkZSBnZW5lcmF0b3IuIik7CisiY2xvc2UoKSAtPiByYWlzZSBHZW5lcmF0b3JFeGl0IGluc2lkZSBnZW5lcmF0b3IuIik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZW5fY2xvc2UoUHlHZW5PYmplY3QgKmdlbiwgUHlPYmplY3QgKmFyZ3MpCmRpZmYgLS1naXQgYS9PYmplY3RzL2ludG9iamVjdC5jIGIvT2JqZWN0cy9pbnRvYmplY3QuYwppbmRleCBlNTE4ZTc0Li4yODE4MmY5IDEwMDY0NAotLS0gYS9PYmplY3RzL2ludG9iamVjdC5jCisrKyBiL09iamVjdHMvaW50b2JqZWN0LmMKQEAgLTE4OSw2ICsxODksMjAgQEAKICAgICByZXR1cm4gdmFsOwogfQogCitpbnQKK19QeUludF9Bc0ludChQeU9iamVjdCAqb2JqKQoreworICAgIGxvbmcgcmVzdWx0ID0gUHlJbnRfQXNMb25nKG9iaik7CisgICAgaWYgKHJlc3VsdCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKHJlc3VsdCA+IElOVF9NQVggfHwgcmVzdWx0IDwgSU5UX01JTikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJQeXRob24gaW50IHRvbyBsYXJnZSB0byBjb252ZXJ0IHRvIEMgaW50Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIChpbnQpcmVzdWx0OworfQorCiBQeV9zc2l6ZV90CiBQeUludF9Bc1NzaXplX3QocmVnaXN0ZXIgUHlPYmplY3QgKm9wKQogewpAQCAtMTA1OSw4ICsxMDczLDE0IEBACiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxPaTppbnQiLCBrd2xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJngsICZiYXNlKSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKHggPT0gTlVMTCkKKyAgICBpZiAoeCA9PSBOVUxMKSB7CisgICAgICAgIGlmIChiYXNlICE9IC05MDkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludCgpIG1pc3Npbmcgc3RyaW5nIGFyZ3VtZW50Iik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoMEwpOworICAgIH0KICAgICBpZiAoYmFzZSA9PSAtOTA5KQogICAgICAgICByZXR1cm4gUHlOdW1iZXJfSW50KHgpOwogICAgIGlmIChQeVN0cmluZ19DaGVjayh4KSkgewpAQCAtMTMzNCwxNSArMTM1NCwyMCBAQAogfTsKIAogUHlEb2NfU1RSVkFSKGludF9kb2MsCi0iaW50KHhbLCBiYXNlXSkgLT4gaW50ZWdlclxuXAorImludCh4PTApIC0+IGludCBvciBsb25nXG5cCitpbnQoeCwgYmFzZT0xMCkgLT4gaW50IG9yIGxvbmdcblwKIFxuXAotQ29udmVydCBhIHN0cmluZyBvciBudW1iZXIgdG8gYW4gaW50ZWdlciwgaWYgcG9zc2libGUuICBBIGZsb2F0aW5nIHBvaW50XG5cCi1hcmd1bWVudCB3aWxsIGJlIHRydW5jYXRlZCB0b3dhcmRzIHplcm8gKHRoaXMgZG9lcyBub3QgaW5jbHVkZSBhIHN0cmluZ1xuXAotcmVwcmVzZW50YXRpb24gb2YgYSBmbG9hdGluZyBwb2ludCBudW1iZXIhKSAgV2hlbiBjb252ZXJ0aW5nIGEgc3RyaW5nLCB1c2VcblwKLXRoZSBvcHRpb25hbCBiYXNlLiAgSXQgaXMgYW4gZXJyb3IgdG8gc3VwcGx5IGEgYmFzZSB3aGVuIGNvbnZlcnRpbmcgYVxuXAotbm9uLXN0cmluZy4gIElmIGJhc2UgaXMgemVybywgdGhlIHByb3BlciBiYXNlIGlzIGd1ZXNzZWQgYmFzZWQgb24gdGhlXG5cCi1zdHJpbmcgY29udGVudC4gIElmIHRoZSBhcmd1bWVudCBpcyBvdXRzaWRlIHRoZSBpbnRlZ2VyIHJhbmdlIGFcblwKLWxvbmcgb2JqZWN0IHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZC4iKTsKK0NvbnZlcnQgYSBudW1iZXIgb3Igc3RyaW5nIHRvIGFuIGludGVnZXIsIG9yIHJldHVybiAwIGlmIG5vIGFyZ3VtZW50c1xuXAorYXJlIGdpdmVuLiAgSWYgeCBpcyBmbG9hdGluZyBwb2ludCwgdGhlIGNvbnZlcnNpb24gdHJ1bmNhdGVzIHRvd2FyZHMgemVyby5cblwKK0lmIHggaXMgb3V0c2lkZSB0aGUgaW50ZWdlciByYW5nZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBsb25nIGluc3RlYWQuXG5cCitcblwKK0lmIHggaXMgbm90IGEgbnVtYmVyIG9yIGlmIGJhc2UgaXMgZ2l2ZW4sIHRoZW4geCBtdXN0IGJlIGEgc3RyaW5nIG9yXG5cCitVbmljb2RlIG9iamVjdCByZXByZXNlbnRpbmcgYW4gaW50ZWdlciBsaXRlcmFsIGluIHRoZSBnaXZlbiBiYXNlLiAgVGhlXG5cCitsaXRlcmFsIGNhbiBiZSBwcmVjZWRlZCBieSAnKycgb3IgJy0nIGFuZCBiZSBzdXJyb3VuZGVkIGJ5IHdoaXRlc3BhY2UuXG5cCitUaGUgYmFzZSBkZWZhdWx0cyB0byAxMC4gIFZhbGlkIGJhc2VzIGFyZSAwIGFuZCAyLTM2LiAgQmFzZSAwIG1lYW5zIHRvXG5cCitpbnRlcnByZXQgdGhlIGJhc2UgZnJvbSB0aGUgc3RyaW5nIGFzIGFuIGludGVnZXIgbGl0ZXJhbC5cblwKKz4+PiBpbnQoJzBiMTAwJywgYmFzZT0wKVxuXAorNCIpOwogCiBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIGludF9hc19udW1iZXIgPSB7CiAgICAgKGJpbmFyeWZ1bmMpaW50X2FkZCwgICAgICAgIC8qbmJfYWRkKi8KZGlmZiAtLWdpdCBhL09iamVjdHMvbGlzdHNvcnQudHh0IGIvT2JqZWN0cy9saXN0c29ydC50eHQKaW5kZXggMzFhNTQ0NS4uMDhmZWY5NiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9saXN0c29ydC50eHQKKysrIGIvT2JqZWN0cy9saXN0c29ydC50eHQKQEAgLTYwLDYgKzYwLDcgQEAKICAgICAgIC9zb3J0OiBhc2NlbmRpbmcgZGF0YQogICAgICAgM3NvcnQ6IGFzY2VuZGluZywgdGhlbiAzIHJhbmRvbSBleGNoYW5nZXMKICAgICAgICtzb3J0OiBhc2NlbmRpbmcsIHRoZW4gMTAgcmFuZG9tIGF0IHRoZSBlbmQKKyAgICAgICVzb3J0OiBhc2NlbmRpbmcsIHRoZW4gcmFuZG9tbHkgcmVwbGFjZSAxJSBvZiBlbGVtZW50cyB3LyByYW5kb20gdmFsdWVzCiAgICAgICB+c29ydDogbWFueSBkdXBsaWNhdGVzCiAgICAgICA9c29ydDogYWxsIGVxdWFsCiAgICAgICAhc29ydDogd29yc3QgY2FzZSBzY2VuYXJpbwpAQCAtOTksMTEgKzEwMCwxMyBAQAogICBUaGUgYWxnb3JpdGhtcyBhcmUgZWZmZWN0aXZlbHkgaWRlbnRpY2FsIGluIHRoZXNlIGNhc2VzLCBleGNlcHQgdGhhdAogICB0aW1zb3J0IGRvZXMgb25lIGxlc3MgY29tcGFyZSBpbiBcc29ydC4KIAotICBOb3cgZm9yIHRoZSBtb3JlIGludGVyZXN0aW5nIGNhc2VzLiAgbGcobiEpIGlzIHRoZSBpbmZvcm1hdGlvbi10aGVvcmV0aWMKLSAgbGltaXQgZm9yIHRoZSBiZXN0IGFueSBjb21wYXJpc29uLWJhc2VkIHNvcnRpbmcgYWxnb3JpdGhtIGNhbiBkbyBvbgotICBhdmVyYWdlIChhY3Jvc3MgYWxsIHBlcm11dGF0aW9ucykuICBXaGVuIGEgbWV0aG9kIGdldHMgc2lnbmlmaWNhbnRseQotICBiZWxvdyB0aGF0LCBpdCdzIGVpdGhlciBhc3Ryb25vbWljYWxseSBsdWNreSwgb3IgaXMgZmluZGluZyBleHBsb2l0YWJsZQotICBzdHJ1Y3R1cmUgaW4gdGhlIGRhdGEuCisgIE5vdyBmb3IgdGhlIG1vcmUgaW50ZXJlc3RpbmcgY2FzZXMuICBXaGVyZSBsZyh4KSBpcyB0aGUgbG9nYXJpdGhtIG9mIHggdG8KKyAgdGhlIGJhc2UgMiAoZS5nLiwgbGcoOCk9MyksIGxnKG4hKSBpcyB0aGUgaW5mb3JtYXRpb24tdGhlb3JldGljIGxpbWl0IGZvcgorICB0aGUgYmVzdCBhbnkgY29tcGFyaXNvbi1iYXNlZCBzb3J0aW5nIGFsZ29yaXRobSBjYW4gZG8gb24gYXZlcmFnZSAoYWNyb3NzCisgIGFsbCBwZXJtdXRhdGlvbnMpLiAgV2hlbiBhIG1ldGhvZCBnZXRzIHNpZ25pZmljYW50bHkgYmVsb3cgdGhhdCwgaXQncworICBlaXRoZXIgYXN0cm9ub21pY2FsbHkgbHVja3ksIG9yIGlzIGZpbmRpbmcgZXhwbG9pdGFibGUgc3RydWN0dXJlIGluIHRoZQorICBkYXRhLgorCiAKICAgICAgIG4gICBsZyhuISkgICAgKnNvcnQgICAgM3NvcnQgICAgICtzb3J0ICAgJXNvcnQgICAgfnNvcnQgICAgICFzb3J0CiAtLS0tLS0tICAtLS0tLS0tICAgLS0tLS0tICAgLS0tLS0tLSAgLS0tLS0tLSAgLS0tLS0tICAtLS0tLS0tICAtLS0tLS0tLQpAQCAtMjUwLDcgKzI1Myw3IEBACiAtLS0tLS0tLS0tLS0tLS0tCiBJZiBOIDwgNjQsIG1pbnJ1biBpcyBOLiAgSU9XLCBiaW5hcnkgaW5zZXJ0aW9uIHNvcnQgaXMgdXNlZCBmb3IgdGhlIHdob2xlCiBhcnJheSB0aGVuOyBpdCdzIGhhcmQgdG8gYmVhdCB0aGF0IGdpdmVuIHRoZSBvdmVyaGVhZHMgb2YgdHJ5aW5nIHNvbWV0aGluZwotZmFuY2llci4KK2ZhbmNpZXIgKHNlZSBub3RlIEJJTlNPUlQpLgogCiBXaGVuIE4gaXMgYSBwb3dlciBvZiAyLCB0ZXN0aW5nIG9uIHJhbmRvbSBkYXRhIHNob3dlZCB0aGF0IG1pbnJ1biB2YWx1ZXMgb2YKIDE2LCAzMiwgNjQgYW5kIDEyOCB3b3JrZWQgYWJvdXQgZXF1YWxseSB3ZWxsLiAgQXQgMjU2IHRoZSBkYXRhLW1vdmVtZW50IGNvc3QKQEAgLTM3OCwxMCArMzgxLDEwIEBACiAKIE1lcmdlIE1lbW9yeQogLS0tLS0tLS0tLS0tCi1NZXJnaW5nIGFkamFjZW50IHJ1bnMgb2YgbGVuZ3RocyBBIGFuZCBCIGluLXBsYWNlIGlzIHZlcnkgZGlmZmljdWx0LgotVGhlb3JldGljYWwgY29uc3RydWN0aW9ucyBhcmUga25vd24gdGhhdCBjYW4gZG8gaXQsIGJ1dCB0aGV5J3JlIHRvbyBkaWZmaWN1bHQKLWFuZCBzbG93IGZvciBwcmFjdGljYWwgdXNlLiAgQnV0IGlmIHdlIGhhdmUgdGVtcCBtZW1vcnkgZXF1YWwgdG8gbWluKEEsIEIpLAotaXQncyBlYXN5LgorTWVyZ2luZyBhZGphY2VudCBydW5zIG9mIGxlbmd0aHMgQSBhbmQgQiBpbi1wbGFjZSwgYW5kIGluIGxpbmVhciB0aW1lLCBpcworZGlmZmljdWx0LiAgVGhlb3JldGljYWwgY29uc3RydWN0aW9ucyBhcmUga25vd24gdGhhdCBjYW4gZG8gaXQsIGJ1dCB0aGV5J3JlCit0b28gZGlmZmljdWx0IGFuZCBzbG93IGZvciBwcmFjdGljYWwgdXNlLiAgQnV0IGlmIHdlIGhhdmUgdGVtcCBtZW1vcnkgZXF1YWwKK3RvIG1pbihBLCBCKSwgaXQncyBlYXN5LgogCiBJZiBBIGlzIHNtYWxsZXIgKGZ1bmN0aW9uIG1lcmdlX2xvKSwgY29weSBBIHRvIGEgdGVtcCBhcnJheSwgbGVhdmUgQiBhbG9uZSwKIGFuZCB0aGVuIHdlIGNhbiBkbyB0aGUgb2J2aW91cyBtZXJnZSBhbGdvcml0aG0gbGVmdCB0byByaWdodCwgZnJvbSB0aGUgdGVtcApAQCAtNDU2LDEwICs0NTksMTAgQEAKIAogQWZ0ZXIgZmluZGluZyBzdWNoIGEgaywgdGhlIHJlZ2lvbiBvZiB1bmNlcnRhaW50eSBpcyByZWR1Y2VkIHRvIDIqKihrLTEpIC0gMQogY29uc2VjdXRpdmUgZWxlbWVudHMsIGFuZCBhIHN0cmFpZ2h0IGJpbmFyeSBzZWFyY2ggcmVxdWlyZXMgZXhhY3RseSBrLTEKLWFkZGl0aW9uYWwgY29tcGFyaXNvbnMgdG8gbmFpbCBpdC4gIFRoZW4gd2UgY29weSBhbGwgdGhlIEIncyB1cCB0byB0aGF0Ci1wb2ludCBpbiBvbmUgY2h1bmssIGFuZCB0aGVuIGNvcHkgQVswXS4gIE5vdGUgdGhhdCBubyBtYXR0ZXIgd2hlcmUgQVswXQotYmVsb25ncyBpbiBCLCB0aGUgY29tYmluYXRpb24gb2YgZ2FsbG9waW5nICsgYmluYXJ5IHNlYXJjaCBmaW5kcyBpdCBpbiBubwotbW9yZSB0aGFuIGFib3V0IDIqbGcoQikgY29tcGFyaXNvbnMuCithZGRpdGlvbmFsIGNvbXBhcmlzb25zIHRvIG5haWwgaXQgKHNlZSBub3RlIFJFR0lPTiBPRiBVTkNFUlRBSU5UWSkuICBUaGVuIHdlCitjb3B5IGFsbCB0aGUgQidzIHVwIHRvIHRoYXQgcG9pbnQgaW4gb25lIGNodW5rLCBhbmQgdGhlbiBjb3B5IEFbMF0uICBOb3RlCit0aGF0IG5vIG1hdHRlciB3aGVyZSBBWzBdIGJlbG9uZ3MgaW4gQiwgdGhlIGNvbWJpbmF0aW9uIG9mIGdhbGxvcGluZyArIGJpbmFyeQorc2VhcmNoIGZpbmRzIGl0IGluIG5vIG1vcmUgdGhhbiBhYm91dCAyKmxnKEIpIGNvbXBhcmlzb25zLgogCiBJZiB3ZSBkaWQgYSBzdHJhaWdodCBiaW5hcnkgc2VhcmNoLCB3ZSBjb3VsZCBmaW5kIGl0IGluIG5vIG1vcmUgdGhhbgogY2VpbGluZyhsZyhCKzEpKSBjb21wYXJpc29ucyAtLSBidXQgc3RyYWlnaHQgYmluYXJ5IHNlYXJjaCB0YWtlcyB0aGF0IG1hbnkKQEAgLTU3MiwxMSArNTc1LDExIEBACiBUaGUgZGVzY3JpcHRpb24gYWJvdmUgd2FzIGZvciBtZXJnZV9sby4gIG1lcmdlX2hpIGhhcyB0byBtZXJnZSAiZnJvbSB0aGUKIG90aGVyIGVuZCIsIGFuZCByZWFsbHkgbmVlZHMgdG8gZ2FsbG9wIHN0YXJ0aW5nIGF0IHRoZSBsYXN0IGVsZW1lbnQgaW4gYSBydW4KIGluc3RlYWQgb2YgdGhlIGZpcnN0LiAgR2FsbG9waW5nIGZyb20gdGhlIGZpcnN0IHN0aWxsIHdvcmtzLCBidXQgZG9lcyBtb3JlCi1jb21wYXJpc29ucyB0aGFuIGl0IHNob3VsZCAodGhpcyBpcyBzaWduaWZpY2FudCAtLSBJIHRpbWVkIGl0IGJvdGggd2F5cykuCi1Gb3IgdGhpcyByZWFzb24sIHRoZSBnYWxsb3BfbGVmdCgpIGFuZCBnYWxsb3BfcmlnaHQoKSBmdW5jdGlvbnMgaGF2ZSBhCi0iaGludCIgYXJndW1lbnQsIHdoaWNoIGlzIHRoZSBpbmRleCBhdCB3aGljaCBnYWxsb3Bpbmcgc2hvdWxkIGJlZ2luLiAgU28KLWdhbGxvcGluZyBjYW4gYWN0dWFsbHkgc3RhcnQgYXQgYW55IGluZGV4LCBhbmQgcHJvY2VlZCBhdCBvZmZzZXRzIG9mIDEsIDMsCi03LCAxNSwgLi4uIG9yIC0xLCAtMywgLTcsIC0xNSwgLi4uIGZyb20gdGhlIHN0YXJ0aW5nIGluZGV4LgorY29tcGFyaXNvbnMgdGhhbiBpdCBzaG91bGQgKHRoaXMgaXMgc2lnbmlmaWNhbnQgLS0gSSB0aW1lZCBpdCBib3RoIHdheXMpLiBGb3IKK3RoaXMgcmVhc29uLCB0aGUgZ2FsbG9wX2xlZnQoKSBhbmQgZ2FsbG9wX3JpZ2h0KCkgKHNlZSBub3RlIExFRlQgT1IgUklHSFQpCitmdW5jdGlvbnMgaGF2ZSBhICJoaW50IiBhcmd1bWVudCwgd2hpY2ggaXMgdGhlIGluZGV4IGF0IHdoaWNoIGdhbGxvcGluZworc2hvdWxkIGJlZ2luLiAgU28gZ2FsbG9waW5nIGNhbiBhY3R1YWxseSBzdGFydCBhdCBhbnkgaW5kZXgsIGFuZCBwcm9jZWVkIGF0CitvZmZzZXRzIG9mIDEsIDMsIDcsIDE1LCAuLi4gb3IgLTEsIC0zLCAtNywgLTE1LCAuLi4gZnJvbSB0aGUgc3RhcnRpbmcgaW5kZXguCiAKIEluIHRoZSBjb2RlIGFzIEkgdHlwZSBpdCdzIGFsd2F5cyBjYWxsZWQgd2l0aCBlaXRoZXIgMCBvciBuLTEgKHdoZXJlIG4gaXMKIHRoZSAjIG9mIGVsZW1lbnRzIGluIGEgcnVuKS4gIEl0J3MgdGVtcHRpbmcgdG8gdHJ5IHRvIGRvIHNvbWV0aGluZyBmYW5jaWVyLApAQCAtNjc1LDMgKzY3OCw3OCBAQAogWzIsIDFdLiAgR3JhdGlmeWluZ2x5LCB0aW1zb3J0IGRvZXNuJ3QgZG8gYW55IHNwZWNpYWwtY2FzaW5nLCBzbyBoYWQgdG8gYmUKIHRhdWdodCBob3cgdG8gZGVhbCB3aXRoIG1peHR1cmVzIG9mIGFzY2VuZGluZyBhbmQgZGVzY2VuZGluZyBydW5zCiBlZmZpY2llbnRseSBpbiBhbGwgY2FzZXMuCisKKworTk9URVMKKy0tLS0tCisKK0JJTlNPUlQKK0EgImJpbmFyeSBpbnNlcnRpb24gc29ydCIgaXMganVzdCBsaWtlIGEgdGV4dGJvb2sgaW5zZXJ0aW9uIHNvcnQsIGJ1dCBpbnN0ZWFkCitvZiBsb2NhdGluZyB0aGUgY29ycmVjdCBwb3NpdGlvbiBvZiB0aGUgbmV4dCBpdGVtIHZpYSBsaW5lYXIgKG9uZSBhdCBhIHRpbWUpCitzZWFyY2gsIGFuIGVxdWl2YWxlbnQgdG8gUHl0aG9uJ3MgYmlzZWN0LmJpc2VjdF9yaWdodCBpcyB1c2VkIHRvIGZpbmQgdGhlCitjb3JyZWN0IHBvc2l0aW9uIGluIGxvZ2FyaXRobWljIHRpbWUuICBNb3N0IHRleHRzIGRvbid0IG1lbnRpb24gdGhpcwordmFyaWF0aW9uLCBhbmQgdGhvc2UgdGhhdCBkbyB1c3VhbGx5IHNheSBpdCdzIG5vdCB3b3J0aCB0aGUgYm90aGVyOiAgaW5zZXJ0aW9uCitzb3J0IHJlbWFpbnMgcXVhZHJhdGljIChleHBlY3RlZCBhbmQgd29yc3QgY2FzZXMpIGVpdGhlciB3YXkuICBTcGVlZGluZyB0aGUKK3NlYXJjaCBkb2Vzbid0IHJlZHVjZSB0aGUgcXVhZHJhdGljIGRhdGEgbW92ZW1lbnQgY29zdHMuCisKK0J1dCBpbiBDUHl0aG9uJ3MgY2FzZSwgY29tcGFyaXNvbnMgYXJlIGV4dHJhb3JkaW5hcmlseSBleHBlbnNpdmUgY29tcGFyZWQgdG8KK21vdmluZyBkYXRhLCBhbmQgdGhlIGRldGFpbHMgbWF0dGVyLiAgTW92aW5nIG9iamVjdHMgaXMganVzdCBjb3B5aW5nCitwb2ludGVycy4gIENvbXBhcmlzb25zIGNhbiBiZSBhcmJpdHJhcmlseSBleHBlbnNpdmUgKGNhbiBpbnZva2UgYXJiaXRhcnkKK3VzZXItc3VwcGxpZWQgUHl0aG9uIGNvZGUpLCBidXQgZXZlbiBpbiBzaW1wbGUgY2FzZXMgKGxpa2UgMyA8IDQpIF9hbGxfCitkZWNpc2lvbnMgYXJlIG1hZGUgYXQgcnVudGltZTogIHdoYXQncyB0aGUgdHlwZSBvZiB0aGUgbGVmdCBjb21wYXJhbmQ/ICB0aGUKK3R5cGUgb2YgdGhlIHJpZ2h0PyAgZG8gdGhleSBuZWVkIHRvIGJlIGNvZXJjZWQgdG8gYSBjb21tb24gdHlwZT8gIHdoZXJlJ3MgdGhlCitjb2RlIHRvIGNvbXBhcmUgdGhlc2UgdHlwZXM/ICBBbmQgc28gb24uICBFdmVuIHRoZSBzaW1wbGVzdCBQeXRob24gY29tcGFyaXNvbgordHJpZ2dlcnMgYSBsYXJnZSBwaWxlIG9mIEMtbGV2ZWwgcG9pbnRlciBkZXJlZmVyZW5jZXMsIGNvbmRpdGlvbmFscywgYW5kCitmdW5jdGlvbiBjYWxscy4KKworU28gY3V0dGluZyB0aGUgbnVtYmVyIG9mIGNvbXBhcmVzIGlzIGFsbW9zdCBhbHdheXMgbWVhc3VyYWJseSBoZWxwZnVsIGluCitDUHl0aG9uLCBhbmQgdGhlIHNhdmluZ3Mgc3dhbXAgdGhlIHF1YWRyYXRpYy10aW1lIGRhdGEgbW92ZW1lbnQgY29zdHMgZm9yCityZWFzb25hYmxlIG1pbnJ1biB2YWx1ZXMuCisKKworTEVGVCBPUiBSSUdIVAorZ2FsbG9wX2xlZnQoKSBhbmQgZ2FsbG9wX3JpZ2h0KCkgYXJlIGFraW4gdG8gdGhlIFB5dGhvbiBiaXNlY3QgbW9kdWxlJ3MKK2Jpc2VjdF9sZWZ0KCkgYW5kIGJpc2VjdF9yaWdodCgpOiAgdGhleSdyZSB0aGUgc2FtZSB1bmxlc3MgdGhlIHNsaWNlIHRoZXkncmUKK3NlYXJjaGluZyBjb250YWlucyBhIChhdCBsZWFzdCBvbmUpIHZhbHVlIGVxdWFsIHRvIHRoZSB2YWx1ZSBiZWluZyBzZWFyY2hlZAorZm9yLiAgSW4gdGhhdCBjYXNlLCBnYWxsb3BfbGVmdCgpIHJldHVybnMgdGhlIHBvc2l0aW9uIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUKK2xlZnRtb3N0IGVxdWFsIHZhbHVlLCBhbmQgZ2FsbG9wX3JpZ2h0KCkgdGhlIHBvc2l0aW9uIGltbWVkaWF0ZWx5IGFmdGVyIHRoZQorcmlnaHRtb3N0IGVxdWFsIHZhbHVlLiAgVGhlIGRpc3RpbmN0aW9uIGlzIG5lZWRlZCB0byBwcmVzZXJ2ZSBzdGFiaWxpdHkuICBJbgorZ2VuZXJhbCwgd2hlbiBtZXJnaW5nIGFkamFjZW50IHJ1bnMgQSBhbmQgQiwgZ2FsbG9wX2xlZnQgaXMgdXNlZCB0byBzZWFyY2gKK3RocnUgQiBmb3Igd2hlcmUgYW4gZWxlbWVudCBmcm9tIEEgYmVsb25ncywgYW5kIGdhbGxvcF9yaWdodCB0byBzZWFyY2ggdGhydSBBCitmb3Igd2hlcmUgYW4gZWxlbWVudCBmcm9tIEIgYmVsb25ncy4KKworCitSRUdJT04gT0YgVU5DRVJUQUlOVFkKK1R3byBraW5kcyBvZiBjb25mdXNpb24gc2VlbSB0byBiZSBjb21tb24gYWJvdXQgdGhlIGNsYWltIHRoYXQgYWZ0ZXIgZmluZGluZworYSBrIHN1Y2ggdGhhdAorCisgICAgQlsyKiooay0xKSAtIDFdIDwgQVswXSA8PSBCWzIqKmsgLSAxXQorCit0aGVuIGEgYmluYXJ5IHNlYXJjaCByZXF1aXJlcyBleGFjdGx5IGstMSB0cmllcyB0byBmaW5kIEFbMF0ncyBwcm9wZXIKK2xvY2F0aW9uLiBGb3IgY29uY3JldGVuZXNzLCBzYXkgaz0zLCBzbyBCWzNdIDwgQVswXSA8PSBCWzddLgorCitUaGUgZmlyc3QgY29uZnVzaW9uIHRha2VzIHRoZSBmb3JtICJPSywgdGhlbiB0aGUgcmVnaW9uIG9mIHVuY2VydGFpbnR5IGlzIGF0CitpbmRpY2VzIDMsIDQsIDUsIDYgYW5kIDc6ICB0aGF0J3MgNSBlbGVtZW50cywgbm90IHRoZSBjbGFpbWVkIDIqKihrLTEpIC0gMSA9CiszIjsgb3IgdGhlIHJlZ2lvbiBpcyB2aWV3ZWQgYXMgYSBQeXRob24gc2xpY2UgYW5kIHRoZSBvYmplY3Rpb24gaXMgImJ1dCB0aGF0J3MKK3RoZSBzbGljZSBCWzM6N10sIHNvIGhhcyA3LTMgPSA0IGVsZW1lbnRzIi4gIFJlc29sdXRpb246ICB3ZSd2ZSBhbHJlYWR5Citjb21wYXJlZCBBWzBdIGFnYWluc3QgQlszXSBhbmQgYWdhaW5zdCBCWzddLCBzbyBBWzBdJ3MgY29ycmVjdCBsb2NhdGlvbiBpcworYWxyZWFkeSBrbm93biB3cnQgX2JvdGhfIGVuZHBvaW50cy4gIFdoYXQgcmVtYWlucyBpcyB0byBmaW5kIEFbMF0ncyBjb3JyZWN0Citsb2NhdGlvbiB3cnQgQls0XSwgQls1XSBhbmQgQls2XSwgd2hpY2ggc3BhbnMgMyBlbGVtZW50cy4gIE9yIGluIGdlbmVyYWwsIHRoZQorc2xpY2UgKGxlYXZpbmcgb2ZmIGJvdGggZW5kcG9pbnRzKSAoMioqKGstMSktMSkrMSB0aHJvdWdoICgyKiprLTEpLTEKK2luY2x1c2l2ZSA9IDIqKihrLTEpIHRocm91Z2ggKDIqKmstMSktMSBpbmNsdXNpdmUsIHdoaWNoIGhhcworICAgICgyKiprLTEpLTEgLSAyKiooay0xKSArIDEgPQorICAgIDIqKmstMSAtIDIqKihrLTEpID0KKyAgICAyKjIqKmstMSAtIDIqKihrLTEpID0KKyAgICAoMi0xKSoyKiooay0xKSAtIDEgPQorICAgIDIqKihrLTEpIC0gMQorZWxlbWVudHMuCisKK1RoZSBzZWNvbmQgY29uZnVzaW9uOiAgImstMSA9IDIgYmluYXJ5IHNlYXJjaGVzIGNhbiBmaW5kIHRoZSBjb3JyZWN0IGxvY2F0aW9uCithbW9uZyAyKiooay0xKSA9IDQgZWxlbWVudHMsIGJ1dCB5b3UncmUgb25seSBhcHBseWluZyBpdCB0byAzIGVsZW1lbnRzOiAgd2UKK2NvdWxkIG1ha2UgdGhpcyBtb3JlIGVmZmljaWVudCBieSBhcnJhbmdpbmcgZm9yIHRoZSByZWdpb24gb2YgdW5jZXJ0YWludHkgdG8KK3NwYW4gMioqKGstMSkgZWxlbWVudHMuIiAgUmVzb2x1dGlvbjogIHRoYXQgY29uZnVzZXMgImVsZW1lbnRzIiB3aXRoCisibG9jYXRpb25zIi4gIEluIGEgc2xpY2Ugd2l0aCBOIGVsZW1lbnRzLCB0aGVyZSBhcmUgTisxIF9sb2NhdGlvbnNfLiAgSW4gdGhlCitleGFtcGxlLCB3aXRoIHRoZSByZWdpb24gb2YgdW5jZXJ0YWludHkgQls0XSwgQls1XSwgQls2XSwgdGhlcmUgYXJlIDQKK2xvY2F0aW9uczogIGJlZm9yZSBCWzRdLCBiZXR3ZWVuIEJbNF0gYW5kIEJbNV0sIGJldHdlZW4gQls1XSBhbmQgQls2XSwgYW5kCithZnRlciBCWzZdLiAgSW4gZ2VuZXJhbCwgYWNyb3NzIDIqKihrLTEpLTEgZWxlbWVudHMsIHRoZXJlIGFyZSAyKiooay0xKQorbG9jYXRpb25zLiAgVGhhdCdzIHdoeSBrLTEgYmluYXJ5IHNlYXJjaGVzIGFyZSBuZWNlc3NhcnkgYW5kIHN1ZmZpY2llbnQuCmRpZmYgLS1naXQgYS9PYmplY3RzL2xvbmdvYmplY3QuYyBiL09iamVjdHMvbG9uZ29iamVjdC5jCmluZGV4IGNkODZhMWYuLjQwNWJlMmUgMTAwNjQ0Ci0tLSBhL09iamVjdHMvbG9uZ29iamVjdC5jCisrKyBiL09iamVjdHMvbG9uZ29iamVjdC5jCkBAIC0zMzksNiArMzM5LDI0IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorLyogR2V0IGEgQyBpbnQgZnJvbSBhIGxvbmcgaW50IG9iamVjdCBvciBhbnkgb2JqZWN0IHRoYXQgaGFzIGFuIF9faW50X18KKyAgIG1ldGhvZC4gIFJldHVybiAtMSBhbmQgc2V0IGFuIGVycm9yIGlmIG92ZXJmbG93IG9jY3Vycy4gKi8KKworaW50CitfUHlMb25nX0FzSW50KFB5T2JqZWN0ICpvYmopCit7CisgICAgaW50IG92ZXJmbG93OworICAgIGxvbmcgcmVzdWx0ID0gUHlMb25nX0FzTG9uZ0FuZE92ZXJmbG93KG9iaiwgJm92ZXJmbG93KTsKKyAgICBpZiAob3ZlcmZsb3cgfHwgcmVzdWx0ID4gSU5UX01BWCB8fCByZXN1bHQgPCBJTlRfTUlOKSB7CisgICAgICAgIC8qIFhYWDogY291bGQgYmUgY3V0ZSBhbmQgZ2l2ZSBhIGRpZmZlcmVudAorICAgICAgICAgICBtZXNzYWdlIGZvciBvdmVyZmxvdyA9PSAtMSAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJQeXRob24gaW50IHRvbyBsYXJnZSB0byBjb252ZXJ0IHRvIEMgaW50Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIChpbnQpcmVzdWx0OworfQorCiAvKiBHZXQgYSBQeV9zc2l6ZV90IGZyb20gYSBsb25nIGludCBvYmplY3QuCiAgICBSZXR1cm5zIC0xIGFuZCBzZXRzIGFuIGVycm9yIGNvbmRpdGlvbiBpZiBvdmVyZmxvdyBvY2N1cnMuICovCiAKQEAgLTM0NTYsMTAgKzM0NzQsMTYgQEAKICAgICAgICAgICAgIGdvdG8gRG9uZTsKICAgICAgICAgfQogCi0gICAgICAgIC8qIGlmIGJhc2UgPCAwOgotICAgICAgICAgICAgICAgYmFzZSA9IGJhc2UgJSBtb2R1bHVzCi0gICAgICAgICAgIEhhdmluZyB0aGUgYmFzZSBwb3NpdGl2ZSBqdXN0IG1ha2VzIHRoaW5ncyBlYXNpZXIuICovCi0gICAgICAgIGlmIChQeV9TSVpFKGEpIDwgMCkgeworICAgICAgICAvKiBSZWR1Y2UgYmFzZSBieSBtb2R1bHVzIGluIHNvbWUgY2FzZXM6CisgICAgICAgICAgIDEuIElmIGJhc2UgPCAwLiAgRm9yY2luZyB0aGUgYmFzZSBub24tbmVnYXRpdmUgbWFrZXMgdGhpbmdzIGVhc2llci4KKyAgICAgICAgICAgMi4gSWYgYmFzZSBpcyBvYnZpb3VzbHkgbGFyZ2VyIHRoYW4gdGhlIG1vZHVsdXMuICBUaGUgInNtYWxsCisgICAgICAgICAgICAgIGV4cG9uZW50IiBjYXNlIGxhdGVyIGNhbiBtdWx0aXBseSBkaXJlY3RseSBieSBiYXNlIHJlcGVhdGVkbHksCisgICAgICAgICAgICAgIHdoaWxlIHRoZSAibGFyZ2UgZXhwb25lbnQiIGNhc2UgbXVsdGlwbGllcyBkaXJlY3RseSBieSBiYXNlIDMxCisgICAgICAgICAgICAgIHRpbWVzLiAgSXQgY2FuIGJlIHVuYm91bmRlZGx5IGZhc3RlciB0byBtdWx0aXBseSBieQorICAgICAgICAgICAgICBiYXNlICUgbW9kdWx1cyBpbnN0ZWFkLgorICAgICAgICAgICBXZSBjb3VsZCBfYWx3YXlzXyBkbyB0aGlzIHJlZHVjdGlvbiwgYnV0IGxfZGl2bW9kKCkgaXNuJ3QgY2hlYXAsCisgICAgICAgICAgIHNvIHdlIG9ubHkgZG8gaXQgd2hlbiBpdCBidXlzIHNvbWV0aGluZy4gKi8KKyAgICAgICAgaWYgKFB5X1NJWkUoYSkgPCAwIHx8IFB5X1NJWkUoYSkgPiBQeV9TSVpFKGMpKSB7CiAgICAgICAgICAgICBpZiAobF9kaXZtb2QoYSwgYywgTlVMTCwgJnRlbXApIDwgMCkKICAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwogICAgICAgICAgICAgUHlfREVDUkVGKGEpOwpAQCAtMzk4Nyw4ICs0MDExLDE0IEBACiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxPaTpsb25nIiwga3dsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4LCAmYmFzZSkpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmICh4ID09IE5VTEwpCisgICAgaWYgKHggPT0gTlVMTCkgeworICAgICAgICBpZiAoYmFzZSAhPSAtOTA5KSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb25nKCkgbWlzc2luZyBzdHJpbmcgYXJndW1lbnQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoMEwpOworICAgIH0KICAgICBpZiAoYmFzZSA9PSAtOTA5KQogICAgICAgICByZXR1cm4gUHlOdW1iZXJfTG9uZyh4KTsKICAgICBlbHNlIGlmIChQeVN0cmluZ19DaGVjayh4KSkgewpAQCAtNDIyMSwxMyArNDI1MSwxOSBAQAogfTsKIAogUHlEb2NfU1RSVkFSKGxvbmdfZG9jLAotImxvbmcoeFssIGJhc2VdKSAtPiBpbnRlZ2VyXG5cCisibG9uZyh4PTApIC0+IGxvbmdcblwKK2xvbmcoeCwgYmFzZT0xMCkgLT4gbG9uZ1xuXAogXG5cCi1Db252ZXJ0IGEgc3RyaW5nIG9yIG51bWJlciB0byBhIGxvbmcgaW50ZWdlciwgaWYgcG9zc2libGUuICBBIGZsb2F0aW5nXG5cCi1wb2ludCBhcmd1bWVudCB3aWxsIGJlIHRydW5jYXRlZCB0b3dhcmRzIHplcm8gKHRoaXMgZG9lcyBub3QgaW5jbHVkZSBhXG5cCi1zdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBmbG9hdGluZyBwb2ludCBudW1iZXIhKSAgV2hlbiBjb252ZXJ0aW5nIGFcblwKLXN0cmluZywgdXNlIHRoZSBvcHRpb25hbCBiYXNlLiAgSXQgaXMgYW4gZXJyb3IgdG8gc3VwcGx5IGEgYmFzZSB3aGVuXG5cCi1jb252ZXJ0aW5nIGEgbm9uLXN0cmluZy4iKTsKK0NvbnZlcnQgYSBudW1iZXIgb3Igc3RyaW5nIHRvIGEgbG9uZyBpbnRlZ2VyLCBvciByZXR1cm4gMEwgaWYgbm8gYXJndW1lbnRzXG5cCithcmUgZ2l2ZW4uICBJZiB4IGlzIGZsb2F0aW5nIHBvaW50LCB0aGUgY29udmVyc2lvbiB0cnVuY2F0ZXMgdG93YXJkcyB6ZXJvLlxuXAorXG5cCitJZiB4IGlzIG5vdCBhIG51bWJlciBvciBpZiBiYXNlIGlzIGdpdmVuLCB0aGVuIHggbXVzdCBiZSBhIHN0cmluZyBvclxuXAorVW5pY29kZSBvYmplY3QgcmVwcmVzZW50aW5nIGFuIGludGVnZXIgbGl0ZXJhbCBpbiB0aGUgZ2l2ZW4gYmFzZS4gIFRoZVxuXAorbGl0ZXJhbCBjYW4gYmUgcHJlY2VkZWQgYnkgJysnIG9yICctJyBhbmQgYmUgc3Vycm91bmRlZCBieSB3aGl0ZXNwYWNlLlxuXAorVGhlIGJhc2UgZGVmYXVsdHMgdG8gMTAuICBWYWxpZCBiYXNlcyBhcmUgMCBhbmQgMi0zNi4gIEJhc2UgMCBtZWFucyB0b1xuXAoraW50ZXJwcmV0IHRoZSBiYXNlIGZyb20gdGhlIHN0cmluZyBhcyBhbiBpbnRlZ2VyIGxpdGVyYWwuXG5cCis+Pj4gaW50KCcwYjEwMCcsIGJhc2U9MClcblwKKzRMIik7CiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgbG9uZ19hc19udW1iZXIgPSB7CiAgICAgKGJpbmFyeWZ1bmMpbG9uZ19hZGQsICAgICAgIC8qbmJfYWRkKi8KZGlmZiAtLWdpdCBhL09iamVjdHMvbW9kdWxlb2JqZWN0LmMgYi9PYmplY3RzL21vZHVsZW9iamVjdC5jCmluZGV4IDA4ZTk3NDAuLmYyZmVkMzAgMTAwNjQ0Ci0tLSBhL09iamVjdHMvbW9kdWxlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9tb2R1bGVvYmplY3QuYwpAQCAtMTIyLDcgKzEyMiw4IEBACiAgICAgICAgICAgICBpZiAoc1swXSA9PSAnXycgJiYgc1sxXSAhPSAnXycpIHsKICAgICAgICAgICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcgPiAxKQogICAgICAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiIyAgIGNsZWFyWzFdICVzXG4iLCBzKTsKLSAgICAgICAgICAgICAgICBQeURpY3RfU2V0SXRlbShkLCBrZXksIFB5X05vbmUpOworICAgICAgICAgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShkLCBrZXksIFB5X05vbmUpICE9IDApCisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xMzUsNyArMTM2LDggQEAKICAgICAgICAgICAgIGlmIChzWzBdICE9ICdfJyB8fCBzdHJjbXAocywgIl9fYnVpbHRpbnNfXyIpICE9IDApIHsKICAgICAgICAgICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcgPiAxKQogICAgICAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiIyAgIGNsZWFyWzJdICVzXG4iLCBzKTsKLSAgICAgICAgICAgICAgICBQeURpY3RfU2V0SXRlbShkLCBrZXksIFB5X05vbmUpOworICAgICAgICAgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShkLCBrZXksIFB5X05vbmUpICE9IDApCisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9PYmplY3RzL29iamVjdC5jIGIvT2JqZWN0cy9vYmplY3QuYwppbmRleCA5NGExOGQzLi4xNGY0ZTlmIDEwMDY0NAotLS0gYS9PYmplY3RzL29iamVjdC5jCisrKyBiL09iamVjdHMvb2JqZWN0LmMKQEAgLTQ3NCw3ICs0NzQsNyBAQAogICAgIFB5T2JqZWN0ICpmdW5jOwogICAgIFB5T2JqZWN0ICpzdHI7CiAgICAgaW50IHVuaWNvZGVfbWV0aG9kX2ZvdW5kID0gMDsKLSAgICBzdGF0aWMgUHlPYmplY3QgKnVuaWNvZGVzdHI7CisgICAgc3RhdGljIFB5T2JqZWN0ICp1bmljb2Rlc3RyID0gTlVMTDsKIAogICAgIGlmICh2ID09IE5VTEwpIHsKICAgICAgICAgcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZygiPE5VTEw+Iik7CkBAIC00OTEsNiArNDkxLDExIEBACiAgICAgaWYgKFB5SW5zdGFuY2VfQ2hlY2sodikpIHsKICAgICAgICAgLyogV2UncmUgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzc2ljIGNsYXNzICovCiAgICAgICAgIC8qIFRyeSBfX3VuaWNvZGVfXyBmcm9tIHRoZSBpbnN0YW5jZSAtLSBhbGFzIHdlIGhhdmUgbm8gdHlwZSAqLworICAgICAgICBpZiAoIXVuaWNvZGVzdHIpIHsKKyAgICAgICAgICAgIHVuaWNvZGVzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3VuaWNvZGVfXyIpOworICAgICAgICAgICAgaWYgKCF1bmljb2Rlc3RyKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAgICAgICAgIGZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyKHYsIHVuaWNvZGVzdHIpOwogICAgICAgICBpZiAoZnVuYyAhPSBOVUxMKSB7CiAgICAgICAgICAgICB1bmljb2RlX21ldGhvZF9mb3VuZCA9IDE7CkBAIC0xMDk0LDYgKzEwOTksOCBAQAogICAgIHJldHVybiAtMTsKIH0KIAorX1B5X0hhc2hTZWNyZXRfdCBfUHlfSGFzaFNlY3JldDsKKwogbG9uZwogUHlPYmplY3RfSGFzaChQeU9iamVjdCAqdikKIHsKQEAgLTIxMDksOCArMjExNiwxMCBAQAogICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5U2V0X1R5cGUpIDwgMCkKICAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBzZXQgdHlwZSIpOwogCisjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQogICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5VW5pY29kZV9UeXBlKSA8IDApCiAgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgdW5pY29kZSB0eXBlIik7CisjZW5kaWYKIAogICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5U2xpY2VfVHlwZSkgPCAwKQogICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHNsaWNlIHR5cGUiKTsKQEAgLTIxOTQsNiArMjIwMywxOCBAQAogCiAgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlGaWxlX1R5cGUpIDwgMCkKICAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBmaWxlIHR5cGUiKTsKKworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5Q2Fwc3VsZV9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgY2Fwc3VsZSB0eXBlIik7CisKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeUNlbGxfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGNlbGwgdHlwZSIpOworCisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlDYWxsSXRlcl9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgY2FsbCBpdGVyIHR5cGUiKTsKKworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5U2VxSXRlcl9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgc2VxdWVuY2UgaXRlcmF0b3IgdHlwZSIpOwogfQogCiAKQEAgLTI0MjQsNiArMjQ0NSwxOCBAQAogICAgIF9QeVRyYXNoX2RlbGV0ZV9sYXRlciA9IG9wOwogfQogCisvKiBUaGUgZXF1aXZhbGVudCBBUEksIHVzaW5nIHBlci10aHJlYWQgc3RhdGUgcmVjdXJzaW9uIGluZm8gKi8KK3ZvaWQKK19QeVRyYXNoX3RocmVhZF9kZXBvc2l0X29iamVjdChQeU9iamVjdCAqb3ApCit7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICBhc3NlcnQoUHlPYmplY3RfSVNfR0Mob3ApKTsKKyAgICBhc3NlcnQoX1B5X0FTX0dDKG9wKS0+Z2MuZ2NfcmVmcyA9PSBfUHlHQ19SRUZTX1VOVFJBQ0tFRCk7CisgICAgYXNzZXJ0KG9wLT5vYl9yZWZjbnQgPT0gMCk7CisgICAgX1B5X0FTX0dDKG9wKS0+Z2MuZ2NfcHJldiA9IChQeUdDX0hlYWQgKikgdHN0YXRlLT50cmFzaF9kZWxldGVfbGF0ZXI7CisgICAgdHN0YXRlLT50cmFzaF9kZWxldGVfbGF0ZXIgPSBvcDsKK30KKwogLyogRGVhbGxvY2NhdGUgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBfUHlUcmFzaF9kZWxldGVfbGF0ZXIgbGlzdC4gIENhbGxlZCB3aGVuCiAgKiB0aGUgY2FsbC1zdGFjayB1bndpbmRzIGFnYWluLgogICovCkBAIC0yNDUwLDYgKzI0ODMsMzEgQEAKICAgICB9CiB9CiAKKy8qIFRoZSBlcXVpdmFsZW50IEFQSSwgdXNpbmcgcGVyLXRocmVhZCBzdGF0ZSByZWN1cnNpb24gaW5mbyAqLwordm9pZAorX1B5VHJhc2hfdGhyZWFkX2Rlc3Ryb3lfY2hhaW4odm9pZCkKK3sKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIHdoaWxlICh0c3RhdGUtPnRyYXNoX2RlbGV0ZV9sYXRlcikgeworICAgICAgICBQeU9iamVjdCAqb3AgPSB0c3RhdGUtPnRyYXNoX2RlbGV0ZV9sYXRlcjsKKyAgICAgICAgZGVzdHJ1Y3RvciBkZWFsbG9jID0gUHlfVFlQRShvcCktPnRwX2RlYWxsb2M7CisKKyAgICAgICAgdHN0YXRlLT50cmFzaF9kZWxldGVfbGF0ZXIgPQorICAgICAgICAgICAgKFB5T2JqZWN0KikgX1B5X0FTX0dDKG9wKS0+Z2MuZ2NfcHJldjsKKworICAgICAgICAvKiBDYWxsIHRoZSBkZWFsbG9jYXRvciBkaXJlY3RseS4gIFRoaXMgdXNlZCB0byB0cnkgdG8KKyAgICAgICAgICogZm9vbCBQeV9ERUNSRUYgaW50byBjYWxsaW5nIGl0IGluZGlyZWN0bHksIGJ1dAorICAgICAgICAgKiBQeV9ERUNSRUYgd2FzIGFscmVhZHkgY2FsbGVkIG9uIHRoaXMgb2JqZWN0LCBhbmQgaW4KKyAgICAgICAgICogYXNzb3J0ZWQgbm9uLXJlbGVhc2UgYnVpbGRzIGNhbGxpbmcgUHlfREVDUkVGIGFnYWluIGVuZHMKKyAgICAgICAgICogdXAgZGlzdG9ydGluZyBhbGxvY2F0aW9uIHN0YXRpc3RpY3MuCisgICAgICAgICAqLworICAgICAgICBhc3NlcnQob3AtPm9iX3JlZmNudCA9PSAwKTsKKyAgICAgICAgKyt0c3RhdGUtPnRyYXNoX2RlbGV0ZV9uZXN0aW5nOworICAgICAgICAoKmRlYWxsb2MpKG9wKTsKKyAgICAgICAgLS10c3RhdGUtPnRyYXNoX2RlbGV0ZV9uZXN0aW5nOworICAgIH0KK30KKwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL09iamVjdHMvb2JtYWxsb2MuYyBiL09iamVjdHMvb2JtYWxsb2MuYwppbmRleCA0ODM4NDdjLi4xNDM0MjA2IDEwMDY0NAotLS0gYS9PYmplY3RzL29ibWFsbG9jLmMKKysrIGIvT2JqZWN0cy9vYm1hbGxvYy5jCkBAIC0yLDYgKzIsMTMgQEAKIAogI2lmZGVmIFdJVEhfUFlNQUxMT0MKIAorI2lmZGVmIEhBVkVfTU1BUAorICNpbmNsdWRlIDxzeXMvbW1hbi5oPgorICNpZmRlZiBNQVBfQU5PTllNT1VTCisgICNkZWZpbmUgQVJFTkFTX1VTRV9NTUFQCisgI2VuZGlmCisjZW5kaWYKKwogI2lmZGVmIFdJVEhfVkFMR1JJTkQKICNpbmNsdWRlIDx2YWxncmluZC92YWxncmluZC5oPgogCkBAIC03NSw3ICs4Miw4IEBACiAgKiBBbGxvY2F0aW9uIHN0cmF0ZWd5IGFic3RyYWN0OgogICoKICAqIEZvciBzbWFsbCByZXF1ZXN0cywgdGhlIGFsbG9jYXRvciBzdWItYWxsb2NhdGVzIDxCaWc+IGJsb2NrcyBvZiBtZW1vcnkuCi0gKiBSZXF1ZXN0cyBncmVhdGVyIHRoYW4gMjU2IGJ5dGVzIGFyZSByb3V0ZWQgdG8gdGhlIHN5c3RlbSdzIGFsbG9jYXRvci4KKyAqIFJlcXVlc3RzIGdyZWF0ZXIgdGhhbiBTTUFMTF9SRVFVRVNUX1RIUkVTSE9MRCBieXRlcyBhcmUgcm91dGVkIHRvIHRoZQorICogc3lzdGVtJ3MgYWxsb2NhdG9yLiAKICAqCiAgKiBTbWFsbCByZXF1ZXN0cyBhcmUgZ3JvdXBlZCBpbiBzaXplIGNsYXNzZXMgc3BhY2VkIDggYnl0ZXMgYXBhcnQsIGR1ZQogICogdG8gdGhlIHJlcXVpcmVkIHZhbGlkIGFsaWdubWVudCBvZiB0aGUgcmV0dXJuZWQgYWRkcmVzcy4gUmVxdWVzdHMgb2YKQEAgLTEwNywxMCArMTE1LDExIEBACiAgKiAgICAgICA1Ny02NCAgICAgICAgICAgICAgICAgICA2NCAgICAgICAgICAgICAgICAgICAgICAgNwogICogICAgICAgNjUtNzIgICAgICAgICAgICAgICAgICAgNzIgICAgICAgICAgICAgICAgICAgICAgIDgKICAqICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgLi4uCi0gKiAgICAgIDI0MS0yNDggICAgICAgICAgICAgICAgIDI0OCAgICAgICAgICAgICAgICAgICAgICAzMAotICogICAgICAyNDktMjU2ICAgICAgICAgICAgICAgICAyNTYgICAgICAgICAgICAgICAgICAgICAgMzEKKyAqICAgICAgNDk3LTUwNCAgICAgICAgICAgICAgICAgNTA0ICAgICAgICAgICAgICAgICAgICAgIDYyCisgKiAgICAgIDUwNS01MTIgICAgICAgICAgICAgICAgIDUxMiAgICAgICAgICAgICAgICAgICAgICA2MyAKICAqCi0gKiAgICAgIDAsIDI1NyBhbmQgdXA6IHJvdXRlZCB0byB0aGUgdW5kZXJseWluZyBhbGxvY2F0b3IuCisgKiAgICAgIDAsIFNNQUxMX1JFUVVFU1RfVEhSRVNIT0xEICsgMSBhbmQgdXA6IHJvdXRlZCB0byB0aGUgdW5kZXJseWluZworICogICAgICBhbGxvY2F0b3IuCiAgKi8KIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCkBAIC0xNDMsMTAgKzE1MiwxMyBAQAogICogICAgICAxKSBBTElHTk1FTlQgPD0gU01BTExfUkVRVUVTVF9USFJFU0hPTEQgPD0gMjU2CiAgKiAgICAgIDIpIFNNQUxMX1JFUVVFU1RfVEhSRVNIT0xEIGlzIGV2ZW5seSBkaXZpc2libGUgYnkgQUxJR05NRU5UCiAgKgorICogTm90ZTogYSBzaXplIHRocmVzaG9sZCBvZiA1MTIgZ3VhcmFudGVlcyB0aGF0IG5ld2x5IGNyZWF0ZWQgZGljdGlvbmFyaWVzCisgKiB3aWxsIGJlIGFsbG9jYXRlZCBmcm9tIHByZWFsbG9jYXRlZCBtZW1vcnkgcG9vbHMgb24gNjQtYml0LgorICoKICAqIEFsdGhvdWdoIG5vdCByZXF1aXJlZCwgZm9yIGJldHRlciBwZXJmb3JtYW5jZSBhbmQgc3BhY2UgZWZmaWNpZW5jeSwKICAqIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgU01BTExfUkVRVUVTVF9USFJFU0hPTEQgaXMgc2V0IHRvIGEgcG93ZXIgb2YgMi4KICAqLwotI2RlZmluZSBTTUFMTF9SRVFVRVNUX1RIUkVTSE9MRCAyNTYKKyNkZWZpbmUgU01BTExfUkVRVUVTVF9USFJFU0hPTEQgNTEyIAogI2RlZmluZSBOQl9TTUFMTF9TSVpFX0NMQVNTRVMgICAoU01BTExfUkVRVUVTVF9USFJFU0hPTEQgLyBBTElHTk1FTlQpCiAKIC8qCkBAIC0xNzQsMTUgKzE4NiwxNSBAQAogLyoKICAqIFRoZSBhbGxvY2F0b3Igc3ViLWFsbG9jYXRlcyA8QmlnPiBibG9ja3Mgb2YgbWVtb3J5IChjYWxsZWQgYXJlbmFzKSBhbGlnbmVkCiAgKiBvbiBhIHBhZ2UgYm91bmRhcnkuIFRoaXMgaXMgYSByZXNlcnZlZCB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgZm9yIHRoZQotICogY3VycmVudCBwcm9jZXNzIChvYnRhaW5lZCB0aHJvdWdoIGEgbWFsbG9jIGNhbGwpLiBJbiBubyB3YXkgdGhpcyBtZWFucwotICogdGhhdCB0aGUgbWVtb3J5IGFyZW5hcyB3aWxsIGJlIHVzZWQgZW50aXJlbHkuIEEgbWFsbG9jKDxCaWc+KSBpcyB1c3VhbGx5Ci0gKiBhbiBhZGRyZXNzIHJhbmdlIHJlc2VydmF0aW9uIGZvciA8QmlnPiBieXRlcywgdW5sZXNzIGFsbCBwYWdlcyB3aXRoaW4gdGhpcwotICogc3BhY2UgYXJlIHJlZmVyZW5jZWQgc3Vic2VxdWVudGx5LiBTbyBtYWxsb2MnaW5nIGJpZyBibG9ja3MgYW5kIG5vdCB1c2luZwotICogdGhlbSBkb2VzIG5vdCBtZWFuICJ3YXN0aW5nIG1lbW9yeSIuIEl0J3MgYW4gYWRkcmVzc2FibGUgcmFuZ2Ugd2FzdGFnZS4uLgorICogY3VycmVudCBwcm9jZXNzIChvYnRhaW5lZCB0aHJvdWdoIGEgbWFsbG9jKCkvbW1hcCgpIGNhbGwpLiBJbiBubyB3YXkgdGhpcworICogbWVhbnMgdGhhdCB0aGUgbWVtb3J5IGFyZW5hcyB3aWxsIGJlIHVzZWQgZW50aXJlbHkuIEEgbWFsbG9jKDxCaWc+KSBpcworICogdXN1YWxseSBhbiBhZGRyZXNzIHJhbmdlIHJlc2VydmF0aW9uIGZvciA8QmlnPiBieXRlcywgdW5sZXNzIGFsbCBwYWdlcyB3aXRoaW4KKyAqIHRoaXMgc3BhY2UgYXJlIHJlZmVyZW5jZWQgc3Vic2VxdWVudGx5LiBTbyBtYWxsb2MnaW5nIGJpZyBibG9ja3MgYW5kIG5vdAorICogdXNpbmcgdGhlbSBkb2VzIG5vdCBtZWFuICJ3YXN0aW5nIG1lbW9yeSIuIEl0J3MgYW4gYWRkcmVzc2FibGUgcmFuZ2UKKyAqIHdhc3RhZ2UuLi4gCiAgKgotICogVGhlcmVmb3JlLCBhbGxvY2F0aW5nIGFyZW5hcyB3aXRoIG1hbGxvYyBpcyBub3Qgb3B0aW1hbCwgYmVjYXVzZSB0aGVyZSBpcwotICogc29tZSBhZGRyZXNzIHNwYWNlIHdhc3RhZ2UsIGJ1dCB0aGlzIGlzIHRoZSBtb3N0IHBvcnRhYmxlIHdheSB0byByZXF1ZXN0Ci0gKiBtZW1vcnkgZnJvbSB0aGUgc3lzdGVtIGFjcm9zcyB2YXJpb3VzIHBsYXRmb3Jtcy4KKyAqIEFyZW5hcyBhcmUgYWxsb2NhdGVkIHdpdGggbW1hcCgpIG9uIHN5c3RlbXMgc3VwcG9ydGluZyBhbm9ueW1vdXMgbWVtb3J5CisgKiBtYXBwaW5ncyB0byByZWR1Y2UgaGVhcCBmcmFnbWVudGF0aW9uLgogICovCiAjZGVmaW5lIEFSRU5BX1NJWkUgICAgICAgICAgICAgICgyNTYgPDwgMTApICAgICAvKiAyNTZLQiAqLwogCkBAIC00NDAsNiArNDUyLDkgQEAKICAgICAsIFBUKDQ4KSwgUFQoNDkpLCBQVCg1MCksIFBUKDUxKSwgUFQoNTIpLCBQVCg1MyksIFBUKDU0KSwgUFQoNTUpCiAjaWYgTkJfU01BTExfU0laRV9DTEFTU0VTID4gNTYKICAgICAsIFBUKDU2KSwgUFQoNTcpLCBQVCg1OCksIFBUKDU5KSwgUFQoNjApLCBQVCg2MSksIFBUKDYyKSwgUFQoNjMpCisjaWYgTkJfU01BTExfU0laRV9DTEFTU0VTID4gNjQKKyNlcnJvciAiTkJfU01BTExfU0laRV9DTEFTU0VTIHNob3VsZCBiZSBsZXNzIHRoYW4gNjQiCisjZW5kaWYgLyogTkJfU01BTExfU0laRV9DTEFTU0VTID4gNjQgKi8KICNlbmRpZiAvKiBOQl9TTUFMTF9TSVpFX0NMQVNTRVMgPiA1NiAqLwogI2VuZGlmIC8qIE5CX1NNQUxMX1NJWkVfQ0xBU1NFUyA+IDQ4ICovCiAjZW5kaWYgLyogTkJfU01BTExfU0laRV9DTEFTU0VTID4gNDAgKi8KQEAgLTUyNSw2ICs1NDAsOCBAQAogewogICAgIHN0cnVjdCBhcmVuYV9vYmplY3QqIGFyZW5hb2JqOwogICAgIHVpbnQgZXhjZXNzOyAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIGFib3ZlIHBvb2wgYWxpZ25tZW50ICovCisgICAgdm9pZCAqYWRkcmVzczsKKyAgICBpbnQgZXJyOwogCiAjaWZkZWYgUFlNQUxMT0NfREVCVUcKICAgICBpZiAoUHlfR0VURU5WKCJQWVRIT05NQUxMT0NTVEFUUyIpKQpAQCAtNTc3LDggKzU5NCwxNSBAQAogICAgIGFyZW5hb2JqID0gdW51c2VkX2FyZW5hX29iamVjdHM7CiAgICAgdW51c2VkX2FyZW5hX29iamVjdHMgPSBhcmVuYW9iai0+bmV4dGFyZW5hOwogICAgIGFzc2VydChhcmVuYW9iai0+YWRkcmVzcyA9PSAwKTsKLSAgICBhcmVuYW9iai0+YWRkcmVzcyA9ICh1cHRyKW1hbGxvYyhBUkVOQV9TSVpFKTsKLSAgICBpZiAoYXJlbmFvYmotPmFkZHJlc3MgPT0gMCkgeworI2lmZGVmIEFSRU5BU19VU0VfTU1BUAorICAgIGFkZHJlc3MgPSBtbWFwKE5VTEwsIEFSRU5BX1NJWkUsIFBST1RfUkVBRHxQUk9UX1dSSVRFLAorICAgICAgICAgICAgICAgICAgIE1BUF9QUklWQVRFfE1BUF9BTk9OWU1PVVMsIC0xLCAwKTsKKyAgICBlcnIgPSAoYWRkcmVzcyA9PSBNQVBfRkFJTEVEKTsKKyNlbHNlCisgICAgYWRkcmVzcyA9IG1hbGxvYyhBUkVOQV9TSVpFKTsKKyAgICBlcnIgPSAoYWRkcmVzcyA9PSAwKTsKKyNlbmRpZiAgICAKKyAgICBpZiAoZXJyKSB7CiAgICAgICAgIC8qIFRoZSBhbGxvY2F0aW9uIGZhaWxlZDogcmV0dXJuIE5VTEwgYWZ0ZXIgcHV0dGluZyB0aGUKICAgICAgICAgICogYXJlbmFvYmogYmFjay4KICAgICAgICAgICovCkBAIC01ODYsNiArNjEwLDcgQEAKICAgICAgICAgdW51c2VkX2FyZW5hX29iamVjdHMgPSBhcmVuYW9iajsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQorICAgIGFyZW5hb2JqLT5hZGRyZXNzID0gKHVwdHIpYWRkcmVzczsKIAogICAgICsrbmFyZW5hc19jdXJyZW50bHlfYWxsb2NhdGVkOwogI2lmZGVmIFBZTUFMTE9DX0RFQlVHCkBAIC0xMDU0LDcgKzEwNzksMTEgQEAKICAgICAgICAgICAgICAgICB1bnVzZWRfYXJlbmFfb2JqZWN0cyA9IGFvOwogCiAgICAgICAgICAgICAgICAgLyogRnJlZSB0aGUgZW50aXJlIGFyZW5hLiAqLworI2lmZGVmIEFSRU5BU19VU0VfTU1BUAorICAgICAgICAgICAgICAgIG11bm1hcCgodm9pZCAqKWFvLT5hZGRyZXNzLCBBUkVOQV9TSVpFKTsKKyNlbHNlCiAgICAgICAgICAgICAgICAgZnJlZSgodm9pZCAqKWFvLT5hZGRyZXNzKTsKKyNlbmRpZgogICAgICAgICAgICAgICAgIGFvLT5hZGRyZXNzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXJrIHVuYXNzb2NpYXRlZCAqLwogICAgICAgICAgICAgICAgIC0tbmFyZW5hc19jdXJyZW50bHlfYWxsb2NhdGVkOwogCkBAIC0xNzEzLDcgKzE3NDIsNyBAQAogICAgIGsgPSAzOwogICAgIGRvIHsKICAgICAgICAgc2l6ZV90IG5leHR2YWx1ZSA9IHZhbHVlIC8gMTA7Ci0gICAgICAgIHVpbnQgZGlnaXQgPSAodWludCkodmFsdWUgLSBuZXh0dmFsdWUgKiAxMCk7CisgICAgICAgIHVuc2lnbmVkIGludCBkaWdpdCA9ICh1bnNpZ25lZCBpbnQpKHZhbHVlIC0gbmV4dHZhbHVlICogMTApOwogICAgICAgICB2YWx1ZSA9IG5leHR2YWx1ZTsKICAgICAgICAgYnVmW2ktLV0gPSAoY2hhcikoZGlnaXQgKyAnMCcpOwogICAgICAgICAtLWs7CmRpZmYgLS1naXQgYS9PYmplY3RzL3Jhbmdlb2JqZWN0LmMgYi9PYmplY3RzL3Jhbmdlb2JqZWN0LmMKaW5kZXggNGU2NGRiYS4uNTIwM2Y0MCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9yYW5nZW9iamVjdC5jCisrKyBiL09iamVjdHMvcmFuZ2VvYmplY3QuYwpAQCAtMzcsNiArMzcsMzAgQEAKICAgICByZXR1cm4gMFVMOwogfQogCisvKiBSZXR1cm4gYSBzdG9wIHZhbHVlIHN1aXRhYmxlIGZvciByZWNvbnN0cnVjdGluZyB0aGUgeHJhbmdlIGZyb20KKyAqIGEgKHN0YXJ0LCBzdG9wLCBzdGVwKSB0cmlwbGUuICBVc2VkIGluIHJhbmdlX3JlcHIgYW5kIHJhbmdlX3JlZHVjZS4KKyAqIENvbXB1dGVzIHN0YXJ0ICsgbGVuICogc3RlcCwgY2xpcHBlZCB0byB0aGUgcmFuZ2UgW0xPTkdfTUlOLCBMT05HX01BWF0uCisgKi8KK3N0YXRpYyBsb25nCitnZXRfc3RvcF9mb3JfcmFuZ2UocmFuZ2VvYmplY3QgKnIpCit7CisgICAgbG9uZyBsYXN0OworCisgICAgaWYgKHItPmxlbiA9PSAwKQorICAgICAgICByZXR1cm4gci0+c3RhcnQ7CisKKyAgICAvKiBUaGUgdHJpY2t5IGJpdCBpcyBhdm9pZGluZyBvdmVyZmxvdy4gIFdlIGZpcnN0IGNvbXB1dGUgdGhlIGxhc3QgZW50cnkgaW4KKyAgICAgICB0aGUgeHJhbmdlLCBzdGFydCArIChsZW4gLSAxKSAqIHN0ZXAsIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gbGllIHdpdGhpbgorICAgICAgIHRoZSByYW5nZSBvZiBhIGxvbmcsIGFuZCB0aGVuIGFkZCBzdGVwIHRvIGl0LiAgU2VlIHRoZSByYW5nZV9yZXZlcnNlCisgICAgICAgY29tbWVudHMgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBjYXN0cyBiZWxvdy4KKyAgICAqLworICAgIGxhc3QgPSAobG9uZykoci0+c3RhcnQgKyAodW5zaWduZWQgbG9uZykoci0+bGVuIC0gMSkgKiByLT5zdGVwKTsKKyAgICBpZiAoci0+c3RlcCA+IDApCisgICAgICAgIHJldHVybiBsYXN0ID4gTE9OR19NQVggLSByLT5zdGVwID8gTE9OR19NQVggOiBsYXN0ICsgci0+c3RlcDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBsYXN0IDwgTE9OR19NSU4gLSByLT5zdGVwID8gTE9OR19NSU4gOiBsYXN0ICsgci0+c3RlcDsKK30KKwogc3RhdGljIFB5T2JqZWN0ICoKIHJhbmdlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7CkBAIC04MCw3ICsxMDQsOCBAQAogfQogCiBQeURvY19TVFJWQVIocmFuZ2VfZG9jLAotInhyYW5nZShbc3RhcnQsXSBzdG9wWywgc3RlcF0pIC0+IHhyYW5nZSBvYmplY3RcblwKKyJ4cmFuZ2Uoc3RvcCkgLT4geHJhbmdlIG9iamVjdFxuXAoreHJhbmdlKHN0YXJ0LCBzdG9wWywgc3RlcF0pIC0+IHhyYW5nZSBvYmplY3RcblwKIFxuXAogTGlrZSByYW5nZSgpLCBidXQgaW5zdGVhZCBvZiByZXR1cm5pbmcgYSBsaXN0LCByZXR1cm5zIGFuIG9iamVjdCB0aGF0XG5cCiBnZW5lcmF0ZXMgdGhlIG51bWJlcnMgaW4gdGhlIHJhbmdlIG9uIGRlbWFuZC4gIEZvciBsb29waW5nLCB0aGlzIGlzIFxuXApAQCAtMTEyLDE3ICsxMzcsMTcgQEAKIAogICAgIGlmIChyLT5zdGFydCA9PSAwICYmIHItPnN0ZXAgPT0gMSkKICAgICAgICAgcnRuID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgieHJhbmdlKCVsZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnN0YXJ0ICsgci0+bGVuICogci0+c3RlcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3N0b3BfZm9yX3JhbmdlKHIpKTsKIAogICAgIGVsc2UgaWYgKHItPnN0ZXAgPT0gMSkKICAgICAgICAgcnRuID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgieHJhbmdlKCVsZCwgJWxkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+c3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+c3RhcnQgKyByLT5sZW4gKiByLT5zdGVwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfc3RvcF9mb3JfcmFuZ2UocikpOwogCiAgICAgZWxzZQogICAgICAgICBydG4gPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCJ4cmFuZ2UoJWxkLCAlbGQsICVsZCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnN0YXJ0ICsgci0+bGVuICogci0+c3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfc3RvcF9mb3JfcmFuZ2UociksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+c3RlcCk7CiAgICAgcmV0dXJuIHJ0bjsKIH0KQEAgLTEzMSw5ICsxNTYsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHJhbmdlX3JlZHVjZShyYW5nZW9iamVjdCAqciwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihPKGlpaSkpIiwgUHlfVFlQRShyKSwKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKE8obGxsKSkiLCBQeV9UWVBFKHIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHItPnN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHItPnN0YXJ0ICsgci0+bGVuICogci0+c3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfc3RvcF9mb3JfcmFuZ2UociksCiAgICAgICAgICAgICAgICAgICAgICAgICAgci0+c3RlcCk7CiB9CiAKZGlmZiAtLWdpdCBhL09iamVjdHMvc2V0b2JqZWN0LmMgYi9PYmplY3RzL3NldG9iamVjdC5jCmluZGV4IGFmMWNlMTYuLmI0YjExNzggMTAwNjQ0Ci0tLSBhL09iamVjdHMvc2V0b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9zZXRvYmplY3QuYwpAQCAtMjEyLDcgKzIxMiw2IEBACiBzZXRfaW5zZXJ0X2tleShyZWdpc3RlciBQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXksIGxvbmcgaGFzaCkKIHsKICAgICByZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7Ci0gICAgdHlwZWRlZiBzZXRlbnRyeSAqKCpsb29rdXBmdW5jKShQeVNldE9iamVjdCAqLCBQeU9iamVjdCAqLCBsb25nKTsKIAogICAgIGFzc2VydChzby0+bG9va3VwICE9IE5VTEwpOwogICAgIGVudHJ5ID0gc28tPmxvb2t1cChzbywga2V5LCBoYXNoKTsKQEAgLTE3OTcsMTIgKzE3OTYsOCBAQAogICAgIFB5T2JqZWN0ICpyMSwgKnIyOwogCiAgICAgaWYoIVB5QW55U2V0X0NoZWNrKHcpKSB7Ci0gICAgICAgIGlmIChvcCA9PSBQeV9FUSkKLSAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKLSAgICAgICAgaWYgKG9wID09IFB5X05FKQotICAgICAgICAgICAgUHlfUkVUVVJOX1RSVUU7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjYW4gb25seSBjb21wYXJlIHRvIGEgc2V0Iik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CiAgICAgfQogICAgIHN3aXRjaCAob3ApIHsKICAgICBjYXNlIFB5X0VROgpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zbGljZW9iamVjdC5jIGIvT2JqZWN0cy9zbGljZW9iamVjdC5jCmluZGV4IGQxZmUwNTIuLjc2N2E1MGEgMTAwNjQ0Ci0tLSBhL09iamVjdHMvc2xpY2VvYmplY3QuYworKysgYi9PYmplY3RzL3NsaWNlb2JqZWN0LmMKQEAgLTIxMSw3ICsyMTEsOCBAQAogfQogCiBQeURvY19TVFJWQVIoc2xpY2VfZG9jLAotInNsaWNlKFtzdGFydCxdIHN0b3BbLCBzdGVwXSlcblwKKyJzbGljZShzdG9wKVxuXAorc2xpY2Uoc3RhcnQsIHN0b3BbLCBzdGVwXSlcblwKIFxuXAogQ3JlYXRlIGEgc2xpY2Ugb2JqZWN0LiAgVGhpcyBpcyB1c2VkIGZvciBleHRlbmRlZCBzbGljaW5nIChlLmcuIGFbMDoxMDoyXSkuIik7CiAKZGlmZiAtLWdpdCBhL09iamVjdHMvc3RyaW5nbGliL2Zvcm1hdHRlci5oIGIvT2JqZWN0cy9zdHJpbmdsaWIvZm9ybWF0dGVyLmgKaW5kZXggYzQ5YTEwNC4uMTIyYWJlNiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zdHJpbmdsaWIvZm9ybWF0dGVyLmgKKysrIGIvT2JqZWN0cy9zdHJpbmdsaWIvZm9ybWF0dGVyLmgKQEAgLTczLDcgKzczLDcgQEAKIGdldF9pbnRlZ2VyKFNUUklOR0xJQl9DSEFSICoqcHRyLCBTVFJJTkdMSUJfQ0hBUiAqZW5kLAogICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqcmVzdWx0KQogewotICAgIFB5X3NzaXplX3QgYWNjdW11bGF0b3IsIGRpZ2l0dmFsLCBvbGRhY2N1bXVsYXRvcjsKKyAgICBQeV9zc2l6ZV90IGFjY3VtdWxhdG9yLCBkaWdpdHZhbDsKICAgICBpbnQgbnVtZGlnaXRzOwogICAgIGFjY3VtdWxhdG9yID0gbnVtZGlnaXRzID0gMDsKICAgICBmb3IgKDs7KCpwdHIpKyssIG51bWRpZ2l0cysrKSB7CkBAIC04MywxOSArODMsMTcgQEAKICAgICAgICAgaWYgKGRpZ2l0dmFsIDwgMCkKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAvKgotICAgICAgICAgICBUaGlzIHRyaWNrIHdhcyBjb3BpZWQgZnJvbSBvbGQgVW5pY29kZSBmb3JtYXQgY29kZS4gIEl0J3MgY3V0ZSwKLSAgICAgICAgICAgYnV0IHdvdWxkIHJlYWxseSBzdWNrIG9uIGFuIG9sZCBtYWNoaW5lIHdpdGggYSBzbG93IGRpdmlkZQotICAgICAgICAgICBpbXBsZW1lbnRhdGlvbi4gIEZvcnR1bmF0ZWx5LCBpbiB0aGUgbm9ybWFsIGNhc2Ugd2UgZG8gbm90Ci0gICAgICAgICAgIGV4cGVjdCB0b28gbWFueSBkaWdpdHMuCisgICAgICAgICAgIERldGVjdCBwb3NzaWJsZSBvdmVyZmxvdyBiZWZvcmUgaXQgaGFwcGVuczoKKworICAgICAgICAgICAgICBhY2N1bXVsYXRvciAqIDEwICsgZGlnaXR2YWwgPiBQWV9TU0laRV9UX01BWCBpZiBhbmQgb25seSBpZgorICAgICAgICAgICAgICBhY2N1bXVsYXRvciA+IChQWV9TU0laRV9UX01BWCAtIGRpZ2l0dmFsKSAvIDEwLgogICAgICAgICAqLwotICAgICAgICBvbGRhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yOwotICAgICAgICBhY2N1bXVsYXRvciAqPSAxMDsKLSAgICAgICAgaWYgKChhY2N1bXVsYXRvcisxMCkvMTAgIT0gb2xkYWNjdW11bGF0b3IrMSkgeworICAgICAgICBpZiAoYWNjdW11bGF0b3IgPiAoUFlfU1NJWkVfVF9NQVggLSBkaWdpdHZhbCkgLyAxMCkgewogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlRvbyBtYW55IGRlY2ltYWwgZGlnaXRzIGluIGZvcm1hdCBzdHJpbmciKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotICAgICAgICBhY2N1bXVsYXRvciArPSBkaWdpdHZhbDsKKyAgICAgICAgYWNjdW11bGF0b3IgPSBhY2N1bXVsYXRvciAqIDEwICsgZGlnaXR2YWw7CiAgICAgfQogICAgICpyZXN1bHQgPSBhY2N1bXVsYXRvcjsKICAgICByZXR1cm4gbnVtZGlnaXRzOwpAQCAtMTgyLDggKzE4MCw5IEBACiAKICAgICBQeV9zc2l6ZV90IGNvbnN1bWVkOwogICAgIGludCBhbGlnbl9zcGVjaWZpZWQgPSAwOworICAgIGludCBmaWxsX2NoYXJfc3BlY2lmaWVkID0gMDsKIAotICAgIGZvcm1hdC0+ZmlsbF9jaGFyID0gJ1wwJzsKKyAgICBmb3JtYXQtPmZpbGxfY2hhciA9ICcgJzsKICAgICBmb3JtYXQtPmFsaWduID0gZGVmYXVsdF9hbGlnbjsKICAgICBmb3JtYXQtPmFsdGVybmF0ZSA9IDA7CiAgICAgZm9ybWF0LT5zaWduID0gJ1wwJzsKQEAgLTE5Nyw2ICsxOTYsNyBAQAogICAgIGlmIChlbmQtcHRyID49IDIgJiYgaXNfYWxpZ25tZW50X3Rva2VuKHB0clsxXSkpIHsKICAgICAgICAgZm9ybWF0LT5hbGlnbiA9IHB0clsxXTsKICAgICAgICAgZm9ybWF0LT5maWxsX2NoYXIgPSBwdHJbMF07CisgICAgICAgIGZpbGxfY2hhcl9zcGVjaWZpZWQgPSAxOwogICAgICAgICBhbGlnbl9zcGVjaWZpZWQgPSAxOwogICAgICAgICBwdHIgKz0gMjsKICAgICB9CkBAIC0yMjAsNyArMjIwLDcgQEAKICAgICB9CiAKICAgICAvKiBUaGUgc3BlY2lhbCBjYXNlIGZvciAwLXBhZGRpbmcgKGJhY2t3YXJkcyBjb21wYXQpICovCi0gICAgaWYgKGZvcm1hdC0+ZmlsbF9jaGFyID09ICdcMCcgJiYgZW5kLXB0ciA+PSAxICYmIHB0clswXSA9PSAnMCcpIHsKKyAgICBpZiAoIWZpbGxfY2hhcl9zcGVjaWZpZWQgJiYgZW5kLXB0ciA+PSAxICYmIHB0clswXSA9PSAnMCcpIHsKICAgICAgICAgZm9ybWF0LT5maWxsX2NoYXIgPSAnMCc7CiAgICAgICAgIGlmICghYWxpZ25fc3BlY2lmaWVkKSB7CiAgICAgICAgICAgICBmb3JtYXQtPmFsaWduID0gJz0nOwpAQCAtNzE3LDggKzcxNyw3IEBACiAKICAgICAvKiBXcml0ZSBpbnRvIHRoYXQgc3BhY2UuIEZpcnN0IHRoZSBwYWRkaW5nLiAqLwogICAgIHAgPSBmaWxsX3BhZGRpbmcoU1RSSU5HTElCX1NUUihyZXN1bHQpLCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICBmb3JtYXQtPmZpbGxfY2hhcj09J1wwJz8nICc6Zm9ybWF0LT5maWxsX2NoYXIsCi0gICAgICAgICAgICAgICAgICAgICBscGFkLCBycGFkKTsKKyAgICAgICAgICAgICAgICAgICAgIGZvcm1hdC0+ZmlsbF9jaGFyLCBscGFkLCBycGFkKTsKIAogICAgIC8qIFRoZW4gdGhlIHNvdXJjZSBzdHJpbmcuICovCiAgICAgbWVtY3B5KHAsIFNUUklOR0xJQl9TVFIodmFsdWUpLCBsZW4gKiBzaXplb2YoU1RSSU5HTElCX0NIQVIpKTsKQEAgLTg5NSw4ICs4OTQsNyBAQAogCiAgICAgLyogUG9wdWxhdGUgdGhlIG1lbW9yeS4gKi8KICAgICBmaWxsX251bWJlcihTVFJJTkdMSUJfU1RSKHJlc3VsdCksICZzcGVjLCBwbnVtZXJpY19jaGFycywgbl9kaWdpdHMsCi0gICAgICAgICAgICAgICAgcHJlZml4LCBmb3JtYXQtPmZpbGxfY2hhciA9PSAnXDAnID8gJyAnIDogZm9ybWF0LT5maWxsX2NoYXIsCi0gICAgICAgICAgICAgICAgJmxvY2FsZSwgZm9ybWF0LT50eXBlID09ICdYJyk7CisgICAgICAgICAgICAgICAgcHJlZml4LCBmb3JtYXQtPmZpbGxfY2hhciwgJmxvY2FsZSwgZm9ybWF0LT50eXBlID09ICdYJyk7CiAKIGRvbmU6CiAgICAgUHlfWERFQ1JFRih0bXApOwpAQCAtOTMwLDcgKzkyOCw3IEBACiAgICAgUHlfc3NpemVfdCBuX3RvdGFsOwogICAgIGludCBoYXNfZGVjaW1hbDsKICAgICBkb3VibGUgdmFsOwotICAgIFB5X3NzaXplX3QgcHJlY2lzaW9uID0gZm9ybWF0LT5wcmVjaXNpb247CisgICAgUHlfc3NpemVfdCBwcmVjaXNpb247CiAgICAgUHlfc3NpemVfdCBkZWZhdWx0X3ByZWNpc2lvbiA9IDY7CiAgICAgU1RSSU5HTElCX0NIQVIgdHlwZSA9IGZvcm1hdC0+dHlwZTsKICAgICBpbnQgYWRkX3BjdCA9IDA7CkBAIC05NDksNiArOTQ3LDEyIEBACiAgICAgICAgZnJvbSBhIGhhcmQtY29kZSBwc2V1ZG8tbG9jYWxlICovCiAgICAgTG9jYWxlSW5mbyBsb2NhbGU7CiAKKyAgICBpZiAoZm9ybWF0LT5wcmVjaXNpb24gPiBJTlRfTUFYKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAicHJlY2lzaW9uIHRvbyBiaWciKTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKyAgICBwcmVjaXNpb24gPSAoaW50KWZvcm1hdC0+cHJlY2lzaW9uOworCiAgICAgLyogQWx0ZXJuYXRlIGlzIG5vdCBhbGxvd2VkIG9uIGZsb2F0cy4gKi8KICAgICBpZiAoZm9ybWF0LT5hbHRlcm5hdGUpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCkBAIC0xMDQ0LDggKzEwNDgsNyBAQAogCiAgICAgLyogUG9wdWxhdGUgdGhlIG1lbW9yeS4gKi8KICAgICBmaWxsX251bWJlcihTVFJJTkdMSUJfU1RSKHJlc3VsdCksICZzcGVjLCBwLCBuX2RpZ2l0cywgTlVMTCwKLSAgICAgICAgICAgICAgICBmb3JtYXQtPmZpbGxfY2hhciA9PSAnXDAnID8gJyAnIDogZm9ybWF0LT5maWxsX2NoYXIsICZsb2NhbGUsCi0gICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICAgICAgZm9ybWF0LT5maWxsX2NoYXIsICZsb2NhbGUsIDApOwogCiBkb25lOgogICAgIFB5TWVtX0ZyZWUoYnVmKTsKQEAgLTEwODAsNyArMTA4Myw3IEBACiAgICAgUHlfc3NpemVfdCBuX2ltX3RvdGFsOwogICAgIGludCByZV9oYXNfZGVjaW1hbDsKICAgICBpbnQgaW1faGFzX2RlY2ltYWw7Ci0gICAgUHlfc3NpemVfdCBwcmVjaXNpb24gPSBmb3JtYXQtPnByZWNpc2lvbjsKKyAgICBQeV9zc2l6ZV90IHByZWNpc2lvbjsKICAgICBQeV9zc2l6ZV90IGRlZmF1bHRfcHJlY2lzaW9uID0gNjsKICAgICBTVFJJTkdMSUJfQ0hBUiB0eXBlID0gZm9ybWF0LT50eXBlOwogICAgIFNUUklOR0xJQl9DSEFSICpwX3JlOwpAQCAtMTEwOSw2ICsxMTEyLDEyIEBACiAgICAgICAgZnJvbSBhIGhhcmQtY29kZSBwc2V1ZG8tbG9jYWxlICovCiAgICAgTG9jYWxlSW5mbyBsb2NhbGU7CiAKKyAgICBpZiAoZm9ybWF0LT5wcmVjaXNpb24gPiBJTlRfTUFYKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAicHJlY2lzaW9uIHRvbyBiaWciKTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKyAgICBwcmVjaXNpb24gPSAoaW50KWZvcm1hdC0+cHJlY2lzaW9uOworCiAgICAgLyogQWx0ZXJuYXRlIGlzIG5vdCBhbGxvd2VkIG9uIGNvbXBsZXguICovCiAgICAgaWYgKGZvcm1hdC0+YWx0ZXJuYXRlKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLApAQCAtMTI1NSw4ICsxMjY0LDcgQEAKICAgICAvKiBQb3B1bGF0ZSB0aGUgbWVtb3J5LiBGaXJzdCwgdGhlIHBhZGRpbmcuICovCiAgICAgcCA9IGZpbGxfcGFkZGluZyhTVFJJTkdMSUJfU1RSKHJlc3VsdCksCiAgICAgICAgICAgICAgICAgICAgICBuX3JlX3RvdGFsICsgbl9pbV90b3RhbCArIDEgKyBhZGRfcGFyZW5zICogMiwKLSAgICAgICAgICAgICAgICAgICAgIGZvcm1hdC0+ZmlsbF9jaGFyPT0nXDAnID8gJyAnIDogZm9ybWF0LT5maWxsX2NoYXIsCi0gICAgICAgICAgICAgICAgICAgICBscGFkLCBycGFkKTsKKyAgICAgICAgICAgICAgICAgICAgIGZvcm1hdC0+ZmlsbF9jaGFyLCBscGFkLCBycGFkKTsKIAogICAgIGlmIChhZGRfcGFyZW5zKQogICAgICAgICAqcCsrID0gJygnOwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zdHJpbmdsaWIvc3RyaW5nX2Zvcm1hdC5oIGIvT2JqZWN0cy9zdHJpbmdsaWIvc3RyaW5nX2Zvcm1hdC5oCmluZGV4IDA3NWZhMWQuLjk2NWUxYWQgMTAwNjQ0Ci0tLSBhL09iamVjdHMvc3RyaW5nbGliL3N0cmluZ19mb3JtYXQuaAorKysgYi9PYmplY3RzL3N0cmluZ2xpYi9zdHJpbmdfZm9ybWF0LmgKQEAgLTE5Nyw3ICsxOTcsNiBAQAogewogICAgIFB5X3NzaXplX3QgYWNjdW11bGF0b3IgPSAwOwogICAgIFB5X3NzaXplX3QgZGlnaXR2YWw7Ci0gICAgUHlfc3NpemVfdCBvbGRhY2N1bXVsYXRvcjsKICAgICBTVFJJTkdMSUJfQ0hBUiAqcDsKIAogICAgIC8qIGVtcHR5IHN0cmluZyBpcyBhbiBlcnJvciAqLwpAQCAtMjA5LDE5ICsyMDgsMTcgQEAKICAgICAgICAgaWYgKGRpZ2l0dmFsIDwgMCkKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgLyoKLSAgICAgICAgICAgVGhpcyB0cmljayB3YXMgY29waWVkIGZyb20gb2xkIFVuaWNvZGUgZm9ybWF0IGNvZGUuICBJdCdzIGN1dGUsCi0gICAgICAgICAgIGJ1dCB3b3VsZCByZWFsbHkgc3VjayBvbiBhbiBvbGQgbWFjaGluZSB3aXRoIGEgc2xvdyBkaXZpZGUKLSAgICAgICAgICAgaW1wbGVtZW50YXRpb24uICBGb3J0dW5hdGVseSwgaW4gdGhlIG5vcm1hbCBjYXNlIHdlIGRvIG5vdAotICAgICAgICAgICBleHBlY3QgdG9vIG1hbnkgZGlnaXRzLgorICAgICAgICAgICBEZXRlY3QgcG9zc2libGUgb3ZlcmZsb3cgYmVmb3JlIGl0IGhhcHBlbnM6CisKKyAgICAgICAgICAgICAgYWNjdW11bGF0b3IgKiAxMCArIGRpZ2l0dmFsID4gUFlfU1NJWkVfVF9NQVggaWYgYW5kIG9ubHkgaWYKKyAgICAgICAgICAgICAgYWNjdW11bGF0b3IgPiAoUFlfU1NJWkVfVF9NQVggLSBkaWdpdHZhbCkgLyAxMC4KICAgICAgICAgKi8KLSAgICAgICAgb2xkYWNjdW11bGF0b3IgPSBhY2N1bXVsYXRvcjsKLSAgICAgICAgYWNjdW11bGF0b3IgKj0gMTA7Ci0gICAgICAgIGlmICgoYWNjdW11bGF0b3IrMTApLzEwICE9IG9sZGFjY3VtdWxhdG9yKzEpIHsKKyAgICAgICAgaWYgKGFjY3VtdWxhdG9yID4gKFBZX1NTSVpFX1RfTUFYIC0gZGlnaXR2YWwpIC8gMTApIHsKICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICJUb28gbWFueSBkZWNpbWFsIGRpZ2l0cyBpbiBmb3JtYXQgc3RyaW5nIik7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KLSAgICAgICAgYWNjdW11bGF0b3IgKz0gZGlnaXR2YWw7CisgICAgICAgIGFjY3VtdWxhdG9yID0gYWNjdW11bGF0b3IgKiAxMCArIGRpZ2l0dmFsOwogICAgIH0KICAgICByZXR1cm4gYWNjdW11bGF0b3I7CiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL3N0cmluZ2xpYi90cmFuc21vZ3JpZnkuaCBiL09iamVjdHMvc3RyaW5nbGliL3RyYW5zbW9ncmlmeS5oCmluZGV4IDFlMTMyZTUuLmJlNTk1YTYgMTAwNjQ0Ci0tLSBhL09iamVjdHMvc3RyaW5nbGliL3RyYW5zbW9ncmlmeS5oCisrKyBiL09iamVjdHMvc3RyaW5nbGliL3RyYW5zbW9ncmlmeS5oCkBAIC0xNSw3ICsxNSw3IEBACiB7CiAgICAgY29uc3QgY2hhciAqZSwgKnA7CiAgICAgY2hhciAqcTsKLSAgICBzaXplX3QgaSwgajsKKyAgICBQeV9zc2l6ZV90IGksIGo7CiAgICAgUHlPYmplY3QgKnU7CiAgICAgaW50IHRhYnNpemUgPSA4OwogICAgIApAQCAtMjUsMzUgKzI1LDMxIEBACiAgICAgLyogRmlyc3QgcGFzczogZGV0ZXJtaW5lIHNpemUgb2Ygb3V0cHV0IHN0cmluZyAqLwogICAgIGkgPSBqID0gMDsKICAgICBlID0gU1RSSU5HTElCX1NUUihzZWxmKSArIFNUUklOR0xJQl9MRU4oc2VsZik7Ci0gICAgZm9yIChwID0gU1RSSU5HTElCX1NUUihzZWxmKTsgcCA8IGU7IHArKykKKyAgICBmb3IgKHAgPSBTVFJJTkdMSUJfU1RSKHNlbGYpOyBwIDwgZTsgcCsrKSB7CiAgICAgICAgIGlmICgqcCA9PSAnXHQnKSB7CiAgICAgICAgICAgICBpZiAodGFic2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICBqICs9IHRhYnNpemUgLSAoaiAlIHRhYnNpemUpOwotICAgICAgICAgICAgICAgIGlmIChqID4gUFlfU1NJWkVfVF9NQVgpIHsKLSAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVzdWx0IGlzIHRvbyBsb25nIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGluY3IgPSB0YWJzaXplIC0gKGogJSB0YWJzaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoaiA+IFBZX1NTSVpFX1RfTUFYIC0gaW5jcikKKyAgICAgICAgICAgICAgICAgICAgZ290byBvdmVyZmxvdzsKKyAgICAgICAgICAgICAgICBqICs9IGluY3I7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoaiA+IFBZX1NTSVpFX1RfTUFYIC0gMSkKKyAgICAgICAgICAgICAgICBnb3RvIG92ZXJmbG93OwogICAgICAgICAgICAgaisrOwogICAgICAgICAgICAgaWYgKCpwID09ICdcbicgfHwgKnAgPT0gJ1xyJykgeworICAgICAgICAgICAgICAgIGlmIChpID4gUFlfU1NJWkVfVF9NQVggLSBqKQorICAgICAgICAgICAgICAgICAgICBnb3RvIG92ZXJmbG93OwogICAgICAgICAgICAgICAgIGkgKz0gajsKICAgICAgICAgICAgICAgICBqID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoaSA+IFBZX1NTSVpFX1RfTUFYKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlc3VsdCBpcyB0b28gbG9uZyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAKLSAgICBpZiAoKGkgKyBqKSA+IFBZX1NTSVpFX1RfTUFYKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAicmVzdWx0IGlzIHRvbyBsb25nIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICAKKyAgICBpZiAoaSA+IFBZX1NTSVpFX1RfTUFYIC0gaikKKyAgICAgICAgZ290byBvdmVyZmxvdzsKKyAgICAKICAgICAvKiBTZWNvbmQgcGFzczogY3JlYXRlIG91dHB1dCBzdHJpbmcgYW5kIGZpbGwgaXQgKi8KICAgICB1ID0gU1RSSU5HTElCX05FVyhOVUxMLCBpICsgaik7CiAgICAgaWYgKCF1KQpAQCAtNjIsNyArNTgsNyBAQAogICAgIGogPSAwOwogICAgIHEgPSBTVFJJTkdMSUJfU1RSKHUpOwogICAgIAotICAgIGZvciAocCA9IFNUUklOR0xJQl9TVFIoc2VsZik7IHAgPCBlOyBwKyspCisgICAgZm9yIChwID0gU1RSSU5HTElCX1NUUihzZWxmKTsgcCA8IGU7IHArKykgewogICAgICAgICBpZiAoKnAgPT0gJ1x0JykgewogICAgICAgICAgICAgaWYgKHRhYnNpemUgPiAwKSB7CiAgICAgICAgICAgICAgICAgaSA9IHRhYnNpemUgLSAoaiAlIHRhYnNpemUpOwpAQCAtNzcsOCArNzMsMTIgQEAKICAgICAgICAgICAgIGlmICgqcCA9PSAnXG4nIHx8ICpwID09ICdccicpCiAgICAgICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgIH0KLSAgICAKKyAgICB9CisKICAgICByZXR1cm4gdTsKKyAgb3ZlcmZsb3c6CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJyZXN1bHQgdG9vIGxvbmciKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlfTE9DQUxfSU5MSU5FKFB5T2JqZWN0ICopCmRpZmYgLS1naXQgYS9PYmplY3RzL3N0cmluZ29iamVjdC5jIGIvT2JqZWN0cy9zdHJpbmdvYmplY3QuYwppbmRleCBkNmM0Zjc3Li4wYjZkMzZjIDEwMDY0NAotLS0gYS9PYmplY3RzL3N0cmluZ29iamVjdC5jCisrKyBiL09iamVjdHMvc3RyaW5nb2JqZWN0LmMKQEAgLTcyNiw2ICs3MjYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzKTsKICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHNraXAgXHggKi8KKyAgICAgICAgICAgIGlmIChzIDwgZW5kICYmIGlzeGRpZ2l0KFB5X0NIQVJNQVNLKHNbMF0pKSkKKyAgICAgICAgICAgICAgICBzKys7IC8qIGFuZCBhIGhleGRpZ2l0ICovCisgICAgICAgICAgICBicmVhazsKICNpZm5kZWYgUHlfVVNJTkdfVU5JQ09ERQogICAgICAgICBjYXNlICd1JzoKICAgICAgICAgY2FzZSAnVSc6CkBAIC03NDQsOCArNzQ4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGLTggYnl0ZXMgbWF5IGZvbGxvdy4gKi8KICAgICAgICAgfQogICAgIH0KLSAgICBpZiAocC1idWYgPCBuZXdsZW4gJiYgX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgcCAtIGJ1ZikpCi0gICAgICAgIGdvdG8gZmFpbGVkOworICAgIGlmIChwLWJ1ZiA8IG5ld2xlbikKKyAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgcCAtIGJ1Zik7IC8qIHYgaXMgY2xlYXJlZCBvbiBlcnJvciAqLwogICAgIHJldHVybiB2OwogICBmYWlsZWQ6CiAgICAgUHlfREVDUkVGKHYpOwpAQCAtODc4LDkgKzg4Miw5IEBACiAgICAgICAgICAgICBzaXplIC09IGNodW5rX3NpemU7CiAgICAgICAgIH0KICNpZmRlZiBfX1ZNUwotICAgICAgICBpZiAoc2l6ZSkgZndyaXRlKGRhdGEsIChpbnQpc2l6ZSwgMSwgZnApOworICAgICAgICBpZiAoc2l6ZSkgZndyaXRlKGRhdGEsIChzaXplX3Qpc2l6ZSwgMSwgZnApOwogI2Vsc2UKLSAgICAgICAgZndyaXRlKGRhdGEsIDEsIChpbnQpc2l6ZSwgZnApOworICAgICAgICBmd3JpdGUoZGF0YSwgMSwgKHNpemVfdClzaXplLCBmcCk7CiAjZW5kaWYKICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICAgICAgICAgcmV0dXJuIDA7CkBAIC0xMjUxLDcgKzEyNTUsNiBAQAogICAgIFB5U3RyaW5nT2JqZWN0ICphID0gKFB5U3RyaW5nT2JqZWN0KikgbzE7CiAgICAgUHlTdHJpbmdPYmplY3QgKmIgPSAoUHlTdHJpbmdPYmplY3QqKSBvMjsKICAgICByZXR1cm4gUHlfU0laRShhKSA9PSBQeV9TSVpFKGIpCi0gICAgICAmJiAqYS0+b2Jfc3ZhbCA9PSAqYi0+b2Jfc3ZhbAogICAgICAgJiYgbWVtY21wKGEtPm9iX3N2YWwsIGItPm9iX3N2YWwsIFB5X1NJWkUoYSkpID09IDA7CiB9CiAKQEAgLTEyNjIsMTQgKzEyNjUsMjcgQEAKICAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwOwogICAgIHJlZ2lzdGVyIGxvbmcgeDsKIAorI2lmZGVmIFB5X0RFQlVHCisgICAgYXNzZXJ0KF9QeV9IYXNoU2VjcmV0X0luaXRpYWxpemVkKTsKKyNlbmRpZgogICAgIGlmIChhLT5vYl9zaGFzaCAhPSAtMSkKICAgICAgICAgcmV0dXJuIGEtPm9iX3NoYXNoOwogICAgIGxlbiA9IFB5X1NJWkUoYSk7CisgICAgLyoKKyAgICAgIFdlIG1ha2UgdGhlIGhhc2ggb2YgdGhlIGVtcHR5IHN0cmluZyBiZSAwLCByYXRoZXIgdGhhbiB1c2luZworICAgICAgKHByZWZpeCBeIHN1ZmZpeCksIHNpbmNlIHRoaXMgc2xpZ2h0bHkgb2JmdXNjYXRlcyB0aGUgaGFzaCBzZWNyZXQKKyAgICAqLworICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgICBhLT5vYl9zaGFzaCA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KICAgICBwID0gKHVuc2lnbmVkIGNoYXIgKikgYS0+b2Jfc3ZhbDsKLSAgICB4ID0gKnAgPDwgNzsKKyAgICB4ID0gX1B5X0hhc2hTZWNyZXQucHJlZml4OworICAgIHggXj0gKnAgPDwgNzsKICAgICB3aGlsZSAoLS1sZW4gPj0gMCkKICAgICAgICAgeCA9ICgxMDAwMDAzKngpIF4gKnArKzsKICAgICB4IF49IFB5X1NJWkUoYSk7CisgICAgeCBePSBfUHlfSGFzaFNlY3JldC5zdWZmaXg7CiAgICAgaWYgKHggPT0gLTEpCiAgICAgICAgIHggPSAtMjsKICAgICBhLT5vYl9zaGFzaCA9IHg7CkBAIC0yMzE1LDcgKzIzMzEsNyBAQAogfQogCiBQeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkKLWNvdW50Y2hhcihjb25zdCBjaGFyICp0YXJnZXQsIGludCB0YXJnZXRfbGVuLCBjaGFyIGMsIFB5X3NzaXplX3QgbWF4Y291bnQpCitjb3VudGNoYXIoY29uc3QgY2hhciAqdGFyZ2V0LCBQeV9zc2l6ZV90IHRhcmdldF9sZW4sIGNoYXIgYywgUHlfc3NpemVfdCBtYXhjb3VudCkKIHsKICAgICBQeV9zc2l6ZV90IGNvdW50PTA7CiAgICAgY29uc3QgY2hhciAqc3RhcnQ9dGFyZ2V0OwpAQCAtMzA3NSwyNCArMzA5MSwyNSBAQAogICAgIGkgPSAwOyAvKiBjaGFycyB1cCB0byBhbmQgaW5jbHVkaW5nIG1vc3QgcmVjZW50IFxuIG9yIFxyICovCiAgICAgaiA9IDA7IC8qIGNoYXJzIHNpbmNlIG1vc3QgcmVjZW50IFxuIG9yIFxyICh1c2UgaW4gdGFiIGNhbGN1bGF0aW9ucykgKi8KICAgICBlID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpICsgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7IC8qIGVuZCBvZiBpbnB1dCAqLwotICAgIGZvciAocCA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsgcCA8IGU7IHArKykKLSAgICBpZiAoKnAgPT0gJ1x0JykgewotICAgICAgICBpZiAodGFic2l6ZSA+IDApIHsKLSAgICAgICAgICAgIGluY3IgPSB0YWJzaXplIC0gKGogJSB0YWJzaXplKTsKLSAgICAgICAgICAgIGlmIChqID4gUFlfU1NJWkVfVF9NQVggLSBpbmNyKQotICAgICAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3cxOwotICAgICAgICAgICAgaiArPSBpbmNyOworICAgIGZvciAocCA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsgcCA8IGU7IHArKykgeworICAgICAgICBpZiAoKnAgPT0gJ1x0JykgeworICAgICAgICAgICAgaWYgKHRhYnNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgaW5jciA9IHRhYnNpemUgLSAoaiAlIHRhYnNpemUpOworICAgICAgICAgICAgICAgIGlmIChqID4gUFlfU1NJWkVfVF9NQVggLSBpbmNyKQorICAgICAgICAgICAgICAgICAgICBnb3RvIG92ZXJmbG93MTsKKyAgICAgICAgICAgICAgICBqICs9IGluY3I7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlmIChqID4gUFlfU1NJWkVfVF9NQVggLSAxKQotICAgICAgICAgICAgZ290byBvdmVyZmxvdzE7Ci0gICAgICAgIGorKzsKLSAgICAgICAgaWYgKCpwID09ICdcbicgfHwgKnAgPT0gJ1xyJykgewotICAgICAgICAgICAgaWYgKGkgPiBQWV9TU0laRV9UX01BWCAtIGopCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKGogPiBQWV9TU0laRV9UX01BWCAtIDEpCiAgICAgICAgICAgICAgICAgZ290byBvdmVyZmxvdzE7Ci0gICAgICAgICAgICBpICs9IGo7Ci0gICAgICAgICAgICBqID0gMDsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgIGlmICgqcCA9PSAnXG4nIHx8ICpwID09ICdccicpIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA+IFBZX1NTSVpFX1RfTUFYIC0gaikKKyAgICAgICAgICAgICAgICAgICAgZ290byBvdmVyZmxvdzE7CisgICAgICAgICAgICAgICAgaSArPSBqOworICAgICAgICAgICAgICAgIGogPSAwOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0zMTA4LDI1ICszMTI1LDI2IEBACiAgICAgcSA9IFB5U3RyaW5nX0FTX1NUUklORyh1KTsgLyogbmV4dCBvdXRwdXQgY2hhciAqLwogICAgIHFlID0gUHlTdHJpbmdfQVNfU1RSSU5HKHUpICsgUHlTdHJpbmdfR0VUX1NJWkUodSk7IC8qIGVuZCBvZiBvdXRwdXQgKi8KIAotICAgIGZvciAocCA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsgcCA8IGU7IHArKykKLSAgICBpZiAoKnAgPT0gJ1x0JykgewotICAgICAgICBpZiAodGFic2l6ZSA+IDApIHsKLSAgICAgICAgICAgIGkgPSB0YWJzaXplIC0gKGogJSB0YWJzaXplKTsKLSAgICAgICAgICAgIGogKz0gaTsKLSAgICAgICAgICAgIHdoaWxlIChpLS0pIHsKLSAgICAgICAgICAgICAgICBpZiAocSA+PSBxZSkKLSAgICAgICAgICAgICAgICAgICAgZ290byBvdmVyZmxvdzI7Ci0gICAgICAgICAgICAgICAgKnErKyA9ICcgJzsKKyAgICBmb3IgKHAgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7IHAgPCBlOyBwKyspIHsKKyAgICAgICAgaWYgKCpwID09ICdcdCcpIHsKKyAgICAgICAgICAgIGlmICh0YWJzaXplID4gMCkgeworICAgICAgICAgICAgICAgIGkgPSB0YWJzaXplIC0gKGogJSB0YWJzaXplKTsKKyAgICAgICAgICAgICAgICBqICs9IGk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGktLSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocSA+PSBxZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3cyOworICAgICAgICAgICAgICAgICAgICAqcSsrID0gJyAnOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgaWYgKHEgPj0gcWUpCi0gICAgICAgICAgICBnb3RvIG92ZXJmbG93MjsKLSAgICAgICAgKnErKyA9ICpwOwotICAgICAgICBqKys7Ci0gICAgICAgIGlmICgqcCA9PSAnXG4nIHx8ICpwID09ICdccicpCi0gICAgICAgICAgICBqID0gMDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAocSA+PSBxZSkKKyAgICAgICAgICAgICAgICBnb3RvIG92ZXJmbG93MjsKKyAgICAgICAgICAgICpxKysgPSAqcDsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgIGlmICgqcCA9PSAnXG4nIHx8ICpwID09ICdccicpCisgICAgICAgICAgICAgICAgaiA9IDA7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gdTsKQEAgLTM1MzIsNyArMzU1MCw3IEBACiAKIAogUHlEb2NfU1RSVkFSKHNwbGl0bGluZXNfX2RvY19fLAotIlMuc3BsaXRsaW5lcyhba2VlcGVuZHNdKSAtPiBsaXN0IG9mIHN0cmluZ3NcblwKKyJTLnNwbGl0bGluZXMoa2VlcGVuZHM9RmFsc2UpIC0+IGxpc3Qgb2Ygc3RyaW5nc1xuXAogXG5cCiBSZXR1cm4gYSBsaXN0IG9mIHRoZSBsaW5lcyBpbiBTLCBicmVha2luZyBhdCBsaW5lIGJvdW5kYXJpZXMuXG5cCiBMaW5lIGJyZWFrcyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgbGlzdCB1bmxlc3Mga2VlcGVuZHNcblwKQEAgLTM3ODYsNyArMzgwNCw3IEBACiB9OwogCiBQeURvY19TVFJWQVIoc3RyaW5nX2RvYywKLSJzdHIob2JqZWN0KSAtPiBzdHJpbmdcblwKKyJzdHIob2JqZWN0PScnKSAtPiBzdHJpbmdcblwKIFxuXAogUmV0dXJuIGEgbmljZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdC5cblwKIElmIHRoZSBhcmd1bWVudCBpcyBhIHN0cmluZywgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgc2FtZSBvYmplY3QuIik7CkBAIC0zODQyLDggKzM4NjAsNyBAQAogICAgIGlmICgqcHYgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuOwogICAgIGlmICh3ID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKCpwdikpIHsKLSAgICAgICAgUHlfREVDUkVGKCpwdik7Ci0gICAgICAgICpwdiA9IE5VTEw7CisgICAgICAgIFB5X0NMRUFSKCpwdik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgdiA9IHN0cmluZ19jb25jYXQoKFB5U3RyaW5nT2JqZWN0ICopICpwdiwgdyk7CkBAIC00MjQxLDggKzQyNTgsOCBAQAogICAgICAgICBhcmdsZW4gPSAtMTsKICAgICAgICAgYXJnaWR4ID0gLTI7CiAgICAgfQotICAgIGlmIChQeV9UWVBFKGFyZ3MpLT50cF9hc19tYXBwaW5nICYmICFQeVR1cGxlX0NoZWNrKGFyZ3MpICYmCi0gICAgICAgICFQeU9iamVjdF9UeXBlQ2hlY2soYXJncywgJlB5QmFzZVN0cmluZ19UeXBlKSkKKyAgICBpZiAoUHlfVFlQRShhcmdzKS0+dHBfYXNfbWFwcGluZyAmJiBQeV9UWVBFKGFyZ3MpLT50cF9hc19tYXBwaW5nLT5tcF9zdWJzY3JpcHQgJiYKKyAgICAgICAgIVB5VHVwbGVfQ2hlY2soYXJncykgJiYgIVB5T2JqZWN0X1R5cGVDaGVjayhhcmdzLCAmUHlCYXNlU3RyaW5nX1R5cGUpKQogICAgICAgICBkaWN0ID0gYXJnczsKICAgICB3aGlsZSAoLS1mbXRjbnQgPj0gMCkgewogICAgICAgICBpZiAoKmZtdCAhPSAnJScpIHsKQEAgLTQzNDIsNyArNDM1OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKiB3YW50cyBpbnQiKTsKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2lkdGggPSBQeUludF9Bc0xvbmcodik7CisgICAgICAgICAgICAgICAgd2lkdGggPSBQeUludF9Bc1NzaXplX3Qodik7CisgICAgICAgICAgICAgICAgaWYgKHdpZHRoID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgaWYgKHdpZHRoIDwgMCkgewogICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBGX0xKVVNUOwogICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IC13aWR0aDsKQEAgLTQzNTYsNyArNDM3NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGMgPSBQeV9DSEFSTUFTSygqZm10KyspOwogICAgICAgICAgICAgICAgICAgICBpZiAoIWlzZGlnaXQoYykpCiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCh3aWR0aCoxMCkgLyAxMCAhPSB3aWR0aCkgeworICAgICAgICAgICAgICAgICAgICBpZiAod2lkdGggPiAoUFlfU1NJWkVfVF9NQVggLSAoKGludCljIC0gJzAnKSkgLyAxMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpZHRoIHRvbyBiaWciKTsKQEAgLTQzNzksNyArNDM5OCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiogd2FudHMgaW50Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHByZWMgPSBQeUludF9Bc0xvbmcodik7CisgICAgICAgICAgICAgICAgICAgIHByZWMgPSBfUHlJbnRfQXNJbnQodik7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVjID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgICAgICAgICBpZiAocHJlYyA8IDApCiAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjID0gMDsKICAgICAgICAgICAgICAgICAgICAgaWYgKC0tZm10Y250ID49IDApCkBAIC00MzkxLDcgKzQ0MTIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgYyA9IFB5X0NIQVJNQVNLKCpmbXQrKyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzZGlnaXQoYykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWMqMTApIC8gMTAgIT0gcHJlYykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWMgPiAoSU5UX01BWCAtICgoaW50KWMgLSAnMCcpKSAvIDEwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJlYyB0b28gYmlnIik7CkBAIC00NDc2LDcgKzQ0OTcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlvYmogPSBQeU51bWJlcl9JbnQodik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9iaj09TlVMTCkgaW9iaiA9IFB5TnVtYmVyX0xvbmcodik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9iaj09TlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9iaiA9IFB5TnVtYmVyX0xvbmcodik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKGlvYmohPU5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQeUludF9DaGVjayhpb2JqKSkgewpAQCAtNDc2NiwxMiArNDc5MCw5IEBACiBQeVN0cmluZ19GaW5pKHZvaWQpCiB7CiAgICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IFVDSEFSX01BWCArIDE7IGkrKykgewotICAgICAgICBQeV9YREVDUkVGKGNoYXJhY3RlcnNbaV0pOwotICAgICAgICBjaGFyYWN0ZXJzW2ldID0gTlVMTDsKLSAgICB9Ci0gICAgUHlfWERFQ1JFRihudWxsc3RyaW5nKTsKLSAgICBudWxsc3RyaW5nID0gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgVUNIQVJfTUFYICsgMTsgaSsrKQorICAgICAgICBQeV9DTEVBUihjaGFyYWN0ZXJzW2ldKTsKKyAgICBQeV9DTEVBUihudWxsc3RyaW5nKTsKIH0KIAogdm9pZCBfUHlfUmVsZWFzZUludGVybmVkU3RyaW5ncyh2b2lkKQpAQCAtNDgyMSw2ICs0ODQyLDUgQEAKICAgICAgICAgICAgICAgICAgICAgIm1vcnRhbC9pbW1vcnRhbFxuIiwgbW9ydGFsX3NpemUsIGltbW9ydGFsX3NpemUpOwogICAgIFB5X0RFQ1JFRihrZXlzKTsKICAgICBQeURpY3RfQ2xlYXIoaW50ZXJuZWQpOwotICAgIFB5X0RFQ1JFRihpbnRlcm5lZCk7Ci0gICAgaW50ZXJuZWQgPSBOVUxMOworICAgIFB5X0NMRUFSKGludGVybmVkKTsKIH0KZGlmZiAtLWdpdCBhL09iamVjdHMvc3RydWN0c2VxLmMgYi9PYmplY3RzL3N0cnVjdHNlcS5jCmluZGV4IDU4ZTE1Y2IuLjc1YzFmZmIgMTAwNjQ0Ci0tLSBhL09iamVjdHMvc3RydWN0c2VxLmMKKysrIGIvT2JqZWN0cy9zdHJ1Y3RzZXEuYwpAQCAtMTc1LDMyICsxNzUsMzMgQEAKICAgICBpZiAobWluX2xlbiAhPSBtYXhfbGVuKSB7CiAgICAgICAgIGlmIChsZW4gPCBtaW5fbGVuKSB7CiAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAiJS41MDBzKCkgdGFrZXMgYW4gYXQgbGVhc3QgJXpkLXNlcXVlbmNlICglemQtc2VxdWVuY2UgZ2l2ZW4pIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUtPnRwX25hbWUsIG1pbl9sZW4sIGxlbik7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmcpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAiJS41MDBzKCkgdGFrZXMgYW4gYXQgbGVhc3QgJXpkLXNlcXVlbmNlICglemQtc2VxdWVuY2UgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICB0eXBlLT50cF9uYW1lLCBtaW5fbGVuLCBsZW4pOworICAgICAgICAgICAgUHlfREVDUkVGKGFyZyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChsZW4gPiBtYXhfbGVuKSB7CiAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAiJS41MDBzKCkgdGFrZXMgYW4gYXQgbW9zdCAlemQtc2VxdWVuY2UgKCV6ZC1zZXF1ZW5jZSBnaXZlbikiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS0+dHBfbmFtZSwgbWF4X2xlbiwgbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFyZyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICIlLjUwMHMoKSB0YWtlcyBhbiBhdCBtb3N0ICV6ZC1zZXF1ZW5jZSAoJXpkLXNlcXVlbmNlIGdpdmVuKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS0+dHBfbmFtZSwgbWF4X2xlbiwgbGVuKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhcmcpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIGlmIChsZW4gIT0gbWluX2xlbikgewogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgIiUuNTAwcygpIHRha2VzIGEgJXpkLXNlcXVlbmNlICglemQtc2VxdWVuY2UgZ2l2ZW4pIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUtPnRwX25hbWUsIG1pbl9sZW4sIGxlbik7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmcpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJS41MDBzKCkgdGFrZXMgYSAlemQtc2VxdWVuY2UgKCV6ZC1zZXF1ZW5jZSBnaXZlbikiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUtPnRwX25hbWUsIG1pbl9sZW4sIGxlbik7CisgICAgICAgICAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcmVzID0gKFB5U3RydWN0U2VxdWVuY2UqKSBQeVN0cnVjdFNlcXVlbmNlX05ldyh0eXBlKTsKICAgICBpZiAocmVzID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGFyZyk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKZGlmZiAtLWdpdCBhL09iamVjdHMvdHVwbGVvYmplY3QuYyBiL09iamVjdHMvdHVwbGVvYmplY3QuYwppbmRleCAzMjQ5Y2NjLi5hM2MxODVlIDEwMDY0NAotLS0gYS9PYmplY3RzL3R1cGxlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy90dXBsZW9iamVjdC5jCkBAIC0xOTIsOCArMTkyLDEwIEBACiAKICAgICB2YV9zdGFydCh2YXJncywgbik7CiAgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcobik7Ci0gICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICB2YV9lbmQodmFyZ3MpOwogICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgICAgaXRlbXMgPSAoKFB5VHVwbGVPYmplY3QgKilyZXN1bHQpLT5vYl9pdGVtOwogICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgbyA9IHZhX2FyZyh2YXJncywgUHlPYmplY3QgKik7CkBAIC04NzksOCArODgxLDcgQEAKICAgICBfUHlfRm9yZ2V0UmVmZXJlbmNlKChQeU9iamVjdCAqKSB2KTsKICAgICAvKiBERUNSRUYgaXRlbXMgZGVsZXRlZCBieSBzaHJpbmthZ2UgKi8KICAgICBmb3IgKGkgPSBuZXdzaXplOyBpIDwgb2xkc2l6ZTsgaSsrKSB7Ci0gICAgICAgIFB5X1hERUNSRUYodi0+b2JfaXRlbVtpXSk7Ci0gICAgICAgIHYtPm9iX2l0ZW1baV0gPSBOVUxMOworICAgICAgICBQeV9DTEVBUih2LT5vYl9pdGVtW2ldKTsKICAgICB9CiAgICAgc3YgPSBQeU9iamVjdF9HQ19SZXNpemUoUHlUdXBsZU9iamVjdCwgdiwgbmV3c2l6ZSk7CiAgICAgaWYgKHN2ID09IE5VTEwpIHsKQEAgLTkyNiw4ICs5MjcsNyBAQAogI2lmIFB5VHVwbGVfTUFYU0FWRVNJWkUgPiAwCiAgICAgLyogZW1wdHkgdHVwbGVzIGFyZSB1c2VkIGFsbCBvdmVyIHRoZSBwbGFjZSBhbmQgYXBwbGljYXRpb25zIG1heQogICAgICAqIHJlbHkgb24gdGhlIGZhY3QgdGhhdCBhbiBlbXB0eSB0dXBsZSBpcyBhIHNpbmdsZXRvbi4gKi8KLSAgICBQeV9YREVDUkVGKGZyZWVfbGlzdFswXSk7Ci0gICAgZnJlZV9saXN0WzBdID0gTlVMTDsKKyAgICBQeV9DTEVBUihmcmVlX2xpc3RbMF0pOwogCiAgICAgKHZvaWQpUHlUdXBsZV9DbGVhckZyZWVMaXN0KCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL09iamVjdHMvdHlwZW9iamVjdC5jIGIvT2JqZWN0cy90eXBlb2JqZWN0LmMKaW5kZXggZTUwNDJjYy4uYmUwNGM5ZSAxMDA2NDQKLS0tIGEvT2JqZWN0cy90eXBlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy90eXBlb2JqZWN0LmMKQEAgLTIyNSw2ICsyMjUsNyBAQAogdHlwZV9zZXRfbmFtZShQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICp2YWx1ZSwgdm9pZCAqY29udGV4dCkKIHsKICAgICBQeUhlYXBUeXBlT2JqZWN0KiBldDsKKyAgICBQeU9iamVjdCAqdG1wOwogCiAgICAgaWYgKCEodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSkgewogICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLApAQCAtMjUzLDEwICsyNTQsMTMgQEAKIAogICAgIFB5X0lOQ1JFRih2YWx1ZSk7CiAKLSAgICBQeV9ERUNSRUYoZXQtPmh0X25hbWUpOworICAgIC8qIFdhaXQgdW50aWwgZXQgaXMgYSBzYW5lIHN0YXRlIGJlZm9yZSBQeV9ERUNSRUYnaW5nIHRoZSBvbGQgZXQtPmh0X25hbWUKKyAgICAgICB2YWx1ZS4gIChCdWcgIzE2NDQ3LikgICovCisgICAgdG1wID0gZXQtPmh0X25hbWU7CiAgICAgZXQtPmh0X25hbWUgPSB2YWx1ZTsKIAogICAgIHR5cGUtPnRwX25hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcodmFsdWUpOworICAgIFB5X0RFQ1JFRih0bXApOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC0zMjcsMTEgKzMzMSwxNSBAQAogICAgICAgIGFiYy5BQkNNZXRhLl9fbmV3X18sIHNvIHRoaXMgZnVuY3Rpb24gZG9lc24ndCBkbyBhbnl0aGluZwogICAgICAgIHNwZWNpYWwgdG8gdXBkYXRlIHN1YmNsYXNzZXMuCiAgICAgKi8KLSAgICBpbnQgcmVzOworICAgIGludCBhYnN0cmFjdCwgcmVzOwogICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgIGFic3RyYWN0ID0gUHlPYmplY3RfSXNUcnVlKHZhbHVlKTsKKyAgICAgICAgaWYgKGFic3RyYWN0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgcmVzID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcodHlwZS0+dHBfZGljdCwgIl9fYWJzdHJhY3RtZXRob2RzX18iLCB2YWx1ZSk7CiAgICAgfQogICAgIGVsc2UgeworICAgICAgICBhYnN0cmFjdCA9IDA7CiAgICAgICAgIHJlcyA9IFB5RGljdF9EZWxJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsICJfX2Fic3RyYWN0bWV0aG9kc19fIik7CiAgICAgICAgIGlmIChyZXMgJiYgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19LZXlFcnJvcikpIHsKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgIl9fYWJzdHJhY3RtZXRob2RzX18iKTsKQEAgLTM0MCwxMiArMzQ4LDEwIEBACiAgICAgfQogICAgIGlmIChyZXMgPT0gMCkgewogICAgICAgICBQeVR5cGVfTW9kaWZpZWQodHlwZSk7Ci0gICAgICAgIGlmICh2YWx1ZSAmJiBQeU9iamVjdF9Jc1RydWUodmFsdWUpKSB7CisgICAgICAgIGlmIChhYnN0cmFjdCkKICAgICAgICAgICAgIHR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfSVNfQUJTVFJBQ1Q7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7CisgICAgICAgIGVsc2UKICAgICAgICAgICAgIHR5cGUtPnRwX2ZsYWdzICY9IH5QeV9UUEZMQUdTX0lTX0FCU1RSQUNUOwotICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiByZXM7CiB9CkBAIC02ODQsOCArNjkwLDEwIEBACiAgICAgICAgIG1vZCA9IE5VTEw7CiAgICAgfQogICAgIG5hbWUgPSB0eXBlX25hbWUodHlwZSwgTlVMTCk7Ci0gICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICAgIFB5X1hERUNSRUYobW9kKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCiAgICAgaWYgKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkKICAgICAgICAga2luZCA9ICJjbGFzcyI7CkBAIC04NzYsOCArODg0LDEzIEBACiAgICAgICAgIGFzc2VydChiYXNlKTsKICAgICB9CiAKLSAgICAvKiBUaGVyZSdzIG5vIG5lZWQgdG8gY2xlYXIgdGhlIGluc3RhbmNlIGRpY3QgKGlmIGFueSk7Ci0gICAgICAgdGhlIGNvbGxlY3RvciB3aWxsIGNhbGwgaXRzIHRwX2NsZWFyIGhhbmRsZXIuICovCisgICAgLyogQ2xlYXIgdGhlIGluc3RhbmNlIGRpY3QgKGlmIGFueSksIHRvIGJyZWFrIGN5Y2xlcyBpbnZvbHZpbmcgb25seQorICAgICAgIF9fZGljdF9fIHNsb3RzIChhcyBpbiB0aGUgY2FzZSAnc2VsZi5fX2RpY3RfXyBpcyBzZWxmJykuICovCisgICAgaWYgKHR5cGUtPnRwX2RpY3RvZmZzZXQgIT0gYmFzZS0+dHBfZGljdG9mZnNldCkgeworICAgICAgICBQeU9iamVjdCAqKmRpY3RwdHIgPSBfUHlPYmplY3RfR2V0RGljdFB0cihzZWxmKTsKKyAgICAgICAgaWYgKGRpY3RwdHIgJiYgKmRpY3RwdHIpCisgICAgICAgICAgICBQeV9DTEVBUigqZGljdHB0cik7CisgICAgfQogCiAgICAgaWYgKGJhc2VjbGVhcikKICAgICAgICAgcmV0dXJuIGJhc2VjbGVhcihzZWxmKTsKQEAgLTg4OSw2ICs5MDIsNyBAQAogewogICAgIFB5VHlwZU9iamVjdCAqdHlwZSwgKmJhc2U7CiAgICAgZGVzdHJ1Y3RvciBiYXNlZGVhbGxvYzsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwogCiAgICAgLyogRXh0cmFjdCB0aGUgdHlwZTsgd2UgZXhwZWN0IGl0IHRvIGJlIGEgaGVhcCB0eXBlICovCiAgICAgdHlwZSA9IFB5X1RZUEUoc2VsZik7CkBAIC05MzgsOCArOTUyLDEwIEBACiAgICAgLyogU2VlIGV4cGxhbmF0aW9uIGF0IGVuZCBvZiBmdW5jdGlvbiBmb3IgZnVsbCBkaXNjbG9zdXJlICovCiAgICAgUHlPYmplY3RfR0NfVW5UcmFjayhzZWxmKTsKICAgICArK19QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nOworICAgICsrIHRzdGF0ZS0+dHJhc2hfZGVsZXRlX25lc3Rpbmc7CiAgICAgUHlfVFJBU0hDQU5fU0FGRV9CRUdJTihzZWxmKTsKICAgICAtLV9QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nOworICAgIC0tIHRzdGF0ZS0+dHJhc2hfZGVsZXRlX25lc3Rpbmc7CiAgICAgLyogRE8gTk9UIHJlc3RvcmUgR0MgdHJhY2tpbmcgYXQgdGhpcyBwb2ludC4gIHdlYWtyZWYgY2FsbGJhY2tzCiAgICAgICogKGlmIGFueSwgYW5kIHdoZXRoZXIgZGlyZWN0bHkgaGVyZSBvciBpbmRpcmVjdGx5IGluIHNvbWV0aGluZyB3ZQogICAgICAqIGNhbGwpIG1heSB0cmlnZ2VyIEdDLCBhbmQgaWYgc2VsZiBpcyB0cmFja2VkIGF0IHRoYXQgcG9pbnQsIGl0CkBAIC0xMDEzLDE1ICsxMDI5LDE1IEBACiAgICAgYXNzZXJ0KGJhc2VkZWFsbG9jKTsKICAgICBiYXNlZGVhbGxvYyhzZWxmKTsKIAotICAgIFB5VHlwZV9Nb2RpZmllZCh0eXBlKTsKLQogICAgIC8qIENhbid0IHJlZmVyZW5jZSBzZWxmIGJleW9uZCB0aGlzIHBvaW50ICovCiAgICAgUHlfREVDUkVGKHR5cGUpOwogCiAgIGVuZGxhYmVsOgogICAgICsrX1B5VHJhc2hfZGVsZXRlX25lc3Rpbmc7CisgICAgKysgdHN0YXRlLT50cmFzaF9kZWxldGVfbmVzdGluZzsKICAgICBQeV9UUkFTSENBTl9TQUZFX0VORChzZWxmKTsKICAgICAtLV9QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nOworICAgIC0tIHRzdGF0ZS0+dHJhc2hfZGVsZXRlX25lc3Rpbmc7CiAKICAgICAvKiBFeHBsYW5hdGlvbiBvZiB0aGUgd2VpcmRuZXNzIGFyb3VuZCB0aGUgdHJhc2hjYW4gbWFjcm9zOgogCkBAIC0yNTI3LDYgKzI1NDMsMTMgQEAKICAgICBQeU9iamVjdCAqbWV0YV9hdHRyaWJ1dGUsICphdHRyaWJ1dGU7CiAgICAgZGVzY3JnZXRmdW5jIG1ldGFfZ2V0OwogCisgICAgaWYgKCFQeVN0cmluZ19DaGVjayhuYW1lKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgc3RyaW5nLCBub3QgJyUuMjAwcyciLAorICAgICAgICAgICAgICAgICAgICAgbmFtZS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwogICAgIC8qIEluaXRpYWxpemUgdGhpcyB0eXBlICh3ZSdsbCBhc3N1bWUgdGhlIG1ldGF0eXBlIGlzIGluaXRpYWxpemVkKSAqLwogICAgIGlmICh0eXBlLT50cF9kaWN0ID09IE5VTEwpIHsKICAgICAgICAgaWYgKFB5VHlwZV9SZWFkeSh0eXBlKSA8IDApCkBAIC0yNzA3LDE1ICsyNzMwLDE2IEBACiAgICAgICAgZm9yIGhlYXB0eXBlcy4gKi8KICAgICBhc3NlcnQodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKTsKIAotICAgIC8qIFRoZSBvbmx5IGZpZWxkIHdlIG5lZWQgdG8gY2xlYXIgaXMgdHBfbXJvLCB3aGljaCBpcyBwYXJ0IG9mIGEKLSAgICAgICBoYXJkIGN5Y2xlIChpdHMgZmlyc3QgZWxlbWVudCBpcyB0aGUgY2xhc3MgaXRzZWxmKSB0aGF0IHdvbid0Ci0gICAgICAgYmUgYnJva2VuIG90aGVyd2lzZSAoaXQncyBhIHR1cGxlIGFuZCB0dXBsZXMgZG9uJ3QgaGF2ZSBhCisgICAgLyogV2UgbmVlZCB0byBpbnZhbGlkYXRlIHRoZSBtZXRob2QgY2FjaGUgY2FyZWZ1bGx5IGJlZm9yZSBjbGVhcmluZworICAgICAgIHRoZSBkaWN0LCBzbyB0aGF0IG90aGVyIG9iamVjdHMgY2F1Z2h0IGluIGEgcmVmZXJlbmNlIGN5Y2xlCisgICAgICAgZG9uJ3Qgc3RhcnQgY2FsbGluZyBkZXN0cm95ZWQgbWV0aG9kcy4KKworICAgICAgIE90aGVyd2lzZSwgdGhlIG9ubHkgZmllbGQgd2UgbmVlZCB0byBjbGVhciBpcyB0cF9tcm8sIHdoaWNoIGlzCisgICAgICAgcGFydCBvZiBhIGhhcmQgY3ljbGUgKGl0cyBmaXJzdCBlbGVtZW50IGlzIHRoZSBjbGFzcyBpdHNlbGYpIHRoYXQKKyAgICAgICB3b24ndCBiZSBicm9rZW4gb3RoZXJ3aXNlIChpdCdzIGEgdHVwbGUgYW5kIHR1cGxlcyBkb24ndCBoYXZlIGEKICAgICAgICB0cF9jbGVhciBoYW5kbGVyKS4gIE5vbmUgb2YgdGhlIG90aGVyIGZpZWxkcyBuZWVkIHRvIGJlCiAgICAgICAgY2xlYXJlZCwgYW5kIGhlcmUncyB3aHk6CiAKLSAgICAgICB0cF9kaWN0OgotICAgICAgICAgICBJdCBpcyBhIGRpY3QsIHNvIHRoZSBjb2xsZWN0b3Igd2lsbCBjYWxsIGl0cyB0cF9jbGVhci4KLQogICAgICAgIHRwX2NhY2hlOgogICAgICAgICAgICBOb3QgdXNlZDsgaWYgaXQgd2VyZSwgaXQgd291bGQgYmUgYSBkaWN0LgogCkBAIC0yNzMyLDYgKzI3NTYsOSBAQAogICAgICAgICAgICBBIHR1cGxlIG9mIHN0cmluZ3MgY2FuJ3QgYmUgcGFydCBvZiBhIGN5Y2xlLgogICAgICovCiAKKyAgICBQeVR5cGVfTW9kaWZpZWQodHlwZSk7CisgICAgaWYgKHR5cGUtPnRwX2RpY3QpCisgICAgICAgIFB5RGljdF9DbGVhcih0eXBlLT50cF9kaWN0KTsKICAgICBQeV9DTEVBUih0eXBlLT50cF9tcm8pOwogCiAgICAgcmV0dXJuIDA7CkBAIC0yODc0LDE0ICsyOTAxLDE0IEBACiAgICAgICAgICAgICB0eXBlLT50cF9pbml0ICE9IG9iamVjdF9pbml0KQogICAgICAgICB7CiAgICAgICAgICAgICBlcnIgPSBQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0Ll9fbmV3X18oKSB0YWtlcyBubyBwYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCgpIHRha2VzIG5vIHBhcmFtZXRlcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAxKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmICh0eXBlLT50cF9uZXcgIT0gb2JqZWN0X25ldyB8fAogICAgICAgICAgICAgICAgICB0eXBlLT50cF9pbml0ID09IG9iamVjdF9pbml0KQogICAgICAgICB7CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICJvYmplY3QuX19uZXdfXygpIHRha2VzIG5vIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgICAgICAgICAib2JqZWN0KCkgdGFrZXMgbm8gcGFyYW1ldGVycyIpOwogICAgICAgICAgICAgZXJyID0gLTE7CiAgICAgICAgIH0KICAgICB9CkBAIC0yOTYxLDggKzI5ODgsMTAgQEAKICAgICAgICAgbW9kID0gTlVMTDsKICAgICB9CiAgICAgbmFtZSA9IHR5cGVfbmFtZSh0eXBlLCBOVUxMKTsKLSAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgIGlmIChuYW1lID09IE5VTEwpIHsKKyAgICAgICAgUHlfWERFQ1JFRihtb2QpOwogICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgICAgaWYgKG1vZCAhPSBOVUxMICYmIHN0cmNtcChQeVN0cmluZ19BU19TVFJJTkcobW9kKSwgIl9fYnVpbHRpbl9fIikpCiAgICAgICAgIHJ0biA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjwlcy4lcyBvYmplY3QgYXQgJXA+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcobW9kKSwKQEAgLTI5ODIsNyArMzAxMSw3IEBACiAgICAgdW5hcnlmdW5jIGY7CiAKICAgICBmID0gUHlfVFlQRShzZWxmKS0+dHBfcmVwcjsKLSAgICBpZiAoZiA9PSBOVUxMIHx8IGYgPT0gb2JqZWN0X3N0cikKKyAgICBpZiAoZiA9PSBOVUxMKQogICAgICAgICBmID0gb2JqZWN0X3JlcHI7CiAgICAgcmV0dXJuIGYoc2VsZik7CiB9CkBAIC0zNTUxLDYgKzM1ODAsNyBAQAogCiAgICAgZm9yICg7IG1ldGgtPm1sX25hbWUgIT0gTlVMTDsgbWV0aCsrKSB7CiAgICAgICAgIFB5T2JqZWN0ICpkZXNjcjsKKyAgICAgICAgaW50IGVycjsKICAgICAgICAgaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsIG1ldGgtPm1sX25hbWUpICYmCiAgICAgICAgICAgICAhKG1ldGgtPm1sX2ZsYWdzICYgTUVUSF9DT0VYSVNUKSkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTM1NzQsOSArMzYwNCwxMCBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChkZXNjciA9PSBOVUxMKQogICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgbWV0aC0+bWxfbmFtZSwgZGVzY3IpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZXJyID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgbWV0aC0+bWxfbmFtZSwgZGVzY3IpOwogICAgICAgICBQeV9ERUNSRUYoZGVzY3IpOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CkBAIC01NzY4LDE1ICs1Nzk5LDE2IEBACiB9CiAKIAotLyogVGFibGUgbWFwcGluZyBfX2Zvb19fIG5hbWVzIHRvIHRwX2ZvbyBvZmZzZXRzIGFuZCBzbG90X3RwX2ZvbyB3cmFwcGVyCi0gICBmdW5jdGlvbnMuICBUaGUgb2Zmc2V0cyBoZXJlIGFyZSByZWxhdGl2ZSB0byB0aGUgJ1B5SGVhcFR5cGVPYmplY3QnCi0gICBzdHJ1Y3R1cmUsIHdoaWNoIGluY29ycG9yYXRlcyB0aGUgYWRkaXRpb25hbCBzdHJ1Y3R1cmVzIHVzZWQgZm9yIG51bWJlcnMsCi0gICBzZXF1ZW5jZXMgYW5kIG1hcHBpbmdzLgotICAgTm90ZSB0aGF0IG11bHRpcGxlIG5hbWVzIG1heSBtYXAgdG8gdGhlIHNhbWUgc2xvdCAoZS5nLiBfX2VxX18sCi0gICBfX25lX18gZXRjLiBhbGwgbWFwIHRvIHRwX3JpY2hjb21wYXJlKSBhbmQgb25lIG5hbWUgbWF5IG1hcCB0byBtdWx0aXBsZQotICAgc2xvdHMgKGUuZy4gX19zdHJfXyBhZmZlY3RzIHRwX3N0ciBhcyB3ZWxsIGFzIHRwX3JlcHIpLiBUaGUgdGFibGUgaXMKLSAgIHRlcm1pbmF0ZWQgd2l0aCBhbiBhbGwtemVybyBlbnRyeS4gIChUaGlzIHRhYmxlIGlzIGZ1cnRoZXIgaW5pdGlhbGl6ZWQgYW5kCi0gICBzb3J0ZWQgaW4gaW5pdF9zbG90ZGVmcygpIGJlbG93LikgKi8KKy8qCitUYWJsZSBtYXBwaW5nIF9fZm9vX18gbmFtZXMgdG8gdHBfZm9vIG9mZnNldHMgYW5kIHNsb3RfdHBfZm9vIHdyYXBwZXIgZnVuY3Rpb25zLgorCitUaGUgdGFibGUgaXMgb3JkZXJlZCBieSBvZmZzZXRzIHJlbGF0aXZlIHRvIHRoZSAnUHlIZWFwVHlwZU9iamVjdCcgc3RydWN0dXJlLAord2hpY2ggaW5jb3Jwb3JhdGVzIHRoZSBhZGRpdGlvbmFsIHN0cnVjdHVyZXMgdXNlZCBmb3IgbnVtYmVycywgc2VxdWVuY2VzIGFuZAorbWFwcGluZ3MuICBOb3RlIHRoYXQgbXVsdGlwbGUgbmFtZXMgbWF5IG1hcCB0byB0aGUgc2FtZSBzbG90IChlLmcuIF9fZXFfXywKK19fbmVfXyBldGMuIGFsbCBtYXAgdG8gdHBfcmljaGNvbXBhcmUpIGFuZCBvbmUgbmFtZSBtYXkgbWFwIHRvIG11bHRpcGxlIHNsb3RzCisoZS5nLiBfX3N0cl9fIGFmZmVjdHMgdHBfc3RyIGFzIHdlbGwgYXMgdHBfcmVwcikuIFRoZSB0YWJsZSBpcyB0ZXJtaW5hdGVkIHdpdGgKK2FuIGFsbC16ZXJvIGVudHJ5LiAgKFRoaXMgdGFibGUgaXMgZnVydGhlciBpbml0aWFsaXplZCBpbiBpbml0X3Nsb3RkZWZzKCkuKQorKi8KIAogdHlwZWRlZiBzdHJ1Y3Qgd3JhcHBlcmJhc2Ugc2xvdGRlZjsKIApAQCAtNTgyNiw1NyArNTg1OCw1NyBAQAogICAgICAgICAgICAieC4iIE5BTUUgIih5KSA8PT0+ICIgRE9DKQogCiBzdGF0aWMgc2xvdGRlZiBzbG90ZGVmc1tdID0gewotICAgIFNRU0xPVCgiX19sZW5fXyIsIHNxX2xlbmd0aCwgc2xvdF9zcV9sZW5ndGgsIHdyYXBfbGVuZnVuYywKLSAgICAgICAgICAgInguX19sZW5fXygpIDw9PT4gbGVuKHgpIiksCi0gICAgLyogSGVhcCB0eXBlcyBkZWZpbmluZyBfX2FkZF9fL19fbXVsX18gaGF2ZSBzcV9jb25jYXQvc3FfcmVwZWF0ID09IE5VTEwuCi0gICAgICAgVGhlIGxvZ2ljIGluIGFic3RyYWN0LmMgYWx3YXlzIGZhbGxzIGJhY2sgdG8gbmJfYWRkL25iX211bHRpcGx5IGluCi0gICAgICAgdGhpcyBjYXNlLiAgRGVmaW5pbmcgYm90aCB0aGUgbmJfKiBhbmQgdGhlIHNxXyogc2xvdHMgdG8gY2FsbCB0aGUKLSAgICAgICB1c2VyLWRlZmluZWQgbWV0aG9kcyBoYXMgdW5leHBlY3RlZCBzaWRlLWVmZmVjdHMsIGFzIHNob3duIGJ5Ci0gICAgICAgdGVzdF9kZXNjci5ub3RpbXBsZW1lbnRlZCgpICovCi0gICAgU1FTTE9UKCJfX2FkZF9fIiwgc3FfY29uY2F0LCBOVUxMLCB3cmFwX2JpbmFyeWZ1bmMsCi0gICAgICAieC5fX2FkZF9fKHkpIDw9PT4geCt5IiksCi0gICAgU1FTTE9UKCJfX211bF9fIiwgc3FfcmVwZWF0LCBOVUxMLCB3cmFwX2luZGV4YXJnZnVuYywKLSAgICAgICJ4Ll9fbXVsX18obikgPD09PiB4Km4iKSwKLSAgICBTUVNMT1QoIl9fcm11bF9fIiwgc3FfcmVwZWF0LCBOVUxMLCB3cmFwX2luZGV4YXJnZnVuYywKLSAgICAgICJ4Ll9fcm11bF9fKG4pIDw9PT4gbip4IiksCi0gICAgU1FTTE9UKCJfX2dldGl0ZW1fXyIsIHNxX2l0ZW0sIHNsb3Rfc3FfaXRlbSwgd3JhcF9zcV9pdGVtLAotICAgICAgICAgICAieC5fX2dldGl0ZW1fXyh5KSA8PT0+IHhbeV0iKSwKLSAgICBTUVNMT1QoIl9fZ2V0c2xpY2VfXyIsIHNxX3NsaWNlLCBzbG90X3NxX3NsaWNlLCB3cmFwX3NzaXplc3NpemVhcmdmdW5jLAotICAgICAgICAgICAieC5fX2dldHNsaWNlX18oaSwgaikgPD09PiB4W2k6al1cblwKLSAgICAgICAgICAgXG5cCi0gICAgICAgICAgIFVzZSBvZiBuZWdhdGl2ZSBpbmRpY2VzIGlzIG5vdCBzdXBwb3J0ZWQuIiksCi0gICAgU1FTTE9UKCJfX3NldGl0ZW1fXyIsIHNxX2Fzc19pdGVtLCBzbG90X3NxX2Fzc19pdGVtLCB3cmFwX3NxX3NldGl0ZW0sCi0gICAgICAgICAgICJ4Ll9fc2V0aXRlbV9fKGksIHkpIDw9PT4geFtpXT15IiksCi0gICAgU1FTTE9UKCJfX2RlbGl0ZW1fXyIsIHNxX2Fzc19pdGVtLCBzbG90X3NxX2Fzc19pdGVtLCB3cmFwX3NxX2RlbGl0ZW0sCi0gICAgICAgICAgICJ4Ll9fZGVsaXRlbV9fKHkpIDw9PT4gZGVsIHhbeV0iKSwKLSAgICBTUVNMT1QoIl9fc2V0c2xpY2VfXyIsIHNxX2Fzc19zbGljZSwgc2xvdF9zcV9hc3Nfc2xpY2UsCi0gICAgICAgICAgIHdyYXBfc3NpemVzc2l6ZW9iamFyZ3Byb2MsCi0gICAgICAgICAgICJ4Ll9fc2V0c2xpY2VfXyhpLCBqLCB5KSA8PT0+IHhbaTpqXT15XG5cCi0gICAgICAgICAgIFxuXAotICAgICAgICAgICBVc2UgIG9mIG5lZ2F0aXZlIGluZGljZXMgaXMgbm90IHN1cHBvcnRlZC4iKSwKLSAgICBTUVNMT1QoIl9fZGVsc2xpY2VfXyIsIHNxX2Fzc19zbGljZSwgc2xvdF9zcV9hc3Nfc2xpY2UsIHdyYXBfZGVsc2xpY2UsCi0gICAgICAgICAgICJ4Ll9fZGVsc2xpY2VfXyhpLCBqKSA8PT0+IGRlbCB4W2k6al1cblwKLSAgICAgICAgICAgXG5cCi0gICAgICAgICAgIFVzZSBvZiBuZWdhdGl2ZSBpbmRpY2VzIGlzIG5vdCBzdXBwb3J0ZWQuIiksCi0gICAgU1FTTE9UKCJfX2NvbnRhaW5zX18iLCBzcV9jb250YWlucywgc2xvdF9zcV9jb250YWlucywgd3JhcF9vYmpvYmpwcm9jLAotICAgICAgICAgICAieC5fX2NvbnRhaW5zX18oeSkgPD09PiB5IGluIHgiKSwKLSAgICBTUVNMT1QoIl9faWFkZF9fIiwgc3FfaW5wbGFjZV9jb25jYXQsIE5VTEwsCi0gICAgICB3cmFwX2JpbmFyeWZ1bmMsICJ4Ll9faWFkZF9fKHkpIDw9PT4geCs9eSIpLAotICAgIFNRU0xPVCgiX19pbXVsX18iLCBzcV9pbnBsYWNlX3JlcGVhdCwgTlVMTCwKLSAgICAgIHdyYXBfaW5kZXhhcmdmdW5jLCAieC5fX2ltdWxfXyh5KSA8PT0+IHgqPXkiKSwKLQotICAgIE1QU0xPVCgiX19sZW5fXyIsIG1wX2xlbmd0aCwgc2xvdF9tcF9sZW5ndGgsIHdyYXBfbGVuZnVuYywKLSAgICAgICAgICAgInguX19sZW5fXygpIDw9PT4gbGVuKHgpIiksCi0gICAgTVBTTE9UKCJfX2dldGl0ZW1fXyIsIG1wX3N1YnNjcmlwdCwgc2xvdF9tcF9zdWJzY3JpcHQsCi0gICAgICAgICAgIHdyYXBfYmluYXJ5ZnVuYywKLSAgICAgICAgICAgInguX19nZXRpdGVtX18oeSkgPD09PiB4W3ldIiksCi0gICAgTVBTTE9UKCJfX3NldGl0ZW1fXyIsIG1wX2Fzc19zdWJzY3JpcHQsIHNsb3RfbXBfYXNzX3N1YnNjcmlwdCwKLSAgICAgICAgICAgd3JhcF9vYmpvYmphcmdwcm9jLAotICAgICAgICAgICAieC5fX3NldGl0ZW1fXyhpLCB5KSA8PT0+IHhbaV09eSIpLAotICAgIE1QU0xPVCgiX19kZWxpdGVtX18iLCBtcF9hc3Nfc3Vic2NyaXB0LCBzbG90X21wX2Fzc19zdWJzY3JpcHQsCi0gICAgICAgICAgIHdyYXBfZGVsaXRlbSwKLSAgICAgICAgICAgInguX19kZWxpdGVtX18oeSkgPD09PiBkZWwgeFt5XSIpLAotCisgICAgVFBTTE9UKCJfX3N0cl9fIiwgdHBfcHJpbnQsIE5VTEwsIE5VTEwsICIiKSwKKyAgICBUUFNMT1QoIl9fcmVwcl9fIiwgdHBfcHJpbnQsIE5VTEwsIE5VTEwsICIiKSwKKyAgICBUUFNMT1QoIl9fZ2V0YXR0cmlidXRlX18iLCB0cF9nZXRhdHRyLCBOVUxMLCBOVUxMLCAiIiksCisgICAgVFBTTE9UKCJfX2dldGF0dHJfXyIsIHRwX2dldGF0dHIsIE5VTEwsIE5VTEwsICIiKSwKKyAgICBUUFNMT1QoIl9fc2V0YXR0cl9fIiwgdHBfc2V0YXR0ciwgTlVMTCwgTlVMTCwgIiIpLAorICAgIFRQU0xPVCgiX19kZWxhdHRyX18iLCB0cF9zZXRhdHRyLCBOVUxMLCBOVUxMLCAiIiksCisgICAgVFBTTE9UKCJfX2NtcF9fIiwgdHBfY29tcGFyZSwgX1B5T2JqZWN0X1Nsb3RDb21wYXJlLCB3cmFwX2NtcGZ1bmMsCisgICAgICAgICAgICJ4Ll9fY21wX18oeSkgPD09PiBjbXAoeCx5KSIpLAorICAgIFRQU0xPVCgiX19yZXByX18iLCB0cF9yZXByLCBzbG90X3RwX3JlcHIsIHdyYXBfdW5hcnlmdW5jLAorICAgICAgICAgICAieC5fX3JlcHJfXygpIDw9PT4gcmVwcih4KSIpLAorICAgIFRQU0xPVCgiX19oYXNoX18iLCB0cF9oYXNoLCBzbG90X3RwX2hhc2gsIHdyYXBfaGFzaGZ1bmMsCisgICAgICAgICAgICJ4Ll9faGFzaF9fKCkgPD09PiBoYXNoKHgpIiksCisgICAgRkxTTE9UKCJfX2NhbGxfXyIsIHRwX2NhbGwsIHNsb3RfdHBfY2FsbCwgKHdyYXBwZXJmdW5jKXdyYXBfY2FsbCwKKyAgICAgICAgICAgInguX19jYWxsX18oLi4uKSA8PT0+IHgoLi4uKSIsIFB5V3JhcHBlckZsYWdfS0VZV09SRFMpLAorICAgIFRQU0xPVCgiX19zdHJfXyIsIHRwX3N0ciwgc2xvdF90cF9zdHIsIHdyYXBfdW5hcnlmdW5jLAorICAgICAgICAgICAieC5fX3N0cl9fKCkgPD09PiBzdHIoeCkiKSwKKyAgICBUUFNMT1QoIl9fZ2V0YXR0cmlidXRlX18iLCB0cF9nZXRhdHRybywgc2xvdF90cF9nZXRhdHRyX2hvb2ssCisgICAgICAgICAgIHdyYXBfYmluYXJ5ZnVuYywgInguX19nZXRhdHRyaWJ1dGVfXygnbmFtZScpIDw9PT4geC5uYW1lIiksCisgICAgVFBTTE9UKCJfX2dldGF0dHJfXyIsIHRwX2dldGF0dHJvLCBzbG90X3RwX2dldGF0dHJfaG9vaywgTlVMTCwgIiIpLAorICAgIFRQU0xPVCgiX19zZXRhdHRyX18iLCB0cF9zZXRhdHRybywgc2xvdF90cF9zZXRhdHRybywgd3JhcF9zZXRhdHRyLAorICAgICAgICAgICAieC5fX3NldGF0dHJfXygnbmFtZScsIHZhbHVlKSA8PT0+IHgubmFtZSA9IHZhbHVlIiksCisgICAgVFBTTE9UKCJfX2RlbGF0dHJfXyIsIHRwX3NldGF0dHJvLCBzbG90X3RwX3NldGF0dHJvLCB3cmFwX2RlbGF0dHIsCisgICAgICAgICAgICJ4Ll9fZGVsYXR0cl9fKCduYW1lJykgPD09PiBkZWwgeC5uYW1lIiksCisgICAgVFBTTE9UKCJfX2x0X18iLCB0cF9yaWNoY29tcGFyZSwgc2xvdF90cF9yaWNoY29tcGFyZSwgcmljaGNtcF9sdCwKKyAgICAgICAgICAgInguX19sdF9fKHkpIDw9PT4geDx5IiksCisgICAgVFBTTE9UKCJfX2xlX18iLCB0cF9yaWNoY29tcGFyZSwgc2xvdF90cF9yaWNoY29tcGFyZSwgcmljaGNtcF9sZSwKKyAgICAgICAgICAgInguX19sZV9fKHkpIDw9PT4geDw9eSIpLAorICAgIFRQU0xPVCgiX19lcV9fIiwgdHBfcmljaGNvbXBhcmUsIHNsb3RfdHBfcmljaGNvbXBhcmUsIHJpY2hjbXBfZXEsCisgICAgICAgICAgICJ4Ll9fZXFfXyh5KSA8PT0+IHg9PXkiKSwKKyAgICBUUFNMT1QoIl9fbmVfXyIsIHRwX3JpY2hjb21wYXJlLCBzbG90X3RwX3JpY2hjb21wYXJlLCByaWNoY21wX25lLAorICAgICAgICAgICAieC5fX25lX18oeSkgPD09PiB4IT15IiksCisgICAgVFBTTE9UKCJfX2d0X18iLCB0cF9yaWNoY29tcGFyZSwgc2xvdF90cF9yaWNoY29tcGFyZSwgcmljaGNtcF9ndCwKKyAgICAgICAgICAgInguX19ndF9fKHkpIDw9PT4geD55IiksCisgICAgVFBTTE9UKCJfX2dlX18iLCB0cF9yaWNoY29tcGFyZSwgc2xvdF90cF9yaWNoY29tcGFyZSwgcmljaGNtcF9nZSwKKyAgICAgICAgICAgInguX19nZV9fKHkpIDw9PT4geD49eSIpLAorICAgIFRQU0xPVCgiX19pdGVyX18iLCB0cF9pdGVyLCBzbG90X3RwX2l0ZXIsIHdyYXBfdW5hcnlmdW5jLAorICAgICAgICAgICAieC5fX2l0ZXJfXygpIDw9PT4gaXRlcih4KSIpLAorICAgIFRQU0xPVCgibmV4dCIsIHRwX2l0ZXJuZXh0LCBzbG90X3RwX2l0ZXJuZXh0LCB3cmFwX25leHQsCisgICAgICAgICAgICJ4Lm5leHQoKSAtPiB0aGUgbmV4dCB2YWx1ZSwgb3IgcmFpc2UgU3RvcEl0ZXJhdGlvbiIpLAorICAgIFRQU0xPVCgiX19nZXRfXyIsIHRwX2Rlc2NyX2dldCwgc2xvdF90cF9kZXNjcl9nZXQsIHdyYXBfZGVzY3JfZ2V0LAorICAgICAgICAgICAiZGVzY3IuX19nZXRfXyhvYmpbLCB0eXBlXSkgLT4gdmFsdWUiKSwKKyAgICBUUFNMT1QoIl9fc2V0X18iLCB0cF9kZXNjcl9zZXQsIHNsb3RfdHBfZGVzY3Jfc2V0LCB3cmFwX2Rlc2NyX3NldCwKKyAgICAgICAgICAgImRlc2NyLl9fc2V0X18ob2JqLCB2YWx1ZSkiKSwKKyAgICBUUFNMT1QoIl9fZGVsZXRlX18iLCB0cF9kZXNjcl9zZXQsIHNsb3RfdHBfZGVzY3Jfc2V0LAorICAgICAgICAgICB3cmFwX2Rlc2NyX2RlbGV0ZSwgImRlc2NyLl9fZGVsZXRlX18ob2JqKSIpLAorICAgIEZMU0xPVCgiX19pbml0X18iLCB0cF9pbml0LCBzbG90X3RwX2luaXQsICh3cmFwcGVyZnVuYyl3cmFwX2luaXQsCisgICAgICAgICAgICJ4Ll9faW5pdF9fKC4uLikgaW5pdGlhbGl6ZXMgeDsgIgorICAgICAgICAgICAic2VlIGhlbHAodHlwZSh4KSkgZm9yIHNpZ25hdHVyZSIsCisgICAgICAgICAgIFB5V3JhcHBlckZsYWdfS0VZV09SRFMpLAorICAgIFRQU0xPVCgiX19uZXdfXyIsIHRwX25ldywgc2xvdF90cF9uZXcsIE5VTEwsICIiKSwKKyAgICBUUFNMT1QoIl9fZGVsX18iLCB0cF9kZWwsIHNsb3RfdHBfZGVsLCBOVUxMLCAiIiksCiAgICAgQklOU0xPVCgiX19hZGRfXyIsIG5iX2FkZCwgc2xvdF9uYl9hZGQsCiAgICAgICAgICIrIiksCiAgICAgUkJJTlNMT1QoIl9fcmFkZF9fIiwgbmJfYWRkLCBzbG90X25iX2FkZCwKQEAgLTU5MzQsOCArNTk2Niw2IEBACiAgICAgICAgICAgICJvY3QoeCkiKSwKICAgICBVTlNMT1QoIl9faGV4X18iLCBuYl9oZXgsIHNsb3RfbmJfaGV4LCB3cmFwX3VuYXJ5ZnVuYywKICAgICAgICAgICAgImhleCh4KSIpLAotICAgIE5CU0xPVCgiX19pbmRleF9fIiwgbmJfaW5kZXgsIHNsb3RfbmJfaW5kZXgsIHdyYXBfdW5hcnlmdW5jLAotICAgICAgICAgICAieFt5OnpdIDw9PT4geFt5Ll9faW5kZXhfXygpOnouX19pbmRleF9fKCldIiksCiAgICAgSUJTTE9UKCJfX2lhZGRfXyIsIG5iX2lucGxhY2VfYWRkLCBzbG90X25iX2lucGxhY2VfYWRkLAogICAgICAgICAgICB3cmFwX2JpbmFyeWZ1bmMsICIrPSIpLAogICAgIElCU0xPVCgiX19pc3ViX18iLCBuYl9pbnBsYWNlX3N1YnRyYWN0LCBzbG90X25iX2lucGxhY2Vfc3VidHJhY3QsCkBAIC01OTY2LDU4ICs1OTk2LDU3IEBACiAgICAgICAgICAgIHNsb3RfbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGUsIHdyYXBfYmluYXJ5ZnVuYywgIi8vIiksCiAgICAgSUJTTE9UKCJfX2l0cnVlZGl2X18iLCBuYl9pbnBsYWNlX3RydWVfZGl2aWRlLAogICAgICAgICAgICBzbG90X25iX2lucGxhY2VfdHJ1ZV9kaXZpZGUsIHdyYXBfYmluYXJ5ZnVuYywgIi8iKSwKLQotICAgIFRQU0xPVCgiX19zdHJfXyIsIHRwX3N0ciwgc2xvdF90cF9zdHIsIHdyYXBfdW5hcnlmdW5jLAotICAgICAgICAgICAieC5fX3N0cl9fKCkgPD09PiBzdHIoeCkiKSwKLSAgICBUUFNMT1QoIl9fc3RyX18iLCB0cF9wcmludCwgTlVMTCwgTlVMTCwgIiIpLAotICAgIFRQU0xPVCgiX19yZXByX18iLCB0cF9yZXByLCBzbG90X3RwX3JlcHIsIHdyYXBfdW5hcnlmdW5jLAotICAgICAgICAgICAieC5fX3JlcHJfXygpIDw9PT4gcmVwcih4KSIpLAotICAgIFRQU0xPVCgiX19yZXByX18iLCB0cF9wcmludCwgTlVMTCwgTlVMTCwgIiIpLAotICAgIFRQU0xPVCgiX19jbXBfXyIsIHRwX2NvbXBhcmUsIF9QeU9iamVjdF9TbG90Q29tcGFyZSwgd3JhcF9jbXBmdW5jLAotICAgICAgICAgICAieC5fX2NtcF9fKHkpIDw9PT4gY21wKHgseSkiKSwKLSAgICBUUFNMT1QoIl9faGFzaF9fIiwgdHBfaGFzaCwgc2xvdF90cF9oYXNoLCB3cmFwX2hhc2hmdW5jLAotICAgICAgICAgICAieC5fX2hhc2hfXygpIDw9PT4gaGFzaCh4KSIpLAotICAgIEZMU0xPVCgiX19jYWxsX18iLCB0cF9jYWxsLCBzbG90X3RwX2NhbGwsICh3cmFwcGVyZnVuYyl3cmFwX2NhbGwsCi0gICAgICAgICAgICJ4Ll9fY2FsbF9fKC4uLikgPD09PiB4KC4uLikiLCBQeVdyYXBwZXJGbGFnX0tFWVdPUkRTKSwKLSAgICBUUFNMT1QoIl9fZ2V0YXR0cmlidXRlX18iLCB0cF9nZXRhdHRybywgc2xvdF90cF9nZXRhdHRyX2hvb2ssCi0gICAgICAgICAgIHdyYXBfYmluYXJ5ZnVuYywgInguX19nZXRhdHRyaWJ1dGVfXygnbmFtZScpIDw9PT4geC5uYW1lIiksCi0gICAgVFBTTE9UKCJfX2dldGF0dHJpYnV0ZV9fIiwgdHBfZ2V0YXR0ciwgTlVMTCwgTlVMTCwgIiIpLAotICAgIFRQU0xPVCgiX19nZXRhdHRyX18iLCB0cF9nZXRhdHRybywgc2xvdF90cF9nZXRhdHRyX2hvb2ssIE5VTEwsICIiKSwKLSAgICBUUFNMT1QoIl9fZ2V0YXR0cl9fIiwgdHBfZ2V0YXR0ciwgTlVMTCwgTlVMTCwgIiIpLAotICAgIFRQU0xPVCgiX19zZXRhdHRyX18iLCB0cF9zZXRhdHRybywgc2xvdF90cF9zZXRhdHRybywgd3JhcF9zZXRhdHRyLAotICAgICAgICAgICAieC5fX3NldGF0dHJfXygnbmFtZScsIHZhbHVlKSA8PT0+IHgubmFtZSA9IHZhbHVlIiksCi0gICAgVFBTTE9UKCJfX3NldGF0dHJfXyIsIHRwX3NldGF0dHIsIE5VTEwsIE5VTEwsICIiKSwKLSAgICBUUFNMT1QoIl9fZGVsYXR0cl9fIiwgdHBfc2V0YXR0cm8sIHNsb3RfdHBfc2V0YXR0cm8sIHdyYXBfZGVsYXR0ciwKLSAgICAgICAgICAgInguX19kZWxhdHRyX18oJ25hbWUnKSA8PT0+IGRlbCB4Lm5hbWUiKSwKLSAgICBUUFNMT1QoIl9fZGVsYXR0cl9fIiwgdHBfc2V0YXR0ciwgTlVMTCwgTlVMTCwgIiIpLAotICAgIFRQU0xPVCgiX19sdF9fIiwgdHBfcmljaGNvbXBhcmUsIHNsb3RfdHBfcmljaGNvbXBhcmUsIHJpY2hjbXBfbHQsCi0gICAgICAgICAgICJ4Ll9fbHRfXyh5KSA8PT0+IHg8eSIpLAotICAgIFRQU0xPVCgiX19sZV9fIiwgdHBfcmljaGNvbXBhcmUsIHNsb3RfdHBfcmljaGNvbXBhcmUsIHJpY2hjbXBfbGUsCi0gICAgICAgICAgICJ4Ll9fbGVfXyh5KSA8PT0+IHg8PXkiKSwKLSAgICBUUFNMT1QoIl9fZXFfXyIsIHRwX3JpY2hjb21wYXJlLCBzbG90X3RwX3JpY2hjb21wYXJlLCByaWNoY21wX2VxLAotICAgICAgICAgICAieC5fX2VxX18oeSkgPD09PiB4PT15IiksCi0gICAgVFBTTE9UKCJfX25lX18iLCB0cF9yaWNoY29tcGFyZSwgc2xvdF90cF9yaWNoY29tcGFyZSwgcmljaGNtcF9uZSwKLSAgICAgICAgICAgInguX19uZV9fKHkpIDw9PT4geCE9eSIpLAotICAgIFRQU0xPVCgiX19ndF9fIiwgdHBfcmljaGNvbXBhcmUsIHNsb3RfdHBfcmljaGNvbXBhcmUsIHJpY2hjbXBfZ3QsCi0gICAgICAgICAgICJ4Ll9fZ3RfXyh5KSA8PT0+IHg+eSIpLAotICAgIFRQU0xPVCgiX19nZV9fIiwgdHBfcmljaGNvbXBhcmUsIHNsb3RfdHBfcmljaGNvbXBhcmUsIHJpY2hjbXBfZ2UsCi0gICAgICAgICAgICJ4Ll9fZ2VfXyh5KSA8PT0+IHg+PXkiKSwKLSAgICBUUFNMT1QoIl9faXRlcl9fIiwgdHBfaXRlciwgc2xvdF90cF9pdGVyLCB3cmFwX3VuYXJ5ZnVuYywKLSAgICAgICAgICAgInguX19pdGVyX18oKSA8PT0+IGl0ZXIoeCkiKSwKLSAgICBUUFNMT1QoIm5leHQiLCB0cF9pdGVybmV4dCwgc2xvdF90cF9pdGVybmV4dCwgd3JhcF9uZXh0LAotICAgICAgICAgICAieC5uZXh0KCkgLT4gdGhlIG5leHQgdmFsdWUsIG9yIHJhaXNlIFN0b3BJdGVyYXRpb24iKSwKLSAgICBUUFNMT1QoIl9fZ2V0X18iLCB0cF9kZXNjcl9nZXQsIHNsb3RfdHBfZGVzY3JfZ2V0LCB3cmFwX2Rlc2NyX2dldCwKLSAgICAgICAgICAgImRlc2NyLl9fZ2V0X18ob2JqWywgdHlwZV0pIC0+IHZhbHVlIiksCi0gICAgVFBTTE9UKCJfX3NldF9fIiwgdHBfZGVzY3Jfc2V0LCBzbG90X3RwX2Rlc2NyX3NldCwgd3JhcF9kZXNjcl9zZXQsCi0gICAgICAgICAgICJkZXNjci5fX3NldF9fKG9iaiwgdmFsdWUpIiksCi0gICAgVFBTTE9UKCJfX2RlbGV0ZV9fIiwgdHBfZGVzY3Jfc2V0LCBzbG90X3RwX2Rlc2NyX3NldCwKLSAgICAgICAgICAgd3JhcF9kZXNjcl9kZWxldGUsICJkZXNjci5fX2RlbGV0ZV9fKG9iaikiKSwKLSAgICBGTFNMT1QoIl9faW5pdF9fIiwgdHBfaW5pdCwgc2xvdF90cF9pbml0LCAod3JhcHBlcmZ1bmMpd3JhcF9pbml0LAotICAgICAgICAgICAieC5fX2luaXRfXyguLi4pIGluaXRpYWxpemVzIHg7ICIKLSAgICAgICAgICAgInNlZSBoZWxwKHR5cGUoeCkpIGZvciBzaWduYXR1cmUiLAotICAgICAgICAgICBQeVdyYXBwZXJGbGFnX0tFWVdPUkRTKSwKLSAgICBUUFNMT1QoIl9fbmV3X18iLCB0cF9uZXcsIHNsb3RfdHBfbmV3LCBOVUxMLCAiIiksCi0gICAgVFBTTE9UKCJfX2RlbF9fIiwgdHBfZGVsLCBzbG90X3RwX2RlbCwgTlVMTCwgIiIpLAorICAgIE5CU0xPVCgiX19pbmRleF9fIiwgbmJfaW5kZXgsIHNsb3RfbmJfaW5kZXgsIHdyYXBfdW5hcnlmdW5jLAorICAgICAgICAgICAieFt5OnpdIDw9PT4geFt5Ll9faW5kZXhfXygpOnouX19pbmRleF9fKCldIiksCisgICAgTVBTTE9UKCJfX2xlbl9fIiwgbXBfbGVuZ3RoLCBzbG90X21wX2xlbmd0aCwgd3JhcF9sZW5mdW5jLAorICAgICAgICAgICAieC5fX2xlbl9fKCkgPD09PiBsZW4oeCkiKSwKKyAgICBNUFNMT1QoIl9fZ2V0aXRlbV9fIiwgbXBfc3Vic2NyaXB0LCBzbG90X21wX3N1YnNjcmlwdCwKKyAgICAgICAgICAgd3JhcF9iaW5hcnlmdW5jLAorICAgICAgICAgICAieC5fX2dldGl0ZW1fXyh5KSA8PT0+IHhbeV0iKSwKKyAgICBNUFNMT1QoIl9fc2V0aXRlbV9fIiwgbXBfYXNzX3N1YnNjcmlwdCwgc2xvdF9tcF9hc3Nfc3Vic2NyaXB0LAorICAgICAgICAgICB3cmFwX29iam9iamFyZ3Byb2MsCisgICAgICAgICAgICJ4Ll9fc2V0aXRlbV9fKGksIHkpIDw9PT4geFtpXT15IiksCisgICAgTVBTTE9UKCJfX2RlbGl0ZW1fXyIsIG1wX2Fzc19zdWJzY3JpcHQsIHNsb3RfbXBfYXNzX3N1YnNjcmlwdCwKKyAgICAgICAgICAgd3JhcF9kZWxpdGVtLAorICAgICAgICAgICAieC5fX2RlbGl0ZW1fXyh5KSA8PT0+IGRlbCB4W3ldIiksCisgICAgU1FTTE9UKCJfX2xlbl9fIiwgc3FfbGVuZ3RoLCBzbG90X3NxX2xlbmd0aCwgd3JhcF9sZW5mdW5jLAorICAgICAgICAgICAieC5fX2xlbl9fKCkgPD09PiBsZW4oeCkiKSwKKyAgICAvKiBIZWFwIHR5cGVzIGRlZmluaW5nIF9fYWRkX18vX19tdWxfXyBoYXZlIHNxX2NvbmNhdC9zcV9yZXBlYXQgPT0gTlVMTC4KKyAgICAgICBUaGUgbG9naWMgaW4gYWJzdHJhY3QuYyBhbHdheXMgZmFsbHMgYmFjayB0byBuYl9hZGQvbmJfbXVsdGlwbHkgaW4KKyAgICAgICB0aGlzIGNhc2UuICBEZWZpbmluZyBib3RoIHRoZSBuYl8qIGFuZCB0aGUgc3FfKiBzbG90cyB0byBjYWxsIHRoZQorICAgICAgIHVzZXItZGVmaW5lZCBtZXRob2RzIGhhcyB1bmV4cGVjdGVkIHNpZGUtZWZmZWN0cywgYXMgc2hvd24gYnkKKyAgICAgICB0ZXN0X2Rlc2NyLm5vdGltcGxlbWVudGVkKCkgKi8KKyAgICBTUVNMT1QoIl9fYWRkX18iLCBzcV9jb25jYXQsIE5VTEwsIHdyYXBfYmluYXJ5ZnVuYywKKyAgICAgICJ4Ll9fYWRkX18oeSkgPD09PiB4K3kiKSwKKyAgICBTUVNMT1QoIl9fbXVsX18iLCBzcV9yZXBlYXQsIE5VTEwsIHdyYXBfaW5kZXhhcmdmdW5jLAorICAgICAgInguX19tdWxfXyhuKSA8PT0+IHgqbiIpLAorICAgIFNRU0xPVCgiX19ybXVsX18iLCBzcV9yZXBlYXQsIE5VTEwsIHdyYXBfaW5kZXhhcmdmdW5jLAorICAgICAgInguX19ybXVsX18obikgPD09PiBuKngiKSwKKyAgICBTUVNMT1QoIl9fZ2V0aXRlbV9fIiwgc3FfaXRlbSwgc2xvdF9zcV9pdGVtLCB3cmFwX3NxX2l0ZW0sCisgICAgICAgICAgICJ4Ll9fZ2V0aXRlbV9fKHkpIDw9PT4geFt5XSIpLAorICAgIFNRU0xPVCgiX19nZXRzbGljZV9fIiwgc3Ffc2xpY2UsIHNsb3Rfc3Ffc2xpY2UsIHdyYXBfc3NpemVzc2l6ZWFyZ2Z1bmMsCisgICAgICAgICAgICJ4Ll9fZ2V0c2xpY2VfXyhpLCBqKSA8PT0+IHhbaTpqXVxuXAorICAgICAgICAgICBcblwKKyAgICAgICAgICAgVXNlIG9mIG5lZ2F0aXZlIGluZGljZXMgaXMgbm90IHN1cHBvcnRlZC4iKSwKKyAgICBTUVNMT1QoIl9fc2V0aXRlbV9fIiwgc3FfYXNzX2l0ZW0sIHNsb3Rfc3FfYXNzX2l0ZW0sIHdyYXBfc3Ffc2V0aXRlbSwKKyAgICAgICAgICAgInguX19zZXRpdGVtX18oaSwgeSkgPD09PiB4W2ldPXkiKSwKKyAgICBTUVNMT1QoIl9fZGVsaXRlbV9fIiwgc3FfYXNzX2l0ZW0sIHNsb3Rfc3FfYXNzX2l0ZW0sIHdyYXBfc3FfZGVsaXRlbSwKKyAgICAgICAgICAgInguX19kZWxpdGVtX18oeSkgPD09PiBkZWwgeFt5XSIpLAorICAgIFNRU0xPVCgiX19zZXRzbGljZV9fIiwgc3FfYXNzX3NsaWNlLCBzbG90X3NxX2Fzc19zbGljZSwKKyAgICAgICAgICAgd3JhcF9zc2l6ZXNzaXplb2JqYXJncHJvYywKKyAgICAgICAgICAgInguX19zZXRzbGljZV9fKGksIGosIHkpIDw9PT4geFtpOmpdPXlcblwKKyAgICAgICAgICAgXG5cCisgICAgICAgICAgIFVzZSAgb2YgbmVnYXRpdmUgaW5kaWNlcyBpcyBub3Qgc3VwcG9ydGVkLiIpLAorICAgIFNRU0xPVCgiX19kZWxzbGljZV9fIiwgc3FfYXNzX3NsaWNlLCBzbG90X3NxX2Fzc19zbGljZSwgd3JhcF9kZWxzbGljZSwKKyAgICAgICAgICAgInguX19kZWxzbGljZV9fKGksIGopIDw9PT4gZGVsIHhbaTpqXVxuXAorICAgICAgICAgICBcblwKKyAgICAgICAgICAgVXNlIG9mIG5lZ2F0aXZlIGluZGljZXMgaXMgbm90IHN1cHBvcnRlZC4iKSwKKyAgICBTUVNMT1QoIl9fY29udGFpbnNfXyIsIHNxX2NvbnRhaW5zLCBzbG90X3NxX2NvbnRhaW5zLCB3cmFwX29iam9ianByb2MsCisgICAgICAgICAgICJ4Ll9fY29udGFpbnNfXyh5KSA8PT0+IHkgaW4geCIpLAorICAgIFNRU0xPVCgiX19pYWRkX18iLCBzcV9pbnBsYWNlX2NvbmNhdCwgTlVMTCwKKyAgICAgIHdyYXBfYmluYXJ5ZnVuYywgInguX19pYWRkX18oeSkgPD09PiB4Kz15IiksCisgICAgU1FTTE9UKCJfX2ltdWxfXyIsIHNxX2lucGxhY2VfcmVwZWF0LCBOVUxMLAorICAgICAgd3JhcF9pbmRleGFyZ2Z1bmMsICJ4Ll9faW11bF9fKHkpIDw9PT4geCo9eSIpLAogICAgIHtOVUxMfQogfTsKIApAQCAtNjEyOSw3ICs2MTU4LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIGlmIChQeV9UWVBFKGRlc2NyKSA9PSAmUHlXcmFwcGVyRGVzY3JfVHlwZSkgeworICAgICAgICBpZiAoUHlfVFlQRShkZXNjcikgPT0gJlB5V3JhcHBlckRlc2NyX1R5cGUgJiYKKyAgICAgICAgICAgICgoUHlXcmFwcGVyRGVzY3JPYmplY3QgKilkZXNjciktPmRfYmFzZS0+bmFtZV9zdHJvYmogPT0gcC0+bmFtZV9zdHJvYmopIHsKICAgICAgICAgICAgIHZvaWQgKip0cHRyID0gcmVzb2x2ZV9zbG90ZHVwcyh0eXBlLCBwLT5uYW1lX3N0cm9iaik7CiAgICAgICAgICAgICBpZiAodHB0ciA9PSBOVUxMIHx8IHRwdHIgPT0gcHRyKQogICAgICAgICAgICAgICAgIGdlbmVyaWMgPSBwLT5mdW5jdGlvbjsKQEAgLTYxOTcsMjEgKzYyMjcsNiBAQAogICAgIHJldHVybiAwOwogfQogCi0vKiBDb21wYXJpc29uIGZ1bmN0aW9uIGZvciBxc29ydCgpIHRvIGNvbXBhcmUgc2xvdGRlZnMgYnkgdGhlaXIgb2Zmc2V0LCBhbmQKLSAgIGZvciBlcXVhbCBvZmZzZXQgYnkgdGhlaXIgYWRkcmVzcyAodG8gZm9yY2UgYSBzdGFibGUgc29ydCkuICovCi1zdGF0aWMgaW50Ci1zbG90ZGVmX2NtcChjb25zdCB2b2lkICphYSwgY29uc3Qgdm9pZCAqYmIpCi17Ci0gICAgY29uc3Qgc2xvdGRlZiAqYSA9IChjb25zdCBzbG90ZGVmICopYWEsICpiID0gKGNvbnN0IHNsb3RkZWYgKiliYjsKLSAgICBpbnQgYyA9IGEtPm9mZnNldCAtIGItPm9mZnNldDsKLSAgICBpZiAoYyAhPSAwKQotICAgICAgICByZXR1cm4gYzsKLSAgICBlbHNlCi0gICAgICAgIC8qIENhbm5vdCB1c2UgYS1iLCBhcyB0aGlzIGdpdmVzIG9mZl90LAotICAgICAgICAgICB3aGljaCBtYXkgbG9zZSBwcmVjaXNpb24gd2hlbiBjb252ZXJ0ZWQgdG8gaW50LiAqLwotICAgICAgICByZXR1cm4gKGEgPiBiKSA/IDEgOiAoYSA8IGIpID8gLTEgOiAwOwotfQotCiAvKiBJbml0aWFsaXplIHRoZSBzbG90ZGVmcyB0YWJsZSBieSBhZGRpbmcgaW50ZXJuZWQgc3RyaW5nIG9iamVjdHMgZm9yIHRoZQogICAgbmFtZXMgYW5kIHNvcnRpbmcgdGhlIGVudHJpZXMuICovCiBzdGF0aWMgdm9pZApAQCAtNjIyMywxMiArNjIzOCwxMiBAQAogICAgIGlmIChpbml0aWFsaXplZCkKICAgICAgICAgcmV0dXJuOwogICAgIGZvciAocCA9IHNsb3RkZWZzOyBwLT5uYW1lOyBwKyspIHsKKyAgICAgICAgLyogU2xvdHMgbXVzdCBiZSBvcmRlcmVkIGJ5IHRoZWlyIG9mZnNldCBpbiB0aGUgUHlIZWFwVHlwZU9iamVjdC4gKi8KKyAgICAgICAgYXNzZXJ0KCFwWzFdLm5hbWUgfHwgcC0+b2Zmc2V0IDw9IHBbMV0ub2Zmc2V0KTsKICAgICAgICAgcC0+bmFtZV9zdHJvYmogPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKHAtPm5hbWUpOwogICAgICAgICBpZiAoIXAtPm5hbWVfc3Ryb2JqKQogICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiT3V0IG9mIG1lbW9yeSBpbnRlcm5pbmcgc2xvdGRlZiBuYW1lcyIpOwogICAgIH0KLSAgICBxc29ydCgodm9pZCAqKXNsb3RkZWZzLCAoc2l6ZV90KShwLXNsb3RkZWZzKSwgc2l6ZW9mKHNsb3RkZWYpLAotICAgICAgICAgIHNsb3RkZWZfY21wKTsKICAgICBpbml0aWFsaXplZCA9IDE7CiB9CiAKQEAgLTY2NTEsOCArNjY2Niw4IEBACiB9CiAKIFB5RG9jX1NUUlZBUihzdXBlcl9kb2MsCi0ic3VwZXIodHlwZSkgLT4gdW5ib3VuZCBzdXBlciBvYmplY3RcbiIKICJzdXBlcih0eXBlLCBvYmopIC0+IGJvdW5kIHN1cGVyIG9iamVjdDsgcmVxdWlyZXMgaXNpbnN0YW5jZShvYmosIHR5cGUpXG4iCisic3VwZXIodHlwZSkgLT4gdW5ib3VuZCBzdXBlciBvYmplY3RcbiIKICJzdXBlcih0eXBlLCB0eXBlMikgLT4gYm91bmQgc3VwZXIgb2JqZWN0OyByZXF1aXJlcyBpc3N1YmNsYXNzKHR5cGUyLCB0eXBlKVxuIgogIlR5cGljYWwgdXNlIHRvIGNhbGwgYSBjb29wZXJhdGl2ZSBzdXBlcmNsYXNzIG1ldGhvZDpcbiIKICJjbGFzcyBDKEIpOlxuIgpkaWZmIC0tZ2l0IGEvT2JqZWN0cy91bmljb2Rlb2JqZWN0LmMgYi9PYmplY3RzL3VuaWNvZGVvYmplY3QuYwppbmRleCA4MjI1ZTgyLi5mNTJlZTkyIDEwMDY0NAotLS0gYS9PYmplY3RzL3VuaWNvZGVvYmplY3QuYworKysgYi9PYmplY3RzL3VuaWNvZGVvYmplY3QuYwpAQCAtODIsOCArODIsOSBAQAogCiAvKiAtLS0gR2xvYmFscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotICAgVGhlIGdsb2JhbHMgYXJlIGluaXRpYWxpemVkIGJ5IHRoZSBfUHlVbmljb2RlX0luaXQoKSBBUEkgYW5kIHNob3VsZAotICAgbm90IGJlIHVzZWQgYmVmb3JlIGNhbGxpbmcgdGhhdCBBUEkuCitOT1RFOiBJbiB0aGUgaW50ZXJwcmV0ZXIncyBpbml0aWFsaXphdGlvbiBwaGFzZSwgc29tZSBnbG9iYWxzIGFyZSBjdXJyZW50bHkKKyAgICAgIGluaXRpYWxpemVkIGR5bmFtaWNhbGx5IGFzIG5lZWRlZC4gSW4gdGhlIHByb2Nlc3MgVW5pY29kZSBvYmplY3RzIG1heQorICAgICAgYmUgY3JlYXRlZCBiZWZvcmUgdGhlIFVuaWNvZGUgdHlwZSBpcyByZWFkeS4KIAogKi8KIApAQCAtOTMsMTUgKzk0LDI3IEBACiAjZW5kaWYKIAogLyogRnJlZSBsaXN0IGZvciBVbmljb2RlIG9iamVjdHMgKi8KLXN0YXRpYyBQeVVuaWNvZGVPYmplY3QgKmZyZWVfbGlzdDsKLXN0YXRpYyBpbnQgbnVtZnJlZTsKK3N0YXRpYyBQeVVuaWNvZGVPYmplY3QgKmZyZWVfbGlzdCA9IE5VTEw7CitzdGF0aWMgaW50IG51bWZyZWUgPSAwOwogCiAvKiBUaGUgZW1wdHkgVW5pY29kZSBvYmplY3QgaXMgc2hhcmVkIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuICovCi1zdGF0aWMgUHlVbmljb2RlT2JqZWN0ICp1bmljb2RlX2VtcHR5Oworc3RhdGljIFB5VW5pY29kZU9iamVjdCAqdW5pY29kZV9lbXB0eSA9IE5VTEw7CisKKyNkZWZpbmUgX1B5X1JFVFVSTl9VTklDT0RFX0VNUFRZKCkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICh1bmljb2RlX2VtcHR5ICE9IE5VTEwpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFB5X0lOQ1JFRih1bmljb2RlX2VtcHR5KTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1bmljb2RlX2VtcHR5ID0gX1B5VW5pY29kZV9OZXcoMCk7ICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICh1bmljb2RlX2VtcHR5ICE9IE5VTEwpICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih1bmljb2RlX2VtcHR5KTsgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXVuaWNvZGVfZW1wdHk7ICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCiAKIC8qIFNpbmdsZSBjaGFyYWN0ZXIgVW5pY29kZSBzdHJpbmdzIGluIHRoZSBMYXRpbi0xIHJhbmdlIGFyZSBiZWluZwogICAgc2hhcmVkIGFzIHdlbGwuICovCi1zdGF0aWMgUHlVbmljb2RlT2JqZWN0ICp1bmljb2RlX2xhdGluMVsyNTZdOworc3RhdGljIFB5VW5pY29kZU9iamVjdCAqdW5pY29kZV9sYXRpbjFbMjU2XSA9IHtOVUxMfTsKIAogLyogRGVmYXVsdCBlbmNvZGluZyB0byB1c2UgYW5kIGFzc3VtZSB3aGVuIE5VTEwgaXMgcGFzc2VkIGFzIGVuY29kaW5nCiAgICBwYXJhbWV0ZXI7IGl0IGlzIGluaXRpYWxpemVkIGJ5IF9QeVVuaWNvZGVfSW5pdCgpLgpAQCAtMTEwLDcgKzEyMyw3IEBACiAgICBQeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nKCkgQVBJcyB0byBhY2Nlc3MgdGhpcyBnbG9iYWwuCiAKICovCi1zdGF0aWMgY2hhciB1bmljb2RlX2RlZmF1bHRfZW5jb2RpbmdbMTAwXTsKK3N0YXRpYyBjaGFyIHVuaWNvZGVfZGVmYXVsdF9lbmNvZGluZ1sxMDAgKyAxXSA9ICJhc2NpaSI7CiAKIC8qIEZhc3QgZGV0ZWN0aW9uIG9mIHRoZSBtb3N0IGZyZXF1ZW50IHdoaXRlc3BhY2UgY2hhcmFjdGVycyAqLwogY29uc3QgdW5zaWduZWQgY2hhciBfUHlfYXNjaWlfd2hpdGVzcGFjZVtdID0gewpAQCAtMjA0LDcgKzIxNyw3IEBACiAKICNkZWZpbmUgQkxPT01fTUFTSyB1bnNpZ25lZCBsb25nCiAKLXN0YXRpYyBCTE9PTV9NQVNLIGJsb29tX2xpbmVicmVhazsKK3N0YXRpYyBCTE9PTV9NQVNLIGJsb29tX2xpbmVicmVhayA9IH4oQkxPT01fTUFTSykwOwogCiAjZGVmaW5lIEJMT09NX0FERChtYXNrLCBjaCkgKChtYXNrIHw9ICgxVUwgPDwgKChjaCkgJiAoQkxPT01fV0lEVEggLSAxKSkpKSkKICNkZWZpbmUgQkxPT00obWFzaywgY2gpICAgICAoKG1hc2sgJiAgKDFVTCA8PCAoKGNoKSAmIChCTE9PTV9XSURUSCAtIDEpKSkpKQpAQCAtNDQ4LDEwICs0NjEsOCBAQAogICAgIGlmICh1ICE9IE5VTEwpIHsKIAogICAgICAgICAvKiBPcHRpbWl6YXRpb24gZm9yIGVtcHR5IHN0cmluZ3MgKi8KLSAgICAgICAgaWYgKHNpemUgPT0gMCAmJiB1bmljb2RlX2VtcHR5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIFB5X0lOQ1JFRih1bmljb2RlX2VtcHR5KTsKLSAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKil1bmljb2RlX2VtcHR5OwotICAgICAgICB9CisgICAgICAgIGlmIChzaXplID09IDApCisgICAgICAgICAgICBfUHlfUkVUVVJOX1VOSUNPREVfRU1QVFkoKTsKIAogICAgICAgICAvKiBTaW5nbGUgY2hhcmFjdGVyIFVuaWNvZGUgb2JqZWN0cyBpbiB0aGUgTGF0aW4tMSByYW5nZSBhcmUKICAgICAgICAgICAgc2hhcmVkIHdoZW4gdXNpbmcgdGhpcyBjb25zdHJ1Y3RvciAqLwpAQCAtNDk3LDEwICs1MDgsOCBAQAogICAgIGlmICh1ICE9IE5VTEwpIHsKIAogICAgICAgICAvKiBPcHRpbWl6YXRpb24gZm9yIGVtcHR5IHN0cmluZ3MgKi8KLSAgICAgICAgaWYgKHNpemUgPT0gMCAmJiB1bmljb2RlX2VtcHR5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIFB5X0lOQ1JFRih1bmljb2RlX2VtcHR5KTsKLSAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKil1bmljb2RlX2VtcHR5OwotICAgICAgICB9CisgICAgICAgIGlmIChzaXplID09IDApCisgICAgICAgICAgICBfUHlfUkVUVVJOX1VOSUNPREVfRU1QVFkoKTsKIAogICAgICAgICAvKiBTaW5nbGUgY2hhcmFjdGVycyBhcmUgc2hhcmVkIHdoZW4gdXNpbmcgdGhpcyBjb25zdHJ1Y3Rvci4KICAgICAgICAgICAgUmVzdHJpY3QgdG8gQVNDSUksIHNpbmNlIHRoZSBpbnB1dCBtdXN0IGJlIFVURi04LiAqLwpAQCAtNTM4LDYgKzU0NywzNyBAQAogICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVN0cmluZ0FuZFNpemUodSwgc2l6ZSk7CiB9CiAKKy8qIF9QeV9VTklDT0RFX05FWFQgaXMgYSBwcml2YXRlIG1hY3JvIHVzZWQgdG8gcmV0cmlldmUgdGhlIGNoYXJhY3RlciBwb2ludGVkCisgKiBieSAncHRyJywgcG9zc2libHkgY29tYmluaW5nIHN1cnJvZ2F0ZSBwYWlycyBvbiBuYXJyb3cgYnVpbGRzLgorICogJ3B0cicgYW5kICdlbmQnIG11c3QgYmUgUHlfVU5JQ09ERSosIHdpdGggJ3B0cicgcG9pbnRpbmcgYXQgdGhlIGNoYXJhY3RlcgorICogdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQgYW5kICdlbmQnIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKyAqICgnZW5kJyBpcyB1c2VkIG9uIG5hcnJvdyBidWlsZHMgdG8gZGV0ZWN0IGEgbG9uZSBzdXJyb2dhdGUgYXQgdGhlCisgKiBlbmQgb2YgdGhlIGJ1ZmZlciB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCB1bmNoYW5nZWQuKQorICogVGhlIHB0ciBhbmQgZW5kIGFyZ3VtZW50cyBzaG91bGQgYmUgc2lkZS1lZmZlY3QgZnJlZSBhbmQgcHRyIG11c3QgYW4gbHZhbHVlLgorICogVGhlIHR5cGUgb2YgdGhlIHJldHVybmVkIGNoYXIgaXMgYWx3YXlzIFB5X1VDUzQuCisgKgorICogTm90ZTogdGhlIG1hY3JvIGFkdmFuY2VzIHB0ciB0byBuZXh0IGNoYXIsIHNvIGl0IG1pZ2h0IGhhdmUgc2lkZS1lZmZlY3RzCisgKiAgICAgICAoZXNwZWNpYWxseSBpZiB1c2VkIHdpdGggb3RoZXIgbWFjcm9zKS4KKyAqLworCisvKiBoZWxwZXIgbWFjcm9zIHVzZWQgYnkgX1B5X1VOSUNPREVfTkVYVCAqLworI2RlZmluZSBfUHlfVU5JQ09ERV9JU19ISUdIX1NVUlJPR0FURShjaCkgKDB4RDgwMCA8PSBjaCAmJiBjaCA8PSAweERCRkYpCisjZGVmaW5lIF9QeV9VTklDT0RFX0lTX0xPV19TVVJST0dBVEUoY2gpICgweERDMDAgPD0gY2ggJiYgY2ggPD0gMHhERkZGKQorLyogSm9pbiB0d28gc3Vycm9nYXRlIGNoYXJhY3RlcnMgYW5kIHJldHVybiBhIHNpbmdsZSBQeV9VQ1M0IHZhbHVlLiAqLworI2RlZmluZSBfUHlfVU5JQ09ERV9KT0lOX1NVUlJPR0FURVMoaGlnaCwgbG93KSAgXAorICAgICgoKCgoUHlfVUNTNCkoaGlnaCkgJiAweDAzRkYpIDw8IDEwKSB8ICAgICAgXAorICAgICAgKChQeV9VQ1M0KShsb3cpICYgMHgwM0ZGKSkgKyAweDEwMDAwKQorCisjaWZkZWYgUHlfVU5JQ09ERV9XSURFCisjZGVmaW5lIF9QeV9VTklDT0RFX05FWFQocHRyLCBlbmQpICoocHRyKSsrCisjZWxzZQorI2RlZmluZSBfUHlfVU5JQ09ERV9ORVhUKHB0ciwgZW5kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKChfUHlfVU5JQ09ERV9JU19ISUdIX1NVUlJPR0FURSgqKHB0cikpICYmIChwdHIpIDwgKGVuZCkpICYmICAgICAgXAorICAgICAgICBfUHlfVU5JQ09ERV9JU19MT1dfU1VSUk9HQVRFKChwdHIpWzFdKSkgPyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICgocHRyKSArPSAyLF9QeV9VTklDT0RFX0pPSU5fU1VSUk9HQVRFUygocHRyKVstMl0sIChwdHIpWy0xXSkpIDogXAorICAgICAgIChQeV9VQ1M0KSoocHRyKSsrKQorI2VuZGlmCisKICNpZmRlZiBIQVZFX1dDSEFSX0gKIAogI2lmIChQeV9VTklDT0RFX1NJWkUgPT0gMikgJiYgZGVmaW5lZChTSVpFT0ZfV0NIQVJfVCkgJiYgKFNJWkVPRl9XQ0hBUl9UID09IDQpCkBAIC02NTAsNyArNjkwLDEyIEBACiAgICAgKmZtdCA9ICdcMCc7CiB9CiAKLSNkZWZpbmUgYXBwZW5kc3RyaW5nKHN0cmluZykge2ZvciAoY29weSA9IHN0cmluZzsqY29weTspICpzKysgPSAqY29weSsrO30KKyNkZWZpbmUgYXBwZW5kc3RyaW5nKHN0cmluZykgXAorICAgIGRvIHsgXAorICAgICAgICBmb3IgKGNvcHkgPSBzdHJpbmc7KmNvcHk7IGNvcHkrKykgeyBcCisgICAgICAgICAgICAqcysrID0gKHVuc2lnbmVkIGNoYXIpKmNvcHk7IFwKKyAgICAgICAgfSBcCisgICAgfSB3aGlsZSAoMCkKIAogUHlPYmplY3QgKgogUHlVbmljb2RlX0Zyb21Gb3JtYXRWKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCB2YXJncykKQEAgLTczMSw4ICs3NzYsMjUgQEAKIAogICAgICAgICAgICAgc3dpdGNoICgqZikgewogICAgICAgICAgICAgY2FzZSAnYyc6Ci0gICAgICAgICAgICAgICAgKHZvaWQpdmFfYXJnKGNvdW50LCBpbnQpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBvcmRpbmFsID0gdmFfYXJnKGNvdW50LCBpbnQpOworI2lmZGVmIFB5X1VOSUNPREVfV0lERQorICAgICAgICAgICAgICAgIGlmIChvcmRpbmFsIDwgMCB8fCBvcmRpbmFsID4gMHgxMGZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWMgYXJnIG5vdCBpbiByYW5nZSgweDExMDAwMCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIih3aWRlIFB5dGhvbiBidWlsZCkiKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgaWYgKG9yZGluYWwgPCAwIHx8IG9yZGluYWwgPiAweGZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWMgYXJnIG5vdCBpbiByYW5nZSgweDEwMDAwKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKG5hcnJvdyBQeXRob24gYnVpbGQpIik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKICAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2guLi4gKi8KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhc2UgJyUnOgogICAgICAgICAgICAgICAgIG4rKzsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTc4OCw3ICs4NTAsNyBAQAogICAgICAgICAgICAgICAgIHN0ciA9IFB5T2JqZWN0X1N0cihvYmopOwogICAgICAgICAgICAgICAgIGlmICghc3RyKQogICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgICAgICAgICAgbiArPSBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKTsKKyAgICAgICAgICAgICAgICBuICs9IFB5U3RyaW5nX0dFVF9TSVpFKHN0cik7CiAgICAgICAgICAgICAgICAgLyogUmVtZW1iZXIgdGhlIHN0ciBhbmQgc3dpdGNoIHRvIHRoZSBuZXh0IHNsb3QgKi8KICAgICAgICAgICAgICAgICAqY2FsbHJlc3VsdCsrID0gc3RyOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtOTQ5LDE1ICsxMDExLDEwIEBACiAgICAgICAgICAgICBjYXNlICdTJzoKICAgICAgICAgICAgIGNhc2UgJ1InOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFB5X1VOSUNPREUgKnVjb3B5OwotICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgdXNpemU7Ci0gICAgICAgICAgICAgICAgUHlfc3NpemVfdCB1cG9zOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0ciA9IFB5U3RyaW5nX0FTX1NUUklORygqY2FsbHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgLyogdW51c2VkLCBzaW5jZSB3ZSBhbHJlYWR5IGhhdmUgdGhlIHJlc3VsdCAqLwogICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcodmFyZ3MsIFB5T2JqZWN0ICopOwotICAgICAgICAgICAgICAgIHVjb3B5ID0gUHlVbmljb2RlX0FTX1VOSUNPREUoKmNhbGxyZXN1bHQpOwotICAgICAgICAgICAgICAgIHVzaXplID0gUHlVbmljb2RlX0dFVF9TSVpFKCpjYWxscmVzdWx0KTsKLSAgICAgICAgICAgICAgICBmb3IgKHVwb3MgPSAwOyB1cG9zPHVzaXplOykKLSAgICAgICAgICAgICAgICAgICAgKnMrKyA9IHVjb3B5W3Vwb3MrK107CisgICAgICAgICAgICAgICAgYXBwZW5kc3RyaW5nKHN0cik7CiAgICAgICAgICAgICAgICAgLyogV2UncmUgZG9uZSB3aXRoIHRoZSB1bmljb2RlKCkvcmVwcigpID0+IGZvcmdldCBpdCAqLwogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRigqY2FsbHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgLyogc3dpdGNoIHRvIG5leHQgdW5pY29kZSgpL3JlcHIoKSByZXN1bHQgKi8KQEAgLTExNjIsMTMgKzEyMTksMTAgQEAKICAgICB9CiAKICAgICAvKiBDb252ZXJ0IHRvIFVuaWNvZGUgKi8KLSAgICBpZiAobGVuID09IDApIHsKLSAgICAgICAgUHlfSU5DUkVGKHVuaWNvZGVfZW1wdHkpOwotICAgICAgICB2ID0gKFB5T2JqZWN0ICopdW5pY29kZV9lbXB0eTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICB2ID0gUHlVbmljb2RlX0RlY29kZShzLCBsZW4sIGVuY29kaW5nLCBlcnJvcnMpOworICAgIGlmIChsZW4gPT0gMCkKKyAgICAgICAgX1B5X1JFVFVSTl9VTklDT0RFX0VNUFRZKCk7CiAKKyAgICB2ID0gUHlVbmljb2RlX0RlY29kZShzLCBsZW4sIGVuY29kaW5nLCBlcnJvcnMpOwogICAgIHJldHVybiB2OwogCiAgIG9uRXJyb3I6CkBAIC0xMzgxLDcgKzE0MzUsNyBAQAogICAgIFB5X0RFQ1JFRih2KTsKICAgICBzdHJuY3B5KHVuaWNvZGVfZGVmYXVsdF9lbmNvZGluZywKICAgICAgICAgICAgIGVuY29kaW5nLAotICAgICAgICAgICAgc2l6ZW9mKHVuaWNvZGVfZGVmYXVsdF9lbmNvZGluZykpOworICAgICAgICAgICAgc2l6ZW9mKHVuaWNvZGVfZGVmYXVsdF9lbmNvZGluZykgLSAxKTsKICAgICByZXR1cm4gMDsKIAogICBvbkVycm9yOgpAQCAtMTYxNyw2ICsxNjcxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiYXNlNjRidWZmZXIgPj4gKGJhc2U2NGJpdHMtMTYpKTsKICAgICAgICAgICAgICAgICAgICAgYmFzZTY0Yml0cyAtPSAxNjsKICAgICAgICAgICAgICAgICAgICAgYmFzZTY0YnVmZmVyICY9ICgxIDw8IGJhc2U2NGJpdHMpIC0gMTsgLyogY2xlYXIgaGlnaCBiaXRzICovCisgICAgICAgICAgICAgICAgICAgIGFzc2VydChvdXRDaCA8PSAweGZmZmYpOwogICAgICAgICAgICAgICAgICAgICBpZiAoc3Vycm9nYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleHBlY3RpbmcgYSBzZWNvbmQgc3Vycm9nYXRlICovCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0Q2ggPj0gMHhEQzAwICYmIG91dENoIDw9IDB4REZGRikgewpAQCAtMTY4Myw2ICsxNzM4LDcgQEAKICAgICAgICAgICAgICAgICBpblNoaWZ0ID0gMTsKICAgICAgICAgICAgICAgICBzaGlmdE91dFN0YXJ0ID0gcDsKICAgICAgICAgICAgICAgICBiYXNlNjRiaXRzID0gMDsKKyAgICAgICAgICAgICAgICBiYXNlNjRidWZmZXIgPSAwOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKERFQ09ERV9ESVJFQ1QoY2gpKSB7IC8qIGNoYXJhY3RlciBkZWNvZGVzIGFzIGl0c2VsZiAqLwpAQCAtMTg2MSw3ICsxOTE3LDcgQEAKICAgICAgICBpbGxlZ2FsIHByZWZpeC4gIFNlZSBSRkMgMzYyOSBmb3IgZGV0YWlscyAqLwogICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8qIDAwLTBGICovCiAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAogICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCiAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLApAQCAtMjIxNyw3ICsyMjczLDcgQEAKICNlbmRpZgogICAgIFB5T2JqZWN0ICplcnJvckhhbmRsZXIgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpleGMgPSBOVUxMOwotICAgIAorCiAgICAgcSA9ICh1bnNpZ25lZCBjaGFyICopczsKICAgICBlID0gcSArIHNpemU7CiAKQEAgLTIyNzIsNyArMjMyOCw3IEBACiAgICAgLyogT24gbmFycm93IGJ1aWxkcyB3ZSBzcGxpdCBjaGFyYWN0ZXJzIG91dHNpZGUgdGhlIEJNUCBpbnRvIHR3bwogICAgICAgIGNvZGVwb2ludHMgPT4gY291bnQgaG93IG11Y2ggZXh0cmEgc3BhY2Ugd2UgbmVlZC4gKi8KICNpZm5kZWYgUHlfVU5JQ09ERV9XSURFCi0gICAgZm9yIChxcSA9IHE7IHFxIDwgZTsgcXEgKz0gNCkKKyAgICBmb3IgKHFxID0gcTsgZSAtIHFxID49IDQ7IHFxICs9IDQpCiAgICAgICAgIGlmIChxcVtpb3JkZXJbMl1dICE9IDAgfHwgcXFbaW9yZGVyWzNdXSAhPSAwKQogICAgICAgICAgICAgcGFpcnMrKzsKICNlbmRpZgpAQCAtMjU2NCw5ICsyNjIwLDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICAvKiBVVEYtMTYgY29kZSBwYWlyOiAqLwotICAgICAgICBpZiAocSA+PSBlKSB7CisgICAgICAgIGlmIChlIC0gcSA8IDIpIHsKKyAgICAgICAgICAgIHEgLT0gMjsKKyAgICAgICAgICAgIGlmIChjb25zdW1lZCkKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGVycm1zZyA9ICJ1bmV4cGVjdGVkIGVuZCBvZiBkYXRhIjsKLSAgICAgICAgICAgIHN0YXJ0aW5wb3MgPSAoKChjb25zdCBjaGFyICopcSktMiktc3RhcnRzOworICAgICAgICAgICAgc3RhcnRpbnBvcyA9ICgoY29uc3QgY2hhciAqKXEpLXN0YXJ0czsKICAgICAgICAgICAgIGVuZGlucG9zID0gKChjb25zdCBjaGFyICopZSktc3RhcnRzOwogICAgICAgICAgICAgZ290byB1dGYxNkVycm9yOwogICAgICAgICB9CkBAIC0yNzI5LDcgKzI3ODgsNiBAQAogICAgIFB5X3NzaXplX3Qgc3RhcnRpbnBvczsKICAgICBQeV9zc2l6ZV90IGVuZGlucG9zOwogICAgIFB5X3NzaXplX3Qgb3V0cG9zOwotICAgIGludCBpOwogICAgIFB5VW5pY29kZU9iamVjdCAqdjsKICAgICBQeV9VTklDT0RFICpwOwogICAgIGNvbnN0IGNoYXIgKmVuZDsKQEAgLTI4MTUsMjkgKzI4NzMsMTkgQEAKICAgICAgICAgICAgIG1lc3NhZ2UgPSAidHJ1bmNhdGVkIFxcVVhYWFhYWFhYIGVzY2FwZSI7CiAgICAgICAgIGhleGVzY2FwZToKICAgICAgICAgICAgIGNociA9IDA7Ci0gICAgICAgICAgICBvdXRwb3MgPSBwLVB5VW5pY29kZV9BU19VTklDT0RFKHYpOwotICAgICAgICAgICAgaWYgKHMrZGlnaXRzPmVuZCkgewotICAgICAgICAgICAgICAgIGVuZGlucG9zID0gc2l6ZTsKLSAgICAgICAgICAgICAgICBpZiAodW5pY29kZV9kZWNvZGVfY2FsbF9lcnJvcmhhbmRsZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMsICZlcnJvckhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidW5pY29kZWVzY2FwZSIsICJlbmQgb2Ygc3RyaW5nIGluIGVzY2FwZSBzZXF1ZW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydHMsIHNpemUsICZzdGFydGlucG9zLCAmZW5kaW5wb3MsICZleGMsICZzLAotICAgICAgICAgICAgICAgICAgICAgICAgJnYsICZvdXRwb3MsICZwKSkKLSAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOwotICAgICAgICAgICAgICAgIGdvdG8gbmV4dEJ5dGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGlnaXRzOyArK2kpIHsKLSAgICAgICAgICAgICAgICBjID0gKHVuc2lnbmVkIGNoYXIpIHNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKCFpc3hkaWdpdChjKSkgewotICAgICAgICAgICAgICAgICAgICBlbmRpbnBvcyA9IChzK2krMSktc3RhcnRzOwotICAgICAgICAgICAgICAgICAgICBpZiAodW5pY29kZV9kZWNvZGVfY2FsbF9lcnJvcmhhbmRsZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLCAmZXJyb3JIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmljb2RlZXNjYXBlIiwgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydHMsIHNpemUsICZzdGFydGlucG9zLCAmZW5kaW5wb3MsICZleGMsICZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2LCAmb3V0cG9zLCAmcCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gbmV4dEJ5dGU7CisgICAgICAgICAgICBpZiAoZW5kIC0gcyA8IGRpZ2l0cykgeworICAgICAgICAgICAgICAgIC8qIGNvdW50IG9ubHkgaGV4IGRpZ2l0cyAqLworICAgICAgICAgICAgICAgIGZvciAoOyBzIDwgZW5kOyArK3MpIHsKKyAgICAgICAgICAgICAgICAgICAgYyA9ICh1bnNpZ25lZCBjaGFyKSpzOworICAgICAgICAgICAgICAgICAgICBpZiAoIVB5X0lTWERJR0lUKGMpKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoOyBkaWdpdHMtLTsgKytzKSB7CisgICAgICAgICAgICAgICAgYyA9ICh1bnNpZ25lZCBjaGFyKSpzOworICAgICAgICAgICAgICAgIGlmICghUHlfSVNYRElHSVQoYykpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgY2hyID0gKGNocjw8NCkgJiB+MHhGOwogICAgICAgICAgICAgICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKICAgICAgICAgICAgICAgICAgICAgY2hyICs9IGMgLSAnMCc7CkBAIC0yODQ2LDcgKzI4OTQsNiBAQAogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgY2hyICs9IDEwICsgYyAtICdBJzsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHMgKz0gaTsKICAgICAgICAgICAgIGlmIChjaHIgPT0gMHhmZmZmZmZmZiAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgICAgIC8qIF9kZWNvZGluZ19lcnJvciB3aWxsIGhhdmUgYWxyZWFkeSB3cml0dGVuIGludG8gdGhlCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0IGJ1ZmZlci4gKi8KQEAgLTI4NjcsMTQgKzI5MTQsOCBAQAogICAgICAgICAgICAgICAgICpwKysgPSAweERDMDAgKyAoUHlfVU5JQ09ERSkgKGNociAmIDB4MDNGRik7CiAjZW5kaWYKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW5kaW5wb3MgPSBzLXN0YXJ0czsKLSAgICAgICAgICAgICAgICBvdXRwb3MgPSBwLVB5VW5pY29kZV9BU19VTklDT0RFKHYpOwotICAgICAgICAgICAgICAgIGlmICh1bmljb2RlX2RlY29kZV9jYWxsX2Vycm9yaGFuZGxlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycywgJmVycm9ySGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ1bmljb2RlZXNjYXBlIiwgImlsbGVnYWwgVW5pY29kZSBjaGFyYWN0ZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRzLCBzaXplLCAmc3RhcnRpbnBvcywgJmVuZGlucG9zLCAmZXhjLCAmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICZ2LCAmb3V0cG9zLCAmcCkpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgICAgICAgICBtZXNzYWdlID0gImlsbGVnYWwgVW5pY29kZSBjaGFyYWN0ZXIiOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKIApAQCAtMjg5NiwzMiArMjkzNywxOCBAQAogICAgICAgICAgICAgICAgICAgICAvKiBmb3VuZCBhIG5hbWUuICBsb29rIGl0IHVwIGluIHRoZSB1bmljb2RlIGRhdGFiYXNlICovCiAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAidW5rbm93biBVbmljb2RlIGNoYXJhY3RlciBuYW1lIjsKICAgICAgICAgICAgICAgICAgICAgcysrOwotICAgICAgICAgICAgICAgICAgICBpZiAodWNuaGFzaF9DQVBJLT5nZXRjb2RlKE5VTEwsIHN0YXJ0LCAoaW50KShzLXN0YXJ0LTEpLCAmY2hyKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMgLSBzdGFydCAtIDEgPD0gSU5UX01BWCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgdWNuaGFzaF9DQVBJLT5nZXRjb2RlKE5VTEwsIHN0YXJ0LCAoaW50KShzLXN0YXJ0LTEpLCAmY2hyKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gc3RvcmU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgZW5kaW5wb3MgPSBzLXN0YXJ0czsKLSAgICAgICAgICAgIG91dHBvcyA9IHAtUHlVbmljb2RlX0FTX1VOSUNPREUodik7Ci0gICAgICAgICAgICBpZiAodW5pY29kZV9kZWNvZGVfY2FsbF9lcnJvcmhhbmRsZXIoCi0gICAgICAgICAgICAgICAgICAgIGVycm9ycywgJmVycm9ySGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgInVuaWNvZGVlc2NhcGUiLCBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICBzdGFydHMsIHNpemUsICZzdGFydGlucG9zLCAmZW5kaW5wb3MsICZleGMsICZzLAotICAgICAgICAgICAgICAgICAgICAmdiwgJm91dHBvcywgJnApKQotICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZ290byBlcnJvcjsKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaWYgKHMgPiBlbmQpIHsKICAgICAgICAgICAgICAgICBtZXNzYWdlID0gIlxcIGF0IGVuZCBvZiBzdHJpbmciOwogICAgICAgICAgICAgICAgIHMtLTsKLSAgICAgICAgICAgICAgICBlbmRpbnBvcyA9IHMtc3RhcnRzOwotICAgICAgICAgICAgICAgIG91dHBvcyA9IHAtUHlVbmljb2RlX0FTX1VOSUNPREUodik7Ci0gICAgICAgICAgICAgICAgaWYgKHVuaWNvZGVfZGVjb2RlX2NhbGxfZXJyb3JoYW5kbGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLCAmZXJyb3JIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgInVuaWNvZGVlc2NhcGUiLCBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRzLCBzaXplLCAmc3RhcnRpbnBvcywgJmVuZGlucG9zLCAmZXhjLCAmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICZ2LCAmb3V0cG9zLCAmcCkpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgKnArKyA9ICdcXCc7CkBAIC0yOTI5LDggKzI5NTYsMTggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICBuZXh0Qnl0ZToKLSAgICAgICAgOworICAgICAgICBjb250aW51ZTsKKworICAgICAgZXJyb3I6CisgICAgICAgIGVuZGlucG9zID0gcy1zdGFydHM7CisgICAgICAgIG91dHBvcyA9IHAtUHlVbmljb2RlX0FTX1VOSUNPREUodik7CisgICAgICAgIGlmICh1bmljb2RlX2RlY29kZV9jYWxsX2Vycm9yaGFuZGxlcigKKyAgICAgICAgICAgICAgICBlcnJvcnMsICZlcnJvckhhbmRsZXIsCisgICAgICAgICAgICAgICAgInVuaWNvZGVlc2NhcGUiLCBtZXNzYWdlLAorICAgICAgICAgICAgICAgIHN0YXJ0cywgc2l6ZSwgJnN0YXJ0aW5wb3MsICZlbmRpbnBvcywgJmV4YywgJnMsCisgICAgICAgICAgICAgICAgJnYsICZvdXRwb3MsICZwKSkKKyAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgY29udGludWU7CiAgICAgfQogICAgIGlmIChfUHlVbmljb2RlX1Jlc2l6ZSgmdiwgcCAtIFB5VW5pY29kZV9BU19VTklDT0RFKHYpKSA8IDApCiAgICAgICAgIGdvdG8gb25FcnJvcjsKQEAgLTMzODksMzcgKzM0MjYsMzQgQEAKICAgICBlbmQgPSBzICsgc2l6ZTsKIAogICAgIHdoaWxlIChzIDwgZW5kKSB7CisgICAgICAgIGlmIChlbmQtcyA8IFB5X1VOSUNPREVfU0laRSkgeworICAgICAgICAgICAgZW5kaW5wb3MgPSBlbmQtc3RhcnRzOworICAgICAgICAgICAgcmVhc29uID0gInRydW5jYXRlZCBpbnB1dCI7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CiAgICAgICAgIG1lbWNweShwLCBzLCBzaXplb2YoUHlfVU5JQ09ERSkpOworI2lmZGVmIFB5X1VOSUNPREVfV0lERQogICAgICAgICAvKiBXZSBoYXZlIHRvIHNhbml0eSBjaGVjayB0aGUgcmF3IGRhdGEsIG90aGVyd2lzZSBkb29tIGxvb21zIGZvcgogICAgICAgICAgICBzb21lIG1hbGZvcm1lZCBVQ1MtNCBkYXRhLiAqLwotICAgICAgICBpZiAoCi0jaWZkZWYgUHlfVU5JQ09ERV9XSURFCi0gICAgICAgICAgICAqcCA+IHVuaW1heCB8fCAqcCA8IDAgfHwKLSNlbmRpZgotICAgICAgICAgICAgZW5kLXMgPCBQeV9VTklDT0RFX1NJWkUKLSAgICAgICAgICAgICkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhcnRpbnBvcyA9IHMgLSBzdGFydHM7Ci0gICAgICAgICAgICBpZiAoZW5kLXMgPCBQeV9VTklDT0RFX1NJWkUpIHsKLSAgICAgICAgICAgICAgICBlbmRpbnBvcyA9IGVuZC1zdGFydHM7Ci0gICAgICAgICAgICAgICAgcmVhc29uID0gInRydW5jYXRlZCBpbnB1dCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbmRpbnBvcyA9IHMgLSBzdGFydHMgKyBQeV9VTklDT0RFX1NJWkU7Ci0gICAgICAgICAgICAgICAgcmVhc29uID0gImlsbGVnYWwgY29kZSBwb2ludCAoPiAweDEwRkZGRikiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0cG9zID0gcCAtIFB5VW5pY29kZV9BU19VTklDT0RFKHYpOwotICAgICAgICAgICAgaWYgKHVuaWNvZGVfZGVjb2RlX2NhbGxfZXJyb3JoYW5kbGVyKAotICAgICAgICAgICAgICAgICAgICBlcnJvcnMsICZlcnJvckhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICJ1bmljb2RlX2ludGVybmFsIiwgcmVhc29uLAotICAgICAgICAgICAgICAgICAgICBzdGFydHMsIHNpemUsICZzdGFydGlucG9zLCAmZW5kaW5wb3MsICZleGMsICZzLAotICAgICAgICAgICAgICAgICAgICAmdiwgJm91dHBvcywgJnApKSB7Ci0gICAgICAgICAgICAgICAgZ290byBvbkVycm9yOwotICAgICAgICAgICAgfQorICAgICAgICBpZiAoKnAgPiB1bmltYXggfHwgKnAgPCAwKSB7CisgICAgICAgICAgICBlbmRpbnBvcyA9IHMgLSBzdGFydHMgKyBQeV9VTklDT0RFX1NJWkU7CisgICAgICAgICAgICByZWFzb24gPSAiaWxsZWdhbCBjb2RlIHBvaW50ICg+IDB4MTBGRkZGKSI7CisgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcCsrOwotICAgICAgICAgICAgcyArPSBQeV9VTklDT0RFX1NJWkU7CisjZW5kaWYKKyAgICAgICAgcCsrOworICAgICAgICBzICs9IFB5X1VOSUNPREVfU0laRTsKKyAgICAgICAgY29udGludWU7CisKKyAgZXJyb3I6CisgICAgICAgIHN0YXJ0aW5wb3MgPSBzIC0gc3RhcnRzOworICAgICAgICBvdXRwb3MgPSBwIC0gUHlVbmljb2RlX0FTX1VOSUNPREUodik7CisgICAgICAgIGlmICh1bmljb2RlX2RlY29kZV9jYWxsX2Vycm9yaGFuZGxlcigKKyAgICAgICAgICAgICAgICBlcnJvcnMsICZlcnJvckhhbmRsZXIsCisgICAgICAgICAgICAgICAgInVuaWNvZGVfaW50ZXJuYWwiLCByZWFzb24sCisgICAgICAgICAgICAgICAgc3RhcnRzLCBzaXplLCAmc3RhcnRpbnBvcywgJmVuZGlucG9zLCAmZXhjLCAmcywKKyAgICAgICAgICAgICAgICAmdiwgJm91dHBvcywgJnApKSB7CisgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM0ODYsOCArMzUyMCw3IEBACiAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CiAgICAgICAgIHJldHVybjsKICAgICAgIG9uRXJyb3I6Ci0gICAgICAgIFB5X0RFQ1JFRigqZXhjZXB0aW9uT2JqZWN0KTsKLSAgICAgICAgKmV4Y2VwdGlvbk9iamVjdCA9IE5VTEw7CisgICAgICAgIFB5X0NMRUFSKCpleGNlcHRpb25PYmplY3QpOwogICAgIH0KIH0KIApAQCAtMzY0MSwyNiArMzY3NCwyMiBAQAogICAgICAgICAgICAgY2FzZSA0OiAvKiB4bWxjaGFycmVmcmVwbGFjZSAqLwogICAgICAgICAgICAgICAgIHJlc3BvcyA9IHN0ci1QeVN0cmluZ19BU19TVFJJTkcocmVzKTsKICAgICAgICAgICAgICAgICAvKiBkZXRlcm1pbmUgcmVwbGFjZW1lbnQgc2l6ZSAodGVtcG9yYXJpbHkgKG1pcyl1c2VzIHApICovCi0gICAgICAgICAgICAgICAgZm9yIChwID0gY29sbHN0YXJ0LCByZXBzaXplID0gMDsgcCA8IGNvbGxlbmQ7ICsrcCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKnA8MTApCisgICAgICAgICAgICAgICAgZm9yIChwID0gY29sbHN0YXJ0LCByZXBzaXplID0gMDsgcCA8IGNvbGxlbmQ7KSB7CisgICAgICAgICAgICAgICAgICAgIFB5X1VDUzQgY2ggPSBfUHlfVU5JQ09ERV9ORVhUKHAsIGNvbGxlbmQpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPCAxMCkKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHNpemUgKz0gMisxKzE7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCpwPDEwMCkKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2ggPCAxMDApCiAgICAgICAgICAgICAgICAgICAgICAgICByZXBzaXplICs9IDIrMisxOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgqcDwxMDAwKQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA8IDEwMDApCiAgICAgICAgICAgICAgICAgICAgICAgICByZXBzaXplICs9IDIrMysxOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgqcDwxMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2ggPCAxMDAwMCkKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHNpemUgKz0gMis0KzE7Ci0jaWZuZGVmIFB5X1VOSUNPREVfV0lERQotICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoIDwgMTAwMDAwKQogICAgICAgICAgICAgICAgICAgICAgICAgcmVwc2l6ZSArPSAyKzUrMTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCpwPDEwMDAwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcHNpemUgKz0gMis1KzE7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCpwPDEwMDAwMDApCisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoIDwgMTAwMDAwMCkKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHNpemUgKz0gMis2KzE7CiAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHNpemUgKz0gMis3KzE7Ci0jZW5kaWYKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmVxdWlyZWRzaXplID0gcmVzcG9zK3JlcHNpemUrKGVuZHAtY29sbGVuZCk7CiAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkc2l6ZSA+IHJlc3NpemUpIHsKQEAgLTM2NzIsOCArMzcwMSw5IEBACiAgICAgICAgICAgICAgICAgICAgIHJlc3NpemUgPSByZXF1aXJlZHNpemU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8qIGdlbmVyYXRlIHJlcGxhY2VtZW50ICh0ZW1wb3JhcmlseSAobWlzKXVzZXMgcCkgKi8KLSAgICAgICAgICAgICAgICBmb3IgKHAgPSBjb2xsc3RhcnQ7IHAgPCBjb2xsZW5kOyArK3ApIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyICs9IHNwcmludGYoc3RyLCAiJiMlZDsiLCAoaW50KSpwKTsKKyAgICAgICAgICAgICAgICBmb3IgKHAgPSBjb2xsc3RhcnQ7IHAgPCBjb2xsZW5kOykgeworICAgICAgICAgICAgICAgICAgICBQeV9VQ1M0IGNoID0gX1B5X1VOSUNPREVfTkVYVChwLCBjb2xsZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyICs9IHNwcmludGYoc3RyLCAiJiMlZDsiLCAoaW50KWNoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcCA9IGNvbGxlbmQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC00MTE4LDQ2ICs0MTQ4LDYwIEBACiAgICAgICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfTG9va3VwRXJyb3IpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8qIE5vIG1hcHBpbmcgZm91bmQgbWVhbnM6IG1hcHBpbmcgaXMgdW5kZWZpbmVkLiAqLwogICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICAgICAgICAgICAgICB4ID0gUHlfTm9uZTsKLSAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHgpOworICAgICAgICAgICAgICAgICAgICBnb3RvIFVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKiBBcHBseSBtYXBwaW5nICovCisgICAgICAgICAgICBpZiAoeCA9PSBQeV9Ob25lKQorICAgICAgICAgICAgICAgIGdvdG8gVW5kZWZpbmVkOwogICAgICAgICAgICAgaWYgKFB5SW50X0NoZWNrKHgpKSB7CiAgICAgICAgICAgICAgICAgbG9uZyB2YWx1ZSA9IFB5SW50X0FTX0xPTkcoeCk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDY1NTM1KSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IDB4RkZGRSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBVbmRlZmluZWQ7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDB4MTBGRkZGKSB7CiAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hhcmFjdGVyIG1hcHBpbmcgbXVzdCBiZSBpbiByYW5nZSg2NTUzNikiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGFyYWN0ZXIgbWFwcGluZyBtdXN0IGJlIGluIHJhbmdlKDB4MTEwMDAwKSIpOwogICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoeCk7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKICAgICAgICAgICAgICAgICB9CisKKyNpZm5kZWYgUHlfVU5JQ09ERV9XSURFCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID4gMHhGRkZGKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHNlZSB0aGUgY29kZSBmb3IgMS1uIG1hcHBpbmcgYmVsb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhY2hhcnMgPCAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXNpemUgZmlyc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgb2xkcG9zID0gcCAtIFB5VW5pY29kZV9BU19VTklDT0RFKHYpOworICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBuZWVkZWQgPSAxMCAtIGV4dHJhY2hhcnM7CisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWNoYXJzICs9IG5lZWRlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFhYWCBvdmVyZmxvdyBkZXRlY3Rpb24gbWlzc2luZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9QeVVuaWNvZGVfUmVzaXplKCZ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRSh2KSArIG5lZWRlZCkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KSArIG9sZHBvczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSAtPSAweDEwMDAwOworICAgICAgICAgICAgICAgICAgICAqcCsrID0gMHhEODAwIHwgKHZhbHVlID4+IDEwKTsKKyAgICAgICAgICAgICAgICAgICAgKnArKyA9IDB4REMwMCB8ICh2YWx1ZSAmIDB4M0ZGKTsKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFjaGFycyAtPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYKICAgICAgICAgICAgICAgICAqcCsrID0gKFB5X1VOSUNPREUpdmFsdWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh4ID09IFB5X05vbmUpIHsKLSAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgbWFwcGluZyAqLwotICAgICAgICAgICAgICAgIG91dHBvcyA9IHAtUHlVbmljb2RlX0FTX1VOSUNPREUodik7Ci0gICAgICAgICAgICAgICAgc3RhcnRpbnBvcyA9IHMtc3RhcnRzOwotICAgICAgICAgICAgICAgIGVuZGlucG9zID0gc3RhcnRpbnBvcysxOwotICAgICAgICAgICAgICAgIGlmICh1bmljb2RlX2RlY29kZV9jYWxsX2Vycm9yaGFuZGxlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycywgJmVycm9ySGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJjaGFybWFwIiwgImNoYXJhY3RlciBtYXBzIHRvIDx1bmRlZmluZWQ+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0cywgc2l6ZSwgJnN0YXJ0aW5wb3MsICZlbmRpbnBvcywgJmV4YywgJnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAmdiwgJm91dHBvcywgJnApKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih4KTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoeCk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soeCkpIHsKICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHRhcmdldHNpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUoeCk7CiAKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0c2l6ZSA9PSAxKQorICAgICAgICAgICAgICAgIGlmICh0YXJnZXRzaXplID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgLyogMS0xIG1hcHBpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgKnArKyA9ICpQeVVuaWNvZGVfQVNfVU5JQ09ERSh4KTsKLQorICAgICAgICAgICAgICAgICAgICBQeV9VTklDT0RFIHZhbHVlID0gKlB5VW5pY29kZV9BU19VTklDT0RFKHgpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gMHhGRkZFKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBVbmRlZmluZWQ7CisgICAgICAgICAgICAgICAgICAgICpwKysgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGFyZ2V0c2l6ZSA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgLyogMS1uIG1hcHBpbmcgKi8KICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldHNpemUgPiBleHRyYWNoYXJzKSB7CkBAIC00MTkxLDYgKzQyMzUsMjAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFB5X0RFQ1JFRih4KTsKICAgICAgICAgICAgICsrczsKKyAgICAgICAgICAgIGNvbnRpbnVlOworVW5kZWZpbmVkOgorICAgICAgICAgICAgLyogdW5kZWZpbmVkIG1hcHBpbmcgKi8KKyAgICAgICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgICAgICAgICBvdXRwb3MgPSBwLVB5VW5pY29kZV9BU19VTklDT0RFKHYpOworICAgICAgICAgICAgc3RhcnRpbnBvcyA9IHMtc3RhcnRzOworICAgICAgICAgICAgZW5kaW5wb3MgPSBzdGFydGlucG9zKzE7CisgICAgICAgICAgICBpZiAodW5pY29kZV9kZWNvZGVfY2FsbF9lcnJvcmhhbmRsZXIoCisgICAgICAgICAgICAgICAgICAgIGVycm9ycywgJmVycm9ySGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgImNoYXJtYXAiLCAiY2hhcmFjdGVyIG1hcHMgdG8gPHVuZGVmaW5lZD4iLAorICAgICAgICAgICAgICAgICAgICBzdGFydHMsIHNpemUsICZzdGFydGlucG9zLCAmZW5kaW5wb3MsICZleGMsICZzLAorICAgICAgICAgICAgICAgICAgICAmdiwgJm91dHBvcywgJnApKSB7CisgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIGlmIChwIC0gUHlVbmljb2RlX0FTX1VOSUNPREUodikgPCBQeVVuaWNvZGVfR0VUX1NJWkUodikpCkBAIC00NjIwLDExICs0Njc4LDIwIEBACiAgICAgICAgICppbnBvcyA9IGNvbGxlbmRwb3M7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgNDogLyogeG1sY2hhcnJlZnJlcGxhY2UgKi8KLSAgICAgICAgLyogZ2VuZXJhdGUgcmVwbGFjZW1lbnQgKHRlbXBvcmFyaWx5IChtaXMpdXNlcyBwKSAqLwotICAgICAgICBmb3IgKGNvbGxwb3MgPSBjb2xsc3RhcnRwb3M7IGNvbGxwb3MgPCBjb2xsZW5kcG9zOyArK2NvbGxwb3MpIHsKKyAgICAgICAgLyogZ2VuZXJhdGUgcmVwbGFjZW1lbnQgKi8KKyAgICAgICAgZm9yIChjb2xscG9zID0gY29sbHN0YXJ0cG9zOyBjb2xscG9zIDwgY29sbGVuZHBvczspIHsKICAgICAgICAgICAgIGNoYXIgYnVmZmVyWzIrMjkrMSsxXTsKICAgICAgICAgICAgIGNoYXIgKmNwOwotICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICImIyVkOyIsIChpbnQpcFtjb2xscG9zXSk7CisgICAgICAgICAgICBQeV9VQ1M0IGNoID0gcFtjb2xscG9zKytdOworI2lmbmRlZiBQeV9VTklDT0RFX1dJREUKKyAgICAgICAgICAgIGlmICgoMHhEODAwIDw9IGNoICYmIGNoIDw9IDB4REJGRikgJiYKKyAgICAgICAgICAgICAgICAoY29sbHBvcyA8IGNvbGxlbmRwb3MpICYmCisgICAgICAgICAgICAgICAgKDB4REMwMCA8PSBwW2NvbGxwb3NdICYmIHBbY29sbHBvc10gPD0gMHhERkZGKSkgeworICAgICAgICAgICAgICAgIGNoID0gKCgoKGNoICYgMHgwM0ZGKSA8PCAxMCkgfAorICAgICAgICAgICAgICAgICAgICAgICAoKFB5X1VDUzQpcFtjb2xscG9zKytdICYgMHgwM0ZGKSkgKyAweDEwMDAwKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICImIyVkOyIsIChpbnQpY2gpOwogICAgICAgICAgICAgZm9yIChjcCA9IGJ1ZmZlcjsgKmNwOyArK2NwKSB7CiAgICAgICAgICAgICAgICAgeCA9IGNoYXJtYXBlbmNvZGVfb3V0cHV0KCpjcCwgbWFwcGluZywgcmVzLCByZXNwb3MpOwogICAgICAgICAgICAgICAgIGlmICh4PT1lbmNfRVhDRVBUSU9OKQpAQCAtNDc1OCw4ICs0ODI1LDcgQEAKICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKICAgICAgICAgcmV0dXJuOwogICAgICAgb25FcnJvcjoKLSAgICAgICAgUHlfREVDUkVGKCpleGNlcHRpb25PYmplY3QpOwotICAgICAgICAqZXhjZXB0aW9uT2JqZWN0ID0gTlVMTDsKKyAgICAgICAgUHlfQ0xFQVIoKmV4Y2VwdGlvbk9iamVjdCk7CiAgICAgfQogfQogCkBAIC01MDM5LDEwICs1MTA1LDExIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDQ6IC8qIHhtbGNoYXJyZWZyZXBsYWNlICovCiAgICAgICAgICAgICAgICAgLyogZ2VuZXJhdGUgcmVwbGFjZW1lbnQgKHRlbXBvcmFyaWx5IChtaXMpdXNlcyBwKSAqLwotICAgICAgICAgICAgICAgIGZvciAocCA9IGNvbGxzdGFydDsgcCA8IGNvbGxlbmQ7ICsrcCkgeworICAgICAgICAgICAgICAgIGZvciAocCA9IGNvbGxzdGFydDsgcCA8IGNvbGxlbmQ7KSB7CiAgICAgICAgICAgICAgICAgICAgIGNoYXIgYnVmZmVyWzIrMjkrMSsxXTsKICAgICAgICAgICAgICAgICAgICAgY2hhciAqY3A7Ci0gICAgICAgICAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJiMlZDsiLCAoaW50KSpwKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfVUNTNCBjaCA9IF9QeV9VTklDT0RFX05FWFQocCwgY29sbGVuZCk7CisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJiMlZDsiLCAoaW50KWNoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXJtYXB0cmFuc2xhdGVfbWFrZXNwYWNlKCZyZXMsICZzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyLVB5VW5pY29kZV9BU19VTklDT0RFKHJlcykpK3N0cmxlbihidWZmZXIpKyhlbmRwLWNvbGxlbmQpKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKQEAgLTUxOTMsOCArNTI2MCwxMCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgNDogLyogeG1sY2hhcnJlZnJlcGxhY2UgKi8KICAgICAgICAgICAgIC8qIGdlbmVyYXRlIHJlcGxhY2VtZW50ICh0ZW1wb3JhcmlseSAobWlzKXVzZXMgcCkgKi8KLSAgICAgICAgICAgIGZvciAocCA9IGNvbGxzdGFydDsgcCA8IGNvbGxlbmQ7ICsrcCkKLSAgICAgICAgICAgICAgICBvdXRwdXQgKz0gc3ByaW50ZihvdXRwdXQsICImIyVkOyIsIChpbnQpKnApOworICAgICAgICAgICAgZm9yIChwID0gY29sbHN0YXJ0OyBwIDwgY29sbGVuZDspIHsKKyAgICAgICAgICAgICAgICBQeV9VQ1M0IGNoID0gX1B5X1VOSUNPREVfTkVYVChwLCBjb2xsZW5kKTsKKyAgICAgICAgICAgICAgICBvdXRwdXQgKz0gc3ByaW50ZihvdXRwdXQsICImIyVkOyIsIGNoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHAgPSBjb2xsZW5kOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CkBAIC01NTQ5LDcgKzU2MTgsNyBAQAogICAgIFB5T2JqZWN0ICppdGVtOwogICAgIFB5X3NzaXplX3QgaTsKIAotICAgIGZzZXEgPSBQeVNlcXVlbmNlX0Zhc3Qoc2VxLCAiIik7CisgICAgZnNlcSA9IFB5U2VxdWVuY2VfRmFzdChzZXEsICJjYW4gb25seSBqb2luIGFuIGl0ZXJhYmxlIik7CiAgICAgaWYgKGZzZXEgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC02MzY0LDcgKzY0MzMsNyBAQAogdG8gdGhlIGRlZmF1bHQgZW5jb2RpbmcuIGVycm9ycyBtYXkgYmUgZ2l2ZW4gdG8gc2V0IGEgZGlmZmVyZW50IGVycm9yXG5cCiBoYW5kbGluZyBzY2hlbWUuIERlZmF1bHQgaXMgJ3N0cmljdCcgbWVhbmluZyB0aGF0IGVuY29kaW5nIGVycm9ycyByYWlzZVxuXAogYSBVbmljb2RlRGVjb2RlRXJyb3IuIE90aGVyIHBvc3NpYmxlIHZhbHVlcyBhcmUgJ2lnbm9yZScgYW5kICdyZXBsYWNlJ1xuXAotYXMgd2VsbCBhcyBhbnkgb3RoZXIgbmFtZSByZWdpc3RlcmQgd2l0aCBjb2RlY3MucmVnaXN0ZXJfZXJyb3IgdGhhdCBpc1xuXAorYXMgd2VsbCBhcyBhbnkgb3RoZXIgbmFtZSByZWdpc3RlcmVkIHdpdGggY29kZWNzLnJlZ2lzdGVyX2Vycm9yIHRoYXQgaXNcblwKIGFibGUgdG8gaGFuZGxlIFVuaWNvZGVEZWNvZGVFcnJvcnMuIik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC02NTM4LDE0ICs2NjA3LDI3IEBACiAgICAgcmVnaXN0ZXIgUHlfVU5JQ09ERSAqcDsKICAgICByZWdpc3RlciBsb25nIHg7CiAKKyNpZmRlZiBQeV9ERUJVRworICAgIGFzc2VydChfUHlfSGFzaFNlY3JldF9Jbml0aWFsaXplZCk7CisjZW5kaWYKICAgICBpZiAoc2VsZi0+aGFzaCAhPSAtMSkKICAgICAgICAgcmV0dXJuIHNlbGYtPmhhc2g7CiAgICAgbGVuID0gUHlVbmljb2RlX0dFVF9TSVpFKHNlbGYpOworICAgIC8qCisgICAgICBXZSBtYWtlIHRoZSBoYXNoIG9mIHRoZSBlbXB0eSBzdHJpbmcgYmUgMCwgcmF0aGVyIHRoYW4gdXNpbmcKKyAgICAgIChwcmVmaXggXiBzdWZmaXgpLCBzaW5jZSB0aGlzIHNsaWdodGx5IG9iZnVzY2F0ZXMgdGhlIGhhc2ggc2VjcmV0CisgICAgKi8KKyAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgc2VsZi0+aGFzaCA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KICAgICBwID0gUHlVbmljb2RlX0FTX1VOSUNPREUoc2VsZik7Ci0gICAgeCA9ICpwIDw8IDc7CisgICAgeCA9IF9QeV9IYXNoU2VjcmV0LnByZWZpeDsKKyAgICB4IF49ICpwIDw8IDc7CiAgICAgd2hpbGUgKC0tbGVuID49IDApCiAgICAgICAgIHggPSAoMTAwMDAwMyp4KSBeICpwKys7CiAgICAgeCBePSBQeVVuaWNvZGVfR0VUX1NJWkUoc2VsZik7CisgICAgeCBePSBfUHlfSGFzaFNlY3JldC5zdWZmaXg7CiAgICAgaWYgKHggPT0gLTEpCiAgICAgICAgIHggPSAtMjsKICAgICBzZWxmLT5oYXNoID0geDsKQEAgLTc1MDgsNyArNzU5MCw3IEBACiB9CiAKIFB5RG9jX1NUUlZBUihzcGxpdGxpbmVzX19kb2NfXywKLSAgICAgICAgICAgICAiUy5zcGxpdGxpbmVzKFtrZWVwZW5kc10pIC0+IGxpc3Qgb2Ygc3RyaW5nc1xuXAorICAgICAgICAgICAgICJTLnNwbGl0bGluZXMoa2VlcGVuZHM9RmFsc2UpIC0+IGxpc3Qgb2Ygc3RyaW5nc1xuXAogXG5cCiBSZXR1cm4gYSBsaXN0IG9mIHRoZSBsaW5lcyBpbiBTLCBicmVha2luZyBhdCBsaW5lIGJvdW5kYXJpZXMuXG5cCiBMaW5lIGJyZWFrcyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgbGlzdCB1bmxlc3Mga2VlcGVuZHNcblwKQEAgLTc3ODQsMTAgKzc4NjYsNiBAQAogCiAKIHN0YXRpYyBQeU1ldGhvZERlZiB1bmljb2RlX21ldGhvZHNbXSA9IHsKLQotICAgIC8qIE9yZGVyIGlzIGFjY29yZGluZyB0byBjb21tb24gdXNhZ2U6IG9mdGVuIHVzZWQgbWV0aG9kcyBzaG91bGQKLSAgICAgICBhcHBlYXIgZmlyc3QsIHNpbmNlIGxvb2t1cCBpcyBkb25lIHNlcXVlbnRpYWxseS4gKi8KLQogICAgIHsiZW5jb2RlIiwgKFB5Q0Z1bmN0aW9uKSB1bmljb2RlX2VuY29kZSwgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgZW5jb2RlX19kb2NfX30sCiAgICAgeyJyZXBsYWNlIiwgKFB5Q0Z1bmN0aW9uKSB1bmljb2RlX3JlcGxhY2UsIE1FVEhfVkFSQVJHUywgcmVwbGFjZV9fZG9jX199LAogICAgIHsic3BsaXQiLCAoUHlDRnVuY3Rpb24pIHVuaWNvZGVfc3BsaXQsIE1FVEhfVkFSQVJHUywgc3BsaXRfX2RvY19ffSwKQEAgLTgyNjYsOCArODM0NCw4IEBACiAgICAgICAgIGFyZ2xlbiA9IC0xOwogICAgICAgICBhcmdpZHggPSAtMjsKICAgICB9Ci0gICAgaWYgKFB5X1RZUEUoYXJncyktPnRwX2FzX21hcHBpbmcgJiYgIVB5VHVwbGVfQ2hlY2soYXJncykgJiYKLSAgICAgICAgIVB5T2JqZWN0X1R5cGVDaGVjayhhcmdzLCAmUHlCYXNlU3RyaW5nX1R5cGUpKQorICAgIGlmIChQeV9UWVBFKGFyZ3MpLT50cF9hc19tYXBwaW5nICYmIFB5X1RZUEUoYXJncyktPnRwX2FzX21hcHBpbmctPm1wX3N1YnNjcmlwdCAmJgorICAgICAgICAhUHlUdXBsZV9DaGVjayhhcmdzKSAmJiAhUHlPYmplY3RfVHlwZUNoZWNrKGFyZ3MsICZQeUJhc2VTdHJpbmdfVHlwZSkpCiAgICAgICAgIGRpY3QgPSBhcmdzOwogCiAgICAgd2hpbGUgKC0tZm10Y250ID49IDApIHsKQEAgLTgzNzEsNyArODQ0OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKiB3YW50cyBpbnQiKTsKICAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3aWR0aCA9IFB5SW50X0FzTG9uZyh2KTsKKyAgICAgICAgICAgICAgICB3aWR0aCA9IFB5SW50X0FzU3NpemVfdCh2KTsKKyAgICAgICAgICAgICAgICBpZiAod2lkdGggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOwogICAgICAgICAgICAgICAgIGlmICh3aWR0aCA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRl9MSlVTVDsKICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAtd2lkdGg7CkBAIC04Mzg1LDcgKzg0NjUsNyBAQAogICAgICAgICAgICAgICAgICAgICBjID0gKmZtdCsrOwogICAgICAgICAgICAgICAgICAgICBpZiAoYyA8ICcwJyB8fCBjID4gJzknKQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgod2lkdGgqMTApIC8gMTAgIT0gd2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdpZHRoID4gKFBZX1NTSVpFX1RfTUFYIC0gKChpbnQpYyAtICcwJykpIC8gMTApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aCB0b28gYmlnIik7CiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CkBAIC04NDA2LDcgKzg0ODYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIqIHdhbnRzIGludCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHByZWMgPSBQeUludF9Bc0xvbmcodik7CisgICAgICAgICAgICAgICAgICAgIHByZWMgPSBfUHlJbnRfQXNJbnQodik7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVjID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVjIDwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgIHByZWMgPSAwOwogICAgICAgICAgICAgICAgICAgICBpZiAoLS1mbXRjbnQgPj0gMCkKQEAgLTg0MTgsNyArODUwMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjID0gKmZtdCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPCAnMCcgfHwgYyA+ICc5JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlYyoxMCkgLyAxMCAhPSBwcmVjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlYyA+IChJTlRfTUFYIC0gKChpbnQpYyAtICcwJykpIC8gMTApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByZWMgdG9vIGJpZyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKQEAgLTg3NTAsNyArODgzMiw4IEBACiB9CiAKIFB5RG9jX1NUUlZBUih1bmljb2RlX2RvYywKLSAgICAgICAgICAgICAidW5pY29kZShzdHJpbmcgWywgZW5jb2RpbmdbLCBlcnJvcnNdXSkgLT4gb2JqZWN0XG5cCisgICAgICAgICAgICAgInVuaWNvZGUob2JqZWN0PScnKSAtPiB1bmljb2RlIG9iamVjdFxuXAordW5pY29kZShzdHJpbmdbLCBlbmNvZGluZ1ssIGVycm9yc11dKSAtPiB1bmljb2RlIG9iamVjdFxuXAogXG5cCiBDcmVhdGUgYSBuZXcgVW5pY29kZSBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gZW5jb2RlZCBzdHJpbmcuXG5cCiBlbmNvZGluZyBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBkZWZhdWx0IHN0cmluZyBlbmNvZGluZy5cblwKQEAgLTg4MDQsOCArODg4Nyw2IEBACiAKIHZvaWQgX1B5VW5pY29kZV9Jbml0KHZvaWQpCiB7Ci0gICAgaW50IGk7Ci0KICAgICAvKiBYWFggLSBtb3ZlIHRoaXMgYXJyYXkgdG8gdW5pY29kZWN0eXBlLmMgPyAqLwogICAgIFB5X1VOSUNPREUgbGluZWJyZWFrW10gPSB7CiAgICAgICAgIDB4MDAwQSwgLyogTElORSBGRUVEICovCkBAIC04ODE5LDE1ICs4OTAwLDEyIEBACiAgICAgfTsKIAogICAgIC8qIEluaXQgdGhlIGltcGxlbWVudGF0aW9uICovCi0gICAgZnJlZV9saXN0ID0gTlVMTDsKLSAgICBudW1mcmVlID0gMDsKLSAgICB1bmljb2RlX2VtcHR5ID0gX1B5VW5pY29kZV9OZXcoMCk7Ci0gICAgaWYgKCF1bmljb2RlX2VtcHR5KQotICAgICAgICByZXR1cm47CisgICAgaWYgKCF1bmljb2RlX2VtcHR5KSB7CisgICAgICAgIHVuaWNvZGVfZW1wdHkgPSBfUHlVbmljb2RlX05ldygwKTsKKyAgICAgICAgaWYgKCF1bmljb2RlX2VtcHR5KQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KIAotICAgIHN0cmNweSh1bmljb2RlX2RlZmF1bHRfZW5jb2RpbmcsICJhc2NpaSIpOwotICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLSAgICAgICAgdW5pY29kZV9sYXRpbjFbaV0gPSBOVUxMOwogICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5VW5pY29kZV9UeXBlKSA8IDApCiAgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgJ3VuaWNvZGUnIik7CiAKQEAgLTg4MzcsNiArODkxNSwxMiBAQAogICAgICAgICApOwogCiAgICAgUHlUeXBlX1JlYWR5KCZFbmNvZGluZ01hcFR5cGUpOworCisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlGaWVsZE5hbWVJdGVyX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBmaWVsZCBuYW1lIGl0ZXJhdG9yIHR5cGUiKTsKKworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5Rm9ybWF0dGVySXRlcl9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgZm9ybWF0dGVyIGl0ZXIgdHlwZSIpOwogfQogCiAvKiBGaW5hbGl6ZSB0aGUgVW5pY29kZSBpbXBsZW1lbnRhdGlvbiAqLwpAQCAtODg2NiwxNSArODk1MCwxMSBAQAogewogICAgIGludCBpOwogCi0gICAgUHlfWERFQ1JFRih1bmljb2RlX2VtcHR5KTsKLSAgICB1bmljb2RlX2VtcHR5ID0gTlVMTDsKKyAgICBQeV9DTEVBUih1bmljb2RlX2VtcHR5KTsKIAotICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewotICAgICAgICBpZiAodW5pY29kZV9sYXRpbjFbaV0pIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRih1bmljb2RlX2xhdGluMVtpXSk7Ci0gICAgICAgICAgICB1bmljb2RlX2xhdGluMVtpXSA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICBQeV9DTEVBUih1bmljb2RlX2xhdGluMVtpXSk7CisKICAgICAodm9pZClQeVVuaWNvZGVfQ2xlYXJGcmVlTGlzdCgpOwogfQogCmRpZmYgLS1naXQgYS9PYmplY3RzL3dlYWtyZWZvYmplY3QuYyBiL09iamVjdHMvd2Vha3JlZm9iamVjdC5jCmluZGV4IDBlNDZkOTIuLjg3MWMyNDggMTAwNjQ0Ci0tLSBhL09iamVjdHMvd2Vha3JlZm9iamVjdC5jCisrKyBiL09iamVjdHMvd2Vha3JlZm9iamVjdC5jCkBAIC01Miw5ICs1Miw4IEBACiB7CiAgICAgUHlPYmplY3QgKmNhbGxiYWNrID0gc2VsZi0+d3JfY2FsbGJhY2s7CiAKLSAgICBpZiAoUHlXZWFrcmVmX0dFVF9PQkpFQ1Qoc2VsZikgIT0gUHlfTm9uZSkgewotICAgICAgICBQeVdlYWtSZWZlcmVuY2UgKipsaXN0ID0gR0VUX1dFQUtSRUZTX0xJU1RQVFIoCi0gICAgICAgICAgICBQeVdlYWtyZWZfR0VUX09CSkVDVChzZWxmKSk7CisgICAgaWYgKHNlbGYtPndyX29iamVjdCAhPSBQeV9Ob25lKSB7CisgICAgICAgIFB5V2Vha1JlZmVyZW5jZSAqKmxpc3QgPSBHRVRfV0VBS1JFRlNfTElTVFBUUihzZWxmLT53cl9vYmplY3QpOwogCiAgICAgICAgIGlmICgqbGlzdCA9PSBzZWxmKQogICAgICAgICAgICAgLyogSWYgJ3NlbGYnIGlzIHRoZSBlbmQgb2YgdGhlIGxpc3QgKGFuZCB0aHVzIHNlbGYtPndyX25leHQgPT0gTlVMTCkKQEAgLTE2OCwxMyArMTY3LDIxIEBACiAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICAgZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2sobmFtZW9iaikpCiAgICAgICAgICAgICAgICAgbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyhuYW1lb2JqKTsKLSAgICAgICAgUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAotICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPyAiPHdlYWtyZWYgYXQgJXA7IHRvICclLjUwcycgYXQgJXAgKCVzKT4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA6ICI8d2Vha3JlZiBhdCAlcDsgdG8gJyUuNTBzJyBhdCAlcD4iLAotICAgICAgICAgICAgICAgICAgICAgIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShQeVdlYWtyZWZfR0VUX09CSkVDVChzZWxmKSktPnRwX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgUHlXZWFrcmVmX0dFVF9PQkpFQ1Qoc2VsZiksCi0gICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgIGlmIChuYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIjx3ZWFrcmVmIGF0ICVwOyB0byAnJS41MHMnIGF0ICVwICglcyk+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShQeVdlYWtyZWZfR0VUX09CSkVDVChzZWxmKSktPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5V2Vha3JlZl9HRVRfT0JKRUNUKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIjx3ZWFrcmVmIGF0ICVwOyB0byAnJS41MHMnIGF0ICVwPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoUHlXZWFrcmVmX0dFVF9PQkpFQ1Qoc2VsZikpLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeVdlYWtyZWZfR0VUX09CSkVDVChzZWxmKSk7CisgICAgICAgIH0KICAgICAgICAgUHlfWERFQ1JFRihuYW1lb2JqKTsKICAgICB9CiAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmZmVyKTsKQEAgLTE4NywxNSArMTk0LDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogd2Vha3JlZl9yaWNoY29tcGFyZShQeVdlYWtSZWZlcmVuY2UqIHNlbGYsIFB5V2Vha1JlZmVyZW5jZSogb3RoZXIsIGludCBvcCkKIHsKLSAgICBpZiAob3AgIT0gUHlfRVEgfHwgc2VsZi0+b2JfdHlwZSAhPSBvdGhlci0+b2JfdHlwZSkgeworICAgIGlmICgob3AgIT0gUHlfRVEgJiYgb3AgIT0gUHlfTkUpIHx8IHNlbGYtPm9iX3R5cGUgIT0gb3RoZXItPm9iX3R5cGUpIHsKICAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKICAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwogICAgIH0KICAgICBpZiAoUHlXZWFrcmVmX0dFVF9PQkpFQ1Qoc2VsZikgPT0gUHlfTm9uZQogICAgICAgICB8fCBQeVdlYWtyZWZfR0VUX09CSkVDVChvdGhlcikgPT0gUHlfTm9uZSkgewotICAgICAgICBQeU9iamVjdCAqcmVzID0gc2VsZj09b3RoZXIgPyBQeV9UcnVlIDogUHlfRmFsc2U7Ci0gICAgICAgIFB5X0lOQ1JFRihyZXMpOwotICAgICAgICByZXR1cm4gcmVzOworICAgICAgICBpbnQgcmVzID0gKHNlbGYgPT0gb3RoZXIpOworICAgICAgICBpZiAob3AgPT0gUHlfTkUpCisgICAgICAgICAgICByZXMgPSAhcmVzOworICAgICAgICBpZiAocmVzKQorICAgICAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKICAgICB9CiAgICAgcmV0dXJuIFB5T2JqZWN0X1JpY2hDb21wYXJlKFB5V2Vha3JlZl9HRVRfT0JKRUNUKHNlbGYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVdlYWtyZWZfR0VUX09CSkVDVChvdGhlciksIG9wKTsKZGlmZiAtLWdpdCBhL1BDL1ZDNi9iejIuZHNwIGIvUEMvVkM2L2J6Mi5kc3AKaW5kZXggM2MxNjRmYS4uMzUyY2JhZCAxMDA2NDQKLS0tIGEvUEMvVkM2L2J6Mi5kc3AKKysrIGIvUEMvVkM2L2J6Mi5kc3AKQEAgLTQ0LDcgKzQ0LDcgQEAKICMgUFJPUCBUYXJnZXRfRGlyICIiDQogRjkwPWRmLmV4ZQ0KICMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9EICJQeV9CVUlMRF9DT1JFX01PRFVMRSIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvRkQgL2MNCi0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9HWCAvWmkgL08yIC9JICIuLlwuLlxJbmNsdWRlIiAvSSAiLi4iIC9JICIuLlwuLlwuLlxiemlwMi0xLjAuNSIgL0QgIlB5X0JVSUxEX0NPUkVfTU9EVUxFIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL1lYIC9GRCAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL0dYIC9aaSAvTzIgL0kgIi4uXC4uXEluY2x1ZGUiIC9JICIuLiIgL0kgIi4uXC4uXC4uXGJ6aXAyLTEuMC42IiAvRCAiUHlfQlVJTERfQ09SRV9NT0RVTEUiIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jDQogIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyDQogIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMg0KICMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciDQpAQCAtNTQsNyArNTQsNyBAQAogIyBBREQgQlNDMzIgL25vbG9nbw0KIExJTkszMj1saW5rLmV4ZQ0KICMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hY2hpbmU6STM4Ng0KLSMgQUREIExJTkszMiAuLlwuLlwuLlxiemlwMi0xLjAuNVxsaWJiejIubGliIC9ub2xvZ28gL2Jhc2U6IjB4MUQxNzAwMDAiIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9ub2RlZmF1bHRsaWI6ImxpYmMiIC9vdXQ6Ii4vYnoyLnB5ZCINCisjIEFERCBMSU5LMzIgLi5cLi5cLi5cYnppcDItMS4wLjZcbGliYnoyLmxpYiAvbm9sb2dvIC9iYXNlOiIweDFEMTcwMDAwIiAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NiAvbm9kZWZhdWx0bGliOiJsaWJjIiAvb3V0OiIuL2J6Mi5weWQiDQogIyBTVUJUUkFDVCBMSU5LMzIgL3BkYjpub25lIC9ub2RlZmF1bHRsaWINCiANCiAhRUxTRUlGICAiJChDRkcpIiA9PSAiYnoyIC0gV2luMzIgRGVidWciDQpAQCAtNzIsNyArNzIsNyBAQAogIyBQUk9QIFRhcmdldF9EaXIgIiINCiBGOTA9ZGYuZXhlDQogIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0QgIlB5X0JVSUxEX0NPUkVfTU9EVUxFIiAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9GRCAvYw0KLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvSSAiLi5cLi5cSW5jbHVkZSIgL0kgIi4uIiAvSSAiLi5cLi5cLi5cYnppcDItMS4wLjUiIC9EICJQeV9CVUlMRF9DT1JFX01PRFVMRSIgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9ZWCAvRkQgL2MNCisjIEFERCBDUFAgL25vbG9nbyAvTURkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0kgIi4uXC4uXEluY2x1ZGUiIC9JICIuLiIgL0kgIi4uXC4uXC4uXGJ6aXAyLTEuMC42IiAvRCAiUHlfQlVJTERfQ09SRV9NT0RVTEUiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jDQogIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyDQogIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMg0KICMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciDQpAQCAtODIsNyArODIsNyBAQAogIyBBREQgQlNDMzIgL25vbG9nbw0KIExJTkszMj1saW5rLmV4ZQ0KICMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KLSMgQUREIExJTkszMiAuLlwuLlwuLlxiemlwMi0xLjAuNVxsaWJiejIubGliIC9ub2xvZ28gL2Jhc2U6IjB4MUQxNzAwMDAiIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9ub2RlZmF1bHRsaWI6Im1zdmNydCIgL25vZGVmYXVsdGxpYjoibGliYyIgL291dDoiLi9iejJfZC5weWQiIC9wZGJ0eXBlOnNlcHQNCisjIEFERCBMSU5LMzIgLi5cLi5cLi5cYnppcDItMS4wLjZcbGliYnoyLmxpYiAvbm9sb2dvIC9iYXNlOiIweDFEMTcwMDAwIiAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NiAvbm9kZWZhdWx0bGliOiJtc3ZjcnQiIC9ub2RlZmF1bHRsaWI6ImxpYmMiIC9vdXQ6Ii4vYnoyX2QucHlkIiAvcGRidHlwZTpzZXB0DQogIyBTVUJUUkFDVCBMSU5LMzIgL3BkYjpub25lDQogDQogIUVORElGIA0KZGlmZiAtLWdpdCBhL1BDL1ZDNi9weXRob25jb3JlLmRzcCBiL1BDL1ZDNi9weXRob25jb3JlLmRzcAppbmRleCA0ZmU0MjZhLi40YzNjZDk4IDEwMDY0NAotLS0gYS9QQy9WQzYvcHl0aG9uY29yZS5kc3AKKysrIGIvUEMvVkM2L3B5dGhvbmNvcmUuZHNwCkBAIC02NjMsNiArNjYzLDEwIEBACiAjIEVuZCBTb3VyY2UgRmlsZQ0KICMgQmVnaW4gU291cmNlIEZpbGUNCiANCitTT1VSQ0U9Li5cLi5cUHl0aG9uXHJhbmRvbS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQogU09VUkNFPS4uXC4uXE9iamVjdHNccmFuZ2VvYmplY3QuYw0KICMgRW5kIFNvdXJjZSBGaWxlDQogIyBCZWdpbiBTb3VyY2UgRmlsZQ0KZGlmZiAtLWdpdCBhL1BDL1ZDNi9yZWFkbWUudHh0IGIvUEMvVkM2L3JlYWRtZS50eHQKaW5kZXggMDNkMjMxOC4uZDQ4NTE3ZCAxMDA2NDQKLS0tIGEvUEMvVkM2L3JlYWRtZS50eHQKKysrIGIvUEMvVkM2L3JlYWRtZS50eHQKQEAgLTEyMCwxNCArMTIwLDE0IEBACiAgICAgRG93bmxvYWQgdGhlIHNvdXJjZSBmcm9tIHRoZSBweXRob24ub3JnIGNvcHkgaW50byB0aGUgZGlzdAogICAgIGRpcmVjdG9yeToKIAotICAgIHN2biBleHBvcnQgaHR0cDovL3N2bi5weXRob24ub3JnL3Byb2plY3RzL2V4dGVybmFsL2J6aXAyLTEuMC41CisgICAgc3ZuIGV4cG9ydCBodHRwOi8vc3ZuLnB5dGhvbi5vcmcvcHJvamVjdHMvZXh0ZXJuYWwvYnppcDItMS4wLjYKIAogICAgIEFuZCByZXF1aXJlcyBidWlsZGluZyBiejIgZmlyc3QuCiAKLSAgICBjZCBkaXN0XGJ6aXAyLTEuMC41CisgICAgY2QgZGlzdFxiemlwMi0xLjAuNgogICAgIG5tYWtlIC1mIG1ha2VmaWxlLm1zYwogCi0gICAgQWxsIG9mIHRoaXMgbWFuYWdlZCB0byBidWlsZCBiemlwMi0xLjAuNVxsaWJiejIubGliLCB3aGljaCB0aGUgUHl0aG9uCisgICAgQWxsIG9mIHRoaXMgbWFuYWdlZCB0byBidWlsZCBiemlwMi0xLjAuNlxsaWJiejIubGliLCB3aGljaCB0aGUgUHl0aG9uCiAgICAgcHJvamVjdCBsaW5rcyBpbi4KIAogCmRpZmYgLS1naXQgYS9QQy9WUzcuMS9weXRob25jb3JlLnZjcHJvaiBiL1BDL1ZTNy4xL3B5dGhvbmNvcmUudmNwcm9qCmluZGV4IGVhNmNlNzguLjIzMGQyZWYgMTAwNjQ0Ci0tLSBhL1BDL1ZTNy4xL3B5dGhvbmNvcmUudmNwcm9qCisrKyBiL1BDL1ZTNy4xL3B5dGhvbmNvcmUudmNwcm9qCkBAIC03NjcsNiArNzY3LDkgQEAKIAkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cUHl0aG9uXHB5dGhvbnJ1bi5jIj4NCiAJCTwvRmlsZT4NCiAJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxQeXRob25ccmFuZG9tLmMiPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCiAJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXE9iamVjdHNccmFuZ2VvYmplY3QuYyI+DQogCQk8L0ZpbGU+DQogCQk8RmlsZQ0KZGlmZiAtLWdpdCBhL1BDL1ZTOC4wL2J6Mi52Y3Byb2ogYi9QQy9WUzguMC9iejIudmNwcm9qCmluZGV4IGU2ZmZkZjIuLmY4NGE2NDUgMTAwNjQ0Ci0tLSBhL1BDL1ZTOC4wL2J6Mi52Y3Byb2oKKysrIGIvUEMvVlM4LjAvYnoyLnZjcHJvagpAQCAtNTMyLDcgKzUzMiw3IEBACiAJCQk8L0ZpbGU+DQogCQk8L0ZpbHRlcj4NCiAJCTxGaWx0ZXINCi0JCQlOYW1lPSJiemlwMiAxLjAuNSBIZWFkZXIgRmlsZXMiDQorCQkJTmFtZT0iYnppcDIgMS4wLjYgSGVhZGVyIEZpbGVzIg0KIAkJCT4NCiAJCQk8RmlsZQ0KIAkJCQlSZWxhdGl2ZVBhdGg9IiQoYnoyRGlyKVxiemxpYi5oIg0KQEAgLTU0NCw3ICs1NDQsNyBAQAogCQkJPC9GaWxlPg0KIAkJPC9GaWx0ZXI+DQogCQk8RmlsdGVyDQotCQkJTmFtZT0iYnppcDIgMS4wLjUgU291cmNlIEZpbGVzIg0KKwkJCU5hbWU9ImJ6aXAyIDEuMC42IFNvdXJjZSBGaWxlcyINCiAJCQk+DQogCQkJPEZpbGUNCiAJCQkJUmVsYXRpdmVQYXRoPSIkKGJ6MkRpcilcYmxvY2tzb3J0LmMiDQpkaWZmIC0tZ2l0IGEvUEMvVlM4LjAvcHlwcm9qZWN0LnZzcHJvcHMgYi9QQy9WUzguMC9weXByb2plY3QudnNwcm9wcwppbmRleCAyNjkyYjg5Yi4uNWE1ZmZmNiAxMDA2NDQKLS0tIGEvUEMvVlM4LjAvcHlwcm9qZWN0LnZzcHJvcHMKKysrIGIvUEMvVlM4LjAvcHlwcm9qZWN0LnZzcHJvcHMKQEAgLTc4LDExICs3OCwxMSBAQAogCS8+DQogCTxVc2VyTWFjcm8NCiAJCU5hbWU9ImJ6MkRpciINCi0JCVZhbHVlPSIkKGV4dGVybmFsc0RpcilcYnppcDItMS4wLjUiDQorCQlWYWx1ZT0iJChleHRlcm5hbHNEaXIpXGJ6aXAyLTEuMC42Ig0KIAkvPg0KIAk8VXNlck1hY3JvDQogCQlOYW1lPSJvcGVuc3NsRGlyIg0KLQkJVmFsdWU9IiQoZXh0ZXJuYWxzRGlyKVxvcGVuc3NsLTAuOS44bCINCisJCVZhbHVlPSIkKGV4dGVybmFsc0Rpcilcb3BlbnNzbC0wLjkuOHkiDQogCS8+DQogCTxVc2VyTWFjcm8NCiAJCU5hbWU9InRjbHRrRGlyIg0KZGlmZiAtLWdpdCBhL1BDL1ZTOC4wL3B5dGhvbmNvcmUudmNwcm9qIGIvUEMvVlM4LjAvcHl0aG9uY29yZS52Y3Byb2oKaW5kZXggZjU5MTk2Ny4uYzgyMzIyNiAxMDA2NDQKLS0tIGEvUEMvVlM4LjAvcHl0aG9uY29yZS52Y3Byb2oKKysrIGIvUEMvVlM4LjAvcHl0aG9uY29yZS52Y3Byb2oKQEAgLTE4MzUsNiArMTgzNSwxMCBAQAogCQkJCT4NCiAJCQk8L0ZpbGU+DQogCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxQeXRob25ccmFuZG9tLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCiAJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxQeXRob25cc3RydWN0bWVtYmVyLmMiDQogCQkJCT4NCiAJCQk8L0ZpbGU+DQpkaWZmIC0tZ2l0IGEvUEMvX3N1YnByb2Nlc3MuYyBiL1BDL19zdWJwcm9jZXNzLmMKaW5kZXggNjc4MDM4Mi4uZmZlOGY0MSAxMDA2NDQKLS0tIGEvUEMvX3N1YnByb2Nlc3MuYworKysgYi9QQy9fc3VicHJvY2Vzcy5jCkBAIC0zMzEsNyArMzMxLDcgQEAKICAgICBQeU9iamVjdCogdmFsdWVzOwogICAgIGNoYXIqIHA7CiAKLSAgICAvKiBjb252ZXJ0IGVudmlyb25tZW50IGRpY3Rpb25hcnkgdG8gd2luZG93cyBlbnZpcm9tZW50IHN0cmluZyAqLworICAgIC8qIGNvbnZlcnQgZW52aXJvbm1lbnQgZGljdGlvbmFyeSB0byB3aW5kb3dzIGVudmlyb25tZW50IHN0cmluZyAqLwogICAgIGlmICghIFB5TWFwcGluZ19DaGVjayhlbnZpcm9ubWVudCkpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAogICAgICAgICAgICAgUHlFeGNfVHlwZUVycm9yLCAiZW52aXJvbm1lbnQgbXVzdCBiZSBkaWN0aW9uYXJ5IG9yIE5vbmUiKTsKQEAgLTM2Nyw3ICszNjcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c2l6ZSArIDEgKyAxOwogICAgICAgICBpZiAodG90YWxzaXplID4gUHlTdHJpbmdfR0VUX1NJWkUob3V0KSkgewogICAgICAgICAgICAgaW50IG9mZnNldCA9IHAgLSBQeVN0cmluZ19BU19TVFJJTkcob3V0KTsKLSAgICAgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJm91dCwgdG90YWxzaXplICsgMTAyNCk7CisgICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmb3V0LCB0b3RhbHNpemUgKyAxMDI0KSkKKyAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICBwID0gUHlTdHJpbmdfQVNfU1RSSU5HKG91dCkgKyBvZmZzZXQ7CiAgICAgICAgIH0KICAgICAgICAgbWVtY3B5KHAsIFB5U3RyaW5nX0FTX1NUUklORyhrZXkpLCBrc2l6ZSk7CkBAIC0zODMsNyArMzg0LDcgQEAKICAgICBfUHlTdHJpbmdfUmVzaXplKCZvdXQsIHAgLSBQeVN0cmluZ19BU19TVFJJTkcob3V0KSk7CiAKICAgICAvKiBQeU9iamVjdF9QcmludChvdXQsIHN0ZG91dCwgMCk7ICovCi0KK2V4aXQ6CiAgICAgUHlfWERFQ1JFRihrZXlzKTsKICAgICBQeV9YREVDUkVGKHZhbHVlcyk7CiAKQEAgLTY3MCw0ICs2NzEsNSBAQAogICAgIGRlZmludChkLCAiV0FJVF9PQkpFQ1RfMCIsIFdBSVRfT0JKRUNUXzApOwogICAgIGRlZmludChkLCAiQ1JFQVRFX05FV19DT05TT0xFIiwgQ1JFQVRFX05FV19DT05TT0xFKTsKICAgICBkZWZpbnQoZCwgIkNSRUFURV9ORVdfUFJPQ0VTU19HUk9VUCIsIENSRUFURV9ORVdfUFJPQ0VTU19HUk9VUCk7CisgICAgZGVmaW50KGQsICJTVElMTF9BQ1RJVkUiLCBTVElMTF9BQ1RJVkUpOwogfQpkaWZmIC0tZ2l0IGEvUEMvX3dpbnJlZy5jIGIvUEMvX3dpbnJlZy5jCmluZGV4IDQ0NWMzZWQuLmY3NTdhYTUgMTAwNjQ0Ci0tLSBhL1BDL193aW5yZWcuYworKysgYi9QQy9fd2lucmVnLmMKQEAgLTc1Myw3ICs3NTMsOCBAQAogICAgIFB5X3NzaXplX3QgaSxqOwogICAgIHN3aXRjaCAodHlwKSB7CiAgICAgICAgIGNhc2UgUkVHX0RXT1JEOgotICAgICAgICAgICAgaWYgKHZhbHVlICE9IFB5X05vbmUgJiYgIVB5SW50X0NoZWNrKHZhbHVlKSkKKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBQeV9Ob25lICYmCisgICAgICAgICAgICAgICAgIShQeUludF9DaGVjayh2YWx1ZSkgfHwgUHlMb25nX0NoZWNrKHZhbHVlKSkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgKnJldERhdGFCdWYgPSAoQllURSAqKVB5TWVtX05FVyhEV09SRCwgMSk7CiAgICAgICAgICAgICBpZiAoKnJldERhdGFCdWY9PU5VTEwpewpAQCAtNzY1LDEwICs3NjYsMTAgQEAKICAgICAgICAgICAgICAgICBEV09SRCB6ZXJvID0gMDsKICAgICAgICAgICAgICAgICBtZW1jcHkoKnJldERhdGFCdWYsICZ6ZXJvLCBzaXplb2YoRFdPUkQpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtZW1jcHkoKnJldERhdGFCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICZQeUludF9BU19MT05HKChQeUludE9iamVjdCAqKXZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKERXT1JEKSk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBEV09SRCBkID0gUHlMb25nX0FzVW5zaWduZWRMb25nKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoKnJldERhdGFCdWYsICZkLCBzaXplb2YoRFdPUkQpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFR19TWjoKICAgICAgICAgY2FzZSBSRUdfRVhQQU5EX1NaOgpAQCAtODgyLDEyICs4ODMsMTQgQEAKICAgICAgICAgLyogQUxTTyBoYW5kbGUgQUxMIHVua25vd24gZGF0YSB0eXBlcyBoZXJlLiAgRXZlbiBpZiB3ZSBjYW4ndAogICAgICAgICAgICBzdXBwb3J0IGl0IG5hdGl2ZWx5LCB3ZSBzaG91bGQgaGFuZGxlIHRoZSBiaXRzLiAqLwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYgKHZhbHVlID09IFB5X05vbmUpCisgICAgICAgICAgICBpZiAodmFsdWUgPT0gUHlfTm9uZSkgewogICAgICAgICAgICAgICAgICpyZXREYXRhU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgKnJldERhdGFCdWYgPSBOVUxMOworICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgdm9pZCAqc3JjX2J1ZjsKICAgICAgICAgICAgICAgICBQeUJ1ZmZlclByb2NzICpwYiA9IHZhbHVlLT5vYl90eXBlLT50cF9hc19idWZmZXI7Ci0gICAgICAgICAgICAgICAgaWYgKHBiPT1OVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKHBiID09IE5VTEwgfHwgcGItPmJmX2dldHJlYWRidWZmZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgIk9iamVjdHMgb2YgdHlwZSAnJXMnIGNhbiBub3QgIgogICAgICAgICAgICAgICAgICAgICAgICAgImJlIHVzZWQgYXMgYmluYXJ5IHJlZ2lzdHJ5IHZhbHVlcyIsCkBAIC04OTUsOSArODk4LDExIEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgKnJldERhdGFTaXplID0gKCpwYi0+YmZfZ2V0cmVhZGJ1ZmZlcikodmFsdWUsIDAsICZzcmNfYnVmKTsKLSAgICAgICAgICAgICAgICAqcmV0RGF0YUJ1ZiA9IChCWVRFICopUHlNZW1fTkVXKGNoYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmV0RGF0YVNpemUpOwotICAgICAgICAgICAgICAgIGlmICgqcmV0RGF0YUJ1Zj09TlVMTCl7CisgICAgICAgICAgICAgICAgaWYgKCpyZXREYXRhU2l6ZSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqcmV0RGF0YUJ1ZiA9IChCWVRFICopUHlNZW1fTkVXKGNoYXIsICpyZXREYXRhU2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKCpyZXREYXRhQnVmID09IE5VTEwpewogICAgICAgICAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgfQpAQCAtOTE3LDkgKzkyMiw5IEBACiAgICAgc3dpdGNoICh0eXApIHsKICAgICAgICAgY2FzZSBSRUdfRFdPUkQ6CiAgICAgICAgICAgICBpZiAocmV0RGF0YVNpemUgPT0gMCkKLSAgICAgICAgICAgICAgICBvYkRhdGEgPSBQeV9CdWlsZFZhbHVlKCJpIiwgMCk7CisgICAgICAgICAgICAgICAgb2JEYXRhID0gUHlfQnVpbGRWYWx1ZSgiayIsIDApOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG9iRGF0YSA9IFB5X0J1aWxkVmFsdWUoImkiLAorICAgICAgICAgICAgICAgIG9iRGF0YSA9IFB5X0J1aWxkVmFsdWUoImsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQgKilyZXREYXRhQnVmKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFR19TWjoKQEAgLTk0Nyw4ICs5NTIsMTAgQEAKIAogICAgICAgICAgICAgICAgIGZpeHVwTXVsdGlTWihzdHIsIHJldERhdGFCdWYsIHJldERhdGFTaXplKTsKICAgICAgICAgICAgICAgICBvYkRhdGEgPSBQeUxpc3RfTmV3KHMpOwotICAgICAgICAgICAgICAgIGlmIChvYkRhdGEgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBpZiAob2JEYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShzdHIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgczsgaW5kZXgrKykKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4gPSBfbWJzdHJsZW4oc3RyW2luZGV4XSk7CkBAIC05NTYsNiArOTYzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWdpc3RyeSBzdHJpbmcgaXMgdG9vIGxvbmcgZm9yIGEgUHl0aG9uIHN0cmluZyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG9iRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHN0cik7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbShvYkRhdGEsCmRpZmYgLS1naXQgYS9QQy9tc3ZjcnRtb2R1bGUuYyBiL1BDL21zdmNydG1vZHVsZS5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL1BDL3B5Y29uZmlnLmggYi9QQy9weWNvbmZpZy5oCmluZGV4IDFjZmM1OWIuLmE0NWQ1ZWIgMTAwNjQ0Ci0tLSBhL1BDL3B5Y29uZmlnLmgKKysrIGIvUEMvcHljb25maWcuaApAQCAtMzQyLDcgKzM0Miw3IEBACiAjCWRlZmluZSBTSVpFT0ZfRlBPU19UIDgKICMJZGVmaW5lIFNJWkVPRl9IS0VZIDgKICMJZGVmaW5lIFNJWkVPRl9TSVpFX1QgOAotLyogY29uZmlndXJlLmluIGRlZmluZXMgSEFWRV9MQVJHRUZJTEVfU1VQUE9SVCBpZmYgSEFWRV9MT05HX0xPTkcsCisvKiBjb25maWd1cmUuYWMgZGVmaW5lcyBIQVZFX0xBUkdFRklMRV9TVVBQT1JUIGlmZiBIQVZFX0xPTkdfTE9ORywKICAgIHNpemVvZihvZmZfdCkgPiBzaXplb2YobG9uZyksIGFuZCBzaXplb2YoUFlfTE9OR19MT05HKSA+PSBzaXplb2Yob2ZmX3QpLgogICAgT24gV2luNjQgdGhlIHNlY29uZCBjb25kaXRpb24gaXMgbm90IHRydWUsIGJ1dCBpZiBmcG9zX3QgcmVwbGFjZXMgb2ZmX3QKICAgIHRoZW4gdGhpcyBpcyB0cnVlLiBUaGUgdXNlcyBvZiBIQVZFX0xBUkdFRklMRV9TVVBQT1JUIGltcGx5IHRoYXQgV2luNjQKQEAgLTQzNSw2ICs0MzUsMTEgQEAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgY29weXNpZ24nIGZ1bmN0aW9uLiAqLwogI2RlZmluZSBIQVZFX0NPUFlTSUdOIDEKIAorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGByb3VuZCcgZnVuY3Rpb24uICovCisjaWYgX01TQ19WRVIgPj0gMTgwMAorI2RlZmluZSBIQVZFX1JPVU5EIDEKKyNlbmRpZgorCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGlzaW5mJyBtYWNyby4gKi8KICNkZWZpbmUgSEFWRV9ERUNMX0lTSU5GIDEKIApkaWZmIC0tZ2l0IGEvUEMvcHl0aG9uX250LnJjIGIvUEMvcHl0aG9uX250LnJjCmluZGV4IGUxMzI4MzcuLjNmNTU3MjMgMTAwNjQ0Ci0tLSBhL1BDL3B5dGhvbl9udC5yYworKysgYi9QQy9weXRob25fbnQucmMKQEAgLTYxLDcgKzYxLDcgQEAKICAgICAgICAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAiUHl0aG9uIENvcmVcMCIKICAgICAgICAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsIFBZVEhPTl9WRVJTSU9OCiAgICAgICAgICAgICBWQUxVRSAiSW50ZXJuYWxOYW1lIiwgIlB5dGhvbiBETExcMCIKLSAgICAgICAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsICJDb3B5cmlnaHQgqSAyMDAxLTIwMDggUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uIENvcHlyaWdodCCpIDIwMDAgQmVPcGVuLmNvbS4gQ29weXJpZ2h0IKkgMTk5NS0yMDAxIENOUkkuIENvcHlyaWdodCCpIDE5OTEtMTk5NSBTTUMuXDAiCisgICAgICAgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiQ29weXJpZ2h0IKkgMjAwMS0yMDE0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBDb3B5cmlnaHQgqSAyMDAwIEJlT3Blbi5jb20uIENvcHlyaWdodCCpIDE5OTUtMjAwMSBDTlJJLiBDb3B5cmlnaHQgqSAxOTkxLTE5OTUgU01DLlwwIgogICAgICAgICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCBQWVRIT05fRExMX05BTUUgIlwwIgogICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgIlB5dGhvblwwIgogICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgUFlUSE9OX1ZFUlNJT04KZGlmZiAtLWdpdCBhL1BDYnVpbGQvYnVpbGRfc3NsLnB5IGIvUENidWlsZC9idWlsZF9zc2wucHkKaW5kZXggZjgxZTBiYy4uMTUxYWE1NCAxMDA2NDQKLS0tIGEvUENidWlsZC9idWlsZF9zc2wucHkKKysrIGIvUENidWlsZC9idWlsZF9zc2wucHkKQEAgLTY0LDM3ICs2NCwxMyBAQAogICAgIHByaW50KCIgUGxlYXNlIGluc3RhbGwgQWN0aXZlUGVybCBhbmQgZW5zdXJlIGl0IGFwcGVhcnMgb24geW91ciBwYXRoIikKICAgICByZXR1cm4gTm9uZQogCi0jIExvY2F0ZSB0aGUgYmVzdCBTU0wgZGlyZWN0b3J5IGdpdmVuIGEgZmV3IHJvb3RzIHRvIGxvb2sgaW50by4KLWRlZiBmaW5kX2Jlc3Rfc3NsX2Rpcihzb3VyY2VzKToKLSAgICBjYW5kaWRhdGVzID0gW10KLSAgICBmb3IgcyBpbiBzb3VyY2VzOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICAjIG5vdGU6IGRvIG5vdCBhYnNwYXRoIHM7IHRoZSBidWlsZCB3aWxsIGZhaWwgaWYgYW55Ci0gICAgICAgICAgICAjIGhpZ2hlciB1cCBkaXJlY3RvcnkgbmFtZSBoYXMgc3BhY2VzIGluIGl0LgotICAgICAgICAgICAgZm5hbWVzID0gb3MubGlzdGRpcihzKQotICAgICAgICBleGNlcHQgb3MuZXJyb3I6Ci0gICAgICAgICAgICBmbmFtZXMgPSBbXQotICAgICAgICBmb3IgZm5hbWUgaW4gZm5hbWVzOgotICAgICAgICAgICAgZnFuID0gb3MucGF0aC5qb2luKHMsIGZuYW1lKQotICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmcW4pIGFuZCBmbmFtZS5zdGFydHN3aXRoKCJvcGVuc3NsLSIpOgotICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMuYXBwZW5kKGZxbikKLSAgICAjIE5vdyB3ZSBoYXZlIGFsbCB0aGUgY2FuZGlkYXRlcywgbG9jYXRlIHRoZSBiZXN0LgotICAgIGJlc3RfcGFydHMgPSBbXQotICAgIGJlc3RfbmFtZSA9IE5vbmUKLSAgICBmb3IgYyBpbiBjYW5kaWRhdGVzOgotICAgICAgICBwYXJ0cyA9IHJlLnNwbGl0KCJbLi1dIiwgb3MucGF0aC5iYXNlbmFtZShjKSlbMTpdCi0gICAgICAgICMgZWcgLSBvcGVuc3NsLTAuOS43LWJldGExIC0gaWdub3JlIGFsbCAiYmV0YSIgb3IgYW55IG90aGVyIHF1YWxpZmllcnMKLSAgICAgICAgaWYgbGVuKHBhcnRzKSA+PSA0OgotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgaWYgcGFydHMgPiBiZXN0X3BhcnRzOgotICAgICAgICAgICAgYmVzdF9wYXJ0cyA9IHBhcnRzCi0gICAgICAgICAgICBiZXN0X25hbWUgPSBjCi0gICAgaWYgYmVzdF9uYW1lIGlzIG5vdCBOb25lOgotICAgICAgICBwcmludCgiRm91bmQgYW4gU1NMIGRpcmVjdG9yeSBhdCAnJXMnIiAlIChiZXN0X25hbWUsKSkKLSAgICBlbHNlOgotICAgICAgICBwcmludCgiQ291bGQgbm90IGZpbmQgYW4gU1NMIGRpcmVjdG9yeSBpbiAnJXMnIiAlIChzb3VyY2VzLCkpCi0gICAgc3lzLnN0ZG91dC5mbHVzaCgpCi0gICAgcmV0dXJuIGJlc3RfbmFtZQorIyBGZXRjaCBTU0wgZGlyZWN0b3J5IGZyb20gVkMgcHJvcGVydGllcworZGVmIGdldF9zc2xfZGlyKCk6CisgICAgcHJvcGZpbGUgPSAob3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICdweXByb2plY3QudnNwcm9wcycpKQorICAgIHdpdGggb3Blbihwcm9wZmlsZSkgYXMgZjoKKyAgICAgICAgbSA9IHJlLnNlYXJjaCgnb3BlbnNzbC0oW14iXSspIicsIGYucmVhZCgpKQorICAgICAgICByZXR1cm4gIi4uXC4uXG9wZW5zc2wtIittLmdyb3VwKDEpCisKIAogZGVmIGNyZWF0ZV9tYWtlZmlsZTY0KG1ha2VmaWxlLCBtMzIpOgogICAgICIiIkNyZWF0ZSBhbmQgZml4IG1ha2VmaWxlIGZvciA2NGJpdApAQCAtMTkwLDcgKzE2Niw3IEBACiAgICAgICAgIHByaW50KCJObyBQZXJsIGluc3RhbGxhdGlvbiB3YXMgZm91bmQuIEV4aXN0aW5nIE1ha2VmaWxlcyBhcmUgdXNlZC4iKQogICAgIHN5cy5zdGRvdXQuZmx1c2goKQogICAgICMgTG9vayBmb3IgU1NMIDIgbGV2ZWxzIHVwIGZyb20gcGNidWlsZCAtIGllLCBzYW1lIHBsYWNlIHpsaWIgZXRjIGFsbCBsaXZlLgotICAgIHNzbF9kaXIgPSBmaW5kX2Jlc3Rfc3NsX2RpcigoIi4uXFwuLiIsKSkKKyAgICBzc2xfZGlyID0gZ2V0X3NzbF9kaXIoKQogICAgIGlmIHNzbF9kaXIgaXMgTm9uZToKICAgICAgICAgc3lzLmV4aXQoMSkKIApAQCAtMjMxLDkgKzIwNyw5IEBACiAKICAgICAgICAgIyBOb3cgcnVuIG1ha2UuCiAgICAgICAgIGlmIGFyY2ggPT0gImFtZDY0IjoKLSAgICAgICAgICAgIHJjID0gb3Muc3lzdGVtKHIibWw2NCAtYyAtRm9tc1x1cHRhYmxlLm9iaiBtc1x1cHRhYmxlLmFzbSIpCisgICAgICAgICAgICByYyA9IG9zLnN5c3RlbSgibmFzbSAtZiB3aW42NCAtRE5FQVIgLU94IC1nIG1zXFx1cHRhYmxlLmFzbSIpCiAgICAgICAgICAgICBpZiByYzoKLSAgICAgICAgICAgICAgICBwcmludCgibWw2NCBhc3NlbWJsZXIgaGFzIGZhaWxlZC4iKQorICAgICAgICAgICAgICAgIHByaW50KCJuYXNtIGFzc2VtYmxlciBoYXMgZmFpbGVkLiIpCiAgICAgICAgICAgICAgICAgc3lzLmV4aXQocmMpCiAKICAgICAgICAgc2h1dGlsLmNvcHkociJjcnlwdG9cYnVpbGRpbmZfJXMuaCIgJSBhcmNoLCByImNyeXB0b1xidWlsZGluZi5oIikKZGlmZiAtLWdpdCBhL1BDYnVpbGQvYnoyLnZjcHJvaiBiL1BDYnVpbGQvYnoyLnZjcHJvagppbmRleCAwNGFkN2QzLi4wODhmYjQ2IDEwMDY0NAotLS0gYS9QQ2J1aWxkL2J6Mi52Y3Byb2oKKysrIGIvUENidWlsZC9iejIudmNwcm9qCkBAIC01MzIsNyArNTMyLDcgQEAKIAkJCTwvRmlsZT4NCiAJCTwvRmlsdGVyPg0KIAkJPEZpbHRlcg0KLQkJCU5hbWU9ImJ6aXAyIDEuMC41IEhlYWRlciBGaWxlcyINCisJCQlOYW1lPSJiemlwMiAxLjAuNiBIZWFkZXIgRmlsZXMiDQogCQkJPg0KIAkJCTxGaWxlDQogCQkJCVJlbGF0aXZlUGF0aD0iJChiejJEaXIpXGJ6bGliLmgiDQpAQCAtNTQ0LDcgKzU0NCw3IEBACiAJCQk8L0ZpbGU+DQogCQk8L0ZpbHRlcj4NCiAJCTxGaWx0ZXINCi0JCQlOYW1lPSJiemlwMiAxLjAuNSBTb3VyY2UgRmlsZXMiDQorCQkJTmFtZT0iYnppcDIgMS4wLjYgU291cmNlIEZpbGVzIg0KIAkJCT4NCiAJCQk8RmlsZQ0KIAkJCQlSZWxhdGl2ZVBhdGg9IiQoYnoyRGlyKVxibG9ja3NvcnQuYyINCmRpZmYgLS1naXQgYS9QQ2J1aWxkL3BnaW5zdHJ1bWVudC52c3Byb3BzIGIvUENidWlsZC9wZ2luc3RydW1lbnQudnNwcm9wcwppbmRleCAzOGM1ZjE4Li45OWMxMTdiIDEwMDY0NAotLS0gYS9QQ2J1aWxkL3BnaW5zdHJ1bWVudC52c3Byb3BzCisrKyBiL1BDYnVpbGQvcGdpbnN0cnVtZW50LnZzcHJvcHMKQEAgLTIyLDcgKzIyLDcgQEAKIAk8VG9vbA0KIAkJTmFtZT0iVkNMaW5rZXJUb29sIg0KIAkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIg0KLQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiINCisJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjEiDQogCQlMaW5rVGltZUNvZGVHZW5lcmF0aW9uPSIyIg0KIAkJUHJvZmlsZUd1aWRlZERhdGFiYXNlPSIkKFNvbHV0aW9uRGlyKSQoUGxhdGZvcm1OYW1lKS1wZ2lcJChUYXJnZXROYW1lKS5wZ2QiDQogCQlJbXBvcnRMaWJyYXJ5PSIkKE91dERpclBHSSlcJChUYXJnZXROYW1lKS5saWIiDQpkaWZmIC0tZ2l0IGEvUENidWlsZC9weXByb2plY3QudnNwcm9wcyBiL1BDYnVpbGQvcHlwcm9qZWN0LnZzcHJvcHMKaW5kZXggYWU1NTcwYi4uMGRkNjFlNSAxMDA2NDQKLS0tIGEvUENidWlsZC9weXByb2plY3QudnNwcm9wcworKysgYi9QQ2J1aWxkL3B5cHJvamVjdC52c3Byb3BzCkBAIC03OCwxMSArNzgsMTEgQEAKIAkvPg0KIAk8VXNlck1hY3JvDQogCQlOYW1lPSJiejJEaXIiDQotCQlWYWx1ZT0iJChleHRlcm5hbHNEaXIpXGJ6aXAyLTEuMC41Ig0KKwkJVmFsdWU9IiQoZXh0ZXJuYWxzRGlyKVxiemlwMi0xLjAuNiINCiAJLz4NCiAJPFVzZXJNYWNybw0KIAkJTmFtZT0ib3BlbnNzbERpciINCi0JCVZhbHVlPSIkKGV4dGVybmFsc0Rpcilcb3BlbnNzbC0wLjkuOGwiDQorCQlWYWx1ZT0iJChleHRlcm5hbHNEaXIpXG9wZW5zc2wtMS4wLjFoIg0KIAkvPg0KIAk8VXNlck1hY3JvDQogCQlOYW1lPSJ0Y2x0a0RpciINCmRpZmYgLS1naXQgYS9QQ2J1aWxkL3B5dGhvbmNvcmUudmNwcm9qIGIvUENidWlsZC9weXRob25jb3JlLnZjcHJvagppbmRleCAwM2E5YTY1Li43NjUyOGRjIDEwMDY0NAotLS0gYS9QQ2J1aWxkL3B5dGhvbmNvcmUudmNwcm9qCisrKyBiL1BDYnVpbGQvcHl0aG9uY29yZS52Y3Byb2oKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvUENidWlsZC9yZWFkbWUudHh0IGIvUENidWlsZC9yZWFkbWUudHh0CmluZGV4IDM2NmZjMDcuLjljMDE3ZGYgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvcmVhZG1lLnR4dAorKysgYi9QQ2J1aWxkL3JlYWRtZS50eHQKQEAgLTEsNyArMSw3IEBACiBCdWlsZGluZyBQeXRob24gdXNpbmcgVkMrKyA5LjAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1UaGlzIGRpcmVjdG9yeSBpcyB1c2VkIHRvIGJ1aWxkIFB5dGhvbiBmb3IgV2luMzIgYW5kIHg2NCBwbGF0Zm9ybXMsIGUuZy4gCitUaGlzIGRpcmVjdG9yeSBpcyB1c2VkIHRvIGJ1aWxkIFB5dGhvbiBmb3IgV2luMzIgYW5kIHg2NCBwbGF0Zm9ybXMsIGUuZy4KIFdpbmRvd3MgMjAwMCwgWFAsIFZpc3RhIGFuZCBXaW5kb3dzIFNlcnZlciAyMDA4LiAgSW4gb3JkZXIgdG8gYnVpbGQgMzItYml0CiBkZWJ1ZyBhbmQgcmVsZWFzZSBleGVjdXRhYmxlcywgTWljcm9zb2Z0IFZpc3VhbCBDKysgMjAwOCBFeHByZXNzIEVkaXRpb24gaXMKIHJlcXVpcmVkIGF0IHRoZSB2ZXJ5IGxlYXN0LiAgSW4gb3JkZXIgdG8gYnVpbGQgNjQtYml0IGRlYnVnIGFuZCByZWxlYXNlCkBAIC0yNyw3ICsyNyw3IEBACiAKIFRoZSBzb2x1dGlvbiBpcyBjb25maWd1cmVkIHRvIGJ1aWxkIHRoZSBwcm9qZWN0cyBpbiB0aGUgY29ycmVjdCBvcmRlci4gIkJ1aWxkCiBTb2x1dGlvbiIgb3IgRjcgdGFrZXMgY2FyZSBvZiBkZXBlbmRlbmNpZXMgZXhjZXB0IGZvciB4NjQgYnVpbGRzLiBUbyBtYWtlCi1jcm9zcyBjb21waWxpbmcgeDY0IGJ1aWxkcyBvbiBhIDMyYml0IE9TIHBvc3NpYmxlIHRoZSB4NjQgYnVpbGRzIHJlcXVpcmUgYSAKK2Nyb3NzIGNvbXBpbGluZyB4NjQgYnVpbGRzIG9uIGEgMzJiaXQgT1MgcG9zc2libGUgdGhlIHg2NCBidWlsZHMgcmVxdWlyZSBhCiAzMmJpdCB2ZXJzaW9uIG9mIFB5dGhvbi4KIAogTk9URToKQEAgLTM3LDcgKzM3LDcgQEAKICAgIHJ1bm5pbmcgYSBQeXRob24gY29yZSBidWlsZGJvdCB0ZXN0IHNsYXZlOyBzZWUgU1VCUFJPSkVDVFMgYmVsb3cpCiAKIFdoZW4gdXNpbmcgdGhlIERlYnVnIHNldHRpbmcsIHRoZSBvdXRwdXQgZmlsZXMgaGF2ZSBhIF9kIGFkZGVkIHRvCi10aGVpciBuYW1lOiAgcHl0aG9uMzBfZC5kbGwsIHB5dGhvbl9kLmV4ZSwgcGFyc2VyX2QucHlkLCBhbmQgc28gb24uIEJvdGgKK3RoZWlyIG5hbWU6ICBweXRob24yN19kLmRsbCwgcHl0aG9uX2QuZXhlLCBwYXJzZXJfZC5weWQsIGFuZCBzbyBvbi4gQm90aAogdGhlIGJ1aWxkIGFuZCBydCBiYXRjaCBmaWxlcyBhY2NlcHQgYSAtZCBvcHRpb24gZm9yIGRlYnVnIGJ1aWxkcy4KIAogVGhlIDMyYml0IGJ1aWxkcyBlbmQgdXAgaW4gdGhlIHNvbHV0aW9uIGZvbGRlciBQQ2J1aWxkIHdoaWxlIHRoZSB4NjQgYnVpbGRzCkBAIC00Nyw3ICs0Nyw3IEBACiBMZWdhY3kgc3VwcG9ydAogLS0tLS0tLS0tLS0tLS0KIAotWW91IGNhbiBmaW5kIGJ1aWxkIGRpcmVjdG9yaWVzIGZvciBvbGRlciB2ZXJzaW9ucyBvZiBWaXN1YWwgU3R1ZGlvIGFuZCAKK1lvdSBjYW4gZmluZCBidWlsZCBkaXJlY3RvcmllcyBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgVmlzdWFsIFN0dWRpbyBhbmQKIFZpc3VhbCBDKysgaW4gdGhlIFBDIGRpcmVjdG9yeS4gVGhlIGxlZ2FjeSBidWlsZCBkaXJlY3RvcmllcyBhcmUgbm8gbG9uZ2VyCiBhY3RpdmVseSBtYWludGFpbmVkIGFuZCBtYXkgbm90IHdvcmsgb3V0IG9mIHRoZSBib3guCiAKQEAgLTY0LDcgKzY0LDcgQEAKIAogVmlzdWFsIFN0dWRpbyAyMDA4IHVzZXMgdmVyc2lvbiA5IG9mIHRoZSBDIHJ1bnRpbWUgKE1TVkNSVDkpLiAgVGhlIGV4ZWN1dGFibGVzCiBhcmUgbGlua2VkIHRvIGEgQ1JUICJzaWRlIGJ5IHNpZGUiIGFzc2VtYmx5IHdoaWNoIG11c3QgYmUgcHJlc2VudCBvbiB0aGUgdGFyZ2V0Ci1tYWNoaW5lLiAgVGhpcyBpcyBhdmFsaWJsZSB1bmRlciB0aGUgVkMvUmVkaXN0IGZvbGRlciBvZiB5b3VyIHZpc3VhbCBzdHVkaW8KK21hY2hpbmUuICBUaGlzIGlzIGF2YWlsYWJsZSB1bmRlciB0aGUgVkMvUmVkaXN0IGZvbGRlciBvZiB5b3VyIHZpc3VhbCBzdHVkaW8KIGRpc3RyaWJ1dGlvbi4gT24gWFAgYW5kIGxhdGVyIG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgc3VwcG9ydAogc2lkZS1ieS1zaWRlIGFzc2VtYmxpZXMgaXQgaXMgbm90IGVub3VnaCB0byBoYXZlIHRoZSBtc3ZjcnQ5MC5kbGwgcHJlc2VudCwKIGl0IGhhcyB0byBiZSB0aGVyZSBhcyBhIHdob2xlIGFzc2VtYmx5LCB0aGF0IGlzLCBhIGZvbGRlciB3aXRoIHRoZSAuZGxsCkBAIC0xMDUsNDQgKzEwNSwzNCBAQAogUHl0aG9uLWNvbnRyb2xsZWQgc3VicHJvamVjdHMgdGhhdCB3cmFwIGV4dGVybmFsIHByb2plY3RzOgogX2JzZGRiCiAgICAgV3JhcHMgQmVya2VsZXkgREIgNC43LjI1LCB3aGljaCBpcyBjdXJyZW50bHkgYnVpbHQgYnkgX2JzZGRiLnZjcHJvai4KLSAgICBwcm9qZWN0IChzZWUgYmVsb3cpLgorICAgIHByb2plY3QuCiBfc3FsaXRlMwotICAgIFdyYXBzIFNRTGl0ZSAzLjYuMjEsIHdoaWNoIGlzIGN1cnJlbnRseSBidWlsdCBieSBzcWxpdGUzLnZjcHJvaiAoc2VlIGJlbG93KS4KKyAgICBXcmFwcyBTUUxpdGUgMy42LjIxLCB3aGljaCBpcyBjdXJyZW50bHkgYnVpbHQgYnkgc3FsaXRlMy52Y3Byb2ouCiBfdGtpbnRlcgogICAgIFdyYXBzIHRoZSBUayB3aW5kb3dpbmcgc3lzdGVtLiAgVW5saWtlIF9ic2RkYiBhbmQgX3NxbGl0ZTMsIHRoZXJlJ3Mgbm8KICAgICBjb3JyZXNwb25kaW5nIHRjbHRrLnZjcHJvai10eXBlIHByb2plY3QgdGhhdCBidWlsZHMgVGNsL1RrIGZyb20gdmNwcm9qJ3MKICAgICB3aXRoaW4gb3VyIHBjYnVpbGQuc2xuLCB3aGljaCBtZWFucyB0aGlzIG1vZHVsZSBleHBlY3RzIHRvIGZpbmQgYQogICAgIHByZS1idWlsdCBUY2wvVGsgaW4gZWl0aGVyIC4uXC4uXHRjbHRrIGZvciAzMi1iaXQgb3IgLi5cLi5cdGNsdGs2NCBmb3IKICAgICA2NC1iaXQgKHJlbGF0aXZlIHRvIHRoaXMgZGlyZWN0b3J5KS4gIFNlZSBiZWxvdyBmb3IgaW5zdHJ1Y3Rpb25zIHRvIGJ1aWxkCi0gICAgVGNsL1RrLiAKKyAgICBUY2wvVGsuCiBiejIKICAgICBQeXRob24gd3JhcHBlciBmb3IgdGhlIGxpYmJ6MiBjb21wcmVzc2lvbiBsaWJyYXJ5LiAgSG9tZXBhZ2UKICAgICAgICAgaHR0cDovL3NvdXJjZXMucmVkaGF0LmNvbS9iemlwMi8KICAgICBEb3dubG9hZCB0aGUgc291cmNlIGZyb20gdGhlIHB5dGhvbi5vcmcgY29weSBpbnRvIHRoZSBkaXN0CiAgICAgZGlyZWN0b3J5OgogCi0gICAgc3ZuIGV4cG9ydCBodHRwOi8vc3ZuLnB5dGhvbi5vcmcvcHJvamVjdHMvZXh0ZXJuYWwvYnppcDItMS4wLjUKKyAgICBzdm4gZXhwb3J0IGh0dHA6Ly9zdm4ucHl0aG9uLm9yZy9wcm9qZWN0cy9leHRlcm5hbC9iemlwMi0xLjAuNgogCiAgICAgKiogTk9URTogaWYgeW91IHVzZSB0aGUgVG9vbHNcYnVpbGRib3RcZXh0ZXJuYWwoLWFtZDY0KS5iYXQgYXBwcm9hY2ggZm9yCiAgICAgb2J0YWluaW5nIGV4dGVybmFsIHNvdXJjZXMgdGhlbiB5b3UgZG9uJ3QgbmVlZCB0byBtYW51YWxseSBnZXQgdGhlIHNvdXJjZQogICAgIGFib3ZlIHZpYSBzdWJ2ZXJzaW9uLiAqKgogCi0gICAgQSBjdXN0b20gcHJlLWxpbmsgc3RlcCBpbiB0aGUgYnoyIHByb2plY3Qgc2V0dGluZ3Mgc2hvdWxkIG1hbmFnZSB0bwotICAgIGJ1aWxkIGJ6aXAyLTEuMC41XGxpYmJ6Mi5saWIgYnkgbWFnaWMgYmVmb3JlIGJ6Mi5weWQgKG9yIGJ6Ml9kLnB5ZCkgaXMKLSAgICBsaW5rZWQgaW4gUENidWlsZFwuCi0gICAgSG93ZXZlciwgdGhlIGJ6MiBwcm9qZWN0IGlzIG5vdCBzbWFydCBlbm91Z2ggdG8gcmVtb3ZlIGFueXRoaW5nIHVuZGVyCi0gICAgYnppcDItMS4wLjVcIHdoZW4geW91IGRvIGEgY2xlYW4sIHNvIGlmIHlvdSB3YW50IHRvIHJlYnVpbGQgYnppcDIubGliCi0gICAgeW91IG5lZWQgdG8gY2xlYW4gdXAgYnppcDItMS4wLjVcIGJ5IGhhbmQuCi0KLSAgICBBbGwgb2YgdGhpcyBtYW5hZ2VkIHRvIGJ1aWxkIGxpYmJ6Mi5saWIgaW4gCi0gICAgYnppcDItMS4wLjVcJHBsYXRmb3JtLSRjb25maWd1cmF0aW9uXCwgd2hpY2ggdGhlIFB5dGhvbiBwcm9qZWN0IGxpbmtzIGluLgotCiBfc3NsCiAgICAgUHl0aG9uIHdyYXBwZXIgZm9yIHRoZSBzZWN1cmUgc29ja2V0cyBsaWJyYXJ5LgogCiAgICAgR2V0IHRoZSBzb3VyY2UgY29kZSB0aHJvdWdoCiAKLSAgICBzdm4gZXhwb3J0IGh0dHA6Ly9zdm4ucHl0aG9uLm9yZy9wcm9qZWN0cy9leHRlcm5hbC9vcGVuc3NsLTAuOS44bAorICAgIHN2biBleHBvcnQgaHR0cDovL3N2bi5weXRob24ub3JnL3Byb2plY3RzL2V4dGVybmFsL29wZW5zc2wtMS4wLjFoCiAKICAgICAqKiBOT1RFOiBpZiB5b3UgdXNlIHRoZSBUb29sc1xidWlsZGJvdFxleHRlcm5hbCgtYW1kNjQpLmJhdCBhcHByb2FjaCBmb3IKICAgICBvYnRhaW5pbmcgZXh0ZXJuYWwgc291cmNlcyB0aGVuIHlvdSBkb24ndCBuZWVkIHRvIG1hbnVhbGx5IGdldCB0aGUgc291cmNlCkBAIC0xNTQsMTggKzE0NCwxNiBAQAogCiAgICAgWW91IG11c3QgaW5zdGFsbCB0aGUgTkFTTSBhc3NlbWJsZXIgZnJvbQogICAgICAgICBodHRwOi8vbmFzbS5zZi5uZXQKLSAgICBmb3IgeDg2IGJ1aWxkcy4gIFB1dCBuYXNtdy5leGUgYW55d2hlcmUgaW4geW91ciBQQVRILgotICAgIE5vdGU6IHJlY2VudCByZWxlYXNlcyBvZiBuYXNtIG9ubHkgaGF2ZSBuYXNtLmV4ZS4gSnVzdCByZW5hbWUgaXQgdG8gCi0gICAgbmFzbXcuZXhlLgorICAgIGZvciB4ODYgYnVpbGRzLiAgUHV0IG5hc20uZXhlIGFueXdoZXJlIGluIHlvdXIgUEFUSC4KIAogICAgIFlvdSBjYW4gYWxzbyBpbnN0YWxsIEFjdGl2ZVBlcmwgZnJvbQogICAgICAgICBodHRwOi8vd3d3LmFjdGl2ZXN0YXRlLmNvbS9hY3RpdmVwZXJsLwotICAgIGlmIHlvdSBsaWtlIHRvIHVzZSB0aGUgb2ZmaWNpYWwgc291cmNlcyBpbnN0ZWFkIG9mIHRoZSBmaWxlcyBmcm9tIAorICAgIGlmIHlvdSBsaWtlIHRvIHVzZSB0aGUgb2ZmaWNpYWwgc291cmNlcyBpbnN0ZWFkIG9mIHRoZSBmaWxlcyBmcm9tCiAgICAgcHl0aG9uJ3Mgc3VidmVyc2lvbiByZXBvc2l0b3J5LiBUaGUgc3ZuIHZlcnNpb24gY29udGFpbnMgcHJlLWJ1aWxkCiAgICAgbWFrZWZpbGVzIGFuZCBhc3NlbWJseSBmaWxlcy4KIAogICAgIFRoZSBidWlsZCBwcm9jZXNzIG1ha2VzIHN1cmUgdGhhdCBubyBwYXRlbnRlZCBhbGdvcml0aG1zIGFyZSBpbmNsdWRlZC4KLSAgICBGb3Igbm93IFJDNSwgTURDMiBhbmQgSURFQSBhcmUgZXhjbHVkZWQgZnJvbSB0aGUgYnVpbGQuIFlvdSBtYXkgaGF2ZSAKKyAgICBGb3Igbm93IFJDNSwgTURDMiBhbmQgSURFQSBhcmUgZXhjbHVkZWQgZnJvbSB0aGUgYnVpbGQuIFlvdSBtYXkgaGF2ZQogICAgIHRvIG1hbnVhbGx5IHJlbW92ZSAkKE9CSl9EKVxpXyoub2JqIGZyb20gbXNcbnQubWFrIGlmIHRoZSBidWlsZCBwcm9jZXNzCiAgICAgY29tcGxhaW5zIGFib3V0IG1pc3NpbmcgZmlsZXMgb3IgZm9yYmlkZGVuIElERUEuIEFnYWluIHRoZSBmaWxlcyBwcm92aWRlZAogICAgIGluIHRoZSBzdWJ2ZXJzaW9uIHJlcG9zaXRvcnkgYXJlIGFscmVhZHkgZml4ZWQuCkBAIC0xODYsMTYgKzE3NCwxNiBAQAogICAgIHRoaXMgYnkgaGFuZC4KIAogVGhlIHN1YnByb2plY3RzIGFib3ZlIHdyYXAgZXh0ZXJuYWwgcHJvamVjdHMgUHl0aG9uIGRvZXNuJ3QgY29udHJvbCwgYW5kIGFzCi1zdWNoLCBhIGxpdHRsZSBtb3JlIHdvcmsgaXMgcmVxdWlyZWQgaW4gb3JkZXIgdG8gZG93bmxvYWQgdGhlIHJlbGV2YW50IHNvdXJjZSAKK3N1Y2gsIGEgbGl0dGxlIG1vcmUgd29yayBpcyByZXF1aXJlZCBpbiBvcmRlciB0byBkb3dubG9hZCB0aGUgcmVsZXZhbnQgc291cmNlCiBmaWxlcyBmb3IgZWFjaCBwcm9qZWN0IGJlZm9yZSB0aGV5IGNhbiBiZSBidWlsdC4gIFRoZSBidWlsZGJvdHMgZG8gdGhpcyBlYWNoCi10aW1lIHRoZXkncmUgYnVpbHQsIHNvIHRoZSBlYXNpZXN0IGFwcHJvYWNoIGlzIHRvIHJ1biBlaXRoZXIgZXh0ZXJuYWwuYmF0IG9yIAordGltZSB0aGV5J3JlIGJ1aWx0LCBzbyB0aGUgZWFzaWVzdCBhcHByb2FjaCBpcyB0byBydW4gZWl0aGVyIGV4dGVybmFsLmJhdCBvcgogZXh0ZXJuYWwtYW1kNjQuYmF0IGluIHRoZSAuLlxUb29sc1xidWlsZGJvdCBkaXJlY3RvcnkgZnJvbSAuLlwsIGkuZS46CiAKICAgICBDOlwuLlxzdm4ucHl0aG9uLm9yZ1xwcm9qZWN0c1xweXRob25cdHJ1bmtcUENidWlsZD5jZCAuLgogICAgIEM6XC4uXHN2bi5weXRob24ub3JnXHByb2plY3RzXHB5dGhvblx0cnVuaz5Ub29sc1xidWlsZGJvdFxleHRlcm5hbC5iYXQKIAogVGhpcyBleHRyYWN0cyBhbGwgdGhlIGV4dGVybmFsIHN1YnByb2plY3RzIGZyb20gaHR0cDovL3N2bi5weXRob24ub3JnL2V4dGVybmFsCi12aWEgU3VidmVyc2lvbiAoc28geW91J2xsIG5lZWQgYW4gc3ZuLmV4ZSBvbiB5b3VyIFBBVEgpIGFuZCBwbGFjZXMgdGhlbSBpbiAKK3ZpYSBTdWJ2ZXJzaW9uIChzbyB5b3UnbGwgbmVlZCBhbiBzdm4uZXhlIG9uIHlvdXIgUEFUSCkgYW5kIHBsYWNlcyB0aGVtIGluCiAuLlwuLiAocmVsYXRpdmUgdG8gdGhpcyBkaXJlY3RvcnkpLiAgVGhlIGV4dGVybmFsKC1hbWQ2NCkuYmF0IHNjcmlwdHMgd2lsbAogYWxzbyBidWlsZCBhIGRlYnVnIGJ1aWxkIG9mIFRjbC9UazsgdGhlcmUgYXJlbid0IGFueSBlcXVpdmFsZW50IGJhdGNoIGZpbGVzCiBmb3IgYnVpbGRpbmcgcmVsZWFzZSB2ZXJzaW9ucyBvZiBUY2wvVGsgbHlpbmcgYXJvdW5kIGluIHRoZSBUb29sc1xidWlsZGJvdApAQCAtMjM4LDcgKzIyNiw3IEBACiAgICAganVuY3Rpb24gYXMgZm9sbG93cyAodXNpbmcgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgYWJvdmUgYXMgYW4gZXhhbXBsZSk6CiAKICAgICAgICAgQzpcLi5ccHl0aG9uXHRydW5rXGV4dGVybmFsIDwtIGFscmVhZHkgZXhpc3RzIGFuZCBoYXMgYnVpbHQgdmVyc2lvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBleHRlcm5hbCBzdWJwcm9qZWN0cyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBleHRlcm5hbCBzdWJwcm9qZWN0cwogCiAgICAgICAgIEM6XC4uXHB5dGhvblxicmFuY2hlc1xweTNrPmxpbmtkLmV4ZSBleHRlcm5hbCAuLlwuLlx0cnVua1xleHRlcm5hbAogICAgICAgICBMaW5rIGNyZWF0ZWQgYXQ6IGV4dGVybmFsCkBAIC0yNTEsMTkgKzIzOSw5IEBACiBCdWlsZGluZyBmb3IgSXRhbml1bQogLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotTk9URToKIE9mZmljaWFsIHN1cHBvcnQgZm9yIEl0YW5pdW0gYnVpbGRzIGhhdmUgYmVlbiBkcm9wcGVkIGZyb20gdGhlIGJ1aWxkLiBQbGVhc2UKIGNvbnRhY3QgdXMgYW5kIHByb3ZpZGUgcGF0Y2hlcyBpZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gSXRhbml1bSBidWlsZHMuCiAKLVRoZSBwcm9qZWN0IGZpbGVzIHN1cHBvcnQgYSBSZWxlYXNlSXRhbml1bSBjb25maWd1cmF0aW9uIHdoaWNoIGNyZWF0ZXMKLVdpbjY0L0l0YW5pdW0gYmluYXJpZXMuIEZvciB0aGlzIHRvIHdvcmssIHlvdSBuZWVkIHRvIGluc3RhbGwgdGhlIFBsYXRmb3JtCi1TREssIGluIHBhcnRpY3VsYXIgdGhlIDY0LWJpdCBzdXBwb3J0LiBUaGlzIGluY2x1ZGVzIGFuIEl0YW5pdW0gY29tcGlsZXIKLShmdXR1cmUgcmVsZWFzZXMgb2YgdGhlIFNESyBsaWtlbHkgaW5jbHVkZSBhbiBBTUQ2NCBjb21waWxlciBhcyB3ZWxsKS4KLUluIGFkZGl0aW9uLCB5b3UgbmVlZCB0aGUgVmlzdWFsIFN0dWRpbyBwbHVnaW4gZm9yIGV4dGVybmFsIEMgY29tcGlsZXJzLAotZnJvbSBodHRwOi8vc2YubmV0L3Byb2plY3RzL3ZzZXh0Y29tcC4gVGhlIHBsdWdpbiB3aWxsIHdyYXAgY2wuZXhlLCB0bwotbG9jYXRlIHRoZSBwcm9wZXIgdGFyZ2V0IGNvbXBpbGVyLCBhbmQgY29udmVydCBjb21waWxlciBvcHRpb25zCi1hY2NvcmRpbmdseS4gVGhlIHByb2plY3QgZmlsZXMgcmVxdWlyZSBhdGxlYXN0IHZlcnNpb24gMC45LgotCiBCdWlsZGluZyBmb3IgQU1ENjQKIC0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0yODMsNyArMjYxLDcgQEAKIAogVGhlIHNvbHV0aW9uIGhhcyB0d28gY29uZmlndXJhdGlvbnMgZm9yIFBHTy4gVGhlIFBHSW5zdHJ1bWVudAogY29uZmlndXJhdGlvbiBtdXN0IGJlIGJ1aWxkIGZpcnN0LiBUaGUgUEdJbnN0cnVtZW50IGJpbmFyaWVzIGFyZQotbG5pa2VkIGFnYWluc3QgYSBwcm9maWxpbmcgbGlicmFyeSBhbmQgY29udGFpbiBleHRyYSBkZWJ1ZworbGlua2VkIGFnYWluc3QgYSBwcm9maWxpbmcgbGlicmFyeSBhbmQgY29udGFpbiBleHRyYSBkZWJ1ZwogaW5mb3JtYXRpb24uIFRoZSBQR1VwZGF0ZSBjb25maWd1cmF0aW9uIHRha2VzIHRoZSBwcm9maWxpbmcgZGF0YSBhbmQKIGdlbmVyYXRlcyBvcHRpbWl6ZWQgYmluYXJpZXMuCiAKQEAgLTI5MSwyMiArMjY5LDIyIEBACiBjcmVhdGVzIHRoZSBQR0kgZmlsZXMsIHJ1bnMgdGhlIHVuaXQgdGVzdCBzdWl0ZSBvciBQeUJlbmNoIHdpdGggdGhlIFBHSQogcHl0aG9uIGFuZCBmaW5hbGx5IGNyZWF0ZXMgdGhlIG9wdGltaXplZCBmaWxlcy4KIAotaHR0cDovL21zZG4yLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9lN2szMmY0ayhWUy45MCkuYXNweAoraHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2U3azMyZjRrKFZTLjkwKS5hc3B4CiAKIFN0YXRpYyBsaWJyYXJ5CiAtLS0tLS0tLS0tLS0tLQogCiBUaGUgc29sdXRpb24gaGFzIG5vIGNvbmZpZ3VyYXRpb24gZm9yIHN0YXRpYyBsaWJyYXJpZXMuIEhvd2V2ZXIgaXQgaXMgZWFzeQotaXQgYnVpbGQgYSBzdGF0aWMgbGlicmFyeSBpbnN0ZWFkIG9mIGEgRExMLiBZb3Ugc2ltcGx5IGhhdmUgdG8gc2V0IHRoZSAKK2l0IGJ1aWxkIGEgc3RhdGljIGxpYnJhcnkgaW5zdGVhZCBvZiBhIERMTC4gWW91IHNpbXBseSBoYXZlIHRvIHNldCB0aGUKICJDb25maWd1cmF0aW9uIFR5cGUiIHRvICJTdGF0aWMgTGlicmFyeSAoLmxpYikiIGFuZCBhbHRlciB0aGUgcHJlcHJvY2Vzc29yCiBtYWNybyAiUHlfRU5BQkxFX1NIQVJFRCIgdG8gIlB5X05PX0VOQUJMRV9TSEFSRUQiLiBZb3UgbWF5IGFsc28gaGF2ZSB0bwotY2hhbmdlIHRoZSAiUnVudGltZSBMaWJyYXJ5IiBmcm9tICJNdWx0aS10aHJlYWRlZCBETEwgKC9NRCkiIHRvIAorY2hhbmdlIHRoZSAiUnVudGltZSBMaWJyYXJ5IiBmcm9tICJNdWx0aS10aHJlYWRlZCBETEwgKC9NRCkiIHRvCiAiTXVsdGktdGhyZWFkZWQgKC9NVCkiLgogCiBWaXN1YWwgU3R1ZGlvIHByb3BlcnRpZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1UaGUgUENidWlsZCBzb2x1dGlvbiBtYWtlcyBoZWF2eSB1c2Ugb2YgVmlzdWFsIFN0dWRpbyBwcm9wZXJ0eSBmaWxlcyAKK1RoZSBQQ2J1aWxkIHNvbHV0aW9uIG1ha2VzIGhlYXZ5IHVzZSBvZiBWaXN1YWwgU3R1ZGlvIHByb3BlcnR5IGZpbGVzCiAoKi52c3Byb3BzKS4gVGhlIHByb3BlcnRpZXMgY2FuIGJlIHZpZXdlZCBhbmQgYWx0ZXJlZCBpbiB0aGUgUHJvcGVydHkKIE1hbmFnZXIgKFZpZXcgLT4gT3RoZXIgV2luZG93cyAtPiBQcm9wZXJ0eSBNYW5hZ2VyKS4KIApkaWZmIC0tZ2l0IGEvUENidWlsZC9ydC5iYXQgYi9QQ2J1aWxkL3J0LmJhdAppbmRleCBlZTE2NjFhLi45ZGExZWQxIDEwMDY0NAotLS0gYS9QQ2J1aWxkL3J0LmJhdAorKysgYi9QQ2J1aWxkL3J0LmJhdApAQCAtMzAsNyArMzAsNyBAQAogc2V0IHN1ZmZpeD0KIHNldCBxbW9kZT0KIHNldCBkYXNoTz0KLXNldCB0Y2x0az0KK3NldCB0Y2x0az10Y2x0awogCiA6Q2hlY2tPcHRzCiBpZiAiJTEiPT0iLU8iIChzZXQgZGFzaE89LU8pICAgICAmIHNoaWZ0ICYgZ290byBDaGVja09wdHMKQEAgLTM4LDcgKzM4LDcgQEAKIGlmICIlMSI9PSItZCIgKHNldCBzdWZmaXg9X2QpICAgICYgc2hpZnQgJiBnb3RvIENoZWNrT3B0cwogaWYgIiUxIj09Ii14NjQiIChzZXQgcHJlZml4PWFtZDY0KSAmIChzZXQgdGNsdGs9dGNsdGs2NCkgJiBzaGlmdCAmIGdvdG8gQ2hlY2tPcHRzCiAKLVBBVEggJVBBVEglOy4uXC4uXCV0Y2x0ayVcYmluCitQQVRIICVQQVRIJTslfmRwMC4uXC4uXCV0Y2x0ayVcYmluCiBzZXQgZXhlPSVwcmVmaXglXHB5dGhvbiVzdWZmaXglCiBzZXQgY21kPSVleGUlICVkYXNoTyUgLVdkIC0zIC1FIC10dCAuLi9saWIvdGVzdC9yZWdydGVzdC5weSAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQogaWYgZGVmaW5lZCBxbW9kZSBnb3RvIFFtb2RlCmRpZmYgLS1naXQgYS9QYXJzZXIvYXNkbF9jLnB5IGIvUGFyc2VyL2FzZGxfYy5weQppbmRleCA2YTQ2NTQ5Li43ZWJjMjM2IDEwMDc1NQotLS0gYS9QYXJzZXIvYXNkbF9jLnB5CisrKyBiL1BhcnNlci9hc2RsX2MucHkKQEAgLTk3Nyw3ICs5NzcsNyBAQAogCiAKIGNsYXNzIFN0YXRpY1Zpc2l0b3IoUGlja2xlVmlzaXRvcik6Ci0gICAgQ09ERSA9ICcnJ1Zlcnkgc2ltcGxlLCBhbHdheXMgZW1pdCB0aGlzIHN0YXRpYyBjb2RlLiAgT3ZlcmlkZSBDT0RFJycnCisgICAgQ09ERSA9ICcnJ1Zlcnkgc2ltcGxlLCBhbHdheXMgZW1pdCB0aGlzIHN0YXRpYyBjb2RlLiAgT3ZlcnJpZGUgQ09ERScnJwogCiAgICAgZGVmIHZpc2l0KHNlbGYsIG9iamVjdCk6CiAgICAgICAgIHNlbGYuZW1pdChzZWxmLkNPREUsIDAsIHJlZmxvdz1GYWxzZSkKQEAgLTEwMzMsNyArMTAzMyw3IEBACiAgICAgICAgICAgICBzZWxmLmVtaXQoImNhc2UgJXM6IiAlIHQubmFtZSwgMikKICAgICAgICAgICAgIHNlbGYuZW1pdCgiUHlfSU5DUkVGKCVzX3NpbmdsZXRvbik7IiAlIHQubmFtZSwgMykKICAgICAgICAgICAgIHNlbGYuZW1pdCgicmV0dXJuICVzX3NpbmdsZXRvbjsiICUgdC5uYW1lLCAzKQotICAgICAgICBzZWxmLmVtaXQoImRlZmF1bHQ6IiAlIG5hbWUsIDIpCisgICAgICAgIHNlbGYuZW1pdCgiZGVmYXVsdDoiLCAyKQogICAgICAgICBzZWxmLmVtaXQoJy8qIHNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dCBqdXN0IGluIGNhc2UgLi4uICovJywgMykKICAgICAgICAgY29kZSA9ICJQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsIFwidW5rbm93biAlcyBmb3VuZFwiKTsiICUgbmFtZQogICAgICAgICBzZWxmLmVtaXQoY29kZSwgMywgcmVmbG93PUZhbHNlKQpAQCAtMTExNywxMCArMTExNywxOCBAQAogbW9kX3R5IFB5QVNUX29iajJtb2QoUHlPYmplY3QqIGFzdCwgUHlBcmVuYSogYXJlbmEsIGludCBtb2RlKQogewogICAgIG1vZF90eSByZXM7Ci0gICAgUHlPYmplY3QgKnJlcV90eXBlW10gPSB7KFB5T2JqZWN0KilNb2R1bGVfdHlwZSwgKFB5T2JqZWN0KilFeHByZXNzaW9uX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0KilJbnRlcmFjdGl2ZV90eXBlfTsKLSAgICBjaGFyICpyZXFfbmFtZVtdID0geyJNb2R1bGUiLCAiRXhwcmVzc2lvbiIsICJJbnRlcmFjdGl2ZSJ9OworICAgIFB5T2JqZWN0ICpyZXFfdHlwZVszXTsKKyAgICBjaGFyICpyZXFfbmFtZVszXTsKICAgICBpbnQgaXNpbnN0YW5jZTsKKworICAgIHJlcV90eXBlWzBdID0gKFB5T2JqZWN0KilNb2R1bGVfdHlwZTsKKyAgICByZXFfdHlwZVsxXSA9IChQeU9iamVjdCopRXhwcmVzc2lvbl90eXBlOworICAgIHJlcV90eXBlWzJdID0gKFB5T2JqZWN0KilJbnRlcmFjdGl2ZV90eXBlOworCisgICAgcmVxX25hbWVbMF0gPSAiTW9kdWxlIjsKKyAgICByZXFfbmFtZVsxXSA9ICJFeHByZXNzaW9uIjsKKyAgICByZXFfbmFtZVsyXSA9ICJJbnRlcmFjdGl2ZSI7CisKICAgICBhc3NlcnQoMCA8PSBtb2RlICYmIG1vZGUgPD0gMik7CiAKICAgICBpbml0X3R5cGVzKCk7CmRpZmYgLS1naXQgYS9QYXJzZXIvbXlyZWFkbGluZS5jIGIvUGFyc2VyL215cmVhZGxpbmUuYwppbmRleCAwN2MxZDQ0Li41OWRiNDFhIDEwMDY0NAotLS0gYS9QYXJzZXIvbXlyZWFkbGluZS5jCisrKyBiL1BhcnNlci9teXJlYWRsaW5lLmMKQEAgLTQwLDYgKzQwLDEwIEBACiBteV9mZ2V0cyhjaGFyICpidWYsIGludCBsZW4sIEZJTEUgKmZwKQogewogICAgIGNoYXIgKnA7CisjaWZkZWYgTVNfV0lORE9XUworICAgIGludCBpOworI2VuZGlmCisKICAgICB3aGlsZSAoMSkgewogICAgICAgICBpZiAoUHlPU19JbnB1dEhvb2sgIT0gTlVMTCkKICAgICAgICAgICAgICh2b2lkKShQeU9TX0lucHV0SG9vaykoKTsKQEAgLTQ5LDMyICs1MywyNCBAQAogICAgICAgICBpZiAocCAhPSBOVUxMKQogICAgICAgICAgICAgcmV0dXJuIDA7IC8qIE5vIGVycm9yICovCiAjaWZkZWYgTVNfV0lORE9XUwotICAgICAgICAvKiBJbiB0aGUgY2FzZSBvZiBhIEN0cmwrQyBvciBzb21lIG90aGVyIGV4dGVybmFsIGV2ZW50Ci0gICAgICAgICAgIGludGVycnVwdGluZyB0aGUgb3BlcmF0aW9uOgotICAgICAgICAgICBXaW4yay9OVDogRVJST1JfT1BFUkFUSU9OX0FCT1JURUQgaXMgdGhlIG1vc3QgcmVjZW50IFdpbjMyCi0gICAgICAgICAgIGVycm9yIGNvZGUgKGFuZCBmZW9mKCkgcmV0dXJucyBUUlVFKS4KLSAgICAgICAgICAgV2luOXg6IEN0cmwrQyBzZWVtcyB0byBoYXZlIG5vIGVmZmVjdCBvbiBmZ2V0cygpIHJldHVybmluZwotICAgICAgICAgICBlYXJseSAtIHRoZSBzaWduYWwgaGFuZGxlciBpcyBjYWxsZWQsIGJ1dCB0aGUgZmdldHMoKQotICAgICAgICAgICBvbmx5IHJldHVybnMgIm5vcm1hbGx5IiAoaWUsIHdoZW4gRW50ZXIgaGl0IG9yIGZlb2YoKSkKKyAgICAgICAgLyogQ3RybC1DIGFueXdoZXJlIG9uIHRoZSBsaW5lIG9yIEN0cmwtWiBpZiB0aGUgb25seSBjaGFyYWN0ZXIKKyAgICAgICAgICAgb24gYSBsaW5lIHdpbGwgc2V0IEVSUk9SX09QRVJBVElPTl9BQk9SVEVELiBVbmRlciBub3JtYWwKKyAgICAgICAgICAgY2lyY3Vtc3RhbmNlcyBDdHJsLUMgd2lsbCBhbHNvIGhhdmUgY2F1c2VkIHRoZSBTSUdJTlQgaGFuZGxlcgorICAgICAgICAgICB0byBmaXJlLiBUaGlzIHNpZ25hbCBmaXJlcyBpbiBhbm90aGVyIHRocmVhZCBhbmQgaXMgbm90CisgICAgICAgICAgIGd1YXJhbnRlZWQgdG8gaGF2ZSBvY2N1cnJlZCBiZWZvcmUgdGhpcyBwb2ludCBpbiB0aGUgY29kZS4KKworICAgICAgICAgICBUaGVyZWZvcmU6IGNoZWNrIGluIGEgc21hbGwgbG9vcCB0byBzZWUgaWYgdGhlIHRyaWdnZXIgaGFzCisgICAgICAgICAgIGZpcmVkLCBpbiB3aGljaCBjYXNlIGFzc3VtZSB0aGlzIGlzIGEgQ3RybC1DIGV2ZW50LiBJZiBpdAorICAgICAgICAgICBoYXNuJ3QgZmlyZWQgd2l0aGluIDEwbXMgYXNzdW1lIHRoYXQgdGhpcyBpcyBhIEN0cmwtWiBvbiBpdHMKKyAgICAgICAgICAgb3duIG9yIHRoYXQgdGhlIHNpZ25hbCBpc24ndCBnb2luZyB0byBmaXJlIGZvciBzb21lIG90aGVyCisgICAgICAgICAgIHJlYXNvbiBhbmQgZHJvcCB0aHJvdWdoIHRvIGNoZWNrIGZvciBFT0YuCiAgICAgICAgICovCiAgICAgICAgIGlmIChHZXRMYXN0RXJyb3IoKT09RVJST1JfT1BFUkFUSU9OX0FCT1JURUQpIHsKLSAgICAgICAgICAgIC8qIFNpZ25hbHMgY29tZSBhc3luY2hyb25vdXNseSwgc28gd2Ugc2xlZXAgYSBicmllZgotICAgICAgICAgICAgICAgbW9tZW50IGJlZm9yZSBjaGVja2luZyBpZiB0aGUgaGFuZGxlciBoYXMgYmVlbgotICAgICAgICAgICAgICAgdHJpZ2dlcmVkICh3ZSBjYW50IGp1c3QgcmV0dXJuIDEgYmVmb3JlIHRoZQotICAgICAgICAgICAgICAgc2lnbmFsIGhhbmRsZXIgaGFzIGJlZW4gY2FsbGVkLCBhcyB0aGUgbGF0ZXIKLSAgICAgICAgICAgICAgIHNpZ25hbCBtYXkgYmUgdHJlYXRlZCBhcyBhIHNlcGFyYXRlIGludGVycnVwdCkuCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgU2xlZXAoMSk7Ci0gICAgICAgICAgICBpZiAoUHlPU19JbnRlcnJ1cHRPY2N1cnJlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8qIEludGVycnVwdCAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlPU19JbnRlcnJ1cHRPY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICBTbGVlcCgxKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIEVpdGhlciB0aGUgc2xlZXAgd2Fzbid0IGxvbmcgZW5vdWdoIChuZWVkIGEKLSAgICAgICAgICAgICAgIHNob3J0IGxvb3AgcmV0cnlpbmc/KSBvciBub3QgaW50ZXJydXB0ZWQgYXQgYWxsCi0gICAgICAgICAgICAgICAoaW4gd2hpY2ggY2FzZSB3ZSBzaG91bGQgcmV2aXNpdCB0aGUgd2hvbGUgdGhpbmchKQotICAgICAgICAgICAgICAgTG9nZ2luZyBzb21lIHdhcm5pbmcgd291bGQgYmUgbmljZS4gIGFzc2VydCBpcyBub3QKLSAgICAgICAgICAgICAgIHZpYWJsZSBhcyB1bmRlciB0aGUgZGVidWdnZXIsIHRoZSB2YXJpb3VzIGRpYWxvZ3MKLSAgICAgICAgICAgICAgIG1lYW4gdGhlIGNvbmRpdGlvbiBpcyBub3QgdHJ1ZS4KLSAgICAgICAgICAgICovCiAgICAgICAgIH0KICNlbmRpZiAvKiBNU19XSU5ET1dTICovCiAgICAgICAgIGlmIChmZW9mKGZwKSkgewpkaWZmIC0tZ2l0IGEvUGFyc2VyL25vZGUuYyBiL1BhcnNlci9ub2RlLmMKaW5kZXggOWViYTc2Yi4uMGRlYTMwZiAxMDA2NDQKLS0tIGEvUGFyc2VyL25vZGUuYworKysgYi9QYXJzZXIvbm9kZS5jCkBAIC0xMTQsNiArMTE0LDcgQEAKIAogLyogRm9yd2FyZCAqLwogc3RhdGljIHZvaWQgZnJlZWNoaWxkcmVuKG5vZGUgKik7CitzdGF0aWMgUHlfc3NpemVfdCBzaXplb2ZjaGlsZHJlbihub2RlICpuKTsKIAogCiB2b2lkCkBAIC0xMjUsNiArMTI2LDE2IEBACiAgICAgfQogfQogCitQeV9zc2l6ZV90CitfUHlOb2RlX1NpemVPZihub2RlICpuKQoreworICAgIFB5X3NzaXplX3QgcmVzID0gMDsKKworICAgIGlmIChuICE9IE5VTEwpCisgICAgICAgIHJlcyA9IHNpemVvZihub2RlKSArIHNpemVvZmNoaWxkcmVuKG4pOworICAgIHJldHVybiByZXM7Cit9CisKIHN0YXRpYyB2b2lkCiBmcmVlY2hpbGRyZW4obm9kZSAqbikKIHsKQEAgLTEzNiwzICsxNDcsMTggQEAKICAgICBpZiAoU1RSKG4pICE9IE5VTEwpCiAgICAgICAgIFB5T2JqZWN0X0ZSRUUoU1RSKG4pKTsKIH0KKworc3RhdGljIFB5X3NzaXplX3QKK3NpemVvZmNoaWxkcmVuKG5vZGUgKm4pCit7CisgICAgUHlfc3NpemVfdCByZXMgPSAwOworICAgIGludCBpOworICAgIGZvciAoaSA9IE5DSChuKTsgLS1pID49IDA7ICkKKyAgICAgICAgcmVzICs9IHNpemVvZmNoaWxkcmVuKENISUxEKG4sIGkpKTsKKyAgICBpZiAobi0+bl9jaGlsZCAhPSBOVUxMKQorICAgICAgICAvKiBhbGxvY2F0ZWQgc2l6ZSBvZiBuLT5uX2NoaWxkIGFycmF5ICovCisgICAgICAgIHJlcyArPSBYWFhST1VORFVQKE5DSChuKSkgKiBzaXplb2Yobm9kZSk7CisgICAgaWYgKFNUUihuKSAhPSBOVUxMKQorICAgICAgICByZXMgKz0gc3RybGVuKFNUUihuKSkgKyAxOworICAgIHJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9QYXJzZXIvcGFyc2V0b2suYyBiL1BhcnNlci9wYXJzZXRvay5jCmluZGV4IGU4ZDM5NmEuLjA2OWNjNmIgMTAwNjQ0Ci0tLSBhL1BhcnNlci9wYXJzZXRvay5jCisrKyBiL1BhcnNlci9wYXJzZXRvay5jCkBAIC0xMzEsNyArMTMxLDcgQEAKIHsKICAgICBwYXJzZXJfc3RhdGUgKnBzOwogICAgIG5vZGUgKm47Ci0gICAgaW50IHN0YXJ0ZWQgPSAwLCBoYW5kbGluZ19pbXBvcnQgPSAwLCBoYW5kbGluZ193aXRoID0gMDsKKyAgICBpbnQgc3RhcnRlZCA9IDA7CiAKICAgICBpZiAoKHBzID0gUHlQYXJzZXJfTmV3KGcsIHN0YXJ0KSkgPT0gTlVMTCkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm5vIG1lbSBmb3IgbmV3IHBhcnNlclxuIik7CkBAIC0xNjMsNyArMTYzLDYgQEAKICAgICAgICAgfQogICAgICAgICBpZiAodHlwZSA9PSBFTkRNQVJLRVIgJiYgc3RhcnRlZCkgewogICAgICAgICAgICAgdHlwZSA9IE5FV0xJTkU7IC8qIEFkZCBhbiBleHRyYSBuZXdsaW5lICovCi0gICAgICAgICAgICBoYW5kbGluZ193aXRoID0gaGFuZGxpbmdfaW1wb3J0ID0gMDsKICAgICAgICAgICAgIHN0YXJ0ZWQgPSAwOwogICAgICAgICAgICAgLyogQWRkIHRoZSByaWdodCBudW1iZXIgb2YgZGVkZW50IHRva2VucywKICAgICAgICAgICAgICAgIGV4Y2VwdCBpZiBhIGNlcnRhaW4gZmxhZyBpcyBnaXZlbiAtLQpkaWZmIC0tZ2l0IGEvUGFyc2VyL3Rva2VuaXplci5jIGIvUGFyc2VyL3Rva2VuaXplci5jCmluZGV4IGVlNjMxM2IuLjNlNGFmNTMgMTAwNjQ0Ci0tLSBhL1BhcnNlci90b2tlbml6ZXIuYworKysgYi9QYXJzZXIvdG9rZW5pemVyLmMKQEAgLTI3Nyw4ICsyNzcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgdG9rLT5lbmNvZGluZyA9IGNzOwogICAgICAgICAgICAgICAgICAgICB0b2stPmRlY29kaW5nX3N0YXRlID0gLTE7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5bnRheEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuY29kaW5nIHByb2JsZW06ICVzIiwgY3MpOwogICAgICAgICAgICAgICAgICAgICBQeU1lbV9GUkVFKGNzKTsKKyAgICAgICAgICAgICAgICB9CiAjZWxzZQogICAgICAgICAgICAgICAgIC8qIFdpdGhvdXQgVW5pY29kZSBzdXBwb3J0LCB3ZSBjYW5ub3QKICAgICAgICAgICAgICAgICAgICBwcm9jZXNzIHRoZSBjb2Rpbmcgc3BlYy4gU2luY2UgdGhlcmUKQEAgLTI4OSwxNSArMjkyLDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgIC8qIHRoZW4sIGNvbXBhcmUgY3Mgd2l0aCBCT00gKi8KICAgICAgICAgICAgIHIgPSAoc3RyY21wKHRvay0+ZW5jb2RpbmcsIGNzKSA9PSAwKTsKKyAgICAgICAgICAgIGlmICghcikKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3ludGF4RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmNvZGluZyBwcm9ibGVtOiAlcyB3aXRoIEJPTSIsIGNzKTsKICAgICAgICAgICAgIFB5TWVtX0ZSRUUoY3MpOwogICAgICAgICB9CiAgICAgfQotICAgIGlmICghcikgewotICAgICAgICBjcyA9IHRvay0+ZW5jb2Rpbmc7Ci0gICAgICAgIGlmICghY3MpCi0gICAgICAgICAgICBjcyA9ICJ3aXRoIEJPTSI7Ci0gICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeW50YXhFcnJvciwgImVuY29kaW5nIHByb2JsZW06ICVzIiwgY3MpOwotICAgIH0KICAgICByZXR1cm4gcjsKIH0KIApAQCAtNDAwLDYgKzQwMCwxMiBAQAogICAgICAgICBidWYgPSBQeU9iamVjdF9DYWxsT2JqZWN0KHRvay0+ZGVjb2RpbmdfcmVhZGxpbmUsIE5VTEwpOwogICAgICAgICBpZiAoYnVmID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm4gZXJyb3JfcmV0KHRvayk7CisgICAgICAgIGlmICghUHlVbmljb2RlX0NoZWNrKGJ1ZikpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihidWYpOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5bnRheEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2RlYyBkaWQgbm90IHJldHVybiBhIHVuaWNvZGUgb2JqZWN0Iik7CisgICAgICAgICAgICByZXR1cm4gZXJyb3JfcmV0KHRvayk7CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICB0b2stPmRlY29kaW5nX2J1ZmZlciA9IE5VTEw7CiAgICAgICAgIGlmIChQeVN0cmluZ19DaGVja0V4YWN0KGJ1ZikpCkBAIC01MjgsNyArNTM0LDcgQEAKICAgICAgICAgICAgICJOb24tQVNDSUkgY2hhcmFjdGVyICdcXHglLjJ4JyAiCiAgICAgICAgICAgICAiaW4gZmlsZSAlLjIwMHMgb24gbGluZSAlaSwgIgogICAgICAgICAgICAgImJ1dCBubyBlbmNvZGluZyBkZWNsYXJlZDsgIgotICAgICAgICAgICAgInNlZSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvcGVwcy9wZXAtMDI2My5odG1sIGZvciBkZXRhaWxzIiwKKyAgICAgICAgICAgICJzZWUgaHR0cDovL3B5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTAyNjMvIGZvciBkZXRhaWxzIiwKICAgICAgICAgICAgIGJhZGNoYXIsIHRvay0+ZmlsZW5hbWUsIHRvay0+bGluZW5vICsgMSk7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeW50YXhFcnJvciwgYnVmKTsKICAgICAgICAgcmV0dXJuIGVycm9yX3JldCh0b2spOwpAQCAtMTQ5NCwxNSArMTUwMCwyNCBAQAogICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChpc2RpZ2l0KGMpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ2UnIHx8IGMgPT0gJ0UnKSB7Ci0gICAgICAgIGV4cG9uZW50OgorICAgICAgICAgICAgICAgICAgICBpbnQgZTsKKyAgICAgICAgICAgICAgICAgIGV4cG9uZW50OgorICAgICAgICAgICAgICAgICAgICBlID0gYzsKICAgICAgICAgICAgICAgICAgICAgLyogRXhwb25lbnQgcGFydCAqLwogICAgICAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjID09ICcrJyB8fCBjID09ICctJykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJysnIHx8IGMgPT0gJy0nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaXNkaWdpdChjKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdG9rLT5kb25lID0gRV9UT0tFTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNkaWdpdChjKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvay0+ZG9uZSA9IEVfVE9LRU47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rX2JhY2t1cCh0b2ssIGMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUlRPS0VOOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc2RpZ2l0KGMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0b2tfYmFja3VwKHRvaywgYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JUT0tFTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRva19iYWNrdXAodG9rLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX3N0YXJ0ID0gdG9rLT5zdGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX2VuZCA9IHRvay0+Y3VyOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTUJFUjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CmRpZmYgLS1naXQgYS9QeXRob24vUHl0aG9uLWFzdC5jIGIvUHl0aG9uL1B5dGhvbi1hc3QuYwppbmRleCBkY2ZkZTNjLi42Y2Y5OWVjIDEwMDY0NAotLS0gYS9QeXRob24vUHl0aG9uLWFzdC5jCisrKyBiL1B5dGhvbi9QeXRob24tYXN0LmMKQEAgLTY3NDksMTAgKzY3NDksMTggQEAKIG1vZF90eSBQeUFTVF9vYmoybW9kKFB5T2JqZWN0KiBhc3QsIFB5QXJlbmEqIGFyZW5hLCBpbnQgbW9kZSkKIHsKICAgICBtb2RfdHkgcmVzOwotICAgIFB5T2JqZWN0ICpyZXFfdHlwZVtdID0geyhQeU9iamVjdCopTW9kdWxlX3R5cGUsIChQeU9iamVjdCopRXhwcmVzc2lvbl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCopSW50ZXJhY3RpdmVfdHlwZX07Ci0gICAgY2hhciAqcmVxX25hbWVbXSA9IHsiTW9kdWxlIiwgIkV4cHJlc3Npb24iLCAiSW50ZXJhY3RpdmUifTsKKyAgICBQeU9iamVjdCAqcmVxX3R5cGVbM107CisgICAgY2hhciAqcmVxX25hbWVbM107CiAgICAgaW50IGlzaW5zdGFuY2U7CisKKyAgICByZXFfdHlwZVswXSA9IChQeU9iamVjdCopTW9kdWxlX3R5cGU7CisgICAgcmVxX3R5cGVbMV0gPSAoUHlPYmplY3QqKUV4cHJlc3Npb25fdHlwZTsKKyAgICByZXFfdHlwZVsyXSA9IChQeU9iamVjdCopSW50ZXJhY3RpdmVfdHlwZTsKKworICAgIHJlcV9uYW1lWzBdID0gIk1vZHVsZSI7CisgICAgcmVxX25hbWVbMV0gPSAiRXhwcmVzc2lvbiI7CisgICAgcmVxX25hbWVbMl0gPSAiSW50ZXJhY3RpdmUiOworCiAgICAgYXNzZXJ0KDAgPD0gbW9kZSAmJiBtb2RlIDw9IDIpOwogCiAgICAgaW5pdF90eXBlcygpOwpkaWZmIC0tZ2l0IGEvUHl0aG9uL193YXJuaW5ncy5jIGIvUHl0aG9uL193YXJuaW5ncy5jCmluZGV4IDQ0NWZmNmIuLjkyZDY1NDcgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9fd2FybmluZ3MuYworKysgYi9QeXRob24vX3dhcm5pbmdzLmMKQEAgLTkwNSw2ICs5MDUsNyBAQAogICAgIF9kZWZhdWx0X2FjdGlvbiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoImRlZmF1bHQiKTsKICAgICBpZiAoX2RlZmF1bHRfYWN0aW9uID09IE5VTEwpCiAgICAgICAgIHJldHVybjsKKyAgICBQeV9JTkNSRUYoX2RlZmF1bHRfYWN0aW9uKTsKICAgICBpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJkZWZhdWx0X2FjdGlvbiIsIF9kZWZhdWx0X2FjdGlvbikgPCAwKQogICAgICAgICByZXR1cm47CiB9CmRpZmYgLS1naXQgYS9QeXRob24vYXN0LmMgYi9QeXRob24vYXN0LmMKaW5kZXggODhlNDc0NS4uZmZkNTY3OSAxMDA2NDQKLS0tIGEvUHl0aG9uL2FzdC5jCisrKyBiL1B5dGhvbi9hc3QuYwpAQCAtMzcsNyArMzcsNyBAQAogc3RhdGljIGV4cHJfdHkgYXN0X2Zvcl9jYWxsKHN0cnVjdCBjb21waWxpbmcgKiwgY29uc3Qgbm9kZSAqLCBleHByX3R5KTsKIAogc3RhdGljIFB5T2JqZWN0ICpwYXJzZW51bWJlcihzdHJ1Y3QgY29tcGlsaW5nICosIGNvbnN0IGNoYXIgKik7Ci1zdGF0aWMgUHlPYmplY3QgKnBhcnNlc3RyKHN0cnVjdCBjb21waWxpbmcgKiwgY29uc3QgY2hhciAqKTsKK3N0YXRpYyBQeU9iamVjdCAqcGFyc2VzdHIoc3RydWN0IGNvbXBpbGluZyAqLCBjb25zdCBub2RlICpuLCBjb25zdCBjaGFyICopOwogc3RhdGljIFB5T2JqZWN0ICpwYXJzZXN0cnBsdXMoc3RydWN0IGNvbXBpbGluZyAqLCBjb25zdCBub2RlICpuKTsKIAogI2lmbmRlZiBMSU5FTk8KQEAgLTkzMCw3ICs5MzAsNyBAQAogICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBhc3NlcnQoVFlQRShDSElMRChuLCAxKSkgPT0gZnVuY2RlZiB8fAotCSAgIFRZUEUoQ0hJTEQobiwgMSkpID09IGNsYXNzZGVmKTsKKyAgICAgICAgICAgVFlQRShDSElMRChuLCAxKSkgPT0gY2xhc3NkZWYpOwogCiAgICAgaWYgKFRZUEUoQ0hJTEQobiwgMSkpID09IGZ1bmNkZWYpIHsKICAgICAgIHRoaW5nID0gYXN0X2Zvcl9mdW5jZGVmKGMsIENISUxEKG4sIDEpLCBkZWNvcmF0b3Jfc2VxKTsKQEAgLTE3NDQsMTQgKzE3NDQsMTkgQEAKICAgICAgICAgTkNIKHBwb3dlcikgPT0gMSAmJgogICAgICAgICBUWVBFKChwYXRvbSA9IENISUxEKHBwb3dlciwgMCkpKSA9PSBhdG9tICYmCiAgICAgICAgIFRZUEUoKHBudW0gPSBDSElMRChwYXRvbSwgMCkpKSA9PSBOVU1CRVIpIHsKKyAgICAgICAgUHlPYmplY3QgKnB5bnVtOwogICAgICAgICBjaGFyICpzID0gUHlPYmplY3RfTUFMTE9DKHN0cmxlbihTVFIocG51bSkpICsgMik7CiAgICAgICAgIGlmIChzID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgc1swXSA9ICctJzsKICAgICAgICAgc3RyY3B5KHMgKyAxLCBTVFIocG51bSkpOwotICAgICAgICBQeU9iamVjdF9GUkVFKFNUUihwbnVtKSk7Ci0gICAgICAgIFNUUihwbnVtKSA9IHM7Ci0gICAgICAgIHJldHVybiBhc3RfZm9yX2F0b20oYywgcGF0b20pOworICAgICAgICBweW51bSA9IHBhcnNlbnVtYmVyKGMsIHMpOworICAgICAgICBQeU9iamVjdF9GUkVFKHMpOworICAgICAgICBpZiAoIXB5bnVtKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgUHlBcmVuYV9BZGRQeU9iamVjdChjLT5jX2FyZW5hLCBweW51bSk7CisgICAgICAgIHJldHVybiBOdW0ocHludW0sIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKICAgICB9CiAKICAgICBleHByZXNzaW9uID0gYXN0X2Zvcl9leHByKGMsIENISUxEKG4sIDEpKTsKQEAgLTI2NzQsNiArMjY3OSwxOCBAQAogICAgIGV4cHIxID0gYXN0X2Zvcl9leHByKGMsIENISUxEKG4sIDEpKTsKICAgICBpZiAoIWV4cHIxKQogICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChleHByMS0+a2luZCA9PSBUdXBsZV9raW5kICYmIG5fY2hpbGRyZW4gPCA0ICYmCisgICAgICAgIChhc2RsX3NlcV9MRU4oZXhwcjEtPnYuVHVwbGUuZWx0cykgPT0gMiB8fAorICAgICAgICAgYXNkbF9zZXFfTEVOKGV4cHIxLT52LlR1cGxlLmVsdHMpID09IDMpKSB7CisgICAgICAgIC8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OiBwYXNzIGV4ZWMgYXJncyBhcyBhIHR1cGxlICovCisgICAgICAgIGdsb2JhbHMgPSAoZXhwcl90eSkgYXNkbF9zZXFfR0VUKGV4cHIxLT52LlR1cGxlLmVsdHMsIDEpOworICAgICAgICBpZiAoYXNkbF9zZXFfTEVOKGV4cHIxLT52LlR1cGxlLmVsdHMpID09IDMpIHsKKyAgICAgICAgICAgIGxvY2FscyA9IChleHByX3R5KSBhc2RsX3NlcV9HRVQoZXhwcjEtPnYuVHVwbGUuZWx0cywgMik7CisgICAgICAgIH0KKyAgICAgICAgZXhwcjEgPSAoZXhwcl90eSkgYXNkbF9zZXFfR0VUKGV4cHIxLT52LlR1cGxlLmVsdHMsIDApOworICAgIH0KKwogICAgIGlmIChuX2NoaWxkcmVuID49IDQpIHsKICAgICAgICAgZ2xvYmFscyA9IGFzdF9mb3JfZXhwcihjLCBDSElMRChuLCAzKSk7CiAgICAgICAgIGlmICghZ2xvYmFscykKQEAgLTMyOTIsOCArMzMwOSw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGFzdF9mb3JfZnVuY2RlZihjLCBjaCwgTlVMTCk7CiAgICAgICAgICAgICBjYXNlIGNsYXNzZGVmOgogICAgICAgICAgICAgICAgIHJldHVybiBhc3RfZm9yX2NsYXNzZGVmKGMsIGNoLCBOVUxMKTsKLQkgICAgY2FzZSBkZWNvcmF0ZWQ6Ci0JICAgICAgICByZXR1cm4gYXN0X2Zvcl9kZWNvcmF0ZWQoYywgY2gpOworICAgICAgICAgICAgY2FzZSBkZWNvcmF0ZWQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGFzdF9mb3JfZGVjb3JhdGVkKGMsIGNoKTsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5oYW5kbGVkIHNtYWxsX3N0bXQ6IFRZUEU9JWQgTkNIPSVkXG4iLApAQCAtMzM4Miw4ICszMzk5LDggQEAKICAgICAgICAgICAgICAgICAvKiBjaGVjayBmb3IgaW50ZWdlciBvdmVyZmxvdyAqLwogICAgICAgICAgICAgICAgIGlmIChsZW4gPiBQWV9TSVpFX01BWCAvIDYpCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkJLyogIjxDMz48QTQ+IiAoMiBieXRlcykgbWF5IGJlY29tZSAiXFUwMDAwMDBFNCIgKDEwIGJ5dGVzKSwgb3IgMTo1Ci0JCSAgICJcw6QiICgzIGJ5dGVzKSBtYXkgYmVjb21lICJcdTAwNWNcVTAwMDAwMEU0IiAoMTYgYnl0ZXMpLCBvciB+MTo2ICovCisgICAgICAgICAgICAgICAgLyogIjxDMz48QTQ+IiAoMiBieXRlcykgbWF5IGJlY29tZSAiXFUwMDAwMDBFNCIgKDEwIGJ5dGVzKSwgb3IgMTo1CisgICAgICAgICAgICAgICAgICAgIlzDpCIgKDMgYnl0ZXMpIG1heSBiZWNvbWUgIlx1MDA1Y1xVMDAwMDAwRTQiICgxNiBieXRlcyksIG9yIH4xOjYgKi8KICAgICAgICAgICAgICAgICB1ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBsZW4gKiA2KTsKICAgICAgICAgICAgICAgICBpZiAodSA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0zNDEzLDggKzM0MzAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYocCwgIlxcVSUwMnglMDJ4JTAyeCUwMngiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcltpICsgMF0gJiAweEZGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcltpICsgMV0gJiAweEZGLAotCQkJCQkJcltpICsgMl0gJiAweEZGLAotCQkJCQkJcltpICsgM10gJiAweEZGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbaSArIDJdICYgMHhGRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbaSArIDNdICYgMHhGRik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCArPSAxMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodyk7CkBAIC0zNDM5LDEzICszNDU2LDE0IEBACiAgKiBwYXJzZXN0ciBwYXJzZXMgaXQsIGFuZCByZXR1cm5zIHRoZSBkZWNvZGVkIFB5dGhvbiBzdHJpbmcgb2JqZWN0LgogICovCiBzdGF0aWMgUHlPYmplY3QgKgotcGFyc2VzdHIoc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3QgY2hhciAqcykKK3BhcnNlc3RyKHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4sIGNvbnN0IGNoYXIgKnMpCiB7Ci0gICAgICAgIHNpemVfdCBsZW47CisgICAgICAgIHNpemVfdCBsZW4sIGk7CiAgICAgICAgIGludCBxdW90ZSA9IFB5X0NIQVJNQVNLKCpzKTsKICAgICAgICAgaW50IHJhd21vZGUgPSAwOwogICAgICAgICBpbnQgbmVlZF9lbmNvZGluZzsKICAgICAgICAgaW50IHVuaWNvZGUgPSBjLT5jX2Z1dHVyZV91bmljb2RlOworICAgICAgICBpbnQgYnl0ZXMgPSAwOwogCiAgICAgICAgIGlmIChpc2FscGhhKHF1b3RlKSB8fCBxdW90ZSA9PSAnXycpIHsKICAgICAgICAgICAgICAgICBpZiAocXVvdGUgPT0gJ3UnIHx8IHF1b3RlID09ICdVJykgewpAQCAtMzQ1NSw2ICszNDczLDcgQEAKICAgICAgICAgICAgICAgICBpZiAocXVvdGUgPT0gJ2InIHx8IHF1b3RlID09ICdCJykgewogICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGUgPSAqKytzOwogICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlcyA9IDE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChxdW90ZSA9PSAncicgfHwgcXVvdGUgPT0gJ1InKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZSA9ICorK3M7CkBAIC0zNDg0LDYgKzM1MDMsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBpZiAoUHlfUHkza1dhcm5pbmdGbGFnICYmIGJ5dGVzKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkIGNoYXIpc1tpXSA+IDEyNykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWFzdF93YXJuKGMsIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAibm9uLWFzY2lpIGJ5dGVzIGxpdGVyYWxzIG5vdCBzdXBwb3J0ZWQgaW4gMy54IikpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQogICAgICAgICBpZiAodW5pY29kZSB8fCBQeV9Vbmljb2RlRmxhZykgewogICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVfdW5pY29kZShjLCBzLCBsZW4sIHJhd21vZGUsIGMtPmNfZW5jb2RpbmcpOwpAQCAtMzUyNiwxMSArMzU1NSwxMSBAQAogICAgICAgICBQeU9iamVjdCAqdjsKICAgICAgICAgaW50IGk7CiAgICAgICAgIFJFUShDSElMRChuLCAwKSwgU1RSSU5HKTsKLSAgICAgICAgaWYgKCh2ID0gcGFyc2VzdHIoYywgU1RSKENISUxEKG4sIDApKSkpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKCh2ID0gcGFyc2VzdHIoYywgbiwgU1RSKENISUxEKG4sIDApKSkpICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAvKiBTdHJpbmcgbGl0ZXJhbCBjb25jYXRlbmF0aW9uICovCiAgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IE5DSChuKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBwYXJzZXN0cihjLCBTVFIoQ0hJTEQobiwgaSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBwYXJzZXN0cihjLCBuLCBTVFIoQ0hJTEQobiwgaSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQeVN0cmluZ19DaGVjayh2KSAmJiBQeVN0cmluZ19DaGVjayhzKSkgewpkaWZmIC0tZ2l0IGEvUHl0aG9uL2JsdGlubW9kdWxlLmMgYi9QeXRob24vYmx0aW5tb2R1bGUuYwppbmRleCBjMjU1ODhhLi5mMDUyNTc0IDEwMDY0NAotLS0gYS9QeXRob24vYmx0aW5tb2R1bGUuYworKysgYi9QeXRob24vYmx0aW5tb2R1bGUuYwpAQCAtNTMsOCArNTMsMTIgQEAKIFB5RG9jX1NUUlZBUihpbXBvcnRfZG9jLAogIl9faW1wb3J0X18obmFtZSwgZ2xvYmFscz17fSwgbG9jYWxzPXt9LCBmcm9tbGlzdD1bXSwgbGV2ZWw9LTEpIC0+IG1vZHVsZVxuXAogXG5cCi1JbXBvcnQgYSBtb2R1bGUuICBUaGUgZ2xvYmFscyBhcmUgb25seSB1c2VkIHRvIGRldGVybWluZSB0aGUgY29udGV4dDtcblwKLXRoZXkgYXJlIG5vdCBtb2RpZmllZC4gIFRoZSBsb2NhbHMgYXJlIGN1cnJlbnRseSB1bnVzZWQuICBUaGUgZnJvbWxpc3RcblwKK0ltcG9ydCBhIG1vZHVsZS4gQmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIG1lYW50IGZvciB1c2UgYnkgdGhlIFB5dGhvblxuXAoraW50ZXJwcmV0ZXIgYW5kIG5vdCBmb3IgZ2VuZXJhbCB1c2UgaXQgaXMgYmV0dGVyIHRvIHVzZVxuXAoraW1wb3J0bGliLmltcG9ydF9tb2R1bGUoKSB0byBwcm9ncmFtbWF0aWNhbGx5IGltcG9ydCBhIG1vZHVsZS5cblwKK1xuXAorVGhlIGdsb2JhbHMgYXJndW1lbnQgaXMgb25seSB1c2VkIHRvIGRldGVybWluZSB0aGUgY29udGV4dDtcblwKK3RoZXkgYXJlIG5vdCBtb2RpZmllZC4gIFRoZSBsb2NhbHMgYXJndW1lbnQgaXMgdW51c2VkLiAgVGhlIGZyb21saXN0XG5cCiBzaG91bGQgYmUgYSBsaXN0IG9mIG5hbWVzIHRvIGVtdWxhdGUgYGBmcm9tIG5hbWUgaW1wb3J0IC4uLicnLCBvciBhblxuXAogZW1wdHkgbGlzdCB0byBlbXVsYXRlIGBgaW1wb3J0IG5hbWUnJy5cblwKIFdoZW4gaW1wb3J0aW5nIGEgbW9kdWxlIGZyb20gYSBwYWNrYWdlLCBub3RlIHRoYXQgX19pbXBvcnRfXygnQS5CJywgLi4uKVxuXApAQCAtMTE2LDcgKzEyMCw4IEBACiBQeURvY19TVFJWQVIoYWxsX2RvYywKICJhbGwoaXRlcmFibGUpIC0+IGJvb2xcblwKIFxuXAotUmV0dXJuIFRydWUgaWYgYm9vbCh4KSBpcyBUcnVlIGZvciBhbGwgdmFsdWVzIHggaW4gdGhlIGl0ZXJhYmxlLiIpOworUmV0dXJuIFRydWUgaWYgYm9vbCh4KSBpcyBUcnVlIGZvciBhbGwgdmFsdWVzIHggaW4gdGhlIGl0ZXJhYmxlLlxuXAorSWYgdGhlIGl0ZXJhYmxlIGlzIGVtcHR5LCByZXR1cm4gVHJ1ZS4iKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fYW55KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdikKQEAgLTE1OCw3ICsxNjMsOCBAQAogUHlEb2NfU1RSVkFSKGFueV9kb2MsCiAiYW55KGl0ZXJhYmxlKSAtPiBib29sXG5cCiBcblwKLVJldHVybiBUcnVlIGlmIGJvb2woeCkgaXMgVHJ1ZSBmb3IgYW55IHggaW4gdGhlIGl0ZXJhYmxlLiIpOworUmV0dXJuIFRydWUgaWYgYm9vbCh4KSBpcyBUcnVlIGZvciBhbnkgeCBpbiB0aGUgaXRlcmFibGUuXG5cCitJZiB0aGUgaXRlcmFibGUgaXMgZW1wdHksIHJldHVybiBGYWxzZS4iKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fYXBwbHkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQpAQCAtMzA5LDcgKzMxNSw3IEBACiAgICAgICAgICAgICBvayA9IFB5T2JqZWN0X0lzVHJ1ZShnb29kKTsKICAgICAgICAgICAgIFB5X0RFQ1JFRihnb29kKTsKICAgICAgICAgfQotICAgICAgICBpZiAob2spIHsKKyAgICAgICAgaWYgKG9rID4gMCkgewogICAgICAgICAgICAgaWYgKGogPCBsZW4pCiAgICAgICAgICAgICAgICAgUHlMaXN0X1NFVF9JVEVNKHJlc3VsdCwgaiwgaXRlbSk7CiAgICAgICAgICAgICBlbHNlIHsKQEAgLTMyMCw4ICszMjYsMTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICsrajsKICAgICAgICAgfQotICAgICAgICBlbHNlCisgICAgICAgIGVsc2UgewogICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgaWYgKG9rIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWxfcmVzdWx0X2l0OworICAgICAgICB9CiAgICAgfQogCiAKQEAgLTUxNiw2ICs1MjUsOCBAQAogICAgICAgICAgICAgbW9kX3R5IG1vZDsKIAogICAgICAgICAgICAgYXJlbmEgPSBQeUFyZW5hX05ldygpOworICAgICAgICAgICAgaWYgKGFyZW5hID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICBtb2QgPSBQeUFTVF9vYmoybW9kKGNtZCwgYXJlbmEsIG1vZGUpOwogICAgICAgICAgICAgaWYgKG1vZCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgUHlBcmVuYV9GcmVlKGFyZW5hKTsKQEAgLTEzMTIsNyArMTMyMyw3IEBACiBQeURvY19TVFJWQVIobGVuX2RvYywKICJsZW4ob2JqZWN0KSAtPiBpbnRlZ2VyXG5cCiBcblwKLVJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIG9mIGEgc2VxdWVuY2Ugb3IgbWFwcGluZy4iKTsKK1JldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIG9mIGEgc2VxdWVuY2Ugb3IgY29sbGVjdGlvbi4iKTsKIAogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTU3OCw2ICsxNTg5LDcgQEAKICAgICAgICAgICAgIFB5X0NMRUFSKHN0cl9uZXdsaW5lKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CisjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQogICAgICAgICB1bmljb2RlX25ld2xpbmUgPSBQeVVuaWNvZGVfRnJvbVN0cmluZygiXG4iKTsKICAgICAgICAgaWYgKHVuaWNvZGVfbmV3bGluZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBQeV9DTEVBUihzdHJfbmV3bGluZSk7CkBAIC0xNTkxLDYgKzE2MDMsNyBAQAogICAgICAgICAgICAgUHlfQ0xFQVIodW5pY29kZV9zcGFjZSk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQorI2VuZGlmCiAgICAgfQogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGR1bW15X2FyZ3MsIGt3ZHMsICJ8T09POnByaW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2xpc3QsICZzZXAsICZlbmQsICZmaWxlKSkKQEAgLTE5OTMsNyArMjAwNiw4IEBACiB9CiAKIFB5RG9jX1NUUlZBUihyYW5nZV9kb2MsCi0icmFuZ2UoW3N0YXJ0LF0gc3RvcFssIHN0ZXBdKSAtPiBsaXN0IG9mIGludGVnZXJzXG5cCisicmFuZ2Uoc3RvcCkgLT4gbGlzdCBvZiBpbnRlZ2Vyc1xuXAorcmFuZ2Uoc3RhcnQsIHN0b3BbLCBzdGVwXSkgLT4gbGlzdCBvZiBpbnRlZ2Vyc1xuXAogXG5cCiBSZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgYW4gYXJpdGhtZXRpYyBwcm9ncmVzc2lvbiBvZiBpbnRlZ2Vycy5cblwKIHJhbmdlKGksIGopIHJldHVybnMgW2ksIGkrMSwgaSsyLCAuLi4sIGotMV07IHN0YXJ0ICghKSBkZWZhdWx0cyB0byAwLlxuXApAQCAtMjQyMCw5ICsyNDM0LDkgQEAKIFB5RG9jX1NUUlZBUihzdW1fZG9jLAogInN1bShzZXF1ZW5jZVssIHN0YXJ0XSkgLT4gdmFsdWVcblwKIFxuXAotUmV0dXJucyB0aGUgc3VtIG9mIGEgc2VxdWVuY2Ugb2YgbnVtYmVycyAoTk9UIHN0cmluZ3MpIHBsdXMgdGhlIHZhbHVlXG5cCitSZXR1cm4gdGhlIHN1bSBvZiBhIHNlcXVlbmNlIG9mIG51bWJlcnMgKE5PVCBzdHJpbmdzKSBwbHVzIHRoZSB2YWx1ZVxuXAogb2YgcGFyYW1ldGVyICdzdGFydCcgKHdoaWNoIGRlZmF1bHRzIHRvIDApLiAgV2hlbiB0aGUgc2VxdWVuY2UgaXNcblwKLWVtcHR5LCByZXR1cm5zIHN0YXJ0LiIpOworZW1wdHksIHJldHVybiBzdGFydC4iKTsKIAogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMjc3OCwxMiArMjc5MiwxNSBAQAogICAgICAgICB9CiAgICAgICAgIG9rID0gUHlPYmplY3RfSXNUcnVlKGdvb2QpOwogICAgICAgICBQeV9ERUNSRUYoZ29vZCk7Ci0gICAgICAgIGlmIChvaykgeworICAgICAgICBpZiAob2sgPiAwKSB7CiAgICAgICAgICAgICBpZiAoUHlUdXBsZV9TZXRJdGVtKHJlc3VsdCwgaisrLCBpdGVtKSA8IDApCiAgICAgICAgICAgICAgICAgZ290byBGYWlsXzE7CiAgICAgICAgIH0KLSAgICAgICAgZWxzZQorICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgIGlmIChvayA8IDApCisgICAgICAgICAgICAgICAgZ290byBGYWlsXzE7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoX1B5VHVwbGVfUmVzaXplKCZyZXN1bHQsIGopIDwgMCkKQEAgLTI4NDUsNyArMjg2Miw3IEBACiAgICAgICAgICAgICBvayA9IFB5T2JqZWN0X0lzVHJ1ZShnb29kKTsKICAgICAgICAgICAgIFB5X0RFQ1JFRihnb29kKTsKICAgICAgICAgfQotICAgICAgICBpZiAob2spIHsKKyAgICAgICAgaWYgKG9rID4gMCkgewogICAgICAgICAgICAgUHlfc3NpemVfdCByZXNsZW47CiAgICAgICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKGl0ZW0pKSB7CiAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImNhbid0IGZpbHRlciBzdHIgdG8gc3RyOiIKQEAgLTI5MTEsNiArMjkyOCw4IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgIGlmIChvayA8IDApCisgICAgICAgICAgICBnb3RvIEZhaWxfMTsKICAgICB9CiAKICAgICBpZiAoaiA8IG91dGxlbikKQEAgLTI5NzEsNyArMjk5MCw3IEBACiAgICAgICAgICAgICBvayA9IFB5T2JqZWN0X0lzVHJ1ZShnb29kKTsKICAgICAgICAgICAgIFB5X0RFQ1JFRihnb29kKTsKICAgICAgICAgfQotICAgICAgICBpZiAob2spIHsKKyAgICAgICAgaWYgKG9rID4gMCkgewogICAgICAgICAgICAgUHlfc3NpemVfdCByZXNsZW47CiAgICAgICAgICAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhpdGVtKSkgewogICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCkBAIC0zMDI2LDYgKzMwNDUsOCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICBpZiAob2sgPCAwKQorICAgICAgICAgICAgZ290byBGYWlsXzE7CiAgICAgfQogCiAgICAgaWYgKGogPCBvdXRsZW4pCmRpZmYgLS1naXQgYS9QeXRob24vY2V2YWwuYyBiL1B5dGhvbi9jZXZhbC5jCmluZGV4IDA2YWRhOTcuLjM4ZjUxZmEgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9jZXZhbC5jCisrKyBiL1B5dGhvbi9jZXZhbC5jCkBAIC0zNTUsNiArMzU1LDEyIEBACiAgICAgaWYgKGludGVycHJldGVyX2xvY2spIHsKICAgICAgICAgaW50IGVyciA9IGVycm5vOwogICAgICAgICBQeVRocmVhZF9hY3F1aXJlX2xvY2soaW50ZXJwcmV0ZXJfbG9jaywgMSk7CisgICAgICAgIC8qIF9QeV9GaW5hbGl6aW5nIGlzIHByb3RlY3RlZCBieSB0aGUgR0lMICovCisgICAgICAgIGlmIChfUHlfRmluYWxpemluZyAmJiB0c3RhdGUgIT0gX1B5X0ZpbmFsaXppbmcpIHsKKyAgICAgICAgICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhpbnRlcnByZXRlcl9sb2NrKTsKKyAgICAgICAgICAgIFB5VGhyZWFkX2V4aXRfdGhyZWFkKCk7CisgICAgICAgICAgICBhc3NlcnQoMCk7ICAvKiB1bnJlYWNoYWJsZSAqLworICAgICAgICB9CiAgICAgICAgIGVycm5vID0gZXJyOwogICAgIH0KICNlbmRpZgpAQCAtMTAxOCw2ICsxMDI0LDEzIEBACiAgICAgICAgICAgICAgICAgLyogT3RoZXIgdGhyZWFkcyBtYXkgcnVuIG5vdyAqLwogCiAgICAgICAgICAgICAgICAgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGludGVycHJldGVyX2xvY2ssIDEpOworCisgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgd2Ugc2hvdWxkIG1ha2UgYSBxdWljayBleGl0LiAqLworICAgICAgICAgICAgICAgIGlmIChfUHlfRmluYWxpemluZyAmJiBfUHlfRmluYWxpemluZyAhPSB0c3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKGludGVycHJldGVyX2xvY2spOworICAgICAgICAgICAgICAgICAgICBQeVRocmVhZF9leGl0X3RocmVhZCgpOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIGlmIChQeVRocmVhZFN0YXRlX1N3YXAodHN0YXRlKSAhPSBOVUxMKQogICAgICAgICAgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJjZXZhbDogb3JwaGFuIHRzdGF0ZSIpOwogCkBAIC0zMjQwLDggKzMyNTMsNyBAQAogICAgIGlmIChjby0+Y29fZmxhZ3MgJiBDT19HRU5FUkFUT1IpIHsKICAgICAgICAgLyogRG9uJ3QgbmVlZCB0byBrZWVwIHRoZSByZWZlcmVuY2UgdG8gZl9iYWNrLCBpdCB3aWxsIGJlIHNldAogICAgICAgICAgKiB3aGVuIHRoZSBnZW5lcmF0b3IgaXMgcmVzdW1lZC4gKi8KLSAgICAgICAgUHlfWERFQ1JFRihmLT5mX2JhY2spOwotICAgICAgICBmLT5mX2JhY2sgPSBOVUxMOworICAgICAgICBQeV9DTEVBUihmLT5mX2JhY2spOwogCiAgICAgICAgIFBDQUxMKFBDQUxMX0dFTkVSQVRPUik7CiAKQEAgLTQ2NjEsMTggKzQ2NzMsOSBAQAogZXhlY19zdGF0ZW1lbnQoUHlGcmFtZU9iamVjdCAqZiwgUHlPYmplY3QgKnByb2csIFB5T2JqZWN0ICpnbG9iYWxzLAogICAgICAgICAgICAgICAgUHlPYmplY3QgKmxvY2FscykKIHsKLSAgICBpbnQgbjsKICAgICBQeU9iamVjdCAqdjsKICAgICBpbnQgcGxhaW4gPSAwOwogCi0gICAgaWYgKFB5VHVwbGVfQ2hlY2socHJvZykgJiYgZ2xvYmFscyA9PSBQeV9Ob25lICYmIGxvY2FscyA9PSBQeV9Ob25lICYmCi0gICAgICAgICgobiA9IFB5VHVwbGVfU2l6ZShwcm9nKSkgPT0gMiB8fCBuID09IDMpKSB7Ci0gICAgICAgIC8qIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaGFjayAqLwotICAgICAgICBnbG9iYWxzID0gUHlUdXBsZV9HZXRJdGVtKHByb2csIDEpOwotICAgICAgICBpZiAobiA9PSAzKQotICAgICAgICAgICAgbG9jYWxzID0gUHlUdXBsZV9HZXRJdGVtKHByb2csIDIpOwotICAgICAgICBwcm9nID0gUHlUdXBsZV9HZXRJdGVtKHByb2csIDApOwotICAgIH0KICAgICBpZiAoZ2xvYmFscyA9PSBQeV9Ob25lKSB7CiAgICAgICAgIGdsb2JhbHMgPSBQeUV2YWxfR2V0R2xvYmFscygpOwogICAgICAgICBpZiAobG9jYWxzID09IFB5X05vbmUpIHsKZGlmZiAtLWdpdCBhL1B5dGhvbi9jb2RlY3MuYyBiL1B5dGhvbi9jb2RlY3MuYwppbmRleCA3MzM0ZWIzLi42OTQ5OGM0IDEwMDY0NAotLS0gYS9QeXRob24vY29kZWNzLmMKKysrIGIvUHl0aG9uL2NvZGVjcy5jCkBAIC01MjEsNyArNTIxLDcgQEAKICAgICAgICAgUHlfVU5JQ09ERSByZXMgPSBQeV9VTklDT0RFX1JFUExBQ0VNRU5UX0NIQVJBQ1RFUjsKICAgICAgICAgaWYgKFB5VW5pY29kZURlY29kZUVycm9yX0dldEVuZChleGMsICZlbmQpKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIodSNuKSIsICZyZXMsIDEsIGVuZCk7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIodSNuKSIsICZyZXMsIChQeV9zc2l6ZV90KTEsIGVuZCk7CiAgICAgfQogICAgIGVsc2UgaWYgKFB5T2JqZWN0X0lzSW5zdGFuY2UoZXhjLCBQeUV4Y19Vbmljb2RlVHJhbnNsYXRlRXJyb3IpKSB7CiAgICAgICAgIFB5T2JqZWN0ICpyZXM7CkBAIC01NTYsNiArNTU2LDcgQEAKICAgICAgICAgUHlPYmplY3QgKnJlczsKICAgICAgICAgUHlfVU5JQ09ERSAqcDsKICAgICAgICAgUHlfVU5JQ09ERSAqc3RhcnRwOworICAgICAgICBQeV9VTklDT0RFICplOwogICAgICAgICBQeV9VTklDT0RFICpvdXRwOwogICAgICAgICBpbnQgcmVzc2l6ZTsKICAgICAgICAgaWYgKFB5VW5pY29kZUVuY29kZUVycm9yX0dldFN0YXJ0KGV4YywgJnN0YXJ0KSkKQEAgLTU2NSwyNiArNTY2LDMxIEBACiAgICAgICAgIGlmICghKG9iamVjdCA9IFB5VW5pY29kZUVuY29kZUVycm9yX0dldE9iamVjdChleGMpKSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICBzdGFydHAgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShvYmplY3QpOwotICAgICAgICBmb3IgKHAgPSBzdGFydHArc3RhcnQsIHJlc3NpemUgPSAwOyBwIDwgc3RhcnRwK2VuZDsgKytwKSB7Ci0gICAgICAgICAgICBpZiAoKnA8MTApCi0gICAgICAgICAgICAgICAgcmVzc2l6ZSArPSAyKzErMTsKLSAgICAgICAgICAgIGVsc2UgaWYgKCpwPDEwMCkKLSAgICAgICAgICAgICAgICByZXNzaXplICs9IDIrMisxOwotICAgICAgICAgICAgZWxzZSBpZiAoKnA8MTAwMCkKLSAgICAgICAgICAgICAgICByZXNzaXplICs9IDIrMysxOwotICAgICAgICAgICAgZWxzZSBpZiAoKnA8MTAwMDApCi0gICAgICAgICAgICAgICAgcmVzc2l6ZSArPSAyKzQrMTsKKyAgICAgICAgZSA9IHN0YXJ0cCArIGVuZDsKKyAgICAgICAgZm9yIChwID0gc3RhcnRwK3N0YXJ0LCByZXNzaXplID0gMDsgcCA8IGU7KSB7CisgICAgICAgICAgICBQeV9VQ1M0IGNoID0gKnArKzsKICNpZm5kZWYgUHlfVU5JQ09ERV9XSURFCi0gICAgICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiAoKDB4RDgwMCA8PSBjaCAmJiBjaCA8PSAweERCRkYpICYmCisgICAgICAgICAgICAgICAgKHAgPCBlKSAmJgorICAgICAgICAgICAgICAgICgweERDMDAgPD0gKnAgJiYgKnAgPD0gMHhERkZGKSkgeworICAgICAgICAgICAgICAgIGNoID0gKCgoKGNoICYgMHgwM0ZGKSA8PCAxMCkgfAorICAgICAgICAgICAgICAgICAgICAgICAoKFB5X1VDUzQpKnArKyAmIDB4MDNGRikpICsgMHgxMDAwMCk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChjaCA8IDEwKQorICAgICAgICAgICAgICAgIHJlc3NpemUgKz0gMisxKzE7CisgICAgICAgICAgICBlbHNlIGlmIChjaCA8IDEwMCkKKyAgICAgICAgICAgICAgICByZXNzaXplICs9IDIrMisxOworICAgICAgICAgICAgZWxzZSBpZiAoY2ggPCAxMDAwKQorICAgICAgICAgICAgICAgIHJlc3NpemUgKz0gMiszKzE7CisgICAgICAgICAgICBlbHNlIGlmIChjaCA8IDEwMDAwKQorICAgICAgICAgICAgICAgIHJlc3NpemUgKz0gMis0KzE7CisgICAgICAgICAgICBlbHNlIGlmIChjaCA8IDEwMDAwMCkKICAgICAgICAgICAgICAgICByZXNzaXplICs9IDIrNSsxOwotI2Vsc2UKLSAgICAgICAgICAgIGVsc2UgaWYgKCpwPDEwMDAwMCkKLSAgICAgICAgICAgICAgICByZXNzaXplICs9IDIrNSsxOwotICAgICAgICAgICAgZWxzZSBpZiAoKnA8MTAwMDAwMCkKKyAgICAgICAgICAgIGVsc2UgaWYgKGNoIDwgMTAwMDAwMCkKICAgICAgICAgICAgICAgICByZXNzaXplICs9IDIrNisxOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHJlc3NpemUgKz0gMis3KzE7Ci0jZW5kaWYKICAgICAgICAgfQogICAgICAgICAvKiBhbGxvY2F0ZSByZXBsYWNlbWVudCAqLwogICAgICAgICByZXMgPSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgcmVzc2l6ZSk7CkBAIC01OTMsNDAgKzU5OSw0MSBAQAogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICAgICAgLyogZ2VuZXJhdGUgcmVwbGFjZW1lbnQgKi8KLSAgICAgICAgZm9yIChwID0gc3RhcnRwK3N0YXJ0LCBvdXRwID0gUHlVbmljb2RlX0FTX1VOSUNPREUocmVzKTsKLSAgICAgICAgICAgIHAgPCBzdGFydHArZW5kOyArK3ApIHsKLSAgICAgICAgICAgIFB5X1VOSUNPREUgYyA9ICpwOworICAgICAgICBmb3IgKHAgPSBzdGFydHArc3RhcnQsIG91dHAgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXMpOyBwIDwgZTspIHsKICAgICAgICAgICAgIGludCBkaWdpdHM7CiAgICAgICAgICAgICBpbnQgYmFzZTsKKyAgICAgICAgICAgIFB5X1VDUzQgY2ggPSAqcCsrOworI2lmbmRlZiBQeV9VTklDT0RFX1dJREUKKyAgICAgICAgICAgIGlmICgoMHhEODAwIDw9IGNoICYmIGNoIDw9IDB4REJGRikgJiYKKyAgICAgICAgICAgICAgICAocCA8IHN0YXJ0cCtlbmQpICYmCisgICAgICAgICAgICAgICAgKDB4REMwMCA8PSAqcCAmJiAqcCA8PSAweERGRkYpKSB7CisgICAgICAgICAgICAgICAgY2ggPSAoKCgoY2ggJiAweDAzRkYpIDw8IDEwKSB8CisgICAgICAgICAgICAgICAgICAgICAgICgoUHlfVUNTNCkqcCsrICYgMHgwM0ZGKSkgKyAweDEwMDAwKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgogICAgICAgICAgICAgKm91dHArKyA9ICcmJzsKICAgICAgICAgICAgICpvdXRwKysgPSAnIyc7Ci0gICAgICAgICAgICBpZiAoKnA8MTApIHsKKyAgICAgICAgICAgIGlmIChjaCA8IDEwKSB7CiAgICAgICAgICAgICAgICAgZGlnaXRzID0gMTsKICAgICAgICAgICAgICAgICBiYXNlID0gMTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCpwPDEwMCkgeworICAgICAgICAgICAgZWxzZSBpZiAoY2ggPCAxMDApIHsKICAgICAgICAgICAgICAgICBkaWdpdHMgPSAyOwogICAgICAgICAgICAgICAgIGJhc2UgPSAxMDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCpwPDEwMDApIHsKKyAgICAgICAgICAgIGVsc2UgaWYgKGNoIDwgMTAwMCkgewogICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDM7CiAgICAgICAgICAgICAgICAgYmFzZSA9IDEwMDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCpwPDEwMDAwKSB7CisgICAgICAgICAgICBlbHNlIGlmIChjaCA8IDEwMDAwKSB7CiAgICAgICAgICAgICAgICAgZGlnaXRzID0gNDsKICAgICAgICAgICAgICAgICBiYXNlID0gMTAwMDsKICAgICAgICAgICAgIH0KLSNpZm5kZWYgUHlfVU5JQ09ERV9XSURFCi0gICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGVsc2UgaWYgKGNoIDwgMTAwMDAwKSB7CiAgICAgICAgICAgICAgICAgZGlnaXRzID0gNTsKICAgICAgICAgICAgICAgICBiYXNlID0gMTAwMDA7CiAgICAgICAgICAgICB9Ci0jZWxzZQotICAgICAgICAgICAgZWxzZSBpZiAoKnA8MTAwMDAwKSB7Ci0gICAgICAgICAgICAgICAgZGlnaXRzID0gNTsKLSAgICAgICAgICAgICAgICBiYXNlID0gMTAwMDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICgqcDwxMDAwMDAwKSB7CisgICAgICAgICAgICBlbHNlIGlmIChjaCA8IDEwMDAwMDApIHsKICAgICAgICAgICAgICAgICBkaWdpdHMgPSA2OwogICAgICAgICAgICAgICAgIGJhc2UgPSAxMDAwMDA7CiAgICAgICAgICAgICB9CkBAIC02MzQsMTAgKzY0MSw5IEBACiAgICAgICAgICAgICAgICAgZGlnaXRzID0gNzsKICAgICAgICAgICAgICAgICBiYXNlID0gMTAwMDAwMDsKICAgICAgICAgICAgIH0KLSNlbmRpZgogICAgICAgICAgICAgd2hpbGUgKGRpZ2l0cy0tPjApIHsKLSAgICAgICAgICAgICAgICAqb3V0cCsrID0gJzAnICsgYy9iYXNlOwotICAgICAgICAgICAgICAgIGMgJT0gYmFzZTsKKyAgICAgICAgICAgICAgICAqb3V0cCsrID0gJzAnICsgY2gvYmFzZTsKKyAgICAgICAgICAgICAgICBjaCAlPSBiYXNlOwogICAgICAgICAgICAgICAgIGJhc2UgLz0gMTA7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqb3V0cCsrID0gJzsnOwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2NvbXBpbGUuYyBiL1B5dGhvbi9jb21waWxlLmMKaW5kZXggMTE5YzYwZi4uMWNmNTNmOSAxMDA2NDQKLS0tIGEvUHl0aG9uL2NvbXBpbGUuYworKysgYi9QeXRob24vY29tcGlsZS5jCkBAIC0yMjEsOCArMjIxLDExIEBACiAgICAgfQogICAgIHBsZW4gPSBzdHJsZW4ocCk7CiAKLSAgICBhc3NlcnQoMSA8PSBQWV9TU0laRV9UX01BWCAtIG5sZW4pOwotICAgIGFzc2VydCgxICsgbmxlbiA8PSBQWV9TU0laRV9UX01BWCAtIHBsZW4pOworICAgIGlmIChwbGVuICsgbmxlbiA+PSBQWV9TU0laRV9UX01BWCAtIDEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicHJpdmF0ZSBpZGVudGlmaWVyIHRvbyBsYXJnZSB0byBiZSBtYW5nbGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAogICAgIGlkZW50ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgMSArIG5sZW4gKyBwbGVuKTsKICAgICBpZiAoIWlkZW50KQpAQCAtMzU5LDE0ICszNjIsMzEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0Ynl0eXBlKFB5T2JqZWN0ICpzcmMsIGludCBzY29wZV90eXBlLCBpbnQgZmxhZywgaW50IG9mZnNldCkKIHsKLSAgICBQeV9zc2l6ZV90IHBvcyA9IDAsIGkgPSBvZmZzZXQsIHNjb3BlOworICAgIFB5X3NzaXplX3QgaSA9IG9mZnNldCwgc2NvcGUsIG51bV9rZXlzLCBrZXlfaTsKICAgICBQeU9iamVjdCAqaywgKnYsICpkZXN0ID0gUHlEaWN0X05ldygpOworICAgIFB5T2JqZWN0ICpzb3J0ZWRfa2V5czsKIAogICAgIGFzc2VydChvZmZzZXQgPj0gMCk7CiAgICAgaWYgKGRlc3QgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICB3aGlsZSAoUHlEaWN0X05leHQoc3JjLCAmcG9zLCAmaywgJnYpKSB7CisgICAgLyogU29ydCB0aGUga2V5cyBzbyB0aGF0IHdlIGhhdmUgYSBkZXRlcm1pbmlzdGljIG9yZGVyIG9uIHRoZSBpbmRleGVzCisgICAgICAgc2F2ZWQgaW4gdGhlIHJldHVybmVkIGRpY3Rpb25hcnkuICBUaGVzZSBpbmRleGVzIGFyZSB1c2VkIGFzIGluZGV4ZXMKKyAgICAgICBpbnRvIHRoZSBmcmVlIGFuZCBjZWxsIHZhciBzdG9yYWdlLiAgVGhlcmVmb3JlIGlmIHRoZXkgYXJlbid0CisgICAgICAgZGV0ZXJtaW5pc3RpYywgdGhlbiB0aGUgZ2VuZXJhdGVkIGJ5dGVjb2RlIGlzIG5vdCBkZXRlcm1pbmlzdGljLgorICAgICovCisgICAgc29ydGVkX2tleXMgPSBQeURpY3RfS2V5cyhzcmMpOworICAgIGlmIChzb3J0ZWRfa2V5cyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlMaXN0X1NvcnQoc29ydGVkX2tleXMpICE9IDApIHsKKyAgICAgICAgUHlfREVDUkVGKHNvcnRlZF9rZXlzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG51bV9rZXlzID0gUHlMaXN0X0dFVF9TSVpFKHNvcnRlZF9rZXlzKTsKKworICAgIGZvciAoa2V5X2kgPSAwOyBrZXlfaSA8IG51bV9rZXlzOyBrZXlfaSsrKSB7CisgICAgICAgIGsgPSBQeUxpc3RfR0VUX0lURU0oc29ydGVkX2tleXMsIGtleV9pKTsKKyAgICAgICAgdiA9IFB5RGljdF9HZXRJdGVtKHNyYywgayk7CiAgICAgICAgIC8qIFhYWCB0aGlzIHNob3VsZCBwcm9iYWJseSBiZSBhIG1hY3JvIGluIHN5bXRhYmxlLmggKi8KICAgICAgICAgYXNzZXJ0KFB5SW50X0NoZWNrKHYpKTsKICAgICAgICAgc2NvcGUgPSAoUHlJbnRfQVNfTE9ORyh2KSA+PiBTQ09QRV9PRkYpICYgU0NPUEVfTUFTSzsKQEAgLTM3NCwxMiArMzk0LDE0IEBACiAgICAgICAgIGlmIChzY29wZSA9PSBzY29wZV90eXBlIHx8IFB5SW50X0FTX0xPTkcodikgJiBmbGFnKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqdHVwbGUsICppdGVtID0gUHlJbnRfRnJvbUxvbmcoaSk7CiAgICAgICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHNvcnRlZF9rZXlzKTsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZGVzdCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICB0dXBsZSA9IFB5VHVwbGVfUGFjaygyLCBrLCBrLT5vYl90eXBlKTsKICAgICAgICAgICAgIGlmICghdHVwbGUgfHwgUHlEaWN0X1NldEl0ZW0oZGVzdCwgdHVwbGUsIGl0ZW0pIDwgMCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzb3J0ZWRfa2V5cyk7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOwogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihkZXN0KTsKICAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHR1cGxlKTsKQEAgLTM4OSw2ICs0MTEsNyBAQAogICAgICAgICAgICAgUHlfREVDUkVGKHR1cGxlKTsKICAgICAgICAgfQogICAgIH0KKyAgICBQeV9ERUNSRUYoc29ydGVkX2tleXMpOwogICAgIHJldHVybiBkZXN0OwogfQogCkBAIC0zNDYwLDEyICszNDgzLDE2IEBACiAgICAgICAgICAgICB0YXJnZXRfZGVwdGggPSBkZXB0aDsKICAgICAgICAgICAgIGlmIChpbnN0ci0+aV9vcGNvZGUgPT0gRk9SX0lURVIpIHsKICAgICAgICAgICAgICAgICB0YXJnZXRfZGVwdGggPSBkZXB0aC0yOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpbnN0ci0+aV9vcGNvZGUgPT0gU0VUVVBfRklOQUxMWSB8fAotICAgICAgICAgICAgICAgICAgICAgICBpbnN0ci0+aV9vcGNvZGUgPT0gU0VUVVBfRVhDRVBUKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChpbnN0ci0+aV9vcGNvZGUgPT0gU0VUVVBfRklOQUxMWSB8fAorICAgICAgICAgICAgICAgICAgICAgaW5zdHItPmlfb3Bjb2RlID09IFNFVFVQX0VYQ0VQVCkgewogICAgICAgICAgICAgICAgIHRhcmdldF9kZXB0aCA9IGRlcHRoKzM7CiAgICAgICAgICAgICAgICAgaWYgKHRhcmdldF9kZXB0aCA+IG1heGRlcHRoKQogICAgICAgICAgICAgICAgICAgICBtYXhkZXB0aCA9IHRhcmdldF9kZXB0aDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGluc3RyLT5pX29wY29kZSA9PSBKVU1QX0lGX1RSVUVfT1JfUE9QIHx8CisgICAgICAgICAgICAgICAgICAgICBpbnN0ci0+aV9vcGNvZGUgPT0gSlVNUF9JRl9GQUxTRV9PUl9QT1ApCisgICAgICAgICAgICAgICAgZGVwdGggPSBkZXB0aCAtIDE7CiAgICAgICAgICAgICBtYXhkZXB0aCA9IHN0YWNrZGVwdGhfd2FsayhjLCBpbnN0ci0+aV90YXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfZGVwdGgsIG1heGRlcHRoKTsKICAgICAgICAgICAgIGlmIChpbnN0ci0+aV9vcGNvZGUgPT0gSlVNUF9BQlNPTFVURSB8fApkaWZmIC0tZ2l0IGEvUHl0aG9uL2R0b2EuYyBiL1B5dGhvbi9kdG9hLmMKaW5kZXggNDRkYzAxZi4uNzNlMjNhZiAxMDA2NDQKLS0tIGEvUHl0aG9uL2R0b2EuYworKysgYi9QeXRob24vZHRvYS5jCkBAIC0yMDQsNyArMjA0LDI0IEBACiAgICBNQVhfQUJTX0VYUCBpbiBhYnNvbHV0ZSB2YWx1ZSBnZXQgdHJ1bmNhdGVkIHRvICstTUFYX0FCU19FWFAuICBNQVhfQUJTX0VYUAogICAgc2hvdWxkIGZpdCBpbnRvIGFuIGludC4gKi8KICNpZm5kZWYgTUFYX0FCU19FWFAKLSNkZWZpbmUgTUFYX0FCU19FWFAgMTk5OTlVCisjZGVmaW5lIE1BWF9BQlNfRVhQIDExMDAwMDAwMDBVCisjZW5kaWYKKy8qIEJvdW5kIG9uIGxlbmd0aCBvZiBwaWVjZXMgb2YgaW5wdXQgc3RyaW5ncyBpbiBfUHlfZGdfc3RydG9kOyBzcGVjaWZpY2FsbHksCisgICB0aGlzIGlzIHVzZWQgdG8gYm91bmQgdGhlIHRvdGFsIG51bWJlciBvZiBkaWdpdHMgaWdub3JpbmcgbGVhZGluZyB6ZXJvcyBhbmQKKyAgIHRoZSBudW1iZXIgb2YgZGlnaXRzIHRoYXQgZm9sbG93IHRoZSBkZWNpbWFsIHBvaW50LiAgSWRlYWxseSwgTUFYX0RJR0lUUworICAgc2hvdWxkIHNhdGlzZnkgTUFYX0RJR0lUUyArIDQwMCA8IE1BWF9BQlNfRVhQOyB0aGF0IGVuc3VyZXMgdGhhdCB0aGUKKyAgIGV4cG9uZW50IGNsaXBwaW5nIGluIF9QeV9kZ19zdHJ0b2QgY2FuJ3QgYWZmZWN0IHRoZSB2YWx1ZSBvZiB0aGUgb3V0cHV0LiAqLworI2lmbmRlZiBNQVhfRElHSVRTCisjZGVmaW5lIE1BWF9ESUdJVFMgMTAwMDAwMDAwMFUKKyNlbmRpZgorCisvKiBHdWFyZCBhZ2FpbnN0IHRyeWluZyB0byB1c2UgdGhlIGFib3ZlIHZhbHVlcyBvbiB1bnVzdWFsIHBsYXRmb3JtcyB3aXRoIGludHMKKyAqIG9mIHdpZHRoIGxlc3MgdGhhbiAzMiBiaXRzLiAqLworI2lmIE1BWF9BQlNfRVhQID4gSU5UX01BWAorI2Vycm9yICJNQVhfQUJTX0VYUCBzaG91bGQgZml0IGluIGFuIGludCIKKyNlbmRpZgorI2lmIE1BWF9ESUdJVFMgPiBJTlRfTUFYCisjZXJyb3IgIk1BWF9ESUdJVFMgc2hvdWxkIGZpdCBpbiBhbiBpbnQiCiAjZW5kaWYKIAogLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9uIG9mIFN0b3JlaW5jIGlzIGFwcHJvcHJpYXRlIGZvciBNSVBTIHByb2Nlc3NvcnMuCkBAIC0xNDk4LDYgKzE1MTUsNyBAQAogICAgIExvbmcgTDsKICAgICBCQ2luZm8gYmM7CiAgICAgQmlnaW50ICpiYiwgKmJiMSwgKmJkLCAqYmQwLCAqYnMsICpkZWx0YTsKKyAgICBzaXplX3QgbmRpZ2l0cywgZnJhY2xlbjsKIAogICAgIGR2YWwoJnJ2KSA9IDAuOwogCkBAIC0xNTIwLDQwICsxNTM4LDUzIEBACiAgICAgICAgIGMgPSAqKytzOwogICAgIGx6ID0gcyAhPSBzMTsKIAotICAgIC8qIFBvaW50IHMwIGF0IHRoZSBmaXJzdCBub256ZXJvIGRpZ2l0IChpZiBhbnkpLiAgbmQwIHdpbGwgYmUgdGhlIHBvc2l0aW9uCi0gICAgICAgb2YgdGhlIHBvaW50IHJlbGF0aXZlIHRvIHMwLiAgbmQgd2lsbCBiZSB0aGUgdG90YWwgbnVtYmVyIG9mIGRpZ2l0cwotICAgICAgIGlnbm9yaW5nIGxlYWRpbmcgemVyb3MuICovCisgICAgLyogUG9pbnQgczAgYXQgdGhlIGZpcnN0IG5vbnplcm8gZGlnaXQgKGlmIGFueSkuICBmcmFjbGVuIHdpbGwgYmUgdGhlCisgICAgICAgbnVtYmVyIG9mIGRpZ2l0cyBiZXR3ZWVuIHRoZSBkZWNpbWFsIHBvaW50IGFuZCB0aGUgZW5kIG9mIHRoZQorICAgICAgIGRpZ2l0IHN0cmluZy4gIG5kaWdpdHMgd2lsbCBiZSB0aGUgdG90YWwgbnVtYmVyIG9mIGRpZ2l0cyBpZ25vcmluZworICAgICAgIGxlYWRpbmcgemVyb3MuICovCiAgICAgczAgPSBzMSA9IHM7CiAgICAgd2hpbGUgKCcwJyA8PSBjICYmIGMgPD0gJzknKQogICAgICAgICBjID0gKisrczsKLSAgICBuZDAgPSBuZCA9IHMgLSBzMTsKKyAgICBuZGlnaXRzID0gcyAtIHMxOworICAgIGZyYWNsZW4gPSAwOwogCiAgICAgLyogUGFyc2UgZGVjaW1hbCBwb2ludCBhbmQgZm9sbG93aW5nIGRpZ2l0cy4gKi8KICAgICBpZiAoYyA9PSAnLicpIHsKICAgICAgICAgYyA9ICorK3M7Ci0gICAgICAgIGlmICghbmQpIHsKKyAgICAgICAgaWYgKCFuZGlnaXRzKSB7CiAgICAgICAgICAgICBzMSA9IHM7CiAgICAgICAgICAgICB3aGlsZSAoYyA9PSAnMCcpCiAgICAgICAgICAgICAgICAgYyA9ICorK3M7CiAgICAgICAgICAgICBseiA9IGx6IHx8IHMgIT0gczE7Ci0gICAgICAgICAgICBuZDAgLT0gcyAtIHMxOworICAgICAgICAgICAgZnJhY2xlbiArPSAocyAtIHMxKTsKICAgICAgICAgICAgIHMwID0gczsKICAgICAgICAgfQogICAgICAgICBzMSA9IHM7CiAgICAgICAgIHdoaWxlICgnMCcgPD0gYyAmJiBjIDw9ICc5JykKICAgICAgICAgICAgIGMgPSAqKytzOwotICAgICAgICBuZCArPSBzIC0gczE7CisgICAgICAgIG5kaWdpdHMgKz0gcyAtIHMxOworICAgICAgICBmcmFjbGVuICs9IHMgLSBzMTsKICAgICB9CiAKLSAgICAvKiBOb3cgbHogaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGVyZSB3ZXJlIGxlYWRpbmcgemVybyBkaWdpdHMsIGFuZCBuZAotICAgICAgIGdpdmVzIHRoZSB0b3RhbCBudW1iZXIgb2YgZGlnaXRzIGlnbm9yaW5nIGxlYWRpbmcgemVyb3MuICBBIHZhbGlkIGlucHV0Ci0gICAgICAgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBkaWdpdC4gKi8KLSAgICBpZiAoIW5kICYmICFseikgeworICAgIC8qIE5vdyBseiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZXJlIHdlcmUgbGVhZGluZyB6ZXJvIGRpZ2l0cywgYW5kCisgICAgICAgbmRpZ2l0cyBnaXZlcyB0aGUgdG90YWwgbnVtYmVyIG9mIGRpZ2l0cyBpZ25vcmluZyBsZWFkaW5nIHplcm9zLiAgQQorICAgICAgIHZhbGlkIGlucHV0IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZGlnaXQuICovCisgICAgaWYgKCFuZGlnaXRzICYmICFseikgewogICAgICAgICBpZiAoc2UpCiAgICAgICAgICAgICAqc2UgPSAoY2hhciAqKXMwMDsKICAgICAgICAgZ290byBwYXJzZV9lcnJvcjsKICAgICB9CiAKKyAgICAvKiBSYW5nZSBjaGVjayBuZGlnaXRzIGFuZCBmcmFjbGVuIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXksIGFuZCB2YWx1ZXMKKyAgICAgICBjb21wdXRlZCB3aXRoIHRoZW0sIGNhbiBzYWZlbHkgZml0IGluIGFuIGludC4gKi8KKyAgICBpZiAobmRpZ2l0cyA+IE1BWF9ESUdJVFMgfHwgZnJhY2xlbiA+IE1BWF9ESUdJVFMpIHsKKyAgICAgICAgaWYgKHNlKQorICAgICAgICAgICAgKnNlID0gKGNoYXIgKilzMDA7CisgICAgICAgIGdvdG8gcGFyc2VfZXJyb3I7CisgICAgfQorICAgIG5kID0gKGludCluZGlnaXRzOworICAgIG5kMCA9IChpbnQpbmRpZ2l0cyAtIChpbnQpZnJhY2xlbjsKKwogICAgIC8qIFBhcnNlIGV4cG9uZW50LiAqLwogICAgIGUgPSAwOwogICAgIGlmIChjID09ICdlJyB8fCBjID09ICdFJykgewpAQCAtMTg4NiwyMCArMTkxNywyMCBAQAogICAgICAgICBiZDIrKzsKIAogICAgICAgICAvKiBBdCB0aGlzIHN0YWdlIGJkNSAtIGJiNSA9PSBlID09IGJkMiAtIGJiMiArIGJiZSwgYmIyIC0gYnMyID09IDEsCi0JICAgYW5kIGJzID09IDEsIHNvOgorICAgICAgICAgICBhbmQgYnMgPT0gMSwgc286CiAKICAgICAgICAgICAgICAgdGR2ID09IGJkICogMTAqKmUgPSBiZCAqIDIqKihiYmUgLSBiYjIgKyBiZDIpICogNSoqKGJkNSAtIGJiNSkKICAgICAgICAgICAgICAgc3J2ID09IGJiICogMioqYmJlID0gYmIgKiAyKiooYmJlIC0gYmIyICsgYmIyKQotCSAgICAgIDAuNSB1bHAoc3J2KSA9PSAyKiooYmJlLTEpID0gYnMgKiAyKiooYmJlIC0gYmIyICsgYnMyKQorICAgICAgICAgICAgICAwLjUgdWxwKHNydikgPT0gMioqKGJiZS0xKSA9IGJzICogMioqKGJiZSAtIGJiMiArIGJzMikKIAotCSAgIEl0IGZvbGxvd3MgdGhhdDoKKyAgICAgICAgICAgSXQgZm9sbG93cyB0aGF0OgogCiAgICAgICAgICAgICAgIE0gKiB0ZHYgPSBiZCAqIDIqKmJkMiAqIDUqKmJkNQogICAgICAgICAgICAgICBNICogc3J2ID0gYmIgKiAyKipiYjIgKiA1KipiYjUKICAgICAgICAgICAgICAgTSAqIDAuNSB1bHAoc3J2KSA9IGJzICogMioqYnMyICogNSoqYmI1CiAKLQkgICBmb3Igc29tZSBjb25zdGFudCBNLiAgKEFjdHVhbGx5LCBNID09IDIqKihiYjIgLSBiYmUpICogNSoqYmI1LCBidXQKLQkgICB0aGlzIGZhY3QgaXMgbm90IG5lZWRlZCBiZWxvdy4pCisgICAgICAgICAgIGZvciBzb21lIGNvbnN0YW50IE0uICAoQWN0dWFsbHksIE0gPT0gMioqKGJiMiAtIGJiZSkgKiA1KipiYjUsIGJ1dAorICAgICAgICAgICB0aGlzIGZhY3QgaXMgbm90IG5lZWRlZCBiZWxvdy4pCiAgICAgICAgICovCiAKICAgICAgICAgLyogUmVtb3ZlIGZhY3RvciBvZiAyKippLCB3aGVyZSBpID0gbWluKGJiMiwgYmQyLCBiczIpLiAqLwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2Z1dHVyZS5jIGIvUHl0aG9uL2Z1dHVyZS5jCmluZGV4IDk2YmU3NTcuLjBlNjg4NDUgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9mdXR1cmUuYworKysgYi9QeXRob24vZnV0dXJlLmMKQEAgLTU5LDEzICs1OSw2IEBACiB7CiAgICAgaW50IGksIGZvdW5kX2RvY3N0cmluZyA9IDAsIGRvbmUgPSAwLCBwcmV2X2xpbmUgPSAwOwogCi0gICAgc3RhdGljIFB5T2JqZWN0ICpmdXR1cmU7Ci0gICAgaWYgKCFmdXR1cmUpIHsKLSAgICAgICAgZnV0dXJlID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19mdXR1cmVfXyIpOwotICAgICAgICBpZiAoIWZ1dHVyZSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLQogICAgIGlmICghKG1vZC0+a2luZCA9PSBNb2R1bGVfa2luZCB8fCBtb2QtPmtpbmQgPT0gSW50ZXJhY3RpdmVfa2luZCkpCiAgICAgICAgIHJldHVybiAxOwogCkBAIC05Miw3ICs4NSw5IEBACiAgICAgICAgICovCiAKICAgICAgICAgaWYgKHMtPmtpbmQgPT0gSW1wb3J0RnJvbV9raW5kKSB7Ci0gICAgICAgICAgICBpZiAocy0+di5JbXBvcnRGcm9tLm1vZHVsZSA9PSBmdXR1cmUpIHsKKyAgICAgICAgICAgIGlkZW50aWZpZXIgbW9kbmFtZSA9IHMtPnYuSW1wb3J0RnJvbS5tb2R1bGU7CisgICAgICAgICAgICBpZiAobW9kbmFtZSAmJiBQeVN0cmluZ19HRVRfU0laRShtb2RuYW1lKSA9PSAxMCAmJgorICAgICAgICAgICAgICAgICFzdHJjbXAoUHlTdHJpbmdfQVNfU1RSSU5HKG1vZG5hbWUpLCAiX19mdXR1cmVfXyIpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGRvbmUpIHsKICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5bnRheEVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX0xBVEVfRlVUVVJFKTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9nZXRhcmdzLmMgYi9QeXRob24vZ2V0YXJncy5jCmluZGV4IGVjY2RjOWIuLjgxYTI3MjEgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9nZXRhcmdzLmMKKysrIGIvUHl0aG9uL2dldGFyZ3MuYwpAQCAtMTQxMCw3ICsxNDEwLDcgQEAKICAgICAgICAgKmVycm1zZyA9ICJjb252ZXJ0aWJsZSB0byBhIGJ1ZmZlciI7CiAgICAgICAgIHJldHVybiBjb3VudDsKICAgICB9Ci0gICAgUHlCdWZmZXJfRmlsbEluZm8odmlldywgTlVMTCwgYnVmLCBjb3VudCwgMSwgMCk7CisgICAgUHlCdWZmZXJfRmlsbEluZm8odmlldywgYXJnLCBidWYsIGNvdW50LCAxLCAwKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTgzNyw2ICsxODM3LDcgQEAKICAgICBhc3NlcnQobWluID49IDApOwogICAgIGFzc2VydChtaW4gPD0gbWF4KTsKICAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKKyAgICAgICAgdmFfZW5kKHZhcmdzKTsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAogICAgICAgICAgICAgIlB5QXJnX1VucGFja1R1cGxlKCkgYXJndW1lbnQgbGlzdCBpcyBub3QgYSB0dXBsZSIpOwogICAgICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL1B5dGhvbi9nZXRjb3B5cmlnaHQuYyBiL1B5dGhvbi9nZXRjb3B5cmlnaHQuYwppbmRleCA4MjRjN2IxLi42MjlhMjQwIDEwMDY0NAotLS0gYS9QeXRob24vZ2V0Y29weXJpZ2h0LmMKKysrIGIvUHl0aG9uL2dldGNvcHlyaWdodC5jCkBAIC00LDcgKzQsNyBAQAogCiBzdGF0aWMgY2hhciBjcHJ0W10gPSAKICJcCi1Db3B5cmlnaHQgKGMpIDIwMDEtMjAxMSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi5cblwKK0NvcHlyaWdodCAoYykgMjAwMS0yMDE0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLlxuXAogQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKIFxuXAogQ29weXJpZ2h0IChjKSAyMDAwIEJlT3Blbi5jb20uXG5cCmRpZmYgLS1naXQgYS9QeXRob24vZ2V0b3B0LmMgYi9QeXRob24vZ2V0b3B0LmMKaW5kZXggMDkzYzNkYS4uYWY1YjAzYyAxMDA2NDQKLS0tIGEvUHl0aG9uL2dldG9wdC5jCisrKyBiL1B5dGhvbi9nZXRvcHQuYwpAQCAtMzcsMTAgKzM3LDE4IEBACiBpbnQgX1B5T1Nfb3B0ZXJyID0gMTsgICAgICAgICAgLyogZ2VuZXJhdGUgZXJyb3IgbWVzc2FnZXMgKi8KIGludCBfUHlPU19vcHRpbmQgPSAxOyAgICAgICAgICAvKiBpbmRleCBpbnRvIGFyZ3YgYXJyYXkgICAqLwogY2hhciAqX1B5T1Nfb3B0YXJnID0gTlVMTDsgICAgIC8qIG9wdGlvbmFsIGFyZ3VtZW50ICAgICAgICovCitzdGF0aWMgY2hhciAqb3B0X3B0ciA9ICIiOworCit2b2lkIF9QeU9TX1Jlc2V0R2V0T3B0KHZvaWQpCit7CisgICAgX1B5T1Nfb3B0ZXJyID0gMTsKKyAgICBfUHlPU19vcHRpbmQgPSAxOworICAgIF9QeU9TX29wdGFyZyA9IE5VTEw7CisgICAgb3B0X3B0ciA9ICIiOworfQogCiBpbnQgX1B5T1NfR2V0T3B0KGludCBhcmdjLCBjaGFyICoqYXJndiwgY2hhciAqb3B0c3RyaW5nKQogewotICAgIHN0YXRpYyBjaGFyICpvcHRfcHRyID0gIiI7CiAgICAgY2hhciAqcHRyOwogICAgIGludCBvcHRpb247CiAKQEAgLTc4LDE3ICs4NiwxOSBAQAogICAgICAgICBvcHRfcHRyID0gJmFyZ3ZbX1B5T1Nfb3B0aW5kKytdWzFdOwogICAgIH0KIAotICAgIGlmICggKG9wdGlvbiA9ICpvcHRfcHRyKyspID09ICdcMCcpCisgICAgaWYgKChvcHRpb24gPSAqb3B0X3B0cisrKSA9PSAnXDAnKQogICAgICAgICByZXR1cm4gLTE7CiAKICAgICBpZiAob3B0aW9uID09ICdKJykgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIi1KIGlzIHJlc2VydmVkIGZvciBKeXRob25cbiIpOworICAgICAgICBpZiAoX1B5T1Nfb3B0ZXJyKQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICItSiBpcyByZXNlcnZlZCBmb3IgSnl0aG9uXG4iKTsKICAgICAgICAgcmV0dXJuICdfJzsKICAgICB9CiAKICAgICBpZiAob3B0aW9uID09ICdYJykgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAiLVggaXMgcmVzZXJ2ZWQgZm9yIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIGFyZ3VtZW50c1xuIik7CisgICAgICAgIGlmIChfUHlPU19vcHRlcnIpCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAiLVggaXMgcmVzZXJ2ZWQgZm9yIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIGFyZ3VtZW50c1xuIik7CiAgICAgICAgIHJldHVybiAnXyc7CiAgICAgfQogCkBAIC0xMDksNyArMTE5LDcgQEAKICAgICAgICAgICAgIGlmIChfUHlPU19vcHRpbmQgPj0gYXJnYykgewogICAgICAgICAgICAgICAgIGlmIChfUHlPU19vcHRlcnIpCiAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICAgICAgICJBcmd1bWVudCBleHBlY3RlZCBmb3IgdGhlIC0lYyBvcHRpb25cbiIsIG9wdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAiQXJndW1lbnQgZXhwZWN0ZWQgZm9yIHRoZSAtJWMgb3B0aW9uXG4iLCBvcHRpb24pOwogICAgICAgICAgICAgICAgIHJldHVybiAnXyc7CiAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL1B5dGhvbi9pbXBvcnQuYyBiL1B5dGhvbi9pbXBvcnQuYwppbmRleCBjNjBlY2ZlLi45MjM2M2IzIDEwMDY0NAotLS0gYS9QeXRob24vaW1wb3J0LmMKKysrIGIvUHl0aG9uL2ltcG9ydC5jCkBAIC0xMTQsNiArMTE0LDM0IEBACiB9OwogI2VuZGlmCiAKKyNpZmRlZiBNU19XSU5ET1dTCitzdGF0aWMgaW50IGlzZGlyKGNoYXIgKnBhdGgpIHsKKyAgICBEV09SRCBydjsKKyAgICAvKiBzZWUgaXNzdWUxMjkzIGFuZCBpc3N1ZTM2Nzc6CisgICAgICogc3RhdCgpIG9uIFdpbmRvd3MgZG9lc24ndCByZWNvZ25pc2UgcGF0aHMgbGlrZQorICAgICAqICJlOlxcc2hhcmVkXFwiIGFuZCAiXFxcXHdoaXRlcmFiLWMyem5saFxcc2hhcmVkIiBhcyBkaXJzLgorICAgICAqIEFsc28gcmVmZXJlbmNlIGlzc3VlNjcyNzoKKyAgICAgKiBzdGF0KCkgb24gV2luZG93cyBpcyBicm9rZW4gYW5kIGRvZXNuJ3QgcmVzb2x2ZSBzeW1saW5rcyBwcm9wZXJseS4KKyAgICAgKi8KKyAgICBydiA9IEdldEZpbGVBdHRyaWJ1dGVzQShwYXRoKTsKKyAgICByZXR1cm4gcnYgIT0gSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMgJiYgcnYgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlk7Cit9CisjZWxzZQorI2lmZGVmIEhBVkVfU1RBVAorc3RhdGljIGludCBpc2RpcihjaGFyICpwYXRoKSB7CisgICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKyAgICByZXR1cm4gc3RhdChwYXRoLCAmc3RhdGJ1ZikgPT0gMCAmJiBTX0lTRElSKHN0YXRidWYuc3RfbW9kZSk7Cit9CisjZWxzZQorI2lmZGVmIFJJU0NPUworLyogd2l0aCBSSVNDT1MsIGlzZGlyIGlzIGluIHVuaXhzdHVmZiAqLworI2Vsc2UKK2ludCBpc2RpcihjaGFyICpwYXRoKSB7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogUklTQ09TICovCisjZW5kaWYgLyogSEFWRV9TVEFUICovCisjZW5kaWYgLyogTVNfV0lORE9XUyAqLwogCiAvKiBJbml0aWFsaXplIHRoaW5ncyAqLwogCkBAIC04NzYsMTIgKzkwNCwxNyBAQAogICAgcmVtb3ZlIHRoZSBmaWxlLiAqLwogCiBzdGF0aWMgdm9pZAotd3JpdGVfY29tcGlsZWRfbW9kdWxlKFB5Q29kZU9iamVjdCAqY28sIGNoYXIgKmNwYXRobmFtZSwgc3RydWN0IHN0YXQgKnNyY3N0YXQpCit3cml0ZV9jb21waWxlZF9tb2R1bGUoUHlDb2RlT2JqZWN0ICpjbywgY2hhciAqY3BhdGhuYW1lLCBzdHJ1Y3Qgc3RhdCAqc3Jjc3RhdCwgdGltZV90IG10aW1lKQogewogICAgIEZJTEUgKmZwOwotICAgIHRpbWVfdCBtdGltZSA9IHNyY3N0YXQtPnN0X210aW1lOwogI2lmZGVmIE1TX1dJTkRPV1MgICAvKiBzaW5jZSBXaW5kb3dzIHVzZXMgZGlmZmVyZW50IHBlcm1pc3Npb25zICAqLwogICAgIG1vZGVfdCBtb2RlID0gc3Jjc3RhdC0+c3RfbW9kZSAmIH5TX0lFWEVDOworICAgIC8qIElzc3VlICM2MDc0OiBXZSBlbnN1cmUgdXNlciB3cml0ZSBhY2Nlc3MsIHNvIHdlIGNhbiBkZWxldGUgaXQgbGF0ZXIKKyAgICAgKiB3aGVuIHRoZSBzb3VyY2UgZmlsZSBjaGFuZ2VzLiAoT24gUE9TSVgsIHRoaXMgb25seSByZXF1aXJlcyB3cml0ZQorICAgICAqIGFjY2VzcyB0byB0aGUgZGlyZWN0b3J5LCBvbiBXaW5kb3dzLCB3ZSBuZWVkIHdyaXRlIGFjY2VzcyB0byB0aGUgZmlsZQorICAgICAqIGFzIHdlbGwpCisgICAgICovCisgICAgbW9kZSB8PSBfU19JV1JJVEU7CiAjZWxzZQogICAgIG1vZGVfdCBtb2RlID0gc3Jjc3RhdC0+c3RfbW9kZSAmIH5TX0lYVVNSICYgflNfSVhHUlAgJiB+U19JWE9USDsKICNlbmRpZgpAQCAtOTA1LDkgKzkzOCw5IEBACiAgICAgICAgICh2b2lkKSB1bmxpbmsoY3BhdGhuYW1lKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICAvKiBOb3cgd3JpdGUgdGhlIHRydWUgbXRpbWUgKi8KKyAgICAvKiBOb3cgd3JpdGUgdGhlIHRydWUgbXRpbWUgKGFzIGEgMzItYml0IGZpZWxkKSAqLwogICAgIGZzZWVrKGZwLCA0TCwgMCk7Ci0gICAgYXNzZXJ0KG10aW1lIDwgTE9OR19NQVgpOworICAgIGFzc2VydChtdGltZSA8PSAweEZGRkZGRkZGKTsKICAgICBQeU1hcnNoYWxfV3JpdGVMb25nVG9GaWxlKChsb25nKW10aW1lLCBmcCwgUHlfTUFSU0hBTF9WRVJTSU9OKTsKICAgICBmZmx1c2goZnApOwogICAgIGZjbG9zZShmcCk7CkBAIC05NTksNiArOTkyLDM4IEBACiAgICAgcmV0dXJuIDE7CiB9CiAKKyNpZmRlZiBNU19XSU5ET1dTCisKKy8qIFNlY29uZHMgYmV0d2VlbiAxLjEuMTYwMSBhbmQgMS4xLjE5NzAgKi8KK3N0YXRpYyBfX2ludDY0IHNlY3NfYmV0d2Vlbl9lcG9jaHMgPSAxMTY0NDQ3MzYwMDsKKworLyogR2V0IG10aW1lIGZyb20gZmlsZSBwb2ludGVyLiAqLworCitzdGF0aWMgdGltZV90Cit3aW4zMl9tdGltZShGSUxFICpmcCwgY2hhciAqcGF0aG5hbWUpCit7CisgICAgX19pbnQ2NCBmaWxldGltZTsKKyAgICBIQU5ETEUgZmg7CisgICAgQllfSEFORExFX0ZJTEVfSU5GT1JNQVRJT04gZmlsZV9pbmZvcm1hdGlvbjsKKworICAgIGZoID0gKEhBTkRMRSlfZ2V0X29zZmhhbmRsZShmaWxlbm8oZnApKTsKKyAgICBpZiAoZmggPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUgfHwKKyAgICAgICAgIUdldEZpbGVJbmZvcm1hdGlvbkJ5SGFuZGxlKGZoLCAmZmlsZV9pbmZvcm1hdGlvbikpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gZ2V0IGZpbGUgc3RhdHVzIGZyb20gJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICBwYXRobmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgLyogZmlsZXRpbWUgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIDEwMG5zIGludGVydmFscyBzaW5jZQorICAgICAgIDEuMS4xNjAxIChVVEMpLiAgQ29udmVydCB0byBzZWNvbmRzIHNpbmNlIDEuMS4xOTcwIChVVEMpLiAqLworICAgIGZpbGV0aW1lID0gKF9faW50NjQpZmlsZV9pbmZvcm1hdGlvbi5mdExhc3RXcml0ZVRpbWUuZHdIaWdoRGF0ZVRpbWUgPDwgMzIgfAorICAgICAgICAgICAgICAgZmlsZV9pbmZvcm1hdGlvbi5mdExhc3RXcml0ZVRpbWUuZHdMb3dEYXRlVGltZTsKKyAgICByZXR1cm4gZmlsZXRpbWUgLyAxMDAwMDAwMCAtIHNlY3NfYmV0d2Vlbl9lcG9jaHM7Cit9CisKKyNlbmRpZiAgLyogI2lmZGVmIE1TX1dJTkRPV1MgKi8KKworCiAvKiBMb2FkIGEgc291cmNlIG1vZHVsZSBmcm9tIGEgZ2l2ZW4gZmlsZSBhbmQgcmV0dXJuIGl0cyBtb2R1bGUKICAgIG9iamVjdCBXSVRIIElOQ1JFTUVOVEVEIFJFRkVSRU5DRSBDT1VOVC4gIElmIHRoZXJlJ3MgYSBtYXRjaGluZwogICAgYnl0ZS1jb21waWxlZCBmaWxlLCB1c2UgdGhhdCBpbnN0ZWFkLiAqLwpAQCAtOTY4LDEwICsxMDMzLDExIEBACiB7CiAgICAgc3RydWN0IHN0YXQgc3Q7CiAgICAgRklMRSAqZnBjOwotICAgIGNoYXIgYnVmW01BWFBBVEhMRU4rMV07CisgICAgY2hhciAqYnVmOwogICAgIGNoYXIgKmNwYXRobmFtZTsKLSAgICBQeUNvZGVPYmplY3QgKmNvOworICAgIFB5Q29kZU9iamVjdCAqY28gPSBOVUxMOwogICAgIFB5T2JqZWN0ICptOworICAgIHRpbWVfdCBtdGltZTsKIAogICAgIGlmIChmc3RhdChmaWxlbm8oZnApLCAmc3QpICE9IDApIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwKQEAgLTk3OSwyNyArMTA0NSwzNiBAQAogICAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWUpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0jaWYgU0laRU9GX1RJTUVfVCA+IDQKLSAgICAvKiBQeXRob24ncyAucHljIHRpbWVzdGFtcCBoYW5kbGluZyBwcmVzdW1lcyB0aGF0IHRoZSB0aW1lc3RhbXAgZml0cwotICAgICAgIGluIDQgYnl0ZXMuIFRoaXMgd2lsbCBiZSBmaW5lIHVudGlsIHNvbWV0aW1lIGluIHRoZSB5ZWFyIDIwMzgsCi0gICAgICAgd2hlbiBhIDQtYnl0ZSBzaWduZWQgdGltZV90IHdpbGwgb3ZlcmZsb3cuCi0gICAgICovCi0gICAgaWYgKHN0LnN0X210aW1lID4+IDMyKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotICAgICAgICAgICAgIm1vZGlmaWNhdGlvbiB0aW1lIG92ZXJmbG93cyBhIDQgYnl0ZSBmaWVsZCIpOworCisjaWZkZWYgTVNfV0lORE9XUworICAgIG10aW1lID0gd2luMzJfbXRpbWUoZnAsIHBhdGhuYW1lKTsKKyAgICBpZiAobXRpbWUgPT0gKHRpbWVfdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CisjZWxzZQorICAgIG10aW1lID0gc3Quc3RfbXRpbWU7CiAjZW5kaWYKKyAgICBpZiAoc2l6ZW9mIG10aW1lID4gNCkgeworICAgICAgICAvKiBQeXRob24ncyAucHljIHRpbWVzdGFtcCBoYW5kbGluZyBwcmVzdW1lcyB0aGF0IHRoZSB0aW1lc3RhbXAgZml0cworICAgICAgICAgICBpbiA0IGJ5dGVzLiBTaW5jZSB0aGUgY29kZSBvbmx5IGRvZXMgYW4gZXF1YWxpdHkgY29tcGFyaXNvbiwKKyAgICAgICAgICAgb3JkZXJpbmcgaXMgbm90IGltcG9ydGFudCBhbmQgd2UgY2FuIHNhZmVseSBpZ25vcmUgdGhlIGhpZ2hlciBiaXRzCisgICAgICAgICAgIChjb2xsaXNpb25zIGFyZSBleHRyZW1lbHkgdW5saWtlbHkpLgorICAgICAgICAgKi8KKyAgICAgICAgbXRpbWUgJj0gMHhGRkZGRkZGRjsKKyAgICB9CisgICAgYnVmID0gUHlNZW1fTUFMTE9DKE1BWFBBVEhMRU4rMSk7CisgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KICAgICBjcGF0aG5hbWUgPSBtYWtlX2NvbXBpbGVkX3BhdGhuYW1lKHBhdGhuYW1lLCBidWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KU1BWFBBVEhMRU4gKyAxKTsKICAgICBpZiAoY3BhdGhuYW1lICE9IE5VTEwgJiYKLSAgICAgICAgKGZwYyA9IGNoZWNrX2NvbXBpbGVkX21vZHVsZShwYXRobmFtZSwgc3Quc3RfbXRpbWUsIGNwYXRobmFtZSkpKSB7CisgICAgICAgIChmcGMgPSBjaGVja19jb21waWxlZF9tb2R1bGUocGF0aG5hbWUsIG10aW1lLCBjcGF0aG5hbWUpKSkgewogICAgICAgICBjbyA9IHJlYWRfY29tcGlsZWRfbW9kdWxlKGNwYXRobmFtZSwgZnBjKTsKICAgICAgICAgZmNsb3NlKGZwYyk7CiAgICAgICAgIGlmIChjbyA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CiAgICAgICAgIGlmICh1cGRhdGVfY29tcGlsZWRfbW9kdWxlKGNvLCBwYXRobmFtZSkgPCAwKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CiAgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJpbXBvcnQgJXMgIyBwcmVjb21waWxlZCBmcm9tICVzXG4iLAogICAgICAgICAgICAgICAgIG5hbWUsIGNwYXRobmFtZSk7CkBAIC0xMDA4LDIwICsxMDgzLDI5IEBACiAgICAgZWxzZSB7CiAgICAgICAgIGNvID0gcGFyc2Vfc291cmNlX21vZHVsZShwYXRobmFtZSwgZnApOwogICAgICAgICBpZiAoY28gPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OwogICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCiAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiaW1wb3J0ICVzICMgZnJvbSAlc1xuIiwKICAgICAgICAgICAgICAgICBuYW1lLCBwYXRobmFtZSk7CiAgICAgICAgIGlmIChjcGF0aG5hbWUpIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICpybyA9IFB5U3lzX0dldE9iamVjdCgiZG9udF93cml0ZV9ieXRlY29kZSIpOwotICAgICAgICAgICAgaWYgKHJvID09IE5VTEwgfHwgIVB5T2JqZWN0X0lzVHJ1ZShybykpCi0gICAgICAgICAgICAgICAgd3JpdGVfY29tcGlsZWRfbW9kdWxlKGNvLCBjcGF0aG5hbWUsICZzdCk7CisgICAgICAgICAgICBpbnQgYiA9IChybyA9PSBOVUxMKSA/IDAgOiBQeU9iamVjdF9Jc1RydWUocm8pOworICAgICAgICAgICAgaWYgKGIgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKKyAgICAgICAgICAgIGlmICghYikKKyAgICAgICAgICAgICAgICB3cml0ZV9jb21waWxlZF9tb2R1bGUoY28sIGNwYXRobmFtZSwgJnN0LCBtdGltZSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgbSA9IFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlRXgobmFtZSwgKFB5T2JqZWN0ICopY28sIHBhdGhuYW1lKTsKICAgICBQeV9ERUNSRUYoY28pOwogCisgICAgUHlNZW1fRlJFRShidWYpOwogICAgIHJldHVybiBtOworCitlcnJvcl9leGl0OgorICAgIFB5X1hERUNSRUYoY28pOworICAgIFB5TWVtX0ZSRUUoYnVmKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogCkBAIC0xMDQxLDcgKzExMjUsNyBAQAogICAgIFB5T2JqZWN0ICpmaWxlID0gTlVMTDsKICAgICBQeU9iamVjdCAqcGF0aCA9IE5VTEw7CiAgICAgaW50IGVycjsKLSAgICBjaGFyIGJ1ZltNQVhQQVRITEVOKzFdOworICAgIGNoYXIgKmJ1ZiA9IE5VTEw7CiAgICAgRklMRSAqZnAgPSBOVUxMOwogICAgIHN0cnVjdCBmaWxlZGVzY3IgKmZkcDsKIApAQCAtMTA2Myw4ICsxMTQ3LDEzIEBACiAgICAgICAgIGVyciA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJfX3BhdGhfXyIsIHBhdGgpOwogICAgIGlmIChlcnIgIT0gMCkKICAgICAgICAgZ290byBlcnJvcjsKKyAgICBidWYgPSBQeU1lbV9NQUxMT0MoTUFYUEFUSExFTisxKTsKKyAgICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAgICAgYnVmWzBdID0gJ1wwJzsKLSAgICBmZHAgPSBmaW5kX21vZHVsZShuYW1lLCAiX19pbml0X18iLCBwYXRoLCBidWYsIHNpemVvZihidWYpLCAmZnAsIE5VTEwpOworICAgIGZkcCA9IGZpbmRfbW9kdWxlKG5hbWUsICJfX2luaXRfXyIsIHBhdGgsIGJ1ZiwgTUFYUEFUSExFTisxLCAmZnAsIE5VTEwpOwogICAgIGlmIChmZHAgPT0gTlVMTCkgewogICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19JbXBvcnRFcnJvcikpIHsKICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CkBAIC0xMDgyLDYgKzExNzEsOCBAQAogICBlcnJvcjoKICAgICBtID0gTlVMTDsKICAgY2xlYW51cDoKKyAgICBpZiAoYnVmKQorICAgICAgICBQeU1lbV9GUkVFKGJ1Zik7CiAgICAgUHlfWERFQ1JFRihwYXRoKTsKICAgICBQeV9YREVDUkVGKGZpbGUpOwogICAgIHJldHVybiBtOwpAQCAtMTIwNywxMyArMTI5OCwxMCBAQAogICAgIGNoYXIgKmZpbGVtb2RlOwogICAgIEZJTEUgKmZwID0gTlVMTDsKICAgICBQeU9iamVjdCAqcGF0aF9ob29rcywgKnBhdGhfaW1wb3J0ZXJfY2FjaGU7Ci0jaWZuZGVmIFJJU0NPUwotICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0jZW5kaWYKICAgICBzdGF0aWMgc3RydWN0IGZpbGVkZXNjciBmZF9mcm96ZW4gPSB7IiIsICIiLCBQWV9GUk9aRU59OwogICAgIHN0YXRpYyBzdHJ1Y3QgZmlsZWRlc2NyIGZkX2J1aWx0aW4gPSB7IiIsICIiLCBDX0JVSUxUSU59OwogICAgIHN0YXRpYyBzdHJ1Y3QgZmlsZWRlc2NyIGZkX3BhY2thZ2UgPSB7IiIsICIiLCBQS0dfRElSRUNUT1JZfTsKLSAgICBjaGFyIG5hbWVbTUFYUEFUSExFTisxXTsKKyAgICBjaGFyICpuYW1lOwogI2lmIGRlZmluZWQoUFlPU19PUzIpCiAgICAgc2l6ZV90IHNhdmVkX2xlbjsKICAgICBzaXplX3Qgc2F2ZWRfbmFtZWxlbjsKQEAgLTEyMjcsNiArMTMxNSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIm1vZHVsZSBuYW1lIGlzIHRvbyBsb25nIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KKyAgICBuYW1lID0gUHlNZW1fTUFMTE9DKE1BWFBBVEhMRU4rMSk7CisgICAgaWYgKG5hbWUgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgICAgc3RyY3B5KG5hbWUsIHN1Ym5hbWUpOwogCiAgICAgLyogc3lzLm1ldGFfcGF0aCBpbXBvcnQgaG9vayAqLwpAQCAtMTIzOCw3ICsxMzMxLDcgQEAKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN5cy5tZXRhX3BhdGggbXVzdCBiZSBhIGxpc3Qgb2YgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbXBvcnQgaG9va3MiKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OwogICAgICAgICB9CiAgICAgICAgIFB5X0lOQ1JFRihtZXRhX3BhdGgpOyAgLyogemFwIGd1YXJkICovCiAgICAgICAgIG5wYXRoID0gUHlMaXN0X1NpemUobWV0YV9wYXRoKTsKQEAgLTEyNTEsMTIgKzEzNDQsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA6IFB5X05vbmUpOwogICAgICAgICAgICAgaWYgKGxvYWRlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG1ldGFfcGF0aCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAvKiB0cnVlIGVycm9yICovCisgICAgICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OyAgLyogdHJ1ZSBlcnJvciAqLwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGxvYWRlciAhPSBQeV9Ob25lKSB7CiAgICAgICAgICAgICAgICAgLyogYSBsb2FkZXIgd2FzIGZvdW5kICovCiAgICAgICAgICAgICAgICAgKnBfbG9hZGVyID0gbG9hZGVyOwogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihtZXRhX3BhdGgpOworICAgICAgICAgICAgICAgIFB5TWVtX0ZSRUUobmFtZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuICZpbXBvcnRob29rZGVzY3I7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBQeV9ERUNSRUYobG9hZGVyKTsKQEAgLTEyNzAsNyArMTM2NCw3IEBACiAgICAgICAgIGlmIChQeVN0cmluZ19TaXplKHBhdGgpICsgMSArIHN0cmxlbihuYW1lKSA+PSAoc2l6ZV90KWJ1ZmxlbikgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmdWxsIGZyb3plbiBtb2R1bGUgbmFtZSB0b28gbG9uZyIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CiAgICAgICAgIH0KICAgICAgICAgc3RyY3B5KGJ1ZiwgUHlTdHJpbmdfQXNTdHJpbmcocGF0aCkpOwogICAgICAgICBzdHJjYXQoYnVmLCAiLiIpOwpAQCAtMTI3OCwxOSArMTM3MiwyMiBAQAogICAgICAgICBzdHJjcHkobmFtZSwgYnVmKTsKICAgICAgICAgaWYgKGZpbmRfZnJvemVuKG5hbWUpICE9IE5VTEwpIHsKICAgICAgICAgICAgIHN0cmNweShidWYsIG5hbWUpOworICAgICAgICAgICAgUHlNZW1fRlJFRShuYW1lKTsKICAgICAgICAgICAgIHJldHVybiAmZmRfZnJvemVuOwogICAgICAgICB9CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICJObyBmcm96ZW4gc3VibW9kdWxlIG5hbWVkICUuMjAwcyIsIG5hbWUpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZ290byBlcnJvcl9leGl0OwogICAgIH0KICAgICBpZiAocGF0aCA9PSBOVUxMKSB7CiAgICAgICAgIGlmIChpc19idWlsdGluKG5hbWUpKSB7CiAgICAgICAgICAgICBzdHJjcHkoYnVmLCBuYW1lKTsKKyAgICAgICAgICAgIFB5TWVtX0ZSRUUobmFtZSk7CiAgICAgICAgICAgICByZXR1cm4gJmZkX2J1aWx0aW47CiAgICAgICAgIH0KICAgICAgICAgaWYgKChmaW5kX2Zyb3plbihuYW1lKSkgIT0gTlVMTCkgewogICAgICAgICAgICAgc3RyY3B5KGJ1ZiwgbmFtZSk7CisgICAgICAgICAgICBQeU1lbV9GUkVFKG5hbWUpOwogICAgICAgICAgICAgcmV0dXJuICZmZF9mcm96ZW47CiAgICAgICAgIH0KIApAQCAtMTI5OCw2ICsxMzk1LDcgQEAKICAgICAgICAgZnAgPSBQeVdpbl9GaW5kUmVnaXN0ZXJlZE1vZHVsZShuYW1lLCAmZmRwLCBidWYsIGJ1Zmxlbik7CiAgICAgICAgIGlmIChmcCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAqcF9mcCA9IGZwOworICAgICAgICAgICAgUHlNZW1fRlJFRShuYW1lKTsKICAgICAgICAgICAgIHJldHVybiBmZHA7CiAgICAgICAgIH0KICNlbmRpZgpAQCAtMTMwNiw3ICsxNDA0LDcgQEAKICAgICBpZiAocGF0aCA9PSBOVUxMIHx8ICFQeUxpc3RfQ2hlY2socGF0aCkpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJzeXMucGF0aCBtdXN0IGJlIGEgbGlzdCBvZiBkaXJlY3RvcnkgbmFtZXMiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKICAgICB9CiAKICAgICBwYXRoX2hvb2tzID0gUHlTeXNfR2V0T2JqZWN0KCJwYXRoX2hvb2tzIik7CkBAIC0xMzE0LDE0ICsxNDEyLDE0IEBACiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAic3lzLnBhdGhfaG9va3MgbXVzdCBiZSBhIGxpc3Qgb2YgIgogICAgICAgICAgICAgICAgICAgICAgICAgImltcG9ydCBob29rcyIpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZ290byBlcnJvcl9leGl0OwogICAgIH0KICAgICBwYXRoX2ltcG9ydGVyX2NhY2hlID0gUHlTeXNfR2V0T2JqZWN0KCJwYXRoX2ltcG9ydGVyX2NhY2hlIik7CiAgICAgaWYgKHBhdGhfaW1wb3J0ZXJfY2FjaGUgPT0gTlVMTCB8fAogICAgICAgICAhUHlEaWN0X0NoZWNrKHBhdGhfaW1wb3J0ZXJfY2FjaGUpKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAic3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUgbXVzdCBiZSBhIGRpY3QiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKICAgICB9CiAKICAgICBucGF0aCA9IFB5TGlzdF9TaXplKHBhdGgpOwpAQCAtMTMzMCwxMyArMTQyOCwxMyBAQAogICAgICAgICBQeU9iamVjdCAqY29weSA9IE5VTEw7CiAgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlMaXN0X0dldEl0ZW0ocGF0aCwgaSk7CiAgICAgICAgIGlmICghdikKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKICAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVjayh2KSkgewogICAgICAgICAgICAgY29weSA9IFB5VW5pY29kZV9FbmNvZGUoUHlVbmljb2RlX0FTX1VOSUNPREUodiksCiAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHYpLCBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nLCBOVUxMKTsKICAgICAgICAgICAgIGlmIChjb3B5ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OwogICAgICAgICAgICAgdiA9IGNvcHk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQpAQCAtMTM2Miw3ICsxNDYwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aF9ob29rcywgdik7CiAgICAgICAgICAgICBpZiAoaW1wb3J0ZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIFB5X1hERUNSRUYoY29weSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLyogTm90ZTogaW1wb3J0ZXIgaXMgYSBib3Jyb3dlZCByZWZlcmVuY2UgKi8KICAgICAgICAgICAgIGlmIChpbXBvcnRlciAhPSBQeV9Ob25lKSB7CkBAIC0xMzcyLDEwICsxNDcwLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicyIsIGZ1bGxuYW1lKTsKICAgICAgICAgICAgICAgICBQeV9YREVDUkVGKGNvcHkpOwogICAgICAgICAgICAgICAgIGlmIChsb2FkZXIgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAvKiBlcnJvciAqLworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yX2V4aXQ7ICAvKiBlcnJvciAqLwogICAgICAgICAgICAgICAgIGlmIChsb2FkZXIgIT0gUHlfTm9uZSkgewogICAgICAgICAgICAgICAgICAgICAvKiBhIGxvYWRlciB3YXMgZm91bmQgKi8KICAgICAgICAgICAgICAgICAgICAgKnBfbG9hZGVyID0gbG9hZGVyOworICAgICAgICAgICAgICAgICAgICBQeU1lbV9GUkVFKG5hbWUpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gJmltcG9ydGhvb2tkZXNjcjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGxvYWRlcik7CkBAIC0xMzk1LDEyICsxNDk0LDExIEBACiAKICAgICAgICAgLyogQ2hlY2sgZm9yIHBhY2thZ2UgaW1wb3J0IChidWYgaG9sZHMgYSBkaXJlY3RvcnkgbmFtZSwKICAgICAgICAgICAgYW5kIHRoZXJlJ3MgYW4gX19pbml0X18gbW9kdWxlIGluIHRoYXQgZGlyZWN0b3J5ICovCi0jaWZkZWYgSEFWRV9TVEFUCi0gICAgICAgIGlmIChzdGF0KGJ1ZiwgJnN0YXRidWYpID09IDAgJiYgICAgICAgICAvKiBpdCBleGlzdHMgKi8KLSAgICAgICAgICAgIFNfSVNESVIoc3RhdGJ1Zi5zdF9tb2RlKSAmJiAgICAgICAgIC8qIGl0J3MgYSBkaXJlY3RvcnkgKi8KKyAgICAgICAgaWYgKGlzZGlyKGJ1ZikgJiYgICAgICAgICAvKiBpdCdzIGFuIGV4aXN0aW5nIGRpcmVjdG9yeSAqLwogICAgICAgICAgICAgY2FzZV9vayhidWYsIGxlbiwgbmFtZWxlbiwgbmFtZSkpIHsgLyogY2FzZSBtYXRjaGVzICovCiAgICAgICAgICAgICBpZiAoZmluZF9pbml0X21vZHVsZShidWYpKSB7IC8qIGFuZCBoYXMgX19pbml0X18ucHkgKi8KICAgICAgICAgICAgICAgICBQeV9YREVDUkVGKGNvcHkpOworICAgICAgICAgICAgICAgIFB5TWVtX0ZSRUUobmFtZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuICZmZF9wYWNrYWdlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CkBAIC0xNDExLDMyICsxNTA5LDEwIEBACiAgICAgICAgICAgICAgICAgaWYgKFB5RXJyX1dhcm4oUHlFeGNfSW1wb3J0V2FybmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuc3RyKSkgewogICAgICAgICAgICAgICAgICAgICBQeV9YREVDUkVGKGNvcHkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgLyogWFhYIEhvdyBhcmUgeW91IGdvaW5nIHRvIHRlc3QgZm9yIGRpcmVjdG9yaWVzPyAqLwotI2lmZGVmIFJJU0NPUwotICAgICAgICBpZiAoaXNkaXIoYnVmKSAmJgotICAgICAgICAgICAgY2FzZV9vayhidWYsIGxlbiwgbmFtZWxlbiwgbmFtZSkpIHsKLSAgICAgICAgICAgIGlmIChmaW5kX2luaXRfbW9kdWxlKGJ1ZikpIHsKLSAgICAgICAgICAgICAgICBQeV9YREVDUkVGKGNvcHkpOwotICAgICAgICAgICAgICAgIHJldHVybiAmZmRfcGFja2FnZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGNoYXIgd2FybnN0cltNQVhQQVRITEVOKzgwXTsKLSAgICAgICAgICAgICAgICBzcHJpbnRmKHdhcm5zdHIsICJOb3QgaW1wb3J0aW5nIGRpcmVjdG9yeSAiCi0gICAgICAgICAgICAgICAgICAgICInJS4qcyc6IG1pc3NpbmcgX19pbml0X18ucHkiLAotICAgICAgICAgICAgICAgICAgICBNQVhQQVRITEVOLCBidWYpOwotICAgICAgICAgICAgICAgIGlmIChQeUVycl9XYXJuKFB5RXhjX0ltcG9ydFdhcm5pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybnN0cikpIHsKLSAgICAgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihjb3B5KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0jZW5kaWYKLSNlbmRpZgogI2lmIGRlZmluZWQoUFlPU19PUzIpCiAgICAgICAgIC8qIHRha2UgYSBzbmFwc2hvdCBvZiB0aGUgbW9kdWxlIHNwZWMgZm9yIHJlc3RvcmF0aW9uCiAgICAgICAgICAqIGFmdGVyIHRoZSA4IGNoYXJhY3RlciBETEwgaGFja2VyeQpAQCAtMTUwOCwxMCArMTU4NCwxNSBAQAogICAgIGlmIChmcCA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICJObyBtb2R1bGUgbmFtZWQgJS4yMDBzIiwgbmFtZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CiAgICAgfQogICAgICpwX2ZwID0gZnA7CisgICAgUHlNZW1fRlJFRShuYW1lKTsKICAgICByZXR1cm4gZmRwOworCitlcnJvcl9leGl0OgorICAgIFB5TWVtX0ZSRUUobmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIEhlbHBlcnMgZm9yIG1haW4uYwpAQCAtMjExOCw3ICsyMTk5LDcgQEAKIGltcG9ydF9tb2R1bGVfbGV2ZWwoY2hhciAqbmFtZSwgUHlPYmplY3QgKmdsb2JhbHMsIFB5T2JqZWN0ICpsb2NhbHMsCiAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpmcm9tbGlzdCwgaW50IGxldmVsKQogewotICAgIGNoYXIgYnVmW01BWFBBVEhMRU4rMV07CisgICAgY2hhciAqYnVmOwogICAgIFB5X3NzaXplX3QgYnVmbGVuID0gMDsKICAgICBQeU9iamVjdCAqcGFyZW50LCAqaGVhZCwgKm5leHQsICp0YWlsOwogCkBAIC0yMTMyLDE0ICsyMjEzLDE4IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAorICAgIGJ1ZiA9IFB5TWVtX01BTExPQyhNQVhQQVRITEVOKzEpOworICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB9CiAgICAgcGFyZW50ID0gZ2V0X3BhcmVudChnbG9iYWxzLCBidWYsICZidWZsZW4sIGxldmVsKTsKICAgICBpZiAocGFyZW50ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CiAKICAgICBoZWFkID0gbG9hZF9uZXh0KHBhcmVudCwgbGV2ZWwgPCAwID8gUHlfTm9uZSA6IHBhcmVudCwgJm5hbWUsIGJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICZidWZsZW4pOwogICAgIGlmIChoZWFkID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CiAKICAgICB0YWlsID0gaGVhZDsKICAgICBQeV9JTkNSRUYodGFpbCk7CkBAIC0yMTQ4LDcgKzIyMzMsNyBAQAogICAgICAgICBQeV9ERUNSRUYodGFpbCk7CiAgICAgICAgIGlmIChuZXh0ID09IE5VTEwpIHsKICAgICAgICAgICAgIFB5X0RFQ1JFRihoZWFkKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OwogICAgICAgICB9CiAgICAgICAgIHRhaWwgPSBuZXh0OwogICAgIH0KQEAgLTIxNjAsMjYgKzIyNDUsMzggQEAKICAgICAgICAgUHlfREVDUkVGKGhlYWQpOwogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJFbXB0eSBtb2R1bGUgbmFtZSIpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZ290byBlcnJvcl9leGl0OwogICAgIH0KIAogICAgIGlmIChmcm9tbGlzdCAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChmcm9tbGlzdCA9PSBQeV9Ob25lIHx8ICFQeU9iamVjdF9Jc1RydWUoZnJvbWxpc3QpKQorICAgICAgICBpbnQgYiA9IChmcm9tbGlzdCA9PSBQeV9Ob25lKSA/IDAgOiBQeU9iamVjdF9Jc1RydWUoZnJvbWxpc3QpOworICAgICAgICBpZiAoYiA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0YWlsKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihoZWFkKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWIpCiAgICAgICAgICAgICBmcm9tbGlzdCA9IE5VTEw7CiAgICAgfQogCiAgICAgaWYgKGZyb21saXN0ID09IE5VTEwpIHsKICAgICAgICAgUHlfREVDUkVGKHRhaWwpOworICAgICAgICBQeU1lbV9GUkVFKGJ1Zik7CiAgICAgICAgIHJldHVybiBoZWFkOwogICAgIH0KIAogICAgIFB5X0RFQ1JFRihoZWFkKTsKICAgICBpZiAoIWVuc3VyZV9mcm9tbGlzdCh0YWlsLCBmcm9tbGlzdCwgYnVmLCBidWZsZW4sIDApKSB7CiAgICAgICAgIFB5X0RFQ1JFRih0YWlsKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKICAgICB9CiAKKyAgICBQeU1lbV9GUkVFKGJ1Zik7CiAgICAgcmV0dXJuIHRhaWw7CisKK2Vycm9yX2V4aXQ6CisgICAgUHlNZW1fRlJFRShidWYpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeU9iamVjdCAqCkBAIC0yNTY5LDcgKzI2NjYsNyBAQAogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgUHlPYmplY3QgKnBhdGgsICpsb2FkZXIgPSBOVUxMOwotICAgICAgICBjaGFyIGJ1ZltNQVhQQVRITEVOKzFdOworICAgICAgICBjaGFyICpidWY7CiAgICAgICAgIHN0cnVjdCBmaWxlZGVzY3IgKmZkcDsKICAgICAgICAgRklMRSAqZnAgPSBOVUxMOwogCkBAIC0yNTg0LDExICsyNjgxLDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBidWYgPSBQeU1lbV9NQUxMT0MoTUFYUEFUSExFTisxKTsKKyAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgfQogICAgICAgICBidWZbMF0gPSAnXDAnOwogICAgICAgICBmZHAgPSBmaW5kX21vZHVsZShmdWxsbmFtZSwgc3VibmFtZSwgcGF0aCwgYnVmLCBNQVhQQVRITEVOKzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcCwgJmxvYWRlcik7CiAgICAgICAgIFB5X1hERUNSRUYocGF0aCk7CiAgICAgICAgIGlmIChmZHAgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlNZW1fRlJFRShidWYpOwogICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0ltcG9ydEVycm9yKSkKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CkBAIC0yNjAzLDYgKzI3MDUsNyBAQAogICAgICAgICAgICAgUHlfWERFQ1JFRihtKTsKICAgICAgICAgICAgIG0gPSBOVUxMOwogICAgICAgICB9CisgICAgICAgIFB5TWVtX0ZSRUUoYnVmKTsKICAgICB9CiAKICAgICByZXR1cm4gbTsKQEAgLTI2MjAsNyArMjcyMyw3IEBACiAgICAgUHlPYmplY3QgKm1vZHVsZXMgPSBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCk7CiAgICAgUHlPYmplY3QgKnBhdGggPSBOVUxMLCAqbG9hZGVyID0gTlVMTCwgKmV4aXN0aW5nX20gPSBOVUxMOwogICAgIGNoYXIgKm5hbWUsICpzdWJuYW1lOwotICAgIGNoYXIgYnVmW01BWFBBVEhMRU4rMV07CisgICAgY2hhciAqYnVmOwogICAgIHN0cnVjdCBmaWxlZGVzY3IgKmZkcDsKICAgICBGSUxFICpmcCA9IE5VTEw7CiAgICAgUHlPYmplY3QgKm5ld207CkBAIC0yNjgwLDYgKzI3ODMsMTEgQEAKICAgICAgICAgaWYgKHBhdGggPT0gTlVMTCkKICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgfQorICAgIGJ1ZiA9IFB5TWVtX01BTExPQyhNQVhQQVRITEVOKzEpOworICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgICBQeV9YREVDUkVGKHBhdGgpOworICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB9CiAgICAgYnVmWzBdID0gJ1wwJzsKICAgICBmZHAgPSBmaW5kX21vZHVsZShuYW1lLCBzdWJuYW1lLCBwYXRoLCBidWYsIE1BWFBBVEhMRU4rMSwgJmZwLCAmbG9hZGVyKTsKICAgICBQeV9YREVDUkVGKHBhdGgpOwpAQCAtMjY4Nyw2ICsyNzk1LDcgQEAKICAgICBpZiAoZmRwID09IE5VTEwpIHsKICAgICAgICAgUHlfWERFQ1JFRihsb2FkZXIpOwogICAgICAgICBpbXBfbW9kdWxlc19yZWxvYWRpbmdfY2xlYXIoKTsKKyAgICAgICAgUHlNZW1fRlJFRShidWYpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTI3MDQsNiArMjgxMyw3IEBACiAgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZXMsIG5hbWUsIG0pOwogICAgIH0KICAgICBpbXBfbW9kdWxlc19yZWxvYWRpbmdfY2xlYXIoKTsKKyAgICBQeU1lbV9GUkVFKGJ1Zik7CiAgICAgcmV0dXJuIG5ld207CiB9CiAKQEAgLTI4MzQsMTkgKzI5NDQsMjcgQEAKICAgICBleHRlcm4gaW50IGZjbG9zZShGSUxFICopOwogICAgIFB5T2JqZWN0ICpmb2IsICpyZXQ7CiAgICAgc3RydWN0IGZpbGVkZXNjciAqZmRwOwotICAgIGNoYXIgcGF0aG5hbWVbTUFYUEFUSExFTisxXTsKKyAgICBjaGFyICpwYXRobmFtZTsKICAgICBGSUxFICpmcCA9IE5VTEw7CiAKKyAgICBwYXRobmFtZSA9IFB5TWVtX01BTExPQyhNQVhQQVRITEVOKzEpOworICAgIGlmIChwYXRobmFtZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KICAgICBwYXRobmFtZVswXSA9ICdcMCc7CiAgICAgaWYgKHBhdGggPT0gUHlfTm9uZSkKICAgICAgICAgcGF0aCA9IE5VTEw7CiAgICAgZmRwID0gZmluZF9tb2R1bGUoTlVMTCwgbmFtZSwgcGF0aCwgcGF0aG5hbWUsIE1BWFBBVEhMRU4rMSwgJmZwLCBOVUxMKTsKLSAgICBpZiAoZmRwID09IE5VTEwpCisgICAgaWYgKGZkcCA9PSBOVUxMKSB7CisgICAgICAgIFB5TWVtX0ZSRUUocGF0aG5hbWUpOwogICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgICAgaWYgKGZwICE9IE5VTEwpIHsKICAgICAgICAgZm9iID0gUHlGaWxlX0Zyb21GaWxlKGZwLCBwYXRobmFtZSwgZmRwLT5tb2RlLCBmY2xvc2UpOwotICAgICAgICBpZiAoZm9iID09IE5VTEwpCisgICAgICAgIGlmIChmb2IgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlNZW1fRlJFRShwYXRobmFtZSk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgZm9iID0gUHlfTm9uZTsKQEAgLTI4NTUsNiArMjk3Myw3IEBACiAgICAgcmV0ID0gUHlfQnVpbGRWYWx1ZSgiT3Moc3NpKSIsCiAgICAgICAgICAgICAgICAgICBmb2IsIHBhdGhuYW1lLCBmZHAtPnN1ZmZpeCwgZmRwLT5tb2RlLCBmZHAtPnR5cGUpOwogICAgIFB5X0RFQ1JFRihmb2IpOworICAgIFB5TWVtX0ZSRUUocGF0aG5hbWUpOwogICAgIHJldHVybiByZXQ7CiB9CiAKQEAgLTMyMDIsNDkgKzMzMjEsMTEgQEAKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCAiZW1wdHkgcGF0aG5hbWUiKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0gZWxzZSB7Ci0jaWZuZGVmIFJJU0NPUwotI2lmbmRlZiBNU19XSU5ET1dTCi0gICAgICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gICAgICAgIGludCBydjsKLQotICAgICAgICBydiA9IHN0YXQocGF0aCwgJnN0YXRidWYpOwotICAgICAgICBpZiAocnYgPT0gMCkgewotICAgICAgICAgICAgLyogaXQgZXhpc3RzICovCi0gICAgICAgICAgICBpZiAoU19JU0RJUihzdGF0YnVmLnN0X21vZGUpKSB7Ci0gICAgICAgICAgICAgICAgLyogaXQncyBhIGRpcmVjdG9yeSAqLwotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4aXN0aW5nIGRpcmVjdG9yeSIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYoaXNkaXIocGF0aCkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhpc3RpbmcgZGlyZWN0b3J5Iik7CisgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KLSNlbHNlIC8qIE1TX1dJTkRPV1MgKi8KLSAgICAgICAgRFdPUkQgcnY7Ci0gICAgICAgIC8qIHNlZSBpc3N1ZTEyOTMgYW5kIGlzc3VlMzY3NzoKLSAgICAgICAgICogc3RhdCgpIG9uIFdpbmRvd3MgZG9lc24ndCByZWNvZ25pc2UgcGF0aHMgbGlrZQotICAgICAgICAgKiAiZTpcXHNoYXJlZFxcIiBhbmQgIlxcXFx3aGl0ZXJhYi1jMnpubGhcXHNoYXJlZCIgYXMgZGlycy4KLSAgICAgICAgICovCi0gICAgICAgIHJ2ID0gR2V0RmlsZUF0dHJpYnV0ZXNBKHBhdGgpOwotICAgICAgICBpZiAocnYgIT0gSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMpIHsKLSAgICAgICAgICAgIC8qIGl0IGV4aXN0cyAqLwotICAgICAgICAgICAgaWYgKHJ2ICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSB7Ci0gICAgICAgICAgICAgICAgLyogaXQncyBhIGRpcmVjdG9yeSAqLwotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4aXN0aW5nIGRpcmVjdG9yeSIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotI2VuZGlmCi0jZWxzZSAvKiBSSVNDT1MgKi8KLSAgICAgICAgaWYgKG9iamVjdF9leGlzdHMocGF0aCkpIHsKLSAgICAgICAgICAgIC8qIGl0IGV4aXN0cyAqLwotICAgICAgICAgICAgaWYgKGlzZGlyKHBhdGgpKSB7Ci0gICAgICAgICAgICAgICAgLyogaXQncyBhIGRpcmVjdG9yeSAqLwotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4aXN0aW5nIGRpcmVjdG9yeSIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotI2VuZGlmCiAgICAgfQogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL21hcnNoYWwuYyBiL1B5dGhvbi9tYXJzaGFsLmMKaW5kZXggZmFjYTAyNy4uNmIyODVhYSAxMDA2NDQKLS0tIGEvUHl0aG9uL21hcnNoYWwuYworKysgYi9QeXRob24vbWFyc2hhbC5jCkBAIC04OCw3ICs4OCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi13X3N0cmluZyhjaGFyICpzLCBpbnQgbiwgV0ZJTEUgKnApCit3X3N0cmluZyhjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IG4sIFdGSUxFICpwKQogewogICAgIGlmIChwLT5mcCAhPSBOVUxMKSB7CiAgICAgICAgIGZ3cml0ZShzLCAxLCBuLCBwLT5mcCk7CkBAIC0xMjYsNiArMTI2LDI4IEBACiB9CiAjZW5kaWYKIAorI2RlZmluZSBTSVpFMzJfTUFYICAweDdGRkZGRkZGCisKKyNpZiBTSVpFT0ZfU0laRV9UID4gNAorIyBkZWZpbmUgV19TSVpFKG4sIHApICBkbyB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKG4pID4gU0laRTMyX01BWCkgeyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKHApLT5kZXB0aC0tOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKHApLT5lcnJvciA9IFdGRVJSX1VOTUFSU0hBTExBQkxFOyAgXAorICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3X2xvbmcoKGxvbmcpKG4pLCBwKTsgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUoMCkKKyNlbHNlCisjIGRlZmluZSBXX1NJWkUgIHdfbG9uZworI2VuZGlmCisKK3N0YXRpYyB2b2lkCit3X3BzdHJpbmcoY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBuLCBXRklMRSAqcCkKK3sKKyAgICAgICAgV19TSVpFKG4sIHApOworICAgICAgICB3X3N0cmluZyhzLCBuLCBwKTsKK30KKwogLyogV2UgYXNzdW1lIHRoYXQgUHl0aG9uIGxvbmdzIGFyZSBzdG9yZWQgaW50ZXJuYWxseSBpbiBiYXNlIHNvbWUgcG93ZXIgb2YKICAgIDIqKjE1OyBmb3IgdGhlIHNha2Ugb2YgcG9ydGFiaWxpdHkgd2UnbGwgYWx3YXlzIHJlYWQgYW5kIHdyaXRlIHRoZW0gaW4gYmFzZQogICAgZXhhY3RseSAyKioxNS4gKi8KQEAgLTE1OSw2ICsxODEsMTEgQEAKICAgICAgICAgZCA+Pj0gUHlMb25nX01BUlNIQUxfU0hJRlQ7CiAgICAgICAgIGwrKzsKICAgICB9IHdoaWxlIChkICE9IDApOworICAgIGlmIChsID4gU0laRTMyX01BWCkgeworICAgICAgICBwLT5kZXB0aC0tOworICAgICAgICBwLT5lcnJvciA9IFdGRVJSX1VOTUFSU0hBTExBQkxFOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIHdfbG9uZygobG9uZykoUHlfU0laRShvYikgPiAwID8gbCA6IC1sKSwgcCk7CiAKICAgICBmb3IgKGk9MDsgaSA8IG4tMTsgaSsrKSB7CkBAIC0yNDQsNyArMjcxLDcgQEAKICAgICAgICAgICAgIG4gPSBzdHJsZW4oYnVmKTsKICAgICAgICAgICAgIHdfYnl0ZShUWVBFX0ZMT0FULCBwKTsKICAgICAgICAgICAgIHdfYnl0ZSgoaW50KW4sIHApOwotICAgICAgICAgICAgd19zdHJpbmcoYnVmLCAoaW50KW4sIHApOworICAgICAgICAgICAgd19zdHJpbmcoYnVmLCBuLCBwKTsKICAgICAgICAgICAgIFB5TWVtX0ZyZWUoYnVmKTsKICAgICAgICAgfQogICAgIH0KQEAgLTI3Nyw3ICszMDQsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgbiA9IHN0cmxlbihidWYpOwogICAgICAgICAgICAgd19ieXRlKChpbnQpbiwgcCk7Ci0gICAgICAgICAgICB3X3N0cmluZyhidWYsIChpbnQpbiwgcCk7CisgICAgICAgICAgICB3X3N0cmluZyhidWYsIG4sIHApOwogICAgICAgICAgICAgUHlNZW1fRnJlZShidWYpOwogICAgICAgICAgICAgYnVmID0gUHlPU19kb3VibGVfdG9fc3RyaW5nKFB5Q29tcGxleF9JbWFnQXNEb3VibGUodiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnLCAxNywgMCwgTlVMTCk7CkBAIC0yODcsNyArMzE0LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG4gPSBzdHJsZW4oYnVmKTsKICAgICAgICAgICAgIHdfYnl0ZSgoaW50KW4sIHApOwotICAgICAgICAgICAgd19zdHJpbmcoYnVmLCAoaW50KW4sIHApOworICAgICAgICAgICAgd19zdHJpbmcoYnVmLCBuLCBwKTsKICAgICAgICAgICAgIFB5TWVtX0ZyZWUoYnVmKTsKICAgICAgICAgfQogICAgIH0KQEAgLTMxOCwxNSArMzQ1LDcgQEAKICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICB3X2J5dGUoVFlQRV9TVFJJTkcsIHApOwogICAgICAgICB9Ci0gICAgICAgIG4gPSBQeVN0cmluZ19HRVRfU0laRSh2KTsKLSAgICAgICAgaWYgKG4gPiBJTlRfTUFYKSB7Ci0gICAgICAgICAgICAvKiBodWdlIHN0cmluZ3MgYXJlIG5vdCBzdXBwb3J0ZWQgKi8KLSAgICAgICAgICAgIHAtPmRlcHRoLS07Ci0gICAgICAgICAgICBwLT5lcnJvciA9IFdGRVJSX1VOTUFSU0hBTExBQkxFOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHdfbG9uZygobG9uZyluLCBwKTsKLSAgICAgICAgd19zdHJpbmcoUHlTdHJpbmdfQVNfU1RSSU5HKHYpLCAoaW50KW4sIHApOworICAgICAgICB3X3BzdHJpbmcoUHlCeXRlc19BU19TVFJJTkcodiksIFB5U3RyaW5nX0dFVF9TSVpFKHYpLCBwKTsKICAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQogICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KHYpKSB7CkBAIC0zMzgsMjEgKzM1NywxNCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIHdfYnl0ZShUWVBFX1VOSUNPREUsIHApOwotICAgICAgICBuID0gUHlTdHJpbmdfR0VUX1NJWkUodXRmOCk7Ci0gICAgICAgIGlmIChuID4gSU5UX01BWCkgewotICAgICAgICAgICAgcC0+ZGVwdGgtLTsKLSAgICAgICAgICAgIHAtPmVycm9yID0gV0ZFUlJfVU5NQVJTSEFMTEFCTEU7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgd19sb25nKChsb25nKW4sIHApOwotICAgICAgICB3X3N0cmluZyhQeVN0cmluZ19BU19TVFJJTkcodXRmOCksIChpbnQpbiwgcCk7CisgICAgICAgIHdfcHN0cmluZyhQeVN0cmluZ19BU19TVFJJTkcodXRmOCksIFB5U3RyaW5nX0dFVF9TSVpFKHV0ZjgpLCBwKTsKICAgICAgICAgUHlfREVDUkVGKHV0ZjgpOwogICAgIH0KICNlbmRpZgogICAgIGVsc2UgaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdCh2KSkgewogICAgICAgICB3X2J5dGUoVFlQRV9UVVBMRSwgcCk7CiAgICAgICAgIG4gPSBQeVR1cGxlX1NpemUodik7Ci0gICAgICAgIHdfbG9uZygobG9uZyluLCBwKTsKKyAgICAgICAgV19TSVpFKG4sIHApOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgICB3X29iamVjdChQeVR1cGxlX0dFVF9JVEVNKHYsIGkpLCBwKTsKICAgICAgICAgfQpAQCAtMzYwLDcgKzM3Miw3IEBACiAgICAgZWxzZSBpZiAoUHlMaXN0X0NoZWNrRXhhY3QodikpIHsKICAgICAgICAgd19ieXRlKFRZUEVfTElTVCwgcCk7CiAgICAgICAgIG4gPSBQeUxpc3RfR0VUX1NJWkUodik7Ci0gICAgICAgIHdfbG9uZygobG9uZyluLCBwKTsKKyAgICAgICAgV19TSVpFKG4sIHApOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgICB3X29iamVjdChQeUxpc3RfR0VUX0lURU0odiwgaSksIHApOwogICAgICAgICB9CkBAIC0zOTAsNyArNDAyLDcgQEAKICAgICAgICAgICAgIHAtPmVycm9yID0gV0ZFUlJfVU5NQVJTSEFMTEFCTEU7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgd19sb25nKChsb25nKW4sIHApOworICAgICAgICBXX1NJWkUobiwgcCk7CiAgICAgICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcih2KTsKICAgICAgICAgaWYgKGl0ID09IE5VTEwpIHsKICAgICAgICAgICAgIHAtPmRlcHRoLS07CkBAIC00MzIsMTMgKzQ0NCw3IEBACiAgICAgICAgIFB5QnVmZmVyUHJvY3MgKnBiID0gdi0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOwogICAgICAgICB3X2J5dGUoVFlQRV9TVFJJTkcsIHApOwogICAgICAgICBuID0gKCpwYi0+YmZfZ2V0cmVhZGJ1ZmZlcikodiwgMCwgKHZvaWQgKiopJnMpOwotICAgICAgICBpZiAobiA+IElOVF9NQVgpIHsKLSAgICAgICAgICAgIHAtPmRlcHRoLS07Ci0gICAgICAgICAgICBwLT5lcnJvciA9IFdGRVJSX1VOTUFSU0hBTExBQkxFOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHdfbG9uZygobG9uZyluLCBwKTsKLSAgICAgICAgd19zdHJpbmcocywgKGludCluLCBwKTsKKyAgICAgICAgd19wc3RyaW5nKHMsIG4sIHApOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgd19ieXRlKFRZUEVfVU5LTk9XTiwgcCk7CkBAIC00ODAsMTQgKzQ4NiwxNCBAQAogCiAjZGVmaW5lIHJfYnl0ZShwKSAoKHApLT5mcCA/IGdldGMoKHApLT5mcCkgOiByc19ieXRlKHApKQogCi1zdGF0aWMgaW50Ci1yX3N0cmluZyhjaGFyICpzLCBpbnQgbiwgUkZJTEUgKnApCitzdGF0aWMgUHlfc3NpemVfdAorcl9zdHJpbmcoY2hhciAqcywgUHlfc3NpemVfdCBuLCBSRklMRSAqcCkKIHsKICAgICBpZiAocC0+ZnAgIT0gTlVMTCkKICAgICAgICAgLyogVGhlIHJlc3VsdCBmaXRzIGludG8gaW50IGJlY2F1c2UgaXQgbXVzdCBiZSA8PW4uICovCi0gICAgICAgIHJldHVybiAoaW50KWZyZWFkKHMsIDEsIG4sIHAtPmZwKTsKKyAgICAgICAgcmV0dXJuIGZyZWFkKHMsIDEsIG4sIHAtPmZwKTsKICAgICBpZiAocC0+ZW5kIC0gcC0+cHRyIDwgbikKLSAgICAgICAgbiA9IChpbnQpKHAtPmVuZCAtIHAtPnB0cik7CisgICAgICAgIG4gPSBwLT5lbmQgLSBwLT5wdHI7CiAgICAgbWVtY3B5KHMsIHAtPnB0ciwgbik7CiAgICAgcC0+cHRyICs9IG47CiAgICAgcmV0dXJuIG47CkBAIC01NjMsMTQgKzU2OSwxNCBAQAogcl9QeUxvbmcoUkZJTEUgKnApCiB7CiAgICAgUHlMb25nT2JqZWN0ICpvYjsKLSAgICBpbnQgc2l6ZSwgaSwgaiwgbWQsIHNob3J0c19pbl90b3BfZGlnaXQ7Ci0gICAgbG9uZyBuOworICAgIGxvbmcgbiwgc2l6ZSwgaTsKKyAgICBpbnQgaiwgbWQsIHNob3J0c19pbl90b3BfZGlnaXQ7CiAgICAgZGlnaXQgZDsKIAogICAgIG4gPSByX2xvbmcocCk7CiAgICAgaWYgKG4gPT0gMCkKICAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKV9QeUxvbmdfTmV3KDApOwotICAgIGlmIChuIDwgLUlOVF9NQVggfHwgbiA+IElOVF9NQVgpIHsKKyAgICBpZiAobiA8IC1TSVpFMzJfTUFYIHx8IG4gPiBTSVpFMzJfTUFYKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAiYmFkIG1hcnNoYWwgZGF0YSAobG9uZyBzaXplIG91dCBvZiByYW5nZSkiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC02OTEsNyArNjk3LDcgQEAKICAgICAgICAgICAgIGNoYXIgYnVmWzI1Nl07CiAgICAgICAgICAgICBkb3VibGUgZHg7CiAgICAgICAgICAgICBuID0gcl9ieXRlKHApOwotICAgICAgICAgICAgaWYgKG4gPT0gRU9GIHx8IHJfc3RyaW5nKGJ1ZiwgKGludCluLCBwKSAhPSBuKSB7CisgICAgICAgICAgICBpZiAobiA9PSBFT0YgfHwgcl9zdHJpbmcoYnVmLCBuLCBwKSAhPSBuKSB7CiAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLAogICAgICAgICAgICAgICAgICAgICAiRU9GIHJlYWQgd2hlcmUgb2JqZWN0IGV4cGVjdGVkIik7CiAgICAgICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKQEAgLTczMiw3ICs3MzgsNyBAQAogICAgICAgICAgICAgY2hhciBidWZbMjU2XTsKICAgICAgICAgICAgIFB5X2NvbXBsZXggYzsKICAgICAgICAgICAgIG4gPSByX2J5dGUocCk7Ci0gICAgICAgICAgICBpZiAobiA9PSBFT0YgfHwgcl9zdHJpbmcoYnVmLCAoaW50KW4sIHApICE9IG4pIHsKKyAgICAgICAgICAgIGlmIChuID09IEVPRiB8fCByX3N0cmluZyhidWYsIG4sIHApICE9IG4pIHsKICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICJFT0YgcmVhZCB3aGVyZSBvYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgICAgICAgICAgICByZXR2YWwgPSBOVUxMOwpAQCAtNzQ1LDcgKzc1MSw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBuID0gcl9ieXRlKHApOwotICAgICAgICAgICAgaWYgKG4gPT0gRU9GIHx8IHJfc3RyaW5nKGJ1ZiwgKGludCluLCBwKSAhPSBuKSB7CisgICAgICAgICAgICBpZiAobiA9PSBFT0YgfHwgcl9zdHJpbmcoYnVmLCBuLCBwKSAhPSBuKSB7CiAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLAogICAgICAgICAgICAgICAgICAgICAiRU9GIHJlYWQgd2hlcmUgb2JqZWN0IGV4cGVjdGVkIik7CiAgICAgICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKQEAgLTc5NSw3ICs4MDEsNyBAQAogICAgIGNhc2UgVFlQRV9JTlRFUk5FRDoKICAgICBjYXNlIFRZUEVfU1RSSU5HOgogICAgICAgICBuID0gcl9sb25nKHApOwotICAgICAgICBpZiAobiA8IDAgfHwgbiA+IElOVF9NQVgpIHsKKyAgICAgICAgaWYgKG4gPCAwIHx8IG4gPiBTSVpFMzJfTUFYKSB7CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImJhZCBtYXJzaGFsIGRhdGEgKHN0cmluZyBzaXplIG91dCBvZiByYW5nZSkiKTsKICAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CiAgICAgICAgICAgICBicmVhazsKQEAgLTgwNSw3ICs4MTEsNyBAQAogICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmIChyX3N0cmluZyhQeVN0cmluZ19BU19TVFJJTkcodiksIChpbnQpbiwgcCkgIT0gbikgeworICAgICAgICBpZiAocl9zdHJpbmcoUHlTdHJpbmdfQVNfU1RSSU5HKHYpLCBuLCBwKSAhPSBuKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYodik7CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVPRiByZWFkIHdoZXJlIG9iamVjdCBleHBlY3RlZCIpOwpAQCAtODQwLDcgKzg0Niw3IEBACiAgICAgICAgIGNoYXIgKmJ1ZmZlcjsKIAogICAgICAgICBuID0gcl9sb25nKHApOwotICAgICAgICBpZiAobiA8IDAgfHwgbiA+IElOVF9NQVgpIHsKKyAgICAgICAgaWYgKG4gPCAwIHx8IG4gPiBTSVpFMzJfTUFYKSB7CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImJhZCBtYXJzaGFsIGRhdGEgKHVuaWNvZGUgc2l6ZSBvdXQgb2YgcmFuZ2UpIik7CiAgICAgICAgICAgICByZXR2YWwgPSBOVUxMOwogICAgICAgICAgICAgYnJlYWs7CkBAIC04NTAsNyArODU2LDcgQEAKICAgICAgICAgICAgIHJldHZhbCA9IFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBpZiAocl9zdHJpbmcoYnVmZmVyLCAoaW50KW4sIHApICE9IG4pIHsKKyAgICAgICAgaWYgKHJfc3RyaW5nKGJ1ZmZlciwgbiwgcCkgIT0gbikgewogICAgICAgICAgICAgUHlNZW1fREVMKGJ1ZmZlcik7CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCiAgICAgICAgICAgICAgICAgIkVPRiByZWFkIHdoZXJlIG9iamVjdCBleHBlY3RlZCIpOwpAQCAtODY2LDEyICs4NzIsMTIgQEAKIAogICAgIGNhc2UgVFlQRV9UVVBMRToKICAgICAgICAgbiA9IHJfbG9uZyhwKTsKLSAgICAgICAgaWYgKG4gPCAwIHx8IG4gPiBJTlRfTUFYKSB7CisgICAgICAgIGlmIChuIDwgMCB8fCBuID4gU0laRTMyX01BWCkgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJiYWQgbWFyc2hhbCBkYXRhICh0dXBsZSBzaXplIG91dCBvZiByYW5nZSkiKTsKICAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICB2ID0gUHlUdXBsZV9OZXcoKGludCluKTsKKyAgICAgICAgdiA9IFB5VHVwbGVfTmV3KG4pOwogICAgICAgICBpZiAodiA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR2YWwgPSBOVUxMOwogICAgICAgICAgICAgYnJlYWs7CkBAIC04ODYsMTkgKzg5MiwxOSBAQAogICAgICAgICAgICAgICAgIHYgPSBOVUxMOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh2LCAoaW50KWksIHYyKTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0odiwgaSwgdjIpOwogICAgICAgICB9CiAgICAgICAgIHJldHZhbCA9IHY7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBUWVBFX0xJU1Q6CiAgICAgICAgIG4gPSByX2xvbmcocCk7Ci0gICAgICAgIGlmIChuIDwgMCB8fCBuID4gSU5UX01BWCkgeworICAgICAgICBpZiAobiA8IDAgfHwgbiA+IFNJWkUzMl9NQVgpIHsKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYmFkIG1hcnNoYWwgZGF0YSAobGlzdCBzaXplIG91dCBvZiByYW5nZSkiKTsKICAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICB2ID0gUHlMaXN0X05ldygoaW50KW4pOworICAgICAgICB2ID0gUHlMaXN0X05ldyhuKTsKICAgICAgICAgaWYgKHYgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtOTEzLDcgKzkxOSw3IEBACiAgICAgICAgICAgICAgICAgdiA9IE5VTEw7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBQeUxpc3RfU0VUX0lURU0odiwgKGludClpLCB2Mik7CisgICAgICAgICAgICBQeUxpc3RfU0VUX0lURU0odiwgaSwgdjIpOwogICAgICAgICB9CiAgICAgICAgIHJldHZhbCA9IHY7CiAgICAgICAgIGJyZWFrOwpAQCAtOTQ1LDcgKzk1MSw3IEBACiAgICAgY2FzZSBUWVBFX1NFVDoKICAgICBjYXNlIFRZUEVfRlJPWkVOU0VUOgogICAgICAgICBuID0gcl9sb25nKHApOwotICAgICAgICBpZiAobiA8IDAgfHwgbiA+IElOVF9NQVgpIHsKKyAgICAgICAgaWYgKG4gPCAwIHx8IG4gPiBTSVpFMzJfTUFYKSB7CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImJhZCBtYXJzaGFsIGRhdGEgKHNldCBzaXplIG91dCBvZiByYW5nZSkiKTsKICAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CiAgICAgICAgICAgICBicmVhazsKQEAgLTExMzQsMTIgKzExNDAsOCBAQAogICAgIGlmIChmaWxlc2l6ZSA+IDAgJiYgZmlsZXNpemUgPD0gUkVBU09OQUJMRV9GSUxFX0xJTUlUKSB7CiAgICAgICAgIGNoYXIqIHBCdWYgPSAoY2hhciAqKVB5TWVtX01BTExPQyhmaWxlc2l6ZSk7CiAgICAgICAgIGlmIChwQnVmICE9IE5VTEwpIHsKLSAgICAgICAgICAgIFB5T2JqZWN0KiB2OwotICAgICAgICAgICAgc2l6ZV90IG47Ci0gICAgICAgICAgICAvKiBmaWxlc2l6ZSBtdXN0IGZpdCBpbnRvIGFuIGludCwgYmVjYXVzZSBpdAotICAgICAgICAgICAgICAgaXMgc21hbGxlciB0aGFuIFJFQVNPTkFCTEVfRklMRV9MSU1JVCAqLwotICAgICAgICAgICAgbiA9IGZyZWFkKHBCdWYsIDEsIChpbnQpZmlsZXNpemUsIGZwKTsKLSAgICAgICAgICAgIHYgPSBQeU1hcnNoYWxfUmVhZE9iamVjdEZyb21TdHJpbmcocEJ1Ziwgbik7CisgICAgICAgICAgICBzaXplX3QgbiA9IGZyZWFkKHBCdWYsIDEsIChzaXplX3QpZmlsZXNpemUsIGZwKTsKKyAgICAgICAgICAgIFB5T2JqZWN0KiB2ID0gUHlNYXJzaGFsX1JlYWRPYmplY3RGcm9tU3RyaW5nKHBCdWYsIG4pOwogICAgICAgICAgICAgUHlNZW1fRlJFRShwQnVmKTsKICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICB9CmRpZmYgLS1naXQgYS9QeXRob24vcGVlcGhvbGUuYyBiL1B5dGhvbi9wZWVwaG9sZS5jCmluZGV4IDQzM2ZlMjcuLmZiNmNkMDMgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9wZWVwaG9sZS5jCisrKyBiL1B5dGhvbi9wZWVwaG9sZS5jCkBAIC0xMjgsMjUgKzEyOCwxNCBAQAogICAgICAgICAgICAgbmV3Y29uc3QgPSBQeU51bWJlcl9TdWJ0cmFjdCh2LCB3KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEJJTkFSWV9TVUJTQ1I6Ci0gICAgICAgICAgICBuZXdjb25zdCA9IFB5T2JqZWN0X0dldEl0ZW0odiwgdyk7CiAgICAgICAgICAgICAvKiAjNTA1NzogaWYgdiBpcyB1bmljb2RlLCB0aGVyZSBtaWdodCBiZSBkaWZmZXJlbmNlcyBiZXR3ZWVuCi0gICAgICAgICAgICAgICB3aWRlIGFuZCBuYXJyb3cgYnVpbGRzIGluIGNhc2VzIGxpa2UgdSdcVTAwMDEyMzQ1J1swXS4KLSAgICAgICAgICAgICAgIFdpZGUgYnVpbGRzIHdpbGwgcmV0dXJuIGEgbm9uLUJNUCBjaGFyLCB3aGVyZWFzIG5hcnJvdyBidWlsZHMKLSAgICAgICAgICAgICAgIHdpbGwgcmV0dXJuIGEgc3Vycm9nYXRlLiAgSW4gYm90aCB0aGUgY2FzZXMgc2tpcCB0aGUKLSAgICAgICAgICAgICAgIG9wdGltaXphdGlvbiBpbiBvcmRlciB0byBwcm9kdWNlIGNvbXBhdGlibGUgcHljcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKG5ld2NvbnN0ICE9IE5VTEwgJiYKLSAgICAgICAgICAgICAgICBQeVVuaWNvZGVfQ2hlY2sodikgJiYgUHlVbmljb2RlX0NoZWNrKG5ld2NvbnN0KSkgewotICAgICAgICAgICAgICAgIFB5X1VOSUNPREUgY2ggPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShuZXdjb25zdClbMF07Ci0jaWZkZWYgUHlfVU5JQ09ERV9XSURFCi0gICAgICAgICAgICAgICAgaWYgKGNoID4gMHhGRkZGKSB7Ci0jZWxzZQotICAgICAgICAgICAgICAgIGlmIChjaCA+PSAweEQ4MDAgJiYgY2ggPD0gMHhERkZGKSB7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ld2NvbnN0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgd2lkZSBhbmQgbmFycm93IGJ1aWxkcyBpbiBjYXNlcyBsaWtlICdcVTAwMDEyMzQ1J1swXSBvcgorICAgICAgICAgICAgICAgJ1xVMDAwMTIzNDVhYmNkZWYnWzNdLCBzbyBpdCdzIGJldHRlciB0byBza2lwIHRoZSBvcHRpbWl6YXRpb24KKyAgICAgICAgICAgICAgIGluIG9yZGVyIHRvIHByb2R1Y2UgY29tcGF0aWJsZSBweWNzLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sodikpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBuZXdjb25zdCA9IFB5T2JqZWN0X0dldEl0ZW0odiwgdyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBCSU5BUllfTFNISUZUOgogICAgICAgICAgICAgbmV3Y29uc3QgPSBQeU51bWJlcl9Mc2hpZnQodiwgdyk7CkBAIC0zNDUsNyArMzM0LDcgQEAKICAgICBjb2Rlc3RyID0gKHVuc2lnbmVkIGNoYXIgKiltZW1jcHkoY29kZXN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGNvZGUpLCBjb2RlbGVuKTsKIAotICAgIC8qIFZlcmlmeSB0aGF0IFJFVFVSTl9WQUxVRSB0ZXJtaW5hdGVzIHRoZSBjb2Rlc3RyaW5nLiAgICAgIFRoaXMgYWxsb3dzCisgICAgLyogVmVyaWZ5IHRoYXQgUkVUVVJOX1ZBTFVFIHRlcm1pbmF0ZXMgdGhlIGNvZGVzdHJpbmcuIFRoaXMgYWxsb3dzCiAgICAgICAgdGhlIHZhcmlvdXMgdHJhbnNmb3JtYXRpb24gcGF0dGVybnMgdG8gbG9vayBhaGVhZCBzZXZlcmFsCiAgICAgICAgaW5zdHJ1Y3Rpb25zIHdpdGhvdXQgYWRkaXRpb25hbCBjaGVja3MgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIG5vdAogICAgICAgIGxvb2tpbmcgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGNvZGUgc3RyaW5nLgpAQCAtNDQzLDggKzQzMiw4IEBACiAgICAgICAgICAgICBjYXNlIEJVSUxEX0xJU1Q6CiAgICAgICAgICAgICAgICAgaiA9IEdFVEFSRyhjb2Rlc3RyLCBpKTsKICAgICAgICAgICAgICAgICBoID0gaSAtIDMgKiBqOwotICAgICAgICAgICAgICAgIGlmIChoID49IDAgICYmCi0gICAgICAgICAgICAgICAgICAgIGogPD0gbGFzdGxjICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgICAgICBpZiAoaCA+PSAwICYmCisgICAgICAgICAgICAgICAgICAgIGogPD0gbGFzdGxjICYmCiAgICAgICAgICAgICAgICAgICAgICgob3Bjb2RlID09IEJVSUxEX1RVUExFICYmCiAgICAgICAgICAgICAgICAgICAgICAgSVNCQVNJQ0JMT0NLKGJsb2NrcywgaCwgMyooaisxKSkpIHx8CiAgICAgICAgICAgICAgICAgICAgICAob3Bjb2RlID09IEJVSUxEX0xJU1QgJiYKQEAgLTQ4OCw4ICs0NzcsOCBAQAogICAgICAgICAgICAgY2FzZSBCSU5BUllfQU5EOgogICAgICAgICAgICAgY2FzZSBCSU5BUllfWE9SOgogICAgICAgICAgICAgY2FzZSBCSU5BUllfT1I6Ci0gICAgICAgICAgICAgICAgaWYgKGxhc3RsYyA+PSAyICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAgSVNCQVNJQ0JMT0NLKGJsb2NrcywgaS02LCA3KSAgJiYKKyAgICAgICAgICAgICAgICBpZiAobGFzdGxjID49IDIgJiYKKyAgICAgICAgICAgICAgICAgICAgSVNCQVNJQ0JMT0NLKGJsb2NrcywgaS02LCA3KSAmJgogICAgICAgICAgICAgICAgICAgICBmb2xkX2Jpbm9wc19vbl9jb25zdGFudHMoJmNvZGVzdHJbaS02XSwgY29uc3RzKSkgewogICAgICAgICAgICAgICAgICAgICBpIC09IDI7CiAgICAgICAgICAgICAgICAgICAgIGFzc2VydChjb2Rlc3RyW2ldID09IExPQURfQ09OU1QpOwpAQCAtNDk4LDEzICs0ODcsMTMgQEAKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgIC8qIEZvbGQgdW5hcnkgb3BzIG9uIGNvbnN0YW50cy4KLSAgICAgICAgICAgICAgICAgICBMT0FEX0NPTlNUIGMxICBVTkFSWV9PUCAtLT4gICAgICAgICAgICAgICAgICBMT0FEX0NPTlNUIHVuYXJ5X29wKGMpICovCisgICAgICAgICAgICAgICAgICAgTE9BRF9DT05TVCBjMSAgVU5BUllfT1AgLS0+IExPQURfQ09OU1QgdW5hcnlfb3AoYykgKi8KICAgICAgICAgICAgIGNhc2UgVU5BUllfTkVHQVRJVkU6CiAgICAgICAgICAgICBjYXNlIFVOQVJZX0NPTlZFUlQ6CiAgICAgICAgICAgICBjYXNlIFVOQVJZX0lOVkVSVDoKLSAgICAgICAgICAgICAgICBpZiAobGFzdGxjID49IDEgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICAgICBJU0JBU0lDQkxPQ0soYmxvY2tzLCBpLTMsIDQpICAmJgotICAgICAgICAgICAgICAgICAgICBmb2xkX3VuYXJ5b3BzX29uX2NvbnN0YW50cygmY29kZXN0cltpLTNdLCBjb25zdHMpKSAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobGFzdGxjID49IDEgJiYKKyAgICAgICAgICAgICAgICAgICAgSVNCQVNJQ0JMT0NLKGJsb2NrcywgaS0zLCA0KSAmJgorICAgICAgICAgICAgICAgICAgICBmb2xkX3VuYXJ5b3BzX29uX2NvbnN0YW50cygmY29kZXN0cltpLTNdLCBjb25zdHMpKSB7CiAgICAgICAgICAgICAgICAgICAgIGkgLT0gMjsKICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGNvZGVzdHJbaV0gPT0gTE9BRF9DT05TVCk7CiAgICAgICAgICAgICAgICAgICAgIGN1bWxjID0gMTsKQEAgLTUzMCw4ICs1MTksNyBAQAogICAgICAgICAgICAgICAgIHRndCA9IEdFVEpVTVBUR1QoY29kZXN0ciwgaSk7CiAgICAgICAgICAgICAgICAgaiA9IGNvZGVzdHJbdGd0XTsKICAgICAgICAgICAgICAgICBpZiAoQ09ORElUSU9OQUxfSlVNUChqKSkgewotICAgICAgICAgICAgICAgICAgICAvKiBOT1RFOiBhbGwgcG9zc2libGUganVtcHMgaGVyZSBhcmUKLSAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGUhICovCisgICAgICAgICAgICAgICAgICAgIC8qIE5PVEU6IGFsbCBwb3NzaWJsZSBqdW1wcyBoZXJlIGFyZSBhYnNvbHV0ZSEgKi8KICAgICAgICAgICAgICAgICAgICAgaWYgKEpVTVBTX09OX1RSVUUoaikgPT0gSlVNUFNfT05fVFJVRShvcGNvZGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgc2Vjb25kIGp1bXAgd2lsbCBiZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZW4gaWZmIHRoZSBmaXJzdCBpcy4gKi8KQEAgLTU0MiwxMyArNTMwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBTRVRBUkcoY29kZXN0ciwgaSwgdGd0dGd0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmVvcHRpbWl6ZV9jdXJyZW50OwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIHNlY29uZCBqdW1wIGlzIG5vdCB0YWtlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIGZpcnN0IGlzIChzbyBqdW1wIHBhc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0KSwgYW5kIGFsbCBjb25kaXRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAganVtcHMgcG9wIHRoZWlyIGFyZ3VtZW50IHdoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXkncmUgbm90IHRha2VuIChzbyBjaGFuZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmaXJzdCBqdW1wIHRvIHBvcCBpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50IHdoZW4gaXQncyB0YWtlbikuICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgc2Vjb25kIGp1bXAgaXMgbm90IHRha2VuIGlmIHRoZSBmaXJzdCBpcyAoc28KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bXAgcGFzdCBpdCksIGFuZCBhbGwgY29uZGl0aW9uYWwganVtcHMgcG9wIHRoZWlyCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudCB3aGVuIHRoZXkncmUgbm90IHRha2VuIChzbyBjaGFuZ2UgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCBqdW1wIHRvIHBvcCBpdHMgYXJndW1lbnQgd2hlbiBpdCdzIHRha2VuKS4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChKVU1QU19PTl9UUlVFKG9wY29kZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXN0cltpXSA9IFBPUF9KVU1QX0lGX1RSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCkBAIC01ODQsOCArNTY5LDggQEAKICAgICAgICAgICAgICAgICBpZiAob3Bjb2RlID09IEpVTVBfRk9SV0FSRCkgLyogSk1QX0FCUyBjYW4gZ28gYmFja3dhcmRzICovCiAgICAgICAgICAgICAgICAgICAgIG9wY29kZSA9IEpVTVBfQUJTT0xVVEU7CiAgICAgICAgICAgICAgICAgaWYgKCFBQlNPTFVURV9KVU1QKG9wY29kZSkpCi0gICAgICAgICAgICAgICAgICAgIHRndHRndCAtPSBpICsgMzsgICAgIC8qIENhbGMgcmVsYXRpdmUganVtcCBhZGRyICovCi0gICAgICAgICAgICAgICAgaWYgKHRndHRndCA8IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gYmFja3dhcmQgcmVsYXRpdmUganVtcHMgKi8KKyAgICAgICAgICAgICAgICAgICAgdGd0dGd0IC09IGkgKyAzOyAgICAgICAgLyogQ2FsYyByZWxhdGl2ZSBqdW1wIGFkZHIgKi8KKyAgICAgICAgICAgICAgICBpZiAodGd0dGd0IDwgMCkgICAgICAgICAgICAgLyogTm8gYmFja3dhcmQgcmVsYXRpdmUganVtcHMgKi8KICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgY29kZXN0cltpXSA9IG9wY29kZTsKICAgICAgICAgICAgICAgICBTRVRBUkcoY29kZXN0ciwgaSwgdGd0dGd0KTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9weWFyZW5hLmMgYi9QeXRob24vcHlhcmVuYS5jCmluZGV4IDJkNjM2MzguLjUxM2IzNzkgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9weWFyZW5hLmMKKysrIGIvUHl0aG9uL3B5YXJlbmEuYwpAQCAtMTU5LDcgKzE1OSw2IEBACiB2b2lkCiBQeUFyZW5hX0ZyZWUoUHlBcmVuYSAqYXJlbmEpCiB7Ci0gICAgaW50IHI7CiAgICAgYXNzZXJ0KGFyZW5hKTsKICNpZiBkZWZpbmVkKFB5X0RFQlVHKQogICAgIC8qCkBAIC0xNzYsMTIgKzE3NSw2IEBACiAgICAgYXNzZXJ0KGFyZW5hLT5hX29iamVjdHMtPm9iX3JlZmNudCA9PSAxKTsKICAgICAqLwogCi0gICAgLyogQ2xlYXIgYWxsIHRoZSBlbGVtZW50cyBmcm9tIHRoZSBsaXN0LiAgVGhpcyBpcyBuZWNlc3NhcnkKLSAgICAgICB0byBndWFyYW50ZWUgdGhhdCB0aGV5IHdpbGwgYmUgREVDUkVGZWQuICovCi0gICAgciA9IFB5TGlzdF9TZXRTbGljZShhcmVuYS0+YV9vYmplY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgMCwgUHlMaXN0X0dFVF9TSVpFKGFyZW5hLT5hX29iamVjdHMpLCBOVUxMKTsKLSAgICBhc3NlcnQociA9PSAwKTsKLSAgICBhc3NlcnQoUHlMaXN0X0dFVF9TSVpFKGFyZW5hLT5hX29iamVjdHMpID09IDApOwogICAgIFB5X0RFQ1JFRihhcmVuYS0+YV9vYmplY3RzKTsKICAgICBmcmVlKGFyZW5hKTsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9weXN0YXRlLmMgYi9QeXRob24vcHlzdGF0ZS5jCmluZGV4IGRkYjdkNDIuLmViOTkyYzEgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9weXN0YXRlLmMKKysrIGIvUHl0aG9uL3B5c3RhdGUuYwpAQCAtMjIsNiArMjIsOSBAQAogI2VuZGlmCiAjZW5kaWYKIAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgogCiAjaWZkZWYgV0lUSF9USFJFQUQKICNpbmNsdWRlICJweXRocmVhZC5oIgpAQCAtMzAsMTAgKzMzLDYgQEAKICNkZWZpbmUgSEVBRF9MT0NLKCkgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGhlYWRfbXV0ZXgsIFdBSVRfTE9DSykKICNkZWZpbmUgSEVBRF9VTkxPQ0soKSBQeVRocmVhZF9yZWxlYXNlX2xvY2soaGVhZF9tdXRleCkKIAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCiAvKiBUaGUgc2luZ2xlIFB5SW50ZXJwcmV0ZXJTdGF0ZSB1c2VkIGJ5IHRoaXMgcHJvY2VzcycKICAgIEdJTFN0YXRlIGltcGxlbWVudGF0aW9uCiAqLwpAQCAtMTkzLDYgKzE5Miw5IEBACiAgICAgICAgIHRzdGF0ZS0+Y19wcm9maWxlb2JqID0gTlVMTDsKICAgICAgICAgdHN0YXRlLT5jX3RyYWNlb2JqID0gTlVMTDsKIAorICAgICAgICB0c3RhdGUtPnRyYXNoX2RlbGV0ZV9uZXN0aW5nID0gMDsKKyAgICAgICAgdHN0YXRlLT50cmFzaF9kZWxldGVfbGF0ZXIgPSBOVUxMOworCiAgICAgICAgIGlmIChpbml0KQogICAgICAgICAgICAgX1B5VGhyZWFkU3RhdGVfSW5pdCh0c3RhdGUpOwogCkBAIC0zMTMsOSArMzE1LDkgQEAKICAgICAgICAgUHlfRmF0YWxFcnJvcigKICAgICAgICAgICAgICJQeVRocmVhZFN0YXRlX0RlbGV0ZUN1cnJlbnQ6IG5vIGN1cnJlbnQgdHN0YXRlIik7CiAgICAgX1B5VGhyZWFkU3RhdGVfQ3VycmVudCA9IE5VTEw7Ci0gICAgdHN0YXRlX2RlbGV0ZV9jb21tb24odHN0YXRlKTsKICAgICBpZiAoYXV0b0ludGVycHJldGVyU3RhdGUgJiYgUHlUaHJlYWRfZ2V0X2tleV92YWx1ZShhdXRvVExTa2V5KSA9PSB0c3RhdGUpCiAgICAgICAgIFB5VGhyZWFkX2RlbGV0ZV9rZXlfdmFsdWUoYXV0b1RMU2tleSk7CisgICAgdHN0YXRlX2RlbGV0ZV9jb21tb24odHN0YXRlKTsKICAgICBQeUV2YWxfUmVsZWFzZUxvY2soKTsKIH0KICNlbmRpZiAvKiBXSVRIX1RIUkVBRCAqLwpAQCAtNjU0LDEwICs2NTYsMTAgQEAKICAgICAgICAgUHlFdmFsX1NhdmVUaHJlYWQoKTsKIH0KIAorI2VuZGlmIC8qIFdJVEhfVEhSRUFEICovCisKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmCiAKLSNlbmRpZiAvKiBXSVRIX1RIUkVBRCAqLwotCiAKZGlmZiAtLWdpdCBhL1B5dGhvbi9weXRob25ydW4uYyBiL1B5dGhvbi9weXRob25ydW4uYwppbmRleCBiZmI3ZmNhLi43NDhhNjNiIDEwMDY0NAotLS0gYS9QeXRob24vcHl0aG9ucnVuLmMKKysrIGIvUHl0aG9uL3B5dGhvbnJ1bi5jCkBAIC04OSw2ICs4OSwxNCBAQAogICB0cnVlIGRpdmlzaW9ucyAod2hpY2ggdGhleSB3aWxsIGJlIGluIDIuMykuICovCiBpbnQgX1B5X1FuZXdGbGFnID0gMDsKIGludCBQeV9Ob1VzZXJTaXRlRGlyZWN0b3J5ID0gMDsgLyogZm9yIC1zIGFuZCBzaXRlLnB5ICovCitpbnQgUHlfSGFzaFJhbmRvbWl6YXRpb25GbGFnID0gMDsgLyogZm9yIC1SIGFuZCBQWVRIT05IQVNIU0VFRCAqLworCitQeVRocmVhZFN0YXRlICpfUHlfRmluYWxpemluZyA9IE5VTEw7CisKKworLyogSGFjayB0byBmb3JjZSBsb2FkaW5nIG9mIG9iamVjdCBmaWxlcyAqLworaW50ICgqX1B5T1NfbXlzdHJuaWNtcF9oYWNrKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgUHlfc3NpemVfdCkgPSBcCisgICAgUHlPU19teXN0cm5pY21wOyAvKiBQeXRob24vcHlzdHJjbXAubyAqLwogCiAvKiBQeU1vZHVsZV9HZXRXYXJuaW5nc01vZHVsZSBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IGFzIG9mIDIuNgogc2luY2UgX3dhcm5pbmdzIGlzIGJ1aWx0aW4uICBUaGlzIEFQSSBzaG91bGQgbm90IGJlIHVzZWQuICovCkBAIC0xNTcsNiArMTY1LDcgQEAKICAgICBpZiAoaW5pdGlhbGl6ZWQpCiAgICAgICAgIHJldHVybjsKICAgICBpbml0aWFsaXplZCA9IDE7CisgICAgX1B5X0ZpbmFsaXppbmcgPSBOVUxMOwogCiAgICAgaWYgKChwID0gUHlfR0VURU5WKCJQWVRIT05ERUJVRyIpKSAmJiAqcCAhPSAnXDAnKQogICAgICAgICBQeV9EZWJ1Z0ZsYWcgPSBhZGRfZmxhZyhQeV9EZWJ1Z0ZsYWcsIHApOwpAQCAtMTY2LDYgKzE3NSwxMiBAQAogICAgICAgICBQeV9PcHRpbWl6ZUZsYWcgPSBhZGRfZmxhZyhQeV9PcHRpbWl6ZUZsYWcsIHApOwogICAgIGlmICgocCA9IFB5X0dFVEVOVigiUFlUSE9ORE9OVFdSSVRFQllURUNPREUiKSkgJiYgKnAgIT0gJ1wwJykKICAgICAgICAgUHlfRG9udFdyaXRlQnl0ZWNvZGVGbGFnID0gYWRkX2ZsYWcoUHlfRG9udFdyaXRlQnl0ZWNvZGVGbGFnLCBwKTsKKyAgICAvKiBUaGUgdmFyaWFibGUgaXMgb25seSB0ZXN0ZWQgZm9yIGV4aXN0ZW5jZSBoZXJlOyBfUHlSYW5kb21fSW5pdCB3aWxsCisgICAgICAgY2hlY2sgaXRzIHZhbHVlIGZ1cnRoZXIuICovCisgICAgaWYgKChwID0gUHlfR0VURU5WKCJQWVRIT05IQVNIU0VFRCIpKSAmJiAqcCAhPSAnXDAnKQorICAgICAgICBQeV9IYXNoUmFuZG9taXphdGlvbkZsYWcgPSBhZGRfZmxhZyhQeV9IYXNoUmFuZG9taXphdGlvbkZsYWcsIHApOworCisgICAgX1B5UmFuZG9tX0luaXQoKTsKIAogICAgIGludGVycCA9IFB5SW50ZXJwcmV0ZXJTdGF0ZV9OZXcoKTsKICAgICBpZiAoaW50ZXJwID09IE5VTEwpCkBAIC00MTAsMTIgKzQyNSwxNiBAQAogICAgICAqIHRoZSB0aHJlYWRzIGNyZWF0ZWQgdmlhIFRocmVhZGluZy4KICAgICAgKi8KICAgICBjYWxsX3N5c19leGl0ZnVuYygpOwotICAgIGluaXRpYWxpemVkID0gMDsKIAogICAgIC8qIEdldCBjdXJyZW50IHRocmVhZCBzdGF0ZSBhbmQgaW50ZXJwcmV0ZXIgcG9pbnRlciAqLwogICAgIHRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CiAgICAgaW50ZXJwID0gdHN0YXRlLT5pbnRlcnA7CiAKKyAgICAvKiBSZW1haW5pbmcgdGhyZWFkcyAoZS5nLiBkYWVtb24gdGhyZWFkcykgd2lsbCBhdXRvbWF0aWNhbGx5IGV4aXQKKyAgICAgICBhZnRlciB0YWtpbmcgdGhlIEdJTCAoaW4gUHlFdmFsX1Jlc3RvcmVUaHJlYWQoKSkuICovCisgICAgX1B5X0ZpbmFsaXppbmcgPSB0c3RhdGU7CisgICAgaW5pdGlhbGl6ZWQgPSAwOworCiAgICAgLyogRGlzYWJsZSBzaWduYWwgaGFuZGxpbmcgKi8KICAgICBQeU9TX0ZpbmlJbnRlcnJ1cHRzKCk7CiAKQEAgLTkwMCwxOSArOTE5LDIwIEBACiB7CiAgICAgUHlPYmplY3QgKm0sICpkLCAqdjsKICAgICBjb25zdCBjaGFyICpleHQ7Ci0gICAgaW50IHNldF9maWxlX25hbWUgPSAwLCByZXQsIGxlbjsKKyAgICBpbnQgc2V0X2ZpbGVfbmFtZSA9IDAsIGxlbiwgcmV0ID0gLTE7CiAKICAgICBtID0gUHlJbXBvcnRfQWRkTW9kdWxlKCJfX21haW5fXyIpOwogICAgIGlmIChtID09IE5VTEwpCiAgICAgICAgIHJldHVybiAtMTsKKyAgICBQeV9JTkNSRUYobSk7CiAgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CiAgICAgaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGQsICJfX2ZpbGVfXyIpID09IE5VTEwpIHsKICAgICAgICAgUHlPYmplY3QgKmYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGZpbGVuYW1lKTsKICAgICAgICAgaWYgKGYgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJfX2ZpbGVfXyIsIGYpIDwgMCkgewogICAgICAgICAgICAgUHlfREVDUkVGKGYpOwotICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICB9CiAgICAgICAgIHNldF9maWxlX25hbWUgPSAxOwogICAgICAgICBQeV9ERUNSRUYoZik7CkBAIC05MjUsNyArOTQ1LDYgQEAKICAgICAgICAgICAgIGZjbG9zZShmcCk7CiAgICAgICAgIGlmICgoZnAgPSBmb3BlbihmaWxlbmFtZSwgInJiIikpID09IE5VTEwpIHsKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicHl0aG9uOiBDYW4ndCByZW9wZW4gLnB5YyBmaWxlXG4iKTsKLSAgICAgICAgICAgIHJldCA9IC0xOwogICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICB9CiAgICAgICAgIC8qIFR1cm4gb24gb3B0aW1pemF0aW9uIGlmIGEgLnB5byBmaWxlIGlzIGdpdmVuICovCkBAIC05MzgsNyArOTU3LDYgQEAKICAgICB9CiAgICAgaWYgKHYgPT0gTlVMTCkgewogICAgICAgICBQeUVycl9QcmludCgpOwotICAgICAgICByZXQgPSAtMTsKICAgICAgICAgZ290byBkb25lOwogICAgIH0KICAgICBQeV9ERUNSRUYodik7CkBAIC05NDgsNiArOTY2LDcgQEAKICAgZG9uZToKICAgICBpZiAoc2V0X2ZpbGVfbmFtZSAmJiBQeURpY3RfRGVsSXRlbVN0cmluZyhkLCAiX19maWxlX18iKSkKICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBQeV9ERUNSRUYobSk7CiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtOTgyLDU1ICsxMDAxLDY3IEBACiAgICAgICAgIHJldHVybiBQeUFyZ19QYXJzZVR1cGxlKGVyciwgIk8oemlpeikiLCBtZXNzYWdlLCBmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZW5vLCBvZmZzZXQsIHRleHQpOwogCisgICAgKm1lc3NhZ2UgPSBOVUxMOworCiAgICAgLyogbmV3IHN0eWxlIGVycm9ycy4gIGBlcnInIGlzIGFuIGluc3RhbmNlICovCi0KLSAgICBpZiAoISAodiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZXJyLCAibXNnIikpKQorICAgICptZXNzYWdlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhlcnIsICJtc2ciKTsKKyAgICBpZiAoISptZXNzYWdlKQogICAgICAgICBnb3RvIGZpbmFsbHk7Ci0gICAgKm1lc3NhZ2UgPSB2OwogCi0gICAgaWYgKCEodiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZXJyLCAiZmlsZW5hbWUiKSkpCisgICAgdiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZXJyLCAiZmlsZW5hbWUiKTsKKyAgICBpZiAoIXYpCiAgICAgICAgIGdvdG8gZmluYWxseTsKLSAgICBpZiAodiA9PSBQeV9Ob25lKQorICAgIGlmICh2ID09IFB5X05vbmUpIHsKKyAgICAgICAgUHlfREVDUkVGKHYpOwogICAgICAgICAqZmlsZW5hbWUgPSBOVUxMOwotICAgIGVsc2UgaWYgKCEgKCpmaWxlbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKHYpKSkKLSAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgKmZpbGVuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcodik7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgaWYgKCEqZmlsZW5hbWUpCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQogCi0gICAgUHlfREVDUkVGKHYpOwotICAgIGlmICghKHYgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGVyciwgImxpbmVubyIpKSkKKyAgICB2ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhlcnIsICJsaW5lbm8iKTsKKyAgICBpZiAoIXYpCiAgICAgICAgIGdvdG8gZmluYWxseTsKICAgICBob2xkID0gUHlJbnRfQXNMb25nKHYpOwogICAgIFB5X0RFQ1JFRih2KTsKLSAgICB2ID0gTlVMTDsKICAgICBpZiAoaG9sZCA8IDAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgZ290byBmaW5hbGx5OwogICAgICpsaW5lbm8gPSAoaW50KWhvbGQ7CiAKLSAgICBpZiAoISh2ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhlcnIsICJvZmZzZXQiKSkpCisgICAgdiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZXJyLCAib2Zmc2V0Iik7CisgICAgaWYgKCF2KQogICAgICAgICBnb3RvIGZpbmFsbHk7CiAgICAgaWYgKHYgPT0gUHlfTm9uZSkgewogICAgICAgICAqb2Zmc2V0ID0gLTE7CiAgICAgICAgIFB5X0RFQ1JFRih2KTsKLSAgICAgICAgdiA9IE5VTEw7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaG9sZCA9IFB5SW50X0FzTG9uZyh2KTsKICAgICAgICAgUHlfREVDUkVGKHYpOwotICAgICAgICB2ID0gTlVMTDsKICAgICAgICAgaWYgKGhvbGQgPCAwICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAgICAgICAgICpvZmZzZXQgPSAoaW50KWhvbGQ7CiAgICAgfQogCi0gICAgaWYgKCEodiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZXJyLCAidGV4dCIpKSkKKyAgICB2ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhlcnIsICJ0ZXh0Iik7CisgICAgaWYgKCF2KQogICAgICAgICBnb3RvIGZpbmFsbHk7Ci0gICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICBpZiAodiA9PSBQeV9Ob25lKSB7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKICAgICAgICAgKnRleHQgPSBOVUxMOwotICAgIGVsc2UgaWYgKCEgKCp0ZXh0ID0gUHlTdHJpbmdfQXNTdHJpbmcodikpKQotICAgICAgICBnb3RvIGZpbmFsbHk7Ci0gICAgUHlfREVDUkVGKHYpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgKnRleHQgPSBQeVN0cmluZ19Bc1N0cmluZyh2KTsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICBpZiAoISp0ZXh0KQorICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KICAgICByZXR1cm4gMTsKIAogZmluYWxseToKLSAgICBQeV9YREVDUkVGKHYpOworICAgIFB5X1hERUNSRUYoKm1lc3NhZ2UpOwogICAgIHJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9QeXRob24vcmFuZG9tLmMgYi9QeXRob24vcmFuZG9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYxNTkyMwotLS0gL2Rldi9udWxsCisrKyBiL1B5dGhvbi9yYW5kb20uYwpAQCAtMCwwICsxLDMxMiBAQAorI2luY2x1ZGUgIlB5dGhvbi5oIgorI2lmZGVmIE1TX1dJTkRPV1MKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZWxzZQorI2luY2x1ZGUgPGZjbnRsLmg+CisjZW5kaWYKKworI2lmZGVmIFB5X0RFQlVHCitpbnQgX1B5X0hhc2hTZWNyZXRfSW5pdGlhbGl6ZWQgPSAwOworI2Vsc2UKK3N0YXRpYyBpbnQgX1B5X0hhc2hTZWNyZXRfSW5pdGlhbGl6ZWQgPSAwOworI2VuZGlmCisKKyNpZmRlZiBNU19XSU5ET1dTCit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqQ1JZUFRBQ1FVSVJFQ09OVEVYVEEpKEhDUllQVFBST1YgKnBoUHJvdixcCisgICAgICAgICAgICAgIExQQ1NUUiBwc3pDb250YWluZXIsIExQQ1NUUiBwc3pQcm92aWRlciwgRFdPUkQgZHdQcm92VHlwZSxcCisgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MgKTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICpDUllQVEdFTlJBTkRPTSkoSENSWVBUUFJPViBoUHJvdiwgRFdPUkQgZHdMZW4sXAorICAgICAgICAgICAgICBCWVRFICpwYkJ1ZmZlciApOworCitzdGF0aWMgQ1JZUFRHRU5SQU5ET00gcENyeXB0R2VuUmFuZG9tID0gTlVMTDsKKy8qIFRoaXMgaGFuZGxlIGlzIG5ldmVyIGV4cGxpY2l0bHkgcmVsZWFzZWQuIEluc3RlYWQsIHRoZSBvcGVyYXRpbmcKKyAgIHN5c3RlbSB3aWxsIHJlbGVhc2UgaXQgd2hlbiB0aGUgcHJvY2VzcyB0ZXJtaW5hdGVzLiAqLworc3RhdGljIEhDUllQVFBST1YgaENyeXB0UHJvdiA9IDA7CisKK3N0YXRpYyBpbnQKK3dpbjMyX3VyYW5kb21faW5pdChpbnQgcmFpc2UpCit7CisgICAgSElOU1RBTkNFIGhBZHZBUEkzMiA9IE5VTEw7CisgICAgQ1JZUFRBQ1FVSVJFQ09OVEVYVEEgcENyeXB0QWNxdWlyZUNvbnRleHQgPSBOVUxMOworCisgICAgLyogT2J0YWluIGhhbmRsZSB0byB0aGUgRExMIGNvbnRhaW5pbmcgQ3J5cHRvQVBJLiBUaGlzIHNob3VsZCBub3QgZmFpbC4gKi8KKyAgICBoQWR2QVBJMzIgPSBHZXRNb2R1bGVIYW5kbGUoImFkdmFwaTMyLmRsbCIpOworICAgIGlmKGhBZHZBUEkzMiA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgLyogT2J0YWluIHBvaW50ZXJzIHRvIHRoZSBDcnlwdG9BUEkgZnVuY3Rpb25zLiBUaGlzIHdpbGwgZmFpbCBvbiBzb21lIGVhcmx5CisgICAgICAgdmVyc2lvbnMgb2YgV2luOTUuICovCisgICAgcENyeXB0QWNxdWlyZUNvbnRleHQgPSAoQ1JZUFRBQ1FVSVJFQ09OVEVYVEEpR2V0UHJvY0FkZHJlc3MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFkdkFQSTMyLCAiQ3J5cHRBY3F1aXJlQ29udGV4dEEiKTsKKyAgICBpZiAocENyeXB0QWNxdWlyZUNvbnRleHQgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIHBDcnlwdEdlblJhbmRvbSA9IChDUllQVEdFTlJBTkRPTSlHZXRQcm9jQWRkcmVzcyhoQWR2QVBJMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDcnlwdEdlblJhbmRvbSIpOworICAgIGlmIChwQ3J5cHRHZW5SYW5kb20gPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIC8qIEFjcXVpcmUgY29udGV4dCAqLworICAgIGlmICghIHBDcnlwdEFjcXVpcmVDb250ZXh0KCZoQ3J5cHRQcm92LCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1ZfUlNBX0ZVTEwsIENSWVBUX1ZFUklGWUNPTlRFWFQpKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgcmV0dXJuIDA7CisKK2Vycm9yOgorICAgIGlmIChyYWlzZSkKKyAgICAgICAgUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7CisgICAgZWxzZQorICAgICAgICBQeV9GYXRhbEVycm9yKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBXaW5kb3dzIHJhbmRvbSBBUEkgKENyeXB0b0dlbikiKTsKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qIEZpbGwgYnVmZmVyIHdpdGggc2l6ZSBwc2V1ZG8tcmFuZG9tIGJ5dGVzIGdlbmVyYXRlZCBieSB0aGUgV2luZG93cyBDcnlwdG9HZW4KKyAgIEFQSS4gUmV0dXJuIDAgb24gc3VjY2Vzcywgb3IgLTEgb24gZXJyb3IuICovCitzdGF0aWMgaW50Cit3aW4zMl91cmFuZG9tKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgUHlfc3NpemVfdCBzaXplLCBpbnQgcmFpc2UpCit7CisgICAgUHlfc3NpemVfdCBjaHVuazsKKworICAgIGlmIChoQ3J5cHRQcm92ID09IDApCisgICAgeworICAgICAgICBpZiAod2luMzJfdXJhbmRvbV9pbml0KHJhaXNlKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB3aGlsZSAoc2l6ZSA+IDApCisgICAgeworICAgICAgICBjaHVuayA9IHNpemUgPiBJTlRfTUFYID8gSU5UX01BWCA6IHNpemU7CisgICAgICAgIGlmICghcENyeXB0R2VuUmFuZG9tKGhDcnlwdFByb3YsIGNodW5rLCBidWZmZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBDcnlwdEdlblJhbmRvbSgpIGZhaWxlZCAqLworICAgICAgICAgICAgaWYgKHJhaXNlKQorICAgICAgICAgICAgICAgIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKDApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkZhaWxlZCB0byBpbml0aWFsaXplZCB0aGUgcmFuZG9taXplZCBoYXNoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZWNyZXQgdXNpbmcgQ3J5cHRvR2VuKSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlciArPSBjaHVuazsKKyAgICAgICAgc2l6ZSAtPSBjaHVuazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogTVNfV0lORE9XUyAqLworCisKKyNpZmRlZiBfX1ZNUworLyogVXNlIG9wZW5zc2wgcmFuZG9tIHJvdXRpbmUgKi8KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KK3N0YXRpYyBpbnQKK3Ztc191cmFuZG9tKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgUHlfc3NpemVfdCBzaXplLCBpbnQgcmFpc2UpCit7CisgICAgaWYgKFJBTkRfcHNldWRvX2J5dGVzKGJ1ZmZlciwgc2l6ZSkgPCAwKSB7CisgICAgICAgIGlmIChyYWlzZSkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlJBTkRfcHNldWRvX2J5dGVzIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcmFuZG9taXplZCBoYXNoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInNlY3JldCB1c2luZyBSQU5EX3BzZXVkb19ieXRlcyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogX19WTVMgKi8KKworCisjaWYgIWRlZmluZWQoTVNfV0lORE9XUykgJiYgIWRlZmluZWQoX19WTVMpCisKKy8qIFJlYWQgc2l6ZSBieXRlcyBmcm9tIC9kZXYvdXJhbmRvbSBpbnRvIGJ1ZmZlci4KKyAgIENhbGwgUHlfRmF0YWxFcnJvcigpIG9uIGVycm9yLiAqLworc3RhdGljIHZvaWQKK2Rldl91cmFuZG9tX25vcmFpc2UoY2hhciAqYnVmZmVyLCBQeV9zc2l6ZV90IHNpemUpCit7CisgICAgaW50IGZkOworICAgIFB5X3NzaXplX3QgbjsKKworICAgIGFzc2VydCAoMCA8IHNpemUpOworCisgICAgZmQgPSBvcGVuKCIvZGV2L3VyYW5kb20iLCBPX1JET05MWSk7CisgICAgaWYgKGZkIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiRmFpbGVkIHRvIG9wZW4gL2Rldi91cmFuZG9tIik7CisKKyAgICB3aGlsZSAoMCA8IHNpemUpCisgICAgeworICAgICAgICBkbyB7CisgICAgICAgICAgICBuID0gcmVhZChmZCwgYnVmZmVyLCAoc2l6ZV90KXNpemUpOworICAgICAgICB9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisgICAgICAgIGlmIChuIDw9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHN0b3Agb24gZXJyb3Igb3IgaWYgcmVhZChzaXplKSByZXR1cm5lZCAwICovCisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJGYWlsZWQgdG8gcmVhZCBieXRlcyBmcm9tIC9kZXYvdXJhbmRvbSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyICs9IG47CisgICAgICAgIHNpemUgLT0gKFB5X3NzaXplX3QpbjsKKyAgICB9CisgICAgY2xvc2UoZmQpOworfQorCisvKiBSZWFkIHNpemUgYnl0ZXMgZnJvbSAvZGV2L3VyYW5kb20gaW50byBidWZmZXIuCisgICBSZXR1cm4gMCBvbiBzdWNjZXNzLCByYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiAtMSBvbiBlcnJvci4gKi8KK3N0YXRpYyBpbnQKK2Rldl91cmFuZG9tX3B5dGhvbihjaGFyICpidWZmZXIsIFB5X3NzaXplX3Qgc2l6ZSkKK3sKKyAgICBpbnQgZmQ7CisgICAgUHlfc3NpemVfdCBuOworCisgICAgaWYgKHNpemUgPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZmQgPSBvcGVuKCIvZGV2L3VyYW5kb20iLCBPX1JET05MWSk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAoZmQgPCAwKQorICAgIHsKKyAgICAgICAgaWYgKGVycm5vID09IEVOT0VOVCB8fCBlcnJubyA9PSBFTlhJTyB8fAorICAgICAgICAgICAgZXJybm8gPT0gRU5PREVWIHx8IGVycm5vID09IEVBQ0NFUykKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvZGV2L3VyYW5kb20gKG9yIGVxdWl2YWxlbnQpIG5vdCBmb3VuZCIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZG8geworICAgICAgICBkbyB7CisgICAgICAgICAgICBuID0gcmVhZChmZCwgYnVmZmVyLCAoc2l6ZV90KXNpemUpOworICAgICAgICB9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisgICAgICAgIGlmIChuIDw9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgYnVmZmVyICs9IG47CisgICAgICAgIHNpemUgLT0gKFB5X3NzaXplX3QpbjsKKyAgICB9IHdoaWxlICgwIDwgc2l6ZSk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKworICAgIGlmIChuIDw9IDApCisgICAgeworICAgICAgICAvKiBzdG9wIG9uIGVycm9yIG9yIGlmIHJlYWQoc2l6ZSkgcmV0dXJuZWQgMCAqLworICAgICAgICBpZiAobiA8IDApCisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZWFkICV6aSBieXRlcyBmcm9tIC9kZXYvdXJhbmRvbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBjbG9zZShmZCk7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogIWRlZmluZWQoTVNfV0lORE9XUykgJiYgIWRlZmluZWQoX19WTVMpICovCisKKy8qIEZpbGwgYnVmZmVyIHdpdGggcHNldWRvLXJhbmRvbSBieXRlcyBnZW5lcmF0ZWQgYnkgYSBsaW5lYXIgY29uZ3J1ZW50CisgICBnZW5lcmF0b3IgKExDRyk6CisKKyAgICAgICB4KG4rMSkgPSAoeChuKSAqIDIxNDAxMyArIDI1MzEwMTEpICUgMl4zMgorCisgICBVc2UgYml0cyAyMy4uMTYgb2YgeChuKSB0byBnZW5lcmF0ZSBhIGJ5dGUuICovCitzdGF0aWMgdm9pZAorbGNnX3VyYW5kb20odW5zaWduZWQgaW50IHgwLCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQoreworICAgIHNpemVfdCBpbmRleDsKKyAgICB1bnNpZ25lZCBpbnQgeDsKKworICAgIHggPSB4MDsKKyAgICBmb3IgKGluZGV4PTA7IGluZGV4IDwgc2l6ZTsgaW5kZXgrKykgeworICAgICAgICB4ICo9IDIxNDAxMzsKKyAgICAgICAgeCArPSAyNTMxMDExOworICAgICAgICAvKiBtb2R1bG8gMiBeICg4ICogc2l6ZW9mKGludCkpICovCisgICAgICAgIGJ1ZmZlcltpbmRleF0gPSAoeCA+PiAxNikgJiAweGZmOworICAgIH0KK30KKworLyogRmlsbCBidWZmZXIgd2l0aCBzaXplIHBzZXVkby1yYW5kb20gYnl0ZXMgZnJvbSB0aGUgb3BlcmF0aW5nIHN5c3RlbSByYW5kb20KKyAgIG51bWJlciBnZW5lcmF0b3IgKFJORykuIEl0IGlzIHN1aXRhYmxlIGZvciBmb3IgbW9zdCBjcnlwdG9ncmFwaGljIHB1cnBvc2VzCisgICBleGNlcHQgbG9uZyBsaXZpbmcgcHJpdmF0ZSBrZXlzIGZvciBhc3ltbWV0cmljIGVuY3J5cHRpb24uCisKKyAgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIHJhaXNlIGFuIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIC0xIG9uIGVycm9yLiAqLworaW50CitfUHlPU19VUmFuZG9tKHZvaWQgKmJ1ZmZlciwgUHlfc3NpemVfdCBzaXplKQoreworICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJuZWdhdGl2ZSBhcmd1bWVudCBub3QgYWxsb3dlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChzaXplID09IDApCisgICAgICAgIHJldHVybiAwOworCisjaWZkZWYgTVNfV0lORE9XUworICAgIHJldHVybiB3aW4zMl91cmFuZG9tKCh1bnNpZ25lZCBjaGFyICopYnVmZmVyLCBzaXplLCAxKTsKKyNlbHNlCisjIGlmZGVmIF9fVk1TCisgICAgcmV0dXJuIHZtc191cmFuZG9tKCh1bnNpZ25lZCBjaGFyICopYnVmZmVyLCBzaXplLCAxKTsKKyMgZWxzZQorICAgIHJldHVybiBkZXZfdXJhbmRvbV9weXRob24oKGNoYXIqKWJ1ZmZlciwgc2l6ZSk7CisjIGVuZGlmCisjZW5kaWYKK30KKwordm9pZAorX1B5UmFuZG9tX0luaXQodm9pZCkKK3sKKyAgICBjaGFyICplbnY7CisgICAgdm9pZCAqc2VjcmV0ID0gJl9QeV9IYXNoU2VjcmV0OworICAgIFB5X3NzaXplX3Qgc2VjcmV0X3NpemUgPSBzaXplb2YoX1B5X0hhc2hTZWNyZXRfdCk7CisKKyAgICBpZiAoX1B5X0hhc2hTZWNyZXRfSW5pdGlhbGl6ZWQpCisgICAgICAgIHJldHVybjsKKyAgICBfUHlfSGFzaFNlY3JldF9Jbml0aWFsaXplZCA9IDE7CisKKyAgICAvKgorICAgICAgQnkgZGVmYXVsdCwgaGFzaCByYW5kb21pemF0aW9uIGlzIGRpc2FibGVkLCBhbmQgb25seQorICAgICAgZW5hYmxlZCBpZiBQWVRIT05IQVNIU0VFRCBpcyBzZXQgdG8gbm9uLWVtcHR5IG9yIGlmCisgICAgICAiLVIiIGlzIHByb3ZpZGVkIGF0IHRoZSBjb21tYW5kIGxpbmU6CisgICAgKi8KKyAgICBpZiAoIVB5X0hhc2hSYW5kb21pemF0aW9uRmxhZykgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSByYW5kb21pemVkIGhhc2g6ICovCisgICAgICAgIG1lbXNldChzZWNyZXQsIDAsIHNlY3JldF9zaXplKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qCisgICAgICBIYXNoIHJhbmRvbWl6YXRpb24gaXMgZW5hYmxlZC4gIEdlbmVyYXRlIGEgcGVyLXByb2Nlc3Mgc2VjcmV0LAorICAgICAgdXNpbmcgUFlUSE9OSEFTSFNFRUQgaWYgcHJvdmlkZWQuCisgICAgKi8KKworICAgIGVudiA9IFB5X0dFVEVOVigiUFlUSE9OSEFTSFNFRUQiKTsKKyAgICBpZiAoZW52ICYmICplbnYgIT0gJ1wwJyAmJiBzdHJjbXAoZW52LCAicmFuZG9tIikgIT0gMCkgeworICAgICAgICBjaGFyICplbmRwdHIgPSBlbnY7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgc2VlZDsKKyAgICAgICAgc2VlZCA9IHN0cnRvdWwoZW52LCAmZW5kcHRyLCAxMCk7CisgICAgICAgIGlmICgqZW5kcHRyICE9ICdcMCcKKyAgICAgICAgICAgIHx8IHNlZWQgPiA0Mjk0OTY3Mjk1VUwKKyAgICAgICAgICAgIHx8IChlcnJubyA9PSBFUkFOR0UgJiYgc2VlZCA9PSBVTE9OR19NQVgpKQorICAgICAgICB7CisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJQWVRIT05IQVNIU0VFRCBtdXN0IGJlIFwicmFuZG9tXCIgb3IgYW4gaW50ZWdlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiByYW5nZSBbMDsgNDI5NDk2NzI5NV0iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VlZCA9PSAwKSB7CisgICAgICAgICAgICAvKiBkaXNhYmxlIHRoZSByYW5kb21pemVkIGhhc2ggKi8KKyAgICAgICAgICAgIG1lbXNldChzZWNyZXQsIDAsIHNlY3JldF9zaXplKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGxjZ191cmFuZG9tKHNlZWQsICh1bnNpZ25lZCBjaGFyKilzZWNyZXQsIHNlY3JldF9zaXplKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyNpZmRlZiBNU19XSU5ET1dTCisgICAgICAgICh2b2lkKXdpbjMyX3VyYW5kb20oKHVuc2lnbmVkIGNoYXIgKilzZWNyZXQsIHNlY3JldF9zaXplLCAwKTsKKyNlbHNlIC8qICNpZmRlZiBNU19XSU5ET1dTICovCisjIGlmZGVmIF9fVk1TCisgICAgICAgIHZtc191cmFuZG9tKCh1bnNpZ25lZCBjaGFyICopc2VjcmV0LCBzZWNyZXRfc2l6ZSwgMCk7CisjIGVsc2UKKyAgICAgICAgZGV2X3VyYW5kb21fbm9yYWlzZSgoY2hhciopc2VjcmV0LCBzZWNyZXRfc2l6ZSk7CisjIGVuZGlmCisjZW5kaWYKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9QeXRob24vc3ltdGFibGUuYyBiL1B5dGhvbi9zeW10YWJsZS5jCmluZGV4IDUxYjU5ZjAuLjhkNGIwZDMgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9zeW10YWJsZS5jCisrKyBiL1B5dGhvbi9zeW10YWJsZS5jCkBAIC0yMiwxNiArMjIsMTggQEAKICAgICAgICAgICAgICAgdm9pZCAqa2V5LCBpbnQgbGluZW5vKQogewogICAgIFB5U1RFbnRyeU9iamVjdCAqc3RlID0gTlVMTDsKLSAgICBQeU9iamVjdCAqazsKKyAgICBQeU9iamVjdCAqayA9IE5VTEw7CiAKICAgICBrID0gUHlMb25nX0Zyb21Wb2lkUHRyKGtleSk7CiAgICAgaWYgKGsgPT0gTlVMTCkKICAgICAgICAgZ290byBmYWlsOwogICAgIHN0ZSA9IFB5T2JqZWN0X05ldyhQeVNURW50cnlPYmplY3QsICZQeVNURW50cnlfVHlwZSk7Ci0gICAgaWYgKHN0ZSA9PSBOVUxMKQorICAgIGlmIChzdGUgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoayk7CiAgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CiAgICAgc3RlLT5zdGVfdGFibGUgPSBzdDsKLSAgICBzdGUtPnN0ZV9pZCA9IGs7CisgICAgc3RlLT5zdGVfaWQgPSBrOyAvKiBzdGUgb3ducyByZWZlcmVuY2UgdG8gayAqLwogCiAgICAgc3RlLT5zdGVfbmFtZSA9IG5hbWU7CiAgICAgUHlfSU5DUkVGKG5hbWUpOwpAQCAtNDY2LDcgKzQ2OCw3IEBACiAgICAgICAgICAqLwogICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oc2NvcGUsIG5hbWUsIHcpIDwgMCkKICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIGlmICghUHlEaWN0X0RlbEl0ZW0oZnJlZSwgbmFtZSkgPCAwKQorICAgICAgICBpZiAoUHlEaWN0X0RlbEl0ZW0oZnJlZSwgbmFtZSkgPCAwKQogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAgICAgc3VjY2VzcyA9IDE7CkBAIC01MDIsNyArNTA0LDcgQEAKICAgICBjYXNlIE9QVF9CQVJFX0VYRUM6CiAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKICAgICAgICAgICAgICAgICAgICAgICAidW5xdWFsaWZpZWQgZXhlYyBpcyBub3QgYWxsb3dlZCBpbiBmdW5jdGlvbiAiCi0gICAgICAgICAgICAgICAgICAgICAgIiclLjEwMHMnIGl0ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAiJyUuMTAwcycgYmVjYXVzZSBpdCAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHN0ZS0+c3RlX25hbWUpLCB0cmFpbGVyKTsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKZGlmZiAtLWdpdCBhL1B5dGhvbi9zeXNtb2R1bGUuYyBiL1B5dGhvbi9zeXNtb2R1bGUuYwppbmRleCA2OTI4MDViLi41NjBlYTRlIDEwMDY0NAotLS0gYS9QeXRob24vc3lzbW9kdWxlLmMKKysrIGIvUHl0aG9uL3N5c21vZHVsZS5jCkBAIC0yMTksNyArMjE5LDcgQEAKIFxuXAogRXhpdCB0aGUgaW50ZXJwcmV0ZXIgYnkgcmFpc2luZyBTeXN0ZW1FeGl0KHN0YXR1cykuXG5cCiBJZiB0aGUgc3RhdHVzIGlzIG9taXR0ZWQgb3IgTm9uZSwgaXQgZGVmYXVsdHMgdG8gemVybyAoaS5lLiwgc3VjY2VzcykuXG5cCi1JZiB0aGUgc3RhdHVzIGlzIG51bWVyaWMsIGl0IHdpbGwgYmUgdXNlZCBhcyB0aGUgc3lzdGVtIGV4aXQgc3RhdHVzLlxuXAorSWYgdGhlIHN0YXR1cyBpcyBhbiBpbnRlZ2VyLCBpdCB3aWxsIGJlIHVzZWQgYXMgdGhlIHN5c3RlbSBleGl0IHN0YXR1cy5cblwKIElmIGl0IGlzIGFub3RoZXIga2luZCBvZiBvYmplY3QsIGl0IHdpbGwgYmUgcHJpbnRlZCBhbmQgdGhlIHN5c3RlbVxuXAogZXhpdCBzdGF0dXMgd2lsbCBiZSBvbmUgKGkuZS4sIGZhaWx1cmUpLiIKICk7CkBAIC0zNjcsOCArMzY3LDcgQEAKICAgICByZXN1bHQgPSBjYWxsX3RyYW1wb2xpbmUodHN0YXRlLCBjYWxsYmFjaywgZnJhbWUsIHdoYXQsIGFyZyk7CiAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXZhbF9TZXRUcmFjZShOVUxMLCBOVUxMKTsKLSAgICAgICAgUHlfWERFQ1JFRihmcmFtZS0+Zl90cmFjZSk7Ci0gICAgICAgIGZyYW1lLT5mX3RyYWNlID0gTlVMTDsKKyAgICAgICAgUHlfQ0xFQVIoZnJhbWUtPmZfdHJhY2UpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIGlmIChyZXN1bHQgIT0gUHlfTm9uZSkgewpAQCAtNjE2LDYgKzYxNSwxMCBAQAogICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odmVyc2lvbiwgcG9zKyssIFB5SW50X0Zyb21Mb25nKHZlci53U3VpdGVNYXNrKSk7CiAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2ZXJzaW9uLCBwb3MrKywgUHlJbnRfRnJvbUxvbmcodmVyLndQcm9kdWN0VHlwZSkpOwogCisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlfREVDUkVGKHZlcnNpb24pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgICAgcmV0dXJuIHZlcnNpb247CiB9CiAKQEAgLTEwOTMsNyArMTA5Niw3IEBACiBoZXh2ZXJzaW9uIC0tIHZlcnNpb24gaW5mb3JtYXRpb24gZW5jb2RlZCBhcyBhIHNpbmdsZSBpbnRlZ2VyXG5cCiBjb3B5cmlnaHQgLS0gY29weXJpZ2h0IG5vdGljZSBwZXJ0YWluaW5nIHRvIHRoaXMgaW50ZXJwcmV0ZXJcblwKIHBsYXRmb3JtIC0tIHBsYXRmb3JtIGlkZW50aWZpZXJcblwKLWV4ZWN1dGFibGUgLS0gcGF0aG5hbWUgb2YgdGhpcyBQeXRob24gaW50ZXJwcmV0ZXJcblwKK2V4ZWN1dGFibGUgLS0gYWJzb2x1dGUgcGF0aCBvZiB0aGUgZXhlY3V0YWJsZSBiaW5hcnkgb2YgdGhlIFB5dGhvbiBpbnRlcnByZXRlclxuXAogcHJlZml4IC0tIHByZWZpeCB1c2VkIHRvIGZpbmQgdGhlIFB5dGhvbiBsaWJyYXJ5XG5cCiBleGVjX3ByZWZpeCAtLSBwcmVmaXggdXNlZCB0byBmaW5kIHRoZSBtYWNoaW5lLXNwZWNpZmljIFB5dGhvbiBsaWJyYXJ5XG5cCiBmbG9hdF9yZXByX3N0eWxlIC0tIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBzdHlsZSBvZiByZXByKCkgb3V0cHV0IGZvciBmbG9hdHNcblwKQEAgLTEyMDksNiArMTIxMiw3IEBACiAgICAgeyJ1bmljb2RlIiwgICAgICAgICAgICAgICAgICItVSJ9LAogICAgIC8qIHsic2tpcF9maXJzdCIsICAgICAgICAgICAgICAgICAgICIteCJ9LCAqLwogICAgIHsiYnl0ZXNfd2FybmluZyIsICItYiJ9LAorICAgIHsiaGFzaF9yYW5kb21pemF0aW9uIiwgIi1SIn0sCiAgICAgezB9CiB9OwogCkBAIC0xMjE3LDkgKzEyMjEsOSBAQAogICAgIGZsYWdzX19kb2NfXywgICAgICAgLyogZG9jICovCiAgICAgZmxhZ3NfZmllbGRzLCAgICAgICAvKiBmaWVsZHMgKi8KICNpZmRlZiBSSVNDT1MKLSAgICAxNgorICAgIDE3CiAjZWxzZQotICAgIDE1CisgICAgMTYKICNlbmRpZgogfTsKIApAQCAtMTI1Niw5ICsxMjYwLDExIEBACiAgICAgU2V0RmxhZyhQeV9Vbmljb2RlRmxhZyk7CiAgICAgLyogU2V0RmxhZyhza2lwZmlyc3RsaW5lKTsgKi8KICAgICBTZXRGbGFnKFB5X0J5dGVzV2FybmluZ0ZsYWcpOworICAgIFNldEZsYWcoUHlfSGFzaFJhbmRvbWl6YXRpb25GbGFnKTsKICN1bmRlZiBTZXRGbGFnCiAKICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeV9ERUNSRUYoc2VxKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIHJldHVybiBzZXE7CmRpZmYgLS1naXQgYS9QeXRob24vdGhyZWFkLmMgYi9QeXRob24vdGhyZWFkLmMKaW5kZXggZGQzNTllOS4uZGQzMzNlOCAxMDA2NDQKLS0tIGEvUHl0aG9uL3RocmVhZC5jCisrKyBiL1B5dGhvbi90aHJlYWQuYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogCiAjaWZkZWYgX19zZ2kKLSNpZm5kZWYgSEFWRV9QVEhSRUFEX0ggLyogWFhYIE5lZWQgdG8gY2hlY2sgaW4gY29uZmlndXJlLmluICovCisjaWZuZGVmIEhBVkVfUFRIUkVBRF9IIC8qIFhYWCBOZWVkIHRvIGNoZWNrIGluIGNvbmZpZ3VyZS5hYyAqLwogI3VuZGVmIF9QT1NJWF9USFJFQURTCiAjZW5kaWYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvUHl0aG9uL3RocmVhZF9wdGhyZWFkLmggYi9QeXRob24vdGhyZWFkX3B0aHJlYWQuaAppbmRleCA0NGUyNTUyLi4wYzFmZGZlIDEwMDY0NAotLS0gYS9QeXRob24vdGhyZWFkX3B0aHJlYWQuaAorKysgYi9QeXRob24vdGhyZWFkX3B0aHJlYWQuaApAQCAtMTQ1LDYgKzE0NSw3IEBACiBQeVRocmVhZF9faW5pdF90aHJlYWQodm9pZCkKIHsKICNpZiBkZWZpbmVkKF9BSVgpICYmIGRlZmluZWQoX19HTlVDX18pCisgICAgZXh0ZXJuIHZvaWQgcHRocmVhZF9pbml0KHZvaWQpOwogICAgIHB0aHJlYWRfaW5pdCgpOwogI2VuZGlmCiB9CkBAIC0yNDEsOSArMjQyLDkgQEAKIFB5VGhyZWFkX2V4aXRfdGhyZWFkKHZvaWQpCiB7CiAgICAgZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIikpOwotICAgIGlmICghaW5pdGlhbGl6ZWQpIHsKKyAgICBpZiAoIWluaXRpYWxpemVkKQogICAgICAgICBleGl0KDApOwotICAgIH0KKyAgICBwdGhyZWFkX2V4aXQoMCk7CiB9CiAKICNpZmRlZiBVU0VfU0VNQVBIT1JFUwpAQCAtMjg0LDYgKzI4NSw3IEBACiAgICAgc2VtX3QgKnRoZWxvY2sgPSAoc2VtX3QgKilsb2NrOwogICAgIGludCBzdGF0dXMsIGVycm9yID0gMDsKIAorICAgICh2b2lkKSBlcnJvcjsgLyogc2lsZW5jZSB1bnVzZWQtYnV0LXNldC12YXJpYWJsZSB3YXJuaW5nICovCiAgICAgZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CiAKICAgICBpZiAoIXRoZWxvY2spCkBAIC0zMTQsNiArMzE2LDcgQEAKICAgICBzZW1fdCAqdGhlbG9jayA9IChzZW1fdCAqKWxvY2s7CiAgICAgaW50IHN0YXR1cywgZXJyb3IgPSAwOwogCisgICAgKHZvaWQpIGVycm9yOyAvKiBzaWxlbmNlIHVudXNlZC1idXQtc2V0LXZhcmlhYmxlIHdhcm5pbmcgKi8KICAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLCBsb2NrLCB3YWl0ZmxhZykpOwogCiAgICAgZG8gewpAQCAtMzQxLDYgKzM0NCw3IEBACiAgICAgc2VtX3QgKnRoZWxvY2sgPSAoc2VtX3QgKilsb2NrOwogICAgIGludCBzdGF0dXMsIGVycm9yID0gMDsKIAorICAgICh2b2lkKSBlcnJvcjsgLyogc2lsZW5jZSB1bnVzZWQtYnV0LXNldC12YXJpYWJsZSB3YXJuaW5nICovCiAgICAgZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CiAKICAgICBzdGF0dXMgPSBzZW1fcG9zdCh0aGVsb2NrKTsKQEAgLTM5MSw2ICszOTUsNyBAQAogICAgIHB0aHJlYWRfbG9jayAqdGhlbG9jayA9IChwdGhyZWFkX2xvY2sgKilsb2NrOwogICAgIGludCBzdGF0dXMsIGVycm9yID0gMDsKIAorICAgICh2b2lkKSBlcnJvcjsgLyogc2lsZW5jZSB1bnVzZWQtYnV0LXNldC12YXJpYWJsZSB3YXJuaW5nICovCiAgICAgZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CiAKICAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2Rlc3Ryb3koICZ0aGVsb2NrLT5tdXQgKTsKQEAgLTQ0Miw2ICs0NDcsNyBAQAogICAgIHB0aHJlYWRfbG9jayAqdGhlbG9jayA9IChwdGhyZWFkX2xvY2sgKilsb2NrOwogICAgIGludCBzdGF0dXMsIGVycm9yID0gMDsKIAorICAgICh2b2lkKSBlcnJvcjsgLyogc2lsZW5jZSB1bnVzZWQtYnV0LXNldC12YXJpYWJsZSB3YXJuaW5nICovCiAgICAgZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CiAKICAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soICZ0aGVsb2NrLT5tdXQgKTsKZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQppbmRleCA2ODBlNWUzLi5kMTFmZjNhIDEwMDY0NAotLS0gYS9SRUFETUUKKysrIGIvUkVBRE1FCkBAIC0xLDggKzEsOCBAQAotVGhpcyBpcyBQeXRob24gdmVyc2lvbiAyLjcuMgorVGhpcyBpcyBQeXRob24gdmVyc2lvbiAyLjcuOAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1Db3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEKLVB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK0NvcHlyaWdodCAoYykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSwKKzIwMTIsIDIwMTMsIDIwMTQgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiBDb3B5cmlnaHQgKGMpIDIwMDAgQmVPcGVuLmNvbS4KIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkBAIC04OSw2ICs4OSwxMyBAQAogcHJpbWFyaWx5IGZvciBkb2N1bWVudGF0aW9uIGF1dGhvcnMsIHRyYW5zbGF0b3JzLCBhbmQgcGVvcGxlIHdpdGggc3BlY2lhbAogZm9ybWF0dGluZyByZXF1aXJlbWVudHMuCiAKK0lmIHlvdSB3b3VsZCBsaWtlIHRvIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IG9mIFB5dGhvbiwgcmVsZXZhbnQKK2RvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIGF0OgorCisgICAgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9kZXZndWlkZS8KKworRm9yIGluZm9ybWF0aW9uIGFib3V0IGJ1aWxkaW5nIFB5dGhvbidzIGRvY3VtZW50YXRpb24sIHJlZmVyIHRvIERvYy9SRUFETUUudHh0LgorCiAKIFdlYiBzaXRlcwogLS0tLS0tLS0tCkBAIC0yNDEsNyArMjQ4LDcgQEAKIC0gTmVYVAogLSBJcml4IDQgYW5kIC0td2l0aC1zZ2ktZGwKIC0gTGludXggMQotLSBTeXN0ZW1zIGRlZmluaW5nIF9fZDZfcHRocmVhZF9jcmVhdGUgKGNvbmZpZ3VyZS5pbikKKy0gU3lzdGVtcyBkZWZpbmluZyBfX2Q2X3B0aHJlYWRfY3JlYXRlIChjb25maWd1cmUuYWMpCiAtIFN5c3RlbXMgZGVmaW5pbmcgUFlfUFRIUkVBRF9ENCwgUFlfUFRIUkVBRF9ENiwKICAgb3IgUFlfUFRIUkVBRF9ENyBpbiB0aHJlYWRfcHRocmVhZC5oCiAtIFN5c3RlbXMgdXNpbmcgLS13aXRoLWRsLWRsZApAQCAtNjgwLDEwICs2ODcsMTAgQEAKIHRocmVhZHMgdG8gd29yayBwcm9wZXJseS4gIEJlbG93IGlzIGEgdGFibGUgb2YgdGhvc2Ugb3B0aW9ucywKIGNvbGxlY3RlZCBieSBCaWxsIEphbnNzZW4uICBXZSB3b3VsZCBsb3ZlIHRvIGF1dG9tYXRlIHRoaXMgcHJvY2VzcwogbW9yZSwgYnV0IHRoZSBpbmZvcm1hdGlvbiBiZWxvdyBpcyBub3QgZW5vdWdoIHRvIHdyaXRlIGEgcGF0Y2ggZm9yIHRoZQotY29uZmlndXJlLmluIGZpbGUsIHNvIG1hbnVhbCBpbnRlcnZlbnRpb24gaXMgcmVxdWlyZWQuICBJZiB5b3UgcGF0Y2gKLXRoZSBjb25maWd1cmUuaW4gZmlsZSBhbmQgYXJlIGNvbmZpZGVudCB0aGF0IHRoZSBwYXRjaCB3b3JrcywgcGxlYXNlCitjb25maWd1cmUuYWMgZmlsZSwgc28gbWFudWFsIGludGVydmVudGlvbiBpcyByZXF1aXJlZC4gIElmIHlvdSBwYXRjaAordGhlIGNvbmZpZ3VyZS5hYyBmaWxlIGFuZCBhcmUgY29uZmlkZW50IHRoYXQgdGhlIHBhdGNoIHdvcmtzLCBwbGVhc2UKIHNlbmQgaW4gdGhlIHBhdGNoLiAgKERvbid0IGJvdGhlciBwYXRjaGluZyB0aGUgY29uZmlndXJlIHNjcmlwdCBpdHNlbGYKLS0tIGl0IGlzIHJlZ2VuZXJhdGVkIGVhY2ggdGltZSB0aGUgY29uZmlndXJlLmluIGZpbGUgY2hhbmdlcy4pCistLSBpdCBpcyByZWdlbmVyYXRlZCBlYWNoIHRpbWUgdGhlIGNvbmZpZ3VyZS5hYyBmaWxlIGNoYW5nZXMuKQogCiBDb21waWxlciBzd2l0Y2hlcyBmb3IgdGhyZWFkcwogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KQEAgLTEyMDEsNyArMTIwOCw3IEBACiBUb29scy8gICAgICAgICAgU29tZSB1c2VmdWwgcHJvZ3JhbXMgd3JpdHRlbiBpbiBQeXRob24KIHB5Y29uZmlnLmguaW4gICBTb3VyY2UgZnJvbSB3aGljaCBweWNvbmZpZy5oIGlzIGNyZWF0ZWQgKEdOVSBhdXRvaGVhZGVyIG91dHB1dCkKIGNvbmZpZ3VyZSAgICAgICBDb25maWd1cmF0aW9uIHNoZWxsIHNjcmlwdCAoR05VIGF1dG9jb25mIG91dHB1dCkKLWNvbmZpZ3VyZS5pbiAgICBDb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb24gKGlucHV0IGZvciBHTlUgYXV0b2NvbmYpCitjb25maWd1cmUuYWMgICAgQ29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9uIChpbnB1dCBmb3IgR05VIGF1dG9jb25mKQogaW5zdGFsbC1zaCAgICAgIFNoZWxsIHNjcmlwdCB1c2VkIHRvIGluc3RhbGwgZmlsZXMKIHNldHVwLnB5ICAgICAgICBQeXRob24gc2NyaXB0IHVzZWQgdG8gYnVpbGQgZXh0ZW5zaW9uIG1vZHVsZXMKIApkaWZmIC0tZ2l0IGEvVG9vbHMvYnVpbGRib3QvYnVpbGQtYW1kNjQuYmF0IGIvVG9vbHMvYnVpbGRib3QvYnVpbGQtYW1kNjQuYmF0CmluZGV4IDUxNzVjNjIuLjg3MTNiMzggMTAwNjQ0Ci0tLSBhL1Rvb2xzL2J1aWxkYm90L2J1aWxkLWFtZDY0LmJhdAorKysgYi9Ub29scy9idWlsZGJvdC9idWlsZC1hbWQ2NC5iYXQKQEAgLTEsNCArMSw1IEBACiBAcmVtIFVzZWQgYnkgdGhlIGJ1aWxkYm90ICJjb21waWxlIiBzdGVwLgorc2V0IEhPU1RfUFlUSE9OPSIlQ0QlXFBDYnVpbGRcYW1kNjRccHl0aG9uX2QuZXhlIgogY21kIC9jIFRvb2xzXGJ1aWxkYm90XGV4dGVybmFsLWFtZDY0LmJhdAogY2FsbCAiJVZTOTBDT01OVE9PTFMlXC4uXC4uXFZDXHZjdmFyc2FsbC5iYXQiIHg4Nl9hbWQ2NAogY21kIC9jIFRvb2xzXGJ1aWxkYm90XGNsZWFuLWFtZDY0LmJhdApkaWZmIC0tZ2l0IGEvVG9vbHMvYnVpbGRib3QvZXh0ZXJuYWwtYW1kNjQuYmF0IGIvVG9vbHMvYnVpbGRib3QvZXh0ZXJuYWwtYW1kNjQuYmF0CmluZGV4IGU5YzcwMTEuLmU2YmM5OTMgMTAwNjQ0Ci0tLSBhL1Rvb2xzL2J1aWxkYm90L2V4dGVybmFsLWFtZDY0LmJhdAorKysgYi9Ub29scy9idWlsZGJvdC9leHRlcm5hbC1hbWQ2NC5iYXQKQEAgLTUsMTYgKzUsMjQgQEAKIGNhbGwgIiVWUzkwQ09NTlRPT0xTJVwuLlwuLlxWQ1x2Y3ZhcnNhbGwuYmF0IiB4ODZfYW1kNjQKIAogaWYgbm90IGV4aXN0IHRjbHRrNjRcYmluXHRjbDg1Zy5kbGwgKAotICAgIGNkIHRjbC04LjUuMi4xXHdpbgotICAgIG5tYWtlIC1mIG1ha2VmaWxlLnZjIENPTVBJTEVSRkxBR1M9LURXSU5WRVI9MHgwNTAwIERFQlVHPTEgTUFDSElORT1BTUQ2NCBJTlNUQUxMRElSPS4uXC4uXHRjbHRrNjQgY2xlYW4gYWxsCi0gICAgbm1ha2UgLWYgbWFrZWZpbGUudmMgQ09NUElMRVJGTEFHUz0tRFdJTlZFUj0weDA1MDAgREVCVUc9MSBNQUNISU5FPUFNRDY0IElOU1RBTExESVI9Li5cLi5cdGNsdGs2NCBpbnN0YWxsCisgICAgY2QgdGNsLTguNS4xNS4wXHdpbgorICAgIG5tYWtlIC1mIG1ha2VmaWxlLnZjIERFQlVHPTEgTUFDSElORT1BTUQ2NCBJTlNUQUxMRElSPS4uXC4uXHRjbHRrNjQgY2xlYW4gYWxsCisgICAgbm1ha2UgLWYgbWFrZWZpbGUudmMgREVCVUc9MSBNQUNISU5FPUFNRDY0IElOU1RBTExESVI9Li5cLi5cdGNsdGs2NCBpbnN0YWxsCiAgICAgY2QgLi5cLi4KICkKIAogaWYgbm90IGV4aXN0IHRjbHRrNjRcYmluXHRrODVnLmRsbCAoCi0gICAgY2QgdGstOC41LjIuMFx3aW4gICAgCi0gICAgbm1ha2UgLWYgbWFrZWZpbGUudmMgQ09NUElMRVJGTEFHUz0tRFdJTlZFUj0weDA1MDAgT1BUUz1ub3hwIERFQlVHPTEgTUFDSElORT1BTUQ2NCBJTlNUQUxMRElSPS4uXC4uXHRjbHRrNjQgVENMRElSPS4uXC4uXHRjbC04LjUuMi4xIGNsZWFuCi0gICAgbm1ha2UgLWYgbWFrZWZpbGUudmMgQ09NUElMRVJGTEFHUz0tRFdJTlZFUj0weDA1MDAgT1BUUz1ub3hwIERFQlVHPTEgTUFDSElORT1BTUQ2NCBJTlNUQUxMRElSPS4uXC4uXHRjbHRrNjQgVENMRElSPS4uXC4uXHRjbC04LjUuMi4xIGFsbAotICAgIG5tYWtlIC1mIG1ha2VmaWxlLnZjIENPTVBJTEVSRkxBR1M9LURXSU5WRVI9MHgwNTAwIE9QVFM9bm94cCBERUJVRz0xIE1BQ0hJTkU9QU1ENjQgSU5TVEFMTERJUj0uLlwuLlx0Y2x0azY0IFRDTERJUj0uLlwuLlx0Y2wtOC41LjIuMSBpbnN0YWxsCisgICAgY2QgdGstOC41LjE1LjBcd2luCisgICAgbm1ha2UgLWYgbWFrZWZpbGUudmMgREVCVUc9MSBNQUNISU5FPUFNRDY0IElOU1RBTExESVI9Li5cLi5cdGNsdGs2NCBUQ0xESVI9Li5cLi5cdGNsLTguNS4xNS4wIGNsZWFuCisgICAgbm1ha2UgLWYgbWFrZWZpbGUudmMgREVCVUc9MSBNQUNISU5FPUFNRDY0IElOU1RBTExESVI9Li5cLi5cdGNsdGs2NCBUQ0xESVI9Li5cLi5cdGNsLTguNS4xNS4wIGFsbAorICAgIG5tYWtlIC1mIG1ha2VmaWxlLnZjIERFQlVHPTEgTUFDSElORT1BTUQ2NCBJTlNUQUxMRElSPS4uXC4uXHRjbHRrNjQgVENMRElSPS4uXC4uXHRjbC04LjUuMTUuMCBpbnN0YWxsCisgICAgY2QgLi5cLi4KKykKKworaWYgbm90IGV4aXN0IHRjbHRrNjRcbGliXHRpeDguNC4zXHRpeDg0Zy5kbGwgKAorICAgIGNkIHRpeC04LjQuMy41XHdpbgorICAgIG5tYWtlIC1mIHB5dGhvbi5tYWsgREVCVUc9MSBNQUNISU5FPUFNRDY0IFRDTF9ESVI9Li5cLi5cdGNsLTguNS4xNS4wIFRLX0RJUj0uLlwuLlx0ay04LjUuMTUuMCBJTlNUQUxMX0RJUj0uLlwuLlx0Y2x0azY0IGNsZWFuCisgICAgbm1ha2UgLWYgcHl0aG9uLm1hayBERUJVRz0xIE1BQ0hJTkU9QU1ENjQgVENMX0RJUj0uLlwuLlx0Y2wtOC41LjE1LjAgVEtfRElSPS4uXC4uXHRrLTguNS4xNS4wIElOU1RBTExfRElSPS4uXC4uXHRjbHRrNjQgYWxsCisgICAgbm1ha2UgLWYgcHl0aG9uLm1hayBERUJVRz0xIE1BQ0hJTkU9QU1ENjQgVENMX0RJUj0uLlwuLlx0Y2wtOC41LjE1LjAgVEtfRElSPS4uXC4uXHRrLTguNS4xNS4wIElOU1RBTExfRElSPS4uXC4uXHRjbHRrNjQgaW5zdGFsbAogICAgIGNkIC4uXC4uCiApCmRpZmYgLS1naXQgYS9Ub29scy9idWlsZGJvdC9leHRlcm5hbC1jb21tb24uYmF0IGIvVG9vbHMvYnVpbGRib3QvZXh0ZXJuYWwtY29tbW9uLmJhdAppbmRleCA4MzQ5MjBlLi4zMTllZjE1IDEwMDY0NAotLS0gYS9Ub29scy9idWlsZGJvdC9leHRlcm5hbC1jb21tb24uYmF0CisrKyBiL1Rvb2xzL2J1aWxkYm90L2V4dGVybmFsLWNvbW1vbi5iYXQKQEAgLTQsMjQgKzQsMzEgQEAKIGNkIC4uCiBAcmVtIFhYWDogSWYgeW91IG5lZWQgdG8gZm9yY2UgdGhlIGJ1aWxkYm90cyB0byBzdGFydCBmcm9tIGEgZnJlc2ggZW52aXJvbm1lbnQsIHVuY29tbWVudAogQHJlbSB0aGUgZm9sbG93aW5nLCBjaGVjayBpdCBpbiwgdGhlbiBjaGVjayBpdCBvdXQsIGNvbW1lbnQgaXQgb3V0LCB0aGVuIGNoZWNrIGl0IGJhY2sgaW4uCi1AcmVtIGlmIGV4aXN0IGJ6aXAyLTEuMC41IHJkIC9zL3EgYnppcDItMS4wLjUKK0ByZW0gaWYgZXhpc3QgYnppcDItMS4wLjYgcmQgL3MvcSBiemlwMi0xLjAuNgogQHJlbSBpZiBleGlzdCB0Y2x0ayByZCAvcy9xIHRjbHRrCiBAcmVtIGlmIGV4aXN0IHRjbHRrNjQgcmQgL3MvcSB0Y2x0azY0CiBAcmVtIGlmIGV4aXN0IHRjbDguNC4xMiByZCAvcy9xIHRjbDguNC4xMgogQHJlbSBpZiBleGlzdCB0Y2w4LjQuMTYgcmQgL3MvcSB0Y2w4LjQuMTYKIEByZW0gaWYgZXhpc3QgdGNsLTguNC4xOC4xIHJkIC9zL3EgdGNsLTguNC4xOC4xCitAcmVtIGlmIGV4aXN0IHRjbC04LjUuMi4xIHJkIC9zL3EgdGNsLTguNS4yLjEKK0ByZW0gaWYgZXhpc3QgdGNsLTguNS4xNS4wIHJkIC9zL3EgdGNsLTguNS4xNS4wCiBAcmVtIGlmIGV4aXN0IHRrOC40LjEyIHJkIC9zL3EgdGs4LjQuMTIKIEByZW0gaWYgZXhpc3QgdGs4LjQuMTYgcmQgL3MvcSB0azguNC4xNgogQHJlbSBpZiBleGlzdCB0ay04LjQuMTguMSByZCAvcy9xIHRrLTguNC4xOC4xCitAcmVtIGlmIGV4aXN0IHRrLTguNS4yLjAgcmQgL3MvcSB0ay04LjUuMi4wCitAcmVtIGlmIGV4aXN0IHRrLTguNS4xNS4wIHJkIC9zL3EgdGstOC41LjE1LjAKK0ByZW0gaWYgZXhpc3QgdGl4LTguNC4zLjUgcmQgL3MvcSB0aXgtOC40LjMuNQogQHJlbSBpZiBleGlzdCBkYi00LjQuMjAgcmQgL3MvcSBkYi00LjQuMjAKIEByZW0gaWYgZXhpc3QgZGItNC43LjI1LjAgcmQgL3MvcSBkYi00LjcuMjUuMAotQHJlbSBpZiBleGlzdCBvcGVuc3NsLTAuOS44bCByZCAvcy9xIG9wZW5zc2wtMC45LjhsCi1AcmVtIGlmIGV4aXN0IHNxbGl0ZS0zLjYuMjEgcmQgL3MvcSBzcWxpdGUtMy42LjIxICAgIAorQHJlbSBpZiBleGlzdCBvcGVuc3NsLTAuOS44eSByZCAvcy9xIG9wZW5zc2wtMC45Ljh5CitAcmVtIGlmIGV4aXN0IG9wZW5zc2wtMS4wLjFnIHJkIC9zL3Egb3BlbnNzbC0xLjAuMWcKK0ByZW0gaWYgZXhpc3Qgb3BlbnNzbC0xLjAuMWggcmQgL3MvcSBvcGVuc3NsLTEuMC4xaAorQHJlbSBpZiBleGlzdCBzcWxpdGUtMy42LjIxIHJkIC9zL3Egc3FsaXRlLTMuNi4yMQogCiBAcmVtIGJ6aXAKLWlmIG5vdCBleGlzdCBiemlwMi0xLjAuNSAoCi0gICByZCAvcy9xIGJ6aXAyLTEuMC4zCi0gIHN2biBleHBvcnQgaHR0cDovL3N2bi5weXRob24ub3JnL3Byb2plY3RzL2V4dGVybmFsL2J6aXAyLTEuMC41CitpZiBub3QgZXhpc3QgYnppcDItMS4wLjYgKAorICAgcmQgL3MvcSBiemlwMi0xLjAuNQorICBzdm4gZXhwb3J0IGh0dHA6Ly9zdm4ucHl0aG9uLm9yZy9wcm9qZWN0cy9leHRlcm5hbC9iemlwMi0xLjAuNgogKQogCiBAcmVtIEJlcmtlbGV5IERCCkBAIC0yOSwxNCArMzYsMTYgQEAKIGlmIG5vdCBleGlzdCBkYi00LjcuMjUuMCBzdm4gZXhwb3J0IGh0dHA6Ly9zdm4ucHl0aG9uLm9yZy9wcm9qZWN0cy9leHRlcm5hbC9kYi00LjcuMjUuMAogCiBAcmVtIE9wZW5TU0wKLWlmIG5vdCBleGlzdCBvcGVuc3NsLTAuOS44bCBzdm4gZXhwb3J0IGh0dHA6Ly9zdm4ucHl0aG9uLm9yZy9wcm9qZWN0cy9leHRlcm5hbC9vcGVuc3NsLTAuOS44bAoraWYgZXhpc3Qgb3BlbnNzbC0xLjAuMWcgcmQgL3MvcSBvcGVuc3NsLTEuMC4xZworaWYgbm90IGV4aXN0IG9wZW5zc2wtMS4wLjFoIHN2biBleHBvcnQgaHR0cDovL3N2bi5weXRob24ub3JnL3Byb2plY3RzL2V4dGVybmFsL29wZW5zc2wtMS4wLjFoCiAKIEByZW0gdGNsL3RrCi1pZiBub3QgZXhpc3QgdGNsLTguNS4yLjEgKAotICAgcmQgL3MvcSB0Y2x0ayB0Y2x0azY0Ci0gICBzdm4gZXhwb3J0IGh0dHA6Ly9zdm4ucHl0aG9uLm9yZy9wcm9qZWN0cy9leHRlcm5hbC90Y2wtOC41LjIuMQoraWYgbm90IGV4aXN0IHRjbC04LjUuMTUuMCAoCisgICByZCAvcy9xIHRjbHRrIHRjbHRrNjQgdGNsLTguNS4yLjEgdGstOC41LjIuMAorICAgc3ZuIGV4cG9ydCBodHRwOi8vc3ZuLnB5dGhvbi5vcmcvcHJvamVjdHMvZXh0ZXJuYWwvdGNsLTguNS4xNS4wCiApCi1pZiBub3QgZXhpc3QgdGstOC41LjIuMCBzdm4gZXhwb3J0IGh0dHA6Ly9zdm4ucHl0aG9uLm9yZy9wcm9qZWN0cy9leHRlcm5hbC90ay04LjUuMi4wCitpZiBub3QgZXhpc3QgdGstOC41LjE1LjAgc3ZuIGV4cG9ydCBodHRwOi8vc3ZuLnB5dGhvbi5vcmcvcHJvamVjdHMvZXh0ZXJuYWwvdGstOC41LjE1LjAKK2lmIG5vdCBleGlzdCB0aXgtOC40LjMuNSBzdm4gZXhwb3J0IGh0dHA6Ly9zdm4ucHl0aG9uLm9yZy9wcm9qZWN0cy9leHRlcm5hbC90aXgtOC40LjMuNQogCiBAcmVtIHNxbGl0ZTMKIGlmIG5vdCBleGlzdCBzcWxpdGUtMy42LjIxICgKZGlmZiAtLWdpdCBhL1Rvb2xzL2J1aWxkYm90L2V4dGVybmFsLmJhdCBiL1Rvb2xzL2J1aWxkYm90L2V4dGVybmFsLmJhdAppbmRleCBkOTBlOGNlLi44YWFhZjQ2IDEwMDY0NAotLS0gYS9Ub29scy9idWlsZGJvdC9leHRlcm5hbC5iYXQKKysrIGIvVG9vbHMvYnVpbGRib3QvZXh0ZXJuYWwuYmF0CkBAIC02LDE2ICs2LDI0IEBACiAKIGlmIG5vdCBleGlzdCB0Y2x0a1xiaW5cdGNsODVnLmRsbCAoCiAgICAgQHJlbSBhbGwgYW5kIGluc3RhbGwgbmVlZCB0byBiZSBzZXBhcmF0ZSBpbnZvY2F0aW9ucywgb3RoZXJ3aXNlIG5tYWtlaGxwIGlzIG5vdCBmb3VuZCBvbiBpbnN0YWxsCi0gICAgY2QgdGNsLTguNS4yLjFcd2luCi0gICAgbm1ha2UgLWYgbWFrZWZpbGUudmMgQ09NUElMRVJGTEFHUz0tRFdJTlZFUj0weDA1MDAgREVCVUc9MSBJTlNUQUxMRElSPS4uXC4uXHRjbHRrIGNsZWFuIGFsbCAKKyAgICBjZCB0Y2wtOC41LjE1LjBcd2luCisgICAgbm1ha2UgLWYgbWFrZWZpbGUudmMgREVCVUc9MSBJTlNUQUxMRElSPS4uXC4uXHRjbHRrIGNsZWFuIGFsbAogICAgIG5tYWtlIC1mIG1ha2VmaWxlLnZjIERFQlVHPTEgSU5TVEFMTERJUj0uLlwuLlx0Y2x0ayBpbnN0YWxsCiAgICAgY2QgLi5cLi4KICkKIAogaWYgbm90IGV4aXN0IHRjbHRrXGJpblx0azg1Zy5kbGwgKAotICAgIGNkIHRrLTguNS4yLjBcd2luICAgIAotICAgIG5tYWtlIC1mIG1ha2VmaWxlLnZjIENPTVBJTEVSRkxBR1M9LURXSU5WRVI9MHgwNTAwIE9QVFM9bm94cCBERUJVRz0xIElOU1RBTExESVI9Li5cLi5cdGNsdGsgVENMRElSPS4uXC4uXHRjbC04LjUuMi4xIGNsZWFuCi0gICAgbm1ha2UgLWYgbWFrZWZpbGUudmMgQ09NUElMRVJGTEFHUz0tRFdJTlZFUj0weDA1MDAgT1BUUz1ub3hwIERFQlVHPTEgSU5TVEFMTERJUj0uLlwuLlx0Y2x0ayBUQ0xESVI9Li5cLi5cdGNsLTguNS4yLjEgYWxsCi0gICAgbm1ha2UgLWYgbWFrZWZpbGUudmMgQ09NUElMRVJGTEFHUz0tRFdJTlZFUj0weDA1MDAgT1BUUz1ub3hwIERFQlVHPTEgSU5TVEFMTERJUj0uLlwuLlx0Y2x0ayBUQ0xESVI9Li5cLi5cdGNsLTguNS4yLjEgaW5zdGFsbAorICAgIGNkIHRrLTguNS4xNS4wXHdpbgorICAgIG5tYWtlIC1mIG1ha2VmaWxlLnZjIERFQlVHPTEgSU5TVEFMTERJUj0uLlwuLlx0Y2x0ayBUQ0xESVI9Li5cLi5cdGNsLTguNS4xNS4wIGNsZWFuCisgICAgbm1ha2UgLWYgbWFrZWZpbGUudmMgREVCVUc9MSBJTlNUQUxMRElSPS4uXC4uXHRjbHRrIFRDTERJUj0uLlwuLlx0Y2wtOC41LjE1LjAgYWxsCisgICAgbm1ha2UgLWYgbWFrZWZpbGUudmMgREVCVUc9MSBJTlNUQUxMRElSPS4uXC4uXHRjbHRrIFRDTERJUj0uLlwuLlx0Y2wtOC41LjE1LjAgaW5zdGFsbAorICAgIGNkIC4uXC4uCispCisKK2lmIG5vdCBleGlzdCB0Y2x0a1xsaWJcdGl4OC40LjNcdGl4ODRnLmRsbCAoCisgICAgY2QgdGl4LTguNC4zLjVcd2luCisgICAgbm1ha2UgLWYgcHl0aG9uLm1hayBERUJVRz0xIE1BQ0hJTkU9SVg4NiBUQ0xfRElSPS4uXC4uXHRjbC04LjUuMTUuMCBUS19ESVI9Li5cLi5cdGstOC41LjE1LjAgSU5TVEFMTF9ESVI9Li5cLi5cdGNsdGsgY2xlYW4KKyAgICBubWFrZSAtZiBweXRob24ubWFrIERFQlVHPTEgTUFDSElORT1JWDg2IFRDTF9ESVI9Li5cLi5cdGNsLTguNS4xNS4wIFRLX0RJUj0uLlwuLlx0ay04LjUuMTUuMCBJTlNUQUxMX0RJUj0uLlwuLlx0Y2x0ayBhbGwKKyAgICBubWFrZSAtZiBweXRob24ubWFrIERFQlVHPTEgTUFDSElORT1JWDg2IFRDTF9ESVI9Li5cLi5cdGNsLTguNS4xNS4wIFRLX0RJUj0uLlwuLlx0ay04LjUuMTUuMCBJTlNUQUxMX0RJUj0uLlwuLlx0Y2x0ayBpbnN0YWxsCiAgICAgY2QgLi5cLi4KICkKZGlmZiAtLWdpdCBhL1Rvb2xzL2J1aWxkYm90L3Rlc3QtYW1kNjQuYmF0IGIvVG9vbHMvYnVpbGRib3QvdGVzdC1hbWQ2NC5iYXQKaW5kZXggZDE3OGM5Mi4uMDAwMzc2MSAxMDA2NDQKLS0tIGEvVG9vbHMvYnVpbGRib3QvdGVzdC1hbWQ2NC5iYXQKKysrIGIvVG9vbHMvYnVpbGRib3QvdGVzdC1hbWQ2NC5iYXQKQEAgLTEsMyArMSwzIEBACiBAcmVtIFVzZWQgYnkgdGhlIGJ1aWxkYm90ICJ0ZXN0IiBzdGVwLgogY2QgUENidWlsZAotY2FsbCBydC5iYXQgLXEgLWQgLXg2NCAtdWFsbCAtcncKK2NhbGwgcnQuYmF0IC1kIC1xIC14NjQgLXVhbGwgLXJ3VyAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQpkaWZmIC0tZ2l0IGEvVG9vbHMvYnVpbGRib3QvdGVzdC5iYXQgYi9Ub29scy9idWlsZGJvdC90ZXN0LmJhdAppbmRleCAzZWNjY2U4Li5hM2EzNTc5IDEwMDY0NAotLS0gYS9Ub29scy9idWlsZGJvdC90ZXN0LmJhdAorKysgYi9Ub29scy9idWlsZGJvdC90ZXN0LmJhdApAQCAtMSwzICsxLDMgQEAKIEByZW0gVXNlZCBieSB0aGUgYnVpbGRib3QgInRlc3QiIHN0ZXAuCiBjZCBQQ2J1aWxkCi1jYWxsIHJ0LmJhdCAtZCAtcSAtdWFsbCAtcndXCitjYWxsIHJ0LmJhdCAtZCAtcSAtdWFsbCAtcndXICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5CmRpZmYgLS1naXQgYS9Ub29scy9mcmVlemUvY2hlY2tleHRlbnNpb25zX3dpbjMyLnB5IGIvVG9vbHMvZnJlZXplL2NoZWNrZXh0ZW5zaW9uc193aW4zMi5weQppbmRleCBlNWE4YjI5Li44YzY0NDRjIDEwMDY0NAotLS0gYS9Ub29scy9mcmVlemUvY2hlY2tleHRlbnNpb25zX3dpbjMyLnB5CisrKyBiL1Rvb2xzL2ZyZWV6ZS9jaGVja2V4dGVuc2lvbnNfd2luMzIucHkKQEAgLTMsNyArMyw3IEBACiBVbmRlciBXaW5kb3dzIGl0IGlzIHVubGlrZWx5IHRoZSAub2JqIGZpbGVzIGFyZSBvZiB1c2UsIGFzIHNwZWNpYWwgY29tcGlsZXIgb3B0aW9ucwogYXJlIG5lZWRlZCAocHJpbWFyaWx5IHRvIHRvZ2dsZSB0aGUgYmVoYXZpb3Igb2YgInB1YmxpYyIgc3ltYm9scy4KIAotSSBkb250IGNvbnNpZGVyIGl0IHdvcnRoIHBhcnNpbmcgdGhlIE1TVkMgbWFrZWZpbGVzIGZvciBjb21waWxlciBvcHRpb25zLiAgRXZlbiBpZgorSSBkb24ndCBjb25zaWRlciBpdCB3b3J0aCBwYXJzaW5nIHRoZSBNU1ZDIG1ha2VmaWxlcyBmb3IgY29tcGlsZXIgb3B0aW9ucy4gIEV2ZW4gaWYKIHdlIGdldCBpdCBqdXN0IHJpZ2h0LCBhIHNwZWNpZmljIGZyZWV6ZSBhcHBsaWNhdGlvbiBtYXkgaGF2ZSBzcGVjaWZpYyBjb21waWxlcgogb3B0aW9ucyBhbnl3YXkgKGVnLCB0byBlbmFibGUgb3IgZGlzYWJsZSBzcGVjaWZpYyBmdW5jdGlvbmFsaXR5KQogCkBAIC0xNCw3ICsxNCw3IEBACiAgIHlvdXIgb3duKS4KICogVGhpcyBkZXNjcmlwdGlvbiBjYW4gaW5jbHVkZToKICAgLSBUaGUgTVNWQyAuZHNwIGZpbGUgZm9yIHRoZSBleHRlbnNpb24uICBUaGUgLmMgc291cmNlIGZpbGUgbmFtZXMKLSAgICBhcmUgZXh0cmFjZWQgZnJvbSB0aGVyZS4KKyAgICBhcmUgZXh0cmFjdGVkIGZyb20gdGhlcmUuCiAgIC0gU3BlY2lmaWMgY29tcGlsZXIvbGlua2VyIG9wdGlvbnMKICAgLSBGbGFnIHRvIGluZGljYXRlIGlmIFVuaWNvZGUgY29tcGlsYXRpb24gaXMgZXhwZWN0ZWQuCiAKZGlmZiAtLWdpdCBhL1Rvb2xzL2ZyZWV6ZS9tYWtlZnJlZXplLnB5IGIvVG9vbHMvZnJlZXplL21ha2VmcmVlemUucHkKaW5kZXggMTIwOGI2Ny4uYzBmNTA1NiAxMDA2NDQKLS0tIGEvVG9vbHMvZnJlZXplL21ha2VmcmVlemUucHkKKysrIGIvVG9vbHMvZnJlZXplL21ha2VmcmVlemUucHkKQEAgLTYyLDcgKzYyLDcgQEAKICAgICAgICAgb3V0ZnAud3JpdGUoJ1x0eyIlcyIsIE1fJXMsICVkfSxcbicgJSAobW9kLCBtYW5nbGVkLCBzaXplKSkKICAgICBvdXRmcC53cml0ZSgnXG4nKQogICAgICMgVGhlIGZvbGxvd2luZyBtb2R1bGVzIGhhdmUgYSBOVUxMIGNvZGUgcG9pbnRlciwgaW5kaWNhdGluZwotICAgICMgdGhhdCB0aGUgcHJvemVuIHByb2dyYW0gc2hvdWxkIG5vdCBzZWFyY2ggZm9yIHRoZW0gb24gdGhlIGhvc3QKKyAgICAjIHRoYXQgdGhlIGZyb3plbiBwcm9ncmFtIHNob3VsZCBub3Qgc2VhcmNoIGZvciB0aGVtIG9uIHRoZSBob3N0CiAgICAgIyBzeXN0ZW0uIEltcG9ydGluZyB0aGVtIHdpbGwgKmFsd2F5cyogcmFpc2UgYW4gSW1wb3J0RXJyb3IuCiAgICAgIyBUaGUgemVybyB2YWx1ZSBzaXplIGlzIG5ldmVyIHVzZWQuCiAgICAgZm9yIG1vZCBpbiBmYWlsX2ltcG9ydDoKZGlmZiAtLWdpdCBhL1Rvb2xzL2dkYi9saWJweXRob24ucHkgYi9Ub29scy9nZGIvbGlicHl0aG9uLnB5Cm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMjFlNzRkOC4uYmJiMjJkMAotLS0gYS9Ub29scy9nZGIvbGlicHl0aG9uLnB5CisrKyBiL1Rvb2xzL2dkYi9saWJweXRob24ucHkKQEAgLTM5LDMwICszOSwzOSBAQAogCiBUaGUgbW9kdWxlIGFsc28gZXh0ZW5kcyBnZGIgd2l0aCBzb21lIHB5dGhvbi1zcGVjaWZpYyBjb21tYW5kcy4KICcnJwotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAorCisjIE5PVEU6IHNvbWUgZ2RicyBhcmUgbGlua2VkIHdpdGggUHl0aG9uIDMsIHNvIHRoaXMgZmlsZSBzaG91bGQgYmUgZHVhbC1zeW50YXgKKyMgY29tcGF0aWJsZSAoMi42KyBhbmQgMy4wKykuICBTZWUgIzE5MzA4LgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uLCB3aXRoX3N0YXRlbWVudAogaW1wb3J0IGdkYgoraW1wb3J0IG9zCiBpbXBvcnQgc3lzCiAKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gMzoKKyAgICB1bmljaHIgPSBjaHIKKyAgICB4cmFuZ2UgPSByYW5nZQorICAgIGxvbmcgPSBpbnQKKwogIyBMb29rIHVwIHRoZSBnZGIuVHlwZSBmb3Igc29tZSBzdGFuZGFyZCB0eXBlczoKIF90eXBlX2NoYXJfcHRyID0gZ2RiLmxvb2t1cF90eXBlKCdjaGFyJykucG9pbnRlcigpICMgY2hhcioKIF90eXBlX3Vuc2lnbmVkX2NoYXJfcHRyID0gZ2RiLmxvb2t1cF90eXBlKCd1bnNpZ25lZCBjaGFyJykucG9pbnRlcigpICMgdW5zaWduZWQgY2hhcioKIF90eXBlX3ZvaWRfcHRyID0gZ2RiLmxvb2t1cF90eXBlKCd2b2lkJykucG9pbnRlcigpICMgdm9pZCoKLV90eXBlX3NpemVfdCA9IGdkYi5sb29rdXBfdHlwZSgnc2l6ZV90JykKIAogU0laRU9GX1ZPSURfUCA9IF90eXBlX3ZvaWRfcHRyLnNpemVvZgogCiAKLVB5X1RQRkxBR1NfSEVBUFRZUEUgPSAoMUwgPDwgOSkKK1B5X1RQRkxBR1NfSEVBUFRZUEUgPSAoMSA8PCA5KQogCi1QeV9UUEZMQUdTX0lOVF9TVUJDTEFTUyAgICAgID0gKDFMIDw8IDIzKQotUHlfVFBGTEFHU19MT05HX1NVQkNMQVNTICAgICA9ICgxTCA8PCAyNCkKLVB5X1RQRkxBR1NfTElTVF9TVUJDTEFTUyAgICAgPSAoMUwgPDwgMjUpCi1QeV9UUEZMQUdTX1RVUExFX1NVQkNMQVNTICAgID0gKDFMIDw8IDI2KQotUHlfVFBGTEFHU19TVFJJTkdfU1VCQ0xBU1MgICA9ICgxTCA8PCAyNykKLVB5X1RQRkxBR1NfVU5JQ09ERV9TVUJDTEFTUyAgPSAoMUwgPDwgMjgpCi1QeV9UUEZMQUdTX0RJQ1RfU1VCQ0xBU1MgICAgID0gKDFMIDw8IDI5KQotUHlfVFBGTEFHU19CQVNFX0VYQ19TVUJDTEFTUyA9ICgxTCA8PCAzMCkKLVB5X1RQRkxBR1NfVFlQRV9TVUJDTEFTUyAgICAgPSAoMUwgPDwgMzEpCitQeV9UUEZMQUdTX0lOVF9TVUJDTEFTUyAgICAgID0gKDEgPDwgMjMpCitQeV9UUEZMQUdTX0xPTkdfU1VCQ0xBU1MgICAgID0gKDEgPDwgMjQpCitQeV9UUEZMQUdTX0xJU1RfU1VCQ0xBU1MgICAgID0gKDEgPDwgMjUpCitQeV9UUEZMQUdTX1RVUExFX1NVQkNMQVNTICAgID0gKDEgPDwgMjYpCitQeV9UUEZMQUdTX1NUUklOR19TVUJDTEFTUyAgID0gKDEgPDwgMjcpCitQeV9UUEZMQUdTX1VOSUNPREVfU1VCQ0xBU1MgID0gKDEgPDwgMjgpCitQeV9UUEZMQUdTX0RJQ1RfU1VCQ0xBU1MgICAgID0gKDEgPDwgMjkpCitQeV9UUEZMQUdTX0JBU0VfRVhDX1NVQkNMQVNTID0gKDEgPDwgMzApCitQeV9UUEZMQUdTX1RZUEVfU1VCQ0xBU1MgICAgID0gKDEgPDwgMzEpCiAKIAogTUFYX09VVFBVVF9MRU49MTAyNApAQCAtODEsNyArOTAsNyBAQAogZGVmIHNhZmVfcmFuZ2UodmFsKToKICAgICAjIEFzIHBlciByYW5nZSwgYnV0IGRvbid0IHRydXN0IHRoZSB2YWx1ZSB0b28gbXVjaDogY2FwIGl0IHRvIGEgc2FmZXR5CiAgICAgIyB0aHJlc2hvbGQgaW4gY2FzZSB0aGUgZGF0YSB3YXMgY29ycnVwdGVkCi0gICAgcmV0dXJuIHhyYW5nZShzYWZldHlfbGltaXQodmFsKSkKKyAgICByZXR1cm4geHJhbmdlKHNhZmV0eV9saW1pdChpbnQodmFsKSkpCiAKIAogY2xhc3MgU3RyaW5nVHJ1bmNhdGVkKFJ1bnRpbWVFcnJvcik6CkBAIC0yOTMsOCArMzAyLDggQEAKICAgICAgICAgICAgICMgY2xhc3MKICAgICAgICAgICAgIHJldHVybiBjbHMKIAotICAgICAgICAjcHJpbnQgJ3RwX2ZsYWdzID0gMHglMDh4JyAlIHRwX2ZsYWdzCi0gICAgICAgICNwcmludCAndHBfbmFtZSA9ICVyJyAlIHRwX25hbWUKKyAgICAgICAgI3ByaW50KCd0cF9mbGFncyA9IDB4JTA4eCcgJSB0cF9mbGFncykKKyAgICAgICAgI3ByaW50KCd0cF9uYW1lID0gJXInICUgdHBfbmFtZSkKIAogICAgICAgICBuYW1lX21hcCA9IHsnYm9vbCc6IFB5Qm9vbE9iamVjdFB0ciwKICAgICAgICAgICAgICAgICAgICAgJ2NsYXNzb2JqJzogUHlDbGFzc09iamVjdFB0ciwKQEAgLTQxMCwxMSArNDE5LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkcmVzcykKIAogZGVmIF9QeU9iamVjdF9WQVJfU0laRSh0eXBlb2JqLCBuaXRlbXMpOgorICAgIGlmIF9QeU9iamVjdF9WQVJfU0laRS5fdHlwZV9zaXplX3QgaXMgTm9uZToKKyAgICAgICAgX1B5T2JqZWN0X1ZBUl9TSVpFLl90eXBlX3NpemVfdCA9IGdkYi5sb29rdXBfdHlwZSgnc2l6ZV90JykKKwogICAgIHJldHVybiAoICggdHlwZW9iai5maWVsZCgndHBfYmFzaWNzaXplJykgKwogICAgICAgICAgICAgICAgbml0ZW1zICogdHlwZW9iai5maWVsZCgndHBfaXRlbXNpemUnKSArCiAgICAgICAgICAgICAgICAoU0laRU9GX1ZPSURfUCAtIDEpCiAgICAgICAgICAgICAgKSAmIH4oU0laRU9GX1ZPSURfUCAtIDEpCi0gICAgICAgICAgICkuY2FzdChfdHlwZV9zaXplX3QpCisgICAgICAgICAgICkuY2FzdChfUHlPYmplY3RfVkFSX1NJWkUuX3R5cGVfc2l6ZV90KQorX1B5T2JqZWN0X1ZBUl9TSVpFLl90eXBlX3NpemVfdCA9IE5vbmUKIAogY2xhc3MgSGVhcFR5cGVPYmplY3RQdHIoUHlPYmplY3RQdHIpOgogICAgIF90eXBlbmFtZSA9ICdQeU9iamVjdCcKQEAgLTYxNCw3ICs2MjcsNyBAQAogICAgIGRlZiBpdGVyaXRlbXMoc2VsZik6CiAgICAgICAgICcnJwogICAgICAgICBZaWVsZHMgYSBzZXF1ZW5jZSBvZiAoUHlPYmplY3RQdHIga2V5LCBQeU9iamVjdFB0ciB2YWx1ZSkgcGFpcnMsCi0gICAgICAgIGFuYWxhZ291cyB0byBkaWN0Lml0ZXJpdGVtcygpCisgICAgICAgIGFuYWxvZ291cyB0byBkaWN0Lml0ZXJpdGVtcygpCiAgICAgICAgICcnJwogICAgICAgICBmb3IgaSBpbiBzYWZlX3JhbmdlKHNlbGYuZmllbGQoJ21hX21hc2snKSArIDEpOgogICAgICAgICAgICAgZXAgPSBzZWxmLmZpZWxkKCdtYV90YWJsZScpICsgaQpAQCAtNzU1LDE0ICs3NjgsMTQgQEAKICAgICAgICAgJycnCiAgICAgICAgIG9iX3NpemUgPSBsb25nKHNlbGYuZmllbGQoJ29iX3NpemUnKSkKICAgICAgICAgaWYgb2Jfc2l6ZSA9PSAwOgotICAgICAgICAgICAgcmV0dXJuIDBMCisgICAgICAgICAgICByZXR1cm4gMAogCiAgICAgICAgIG9iX2RpZ2l0ID0gc2VsZi5maWVsZCgnb2JfZGlnaXQnKQogCiAgICAgICAgIGlmIGdkYi5sb29rdXBfdHlwZSgnZGlnaXQnKS5zaXplb2YgPT0gMjoKLSAgICAgICAgICAgIFNISUZUID0gMTVMCisgICAgICAgICAgICBTSElGVCA9IDE1CiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBTSElGVCA9IDMwTAorICAgICAgICAgICAgU0hJRlQgPSAzMAogCiAgICAgICAgIGRpZ2l0cyA9IFtsb25nKG9iX2RpZ2l0W2ldKSAqIDIqKihTSElGVCppKQogICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gc2FmZV9yYW5nZShhYnMob2Jfc2l6ZSkpXQpAQCAtNzcxLDYgKzc4NCwxMiBAQAogICAgICAgICAgICAgcmVzdWx0ID0gLXJlc3VsdAogICAgICAgICByZXR1cm4gcmVzdWx0CiAKKyAgICBkZWYgd3JpdGVfcmVwcihzZWxmLCBvdXQsIHZpc2l0ZWQpOgorICAgICAgICAjIFRoaXMgZW5zdXJlcyB0aGUgdHJhaWxpbmcgJ0wnIGlzIHByaW50ZWQgd2hlbiBnZGIgaXMgbGlua2VkCisgICAgICAgICMgd2l0aCBhIFB5dGhvbiAzIGludGVycHJldGVyLgorICAgICAgICBvdXQud3JpdGUocmVwcihzZWxmLnByb3h5dmFsKHZpc2l0ZWQpKS5yc3RyaXAoJ0wnKSkKKyAgICAgICAgb3V0LndyaXRlKCdMJykKKwogCiBjbGFzcyBQeU5vbmVTdHJ1Y3RQdHIoUHlPYmplY3RQdHIpOgogICAgICIiIgpAQCAtNzg2LDcgKzgwNSw3IEBACiBjbGFzcyBQeUZyYW1lT2JqZWN0UHRyKFB5T2JqZWN0UHRyKToKICAgICBfdHlwZW5hbWUgPSAnUHlGcmFtZU9iamVjdCcKIAotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBnZGJ2YWwsIGNhc3RfdG8pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBnZGJ2YWwsIGNhc3RfdG89Tm9uZSk6CiAgICAgICAgIFB5T2JqZWN0UHRyLl9faW5pdF9fKHNlbGYsIGdkYnZhbCwgY2FzdF90bykKIAogICAgICAgICBpZiBub3Qgc2VsZi5pc19vcHRpbWl6ZWRfb3V0KCk6CkBAIC04MjAsNyArODM5LDcgQEAKICAgICAgICAgdGhlIGdsb2JhbCB2YXJpYWJsZXMgb2YgdGhpcyBmcmFtZQogICAgICAgICAnJycKICAgICAgICAgaWYgc2VsZi5pc19vcHRpbWl6ZWRfb3V0KCk6Ci0gICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHJldHVybiAoKQogCiAgICAgICAgIHB5b3BfZ2xvYmFscyA9IHNlbGYucHlvcF9maWVsZCgnZl9nbG9iYWxzJykKICAgICAgICAgcmV0dXJuIHB5b3BfZ2xvYmFscy5pdGVyaXRlbXMoKQpAQCAtODMxLDcgKzg1MCw3IEBACiAgICAgICAgIHRoZSBidWlsdGluIHZhcmlhYmxlcwogICAgICAgICAnJycKICAgICAgICAgaWYgc2VsZi5pc19vcHRpbWl6ZWRfb3V0KCk6Ci0gICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHJldHVybiAoKQogCiAgICAgICAgIHB5b3BfYnVpbHRpbnMgPSBzZWxmLnB5b3BfZmllbGQoJ2ZfYnVpbHRpbnMnKQogICAgICAgICByZXR1cm4gcHlvcF9idWlsdGlucy5pdGVyaXRlbXMoKQpAQCAtOTY2LDExICs5ODUsMTkgQEAKICAgICAgICAgZmllbGRfb2Jfc2l6ZSA9IHNlbGYuZmllbGQoJ29iX3NpemUnKQogICAgICAgICBmaWVsZF9vYl9zdmFsID0gc2VsZi5maWVsZCgnb2Jfc3ZhbCcpCiAgICAgICAgIGNoYXJfcHRyID0gZmllbGRfb2Jfc3ZhbC5hZGRyZXNzLmNhc3QoX3R5cGVfdW5zaWduZWRfY2hhcl9wdHIpCisgICAgICAgICMgV2hlbiBnZGIgaXMgbGlua2VkIHdpdGggYSBQeXRob24gMyBpbnRlcnByZXRlciwgdGhpcyBpcyByZWFsbHkKKyAgICAgICAgIyBhIGxhdGluLTEgbW9qaWJha2UgZGVjb2Rpbmcgb2YgdGhlIG9yaWdpbmFsIHN0cmluZy4uLgogICAgICAgICByZXR1cm4gJycuam9pbihbY2hyKGNoYXJfcHRyW2ldKSBmb3IgaSBpbiBzYWZlX3JhbmdlKGZpZWxkX29iX3NpemUpXSkKIAogICAgIGRlZiBwcm94eXZhbChzZWxmLCB2aXNpdGVkKToKICAgICAgICAgcmV0dXJuIHN0cihzZWxmKQogCisgICAgZGVmIHdyaXRlX3JlcHIoc2VsZiwgb3V0LCB2aXNpdGVkKToKKyAgICAgICAgdmFsID0gcmVwcihzZWxmLnByb3h5dmFsKHZpc2l0ZWQpKQorICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID49IDM6CisgICAgICAgICAgICB2YWwgPSB2YWwuZW5jb2RlKCdhc2NpaScsICdiYWNrc2xhc2hyZXBsYWNlJykuZGVjb2RlKCdhc2NpaScpCisgICAgICAgIG91dC53cml0ZSh2YWwpCisKIGNsYXNzIFB5VHVwbGVPYmplY3RQdHIoUHlPYmplY3RQdHIpOgogICAgIF90eXBlbmFtZSA9ICdQeVR1cGxlT2JqZWN0JwogCkBAIC0xMDY5LDYgKzEwOTYsMTUgQEAKICAgICAgICAgcmVzdWx0ID0gdScnLmpvaW4oW191bmljaHIodWNzKSBmb3IgdWNzIGluIFB5X1VOSUNPREVzXSkKICAgICAgICAgcmV0dXJuIHJlc3VsdAogCisgICAgZGVmIHdyaXRlX3JlcHIoc2VsZiwgb3V0LCB2aXNpdGVkKToKKyAgICAgICAgdmFsID0gcmVwcihzZWxmLnByb3h5dmFsKHZpc2l0ZWQpKQorICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID49IDM6CisgICAgICAgICAgICB2YWwgPSB2YWwuZW5jb2RlKCdhc2NpaScsICdiYWNrc2xhc2hyZXBsYWNlJykuZGVjb2RlKCdhc2NpaScpCisgICAgICAgICMgVGhpcyBlbnN1cmVzIHRoZSAndScgcHJlZml4IGlzIHByaW50ZWQgd2hlbiBnZGIgaXMgbGlua2VkCisgICAgICAgICMgd2l0aCBhIFB5dGhvbiAzIGludGVycHJldGVyLgorICAgICAgICBvdXQud3JpdGUoJ3UnKQorICAgICAgICBvdXQud3JpdGUodmFsLmxzdHJpcCgndScpKQorCiAKIGRlZiBpbnRfZnJvbV9pbnQoZ2RidmFsKToKICAgICByZXR1cm4gaW50KHN0cihnZGJ2YWwpKQpAQCAtMTIwNSw3ICsxMjQxLDIwIEBACiAgICAgZGVmIGdldF9weW9wKHNlbGYpOgogICAgICAgICB0cnk6CiAgICAgICAgICAgICBmID0gc2VsZi5fZ2RiZnJhbWUucmVhZF92YXIoJ2YnKQotICAgICAgICAgICAgcmV0dXJuIFB5RnJhbWVPYmplY3RQdHIuZnJvbV9weW9iamVjdF9wdHIoZikKKyAgICAgICAgICAgIGZyYW1lID0gUHlGcmFtZU9iamVjdFB0ci5mcm9tX3B5b2JqZWN0X3B0cihmKQorICAgICAgICAgICAgaWYgbm90IGZyYW1lLmlzX29wdGltaXplZF9vdXQoKToKKyAgICAgICAgICAgICAgICByZXR1cm4gZnJhbWUKKyAgICAgICAgICAgICMgZ2RiIGlzIHVuYWJsZSB0byBnZXQgdGhlICJmIiBhcmd1bWVudCBvZiBQeUV2YWxfRXZhbEZyYW1lRXgoKQorICAgICAgICAgICAgIyBiZWNhdXNlIGl0IHdhcyAib3B0aW1pemVkIG91dCIuIFRyeSB0byBnZXQgImYiIGZyb20gdGhlIGZyYW1lCisgICAgICAgICAgICAjIG9mIHRoZSBjYWxsZXIsIFB5RXZhbF9FdmFsQ29kZUV4KCkuCisgICAgICAgICAgICBvcmlnX2ZyYW1lID0gZnJhbWUKKyAgICAgICAgICAgIGNhbGxlciA9IHNlbGYuX2dkYmZyYW1lLm9sZGVyKCkKKyAgICAgICAgICAgIGlmIGNhbGxlcjoKKyAgICAgICAgICAgICAgICBmID0gY2FsbGVyLnJlYWRfdmFyKCdmJykKKyAgICAgICAgICAgICAgICBmcmFtZSA9IFB5RnJhbWVPYmplY3RQdHIuZnJvbV9weW9iamVjdF9wdHIoZikKKyAgICAgICAgICAgICAgICBpZiBub3QgZnJhbWUuaXNfb3B0aW1pemVkX291dCgpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJhbWUKKyAgICAgICAgICAgIHJldHVybiBvcmlnX2ZyYW1lCiAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgcmV0dXJuIE5vbmUKIApAQCAtMTIzNSw3ICsxMjg0LDkgQEAKICAgICAgICAgICAgIHB5b3AgPSBzZWxmLmdldF9weW9wKCkKICAgICAgICAgICAgIGlmIHB5b3A6CiAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgnIyVpICVzXG4nICUgKHNlbGYuZ2V0X2luZGV4KCksIHB5b3AuZ2V0X3RydW5jYXRlZF9yZXByKE1BWF9PVVRQVVRfTEVOKSkpCi0gICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZShweW9wLmN1cnJlbnRfbGluZSgpKQorICAgICAgICAgICAgICAgIGlmIG5vdCBweW9wLmlzX29wdGltaXplZF9vdXQoKToKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHB5b3AuY3VycmVudF9saW5lKCkKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgnICAgICVzXG4nICUgbGluZS5zdHJpcCgpKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCcjJWkgKHVuYWJsZSB0byByZWFkIHB5dGhvbiBmcmFtZSBpbmZvcm1hdGlvbilcbicgJSBzZWxmLmdldF9pbmRleCgpKQogICAgICAgICBlbHNlOgpAQCAtMTI3NywxMiArMTMyOCwxMiBAQAogCiAgICAgICAgIGZyYW1lID0gRnJhbWUuZ2V0X3NlbGVjdGVkX3B5dGhvbl9mcmFtZSgpCiAgICAgICAgIGlmIG5vdCBmcmFtZToKLSAgICAgICAgICAgIHByaW50ICdVbmFibGUgdG8gbG9jYXRlIHB5dGhvbiBmcmFtZScKKyAgICAgICAgICAgIHByaW50KCdVbmFibGUgdG8gbG9jYXRlIHB5dGhvbiBmcmFtZScpCiAgICAgICAgICAgICByZXR1cm4KIAogICAgICAgICBweW9wID0gZnJhbWUuZ2V0X3B5b3AoKQotICAgICAgICBpZiBub3QgcHlvcDoKLSAgICAgICAgICAgIHByaW50ICdVbmFibGUgdG8gcmVhZCBpbmZvcm1hdGlvbiBvbiBweXRob24gZnJhbWUnCisgICAgICAgIGlmIG5vdCBweW9wIG9yIHB5b3AuaXNfb3B0aW1pemVkX291dCgpOgorICAgICAgICAgICAgcHJpbnQoJ1VuYWJsZSB0byByZWFkIGluZm9ybWF0aW9uIG9uIHB5dGhvbiBmcmFtZScpCiAgICAgICAgICAgICByZXR1cm4KIAogICAgICAgICBmaWxlbmFtZSA9IHB5b3AuZmlsZW5hbWUoKQpAQCAtMTMzMiw5ICsxMzgzLDkgQEAKICAgICAgICAgZnJhbWUgPSBpdGVyX2ZyYW1lCiAKICAgICBpZiBtb3ZlX3VwOgotICAgICAgICBwcmludCAnVW5hYmxlIHRvIGZpbmQgYW4gb2xkZXIgcHl0aG9uIGZyYW1lJworICAgICAgICBwcmludCgnVW5hYmxlIHRvIGZpbmQgYW4gb2xkZXIgcHl0aG9uIGZyYW1lJykKICAgICBlbHNlOgotICAgICAgICBwcmludCAnVW5hYmxlIHRvIGZpbmQgYSBuZXdlciBweXRob24gZnJhbWUnCisgICAgICAgIHByaW50KCdVbmFibGUgdG8gZmluZCBhIG5ld2VyIHB5dGhvbiBmcmFtZScpCiAKIGNsYXNzIFB5VXAoZ2RiLkNvbW1hbmQpOgogICAgICdTZWxlY3QgYW5kIHByaW50IHRoZSBweXRob24gc3RhY2sgZnJhbWUgdGhhdCBjYWxsZWQgdGhpcyBvbmUgKGlmIGFueSknCkBAIC0xMzk3LDIzICsxNDQ4LDIzIEBACiAKICAgICAgICAgZnJhbWUgPSBGcmFtZS5nZXRfc2VsZWN0ZWRfcHl0aG9uX2ZyYW1lKCkKICAgICAgICAgaWYgbm90IGZyYW1lOgotICAgICAgICAgICAgcHJpbnQgJ1VuYWJsZSB0byBsb2NhdGUgcHl0aG9uIGZyYW1lJworICAgICAgICAgICAgcHJpbnQoJ1VuYWJsZSB0byBsb2NhdGUgcHl0aG9uIGZyYW1lJykKICAgICAgICAgICAgIHJldHVybgogCiAgICAgICAgIHB5b3BfZnJhbWUgPSBmcmFtZS5nZXRfcHlvcCgpCiAgICAgICAgIGlmIG5vdCBweW9wX2ZyYW1lOgotICAgICAgICAgICAgcHJpbnQgJ1VuYWJsZSB0byByZWFkIGluZm9ybWF0aW9uIG9uIHB5dGhvbiBmcmFtZScKKyAgICAgICAgICAgIHByaW50KCdVbmFibGUgdG8gcmVhZCBpbmZvcm1hdGlvbiBvbiBweXRob24gZnJhbWUnKQogICAgICAgICAgICAgcmV0dXJuCiAKICAgICAgICAgcHlvcF92YXIsIHNjb3BlID0gcHlvcF9mcmFtZS5nZXRfdmFyX2J5X25hbWUobmFtZSkKIAogICAgICAgICBpZiBweW9wX3ZhcjoKLSAgICAgICAgICAgIHByaW50ICgnJXMgJXIgPSAlcycKKyAgICAgICAgICAgIHByaW50KCclcyAlciA9ICVzJwogICAgICAgICAgICAgICAgICAgICUgKHNjb3BlLAogICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgcHlvcF92YXIuZ2V0X3RydW5jYXRlZF9yZXByKE1BWF9PVVRQVVRfTEVOKSkpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcmludCAnJXIgbm90IGZvdW5kJyAlIG5hbWUKKyAgICAgICAgICAgIHByaW50KCclciBub3QgZm91bmQnICUgbmFtZSkKIAogUHlQcmludCgpCiAKQEAgLTE0MzEsMTYgKzE0ODIsMTYgQEAKIAogICAgICAgICBmcmFtZSA9IEZyYW1lLmdldF9zZWxlY3RlZF9weXRob25fZnJhbWUoKQogICAgICAgICBpZiBub3QgZnJhbWU6Ci0gICAgICAgICAgICBwcmludCAnVW5hYmxlIHRvIGxvY2F0ZSBweXRob24gZnJhbWUnCisgICAgICAgICAgICBwcmludCgnVW5hYmxlIHRvIGxvY2F0ZSBweXRob24gZnJhbWUnKQogICAgICAgICAgICAgcmV0dXJuCiAKICAgICAgICAgcHlvcF9mcmFtZSA9IGZyYW1lLmdldF9weW9wKCkKICAgICAgICAgaWYgbm90IHB5b3BfZnJhbWU6Ci0gICAgICAgICAgICBwcmludCAnVW5hYmxlIHRvIHJlYWQgaW5mb3JtYXRpb24gb24gcHl0aG9uIGZyYW1lJworICAgICAgICAgICAgcHJpbnQoJ1VuYWJsZSB0byByZWFkIGluZm9ybWF0aW9uIG9uIHB5dGhvbiBmcmFtZScpCiAgICAgICAgICAgICByZXR1cm4KIAogICAgICAgICBmb3IgcHlvcF9uYW1lLCBweW9wX3ZhbHVlIGluIHB5b3BfZnJhbWUuaXRlcl9sb2NhbHMoKToKLSAgICAgICAgICAgIHByaW50ICgnJXMgPSAlcycKKyAgICAgICAgICAgIHByaW50KCclcyA9ICVzJwogICAgICAgICAgICAgICAgICAgICUgKHB5b3BfbmFtZS5wcm94eXZhbChzZXQoKSksCiAgICAgICAgICAgICAgICAgICAgICAgcHlvcF92YWx1ZS5nZXRfdHJ1bmNhdGVkX3JlcHIoTUFYX09VVFBVVF9MRU4pKSkKIApkaWZmIC0tZ2l0IGEvVG9vbHMvaTE4bi9tYWtlbG9jYWxlYWxpYXMucHkgYi9Ub29scy9pMThuL21ha2Vsb2NhbGVhbGlhcy5weQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDViMzYzMWUuLmQ3NTg5MmIKLS0tIGEvVG9vbHMvaTE4bi9tYWtlbG9jYWxlYWxpYXMucHkKKysrIGIvVG9vbHMvaTE4bi9tYWtlbG9jYWxlYWxpYXMucHkKQEAgLTIzLDYgKzIzLDEyIEBACiAgICAgICAgIGlmIGxpbmVbOjFdID09ICcjJzoKICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgIGxvY2FsZSwgYWxpYXMgPSBsaW5lLnNwbGl0KCkKKyAgICAgICAgIyBGaXggbm9uLXN0YW5kYXJkIGxvY2FsZSBuYW1lcywgZS5nLiBrc19JTkBkZXZhbmFnYXJpLlVURi04CisgICAgICAgIGlmICdAJyBpbiBhbGlhczoKKyAgICAgICAgICAgIGFsaWFzX2xhbmcsIF8sIGFsaWFzX21vZCA9IGFsaWFzLnBhcnRpdGlvbignQCcpCisgICAgICAgICAgICBpZiAnLicgaW4gYWxpYXNfbW9kOgorICAgICAgICAgICAgICAgIGFsaWFzX21vZCwgXywgYWxpYXNfZW5jID0gYWxpYXNfbW9kLnBhcnRpdGlvbignLicpCisgICAgICAgICAgICAgICAgYWxpYXMgPSBhbGlhc19sYW5nICsgJy4nICsgYWxpYXNfZW5jICsgJ0AnICsgYWxpYXNfbW9kCiAgICAgICAgICMgU3RyaXAgJzonCiAgICAgICAgIGlmIGxvY2FsZVstMV0gPT0gJzonOgogICAgICAgICAgICAgbG9jYWxlID0gbG9jYWxlWzotMV0KZGlmZiAtLWdpdCBhL1Rvb2xzL2kxOG4vbXNnZm10LnB5IGIvVG9vbHMvaTE4bi9tc2dmbXQucHkKaW5kZXggNWRkNTQzMC4uMjUwMmExMCAxMDA3NTUKLS0tIGEvVG9vbHMvaTE4bi9tc2dmbXQucHkKKysrIGIvVG9vbHMvaTE4bi9tc2dmbXQucHkKQEAgLTI1LDggKzI1LDkgQEAKICAgICAgICAgRGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0LgogIiIiCiAKLWltcG9ydCBzeXMKIGltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IGFzdAogaW1wb3J0IGdldG9wdAogaW1wb3J0IHN0cnVjdAogaW1wb3J0IGFycmF5CkBAIC0xNDMsNyArMTQ0LDcgQEAKICAgICAgICAgIyBUaGlzIGlzIGEgbWVzc2FnZSB3aXRoIHBsdXJhbCBmb3JtcwogICAgICAgICBlbGlmIGwuc3RhcnRzd2l0aCgnbXNnaWRfcGx1cmFsJyk6CiAgICAgICAgICAgICBpZiBzZWN0aW9uICE9IElEOgotICAgICAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICdtc2dpZF9wbHVyYWwgbm90IHByZWNlZWRlZCBieSBtc2dpZCBvbiAlczolZCcgJVwKKyAgICAgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAnbXNnaWRfcGx1cmFsIG5vdCBwcmVjZWRlZCBieSBtc2dpZCBvbiAlczolZCcgJVwKICAgICAgICAgICAgICAgICAgICAgKGluZmlsZSwgbG5vKQogICAgICAgICAgICAgICAgIHN5cy5leGl0KDEpCiAgICAgICAgICAgICBsID0gbFsxMjpdCkBAIC0xNzAsOCArMTcxLDcgQEAKICAgICAgICAgbCA9IGwuc3RyaXAoKQogICAgICAgICBpZiBub3QgbDoKICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICMgWFhYOiBEb2VzIHRoaXMgYWx3YXlzIGZvbGxvdyBQeXRob24gZXNjYXBlIHNlbWFudGljcz8KLSAgICAgICAgbCA9IGV2YWwobCkKKyAgICAgICAgbCA9IGFzdC5saXRlcmFsX2V2YWwobCkKICAgICAgICAgaWYgc2VjdGlvbiA9PSBJRDoKICAgICAgICAgICAgIG1zZ2lkICs9IGwKICAgICAgICAgZWxpZiBzZWN0aW9uID09IFNUUjoKZGlmZiAtLWdpdCBhL1Rvb2xzL2kxOG4vcHlnZXR0ZXh0LnB5IGIvVG9vbHMvaTE4bi9weWdldHRleHQucHkKaW5kZXggYmIwZGQzNS4uYWYyNGI0NyAxMDA3NTUKLS0tIGEvVG9vbHMvaTE4bi9weWdldHRleHQucHkKKysrIGIvVG9vbHMvaTE4bi9weWdldHRleHQucHkKQEAgLTEsNiArMSw2IEBACiAjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCiAjIC0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCi0jIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBCYXJyeSBXYXJzYXcgPGJhcnJ5QHpvcGUuY29tPgorIyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQmFycnkgV2Fyc2F3IDxiYXJyeUBweXRob24ub3JnPgogIwogIyBNaW5pbWFsbHkgcGF0Y2hlZCB0byBtYWtlIGl0IGV2ZW4gbW9yZSB4Z2V0dGV4dCBjb21wYXRpYmxlCiAjIGJ5IFBldGVyIEZ1bmsgPHBmQGFydGNvbS1nbWJoLmRlPgpAQCAtMjA4LDYgKzIwOCw3IEBACiAKIGRlZiBtYWtlX2VzY2FwZXMocGFzc19pc284ODU5KToKICAgICBnbG9iYWwgZXNjYXBlcworICAgIGVzY2FwZXMgPSBbY2hyKGkpIGZvciBpIGluIHJhbmdlKDI1NildCiAgICAgaWYgcGFzc19pc284ODU5OgogICAgICAgICAjIEFsbG93IGlzby04ODU5IGNoYXJhY3RlcnMgdG8gcGFzcyB0aHJvdWdoIHNvIHRoYXQgZS5nLiAnbXNnaWQKICAgICAgICAgIyAiSPZoZSInIHdvdWxkIHJlc3VsdCBub3QgcmVzdWx0IGluICdtc2dpZCAiSFwzNjZoZSInLiAgT3RoZXJ3aXNlIHdlCkBAIC0yMTUsMTEgKzIxNiw5IEBACiAgICAgICAgIG1vZCA9IDEyOAogICAgIGVsc2U6CiAgICAgICAgIG1vZCA9IDI1NgotICAgIGZvciBpIGluIHJhbmdlKDI1Nik6Ci0gICAgICAgIGlmIDMyIDw9IChpICUgbW9kKSA8PSAxMjY6Ci0gICAgICAgICAgICBlc2NhcGVzLmFwcGVuZChjaHIoaSkpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBlc2NhcGVzLmFwcGVuZCgiXFwlMDNvIiAlIGkpCisgICAgZm9yIGkgaW4gcmFuZ2UobW9kKToKKyAgICAgICAgaWYgbm90KDMyIDw9IGkgPD0gMTI2KToKKyAgICAgICAgICAgIGVzY2FwZXNbaV0gPSAiXFwlMDNvIiAlIGkKICAgICBlc2NhcGVzW29yZCgnXFwnKV0gPSAnXFxcXCcKICAgICBlc2NhcGVzW29yZCgnXHQnKV0gPSAnXFx0JwogICAgIGVzY2FwZXNbb3JkKCdccicpXSA9ICdcXHInCkBAIC01OTMsNyArNTkyLDcgQEAKICAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCiAKICAgICAjIGNhbGN1bGF0ZSBlc2NhcGVzCi0gICAgbWFrZV9lc2NhcGVzKG9wdGlvbnMuZXNjYXBlKQorICAgIG1ha2VfZXNjYXBlcyhub3Qgb3B0aW9ucy5lc2NhcGUpCiAKICAgICAjIGNhbGN1bGF0ZSBhbGwga2V5d29yZHMKICAgICBvcHRpb25zLmtleXdvcmRzLmV4dGVuZChkZWZhdWx0X2tleXdvcmRzKQpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL21zaS5weSBiL1Rvb2xzL21zaS9tc2kucHkKaW5kZXggZjAxYWE3Zi4uZmI1N2E0MyAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL21zaS5weQorKysgYi9Ub29scy9tc2kvbXNpLnB5CkBAIC0xNzcsNiArMTc3LDggQEAKIGhhdmVfbWluZ3cgPSBidWlsZF9taW5nd19saWIobGliX2ZpbGUsIGRlZl9maWxlLCBkbGxfZmlsZSwgbWluZ3dfbGliKQogCiAjIERldGVybWluZSB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZQoraWYgb3Muc3lzdGVtKCJubWFrZSAvbm9sb2dvIC9jIC9mIG1zaXN1cHBvcnQubWFrIikgIT0gMDoKKyAgICByYWlzZSBSdW50aW1lRXJyb3IoIidubWFrZSAvZiBtc2lzdXBwb3J0Lm1haycgZmFpbGVkIikKIGRsbF9wYXRoID0gb3MucGF0aC5qb2luKHNyY2RpciwgUENCVUlMRCwgZGxsX2ZpbGUpCiBtc2lsaWIuc2V0X2FyY2hfZnJvbV9maWxlKGRsbF9wYXRoKQogaWYgbXNpbGliLnBlX3R5cGUoZGxsX3BhdGgpICE9IG1zaWxpYi5wZV90eXBlKCJtc2lzdXBwb3J0LmRsbCIpOgpAQCAtMzc0LDggKzM3Niw2IEBACiAgICAgIyBVcGRhdGVFZGl0SURMRSBzZXRzIHRoZSBSRUdJU1RSWS50Y2wgY29tcG9uZW50IGludG8KICAgICAjIHRoZSBpbnN0YWxsZWQvdW5pbnN0YWxsZWQgc3RhdGUgYWNjb3JkaW5nIHRvIGJvdGggdGhlCiAgICAgIyBFeHRlbnNpb25zIGFuZCBUY2xUayBmZWF0dXJlcy4KLSAgICBpZiBvcy5zeXN0ZW0oIm5tYWtlIC9ub2xvZ28gL2MgL2YgbXNpc3VwcG9ydC5tYWsiKSAhPSAwOgotICAgICAgICByYWlzZSAiJ25tYWtlIC9mIG1zaXN1cHBvcnQubWFrJyBmYWlsZWQiCiAgICAgYWRkX2RhdGEoZGIsICJCaW5hcnkiLCBbKCJTY3JpcHQiLCBtc2lsaWIuQmluYXJ5KCJtc2lzdXBwb3J0LmRsbCIpKV0pCiAgICAgIyBTZWUgIkN1c3RvbSBBY3Rpb24gVHlwZSAxIgogICAgIGlmIG1zaWxpYi5XaW42NDoKQEAgLTQ0NSw2ICs0NDUsMTAgQEAKICAgICAgICAgICAgICAgKCJTZXRETExEaXJUb1RhcmdldCIsICdETExESVI9IiInLCA3NTEpLAogICAgICAgICAgICAgIF0pCiAKKyAgICAjIFByZXBlbmQgVEFSR0VURElSIHRvIHRoZSBzeXN0ZW0gcGF0aCwgYW5kIHJlbW92ZSBpdCBvbiB1bmluc3RhbGwuCisgICAgYWRkX2RhdGEoZGIsICJFbnZpcm9ubWVudCIsCisgICAgICAgICAgICAgWygiUGF0aEFkZGl0aW9uIiwgIj0tKlBhdGgiLCAiW1RBUkdFVERJUl07W35dIiwgIlJFR0lTVFJZLnBhdGgiKV0pCisKICAgICAjIEV4ZWN1dGUgU2VxdWVuY2VzCiAgICAgYWRkX2RhdGEoZGIsICJJbnN0YWxsRXhlY3V0ZVNlcXVlbmNlIiwKICAgICAgICAgICAgIFsoIkluaXRpYWxUYXJnZXREaXIiLCAnVEFSR0VURElSPSIiJywgNzUwKSwKQEAgLTQ5NSw3ICs0OTksNyBAQAogCiAgICAgZXhpdF9kaWFsb2cgPSBQeURpYWxvZyhkYiwgIkV4aXREaWFsb2ciLCB4LCB5LCB3LCBoLCBtb2RhbCwgdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpbmlzaCIsICJGaW5pc2giLCAiRmluaXNoIikKLSAgICBleGl0X2RpYWxvZy50aXRsZSgiQ29tcGxldGluZyB0aGUgW1Byb2R1Y3ROYW1lXSBJbnN0YWxsZXIiKQorICAgIGV4aXRfZGlhbG9nLnRpdGxlKCJDb21wbGV0ZSB0aGUgW1Byb2R1Y3ROYW1lXSBJbnN0YWxsZXIiKQogICAgIGV4aXRfZGlhbG9nLmJhY2soIjwgQmFjayIsICJGaW5pc2giLCBhY3RpdmUgPSAwKQogICAgIGV4aXRfZGlhbG9nLmNhbmNlbCgiQ2FuY2VsIiwgIkJhY2siLCBhY3RpdmUgPSAwKQogICAgIGV4aXRfZGlhbG9nLnRleHQoIkFja25vd2xlZGdlbWVudHMiLCAxMzUsIDk1LCAyMjAsIDEyMCwgMHgzMDAwMywKQEAgLTY2OCwxMSArNjcyLDExIEBACiAgICAgYz1mZWF0dXJlcy54YnV0dG9uKCJBZHZhbmNlZCIsICJBZHZhbmNlZCIsIE5vbmUsIDAuMzApCiAgICAgYy5ldmVudCgiU3Bhd25EaWFsb2ciLCAiQWR2YW5jZWREbGciKQogCi0gICAgYz1mZWF0dXJlcy50ZXh0KCJJdGVtRGVzY3JpcHRpb24iLCAxNDAsIDE4MCwgMjEwLCAzMCwgMywKKyAgICBjPWZlYXR1cmVzLnRleHQoIkl0ZW1EZXNjcmlwdGlvbiIsIDE0MCwgMTgwLCAyMTAsIDQwLCAzLAogICAgICAgICAgICAgICAgICAgIk11bHRpbGluZSBkZXNjcmlwdGlvbiBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0uIikKICAgICBjLm1hcHBpbmcoIlNlbGVjdGlvbkRlc2NyaXB0aW9uIiwiVGV4dCIpCiAKLSAgICBjPWZlYXR1cmVzLnRleHQoIkl0ZW1TaXplIiwgMTQwLCAyMTAsIDIxMCwgNDUsIDMsCisgICAgYz1mZWF0dXJlcy50ZXh0KCJJdGVtU2l6ZSIsIDE0MCwgMjI1LCAyMTAsIDMzLCAzLAogICAgICAgICAgICAgICAgICAgICAiVGhlIHNpemUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtLiIpCiAgICAgYy5tYXBwaW5nKCJTZWxlY3Rpb25TaXplIiwgIlRleHQiKQogCkBAIC04MjYsNyArODMwLDcgQEAKICAgICAjIChpLmUuIGFkZGl0aW9uYWwgUHl0aG9uIGxpYnJhcmllcykgbmVlZCB0byBmb2xsb3cgdGhlIHBhcmVudCBmZWF0dXJlLgogICAgICMgRmVhdHVyZXMgdGhhdCBoYXZlIG5vIGFkdmVydGlzZW1lbnQgdHJpZ2dlciAoZS5nLiB0aGUgdGVzdCBzdWl0ZSkKICAgICAjIG11c3Qgbm90IHN1cHBvcnQgYWR2ZXJ0aXNlbWVudAotICAgIGdsb2JhbCBkZWZhdWx0X2ZlYXR1cmUsIHRjbHRrLCBodG1sZmlsZXMsIHRvb2xzLCB0ZXN0c3VpdGUsIGV4dF9mZWF0dXJlLCBwcml2YXRlX2NydAorICAgIGdsb2JhbCBkZWZhdWx0X2ZlYXR1cmUsIHRjbHRrLCBodG1sZmlsZXMsIHRvb2xzLCB0ZXN0c3VpdGUsIGV4dF9mZWF0dXJlLCBwcml2YXRlX2NydCwgcHJlcGVuZF9wYXRoCiAgICAgZGVmYXVsdF9mZWF0dXJlID0gRmVhdHVyZShkYiwgIkRlZmF1bHRGZWF0dXJlIiwgIlB5dGhvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHl0aG9uIEludGVycHJldGVyIGFuZCBMaWJyYXJpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgZGlyZWN0b3J5ID0gIlRBUkdFVERJUiIpCkBAIC04NTEsNiArODU1LDE1IEBACiAgICAgdGVzdHN1aXRlID0gRmVhdHVyZShkYiwgIlRlc3RzdWl0ZSIsICJUZXN0IHN1aXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJQeXRob24gdGVzdCBzdWl0ZSAoTGliL3Rlc3QvKSIsIDExLAogICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gZGVmYXVsdF9mZWF0dXJlLCBhdHRyaWJ1dGVzPTJ8OCkKKyAgICAjIHByZXBlbmRfcGF0aCBpcyBhbiBhZGRpdGlvbmFsIGZlYXR1cmUgd2hpY2ggaXMgdG8gYmUgb2ZmIGJ5IGRlZmF1bHQuCisgICAgIyBTaW5jZSB0aGUgZGVmYXVsdCBsZXZlbCBmb3IgdGhlIGFib3ZlIGZlYXR1cmVzIGlzIDEsIHRoaXMgbmVlZHMgdG8gYmUKKyAgICAjIGF0IGxlYXN0IGxldmVsIGhpZ2hlci4KKyAgICBwcmVwZW5kX3BhdGggPSBGZWF0dXJlKGRiLCAiUHJlcGVuZFBhdGgiLCAiQWRkIHB5dGhvbi5leGUgdG8gUGF0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJlcGVuZCBbVEFSR0VURElSXSB0byB0aGUgc3lzdGVtIFBhdGggdmFyaWFibGUuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGFsbG93cyB5b3UgdG8gdHlwZSAncHl0aG9uJyBpbnRvIGEgY29tbWFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvbXB0IHdpdGhvdXQgbmVlZGluZyB0aGUgZnVsbCBwYXRoLiIsIDEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gZGVmYXVsdF9mZWF0dXJlLCBhdHRyaWJ1dGVzPTJ8OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsPTIpCiAKIGRlZiBleHRyYWN0X21zdmNyOTAoKToKICAgICAjIEZpbmQgdGhlIHJlZGlzdHJpYnV0YWJsZSBmaWxlcwpAQCAtMTAyMiw4ICsxMDM1LDEyIEBACiAgICAgICAgICAgICBsaWIuYWRkX2ZpbGUoInppcGRpci56aXAiKQogICAgICAgICBpZiBkaXI9PSd0ZXN0cycgYW5kIHBhcmVudC5waHlzaWNhbD09J2Rpc3R1dGlscyc6CiAgICAgICAgICAgICBsaWIuYWRkX2ZpbGUoIlNldHVwLnNhbXBsZSIpCisgICAgICAgIGlmIGRpcj09J2F1ZGlvZGF0YSc6CisgICAgICAgICAgICBsaWIuZ2xvYigiKi4qIikKICAgICAgICAgaWYgZGlyPT0nZGVjaW1hbHRlc3RkYXRhJzoKICAgICAgICAgICAgIGxpYi5nbG9iKCIqLmRlY1Rlc3QiKQorICAgICAgICBpZiBkaXI9PSdpbWdoZHJkYXRhJzoKKyAgICAgICAgICAgIGxpYi5nbG9iKCIqLioiKQogICAgICAgICBpZiBkaXI9PSd4bWx0ZXN0ZGF0YSc6CiAgICAgICAgICAgICBsaWIuZ2xvYigiKi54bWwiKQogICAgICAgICAgICAgbGliLmFkZF9maWxlKCJ0ZXN0LnhtbC5vdXQiKQpAQCAtMTAzNCw2ICsxMDUxLDcgQEAKICAgICAgICAgICAgIGxpYi5hZGRfZmlsZSgiaWRsZS5iYXQiKQogICAgICAgICBpZiBkaXI9PSJJY29ucyI6CiAgICAgICAgICAgICBsaWIuZ2xvYigiKi5naWYiKQorICAgICAgICAgICAgbGliLmdsb2IoIiouaWNvIikKICAgICAgICAgICAgIGxpYi5hZGRfZmlsZSgiaWRsZS5pY25zIikKICAgICAgICAgaWYgZGlyPT0iY29tbWFuZCIgYW5kIHBhcmVudC5waHlzaWNhbD09ImRpc3R1dGlscyI6CiAgICAgICAgICAgICBsaWIuZ2xvYigid2luaW5zdCouZXhlIikKQEAgLTExNjgsNiArMTE4Niw4IEBACiAgICAgICAgICAgICAgICAiSW5zdGFsbFBhdGgiKSwKICAgICAgICAgICAgICAgKCJSRUdJU1RSWS5kb2MiLCBtc2lsaWIuZ2VuX3V1aWQoKSwgIlRBUkdFVERJUiIsIHJlZ2lzdHJ5X2NvbXBvbmVudCwgTm9uZSwKICAgICAgICAgICAgICAgICJEb2N1bWVudGF0aW9uIiksCisgICAgICAgICAgICAgICgiUkVHSVNUUlkucGF0aCIsIG1zaWxpYi5nZW5fdXVpZCgpLCAiVEFSR0VURElSIiwgcmVnaXN0cnlfY29tcG9uZW50LCBOb25lLAorICAgICAgICAgICAgICAgTm9uZSksCiAgICAgICAgICAgICAgICgiUkVHSVNUUlkuZGVmIiwgbXNpbGliLmdlbl91dWlkKCksICJUQVJHRVRESVIiLCByZWdpc3RyeV9jb21wb25lbnQsCiAgICAgICAgICAgICAgICBOb25lLCBOb25lKV0gKyB0Y2xkYXRhKQogICAgICMgU2VlICJGZWF0dXJlQ29tcG9uZW50cyBUYWJsZSIuCkBAIC0xMTg0LDYgKzEyMDQsNyBAQAogICAgIGFkZF9kYXRhKGRiLCAiRmVhdHVyZUNvbXBvbmVudHMiLAogICAgICAgICAgICAgIFsoZGVmYXVsdF9mZWF0dXJlLmlkLCAiUkVHSVNUUlkiKSwKICAgICAgICAgICAgICAgKGh0bWxmaWxlcy5pZCwgIlJFR0lTVFJZLmRvYyIpLAorICAgICAgICAgICAgICAocHJlcGVuZF9wYXRoLmlkLCAiUkVHSVNUUlkucGF0aCIpLAogICAgICAgICAgICAgICAoZXh0X2ZlYXR1cmUuaWQsICJSRUdJU1RSWS5kZWYiKV0gKwogICAgICAgICAgICAgICB0Y2xkYXRhCiAgICAgICAgICAgICAgICkKQEAgLTEzOTIsNyArMTQxMywxMCBAQAogIyBjZXJ0bmFtZSAoZnJvbSBjb25maWcucHkpIHNob3VsZCBiZSAoYSBzdWJzdHJpbmcgb2YpCiAjIHRoZSBjZXJ0aWZpY2F0ZSBzdWJqZWN0LCBlLmcuICJQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiIKIGlmIGNlcnRuYW1lOgotICAgIG9zLnN5c3RlbSgnc2lnbnRvb2wgc2lnbiAvbiAiJXMiIC90IGh0dHA6Ly90aW1lc3RhbXAudmVyaXNpZ24uY29tL3NjcmlwdHMvdGltZXN0YW1wLmRsbCAlcycgJSAoY2VydG5hbWUsIG1zaW5hbWUpKQorICAgIG9zLnN5c3RlbSgnc2lnbnRvb2wgc2lnbiAvbiAiJXMiICcKKyAgICAgICcvdCBodHRwOi8vdGltZXN0YW1wLnZlcmlzaWduLmNvbS9zY3JpcHRzL3RpbWVzdGFtcC5kbGwgJworICAgICAgJy9kICJQeXRob24gJXMiICcKKyAgICAgICclcycgJSAoY2VydG5hbWUsIGZ1bGxfY3VycmVudF92ZXJzaW9uLCBtc2luYW1lKSkKIAogaWYgcGRiemlwOgogICAgIGJ1aWxkX3BkYnppcCgpCmRpZmYgLS1naXQgYS9Ub29scy9tc2kvbXNpbGliLnB5IGIvVG9vbHMvbXNpL21zaWxpYi5weQppbmRleCA2ZjQ5YjRjLi43NjA0NzFjIDEwMDY0NAotLS0gYS9Ub29scy9tc2kvbXNpbGliLnB5CisrKyBiL1Rvb2xzL21zaS9tc2lsaWIucHkKQEAgLTMwNSw3ICszMDUsNyBAQAogICAgICAgICB0LmNyZWF0ZShkYikKICAgICAjIEZpbGwgdGhlIHZhbGlkYXRpb24gdGFibGUKICAgICBhZGRfZGF0YShkYiwgIl9WYWxpZGF0aW9uIiwgc2NoZW1hLl9WYWxpZGF0aW9uX3JlY29yZHMpCi0gICAgIyBJbml0aWFsaXplIHRoZSBzdW1tYXJ5IGluZm9ybWF0aW9uLCBhbGxvd2luZyBhdG1vc3QgMjAgcHJvcGVydGllcworICAgICMgSW5pdGlhbGl6ZSB0aGUgc3VtbWFyeSBpbmZvcm1hdGlvbiwgYWxsb3dpbmcgYXQgbW9zdCAyMCBwcm9wZXJ0aWVzCiAgICAgc2kgPSBkYi5HZXRTdW1tYXJ5SW5mb3JtYXRpb24oMjApCiAgICAgc2kuU2V0UHJvcGVydHkoUElEX1RJVExFLCAiSW5zdGFsbGF0aW9uIERhdGFiYXNlIikKICAgICBzaS5TZXRQcm9wZXJ0eShQSURfU1VCSkVDVCwgUHJvZHVjdE5hbWUpCkBAIC01MTYsNyArNTE2LDcgQEAKIAogICAgIGRlZiBhZGRfZmlsZShzZWxmLCBmaWxlLCBzcmM9Tm9uZSwgdmVyc2lvbj1Ob25lLCBsYW5ndWFnZT1Ob25lKToKICAgICAgICAgIiIiQWRkIGEgZmlsZSB0byB0aGUgY3VycmVudCBjb21wb25lbnQgb2YgdGhlIGRpcmVjdG9yeSwgc3RhcnRpbmcgYSBuZXcgb25lCi0gICAgICAgIG9uZSBpZiB0aGVyZSBpcyBubyBjdXJyZW50IGNvbXBvbmVudC4gQnkgZGVmYXVsdCwgdGhlIGZpbGUgbmFtZSBpbiB0aGUgc291cmNlCisgICAgICAgIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgY29tcG9uZW50LiBCeSBkZWZhdWx0LCB0aGUgZmlsZSBuYW1lIGluIHRoZSBzb3VyY2UKICAgICAgICAgYW5kIHRoZSBmaWxlIHRhYmxlIHdpbGwgYmUgaWRlbnRpY2FsLiBJZiB0aGUgc3JjIGZpbGUgaXMgc3BlY2lmaWVkLCBpdCBpcwogICAgICAgICBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkuIE9wdGlvbmFsbHksIGEgdmVyc2lvbiBhbmQgYQogICAgICAgICBsYW5ndWFnZSBjYW4gYmUgc3BlY2lmaWVkIGZvciB0aGUgZW50cnkgaW4gdGhlIEZpbGUgdGFibGUuIiIiCmRpZmYgLS1naXQgYS9Ub29scy9tc2kvdXVpZHMucHkgYi9Ub29scy9tc2kvdXVpZHMucHkKaW5kZXggNjgxZGUxMi4uMmU0ZGMzMSAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL3V1aWRzLnB5CisrKyBiL1Rvb2xzL21zaS91dWlkcy5weQpAQCAtNTUsNCArNTUsMTUgQEAKICAgICAnMi43LjExNTAnOid7MzI5Mzk4MjctZDhlNS00NzBhLWIxMjYtODcwZGIzYzY5ZmRmfScsICMgMi43LjEKICAgICAnMi43LjIxMjEnOid7QjJFMUYwNkUtRjcxOS00Nzg2LTk3MkEtNDg4QTMzNkVCMkEwfScsICMgMi43LjJyYzEKICAgICAnMi43LjIxNTAnOid7MkUyOTVCNUItMUFENC00ZDM2LTk3QzItQTMxNjA4NDcyMkNGfScsICMgMi43LjIKKyAgICAnMi43LjMxMjEnOid7MUFDQjg4QkYtMTQyNS00ZjExLUI2NjQtNkM4OUEzRDc2OTlDfScsICMgMi43LjNyYzEKKyAgICAnMi43LjMxMjInOid7QjEyMzExQkUtNjM2NC00YjJhLUE0OUEtNTUxRUVFMTBGM0U0fScsICMgMi43LjNyYzIKKyAgICAnMi43LjMxNTAnOid7QzBDMzFCQ0MtNTZGQi00MmE3LTg3NjYtRDI5RTFCRDc0QzdDfScsICMgMi43LjMKKyAgICAnMi43LjQxMjEnOid7NDdGNDVGNDUtNzJENy00ZTU0LUFGNDEtMjY3NjdFREU5NUNGfScsICMgMi43LjRyYzEKKyAgICAnMi43LjQxNTAnOid7ODRBREM5NkMtQjdFMC00OTM4LTlENkUtMkI2NDBENURBMjI0fScsICMgMi43LjQKKyAgICAnMi43LjUxNTAnOid7REJERDU3MEUtMDk1Mi00NzVmLTk0NTMtQUI4OEYzREQ1NjU5fScsICMgMi43LjUKKyAgICAnMi43LjYxMjEnOid7RDFFQkMwN0YtQTdCMS00MTYzLTgzREItQUU4MTNDRUYzOTJGfScsICMgMi43LjZyYzEKKyAgICAnMi43LjYxNTAnOid7QzNDQzRERjUtMzlBNS00MDI3LUIxMzYtMkIzRTFGNUFCNkUyfScsICMgMi43LjYKKyAgICAnMi43LjcxMjEnOid7NUUwRDE4N0QtMjM4Qi00ZTk2LTlDNzUtQzRDRjE0MUY1Mzg1fScsICMgMi43LjdyYzEKKyAgICAnMi43LjcxNTAnOid7MDQ5Q0E0MzMtNzdBMC00ZTQ4LUFDNzYtMTgwQTI4MkM0RTEwfScsICMgMi43LjcKKyAgICAnMi43LjgxNTAnOid7NjExMjFCMTItODhCRC00MjYxLUE2RUUtQUIzMjYxMEE1NkREfScsICMgMi43LjgKIH0KZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvQ29tbWFuZExpbmUucHkgYi9Ub29scy9weWJlbmNoL0NvbW1hbmRMaW5lLnB5CmluZGV4IDY2MDFiZTUuLmZkZTMxNzggMTAwNjQ0Ci0tLSBhL1Rvb2xzL3B5YmVuY2gvQ29tbWFuZExpbmUucHkKKysrIGIvVG9vbHMvcHliZW5jaC9Db21tYW5kTGluZS5weQpAQCAtNDU4LDcgKzQ1OCw3IEBACiAgICAgICAgICAgICAgICAgaGFuZGxlciA9IGdldGF0dHIoc2VsZiwgaGFuZGxlcm5hbWUpCiAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICAgICAgaWYgdmFsdWUgPT0gJyc6Ci0gICAgICAgICAgICAgICAgICAgICMgY291bnQgdGhlIG51bWJlciBvZiBvY2N1cmFuY2VzCisgICAgICAgICAgICAgICAgICAgICMgY291bnQgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcwogICAgICAgICAgICAgICAgICAgICBpZiB2YWx1ZXMuaGFzX2tleShvcHRpb25uYW1lKToKICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc1tvcHRpb25uYW1lXSA9IHZhbHVlc1tvcHRpb25uYW1lXSArIDEKICAgICAgICAgICAgICAgICAgICAgZWxzZToKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvUkVBRE1FIGIvVG9vbHMvcHliZW5jaC9SRUFETUUKaW5kZXggMDIyYzhkZS4uMjA2MWNhYiAxMDA2NDQKLS0tIGEvVG9vbHMvcHliZW5jaC9SRUFETUUKKysrIGIvVG9vbHMvcHliZW5jaC9SRUFETUUKQEAgLTMsNyArMyw3IEBACiBQWUJFTkNIIC0gQSBQeXRob24gQmVuY2htYXJrIFN1aXRlCiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KIAotICAgICBFeHRlbmRhYmxlIHN1aXRlIG9mIG9mIGxvdy1sZXZlbCBiZW5jaG1hcmtzIGZvciBtZWFzdXJpbmcKKyAgICAgRXh0ZW5kYWJsZSBzdWl0ZSBvZiBsb3ctbGV2ZWwgYmVuY2htYXJrcyBmb3IgbWVhc3VyaW5nCiAgICAgICAgICAgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24gCiAgICAgICAgICAgICAgICAgIChpbnRlcnByZXRlciwgY29tcGlsZXIgb3IgVk0pLgogCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL1NldHVwLnB5IGIvVG9vbHMvcHliZW5jaC9TZXR1cC5weQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL2Nsb2NrcmVzLnB5IGIvVG9vbHMvcHliZW5jaC9jbG9ja3Jlcy5weQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL3N5c3RpbWVzLnB5IGIvVG9vbHMvcHliZW5jaC9zeXN0aW1lcy5weQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDAxM2FkZDIuLmRiMTIxMGQKLS0tIGEvVG9vbHMvcHliZW5jaC9zeXN0aW1lcy5weQorKysgYi9Ub29scy9weWJlbmNoL3N5c3RpbWVzLnB5CkBAIC01LDcgKzUsNyBAQAogCiAgICAgVGhpcyBtb2R1bGUgaW1wbGVtZW50cyB2YXJpb3VzIGRpZmZlcmVudCBzdHJhdGVnaWVzIGZvciBtZWFzdXJpbmcKICAgICBwZXJmb3JtYW5jZSB0aW1pbmdzLiBJdCB0cmllcyB0byBjaG9vc2UgdGhlIGJlc3QgYXZhaWxhYmxlIG1ldGhvZAotICAgIGJhc2VkIG9uIHRoZSBwbGF0Zm9ybWEgYW5kIGF2YWlsYWJsZSB0b29scy4KKyAgICBiYXNlZCBvbiB0aGUgcGxhdGZvcm0gYW5kIGF2YWlsYWJsZSB0b29scy4KIAogICAgIE9uIFdpbmRvd3MsIGl0IGlzIHJlY29tbWVuZGVkIHRvIGhhdmUgdGhlIE1hcmsgSGFtbW9uZCB3aW4zMgogICAgIHBhY2thZ2UgaW5zdGFsbGVkLiBBbHRlcm5hdGl2ZWx5LCB0aGUgVGhvbWFzIEhlbGxlciBjdHlwZXMKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5bmNoZS9EZXRhaWxzVmlld2VyLnB5IGIvVG9vbHMvcHluY2hlL0RldGFpbHNWaWV3ZXIucHkKaW5kZXggMTFhOTlhNi4uZmI1OTdiNSAxMDA2NDQKLS0tIGEvVG9vbHMvcHluY2hlL0RldGFpbHNWaWV3ZXIucHkKKysrIGIvVG9vbHMvcHluY2hlL0RldGFpbHNWaWV3ZXIucHkKQEAgLTI2LDcgKzI2LDcgQEAKICAgICAgICAgb3RoZXIgc2lkZS4gIFRodXMgaWYgcmVkIHdlcmUgYXQgMjM4IGFuZCAyNSB3ZXJlIGFkZGVkIHRvIGl0LCByZWQKICAgICAgICAgd291bGQgaGF2ZSB0aGUgdmFsdWUgNy4KIAotICAgIFByZXNldmUgRGlzdGFuY2UKKyAgICBQcmVzZXJ2ZSBEaXN0YW5jZQogICAgICAgICBXaGVuIHRoZSBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IHdvdWxkIHNlbmQgYW55IG9mIHRoZSB0aWVkIHZhcmlhdGlvbnMKICAgICAgICAgb3V0IG9mIGJvdW5kcywgYWxsIHRpZWQgdmFyaWF0aW9ucyBhcmUgd3JhcHBlZCBhcyBvbmUsIHNvIGFzIHRvCiAgICAgICAgIHByZXNlcnZlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZW0uICBUaHVzIGlmIGdyZWVuIGFuZCBibHVlIHdlcmUgdGllZCwKZGlmZiAtLWdpdCBhL1Rvb2xzL3NjcmlwdHMvYnlleHQucHkgYi9Ub29scy9zY3JpcHRzL2J5ZXh0LnB5CmluZGV4IDEzOGQ4ZGQuLmNhMTg3NzYgMTAwNzU1Ci0tLSBhL1Rvb2xzL3NjcmlwdHMvYnlleHQucHkKKysrIGIvVG9vbHMvc2NyaXB0cy9ieWV4dC5weQpAQCAtMiw2ICsyLDggQEAKIAogIiIiU2hvdyBmaWxlIHN0YXRpc3RpY3MgYnkgZXh0ZW5zaW9uLiIiIgogCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKIGltcG9ydCBvcwogaW1wb3J0IHN5cwogCmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL2ZpbmRub2NvZGluZy5weSBiL1Rvb2xzL3NjcmlwdHMvZmluZG5vY29kaW5nLnB5CmluZGV4IGU0OWZjNDIuLjVkOTMyOTAgMTAwNzU1Ci0tLSBhL1Rvb2xzL3NjcmlwdHMvZmluZG5vY29kaW5nLnB5CisrKyBiL1Rvb2xzL3NjcmlwdHMvZmluZG5vY29kaW5nLnB5CkBAIC0zMiwxMyArMzIsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAibm8gc29waGlzdGljYXRlZCBQeXRob24gc291cmNlIGZpbGUgc2VhcmNoIHdpbGwgYmUgZG9uZS4iKQogCiAKLWRlY2xfcmUgPSByZS5jb21waWxlKHIiY29kaW5nWz06XVxzKihbLVx3Ll0rKSIpCitkZWNsX3JlID0gcmUuY29tcGlsZShyJ15bIFx0XGZdKiMuKmNvZGluZ1s6PV1bIFx0XSooWy1cdy5dKyknKQogCiBkZWYgZ2V0X2RlY2xhcmF0aW9uKGxpbmUpOgotICAgIG1hdGNoID0gZGVjbF9yZS5zZWFyY2gobGluZSkKKyAgICBtYXRjaCA9IGRlY2xfcmUubWF0Y2gobGluZSkKICAgICBpZiBtYXRjaDoKICAgICAgICAgcmV0dXJuIG1hdGNoLmdyb3VwKDEpCi0gICAgcmV0dXJuICcnCisgICAgcmV0dXJuIGInJwogCiBkZWYgaGFzX2NvcnJlY3RfZW5jb2RpbmcodGV4dCwgY29kZWMpOgogICAgIHRyeToKZGlmZiAtLWdpdCBhL1Rvb2xzL3NjcmlwdHMvZml4bm90aWNlLnB5IGIvVG9vbHMvc2NyaXB0cy9maXhub3RpY2UucHkKaW5kZXggMGFlNDg3Mi4uZTYxM2I2NSAxMDA3NTUKLS0tIGEvVG9vbHMvc2NyaXB0cy9maXhub3RpY2UucHkKKysrIGIvVG9vbHMvc2NyaXB0cy9maXhub3RpY2UucHkKQEAgLTIsNyArMiw3IEBACiAKICIiIihPc3RlbnNpYmx5KSBmaXggY29weXJpZ2h0IG5vdGljZXMgaW4gZmlsZXMuCiAKLUFjdHVhbGx5LCB0aGlzIHNyaXB0IHdpbGwgc2ltcGx5IHJlcGxhY2UgYSBibG9jayBvZiB0ZXh0IGluIGEgZmlsZSBmcm9tIG9uZQorQWN0dWFsbHksIHRoaXMgc2NyaXB0IHdpbGwgc2ltcGx5IHJlcGxhY2UgYSBibG9jayBvZiB0ZXh0IGluIGEgZmlsZSBmcm9tIG9uZQogc3RyaW5nIHRvIGFub3RoZXIuICBJdCB3aWxsIG9ubHkgZG8gdGhpcyBvbmNlIHRob3VnaCwgaS5lLiBub3QgZ2xvYmFsbHkKIHRocm91Z2hvdXQgdGhlIGZpbGUuICBJdCB3cml0ZXMgYSBiYWNrdXAgZmlsZSBhbmQgdGhlbiBkb2VzIGFuIG9zLnJlbmFtZSgpCiBkYW5jZSBmb3IgYXRvbWljaXR5LgpkaWZmIC0tZ2l0IGEvVG9vbHMvc2NyaXB0cy9ncHJvZjJodG1sLnB5IGIvVG9vbHMvc2NyaXB0cy9ncHJvZjJodG1sLnB5CmluZGV4IGNiMDFjMmMuLjc2NDA4Y2EgMTAwNzU1Ci0tLSBhL1Rvb2xzL3NjcmlwdHMvZ3Byb2YyaHRtbC5weQorKysgYi9Ub29scy9zY3JpcHRzL2dwcm9mMmh0bWwucHkKQEAgLTEsNCArMSw0IEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uMi4zCisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCiAKICIiIlRyYW5zZm9ybSBncHJvZigxKSBvdXRwdXQgaW50byB1c2VmdWwgSFRNTC4iIiIKIApkaWZmIC0tZ2l0IGEvVG9vbHMvc2NyaXB0cy9oMnB5LnB5IGIvVG9vbHMvc2NyaXB0cy9oMnB5LnB5CmluZGV4IGM2ODFlMjMuLmM2NDUwMWUgMTAwNzU1Ci0tLSBhL1Rvb2xzL3NjcmlwdHMvaDJweS5weQorKysgYi9Ub29scy9zY3JpcHRzL2gycHkucHkKQEAgLTU4LDYgKzU4LDEyIEBACiAgICAgICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IKICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgc2VhcmNoZGlycz1bJy91c3IvaW5jbHVkZSddCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VhcmNoZGlycy5pbnNlcnQoMCwgb3MucGF0aC5qb2luKCcvdXNyL2luY2x1ZGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5lbnZpcm9uWydNVUxUSUFSQ0gnXSkpCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCiAKIGRlZiBtYWluKCk6CiAgICAgZ2xvYmFsIGZpbGVkaWN0CmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL2lmZGVmLnB5IGIvVG9vbHMvc2NyaXB0cy9pZmRlZi5weQppbmRleCAyZWQ3YTY2Li41NDg3ZjFhIDEwMDc1NQotLS0gYS9Ub29scy9zY3JpcHRzL2lmZGVmLnB5CisrKyBiL1Rvb2xzL3NjcmlwdHMvaWZkZWYucHkKQEAgLTksMTEgKzksMTEgQEAKICMgb3B0aW9ucy4gIE9uIHN0YW5kYXJkIG91dHB1dCBpdCB3cml0ZXMgYSBjb3B5IG9mIHRoZSBpbnB1dCBmaWxlKHMpCiAjIG1pbnVzIHRob3NlIGNvZGUgc2VjdGlvbnMgdGhhdCBhcmUgc3VwcHJlc3NlZCBieSB0aGUgc2VsZWN0ZWQKICMgY29tYmluYXRpb24gb2YgZGVmaW5lZC91bmRlZmluZWQgc3ltYm9scy4gIFRoZSAjaWYobilkZWYvI2Vsc2UvI2Vsc2UKLSMgbGluZXMgdGhlbXNlbGZzIChpZiB0aGUgI2lmKG4pZGVmIHRlc3RzIGZvciBvbmUgb2YgdGhlIG1lbnRpb25lZAorIyBsaW5lcyB0aGVtc2VsdmVzIChpZiB0aGUgI2lmKG4pZGVmIHRlc3RzIGZvciBvbmUgb2YgdGhlIG1lbnRpb25lZAogIyBuYW1lcykgYXJlIHJlbW92ZWQgYXMgd2VsbC4KIAogIyBGZWF0dXJlczogQXJiaXRyYXJ5IG5lc3Rpbmcgb2YgcmVjb2duaXplZCBhbmQgdW5yZWNvZ25pemVkCi0jIHByZXByb2Nlc29yIHN0YXRlbWVudHMgd29ya3MgY29ycmVjdGx5LiAgVW5yZWNvZ25pemVkICNpZiogY29tbWFuZHMKKyMgcHJlcHJvY2Vzc29yIHN0YXRlbWVudHMgd29ya3MgY29ycmVjdGx5LiAgVW5yZWNvZ25pemVkICNpZiogY29tbWFuZHMKICMgYXJlIGxlZnQgaW4gcGxhY2UsIHNvIGl0IHdpbGwgbmV2ZXIgcmVtb3ZlIHRvbyBtdWNoLCBvbmx5IHRvbwogIyBsaXR0bGUuICBJdCBkb2VzIGFjY2VwdCB3aGl0ZXNwYWNlIGFyb3VuZCB0aGUgJyMnIGNoYXJhY3Rlci4KIApkaWZmIC0tZ2l0IGEvVG9vbHMvc2NyaXB0cy9wYXRjaGNoZWNrLnB5IGIvVG9vbHMvc2NyaXB0cy9wYXRjaGNoZWNrLnB5CmluZGV4IDI4MzRmZWYuLjQxOGRkMjYgMTAwNzU1Ci0tLSBhL1Rvb2xzL3NjcmlwdHMvcGF0Y2hjaGVjay5weQorKysgYi9Ub29scy9zY3JpcHRzL3BhdGNoY2hlY2sucHkKQEAgLTM2LDYgKzM2LDIwIEBACiAgICAgcmV0dXJuIGRlY29yYXRlZF9meG4KIAogCitkZWYgbXFfcGF0Y2hlc19hcHBsaWVkKCk6CisgICAgIiIiQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBhcHBsaWVkIE1RIHBhdGNoZXMuIiIiCisgICAgY21kID0gJ2hnIHFhcHBsaWVkJworICAgIHN0ID0gc3VicHJvY2Vzcy5Qb3BlbihjbWQuc3BsaXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICB0cnk6CisgICAgICAgIGJzdGRvdXQsIF8gPSBzdC5jb21tdW5pY2F0ZSgpCisgICAgICAgIHJldHVybiBzdC5yZXR1cm5jb2RlID09IDAgYW5kIGJzdGRvdXQKKyAgICBmaW5hbGx5OgorICAgICAgICBzdC5zdGRvdXQuY2xvc2UoKQorICAgICAgICBzdC5zdGRlcnIuY2xvc2UoKQorCisKIEBzdGF0dXMoIkdldHRpbmcgdGhlIGxpc3Qgb2YgZmlsZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQvY2hhbmdlZCIsCiAgICAgICAgIGluZm89bGFtYmRhIHg6IG5fZmlsZXNfc3RyKGxlbih4KSkpCiBkZWYgY2hhbmdlZF9maWxlcygpOgpAQCAtNDMsNiArNTcsOCBAQAogICAgIGlmIG9zLnBhdGguaXNkaXIob3MucGF0aC5qb2luKFNSQ0RJUiwgJy5oZycpKToKICAgICAgICAgdmNzID0gJ2hnJwogICAgICAgICBjbWQgPSAnaGcgc3RhdHVzIC0tYWRkZWQgLS1tb2RpZmllZCAtLW5vLXN0YXR1cycKKyAgICAgICAgaWYgbXFfcGF0Y2hlc19hcHBsaWVkKCk6CisgICAgICAgICAgICBjbWQgKz0gJyAtLXJldiBxcGFyZW50JwogICAgIGVsaWYgb3MucGF0aC5pc2RpcignLnN2bicpOgogICAgICAgICB2Y3MgPSAnc3ZuJwogICAgICAgICBjbWQgPSAnc3ZuIHN0YXR1cyAtLXF1aWV0IC0tbm9uLWludGVyYWN0aXZlIC0taWdub3JlLWV4dGVybmFscycKQEAgLTEyOCwxMyArMTQ0LDEzIEBACiBAc3RhdHVzKCJNaXNjL0FDS1MgdXBkYXRlZCIsIG1vZGFsPVRydWUpCiBkZWYgY3JlZGl0X2dpdmVuKGZpbGVfcGF0aHMpOgogICAgICIiIkNoZWNrIGlmIE1pc2MvQUNLUyBoYXMgYmVlbiBjaGFuZ2VkLiIiIgotICAgIHJldHVybiAnTWlzYy9BQ0tTJyBpbiBmaWxlX3BhdGhzCisgICAgcmV0dXJuIG9zLnBhdGguam9pbignTWlzYycsICdBQ0tTJykgaW4gZmlsZV9wYXRocwogCiAKIEBzdGF0dXMoIk1pc2MvTkVXUyB1cGRhdGVkIiwgbW9kYWw9VHJ1ZSkKIGRlZiByZXBvcnRlZF9uZXdzKGZpbGVfcGF0aHMpOgogICAgICIiIkNoZWNrIGlmIE1pc2MvTkVXUyBoYXMgYmVlbiBjaGFuZ2VkLiIiIgotICAgIHJldHVybiAnTWlzYy9ORVdTJyBpbiBmaWxlX3BhdGhzCisgICAgcmV0dXJuIG9zLnBhdGguam9pbignTWlzYycsICdORVdTJykgaW4gZmlsZV9wYXRocwogCiAKIGRlZiBtYWluKCk6CkBAIC0xNDIsNyArMTU4LDggQEAKICAgICBweXRob25fZmlsZXMgPSBbZm4gZm9yIGZuIGluIGZpbGVfcGF0aHMgaWYgZm4uZW5kc3dpdGgoJy5weScpXQogICAgIGNfZmlsZXMgPSBbZm4gZm9yIGZuIGluIGZpbGVfcGF0aHMgaWYgZm4uZW5kc3dpdGgoKCcuYycsICcuaCcpKV0KICAgICBkb2NfZmlsZXMgPSBbZm4gZm9yIGZuIGluIGZpbGVfcGF0aHMgaWYgZm4uc3RhcnRzd2l0aCgnRG9jJyldCi0gICAgc3BlY2lhbF9maWxlcyA9IHsnTWlzYy9BQ0tTJywgJ01pc2MvTkVXUyd9ICYgc2V0KGZpbGVfcGF0aHMpCisgICAgbWlzY19maWxlcyA9IHtvcy5wYXRoLmpvaW4oJ01pc2MnLCAnQUNLUycpLCBvcy5wYXRoLmpvaW4oJ01pc2MnLCAnTkVXUycpfVwKKyAgICAgICAgICAgICYgc2V0KGZpbGVfcGF0aHMpCiAgICAgIyBQRVAgOCB3aGl0ZXNwYWNlIHJ1bGVzIGVuZm9yY2VtZW50LgogICAgIG5vcm1hbGl6ZV93aGl0ZXNwYWNlKHB5dGhvbl9maWxlcykKICAgICAjIEMgcnVsZXMgZW5mb3JjZW1lbnQuCkBAIC0xNTIsMTQgKzE2OSwxNSBAQAogICAgICMgRG9jcyB1cGRhdGVkLgogICAgIGRvY3NfbW9kaWZpZWQoZG9jX2ZpbGVzKQogICAgICMgTWlzYy9BQ0tTIGNoYW5nZWQuCi0gICAgY3JlZGl0X2dpdmVuKHNwZWNpYWxfZmlsZXMpCisgICAgY3JlZGl0X2dpdmVuKG1pc2NfZmlsZXMpCiAgICAgIyBNaXNjL05FV1MgY2hhbmdlZC4KLSAgICByZXBvcnRlZF9uZXdzKHNwZWNpYWxfZmlsZXMpCisgICAgcmVwb3J0ZWRfbmV3cyhtaXNjX2ZpbGVzKQogCiAgICAgIyBUZXN0IHN1aXRlIHJ1biBhbmQgcGFzc2VkLgogICAgIGlmIHB5dGhvbl9maWxlcyBvciBjX2ZpbGVzOgorICAgICAgICBlbmQgPSAiIGFuZCBjaGVjayBmb3IgcmVmbGVha3M/IiBpZiBjX2ZpbGVzIGVsc2UgIj8iCiAgICAgICAgIHByaW50Ci0gICAgICAgIHByaW50ICJEaWQgeW91IHJ1biB0aGUgdGVzdCBzdWl0ZT8iCisgICAgICAgIHByaW50ICJEaWQgeW91IHJ1biB0aGUgdGVzdCBzdWl0ZSIgKyBlbmQKIAogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgpkaWZmIC0tZ2l0IGEvVG9vbHMvc2NyaXB0cy9wYXRoZml4LnB5IGIvVG9vbHMvc2NyaXB0cy9wYXRoZml4LnB5CmluZGV4IDdmNmYxOTEuLjg1MDkwM2EgMTAwNzU1Ci0tLSBhL1Rvb2xzL3NjcmlwdHMvcGF0aGZpeC5weQorKysgYi9Ub29scy9zY3JpcHRzL3BhdGhmaXgucHkKQEAgLTEzNSw3ICsxMzUsNyBAQAogICAgIGV4Y2VwdCBvcy5lcnJvciwgbXNnOgogICAgICAgICBlcnIoJyVzOiByZW5hbWUgZmFpbGVkICglcilcbicgJSAoZmlsZW5hbWUsIG1zZykpCiAgICAgICAgIHJldHVybiAxCi0gICAgIyBSZXR1cm4gc3VjY2VzCisgICAgIyBSZXR1cm4gc3VjY2VzcwogICAgIHJldHVybiAwCiAKIGRlZiBmaXhsaW5lKGxpbmUpOgpkaWZmIC0tZ2l0IGEvVG9vbHMvc2NyaXB0cy9waW5kZW50LnB5IGIvVG9vbHMvc2NyaXB0cy9waW5kZW50LnB5CmluZGV4IDdiZmM0MTUuLjZlNDBkNjAgMTAwNzU1Ci0tLSBhL1Rvb2xzL3NjcmlwdHMvcGluZGVudC5weQorKysgYi9Ub29scy9zY3JpcHRzL3BpbmRlbnQucHkKQEAgLTc2LDExICs3NiwxNCBAQAogIyAtIHJlYWxpZ24gY29tbWVudHMKICMgLSBvcHRpb25hbGx5IGRvIG11Y2ggbW9yZSB0aG9yb3VnaCByZWZvcm1hdHRpbmcsIGEgbGEgQyBpbmRlbnQKIAorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCiAjIERlZmF1bHRzCiBTVEVQU0laRSA9IDgKIFRBQlNJWkUgPSA4Ci1FWFBBTkRUQUJTID0gMAorRVhQQU5EVEFCUyA9IEZhbHNlCiAKK2ltcG9ydCBpbwogaW1wb3J0IHJlCiBpbXBvcnQgc3lzCiAKQEAgLTg5LDcgKzkyLDggQEAKIG5leHRbJ3doaWxlJ10gPSBuZXh0Wydmb3InXSA9ICdlbHNlJywgJ2VuZCcKIG5leHRbJ3RyeSddID0gJ2V4Y2VwdCcsICdmaW5hbGx5JwogbmV4dFsnZXhjZXB0J10gPSAnZXhjZXB0JywgJ2Vsc2UnLCAnZmluYWxseScsICdlbmQnCi1uZXh0WydlbHNlJ10gPSBuZXh0WydmaW5hbGx5J10gPSBuZXh0WydkZWYnXSA9IG5leHRbJ2NsYXNzJ10gPSAnZW5kJworbmV4dFsnZWxzZSddID0gbmV4dFsnZmluYWxseSddID0gbmV4dFsnd2l0aCddID0gXAorICAgIG5leHRbJ2RlZiddID0gbmV4dFsnY2xhc3MnXSA9ICdlbmQnCiBuZXh0WydlbmQnXSA9ICgpCiBzdGFydCA9ICdpZicsICd3aGlsZScsICdmb3InLCAndHJ5JywgJ3dpdGgnLCAnZGVmJywgJ2NsYXNzJwogCkBAIC0xMDUsMTEgKzEwOSwxMSBAQAogICAgICAgICBzZWxmLmV4cGFuZHRhYnMgPSBleHBhbmR0YWJzCiAgICAgICAgIHNlbGYuX3dyaXRlID0gZnBvLndyaXRlCiAgICAgICAgIHNlbGYua3dwcm9nID0gcmUuY29tcGlsZSgKLSAgICAgICAgICAgICAgICByJ15ccyooP1A8a3c+W2Etel0rKScKLSAgICAgICAgICAgICAgICByJyhccysoP1A8aWQ+W2EtekEtWl9dXHcqKSk/JworICAgICAgICAgICAgICAgIHInXig/OlxzfFxcXG4pKig/UDxrdz5bYS16XSspJworICAgICAgICAgICAgICAgIHInKCg/OlxzfFxcXG4pKyg/UDxpZD5bYS16QS1aX11cdyopKT8nCiAgICAgICAgICAgICAgICAgcidbXlx3XScpCiAgICAgICAgIHNlbGYuZW5kcHJvZyA9IHJlLmNvbXBpbGUoCi0gICAgICAgICAgICAgICAgcideXHMqIz9ccyplbmRccysoP1A8a3c+W2Etel0rKScKKyAgICAgICAgICAgICAgICByJ14oPzpcc3xcXFxuKSojP1xzKmVuZFxzKyg/UDxrdz5bYS16XSspJwogICAgICAgICAgICAgICAgIHInKFxzKyg/UDxpZD5bYS16QS1aX11cdyopKT8nCiAgICAgICAgICAgICAgICAgcidbXlx3XScpCiAgICAgICAgIHNlbGYud3Nwcm9nID0gcmUuY29tcGlsZShyJ15bIFx0XSonKQpAQCAtMTI1LDcgKzEyOSw3IEBACiAKICAgICBkZWYgcmVhZGxpbmUoc2VsZik6CiAgICAgICAgIGxpbmUgPSBzZWxmLmZwaS5yZWFkbGluZSgpCi0gICAgICAgIGlmIGxpbmU6IHNlbGYubGluZW5vID0gc2VsZi5saW5lbm8gKyAxCisgICAgICAgIGlmIGxpbmU6IHNlbGYubGluZW5vICs9IDEKICAgICAgICAgIyBlbmQgaWYKICAgICAgICAgcmV0dXJuIGxpbmUKICAgICAjIGVuZCBkZWYgcmVhZGxpbmUKQEAgLTE0MywyNyArMTQ3LDI0IEBACiAgICAgICAgICAgICBsaW5lMiA9IHNlbGYucmVhZGxpbmUoKQogICAgICAgICAgICAgaWYgbm90IGxpbmUyOiBicmVhawogICAgICAgICAgICAgIyBlbmQgaWYKLSAgICAgICAgICAgIGxpbmUgPSBsaW5lICsgbGluZTIKKyAgICAgICAgICAgIGxpbmUgKz0gbGluZTIKICAgICAgICAgIyBlbmQgd2hpbGUKICAgICAgICAgcmV0dXJuIGxpbmUKICAgICAjIGVuZCBkZWYgZ2V0bGluZQogCi0gICAgZGVmIHB1dGxpbmUoc2VsZiwgbGluZSwgaW5kZW50ID0gTm9uZSk6Ci0gICAgICAgIGlmIGluZGVudCBpcyBOb25lOgotICAgICAgICAgICAgc2VsZi53cml0ZShsaW5lKQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICMgZW5kIGlmCisgICAgZGVmIHB1dGxpbmUoc2VsZiwgbGluZSwgaW5kZW50KToKICAgICAgICAgdGFicywgc3BhY2VzID0gZGl2bW9kKGluZGVudCpzZWxmLmluZGVudHNpemUsIHNlbGYudGFic2l6ZSkKLSAgICAgICAgaSA9IDAKLSAgICAgICAgbSA9IHNlbGYud3Nwcm9nLm1hdGNoKGxpbmUpCi0gICAgICAgIGlmIG06IGkgPSBtLmVuZCgpCisgICAgICAgIGkgPSBzZWxmLndzcHJvZy5tYXRjaChsaW5lKS5lbmQoKQorICAgICAgICBsaW5lID0gbGluZVtpOl0KKyAgICAgICAgaWYgbGluZVs6MV0gbm90IGluICgnXG4nLCAnXHInLCAnJyk6CisgICAgICAgICAgICBsaW5lID0gJ1x0Jyp0YWJzICsgJyAnKnNwYWNlcyArIGxpbmUKICAgICAgICAgIyBlbmQgaWYKLSAgICAgICAgc2VsZi53cml0ZSgnXHQnKnRhYnMgKyAnICcqc3BhY2VzICsgbGluZVtpOl0pCisgICAgICAgIHNlbGYud3JpdGUobGluZSkKICAgICAjIGVuZCBkZWYgcHV0bGluZQogCiAgICAgZGVmIHJlZm9ybWF0KHNlbGYpOgogICAgICAgICBzdGFjayA9IFtdCi0gICAgICAgIHdoaWxlIDE6CisgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICBsaW5lID0gc2VsZi5nZXRsaW5lKCkKICAgICAgICAgICAgIGlmIG5vdCBsaW5lOiBicmVhayAgICAgICMgRU9GCiAgICAgICAgICAgICAjIGVuZCBpZgpAQCAtMTczLDEwICsxNzQsOSBAQAogICAgICAgICAgICAgICAgIGt3MiA9IG0uZ3JvdXAoJ2t3JykKICAgICAgICAgICAgICAgICBpZiBub3Qgc3RhY2s6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IoJ3VuZXhwZWN0ZWQgZW5kJykKLSAgICAgICAgICAgICAgICBlbGlmIHN0YWNrWy0xXVswXSAhPSBrdzI6CisgICAgICAgICAgICAgICAgZWxpZiBzdGFjay5wb3AoKVswXSAhPSBrdzI6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IoJ3VubWF0Y2hlZCBlbmQnKQogICAgICAgICAgICAgICAgICMgZW5kIGlmCi0gICAgICAgICAgICAgICAgZGVsIHN0YWNrWy0xOl0KICAgICAgICAgICAgICAgICBzZWxmLnB1dGxpbmUobGluZSwgbGVuKHN0YWNrKSkKICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgIyBlbmQgaWYKQEAgLTIwOCwyMyArMjA4LDIzIEBACiAgICAgZGVmIGRlbGV0ZShzZWxmKToKICAgICAgICAgYmVnaW5fY291bnRlciA9IDAKICAgICAgICAgZW5kX2NvdW50ZXIgPSAwCi0gICAgICAgIHdoaWxlIDE6CisgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICBsaW5lID0gc2VsZi5nZXRsaW5lKCkKICAgICAgICAgICAgIGlmIG5vdCBsaW5lOiBicmVhayAgICAgICMgRU9GCiAgICAgICAgICAgICAjIGVuZCBpZgogICAgICAgICAgICAgbSA9IHNlbGYuZW5kcHJvZy5tYXRjaChsaW5lKQogICAgICAgICAgICAgaWYgbToKLSAgICAgICAgICAgICAgICBlbmRfY291bnRlciA9IGVuZF9jb3VudGVyICsgMQorICAgICAgICAgICAgICAgIGVuZF9jb3VudGVyICs9IDEKICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgIyBlbmQgaWYKICAgICAgICAgICAgIG0gPSBzZWxmLmt3cHJvZy5tYXRjaChsaW5lKQogICAgICAgICAgICAgaWYgbToKICAgICAgICAgICAgICAgICBrdyA9IG0uZ3JvdXAoJ2t3JykKICAgICAgICAgICAgICAgICBpZiBrdyBpbiBzdGFydDoKLSAgICAgICAgICAgICAgICAgICAgYmVnaW5fY291bnRlciA9IGJlZ2luX2NvdW50ZXIgKyAxCisgICAgICAgICAgICAgICAgICAgIGJlZ2luX2NvdW50ZXIgKz0gMQogICAgICAgICAgICAgICAgICMgZW5kIGlmCiAgICAgICAgICAgICAjIGVuZCBpZgotICAgICAgICAgICAgc2VsZi5wdXRsaW5lKGxpbmUpCisgICAgICAgICAgICBzZWxmLndyaXRlKGxpbmUpCiAgICAgICAgICMgZW5kIHdoaWxlCiAgICAgICAgIGlmIGJlZ2luX2NvdW50ZXIgLSBlbmRfY291bnRlciA8IDA6CiAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCdXYXJuaW5nOiBpbnB1dCBjb250YWluZWQgbW9yZSBlbmQgdGFncyB0aGFuIGV4cGVjdGVkXG4nKQpAQCAtMjM0LDE3ICsyMzQsMTIgQEAKICAgICAjIGVuZCBkZWYgZGVsZXRlCiAKICAgICBkZWYgY29tcGxldGUoc2VsZik6Ci0gICAgICAgIHNlbGYuaW5kZW50c2l6ZSA9IDEKICAgICAgICAgc3RhY2sgPSBbXQogICAgICAgICB0b2RvID0gW10KLSAgICAgICAgdGhpc2lkID0gJycKLSAgICAgICAgY3VycmVudCwgZmlyc3RrdywgbGFzdGt3LCB0b3BpZCA9IDAsICcnLCAnJywgJycKLSAgICAgICAgd2hpbGUgMToKKyAgICAgICAgY3VycmVudHdzID0gdGhpc2lkID0gZmlyc3RrdyA9IGxhc3RrdyA9IHRvcGlkID0gJycKKyAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgIGxpbmUgPSBzZWxmLmdldGxpbmUoKQotICAgICAgICAgICAgaSA9IDAKLSAgICAgICAgICAgIG0gPSBzZWxmLndzcHJvZy5tYXRjaChsaW5lKQotICAgICAgICAgICAgaWYgbTogaSA9IG0uZW5kKCkKLSAgICAgICAgICAgICMgZW5kIGlmCisgICAgICAgICAgICBpID0gc2VsZi53c3Byb2cubWF0Y2gobGluZSkuZW5kKCkKICAgICAgICAgICAgIG0gPSBzZWxmLmVuZHByb2cubWF0Y2gobGluZSkKICAgICAgICAgICAgIGlmIG06CiAgICAgICAgICAgICAgICAgdGhpc2t3ID0gJ2VuZCcKQEAgLTI2OSw3ICsyNjQsOSBAQAogICAgICAgICAgICAgICAgICAgICB0aGlza3cgPSAnJwogICAgICAgICAgICAgICAgICMgZW5kIGlmCiAgICAgICAgICAgICAjIGVuZCBpZgotICAgICAgICAgICAgaW5kZW50ID0gbGVuKGxpbmVbOmldLmV4cGFuZHRhYnMoc2VsZi50YWJzaXplKSkKKyAgICAgICAgICAgIGluZGVudHdzID0gbGluZVs6aV0KKyAgICAgICAgICAgIGluZGVudCA9IGxlbihpbmRlbnR3cy5leHBhbmR0YWJzKHNlbGYudGFic2l6ZSkpCisgICAgICAgICAgICBjdXJyZW50ID0gbGVuKGN1cnJlbnR3cy5leHBhbmR0YWJzKHNlbGYudGFic2l6ZSkpCiAgICAgICAgICAgICB3aGlsZSBpbmRlbnQgPCBjdXJyZW50OgogICAgICAgICAgICAgICAgIGlmIGZpcnN0a3c6CiAgICAgICAgICAgICAgICAgICAgIGlmIHRvcGlkOgpAQCAtMjc4LDExICsyNzUsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAnIyBlbmQgJXNcbicgJSBmaXJzdGt3CiAgICAgICAgICAgICAgICAgICAgICMgZW5kIGlmCi0gICAgICAgICAgICAgICAgICAgIHNlbGYucHV0bGluZShzLCBjdXJyZW50KQorICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKGN1cnJlbnR3cyArIHMpCiAgICAgICAgICAgICAgICAgICAgIGZpcnN0a3cgPSBsYXN0a3cgPSAnJwogICAgICAgICAgICAgICAgICMgZW5kIGlmCi0gICAgICAgICAgICAgICAgY3VycmVudCwgZmlyc3RrdywgbGFzdGt3LCB0b3BpZCA9IHN0YWNrWy0xXQotICAgICAgICAgICAgICAgIGRlbCBzdGFja1stMV0KKyAgICAgICAgICAgICAgICBjdXJyZW50d3MsIGZpcnN0a3csIGxhc3RrdywgdG9waWQgPSBzdGFjay5wb3AoKQorICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBsZW4oY3VycmVudHdzLmV4cGFuZHRhYnMoc2VsZi50YWJzaXplKSkKICAgICAgICAgICAgICMgZW5kIHdoaWxlCiAgICAgICAgICAgICBpZiBpbmRlbnQgPT0gY3VycmVudCBhbmQgZmlyc3RrdzoKICAgICAgICAgICAgICAgICBpZiB0aGlza3cgPT0gJ2VuZCc6CkBAIC0yOTcsMTggKzI5NCwxOCBAQAogICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgcyA9ICcjIGVuZCAlc1xuJyAlIGZpcnN0a3cKICAgICAgICAgICAgICAgICAgICAgIyBlbmQgaWYKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5wdXRsaW5lKHMsIGN1cnJlbnQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoY3VycmVudHdzICsgcykKICAgICAgICAgICAgICAgICAgICAgZmlyc3RrdyA9IGxhc3RrdyA9IHRvcGlkID0gJycKICAgICAgICAgICAgICAgICAjIGVuZCBpZgogICAgICAgICAgICAgIyBlbmQgaWYKICAgICAgICAgICAgIGlmIGluZGVudCA+IGN1cnJlbnQ6Ci0gICAgICAgICAgICAgICAgc3RhY2suYXBwZW5kKChjdXJyZW50LCBmaXJzdGt3LCBsYXN0a3csIHRvcGlkKSkKKyAgICAgICAgICAgICAgICBzdGFjay5hcHBlbmQoKGN1cnJlbnR3cywgZmlyc3RrdywgbGFzdGt3LCB0b3BpZCkpCiAgICAgICAgICAgICAgICAgaWYgdGhpc2t3IGFuZCB0aGlza3cgbm90IGluIHN0YXJ0OgogICAgICAgICAgICAgICAgICAgICAjIGVycm9yCiAgICAgICAgICAgICAgICAgICAgIHRoaXNrdyA9ICcnCiAgICAgICAgICAgICAgICAgIyBlbmQgaWYKLSAgICAgICAgICAgICAgICBjdXJyZW50LCBmaXJzdGt3LCBsYXN0a3csIHRvcGlkID0gXAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCwgdGhpc2t3LCB0aGlza3csIHRoaXNpZAorICAgICAgICAgICAgICAgIGN1cnJlbnR3cywgZmlyc3RrdywgbGFzdGt3LCB0b3BpZCA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50d3MsIHRoaXNrdywgdGhpc2t3LCB0aGlzaWQKICAgICAgICAgICAgICMgZW5kIGlmCiAgICAgICAgICAgICBpZiB0aGlza3c6CiAgICAgICAgICAgICAgICAgaWYgdGhpc2t3IGluIHN0YXJ0OgpAQCAtMzI2LDcgKzMyMyw2IEBACiAgICAgICAgICAgICBzZWxmLndyaXRlKGxpbmUpCiAgICAgICAgICMgZW5kIHdoaWxlCiAgICAgIyBlbmQgZGVmIGNvbXBsZXRlCi0KICMgZW5kIGNsYXNzIFB5dGhvbkluZGVudGVyCiAKICMgU2ltcGxpZmllZCB1c2VyIGludGVyZmFjZQpAQCAtMzUyLDExNiArMzQ4LDg2IEBACiAgICAgcGkucmVmb3JtYXQoKQogIyBlbmQgZGVmIHJlZm9ybWF0X2ZpbHRlcgogCi1jbGFzcyBTdHJpbmdSZWFkZXI6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1Zik6Ci0gICAgICAgIHNlbGYuYnVmID0gYnVmCi0gICAgICAgIHNlbGYucG9zID0gMAotICAgICAgICBzZWxmLmxlbiA9IGxlbihzZWxmLmJ1ZikKLSAgICAjIGVuZCBkZWYgX19pbml0X18KLSAgICBkZWYgcmVhZChzZWxmLCBuID0gMCk6Ci0gICAgICAgIGlmIG4gPD0gMDoKLSAgICAgICAgICAgIG4gPSBzZWxmLmxlbiAtIHNlbGYucG9zCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBuID0gbWluKG4sIHNlbGYubGVuIC0gc2VsZi5wb3MpCi0gICAgICAgICMgZW5kIGlmCi0gICAgICAgIHIgPSBzZWxmLmJ1ZltzZWxmLnBvcyA6IHNlbGYucG9zICsgbl0KLSAgICAgICAgc2VsZi5wb3MgPSBzZWxmLnBvcyArIG4KLSAgICAgICAgcmV0dXJuIHIKLSAgICAjIGVuZCBkZWYgcmVhZAotICAgIGRlZiByZWFkbGluZShzZWxmKToKLSAgICAgICAgaSA9IHNlbGYuYnVmLmZpbmQoJ1xuJywgc2VsZi5wb3MpCi0gICAgICAgIHJldHVybiBzZWxmLnJlYWQoaSArIDEgLSBzZWxmLnBvcykKLSAgICAjIGVuZCBkZWYgcmVhZGxpbmUKLSAgICBkZWYgcmVhZGxpbmVzKHNlbGYpOgotICAgICAgICBsaW5lcyA9IFtdCi0gICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKCkKLSAgICAgICAgd2hpbGUgbGluZToKLSAgICAgICAgICAgIGxpbmVzLmFwcGVuZChsaW5lKQotICAgICAgICAgICAgbGluZSA9IHNlbGYucmVhZGxpbmUoKQotICAgICAgICAjIGVuZCB3aGlsZQotICAgICAgICByZXR1cm4gbGluZXMKLSAgICAjIGVuZCBkZWYgcmVhZGxpbmVzCi0gICAgIyBzZWVrL3RlbGwgZXRjLiBhcmUgbGVmdCBhcyBhbiBleGVyY2lzZSBmb3IgdGhlIHJlYWRlcgotIyBlbmQgY2xhc3MgU3RyaW5nUmVhZGVyCi0KLWNsYXNzIFN0cmluZ1dyaXRlcjoKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuYnVmID0gJycKLSAgICAjIGVuZCBkZWYgX19pbml0X18KLSAgICBkZWYgd3JpdGUoc2VsZiwgcyk6Ci0gICAgICAgIHNlbGYuYnVmID0gc2VsZi5idWYgKyBzCi0gICAgIyBlbmQgZGVmIHdyaXRlCi0gICAgZGVmIGdldHZhbHVlKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5idWYKLSAgICAjIGVuZCBkZWYgZ2V0dmFsdWUKLSMgZW5kIGNsYXNzIFN0cmluZ1dyaXRlcgotCiBkZWYgY29tcGxldGVfc3RyaW5nKHNvdXJjZSwgc3RlcHNpemUgPSBTVEVQU0laRSwgdGFic2l6ZSA9IFRBQlNJWkUsIGV4cGFuZHRhYnMgPSBFWFBBTkRUQUJTKToKLSAgICBpbnB1dCA9IFN0cmluZ1JlYWRlcihzb3VyY2UpCi0gICAgb3V0cHV0ID0gU3RyaW5nV3JpdGVyKCkKKyAgICBpbnB1dCA9IGlvLkJ5dGVzSU8oc291cmNlKQorICAgIG91dHB1dCA9IGlvLkJ5dGVzSU8oKQogICAgIHBpID0gUHl0aG9uSW5kZW50ZXIoaW5wdXQsIG91dHB1dCwgc3RlcHNpemUsIHRhYnNpemUsIGV4cGFuZHRhYnMpCiAgICAgcGkuY29tcGxldGUoKQogICAgIHJldHVybiBvdXRwdXQuZ2V0dmFsdWUoKQogIyBlbmQgZGVmIGNvbXBsZXRlX3N0cmluZwogCiBkZWYgZGVsZXRlX3N0cmluZyhzb3VyY2UsIHN0ZXBzaXplID0gU1RFUFNJWkUsIHRhYnNpemUgPSBUQUJTSVpFLCBleHBhbmR0YWJzID0gRVhQQU5EVEFCUyk6Ci0gICAgaW5wdXQgPSBTdHJpbmdSZWFkZXIoc291cmNlKQotICAgIG91dHB1dCA9IFN0cmluZ1dyaXRlcigpCisgICAgaW5wdXQgPSBpby5CeXRlc0lPKHNvdXJjZSkKKyAgICBvdXRwdXQgPSBpby5CeXRlc0lPKCkKICAgICBwaSA9IFB5dGhvbkluZGVudGVyKGlucHV0LCBvdXRwdXQsIHN0ZXBzaXplLCB0YWJzaXplLCBleHBhbmR0YWJzKQogICAgIHBpLmRlbGV0ZSgpCiAgICAgcmV0dXJuIG91dHB1dC5nZXR2YWx1ZSgpCiAjIGVuZCBkZWYgZGVsZXRlX3N0cmluZwogCiBkZWYgcmVmb3JtYXRfc3RyaW5nKHNvdXJjZSwgc3RlcHNpemUgPSBTVEVQU0laRSwgdGFic2l6ZSA9IFRBQlNJWkUsIGV4cGFuZHRhYnMgPSBFWFBBTkRUQUJTKToKLSAgICBpbnB1dCA9IFN0cmluZ1JlYWRlcihzb3VyY2UpCi0gICAgb3V0cHV0ID0gU3RyaW5nV3JpdGVyKCkKKyAgICBpbnB1dCA9IGlvLkJ5dGVzSU8oc291cmNlKQorICAgIG91dHB1dCA9IGlvLkJ5dGVzSU8oKQogICAgIHBpID0gUHl0aG9uSW5kZW50ZXIoaW5wdXQsIG91dHB1dCwgc3RlcHNpemUsIHRhYnNpemUsIGV4cGFuZHRhYnMpCiAgICAgcGkucmVmb3JtYXQoKQogICAgIHJldHVybiBvdXRwdXQuZ2V0dmFsdWUoKQogIyBlbmQgZGVmIHJlZm9ybWF0X3N0cmluZwogCitkZWYgbWFrZV9iYWNrdXAoZmlsZW5hbWUpOgorICAgIGltcG9ydCBvcywgb3MucGF0aAorICAgIGJhY2t1cCA9IGZpbGVuYW1lICsgJ34nCisgICAgaWYgb3MucGF0aC5sZXhpc3RzKGJhY2t1cCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnJlbW92ZShiYWNrdXApCisgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgIHByaW50KCJDYW4ndCByZW1vdmUgYmFja3VwICVyIiAlIChiYWNrdXAsKSwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAjIGVuZCB0cnkKKyAgICAjIGVuZCBpZgorICAgIHRyeToKKyAgICAgICAgb3MucmVuYW1lKGZpbGVuYW1lLCBiYWNrdXApCisgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICBwcmludCgiQ2FuJ3QgcmVuYW1lICVyIHRvICVyIiAlIChmaWxlbmFtZSwgYmFja3VwKSwgZmlsZT1zeXMuc3RkZXJyKQorICAgICMgZW5kIHRyeQorIyBlbmQgZGVmIG1ha2VfYmFja3VwCisKIGRlZiBjb21wbGV0ZV9maWxlKGZpbGVuYW1lLCBzdGVwc2l6ZSA9IFNURVBTSVpFLCB0YWJzaXplID0gVEFCU0laRSwgZXhwYW5kdGFicyA9IEVYUEFORFRBQlMpOgotICAgIHNvdXJjZSA9IG9wZW4oZmlsZW5hbWUsICdyJykucmVhZCgpCisgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAncicpIGFzIGY6CisgICAgICAgIHNvdXJjZSA9IGYucmVhZCgpCisgICAgIyBlbmQgd2l0aAogICAgIHJlc3VsdCA9IGNvbXBsZXRlX3N0cmluZyhzb3VyY2UsIHN0ZXBzaXplLCB0YWJzaXplLCBleHBhbmR0YWJzKQogICAgIGlmIHNvdXJjZSA9PSByZXN1bHQ6IHJldHVybiAwCiAgICAgIyBlbmQgaWYKLSAgICBpbXBvcnQgb3MKLSAgICB0cnk6IG9zLnJlbmFtZShmaWxlbmFtZSwgZmlsZW5hbWUgKyAnficpCi0gICAgZXhjZXB0IG9zLmVycm9yOiBwYXNzCi0gICAgIyBlbmQgdHJ5Ci0gICAgZiA9IG9wZW4oZmlsZW5hbWUsICd3JykKLSAgICBmLndyaXRlKHJlc3VsdCkKLSAgICBmLmNsb3NlKCkKKyAgICBtYWtlX2JhY2t1cChmaWxlbmFtZSkKKyAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICd3JykgYXMgZjoKKyAgICAgICAgZi53cml0ZShyZXN1bHQpCisgICAgIyBlbmQgd2l0aAogICAgIHJldHVybiAxCiAjIGVuZCBkZWYgY29tcGxldGVfZmlsZQogCiBkZWYgZGVsZXRlX2ZpbGUoZmlsZW5hbWUsIHN0ZXBzaXplID0gU1RFUFNJWkUsIHRhYnNpemUgPSBUQUJTSVpFLCBleHBhbmR0YWJzID0gRVhQQU5EVEFCUyk6Ci0gICAgc291cmNlID0gb3BlbihmaWxlbmFtZSwgJ3InKS5yZWFkKCkKKyAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICdyJykgYXMgZjoKKyAgICAgICAgc291cmNlID0gZi5yZWFkKCkKKyAgICAjIGVuZCB3aXRoCiAgICAgcmVzdWx0ID0gZGVsZXRlX3N0cmluZyhzb3VyY2UsIHN0ZXBzaXplLCB0YWJzaXplLCBleHBhbmR0YWJzKQogICAgIGlmIHNvdXJjZSA9PSByZXN1bHQ6IHJldHVybiAwCiAgICAgIyBlbmQgaWYKLSAgICBpbXBvcnQgb3MKLSAgICB0cnk6IG9zLnJlbmFtZShmaWxlbmFtZSwgZmlsZW5hbWUgKyAnficpCi0gICAgZXhjZXB0IG9zLmVycm9yOiBwYXNzCi0gICAgIyBlbmQgdHJ5Ci0gICAgZiA9IG9wZW4oZmlsZW5hbWUsICd3JykKLSAgICBmLndyaXRlKHJlc3VsdCkKLSAgICBmLmNsb3NlKCkKKyAgICBtYWtlX2JhY2t1cChmaWxlbmFtZSkKKyAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICd3JykgYXMgZjoKKyAgICAgICAgZi53cml0ZShyZXN1bHQpCisgICAgIyBlbmQgd2l0aAogICAgIHJldHVybiAxCiAjIGVuZCBkZWYgZGVsZXRlX2ZpbGUKIAogZGVmIHJlZm9ybWF0X2ZpbGUoZmlsZW5hbWUsIHN0ZXBzaXplID0gU1RFUFNJWkUsIHRhYnNpemUgPSBUQUJTSVpFLCBleHBhbmR0YWJzID0gRVhQQU5EVEFCUyk6Ci0gICAgc291cmNlID0gb3BlbihmaWxlbmFtZSwgJ3InKS5yZWFkKCkKKyAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICdyJykgYXMgZjoKKyAgICAgICAgc291cmNlID0gZi5yZWFkKCkKKyAgICAjIGVuZCB3aXRoCiAgICAgcmVzdWx0ID0gcmVmb3JtYXRfc3RyaW5nKHNvdXJjZSwgc3RlcHNpemUsIHRhYnNpemUsIGV4cGFuZHRhYnMpCiAgICAgaWYgc291cmNlID09IHJlc3VsdDogcmV0dXJuIDAKICAgICAjIGVuZCBpZgotICAgIGltcG9ydCBvcwotICAgIHRyeTogb3MucmVuYW1lKGZpbGVuYW1lLCBmaWxlbmFtZSArICd+JykKLSAgICBleGNlcHQgb3MuZXJyb3I6IHBhc3MKLSAgICAjIGVuZCB0cnkKLSAgICBmID0gb3BlbihmaWxlbmFtZSwgJ3cnKQotICAgIGYud3JpdGUocmVzdWx0KQotICAgIGYuY2xvc2UoKQorICAgIG1ha2VfYmFja3VwKGZpbGVuYW1lKQorICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3cnKSBhcyBmOgorICAgICAgICBmLndyaXRlKHJlc3VsdCkKKyAgICAjIGVuZCB3aXRoCiAgICAgcmV0dXJuIDEKICMgZW5kIGRlZiByZWZvcm1hdF9maWxlCiAKQEAgLTQ3NCw3ICs0NDAsNyBAQAogLXIgICAgICAgICA6IHJlZm9ybWF0IGEgY29tcGxldGVkIHByb2dyYW0gKHVzZSAjZW5kIGRpcmVjdGl2ZXMpCiAtcyBzdGVwc2l6ZTogaW5kZW50YXRpb24gc3RlcCAoZGVmYXVsdCAlKFNURVBTSVpFKWQpCiAtdCB0YWJzaXplIDogdGhlIHdvcnRoIGluIHNwYWNlcyBvZiBhIHRhYiAoZGVmYXVsdCAlKFRBQlNJWkUpZCkKLS1lICAgICAgICAgOiBleHBhbmQgVEFCcyBpbnRvIHNwYWNlcyAoZGVmYWlsdCBPRkYpCistZSAgICAgICAgIDogZXhwYW5kIFRBQnMgaW50byBzcGFjZXMgKGRlZmF1bHQgT0ZGKQogW2ZpbGVdIC4uLiA6IGZpbGVzIGFyZSBjaGFuZ2VkIGluIHBsYWNlLCB3aXRoIGJhY2t1cHMgaW4gZmlsZX4KIElmIG5vIGZpbGVzIGFyZSBzcGVjaWZpZWQgb3IgYSBzaW5nbGUgLSBpcyBnaXZlbiwKIHRoZSBwcm9ncmFtIGFjdHMgYXMgYSBmaWx0ZXIgKHJlYWRzIHN0ZGluLCB3cml0ZXMgc3Rkb3V0KS4KQEAgLTUxNyw3ICs0ODMsNyBAQAogICAgICAgICBlbGlmIG8gPT0gJy10JzoKICAgICAgICAgICAgIHRhYnNpemUgPSBpbnQoYSkKICAgICAgICAgZWxpZiBvID09ICctZSc6Ci0gICAgICAgICAgICBleHBhbmR0YWJzID0gMQorICAgICAgICAgICAgZXhwYW5kdGFicyA9IFRydWUKICAgICAgICAgIyBlbmQgaWYKICAgICAjIGVuZCBmb3IKICAgICBpZiBub3QgYWN0aW9uOgpkaWZmIC0tZ2l0IGEvVG9vbHMvc2NyaXB0cy9zZXJ2ZS5weSBiL1Rvb2xzL3NjcmlwdHMvc2VydmUucHkKaW5kZXggNTAwNjFkNS4uMzk5ZGExYSAxMDA3NTUKLS0tIGEvVG9vbHMvc2NyaXB0cy9zZXJ2ZS5weQorKysgYi9Ub29scy9zY3JpcHRzL3NlcnZlLnB5CkBAIC0yLDcgKzIsNyBAQAogJycnCiBTbWFsbCB3c2dpcmVmIGJhc2VkIHdlYiBzZXJ2ZXIuIFRha2VzIGEgcGF0aCB0byBzZXJ2ZSBmcm9tIGFuZCBhbgogb3B0aW9uYWwgcG9ydCBudW1iZXIgKGRlZmF1bHRzIHRvIDgwMDApLCB0aGVuIHRyaWVzIHRvIHNlcnZlIGZpbGVzLgotTWltZSB0eXBlcyBhcmUgZ3Vlc3NlZCBmcm9tIHRoZSBmaWxlIG5hbWVzLCA0MDQgZXJyb3JzIGFyZSB0aHJvd24KK01pbWUgdHlwZXMgYXJlIGd1ZXNzZWQgZnJvbSB0aGUgZmlsZSBuYW1lcywgNDA0IGVycm9ycyBhcmUgcmFpc2VkCiBpZiB0aGUgZmlsZSBpcyBub3QgZm91bmQuIFVzZWQgZm9yIHRoZSBtYWtlIHNlcnZlIHRhcmdldCBpbiBEb2MuCiAnJycKIGltcG9ydCBzeXMKZGlmZiAtLWdpdCBhL1Rvb2xzL3NjcmlwdHMvc3ZuZW9sLnB5IGIvVG9vbHMvc2NyaXB0cy9zdm5lb2wucHkKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQpkaWZmIC0tZ2l0IGEvVG9vbHMvc3NsL2dldC1yZW1vdGUtY2VydGlmaWNhdGUucHkgYi9Ub29scy9zc2wvZ2V0LXJlbW90ZS1jZXJ0aWZpY2F0ZS5weQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmRpZmYgLS1naXQgYS9Ub29scy91bmljb2RlL2NvbXBhcmVjb2RlY3MucHkgYi9Ub29scy91bmljb2RlL2NvbXBhcmVjb2RlY3MucHkKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQpkaWZmIC0tZ2l0IGEvY29uZmlnLmd1ZXNzIGIvY29uZmlnLmd1ZXNzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFmNWM1MGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcuZ3Vlc3MKQEAgLTAsMCArMSwxNDIwIEBACisjISAvYmluL3NoCisjIEF0dGVtcHQgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUuCisjICAgQ29weXJpZ2h0IDE5OTItMjAxNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKwordGltZXN0YW1wPScyMDE0LTAzLTIzJworCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQKKyMgcHJvZ3JhbS4gIFRoaXMgRXhjZXB0aW9uIGlzIGFuIGFkZGl0aW9uYWwgcGVybWlzc2lvbiB1bmRlciBzZWN0aW9uIDcKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDMgKCJHUEx2MyIpLgorIworIyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIuCisjCisjIFlvdSBjYW4gZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIHNjcmlwdCBmcm9tOgorIyBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLmd1ZXNzO2hiPUhFQUQKKyMKKyMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB3aXRoIGEgQ2hhbmdlTG9nIGVudHJ5IHRvIGNvbmZpZy1wYXRjaGVzQGdudS5vcmcuCisKKworbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCisKK3VzYWdlPSJcCitVc2FnZTogJDAgW09QVElPTl0KKworT3V0cHV0IHRoZSBjb25maWd1cmF0aW9uIG5hbWUgb2YgdGhlIHN5c3RlbSBcYCRtZScgaXMgcnVuIG9uLgorCitPcGVyYXRpb24gbW9kZXM6CisgIC1oLCAtLWhlbHAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtdCwgLS10aW1lLXN0YW1wICAgcHJpbnQgZGF0ZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgdGhlbiBleGl0CisgIC12LCAtLXZlcnNpb24gICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0CisKK1JlcG9ydCBidWdzIGFuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4iCisKK3ZlcnNpb249IlwKK0dOVSBjb25maWcuZ3Vlc3MgKCR0aW1lc3RhbXApCisKK09yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lci4KK0NvcHlyaWdodCAxOTkyLTIwMTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCit3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCisKK2hlbHA9IgorVHJ5IFxgJG1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorCisjIFBhcnNlIGNvbW1hbmQgbGluZQord2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtLXRpbWUtc3RhbXAgfCAtLXRpbWUqIHwgLXQgKQorICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCA7OworICAgIC0tdmVyc2lvbiB8IC12ICkKKyAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDs7CisgICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCisgICAgICAgc2hpZnQ7IGJyZWFrIDs7CisgICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgorICAgICAgIGJyZWFrIDs7CisgICAgLSogKQorICAgICAgIGVjaG8gIiRtZTogaW52YWxpZCBvcHRpb24gJDEkaGVscCIgPiYyCisgICAgICAgZXhpdCAxIDs7CisgICAgKiApCisgICAgICAgYnJlYWsgOzsKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0ICQjICE9IDA7IHRoZW4KKyAgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCisgIGV4aXQgMQorZmkKKwordHJhcCAnZXhpdCAxJyAxIDIgMTUKKworIyBDQ19GT1JfQlVJTEQgLS0gY29tcGlsZXIgdXNlZCBieSB0aGlzIHNjcmlwdC4gTm90ZSB0aGF0IHRoZSB1c2Ugb2YgYQorIyBjb21waWxlciB0byBhaWQgaW4gc3lzdGVtIGRldGVjdGlvbiBpcyBkaXNjb3VyYWdlZCBhcyBpdCByZXF1aXJlcworIyB0ZW1wb3JhcnkgZmlsZXMgdG8gYmUgY3JlYXRlZCBhbmQsIGFzIHlvdSBjYW4gc2VlIGJlbG93LCBpdCBpcyBhCisjIGhlYWRhY2hlIHRvIGRlYWwgd2l0aCBpbiBhIHBvcnRhYmxlIGZhc2hpb24uCisKKyMgSGlzdG9yaWNhbGx5LCBgQ0NfRk9SX0JVSUxEJyB1c2VkIHRvIGJlIG5hbWVkIGBIT1NUX0NDJy4gV2Ugc3RpbGwKKyMgdXNlIGBIT1NUX0NDJyBpZiBkZWZpbmVkLCBidXQgaXQgaXMgZGVwcmVjYXRlZC4KKworIyBQb3J0YWJsZSB0bXAgZGlyZWN0b3J5IGNyZWF0aW9uIGluc3BpcmVkIGJ5IHRoZSBBdXRvY29uZiB0ZWFtLgorCitzZXRfY2NfZm9yX2J1aWxkPScKK3RyYXAgImV4aXRjb2RlPVwkPzsgKHJtIC1mIFwkdG1wZmlsZXMgMj4vZGV2L251bGw7IHJtZGlyIFwkdG1wIDI+L2Rldi9udWxsKSAmJiBleGl0IFwkZXhpdGNvZGUiIDAgOwordHJhcCAicm0gLWYgXCR0bXBmaWxlcyAyPi9kZXYvbnVsbDsgcm1kaXIgXCR0bXAgMj4vZGV2L251bGw7IGV4aXQgMSIgMSAyIDEzIDE1IDsKKzogJHtUTVBESVI9L3RtcH0gOworIHsgdG1wPWAodW1hc2sgMDc3ICYmIG1rdGVtcCAtZCAiJFRNUERJUi9jZ1hYWFhYWCIpIDI+L2Rldi9udWxsYCAmJiB0ZXN0IC1uICIkdG1wIiAmJiB0ZXN0IC1kICIkdG1wIiA7IH0gfHwKKyB7IHRlc3QgLW4gIiRSQU5ET00iICYmIHRtcD0kVE1QRElSL2NnJCQtJFJBTkRPTSAmJiAodW1hc2sgMDc3ICYmIG1rZGlyICR0bXApIDsgfSB8fAorIHsgdG1wPSRUTVBESVIvY2ctJCQgJiYgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKSAmJiBlY2hvICJXYXJuaW5nOiBjcmVhdGluZyBpbnNlY3VyZSB0ZW1wIGRpcmVjdG9yeSIgPiYyIDsgfSB8fAorIHsgZWNobyAiJG1lOiBjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAkVE1QRElSIiA+JjIgOyBleGl0IDEgOyB9IDsKK2R1bW15PSR0bXAvZHVtbXkgOwordG1wZmlsZXM9IiRkdW1teS5jICRkdW1teS5vICRkdW1teS5yZWwgJGR1bW15IiA7CitjYXNlICRDQ19GT1JfQlVJTEQsJEhPU1RfQ0MsJENDIGluCisgLCwpICAgIGVjaG8gImludCB4OyIgPiAkZHVtbXkuYyA7CisJZm9yIGMgaW4gY2MgZ2NjIGM4OSBjOTkgOyBkbworCSAgaWYgKCRjIC1jIC1vICRkdW1teS5vICRkdW1teS5jKSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJICAgICBDQ19GT1JfQlVJTEQ9IiRjIjsgYnJlYWsgOworCSAgZmkgOworCWRvbmUgOworCWlmIHRlc3QgeCIkQ0NfRk9SX0JVSUxEIiA9IHggOyB0aGVuCisJICBDQ19GT1JfQlVJTEQ9bm9fY29tcGlsZXJfZm91bmQgOworCWZpCisJOzsKKyAsLCopICAgQ0NfRk9SX0JVSUxEPSRDQyA7OworICwqLCopICBDQ19GT1JfQlVJTEQ9JEhPU1RfQ0MgOzsKK2VzYWMgOyBzZXRfY2NfZm9yX2J1aWxkPSA7JworCisjIFRoaXMgaXMgbmVlZGVkIHRvIGZpbmQgdW5hbWUgb24gYSBQeXJhbWlkIE9TeCB3aGVuIHJ1biBpbiB0aGUgQlNEIHVuaXZlcnNlLgorIyAoZ2hhemlAbm9jLnJ1dGdlcnMuZWR1IDE5OTQtMDgtMjQpCitpZiAodGVzdCAtZiAvLmF0dGJpbi91bmFtZSkgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCVBBVEg9JFBBVEg6Ly5hdHRiaW4gOyBleHBvcnQgUEFUSAorZmkKKworVU5BTUVfTUFDSElORT1gKHVuYW1lIC1tKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfTUFDSElORT11bmtub3duCitVTkFNRV9SRUxFQVNFPWAodW5hbWUgLXIpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9SRUxFQVNFPXVua25vd24KK1VOQU1FX1NZU1RFTT1gKHVuYW1lIC1zKSAyPi9kZXYvbnVsbGAgIHx8IFVOQU1FX1NZU1RFTT11bmtub3duCitVTkFNRV9WRVJTSU9OPWAodW5hbWUgLXYpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9WRVJTSU9OPXVua25vd24KKworY2FzZSAiJHtVTkFNRV9TWVNURU19IiBpbgorTGludXh8R05VfEdOVS8qKQorCSMgSWYgdGhlIHN5c3RlbSBsYWNrcyBhIGNvbXBpbGVyLCB0aGVuIGp1c3QgcGljayBnbGliYy4KKwkjIFdlIGNvdWxkIHByb2JhYmx5IHRyeSBoYXJkZXIuCisJTElCQz1nbnUKKworCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwljYXQgPDwtRU9GID4gJGR1bW15LmMKKwkjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKwkjaWYgZGVmaW5lZChfX1VDTElCQ19fKQorCUxJQkM9dWNsaWJjCisJI2VsaWYgZGVmaW5lZChfX2RpZXRsaWJjX18pCisJTElCQz1kaWV0bGliYworCSNlbHNlCisJTElCQz1nbnUKKwkjZW5kaWYKKwlFT0YKKwlldmFsIGAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgZ3JlcCAnXkxJQkMnIHwgc2VkICdzLCAsLGcnYAorCTs7Citlc2FjCisKKyMgTm90ZTogb3JkZXIgaXMgc2lnbmlmaWNhbnQgLSB0aGUgY2FzZSBicmFuY2hlcyBhcmUgbm90IGV4Y2x1c2l2ZS4KKworY2FzZSAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiBpbgorICAgICo6TmV0QlNEOio6KikKKwkjIE5ldEJTRCAobmJzZCkgdGFyZ2V0cyBzaG91bGQgKHdoZXJlIGFwcGxpY2FibGUpIG1hdGNoIG9uZSBvcgorCSMgbW9yZSBvZiB0aGUgdHVwbGVzOiAqLSotbmV0YnNkZWxmKiwgKi0qLW5ldGJzZGFvdXQqLAorCSMgKi0qLW5ldGJzZGVjb2ZmKiBhbmQgKi0qLW5ldGJzZCouICBGb3IgdGFyZ2V0cyB0aGF0IHJlY2VudGx5CisJIyBzd2l0Y2hlZCB0byBFTEYsICotKi1uZXRic2QqIHdvdWxkIHNlbGVjdCB0aGUgb2xkCisJIyBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGlzIHByb3ZpZGVzIGJvdGggZm9yd2FyZAorCSMgY29tcGF0aWJpbGl0eSBhbmQgYSBjb25zaXN0ZW50IG1lY2hhbmlzbSBmb3Igc2VsZWN0aW5nIHRoZQorCSMgb2JqZWN0IGZpbGUgZm9ybWF0LgorCSMKKwkjIE5vdGU6IE5ldEJTRCBkb2Vzbid0IHBhcnRpY3VsYXJseSBjYXJlIGFib3V0IHRoZSB2ZW5kb3IKKwkjIHBvcnRpb24gb2YgdGhlIG5hbWUuICBXZSBhbHdheXMgc2V0IGl0IHRvICJ1bmtub3duIi4KKwlzeXNjdGw9InN5c2N0bCAtbiBody5tYWNoaW5lX2FyY2giCisJVU5BTUVfTUFDSElORV9BUkNIPWAoL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBcCisJICAgIC91c3Ivc2Jpbi8kc3lzY3RsIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bilgCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgorCSAgICBhcm1lYikgbWFjaGluZT1hcm1lYi11bmtub3duIDs7CisJICAgIGFybSopIG1hY2hpbmU9YXJtLXVua25vd24gOzsKKwkgICAgc2gzZWwpIG1hY2hpbmU9c2hsLXVua25vd24gOzsKKwkgICAgc2gzZWIpIG1hY2hpbmU9c2gtdW5rbm93biA7OworCSAgICBzaDVlbCkgbWFjaGluZT1zaDVsZS11bmtub3duIDs7CisJICAgICopIG1hY2hpbmU9JHtVTkFNRV9NQUNISU5FX0FSQ0h9LXVua25vd24gOzsKKwllc2FjCisJIyBUaGUgT3BlcmF0aW5nIFN5c3RlbSBpbmNsdWRpbmcgb2JqZWN0IGZvcm1hdCwgaWYgaXQgaGFzIHN3aXRjaGVkCisJIyB0byBFTEYgcmVjZW50bHksIG9yIHdpbGwgaW4gdGhlIGZ1dHVyZS4KKwljYXNlICIke1VOQU1FX01BQ0hJTkVfQVJDSH0iIGluCisJICAgIGFybSp8aTM4NnxtNjhrfG5zMzJrfHNoMyp8c3BhcmN8dmF4KQorCQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJCWlmIGVjaG8gX19FTEZfXyB8ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCBcCisJCQl8IGdyZXAgLXEgX19FTEZfXworCQl0aGVuCisJCSAgICAjIE9uY2UgYWxsIHV0aWxpdGllcyBjYW4gYmUgRUNPRkYgKG5ldGJzZGVjb2ZmKSBvciBhLm91dCAobmV0YnNkYW91dCkuCisJCSAgICAjIFJldHVybiBuZXRic2QgZm9yIGVpdGhlci4gIEZJWD8KKwkJICAgIG9zPW5ldGJzZAorCQllbHNlCisJCSAgICBvcz1uZXRic2RlbGYKKwkJZmkKKwkJOzsKKwkgICAgKikKKwkJb3M9bmV0YnNkCisJCTs7CisJZXNhYworCSMgVGhlIE9TIHJlbGVhc2UKKwkjIERlYmlhbiBHTlUvTmV0QlNEIG1hY2hpbmVzIGhhdmUgYSBkaWZmZXJlbnQgdXNlcmxhbmQsIGFuZAorCSMgdGh1cywgbmVlZCBhIGRpc3RpbmN0IHRyaXBsZXQuIEhvd2V2ZXIsIHRoZXkgZG8gbm90IG5lZWQKKwkjIGtlcm5lbCB2ZXJzaW9uIGluZm9ybWF0aW9uLCBzbyBpdCBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhCisJIyBzdWl0YWJsZSB0YWcsIGluIHRoZSBzdHlsZSBvZiBsaW51eC1nbnUuCisJY2FzZSAiJHtVTkFNRV9WRVJTSU9OfSIgaW4KKwkgICAgRGViaWFuKikKKwkJcmVsZWFzZT0nLWdudScKKwkJOzsKKwkgICAgKikKKwkJcmVsZWFzZT1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLV9dLiovXC4vJ2AKKwkJOzsKKwllc2FjCisJIyBTaW5jZSBDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU06CisJIyBjb250YWlucyByZWR1bmRhbnQgaW5mb3JtYXRpb24sIHRoZSBzaG9ydGVyIGZvcm06CisJIyBDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTSBpcyB1c2VkLgorCWVjaG8gIiR7bWFjaGluZX0tJHtvc30ke3JlbGVhc2V9IgorCWV4aXQgOzsKKyAgICAqOkJpdHJpZzoqOiopCisJVU5BTUVfTUFDSElORV9BUkNIPWBhcmNoIHwgc2VkICdzL0JpdHJpZy4vLydgCisJZWNobyAke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93bi1iaXRyaWcke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6T3BlbkJTRDoqOiopCisJVU5BTUVfTUFDSElORV9BUkNIPWBhcmNoIHwgc2VkICdzL09wZW5CU0QuLy8nYAorCWVjaG8gJHtVTkFNRV9NQUNISU5FX0FSQ0h9LXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpla2tvQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1la2tvYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlNvbGlkQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zb2xpZGJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWFjcHBjOk1pckJTRDoqOiopCisJZWNobyBwb3dlcnBjLXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOk1pckJTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBhbHBoYTpPU0YxOio6KikKKwljYXNlICRVTkFNRV9SRUxFQVNFIGluCisJKjQuMCkKKwkJVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDN9J2AKKwkJOzsKKwkqNS4qKQorCQlVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkNH0nYAorCQk7OworCWVzYWMKKwkjIEFjY29yZGluZyB0byBDb21wYXEsIC91c3Ivc2Jpbi9wc3JpbmZvIGhhcyBiZWVuIGF2YWlsYWJsZSBvbgorCSMgT1NGLzEgYW5kIFRydTY0IHN5c3RlbXMgcHJvZHVjZWQgc2luY2UgMTk5NS4gIEkgaG9wZSB0aGF0CisJIyBjb3ZlcnMgbW9zdCBzeXN0ZW1zIHJ1bm5pbmcgdG9kYXkuICBUaGlzIGNvZGUgcGlwZXMgdGhlIENQVQorCSMgdHlwZXMgdGhyb3VnaCBoZWFkIC1uIDEsIHNvIHdlIG9ubHkgZGV0ZWN0IHRoZSB0eXBlIG9mIENQVSAwLgorCUFMUEhBX0NQVV9UWVBFPWAvdXNyL3NiaW4vcHNyaW5mbyAtdiB8IHNlZCAtbiAtZSAncy9eICBUaGUgYWxwaGEgXCguKlwpIHByb2Nlc3Nvci4qJC9cMS9wJyB8IGhlYWQgLW4gMWAKKwljYXNlICIkQUxQSEFfQ1BVX1RZUEUiIGluCisJICAgICJFVjQgKDIxMDY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiRVY0LjUgKDIxMDY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiTENBNCAoMjEwNjYvMjEwNjgpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7CisJICAgICJFVjUgKDIxMTY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1IiA7OworCSAgICAiRVY1LjYgKDIxMTY0QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NTYiIDs7CisJICAgICJFVjUuNiAoMjExNjRQQykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU2IiA7OworCSAgICAiRVY1LjcgKDIxMTY0UEMpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NyIgOzsKKwkgICAgIkVWNiAoMjEyNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjYiIDs7CisJICAgICJFVjYuNyAoMjEyNjRBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2NyIgOzsKKwkgICAgIkVWNi44Q0IgKDIxMjY0QykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7CisJICAgICJFVjYuOEFMICgyMTI2NEIpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OworCSAgICAiRVY2LjhDWCAoMjEyNjREKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKKwkgICAgIkVWNi45QSAoMjEyNjQvRVY2OUEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY5IiA7OworCSAgICAiRVY3ICgyMTM2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NyIgOzsKKwkgICAgIkVWNy45ICgyMTM2NEEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjc5IiA7OworCWVzYWMKKwkjIEEgUG4ubiB2ZXJzaW9uIGlzIGEgcGF0Y2hlZCB2ZXJzaW9uLgorCSMgQSBWbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCB2ZXJzaW9uLgorCSMgQSBUbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCBmaWVsZCB0ZXN0IHZlcnNpb24uCisJIyBBIFhuLm4gdmVyc2lvbiBpcyBhbiB1bnJlbGVhc2VkIGV4cGVyaW1lbnRhbCBiYXNlbGV2ZWwuCisJIyAxLjIgdXNlcyAiMS4yIiBmb3IgdW5hbWUgLXIuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1vc2ZgZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL15bUFZUWF0vLycgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisJIyBSZXNldCBFWElUIHRyYXAgYmVmb3JlIGV4aXRpbmcgdG8gYXZvaWQgc3B1cmlvdXMgbm9uLXplcm8gZXhpdCBjb2RlLgorCWV4aXRjb2RlPSQ/CisJdHJhcCAnJyAwCisJZXhpdCAkZXhpdGNvZGUgOzsKKyAgICBBbHBoYVwgKjpXaW5kb3dzX05UKjoqKQorCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KKwkjIFNob3VsZCB3ZSBjaGFuZ2UgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQKKwkjIG9mIHRoZSBzcGVjaWZpYyBBbHBoYSBtb2RlbD8KKwllY2hvIGFscGhhLXBjLWludGVyaXgKKwlleGl0IDs7CisgICAgMjEwNjQ6V2luZG93c19OVDo1MDozKQorCWVjaG8gYWxwaGEtZGVjLXdpbm50My41CisJZXhpdCA7OworICAgIEFtaWdhKjpVTklYX1N5c3RlbV9WOjQuMDoqKQorCWVjaG8gbTY4ay11bmtub3duLXN5c3Y0CisJZXhpdCA7OworICAgICo6W0FhXW1pZ2FbT29dW1NzXToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYW1pZ2FvcworCWV4aXQgOzsKKyAgICAqOltNbV1vcnBoW09vXVtTc106KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW1vcnBob3MKKwlleGl0IDs7CisgICAgKjpPUy8zOTA6KjoqKQorCWVjaG8gaTM3MC1pYm0tb3BlbmVkaXRpb24KKwlleGl0IDs7CisgICAgKjp6L1ZNOio6KikKKwllY2hvIHMzOTAtaWJtLXp2bW9lCisJZXhpdCA7OworICAgICo6T1M0MDA6KjoqKQorCWVjaG8gcG93ZXJwYy1pYm0tb3M0MDAKKwlleGl0IDs7CisgICAgYXJtOlJJU0MqOjEuWzAxMl0qOip8YXJtOnJpc2NpeDoxLlswMTJdKjoqKQorCWVjaG8gYXJtLWFjb3JuLXJpc2NpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgYXJtKjpyaXNjb3M6KjoqfGFybSo6UklTQ09TOio6KikKKwllY2hvIGFybS11bmtub3duLXJpc2NvcworCWV4aXQgOzsKKyAgICBTUjI/MDE6SEktVVgvTVBQOio6KiB8IFNSODAwMDpISS1VWC9NUFA6KjoqKQorCWVjaG8gaHBwYTEuMS1oaXRhY2hpLWhpdXhtcHAKKwlleGl0IDs7CisgICAgUHlyYW1pZCo6T1N4KjoqOiogfCBNSVMqOk9TeCo6KjoqIHwgTUlTKjpTTVBfREMtT1N4KjoqOiopCisJIyBha2VlQHdwZGlzMDMud3BhZmIuYWYubWlsIChFYXJsZSBGLiBBa2UpIGNvbnRyaWJ1dGVkIE1JUyBhbmQgTklMRS4KKwlpZiB0ZXN0ICJgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsYCIgPSBhdHQgOyB0aGVuCisJCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN5c3YzCisJZWxzZQorCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1ic2QKKwlmaQorCWV4aXQgOzsKKyAgICBOSUxFKjoqOio6ZGNvc3gpCisJZWNobyBweXJhbWlkLXB5cmFtaWQtc3ZyNAorCWV4aXQgOzsKKyAgICBEUlM/NjAwMDp1bml4OjQuMDo2KikKKwllY2hvIHNwYXJjLWljbC1ueDYKKwlleGl0IDs7CisgICAgRFJTPzYwMDA6VU5JWF9TVjo0LjIqOjcqIHwgRFJTPzYwMDA6aXNpczo0LjIqOjcqKQorCWNhc2UgYC91c3IvYmluL3VuYW1lIC1wYCBpbgorCSAgICBzcGFyYykgZWNobyBzcGFyYy1pY2wtbng3OyBleGl0IDs7CisJZXNhYyA7OworICAgIHMzOTB4OlN1bk9TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIHN1bjRIOlN1bk9TOjUuKjoqKQorCWVjaG8gc3BhcmMtaGFsLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIHN1bjQqOlN1bk9TOjUuKjoqIHwgdGFkcG9sZSo6U3VuT1M6NS4qOiopCisJZWNobyBzcGFyYy1zdW4tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgaTg2cGM6QXVyb3JhVVg6NS4qOiogfCBpODZ4ZW46QXVyb3JhVVg6NS4qOiopCisJZWNobyBpMzg2LXBjLWF1cm9yYXV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBpODZwYzpTdW5PUzo1Lio6KiB8IGk4NnhlbjpTdW5PUzo1Lio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJU1VOX0FSQ0g9ImkzODYiCisJIyBJZiB0aGVyZSBpcyBhIGNvbXBpbGVyLCBzZWUgaWYgaXQgaXMgY29uZmlndXJlZCBmb3IgNjQtYml0IG9iamVjdHMuCisJIyBOb3RlIHRoYXQgdGhlIFN1biBjYyBkb2VzIG5vdCB0dXJuIF9fTFA2NF9fIGludG8gMSBsaWtlIGdjYyBkb2VzLgorCSMgVGhpcyB0ZXN0IHdvcmtzIGZvciBib3RoIGNvbXBpbGVycy4KKwlpZiBbICIkQ0NfRk9SX0JVSUxEIiAhPSAnbm9fY29tcGlsZXJfZm91bmQnIF07IHRoZW4KKwkgICAgaWYgKGVjaG8gJyNpZmRlZiBfX2FtZDY0JzsgZWNobyBJU182NEJJVF9BUkNIOyBlY2hvICcjZW5kaWYnKSB8IFwKKwkJKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsKSB8IFwKKwkJZ3JlcCBJU182NEJJVF9BUkNIID4vZGV2L251bGwKKwkgICAgdGhlbgorCQlTVU5fQVJDSD0ieDg2XzY0IgorCSAgICBmaQorCWZpCisJZWNobyAke1NVTl9BUkNIfS1wYy1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40KjpTdW5PUzo2KjoqKQorCSMgQWNjb3JkaW5nIHRvIGNvbmZpZy5zdWIsIHRoaXMgaXMgdGhlIHByb3BlciB3YXkgdG8gY2Fub25pY2FsaXplCisJIyBTdW5PUzYuICBIYXJkIHRvIGd1ZXNzIGV4YWN0bHkgd2hhdCBTdW5PUzYgd2lsbCBiZSBsaWtlLCBidXQKKwkjIGl0J3MgbGlrZWx5IHRvIGJlIG1vcmUgbGlrZSBTb2xhcmlzIHRoYW4gU3VuT1M0LgorCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMzYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIHN1bjQqOlN1bk9TOio6KikKKwljYXNlICJgL3Vzci9iaW4vYXJjaCAta2AiIGluCisJICAgIFNlcmllcyp8UzQqKQorCQlVTkFNRV9SRUxFQVNFPWB1bmFtZSAtdmAKKwkJOzsKKwllc2FjCisJIyBKYXBhbmVzZSBMYW5ndWFnZSB2ZXJzaW9ucyBoYXZlIGEgdmVyc2lvbiBudW1iZXIgbGlrZSBgNC4xLjMtSkwnLgorCWVjaG8gc3BhcmMtc3VuLXN1bm9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fLydgCisJZXhpdCA7OworICAgIHN1bjMqOlN1bk9TOio6KikKKwllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBzdW4qOio6NC4yQlNEOiopCisJVU5BTUVfUkVMRUFTRT1gKHNlZCAxcSAvZXRjL21vdGQgfCBhd2sgJ3twcmludCBzdWJzdHIoJDUsMSwzKX0nKSAyPi9kZXYvbnVsbGAKKwl0ZXN0ICJ4JHtVTkFNRV9SRUxFQVNFfSIgPSAieCIgJiYgVU5BTUVfUkVMRUFTRT0zCisJY2FzZSAiYC9iaW4vYXJjaGAiIGluCisJICAgIHN1bjMpCisJCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJCTs7CisJICAgIHN1bjQpCisJCWVjaG8gc3BhcmMtc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCQk7OworCWVzYWMKKwlleGl0IDs7CisgICAgYXVzaHA6U3VuT1M6KjoqKQorCWVjaG8gc3BhcmMtYXVzcGV4LXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAjIFRoZSBzaXR1YXRpb24gZm9yIE1pTlQgaXMgYSBsaXR0bGUgY29uZnVzaW5nLiAgVGhlIG1hY2hpbmUgbmFtZQorICAgICMgY2FuIGJlIHZpcnR1YWxseSBldmVyeXRoaW5nIChldmVyeXRoaW5nIHdoaWNoIGlzIG5vdAorICAgICMgImF0YXJpc3QiIG9yICJhdGFyaXN0ZSIgYXQgbGVhc3Qgc2hvdWxkIGhhdmUgYSBwcm9jZXNzb3IKKyAgICAjID4gbTY4MDAwKS4gIFRoZSBzeXN0ZW0gbmFtZSByYW5nZXMgZnJvbSAiTWlOVCIgb3ZlciAiRnJlZU1pTlQiCisgICAgIyB0byB0aGUgbG93ZXJjYXNlIHZlcnNpb24gIm1pbnQiIChvciAiZnJlZW1pbnQiKS4gIEZpbmFsbHkKKyAgICAjIHRoZSBzeXN0ZW0gbmFtZSAiVE9TIiBkZW5vdGVzIGEgc3lzdGVtIHdoaWNoIGlzIGFjdHVhbGx5IG5vdAorICAgICMgTWlOVC4gIEJ1dCBNaU5UIGlzIGRvd253YXJkIGNvbXBhdGlibGUgdG8gVE9TLCBzbyB0aGlzIHNob3VsZAorICAgICMgYmUgbm8gcHJvYmxlbS4KKyAgICBhdGFyaXN0W2VdOipNaU5UOio6KiB8IGF0YXJpc3RbZV06Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKKwllY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgYXRhcmkqOipNaU5UOio6KiB8IGF0YXJpKjoqbWludDoqOiogfCBhdGFyaXN0W2VdOipUT1M6KjoqKQorCWVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqZmFsY29uKjoqTWlOVDoqOiogfCAqZmFsY29uKjoqbWludDoqOiogfCAqZmFsY29uKjoqVE9TOio6KikKKwllY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWlsYW4qOipNaU5UOio6KiB8IG1pbGFuKjoqbWludDoqOiogfCAqbWlsYW4qOipUT1M6KjoqKQorCWVjaG8gbTY4ay1taWxhbi1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBoYWRlcyo6Kk1pTlQ6KjoqIHwgaGFkZXMqOiptaW50Oio6KiB8ICpoYWRlcyo6KlRPUzoqOiopCisJZWNobyBtNjhrLWhhZGVzLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6Kk1pTlQ6KjoqIHwgKjoqbWludDoqOiogfCAqOipUT1M6KjoqKQorCWVjaG8gbTY4ay11bmtub3duLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG02OGs6bWFjaHRlbjoqOiopCisJZWNobyBtNjhrLWFwcGxlLW1hY2h0ZW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIHBvd2VycGM6bWFjaHRlbjoqOiopCisJZWNobyBwb3dlcnBjLWFwcGxlLW1hY2h0ZW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFJJU0MqOk1hY2g6KjoqKQorCWVjaG8gbWlwcy1kZWMtbWFjaF9ic2Q0LjMKKwlleGl0IDs7CisgICAgUklTQyo6VUxUUklYOio6KikKKwllY2hvIG1pcHMtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgVkFYKjpVTFRSSVgqOio6KikKKwllY2hvIHZheC1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAyMDIwOkNMSVg6KjoqIHwgMjQzMDpDTElYOio6KikKKwllY2hvIGNsaXBwZXItaW50ZXJncmFwaC1jbGl4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtaXBzOio6KjpVTUlQUyB8IG1pcHM6KjoqOlJJU0NvcykKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKyNpZmRlZiBfX2NwbHVzcGx1cworI2luY2x1ZGUgPHN0ZGlvLmg+ICAvKiBmb3IgcHJpbnRmKCkgcHJvdG90eXBlICovCisJaW50IG1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKyNlbHNlCisJaW50IG1haW4gKGFyZ2MsIGFyZ3YpIGludCBhcmdjOyBjaGFyICphcmd2W107IHsKKyNlbmRpZgorCSNpZiBkZWZpbmVkIChob3N0X21pcHMpICYmIGRlZmluZWQgKE1JUFNFQikKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TWVNWKQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3lzdlxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NWUjQpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzdnI0XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfQlNENDMpIHx8IGRlZmluZWQoU1lTVFlQRV9CU0QpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNic2RcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjZW5kaWYKKwkgIGV4aXQgKC0xKTsKKwl9CitFT0YKKwkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJgorCSAgZHVtbXlhcmc9YGVjaG8gIiR7VU5BTUVfUkVMRUFTRX0iIHwgc2VkIC1uICdzL1woWzAtOV0qXCkuKi9cMS9wJ2AgJiYKKwkgIFNZU1RFTV9OQU1FPWAkZHVtbXkgJGR1bW15YXJnYCAmJgorCSAgICB7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KKwllY2hvIG1pcHMtbWlwcy1yaXNjb3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIE1vdG9yb2xhOlBvd2VyTUFYX09TOio6KikKKwllY2hvIHBvd2VycGMtbW90b3JvbGEtcG93ZXJtYXgKKwlleGl0IDs7CisgICAgTW90b3JvbGE6Kjo0LjM6UEw4LSopCisJZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcm1heAorCWV4aXQgOzsKKyAgICBOaWdodF9IYXdrOio6KjpQb3dlck1BWF9PUyB8IFN5bmVyZ3k6UG93ZXJNQVhfT1M6KjoqKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKKwlleGl0IDs7CisgICAgTmlnaHRfSGF3azpQb3dlcl9VTklYOio6KikKKwllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VydW5peAorCWV4aXQgOzsKKyAgICBtODhrOkNYL1VYOjcqOiopCisJZWNobyBtODhrLWhhcnJpcy1jeHV4NworCWV4aXQgOzsKKyAgICBtODhrOio6NCo6UjQqKQorCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2NAorCWV4aXQgOzsKKyAgICBtODhrOio6Myo6UjMqKQorCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MworCWV4aXQgOzsKKyAgICBBVmlpT046ZGd1eDoqOiopCisJIyBERy9VWCByZXR1cm5zIEFWaWlPTiBmb3IgYWxsIGFyY2hpdGVjdHVyZXMKKwlVTkFNRV9QUk9DRVNTT1I9YC91c3IvYmluL3VuYW1lIC1wYAorCWlmIFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMDAgXSB8fCBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTEwIF0KKwl0aGVuCisJICAgIGlmIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0gbTg4a2RndXhlbGZ4IF0gfHwgXAorCSAgICAgICBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IHggXQorCSAgICB0aGVuCisJCWVjaG8gbTg4ay1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQorCSAgICBlbHNlCisJCWVjaG8gbTg4ay1kZy1kZ3V4YmNzJHtVTkFNRV9SRUxFQVNFfQorCSAgICBmaQorCWVsc2UKKwkgICAgZWNobyBpNTg2LWRnLWRndXgke1VOQU1FX1JFTEVBU0V9CisJZmkKKwlleGl0IDs7CisgICAgTTg4KjpEb2xwaGluT1M6KjoqKQkjIERvbHBoaW5PUyAoU1ZSMykKKwllY2hvIG04OGstZG9scGhpbi1zeXN2MworCWV4aXQgOzsKKyAgICBNODgqOio6UjMqOiopCisJIyBEZWx0YSA4OGsgc3lzdGVtIHJ1bm5pbmcgU1ZSMworCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MworCWV4aXQgOzsKKyAgICBYRDg4KjoqOio6KikgIyBUZWt0cm9uaXggWEQ4OCBzeXN0ZW0gcnVubmluZyBVVGVrViAoU1ZSMykKKwllY2hvIG04OGstdGVrdHJvbml4LXN5c3YzCisJZXhpdCA7OworICAgIFRlazQzWzAtOV1bMC05XTpVVGVrOio6KikgIyBUZWt0cm9uaXggNDMwMCBzeXN0ZW0gcnVubmluZyBVVGVrIChCU0QpCisJZWNobyBtNjhrLXRla3Ryb25peC1ic2QKKwlleGl0IDs7CisgICAgKjpJUklYKjoqOiopCisJZWNobyBtaXBzLXNnaS1pcml4YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fL2cnYAorCWV4aXQgOzsKKyAgICA/Pz8/Pz8/PzpBSVg/OlsxMl0uMToyKSAgICMgQUlYIDIuMi4xIG9yIEFJWCAyLjEuMSBpcyBSVC9QQyBBSVguCisJZWNobyByb21wLWlibS1haXggICAgICMgdW5hbWUgLW0gZ2l2ZXMgYW4gOCBoZXgtY29kZSBDUFUgaWQKKwlleGl0IDs7ICAgICAgICAgICAgICAgIyBOb3RlIHRoYXQ6IGVjaG8gIidgdW5hbWUgLXNgJyIgZ2l2ZXMgJ0FJWCAnCisgICAgaSo4NjpBSVg6KjoqKQorCWVjaG8gaTM4Ni1pYm0tYWl4CisJZXhpdCA7OworICAgIGlhNjQ6QUlYOio6KikKKwlpZiBbIC14IC91c3IvYmluL29zbGV2ZWwgXSA7IHRoZW4KKwkJSUJNX1JFVj1gL3Vzci9iaW4vb3NsZXZlbGAKKwllbHNlCisJCUlCTV9SRVY9JHtVTkFNRV9WRVJTSU9OfS4ke1VOQU1FX1JFTEVBU0V9CisJZmkKKwllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWFpeCR7SUJNX1JFVn0KKwlleGl0IDs7CisgICAgKjpBSVg6MjozKQorCWlmIGdyZXAgYm9zMzI1IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJCXNlZCAncy9eCQkvLycgPDwgRU9GID4kZHVtbXkuYworCQkjaW5jbHVkZSA8c3lzL3N5c3RlbWNmZy5oPgorCisJCW1haW4oKQorCQkJeworCQkJaWYgKCFfX3Bvd2VyX3BjKCkpCisJCQkJZXhpdCgxKTsKKwkJCXB1dHMoInBvd2VycGMtaWJtLWFpeDMuMi41Iik7CisJCQlleGl0KDApOworCQkJfQorRU9GCisJCWlmICRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmIFNZU1RFTV9OQU1FPWAkZHVtbXlgCisJCXRoZW4KKwkJCWVjaG8gIiRTWVNURU1fTkFNRSIKKwkJZWxzZQorCQkJZWNobyByczYwMDAtaWJtLWFpeDMuMi41CisJCWZpCisJZWxpZiBncmVwIGJvczMyNCAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJZWNobyByczYwMDAtaWJtLWFpeDMuMi40CisJZWxzZQorCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yCisJZmkKKwlleGl0IDs7CisgICAgKjpBSVg6KjpbNDU2N10pCisJSUJNX0NQVV9JRD1gL3Vzci9zYmluL2xzZGV2IC1DIC1jIHByb2Nlc3NvciAtUyBhdmFpbGFibGUgfCBzZWQgMXEgfCBhd2sgJ3sgcHJpbnQgJDEgfSdgCisJaWYgL3Vzci9zYmluL2xzYXR0ciAtRWwgJHtJQk1fQ1BVX0lEfSB8IGdyZXAgJyBQT1dFUicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCUlCTV9BUkNIPXJzNjAwMAorCWVsc2UKKwkJSUJNX0FSQ0g9cG93ZXJwYworCWZpCisJaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCisJCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCisJZWxzZQorCQlJQk1fUkVWPSR7VU5BTUVfVkVSU0lPTn0uJHtVTkFNRV9SRUxFQVNFfQorCWZpCisJZWNobyAke0lCTV9BUkNIfS1pYm0tYWl4JHtJQk1fUkVWfQorCWV4aXQgOzsKKyAgICAqOkFJWDoqOiopCisJZWNobyByczYwMDAtaWJtLWFpeAorCWV4aXQgOzsKKyAgICBpYm1ydDo0LjRCU0Q6Knxyb21wLWlibTpCU0Q6KikKKwllY2hvIHJvbXAtaWJtLWJzZDQuNAorCWV4aXQgOzsKKyAgICBpYm1ydDoqQlNEOip8cm9tcC1pYm06QlNEOiopICAgICAgICAgICAgIyBjb3ZlcnMgUlQvUEMgQlNEIGFuZAorCWVjaG8gcm9tcC1pYm0tYnNkJHtVTkFNRV9SRUxFQVNFfSAgICMgNC4zIHdpdGggdW5hbWUgYWRkZWQgdG8KKwlleGl0IDs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcG9ydDogcm9tcC1pYm0gQlNEIDQuMworICAgICo6Qk9TWDoqOiopCisJZWNobyByczYwMDAtYnVsbC1ib3N4CisJZXhpdCA7OworICAgIERQWC8yPzAwOkIuTy5TLjoqOiopCisJZWNobyBtNjhrLWJ1bGwtc3lzdjMKKwlleGl0IDs7CisgICAgOTAwMC9bMzRdPz86NC4zYnNkOjEuKjoqKQorCWVjaG8gbTY4ay1ocC1ic2QKKwlleGl0IDs7CisgICAgaHAzMDA6NC40QlNEOio6KiB8IDkwMDAvWzM0XT8/OjQuM2JzZDoyLio6KikKKwllY2hvIG02OGstaHAtYnNkNC40CisJZXhpdCA7OworICAgIDkwMDAvWzM0Njc4XT8/OkhQLVVYOio6KikKKwlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKKwljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgorCSAgICA5MDAwLzMxPyApICAgICAgICAgICAgSFBfQVJDSD1tNjgwMDAgOzsKKwkgICAgOTAwMC9bMzRdPz8gKSAgICAgICAgIEhQX0FSQ0g9bTY4ayA7OworCSAgICA5MDAwL1s2NzhdWzAtOV1bMC05XSkKKwkJaWYgWyAteCAvdXNyL2Jpbi9nZXRjb25mIF07IHRoZW4KKwkJICAgIHNjX2NwdV92ZXJzaW9uPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0NQVV9WRVJTSU9OIDI+L2Rldi9udWxsYAorCQkgICAgc2Nfa2VybmVsX2JpdHM9YC91c3IvYmluL2dldGNvbmYgU0NfS0VSTkVMX0JJVFMgMj4vZGV2L251bGxgCisJCSAgICBjYXNlICIke3NjX2NwdV92ZXJzaW9ufSIgaW4KKwkJICAgICAgNTIzKSBIUF9BUkNIPSJocHBhMS4wIiA7OyAjIENQVV9QQV9SSVNDMV8wCisJCSAgICAgIDUyOCkgSFBfQVJDSD0iaHBwYTEuMSIgOzsgIyBDUFVfUEFfUklTQzFfMQorCQkgICAgICA1MzIpICAgICAgICAgICAgICAgICAgICAgICMgQ1BVX1BBX1JJU0MyXzAKKwkJCWNhc2UgIiR7c2Nfa2VybmVsX2JpdHN9IiBpbgorCQkJICAzMikgSFBfQVJDSD0iaHBwYTIuMG4iIDs7CisJCQkgIDY0KSBIUF9BUkNIPSJocHBhMi4wdyIgOzsKKwkJCSAgJycpIEhQX0FSQ0g9ImhwcGEyLjAiIDs7ICAgIyBIUC1VWCAxMC4yMAorCQkJZXNhYyA7OworCQkgICAgZXNhYworCQlmaQorCQlpZiBbICIke0hQX0FSQ0h9IiA9ICIiIF07IHRoZW4KKwkJICAgIGV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJICAgIHNlZCAncy9eCQkvLycgPDwgRU9GID4kZHVtbXkuYworCisJCSNkZWZpbmUgX0hQVVhfU09VUkNFCisJCSNpbmNsdWRlIDxzdGRsaWIuaD4KKwkJI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisJCWludCBtYWluICgpCisJCXsKKwkJI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQorCQkgICAgbG9uZyBiaXRzID0gc3lzY29uZihfU0NfS0VSTkVMX0JJVFMpOworCQkjZW5kaWYKKwkJICAgIGxvbmcgY3B1ICA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7CisKKwkJICAgIHN3aXRjaCAoY3B1KQorCQkJeworCQkJY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7CisJCQljYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMSIpOyBicmVhazsKKwkJCWNhc2UgQ1BVX1BBX1JJU0MyXzA6CisJCSNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKKwkJCSAgICBzd2l0Y2ggKGJpdHMpCisJCQkJeworCQkJCWNhc2UgNjQ6IHB1dHMgKCJocHBhMi4wdyIpOyBicmVhazsKKwkJCQljYXNlIDMyOiBwdXRzICgiaHBwYTIuMG4iKTsgYnJlYWs7CisJCQkJZGVmYXVsdDogcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7CisJCQkJfSBicmVhazsKKwkJI2Vsc2UgIC8qICFkZWZpbmVkKF9TQ19LRVJORUxfQklUUykgKi8KKwkJCSAgICBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKKwkJI2VuZGlmCisJCQlkZWZhdWx0OiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKKwkJCX0KKwkJICAgIGV4aXQgKDApOworCQl9CitFT0YKKwkJICAgIChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jIDI+L2Rldi9udWxsKSAmJiBIUF9BUkNIPWAkZHVtbXlgCisJCSAgICB0ZXN0IC16ICIkSFBfQVJDSCIgJiYgSFBfQVJDSD1ocHBhCisJCWZpIDs7CisJZXNhYworCWlmIFsgJHtIUF9BUkNIfSA9ICJocHBhMi4wdyIgXQorCXRoZW4KKwkgICAgZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCisJICAgICMgaHBwYTIuMHctaHAtaHB1eCogaGFzIGEgNjQtYml0IGtlcm5lbCBhbmQgYSBjb21waWxlciBnZW5lcmF0aW5nCisJICAgICMgMzItYml0IGNvZGUuICBocHBhNjQtaHAtaHB1eCogaGFzIHRoZSBzYW1lIGtlcm5lbCBhbmQgYSBjb21waWxlcgorCSAgICAjIGdlbmVyYXRpbmcgNjQtYml0IGNvZGUuICBHTlUgYW5kIEhQIHVzZSBkaWZmZXJlbnQgbm9tZW5jbGF0dXJlOgorCSAgICAjCisJICAgICMgJCBDQ19GT1JfQlVJTEQ9Y2MgLi9jb25maWcuZ3Vlc3MKKwkgICAgIyA9PiBocHBhMi4wdy1ocC1ocHV4MTEuMjMKKwkgICAgIyAkIENDX0ZPUl9CVUlMRD0iY2MgK0RBMi4wdyIgLi9jb25maWcuZ3Vlc3MKKwkgICAgIyA9PiBocHBhNjQtaHAtaHB1eDExLjIzCisKKwkgICAgaWYgZWNobyBfX0xQNjRfXyB8IChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCkgfAorCQlncmVwIC1xIF9fTFA2NF9fCisJICAgIHRoZW4KKwkJSFBfQVJDSD0iaHBwYTIuMHciCisJICAgIGVsc2UKKwkJSFBfQVJDSD0iaHBwYTY0IgorCSAgICBmaQorCWZpCisJZWNobyAke0hQX0FSQ0h9LWhwLWhwdXgke0hQVVhfUkVWfQorCWV4aXQgOzsKKyAgICBpYTY0OkhQLVVYOio6KikKKwlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKKwllY2hvIGlhNjQtaHAtaHB1eCR7SFBVWF9SRVZ9CisJZXhpdCA7OworICAgIDMwNTAqOkhJLVVYOio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkjaW5jbHVkZSA8dW5pc3RkLmg+CisJaW50CisJbWFpbiAoKQorCXsKKwkgIGxvbmcgY3B1ID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKKwkgIC8qIFRoZSBvcmRlciBtYXR0ZXJzLCBiZWNhdXNlIENQVV9JU19IUF9NQzY4SyBlcnJvbmVvdXNseSByZXR1cm5zCisJICAgICB0cnVlIGZvciBDUFVfUEFfUklTQzFfMC4gIENQVV9JU19QQV9SSVNDIHJldHVybnMgY29ycmVjdAorCSAgICAgcmVzdWx0cywgaG93ZXZlci4gICovCisJICBpZiAoQ1BVX0lTX1BBX1JJU0MgKGNwdSkpCisJICAgIHsKKwkgICAgICBzd2l0Y2ggKGNwdSkKKwkJeworCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBjYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgY2FzZSBDUFVfUEFfUklTQzJfMDogcHV0cyAoImhwcGEyLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGRlZmF1bHQ6IHB1dHMgKCJocHBhLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJfQorCSAgICB9CisJICBlbHNlIGlmIChDUFVfSVNfSFBfTUM2OEsgKGNwdSkpCisJICAgIHB1dHMgKCJtNjhrLWhpdGFjaGktaGl1eHdlMiIpOworCSAgZWxzZSBwdXRzICgidW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIiKTsKKwkgIGV4aXQgKDApOworCX0KK0VPRgorCSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmIFNZU1RFTV9OQU1FPWAkZHVtbXlgICYmCisJCXsgZWNobyAiJFNZU1RFTV9OQU1FIjsgZXhpdDsgfQorCWVjaG8gdW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIKKwlleGl0IDs7CisgICAgOTAwMC83Pz86NC4zYnNkOio6KiB8IDkwMDAvOD9bNzldOjQuM2JzZDoqOiogKQorCWVjaG8gaHBwYTEuMS1ocC1ic2QKKwlleGl0IDs7CisgICAgOTAwMC84Pz86NC4zYnNkOio6KikKKwllY2hvIGhwcGExLjAtaHAtYnNkCisJZXhpdCA7OworICAgICo5Pz8qOk1QRS9pWDoqOiogfCAqMzAwMCo6TVBFL2lYOio6KikKKwllY2hvIGhwcGExLjAtaHAtbXBlaXgKKwlleGl0IDs7CisgICAgaHA3Pz86T1NGMToqOiogfCBocDg/Wzc5XTpPU0YxOio6KiApCisJZWNobyBocHBhMS4xLWhwLW9zZgorCWV4aXQgOzsKKyAgICBocDg/PzpPU0YxOio6KikKKwllY2hvIGhwcGExLjAtaHAtb3NmCisJZXhpdCA7OworICAgIGkqODY6T1NGMToqOiopCisJaWYgWyAteCAvdXNyL3NiaW4vc3lzdmVyc2lvbiBdIDsgdGhlbgorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxbWsKKwllbHNlCisJICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjEKKwlmaQorCWV4aXQgOzsKKyAgICBwYXJpc2MqOkxpdGVzKjoqOiopCisJZWNobyBocHBhMS4xLWhwLWxpdGVzCisJZXhpdCA7OworICAgIEMxKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzEqOiopCisJZWNobyBjMS1jb252ZXgtYnNkCisJZXhpdCA7OworICAgIEMyKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzIqOiopCisJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCisJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCisJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKKwlmaQorCWV4aXQgOzsKKyAgICBDMzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzQqOiopCisJZWNobyBjMzQtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBDMzgqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzgqOiopCisJZWNobyBjMzgtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBDNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkM0KjoqKQorCWVjaG8gYzQtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBDUkFZKlktTVA6KjoqOiopCisJZWNobyB5bXAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgQ1JBWSpbQS1aXTkwOio6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gXAorCXwgc2VkIC1lICdzL0NSQVkuKlwoW0EtWl05MFwpL1wxLycgXAorCSAgICAgIC1lIHkvQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovIFwKKwkgICAgICAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqVFM6KjoqOiopCisJZWNobyB0OTAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgQ1JBWSpUM0U6KjoqOiopCisJZWNobyBhbHBoYWV2NS1jcmF5LXVuaWNvc21rJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqU1YxOio6KjoqKQorCWVjaG8gc3YxLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgICo6VU5JQ09TL21wOio6KikKKwllY2hvIGNyYXludi1jcmF5LXVuaWNvc21wJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIEYzMFswMV06VU5JWF9TeXN0ZW1fVjoqOiogfCBGNzAwOlVOSVhfU3lzdGVtX1Y6KjoqKQorCUZVSklUU1VfUFJPQz1gdW5hbWUgLW0gfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisJRlVKSVRTVV9TWVM9YHVuYW1lIC1wIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzL1wvLy8nYAorCUZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvIC9fLydgCisJZWNobyAiJHtGVUpJVFNVX1BST0N9LWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKKwlleGl0IDs7CisgICAgNTAwMDpVTklYX1N5c3RlbV9WOjQuKjoqKQorCUZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKKwlGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzLyAvXy8nYAorCWVjaG8gInNwYXJjLWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKKwlleGl0IDs7CisgICAgaSo4NjpCU0QvMzg2Oio6KiB8IGkqODY6QlNEL09TOio6KiB8ICo6QXNjZW5kXCBFbWJlZGRlZC9PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWJzZGkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIHNwYXJjKjpCU0QvT1M6KjoqKQorCWVjaG8gc3BhcmMtdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOkJTRC9PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpGcmVlQlNEOio6KikKKwlVTkFNRV9QUk9DRVNTT1I9YC91c3IvYmluL3VuYW1lIC1wYAorCWNhc2UgJHtVTkFNRV9QUk9DRVNTT1J9IGluCisJICAgIGFtZDY0KQorCQllY2hvIHg4Nl82NC11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgIDs7CisJICAgICopCisJCWVjaG8gJHtVTkFNRV9QUk9DRVNTT1J9LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKKwllc2FjCisJZXhpdCA7OworICAgIGkqOkNZR1dJTio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtY3lnd2luCisJZXhpdCA7OworICAgICo6TUlOR1c2NCo6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluZ3c2NAorCWV4aXQgOzsKKyAgICAqOk1JTkdXKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5ndzMyCisJZXhpdCA7OworICAgICo6TVNZUyo6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbXN5cworCWV4aXQgOzsKKyAgICBpKjp3aW5kb3dzMzIqOiopCisJIyB1bmFtZSAtbSBpbmNsdWRlcyAiLXBjIiBvbiB0aGlzIHN5c3RlbS4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tbWluZ3czMgorCWV4aXQgOzsKKyAgICBpKjpQVyo6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtcHczMgorCWV4aXQgOzsKKyAgICAqOkludGVyaXgqOiopCisJY2FzZSAke1VOQU1FX01BQ0hJTkV9IGluCisJICAgIHg4NikKKwkJZWNobyBpNTg2LXBjLWludGVyaXgke1VOQU1FX1JFTEVBU0V9CisJCWV4aXQgOzsKKwkgICAgYXV0aGVudGljYW1kIHwgZ2VudWluZWludGVsIHwgRU02NFQpCisJCWVjaG8geDg2XzY0LXVua25vd24taW50ZXJpeCR7VU5BTUVfUkVMRUFTRX0KKwkJZXhpdCA7OworCSAgICBJQTY0KQorCQllY2hvIGlhNjQtdW5rbm93bi1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfQorCQlleGl0IDs7CisJZXNhYyA7OworICAgIFszNDVdODY6V2luZG93c185NToqIHwgWzM0NV04NjpXaW5kb3dzXzk4OiogfCBbMzQ1XTg2OldpbmRvd3NfTlQ6KikKKwllY2hvIGkke1VOQU1FX01BQ0hJTkV9LXBjLW1rcworCWV4aXQgOzsKKyAgICA4NjY0OldpbmRvd3NfTlQ6KikKKwllY2hvIHg4Nl82NC1wYy1ta3MKKwlleGl0IDs7CisgICAgaSo6V2luZG93c19OVCo6KiB8IFBlbnRpdW0qOldpbmRvd3NfTlQqOiopCisJIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgUE9TSVggc3Vic3lzdGVtPworCSMgSXQgYWxzbyBjb25mbGljdHMgd2l0aCBwcmUtMi4wIHZlcnNpb25zIG9mIEFUJlQgVVdJTi4gU2hvdWxkIHdlCisJIyBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZCBvZiBpMzg2PworCWVjaG8gaTU4Ni1wYy1pbnRlcml4CisJZXhpdCA7OworICAgIGkqOlVXSU4qOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXV3aW4KKwlleGl0IDs7CisgICAgYW1kNjQ6Q1lHV0lOKjoqOiogfCB4ODZfNjQ6Q1lHV0lOKjoqOiopCisJZWNobyB4ODZfNjQtdW5rbm93bi1jeWd3aW4KKwlleGl0IDs7CisgICAgcCo6Q1lHV0lOKjoqKQorCWVjaG8gcG93ZXJwY2xlLXVua25vd24tY3lnd2luCisJZXhpdCA7OworICAgIHByZXAqOlN1bk9TOjUuKjoqKQorCWVjaG8gcG93ZXJwY2xlLXVua25vd24tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgKjpHTlU6KjoqKQorCSMgdGhlIEdOVSBzeXN0ZW0KKwllY2hvIGBlY2hvICR7VU5BTUVfTUFDSElORX18c2VkIC1lICdzLFstL10uKiQsLCdgLXVua25vd24tJHtMSUJDfWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLC8uKiQsLCdgCisJZXhpdCA7OworICAgICo6R05VLyo6KjoqKQorCSMgb3RoZXIgc3lzdGVtcyB3aXRoIEdOVSBsaWJjIGFuZCB1c2VybGFuZAorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWBlY2hvICR7VU5BTUVfU1lTVEVNfSB8IHNlZCAncyxeW14vXSovLCwnIHwgdHIgJ1tBLVpdJyAnW2Etel0nYGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBpKjg2Ok1pbml4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluaXgKKwlleGl0IDs7CisgICAgYWFyY2g2NDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBhYXJjaDY0X2JlOkxpbnV4Oio6KikKKwlVTkFNRV9NQUNISU5FPWFhcmNoNjRfYmUKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIGFscGhhOkxpbnV4Oio6KikKKwljYXNlIGBzZWQgLW4gJy9eY3B1IG1vZGVsL3MvXi4qOiBcKC4qXCkvXDEvcCcgPCAvcHJvYy9jcHVpbmZvYCBpbgorCSAgRVY1KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjUgOzsKKwkgIEVWNTYpICBVTkFNRV9NQUNISU5FPWFscGhhZXY1NiA7OworCSAgUENBNTYpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgUENBNTcpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgRVY2KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjYgOzsKKwkgIEVWNjcpICBVTkFNRV9NQUNISU5FPWFscGhhZXY2NyA7OworCSAgRVY2OCopIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY4IDs7CisJZXNhYworCW9iamR1bXAgLS1wcml2YXRlLWhlYWRlcnMgL2Jpbi9zaCB8IGdyZXAgLXEgbGQuc28uMQorCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuIExJQkM9ImdudWxpYmMxIiA7IGZpCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBhcmM6TGludXg6KjoqIHwgYXJjZWI6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgYXJtKjpMaW51eDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCWlmIGVjaG8gX19BUk1fRUFCSV9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKKwkgICAgfCBncmVwIC1xIF9fQVJNX0VBQklfXworCXRoZW4KKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtJHtMSUJDfQorCWVsc2UKKwkgICAgaWYgZWNobyBfX0FSTV9QQ1NfVkZQIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKKwkJfCBncmVwIC1xIF9fQVJNX1BDU19WRlAKKwkgICAgdGhlbgorCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC0ke0xJQkN9ZWFiaQorCSAgICBlbHNlCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ31lYWJpaGYKKwkgICAgZmkKKwlmaQorCWV4aXQgOzsKKyAgICBhdnIzMio6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgY3JpczpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWF4aXMtbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBjcmlzdjMyOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tYXhpcy1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIGZydjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBoZXhhZ29uOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIGkqODY6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIGlhNjQ6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgbTMycio6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgbTY4KjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBtaXBzOkxpbnV4Oio6KiB8IG1pcHM2NDpMaW51eDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI3VuZGVmIENQVQorCSN1bmRlZiAke1VOQU1FX01BQ0hJTkV9CisJI3VuZGVmICR7VU5BTUVfTUFDSElORX1lbAorCSNpZiBkZWZpbmVkKF9fTUlQU0VMX18pIHx8IGRlZmluZWQoX19NSVBTRUwpIHx8IGRlZmluZWQoX01JUFNFTCkgfHwgZGVmaW5lZChNSVBTRUwpCisJQ1BVPSR7VU5BTUVfTUFDSElORX1lbAorCSNlbHNlCisJI2lmIGRlZmluZWQoX19NSVBTRUJfXykgfHwgZGVmaW5lZChfX01JUFNFQikgfHwgZGVmaW5lZChfTUlQU0VCKSB8fCBkZWZpbmVkKE1JUFNFQikKKwlDUFU9JHtVTkFNRV9NQUNISU5FfQorCSNlbHNlCisJQ1BVPQorCSNlbmRpZgorCSNlbmRpZgorRU9GCisJZXZhbCBgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IGdyZXAgJ15DUFUnYAorCXRlc3QgeCIke0NQVX0iICE9IHggJiYgeyBlY2hvICIke0NQVX0tdW5rbm93bi1saW51eC0ke0xJQkN9IjsgZXhpdDsgfQorCTs7CisgICAgb3BlbnJpc2MqOkxpbnV4Oio6KikKKwllY2hvIG9yMWstdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIG9yMzI6TGludXg6KjoqIHwgb3Ixayo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgcGFkcmU6TGludXg6KjoqKQorCWVjaG8gc3BhcmMtdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIHBhcmlzYzY0OkxpbnV4Oio6KiB8IGhwcGE2NDpMaW51eDoqOiopCisJZWNobyBocHBhNjQtdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIHBhcmlzYzpMaW51eDoqOiogfCBocHBhOkxpbnV4Oio6KikKKwkjIExvb2sgZm9yIENQVSBsZXZlbAorCWNhc2UgYGdyZXAgJ15jcHVbXmEtel0qOicgL3Byb2MvY3B1aW5mbyAyPi9kZXYvbnVsbCB8IGN1dCAtZCcgJyAtZjJgIGluCisJICBQQTcqKSBlY2hvIGhwcGExLjEtdW5rbm93bi1saW51eC0ke0xJQkN9IDs7CisJICBQQTgqKSBlY2hvIGhwcGEyLjAtdW5rbm93bi1saW51eC0ke0xJQkN9IDs7CisJICAqKSAgICBlY2hvIGhwcGEtdW5rbm93bi1saW51eC0ke0xJQkN9IDs7CisJZXNhYworCWV4aXQgOzsKKyAgICBwcGM2NDpMaW51eDoqOiopCisJZWNobyBwb3dlcnBjNjQtdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIHBwYzpMaW51eDoqOiopCisJZWNobyBwb3dlcnBjLXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBwcGM2NGxlOkxpbnV4Oio6KikKKwllY2hvIHBvd2VycGM2NGxlLXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBwcGNsZTpMaW51eDoqOiopCisJZWNobyBwb3dlcnBjbGUtdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIHMzOTA6TGludXg6KjoqIHwgczM5MHg6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBzaDY0KjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBzaCo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgc3BhcmM6TGludXg6KjoqIHwgc3BhcmM2NDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICB0aWxlKjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICB2YXg6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICB4ODZfNjQ6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgeHRlbnNhKjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBpKjg2OkRZTklYL3B0eDo0KjoqKQorCSMgcHR4IDQuMCBkb2VzIHVuYW1lIC1zIGNvcnJlY3RseSwgd2l0aCBEWU5JWC9wdHggaW4gdGhlcmUuCisJIyBlYXJsaWVyIHZlcnNpb25zIGFyZSBtZXNzZWQgdXAgYW5kIHB1dCB0aGUgbm9kZW5hbWUgaW4gYm90aAorCSMgc3lzbmFtZSBhbmQgbm9kZW5hbWUuCisJZWNobyBpMzg2LXNlcXVlbnQtc3lzdjQKKwlleGl0IDs7CisgICAgaSo4NjpVTklYX1NWOjQuMk1QOjIuKikKKwkjIFVuaXh3YXJlIGlzIGFuIG9mZnNob290IG9mIFNWUjQsIGJ1dCBpdCBoYXMgaXRzIG93biB2ZXJzaW9uCisJIyBudW1iZXIgc2VyaWVzIHN0YXJ0aW5nIHdpdGggMi4uLgorCSMgSSBhbSBub3QgcG9zaXRpdmUgdGhhdCBvdGhlciBTVlI0IHN5c3RlbXMgd29uJ3QgbWF0Y2ggdGhpcywKKwkjIEkganVzdCBoYXZlIHRvIGhvcGUuICAtLSBybXMuCisJIyBVc2Ugc3lzdjQuMnV3Li4uIHNvIHRoYXQgc3lzdjQqIG1hdGNoZXMgaXQuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Y0LjJ1dyR7VU5BTUVfVkVSU0lPTn0KKwlleGl0IDs7CisgICAgaSo4NjpPUy8yOio6KikKKwkjIElmIHdlIHdlcmUgYWJsZSB0byBmaW5kIGB1bmFtZScsIHRoZW4gRU1YIFVuaXggY29tcGF0aWJpbGl0eQorCSMgaXMgcHJvYmFibHkgaW5zdGFsbGVkLgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1vczItZW14CisJZXhpdCA7OworICAgIGkqODY6WFRTLTMwMDoqOlNUT1ApCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3RvcAorCWV4aXQgOzsKKyAgICBpKjg2OmF0aGVvczoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYXRoZW9zCisJZXhpdCA7OworICAgIGkqODY6c3lsbGFibGU6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeWxsYWJsZQorCWV4aXQgOzsKKyAgICBpKjg2Okx5bnhPUzoyLio6KiB8IGkqODY6THlueE9TOjMuWzAxXSo6KiB8IGkqODY6THlueE9TOjQuWzAyXSo6KikKKwllY2hvIGkzODYtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGkqODY6KkRPUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1zZG9zZGpncHAKKwlleGl0IDs7CisgICAgaSo4NjoqOjQuKjoqIHwgaSo4NjpTWVNURU1fVjo0Lio6KikKKwlVTkFNRV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAncy9cL01QJC8vJ2AKKwlpZiBncmVwIE5vdmVsbCAvdXNyL2luY2x1ZGUvbGluay5oID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVuaXZlbC1zeXN2JHtVTkFNRV9SRUx9CisJZWxzZQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdiR7VU5BTUVfUkVMfQorCWZpCisJZXhpdCA7OworICAgIGkqODY6Kjo1Ols2NzhdKikKKwkjIFVuaXhXYXJlIDcueCwgT3BlblVOSVggYW5kIE9wZW5TZXJ2ZXIgNi4KKwljYXNlIGAvYmluL3VuYW1lIC1YIHwgZ3JlcCAiXk1hY2hpbmUiYCBpbgorCSAgICAqNDg2KikJICAgICBVTkFNRV9NQUNISU5FPWk0ODYgOzsKKwkgICAgKlBlbnRpdW0pCSAgICAgVU5BTUVfTUFDSElORT1pNTg2IDs7CisJICAgICpQZW50KnwqQ2VsZXJvbikgVU5BTUVfTUFDSElORT1pNjg2IDs7CisJZXNhYworCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9JHtVTkFNRV9TWVNURU19JHtVTkFNRV9WRVJTSU9OfQorCWV4aXQgOzsKKyAgICBpKjg2Oio6My4yOiopCisJaWYgdGVzdCAtZiAvdXNyL29wdGlvbnMvY2IubmFtZTsgdGhlbgorCQlVTkFNRV9SRUw9YHNlZCAtbiAncy8uKlZlcnNpb24gLy9wJyA8L3Vzci9vcHRpb25zL2NiLm5hbWVgCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1pc2MkVU5BTUVfUkVMCisJZWxpZiAvYmluL3VuYW1lIC1YIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCisJCVVOQU1FX1JFTD1gKC9iaW4vdW5hbWUgLVh8Z3JlcCBSZWxlYXNlfHNlZCAtZSAncy8uKj0gLy8nKWAKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCBpODA0ODYgPi9kZXYvbnVsbCkgJiYgVU5BTUVfTUFDSElORT1pNDg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50aXVtJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk1ODYKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnQgKklJJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0gUHJvJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXNjbyRVTkFNRV9SRUwKKwllbHNlCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2MzIKKwlmaQorCWV4aXQgOzsKKyAgICBwYzoqOio6KikKKwkjIExlZnQgaGVyZSBmb3IgY29tcGF0aWJpbGl0eToKKwkjIHVuYW1lIC1tIHByaW50cyBmb3IgREpHUFAgYWx3YXlzICdwYycsIGJ1dCBpdCBwcmludHMgbm90aGluZyBhYm91dAorCSMgdGhlIHByb2Nlc3Nvciwgc28gd2UgcGxheSBzYWZlIGJ5IGFzc3VtaW5nIGk1ODYuCisJIyBOb3RlOiB3aGF0ZXZlciB0aGlzIGlzLCBpdCBNVVNUIGJlIHRoZSBzYW1lIGFzIHdoYXQgY29uZmlnLnN1YgorCSMgcHJpbnRzIGZvciB0aGUgImRqZ3BwIiBob3N0LCBvciBlbHNlIEdEQiBjb25maWd1cnkgd2lsbCBkZWNpZGUgdGhhdAorCSMgdGhpcyBpcyBhIGNyb3NzLWJ1aWxkLgorCWVjaG8gaTU4Ni1wYy1tc2Rvc2RqZ3BwCisJZXhpdCA7OworICAgIEludGVsOk1hY2g6Myo6KikKKwllY2hvIGkzODYtcGMtbWFjaDMKKwlleGl0IDs7CisgICAgcGFyYWdvbjoqOio6KikKKwllY2hvIGk4NjAtaW50ZWwtb3NmMQorCWV4aXQgOzsKKyAgICBpODYwOio6NC4qOiopICMgaTg2MC1TVlI0CisJaWYgZ3JlcCBTdGFyZGVudCAvdXNyL2luY2x1ZGUvc3lzL3VhZG1pbi5oID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwkgIGVjaG8gaTg2MC1zdGFyZGVudC1zeXN2JHtVTkFNRV9SRUxFQVNFfSAjIFN0YXJkZW50IFZpc3RyYSBpODYwLVNWUjQKKwllbHNlICMgQWRkIG90aGVyIGk4NjAtU1ZSNCB2ZW5kb3JzIGJlbG93IGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuCisJICBlY2hvIGk4NjAtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSAgIyBVbmtub3duIGk4NjAtU1ZSNAorCWZpCisJZXhpdCA7OworICAgIG1pbmkqOkNUSVg6U1lTKjU6KikKKwkjICJtaW5pZnJhbWUiCisJZWNobyBtNjgwMTAtY29udmVyZ2VudC1zeXN2CisJZXhpdCA7OworICAgIG1jNjhrOlVOSVg6U1lTVEVNNTozLjUxbSkKKwllY2hvIG02OGstY29udmVyZ2VudC1zeXN2CisJZXhpdCA7OworICAgIE02ODA/MDpELU5JWDo1LjM6KikKKwllY2hvIG02OGstZGlhYi1kbml4CisJZXhpdCA7OworICAgIE02OCo6KjpSM1ZbNTY3OF0qOiopCisJdGVzdCAtciAvc3lzVjY4ICYmIHsgZWNobyAnbTY4ay1tb3Rvcm9sYS1zeXN2JzsgZXhpdDsgfSA7OworICAgIDNbMzQ1XT8/Oio6NC4wOjMuMCB8IDNbMzRdPz9BOio6NC4wOjMuMCB8IDNbMzRdPz8sKjoqOjQuMDozLjAgfCAzWzM0XT8/Lyo6Kjo0LjA6My4wIHwgNDQwMDoqOjQuMDozLjAgfCA0ODUwOio6NC4wOjMuMCB8IFNLQTQwOio6NC4wOjMuMCB8IFNEUzI6Kjo0LjA6My4wIHwgU0hHMjoqOjQuMDozLjAgfCBTNzUwMSo6Kjo0LjA6My4wKQorCU9TX1JFTD0nJworCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAorCSYmIE9TX1JFTD0uYHNlZCAtbiAncy9bXiBdKiBbXiBdKiBcKFswLTldWzAtOV1cKS4qL1wxL3AnIDwgL2V0Yy8ucmVsaWRgCisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisJICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAorCSAgJiYgeyBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0gOzsKKyAgICAzWzM0XT8/Oio6NC4wOiogfCAzWzM0XT8/LCo6Kjo0LjA6KikKKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKKwkgICYmIHsgZWNobyBpNDg2LW5jci1zeXN2NDsgZXhpdDsgfSA7OworICAgIE5DUio6Kjo0LjI6KiB8IE1QUkFTKjoqOjQuMjoqKQorCU9TX1JFTD0nLjMnCisJdGVzdCAtciAvZXRjLy5yZWxpZCBcCisJICAgICYmIE9TX1JFTD0uYHNlZCAtbiAncy9bXiBdKiBbXiBdKiBcKFswLTldWzAtOV1cKS4qL1wxL3AnIDwgL2V0Yy8ucmVsaWRgCisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisJICAgICYmIHsgZWNobyBpNDg2LW5jci1zeXN2NC4zJHtPU19SRUx9OyBleGl0OyB9CisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IC9iaW4vZ3JlcCBlbnRpdW0gPi9kZXYvbnVsbCBcCisJICAgICYmIHsgZWNobyBpNTg2LW5jci1zeXN2NC4zJHtPU19SRUx9OyBleGl0OyB9CisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IC9iaW4vZ3JlcCBwdGVyb24gPi9kZXYvbnVsbCBcCisJICAgICYmIHsgZWNobyBpNTg2LW5jci1zeXN2NC4zJHtPU19SRUx9OyBleGl0OyB9IDs7CisgICAgbTY4KjpMeW54T1M6Mi4qOiogfCBtNjgqOkx5bnhPUzozLjAqOiopCisJZWNobyBtNjhrLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtYzY4MDMwOlVOSVhfU3lzdGVtX1Y6NC4qOiopCisJZWNobyBtNjhrLWF0YXJpLXN5c3Y0CisJZXhpdCA7OworICAgIFRTVU5BTUk6THlueE9TOjIuKjoqKQorCWVjaG8gc3BhcmMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIHJzNjAwMDpMeW54T1M6Mi4qOiopCisJZWNobyByczYwMDAtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFBvd2VyUEM6THlueE9TOjIuKjoqIHwgUG93ZXJQQzpMeW54T1M6My5bMDFdKjoqIHwgUG93ZXJQQzpMeW54T1M6NC5bMDJdKjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU01bQkVdUzpVTklYX1NWOio6KikKKwllY2hvIG1pcHMtZGRlLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFJNKjpSZWxpYW50VU5JWC0qOio6KikKKwllY2hvIG1pcHMtc25pLXN5c3Y0CisJZXhpdCA7OworICAgIFJNKjpTSU5JWC0qOio6KikKKwllY2hvIG1pcHMtc25pLXN5c3Y0CisJZXhpdCA7OworICAgICo6U0lOSVgtKjoqOiopCisJaWYgdW5hbWUgLXAgMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KKwkJVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXNuaS1zeXN2NAorCWVsc2UKKwkJZWNobyBuczMyay1zbmktc3lzdgorCWZpCisJZXhpdCA7OworICAgIFBFTlRJVU06Kjo0LjAqOiopCSMgVW5pc3lzIGBDbGVhclBhdGggSE1QIElYIDQwMDAnIFNWUjQvTVAgZWZmb3J0CisJCQkjIHNheXMgPFJpY2hhcmQuTS5CYXJ0ZWxAY2NNYWlsLkNlbnN1cy5HT1Y+CisJZWNobyBpNTg2LXVuaXN5cy1zeXN2NAorCWV4aXQgOzsKKyAgICAqOlVOSVhfU3lzdGVtX1Y6NCo6RlRYKikKKwkjIEZyb20gR2VyYWxkIEhld2VzIDxoZXdlc0BvcGVubWFya2V0LmNvbT4uCisJIyBIb3cgYWJvdXQgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gc3RyYXR1cyBhcmNoaXRlY3R1cmVzPyAtZGptCisJZWNobyBocHBhMS4xLXN0cmF0dXMtc3lzdjQKKwlleGl0IDs7CisgICAgKjoqOio6RlRYKikKKwkjIEZyb20gc2VhbmZAc3dkYy5zdHJhdHVzLmNvbS4KKwllY2hvIGk4NjAtc3RyYXR1cy1zeXN2NAorCWV4aXQgOzsKKyAgICBpKjg2OlZPUzoqOiopCisJIyBGcm9tIFBhdWwuR3JlZW5Ac3RyYXR1cy5jb20uCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXN0cmF0dXMtdm9zCisJZXhpdCA7OworICAgICo6Vk9TOio6KikKKwkjIEZyb20gUGF1bC5HcmVlbkBzdHJhdHVzLmNvbS4KKwllY2hvIGhwcGExLjEtc3RyYXR1cy12b3MKKwlleGl0IDs7CisgICAgbWM2OCo6QS9VWDoqOiopCisJZWNobyBtNjhrLWFwcGxlLWF1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbmV3cyo6TkVXUy1PUzo2KjoqKQorCWVjaG8gbWlwcy1zb255LW5ld3NvczYKKwlleGl0IDs7CisgICAgUlszNF0wMDA6KlN5c3RlbV9WKjoqOiogfCBSNDAwMDpVTklYX1NZU1Y6KjoqIHwgUiowMDA6VU5JWF9TVjoqOiopCisJaWYgWyAtZCAvdXNyL25lYyBdOyB0aGVuCisJCWVjaG8gbWlwcy1uZWMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwllbHNlCisJCWVjaG8gbWlwcy11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZmkKKwlleGl0IDs7CisgICAgQmVCb3g6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIGhhcmR3YXJlIG1hZGUgYnkgQmUsIFBQQyBvbmx5LgorCWVjaG8gcG93ZXJwYy1iZS1iZW9zCisJZXhpdCA7OworICAgIEJlTWFjOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBNYWMgb3IgTWFjIGNsb25lLCBQUEMgb25seS4KKwllY2hvIHBvd2VycGMtYXBwbGUtYmVvcworCWV4aXQgOzsKKyAgICBCZVBDOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBJbnRlbCBQQyBjb21wYXRpYmxlLgorCWVjaG8gaTU4Ni1wYy1iZW9zCisJZXhpdCA7OworICAgIEJlUEM6SGFpa3U6KjoqKQkjIEhhaWt1IHJ1bm5pbmcgb24gSW50ZWwgUEMgY29tcGF0aWJsZS4KKwllY2hvIGk1ODYtcGMtaGFpa3UKKwlleGl0IDs7CisgICAgeDg2XzY0OkhhaWt1Oio6KikKKwllY2hvIHg4Nl82NC11bmtub3duLWhhaWt1CisJZXhpdCA7OworICAgIFNYLTQ6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g0LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC01OlNVUEVSLVVYOio6KikKKwllY2hvIHN4NS1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtNjpTVVBFUi1VWDoqOiopCisJZWNobyBzeDYtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNYLTc6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g3LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC04OlNVUEVSLVVYOio6KikKKwllY2hvIHN4OC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtOFI6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g4ci1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgUG93ZXIqOlJoYXBzb2R5Oio6KikKKwllY2hvIHBvd2VycGMtYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6UmhhcHNvZHk6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpEYXJ3aW46KjoqKQorCVVOQU1FX1BST0NFU1NPUj1gdW5hbWUgLXBgIHx8IFVOQU1FX1BST0NFU1NPUj11bmtub3duCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCWlmIHRlc3QgIiRVTkFNRV9QUk9DRVNTT1IiID0gdW5rbm93biA7IHRoZW4KKwkgICAgVU5BTUVfUFJPQ0VTU09SPXBvd2VycGMKKwlmaQorCWlmIHRlc3QgYGVjaG8gIiRVTkFNRV9SRUxFQVNFIiB8IHNlZCAtZSAncy9cLi4qLy8nYCAtbGUgMTAgOyB0aGVuCisJICAgIGlmIFsgIiRDQ19GT1JfQlVJTEQiICE9ICdub19jb21waWxlcl9mb3VuZCcgXTsgdGhlbgorCQlpZiAoZWNobyAnI2lmZGVmIF9fTFA2NF9fJzsgZWNobyBJU182NEJJVF9BUkNIOyBlY2hvICcjZW5kaWYnKSB8IFwKKwkJICAgIChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCkgfCBcCisJCSAgICBncmVwIElTXzY0QklUX0FSQ0ggPi9kZXYvbnVsbAorCQl0aGVuCisJCSAgICBjYXNlICRVTkFNRV9QUk9DRVNTT1IgaW4KKwkJCWkzODYpIFVOQU1FX1BST0NFU1NPUj14ODZfNjQgOzsKKwkJCXBvd2VycGMpIFVOQU1FX1BST0NFU1NPUj1wb3dlcnBjNjQgOzsKKwkJICAgIGVzYWMKKwkJZmkKKwkgICAgZmkKKwllbGlmIHRlc3QgIiRVTkFNRV9QUk9DRVNTT1IiID0gaTM4NiA7IHRoZW4KKwkgICAgIyBBdm9pZCBleGVjdXRpbmcgY2Mgb24gT1MgWCAxMC45LCBhcyBpdCBzaGlwcyB3aXRoIGEgc3R1YgorCSAgICAjIHRoYXQgcHV0cyB1cCBhIGdyYXBoaWNhbCBhbGVydCBwcm9tcHRpbmcgdG8gaW5zdGFsbAorCSAgICAjIGRldmVsb3BlciB0b29scy4gIEFueSBzeXN0ZW0gcnVubmluZyBNYWMgT1MgWCAxMC43IG9yCisJICAgICMgbGF0ZXIgKERhcndpbiAxMSBhbmQgbGF0ZXIpIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSA2NC1iaXQKKwkgICAgIyBwcm9jZXNzb3IuIFRoaXMgaXMgbm90IHRydWUgb2YgdGhlIEFSTSB2ZXJzaW9uIG9mIERhcndpbgorCSAgICAjIHRoYXQgQXBwbGUgdXNlcyBpbiBwb3J0YWJsZSBkZXZpY2VzLgorCSAgICBVTkFNRV9QUk9DRVNTT1I9eDg2XzY0CisJZmkKKwllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS1hcHBsZS1kYXJ3aW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6cHJvY250byo6KjoqIHwgKjpRTlg6WzAxMjM0NTY3ODldKjoqKQorCVVOQU1FX1BST0NFU1NPUj1gdW5hbWUgLXBgCisJaWYgdGVzdCAiJFVOQU1FX1BST0NFU1NPUiIgPSAieDg2IjsgdGhlbgorCQlVTkFNRV9QUk9DRVNTT1I9aTM4NgorCQlVTkFNRV9NQUNISU5FPXBjCisJZmkKKwllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS0ke1VOQU1FX01BQ0hJTkV9LW50by1xbngke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6UU5YOio6NCopCisJZWNobyBpMzg2LXBjLXFueAorCWV4aXQgOzsKKyAgICBORU8tPzpOT05TVE9QX0tFUk5FTDoqOiopCisJZWNobyBuZW8tdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgTlNFLSo6Tk9OU1RPUF9LRVJORUw6KjoqKQorCWVjaG8gbnNlLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIE5TUi0/Ok5PTlNUT1BfS0VSTkVMOio6KikKKwllY2hvIG5zci10YW5kZW0tbnNrJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOk5vblN0b3AtVVg6KjoqKQorCWVjaG8gbWlwcy1jb21wYXEtbm9uc3RvcHV4CisJZXhpdCA7OworICAgIEJTMjAwMDpQT1NJWCo6KjoqKQorCWVjaG8gYnMyMDAwLXNpZW1lbnMtc3lzdgorCWV4aXQgOzsKKyAgICBEUy8qOlVOSVhfU3lzdGVtX1Y6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS0ke1VOQU1FX1NZU1RFTX0tJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlBsYW45Oio6KikKKwkjICJ1bmFtZSAtbSIgaXMgbm90IGNvbnNpc3RlbnQsIHNvIHVzZSAkY3B1dHlwZSBpbnN0ZWFkLiAzODYKKwkjIGlzIGNvbnZlcnRlZCB0byBpMzg2IGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIHg4NgorCSMgb3BlcmF0aW5nIHN5c3RlbXMuCisJaWYgdGVzdCAiJGNwdXR5cGUiID0gIjM4NiI7IHRoZW4KKwkgICAgVU5BTUVfTUFDSElORT1pMzg2CisJZWxzZQorCSAgICBVTkFNRV9NQUNISU5FPSIkY3B1dHlwZSIKKwlmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXBsYW45CisJZXhpdCA7OworICAgICo6VE9QUy0xMDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRvcHMxMAorCWV4aXQgOzsKKyAgICAqOlRFTkVYOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdGVuZXgKKwlleGl0IDs7CisgICAgS1MxMDpUT1BTLTIwOio6KiB8IEtMMTA6VE9QUy0yMDoqOiogfCBUWVBFNDpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLWRlYy10b3BzMjAKKwlleGl0IDs7CisgICAgWEtMLTE6VE9QUy0yMDoqOiogfCBUWVBFNTpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLXhrbC10b3BzMjAKKwlleGl0IDs7CisgICAgKjpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdG9wczIwCisJZXhpdCA7OworICAgICo6SVRTOio6KikKKwllY2hvIHBkcDEwLXVua25vd24taXRzCisJZXhpdCA7OworICAgIFNFSToqOio6U0VJVVgpCisJZWNobyBtaXBzLXNlaS1zZWl1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpEcmFnb25GbHk6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWRyYWdvbmZseWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AKKwlleGl0IDs7CisgICAgKjoqVk1TOio6KikKKwlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCisJICAgIEEqKSBlY2hvIGFscGhhLWRlYy12bXMgOyBleGl0IDs7CisJICAgIEkqKSBlY2hvIGlhNjQtZGVjLXZtcyA7IGV4aXQgOzsKKwkgICAgViopIGVjaG8gdmF4LWRlYy12bXMgOyBleGl0IDs7CisJZXNhYyA7OworICAgICo6WEVOSVg6KjpTeXNWKQorCWVjaG8gaTM4Ni1wYy14ZW5peAorCWV4aXQgOzsKKyAgICBpKjg2OnNreW9zOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc2t5b3NgZWNobyAke1VOQU1FX1JFTEVBU0V9YCB8IHNlZCAtZSAncy8gLiokLy8nCisJZXhpdCA7OworICAgIGkqODY6cmRvczoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXJkb3MKKwlleGl0IDs7CisgICAgaSo4NjpBUk9TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYXJvcworCWV4aXQgOzsKKyAgICB4ODZfNjQ6Vk1rZXJuZWw6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWVzeAorCWV4aXQgOzsKK2VzYWMKKworY2F0ID4mMiA8PEVPRgorJDA6IHVuYWJsZSB0byBndWVzcyBzeXN0ZW0gdHlwZQorCitUaGlzIHNjcmlwdCwgbGFzdCBtb2RpZmllZCAkdGltZXN0YW1wLCBoYXMgZmFpbGVkIHRvIHJlY29nbml6ZQordGhlIG9wZXJhdGluZyBzeXN0ZW0geW91IGFyZSB1c2luZy4gSXQgaXMgYWR2aXNlZCB0aGF0IHlvdQorZG93bmxvYWQgdGhlIG1vc3QgdXAgdG8gZGF0ZSB2ZXJzaW9uIG9mIHRoZSBjb25maWcgc2NyaXB0cyBmcm9tCisKKyAgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5ndWVzcztoYj1IRUFECithbmQKKyAgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5zdWI7aGI9SEVBRAorCitJZiB0aGUgdmVyc2lvbiB5b3UgcnVuICgkMCkgaXMgYWxyZWFkeSB1cCB0byBkYXRlLCBwbGVhc2UKK3NlbmQgdGhlIGZvbGxvd2luZyBkYXRhIGFuZCBhbnkgaW5mb3JtYXRpb24geW91IHRoaW5rIG1pZ2h0IGJlCitwZXJ0aW5lbnQgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+IGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIG5lZWRlZAoraW5mb3JtYXRpb24gdG8gaGFuZGxlIHlvdXIgc3lzdGVtLgorCitjb25maWcuZ3Vlc3MgdGltZXN0YW1wID0gJHRpbWVzdGFtcAorCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKy9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbGAKKworaG9zdGluZm8gICAgICAgICAgICAgICA9IGAoaG9zdGluZm8pIDI+L2Rldi9udWxsYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbGAKKy9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbGAKKy91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsYAorCitVTkFNRV9NQUNISU5FID0gJHtVTkFNRV9NQUNISU5FfQorVU5BTUVfUkVMRUFTRSA9ICR7VU5BTUVfUkVMRUFTRX0KK1VOQU1FX1NZU1RFTSAgPSAke1VOQU1FX1NZU1RFTX0KK1VOQU1FX1ZFUlNJT04gPSAke1VOQU1FX1ZFUlNJT059CitFT0YKKworZXhpdCAxCisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgorIyB0aW1lLXN0YW1wLWVuZDogIiciCisjIEVuZDoKZGlmZiAtLWdpdCBhL2NvbmZpZy5zdWIgYi9jb25maWcuc3ViCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ2NTRkMDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcuc3ViCkBAIC0wLDAgKzEsMTc5NCBAQAorIyEgL2Jpbi9zaAorIyBDb25maWd1cmF0aW9uIHZhbGlkYXRpb24gc3Vicm91dGluZSBzY3JpcHQuCisjICAgQ29weXJpZ2h0IDE5OTItMjAxNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKwordGltZXN0YW1wPScyMDE0LTA1LTAxJworCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQKKyMgcHJvZ3JhbS4gIFRoaXMgRXhjZXB0aW9uIGlzIGFuIGFkZGl0aW9uYWwgcGVybWlzc2lvbiB1bmRlciBzZWN0aW9uIDcKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDMgKCJHUEx2MyIpLgorCisKKyMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB3aXRoIGEgQ2hhbmdlTG9nIGVudHJ5IHRvIGNvbmZpZy1wYXRjaGVzQGdudS5vcmcuCisjCisjIENvbmZpZ3VyYXRpb24gc3Vicm91dGluZSB0byB2YWxpZGF0ZSBhbmQgY2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiB0eXBlLgorIyBTdXBwbHkgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIHR5cGUgYXMgYW4gYXJndW1lbnQuCisjIElmIGl0IGlzIGludmFsaWQsIHdlIHByaW50IGFuIGVycm9yIG1lc3NhZ2Ugb24gc3RkZXJyIGFuZCBleGl0IHdpdGggY29kZSAxLgorIyBPdGhlcndpc2UsIHdlIHByaW50IHRoZSBjYW5vbmljYWwgY29uZmlnIHR5cGUgb24gc3Rkb3V0IGFuZCBzdWNjZWVkLgorCisjIFlvdSBjYW4gZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIHNjcmlwdCBmcm9tOgorIyBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLnN1YjtoYj1IRUFECisKKyMgVGhpcyBmaWxlIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgR05VIHBhY2thZ2VzCisjIGFuZCByZWNvZ25pemUgYWxsIHRoZSBDUFUgdHlwZXMsIHN5c3RlbSB0eXBlcyBhbmQgYWxpYXNlcworIyB0aGF0IGFyZSBtZWFuaW5nZnVsIHdpdGggKmFueSogR05VIHNvZnR3YXJlLgorIyBFYWNoIHBhY2thZ2UgaXMgcmVzcG9uc2libGUgZm9yIHJlcG9ydGluZyB3aGljaCB2YWxpZCBjb25maWd1cmF0aW9ucworIyBpdCBkb2VzIG5vdCBzdXBwb3J0LiAgVGhlIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2gKKyMgYSBmYWlsdXJlIHRvIHN1cHBvcnQgYSB2YWxpZCBjb25maWd1cmF0aW9uIGZyb20gYSBtZWFuaW5nbGVzcworIyBjb25maWd1cmF0aW9uLgorCisjIFRoZSBnb2FsIG9mIHRoaXMgZmlsZSBpcyB0byBtYXAgYWxsIHRoZSB2YXJpb3VzIHZhcmlhdGlvbnMgb2YgYSBnaXZlbgorIyBtYWNoaW5lIHNwZWNpZmljYXRpb24gaW50byBhIHNpbmdsZSBzcGVjaWZpY2F0aW9uIGluIHRoZSBmb3JtOgorIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTQorIyBvciBpbiBzb21lIGNhc2VzLCB0aGUgbmV3ZXIgZm91ci1wYXJ0IGZvcm06CisjCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTQorIyBJdCBpcyB3cm9uZyB0byBlY2hvIGFueSBvdGhlciB0eXBlIG9mIHNwZWNpZmljYXRpb24uCisKK21lPWBlY2hvICIkMCIgfCBzZWQgLWUgJ3MsLiovLCwnYAorCit1c2FnZT0iXAorVXNhZ2U6ICQwIFtPUFRJT05dIENQVS1NRlItT1BTWVMKKyAgICAgICAkMCBbT1BUSU9OXSBBTElBUworCitDYW5vbmljYWxpemUgYSBjb25maWd1cmF0aW9uIG5hbWUuCisKK09wZXJhdGlvbiBtb2RlczoKKyAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKKworUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKKwordmVyc2lvbj0iXAorR05VIGNvbmZpZy5zdWIgKCR0aW1lc3RhbXApCisKK0NvcHlyaWdodCAxOTkyLTIwMTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCit3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCisKK2hlbHA9IgorVHJ5IFxgJG1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorCisjIFBhcnNlIGNvbW1hbmQgbGluZQord2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtLXRpbWUtc3RhbXAgfCAtLXRpbWUqIHwgLXQgKQorICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCA7OworICAgIC0tdmVyc2lvbiB8IC12ICkKKyAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDs7CisgICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCisgICAgICAgc2hpZnQ7IGJyZWFrIDs7CisgICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgorICAgICAgIGJyZWFrIDs7CisgICAgLSogKQorICAgICAgIGVjaG8gIiRtZTogaW52YWxpZCBvcHRpb24gJDEkaGVscCIKKyAgICAgICBleGl0IDEgOzsKKworICAgICpsb2NhbCopCisgICAgICAgIyBGaXJzdCBwYXNzIHRocm91Z2ggYW55IGxvY2FsIG1hY2hpbmUgdHlwZXMuCisgICAgICAgZWNobyAkMQorICAgICAgIGV4aXQgOzsKKworICAgICogKQorICAgICAgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworY2FzZSAkIyBpbgorIDApIGVjaG8gIiRtZTogbWlzc2luZyBhcmd1bWVudCRoZWxwIiA+JjIKKyAgICBleGl0IDE7OworIDEpIDs7CisgKikgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCisgICAgZXhpdCAxOzsKK2VzYWMKKworIyBTZXBhcmF0ZSB3aGF0IHRoZSB1c2VyIGdhdmUgaW50byBDUFUtQ09NUEFOWSBhbmQgT1Mgb3IgS0VSTkVMLU9TIChpZiBhbnkpLgorIyBIZXJlIHdlIG11c3QgcmVjb2duaXplIGFsbCB0aGUgdmFsaWQgS0VSTkVMLU9TIGNvbWJpbmF0aW9ucy4KK21heWJlX29zPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMi8nYAorY2FzZSAkbWF5YmVfb3MgaW4KKyAgbnRvLXFueCogfCBsaW51eC1nbnUqIHwgbGludXgtYW5kcm9pZCogfCBsaW51eC1kaWV0bGliYyB8IGxpbnV4LW5ld2xpYiogfCBcCisgIGxpbnV4LW11c2wqIHwgbGludXgtdWNsaWJjKiB8IHVjbGludXgtdWNsaWJjKiB8IHVjbGludXgtZ251KiB8IGtmcmVlYnNkKi1nbnUqIHwgXAorICBrbmV0YnNkKi1nbnUqIHwgbmV0YnNkKi1nbnUqIHwgXAorICBrb3BlbnNvbGFyaXMqLWdudSogfCBcCisgIHN0b3JtLWNoYW9zKiB8IG9zMi1lbXgqIHwgcnRtay1ub3ZhKikKKyAgICBvcz0tJG1heWJlX29zCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDEvJ2AKKyAgICA7OworICBhbmRyb2lkLWxpbnV4KQorICAgIG9zPS1saW51eC1hbmRyb2lkCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDEvJ2AtdW5rbm93bgorICAgIDs7CisgICopCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy8tW14tXSokLy8nYAorICAgIGlmIFsgJGJhc2ljX21hY2hpbmUgIT0gJDEgXQorICAgIHRoZW4gb3M9YGVjaG8gJDEgfCBzZWQgJ3MvLiotLy0vJ2AKKyAgICBlbHNlIG9zPTsgZmkKKyAgICA7OworZXNhYworCisjIyMgTGV0J3MgcmVjb2duaXplIGNvbW1vbiBtYWNoaW5lcyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMgc28KKyMjIyB0aGF0IHRoaW5ncyBsaWtlIGNvbmZpZy5zdWIgZGVjc3RhdGlvbi0zMTAwIHdvcmsuICBXZSBhbHNvCisjIyMgcmVjb2duaXplIHNvbWUgbWFudWZhY3R1cmVycyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMsIHNvIHdlCisjIyMgY2FuIHByb3ZpZGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyBiZWxvdy4KK2Nhc2UgJG9zIGluCisJLXN1bipvcyopCisJCSMgUHJldmVudCBmb2xsb3dpbmcgY2xhdXNlIGZyb20gaGFuZGxpbmcgdGhpcyBpbnZhbGlkIGlucHV0LgorCQk7OworCS1kZWMqIHwgLW1pcHMqIHwgLXNlcXVlbnQqIHwgLWVuY29yZSogfCAtcGM1MzIqIHwgLXNnaSogfCAtc29ueSogfCBcCisJLWF0dCogfCAtNzMwMCogfCAtMzMwMCogfCAtZGVsdGEqIHwgLW1vdG9yb2xhKiB8IC1zdW5bMjM0XSogfCBcCisJLXVuaWNvbSogfCAtaWJtKiB8IC1uZXh0IHwgLWhwIHwgLWlzaSogfCAtYXBvbGxvIHwgLWFsdG9zKiB8IFwKKwktY29udmVyZ2VudCogfCAtbmNyKiB8IC1uZXdzIHwgLTMyKiB8IC0zNjAwKiB8IC0zMTAwKiB8IC1oaXRhY2hpKiB8XAorCS1jWzEyM10qIHwgLWNvbnZleCogfCAtc3VuIHwgLWNyZHMgfCAtb21yb24qIHwgLWRnIHwgLXVsdHJhIHwgLXR0aSogfCBcCisJLWhhcnJpcyB8IC1kb2xwaGluIHwgLWhpZ2hsZXZlbCB8IC1nb3VsZCB8IC1jYm0gfCAtbnMgfCAtbWFzc2NvbXAgfCBcCisJLWFwcGxlIHwgLWF4aXMgfCAta251dGggfCAtY3JheSB8IC1taWNyb2JsYXplKikKKwkJb3M9CisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktYmx1ZWdlbmUqKQorCQlvcz0tY25rCisJCTs7CisJLXNpbSB8IC1jaXNjbyB8IC1va2kgfCAtd2VjIHwgLXdpbmJvbmQpCisJCW9zPQorCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLXNjb3V0KQorCQk7OworCS13cnMpCisJCW9zPS12eHdvcmtzCisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktY2hvcnVzb3MqKQorCQlvcz0tY2hvcnVzb3MKKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1jaG9ydXNyZGIpCisJCW9zPS1jaG9ydXNyZGIKKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1oaXV4KikKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwktc2NvNikKKwkJb3M9LXNjbzV2NgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzUpCisJCW9zPS1zY28zLjJ2NQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzQpCisJCW9zPS1zY28zLjJ2NAorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzMuMi5bNC05XSopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy9zY28zLjIuL3NjbzMuMnYvJ2AKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28zLjJ2WzQtOV0qKQorCQkjIERvbid0IGZvcmdldCB2ZXJzaW9uIGlmIGl0IGlzIDMuMnY0IG9yIG5ld2VyLgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzV2NiopCisJCSMgRG9uJ3QgZm9yZ2V0IHZlcnNpb24gaWYgaXQgaXMgMy4ydjQgb3IgbmV3ZXIuCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvKikKKwkJb3M9LXNjbzMuMnYyCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktdWRrKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1pc2MpCisJCW9zPS1pc2MyLjIKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1jbGl4KikKKwkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWludGVyZ3JhcGgKKwkJOzsKKwktaXNjKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1seW54KjE3OCkKKwkJb3M9LWx5bnhvczE3OAorCQk7OworCS1seW54KjUpCisJCW9zPS1seW54b3M1CisJCTs7CisJLWx5bngqKQorCQlvcz0tbHlueG9zCisJCTs7CisJLXB0eCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtc2VxdWVudC8nYAorCQk7OworCS13aW5kb3dzbnQqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvd2luZG93c250L3dpbm50LydgCisJCTs7CisJLXBzb3MqKQorCQlvcz0tcHNvcworCQk7OworCS1taW50IHwgLW1pbnRbMC05XSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQorCQlvcz0tbWludAorCQk7OworZXNhYworCisjIERlY29kZSBhbGlhc2VzIGZvciBjZXJ0YWluIENQVS1DT01QQU5ZIGNvbWJpbmF0aW9ucy4KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLgorCSMgU29tZSBhcmUgb21pdHRlZCBoZXJlIGJlY2F1c2UgdGhleSBoYXZlIHNwZWNpYWwgbWVhbmluZ3MgYmVsb3cuCisJMTc1MGEgfCA1ODAgXAorCXwgYTI5ayBcCisJfCBhYXJjaDY0IHwgYWFyY2g2NF9iZSBcCisJfCBhbHBoYSB8IGFscGhhZXZbNC04XSB8IGFscGhhZXY1NiB8IGFscGhhZXY2Wzc4XSB8IGFscGhhcGNhNVs2N10gXAorCXwgYWxwaGE2NCB8IGFscGhhNjRldls0LThdIHwgYWxwaGE2NGV2NTYgfCBhbHBoYTY0ZXY2Wzc4XSB8IGFscGhhNjRwY2E1WzY3XSBcCisJfCBhbTMzXzIuMCBcCisJfCBhcmMgfCBhcmNlYiBcCisJfCBhcm0gfCBhcm1bYmxdZSB8IGFybWVbbGJdIHwgYXJtdlsyLThdIHwgYXJtdlszLThdW2xiXSB8IGFybXY3W2FybV0gXAorCXwgYXZyIHwgYXZyMzIgXAorCXwgYmUzMiB8IGJlNjQgXAorCXwgYmZpbiBcCisJfCBjNHggfCBjODA1MSB8IGNsaXBwZXIgXAorCXwgZDEwdiB8IGQzMHYgfCBkbHggfCBkc3AxNnh4IFwKKwl8IGVwaXBoYW55IFwKKwl8IGZpZG8gfCBmcjMwIHwgZnJ2IFwKKwl8IGg4MzAwIHwgaDg1MDAgfCBocHBhIHwgaHBwYTEuWzAxXSB8IGhwcGEyLjAgfCBocHBhMi4wW253XSB8IGhwcGE2NCBcCisJfCBoZXhhZ29uIFwKKwl8IGkzNzAgfCBpODYwIHwgaTk2MCB8IGlhNjQgXAorCXwgaXAyayB8IGlxMjAwMCBcCisJfCBrMW9tIFwKKwl8IGxlMzIgfCBsZTY0IFwKKwl8IGxtMzIgXAorCXwgbTMyYyB8IG0zMnIgfCBtMzJybGUgfCBtNjgwMDAgfCBtNjhrIHwgbTg4ayBcCisJfCBtYXhxIHwgbWIgfCBtaWNyb2JsYXplIHwgbWljcm9ibGF6ZWVsIHwgbWNvcmUgfCBtZXAgfCBtZXRhZyBcCisJfCBtaXBzIHwgbWlwc2JlIHwgbWlwc2ViIHwgbWlwc2VsIHwgbWlwc2xlIFwKKwl8IG1pcHMxNiBcCisJfCBtaXBzNjQgfCBtaXBzNjRlbCBcCisJfCBtaXBzNjRvY3Rlb24gfCBtaXBzNjRvY3Rlb25lbCBcCisJfCBtaXBzNjRvcmlvbiB8IG1pcHM2NG9yaW9uZWwgXAorCXwgbWlwczY0cjU5MDAgfCBtaXBzNjRyNTkwMGVsIFwKKwl8IG1pcHM2NHZyIHwgbWlwczY0dnJlbCBcCisJfCBtaXBzNjR2cjQxMDAgfCBtaXBzNjR2cjQxMDBlbCBcCisJfCBtaXBzNjR2cjQzMDAgfCBtaXBzNjR2cjQzMDBlbCBcCisJfCBtaXBzNjR2cjUwMDAgfCBtaXBzNjR2cjUwMDBlbCBcCisJfCBtaXBzNjR2cjU5MDAgfCBtaXBzNjR2cjU5MDBlbCBcCisJfCBtaXBzaXNhMzIgfCBtaXBzaXNhMzJlbCBcCisJfCBtaXBzaXNhMzJyMiB8IG1pcHNpc2EzMnIyZWwgXAorCXwgbWlwc2lzYTMycjYgfCBtaXBzaXNhMzJyNmVsIFwKKwl8IG1pcHNpc2E2NCB8IG1pcHNpc2E2NGVsIFwKKwl8IG1pcHNpc2E2NHIyIHwgbWlwc2lzYTY0cjJlbCBcCisJfCBtaXBzaXNhNjRyNiB8IG1pcHNpc2E2NHI2ZWwgXAorCXwgbWlwc2lzYTY0c2IxIHwgbWlwc2lzYTY0c2IxZWwgXAorCXwgbWlwc2lzYTY0c3I3MWsgfCBtaXBzaXNhNjRzcjcxa2VsIFwKKwl8IG1pcHNyNTkwMCB8IG1pcHNyNTkwMGVsIFwKKwl8IG1pcHN0eDM5IHwgbWlwc3R4MzllbCBcCisJfCBtbjEwMjAwIHwgbW4xMDMwMCBcCisJfCBtb3hpZSBcCisJfCBtdCBcCisJfCBtc3A0MzAgXAorCXwgbmRzMzIgfCBuZHMzMmxlIHwgbmRzMzJiZSBcCisJfCBuaW9zIHwgbmlvczIgfCBuaW9zMmViIHwgbmlvczJlbCBcCisJfCBuczE2ayB8IG5zMzJrIFwKKwl8IG9wZW44IHwgb3IxayB8IG9yMWtuZCB8IG9yMzIgXAorCXwgcGRwMTAgfCBwZHAxMSB8IHBqIHwgcGpsIFwKKwl8IHBvd2VycGMgfCBwb3dlcnBjNjQgfCBwb3dlcnBjNjRsZSB8IHBvd2VycGNsZSBcCisJfCBweXJhbWlkIFwKKwl8IHJsNzggfCByeCBcCisJfCBzY29yZSBcCisJfCBzaCB8IHNoWzEyMzRdIHwgc2hbMjRdYSB8IHNoWzI0XWFlYiB8IHNoWzIzXWUgfCBzaFszNF1lYiB8IHNoZWIgfCBzaGJlIHwgc2hsZSB8IHNoWzEyMzRdbGUgfCBzaDNlbGUgXAorCXwgc2g2NCB8IHNoNjRsZSBcCisJfCBzcGFyYyB8IHNwYXJjNjQgfCBzcGFyYzY0YiB8IHNwYXJjNjR2IHwgc3BhcmM4NnggfCBzcGFyY2xldCB8IHNwYXJjbGl0ZSBcCisJfCBzcGFyY3Y4IHwgc3BhcmN2OSB8IHNwYXJjdjliIHwgc3BhcmN2OXYgXAorCXwgc3B1IFwKKwl8IHRhaG9lIHwgdGljNHggfCB0aWM1NHggfCB0aWM1NXggfCB0aWM2eCB8IHRpYzgwIHwgdHJvbiBcCisJfCB1Ymljb20zMiBcCisJfCB2ODUwIHwgdjg1MGUgfCB2ODUwZTEgfCB2ODUwZTIgfCB2ODUwZXMgfCB2ODUwZTJ2MyBcCisJfCB3ZTMyayBcCisJfCB4ODYgfCB4YzE2eCB8IHhzdG9ybXkxNiB8IHh0ZW5zYSBcCisJfCB6OGsgfCB6ODApCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQk7OworCWM1NHgpCisJCWJhc2ljX21hY2hpbmU9dGljNTR4LXVua25vd24KKwkJOzsKKwljNTV4KQorCQliYXNpY19tYWNoaW5lPXRpYzU1eC11bmtub3duCisJCTs7CisJYzZ4KQorCQliYXNpY19tYWNoaW5lPXRpYzZ4LXVua25vd24KKwkJOzsKKwltNjgxMSB8IG02OGhjMTEgfCBtNjgxMiB8IG02OGhjMTIgfCBtNjhoY3MxMnggfCBudnB0eCB8IHBpY29jaGlwKQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJb3M9LW5vbmUKKwkJOzsKKwltODgxMTAgfCBtNjgwWzEyMzQ2XTAgfCBtNjgzPzIgfCBtNjgzNjAgfCBtNTIwMCB8IHY3MCB8IHc2NSB8IHo4aykKKwkJOzsKKwltczEpCisJCWJhc2ljX21hY2hpbmU9bXQtdW5rbm93bgorCQk7OworCisJc3Ryb25nYXJtIHwgdGh1bWIgfCB4c2NhbGUpCisJCWJhc2ljX21hY2hpbmU9YXJtLXVua25vd24KKwkJOzsKKwl4Z2F0ZSkKKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCW9zPS1ub25lCisJCTs7CisJeHNjYWxlZWIpCisJCWJhc2ljX21hY2hpbmU9YXJtZWItdW5rbm93bgorCQk7OworCisJeHNjYWxlZWwpCisJCWJhc2ljX21hY2hpbmU9YXJtZWwtdW5rbm93bgorCQk7OworCisJIyBXZSB1c2UgYHBjJyByYXRoZXIgdGhhbiBgdW5rbm93bicKKwkjIGJlY2F1c2UgKDEpIHRoYXQncyB3aGF0IHRoZXkgbm9ybWFsbHkgYXJlLCBhbmQKKwkjICgyKSB0aGUgd29yZCAidW5rbm93biIgdGVuZHMgdG8gY29uZnVzZSBiZWdpbm5pbmcgdXNlcnMuCisJaSo4NiB8IHg4Nl82NCkKKwkgIGJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtcGMKKwkgIDs7CisJIyBPYmplY3QgaWYgbW9yZSB0aGFuIG9uZSBjb21wYW55IG5hbWUgd29yZC4KKwkqLSotKikKKwkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCisJCWV4aXQgMQorCQk7OworCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aCBjb21wYW55IG5hbWUuCisJNTgwLSogXAorCXwgYTI5ay0qIFwKKwl8IGFhcmNoNjQtKiB8IGFhcmNoNjRfYmUtKiBcCisJfCBhbHBoYS0qIHwgYWxwaGFldls0LThdLSogfCBhbHBoYWV2NTYtKiB8IGFscGhhZXY2Wzc4XS0qIFwKKwl8IGFscGhhNjQtKiB8IGFscGhhNjRldls0LThdLSogfCBhbHBoYTY0ZXY1Ni0qIHwgYWxwaGE2NGV2Nls3OF0tKiBcCisJfCBhbHBoYXBjYTVbNjddLSogfCBhbHBoYTY0cGNhNVs2N10tKiB8IGFyYy0qIHwgYXJjZWItKiBcCisJfCBhcm0tKiAgfCBhcm1iZS0qIHwgYXJtbGUtKiB8IGFybWViLSogfCBhcm12Ki0qIFwKKwl8IGF2ci0qIHwgYXZyMzItKiBcCisJfCBiZTMyLSogfCBiZTY0LSogXAorCXwgYmZpbi0qIHwgYnMyMDAwLSogXAorCXwgY1sxMjNdKiB8IGMzMC0qIHwgW2NqdF05MC0qIHwgYzR4LSogXAorCXwgYzgwNTEtKiB8IGNsaXBwZXItKiB8IGNyYXludi0qIHwgY3lkcmEtKiBcCisJfCBkMTB2LSogfCBkMzB2LSogfCBkbHgtKiBcCisJfCBlbHhzaS0qIFwKKwl8IGYzMFswMV0tKiB8IGY3MDAtKiB8IGZpZG8tKiB8IGZyMzAtKiB8IGZydi0qIHwgZng4MC0qIFwKKwl8IGg4MzAwLSogfCBoODUwMC0qIFwKKwl8IGhwcGEtKiB8IGhwcGExLlswMV0tKiB8IGhwcGEyLjAtKiB8IGhwcGEyLjBbbnddLSogfCBocHBhNjQtKiBcCisJfCBoZXhhZ29uLSogXAorCXwgaSo4Ni0qIHwgaTg2MC0qIHwgaTk2MC0qIHwgaWE2NC0qIFwKKwl8IGlwMmstKiB8IGlxMjAwMC0qIFwKKwl8IGsxb20tKiBcCisJfCBsZTMyLSogfCBsZTY0LSogXAorCXwgbG0zMi0qIFwKKwl8IG0zMmMtKiB8IG0zMnItKiB8IG0zMnJsZS0qIFwKKwl8IG02ODAwMC0qIHwgbTY4MFswMTIzNDZdMC0qIHwgbTY4MzYwLSogfCBtNjgzPzItKiB8IG02OGstKiBcCisJfCBtODgxMTAtKiB8IG04OGstKiB8IG1heHEtKiB8IG1jb3JlLSogfCBtZXRhZy0qIFwKKwl8IG1pY3JvYmxhemUtKiB8IG1pY3JvYmxhemVlbC0qIFwKKwl8IG1pcHMtKiB8IG1pcHNiZS0qIHwgbWlwc2ViLSogfCBtaXBzZWwtKiB8IG1pcHNsZS0qIFwKKwl8IG1pcHMxNi0qIFwKKwl8IG1pcHM2NC0qIHwgbWlwczY0ZWwtKiBcCisJfCBtaXBzNjRvY3Rlb24tKiB8IG1pcHM2NG9jdGVvbmVsLSogXAorCXwgbWlwczY0b3Jpb24tKiB8IG1pcHM2NG9yaW9uZWwtKiBcCisJfCBtaXBzNjRyNTkwMC0qIHwgbWlwczY0cjU5MDBlbC0qIFwKKwl8IG1pcHM2NHZyLSogfCBtaXBzNjR2cmVsLSogXAorCXwgbWlwczY0dnI0MTAwLSogfCBtaXBzNjR2cjQxMDBlbC0qIFwKKwl8IG1pcHM2NHZyNDMwMC0qIHwgbWlwczY0dnI0MzAwZWwtKiBcCisJfCBtaXBzNjR2cjUwMDAtKiB8IG1pcHM2NHZyNTAwMGVsLSogXAorCXwgbWlwczY0dnI1OTAwLSogfCBtaXBzNjR2cjU5MDBlbC0qIFwKKwl8IG1pcHNpc2EzMi0qIHwgbWlwc2lzYTMyZWwtKiBcCisJfCBtaXBzaXNhMzJyMi0qIHwgbWlwc2lzYTMycjJlbC0qIFwKKwl8IG1pcHNpc2EzMnI2LSogfCBtaXBzaXNhMzJyNmVsLSogXAorCXwgbWlwc2lzYTY0LSogfCBtaXBzaXNhNjRlbC0qIFwKKwl8IG1pcHNpc2E2NHIyLSogfCBtaXBzaXNhNjRyMmVsLSogXAorCXwgbWlwc2lzYTY0cjYtKiB8IG1pcHNpc2E2NHI2ZWwtKiBcCisJfCBtaXBzaXNhNjRzYjEtKiB8IG1pcHNpc2E2NHNiMWVsLSogXAorCXwgbWlwc2lzYTY0c3I3MWstKiB8IG1pcHNpc2E2NHNyNzFrZWwtKiBcCisJfCBtaXBzcjU5MDAtKiB8IG1pcHNyNTkwMGVsLSogXAorCXwgbWlwc3R4MzktKiB8IG1pcHN0eDM5ZWwtKiBcCisJfCBtbWl4LSogXAorCXwgbXQtKiBcCisJfCBtc3A0MzAtKiBcCisJfCBuZHMzMi0qIHwgbmRzMzJsZS0qIHwgbmRzMzJiZS0qIFwKKwl8IG5pb3MtKiB8IG5pb3MyLSogfCBuaW9zMmViLSogfCBuaW9zMmVsLSogXAorCXwgbm9uZS0qIHwgbnAxLSogfCBuczE2ay0qIHwgbnMzMmstKiBcCisJfCBvcGVuOC0qIFwKKwl8IG9yMWsqLSogXAorCXwgb3Jpb24tKiBcCisJfCBwZHAxMC0qIHwgcGRwMTEtKiB8IHBqLSogfCBwamwtKiB8IHBuLSogfCBwb3dlci0qIFwKKwl8IHBvd2VycGMtKiB8IHBvd2VycGM2NC0qIHwgcG93ZXJwYzY0bGUtKiB8IHBvd2VycGNsZS0qIFwKKwl8IHB5cmFtaWQtKiBcCisJfCBybDc4LSogfCByb21wLSogfCByczYwMDAtKiB8IHJ4LSogXAorCXwgc2gtKiB8IHNoWzEyMzRdLSogfCBzaFsyNF1hLSogfCBzaFsyNF1hZWItKiB8IHNoWzIzXWUtKiB8IHNoWzM0XWViLSogfCBzaGViLSogfCBzaGJlLSogXAorCXwgc2hsZS0qIHwgc2hbMTIzNF1sZS0qIHwgc2gzZWxlLSogfCBzaDY0LSogfCBzaDY0bGUtKiBcCisJfCBzcGFyYy0qIHwgc3BhcmM2NC0qIHwgc3BhcmM2NGItKiB8IHNwYXJjNjR2LSogfCBzcGFyYzg2eC0qIHwgc3BhcmNsZXQtKiBcCisJfCBzcGFyY2xpdGUtKiBcCisJfCBzcGFyY3Y4LSogfCBzcGFyY3Y5LSogfCBzcGFyY3Y5Yi0qIHwgc3BhcmN2OXYtKiB8IHN2MS0qIHwgc3g/LSogXAorCXwgdGFob2UtKiBcCisJfCB0aWMzMC0qIHwgdGljNHgtKiB8IHRpYzU0eC0qIHwgdGljNTV4LSogfCB0aWM2eC0qIHwgdGljODAtKiBcCisJfCB0aWxlKi0qIFwKKwl8IHRyb24tKiBcCisJfCB1Ymljb20zMi0qIFwKKwl8IHY4NTAtKiB8IHY4NTBlLSogfCB2ODUwZTEtKiB8IHY4NTBlcy0qIHwgdjg1MGUyLSogfCB2ODUwZTJ2My0qIFwKKwl8IHZheC0qIFwKKwl8IHdlMzJrLSogXAorCXwgeDg2LSogfCB4ODZfNjQtKiB8IHhjMTZ4LSogfCB4cHMxMDAtKiBcCisJfCB4c3Rvcm15MTYtKiB8IHh0ZW5zYSotKiBcCisJfCB5bXAtKiBcCisJfCB6OGstKiB8IHo4MC0qKQorCQk7OworCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aG91dCBjb21wYW55IG5hbWUsIHdpdGggZ2xvYiBtYXRjaC4KKwl4dGVuc2EqKQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgdmFyaW91cyBtYWNoaW5lIG5hbWVzIGFuZCBhbGlhc2VzIHdoaWNoIHN0YW5kCisJIyBmb3IgYSBDUFUgdHlwZSBhbmQgYSBjb21wYW55IGFuZCBzb21ldGltZXMgZXZlbiBhbiBPUy4KKwkzODZic2QpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS1ic2QKKwkJOzsKKwkzYjEgfCA3MzAwIHwgNzMwMC1hdHQgfCBhdHQtNzMwMCB8IHBjNzMwMCB8IHNhZmFyaSB8IHVuaXhwYykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtYXR0CisJCTs7CisJM2IqKQorCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAorCQk7OworCWEyOWtoaWYpCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworCWFiYWN1cykKKwkJYmFzaWNfbWFjaGluZT1hYmFjdXMtdW5rbm93bgorCQk7OworCWFkb2JlNjhrKQorCQliYXNpY19tYWNoaW5lPW02ODAxMC1hZG9iZQorCQlvcz0tc2NvdXQKKwkJOzsKKwlhbGxpYW50IHwgZng4MCkKKwkJYmFzaWNfbWFjaGluZT1meDgwLWFsbGlhbnQKKwkJOzsKKwlhbHRvcyB8IGFsdG9zMzA2OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFsdG9zCisJCTs7CisJYW0yOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1ub25lCisJCW9zPS1ic2QKKwkJOzsKKwlhbWQ2NCkKKwkJYmFzaWNfbWFjaGluZT14ODZfNjQtcGMKKwkJOzsKKwlhbWQ2NC0qKQorCQliYXNpY19tYWNoaW5lPXg4Nl82NC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCWFtZGFobCkKKwkJYmFzaWNfbWFjaGluZT01ODAtYW1kYWhsCisJCW9zPS1zeXN2CisJCTs7CisJYW1pZ2EgfCBhbWlnYS0qKQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQk7OworCWFtaWdhb3MgfCBhbWlnYWRvcykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJb3M9LWFtaWdhb3MKKwkJOzsKKwlhbWlnYXVuaXggfCBhbWl4KQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQlvcz0tc3lzdjQKKwkJOzsKKwlhcG9sbG82OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbworCQlvcz0tc3lzdgorCQk7OworCWFwb2xsbzY4YnNkKQorCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCisJCW9zPS1ic2QKKwkJOzsKKwlhcm9zKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LWFyb3MKKwkJOzsKKwlhdXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQorCQlvcz0tYXV4CisJCTs7CisJYmFsYW5jZSkKKwkJYmFzaWNfbWFjaGluZT1uczMyay1zZXF1ZW50CisJCW9zPS1keW5peAorCQk7OworCWJsYWNrZmluKQorCQliYXNpY19tYWNoaW5lPWJmaW4tdW5rbm93bgorCQlvcz0tbGludXgKKwkJOzsKKwlibGFja2Zpbi0qKQorCQliYXNpY19tYWNoaW5lPWJmaW4tYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJb3M9LWxpbnV4CisJCTs7CisJYmx1ZWdlbmUqKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtaWJtCisJCW9zPS1jbmsKKwkJOzsKKwljNTR4LSopCisJCWJhc2ljX21hY2hpbmU9dGljNTR4LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJYzU1eC0qKQorCQliYXNpY19tYWNoaW5lPXRpYzU1eC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCWM2eC0qKQorCQliYXNpY19tYWNoaW5lPXRpYzZ4LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJYzkwKQorCQliYXNpY19tYWNoaW5lPWM5MC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwljZWdjYykKKwkJYmFzaWNfbWFjaGluZT1hcm0tdW5rbm93bgorCQlvcz0tY2VnY2MKKwkJOzsKKwljb252ZXgtYzEpCisJCWJhc2ljX21hY2hpbmU9YzEtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzIpCisJCWJhc2ljX21hY2hpbmU9YzItY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzMyKQorCQliYXNpY19tYWNoaW5lPWMzMi1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzQpCisJCWJhc2ljX21hY2hpbmU9YzM0LWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzOCkKKwkJYmFzaWNfbWFjaGluZT1jMzgtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljcmF5IHwgajkwKQorCQliYXNpY19tYWNoaW5lPWo5MC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwljcmF5bnYpCisJCWJhc2ljX21hY2hpbmU9Y3JheW52LWNyYXkKKwkJb3M9LXVuaWNvc21wCisJCTs7CisJY3IxNiB8IGNyMTYtKikKKwkJYmFzaWNfbWFjaGluZT1jcjE2LXVua25vd24KKwkJb3M9LWVsZgorCQk7OworCWNyZHMgfCB1bm9zKQorCQliYXNpY19tYWNoaW5lPW02OGstY3JkcworCQk7OworCWNyaXN2MzIgfCBjcmlzdjMyLSogfCBldHJheGZzKikKKwkJYmFzaWNfbWFjaGluZT1jcmlzdjMyLWF4aXMKKwkJOzsKKwljcmlzIHwgY3Jpcy0qIHwgZXRyYXgqKQorCQliYXNpY19tYWNoaW5lPWNyaXMtYXhpcworCQk7OworCWNyeCkKKwkJYmFzaWNfbWFjaGluZT1jcngtdW5rbm93bgorCQlvcz0tZWxmCisJCTs7CisJZGEzMCB8IGRhMzAtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWRhMzAKKwkJOzsKKwlkZWNzdGF0aW9uIHwgZGVjc3RhdGlvbi0zMTAwIHwgcG1heCB8IHBtYXgtKiB8IHBtaW4gfCBkZWMzMTAwIHwgZGVjc3RhdG4pCisJCWJhc2ljX21hY2hpbmU9bWlwcy1kZWMKKwkJOzsKKwlkZWNzeXN0ZW0xMCogfCBkZWMxMCopCisJCWJhc2ljX21hY2hpbmU9cGRwMTAtZGVjCisJCW9zPS10b3BzMTAKKwkJOzsKKwlkZWNzeXN0ZW0yMCogfCBkZWMyMCopCisJCWJhc2ljX21hY2hpbmU9cGRwMTAtZGVjCisJCW9zPS10b3BzMjAKKwkJOzsKKwlkZWx0YSB8IDMzMDAgfCBtb3Rvcm9sYS0zMzAwIHwgbW90b3JvbGEtZGVsdGEgXAorCSAgICAgIHwgMzMwMC1tb3Rvcm9sYSB8IGRlbHRhLW1vdG9yb2xhKQorCQliYXNpY19tYWNoaW5lPW02OGstbW90b3JvbGEKKwkJOzsKKwlkZWx0YTg4KQorCQliYXNpY19tYWNoaW5lPW04OGstbW90b3JvbGEKKwkJb3M9LXN5c3YzCisJCTs7CisJZGljb3MpCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQlvcz0tZGljb3MKKwkJOzsKKwlkamdwcCkKKwkJYmFzaWNfbWFjaGluZT1pNTg2LXBjCisJCW9zPS1tc2Rvc2RqZ3BwCisJCTs7CisJZHB4MjAgfCBkcHgyMC0qKQorCQliYXNpY19tYWNoaW5lPXJzNjAwMC1idWxsCisJCW9zPS1ib3N4CisJCTs7CisJZHB4MiogfCBkcHgyKi1idWxsKQorCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAorCQlvcz0tc3lzdjMKKwkJOzsKKwllYm1vbjI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tZWJtb24KKwkJOzsKKwllbHhzaSkKKwkJYmFzaWNfbWFjaGluZT1lbHhzaS1lbHhzaQorCQlvcz0tYnNkCisJCTs7CisJZW5jb3JlIHwgdW1heCB8IG1tYXgpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstZW5jb3JlCisJCTs7CisJZXMxODAwIHwgT1NFNjhrIHwgb3NlNjhrIHwgb3NlIHwgT1NFKQorCQliYXNpY19tYWNoaW5lPW02OGstZXJpY3Nzb24KKwkJb3M9LW9zZQorCQk7OworCWZ4MjgwMCkKKwkJYmFzaWNfbWFjaGluZT1pODYwLWFsbGlhbnQKKwkJOzsKKwlnZW5peCkKKwkJYmFzaWNfbWFjaGluZT1uczMyay1ucworCQk7OworCWdtaWNybykKKwkJYmFzaWNfbWFjaGluZT10cm9uLWdtaWNybworCQlvcz0tc3lzdgorCQk7OworCWdvMzIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tZ28zMgorCQk7OworCWgzMDUwciogfCBoaXV4KikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwloODMwMGhtcykKKwkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwloODMwMHhyYXkpCisJCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQorCQlvcz0teHJheQorCQk7OworCWg4NTAwaG1zKQorCQliYXNpY19tYWNoaW5lPWg4NTAwLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCWhhcnJpcykKKwkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcworCQlvcz0tc3lzdjMKKwkJOzsKKwlocDMwMC0qKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJOzsKKwlocDMwMGJzZCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCW9zPS1ic2QKKwkJOzsKKwlocDMwMGhwdXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQlvcz0taHB1eAorCQk7OworCWhwM2s5WzAtOV1bMC05XSB8IGhwOVswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwOWsyWzAtOV1bMC05XSB8IGhwOWszMVswLTldKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1ocAorCQk7OworCWhwOWszWzItOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCTs7CisJaHA5azZbMC05XVswLTldIHwgaHA2WzAtOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CisJaHA5azdbMC03OV1bMC05XSB8IGhwN1swLTc5XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrNzhbMC05XSB8IGhwNzhbMC05XSkKKwkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbNjddMSB8IGhwOFs2N10xIHwgaHA5azgwWzI0XSB8IGhwODBbMjRdIHwgaHA5azhbNzhdOSB8IGhwOFs3OF05IHwgaHA5azg5MyB8IGhwODkzKQorCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrOFswLTldWzEzNjc5XSB8IGhwOFswLTldWzEzNjc5XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbMC05XVswLTldIHwgaHA4WzAtOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CisJaHBwYS1uZXh0KQorCQlvcz0tbmV4dHN0ZXAzCisJCTs7CisJaHBwYW9zZikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCW9zPS1vc2YKKwkJOzsKKwlocHBybykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCW9zPS1wcm9lbGYKKwkJOzsKKwlpMzcwLWlibSogfCBpYm0qKQorCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCisJCTs7CisJaSo4NnYzMikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2MzIKKwkJOzsKKwlpKjg2djQqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3Y0CisJCTs7CisJaSo4NnYpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdgorCQk7OworCWkqODZzb2wyKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJaTM4Nm1hY2gpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1tYWNoCisJCW9zPS1tYWNoCisJCTs7CisJaTM4Ni12c3RhIHwgdnN0YSkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KKwkJb3M9LXZzdGEKKwkJOzsKKwlpcmlzIHwgaXJpczRkKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc2dpCisJCWNhc2UgJG9zIGluCisJCSAgICAtaXJpeCopCisJCQk7OworCQkgICAgKikKKwkJCW9zPS1pcml4NAorCQkJOzsKKwkJZXNhYworCQk7OworCWlzaTY4IHwgaXNpKQorCQliYXNpY19tYWNoaW5lPW02OGstaXNpCisJCW9zPS1zeXN2CisJCTs7CisJbTY4a25vbW11KQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQlvcz0tbGludXgKKwkJOzsKKwltNjhrbm9tbXUtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCW9zPS1saW51eAorCQk7OworCW04OGstb21yb24qKQorCQliYXNpY19tYWNoaW5lPW04OGstb21yb24KKwkJOzsKKwltYWdudW0gfCBtMzIzMCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLW1pcHMKKwkJb3M9LXN5c3YKKwkJOzsKKwltZXJsaW4pCisJCWJhc2ljX21hY2hpbmU9bnMzMmstdXRlaworCQlvcz0tc3lzdgorCQk7OworCW1pY3JvYmxhemUqKQorCQliYXNpY19tYWNoaW5lPW1pY3JvYmxhemUteGlsaW54CisJCTs7CisJbWluZ3c2NCkKKwkJYmFzaWNfbWFjaGluZT14ODZfNjQtcGMKKwkJb3M9LW1pbmd3NjQKKwkJOzsKKwltaW5ndzMyKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJb3M9LW1pbmd3MzIKKwkJOzsKKwltaW5ndzMyY2UpCisJCWJhc2ljX21hY2hpbmU9YXJtLXVua25vd24KKwkJb3M9LW1pbmd3MzJjZQorCQk7OworCW1pbmlmcmFtZSkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtY29udmVyZ2VudAorCQk7OworCSptaW50IHwgLW1pbnRbMC05XSogfCAqTWlOVCB8ICpNaU5UWzAtOV0qKQorCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKKwkJb3M9LW1pbnQKKwkJOzsKKwltaXBzMyotKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AKKwkJOzsKKwltaXBzMyopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgLXVua25vd24KKwkJOzsKKwltb25pdG9yKQorCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCisJCW9zPS1jb2ZmCisJCTs7CisJbW9ycGhvcykKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLXVua25vd24KKwkJb3M9LW1vcnBob3MKKwkJOzsKKwltc2RvcykKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1tc2RvcworCQk7OworCW1zMS0qKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21zMS0vbXQtLydgCisJCTs7CisJbXN5cykKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCW9zPS1tc3lzCisJCTs7CisJbXZzKQorCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCisJCW9zPS1tdnMKKwkJOzsKKwluYWNsKQorCQliYXNpY19tYWNoaW5lPWxlMzItdW5rbm93bgorCQlvcz0tbmFjbAorCQk7OworCW5jcjMwMDApCisJCWJhc2ljX21hY2hpbmU9aTQ4Ni1uY3IKKwkJb3M9LXN5c3Y0CisJCTs7CisJbmV0YnNkMzg2KQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tbmV0YnNkCisJCTs7CisJbmV0d2luZGVyKQorCQliYXNpY19tYWNoaW5lPWFybXY0bC1yZWJlbAorCQlvcz0tbGludXgKKwkJOzsKKwluZXdzIHwgbmV3czcwMCB8IG5ld3M4MDAgfCBuZXdzOTAwKQorCQliYXNpY19tYWNoaW5lPW02OGstc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmV3czEwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4MDMwLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5ld3MtMzYwMCB8IHJpc2MtbmV3cykKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5lY3Y3MCkKKwkJYmFzaWNfbWFjaGluZT12NzAtbmVjCisJCW9zPS1zeXN2CisJCTs7CisJbmV4dCB8IG0qLW5leHQgKQorCQliYXNpY19tYWNoaW5lPW02OGstbmV4dAorCQljYXNlICRvcyBpbgorCQkgICAgLW5leHRzdGVwKiApCisJCQk7OworCQkgICAgLW5zMiopCisJCSAgICAgIG9zPS1uZXh0c3RlcDIKKwkJCTs7CisJCSAgICAqKQorCQkgICAgICBvcz0tbmV4dHN0ZXAzCisJCQk7OworCQllc2FjCisJCTs7CisJbmgzMDAwKQorCQliYXNpY19tYWNoaW5lPW02OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmhbNDVdMDAwKQorCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmluZHk5NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAorCQlvcz0tbmluZHkKKwkJOzsKKwltb245NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAorCQlvcz0tbW9uOTYwCisJCTs7CisJbm9uc3RvcHV4KQorCQliYXNpY19tYWNoaW5lPW1pcHMtY29tcGFxCisJCW9zPS1ub25zdG9wdXgKKwkJOzsKKwlucDEpCisJCWJhc2ljX21hY2hpbmU9bnAxLWdvdWxkCisJCTs7CisJbmVvLXRhbmRlbSkKKwkJYmFzaWNfbWFjaGluZT1uZW8tdGFuZGVtCisJCTs7CisJbnNlLXRhbmRlbSkKKwkJYmFzaWNfbWFjaGluZT1uc2UtdGFuZGVtCisJCTs7CisJbnNyLXRhbmRlbSkKKwkJYmFzaWNfbWFjaGluZT1uc3ItdGFuZGVtCisJCTs7CisJb3A1MG4tKiB8IG9wNjBjLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJb3M9LXByb2VsZgorCQk7OworCW9wZW5yaXNjIHwgb3BlbnJpc2MtKikKKwkJYmFzaWNfbWFjaGluZT1vcjMyLXVua25vd24KKwkJOzsKKwlvczQwMCkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWlibQorCQlvcz0tb3M0MDAKKwkJOzsKKwlPU0U2ODAwMCB8IG9zZTY4MDAwKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1lcmljc3NvbgorCQlvcz0tb3NlCisJCTs7CisJb3M2OGspCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ub25lCisJCW9zPS1vczY4aworCQk7OworCXBhLWhpdGFjaGkpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCisJCW9zPS1oaXV4d2UyCisJCTs7CisJcGFyYWdvbikKKwkJYmFzaWNfbWFjaGluZT1pODYwLWludGVsCisJCW9zPS1vc2YKKwkJOzsKKwlwYXJpc2MpCisJCWJhc2ljX21hY2hpbmU9aHBwYS11bmtub3duCisJCW9zPS1saW51eAorCQk7OworCXBhcmlzYy0qKQorCQliYXNpY19tYWNoaW5lPWhwcGEtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJb3M9LWxpbnV4CisJCTs7CisJcGJkKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXR0aQorCQk7OworCXBiYikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXR0aQorCQk7OworCXBjNTMyIHwgcGM1MzItKikKKwkJYmFzaWNfbWFjaGluZT1uczMyay1wYzUzMgorCQk7OworCXBjOTgpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQk7OworCXBjOTgtKikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bSB8IHA1IHwgazUgfCBrNiB8IG5leGdlbiB8IHZpYWMzKQorCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKKwkJOzsKKwlwZW50aXVtcHJvIHwgcDYgfCA2eDg2IHwgYXRobG9uIHwgYXRobG9uXyopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQk7OworCXBlbnRpdW1paSB8IHBlbnRpdW0yIHwgcGVudGl1bWlpaSB8IHBlbnRpdW0zKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJOzsKKwlwZW50aXVtNCkKKwkJYmFzaWNfbWFjaGluZT1pNzg2LXBjCisJCTs7CisJcGVudGl1bS0qIHwgcDUtKiB8IGs1LSogfCBrNi0qIHwgbmV4Z2VuLSogfCB2aWFjMy0qKQorCQliYXNpY19tYWNoaW5lPWk1ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtcHJvLSogfCBwNi0qIHwgNng4Ni0qIHwgYXRobG9uLSopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW1paS0qIHwgcGVudGl1bTItKiB8IHBlbnRpdW1paWktKiB8IHBlbnRpdW0zLSopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW00LSopCisJCWJhc2ljX21hY2hpbmU9aTc4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBuKQorCQliYXNpY19tYWNoaW5lPXBuLWdvdWxkCisJCTs7CisJcG93ZXIpCWJhc2ljX21hY2hpbmU9cG93ZXItaWJtCisJCTs7CisJcHBjIHwgcHBjYmUpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCisJCTs7CisJcHBjLSogfCBwcGNiZS0qKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGNsZSB8IHBvd2VycGNsaXR0bGUgfCBwcGMtbGUgfCBwb3dlcnBjLWxpdHRsZSkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtdW5rbm93bgorCQk7OworCXBwY2xlLSogfCBwb3dlcnBjbGl0dGxlLSopCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHBjNjQpCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LXVua25vd24KKwkJOzsKKwlwcGM2NC0qKSBiYXNpY19tYWNoaW5lPXBvd2VycGM2NC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBwYzY0bGUgfCBwb3dlcnBjNjRsaXR0bGUgfCBwcGM2NC1sZSB8IHBvd2VycGM2NC1saXR0bGUpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtdW5rbm93bgorCQk7OworCXBwYzY0bGUtKiB8IHBvd2VycGM2NGxpdHRsZS0qKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGM2NGxlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtaWJtCisJCTs7CisJcHczMikKKwkJYmFzaWNfbWFjaGluZT1pNTg2LXVua25vd24KKwkJb3M9LXB3MzIKKwkJOzsKKwlyZG9zIHwgcmRvczY0KQorCQliYXNpY19tYWNoaW5lPXg4Nl82NC1wYworCQlvcz0tcmRvcworCQk7OworCXJkb3MzMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1yZG9zCisJCTs7CisJcm9tNjhrKQorCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCisJCW9zPS1jb2ZmCisJCTs7CisJcm1bNDZdMDApCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zaWVtZW5zCisJCTs7CisJcnRwYyB8IHJ0cGMtKikKKwkJYmFzaWNfbWFjaGluZT1yb21wLWlibQorCQk7OworCXMzOTAgfCBzMzkwLSopCisJCWJhc2ljX21hY2hpbmU9czM5MC1pYm0KKwkJOzsKKwlzMzkweCB8IHMzOTB4LSopCisJCWJhc2ljX21hY2hpbmU9czM5MHgtaWJtCisJCTs7CisJc2EyOTIwMCkKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tdWRpCisJCTs7CisJc2IxKQorCQliYXNpY19tYWNoaW5lPW1pcHNpc2E2NHNiMS11bmtub3duCisJCTs7CisJc2IxZWwpCisJCWJhc2ljX21hY2hpbmU9bWlwc2lzYTY0c2IxZWwtdW5rbm93bgorCQk7OworCXNkZSkKKwkJYmFzaWNfbWFjaGluZT1taXBzaXNhMzItc2RlCisJCW9zPS1lbGYKKwkJOzsKKwlzZWkpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zZWkKKwkJb3M9LXNlaXV4CisJCTs7CisJc2VxdWVudCkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKKwkJOzsKKwlzaCkKKwkJYmFzaWNfbWFjaGluZT1zaC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwlzaDVlbCkKKwkJYmFzaWNfbWFjaGluZT1zaDVsZS11bmtub3duCisJCTs7CisJc2g2NCkKKwkJYmFzaWNfbWFjaGluZT1zaDY0LXVua25vd24KKwkJOzsKKwlzcGFyY2xpdGUtd3JzIHwgc2ltc28td3JzKQorCQliYXNpY19tYWNoaW5lPXNwYXJjbGl0ZS13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwlzcHM3KQorCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAorCQlvcz0tc3lzdjIKKwkJOzsKKwlzcHVyKQorCQliYXNpY19tYWNoaW5lPXNwdXItdW5rbm93bgorCQk7OworCXN0MjAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXRhbmRlbQorCQk7OworCXN0cmF0dXMpCisJCWJhc2ljX21hY2hpbmU9aTg2MC1zdHJhdHVzCisJCW9zPS1zeXN2NAorCQk7OworCXN0cm9uZ2FybS0qIHwgdGh1bWItKikKKwkJYmFzaWNfbWFjaGluZT1hcm0tYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlzdW4yKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJOzsKKwlzdW4yb3MzKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjJvczQpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuM29zMykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3MzCisJCTs7CisJc3VuM29zNCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuNG9zMykKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjRvczQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zdW5vczQKKwkJOzsKKwlzdW40c29sMikKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJc3VuMyB8IHN1bjMtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQk7OworCXN1bjQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCTs7CisJc3VuMzg2IHwgc3VuMzg2aSB8IHJvYWRydW5uZXIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zdW4KKwkJOzsKKwlzdjEpCisJCWJhc2ljX21hY2hpbmU9c3YxLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXN5bW1ldHJ5KQorCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAorCQlvcz0tZHluaXgKKwkJOzsKKwl0M2UpCisJCWJhc2ljX21hY2hpbmU9YWxwaGFldjUtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJdDkwKQorCQliYXNpY19tYWNoaW5lPXQ5MC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwl0aWxlKikKKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCW9zPS1saW51eC1nbnUKKwkJOzsKKwl0eDM5KQorCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5LXVua25vd24KKwkJOzsKKwl0eDM5ZWwpCisJCWJhc2ljX21hY2hpbmU9bWlwc3R4MzllbC11bmtub3duCisJCTs7CisJdG9hZDEpCisJCWJhc2ljX21hY2hpbmU9cGRwMTAteGtsCisJCW9zPS10b3BzMjAKKwkJOzsKKwl0b3dlciB8IHRvd2VyLTMyKQorCQliYXNpY19tYWNoaW5lPW02OGstbmNyCisJCTs7CisJdHBmKQorCQliYXNpY19tYWNoaW5lPXMzOTB4LWlibQorCQlvcz0tdHBmCisJCTs7CisJdWRpMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwl1bHRyYTMpCisJCWJhc2ljX21hY2hpbmU9YTI5ay1ueXUKKwkJb3M9LXN5bTEKKwkJOzsKKwl2ODEwIHwgbmVjdjgxMCkKKwkJYmFzaWNfbWFjaGluZT12ODEwLW5lYworCQlvcz0tbm9uZQorCQk7OworCXZheHYpCisJCWJhc2ljX21hY2hpbmU9dmF4LWRlYworCQlvcz0tc3lzdgorCQk7OworCXZtcykKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCW9zPS12bXMKKwkJOzsKKwl2cHAqfHZ4fHZ4LSopCisJCWJhc2ljX21hY2hpbmU9ZjMwMS1mdWppdHN1CisJCTs7CisJdnh3b3Jrczk2MCkKKwkJYmFzaWNfbWFjaGluZT1pOTYwLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3M2OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3MyOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl3NjUqKQorCQliYXNpY19tYWNoaW5lPXc2NS13ZGMKKwkJb3M9LW5vbmUKKwkJOzsKKwl3ODlrLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCisJCW9zPS1wcm9lbGYKKwkJOzsKKwl4Ym94KQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJb3M9LW1pbmd3MzIKKwkJOzsKKwl4cHMgfCB4cHMxMDApCisJCWJhc2ljX21hY2hpbmU9eHBzMTAwLWhvbmV5d2VsbAorCQk7OworCXhzY2FsZS0qIHwgeHNjYWxlZVtibF0tKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eeHNjYWxlL2FybS8nYAorCQk7OworCXltcCkKKwkJYmFzaWNfbWFjaGluZT15bXAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJejhrLSotY29mZikKKwkJYmFzaWNfbWFjaGluZT16OGstdW5rbm93bgorCQlvcz0tc2ltCisJCTs7CisJejgwLSotY29mZikKKwkJYmFzaWNfbWFjaGluZT16ODAtdW5rbm93bgorCQlvcz0tc2ltCisJCTs7CisJbm9uZSkKKwkJYmFzaWNfbWFjaGluZT1ub25lLW5vbmUKKwkJb3M9LW5vbmUKKwkJOzsKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBtYW51ZmFjdHVyZXIgb2YgY2VydGFpbiBDUFUgdHlwZXMuICBJdCBpcyBpbgorIyBzb21lIGNhc2VzIHRoZSBvbmx5IG1hbnVmYWN0dXJlciwgaW4gb3RoZXJzLCBpdCBpcyB0aGUgbW9zdCBwb3B1bGFyLgorCXc4OWspCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCisJCTs7CisJb3A1MG4pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJOzsKKwlvcDYwYykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQorCQk7OworCXJvbXApCisJCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KKwkJOzsKKwltbWl4KQorCQliYXNpY19tYWNoaW5lPW1taXgta251dGgKKwkJOzsKKwlyczYwMDApCisJCWJhc2ljX21hY2hpbmU9cnM2MDAwLWlibQorCQk7OworCXZheCkKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCTs7CisJcGRwMTApCisJCSMgdGhlcmUgYXJlIG1hbnkgY2xvbmVzLCBzbyBERUMgaXMgbm90IGEgc2FmZSBiZXQKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC11bmtub3duCisJCTs7CisJcGRwMTEpCisJCWJhc2ljX21hY2hpbmU9cGRwMTEtZGVjCisJCTs7CisJd2UzMmspCisJCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0CisJCTs7CisJc2hbMTIzNF0gfCBzaFsyNF1hIHwgc2hbMjRdYWViIHwgc2hbMzRdZWIgfCBzaFsxMjM0XWxlIHwgc2hbMjNdZWxlKQorCQliYXNpY19tYWNoaW5lPXNoLXVua25vd24KKwkJOzsKKwlzcGFyYyB8IHNwYXJjdjggfCBzcGFyY3Y5IHwgc3BhcmN2OWIgfCBzcGFyY3Y5dikKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJOzsKKwljeWRyYSkKKwkJYmFzaWNfbWFjaGluZT1jeWRyYS1jeWRyb21lCisJCTs7CisJb3Jpb24pCisJCWJhc2ljX21hY2hpbmU9b3Jpb24taGlnaGxldmVsCisJCTs7CisJb3Jpb24xMDUpCisJCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1oaWdobGV2ZWwKKwkJOzsKKwltYWMgfCBtcHcgfCBtYWMtbXB3KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKKwkJOzsKKwlwbWFjIHwgcG1hYy1tcHcpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1hcHBsZQorCQk7OworCSotdW5rbm93bikKKwkJIyBNYWtlIHN1cmUgdG8gbWF0Y2ggYW4gYWxyZWFkeS1jYW5vbmljYWxpemVkIG1hY2hpbmUgbmFtZS4KKwkJOzsKKwkqKQorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7Citlc2FjCisKKyMgSGVyZSB3ZSBjYW5vbmljYWxpemUgY2VydGFpbiBhbGlhc2VzIGZvciBtYW51ZmFjdHVyZXJzLgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotZGlnaXRhbCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvZGlnaXRhbC4qL2RlYy8nYAorCQk7OworCSotY29tbW9kb3JlKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9jb21tb2RvcmUuKi9jYm0vJ2AKKwkJOzsKKwkqKQorCQk7OworZXNhYworCisjIERlY29kZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgYWxpYXNlcyBmb3IgY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KKworaWYgWyB4IiRvcyIgIT0geCIiIF0KK3RoZW4KK2Nhc2UgJG9zIGluCisJIyBGaXJzdCBtYXRjaCBzb21lIHN5c3RlbSB0eXBlIGFsaWFzZXMKKwkjIHRoYXQgbWlnaHQgZ2V0IGNvbmZ1c2VkIHdpdGggdmFsaWQgc3lzdGVtIHR5cGVzLgorCSMgLXNvbGFyaXMqIGlzIGEgYmFzaWMgc3lzdGVtIHR5cGUsIHdpdGggdGhpcyBvbmUgZXhjZXB0aW9uLgorCS1hdXJvcmF1eCkKKwkJb3M9LWF1cm9yYXV4CisJCTs7CisJLXNvbGFyaXMxIHwgLXNvbGFyaXMxLiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzb2xhcmlzMXxzdW5vczR8J2AKKwkJOzsKKwktc29sYXJpcykKKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJLXN2cjQqKQorCQlvcz0tc3lzdjQKKwkJOzsKKwktdW5peHdhcmUqKQorCQlvcz0tc3lzdjQuMnV3CisJCTs7CisJLWdudS9saW51eCopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xnbnUvbGludXh8bGludXgtZ251fCdgCisJCTs7CisJIyBGaXJzdCBhY2NlcHQgdGhlIGJhc2ljIHN5c3RlbSB0eXBlcy4KKwkjIFRoZSBwb3J0YWJsZSBzeXN0ZW1zIGNvbWVzIGZpcnN0LgorCSMgRWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiBBICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCisJIyAtc3lzdiogaXMgbm90IGhlcmUgYmVjYXVzZSBpdCBjb21lcyBsYXRlciwgYWZ0ZXIgc3lzdnI0LgorCS1nbnUqIHwgLWJzZCogfCAtbWFjaCogfCAtbWluaXgqIHwgLWdlbml4KiB8IC11bHRyaXgqIHwgLWlyaXgqIFwKKwkgICAgICB8IC0qdm1zKiB8IC1zY28qIHwgLWVzaXgqIHwgLWlzYyogfCAtYWl4KiB8IC1jbmsqIHwgLXN1bm9zIHwgLXN1bm9zWzM0XSpcCisJICAgICAgfCAtaHB1eCogfCAtdW5vcyogfCAtb3NmKiB8IC1sdW5hKiB8IC1kZ3V4KiB8IC1hdXJvcmF1eCogfCAtc29sYXJpcyogXAorCSAgICAgIHwgLXN5bSogfCAta29wZW5zb2xhcmlzKiB8IC1wbGFuOSogXAorCSAgICAgIHwgLWFtaWdhb3MqIHwgLWFtaWdhZG9zKiB8IC1tc2RvcyogfCAtbmV3c29zKiB8IC11bmljb3MqIHwgLWFvZiogXAorCSAgICAgIHwgLWFvcyogfCAtYXJvcyogXAorCSAgICAgIHwgLW5pbmR5KiB8IC12eHNpbSogfCAtdnh3b3JrcyogfCAtZWJtb24qIHwgLWhtcyogfCAtbXZzKiBcCisJICAgICAgfCAtY2xpeCogfCAtcmlzY29zKiB8IC11bmlwbHVzKiB8IC1pcmlzKiB8IC1ydHUqIHwgLXhlbml4KiBcCisJICAgICAgfCAtaGl1eCogfCAtMzg2YnNkKiB8IC1rbmV0YnNkKiB8IC1taXJic2QqIHwgLW5ldGJzZCogXAorCSAgICAgIHwgLWJpdHJpZyogfCAtb3BlbmJzZCogfCAtc29saWRic2QqIFwKKwkgICAgICB8IC1la2tvYnNkKiB8IC1rZnJlZWJzZCogfCAtZnJlZWJzZCogfCAtcmlzY2l4KiB8IC1seW54b3MqIFwKKwkgICAgICB8IC1ib3N4KiB8IC1uZXh0c3RlcCogfCAtY3h1eCogfCAtYW91dCogfCAtZWxmKiB8IC1vYWJpKiBcCisJICAgICAgfCAtcHR4KiB8IC1jb2ZmKiB8IC1lY29mZiogfCAtd2lubnQqIHwgLWRvbWFpbiogfCAtdnN0YSogXAorCSAgICAgIHwgLXVkaSogfCAtZWFiaSogfCAtbGl0ZXMqIHwgLWllZWUqIHwgLWdvMzIqIHwgLWF1eCogXAorCSAgICAgIHwgLWNob3J1c29zKiB8IC1jaG9ydXNyZGIqIHwgLWNlZ2NjKiBcCisJICAgICAgfCAtY3lnd2luKiB8IC1tc3lzKiB8IC1wZSogfCAtcHNvcyogfCAtbW9zcyogfCAtcHJvZWxmKiB8IC1ydGVtcyogXAorCSAgICAgIHwgLW1pbmd3MzIqIHwgLW1pbmd3NjQqIHwgLWxpbnV4LWdudSogfCAtbGludXgtYW5kcm9pZCogXAorCSAgICAgIHwgLWxpbnV4LW5ld2xpYiogfCAtbGludXgtbXVzbCogfCAtbGludXgtdWNsaWJjKiBcCisJICAgICAgfCAtdXhwdiogfCAtYmVvcyogfCAtbXBlaXgqIHwgLXVkayogXAorCSAgICAgIHwgLWludGVyaXgqIHwgLXV3aW4qIHwgLW1rcyogfCAtcmhhcHNvZHkqIHwgLWRhcndpbiogfCAtb3BlbmVkKiBcCisJICAgICAgfCAtb3BlbnN0ZXAqIHwgLW9za2l0KiB8IC1jb25peCogfCAtcHczMiogfCAtbm9uc3RvcHV4KiBcCisJICAgICAgfCAtc3Rvcm0tY2hhb3MqIHwgLXRvcHMxMCogfCAtdGVuZXgqIHwgLXRvcHMyMCogfCAtaXRzKiBcCisJICAgICAgfCAtb3MyKiB8IC12b3MqIHwgLXBhbG1vcyogfCAtdWNsaW51eCogfCAtbnVjbGV1cyogXAorCSAgICAgIHwgLW1vcnBob3MqIHwgLXN1cGVydXgqIHwgLXJ0bWsqIHwgLXJ0bWstbm92YSogfCAtd2luZGlzcyogXAorCSAgICAgIHwgLXBvd2VybWF4KiB8IC1kbml4KiB8IC1ueDYgfCAtbng3IHwgLXNlaSogfCAtZHJhZ29uZmx5KiBcCisJICAgICAgfCAtc2t5b3MqIHwgLWhhaWt1KiB8IC1yZG9zKiB8IC10b3BwZXJzKiB8IC1kcm9wcyogfCAtZXMqIHwgLXRpcnRvcyopCisJIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgorCQk7OworCS1xbngqKQorCQljYXNlICRiYXNpY19tYWNoaW5lIGluCisJCSAgICB4ODYtKiB8IGkqODYtKikKKwkJCTs7CisJCSAgICAqKQorCQkJb3M9LW50byRvcworCQkJOzsKKwkJZXNhYworCQk7OworCS1udG8tcW54KikKKwkJOzsKKwktbnRvKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG50b3xudG8tcW54fCdgCisJCTs7CisJLXNpbSB8IC1lczE4MDAqIHwgLWhtcyogfCAteHJheSB8IC1vczY4ayogfCAtbm9uZSogfCAtdjg4ciogXAorCSAgICAgIHwgLXdpbmRvd3MqIHwgLW9zeCB8IC1hYnVnIHwgLW5ldHdhcmUqIHwgLW9zOSogfCAtYmVvcyogfCAtaGFpa3UqIFwKKwkgICAgICB8IC1tYWNvcyogfCAtbXB3KiB8IC1tYWdpYyogfCAtbW1peHdhcmUqIHwgLW1vbjk2MCogfCAtbG5ld3MqKQorCQk7OworCS1tYWMqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bWFjfG1hY29zfCdgCisJCTs7CisJLWxpbnV4LWRpZXRsaWJjKQorCQlvcz0tbGludXgtZGlldGxpYmMKKwkJOzsKKwktbGludXgqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bGludXh8bGludXgtZ251fCdgCisJCTs7CisJLXN1bm9zNSopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczV8c29sYXJpczJ8J2AKKwkJOzsKKwktc3Vub3M2KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNnxzb2xhcmlzM3wnYAorCQk7OworCS1vcGVuZWQqKQorCQlvcz0tb3BlbmVkaXRpb24KKwkJOzsKKwktb3M0MDAqKQorCQlvcz0tb3M0MDAKKwkJOzsKKwktd2luY2UqKQorCQlvcz0td2luY2UKKwkJOzsKKwktb3Nmcm9zZSopCisJCW9zPS1vc2Zyb3NlCisJCTs7CisJLW9zZiopCisJCW9zPS1vc2YKKwkJOzsKKwktdXRlayopCisJCW9zPS1ic2QKKwkJOzsKKwktZHluaXgqKQorCQlvcz0tYnNkCisJCTs7CisJLWFjaXMqKQorCQlvcz0tYW9zCisJCTs7CisJLWF0aGVvcyopCisJCW9zPS1hdGhlb3MKKwkJOzsKKwktc3lsbGFibGUqKQorCQlvcz0tc3lsbGFibGUKKwkJOzsKKwktMzg2YnNkKQorCQlvcz0tYnNkCisJCTs7CisJLWN0aXgqIHwgLXV0cyopCisJCW9zPS1zeXN2CisJCTs7CisJLW5vdmEqKQorCQlvcz0tcnRtay1ub3ZhCisJCTs7CisJLW5zMiApCisJCW9zPS1uZXh0c3RlcDIKKwkJOzsKKwktbnNrKikKKwkJb3M9LW5zaworCQk7OworCSMgUHJlc2VydmUgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHNpbml4NS4KKwktc2luaXg1LiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzaW5peHxzeXN2fCdgCisJCTs7CisJLXNpbml4KikKKwkJb3M9LXN5c3Y0CisJCTs7CisJLXRwZiopCisJCW9zPS10cGYKKwkJOzsKKwktdHJpdG9uKikKKwkJb3M9LXN5c3YzCisJCTs7CisJLW9zcyopCisJCW9zPS1zeXN2MworCQk7OworCS1zdnI0KQorCQlvcz0tc3lzdjQKKwkJOzsKKwktc3ZyMykKKwkJb3M9LXN5c3YzCisJCTs7CisJLXN5c3ZyNCkKKwkJb3M9LXN5c3Y0CisJCTs7CisJIyBUaGlzIG11c3QgY29tZSBhZnRlciAtc3lzdnI0LgorCS1zeXN2KikKKwkJOzsKKwktb3NlKikKKwkJb3M9LW9zZQorCQk7OworCS1lczE4MDAqKQorCQlvcz0tb3NlCisJCTs7CisJLXhlbml4KQorCQlvcz0teGVuaXgKKwkJOzsKKwktKm1pbnQgfCAtbWludFswLTldKiB8IC0qTWlOVCB8IC1NaU5UWzAtOV0qKQorCQlvcz0tbWludAorCQk7OworCS1hcm9zKikKKwkJb3M9LWFyb3MKKwkJOzsKKwktenZtb2UpCisJCW9zPS16dm1vZQorCQk7OworCS1kaWNvcyopCisJCW9zPS1kaWNvcworCQk7OworCS1uYWNsKikKKwkJOzsKKwktbm9uZSkKKwkJOzsKKwkqKQorCQkjIEdldCByaWQgb2YgdGhlIGAtJyBhdCB0aGUgYmVnaW5uaW5nIG9mICRvcy4KKwkJb3M9YGVjaG8gJG9zIHwgc2VkICdzL1teLV0qLS8vJ2AKKwkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBzeXN0ZW0gXGAkb3NcJyBub3QgcmVjb2duaXplZCAxPiYyCisJCWV4aXQgMQorCQk7OworZXNhYworZWxzZQorCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgY29tZSB3aXRoIHZhcmlvdXMgbWFjaGluZXMuCisjIFRoZSB2YWx1ZSBzaG91bGQgYmUgd2hhdCB0aGUgdmVuZG9yIGN1cnJlbnRseSBzaGlwcyBvdXQgdGhlIGRvb3Igd2l0aCB0aGVpcgorIyBtYWNoaW5lIG9yIHB1dCBhbm90aGVyIHdheSwgdGhlIG1vc3QgcG9wdWxhciBvcyBwcm92aWRlZCB3aXRoIHRoZSBtYWNoaW5lLgorCisjIE5vdGUgdGhhdCBpZiB5b3UncmUgZ29pbmcgdG8gdHJ5IHRvIG1hdGNoICItTUFOVUZBQ1RVUkVSIiBoZXJlIChzYXksCisjICItc3VuIiksIHRoZW4geW91IGhhdmUgdG8gdGVsbCB0aGUgY2FzZSBzdGF0ZW1lbnQgdXAgdG93YXJkcyB0aGUgdG9wCisjIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZyBzeXN0ZW0uICBPdGhlcndpc2UsIGNvZGUgYWJvdmUKKyMgd2lsbCBzaWduYWwgYW4gZXJyb3Igc2F5aW5nIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZworIyBzeXN0ZW0sIGFuZCB3ZSdsbCBuZXZlciBnZXQgdG8gdGhpcyBwb2ludC4KKworY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCXNjb3JlLSopCisJCW9zPS1lbGYKKwkJOzsKKwlzcHUtKikKKwkJb3M9LWVsZgorCQk7OworCSotYWNvcm4pCisJCW9zPS1yaXNjaXgxLjIKKwkJOzsKKwlhcm0qLXJlYmVsKQorCQlvcz0tbGludXgKKwkJOzsKKwlhcm0qLXNlbWkpCisJCW9zPS1hb3V0CisJCTs7CisJYzR4LSogfCB0aWM0eC0qKQorCQlvcz0tY29mZgorCQk7OworCWM4MDUxLSopCisJCW9zPS1lbGYKKwkJOzsKKwloZXhhZ29uLSopCisJCW9zPS1lbGYKKwkJOzsKKwl0aWM1NHgtKikKKwkJb3M9LWNvZmYKKwkJOzsKKwl0aWM1NXgtKikKKwkJb3M9LWNvZmYKKwkJOzsKKwl0aWM2eC0qKQorCQlvcz0tY29mZgorCQk7OworCSMgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIHRoZSAqLWRlYyBlbnRyeS4KKwlwZHAxMC0qKQorCQlvcz0tdG9wczIwCisJCTs7CisJcGRwMTEtKikKKwkJb3M9LW5vbmUKKwkJOzsKKwkqLWRlYyB8IHZheC0qKQorCQlvcz0tdWx0cml4NC4yCisJCTs7CisJbTY4Ki1hcG9sbG8pCisJCW9zPS1kb21haW4KKwkJOzsKKwlpMzg2LXN1bikKKwkJb3M9LXN1bm9zNC4wLjIKKwkJOzsKKwltNjgwMDAtc3VuKQorCQlvcz0tc3Vub3MzCisJCTs7CisJbTY4Ki1jaXNjbykKKwkJb3M9LWFvdXQKKwkJOzsKKwltZXAtKikKKwkJb3M9LWVsZgorCQk7OworCW1pcHMqLWNpc2NvKQorCQlvcz0tZWxmCisJCTs7CisJbWlwcyotKikKKwkJb3M9LWVsZgorCQk7OworCW9yMzItKikKKwkJb3M9LWNvZmYKKwkJOzsKKwkqLXR0aSkJIyBtdXN0IGJlIGJlZm9yZSBzcGFyYyBlbnRyeSBvciB3ZSBnZXQgdGhlIHdyb25nIG9zLgorCQlvcz0tc3lzdjMKKwkJOzsKKwlzcGFyYy0qIHwgKi1zdW4pCisJCW9zPS1zdW5vczQuMS4xCisJCTs7CisJKi1iZSkKKwkJb3M9LWJlb3MKKwkJOzsKKwkqLWhhaWt1KQorCQlvcz0taGFpa3UKKwkJOzsKKwkqLWlibSkKKwkJb3M9LWFpeAorCQk7OworCSota251dGgpCisJCW9zPS1tbWl4d2FyZQorCQk7OworCSotd2VjKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi13aW5ib25kKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi1va2kpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwkqLWhwKQorCQlvcz0taHB1eAorCQk7OworCSotaGl0YWNoaSkKKwkJb3M9LWhpdXgKKwkJOzsKKwlpODYwLSogfCAqLWF0dCB8ICotbmNyIHwgKi1hbHRvcyB8ICotbW90b3JvbGEgfCAqLWNvbnZlcmdlbnQpCisJCW9zPS1zeXN2CisJCTs7CisJKi1jYm0pCisJCW9zPS1hbWlnYW9zCisJCTs7CisJKi1kZykKKwkJb3M9LWRndXgKKwkJOzsKKwkqLWRvbHBoaW4pCisJCW9zPS1zeXN2MworCQk7OworCW02OGstY2N1cikKKwkJb3M9LXJ0dQorCQk7OworCW04OGstb21yb24qKQorCQlvcz0tbHVuYQorCQk7OworCSotbmV4dCApCisJCW9zPS1uZXh0c3RlcAorCQk7OworCSotc2VxdWVudCkKKwkJb3M9LXB0eAorCQk7OworCSotY3JkcykKKwkJb3M9LXVub3MKKwkJOzsKKwkqLW5zKQorCQlvcz0tZ2VuaXgKKwkJOzsKKwlpMzcwLSopCisJCW9zPS1tdnMKKwkJOzsKKwkqLW5leHQpCisJCW9zPS1uZXh0c3RlcDMKKwkJOzsKKwkqLWdvdWxkKQorCQlvcz0tc3lzdgorCQk7OworCSotaGlnaGxldmVsKQorCQlvcz0tYnNkCisJCTs7CisJKi1lbmNvcmUpCisJCW9zPS1ic2QKKwkJOzsKKwkqLXNnaSkKKwkJb3M9LWlyaXgKKwkJOzsKKwkqLXNpZW1lbnMpCisJCW9zPS1zeXN2NAorCQk7OworCSotbWFzc2NvbXApCisJCW9zPS1ydHUKKwkJOzsKKwlmMzBbMDFdLWZ1aml0c3UgfCBmNzAwLWZ1aml0c3UpCisJCW9zPS11eHB2CisJCTs7CisJKi1yb202OGspCisJCW9zPS1jb2ZmCisJCTs7CisJKi0qYnVnKQorCQlvcz0tY29mZgorCQk7OworCSotYXBwbGUpCisJCW9zPS1tYWNvcworCQk7OworCSotYXRhcmkqKQorCQlvcz0tbWludAorCQk7OworCSopCisJCW9zPS1ub25lCisJCTs7Citlc2FjCitmaQorCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGtub3cgdGhlIG9zLCBhbmQgdGhlIENQVSB0eXBlLCBidXQgbm90IHRoZQorIyBtYW51ZmFjdHVyZXIuICBXZSBwaWNrIHRoZSBsb2dpY2FsIG1hbnVmYWN0dXJlci4KK3ZlbmRvcj11bmtub3duCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJKi11bmtub3duKQorCQljYXNlICRvcyBpbgorCQkJLXJpc2NpeCopCisJCQkJdmVuZG9yPWFjb3JuCisJCQkJOzsKKwkJCS1zdW5vcyopCisJCQkJdmVuZG9yPXN1bgorCQkJCTs7CisJCQktY25rKnwtYWl4KikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1iZW9zKikKKwkJCQl2ZW5kb3I9YmUKKwkJCQk7OworCQkJLWhwdXgqKQorCQkJCXZlbmRvcj1ocAorCQkJCTs7CisJCQktbXBlaXgqKQorCQkJCXZlbmRvcj1ocAorCQkJCTs7CisJCQktaGl1eCopCisJCQkJdmVuZG9yPWhpdGFjaGkKKwkJCQk7OworCQkJLXVub3MqKQorCQkJCXZlbmRvcj1jcmRzCisJCQkJOzsKKwkJCS1kZ3V4KikKKwkJCQl2ZW5kb3I9ZGcKKwkJCQk7OworCQkJLWx1bmEqKQorCQkJCXZlbmRvcj1vbXJvbgorCQkJCTs7CisJCQktZ2VuaXgqKQorCQkJCXZlbmRvcj1ucworCQkJCTs7CisJCQktbXZzKiB8IC1vcGVuZWQqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLW9zNDAwKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1wdHgqKQorCQkJCXZlbmRvcj1zZXF1ZW50CisJCQkJOzsKKwkJCS10cGYqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC13aW5kaXNzKikKKwkJCQl2ZW5kb3I9d3JzCisJCQkJOzsKKwkJCS1hdXgqKQorCQkJCXZlbmRvcj1hcHBsZQorCQkJCTs7CisJCQktaG1zKikKKwkJCQl2ZW5kb3I9aGl0YWNoaQorCQkJCTs7CisJCQktbXB3KiB8IC1tYWNvcyopCisJCQkJdmVuZG9yPWFwcGxlCisJCQkJOzsKKwkJCS0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCisJCQkJdmVuZG9yPWF0YXJpCisJCQkJOzsKKwkJCS12b3MqKQorCQkJCXZlbmRvcj1zdHJhdHVzCisJCQkJOzsKKwkJZXNhYworCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICJzL3Vua25vd24vJHZlbmRvci8iYAorCQk7OworZXNhYworCitlY2hvICRiYXNpY19tYWNoaW5lJG9zCitleGl0CisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgorIyB0aW1lLXN0YW1wLWVuZDogIiciCisjIEVuZDoKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZSBiL2NvbmZpZ3VyZQppbmRleCAzOTQ4MDgwLi4yYzFjODJkIDEwMDc1NQotLS0gYS9jb25maWd1cmUKKysrIGIvY29uZmlndXJlCkBAIC0xLDE0ICsxLDEyIEBACiAjISAvYmluL3NoCi0jIEZyb20gY29uZmlndXJlLmluIFJldmlzaW9uLgorIyBGcm9tIGNvbmZpZ3VyZS5hYyBSZXZpc2lvbi4KICMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY3IGZvciBweXRob24gMi43LgorIyBHZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjkgZm9yIHB5dGhvbiAyLjcuCiAjCiAjIFJlcG9ydCBidWdzIHRvIDxodHRwOi8vYnVncy5weXRob24ub3JnLz4uCiAjCiAjCi0jIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKLSMgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4KKyMgQ29weXJpZ2h0IChDKSAxOTkyLTE5OTYsIDE5OTgtMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICMKICMKICMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KQEAgLTkyLDYgKzkwLDcgQEAKIElGUz0iICIiCSRhc19ubCIKIAogIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gZGlyZWN0b3J5IHNlcGFyYXRvci4KK2FzX215c2VsZj0KIGNhc2UgJDAgaW4gIygoCiAgICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKICAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgpAQCAtMTM2LDYgKzEzNSwzMSBAQAogIyBDRFBBVEguCiAodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICiAKKyMgVXNlIGEgcHJvcGVyIGludGVybmFsIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGVuc3VyZSB3ZSBkb24ndCBmYWxsCisgICMgaW50byBhbiBpbmZpbml0ZSBsb29wLCBjb250aW51b3VzbHkgcmUtZXhlY3V0aW5nIG91cnNlbHZlcy4KKyAgaWYgdGVzdCB4IiR7X2FzX2Nhbl9yZWV4ZWN9IiAhPSB4bm8gJiYgdGVzdCAieCRDT05GSUdfU0hFTEwiICE9IHg7IHRoZW4KKyAgICBfYXNfY2FuX3JlZXhlYz1ubzsgZXhwb3J0IF9hc19jYW5fcmVleGVjOworICAgICMgV2UgY2Fubm90IHlldCBhc3N1bWUgYSBkZWNlbnQgc2hlbGwsIHNvIHdlIGhhdmUgdG8gcHJvdmlkZSBhCisjIG5ldXRyYWxpemF0aW9uIHZhbHVlIGZvciBzaGVsbHMgd2l0aG91dCB1bnNldDsgYW5kIHRoaXMgYWxzbworIyB3b3JrcyBhcm91bmQgc2hlbGxzIHRoYXQgY2Fubm90IHVuc2V0IG5vbmV4aXN0ZW50IHZhcmlhYmxlcy4KKyMgUHJlc2VydmUgLXYgYW5kIC14IHRvIHRoZSByZXBsYWNlbWVudCBzaGVsbC4KK0JBU0hfRU5WPS9kZXYvbnVsbAorRU5WPS9kZXYvbnVsbAorKHVuc2V0IEJBU0hfRU5WKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQkFTSF9FTlYgRU5WCitjYXNlICQtIGluICMgKCgoKAorICAqdip4KiB8ICp4KnYqICkgYXNfb3B0cz0tdnggOzsKKyAgKnYqICkgYXNfb3B0cz0tdiA7OworICAqeCogKSBhc19vcHRzPS14IDs7CisgICogKSBhc19vcHRzPSA7OworZXNhYworZXhlYyAkQ09ORklHX1NIRUxMICRhc19vcHRzICIkYXNfbXlzZWxmIiAkezErIiRAIn0KKyMgQWRtaXR0ZWRseSwgdGhpcyBpcyBxdWl0ZSBwYXJhbm9pZCwgc2luY2UgYWxsIHRoZSBrbm93biBzaGVsbHMgYmFpbAorIyBvdXQgYWZ0ZXIgYSBmYWlsZWQgYGV4ZWMnLgorJGFzX2VjaG8gIiQwOiBjb3VsZCBub3QgcmUtZXhlY3V0ZSB3aXRoICRDT05GSUdfU0hFTEwiID4mMgorYXNfZm5fZXhpdCAyNTUKKyAgZmkKKyAgIyBXZSBkb24ndCB3YW50IHRoaXMgdG8gcHJvcGFnYXRlIHRvIG90aGVyIHN1YnByb2Nlc3Nlcy4KKyAgICAgICAgICB7IF9hc19jYW5fcmVleGVjPTsgdW5zZXQgX2FzX2Nhbl9yZWV4ZWM7fQogaWYgdGVzdCAieCRDT05GSUdfU0hFTEwiID0geDsgdGhlbgogICBhc19ib3VybmVfY29tcGF0aWJsZT0iaWYgdGVzdCAtbiBcIlwke1pTSF9WRVJTSU9OK3NldH1cIiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKICAgZW11bGF0ZSBzaApAQCAtMTY5LDcgKzE5Myw4IEBACiBlbHNlCiAgIGV4aXRjb2RlPTE7IGVjaG8gcG9zaXRpb25hbCBwYXJhbWV0ZXJzIHdlcmUgbm90IHNhdmVkLgogZmkKLXRlc3QgeFwkZXhpdGNvZGUgPSB4MCB8fCBleGl0IDEiCit0ZXN0IHhcJGV4aXRjb2RlID0geDAgfHwgZXhpdCAxCit0ZXN0IC14IC8gfHwgZXhpdCAxIgogICBhc19zdWdnZXN0ZWQ9IiAgYXNfbGluZW5vXzE9Ijthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCRMSU5FTk87YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQiIGFzX2xpbmVub18xYT1cJExJTkVOTwogICBhc19saW5lbm9fMj0iO2FzX3N1Z2dlc3RlZD0kYXNfc3VnZ2VzdGVkJExJTkVOTzthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCIgYXNfbGluZW5vXzJhPVwkTElORU5PCiAgIGV2YWwgJ3Rlc3QgXCJ4XCRhc19saW5lbm9fMSdcJGFzX3J1bidcIiAhPSBcInhcJGFzX2xpbmVub18yJ1wkYXNfcnVuJ1wiICYmCkBAIC0yMTQsMTQgKzIzOSwyNSBAQAogCiAKICAgICAgIGlmIHRlc3QgIngkQ09ORklHX1NIRUxMIiAhPSB4OyB0aGVuIDoKLSAgIyBXZSBjYW5ub3QgeWV0IGFzc3VtZSBhIGRlY2VudCBzaGVsbCwgc28gd2UgaGF2ZSB0byBwcm92aWRlIGEKLQkjIG5ldXRyYWxpemF0aW9uIHZhbHVlIGZvciBzaGVsbHMgd2l0aG91dCB1bnNldDsgYW5kIHRoaXMgYWxzbwotCSMgd29ya3MgYXJvdW5kIHNoZWxscyB0aGF0IGNhbm5vdCB1bnNldCBub25leGlzdGVudCB2YXJpYWJsZXMuCi0JQkFTSF9FTlY9L2Rldi9udWxsCi0JRU5WPS9kZXYvbnVsbAotCSh1bnNldCBCQVNIX0VOVikgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IEJBU0hfRU5WIEVOVgotCWV4cG9ydCBDT05GSUdfU0hFTEwKLQlleGVjICIkQ09ORklHX1NIRUxMIiAiJGFzX215c2VsZiIgJHsxKyIkQCJ9CisgIGV4cG9ydCBDT05GSUdfU0hFTEwKKyAgICAgICAgICAgICAjIFdlIGNhbm5vdCB5ZXQgYXNzdW1lIGEgZGVjZW50IHNoZWxsLCBzbyB3ZSBoYXZlIHRvIHByb3ZpZGUgYQorIyBuZXV0cmFsaXphdGlvbiB2YWx1ZSBmb3Igc2hlbGxzIHdpdGhvdXQgdW5zZXQ7IGFuZCB0aGlzIGFsc28KKyMgd29ya3MgYXJvdW5kIHNoZWxscyB0aGF0IGNhbm5vdCB1bnNldCBub25leGlzdGVudCB2YXJpYWJsZXMuCisjIFByZXNlcnZlIC12IGFuZCAteCB0byB0aGUgcmVwbGFjZW1lbnQgc2hlbGwuCitCQVNIX0VOVj0vZGV2L251bGwKK0VOVj0vZGV2L251bGwKKyh1bnNldCBCQVNIX0VOVikgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IEJBU0hfRU5WIEVOVgorY2FzZSAkLSBpbiAjICgoKCgKKyAgKnYqeCogfCAqeCp2KiApIGFzX29wdHM9LXZ4IDs7CisgICp2KiApIGFzX29wdHM9LXYgOzsKKyAgKngqICkgYXNfb3B0cz0teCA7OworICAqICkgYXNfb3B0cz0gOzsKK2VzYWMKK2V4ZWMgJENPTkZJR19TSEVMTCAkYXNfb3B0cyAiJGFzX215c2VsZiIgJHsxKyIkQCJ9CisjIEFkbWl0dGVkbHksIHRoaXMgaXMgcXVpdGUgcGFyYW5vaWQsIHNpbmNlIGFsbCB0aGUga25vd24gc2hlbGxzIGJhaWwKKyMgb3V0IGFmdGVyIGEgZmFpbGVkIGBleGVjJy4KKyRhc19lY2hvICIkMDogY291bGQgbm90IHJlLWV4ZWN1dGUgd2l0aCAkQ09ORklHX1NIRUxMIiA+JjIKK2V4aXQgMjU1CiBmaQogCiAgICAgaWYgdGVzdCB4JGFzX2hhdmVfcmVxdWlyZWQgPSB4bm87IHRoZW4gOgpAQCAtMzI0LDYgKzM2MCwxNCBAQAogCiAKIH0gIyBhc19mbl9ta2Rpcl9wCisKKyMgYXNfZm5fZXhlY3V0YWJsZV9wIEZJTEUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGVzdCBpZiBGSUxFIGlzIGFuIGV4ZWN1dGFibGUgcmVndWxhciBmaWxlLgorYXNfZm5fZXhlY3V0YWJsZV9wICgpCit7CisgIHRlc3QgLWYgIiQxIiAmJiB0ZXN0IC14ICIkMSIKK30gIyBhc19mbl9leGVjdXRhYmxlX3AKICMgYXNfZm5fYXBwZW5kIFZBUiBWQUxVRQogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIEFwcGVuZCB0aGUgdGV4dCBpbiBWQUxVRSB0byB0aGUgZW5kIG9mIHRoZSBkZWZpbml0aW9uIGNvbnRhaW5lZCBpbiBWQVIuIFRha2UKQEAgLTQ0NSw2ICs0ODksMTAgQEAKICAgY2htb2QgK3ggIiRhc19tZS5saW5lbm8iIHx8CiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSAkYXNfbWUubGluZW5vOyByZXJ1biB3aXRoIGEgUE9TSVggc2hlbGwiID4mMjsgYXNfZm5fZXhpdCAxOyB9CiAKKyAgIyBJZiB3ZSBoYWQgdG8gcmUtZXhlY3V0ZSB3aXRoICRDT05GSUdfU0hFTEwsIHdlJ3JlIGVuc3VyZWQgdG8gaGF2ZQorICAjIGFscmVhZHkgZG9uZSB0aGF0LCBzbyBlbnN1cmUgd2UgZG9uJ3QgdHJ5IHRvIGRvIHNvIGFnYWluIGFuZCBmYWxsCisgICMgaW4gYW4gaW5maW5pdGUgbG9vcC4gIFRoaXMgaGFzIGFscmVhZHkgaGFwcGVuZWQgaW4gcHJhY3RpY2UuCisgIF9hc19jYW5fcmVleGVjPW5vOyBleHBvcnQgX2FzX2Nhbl9yZWV4ZWMKICAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKICAgIyAodGhlIGRpcm5hbWUgb2YgJFswXSBpcyBub3QgdGhlIHBsYWNlIHdoZXJlIHdlIG1pZ2h0IGZpbmQgdGhlCiAgICMgb3JpZ2luYWwgYW5kIHNvIG9uLiAgQXV0b2NvbmYgaXMgZXNwZWNpYWxseSBzZW5zaXRpdmUgdG8gdGhpcykuCkBAIC00NzksMTYgKzUyNywxNiBAQAogICAgICMgLi4uIGJ1dCB0aGVyZSBhcmUgdHdvIGdvdGNoYXM6CiAgICAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KICAgICAjIDIpIERKR1BQIDwgMi4wNCBoYXMgbm8gc3ltbGlua3M7IGBsbiAtcycgY3JlYXRlcyBhIHdyYXBwZXIgZXhlY3V0YWJsZS4KLSAgICAjIEluIGJvdGggY2FzZXMsIHdlIGhhdmUgdG8gZGVmYXVsdCB0byBgY3AgLXAnLgorICAgICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcFInLgogICAgIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKLSAgICAgIGFzX2xuX3M9J2NwIC1wJworICAgICAgYXNfbG5fcz0nY3AgLXBSJwogICBlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgogICAgIGFzX2xuX3M9bG4KICAgZWxzZQotICAgIGFzX2xuX3M9J2NwIC1wJworICAgIGFzX2xuX3M9J2NwIC1wUicKICAgZmkKIGVsc2UKLSAgYXNfbG5fcz0nY3AgLXAnCisgIGFzX2xuX3M9J2NwIC1wUicKIGZpCiBybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZGlyL2NvbmYkJC5maWxlIGNvbmYkJC5maWxlCiBybWRpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCkBAIC01MDAsMjggKzU0OCw4IEBACiAgIGFzX21rZGlyX3A9ZmFsc2UKIGZpCiAKLWlmIHRlc3QgLXggLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYXNfdGVzdF94PSd0ZXN0IC14JwotZWxzZQotICBpZiBscyAtZEwgLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBhc19sc19MX29wdGlvbj1MCi0gIGVsc2UKLSAgICBhc19sc19MX29wdGlvbj0KLSAgZmkKLSAgYXNfdGVzdF94PScKLSAgICBldmFsIHNoIC1jICdcJycKLSAgICAgIGlmIHRlc3QgLWQgIiQxIjsgdGhlbgotCXRlc3QgLWQgIiQxLy4iOwotICAgICAgZWxzZQotCWNhc2UgJDEgaW4gIygKLQktKilzZXQgIi4vJDEiOzsKLQllc2FjOwotCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluICMoKAotCT8/P1tzeF0qKTo7OyopZmFsc2U7O2VzYWM7ZmkKLSAgICAnXCcnIHNoCi0gICcKLWZpCi1hc19leGVjdXRhYmxlX3A9JGFzX3Rlc3RfeAorYXNfdGVzdF94PSd0ZXN0IC14JworYXNfZXhlY3V0YWJsZV9wPWFzX2ZuX2V4ZWN1dGFibGVfcAogCiAjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCiBhc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgpAQCAtNjE2LDYgKzY0NCw4IEBACiBVU0VfVEhSRUFEX01PRFVMRQogU0lHTkFMX09CSlMKIFVTRV9TSUdOQUxfTU9EVUxFCitUQ0xUS19MSUJTCitUQ0xUS19JTkNMVURFUwogTElCRkZJX0lOQ0xVREVESVIKIFBLR19DT05GSUcKIFNITElCUwpAQCAtNjMyLDYgKzY2Miw3IEBACiBCQVNFQ0ZMQUdTCiBPUFQKIExOCitNS0RJUl9QCiBJTlNUQUxMX0RBVEEKIElOU1RBTExfU0NSSVBUCiBJTlNUQUxMX1BST0dSQU0KQEAgLTYzOSw4ICs2NzAsMTAgQEAKIEhHQlJBTkNICiBIR1RBRwogSEdWRVJTSU9OCitCQVNFQ1BQRkxBR1MKIFNWTlZFUlNJT04KIEFSRkxBR1MKK2FjX2N0X0FSCiBBUgogUkFOTElCCiBHTlVMRApAQCAtNjU2LDYgKzY4OSw4IEBACiBFR1JFUAogR1JFUAogQ1BQCitNVUxUSUFSQ0gKK2FjX2N0X0NYWAogTUFJTkNDCiBDWFgKIE9CSkVYVApAQCAtNjcwLDYgKzcwNSw3IEBACiBFWFRSQU1BQ0hERVBQQVRICiBFWFRSQVBMQVRESVIKIFNHSV9BQkkKK19QWVRIT05fSE9TVF9QTEFURk9STQogTUFDSERFUAogRlJBTUVXT1JLSU5TVEFMTEFQUFNQUkVGSVgKIEZSQU1FV09SS1VOSVhUT09MU1BSRUZJWApAQCAtNjg4LDYgKzcyNCwxNSBAQAogQ09ORklHX0FSR1MKIFNPVkVSU0lPTgogVkVSU0lPTgorUFlUSE9OX0ZPUl9CVUlMRAoraG9zdF9vcworaG9zdF92ZW5kb3IKK2hvc3RfY3B1Citob3N0CitidWlsZF9vcworYnVpbGRfdmVuZG9yCitidWlsZF9jcHUKK2J1aWxkCiB0YXJnZXRfYWxpYXMKIGhvc3RfYWxpYXMKIGJ1aWxkX2FsaWFzCkBAIC03NDMsNiArNzg4LDggQEAKIHdpdGhfbGlicwogd2l0aF9zeXN0ZW1fZXhwYXQKIHdpdGhfc3lzdGVtX2ZmaQord2l0aF90Y2x0a19pbmNsdWRlcword2l0aF90Y2x0a19saWJzCiB3aXRoX2RibWxpYm9yZGVyCiB3aXRoX3NpZ25hbF9tb2R1bGUKIHdpdGhfZGVjX3RocmVhZHMKQEAgLTExNzQsNyArMTIyMSw3IEBACiAgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogeW91IHNob3VsZCB1c2UgLS1idWlsZCwgLS1ob3N0LCAtLXRhcmdldCIgPiYyCiAgICAgZXhwciAieCRhY19vcHRpb24iIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCiAgICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpbnZhbGlkIGhvc3QgdHlwZTogJGFjX29wdGlvbiIgPiYyCi0gICAgOiAke2J1aWxkX2FsaWFzPSRhY19vcHRpb259ICR7aG9zdF9hbGlhcz0kYWNfb3B0aW9ufSAke3RhcmdldF9hbGlhcz0kYWNfb3B0aW9ufQorICAgIDogIiR7YnVpbGRfYWxpYXM9JGFjX29wdGlvbn0gJHtob3N0X2FsaWFzPSRhY19vcHRpb259ICR7dGFyZ2V0X2FsaWFzPSRhY19vcHRpb259IgogICAgIDs7CiAKICAgZXNhYwpAQCAtMTIyNSw4ICsxMjcyLDYgQEAKIGlmIHRlc3QgIngkaG9zdF9hbGlhcyIgIT0geDsgdGhlbgogICBpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiA9IHg7IHRoZW4KICAgICBjcm9zc19jb21waWxpbmc9bWF5YmUKLSAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpZiB5b3Ugd2FudGVkIHRvIHNldCB0aGUgLS1idWlsZCB0eXBlLCBkb24ndCB1c2UgLS1ob3N0LgotICAgIElmIGEgY3Jvc3MgY29tcGlsZXIgaXMgZGV0ZWN0ZWQgdGhlbiBjcm9zcyBjb21waWxlIG1vZGUgd2lsbCBiZSB1c2VkIiA+JjIKICAgZWxpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiAhPSAieCRob3N0X2FsaWFzIjsgdGhlbgogICAgIGNyb3NzX2NvbXBpbGluZz15ZXMKICAgZmkKQEAgLTEzNjgsNiArMTQxMywxMCBAQAogX0FDRU9GCiAKICAgY2F0IDw8XF9BQ0VPRgorCitTeXN0ZW0gdHlwZXM6CisgIC0tYnVpbGQ9QlVJTEQgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW2d1ZXNzZWRdCisgIC0taG9zdD1IT1NUICAgICAgIGNyb3NzLWNvbXBpbGUgdG8gYnVpbGQgcHJvZ3JhbXMgdG8gcnVuIG9uIEhPU1QgW0JVSUxEXQogX0FDRU9GCiBmaQogCkBAIC0xNDE0LDYgKzE0NjMsMTAgQEAKICAgLS13aXRoLXN5c3RlbS1leHBhdCAgICAgYnVpbGQgcHlleHBhdCBtb2R1bGUgdXNpbmcgYW4gaW5zdGFsbGVkIGV4cGF0CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnkKICAgLS13aXRoLXN5c3RlbS1mZmkgICAgICAgYnVpbGQgX2N0eXBlcyBtb2R1bGUgdXNpbmcgYW4gaW5zdGFsbGVkIGZmaSBsaWJyYXJ5CisgIC0td2l0aC10Y2x0ay1pbmNsdWRlcz0nLUkuLi4nCisgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlIHNlYXJjaCBmb3IgVGNsIGFuZCBUayBpbmNsdWRlIGZpbGVzCisgIC0td2l0aC10Y2x0ay1saWJzPSctTC4uLicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGUgc2VhcmNoIGZvciBUY2wgYW5kIFRrIGxpYnMKICAgLS13aXRoLWRibWxpYm9yZGVyPWRiMTpkYjI6Li4uCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyIHRvIGNoZWNrIGRiIGJhY2tlbmRzIGZvciBkYm0uIFZhbGlkIHZhbHVlIGlzIGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb24gc2VwYXJhdGVkIHN0cmluZyB3aXRoIHRoZSBiYWNrZW5kIG5hbWVzCkBAIC0xNTExLDkgKzE1NjQsOSBAQAogaWYgJGFjX2luaXRfdmVyc2lvbjsgdGhlbgogICBjYXQgPDxcX0FDRU9GCiBweXRob24gY29uZmlndXJlIDIuNwotZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY3CitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjkKIAotQ29weXJpZ2h0IChDKSAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorQ29weXJpZ2h0IChDKSAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KIF9BQ0VPRgpAQCAtMTU1Nyw3ICsxNjEwLDcgQEAKIAogCWFjX3JldHZhbD0xCiBmaQotICBldmFsICRhc19saW5lbm9fc3RhY2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHggJiYgeyBhc19saW5lbm89OyB1bnNldCBhc19saW5lbm87fQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KICAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCiAKIH0gIyBhY19mbl9jX3RyeV9jb21waWxlCkBAIC0xNTk0LDcgKzE2NDcsNyBAQAogCiAgICAgYWNfcmV0dmFsPTEKIGZpCi0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9CisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwogICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKIAogfSAjIGFjX2ZuX2NfdHJ5X2NwcApAQCAtMTYwNywxMCArMTY2MCwxMCBAQAogYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAoKQogewogICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gIGlmIGV2YWwgInRlc3QgXCJcJHskMytzZXR9XCIiID0gc2V0OyB0aGVuIDoKKyAgaWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6CiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQotaWYgZXZhbCAidGVzdCBcIlwkeyQzK3NldH1cIiIgPSBzZXQ7IHRoZW4gOgoraWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBmaQogZXZhbCBhY19yZXM9XCQkMwpAQCAtMTY3Nyw3ICsxNzMwLDcgQEAKIGVzYWMKICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9Ci1pZiBldmFsICJ0ZXN0IFwiXCR7JDMrc2V0fVwiIiA9IHNldDsgdGhlbiA6CitpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgZXZhbCAiJDM9XCRhY19oZWFkZXJfY29tcGlsZXIiCkBAIC0xNjg2LDcgKzE3MzksNyBAQAogCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiAkYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CiBmaQotICBldmFsICRhc19saW5lbm9fc3RhY2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHggJiYgeyBhc19saW5lbm89OyB1bnNldCBhc19saW5lbm87fQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KIAogfSAjIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwKIApAQCAtMTcyNyw3ICsxNzgwLDcgQEAKICAgICAgICBhY19yZXR2YWw9JGFjX3N0YXR1cwogZmkKICAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0gY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbwotICBldmFsICRhc19saW5lbm9fc3RhY2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHggJiYgeyBhc19saW5lbm89OyB1bnNldCBhc19saW5lbm87fQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KICAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCiAKIH0gIyBhY19mbl9jX3RyeV9ydW4KQEAgLTE3NDEsNyArMTc5NCw3IEBACiAgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9Ci1pZiBldmFsICJ0ZXN0IFwiXCR7JDMrc2V0fVwiIiA9IHNldDsgdGhlbiA6CitpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dApAQCAtMTc1OSw3ICsxODEyLDcgQEAKIGV2YWwgYWNfcmVzPVwkJDMKIAkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQogJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQotICBldmFsICRhc19saW5lbm9fc3RhY2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHggJiYgeyBhc19saW5lbm89OyB1bnNldCBhc19saW5lbm87fQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KIAogfSAjIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUKIApAQCAtMTc5MCw3ICsxODQzLDcgQEAKIAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgogICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgewogCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAotCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorCSB0ZXN0IC14IGNvbmZ0ZXN0JGFjX2V4ZWV4dAogICAgICAgIH07IHRoZW4gOgogICBhY19yZXR2YWw9MAogZWxzZQpAQCAtMTgwNCw3ICsxODU3LDcgQEAKICAgIyBpbnRlcmZlcmUgd2l0aCB0aGUgbmV4dCBsaW5rIGNvbW1hbmQ7IGFsc28gZGVsZXRlIGEgZGlyZWN0b3J5IHRoYXQgaXMKICAgIyBsZWZ0IGJlaGluZCBieSBBcHBsZSdzIGNvbXBpbGVyLiAgV2UgZG8gdGhpcyBiZWZvcmUgZXhlY3V0aW5nIHRoZSBhY3Rpb25zLgogICBybSAtcmYgY29uZnRlc3QuZFNZTSBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vCi0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9CisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwogICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKIAogfSAjIGFjX2ZuX2NfdHJ5X2xpbmsKQEAgLTE4MTgsNyArMTg3MSw3IEBACiAgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9Ci1pZiBldmFsICJ0ZXN0IFwiXCR7JDMrc2V0fVwiIiA9IHNldDsgdGhlbiA6CitpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgZXZhbCAiJDM9bm8iCkBAIC0xODU5LDcgKzE5MTIsNyBAQAogZXZhbCBhY19yZXM9XCQkMwogCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiAkYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9CisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwogCiB9ICMgYWNfZm5fY19jaGVja190eXBlCiAKQEAgLTE4NzIsNyArMTkyNSw3IEBACiAgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdWludCQyX3QiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHVpbnQkMl90Li4uICIgPiY2OyB9Ci1pZiBldmFsICJ0ZXN0IFwiXCR7JDMrc2V0fVwiIiA9IHNldDsgdGhlbiA6CitpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgZXZhbCAiJDM9bm8iCkBAIC0xODg3LDcgKzE5NDAsOCBAQAogbWFpbiAoKQogewogc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKCgkYWNfdHlwZSkgLTEgPj4gKCQyIC8gMiAtIDEpKSA+PiAoJDIgLyAyIC0gMSkgPT0gMyldOwotdGVzdF9hcnJheSBbMF0gPSAwCit0ZXN0X2FycmF5IFswXSA9IDA7CityZXR1cm4gdGVzdF9hcnJheSBbMF07CiAKICAgOwogICByZXR1cm4gMDsKQEAgLTE5MTIsNyArMTk2Niw3IEBACiBldmFsIGFjX3Jlcz1cJCQzCiAJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKICRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KLSAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyB0ZXN0ICJ4JGFzX2xpbmVub19zdGFjayIgPSB4ICYmIHsgYXNfbGluZW5vPTsgdW5zZXQgYXNfbGluZW5vO30KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCiAKIH0gIyBhY19mbl9jX2ZpbmRfdWludFhfdAogCkBAIC0xOTI1LDcgKzE5NzksNyBAQAogICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGludCQyX3QiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGludCQyX3QuLi4gIiA+JjY7IH0KLWlmIGV2YWwgInRlc3QgXCJcJHskMytzZXR9XCIiID0gc2V0OyB0aGVuIDoKK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBldmFsICIkMz1ubyIKQEAgLTE5NDEsNyArMTk5NSw4IEBACiBtYWluICgpCiB7CiBzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgwIDwgKCRhY190eXBlKSAoKCgoKCRhY190eXBlKSAxIDw8IE4pIDw8IE4pIC0gMSkgKiAyICsgMSkpXTsKLXRlc3RfYXJyYXkgWzBdID0gMAordGVzdF9hcnJheSBbMF0gPSAwOworcmV0dXJuIHRlc3RfYXJyYXkgWzBdOwogCiAgIDsKICAgcmV0dXJuIDA7CkBAIC0xOTU3LDcgKzIwMTIsOCBAQAogewogc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKCRhY190eXBlKSAoKCgoKCRhY190eXBlKSAxIDw8IE4pIDw8IE4pIC0gMSkgKiAyICsgMSkKIAkJIDwgKCRhY190eXBlKSAoKCgoKCRhY190eXBlKSAxIDw8IE4pIDw8IE4pIC0gMSkgKiAyICsgMikpXTsKLXRlc3RfYXJyYXkgWzBdID0gMAordGVzdF9hcnJheSBbMF0gPSAwOworcmV0dXJuIHRlc3RfYXJyYXkgWzBdOwogCiAgIDsKICAgcmV0dXJuIDA7CkBAIC0xOTg2LDcgKzIwNDIsNyBAQAogZXZhbCBhY19yZXM9XCQkMwogCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiAkYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9CisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwogCiB9ICMgYWNfZm5fY19maW5kX2ludFhfdAogCkBAIC0yMDA3LDcgKzIwNjMsOCBAQAogbWFpbiAoKQogewogc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKCQyKSA+PSAwKV07Ci10ZXN0X2FycmF5IFswXSA9IDAKK3Rlc3RfYXJyYXkgWzBdID0gMDsKK3JldHVybiB0ZXN0X2FycmF5IFswXTsKIAogICA7CiAgIHJldHVybiAwOwpAQCAtMjAyMyw3ICsyMDgwLDggQEAKIG1haW4gKCkKIHsKIHN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgkMikgPD0gJGFjX21pZCldOwotdGVzdF9hcnJheSBbMF0gPSAwCit0ZXN0X2FycmF5IFswXSA9IDA7CityZXR1cm4gdGVzdF9hcnJheSBbMF07CiAKICAgOwogICByZXR1cm4gMDsKQEAgLTIwNDksNyArMjEwNyw4IEBACiBtYWluICgpCiB7CiBzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoJDIpIDwgMCldOwotdGVzdF9hcnJheSBbMF0gPSAwCit0ZXN0X2FycmF5IFswXSA9IDA7CityZXR1cm4gdGVzdF9hcnJheSBbMF07CiAKICAgOwogICByZXR1cm4gMDsKQEAgLTIwNjUsNyArMjEyNCw4IEBACiBtYWluICgpCiB7CiBzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoJDIpID49ICRhY19taWQpXTsKLXRlc3RfYXJyYXkgWzBdID0gMAordGVzdF9hcnJheSBbMF0gPSAwOworcmV0dXJuIHRlc3RfYXJyYXkgWzBdOwogCiAgIDsKICAgcmV0dXJuIDA7CkBAIC0yMDk5LDcgKzIxNTksOCBAQAogbWFpbiAoKQogewogc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKCQyKSA8PSAkYWNfbWlkKV07Ci10ZXN0X2FycmF5IFswXSA9IDAKK3Rlc3RfYXJyYXkgWzBdID0gMDsKK3JldHVybiB0ZXN0X2FycmF5IFswXTsKIAogICA7CiAgIHJldHVybiAwOwpAQCAtMjE2Myw3ICsyMjI0LDcgQEAKIHJtIC1mIGNvbmZ0ZXN0LnZhbAogCiAgIGZpCi0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9CisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwogICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKIAogfSAjIGFjX2ZuX2NfY29tcHV0ZV9pbnQKQEAgLTIxNzYsNyArMjIzNyw3IEBACiAgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9Ci1pZiBldmFsICJ0ZXN0IFwiXCR7JDMrc2V0fVwiIiA9IHNldDsgdGhlbiA6CitpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dApAQCAtMjIzMSw3ICsyMjkyLDcgQEAKIGV2YWwgYWNfcmVzPVwkJDMKIAkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQogJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQotICBldmFsICRhc19saW5lbm9fc3RhY2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHggJiYgeyBhc19saW5lbm89OyB1bnNldCBhc19saW5lbm87fQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KIAogfSAjIGFjX2ZuX2NfY2hlY2tfZnVuYwogCkBAIC0yMjQ0LDcgKzIzMDUsNyBAQAogICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyLiQzIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4kMy4uLiAiID4mNjsgfQotaWYgZXZhbCAidGVzdCBcIlwkeyQ0K3NldH1cIiIgPSBzZXQ7IHRoZW4gOgoraWYgZXZhbCBcJHskNCs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKQEAgLTIyODgsNyArMjM0OSw3IEBACiBldmFsIGFjX3Jlcz1cJCQ0CiAJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKICRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KLSAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyB0ZXN0ICJ4JGFzX2xpbmVub19zdGFjayIgPSB4ICYmIHsgYXNfbGluZW5vPTsgdW5zZXQgYXNfbGluZW5vO30KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCiAKIH0gIyBhY19mbl9jX2NoZWNrX21lbWJlcgogCkBAIC0yMzAzLDcgKzIzNjQsNyBAQAogICBhc19kZWNsX3VzZT1gZWNobyAkMnxzZWQgLWUgJ3MvKC8oKC8nIC1lICdzLykvKSAwJi8nIC1lICdzLywvKSAwJiAoL2cnYAogICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJGFzX2RlY2xfbmFtZSBpcyBkZWNsYXJlZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRhc19kZWNsX25hbWUgaXMgZGVjbGFyZWQuLi4gIiA+JjY7IH0KLWlmIGV2YWwgInRlc3QgXCJcJHskMytzZXR9XCIiID0gc2V0OyB0aGVuIDoKK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CkBAIC0yMzM0LDcgKzIzOTUsNyBAQAogZXZhbCBhY19yZXM9XCQkMwogCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiAkYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9CisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwogCiB9ICMgYWNfZm5fY19jaGVja19kZWNsCiBjYXQgPmNvbmZpZy5sb2cgPDxfQUNFT0YKQEAgLTIzNDIsNyArMjQwMyw3IEBACiBydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgogCiBJdCB3YXMgY3JlYXRlZCBieSBweXRob24gJGFzX21lIDIuNywgd2hpY2ggd2FzCi1nZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjcuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OS4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcwogCiAgICQgJDAgJEAKIApAQCAtMjYwMCw3ICsyNjYxLDcgQEAKICAgICAgIHx8IHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQogJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQogYXNfZm5fZXJyb3IgJD8gImZhaWxlZCB0byBsb2FkIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1IDsgfQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KICAgZmkKIGRvbmUKIApAQCAtMjY5Myw2ICsyNzU0LDEzNCBAQAogYWNfY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyBweWNvbmZpZy5oIgogCiAKK2FjX2F1eF9kaXI9Citmb3IgYWNfZGlyIGluICIkc3JjZGlyIiAiJHNyY2Rpci8uLiIgIiRzcmNkaXIvLi4vLi4iOyBkbworICBpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwtc2giOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvaW5zdGFsbC5zaCI7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAiJGFjX2Rpci9zaHRvb2wiOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvc2h0b29sIGluc3RhbGwgLWMiCisgICAgYnJlYWsKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY2Fubm90IGZpbmQgaW5zdGFsbC1zaCwgaW5zdGFsbC5zaCwgb3Igc2h0b29sIGluIFwiJHNyY2RpclwiIFwiJHNyY2Rpci8uLlwiIFwiJHNyY2Rpci8uLi8uLlwiIiAiJExJTkVOTyIgNQorZmkKKworIyBUaGVzZSB0aHJlZSB2YXJpYWJsZXMgYXJlIHVuZG9jdW1lbnRlZCBhbmQgdW5zdXBwb3J0ZWQsCisjIGFuZCBhcmUgaW50ZW5kZWQgdG8gYmUgd2l0aGRyYXduIGluIGEgZnV0dXJlIEF1dG9jb25mIHJlbGVhc2UuCisjIFRoZXkgY2FuIGNhdXNlIHNlcmlvdXMgcHJvYmxlbXMgaWYgYSBidWlsZGVyJ3Mgc291cmNlIHRyZWUgaXMgaW4gYSBkaXJlY3RvcnkKKyMgd2hvc2UgZnVsbCBuYW1lIGNvbnRhaW5zIHVudXN1YWwgY2hhcmFjdGVycy4KK2FjX2NvbmZpZ19ndWVzcz0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KK2FjX2NvbmZpZ19zdWI9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgorYWNfY29uZmlndXJlPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlndXJlIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgorCisKKyMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KKyRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgc3VuNCA+L2Rldi9udWxsIDI+JjEgfHwKKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBydW4gJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICIkTElORU5PIiA1CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfYnVpbGQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19idWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKK3Rlc3QgIngkYWNfYnVpbGRfYWxpYXMiID0geCAmJgorICBhY19idWlsZF9hbGlhcz1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiYAordGVzdCAieCRhY19idWlsZF9hbGlhcyIgPSB4ICYmCisgIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZ3Vlc3MgYnVpbGQgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiICIkTElORU5PIiA1CithY19jdl9idWlsZD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkYWNfYnVpbGRfYWxpYXNgIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkYWNfYnVpbGRfYWxpYXMgZmFpbGVkIiAiJExJTkVOTyIgNQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9idWlsZCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2J1aWxkIiA+JjY7IH0KK2Nhc2UgJGFjX2N2X2J1aWxkIGluCisqLSotKikgOzsKKyopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBidWlsZCIgIiRMSU5FTk8iIDU7OworZXNhYworYnVpbGQ9JGFjX2N2X2J1aWxkCithY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCitzZXQgeCAkYWNfY3ZfYnVpbGQKK3NoaWZ0CitidWlsZF9jcHU9JDEKK2J1aWxkX3ZlbmRvcj0kMgorc2hpZnQ7IHNoaWZ0CisjIFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIElGUyBpcyB1c2VkIHRvIGNyZWF0ZSAkKiwKKyMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoKK2J1aWxkX29zPSQqCitJRlM9JGFjX3NhdmVfSUZTCitjYXNlICRidWlsZF9vcyBpbiAqXCAqKSBidWlsZF9vcz1gZWNobyAiJGJ1aWxkX29zIiB8IHNlZCAncy8gLy0vZydgOzsgZXNhYworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2hvc3QrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiID0geDsgdGhlbgorICBhY19jdl9ob3N0PSRhY19jdl9idWlsZAorZWxzZQorICBhY19jdl9ob3N0PWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICRob3N0X2FsaWFzYCB8fAorICAgIGFzX2ZuX2Vycm9yICQ/ICIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkaG9zdF9hbGlhcyBmYWlsZWQiICIkTElORU5PIiA1CitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9ob3N0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaG9zdCIgPiY2OyB9CitjYXNlICRhY19jdl9ob3N0IGluCisqLSotKikgOzsKKyopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBob3N0IiAiJExJTkVOTyIgNTs7Citlc2FjCitob3N0PSRhY19jdl9ob3N0CithY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCitzZXQgeCAkYWNfY3ZfaG9zdAorc2hpZnQKK2hvc3RfY3B1PSQxCitob3N0X3ZlbmRvcj0kMgorc2hpZnQ7IHNoaWZ0CisjIFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIElGUyBpcyB1c2VkIHRvIGNyZWF0ZSAkKiwKKyMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoKK2hvc3Rfb3M9JCoKK0lGUz0kYWNfc2F2ZV9JRlMKK2Nhc2UgJGhvc3Rfb3MgaW4gKlwgKikgaG9zdF9vcz1gZWNobyAiJGhvc3Rfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCisKKworCisKKworaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBweXRob24gaW50ZXJwcmV0ZXIgZm9yIGNyb3NzIGJ1aWxkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBweXRob24gaW50ZXJwcmV0ZXIgZm9yIGNyb3NzIGJ1aWxkLi4uICIgPiY2OyB9CisgICAgaWYgdGVzdCAteiAiJFBZVEhPTl9GT1JfQlVJTEQiOyB0aGVuCisgICAgICAgIGZvciBpbnRlcnAgaW4gcHl0aG9uJFBBQ0tBR0VfVkVSU0lPTiBweXRob24yIHB5dGhvbjsgZG8KKwkgICAgd2hpY2ggJGludGVycCA+L2Rldi9udWxsIDI+JjEgfHwgY29udGludWUKKwkgICAgaWYgJGludGVycCAtYyAnaW1wb3J0IHN5cztzeXMuZXhpdChub3QgKHN5cy52ZXJzaW9uX2luZm9bOjJdID49ICgyLDcpIGFuZCBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMykpJzsgdGhlbgorCSAgICAgICAgYnJlYWsKKwkgICAgZmkKKyAgICAgICAgICAgIGludGVycD0KKwlkb25lCisgICAgICAgIGlmIHRlc3QgeCRpbnRlcnAgPSB4OyB0aGVuCisJICAgIGFzX2ZuX2Vycm9yICQ/ICJweXRob24kUEFDS0FHRV9WRVJTSU9OIGludGVycHJldGVyIG5vdCBmb3VuZCIgIiRMSU5FTk8iIDUKKwlmaQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGludGVycCIgPiY1CiskYXNfZWNobyAiJGludGVycCIgPiY2OyB9CisJUFlUSE9OX0ZPUl9CVUlMRD0nX1BZVEhPTl9QUk9KRUNUX0JBU0U9JChhYnNfYnVpbGRkaXIpIF9QWVRIT05fSE9TVF9QTEFURk9STT0kKF9QWVRIT05fSE9TVF9QTEFURk9STSkgUFlUSE9OUEFUSD0kKHNoZWxsIHRlc3QgLWYgcHlidWlsZGRpci50eHQgJiYgZWNobyAkKGFic19idWlsZGRpcikvYGNhdCBweWJ1aWxkZGlyLnR4dGA6KSQoc3JjZGlyKS9MaWI6JChzcmNkaXIpL0xpYi9wbGF0LSQoTUFDSERFUCkgJyRpbnRlcnAKKyAgICBmaQorZWxpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IG1heWJlOyB0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gIkNyb3NzIGNvbXBpbGluZyByZXF1aXJlZCAtLWhvc3Q9SE9TVC1UVVBMRSBhbmQgLS1idWlsZD1BUkNIIiAiJExJTkVOTyIgNQorZWxzZQorICAgIFBZVEhPTl9GT1JfQlVJTEQ9Jy4vJChCVUlMRFBZVEhPTikgLUUnCitmaQorCisKIAogaWYgdGVzdCAiJHByZWZpeCIgIT0gIi8iOyB0aGVuCiAgICAgcHJlZml4PWBlY2hvICIkcHJlZml4IiB8IHNlZCAtZSAncy9cLyQvL2cnYApAQCAtMjgwMCw2ICsyOTg5LDcgQEAKIAogCiAKK0FSQ0hfUlVOXzMyQklUPSIiCiAKIFVOSVZFUlNBTF9BUkNIUz0iMzItYml0IgogCkBAIC0yOTgxLDYgKzMxNzEsMjUgQEAKICRhc19lY2hvX24gImNoZWNraW5nIE1BQ0hERVAuLi4gIiA+JjY7IH0KIGlmIHRlc3QgLXogIiRNQUNIREVQIgogdGhlbgorICAgICMgYXZvaWQgdXNpbmcgdW5hbWUgZm9yIGNyb3NzIGJ1aWxkcworICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgICAgICAgIyBhY19zeXNfc3lzdGVtIGFuZCBhY19zeXNfcmVsZWFzZSBhcmUgb25seSB1c2VkIGZvciBzZXR0aW5nCisgICAgICAgIyBgZGVmaW5lX3hvcGVuX3NvdXJjZScgaW4gdGhlIGNhc2Ugc3RhdGVtZW50IGJlbG93LiBGb3IgdGhlCisgICAgICAgIyBjdXJyZW50IHN1cHBvcnRlZCBjcm9zcyBidWlsZHMsIHRoaXMgbWFjcm8gaXMgbm90IGFkanVzdGVkLgorCWNhc2UgIiRob3N0IiBpbgorCSotKi1saW51eCopCisJCWFjX3N5c19zeXN0ZW09TGludXgKKwkJOzsKKwkqLSotY3lnd2luKikKKwkJYWNfc3lzX3N5c3RlbT1DeWd3aW4KKwkJOzsKKwkqKQorCQkjIGZvciBub3csIGxpbWl0IGNyb3NzIGJ1aWxkcyB0byBrbm93biBjb25maWd1cmF0aW9ucworCQlNQUNIREVQPSJ1bmtub3duIgorCQlhc19mbl9lcnJvciAkPyAiY3Jvc3MgYnVpbGQgbm90IHN1cHBvcnRlZCBmb3IgJGhvc3QiICIkTElORU5PIiA1CisJZXNhYworCWFjX3N5c19yZWxlYXNlPQorICAgIGVsc2UKIAlhY19zeXNfc3lzdGVtPWB1bmFtZSAtc2AKIAlpZiB0ZXN0ICIkYWNfc3lzX3N5c3RlbSIgPSAiQUlYIiBcCiAJLW8gIiRhY19zeXNfc3lzdGVtIiA9ICJVbml4V2FyZSIgLW8gIiRhY19zeXNfc3lzdGVtIiA9ICJPcGVuVU5JWCI7IHRoZW4KQEAgLTI5ODgsMjAgKzMxOTcsNDQgQEAKIAllbHNlCiAJCWFjX3N5c19yZWxlYXNlPWB1bmFtZSAtcmAKIAlmaQotCWFjX21kX3N5c3RlbT1gZWNobyAkYWNfc3lzX3N5c3RlbSB8Ci0JCQkgICB0ciAtZCAnLyAnIHwgdHIgJ1tBLVpdJyAnW2Etel0nYAotCWFjX21kX3JlbGVhc2U9YGVjaG8gJGFjX3N5c19yZWxlYXNlIHwKLQkJCSAgIHRyIC1kICcvICcgfCBzZWQgJ3MvXltBLVpdXC4vLycgfCBzZWQgJ3MvXC4uKi8vJ2AKLQlNQUNIREVQPSIkYWNfbWRfc3lzdGVtJGFjX21kX3JlbGVhc2UiCisgICAgZmkKKyAgICBhY19tZF9zeXN0ZW09YGVjaG8gJGFjX3N5c19zeXN0ZW0gfAorCQkJdHIgLWQgJy8gJyB8IHRyICdbQS1aXScgJ1thLXpdJ2AKKyAgICBhY19tZF9yZWxlYXNlPWBlY2hvICRhY19zeXNfcmVsZWFzZSB8CisJCQl0ciAtZCAnLyAnIHwgc2VkICdzL15bQS1aXVwuLy8nIHwgc2VkICdzL1wuLiovLydgCisgICAgTUFDSERFUD0iJGFjX21kX3N5c3RlbSRhY19tZF9yZWxlYXNlIgogCi0JY2FzZSAkTUFDSERFUCBpbgorICAgIGNhc2UgJE1BQ0hERVAgaW4KIAlsaW51eCopIE1BQ0hERVA9ImxpbnV4MiI7OwogCWN5Z3dpbiopIE1BQ0hERVA9ImN5Z3dpbiI7OwogCWRhcndpbiopIE1BQ0hERVA9ImRhcndpbiI7OwogCWF0aGVvcyopIE1BQ0hERVA9ImF0aGVvcyI7OwogICAgICAgICBpcml4NjQ2KSBNQUNIREVQPSJpcml4NiI7OwogCScnKQlNQUNIREVQPSJ1bmtub3duIjs7CisgICAgZXNhYworZmkKKworCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorCWNhc2UgIiRob3N0IiBpbgorCSotKi1saW51eCopCisJCWNhc2UgIiRob3N0X2NwdSIgaW4KKwkJYXJtKikKKwkJCV9ob3N0X2NwdT1hcm0KKwkJCTs7CisJCSopCisJCQlfaG9zdF9jcHU9JGhvc3RfY3B1CisJCWVzYWMKKwkJOzsKKwkqLSotY3lnd2luKikKKwkJX2hvc3RfY3B1PQorCQk7OworCSopCisJCSMgZm9yIG5vdywgbGltaXQgY3Jvc3MgYnVpbGRzIHRvIGtub3duIGNvbmZpZ3VyYXRpb25zCisJCU1BQ0hERVA9InVua25vd24iCisJCWFzX2ZuX2Vycm9yICQ/ICJjcm9zcyBidWlsZCBub3Qgc3VwcG9ydGVkIGZvciAkaG9zdCIgIiRMSU5FTk8iIDUKIAllc2FjCisJX1BZVEhPTl9IT1NUX1BMQVRGT1JNPSIkTUFDSERFUCR7X2hvc3RfY3B1OistJF9ob3N0X2NwdX0iCiBmaQogCiAjIFNvbWUgc3lzdGVtcyBjYW5ub3Qgc3RhbmQgX1hPUEVOX1NPVVJDRSBiZWluZyBkZWZpbmVkIGF0IGFsbDsgdGhleQpAQCAtMzE1OCwxMiArMzM5MSw2IEBACiBDT05GSUdVUkVfTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUPQogRVhQT1JUX01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVD0nIycKIAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBtYWNoaW5lIHR5cGUgYXMgcmVwb3J0ZWQgYnkgdW5hbWUgLW0iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgbWFjaGluZSB0eXBlIGFzIHJlcG9ydGVkIGJ5IHVuYW1lIC1tLi4uICIgPiY2OyB9Ci1hY19zeXNfbWFjaGluZT1gdW5hbWUgLW1gCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3N5c19tYWNoaW5lIiA+JjUKLSRhc19lY2hvICIkYWNfc3lzX21hY2hpbmUiID4mNjsgfQotCiAjIGNoZWNrcyBmb3IgYWx0ZXJuYXRpdmUgcHJvZ3JhbXMKIAogIyBjb21waWxlciBmbGFncyBhcmUgZ2VuZXJhdGVkIGluIHR3byBzZXRzLCBCQVNFQ0ZMQUdTIGFuZCBPUFQuICBPUFQgaXMganVzdApAQCAtMzIyOCw2ICszNDU1LDM5IEBACiAoaXQgaXMgYWxzbyBhIGdvb2QgaWRlYSB0byBkbyAnbWFrZSBjbGVhbicgYmVmb3JlIGNvbXBpbGluZykiICIkTElORU5PIiA1CiBmaQogCitpZiB0ZXN0ICIkTUFDSERFUCIgPSAiaXJpeDYiICYmIHRlc3QgIiRDQyIgIT0gImdjYyI7IHRoZW4KKyAgICAjIE5vcm1hbGx5LCBNSVBTcHJvIENDIHRyZWF0cyAjZXJyb3IgZGlyZWN0aXZlcyBhcyB3YXJuaW5ncywgd2hpY2ggbWVhbnMKKyAgICAjIGEgc3VjY2Vzc2Z1bCBleGl0IGNvZGUgaXMgcmV0dXJuZWQgKDApLiAgVGhpcyBpcyBhIHByb2JsZW0gYmVjYXVzZSBJUklYCisgICAgIyBoYXMgYSBidW5jaCBvZiBzeXN0ZW0gaGVhZGVycyB3aXRoIHRoaXMgZ3VhcmQgYXQgdGhlIHRvcDoKKyAgICAjCisgICAgIyAgI2lmbmRlZiBfX2M5OQorICAgICMgICNlcnJvciBUaGlzIGhlYWRlciBmaWxlIGlzIHRvIGJlIHVzZWQgb25seSBmb3IgYzk5IG1vZGUgY29tcGlsYXRpb25zCisgICAgIyAgI2Vsc2UKKyAgICAjCisgICAgIyBXaGVuIGF1dG9jb25mIHRlc3RzIGZvciBzdWNoIGEgaGVhZGVyLCBsaWtlIHN0ZGludC5oLCB0aGlzIGhhcHBlbnM6CisgICAgIworICAgICMgIGNvbmZpZ3VyZTo0NjE5OiBjYyAtYyAgIGNvbmZ0ZXN0LmMgPiY1CisgICAgIyAgY2MtMTAzNSBjYzogV0FSTklORyBGaWxlID0gL3Vzci9pbmNsdWRlL3N0ZGludC5oLCBMaW5lID0gNQorICAgICMgICAgI2Vycm9yIGRpcmVjdGl2ZTogIFRoaXMgaGVhZGVyIGZpbGUgaXMgdG8gYmUgdXNlZCBvbmx5IGZvciBjOTkgbW9kZQorICAgICMgICAgICAgICAgICBjb21waWxhdGlvbnMKKyAgICAjCisgICAgIyAgICAjZXJyb3IgVGhpcyBoZWFkZXIgZmlsZSBpcyB0byBiZSB1c2VkIG9ubHkgZm9yIGM5OSBtb2RlIGNvbXBpbGF0aW9ucworICAgICMgICAgIF4KKyAgICAjCisgICAgIyAgY29uZmlndXJlOjQ2MTk6ICQ/ID0gMAorICAgICMgIGNvbmZpZ3VyZTo0NjE5OiByZXN1bHQ6IHllcworICAgICMKKyAgICAjIFRoZXJlZm9yZSwgd2UgdXNlIGAtZGlhZ19lcnJvciAxMDM1YCB0byBoYXZlIHRoZSBjb21waWxlciB0cmVhdCB0aGUKKyAgICAjIHdhcm5pbmcgYXMgYW4gZXJyb3IsIHdoaWNoIGNhdXNlcyBjYyB0byByZXR1cm4gYSBub24temVybyByZXN1bHQsCisgICAgIyB3aGljaCBhdXRvY29uZiBjYW4gaW50ZXJwcmV0IGNvcnJlY3RseS4KKyAgICBDRkxBR1M9IiRDRkxBR1MgLWRpYWdfZXJyb3IgMTAzNSIKKyAgICAjIFdoaWxzdCB3ZSdyZSBoZXJlLCB3ZSBtaWdodCBhcyB3ZWxsIG1ha2Ugc3VyZSBDWFggZGVmYXVsdHMgdG8gc29tZXRoaW5nCisgICAgIyBzZW5zaWJsZSBpZiB3ZSdyZSBub3QgdXNpbmcgZ2NjLgorICAgIGlmIHRlc3QgLXogIiRDWFgiOyB0aGVuCisgICAgICAgIENYWD0iQ0MiCisgICAgZmkKK2ZpCisKICMgSWYgdGhlIHVzZXIgc2V0IENGTEFHUywgdXNlIHRoaXMgaW5zdGVhZCBvZiB0aGUgYXV0b21hdGljYWxseQogIyBkZXRlcm1pbmVkIHNldHRpbmcKIHByZXNldF9jZmxhZ3M9IiRDRkxBR1MiCkBAIC0zMjQxLDcgKzM1MDEsNyBAQAogc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Z2NjOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3Byb2dfQ0MrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCkBAIC0zMjUzLDcgKzM1MTMsNyBAQAogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgogICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Z2NjIgogICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKQEAgLTMyODEsNyArMzU0MSw3IEBACiBzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfQ0MrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCkBAIC0zMjkzLDcgKzM1NTMsNyBAQAogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgogICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9ImdjYyIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCkBAIC0zMzM0LDcgKzM1OTQsNyBAQAogc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Y2M7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfcHJvZ19DQys6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KQEAgLTMzNDYsNyArMzYwNiw3IEBACiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCiAgICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1jYyIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCkBAIC0zMzc0LDcgKzM2MzQsNyBAQAogc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3Byb2dfQ0MrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCkBAIC0zMzg3LDcgKzM2NDcsNyBAQAogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgogICAgIGlmIHRlc3QgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgogICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCiAgICAgICAgY29udGludWUKQEAgLTM0MzMsNyArMzY5Myw3IEBACiBzZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfcHJvZ19DQys6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KQEAgLTM0NDUsNyArMzcwNSw3IEBACiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCiAgICAgYWNfY3ZfcHJvZ19DQz0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCiAgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgpAQCAtMzQ3Nyw3ICszNzM3LDcgQEAKIHNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9wcm9nX2FjX2N0X0NDKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgpAQCAtMzQ4OSw3ICszNzQ5LDcgQEAKICAgSUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KICAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfcHJvZyIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCkBAIC0zNTMyLDcgKzM3OTIsNyBAQAogdGVzdCAteiAiJENDIiAmJiB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KIGFzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNSA7IH0KK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CiAKICMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIHZlcnNpb24iID4mNQpAQCAtMzY0Nyw3ICszOTA3LDcgQEAKIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQogJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQogYXNfZm5fZXJyb3IgNzcgIkMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDUgOyB9CitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQogZWxzZQogICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKICRhc19lY2hvICJ5ZXMiID4mNjsgfQpAQCAtMzY5MCw3ICszOTUwLDcgQEAKICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9CiBhc19mbl9lcnJvciAkPyAiY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluawotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDUgOyB9CitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQogZmkKIHJtIC1mIGNvbmZ0ZXN0IGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9leGVleHQiID4mNQpAQCAtMzc0OSw3ICs0MDA5LDcgQEAKICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgcnVuIEMgY29tcGlsZWQgcHJvZ3JhbXMuCiBJZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4KLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1IDsgfQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KICAgICBmaQogICBmaQogZmkKQEAgLTM3NjAsNyArNDAyMCw3IEBACiBhY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcyIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcy4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9vYmpleHQrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9vYmpleHQrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CkBAIC0zODAxLDcgKzQwNjEsNyBAQAogeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9CiBhc19mbl9lcnJvciAkPyAiY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIG9iamVjdCBmaWxlczogY2Fubm90IGNvbXBpbGUKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1IDsgfQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KIGZpCiBybSAtZiBjb25mdGVzdC4kYWNfY3Zfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCkBAIC0zODExLDcgKzQwNzEsNyBAQAogYWNfb2JqZXh0PSRPQkpFWFQKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlci4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9jX2NvbXBpbGVyX2dudStzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X2NfY29tcGlsZXJfZ251Kzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dApAQCAtMzg0OCw3ICs0MTA4LDcgQEAKIGFjX3NhdmVfQ0ZMQUdTPSRDRkxBR1MKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZyIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfY2NfZytzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3Byb2dfY2NfZys6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGFjX3NhdmVfY193ZXJyb3JfZmxhZz0kYWNfY193ZXJyb3JfZmxhZwpAQCAtMzkyNiw3ICs0MTg2LDcgQEAKIGZpCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5IiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5Li4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfY2NfYzg5K3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfcHJvZ19jY19jODkrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBhY19jdl9wcm9nX2NjX2M4OT1ubwpAQCAtMzkzNSw4ICs0MTk1LDcgQEAKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICNpbmNsdWRlIDxzdGRhcmcuaD4KICNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CitzdHJ1Y3Qgc3RhdDsKIC8qIE1vc3Qgb2YgdGhlIGZvbGxvd2luZyB0ZXN0cyBhcmUgc3RvbGVuIGZyb20gUkNTIDUuNydzIHNyYy9jb25mLnNoLiAgKi8KIHN0cnVjdCBidWYgeyBpbnQgeDsgfTsKIEZJTEUgKiAoKnJjc29wZW4pIChzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCk7CkBAIC00MDYxLDExICs0MzIwLDExMCBAQAogaWYgdGVzdCAteiAiJENYWCIKIHRoZW4KICAgICAgICAgY2FzZSAiJENDIiBpbgotICAgICAgICBnY2MpICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZysrIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KKyAgICAgICAgZ2NjKSAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1nKysiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9ZysrOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9DWFgrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRDWFggaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfQ1hYPSIkQ1hYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiBub3Rmb3VuZAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcGF0aF9DWFg9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCitDWFg9JGFjX2N2X3BhdGhfQ1hYCitpZiB0ZXN0IC1uICIkQ1hYIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENYWCIgPiY1CiskYXNfZWNobyAiJENYWCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfQ1hYIjsgdGhlbgorICBhY19wdF9DWFg9JENYWAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImcrKyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgZysrOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9DWFgrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9wYXRoX2FjX3B0X0NYWCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJGFjX3B0X0NYWCBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9hY19wdF9DWFg9IiRhY19wdF9DWFgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluIG5vdGZvdW5kCitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wYXRoX2FjX3B0X0NYWD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK2FjX3B0X0NYWD0kYWNfY3ZfcGF0aF9hY19wdF9DWFgKK2lmIHRlc3QgLW4gIiRhY19wdF9DWFgiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcHRfQ1hYIiA+JjUKKyRhc19lY2hvICIkYWNfcHRfQ1hYIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfcHRfQ1hYIiA9IHg7IHRoZW4KKyAgICBDWFg9ImcrKyIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBDWFg9JGFjX3B0X0NYWAorICBmaQorZWxzZQorICBDWFg9IiRhY19jdl9wYXRoX0NYWCIKK2ZpCisgOzsKKyAgICAgICAgY2MpICAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1jKysiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YysrOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9DWFgrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBjYXNlICRDWFggaW4KQEAgLTQwNzksNyArNDQzNyw3IEBACiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCiAgICAgYWNfY3ZfcGF0aF9DWFg9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCiAgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgpAQCAtNDA4OCw3ICs0NDQ2LDYgQEAKICAgZG9uZQogSUZTPSRhc19zYXZlX0lGUwogCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0NYWCIgJiYgYWNfY3ZfcGF0aF9DWFg9ImcrKyIKICAgOzsKIGVzYWMKIGZpCkBAIC00MTAxLDE3ICs0NDU4LDIwIEBACiAkYXNfZWNobyAibm8iID4mNjsgfQogZmkKIAotIDs7Ci0gICAgICAgIGNjKSAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjKysiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfQ1hYIjsgdGhlbgorICBhY19wdF9DWFg9JENYWAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImMrKyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgYysrOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9DWFgrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9wYXRoX2FjX3B0X0NYWCs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCi0gIGNhc2UgJENYWCBpbgorICBjYXNlICRhY19wdF9DWFggaW4KICAgW1xcL10qIHwgPzpbXFwvXSopCi0gIGFjX2N2X3BhdGhfQ1hYPSIkQ1hYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgYWNfY3ZfcGF0aF9hY19wdF9DWFg9IiRhY19wdF9DWFgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgogICA7OwogICAqKQogICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCkBAIC00MTIwLDggKzQ0ODAsOCBAQAogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wYXRoX0NYWD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3BhdGhfYWNfcHRfQ1hYPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgogICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKICAgZmkKQEAgLTQxMjksMTkgKzQ0ODksMzIgQEAKICAgZG9uZQogSUZTPSRhc19zYXZlX0lGUwogCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0NYWCIgJiYgYWNfY3ZfcGF0aF9DWFg9ImMrKyIKICAgOzsKIGVzYWMKIGZpCi1DWFg9JGFjX2N2X3BhdGhfQ1hYCi1pZiB0ZXN0IC1uICIkQ1hYIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENYWCIgPiY1Ci0kYXNfZWNobyAiJENYWCIgPiY2OyB9CithY19wdF9DWFg9JGFjX2N2X3BhdGhfYWNfcHRfQ1hYCitpZiB0ZXN0IC1uICIkYWNfcHRfQ1hYIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3B0X0NYWCIgPiY1CiskYXNfZWNobyAiJGFjX3B0X0NYWCIgPiY2OyB9CiBlbHNlCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiAkYXNfZWNobyAibm8iID4mNjsgfQogZmkKIAorICBpZiB0ZXN0ICJ4JGFjX3B0X0NYWCIgPSB4OyB0aGVuCisgICAgQ1hYPSJjKysiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgQ1hYPSRhY19wdF9DWFgKKyAgZmkKK2Vsc2UKKyAgQ1hYPSIkYWNfY3ZfcGF0aF9DWFgiCitmaQogIDs7CiAgICAgICAgIGVzYWMKIAlpZiB0ZXN0ICIkQ1hYIiA9ICJub3Rmb3VuZCIKQEAgLTQxNTEsMTMgKzQ1MjQsMTQgQEAKIGZpCiBpZiB0ZXN0IC16ICIkQ1hYIgogdGhlbgotCWZvciBhY19wcm9nIGluICRDQ0MgYysrIGcrKyBnY2MgQ0MgY3h4IGNjKysgY2wKLWRvCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCisJaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICBmb3IgYWNfcHJvZyBpbiAkQ0NDIGMrKyBnKysgZ2NjIENDIGN4eCBjYysrIGNsCisgIGRvCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX0NYWCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3Byb2dfQ1hYKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAtbiAiJENYWCI7IHRoZW4KQEAgLTQxNjksOCArNDU0Myw4IEBACiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfQ1hYPSIkYWNfcHJvZyIKKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ1hYPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCiAgIGZpCkBAIC00MTkwLDkgKzQ1NjQsNjUgQEAKIGZpCiAKIAotICB0ZXN0IC1uICIkQ1hYIiAmJiBicmVhaworICAgIHRlc3QgLW4gIiRDWFgiICYmIGJyZWFrCisgIGRvbmUKK2ZpCitpZiB0ZXN0IC16ICIkQ1hYIjsgdGhlbgorICBhY19jdF9DWFg9JENYWAorICBmb3IgYWNfcHJvZyBpbiAkQ0NDIGMrKyBnKysgZ2NjIENDIGN4eCBjYysrIGNsCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfQ1hYKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NYWCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DWFg9IiRhY19jdF9DWFgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DWFg9IiRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKIGRvbmUKLXRlc3QgLW4gIiRDWFgiIHx8IENYWD0ibm90Zm91bmQiCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9DWFg9JGFjX2N2X3Byb2dfYWNfY3RfQ1hYCitpZiB0ZXN0IC1uICIkYWNfY3RfQ1hYIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0NYWCIgPiY1CiskYXNfZWNobyAiJGFjX2N0X0NYWCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRhY19jdF9DWFgiICYmIGJyZWFrCitkb25lCisKKyAgaWYgdGVzdCAieCRhY19jdF9DWFgiID0geDsgdGhlbgorICAgIENYWD0ibm90Zm91bmQiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgQ1hYPSRhY19jdF9DWFgKKyAgZmkKK2ZpCiAKIAlpZiB0ZXN0ICIkQ1hYIiA9ICJub3Rmb3VuZCIKIAl0aGVuCkBAIC00MjEzLDYgKzQ2NDMsOSBAQAogICAiID4mMjt9CiBmaQogCitNVUxUSUFSQ0g9JCgkQ0MgLS1wcmludC1tdWx0aWFyY2ggMj4vZGV2L251bGwpCisKKwogCiAjIGNoZWNrcyBmb3IgVU5JWCB2YXJpYW50cyB0aGF0IHNldCBDIHByZXByb2Nlc3NvciB2YXJpYWJsZXMKIApAQCAtNDIyOCw3ICs0NjYxLDcgQEAKICAgQ1BQPQogZmkKIGlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DUFArc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBpZiAke2FjX2N2X3Byb2dfQ1BQKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENQUCBuZWVkcyB0byBiZSBleHBhbmRlZApAQCAtNDM0NCw3ICs0Nzc3LDcgQEAKICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9CiBhc19mbl9lcnJvciAkPyAiQyBwcmVwcm9jZXNzb3IgXCIkQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNSA7IH0KK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CiBmaQogCiBhY19leHQ9YwpAQCAtNDM1Niw3ICs0Nzg5LDcgQEAKIAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGdyZXAgdGhhdCBoYW5kbGVzIGxvbmcgbGluZXMgYW5kIC1lLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfR1JFUCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3BhdGhfR1JFUCs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIHRlc3QgLXogIiRHUkVQIjsgdGhlbgpAQCAtNDM3MCw3ICs0ODAzLDcgQEAKICAgICBmb3IgYWNfcHJvZyBpbiBncmVwIGdncmVwOyBkbwogICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwogICAgICAgYWNfcGF0aF9HUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgotICAgICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9HUkVQIiAmJiAkYXNfdGVzdF94ICIkYWNfcGF0aF9HUkVQIjsgfSB8fCBjb250aW51ZQorICAgICAgYXNfZm5fZXhlY3V0YWJsZV9wICIkYWNfcGF0aF9HUkVQIiB8fCBjb250aW51ZQogIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgogICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfR1JFUAogY2FzZSBgIiRhY19wYXRoX0dSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgpAQCAtNDQxOSw3ICs0ODUyLDcgQEAKIAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZWdyZXAiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGVncmVwLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfRUdSRVArc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9wYXRoX0VHUkVQKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgZWNobyBhIHwgJEdSRVAgLUUgJyhhfGIpJyA+L2Rldi9udWxsIDI+JjEKQEAgLTQ0MzYsNyArNDg2OSw3IEBACiAgICAgZm9yIGFjX3Byb2cgaW4gZWdyZXA7IGRvCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCiAgICAgICBhY19wYXRoX0VHUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgotICAgICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9FR1JFUCIgJiYgJGFzX3Rlc3RfeCAiJGFjX3BhdGhfRUdSRVAiOyB9IHx8IGNvbnRpbnVlCisgICAgICBhc19mbl9leGVjdXRhYmxlX3AgIiRhY19wYXRoX0VHUkVQIiB8fCBjb250aW51ZQogIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfRUdSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KICAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0VHUkVQCiBjYXNlIGAiJGFjX3BhdGhfRUdSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgpAQCAtNDQ4Niw3ICs0OTE5LDcgQEAKIAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcy4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9oZWFkZXJfc3RkYytzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X2hlYWRlcl9zdGRjKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dApAQCAtNDYxNSw3ICs1MDQ4LDcgQEAKIAogCiAgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJtaW5peC9jb25maWcuaCIgImFjX2N2X2hlYWRlcl9taW5peF9jb25maWdfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbWluaXhfY29uZmlnX2giID0geCIieWVzOyB0aGVuIDoKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX21pbml4X2NvbmZpZ19oIiA9IHh5ZXM7IHRoZW4gOgogICBNSU5JWD15ZXMKIGVsc2UKICAgTUlOSVg9CkBAIC00NjM3LDE0ICs1MDcwLDE0IEBACiAKICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGl0IGlzIHNhZmUgdG8gZGVmaW5lIF9fRVhURU5TSU9OU19fIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgaXQgaXMgc2FmZSB0byBkZWZpbmUgX19FWFRFTlNJT05TX18uLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zfc2FmZV90b19kZWZpbmVfX19leHRlbnNpb25zX18rc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9zYWZlX3RvX2RlZmluZV9fX2V4dGVuc2lvbnNfXys6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAotIwkgIGRlZmluZSBfX0VYVEVOU0lPTlNfXyAxCi0JICAkYWNfaW5jbHVkZXNfZGVmYXVsdAorIyAgICAgICAgIGRlZmluZSBfX0VYVEVOU0lPTlNfXyAxCisgICAgICAgICAgJGFjX2luY2x1ZGVzX2RlZmF1bHQKIGludAogbWFpbiAoKQogewpAQCAtNDg1MiwzNyArNTI4NSwzNSBAQAogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIC0tZW5hYmxlLXByb2ZpbGluZy4uLiAiID4mNjsgfQogIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXByb2ZpbGluZyB3YXMgZ2l2ZW4uCiBpZiB0ZXN0ICIke2VuYWJsZV9wcm9maWxpbmcrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICBlbmFibGV2YWw9JGVuYWJsZV9wcm9maWxpbmc7IGFjX3NhdmVfY2M9IiRDQyIKLSBDQz0iJENDIC1wZyIKLSBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIGFjX2VuYWJsZV9wcm9maWxpbmc9Im5vIgotZWxzZQorICBlbmFibGV2YWw9JGVuYWJsZV9wcm9maWxpbmc7CitmaQorCitpZiB0ZXN0ICJ4JGVuYWJsZV9wcm9maWxpbmciID0geHllczsgdGhlbgorICBhY19zYXZlX2NjPSIkQ0MiCisgIENDPSIkQ0MgLXBnIgogICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiBpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KIF9BQ0VPRgotaWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2VuYWJsZV9wcm9maWxpbmc9InllcyIKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKwogZWxzZQotICBhY19lbmFibGVfcHJvZmlsaW5nPSJubyIKKyAgZW5hYmxlX3Byb2ZpbGluZz1ubwogZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKLSAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgIENDPSIkYWNfc2F2ZV9jYyIKK2Vsc2UKKyAgZW5hYmxlX3Byb2ZpbGluZz1ubwogZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZW5hYmxlX3Byb2ZpbGluZyIgPiY1CiskYXNfZWNobyAiJGVuYWJsZV9wcm9maWxpbmciID4mNjsgfQogCi0gQ0M9IiRhY19zYXZlX2NjIgoraWYgdGVzdCAieCRlbmFibGVfcHJvZmlsaW5nIiA9IHh5ZXM7IHRoZW4KKyAgQkFTRUNGTEFHUz0iLXBnICRCQVNFQ0ZMQUdTIgorICBMREZMQUdTPSItcGcgJExERkxBR1MiCiBmaQogCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2VuYWJsZV9wcm9maWxpbmciID4mNQotJGFzX2VjaG8gIiRhY19lbmFibGVfcHJvZmlsaW5nIiA+JjY7IH0KLQotY2FzZSAiJGFjX2VuYWJsZV9wcm9maWxpbmciIGluCi0gICAgInllcyIpCi0JQkFTRUNGTEFHUz0iLXBnICRCQVNFQ0ZMQUdTIgotCUxERkxBR1M9Ii1wZyAkTERGTEFHUyIKLSAgICA7OwotZXNhYwotCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIExETElCUkFSWSIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBMRExJQlJBUlkuLi4gIiA+JjY7IH0KIApAQCAtNDg5NSw3ICs1MzI2LDcgQEAKIGlmIHRlc3QgIiRlbmFibGVfZnJhbWV3b3JrIgogdGhlbgogICBMRExJQlJBUlk9JyQoUFlUSE9ORlJBTUVXT1JLRElSKS9WZXJzaW9ucy8kKFZFUlNJT04pLyQoUFlUSE9ORlJBTUVXT1JLKScKLSAgUlVOU0hBUkVEPURZTERfRlJBTUVXT1JLX1BBVEg9ImBwd2RgOiREWUxEX0ZSQU1FV09SS19QQVRIIgorICBSVU5TSEFSRUQ9RFlMRF9GUkFNRVdPUktfUEFUSD1gcHdkYCR7RFlMRF9GUkFNRVdPUktfUEFUSDorOiR7RFlMRF9GUkFNRVdPUktfUEFUSH19CiAgIEJMRExJQlJBUlk9JycKIGVsc2UKICAgQkxETElCUkFSWT0nJChMRExJQlJBUlkpJwpAQCAtNDkxNywxMyArNTM0OCwxMyBAQAogICAgIFN1bk9TKikKIAkgIExETElCUkFSWT0nbGlicHl0aG9uJChWRVJTSU9OKS5zbycKIAkgIEJMRExJQlJBUlk9Jy1XbCwtUiwkKExJQkRJUikgLUwuIC1scHl0aG9uJChWRVJTSU9OKScKLQkgIFJVTlNIQVJFRD1MRF9MSUJSQVJZX1BBVEg9YHB3ZGA6JHtMRF9MSUJSQVJZX1BBVEh9CisJICBSVU5TSEFSRUQ9TERfTElCUkFSWV9QQVRIPWBwd2RgJHtMRF9MSUJSQVJZX1BBVEg6Kzoke0xEX0xJQlJBUllfUEFUSH19CiAJICBJTlNUU09OQU1FPSIkTERMSUJSQVJZIi4kU09WRVJTSU9OCiAgICAgICAgICAgOzsKICAgICBMaW51eCp8R05VKnxOZXRCU0QqfEZyZWVCU0QqfERyYWdvbkZseSp8T3BlbkJTRCopCiAJICBMRExJQlJBUlk9J2xpYnB5dGhvbiQoVkVSU0lPTikuc28nCiAJICBCTERMSUJSQVJZPSctTC4gLWxweXRob24kKFZFUlNJT04pJwotCSAgUlVOU0hBUkVEPUxEX0xJQlJBUllfUEFUSD1gcHdkYDoke0xEX0xJQlJBUllfUEFUSH0KKwkgIFJVTlNIQVJFRD1MRF9MSUJSQVJZX1BBVEg9YHB3ZGAke0xEX0xJQlJBUllfUEFUSDorOiR7TERfTElCUkFSWV9QQVRIfX0KIAkgIGNhc2UgJGFjX3N5c19zeXN0ZW0gaW4KIAkgICAgICBGcmVlQlNEKikKIAkJU09WRVJTSU9OPWBlY2hvICRTT1ZFUlNJT058Y3V0IC1kICIuIiAtZiAxYApAQCAtNDk0MSwxMiArNTM3MiwxMiBAQAogCQkJOzsKIAkgIGVzYWMKIAkgIEJMRExJQlJBUlk9Jy1XbCwrYiwkKExJQkRJUikgLUwuIC1scHl0aG9uJChWRVJTSU9OKScKLQkgIFJVTlNIQVJFRD1TSExJQl9QQVRIPWBwd2RgOiR7U0hMSUJfUEFUSH0KKwkgIFJVTlNIQVJFRD1TSExJQl9QQVRIPWBwd2RgJHtTSExJQl9QQVRIOis6JHtTSExJQl9QQVRIfX0KIAkgIDs7CiAgICAgT1NGKikKIAkgIExETElCUkFSWT0nbGlicHl0aG9uJChWRVJTSU9OKS5zbycKIAkgIEJMRExJQlJBUlk9Jy1ycGF0aCAkKExJQkRJUikgLUwuIC1scHl0aG9uJChWRVJTSU9OKScKLQkgIFJVTlNIQVJFRD1MRF9MSUJSQVJZX1BBVEg9YHB3ZGA6JHtMRF9MSUJSQVJZX1BBVEh9CisJICBSVU5TSEFSRUQ9TERfTElCUkFSWV9QQVRIPWBwd2RgJHtMRF9MSUJSQVJZX1BBVEg6Kzoke0xEX0xJQlJBUllfUEFUSH19CiAJICA7OwogICAgIGF0aGVvcyopCiAJICBMRExJQlJBUlk9J2xpYnB5dGhvbiQoVkVSU0lPTikuc28nCkBAIC00OTU2LDExICs1Mzg3LDExIEBACiAgICAgRGFyd2luKikKICAgICAJTERMSUJSQVJZPSdsaWJweXRob24kKFZFUlNJT04pLmR5bGliJwogCUJMRExJQlJBUlk9Jy1MLiAtbHB5dGhvbiQoVkVSU0lPTiknCi0JUlVOU0hBUkVEPSdEWUxEX0xJQlJBUllfUEFUSD1gcHdkYDoke0RZTERfTElCUkFSWV9QQVRIfScKKwlSVU5TSEFSRUQ9RFlMRF9MSUJSQVJZX1BBVEg9YHB3ZGAke0RZTERfTElCUkFSWV9QQVRIOis6JHtEWUxEX0xJQlJBUllfUEFUSH19CiAJOzsKICAgICBBSVgqKQogCUxETElCUkFSWT0nbGlicHl0aG9uJChWRVJTSU9OKS5zbycKLQlSVU5TSEFSRUQ9TElCUEFUSD1gcHdkYDoke0xJQlBBVEh9CisJUlVOU0hBUkVEPUxJQlBBVEg9YHB3ZGAke0xJQlBBVEg6Kzoke0xJQlBBVEh9fQogCTs7CiAKICAgZXNhYwpAQCAtNDk3Myw2ICs1NDA0LDEwIEBACiAgIGVzYWMKIGZpCiAKK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisJUlVOU0hBUkVEPQorZmkKKwogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRMRExJQlJBUlkiID4mNQogJGFzX2VjaG8gIiRMRExJQlJBUlkiID4mNjsgfQogCkBAIC00OTgxLDcgKzU0MTYsNyBAQAogc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19SQU5MSUIrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9wcm9nX1JBTkxJQis6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCkBAIC00OTkzLDcgKzU0MjgsNyBAQAogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgogICAgIGFjX2N2X3Byb2dfUkFOTElCPSIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCkBAIC01MDIxLDcgKzU0NTYsNyBAQAogc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfUkFOTElCK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgpAQCAtNTAzMyw3ICs1NDY4LDcgQEAKICAgSUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KICAgICBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0icmFubGliIgogICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKQEAgLTUwNjksMTMgKzU1MDQsMTQgQEAKIGZpCiAKIAotZm9yIGFjX3Byb2cgaW4gYXIgYWFsCi1kbwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoraWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICBmb3IgYWNfcHJvZyBpbiBhciBhYWwKKyAgZG8KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQVIrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9wcm9nX0FSKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAtbiAiJEFSIjsgdGhlbgpAQCAtNTA4Nyw4ICs1NTIzLDggQEAKICAgSUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19BUj0iJGFjX3Byb2ciCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0FSPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCiAgIGZpCkBAIC01MTA4LDkgKzU1NDQsNjUgQEAKIGZpCiAKIAotICB0ZXN0IC1uICIkQVIiICYmIGJyZWFrCisgICAgdGVzdCAtbiAiJEFSIiAmJiBicmVhaworICBkb25lCitmaQoraWYgdGVzdCAteiAiJEFSIjsgdGhlbgorICBhY19jdF9BUj0kQVIKKyAgZm9yIGFjX3Byb2cgaW4gYXIgYWFsCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfQVIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQVIiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQVI9IiRhY19jdF9BUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0FSPSIkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCiBkb25lCi10ZXN0IC1uICIkQVIiIHx8IEFSPSJhciIKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X0FSPSRhY19jdl9wcm9nX2FjX2N0X0FSCitpZiB0ZXN0IC1uICIkYWNfY3RfQVIiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfQVIiID4mNQorJGFzX2VjaG8gIiRhY19jdF9BUiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRhY19jdF9BUiIgJiYgYnJlYWsKK2RvbmUKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0FSIiA9IHg7IHRoZW4KKyAgICBBUj0iYXIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgQVI9JGFjX2N0X0FSCisgIGZpCitmaQogCiAKICMgdHdlYWsgQVJGTEFHUyBvbmx5IGlmIHRoZSB1c2VyIGRpZG4ndCBzZXQgaXQgb24gdGhlIGNvbW1hbmQgbGluZQpAQCAtNTEyNSw3ICs1NjE3LDcgQEAKIHNldCBkdW1teSBzdm52ZXJzaW9uOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19TVk5WRVJTSU9OK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfcHJvZ19TVk5WRVJTSU9OKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAtbiAiJFNWTlZFUlNJT04iOyB0aGVuCkBAIC01MTM3LDcgKzU2MjksNyBAQAogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgogICAgIGFjX2N2X3Byb2dfU1ZOVkVSU0lPTj0iZm91bmQiCiAgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgpAQCAtNTE2NywxMyArNTY1OSwyNyBAQAogZmkKIAogCitpZiB0ZXN0ICIkYWJzX3NyY2RpciIgIT0gIiRhYnNfYnVpbGRkaXIiOyB0aGVuCisgICAgIyBJZiB3ZSdyZSBidWlsZGluZyBvdXQtb2YtdHJlZSBtYWtlIHN1cmUgSW5jbHVkZSAoaW4gdGhlIGN1cnJlbnQgZGlyKQorICAgICMgZ2V0cyBwaWNrZWQgdXAgYmVmb3JlIGl0cyAkc3JjZGlyIGNvdW50ZXJwYXJ0IGluIG9yZGVyIGZvciBQeXRob24tYXN0LmgKKyAgICAjIGFuZCBncmFtaW5pdC5oIHRvIGdldCBwaWNrZWQgdXAgZnJvbSB0aGUgY29ycmVjdCBkaXJlY3RvcnkuCisgICAgIyAoQSBzaWRlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgdGhlc2UgcmVzb3VyY2VzIHdpbGwgYXV0b21hdGljYWxseSBiZQorICAgICMgIHJlZ2VuZXJhdGVkIHdoZW4gYnVpbGRpbmcgb3V0LW9mLXRyZWUsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3QKKyAgICAjICB0aGUgJHNyY2RpciBjb3VudGVycGFydCBpcyB1cC10by1kYXRlLiAgVGhpcyBpcyBhbiBhY2NlcHRhYmxlIHRyYWRlCisgICAgIyAgb2ZmLikKKyAgICBCQVNFQ1BQRkxBR1M9Ii1JSW5jbHVkZSIKK2Vsc2UKKyAgICBCQVNFQ1BQRkxBR1M9IiIKK2ZpCisKKwogCiAKICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiaGciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15IGhnOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19IQVNfSEcrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9wcm9nX0hBU19IRys6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIHRlc3QgLW4gIiRIQVNfSEciOyB0aGVuCkBAIC01MTg1LDcgKzU2OTEsNyBAQAogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgogICAgIGFjX2N2X3Byb2dfSEFTX0hHPSJmb3VuZCIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCkBAIC01MjI2LDM1ICs1NzMyLDYgQEAKIAkJSU5TVEFMTD0iJHtzcmNkaXJ9L2luc3RhbGwtc2ggLWMiCiAJZmkKIGVzYWMKLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluICIkc3JjZGlyIiAiJHNyY2Rpci8uLiIgIiRzcmNkaXIvLi4vLi4iOyBkbwotICBpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwtc2giOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvaW5zdGFsbC5zaCI7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAiJGFjX2Rpci9zaHRvb2wiOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvc2h0b29sIGluc3RhbGwgLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICBhc19mbl9lcnJvciAkPyAiY2Fubm90IGZpbmQgaW5zdGFsbC1zaCwgaW5zdGFsbC5zaCwgb3Igc2h0b29sIGluIFwiJHNyY2RpclwiIFwiJHNyY2Rpci8uLlwiIFwiJHNyY2Rpci8uLi8uLlwiIiAiJExJTkVOTyIgNQotZmkKLQotIyBUaGVzZSB0aHJlZSB2YXJpYWJsZXMgYXJlIHVuZG9jdW1lbnRlZCBhbmQgdW5zdXBwb3J0ZWQsCi0jIGFuZCBhcmUgaW50ZW5kZWQgdG8gYmUgd2l0aGRyYXduIGluIGEgZnV0dXJlIEF1dG9jb25mIHJlbGVhc2UuCi0jIFRoZXkgY2FuIGNhdXNlIHNlcmlvdXMgcHJvYmxlbXMgaWYgYSBidWlsZGVyJ3Mgc291cmNlIHRyZWUgaXMgaW4gYSBkaXJlY3RvcnkKLSMgd2hvc2UgZnVsbCBuYW1lIGNvbnRhaW5zIHVudXN1YWwgY2hhcmFjdGVycy4KLWFjX2NvbmZpZ19ndWVzcz0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KLWFjX2NvbmZpZ19zdWI9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgotYWNfY29uZmlndXJlPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlndXJlIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgotCi0KICMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAogIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCiAjIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKQEAgLTUyNzIsNyArNTc0OSw3IEBACiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAiID4mNjsgfQogaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3BhdGhfaW5zdGFsbCs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKQEAgLTUyOTIsNyArNTc2OSw3IEBACiAgICAgIyBieSBkZWZhdWx0LgogICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KICAgICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotCWlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IH07IHRoZW4KKwlpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiOyB0aGVuCiAJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgogCSAgICBncmVwIGRzcG1zZyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KQEAgLTUzNDgsNiArNTgyNSw0OCBAQAogCiB0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwogCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhIHRocmVhZC1zYWZlIG1rZGlyIC1wIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBhIHRocmVhZC1zYWZlIG1rZGlyIC1wLi4uICIgPiY2OyB9CitpZiB0ZXN0IC16ICIkTUtESVJfUCI7IHRoZW4KKyAgaWYgJHthY19jdl9wYXRoX21rZGlyKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi9vcHQvc2Z3L2JpbgorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19wcm9nIGluIG1rZGlyIGdta2RpcjsgZG8KKwkgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisJICAgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiB8fCBjb250aW51ZQorCSAgIGNhc2UgYCIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAtLXZlcnNpb24gMj4mMWAgaW4gIygKKwkgICAgICdta2RpciAoR05VIGNvcmV1dGlscykgJyogfCBcCisJICAgICAnbWtkaXIgKGNvcmV1dGlscykgJyogfCBcCisJICAgICAnbWtkaXIgKGZpbGV1dGlscykgJzQuMSopCisJICAgICAgIGFjX2N2X3BhdGhfbWtkaXI9JGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dAorCSAgICAgICBicmVhayAzOzsKKwkgICBlc2FjCisJIGRvbmUKKyAgICAgICBkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKKworICB0ZXN0IC1kIC4vLS12ZXJzaW9uICYmIHJtZGlyIC4vLS12ZXJzaW9uCisgIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9ta2RpcitzZXR9IiA9IHNldDsgdGhlbgorICAgIE1LRElSX1A9IiRhY19jdl9wYXRoX21rZGlyIC1wIgorICBlbHNlCisgICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgRG9uJ3QgY2FjaGUgYQorICAgICMgdmFsdWUgZm9yIE1LRElSX1Agd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKKyAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcworICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHZhbHVlIGlzIGEgcmVsYXRpdmUgbmFtZS4KKyAgICBNS0RJUl9QPSIkYWNfaW5zdGFsbF9zaCAtZCIKKyAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1LRElSX1AiID4mNQorJGFzX2VjaG8gIiRNS0RJUl9QIiA+JjY7IH0KKwogCiAjIE5vdCBldmVyeSBmaWxlc3lzdGVtIHN1cHBvcnRzIGhhcmQgbGlua3MKIApAQCAtNTQ2MCw3ICs1OTc5LDcgQEAKICRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWZuby1zdHJpY3QtYWxpYXNpbmcuLi4gIiA+JjY7IH0KICAgICAgYWNfc2F2ZV9jYz0iJENDIgogICAgICBDQz0iJENDIC1mbm8tc3RyaWN0LWFsaWFzaW5nIgotICAgICBpZiB0ZXN0ICIke2FjX2N2X25vX3N0cmljdF9hbGlhc2luZ19vaytzZXR9IiA9IHNldDsgdGhlbiA6CisgICAgIGlmICR7YWNfY3Zfbm9fc3RyaWN0X2FsaWFzaW5nX29rKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dApAQCAtNTQ5Myw3ICs2MDEyLDcgQEAKICAgICAjIGlmIHVzaW5nIGdjYyBvbiBhbHBoYSwgdXNlIC1taWVlZSB0byBnZXQgKG5lYXIpIGZ1bGwgSUVFRSA3NTQKICAgICAjIHN1cHBvcnQuICBXaXRob3V0IHRoaXMsIHRyZWF0bWVudCBvZiBzdWJub3JtYWxzIGRvZXNuJ3QgZm9sbG93CiAgICAgIyB0aGUgc3RhbmRhcmQuCi0gICAgY2FzZSAkYWNfc3lzX21hY2hpbmUgaW4KKyAgICBjYXNlICRob3N0IGluCiAgICAgICAgICBhbHBoYSopCiAgICAgICAgICAgICAgICAgQkFTRUNGTEFHUz0iJEJBU0VDRkxBR1MgLW1pZWVlIgogICAgICAgICAgICAgICAgIDs7CkBAIC01NTI2LDggKzYwNDUsMTQgQEAKIAogCSAgICAjIENhbGN1bGF0ZSB0aGUgcmlnaHQgZGVwbG95bWVudCB0YXJnZXQgZm9yIHRoaXMgYnVpbGQuCiAJICAgICMKLQkgICAgY3VyX3RhcmdldD1gc3dfdmVycyAtcHJvZHVjdFZlcnNpb24gfCBzZWQgJ3MvXCgxMFwuWzAtOV0qXCkuKi9cMS8nYAotCSAgICBpZiB0ZXN0ICR7Y3VyX3RhcmdldH0gJz4nIDEwLjI7IHRoZW4KKwkJY3VyX3RhcmdldF9tYWpvcj1gc3dfdmVycyAtcHJvZHVjdFZlcnNpb24gfCBcCisJCQkJc2VkICdzL1woWzAtOV0qXClcLlwoWzAtOV0qXCkuKi9cMS8nYAorCQljdXJfdGFyZ2V0X21pbm9yPWBzd192ZXJzIC1wcm9kdWN0VmVyc2lvbiB8IFwKKwkJCQlzZWQgJ3MvXChbMC05XSpcKVwuXChbMC05XSpcKS4qL1wyLydgCisJCWN1cl90YXJnZXQ9IiR7Y3VyX3RhcmdldF9tYWpvcn0uJHtjdXJfdGFyZ2V0X21pbm9yfSIKKwkJaWYgdGVzdCAke2N1cl90YXJnZXRfbWFqb3J9IC1lcSAxMCAmJiBcCisJCSAgIHRlc3QgJHtjdXJfdGFyZ2V0X21pbm9yfSAtZ2UgMworCQl0aGVuCiAJCSAgICBjdXJfdGFyZ2V0PTEwLjMKIAkJICAgIGlmIHRlc3QgJHtlbmFibGVfdW5pdmVyc2Fsc2RrfTsgdGhlbgogCQkJICAgIGlmIHRlc3QgIiR7VU5JVkVSU0FMX0FSQ0hTfSIgPSAiYWxsIjsgdGhlbgpAQCAtNTY1MCw3ICs2MTc1LDcgQEAKIAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1PUFQ6T2xpbWl0PTAiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtT1BUOk9saW1pdD0wLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X29wdF9vbGltaXRfb2src2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9vcHRfb2xpbWl0X29rKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgYWNfc2F2ZV9jYz0iJENDIgpAQCAtNTY4NSw2ICs2MjEwLDExIEBACiAJIyBlbnZpcm9ubWVudD8KICAgICAgICAgRGFyd2luKikKIAkgICAgOzsKKyAgICAgICAgIyBYWFggdGhhbmtmdWxseSB0aGlzIHVzZWxlc3MgdHJvdWJsZW1ha2VyIG9mIGEgZmxhZyBoYXMgYmVlbgorICAgICAgICAjIGVyYWRpY2F0ZWQgaW4gdGhlIDMueCBsaW5lLiAgRm9yIG5vdywgbWFrZSBzdXJlIGl0IGlzbid0IHBpY2tlZAorICAgICAgICAjIHVwIGJ5IGFueSBvZiBvdXIgb3RoZXIgcGxhdGZvcm1zIHRoYXQgdXNlIENDLgorICAgICAgICBBSVgqfFN1bk9TKnxIUC1VWCp8SVJJWCopCisgICAgICAgICAgICA7OwogICAgICAgICAqKQogCSAgICBCQVNFQ0ZMQUdTPSIkQkFTRUNGTEFHUyAtT1BUOk9saW1pdD0wIgogCSAgICA7OwpAQCAtNTY5Miw3ICs2MjIyLDcgQEAKIGVsc2UKICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1PbGltaXQgMTUwMCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1PbGltaXQgMTUwMC4uLiAiID4mNjsgfQotICBpZiB0ZXN0ICIke2FjX2N2X29saW1pdF9vaytzZXR9IiA9IHNldDsgdGhlbiA6CisgIGlmICR7YWNfY3Zfb2xpbWl0X29rKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgYWNfc2F2ZV9jYz0iJENDIgpAQCAtNTcyMSw3ICs2MjUxLDE0IEBACiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfb2xpbWl0X29rIiA+JjUKICRhc19lY2hvICIkYWNfY3Zfb2xpbWl0X29rIiA+JjY7IH0KICAgaWYgdGVzdCAkYWNfY3Zfb2xpbWl0X29rID0geWVzOyB0aGVuCi0gICAgQkFTRUNGTEFHUz0iJEJBU0VDRkxBR1MgLU9saW1pdCAxNTAwIgorICAgIGNhc2UgJGFjX3N5c19zeXN0ZW0gaW4KKyAgICAgICAgIyBJc3N1ZSAjMTY1MzQ6IE9uIEhQLVVYIGFjX2N2X29saW1pdF9vaz15ZXMgaXMgYSBmYWxzZSBwb3NpdGl2ZS4KKyAgICAgICAgSFAtVVgqKQorICAgICAgICAgICAgOzsKKyAgICAgICAgKikKKyAgICAgICAgICAgIEJBU0VDRkxBR1M9IiRCQVNFQ0ZMQUdTIC1PbGltaXQgMTUwMCIKKyAgICAgICAgICAgIDs7CisgICAgZXNhYwogICBmaQogZmkKIApAQCAtNTczMSw3ICs2MjY4LDcgQEAKICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGdjYyBzdXBwb3J0cyBQYXJzZVR1cGxlIF9fZm9ybWF0X18iID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBnY2Mgc3VwcG9ydHMgUGFyc2VUdXBsZSBfX2Zvcm1hdF9fLi4uICIgPiY2OyB9CiAgIHNhdmVfQ0ZMQUdTPSRDRkxBR1MKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1XZXJyb3IiCisgIENGTEFHUz0iJENGTEFHUyAtV2Vycm9yIC1XZm9ybWF0IgogICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAKQEAgLTU3NzAsNyArNjMwNyw3IEBACiAjIG9wdGlvbnMgYmVmb3JlIHdlIGNhbiBjaGVjayB3aGV0aGVyIC1LcHRocmVhZCBpbXByb3ZlcyBhbnl0aGluZy4KIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBwdGhyZWFkcyBhcmUgYXZhaWxhYmxlIHdpdGhvdXQgb3B0aW9ucyIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHB0aHJlYWRzIGFyZSBhdmFpbGFibGUgd2l0aG91dCBvcHRpb25zLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3B0aHJlYWRfaXNfZGVmYXVsdCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3B0aHJlYWRfaXNfZGVmYXVsdCs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKQEAgLTU3NzksNiArNjMxNiw3IEBACiAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAorI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgogCiB2b2lkKiByb3V0aW5lKHZvaWQqIHApe3JldHVybiBOVUxMO30KQEAgLTU4MjMsNyArNjM2MSw3IEBACiAjIGZ1bmN0aW9uIGF2YWlsYWJsZS4KIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtS3B0aHJlYWQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtS3B0aHJlYWQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zfa3B0aHJlYWQrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9rcHRocmVhZCs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGFjX3NhdmVfY2M9IiRDQyIKQEAgLTU4MzQsNiArNjM3Miw3IEBACiAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAorI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgogCiB2b2lkKiByb3V0aW5lKHZvaWQqIHApe3JldHVybiBOVUxMO30KQEAgLTU4NzIsNyArNjQxMSw3IEBACiAjIGZ1bmN0aW9uIGF2YWlsYWJsZS4KIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtS3RocmVhZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1LdGhyZWFkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2t0aHJlYWQrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9rdGhyZWFkKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgYWNfc2F2ZV9jYz0iJENDIgpAQCAtNTg4Myw2ICs2NDIyLDcgQEAKICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAogLyogZW5kIGNvbmZkZWZzLmguICAqLwogCisjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAKIHZvaWQqIHJvdXRpbmUodm9pZCogcCl7cmV0dXJuIE5VTEw7fQpAQCAtNTkyMSw3ICs2NDYxLDcgQEAKICMgZnVuY3Rpb24gYXZhaWxhYmxlLgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1wdGhyZWFkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLXB0aHJlYWQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfdGhyZWFkK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfcHRocmVhZCs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGFjX3NhdmVfY2M9IiRDQyIKQEAgLTU5MzIsNiArNjQ3Miw3IEBACiAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAorI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgogCiB2b2lkKiByb3V0aW5lKHZvaWQqIHApe3JldHVybiBOVUxMO30KQEAgLTYwMDYsNyArNjU0Nyw3IEBACiAjIGNoZWNrcyBmb3IgaGVhZGVyIGZpbGVzCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9zdGRjK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfaGVhZGVyX3N0ZGMrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CkBAIC02MTE2LDkgKzY2NTcsOSBAQAogCiBmaQogCi1mb3IgYWNfaGVhZGVyIGluIGFzbS90eXBlcy5oIGNvbmlvLmggY3Vyc2VzLmggZGlyZWN0LmggZGxmY24uaCBlcnJuby5oIFwKK2ZvciBhY19oZWFkZXIgaW4gYXNtL3R5cGVzLmggY29uaW8uaCBkaXJlY3QuaCBkbGZjbi5oIGVycm5vLmggXAogZmNudGwuaCBncnAuaCBcCi1pZWVlZnAuaCBpby5oIGxhbmdpbmZvLmggbGliaW50bC5oIG5jdXJzZXMuaCBwb2xsLmggcHJvY2Vzcy5oIHB0aHJlYWQuaCBcCitpZWVlZnAuaCBpby5oIGxhbmdpbmZvLmggbGliaW50bC5oIHBvbGwuaCBwcm9jZXNzLmggcHRocmVhZC5oIFwKIHNoYWRvdy5oIHNpZ25hbC5oIHN0ZGludC5oIHN0cm9wdHMuaCB0ZXJtaW9zLmggdGhyZWFkLmggXAogdW5pc3RkLmggdXRpbWUuaCBcCiBzeXMvYXVkaW9pby5oIHN5cy9ic2R0dHkuaCBzeXMvZXBvbGwuaCBzeXMvZXZlbnQuaCBzeXMvZmlsZS5oIHN5cy9sb2FkYXZnLmggXApAQCAtNjEyNyw3ICs2NjY4LDcgQEAKIHN5cy90ZXJtaW8uaCBzeXMvdGltZS5oIFwKIHN5cy90aW1lcy5oIHN5cy90eXBlcy5oIHN5cy91bi5oIHN5cy91dHNuYW1lLmggc3lzL3dhaXQuaCBwdHkuaCBsaWJ1dGlsLmggXAogc3lzL3Jlc291cmNlLmggbmV0cGFja2V0L3BhY2tldC5oIHN5c2V4aXRzLmggYmx1ZXRvb3RoLmggXAotYmx1ZXRvb3RoL2JsdWV0b290aC5oIGxpbnV4L3RpcGMuaCBzcGF3bi5oIHV0aWwuaAorYmx1ZXRvb3RoL2JsdWV0b290aC5oIGxpbnV4L3RpcGMuaCBzcGF3bi5oIHV0aWwuaCBhbGxvY2EuaAogZG8gOgogICBhc19hY19IZWFkZXI9YCRhc19lY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCiBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiJGFjX2hlYWRlciIgIiRhc19hY19IZWFkZXIiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKQEAgLTYxNDUsNyArNjY4Niw3IEBACiAgIGFzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl9kaXJlbnRfJGFjX2hkciIgfCAkYXNfdHJfc2hgCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfaGRyIHRoYXQgZGVmaW5lcyBESVIiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY19oZHIgdGhhdCBkZWZpbmVzIERJUi4uLiAiID4mNjsgfQotaWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY19IZWFkZXIrc2V0fVwiIiA9IHNldDsgdGhlbiA6CitpZiBldmFsIFwkeyRhc19hY19IZWFkZXIrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CkBAIC02MTg1LDcgKzY3MjYsNyBAQAogaWYgdGVzdCAkYWNfaGVhZGVyX2RpcmVudCA9IGRpcmVudC5oOyB0aGVuCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBvcGVuZGlyIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgb3BlbmRpci4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfb3BlbmRpcitzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3NlYXJjaF9vcGVuZGlyKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCkBAIC02MjE5LDExICs2NzYwLDExIEBACiBmaQogcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgY29uZnRlc3QkYWNfZXhlZXh0Ci0gIGlmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX29wZW5kaXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBpZiAke2FjX2N2X3NlYXJjaF9vcGVuZGlyKzp9IGZhbHNlOyB0aGVuIDoKICAgYnJlYWsKIGZpCiBkb25lCi1pZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9vcGVuZGlyK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3Zfc2VhcmNoX29wZW5kaXIrOn0gZmFsc2U7IHRoZW4gOgogCiBlbHNlCiAgIGFjX2N2X3NlYXJjaF9vcGVuZGlyPW5vCkBAIC02MjQyLDcgKzY3ODMsNyBAQAogZWxzZQogICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgb3BlbmRpciIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIG9wZW5kaXIuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX29wZW5kaXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9zZWFyY2hfb3BlbmRpcis6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0kTElCUwpAQCAtNjI3NiwxMSArNjgxNywxMSBAQAogZmkKIHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dAotICBpZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9vcGVuZGlyK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgaWYgJHthY19jdl9zZWFyY2hfb3BlbmRpcis6fSBmYWxzZTsgdGhlbiA6CiAgIGJyZWFrCiBmaQogZG9uZQotaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfb3BlbmRpcitzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3NlYXJjaF9vcGVuZGlyKzp9IGZhbHNlOyB0aGVuIDoKIAogZWxzZQogICBhY19jdl9zZWFyY2hfb3BlbmRpcj1ubwpAQCAtNjMwMCw3ICs2ODQxLDcgQEAKIAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHN5cy90eXBlcy5oIGRlZmluZXMgbWFrZWRldiIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHN5cy90eXBlcy5oIGRlZmluZXMgbWFrZWRldi4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9oZWFkZXJfc3lzX3R5cGVzX2hfbWFrZWRlditzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X2hlYWRlcl9zeXNfdHlwZXNfaF9tYWtlZGV2Kzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dApAQCAtNjMyOCw3ICs2ODY5LDcgQEAKIAogaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N5c190eXBlc19oX21ha2VkZXYgPSBubzsgdGhlbgogYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgInN5cy9ta2Rldi5oIiAiYWNfY3ZfaGVhZGVyX3N5c19ta2Rldl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9zeXNfbWtkZXZfaCIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfc3lzX21rZGV2X2giID0geHllczsgdGhlbiA6CiAKICRhc19lY2hvICIjZGVmaW5lIE1BSk9SX0lOX01LREVWIDEiID4+Y29uZmRlZnMuaAogCkBAIC02MzM4LDcgKzY4NzksNyBAQAogCiAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zeXNfbWtkZXZfaCA9IG5vOyB0aGVuCiAgICAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgInN5cy9zeXNtYWNyb3MuaCIgImFjX2N2X2hlYWRlcl9zeXNfc3lzbWFjcm9zX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3N5c19zeXNtYWNyb3NfaCIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfc3lzX3N5c21hY3Jvc19oIiA9IHh5ZXM7IHRoZW4gOgogCiAkYXNfZWNobyAiI2RlZmluZSBNQUpPUl9JTl9TWVNNQUNST1MgMSIgPj5jb25mZGVmcy5oCiAKQEAgLTYzNDksMjUgKzY4OTAsNiBAQAogZmkKIAogCi0jIE9uIFNvbGFyaXMsIHRlcm0uaCByZXF1aXJlcyBjdXJzZXMuaAotZm9yIGFjX2hlYWRlciBpbiB0ZXJtLmgKLWRvIDoKLSAgYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgInRlcm0uaCIgImFjX2N2X2hlYWRlcl90ZXJtX2giICIKLSNpZmRlZiBIQVZFX0NVUlNFU19ICi0jaW5jbHVkZSA8Y3Vyc2VzLmg+Ci0jZW5kaWYKLQotIgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfdGVybV9oIiA9IHgiInllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9URVJNX0ggMQotX0FDRU9GCi0KLWZpCi0KLWRvbmUKLQotCiAjIE9uIExpbnV4LCBuZXRsaW5rLmggcmVxdWlyZXMgYXNtL3R5cGVzLmgKIGZvciBhY19oZWFkZXIgaW4gbGludXgvbmV0bGluay5oCiBkbyA6CkBAIC02MzgwLDcgKzY5MDIsNyBAQAogI2VuZGlmCiAKICIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2xpbnV4X25ldGxpbmtfaCIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbGludXhfbmV0bGlua19oIiA9IHh5ZXM7IHRoZW4gOgogICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIEhBVkVfTElOVVhfTkVUTElOS19IIDEKIF9BQ0VPRgpAQCAtNjU0Myw3ICs3MDY1LDcgQEAKIAogIyBUeXBlIGF2YWlsYWJpbGl0eSBjaGVja3MKIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgIm1vZGVfdCIgImFjX2N2X3R5cGVfbW9kZV90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfbW9kZV90IiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfbW9kZV90IiA9IHh5ZXM7IHRoZW4gOgogCiBlbHNlCiAKQEAgLTY1NTQsNyArNzA3Niw3IEBACiBmaQogCiBhY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJvZmZfdCIgImFjX2N2X3R5cGVfb2ZmX3QiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfdHlwZV9vZmZfdCIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl90eXBlX29mZl90IiA9IHh5ZXM7IHRoZW4gOgogCiBlbHNlCiAKQEAgLTY1NjUsNyArNzA4Nyw3IEBACiBmaQogCiBhY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJwaWRfdCIgImFjX2N2X3R5cGVfcGlkX3QiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfdHlwZV9waWRfdCIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl90eXBlX3BpZF90IiA9IHh5ZXM7IHRoZW4gOgogCiBlbHNlCiAKQEAgLTY1ODEsNyArNzEwMyw3IEBACiBfQUNFT0YKIAogYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAic2l6ZV90IiAiYWNfY3ZfdHlwZV9zaXplX3QiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfdHlwZV9zaXplX3QiID0geCIieWVzOyB0aGVuIDoKK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV9zaXplX3QiID0geHllczsgdGhlbiA6CiAKIGVsc2UKIApAQCAtNjU5Myw3ICs3MTE1LDcgQEAKIAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdWlkX3QgaW4gc3lzL3R5cGVzLmgiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHVpZF90IGluIHN5cy90eXBlcy5oLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3R5cGVfdWlkX3Qrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl90eXBlX3VpZF90Kzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dApAQCAtNjYyMSw2ICs3MTQzLDIxIEBACiAKIGZpCiAKKworIyBUaGVyZSBhcmUgdHdvIHNlcGFyYXRlIGNoZWNrcyBmb3IgZWFjaCBvZiB0aGUgZXhhY3Qtd2lkdGggaW50ZWdlciB0eXBlcyB3ZQorIyBuZWVkLiAgRmlyc3Qgd2UgY2hlY2sgd2hldGhlciB0aGUgdHlwZSBpcyBhdmFpbGFibGUgdXNpbmcgdGhlIHVzdWFsCisjIEFDX0NIRUNLX1RZUEUgbWFjcm8gd2l0aCB0aGUgZGVmYXVsdCBpbmNsdWRlcyAod2hpY2ggaW5jbHVkZXMgPGludHR5cGVzLmg+CisjIGFuZCA8c3RkaW50Lmg+IHdoZXJlIGF2YWlsYWJsZSkuICBXZSB0aGVuIGFsc28gdXNlIHRoZSBzcGVjaWFsIHR5cGUgY2hlY2tzIG9mCisjIHRoZSBmb3JtIEFDX1RZUEVfVUlOVDMyX1QsIHdoaWNoIGluIHRoZSBjYXNlIHRoYXQgdWludDMyX3QgaXMgbm90IGF2YWlsYWJsZQorIyBkaXJlY3RseSwgI2RlZmluZSdzIHVpbnQzMl90IHRvIGJlIGEgc3VpdGFibGUgdHlwZS4KKworYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAidWludDMyX3QiICJhY19jdl90eXBlX3VpbnQzMl90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfdWludDMyX3QiID0geHllczsgdGhlbiA6CisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfVUlOVDMyX1QgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKIGFjX2ZuX2NfZmluZF91aW50WF90ICIkTElORU5PIiAiMzIiICJhY19jdl9jX3VpbnQzMl90IgogY2FzZSAkYWNfY3ZfY191aW50MzJfdCBpbiAjKAogICBub3x5ZXMpIDs7ICMoCkBAIC02NjM1LDYgKzcxNzIsMTQgQEAKIDs7CiAgIGVzYWMKIAorCithY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJ1aW50NjRfdCIgImFjX2N2X3R5cGVfdWludDY0X3QiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV91aW50NjRfdCIgPSB4eWVzOyB0aGVuIDoKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9VSU5UNjRfVCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKwogYWNfZm5fY19maW5kX3VpbnRYX3QgIiRMSU5FTk8iICI2NCIgImFjX2N2X2NfdWludDY0X3QiCiBjYXNlICRhY19jdl9jX3VpbnQ2NF90IGluICMoCiAgIG5vfHllcykgOzsgIygKQEAgLTY2NDksNiArNzE5NCwxNCBAQAogOzsKICAgZXNhYwogCisKK2FjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgImludDMyX3QiICJhY19jdl90eXBlX2ludDMyX3QiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV9pbnQzMl90IiA9IHh5ZXM7IHRoZW4gOgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0lOVDMyX1QgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKIGFjX2ZuX2NfZmluZF9pbnRYX3QgIiRMSU5FTk8iICIzMiIgImFjX2N2X2NfaW50MzJfdCIKIGNhc2UgJGFjX2N2X2NfaW50MzJfdCBpbiAjKAogICBub3x5ZXMpIDs7ICMoCkBAIC02NjYwLDYgKzcyMTMsMTQgQEAKIDs7CiBlc2FjCiAKKworYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAiaW50NjRfdCIgImFjX2N2X3R5cGVfaW50NjRfdCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl90eXBlX2ludDY0X3QiID0geHllczsgdGhlbiA6CisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfSU5UNjRfVCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKwogYWNfZm5fY19maW5kX2ludFhfdCAiJExJTkVOTyIgIjY0IiAiYWNfY3ZfY19pbnQ2NF90IgogY2FzZSAkYWNfY3ZfY19pbnQ2NF90IGluICMoCiAgIG5vfHllcykgOzsgIygKQEAgLTY2NzEsOCArNzIzMiw5IEBACiA7OwogZXNhYwogCisKIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInNzaXplX3QiICJhY19jdl90eXBlX3NzaXplX3QiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfdHlwZV9zc2l6ZV90IiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfc3NpemVfdCIgPSB4eWVzOyB0aGVuIDoKIAogJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TU0laRV9UIDEiID4+Y29uZmRlZnMuaAogCkBAIC02Njg3LDcgKzcyNDksNyBAQAogIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiBpbnQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgc2l6ZSBvZiBpbnQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX2ludCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3NpemVvZl9pbnQrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiBhY19mbl9jX2NvbXB1dGVfaW50ICIkTElORU5PIiAiKGxvbmcgaW50KSAoc2l6ZW9mIChpbnQpKSIgImFjX2N2X3NpemVvZl9pbnQiICAgICAgICAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiOyB0aGVuIDoKQEAgLTY2OTcsNyArNzI1OSw3IEBACiAgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQogJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQogYXNfZm5fZXJyb3IgNzcgImNhbm5vdCBjb21wdXRlIHNpemVvZiAoaW50KQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDUgOyB9CitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQogICAgZWxzZQogICAgICBhY19jdl9zaXplb2ZfaW50PTAKICAgIGZpCkBAIC02NzIwLDcgKzcyODIsNyBAQAogIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiBsb25nIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgbG9uZy4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9zaXplb2ZfbG9uZytzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3NpemVvZl9sb25nKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgYWNfZm5fY19jb21wdXRlX2ludCAiJExJTkVOTyIgIihsb25nIGludCkgKHNpemVvZiAobG9uZykpIiAiYWNfY3Zfc2l6ZW9mX2xvbmciICAgICAgICAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiOyB0aGVuIDoKQEAgLTY3MzAsNyArNzI5Miw3IEBACiAgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQogJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQogYXNfZm5fZXJyb3IgNzcgImNhbm5vdCBjb21wdXRlIHNpemVvZiAobG9uZykKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1IDsgfQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KICAgIGVsc2UKICAgICAgYWNfY3Zfc2l6ZW9mX2xvbmc9MAogICAgZmkKQEAgLTY3NTMsNyArNzMxNSw3IEBACiAjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIHZvaWQgKiIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBzaXplIG9mIHZvaWQgKi4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9zaXplb2Zfdm9pZF9wK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3Zfc2l6ZW9mX3ZvaWRfcCs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIGFjX2ZuX2NfY29tcHV0ZV9pbnQgIiRMSU5FTk8iICIobG9uZyBpbnQpIChzaXplb2YgKHZvaWQgKikpIiAiYWNfY3Zfc2l6ZW9mX3ZvaWRfcCIgICAgICAgICIkYWNfaW5jbHVkZXNfZGVmYXVsdCI7IHRoZW4gOgpAQCAtNjc2Myw3ICs3MzI1LDcgQEAKICAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9CiBhc19mbl9lcnJvciA3NyAiY2Fubm90IGNvbXB1dGUgc2l6ZW9mICh2b2lkICopCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNSA7IH0KK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CiAgICBlbHNlCiAgICAgIGFjX2N2X3NpemVvZl92b2lkX3A9MAogICAgZmkKQEAgLTY3ODYsNyArNzM0OCw3IEBACiAjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIHNob3J0IiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2Ygc2hvcnQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX3Nob3J0K3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3Zfc2l6ZW9mX3Nob3J0Kzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgYWNfZm5fY19jb21wdXRlX2ludCAiJExJTkVOTyIgIihsb25nIGludCkgKHNpemVvZiAoc2hvcnQpKSIgImFjX2N2X3NpemVvZl9zaG9ydCIgICAgICAgICIkYWNfaW5jbHVkZXNfZGVmYXVsdCI7IHRoZW4gOgpAQCAtNjc5Niw3ICs3MzU4LDcgQEAKICAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9CiBhc19mbl9lcnJvciA3NyAiY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChzaG9ydCkKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1IDsgfQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KICAgIGVsc2UKICAgICAgYWNfY3Zfc2l6ZW9mX3Nob3J0PTAKICAgIGZpCkBAIC02ODE5LDcgKzczODEsNyBAQAogIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiBmbG9hdCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBzaXplIG9mIGZsb2F0Li4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3NpemVvZl9mbG9hdCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3NpemVvZl9mbG9hdCs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIGFjX2ZuX2NfY29tcHV0ZV9pbnQgIiRMSU5FTk8iICIobG9uZyBpbnQpIChzaXplb2YgKGZsb2F0KSkiICJhY19jdl9zaXplb2ZfZmxvYXQiICAgICAgICAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiOyB0aGVuIDoKQEAgLTY4MjksNyArNzM5MSw3IEBACiAgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQogJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQogYXNfZm5fZXJyb3IgNzcgImNhbm5vdCBjb21wdXRlIHNpemVvZiAoZmxvYXQpCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNSA7IH0KK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CiAgICBlbHNlCiAgICAgIGFjX2N2X3NpemVvZl9mbG9hdD0wCiAgICBmaQpAQCAtNjg1Miw3ICs3NDE0LDcgQEAKICMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2YgZG91YmxlIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgZG91YmxlLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3NpemVvZl9kb3VibGUrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9zaXplb2ZfZG91YmxlKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgYWNfZm5fY19jb21wdXRlX2ludCAiJExJTkVOTyIgIihsb25nIGludCkgKHNpemVvZiAoZG91YmxlKSkiICJhY19jdl9zaXplb2ZfZG91YmxlIiAgICAgICAgIiRhY19pbmNsdWRlc19kZWZhdWx0IjsgdGhlbiA6CkBAIC02ODYyLDcgKzc0MjQsNyBAQAogICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KIGFzX2ZuX2Vycm9yIDc3ICJjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGRvdWJsZSkKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1IDsgfQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KICAgIGVsc2UKICAgICAgYWNfY3Zfc2l6ZW9mX2RvdWJsZT0wCiAgICBmaQpAQCAtNjg4NSw3ICs3NDQ3LDcgQEAKICMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2YgZnBvc190IiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgZnBvc190Li4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3NpemVvZl9mcG9zX3Qrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9zaXplb2ZfZnBvc190Kzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgYWNfZm5fY19jb21wdXRlX2ludCAiJExJTkVOTyIgIihsb25nIGludCkgKHNpemVvZiAoZnBvc190KSkiICJhY19jdl9zaXplb2ZfZnBvc190IiAgICAgICAgIiRhY19pbmNsdWRlc19kZWZhdWx0IjsgdGhlbiA6CkBAIC02ODk1LDcgKzc0NTcsNyBAQAogICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KIGFzX2ZuX2Vycm9yIDc3ICJjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGZwb3NfdCkKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1IDsgfQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KICAgIGVsc2UKICAgICAgYWNfY3Zfc2l6ZW9mX2Zwb3NfdD0wCiAgICBmaQpAQCAtNjkxOCw3ICs3NDgwLDcgQEAKICMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2Ygc2l6ZV90IiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2Ygc2l6ZV90Li4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3NpemVvZl9zaXplX3Qrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9zaXplb2Zfc2l6ZV90Kzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgYWNfZm5fY19jb21wdXRlX2ludCAiJExJTkVOTyIgIihsb25nIGludCkgKHNpemVvZiAoc2l6ZV90KSkiICJhY19jdl9zaXplb2Zfc2l6ZV90IiAgICAgICAgIiRhY19pbmNsdWRlc19kZWZhdWx0IjsgdGhlbiA6CkBAIC02OTI4LDcgKzc0OTAsNyBAQAogICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KIGFzX2ZuX2Vycm9yIDc3ICJjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHNpemVfdCkKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1IDsgfQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KICAgIGVsc2UKICAgICAgYWNfY3Zfc2l6ZW9mX3NpemVfdD0wCiAgICBmaQpAQCAtNjk1MSw3ICs3NTEzLDcgQEAKICMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2YgcGlkX3QiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgc2l6ZSBvZiBwaWRfdC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9zaXplb2ZfcGlkX3Qrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9zaXplb2ZfcGlkX3QrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiBhY19mbl9jX2NvbXB1dGVfaW50ICIkTElORU5PIiAiKGxvbmcgaW50KSAoc2l6ZW9mIChwaWRfdCkpIiAiYWNfY3Zfc2l6ZW9mX3BpZF90IiAgICAgICAgIiRhY19pbmNsdWRlc19kZWZhdWx0IjsgdGhlbiA6CkBAIC02OTYxLDcgKzc1MjMsNyBAQAogICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KIGFzX2ZuX2Vycm9yIDc3ICJjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHBpZF90KQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDUgOyB9CitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQogICAgZWxzZQogICAgICBhY19jdl9zaXplb2ZfcGlkX3Q9MAogICAgZmkKQEAgLTcwMTEsNyArNzU3Myw3IEBACiAjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIGxvbmcgbG9uZyIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBzaXplIG9mIGxvbmcgbG9uZy4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9zaXplb2ZfbG9uZ19sb25nK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZys6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIGFjX2ZuX2NfY29tcHV0ZV9pbnQgIiRMSU5FTk8iICIobG9uZyBpbnQpIChzaXplb2YgKGxvbmcgbG9uZykpIiAiYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZyIgICAgICAgICIkYWNfaW5jbHVkZXNfZGVmYXVsdCI7IHRoZW4gOgpAQCAtNzAyMSw3ICs3NTgzLDcgQEAKICAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9CiBhc19mbl9lcnJvciA3NyAiY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nIGxvbmcpCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNSA7IH0KK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CiAgICBlbHNlCiAgICAgIGFjX2N2X3NpemVvZl9sb25nX2xvbmc9MAogICAgZmkKQEAgLTcwNzIsNyArNzYzNCw3IEBACiAjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIGxvbmcgZG91YmxlIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgbG9uZyBkb3VibGUuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX2xvbmdfZG91YmxlK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3Zfc2l6ZW9mX2xvbmdfZG91YmxlKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgYWNfZm5fY19jb21wdXRlX2ludCAiJExJTkVOTyIgIihsb25nIGludCkgKHNpemVvZiAobG9uZyBkb3VibGUpKSIgImFjX2N2X3NpemVvZl9sb25nX2RvdWJsZSIgICAgICAgICIkYWNfaW5jbHVkZXNfZGVmYXVsdCI7IHRoZW4gOgpAQCAtNzA4Miw3ICs3NjQ0LDcgQEAKICAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9CiBhc19mbl9lcnJvciA3NyAiY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nIGRvdWJsZSkKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1IDsgfQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KICAgIGVsc2UKICAgICAgYWNfY3Zfc2l6ZW9mX2xvbmdfZG91YmxlPTAKICAgIGZpCkBAIC03MTMzLDcgKzc2OTUsNyBAQAogIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiBfQm9vbCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBzaXplIG9mIF9Cb29sLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3NpemVvZl9fQm9vbCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3NpemVvZl9fQm9vbCs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIGFjX2ZuX2NfY29tcHV0ZV9pbnQgIiRMSU5FTk8iICIobG9uZyBpbnQpIChzaXplb2YgKF9Cb29sKSkiICJhY19jdl9zaXplb2ZfX0Jvb2wiICAgICAgICAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiOyB0aGVuIDoKQEAgLTcxNDMsNyArNzcwNSw3IEBACiAgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQogJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQogYXNfZm5fZXJyb3IgNzcgImNhbm5vdCBjb21wdXRlIHNpemVvZiAoX0Jvb2wpCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNSA7IH0KK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CiAgICBlbHNlCiAgICAgIGFjX2N2X3NpemVvZl9fQm9vbD0wCiAgICBmaQpAQCAtNzE2OSw3ICs3NzMxLDcgQEAKICAgICAgICAgI2luY2x1ZGUgPGludHR5cGVzLmg+CiAgICAgICAgICNlbmRpZgogIgotaWYgdGVzdCAieCRhY19jdl90eXBlX3VpbnRwdHJfdCIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl90eXBlX3VpbnRwdHJfdCIgPSB4eWVzOyB0aGVuIDoKIAogY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgogI2RlZmluZSBIQVZFX1VJTlRQVFJfVCAxCkBAIC03MTgxLDcgKzc3NDMsNyBAQAogIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiB1aW50cHRyX3QiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgc2l6ZSBvZiB1aW50cHRyX3QuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX3VpbnRwdHJfdCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3NpemVvZl91aW50cHRyX3QrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiBhY19mbl9jX2NvbXB1dGVfaW50ICIkTElORU5PIiAiKGxvbmcgaW50KSAoc2l6ZW9mICh1aW50cHRyX3QpKSIgImFjX2N2X3NpemVvZl91aW50cHRyX3QiICAgICAgICAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiOyB0aGVuIDoKQEAgLTcxOTEsNyArNzc1Myw3IEBACiAgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQogJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQogYXNfZm5fZXJyb3IgNzcgImNhbm5vdCBjb21wdXRlIHNpemVvZiAodWludHB0cl90KQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDUgOyB9CitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQogICAgZWxzZQogICAgICBhY19jdl9zaXplb2ZfdWludHB0cl90PTAKICAgIGZpCkBAIC03MjE3LDcgKzc3NzksNyBAQAogIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiBvZmZfdCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBzaXplIG9mIG9mZl90Li4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3NpemVvZl9vZmZfdCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3NpemVvZl9vZmZfdCs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIGFjX2ZuX2NfY29tcHV0ZV9pbnQgIiRMSU5FTk8iICIobG9uZyBpbnQpIChzaXplb2YgKG9mZl90KSkiICJhY19jdl9zaXplb2Zfb2ZmX3QiICAgICAgICAiCkBAIC03MjMyLDcgKzc3OTQsNyBAQAogICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KIGFzX2ZuX2Vycm9yIDc3ICJjYW5ub3QgY29tcHV0ZSBzaXplb2YgKG9mZl90KQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDUgOyB9CitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQogICAgZWxzZQogICAgICBhY19jdl9zaXplb2Zfb2ZmX3Q9MAogICAgZmkKQEAgLTcyNzYsNyArNzgzOCw3IEBACiAjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIHRpbWVfdCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBzaXplIG9mIHRpbWVfdC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9zaXplb2ZfdGltZV90K3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3Zfc2l6ZW9mX3RpbWVfdCs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIGFjX2ZuX2NfY29tcHV0ZV9pbnQgIiRMSU5FTk8iICIobG9uZyBpbnQpIChzaXplb2YgKHRpbWVfdCkpIiAiYWNfY3Zfc2l6ZW9mX3RpbWVfdCIgICAgICAgICIKQEAgLTcyOTQsNyArNzg1Niw3IEBACiAgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQogJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQogYXNfZm5fZXJyb3IgNzcgImNhbm5vdCBjb21wdXRlIHNpemVvZiAodGltZV90KQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDUgOyB9CitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQogICAgZWxzZQogICAgICBhY19jdl9zaXplb2ZfdGltZV90PTAKICAgIGZpCkBAIC03MzUwLDcgKzc5MTIsNyBAQAogIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiBwdGhyZWFkX3QiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgc2l6ZSBvZiBwdGhyZWFkX3QuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX3B0aHJlYWRfdCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X3NpemVvZl9wdGhyZWFkX3QrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiBhY19mbl9jX2NvbXB1dGVfaW50ICIkTElORU5PIiAiKGxvbmcgaW50KSAoc2l6ZW9mIChwdGhyZWFkX3QpKSIgImFjX2N2X3NpemVvZl9wdGhyZWFkX3QiICAgICAgICAiCkBAIC03MzY1LDcgKzc5MjcsNyBAQAogICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KIGFzX2ZuX2Vycm9yIDc3ICJjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHB0aHJlYWRfdCkKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1IDsgfQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KICAgIGVsc2UKICAgICAgYWNfY3Zfc2l6ZW9mX3B0aHJlYWRfdD0wCiAgICBmaQpAQCAtNzQzMCw3ICs3OTkyLDYgQEAKIGVzYWMKIAogCi1BUkNIX1JVTl8zMkJJVD0iIgogCiBjYXNlICRhY19zeXNfc3lzdGVtLyRhY19zeXNfcmVsZWFzZSBpbgogICBEYXJ3aW4vWzAxNTY3XVwuLiopCkBAIC03NjU2LDE1ICs4MjE3LDE0IEBACiAJCSMgVXNlIC11bmRlZmluZWQgZHluYW1pY19sb29rdXAgd2hlbmV2ZXIgcG9zc2libGUgKDEwLjMgYW5kIGxhdGVyKS4KIAkJIyBUaGlzIGFsbG93cyBhbiBleHRlbnNpb24gdG8gYmUgdXNlZCBpbiBhbnkgUHl0aG9uCiAKLQkJaWYgdGVzdCAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gJz4nIDEwLjIKKwkJZGVwX3RhcmdldF9tYWpvcj1gZWNobyAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gfCBcCisJCQkJc2VkICdzL1woWzAtOV0qXClcLlwoWzAtOV0qXCkuKi9cMS8nYAorCQlkZXBfdGFyZ2V0X21pbm9yPWBlY2hvICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSB8IFwKKwkJCQlzZWQgJ3MvXChbMC05XSpcKVwuXChbMC05XSpcKS4qL1wyLydgCisJCWlmIHRlc3QgJHtkZXBfdGFyZ2V0X21ham9yfSAtZXEgMTAgJiYgXAorCQkgICB0ZXN0ICR7ZGVwX3RhcmdldF9taW5vcn0gLWxlIDIKIAkJdGhlbgotCQkJaWYgdGVzdCAiJHtlbmFibGVfdW5pdmVyc2Fsc2RrfSI7IHRoZW4KLQkJCQlMREZMQUdTPSIke1VOSVZFUlNBTF9BUkNIX0ZMQUdTfSAtaXN5c3Jvb3QgJHtVTklWRVJTQUxTREt9ICR7TERGTEFHU30iCi0JCQlmaQotCQkJTERTSEFSRUQ9JyQoQ0MpIC1idW5kbGUgLXVuZGVmaW5lZCBkeW5hbWljX2xvb2t1cCcKLQkJCUxEQ1hYU0hBUkVEPSckKENYWCkgLWJ1bmRsZSAtdW5kZWZpbmVkIGR5bmFtaWNfbG9va3VwJwotCQkJQkxEU0hBUkVEPSIkTERTSEFSRUQiCi0JCWVsc2UKKwkJCSMgYnVpbGRpbmcgZm9yIE9TIFggMTAuMCB0aHJvdWdoIDEwLjIKIAkJCUxEU0hBUkVEPSckKENDKSAtYnVuZGxlJwogCQkJTERDWFhTSEFSRUQ9JyQoQ1hYKSAtYnVuZGxlJwogCQkJaWYgdGVzdCAiJGVuYWJsZV9mcmFtZXdvcmsiIDsgdGhlbgpAQCAtNzY3OCw2ICs4MjM4LDE0IEBACiAJCQkJTERTSEFSRUQ9IiRMRFNIQVJFRCAiJy1idW5kbGVfbG9hZGVyICQoQklORElSKS9weXRob24kKFZFUlNJT04pJChFWEUpJwogCQkJCUxEQ1hYU0hBUkVEPSIkTERDWFhTSEFSRUQgIictYnVuZGxlX2xvYWRlciAkKEJJTkRJUikvcHl0aG9uJChWRVJTSU9OKSQoRVhFKScKIAkJCWZpCisJCWVsc2UKKwkJCSMgYnVpbGRpbmcgZm9yIE9TIFggMTAuMyBhbmQgbGF0ZXIKKwkJCWlmIHRlc3QgIiR7ZW5hYmxlX3VuaXZlcnNhbHNka30iOyB0aGVuCisJCQkJTERGTEFHUz0iJHtVTklWRVJTQUxfQVJDSF9GTEFHU30gLWlzeXNyb290ICR7VU5JVkVSU0FMU0RLfSAke0xERkxBR1N9IgorCQkJZmkKKwkJCUxEU0hBUkVEPSckKENDKSAtYnVuZGxlIC11bmRlZmluZWQgZHluYW1pY19sb29rdXAnCisJCQlMRENYWFNIQVJFRD0nJChDWFgpIC1idW5kbGUgLXVuZGVmaW5lZCBkeW5hbWljX2xvb2t1cCcKKwkJCUJMRFNIQVJFRD0iJExEU0hBUkVEIgogCQlmaQogCQk7OwogCUxpbnV4KnxHTlUqfFFOWCopCkBAIC03ODc3LDcgKzg0NDUsNyBAQAogIyBjaGVja3MgZm9yIGxpYnJhcmllcwogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2xpYl9kbF9kbG9wZW4rc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9saWJfZGxfZGxvcGVuKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwpAQCAtNzkxMSw3ICs4NDc5LDcgQEAKIGZpCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNQogJGFzX2VjaG8gIiRhY19jdl9saWJfZGxfZGxvcGVuIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9saWJfZGxfZGxvcGVuIiA9IHh5ZXM7IHRoZW4gOgogICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIEhBVkVfTElCREwgMQogX0FDRU9GCkBAIC03OTIyLDcgKzg0OTAsNyBAQAogCSMgRHluYW1pYyBsaW5raW5nIGZvciBTdW5PUy9Tb2xhcmlzIGFuZCBTWVNWCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzaGxfbG9hZCBpbiAtbGRsZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3Igc2hsX2xvYWQgaW4gLWxkbGQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfbGliX2RsZF9zaGxfbG9hZCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X2xpYl9kbGRfc2hsX2xvYWQrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCkBAIC03OTU2LDcgKzg1MjQsNyBAQAogZmkKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsZF9zaGxfbG9hZCIgPiY1CiAkYXNfZWNobyAiJGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfZGxkX3NobF9sb2FkIiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQiID0geHllczsgdGhlbiA6CiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKICNkZWZpbmUgSEFWRV9MSUJETEQgMQogX0FDRU9GCkBAIC03OTcwLDcgKzg1MzgsNyBAQAogaWYgdGVzdCAiJHdpdGhfdGhyZWFkcyIgPSAieWVzIiAtbyAteiAiJHdpdGhfdGhyZWFkcyI7IHRoZW4KICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgc2VtX2luaXQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBzZW1faW5pdC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfc2VtX2luaXQrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9zZWFyY2hfc2VtX2luaXQrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKQEAgLTgwMDQsMTEgKzg1NzIsMTEgQEAKIGZpCiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICBjb25mdGVzdCRhY19leGVleHQKLSAgaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfc2VtX2luaXQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBpZiAke2FjX2N2X3NlYXJjaF9zZW1faW5pdCs6fSBmYWxzZTsgdGhlbiA6CiAgIGJyZWFrCiBmaQogZG9uZQotaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfc2VtX2luaXQrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9zZWFyY2hfc2VtX2luaXQrOn0gZmFsc2U7IHRoZW4gOgogCiBlbHNlCiAgIGFjX2N2X3NlYXJjaF9zZW1faW5pdD1ubwpAQCAtODAzMSw3ICs4NTk5LDcgQEAKICMgY2hlY2sgaWYgd2UgbmVlZCBsaWJpbnRsIGZvciBsb2NhbGUgZnVuY3Rpb25zCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgdGV4dGRvbWFpbiBpbiAtbGludGwuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfbGliX2ludGxfdGV4dGRvbWFpbitzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X2xpYl9pbnRsX3RleHRkb21haW4rOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCkBAIC04MDY1LDcgKzg2MzMsNyBAQAogZmkKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2ludGxfdGV4dGRvbWFpbiIgPiY1CiAkYXNfZWNobyAiJGFjX2N2X2xpYl9pbnRsX3RleHRkb21haW4iID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfaW50bF90ZXh0ZG9tYWluIiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9pbnRsX3RleHRkb21haW4iID0geHllczsgdGhlbiA6CiAKICRhc19lY2hvICIjZGVmaW5lIFdJVEhfTElCSU5UTCAxIiA+PmNvbmZkZWZzLmgKIApAQCAtODExMiw3ICs4NjgwLDcgQEAKICMgQmVPUycgc29ja2V0cyBhcmUgc3Rhc2hlZCBpbiBsaWJuZXQuCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB0X29wZW4gaW4gLWxuc2wiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHRfb3BlbiBpbiAtbG5zbC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfbnNsX3Rfb3BlbitzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X2xpYl9uc2xfdF9vcGVuKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwpAQCAtODE0NiwxMyArODcxNCwxMyBAQAogZmkKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX25zbF90X29wZW4iID4mNQogJGFzX2VjaG8gIiRhY19jdl9saWJfbnNsX3Rfb3BlbiIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9uc2xfdF9vcGVuIiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9uc2xfdF9vcGVuIiA9IHh5ZXM7IHRoZW4gOgogICBMSUJTPSItbG5zbCAkTElCUyIKIGZpCiAgIyBTVlI0CiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzb2NrZXQgaW4gLWxzb2NrZXQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHNvY2tldCBpbiAtbHNvY2tldC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfc29ja2V0X3NvY2tldCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X2xpYl9zb2NrZXRfc29ja2V0Kzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwpAQCAtODE4Niw3ICs4NzU0LDcgQEAKIGZpCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0IiA+JjUKICRhc19lY2hvICIkYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfc29ja2V0X3NvY2tldCIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9saWJfc29ja2V0X3NvY2tldCIgPSB4eWVzOyB0aGVuIDoKICAgTElCUz0iLWxzb2NrZXQgJExJQlMiCiBmaQogICMgU1ZSNCBzb2NrZXRzCkBAIC04MTk1LDcgKzg3NjMsNyBAQAogQmVPUyopCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzb2NrZXQgaW4gLWxuZXQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHNvY2tldCBpbiAtbG5ldC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfbmV0X3NvY2tldCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X2xpYl9uZXRfc29ja2V0Kzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwpAQCAtODIyOSw3ICs4Nzk3LDcgQEAKIGZpCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9uZXRfc29ja2V0IiA+JjUKICRhc19lY2hvICIkYWNfY3ZfbGliX25ldF9zb2NrZXQiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfbmV0X3NvY2tldCIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9saWJfbmV0X3NvY2tldCIgPSB4eWVzOyB0aGVuIDoKICAgTElCUz0iLWxuZXQgJExJQlMiCiBmaQogICMgQmVPUwpAQCAtODI1Nyw3ICs4ODI1LDcgQEAKIHNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXBrZy1jb25maWc7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wYXRoX1BLR19DT05GSUcrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9wYXRoX1BLR19DT05GSUcrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBjYXNlICRQS0dfQ09ORklHIGluCkBAIC04MjcxLDcgKzg4MzksNyBAQAogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgogICAgIGFjX2N2X3BhdGhfUEtHX0NPTkZJRz0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCkBAIC04MzAwLDcgKzg4NjgsNyBAQAogc2V0IGR1bW15IHBrZy1jb25maWc7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wYXRoX2FjX3B0X1BLR19DT05GSUcrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9wYXRoX2FjX3B0X1BLR19DT05GSUcrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBjYXNlICRhY19wdF9QS0dfQ09ORklHIGluCkBAIC04MzE0LDcgKzg4ODIsNyBAQAogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgogICAgIGFjX2N2X3BhdGhfYWNfcHRfUEtHX0NPTkZJRz0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCkBAIC04Mzg4LDYgKzg5NTYsNDYgQEAKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkd2l0aF9zeXN0ZW1fZmZpIiA+JjUKICRhc19lY2hvICIkd2l0aF9zeXN0ZW1fZmZpIiA+JjY7IH0KIAorIyBDaGVjayBmb3IgLS13aXRoLXRjbHRrLWluY2x1ZGVzPXBhdGggYW5kIC0td2l0aC10Y2x0ay1saWJzPXBhdGgKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAtLXdpdGgtdGNsdGstaW5jbHVkZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIC0td2l0aC10Y2x0ay1pbmNsdWRlcy4uLiAiID4mNjsgfQorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXRjbHRrLWluY2x1ZGVzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF90Y2x0a19pbmNsdWRlcytzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfdGNsdGtfaW5jbHVkZXM7CitlbHNlCisgIHdpdGhfdGNsdGtfaW5jbHVkZXM9ImRlZmF1bHQiCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHdpdGhfdGNsdGtfaW5jbHVkZXMiID4mNQorJGFzX2VjaG8gIiR3aXRoX3RjbHRrX2luY2x1ZGVzIiA+JjY7IH0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIC0td2l0aC10Y2x0ay1saWJzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAtLXdpdGgtdGNsdGstbGlicy4uLiAiID4mNjsgfQorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXRjbHRrLWxpYnMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3RjbHRrX2xpYnMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX3RjbHRrX2xpYnM7CitlbHNlCisgIHdpdGhfdGNsdGtfbGlicz0iZGVmYXVsdCIKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkd2l0aF90Y2x0a19saWJzIiA+JjUKKyRhc19lY2hvICIkd2l0aF90Y2x0a19saWJzIiA+JjY7IH0KK2lmIHRlc3QgIngkd2l0aF90Y2x0a19pbmNsdWRlcyIgPSB4ZGVmYXVsdCB8fCB0ZXN0ICJ4JHdpdGhfdGNsdGtfbGlicyIgPSB4ZGVmYXVsdAordGhlbgorICBpZiB0ZXN0ICJ4JHdpdGhfdGNsdGtfaW5jbHVkZXMiICE9ICJ4JHdpdGhfdGNsdGtfbGlicyIKKyAgdGhlbgorICAgIGFzX2ZuX2Vycm9yICQ/ICJ1c2UgYm90aCAtLXdpdGgtdGNsdGstaW5jbHVkZXM9Jy4uLicgYW5kIC0td2l0aC10Y2x0ay1saWJzPScuLi4nIG9yIG5laXRoZXIiICIkTElORU5PIiA1CisgIGZpCisgIFRDTFRLX0lOQ0xVREVTPSIiCisgIFRDTFRLX0xJQlM9IiIKK2Vsc2UKKyAgVENMVEtfSU5DTFVERVM9IiR3aXRoX3RjbHRrX2luY2x1ZGVzIgorICBUQ0xUS19MSUJTPSIkd2l0aF90Y2x0a19saWJzIgorZmkKKwogIyBDaGVjayBmb3IgLS13aXRoLWRibWxpYm9yZGVyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAtLXdpdGgtZGJtbGlib3JkZXIiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIC0td2l0aC1kYm1saWJvcmRlci4uLiAiID4mNjsgfQpAQCAtODU2OCw3ICs5MTc2LDcgQEAKICAgICAkYXNfZWNobyAiI2RlZmluZSBfUkVFTlRSQU5UIDEiID4+Y29uZmRlZnMuaAogCiAgICAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImN0aHJlYWRzLmgiICJhY19jdl9oZWFkZXJfY3RocmVhZHNfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfY3RocmVhZHNfaCIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfY3RocmVhZHNfaCIgPSB4eWVzOyB0aGVuIDoKICAgJGFzX2VjaG8gIiNkZWZpbmUgV0lUSF9USFJFQUQgMSIgPj5jb25mZGVmcy5oCiAKICAgICAkYXNfZWNobyAiI2RlZmluZSBDX1RIUkVBRFMgMSIgPj5jb25mZGVmcy5oCkBAIC04NTgxLDcgKzkxODksNyBAQAogZWxzZQogCiAgICAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIm1hY2gvY3RocmVhZHMuaCIgImFjX2N2X2hlYWRlcl9tYWNoX2N0aHJlYWRzX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX21hY2hfY3RocmVhZHNfaCIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbWFjaF9jdGhyZWFkc19oIiA9IHh5ZXM7IHRoZW4gOgogICAkYXNfZWNobyAiI2RlZmluZSBXSVRIX1RIUkVBRCAxIiA+PmNvbmZkZWZzLmgKIAogICAgICRhc19lY2hvICIjZGVmaW5lIENfVEhSRUFEUyAxIiA+PmNvbmZkZWZzLmgKQEAgLTg2MTksNiArOTIyNyw4IEBACiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgcHRocmVhZF9jcmVhdGUgaW4gLWxwdGhyZWFkLi4uICIgPiY2OyB9CiAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAogLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAKIHZvaWQgKiBzdGFydF9yb3V0aW5lICh2b2lkICphcmcpIHsgZXhpdCAoMCk7IH0KQEAgLTg2NDMsNyArOTI1Myw3IEBACiAKICAgICBMSUJTPSRfbGlicwogICAgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgInB0aHJlYWRfZGV0YWNoIiAiYWNfY3ZfZnVuY19wdGhyZWFkX2RldGFjaCIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19wdGhyZWFkX2RldGFjaCIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9mdW5jX3B0aHJlYWRfZGV0YWNoIiA9IHh5ZXM7IHRoZW4gOgogICAkYXNfZWNobyAiI2RlZmluZSBXSVRIX1RIUkVBRCAxIiA+PmNvbmZkZWZzLmgKIAogICAgIHBvc2l4X3RocmVhZHM9eWVzCkBAIC04NjUxLDcgKzkyNjEsNyBAQAogZWxzZQogCiAgICAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImF0aGVvcy90aHJlYWRzLmgiICJhY19jdl9oZWFkZXJfYXRoZW9zX3RocmVhZHNfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfYXRoZW9zX3RocmVhZHNfaCIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfYXRoZW9zX3RocmVhZHNfaCIgPSB4eWVzOyB0aGVuIDoKICAgJGFzX2VjaG8gIiNkZWZpbmUgV0lUSF9USFJFQUQgMSIgPj5jb25mZGVmcy5oCiAKIApAQCAtODY2MSw3ICs5MjcxLDcgQEAKIGVsc2UKIAogICAgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJrZXJuZWwvT1MuaCIgImFjX2N2X2hlYWRlcl9rZXJuZWxfT1NfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfa2VybmVsX09TX2giID0geCIieWVzOyB0aGVuIDoKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2tlcm5lbF9PU19oIiA9IHh5ZXM7IHRoZW4gOgogICAkYXNfZWNobyAiI2RlZmluZSBXSVRIX1RIUkVBRCAxIiA+PmNvbmZkZWZzLmgKIAogCkBAIC04NjcyLDcgKzkyODIsNyBAQAogCiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgcHRocmVhZF9jcmVhdGUgaW4gLWxwdGhyZWFkcyIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgcHRocmVhZF9jcmVhdGUgaW4gLWxwdGhyZWFkcy4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfcHRocmVhZHNfcHRocmVhZF9jcmVhdGUrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9saWJfcHRocmVhZHNfcHRocmVhZF9jcmVhdGUrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCkBAIC04NzA2LDcgKzkzMTYsNyBAQAogZmkKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3B0aHJlYWRzX3B0aHJlYWRfY3JlYXRlIiA+JjUKICRhc19lY2hvICIkYWNfY3ZfbGliX3B0aHJlYWRzX3B0aHJlYWRfY3JlYXRlIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3B0aHJlYWRzX3B0aHJlYWRfY3JlYXRlIiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9wdGhyZWFkc19wdGhyZWFkX2NyZWF0ZSIgPSB4eWVzOyB0aGVuIDoKICAgJGFzX2VjaG8gIiNkZWZpbmUgV0lUSF9USFJFQUQgMSIgPj5jb25mZGVmcy5oCiAKICAgICBwb3NpeF90aHJlYWRzPXllcwpAQCAtODcxNiw3ICs5MzI2LDcgQEAKIAogICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHB0aHJlYWRfY3JlYXRlIGluIC1sY19yIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciBwdGhyZWFkX2NyZWF0ZSBpbiAtbGNfci4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfY19yX3B0aHJlYWRfY3JlYXRlK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfbGliX2Nfcl9wdGhyZWFkX2NyZWF0ZSs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKQEAgLTg3NTAsNyArOTM2MCw3IEBACiBmaQogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfY19yX3B0aHJlYWRfY3JlYXRlIiA+JjUKICRhc19lY2hvICIkYWNfY3ZfbGliX2Nfcl9wdGhyZWFkX2NyZWF0ZSIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9jX3JfcHRocmVhZF9jcmVhdGUiID0geCIieWVzOyB0aGVuIDoKK2lmIHRlc3QgIngkYWNfY3ZfbGliX2Nfcl9wdGhyZWFkX2NyZWF0ZSIgPSB4eWVzOyB0aGVuIDoKICAgJGFzX2VjaG8gIiNkZWZpbmUgV0lUSF9USFJFQUQgMSIgPj5jb25mZGVmcy5oCiAKICAgICBwb3NpeF90aHJlYWRzPXllcwpAQCAtODc2MCw3ICs5MzcwLDcgQEAKIAogICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIF9fcHRocmVhZF9jcmVhdGVfc3lzdGVtIGluIC1scHRocmVhZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgX19wdGhyZWFkX2NyZWF0ZV9zeXN0ZW0gaW4gLWxwdGhyZWFkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2xpYl9wdGhyZWFkX19fcHRocmVhZF9jcmVhdGVfc3lzdGVtK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfbGliX3B0aHJlYWRfX19wdGhyZWFkX2NyZWF0ZV9zeXN0ZW0rOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCkBAIC04Nzk0LDcgKzk0MDQsNyBAQAogZmkKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3B0aHJlYWRfX19wdGhyZWFkX2NyZWF0ZV9zeXN0ZW0iID4mNQogJGFzX2VjaG8gIiRhY19jdl9saWJfcHRocmVhZF9fX3B0aHJlYWRfY3JlYXRlX3N5c3RlbSIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9wdGhyZWFkX19fcHRocmVhZF9jcmVhdGVfc3lzdGVtIiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9wdGhyZWFkX19fcHRocmVhZF9jcmVhdGVfc3lzdGVtIiA9IHh5ZXM7IHRoZW4gOgogICAkYXNfZWNobyAiI2RlZmluZSBXSVRIX1RIUkVBRCAxIiA+PmNvbmZkZWZzLmgKIAogICAgIHBvc2l4X3RocmVhZHM9eWVzCkBAIC04ODA0LDcgKzk0MTQsNyBAQAogCiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgcHRocmVhZF9jcmVhdGUgaW4gLWxjbWEiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHB0aHJlYWRfY3JlYXRlIGluIC1sY21hLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2xpYl9jbWFfcHRocmVhZF9jcmVhdGUrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9saWJfY21hX3B0aHJlYWRfY3JlYXRlKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwpAQCAtODgzOCw3ICs5NDQ4LDcgQEAKIGZpCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9jbWFfcHRocmVhZF9jcmVhdGUiID4mNQogJGFzX2VjaG8gIiRhY19jdl9saWJfY21hX3B0aHJlYWRfY3JlYXRlIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2NtYV9wdGhyZWFkX2NyZWF0ZSIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9saWJfY21hX3B0aHJlYWRfY3JlYXRlIiA9IHh5ZXM7IHRoZW4gOgogICAkYXNfZWNobyAiI2RlZmluZSBXSVRIX1RIUkVBRCAxIiA+PmNvbmZkZWZzLmgKIAogICAgIHBvc2l4X3RocmVhZHM9eWVzCkBAIC04ODc4LDcgKzk0ODgsNyBAQAogCiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdXNjb25maWcgaW4gLWxtcGMiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHVzY29uZmlnIGluIC1sbXBjLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2xpYl9tcGNfdXNjb25maWcrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9saWJfbXBjX3VzY29uZmlnKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwpAQCAtODkxMiw3ICs5NTIyLDcgQEAKIGZpCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9tcGNfdXNjb25maWciID4mNQogJGFzX2VjaG8gIiRhY19jdl9saWJfbXBjX3VzY29uZmlnIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX21wY191c2NvbmZpZyIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9saWJfbXBjX3VzY29uZmlnIiA9IHh5ZXM7IHRoZW4gOgogICAkYXNfZWNobyAiI2RlZmluZSBXSVRIX1RIUkVBRCAxIiA+PmNvbmZkZWZzLmgKIAogICAgIExJQlM9IiRMSUJTIC1sbXBjIgpAQCAtODkyNCw3ICs5NTM0LDcgQEAKICAgICBpZiB0ZXN0ICIkcG9zaXhfdGhyZWFkcyIgIT0gInllcyI7IHRoZW4KICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHRocl9jcmVhdGUgaW4gLWx0aHJlYWQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHRocl9jcmVhdGUgaW4gLWx0aHJlYWQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfbGliX3RocmVhZF90aHJfY3JlYXRlK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfbGliX3RocmVhZF90aHJfY3JlYXRlKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwpAQCAtODk1OCw3ICs5NTY4LDcgQEAKIGZpCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl90aHJlYWRfdGhyX2NyZWF0ZSIgPiY1CiAkYXNfZWNobyAiJGFjX2N2X2xpYl90aHJlYWRfdGhyX2NyZWF0ZSIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl90aHJlYWRfdGhyX2NyZWF0ZSIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9saWJfdGhyZWFkX3Rocl9jcmVhdGUiID0geHllczsgdGhlbiA6CiAgICRhc19lY2hvICIjZGVmaW5lIFdJVEhfVEhSRUFEIDEiID4+Y29uZmRlZnMuaAogCiAgICAgICBMSUJTPSIkTElCUyAtbHRocmVhZCIKQEAgLTkwMDMsNyArOTYxMyw3IEBACiAKICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgUFRIUkVBRF9TQ09QRV9TWVNURU0gaXMgc3VwcG9ydGVkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGlmIFBUSFJFQURfU0NPUEVfU1lTVEVNIGlzIHN1cHBvcnRlZC4uLiAiID4mNjsgfQotICAgICAgaWYgdGVzdCAiJHthY19jdl9wdGhyZWFkX3N5c3RlbV9zdXBwb3J0ZWQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAgICAgaWYgJHthY19jdl9wdGhyZWFkX3N5c3RlbV9zdXBwb3J0ZWQrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CkBAIC05MDExLDcgKzk2MjEsOSBAQAogZWxzZQogICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8cHRocmVhZC5oPgorCisgICAgICAjaW5jbHVkZSA8c3RkaW8uaD4KKyAgICAgICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAgICAgICB2b2lkICpmb28odm9pZCAqcGFybSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgIH0KQEAgLTkwNDYsNyArOTY1OCw3IEBACiAgICAgICBmb3IgYWNfZnVuYyBpbiBwdGhyZWFkX3NpZ21hc2sKIGRvIDoKICAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAicHRocmVhZF9zaWdtYXNrIiAiYWNfY3ZfZnVuY19wdGhyZWFkX3NpZ21hc2siCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfcHRocmVhZF9zaWdtYXNrIiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfcHRocmVhZF9zaWdtYXNrIiA9IHh5ZXM7IHRoZW4gOgogICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIEhBVkVfUFRIUkVBRF9TSUdNQVNLIDEKIF9BQ0VPRgpAQCAtOTA2MCw2ICs5NjcyLDE3IEBACiBmaQogZG9uZQogCisgICAgICBmb3IgYWNfZnVuYyBpbiBwdGhyZWFkX2F0Zm9yaworZG8gOgorICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJwdGhyZWFkX2F0Zm9yayIgImFjX2N2X2Z1bmNfcHRocmVhZF9hdGZvcmsiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfcHRocmVhZF9hdGZvcmsiID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9QVEhSRUFEX0FURk9SSyAxCitfQUNFT0YKKworZmkKK2RvbmUKKwogZmkKIAogCkBAIC05MDg0LDI4ICs5NzA3LDIwIEBACiAgIGVzYWMKIGVsc2UKIAotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0gIGlwdjY9bm8KLQotZWxzZQogICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAgLyogQUZfSU5FVDYgYXZhaWxhYmxlIGNoZWNrICovCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotbWFpbigpCitpbnQKK21haW4gKCkKIHsKLSBpZiAoc29ja2V0KEFGX0lORVQ2LCBTT0NLX1NUUkVBTSwgMCkgPCAwKQotICAgZXhpdCgxKTsKLSBlbHNlCi0gICBleGl0KDApOworaW50IGRvbWFpbiA9IEFGX0lORVQ2OworICA7CisgIHJldHVybiAwOwogfQotCiBfQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgogCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQogJGFzX2VjaG8gInllcyIgPiY2OyB9CkBAIC05MTE4LDEwICs5NzMzLDcgQEAKICAgaXB2Nj1ubwogCiBmaQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAKIGlmIHRlc3QgIiRpcHY2IiA9ICJ5ZXMiOyB0aGVuCiAJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBSRkMyNTUzIEFQSSBpcyBhdmFpbGFibGUiID4mNQpAQCAtOTQzNiw3ICsxMDA0OCw3IEBACiAkYXNfZWNobyAiJHdpdGhfdmFsZ3JpbmQiID4mNjsgfQogaWYgdGVzdCAiJHdpdGhfdmFsZ3JpbmQiICE9IG5vOyB0aGVuCiAgICAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgInZhbGdyaW5kL3ZhbGdyaW5kLmgiICJhY19jdl9oZWFkZXJfdmFsZ3JpbmRfdmFsZ3JpbmRfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfdmFsZ3JpbmRfdmFsZ3JpbmRfaCIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfdmFsZ3JpbmRfdmFsZ3JpbmRfaCIgPSB4eWVzOyB0aGVuIDoKIAogJGFzX2VjaG8gIiNkZWZpbmUgV0lUSF9WQUxHUklORCAxIiA+PmNvbmZkZWZzLmgKIApAQCAtOTQ4MCw3ICsxMDA5Miw3IEBACiBmb3IgYWNfZnVuYyBpbiBkbG9wZW4KIGRvIDoKICAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiZGxvcGVuIiAiYWNfY3ZfZnVuY19kbG9wZW4iCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZGxvcGVuIiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZGxvcGVuIiA9IHh5ZXM7IHRoZW4gOgogICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIEhBVkVfRExPUEVOIDEKIF9BQ0VPRgpAQCAtOTU0Niw3ICsxMDE1OCw3IEBACiAgY2xvY2sgY29uZnN0ciBjdGVybWlkIGV4ZWN2IGZjaG1vZCBmY2hvd24gZm9yayBmcGF0aGNvbmYgZnRpbWUgZnRydW5jYXRlIFwKICBnYWlfc3RyZXJyb3IgZ2V0Z3JvdXBzIGdldGxvZ2luIGdldGxvYWRhdmcgZ2V0cGVlcm5hbWUgZ2V0cGdpZCBnZXRwaWQgXAogIGdldHByaW9yaXR5IGdldHJlc3VpZCBnZXRyZXNnaWQgZ2V0cHdlbnQgZ2V0c3BuYW0gZ2V0c3BlbnQgZ2V0c2lkIGdldHdkIFwKLSBpbml0Z3JvdXBzIGtpbGwga2lsbHBnIGxjaG1vZCBsY2hvd24gbHN0YXQgbWtmaWZvIG1rbm9kIG1rdGltZSBcCisgaW5pdGdyb3VwcyBraWxsIGtpbGxwZyBsY2htb2QgbGNob3duIGxzdGF0IG1rZmlmbyBta25vZCBta3RpbWUgbW1hcCBcCiAgbXJlbWFwIG5pY2UgcGF0aGNvbmYgcGF1c2UgcGxvY2sgcG9sbCBwdGhyZWFkX2luaXQgXAogIHB1dGVudiByZWFkbGluayByZWFscGF0aCBcCiAgc2VsZWN0IHNlbV9vcGVuIHNlbV90aW1lZHdhaXQgc2VtX2dldHZhbHVlIHNlbV91bmxpbmsgc2V0ZWdpZCBzZXRldWlkIFwKQEAgLTk4MTAsNyArMTA0MjIsNyBAQAogCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBmbG9jayBkZWNsYXJhdGlvbiIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgZmxvY2sgZGVjbGFyYXRpb24uLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfZmxvY2tfZGVjbCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X2Zsb2NrX2RlY2wrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CkBAIC05ODQwLDcgKzEwNDUyLDcgQEAKICAgZm9yIGFjX2Z1bmMgaW4gZmxvY2sKIGRvIDoKICAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiZmxvY2siICJhY19jdl9mdW5jX2Zsb2NrIgotaWYgdGVzdCAieCRhY19jdl9mdW5jX2Zsb2NrIiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZmxvY2siID0geHllczsgdGhlbiA6CiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKICNkZWZpbmUgSEFWRV9GTE9DSyAxCiBfQUNFT0YKQEAgLTk4NDgsNyArMTA0NjAsNyBAQAogZWxzZQogICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBmbG9jayBpbiAtbGJzZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgZmxvY2sgaW4gLWxic2QuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfbGliX2JzZF9mbG9jaytzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X2xpYl9ic2RfZmxvY2srOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCkBAIC05ODgyLDcgKzEwNDk0LDcgQEAKIGZpCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9ic2RfZmxvY2siID4mNQogJGFzX2VjaG8gIiRhY19jdl9saWJfYnNkX2Zsb2NrIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2JzZF9mbG9jayIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9saWJfYnNkX2Zsb2NrIiA9IHh5ZXM7IHRoZW4gOgogICAkYXNfZWNobyAiI2RlZmluZSBIQVZFX0ZMT0NLIDEiID4+Y29uZmRlZnMuaAogCiAKQEAgLTk5NTksNyArMTA1NzEsNyBAQAogc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19UUlVFK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfcHJvZ19UUlVFKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAtbiAiJFRSVUUiOyB0aGVuCkBAIC05OTcxLDcgKzEwNTgzLDcgQEAKICAgSUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KICAgICBhY19jdl9wcm9nX1RSVUU9IiRhY19wcm9nIgogICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKQEAgLTk5OTksNyArMTA2MTEsNyBAQAogCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBpbmV0X2F0b24gaW4gLWxjIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciBpbmV0X2F0b24gaW4gLWxjLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2xpYl9jX2luZXRfYXRvbitzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X2xpYl9jX2luZXRfYXRvbis6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKQEAgLTEwMDMzLDEyICsxMDY0NSwxMiBAQAogZmkKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2NfaW5ldF9hdG9uIiA+JjUKICRhc19lY2hvICIkYWNfY3ZfbGliX2NfaW5ldF9hdG9uIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2NfaW5ldF9hdG9uIiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9jX2luZXRfYXRvbiIgPSB4eWVzOyB0aGVuIDoKICAgJGFjX2N2X3Byb2dfVFJVRQogZWxzZQogICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBpbmV0X2F0b24gaW4gLWxyZXNvbHYiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGluZXRfYXRvbiBpbiAtbHJlc29sdi4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfcmVzb2x2X2luZXRfYXRvbitzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X2xpYl9yZXNvbHZfaW5ldF9hdG9uKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwpAQCAtMTAwNzIsNyArMTA2ODQsNyBAQAogZmkKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3Jlc29sdl9pbmV0X2F0b24iID4mNQogJGFzX2VjaG8gIiRhY19jdl9saWJfcmVzb2x2X2luZXRfYXRvbiIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9yZXNvbHZfaW5ldF9hdG9uIiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9yZXNvbHZfaW5ldF9hdG9uIiA9IHh5ZXM7IHRoZW4gOgogICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIEhBVkVfTElCUkVTT0xWIDEKIF9BQ0VPRgpAQCAtMTAwODksNyArMTA3MDEsNyBAQAogIyBleGl0IFB5dGhvbgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgY2hmbGFncyIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgY2hmbGFncy4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9oYXZlX2NoZmxhZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9oYXZlX2NoZmxhZ3MrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CkBAIC0xMDEyMyw3ICsxMDczNSw3IEBACiAkYXNfZWNobyAiJGFjX2N2X2hhdmVfY2hmbGFncyIgPiY2OyB9CiBpZiB0ZXN0ICIkYWNfY3ZfaGF2ZV9jaGZsYWdzIiA9IGNyb3NzIDsgdGhlbgogICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJjaGZsYWdzIiAiYWNfY3ZfZnVuY19jaGZsYWdzIgotaWYgdGVzdCAieCRhY19jdl9mdW5jX2NoZmxhZ3MiID0geCIieWVzOyB0aGVuIDoKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19jaGZsYWdzIiA9IHh5ZXM7IHRoZW4gOgogICBhY19jdl9oYXZlX2NoZmxhZ3M9InllcyIKIGVsc2UKICAgYWNfY3ZfaGF2ZV9jaGZsYWdzPSJubyIKQEAgLTEwMTM4LDcgKzEwNzUwLDcgQEAKIAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGNoZmxhZ3MiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxjaGZsYWdzLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2hhdmVfbGNoZmxhZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9oYXZlX2xjaGZsYWdzKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgpAQCAtMTAxNzIsNyArMTA3ODQsNyBAQAogJGFzX2VjaG8gIiRhY19jdl9oYXZlX2xjaGZsYWdzIiA+JjY7IH0KIGlmIHRlc3QgIiRhY19jdl9oYXZlX2xjaGZsYWdzIiA9IGNyb3NzIDsgdGhlbgogICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJsY2hmbGFncyIgImFjX2N2X2Z1bmNfbGNoZmxhZ3MiCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfbGNoZmxhZ3MiID0geCIieWVzOyB0aGVuIDoKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19sY2hmbGFncyIgPSB4eWVzOyB0aGVuIDoKICAgYWNfY3ZfaGF2ZV9sY2hmbGFncz0ieWVzIgogZWxzZQogICBhY19jdl9oYXZlX2xjaGZsYWdzPSJubyIKQEAgLTEwMTk2LDcgKzEwODA4LDcgQEAKIAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgaW5mbGF0ZUNvcHkgaW4gLWx6IiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciBpbmZsYXRlQ29weSBpbiAtbHouLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfbGliX3pfaW5mbGF0ZUNvcHkrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9saWJfel9pbmZsYXRlQ29weSs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKQEAgLTEwMjMwLDcgKzEwODQyLDcgQEAKIGZpCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl96X2luZmxhdGVDb3B5IiA+JjUKICRhc19lY2hvICIkYWNfY3ZfbGliX3pfaW5mbGF0ZUNvcHkiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfel9pbmZsYXRlQ29weSIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9saWJfel9pbmZsYXRlQ29weSIgPSB4eWVzOyB0aGVuIDoKIAogJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9aTElCX0NPUFkgMSIgPj5jb25mZGVmcy5oCiAKQEAgLTEwMzczLDcgKzEwOTg1LDcgQEAKIGZvciBhY19mdW5jIGluIG9wZW5wdHkKIGRvIDoKICAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAib3BlbnB0eSIgImFjX2N2X2Z1bmNfb3BlbnB0eSIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19vcGVucHR5IiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfb3BlbnB0eSIgPSB4eWVzOyB0aGVuIDoKICAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgogI2RlZmluZSBIQVZFX09QRU5QVFkgMQogX0FDRU9GCkBAIC0xMDM4MSw3ICsxMDk5Myw3IEBACiBlbHNlCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIG9wZW5wdHkgaW4gLWx1dGlsIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciBvcGVucHR5IGluIC1sdXRpbC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfdXRpbF9vcGVucHR5K3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfbGliX3V0aWxfb3BlbnB0eSs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKQEAgLTEwNDE1LDEzICsxMTAyNywxMyBAQAogZmkKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3V0aWxfb3BlbnB0eSIgPiY1CiAkYXNfZWNobyAiJGFjX2N2X2xpYl91dGlsX29wZW5wdHkiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfdXRpbF9vcGVucHR5IiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl91dGlsX29wZW5wdHkiID0geHllczsgdGhlbiA6CiAgICRhc19lY2hvICIjZGVmaW5lIEhBVkVfT1BFTlBUWSAxIiA+PmNvbmZkZWZzLmgKICBMSUJTPSIkTElCUyAtbHV0aWwiCiBlbHNlCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIG9wZW5wdHkgaW4gLWxic2QiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIG9wZW5wdHkgaW4gLWxic2QuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfbGliX2JzZF9vcGVucHR5K3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfbGliX2JzZF9vcGVucHR5Kzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwpAQCAtMTA0NTUsNyArMTEwNjcsNyBAQAogZmkKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2JzZF9vcGVucHR5IiA+JjUKICRhc19lY2hvICIkYWNfY3ZfbGliX2JzZF9vcGVucHR5IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2JzZF9vcGVucHR5IiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9ic2Rfb3BlbnB0eSIgPSB4eWVzOyB0aGVuIDoKICAgJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9PUEVOUFRZIDEiID4+Y29uZmRlZnMuaAogIExJQlM9IiRMSUJTIC1sYnNkIgogZmkKQEAgLTEwNDcwLDcgKzExMDgyLDcgQEAKIGZvciBhY19mdW5jIGluIGZvcmtwdHkKIGRvIDoKICAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiZm9ya3B0eSIgImFjX2N2X2Z1bmNfZm9ya3B0eSIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19mb3JrcHR5IiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZm9ya3B0eSIgPSB4eWVzOyB0aGVuIDoKICAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgogI2RlZmluZSBIQVZFX0ZPUktQVFkgMQogX0FDRU9GCkBAIC0xMDQ3OCw3ICsxMTA5MCw3IEBACiBlbHNlCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGZvcmtwdHkgaW4gLWx1dGlsIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciBmb3JrcHR5IGluIC1sdXRpbC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfdXRpbF9mb3JrcHR5K3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfbGliX3V0aWxfZm9ya3B0eSs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKQEAgLTEwNTEyLDEzICsxMTEyNCwxMyBAQAogZmkKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3V0aWxfZm9ya3B0eSIgPiY1CiAkYXNfZWNobyAiJGFjX2N2X2xpYl91dGlsX2ZvcmtwdHkiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfdXRpbF9mb3JrcHR5IiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl91dGlsX2ZvcmtwdHkiID0geHllczsgdGhlbiA6CiAgICRhc19lY2hvICIjZGVmaW5lIEhBVkVfRk9SS1BUWSAxIiA+PmNvbmZkZWZzLmgKICBMSUJTPSIkTElCUyAtbHV0aWwiCiBlbHNlCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGZvcmtwdHkgaW4gLWxic2QiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGZvcmtwdHkgaW4gLWxic2QuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfbGliX2JzZF9mb3JrcHR5K3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfbGliX2JzZF9mb3JrcHR5Kzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwpAQCAtMTA1NTIsNyArMTExNjQsNyBAQAogZmkKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2JzZF9mb3JrcHR5IiA+JjUKICRhc19lY2hvICIkYWNfY3ZfbGliX2JzZF9mb3JrcHR5IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2JzZF9mb3JrcHR5IiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9ic2RfZm9ya3B0eSIgPSB4eWVzOyB0aGVuIDoKICAgJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9GT1JLUFRZIDEiID4+Y29uZmRlZnMuaAogIExJQlM9IiRMSUJTIC1sYnNkIgogZmkKQEAgLTEwNTY5LDcgKzExMTgxLDcgQEAKIGZvciBhY19mdW5jIGluIG1lbW1vdmUKIGRvIDoKICAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAibWVtbW92ZSIgImFjX2N2X2Z1bmNfbWVtbW92ZSIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19tZW1tb3ZlIiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfbWVtbW92ZSIgPSB4eWVzOyB0aGVuIDoKICAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgogI2RlZmluZSBIQVZFX01FTU1PVkUgMQogX0FDRU9GCkBAIC0xMDU5Myw3ICsxMTIwNSw3IEBACiAKIAogYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiZHVwMiIgImFjX2N2X2Z1bmNfZHVwMiIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19kdXAyIiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZHVwMiIgPSB4eWVzOyB0aGVuIDoKICAgJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9EVVAyIDEiID4+Y29uZmRlZnMuaAogCiBlbHNlCkBAIC0xMDYwNiw3ICsxMTIxOCw3IEBACiBmaQogCiBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJnZXRjd2QiICJhY19jdl9mdW5jX2dldGN3ZCIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXRjd2QiID0geCIieWVzOyB0aGVuIDoKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXRjd2QiID0geHllczsgdGhlbiA6CiAgICRhc19lY2hvICIjZGVmaW5lIEhBVkVfR0VUQ1dEIDEiID4+Y29uZmRlZnMuaAogCiBlbHNlCkBAIC0xMDYxOSw3ICsxMTIzMSw3IEBACiBmaQogCiBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJzdHJkdXAiICJhY19jdl9mdW5jX3N0cmR1cCIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19zdHJkdXAiID0geCIieWVzOyB0aGVuIDoKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19zdHJkdXAiID0geHllczsgdGhlbiA6CiAgICRhc19lY2hvICIjZGVmaW5lIEhBVkVfU1RSRFVQIDEiID4+Y29uZmRlZnMuaAogCiBlbHNlCkBAIC0xMDYzNSw3ICsxMTI0Nyw3IEBACiBmb3IgYWNfZnVuYyBpbiBnZXRwZ3JwCiBkbyA6CiAgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImdldHBncnAiICJhY19jdl9mdW5jX2dldHBncnAiCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZ2V0cGdycCIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9mdW5jX2dldHBncnAiID0geHllczsgdGhlbiA6CiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKICNkZWZpbmUgSEFWRV9HRVRQR1JQIDEKIF9BQ0VPRgpAQCAtMTA2NjMsNyArMTEyNzUsNyBAQAogZm9yIGFjX2Z1bmMgaW4gc2V0cGdycAogZG8gOgogICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJzZXRwZ3JwIiAiYWNfY3ZfZnVuY19zZXRwZ3JwIgotaWYgdGVzdCAieCRhY19jdl9mdW5jX3NldHBncnAiID0geCIieWVzOyB0aGVuIDoKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19zZXRwZ3JwIiA9IHh5ZXM7IHRoZW4gOgogICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIEhBVkVfU0VUUEdSUCAxCiBfQUNFT0YKQEAgLTEwNjkxLDcgKzExMzAzLDcgQEAKIGZvciBhY19mdW5jIGluIGdldHRpbWVvZmRheQogZG8gOgogICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJnZXR0aW1lb2ZkYXkiICJhY19jdl9mdW5jX2dldHRpbWVvZmRheSIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXR0aW1lb2ZkYXkiID0geCIieWVzOyB0aGVuIDoKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXR0aW1lb2ZkYXkiID0geHllczsgdGhlbiA6CiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKICNkZWZpbmUgSEFWRV9HRVRUSU1FT0ZEQVkgMQogX0FDRU9GCkBAIC0xMDc5MywxNSArMTE0MDUsMjEgQEAKIHRoZW4KICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBnZXRhZGRyaW5mbyBidWciID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZ2V0YWRkcmluZm8gYnVnLi4uICIgPiY2OyB9Ci0gIGlmIHRlc3QgIiR7YWNfY3ZfYnVnZ3lfZ2V0YWRkcmluZm8rc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBpZiAke2FjX2N2X2J1Z2d5X2dldGFkZHJpbmZvKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorCitpZiB0ZXN0ICIke2VuYWJsZV9pcHY2K3NldH0iID0gc2V0OyB0aGVuCisgIGFjX2N2X2J1Z2d5X2dldGFkZHJpbmZvPSJubyAtLSBjb25maWd1cmVkIHdpdGggLS0oZW58ZGlzKWFibGUtaXB2NiIKK2Vsc2UKICAgYWNfY3ZfYnVnZ3lfZ2V0YWRkcmluZm89eWVzCitmaQogZWxzZQogICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAKKyNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPG5ldGRiLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CkBAIC0xMDkyMiw3ICsxMTU0MCw3IEBACiBmb3IgYWNfZnVuYyBpbiBnZXRuYW1laW5mbwogZG8gOgogICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJnZXRuYW1laW5mbyIgImFjX2N2X2Z1bmNfZ2V0bmFtZWluZm8iCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZ2V0bmFtZWluZm8iID0geCIieWVzOyB0aGVuIDoKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXRuYW1laW5mbyIgPSB4eWVzOyB0aGVuIDoKICAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgogI2RlZmluZSBIQVZFX0dFVE5BTUVJTkZPIDEKIF9BQ0VPRgpAQCAtMTA5MzQsNyArMTE1NTIsNyBAQAogIyBjaGVja3MgZm9yIHN0cnVjdHVyZXMKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aW1lLmggYW5kIHN5cy90aW1lLmggbWF5IGJvdGggYmUgaW5jbHVkZWQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aW1lLmggYW5kIHN5cy90aW1lLmggbWF5IGJvdGggYmUgaW5jbHVkZWQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX3RpbWUrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9oZWFkZXJfdGltZSs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKQEAgLTEwOTY5LDcgKzExNTg3LDcgQEAKIAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHN0cnVjdCB0bSBpcyBpbiBzeXMvdGltZS5oIG9yIHRpbWUuaCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHN0cnVjdCB0bSBpcyBpbiBzeXMvdGltZS5oIG9yIHRpbWUuaC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9zdHJ1Y3RfdG0rc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9zdHJ1Y3RfdG0rOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CkBAIC0xMTAwNiw3ICsxMTYyNCw3IEBACiAjaW5jbHVkZSA8JGFjX2N2X3N0cnVjdF90bT4KIAogIgotaWYgdGVzdCAieCRhY19jdl9tZW1iZXJfc3RydWN0X3RtX3RtX3pvbmUiID0geCIieWVzOyB0aGVuIDoKK2lmIHRlc3QgIngkYWNfY3ZfbWVtYmVyX3N0cnVjdF90bV90bV96b25lIiA9IHh5ZXM7IHRoZW4gOgogCiBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIEhBVkVfU1RSVUNUX1RNX1RNX1pPTkUgMQpAQCAtMTEwMjIsNyArMTE2NDAsNyBAQAogZWxzZQogICBhY19mbl9jX2NoZWNrX2RlY2wgIiRMSU5FTk8iICJ0em5hbWUiICJhY19jdl9oYXZlX2RlY2xfdHpuYW1lIiAiI2luY2x1ZGUgPHRpbWUuaD4KICIKLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX3R6bmFtZSIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfdHpuYW1lIiA9IHh5ZXM7IHRoZW4gOgogICBhY19oYXZlX2RlY2w9MQogZWxzZQogICBhY19oYXZlX2RlY2w9MApAQCAtMTEwMzQsNyArMTE2NTIsNyBAQAogCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHR6bmFtZSIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgdHpuYW1lLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Zhcl90em5hbWUrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl92YXJfdHpuYW1lKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dApAQCAtMTEwNzAsNyArMTE2ODgsNyBAQAogZmkKIAogYWNfZm5fY19jaGVja19tZW1iZXIgIiRMSU5FTk8iICJzdHJ1Y3Qgc3RhdCIgInN0X3JkZXYiICJhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfcmRldiIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfcmRldiIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfcmRldiIgPSB4eWVzOyB0aGVuIDoKIAogY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgogI2RlZmluZSBIQVZFX1NUUlVDVF9TVEFUX1NUX1JERVYgMQpAQCAtMTEwODAsNyArMTE2OTgsNyBAQAogZmkKIAogYWNfZm5fY19jaGVja19tZW1iZXIgIiRMSU5FTk8iICJzdHJ1Y3Qgc3RhdCIgInN0X2Jsa3NpemUiICJhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfYmxrc2l6ZSIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfYmxrc2l6ZSIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfYmxrc2l6ZSIgPSB4eWVzOyB0aGVuIDoKIAogY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgogI2RlZmluZSBIQVZFX1NUUlVDVF9TVEFUX1NUX0JMS1NJWkUgMQpAQCAtMTEwOTAsNyArMTE3MDgsNyBAQAogZmkKIAogYWNfZm5fY19jaGVja19tZW1iZXIgIiRMSU5FTk8iICJzdHJ1Y3Qgc3RhdCIgInN0X2ZsYWdzIiAiYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2ZsYWdzIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9mbGFncyIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfZmxhZ3MiID0geHllczsgdGhlbiA6CiAKIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKICNkZWZpbmUgSEFWRV9TVFJVQ1RfU1RBVF9TVF9GTEFHUyAxCkBAIC0xMTEwMCw3ICsxMTcxOCw3IEBACiBmaQogCiBhY19mbl9jX2NoZWNrX21lbWJlciAiJExJTkVOTyIgInN0cnVjdCBzdGF0IiAic3RfZ2VuIiAiYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2dlbiIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfZ2VuIiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9nZW4iID0geHllczsgdGhlbiA6CiAKIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKICNkZWZpbmUgSEFWRV9TVFJVQ1RfU1RBVF9TVF9HRU4gMQpAQCAtMTExMTAsNyArMTE3MjgsNyBAQAogZmkKIAogYWNfZm5fY19jaGVja19tZW1iZXIgIiRMSU5FTk8iICJzdHJ1Y3Qgc3RhdCIgInN0X2JpcnRodGltZSIgImFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9iaXJ0aHRpbWUiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2JpcnRodGltZSIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfYmlydGh0aW1lIiA9IHh5ZXM7IHRoZW4gOgogCiBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIEhBVkVfU1RSVUNUX1NUQVRfU1RfQklSVEhUSU1FIDEKQEAgLTExMTIwLDcgKzExNzM4LDcgQEAKIGZpCiAKIGFjX2ZuX2NfY2hlY2tfbWVtYmVyICIkTElORU5PIiAic3RydWN0IHN0YXQiICJzdF9ibG9ja3MiICJhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfYmxvY2tzIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9ibG9ja3MiID0geCIieWVzOyB0aGVuIDoKK2lmIHRlc3QgIngkYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2Jsb2NrcyIgPSB4eWVzOyB0aGVuIDoKIAogY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgogI2RlZmluZSBIQVZFX1NUUlVDVF9TVEFUX1NUX0JMT0NLUyAxCkBAIC0xMTE0Miw3ICsxMTc2MCw3IEBACiAKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHRpbWUuaCB0aGF0IGRlZmluZXMgYWx0em9uZSIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgdGltZS5oIHRoYXQgZGVmaW5lcyBhbHR6b25lLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl90aW1lX2FsdHpvbmUrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9oZWFkZXJfdGltZV9hbHR6b25lKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKIApAQCAtMTEyMDYsNyArMTE4MjQsNyBAQAogCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhZGRyaW5mbyIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgYWRkcmluZm8uLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zfc3RydWN0X2FkZHJpbmZvK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3Zfc3RydWN0X2FkZHJpbmZvKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dApAQCAtMTEyMzgsNyArMTE4NTYsNyBAQAogCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzb2NrYWRkcl9zdG9yYWdlIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciBzb2NrYWRkcl9zdG9yYWdlLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3N0cnVjdF9zb2NrYWRkcl9zdG9yYWdlK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3Zfc3RydWN0X3NvY2thZGRyX3N0b3JhZ2UrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CkBAIC0xMTI3NCw3ICsxMTg5Miw3IEBACiAKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBjaGFyIGlzIHVuc2lnbmVkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgY2hhciBpcyB1bnNpZ25lZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9jX2NoYXJfdW5zaWduZWQrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9jX2NoYXJfdW5zaWduZWQrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CkBAIC0xMTI4NCw3ICsxMTkwMiw4IEBACiBtYWluICgpCiB7CiBzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGNoYXIpIC0xKSA8IDApXTsKLXRlc3RfYXJyYXkgWzBdID0gMAordGVzdF9hcnJheSBbMF0gPSAwOworcmV0dXJuIHRlc3RfYXJyYXkgWzBdOwogCiAgIDsKICAgcmV0dXJuIDA7CkBAIC0xMTMwNiw3ICsxMTkyNSw3IEBACiAKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGFuIEFOU0kgQy1jb25mb3JtaW5nIGNvbnN0IiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciBhbiBBTlNJIEMtY29uZm9ybWluZyBjb25zdC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9jX2NvbnN0K3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfY19jb25zdCs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKQEAgLTExMzE1LDExICsxMTkzNCwxMSBAQAogaW50CiBtYWluICgpCiB7Ci0vKiBGSVhNRTogSW5jbHVkZSB0aGUgY29tbWVudHMgc3VnZ2VzdGVkIGJ5IFBhdWwuICovCisKICNpZm5kZWYgX19jcGx1c3BsdXMKLSAgLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KKyAgLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzIHNvcnQgb2YgdGhpbmcuICAqLwogICB0eXBlZGVmIGludCBjaGFyc2V0WzJdOwotICBjb25zdCBjaGFyc2V0IGNzOworICBjb25zdCBjaGFyc2V0IGNzID0geyAwLCAwIH07CiAgIC8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCiAgIGNoYXIgY29uc3QgKmNvbnN0ICpwY3BjYzsKICAgY2hhciAqKnBwYzsKQEAgLTExMzM2LDggKzExOTU1LDkgQEAKICAgKytwY3BjYzsKICAgcHBjID0gKGNoYXIqKikgcGNwY2M7CiAgIHBjcGNjID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHBwYzsKLSAgeyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLSAgICBjaGFyICp0OworICB7IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMgc29ydCBvZiB0aGluZy4gICovCisgICAgY2hhciB0eDsKKyAgICBjaGFyICp0ID0gJnR4OwogICAgIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7CiAKICAgICAqdCsrID0gMDsKQEAgLTExMzUzLDEwICsxMTk3MywxMCBAQAogICAgIGlwdHIgcCA9IDA7CiAgICAgKytwOwogICB9Ci0gIHsgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZworICB7IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzb3J0IG9mIHRoaW5nLCBzYXlpbmcKICAgICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCi0gICAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7CisgICAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfSBieDsKKyAgICBzdHJ1Y3QgcyAqYiA9ICZieDsgYi0+aiA9IDU7CiAgIH0KICAgeyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KICAgICBjb25zdCBpbnQgZm9vID0gMTA7CkBAIC0xMTU5NCw3ICsxMjIxNCw3IEBACiAKIAogYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiZ2V0aG9zdGJ5bmFtZV9yIiAiYWNfY3ZfZnVuY19nZXRob3N0YnluYW1lX3IiCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZ2V0aG9zdGJ5bmFtZV9yIiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZ2V0aG9zdGJ5bmFtZV9yIiA9IHh5ZXM7IHRoZW4gOgogCiAgICRhc19lY2hvICIjZGVmaW5lIEhBVkVfR0VUSE9TVEJZTkFNRV9SIDEiID4+Y29uZmRlZnMuaAogCkBAIC0xMTcyNSw3ICsxMjM0NSw3IEBACiAgIGZvciBhY19mdW5jIGluIGdldGhvc3RieW5hbWUKIGRvIDoKICAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiZ2V0aG9zdGJ5bmFtZSIgImFjX2N2X2Z1bmNfZ2V0aG9zdGJ5bmFtZSIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXRob3N0YnluYW1lIiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZ2V0aG9zdGJ5bmFtZSIgPSB4eWVzOyB0aGVuIDoKICAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgogI2RlZmluZSBIQVZFX0dFVEhPU1RCWU5BTUUgMQogX0FDRU9GCkBAIC0xMTc0NywxMiArMTIzNjcsMTIgQEAKIAogIyBMaW51eCByZXF1aXJlcyB0aGlzIGZvciBjb3JyZWN0IGYucC4gb3BlcmF0aW9ucwogYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiX19mcHVfY29udHJvbCIgImFjX2N2X2Z1bmNfX19mcHVfY29udHJvbCIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19fX2ZwdV9jb250cm9sIiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfX19mcHVfY29udHJvbCIgPSB4eWVzOyB0aGVuIDoKIAogZWxzZQogICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBfX2ZwdV9jb250cm9sIGluIC1saWVlZSIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgX19mcHVfY29udHJvbCBpbiAtbGllZWUuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfbGliX2llZWVfX19mcHVfY29udHJvbCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X2xpYl9pZWVlX19fZnB1X2NvbnRyb2wrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCkBAIC0xMTc4Niw3ICsxMjQwNiw3IEBACiBmaQogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfaWVlZV9fX2ZwdV9jb250cm9sIiA+JjUKICRhc19lY2hvICIkYWNfY3ZfbGliX2llZWVfX19mcHVfY29udHJvbCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9pZWVlX19fZnB1X2NvbnRyb2wiID0geCIieWVzOyB0aGVuIDoKK2lmIHRlc3QgIngkYWNfY3ZfbGliX2llZWVfX19mcHVfY29udHJvbCIgPSB4eWVzOyB0aGVuIDoKICAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgogI2RlZmluZSBIQVZFX0xJQklFRUUgMQogX0FDRU9GCkBAIC0xMTg4MSw3ICsxMjUwMSw3IEBACiAKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBDIGRvdWJsZXMgYXJlIGxpdHRsZS1lbmRpYW4gSUVFRSA3NTQgYmluYXJ5NjQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBDIGRvdWJsZXMgYXJlIGxpdHRsZS1lbmRpYW4gSUVFRSA3NTQgYmluYXJ5NjQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfbGl0dGxlX2VuZGlhbl9kb3VibGUrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9saXR0bGVfZW5kaWFuX2RvdWJsZSs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAKQEAgLTExOTIzLDcgKzEyNTQzLDcgQEAKIAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIEMgZG91YmxlcyBhcmUgYmlnLWVuZGlhbiBJRUVFIDc1NCBiaW5hcnk2NCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIEMgZG91YmxlcyBhcmUgYmlnLWVuZGlhbiBJRUVFIDc1NCBiaW5hcnk2NC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9iaWdfZW5kaWFuX2RvdWJsZStzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X2JpZ19lbmRpYW5fZG91YmxlKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKIApAQCAtMTE5NjksNyArMTI1ODksNyBAQAogIyBjb252ZXJzaW9ucyB3b3JrLgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIEMgZG91YmxlcyBhcmUgQVJNIG1peGVkLWVuZGlhbiBJRUVFIDc1NCBiaW5hcnk2NCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIEMgZG91YmxlcyBhcmUgQVJNIG1peGVkLWVuZGlhbiBJRUVFIDc1NCBiaW5hcnk2NC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9taXhlZF9lbmRpYW5fZG91YmxlK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfbWl4ZWRfZW5kaWFuX2RvdWJsZSs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAKQEAgLTEyMTE3LDcgKzEyNzM3LDcgQEAKICMgLTAuIG9uIHNvbWUgYXJjaGl0ZWN0dXJlcy4KIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0YW5oIHByZXNlcnZlcyB0aGUgc2lnbiBvZiB6ZXJvIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGFuaCBwcmVzZXJ2ZXMgdGhlIHNpZ24gb2YgemVyby4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl90YW5oX3ByZXNlcnZlc196ZXJvX3NpZ24rc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl90YW5oX3ByZXNlcnZlc196ZXJvX3NpZ24rOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogCkBAIC0xMjE4NSw3ICsxMjgwNSw3IEBACiAKIGFjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgImlzaW5mIiAiYWNfY3ZfaGF2ZV9kZWNsX2lzaW5mIiAiI2luY2x1ZGUgPG1hdGguaD4KICIKLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX2lzaW5mIiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9pc2luZiIgPSB4eWVzOyB0aGVuIDoKICAgYWNfaGF2ZV9kZWNsPTEKIGVsc2UKICAgYWNfaGF2ZV9kZWNsPTAKQEAgLTEyMTk2LDcgKzEyODE2LDcgQEAKIF9BQ0VPRgogYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiaXNuYW4iICJhY19jdl9oYXZlX2RlY2xfaXNuYW4iICIjaW5jbHVkZSA8bWF0aC5oPgogIgotaWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfaXNuYW4iID0geCIieWVzOyB0aGVuIDoKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX2lzbmFuIiA9IHh5ZXM7IHRoZW4gOgogICBhY19oYXZlX2RlY2w9MQogZWxzZQogICBhY19oYXZlX2RlY2w9MApAQCAtMTIyMDcsNyArMTI4MjcsNyBAQAogX0FDRU9GCiBhY19mbl9jX2NoZWNrX2RlY2wgIiRMSU5FTk8iICJpc2Zpbml0ZSIgImFjX2N2X2hhdmVfZGVjbF9pc2Zpbml0ZSIgIiNpbmNsdWRlIDxtYXRoLmg+CiAiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9pc2Zpbml0ZSIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfaXNmaW5pdGUiID0geHllczsgdGhlbiA6CiAgIGFjX2hhdmVfZGVjbD0xCiBlbHNlCiAgIGFjX2hhdmVfZGVjbD0wCkBAIC0xMjIyNyw3ICsxMjg0Nyw3IEBACiAjIHNlbV9vcGVuIHJlc3VsdHMgaW4gYSAnU2lnbmFsIDEyJyBlcnJvci4KIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBQT1NJWCBzZW1hcGhvcmVzIGFyZSBlbmFibGVkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgUE9TSVggc2VtYXBob3JlcyBhcmUgZW5hYmxlZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wb3NpeF9zZW1hcGhvcmVzX2VuYWJsZWQrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9wb3NpeF9zZW1hcGhvcmVzX2VuYWJsZWQrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CkBAIC0xMjI3OCw3ICsxMjg5OCw3IEBACiAjIE11bHRpcHJvY2Vzc2luZyBjaGVjayBmb3IgYnJva2VuIHNlbV9nZXR2YWx1ZQogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYnJva2VuIHNlbV9nZXR2YWx1ZSIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgYnJva2VuIHNlbV9nZXR2YWx1ZS4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9icm9rZW5fc2VtX2dldHZhbHVlK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfYnJva2VuX3NlbV9nZXR2YWx1ZSs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKQEAgLTEyMzQzLDcgKzEyOTYzLDcgQEAKIDE1fDMwKQogICA7OwogKikKLSAgYXNfZm5fZXJyb3IgJD8gImJhZCB2YWx1ZSAkZW5hYmxlX2JpZ19kaWdpdHMgZm9yIC0tZW5hYmxlLWJpZy1kaWdpdHM7IHZhbHVlIHNob3VsZCBiZSAxNSBvciAzMCIgIiRMSU5FTk8iIDUgIDs7CisgIGFzX2ZuX2Vycm9yICQ/ICJiYWQgdmFsdWUgJGVuYWJsZV9iaWdfZGlnaXRzIGZvciAtLWVuYWJsZS1iaWctZGlnaXRzOyB2YWx1ZSBzaG91bGQgYmUgMTUgb3IgMzAiICIkTElORU5PIiA1IDs7CiBlc2FjCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGVuYWJsZV9iaWdfZGlnaXRzIiA+JjUKICRhc19lY2hvICIkZW5hYmxlX2JpZ19kaWdpdHMiID4mNjsgfQpAQCAtMTIzNjEsNyArMTI5ODEsNyBAQAogCiAjIGNoZWNrIGZvciB3Y2hhci5oCiBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAid2NoYXIuaCIgImFjX2N2X2hlYWRlcl93Y2hhcl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl93Y2hhcl9oIiA9IHgiInllczsgdGhlbiA6CitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl93Y2hhcl9oIiA9IHh5ZXM7IHRoZW4gOgogCiAKICRhc19lY2hvICIjZGVmaW5lIEhBVkVfV0NIQVJfSCAxIiA+PmNvbmZkZWZzLmgKQEAgLTEyMzg0LDcgKzEzMDA0LDcgQEAKICMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2Ygd2NoYXJfdCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBzaXplIG9mIHdjaGFyX3QuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX3djaGFyX3Qrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9zaXplb2Zfd2NoYXJfdCs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIGFjX2ZuX2NfY29tcHV0ZV9pbnQgIiRMSU5FTk8iICIobG9uZyBpbnQpIChzaXplb2YgKHdjaGFyX3QpKSIgImFjX2N2X3NpemVvZl93Y2hhcl90IiAgICAgICAgIiNpbmNsdWRlIDx3Y2hhci5oPgpAQCAtMTIzOTUsNyArMTMwMTUsNyBAQAogICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KIGFzX2ZuX2Vycm9yIDc3ICJjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHdjaGFyX3QpCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNSA7IH0KK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CiAgICBlbHNlCiAgICAgIGFjX2N2X3NpemVvZl93Y2hhcl90PTAKICAgIGZpCkBAIC0xMjQ1MCw3ICsxMzA3MCw3IEBACiAgICMgY2hlY2sgd2hldGhlciB3Y2hhcl90IGlzIHNpZ25lZCBvciBub3QKICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdjaGFyX3QgaXMgc2lnbmVkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2NoYXJfdCBpcyBzaWduZWQuLi4gIiA+JjY7IH0KLSAgaWYgdGVzdCAiJHthY19jdl93Y2hhcl90X3NpZ25lZCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIGlmICR7YWNfY3Zfd2NoYXJfdF9zaWduZWQrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogCkBAIC0xMjUxNCw3ICsxMzEzNCw4IEBACiAgICAgICAkYXNfZWNobyAiI2RlZmluZSBQeV9VTklDT0RFX1NJWkUgNCIgPj5jb25mZGVmcy5oCiAKICAgICAgIDs7Ci0qKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB2YWx1ZSBmb3IgLS1lbmFibGUtdW5pY29kZS4gVXNlIGVpdGhlciB1Y3MyIG9yIHVjczQgKGxvd2VyY2FzZSkuIiAiJExJTkVOTyIgNSAgOzsKK25vKSAgIDs7ICAgICAgIyBUbyBhbGxvdyAtLWRpc2FibGUtdW5pY29kZQorKikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFsdWUgZm9yIC0tZW5hYmxlLXVuaWNvZGUuIFVzZSBlaXRoZXIgdWNzMiBvciB1Y3M0IChsb3dlcmNhc2UpLiIgIiRMSU5FTk8iIDUgOzsKIGVzYWMKIAogCkBAIC0xMjU2MSw3ICsxMzE4Miw3IEBACiAjIGNoZWNrIGZvciBlbmRpYW5uZXNzCiAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4uLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfY19iaWdlbmRpYW4rc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9jX2JpZ2VuZGlhbis6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGFjX2N2X2NfYmlnZW5kaWFuPXVua25vd24KQEAgLTEyNzgwLDcgKzEzNDAxLDcgQEAKICAgICAgOzsgIygKICAgICopCiAgICAgIGFzX2ZuX2Vycm9yICQ/ICJ1bmtub3duIGVuZGlhbm5lc3MKLSBwcmVzZXR0aW5nIGFjX2N2X2NfYmlnZW5kaWFuPW5vIChvciB5ZXMpIHdpbGwgaGVscCIgIiRMSU5FTk8iIDUgIDs7CisgcHJlc2V0dGluZyBhY19jdl9jX2JpZ2VuZGlhbj1ubyAob3IgeWVzKSB3aWxsIGhlbHAiICIkTElORU5PIiA1IDs7CiAgZXNhYwogCiAKQEAgLTEyNzg4LDcgKzEzNDA5LDcgQEAKICMgb3IgZmlsbHMgd2l0aCB6ZXJvcyAobGlrZSB0aGUgQ3JheSBKOTAsIGFjY29yZGluZyB0byBUaW0gUGV0ZXJzKS4KIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciByaWdodCBzaGlmdCBleHRlbmRzIHRoZSBzaWduIGJpdCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHJpZ2h0IHNoaWZ0IGV4dGVuZHMgdGhlIHNpZ24gYml0Li4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3JzaGlmdF9leHRlbmRzX3NpZ24rc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9yc2hpZnRfZXh0ZW5kc19zaWduKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKIApAQCAtMTI4MjcsNyArMTM0NDgsNyBAQAogIyBjaGVjayBmb3IgZ2V0Y191bmxvY2tlZCBhbmQgcmVsYXRlZCBsb2NraW5nIGZ1bmN0aW9ucwogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ2V0Y191bmxvY2tlZCgpIGFuZCBmcmllbmRzIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciBnZXRjX3VubG9ja2VkKCkgYW5kIGZyaWVuZHMuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfaGF2ZV9nZXRjX3VubG9ja2VkK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfaGF2ZV9nZXRjX3VubG9ja2VkKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKIApAQCAtMTI5MjUsNyArMTM1NDYsNyBAQAogIyBjaGVjayBmb3IgcmVhZGxpbmUgMi4xCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBybF9jYWxsYmFja19oYW5kbGVyX2luc3RhbGwgaW4gLWxyZWFkbGluZSIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgcmxfY2FsbGJhY2tfaGFuZGxlcl9pbnN0YWxsIGluIC1scmVhZGxpbmUuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfbGliX3JlYWRsaW5lX3JsX2NhbGxiYWNrX2hhbmRsZXJfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X2xpYl9yZWFkbGluZV9ybF9jYWxsYmFja19oYW5kbGVyX2luc3RhbGwrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCkBAIC0xMjk1OSw3ICsxMzU4MCw3IEBACiBmaQogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfcmVhZGxpbmVfcmxfY2FsbGJhY2tfaGFuZGxlcl9pbnN0YWxsIiA+JjUKICRhc19lY2hvICIkYWNfY3ZfbGliX3JlYWRsaW5lX3JsX2NhbGxiYWNrX2hhbmRsZXJfaW5zdGFsbCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9yZWFkbGluZV9ybF9jYWxsYmFja19oYW5kbGVyX2luc3RhbGwiID0geCIieWVzOyB0aGVuIDoKK2lmIHRlc3QgIngkYWNfY3ZfbGliX3JlYWRsaW5lX3JsX2NhbGxiYWNrX2hhbmRsZXJfaW5zdGFsbCIgPSB4eWVzOyB0aGVuIDoKIAogJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9STF9DQUxMQkFDSyAxIiA+PmNvbmZkZWZzLmgKIApAQCAtMTMwMTEsNyArMTM2MzIsNyBAQAogIyBjaGVjayBmb3IgcmVhZGxpbmUgNC4wCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBybF9wcmVfaW5wdXRfaG9vayBpbiAtbHJlYWRsaW5lIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciBybF9wcmVfaW5wdXRfaG9vayBpbiAtbHJlYWRsaW5lLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2xpYl9yZWFkbGluZV9ybF9wcmVfaW5wdXRfaG9vaytzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X2xpYl9yZWFkbGluZV9ybF9wcmVfaW5wdXRfaG9vays6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKQEAgLTEzMDQ1LDcgKzEzNjY2LDcgQEAKIGZpCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9yZWFkbGluZV9ybF9wcmVfaW5wdXRfaG9vayIgPiY1CiAkYXNfZWNobyAiJGFjX2N2X2xpYl9yZWFkbGluZV9ybF9wcmVfaW5wdXRfaG9vayIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9yZWFkbGluZV9ybF9wcmVfaW5wdXRfaG9vayIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9saWJfcmVhZGxpbmVfcmxfcHJlX2lucHV0X2hvb2siID0geHllczsgdGhlbiA6CiAKICRhc19lY2hvICIjZGVmaW5lIEhBVkVfUkxfUFJFX0lOUFVUX0hPT0sgMSIgPj5jb25mZGVmcy5oCiAKQEAgLTEzMDU1LDcgKzEzNjc2LDcgQEAKICMgYWxzbyBpbiA0LjAKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHJsX2NvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2sgaW4gLWxyZWFkbGluZSIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgcmxfY29tcGxldGlvbl9kaXNwbGF5X21hdGNoZXNfaG9vayBpbiAtbHJlYWRsaW5lLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2xpYl9yZWFkbGluZV9ybF9jb21wbGV0aW9uX2Rpc3BsYXlfbWF0Y2hlc19ob29rK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfbGliX3JlYWRsaW5lX3JsX2NvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2srOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCkBAIC0xMzA4OSw3ICsxMzcxMCw3IEBACiBmaQogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfcmVhZGxpbmVfcmxfY29tcGxldGlvbl9kaXNwbGF5X21hdGNoZXNfaG9vayIgPiY1CiAkYXNfZWNobyAiJGFjX2N2X2xpYl9yZWFkbGluZV9ybF9jb21wbGV0aW9uX2Rpc3BsYXlfbWF0Y2hlc19ob29rIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3JlYWRsaW5lX3JsX2NvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2siID0geCIieWVzOyB0aGVuIDoKK2lmIHRlc3QgIngkYWNfY3ZfbGliX3JlYWRsaW5lX3JsX2NvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2siID0geHllczsgdGhlbiA6CiAKICRhc19lY2hvICIjZGVmaW5lIEhBVkVfUkxfQ09NUExFVElPTl9ESVNQTEFZX01BVENIRVNfSE9PSyAxIiA+PmNvbmZkZWZzLmgKIApAQCAtMTMwOTksNyArMTM3MjAsNyBAQAogIyBjaGVjayBmb3IgcmVhZGxpbmUgNC4yCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBybF9jb21wbGV0aW9uX21hdGNoZXMgaW4gLWxyZWFkbGluZSIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgcmxfY29tcGxldGlvbl9tYXRjaGVzIGluIC1scmVhZGxpbmUuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfbGliX3JlYWRsaW5lX3JsX2NvbXBsZXRpb25fbWF0Y2hlcytzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X2xpYl9yZWFkbGluZV9ybF9jb21wbGV0aW9uX21hdGNoZXMrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCkBAIC0xMzEzMyw3ICsxMzc1NCw3IEBACiBmaQogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfcmVhZGxpbmVfcmxfY29tcGxldGlvbl9tYXRjaGVzIiA+JjUKICRhc19lY2hvICIkYWNfY3ZfbGliX3JlYWRsaW5lX3JsX2NvbXBsZXRpb25fbWF0Y2hlcyIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9yZWFkbGluZV9ybF9jb21wbGV0aW9uX21hdGNoZXMiID0geCIieWVzOyB0aGVuIDoKK2lmIHRlc3QgIngkYWNfY3ZfbGliX3JlYWRsaW5lX3JsX2NvbXBsZXRpb25fbWF0Y2hlcyIgPSB4eWVzOyB0aGVuIDoKIAogJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9STF9DT01QTEVUSU9OX01BVENIRVMgMSIgPj5jb25mZGVmcy5oCiAKQEAgLTEzMTc0LDcgKzEzNzk1LDcgQEAKIAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYnJva2VuIG5pY2UoKSIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgYnJva2VuIG5pY2UoKS4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9icm9rZW5fbmljZStzZXR9IiA9IHNldDsgdGhlbiA6CitpZiAke2FjX2N2X2Jyb2tlbl9uaWNlKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKIApAQCAtMTMyMTUsNyArMTM4MzYsNyBAQAogCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBicm9rZW4gcG9sbCgpIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciBicm9rZW4gcG9sbCgpLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2Jyb2tlbl9wb2xsK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfYnJva2VuX3BvbGwrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CkBAIC0xMzI3MCw3ICsxMzg5MSw3IEBACiAjaW5jbHVkZSA8JGFjX2N2X3N0cnVjdF90bT4KIAogIgotaWYgdGVzdCAieCRhY19jdl9tZW1iZXJfc3RydWN0X3RtX3RtX3pvbmUiID0geCIieWVzOyB0aGVuIDoKK2lmIHRlc3QgIngkYWNfY3ZfbWVtYmVyX3N0cnVjdF90bV90bV96b25lIiA9IHh5ZXM7IHRoZW4gOgogCiBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIEhBVkVfU1RSVUNUX1RNX1RNX1pPTkUgMQpAQCAtMTMyODYsNyArMTM5MDcsNyBAQAogZWxzZQogICBhY19mbl9jX2NoZWNrX2RlY2wgIiRMSU5FTk8iICJ0em5hbWUiICJhY19jdl9oYXZlX2RlY2xfdHpuYW1lIiAiI2luY2x1ZGUgPHRpbWUuaD4KICIKLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX3R6bmFtZSIgPSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfdHpuYW1lIiA9IHh5ZXM7IHRoZW4gOgogICBhY19oYXZlX2RlY2w9MQogZWxzZQogICBhY19oYXZlX2RlY2w9MApAQCAtMTMyOTgsNyArMTM5MTksNyBAQAogCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHR6bmFtZSIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgdHpuYW1lLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Zhcl90em5hbWUrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl92YXJfdHpuYW1lKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dApAQCAtMTMzMzcsNyArMTM5NTgsNyBAQAogIyBjaGVjayB0enNldCgzKSBleGlzdHMgYW5kIHdvcmtzIGxpa2Ugd2UgZXhwZWN0IGl0IHRvCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB3b3JraW5nIHR6c2V0KCkiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgdHpzZXQoKS4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl93b3JraW5nX3R6c2V0K3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3Zfd29ya2luZ190enNldCs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAKQEAgLTEzNDM0LDcgKzE0MDU1LDcgQEAKICMgTG9vayBmb3Igc3Vic2Vjb25kIHRpbWVzdGFtcHMgaW4gc3RydWN0IHN0YXQKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHR2X25zZWMgaW4gc3RydWN0IHN0YXQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHR2X25zZWMgaW4gc3RydWN0IHN0YXQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zfc3RhdF90dl9uc2VjK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3Zfc3RhdF90dl9uc2VjKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dApAQCAtMTM0NzEsNyArMTQwOTIsNyBAQAogIyBMb29rIGZvciBCU0Qgc3R5bGUgc3Vic2Vjb25kIHRpbWVzdGFtcHMgaW4gc3RydWN0IHN0YXQKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHR2X25zZWMyIGluIHN0cnVjdCBzdGF0IiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciB0dl9uc2VjMiBpbiBzdHJ1Y3Qgc3RhdC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9zdGF0X3R2X25zZWMyK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3Zfc3RhdF90dl9uc2VjMis6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKQEAgLTEzNTA1LDEwICsxNDEyNiw0NyBAQAogCiBmaQogCisjIGZpcnN0IGN1cnNlcyBjb25maWd1cmUgY2hlY2sKK2FjX3NhdmVfY3BwZmxhZ3M9IiRDUFBGTEFHUyIKK0NQUEZMQUdTPSIkQ1BQRkxBR1MgLUkvdXNyL2luY2x1ZGUvbmN1cnNlc3ciCisKK2ZvciBhY19oZWFkZXIgaW4gY3Vyc2VzLmggbmN1cnNlcy5oCitkbyA6CisgIGFzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFzX2FjX0hlYWRlciIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY19IZWFkZXIiXCIgPSB4InllcyI7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworIyBPbiBTb2xhcmlzLCB0ZXJtLmggcmVxdWlyZXMgY3Vyc2VzLmgKK2ZvciBhY19oZWFkZXIgaW4gdGVybS5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICJ0ZXJtLmgiICJhY19jdl9oZWFkZXJfdGVybV9oIiAiCisjaWZkZWYgSEFWRV9DVVJTRVNfSAorI2luY2x1ZGUgPGN1cnNlcy5oPgorI2VuZGlmCisKKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3Rlcm1faCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1RFUk1fSCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisKICMgT24gSFAvVVggMTEuMCwgbXZ3ZGVsY2ggaXMgYSBibG9jayB3aXRoIGEgcmV0dXJuIHN0YXRlbWVudAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIG12d2RlbGNoIGlzIGFuIGV4cHJlc3Npb24iID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBtdndkZWxjaCBpcyBhbiBleHByZXNzaW9uLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X212d2RlbGNoX2lzX2V4cHJlc3Npb24rc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgJHthY19jdl9tdndkZWxjaF9pc19leHByZXNzaW9uKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dApAQCAtMTM1NDUsNyArMTQyMDMsNyBAQAogCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgV0lORE9XIGhhcyBfZmxhZ3MiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBXSU5ET1cgaGFzIF9mbGFncy4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl93aW5kb3dfaGFzX2ZsYWdzK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3Zfd2luZG93X2hhc19mbGFncys6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKQEAgLTEzNjU4LDQ2ICsxNDMxNiwxMTYgQEAKIAogZmkKIHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorIyBsYXN0IGN1cnNlcyBjb25maWd1cmUgY2hlY2sKK0NQUEZMQUdTPSRhY19zYXZlX2NwcGZsYWdzCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRldmljZSBmaWxlcyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBjaGVja2luZyBmb3IgZGV2aWNlIGZpbGVzIiA+JjY7fQorCitpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSB4eWVzOyB0aGVuCisgIGlmIHRlc3QgIiR7YWNfY3ZfZmlsZV9fZGV2X3B0bXgrc2V0fSIgIT0gc2V0OyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgL2Rldi9wdG14IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAvZGV2L3B0bXguLi4gIiA+JjY7IH0KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm90IHNldCIgPiY1CiskYXNfZWNobyAibm90IHNldCIgPiY2OyB9CisgICAgYXNfZm5fZXJyb3IgJD8gInNldCBhY19jdl9maWxlX19kZXZfcHRteCB0byB5ZXMvbm8gaW4geW91ciBDT05GSUdfU0lURSBmaWxlIHdoZW4gY3Jvc3MgY29tcGlsaW5nIiAiJExJTkVOTyIgNQorICBmaQorICBpZiB0ZXN0ICIke2FjX2N2X2ZpbGVfX2Rldl9wdGMrc2V0fSIgIT0gc2V0OyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgL2Rldi9wdGMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIC9kZXYvcHRjLi4uICIgPiY2OyB9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vdCBzZXQiID4mNQorJGFzX2VjaG8gIm5vdCBzZXQiID4mNjsgfQorICAgIGFzX2ZuX2Vycm9yICQ/ICJzZXQgYWNfY3ZfZmlsZV9fZGV2X3B0YyB0byB5ZXMvbm8gaW4geW91ciBDT05GSUdfU0lURSBmaWxlIHdoZW4gY3Jvc3MgY29tcGlsaW5nIiAiJExJTkVOTyIgNQorICBmaQorZmkKIAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgL2Rldi9wdG14IiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAvZGV2L3B0bXguLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfZmlsZV9fZGV2X3B0bXgrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyAmJgorICBhc19mbl9lcnJvciAkPyAiY2Fubm90IGNoZWNrIGZvciBmaWxlIGV4aXN0ZW5jZSB3aGVuIGNyb3NzIGNvbXBpbGluZyIgIiRMSU5FTk8iIDUKK2lmIHRlc3QgLXIgIi9kZXYvcHRteCI7IHRoZW4KKyAgYWNfY3ZfZmlsZV9fZGV2X3B0bXg9eWVzCitlbHNlCisgIGFjX2N2X2ZpbGVfX2Rldl9wdG14PW5vCitmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZmlsZV9fZGV2X3B0bXgiID4mNQorJGFzX2VjaG8gIiRhY19jdl9maWxlX19kZXZfcHRteCIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2ZpbGVfX2Rldl9wdG14IiA9IHh5ZXM7IHRoZW4gOgogCi1pZiB0ZXN0IC1yIC9kZXYvcHRteAotdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQorZmkKKworaWYgdGVzdCAieCRhY19jdl9maWxlX19kZXZfcHRteCIgPSB4eWVzOyB0aGVuCiAKICRhc19lY2hvICIjZGVmaW5lIEhBVkVfREVWX1BUTVggMSIgPj5jb25mZGVmcy5oCiAKLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9CiBmaQotCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAvZGV2L3B0YyIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgL2Rldi9wdGMuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfZmlsZV9fZGV2X3B0Yys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzICYmCisgIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY2hlY2sgZm9yIGZpbGUgZXhpc3RlbmNlIHdoZW4gY3Jvc3MgY29tcGlsaW5nIiAiJExJTkVOTyIgNQoraWYgdGVzdCAtciAiL2Rldi9wdGMiOyB0aGVuCisgIGFjX2N2X2ZpbGVfX2Rldl9wdGM9eWVzCitlbHNlCisgIGFjX2N2X2ZpbGVfX2Rldl9wdGM9bm8KK2ZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9maWxlX19kZXZfcHRjIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfZmlsZV9fZGV2X3B0YyIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2ZpbGVfX2Rldl9wdGMiID0geHllczsgdGhlbiA6CiAKLWlmIHRlc3QgLXIgL2Rldi9wdGMKLXRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KK2ZpCisKK2lmIHRlc3QgIngkYWNfY3ZfZmlsZV9fZGV2X3B0YyIgPSB4eWVzOyB0aGVuCiAKICRhc19lY2hvICIjZGVmaW5lIEhBVkVfREVWX1BUQyAxIiA+PmNvbmZkZWZzLmgKIAotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KIGZpCiAKIGlmIHRlc3QgIiRoYXZlX2xvbmdfbG9uZyIgPSB5ZXMKIHRoZW4KICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJWxsZCBhbmQgJWxsdSBwcmludGYoKSBmb3JtYXQgc3VwcG9ydCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJWxsZCBhbmQgJWxsdSBwcmludGYoKSBmb3JtYXQgc3VwcG9ydC4uLiAiID4mNjsgfQotICBpZiB0ZXN0ICIke2FjX2N2X2hhdmVfbG9uZ19sb25nX2Zvcm1hdCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIGlmICR7YWNfY3ZfaGF2ZV9sb25nX2xvbmdfZm9ybWF0Kzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgotICBhY19jdl9oYXZlX2xvbmdfbG9uZ19mb3JtYXQ9bm8KKyAgYWNfY3ZfaGF2ZV9sb25nX2xvbmdfZm9ybWF0PSJjcm9zcyAtLSBhc3N1bWluZyBubyIKKyAgIGlmIHRlc3QgeCRHQ0MgPSB4eWVzOyB0aGVuCisgICAgc2F2ZV9DRkxBR1M9JENGTEFHUworICAgIENGTEFHUz0iJENGTEFHUyAtV2Vycm9yIC1XZm9ybWF0IgorICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworICAgICAgICAjaW5jbHVkZSA8c3RkaW8uaD4KKyAgICAgICAgI2luY2x1ZGUgPHN0ZGRlZi5oPgorCitpbnQKK21haW4gKCkKK3sKKworICAgICAgY2hhciAqYnVmZmVyOworICAgICAgc3ByaW50ZihidWZmZXIsICIlbGxkIiwgKGxvbmcgbG9uZykxMjMpOworICAgICAgc3ByaW50ZihidWZmZXIsICIlbGxkIiwgKGxvbmcgbG9uZyktMTIzKTsKKyAgICAgIHNwcmludGYoYnVmZmVyLCAiJWxsdSIsICh1bnNpZ25lZCBsb25nIGxvbmcpMTIzKTsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2hhdmVfbG9uZ19sb25nX2Zvcm1hdD15ZXMKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgIENGTEFHUz0kc2F2ZV9DRkxBR1MKKyAgIGZpCiBlbHNlCiAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KQEAgLTEzNzY0LDcgKzE0NDkyLDcgQEAKIAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJXpkIHByaW50ZigpIGZvcm1hdCBzdXBwb3J0IiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAlemQgcHJpbnRmKCkgZm9ybWF0IHN1cHBvcnQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfaGF2ZV9zaXplX3RfZm9ybWF0K3NldH0iID0gc2V0OyB0aGVuIDoKK2lmICR7YWNfY3ZfaGF2ZV9zaXplX3RfZm9ybWF0Kzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgpAQCAtMTM4MzcsNyArMTQ1NjUsNyBAQAogI2VuZGlmCiAKICIKLWlmIHRlc3QgIngkYWNfY3ZfdHlwZV9zb2NrbGVuX3QiID0geCIieWVzOyB0aGVuIDoKK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV9zb2NrbGVuX3QiID0geHllczsgdGhlbiA6CiAKIGVsc2UKIApAQCAtMTM5NDIsMTAgKzE0NjcwLDIxIEBACiAgICAgIDplbmQnID4+Y29uZmNhY2hlCiBpZiBkaWZmICIkY2FjaGVfZmlsZSIgY29uZmNhY2hlID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCiAgIGlmIHRlc3QgLXcgIiRjYWNoZV9maWxlIjsgdGhlbgotICAgIHRlc3QgIngkY2FjaGVfZmlsZSIgIT0gIngvZGV2L251bGwiICYmCisgICAgaWYgdGVzdCAieCRjYWNoZV9maWxlIiAhPSAieC9kZXYvbnVsbCI7IHRoZW4KICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogdXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQogJGFzX2VjaG8gIiRhc19tZTogdXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9Ci0gICAgY2F0IGNvbmZjYWNoZSA+JGNhY2hlX2ZpbGUKKyAgICAgIGlmIHRlc3QgISAtZiAiJGNhY2hlX2ZpbGUiIHx8IHRlc3QgLWggIiRjYWNoZV9maWxlIjsgdGhlbgorCWNhdCBjb25mY2FjaGUgPiIkY2FjaGVfZmlsZSIKKyAgICAgIGVsc2UKKyAgICAgICAgY2FzZSAkY2FjaGVfZmlsZSBpbiAjKAorICAgICAgICAqLyogfCA/OiopCisJICBtdiAtZiBjb25mY2FjaGUgIiRjYWNoZV9maWxlIiQkICYmCisJICBtdiAtZiAiJGNhY2hlX2ZpbGUiJCQgIiRjYWNoZV9maWxlIiA7OyAjKAorICAgICAgICAqKQorCSAgbXYgLWYgY29uZmNhY2hlICIkY2FjaGVfZmlsZSIgOzsKKwllc2FjCisgICAgICBmaQorICAgIGZpCiAgIGVsc2UKICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IG5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKICRhc19lY2hvICIkYXNfbWU6IG5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQpAQCAtMTM5NzgsNyArMTQ3MTcsNyBAQAogCiAKIAotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQorOiAiJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30iCiBhY193cml0ZV9mYWlsPTAKIGFjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCiBhY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzICRDT05GSUdfU1RBVFVTIgpAQCAtMTQwNzksNiArMTQ4MTgsNyBAQAogSUZTPSIgIiIJJGFzX25sIgogCiAjIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgorYXNfbXlzZWxmPQogY2FzZSAkMCBpbiAjKCgKICAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OwogICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCkBAIC0xNDI3NCwxNiArMTUwMTQsMTYgQEAKICAgICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgogICAgICMgMSkgT24gTVNZUywgYm90aCBgbG4gLXMgZmlsZSBkaXInIGFuZCBgbG4gZmlsZSBkaXInIGZhaWwuCiAgICAgIyAyKSBESkdQUCA8IDIuMDQgaGFzIG5vIHN5bWxpbmtzOyBgbG4gLXMnIGNyZWF0ZXMgYSB3cmFwcGVyIGV4ZWN1dGFibGUuCi0gICAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wJy4KKyAgICAjIEluIGJvdGggY2FzZXMsIHdlIGhhdmUgdG8gZGVmYXVsdCB0byBgY3AgLXBSJy4KICAgICBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQuZGlyIDI+L2Rldi9udWxsICYmIHRlc3QgISAtZiBjb25mJCQuZXhlIHx8Ci0gICAgICBhc19sbl9zPSdjcCAtcCcKKyAgICAgIGFzX2xuX3M9J2NwIC1wUicKICAgZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KICAgICBhc19sbl9zPWxuCiAgIGVsc2UKLSAgICBhc19sbl9zPSdjcCAtcCcKKyAgICBhc19sbl9zPSdjcCAtcFInCiAgIGZpCiBlbHNlCi0gIGFzX2xuX3M9J2NwIC1wJworICBhc19sbl9zPSdjcCAtcFInCiBmaQogcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmRpci9jb25mJCQuZmlsZSBjb25mJCQuZmlsZQogcm1kaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbApAQCAtMTQzNDMsMjggKzE1MDgzLDE2IEBACiAgIGFzX21rZGlyX3A9ZmFsc2UKIGZpCiAKLWlmIHRlc3QgLXggLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYXNfdGVzdF94PSd0ZXN0IC14JwotZWxzZQotICBpZiBscyAtZEwgLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBhc19sc19MX29wdGlvbj1MCi0gIGVsc2UKLSAgICBhc19sc19MX29wdGlvbj0KLSAgZmkKLSAgYXNfdGVzdF94PScKLSAgICBldmFsIHNoIC1jICdcJycKLSAgICAgIGlmIHRlc3QgLWQgIiQxIjsgdGhlbgotCXRlc3QgLWQgIiQxLy4iOwotICAgICAgZWxzZQotCWNhc2UgJDEgaW4gIygKLQktKilzZXQgIi4vJDEiOzsKLQllc2FjOwotCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluICMoKAotCT8/P1tzeF0qKTo7OyopZmFsc2U7O2VzYWM7ZmkKLSAgICAnXCcnIHNoCi0gICcKLWZpCi1hc19leGVjdXRhYmxlX3A9JGFzX3Rlc3RfeAorCisjIGFzX2ZuX2V4ZWN1dGFibGVfcCBGSUxFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRlc3QgaWYgRklMRSBpcyBhbiBleGVjdXRhYmxlIHJlZ3VsYXIgZmlsZS4KK2FzX2ZuX2V4ZWN1dGFibGVfcCAoKQoreworICB0ZXN0IC1mICIkMSIgJiYgdGVzdCAteCAiJDEiCit9ICMgYXNfZm5fZXhlY3V0YWJsZV9wCithc190ZXN0X3g9J3Rlc3QgLXgnCithc19leGVjdXRhYmxlX3A9YXNfZm5fZXhlY3V0YWJsZV9wCiAKICMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KIGFzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCkBAIC0xNDM4Niw3ICsxNTExNCw3IEBACiAjIHZhbHVlcyBhZnRlciBvcHRpb25zIGhhbmRsaW5nLgogYWNfbG9nPSIKIFRoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgcHl0aG9uICRhc19tZSAyLjcsIHdoaWNoIHdhcwotZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY3LiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjkuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKIAogICBDT05GSUdfRklMRVMgICAgPSAkQ09ORklHX0ZJTEVTCiAgIENPTkZJR19IRUFERVJTICA9ICRDT05GSUdfSEVBREVSUwpAQCAtMTQ0NDgsMTYgKzE1MTc2LDE3IEBACiBhY19jc19jb25maWc9ImAkYXNfZWNobyAiJGFjX2NvbmZpZ3VyZV9hcmdzIiB8IHNlZCAncy9eIC8vOyBzL1tcXCIiXGBcJF0vXFxcXCYvZydgIgogYWNfY3NfdmVyc2lvbj0iXFwKIHB5dGhvbiBjb25maWcuc3RhdHVzIDIuNwotY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY3LAorY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5LAogICB3aXRoIG9wdGlvbnMgXFwiXCRhY19jc19jb25maWdcXCIKIAotQ29weXJpZ2h0IChDKSAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorQ29weXJpZ2h0IChDKSAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogVGhpcyBjb25maWcuc3RhdHVzIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCiBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgogCiBhY19wd2Q9JyRhY19wd2QnCiBzcmNkaXI9JyRzcmNkaXInCiBJTlNUQUxMPSckSU5TVEFMTCcKK01LRElSX1A9JyRNS0RJUl9QJwogdGVzdCAtbiAiXCRBV0siIHx8IEFXSz1hd2sKIF9BQ0VPRgogCkBAIC0xNDU0MCw3ICsxNTI2OSw3IEBACiBfQUNFT0YKIGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQogaWYgXCRhY19jc19yZWNoZWNrOyB0aGVuCi0gIHNldCBYICckU0hFTEwnICckMCcgJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24KKyAgc2V0IFggJFNIRUxMICckMCcgJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24KICAgc2hpZnQKICAgXCRhc19lY2hvICJydW5uaW5nIENPTkZJR19TSEVMTD0kU0hFTEwgXCQqIiA+JjYKICAgQ09ORklHX1NIRUxMPSckU0hFTEwnCkBAIC0xNDU4MCw3ICsxNTMwOSw3IEBACiAgICAgIk1pc2MvcHl0aG9uLnBjIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIE1pc2MvcHl0aG9uLnBjIiA7OwogICAgICJNb2R1bGVzL2xkX3NvX2FpeCIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBNb2R1bGVzL2xkX3NvX2FpeCIgOzsKIAotICAqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBhcmd1bWVudDogXGAkYWNfY29uZmlnX3RhcmdldCciICIkTElORU5PIiA1IDs7CisgICopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIGFyZ3VtZW50OiBcYCRhY19jb25maWdfdGFyZ2V0JyIgIiRMSU5FTk8iIDU7OwogICBlc2FjCiBkb25lCiAKQEAgLTE0NjAyLDkgKzE1MzMxLDEwIEBACiAjIGFmdGVyIGl0cyBjcmVhdGlvbiBidXQgYmVmb3JlIGl0cyBuYW1lIGhhcyBiZWVuIGFzc2lnbmVkIHRvIGAkdG1wJy4KICRkZWJ1ZyB8fAogewotICB0bXA9CisgIHRtcD0gYWNfdG1wPQogICB0cmFwICdleGl0X3N0YXR1cz0kPwotICB7IHRlc3QgLXogIiR0bXAiIHx8IHRlc3QgISAtZCAiJHRtcCIgfHwgcm0gLWZyICIkdG1wIjsgfSAmJiBleGl0ICRleGl0X3N0YXR1cworICA6ICIke2FjX3RtcDo9JHRtcH0iCisgIHsgdGVzdCAhIC1kICIkYWNfdG1wIiB8fCBybSAtZnIgIiRhY190bXAiOyB9ICYmIGV4aXQgJGV4aXRfc3RhdHVzCiAnIDAKICAgdHJhcCAnYXNfZm5fZXhpdCAxJyAxIDIgMTMgMTUKIH0KQEAgLTE0NjEyLDEyICsxNTM0MiwxMyBAQAogCiB7CiAgIHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIi4vY29uZlhYWFhYWCIpIDI+L2Rldi9udWxsYCAmJgotICB0ZXN0IC1uICIkdG1wIiAmJiB0ZXN0IC1kICIkdG1wIgorICB0ZXN0IC1kICIkdG1wIgogfSAgfHwKIHsKICAgdG1wPS4vY29uZiQkLSRSQU5ET00KICAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCiB9IHx8IGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAuIiAiJExJTkVOTyIgNQorYWNfdG1wPSR0bXAKIAogIyBTZXQgdXAgdGhlIHNjcmlwdHMgZm9yIENPTkZJR19GSUxFUyBzZWN0aW9uLgogIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19GSUxFUy4KQEAgLTE0NjM5LDcgKzE1MzcwLDcgQEAKICAgYWNfY3NfYXdrX2NyPSRhY19jcgogZmkKIAotZWNobyAnQkVHSU4geycgPiIkdG1wL3N1YnMxLmF3ayIgJiYKK2VjaG8gJ0JFR0lOIHsnID4iJGFjX3RtcC9zdWJzMS5hd2siICYmCiBfQUNFT0YKIAogCkBAIC0xNDY2Nyw3ICsxNTM5OCw3IEBACiBybSAtZiBjb25mJCRzdWJzLnNoCiAKIGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotY2F0ID4+IlwkdG1wL3N1YnMxLmF3ayIgPDxcXF9BQ0FXSyAmJgorY2F0ID4+IlwkYWNfdG1wL3N1YnMxLmF3ayIgPDxcXF9BQ0FXSyAmJgogX0FDRU9GCiBzZWQgLW4gJwogaApAQCAtMTQ3MTUsNyArMTU0NDYsNyBAQAogcm0gLWYgY29uZiQkc3Vicy5hd2sKIGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQogX0FDQVdLCi1jYXQgPj4iXCR0bXAvc3ViczEuYXdrIiA8PF9BQ0FXSyAmJgorY2F0ID4+IlwkYWNfdG1wL3N1YnMxLmF3ayIgPDxfQUNBV0sgJiYKICAgZm9yIChrZXkgaW4gUykgU19pc19zZXRba2V5XSA9IDEKICAgRlMgPSAiByIKIApAQCAtMTQ3NDcsNyArMTU0NzgsNyBAQAogICBzZWQgInMvJGFjX2NyXCQvLzsgcy8kYWNfY3IvJGFjX2NzX2F3a19jci9nIgogZWxzZQogICBjYXQKLWZpIDwgIiR0bXAvc3ViczEuYXdrIiA+ICIkdG1wL3N1YnMuYXdrIiBcCitmaSA8ICIkYWNfdG1wL3N1YnMxLmF3ayIgPiAiJGFjX3RtcC9zdWJzLmF3ayIgXAogICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IHNldHVwIGNvbmZpZyBmaWxlcyBtYWNoaW5lcnkiICIkTElORU5PIiA1CiBfQUNFT0YKIApAQCAtMTQ3ODEsNyArMTU1MTIsNyBAQAogIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19IRUFERVJTLgogIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBNYWtlZmlsZScuCiBpZiB0ZXN0IC1uICIkQ09ORklHX0hFQURFUlMiOyB0aGVuCi1jYXQgPiIkdG1wL2RlZmluZXMuYXdrIiA8PFxfQUNBV0sgfHwKK2NhdCA+IiRhY190bXAvZGVmaW5lcy5hd2siIDw8XF9BQ0FXSyB8fAogQkVHSU4gewogX0FDRU9GCiAKQEAgLTE0NzkzLDggKzE1NTI0LDggQEAKICMgaGFuZGxpbmcgb2YgbG9uZyBsaW5lcy4KIGFjX2RlbGltPSclIV8hIyAnCiBmb3IgYWNfbGFzdF90cnkgaW4gZmFsc2UgZmFsc2UgOjsgZG8KLSAgYWNfdD1gc2VkIC1uICIvJGFjX2RlbGltL3AiIGNvbmZkZWZzLmhgCi0gIGlmIHRlc3QgLXogIiRhY190IjsgdGhlbgorICBhY190dD1gc2VkIC1uICIvJGFjX2RlbGltL3AiIGNvbmZkZWZzLmhgCisgIGlmIHRlc3QgLXogIiRhY190dCI7IHRoZW4KICAgICBicmVhawogICBlbGlmICRhY19sYXN0X3RyeTsgdGhlbgogICAgIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX0hFQURFUlMiICIkTElORU5PIiA1CkBAIC0xNDg5NSw3ICsxNTYyNiw3IEBACiAgIGVzYWMKICAgY2FzZSAkYWNfbW9kZSRhY190YWcgaW4KICAgOltGSExdKjoqKTs7Ci0gIDpMKiB8IDpDKjoqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB0YWcgXGAkYWNfdGFnJyIgIiRMSU5FTk8iIDUgOzsKKyAgOkwqIHwgOkMqOiopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHRhZyBcYCRhY190YWcnIiAiJExJTkVOTyIgNTs7CiAgIDpbRkhdLSkgYWNfdGFnPS06LTs7CiAgIDpbRkhdKikgYWNfdGFnPSRhY190YWc6JGFjX3RhZy5pbjs7CiAgIGVzYWMKQEAgLTE0OTE0LDcgKzE1NjQ1LDcgQEAKICAgICBmb3IgYWNfZgogICAgIGRvCiAgICAgICBjYXNlICRhY19mIGluCi0gICAgICAtKSBhY19mPSIkdG1wL3N0ZGluIjs7CisgICAgICAtKSBhY19mPSIkYWNfdG1wL3N0ZGluIjs7CiAgICAgICAqKSAjIExvb2sgZm9yIHRoZSBmaWxlIGZpcnN0IGluIHRoZSBidWlsZCB0cmVlLCB0aGVuIGluIHRoZSBzb3VyY2UgdHJlZQogCSAjIChpZiB0aGUgcGF0aCBpcyBub3QgYWJzb2x1dGUpLiAgVGhlIGFic29sdXRlIHBhdGggY2Fubm90IGJlIERPUy1zdHlsZSwKIAkgIyBiZWNhdXNlICRhY19mIGNhbm5vdCBjb250YWluIGA6Jy4KQEAgLTE0OTIzLDcgKzE1NjU0LDcgQEAKIAkgICBbXFwvJF0qKSBmYWxzZTs7CiAJICAgKikgdGVzdCAtZiAiJHNyY2Rpci8kYWNfZiIgJiYgYWNfZj0iJHNyY2Rpci8kYWNfZiI7OwogCSAgIGVzYWMgfHwKLQkgICBhc19mbl9lcnJvciAxICJjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiBcYCRhY19mJyIgIiRMSU5FTk8iIDUgOzsKKwkgICBhc19mbl9lcnJvciAxICJjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiBcYCRhY19mJyIgIiRMSU5FTk8iIDU7OwogICAgICAgZXNhYwogICAgICAgY2FzZSAkYWNfZiBpbiAqXCcqKSBhY19mPWAkYXNfZWNobyAiJGFjX2YiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgZXNhYwogICAgICAgYXNfZm5fYXBwZW5kIGFjX2ZpbGVfaW5wdXRzICIgJyRhY19mJyIKQEAgLTE0OTQ5LDggKzE1NjgwLDggQEAKICAgICBlc2FjCiAKICAgICBjYXNlICRhY190YWcgaW4KLSAgICAqOi06KiB8ICo6LSkgY2F0ID4iJHRtcC9zdGRpbiIgXAotICAgICAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1ICA7OworICAgICo6LToqIHwgKjotKSBjYXQgPiIkYWNfdG1wL3N0ZGluIiBcCisgICAgICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUgOzsKICAgICBlc2FjCiAgICAgOzsKICAgZXNhYwpAQCAtMTUwMjQsNiArMTU3NTUsMTEgQEAKICAgW1xcLyRdKiB8ID86W1xcL10qICkgYWNfSU5TVEFMTD0kSU5TVEFMTCA7OwogICAqKSBhY19JTlNUQUxMPSRhY190b3BfYnVpbGRfcHJlZml4JElOU1RBTEwgOzsKICAgZXNhYworICBhY19NS0RJUl9QPSRNS0RJUl9QCisgIGNhc2UgJE1LRElSX1AgaW4KKyAgW1xcLyRdKiB8ID86W1xcL10qICkgOzsKKyAgKi8qKSBhY19NS0RJUl9QPSRhY190b3BfYnVpbGRfcHJlZml4JE1LRElSX1AgOzsKKyAgZXNhYwogX0FDRU9GCiAKIGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKQEAgLTE1MDc4LDIzICsxNTgxNCwyNSBAQAogcyZAYWJzX2J1aWxkZGlyQCYkYWNfYWJzX2J1aWxkZGlyJjt0IHQKIHMmQGFic190b3BfYnVpbGRkaXJAJiRhY19hYnNfdG9wX2J1aWxkZGlyJjt0IHQKIHMmQElOU1RBTExAJiRhY19JTlNUQUxMJjt0IHQKK3MmQE1LRElSX1BAJiRhY19NS0RJUl9QJjt0IHQKICRhY19kYXRhcm9vdGRpcl9oYWNrCiAiCi1ldmFsIHNlZCBcIlwkYWNfc2VkX2V4dHJhXCIgIiRhY19maWxlX2lucHV0cyIgfCAkQVdLIC1mICIkdG1wL3N1YnMuYXdrIiA+JHRtcC9vdXQgXAotICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKK2V2YWwgc2VkIFwiXCRhY19zZWRfZXh0cmFcIiAiJGFjX2ZpbGVfaW5wdXRzIiB8ICRBV0sgLWYgIiRhY190bXAvc3Vicy5hd2siIFwKKyAgPiRhY190bXAvb3V0IHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQogCiB0ZXN0IC16ICIkYWNfZGF0YXJvb3RkaXJfaGFjayRhY19kYXRhcm9vdGRpcl9zZWVuIiAmJgotICB7IGFjX291dD1gc2VkIC1uICcvXCR7ZGF0YXJvb3RkaXJ9L3AnICIkdG1wL291dCJgOyB0ZXN0IC1uICIkYWNfb3V0IjsgfSAmJgotICB7IGFjX291dD1gc2VkIC1uICcvXlsJIF0qZGF0YXJvb3RkaXJbCSBdKjoqPS9wJyAiJHRtcC9vdXQiYDsgdGVzdCAteiAiJGFjX291dCI7IH0gJiYKKyAgeyBhY19vdXQ9YHNlZCAtbiAnL1wke2RhdGFyb290ZGlyfS9wJyAiJGFjX3RtcC9vdXQiYDsgdGVzdCAtbiAiJGFjX291dCI7IH0gJiYKKyAgeyBhY19vdXQ9YHNlZCAtbiAnL15bCSBdKmRhdGFyb290ZGlyWwkgXSo6Kj0vcCcgXAorICAgICAgIiRhY190bXAvb3V0ImA7IHRlc3QgLXogIiRhY19vdXQiOyB9ICYmCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJGFjX2ZpbGUgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIFxgZGF0YXJvb3RkaXInCiB3aGljaCBzZWVtcyB0byBiZSB1bmRlZmluZWQuICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGRlZmluZWQiID4mNQogJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2ZpbGUgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIFxgZGF0YXJvb3RkaXInCiB3aGljaCBzZWVtcyB0byBiZSB1bmRlZmluZWQuICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGRlZmluZWQiID4mMjt9CiAKLSAgcm0gLWYgIiR0bXAvc3RkaW4iCisgIHJtIC1mICIkYWNfdG1wL3N0ZGluIgogICBjYXNlICRhY19maWxlIGluCi0gIC0pIGNhdCAiJHRtcC9vdXQiICYmIHJtIC1mICIkdG1wL291dCI7OwotICAqKSBybSAtZiAiJGFjX2ZpbGUiICYmIG12ICIkdG1wL291dCIgIiRhY19maWxlIjs7CisgIC0pIGNhdCAiJGFjX3RtcC9vdXQiICYmIHJtIC1mICIkYWNfdG1wL291dCI7OworICAqKSBybSAtZiAiJGFjX2ZpbGUiICYmIG12ICIkYWNfdG1wL291dCIgIiRhY19maWxlIjs7CiAgIGVzYWMgXAogICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKICA7OwpAQCAtMTUxMDUsMjAgKzE1ODQzLDIwIEBACiAgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KICAgICB7CiAgICAgICAkYXNfZWNobyAiLyogJGNvbmZpZ3VyZV9pbnB1dCAgKi8iIFwKLSAgICAgICYmIGV2YWwgJyRBV0sgLWYgIiR0bXAvZGVmaW5lcy5hd2siJyAiJGFjX2ZpbGVfaW5wdXRzIgotICAgIH0gPiIkdG1wL2NvbmZpZy5oIiBcCisgICAgICAmJiBldmFsICckQVdLIC1mICIkYWNfdG1wL2RlZmluZXMuYXdrIicgIiRhY19maWxlX2lucHV0cyIKKyAgICB9ID4iJGFjX3RtcC9jb25maWcuaCIgXAogICAgICAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1Ci0gICAgaWYgZGlmZiAiJGFjX2ZpbGUiICIkdG1wL2NvbmZpZy5oIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBpZiBkaWZmICIkYWNfZmlsZSIgIiRhY190bXAvY29uZmlnLmgiID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfZmlsZSBpcyB1bmNoYW5nZWQiID4mNQogJGFzX2VjaG8gIiRhc19tZTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjY7fQogICAgIGVsc2UKICAgICAgIHJtIC1mICIkYWNfZmlsZSIKLSAgICAgIG12ICIkdG1wL2NvbmZpZy5oIiAiJGFjX2ZpbGUiIFwKKyAgICAgIG12ICIkYWNfdG1wL2NvbmZpZy5oIiAiJGFjX2ZpbGUiIFwKIAl8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKICAgICBmaQogICBlbHNlCiAgICAgJGFzX2VjaG8gIi8qICRjb25maWd1cmVfaW5wdXQgICovIiBcCi0gICAgICAmJiBldmFsICckQVdLIC1mICIkdG1wL2RlZmluZXMuYXdrIicgIiRhY19maWxlX2lucHV0cyIgXAorICAgICAgJiYgZXZhbCAnJEFXSyAtZiAiJGFjX3RtcC9kZWZpbmVzLmF3ayInICIkYWNfZmlsZV9pbnB1dHMiIFwKICAgICAgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlIC0iICIkTElORU5PIiA1CiAgIGZpCiAgOzsKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5pbiBiL2NvbmZpZ3VyZS5hYwpzaW1pbGFyaXR5IGluZGV4IDkxJQpyZW5hbWUgZnJvbSBjb25maWd1cmUuaW4KcmVuYW1lIHRvIGNvbmZpZ3VyZS5hYwppbmRleCAzZjViM2I5Li41NGY4YzBmIDEwMDY0NAotLS0gYS9jb25maWd1cmUuaW4KKysrIGIvY29uZmlndXJlLmFjCkBAIC0xMiw2ICsxMiwzMyBAQAogQUNfQ09ORklHX1NSQ0RJUihbSW5jbHVkZS9vYmplY3QuaF0pCiBBQ19DT05GSUdfSEVBREVSKHB5Y29uZmlnLmgpCiAKK0FDX0NBTk9OSUNBTF9IT1NUCitBQ19TVUJTVChidWlsZCkKK0FDX1NVQlNUKGhvc3QpCisKK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgcHl0aG9uIGludGVycHJldGVyIGZvciBjcm9zcyBidWlsZF0pCisgICAgaWYgdGVzdCAteiAiJFBZVEhPTl9GT1JfQlVJTEQiOyB0aGVuCisgICAgICAgIGZvciBpbnRlcnAgaW4gcHl0aG9uJFBBQ0tBR0VfVkVSU0lPTiBweXRob24yIHB5dGhvbjsgZG8KKwkgICAgd2hpY2ggJGludGVycCA+L2Rldi9udWxsIDI+JjEgfHwgY29udGludWUKKwkgICAgaWYgJGludGVycCAtYyAnaW1wb3J0IHN5cztzeXMuZXhpdChub3QgKHN5cy52ZXJzaW9uX2luZm9APDpAOjJAOj5AID49ICgyLDcpIGFuZCBzeXMudmVyc2lvbl9pbmZvQDw6QDBAOj5AIDwgMykpJzsgdGhlbgorCSAgICAgICAgYnJlYWsKKwkgICAgZmkKKyAgICAgICAgICAgIGludGVycD0KKwlkb25lCisgICAgICAgIGlmIHRlc3QgeCRpbnRlcnAgPSB4OyB0aGVuCisJICAgIEFDX01TR19FUlJPUihbcHl0aG9uJFBBQ0tBR0VfVkVSU0lPTiBpbnRlcnByZXRlciBub3QgZm91bmRdKQorCWZpCisgICAgICAgIEFDX01TR19SRVNVTFQoJGludGVycCkKKwlQWVRIT05fRk9SX0JVSUxEPSdfUFlUSE9OX1BST0pFQ1RfQkFTRT0kKGFic19idWlsZGRpcikgX1BZVEhPTl9IT1NUX1BMQVRGT1JNPSQoX1BZVEhPTl9IT1NUX1BMQVRGT1JNKSBQWVRIT05QQVRIPSQoc2hlbGwgdGVzdCAtZiBweWJ1aWxkZGlyLnR4dCAmJiBlY2hvICQoYWJzX2J1aWxkZGlyKS9gY2F0IHB5YnVpbGRkaXIudHh0YDopJChzcmNkaXIpL0xpYjokKHNyY2RpcikvTGliL3BsYXQtJChNQUNIREVQKSAnJGludGVycAorICAgIGZpCitlbGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0gbWF5YmU7IHRoZW4KKyAgICBBQ19NU0dfRVJST1IoW0Nyb3NzIGNvbXBpbGluZyByZXF1aXJlZCAtLWhvc3Q9SE9TVC1UVVBMRSBhbmQgLS1idWlsZD1BUkNIXSkKK2Vsc2UKKyAgICBQWVRIT05fRk9SX0JVSUxEPScuLyQoQlVJTERQWVRIT04pIC1FJworZmkKK0FDX1NVQlNUKFBZVEhPTl9GT1JfQlVJTEQpCisKIGRubCBFbnN1cmUgdGhhdCBpZiBwcmVmaXggaXMgc3BlY2lmaWVkLCBpdCBkb2VzIG5vdCBlbmQgaW4gYSBzbGFzaC4gSWYKIGRubCBpdCBkb2VzLCB3ZSBnZXQgcGF0aCBuYW1lcyBjb250YWluaW5nICcvLycgd2hpY2ggaXMgYm90aCB1Z2x5IGFuZAogZG5sIGNhbiBjYXVzZSB0cm91YmxlLgpAQCAtMTE4LDYgKzE0NSw3IEBACiBBQ19TVUJTVChVTklWRVJTQUxTREspCiAKIEFDX1NVQlNUKEFSQ0hfUlVOXzMyQklUKQorQVJDSF9SVU5fMzJCSVQ9IiIKIAogVU5JVkVSU0FMX0FSQ0hTPSIzMi1iaXQiCiBBQ19TVUJTVChMSVBPXzMyQklUX0ZMQUdTKQpAQCAtMjc5LDYgKzMwNywyNSBAQAogQUNfTVNHX0NIRUNLSU5HKE1BQ0hERVApCiBpZiB0ZXN0IC16ICIkTUFDSERFUCIKIHRoZW4KKyAgICAjIGF2b2lkIHVzaW5nIHVuYW1lIGZvciBjcm9zcyBidWlsZHMKKyAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICAgICAgICMgYWNfc3lzX3N5c3RlbSBhbmQgYWNfc3lzX3JlbGVhc2UgYXJlIG9ubHkgdXNlZCBmb3Igc2V0dGluZworICAgICAgICMgYGRlZmluZV94b3Blbl9zb3VyY2UnIGluIHRoZSBjYXNlIHN0YXRlbWVudCBiZWxvdy4gRm9yIHRoZQorICAgICAgICMgY3VycmVudCBzdXBwb3J0ZWQgY3Jvc3MgYnVpbGRzLCB0aGlzIG1hY3JvIGlzIG5vdCBhZGp1c3RlZC4KKwljYXNlICIkaG9zdCIgaW4KKwkqLSotbGludXgqKQorCQlhY19zeXNfc3lzdGVtPUxpbnV4CisJCTs7CisJKi0qLWN5Z3dpbiopCisJCWFjX3N5c19zeXN0ZW09Q3lnd2luCisJCTs7CisJKikKKwkJIyBmb3Igbm93LCBsaW1pdCBjcm9zcyBidWlsZHMgdG8ga25vd24gY29uZmlndXJhdGlvbnMKKwkJTUFDSERFUD0idW5rbm93biIKKwkJQUNfTVNHX0VSUk9SKFtjcm9zcyBidWlsZCBub3Qgc3VwcG9ydGVkIGZvciAkaG9zdF0pCisJZXNhYworCWFjX3N5c19yZWxlYXNlPQorICAgIGVsc2UKIAlhY19zeXNfc3lzdGVtPWB1bmFtZSAtc2AKIAlpZiB0ZXN0ICIkYWNfc3lzX3N5c3RlbSIgPSAiQUlYIiBcCiAJLW8gIiRhY19zeXNfc3lzdGVtIiA9ICJVbml4V2FyZSIgLW8gIiRhY19zeXNfc3lzdGVtIiA9ICJPcGVuVU5JWCI7IHRoZW4KQEAgLTI4NiwyMCArMzMzLDQ0IEBACiAJZWxzZQogCQlhY19zeXNfcmVsZWFzZT1gdW5hbWUgLXJgCiAJZmkKLQlhY19tZF9zeXN0ZW09YGVjaG8gJGFjX3N5c19zeXN0ZW0gfAotCQkJICAgdHIgLWQgJ1svIF0nIHwgdHIgJ1tbQS1aXV0nICdbW2Etel1dJ2AKLQlhY19tZF9yZWxlYXNlPWBlY2hvICRhY19zeXNfcmVsZWFzZSB8Ci0JCQkgICB0ciAtZCAnWy8gXScgfCBzZWQgJ3MvXltbQS1aXV1cLi8vJyB8IHNlZCAncy9cLi4qLy8nYAotCU1BQ0hERVA9IiRhY19tZF9zeXN0ZW0kYWNfbWRfcmVsZWFzZSIKKyAgICBmaQorICAgIGFjX21kX3N5c3RlbT1gZWNobyAkYWNfc3lzX3N5c3RlbSB8CisJCQl0ciAtZCAnWy8gXScgfCB0ciAnW1tBLVpdXScgJ1tbYS16XV0nYAorICAgIGFjX21kX3JlbGVhc2U9YGVjaG8gJGFjX3N5c19yZWxlYXNlIHwKKwkJCXRyIC1kICdbLyBdJyB8IHNlZCAncy9eW1tBLVpdXVwuLy8nIHwgc2VkICdzL1wuLiovLydgCisgICAgTUFDSERFUD0iJGFjX21kX3N5c3RlbSRhY19tZF9yZWxlYXNlIgogCi0JY2FzZSAkTUFDSERFUCBpbgorICAgIGNhc2UgJE1BQ0hERVAgaW4KIAlsaW51eCopIE1BQ0hERVA9ImxpbnV4MiI7OwogCWN5Z3dpbiopIE1BQ0hERVA9ImN5Z3dpbiI7OwogCWRhcndpbiopIE1BQ0hERVA9ImRhcndpbiI7OwogCWF0aGVvcyopIE1BQ0hERVA9ImF0aGVvcyI7OwogICAgICAgICBpcml4NjQ2KSBNQUNIREVQPSJpcml4NiI7OwogCScnKQlNQUNIREVQPSJ1bmtub3duIjs7CisgICAgZXNhYworZmkKKworQUNfU1VCU1QoX1BZVEhPTl9IT1NUX1BMQVRGT1JNKQoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKwljYXNlICIkaG9zdCIgaW4KKwkqLSotbGludXgqKQorCQljYXNlICIkaG9zdF9jcHUiIGluCisJCWFybSopCisJCQlfaG9zdF9jcHU9YXJtCisJCQk7OworCQkqKQorCQkJX2hvc3RfY3B1PSRob3N0X2NwdQorCQllc2FjCisJCTs7CisJKi0qLWN5Z3dpbiopCisJCV9ob3N0X2NwdT0KKwkJOzsKKwkqKQorCQkjIGZvciBub3csIGxpbWl0IGNyb3NzIGJ1aWxkcyB0byBrbm93biBjb25maWd1cmF0aW9ucworCQlNQUNIREVQPSJ1bmtub3duIgorCQlBQ19NU0dfRVJST1IoW2Nyb3NzIGJ1aWxkIG5vdCBzdXBwb3J0ZWQgZm9yICRob3N0XSkKIAllc2FjCisJX1BZVEhPTl9IT1NUX1BMQVRGT1JNPSIkTUFDSERFUCR7X2hvc3RfY3B1OistJF9ob3N0X2NwdX0iCiBmaQogCQogIyBTb21lIHN5c3RlbXMgY2Fubm90IHN0YW5kIF9YT1BFTl9TT1VSQ0UgYmVpbmcgZGVmaW5lZCBhdCBhbGw7IHRoZXkKQEAgLTQ0NiwxMCArNTE3LDYgQEAKIENPTkZJR1VSRV9NQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQ9CiBFWFBPUlRfTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUPScjJwogCi1BQ19NU0dfQ0hFQ0tJTkcobWFjaGluZSB0eXBlIGFzIHJlcG9ydGVkIGJ5IHVuYW1lIC1tKQotYWNfc3lzX21hY2hpbmU9YHVuYW1lIC1tYAotQUNfTVNHX1JFU1VMVCgkYWNfc3lzX21hY2hpbmUpCi0KICMgY2hlY2tzIGZvciBhbHRlcm5hdGl2ZSBwcm9ncmFtcwogCiAjIGNvbXBpbGVyIGZsYWdzIGFyZSBnZW5lcmF0ZWQgaW4gdHdvIHNldHMsIEJBU0VDRkxBR1MgYW5kIE9QVC4gIE9QVCBpcyBqdXN0CkBAIC01MDcsNiArNTc0LDM5IEBACiAoaXQgaXMgYWxzbyBhIGdvb2QgaWRlYSB0byBkbyAnbWFrZSBjbGVhbicgYmVmb3JlIGNvbXBpbGluZyldKQogZmkKIAoraWYgdGVzdCAiJE1BQ0hERVAiID0gImlyaXg2IiAmJiB0ZXN0ICIkQ0MiICE9ICJnY2MiOyB0aGVuCisgICAgIyBOb3JtYWxseSwgTUlQU3BybyBDQyB0cmVhdHMgI2Vycm9yIGRpcmVjdGl2ZXMgYXMgd2FybmluZ3MsIHdoaWNoIG1lYW5zCisgICAgIyBhIHN1Y2Nlc3NmdWwgZXhpdCBjb2RlIGlzIHJldHVybmVkICgwKS4gIFRoaXMgaXMgYSBwcm9ibGVtIGJlY2F1c2UgSVJJWAorICAgICMgaGFzIGEgYnVuY2ggb2Ygc3lzdGVtIGhlYWRlcnMgd2l0aCB0aGlzIGd1YXJkIGF0IHRoZSB0b3A6CisgICAgIworICAgICMgICNpZm5kZWYgX19jOTkKKyAgICAjICAjZXJyb3IgVGhpcyBoZWFkZXIgZmlsZSBpcyB0byBiZSB1c2VkIG9ubHkgZm9yIGM5OSBtb2RlIGNvbXBpbGF0aW9ucworICAgICMgICNlbHNlCisgICAgIworICAgICMgV2hlbiBhdXRvY29uZiB0ZXN0cyBmb3Igc3VjaCBhIGhlYWRlciwgbGlrZSBzdGRpbnQuaCwgdGhpcyBoYXBwZW5zOgorICAgICMKKyAgICAjICBjb25maWd1cmU6NDYxOTogY2MgLWMgICBjb25mdGVzdC5jID4mNQorICAgICMgIGNjLTEwMzUgY2M6IFdBUk5JTkcgRmlsZSA9IC91c3IvaW5jbHVkZS9zdGRpbnQuaCwgTGluZSA9IDUKKyAgICAjICAgICNlcnJvciBkaXJlY3RpdmU6ICBUaGlzIGhlYWRlciBmaWxlIGlzIHRvIGJlIHVzZWQgb25seSBmb3IgYzk5IG1vZGUKKyAgICAjICAgICAgICAgICAgY29tcGlsYXRpb25zCisgICAgIworICAgICMgICAgI2Vycm9yIFRoaXMgaGVhZGVyIGZpbGUgaXMgdG8gYmUgdXNlZCBvbmx5IGZvciBjOTkgbW9kZSBjb21waWxhdGlvbnMKKyAgICAjICAgICBeCisgICAgIworICAgICMgIGNvbmZpZ3VyZTo0NjE5OiAkPyA9IDAKKyAgICAjICBjb25maWd1cmU6NDYxOTogcmVzdWx0OiB5ZXMKKyAgICAjCisgICAgIyBUaGVyZWZvcmUsIHdlIHVzZSBgLWRpYWdfZXJyb3IgMTAzNWAgdG8gaGF2ZSB0aGUgY29tcGlsZXIgdHJlYXQgdGhlCisgICAgIyB3YXJuaW5nIGFzIGFuIGVycm9yLCB3aGljaCBjYXVzZXMgY2MgdG8gcmV0dXJuIGEgbm9uLXplcm8gcmVzdWx0LAorICAgICMgd2hpY2ggYXV0b2NvbmYgY2FuIGludGVycHJldCBjb3JyZWN0bHkuCisgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1kaWFnX2Vycm9yIDEwMzUiCisgICAgIyBXaGlsc3Qgd2UncmUgaGVyZSwgd2UgbWlnaHQgYXMgd2VsbCBtYWtlIHN1cmUgQ1hYIGRlZmF1bHRzIHRvIHNvbWV0aGluZworICAgICMgc2Vuc2libGUgaWYgd2UncmUgbm90IHVzaW5nIGdjYy4KKyAgICBpZiB0ZXN0IC16ICIkQ1hYIjsgdGhlbgorICAgICAgICBDWFg9IkNDIgorICAgIGZpCitmaQorCiAjIElmIHRoZSB1c2VyIHNldCBDRkxBR1MsIHVzZSB0aGlzIGluc3RlYWQgb2YgdGhlIGF1dG9tYXRpY2FsbHkKICMgZGV0ZXJtaW5lZCBzZXR0aW5nCiBwcmVzZXRfY2ZsYWdzPSIkQ0ZMQUdTIgpAQCAtNTQ1LDggKzY0NSw4IEBACiBpZiB0ZXN0IC16ICIkQ1hYIgogdGhlbgogICAgICAgICBjYXNlICIkQ0MiIGluCi0gICAgICAgIGdjYykgICAgQUNfUEFUSF9QUk9HKENYWCwgW2crK10sIFtnKytdLCBbbm90Zm91bmRdKSA7OwotICAgICAgICBjYykgICAgIEFDX1BBVEhfUFJPRyhDWFgsIFtjKytdLCBbYysrXSwgW25vdGZvdW5kXSkgOzsKKyAgICAgICAgZ2NjKSAgICBBQ19QQVRIX1RPT0woQ1hYLCBbZysrXSwgW2crK10sIFtub3Rmb3VuZF0pIDs7CisgICAgICAgIGNjKSAgICAgQUNfUEFUSF9UT09MKENYWCwgW2MrK10sIFtjKytdLCBbbm90Zm91bmRdKSA7OwogICAgICAgICBlc2FjCiAJaWYgdGVzdCAiJENYWCIgPSAibm90Zm91bmQiCiAJdGhlbgpAQCAtNTU1LDcgKzY1NSw3IEBACiBmaQogaWYgdGVzdCAteiAiJENYWCIKIHRoZW4KLQlBQ19DSEVDS19QUk9HUyhDWFgsICRDQ0MgYysrIGcrKyBnY2MgQ0MgY3h4IGNjKysgY2wsIG5vdGZvdW5kKQorCUFDX0NIRUNLX1RPT0xTKENYWCwgJENDQyBjKysgZysrIGdjYyBDQyBjeHggY2MrKyBjbCwgbm90Zm91bmQpCiAJaWYgdGVzdCAiJENYWCIgPSAibm90Zm91bmQiCiAJdGhlbgogCQlDWFg9IiIKQEAgLTU3MCw2ICs2NzAsOSBAQAogICBdKQogZmkKIAorTVVMVElBUkNIPSQoJENDIC0tcHJpbnQtbXVsdGlhcmNoIDI+L2Rldi9udWxsKQorQUNfU1VCU1QoTVVMVElBUkNIKQorCiAKICMgY2hlY2tzIGZvciBVTklYIHZhcmlhbnRzIHRoYXQgc2V0IEMgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcwogQUNfVVNFX1NZU1RFTV9FWFRFTlNJT05TCkBAIC03MjgsMjIgKzgzMSwyMyBAQAogCiBBQ19NU0dfQ0hFQ0tJTkcoZm9yIC0tZW5hYmxlLXByb2ZpbGluZykKIEFDX0FSR19FTkFCTEUocHJvZmlsaW5nLAotICAgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtcHJvZmlsaW5nXSwgW2VuYWJsZSBDLWxldmVsIGNvZGUgcHJvZmlsaW5nXSksCi1bYWNfc2F2ZV9jYz0iJENDIgotIENDPSIkQ0MgLXBnIgotIEFDX1JVTl9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtbaW50IG1haW4oKSB7IHJldHVybiAwOyB9XV0pXSwKLSAgIFthY19lbmFibGVfcHJvZmlsaW5nPSJ5ZXMiXSwKLSAgIFthY19lbmFibGVfcHJvZmlsaW5nPSJubyJdLAotICAgW2FjX2VuYWJsZV9wcm9maWxpbmc9Im5vIl0pCi0gQ0M9IiRhY19zYXZlX2NjIl0pCi1BQ19NU0dfUkVTVUxUKCRhY19lbmFibGVfcHJvZmlsaW5nKQorICAgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtcHJvZmlsaW5nXSwgW2VuYWJsZSBDLWxldmVsIGNvZGUgcHJvZmlsaW5nXSkpCitpZiB0ZXN0ICJ4JGVuYWJsZV9wcm9maWxpbmciID0geHllczsgdGhlbgorICBhY19zYXZlX2NjPSIkQ0MiCisgIENDPSIkQ0MgLXBnIgorICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW1tpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH1dXSldLAorICAgIFtdLAorICAgIFtlbmFibGVfcHJvZmlsaW5nPW5vXSkKKyAgQ0M9IiRhY19zYXZlX2NjIgorZWxzZQorICBlbmFibGVfcHJvZmlsaW5nPW5vCitmaQorQUNfTVNHX1JFU1VMVCgkZW5hYmxlX3Byb2ZpbGluZykKIAotY2FzZSAiJGFjX2VuYWJsZV9wcm9maWxpbmciIGluCi0gICAgInllcyIpCi0JQkFTRUNGTEFHUz0iLXBnICRCQVNFQ0ZMQUdTIgotCUxERkxBR1M9Ii1wZyAkTERGTEFHUyIKLSAgICA7OwotZXNhYworaWYgdGVzdCAieCRlbmFibGVfcHJvZmlsaW5nIiA9IHh5ZXM7IHRoZW4KKyAgQkFTRUNGTEFHUz0iLXBnICRCQVNFQ0ZMQUdTIgorICBMREZMQUdTPSItcGcgJExERkxBR1MiCitmaQogCiBBQ19NU0dfQ0hFQ0tJTkcoTERMSUJSQVJZKQogCkBAIC03NTYsNyArODYwLDcgQEAKIGlmIHRlc3QgIiRlbmFibGVfZnJhbWV3b3JrIgogdGhlbgogICBMRExJQlJBUlk9JyQoUFlUSE9ORlJBTUVXT1JLRElSKS9WZXJzaW9ucy8kKFZFUlNJT04pLyQoUFlUSE9ORlJBTUVXT1JLKScKLSAgUlVOU0hBUkVEPURZTERfRlJBTUVXT1JLX1BBVEg9ImBwd2RgOiREWUxEX0ZSQU1FV09SS19QQVRIIgorICBSVU5TSEFSRUQ9RFlMRF9GUkFNRVdPUktfUEFUSD1gcHdkYCR7RFlMRF9GUkFNRVdPUktfUEFUSDorOiR7RFlMRF9GUkFNRVdPUktfUEFUSH19CiAgIEJMRExJQlJBUlk9JycKIGVsc2UKICAgQkxETElCUkFSWT0nJChMRExJQlJBUlkpJwpAQCAtNzc2LDEzICs4ODAsMTMgQEAKICAgICBTdW5PUyopCiAJICBMRExJQlJBUlk9J2xpYnB5dGhvbiQoVkVSU0lPTikuc28nCiAJICBCTERMSUJSQVJZPSctV2wsLVIsJChMSUJESVIpIC1MLiAtbHB5dGhvbiQoVkVSU0lPTiknCi0JICBSVU5TSEFSRUQ9TERfTElCUkFSWV9QQVRIPWBwd2RgOiR7TERfTElCUkFSWV9QQVRIfQorCSAgUlVOU0hBUkVEPUxEX0xJQlJBUllfUEFUSD1gcHdkYCR7TERfTElCUkFSWV9QQVRIOis6JHtMRF9MSUJSQVJZX1BBVEh9fQogCSAgSU5TVFNPTkFNRT0iJExETElCUkFSWSIuJFNPVkVSU0lPTgogICAgICAgICAgIDs7CiAgICAgTGludXgqfEdOVSp8TmV0QlNEKnxGcmVlQlNEKnxEcmFnb25GbHkqfE9wZW5CU0QqKQogCSAgTERMSUJSQVJZPSdsaWJweXRob24kKFZFUlNJT04pLnNvJwogCSAgQkxETElCUkFSWT0nLUwuIC1scHl0aG9uJChWRVJTSU9OKScKLQkgIFJVTlNIQVJFRD1MRF9MSUJSQVJZX1BBVEg9YHB3ZGA6JHtMRF9MSUJSQVJZX1BBVEh9CisJICBSVU5TSEFSRUQ9TERfTElCUkFSWV9QQVRIPWBwd2RgJHtMRF9MSUJSQVJZX1BBVEg6Kzoke0xEX0xJQlJBUllfUEFUSH19CiAJICBjYXNlICRhY19zeXNfc3lzdGVtIGluCiAJICAgICAgRnJlZUJTRCopCiAJCVNPVkVSU0lPTj1gZWNobyAkU09WRVJTSU9OfGN1dCAtZCAiLiIgLWYgMWAKQEAgLTgwMCwxMiArOTA0LDEyIEBACiAJCQk7OwogCSAgZXNhYwogCSAgQkxETElCUkFSWT0nLVdsLCtiLCQoTElCRElSKSAtTC4gLWxweXRob24kKFZFUlNJT04pJwotCSAgUlVOU0hBUkVEPVNITElCX1BBVEg9YHB3ZGA6JHtTSExJQl9QQVRIfQorCSAgUlVOU0hBUkVEPVNITElCX1BBVEg9YHB3ZGAke1NITElCX1BBVEg6Kzoke1NITElCX1BBVEh9fQogCSAgOzsKICAgICBPU0YqKQogCSAgTERMSUJSQVJZPSdsaWJweXRob24kKFZFUlNJT04pLnNvJwogCSAgQkxETElCUkFSWT0nLXJwYXRoICQoTElCRElSKSAtTC4gLWxweXRob24kKFZFUlNJT04pJwotCSAgUlVOU0hBUkVEPUxEX0xJQlJBUllfUEFUSD1gcHdkYDoke0xEX0xJQlJBUllfUEFUSH0KKwkgIFJVTlNIQVJFRD1MRF9MSUJSQVJZX1BBVEg9YHB3ZGAke0xEX0xJQlJBUllfUEFUSDorOiR7TERfTElCUkFSWV9QQVRIfX0KIAkgIDs7CiAgICAgYXRoZW9zKikKIAkgIExETElCUkFSWT0nbGlicHl0aG9uJChWRVJTSU9OKS5zbycKQEAgLTgxNSwxMSArOTE5LDExIEBACiAgICAgRGFyd2luKikKICAgICAJTERMSUJSQVJZPSdsaWJweXRob24kKFZFUlNJT04pLmR5bGliJwogCUJMRExJQlJBUlk9Jy1MLiAtbHB5dGhvbiQoVkVSU0lPTiknCi0JUlVOU0hBUkVEPSdEWUxEX0xJQlJBUllfUEFUSD1gcHdkYDoke0RZTERfTElCUkFSWV9QQVRIfScKKwlSVU5TSEFSRUQ9RFlMRF9MSUJSQVJZX1BBVEg9YHB3ZGAke0RZTERfTElCUkFSWV9QQVRIOis6JHtEWUxEX0xJQlJBUllfUEFUSH19CiAJOzsKICAgICBBSVgqKQogCUxETElCUkFSWT0nbGlicHl0aG9uJChWRVJTSU9OKS5zbycKLQlSVU5TSEFSRUQ9TElCUEFUSD1gcHdkYDoke0xJQlBBVEh9CisJUlVOU0hBUkVEPUxJQlBBVEg9YHB3ZGAke0xJQlBBVEg6Kzoke0xJQlBBVEh9fQogCTs7CiAKICAgZXNhYwpAQCAtODMyLDExICs5MzYsMTUgQEAKICAgZXNhYwogZmkKIAoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKwlSVU5TSEFSRUQ9CitmaQorCiBBQ19NU0dfUkVTVUxUKCRMRExJQlJBUlkpCiAKIEFDX1BST0dfUkFOTElCCiBBQ19TVUJTVChBUikKLUFDX0NIRUNLX1BST0dTKEFSLCBhciBhYWwsIGFyKQorQUNfQ0hFQ0tfVE9PTFMoQVIsIGFyIGFhbCwgYXIpCiAKICMgdHdlYWsgQVJGTEFHUyBvbmx5IGlmIHRoZSB1c2VyIGRpZG4ndCBzZXQgaXQgb24gdGhlIGNvbW1hbmQgbGluZQogQUNfU1VCU1QoQVJGTEFHUykKQEAgLTg1NCw2ICs5NjIsMjAgQEAKIAlTVk5WRVJTSU9OPSJlY2hvIFVudmVyc2lvbmVkIGRpcmVjdG9yeSIKIGZpCiAKK0FDX1NVQlNUKEJBU0VDUFBGTEFHUykKK2lmIHRlc3QgIiRhYnNfc3JjZGlyIiAhPSAiJGFic19idWlsZGRpciI7IHRoZW4KKyAgICAjIElmIHdlJ3JlIGJ1aWxkaW5nIG91dC1vZi10cmVlIG1ha2Ugc3VyZSBJbmNsdWRlIChpbiB0aGUgY3VycmVudCBkaXIpCisgICAgIyBnZXRzIHBpY2tlZCB1cCBiZWZvcmUgaXRzICRzcmNkaXIgY291bnRlcnBhcnQgaW4gb3JkZXIgZm9yIFB5dGhvbi1hc3QuaAorICAgICMgYW5kIGdyYW1pbml0LmggdG8gZ2V0IHBpY2tlZCB1cCBmcm9tIHRoZSBjb3JyZWN0IGRpcmVjdG9yeS4KKyAgICAjIChBIHNpZGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB0aGVzZSByZXNvdXJjZXMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlCisgICAgIyAgcmVnZW5lcmF0ZWQgd2hlbiBidWlsZGluZyBvdXQtb2YtdHJlZSwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdAorICAgICMgIHRoZSAkc3JjZGlyIGNvdW50ZXJwYXJ0IGlzIHVwLXRvLWRhdGUuICBUaGlzIGlzIGFuIGFjY2VwdGFibGUgdHJhZGUKKyAgICAjICBvZmYuKQorICAgIEJBU0VDUFBGTEFHUz0iLUlJbmNsdWRlIgorZWxzZQorICAgIEJBU0VDUFBGTEFHUz0iIgorZmkKKwogQUNfU1VCU1QoSEdWRVJTSU9OKQogQUNfU1VCU1QoSEdUQUcpCiBBQ19TVUJTVChIR0JSQU5DSCkKQEAgLTg3OCw2ICsxMDAwLDcgQEAKIAlmaQogZXNhYwogQUNfUFJPR19JTlNUQUxMCitBQ19QUk9HX01LRElSX1AKIAogIyBOb3QgZXZlcnkgZmlsZXN5c3RlbSBzdXBwb3J0cyBoYXJkIGxpbmtzCiBBQ19TVUJTVChMTikKQEAgLTk5NSw3ICsxMTE4LDcgQEAKICAgICAjIGlmIHVzaW5nIGdjYyBvbiBhbHBoYSwgdXNlIC1taWVlZSB0byBnZXQgKG5lYXIpIGZ1bGwgSUVFRSA3NTQKICAgICAjIHN1cHBvcnQuICBXaXRob3V0IHRoaXMsIHRyZWF0bWVudCBvZiBzdWJub3JtYWxzIGRvZXNuJ3QgZm9sbG93CiAgICAgIyB0aGUgc3RhbmRhcmQuCi0gICAgY2FzZSAkYWNfc3lzX21hY2hpbmUgaW4KKyAgICBjYXNlICRob3N0IGluCiAgICAgICAgICBhbHBoYSopCiAgICAgICAgICAgICAgICAgQkFTRUNGTEFHUz0iJEJBU0VDRkxBR1MgLW1pZWVlIgogICAgICAgICAgICAgICAgIDs7CkBAIC0xMDI2LDggKzExNDksMTQgQEAKIAogCSAgICAjIENhbGN1bGF0ZSB0aGUgcmlnaHQgZGVwbG95bWVudCB0YXJnZXQgZm9yIHRoaXMgYnVpbGQuCiAJICAgICMKLQkgICAgY3VyX3RhcmdldD1gc3dfdmVycyAtcHJvZHVjdFZlcnNpb24gfCBzZWQgJ3MvXCgxMFwuW1swLTldXSpcKS4qL1wxLydgCi0JICAgIGlmIHRlc3QgJHtjdXJfdGFyZ2V0fSAnPicgMTAuMjsgdGhlbgorCQljdXJfdGFyZ2V0X21ham9yPWBzd192ZXJzIC1wcm9kdWN0VmVyc2lvbiB8IFwKKwkJCQlzZWQgJ3MvXChbWzAtOV1dKlwpXC5cKFtbMC05XV0qXCkuKi9cMS8nYAorCQljdXJfdGFyZ2V0X21pbm9yPWBzd192ZXJzIC1wcm9kdWN0VmVyc2lvbiB8IFwKKwkJCQlzZWQgJ3MvXChbWzAtOV1dKlwpXC5cKFtbMC05XV0qXCkuKi9cMi8nYAorCQljdXJfdGFyZ2V0PSIke2N1cl90YXJnZXRfbWFqb3J9LiR7Y3VyX3RhcmdldF9taW5vcn0iCisJCWlmIHRlc3QgJHtjdXJfdGFyZ2V0X21ham9yfSAtZXEgMTAgJiYgXAorCQkgICB0ZXN0ICR7Y3VyX3RhcmdldF9taW5vcn0gLWdlIDMKKwkJdGhlbgogCQkgICAgY3VyX3RhcmdldD0xMC4zCiAJCSAgICBpZiB0ZXN0ICR7ZW5hYmxlX3VuaXZlcnNhbHNka307IHRoZW4KIAkJCSAgICBpZiB0ZXN0ICIke1VOSVZFUlNBTF9BUkNIU30iID0gImFsbCI7IHRoZW4KQEAgLTExNjYsNiArMTI5NSwxMSBAQAogCSMgZW52aXJvbm1lbnQ/CiAgICAgICAgIERhcndpbiopCiAJICAgIDs7CisgICAgICAgICMgWFhYIHRoYW5rZnVsbHkgdGhpcyB1c2VsZXNzIHRyb3VibGVtYWtlciBvZiBhIGZsYWcgaGFzIGJlZW4KKyAgICAgICAgIyBlcmFkaWNhdGVkIGluIHRoZSAzLnggbGluZS4gIEZvciBub3csIG1ha2Ugc3VyZSBpdCBpc24ndCBwaWNrZWQKKyAgICAgICAgIyB1cCBieSBhbnkgb2Ygb3VyIG90aGVyIHBsYXRmb3JtcyB0aGF0IHVzZSBDQy4KKyAgICAgICAgQUlYKnxTdW5PUyp8SFAtVVgqfElSSVgqKQorICAgICAgICAgICAgOzsKICAgICAgICAgKikKIAkgICAgQkFTRUNGTEFHUz0iJEJBU0VDRkxBR1MgLU9QVDpPbGltaXQ9MCIKIAkgICAgOzsKQEAgLTExODMsNyArMTMxNywxNCBAQAogICBDQz0iJGFjX3NhdmVfY2MiXSkKICAgQUNfTVNHX1JFU1VMVCgkYWNfY3Zfb2xpbWl0X29rKQogICBpZiB0ZXN0ICRhY19jdl9vbGltaXRfb2sgPSB5ZXM7IHRoZW4KLSAgICBCQVNFQ0ZMQUdTPSIkQkFTRUNGTEFHUyAtT2xpbWl0IDE1MDAiCisgICAgY2FzZSAkYWNfc3lzX3N5c3RlbSBpbgorICAgICAgICAjIElzc3VlICMxNjUzNDogT24gSFAtVVggYWNfY3Zfb2xpbWl0X29rPXllcyBpcyBhIGZhbHNlIHBvc2l0aXZlLgorICAgICAgICBIUC1VWCopCisgICAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICAgQkFTRUNGTEFHUz0iJEJBU0VDRkxBR1MgLU9saW1pdCAxNTAwIgorICAgICAgICAgICAgOzsKKyAgICBlc2FjCiAgIGZpCiBmaQogCkBAIC0xMTkyLDcgKzEzMzMsNyBAQAogdGhlbgogICBBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciBnY2Mgc3VwcG9ydHMgUGFyc2VUdXBsZSBfX2Zvcm1hdF9fKQogICBzYXZlX0NGTEFHUz0kQ0ZMQUdTCi0gIENGTEFHUz0iJENGTEFHUyAtV2Vycm9yIgorICBDRkxBR1M9IiRDRkxBR1MgLVdlcnJvciAtV2Zvcm1hdCIKICAgQUNfQ09NUElMRV9JRkVMU0UoWwogICAgIEFDX0xBTkdfUFJPR1JBTShbW3ZvaWQgZihjaGFyKiwuLi4pX19hdHRyaWJ1dGUoKGZvcm1hdChQeUFyZ19QYXJzZVR1cGxlLCAxLCAyKSkpO11dLCBbW11dKQogICBdLFsKQEAgLTEyMTMsNiArMTM1NCw3IEBACiBBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciBwdGhyZWFkcyBhcmUgYXZhaWxhYmxlIHdpdGhvdXQgb3B0aW9ucykKIEFDX0NBQ0hFX1ZBTChhY19jdl9wdGhyZWFkX2lzX2RlZmF1bHQsCiBbQUNfUlVOX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW1sKKyNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHB0aHJlYWQuaD4KIAogdm9pZCogcm91dGluZSh2b2lkKiBwKXtyZXR1cm4gTlVMTDt9CkBAIC0xMjQ3LDYgKzEzODksNyBAQAogW2FjX3NhdmVfY2M9IiRDQyIKIENDPSIkQ0MgLUtwdGhyZWFkIgogQUNfUlVOX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW1sKKyNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHB0aHJlYWQuaD4KIAogdm9pZCogcm91dGluZSh2b2lkKiBwKXtyZXR1cm4gTlVMTDt9CkBAIC0xMjc1LDYgKzE0MTgsNyBAQAogW2FjX3NhdmVfY2M9IiRDQyIKIENDPSIkQ0MgLUt0aHJlYWQiCiBBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbWworI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgogCiB2b2lkKiByb3V0aW5lKHZvaWQqIHApe3JldHVybiBOVUxMO30KQEAgLTEyOTksMTAgKzE0NDMsMTEgQEAKICMgc28gd2UgbmVlZCB0byBydW4gYSBwcm9ncmFtIHRvIHNlZSB3aGV0aGVyIGl0IHJlYWxseSBtYWRlIHRoZQogIyBmdW5jdGlvbiBhdmFpbGFibGUuCiBBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciAkQ0MgYWNjZXB0cyAtcHRocmVhZCkKLUFDX0NBQ0hFX1ZBTChhY19jdl90aHJlYWQsCitBQ19DQUNIRV9WQUwoYWNfY3ZfcHRocmVhZCwKIFthY19zYXZlX2NjPSIkQ0MiCiBDQz0iJENDIC1wdGhyZWFkIgogQUNfUlVOX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW1sKKyNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHB0aHJlYWQuaD4KIAogdm9pZCogcm91dGluZSh2b2lkKiBwKXtyZXR1cm4gTlVMTDt9CkBAIC0xMzY5LDkgKzE1MTQsOSBAQAogCiAjIGNoZWNrcyBmb3IgaGVhZGVyIGZpbGVzCiBBQ19IRUFERVJfU1REQwotQUNfQ0hFQ0tfSEVBREVSUyhhc20vdHlwZXMuaCBjb25pby5oIGN1cnNlcy5oIGRpcmVjdC5oIGRsZmNuLmggZXJybm8uaCBcCitBQ19DSEVDS19IRUFERVJTKGFzbS90eXBlcy5oIGNvbmlvLmggZGlyZWN0LmggZGxmY24uaCBlcnJuby5oIFwKIGZjbnRsLmggZ3JwLmggXAotaWVlZWZwLmggaW8uaCBsYW5naW5mby5oIGxpYmludGwuaCBuY3Vyc2VzLmggcG9sbC5oIHByb2Nlc3MuaCBwdGhyZWFkLmggXAoraWVlZWZwLmggaW8uaCBsYW5naW5mby5oIGxpYmludGwuaCBwb2xsLmggcHJvY2Vzcy5oIHB0aHJlYWQuaCBcCiBzaGFkb3cuaCBzaWduYWwuaCBzdGRpbnQuaCBzdHJvcHRzLmggdGVybWlvcy5oIHRocmVhZC5oIFwKIHVuaXN0ZC5oIHV0aW1lLmggXAogc3lzL2F1ZGlvaW8uaCBzeXMvYnNkdHR5Lmggc3lzL2Vwb2xsLmggc3lzL2V2ZW50Lmggc3lzL2ZpbGUuaCBzeXMvbG9hZGF2Zy5oIFwKQEAgLTEzODAsMTcgKzE1MjUsMTAgQEAKIHN5cy90ZXJtaW8uaCBzeXMvdGltZS5oIFwKIHN5cy90aW1lcy5oIHN5cy90eXBlcy5oIHN5cy91bi5oIHN5cy91dHNuYW1lLmggc3lzL3dhaXQuaCBwdHkuaCBsaWJ1dGlsLmggXAogc3lzL3Jlc291cmNlLmggbmV0cGFja2V0L3BhY2tldC5oIHN5c2V4aXRzLmggYmx1ZXRvb3RoLmggXAotYmx1ZXRvb3RoL2JsdWV0b290aC5oIGxpbnV4L3RpcGMuaCBzcGF3bi5oIHV0aWwuaCkKK2JsdWV0b290aC9ibHVldG9vdGguaCBsaW51eC90aXBjLmggc3Bhd24uaCB1dGlsLmggYWxsb2NhLmgpCiBBQ19IRUFERVJfRElSRU5UCiBBQ19IRUFERVJfTUFKT1IKIAotIyBPbiBTb2xhcmlzLCB0ZXJtLmggcmVxdWlyZXMgY3Vyc2VzLmgKLUFDX0NIRUNLX0hFQURFUlModGVybS5oLCwsWwotI2lmZGVmIEhBVkVfQ1VSU0VTX0gKLSNpbmNsdWRlIDxjdXJzZXMuaD4KLSNlbmRpZgotXSkKLQogIyBPbiBMaW51eCwgbmV0bGluay5oIHJlcXVpcmVzIGFzbS90eXBlcy5oCiBBQ19DSEVDS19IRUFERVJTKGxpbnV4L25ldGxpbmsuaCwsLFsKICNpZmRlZiBIQVZFX0FTTV9UWVBFU19ICkBAIC0xNDg2LDEwICsxNjI0LDMwIEBACiBBQ19ERUZJTkVfVU5RVU9URUQoW1JFVFNJR1RZUEVdLFt2b2lkXSxbYXNzdW1lIEM4OSBzZW1hbnRpY3MgdGhhdCBSRVRTSUdUWVBFIGlzIGFsd2F5cyB2b2lkXSkKIEFDX1RZUEVfU0laRV9UCiBBQ19UWVBFX1VJRF9UCisKKyMgVGhlcmUgYXJlIHR3byBzZXBhcmF0ZSBjaGVja3MgZm9yIGVhY2ggb2YgdGhlIGV4YWN0LXdpZHRoIGludGVnZXIgdHlwZXMgd2UKKyMgbmVlZC4gIEZpcnN0IHdlIGNoZWNrIHdoZXRoZXIgdGhlIHR5cGUgaXMgYXZhaWxhYmxlIHVzaW5nIHRoZSB1c3VhbAorIyBBQ19DSEVDS19UWVBFIG1hY3JvIHdpdGggdGhlIGRlZmF1bHQgaW5jbHVkZXMgKHdoaWNoIGluY2x1ZGVzIDxpbnR0eXBlcy5oPgorIyBhbmQgPHN0ZGludC5oPiB3aGVyZSBhdmFpbGFibGUpLiAgV2UgdGhlbiBhbHNvIHVzZSB0aGUgc3BlY2lhbCB0eXBlIGNoZWNrcyBvZgorIyB0aGUgZm9ybSBBQ19UWVBFX1VJTlQzMl9ULCB3aGljaCBpbiB0aGUgY2FzZSB0aGF0IHVpbnQzMl90IGlzIG5vdCBhdmFpbGFibGUKKyMgZGlyZWN0bHksICNkZWZpbmUncyB1aW50MzJfdCB0byBiZSBhIHN1aXRhYmxlIHR5cGUuCisKK0FDX0NIRUNLX1RZUEUodWludDMyX3QsCisgIEFDX0RFRklORShIQVZFX1VJTlQzMl9ULCAxLCBbRGVmaW5lIGlmIHlvdXIgY29tcGlsZXIgcHJvdmlkZXMgdWludDMyX3QuXSksLCkKIEFDX1RZUEVfVUlOVDMyX1QKKworQUNfQ0hFQ0tfVFlQRSh1aW50NjRfdCwKKyAgQUNfREVGSU5FKEhBVkVfVUlOVDY0X1QsIDEsIFtEZWZpbmUgaWYgeW91ciBjb21waWxlciBwcm92aWRlcyB1aW50NjRfdC5dKSwsKQogQUNfVFlQRV9VSU5UNjRfVAorCitBQ19DSEVDS19UWVBFKGludDMyX3QsCisgIEFDX0RFRklORShIQVZFX0lOVDMyX1QsIDEsIFtEZWZpbmUgaWYgeW91ciBjb21waWxlciBwcm92aWRlcyBpbnQzMl90Ll0pLCwpCiBBQ19UWVBFX0lOVDMyX1QKKworQUNfQ0hFQ0tfVFlQRShpbnQ2NF90LAorICBBQ19ERUZJTkUoSEFWRV9JTlQ2NF9ULCAxLCBbRGVmaW5lIGlmIHlvdXIgY29tcGlsZXIgcHJvdmlkZXMgaW50NjRfdC5dKSwsKQogQUNfVFlQRV9JTlQ2NF9UCisKIEFDX0NIRUNLX1RZUEUoc3NpemVfdCwKICAgQUNfREVGSU5FKEhBVkVfU1NJWkVfVCwgMSwgW0RlZmluZSBpZiB5b3VyIGNvbXBpbGVyIHByb3ZpZGVzIHNzaXplX3RdKSwsKQogCkBAIC0xNjQzLDcgKzE4MDEsNiBAQAogZXNhYwogCiAKLUFSQ0hfUlVOXzMyQklUPSIiCiBBQ19TVUJTVChMSUJUT09MX0NSVUZUKQogY2FzZSAkYWNfc3lzX3N5c3RlbS8kYWNfc3lzX3JlbGVhc2UgaW4KICAgRGFyd2luL0A8OkAwMTU2N0A6PkBcLi4qKSAKQEAgLTE4NDIsMTUgKzE5OTksMTQgQEAKIAkJIyBVc2UgLXVuZGVmaW5lZCBkeW5hbWljX2xvb2t1cCB3aGVuZXZlciBwb3NzaWJsZSAoMTAuMyBhbmQgbGF0ZXIpLgogCQkjIFRoaXMgYWxsb3dzIGFuIGV4dGVuc2lvbiB0byBiZSB1c2VkIGluIGFueSBQeXRob24KIAotCQlpZiB0ZXN0ICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSAnPicgMTAuMgorCQlkZXBfdGFyZ2V0X21ham9yPWBlY2hvICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSB8IFwKKwkJCQlzZWQgJ3MvXChbWzAtOV1dKlwpXC5cKFtbMC05XV0qXCkuKi9cMS8nYAorCQlkZXBfdGFyZ2V0X21pbm9yPWBlY2hvICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSB8IFwKKwkJCQlzZWQgJ3MvXChbWzAtOV1dKlwpXC5cKFtbMC05XV0qXCkuKi9cMi8nYAorCQlpZiB0ZXN0ICR7ZGVwX3RhcmdldF9tYWpvcn0gLWVxIDEwICYmIFwKKwkJICAgdGVzdCAke2RlcF90YXJnZXRfbWlub3J9IC1sZSAyCiAJCXRoZW4KLQkJCWlmIHRlc3QgIiR7ZW5hYmxlX3VuaXZlcnNhbHNka30iOyB0aGVuCi0JCQkJTERGTEFHUz0iJHtVTklWRVJTQUxfQVJDSF9GTEFHU30gLWlzeXNyb290ICR7VU5JVkVSU0FMU0RLfSAke0xERkxBR1N9IgotCQkJZmkKLQkJCUxEU0hBUkVEPSckKENDKSAtYnVuZGxlIC11bmRlZmluZWQgZHluYW1pY19sb29rdXAnCi0JCQlMRENYWFNIQVJFRD0nJChDWFgpIC1idW5kbGUgLXVuZGVmaW5lZCBkeW5hbWljX2xvb2t1cCcKLQkJCUJMRFNIQVJFRD0iJExEU0hBUkVEIgotCQllbHNlCisJCQkjIGJ1aWxkaW5nIGZvciBPUyBYIDEwLjAgdGhyb3VnaCAxMC4yCiAJCQlMRFNIQVJFRD0nJChDQykgLWJ1bmRsZScKIAkJCUxEQ1hYU0hBUkVEPSckKENYWCkgLWJ1bmRsZScKIAkJCWlmIHRlc3QgIiRlbmFibGVfZnJhbWV3b3JrIiA7IHRoZW4KQEAgLTE4NjQsNiArMjAyMCwxNCBAQAogCQkJCUxEU0hBUkVEPSIkTERTSEFSRUQgIictYnVuZGxlX2xvYWRlciAkKEJJTkRJUikvcHl0aG9uJChWRVJTSU9OKSQoRVhFKScKIAkJCQlMRENYWFNIQVJFRD0iJExEQ1hYU0hBUkVEICInLWJ1bmRsZV9sb2FkZXIgJChCSU5ESVIpL3B5dGhvbiQoVkVSU0lPTikkKEVYRSknCiAJCQlmaQorCQllbHNlCisJCQkjIGJ1aWxkaW5nIGZvciBPUyBYIDEwLjMgYW5kIGxhdGVyCisJCQlpZiB0ZXN0ICIke2VuYWJsZV91bml2ZXJzYWxzZGt9IjsgdGhlbgorCQkJCUxERkxBR1M9IiR7VU5JVkVSU0FMX0FSQ0hfRkxBR1N9IC1pc3lzcm9vdCAke1VOSVZFUlNBTFNES30gJHtMREZMQUdTfSIKKwkJCWZpCisJCQlMRFNIQVJFRD0nJChDQykgLWJ1bmRsZSAtdW5kZWZpbmVkIGR5bmFtaWNfbG9va3VwJworCQkJTERDWFhTSEFSRUQ9JyQoQ1hYKSAtYnVuZGxlIC11bmRlZmluZWQgZHluYW1pY19sb29rdXAnCisJCQlCTERTSEFSRUQ9IiRMRFNIQVJFRCIKIAkJZmkKIAkJOzsKIAlMaW51eCp8R05VKnxRTlgqKQpAQCAtMjEzMSw2ICsyMjk1LDM0IEBACiAKIEFDX01TR19SRVNVTFQoJHdpdGhfc3lzdGVtX2ZmaSkKIAorIyBDaGVjayBmb3IgLS13aXRoLXRjbHRrLWluY2x1ZGVzPXBhdGggYW5kIC0td2l0aC10Y2x0ay1saWJzPXBhdGgKK0FDX1NVQlNUKFRDTFRLX0lOQ0xVREVTKQorQUNfU1VCU1QoVENMVEtfTElCUykKK0FDX01TR19DSEVDS0lORyhmb3IgLS13aXRoLXRjbHRrLWluY2x1ZGVzKQorQUNfQVJHX1dJVEgodGNsdGstaW5jbHVkZXMsCisgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS13aXRoLXRjbHRrLWluY2x1ZGVzPSctSS4uLiddLCBbb3ZlcnJpZGUgc2VhcmNoIGZvciBUY2wgYW5kIFRrIGluY2x1ZGUgZmlsZXNdKSwKKyAgICAgICAgICAgIFtdLAorICAgICAgICAgICAgW3dpdGhfdGNsdGtfaW5jbHVkZXM9ImRlZmF1bHQiXSkKK0FDX01TR19SRVNVTFQoJHdpdGhfdGNsdGtfaW5jbHVkZXMpCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIC0td2l0aC10Y2x0ay1saWJzKQorQUNfQVJHX1dJVEgodGNsdGstbGlicywKKyAgICAgICAgICAgIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtdGNsdGstbGlicz0nLUwuLi4nXSwgW292ZXJyaWRlIHNlYXJjaCBmb3IgVGNsIGFuZCBUayBsaWJzXSksCisgICAgICAgICAgICBbXSwKKyAgICAgICAgICAgIFt3aXRoX3RjbHRrX2xpYnM9ImRlZmF1bHQiXSkKK0FDX01TR19SRVNVTFQoJHdpdGhfdGNsdGtfbGlicykKK2lmIHRlc3QgIngkd2l0aF90Y2x0a19pbmNsdWRlcyIgPSB4ZGVmYXVsdCB8fCB0ZXN0ICJ4JHdpdGhfdGNsdGtfbGlicyIgPSB4ZGVmYXVsdAordGhlbgorICBpZiB0ZXN0ICJ4JHdpdGhfdGNsdGtfaW5jbHVkZXMiICE9ICJ4JHdpdGhfdGNsdGtfbGlicyIKKyAgdGhlbgorICAgIEFDX01TR19FUlJPUihbdXNlIGJvdGggLS13aXRoLXRjbHRrLWluY2x1ZGVzPScuLi4nIGFuZCAtLXdpdGgtdGNsdGstbGlicz0nLi4uJyBvciBuZWl0aGVyXSkKKyAgZmkKKyAgVENMVEtfSU5DTFVERVM9IiIKKyAgVENMVEtfTElCUz0iIgorZWxzZQorICBUQ0xUS19JTkNMVURFUz0iJHdpdGhfdGNsdGtfaW5jbHVkZXMiCisgIFRDTFRLX0xJQlM9IiR3aXRoX3RjbHRrX2xpYnMiCitmaQorCiAjIENoZWNrIGZvciAtLXdpdGgtZGJtbGlib3JkZXIKIEFDX01TR19DSEVDS0lORyhmb3IgLS13aXRoLWRibWxpYm9yZGVyKQogQUNfQVJHX1dJVEgoZGJtbGlib3JkZXIsCkBAIC0yMjk3LDcgKzI0ODksOSBAQAogICAgIF9saWJzPSRMSUJTCiAgICAgTElCUz0iJExJQlMgLWxwdGhyZWFkIgogICAgIEFDX01TR19DSEVDS0lORyhbZm9yIHB0aHJlYWRfY3JlYXRlIGluIC1scHRocmVhZF0pCi0gICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyNpbmNsdWRlIDxwdGhyZWFkLmg+CisgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgogCiB2b2lkICogc3RhcnRfcm91dGluZSAodm9pZCAqYXJnKSB7IGV4aXQgKDApOyB9XV0sIFtbCiBwdGhyZWFkX2NyZWF0ZSAoTlVMTCwgTlVMTCwgc3RhcnRfcm91dGluZSwgTlVMTCldXSldLFsKQEAgLTIzODAsNyArMjU3NCw5IEBACiAKICAgICAgIEFDX01TR19DSEVDS0lORyhpZiBQVEhSRUFEX1NDT1BFX1NZU1RFTSBpcyBzdXBwb3J0ZWQpCiAgICAgICBBQ19DQUNIRV9WQUwoYWNfY3ZfcHRocmVhZF9zeXN0ZW1fc3VwcG9ydGVkLAotICAgICAgW0FDX1JVTl9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtbI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyAgICAgIFtBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbWworICAgICAgI2luY2x1ZGUgPHN0ZGlvLmg+CisgICAgICAjaW5jbHVkZSA8cHRocmVhZC5oPgogICAgICAgdm9pZCAqZm9vKHZvaWQgKnBhcm0pIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICB9CkBAIC0yNDA3LDYgKzI2MDMsNyBAQAogICAgICAgICAgICAgW0RlZmluZSBpZiBwdGhyZWFkX3NpZ21hc2soKSBkb2VzIG5vdCB3b3JrIG9uIHlvdXIgc3lzdGVtLl0pCiAgICAgICAgICAgICA7OwogICAgICAgICBlc2FjXSkKKyAgICAgIEFDX0NIRUNLX0ZVTkNTKHB0aHJlYWRfYXRmb3JrKQogZmkKIAogCkBAIC0yNDI5LDI1ICsyNjI2LDE1IEBACiAKIFsKIGRubCB0aGUgY2hlY2sgZG9lcyBub3Qgd29yayBvbiBjcm9zcyBjb21waWxhdGlvbiBjYXNlLi4uCi0gIEFDX1JVTl9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtbIC8qIEFGX0lORVQ2IGF2YWlsYWJsZSBjaGVjayAqLworICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbIC8qIEFGX0lORVQ2IGF2YWlsYWJsZSBjaGVjayAqLwogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLW1haW4oKQotewotIGlmIChzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfU1RSRUFNLCAwKSA8IDApCi0gICBleGl0KDEpOwotIGVsc2UKLSAgIGV4aXQoMCk7Ci19Ci1dXSldLFsKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+XV0sCitbW2ludCBkb21haW4gPSBBRl9JTkVUNjtdXSldLFsKICAgQUNfTVNHX1JFU1VMVCh5ZXMpCiAgIGlwdjY9eWVzCiBdLFsKICAgQUNfTVNHX1JFU1VMVChubykKICAgaXB2Nj1ubwotXSxbCi0gIEFDX01TR19SRVNVTFQobm8pCi0gIGlwdjY9bm8KIF0pCiAKIGlmIHRlc3QgIiRpcHY2IiA9ICJ5ZXMiOyB0aGVuCkBAIC0yNzI0LDcgKzI5MTEsNyBAQAogIGNsb2NrIGNvbmZzdHIgY3Rlcm1pZCBleGVjdiBmY2htb2QgZmNob3duIGZvcmsgZnBhdGhjb25mIGZ0aW1lIGZ0cnVuY2F0ZSBcCiAgZ2FpX3N0cmVycm9yIGdldGdyb3VwcyBnZXRsb2dpbiBnZXRsb2FkYXZnIGdldHBlZXJuYW1lIGdldHBnaWQgZ2V0cGlkIFwKICBnZXRwcmlvcml0eSBnZXRyZXN1aWQgZ2V0cmVzZ2lkIGdldHB3ZW50IGdldHNwbmFtIGdldHNwZW50IGdldHNpZCBnZXR3ZCBcCi0gaW5pdGdyb3VwcyBraWxsIGtpbGxwZyBsY2htb2QgbGNob3duIGxzdGF0IG1rZmlmbyBta25vZCBta3RpbWUgXAorIGluaXRncm91cHMga2lsbCBraWxscGcgbGNobW9kIGxjaG93biBsc3RhdCBta2ZpZm8gbWtub2QgbWt0aW1lIG1tYXAgXAogIG1yZW1hcCBuaWNlIHBhdGhjb25mIHBhdXNlIHBsb2NrIHBvbGwgcHRocmVhZF9pbml0IFwKICBwdXRlbnYgcmVhZGxpbmsgcmVhbHBhdGggXAogIHNlbGVjdCBzZW1fb3BlbiBzZW1fdGltZWR3YWl0IHNlbV9nZXR2YWx1ZSBzZW1fdW5saW5rIHNldGVnaWQgc2V0ZXVpZCBcCkBAIC0zMDQ2LDYgKzMyMzMsNyBAQAogICBBQ19NU0dfQ0hFQ0tJTkcoZ2V0YWRkcmluZm8gYnVnKQogICBBQ19DQUNIRV9WQUwoYWNfY3ZfYnVnZ3lfZ2V0YWRkcmluZm8sCiAgIEFDX1JVTl9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtbWworI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8bmV0ZGIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTMxMzQsNyArMzMyMiwxMiBAQAogXV1dKV0sCiBbYWNfY3ZfYnVnZ3lfZ2V0YWRkcmluZm89bm9dLAogW2FjX2N2X2J1Z2d5X2dldGFkZHJpbmZvPXllc10sCi1bYWNfY3ZfYnVnZ3lfZ2V0YWRkcmluZm89eWVzXSkpCitbCitpZiB0ZXN0ICIke2VuYWJsZV9pcHY2K3NldH0iID0gc2V0OyB0aGVuCisgIGFjX2N2X2J1Z2d5X2dldGFkZHJpbmZvPSJubyAtLSBjb25maWd1cmVkIHdpdGggLS0oZW58ZGlzKWFibGUtaXB2NiIKK2Vsc2UKKyAgYWNfY3ZfYnVnZ3lfZ2V0YWRkcmluZm89eWVzCitmaV0pKQogZmkKIAogQUNfTVNHX1JFU1VMVCgkYWNfY3ZfYnVnZ3lfZ2V0YWRkcmluZm8pCkBAIC0zNzc2LDYgKzM5NjksNyBAQAogdWNzNCkgdW5pY29kZV9zaXplPSI0IgogICAgICAgQUNfREVGSU5FKFB5X1VOSUNPREVfU0laRSw0KQogICAgICAgOzsKK25vKSAgIDs7ICAgICAgIyBUbyBhbGxvdyAtLWRpc2FibGUtdW5pY29kZQogKikgQUNfTVNHX0VSUk9SKFtpbnZhbGlkIHZhbHVlIGZvciAtLWVuYWJsZS11bmljb2RlLiBVc2UgZWl0aGVyIHVjczIgb3IgdWNzNCAobG93ZXJjYXNlKS5dKSA7OwogZXNhYwogCkBAIC00MTA4LDYgKzQzMDIsMTkgQEAKICAgW0RlZmluZSBpZiB5b3UgaGF2ZSBzdHJ1Y3Qgc3RhdC5zdF9tdGltZW5zZWNdKQogZmkKIAorIyBmaXJzdCBjdXJzZXMgY29uZmlndXJlIGNoZWNrCithY19zYXZlX2NwcGZsYWdzPSIkQ1BQRkxBR1MiCitDUFBGTEFHUz0iJENQUEZMQUdTIC1JL3Vzci9pbmNsdWRlL25jdXJzZXN3IgorCitBQ19DSEVDS19IRUFERVJTKGN1cnNlcy5oIG5jdXJzZXMuaCkKKworIyBPbiBTb2xhcmlzLCB0ZXJtLmggcmVxdWlyZXMgY3Vyc2VzLmgKK0FDX0NIRUNLX0hFQURFUlModGVybS5oLCwsWworI2lmZGVmIEhBVkVfQ1VSU0VTX0gKKyNpbmNsdWRlIDxjdXJzZXMuaD4KKyNlbmRpZgorXSkKKwogIyBPbiBIUC9VWCAxMS4wLCBtdndkZWxjaCBpcyBhIGJsb2NrIHdpdGggYSByZXR1cm4gc3RhdGVtZW50CiBBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciBtdndkZWxjaCBpcyBhbiBleHByZXNzaW9uKQogQUNfQ0FDSEVfVkFMKGFjX2N2X212d2RlbGNoX2lzX2V4cHJlc3Npb24sCkBAIC00MTYyLDI3ICs0MzY5LDM0IEBACiAgICBBQ19NU0dfUkVTVUxUKHllcyldLAogICBbQUNfTVNHX1JFU1VMVChubyldCiApCisjIGxhc3QgY3Vyc2VzIGNvbmZpZ3VyZSBjaGVjaworQ1BQRkxBR1M9JGFjX3NhdmVfY3BwZmxhZ3MKIAotQUNfTVNHX0NIRUNLSU5HKGZvciAvZGV2L3B0bXgpCitBQ19NU0dfTk9USUNFKFtjaGVja2luZyBmb3IgZGV2aWNlIGZpbGVzXSkKIAotaWYgdGVzdCAtciAvZGV2L3B0bXgKLXRoZW4KLSAgQUNfTVNHX1JFU1VMVCh5ZXMpCi0gIEFDX0RFRklORShIQVZFX0RFVl9QVE1YLCAxLAotICBbRGVmaW5lIGlmIHdlIGhhdmUgL2Rldi9wdG14Ll0pCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm8pCitkbmwgTk9URTogSW5mb3JtIHVzZXIgaG93IHRvIHByb2NlZWQgd2l0aCBmaWxlcyB3aGVuIGNyb3NzIGNvbXBpbGluZy4KK2lmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9IHh5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJHthY19jdl9maWxlX19kZXZfcHRteCtzZXR9IiAhPSBzZXQ7IHRoZW4KKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAvZGV2L3B0bXhdKQorICAgIEFDX01TR19SRVNVTFQoW25vdCBzZXRdKQorICAgIEFDX01TR19FUlJPUihbc2V0IGFjX2N2X2ZpbGVfX2Rldl9wdG14IHRvIHllcy9ubyBpbiB5b3VyIENPTkZJR19TSVRFIGZpbGUgd2hlbiBjcm9zcyBjb21waWxpbmddKQorICBmaQorICBpZiB0ZXN0ICIke2FjX2N2X2ZpbGVfX2Rldl9wdGMrc2V0fSIgIT0gc2V0OyB0aGVuCisgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgL2Rldi9wdGNdKQorICAgIEFDX01TR19SRVNVTFQoW25vdCBzZXRdKQorICAgIEFDX01TR19FUlJPUihbc2V0IGFjX2N2X2ZpbGVfX2Rldl9wdGMgdG8geWVzL25vIGluIHlvdXIgQ09ORklHX1NJVEUgZmlsZSB3aGVuIGNyb3NzIGNvbXBpbGluZ10pCisgIGZpCiBmaQogCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIC9kZXYvcHRjKQotCi1pZiB0ZXN0IC1yIC9kZXYvcHRjCi10aGVuCi0gIEFDX01TR19SRVNVTFQoeWVzKQorQUNfQ0hFQ0tfRklMRSgvZGV2L3B0bXgsIFtdLCBbXSkKK2lmIHRlc3QgIngkYWNfY3ZfZmlsZV9fZGV2X3B0bXgiID0geHllczsgdGhlbgorICBBQ19ERUZJTkUoSEFWRV9ERVZfUFRNWCwgMSwKKyAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSAvZGV2L3B0bXggZGV2aWNlIGZpbGUuXSkKK2ZpCitBQ19DSEVDS19GSUxFKC9kZXYvcHRjLCBbXSwgW10pCitpZiB0ZXN0ICJ4JGFjX2N2X2ZpbGVfX2Rldl9wdGMiID0geHllczsgdGhlbgogICBBQ19ERUZJTkUoSEFWRV9ERVZfUFRDLCAxLAotICBbRGVmaW5lIGlmIHdlIGhhdmUgL2Rldi9wdGMuXSkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKKyAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSAvZGV2L3B0YyBkZXZpY2UgZmlsZS5dKQogZmkKIAogaWYgdGVzdCAiJGhhdmVfbG9uZ19sb25nIiA9IHllcwpAQCAtNDIyMiw3ICs0NDM2LDIzIEBACiAgIF1dXSldLAogICBbYWNfY3ZfaGF2ZV9sb25nX2xvbmdfZm9ybWF0PXllc10sCiAgIFthY19jdl9oYXZlX2xvbmdfbG9uZ19mb3JtYXQ9bm9dLAotICBbYWNfY3ZfaGF2ZV9sb25nX2xvbmdfZm9ybWF0PW5vXSkKKyAgW2FjX2N2X2hhdmVfbG9uZ19sb25nX2Zvcm1hdD0iY3Jvc3MgLS0gYXNzdW1pbmcgbm8iCisgICBpZiB0ZXN0IHgkR0NDID0geHllczsgdGhlbgorICAgIHNhdmVfQ0ZMQUdTPSRDRkxBR1MKKyAgICBDRkxBR1M9IiRDRkxBR1MgLVdlcnJvciAtV2Zvcm1hdCIKKyAgICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisgICAgICAgICNpbmNsdWRlIDxzdGRpby5oPgorICAgICAgICAjaW5jbHVkZSA8c3RkZGVmLmg+CisgICAgICBdXSwgW1sKKyAgICAgIGNoYXIgKmJ1ZmZlcjsKKyAgICAgIHNwcmludGYoYnVmZmVyLCAiJWxsZCIsIChsb25nIGxvbmcpMTIzKTsKKyAgICAgIHNwcmludGYoYnVmZmVyLCAiJWxsZCIsIChsb25nIGxvbmcpLTEyMyk7CisgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiVsbHUiLCAodW5zaWduZWQgbG9uZyBsb25nKTEyMyk7CisgICAgICBdXSldLAorICAgICAgYWNfY3ZfaGF2ZV9sb25nX2xvbmdfZm9ybWF0PXllcworICAgICkKKyAgICBDRkxBR1M9JHNhdmVfQ0ZMQUdTCisgICBmaV0pCiAgICkKICAgQUNfTVNHX1JFU1VMVCgkYWNfY3ZfaGF2ZV9sb25nX2xvbmdfZm9ybWF0KQogZmkKZGlmZiAtLWdpdCBhL3B5Y29uZmlnLmguaW4gYi9weWNvbmZpZy5oLmluCmluZGV4IGI5ZGEzZDkuLmQ2ZDQ3OWEgMTAwNjQ0Ci0tLSBhL3B5Y29uZmlnLmguaW4KKysrIGIvcHljb25maWcuaC5pbgpAQCAtMSw0ICsxLDQgQEAKLS8qIHB5Y29uZmlnLmguaW4uICBHZW5lcmF0ZWQgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCisvKiBweWNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmFjIGJ5IGF1dG9oZWFkZXIuICAqLwogCiAKICNpZm5kZWYgUHlfUFlDT05GSUdfSApAQCAtNTUsNiArNTUsOSBAQAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhbGFybScgZnVuY3Rpb24uICovCiAjdW5kZWYgSEFWRV9BTEFSTQogCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGFsbG9jYS5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0FMTE9DQV9ICisKIC8qIERlZmluZSB0aGlzIGlmIHlvdXIgdGltZS5oIGRlZmluZXMgYWx0em9uZS4gKi8KICN1bmRlZiBIQVZFX0FMVFpPTkUKIApAQCAtMTYxLDEwICsxNjQsMTAgQEAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZXZpY2UgbWFjcm9zLiAqLwogI3VuZGVmIEhBVkVfREVWSUNFX01BQ1JPUwogCi0vKiBEZWZpbmUgaWYgd2UgaGF2ZSAvZGV2L3B0Yy4gKi8KKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSAvZGV2L3B0YyBkZXZpY2UgZmlsZS4gKi8KICN1bmRlZiBIQVZFX0RFVl9QVEMKIAotLyogRGVmaW5lIGlmIHdlIGhhdmUgL2Rldi9wdG14LiAqLworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIC9kZXYvcHRteCBkZXZpY2UgZmlsZS4gKi8KICN1bmRlZiBIQVZFX0RFVl9QVE1YCiAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZGlyZWN0Lmg+IGhlYWRlciBmaWxlLiAqLwpAQCAtMzcwLDYgKzM3MywxMiBAQAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpbml0Z3JvdXBzJyBmdW5jdGlvbi4gKi8KICN1bmRlZiBIQVZFX0lOSVRHUk9VUFMKIAorLyogRGVmaW5lIGlmIHlvdXIgY29tcGlsZXIgcHJvdmlkZXMgaW50MzJfdC4gKi8KKyN1bmRlZiBIQVZFX0lOVDMyX1QKKworLyogRGVmaW5lIGlmIHlvdXIgY29tcGlsZXIgcHJvdmlkZXMgaW50NjRfdC4gKi8KKyN1bmRlZiBIQVZFX0lOVDY0X1QKKwogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KICN1bmRlZiBIQVZFX0lOVFRZUEVTX0gKIApAQCAtNDY2LDYgKzQ3NSw5IEBACiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1rdGltZScgZnVuY3Rpb24uICovCiAjdW5kZWYgSEFWRV9NS1RJTUUKIAorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtbWFwJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX01NQVAKKwogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtcmVtYXAnIGZ1bmN0aW9uLiAqLwogI3VuZGVmIEhBVkVfTVJFTUFQCiAKQEAgLTUxMSw2ICs1MjMsOSBAQAogLyogRGVmaW5lIGlmIHlvdSBoYXZlIEdOVSBQVEggdGhyZWFkcy4gKi8KICN1bmRlZiBIQVZFX1BUSAogCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHB0aHJlYWRfYXRmb3JrJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1BUSFJFQURfQVRGT1JLCisKIC8qIERlZmluZWQgZm9yIFNvbGFyaXMgMi42IGJ1ZyBpbiBwdGhyZWFkIGhlYWRlci4gKi8KICN1bmRlZiBIQVZFX1BUSFJFQURfREVTVFJVQ1RPUgogCkBAIC04NDcsNiArODYyLDEyIEBACiAvKiBEZWZpbmUgdGhpcyBpZiB5b3UgaGF2ZSB0Y2wgYW5kIFRDTF9VVEZfTUFYPT02ICovCiAjdW5kZWYgSEFWRV9VQ1M0X1RDTAogCisvKiBEZWZpbmUgaWYgeW91ciBjb21waWxlciBwcm92aWRlcyB1aW50MzJfdC4gKi8KKyN1bmRlZiBIQVZFX1VJTlQzMl9UCisKKy8qIERlZmluZSBpZiB5b3VyIGNvbXBpbGVyIHByb3ZpZGVzIHVpbnQ2NF90LiAqLworI3VuZGVmIEhBVkVfVUlOVDY0X1QKKwogLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYHVpbnRwdHJfdCcuICovCiAjdW5kZWYgSEFWRV9VSU5UUFRSX1QKIApkaWZmIC0tZ2l0IGEvc2V0dXAucHkgYi9zZXR1cC5weQppbmRleCA2YjQ3NDUxLi5hNDZiZjM1IDEwMDY0NAotLS0gYS9zZXR1cC5weQorKysgYi9zZXR1cC5weQpAQCAtMTcsOCArMTcsMjAgQEAKIGZyb20gZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9saWIgaW1wb3J0IGluc3RhbGxfbGliCiBmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgZmluZF9leGVjdXRhYmxlCiAKK2Nyb3NzX2NvbXBpbGluZyA9ICJfUFlUSE9OX0hPU1RfUExBVEZPUk0iIGluIG9zLmVudmlyb24KKworZGVmIGdldF9wbGF0Zm9ybSgpOgorICAgICMgY3Jvc3MgYnVpbGQKKyAgICBpZiAiX1BZVEhPTl9IT1NUX1BMQVRGT1JNIiBpbiBvcy5lbnZpcm9uOgorICAgICAgICByZXR1cm4gb3MuZW52aXJvblsiX1BZVEhPTl9IT1NUX1BMQVRGT1JNIl0KKyAgICAjIEdldCB2YWx1ZSBvZiBzeXMucGxhdGZvcm0KKyAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnb3NmMScpOgorICAgICAgICByZXR1cm4gJ29zZjEnCisgICAgcmV0dXJuIHN5cy5wbGF0Zm9ybQoraG9zdF9wbGF0Zm9ybSA9IGdldF9wbGF0Zm9ybSgpCisKICMgV2VyZSB3ZSBjb21waWxlZCAtLXdpdGgtcHlkZWJ1ZyBvciB3aXRoICNkZWZpbmUgUHlfREVCVUc/Ci1DT01QSUxFRF9XSVRIX1BZREVCVUcgPSBoYXNhdHRyKHN5cywgJ2dldHRvdGFscmVmY291bnQnKQorQ09NUElMRURfV0lUSF9QWURFQlVHID0gKCctLXdpdGgtcHlkZWJ1ZycgaW4gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCJDT05GSUdfQVJHUyIpKQogCiAjIFRoaXMgZ2xvYmFsIHZhcmlhYmxlIGlzIHVzZWQgdG8gaG9sZCB0aGUgbGlzdCBvZiBtb2R1bGVzIHRvIGJlIGRpc2FibGVkLgogZGlzYWJsZWRfbW9kdWxlX2xpc3QgPSBbXQpAQCAtNDcsNyArNTksOSBAQAogICAgICIiIgogICAgIFJldHVybnMgVHJ1ZSBpZiAncGF0aCcgY2FuIGJlIGxvY2F0ZWQgaW4gYW4gT1NYIFNESwogICAgICIiIgotICAgIHJldHVybiAocGF0aC5zdGFydHN3aXRoKCcvdXNyLycpIGFuZCBub3QgcGF0aC5zdGFydHN3aXRoKCcvdXNyL2xvY2FsJykpIG9yIHBhdGguc3RhcnRzd2l0aCgnL1N5c3RlbS8nKQorICAgIHJldHVybiAoIChwYXRoLnN0YXJ0c3dpdGgoJy91c3IvJykgYW5kIG5vdCBwYXRoLnN0YXJ0c3dpdGgoJy91c3IvbG9jYWwnKSkKKyAgICAgICAgICAgICAgICBvciBwYXRoLnN0YXJ0c3dpdGgoJy9TeXN0ZW0vJykKKyAgICAgICAgICAgICAgICBvciBwYXRoLnN0YXJ0c3dpdGgoJy9MaWJyYXJ5LycpICkKIAogZGVmIGZpbmRfZmlsZShmaWxlbmFtZSwgc3RkX2RpcnMsIHBhdGhzKToKICAgICAiIiJTZWFyY2hlcyBmb3IgdGhlIGRpcmVjdG9yeSB3aGVyZSBhIGdpdmVuIGZpbGUgaXMgbG9jYXRlZCwKQEAgLTYwLDcgKzc0LDcgQEAKICAgICAncGF0aHMnIGlzIGEgbGlzdCBvZiBhZGRpdGlvbmFsIGxvY2F0aW9ucyB0byBjaGVjazsgaWYgdGhlIGZpbGUgaXMKICAgICAgICAgZm91bmQgaW4gb25lIG9mIHRoZW0sIHRoZSByZXN1bHRpbmcgbGlzdCB3aWxsIGNvbnRhaW4gdGhlIGRpcmVjdG9yeS4KICAgICAiIiIKLSAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgaWYgaG9zdF9wbGF0Zm9ybSA9PSAnZGFyd2luJzoKICAgICAgICAgIyBIb25vciB0aGUgTWFjT1NYIFNESyBzZXR0aW5nIHdoZW4gb25lIHdhcyBzcGVjaWZpZWQuCiAgICAgICAgICMgQW4gU0RLIGlzIGEgZGlyZWN0b3J5IHdpdGggdGhlIHNhbWUgc3RydWN0dXJlIGFzIGEgcmVhbAogICAgICAgICAjIHN5c3RlbSwgYnV0IHdpdGggb25seSBoZWFkZXIgZmlsZXMgYW5kIGxpYnJhcmllcy4KQEAgLTcwLDcgKzg0LDcgQEAKICAgICBmb3IgZGlyIGluIHN0ZF9kaXJzOgogICAgICAgICBmID0gb3MucGF0aC5qb2luKGRpciwgZmlsZW5hbWUpCiAKLSAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nIGFuZCBpc19tYWNvc3hfc2RrX3BhdGgoZGlyKToKKyAgICAgICAgaWYgaG9zdF9wbGF0Zm9ybSA9PSAnZGFyd2luJyBhbmQgaXNfbWFjb3N4X3Nka19wYXRoKGRpcik6CiAgICAgICAgICAgICBmID0gb3MucGF0aC5qb2luKHN5c3Jvb3QsIGRpclsxOl0sIGZpbGVuYW1lKQogCiAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGYpOiByZXR1cm4gW10KQEAgLTc5LDcgKzkzLDcgQEAKICAgICBmb3IgZGlyIGluIHBhdGhzOgogICAgICAgICBmID0gb3MucGF0aC5qb2luKGRpciwgZmlsZW5hbWUpCiAKLSAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nIGFuZCBpc19tYWNvc3hfc2RrX3BhdGgoZGlyKToKKyAgICAgICAgaWYgaG9zdF9wbGF0Zm9ybSA9PSAnZGFyd2luJyBhbmQgaXNfbWFjb3N4X3Nka19wYXRoKGRpcik6CiAgICAgICAgICAgICBmID0gb3MucGF0aC5qb2luKHN5c3Jvb3QsIGRpclsxOl0sIGZpbGVuYW1lKQogCiAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGYpOgpAQCAtOTMsNyArMTA3LDcgQEAKICAgICBpZiByZXN1bHQgaXMgTm9uZToKICAgICAgICAgcmV0dXJuIE5vbmUKIAotICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICBpZiBob3N0X3BsYXRmb3JtID09ICdkYXJ3aW4nOgogICAgICAgICBzeXNyb290ID0gbWFjb3N4X3Nka19yb290KCkKIAogICAgICMgQ2hlY2sgd2hldGhlciB0aGUgZm91bmQgZmlsZSBpcyBpbiBvbmUgb2YgdGhlIHN0YW5kYXJkIGRpcmVjdG9yaWVzCkBAIC0xMDIsNyArMTE2LDcgQEAKICAgICAgICAgIyBFbnN1cmUgcGF0aCBkb2Vzbid0IGVuZCB3aXRoIHBhdGggc2VwYXJhdG9yCiAgICAgICAgIHAgPSBwLnJzdHJpcChvcy5zZXApCiAKLSAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nIGFuZCBpc19tYWNvc3hfc2RrX3BhdGgocCk6CisgICAgICAgIGlmIGhvc3RfcGxhdGZvcm0gPT0gJ2RhcndpbicgYW5kIGlzX21hY29zeF9zZGtfcGF0aChwKToKICAgICAgICAgICAgIGlmIG9zLnBhdGguam9pbihzeXNyb290LCBwWzE6XSkgPT0gZGlybmFtZToKICAgICAgICAgICAgICAgICByZXR1cm4gWyBdCiAKQEAgLTExNSw3ICsxMjksNyBAQAogICAgICAgICAjIEVuc3VyZSBwYXRoIGRvZXNuJ3QgZW5kIHdpdGggcGF0aCBzZXBhcmF0b3IKICAgICAgICAgcCA9IHAucnN0cmlwKG9zLnNlcCkKIAotICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2RhcndpbicgYW5kIGlzX21hY29zeF9zZGtfcGF0aChwKToKKyAgICAgICAgaWYgaG9zdF9wbGF0Zm9ybSA9PSAnZGFyd2luJyBhbmQgaXNfbWFjb3N4X3Nka19wYXRoKHApOgogICAgICAgICAgICAgaWYgb3MucGF0aC5qb2luKHN5c3Jvb3QsIHBbMTpdKSA9PSBkaXJuYW1lOgogICAgICAgICAgICAgICAgIHJldHVybiBbIHAgXQogCkBAIC0xNzIsOCArMTg2LDggQEAKIAogICAgICAgICAjIFBsYXRmb3JtLWRlcGVuZGVudCBtb2R1bGUgc291cmNlIGFuZCBpbmNsdWRlIGRpcmVjdG9yaWVzCiAgICAgICAgIGluY2Rpcmxpc3QgPSBbXQotICAgICAgICBwbGF0Zm9ybSA9IHNlbGYuZ2V0X3BsYXRmb3JtKCkKLSAgICAgICAgaWYgcGxhdGZvcm0gPT0gJ2RhcndpbicgYW5kICgiLS1kaXNhYmxlLXRvb2xib3gtZ2x1ZSIgbm90IGluCisKKyAgICAgICAgaWYgaG9zdF9wbGF0Zm9ybSA9PSAnZGFyd2luJyBhbmQgKCItLWRpc2FibGUtdG9vbGJveC1nbHVlIiBub3QgaW4KICAgICAgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiQ09ORklHX0FSR1MiKSk6CiAgICAgICAgICAgICAjIE1hYyBPUyBYIGFsc28gaW5jbHVkZXMgc29tZSBtYWMtc3BlY2lmaWMgbW9kdWxlcwogICAgICAgICAgICAgbWFjbW9kZGlyID0gb3MucGF0aC5qb2luKHNyY2RpciwgJ01hYy9Nb2R1bGVzJykKQEAgLTE4Niw3ICsyMDAsNyBAQAogCiAgICAgICAgICMgUHl0aG9uIGhlYWRlciBmaWxlcwogICAgICAgICBoZWFkZXJzID0gW3N5c2NvbmZpZy5nZXRfY29uZmlnX2hfZmlsZW5hbWUoKV0KLSAgICAgICAgaGVhZGVycyArPSBnbG9iKG9zLnBhdGguam9pbihzeXNjb25maWcuZ2V0X3BhdGgoJ3BsYXRpbmNsdWRlJyksICIqLmgiKSkKKyAgICAgICAgaGVhZGVycyArPSBnbG9iKG9zLnBhdGguam9pbihzeXNjb25maWcuZ2V0X3BhdGgoJ2luY2x1ZGUnKSwgIiouaCIpKQogICAgICAgICBmb3IgZXh0IGluIHNlbGYuZXh0ZW5zaW9uc1s6XToKICAgICAgICAgICAgIGV4dC5zb3VyY2VzID0gWyBmaW5kX21vZHVsZV9maWxlKGZpbGVuYW1lLCBtb2RkaXJsaXN0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBleHQuc291cmNlcyBdCkBAIC0yODYsNyArMzAwLDcgQEAKICAgICAgICAgICAgICAgICBleHQubmFtZSkKICAgICAgICAgICAgIHJldHVybgogCi0gICAgICAgIGlmIHNlbGYuZ2V0X3BsYXRmb3JtKCkgPT0gJ2RhcndpbicgYW5kICgKKyAgICAgICAgaWYgaG9zdF9wbGF0Zm9ybSA9PSAnZGFyd2luJyBhbmQgKAogICAgICAgICAgICAgICAgIHN5cy5tYXhpbnQgPiAyKiozMiBhbmQgJy1hcmNoJyBpbiBleHQuZXh0cmFfbGlua19hcmdzKToKICAgICAgICAgICAgICMgRG9uJ3QgYm90aGVyIGRvaW5nIGFuIGltcG9ydCBjaGVjayB3aGVuIGFuIGV4dGVuc2lvbiB3YXMKICAgICAgICAgICAgICMgYnVpbGQgd2l0aCBhbiBleHBsaWNpdCAnLWFyY2gnIGZsYWcgb24gT1NYLiBUaGF0J3MgY3VycmVudGx5CkBAIC0zMDAsMTMgKzMxNCwxOCBAQAogCiAgICAgICAgICMgV29ya2Fyb3VuZCBmb3IgQ3lnd2luOiBDeWd3aW4gY3VycmVudGx5IGhhcyBmb3JrIGlzc3VlcyB3aGVuIG1hbnkKICAgICAgICAgIyBtb2R1bGVzIGhhdmUgYmVlbiBpbXBvcnRlZAotICAgICAgICBpZiBzZWxmLmdldF9wbGF0Zm9ybSgpID09ICdjeWd3aW4nOgorICAgICAgICBpZiBob3N0X3BsYXRmb3JtID09ICdjeWd3aW4nOgogICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgnV0FSTklORzogc2tpcHBpbmcgaW1wb3J0IGNoZWNrIGZvciBDeWd3aW4tYmFzZWQgIiVzIicKICAgICAgICAgICAgICAgICAlIGV4dC5uYW1lKQogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIGV4dF9maWxlbmFtZSA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgIHNlbGYuYnVpbGRfbGliLAogICAgICAgICAgICAgc2VsZi5nZXRfZXh0X2ZpbGVuYW1lKHNlbGYuZ2V0X2V4dF9mdWxsbmFtZShleHQubmFtZSkpKQorCisgICAgICAgICMgRG9uJ3QgdHJ5IHRvIGxvYWQgZXh0ZW5zaW9ucyBmb3IgY3Jvc3MgYnVpbGRzCisgICAgICAgIGlmIGNyb3NzX2NvbXBpbGluZzoKKyAgICAgICAgICAgIHJldHVybgorCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGltcC5sb2FkX2R5bmFtaWMoZXh0Lm5hbWUsIGV4dF9maWxlbmFtZSkKICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yLCB3aHk6CkBAIC0zMzgsMjQgKzM1Nyw0MSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbD0zKQogICAgICAgICAgICAgc2VsZi5mYWlsZWQuYXBwZW5kKGV4dC5uYW1lKQogCi0gICAgZGVmIGdldF9wbGF0Zm9ybShzZWxmKToKLSAgICAgICAgIyBHZXQgdmFsdWUgb2Ygc3lzLnBsYXRmb3JtCi0gICAgICAgIGZvciBwbGF0Zm9ybSBpbiBbJ2N5Z3dpbicsICdiZW9zJywgJ2RhcndpbicsICdhdGhlb3MnLCAnb3NmMSddOgotICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgocGxhdGZvcm0pOgotICAgICAgICAgICAgICAgIHJldHVybiBwbGF0Zm9ybQotICAgICAgICByZXR1cm4gc3lzLnBsYXRmb3JtCi0KICAgICBkZWYgYWRkX211bHRpYXJjaF9wYXRocyhzZWxmKToKICAgICAgICAgIyBEZWJpYW4vVWJ1bnR1IG11bHRpYXJjaCBzdXBwb3J0LgogICAgICAgICAjIGh0dHBzOi8vd2lraS51YnVudHUuY29tL011bHRpYXJjaFNwZWMKLSAgICAgICAgaWYgbm90IGZpbmRfZXhlY3V0YWJsZSgnZHBrZy1hcmNoaXRlY3R1cmUnKToKLSAgICAgICAgICAgIHJldHVybgorICAgICAgICBjYyA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignQ0MnKQogICAgICAgICB0bXBmaWxlID0gb3MucGF0aC5qb2luKHNlbGYuYnVpbGRfdGVtcCwgJ211bHRpYXJjaCcpCiAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLmJ1aWxkX3RlbXApOgogICAgICAgICAgICAgb3MubWFrZWRpcnMoc2VsZi5idWlsZF90ZW1wKQogICAgICAgICByZXQgPSBvcy5zeXN0ZW0oCi0gICAgICAgICAgICAnZHBrZy1hcmNoaXRlY3R1cmUgLXFERUJfSE9TVF9NVUxUSUFSQ0ggPiAlcyAyPiAvZGV2L251bGwnICUKLSAgICAgICAgICAgIHRtcGZpbGUpCisgICAgICAgICAgICAnJXMgLXByaW50LW11bHRpYXJjaCA+ICVzIDI+IC9kZXYvbnVsbCcgJSAoY2MsIHRtcGZpbGUpKQorICAgICAgICBtdWx0aWFyY2hfcGF0aF9jb21wb25lbnQgPSAnJworICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiByZXQgPj4gOCA9PSAwOgorICAgICAgICAgICAgICAgIHdpdGggb3Blbih0bXBmaWxlKSBhcyBmcDoKKyAgICAgICAgICAgICAgICAgICAgbXVsdGlhcmNoX3BhdGhfY29tcG9uZW50ID0gZnAucmVhZGxpbmUoKS5zdHJpcCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy51bmxpbmsodG1wZmlsZSkKKworICAgICAgICBpZiBtdWx0aWFyY2hfcGF0aF9jb21wb25lbnQgIT0gJyc6CisgICAgICAgICAgICBhZGRfZGlyX3RvX2xpc3Qoc2VsZi5jb21waWxlci5saWJyYXJ5X2RpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy91c3IvbGliLycgKyBtdWx0aWFyY2hfcGF0aF9jb21wb25lbnQpCisgICAgICAgICAgICBhZGRfZGlyX3RvX2xpc3Qoc2VsZi5jb21waWxlci5pbmNsdWRlX2RpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy91c3IvaW5jbHVkZS8nICsgbXVsdGlhcmNoX3BhdGhfY29tcG9uZW50KQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgbm90IGZpbmRfZXhlY3V0YWJsZSgnZHBrZy1hcmNoaXRlY3R1cmUnKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBvcHQgPSAnJworICAgICAgICBpZiBjcm9zc19jb21waWxpbmc6CisgICAgICAgICAgICBvcHQgPSAnLXQnICsgc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdIT1NUX0dOVV9UWVBFJykKKyAgICAgICAgdG1wZmlsZSA9IG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX3RlbXAsICdtdWx0aWFyY2gnKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5idWlsZF90ZW1wKToKKyAgICAgICAgICAgIG9zLm1ha2VkaXJzKHNlbGYuYnVpbGRfdGVtcCkKKyAgICAgICAgcmV0ID0gb3Muc3lzdGVtKAorICAgICAgICAgICAgJ2Rwa2ctYXJjaGl0ZWN0dXJlICVzIC1xREVCX0hPU1RfTVVMVElBUkNIID4gJXMgMj4gL2Rldi9udWxsJyAlCisgICAgICAgICAgICAob3B0LCB0bXBmaWxlKSkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaWYgcmV0ID4+IDggPT0gMDoKICAgICAgICAgICAgICAgICB3aXRoIG9wZW4odG1wZmlsZSkgYXMgZnA6CkBAIC0zNjcsMTAgKzQwMyw0NSBAQAogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgb3MudW5saW5rKHRtcGZpbGUpCiAKKyAgICBkZWYgYWRkX2djY19wYXRocyhzZWxmKToKKyAgICAgICAgZ2NjID0gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdDQycpCisgICAgICAgIHRtcGZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF90ZW1wLCAnZ2NjcGF0aHMnKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5idWlsZF90ZW1wKToKKyAgICAgICAgICAgIG9zLm1ha2VkaXJzKHNlbGYuYnVpbGRfdGVtcCkKKyAgICAgICAgcmV0ID0gb3Muc3lzdGVtKCclcyAtRSAtdiAtIDwvZGV2L251bGwgMj4lcyAxPi9kZXYvbnVsbCcgJSAoZ2NjLCB0bXBmaWxlKSkKKyAgICAgICAgaXNfZ2NjID0gRmFsc2UKKyAgICAgICAgaW5faW5jZGlycyA9IEZhbHNlCisgICAgICAgIGluY19kaXJzID0gW10KKyAgICAgICAgbGliX2RpcnMgPSBbXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiByZXQgPj4gOCA9PSAwOgorICAgICAgICAgICAgICAgIHdpdGggb3Blbih0bXBmaWxlKSBhcyBmcDoKKyAgICAgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gZnAucmVhZGxpbmVzKCk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoImdjYyB2ZXJzaW9uIik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZ2NjID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBsaW5lLnN0YXJ0c3dpdGgoIiNpbmNsdWRlIDwuLi4+Iik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5faW5jZGlycyA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgbGluZS5zdGFydHN3aXRoKCJFbmQgb2Ygc2VhcmNoIGxpc3QiKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9pbmNkaXJzID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgaXNfZ2NjIGFuZCBsaW5lLnN0YXJ0c3dpdGgoIkxJQlJBUllfUEFUSCIpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBkIGluIGxpbmUuc3RyaXAoKS5zcGxpdCgiPSIpWzFdLnNwbGl0KCI6Iik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBvcy5wYXRoLm5vcm1wYXRoKGQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICcvZ2NjLycgbm90IGluIGQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfZGlyX3RvX2xpc3Qoc2VsZi5jb21waWxlci5saWJyYXJ5X2RpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgaXNfZ2NjIGFuZCBpbl9pbmNkaXJzIGFuZCAnL2djYy8nIG5vdCBpbiBsaW5lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9kaXJfdG9fbGlzdChzZWxmLmNvbXBpbGVyLmluY2x1ZGVfZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5zdHJpcCgpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MudW5saW5rKHRtcGZpbGUpCisKICAgICBkZWYgZGV0ZWN0X21vZHVsZXMoc2VsZik6CiAgICAgICAgICMgRW5zdXJlIHRoYXQgL3Vzci9sb2NhbCBpcyBhbHdheXMgdXNlZAotICAgICAgICBhZGRfZGlyX3RvX2xpc3Qoc2VsZi5jb21waWxlci5saWJyYXJ5X2RpcnMsICcvdXNyL2xvY2FsL2xpYicpCi0gICAgICAgIGFkZF9kaXJfdG9fbGlzdChzZWxmLmNvbXBpbGVyLmluY2x1ZGVfZGlycywgJy91c3IvbG9jYWwvaW5jbHVkZScpCisgICAgICAgIGlmIG5vdCBjcm9zc19jb21waWxpbmc6CisgICAgICAgICAgICBhZGRfZGlyX3RvX2xpc3Qoc2VsZi5jb21waWxlci5saWJyYXJ5X2RpcnMsICcvdXNyL2xvY2FsL2xpYicpCisgICAgICAgICAgICBhZGRfZGlyX3RvX2xpc3Qoc2VsZi5jb21waWxlci5pbmNsdWRlX2RpcnMsICcvdXNyL2xvY2FsL2luY2x1ZGUnKQorICAgICAgICBpZiBjcm9zc19jb21waWxpbmc6CisgICAgICAgICAgICBzZWxmLmFkZF9nY2NfcGF0aHMoKQogICAgICAgICBzZWxmLmFkZF9tdWx0aWFyY2hfcGF0aHMoKQogCiAgICAgICAgICMgQWRkIHBhdGhzIHNwZWNpZmllZCBpbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIExERkxBR1MgYW5kCkBAIC00MjYsMzIgKzQ5Nyw0MiBAQAogICAgICAgICAjIGxpYl9kaXJzIGFuZCBpbmNfZGlycyBhcmUgdXNlZCB0byBzZWFyY2ggZm9yIGZpbGVzOwogICAgICAgICAjIGlmIGEgZmlsZSBpcyBmb3VuZCBpbiBvbmUgb2YgdGhvc2UgZGlyZWN0b3JpZXMsIGl0IGNhbgogICAgICAgICAjIGJlIGFzc3VtZWQgdGhhdCBubyBhZGRpdGlvbmFsIC1JLC1MIGRpcmVjdGl2ZXMgYXJlIG5lZWRlZC4KLSAgICAgICAgbGliX2RpcnMgPSBzZWxmLmNvbXBpbGVyLmxpYnJhcnlfZGlycyArIFsKLSAgICAgICAgICAgICcvbGliNjQnLCAnL3Vzci9saWI2NCcsCi0gICAgICAgICAgICAnL2xpYicsICcvdXNyL2xpYicsCi0gICAgICAgICAgICBdCi0gICAgICAgIGluY19kaXJzID0gc2VsZi5jb21waWxlci5pbmNsdWRlX2RpcnMgKyBbJy91c3IvaW5jbHVkZSddCisgICAgICAgIGluY19kaXJzID0gc2VsZi5jb21waWxlci5pbmNsdWRlX2RpcnNbOl0KKyAgICAgICAgbGliX2RpcnMgPSBzZWxmLmNvbXBpbGVyLmxpYnJhcnlfZGlyc1s6XQorICAgICAgICBpZiBub3QgY3Jvc3NfY29tcGlsaW5nOgorICAgICAgICAgICAgZm9yIGQgaW4gKAorICAgICAgICAgICAgICAgICcvdXNyL2luY2x1ZGUnLAorICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgYWRkX2Rpcl90b19saXN0KGluY19kaXJzLCBkKQorICAgICAgICAgICAgZm9yIGQgaW4gKAorICAgICAgICAgICAgICAgICcvbGliNjQnLCAnL3Vzci9saWI2NCcsCisgICAgICAgICAgICAgICAgJy9saWInLCAnL3Vzci9saWInLAorICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgYWRkX2Rpcl90b19saXN0KGxpYl9kaXJzLCBkKQogICAgICAgICBleHRzID0gW10KICAgICAgICAgbWlzc2luZyA9IFtdCiAKICAgICAgICAgY29uZmlnX2ggPSBzeXNjb25maWcuZ2V0X2NvbmZpZ19oX2ZpbGVuYW1lKCkKICAgICAgICAgY29uZmlnX2hfdmFycyA9IHN5c2NvbmZpZy5wYXJzZV9jb25maWdfaChvcGVuKGNvbmZpZ19oKSkKIAotICAgICAgICBwbGF0Zm9ybSA9IHNlbGYuZ2V0X3BsYXRmb3JtKCkKICAgICAgICAgc3JjZGlyID0gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdzcmNkaXInKQogCiAgICAgICAgICMgQ2hlY2sgZm9yIEF0aGVPUyB3aGljaCBoYXMgbGlicmFyaWVzIGluIG5vbi1zdGFuZGFyZCBsb2NhdGlvbnMKLSAgICAgICAgaWYgcGxhdGZvcm0gPT0gJ2F0aGVvcyc6CisgICAgICAgIGlmIGhvc3RfcGxhdGZvcm0gPT0gJ2F0aGVvcyc6CiAgICAgICAgICAgICBsaWJfZGlycyArPSBbJy9zeXN0ZW0vbGlicycsICcvYXRoZW9zL2F1dG9sbmsvbGliJ10KICAgICAgICAgICAgIGxpYl9kaXJzICs9IG9zLmdldGVudignTElCUkFSWV9QQVRIJywgJycpLnNwbGl0KG9zLnBhdGhzZXApCiAgICAgICAgICAgICBpbmNfZGlycyArPSBbJy9zeXN0ZW0vaW5jbHVkZScsICcvYXRoZW9zL2F1dG9sbmsvaW5jbHVkZSddCiAgICAgICAgICAgICBpbmNfZGlycyArPSBvcy5nZXRlbnYoJ0NfSU5DTFVERV9QQVRIJywgJycpLnNwbGl0KG9zLnBhdGhzZXApCiAKICAgICAgICAgIyBPU0YvMSBhbmQgVW5peHdhcmUgaGF2ZSBzb21lIHN0dWZmIGluIC91c3IvY2NzL2xpYiAobGlrZSAtbGRiKQotICAgICAgICBpZiBwbGF0Zm9ybSBpbiBbJ29zZjEnLCAndW5peHdhcmU3JywgJ29wZW51bml4OCddOgorICAgICAgICBpZiBob3N0X3BsYXRmb3JtIGluIFsnb3NmMScsICd1bml4d2FyZTcnLCAnb3BlbnVuaXg4J106CiAgICAgICAgICAgICBsaWJfZGlycyArPSBbJy91c3IvY2NzL2xpYiddCiAKLSAgICAgICAgaWYgcGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgICMgSFAtVVgxMWl2MyBrZWVwcyBmaWxlcyBpbiBsaWIvaHB1eCBmb2xkZXJzLgorICAgICAgICBpZiBob3N0X3BsYXRmb3JtID09ICdocC11eDExJzoKKyAgICAgICAgICAgIGxpYl9kaXJzICs9IFsnL3Vzci9saWIvaHB1eDY0JywgJy91c3IvbGliL2hwdXgzMiddCisKKyAgICAgICAgaWYgaG9zdF9wbGF0Zm9ybSA9PSAnZGFyd2luJzoKICAgICAgICAgICAgICMgVGhpcyBzaG91bGQgd29yayBvbiBhbnkgdW5peHkgcGxhdGZvcm0gOy0pCiAgICAgICAgICAgICAjIElmIHRoZSB1c2VyIGhhcyBib3RoZXJlZCBzcGVjaWZ5aW5nIGFkZGl0aW9uYWwgLUkgYW5kIC1MIGZsYWdzCiAgICAgICAgICAgICAjIGluIE9QVCBhbmQgTERGTEFHUyB3ZSBtaWdodCBhcyB3ZWxsIHVzZSB0aGVtIGhlcmUuCkBAIC00NzAsNyArNTUxLDcgQEAKIAogICAgICAgICAjIENoZWNrIGZvciBNYWNPUyBYLCB3aGljaCBkb2Vzbid0IG5lZWQgbGlibS5hIGF0IGFsbAogICAgICAgICBtYXRoX2xpYnMgPSBbJ20nXQotICAgICAgICBpZiBwbGF0Zm9ybSBpbiBbJ2RhcndpbicsICdiZW9zJ106CisgICAgICAgIGlmIGhvc3RfcGxhdGZvcm0gaW4gWydkYXJ3aW4nLCAnYmVvcyddOgogICAgICAgICAgICAgbWF0aF9saWJzID0gW10KIAogICAgICAgICAjIFhYWCBPbWl0dGVkIG1vZHVsZXM6IGdsLCBwdXJlLCBkbCwgU0dJLXNwZWNpZmljIG1vZHVsZXMKQEAgLTU0Miw3ICs2MjMsNyBAQAogICAgICAgICAgICAgbG9jYWxlX2xpYnMgPSBbJ2ludGwnXQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgbG9jYWxlX2xpYnMgPSBbXQotICAgICAgICBpZiBwbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgaWYgaG9zdF9wbGF0Zm9ybSA9PSAnZGFyd2luJzoKICAgICAgICAgICAgIGxvY2FsZV9leHRyYV9saW5rX2FyZ3MgPSBbJy1mcmFtZXdvcmsnLCAnQ29yZUZvdW5kYXRpb24nXQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgbG9jYWxlX2V4dHJhX2xpbmtfYXJncyA9IFtdCkBAIC01ODQsNyArNjY1LDcgQEAKICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignY1BpY2tsZScsIFsnY1BpY2tsZS5jJ10pICkKIAogICAgICAgICAjIE1lbW9yeS1tYXBwZWQgZmlsZXMgKGFsc28gd29ya3Mgb24gV2luMzIpLgotICAgICAgICBpZiBwbGF0Zm9ybSBub3QgaW4gWydhdGhlb3MnXToKKyAgICAgICAgaWYgaG9zdF9wbGF0Zm9ybSBub3QgaW4gWydhdGhlb3MnXToKICAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ21tYXAnLCBbJ21tYXBtb2R1bGUuYyddKSApCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBtaXNzaW5nLmFwcGVuZCgnbW1hcCcpCkBAIC02NDksMTAgKzczMCwxMiBAQAogICAgICAgICBlbGlmIHNlbGYuY29tcGlsZXIuZmluZF9saWJyYXJ5X2ZpbGUobGliX2RpcnMsICdjdXJzZXMnKToKICAgICAgICAgICAgIGN1cnNlc19saWJyYXJ5ID0gJ2N1cnNlcycKIAotICAgICAgICBpZiBwbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgaWYgaG9zdF9wbGF0Zm9ybSA9PSAnZGFyd2luJzoKICAgICAgICAgICAgIG9zX3JlbGVhc2UgPSBpbnQob3MudW5hbWUoKVsyXS5zcGxpdCgnLicpWzBdKQogICAgICAgICAgICAgZGVwX3RhcmdldCA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJykKLSAgICAgICAgICAgIGlmIGRlcF90YXJnZXQgYW5kIGRlcF90YXJnZXQuc3BsaXQoJy4nKSA8IFsnMTAnLCAnNSddOgorICAgICAgICAgICAgaWYgKGRlcF90YXJnZXQgYW5kCisgICAgICAgICAgICAgICAgICAgICh0dXBsZShpbnQobikgZm9yIG4gaW4gZGVwX3RhcmdldC5zcGxpdCgnLicpWzA6Ml0pCisgICAgICAgICAgICAgICAgICAgICAgICA8ICgxMCwgNSkgKSApOgogICAgICAgICAgICAgICAgIG9zX3JlbGVhc2UgPSA4CiAgICAgICAgICAgICBpZiBvc19yZWxlYXNlIDwgOToKICAgICAgICAgICAgICAgICAjIE1hY09TWCAxMC40IGhhcyBhIGJyb2tlbiByZWFkbGluZS4gRG9uJ3QgdHJ5IHRvIGJ1aWxkCkBAIC02NjEsNyArNzQ0LDcgQEAKICAgICAgICAgICAgICAgICBpZiBmaW5kX2ZpbGUoJ3JlYWRsaW5lL3JsY29uZi5oJywgaW5jX2RpcnMsIFtdKSBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICBkb19yZWFkbGluZSA9IEZhbHNlCiAgICAgICAgIGlmIGRvX3JlYWRsaW5lOgotICAgICAgICAgICAgaWYgcGxhdGZvcm0gPT0gJ2RhcndpbicgYW5kIG9zX3JlbGVhc2UgPCA5OgorICAgICAgICAgICAgaWYgaG9zdF9wbGF0Zm9ybSA9PSAnZGFyd2luJyBhbmQgb3NfcmVsZWFzZSA8IDk6CiAgICAgICAgICAgICAgICAgIyBJbiBldmVyeSBkaXJlY3Rvcnkgb24gdGhlIHNlYXJjaCBwYXRoIHNlYXJjaCBmb3IgYSBkeW5hbWljCiAgICAgICAgICAgICAgICAgIyBsaWJyYXJ5IGFuZCB0aGVuIGEgc3RhdGljIGxpYnJhcnksIGluc3RlYWQgb2YgZmlyc3QgbG9va2luZwogICAgICAgICAgICAgICAgICMgZm9yIGR5bmFtaWMgbGlicmFyaWVzIG9uIHRoZSBlbnRpcnkgcGF0aC4KQEAgLTY5OSw4ICs3ODIsOSBAQAogICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfY3N2JywgWydfY3N2LmMnXSkgKQogCiAgICAgICAgICMgc29ja2V0KDIpCi0gICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19zb2NrZXQnLCBbJ3NvY2tldG1vZHVsZS5jJ10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kcyA9IFsnc29ja2V0bW9kdWxlLmgnXSkgKQorICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfc29ja2V0JywgWydzb2NrZXRtb2R1bGUuYycsICd0aW1lbW9kdWxlLmMnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRzPVsnc29ja2V0bW9kdWxlLmgnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXM9bWF0aF9saWJzKSApCiAgICAgICAgICMgRGV0ZWN0IFNTTCBzdXBwb3J0IGZvciB0aGUgc29ja2V0IG1vZHVsZSAodmlhIF9zc2wpCiAgICAgICAgIHNlYXJjaF9mb3Jfc3NsX2luY3NfaW4gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9sb2NhbC9zc2wvaW5jbHVkZScsCkBAIC03MzksNyArODIzLDcgQEAKICAgICAgICAgICAgICAgICBpbmNfZGlycyArIHNlYXJjaF9mb3Jfc3NsX2luY3NfaW4pCiAgICAgICAgIGlmIG9wZW5zc2x2X2g6CiAgICAgICAgICAgICBuYW1lID0gb3MucGF0aC5qb2luKG9wZW5zc2x2X2hbMF0sICdvcGVuc3NsL29wZW5zc2x2LmgnKQotICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nIGFuZCBpc19tYWNvc3hfc2RrX3BhdGgobmFtZSk6CisgICAgICAgICAgICBpZiBob3N0X3BsYXRmb3JtID09ICdkYXJ3aW4nIGFuZCBpc19tYWNvc3hfc2RrX3BhdGgobmFtZSk6CiAgICAgICAgICAgICAgICAgbmFtZSA9IG9zLnBhdGguam9pbihtYWNvc3hfc2RrX3Jvb3QoKSwgbmFtZVsxOl0pCiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgaW5jZmlsZSA9IG9wZW4obmFtZSwgJ3InKQpAQCAtNzk5LDggKzg4Myw4IEBACiAgICAgICAgICMgYSByZWxlYXNlLiAgTW9zdCBvcGVuIHNvdXJjZSBPU2VzIGNvbWUgd2l0aCBvbmUgb3IgbW9yZQogICAgICAgICAjIHZlcnNpb25zIG9mIEJlcmtlbGV5REIgYWxyZWFkeSBpbnN0YWxsZWQuCiAKLSAgICAgICAgbWF4X2RiX3ZlciA9ICg0LCA4KQotICAgICAgICBtaW5fZGJfdmVyID0gKDQsIDEpCisgICAgICAgIG1heF9kYl92ZXIgPSAoNSwgMykKKyAgICAgICAgbWluX2RiX3ZlciA9ICg0LCAzKQogICAgICAgICBkYl9zZXR1cF9kZWJ1ZyA9IEZhbHNlICAgIyB2ZXJib3NlIGRlYnVnIHByaW50cyBmcm9tIHRoaXMgc2NyaXB0PwogCiAgICAgICAgIGRlZiBhbGxvd19kYl92ZXIoZGJfdmVyKToKQEAgLTgyMSw4ICs5MDUsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBUcnVlCiAKICAgICAgICAgZGVmIGdlbl9kYl9taW5vcl92ZXJfbnVtcyhtYWpvcik6Ci0gICAgICAgICAgICBpZiBtYWpvciA9PSA0OgorICAgICAgICAgICAgaWYgbWFqb3IgPT0gNToKICAgICAgICAgICAgICAgICBmb3IgeCBpbiByYW5nZShtYXhfZGJfdmVyWzFdKzEpOgorICAgICAgICAgICAgICAgICAgICBpZiBhbGxvd19kYl92ZXIoKDUsIHgpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHgKKyAgICAgICAgICAgIGVsaWYgbWFqb3IgPT0gNDoKKyAgICAgICAgICAgICAgICBmb3IgeCBpbiByYW5nZSg5KToKICAgICAgICAgICAgICAgICAgICAgaWYgYWxsb3dfZGJfdmVyKCg0LCB4KSk6CiAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCB4CiAgICAgICAgICAgICBlbGlmIG1ham9yID09IDM6CkBAIC04NjMsNiArOTUxLDkgQEAKICAgICAgICAgICAgIGRiX2luY19wYXRocy5hcHBlbmQoJy9wa2cvZGItMy4lZC9pbmNsdWRlJyAlIHgpCiAgICAgICAgICAgICBkYl9pbmNfcGF0aHMuYXBwZW5kKCcvb3B0L2RiLTMuJWQvaW5jbHVkZScgJSB4KQogCisgICAgICAgIGlmIGNyb3NzX2NvbXBpbGluZzoKKyAgICAgICAgICAgIGRiX2luY19wYXRocyA9IFtdCisKICAgICAgICAgIyBBZGQgc29tZSBjb21tb24gc3ViZGlyZWN0b3JpZXMgZm9yIFNsZWVweWNhdCBEQiB0byB0aGUgbGlzdCwKICAgICAgICAgIyBiYXNlZCBvbiB0aGUgc3RhbmRhcmQgaW5jbHVkZSBkaXJlY3Rvcmllcy4gVGhpcyB3YXkgREIzLzQgZ2V0cwogICAgICAgICAjIHBpY2tlZCB1cCB3aGVuIGl0IGlzIGluc3RhbGxlZCBpbiBhIG5vbi1zdGFuZGFyZCBwcmVmaXggYW5kCkBAIC04ODMsNyArOTc0LDcgQEAKIAogICAgICAgICBkYl92ZXJfaW5jX21hcCA9IHt9CiAKLSAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgICBpZiBob3N0X3BsYXRmb3JtID09ICdkYXJ3aW4nOgogICAgICAgICAgICAgc3lzcm9vdCA9IG1hY29zeF9zZGtfcm9vdCgpCiAKICAgICAgICAgY2xhc3MgZGJfZm91bmQoRXhjZXB0aW9uKTogcGFzcwpAQCAtODkzLDcgKzk4NCw3IEBACiAgICAgICAgICAgICBmb3IgZCBpbiBpbmNfZGlycyArIGRiX2luY19wYXRoczoKICAgICAgICAgICAgICAgICBmID0gb3MucGF0aC5qb2luKGQsICJkYi5oIikKIAotICAgICAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJyBhbmQgaXNfbWFjb3N4X3Nka19wYXRoKGQpOgorICAgICAgICAgICAgICAgIGlmIGhvc3RfcGxhdGZvcm0gPT0gJ2RhcndpbicgYW5kIGlzX21hY29zeF9zZGtfcGF0aChkKToKICAgICAgICAgICAgICAgICAgICAgZiA9IG9zLnBhdGguam9pbihzeXNyb290LCBkWzE6XSwgImRiLmgiKQogCiAgICAgICAgICAgICAgICAgaWYgZGJfc2V0dXBfZGVidWc6IHByaW50ICJkYjogbG9va2luZyBmb3IgZGIuaCBpbiIsIGYKQEAgLTk0Myw3ICsxMDM0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgZGJfaW5jZGlyLnJlcGxhY2UoImluY2x1ZGUiLCAnbGliJyksCiAgICAgICAgICAgICAgICAgXQogCi0gICAgICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICdkYXJ3aW4nOgorICAgICAgICAgICAgICAgIGlmIGhvc3RfcGxhdGZvcm0gIT0gJ2Rhcndpbic6CiAgICAgICAgICAgICAgICAgICAgIGRiX2RpcnNfdG9fY2hlY2sgPSBmaWx0ZXIob3MucGF0aC5pc2RpciwgZGJfZGlyc190b19jaGVjaykKIAogICAgICAgICAgICAgICAgIGVsc2U6CkBAIC0xMDExLDYgKzExMDIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9sb2NhbC9pbmNsdWRlL3NxbGl0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvdXNyL2xvY2FsL2luY2x1ZGUvc3FsaXRlMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgIGlmIGNyb3NzX2NvbXBpbGluZzoKKyAgICAgICAgICAgIHNxbGl0ZV9pbmNfcGF0aHMgPSBbXQogICAgICAgICBNSU5fU1FMSVRFX1ZFUlNJT05fTlVNQkVSID0gKDMsIDAsIDgpCiAgICAgICAgIE1JTl9TUUxJVEVfVkVSU0lPTiA9ICIuIi5qb2luKFtzdHIoeCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB4IGluIE1JTl9TUUxJVEVfVkVSU0lPTl9OVU1CRVJdKQpAQCAtMTAxOCwyMCArMTExMSwyMCBAQAogICAgICAgICAjIFNjYW4gdGhlIGRlZmF1bHQgaW5jbHVkZSBkaXJlY3RvcmllcyBiZWZvcmUgdGhlIFNRTGl0ZSBzcGVjaWZpYwogICAgICAgICAjIG9uZXMuIFRoaXMgYWxsb3dzIG9uZSB0byBvdmVycmlkZSB0aGUgY29weSBvZiBzcWxpdGUgb24gT1NYLAogICAgICAgICAjIHdoZXJlIC91c3IvaW5jbHVkZSBjb250YWlucyBhbiBvbGQgdmVyc2lvbiBvZiBzcWxpdGUuCi0gICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgaWYgaG9zdF9wbGF0Zm9ybSA9PSAnZGFyd2luJzoKICAgICAgICAgICAgIHN5c3Jvb3QgPSBtYWNvc3hfc2RrX3Jvb3QoKQogCi0gICAgICAgIGZvciBkIGluIGluY19kaXJzICsgc3FsaXRlX2luY19wYXRoczoKKyAgICAgICAgZm9yIGRfIGluIGluY19kaXJzICsgc3FsaXRlX2luY19wYXRoczoKKyAgICAgICAgICAgIGQgPSBkXworICAgICAgICAgICAgaWYgaG9zdF9wbGF0Zm9ybSA9PSAnZGFyd2luJyBhbmQgaXNfbWFjb3N4X3Nka19wYXRoKGQpOgorICAgICAgICAgICAgICAgIGQgPSBvcy5wYXRoLmpvaW4oc3lzcm9vdCwgZFsxOl0pCisKICAgICAgICAgICAgIGYgPSBvcy5wYXRoLmpvaW4oZCwgInNxbGl0ZTMuaCIpCi0KLSAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJyBhbmQgaXNfbWFjb3N4X3Nka19wYXRoKGQpOgotICAgICAgICAgICAgICAgIGYgPSBvcy5wYXRoLmpvaW4oc3lzcm9vdCwgZFsxOl0sICJzcWxpdGUzLmgiKQotCiAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmKToKICAgICAgICAgICAgICAgICBpZiBzcWxpdGVfc2V0dXBfZGVidWc6IHByaW50ICJzcWxpdGU6IGZvdW5kICVzIiVmCiAgICAgICAgICAgICAgICAgaW5jZiA9IG9wZW4oZikucmVhZCgpCiAgICAgICAgICAgICAgICAgbSA9IHJlLnNlYXJjaCgKLSAgICAgICAgICAgICAgICAgICAgcidccyouKiNccyouKmRlZmluZVxzLipTUUxJVEVfVkVSU0lPTlxXKiIoLiopIicsIGluY2YpCisgICAgICAgICAgICAgICAgICAgIHInXHMqLiojXHMqLipkZWZpbmVccy4qU1FMSVRFX1ZFUlNJT05cVyoiKFtcZFwuXSopIicsIGluY2YpCiAgICAgICAgICAgICAgICAgaWYgbToKICAgICAgICAgICAgICAgICAgICAgc3FsaXRlX3ZlcnNpb24gPSBtLmdyb3VwKDEpCiAgICAgICAgICAgICAgICAgICAgIHNxbGl0ZV92ZXJzaW9uX3R1cGxlID0gdHVwbGUoW2ludCh4KQpAQCAtMTA3Myw3ICsxMTY2LDcgQEAKICAgICAgICAgICAgICAgICAnX3NxbGl0ZS91dGlsLmMnLCBdCiAKICAgICAgICAgICAgIHNxbGl0ZV9kZWZpbmVzID0gW10KLSAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSAhPSAid2luMzIiOgorICAgICAgICAgICAgaWYgaG9zdF9wbGF0Zm9ybSAhPSAid2luMzIiOgogICAgICAgICAgICAgICAgIHNxbGl0ZV9kZWZpbmVzLmFwcGVuZCgoJ01PRFVMRV9OQU1FJywgJyJzcWxpdGUzIicpKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzcWxpdGVfZGVmaW5lcy5hcHBlbmQoKCdNT0RVTEVfTkFNRScsICdcXCJzcWxpdGUzXFwiJykpCkBAIC0xMDgxLDcgKzExNzQsNyBAQAogICAgICAgICAgICAgIyBDb21tZW50IHRoaXMgb3V0IGlmIHlvdSB3YW50IHRoZSBzcWxpdGUzIG1vZHVsZSB0byBiZSBhYmxlIHRvIGxvYWQgZXh0ZW5zaW9ucy4KICAgICAgICAgICAgIHNxbGl0ZV9kZWZpbmVzLmFwcGVuZCgoIlNRTElURV9PTUlUX0xPQURfRVhURU5TSU9OIiwgIjEiKSkKIAotICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgICAgICAgaWYgaG9zdF9wbGF0Zm9ybSA9PSAnZGFyd2luJzoKICAgICAgICAgICAgICAgICAjIEluIGV2ZXJ5IGRpcmVjdG9yeSBvbiB0aGUgc2VhcmNoIHBhdGggc2VhcmNoIGZvciBhIGR5bmFtaWMKICAgICAgICAgICAgICAgICAjIGxpYnJhcnkgYW5kIHRoZW4gYSBzdGF0aWMgbGlicmFyeSwgaW5zdGVhZCBvZiBmaXJzdCBsb29raW5nCiAgICAgICAgICAgICAgICAgIyBmb3IgZHluYW1pYyBsaWJyYXJpZXMgb24gdGhlIGVudGlyZSBwYXRoLgpAQCAtMTA5Niw3ICsxMTg5LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlX2RpcnM9WyJNb2R1bGVzL19zcWxpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FsaXRlX2luY2Rpcl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeV9kaXJzPXNxbGl0ZV9saWJkaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZV9saWJyYXJ5X2RpcnM9c3FsaXRlX2xpYmRpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9c3FsaXRlX2V4dHJhX2xpbmtfYXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXM9WyJzcWxpdGUzIixdKSkKICAgICAgICAgZWxzZToKQEAgLTExMTUsNyArMTIwNyw3IEBACiAgICAgICAgICMgd2hlbiBhdHRlbXB0aW5nIHRvIGNvbXBpbGUgYW5kIGl0IHdpbGwgZmFpbC4KICAgICAgICAgZiA9ICIvdXNyL2luY2x1ZGUvZGIuaCIKIAotICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgIGlmIGhvc3RfcGxhdGZvcm0gPT0gJ2Rhcndpbic6CiAgICAgICAgICAgICBpZiBpc19tYWNvc3hfc2RrX3BhdGgoZik6CiAgICAgICAgICAgICAgICAgc3lzcm9vdCA9IG1hY29zeF9zZGtfcm9vdCgpCiAgICAgICAgICAgICAgICAgZiA9IG9zLnBhdGguam9pbihzeXNyb290LCBmWzE6XSkKQEAgLTExMjgsNyArMTIyMCw3IEBACiAgICAgICAgICAgICAgICAgIyMjIFhYWCB0aGlzIHNob3VsZCBiZSBmaXhlZCB0byBub3QgYmUgcGxhdGZvcm0tZGVwZW5kZW50CiAgICAgICAgICAgICAgICAgIyMjIGJ1dCBJIGRvbid0IGhhdmUgZGlyZWN0IGFjY2VzcyB0byBhbiBvc2YxIHBsYXRmb3JtIGFuZAogICAgICAgICAgICAgICAgICMjIyBzZWVtZWQgdG8gYmUgbXVmZmluZyB0aGUgc2VhcmNoIHNvbWVob3cKLSAgICAgICAgICAgICAgICBsaWJyYXJpZXMgPSBwbGF0Zm9ybSA9PSAib3NmMSIgYW5kIFsnZGInXSBvciBOb25lCisgICAgICAgICAgICAgICAgbGlicmFyaWVzID0gaG9zdF9wbGF0Zm9ybSA9PSAib3NmMSIgYW5kIFsnZGInXSBvciBOb25lCiAgICAgICAgICAgICAgICAgaWYgbGlicmFyaWVzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICBleHRzLmFwcGVuZChFeHRlbnNpb24oJ2JzZGRiMTg1JywgWydic2RkYm1vZHVsZS5jJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXM9bGlicmFyaWVzKSkKQEAgLTExNDEsNyArMTIzMyw3IEBACiAKICAgICAgICAgZGJtX29yZGVyID0gWydnZGJtJ10KICAgICAgICAgIyBUaGUgc3RhbmRhcmQgVW5peCBkYm0gbW9kdWxlOgotICAgICAgICBpZiBwbGF0Zm9ybSBub3QgaW4gWydjeWd3aW4nXToKKyAgICAgICAgaWYgaG9zdF9wbGF0Zm9ybSBub3QgaW4gWydjeWd3aW4nXToKICAgICAgICAgICAgIGNvbmZpZ19hcmdzID0gW2FyZy5zdHJpcCgiJyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYXJnIGluIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiQ09ORklHX0FSR1MiKS5zcGxpdCgpXQogICAgICAgICAgICAgZGJtX2FyZ3MgPSBbYXJnIGZvciBhcmcgaW4gY29uZmlnX2FyZ3MKQEAgLTExNTQsMTAgKzEyNDYsMTQgQEAKICAgICAgICAgICAgIGZvciBjYW5kIGluIGRibV9vcmRlcjoKICAgICAgICAgICAgICAgICBpZiBjYW5kID09ICJuZGJtIjoKICAgICAgICAgICAgICAgICAgICAgaWYgZmluZF9maWxlKCJuZGJtLmgiLCBpbmNfZGlycywgW10pIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgICAgICAgICAgIyBTb21lIHN5c3RlbXMgaGF2ZSAtbG5kYm0sIG90aGVycyBkb24ndAorICAgICAgICAgICAgICAgICAgICAgICAgIyBTb21lIHN5c3RlbXMgaGF2ZSAtbG5kYm0sIG90aGVycyBoYXZlIC1sZ2RibV9jb21wYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAjIG90aGVycyBkb24ndCBoYXZlIGVpdGhlcgogICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5jb21waWxlci5maW5kX2xpYnJhcnlfZmlsZShsaWJfZGlycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduZGJtJyk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmRibV9saWJzID0gWyduZGJtJ10KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5jb21waWxlci5maW5kX2xpYnJhcnlfZmlsZShsaWJfZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2RibV9jb21wYXQnKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZGJtX2xpYnMgPSBbJ2dkYm1fY29tcGF0J10KICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmRibV9saWJzID0gW10KICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJidWlsZGluZyBkYm0gdXNpbmcgbmRibSIKQEAgLTEyMTksMTcgKzEzMTUsMTcgQEAKICAgICAgICAgICAgIG1pc3NpbmcuYXBwZW5kKCdnZGJtJykKIAogICAgICAgICAjIFVuaXgtb25seSBtb2R1bGVzCi0gICAgICAgIGlmIHBsYXRmb3JtIG5vdCBpbiBbJ3dpbjMyJ106CisgICAgICAgIGlmIGhvc3RfcGxhdGZvcm0gbm90IGluIFsnd2luMzInXToKICAgICAgICAgICAgICMgU3RlZW4gTHVtaG9sdCdzIHRlcm1pb3MgbW9kdWxlCiAgICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCd0ZXJtaW9zJywgWyd0ZXJtaW9zLmMnXSkgKQogICAgICAgICAgICAgIyBKZXJlbXkgSHlsdG9uJ3MgcmxpbWl0IGludGVyZmFjZQotICAgICAgICAgICAgaWYgcGxhdGZvcm0gbm90IGluIFsnYXRoZW9zJ106CisgICAgICAgICAgICBpZiBob3N0X3BsYXRmb3JtIG5vdCBpbiBbJ2F0aGVvcyddOgogICAgICAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ3Jlc291cmNlJywgWydyZXNvdXJjZS5jJ10pICkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgbWlzc2luZy5hcHBlbmQoJ3Jlc291cmNlJykKIAogICAgICAgICAgICAgIyBTdW4geWVsbG93IHBhZ2VzLiBTb21lIHN5c3RlbXMgaGF2ZSB0aGUgZnVuY3Rpb25zIGluIGxpYmMuCi0gICAgICAgICAgICBpZiAocGxhdGZvcm0gbm90IGluIFsnY3lnd2luJywgJ2F0aGVvcycsICdxbng2J10gYW5kCisgICAgICAgICAgICBpZiAoaG9zdF9wbGF0Zm9ybSBub3QgaW4gWydjeWd3aW4nLCAnYXRoZW9zJywgJ3FueDYnXSBhbmQKICAgICAgICAgICAgICAgICBmaW5kX2ZpbGUoJ3JwY3N2Yy95cF9wcm90LmgnLCBpbmNfZGlycywgW10pIGlzIG5vdCBOb25lKToKICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb21waWxlci5maW5kX2xpYnJhcnlfZmlsZShsaWJfZGlycywgJ25zbCcpKToKICAgICAgICAgICAgICAgICAgICAgbGlicyA9IFsnbnNsJ10KQEAgLTEyNDUsMTUgKzEzNDEsMTkgQEAKICAgICAgICAgIyBDdXJzZXMgc3VwcG9ydCwgcmVxdWlyaW5nIHRoZSBTeXN0ZW0gViB2ZXJzaW9uIG9mIGN1cnNlcywgb2Z0ZW4KICAgICAgICAgIyBwcm92aWRlZCBieSB0aGUgbmN1cnNlcyBsaWJyYXJ5LgogICAgICAgICBwYW5lbF9saWJyYXJ5ID0gJ3BhbmVsJworICAgICAgICBjdXJzZXNfaW5jcyA9IE5vbmUKICAgICAgICAgaWYgY3Vyc2VzX2xpYnJhcnkuc3RhcnRzd2l0aCgnbmN1cnNlcycpOgogICAgICAgICAgICAgaWYgY3Vyc2VzX2xpYnJhcnkgPT0gJ25jdXJzZXN3JzoKICAgICAgICAgICAgICAgICAjIEJ1ZyAxNDY0MDU2OiBJZiBfY3Vyc2VzLnNvIGxpbmtzIHdpdGggbmN1cnNlc3csCiAgICAgICAgICAgICAgICAgIyBfY3Vyc2VzX3BhbmVsLnNvIG11c3QgbGluayB3aXRoIHBhbmVsdy4KICAgICAgICAgICAgICAgICBwYW5lbF9saWJyYXJ5ID0gJ3BhbmVsdycKICAgICAgICAgICAgIGN1cnNlc19saWJzID0gW2N1cnNlc19saWJyYXJ5XQorICAgICAgICAgICAgY3Vyc2VzX2luY3MgPSBmaW5kX2ZpbGUoJ2N1cnNlcy5oJywgaW5jX2RpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3MucGF0aC5qb2luKGQsICduY3Vyc2VzdycpIGZvciBkIGluIGluY19kaXJzXSkKICAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19jdXJzZXMnLCBbJ19jdXJzZXNtb2R1bGUuYyddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlX2RpcnMgPSBjdXJzZXNfaW5jcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzID0gY3Vyc2VzX2xpYnMpICkKLSAgICAgICAgZWxpZiBjdXJzZXNfbGlicmFyeSA9PSAnY3Vyc2VzJyBhbmQgcGxhdGZvcm0gIT0gJ2Rhcndpbic6CisgICAgICAgIGVsaWYgY3Vyc2VzX2xpYnJhcnkgPT0gJ2N1cnNlcycgYW5kIGhvc3RfcGxhdGZvcm0gIT0gJ2Rhcndpbic6CiAgICAgICAgICAgICAgICAgIyBPU1ggaGFzIGFuIG9sZCBCZXJrZWxleSBjdXJzZXMsIG5vdCBnb29kIGVub3VnaCBmb3IKICAgICAgICAgICAgICAgICAjIHRoZSBfY3Vyc2VzIG1vZHVsZS4KICAgICAgICAgICAgIGlmIChzZWxmLmNvbXBpbGVyLmZpbmRfbGlicmFyeV9maWxlKGxpYl9kaXJzLCAndGVybWluZm8nKSk6CkBAIC0xMjcyLDYgKzEzNzIsNyBAQAogICAgICAgICBpZiAobW9kdWxlX2VuYWJsZWQoZXh0cywgJ19jdXJzZXMnKSBhbmQKICAgICAgICAgICAgIHNlbGYuY29tcGlsZXIuZmluZF9saWJyYXJ5X2ZpbGUobGliX2RpcnMsIHBhbmVsX2xpYnJhcnkpKToKICAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19jdXJzZXNfcGFuZWwnLCBbJ19jdXJzZXNfcGFuZWwuYyddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlX2RpcnMgPSBjdXJzZXNfaW5jcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzID0gW3BhbmVsX2xpYnJhcnldICsgY3Vyc2VzX2xpYnMpICkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIG1pc3NpbmcuYXBwZW5kKCdfY3Vyc2VzX3BhbmVsJykKQEAgLTEyOTQsNiArMTM5NSw4IEBACiAgICAgICAgICAgICB6bGliX2ggPSB6bGliX2luY1swXSArICcvemxpYi5oJwogICAgICAgICAgICAgdmVyc2lvbiA9ICciMC4wLjAiJwogICAgICAgICAgICAgdmVyc2lvbl9yZXEgPSAnIjEuMS4zIicKKyAgICAgICAgICAgIGlmIGhvc3RfcGxhdGZvcm0gPT0gJ2RhcndpbicgYW5kIGlzX21hY29zeF9zZGtfcGF0aCh6bGliX2gpOgorICAgICAgICAgICAgICAgIHpsaWJfaCA9IG9zLnBhdGguam9pbihtYWNvc3hfc2RrX3Jvb3QoKSwgemxpYl9oWzE6XSkKICAgICAgICAgICAgIGZwID0gb3Blbih6bGliX2gpCiAgICAgICAgICAgICB3aGlsZSAxOgogICAgICAgICAgICAgICAgIGxpbmUgPSBmcC5yZWFkbGluZSgpCkBAIC0xMzA0LDcgKzE0MDcsNyBAQAogICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgaWYgdmVyc2lvbiA+PSB2ZXJzaW9uX3JlcToKICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb21waWxlci5maW5kX2xpYnJhcnlfZmlsZShsaWJfZGlycywgJ3onKSk6Ci0gICAgICAgICAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKKyAgICAgICAgICAgICAgICAgICAgaWYgaG9zdF9wbGF0Zm9ybSA9PSAiZGFyd2luIjoKICAgICAgICAgICAgICAgICAgICAgICAgIHpsaWJfZXh0cmFfbGlua19hcmdzID0gKCctV2wsLXNlYXJjaF9wYXRoc19maXJzdCcsKQogICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgemxpYl9leHRyYV9saW5rX2FyZ3MgPSAoKQpAQCAtMTMzNiw3ICsxNDM5LDcgQEAKIAogICAgICAgICAjIEd1c3Rhdm8gTmllbWV5ZXIncyBiejIgbW9kdWxlLgogICAgICAgICBpZiAoc2VsZi5jb21waWxlci5maW5kX2xpYnJhcnlfZmlsZShsaWJfZGlycywgJ2J6MicpKToKLSAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKKyAgICAgICAgICAgIGlmIGhvc3RfcGxhdGZvcm0gPT0gImRhcndpbiI6CiAgICAgICAgICAgICAgICAgYnoyX2V4dHJhX2xpbmtfYXJncyA9ICgnLVdsLC1zZWFyY2hfcGF0aHNfZmlyc3QnLCkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgYnoyX2V4dHJhX2xpbmtfYXJncyA9ICgpCkBAIC0xMzYyLDYgKzE0NjUsNyBAQAogICAgICAgICAgICAgZGVmaW5lX21hY3JvcyA9IFtdCiAgICAgICAgICAgICBleHBhdF9saWIgPSBbJ2V4cGF0J10KICAgICAgICAgICAgIGV4cGF0X3NvdXJjZXMgPSBbXQorICAgICAgICAgICAgZXhwYXRfZGVwZW5kcyA9IFtdCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBleHBhdF9pbmMgPSBbb3MucGF0aC5qb2luKG9zLmdldGN3ZCgpLCBzcmNkaXIsICdNb2R1bGVzJywgJ2V4cGF0JyldCiAgICAgICAgICAgICBkZWZpbmVfbWFjcm9zID0gWwpAQCAtMTM3MSwxMiArMTQ3NSwyNSBAQAogICAgICAgICAgICAgZXhwYXRfc291cmNlcyA9IFsnZXhwYXQveG1scGFyc2UuYycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdleHBhdC94bWxyb2xlLmMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhwYXQveG1sdG9rLmMnXQorICAgICAgICAgICAgZXhwYXRfZGVwZW5kcyA9IFsnZXhwYXQvYXNjaWkuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdleHBhdC9hc2NpaXRhYi5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGF0L2V4cGF0LmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhwYXQvZXhwYXRfY29uZmlnLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhwYXQvZXhwYXRfZXh0ZXJuYWwuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdleHBhdC9pbnRlcm5hbC5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGF0L2xhdGluMXRhYi5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGF0L3V0Zjh0YWIuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdleHBhdC94bWxyb2xlLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhwYXQveG1sdG9rLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhwYXQveG1sdG9rX2ltcGwuaCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogCiAgICAgICAgIGV4dHMuYXBwZW5kKEV4dGVuc2lvbigncHlleHBhdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVfbWFjcm9zID0gZGVmaW5lX21hY3JvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfZGlycyA9IGV4cGF0X2luYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcyA9IGV4cGF0X2xpYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXMgPSBbJ3B5ZXhwYXQuYyddICsgZXhwYXRfc291cmNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcyA9IFsncHlleHBhdC5jJ10gKyBleHBhdF9zb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kcyA9IGV4cGF0X2RlcGVuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQogCiAgICAgICAgICMgRnJlZHJpayBMdW5kaCdzIGNFbGVtZW50VHJlZSBtb2R1bGUuICBOb3RlIHRoYXQgdGhpcyBhbHNvCkBAIC0xMzg5LDYgKzE1MDYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfZGlycyA9IGV4cGF0X2luYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXMgPSBleHBhdF9saWIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcyA9IFsnX2VsZW1lbnR0cmVlLmMnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRzID0gWydweWV4cGF0LmMnXSArIGV4cGF0X3NvdXJjZXMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhdF9kZXBlbmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBtaXNzaW5nLmFwcGVuZCgnX2VsZW1lbnR0cmVlJykKQEAgLTE0MDksNyArMTUyOCw3IEBACiAgICAgICAgIGlmIHN5cy5tYXhpbnQgPT0gMHg3ZmZmZmZmZjoKICAgICAgICAgICAgICMgVGhpcyByZXF1aXJlcyBzaXplb2YoaW50KSA9PSBzaXplb2YobG9uZykgPT0gc2l6ZW9mKGNoYXIqKQogICAgICAgICAgICAgZGxfaW5jID0gZmluZF9maWxlKCdkbGZjbi5oJywgW10sIGluY19kaXJzKQotICAgICAgICAgICAgaWYgKGRsX2luYyBpcyBub3QgTm9uZSkgYW5kIChwbGF0Zm9ybSBub3QgaW4gWydhdGhlb3MnXSk6CisgICAgICAgICAgICBpZiAoZGxfaW5jIGlzIG5vdCBOb25lKSBhbmQgKGhvc3RfcGxhdGZvcm0gbm90IGluIFsnYXRoZW9zJ10pOgogICAgICAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ2RsJywgWydkbG1vZHVsZS5jJ10pICkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgbWlzc2luZy5hcHBlbmQoJ2RsJykKQEAgLTE0MjAsMjkgKzE1MzksMjkgQEAKICAgICAgICAgc2VsZi5kZXRlY3RfY3R5cGVzKGluY19kaXJzLCBsaWJfZGlycykKIAogICAgICAgICAjIFJpY2hhcmQgT3Vka2VyaydzIG11bHRpcHJvY2Vzc2luZyBtb2R1bGUKLSAgICAgICAgaWYgcGxhdGZvcm0gPT0gJ3dpbjMyJzogICAgICAgICAgICAgIyBXaW5kb3dzCisgICAgICAgIGlmIGhvc3RfcGxhdGZvcm0gPT0gJ3dpbjMyJzogICAgICAgICAgICAgIyBXaW5kb3dzCiAgICAgICAgICAgICBtYWNyb3MgPSBkaWN0KCkKICAgICAgICAgICAgIGxpYnJhcmllcyA9IFsnd3MyXzMyJ10KIAotICAgICAgICBlbGlmIHBsYXRmb3JtID09ICdkYXJ3aW4nOiAgICAgICAgICAjIE1hYyBPU1gKKyAgICAgICAgZWxpZiBob3N0X3BsYXRmb3JtID09ICdkYXJ3aW4nOiAgICAgICAgICAjIE1hYyBPU1gKICAgICAgICAgICAgIG1hY3JvcyA9IGRpY3QoKQogICAgICAgICAgICAgbGlicmFyaWVzID0gW10KIAotICAgICAgICBlbGlmIHBsYXRmb3JtID09ICdjeWd3aW4nOiAgICAgICAgICAjIEN5Z3dpbgorICAgICAgICBlbGlmIGhvc3RfcGxhdGZvcm0gPT0gJ2N5Z3dpbic6ICAgICAgICAgICMgQ3lnd2luCiAgICAgICAgICAgICBtYWNyb3MgPSBkaWN0KCkKICAgICAgICAgICAgIGxpYnJhcmllcyA9IFtdCiAKLSAgICAgICAgZWxpZiBwbGF0Zm9ybSBpbiAoJ2ZyZWVic2Q0JywgJ2ZyZWVic2Q1JywgJ2ZyZWVic2Q2JywgJ2ZyZWVic2Q3JywgJ2ZyZWVic2Q4Jyk6CisgICAgICAgIGVsaWYgaG9zdF9wbGF0Zm9ybSBpbiAoJ2ZyZWVic2Q0JywgJ2ZyZWVic2Q1JywgJ2ZyZWVic2Q2JywgJ2ZyZWVic2Q3JywgJ2ZyZWVic2Q4Jyk6CiAgICAgICAgICAgICAjIEZyZWVCU0QncyBQMTAwMy4xYiBzZW1hcGhvcmUgc3VwcG9ydCBpcyB2ZXJ5IGV4cGVyaW1lbnRhbAogICAgICAgICAgICAgIyBhbmQgaGFzIG1hbnkga25vd24gcHJvYmxlbXMuIChhcyBvZiBKdW5lIDIwMDgpCiAgICAgICAgICAgICBtYWNyb3MgPSBkaWN0KCkKICAgICAgICAgICAgIGxpYnJhcmllcyA9IFtdCiAKLSAgICAgICAgZWxpZiBwbGF0Zm9ybS5zdGFydHN3aXRoKCdvcGVuYnNkJyk6CisgICAgICAgIGVsaWYgaG9zdF9wbGF0Zm9ybS5zdGFydHN3aXRoKCdvcGVuYnNkJyk6CiAgICAgICAgICAgICBtYWNyb3MgPSBkaWN0KCkKICAgICAgICAgICAgIGxpYnJhcmllcyA9IFtdCiAKLSAgICAgICAgZWxpZiBwbGF0Zm9ybS5zdGFydHN3aXRoKCduZXRic2QnKToKKyAgICAgICAgZWxpZiBob3N0X3BsYXRmb3JtLnN0YXJ0c3dpdGgoJ25ldGJzZCcpOgogICAgICAgICAgICAgbWFjcm9zID0gZGljdCgpCiAgICAgICAgICAgICBsaWJyYXJpZXMgPSBbXQogCkBAIC0xNDUwLDcgKzE1NjksNyBAQAogICAgICAgICAgICAgbWFjcm9zID0gZGljdCgpCiAgICAgICAgICAgICBsaWJyYXJpZXMgPSBbJ3J0J10KIAotICAgICAgICBpZiBwbGF0Zm9ybSA9PSAnd2luMzInOgorICAgICAgICBpZiBob3N0X3BsYXRmb3JtID09ICd3aW4zMic6CiAgICAgICAgICAgICBtdWx0aXByb2Nlc3Npbmdfc3JjcyA9IFsgJ19tdWx0aXByb2Nlc3NpbmcvbXVsdGlwcm9jZXNzaW5nLmMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfbXVsdGlwcm9jZXNzaW5nL3NlbWFwaG9yZS5jJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX211bHRpcHJvY2Vzc2luZy9waXBlX2Nvbm5lY3Rpb24uYycsCkBAIC0xNDc3LDI2ICsxNTk2LDI2IEBACiAKIAogICAgICAgICAjIFBsYXRmb3JtLXNwZWNpZmljIGxpYnJhcmllcwotICAgICAgICBpZiBwbGF0Zm9ybSA9PSAnbGludXgyJzoKKyAgICAgICAgaWYgaG9zdF9wbGF0Zm9ybSA9PSAnbGludXgyJzoKICAgICAgICAgICAgICMgTGludXgtc3BlY2lmaWMgbW9kdWxlcwogICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignbGludXhhdWRpb2RldicsIFsnbGludXhhdWRpb2Rldi5jJ10pICkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIG1pc3NpbmcuYXBwZW5kKCdsaW51eGF1ZGlvZGV2JykKIAotICAgICAgICBpZiAocGxhdGZvcm0gaW4gKCdsaW51eDInLCAnZnJlZWJzZDQnLCAnZnJlZWJzZDUnLCAnZnJlZWJzZDYnLAorICAgICAgICBpZiAoaG9zdF9wbGF0Zm9ybSBpbiAoJ2xpbnV4MicsICdmcmVlYnNkNCcsICdmcmVlYnNkNScsICdmcmVlYnNkNicsCiAgICAgICAgICAgICAgICAgICAgICAgICAnZnJlZWJzZDcnLCAnZnJlZWJzZDgnKQotICAgICAgICAgICAgb3IgcGxhdGZvcm0uc3RhcnRzd2l0aCgiZ251a2ZyZWVic2QiKSk6CisgICAgICAgICAgICBvciBob3N0X3BsYXRmb3JtLnN0YXJ0c3dpdGgoImdudWtmcmVlYnNkIikpOgogICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignb3NzYXVkaW9kZXYnLCBbJ29zc2F1ZGlvZGV2LmMnXSkgKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgbWlzc2luZy5hcHBlbmQoJ29zc2F1ZGlvZGV2JykKIAotICAgICAgICBpZiBwbGF0Zm9ybSA9PSAnc3Vub3M1JzoKKyAgICAgICAgaWYgaG9zdF9wbGF0Zm9ybSA9PSAnc3Vub3M1JzoKICAgICAgICAgICAgICMgU3VuT1Mgc3BlY2lmaWMgbW9kdWxlcwogICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignc3VuYXVkaW9kZXYnLCBbJ3N1bmF1ZGlvZGV2LmMnXSkgKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgbWlzc2luZy5hcHBlbmQoJ3N1bmF1ZGlvZGV2JykKIAotICAgICAgICBpZiBwbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgaWYgaG9zdF9wbGF0Zm9ybSA9PSAnZGFyd2luJzoKICAgICAgICAgICAgICMgX3NjcHJveHkKICAgICAgICAgICAgIGV4dHMuYXBwZW5kKEV4dGVuc2lvbigiX3NjcHJveHkiLCBbb3MucGF0aC5qb2luKHNyY2RpciwgIk1hYy9Nb2R1bGVzL19zY3Byb3h5LmMiKV0sCiAgICAgICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzPSBbCkBAIC0xNTA1LDcgKzE2MjQsNyBAQAogICAgICAgICAgICAgICAgIF0pKQogCiAKLSAgICAgICAgaWYgcGxhdGZvcm0gPT0gJ2RhcndpbicgYW5kICgiLS1kaXNhYmxlLXRvb2xib3gtZ2x1ZSIgbm90IGluCisgICAgICAgIGlmIGhvc3RfcGxhdGZvcm0gPT0gJ2RhcndpbicgYW5kICgiLS1kaXNhYmxlLXRvb2xib3gtZ2x1ZSIgbm90IGluCiAgICAgICAgICAgICAgICAgc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCJDT05GSUdfQVJHUyIpKToKIAogICAgICAgICAgICAgaWYgaW50KG9zLnVuYW1lKClbMl0uc3BsaXQoJy4nKVswXSkgPj0gODoKQEAgLTE2MTAsOCArMTcyOSw0NyBAQAogICAgICAgICBpZiAnX3RraW50ZXInIG5vdCBpbiBbZS5uYW1lIGZvciBlIGluIHNlbGYuZXh0ZW5zaW9uc106CiAgICAgICAgICAgICBtaXNzaW5nLmFwcGVuZCgnX3RraW50ZXInKQogCisjIyAgICAgICAgICMgVW5jb21tZW50IHRoZXNlIGxpbmVzIGlmIHlvdSB3YW50IHRvIHBsYXkgd2l0aCB4eG1vZHVsZS5jCisjIyAgICAgICAgIGV4dCA9IEV4dGVuc2lvbigneHgnLCBbJ3h4bW9kdWxlLmMnXSkKKyMjICAgICAgICAgc2VsZi5leHRlbnNpb25zLmFwcGVuZChleHQpCisKICAgICAgICAgcmV0dXJuIG1pc3NpbmcKIAorICAgIGRlZiBkZXRlY3RfdGtpbnRlcl9leHBsaWNpdGx5KHNlbGYpOgorICAgICAgICAjIEJ1aWxkIF90a2ludGVyIHVzaW5nIGV4cGxpY2l0IGxvY2F0aW9ucyBmb3IgVGNsL1RrLgorICAgICAgICAjCisgICAgICAgICMgVGhpcyBpcyBlbmFibGVkIHdoZW4gYm90aCBhcmd1bWVudHMgYXJlIGdpdmVuIHRvIC4vY29uZmlndXJlOgorICAgICAgICAjCisgICAgICAgICMgICAgIC0td2l0aC10Y2x0ay1pbmNsdWRlcz0iLUkvcGF0aC90by90Y2xpbmNsdWRlcyBcCisgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgLUkvcGF0aC90by90a2luY2x1ZGVzIgorICAgICAgICAjICAgICAtLXdpdGgtdGNsdGstbGlicz0iLUwvcGF0aC90by90Y2xsaWJzIC1sdGNsbS5uIFwKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgIC1ML3BhdGgvdG8vdGtsaWJzIC1sdGttLm4iCisgICAgICAgICMKKyAgICAgICAgIyBUaGVzZSB2YWx1ZXMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIG9yIG92ZXJyaWRlbiB2aWEgbWFrZToKKyAgICAgICAgIyAgICBtYWtlIFRDTFRLX0lOQ0xVREVTPSIuLi4iIFRDTFRLX0xJQlM9Ii4uLiIKKyAgICAgICAgIworICAgICAgICAjIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgYnVpbGRpbmcgYW5kIHRlc3RpbmcgdGtpbnRlciB3aXRoIG11bHRpcGxlCisgICAgICAgICMgdmVyc2lvbnMgb2YgVGNsL1RrLiAgTm90ZSB0aGF0IGEgYnVpbGQgb2YgVGsgZGVwZW5kcyBvbiBhIHBhcnRpY3VsYXIKKyAgICAgICAgIyBidWlsZCBvZiBUY2wgc28geW91IG5lZWQgdG8gc3BlY2lmeSBib3RoIGFyZ3VtZW50cyBhbmQgdXNlIGNhcmUgd2hlbgorICAgICAgICAjIG92ZXJyaWRpbmcuCisKKyAgICAgICAgIyBUaGUgX1RDTFRLIHZhcmlhYmxlcyBhcmUgY3JlYXRlZCBpbiB0aGUgTWFrZWZpbGUgc2hhcmVkbW9kcyB0YXJnZXQuCisgICAgICAgIHRjbHRrX2luY2x1ZGVzID0gb3MuZW52aXJvbi5nZXQoJ19UQ0xUS19JTkNMVURFUycpCisgICAgICAgIHRjbHRrX2xpYnMgPSBvcy5lbnZpcm9uLmdldCgnX1RDTFRLX0xJQlMnKQorICAgICAgICBpZiBub3QgKHRjbHRrX2luY2x1ZGVzIGFuZCB0Y2x0a19saWJzKToKKyAgICAgICAgICAgICMgUmVzdW1lIGRlZmF1bHQgY29uZmlndXJhdGlvbiBzZWFyY2guCisgICAgICAgICAgICByZXR1cm4gMAorCisgICAgICAgIGV4dHJhX2NvbXBpbGVfYXJncyA9IHRjbHRrX2luY2x1ZGVzLnNwbGl0KCkKKyAgICAgICAgZXh0cmFfbGlua19hcmdzID0gdGNsdGtfbGlicy5zcGxpdCgpCisgICAgICAgIGV4dCA9IEV4dGVuc2lvbignX3RraW50ZXInLCBbJ190a2ludGVyLmMnLCAndGthcHBpbml0LmMnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZV9tYWNyb3M9WygnV0lUSF9BUFBJTklUJywgMSldLAorICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfY29tcGlsZV9hcmdzID0gZXh0cmFfY29tcGlsZV9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzID0gZXh0cmFfbGlua19hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICBzZWxmLmV4dGVuc2lvbnMuYXBwZW5kKGV4dCkKKyAgICAgICAgcmV0dXJuIDEKKwogICAgIGRlZiBkZXRlY3RfdGtpbnRlcl9kYXJ3aW4oc2VsZiwgaW5jX2RpcnMsIGxpYl9kaXJzKToKICAgICAgICAgIyBUaGUgX3RraW50ZXIgbW9kdWxlLCB1c2luZyBmcmFtZXdvcmtzLiBTaW5jZSBmcmFtZXdvcmtzIGFyZSBxdWl0ZQogICAgICAgICAjIGRpZmZlcmVudCB0aGUgVU5JWCBzZWFyY2ggbG9naWMgaXMgbm90IHNoYXJhYmxlLgpAQCAtMTY5NCwxNSArMTg1MiwyMCBAQAogICAgICAgICBzZWxmLmV4dGVuc2lvbnMuYXBwZW5kKGV4dCkKICAgICAgICAgcmV0dXJuIDEKIAotCiAgICAgZGVmIGRldGVjdF90a2ludGVyKHNlbGYsIGluY19kaXJzLCBsaWJfZGlycyk6CiAgICAgICAgICMgVGhlIF90a2ludGVyIG1vZHVsZS4KIAorICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLXRjbHRrLWluY2x1ZGVzIGFuZCAtLXdpdGgtdGNsdGstbGlicyB3ZXJlCisgICAgICAgICMgY29uZmlndXJlZCBvciBwYXNzZWQgaW50byB0aGUgbWFrZSB0YXJnZXQuICBJZiBzbywgdXNlIHRoZXNlIHZhbHVlcworICAgICAgICAjIHRvIGJ1aWxkIHRraW50ZXIgYW5kIGJ5cGFzcyB0aGUgc2VhcmNoZXMgZm9yIFRjbCBhbmQgVEsgaW4gc3RhbmRhcmQKKyAgICAgICAgIyBsb2NhdGlvbnMuCisgICAgICAgIGlmIHNlbGYuZGV0ZWN0X3RraW50ZXJfZXhwbGljaXRseSgpOgorICAgICAgICAgICAgcmV0dXJuCisKICAgICAgICAgIyBSYXRoZXIgdGhhbiBjb21wbGljYXRlIHRoZSBjb2RlIGJlbG93LCBkZXRlY3RpbmcgYW5kIGJ1aWxkaW5nCiAgICAgICAgICMgQXF1YVRrIGlzIGEgc2VwYXJhdGUgbWV0aG9kLiBPbmx5IG9uZSBUa2ludGVyIHdpbGwgYmUgYnVpbHQgb24KICAgICAgICAgIyBEYXJ3aW4gLSBlaXRoZXIgQXF1YVRrLCBpZiBpdCBpcyBmb3VuZCwgb3IgWDExIGJhc2VkIFRrLgotICAgICAgICBwbGF0Zm9ybSA9IHNlbGYuZ2V0X3BsYXRmb3JtKCkKLSAgICAgICAgaWYgKHBsYXRmb3JtID09ICdkYXJ3aW4nIGFuZAorICAgICAgICBpZiAoaG9zdF9wbGF0Zm9ybSA9PSAnZGFyd2luJyBhbmQKICAgICAgICAgICAgIHNlbGYuZGV0ZWN0X3RraW50ZXJfZGFyd2luKGluY19kaXJzLCBsaWJfZGlycykpOgogICAgICAgICAgICAgcmV0dXJuCiAKQEAgLTE3MjUsNyArMTg4OCw3IEBACiAgICAgICAgICAgICAjIENoZWNrIGZvciB0aGUgaW5jbHVkZSBmaWxlcyBvbiBEZWJpYW4gYW5kIHtGcmVlLE9wZW59QlNELCB3aGVyZQogICAgICAgICAgICAgIyB0aGV5J3JlIHB1dCBpbiAvdXNyL2luY2x1ZGUve3RjbCx0a31YLlkKICAgICAgICAgICAgIGRvdHZlcnNpb24gPSB2ZXJzaW9uCi0gICAgICAgICAgICBpZiAnLicgbm90IGluIGRvdHZlcnNpb24gYW5kICJic2QiIGluIHN5cy5wbGF0Zm9ybS5sb3dlcigpOgorICAgICAgICAgICAgaWYgJy4nIG5vdCBpbiBkb3R2ZXJzaW9uIGFuZCAiYnNkIiBpbiBob3N0X3BsYXRmb3JtLmxvd2VyKCk6CiAgICAgICAgICAgICAgICAgIyBPcGVuQlNEIGFuZCBGcmVlQlNEIHVzZSBUY2wvVGsgbGlicmFyeSBuYW1lcyBsaWtlIGxpYnRjbDgzLmEsCiAgICAgICAgICAgICAgICAgIyBidXQgdGhlIGluY2x1ZGUgc3ViZGlycyBhcmUgbmFtZWQgbGlrZSAuLi4vaW5jbHVkZS90Y2w4LjMuCiAgICAgICAgICAgICAgICAgZG90dmVyc2lvbiA9IGRvdHZlcnNpb25bOi0xXSArICcuJyArIGRvdHZlcnNpb25bLTFdCkBAIC0xNzUxLDcgKzE5MTQsNyBAQAogICAgICAgICAgICAgICAgIGluY2x1ZGVfZGlycy5hcHBlbmQoZGlyKQogCiAgICAgICAgICMgQ2hlY2sgZm9yIHZhcmlvdXMgcGxhdGZvcm0tc3BlY2lmaWMgZGlyZWN0b3JpZXMKLSAgICAgICAgaWYgcGxhdGZvcm0gPT0gJ3N1bm9zNSc6CisgICAgICAgIGlmIGhvc3RfcGxhdGZvcm0gPT0gJ3N1bm9zNSc6CiAgICAgICAgICAgICBpbmNsdWRlX2RpcnMuYXBwZW5kKCcvdXNyL29wZW53aW4vaW5jbHVkZScpCiAgICAgICAgICAgICBhZGRlZF9saWJfZGlycy5hcHBlbmQoJy91c3Ivb3Blbndpbi9saWInKQogICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKCcvdXNyL1gxMVI2L2luY2x1ZGUnKToKQEAgLTE3NjcsNyArMTkzMCw3IEBACiAgICAgICAgICAgICBhZGRlZF9saWJfZGlycy5hcHBlbmQoJy91c3IvWDExL2xpYicpCiAKICAgICAgICAgIyBJZiBDeWd3aW4sIHRoZW4gdmVyaWZ5IHRoYXQgWCBpcyBpbnN0YWxsZWQgYmVmb3JlIHByb2NlZWRpbmcKLSAgICAgICAgaWYgcGxhdGZvcm0gPT0gJ2N5Z3dpbic6CisgICAgICAgIGlmIGhvc3RfcGxhdGZvcm0gPT0gJ2N5Z3dpbic6CiAgICAgICAgICAgICB4MTFfaW5jID0gZmluZF9maWxlKCdYMTEvWGxpYi5oJywgW10sIGluY2x1ZGVfZGlycykKICAgICAgICAgICAgIGlmIHgxMV9pbmMgaXMgTm9uZToKICAgICAgICAgICAgICAgICByZXR1cm4KQEAgLTE3ODYsMTEgKzE5NDksMTEgQEAKICAgICAgICAgbGlicy5hcHBlbmQoJ3RrJysgdmVyc2lvbikKICAgICAgICAgbGlicy5hcHBlbmQoJ3RjbCcrIHZlcnNpb24pCiAKLSAgICAgICAgaWYgcGxhdGZvcm0gaW4gWydhaXgzJywgJ2FpeDQnXToKKyAgICAgICAgaWYgaG9zdF9wbGF0Zm9ybSBpbiBbJ2FpeDMnLCAnYWl4NCddOgogICAgICAgICAgICAgbGlicy5hcHBlbmQoJ2xkJykKIAogICAgICAgICAjIEZpbmFsbHksIGxpbmsgd2l0aCB0aGUgWDExIGxpYnJhcmllcyAobm90IGFwcHJvcHJpYXRlIG9uIGN5Z3dpbikKLSAgICAgICAgaWYgcGxhdGZvcm0gIT0gImN5Z3dpbiI6CisgICAgICAgIGlmIGhvc3RfcGxhdGZvcm0gIT0gImN5Z3dpbiI6CiAgICAgICAgICAgICBsaWJzLmFwcGVuZCgnWDExJykKIAogICAgICAgICBleHQgPSBFeHRlbnNpb24oJ190a2ludGVyJywgWydfdGtpbnRlci5jJywgJ3RrYXBwaW5pdC5jJ10sCkBAIC0xODAxLDEwICsxOTY0LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgc2VsZi5leHRlbnNpb25zLmFwcGVuZChleHQpCiAKLSMjICAgICAgICAgIyBVbmNvbW1lbnQgdGhlc2UgbGluZXMgaWYgeW91IHdhbnQgdG8gcGxheSB3aXRoIHh4bW9kdWxlLmMKLSMjICAgICAgICAgZXh0ID0gRXh0ZW5zaW9uKCd4eCcsIFsneHhtb2R1bGUuYyddKQotIyMgICAgICAgICBzZWxmLmV4dGVuc2lvbnMuYXBwZW5kKGV4dCkKLQogICAgICAgICAjIFhYWCBoYW5kbGUgdGhlc2UsIGJ1dCBob3cgdG8gZGV0ZWN0PwogICAgICAgICAjICoqKiBVbmNvbW1lbnQgYW5kIGVkaXQgZm9yIFBJTCAoVGtJbWFnaW5nKSBleHRlbnNpb24gb25seToKICAgICAgICAgIyAgICAgICAtRFdJVEhfUElMIC1JLi4vRXh0ZW5zaW9ucy9JbWFnaW5nL2xpYkltYWdpbmcgIHRrSW1hZ2luZy5jIFwKQEAgLTE4NDIsNyArMjAwMSw3IEBACiAKICAgICBkZWYgY29uZmlndXJlX2N0eXBlcyhzZWxmLCBleHQpOgogICAgICAgICBpZiBub3Qgc2VsZi51c2Vfc3lzdGVtX2xpYmZmaToKLSAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgICAgIGlmIGhvc3RfcGxhdGZvcm0gPT0gJ2Rhcndpbic6CiAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29uZmlndXJlX2N0eXBlc19kYXJ3aW4oZXh0KQogCiAgICAgICAgICAgICBzcmNkaXIgPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ3NyY2RpcicpCkBAIC0xODYwLDcgKzIwMTksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZpX2NvbmZpZ2ZpbGUpOgogICAgICAgICAgICAgICAgIGZyb20gZGlzdHV0aWxzLmRpcl91dGlsIGltcG9ydCBta3BhdGgKICAgICAgICAgICAgICAgICBta3BhdGgoZmZpX2J1aWxkZGlyKQotICAgICAgICAgICAgICAgIGNvbmZpZ19hcmdzID0gW10KKyAgICAgICAgICAgICAgICBjb25maWdfYXJncyA9IFthcmcgZm9yIGFyZyBpbiBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoIkNPTkZJR19BUkdTIikuc3BsaXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoJy0taG9zdD0nIGluIGFyZykgb3IgKCctLWJ1aWxkPScgaW4gYXJnKSldCisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnX2FyZ3MuYXBwZW5kKCItcSIpCiAKICAgICAgICAgICAgICAgICAjIFBhc3MgZW1wdHkgQ0ZMQUdTIGJlY2F1c2Ugd2UnbGwganVzdCBhcHBlbmQgdGhlIHJlc3VsdGluZwogICAgICAgICAgICAgICAgICMgQ0ZMQUdTIHRvIFB5dGhvbidzOyAtZyBvciAtTzIgaXMgdG8gYmUgYXZvaWRlZC4KQEAgLTE5MDIsNyArMjA2NCw3IEBACiAgICAgICAgICAgICAgICAgICAgJ19jdHlwZXMvY2ZpZWxkLmMnXQogICAgICAgICBkZXBlbmRzID0gWydfY3R5cGVzL2N0eXBlcy5oJ10KIAotICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgIGlmIGhvc3RfcGxhdGZvcm0gPT0gJ2Rhcndpbic6CiAgICAgICAgICAgICBzb3VyY2VzLmFwcGVuZCgnX2N0eXBlcy9tYWxsb2NfY2xvc3VyZS5jJykKICAgICAgICAgICAgIHNvdXJjZXMuYXBwZW5kKCdfY3R5cGVzL2Rhcndpbi9kbGZjbl9zaW1wbGUuYycpCiAgICAgICAgICAgICBleHRyYV9jb21waWxlX2FyZ3MuYXBwZW5kKCctRE1BQ09TWCcpCkBAIC0xOTEwLDcgKzIwNzIsNyBAQAogIyBYWFggSXMgdGhpcyBzdGlsbCBuZWVkZWQ/CiAjIyAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncy5leHRlbmQoWyctcmVhZF9vbmx5X3JlbG9jcycsICd3YXJuaW5nJ10pCiAKLSAgICAgICAgZWxpZiBzeXMucGxhdGZvcm0gPT0gJ3N1bm9zNSc6CisgICAgICAgIGVsaWYgaG9zdF9wbGF0Zm9ybSA9PSAnc3Vub3M1JzoKICAgICAgICAgICAgICMgWFhYIFRoaXMgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeTsgaXQgYXBwZWFycyB0aGF0IHNvbWUKICAgICAgICAgICAgICMgb2YgdGhlIGFzc2VtYmxlciBjb2RlIGlzIG5vbi1QSUMgKGkuZS4gaXQgaGFzIHJlbG9jYXRpb25zCiAgICAgICAgICAgICAjIHdoZW4gaXQgc2hvdWxkbid0LiBUaGUgcHJvcGVyIGZpeCB3b3VsZCBiZSB0byByZXdyaXRlCkBAIC0xOTIxLDcgKzIwODMsNyBAQAogICAgICAgICAgICAgIyBmaW5kaW5nIHNvbWUgLXogb3B0aW9uIGZvciB0aGUgU3VuIGNvbXBpbGVyLgogICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzLmFwcGVuZCgnLW1pbXB1cmUtdGV4dCcpCiAKLSAgICAgICAgZWxpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnaHAtdXgnKToKKyAgICAgICAgZWxpZiBob3N0X3BsYXRmb3JtLnN0YXJ0c3dpdGgoJ2hwLXV4Jyk6CiAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3MuYXBwZW5kKCctZlBJQycpCiAKICAgICAgICAgZXh0ID0gRXh0ZW5zaW9uKCdfY3R5cGVzJywKQEAgLTE5MzgsNyArMjEwMCw3IEBACiAgICAgICAgIGlmIG5vdCAnLS13aXRoLXN5c3RlbS1mZmknIGluIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiQ09ORklHX0FSR1MiKToKICAgICAgICAgICAgIHJldHVybgogCi0gICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgaWYgaG9zdF9wbGF0Zm9ybSA9PSAnZGFyd2luJzoKICAgICAgICAgICAgICMgT1MgWCAxMC41IGNvbWVzIHdpdGggbGliZmZpLmR5bGliOyB0aGUgaW5jbHVkZSBmaWxlcyBhcmUKICAgICAgICAgICAgICMgaW4gL3Vzci9pbmNsdWRlL2ZmaQogICAgICAgICAgICAgaW5jX2RpcnMuYXBwZW5kKCcvdXNyL2luY2x1ZGUvZmZpJykK